diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000000..f26996e5a8 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +src/generated/**/*.json text eol=lf \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/.github/ISSUE_TEMPLATE/bug-report.yml new file mode 100644 index 0000000000..572674cf19 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug-report.yml @@ -0,0 +1,62 @@ +name: Bug Report +description: Create an issue about a bug +labels: [bug] +body: + - type: input + attributes: + label: Forge Version + description: What version of Forge are you running? This can be found on the installation jar you have downloaded, in the Mod Options menu, or the profile's version. Please note "latest" is NOT a version. *If you are reporting a bug that exists only on the Fabric port, please report it **[here](https://github.com/TeamTwilight/twilightforest-fabric/issues)** instead.* + placeholder: "Example: 36.2.0" + validations: + required: true + - type: input + attributes: + label: Twilight Forest Version + description: What version of Twilight Forest are you running? This can be found on the jar file you have downloaded or the Mod Options menu. Please note "latest" is NOT a version. + placeholder: "Example: 4.0.546" + validations: + required: true + - type: input + attributes: + label: Client Log + description: A **[Gist](https://gist.github.com/)** link to the full game log. This can be found in the game files under the `logs` folder. Though not necessary, a client log can help diagnose an issue better in case a bug is caused by a reported error. Provide the `latest.log` or `debug.log` file as a Gist as soon as you find the bug, as these files are reset every time the game is opened. + - type: input + attributes: + label: Crash Report (if applicable) + description: A **[Gist](https://gist.github.com/)** link to the crash report. This can be found in the game files under the `crash-reports` folder, and all the contents of the file should be pasted into the Gist file. If the bug does not result in a crash, ignore this field. + - type: textarea + attributes: + label: Steps to Reproduce + description: A detailed list of how you encountered this bug if it is not immediately obvious. If the bug is immediately obvious, briefly mention how to replicate it. + placeholder: | + 1. Step 1 + 2. Step 2 + 3. Step 3, etc. + validations: + required: true + - type: textarea + attributes: + label: What You Expected + description: Describe what you thought was supposed to have happened. Don't worry if you think what you expected may be wrong. + validations: + required: true + - type: textarea + attributes: + label: What Happened Instead + description: Describe what happened to you that wasn't to expectations. + validations: + required: true + - type: textarea + attributes: + label: Additional Details + description: Provide any other information you think might be useful for this report. This may include screenshots, video footage, other mod details, anything you think might be relevant. + - type: checkboxes + attributes: + label: Please Read and Confirm The Following + options: + - label: I have confirmed this bug can be replicated without the use of Optifine. + required: true + - label: I have confirmed the details provided in this report are concise as possible and does not contained vague information (ie. Versions are properly recorded, answers to questions are clear). + required: true + - label: I have confirmed this issue is unique and has not been reported already. + required: true diff --git a/.github/ISSUE_TEMPLATE/suggestion.yml b/.github/ISSUE_TEMPLATE/suggestion.yml new file mode 100644 index 0000000000..f30c60c467 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/suggestion.yml @@ -0,0 +1,23 @@ +name: Suggestion +description: Create a suggestion ticket +title: "[Suggestion] " +labels: [suggestion] +body: + - type: textarea + attributes: + label: The Suggestion + description: Describe the idea you have for the mod. Include details such as what the feature would do or what aspect of the mod it improves. + validations: + required: true + - type: textarea + attributes: + label: Why Should It Be in the Mod? + description: Describe why you would like to see this idea in the mod. Include reasons such as how gameplay would be improved, or how the feature improves the look and feel of the mod. + validations: + required: true + - type: checkboxes + attributes: + label: Please Read and Confirm the Following + options: + - label: I have confirmed this suggestion is unique and has not been suggested already. + required: true \ No newline at end of file diff --git a/.gitignore b/.gitignore index 0501d83e5b..fc0de255cd 100644 --- a/.gitignore +++ b/.gitignore @@ -1,32 +1,26 @@ -/download -/eclipseBin +# eclipse +bin +*.launch +.settings +.metadata +.classpath +.project -## gradle -/.gradle -/build -/gradle -/gradlew -/gradlew.bat -/libs +# idea +out +*.ipr +*.iws +*.iml +.idea -## ForgeGradle -/run +# gradle +build +.gradle +local.gradle +settings.gradle -## eclipse -/eclipse -/.settings -/.metadata -/.classpath -/.project -/bin - -## intellij -/out -/.idea -/*.iml -/*.ipr -/*.iws -/atlassian-ide-plugin.xml - -# Mac OS X -.DS_Store +# other +eclipse +run +classes +logs diff --git a/ASSET_LICENSE b/ASSET_LICENSE new file mode 100644 index 0000000000..cbe5ad1670 --- /dev/null +++ b/ASSET_LICENSE @@ -0,0 +1,437 @@ +Attribution-NonCommercial-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-NonCommercial-ShareAlike 4.0 International +Public License + +By exercising the Licensed Rights (defined below), You accept and agree +to be bound by the terms and conditions of this Creative Commons +Attribution-NonCommercial-ShareAlike 4.0 International Public License +("Public 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. + + +Section 1 -- Definitions. + + a. Adapted Material means material subject to Copyright and Similar + Rights that is derived from or based upon the Licensed Material + and in which the Licensed Material is translated, altered, + arranged, transformed, or otherwise modified in a manner requiring + permission under the Copyright and Similar Rights held by the + Licensor. For purposes of this Public License, where the Licensed + Material is a musical work, performance, or sound recording, + Adapted Material is always produced where the Licensed Material is + synched in timed relation with a moving image. + + b. Adapter's License means the license You apply to Your Copyright + and Similar Rights in Your contributions to Adapted Material in + accordance with the terms and conditions of this Public License. + + c. BY-NC-SA Compatible License means a license listed at + creativecommons.org/compatiblelicenses, approved by Creative + Commons as essentially the equivalent of this Public License. + + d. Copyright and Similar Rights means copyright and/or similar rights + closely related to copyright including, without limitation, + performance, broadcast, sound recording, and Sui Generis Database + 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, NonCommercial, and ShareAlike. + + h. Licensed Material means the artistic or literary work, database, + or other material to which the Licensor applied this Public + License. + + i. Licensed Rights means the rights granted to You subject to the + terms and conditions of this Public License, which are limited to + all Copyright and Similar Rights that apply to Your use of the + Licensed Material and that the Licensor has authority to license. + + j. Licensor means the individual(s) or entity(ies) granting rights + under this Public License. + + k. NonCommercial means not primarily intended for or directed towards + commercial advantage or monetary compensation. For purposes of + this Public License, the exchange of the Licensed Material for + other material subject to Copyright and Similar Rights by digital + file-sharing or similar means is NonCommercial provided there is + no payment of monetary compensation in connection with the + exchange. + + l. Share means to provide material to the public by any means or + process that requires permission under the Licensed Rights, such + as reproduction, public display, public performance, distribution, + dissemination, communication, or importation, and to make material + available to the public including in ways that members of the + public may access the material from a place and at a time + individually chosen by them. + + m. Sui Generis Database Rights means rights other than copyright + resulting from Directive 96/9/EC of the European Parliament and of + the Council of 11 March 1996 on the legal protection of databases, + as amended and/or succeeded, as well as other essentially + equivalent rights anywhere in the world. + + n. You means the individual or entity exercising the Licensed Rights + under this Public License. Your has a corresponding meaning. + + +Section 2 -- Scope. + + a. License grant. + + 1. Subject to the terms and conditions of this Public License, + the Licensor hereby grants You a worldwide, royalty-free, + non-sublicensable, non-exclusive, irrevocable license to + exercise the Licensed Rights in the Licensed Material to: + + a. reproduce and Share the Licensed Material, in whole or + in part, for NonCommercial purposes only; and + + b. produce, reproduce, and Share Adapted Material for + NonCommercial purposes only. + + 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, including when + the Licensed Material is used other than for NonCommercial + purposes. + + +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-NC-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 for NonCommercial purposes + only; + + 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. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000000..bbd2e200c8 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,11 @@ +Contributing +============ + +* Use appropriate formatting +* Name all variables correctly +* Prefer deferring to vanilla methods as much as possible instead of copying + * When copying, copy EXACTLY as is and make small comments to note tweaks made + * Comment the class somewhere with [VanillaCopy] to signal that that region needs to be looked at whenever updates happen +* Remove dead code. Git exists for a reason +* Commented code is dead code! +* For the love of god use @Override. \ No newline at end of file diff --git a/ISSUE_TEMPLATE.md b/ISSUE_TEMPLATE.md new file mode 100644 index 0000000000..a3a4598bdf --- /dev/null +++ b/ISSUE_TEMPLATE.md @@ -0,0 +1,11 @@ + +Forge version: +Twilight Forest version: +Link to crash log: + +Steps to reproduce: +1. + +What I expected to happen: + +What happened instead: diff --git a/README.md b/README.md index 9f9f2666c7..86d5488f5e 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,47 @@ -twilightforest +Twilight Forest [![Discord](https://img.shields.io/discord/313006291012288521.svg?colorB=7289DA&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHYAAABWAgMAAABnZYq0AAAACVBMVEUAAB38%2FPz%2F%2F%2F%2Bm8P%2F9AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfhBxwQJhxy2iqrAAABoElEQVRIx7WWzdGEIAyGgcMeKMESrMJ6rILZCiiBg4eYKr%2Fd1ZAfgXFm98sJfAyGNwno3G9sLucgYGpQ4OGVRxQTREMDZjF7ILSWjoiHo1n%2BE03Aw8p7CNY5IhkYd%2F%2F6MtO3f8BNhR1QWnarCH4tr6myl0cWgUVNcfMcXACP1hKrGMt8wcAyxide7Ymcgqale7hN6846uJCkQxw6GG7h2MH4Czz3cLqD1zHu0VOXMfZjHLoYvsdd0Q7ZvsOkafJ1P4QXxrWFd14wMc60h8JKCbyQvImzlFjyGoZTKzohwWR2UzSONHhYXBQOaKKsySsahwGGDnb%2FiYPJw22sCqzirSULYy1qtHhXGbtgrM0oagBV4XiTJok3GoLoDNH8ooTmBm7ZMsbpFzi2bgPGoXWXME6XT%2BRJ4GLddxJ4PpQy7tmfoU2HPN6cKg%2BledKHBKlF8oNSt5w5g5o8eXhu1IOlpl5kGerDxIVT%2BztzKepulD8utXqpChamkzzuo7xYGk%2FkpSYuviLXun5bzdRf0Krejzqyz7Z3p0I1v2d6HmA07dofmS48njAiuMgAAAAASUVORK5CYII%3D)](https://discord.gg/6v3z26B) [![Crowdin](https://badges.crowdin.net/twilight-forest/localized.svg)](https://crowdin.com/project/twilight-forest) [![Curseforge](http://cf.way2muchnoise.eu/full_227639_downloads.svg)](https://minecraft.curseforge.com/projects/the-twilight-forest) [![Curseforge](http://cf.way2muchnoise.eu/versions/For%20MC_227639_all.svg)](https://minecraft.curseforge.com/projects/the-twilight-forest) ============== -Twilight Forest repository \ No newline at end of file +This is the home of the Twilight Forest mod for Minecraft 1.12 and beyond. + +## Licensing +Code and otherwise stated default to our [LICENSE file here](LICENSE) + +Non-Code and [Non-Sound](src/main/resources/assets/twilightforest/sounds) assets [(Located here)](src/main/resources/assets) go by our [ASSET_LICENSE file here](ASSET_LICENSE) + +Sound based assets [(Located Here)](src/main/resources/assets/twilightforest/sounds) are **All Rights Reserved** + +## Downloads +Releases will be available on [CurseForge](https://minecraft.curseforge.com/projects/the-twilight-forest) when ready. + +Alternatively, grab your experimental builds from our [Discord](https://discord.gg/6v3z26B). See the #faq channel for more details. + +## Community +Keep in touch with development on our [Discord server](https://discord.gg/6v3z26B). We also have a [Twitter account](https://twitter.com/teamtwilightdev) we post development and Twilight Forest-related content on. + +## Translation +Submitting translations for Twilight Forest can be done via our [Crowdin page](https://crowdin.com/project/twilight-forest). Consider helping us out if you're fluent in any language at all! Alternatively, translations can still be submitted via pull requests. + +## Maven +https://modmaven.dev/teamtwilight/twilightforest/ + +``` +repositories { + maven { + url = "https://modmaven.dev/" + } +} + +dependencies { + implementation fg.deobf("teamtwilight:twilightforest:{version}:universal") +} +``` + +## YourKit +![](https://www.yourkit.com/images/yklogo.png) + +We appreciate YourKit, LLC for providing the project developers licenses of its profiler to help us improve performance! + +YourKit supports open source projects with its full-featured Java Profiler. +YourKit, LLC is the creator of [YourKit Java Profiler](https://www.yourkit.com/java/profiler/) +and [YourKit .NET Profiler](https://www.yourkit.com/.net/profiler/), +innovative and intelligent tools for profiling Java and .NET applications. diff --git a/azure-pipelines.yml b/azure-pipelines.yml new file mode 100644 index 0000000000..5f883562e0 --- /dev/null +++ b/azure-pipelines.yml @@ -0,0 +1,151 @@ +# Gradle +# Build your Java project and run tests with Gradle using a Gradle wrapper script. +# Add steps that analyze code, save build artifacts, deploy, and more: +# https://docs.microsoft.com/azure/devops/pipelines/languages/java + +pool: + vmImage: 'Ubuntu-latest' + +variables: + artifactName: 'Release' + GRADLE_USER_HOME: $(Pipeline.Workspace)/.gradle + SKIP_BUILD: $[contains(variables['Build.SourceBranch'], 'refs/heads/no-build/')] + ${{ if not(contains(variables['Build.SourceBranch'], 'refs/heads/no-build/')) }}: + revision: $[counter('release-number', 0)] + +steps: +- task: Cache@2 + inputs: + key: 'gradle | "$(Agent.OS)" | build.gradle | gradle.properties | src/main/resources/META-INF/accesstransformer.cfg' + restoreKeys: gradle + path: $(GRADLE_USER_HOME) + displayName: Gradle build cache + condition: eq(variables.SKIP_BUILD, 'false') + +- powershell: | + (Get-Content ./gradle.properties).Split([Environment]::NewLine) | % { + $kvp = $_.Split('=') + if ($kvp.Count -gt 1) { + $key = $kvp[0] -replace "\.", "_"; + $value = $kvp[1]; + Write-Host "##vso[task.setvariable variable=javaprops_$key]$value" + } + } + displayName: Create Azure DevOps variables from gradle properties file + condition: eq(variables.SKIP_BUILD, 'false') + +- task: Gradle@2 + displayName: Create Release Build + inputs: + workingDirectory: '' + options: '--build-cache --max-workers=1 -PCIRevision=$(javaprops_mod_version).$(revision) -PCIType=RELEASE' + gradleWrapperFile: 'gradlew' + gradleOptions: '-Xmx3072m' + javaHomeOption: 'JDKVersion' + jdkVersionOption: '1.8' + jdkArchitectureOption: 'x64' + publishJUnitResults: false + testResultsFiles: '**/TEST-*.xml' + tasks: 'build' + condition: eq(variables.SKIP_BUILD, 'false') + +- task: CopyFiles@2 + displayName: Copy Release build to artifact staging + inputs: + sourceFolder: './build/libs/' + contents: 'twilightforest-*-universal.jar' + targetFolder: $(build.artifactStagingDirectory) + condition: and(and(succeeded(), eq(variables['CreateArtifacts'], 'True')), eq(variables.SKIP_BUILD, 'false')) + +- task: PublishPipelineArtifact@1 + displayName: 'Publish Artifacts' + condition: and(and(succeeded(), eq(variables['CreateArtifacts'], 'True')), eq(variables.SKIP_BUILD, 'false')) + inputs: + targetPath: '$(Build.ArtifactStagingDirectory)' + artifact: '$(artifactName)' + publishLocation: 'pipeline' + +- powershell: | + $rawpath = "pipelineartifact://teamtwilight/projectId/1ef09d39-06cf-41fa-ad98-7258b70c2a72/buildId/$($Env:BUILD_BUILDID)/artifactName/Release" + $path = [Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes($rawpath)) + $jar = "twilightforest-$($env:JAVAPROPS_MINECRAFT_SUB_VERSION)-$($env:JAVAPROPS_MOD_VERSION).$($env:REVISION)-universal.jar" + $downloadUrl = "https://artprodcus3.artifacts.visualstudio.com/Abaabfa6c-deea-4587-ba05-c308c2597b7a/1ef09d39-06cf-41fa-ad98-7258b70c2a72/_apis/artifact/$($path)0/content?format=file&subPath=%2F$($jar)" + $jobResult = (Get-Culture).TextInfo.ToTitleCase(${env:agent.jobstatus}) + $Colour = 65280 + if ($jobResult -ne "Succeeded") { + $Colour = 16711680 + } + Write-Host "##vso[task.setvariable variable=DiscordMessageColour]$Colour" + + $json = [Ordered]@{ + title = "Build $jobResult" + url = "$($env:SYSTEM_TEAMFOUNDATIONSERVERURI)Twilight%20Forest/_build/results?buildId=$($Env:BUILD_BUILDID)&view=results" + color = $Colour + fields = ( + [Ordered]@{ + name = "Author" + value = "$($env:BUILD_SOURCEVERSIONAUTHOR)" + }, + [Ordered]@{ + name = "Minecraft Version" + value = "$($env:JAVAPROPS_MINECRAFT_SUB_VERSION)" + }, + [Ordered]@{ + name = "Mod Version" + value = "$($env:JAVAPROPS_MOD_VERSION).$($env:REVISION)" + }, + [Ordered]@{ + name = "Forge Version" + value = "$($env:JAVAPROPS_FORGE_VERSION)" + }, + [Ordered]@{ + name = "Commit" + value = "[$(($env:BUILD_SOURCEVERSION).Substring(0, 6))]($($env:BUILD_REPOSITORY_URI)/commit/$($env:BUILD_SOURCEVERSION))" + } + ) + } + if ($jobResult -eq "Succeeded") { + $json["fields"] += [Ordered]@{ + name = "Download" + value = "[$($downloadUrl.Split("subPath=%2F")[1])]($downloadUrl)" + } + } + Write-Host "##vso[task.setvariable variable=DiscordMessage]$($json | ConvertTo-Json -Compress)" + displayName: Format discord message + condition: eq(variables.SKIP_BUILD, 'false') + env: + SYSTEM_ACCESSTOKEN: $(System.AccessToken) + +- task: ado-discord-webhook@1 + displayName: Announce Build to discord + inputs: + channelId: '$(DiscordChannelID)' + webhookKey: '$(DiscordChannelSecret)' + messageType: 'embeds' + embeds: | + [$(DiscordMessage)] + condition: and(eq(variables.SKIP_BUILD, 'false'), eq(variables['CreateArtifacts'], 'True')) + +- task: Gradle@2 + displayName: Publish to Maven + inputs: + workingDirectory: '' + options: '-PCIRevision=$(javaprops_mod_version).$(revision) -PCIType=RELEASE' + gradleWrapperFile: 'gradlew' + gradleOptions: '-Xmx3072m' + javaHomeOption: 'JDKVersion' + jdkVersionOption: '1.8' + jdkArchitectureOption: 'x64' + publishJUnitResults: false + testResultsFiles: '**/TEST-*.xml' + tasks: 'publish' + condition: and(and(succeeded(), eq(variables['CreateArtifacts'], 'True')), eq(variables.SKIP_BUILD, 'false')) + env: + ARTIFACTORY_USER: $(Artifactory.User) + ARTIFACTORY_PASS: $(Artifactory.Password) + +- script: | + # stop the Gradle daemon to ensure no files are left open (impacting the save cache operation later) + ./gradlew --stop + displayName: Kill Daemon + condition: eq(variables.SKIP_BUILD, 'false') diff --git a/build.gradle b/build.gradle index 671ea9cea4..65a5f2f812 100644 --- a/build.gradle +++ b/build.gradle @@ -1,65 +1,194 @@ buildscript { repositories { + maven { url = 'https://maven.minecraftforge.net/' } + maven { url = 'https://maven.parchmentmc.org' } mavenCentral() - maven { - name = "forge" - url = "http://files.minecraftforge.net/maven" - } - maven { - name = "sonatype" - url = "https://oss.sonatype.org/content/repositories/snapshots/" - } } dependencies { - classpath 'net.minecraftforge.gradle:ForgeGradle:1.2-SNAPSHOT' + classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '5.1.+', changing: true + classpath 'org.parchmentmc:librarian:1.+' } } +apply plugin: 'java' +apply plugin: 'idea' +apply plugin: 'net.minecraftforge.gradle' +apply plugin: 'org.parchmentmc.librarian.forgegradle' +apply plugin: 'maven-publish' +apply plugin: 'eclipse' -apply plugin: 'forge' +version = (hasProperty("CIRevision") ? CIRevision : mod_version) +group = group_name +archivesBaseName = "${mod_id}-${minecraft_sub_version}" +java.toolchain.languageVersion = JavaLanguageVersion.of(17) -version = "2.3.8dev" -group= "twilightforest" // http://maven.apache.org/guides/mini/guide-naming-conventions.html -archivesBaseName = "twilightforest-1.7.10" +compileJava.options.compilerArgs << "-Xlint:all,-classfile,-processing,-deprecation" << "-Werror" minecraft { - version = "1.7.10-10.13.4.1558-1.7.10" - runDir = "eclipse" + //mappings channel: "official", version: "1.19.4" + // https://ldtteam.jfrog.io/ui/native/parchmentmc-public/org/parchmentmc/data + mappings channel: 'parchment', version: '1.19.3-2023.03.12-1.19.4' + + //version = minecraft_version + "-" + forge_version // grab latest forge + //makeObfSourceJar = false // an Srg named sources jar is made by default. uncomment this to disable. + accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg') + + runs { + client { + workingDirectory project.file('run') + + property 'forge.logging.markers', 'REGISTRIES' + property 'forge.logging.console.level', 'debug' + property 'fml.earlyprogresswindow', 'false' + property 'mixin.env.disableRefMap', 'true' + + mods { + twilightforest { + source sourceSets.main + } + } + } + + server { + workingDirectory project.file('run') + + property 'forge.logging.console.level', 'debug' + property 'mixin.env.disableRefMap', 'true' + + mods { + twilightforest { + source sourceSets.main + } + } + } + + gameTestServer { + workingDirectory project.file('run') + + property 'forge.logging.markers', 'REGISTRIES' + property 'forge.logging.console.level', 'debug' + property 'forge.enabledGameTestNamespaces', 'twilightforest' + + mods { + twilightforest { + source sourceSets.main + } + } + } + + data { + workingDirectory project.file('run') + + properties 'fml.earlyprogresswindow': 'false' + property 'mixin.env.disableRefMap', 'true' + + mods { + twilightforest { + source sourceSets.main + } + } + args '--mod', 'twilightforest', '--all', + '--existing', '"' + file('src/main/resources/') + '"', + '--existing', '"' + file('src/generated/resources/') + '"', + '--output', '"' + file('src/generated/resources/') + '"' + } + } +} + +sourceSets.main.resources { + srcDir 'src/generated/resources' +} + +compileJava { + options.encoding = 'UTF-8' +} + +jar { + classifier = 'universal' + manifest { + attributes(["Specification-Title" : "Twilight Forest", + "Specification-Vendor" : "TeamTwilight", + "Specification-Version" : "${version}", + "Implementation-Title" : project.name, + "Implementation-Version" : "${version}", + "Implementation-Vendor" : "TeamTwilight", + "Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ")],) + } +} + +repositories { + maven { + name 'Jared\'s Maven' // JEI + url 'https://maven.blamejared.com/' + } + maven { + name 'tterrag\'s Maven' // CTM + url 'https://maven.tterrag.com/' + } + maven { + name 'theillusivec4\'s Maven' // Curios + url 'https://maven.theillusivec4.top/' + } + maven { + name 'Tama\'s Maven' // Cross-Dim Commands + url "https://maven.tamaized.com/releases" + } + maven { + name 'Curseforge Maven' // Jade + url "https://www.cursemaven.com" + content { + includeGroup "curse.maven" + } + } } dependencies { - // you may put jars on which you depend on in ./libs - // or you may define them like so.. - //compile "some.group:artifact:version:classifier" - //compile "some.group:artifact:version" - - // real examples - //compile 'com.mod-buildcraft:buildcraft:6.0.8:dev' // adds buildcraft to the dev env - //compile 'com.googlecode.efficient-java-matrix-library:ejml:0.24' // adds ejml to the dev env - - // for more info... - // http://www.gradle.org/docs/current/userguide/artifact_dependencies_tutorial.html - // http://www.gradle.org/docs/current/userguide/dependency_management.html - - compile files('libs/Thaumcraft-deobf-1.7.10-4.2.3.5.jar') - + // jared + implementation fg.deobf("mezz.jei:jei-${project.minecraft_sub_version}-forge:${jei_version}") + + // tterrag + //implementation fg.deobf("team.chisel.ctm:CTM:${minecraft_version}-${ctm_version}") + + // theillusivec4 + implementation fg.deobf("top.theillusivec4.curios:curios-forge:${project.minecraft_sub_version}-${curios_version}") + + //curse maven + implementation fg.deobf("curse.maven:jade-324717:4439089-api-4439091") + //runtimeOnly fg.deobf("curse.maven:just-enough-effect-descriptions-jeed-532286:3944903") + + compileOnly fg.deobf("curse.maven:the-one-probe-245211:4442439") + + //mods we dont have compat with but are nice to have + //runtimeOnly fg.deobf("team-twilight:crossdimcommands:${project.minecraft_sub_version}-1.0") + + minecraft "net.minecraftforge:forge:${project.minecraft_sub_version}-${project.forge_version}" } -processResources -{ - // this will ensure that this task is redone when the versions change. - inputs.property "version", project.version - inputs.property "mcversion", project.minecraft.version - - // replace stuff in mcmod.info, nothing else - from(sourceSets.main.resources.srcDirs) { - include 'mcmod.info' - - // replace version and mcversion - expand 'version':project.version, 'mcversion':project.minecraft.version +jar.finalizedBy('reobfJar') + +publishing { + publications { + mavenJava(MavenPublication) { + afterEvaluate { + artifact project.jar + artifact project.sourceJar + } + setGroupId 'teamtwilight' + setArtifactId project.mod_id + } } - - // copy everything else, thats not the mcmod.info - from(sourceSets.main.resources.srcDirs) { - exclude 'mcmod.info' + repositories { + maven { + //url "file:///${project.projectDir}/mcmodsrepo" + url "https://modmaven.dev:443/artifactory/local-releases" + credentials { + username System.getenv('ARTIFACTORY_USER') + password System.getenv('ARTIFACTORY_PASS') + } + } } } + +task sourceJar(type: Jar, dependsOn: 'classes') { + from sourceSets.main.allSource + classifier = 'sources' +} diff --git a/crowdin.yml b/crowdin.yml new file mode 100644 index 0000000000..355f9ef96a --- /dev/null +++ b/crowdin.yml @@ -0,0 +1,126 @@ +files: + - source: /src/generated/resources/assets/twilightforest/lang/en_us.json + translation: /src/main/resources/assets/twilightforest/lang/%locale_with_underscore%.json + languages_mapping: + locale_with_underscore: + af: af_za + ar: ar_sa + ast: ast_es + az: az_az + ba: ba_ru + be: be_by + bg: bg_bg + br-FR: br_fr + bs: bs_ba + ca: ca_es + cs: cs_cz + cy: cy_gb + da: da_dk + de-AT: de_at + de-CH: de_ch + de: de_de + el: el_gr + en-AU: en_au + en-CA: en_ca + en-GB: en_gb + en-NZ: en_nz + en-PT: en_pt + en-UD: en_ud + en-US: en_us + en-ZA: en_za + eo: eo_uy + es-AR: es_ar + es-CL: es_cl + es-EC: es_ec + es-ES: es_es + es-MX: es_mx + es-UY: es_uy + es-VE: es_ve + et: et_ee + eu: eu_es + fa: fa_ir + fi: fi_fi + fil: fil_ph + fo: fo_fo + fr-CA: fr_ca + fr: fr_fr + fr-QC: fr_qc + fra-DE: fra_de + fy-NL: fy_nl + ga-IE: ga_ie + gd: gd_gb + gl: gl_es + got: got_de + gv: gv_im + haw: haw_us + he: he_il + hi: hi_in + hr: hr_hr + hu: hu_hu + hy-AM: hy_am + id: id_id + ig: ig_ng + ido: io_en + is: is_is + it: it_it + ja: ja_jp + jbo: jbo_en + ka: ka_ge + kab: kab_kab + kk: kk_kz + kn: kn_in + ko: ko_kr + kw: kw_gb + la-LA: la_va + lb: lb_lu + li: li_li + lol: lol_us + lt: lt_lt + lv: lv_lv + mi: mi_nz + mk: mk_mk + mn: mn_mn + moh: moh_ca + ms: ms_my + mt: mt_mt + nb: nb_no + nds: nds_de + nl-BE: nl_be + nl: nl_nl + nn-NO: nn_no + no-NO: no_no + oc: oc_fr + oj: oj_ca + pl: pl_pl + pt-BR: pt_br + pt-PT: pt_pt + qya-AA: qya_aa + ro: ro_ro + ru: ru_ru + ry-UA: ry_ua + se: se_no + sk: sk_sk + sl: sl_si + so: so_so + sq: sq_al + sr: sr_sp + sr-CS: sr_cs + sv-SE: sv_se + ta: ta_in + th: th_th + tl: tl_ph + tlh-AA: tlh_aa + tr: tr_tr + tt-RU: tt_ru + tzl: tzl_tzl + uk: uk_ua + val-ES: val_es + vec: vec_it + vi: vi_vn + vls-BE: vls_be + yi: yi_de + yo: yo_ng + zh-CN: zh_cn + zh-TW: zh_tw + zh-HK: zh_hk + fur-IT: fur_it diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000000..89cacff3bc --- /dev/null +++ b/gradle.properties @@ -0,0 +1,18 @@ +# Sets default memory used for gradle commands. Can be overridden by user or command line properties. +# This is required to provide enough memory for the Minecraft decompilation process. +org.gradle.jvmargs=-Xmx4G + +# suppress inspection "UnusedProperty" for whole file +# Mod Properties +mod_version=4.2 +mod_id=twilightforest +group_name=com.github.teamtwilight.twilightforest + +#Versions +minecraft_version=1.19 +minecraft_sub_version=1.19.4 + +forge_version=45.0.46 + +jei_version=13.1.0.9 +curios_version=5.1.5.1 \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000..7454180f2a Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000000..ffed3a254e --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100755 index 0000000000..744e882ed5 --- /dev/null +++ b/gradlew @@ -0,0 +1,185 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MSYS* | MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000000..107acd32c4 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/src/generated/README.txt b/src/generated/README.txt new file mode 100644 index 0000000000..4b664f1a32 --- /dev/null +++ b/src/generated/README.txt @@ -0,0 +1,5 @@ +The files under this directory should **not** be edited by hand, and any PR's trying to do so +will be closed without warning. Please see the twilightforest.data package and edit the appropriate datagenerator, +then run the `runData` gradle task to regenerate these files. + +Basically: src/main/resources = hand-edited, src/generated/resources = `runData`-generated. diff --git a/src/generated/resources/.cache/0f202e000d40347127b33b6edbbb29689b8cbf86 b/src/generated/resources/.cache/0f202e000d40347127b33b6edbbb29689b8cbf86 new file mode 100644 index 0000000000..569da3f31c --- /dev/null +++ b/src/generated/resources/.cache/0f202e000d40347127b33b6edbbb29689b8cbf86 @@ -0,0 +1,2 @@ +// 1.19.4 2023-04-23T21:55:47.621175 Pack Metadata +eb98482ce4a6ff7ff89ff9eb2374fe39ed12accf pack.mcmeta diff --git a/src/generated/resources/.cache/103d9f3f36b01595f1aa5172191e60eff02e6924 b/src/generated/resources/.cache/103d9f3f36b01595f1aa5172191e60eff02e6924 new file mode 100644 index 0000000000..19cf2fe551 --- /dev/null +++ b/src/generated/resources/.cache/103d9f3f36b01595f1aa5172191e60eff02e6924 @@ -0,0 +1,297 @@ +// 1.19.4 2023-05-28T08:45:10.009318 Registries +9089ada9ce06fd30adf8b10e50f02233c7d5a76e data/minecraft/twilight/wood_palettes/acacia.json +dca1ef01d0df4e956fd414782de57c25dfddd290 data/minecraft/twilight/wood_palettes/birch.json +01becb45438b7f2bfdc77baba72bc986341510c8 data/minecraft/twilight/wood_palettes/crimson.json +1534ab1da2b2e87cec0dba51d0754e037d0077a6 data/minecraft/twilight/wood_palettes/dark_oak.json +b02ef5ca34cf18dab1ae63fe8266b87e4d612478 data/minecraft/twilight/wood_palettes/jungle.json +755a8493f0df0ecc5d9240b6d8da6f7be6cb353f data/minecraft/twilight/wood_palettes/mangrove.json +1e09df5942a0273885092f722ac2cab788a42949 data/minecraft/twilight/wood_palettes/oak.json +96ce0ebb03bf3906a0b6f8a19d5f658ecab260cd data/minecraft/twilight/wood_palettes/spruce.json +5fbf8048f4f024ba7ebf85efbf3a169a2faa1139 data/minecraft/twilight/wood_palettes/warped.json +7fbe3ed8167b8f255c6b290356d8dc14d4c88d24 data/twilightforest/damage_type/ant.json +a66797f1cd4859ca4d6d1715be9b337d3b962630 data/twilightforest/damage_type/axing.json +332122844817fadea48b84007f499ac191bd5802 data/twilightforest/damage_type/chilling_breath.json +90a15a99259e2457fb5b177d11636839838f2ee1 data/twilightforest/damage_type/clamped.json +3c958335abebe45d0d78dcf31eb4c8b81715ecde data/twilightforest/damage_type/expired.json +9ee458c70cfbcdf2f00ae26201e8c9ba6dfc8baa data/twilightforest/damage_type/falling_ice.json +44931205303645ace656caefac7fcde2f8f94fad data/twilightforest/damage_type/fiery.json +0631d1340909a08dd5dcfcb0b07e8c753ed985a6 data/twilightforest/damage_type/fire_jet.json +6f2c17d2fa8fbb62554368c5776fd5ec28766182 data/twilightforest/damage_type/frozen.json +a31c57f9c1e08e087dcbe392554cab0e0e238935 data/twilightforest/damage_type/ghast_tear.json +839c77ae9b8468a9f192f8b5035e3a61c512659e data/twilightforest/damage_type/haunt.json +215463ce8e8cac1b17d393efa2cd2581618b79d9 data/twilightforest/damage_type/hydra_bite.json +427063f44f866ba21e873494d8d610e53f164dbf data/twilightforest/damage_type/hydra_fire.json +9a63401c5a4f42e8920eb2108c3328877abe837b data/twilightforest/damage_type/hydra_mortar.json +f03f39636cf59965fd7c30d05213136fcb5b7344 data/twilightforest/damage_type/knightmetal.json +7a69fb52f9b7265def827f2c68a6cb5f46f481d7 data/twilightforest/damage_type/leaf_brain.json +2562c6a9a5a8968995154f55e219ac14f2d4df03 data/twilightforest/damage_type/lich_bolt.json +e9cec134cab4d5efdb77cd6fb54901bd779de94f data/twilightforest/damage_type/lich_bomb.json +210f397fa8e6be5a972a815eb1c7fbaae8563552 data/twilightforest/damage_type/lifedrain.json +f7afffd7b495d67a5dcf30f9e908e1345a5491e3 data/twilightforest/damage_type/lost_words.json +4e3ec48a9241bfa801bdf2d0ff8bbf696cbd680b data/twilightforest/damage_type/moonworm.json +b8fb3f55d34a7281ded705a4c2298d0eb5075a45 data/twilightforest/damage_type/reactor.json +0d7269b6fa31d8a3acdefbc544e985396ee606de data/twilightforest/damage_type/schooled.json +401dc9d27a3ea6c90b7af264148599ddea0c3603 data/twilightforest/damage_type/scorched.json +a66797f1cd4859ca4d6d1715be9b337d3b962630 data/twilightforest/damage_type/slam.json +8744ce1ca0ee7ff70e72adc506724987a96bc5b8 data/twilightforest/damage_type/slider.json +cc2d967606545285e0900d5bd212522cc76385b5 data/twilightforest/damage_type/snowball_fight.json +f30c3624699b87ad6127d92c5a458cbd59ff4e1d data/twilightforest/damage_type/spiked.json +cd4441260df4d3563e61eea40fefd65556f3bea4 data/twilightforest/damage_type/squish.json +a899c790d55966390cc13c8b8e3803af9f534f53 data/twilightforest/damage_type/thorns.json +e0bcaf826b9a325b3f9a246f9ed4bf223ac73028 data/twilightforest/damage_type/thrown_axe.json +1deb6a3b1b3e55c68e58217d6c12c9d96ac8e3cb data/twilightforest/damage_type/thrown_block.json +5d9706b0e533a64257219f9bbff7c6df4b0317b2 data/twilightforest/damage_type/thrown_pickaxe.json +3ee3140bd5138e8e21a74f96cb2cc8dbf265d131 data/twilightforest/damage_type/twilight_scepter.json +c4304ad6f22195ea9ddeff9a926a0bea41dd5b0d data/twilightforest/damage_type/yeeted.json +bed3a29af5dd60bbfc482861e3858bfd77cfeb16 data/twilightforest/dimension/twilight_forest.json +71f153910dd7b4b3b77718b9b07c84042ab39f7d data/twilightforest/dimension_type/twilight_forest_type.json +c01efe2b06b832718931f88ed9645b44b58409dd data/twilightforest/twilight/biome_layer_stack/biomes_along_streams.json +87d0487a38fb84d85efb0cb0044f50fe8053d60e data/twilightforest/twilight/biome_layer_stack/random_forest_biomes.json +2aa6f23871be95f6a25e9b6215dff1ad5294aeb6 data/twilightforest/twilight/wood_palettes/canopy.json +e7c4f0010ae7c35e0abe75d4ba2e26eabf838936 data/twilightforest/twilight/wood_palettes/darkwood.json +240b6e8defa7c7a0639f4ecc8f064a60c9f5a7d5 data/twilightforest/twilight/wood_palettes/mangrove.json +7ed10f77ff13a3399aeafcf2a20faeac71df5077 data/twilightforest/twilight/wood_palettes/minewood.json +7befc2c03fbe740e15490b3f266b41c3cc2e8a6e data/twilightforest/twilight/wood_palettes/sortwood.json +b6d4a8629c11a3cac9b91801973bb0fa7ff9bcea data/twilightforest/twilight/wood_palettes/timewood.json +465031afbf54df48a316262698e547fc7ebd29f0 data/twilightforest/twilight/wood_palettes/transwood.json +c5e1e96fa69452349f77ba366f9b2d54315d6726 data/twilightforest/twilight/wood_palettes/twilight_oak.json +f98ed32ec5ec3cb155a7dbbb0ca7aef884d79d37 data/twilightforest/worldgen/biome/clearing.json +5d8ec504983f84e69d6b3ff63b58f2242630a466 data/twilightforest/worldgen/biome/dark_forest.json +5312890a02998149c485e19cdab5624bcc0b3bf6 data/twilightforest/worldgen/biome/dark_forest_center.json +88774f2ddf66874b231e290b1fe8053acd9b8232 data/twilightforest/worldgen/biome/dense_forest.json +02a5f9cc4f5b8bf900598bf297fcdcf778564fe5 data/twilightforest/worldgen/biome/dense_mushroom_forest.json +5b44c1250e4a83c19620810f5b0caf3ae6ba2e1e data/twilightforest/worldgen/biome/enchanted_forest.json +0f7add8c82f0867894000c6f3a5db4bc48b9027f data/twilightforest/worldgen/biome/final_plateau.json +26116fe6791a5adc9828cd65f5594ccef0a0b610 data/twilightforest/worldgen/biome/firefly_forest.json +44470fc5b373a78554d550de0bfee619ee97feb4 data/twilightforest/worldgen/biome/fire_swamp.json +ab4e3165e554a0b5996c0234aacf91947607ce73 data/twilightforest/worldgen/biome/forest.json +a31a1dedcd7aacd3ccbe0b6078ad9f4ba61bbcae data/twilightforest/worldgen/biome/glacier.json +06b5fca610b42baaf41337ca3e138d4026331a15 data/twilightforest/worldgen/biome/highlands.json +eb589a765bca75bb4f5f69d451cc86f76651b571 data/twilightforest/worldgen/biome/lake.json +9f57849b2cd9c552e8ec763741dc0d79c68d9bbf data/twilightforest/worldgen/biome/mushroom_forest.json +164c9bd3ba4c1b2fb3cca29ab0139bfd1eb761b1 data/twilightforest/worldgen/biome/oak_savannah.json +3ada374a00ed5ce5da1dec653cdcc8246114903b data/twilightforest/worldgen/biome/snowy_forest.json +6b138e8dde44ba083786bdb96355a674c2400dc4 data/twilightforest/worldgen/biome/spooky_forest.json +576da148aeb3dc599d25779d1ef21121d5007177 data/twilightforest/worldgen/biome/stream.json +f8ed7f1195ae624cc2bb6257b1aff2e5a79d20cb data/twilightforest/worldgen/biome/swamp.json +d301ff8b947d21c124d380886a3dde1e41304ec8 data/twilightforest/worldgen/biome/thornlands.json +ce67da8a32439536d8998392e3fac4b72e631e8e data/twilightforest/worldgen/biome/underground.json +5f90dbc8c186bbd0ccfbf20eb0829b50650dd78c data/twilightforest/worldgen/configured_carver/highland_caves.json +a4a4f203951a7e61b1654e7e272426a4196d58e9 data/twilightforest/worldgen/configured_carver/tf_caves.json +aaabd69f1e630172252fd3e6bd0e5845ef2f8cd0 data/twilightforest/worldgen/configured_feature/birch_fallen_log.json +e7bd46ddb238735e4f1927a3bcc5f7fd18e23ea7 data/twilightforest/worldgen/configured_feature/canopy_fallen_log.json +c091b11d2772ab089848d1d3c7e7e5c6304ba968 data/twilightforest/worldgen/configured_feature/cicada_lamppost.json +80d00488238bb9db313a0ffb356af65519e402b6 data/twilightforest/worldgen/configured_feature/dark_dead_bushes.json +60890464119dd37bab76b8765126a359db0620db data/twilightforest/worldgen/configured_feature/dark_ferns.json +1a0dff87224eb47002acb48dbd3aefd604e4908f data/twilightforest/worldgen/configured_feature/dark_grass.json +83ed3fe307cfc19ff845fd5df3d56cf37e57a189 data/twilightforest/worldgen/configured_feature/dark_mushglooms.json +14846baa8e861fb4177e52a5e92f567ee4d79315 data/twilightforest/worldgen/configured_feature/dark_mushrooms.json +458d7c5d75a89fbf64e967ba5b9edaa25e48c0b3 data/twilightforest/worldgen/configured_feature/dark_pumpkins.json +571fb66edc9ad540d5d783e3bc1d268ae5f1b6bf data/twilightforest/worldgen/configured_feature/default_fallen_logs.json +6f97a684e664e5f261e2ada0ba9f818d8556c149 data/twilightforest/worldgen/configured_feature/druid_hut.json +3afb7351561a98f14065cff830300735f3985625 data/twilightforest/worldgen/configured_feature/fallen_leaves.json +8cec51f8c8ef53061114075cca36e703dd7a0617 data/twilightforest/worldgen/configured_feature/fancy_well.json +244b31e5e86c79c1637e2d89902eddf50c2cb4d8 data/twilightforest/worldgen/configured_feature/fiddlehead.json +21a8619af190cd1643fdb6b337aa3f06af671181 data/twilightforest/worldgen/configured_feature/firefly_lamppost.json +9a8b7912e3b4dadc6b50b827676498e72a4fe2da data/twilightforest/worldgen/configured_feature/fire_jet.json +aacdb0d5124df3d216f9513b1c614786c90cb66e data/twilightforest/worldgen/configured_feature/flower_placer.json +015c3851c7dc146f279d9da4d6b9eeef98957cf9 data/twilightforest/worldgen/configured_feature/flower_placer_alt.json +9a8e043487b6c2657ca239ec1a4ba0d772073c1e data/twilightforest/worldgen/configured_feature/foundation.json +c8510921261b96cdb716725bd4f35e77cf6767cf data/twilightforest/worldgen/configured_feature/graveyard.json +fbc7a5c08dfbf7593b8b6594c36fdd5eb308c973 data/twilightforest/worldgen/configured_feature/grove_ruins.json +f847fecb789ed5fa5902184b16a67380edc78ef1 data/twilightforest/worldgen/configured_feature/hollow_log.json +947d38b539a331519a3bb123c1f0f4d72e900d20 data/twilightforest/worldgen/configured_feature/hollow_stump.json +1a0e0b4d3128d2ba793374510c19425418ade318 data/twilightforest/worldgen/configured_feature/huge_lily_pad.json +c2368d420c181cd3895d127220027d2adcb84b60 data/twilightforest/worldgen/configured_feature/huge_water_lily.json +0888a0778fc7d435666fbef190f54c6646572059 data/twilightforest/worldgen/configured_feature/lamppost_placer.json +c31d2885dcce5f5c403891dce8f47f274160c77c data/twilightforest/worldgen/configured_feature/lava_lake.json +3532ea18a753baad9a4814a3fc4e03d3ba4be05a data/twilightforest/worldgen/configured_feature/legacy_coal_ore.json +95fef25b5d99140726731e8bc8e548041b75ee1f data/twilightforest/worldgen/configured_feature/legacy_copper_ore.json +9cf033d3dd697919567535ed58ae880c9be59f87 data/twilightforest/worldgen/configured_feature/legacy_diamond_ore.json +70aadc0e2fcecc28e97de0efce88c31da48f6f5f data/twilightforest/worldgen/configured_feature/legacy_gold_ore.json +cc1e49729c1647a3a7fe4302777a21248b8f8a0f data/twilightforest/worldgen/configured_feature/legacy_iron_ore.json +b4c0d6f3695c54d5a110f2cf7f205df82d6d5807 data/twilightforest/worldgen/configured_feature/legacy_lapis_ore.json +c75ca1c17ff95091601a10b82b0e259a875668a7 data/twilightforest/worldgen/configured_feature/legacy_redstone_ore.json +9202c9f5d97352e9cc172c217f1355ba28907adc data/twilightforest/worldgen/configured_feature/mangrove_fallen_log.json +99ddd4131c7b32d64d70aa825d5d6c8cafbbc73d data/twilightforest/worldgen/configured_feature/mayapple.json +b874869be013de8263f53a609a1c56b66a96ee9e data/twilightforest/worldgen/configured_feature/monolith.json +2b50cce38571e33dede42bd72edb0b08bf52b0f9 data/twilightforest/worldgen/configured_feature/mushgloom_cluster.json +b40139f7c4d38832adad6a505013a23ce914c100 data/twilightforest/worldgen/configured_feature/mushroom/big_mushgloom.json +c3eeb6eb0efc5b75da15dcec536219848991b95c data/twilightforest/worldgen/configured_feature/mushroom/brown_canopy_mushroom.json +9da43ba0d8e908c08c4aeba67a991e3b9dc746e4 data/twilightforest/worldgen/configured_feature/mushroom/canopy_mushrooms_dense.json +03db353f9168033b2609ae2f536c1c73676bf3f7 data/twilightforest/worldgen/configured_feature/mushroom/canopy_mushrooms_sparse.json +57907278b306323b933c9ccfb75aa8c2a139b486 data/twilightforest/worldgen/configured_feature/mushroom/red_canopy_mushroom.json +789267d7f05d18b18cad911247b66ab3b5581514 data/twilightforest/worldgen/configured_feature/mycelium_blob.json +a3b5f0d4235b96f1678571bc16ad945a760e7e8e data/twilightforest/worldgen/configured_feature/oak_fallen_log.json +326ae891c0a4883ac9e31ed393b302765dd880b3 data/twilightforest/worldgen/configured_feature/ore/wood_roots_spread.json +995bb8fcefa7ce71e563feae5aae7bb003793ff6 data/twilightforest/worldgen/configured_feature/outside_stalagmite.json +01b533444dbfaa068f6edd34591e37eb2c6e646e data/twilightforest/worldgen/configured_feature/plant_roots.json +e3ecdf3a84ab2dc18b49b98fba9f73bb318278b2 data/twilightforest/worldgen/configured_feature/pumpkin_lamppost.json +28fb8fda520cc9dcfc4ae51661f9238470ce3d84 data/twilightforest/worldgen/configured_feature/simple_well.json +1d0bd965a98cda440772ffc2119e8b5fa3f6e9f8 data/twilightforest/worldgen/configured_feature/small_andesite.json +6c9e1715b7381211836306ec1732e0fd50cd1639 data/twilightforest/worldgen/configured_feature/small_diorite.json +6819e8e48a407d4f9c27931c33ada13acb4c905e data/twilightforest/worldgen/configured_feature/small_granite.json +14a2b7b1884c76335256d185d033be1eb4537892 data/twilightforest/worldgen/configured_feature/smoker.json +1239b470a790a0550a4487c1ea2f317598fa3628 data/twilightforest/worldgen/configured_feature/snow_under_trees.json +3a8611b6f169a195d0c07cc238fe2e5d48fb42e0 data/twilightforest/worldgen/configured_feature/spruce_fallen_log.json +2e5d2c5577d944fe7729b802ddb8c9755cf40311 data/twilightforest/worldgen/configured_feature/stone_circle.json +bed2ac0078798f3e44858a48a619e6cdaa715493 data/twilightforest/worldgen/configured_feature/tf_oak_fallen_log.json +58314130200614dca385486085b965364b61e2b8 data/twilightforest/worldgen/configured_feature/thorns.json +a6ebebfc0e249c985caeb4cb92efdbefa08fc5b0 data/twilightforest/worldgen/configured_feature/torch_berries.json +1a42442e7de2d88f6da0a364e7406678996d7409 data/twilightforest/worldgen/configured_feature/tree/canopy_tree.json +6a1baa416854d90ea433ce653a5276211410bea0 data/twilightforest/worldgen/configured_feature/tree/darkwood_lantern_tree.json +895f999b32f338d27454d9da9bcce006ccce3911 data/twilightforest/worldgen/configured_feature/tree/darkwood_tree.json +0587198b9292197f6804ee891cad22ee318b5141 data/twilightforest/worldgen/configured_feature/tree/dark_forest_birch_tree.json +61ed61389b68efed2c636c323ee8c54a5499fb3d data/twilightforest/worldgen/configured_feature/tree/dark_forest_oak_tree.json +7ff4ae7465ec347df003c7e65d7a1a81c3378ebb data/twilightforest/worldgen/configured_feature/tree/dead_canopy_tree.json +cbc01407f81c547e1384753574d83f4983bc738b data/twilightforest/worldgen/configured_feature/tree/dummy.json +ba599aa94413c449edec5bfe545189302e250ea9 data/twilightforest/worldgen/configured_feature/tree/firefly_canopy_tree.json +228d9dc9e14d01bba6c7b25f87d8be7231d6b99e data/twilightforest/worldgen/configured_feature/tree/forest_canopy_oak_tree.json +42df7a4c70b4eabf79f0f9c822818f10ede3b52a data/twilightforest/worldgen/configured_feature/tree/hollow_tree.json +070bede66fbe4c3e5470e432f2082f27e9064826 data/twilightforest/worldgen/configured_feature/tree/homegrown_darkwood_tree.json +55b3f1252d284e5268be545967703d1045334e3c data/twilightforest/worldgen/configured_feature/tree/large_rainbow_oak.json +7cfee0b5d2ea01e99cf31f992d0365f238e58cc4 data/twilightforest/worldgen/configured_feature/tree/large_twilight_oak_tree.json +76a72fd082def8b566ef6c4e357df7369c37b91d data/twilightforest/worldgen/configured_feature/tree/large_winter_tree.json +9a82f71544386c9c6a4f818ddc7f71790a4529f6 data/twilightforest/worldgen/configured_feature/tree/mangrove_tree.json +7d4a3a4698be9bbc24ad85c3da39bc467c078ae6 data/twilightforest/worldgen/configured_feature/tree/mega_spruce_tree.json +c7e18f453d8b3be9fb4d11ba644c53d380bff7ea data/twilightforest/worldgen/configured_feature/tree/mining_tree.json +c740a123f010eb4febd485134b633ac7d518b169 data/twilightforest/worldgen/configured_feature/tree/rainbow_oak.json +4b6c1a57a28c08b9be6b1cf08ee5c0002c688e08 data/twilightforest/worldgen/configured_feature/tree/savannah_canopy_oak_tree.json +486cff87aee3cd06a82a7d75d8b9bf509102d7f5 data/twilightforest/worldgen/configured_feature/tree/selector/canopy_trees.json +0ebc46171b6358c0f557115e7116be22a41c42b6 data/twilightforest/worldgen/configured_feature/tree/selector/dark_forest_trees.json +96861e6a3bb90f63112617abf3f2ac8f4f8421c3 data/twilightforest/worldgen/configured_feature/tree/selector/dense_canopy_trees.json +7f621cf20a68d70764e47a1365e26f948ac9445d data/twilightforest/worldgen/configured_feature/tree/selector/enchanted_forest_trees.json +9c42c640892024958f9171d185ba4a18a5cca734 data/twilightforest/worldgen/configured_feature/tree/selector/firefly_forest_trees.json +c29d954b3c3aee862675c64c0805ac29852bac8b data/twilightforest/worldgen/configured_feature/tree/selector/highlands_trees.json +3a5804397a82b2a712e0721f0b08faf6ad80719e data/twilightforest/worldgen/configured_feature/tree/selector/snowy_forest_trees.json +a273ae0c707476c603fd68540093aabe244eda06 data/twilightforest/worldgen/configured_feature/tree/selector/vanilla/vanilla_mushrooms.json +18ffcf7ec69980631b5ffa2c49115ce282c586e0 data/twilightforest/worldgen/configured_feature/tree/selector/vanilla_trees.json +9fd60fc820ee73e76b076c44f3abf90f7c02356b data/twilightforest/worldgen/configured_feature/tree/smaller_jungle_tree.json +c2de1ef3446f3fc9421279c41b06fdd9ed2b3fc2 data/twilightforest/worldgen/configured_feature/tree/snowy_spruce_tree.json +5598712394f57b4cf98eb5fe12c247c548581b24 data/twilightforest/worldgen/configured_feature/tree/sorting_tree.json +46c6a189971484b9ab7951a9fdd07e12cf35e4d3 data/twilightforest/worldgen/configured_feature/tree/swampy_oak_tree.json +a5a2b28d50fe3a46290ae7ab523e9d05be9e957c data/twilightforest/worldgen/configured_feature/tree/time_tree.json +349c7208ad46bbb77d8219f27aa03aea967f3720 data/twilightforest/worldgen/configured_feature/tree/transformation_tree.json +72786d78654ffedf1f1c261c69381d326b3f6aff data/twilightforest/worldgen/configured_feature/tree/twilight_oak_tree.json +acd73c0ff811fb7371cbaa9af6e0f48732b462c3 data/twilightforest/worldgen/configured_feature/tree/vanilla_birch_tree.json +74903311cf433741433ffad3cd53d2d0288d95fd data/twilightforest/worldgen/configured_feature/tree/vanilla_oak_tree.json +6fd4fa7af291ca1a7a616962e8177b1f4e270b9b data/twilightforest/worldgen/configured_feature/troll_cave_dirt.json +b4c8ef8c08b9c5690cec1f217220aa89760af51a data/twilightforest/worldgen/configured_feature/troll_cave_mycelium.json +c86f620a6542a52d4d0e91b1a71af60a5ceec6da data/twilightforest/worldgen/configured_feature/troll_roots.json +3b1c713fb30690d8d40998f89fcfd62b8901b8f4 data/twilightforest/worldgen/configured_feature/uberous_soil_patch_big.json +5df1db6438245fa04cbf8947b2fd100073f0a1ac data/twilightforest/worldgen/configured_feature/uberous_soil_patch_small.json +f05fc630c8c2958dadc00c31fcff3aee56411edc data/twilightforest/worldgen/configured_feature/vanilla_roots.json +f37507042a601f66f6b73ce06169e0df36645071 data/twilightforest/worldgen/configured_feature/water_lake.json +cfcc07ca2cf2d775ebaa046157420f5ce69fb63d data/twilightforest/worldgen/configured_feature/webs.json +d130667b32a39bed9ff04a638173a6d1781a8ed1 data/twilightforest/worldgen/configured_feature/well_placer.json +915dea0865bf149f01b849032d25d20ca21e338c data/twilightforest/worldgen/noise_settings/skylight_noise_gen.json +4d5ceb707167c8a152e7586a6aa4a6a95b04e843 data/twilightforest/worldgen/noise_settings/twilight_noise_gen.json +7d478657414f4d60d70c48ab48ad63659d18ddf5 data/twilightforest/worldgen/placed_feature/big_mushgloom.json +22e5bbea5fd183887dd93dad9eacf53f9e6adf7b data/twilightforest/worldgen/placed_feature/canopy_fallen_log.json +075f357345144a68bca33f351e139b2fec89767a data/twilightforest/worldgen/placed_feature/dark_dead_bushes.json +a0297c470c428751126321da21782d9440869eaa data/twilightforest/worldgen/placed_feature/dark_ferns.json +816028d6d53a9154363397b96672453524cad74f data/twilightforest/worldgen/placed_feature/dark_grass.json +951e06a4ba1c605ccd9a44461fed47db4ef3d7a5 data/twilightforest/worldgen/placed_feature/dark_mushglooms.json +9da768445ff7974f540bded6d36c47226e17baa6 data/twilightforest/worldgen/placed_feature/dark_mushrooms.json +6017d7fcf778c31335555cb95b25e6f2cf14a6b0 data/twilightforest/worldgen/placed_feature/dark_pumpkins.json +6ad5586d7cbc5b988d51d71e17ef914d9feca2e8 data/twilightforest/worldgen/placed_feature/default_fallen_logs.json +5807bae6a333eebe89482e123710a95e5705f60d data/twilightforest/worldgen/placed_feature/druid_hut.json +22b5e642a33451118763aef8daad7f8d4d173a63 data/twilightforest/worldgen/placed_feature/fallen_leaves.json +575df3da21e8b7a4fdbd4a1bc6f89495f8447a45 data/twilightforest/worldgen/placed_feature/fiddlehead.json +4450866e7c5041ea9e6fceafb690cb5445f5300b data/twilightforest/worldgen/placed_feature/fire_jet.json +2e8dee94f1abfa5584729a854282ca5df5f2dde3 data/twilightforest/worldgen/placed_feature/flower_placer.json +b32cb2045480bdfd6d302e0b2160daa4f77fd5cd data/twilightforest/worldgen/placed_feature/flower_placer_alt.json +206a32ad5c4337a10a0a3dfd367baede3291960f data/twilightforest/worldgen/placed_feature/foundation.json +797334651c2b54749fa09658ff5249f1093171b9 data/twilightforest/worldgen/placed_feature/graveyard.json +e4f6e206e30cf800274af6d57d22c0aeb40e9c8c data/twilightforest/worldgen/placed_feature/grove_ruins.json +51e8db13514f64e5eeea9a4e4522705b650c0d77 data/twilightforest/worldgen/placed_feature/hollow_log.json +cdc593fcf5f1b2c437851d23aff053429063d358 data/twilightforest/worldgen/placed_feature/hollow_stump.json +3d1411df18edca4c688b5b06a5a6ff1b208ee5c7 data/twilightforest/worldgen/placed_feature/huge_lily_pad.json +f0888058c0f67a20c9649129e5f13df1533d9866 data/twilightforest/worldgen/placed_feature/huge_water_lily.json +922de538899bda56debe108fba72400bda44340b data/twilightforest/worldgen/placed_feature/lamppost_placer.json +3f3574d20b92a5de23c2f38207464cafc8fee119 data/twilightforest/worldgen/placed_feature/lava_lake.json +0ad630f2c02ac7e84a1461cbe7a6223d7936c7d7 data/twilightforest/worldgen/placed_feature/legacy_coal_ore.json +99372df16a29ed11a95b281973d7cf1b55add69d data/twilightforest/worldgen/placed_feature/legacy_copper_ore.json +91757343d3db7ef9ecb792af41d8d040a6095079 data/twilightforest/worldgen/placed_feature/legacy_diamond_ore.json +f534c9bdaad2e3a9872fdc753f1540e9859f9b19 data/twilightforest/worldgen/placed_feature/legacy_gold_ore.json +87a2339249ce09ffc1a4b3d8e0a51e0478f93bc6 data/twilightforest/worldgen/placed_feature/legacy_iron_ore.json +ccb7a40a2de5d7779ff40de94bc7d5d7868a8202 data/twilightforest/worldgen/placed_feature/legacy_lapis_ore.json +fa35a9587e5c1a4c0cae8bb0ad0c7310f7aaf51b data/twilightforest/worldgen/placed_feature/legacy_redstone_ore.json +eb928d8ee73ec116aeeecef976a98f3a491e46c9 data/twilightforest/worldgen/placed_feature/mangrove_fallen_log.json +1c5a172a314ae6d57581414a893f4bf0740be51f data/twilightforest/worldgen/placed_feature/mayapple.json +dd7417d291f3645fd3ece9adf840653ad9a9672d data/twilightforest/worldgen/placed_feature/monolith.json +67010d1e9b838edbf782052801611d247aea1ada data/twilightforest/worldgen/placed_feature/mushgloom_cluster.json +a2129afa5b01d0ef0dbf43ec76729c9f4ec894b3 data/twilightforest/worldgen/placed_feature/mushroom/canopy_mushrooms_dense.json +0af10d1423f1099e071db0f002eb51754a38fe22 data/twilightforest/worldgen/placed_feature/mushroom/canopy_mushrooms_sparse.json +808cc00ee1244323a08f9aa6f40f93e1164b51e2 data/twilightforest/worldgen/placed_feature/mycelium_blob.json +a7ef705bfd8a0ddc0e416b0b982a95287ef8b88b data/twilightforest/worldgen/placed_feature/outside_stalagmite.json +90a0ba62215270a3a31bac35f0183d852fa4b7fb data/twilightforest/worldgen/placed_feature/plant_roots.json +979fb83b7345287a634f48ccab4fa4589b3884c4 data/twilightforest/worldgen/placed_feature/pumpkin_lamppost.json +714679dcb61b587c52e2f18ce622e1cae61eec4f data/twilightforest/worldgen/placed_feature/small_andesite.json +cd7fb39f381c7b9ee5df8a7264ee2ba713b73459 data/twilightforest/worldgen/placed_feature/small_diorite.json +be2a4e58ede93dd07f178136df39ab7950906006 data/twilightforest/worldgen/placed_feature/small_granite.json +38028922ed95c74e215e3d73b03aba6f35d7bcf5 data/twilightforest/worldgen/placed_feature/smoker.json +d0914a5b0f3a2ee56393aee240d07ef50d8cd0c0 data/twilightforest/worldgen/placed_feature/snow_under_trees.json +ebe517f9aa93c9f4afa975cbc0089e268cd5d66f data/twilightforest/worldgen/placed_feature/spruce_fallen_log.json +dbdc5f432f14056363950b5e98e4528640e25f74 data/twilightforest/worldgen/placed_feature/stone_circle.json +b7dbc3d804d397faed24c09d58d197717faa7254 data/twilightforest/worldgen/placed_feature/tf_oak_fallen_log.json +e57ae01bef92f27d38b0b7fd6f7caaf97e06bdc6 data/twilightforest/worldgen/placed_feature/thorns.json +3c6a1404ebd36fa575a625f924ba52d85601b51b data/twilightforest/worldgen/placed_feature/torch_berries.json +9ee69001302bc4031ea29738f56e8726c2bfbdf3 data/twilightforest/worldgen/placed_feature/tree/darkwood_tree.json +f99e77ee1eb5d1915b343cfbf0edbf6383f09296 data/twilightforest/worldgen/placed_feature/tree/dead_canopy_tree.json +b5f923335491b9c4d58f9d7ff44052a3c93b0c6a data/twilightforest/worldgen/placed_feature/tree/forest_canopy_oak_tree.json +7e8482d6503d933f9cab76cc21bba60650b979b1 data/twilightforest/worldgen/placed_feature/tree/hollow_oak.json +7e209388dcd3726138159780e5fbe139c73b6ae2 data/twilightforest/worldgen/placed_feature/tree/large_twilight_oak_tree.json +72d2bcbb5e1b11aee084585aa58fd68909acb1a0 data/twilightforest/worldgen/placed_feature/tree/mangrove_tree.json +eebff675eb0618de5241af85cf37f1de7944a5e2 data/twilightforest/worldgen/placed_feature/tree/savannah_canopy_oak_tree.json +6943943394be9e30047e0cb352a71d5456581e0b data/twilightforest/worldgen/placed_feature/tree/savannah_oak_tree.json +5e55f5ce27bf0aa80fbdb9fced75329738d290c6 data/twilightforest/worldgen/placed_feature/tree/selector/canopy_trees.json +0735e015ea8eadebc9084d6b23316033712f8c87 data/twilightforest/worldgen/placed_feature/tree/selector/dark_forest_trees.json +6d1a24d46a4c0e3edb7f55b06023a752c7375036 data/twilightforest/worldgen/placed_feature/tree/selector/dark_forest_tree_mix.json +d554684ffe79fdd21d51bc88fad3776b88454f22 data/twilightforest/worldgen/placed_feature/tree/selector/dense_canopy_trees.json +626690dcce9607e40b2452c697e05a365b4021a9 data/twilightforest/worldgen/placed_feature/tree/selector/enchanted_forest_trees.json +1ff1485af7b1d7f8e4777feec62bc2073bf7c58f data/twilightforest/worldgen/placed_feature/tree/selector/firefly_forest_trees.json +7699aea2db78e0ea1ddedc1c47895e30b527d934 data/twilightforest/worldgen/placed_feature/tree/selector/highlands_trees.json +a2f02f5eb62878047afba265c39d6827457f9237 data/twilightforest/worldgen/placed_feature/tree/selector/snowy_forest_trees.json +4bacd93efcc977a3c089bec3cc29268f5ec39173 data/twilightforest/worldgen/placed_feature/tree/selector/vanilla_mushrooms.json +337084e4e642d034fabb6e7aa6dc7382856c0c15 data/twilightforest/worldgen/placed_feature/tree/selector/vanilla_trees.json +4d0d9f46439931bd7ad4888c7ed768f8980e3a46 data/twilightforest/worldgen/placed_feature/tree/swampy_oak_tree.json +6943943394be9e30047e0cb352a71d5456581e0b data/twilightforest/worldgen/placed_feature/tree/twilight_oak_tree.json +b0b25f873a811fe10bfb3927a3b28d5aefd6bdc8 data/twilightforest/worldgen/placed_feature/troll_roots.json +8d26fd5e2996a81369053feae59b7fb4fd471173 data/twilightforest/worldgen/placed_feature/vanilla_roots.json +0db450698ceaa57e529678a5ac1ad1e83af8fed4 data/twilightforest/worldgen/placed_feature/water_lake.json +8b40d9464bfda34641b8bc897e0052a8a811297e data/twilightforest/worldgen/placed_feature/webs.json +899c9a4b24433bd5272d5aebe63e2bfc872e7b02 data/twilightforest/worldgen/placed_feature/well_placer.json +91163ff8db0c65dce4ca25aa7d023229ead688cf data/twilightforest/worldgen/placed_feature/wood_roots.json +756820d2ea640f774e8aa3e5469b1bc9d634d1fe data/twilightforest/worldgen/structure/aurora_palace.json +5e0c5d49368f5406ca0748d2cec9b40be69bfc2d data/twilightforest/worldgen/structure/dark_tower.json +11f51b32d4ce16b6108d6934c887904a28d06b19 data/twilightforest/worldgen/structure/final_castle.json +41dbf6dd09385b447c0c217978a7396d2151efc6 data/twilightforest/worldgen/structure/hedge_maze.json +8bbae442168ecc85c35ff7f79d43e71a5607e3f3 data/twilightforest/worldgen/structure/hydra_lair.json +901653bafa23ba1089eaf204f29734d732cc0ce4 data/twilightforest/worldgen/structure/knight_stronghold.json +578ff347af8f12e0218518b0cdc1a0ec1fefc441 data/twilightforest/worldgen/structure/labyrinth.json +8ad25add444cc4fd0b62582a24dfb69a778b9a6a data/twilightforest/worldgen/structure/large_hollow_hill.json +0d270b802d4c36148503abf11e4cac07cfef31e1 data/twilightforest/worldgen/structure/lich_tower.json +1b402aa513f5f94e1bf489191a6be7ed6ebf3dd4 data/twilightforest/worldgen/structure/medium_hollow_hill.json +591e898d4ed086c42fd5e089e8117752336954b1 data/twilightforest/worldgen/structure/mushroom_tower.json +114dea03d678679f96d22714d17f220d8b19ed33 data/twilightforest/worldgen/structure/naga_courtyard.json +05782396c7a100563fbfffa9b2b1e1e86efe14f3 data/twilightforest/worldgen/structure/quest_grove.json +f84aab0bbf042abe9016cdf75bdc10dd3a8e1b51 data/twilightforest/worldgen/structure/small_hollow_hill.json +8eeecf5f47e03391609a77fe585c764e712ea964 data/twilightforest/worldgen/structure/troll_cave.json +79c18a40e02daaeb7a410f3c120301a6f8d01d20 data/twilightforest/worldgen/structure/yeti_cave.json +3a8d8912fe7565251038de2c31158b4c2a2ad207 data/twilightforest/worldgen/structure_set/aurora_palace.json +6943c56fa9dc613ee03a782260740097b816ba58 data/twilightforest/worldgen/structure_set/dark_tower.json +efe4e6fa77fd4240b4312f0d384bd320156a10ae data/twilightforest/worldgen/structure_set/final_castle.json +b16752fb9cb287509f0f19bcaa42dee16880d08c data/twilightforest/worldgen/structure_set/hedge_maze.json +90e07cfad98603513b51f269162db540bc1b9053 data/twilightforest/worldgen/structure_set/hydra_lair.json +38692de7aec84eb70fe390cff940b9dbd79867a6 data/twilightforest/worldgen/structure_set/knight_stronghold.json +6cbdb90bbfd814968c4eb156cae6f8cb7f0ceb4b data/twilightforest/worldgen/structure_set/labyrinth.json +4696804b9ee03fcb942f56dcd7adfb4f37e9752b data/twilightforest/worldgen/structure_set/large_hollow_hill.json +9fee58233c0a0e5b863228014fd6325e6e37c21b data/twilightforest/worldgen/structure_set/lich_tower.json +8dc3183a538a5c4a158f1f812e139b8a22cb6092 data/twilightforest/worldgen/structure_set/medium_hollow_hill.json +0f8ff9ee01e0414f585ce883861efdb6fedbaa07 data/twilightforest/worldgen/structure_set/mushroom_tower.json +e4285635a4b1b4b4beb380d944fbd8153bfc83e6 data/twilightforest/worldgen/structure_set/naga_courtyard.json +6560fedf00c7232aa9274ae5d18594867b69985b data/twilightforest/worldgen/structure_set/quest_grove.json +b8f98563372c9483e25b2c4c911f801bfe305a3a data/twilightforest/worldgen/structure_set/small_hollow_hill.json +868ee19397c6d6daad0b4b9608719d1aff92c5aa data/twilightforest/worldgen/structure_set/troll_cave.json +d51729afe5007f87bbd8fe45099757bf07495322 data/twilightforest/worldgen/structure_set/yeti_cave.json diff --git a/src/generated/resources/.cache/298e498da640689535fee3b440f848a6be1dcd32 b/src/generated/resources/.cache/298e498da640689535fee3b440f848a6be1dcd32 new file mode 100644 index 0000000000..2a1200f7e6 --- /dev/null +++ b/src/generated/resources/.cache/298e498da640689535fee3b440f848a6be1dcd32 @@ -0,0 +1,2 @@ +// 1.19.4 2023-03-15T19:43:56.9161948 Twilight Forest Enchantment Tags +a9644ff8c571a10b9237822daa71c47774b65196 data/twilightforest/tags/enchantment/phantom_armor_banned_enchants.json diff --git a/src/generated/resources/.cache/2c3573acb35dd4967c455c5601717e4d0d6eb706 b/src/generated/resources/.cache/2c3573acb35dd4967c455c5601717e4d0d6eb706 new file mode 100644 index 0000000000..cc66a59142 --- /dev/null +++ b/src/generated/resources/.cache/2c3573acb35dd4967c455c5601717e4d0d6eb706 @@ -0,0 +1,3 @@ +// 1.19.4 2023-03-15T19:43:56.9142003 atlases generator for twilightforest +aebef09d33f3500705949d8b6494d661eb6c306d assets/minecraft/atlases/chests.json +91ec0b65040a29530fb79145fa81b3636a3885b1 assets/minecraft/atlases/shield_patterns.json diff --git a/src/generated/resources/.cache/360062c0ee43360357329c0a13031adc0cc83ac5 b/src/generated/resources/.cache/360062c0ee43360357329c0a13031adc0cc83ac5 new file mode 100644 index 0000000000..1ef71177fe --- /dev/null +++ b/src/generated/resources/.cache/360062c0ee43360357329c0a13031adc0cc83ac5 @@ -0,0 +1,7 @@ +// 1.19.4 2023-03-15T19:43:56.8751238 Twilight Forest Wood Palette Tags +265731121ea72d3fb96f83b5f3d69695ff1d6d80 data/twilightforest/tags/twilight/wood_palettes/common.json +b10e3c1ec45b721b1dee81e0d5c0ad9d72a95eb9 data/twilightforest/tags/twilight/wood_palettes/druid_hut_swizzle_mask.json +b2b124b96881ce4886e055e8ee4089362f98e845 data/twilightforest/tags/twilight/wood_palettes/rare.json +1a4da23eca76fbea0f617b87e0005b98dfc57f85 data/twilightforest/tags/twilight/wood_palettes/treasure.json +106d8bd858b683432b07ff45a62c5f5651a1ba67 data/twilightforest/tags/twilight/wood_palettes/uncommon.json +1e4fe824eee9b2cde9a98423265a11e9f80eb4eb data/twilightforest/tags/twilight/wood_palettes/well_swizzle_mask.json diff --git a/src/generated/resources/.cache/3d86f3ff506a078da83531ccaa5e7b1bc7d60e10 b/src/generated/resources/.cache/3d86f3ff506a078da83531ccaa5e7b1bc7d60e10 new file mode 100644 index 0000000000..f134efb5db --- /dev/null +++ b/src/generated/resources/.cache/3d86f3ff506a078da83531ccaa5e7b1bc7d60e10 @@ -0,0 +1,4 @@ +// 1.19.4 2023-03-15T19:43:56.8952506 Global Loot Modifiers : twilightforest +d18971f5e2ac4ddbfba3cc790e9817c20548a830 data/forge/loot_modifiers/global_loot_modifiers.json +8fbe9976345cfe808e7a57b9690d227491492fb9 data/twilightforest/loot_modifiers/fiery_pick_smelting.json +6a6f96f0eaf4b3186c3aff3257e132d33f78e7c5 data/twilightforest/loot_modifiers/giant_pick_grouping.json diff --git a/src/generated/resources/.cache/409f85cf7196fa8ba3cc1f155fe7b234c26d36b1 b/src/generated/resources/.cache/409f85cf7196fa8ba3cc1f155fe7b234c26d36b1 new file mode 100644 index 0000000000..f256a79a84 --- /dev/null +++ b/src/generated/resources/.cache/409f85cf7196fa8ba3cc1f155fe7b234c26d36b1 @@ -0,0 +1,2136 @@ +// 1.19.4 2023-06-01T16:03:33.694676 TwilightForest blockstates and block models +cab88029518a1647ec691d136328ed93c18108be assets/twilightforest/blockstates/acacia_banister.json +9472090eea384d675fee73a90ed033b799c88820 assets/twilightforest/blockstates/alpha_yeti_boss_spawner.json +94ee00eebd82061338b6db439a84b3fdf98f3942 assets/twilightforest/blockstates/alpha_yeti_trophy.json +94ee00eebd82061338b6db439a84b3fdf98f3942 assets/twilightforest/blockstates/alpha_yeti_wall_trophy.json +796cb2fedc6bde053e988892110dbd38578f4424 assets/twilightforest/blockstates/antibuilder.json +a753d663958c27ad77bd65d8d9ee637ae7cd5a9d assets/twilightforest/blockstates/antibuilt_block.json +ff6dd086fab0453865f6439c576c9120934ae968 assets/twilightforest/blockstates/arctic_fur_block.json +3efb63228a1e1615c510925b08cd24409f96aa96 assets/twilightforest/blockstates/aurora_block.json +06b8d2c19720a41c08406f14c410780ca4f2f3ac assets/twilightforest/blockstates/aurora_pillar.json +87eabe763bbf2fb2afb0a556edea7e64da27211d assets/twilightforest/blockstates/aurora_slab.json +feda195e2826ec1334fe59dc0d98cb9519743ff4 assets/twilightforest/blockstates/auroralized_glass.json +62b18edaef9c27bb158830e8d1bb5e82cf3a73c2 assets/twilightforest/blockstates/beanstalk_grower.json +940f572934991a27db924a6e11011dc73e7e15f0 assets/twilightforest/blockstates/beanstalk_leaves.json +e838db0c73c9fa7627c6642f000bd7ce991c0262 assets/twilightforest/blockstates/birch_banister.json +9ac1f8c051497262022862ac606f58d4768b4d76 assets/twilightforest/blockstates/blue_castle_door.json +f201be47403de47f7a64166b6ea0e3b06d1e1a76 assets/twilightforest/blockstates/blue_castle_rune_brick.json +d3fa861d067698f9e1515fe5ae5b096ed787ef13 assets/twilightforest/blockstates/blue_force_field.json +fc2af014bb0a155dd031a2f7d7feabd828e2496e assets/twilightforest/blockstates/bold_castle_brick_pillar.json +68d0ce7846c12684030a1ceb57deed7e49bb1dde assets/twilightforest/blockstates/bold_castle_brick_stairs.json +837b9e4864b610470f48d1f10a153b9534255d5c assets/twilightforest/blockstates/bold_castle_brick_tile.json +0fe35f334a5cf6d5868913b14ce8c0ea7badb41b assets/twilightforest/blockstates/bold_stone_pillar.json +d1f47e6423d3490cb04fef798dfb72f61997c7e5 assets/twilightforest/blockstates/brown_thorns.json +d81e7dded354de592cc34fae65a72b922f5bc2c4 assets/twilightforest/blockstates/built_block.json +98003b0339eeb7884faef4af4aaa0a6bf93c847c assets/twilightforest/blockstates/burnt_thorns.json +2bc123687d56ee8a7dab7c201663207fb558f462 assets/twilightforest/blockstates/candelabra.json +8df6a66df9637da292a736fd1059cc5c51471d67 assets/twilightforest/blockstates/canopy_banister.json +d4e3f36f0d159cfcec0afb2fb114db9a7ef80686 assets/twilightforest/blockstates/canopy_bookshelf.json +b2694ce204bf2b6103dfcd8b4983994082f5c025 assets/twilightforest/blockstates/canopy_button.json +271b699dd7bb20042c5b6697577b7aa08fbe4f59 assets/twilightforest/blockstates/canopy_chest.json +276d3874d5dd158aed8cd1d71b7712369eb9156c assets/twilightforest/blockstates/canopy_door.json +e6a4a8050e0341b54c86df33f0a0311f0dbd563b assets/twilightforest/blockstates/canopy_fence.json +87391a830cff8751fceb86e5b93cd006429d1688 assets/twilightforest/blockstates/canopy_fence_gate.json +5c3ac66aa7178f1c71f45dad25ce2468f2c284cd assets/twilightforest/blockstates/canopy_leaves.json +663fc7f81744291d8a825eeaaf88cf69d3fe9b94 assets/twilightforest/blockstates/canopy_log.json +112f348e3c6fa3e15060b0d163f78f2ac625d874 assets/twilightforest/blockstates/canopy_planks.json +3d492a4b8da4ba23f431b0751ffeafb7b53a7e33 assets/twilightforest/blockstates/canopy_pressure_plate.json +8dc47e00b9de9de49abd33922ab6e9c44f6d7eeb assets/twilightforest/blockstates/canopy_sapling.json +c28c9f22556cb3259944bde2c8e4ebdd7a89c3cb assets/twilightforest/blockstates/canopy_sign.json +839866e4647b9a0f53e65d124330cb69dadb9139 assets/twilightforest/blockstates/canopy_slab.json +08c53a8b9b5d8390cf306cdfb012dd4f2e1aea34 assets/twilightforest/blockstates/canopy_stairs.json +37b2d96626d2157b8ca9a55f9b37e2ba1adccba7 assets/twilightforest/blockstates/canopy_trapdoor.json +1a327000cdcc3b1be6e2d69a1df643f364f38932 assets/twilightforest/blockstates/canopy_wall_sign.json +a5bdfb80023a727c2b559e59fa7edc8f02f95251 assets/twilightforest/blockstates/canopy_wood.json +43e8f1148c92c8cce0544ae2f2eb66e59997ca4b assets/twilightforest/blockstates/carminite_block.json +3e8aa65013169c591488e487c204d5e702b3cd23 assets/twilightforest/blockstates/carminite_builder.json +f7ceb8ca7942f860467ab92f36d6a75665cc9eba assets/twilightforest/blockstates/carminite_reactor.json +de808df0569c78201d6ec7eb44a4953441899df9 assets/twilightforest/blockstates/castle_brick.json +f87a49cc67a1672b99cc9563bba0e8eafeb59bc8 assets/twilightforest/blockstates/castle_brick_stairs.json +4403f8fe6b9faf6c847f789e279e54c686e6ef2c assets/twilightforest/blockstates/castle_roof_tile.json +9df0d529e8bf974cf0c2be29316e9b9f1ef73078 assets/twilightforest/blockstates/cicada.json +82eb5f1536762fe91623ce537800ef4ded1ac9fc assets/twilightforest/blockstates/cicada_jar.json +c66c2ac72611834c17d466d53772f4b0d0831694 assets/twilightforest/blockstates/cinder_furnace.json +b53fdca651c846d8d8f51d96c1a6bc3e4584fc10 assets/twilightforest/blockstates/cinder_log.json +76e0e3573a31ad61f798e9e7a0f45f62cb8765fc assets/twilightforest/blockstates/cinder_wood.json +4c8950c67ab660a2167f204644fdfe06cd13a60f assets/twilightforest/blockstates/clover_patch.json +1261f404df8aec15a7b62454520e8ea2d4dbc5a4 assets/twilightforest/blockstates/cracked_castle_brick.json +dc4512103691a8ac228661ef68450d30080640b5 assets/twilightforest/blockstates/cracked_castle_brick_stairs.json +6ac49c745e027b94c77c368c0eb48f51bd47ed0e assets/twilightforest/blockstates/cracked_deadrock.json +74a9e24cc6ce17f3e6d57b74f3d87f17b8faed5f assets/twilightforest/blockstates/cracked_etched_nagastone.json +c7b654982c79efaa261d471cb7b2c8e65c84fa19 assets/twilightforest/blockstates/cracked_mazestone.json +d7c535b60b16f1cbc0547882c492c6837833a552 assets/twilightforest/blockstates/cracked_nagastone_pillar.json +5a75b9d71094bfc209d274e616dbc7270ec4fd06 assets/twilightforest/blockstates/cracked_nagastone_stairs_left.json +f07b6e1a2cf20d7f3129bc7d685740ad5b375ec7 assets/twilightforest/blockstates/cracked_nagastone_stairs_right.json +1432c2f7548cb385230230491386f610e506053e assets/twilightforest/blockstates/cracked_towerwood.json +b66481a27d37b515e3f11b9769d77ab1be6adfb9 assets/twilightforest/blockstates/cracked_underbrick.json +94ee00eebd82061338b6db439a84b3fdf98f3942 assets/twilightforest/blockstates/creeper_skull_candle.json +94ee00eebd82061338b6db439a84b3fdf98f3942 assets/twilightforest/blockstates/creeper_wall_skull_candle.json +6f3813d2be5875746912e49293aed0a7b76403b0 assets/twilightforest/blockstates/crimson_banister.json +fadcab0f3a09e77d5520204bb9e4d712223a2483 assets/twilightforest/blockstates/cut_mazestone.json +6c2e4f65f2ac6cac95c9f4d26e3befd8863048c3 assets/twilightforest/blockstates/dark_banister.json +136fdf55d525160d3321baed5b89fa9aac036a9c assets/twilightforest/blockstates/dark_button.json +489c9e459f7445709058b454c656cdb40d23cdd3 assets/twilightforest/blockstates/dark_chest.json +800dbc531e17a053db128b2f0dd246040a37e5c0 assets/twilightforest/blockstates/dark_door.json +139ba0d08314e71682b8af4ad596eab96d713be5 assets/twilightforest/blockstates/dark_fence.json +87b5c79dd2334c0fd8dfeeedf6e09bbb91a84102 assets/twilightforest/blockstates/dark_fence_gate.json +954873e8db30c8eecf7140bfcf46acfd6666af42 assets/twilightforest/blockstates/dark_leaves.json +bcddfae2c58fe848d5f8af9f9d8f4b1d2d1483f2 assets/twilightforest/blockstates/dark_log.json +452891074508203c1b117345de798a2d081819f1 assets/twilightforest/blockstates/dark_oak_banister.json +cfca788be040e98ac6f448b6eb13d1d41e0fc987 assets/twilightforest/blockstates/dark_planks.json +d1062787aebb9bf00189397036dbb9c1571f5f95 assets/twilightforest/blockstates/dark_pressure_plate.json +314629e5a14e560428bb7ddcc7165beffd328a38 assets/twilightforest/blockstates/dark_sign.json +4ad895a4681b2330ed8a1398b81ee4d73ec63d94 assets/twilightforest/blockstates/dark_slab.json +223819daeda7c5131c7356647940b3d92df8cfd2 assets/twilightforest/blockstates/dark_stairs.json +c135c60cdc09b4e3ad2388d1bd3b85a191bb26f0 assets/twilightforest/blockstates/dark_trapdoor.json +4e2a0f36ccf630b4d1d7bef04e75d2136fea330a assets/twilightforest/blockstates/dark_wall_sign.json +8368e552fa0cccf2999999ff7f9861279c62ec94 assets/twilightforest/blockstates/dark_wood.json +c7f4457071e1303e387e16add1157d6b3d517ce0 assets/twilightforest/blockstates/darkwood_sapling.json +b1b2a5f4296eb9a42484d43f47c29ec576b36114 assets/twilightforest/blockstates/deadrock.json +dd134486bc2b8d753c95b3bfcfb6583d53a15e35 assets/twilightforest/blockstates/death_tome_spawner.json +48f4f43849807c8cd88dc198d2710f307ec4fe67 assets/twilightforest/blockstates/decorative_mazestone.json +0cb4e0632ee7695b5c6a9fc46eece438b8f21931 assets/twilightforest/blockstates/empty_canopy_bookshelf.json +0123daa7589bd70318c6e1a207e435e4941efa0b assets/twilightforest/blockstates/encased_castle_brick_pillar.json +455f4cd0de318615434e4fd2e37b10f5243bee08 assets/twilightforest/blockstates/encased_castle_brick_stairs.json +dca7d6a52b2975ff8a5e4b71a18eef1798b1df39 assets/twilightforest/blockstates/encased_castle_brick_tile.json +fdbaed4b18eff75c1202f25441f63a6d1c18b63a assets/twilightforest/blockstates/encased_fire_jet.json +ab56c83f300bcad4fbc9ace1a5d4cf78bd2dd209 assets/twilightforest/blockstates/encased_smoker.json +fc8fdb02e43ee80244c214eeb0abea182f241872 assets/twilightforest/blockstates/encased_towerwood.json +3a1b46864030237dd4204488da9ce9c9dce1095f assets/twilightforest/blockstates/etched_nagastone.json +f74ec303f5017e023bad73d77d08b9145e3e628b assets/twilightforest/blockstates/experiment_115.json +bb0ee23fb9067621d86f7ade278936bf644e9205 assets/twilightforest/blockstates/fake_diamond.json +bd1b05dc2697d7e22183d7cc0d97328088d2875c assets/twilightforest/blockstates/fake_gold.json +c95b39b44a263d1b9fbf2e8003fb9fb2e1c182b3 assets/twilightforest/blockstates/fallen_leaves.json +5699fd02c0bac05f385327be39b3b8cd57856102 assets/twilightforest/blockstates/fiddlehead.json +aebd9c98b88f749e2b6c788586ee740f02b7c1d4 assets/twilightforest/blockstates/fiery_block.json +9472090eea384d675fee73a90ed033b799c88820 assets/twilightforest/blockstates/final_boss_boss_spawner.json +9d995780fe11d909fa60f65680f35bceb2b8e3b4 assets/twilightforest/blockstates/fire_jet.json +617d9d28462853c9fdb919dbb61aa229e54fcf8d assets/twilightforest/blockstates/firefly.json +954de17135358e17a662439a6a99b77ca2935abd assets/twilightforest/blockstates/firefly_jar.json +000396eb68815ecbc4d78f7b00984caaee57d88c assets/twilightforest/blockstates/firefly_particle_spawner.json +7a4d39a5a194e475e4eb6305954ec2bfd2468aba assets/twilightforest/blockstates/fluffy_cloud.json +dcd1310ef232e7152a9257192391d60b7dddb5b0 assets/twilightforest/blockstates/ghast_trap.json +b3e26b3f33dfa534b0a5f46c8a7489deaf356594 assets/twilightforest/blockstates/giant_cobblestone.json +2fefb3bee6d877247713b1d205296b206c070e4b assets/twilightforest/blockstates/giant_leaves.json +f722bd4d4a054fcdd352f9db8d286198c8ffe13c assets/twilightforest/blockstates/giant_log.json +db9c74d13678fb4c7cf4b30b375164049f736a25 assets/twilightforest/blockstates/giant_obsidian.json +fe3da8d226a5935d165fbbb92c372498df11fcd3 assets/twilightforest/blockstates/green_force_field.json +b260c24871dfaa45243be1ae5852e6d88d937c48 assets/twilightforest/blockstates/green_thorns.json +741e7315c398c5bc49cde650c604a55849564960 assets/twilightforest/blockstates/hardened_dark_leaves.json +a31529013c346ad627e4f5c426f1252fa73e760c assets/twilightforest/blockstates/hedge.json +cc6b5b927aeee762ea2a0ec8274896d3570c1ee8 assets/twilightforest/blockstates/hollow_acacia_log_climbable.json +87c4ac11f3c7908fc49d795977dd2986038e916c assets/twilightforest/blockstates/hollow_acacia_log_horizontal.json +b30b7535e761c740b8a25f669600faf63639459c assets/twilightforest/blockstates/hollow_acacia_log_vertical.json +1e90e0b0c1909da9fca21c157b8542dd410b8926 assets/twilightforest/blockstates/hollow_birch_log_climbable.json +891a5bd96e388ef038e8d42f83e52367b52150e6 assets/twilightforest/blockstates/hollow_birch_log_horizontal.json +56842319ca48545deeb6a3a0221ef08cf7af6354 assets/twilightforest/blockstates/hollow_birch_log_vertical.json +d965c2d08243f741074310de88a4324d7bbe2d1e assets/twilightforest/blockstates/hollow_canopy_log_climbable.json +1efa0a840204cd1e1a7be0b633029a234c90795c assets/twilightforest/blockstates/hollow_canopy_log_horizontal.json +1ebcd3978e315c1b2df535675b60da526ffdc5e3 assets/twilightforest/blockstates/hollow_canopy_log_vertical.json +9fb17ade48d4396c34b48b285dab078e249f971b assets/twilightforest/blockstates/hollow_crimson_stem_climbable.json +0fa539b376d985c910b4cfdaef397567e35948fb assets/twilightforest/blockstates/hollow_crimson_stem_horizontal.json +77effb33c81b956440485cc61192132c2b545848 assets/twilightforest/blockstates/hollow_crimson_stem_vertical.json +d7fffa93e41a4a0c110b58babd63adf747d9502b assets/twilightforest/blockstates/hollow_dark_log_climbable.json +1321638995eb95d3eb8dc93170e86569308c5e13 assets/twilightforest/blockstates/hollow_dark_log_horizontal.json +66ad48c5f61cc50988024b48233bbd2eb8609bdd assets/twilightforest/blockstates/hollow_dark_log_vertical.json +31557d4ad296a118129d0b9b8563be113acc9f59 assets/twilightforest/blockstates/hollow_dark_oak_log_climbable.json +33a890c17dedd82b4ca15bcebd69d41e286af7cd assets/twilightforest/blockstates/hollow_dark_oak_log_horizontal.json +d009a9773afcbea55f0595aeed99f532675f60a3 assets/twilightforest/blockstates/hollow_dark_oak_log_vertical.json +b2ec73a47ff90c846050c2db2a1e1278d0de526b assets/twilightforest/blockstates/hollow_jungle_log_climbable.json +7c8bca4d19e8dff002f2d9193828ce345c991039 assets/twilightforest/blockstates/hollow_jungle_log_horizontal.json +ba95e37843e6c08d8b2a27333ae7eff081a38ebf assets/twilightforest/blockstates/hollow_jungle_log_vertical.json +72ce314659f323603c3221be26ebb49845c84d5d assets/twilightforest/blockstates/hollow_mangrove_log_climbable.json +e97a1131375194e4c861a20a1799662bcc260981 assets/twilightforest/blockstates/hollow_mangrove_log_horizontal.json +75934b3b99701fbafbd1a693cbdf1b700c3aef69 assets/twilightforest/blockstates/hollow_mangrove_log_vertical.json +d8ff00c129dc468b379c8ad74f876a8691805204 assets/twilightforest/blockstates/hollow_mining_log_climbable.json +4931f402f57c08c3e23880d465eecc91e5e82494 assets/twilightforest/blockstates/hollow_mining_log_horizontal.json +248100167ce25bba1abaaa2693d8187632509bc8 assets/twilightforest/blockstates/hollow_mining_log_vertical.json +ecaad58d91f92ba9c0cc899f7620d0ed9c458c54 assets/twilightforest/blockstates/hollow_oak_log_climbable.json +488dc87576a7263265678cd717c374b4481e0652 assets/twilightforest/blockstates/hollow_oak_log_horizontal.json +3f725c98100dd0c3153edc12ca1ff33fab52e14c assets/twilightforest/blockstates/hollow_oak_log_vertical.json +960674df0714488bc0ec2d8dedc2fab14f9630bd assets/twilightforest/blockstates/hollow_oak_sapling.json +375e6fd629387a994aad28ad2e67674a011d88af assets/twilightforest/blockstates/hollow_sorting_log_climbable.json +137f668c575c3fb012a1d927811c8bea0de9c7a3 assets/twilightforest/blockstates/hollow_sorting_log_horizontal.json +7abcc706c63c261c517a92dd99543215abbfa408 assets/twilightforest/blockstates/hollow_sorting_log_vertical.json +ef49d47243fbae63cafa097d2cb17604c829ba5a assets/twilightforest/blockstates/hollow_spruce_log_climbable.json +01279407cb71ab6c161d3a372fdbd245056b9b63 assets/twilightforest/blockstates/hollow_spruce_log_horizontal.json +7b8ed220e2ec4126b1484b85b3512be989e875bf assets/twilightforest/blockstates/hollow_spruce_log_vertical.json +61ea093b00dbdb37ba172f1779232f9929d64242 assets/twilightforest/blockstates/hollow_time_log_climbable.json +0b53b9e0d3b0b220226eee5743619f7cf42b81b7 assets/twilightforest/blockstates/hollow_time_log_horizontal.json +d9c78d998ddea04e828eeaed2e08e2f2a95e1940 assets/twilightforest/blockstates/hollow_time_log_vertical.json +c0cef5b6a87758ee68e86f8b5f36bdbff616f362 assets/twilightforest/blockstates/hollow_transformation_log_climbable.json +cbb476d06836ccda92375969e5c829b065d4cc59 assets/twilightforest/blockstates/hollow_transformation_log_horizontal.json +42823bb166b9d6d27a24697a2667beba4132d9d3 assets/twilightforest/blockstates/hollow_transformation_log_vertical.json +4b2c66a902e89e751d75265de59fb7557247a08b assets/twilightforest/blockstates/hollow_twilight_oak_log_climbable.json +75565442811857b39299079d162a06d54fe23486 assets/twilightforest/blockstates/hollow_twilight_oak_log_horizontal.json +791f494f0eaaceda560aa7dbf32a8f017cea55d4 assets/twilightforest/blockstates/hollow_twilight_oak_log_vertical.json +b163fbf3c14e85a6156cc4e86fb949516d18b29e assets/twilightforest/blockstates/hollow_vangrove_log_climbable.json +fccf2891e2e4aeda059b00601a5c60debecef9fc assets/twilightforest/blockstates/hollow_vangrove_log_horizontal.json +b7b2b50746698047fe37eaf2d543dcb0d8c48119 assets/twilightforest/blockstates/hollow_vangrove_log_vertical.json +a63727ab76b6b154ab0455fee533c0abe8683063 assets/twilightforest/blockstates/hollow_warped_stem_climbable.json +585f6f68d766454df8248c17b79f7ac9619edc47 assets/twilightforest/blockstates/hollow_warped_stem_horizontal.json +44ee2a08914b00bf15e2dc9a2e6b6b41c18bdd60 assets/twilightforest/blockstates/hollow_warped_stem_vertical.json +795f8b53df444af9b7563245948e4f7248a97053 assets/twilightforest/blockstates/huge_lily_pad.json +e86bea94f77572b15fff713be3a8d75ace74e4b2 assets/twilightforest/blockstates/huge_mushgloom.json +2d2854ffeda22c72ea65b44c75ab29310acf618c assets/twilightforest/blockstates/huge_mushgloom_stem.json +1eaf97f77df1cc93147aaeb75a4436c65d5367e5 assets/twilightforest/blockstates/huge_stalk.json +13485076cdedb902f476f36f43e8e0c6cbafcce6 assets/twilightforest/blockstates/huge_water_lily.json +9472090eea384d675fee73a90ed033b799c88820 assets/twilightforest/blockstates/hydra_boss_spawner.json +94ee00eebd82061338b6db439a84b3fdf98f3942 assets/twilightforest/blockstates/hydra_trophy.json +94ee00eebd82061338b6db439a84b3fdf98f3942 assets/twilightforest/blockstates/hydra_wall_trophy.json +3928ab358eefd11e2ca1dc0a567ed34f3c245189 assets/twilightforest/blockstates/infested_towerwood.json +6d7d9b397edc853645164973510c6edad556522b assets/twilightforest/blockstates/iron_ladder.json +f5bae7e6a0b5720e53a4e9cdc3edb4b817aaf0a9 assets/twilightforest/blockstates/ironwood_block.json +a25ce2e10d4d9eaf78d2dcdb31a552597e417bf4 assets/twilightforest/blockstates/jungle_banister.json +d76bac84e471c8e5afc6b73dcf1f6f2111c0cd8b assets/twilightforest/blockstates/keepsake_casket.json +9472090eea384d675fee73a90ed033b799c88820 assets/twilightforest/blockstates/knight_phantom_boss_spawner.json +94ee00eebd82061338b6db439a84b3fdf98f3942 assets/twilightforest/blockstates/knight_phantom_trophy.json +94ee00eebd82061338b6db439a84b3fdf98f3942 assets/twilightforest/blockstates/knight_phantom_wall_trophy.json +87244121c350012e8ef686a9ec633119668b78d2 assets/twilightforest/blockstates/knightmetal_block.json +9472090eea384d675fee73a90ed033b799c88820 assets/twilightforest/blockstates/lich_boss_spawner.json +40393f1b2a342a6311d8d70b2246e4ae7730c2b3 assets/twilightforest/blockstates/lich_tower_miniature_structure.json +94ee00eebd82061338b6db439a84b3fdf98f3942 assets/twilightforest/blockstates/lich_trophy.json +94ee00eebd82061338b6db439a84b3fdf98f3942 assets/twilightforest/blockstates/lich_wall_trophy.json +ad692089c598a53aba9baba70751d15bc9be2c47 assets/twilightforest/blockstates/liveroot_block.json +c18a5b568442906d91f0bb22311ee9d77cb993a8 assets/twilightforest/blockstates/locked_vanishing_block.json +4e45e7002366430de5335854248aed7a9710dbee assets/twilightforest/blockstates/mangrove_banister.json +c0fde274c606dc4e1940842b452928995eb8aae1 assets/twilightforest/blockstates/mangrove_button.json +cbd68284ccf7c5f2860f0c5823a05c3f6deff522 assets/twilightforest/blockstates/mangrove_chest.json +7990c3c0392d3f714570b353d833457eee6039dc assets/twilightforest/blockstates/mangrove_door.json +cb45bb0000f8cd65e40cc703119c55357df50711 assets/twilightforest/blockstates/mangrove_fence.json +8388d546839247e738b995aacf2d36210b180612 assets/twilightforest/blockstates/mangrove_fence_gate.json +795edac2ca029445525ea20362df3223a128b4ba assets/twilightforest/blockstates/mangrove_leaves.json +e6696e44d816afa56d2fb91e47e85e18dbee164c assets/twilightforest/blockstates/mangrove_log.json +115e51fab71221f698e194bb70d8d2684b3a38bf assets/twilightforest/blockstates/mangrove_planks.json +1b06abdc4db417219b0207015914a4ce4fbc0828 assets/twilightforest/blockstates/mangrove_pressure_plate.json +c4498698b5513a3c5132dd7e561959a202e48578 assets/twilightforest/blockstates/mangrove_root.json +9abde1b7491a85eca8c85f32fd936d844e6aa0bc assets/twilightforest/blockstates/mangrove_sapling.json +83bb8a063a4c92a453823c8967471880ebc488a3 assets/twilightforest/blockstates/mangrove_sign.json +13aeffad8dbd1c8fc494f7b592966a927511040b assets/twilightforest/blockstates/mangrove_slab.json +eb8f3f8a81cbd29a1c8328ca141355a29f598202 assets/twilightforest/blockstates/mangrove_stairs.json +c8fa9439161f764ba0f203b73c6fae30d038e393 assets/twilightforest/blockstates/mangrove_trapdoor.json +8dabdd6f8afa22b4b82f1bfe32b2a7ba8702cb5e assets/twilightforest/blockstates/mangrove_wall_sign.json +cdacf3259c2a4cb180b307601d0b402869849a3f assets/twilightforest/blockstates/mangrove_wood.json +471b7e8d1fda6e73a957cf375b3ff4b4a74446a7 assets/twilightforest/blockstates/mayapple.json +b2d13c3f0b48b32cd22b298869622e5576c3e146 assets/twilightforest/blockstates/mazestone.json +437f589b25154f38ea5d5181d49e838c1f1524ba assets/twilightforest/blockstates/mazestone_border.json +d2528a33d68497718881b0961720e2eb66e8dc0c assets/twilightforest/blockstates/mazestone_brick.json +5b36ba1064db9f2984e50e6bbe7e9fa5dd235abf assets/twilightforest/blockstates/mazestone_mosaic.json +606f96394916ab8c83866ce4255dbd3682c6879a assets/twilightforest/blockstates/mining_banister.json +dd4b0220d8ba90a3ceee245449a8110dafd6b45c assets/twilightforest/blockstates/mining_button.json +79dc4cb9c0a97d1cc0a6f98e4466ff820cff4bff assets/twilightforest/blockstates/mining_chest.json +25867cf26b416cd2e264f1e82ef227d314d540a0 assets/twilightforest/blockstates/mining_door.json +51649ca34a2f78030721fc4b89c078f869e5a56e assets/twilightforest/blockstates/mining_fence.json +7488a7833bd354e7729121f4cc05d128cb8f731a assets/twilightforest/blockstates/mining_fence_gate.json +d5160517781c85fb75caf34dcc287671ca5e3186 assets/twilightforest/blockstates/mining_leaves.json +b858278ed0f8dd84ed781f8b25cec73288cc5af8 assets/twilightforest/blockstates/mining_log.json +bea36f99feac6d8ae0eb701992364bef5184afa4 assets/twilightforest/blockstates/mining_log_core.json +261a3006d818ae490631587c0881a4b7f5a57ec4 assets/twilightforest/blockstates/mining_planks.json +3fdfc5ed9fe5779dee22362b0815b69c97edb353 assets/twilightforest/blockstates/mining_pressure_plate.json +e136e20a505445ebdc740bb2e09b289a20015b90 assets/twilightforest/blockstates/mining_sapling.json +0feae66c44bcce8936ffe95299051aabde3e3f84 assets/twilightforest/blockstates/mining_sign.json +c09e7395e9e1a11d2244aa706f0ccab22d6035df assets/twilightforest/blockstates/mining_slab.json +3759045b7515be1059ab400f41c93b2c8b69a19d assets/twilightforest/blockstates/mining_stairs.json +a281ff239be936a756310ef9381bfb2d43d4cf05 assets/twilightforest/blockstates/mining_trapdoor.json +d0ea57e4cdbde330002525d12d9f02697ffc5bab assets/twilightforest/blockstates/mining_wall_sign.json +0b56d5411e070b03e41943c41e30abd80dc75bdd assets/twilightforest/blockstates/mining_wood.json +9472090eea384d675fee73a90ed033b799c88820 assets/twilightforest/blockstates/minoshroom_boss_spawner.json +94ee00eebd82061338b6db439a84b3fdf98f3942 assets/twilightforest/blockstates/minoshroom_trophy.json +94ee00eebd82061338b6db439a84b3fdf98f3942 assets/twilightforest/blockstates/minoshroom_wall_trophy.json +c218fa2e96dbd844bbb981ff3143fb2e6315fc25 assets/twilightforest/blockstates/moonworm.json +740668d5508541d13a02505eee1bbc6af177f583 assets/twilightforest/blockstates/moss_patch.json +1e7e1bbc92655d82be2ac43cbdf6eff906ab4115 assets/twilightforest/blockstates/mossy_castle_brick.json +da4dc4c742e22985ae90252743e657d9e2890cea assets/twilightforest/blockstates/mossy_castle_brick_stairs.json +b8ceffb95b20c515c26f42aff3a33a2758e2cd4b assets/twilightforest/blockstates/mossy_etched_nagastone.json +427a9bcfd3bf2391ce8fc4c5f7388531c00d344f assets/twilightforest/blockstates/mossy_mazestone.json +b2bdc85ace931c6ada18ef5822fd29f1daef0621 assets/twilightforest/blockstates/mossy_nagastone_pillar.json +bfe6854ab148f7ad06895f223c424450657d45e4 assets/twilightforest/blockstates/mossy_nagastone_stairs_left.json +6405b78fef75615ece53882c1ccd403cb6d91767 assets/twilightforest/blockstates/mossy_nagastone_stairs_right.json +a9869cdf4ff867b8c21473686c7def05a6bb2e24 assets/twilightforest/blockstates/mossy_towerwood.json +388e7a0b9fa87f42146d20f3688595f856eb50e2 assets/twilightforest/blockstates/mossy_underbrick.json +f06dac21e55066a5a2da510d51d778ef1be85f67 assets/twilightforest/blockstates/mushgloom.json +9472090eea384d675fee73a90ed033b799c88820 assets/twilightforest/blockstates/naga_boss_spawner.json +4478cb6ab3ddce6d4feb149cd9b74f4344f3d02e assets/twilightforest/blockstates/naga_courtyard_miniature_structure.json +94ee00eebd82061338b6db439a84b3fdf98f3942 assets/twilightforest/blockstates/naga_trophy.json +94ee00eebd82061338b6db439a84b3fdf98f3942 assets/twilightforest/blockstates/naga_wall_trophy.json +98bdda5c9940c6ed32d9b2ff0ad922e449803f73 assets/twilightforest/blockstates/nagastone.json +141ddaf8998fddb263fb97d87cefc45572d69ee6 assets/twilightforest/blockstates/nagastone_head.json +2318fa0e638d35481c77bc508ae735d667da9a01 assets/twilightforest/blockstates/nagastone_pillar.json +acf0bf93d2640f47c26d2ad865e98066ead94436 assets/twilightforest/blockstates/nagastone_stairs_left.json +c4d220562461456a603b55cdef6d4f2c74807607 assets/twilightforest/blockstates/nagastone_stairs_right.json +4d9142feaee02216e196004df83e65262a43db4c assets/twilightforest/blockstates/oak_banister.json +b04b08ff47a0996f15e1d9742f66cce9f1c66d70 assets/twilightforest/blockstates/orange_force_field.json +aae0fa894a10a8eb87fc3ecd0adbe8aa9e7dd65a assets/twilightforest/blockstates/pink_castle_door.json +f201be47403de47f7a64166b6ea0e3b06d1e1a76 assets/twilightforest/blockstates/pink_castle_rune_brick.json +b321ed0a5617871088c1277f516a6838336c2df8 assets/twilightforest/blockstates/pink_force_field.json +94ee00eebd82061338b6db439a84b3fdf98f3942 assets/twilightforest/blockstates/player_skull_candle.json +94ee00eebd82061338b6db439a84b3fdf98f3942 assets/twilightforest/blockstates/player_wall_skull_candle.json +6d1355138bc99dc102517dd779b0a69cae69eb79 assets/twilightforest/blockstates/potted_canopy_sapling.json +165a66c5cdeb9bd559ddbe3557ade25ef8c6dea9 assets/twilightforest/blockstates/potted_darkwood_sapling.json +260a655b730233598a4736817df6d871e4b698b7 assets/twilightforest/blockstates/potted_dead_thorn.json +cbcf41c7d71d56a1c3697da19fe2525802cf369e assets/twilightforest/blockstates/potted_fiddlehead.json +260a655b730233598a4736817df6d871e4b698b7 assets/twilightforest/blockstates/potted_green_thorn.json +9d0139029c6a6f32c82f6be1bbd3af7600a8142a assets/twilightforest/blockstates/potted_hollow_oak_sapling.json +cbf9a4bee60c4f78f363749482569ce88246234d assets/twilightforest/blockstates/potted_mangrove_sapling.json +e51550c567131294d865c0a14353eccd4ee3dafe assets/twilightforest/blockstates/potted_mayapple.json +cc99e996a4893cce317a4f29364171556025a240 assets/twilightforest/blockstates/potted_mining_sapling.json +bdca0fa815164fcd2d81a52f35e5fa6eec95053d assets/twilightforest/blockstates/potted_mushgloom.json +cb5d5c919df96db36a0dc2ea15e3c4c8b881b73a assets/twilightforest/blockstates/potted_rainbow_oak_sapling.json +1a70ca5a6c64fcd7b010e5aea42f6974962b0fb0 assets/twilightforest/blockstates/potted_sorting_sapling.json +260a655b730233598a4736817df6d871e4b698b7 assets/twilightforest/blockstates/potted_thorn.json +9785c009daff75e161f07fa1887e995fffa7cb48 assets/twilightforest/blockstates/potted_time_sapling.json +ce094a7d5901495f51ed9c4b51179a0746bbd349 assets/twilightforest/blockstates/potted_transformation_sapling.json +d799fe07d26489146924f9e3965d2dd78d5fd86f assets/twilightforest/blockstates/potted_twilight_oak_sapling.json +94ee00eebd82061338b6db439a84b3fdf98f3942 assets/twilightforest/blockstates/quest_ram_trophy.json +94ee00eebd82061338b6db439a84b3fdf98f3942 assets/twilightforest/blockstates/quest_ram_wall_trophy.json +31c30e44cf4eeb0ccc7b65e72518267273761f6a assets/twilightforest/blockstates/rainbow_oak_leaves.json +418c88c60c39a82bf3d9c577d3f7ce7048ec9ea6 assets/twilightforest/blockstates/rainbow_oak_sapling.json +c3d60011dd0cdefa0cc3f0b45672794fe5a9f305 assets/twilightforest/blockstates/reactor_debris.json +56675fe7a49ad0f6077a6fd86e2e97c3f5731ae8 assets/twilightforest/blockstates/reappearing_block.json +559af5d22287bc8d15ab9819c724f8451b48b20d assets/twilightforest/blockstates/red_thread.json +bb7819736d9dd523bd69ca88e344478c4c2e4a45 assets/twilightforest/blockstates/root.json +c7e8c3ec3d2c159a84327ac576f92eae60eb200e assets/twilightforest/blockstates/root_strand.json +94ee00eebd82061338b6db439a84b3fdf98f3942 assets/twilightforest/blockstates/skeleton_skull_candle.json +94ee00eebd82061338b6db439a84b3fdf98f3942 assets/twilightforest/blockstates/skeleton_wall_skull_candle.json +bb9836bc48eb6cbc52a2c7fb9b833d4085315602 assets/twilightforest/blockstates/slider.json +1c0c175d79f54fef7bd68427a70b45f5596f8914 assets/twilightforest/blockstates/smoker.json +9472090eea384d675fee73a90ed033b799c88820 assets/twilightforest/blockstates/snow_queen_boss_spawner.json +94ee00eebd82061338b6db439a84b3fdf98f3942 assets/twilightforest/blockstates/snow_queen_trophy.json +94ee00eebd82061338b6db439a84b3fdf98f3942 assets/twilightforest/blockstates/snow_queen_wall_trophy.json +0f8f8d0605dbe75204870855ebf14e0f1bcd97fd assets/twilightforest/blockstates/sorting_banister.json +a5f6e4501a27ef88f0b994e12d99c5a6640dd62c assets/twilightforest/blockstates/sorting_button.json +02aecf1ae1d386eb03e8d8787a93fadaa5355987 assets/twilightforest/blockstates/sorting_chest.json +0e9caf278cf10db803243eb3e799799b30c47d9c assets/twilightforest/blockstates/sorting_door.json +c7ff34e08b01913ba1cec1e9a76e55f1bd2f4d53 assets/twilightforest/blockstates/sorting_fence.json +b475ef851269fcef3961af77d628769f658b6b4e assets/twilightforest/blockstates/sorting_fence_gate.json +45ce3b21e53ef2f5619227eaa406d23e69a54f31 assets/twilightforest/blockstates/sorting_leaves.json +8c8eba19ea49d01f33cf8459ebbab0219ba7982a assets/twilightforest/blockstates/sorting_log.json +aed0770ff0d2e7dc7faac02b1803946b930d2cc6 assets/twilightforest/blockstates/sorting_log_core.json +5dbc28cad2fef2bb42c4c434ebf3c9973b899920 assets/twilightforest/blockstates/sorting_planks.json +03aa5ac2555b176eceda9ec251ada7dfa3a49758 assets/twilightforest/blockstates/sorting_pressure_plate.json +f255b22c939a9d3c96db3f03f475b420a237a982 assets/twilightforest/blockstates/sorting_sapling.json +3b0b05d36838b7445c4b7e84a14fa8ab0e651c18 assets/twilightforest/blockstates/sorting_sign.json +ee8663aff0513fb2b880d84efbf4ea01be6e4334 assets/twilightforest/blockstates/sorting_slab.json +a0151a24fe925a82e3b1432ec80c1d4b8964545f assets/twilightforest/blockstates/sorting_stairs.json +8286641a1751f8228fda584792e524bb5869f212 assets/twilightforest/blockstates/sorting_trapdoor.json +22fa5306b2e240784c5b45cb770ce4a47863c435 assets/twilightforest/blockstates/sorting_wall_sign.json +f332a94d3840a225642a563a905c3a5bb658cdef assets/twilightforest/blockstates/sorting_wood.json +fa4ca921290966afd22d3eb726b45812ae950b4d assets/twilightforest/blockstates/spiral_bricks.json +35f3d316140f064c2f86363faa512fdffbe223d0 assets/twilightforest/blockstates/spruce_banister.json +965f91e9eec96ba89942250457456f10a994040c assets/twilightforest/blockstates/steeleaf_block.json +b2e74bad436c08b77027498c4722448d678ae13f assets/twilightforest/blockstates/stripped_canopy_log.json +7d3fec0b41d5610e6544df651bcdbe9da992ac18 assets/twilightforest/blockstates/stripped_canopy_wood.json +85b3a6d805a8e29cc5f13c2c73656b7af562b8a7 assets/twilightforest/blockstates/stripped_dark_log.json +b163a9767fe6ee24521db2ac3257b9d0ba0845a1 assets/twilightforest/blockstates/stripped_dark_wood.json +e5c2e1a5a4558c9876d0ffd0c51b27a193caafb1 assets/twilightforest/blockstates/stripped_mangrove_log.json +2d9ab0cf43a9e5aa2c0a4257ed6600d3df14b533 assets/twilightforest/blockstates/stripped_mangrove_wood.json +41fb9ad57cd913bf27f2c997642803197a451ff2 assets/twilightforest/blockstates/stripped_mining_log.json +1488c9fab31e988044683ab24f7220ebaa57d901 assets/twilightforest/blockstates/stripped_mining_wood.json +1f2492d9a9a4507f56e1bc4f077c279f31659f8b assets/twilightforest/blockstates/stripped_sorting_log.json +8cc85643090d4f0b12204ed37c08cc7aa26dd72d assets/twilightforest/blockstates/stripped_sorting_wood.json +d76a5e567943b47c4697dfdc500fa836eab228df assets/twilightforest/blockstates/stripped_time_log.json +10109d08a0056b1b85ef55906bdf42d78c0ec63c assets/twilightforest/blockstates/stripped_time_wood.json +f1aefe5659335464583459fe475d3c8791c2cbc1 assets/twilightforest/blockstates/stripped_transformation_log.json +14fa938521e7501a3cff560e88b89a877b69435e assets/twilightforest/blockstates/stripped_transformation_wood.json +cc40f471409eb7fea00628473cfbe152318065ee assets/twilightforest/blockstates/stripped_twilight_oak_log.json +ae8815f9c72650a5c2bb5a0d481022191b47068f assets/twilightforest/blockstates/stripped_twilight_oak_wood.json +660ce7e9f34f0c9f64089970dc90b02910746e0f assets/twilightforest/blockstates/stronghold_shield.json +e18ab94c6b1acc806b534c05c71c45d5d227e7e0 assets/twilightforest/blockstates/thick_castle_brick.json +93f581b7501ff5d8dca8728d70349b58e7c5f982 assets/twilightforest/blockstates/thorn_leaves.json +245b4c458fd1bae81afd7eeffba5eb4c889f9a86 assets/twilightforest/blockstates/thorn_rose.json +c743e267c05542fb0bc1c4e02e03a0dfe3ff8568 assets/twilightforest/blockstates/time_banister.json +e57513a7c02114a127186bea4444ab3348b079ac assets/twilightforest/blockstates/time_button.json +895cf7d2f621f164fe6bc9747d6139e32d138dd2 assets/twilightforest/blockstates/time_chest.json +61167d2dfd9c882cb39eaca586f3943c34f4a0a0 assets/twilightforest/blockstates/time_door.json +0539660a59032d24e2bab59084c7e5c66232103a assets/twilightforest/blockstates/time_fence.json +2c7896adf0ed7a88bc056156c4b469379b5634aa assets/twilightforest/blockstates/time_fence_gate.json +4691adb21b87d5329bfcd190d3863c4dc9b63e6f assets/twilightforest/blockstates/time_leaves.json +46816c67d770f839e0167d730277b1e967513fa4 assets/twilightforest/blockstates/time_log.json +b445383eba8b557d597199a044f2bc43d8ac6217 assets/twilightforest/blockstates/time_log_core.json +3ab0b14ef5792216dd0db7b36e58fadd558b2bb5 assets/twilightforest/blockstates/time_planks.json +5bd992fd60f43a2ec6dfa0d63fc9375e7c80e87d assets/twilightforest/blockstates/time_pressure_plate.json +51256d56f4fe23232f18f9140f23050af247d73f assets/twilightforest/blockstates/time_sapling.json +582444c029efa1fb9f3e559eaee3eb3d48bbd518 assets/twilightforest/blockstates/time_sign.json +a702292856ae83704bde1e92f53de02ffa6dc8fd assets/twilightforest/blockstates/time_slab.json +107bc5f84e91dcf0fe606e385fb56f18a155ca91 assets/twilightforest/blockstates/time_stairs.json +ca4f0e5d36ab32e84e0254132d26a34d55497dd4 assets/twilightforest/blockstates/time_trapdoor.json +17a6a0ab6493fba967279c29dfbed2a3dc5690b2 assets/twilightforest/blockstates/time_wall_sign.json +5082e36d05d9de13d965c81952e244da0de9787a assets/twilightforest/blockstates/time_wood.json +fe31fa7b8434972eedc269edba6627a5d4586b4c assets/twilightforest/blockstates/torchberry_plant.json +4d7b8684ee156c82863ac8edeccc99bfe7726e53 assets/twilightforest/blockstates/towerwood.json +9c810fba45afe626bcf0fd4223a73065a8a0023a assets/twilightforest/blockstates/transformation_banister.json +3b84c35137aca3fe0d7db72c3d41f23ae75392a8 assets/twilightforest/blockstates/transformation_button.json +d61dc0248f3ca96426e92f5394caf350167bdb74 assets/twilightforest/blockstates/transformation_chest.json +d5f511f21258f22b810c3fc7c5438b345e67a1e7 assets/twilightforest/blockstates/transformation_door.json +c42742c07e1a8780906f8848eb5dc9551960e630 assets/twilightforest/blockstates/transformation_fence.json +5516bd8eb04108252746176d5c3892a8ba4ff3eb assets/twilightforest/blockstates/transformation_fence_gate.json +708a669983dc33ab4ff8de5dd903a1b4e058bb08 assets/twilightforest/blockstates/transformation_leaves.json +09b9ddd5d8352ea53265dbfbef168326a3ea5b85 assets/twilightforest/blockstates/transformation_log.json +6a00b2d474ee07410ed47b6d602961d7ed14d43b assets/twilightforest/blockstates/transformation_log_core.json +6f7e27e737976063a88da41e42d09a1c29e6c726 assets/twilightforest/blockstates/transformation_planks.json +34c3de6442933a7840740371cd8754b6c62fece3 assets/twilightforest/blockstates/transformation_pressure_plate.json +1a54a691bee7bb2bd4aef219e467fc24e57ec0bf assets/twilightforest/blockstates/transformation_sapling.json +4a20d068e1b73e51b7d85956626b740010e804ca assets/twilightforest/blockstates/transformation_sign.json +ace1ef3091f111be402ebf7c9908363ceef662c2 assets/twilightforest/blockstates/transformation_slab.json +2306ee4ed0f95f4990e698868f9f1c02c98e0ea6 assets/twilightforest/blockstates/transformation_stairs.json +fc9a43b459ff016ceb45285b8365f3d0cdf4cede assets/twilightforest/blockstates/transformation_trapdoor.json +7bafaadde0a8ed6f96e68ba2d1ab0f17084987ce assets/twilightforest/blockstates/transformation_wall_sign.json +056fb687194bc0a01712b3f66f36e217d66db224 assets/twilightforest/blockstates/transformation_wood.json +a0dbe131e761ab03316f6ddf67d5fc1d142409d9 assets/twilightforest/blockstates/trollber.json +baa439de5bfba97965ee2b45dab413884e7c356b assets/twilightforest/blockstates/trollsteinn.json +fbc33ca6aedd052b97c20c93bc0265a9b757c331 assets/twilightforest/blockstates/trollvidr.json +9d6d2b9a0e95b9df6e585daddf68cf787c9551f3 assets/twilightforest/blockstates/trophy_pedestal.json +4c921ca11f547008a1429ef75fdcaf4f3cf51c0f assets/twilightforest/blockstates/twilight_oak_banister.json +5fafb7ee9e2c2e2eca79afc32224073add6bfd8a assets/twilightforest/blockstates/twilight_oak_button.json +67b1a5194af9833973b0f06aac5d75d7d821922e assets/twilightforest/blockstates/twilight_oak_chest.json +3220cbf5458f22f26d0851d3f473c57bcd826f20 assets/twilightforest/blockstates/twilight_oak_door.json +ab6b92e5e69b59384242635d0e93ae77e08beeb2 assets/twilightforest/blockstates/twilight_oak_fence.json +65548e6463b6e047973a493fb11e1c0f6fe9b90a assets/twilightforest/blockstates/twilight_oak_fence_gate.json +b5c078635b275b8f6551b5c932c916b1ac3b7946 assets/twilightforest/blockstates/twilight_oak_leaves.json +dc9ead6833b84ebe54468fed55b430c66ea948d5 assets/twilightforest/blockstates/twilight_oak_log.json +843e537f86d5af0fb33276db2d5fa4646cc08f6b assets/twilightforest/blockstates/twilight_oak_planks.json +1a1c24f286122eb5ce82a15eb5c8abbc48258027 assets/twilightforest/blockstates/twilight_oak_pressure_plate.json +77c31de6ca8cb13aedb9517fb8105f662e5fa646 assets/twilightforest/blockstates/twilight_oak_sapling.json +1ea03554b0c387d41c18ebd61d81fa9b7690a8f9 assets/twilightforest/blockstates/twilight_oak_sign.json +648cfc8206f7a7ca59cd45dbccb49d4c2cbae7f5 assets/twilightforest/blockstates/twilight_oak_slab.json +394cfbe5836983f88c29f444e1b0e7ef3fea2fef assets/twilightforest/blockstates/twilight_oak_stairs.json +edf006f122f9caffa98a3e4952fbc869f7180684 assets/twilightforest/blockstates/twilight_oak_trapdoor.json +022af390cc77197106d4a5964a01d87133cb9959 assets/twilightforest/blockstates/twilight_oak_wood.json +071c2989044315ff6e12f851c777f6186aaf7a2a assets/twilightforest/blockstates/twilight_portal.json +e035ea6a6929d7d71ba1771fe8abdca33ba44354 assets/twilightforest/blockstates/twilight_portal_miniature_structure.json +f900265d0349e883791f79f9d63869666ecde37b assets/twilightforest/blockstates/twilight_wall_sign.json +3b9dd5814ffa59035d86965523387b54978e6f27 assets/twilightforest/blockstates/twisted_stone.json +4547e24687a88ee7bbc216af39dbd2a3168d6684 assets/twilightforest/blockstates/twisted_stone_pillar.json +904767116b59b5da0d9a22c82989aa7c261b6d00 assets/twilightforest/blockstates/uberous_soil.json +d070be0d45e2877be0d82a5f2f4ec3463ac75bc8 assets/twilightforest/blockstates/uncrafting_table.json +22e37e7ec0ce60e57918a6f473661f3b376df4b7 assets/twilightforest/blockstates/underbrick.json +6fbca5391f954de595a2019f6431007e24891685 assets/twilightforest/blockstates/underbrick_floor.json +34697a03ecb2749398fc4f80806b7e2c64d7d04f assets/twilightforest/blockstates/unripe_trollber.json +9472090eea384d675fee73a90ed033b799c88820 assets/twilightforest/blockstates/ur_ghast_boss_spawner.json +94ee00eebd82061338b6db439a84b3fdf98f3942 assets/twilightforest/blockstates/ur_ghast_trophy.json +94ee00eebd82061338b6db439a84b3fdf98f3942 assets/twilightforest/blockstates/ur_ghast_wall_trophy.json +91393aed8862127e475c504ca1a9f00eb3a89977 assets/twilightforest/blockstates/vangrove_banister.json +0151d1744e22da56357ed9f9f45e857f780ec11e assets/twilightforest/blockstates/vanishing_block.json +dd4deb042d9d567be510c613647cd242a427828c assets/twilightforest/blockstates/violet_castle_door.json +f201be47403de47f7a64166b6ea0e3b06d1e1a76 assets/twilightforest/blockstates/violet_castle_rune_brick.json +c77239dff938dbdd73b4f8ac732f2fad83c12b4d assets/twilightforest/blockstates/violet_force_field.json +52e6872b0c81aa90efe585db9792137b7cbb4695 assets/twilightforest/blockstates/warped_banister.json +5397588ec04a7fbbd9454b18af884660dd62a917 assets/twilightforest/blockstates/weathered_deadrock.json +95d3a243909ea77ca628f6f4b414a343f2559d13 assets/twilightforest/blockstates/wispy_cloud.json +94ee00eebd82061338b6db439a84b3fdf98f3942 assets/twilightforest/blockstates/wither_skeleton_skull_candle.json +94ee00eebd82061338b6db439a84b3fdf98f3942 assets/twilightforest/blockstates/wither_skeleton_wall_skull_candle.json +2c533ced16289e079d4087d68d6b4d384368ee44 assets/twilightforest/blockstates/worn_castle_brick.json +f0ee8181dc2593ee94782ecaba7208da53aef0df assets/twilightforest/blockstates/worn_castle_brick_stairs.json +f9b77d1702c932a62b46a65cd7a6bbd9ed1fdc60 assets/twilightforest/blockstates/yellow_castle_door.json +f201be47403de47f7a64166b6ea0e3b06d1e1a76 assets/twilightforest/blockstates/yellow_castle_rune_brick.json +94ee00eebd82061338b6db439a84b3fdf98f3942 assets/twilightforest/blockstates/zombie_skull_candle.json +94ee00eebd82061338b6db439a84b3fdf98f3942 assets/twilightforest/blockstates/zombie_wall_skull_candle.json +3da72a9fc3f576141a1dbf64b68ca7cbdac11afb assets/twilightforest/models/block/antibuilder.json +eba13ba27042c041afe2fed75c1ee026d4213eae assets/twilightforest/models/block/antibuilt_block.json +5fe60e72d62ddfa3429d29902456c16f5a648b92 assets/twilightforest/models/block/arctic_fur_block.json +0f58d72e257db5d77d5a38fc053fe2944b3dbbf0 assets/twilightforest/models/block/aurora_block_0.json +8281e1a05f3d7bf406008a0db8e68e544662a498 assets/twilightforest/models/block/aurora_block_1.json +a9654f0e61e92eb82707f4ca4a8684c3095e7815 assets/twilightforest/models/block/aurora_block_10.json +49477f6e96d86251c5c7bcadbffc15c7167a931c assets/twilightforest/models/block/aurora_block_11.json +f6c67aa4c7a0010c7e8574e63c04c368959a2e8b assets/twilightforest/models/block/aurora_block_12.json +068c354bfa681ce29442cea35419ee84fe5cfb1c assets/twilightforest/models/block/aurora_block_13.json +0a3592ddc894bc72e59120dcc8cb388f66ac68b7 assets/twilightforest/models/block/aurora_block_14.json +9b27747f001adbdea8ff2c8c79ac43ec782229b4 assets/twilightforest/models/block/aurora_block_15.json +5c7ca45d7600e8909fc280253ff8ff7e12745e9f assets/twilightforest/models/block/aurora_block_2.json +87c9e650158bf4211194cf740c113de47298fe92 assets/twilightforest/models/block/aurora_block_3.json +862c37be3c9550b9fa2ea4f7da62f9477089c39e assets/twilightforest/models/block/aurora_block_4.json +96042cfdbd32d18b35c6f034cf82ace11bed65c0 assets/twilightforest/models/block/aurora_block_5.json +3ef0f42a80fd51edd90dcee1cd1c6b4a29403ea6 assets/twilightforest/models/block/aurora_block_6.json +6d37893bb18b8f608fdfafb32fbdcd010adb2da9 assets/twilightforest/models/block/aurora_block_7.json +da2e2a820ffd8dfd6234287cf6c4bb38a66f422f assets/twilightforest/models/block/aurora_block_8.json +402388a9ec6d8520b9f57bb96516f46288d3f04e assets/twilightforest/models/block/aurora_block_9.json +bb6e15f99fd619307044738a619b1f6dd84575d2 assets/twilightforest/models/block/aurora_pillar.json +08d05b927862842e0f3a9a7b4df17f08a7ef937a assets/twilightforest/models/block/aurora_slab.json +35e8cd5079b1dcfeef8b782f7d2265890bae4185 assets/twilightforest/models/block/aurora_slab_double.json +270a3be3eb74658bea5665e9429f14e4949d4a0f assets/twilightforest/models/block/auroralized_glass.json +9d7f647e9f1f988c576388a90d98569927846f24 assets/twilightforest/models/block/beanstalk_grower.json +3b22b7437760208f6214b9b121890393af3278a2 assets/twilightforest/models/block/beanstalk_leaves.json +91cc0a52fa4c3a51d7ed4641d49a44fe2bc5466c assets/twilightforest/models/block/blue_castle_door.json +eca605b11f7f28fec1ac200e3fc9d80ec9dd8a7e assets/twilightforest/models/block/blue_castle_door_vanished.json +ce7f2ab4adcee5c0b83f4a0789b2d3c6b3b26089 assets/twilightforest/models/block/bold_castle_brick_pillar.json +b7463ca79ed65125fb0261c3afa89e24a6007521 assets/twilightforest/models/block/bold_castle_brick_pillar_x.json +3f030edf65d349ce74832220da69220a0679e698 assets/twilightforest/models/block/bold_castle_brick_pillar_z.json +6a9fff69573a1e88c6d946f99c518a7ed5ee57ce assets/twilightforest/models/block/bold_castle_brick_stairs.json +f9231681aa47fdc0ab680e11caab75c72b7191fb assets/twilightforest/models/block/bold_castle_brick_stairs_inner.json +36cc7d5138f6fc57d01071ca30df4b370216f4d7 assets/twilightforest/models/block/bold_castle_brick_stairs_outer.json +a462fd6b50a881c3a5ffea67b665576117232d7e assets/twilightforest/models/block/bold_castle_brick_tile.json +defd9a7bbe255a5cc6e84fbd5696867739bb9695 assets/twilightforest/models/block/bold_stone_pillar.json +5176cfb3c4c305f46764a86aca5673fabd1b93f7 assets/twilightforest/models/block/bold_stone_pillar_horizontal.json +dd1cf288deb850319d7264f98f965ea87e65b113 assets/twilightforest/models/block/boss_spawner.json +0e9f345aea9692c2b708dd7e2cd5e96cb6abee63 assets/twilightforest/models/block/brown_thorns.json +45f0e7513a99924387702ce251ec64a6fabc1d8c assets/twilightforest/models/block/brown_thorns_bottom.json +406e440be4280d55054c53ea977566183be908f2 assets/twilightforest/models/block/brown_thorns_no_section.json +cbff836213f9c9d18eb89550e2620e5a1caff0e3 assets/twilightforest/models/block/brown_thorns_no_section_alt.json +cb2664132a325e4b3480abc8a22504d89a3cc42c assets/twilightforest/models/block/brown_thorns_thorns.json +5a8afd3fdb70f78be26ee033766a3a2ac643f027 assets/twilightforest/models/block/brown_thorns_top.json +a1d9da63241b07f6cc9210bb32422e5883504d5e assets/twilightforest/models/block/built_block.json +0e127ffa3eca9c0c2f2eb506df99e10cc3f01444 assets/twilightforest/models/block/built_block_active.json +935643a433f3ad29eefb164a8d03fd67f7a823b8 assets/twilightforest/models/block/burnt_thorns.json +1b533d9d66efaa6f21b7f84bfa6c742b15f6a09d assets/twilightforest/models/block/burnt_thorns_bottom.json +cc80bc65f6c8eac39da6a09bc057bf152a9db5ff assets/twilightforest/models/block/burnt_thorns_no_section.json +61677b22cbb5b6e4be458803150f941cbe13ee4e assets/twilightforest/models/block/burnt_thorns_no_section_alt.json +f4017ef63edcf68dea41ad51f84594691d357a12 assets/twilightforest/models/block/burnt_thorns_thorns.json +50f07dcee536e9077ed2626596950ae3a9aa3068 assets/twilightforest/models/block/burnt_thorns_top.json +49cd8f1f3378531a36dbe272a57ac976a03cda34 assets/twilightforest/models/block/candelabra_4_4_4.json +033c6d8f677609a4a15321e85f1b24381c50392b assets/twilightforest/models/block/candelabra_4_4_4_plain.json +bdf422b9985c5dd62952a5a755efaba689418b80 assets/twilightforest/models/block/candelabra_4_4_4_plain_lit.json +ffa821f6b2c72de8666419eef2e73717e3f221eb assets/twilightforest/models/block/candelabra_4_4_5.json +0913345eddb384b606ff8a60948d8e018be6f195 assets/twilightforest/models/block/candelabra_4_4_5_plain.json +bcf002cbf62457182c791c95952ab734db36d3ce assets/twilightforest/models/block/candelabra_4_4_5_plain_lit.json +8e114e2125deded3d9253e30d57e6d64f733a4bf assets/twilightforest/models/block/candelabra_4_5_4.json +77cb6411035fe9568c3cf2e723c074851f1d0187 assets/twilightforest/models/block/candelabra_4_5_4_plain.json +7c42d4d67793d6fdd146cceb163464ec212beec4 assets/twilightforest/models/block/candelabra_4_5_4_plain_lit.json +8324d5571780854e98dff4e25aba85fe6dd6f024 assets/twilightforest/models/block/candelabra_4_5_5.json +91cd56a09b92ba35ce834442108f5aafc4cba632 assets/twilightforest/models/block/candelabra_4_5_5_plain.json +c428d916b46e7dbcfc0636c8c5ea00507435c117 assets/twilightforest/models/block/candelabra_4_5_5_plain_lit.json +a8f5cf95dccc2754de0a5f9228f23994e62d1f05 assets/twilightforest/models/block/candelabra_5_4_4.json +61860e0fdb03f41a77a9a532b02a0dc75f4b7476 assets/twilightforest/models/block/candelabra_5_4_4_plain.json +d14d2d1d26a83e665c667a44a7e00b1b64fdbde6 assets/twilightforest/models/block/candelabra_5_4_4_plain_lit.json +7392a1743f5401f91aee4e6d996752d8c2c40c24 assets/twilightforest/models/block/candelabra_5_4_5.json +cd04e59d817867e8cbc5b3e74e4fb3ada2653ee1 assets/twilightforest/models/block/candelabra_5_4_5_plain.json +0a35482a10c94b06aeff1b9db5aa5aecdf839e54 assets/twilightforest/models/block/candelabra_5_4_5_plain_lit.json +247436e820d935a0be04526b8fb9a77b09619043 assets/twilightforest/models/block/candelabra_5_5_4.json +c99362610f2e6a83f0d3c2f76b730e0f721f9ee7 assets/twilightforest/models/block/candelabra_5_5_4_plain.json +6441ccd17a8a06326d6d06e6793f4c695cbfd663 assets/twilightforest/models/block/candelabra_5_5_4_plain_lit.json +5a11b1bd2ff5df9bdb0bfec03fbb392773807a9d assets/twilightforest/models/block/candelabra_5_5_5.json +cd83fbd7ebe466e2808af56a48839e3b1f55eeb2 assets/twilightforest/models/block/candelabra_5_5_5_plain.json +9aad606e8530b718d9550509ad42fb3350986e08 assets/twilightforest/models/block/candelabra_5_5_5_plain_lit.json +0e0b64c003a4d3e3d33875b3ae741c95621a827f assets/twilightforest/models/block/candelabra_wall_4_4_4.json +6336680a681c87ecfa396a6d100188b5eda1ecc0 assets/twilightforest/models/block/candelabra_wall_4_4_4_plain.json +3ed793599984977b2c900fb502ddbdc7d6a3f765 assets/twilightforest/models/block/candelabra_wall_4_4_4_plain_lit.json +bd2454e6ddc5618a0742c72d4b27fd317df6cd4d assets/twilightforest/models/block/candelabra_wall_4_4_5.json +d5702b9bf008faf6d7010865286fe714c9a0bc8b assets/twilightforest/models/block/candelabra_wall_4_4_5_plain.json +f4440fb2f74f84bdb4969113bb36deaf711d065c assets/twilightforest/models/block/candelabra_wall_4_4_5_plain_lit.json +0e742546dc1b422013c73084ca5f353d7208cab6 assets/twilightforest/models/block/candelabra_wall_4_5_4.json +bbb948fd19fe99865c8d568725cd35001df91ca1 assets/twilightforest/models/block/candelabra_wall_4_5_4_plain.json +c4991e3af83136a79789ff49c4cf1084bff5b41e assets/twilightforest/models/block/candelabra_wall_4_5_4_plain_lit.json +df9f9bb590cfbead33e69ecb053e287dd29cae9b assets/twilightforest/models/block/candelabra_wall_4_5_5.json +55be8536f8356cf0edb152c69cf2ad2811b78aa1 assets/twilightforest/models/block/candelabra_wall_4_5_5_plain.json +87a40ba4ffbbd1abf709d4ec65f1efeb223396f4 assets/twilightforest/models/block/candelabra_wall_4_5_5_plain_lit.json +4d1652e9c21febeee6739cec537745e77d3b6fae assets/twilightforest/models/block/candelabra_wall_5_4_4.json +70db60f0c98fc11602a77019e592f7feee3737e0 assets/twilightforest/models/block/candelabra_wall_5_4_4_plain.json +5e9a53c4fd6e541f98310c5edfec745932749f13 assets/twilightforest/models/block/candelabra_wall_5_4_4_plain_lit.json +098539478f564fb55d1da2ebd12161cb0eb27bc5 assets/twilightforest/models/block/candelabra_wall_5_4_5.json +e84c28bd384a6a0d5398006fa320b904f7e01f53 assets/twilightforest/models/block/candelabra_wall_5_4_5_plain.json +a296e314173acb64823b08e985367ed43534501b assets/twilightforest/models/block/candelabra_wall_5_4_5_plain_lit.json +98e80fae4c3803432a88821c2b3d9b43e71458d2 assets/twilightforest/models/block/candelabra_wall_5_5_4.json +ec8f5028d018105f7aabe7af698efc87b4632d00 assets/twilightforest/models/block/candelabra_wall_5_5_4_plain.json +32068a4c5fd4bfa91f7ecc6dd0b1e006f5b2dc86 assets/twilightforest/models/block/candelabra_wall_5_5_4_plain_lit.json +ebccc0057ff3685bd8eee9d79ed0e343d8891296 assets/twilightforest/models/block/candelabra_wall_5_5_5.json +84e0381db9e3038bd4d18a2cbf2c81a244949577 assets/twilightforest/models/block/candelabra_wall_5_5_5_plain.json +5da97af778070b94b61846522bdc13672dedaafb assets/twilightforest/models/block/candelabra_wall_5_5_5_plain_lit.json +01e7e37ad459a3f032fccc416c856b053338754c assets/twilightforest/models/block/canopy_bookshelf.json +c360d1f884cc08860eff0de1d2b07d2894f3eede assets/twilightforest/models/block/canopy_bookshelf_1.json +6cceee76b6e82527675f94cf2f3bd499b6e4a0a1 assets/twilightforest/models/block/canopy_bookshelf_2.json +5eed97a3b8e05d8d973817c75122ad144e885f3f assets/twilightforest/models/block/canopy_bookshelf_3.json +d061b38830f09c7d35917e0d4f3ec5394d6a7ea1 assets/twilightforest/models/block/canopy_chest.json +4b5f2d9acef33a6ac960fd562765cd3e580a4818 assets/twilightforest/models/block/canopy_leaves.json +c614bf467f221cbfb861867002f1684c65185870 assets/twilightforest/models/block/canopy_log.json +e041349aa9b8216cce24c9ad223d0bd75feec3ed assets/twilightforest/models/block/canopy_log_horizontal.json +162dab0a9f7a4aa0e97c1e4cdf7ed92e3d2910ff assets/twilightforest/models/block/canopy_sapling.json +d061b38830f09c7d35917e0d4f3ec5394d6a7ea1 assets/twilightforest/models/block/canopy_sign.json +d061b38830f09c7d35917e0d4f3ec5394d6a7ea1 assets/twilightforest/models/block/canopy_wall_sign.json +050c5571fd66ea4629fdf2ca2c6688affbbc0313 assets/twilightforest/models/block/canopy_wood.json +d448dd7ebfc774fcfe9066e3e470fdcf84217411 assets/twilightforest/models/block/canopy_wood_horizontal.json +6b4b0a347cd5371546675f2b112079b980daa977 assets/twilightforest/models/block/carminite_block.json +aeae8d5ab4c2a447708b1642115c7a63cd23b700 assets/twilightforest/models/block/carminite_builder.json +50b6a5e88703b83fe559898d7f079a4331693b3b assets/twilightforest/models/block/carminite_builder_active.json +0664dec5e8ae4b4d59b18134e652a53ed9ae2314 assets/twilightforest/models/block/carminite_builder_timeout.json +9ed9e49597231708af274b7d5aabd7987a9570cf assets/twilightforest/models/block/carminite_reactor.json +c7164623ec4177e4948030195cf3a61d73c0fcc1 assets/twilightforest/models/block/carminite_reactor_active.json +94197777b6d1353faabfdfc6bdc5b3314c672276 assets/twilightforest/models/block/casket_basalt.json +79b72f6567ce7aec8d40163eaa6689e78c998cc1 assets/twilightforest/models/block/casket_obsidian.json +af1100535ab0d2bff3afd31f15d56e923758c08a assets/twilightforest/models/block/casket_stone.json +7d4cb5c552653b8fba184db96c7b79a5ada208ee assets/twilightforest/models/block/castle_brick.json +87a81a1414ecb4eddab46dee35574202b04758e2 assets/twilightforest/models/block/castle_brick_stairs.json +ca23291a1e515aa159da74ba7d16754acba3b6a9 assets/twilightforest/models/block/castle_brick_stairs_inner.json +f6967f950a74204b0e3fe494ebdc356a82febb5d assets/twilightforest/models/block/castle_brick_stairs_outer.json +712a9cc2925a57667316a7b4460df53535b35cc8 assets/twilightforest/models/block/castle_roof_tile.json +d16783def5d4d83e5c0f95864d9a38e7475af349 assets/twilightforest/models/block/castle_rune_brick_0.json +4c03de4a33ecd8e617b7ddc84d3801e94532de93 assets/twilightforest/models/block/castle_rune_brick_1.json +94d565a5b752eab85f4db573d9def143ec2dd075 assets/twilightforest/models/block/castle_rune_brick_2.json +c2f409450537d25c9b4c30e92093e966525e4074 assets/twilightforest/models/block/castle_rune_brick_3.json +0f0802cbb6551c3885373904380a1250e5117ebe assets/twilightforest/models/block/castle_rune_brick_4.json +477da2f55296d4f023f5d821c662aacee61651a1 assets/twilightforest/models/block/castle_rune_brick_5.json +0a04021892a664eea198ea504c61cc0cb3d0f26d assets/twilightforest/models/block/castle_rune_brick_6.json +0706c71bd29d54baf8ce762ca8190ccaba08815a assets/twilightforest/models/block/castle_rune_brick_7.json +7d4cb5c552653b8fba184db96c7b79a5ada208ee assets/twilightforest/models/block/castle_rune_bricks.json +84a176d8eb0452c6b6aca2a3259fe86e64126f59 assets/twilightforest/models/block/castle_rune_inventory.json +771dfb127c3bcf918a8efbd8151ee8471f37a167 assets/twilightforest/models/block/castle_runes_0.json +7568d72176bc89d2d631c86c4b57928892d2ae9b assets/twilightforest/models/block/castle_runes_1.json +24347638ee2bc00fbff2d57c2b69332b5f36ed3c assets/twilightforest/models/block/castle_runes_2.json +ab9ac47106485eb226a58200559553e45f409bb6 assets/twilightforest/models/block/castle_runes_3.json +29550c5be0a6e3749ebc85ea479f37bc51aafe9d assets/twilightforest/models/block/castle_runes_4.json +2f2dbf19ffeab5f7ce4191d81a26374359f1e592 assets/twilightforest/models/block/castle_runes_5.json +f69636c3ddd67a4a0c26469e6ed29bf53957e62f assets/twilightforest/models/block/castle_runes_6.json +8422664888cbfd47d4ebd6e97e30ad6059c83d68 assets/twilightforest/models/block/castle_runes_7.json +9d7f647e9f1f988c576388a90d98569927846f24 assets/twilightforest/models/block/cicada.json +534c3db0fd4f5d57333cbc556b0c11f92921a98d assets/twilightforest/models/block/cicada_jar.json +4cca9f71464dc67993e49ed3e5d298b3ab6def70 assets/twilightforest/models/block/cinder_log.json +84ebc3ecc8e9c6631fdd763658078acdec41b247 assets/twilightforest/models/block/cinder_log_horizontal.json +a67d6bfb6f894740f758e0b4128632623eaf94b9 assets/twilightforest/models/block/cinder_wood.json +5b6b856b1e975cdc65d1f9e03f83bb313b36b74c assets/twilightforest/models/block/cracked_castle_brick.json +aff2d37542c602231904e97acaf3031a8b445eac assets/twilightforest/models/block/cracked_castle_brick_stairs.json +b26980bfbc79f0a81292a42039226a7e810ac4b4 assets/twilightforest/models/block/cracked_castle_brick_stairs_inner.json +f459570af76848dea81a4567505c3257d69458b2 assets/twilightforest/models/block/cracked_castle_brick_stairs_outer.json +1f1b4197ebe20410660e49b658e8aaf0ac996525 assets/twilightforest/models/block/cracked_deadrock.json +e1ea180bd92dfbb42431789a936601d7449c5370 assets/twilightforest/models/block/cracked_etched_nagastone.json +b7cf3f0d705dc215bdee5d6973983484d800deec assets/twilightforest/models/block/cracked_etched_nagastone_east.json +31d85cf5d046b6818a50d96eef729fc56b080f9a assets/twilightforest/models/block/cracked_etched_nagastone_north.json +1f39792732af649a666c777d1461e0efeb474120 assets/twilightforest/models/block/cracked_etched_nagastone_south.json +64ca27ecda2249e796252b1d0e085ae26fc49102 assets/twilightforest/models/block/cracked_etched_nagastone_up.json +8e888d523b7614cde1171cc0d60e94b2913acfa1 assets/twilightforest/models/block/cracked_etched_nagastone_west.json +8a1eb64b6b23c70f6f05fc94c2069bae6cebed88 assets/twilightforest/models/block/cracked_mazestone.json +ebdd9bdca720c9a8f7d4946f76776b364e6e8f4e assets/twilightforest/models/block/cracked_nagastone_pillar.json +e34dd40e37c328b7378ca6e7e6114e9fc4ba25b2 assets/twilightforest/models/block/cracked_nagastone_pillar_reversed.json +ec33f2e20cebba6a0ed9f6fc5d9db51a2a19ee3f assets/twilightforest/models/block/cracked_nagastone_stairs_left.json +0153634808216e57476bdd59f546f6da7e000a90 assets/twilightforest/models/block/cracked_nagastone_stairs_left_inner.json +9e58c92b1f45f764d4683bbde8e29244ed7d8b3d assets/twilightforest/models/block/cracked_nagastone_stairs_left_outer.json +2674d44de81fe941647f9adef560ad536c8d0743 assets/twilightforest/models/block/cracked_nagastone_stairs_right.json +f27d8f01b4c594724cd0922c5b0fa6bb3d479c68 assets/twilightforest/models/block/cracked_nagastone_stairs_right_inner.json +ee1a7bc8f031583e8a6d8e6de8b84941964f429d assets/twilightforest/models/block/cracked_nagastone_stairs_right_outer.json +f67e83a8023518fa68474c65b98b6ea0818986d9 assets/twilightforest/models/block/cracked_towerwood.json +968a95b6a5e969f1af71ca63f7715a499899e850 assets/twilightforest/models/block/cracked_towerwood_alt.json +2263ee6f77c416347e2f88b2d2dd7179adc553a8 assets/twilightforest/models/block/cracked_towerwood_alt_flipped.json +5c8e1266844513438549edfbb5d4de2359d7ba6b assets/twilightforest/models/block/cracked_towerwood_flipped.json +4d1988b8b507870b1c18dd435510898acdc849e6 assets/twilightforest/models/block/cracked_underbrick.json +55aa238d7809a9a3221806646896b091abb8c1cf assets/twilightforest/models/block/cut_mazestone.json +42518bd0a21e50db51bd78aa3e26551975177bbc assets/twilightforest/models/block/dark_chest.json +ff73cf220e6bec60699a36e7d250d62b92e4e4d0 assets/twilightforest/models/block/dark_leaves.json +b3f43842bc667aa3f81435630f7c60d148f9f731 assets/twilightforest/models/block/dark_log.json +e46df0845cb98acff243af97ac0d19bf38e7cb17 assets/twilightforest/models/block/dark_log_horizontal.json +42518bd0a21e50db51bd78aa3e26551975177bbc assets/twilightforest/models/block/dark_sign.json +42518bd0a21e50db51bd78aa3e26551975177bbc assets/twilightforest/models/block/dark_wall_sign.json +2e46335716fc5511740bea43079c14749e5df855 assets/twilightforest/models/block/dark_wood.json +3c29f7847d49d8b07f61abd607f4e612e76c7930 assets/twilightforest/models/block/dark_wood_horizontal.json +a05f6d7ec10b224f0eb33dfb1d191bcfa2287d3d assets/twilightforest/models/block/darkwood_sapling.json +3ad22d7ff369c3e823348ef01817129af7c9c3b7 assets/twilightforest/models/block/deadrock.json +b49211bd6b3cb23b375f51ae62fe53ef4795fc69 assets/twilightforest/models/block/death_tome_spawner_1.json +01e7e37ad459a3f032fccc416c856b053338754c assets/twilightforest/models/block/death_tome_spawner_10.json +adfa0dada02183f1aa1c5a5cd65eaa529ca58512 assets/twilightforest/models/block/death_tome_spawner_2.json +5b7d055a5b98f6d58e72d7f5f8105b403fa6ec98 assets/twilightforest/models/block/death_tome_spawner_3.json +700400f7066156055be25d99aef4b62d104f3d23 assets/twilightforest/models/block/death_tome_spawner_4.json +77879583bb9a08ae5ce1ee56df108f411fe951d7 assets/twilightforest/models/block/death_tome_spawner_5.json +6b3de38c5acc874e7c899040d39bc53c84b57031 assets/twilightforest/models/block/death_tome_spawner_6.json +ae1ab40f184c964161d3609c242173820fd20e06 assets/twilightforest/models/block/death_tome_spawner_7.json +06a74955ef0ac3547d21c127cf081f61083d6932 assets/twilightforest/models/block/death_tome_spawner_8.json +26d55f397b59ae21a0bf45d0a27df74dd2f600fc assets/twilightforest/models/block/death_tome_spawner_9.json +e52c91b4b0e68fc9474fb415e72a373a15d549f5 assets/twilightforest/models/block/decorative_mazestone.json +a711cc01dec19ac71ac3f8d707cbe92334384918 assets/twilightforest/models/block/empty_canopy_bookshelf.json +321b34f169823a2a63e675ba8727da55eca811ee assets/twilightforest/models/block/encased_castle_brick_pillar.json +1cf18c8bd3e505040a2e9b447bc844b4a15d3b0b assets/twilightforest/models/block/encased_castle_brick_pillar_x.json +8f5a396932d33f7b036653b1c52f814bdfde6c4f assets/twilightforest/models/block/encased_castle_brick_pillar_z.json +ec42b5c0a1870cd618aa6fac4f54c8e861892292 assets/twilightforest/models/block/encased_castle_brick_stairs.json +01203a789bc013d0814ec9e2d529ff32379e0aea assets/twilightforest/models/block/encased_castle_brick_stairs_inner.json +d668a754748b023f784b3480614674629928a28a assets/twilightforest/models/block/encased_castle_brick_stairs_outer.json +e4cefc2cc80b5db84fb6ff8469f50d8b55b4ec6d assets/twilightforest/models/block/encased_castle_brick_tile.json +76dc835d01ed78f664b6ccf483a5e6ac90648bd9 assets/twilightforest/models/block/encased_fire_jet.json +e6d3fa9afe975172a8fdc305b64a916a5cec1991 assets/twilightforest/models/block/encased_fire_jet_on.json +8fc519328054032fd0cb1526af3cc78fe04b4e07 assets/twilightforest/models/block/encased_smoker.json +88e552897b462039864093e9e221a8d526348a8f assets/twilightforest/models/block/encased_smoker_on.json +c754f9247d3cb352ff315b2d0d97ab30c1005872 assets/twilightforest/models/block/encased_towerwood.json +210e252c46b6026c071a446b8de929b74d12cc3d assets/twilightforest/models/block/etched_nagastone.json +1c10a82c35980f89886083c500bffc71e2135b45 assets/twilightforest/models/block/etched_nagastone_east.json +d846df617f281752b3d5d7171e080c0703aca1cb assets/twilightforest/models/block/etched_nagastone_north.json +d029b9f416ffa1f71de890e78b0451bcd86c3121 assets/twilightforest/models/block/etched_nagastone_south.json +6d60579eaa326f76eb0466e167eb6923522652ac assets/twilightforest/models/block/etched_nagastone_up.json +50c7505997326269386bc51bc1df5dd5ccf8d012 assets/twilightforest/models/block/etched_nagastone_west.json +aae23373cef0dcadecf45e676bd077b6f1a0af8a assets/twilightforest/models/block/experiment115_1_8_regenerating.json +5d762832f88584e62bf30b77160f0d7e73b1adbc assets/twilightforest/models/block/experiment115_2_8_regenerating.json +7ed1d87a775976c66be8cb0b76e07ecfd47693c1 assets/twilightforest/models/block/experiment115_3_8_regenerating.json +a13069db70c95184d640ccddcde7177f5df82f5e assets/twilightforest/models/block/experiment115_4_8_regenerating.json +cf01d847cf45249fc239966cc5b95f22e01f0921 assets/twilightforest/models/block/experiment115_5_8_regenerating.json +4221d84dcfdab83ff6ffff9b3feb303e51259e72 assets/twilightforest/models/block/experiment115_6_8_regenerating.json +032b2aa0e1057f24837798282f152e4ed2290684 assets/twilightforest/models/block/experiment115_7_8_regenerating.json +6a36220a910476f613aae9dfd7aa0debcba6f20c assets/twilightforest/models/block/experiment115_8_8_regenerating.json +142fb2d24b8b4935e98ddacb40169250989608b3 assets/twilightforest/models/block/fallen_leaves1.json +07fbe9a9e28bbbda520f74f508a35a6e1a1a7aff assets/twilightforest/models/block/fallen_leaves2.json +290c4efc7352900deaa1fc3a95ec40bbd35623f8 assets/twilightforest/models/block/fallen_leaves3.json +c18a9526c4c4c241baa8933027b0e46d4f0c76e5 assets/twilightforest/models/block/fallen_leaves4.json +bebac05813302a4e983cc452fd6957062e82a841 assets/twilightforest/models/block/fallen_leaves5.json +6745d98b5ca1d5df00d191345e42572b19902f13 assets/twilightforest/models/block/fallen_leaves6.json +3219a9a2d844742003ab7de6f528651a988a549b assets/twilightforest/models/block/fallen_leaves7.json +58a049e44c40ab20cb322514cb34d65ce60ffa2c assets/twilightforest/models/block/fallen_leaves8.json +e5d2c8ffbbfbcaf285c60e093d4037b6d1122959 assets/twilightforest/models/block/fiddlehead.json +90f5aacf15e0b6d31622c680d5323a1941981426 assets/twilightforest/models/block/fire_jet.json +9d7f647e9f1f988c576388a90d98569927846f24 assets/twilightforest/models/block/firefly.json +92e87236c8e720137be3b4a4f631ad23630239d7 assets/twilightforest/models/block/firefly_jar.json +a8cb3a9bf21cd70ede74f84c27528adcfc805cb4 assets/twilightforest/models/block/fluffy_cloud.json +0bc8f183959148d163987f05f20c8c6c52b35cca assets/twilightforest/models/block/force_field/blue_force_field_down.json +0d3180be3c75499e73e41148f9a8ec484f52fd51 assets/twilightforest/models/block/force_field/blue_force_field_down_east.json +78df02849b1bf1302ffa54f46970cd136bf18650 assets/twilightforest/models/block/force_field/blue_force_field_down_no_east.json +4f887e5f9ae87c6ddb1d055fdd27e0e47eb08402 assets/twilightforest/models/block/force_field/blue_force_field_down_no_north.json +ee21d22063777bbf1e6cab585a00d50076834dc9 assets/twilightforest/models/block/force_field/blue_force_field_down_no_south.json +a96dccf6d49b8ce43802b68910588581ff7a4ab8 assets/twilightforest/models/block/force_field/blue_force_field_down_no_west.json +40a10b98ffd8db5128bbecae1a1c18f449bb8635 assets/twilightforest/models/block/force_field/blue_force_field_down_north.json +9be67ee73400a9a60632bcc12e79bdcc228c1218 assets/twilightforest/models/block/force_field/blue_force_field_down_south.json +14f9022dd553e1d334c5853f361db7f3c86ff339 assets/twilightforest/models/block/force_field/blue_force_field_down_west.json +19c25d9a39390d5453356476595706e56d3a4e06 assets/twilightforest/models/block/force_field/blue_force_field_east.json +16987858fdefa0616d482704be2ebc34f7e711fc assets/twilightforest/models/block/force_field/blue_force_field_east_no_down.json +a7d88a8627dc77b6ff3b2111b685963fb6d711eb assets/twilightforest/models/block/force_field/blue_force_field_east_no_north.json +1f6d4b28bb30a4a98b3399b3b392c078903863da assets/twilightforest/models/block/force_field/blue_force_field_east_no_south.json +4712cfd3da2ea2f515eb997a10f61561ac729741 assets/twilightforest/models/block/force_field/blue_force_field_east_no_up.json +67681c2f504b9bdf564f52843db8c6398a525d3f assets/twilightforest/models/block/force_field/blue_force_field_no_down.json +a579e11b9ebdf18f08c59e6fb6c4f7e7ee8198e9 assets/twilightforest/models/block/force_field/blue_force_field_no_east.json +73a02ecde655b6c7d6b67268a57f4bccf04ec048 assets/twilightforest/models/block/force_field/blue_force_field_no_north.json +3d31db6125b62749d3afc73360855da0ba845e3c assets/twilightforest/models/block/force_field/blue_force_field_no_south.json +670e46a0d9c62ce6740018b69ffe383d6b2a1ee9 assets/twilightforest/models/block/force_field/blue_force_field_no_up.json +0d81c136c71aa2b7e83071c58e5d937aa3e3b306 assets/twilightforest/models/block/force_field/blue_force_field_no_west.json +8f9b9e651aeb85b9af8ac262da28aa3b46e8b4d5 assets/twilightforest/models/block/force_field/blue_force_field_north.json +a5415f7590227cc13dd0a9a58e0daade3f8a8385 assets/twilightforest/models/block/force_field/blue_force_field_north_east.json +c8175b1d1fac8e812af0cdcbc8c879440122c480 assets/twilightforest/models/block/force_field/blue_force_field_north_no_down.json +b031a365766411f46d9942aa022b260216a54136 assets/twilightforest/models/block/force_field/blue_force_field_north_no_east.json +b62f95dcb458cb7dee867e21503c86500aebeee7 assets/twilightforest/models/block/force_field/blue_force_field_north_no_up.json +a56bd91d6026a327502e637546adddf5e443804d assets/twilightforest/models/block/force_field/blue_force_field_north_no_west.json +7cd384d8fd1f6293298d560c41289f3522c5dc6b assets/twilightforest/models/block/force_field/blue_force_field_north_west.json +817e00526660f1a726932cc8dcd7fab95aca1aaa assets/twilightforest/models/block/force_field/blue_force_field_south.json +369f97f996fda569bec0146e155b427d58c2745b assets/twilightforest/models/block/force_field/blue_force_field_south_east.json +f6a63b3137738d9ac62ae38e6ca712da1fa345e2 assets/twilightforest/models/block/force_field/blue_force_field_south_no_down.json +623baa521e02ed10ee0fa5e52de12d8267e4c8c8 assets/twilightforest/models/block/force_field/blue_force_field_south_no_east.json +e5a6c47f4cd4813b700f47de6d19290e00f675ef assets/twilightforest/models/block/force_field/blue_force_field_south_no_up.json +0fce838e98171f63e45a58b787d49e185b342896 assets/twilightforest/models/block/force_field/blue_force_field_south_no_west.json +8c33e751349ec19eee654353b4f9b9c37c607ad8 assets/twilightforest/models/block/force_field/blue_force_field_south_west.json +4ac29770e51fec35a8c867b6762763bf21eb0d2b assets/twilightforest/models/block/force_field/blue_force_field_up.json +87a225267d34a0a38b0ef87dccd3ba0b8ced1004 assets/twilightforest/models/block/force_field/blue_force_field_up_east.json +ca059c7a6607c3762bd5a08b67f72dc25a7b9172 assets/twilightforest/models/block/force_field/blue_force_field_up_no_east.json +ad902a9cdbd0eaa66c6dc6bf204c275a7cd13a2a assets/twilightforest/models/block/force_field/blue_force_field_up_no_north.json +8402eec0afd6bb9965f639a563d282cc35b44dce assets/twilightforest/models/block/force_field/blue_force_field_up_no_south.json +42a500d675a4d36c32ef89bb76ee1c4fea4e1862 assets/twilightforest/models/block/force_field/blue_force_field_up_no_west.json +0c977068296c549cd5f571d514404d0879a75a69 assets/twilightforest/models/block/force_field/blue_force_field_up_north.json +60cf46c7199ec78aaad6ae08861b139d4572983a assets/twilightforest/models/block/force_field/blue_force_field_up_south.json +3ed6d526156f4ade6abef96e68b8c1ca03da5757 assets/twilightforest/models/block/force_field/blue_force_field_up_west.json +b72d5f443dbfdbe8d5f4bd4f3f2443f472847154 assets/twilightforest/models/block/force_field/blue_force_field_west.json +bb9031d0ebd3c4c65c2a6bdf844837267bb236e6 assets/twilightforest/models/block/force_field/blue_force_field_west_no_down.json +044610b6101baad22fe4d2d29e3e622b23888b06 assets/twilightforest/models/block/force_field/blue_force_field_west_no_north.json +7ec9a6ff6141011853be6753fb641449b23c0b7d assets/twilightforest/models/block/force_field/blue_force_field_west_no_south.json +02b24b99fef61faa9ef2ae5ce2ba6f9c40829e96 assets/twilightforest/models/block/force_field/blue_force_field_west_no_up.json +4259b56852fe01d07911f22d94953bbfa550e997 assets/twilightforest/models/block/force_field/force_field_down.json +08322c016f8f358c9716273ca05f6acafaa7847e assets/twilightforest/models/block/force_field/force_field_down_east.json +b0a6dbd53a3dcca133aa84caa00ec058b6b4ba63 assets/twilightforest/models/block/force_field/force_field_down_no_east.json +67ee49c118e7765e411eb46ca3331860456fce8c assets/twilightforest/models/block/force_field/force_field_down_no_north.json +c90b6af707f62b80e49d4cc957188e2e8c0a0058 assets/twilightforest/models/block/force_field/force_field_down_no_south.json +6ee94aa79eabdd81760796cf9dcd5e2bc49d833e assets/twilightforest/models/block/force_field/force_field_down_no_west.json +9b736f89fc09ccb3469204cf6ac4aeedb273ca7d assets/twilightforest/models/block/force_field/force_field_down_north.json +a57620e1af1dfbd32b03ff53a1387b65be72b6af assets/twilightforest/models/block/force_field/force_field_down_south.json +42313debedbd9f624c010dd29aa755732a776ae1 assets/twilightforest/models/block/force_field/force_field_down_west.json +f5f1db326b34259f64d76974a5d26dea5b7c818b assets/twilightforest/models/block/force_field/force_field_east.json +ef354684c9636a2cd52178b5bc06da4c8a07e01a assets/twilightforest/models/block/force_field/force_field_east_no_down.json +c623d3844ae1c42e714ae2bfc1e23b83f44886a4 assets/twilightforest/models/block/force_field/force_field_east_no_north.json +a0bc5d829c686642fc7d989424afee918cde3055 assets/twilightforest/models/block/force_field/force_field_east_no_south.json +6b74f46d96951960ce1791b4768de6ddc73f1528 assets/twilightforest/models/block/force_field/force_field_east_no_up.json +125eee8a9969bc36870d9a66793f7e93ac9ad7ef assets/twilightforest/models/block/force_field/force_field_no_down.json +4fab0a994793449f4fa9e19c422f673149b06e19 assets/twilightforest/models/block/force_field/force_field_no_east.json +2d20055e5ad77f2e9a8263bbf5f26ed3010541a4 assets/twilightforest/models/block/force_field/force_field_no_north.json +bfb2a3f32bb7153611dd1544f6bcacc00dd34f4a assets/twilightforest/models/block/force_field/force_field_no_south.json +07d70265a87d44e072da75132dd97aa8253474ee assets/twilightforest/models/block/force_field/force_field_no_up.json +fee15db4c0edf495f73cda13226b79f7d0bac0c5 assets/twilightforest/models/block/force_field/force_field_no_west.json +c95bc168c6cecdead3ab227eaf9bcd39ab70596d assets/twilightforest/models/block/force_field/force_field_north.json +a35694c90c97dd0886b6a2eec2219e88f795933e assets/twilightforest/models/block/force_field/force_field_north_east.json +d1ceadb58d90376f2077ba86992e71d3af412481 assets/twilightforest/models/block/force_field/force_field_north_no_down.json +fdcfd7eda91c15aa6ee1f16548976f146bbdd53e assets/twilightforest/models/block/force_field/force_field_north_no_east.json +1b08e42eb1a9eb934f93b278960a240458af2e75 assets/twilightforest/models/block/force_field/force_field_north_no_up.json +9eb29d62caf8bbdd61ba8be18358c1a8b1afb291 assets/twilightforest/models/block/force_field/force_field_north_no_west.json +5fa9be61b02a797a169d3d93c4001905006b45c3 assets/twilightforest/models/block/force_field/force_field_north_west.json +d4150d8794b72a3b5986b70a75b1c2458e0c8c6e assets/twilightforest/models/block/force_field/force_field_south.json +f792190a7a5f87a87965f26732d2b5adc5570ab3 assets/twilightforest/models/block/force_field/force_field_south_east.json +bce8e89d0c5787e7ec7199a5def529a2f1f6d4bb assets/twilightforest/models/block/force_field/force_field_south_no_down.json +993840b29f38473e9abcabe4173bf437eef382c5 assets/twilightforest/models/block/force_field/force_field_south_no_east.json +ee1daf7c2c6fa1b83a376807e14bc88b829e8099 assets/twilightforest/models/block/force_field/force_field_south_no_up.json +db653a116c5fa0bb191de26783b7ed2d3f13d087 assets/twilightforest/models/block/force_field/force_field_south_no_west.json +1f7bbf0ec6b989ce9567d9f0f3479845ff3b26df assets/twilightforest/models/block/force_field/force_field_south_west.json +17e55e1ddcaf4e1f950ccf45b657f239a7fb16e7 assets/twilightforest/models/block/force_field/force_field_up.json +a2b2d77f15fc237084fec928a32514ed99caa207 assets/twilightforest/models/block/force_field/force_field_up_east.json +69dff17d9abbadb86b5b4a5b66275f508dd64105 assets/twilightforest/models/block/force_field/force_field_up_no_east.json +426bd4d87f28efc59c2e96600f2b1b9ebaecef4a assets/twilightforest/models/block/force_field/force_field_up_no_north.json +0badb8205bc559f182443b25b15dbb83cba345b4 assets/twilightforest/models/block/force_field/force_field_up_no_south.json +669a95ae14a0e533663f9cc489bd8f8531b8aa91 assets/twilightforest/models/block/force_field/force_field_up_no_west.json +fdc20bb24b27d3644d3d0e5277f15c82e76108d9 assets/twilightforest/models/block/force_field/force_field_up_north.json +a086226d8492dafae26d7ef53c30478d9a2a02ec assets/twilightforest/models/block/force_field/force_field_up_south.json +6b04322ba038b7a9af660aaa2b8be0618b77940d assets/twilightforest/models/block/force_field/force_field_up_west.json +7aaf83d301b6e23159ae9897e6b5a2e3f533e858 assets/twilightforest/models/block/force_field/force_field_west.json +3949c154a8e426eeb1766a23f6784b13b2a48fe6 assets/twilightforest/models/block/force_field/force_field_west_no_down.json +a4fddf0636f667fab7586df7fa6f4aa20826a405 assets/twilightforest/models/block/force_field/force_field_west_no_north.json +e26b48576047815d9fe768b15a31434fd4280e44 assets/twilightforest/models/block/force_field/force_field_west_no_south.json +6cc94fba9a2d04875b3fa131dd6469fb635ea686 assets/twilightforest/models/block/force_field/force_field_west_no_up.json +2c45ca1b84ad7aaf6bdd40819f0997524cae31e6 assets/twilightforest/models/block/force_field/green_force_field_down.json +8ce9db782bc21af9daa77064cc523f2183f50c26 assets/twilightforest/models/block/force_field/green_force_field_down_east.json +7dcc69fc2da2b97cdcde762c8052a55e09f0f223 assets/twilightforest/models/block/force_field/green_force_field_down_no_east.json +8272b80891f80b9e358686c9c6a42a8562801042 assets/twilightforest/models/block/force_field/green_force_field_down_no_north.json +26f0731795e6de537f208517af221fea99f6c5a8 assets/twilightforest/models/block/force_field/green_force_field_down_no_south.json +c303629d311a209cefd5143b306658af1f728186 assets/twilightforest/models/block/force_field/green_force_field_down_no_west.json +9154f652ba215928e9bf9d6c5859ace18c76858e assets/twilightforest/models/block/force_field/green_force_field_down_north.json +bd4bc347e298fa066edf87301c5c7d7170e14152 assets/twilightforest/models/block/force_field/green_force_field_down_south.json +89d94694e33d282aee11bf28d73e5e178de484a1 assets/twilightforest/models/block/force_field/green_force_field_down_west.json +ed223dd79f172a34af364a34f3082733c448f869 assets/twilightforest/models/block/force_field/green_force_field_east.json +f593847ea9f82a96e318ca51450ec6895ae07bec assets/twilightforest/models/block/force_field/green_force_field_east_no_down.json +882096ccb1b976ff1daba36a7bf808fb474b52ad assets/twilightforest/models/block/force_field/green_force_field_east_no_north.json +00f02d58ceaba4f0bcfe10fd91695061af466fa2 assets/twilightforest/models/block/force_field/green_force_field_east_no_south.json +138ed645aa5aed90c9658fa490abd5e8205dc17d assets/twilightforest/models/block/force_field/green_force_field_east_no_up.json +0f1f84be583d36308d9dd620da3de19f6d9b1189 assets/twilightforest/models/block/force_field/green_force_field_no_down.json +ef34fb8e1119fdb30a648240c42c749ee1930019 assets/twilightforest/models/block/force_field/green_force_field_no_east.json +cd2634fc35328b8958c93c1fa2f4798197d3e29e assets/twilightforest/models/block/force_field/green_force_field_no_north.json +fd4dda8e13bcdd16e68db98fa8072f1f5a335c36 assets/twilightforest/models/block/force_field/green_force_field_no_south.json +eacc45889b9bdd6b97be8d54d97e499389e8e7ac assets/twilightforest/models/block/force_field/green_force_field_no_up.json +9d30a6503b731b6154c8869790d7f873e35ff2b8 assets/twilightforest/models/block/force_field/green_force_field_no_west.json +a1e7353d34f863a47df8c7e1062fcf70f0e0afa5 assets/twilightforest/models/block/force_field/green_force_field_north.json +2a3713dbb69e2639589e2ce143c73bdfc768d1be assets/twilightforest/models/block/force_field/green_force_field_north_east.json +ebc420e4e71e5fdbf2997cd84966fa3d8ff48fc3 assets/twilightforest/models/block/force_field/green_force_field_north_no_down.json +caa9348a6b5e785ed6975bc98080daec6948c534 assets/twilightforest/models/block/force_field/green_force_field_north_no_east.json +32c326409c8bf4b4a66905ca6790cb31cc0f1515 assets/twilightforest/models/block/force_field/green_force_field_north_no_up.json +4479d543083e3a9b58b283da7b6d8e92aae254f0 assets/twilightforest/models/block/force_field/green_force_field_north_no_west.json +5f16d99b72d53548e50990472fefef50039dd7f7 assets/twilightforest/models/block/force_field/green_force_field_north_west.json +93246f8bc88ea77a1470d1bc90c0f53c67d050f1 assets/twilightforest/models/block/force_field/green_force_field_south.json +16b5d38b4a19a9c602b7d11e3450a1014f84ac0a assets/twilightforest/models/block/force_field/green_force_field_south_east.json +c9bb4a8f9eb90012249300f7416a887795433ca4 assets/twilightforest/models/block/force_field/green_force_field_south_no_down.json +ea8de9ea067cdceecea97bcbeafebe12ab41b7a1 assets/twilightforest/models/block/force_field/green_force_field_south_no_east.json +6b5d51d75e3f4c805f9eda370fa8eb7099a3247e assets/twilightforest/models/block/force_field/green_force_field_south_no_up.json +fa425ea39bb3dd72636850ce3c66bc2d415ac67d assets/twilightforest/models/block/force_field/green_force_field_south_no_west.json +16600ce5a806f0833d927a07ee272cf05198c44a assets/twilightforest/models/block/force_field/green_force_field_south_west.json +eeed9c9bddeab83b4b9c0a373aa5c9755f282637 assets/twilightforest/models/block/force_field/green_force_field_up.json +0868b0a606541c81bceb2a03b5cfe8fc4af14c2c assets/twilightforest/models/block/force_field/green_force_field_up_east.json +633c749f361490239b8b49332186f1aa242443db assets/twilightforest/models/block/force_field/green_force_field_up_no_east.json +9b05744894f99fcef0e84985ca4c58db31d9e365 assets/twilightforest/models/block/force_field/green_force_field_up_no_north.json +ffd0d34595740fc18c7cc641d5e4d6b66b81cae4 assets/twilightforest/models/block/force_field/green_force_field_up_no_south.json +bc7e90f94411a2212b1b389fdb261641459b1090 assets/twilightforest/models/block/force_field/green_force_field_up_no_west.json +bcf574b2b181b0b8e0dde1781b46075de4bc77ad assets/twilightforest/models/block/force_field/green_force_field_up_north.json +cd4333ee1d4a95924397dc12584ac52c311f6108 assets/twilightforest/models/block/force_field/green_force_field_up_south.json +129c5a6bb44ca7aeb2871b9314a9dbb1365cc374 assets/twilightforest/models/block/force_field/green_force_field_up_west.json +5619bd2431e65697fdaecf705fc869236dac8624 assets/twilightforest/models/block/force_field/green_force_field_west.json +2c9be74afdc3f00cf8aff2341f1dd29495f769c1 assets/twilightforest/models/block/force_field/green_force_field_west_no_down.json +457419ac9629f49301d776916ea2cb3b17fa7807 assets/twilightforest/models/block/force_field/green_force_field_west_no_north.json +d904e6c557438c01c6fb7a7bdab30eef8408a0bb assets/twilightforest/models/block/force_field/green_force_field_west_no_south.json +d98bd418fb7a079d40da34d7701414d3348cf710 assets/twilightforest/models/block/force_field/green_force_field_west_no_up.json +6fb1e92312d35db1f20b030812ce9faf9893010a assets/twilightforest/models/block/force_field/orange_force_field_down.json +dbef960eb264b826d7200304c3ee5f59e1631a7b assets/twilightforest/models/block/force_field/orange_force_field_down_east.json +c2d44805f6cf44fb7e3271bb1904bc30a996a823 assets/twilightforest/models/block/force_field/orange_force_field_down_no_east.json +c91b264f6a613148627fd72f4683fae2b7084b24 assets/twilightforest/models/block/force_field/orange_force_field_down_no_north.json +c497e22b88727ced47ba5425e9c99711e7a1da4c assets/twilightforest/models/block/force_field/orange_force_field_down_no_south.json +3c6d449239f656c57334d93cb7101bb4cfe536c1 assets/twilightforest/models/block/force_field/orange_force_field_down_no_west.json +ec1ccd8a42f9f154d2725fd534512830dcfc4252 assets/twilightforest/models/block/force_field/orange_force_field_down_north.json +151dd7095b93dfb8047d6009ac0d4e5d7696a506 assets/twilightforest/models/block/force_field/orange_force_field_down_south.json +c2d4e8bc9992026572f2e0fbe6f615444cd14065 assets/twilightforest/models/block/force_field/orange_force_field_down_west.json +8d3e4512cfed6309f9d3931a45635a161fd9c352 assets/twilightforest/models/block/force_field/orange_force_field_east.json +8bf6de2c6c902ee2c6cbd3b19015908c511a69f1 assets/twilightforest/models/block/force_field/orange_force_field_east_no_down.json +cd2fa22ff5923ba5a7d46bc61ef128e8a88d0b1f assets/twilightforest/models/block/force_field/orange_force_field_east_no_north.json +9eb701c07ae9134620b9ea7a62fe9c22601fadca assets/twilightforest/models/block/force_field/orange_force_field_east_no_south.json +d5f82168abb8b07a0ad3464446068aed244801e7 assets/twilightforest/models/block/force_field/orange_force_field_east_no_up.json +816211db8cf42cf8b87a86e0007b1115930cf5ee assets/twilightforest/models/block/force_field/orange_force_field_no_down.json +3505788d6b4a6fa0f596df82380a03394f8c2de6 assets/twilightforest/models/block/force_field/orange_force_field_no_east.json +01807f455c6e0b601d000dad92dc1bf791f75a09 assets/twilightforest/models/block/force_field/orange_force_field_no_north.json +35eac3946cc21e955ee6c3036afd02adaaa5f2c8 assets/twilightforest/models/block/force_field/orange_force_field_no_south.json +2ac28e45f66cd5b9a1c035e47c3ed7b293c939b4 assets/twilightforest/models/block/force_field/orange_force_field_no_up.json +b6322ba1768a408f7845b509348e33ad359d1b2d assets/twilightforest/models/block/force_field/orange_force_field_no_west.json +22e41459287721a65a683f36c5a539bd1f906d25 assets/twilightforest/models/block/force_field/orange_force_field_north.json +dc0b512561e974a0f04f41778474aed09127997c assets/twilightforest/models/block/force_field/orange_force_field_north_east.json +2c5e88ccb69ebaf782da920e104af42c2f26b35c assets/twilightforest/models/block/force_field/orange_force_field_north_no_down.json +265e9c5d1af01049f7069f1c85e1f224e0b341d5 assets/twilightforest/models/block/force_field/orange_force_field_north_no_east.json +8d31b44e90b05a65e0f61c048801dc526ca0da15 assets/twilightforest/models/block/force_field/orange_force_field_north_no_up.json +53b9523e0d226d10d3b8880f1404b33c78053b76 assets/twilightforest/models/block/force_field/orange_force_field_north_no_west.json +8767509d9c759db32c7c2fdb065640f88ff32f84 assets/twilightforest/models/block/force_field/orange_force_field_north_west.json +006d6137405f45a853bb630e4a75a19d7d650187 assets/twilightforest/models/block/force_field/orange_force_field_south.json +8343e2484760b94dd367ba3d6b1caa6fc038cbeb assets/twilightforest/models/block/force_field/orange_force_field_south_east.json +a1d3e05c871964f4fa74cfb04fe88cc9eea6ba8e assets/twilightforest/models/block/force_field/orange_force_field_south_no_down.json +24165b75c6549ee982ac93a2ffd9b054e66ee126 assets/twilightforest/models/block/force_field/orange_force_field_south_no_east.json +324d6508f323ef0dc4ae32a9eefb01fbe7a0c25c assets/twilightforest/models/block/force_field/orange_force_field_south_no_up.json +aad1fb10e337019ddd083a96e188c55ce1cf7fdd assets/twilightforest/models/block/force_field/orange_force_field_south_no_west.json +be30d5584951d579a636d18eb575a5f09aab6e35 assets/twilightforest/models/block/force_field/orange_force_field_south_west.json +ac8763a0c670c3969ccac2282dd95bb53c840d39 assets/twilightforest/models/block/force_field/orange_force_field_up.json +2d63c1ed5057c0dd1eb6a152d827ce94935883d8 assets/twilightforest/models/block/force_field/orange_force_field_up_east.json +1fa81c0c0b2eaa60cf134827a2ff996505be83b5 assets/twilightforest/models/block/force_field/orange_force_field_up_no_east.json +202ab792636efc62668ca154869b515b1c5dadf6 assets/twilightforest/models/block/force_field/orange_force_field_up_no_north.json +a34ab16d198f7dfaf40b23dc23c26bd98ba2f790 assets/twilightforest/models/block/force_field/orange_force_field_up_no_south.json +0247e5c156d602cce53fda4b749a1d0b64f35ed4 assets/twilightforest/models/block/force_field/orange_force_field_up_no_west.json +4e47237ce4a72357cc2178f17a5c040b1a1416b9 assets/twilightforest/models/block/force_field/orange_force_field_up_north.json +eb6f9e6249f6cd40eff6f74235437c7b2a0441c9 assets/twilightforest/models/block/force_field/orange_force_field_up_south.json +98867791310d86675ab8bece8ec4ea9d391ad5b9 assets/twilightforest/models/block/force_field/orange_force_field_up_west.json +f9474a85beab6ba59a67a176848a8cc1fee29439 assets/twilightforest/models/block/force_field/orange_force_field_west.json +0e3808348485cd7a880c2f756b1bbedc839e7a3a assets/twilightforest/models/block/force_field/orange_force_field_west_no_down.json +cbb4afb895db0874650447d811b66ecbac166dfa assets/twilightforest/models/block/force_field/orange_force_field_west_no_north.json +c8d4e90ec7442d6a6fad86a2d598df6173bf02d9 assets/twilightforest/models/block/force_field/orange_force_field_west_no_south.json +3604bcf3064cf4dcef2aee58ed34da68fb60eccd assets/twilightforest/models/block/force_field/orange_force_field_west_no_up.json +848df3369c6578ef3ab8561724a9d521e9de44ca assets/twilightforest/models/block/force_field/pink_force_field_down.json +3c9c49fdec07e59b321e56d96d633ea304ffe942 assets/twilightforest/models/block/force_field/pink_force_field_down_east.json +2aba6c1b69f23ebc79eb03f544086d1e451adde9 assets/twilightforest/models/block/force_field/pink_force_field_down_no_east.json +1216ee3b361a2556db7c57c60d9bf618457d3e09 assets/twilightforest/models/block/force_field/pink_force_field_down_no_north.json +82ad2326a7c8d80377035c151ed655cf138fb473 assets/twilightforest/models/block/force_field/pink_force_field_down_no_south.json +a1945240a6dfc69e760916587220e05c61f692d5 assets/twilightforest/models/block/force_field/pink_force_field_down_no_west.json +2d2ff6068ba8cbdfc85f3ed55ad6027fab27dab3 assets/twilightforest/models/block/force_field/pink_force_field_down_north.json +c762901d39d1b142d8715133f396d9b4380c2749 assets/twilightforest/models/block/force_field/pink_force_field_down_south.json +8cf1391ccdf5a4122255503fb898114e65b4af2e assets/twilightforest/models/block/force_field/pink_force_field_down_west.json +330056eca979601ca162717e7a26fe5ffbf49242 assets/twilightforest/models/block/force_field/pink_force_field_east.json +39504ee5cee286e89adf01938d9bb572efe9c66e assets/twilightforest/models/block/force_field/pink_force_field_east_no_down.json +fb498028cfea820c4013a1021bc0ad840fe52d97 assets/twilightforest/models/block/force_field/pink_force_field_east_no_north.json +8c7cfad2c1a0656153350cf0bace0a5c4f4ddd77 assets/twilightforest/models/block/force_field/pink_force_field_east_no_south.json +085adbccb8031499bcfe689d8240ead315c1a458 assets/twilightforest/models/block/force_field/pink_force_field_east_no_up.json +ef7e50b2118fe53764c12462254ed50139f9a125 assets/twilightforest/models/block/force_field/pink_force_field_no_down.json +bbdc7176f6ce85de23e642d7581ec58ffaf8dc47 assets/twilightforest/models/block/force_field/pink_force_field_no_east.json +b47ba49be3d3d2bf8e9f22678debc1c94477b363 assets/twilightforest/models/block/force_field/pink_force_field_no_north.json +a4a4d6c02b9a62fe178de892b3fc00c461e9866b assets/twilightforest/models/block/force_field/pink_force_field_no_south.json +6e0ba73b2a6e2e590101531fc2237512f6c647c4 assets/twilightforest/models/block/force_field/pink_force_field_no_up.json +40981aa8b729629d56742a4d97047e0c7e66a781 assets/twilightforest/models/block/force_field/pink_force_field_no_west.json +9f201b69502d7cfffdc8e1828c51cbc74d0aa651 assets/twilightforest/models/block/force_field/pink_force_field_north.json +4c8b6efc6847fc875d30e965b157dbf3f172d689 assets/twilightforest/models/block/force_field/pink_force_field_north_east.json +84be35e732e27a924480ef342f337838e5187745 assets/twilightforest/models/block/force_field/pink_force_field_north_no_down.json +8bf7958f2fbd4f4919f268b807175e1931ea3395 assets/twilightforest/models/block/force_field/pink_force_field_north_no_east.json +a297b517caae489bcfa0f6a75849b6cb51f567ed assets/twilightforest/models/block/force_field/pink_force_field_north_no_up.json +c46d7f2979438c3d08a6e73c378f6b99667b1be3 assets/twilightforest/models/block/force_field/pink_force_field_north_no_west.json +537c72f3340f8eb3ccce81101f97dd84e4d9fba4 assets/twilightforest/models/block/force_field/pink_force_field_north_west.json +295423b71b09307aefcbe933e8967eac151ad362 assets/twilightforest/models/block/force_field/pink_force_field_south.json +0ccdfb213adf251d6e1c586de228527ae02d3720 assets/twilightforest/models/block/force_field/pink_force_field_south_east.json +7353f3f383407f807d2f54a494a2c9914f663b16 assets/twilightforest/models/block/force_field/pink_force_field_south_no_down.json +a8c6704613475e0e12fcb65a46ec03d3a31d779a assets/twilightforest/models/block/force_field/pink_force_field_south_no_east.json +336cd5e5687b161d99345a6c876f0a9a0af6be9b assets/twilightforest/models/block/force_field/pink_force_field_south_no_up.json +646d5dea9328357965701bcb52f18090347fbb1f assets/twilightforest/models/block/force_field/pink_force_field_south_no_west.json +c4a3a83504c73241072e9ca8370733b9bc94b6d2 assets/twilightforest/models/block/force_field/pink_force_field_south_west.json +66bacebcce5e86f1f84bc5ded679a63566e7e47d assets/twilightforest/models/block/force_field/pink_force_field_up.json +6ca93a5bb1ee2b8ca9bf8c0cf25fc412cc893564 assets/twilightforest/models/block/force_field/pink_force_field_up_east.json +6d07ad8e50fe849336cac3f85043b3b6adc03adb assets/twilightforest/models/block/force_field/pink_force_field_up_no_east.json +a48dc38e27330e6ea1cb0a010a71aa947de16435 assets/twilightforest/models/block/force_field/pink_force_field_up_no_north.json +08d3daf299bf32632e378e32eaedd0c4afecfe5b assets/twilightforest/models/block/force_field/pink_force_field_up_no_south.json +5142daad76ab15b8de59239551f669a53e6ca011 assets/twilightforest/models/block/force_field/pink_force_field_up_no_west.json +025adfad3c31775d3fe357427b3c4bb6742c7598 assets/twilightforest/models/block/force_field/pink_force_field_up_north.json +2fac02109b7532cb92d384b81968c923059be730 assets/twilightforest/models/block/force_field/pink_force_field_up_south.json +dc5eebac379a11621762b3ae32c9842a651ad307 assets/twilightforest/models/block/force_field/pink_force_field_up_west.json +09d3762c711cb35b32cc334b9b83c5b83f105536 assets/twilightforest/models/block/force_field/pink_force_field_west.json +36bd4c0ba294e2ab8a5dc854b33bd46d39134d7e assets/twilightforest/models/block/force_field/pink_force_field_west_no_down.json +6772ce41d1b54e442185108f103356c8d142c49b assets/twilightforest/models/block/force_field/pink_force_field_west_no_north.json +229f9f40f7feeb85147346335f353b4f0e30623d assets/twilightforest/models/block/force_field/pink_force_field_west_no_south.json +bbe2f74d315824900ef677379e9aa884ff6c7aac assets/twilightforest/models/block/force_field/pink_force_field_west_no_up.json +bcd216f57c34a964d60d9f9b522616c85fc9cd8e assets/twilightforest/models/block/force_field/violet_force_field_down.json +1d45d0293f2c6f71f137f7fc499594c7e43279af assets/twilightforest/models/block/force_field/violet_force_field_down_east.json +21a1280eb3371f476aef6e79ca6e740375d9efb7 assets/twilightforest/models/block/force_field/violet_force_field_down_no_east.json +3437c9461206155d64f0af01ba2801fcce5e1137 assets/twilightforest/models/block/force_field/violet_force_field_down_no_north.json +ccb138f2dcb07e0e8fdbacf341cf24d4460d40b4 assets/twilightforest/models/block/force_field/violet_force_field_down_no_south.json +9ea7198ffeb857af3c625bec0c29d52a38f84ff6 assets/twilightforest/models/block/force_field/violet_force_field_down_no_west.json +cdc00e4ed7085702f3717893dedb5cbc6d4a2041 assets/twilightforest/models/block/force_field/violet_force_field_down_north.json +976f5b5ebf941fe143e5b2ffee681acf005adfe8 assets/twilightforest/models/block/force_field/violet_force_field_down_south.json +ebdd7f1baef56c09786cb81b1fecdb5e2a31d447 assets/twilightforest/models/block/force_field/violet_force_field_down_west.json +0f360b12d0c4b72bbc5c717856269da592aa1299 assets/twilightforest/models/block/force_field/violet_force_field_east.json +2a906859b972cac35b9e3fdcf58836e6c68ad07b assets/twilightforest/models/block/force_field/violet_force_field_east_no_down.json +0f1d885c49e5e9c71464a2012b9ad51acdc57da1 assets/twilightforest/models/block/force_field/violet_force_field_east_no_north.json +c977405d9491a3501eb18e1273f4b1df9f9f9210 assets/twilightforest/models/block/force_field/violet_force_field_east_no_south.json +8e3820ce35a66ef757ea4279482220b65fc40324 assets/twilightforest/models/block/force_field/violet_force_field_east_no_up.json +421ea12c88f04f988afdc5ce89f75f3eb76068d7 assets/twilightforest/models/block/force_field/violet_force_field_no_down.json +c68b090f13d2e4704da790343301e76fb67656c0 assets/twilightforest/models/block/force_field/violet_force_field_no_east.json +0a29a14fa72e37529146a129e061864407e8cfdb assets/twilightforest/models/block/force_field/violet_force_field_no_north.json +1f035c066583f2c199d6cdd5a835757ea101887b assets/twilightforest/models/block/force_field/violet_force_field_no_south.json +0aa734916ea9b825650b83374b0fb091726a739f assets/twilightforest/models/block/force_field/violet_force_field_no_up.json +0cb4d2df90b98193a00a4d22566028072ad1c05b assets/twilightforest/models/block/force_field/violet_force_field_no_west.json +e357b6ec1a8206e2071e4c4242a017da4d4697ce assets/twilightforest/models/block/force_field/violet_force_field_north.json +0193bfa09d040972093fe5ab410a26c1db56a0fe assets/twilightforest/models/block/force_field/violet_force_field_north_east.json +cc32adc9b96ce03019e96b789fc3f85119868c08 assets/twilightforest/models/block/force_field/violet_force_field_north_no_down.json +159b46fc28c6042a8167a3ced0dec73e2aa14a5b assets/twilightforest/models/block/force_field/violet_force_field_north_no_east.json +bfec49818640e32819f5fc3e839afce7e1571def assets/twilightforest/models/block/force_field/violet_force_field_north_no_up.json +00149a5defad3c3501f2db5dfcb9884fdc1ff18e assets/twilightforest/models/block/force_field/violet_force_field_north_no_west.json +19246bd8b016b0d95b9e2c32c398d243376c67e0 assets/twilightforest/models/block/force_field/violet_force_field_north_west.json +e6219b85fad9127e8293e2e883aba8cfb01c6ecc assets/twilightforest/models/block/force_field/violet_force_field_south.json +1bdc20675adc58fbbe387a4a637d0b8d1c103806 assets/twilightforest/models/block/force_field/violet_force_field_south_east.json +7edb6c15122081b30e9037bf83da93d6a53e7890 assets/twilightforest/models/block/force_field/violet_force_field_south_no_down.json +6901b02c31f07366e2622b30ece5eb3cbf038459 assets/twilightforest/models/block/force_field/violet_force_field_south_no_east.json +9e07f0bb9271d6a95ba38c526b490a01c0a13876 assets/twilightforest/models/block/force_field/violet_force_field_south_no_up.json +bafe38a8ec564b8f829fa201c27cab3c595be487 assets/twilightforest/models/block/force_field/violet_force_field_south_no_west.json +c77b9ba3224b60aa9c225adbd6764ef99196c42e assets/twilightforest/models/block/force_field/violet_force_field_south_west.json +d1aca8aad7949df474116f9c1d53299f401e259c assets/twilightforest/models/block/force_field/violet_force_field_up.json +6667e6502d8321b2c38388e0d05b6317ca17260e assets/twilightforest/models/block/force_field/violet_force_field_up_east.json +14df9a22a93d59172bc3d5fc0cd3abf56216a675 assets/twilightforest/models/block/force_field/violet_force_field_up_no_east.json +a6b958ad86bc109237dc80a491bfcfdd01ca5669 assets/twilightforest/models/block/force_field/violet_force_field_up_no_north.json +8ecb339e38cce4eb1800f4e2d5ceeb671fb85e17 assets/twilightforest/models/block/force_field/violet_force_field_up_no_south.json +81cd91e8f341ee42c068e6fae31aa39dd6c69480 assets/twilightforest/models/block/force_field/violet_force_field_up_no_west.json +3e2c6a89f48989a05ef07f52e96d2998a9dd6170 assets/twilightforest/models/block/force_field/violet_force_field_up_north.json +d58df59caf4c20ed99d43f97d68c313ca9263f52 assets/twilightforest/models/block/force_field/violet_force_field_up_south.json +a9036248cdfb1dba625ceac276f3a031419f6635 assets/twilightforest/models/block/force_field/violet_force_field_up_west.json +fa357ec0aed825d4ffea3af170ae05c09f589cab assets/twilightforest/models/block/force_field/violet_force_field_west.json +277b50837d5a95d6e4ea657907260581ecba4b8b assets/twilightforest/models/block/force_field/violet_force_field_west_no_down.json +98ccd4350f84bb800b3efd613087fb444e7fc56d assets/twilightforest/models/block/force_field/violet_force_field_west_no_north.json +21d88288cc1143a5de934c9169a02ecd5a597422 assets/twilightforest/models/block/force_field/violet_force_field_west_no_south.json +61b9200ce9b7fb8547d43ca376716e6a9b463f65 assets/twilightforest/models/block/force_field/violet_force_field_west_no_up.json +159ebf4c00565816efb4a67504ab7ce27cc4fd7a assets/twilightforest/models/block/ghast_trap.json +8890339bfadadda68450d185c4693b3e4e78c1b9 assets/twilightforest/models/block/ghast_trap_active.json +8131cc8202cea969d0e952ffdb3bc579ea15cf1d assets/twilightforest/models/block/giant_cobblestone.json +46a84d08b32ad27d7ed93d8a7652647bae77390d assets/twilightforest/models/block/giant_leaves.json +8202a432ba0a0376dfa93fdeb977bc411dfb5150 assets/twilightforest/models/block/giant_log.json +acbc4435a77a6b4d3f4a7e063224d5052ede2a31 assets/twilightforest/models/block/giant_obsidian.json +7057d96d897529b87e727d08dfe498d05367242b assets/twilightforest/models/block/green_thorns.json +d8f4bbc8889aec16292774a1548cded7fdc9a9b9 assets/twilightforest/models/block/green_thorns_bottom.json +322f7cd4e7e179f38597e6cf1dfac8eb1ec5fdb3 assets/twilightforest/models/block/green_thorns_no_section.json +ea98fc47eb531f525edcf24d6d8955d24b70e1a9 assets/twilightforest/models/block/green_thorns_no_section_alt.json +3fc2c2c7c7506fdf562c6cdd5fecc9d58973b297 assets/twilightforest/models/block/green_thorns_thorns.json +e221514a37933ab9e92d605c246c3e54d55f31e9 assets/twilightforest/models/block/green_thorns_top.json +ff73cf220e6bec60699a36e7d250d62b92e4e4d0 assets/twilightforest/models/block/hardened_dark_leaves.json +f8e294e138e4b799803977718ce11ff07f04efb2 assets/twilightforest/models/block/hedge.json +48786d9c139433bba4a3f0bc86bbac222e70a922 assets/twilightforest/models/block/hedge_rose.json +9197c9f2f82789c43f6f391d2da2bf65eb598d5d assets/twilightforest/models/block/hollow_acacia_log_climbable_ladder.json +c4f393dba58344cea76f2ecf6b34fb9c1d805554 assets/twilightforest/models/block/hollow_acacia_log_climbable_vine.json +af5ea0fed84340f72eba42cd9284c508dfc950bd assets/twilightforest/models/block/hollow_acacia_log_horizontal.json +4e8de362af88c8858a04c0d6586f547d5c201590 assets/twilightforest/models/block/hollow_acacia_log_horizontal_moss.json +e335a8bb16a397e7ccf0bc9eb23d745f8a44e1f3 assets/twilightforest/models/block/hollow_acacia_log_horizontal_moss_grass.json +2c5d05568c64aa26b55f1ef75b773c00eba06324 assets/twilightforest/models/block/hollow_acacia_log_horizontal_snow.json +4129c583a64652623e8335201beb939a0244bac0 assets/twilightforest/models/block/hollow_acacia_log_vertical.json +fbe6eecb08261256718456f45210a5193992d0e2 assets/twilightforest/models/block/hollow_birch_log_climbable_ladder.json +7792a41813fb88a1a0959f80c394f159b6688787 assets/twilightforest/models/block/hollow_birch_log_climbable_vine.json +597bf203bc9513be92ab5a4dd2f57b0e0514a6d7 assets/twilightforest/models/block/hollow_birch_log_horizontal.json +27293ce35b2d5065a1b33ab0b28fe1a99307c15b assets/twilightforest/models/block/hollow_birch_log_horizontal_moss.json +c9aea80da316abe4c264e24cc047b6fa0b5708b7 assets/twilightforest/models/block/hollow_birch_log_horizontal_moss_grass.json +33f328bef8de24511f522b87d973f1df4d743473 assets/twilightforest/models/block/hollow_birch_log_horizontal_snow.json +f42930bf3fc950d6dbaefc5c7b0957043889e5b3 assets/twilightforest/models/block/hollow_birch_log_vertical.json +ff05e49b9526e74dd2e8e9561f57cfad5a383727 assets/twilightforest/models/block/hollow_canopy_log_climbable_ladder.json +7b1771951efaf6cf966c372ec78734ef1dd25abe assets/twilightforest/models/block/hollow_canopy_log_climbable_vine.json +8cef4ff7a7dc8351c0b80126948b044cb57a09ac assets/twilightforest/models/block/hollow_canopy_log_horizontal.json +37fa6dc65e8bdf0304a1a455e1058936eab05f5c assets/twilightforest/models/block/hollow_canopy_log_horizontal_moss.json +41aa2cbe5c3379d5934065b330ec7b781b8b379d assets/twilightforest/models/block/hollow_canopy_log_horizontal_moss_grass.json +6565d3c97c8bfb28f8a52a25e6bb31c71aaec06d assets/twilightforest/models/block/hollow_canopy_log_horizontal_snow.json +fce3b5e320702e16a0a8b8dac3c4e43f92790639 assets/twilightforest/models/block/hollow_canopy_log_vertical.json +06445d29755e73b9f09df86ce90eb5225f52c7c6 assets/twilightforest/models/block/hollow_crimson_stem_climbable_ladder.json +30c270166af0f6813bf38f1bfa5efac93093a625 assets/twilightforest/models/block/hollow_crimson_stem_climbable_vine.json +f3be78ad00ca1edecadaeee8b4519e22e90e5702 assets/twilightforest/models/block/hollow_crimson_stem_horizontal.json +936a65c61f28056b95eaa18f150dad6686a4667c assets/twilightforest/models/block/hollow_crimson_stem_horizontal_moss.json +badfebf39d681f987d052fd6f20e65d9467b2a9e assets/twilightforest/models/block/hollow_crimson_stem_horizontal_moss_grass.json +0aa64eaf4dbcaca686a0c600d560cac84946d433 assets/twilightforest/models/block/hollow_crimson_stem_horizontal_snow.json +83887cb797c207dea6e69699fc6567e7f5c41548 assets/twilightforest/models/block/hollow_crimson_stem_vertical.json +8f0278b73c90c84ada540eeb94fd993829e7abcb assets/twilightforest/models/block/hollow_dark_log_climbable_ladder.json +769c2fd8986e81dbbdf10aaa65ffb65ee0fdd2f3 assets/twilightforest/models/block/hollow_dark_log_climbable_vine.json +7676dee6657f4644242eab811fda2229b7c81ecc assets/twilightforest/models/block/hollow_dark_log_horizontal.json +a534076f0c201385d5f35694986540d2c408e321 assets/twilightforest/models/block/hollow_dark_log_horizontal_moss.json +c55bbd06b91dd2ca50805e4d3c85c6517a614f0c assets/twilightforest/models/block/hollow_dark_log_horizontal_moss_grass.json +d4049eae7e50a66b2b91461e09361723066f6e23 assets/twilightforest/models/block/hollow_dark_log_horizontal_snow.json +2279c1a859b360ab8cf52c505235e3f3b44a9e39 assets/twilightforest/models/block/hollow_dark_log_vertical.json +085c0d6ca15d0536b77c7498ad8bca99c2f59d11 assets/twilightforest/models/block/hollow_dark_oak_log_climbable_ladder.json +24f6634b8bca916b430ced9c4d2aef5838a8de89 assets/twilightforest/models/block/hollow_dark_oak_log_climbable_vine.json +1fb7517d6c8f2050e7ea11976f635408c581d4d0 assets/twilightforest/models/block/hollow_dark_oak_log_horizontal.json +4cafcc6d8503b271bed38c8e408b1f37ec45005d assets/twilightforest/models/block/hollow_dark_oak_log_horizontal_moss.json +bfc88640d87716eb0080acbc53d761dc25549087 assets/twilightforest/models/block/hollow_dark_oak_log_horizontal_moss_grass.json +e1e3028abcb1c73278ce9b91613ecab8f8ab0d11 assets/twilightforest/models/block/hollow_dark_oak_log_horizontal_snow.json +920398efad09d72c8250f8bfe9c29a3a5c489879 assets/twilightforest/models/block/hollow_dark_oak_log_vertical.json +4d5c9e26e8703351bb69a81a6ad563a15585e14b assets/twilightforest/models/block/hollow_jungle_log_climbable_ladder.json +3ba92aae11e79bc6908f6c5641ea040ffbd19525 assets/twilightforest/models/block/hollow_jungle_log_climbable_vine.json +fd36cd1548cbba7231909348555cf6e0c1a637f6 assets/twilightforest/models/block/hollow_jungle_log_horizontal.json +52dffe2c677e9ee4d55dea904254cbaeb848b5ef assets/twilightforest/models/block/hollow_jungle_log_horizontal_moss.json +05acb8afe0e5b5717731573b204468e79a249c26 assets/twilightforest/models/block/hollow_jungle_log_horizontal_moss_grass.json +8e755b90085f0ede1335dcb7999f59c03d8b1d32 assets/twilightforest/models/block/hollow_jungle_log_horizontal_snow.json +001287c5ac8a7e6e85a22eace3549de3b6c68b32 assets/twilightforest/models/block/hollow_jungle_log_vertical.json +10331fbaeae6bc37161a5f7cf26d0a65da22aa2d assets/twilightforest/models/block/hollow_log_moss.json +b4d07dc18b0f201529a6462f3e40db4d6597f391 assets/twilightforest/models/block/hollow_log_moss_grass.json +6cc2b58eaeb777a62999bed87306d78659cb8a91 assets/twilightforest/models/block/hollow_log_snow.json +c251aa0da85bcd4776de66ee170d675e9eda0495 assets/twilightforest/models/block/hollow_mangrove_log_climbable_ladder.json +002ffb19f3b6cd50c75c1d004cba7752727a712e assets/twilightforest/models/block/hollow_mangrove_log_climbable_vine.json +b8c9e7bef45dca0b4f21af26b2ccdc154db48184 assets/twilightforest/models/block/hollow_mangrove_log_horizontal.json +0843f716c7f3c1ac3b69c5f6505c14a3dc6ed1a1 assets/twilightforest/models/block/hollow_mangrove_log_horizontal_moss.json +b3e230fb6862d64b75c94d858ca640974e3a9a8f assets/twilightforest/models/block/hollow_mangrove_log_horizontal_moss_grass.json +2d01935c4cca7e24d0b6a404ac24aec67d9ec6ac assets/twilightforest/models/block/hollow_mangrove_log_horizontal_snow.json +717ab884549bec25ad58e00b07ce5287bd11447e assets/twilightforest/models/block/hollow_mangrove_log_vertical.json +fec71246bb95ac09b61801c48460bf5004c9259e assets/twilightforest/models/block/hollow_mining_log_climbable_ladder.json +2055eb0817d0819501c8f874b197ca134cf0c139 assets/twilightforest/models/block/hollow_mining_log_climbable_vine.json +c191e037a2aa63e35a7bfa33f89919a509395e7a assets/twilightforest/models/block/hollow_mining_log_horizontal.json +f109f2b4e06273656330d92a140d392b7faeb9f6 assets/twilightforest/models/block/hollow_mining_log_horizontal_moss.json +845e6cbe652a885a36ffbdc497414416a8666c88 assets/twilightforest/models/block/hollow_mining_log_horizontal_moss_grass.json +ddbc15ac15ae7b6ae1857b8bf1cc07d66e64aeb5 assets/twilightforest/models/block/hollow_mining_log_horizontal_snow.json +a5886d1d2ea3b1a71e1d58e9b0c9c8330a3228e9 assets/twilightforest/models/block/hollow_mining_log_vertical.json +adb9884d8b90c38481d1fce26673df0aec46a05d assets/twilightforest/models/block/hollow_oak_log_climbable_ladder.json +393d866d2b3ac75458a715c9841b3af2b4754b17 assets/twilightforest/models/block/hollow_oak_log_climbable_vine.json +2d0c08ba99c03738bed0a8d8942c90654de2b360 assets/twilightforest/models/block/hollow_oak_log_horizontal.json +d4831d4714b083f642654c1322c65d46a846a4c2 assets/twilightforest/models/block/hollow_oak_log_horizontal_moss.json +435ed63bd8e91cdd827ae84b76155c4e52d8c373 assets/twilightforest/models/block/hollow_oak_log_horizontal_moss_grass.json +b4791fbedc961af080e19015239e4b21f18e4bac assets/twilightforest/models/block/hollow_oak_log_horizontal_snow.json +ef13fe5b0f12d37c7080b86e4bfc2ee11c21993d assets/twilightforest/models/block/hollow_oak_log_vertical.json +7017130c573b1aed43467e786705d439c6647686 assets/twilightforest/models/block/hollow_oak_sapling.json +7d3362a49ea7351650d1716f62307da6ede8a709 assets/twilightforest/models/block/hollow_sorting_log_climbable_ladder.json +b9366cbce411c36d30ea3d5c7f53dc57af969001 assets/twilightforest/models/block/hollow_sorting_log_climbable_vine.json +37fa81f7cd092e4962028dafcf9ce86f24d6c657 assets/twilightforest/models/block/hollow_sorting_log_horizontal.json +376d5b0a2a35590a6d06bbaf4fa1a5ee3ac9b077 assets/twilightforest/models/block/hollow_sorting_log_horizontal_moss.json +d765b0c3d7e9601ecb689f9472bc809d9e0b56bc assets/twilightforest/models/block/hollow_sorting_log_horizontal_moss_grass.json +6d333065d8dc7bca9bb9ac5b037044e90cdf5695 assets/twilightforest/models/block/hollow_sorting_log_horizontal_snow.json +ff3eb8b035a213dbc89565dc5a7b64525a737148 assets/twilightforest/models/block/hollow_sorting_log_vertical.json +0dfea33468445bf5f160e6b177777ebd0d04fec0 assets/twilightforest/models/block/hollow_spruce_log_climbable_ladder.json +58fadacc4e59faa3d01ad239322b05ec019ee444 assets/twilightforest/models/block/hollow_spruce_log_climbable_vine.json +6ee8e3a45ba3fef23595a999607a4fed2c0d64ce assets/twilightforest/models/block/hollow_spruce_log_horizontal.json +1fbad95657599387ea6789cc23e651adaed70394 assets/twilightforest/models/block/hollow_spruce_log_horizontal_moss.json +91ee2d574d6654a547394e73525aa660e494296f assets/twilightforest/models/block/hollow_spruce_log_horizontal_moss_grass.json +009db1092d12a41aa84c5816bcd48a2e442e2f89 assets/twilightforest/models/block/hollow_spruce_log_horizontal_snow.json +e7079c68b423bb5d24e120156df772f097aa364c assets/twilightforest/models/block/hollow_spruce_log_vertical.json +fda9bd03b8ed67bb99568498a9c13235456eb290 assets/twilightforest/models/block/hollow_time_log_climbable_ladder.json +25667da827bd84fa0d2103e9a8070b6a12e35cec assets/twilightforest/models/block/hollow_time_log_climbable_vine.json +029c8eb7464d86bef91a5aea7cd90149a8f080af assets/twilightforest/models/block/hollow_time_log_horizontal.json +1cccc49bda456d28042aa82135c9b22a57f55281 assets/twilightforest/models/block/hollow_time_log_horizontal_moss.json +5e832a82dedfc43a1c2713d5042336e7c7dabe81 assets/twilightforest/models/block/hollow_time_log_horizontal_moss_grass.json +c939a1c4f094f16f82c478da1bf3540c42eca066 assets/twilightforest/models/block/hollow_time_log_horizontal_snow.json +70aa40720c905c6f7f431fa0174cc141c5ef6707 assets/twilightforest/models/block/hollow_time_log_vertical.json +c28ca0f959a71efef333c36c76fd5bf23ac84a0c assets/twilightforest/models/block/hollow_transformation_log_climbable_ladder.json +df21d6e90ec6b79140c0b16987a12472b7fa2190 assets/twilightforest/models/block/hollow_transformation_log_climbable_vine.json +4f5122a80917c8269e83a3076af0ae783ecb5c39 assets/twilightforest/models/block/hollow_transformation_log_horizontal.json +81713c772da6da039d9920525f886cac591c9a83 assets/twilightforest/models/block/hollow_transformation_log_horizontal_moss.json +a4b58f520c497a0dd30477547ec2aca0e43a9abc assets/twilightforest/models/block/hollow_transformation_log_horizontal_moss_grass.json +276965d20cb584dfa7ee7e88ba808cba27011d76 assets/twilightforest/models/block/hollow_transformation_log_horizontal_snow.json +893fa3b4c4115888b6423a27e14e446960bad577 assets/twilightforest/models/block/hollow_transformation_log_vertical.json +ed4344ea105cfceac8e201b75b65fd01f025153a assets/twilightforest/models/block/hollow_twilight_oak_log_climbable_ladder.json +b396dd509cb8f9bb59b3b454a28a8c2330344fee assets/twilightforest/models/block/hollow_twilight_oak_log_climbable_vine.json +5025ede0a6e837cd5632db898a08f6fcf9548d4d assets/twilightforest/models/block/hollow_twilight_oak_log_horizontal.json +c289304fca8f3be3ff11cac471a8d75c7e37998f assets/twilightforest/models/block/hollow_twilight_oak_log_horizontal_moss.json +65897c548bee238240c5a9394b3aa2ae92a3ef4a assets/twilightforest/models/block/hollow_twilight_oak_log_horizontal_moss_grass.json +f44bd97b54654b5c7656820abb5f3a9f621d4e23 assets/twilightforest/models/block/hollow_twilight_oak_log_horizontal_snow.json +80017dde48da6f468ab8c976b84369d8030c4c2e assets/twilightforest/models/block/hollow_twilight_oak_log_vertical.json +cf2d97b0cbb53c122d847b998eb9a73ff63d5796 assets/twilightforest/models/block/hollow_vangrove_log_climbable_ladder.json +a000dbb953ce03bf7ccb56923c1f27b8c332fd96 assets/twilightforest/models/block/hollow_vangrove_log_climbable_vine.json +632e48e1e71f06d0bdfc6df1553227038f05a3fb assets/twilightforest/models/block/hollow_vangrove_log_horizontal.json +9311f81a5c1921bff770fc22608090e6d4b3342e assets/twilightforest/models/block/hollow_vangrove_log_horizontal_moss.json +50bcb7c2f4fc4861b670a6194518e5eb39d07288 assets/twilightforest/models/block/hollow_vangrove_log_horizontal_moss_grass.json +03cb0b52113449a9bb1b3001dc0d736073a58e41 assets/twilightforest/models/block/hollow_vangrove_log_horizontal_snow.json +2327451aff7c33da5d4b0eda4fac7a8ee0394fbf assets/twilightforest/models/block/hollow_vangrove_log_vertical.json +2998eefaf48b199118c3cb3e369041e1555a6765 assets/twilightforest/models/block/hollow_warped_stem_climbable_ladder.json +34ba0a99543fc5c4f6389a4eb4f4a73563747f65 assets/twilightforest/models/block/hollow_warped_stem_climbable_vine.json +7cf3877b189cc7644c7c561e39d5b1e8ca0eedb0 assets/twilightforest/models/block/hollow_warped_stem_horizontal.json +67b3948289ad47548a18ff63bce7b14049dd0498 assets/twilightforest/models/block/hollow_warped_stem_horizontal_moss.json +c6c8e63dde8a56fe507319089bf4e16cd6adf8e7 assets/twilightforest/models/block/hollow_warped_stem_horizontal_moss_grass.json +a463c9a73b5c7527af746c75a004fb6ffa79da94 assets/twilightforest/models/block/hollow_warped_stem_horizontal_snow.json +74328d19746c45f33659fcaa7a8c514813c7e6e9 assets/twilightforest/models/block/hollow_warped_stem_vertical.json +2f97aaccbec93404c93b6bc5dd589281fcbbbdb3 assets/twilightforest/models/block/horizontal_hollow_log.json +e2d4d04c6e8e2cbb14e929dbf99b0c402c29772e assets/twilightforest/models/block/horizontal_hollow_log_carpet.json +e1d2288ae8fea0bca861fbaf0016ea8b928a533c assets/twilightforest/models/block/horizontal_hollow_log_plant.json +69eb661eedf8a96200ce826981b70c9325c99854 assets/twilightforest/models/block/huge_lily_pad_0.json +a97d4fd8c0db1dc6c0b54b14982b421955cb4388 assets/twilightforest/models/block/huge_lily_pad_1.json +3257a96714d6054255ab9536d29b2370f1183651 assets/twilightforest/models/block/huge_lily_pad_2.json +34dbf7bece45c629b5ef987255b5c3148916dfb3 assets/twilightforest/models/block/huge_lily_pad_3.json +86a998be60e8e5c8f5da247265201f8e645ba8f9 assets/twilightforest/models/block/huge_mushgloom_inside.json +a66d866230aebb38be7b43e18ce6e9d9db278877 assets/twilightforest/models/block/huge_mushgloom_outside.json +86a998be60e8e5c8f5da247265201f8e645ba8f9 assets/twilightforest/models/block/huge_mushgloom_stem_inside.json +4c3a3dc569b4f4df80274019e71e7dbc0014bca2 assets/twilightforest/models/block/huge_mushgloom_stem_outside.json +3987819dc50ed72e9bf7f59d6de17203530c473f assets/twilightforest/models/block/huge_stalk.json +b4219d75eaeebeec715f400f5cb236f5f6c17671 assets/twilightforest/models/block/huge_stalk_horizontal.json +9f289229303726806bcff43120e2657277329d10 assets/twilightforest/models/block/huge_water_lily.json +393ec88fee5f931c79d3149aaf5812e88ddecc53 assets/twilightforest/models/block/infested_towerwood.json +b33213c330b19add4bbd72e0c28a659f3fa385f4 assets/twilightforest/models/block/infested_towerwood_flipped.json +8214cefd49f6a6ca9ccc96e3b02149e051f70762 assets/twilightforest/models/block/ironwood_block.json +da0bccb2705fa0306e7c0f57221137f2e721975a assets/twilightforest/models/block/keepsake_casket.json +7043b15a78685243835fc2861e5832db90d4e6e2 assets/twilightforest/models/block/liveroot_block.json +f2ca774477904aecafee7754543c5891093d252f assets/twilightforest/models/block/locked_vanishing_block.json +ebb9f6ef9af07fb5a014770b2d85f684187ef312 assets/twilightforest/models/block/locked_vanishing_block_unlocked.json +e68d46289ad528d16532b74dcb24779a28718aa7 assets/twilightforest/models/block/mangrove_chest.json +1f291b6bd1242c84ef04fea55c0b5cdd7c4444de assets/twilightforest/models/block/mangrove_leaves.json +1a778ad5a91d27be58f2084e42c40a9ec41899cd assets/twilightforest/models/block/mangrove_log.json +5288e7bd4936e048a1c15a3e4a1a6b8b897d2e9c assets/twilightforest/models/block/mangrove_log_horizontal.json +f0c74a7befe556bdc0ccee016eb95d467708711a assets/twilightforest/models/block/mangrove_root.json +8ec42c0347ab17a86090ad183a87ab7bed728365 assets/twilightforest/models/block/mangrove_sapling.json +e68d46289ad528d16532b74dcb24779a28718aa7 assets/twilightforest/models/block/mangrove_sign.json +e68d46289ad528d16532b74dcb24779a28718aa7 assets/twilightforest/models/block/mangrove_wall_sign.json +9b9963a7f2560a12d25c3a70561c8ecb0477abbf assets/twilightforest/models/block/mangrove_wood.json +92853f556bbd7c21941176ea840b5d1f47049b13 assets/twilightforest/models/block/mangrove_wood_horizontal.json +4995f7ce3c51e4ca5849be6a342dc4f7bae1d0e8 assets/twilightforest/models/block/mazestone.json +ce33f80495f2f0bbad3203e1547cf4124e66f15e assets/twilightforest/models/block/mazestone_border.json +05513204303ea191a74a47714665d1d52e9b35a3 assets/twilightforest/models/block/mazestone_brick.json +326a7eb2700ebc7478f70ed50a2807bf317d79fc assets/twilightforest/models/block/mazestone_mosaic.json +d3bb893370bd03b2b42c768042bb73cf4e28a014 assets/twilightforest/models/block/mining_chest.json +26c42ba3b791e597b7c1144c0bb6d7837316f587 assets/twilightforest/models/block/mining_leaves.json +efc73cc8fa5771fdd4c0e954ddd3c7bf4dac269c assets/twilightforest/models/block/mining_log.json +ffcba12dbd958937d12018976ef8e0e99d8d7bc1 assets/twilightforest/models/block/mining_log_core.json +d91d34f5af3408fbd9a375ddab8df97be64ed62b assets/twilightforest/models/block/mining_log_core_on.json +e6228c69e2cb3de7372e3d05b1c5500a82c8b9dc assets/twilightforest/models/block/mining_log_horizontal.json +4a6863ae022600c564d4ed353eab2daad998738e assets/twilightforest/models/block/mining_sapling.json +d3bb893370bd03b2b42c768042bb73cf4e28a014 assets/twilightforest/models/block/mining_sign.json +d3bb893370bd03b2b42c768042bb73cf4e28a014 assets/twilightforest/models/block/mining_wall_sign.json +3ae30b25522cd2970231d55a05f85914153d1581 assets/twilightforest/models/block/mining_wood.json +1ec6f5ad6b7827bc9f14f34cea329a4ac5b10faa assets/twilightforest/models/block/mining_wood_horizontal.json +9d7f647e9f1f988c576388a90d98569927846f24 assets/twilightforest/models/block/moonworm.json +319e3e41df47e5ac259896e4d2dad84ff82b501a assets/twilightforest/models/block/mossy_castle_brick.json +7affdc4e503690046a0bda4906c08dd4fcc1e8b3 assets/twilightforest/models/block/mossy_castle_brick_stairs.json +eb312a31fa8da435fff60acbbe2c59061d2e27d9 assets/twilightforest/models/block/mossy_castle_brick_stairs_inner.json +7b0bd126bf159ab9633c361dab8864b1fededd3d assets/twilightforest/models/block/mossy_castle_brick_stairs_outer.json +299ecb7c48b615dd988a6958d29ed48830741799 assets/twilightforest/models/block/mossy_etched_nagastone.json +f991f5fbfc4c4443135fc1787de905a64d5d52b6 assets/twilightforest/models/block/mossy_etched_nagastone_east.json +e3b73bad407949d3e369885cc872ac3ec0beb8e5 assets/twilightforest/models/block/mossy_etched_nagastone_north.json +7c4cfe57dd9b229a8f2bd205d24bd0bfd6ec62b8 assets/twilightforest/models/block/mossy_etched_nagastone_south.json +651496b64435332a90123d86a991b194fdf27a0f assets/twilightforest/models/block/mossy_etched_nagastone_up.json +714f33709e346448aad6d39e9281d70284d86af7 assets/twilightforest/models/block/mossy_etched_nagastone_west.json +24238b0aebba6df281f6cb8fff97c32075f2c371 assets/twilightforest/models/block/mossy_mazestone.json +fb0dd8135ad5b140c5a984881c01499c2a3db4f7 assets/twilightforest/models/block/mossy_nagastone_pillar.json +7616fbf68606060c362e6b7f4bc94e57460b1528 assets/twilightforest/models/block/mossy_nagastone_pillar_reversed.json +f1701fb1848f6510b9bb43c7a77576eaa68b278a assets/twilightforest/models/block/mossy_nagastone_stairs_left.json +7aa062c640dfdb49378c8d8f9135b7b72276db14 assets/twilightforest/models/block/mossy_nagastone_stairs_left_inner.json +d48dfecdf07848b8d8e8222d672d6aba07e08248 assets/twilightforest/models/block/mossy_nagastone_stairs_left_outer.json +227194d288bf5c164c1e37f11d318f56f2e45db4 assets/twilightforest/models/block/mossy_nagastone_stairs_right.json +ce82d61f8b17029dd47efc2bbab8f5752ee2f8df assets/twilightforest/models/block/mossy_nagastone_stairs_right_inner.json +e6fbe08eae2af4c7e5ac59255e168371a9fb5230 assets/twilightforest/models/block/mossy_nagastone_stairs_right_outer.json +17331088ebf418c0fd25b7c2e9149fdfc2e4d73e assets/twilightforest/models/block/mossy_towerwood.json +f4ee2fdd4122d309ac5ef053a79111990648b131 assets/twilightforest/models/block/mossy_towerwood_flipped.json +33d5ae1c13ae92090a05b6d3cf4085f10622408c assets/twilightforest/models/block/mossy_underbrick.json +c514e6fbc5d41498aaeb8008414596425b1dbf1f assets/twilightforest/models/block/mushgloom.json +8274ec20d898476a327009ffb7221ac404511a9e assets/twilightforest/models/block/nagastone.json +aa9c8d2a2bc8ae90a87934af98fe5687c9ca67a6 assets/twilightforest/models/block/nagastone_pillar.json +a5d262f5809673fc18032fb2eafe6aa67803a001 assets/twilightforest/models/block/nagastone_pillar_reversed.json +88cc298565b066495387113e6ed1a56a49747739 assets/twilightforest/models/block/nagastone_stairs_left.json +3c66d942831f60c9ef17e4fee8ebf1ce63cffc96 assets/twilightforest/models/block/nagastone_stairs_left_inner.json +e01f0fe0473be4717cae3f957b54af857df045ee assets/twilightforest/models/block/nagastone_stairs_left_outer.json +3a48beedada881a63c6a2d72b4d92e69991bb48f assets/twilightforest/models/block/nagastone_stairs_right.json +4e84d61a5d3e52e903382257a3a16f4a9b1fa20d assets/twilightforest/models/block/nagastone_stairs_right_inner.json +436e852eb2fcec4ca649fb381a721bbde194af66 assets/twilightforest/models/block/nagastone_stairs_right_outer.json +8e274932ac639c230412938fc414301b5fae454f assets/twilightforest/models/block/pillar_bottom_x.json +3afb5ec7f25a5364f3a00cec45ca0370dda9ce6d assets/twilightforest/models/block/pillar_bottom_y.json +562294210de01259608591d140ec0adcdf789b22 assets/twilightforest/models/block/pillar_bottom_z.json +02beafab5e2a4470f4609c28bd717a4dcf542762 assets/twilightforest/models/block/pillar_main_x.json +a614a27f259ff75a045b4c04e34dc90356ff4930 assets/twilightforest/models/block/pillar_main_y.json +0fcefba558cea7408a01577a380361ddc878aac6 assets/twilightforest/models/block/pillar_main_z.json +77842065da051aaffe5f0f464c149fd133e7299b assets/twilightforest/models/block/pillar_top_x.json +727a2d898a5d620578a41e1687143fa723888941 assets/twilightforest/models/block/pillar_top_y.json +19d15ecf662222326600447ffff340fd028feff0 assets/twilightforest/models/block/pillar_top_z.json +91cc0a52fa4c3a51d7ed4641d49a44fe2bc5466c assets/twilightforest/models/block/pink_castle_door.json +eca605b11f7f28fec1ac200e3fc9d80ec9dd8a7e assets/twilightforest/models/block/pink_castle_door_vanished.json +988edd84b7f8f27049b1c0597c4d2f66a0e8301d assets/twilightforest/models/block/potted_canopy_sapling.json +227418fee0a05e71334e4ad8e467a3a2ca9d85d0 assets/twilightforest/models/block/potted_darkwood_sapling.json +bffee8988b58e3e9a76250c996a8e777db78a2e8 assets/twilightforest/models/block/potted_fiddlehead.json +f2518bdfeeda7cd3539b4190a1c3363c43cef43b assets/twilightforest/models/block/potted_hollow_oak_sapling.json +6d882093cb44476fc24f370f1c073600126f3fde assets/twilightforest/models/block/potted_mangrove_sapling.json +29966e31c9b5d2d9f2b9a1c16a217fe6cc4f293d assets/twilightforest/models/block/potted_mining_sapling.json +6d91930000bfbc65a650b2901657c63f0a14874d assets/twilightforest/models/block/potted_mushgloom.json +5e1644cb8333dcef209453e3e12f781e4817ea9a assets/twilightforest/models/block/potted_rainbow_oak_sapling.json +05a22fa8644c2408e6ce41447ffa5c12c416f96a assets/twilightforest/models/block/potted_sorting_sapling.json +a9fb58a408d79162ff0c0d5abb2ced2ab0f166fb assets/twilightforest/models/block/potted_thorn.json +27f47c690645d9f74ad43b3a2f88e06948d9c4ec assets/twilightforest/models/block/potted_time_sapling.json +c2a7cd2152b20bd1c2e0deced7f5b349d3749729 assets/twilightforest/models/block/potted_transformation_sapling.json +4bd23e5c4ebba58f43f88c852dd56a8848a03647 assets/twilightforest/models/block/potted_twilight_oak_sapling.json +20a37c4aa6f4f5f3553f16959ba2c62ae798689a assets/twilightforest/models/block/rainbow_oak_leaves.json +8bd5239c5072f77539a40357736b47367a7484bd assets/twilightforest/models/block/rainbow_oak_sapling.json +52a1c823e31a3877bd39749b0ef104a3c5dffd4b assets/twilightforest/models/block/reactor_debris.json +6cf84faf0c9f9a152095e7d14205cb549c3ddad1 assets/twilightforest/models/block/reappearing_block.json +b9682bf600de52ae145e28f7b44a16f314bfabfb assets/twilightforest/models/block/reappearing_block_active.json +3e768ccc1d5fda17b9fc3afaa980e587a7a2d039 assets/twilightforest/models/block/reappearing_block_vanished.json +ba4e66b2089efd6c96c225058f7df6b9fa3ff9e5 assets/twilightforest/models/block/reappearing_block_vanished_active.json +9d7f647e9f1f988c576388a90d98569927846f24 assets/twilightforest/models/block/red_thread.json +1cf498908e2faa0c9f648013b26c477d382b25c1 assets/twilightforest/models/block/root.json +90f5aacf15e0b6d31622c680d5323a1941981426 assets/twilightforest/models/block/smoker.json +d518aca55dc8aad690c416b1704203c8445b19db assets/twilightforest/models/block/sorting_chest.json +c0d52bf365f8f24a2a2f40642d4ea8eec361022c assets/twilightforest/models/block/sorting_leaves.json +1bd3517d6a2f7438e30618820d0782bc778ed7d7 assets/twilightforest/models/block/sorting_log.json +9bbe5e5a62cdc38a6f8511c156a03bb9e4704f07 assets/twilightforest/models/block/sorting_log_core.json +075d1cc785a8294fbbc71b439c2284eeb9a024d4 assets/twilightforest/models/block/sorting_log_core_on.json +e85c24359b529f42e30ec55a0b5474d0fa9d9dd0 assets/twilightforest/models/block/sorting_log_horizontal.json +80dc05816e4075b26f47f2169f8bebc3fcdd8e0f assets/twilightforest/models/block/sorting_sapling.json +d518aca55dc8aad690c416b1704203c8445b19db assets/twilightforest/models/block/sorting_sign.json +d518aca55dc8aad690c416b1704203c8445b19db assets/twilightforest/models/block/sorting_wall_sign.json +2eedd26bc504355662ef20d9afb2ee6b99d87490 assets/twilightforest/models/block/sorting_wood.json +47988fd95571a3a69f8cb135ed9effd4716b02af assets/twilightforest/models/block/sorting_wood_horizontal.json +b56d9fb7d6c6de2d70da12d6f4b6b353240753a3 assets/twilightforest/models/block/steeleaf_block.json +a3a95698efdd99fd6c26e240f5bfd14745239d40 assets/twilightforest/models/block/stripped_canopy_log.json +043fe07072f207e3ceb36c12fee527d6d8b0e4c8 assets/twilightforest/models/block/stripped_canopy_log_horizontal.json +0b049acba8f501ad23fa66adcf3f823fe576c165 assets/twilightforest/models/block/stripped_canopy_wood.json +bc58d576bd46ee3216a6110205bcd6beebe5b99a assets/twilightforest/models/block/stripped_canopy_wood_horizontal.json +1a881064c8a895eef0dbe13dcc644ca575a0f5f9 assets/twilightforest/models/block/stripped_dark_log.json +e875dcdeda1755d2f494c02d6780e0c998c0a9dc assets/twilightforest/models/block/stripped_dark_log_horizontal.json +7959cde4e9fff07ed87623700c69599914092d76 assets/twilightforest/models/block/stripped_dark_wood.json +f7b0d379ee79b26f05adadfbe6384969f4c4154c assets/twilightforest/models/block/stripped_dark_wood_horizontal.json +8416328d50a3870fdae7fcd94a7b2e53cceb1c82 assets/twilightforest/models/block/stripped_mangrove_log.json +d995772a4666a787531cd25b0221e0688ece785a assets/twilightforest/models/block/stripped_mangrove_log_horizontal.json +3518a7f421fc90d8a2325e916a9f49f00c4fedb6 assets/twilightforest/models/block/stripped_mangrove_wood.json +1faa23cd72f148b3bd89ec17ab316f73f5e9a309 assets/twilightforest/models/block/stripped_mangrove_wood_horizontal.json +9f28ee80915cacb83b16691f3e100463ed8a7060 assets/twilightforest/models/block/stripped_mining_log.json +1101bf5e76b84ea3b3b7125502f8378f2fb04d62 assets/twilightforest/models/block/stripped_mining_log_horizontal.json +c4307e1f770d620e7637d0ff2723ffedcb1c9ede assets/twilightforest/models/block/stripped_mining_wood.json +d44b32ae92076ff6b17c6019e2a052f19500ea92 assets/twilightforest/models/block/stripped_mining_wood_horizontal.json +dc73664a0b34c1c781de67dddafbd6d8db7cc4b9 assets/twilightforest/models/block/stripped_sorting_log.json +a0d91fbd93f229f4b6223ffea77ff69cb5a8c8fa assets/twilightforest/models/block/stripped_sorting_log_horizontal.json +777c1141960f58e8243f915178f07650458b33b2 assets/twilightforest/models/block/stripped_sorting_wood.json +423cf077161332f448b2a5e0e3f30954b2310da4 assets/twilightforest/models/block/stripped_sorting_wood_horizontal.json +89121f67e195d98501e86f873ae9a93ba324cb07 assets/twilightforest/models/block/stripped_time_log.json +7246198f678fb47764aea551423f906f1ea27dc5 assets/twilightforest/models/block/stripped_time_log_horizontal.json +1e86956b7364a86210d6bd64ae7395016bb4c07a assets/twilightforest/models/block/stripped_time_wood.json +91febd2443d4772173f67e9bb16a18934db163b7 assets/twilightforest/models/block/stripped_time_wood_horizontal.json +0678c441ff364be02825078838192666954305fc assets/twilightforest/models/block/stripped_transformation_log.json +0e70f00092372063a4c46f948efff6a174a6930c assets/twilightforest/models/block/stripped_transformation_log_horizontal.json +ba050e72daf1356618f804691bd2f0eb507c3290 assets/twilightforest/models/block/stripped_transformation_wood.json +b901604b33816e3b2c05d24cff83d2817d335c83 assets/twilightforest/models/block/stripped_transformation_wood_horizontal.json +4ff0640b739f62952521efbb24acc8fba788293e assets/twilightforest/models/block/stripped_twilight_oak_log.json +36c1d27c7e89404a89b54fc2634556b655f2086e assets/twilightforest/models/block/stripped_twilight_oak_log_horizontal.json +3ca2eba98744ca40365a57c129ad498d3432ebac assets/twilightforest/models/block/stripped_twilight_oak_wood.json +0908256de986bd2f8f8e06012f9b763ef8e3fa26 assets/twilightforest/models/block/stripped_twilight_oak_wood_horizontal.json +f153e62aa31a962466b24920b3785085321be642 assets/twilightforest/models/block/stronghold_shield.json +595bcb64d52267ec38330737e610da0e178b6140 assets/twilightforest/models/block/thick_castle_brick.json +bd8ec10fba2faf5c43a345a3f6324458ffccf0aa assets/twilightforest/models/block/thorn_leaves.json +07c256196f3031213ab9a5ee3cae20f77cf82708 assets/twilightforest/models/block/thorn_rose.json +1710340d823d1855f86cec8488267b4d4d5899ad assets/twilightforest/models/block/time_chest.json +09bf870ddb3ae0f4225711afee714b9cc619c3a0 assets/twilightforest/models/block/time_leaves.json +d6fd1c256276de752510d2daff6bd231c4f60240 assets/twilightforest/models/block/time_log.json +4fb8f1db99ec95f03ed3244affbb6b17fc957d85 assets/twilightforest/models/block/time_log_core.json +ad366cdb2c4d40253ed6932c8d970dadda93e7b2 assets/twilightforest/models/block/time_log_core_on.json +8e71c9d31c4c5543d3bc9b32adbd7aabd68934ef assets/twilightforest/models/block/time_log_horizontal.json +81bf36fc0dee555da7c4aff3acd99763b65dcccf assets/twilightforest/models/block/time_sapling.json +1710340d823d1855f86cec8488267b4d4d5899ad assets/twilightforest/models/block/time_sign.json +1710340d823d1855f86cec8488267b4d4d5899ad assets/twilightforest/models/block/time_wall_sign.json +b1d8ae6177f43c03f108ca88e1e8fb4e5827ee4a assets/twilightforest/models/block/time_wood.json +6cf5af02d43974d0b512cb9640ffb0547f447851 assets/twilightforest/models/block/time_wood_horizontal.json +62389935f6f93810fa82e7b50f8a4077793d6e80 assets/twilightforest/models/block/torchberry_plant.json +dc70797a32a876d52b3029dadff20868f73529e4 assets/twilightforest/models/block/torchberry_plant_no_berries.json +fe2e0a67f4949e16b77b490571774c798f27e028 assets/twilightforest/models/block/towerwood.json +9d8857b8afa293e7c5242db4f357c7190b81acc6 assets/twilightforest/models/block/towerwood_flipped.json +3663d5f6305e0fc944e40e8d703fddbdeb48da5d assets/twilightforest/models/block/transformation_chest.json +be0e13b05ddad70a31b613a778a0be9f2013f564 assets/twilightforest/models/block/transformation_leaves.json +1f1ac9b689198d6dc152fd2d5e9517d159f79c5b assets/twilightforest/models/block/transformation_log.json +3d37c4a41e4e753e97dc6b3ec560e738aa4d8780 assets/twilightforest/models/block/transformation_log_core.json +7790f7cd8f8d85c32b17e38733b7ee6a5fc9e8ef assets/twilightforest/models/block/transformation_log_core_on.json +3a433974bccc3e77e9fd9194db1680755ee88a72 assets/twilightforest/models/block/transformation_log_horizontal.json +d02fc273e4b909739750aea865a75cebf1f69721 assets/twilightforest/models/block/transformation_sapling.json +3663d5f6305e0fc944e40e8d703fddbdeb48da5d assets/twilightforest/models/block/transformation_sign.json +3663d5f6305e0fc944e40e8d703fddbdeb48da5d assets/twilightforest/models/block/transformation_wall_sign.json +4b6a9d6130919d1d0379f6741be485725f05f224 assets/twilightforest/models/block/transformation_wood.json +f903c0f0a38d570f32e8d6cc7a4fc57cfc06cfcf assets/twilightforest/models/block/transformation_wood_horizontal.json +ea061c745bf9dddebf3bbd92fccf65bddbd85e3c assets/twilightforest/models/block/trollber.json +164b3216edcb2065d9c9add1370aaba79c7196f1 assets/twilightforest/models/block/trollsteinn_inside.json +4ae965c1ff8d93ea34612519560e7657812d00da assets/twilightforest/models/block/trollsteinn_outside.json +d3e81d2bcd5a79ac3837cdc9f080040565c7832e assets/twilightforest/models/block/trollvidr.json +7e21ad2e13ece0dfbef846e47b64a592def88e16 assets/twilightforest/models/block/trophy_pedestal.json +d356b62ca23839b0f0100d2a8eea30aa22af6635 assets/twilightforest/models/block/trophy_pedestal_1.json +d40beeb52b0d53f5a6bb59f2a23d308168e95c8a assets/twilightforest/models/block/trophy_pedestal_2.json +cd2accaf4cedce32a88692ae5e57efc7f5b4ed42 assets/twilightforest/models/block/trophy_pedestal_3.json +ee4e77d451ab99822b6977df816530d7e1ad3798 assets/twilightforest/models/block/trophy_pedestal_4.json +ee23d3297bf58d57fad9f6b6fe40a76122c26609 assets/twilightforest/models/block/trophy_pedestal_active.json +b0280a7c981b3318e7497437c6a3aaf23f43eb10 assets/twilightforest/models/block/trophy_pedestal_active_1.json +75adb17c8f569ac2d420af5f20919ee84bcf9efd assets/twilightforest/models/block/trophy_pedestal_active_2.json +c346a7a64fec72805a09e5b490dcc0ea0f3fca2e assets/twilightforest/models/block/trophy_pedestal_active_3.json +feaa569ceda87cd5cbeb5cdf4367b2991aa97ef1 assets/twilightforest/models/block/trophy_pedestal_active_4.json +53606a7d083459157ed76c3fd66da023efb451dd assets/twilightforest/models/block/twilight_oak_chest.json +20a37c4aa6f4f5f3553f16959ba2c62ae798689a assets/twilightforest/models/block/twilight_oak_leaves.json +ff5ffa661409624715ebe16b9469624e405f3c0e assets/twilightforest/models/block/twilight_oak_log.json +1c3c527fc5ed820a068e7432d1b1623e669adcb2 assets/twilightforest/models/block/twilight_oak_log_horizontal.json +a2da631152eb68d0659705d2f5ee20ec59857df3 assets/twilightforest/models/block/twilight_oak_sapling.json +53606a7d083459157ed76c3fd66da023efb451dd assets/twilightforest/models/block/twilight_oak_sign.json +6b0020137b3d62b2650042d215d47b2b00213ab8 assets/twilightforest/models/block/twilight_oak_wood.json +c9d11c3af39386b8ee8581e42b73a8516b823aef assets/twilightforest/models/block/twilight_oak_wood_horizontal.json +53606a7d083459157ed76c3fd66da023efb451dd assets/twilightforest/models/block/twilight_wall_sign.json +5190a18b4036ecbc6bae5018889bc307d6edd104 assets/twilightforest/models/block/twisted_stone.json +a0d307190f744a58bb9c10eade121d8536b747d4 assets/twilightforest/models/block/twisted_stone_horizontal.json +ba57f8d44fe69483a63b9caa74f7458fbac7458e assets/twilightforest/models/block/uberous_soil.json +d8100c3537117f20b8579d9806378bd73adc94a8 assets/twilightforest/models/block/uncrafting_table.json +013a8488177e00e81ff957b71780cb94eaa6254c assets/twilightforest/models/block/uncrafting_table_glowing.json +eed2392ad51a5d0a35fdd23fada77f8030c11b11 assets/twilightforest/models/block/underbrick.json +f9f6c8993506ac436f9365835657f29069519eab assets/twilightforest/models/block/underbrick_floor.json +4f1ad4e7f955eca4dc4f859337dcfd7a316ee84b assets/twilightforest/models/block/unripe_trollber.json +a8d477a0edde49bdbe449d5399b9bb01e40d3e29 assets/twilightforest/models/block/vanishing_block.json +b036bde5937dd00846abe473a9722879fa29d40d assets/twilightforest/models/block/vanishing_block_active.json +7d940a93f3577d8f92d28c0da5e508ff5e266544 assets/twilightforest/models/block/vertical_hollow_log.json +9b393a37c86c1674cb855a67b6308d95f376f97b assets/twilightforest/models/block/vertical_hollow_log_ladder.json +67f49900a6367f7e351988a8040aa0117f932ac9 assets/twilightforest/models/block/vertical_hollow_log_vine.json +91cc0a52fa4c3a51d7ed4641d49a44fe2bc5466c assets/twilightforest/models/block/violet_castle_door.json +eca605b11f7f28fec1ac200e3fc9d80ec9dd8a7e assets/twilightforest/models/block/violet_castle_door_vanished.json +4f03288755908f6f5e5ee47d3a1f7e6b35556dd2 assets/twilightforest/models/block/weathered_deadrock.json +aae3c42bc50afa1ec4f97c8cdf84e58e109b8a6e assets/twilightforest/models/block/wispy_cloud.json +f05dad705007ed1bf40f1bfd33b36ef95a7ba88f assets/twilightforest/models/block/wood/banister/acacia/acacia_banister_connected.json +5f4224f7d4c66563445d5796c5320505ca806c23 assets/twilightforest/models/block/wood/banister/acacia/acacia_banister_connected_extended.json +e641357d81d0db4714fed896ab2a9f065a26d0fe assets/twilightforest/models/block/wood/banister/acacia/acacia_banister_short.json +c9d852ebe0ef4b5f0761c1bca4baa3fb379c689a assets/twilightforest/models/block/wood/banister/acacia/acacia_banister_short_extended.json +41f677a1ec3a5a8d5f23a19102f9cb2fb36c4d26 assets/twilightforest/models/block/wood/banister/acacia/acacia_banister_tall.json +330170ffd35e9883c90256df6b5451923315b5f1 assets/twilightforest/models/block/wood/banister/acacia/acacia_banister_tall_extended.json +a80406b6f10ed730630cce44f1fff5f635420fc0 assets/twilightforest/models/block/wood/banister/birch/birch_banister_connected.json +ad1253493f05424be21c408de2ef1c49e4bb608a assets/twilightforest/models/block/wood/banister/birch/birch_banister_connected_extended.json +08fb51fe4662baa819f2b56be67824fcafb6bb66 assets/twilightforest/models/block/wood/banister/birch/birch_banister_short.json +fcb6ce40a91ccb555156b1c8a0fcd9d01356de1a assets/twilightforest/models/block/wood/banister/birch/birch_banister_short_extended.json +1f4815b512abe55b025b5cbe3ec580094f89503f assets/twilightforest/models/block/wood/banister/birch/birch_banister_tall.json +18766c8d26d7ba0ae13d6b17de869b8158b92d6e assets/twilightforest/models/block/wood/banister/birch/birch_banister_tall_extended.json +88a5cf32d176d2539c733b1d64cb1afeb44bb83b assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_connected.json +0d15968490b5772e18b6ce99c6c1b0352290e316 assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_connected_1.json +68a2bc44883e53ef61a124ec355db27a89b1d74c assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_connected_2.json +c67d6a703ea03906539e9876158f7b3e86a454ff assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_connected_3.json +01dba3196bc16f224eb7bce988deee1f2bb4fd70 assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_connected_extended.json +f5d2dc66940a4ca2fa6a64a0e9bdf3b20ab4f0b4 assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_connected_extended_1.json +6a2b7fb6588078f62dcfae46ce82c3c971b5fd89 assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_connected_extended_2.json +b03acaf3f6aaa47e1eeaeb77eaf18e58ad4f4a9b assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_connected_extended_3.json +dc2a4afdac1be83da2a36a31b819a200abaf174f assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_short.json +0670794cbdbaf3457915265234e71c0ae4aae6bb assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_short_1.json +d1180c1767c736f0d08d2d049871fe105dd59d3b assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_short_2.json +05ba49af11aecc2136b2843a1052b761f3817aa4 assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_short_3.json +e1bd65236e0a6244baeb570591a40e982e6c597f assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_short_extended.json +adecb6edbeb1e16f88ca2eec10533eca97897c67 assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_short_extended_1.json +4a23cc39ac047bfa10e75b4cf77bbc4d9630087d assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_short_extended_2.json +24b42cf5d453b65adda367b905e208656c6db467 assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_short_extended_3.json +f0d75975911be0effecb9c665c3c5f912dc52e63 assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_tall.json +fbf1f46499abc238f5b5afd0c0bf86125b818f22 assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_tall_1.json +524a2a954406556fbfc3e52db07d5c7ef6257af5 assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_tall_2.json +5874f06466fc6a09ebb8b257d8d1249c05d751fa assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_tall_3.json +55748548e4229e69f54007602339b27127a7a335 assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_tall_extended.json +9a8e3df97de2fdc50cb8a21806cf92f0babe8150 assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_tall_extended_1.json +8e58d1a4b86a8b3fc2d008e4a1dfe7f240546caf assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_tall_extended_2.json +292992ee051b9c33fc560e0f3ca13c7110dad220 assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_tall_extended_3.json +50869fd994edc71bf866be65080f1057d3bb1526 assets/twilightforest/models/block/wood/banister/crimson/crimson_banister_connected.json +79b9cdff2d7d176a8de575bee9e6f5cc1b7ba3f3 assets/twilightforest/models/block/wood/banister/crimson/crimson_banister_connected_extended.json +a6231204fb7cedf1ed204c8fd0e5bff3ebe6d850 assets/twilightforest/models/block/wood/banister/crimson/crimson_banister_short.json +395cce33c02c94c89dec973b008b4e4a4f76d28b assets/twilightforest/models/block/wood/banister/crimson/crimson_banister_short_extended.json +2c03f87c0d219d4969f27dfb3770d3245a7517b2 assets/twilightforest/models/block/wood/banister/crimson/crimson_banister_tall.json +6531feceb39ab2904500388561dd9a47438d5a56 assets/twilightforest/models/block/wood/banister/crimson/crimson_banister_tall_extended.json +e1264e788d7e7fc1f325a6427809c2ce537b3d18 assets/twilightforest/models/block/wood/banister/dark_oak/dark_oak_banister_connected.json +8253a7f1694165cee0aa9f32598b88ec053e6ada assets/twilightforest/models/block/wood/banister/dark_oak/dark_oak_banister_connected_extended.json +7cbec334e12de621e7fe33cc03e32d25caf8b952 assets/twilightforest/models/block/wood/banister/dark_oak/dark_oak_banister_short.json +0a0bf9053dc13fe96d732967e60c521ada1f3be2 assets/twilightforest/models/block/wood/banister/dark_oak/dark_oak_banister_short_extended.json +85365738809d84bf4c3dd0921d95be493ec27686 assets/twilightforest/models/block/wood/banister/dark_oak/dark_oak_banister_tall.json +dccfeadbe617c72dde0ffb4ba58d3fe358950e87 assets/twilightforest/models/block/wood/banister/dark_oak/dark_oak_banister_tall_extended.json +42ee9e2cb9a23162fc6c39aad42f3ccf7a391186 assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_connected.json +69974fae9a2c179d5a240751e244cf54d7a6b5d4 assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_connected_1.json +ab97290a481ab279b235961619dde411f2efcf6a assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_connected_2.json +7463f5cc523f420719256537e6b21881ff72e391 assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_connected_3.json +bc2d7411bcc0f9e8ea53872c431d2635b81a356b assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_connected_extended.json +40ca42159747d6457dd7cc42a28e5eb5f3954351 assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_connected_extended_1.json +ce9aef65e685cdbe0c25733cdc604ac5db5eb61e assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_connected_extended_2.json +5d8f7479a3f6e5acfbf9868d66424f8c7eed06f7 assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_connected_extended_3.json +d88c2cf3e93f9d984f0ae24febdb9dcd468e65fb assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_short.json +a128e3b0f60da87619b92836a33e86975381516e assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_short_1.json +c210c0794b1f45ed30bbda11c52de3eaee09eebc assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_short_2.json +5e25eae5a210cdad1e57786374714771774697bd assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_short_3.json +13d1de4c837803272e8ce84b4d880bc176f43ccc assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_short_extended.json +cc239e29633b4d934bb50b4535e328937fc8a537 assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_short_extended_1.json +fc1f4706de90e71cd539cfe1fdf4bcc078c5347d assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_short_extended_2.json +16b578444d6cb9f29bb8df5d2c37785b60bbd550 assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_short_extended_3.json +c1a6a05064a128ec48ae48576a7248a9a8fc0928 assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_tall.json +49388fa71fea33e0adb7458c4763a1ad6b32e57e assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_tall_1.json +2993cbdc7cca279dc415488212f4d213a716a427 assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_tall_2.json +c254af4c79720d1b41d5a1975733f833db5a850c assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_tall_3.json +8216d62ff559d4a317b53654dce8fbde48d87fae assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_tall_extended.json +6cc78b11e42419d01ce0107218b1cc704393dc49 assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_tall_extended_1.json +f472c22634bcb98dd0fb85429b586e44822e3166 assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_tall_extended_2.json +156c8b19417d9614f3be99eb51d14ad1c16f6ee4 assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_tall_extended_3.json +b220c01589249c51d4313ab65bb65646c8ebb5b6 assets/twilightforest/models/block/wood/banister/jungle/jungle_banister_connected.json +71a8a2612cf7bcc9ca455d940991e864c68b044e assets/twilightforest/models/block/wood/banister/jungle/jungle_banister_connected_extended.json +f8e6a9570639dc59ebcd2981321001f3fccbeb95 assets/twilightforest/models/block/wood/banister/jungle/jungle_banister_short.json +c2d0d703c810833b91827d626a798ca6f5d0dd8f assets/twilightforest/models/block/wood/banister/jungle/jungle_banister_short_extended.json +2539c983a20c9601dc82f4f7f356eaa77730949a assets/twilightforest/models/block/wood/banister/jungle/jungle_banister_tall.json +ef8f245fc413b66b9f5a9e1cb7c8da5ac0ccdfb6 assets/twilightforest/models/block/wood/banister/jungle/jungle_banister_tall_extended.json +b56b992588afb6a7a3d18aecb3be213a25fa8d39 assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_connected.json +d6b60c11338f8fe97bd3143434563ebf7accd203 assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_connected_1.json +5d64339e573d12946dee25683e58d5164e9606fc assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_connected_2.json +26bb939e63baf8e76d6e26c3cb1d6354abdfb38e assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_connected_3.json +7f90fdbb55360d5d3baf0e82d97bf00595893387 assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_connected_extended.json +b8dfee2c28980260d34b9f27ba36362255564ac2 assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_connected_extended_1.json +ff24046c636b2ccd3d3dd6b0624b8aef0c857fb7 assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_connected_extended_2.json +f16a44271db1cea4db566ed9d325aed5b2e1c0e9 assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_connected_extended_3.json +589acf591e753c6b1cc5c971356eb936418136ec assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_short.json +5e2c08e3b14ea1e630bfb2f78153484da4010553 assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_short_1.json +38bb2606ec04782b1d8233fd2fb52e8fa78e2c4d assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_short_2.json +716425804c9060a2aa489fbeed624ac2a6351e34 assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_short_3.json +e92704bcafe5dd0250562616ea11370faff1cd4f assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_short_extended.json +150a15dbdbc9559583185aea16226b71b2df3203 assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_short_extended_1.json +8944c227656921eec8f1ecebd223d7500c15d00b assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_short_extended_2.json +0abdd1a8493dcd456bf45a1aa29e30b0df911eb2 assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_short_extended_3.json +d418518003c90e8fc6a86e05ebe72fe09c094cc3 assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_tall.json +27bfe381721b33220ea1ef0ab0376667e610f750 assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_tall_1.json +4742e2ef92b44e36f2c20bbc96d54c679a70d33e assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_tall_2.json +b7e8f2f394a3cdee2778c4b67499f397f1d9058a assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_tall_3.json +c92b08dac6c33da58fa20982e30eeae108bb6b95 assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_tall_extended.json +f3d682f55a5cef79c83bd1f084bc05bbdd7c706a assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_tall_extended_1.json +8de10dbc312a0a57c21a57d9840ed6529fc3483a assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_tall_extended_2.json +478b73a0043940239efb9845cc6dc4c9fb58ef80 assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_tall_extended_3.json +5f847786a43b2d1e4ab01b17e39663bab69eff9e assets/twilightforest/models/block/wood/banister/mine/mining_banister_connected.json +5fb7079a690d6b9c292768c6fd903b8be4fb540e assets/twilightforest/models/block/wood/banister/mine/mining_banister_connected_1.json +9f6e6dea0179cd7290d4d24cf84335e89c5ed539 assets/twilightforest/models/block/wood/banister/mine/mining_banister_connected_2.json +982093e79178fab5c279da7235199caf0652a951 assets/twilightforest/models/block/wood/banister/mine/mining_banister_connected_3.json +eef7dfc8f1e46ccc5162176f7cafadddfca8854e assets/twilightforest/models/block/wood/banister/mine/mining_banister_connected_extended.json +938c495d8a03e4206f976e1e9cb0acf336f26dcc assets/twilightforest/models/block/wood/banister/mine/mining_banister_connected_extended_1.json +4dd4b6e314af32392c7218ceffc1eafc6453537a assets/twilightforest/models/block/wood/banister/mine/mining_banister_connected_extended_2.json +a12284896d2212cdd6610e5d47e0948602cf1788 assets/twilightforest/models/block/wood/banister/mine/mining_banister_connected_extended_3.json +2d62b999cfbd76e755cd5b3dcc719a9dcb6f3c84 assets/twilightforest/models/block/wood/banister/mine/mining_banister_short.json +c2cafacb468669512d685b795d09135a71c419f2 assets/twilightforest/models/block/wood/banister/mine/mining_banister_short_1.json +5f97065c1273a926f06dd126a13d8ca215e6a7b4 assets/twilightforest/models/block/wood/banister/mine/mining_banister_short_2.json +e49a4d6cfed76ecd041bf06c46726a5778cbd09b assets/twilightforest/models/block/wood/banister/mine/mining_banister_short_3.json +3f2ed51e9dbe50fc469db494aec036ec4162873c assets/twilightforest/models/block/wood/banister/mine/mining_banister_short_extended.json +f8c7888d56118272e2a9e1d86a5a9215d1a9cda0 assets/twilightforest/models/block/wood/banister/mine/mining_banister_short_extended_1.json +88871af4253ad862870aa533513093f45b5ca7e7 assets/twilightforest/models/block/wood/banister/mine/mining_banister_short_extended_2.json +c6094002c18fe5b64a01815edc75276b68570ec9 assets/twilightforest/models/block/wood/banister/mine/mining_banister_short_extended_3.json +19382129d9d5273db9515c1218cc87d1fa50a87f assets/twilightforest/models/block/wood/banister/mine/mining_banister_tall.json +99116b474e95a01b0b67e8073f44a453b1ed5969 assets/twilightforest/models/block/wood/banister/mine/mining_banister_tall_1.json +9294bdac73635b0b4e2525ce45f0afdc45444d0b assets/twilightforest/models/block/wood/banister/mine/mining_banister_tall_2.json +6539a001a58ca0ec1bce57053332e6561cb1d86a assets/twilightforest/models/block/wood/banister/mine/mining_banister_tall_3.json +c0e8f65fb6c4f64f3130f918bc6ae2b47eab1436 assets/twilightforest/models/block/wood/banister/mine/mining_banister_tall_extended.json +1c854299fae7ac88bdbea33ca780ad78d04abf12 assets/twilightforest/models/block/wood/banister/mine/mining_banister_tall_extended_1.json +b8ed8375690a4a08ce371ec72d8422668d1faa7b assets/twilightforest/models/block/wood/banister/mine/mining_banister_tall_extended_2.json +4111c589a93812c10a16f93e53ef436801117aae assets/twilightforest/models/block/wood/banister/mine/mining_banister_tall_extended_3.json +b83ed2fedff83739ec388e7213bc0469e88c67c4 assets/twilightforest/models/block/wood/banister/oak/oak_banister_connected.json +044de2410c94b451ee81c412d57bdd0cb4d362ad assets/twilightforest/models/block/wood/banister/oak/oak_banister_connected_extended.json +248d58476a85a6e0689ceb4a017fb843ee567b6b assets/twilightforest/models/block/wood/banister/oak/oak_banister_short.json +8af63ae20fa45a7a4e31bf91b83ffadd4bd72b5a assets/twilightforest/models/block/wood/banister/oak/oak_banister_short_extended.json +0525aa8aa79b3bcc63461f935a201b2bcdf344f9 assets/twilightforest/models/block/wood/banister/oak/oak_banister_tall.json +1ce3e3f1f9214f27468e367f0f9b5b8ade60c7a6 assets/twilightforest/models/block/wood/banister/oak/oak_banister_tall_extended.json +043e7a5c3b6c44c049272b64ea26c093c1d778c3 assets/twilightforest/models/block/wood/banister/sort/sorting_banister_connected.json +c903bb18c27a2373bbc037ef6ad4622ed8d98fa4 assets/twilightforest/models/block/wood/banister/sort/sorting_banister_connected_1.json +360a7db4871cc4bd2c7709b993294868df18f437 assets/twilightforest/models/block/wood/banister/sort/sorting_banister_connected_2.json +f257f366a06713195372fb3a1cdea76ab7415e78 assets/twilightforest/models/block/wood/banister/sort/sorting_banister_connected_3.json +ff482cec5799a81473f4c8b0f0f982b5c6b276c4 assets/twilightforest/models/block/wood/banister/sort/sorting_banister_connected_extended.json +875398ebd5533223b217343981b987307d99e27c assets/twilightforest/models/block/wood/banister/sort/sorting_banister_connected_extended_1.json +d481f0cd0eb678d8b0d75f38186cd29dc4c6ad60 assets/twilightforest/models/block/wood/banister/sort/sorting_banister_connected_extended_2.json +db02b8a622bd16572a0cdad41eefe5ccb24b911e assets/twilightforest/models/block/wood/banister/sort/sorting_banister_connected_extended_3.json +8c4466587422fb41bf41081a105147e7e0836b8f assets/twilightforest/models/block/wood/banister/sort/sorting_banister_short.json +2c3372513cb26304efea2a7052db53d0e292c4dd assets/twilightforest/models/block/wood/banister/sort/sorting_banister_short_1.json +c355f9223ae19924973af96da2df2cccbf070206 assets/twilightforest/models/block/wood/banister/sort/sorting_banister_short_2.json +5bb4b6384e031a1af1789962771af72dfae55110 assets/twilightforest/models/block/wood/banister/sort/sorting_banister_short_3.json +736589898c6f975bfffd4ce4aad749f0db7d7e64 assets/twilightforest/models/block/wood/banister/sort/sorting_banister_short_extended.json +dfee04c5806b7ef792c613c74ea0cc594272296c assets/twilightforest/models/block/wood/banister/sort/sorting_banister_short_extended_1.json +4e6768e087c973b6269f2ae65e11802b6c32e5eb assets/twilightforest/models/block/wood/banister/sort/sorting_banister_short_extended_2.json +b0bb2b4bd64e86161a1e283f27e8522a28d49a65 assets/twilightforest/models/block/wood/banister/sort/sorting_banister_short_extended_3.json +71a95458f3e2fc8517e1f4bbd55c2bf5b2df0d05 assets/twilightforest/models/block/wood/banister/sort/sorting_banister_tall.json +e271a4583f97698dc8546743956f6110b86f3c37 assets/twilightforest/models/block/wood/banister/sort/sorting_banister_tall_1.json +5ca79e58bf62d7259ae019ce4e9cc54013ba7d39 assets/twilightforest/models/block/wood/banister/sort/sorting_banister_tall_2.json +383de11a93d63603934bde52ce24113b2fb680b4 assets/twilightforest/models/block/wood/banister/sort/sorting_banister_tall_3.json +a2c05f78033412d5ca621049886a11a1673f17d9 assets/twilightforest/models/block/wood/banister/sort/sorting_banister_tall_extended.json +76e17ec4a87732f5f969babcb01f51af899b1a05 assets/twilightforest/models/block/wood/banister/sort/sorting_banister_tall_extended_1.json +3d7fbb788d9ca332b018b5b8960f09aac4267c53 assets/twilightforest/models/block/wood/banister/sort/sorting_banister_tall_extended_2.json +2b26a4e7f637d63fc232199c19fede77f3cbd7b6 assets/twilightforest/models/block/wood/banister/sort/sorting_banister_tall_extended_3.json +9a75de438600fb20513f51893e2f93bcf0e9f6c9 assets/twilightforest/models/block/wood/banister/spruce/spruce_banister_connected.json +7bdd5826b47bd8a4e13c3efb4fe790147f8f3c69 assets/twilightforest/models/block/wood/banister/spruce/spruce_banister_connected_extended.json +60987e64c206eceb1100e826357222575a2353bb assets/twilightforest/models/block/wood/banister/spruce/spruce_banister_short.json +bf78ae23d06069e839954df8607d2b0b99e39e74 assets/twilightforest/models/block/wood/banister/spruce/spruce_banister_short_extended.json +4406a9c225ba07b68fa91832e2b2087e1935a591 assets/twilightforest/models/block/wood/banister/spruce/spruce_banister_tall.json +ef69791a9675daacaf5b54b42d280942589995cb assets/twilightforest/models/block/wood/banister/spruce/spruce_banister_tall_extended.json +fade0d246bd299407b707bf1bdd38f021f3dda92 assets/twilightforest/models/block/wood/banister/time/time_banister_connected.json +ada523036947f24851cee6e7552d2643274cbf20 assets/twilightforest/models/block/wood/banister/time/time_banister_connected_1.json +0d499872690d03682283925e3eadd48c479f0d17 assets/twilightforest/models/block/wood/banister/time/time_banister_connected_2.json +e5e9e5b888fa505c08ce65e07ec35b587ed6629d assets/twilightforest/models/block/wood/banister/time/time_banister_connected_3.json +b7b37fcf1046ee9d720dc5827b61e4cf0bdc0ec6 assets/twilightforest/models/block/wood/banister/time/time_banister_connected_extended.json +3fbdc5734a7f00a7d0fb2ff597e4a030065b0634 assets/twilightforest/models/block/wood/banister/time/time_banister_connected_extended_1.json +b5d8112a023069f29ee68571d4be554cc3df1342 assets/twilightforest/models/block/wood/banister/time/time_banister_connected_extended_2.json +e8515c50654079203af2049f08dd8f1cb6bce525 assets/twilightforest/models/block/wood/banister/time/time_banister_connected_extended_3.json +4ea51ebf0a091ac0f0c1ed113f6c3ca93aad3304 assets/twilightforest/models/block/wood/banister/time/time_banister_short.json +8082312a9bbd239fff093663ab452827d05f8c09 assets/twilightforest/models/block/wood/banister/time/time_banister_short_1.json +b00d07435e5c6fc7ca6a1519bf75c0290329d6f0 assets/twilightforest/models/block/wood/banister/time/time_banister_short_2.json +1c819c9a1a46217de4710dba85647a2f7236449b assets/twilightforest/models/block/wood/banister/time/time_banister_short_3.json +7b9e5c22d0bdbd96519bb5490c1f17bd566c985f assets/twilightforest/models/block/wood/banister/time/time_banister_short_extended.json +21251fd33cfb1b6d721a82ab662fd1210bba0560 assets/twilightforest/models/block/wood/banister/time/time_banister_short_extended_1.json +28b9c511442f5388bf4176cae12e3648b4cc578d assets/twilightforest/models/block/wood/banister/time/time_banister_short_extended_2.json +2d5227d72e631c375a8519b774212f0673e5441d assets/twilightforest/models/block/wood/banister/time/time_banister_short_extended_3.json +d71ac489f2097a819626fa33f90088400bff929c assets/twilightforest/models/block/wood/banister/time/time_banister_tall.json +840200063905c295f5a3d84c4fb93f279ee0c435 assets/twilightforest/models/block/wood/banister/time/time_banister_tall_1.json +9d661568264fb28d3ddee829376242e6a7830036 assets/twilightforest/models/block/wood/banister/time/time_banister_tall_2.json +aaa82716ae695c3cf0767858eeef9c67390d67ef assets/twilightforest/models/block/wood/banister/time/time_banister_tall_3.json +9fab2d98357ef97d008bd5f1871ddb0e808e18ab assets/twilightforest/models/block/wood/banister/time/time_banister_tall_extended.json +796c5282641ad4eb31a826a8d51704f0af87aaa5 assets/twilightforest/models/block/wood/banister/time/time_banister_tall_extended_1.json +429c71aec7e82b0daec82fcfd52d7869c6013cb8 assets/twilightforest/models/block/wood/banister/time/time_banister_tall_extended_2.json +6c20e05d05f14664d726653f7e93a27525e97871 assets/twilightforest/models/block/wood/banister/time/time_banister_tall_extended_3.json +467e5db22c780710c27d404ba898ae0042d356c9 assets/twilightforest/models/block/wood/banister/trans/transformation_banister_connected.json +1d9809cb47fd0191b9779fa74cb98bf185efecf2 assets/twilightforest/models/block/wood/banister/trans/transformation_banister_connected_1.json +171d89417495e5178a8500be9f05a75506f1bd63 assets/twilightforest/models/block/wood/banister/trans/transformation_banister_connected_2.json +54e241c46143a067171093cf8260f5c93f81943a assets/twilightforest/models/block/wood/banister/trans/transformation_banister_connected_3.json +9a4d83163b3f48d6001ad498c0da609d7baff1d7 assets/twilightforest/models/block/wood/banister/trans/transformation_banister_connected_extended.json +efa02ca4812222c4c0b27e83630790d098340bcb assets/twilightforest/models/block/wood/banister/trans/transformation_banister_connected_extended_1.json +1f1e2ed8703100b3b9f8ee035d8c74ffdd777c35 assets/twilightforest/models/block/wood/banister/trans/transformation_banister_connected_extended_2.json +a9def34b6bcc2d5cdfad8ae554eb2b3915d09f10 assets/twilightforest/models/block/wood/banister/trans/transformation_banister_connected_extended_3.json +4cf67bef440f61f4ebdf1e812c86e0e1e3cd4cc2 assets/twilightforest/models/block/wood/banister/trans/transformation_banister_short.json +0866aee80cb652bb59ba19a52fd79a7ad75a989d assets/twilightforest/models/block/wood/banister/trans/transformation_banister_short_1.json +a496a9e4575b6be624bb63d7d6fb69df91c81f45 assets/twilightforest/models/block/wood/banister/trans/transformation_banister_short_2.json +d95c56ee0cfc710651cbead52179d225e98ba08b assets/twilightforest/models/block/wood/banister/trans/transformation_banister_short_3.json +2bd596b872eb0e83267ac87f1351dd69c6e1bfa4 assets/twilightforest/models/block/wood/banister/trans/transformation_banister_short_extended.json +483584195b79590b1e4b7f3cbdf09a7482c5fe7b assets/twilightforest/models/block/wood/banister/trans/transformation_banister_short_extended_1.json +4b6ec70bc3a9e20552bca404d68a5dc193345008 assets/twilightforest/models/block/wood/banister/trans/transformation_banister_short_extended_2.json +9d73608ed87bd628bab28ef26884eeacec80a5f9 assets/twilightforest/models/block/wood/banister/trans/transformation_banister_short_extended_3.json +87fd9490e4afbf355cc8f0b02050c67e68f71274 assets/twilightforest/models/block/wood/banister/trans/transformation_banister_tall.json +438f0d201bedb23e7a349f6fdfbe8d66491ba1bb assets/twilightforest/models/block/wood/banister/trans/transformation_banister_tall_1.json +7da3543537439ccf94187e6e8ca729f0fdf54244 assets/twilightforest/models/block/wood/banister/trans/transformation_banister_tall_2.json +8a511e020c2f47acc5af286661c41f990020771a assets/twilightforest/models/block/wood/banister/trans/transformation_banister_tall_3.json +aa41673fa9de9d18025f0eb3d0aeab2765147295 assets/twilightforest/models/block/wood/banister/trans/transformation_banister_tall_extended.json +bc8d6d2fadc156998f4e2df11aa28645f6201a6b assets/twilightforest/models/block/wood/banister/trans/transformation_banister_tall_extended_1.json +bc6290642cf598cc931bc40f05f99bf0fc9daac5 assets/twilightforest/models/block/wood/banister/trans/transformation_banister_tall_extended_2.json +07eae41fa2ac8825793bbc21e993faa7737d7221 assets/twilightforest/models/block/wood/banister/trans/transformation_banister_tall_extended_3.json +7affc5451af733e0b42b53b2ee5fcdcd062ec107 assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_connected.json +a2a4f8e19a8a2c95b1d6aef4c160a26a57b21dd6 assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_connected_1.json +bb7fbb4adcb27c630b53c21438635044510c562a assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_connected_2.json +28d4aae3ead2d722781e3c7eb69910df64239ef7 assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_connected_3.json +7a07631c9c48b68eed7de9831f2485ccb2486cd3 assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_connected_extended.json +f5832b80bf0b4c05c19f0834f7b24539d5efceb8 assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_connected_extended_1.json +39e6c3bf2f98f1b027db795be1867359f89e3df0 assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_connected_extended_2.json +6fb983e53154a4195b3b76658ea9a44c9409e0ef assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_connected_extended_3.json +8d8c8b7b30ea91db24b2bc7bc83a9303cb1f1b3b assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_short.json +97fe0820543ba98a79841af2972dfeaf3f5fb16a assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_short_1.json +6821586a0511d9096f78e052b40299f52b4d184f assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_short_2.json +3db6b20ee12857d3a416d54c7e583dacfeb7c164 assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_short_3.json +4b42d2ccfc77e78696409fb3230a04c1d4b89e4d assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_short_extended.json +a5223aaf5d880fa82cdb6915ff23865433a779b5 assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_short_extended_1.json +2d9a6e8090075c940c7a340389c1ffe421efdf1a assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_short_extended_2.json +f5a6a99eccd0a0c652d5c6850c2901262f80e0d2 assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_short_extended_3.json +786a1c6e3c214057353e6ac256d5bd81a800186b assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_tall.json +d139e7140962a56d30b96589c46dd2d6f8203094 assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_tall_1.json +f0ca6ce79ec297705b0378227dfbe94b8c667179 assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_tall_2.json +18c65abdfc8ed1a7810dd469fa1771cc5c469bfd assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_tall_3.json +289eef6f6e7653a4fd9624ceecdc753bebbe799a assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_tall_extended.json +c3e93c5f0f7032492cc145e384063baeba28ff7b assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_tall_extended_1.json +7047ab5cd3adb11e0d2589625e63599b04118d13 assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_tall_extended_2.json +45bf6175d8c0de9c5c7f43964a32c84b677df909 assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_tall_extended_3.json +1042bc9b8fb39afd8a403013e41c06be890dcae1 assets/twilightforest/models/block/wood/banister/vanilla_mangrove/vangrove_banister_connected.json +2ea05a3758c91142694df5e840ecd0f34ea2ffd2 assets/twilightforest/models/block/wood/banister/vanilla_mangrove/vangrove_banister_connected_extended.json +6fca2c24150639d95fb945c3208674c0b06a23bd assets/twilightforest/models/block/wood/banister/vanilla_mangrove/vangrove_banister_short.json +804ae97399e542ef33c14a86d9c1ea8b05b91f36 assets/twilightforest/models/block/wood/banister/vanilla_mangrove/vangrove_banister_short_extended.json +61a45c4e4cbf5a69ae153e2766eddb01884be619 assets/twilightforest/models/block/wood/banister/vanilla_mangrove/vangrove_banister_tall.json +d73e3a5bbbbcbeb9b7016d1d906dd8ecf565478a assets/twilightforest/models/block/wood/banister/vanilla_mangrove/vangrove_banister_tall_extended.json +43a10e6744a8af41346182899be8889591fcacb5 assets/twilightforest/models/block/wood/banister/warped/warped_banister_connected.json +dd7b943857c308c9b5d7120dbd4bc10f7abe96c7 assets/twilightforest/models/block/wood/banister/warped/warped_banister_connected_extended.json +be8c904aef614b07597f0c228914930a406b9794 assets/twilightforest/models/block/wood/banister/warped/warped_banister_short.json +495193331d7420b7aa6f206cfc2f24ae9c2a660e assets/twilightforest/models/block/wood/banister/warped/warped_banister_short_extended.json +c91d1f60ccd419f1b7edbed9593f40bd61302d05 assets/twilightforest/models/block/wood/banister/warped/warped_banister_tall.json +b55eab2c422702962854f492d21f4313bd7dc969 assets/twilightforest/models/block/wood/banister/warped/warped_banister_tall_extended.json +e2ca7a85eadc12579e8de82464ae59bc6baff9d4 assets/twilightforest/models/block/wood/button/canopy/canopy_button.json +cac52784a29d04bef0b5a5b451a5ff8f7bf5b2aa assets/twilightforest/models/block/wood/button/canopy/canopy_button_1.json +fa10bf7aaac4fecea2bbb1b8c6341de0eab0ddb7 assets/twilightforest/models/block/wood/button/canopy/canopy_button_2.json +26e3cdba05efb743e8230e66ec7557a896e59830 assets/twilightforest/models/block/wood/button/canopy/canopy_button_3.json +5140452d8909ad885891b72e0e30f6dbe127d189 assets/twilightforest/models/block/wood/button/canopy/canopy_button_pressed.json +dda42870e7f541ced1a3638c6d4f08fb8579c333 assets/twilightforest/models/block/wood/button/canopy/canopy_button_pressed_1.json +5e688fd059b6d5afd35a5fbbc184454aca30b411 assets/twilightforest/models/block/wood/button/canopy/canopy_button_pressed_2.json +303f705f7eb7d6d1ec96fce2aed7b26d8b27e0f5 assets/twilightforest/models/block/wood/button/canopy/canopy_button_pressed_3.json +a3a460abfc71db68794c63750bb2e92ef95c968d assets/twilightforest/models/block/wood/button/darkwood/dark_button.json +8b5a4b3bda57c07c4c417aad995f9959064294af assets/twilightforest/models/block/wood/button/darkwood/dark_button_1.json +7c72d46590127efd85ba3273cbf3958e3400b9fc assets/twilightforest/models/block/wood/button/darkwood/dark_button_2.json +edc5c6c8697623ee0c17bac02c27bc3ead7406ce assets/twilightforest/models/block/wood/button/darkwood/dark_button_3.json +752daedcb2d088e04da6de721b90b2dd5d2104de assets/twilightforest/models/block/wood/button/darkwood/dark_button_pressed.json +ba16a4ddbbee0023df4b713c3c33a20e45847e20 assets/twilightforest/models/block/wood/button/darkwood/dark_button_pressed_1.json +924b43806b08808f2ab7abdcc41f92fb91668048 assets/twilightforest/models/block/wood/button/darkwood/dark_button_pressed_2.json +4c99d98f044f309267b201e55c160aaf62889327 assets/twilightforest/models/block/wood/button/darkwood/dark_button_pressed_3.json +375c0d7bb708d912c975c529f423b158c9fd62b5 assets/twilightforest/models/block/wood/button/mangrove/mangrove_button.json +f25fbe21720091de6e4f7a2feb7ff2e0d88526cd assets/twilightforest/models/block/wood/button/mangrove/mangrove_button_1.json +dde256f155f4b9ade835412ddc71cc4b6218d575 assets/twilightforest/models/block/wood/button/mangrove/mangrove_button_2.json +0ee64548e22cd034b54d572741e7ac32be847c6a assets/twilightforest/models/block/wood/button/mangrove/mangrove_button_3.json +fe3d103ec519f471a57d380eb6e61ee18b6181a9 assets/twilightforest/models/block/wood/button/mangrove/mangrove_button_pressed.json +2db020ba617ecc9fc6ebbaf02a130a1bc6a4ddd9 assets/twilightforest/models/block/wood/button/mangrove/mangrove_button_pressed_1.json +4e563dd0ddd16cf1e9865126f7968a203fde26e6 assets/twilightforest/models/block/wood/button/mangrove/mangrove_button_pressed_2.json +926726dc4ba0ea8926982f172939ac34bc864231 assets/twilightforest/models/block/wood/button/mangrove/mangrove_button_pressed_3.json +15b0b971f655abee76cc6334250429a85228bb8d assets/twilightforest/models/block/wood/button/mine/mining_button.json +f7790a2921bbb80d7ecf8459eae4affdc7bb96d6 assets/twilightforest/models/block/wood/button/mine/mining_button_1.json +8c5584ef97316d83509c1e930654fe7119f59100 assets/twilightforest/models/block/wood/button/mine/mining_button_2.json +c34465c40ab03e82449f714345845e0a4a309d8b assets/twilightforest/models/block/wood/button/mine/mining_button_3.json +3986a9cf0a211b02f1ce70d85faf1a3e82e262aa assets/twilightforest/models/block/wood/button/mine/mining_button_pressed.json +7126e0782d302b29c30e2cef403f38de5837d2dc assets/twilightforest/models/block/wood/button/mine/mining_button_pressed_1.json +e5374af158169dfd45b3fd752177dd8e6812d08f assets/twilightforest/models/block/wood/button/mine/mining_button_pressed_2.json +a9edcfb00b5f91c684725be969faffe74752e156 assets/twilightforest/models/block/wood/button/mine/mining_button_pressed_3.json +9a34c541aa305b10aec3cf675bba7ef4ad9b88bb assets/twilightforest/models/block/wood/button/sort/sorting_button.json +1463682b4a295e40a3cce9dbf849f4a86c9c4d03 assets/twilightforest/models/block/wood/button/sort/sorting_button_1.json +cd28753939c8d657b85ccde7ac1985af3a42ed02 assets/twilightforest/models/block/wood/button/sort/sorting_button_2.json +26a339bbe825d661a809ad008b47e53f123c3dd1 assets/twilightforest/models/block/wood/button/sort/sorting_button_3.json +7af4b1d67a19f5196d70725456f53773cd4b032b assets/twilightforest/models/block/wood/button/sort/sorting_button_pressed.json +4d4dd52aa2e1d0d71382b106d17072dc890d8a52 assets/twilightforest/models/block/wood/button/sort/sorting_button_pressed_1.json +1c5429ec9c230dc11318f33648fa0f552685d111 assets/twilightforest/models/block/wood/button/sort/sorting_button_pressed_2.json +d864a6169ba9929db9ed96ace940d3f4d1c7716b assets/twilightforest/models/block/wood/button/sort/sorting_button_pressed_3.json +9b6878f2467ea9f973c85a95e188e844f1ca770d assets/twilightforest/models/block/wood/button/time/time_button.json +af81608cb9539c838b80a3aabd984d6e7b3785c2 assets/twilightforest/models/block/wood/button/time/time_button_1.json +0dd609b107fdcf6333caec55d8014d823a6fc46a assets/twilightforest/models/block/wood/button/time/time_button_2.json +28cba3bb828161fab5bcd482ada183b13172aa31 assets/twilightforest/models/block/wood/button/time/time_button_3.json +464f28aa8bcd3ff0f9981f9b36228ccc1d202d6c assets/twilightforest/models/block/wood/button/time/time_button_pressed.json +78857829d3198cc4eb6615bd98812a20c8635a8a assets/twilightforest/models/block/wood/button/time/time_button_pressed_1.json +9ee1a91580fccd3d07535f63dab30b07c02563da assets/twilightforest/models/block/wood/button/time/time_button_pressed_2.json +6d3b2f355c3a3cee8b29cc9e66525cb84838a67a assets/twilightforest/models/block/wood/button/time/time_button_pressed_3.json +60d2be223cdc27c43a4fb52b674332432d99597c assets/twilightforest/models/block/wood/button/trans/transformation_button.json +c9d5addbfa7d6876557b177b0374a3ff87cbf335 assets/twilightforest/models/block/wood/button/trans/transformation_button_1.json +df4d2de4107cc4476e4aa05955b335b390525a55 assets/twilightforest/models/block/wood/button/trans/transformation_button_2.json +b9c1bbbcae4e8614c04c33169a69b93f464584e6 assets/twilightforest/models/block/wood/button/trans/transformation_button_3.json +8edcf90016ccfdef5927cfd9c6b1ac7fc8a65b2b assets/twilightforest/models/block/wood/button/trans/transformation_button_pressed.json +c97d109e40795ecaf21d1613aac81252248bf434 assets/twilightforest/models/block/wood/button/trans/transformation_button_pressed_1.json +b83fbb06d7ab3be0db1f3adb0d9b114bf5cbe713 assets/twilightforest/models/block/wood/button/trans/transformation_button_pressed_2.json +9a85ee15719a7fd9b1d1657e48f161083fa30553 assets/twilightforest/models/block/wood/button/trans/transformation_button_pressed_3.json +4675e74d478804af53baa9ad53f83cf139fbd620 assets/twilightforest/models/block/wood/button/twilight_oak/twilight_oak_button.json +b77d60321cdc3ec75d50cf9ee691eaa545b7c7a4 assets/twilightforest/models/block/wood/button/twilight_oak/twilight_oak_button_1.json +91e9971824911a74c3ce06c8829e09b136199e4d assets/twilightforest/models/block/wood/button/twilight_oak/twilight_oak_button_2.json +424fc3487b1ad76d444f7f08425acb89484e306c assets/twilightforest/models/block/wood/button/twilight_oak/twilight_oak_button_3.json +8d00585a5caa841ef49e23ce6a86f2f348e3ddb4 assets/twilightforest/models/block/wood/button/twilight_oak/twilight_oak_button_pressed.json +9515cb8466cf36da1e32623b6d4726c65262b109 assets/twilightforest/models/block/wood/button/twilight_oak/twilight_oak_button_pressed_1.json +6b8ed19cc8937b23127d54650d8a1e37701c9452 assets/twilightforest/models/block/wood/button/twilight_oak/twilight_oak_button_pressed_2.json +f3032ea8e7e24a4382eb66f0ce7fa5fefc5370ac assets/twilightforest/models/block/wood/button/twilight_oak/twilight_oak_button_pressed_3.json +092ea8e849dd8171424ea145ac138aac25c48bc5 assets/twilightforest/models/block/wood/door/canopy/canopy_door_door_bottom_left.json +3beff6649cb5eee408a24df9c42cdf8cafa7db1d assets/twilightforest/models/block/wood/door/canopy/canopy_door_door_bottom_left_open.json +bd3feb20c3082bd3e8ff85142df914de1ae1f712 assets/twilightforest/models/block/wood/door/canopy/canopy_door_door_bottom_right.json +14f506f87f73514c91d4751cf16b18bec8b2fff6 assets/twilightforest/models/block/wood/door/canopy/canopy_door_door_bottom_right_open.json +0edc465593ab45fb2c601e0ea2a950bc11d24dff assets/twilightforest/models/block/wood/door/canopy/canopy_door_door_top_left.json +aa419890154c1336f5b362c6b8df43e4e5f00349 assets/twilightforest/models/block/wood/door/canopy/canopy_door_door_top_left_open.json +6ef41b991095a4c7061116015a0e273f92301bd6 assets/twilightforest/models/block/wood/door/canopy/canopy_door_door_top_right.json +056794f3493dcec05aa75ea763d8eb93ee952e88 assets/twilightforest/models/block/wood/door/canopy/canopy_door_door_top_right_open.json +ba6460ca425494d39ee2f0bfaf5d2f153e2e7089 assets/twilightforest/models/block/wood/door/darkwood/dark_door_door_bottom_left.json +e3c9406f38ff3d19ccc9e0338c3ad8ef37a1a8f7 assets/twilightforest/models/block/wood/door/darkwood/dark_door_door_bottom_left_open.json +0ba1a6d7e4b47c46eb5de3f406597fe24976f4a7 assets/twilightforest/models/block/wood/door/darkwood/dark_door_door_bottom_right.json +dc5f0825b07e91b51e05243e552472d7d1d32d83 assets/twilightforest/models/block/wood/door/darkwood/dark_door_door_bottom_right_open.json +d2a88b7fb1a4f2501de7b1c0e4dd6684d4a3cbad assets/twilightforest/models/block/wood/door/darkwood/dark_door_door_top_left.json +19453048a38174c7fc07200f85e52b69bbb70209 assets/twilightforest/models/block/wood/door/darkwood/dark_door_door_top_left_open.json +915e267e0de2426439caee4f73b696786412c1ca assets/twilightforest/models/block/wood/door/darkwood/dark_door_door_top_right.json +62ddc4aff4480f5cc054e36d2243d65c8c0cdc6e assets/twilightforest/models/block/wood/door/darkwood/dark_door_door_top_right_open.json +54d19543d33c233c7a046a51b6fbe19716cb4bdd assets/twilightforest/models/block/wood/door/mangrove/mangrove_door_door_bottom_left.json +2a71e5e09e6e082d3461934180f20f27ea8da914 assets/twilightforest/models/block/wood/door/mangrove/mangrove_door_door_bottom_left_open.json +a1bf57096b1311fd9c5c572277d7dde217e747bd assets/twilightforest/models/block/wood/door/mangrove/mangrove_door_door_bottom_right.json +43d957e3621121d94964f1f3d80cd95492eccae9 assets/twilightforest/models/block/wood/door/mangrove/mangrove_door_door_bottom_right_open.json +446fbe25684c88236e5fef7a291693996236168d assets/twilightforest/models/block/wood/door/mangrove/mangrove_door_door_top_left.json +f0b8b30da4409548e4159cee3bfa0a601339a33f assets/twilightforest/models/block/wood/door/mangrove/mangrove_door_door_top_left_open.json +06aabc082fb3cb187246d1999ba5cfa3687bf252 assets/twilightforest/models/block/wood/door/mangrove/mangrove_door_door_top_right.json +ad4915fdec921995e725548c17fa1b148771bdd2 assets/twilightforest/models/block/wood/door/mangrove/mangrove_door_door_top_right_open.json +cca53eedafd4ed1840fe1d7db94a81fcc937891b assets/twilightforest/models/block/wood/door/mine/mining_door_door_bottom_left.json +e8717d71b995c9e591a68f8520852e33aa04aa3d assets/twilightforest/models/block/wood/door/mine/mining_door_door_bottom_left_open.json +9b60a43c03e3e5f98e522b30ddc6d2ccb6c06f25 assets/twilightforest/models/block/wood/door/mine/mining_door_door_bottom_right.json +fb06048fe53bf840c5c243df04a1244ecaeab586 assets/twilightforest/models/block/wood/door/mine/mining_door_door_bottom_right_open.json +5aa1664e76f4af8f127f0692a3ab676beeeb3f31 assets/twilightforest/models/block/wood/door/mine/mining_door_door_top_left.json +5e1c3bfa6fac137e469f22621c71d8e436dafc87 assets/twilightforest/models/block/wood/door/mine/mining_door_door_top_left_open.json +0fc61812cd34ce7aa1f7ad2b1a782bf9036889a4 assets/twilightforest/models/block/wood/door/mine/mining_door_door_top_right.json +2a722d6c284b952ef68d9a625d28812c533ff3b1 assets/twilightforest/models/block/wood/door/mine/mining_door_door_top_right_open.json +e200f4ec05846e30465a59a517f711ad5fc77133 assets/twilightforest/models/block/wood/door/sort/sorting_door_door_bottom_left.json +e3c805cc4e86c12b796b368c236809bed362a7a2 assets/twilightforest/models/block/wood/door/sort/sorting_door_door_bottom_left_open.json +fbb0a4de02a045ece20ee50fca6afcabbb9af50e assets/twilightforest/models/block/wood/door/sort/sorting_door_door_bottom_right.json +96d22979792a1cfa9f4e584a38de42cbca1e2729 assets/twilightforest/models/block/wood/door/sort/sorting_door_door_bottom_right_open.json +1789e22e24dc35c6b243aa2569f172953dd17e82 assets/twilightforest/models/block/wood/door/sort/sorting_door_door_top_left.json +0e4e4c2ac771061d5dc77d988833db11310d395e assets/twilightforest/models/block/wood/door/sort/sorting_door_door_top_left_open.json +156e709478ff2d3042f0a409fa7b3948174bdc80 assets/twilightforest/models/block/wood/door/sort/sorting_door_door_top_right.json +1696f07248e47ead00b9a194ae74a27bdc7d5809 assets/twilightforest/models/block/wood/door/sort/sorting_door_door_top_right_open.json +89f767d574d885ada1f9be4d9190037590494bf4 assets/twilightforest/models/block/wood/door/time/time_door_door_bottom_left.json +8a74907a52d4c4cc78ff48fef8513845991956b8 assets/twilightforest/models/block/wood/door/time/time_door_door_bottom_left_open.json +402be83cb6a729f36191893bfcdbecf5f217a3ec assets/twilightforest/models/block/wood/door/time/time_door_door_bottom_right.json +1265de0314e5d350245d64f4913267b4c89dedb7 assets/twilightforest/models/block/wood/door/time/time_door_door_bottom_right_open.json +c1234c275a71af250080041e692abe6b5824140d assets/twilightforest/models/block/wood/door/time/time_door_door_top_left.json +62a3bce22a21f78749ab0308c512fa96e89e7c4f assets/twilightforest/models/block/wood/door/time/time_door_door_top_left_open.json +7d666160b4bed38db030f22655c18500ac0c749d assets/twilightforest/models/block/wood/door/time/time_door_door_top_right.json +cf7ffb80d9be4ae8b21c9dde29d497bb6a7ee31f assets/twilightforest/models/block/wood/door/time/time_door_door_top_right_open.json +23bb28e06b05ad5fa6da716c8e4a09b7b336e893 assets/twilightforest/models/block/wood/door/trans/transformation_door_door_bottom_left.json +ef165dde355118affc85df7f2367c1ed91f835e5 assets/twilightforest/models/block/wood/door/trans/transformation_door_door_bottom_left_open.json +619a343800772d17d08d5c458b725faf7ee2086b assets/twilightforest/models/block/wood/door/trans/transformation_door_door_bottom_right.json +048f179033fc445d8904be4a55f59529f962d104 assets/twilightforest/models/block/wood/door/trans/transformation_door_door_bottom_right_open.json +d64edd143869541c337063d6030b52caafade697 assets/twilightforest/models/block/wood/door/trans/transformation_door_door_top_left.json +0c979a14b20be1b7309a2633dea2756e713a334c assets/twilightforest/models/block/wood/door/trans/transformation_door_door_top_left_open.json +2fe704baa9a69ea065bf921eb61d40be4d3f3291 assets/twilightforest/models/block/wood/door/trans/transformation_door_door_top_right.json +f84557db5b799f0e4cc436dd948408d12e0c4541 assets/twilightforest/models/block/wood/door/trans/transformation_door_door_top_right_open.json +7513eb9f528dc4582acb003418fe991d65a31c0a assets/twilightforest/models/block/wood/door/twilight_oak/twilight_oak_door_door_bottom_left.json +24ce27d6cd9f4b9c1288ed74e8377b2b97056bb1 assets/twilightforest/models/block/wood/door/twilight_oak/twilight_oak_door_door_bottom_left_open.json +aa88301096bbee31e2b216ace4489a46373e6405 assets/twilightforest/models/block/wood/door/twilight_oak/twilight_oak_door_door_bottom_right.json +0b4fb9b5cf6c51d0eba36131fa3cbc08f957299d assets/twilightforest/models/block/wood/door/twilight_oak/twilight_oak_door_door_bottom_right_open.json +5fe0963e608261b376d344148b1668e4d9ded516 assets/twilightforest/models/block/wood/door/twilight_oak/twilight_oak_door_door_top_left.json +903757d2f1c252a945da86bca0164158cee126d5 assets/twilightforest/models/block/wood/door/twilight_oak/twilight_oak_door_door_top_left_open.json +766e0c3082bb610056ca58c2f0295b8ca25ff3a2 assets/twilightforest/models/block/wood/door/twilight_oak/twilight_oak_door_door_top_right.json +3679c64186c395eae612b8daf0313f39ff1fa52b assets/twilightforest/models/block/wood/door/twilight_oak/twilight_oak_door_door_top_right_open.json +baccc7749d9d56380f9fc4f53da896b50a9fcc5a assets/twilightforest/models/block/wood/fence/canopy/canopy_fence_post.json +3490fa47c19a1d4485f6f0025f21073f4941bbb1 assets/twilightforest/models/block/wood/fence/canopy/canopy_fence_post_1.json +00249b196ae7d0a32e5e1d21eb48858416eb7ef9 assets/twilightforest/models/block/wood/fence/canopy/canopy_fence_post_2.json +92dbc1915396e528d8dfdadd304d62626be0e524 assets/twilightforest/models/block/wood/fence/canopy/canopy_fence_post_3.json +54e66df8d7247d591e2126d00ae3df56895daf1f assets/twilightforest/models/block/wood/fence/canopy/canopy_fence_side.json +2b0d8073c3bb361af22b644b22c481d78200d647 assets/twilightforest/models/block/wood/fence/canopy/canopy_fence_side_1.json +7513c4ae2a4fd492290e63ca4345c18eaee44ab0 assets/twilightforest/models/block/wood/fence/canopy/canopy_fence_side_2.json +d856de7dcc82ff334bc27edad82818881960802c assets/twilightforest/models/block/wood/fence/canopy/canopy_fence_side_3.json +cf6d1e0822e9fe1a9683ced2d3b989675d6841ef assets/twilightforest/models/block/wood/fence/darkwood/dark_fence_post.json +7da2c6bb2a82d6080279ac328602526df98c4f66 assets/twilightforest/models/block/wood/fence/darkwood/dark_fence_post_1.json +7140facaaf09cb3c81dbbfcb65fb3b065d33ded5 assets/twilightforest/models/block/wood/fence/darkwood/dark_fence_post_2.json +68f68111ffe9c44fe667ae3d9af04f6b15d8dd65 assets/twilightforest/models/block/wood/fence/darkwood/dark_fence_post_3.json +a9d9268ddeef31029e97f0deb7aa3db57e1f165c assets/twilightforest/models/block/wood/fence/darkwood/dark_fence_side.json +9189d68efa2ed590544bbea82e05146170bb788c assets/twilightforest/models/block/wood/fence/darkwood/dark_fence_side_1.json +35b4aef61da8b8c30290c73a294d734bfe3261c9 assets/twilightforest/models/block/wood/fence/darkwood/dark_fence_side_2.json +775e09d05f9f2c20f4870898045d354088c30b4f assets/twilightforest/models/block/wood/fence/darkwood/dark_fence_side_3.json +fbbd9c29bf2fbaa3b49b4a3f6af15b64efc71456 assets/twilightforest/models/block/wood/fence/mangrove/mangrove_fence_post.json +8846ba92e2866424780c9345a6004b981879e0b8 assets/twilightforest/models/block/wood/fence/mangrove/mangrove_fence_post_1.json +08fcbf0e9bd12dcebb64c6b710a06257543c2b7c assets/twilightforest/models/block/wood/fence/mangrove/mangrove_fence_post_2.json +556e2567a5b37b1d997f370bbd06c1d81904a51f assets/twilightforest/models/block/wood/fence/mangrove/mangrove_fence_post_3.json +0cc69303136c59a7a7f86b9461afed3809c3646c assets/twilightforest/models/block/wood/fence/mangrove/mangrove_fence_side.json +d41b8c72ccab959ce21b00a41322dccea4785d78 assets/twilightforest/models/block/wood/fence/mangrove/mangrove_fence_side_1.json +d9d798e42b1a64e3bc152db5b1a587a1fe6b36f8 assets/twilightforest/models/block/wood/fence/mangrove/mangrove_fence_side_2.json +9b9c2d17a8f4d7bdf1e226eb8faf10c17d8bdf42 assets/twilightforest/models/block/wood/fence/mangrove/mangrove_fence_side_3.json +e8f2f0739898947783c3790cc355655f08a7c929 assets/twilightforest/models/block/wood/fence/mine/mining_fence_post.json +7105f0eb3fa90e1fbf5e827145eeca7e0db5175d assets/twilightforest/models/block/wood/fence/mine/mining_fence_post_1.json +98212116cb3fa43195d70b0ace3e5bfa27135210 assets/twilightforest/models/block/wood/fence/mine/mining_fence_post_2.json +8a3ec801f43b6266a7fcd4c291979170d853555e assets/twilightforest/models/block/wood/fence/mine/mining_fence_post_3.json +bf58a74d1ef926aa7cc12ef1eda1e268b02380ff assets/twilightforest/models/block/wood/fence/mine/mining_fence_side.json +d450bd152568143e8c0368c7d7bdb9410f45742e assets/twilightforest/models/block/wood/fence/mine/mining_fence_side_1.json +825709f4617df2611bcccde32b18b6540575e44b assets/twilightforest/models/block/wood/fence/mine/mining_fence_side_2.json +4954be601b4136268888ea7a8446c518ee21be98 assets/twilightforest/models/block/wood/fence/mine/mining_fence_side_3.json +8140292a6b4b77267b5cb843b0f3a762dab6b542 assets/twilightforest/models/block/wood/fence/sort/sorting_fence_post.json +478abe773cf39c1c45e1932e5755123208169aee assets/twilightforest/models/block/wood/fence/sort/sorting_fence_post_1.json +894f13700416240deb74a2a11fb7861a1d0e2b9b assets/twilightforest/models/block/wood/fence/sort/sorting_fence_post_2.json +71413b627c6130054eb83106be29c496992ff826 assets/twilightforest/models/block/wood/fence/sort/sorting_fence_post_3.json +88c3f9210c4d99ea7020e4c7d282bd05f4b601d0 assets/twilightforest/models/block/wood/fence/sort/sorting_fence_side.json +b11c503cb2ca7ebc9714270c1c9078b2be201aa0 assets/twilightforest/models/block/wood/fence/sort/sorting_fence_side_1.json +17c2bbfb9ab9a86ab1c44200351b66a5d88967c2 assets/twilightforest/models/block/wood/fence/sort/sorting_fence_side_2.json +8bd339eea2dc5239ac86b023306eff7a74e9e297 assets/twilightforest/models/block/wood/fence/sort/sorting_fence_side_3.json +7c38aa7daa9dcb7fd4c362ece243cad2f68dcdf2 assets/twilightforest/models/block/wood/fence/time/time_fence_post.json +44707fa6875077b905c546c7f717d6d550d31cb8 assets/twilightforest/models/block/wood/fence/time/time_fence_post_1.json +d2fbb42e5740fdf2e93f93fffb05a3a40077ec94 assets/twilightforest/models/block/wood/fence/time/time_fence_post_2.json +7b52e7b15814e25260714abdc886b3ff45a0b9da assets/twilightforest/models/block/wood/fence/time/time_fence_post_3.json +247932dbd8a3d16647c411340ff1e61e28074180 assets/twilightforest/models/block/wood/fence/time/time_fence_side.json +5c78b5b8c13d1d91f7dc0daeb74e8ba318534f5b assets/twilightforest/models/block/wood/fence/time/time_fence_side_1.json +3aac86fc268266aba0ab6e13876940a84adeb245 assets/twilightforest/models/block/wood/fence/time/time_fence_side_2.json +68681482d4018056d02c923852c67110b8adc9a1 assets/twilightforest/models/block/wood/fence/time/time_fence_side_3.json +9cb536aebd660c54dd24cec7c1c3c303f7f38606 assets/twilightforest/models/block/wood/fence/trans/transformation_fence_post.json +c08f11f9742a40942bd17c441234ac6fe01a5480 assets/twilightforest/models/block/wood/fence/trans/transformation_fence_post_1.json +2a9f4a34263ca7f2739f990f42e6de301293e0ea assets/twilightforest/models/block/wood/fence/trans/transformation_fence_post_2.json +4541d7fa0d54891d57226c03379b0555c76bd179 assets/twilightforest/models/block/wood/fence/trans/transformation_fence_post_3.json +8e349ccbc5dfd72f00e93fe8b959375d98866c77 assets/twilightforest/models/block/wood/fence/trans/transformation_fence_side.json +ef39fb2010bb596e41d2b9702fa6e9d6a6628d6b assets/twilightforest/models/block/wood/fence/trans/transformation_fence_side_1.json +06b33e2e5a4ed1cc05b8855688a30b0bed73c3e2 assets/twilightforest/models/block/wood/fence/trans/transformation_fence_side_2.json +7ffb4467b50b9f135ce932a744d32894f463186b assets/twilightforest/models/block/wood/fence/trans/transformation_fence_side_3.json +56c7be74eeba7331f7ec0540383da57eb621241a assets/twilightforest/models/block/wood/fence/twilight_oak/twilight_oak_fence_post.json +f70ac15ec72419d54e6ff34d12f1e6df9d271393 assets/twilightforest/models/block/wood/fence/twilight_oak/twilight_oak_fence_post_1.json +8b63048c432e78ff224718673e013a0214f0be2c assets/twilightforest/models/block/wood/fence/twilight_oak/twilight_oak_fence_post_2.json +66a702fbe7be5b95891d72361fe25ffe32b2bc3f assets/twilightforest/models/block/wood/fence/twilight_oak/twilight_oak_fence_post_3.json +fc1525d9af8e48c4d5968421fb1ad15a12f4cd1b assets/twilightforest/models/block/wood/fence/twilight_oak/twilight_oak_fence_side.json +81a55c78dc18ea0d64e9042e0450070ef6af723b assets/twilightforest/models/block/wood/fence/twilight_oak/twilight_oak_fence_side_1.json +9a1c5fa192e975d9978782c002cb67b2361e4cee assets/twilightforest/models/block/wood/fence/twilight_oak/twilight_oak_fence_side_2.json +17463c2b060b589779b732f5abae645aeed2dd54 assets/twilightforest/models/block/wood/fence/twilight_oak/twilight_oak_fence_side_3.json +1125a1059894a254f0ab6385503600c2ea205945 assets/twilightforest/models/block/wood/fence_gate/canopy/canopy_fence_gate.json +8238b2656c9ff17eeb7cded7bb6e2c2c671b63c5 assets/twilightforest/models/block/wood/fence_gate/canopy/canopy_fence_gate_1.json +98dcc390d4ca505fdfb9b5c3ae4447feaf1e7125 assets/twilightforest/models/block/wood/fence_gate/canopy/canopy_fence_gate_2.json +9ddaae7bbc97b2492047ea1c062191107ae50aa1 assets/twilightforest/models/block/wood/fence_gate/canopy/canopy_fence_gate_3.json +717e48d614d7eaca53edfc077d4e70cdaf90fb3e assets/twilightforest/models/block/wood/fence_gate/canopy/canopy_fence_gate_open.json +3d79e55604f228431fcecad045cd33f564fef04f assets/twilightforest/models/block/wood/fence_gate/canopy/canopy_fence_gate_open_1.json +f9486cab8e3c142631062bedb9a8b62a35837b8e assets/twilightforest/models/block/wood/fence_gate/canopy/canopy_fence_gate_open_2.json +d45d7bfdc836a66fd37224dd4677d5234e6bbafd assets/twilightforest/models/block/wood/fence_gate/canopy/canopy_fence_gate_open_3.json +61dcced8d1cecd385ab4a4262c8b9724d570f29a assets/twilightforest/models/block/wood/fence_gate/canopy/canopy_fence_gate_wall.json +1e5573e02791bd9d653707f3be966ef1739202af assets/twilightforest/models/block/wood/fence_gate/canopy/canopy_fence_gate_wall_1.json +9a47f3f2ece7980c1fb865a4932ca3b20f55830a assets/twilightforest/models/block/wood/fence_gate/canopy/canopy_fence_gate_wall_2.json +2b5b5a428b045f3a2abde29f22dc92fc52b45ec4 assets/twilightforest/models/block/wood/fence_gate/canopy/canopy_fence_gate_wall_3.json +4a6bb144726626ae7fab10e78d37ac128eb83a70 assets/twilightforest/models/block/wood/fence_gate/canopy/canopy_fence_gate_wall_open.json +040d00dea42cde44a3a2fbfdc344581842e01785 assets/twilightforest/models/block/wood/fence_gate/canopy/canopy_fence_gate_wall_open_1.json +2227b9948dd82b7454372e212bda6137c2b50968 assets/twilightforest/models/block/wood/fence_gate/canopy/canopy_fence_gate_wall_open_2.json +0b5f3303213ffa0a63f09f547e9917a707a62375 assets/twilightforest/models/block/wood/fence_gate/canopy/canopy_fence_gate_wall_open_3.json +5bcd0ca467ea783b7990f5f074461932923d36bd assets/twilightforest/models/block/wood/fence_gate/darkwood/dark_fence_gate.json +6eb59f1c8c634c7f51791feede15a4aefa89f41e assets/twilightforest/models/block/wood/fence_gate/darkwood/dark_fence_gate_1.json +efe4bff5ce56f82605435f7e00ca7801ba225ac5 assets/twilightforest/models/block/wood/fence_gate/darkwood/dark_fence_gate_2.json +882b0f83a91dbf8c2399396091c5cb4e0b87d709 assets/twilightforest/models/block/wood/fence_gate/darkwood/dark_fence_gate_3.json +e22447a829bf5f10a55fbbabcdbd4fe26476095a assets/twilightforest/models/block/wood/fence_gate/darkwood/dark_fence_gate_open.json +07c8f5b3cdb92828fa5033b4acc51309dd7a0208 assets/twilightforest/models/block/wood/fence_gate/darkwood/dark_fence_gate_open_1.json +77abe6fc3485fcd2af013b485f94d608b2b0c6e0 assets/twilightforest/models/block/wood/fence_gate/darkwood/dark_fence_gate_open_2.json +7979a36cab42d7a605e70470e5a3622fdddd90c1 assets/twilightforest/models/block/wood/fence_gate/darkwood/dark_fence_gate_open_3.json +a35ed4d71d9571ebca6dfa6269751f101c100936 assets/twilightforest/models/block/wood/fence_gate/darkwood/dark_fence_gate_wall.json +77c9953fcf3d15bd625a4cbd0e5019fe27b3d422 assets/twilightforest/models/block/wood/fence_gate/darkwood/dark_fence_gate_wall_1.json +a8056b570660777bcaf80a042545e756016e5e3d assets/twilightforest/models/block/wood/fence_gate/darkwood/dark_fence_gate_wall_2.json +35b75d90dba0111635c3aac39b34390d62ffba72 assets/twilightforest/models/block/wood/fence_gate/darkwood/dark_fence_gate_wall_3.json +b41b08b8af8b61f903b7e60509fced5e383303e4 assets/twilightforest/models/block/wood/fence_gate/darkwood/dark_fence_gate_wall_open.json +4871cec7983f343844e4a9d9c798db13b6ed21fd assets/twilightforest/models/block/wood/fence_gate/darkwood/dark_fence_gate_wall_open_1.json +0d9bca722a8e809ed1d7f8aa7410cfcc4dbf5bed assets/twilightforest/models/block/wood/fence_gate/darkwood/dark_fence_gate_wall_open_2.json +c2e2996459f57d710b3642073bb5dd4566d21366 assets/twilightforest/models/block/wood/fence_gate/darkwood/dark_fence_gate_wall_open_3.json +6c2dca98ffb46d8ea886c0b39998a3a069078bde assets/twilightforest/models/block/wood/fence_gate/mangrove/mangrove_fence_gate.json +26b885cfef695afa59f58751f8206955bb6d2239 assets/twilightforest/models/block/wood/fence_gate/mangrove/mangrove_fence_gate_1.json +ff53ffe9c9ce331f1d5f6b4cbc9558f7935dde80 assets/twilightforest/models/block/wood/fence_gate/mangrove/mangrove_fence_gate_2.json +8710d37315b4db4f14e3dda24c83d5eb50787b23 assets/twilightforest/models/block/wood/fence_gate/mangrove/mangrove_fence_gate_3.json +8ca79b13a61bbe593fcd14187ae460b8d6bc316b assets/twilightforest/models/block/wood/fence_gate/mangrove/mangrove_fence_gate_open.json +d32fafbe4fc98d4a183e4c6d22da70997d9046b4 assets/twilightforest/models/block/wood/fence_gate/mangrove/mangrove_fence_gate_open_1.json +1f3f0046fb102806181465569b74866f68ffebaa assets/twilightforest/models/block/wood/fence_gate/mangrove/mangrove_fence_gate_open_2.json +5be27aed7f4af1c84f08a5c2b1c7c34c8c5c7783 assets/twilightforest/models/block/wood/fence_gate/mangrove/mangrove_fence_gate_open_3.json +4c9025fc337ee73ef0cc8ed95bf6eff51badaddf assets/twilightforest/models/block/wood/fence_gate/mangrove/mangrove_fence_gate_wall.json +09147155783184725463c92eac006eef366d40f1 assets/twilightforest/models/block/wood/fence_gate/mangrove/mangrove_fence_gate_wall_1.json +6ecc5690666af34508c6ce2fe981ce1b28b76e6b assets/twilightforest/models/block/wood/fence_gate/mangrove/mangrove_fence_gate_wall_2.json +601e843d6f25dd945ea177a3d155dab61ee19872 assets/twilightforest/models/block/wood/fence_gate/mangrove/mangrove_fence_gate_wall_3.json +cd2665db9bc2c5ec96059c3c3e95ab91c9f67f36 assets/twilightforest/models/block/wood/fence_gate/mangrove/mangrove_fence_gate_wall_open.json +ae71ff8114fb4470a2e3373ce2b6f691b86bd344 assets/twilightforest/models/block/wood/fence_gate/mangrove/mangrove_fence_gate_wall_open_1.json +de1c2391416a31610a50ba28bb10f9397ebb99d9 assets/twilightforest/models/block/wood/fence_gate/mangrove/mangrove_fence_gate_wall_open_2.json +fb544fc45050da06ebe3dd53e4743b938db4b39a assets/twilightforest/models/block/wood/fence_gate/mangrove/mangrove_fence_gate_wall_open_3.json +15134d84b62d639a1e682843754c772be2a13aa2 assets/twilightforest/models/block/wood/fence_gate/mine/mining_fence_gate.json +32e0ee41c43a4bc1bdb78cdca45217876c61debf assets/twilightforest/models/block/wood/fence_gate/mine/mining_fence_gate_1.json +9a903aa0a12e0ddf2a648861c9d00391dc8b7ff6 assets/twilightforest/models/block/wood/fence_gate/mine/mining_fence_gate_2.json +aa01332aa2e55c662306770eb821f9ca4f759560 assets/twilightforest/models/block/wood/fence_gate/mine/mining_fence_gate_3.json +c10e5150be231c71000720207b51fd4603819339 assets/twilightforest/models/block/wood/fence_gate/mine/mining_fence_gate_open.json +252d926794d8a658683f3cb95a3f807916ff4f7d assets/twilightforest/models/block/wood/fence_gate/mine/mining_fence_gate_open_1.json +08a42d96e90e53af66df88732d1affdb96ba42d5 assets/twilightforest/models/block/wood/fence_gate/mine/mining_fence_gate_open_2.json +f60ba4586ac2de2c6abd55ed3028f03e0fb55228 assets/twilightforest/models/block/wood/fence_gate/mine/mining_fence_gate_open_3.json +c477f268ebde515a62f24ba6926f10c59b8acbc2 assets/twilightforest/models/block/wood/fence_gate/mine/mining_fence_gate_wall.json +ef49934fe937976a8b6139d3c82e76cb8ae7c9a9 assets/twilightforest/models/block/wood/fence_gate/mine/mining_fence_gate_wall_1.json +da358f7e2e553a5a47460ef9eae176b450f5af37 assets/twilightforest/models/block/wood/fence_gate/mine/mining_fence_gate_wall_2.json +388cf92cd86f03d6b18d45c72aaaeb3208e64fb7 assets/twilightforest/models/block/wood/fence_gate/mine/mining_fence_gate_wall_3.json +5f85ea86c785be9d3ef86b84cd627148e0ede1c5 assets/twilightforest/models/block/wood/fence_gate/mine/mining_fence_gate_wall_open.json +1babd77f0e7f5dff7c08ecb8596d5db46b920dca assets/twilightforest/models/block/wood/fence_gate/mine/mining_fence_gate_wall_open_1.json +5316c899f6cf7b9b35774f34fc6adea0bb2bcbfe assets/twilightforest/models/block/wood/fence_gate/mine/mining_fence_gate_wall_open_2.json +48d9989f838749ef7a9ce3f67d81a0c4848dff8a assets/twilightforest/models/block/wood/fence_gate/mine/mining_fence_gate_wall_open_3.json +c57b25ab535d9e67f3bb17df6c55ec8a28dfe1f4 assets/twilightforest/models/block/wood/fence_gate/sort/sorting_fence_gate.json +02adfb1ded3ab83945288a5a825990521a974f76 assets/twilightforest/models/block/wood/fence_gate/sort/sorting_fence_gate_1.json +d9edf9cfdb3b0d912bc738d3d593bc4b18a00e27 assets/twilightforest/models/block/wood/fence_gate/sort/sorting_fence_gate_2.json +adf5eff826ff3c13b719d95bbcc2bfcf82aefac3 assets/twilightforest/models/block/wood/fence_gate/sort/sorting_fence_gate_3.json +a715c9a5163695a425814ad92802b651963c8709 assets/twilightforest/models/block/wood/fence_gate/sort/sorting_fence_gate_open.json +580045956f3b02900adb8830ed479605761df814 assets/twilightforest/models/block/wood/fence_gate/sort/sorting_fence_gate_open_1.json +1bfbf59b2f92ff47b24512ef979e29fcf1be3f39 assets/twilightforest/models/block/wood/fence_gate/sort/sorting_fence_gate_open_2.json +456890a9fe0f6b1d8e04f2021e441175e0a17518 assets/twilightforest/models/block/wood/fence_gate/sort/sorting_fence_gate_open_3.json +31ca134c631f75319fc5015e9a8215396aa67eeb assets/twilightforest/models/block/wood/fence_gate/sort/sorting_fence_gate_wall.json +a86be82c0c984add6d8e45c2c393fd32cf5a4f91 assets/twilightforest/models/block/wood/fence_gate/sort/sorting_fence_gate_wall_1.json +de7638c3fc83ea0abecdc20bf92ad52e41de16c4 assets/twilightforest/models/block/wood/fence_gate/sort/sorting_fence_gate_wall_2.json +33480cdfae13f07a11a236c11dd8748571fa172d assets/twilightforest/models/block/wood/fence_gate/sort/sorting_fence_gate_wall_3.json +f0c766016f4d7f5fb66aec4469ebcfbceb1b5ab0 assets/twilightforest/models/block/wood/fence_gate/sort/sorting_fence_gate_wall_open.json +edec4873857279d654ed48aca2a1244b062f2bf9 assets/twilightforest/models/block/wood/fence_gate/sort/sorting_fence_gate_wall_open_1.json +a191f0c13d686d700709e524c282908365061afb assets/twilightforest/models/block/wood/fence_gate/sort/sorting_fence_gate_wall_open_2.json +d429abe98ecce1b178b3968a34ef48a31f0afff5 assets/twilightforest/models/block/wood/fence_gate/sort/sorting_fence_gate_wall_open_3.json +61e99f7f8b667fc7147c40ae15fca21262958e08 assets/twilightforest/models/block/wood/fence_gate/time/time_fence_gate.json +f76cbb18b8d1c6be742bce01a9acf16cf5ce3f6c assets/twilightforest/models/block/wood/fence_gate/time/time_fence_gate_1.json +aa3a0e4be4b1dd619c949b7b5680b588b8f4fe47 assets/twilightforest/models/block/wood/fence_gate/time/time_fence_gate_2.json +662d3f197f0d941b53672d43d2cb982f8817a7a3 assets/twilightforest/models/block/wood/fence_gate/time/time_fence_gate_3.json +aa1f4dc27427d34fd444f859c0d2db8ce17d869d assets/twilightforest/models/block/wood/fence_gate/time/time_fence_gate_open.json +88bec276354a78b77d95dc7b6282a1eee02b2695 assets/twilightforest/models/block/wood/fence_gate/time/time_fence_gate_open_1.json +0d24878b12fe1f0cd25e000f1ff88a9df2ff418f assets/twilightforest/models/block/wood/fence_gate/time/time_fence_gate_open_2.json +9cd2a4bff3a9288d7d8613e9362ea72efdddd20e assets/twilightforest/models/block/wood/fence_gate/time/time_fence_gate_open_3.json +6ca2fd5d536060e2ff106867d6e562f7998f185b assets/twilightforest/models/block/wood/fence_gate/time/time_fence_gate_wall.json +ae809130141400ee4a9981e8f7bcbbc40c06feae assets/twilightforest/models/block/wood/fence_gate/time/time_fence_gate_wall_1.json +409c30be5783f5d3ea9790fe9751821a00aa9ff1 assets/twilightforest/models/block/wood/fence_gate/time/time_fence_gate_wall_2.json +2d8f762d7f0cc077834448f6f202a4cc5068f852 assets/twilightforest/models/block/wood/fence_gate/time/time_fence_gate_wall_3.json +79e1a25c59d7cf80a8c6f4ce576e97eb713b10c2 assets/twilightforest/models/block/wood/fence_gate/time/time_fence_gate_wall_open.json +b4b64a5407f3ea6ff1ce2f8da9d784237e17998d assets/twilightforest/models/block/wood/fence_gate/time/time_fence_gate_wall_open_1.json +b7702899399e66c3253b5b8c9cd5a785bc09bbe7 assets/twilightforest/models/block/wood/fence_gate/time/time_fence_gate_wall_open_2.json +530c876c45e6910cc5728b379a723cfbd51b7170 assets/twilightforest/models/block/wood/fence_gate/time/time_fence_gate_wall_open_3.json +d8d68a9fe83bd31ceff805a12efd76539346c45a assets/twilightforest/models/block/wood/fence_gate/trans/transformation_fence_gate.json +26f2188f5349d83ae1c8fa77cbdbe85140013ebb assets/twilightforest/models/block/wood/fence_gate/trans/transformation_fence_gate_1.json +2379841da21fe393b9a844998d2151909c1418d2 assets/twilightforest/models/block/wood/fence_gate/trans/transformation_fence_gate_2.json +6eab0873bcfcaa35a248e806785373dba8a0f93a assets/twilightforest/models/block/wood/fence_gate/trans/transformation_fence_gate_3.json +e7cb9d6dac1d3192a9ad39fefc99379216efb7db assets/twilightforest/models/block/wood/fence_gate/trans/transformation_fence_gate_open.json +b055dfe0a26e8551cb6b7b3eef123b120ff14d41 assets/twilightforest/models/block/wood/fence_gate/trans/transformation_fence_gate_open_1.json +5a38e8ef34d5db266d1e1d275d11ba0b5170e000 assets/twilightforest/models/block/wood/fence_gate/trans/transformation_fence_gate_open_2.json +4e21d6656022816a00e182ae56af87213769a567 assets/twilightforest/models/block/wood/fence_gate/trans/transformation_fence_gate_open_3.json +92cd88893a87370eeee93b844899618009df9f7a assets/twilightforest/models/block/wood/fence_gate/trans/transformation_fence_gate_wall.json +f811946ab535adb2feca5652fa42a394cefd3a50 assets/twilightforest/models/block/wood/fence_gate/trans/transformation_fence_gate_wall_1.json +545926e1afaec098bdd3a13035db9c0ddd1ab8a0 assets/twilightforest/models/block/wood/fence_gate/trans/transformation_fence_gate_wall_2.json +910299e4cf347bdc4c59a1398218e3e480c3a421 assets/twilightforest/models/block/wood/fence_gate/trans/transformation_fence_gate_wall_3.json +bcfd07aa8a2feb87fe317089f848c153d84b66d2 assets/twilightforest/models/block/wood/fence_gate/trans/transformation_fence_gate_wall_open.json +db264fd467a5368fe927330983665e10a0fd5c35 assets/twilightforest/models/block/wood/fence_gate/trans/transformation_fence_gate_wall_open_1.json +f6d09aa525b090ea6bfe6287a346e21acf73b471 assets/twilightforest/models/block/wood/fence_gate/trans/transformation_fence_gate_wall_open_2.json +b9674f5ecc51f99ace53d8cac057514e4b29542e assets/twilightforest/models/block/wood/fence_gate/trans/transformation_fence_gate_wall_open_3.json +345ba38fd4d9850d51859444016b6585d6c12ad9 assets/twilightforest/models/block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate.json +7928e2b23fa297f08ffa5f77395b8b748ef45e66 assets/twilightforest/models/block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_1.json +480968bfdda6e64efd81f6dcf0d7fe65b9e0cba0 assets/twilightforest/models/block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_2.json +40f5541f6d49c7d909f32913c9f20a83479f1d96 assets/twilightforest/models/block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_3.json +01a0f705320f917ce0a6c33287ac0947980c5e38 assets/twilightforest/models/block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_open.json +f3640e7b08a83fee1f6c144f6280ed851da3d655 assets/twilightforest/models/block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_open_1.json +5bd2bff19f7d364f16e1ecc648ac93560a9f1a00 assets/twilightforest/models/block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_open_2.json +bb2fdf87d7144a210b29c9620a84aa03219e48f3 assets/twilightforest/models/block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_open_3.json +f87af55d8fe1635623aeba50da8157310143b74b assets/twilightforest/models/block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_wall.json +6fc5d36faebf6dd0df64dddc5b9b8dee37fdd17b assets/twilightforest/models/block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_wall_1.json +8fdef3010f58ff12666c880faae8432742b10c22 assets/twilightforest/models/block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_wall_2.json +5fce008e84414ce069b32f136dc4d1e885acbd03 assets/twilightforest/models/block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_wall_3.json +f725dcdbc61b9b57aba207d3a4eb6d036f598876 assets/twilightforest/models/block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_wall_open.json +872a2fbba867bbca2051394fe80fe6ac36f4706e assets/twilightforest/models/block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_wall_open_1.json +eac2f1b04985ec6720b9b3fc674817c13e3b8fb6 assets/twilightforest/models/block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_wall_open_2.json +56dd39958e0a238e73005e5cae5012e520299541 assets/twilightforest/models/block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_wall_open_3.json +1aaf1d0b02fd2f44d79b73147d2ad703e92a57e3 assets/twilightforest/models/block/wood/planks/canopy/canopy_planks.json +cea1d32b38eb3c5ea1b34abbd83fdc7db1f6c6a2 assets/twilightforest/models/block/wood/planks/canopy/canopy_planks_1.json +bfda6467c08cad81ce8e3a70cd82543fe5d5ad47 assets/twilightforest/models/block/wood/planks/canopy/canopy_planks_2.json +dc6a5ac3a540e7c3141b43e6b9b65a39d298fbe7 assets/twilightforest/models/block/wood/planks/canopy/canopy_planks_3.json +d159df3f084bd1e28b38f62db0d730eb512413ce assets/twilightforest/models/block/wood/planks/darkwood/dark_planks.json +382189fefcc096a551059afda274d46364947e0a assets/twilightforest/models/block/wood/planks/darkwood/dark_planks_1.json +d9aaaa294268509d7fdc217efbe3b926ab978ef8 assets/twilightforest/models/block/wood/planks/darkwood/dark_planks_2.json +dee09a5f183808eaf37d906103f8e466068ee9fe assets/twilightforest/models/block/wood/planks/darkwood/dark_planks_3.json +fbb318fc65042240186dc55ce5485b734354d85a assets/twilightforest/models/block/wood/planks/mangrove/mangrove_planks.json +3341bfcf06595f6d2aa8f0898e6a843a034970ee assets/twilightforest/models/block/wood/planks/mangrove/mangrove_planks_1.json +bf64d38419c8c92a986e2d1b591b9df89653e755 assets/twilightforest/models/block/wood/planks/mangrove/mangrove_planks_2.json +ad8fcf6aaa4544b0fc5377366d95ddc7de7aa5fb assets/twilightforest/models/block/wood/planks/mangrove/mangrove_planks_3.json +1c8b9d781d666ebf91ac92787a64931298b4fcd0 assets/twilightforest/models/block/wood/planks/mine/mining_planks.json +f6d654b6c7a8da74a28c6a0fe2b4c63743992d1d assets/twilightforest/models/block/wood/planks/mine/mining_planks_1.json +97319d4e1015ac3fe7ba979959d7fc08250d4a59 assets/twilightforest/models/block/wood/planks/mine/mining_planks_2.json +16606f665de6731d25835c4dbb58d86a3ea5e34b assets/twilightforest/models/block/wood/planks/mine/mining_planks_3.json +911ab5bbfc203ff47a77cd9ae429b7bc491d2f69 assets/twilightforest/models/block/wood/planks/sort/sorting_planks.json +959bb34a565f8bb29aa0b34e4ddebec7323c3463 assets/twilightforest/models/block/wood/planks/sort/sorting_planks_1.json +f7e473f2425ad036602ff745f05c254e11e48032 assets/twilightforest/models/block/wood/planks/sort/sorting_planks_2.json +dbbf0508632d4592784acbb4e97ed1d9fedd078a assets/twilightforest/models/block/wood/planks/sort/sorting_planks_3.json +275cdd0bf98fbd6efef6d711a521fa5e8a8eb409 assets/twilightforest/models/block/wood/planks/time/time_planks.json +e67a902123200599a6c103dc56b655a805fafbfe assets/twilightforest/models/block/wood/planks/time/time_planks_1.json +fcda012c90b3452c1be84555cdc748b5af5b8e58 assets/twilightforest/models/block/wood/planks/time/time_planks_2.json +8651a767aac95d2aae3b89ef433006b0d243e7c9 assets/twilightforest/models/block/wood/planks/time/time_planks_3.json +001b353732a9e3dae388f5b8bb3a79677e51c0be assets/twilightforest/models/block/wood/planks/trans/transformation_planks.json +e7480ce51fdf5945fb8ce17bf7dc465c37430b1f assets/twilightforest/models/block/wood/planks/trans/transformation_planks_1.json +85bf8aa623d6ec14fb40aaaa53cbe60af4447dc2 assets/twilightforest/models/block/wood/planks/trans/transformation_planks_2.json +6e4f1dbfcb011cbbca9e13afb1f414261af4fc6e assets/twilightforest/models/block/wood/planks/trans/transformation_planks_3.json +8e2e620a3cb5988db308189cc7ec55ec3db6e953 assets/twilightforest/models/block/wood/planks/twilight_oak/twilight_oak_planks.json +f5aa7b9f78513d7ae5b8621bba3c7886d6f5a3a6 assets/twilightforest/models/block/wood/planks/twilight_oak/twilight_oak_planks_1.json +ad84855f93d6f6a2dfb50460a3ae19e082dda050 assets/twilightforest/models/block/wood/planks/twilight_oak/twilight_oak_planks_2.json +cea150e7384004fb4ec6562d06c4edb7f2d9c398 assets/twilightforest/models/block/wood/planks/twilight_oak/twilight_oak_planks_3.json +5024971da41d587920b491427fa9d9f539aee01b assets/twilightforest/models/block/wood/pressure_plate/canopy/canopy_pressure_plate.json +e8c1f87a02a8d2d3a9b20f65576dc7b7e93e84bc assets/twilightforest/models/block/wood/pressure_plate/canopy/canopy_pressure_plate_1.json +8fea64a1847bfbdd904d131011c036842c0b7f63 assets/twilightforest/models/block/wood/pressure_plate/canopy/canopy_pressure_plate_2.json +4984d711e65f077316300dc34c5c71c91b3bbe54 assets/twilightforest/models/block/wood/pressure_plate/canopy/canopy_pressure_plate_3.json +da2b58b8fab05c1a01a5e264209df39b08f8006a assets/twilightforest/models/block/wood/pressure_plate/canopy/canopy_pressure_plate_down.json +13f38212a8fd3b948cfb1ed3d22145f2c88e8bec assets/twilightforest/models/block/wood/pressure_plate/canopy/canopy_pressure_plate_down_1.json +4df781c8e41f7ca54cb6096d42d5997bf96bd130 assets/twilightforest/models/block/wood/pressure_plate/canopy/canopy_pressure_plate_down_2.json +4d3ac18bb8dcfb4048b72ab2916ed120bacb4d8b assets/twilightforest/models/block/wood/pressure_plate/canopy/canopy_pressure_plate_down_3.json +26a67edee48b31493fb809d24a7d5f2a4c9bd0d2 assets/twilightforest/models/block/wood/pressure_plate/darkwood/dark_pressure_plate.json +9b33c1853f6e638cec03505a421f1cf2deefc253 assets/twilightforest/models/block/wood/pressure_plate/darkwood/dark_pressure_plate_1.json +c56861ff4142988153f43d151efaa4a14d696aaf assets/twilightforest/models/block/wood/pressure_plate/darkwood/dark_pressure_plate_2.json +e7cfe0658d443911e9f530aff419ef2720a1206f assets/twilightforest/models/block/wood/pressure_plate/darkwood/dark_pressure_plate_3.json +05255fe1bfb2db9fae2dcbc1446e21bf8fe8ce82 assets/twilightforest/models/block/wood/pressure_plate/darkwood/dark_pressure_plate_down.json +a2e5fe77a5f566210322d8fc2879352d8ac19e1e assets/twilightforest/models/block/wood/pressure_plate/darkwood/dark_pressure_plate_down_1.json +f4cd073cab6db8b1e4fa7a63957e057147e1ecc9 assets/twilightforest/models/block/wood/pressure_plate/darkwood/dark_pressure_plate_down_2.json +ff1384251210b54b1f6f461900adf4e25387981d assets/twilightforest/models/block/wood/pressure_plate/darkwood/dark_pressure_plate_down_3.json +ffda766490a364225c14f2c08b067b59bb203d2f assets/twilightforest/models/block/wood/pressure_plate/mangrove/mangrove_pressure_plate.json +94e4cc085313f12e68df261c02e8e11d53c3c9e5 assets/twilightforest/models/block/wood/pressure_plate/mangrove/mangrove_pressure_plate_1.json +9b70266157e8624dcbd6785b714773e36d6f23af assets/twilightforest/models/block/wood/pressure_plate/mangrove/mangrove_pressure_plate_2.json +1c4082e84dae61d672c4eb4fc01cabb63c21bc71 assets/twilightforest/models/block/wood/pressure_plate/mangrove/mangrove_pressure_plate_3.json +f24777be34f9f884986897137de873935958bf82 assets/twilightforest/models/block/wood/pressure_plate/mangrove/mangrove_pressure_plate_down.json +78a4b07a7fa096e93d0a9dbbff6e325350b926cc assets/twilightforest/models/block/wood/pressure_plate/mangrove/mangrove_pressure_plate_down_1.json +d3f4bbe72b6489cd554edcd421232e732ada14b7 assets/twilightforest/models/block/wood/pressure_plate/mangrove/mangrove_pressure_plate_down_2.json +a14102fb6039dd9e2aef23087a0e8d3a2edc4c71 assets/twilightforest/models/block/wood/pressure_plate/mangrove/mangrove_pressure_plate_down_3.json +60b19fe47437457ed8369f883ac7dbbb56b69e8c assets/twilightforest/models/block/wood/pressure_plate/mine/mining_pressure_plate.json +0690b9850e60774f5f5ede6f1c7dbd0912170b38 assets/twilightforest/models/block/wood/pressure_plate/mine/mining_pressure_plate_1.json +8b0a8e2cd2de7f4a40e5bb19c3877a2587bcad6a assets/twilightforest/models/block/wood/pressure_plate/mine/mining_pressure_plate_2.json +977487d68cf6f054e0fbdbfa1489397c430d8570 assets/twilightforest/models/block/wood/pressure_plate/mine/mining_pressure_plate_3.json +ac9d6449cb1f0ff49345b83c4a275a17e017b9b3 assets/twilightforest/models/block/wood/pressure_plate/mine/mining_pressure_plate_down.json +bb195668765c4ab8a67d9ab930d10dc399046268 assets/twilightforest/models/block/wood/pressure_plate/mine/mining_pressure_plate_down_1.json +d110f9a0224fe24766e3d799466df236ef3b9521 assets/twilightforest/models/block/wood/pressure_plate/mine/mining_pressure_plate_down_2.json +9971db66918d3375cbe16d77b4ae32cd872bb541 assets/twilightforest/models/block/wood/pressure_plate/mine/mining_pressure_plate_down_3.json +ce876f1b75d06685e8f09d0c5495c9e1e68eaab9 assets/twilightforest/models/block/wood/pressure_plate/sort/sorting_pressure_plate.json +7b422f7500f1ed0a8301a51127763a8133b3289e assets/twilightforest/models/block/wood/pressure_plate/sort/sorting_pressure_plate_1.json +bc223efb5ed736868f470082c34d717aeefa11e9 assets/twilightforest/models/block/wood/pressure_plate/sort/sorting_pressure_plate_2.json +b7d38d88402db1ad233497e7e446dc39521a29b5 assets/twilightforest/models/block/wood/pressure_plate/sort/sorting_pressure_plate_3.json +3894cd2ef4472950403fac508a32fc1bdbe2ce15 assets/twilightforest/models/block/wood/pressure_plate/sort/sorting_pressure_plate_down.json +11c92a7ba8038dd3198f4041a17c3ba4112aa9ba assets/twilightforest/models/block/wood/pressure_plate/sort/sorting_pressure_plate_down_1.json +a4b927419319314dd3fe6c485e26d162998e10a5 assets/twilightforest/models/block/wood/pressure_plate/sort/sorting_pressure_plate_down_2.json +2eee813b88c238d0de20901213239de81c055113 assets/twilightforest/models/block/wood/pressure_plate/sort/sorting_pressure_plate_down_3.json +d24fc95363d249d609b5ef0261a7c9d5518ee2a4 assets/twilightforest/models/block/wood/pressure_plate/time/time_pressure_plate.json +2443f7dd5ce324da755f2f1f9309c66ab87ad2be assets/twilightforest/models/block/wood/pressure_plate/time/time_pressure_plate_1.json +83ffe3414eff14b1be26f3b9057408bf2a4b95e9 assets/twilightforest/models/block/wood/pressure_plate/time/time_pressure_plate_2.json +2f17407620f2c7c48f6bb56b764160a28c82a68e assets/twilightforest/models/block/wood/pressure_plate/time/time_pressure_plate_3.json +e222c89e3dde830802f35ab06a6d2ed1b3542062 assets/twilightforest/models/block/wood/pressure_plate/time/time_pressure_plate_down.json +a6f1fe693a146f01460d93aa50f10a78bd7171b2 assets/twilightforest/models/block/wood/pressure_plate/time/time_pressure_plate_down_1.json +21d06f80135e47840e4184e195ef484a8bfea9bd assets/twilightforest/models/block/wood/pressure_plate/time/time_pressure_plate_down_2.json +23ee6121b07890cf024970c7cee3347917725ef5 assets/twilightforest/models/block/wood/pressure_plate/time/time_pressure_plate_down_3.json +137316e3745b84ef056553e4610181ae907ee536 assets/twilightforest/models/block/wood/pressure_plate/trans/transformation_pressure_plate.json +10b1baf6dccda076a88d2169febef58d4792cbc1 assets/twilightforest/models/block/wood/pressure_plate/trans/transformation_pressure_plate_1.json +d25c7e244102363862369edf43b85405d52033e8 assets/twilightforest/models/block/wood/pressure_plate/trans/transformation_pressure_plate_2.json +33f732282bff10e95e6034af4cf9f944ee2066b8 assets/twilightforest/models/block/wood/pressure_plate/trans/transformation_pressure_plate_3.json +b3306084e0be2150e6ec086eb5b2d9859a89f9eb assets/twilightforest/models/block/wood/pressure_plate/trans/transformation_pressure_plate_down.json +e105e0eb213034f77268724d7c0218502cb2cefb assets/twilightforest/models/block/wood/pressure_plate/trans/transformation_pressure_plate_down_1.json +e93261bd55747040b86477b183ec64be47dedf92 assets/twilightforest/models/block/wood/pressure_plate/trans/transformation_pressure_plate_down_2.json +ebd753f8b5b68aafe2aaf71f458b3f085402c076 assets/twilightforest/models/block/wood/pressure_plate/trans/transformation_pressure_plate_down_3.json +a2690a80412a083f0b88f1c5d476024db627f900 assets/twilightforest/models/block/wood/pressure_plate/twilight_oak/twilight_oak_pressure_plate.json +4e4a318264ba454410d4530edbc13c613d914fca assets/twilightforest/models/block/wood/pressure_plate/twilight_oak/twilight_oak_pressure_plate_1.json +eb82261d6ba90bce4caccbc85e40657272cb65d4 assets/twilightforest/models/block/wood/pressure_plate/twilight_oak/twilight_oak_pressure_plate_2.json +7f790130f35cd4d61757a1155849edb1577dd685 assets/twilightforest/models/block/wood/pressure_plate/twilight_oak/twilight_oak_pressure_plate_3.json +5e68901059b95f34c528a67c8d1a1b70ccec4795 assets/twilightforest/models/block/wood/pressure_plate/twilight_oak/twilight_oak_pressure_plate_down.json +473772064edc51da7c304117a1cba28d49dbe999 assets/twilightforest/models/block/wood/pressure_plate/twilight_oak/twilight_oak_pressure_plate_down_1.json +700845768a2c8f69d1d5941d3bb38c13d7a34eda assets/twilightforest/models/block/wood/pressure_plate/twilight_oak/twilight_oak_pressure_plate_down_2.json +45a5e6046a547ad5b834af14bbe3594c1a48c168 assets/twilightforest/models/block/wood/pressure_plate/twilight_oak/twilight_oak_pressure_plate_down_3.json +7c9e92825444a091babdf0614871df52f80a5d24 assets/twilightforest/models/block/wood/slab/canopy/canopy_slab.json +d5650ab0d8ea0772ef2069f465bc843164d0bfbd assets/twilightforest/models/block/wood/slab/canopy/canopy_slab_1.json +3b5b90d067f35f645417046d8fcd45cbde16c238 assets/twilightforest/models/block/wood/slab/canopy/canopy_slab_2.json +f16336df56dfc254986e6fb8c752caf7dc9615a9 assets/twilightforest/models/block/wood/slab/canopy/canopy_slab_3.json +2314d90de39b4cb311d6aa3f69366183f5ff81f3 assets/twilightforest/models/block/wood/slab/darkwood/dark_slab.json +68c99977a95a5f1e2e3cad5e005985b2d484e164 assets/twilightforest/models/block/wood/slab/darkwood/dark_slab_1.json +0b036737f8f1ff8e561c6aebd36636e75389578f assets/twilightforest/models/block/wood/slab/darkwood/dark_slab_2.json +2b9d1bef8fc43b4fe1b69fde5b66682190852170 assets/twilightforest/models/block/wood/slab/darkwood/dark_slab_3.json +f72d454ea4d4f633431017e3020393cdc88c31bf assets/twilightforest/models/block/wood/slab/mangrove/mangrove_slab.json +d620f2f08814fa0d0f438c7a8a388f9c3708eda8 assets/twilightforest/models/block/wood/slab/mangrove/mangrove_slab_1.json +6b61e734ade40e8a0fa52ad9d83114b0ba153122 assets/twilightforest/models/block/wood/slab/mangrove/mangrove_slab_2.json +f8362564cfe510e78e635ed372ded7e165a830b8 assets/twilightforest/models/block/wood/slab/mangrove/mangrove_slab_3.json +dc91ca2099300151f24395ab5cec165566a3d1a2 assets/twilightforest/models/block/wood/slab/mine/mining_slab.json +65e2cc745ae614e505aa58aea0cb3e203f02abfb assets/twilightforest/models/block/wood/slab/mine/mining_slab_1.json +faa2f167eaeadfd100566dd62fb8d94675641a29 assets/twilightforest/models/block/wood/slab/mine/mining_slab_2.json +73eb1d8900182fb105c5a746c326fcec157a9bfe assets/twilightforest/models/block/wood/slab/mine/mining_slab_3.json +a316f278938505fef8fcc6b5278338270836cba7 assets/twilightforest/models/block/wood/slab/sort/sorting_slab.json +88c9e7f33c68662c8af071408d4033909aaca943 assets/twilightforest/models/block/wood/slab/sort/sorting_slab_1.json +c445d1e7e4743fd23339855a2df8d5f469dacee7 assets/twilightforest/models/block/wood/slab/sort/sorting_slab_2.json +20ff5ec8048514d6f4c0d5a0af521ffb0281971f assets/twilightforest/models/block/wood/slab/sort/sorting_slab_3.json +8fa03219e62fa4773c27526ee6a64147da8cfd28 assets/twilightforest/models/block/wood/slab/time/time_slab.json +e2724fed44d47fae454ec9852fb2c4923ef23d0e assets/twilightforest/models/block/wood/slab/time/time_slab_1.json +b0eb68ced4216203fb0dc705043997e41f8c93ff assets/twilightforest/models/block/wood/slab/time/time_slab_2.json +57351d71a423a5f26b0e17d0206931908d81ddab assets/twilightforest/models/block/wood/slab/time/time_slab_3.json +826d8c876acfea490c63091da8063d913cd14f0d assets/twilightforest/models/block/wood/slab/trans/transformation_slab.json +3b64999bbd74678c3df506a1ea6d8e632c731f92 assets/twilightforest/models/block/wood/slab/trans/transformation_slab_1.json +f10b1eb702385094569312c81bc379d376b16cfe assets/twilightforest/models/block/wood/slab/trans/transformation_slab_2.json +621ef6557f52ff7eca25f803a0ef0e90b6bbb6d2 assets/twilightforest/models/block/wood/slab/trans/transformation_slab_3.json +b2e1089f07b140aa1c0865865ba3612b4a252c1c assets/twilightforest/models/block/wood/slab/twilight_oak/twilight_oak_slab.json +36a68586dd9d9382cf73b4a399d4884242cbce8c assets/twilightforest/models/block/wood/slab/twilight_oak/twilight_oak_slab_1.json +9e38d517527e61f0b17fe7d737bff75a78437385 assets/twilightforest/models/block/wood/slab/twilight_oak/twilight_oak_slab_2.json +8471f2e65c685fef5be778ab97f1673c50148ca4 assets/twilightforest/models/block/wood/slab/twilight_oak/twilight_oak_slab_3.json +0118551d3cf1d42e2e82fb2d8c658da4903937ca assets/twilightforest/models/block/wood/stairs/canopy/canopy_stairs.json +5c313a3c2ba19f2f386d86f49aca3bce6e97fa39 assets/twilightforest/models/block/wood/stairs/canopy/canopy_stairs_1.json +03e13a44a7bbaf33eb61eedc663f9a4a0051e78f assets/twilightforest/models/block/wood/stairs/canopy/canopy_stairs_2.json +55b91466addfa88fe9a57bacb103283fe8363195 assets/twilightforest/models/block/wood/stairs/canopy/canopy_stairs_3.json +f57697e9d7c02a4768d5d4e277cb026774c8238e assets/twilightforest/models/block/wood/stairs/canopy/canopy_stairs_inner.json +7ee7f4ec327db25101c7b3daea4e851fffc330d5 assets/twilightforest/models/block/wood/stairs/canopy/canopy_stairs_inner_1.json +5b4ab3cf62fccc53f08f8d9282e83563ae65e354 assets/twilightforest/models/block/wood/stairs/canopy/canopy_stairs_inner_2.json +d9052b119402855417a6cb3c08e212acdea3dd96 assets/twilightforest/models/block/wood/stairs/canopy/canopy_stairs_inner_3.json +23d9bb46bf578de1e61fc4388ae1ef61d168c5e0 assets/twilightforest/models/block/wood/stairs/canopy/canopy_stairs_outer.json +4e7db5f16c1e5958daa4c145673b207ded29f943 assets/twilightforest/models/block/wood/stairs/canopy/canopy_stairs_outer_1.json +5345b54c1a5c2e020c1d8026e8ed23301eabb673 assets/twilightforest/models/block/wood/stairs/canopy/canopy_stairs_outer_2.json +b0292b1c9eb84ade26e67b8c021c74704632057c assets/twilightforest/models/block/wood/stairs/canopy/canopy_stairs_outer_3.json +347d3c918ad20b16addf8145a3816655cb01f7ff assets/twilightforest/models/block/wood/stairs/darkwood/dark_stairs.json +d411e1fdf836d421ddd728b8c22ec71c3e9d1041 assets/twilightforest/models/block/wood/stairs/darkwood/dark_stairs_1.json +55930c7f1d23bda25a984539564c5c2d383166c2 assets/twilightforest/models/block/wood/stairs/darkwood/dark_stairs_2.json +6a55470774976d268e35f227c9e36d71c7507487 assets/twilightforest/models/block/wood/stairs/darkwood/dark_stairs_3.json +9483f83acf364fdea405d9b4eaa982a497d5f184 assets/twilightforest/models/block/wood/stairs/darkwood/dark_stairs_inner.json +ab07c75cac47cefde534d8214a4c9ace509957b4 assets/twilightforest/models/block/wood/stairs/darkwood/dark_stairs_inner_1.json +6d293a265143fe8af370ecd22f788dccb553236c assets/twilightforest/models/block/wood/stairs/darkwood/dark_stairs_inner_2.json +9cc4945e4cbacb8e7990f946b9e379643c8eab60 assets/twilightforest/models/block/wood/stairs/darkwood/dark_stairs_inner_3.json +129b08da8835403f561d0c321929f63ff465f1dd assets/twilightforest/models/block/wood/stairs/darkwood/dark_stairs_outer.json +32c9355d5d7b3e6927f9287b8d069fbee60d843c assets/twilightforest/models/block/wood/stairs/darkwood/dark_stairs_outer_1.json +e59705e4e31ce4145ff93ada5c940e09e7ecfedd assets/twilightforest/models/block/wood/stairs/darkwood/dark_stairs_outer_2.json +94e6f84d86cd2d2e5dbd5c8d65556b2edf87a4d9 assets/twilightforest/models/block/wood/stairs/darkwood/dark_stairs_outer_3.json +9c5267c8ca84b3fbbccd86876d6201a4783869e3 assets/twilightforest/models/block/wood/stairs/mangrove/mangrove_stairs.json +40401c40c74d74ed9f4e4f656ac0446f208759df assets/twilightforest/models/block/wood/stairs/mangrove/mangrove_stairs_1.json +1f6a5fb47de1c189c5db5cb2206da3caa36b6ec9 assets/twilightforest/models/block/wood/stairs/mangrove/mangrove_stairs_2.json +894bd5d1330ca5ca294314d813df7dd7c9bf795d assets/twilightforest/models/block/wood/stairs/mangrove/mangrove_stairs_3.json +a791b5fcb23830f9605a59f0d805642056b2e0da assets/twilightforest/models/block/wood/stairs/mangrove/mangrove_stairs_inner.json +33070bafc72018d9b1bf831465583a044bafe505 assets/twilightforest/models/block/wood/stairs/mangrove/mangrove_stairs_inner_1.json +4d0acc841a628406b40ae57b7c391f1904c3f2f8 assets/twilightforest/models/block/wood/stairs/mangrove/mangrove_stairs_inner_2.json +ddc8b1ffb1195a3aa2478bba68e91fb62e2b8418 assets/twilightforest/models/block/wood/stairs/mangrove/mangrove_stairs_inner_3.json +0377ca4e03937d8e0c228babeee18c3d563e1748 assets/twilightforest/models/block/wood/stairs/mangrove/mangrove_stairs_outer.json +9e61237cd4efef9c3050d60b13d1fdf09f1c5b6c assets/twilightforest/models/block/wood/stairs/mangrove/mangrove_stairs_outer_1.json +8e5d5f4e3d913699a8969673dbaad4a44f4421ce assets/twilightforest/models/block/wood/stairs/mangrove/mangrove_stairs_outer_2.json +819e86b3564245a32791face73ed7375c9aca52b assets/twilightforest/models/block/wood/stairs/mangrove/mangrove_stairs_outer_3.json +67c4263a672611e7bd5f7d547900c0a43f8b4cb9 assets/twilightforest/models/block/wood/stairs/mine/mining_stairs.json +c6c002824d7f160a6843547fb16e4e7f155ec2f2 assets/twilightforest/models/block/wood/stairs/mine/mining_stairs_1.json +f9418026082e036d7de72d8a7ed453f81b944750 assets/twilightforest/models/block/wood/stairs/mine/mining_stairs_2.json +efc7d5d289a735272da28b733bb762bb8c15c27c assets/twilightforest/models/block/wood/stairs/mine/mining_stairs_3.json +b867704242619631223ebec2362e2f26c18f9e66 assets/twilightforest/models/block/wood/stairs/mine/mining_stairs_inner.json +f00168b800fa5de87ac6b79e3eaf7bb961715b0c assets/twilightforest/models/block/wood/stairs/mine/mining_stairs_inner_1.json +765ab2f286abc35dd88877919ca151c189d04656 assets/twilightforest/models/block/wood/stairs/mine/mining_stairs_inner_2.json +7f670ec6d5a81b0e8c0a98e115655f4be581d988 assets/twilightforest/models/block/wood/stairs/mine/mining_stairs_inner_3.json +a38e453f3e8c09a3a92603293e8371104c70e53a assets/twilightforest/models/block/wood/stairs/mine/mining_stairs_outer.json +e82ff52177e06b1741903ea3024f6d9802e5c0d1 assets/twilightforest/models/block/wood/stairs/mine/mining_stairs_outer_1.json +54d4c1c3208777b5abc45d99806be186b31da580 assets/twilightforest/models/block/wood/stairs/mine/mining_stairs_outer_2.json +285ddfb280908899d70b0c46dbf9a329c179b2c8 assets/twilightforest/models/block/wood/stairs/mine/mining_stairs_outer_3.json +fa95e8edcd3f23d09f6cb8584acc9e5449fdbcbf assets/twilightforest/models/block/wood/stairs/sort/sorting_stairs.json +93cffd21528e041d3edfda26bf3e87fe3c8d14dd assets/twilightforest/models/block/wood/stairs/sort/sorting_stairs_1.json +f800da099e0cd19804ce3748317f4135965c811d assets/twilightforest/models/block/wood/stairs/sort/sorting_stairs_2.json +0921629053a6a1337043836a6502a86dc8b26737 assets/twilightforest/models/block/wood/stairs/sort/sorting_stairs_3.json +2442a250fb592b78a2f5ef5d5e799a4e54ea4d81 assets/twilightforest/models/block/wood/stairs/sort/sorting_stairs_inner.json +fd06084fc99f1c00244360306b7aff9611760083 assets/twilightforest/models/block/wood/stairs/sort/sorting_stairs_inner_1.json +de9b2d96075f8127b382ca40ef03e79d027029ba assets/twilightforest/models/block/wood/stairs/sort/sorting_stairs_inner_2.json +441cc69f05398f552aac7dad262d781e15ad0a23 assets/twilightforest/models/block/wood/stairs/sort/sorting_stairs_inner_3.json +ce40aa72f20c829a8e032933aacd2cec9e2d70d4 assets/twilightforest/models/block/wood/stairs/sort/sorting_stairs_outer.json +f61ed51a7943a726764511509e62bab357a2a449 assets/twilightforest/models/block/wood/stairs/sort/sorting_stairs_outer_1.json +d26784f49ca21fd591c3b9adb4de2b31cb4df1a2 assets/twilightforest/models/block/wood/stairs/sort/sorting_stairs_outer_2.json +86d417f2e87bf4ead1a70fc939d976a1ab034e2b assets/twilightforest/models/block/wood/stairs/sort/sorting_stairs_outer_3.json +622c9b68fc14b2ed91c31f74c3ea58c1b84761d9 assets/twilightforest/models/block/wood/stairs/time/time_stairs.json +6272baf6e8641769cdb087c1f1ca9f05fcc5fd23 assets/twilightforest/models/block/wood/stairs/time/time_stairs_1.json +ac2536daef61ef004bbca3ec271181a3222bff88 assets/twilightforest/models/block/wood/stairs/time/time_stairs_2.json +ac85543cc7f65e53e37749f2df0ffd0684c4fbb3 assets/twilightforest/models/block/wood/stairs/time/time_stairs_3.json +0f9c563c276147334f893d2ffed3bd5e35bc2065 assets/twilightforest/models/block/wood/stairs/time/time_stairs_inner.json +5f2b7a887c799363d766315ac28c1c64cec26e0d assets/twilightforest/models/block/wood/stairs/time/time_stairs_inner_1.json +f79cc0a6ca6c4c4b1649bbcb1f275d24273b66b0 assets/twilightforest/models/block/wood/stairs/time/time_stairs_inner_2.json +39d61c850ba8f284c988cb08c500881480b6c305 assets/twilightforest/models/block/wood/stairs/time/time_stairs_inner_3.json +196cefd68cf88543bc76e0113bea980b2ae5be71 assets/twilightforest/models/block/wood/stairs/time/time_stairs_outer.json +2ae3540347b5c8df25873cfccac5f00e52d0ace8 assets/twilightforest/models/block/wood/stairs/time/time_stairs_outer_1.json +249e5f94bd0a624a3397c5c21dbbcec58763cb65 assets/twilightforest/models/block/wood/stairs/time/time_stairs_outer_2.json +535577118d31d4528b367fe37e182b43e727a4e2 assets/twilightforest/models/block/wood/stairs/time/time_stairs_outer_3.json +d16a7eb33774cbcba38e5038e65305c04a9451e8 assets/twilightforest/models/block/wood/stairs/trans/transformation_stairs.json +1087cd179b1b3afb9b3bba191b4de37ba1d19329 assets/twilightforest/models/block/wood/stairs/trans/transformation_stairs_1.json +1305e636378f74237d2b04f0a146e32194a3ddd4 assets/twilightforest/models/block/wood/stairs/trans/transformation_stairs_2.json +c8a326a24c3c07cc6b8e212f32580b652384f1fc assets/twilightforest/models/block/wood/stairs/trans/transformation_stairs_3.json +6972f9f46a4f626120de37264b414dae3d7cf028 assets/twilightforest/models/block/wood/stairs/trans/transformation_stairs_inner.json +010e999be6ee7036636d05c0bb5e7212b42a50db assets/twilightforest/models/block/wood/stairs/trans/transformation_stairs_inner_1.json +aa8304a8e253096d71363a6e35a8bdd3a6d0a299 assets/twilightforest/models/block/wood/stairs/trans/transformation_stairs_inner_2.json +f08de90328b0e98c03cab3fe56920444b79b470f assets/twilightforest/models/block/wood/stairs/trans/transformation_stairs_inner_3.json +f4fdca9d4c0146226ae890c7e5a60a45533f305f assets/twilightforest/models/block/wood/stairs/trans/transformation_stairs_outer.json +30135eeaacd2a0d814745ba3616ca94aad247a86 assets/twilightforest/models/block/wood/stairs/trans/transformation_stairs_outer_1.json +6a76526869c6c1b64e5d93659b26930c75767c7a assets/twilightforest/models/block/wood/stairs/trans/transformation_stairs_outer_2.json +e1f4a2e804dcece3e6451a027e67f38e8fdb8a79 assets/twilightforest/models/block/wood/stairs/trans/transformation_stairs_outer_3.json +2e460e0a80814c6e166a9a07edbcf6e52d75ac84 assets/twilightforest/models/block/wood/stairs/twilight_oak/twilight_oak_stairs.json +c0c2644ba5b58c01bbec9246ac8b4090e9ca49df assets/twilightforest/models/block/wood/stairs/twilight_oak/twilight_oak_stairs_1.json +68df8393f0aa4343cd1479219d53e8050a325f77 assets/twilightforest/models/block/wood/stairs/twilight_oak/twilight_oak_stairs_2.json +5b4880d5abb17609c52c35a946e1b84cf3a28453 assets/twilightforest/models/block/wood/stairs/twilight_oak/twilight_oak_stairs_3.json +299c34cdddd5c45f4884d37f215aafddc4deac04 assets/twilightforest/models/block/wood/stairs/twilight_oak/twilight_oak_stairs_inner.json +e9591cd2eca7a12a1681a1cf439fd6ba455534ef assets/twilightforest/models/block/wood/stairs/twilight_oak/twilight_oak_stairs_inner_1.json +037497a7c09bb2685cfa6159ec5b5651f5ff1727 assets/twilightforest/models/block/wood/stairs/twilight_oak/twilight_oak_stairs_inner_2.json +10d0967fe3d3c3f9e237fa3c1089253a5a645c75 assets/twilightforest/models/block/wood/stairs/twilight_oak/twilight_oak_stairs_inner_3.json +c18b548aa972ba0f21c17ae4f6df51eb03e16aa1 assets/twilightforest/models/block/wood/stairs/twilight_oak/twilight_oak_stairs_outer.json +59ab039b1f4b9e8bfb029f825cbc4745d7f853cb assets/twilightforest/models/block/wood/stairs/twilight_oak/twilight_oak_stairs_outer_1.json +b4ff4ec6e806b92cb942ba264ad281d946746c59 assets/twilightforest/models/block/wood/stairs/twilight_oak/twilight_oak_stairs_outer_2.json +7487355aa870f5604f7ee7e20a845a8009912fc3 assets/twilightforest/models/block/wood/stairs/twilight_oak/twilight_oak_stairs_outer_3.json +fa3f0810f49dd127b517b669f3ac771eb4b1a108 assets/twilightforest/models/block/wood/trapdoor/canopy/canopy_trapdoor_bottom.json +c1ec129de9074feb72547ab71fb6d34d2dc2e2b6 assets/twilightforest/models/block/wood/trapdoor/canopy/canopy_trapdoor_open.json +8372ce9b45b4b98289ce514ad0e673a3ce7ead44 assets/twilightforest/models/block/wood/trapdoor/canopy/canopy_trapdoor_top.json +94ef02b446072d975f682039975d070d6fa64f88 assets/twilightforest/models/block/wood/trapdoor/darkwood/darkwood_trapdoor_bottom.json +be7d71dc23e28f423400fed7498d1393ca51e6c9 assets/twilightforest/models/block/wood/trapdoor/darkwood/darkwood_trapdoor_open.json +b31b3fd924f7fad7d6ce3207deed244fbbf9e64f assets/twilightforest/models/block/wood/trapdoor/darkwood/darkwood_trapdoor_top.json +86c5bd535b033fd2ff152e64ff0dec3193e1fd51 assets/twilightforest/models/block/wood/trapdoor/mangrove/mangrove_trapdoor_bottom.json +4b7f7e9c1bda82112a2647d4c9b45c89c3fe54fa assets/twilightforest/models/block/wood/trapdoor/mangrove/mangrove_trapdoor_open.json +afe5781af8254b171e5ba51c95f7a8057a0def5b assets/twilightforest/models/block/wood/trapdoor/mangrove/mangrove_trapdoor_top.json +dfe7dc3b6e556d7064aaf4fcfadcd58268facba4 assets/twilightforest/models/block/wood/trapdoor/mine/mine_trapdoor_bottom.json +175ba3beefbdc493a132caf91021c441f633420a assets/twilightforest/models/block/wood/trapdoor/mine/mine_trapdoor_open.json +8fa7d6f7c81deb80c641f7be6ff0e90579661902 assets/twilightforest/models/block/wood/trapdoor/mine/mine_trapdoor_top.json +a111d0ae8926d26df8038aa74d84a0f59c71d2eb assets/twilightforest/models/block/wood/trapdoor/sort/sort_trapdoor_bottom.json +6128e604fb1086dabc818aa0f91748b585c901fc assets/twilightforest/models/block/wood/trapdoor/sort/sort_trapdoor_open.json +54186d8db5330932e8c9105f8ce86aa3e9160502 assets/twilightforest/models/block/wood/trapdoor/sort/sort_trapdoor_top.json +639654941fba5f81aaf93db1b1f88a18b1c7eb54 assets/twilightforest/models/block/wood/trapdoor/time/time_trapdoor_bottom.json +9f540a17d1c341c11e9454e9f813c6c8c2e9f3ac assets/twilightforest/models/block/wood/trapdoor/time/time_trapdoor_open.json +70beb91ce6e287fc804ddcfdf8fd8940a4aece6a assets/twilightforest/models/block/wood/trapdoor/time/time_trapdoor_top.json +75faa9b10271730bd908ce7644c168a120b5bbc2 assets/twilightforest/models/block/wood/trapdoor/trans/trans_trapdoor_bottom.json +7758ae6f02034d42a36391a65ae13b2d24309f04 assets/twilightforest/models/block/wood/trapdoor/trans/trans_trapdoor_open.json +8a90f3a8325130723a82f4ace7d5bc05ca8349ca assets/twilightforest/models/block/wood/trapdoor/trans/trans_trapdoor_top.json +10458499d9edbb5e49b686ef95e3019b19b08a31 assets/twilightforest/models/block/wood/trapdoor/twilight_oak/twilight_oak_trapdoor_bottom.json +748b422c52c2a217c8f60009843095de45014797 assets/twilightforest/models/block/wood/trapdoor/twilight_oak/twilight_oak_trapdoor_open.json +8518e4adea3ba6478afe13f99c262f5dbad36978 assets/twilightforest/models/block/wood/trapdoor/twilight_oak/twilight_oak_trapdoor_top.json +675418f74165a7d0031061e70936ae610e9797be assets/twilightforest/models/block/worn_castle_brick.json +a1e2a40e5b907072dcdfde39054d40e1d447966f assets/twilightforest/models/block/worn_castle_brick_stairs.json +e4b005d685b1b8bc6c9bef6955916b79672cc544 assets/twilightforest/models/block/worn_castle_brick_stairs_inner.json +81d69f0f1475aeebb0adf1749254c647d2466b9c assets/twilightforest/models/block/worn_castle_brick_stairs_outer.json +91cc0a52fa4c3a51d7ed4641d49a44fe2bc5466c assets/twilightforest/models/block/yellow_castle_door.json +eca605b11f7f28fec1ac200e3fc9d80ec9dd8a7e assets/twilightforest/models/block/yellow_castle_door_vanished.json diff --git a/src/generated/resources/.cache/50707b2aa2b447940be9133c2ab0f8c3c79811f2 b/src/generated/resources/.cache/50707b2aa2b447940be9133c2ab0f8c3c79811f2 new file mode 100644 index 0000000000..e6ec6b9b70 --- /dev/null +++ b/src/generated/resources/.cache/50707b2aa2b447940be9133c2ab0f8c3c79811f2 @@ -0,0 +1,2 @@ +// 1.19.4 2023-03-15T19:43:56.8731293 Tags for minecraft:worldgen/structure mod id twilightforest +17650863330056c79d7282d1954ffbeea1905a33 data/twilightforest/tags/worldgen/structure/landmark.json diff --git a/src/generated/resources/.cache/507c2327f9f815dd74c579711daa4484c68106da b/src/generated/resources/.cache/507c2327f9f815dd74c579711daa4484c68106da new file mode 100644 index 0000000000..0df9714935 --- /dev/null +++ b/src/generated/resources/.cache/507c2327f9f815dd74c579711daa4484c68106da @@ -0,0 +1,2 @@ +// 1.19.4 2023-03-15T19:43:56.8872723 twilightforest Uncrafting Recipes +3c416209f357469b907f23e193f67c18eff74f85 data/twilightforest/recipes/uncrafting/tipped_arrow_uncraft.json diff --git a/src/generated/resources/.cache/50ac03844dfa7ff852b210032d967410a7179d62 b/src/generated/resources/.cache/50ac03844dfa7ff852b210032d967410a7179d62 new file mode 100644 index 0000000000..6ae4472105 --- /dev/null +++ b/src/generated/resources/.cache/50ac03844dfa7ff852b210032d967410a7179d62 @@ -0,0 +1,2 @@ +// 1.19.4 2023-03-15T19:43:56.9161948 Twilight Forest Fluid Tags +9fa2db0c3bb4bf9ed90554cacefc9aa8a502b765 data/twilightforest/tags/fluids/fire_jet_fuel.json diff --git a/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d b/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d new file mode 100644 index 0000000000..5c857472a6 --- /dev/null +++ b/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d @@ -0,0 +1,512 @@ +// 1.19.4 2023-05-24T22:09:24.4789039 Loot Tables +9992978a24c986ab8bbacfd4cb5c88b4b3d653a2 data/twilightforest/loot_tables/blocks/acacia_banister.json +fc581ec88db2dfcaf7146ce9e5f1b5a3ef8b2634 data/twilightforest/loot_tables/blocks/alpha_yeti_trophy.json +fc581ec88db2dfcaf7146ce9e5f1b5a3ef8b2634 data/twilightforest/loot_tables/blocks/alpha_yeti_wall_trophy.json +1d4929d7d6176f60e5ea991a577527ed251ef375 data/twilightforest/loot_tables/blocks/antibuilder.json +5f36d0b67122be2a8e718baf7c1313ddc17d9230 data/twilightforest/loot_tables/blocks/arctic_fur_block.json +a28c4cee7488c06dfd429a30302d559e15fe440e data/twilightforest/loot_tables/blocks/auroralized_glass.json +b29e61a5ddb98397a034be1d6b0530b1814f58f1 data/twilightforest/loot_tables/blocks/aurora_block.json +4c9fba7437843c3a689aaeca3d7332e9135a1354 data/twilightforest/loot_tables/blocks/aurora_pillar.json +45f37d3dfabe5f4017b595b8060f4ba273c33938 data/twilightforest/loot_tables/blocks/aurora_slab.json +bad3f9178418787b3d088bdd5d5d752f5518ee1a data/twilightforest/loot_tables/blocks/beanstalk_leaves.json +de7fa3b7a83635f2cb3d756e437dd277f665ccbf data/twilightforest/loot_tables/blocks/birch_banister.json +0c21acfba560b435a336eb51e0bb0200d03544bc data/twilightforest/loot_tables/blocks/blue_castle_door.json +c7a414ad0eb9e361a8d60e2a3fc548eaddcf7a5e data/twilightforest/loot_tables/blocks/blue_castle_rune_brick.json +868af49071feca3332bc0c5e549bcf81f56723c2 data/twilightforest/loot_tables/blocks/bold_castle_brick_pillar.json +bc0d1cf7cf622853f45629ebeef100fd8e71f1ee data/twilightforest/loot_tables/blocks/bold_castle_brick_stairs.json +039d4ae4f74cc01967f2243bb637ee6d15fc5469 data/twilightforest/loot_tables/blocks/bold_castle_brick_tile.json +ebf0632fc040d668c4da25fa2874aaafea277b19 data/twilightforest/loot_tables/blocks/bold_stone_pillar.json +99af6a227eafba058d6f1f9af0f8bde4a6abdab0 data/twilightforest/loot_tables/blocks/candelabra.json +2212848ae5638a228a3b703c9e9ede013b66c286 data/twilightforest/loot_tables/blocks/canopy_banister.json +16cd7df1300078c92388758ee4b571d0c03a50b6 data/twilightforest/loot_tables/blocks/canopy_bookshelf.json +1ac7b60961be184d0948a82d7073a03d65ecf367 data/twilightforest/loot_tables/blocks/canopy_button.json +7f1afd6f86eed1fa77e20a7d1764636fee2d1105 data/twilightforest/loot_tables/blocks/canopy_chest.json +fd43d9d247ebf8333a440ae6872a57ad5c622997 data/twilightforest/loot_tables/blocks/canopy_door.json +1c1d0e28c22040b3653c95539528acd0e91d67d9 data/twilightforest/loot_tables/blocks/canopy_fence.json +10e423c9ccfb8834dc25763bbfe4524c18da174b data/twilightforest/loot_tables/blocks/canopy_fence_gate.json +4a2cda98397ac3ffdbc5e1089ef6cbdc2d5d6fe3 data/twilightforest/loot_tables/blocks/canopy_leaves.json +946bd0fa8ae2f4ec5f90ebf87e79116d607c3265 data/twilightforest/loot_tables/blocks/canopy_log.json +a7f07b1c416b35e480213fc623c65ad865fbfbce data/twilightforest/loot_tables/blocks/canopy_planks.json +4ac929dda8ed1ce7a97dac06700e28b6b864064c data/twilightforest/loot_tables/blocks/canopy_pressure_plate.json +2816b37dc6874242d0f123db5c39046d385d9a7b data/twilightforest/loot_tables/blocks/canopy_sapling.json +414e3a7e8eecfe6c0a1694a65b08d60aed6ea78f data/twilightforest/loot_tables/blocks/canopy_sign.json +dcf89e0537f214ca61b0beb42c5011f48c9d65af data/twilightforest/loot_tables/blocks/canopy_slab.json +9adfe2d42ff01465deffc38bef34f7b869e1221a data/twilightforest/loot_tables/blocks/canopy_stairs.json +ba127ba1ed8b26762af14129a875c6cbdbdd3e88 data/twilightforest/loot_tables/blocks/canopy_trapdoor.json +414e3a7e8eecfe6c0a1694a65b08d60aed6ea78f data/twilightforest/loot_tables/blocks/canopy_wall_sign.json +3cf04c63741832975b798d2efb2ccb6d800e6975 data/twilightforest/loot_tables/blocks/canopy_wood.json +6af7d5e57731545441edabad0566e7895c732f9f data/twilightforest/loot_tables/blocks/carminite_block.json +68be0bf4bdec511a10f151975a7622b6ae791c08 data/twilightforest/loot_tables/blocks/carminite_builder.json +d13f140a060f57cdb19d2cc8978b5422c3f68a21 data/twilightforest/loot_tables/blocks/carminite_reactor.json +85976dc2276ecce24b219cd5e0340a58ab19a7a9 data/twilightforest/loot_tables/blocks/castle_brick.json +5d0df0d89b3024e4b983b8535d5d642d6686b9d7 data/twilightforest/loot_tables/blocks/castle_brick_stairs.json +23d3235deaf6d4f44b88ba2bbbf7ac9cd06fce55 data/twilightforest/loot_tables/blocks/castle_roof_tile.json +fd2b66f738bd36260a2285b3be11d721373961e1 data/twilightforest/loot_tables/blocks/cicada.json +c69763d5c79cafe4ebe75fc7a41ca43d6e398629 data/twilightforest/loot_tables/blocks/cicada_jar.json +a3a5f4d04a578f0d6b97e79fbe65c5a518a31b4f data/twilightforest/loot_tables/blocks/cicada_squish.json +061d24003f3878177803476e8dcfb10c7efe6892 data/twilightforest/loot_tables/blocks/cinder_furnace.json +9c3a1ba632003508c7b52677ce6ff68e84f3cc79 data/twilightforest/loot_tables/blocks/cinder_log.json +36bf1d7411beb004dd1f6b76675fe0d5b693c1db data/twilightforest/loot_tables/blocks/cinder_wood.json +85fee010010b116e252fff6d5edc1cfbe9cae637 data/twilightforest/loot_tables/blocks/clover_patch.json +fb31d92a11c0a38ebdfdd5f5bd83eb14c04bdd6c data/twilightforest/loot_tables/blocks/cracked_castle_brick.json +63a0cde312d6f21b9c383116ec6712b5b69ed029 data/twilightforest/loot_tables/blocks/cracked_castle_brick_stairs.json +b5d62cee2105f9a5aeafdb08ac91513c30e0d367 data/twilightforest/loot_tables/blocks/cracked_deadrock.json +2fff2a628bc8fa9f009035704f5d7fc2216558b5 data/twilightforest/loot_tables/blocks/cracked_etched_nagastone.json +90973778d073058dabdd3fe4179a30bffd537b4e data/twilightforest/loot_tables/blocks/cracked_mazestone.json +ea3150e225d79f3243870c0be73531460113eff3 data/twilightforest/loot_tables/blocks/cracked_nagastone_pillar.json +3bb80fd2e2a336ba93a4e1c750d367e5dc8d09cc data/twilightforest/loot_tables/blocks/cracked_nagastone_stairs_left.json +e632e3ec95a34b582ceaefdbdd1e595443f03db0 data/twilightforest/loot_tables/blocks/cracked_nagastone_stairs_right.json +03c9cefc9bac00396956bdfc5eed1bf88a101baa data/twilightforest/loot_tables/blocks/cracked_towerwood.json +d11c691a426d47a87bdc067455ed094fd6697985 data/twilightforest/loot_tables/blocks/cracked_underbrick.json +6b4372e91e340d8b4f7c3eab69c9d382cc12ea93 data/twilightforest/loot_tables/blocks/creeper_skull_candle.json +6b4372e91e340d8b4f7c3eab69c9d382cc12ea93 data/twilightforest/loot_tables/blocks/creeper_wall_skull_candle.json +95fb11193cc3059c98b4a7d166e22ac8b2ee73db data/twilightforest/loot_tables/blocks/crimson_banister.json +30b0d14d6dd8c838483bb2bec37abd1d703ab4eb data/twilightforest/loot_tables/blocks/cut_mazestone.json +62dfcdde9ad19c85b3887eae14c7a5534642a770 data/twilightforest/loot_tables/blocks/darkwood_sapling.json +a2123aef97e5ff0146680bbd3f98d56845dd47b7 data/twilightforest/loot_tables/blocks/dark_banister.json +c17c2a586d07b07c7cbefa3912a71bb463852902 data/twilightforest/loot_tables/blocks/dark_button.json +f9f0917e27f9ff8c9c61a7c8fdc644b6fedee740 data/twilightforest/loot_tables/blocks/dark_chest.json +faea88354062b9b6118690161f0bcdca89cfef99 data/twilightforest/loot_tables/blocks/dark_door.json +55005d91102bb9d4979b9a69c01b278620a36177 data/twilightforest/loot_tables/blocks/dark_fence.json +54066bbed8ea74eea9b39e386f31cdaf8c4c8bd0 data/twilightforest/loot_tables/blocks/dark_fence_gate.json +6b151ce4f02059276b6ed0b12b34871f31fc881f data/twilightforest/loot_tables/blocks/dark_leaves.json +065b8a6d218da128eaf00da5d446c2e84cc30022 data/twilightforest/loot_tables/blocks/dark_log.json +bd3b4840871e91fd98608b16048b7be1bf5bb330 data/twilightforest/loot_tables/blocks/dark_oak_banister.json +7ff5300613a2bdf54a43cf2c4da9b7dcefca8315 data/twilightforest/loot_tables/blocks/dark_planks.json +d61a807fac64a7a2ed9cd3429369fb84ddd6a93b data/twilightforest/loot_tables/blocks/dark_pressure_plate.json +94457dfac612dc284178c37ab8d6f6dfccf3f08a data/twilightforest/loot_tables/blocks/dark_sign.json +8975041dce5fb4daee26273493908a10b3f582e3 data/twilightforest/loot_tables/blocks/dark_slab.json +6b05fedd0dbefc1f9e6979786da6e8a525ea6642 data/twilightforest/loot_tables/blocks/dark_stairs.json +871c94a4ea1e0c0de95446ad4654f3afe4626667 data/twilightforest/loot_tables/blocks/dark_trapdoor.json +94457dfac612dc284178c37ab8d6f6dfccf3f08a data/twilightforest/loot_tables/blocks/dark_wall_sign.json +8b340dd9540cbbab99375e1ddf05fd63bd1524a5 data/twilightforest/loot_tables/blocks/dark_wood.json +c9a436feaaa63033496a109c732161618c4134c4 data/twilightforest/loot_tables/blocks/deadrock.json +1d4929d7d6176f60e5ea991a577527ed251ef375 data/twilightforest/loot_tables/blocks/death_tome_spawner.json +ac656cee300fbfd31977aee52a49652ca80fc33e data/twilightforest/loot_tables/blocks/decorative_mazestone.json +4c06e72dbf9baeb5e54742841321b1d6f79d828c data/twilightforest/loot_tables/blocks/empty_canopy_bookshelf.json +287dfbb422f6fff50cf187d6c3fc94e5255d7233 data/twilightforest/loot_tables/blocks/encased_castle_brick_pillar.json +da172a122ca3abf1bf69d927277e2a284c051809 data/twilightforest/loot_tables/blocks/encased_castle_brick_stairs.json +5739e22552ba4ebabe52f4a87550a70bcece38f8 data/twilightforest/loot_tables/blocks/encased_castle_brick_tile.json +348412aadc31c4967b84ba1094f039e94946a742 data/twilightforest/loot_tables/blocks/encased_fire_jet.json +0c679a074edb0ef54a48abcf89d698f2bed694d5 data/twilightforest/loot_tables/blocks/encased_smoker.json +94d2c3da93271287f34d5d559f1beb2c2f905745 data/twilightforest/loot_tables/blocks/encased_towerwood.json +966f19ded94655ec0afd94aa50f674a1ad20d285 data/twilightforest/loot_tables/blocks/etched_nagastone.json +1d4929d7d6176f60e5ea991a577527ed251ef375 data/twilightforest/loot_tables/blocks/experiment_115.json +b615f21a630da313514bad5cd9077eec00b9f5f6 data/twilightforest/loot_tables/blocks/fallen_leaves.json +200e4cc0a3b76d4aaab0ee778de41beeff9d0eae data/twilightforest/loot_tables/blocks/fiddlehead.json +4bdcc6ef1adcefaa36ef7fae2ec53b9be727a83d data/twilightforest/loot_tables/blocks/fiery_block.json +ce4b321a99fce99210c49a680ed8e88c7d59c931 data/twilightforest/loot_tables/blocks/firefly.json +ae0614f83670e5cc73a2a7743d2e7c144a33b9b7 data/twilightforest/loot_tables/blocks/firefly_jar.json +523c3c79fdd841dc531911588d613577524e6c1b data/twilightforest/loot_tables/blocks/firefly_particle_spawner.json +b4a54c9142a5f334ce7463fc69e5723703be3559 data/twilightforest/loot_tables/blocks/firefly_squish.json +613b3b3da28744de05570c6cc117aaf554c5e1ab data/twilightforest/loot_tables/blocks/fire_jet.json +9e0dac0b5403f61263242b032ec65bb33bc9abbe data/twilightforest/loot_tables/blocks/fluffy_cloud.json +0fafce790e5c3b0f4e7b103b02e7d844d38071b8 data/twilightforest/loot_tables/blocks/ghast_trap.json +619b7af4738c0e9eddbe56a32a6e1913633d5c6e data/twilightforest/loot_tables/blocks/giant_cobblestone.json +a8345620b1c0fc021fd2b37d5b393ac375d907b3 data/twilightforest/loot_tables/blocks/giant_leaves.json +d553445858b0e146e5ce851437a2db4009327bd9 data/twilightforest/loot_tables/blocks/giant_log.json +a093b0ba6e9bfe7da4937362188281431e539293 data/twilightforest/loot_tables/blocks/giant_obsidian.json +6b151ce4f02059276b6ed0b12b34871f31fc881f data/twilightforest/loot_tables/blocks/hardened_dark_leaves.json +8047379946cfb4aad3dfa3298ac71fa195a9bc71 data/twilightforest/loot_tables/blocks/hedge.json +af660d9a1c99aa4eb63b48fd18e9de2c80f0845a data/twilightforest/loot_tables/blocks/hollow_acacia_log_climbable.json +8fff85db3dd76294078ed0c504e3484969fbb227 data/twilightforest/loot_tables/blocks/hollow_acacia_log_horizontal.json +6e6ef01390cc880676e0d7064d17412fcbe7c56e data/twilightforest/loot_tables/blocks/hollow_acacia_log_vertical.json +0abd39a0edcb44923dcb92935560ce14bb1b1c35 data/twilightforest/loot_tables/blocks/hollow_birch_log_climbable.json +392664a21e2ffae7241a4598dd37d34613a91c06 data/twilightforest/loot_tables/blocks/hollow_birch_log_horizontal.json +094608170fd432e41c6fe6c649fd45559f7eeb5e data/twilightforest/loot_tables/blocks/hollow_birch_log_vertical.json +b9d8115be3cc5c5cf20aff9a155f6e917d1a8c1d data/twilightforest/loot_tables/blocks/hollow_canopy_log_climbable.json +46f263980f9a82f77f96745cb35fa6671f1bdf51 data/twilightforest/loot_tables/blocks/hollow_canopy_log_horizontal.json +a54ece70925966a57c22a4f94d169babcd46147d data/twilightforest/loot_tables/blocks/hollow_canopy_log_vertical.json +2f5df691c14a4118efe870ec13cc39749f1107e5 data/twilightforest/loot_tables/blocks/hollow_crimson_stem_climbable.json +1316253b3b2ae91e811b8766607d13d5ddb5bff3 data/twilightforest/loot_tables/blocks/hollow_crimson_stem_horizontal.json +88daa760ae2906b7e18ce9492b7eec2a572337df data/twilightforest/loot_tables/blocks/hollow_crimson_stem_vertical.json +2e45152e6a0723dc4167ae8d56a665ebf976a310 data/twilightforest/loot_tables/blocks/hollow_dark_log_climbable.json +67ce399992cf30224f7f34d1d0536ab6152e71e9 data/twilightforest/loot_tables/blocks/hollow_dark_log_horizontal.json +7f19076a7bcabad1390f2bba55206d4914c5f820 data/twilightforest/loot_tables/blocks/hollow_dark_log_vertical.json +23528c1a167498360a27aa8e6b13c51d750b4b01 data/twilightforest/loot_tables/blocks/hollow_dark_oak_log_climbable.json +c92735365e5df7e5ca8a2ba7cb15501dcb6c2517 data/twilightforest/loot_tables/blocks/hollow_dark_oak_log_horizontal.json +772d02cc0d925e91051cc174fd5c008a440a57ae data/twilightforest/loot_tables/blocks/hollow_dark_oak_log_vertical.json +831268ba2411113865ad12e3f26a0dec9ad6542d data/twilightforest/loot_tables/blocks/hollow_jungle_log_climbable.json +54de13da3d7a5ebb5396552c022b2d4ccca4be0f data/twilightforest/loot_tables/blocks/hollow_jungle_log_horizontal.json +acac9ba00e5f9efe940079a4a6e5ee71427ef027 data/twilightforest/loot_tables/blocks/hollow_jungle_log_vertical.json +e76d5fa9044d5da7e03aa1d478f52a9a6ba0ddc2 data/twilightforest/loot_tables/blocks/hollow_mangrove_log_climbable.json +0bae68ffdbc7915b8182ecac6f8dab294f560733 data/twilightforest/loot_tables/blocks/hollow_mangrove_log_horizontal.json +f9b4d99dea313e68d65ab9c5c100c852dacc73d6 data/twilightforest/loot_tables/blocks/hollow_mangrove_log_vertical.json +434f3dbeddc5b0af3747e8b19ae87587df24d4e0 data/twilightforest/loot_tables/blocks/hollow_mining_log_climbable.json +d3d8471c90a158b31e2226438ff880737ed04e20 data/twilightforest/loot_tables/blocks/hollow_mining_log_horizontal.json +59678c5fc1584d49ebb8e9b3bd7524f3bcb7294d data/twilightforest/loot_tables/blocks/hollow_mining_log_vertical.json +3a82cb90e1698e32ba0ae52f4fa09e444df72213 data/twilightforest/loot_tables/blocks/hollow_oak_log_climbable.json +a0894c14fb76b5f2ebd9a6de0c3c428f03432e9c data/twilightforest/loot_tables/blocks/hollow_oak_log_horizontal.json +e8c4c71210399077508c67d8ba858c4658ffb6b3 data/twilightforest/loot_tables/blocks/hollow_oak_log_vertical.json +8566376752f92e3c595c7915d269095f365a7b9a data/twilightforest/loot_tables/blocks/hollow_oak_sapling.json +a63c06657b9fb837bf266afa9f9e988a4986dd1f data/twilightforest/loot_tables/blocks/hollow_sorting_log_climbable.json +8f68ecea5b64c87113d7dd1b80066eaa13cfbcdc data/twilightforest/loot_tables/blocks/hollow_sorting_log_horizontal.json +931e7654865e7b6d41d246014e43c4be766b6b8b data/twilightforest/loot_tables/blocks/hollow_sorting_log_vertical.json +a63ea6b91921891bb6ae26e45758c6b4b6e34db2 data/twilightforest/loot_tables/blocks/hollow_spruce_log_climbable.json +38ac91e95952004e417b634dcead127cbf6be9da data/twilightforest/loot_tables/blocks/hollow_spruce_log_horizontal.json +772ee00199689135e50ba41cf33df433fe5414a1 data/twilightforest/loot_tables/blocks/hollow_spruce_log_vertical.json +67665a531acdb3b779afa9fca34f509a922703bd data/twilightforest/loot_tables/blocks/hollow_time_log_climbable.json +606a4a0ae687065df64e7e3ee77810b1c22afc2b data/twilightforest/loot_tables/blocks/hollow_time_log_horizontal.json +1a71b031dc8627a31b2b779064ed31f105fcb762 data/twilightforest/loot_tables/blocks/hollow_time_log_vertical.json +e4dfc8be16df967ac347a5ca2490480f3eec8466 data/twilightforest/loot_tables/blocks/hollow_transformation_log_climbable.json +88755ee4c32d0f6ca50168811d18bd33b2c1d2e5 data/twilightforest/loot_tables/blocks/hollow_transformation_log_horizontal.json +83c6394c019e2df5b6f9dfda7f35d3c71ef8a701 data/twilightforest/loot_tables/blocks/hollow_transformation_log_vertical.json +35550dfff4af84c773299ff8c266ec8bdf3bc420 data/twilightforest/loot_tables/blocks/hollow_twilight_oak_log_climbable.json +acec22c91e5a029a6c077291481819a06d9ec2dd data/twilightforest/loot_tables/blocks/hollow_twilight_oak_log_horizontal.json +8247c48d78a0bde405dda6376c27eaa86bbd5a3d data/twilightforest/loot_tables/blocks/hollow_twilight_oak_log_vertical.json +e2bf1154ec8cdc7aa5c78f98d023fd92e85b8335 data/twilightforest/loot_tables/blocks/hollow_vangrove_log_climbable.json +7de94d0bfc8bf1d5a964e424af950cd778543eee data/twilightforest/loot_tables/blocks/hollow_vangrove_log_horizontal.json +397d8d83fc80f6c940befcb5ca81d9c20c8070cb data/twilightforest/loot_tables/blocks/hollow_vangrove_log_vertical.json +e33d3d6c52f5b3d304272ec54856261597d3dee5 data/twilightforest/loot_tables/blocks/hollow_warped_stem_climbable.json +c5f06023b4fc9f15164f5611d9dcf60e82247a19 data/twilightforest/loot_tables/blocks/hollow_warped_stem_horizontal.json +d1a959599d09c3418b77cf325ff7298ffd3a7d83 data/twilightforest/loot_tables/blocks/hollow_warped_stem_vertical.json +5073d28e9054705627cc73087b32d65e7db78f36 data/twilightforest/loot_tables/blocks/huge_lily_pad.json +c5ee014e8a7e4e9abf7638027ad35d56c98ba9be data/twilightforest/loot_tables/blocks/huge_mushgloom.json +d239b4c1f6d9a35a18c1d847664fe33f4aaca039 data/twilightforest/loot_tables/blocks/huge_mushgloom_stem.json +d08849e4cb1de0b39e5048ad13ead693f90e8364 data/twilightforest/loot_tables/blocks/huge_stalk.json +a90c775f6943e00d51b10e1abb431d04e13038d9 data/twilightforest/loot_tables/blocks/huge_water_lily.json +ae05d7bd3080028ae53c955e673356c97da29835 data/twilightforest/loot_tables/blocks/hydra_trophy.json +ae05d7bd3080028ae53c955e673356c97da29835 data/twilightforest/loot_tables/blocks/hydra_wall_trophy.json +1d4929d7d6176f60e5ea991a577527ed251ef375 data/twilightforest/loot_tables/blocks/infested_towerwood.json +c97e16fd9fb3e4e460320b5cb95d35b5226378e4 data/twilightforest/loot_tables/blocks/ironwood_block.json +06669c263c8ea85921ba3ae945b437ce8a9cdba4 data/twilightforest/loot_tables/blocks/iron_ladder.json +27fe461fd9e5f12d545b5ca57381159656f1aace data/twilightforest/loot_tables/blocks/jungle_banister.json +611ab5e544106d5fba09f1cd768fcc72a4708e75 data/twilightforest/loot_tables/blocks/keepsake_casket.json +a091b4f98b662fa3463c6bc94f7a9402d2494ba5 data/twilightforest/loot_tables/blocks/knightmetal_block.json +6e19af69cef4336651dba2b6439123c88146c250 data/twilightforest/loot_tables/blocks/knight_phantom_trophy.json +6e19af69cef4336651dba2b6439123c88146c250 data/twilightforest/loot_tables/blocks/knight_phantom_wall_trophy.json +aa3d85d31dc2c85d824a39539cd847abe0d32944 data/twilightforest/loot_tables/blocks/lich_tower_miniature_structure.json +52dcb2e0b5e9e1b7c8a11c39e892312bf1d0820c data/twilightforest/loot_tables/blocks/lich_trophy.json +52dcb2e0b5e9e1b7c8a11c39e892312bf1d0820c data/twilightforest/loot_tables/blocks/lich_wall_trophy.json +989c06f5e763c764ba70336d5c5f4552d6ae6b6c data/twilightforest/loot_tables/blocks/liveroot_block.json +ccc651f1ab6a9ca88d38569c1de972b8737fd31d data/twilightforest/loot_tables/blocks/locked_vanishing_block.json +a2dcfe5a4420fc3dddb5ebbe18996b734ef4a766 data/twilightforest/loot_tables/blocks/mangrove_banister.json +302d496b5563299de8a1ef829ebed499bef3a672 data/twilightforest/loot_tables/blocks/mangrove_button.json +7fd61a3a7850c3e55ebc240b368770d887254dab data/twilightforest/loot_tables/blocks/mangrove_chest.json +0daf9d3e945ce8d2ee3b4948fd4d77aa0fc5e792 data/twilightforest/loot_tables/blocks/mangrove_door.json +55c8905f10be3355fc1a4da36cb6a3eb2a987811 data/twilightforest/loot_tables/blocks/mangrove_fence.json +c1b396a668270474e7a59b63d0caf0412db0f514 data/twilightforest/loot_tables/blocks/mangrove_fence_gate.json +c8d5edc76534425e4c7381ff2834569b4e56cc09 data/twilightforest/loot_tables/blocks/mangrove_leaves.json +3615f7134aedb56f0b086aba3774acde521289bc data/twilightforest/loot_tables/blocks/mangrove_log.json +c1bbff64b6e32f2ae13f6986ef961447c81dbec4 data/twilightforest/loot_tables/blocks/mangrove_planks.json +f6255f088c66555f67a34bac6b0a43d8537e8fd6 data/twilightforest/loot_tables/blocks/mangrove_pressure_plate.json +35310393dd932b79746196ed87b071b6832245de data/twilightforest/loot_tables/blocks/mangrove_root.json +b519c59cd1a5d7f94fe237beafae96bc839dd15c data/twilightforest/loot_tables/blocks/mangrove_sapling.json +e14626c2babf13f019f8aca54975e62f20790854 data/twilightforest/loot_tables/blocks/mangrove_sign.json +a8fe024b45a91061d08f3cd070cfdd4d5b8fc119 data/twilightforest/loot_tables/blocks/mangrove_slab.json +cc7f8c1789889d0d70b3b1d6457005dcad9045be data/twilightforest/loot_tables/blocks/mangrove_stairs.json +4df925ad4a00977d4854f7909e28a98f13c6a96e data/twilightforest/loot_tables/blocks/mangrove_trapdoor.json +e14626c2babf13f019f8aca54975e62f20790854 data/twilightforest/loot_tables/blocks/mangrove_wall_sign.json +aa2ed437605648c75f8dfe24f3266b468ee4a7ce data/twilightforest/loot_tables/blocks/mangrove_wood.json +ae91befc537b9baab593697f20f451473249a678 data/twilightforest/loot_tables/blocks/mayapple.json +e60214db2e010b4e295649e07c28687e7e5fade1 data/twilightforest/loot_tables/blocks/mazestone.json +7030550417306b1d9fdba1725b92dccc715d8e28 data/twilightforest/loot_tables/blocks/mazestone_border.json +a21e4e83eef1a9bba0a7a8b0654c50c9d6c466ab data/twilightforest/loot_tables/blocks/mazestone_brick.json +0fe7629ecc99a32028adb5a55e5bc000077408d3 data/twilightforest/loot_tables/blocks/mazestone_mosaic.json +d9a518f3ce4efe3c4e4f67cc146728f9a56ccf30 data/twilightforest/loot_tables/blocks/mining_banister.json +48126cc5440a86282885d55cfe1888c249469da0 data/twilightforest/loot_tables/blocks/mining_button.json +28875db5a7afc28470871e1e677f1c8bc87e93bd data/twilightforest/loot_tables/blocks/mining_chest.json +b14c560baf87941e598018a78c5575f4fef15492 data/twilightforest/loot_tables/blocks/mining_door.json +ae6f5bad062d54d9f91bb770d6dcb360e22ce928 data/twilightforest/loot_tables/blocks/mining_fence.json +19f75e8fe333532f9302256321b947edba8badb7 data/twilightforest/loot_tables/blocks/mining_fence_gate.json +ae0b512d2ccef81883cbe94b9d0f015bcff01666 data/twilightforest/loot_tables/blocks/mining_leaves.json +84470d4ce01884f1d53f6b8c452415c90525715e data/twilightforest/loot_tables/blocks/mining_log.json +84470d4ce01884f1d53f6b8c452415c90525715e data/twilightforest/loot_tables/blocks/mining_log_core.json +8ac80c4d7376027b1ea4251f4e30b638fd259aff data/twilightforest/loot_tables/blocks/mining_planks.json +28c443fcc55ab4adad56f0fc6c5d6cc0841f25c8 data/twilightforest/loot_tables/blocks/mining_pressure_plate.json +05f985089c14957851d25ddc0372c8f7f412f498 data/twilightforest/loot_tables/blocks/mining_sapling.json +c990a801aac5e9b7e8b2161ce7ce5403999c7150 data/twilightforest/loot_tables/blocks/mining_sign.json +875c61f851c3d64d34f37e74890c07b456c6f2d3 data/twilightforest/loot_tables/blocks/mining_slab.json +0e426ae313220ab8b024f1ae8780cc5cda70d207 data/twilightforest/loot_tables/blocks/mining_stairs.json +a89b10171d0ddf50f433ea3ae34f3ca87454b9f1 data/twilightforest/loot_tables/blocks/mining_trapdoor.json +c990a801aac5e9b7e8b2161ce7ce5403999c7150 data/twilightforest/loot_tables/blocks/mining_wall_sign.json +42c91fe823803d9f85247872c12cfc1726d9b4b0 data/twilightforest/loot_tables/blocks/mining_wood.json +955f71e353641746a42ac6cc5d1b3f634ee204de data/twilightforest/loot_tables/blocks/minoshroom_trophy.json +955f71e353641746a42ac6cc5d1b3f634ee204de data/twilightforest/loot_tables/blocks/minoshroom_wall_trophy.json +96eb173a677293d185f27a2edaae68159eb2025c data/twilightforest/loot_tables/blocks/moonworm.json +8be09a46c42f86f1e3963e9dd71b7035358be6cd data/twilightforest/loot_tables/blocks/moonworm_squish.json +8e8f065a7e2662d7934e7160cdbd984278df7937 data/twilightforest/loot_tables/blocks/mossy_castle_brick.json +26a0dd1548a0f6ed2a71731a99d7b925f893ed20 data/twilightforest/loot_tables/blocks/mossy_castle_brick_stairs.json +70f0dd6ac06810d09db1988de73f2c3287787de9 data/twilightforest/loot_tables/blocks/mossy_etched_nagastone.json +44e4dde9a10bc48e242441bcda57c4ce07e112d3 data/twilightforest/loot_tables/blocks/mossy_mazestone.json +ba71ef28afc58be713f5afa0fc7c3b90857a6e4c data/twilightforest/loot_tables/blocks/mossy_nagastone_pillar.json +dbe4a73d93abfbc9fdcac0a322f4f3695aa27128 data/twilightforest/loot_tables/blocks/mossy_nagastone_stairs_left.json +54ee362b578f972842a585ec73258175aca1638d data/twilightforest/loot_tables/blocks/mossy_nagastone_stairs_right.json +9e7b175cd3b6a64f4f12bab778539ae1c51d7ff5 data/twilightforest/loot_tables/blocks/mossy_towerwood.json +b0fd763c13f76309a635c409843424bcab96a6a4 data/twilightforest/loot_tables/blocks/mossy_underbrick.json +c40774c11f0662ecb0933d8441d16397fe7fc894 data/twilightforest/loot_tables/blocks/moss_patch.json +5e60315a0a6027e776308c59c0f7673fbd3dd59a data/twilightforest/loot_tables/blocks/mushgloom.json +49f384fb941b88a928fab45c73c020151e85aebc data/twilightforest/loot_tables/blocks/nagastone.json +40c9dc21e07b2fa1e046e70629f21feb395279df data/twilightforest/loot_tables/blocks/nagastone_head.json +93dd29408dffe9ef5e271d5145eff0e66c39ae01 data/twilightforest/loot_tables/blocks/nagastone_pillar.json +5b14f1117ce097333f5794c5020bb4eeb5139bf1 data/twilightforest/loot_tables/blocks/nagastone_stairs_left.json +c53fdf2c6b43fabd6eb71e801e07736b0adc8854 data/twilightforest/loot_tables/blocks/nagastone_stairs_right.json +9a498366b2108e5e6c2813f16ff738f92e158ae9 data/twilightforest/loot_tables/blocks/naga_courtyard_miniature_structure.json +b7909be1ef957dbd82a6e6dc8eca32fd5ab746e9 data/twilightforest/loot_tables/blocks/naga_trophy.json +b7909be1ef957dbd82a6e6dc8eca32fd5ab746e9 data/twilightforest/loot_tables/blocks/naga_wall_trophy.json +4f4a51fecf2f3e724045ba1c035a4f64cdd14f06 data/twilightforest/loot_tables/blocks/oak_banister.json +ec0eeebf8ddd1fa5552c06ecb88969f549a655c5 data/twilightforest/loot_tables/blocks/pink_castle_door.json +2d58050ae96adb357f9e9699789405a05aa25ab3 data/twilightforest/loot_tables/blocks/pink_castle_rune_brick.json +72f4c274b844d1220623b69caea52ea7c45e6040 data/twilightforest/loot_tables/blocks/player_skull_candle.json +72f4c274b844d1220623b69caea52ea7c45e6040 data/twilightforest/loot_tables/blocks/player_wall_skull_candle.json +06bab0b8ca579bf9be77c39cb0b3f961a08ff364 data/twilightforest/loot_tables/blocks/potted_canopy_sapling.json +00dafe8ef526629033f04c00225f8b3f9f1c2343 data/twilightforest/loot_tables/blocks/potted_darkwood_sapling.json +cb6a21f1c00d5fc6fd1a41b1dc333268b5424168 data/twilightforest/loot_tables/blocks/potted_dead_thorn.json +afae72c71f73b5a42848c2fc5d5526eeff1656eb data/twilightforest/loot_tables/blocks/potted_fiddlehead.json +cb6a21f1c00d5fc6fd1a41b1dc333268b5424168 data/twilightforest/loot_tables/blocks/potted_green_thorn.json +5d30b1071f2dd0c43c47f8cf152cd47dcf51975f data/twilightforest/loot_tables/blocks/potted_hollow_oak_sapling.json +3883f450efa54c85e1d1e7b4edfb0337701e13ce data/twilightforest/loot_tables/blocks/potted_mangrove_sapling.json +65d59603dc48796960053dfa61cf800905cdf0aa data/twilightforest/loot_tables/blocks/potted_mayapple.json +573938dadbbe0587110c43443d70048a652f4155 data/twilightforest/loot_tables/blocks/potted_mining_sapling.json +6d5b7cb0da2bf3b9373950d5725c636e935a3941 data/twilightforest/loot_tables/blocks/potted_mushgloom.json +2b587427a51bc7bc89fcf16a77ea4ae73c1738d4 data/twilightforest/loot_tables/blocks/potted_rainbow_oak_sapling.json +13a7a7f2f6354ac8baf448bae8eb621a7da0d672 data/twilightforest/loot_tables/blocks/potted_sorting_sapling.json +cb6a21f1c00d5fc6fd1a41b1dc333268b5424168 data/twilightforest/loot_tables/blocks/potted_thorn.json +14e06e9482560e0943803595eee252cbdb38d5e8 data/twilightforest/loot_tables/blocks/potted_time_sapling.json +0dbdd5fce976e65fde8909f4c2a43e56811ac10e data/twilightforest/loot_tables/blocks/potted_transformation_sapling.json +c09df125506e7b701da6ba85f215dd36c4bcf43d data/twilightforest/loot_tables/blocks/potted_twilight_oak_sapling.json +2d929ac64c660dff09cec3c455accdfd7cea5853 data/twilightforest/loot_tables/blocks/quest_ram_trophy.json +2d929ac64c660dff09cec3c455accdfd7cea5853 data/twilightforest/loot_tables/blocks/quest_ram_wall_trophy.json +b1af85d068333cf4df5de8419aace8f6bdb2c482 data/twilightforest/loot_tables/blocks/rainbow_oak_leaves.json +566f6c0d395cfc85739db96445554085fe5ac8b5 data/twilightforest/loot_tables/blocks/rainbow_oak_sapling.json +e113614c7b0307dc2c4612a4bebfa2a0b1af9eca data/twilightforest/loot_tables/blocks/reappearing_block.json +8feae76dff4666cdc87c95935cdedd6ade0ea1cf data/twilightforest/loot_tables/blocks/red_thread.json +bc1e33253b3f6f61cb022d1349f86a09d12beecd data/twilightforest/loot_tables/blocks/root.json +c6cf96ebb5ac5f7e3d5d2b2a179e21252295ab84 data/twilightforest/loot_tables/blocks/root_strand.json +1c44e065ce2dc0911f59ddf06fe0dfbf8f0fcdfb data/twilightforest/loot_tables/blocks/skeleton_skull_candle.json +1c44e065ce2dc0911f59ddf06fe0dfbf8f0fcdfb data/twilightforest/loot_tables/blocks/skeleton_wall_skull_candle.json +1d4929d7d6176f60e5ea991a577527ed251ef375 data/twilightforest/loot_tables/blocks/slider.json +5a3ade1257439e2a41d5ffb100ca866b86f31b33 data/twilightforest/loot_tables/blocks/smoker.json +9254691f5b1bd6696190c3875c3f85076aef161e data/twilightforest/loot_tables/blocks/snow_queen_trophy.json +9254691f5b1bd6696190c3875c3f85076aef161e data/twilightforest/loot_tables/blocks/snow_queen_wall_trophy.json +d8053d08a2a6bd635be24c8608ad2ccbea892f73 data/twilightforest/loot_tables/blocks/sorting_banister.json +f7745f0eaf64cfa1ad3e1393348408a49fbc6895 data/twilightforest/loot_tables/blocks/sorting_button.json +718e13c657fd97f9c83f59aaefa72443ab0f85a0 data/twilightforest/loot_tables/blocks/sorting_chest.json +2b85f8df48585b6b8b5a565b18f92edb11be9cab data/twilightforest/loot_tables/blocks/sorting_door.json +6c328f2d28800589f5116723ba82320a075bd35f data/twilightforest/loot_tables/blocks/sorting_fence.json +9664352675ec6ef209261ecfa559ea798b7bce54 data/twilightforest/loot_tables/blocks/sorting_fence_gate.json +91ffcc87d025c7f141d880d3f0ab7618a5c97681 data/twilightforest/loot_tables/blocks/sorting_leaves.json +28cf82688545561c141ae80c3d065eabc6bce3d1 data/twilightforest/loot_tables/blocks/sorting_log.json +28cf82688545561c141ae80c3d065eabc6bce3d1 data/twilightforest/loot_tables/blocks/sorting_log_core.json +b1b23d5dca5443d67532f66a11ba17fdf5df67dc data/twilightforest/loot_tables/blocks/sorting_planks.json +ffcfde266e24a88e3c4de275d8bbdfdf68251f0e data/twilightforest/loot_tables/blocks/sorting_pressure_plate.json +9bb27926414447787df4e5ef56dbc7d6a464ceeb data/twilightforest/loot_tables/blocks/sorting_sapling.json +be61cf58f7b97fb33d5893b7ece535ed8f1dfd2a data/twilightforest/loot_tables/blocks/sorting_sign.json +decc3915c21aa55b875bef6e3ddf5bcb39a84d4b data/twilightforest/loot_tables/blocks/sorting_slab.json +44997c90cdf8c1f9308f77f6212f1f980bc80a10 data/twilightforest/loot_tables/blocks/sorting_stairs.json +f2343eca28e864509ccab89fa81a99d1b61f0964 data/twilightforest/loot_tables/blocks/sorting_trapdoor.json +be61cf58f7b97fb33d5893b7ece535ed8f1dfd2a data/twilightforest/loot_tables/blocks/sorting_wall_sign.json +2d2ed2d7609bdbc63e4b032563a58b4889b1f3c0 data/twilightforest/loot_tables/blocks/sorting_wood.json +fd5e2f6a6b5dca6fe0b22cf789de3436790a180d data/twilightforest/loot_tables/blocks/spiral_bricks.json +d222b9157f748d82e0bd13c8ded99d3768ccf3a4 data/twilightforest/loot_tables/blocks/spruce_banister.json +ce5a390c9152c65bd43b9aa6b50de6dba74f8f50 data/twilightforest/loot_tables/blocks/steeleaf_block.json +f4407ea2fe653d9a757490adc96d9942d483255b data/twilightforest/loot_tables/blocks/stripped_canopy_log.json +6ae7c7ad1729db2eefdbfe4cd243580a459c7dc2 data/twilightforest/loot_tables/blocks/stripped_canopy_wood.json +e27b21ea6bad6efd0c0c623bbecc16ac49361d79 data/twilightforest/loot_tables/blocks/stripped_dark_log.json +9317a581476adc9eba2012532003d008a7a62651 data/twilightforest/loot_tables/blocks/stripped_dark_wood.json +4369f047d175fe04e24ce57c5409b37cd8a61176 data/twilightforest/loot_tables/blocks/stripped_mangrove_log.json +b2163e1c1b9039f4600b2fcb5dd58d18b7b5cb72 data/twilightforest/loot_tables/blocks/stripped_mangrove_wood.json +6e39f56b595fb684d37bfd856ff2cf7ec57fb9bf data/twilightforest/loot_tables/blocks/stripped_mining_log.json +a3cf2e175d72e01b7ca0d613dbc816d689599a45 data/twilightforest/loot_tables/blocks/stripped_mining_wood.json +2e501b05bf1a775273fe434aff6213316fe6fb4b data/twilightforest/loot_tables/blocks/stripped_sorting_log.json +4c56f49eed9b928d613eb4badfe9a3d0424feeaf data/twilightforest/loot_tables/blocks/stripped_sorting_wood.json +c1794aed97c1d87a0cc28e8c63dcf4e772536900 data/twilightforest/loot_tables/blocks/stripped_time_log.json +38a8cc8ae7d527ab6bc84f9f8932b626d02cf50b data/twilightforest/loot_tables/blocks/stripped_time_wood.json +fc670903d3d420b5cc34912ba0bcf43b87db3eab data/twilightforest/loot_tables/blocks/stripped_transformation_log.json +1704f077de9015b888048f2bf152485a93bcd7a0 data/twilightforest/loot_tables/blocks/stripped_transformation_wood.json +d001261f08be9f7274e55c4fa1175797386526c1 data/twilightforest/loot_tables/blocks/stripped_twilight_oak_log.json +f4a699643b843cbbe14db81eeba5dd8b80fe0bd1 data/twilightforest/loot_tables/blocks/stripped_twilight_oak_wood.json +529b0c4717acac3220fbfecce85f6366960b7d8c data/twilightforest/loot_tables/blocks/thick_castle_brick.json +fcf044a757971d0122d3e8750998d558cec2b033 data/twilightforest/loot_tables/blocks/thorn_leaves.json +6b9b7ff659476e0ff323adf168b32aba3faf2de2 data/twilightforest/loot_tables/blocks/thorn_rose.json +162d9424d4c06ff55e2bbde0d74fbac5268ea4b1 data/twilightforest/loot_tables/blocks/time_banister.json +acf0e6b206c3a7510999e3b3f059eec0808cc963 data/twilightforest/loot_tables/blocks/time_button.json +6bcd32870d64efa8c0823bf2a2aa09956b3812ad data/twilightforest/loot_tables/blocks/time_chest.json +bb2acc49c2f8dc0798a8c475c97a72d52143b485 data/twilightforest/loot_tables/blocks/time_door.json +bc604420fd83083ef4f5b3b8ef52e06a1db5e360 data/twilightforest/loot_tables/blocks/time_fence.json +a2ce4610ec86c55d9b4e26393d513b0cdd21b95a data/twilightforest/loot_tables/blocks/time_fence_gate.json +72b0e0bd8494e6172d7eec2e529f5c84b7b6a887 data/twilightforest/loot_tables/blocks/time_leaves.json +dd95f49c03f4d5a1776299f39263056fccc2aaeb data/twilightforest/loot_tables/blocks/time_log.json +dd95f49c03f4d5a1776299f39263056fccc2aaeb data/twilightforest/loot_tables/blocks/time_log_core.json +1d0a22916d380786f6dd65e13087faffc07ccf93 data/twilightforest/loot_tables/blocks/time_planks.json +2765ac09280ded406f56b07d85cc074157d94cef data/twilightforest/loot_tables/blocks/time_pressure_plate.json +2b64c82ad36b8a4a5f3db362029a60cd4d11cf92 data/twilightforest/loot_tables/blocks/time_sapling.json +dcb8ad13f3684cb94337ce0716c72c20e767aa69 data/twilightforest/loot_tables/blocks/time_sign.json +98d76ee95ead133d97dc67e16f2ee0b0c9949b69 data/twilightforest/loot_tables/blocks/time_slab.json +153aa230dbb5efa6ae24613d320a097a1a2e261f data/twilightforest/loot_tables/blocks/time_stairs.json +b25835d7de2a06f84ee2f2a62b3551c887a8fa29 data/twilightforest/loot_tables/blocks/time_trapdoor.json +dcb8ad13f3684cb94337ce0716c72c20e767aa69 data/twilightforest/loot_tables/blocks/time_wall_sign.json +38dbe8a3b529370237250ec730059e50104e4c84 data/twilightforest/loot_tables/blocks/time_wood.json +6ff710add10b91bc915ecb35199ae648c4ddea7d data/twilightforest/loot_tables/blocks/torchberry_plant.json +d70ffd770056f610419053c886c69d3d1d15f9cc data/twilightforest/loot_tables/blocks/towerwood.json +ba9fa721b7d9118ac5887e9debb1eb9c57cb7a7d data/twilightforest/loot_tables/blocks/transformation_banister.json +2aff57afceb80bf770c2791c48d7b592168bf504 data/twilightforest/loot_tables/blocks/transformation_button.json +87780a3cbe7c3a88562bdd194b1c0f0880e2a594 data/twilightforest/loot_tables/blocks/transformation_chest.json +1d2230bf4dbf06d2f97ef402bf7919d207ed3071 data/twilightforest/loot_tables/blocks/transformation_door.json +cbc5302aaf97eb984eb43dd84e9bf6a55961dc4e data/twilightforest/loot_tables/blocks/transformation_fence.json +09f3866e3644b7cb6527cae576f32480f3e77dd3 data/twilightforest/loot_tables/blocks/transformation_fence_gate.json +07b22b24cd28f2ecdddcd0a6ef1723efa15507c8 data/twilightforest/loot_tables/blocks/transformation_leaves.json +a6e6893cd0408c7a3c3f09c2a7c828674a2d4474 data/twilightforest/loot_tables/blocks/transformation_log.json +a6e6893cd0408c7a3c3f09c2a7c828674a2d4474 data/twilightforest/loot_tables/blocks/transformation_log_core.json +b1e1b1854de51b554fe7dc86f9818936467fcb63 data/twilightforest/loot_tables/blocks/transformation_planks.json +9a774218b185f8a0fa8990d0a145827df31ea5d9 data/twilightforest/loot_tables/blocks/transformation_pressure_plate.json +c0459067b5cb6f124af75c2815c45b65ab37f990 data/twilightforest/loot_tables/blocks/transformation_sapling.json +a964c1700ea0832d23cc7accf1e3bf25bd8c7e8c data/twilightforest/loot_tables/blocks/transformation_sign.json +63f80d2e76f04f866dfc1d1543e6be49da05a5c9 data/twilightforest/loot_tables/blocks/transformation_slab.json +882b2af378481b13e5933fb69c499135d42b413b data/twilightforest/loot_tables/blocks/transformation_stairs.json +564f84ea164c3fd2e8d8a71f7ab047bd2ac667cd data/twilightforest/loot_tables/blocks/transformation_trapdoor.json +a964c1700ea0832d23cc7accf1e3bf25bd8c7e8c data/twilightforest/loot_tables/blocks/transformation_wall_sign.json +45650b37692f836d0f8844b2b5cc68541063a964 data/twilightforest/loot_tables/blocks/transformation_wood.json +76beef3ced6e7c8fdb230bfc1b796fc518164e75 data/twilightforest/loot_tables/blocks/trollber.json +f62ad8c36ccde0b9e0bb6f789aed7c9226a2220c data/twilightforest/loot_tables/blocks/trollsteinn.json +03df1bcb60a3a280d01e3d59f184f7dc29e9bf46 data/twilightforest/loot_tables/blocks/trollvidr.json +0cae1c6fe7b572973ee5a7093221267a4acd7e1a data/twilightforest/loot_tables/blocks/trophy_pedestal.json +7da2adffc0cdca9c5baa73c77f8fdaa39a6e70c4 data/twilightforest/loot_tables/blocks/twilight_oak_banister.json +e3a51cbe65149811b5944b0b7aafe226743b9b71 data/twilightforest/loot_tables/blocks/twilight_oak_button.json +33b5df48c145224bca2af7ca8863bf40debeb5f1 data/twilightforest/loot_tables/blocks/twilight_oak_chest.json +8bfae5384523ce46f2f943aeec9b836c9b7760da data/twilightforest/loot_tables/blocks/twilight_oak_door.json +09f4db7906cb023e5f70558c48d2b1c4f529e6b3 data/twilightforest/loot_tables/blocks/twilight_oak_fence.json +be953a50be5fe10de25a1713e239696e435bf605 data/twilightforest/loot_tables/blocks/twilight_oak_fence_gate.json +9f774680ed4cfd36183cd393d866fdb73b1f746b data/twilightforest/loot_tables/blocks/twilight_oak_leaves.json +1d6a27523a796b1a89c32a64e7b76cf3e1d1e473 data/twilightforest/loot_tables/blocks/twilight_oak_log.json +c3ea80b25f20978349277aa91e64ff6f746243f8 data/twilightforest/loot_tables/blocks/twilight_oak_planks.json +801994ebf7b8baf54c7b3731bc9053b9bd1f2036 data/twilightforest/loot_tables/blocks/twilight_oak_pressure_plate.json +375403e4deabd5819214c7118bde89c7bc931ac6 data/twilightforest/loot_tables/blocks/twilight_oak_sapling.json +066c98cf84f229522375363edf3e7b1b6983c30f data/twilightforest/loot_tables/blocks/twilight_oak_sign.json +0ab91627da913a9b2608ad6dd2e90c64b508467c data/twilightforest/loot_tables/blocks/twilight_oak_slab.json +f6a019cfe95bfac833c202b169fdc9e45ba97a3a data/twilightforest/loot_tables/blocks/twilight_oak_stairs.json +04ec3d7a0ec49850b6e57051df8ef0238feec0a7 data/twilightforest/loot_tables/blocks/twilight_oak_trapdoor.json +14fef9e14eab8ecc8a91ce44592cb2b8e3eb274b data/twilightforest/loot_tables/blocks/twilight_oak_wood.json +bf5797548e7c5a9fb6a3e43299d53df61f6ecca9 data/twilightforest/loot_tables/blocks/twilight_portal_miniature_structure.json +066c98cf84f229522375363edf3e7b1b6983c30f data/twilightforest/loot_tables/blocks/twilight_wall_sign.json +8f77f7f7a2517cc9406ee76dc481a5ca845e36dd data/twilightforest/loot_tables/blocks/twisted_stone.json +ce0065c513570787308d875e695852f89e9b227f data/twilightforest/loot_tables/blocks/twisted_stone_pillar.json +b6dc615d23bf39f4c043f8e1cdb635c0be9cb708 data/twilightforest/loot_tables/blocks/uberous_soil.json +4add00a556f05b161ddcf2386c4bba11b74f5202 data/twilightforest/loot_tables/blocks/uncrafting_table.json +1373f6076d89ffa9d2a8632c1fc669b163b33b9e data/twilightforest/loot_tables/blocks/underbrick.json +8689895d96be2ae8f77aa6748d4ab61a587990e3 data/twilightforest/loot_tables/blocks/underbrick_floor.json +1e53fb810e73cdb64bd26b174069d00c7f9f7a3c data/twilightforest/loot_tables/blocks/unripe_trollber.json +4ed7d43465872b218ca3820a31eb473e942b95ae data/twilightforest/loot_tables/blocks/ur_ghast_trophy.json +4ed7d43465872b218ca3820a31eb473e942b95ae data/twilightforest/loot_tables/blocks/ur_ghast_wall_trophy.json +a9a0a9eaa340d3decabccd06e07279002e5be815 data/twilightforest/loot_tables/blocks/vangrove_banister.json +69949f5e82dd38df0a8c9c68f83072a2f28f9d9b data/twilightforest/loot_tables/blocks/vanishing_block.json +adcb0d1c2229bfe09587a91ea4dfdff0a4e72962 data/twilightforest/loot_tables/blocks/violet_castle_door.json +0c402b354250ab11abba9868bc869b124c43d2e6 data/twilightforest/loot_tables/blocks/violet_castle_rune_brick.json +798280df616cffae805a8cf7f55d6e783b61b9c2 data/twilightforest/loot_tables/blocks/warped_banister.json +2563f7c65962cb94f85b251d62397a1cdd904ed0 data/twilightforest/loot_tables/blocks/weathered_deadrock.json +83e459bc3ef4344c8e3d9fa5362ccfc64df3bc59 data/twilightforest/loot_tables/blocks/wispy_cloud.json +4cad70ba26d71ff95694ad05924276e7ff29e5b3 data/twilightforest/loot_tables/blocks/wither_skeleton_skull_candle.json +4cad70ba26d71ff95694ad05924276e7ff29e5b3 data/twilightforest/loot_tables/blocks/wither_skeleton_wall_skull_candle.json +251b46491bb25eb4c2fd93b2b05b62f314fcb679 data/twilightforest/loot_tables/blocks/worn_castle_brick.json +ecef718feac2680e6f395bf69cc1a7e65e459cc6 data/twilightforest/loot_tables/blocks/worn_castle_brick_stairs.json +9f42d0040d2568d24ba39ef605fe9676437dd64c data/twilightforest/loot_tables/blocks/yellow_castle_door.json +44ccd9eb14b239318f7788b38d62ea373ee1c093 data/twilightforest/loot_tables/blocks/yellow_castle_rune_brick.json +1b26f0b118c28d018a24ef09269262b3fd00afc1 data/twilightforest/loot_tables/blocks/zombie_skull_candle.json +1b26f0b118c28d018a24ef09269262b3fd00afc1 data/twilightforest/loot_tables/blocks/zombie_wall_skull_candle.json +853540881c512364bf532816039e017e0c11d7f7 data/twilightforest/loot_tables/chests/aurora_cache.json +6d003afc6c937a36a8726208f17a6abd83c77d20 data/twilightforest/loot_tables/chests/aurora_room.json +212e57fa11aeffe4fbf764fa560843057c5d3983 data/twilightforest/loot_tables/chests/basement.json +b3d09be7fcaad0f5051681e45e50cd976c5159de data/twilightforest/loot_tables/chests/darktower_boss.json +673a182445140950215a5e6dc9f5a7de5440845e data/twilightforest/loot_tables/chests/darktower_cache.json +cd7e34bf8bdb0cf7489cf211b364af7908eff7a2 data/twilightforest/loot_tables/chests/darktower_key.json +7b32112c464d4fc8a06e87790cc250da77507e8a data/twilightforest/loot_tables/chests/fancy_well.json +d5ba592103013a4a6b22f28f7b08fa64d9239c26 data/twilightforest/loot_tables/chests/foundation_basement.json +0c019bad5304734130609c534060c2155ccf180f data/twilightforest/loot_tables/chests/graveyard.json +dd5b642c658b77ec2c01d9026754f35c585e71c1 data/twilightforest/loot_tables/chests/hedge_maze.json +c4e08c5239e243c583b48a16fa1fb0088f81a0cc data/twilightforest/loot_tables/chests/hill_1.json +ae412ff9053db7b11dd82345d2c735afaa5f4181 data/twilightforest/loot_tables/chests/hill_2.json +dbbf127973576bf11cd58b41fe0c94a0905757cf data/twilightforest/loot_tables/chests/hill_3.json +4ce93dc724b106e8c4146afd3228b9acb55b7747 data/twilightforest/loot_tables/chests/labyrinth_dead_end.json +4bc25d4edc4e1e1f2935153df4a87e1f272cbbca data/twilightforest/loot_tables/chests/labyrinth_room.json +380fdd113e90cf9b95f699498fa86d54249a76f8 data/twilightforest/loot_tables/chests/labyrinth_vault.json +959347ea19b3640d14d10420e871bfcc32f2ac7f data/twilightforest/loot_tables/chests/labyrinth_vault_jackpot.json +c1c96959a38e6f1d40825057a663310b1e122ba2 data/twilightforest/loot_tables/chests/quest_grove_dropper.json +b9efa57dd37cead82cc643a6e73763f7dd155cae data/twilightforest/loot_tables/chests/stronghold_boss.json +fb040a774a96c74309f3c12bb9c03341263fadb8 data/twilightforest/loot_tables/chests/stronghold_cache.json +5b15db0955e19317a90ba0c686d0a945b83d4aba data/twilightforest/loot_tables/chests/stronghold_room.json +3bc07ff019e1a496218200d29decf22ff43382df data/twilightforest/loot_tables/chests/tower_library.json +d91f9829328ce5ca6e8ae43ff7b5d72eb6523592 data/twilightforest/loot_tables/chests/tower_room.json +1839521caf806dd80e66f432833d79893addca95 data/twilightforest/loot_tables/chests/tree_cache.json +8504dd8602cdf5a750a8a3627fca6ada91849302 data/twilightforest/loot_tables/chests/troll_garden.json +2b51965a8272bd9ccd89e34945375af2c9920e85 data/twilightforest/loot_tables/chests/troll_vault.json +5632c29457c2e60a96f3dc3bb4d879236318c065 data/twilightforest/loot_tables/chests/troll_vault_with_lamp.json +9b0a99dfcb566400ad55577de0c36d9f0727b1b0 data/twilightforest/loot_tables/chests/useless.json +c1da0ba3e2ac74fef87ceb1f6f8919f638349c59 data/twilightforest/loot_tables/chests/well.json +ef017fe8afbc1e704a7cfb4818ece7ba018f9c91 data/twilightforest/loot_tables/entities/adherent.json +091db47b6e92fc2271c3bba0f8479836c3ab3be8 data/twilightforest/loot_tables/entities/alpha_yeti.json +5f2d573a50334c27a295359482410cdd58022b10 data/twilightforest/loot_tables/entities/armored_giant.json +1afe52f331acbc98cb66f8fbf344d2f83b16d1e0 data/twilightforest/loot_tables/entities/bighorn_sheep.json +c56fbc8a7d7eec8ae3aa9c30f47e2364aa33199d data/twilightforest/loot_tables/entities/bighorn_sheep/black.json +fe2bebdb702534444bbdee95b1939b65f36bed0c data/twilightforest/loot_tables/entities/bighorn_sheep/blue.json +6b4561eb14f1cd9aec883fd6a52bad043e96baf3 data/twilightforest/loot_tables/entities/bighorn_sheep/brown.json +cf29ecc12653d39a058ca47529cc89b48eea236d data/twilightforest/loot_tables/entities/bighorn_sheep/cyan.json +f9e53ebd20a7d0549714aaff76742157ee5f06ef data/twilightforest/loot_tables/entities/bighorn_sheep/gray.json +911537c140e3ddd280101fcbfbc4f87e7421cdb0 data/twilightforest/loot_tables/entities/bighorn_sheep/green.json +8e2b85e7bfc96495e88f0e745befe3da3907afae data/twilightforest/loot_tables/entities/bighorn_sheep/light_blue.json +bdae268d23c98390545fb937014c300565fefbdd data/twilightforest/loot_tables/entities/bighorn_sheep/light_gray.json +259c036ad2f0fd44a582a5f805033c71357d2850 data/twilightforest/loot_tables/entities/bighorn_sheep/lime.json +aaf3f2cc65d6e937af4a23b686ce793dd7c16948 data/twilightforest/loot_tables/entities/bighorn_sheep/magenta.json +0cd9918d4aadac432e62eb3cd0f5725d283cd49a data/twilightforest/loot_tables/entities/bighorn_sheep/orange.json +a40a83ee09784e2175a5deb8770a42302a387897 data/twilightforest/loot_tables/entities/bighorn_sheep/pink.json +24df95a9ce56612de34e158071a354641bbb6b34 data/twilightforest/loot_tables/entities/bighorn_sheep/purple.json +3e3ebb340b5de7b62c7c3e87cdcdacdaaf1cd69e data/twilightforest/loot_tables/entities/bighorn_sheep/red.json +bf3643909b4c22f2efe0d137d55e8fcdbf8d8049 data/twilightforest/loot_tables/entities/bighorn_sheep/white.json +af1b9d0494a0df24977b30e7daae1963b9e7219d data/twilightforest/loot_tables/entities/bighorn_sheep/yellow.json +7291073021c6e3fc1889111955c60f3735966f87 data/twilightforest/loot_tables/entities/blockchain_goblin.json +141d5d6c3bc3a8f5080486a1ccf9653964f9a4ca data/twilightforest/loot_tables/entities/boar.json +024c7ef5cedca37c16581270ad22f439476c14d3 data/twilightforest/loot_tables/entities/carminite_broodling.json +420a1b43127a55198e6d5edcd6e58171b7ae84ae data/twilightforest/loot_tables/entities/carminite_ghastguard.json +9bbe174a75ad751c141ffd6b018a16509b77c606 data/twilightforest/loot_tables/entities/carminite_ghastling.json +42eca4f58a36cabf8896ccf3a09dedab10dafa0a data/twilightforest/loot_tables/entities/carminite_golem.json +c7ab86c772bf182a5f270d77cb0e2c4354bbcb1d data/twilightforest/loot_tables/entities/death_tome.json +ccae5c628113bdfe17dd5699d77e11d30bf8b308 data/twilightforest/loot_tables/entities/death_tome_books.json +fd603b7ceeaa67f6759448a45f77fa1ab850f81f data/twilightforest/loot_tables/entities/death_tome_hurt.json +56c14515ad777a2d81d676040eecb112c3c8867b data/twilightforest/loot_tables/entities/deer.json +33c3efcd3546f2413c9d09b1771623f152114895 data/twilightforest/loot_tables/entities/dwarf_rabbit.json +9bbccbee0e57a78befd54eab8fbef4eff8152526 data/twilightforest/loot_tables/entities/fire_beetle.json +9f32a1bc228f86d896ac9614ee6a4f04ffbe4353 data/twilightforest/loot_tables/entities/giant_miner.json +ef017fe8afbc1e704a7cfb4818ece7ba018f9c91 data/twilightforest/loot_tables/entities/harbinger_cube.json +024c7ef5cedca37c16581270ad22f439476c14d3 data/twilightforest/loot_tables/entities/hedge_spider.json +ea38e14f041d57a276808b9a658bfe23f22a08c9 data/twilightforest/loot_tables/entities/helmet_crab.json +783fb88bf21bbcf0f105eec241d8d17b8741c997 data/twilightforest/loot_tables/entities/hostile_wolf.json +cb97ee445319c64fa039eb43134e358192f3d95c data/twilightforest/loot_tables/entities/hydra.json +85074e944a908db341974d259110063283b0f6ff data/twilightforest/loot_tables/entities/ice_crystal.json +024c7ef5cedca37c16581270ad22f439476c14d3 data/twilightforest/loot_tables/entities/king_spider.json +ef017fe8afbc1e704a7cfb4818ece7ba018f9c91 data/twilightforest/loot_tables/entities/knight_phantom.json +47e5423f656d26708ed2bc95e241ff3b6e3199a9 data/twilightforest/loot_tables/entities/kobold.json +eac8f84f086f209f2e368f75116127d34c6e1656 data/twilightforest/loot_tables/entities/lich.json +ef017fe8afbc1e704a7cfb4818ece7ba018f9c91 data/twilightforest/loot_tables/entities/lich_minion.json +7291073021c6e3fc1889111955c60f3735966f87 data/twilightforest/loot_tables/entities/lower_goblin_knight.json +ef017fe8afbc1e704a7cfb4818ece7ba018f9c91 data/twilightforest/loot_tables/entities/loyal_zombie.json +46a1c356512977c4344c24f650289c3d84da52cb data/twilightforest/loot_tables/entities/maze_slime.json +96cafc63865f678a0103f76ff713ad92f57841cd data/twilightforest/loot_tables/entities/minoshroom.json +376d7a51b6aabbab40aa9306047fbe0bce174ba4 data/twilightforest/loot_tables/entities/minotaur.json +783fb88bf21bbcf0f105eec241d8d17b8741c997 data/twilightforest/loot_tables/entities/mist_wolf.json +ef017fe8afbc1e704a7cfb4818ece7ba018f9c91 data/twilightforest/loot_tables/entities/mosquito_swarm.json +6103f7f82f65442694822ea271be4dfdbe2e01b2 data/twilightforest/loot_tables/entities/naga.json +3bb6738bc72852864276455ff558580bd9196c8c data/twilightforest/loot_tables/entities/penguin.json +ef017fe8afbc1e704a7cfb4818ece7ba018f9c91 data/twilightforest/loot_tables/entities/pinch_beetle.json +ef017fe8afbc1e704a7cfb4818ece7ba018f9c91 data/twilightforest/loot_tables/entities/plateau_boss.json +5856ef06dde0a193b2bf3d14e9ce6348616348de data/twilightforest/loot_tables/entities/questing_ram_rewards.json +ef017fe8afbc1e704a7cfb4818ece7ba018f9c91 data/twilightforest/loot_tables/entities/quest_ram.json +53fe759ce8b0828308d42091b01c5608dc7e3d19 data/twilightforest/loot_tables/entities/raven.json +d4b1c2236dd7c80a4bb2faf7f8267f8bf2b41bc6 data/twilightforest/loot_tables/entities/redcap.json +13cbc3b0403816220ffa764eda30cac8b4b30652 data/twilightforest/loot_tables/entities/redcap_sapper.json +d10e857ca8aaea5d4eab8dfd57b2132964b855c5 data/twilightforest/loot_tables/entities/rising_zombie.json +ef017fe8afbc1e704a7cfb4818ece7ba018f9c91 data/twilightforest/loot_tables/entities/roving_cube.json +5b3adfe7bea747796813f4a5401f2be713ef29f6 data/twilightforest/loot_tables/entities/skeleton_druid.json +408a0d53d8817b059e4bcc9d75dbef143128ea35 data/twilightforest/loot_tables/entities/slime_beetle.json +85074e944a908db341974d259110063283b0f6ff data/twilightforest/loot_tables/entities/snow_guardian.json +24f4e70382f9ccfe1d607794ff67e772f916aa34 data/twilightforest/loot_tables/entities/snow_queen.json +ef017fe8afbc1e704a7cfb4818ece7ba018f9c91 data/twilightforest/loot_tables/entities/squirrel.json +85074e944a908db341974d259110063283b0f6ff data/twilightforest/loot_tables/entities/stable_ice_core.json +024c7ef5cedca37c16581270ad22f439476c14d3 data/twilightforest/loot_tables/entities/swarm_spider.json +3bb6738bc72852864276455ff558580bd9196c8c data/twilightforest/loot_tables/entities/tiny_bird.json +e599660a4a15dead0677fbf1caf3afee18fd1491 data/twilightforest/loot_tables/entities/towerwood_borer.json +33b9ff4dcdaec4126d6f4d1abd7d414c8b61f38c data/twilightforest/loot_tables/entities/troll.json +85074e944a908db341974d259110063283b0f6ff data/twilightforest/loot_tables/entities/unstable_ice_core.json +7291073021c6e3fc1889111955c60f3735966f87 data/twilightforest/loot_tables/entities/upper_goblin_knight.json +d4e7ef0cc768f7ae811c760bbfd8fe09b868b618 data/twilightforest/loot_tables/entities/ur_ghast.json +127d89f0bbe00d7e92afd3019844ff77a9c5a2e2 data/twilightforest/loot_tables/entities/winter_wolf.json +72f3f79b35771b026f12a7a4ebf63febdd532764 data/twilightforest/loot_tables/entities/wraith.json +127d89f0bbe00d7e92afd3019844ff77a9c5a2e2 data/twilightforest/loot_tables/entities/yeti.json diff --git a/src/generated/resources/.cache/735031f3addf80804addae5e3f53249900116f1e b/src/generated/resources/.cache/735031f3addf80804addae5e3f53249900116f1e new file mode 100644 index 0000000000..ac50e9831e --- /dev/null +++ b/src/generated/resources/.cache/735031f3addf80804addae5e3f53249900116f1e @@ -0,0 +1,2 @@ +// 1.19.4 2023-05-29T20:29:25.2102623 Sound Definitions +5235692e3e8cc52dd0041d27304c79f66690b987 assets/twilightforest/sounds.json diff --git a/src/generated/resources/.cache/94f15e09d9a54d422942084512238ed72a5efe0c b/src/generated/resources/.cache/94f15e09d9a54d422942084512238ed72a5efe0c new file mode 100644 index 0000000000..d8fb9ccef3 --- /dev/null +++ b/src/generated/resources/.cache/94f15e09d9a54d422942084512238ed72a5efe0c @@ -0,0 +1,592 @@ +// 1.19.4 2023-05-27T11:08:34.626041 TwilightForest Item and BlockItem models +387b18dfa614fda790f7b8e8324e3b139fa177c2 assets/twilightforest/models/item/acacia_banister.json +63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/twilightforest/models/item/adherent_spawn_egg.json +0ca7dc7b4daec376dd0f85d57465830781584c7d assets/twilightforest/models/item/alpha_yeti_banner_pattern.json +17203ca19cd437b70ed9a4cd2fa866e6cfa422fd assets/twilightforest/models/item/alpha_yeti_boss_spawner.json +274c3000936ceb00dccb80ac0b861098b26be25f assets/twilightforest/models/item/alpha_yeti_fur.json +63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/twilightforest/models/item/alpha_yeti_spawn_egg.json +b0f49be7e29a30b720ef5e108232979b8e1658fd assets/twilightforest/models/item/antibuilder.json +f94118b9a6f4b2575c6b78af6c763867206c31aa assets/twilightforest/models/item/arctic_boots.json +62f0591f767447adefba35d17eeff2ebdd0a3b21 assets/twilightforest/models/item/arctic_chestplate.json +43aefce702a3d2f7e1d77cc74ebbe4b71b31edc7 assets/twilightforest/models/item/arctic_fur.json +5373ae28c709eaef4815bf6764cc593c62145109 assets/twilightforest/models/item/arctic_fur_block.json +813f6b046253b6007dd912a879499d51edeb72fb assets/twilightforest/models/item/arctic_helmet.json +df8d2976d7e31a05d269085a675b64500f312969 assets/twilightforest/models/item/arctic_leggings.json +63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/twilightforest/models/item/armored_giant_spawn_egg.json +0efc097cbb44aa1a043e535d92cefcdf2ccfce70 assets/twilightforest/models/item/armor_shard.json +cb2255d73af1355ad61e69229c59abeeffff5808 assets/twilightforest/models/item/armor_shard_cluster.json +133be3155aa480bdf02081e13ca0e762069d42d8 assets/twilightforest/models/item/auroralized_glass.json +96b34f14857cd4d6c86e188e389b134c75099612 assets/twilightforest/models/item/aurora_block.json +c34803aa239dbafa3c0286d98e6c16ab69c749ce assets/twilightforest/models/item/aurora_pillar.json +c1a459bcf79cfcd7d0bc5ad1cc47ec0c2f7cf2fa assets/twilightforest/models/item/aurora_slab.json +3b22b7437760208f6214b9b121890393af3278a2 assets/twilightforest/models/item/beanstalk_leaves.json +63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/twilightforest/models/item/bighorn_sheep_spawn_egg.json +9916d25d03b28f2a6fc30d0f18e6b7607ec7f3f1 assets/twilightforest/models/item/birch_banister.json +63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/twilightforest/models/item/blockchain_goblin_spawn_egg.json +c30c07f286b75a6cb43443caa8877638d84abc6c assets/twilightforest/models/item/block_and_chain.json +ccb6875f92bac4395777de14ea6a7c5a8aba3339 assets/twilightforest/models/item/block_and_chain_thrown.json +4d1426ff55ca37680f67f1d61b86bc0679fc9d8c assets/twilightforest/models/item/blue_castle_door.json +b27493eda49748814ba36a9543ccdcd33d7b44e2 assets/twilightforest/models/item/blue_castle_rune_brick.json +5e9c8652c022e5e87e03ecc2d633d409cd925eda assets/twilightforest/models/item/blue_force_field.json +63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/twilightforest/models/item/boar_spawn_egg.json +ff3692b853e3e22cbd6ae8acdc98c895dfddcff2 assets/twilightforest/models/item/bold_castle_brick_pillar.json +47608230139b3feb85e223e05909ae232f4f15b3 assets/twilightforest/models/item/bold_castle_brick_stairs.json +f9fe71a7b6f6784a1347c3c472f3527c16b66d09 assets/twilightforest/models/item/bold_castle_brick_tile.json +518a0e198a1b7e36f9e1554ccb1686c6eb860fd3 assets/twilightforest/models/item/bold_stone_pillar.json +6d65cf8e13ce9afe4c2fe6ab81d35749bf7ad362 assets/twilightforest/models/item/borer_essence.json +1a70eed84e70224c852b86c9a461a18f11b98e04 assets/twilightforest/models/item/brittle_flask_0.json +86cee6d3b167f7b16bafb2b64e868bc4f6171b40 assets/twilightforest/models/item/brittle_flask_0_cracked.json +b87073066de06e67d9dd8823974afd41f8c8051b assets/twilightforest/models/item/brittle_flask_0_damaged.json +f4c83b0220813df38527231d719b4d1519589e70 assets/twilightforest/models/item/brittle_flask_0_splintered.json +766d6fed4b3f34a1d03c11d07b621ca2c1058f1d assets/twilightforest/models/item/brittle_flask_1.json +d31531758d48946ecac48092191efc162a3ed326 assets/twilightforest/models/item/brittle_flask_1_cracked.json +16ac4f85ba25e9dbcd7175c02c745071030779d1 assets/twilightforest/models/item/brittle_flask_1_damaged.json +8fac797544f56aa293441e8521770ae5a5ed274a assets/twilightforest/models/item/brittle_flask_1_splintered.json +e76796761a8294a154d84b30fb077d085e562f7c assets/twilightforest/models/item/brittle_flask_2.json +8417374ab92ae31f5064b9762ca7d0eaf76436bb assets/twilightforest/models/item/brittle_flask_2_cracked.json +e47397a8286cea6965dcfec7af1346148778e138 assets/twilightforest/models/item/brittle_flask_2_damaged.json +47a153bf0da5549974b1a76622bebe5b227d5f63 assets/twilightforest/models/item/brittle_flask_2_splintered.json +6d120e76e2d89ea45e1fe4252ec01078d6345225 assets/twilightforest/models/item/brittle_flask_3.json +84ef854ee7ca81896e331e6d845a7709d59bf266 assets/twilightforest/models/item/brittle_flask_3_cracked.json +bbd34d60f1e094ba23b890b3c7dec442cc4d2007 assets/twilightforest/models/item/brittle_flask_3_damaged.json +693a16cbbe49725b1f3254274c1909c3b126a0d8 assets/twilightforest/models/item/brittle_flask_3_splintered.json +61eb1abc7ebe22b341c6ec492483567576f1d17c assets/twilightforest/models/item/brittle_flask_cracked.json +70a875d94ad7dd9f35eb6ad9fb042b083c1a463b assets/twilightforest/models/item/brittle_flask_damaged.json +d545882f9f495a8375818400535be2adf1af9cfd assets/twilightforest/models/item/brittle_flask_splintered.json +c3d3f44663360d5a1dbbe29ffe6380a4f894f830 assets/twilightforest/models/item/brittle_potion_flask.json +820c37ce361c42fa08780fa95348363f3896eca2 assets/twilightforest/models/item/brown_thorns.json +467cebcf3cd3374114448574b195816d14b53a81 assets/twilightforest/models/item/burnt_thorns.json +d404dcffd014ea0eb89122556e589a11bed66d85 assets/twilightforest/models/item/candelabra.json +1639d7fb985d33b297dd58da1b489820665447bb assets/twilightforest/models/item/canopy_banister.json +f530b5269751cdcc82e3e8c32377525d10d714e7 assets/twilightforest/models/item/canopy_boat.json +1df5a2758ad31a70e41c2cd47e8cb5d949c6aefc assets/twilightforest/models/item/canopy_bookshelf.json +0f80256a684719dfa73e8bba344f3e48dd53289d assets/twilightforest/models/item/canopy_button.json +ddc05a33bf4ba0942b0f1fb4fc0bc836108b568f assets/twilightforest/models/item/canopy_chest.json +48e3e4d78b6f73076f5583cfb1b785dc8fa6e543 assets/twilightforest/models/item/canopy_chest_boat.json +0d7e5b2169d98f22cbc4624c90f1c4e28ead5325 assets/twilightforest/models/item/canopy_door.json +68445466001d8ec8b993414b5814fcddd201a163 assets/twilightforest/models/item/canopy_fence.json +91421275fa757830c69f40d1bb3a3dd851ed0f8b assets/twilightforest/models/item/canopy_fence_gate.json +03d9c494a15b47cd2e368d9c2e758459918db390 assets/twilightforest/models/item/canopy_leaves.json +ee43b35ea1860705d7e5b49074846128a2983514 assets/twilightforest/models/item/canopy_log.json +c875e52ce83c9f44612ad06b1a556274b9355f5a assets/twilightforest/models/item/canopy_planks.json +a826eed852f134c6ef4023acfd6ec961e119018a assets/twilightforest/models/item/canopy_pressure_plate.json +8a3e8ba9f34d032613131ec608c4e4e4a87f2b29 assets/twilightforest/models/item/canopy_sapling.json +8d4c5efd0250471a58e9cb2c730fe05f28903ad0 assets/twilightforest/models/item/canopy_sign.json +754ffa120fe549e514529bd128ea2f8742425b3c assets/twilightforest/models/item/canopy_slab.json +b70f386b9e5b703004bb3e6a2d154b51c1bbd3a0 assets/twilightforest/models/item/canopy_stairs.json +d744d5d72c5b80d630777c1fe0d5198272e06767 assets/twilightforest/models/item/canopy_trapdoor.json +8b68feea16bd21e81106fe7c3c3aa053f5a16145 assets/twilightforest/models/item/canopy_wood.json +9901000538c862f49e76ff36814f9896accae32d assets/twilightforest/models/item/carminite.json +0eab36383e5aa3d785ef173f463bd32e7f6d0753 assets/twilightforest/models/item/carminite_block.json +63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/twilightforest/models/item/carminite_broodling_spawn_egg.json +9ec9bd5027d11975e744829f1a345afbabcde74f assets/twilightforest/models/item/carminite_builder.json +63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/twilightforest/models/item/carminite_ghastguard_spawn_egg.json +63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/twilightforest/models/item/carminite_ghastling_spawn_egg.json +63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/twilightforest/models/item/carminite_golem_spawn_egg.json +756b33f4e4e99e4e850e8d46d4209461bbb0c8fe assets/twilightforest/models/item/carminite_reactor.json +74f61565fed0e144fbd75cd7c3ebc7c91462e832 assets/twilightforest/models/item/castle_brick.json +b9caeaf0cc9138d7adddb83cd5188763b3cf006f assets/twilightforest/models/item/castle_brick_stairs.json +a8e1edadaf3d710647b01acbe6ecba65b21691c8 assets/twilightforest/models/item/castle_roof_tile.json +222ce8147a8764473227191fe2e2c05797ca0a43 assets/twilightforest/models/item/charm_of_keeping_1.json +763a6980808455c71b2ad6467f55f7c7e057715f assets/twilightforest/models/item/charm_of_keeping_2.json +c50f26fad82a552662a94f174591373b8f80e4a2 assets/twilightforest/models/item/charm_of_keeping_3.json +df0898c30d4de00dbea13cb826421b02d2fbb58d assets/twilightforest/models/item/charm_of_life_1.json +d3a3e3ad93428c961cd3665623af8d0f92c59b9b assets/twilightforest/models/item/charm_of_life_2.json +c9b93fd80e1127475977ce7e7508b44a4990a756 assets/twilightforest/models/item/cicada_jar.json +60287266a73cc75aea724a679eef047886e30aa3 assets/twilightforest/models/item/cinder_furnace.json +b9819b08c50eb1669081cbdefcda06703a043530 assets/twilightforest/models/item/cinder_log.json +c0905c2fad082d3d418febd423b7b90cdee47d03 assets/twilightforest/models/item/cinder_wood.json +5084f55df6adb38957ad4c8bd6b8369dfe286124 assets/twilightforest/models/item/clover_patch.json +672edc91d696882be7a512bd4b0016095d10bd5b assets/twilightforest/models/item/cooked_meef.json +55102a381f3b4f01bc9e6a243790d044a95cd5c8 assets/twilightforest/models/item/cooked_venison.json +224e219e1b2f6fb388c7322635359dd1e73d7000 assets/twilightforest/models/item/cracked_castle_brick.json +aab2deb218129c314139eb8f9446f9f19be2f404 assets/twilightforest/models/item/cracked_castle_brick_stairs.json +66a6e390de0a47c05ebea4b26bd3c5684390cece assets/twilightforest/models/item/cracked_deadrock.json +eca62a9a2d743fef8e3e7134e459754e5c89654d assets/twilightforest/models/item/cracked_etched_nagastone.json +ac8fbe9bc9ac1a9bacdcf29c3cd15043f171a1e9 assets/twilightforest/models/item/cracked_mazestone.json +c0ae181cd3fc4957fa1d26787d8bb30028311b1e assets/twilightforest/models/item/cracked_nagastone_pillar.json +e0c97aa225d494830deacacefe909ea7445016df assets/twilightforest/models/item/cracked_nagastone_stairs_left.json +e1ffc6d6a57fdbbb38445efa9a7d08cb95d0086c assets/twilightforest/models/item/cracked_nagastone_stairs_right.json +2aa4c0d11f4bb55ad3f37e6912c2ffa26b9bdb8a assets/twilightforest/models/item/cracked_towerwood.json +6b6a25ad9ce64efc5c2dc11c2409bab06ca245a3 assets/twilightforest/models/item/cracked_underbrick.json +bf81b7da7483a7cb79e848de49ff41d1c6c832f9 assets/twilightforest/models/item/creeper_skull_candle.json +ddf1661fe44de18c06718d5e915599ffe8a54b32 assets/twilightforest/models/item/crimson_banister.json +f49a7461b6de4822b4190d497c6db54a7c5d8721 assets/twilightforest/models/item/crumble_horn.json +e5bc6e6bd2d27099d01f8c97ef219a4490508ca4 assets/twilightforest/models/item/cube_of_annihilation.json +1ce5d3fe1b3c3104bee4bab8dd23df16c5393881 assets/twilightforest/models/item/cube_of_annihilation_thrown.json +a7c7d75939e66246dbb6064fad965191f4da748e assets/twilightforest/models/item/cube_talisman.json +226c3441a79c7ab365bf47892c6039e62e81a1b3 assets/twilightforest/models/item/cut_mazestone.json +1a55c73749a19400422d96f7d7ec241f75daf441 assets/twilightforest/models/item/darkwood_sapling.json +812fac756a5cd11bf20bf69bb67500cb411d861a assets/twilightforest/models/item/dark_banister.json +8b091e6bdefce5c8702babeb30bd1e889ba085f0 assets/twilightforest/models/item/dark_boat.json +1c923e2245bfed3a7413afb0fb7a51ca2c2bb80c assets/twilightforest/models/item/dark_button.json +31bb8e075e499ae624ac0953114b8d041d9db2c0 assets/twilightforest/models/item/dark_chest.json +b7110fa6b11685eb8a7a0ac2bf30b1cb99c59e4b assets/twilightforest/models/item/dark_chest_boat.json +5eaf127017ea2e5cc3c238138fdf72b423acb6fe assets/twilightforest/models/item/dark_door.json +8f3e50d5f00e12fe140bd221eafd12c5c8bf316e assets/twilightforest/models/item/dark_fence.json +9dca19be75a38ab4df224625e5a47abd25767266 assets/twilightforest/models/item/dark_fence_gate.json +9bf267650fbd93133b0d98edf43ab29855608b89 assets/twilightforest/models/item/dark_leaves.json +beebee3994203a5d399747944664c240205ee204 assets/twilightforest/models/item/dark_log.json +f4434593ad6cdfca0c67926f0d3bd9a28d40a14e assets/twilightforest/models/item/dark_oak_banister.json +ce7d53c3068f3707c3e35bd86d88725996ba07cc assets/twilightforest/models/item/dark_planks.json +bb7778528993122f7e0e1580cf2f8f0f020444ac assets/twilightforest/models/item/dark_pressure_plate.json +eabcc78bb30aef9eb11d6f55ff944b8623f85eda assets/twilightforest/models/item/dark_sign.json +e55282d4e6cb8b9c19dc036e7174e2fe39f01a7a assets/twilightforest/models/item/dark_slab.json +5a9ccf782f81a4a2eac0c200144458052781e155 assets/twilightforest/models/item/dark_stairs.json +fc7fa6c2d37875a13c4c9ab7eeac2ef6b5a37354 assets/twilightforest/models/item/dark_trapdoor.json +90d034851a42185a2a4c5f28ad31465b8e484b79 assets/twilightforest/models/item/dark_wood.json +d6edbd2c81a7358947e877898ffc5d059d1f4599 assets/twilightforest/models/item/deadrock.json +a879f6b4baca5cfa97e95f72d7f7f0f69005b273 assets/twilightforest/models/item/death_tome_spawner.json +63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/twilightforest/models/item/death_tome_spawn_egg.json +7ba3b19a793b3e103b749655e5487cf6527233bf assets/twilightforest/models/item/decorative_mazestone.json +63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/twilightforest/models/item/deer_spawn_egg.json +6e739011bd20795270eab4e510d955e436d55d37 assets/twilightforest/models/item/diamond_minotaur_axe.json +63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/twilightforest/models/item/dwarf_rabbit_spawn_egg.json +0fc26f65831e3e2892e94ef6dccc911006ceafbc assets/twilightforest/models/item/empty_canopy_bookshelf.json +8c88d3d84ae54896ffb1f178f1341deb9fdf0a01 assets/twilightforest/models/item/encased_castle_brick_pillar.json +5e55bd9d8c71da87159d8422f9ddf3912c711c00 assets/twilightforest/models/item/encased_castle_brick_stairs.json +de1ca1b0fc92ee00e649c5d372656f0a6a7f65ce assets/twilightforest/models/item/encased_castle_brick_tile.json +2994167c83ea20a08536fb160da93858ce00b944 assets/twilightforest/models/item/encased_fire_jet.json +9bb59222ee8085c83dc0ee00112e9bc89f5c1867 assets/twilightforest/models/item/encased_smoker.json +40f7cd6dba657c4282cf163c63dc7de77b23e30a assets/twilightforest/models/item/encased_towerwood.json +493db3980bedcd9b3ae173091a92fd321f9b1e43 assets/twilightforest/models/item/ender_bow.json +2112c5b4eaa70e8cc5af2223ae96a0668af27ac7 assets/twilightforest/models/item/ender_bow_pulling_0.json +7d467d720096c8a1f927afe794fbef7e0f92e14c assets/twilightforest/models/item/ender_bow_pulling_1.json +c6a5b686b47547226129b880b6a6187d41c8afaf assets/twilightforest/models/item/ender_bow_pulling_2.json +902a25bb462e4402dd610669e461f2540e6114ea assets/twilightforest/models/item/etched_nagastone.json +65e8ba6ea45fd41d557069444a9445b178bbe68a assets/twilightforest/models/item/experiment_115.json +0ba0c5992fe74351e12cd6b4edad06b81a35b021 assets/twilightforest/models/item/fake_diamond.json +b3c7ac87f735c9813d09ee46f1d26c844c06353c assets/twilightforest/models/item/fake_gold.json +801236d4cfd188d04b0fb89d2b1b5e0d21942d0d assets/twilightforest/models/item/fallen_leaves.json +47b5e16cf269b2e6645653c5c184984eb596f6ca assets/twilightforest/models/item/fiddlehead.json +e5e543041934e9511beef2019f8e713e4f1f94f4 assets/twilightforest/models/item/fiery_block.json +d72400c69238734c9e25d9fbac2cd71419aa2ac9 assets/twilightforest/models/item/fiery_blood.json +b83e3f26b9b501f3a48474b4ce50dcbd31fcb969 assets/twilightforest/models/item/fiery_boots.json +dca7e429244530da7b492966d99f50c83e279203 assets/twilightforest/models/item/fiery_chestplate.json +0f4758d04593c22addcb6573539a54a13fb22485 assets/twilightforest/models/item/fiery_helmet.json +96058504db434985f38dff20b5e4c4e222570f0c assets/twilightforest/models/item/fiery_ingot.json +5843e9abad7182c27c8323b9404ec0329be1e5a9 assets/twilightforest/models/item/fiery_leggings.json +516a2f32b2205ac092f8e39cac8afbdbb8a74e4a assets/twilightforest/models/item/fiery_pickaxe.json +c289dbe7edc91db0782614b6b75c76f1220d8c57 assets/twilightforest/models/item/fiery_sword.json +d895c75381c7feefb45bb9b9554f3530b3ab90c6 assets/twilightforest/models/item/fiery_tears.json +5181d8a26402dcc3029d8f006e5d7619e80b1f77 assets/twilightforest/models/item/filled_magic_map.json +2cee91b73f1e622d13636ea951266294a7f8858f assets/twilightforest/models/item/filled_maze_map.json +a4efc46b585c4575013020061d1c0ff5ec73261b assets/twilightforest/models/item/filled_ore_map.json +17203ca19cd437b70ed9a4cd2fa866e6cfa422fd assets/twilightforest/models/item/final_boss_boss_spawner.json +6d0c86e31d39d88d46daf77d6f0225eeae485cb8 assets/twilightforest/models/item/firefly_jar.json +e7acd2988378a41a4eb4f423392b0a95545f63ed assets/twilightforest/models/item/firefly_particle_spawner.json +63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/twilightforest/models/item/fire_beetle_spawn_egg.json +83c3392a583d70aceb92d9b7f16a5cf58172172b assets/twilightforest/models/item/fire_jet.json +a8f03677eca5d5ab6f83fc4390bcb0338d799ae8 assets/twilightforest/models/item/fluffy_cloud.json +d7417e6f9a2cc511240c8c69b6d50668fad4c92a assets/twilightforest/models/item/fortification_scepter.json +0dd4422a6efc3e029e3f7fb0eb018f9bf03b1b5c assets/twilightforest/models/item/ghast_trap.json +5d16c5630c09e84d4324fb09f4d410639f54a8ea assets/twilightforest/models/item/giant_cobblestone.json +bd8ec10fba2faf5c43a345a3f6324458ffccf0aa assets/twilightforest/models/item/giant_leaves.json +7416195b8d9ad04bee9af5f946d82daae6bfa6e4 assets/twilightforest/models/item/giant_log.json +63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/twilightforest/models/item/giant_miner_spawn_egg.json +b8509740b4ae3573901b20d4ca0b9fd9298b9e3f assets/twilightforest/models/item/giant_obsidian.json +9d1ea9a2d4af16c34c90f72733fd03b951263c68 assets/twilightforest/models/item/glass_sword.json +e21b89209c4ae4bdf01ecbbd79a13e5209f36681 assets/twilightforest/models/item/gold_minotaur_axe.json +9aa005dbed13d3b210f51aaf9de87c28de547b4e assets/twilightforest/models/item/greater_flask_0.json +7f66c52d10fb8484a998e563be2f70cbf236cb76 assets/twilightforest/models/item/greater_flask_1.json +cb9726352c900d4d75a3d745708f9771991b31c9 assets/twilightforest/models/item/greater_flask_2.json +29b52ef0cdf7341d1928d767defd0da31f5358fb assets/twilightforest/models/item/greater_flask_3.json +90fc9c02c74255ee549e2315b040fb8dc79f8c53 assets/twilightforest/models/item/greater_potion_flask.json +5e9c8652c022e5e87e03ecc2d633d409cd925eda assets/twilightforest/models/item/green_force_field.json +e2fe7dcbd99ec57c36d0044e45543f01d1017ce7 assets/twilightforest/models/item/green_thorns.json +63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/twilightforest/models/item/harbinger_cube_spawn_egg.json +1e327a05c018e4b6bce4ee0dacbb0e961b7ac96b assets/twilightforest/models/item/hedge.json +63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/twilightforest/models/item/hedge_spider_spawn_egg.json +63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/twilightforest/models/item/helmet_crab_spawn_egg.json +05481f047af292bbac52815e6556d93df069af84 assets/twilightforest/models/item/hollow_acacia_log.json +d8b1f46e81e9d58e981f0370f2858fb58e1dd5e9 assets/twilightforest/models/item/hollow_birch_log.json +769efdc55d827ca471842cda8508ab3bd43f1442 assets/twilightforest/models/item/hollow_canopy_log.json +c78e3886cb2f4cc5c46584357f035f5c6fd7fd30 assets/twilightforest/models/item/hollow_crimson_stem.json +c4350730509adab25d826395041148d043141b18 assets/twilightforest/models/item/hollow_dark_log.json +c3a86d4b3d165ca4e9cbf0d009b8bd5e90b10a9c assets/twilightforest/models/item/hollow_dark_oak_log.json +cfd10778676f48fa66b3bc331057af726bdf7eb1 assets/twilightforest/models/item/hollow_jungle_log.json +f1ba24e86e8d4b8fa02a3d151ebf8a333fe5cb22 assets/twilightforest/models/item/hollow_mangrove_log.json +5837aeaab46df9335e09c8a687fc7c58bf40c7f8 assets/twilightforest/models/item/hollow_mining_log.json +b14bb8a58cff699284f7dfa56665b54a0b762b25 assets/twilightforest/models/item/hollow_oak_log.json +94bf93398841347bf1044e34ad61322386678dae assets/twilightforest/models/item/hollow_oak_sapling.json +2274017b6c9d729897162ef2c6e9692fe914fcf9 assets/twilightforest/models/item/hollow_sorting_log.json +5549b76b299fb9018b5a73bd118c408fabea442a assets/twilightforest/models/item/hollow_spruce_log.json +e49e062e69b18efcdd4f804ae07733e081cd08af assets/twilightforest/models/item/hollow_time_log.json +8530fa9dcea4ef3e5011f6b20d9f599130f2d00f assets/twilightforest/models/item/hollow_transformation_log.json +7cfc8bb9ba3159338a921d1fdde544bbbcbe9c77 assets/twilightforest/models/item/hollow_twilight_oak_log.json +8bc5ff32f149f21fe9f9ba52d3e42706204779b8 assets/twilightforest/models/item/hollow_vangrove_log.json +d3165528c20784c9f648dc20311adab897c5d2a6 assets/twilightforest/models/item/hollow_warped_stem.json +63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/twilightforest/models/item/hostile_wolf_spawn_egg.json +bf3c79561ee47e448fb9215117137d82a2e94c12 assets/twilightforest/models/item/huge_lily_pad.json +1d5492dd3a65cc97554309c646314916f22ebf49 assets/twilightforest/models/item/huge_mushgloom.json +fe614a9805ae16ef0e83c9aef84402b358bd920f assets/twilightforest/models/item/huge_mushgloom_stem.json +95e231e0c0c11fe3c7e3fe38019a4cd0cb6c03b1 assets/twilightforest/models/item/huge_stalk.json +37b642a1be3526a36aa413659a8b6047b97f529e assets/twilightforest/models/item/huge_water_lily.json +0ca7dc7b4daec376dd0f85d57465830781584c7d assets/twilightforest/models/item/hydra_banner_pattern.json +17203ca19cd437b70ed9a4cd2fa866e6cfa422fd assets/twilightforest/models/item/hydra_boss_spawner.json +7c37e8cb936b68e999574fe35e963b31a32a2b3d assets/twilightforest/models/item/hydra_chop.json +63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/twilightforest/models/item/hydra_spawn_egg.json +621a3a44e9aa5fc8a52bf833e473ca652f4c15b9 assets/twilightforest/models/item/hydra_trophy.json +6b997a2b434a783f83b15f1b7c13a141263478b8 assets/twilightforest/models/item/ice_bomb.json +93da3e06c49aaab456c4e9b2840f5d704ff63571 assets/twilightforest/models/item/ice_bow.json +343869b220112f1779587136c012defc4df8654c assets/twilightforest/models/item/ice_bow_pulling_0.json +d79a6f4b6044fc9729b7c81a84bdb86a83471d39 assets/twilightforest/models/item/ice_bow_pulling_1.json +9e89ee3aaf30a6e70278e24260ece969c7620811 assets/twilightforest/models/item/ice_bow_pulling_2.json +63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/twilightforest/models/item/ice_crystal_spawn_egg.json +15e9bc03adbdcc917443791c9b8e02433a1b1072 assets/twilightforest/models/item/ice_sword.json +e8bb230d83638920a020ef8b454224bbfedce5c8 assets/twilightforest/models/item/infested_towerwood.json +7f67e5c4fb773f4e6667073fd9b0723a242e9fe6 assets/twilightforest/models/item/ironwood_axe.json +fd80d7dc2c6d41a4748789a744eefad1ee7d653a assets/twilightforest/models/item/ironwood_block.json +6482ea17b1e18de5b88d81b5cd637a0707995665 assets/twilightforest/models/item/ironwood_boots.json +04115485c203a6b1381af68713ac63264c8d381d assets/twilightforest/models/item/ironwood_chestplate.json +05b5f264f5be4ad219b93865cd1e24a4a2048476 assets/twilightforest/models/item/ironwood_helmet.json +b6969dbc99a2524a050e95aae64ab1709dbbb568 assets/twilightforest/models/item/ironwood_hoe.json +f5f097939c84d47532571d2d9b8828b7b64b1463 assets/twilightforest/models/item/ironwood_ingot.json +b0f951a4c5d16a7615e570a1ca1ffe39a8bc292c assets/twilightforest/models/item/ironwood_leggings.json +26a9b9d145d110de4829faf25823619faa18808c assets/twilightforest/models/item/ironwood_pickaxe.json +7e20110d9c815d8c101e8a1af764ea6bab594005 assets/twilightforest/models/item/ironwood_shovel.json +c066ae6241e4ca251cd0bd28e17fe102e5aa0981 assets/twilightforest/models/item/ironwood_sword.json +157bffad0e30dad70206c79f3f218ceb5e5d98d6 assets/twilightforest/models/item/jungle_banister.json +63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/twilightforest/models/item/king_spider_spawn_egg.json +a3e174da7e8f2a12e133b431dc29a96d945953e5 assets/twilightforest/models/item/knightmetal_axe.json +29e8fc3ff44ae25218fe331f8927867f7fa11b35 assets/twilightforest/models/item/knightmetal_block.json +821a70c36ac5505d6d31fa3f4159bb3d9d8e6896 assets/twilightforest/models/item/knightmetal_boots.json +b73c2a8eeed7cd03de6e79f4243709d722638f96 assets/twilightforest/models/item/knightmetal_chestplate.json +45a9b8608a51972777d06563ca9637a23a6ec65c assets/twilightforest/models/item/knightmetal_helmet.json +06969ad82a4d9715df890afc384b96a3c3036dd4 assets/twilightforest/models/item/knightmetal_ingot.json +b1a659c70a45f376b72cacd0b79587e9e68804db assets/twilightforest/models/item/knightmetal_leggings.json +d2c0d0336eb105811ec38717128c4f0f344d8523 assets/twilightforest/models/item/knightmetal_pickaxe.json +221fbdcebc9e01c60279953e014254d16333f6ef assets/twilightforest/models/item/knightmetal_ring.json +a7ec10a496b1b6935e8dc144efe701e3f5ec7f00 assets/twilightforest/models/item/knightmetal_sword.json +0ca7dc7b4daec376dd0f85d57465830781584c7d assets/twilightforest/models/item/knight_phantom_banner_pattern.json +17203ca19cd437b70ed9a4cd2fa866e6cfa422fd assets/twilightforest/models/item/knight_phantom_boss_spawner.json +63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/twilightforest/models/item/knight_phantom_spawn_egg.json +621a3a44e9aa5fc8a52bf833e473ca652f4c15b9 assets/twilightforest/models/item/knight_phantom_trophy.json +63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/twilightforest/models/item/kobold_spawn_egg.json +864cb9e9ca701ec4b78dfb3e89b2e6c7ac4bf70c assets/twilightforest/models/item/lamp_of_cinders.json +0ca7dc7b4daec376dd0f85d57465830781584c7d assets/twilightforest/models/item/lich_banner_pattern.json +17203ca19cd437b70ed9a4cd2fa866e6cfa422fd assets/twilightforest/models/item/lich_boss_spawner.json +63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/twilightforest/models/item/lich_spawn_egg.json +914de44a64ac77e886f4d4c3504a24b48a59a543 assets/twilightforest/models/item/lich_tower_miniature_structure.json +621a3a44e9aa5fc8a52bf833e473ca652f4c15b9 assets/twilightforest/models/item/lich_trophy.json +3a53f9f06ce5624775badac55c78c16a6fa216ff assets/twilightforest/models/item/lifedrain_scepter.json +c1428d0907051e585b83662a7414fcc9b8450fcc assets/twilightforest/models/item/liveroot.json +6fa0f2c4fc6c912294c665befc0e8314a740caff assets/twilightforest/models/item/liveroot_block.json +8c67c7aaa868fef0936c6e53cd3d5aa4a0c502fc assets/twilightforest/models/item/locked_vanishing_block.json +63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/twilightforest/models/item/lower_goblin_knight_spawn_egg.json +b488c0e68304fe38b56b843b215bb46abd69fbc3 assets/twilightforest/models/item/magic_beans.json +ff9e2e8376642cf0ae9452f73d2cdd2ae486022e assets/twilightforest/models/item/magic_map.json +3be27be382684a8a3955e7658c54d3d34a6a444c assets/twilightforest/models/item/magic_map_focus.json +bc799d77d4344616b9a679dcd2e839fa75646287 assets/twilightforest/models/item/mangrove_banister.json +40e9fe30b711daf2712fa6533799c9bbe0c2366e assets/twilightforest/models/item/mangrove_boat.json +ffa22394c21d9ae5aaf32421ca2bad7df2f3686b assets/twilightforest/models/item/mangrove_button.json +6604d6d66e5d0be53e3daa017c419240b51205d9 assets/twilightforest/models/item/mangrove_chest.json +16432d73d669b0d8f64cc819e2f9897d2de470c3 assets/twilightforest/models/item/mangrove_chest_boat.json +7ee73611b66cb89a75fd80cb1b662fcd2eec3c21 assets/twilightforest/models/item/mangrove_door.json +a5f7b20e0a18cda7c94e123d8693e77d32f84576 assets/twilightforest/models/item/mangrove_fence.json +89b836be34ba0917e925552b328c60511011007d assets/twilightforest/models/item/mangrove_fence_gate.json +930408f00593665a8a27dd3ae737c526bd6d5e23 assets/twilightforest/models/item/mangrove_leaves.json +20f5c812b5d5d99daadf40d4ee3e24a9767fcc31 assets/twilightforest/models/item/mangrove_log.json +f20d2966822a4100c8639d96a302e74944f7d3b9 assets/twilightforest/models/item/mangrove_planks.json +a90be855b9fb1499e389b9866879d0fc983ac739 assets/twilightforest/models/item/mangrove_pressure_plate.json +a061147256d088e296b7a58f797a02a98690eb1c assets/twilightforest/models/item/mangrove_root.json +f4dac8a73ee71c84e875908b6690237c43bf0633 assets/twilightforest/models/item/mangrove_sapling.json +8ac899a6763e2958d2939fe317545589cd5c6b10 assets/twilightforest/models/item/mangrove_sign.json +1952fc53158bfa3b1133902e0e29a1f5e8f18ecc assets/twilightforest/models/item/mangrove_slab.json +452d10f7bd29f21df7d74e2cad08c5e66f58403b assets/twilightforest/models/item/mangrove_stairs.json +8fb0609c313fd6b4ec49fe8350d1a5e79ca0585e assets/twilightforest/models/item/mangrove_trapdoor.json +2496be590449bb19a40a9bd04aa08fdfc4c263b9 assets/twilightforest/models/item/mangrove_wood.json +11c99bf9307aac43c075320eb3fe411ec2eac58c assets/twilightforest/models/item/mayapple.json +e2a76acdb90e8219e3be8d19003a7467ccf55c11 assets/twilightforest/models/item/mazebreaker_pickaxe.json +ec981af97894d664b45ef734c30ad813ebf7ec30 assets/twilightforest/models/item/mazestone.json +25c80cd7f729db78526a8e96b8225e925fa3161f assets/twilightforest/models/item/mazestone_border.json +259bfdfc50a8d0a05c4aa373f7e6fad2062e6d7b assets/twilightforest/models/item/mazestone_brick.json +3eeb2b1cd6dbf1e1dd59d8176f4607bedefca793 assets/twilightforest/models/item/mazestone_mosaic.json +134e4c40ccf2bc5f12ce90bbeac261dd6e1398d4 assets/twilightforest/models/item/maze_map.json +3c228cd32f67cd640f1745626c6e775f14a689df assets/twilightforest/models/item/maze_map_focus.json +63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/twilightforest/models/item/maze_slime_spawn_egg.json +8038237d661376b29d9de794e043bbabd31925bb assets/twilightforest/models/item/maze_wafer.json +07e884313e400575a2300b39bb59a200b01eca42 assets/twilightforest/models/item/meef_stroganoff.json +6d5440cabe2a1221df9b2eedc62c6a450afefff8 assets/twilightforest/models/item/mining_banister.json +aa55f42f900763f4e5681b42608dbb6f8b526fa2 assets/twilightforest/models/item/mining_boat.json +5b4137558b76fc0fbd88a37e25a100193d5902c6 assets/twilightforest/models/item/mining_button.json +413d1b50666d17e312d9050a3ab4f5839cc9ad32 assets/twilightforest/models/item/mining_chest.json +d5473582f77cb2e6338c6bfbbca97c826834fc18 assets/twilightforest/models/item/mining_chest_boat.json +d7a6eb4d66ed3e21ac7c3d19be1cf47cabe3d17c assets/twilightforest/models/item/mining_door.json +724e4e2c20a75107bbd5cb50698e2bb388efd61a assets/twilightforest/models/item/mining_fence.json +02f26f556982115ab2f95721c6c58a113114b1fb assets/twilightforest/models/item/mining_fence_gate.json +9f607aa28d67530e857cda96a11bfa9f29c798a0 assets/twilightforest/models/item/mining_leaves.json +0c9fb2b512e9c4964ff6facefe0f9c5c01feac55 assets/twilightforest/models/item/mining_log.json +8a109a9340f9dacdd4e046d975309bb0376b2cc7 assets/twilightforest/models/item/mining_log_core.json +1ca66a20551548494f017ec1ee3e63d78aaf4dac assets/twilightforest/models/item/mining_planks.json +2a2ac27b2a1d7c00dddfee1c20f490462d817e4c assets/twilightforest/models/item/mining_pressure_plate.json +e7fbfb35264b0e9cd2c84487c99284fa738bacfc assets/twilightforest/models/item/mining_sapling.json +d9be1b166a22071779c7207d4b61448790b3eb02 assets/twilightforest/models/item/mining_sign.json +0983f1078400e978f2b06a68ccac62ee7f544c8c assets/twilightforest/models/item/mining_slab.json +d5d8eefef716a71158d80d66802726e30c2f57bf assets/twilightforest/models/item/mining_stairs.json +cf3737de5ae670012ca4fd9135bae81ed57138c6 assets/twilightforest/models/item/mining_trapdoor.json +3cd77e662ee7d399a8292aaeb176034c542f82da assets/twilightforest/models/item/mining_wood.json +0ca7dc7b4daec376dd0f85d57465830781584c7d assets/twilightforest/models/item/minoshroom_banner_pattern.json +17203ca19cd437b70ed9a4cd2fa866e6cfa422fd assets/twilightforest/models/item/minoshroom_boss_spawner.json +63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/twilightforest/models/item/minoshroom_spawn_egg.json +621a3a44e9aa5fc8a52bf833e473ca652f4c15b9 assets/twilightforest/models/item/minoshroom_trophy.json +63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/twilightforest/models/item/minotaur_spawn_egg.json +63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/twilightforest/models/item/mist_wolf_spawn_egg.json +1e5110922415dc5fca0adc2ca9bb850a1adcc4d5 assets/twilightforest/models/item/moonworm_queen.json +4cb7935a7025e2bff55d8dc6bd89ac61ce1c319e assets/twilightforest/models/item/moonworm_queen_alt.json +d0823e2b9a56fb573cc41002a22ae0315679aef7 assets/twilightforest/models/item/moon_dial.json +7dd8d92247fafafbeb54a9c9b0d3a9f830f99817 assets/twilightforest/models/item/moon_dial_full.json +3ccb89fa084c401e478efc4d6c548b3f0bedcf92 assets/twilightforest/models/item/moon_dial_new.json +ba7fbcfa8606b0902aafdf0157d4611d7be4896b assets/twilightforest/models/item/moon_dial_quarter1.json +714df3f77096fb31b9bae86c96d03cca2859a38b assets/twilightforest/models/item/moon_dial_quarter3.json +ecdb9fcbb8fe8d6db544936737394981d55b51e8 assets/twilightforest/models/item/moon_dial_waning_cres.json +8ecb907caca4a12dd9789f8b3337ea4c39f178fe assets/twilightforest/models/item/moon_dial_waning_gib.json +d793cc179ad8f4322b8f3b1bafb34272f34126f6 assets/twilightforest/models/item/moon_dial_waxing_cres.json +bf19b0d9c6bdfda495e911a67eb4326e8357a99a assets/twilightforest/models/item/moon_dial_waxing_gib.json +63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/twilightforest/models/item/mosquito_swarm_spawn_egg.json +08939ed055c2ecbdadc39131aaca1d01fb876dbb assets/twilightforest/models/item/mossy_castle_brick.json +bd051cd90bfa4481c7bb03013f8c056434c118e2 assets/twilightforest/models/item/mossy_castle_brick_stairs.json +0b2ba3317aa496a215a4a009d92a332e96b44629 assets/twilightforest/models/item/mossy_etched_nagastone.json +c4e06c70ca220481794cdb697763ac8e14e9c2a9 assets/twilightforest/models/item/mossy_mazestone.json +a1ec3480072d22767245ee501e049b8aa20f3a91 assets/twilightforest/models/item/mossy_nagastone_pillar.json +a84271d2baf83e203d9006246561586cb2e64570 assets/twilightforest/models/item/mossy_nagastone_stairs_left.json +a2f1ff6b0c20efbe0889814be0f3be31f146f34f assets/twilightforest/models/item/mossy_nagastone_stairs_right.json +9948c2bc7b1878669d0a49cdfd37e5e6ffa3129a assets/twilightforest/models/item/mossy_towerwood.json +727223a45db796cf0563dd393fd4714116af116d assets/twilightforest/models/item/mossy_underbrick.json +45417066a8c4a018026d9951ba4b55e8d8cb2208 assets/twilightforest/models/item/moss_patch.json +ee1286ae00d31a74692857b11af43bce079c04be assets/twilightforest/models/item/mushgloom.json +72cbb9656b782c67c12fb01e590d3f312d188b05 assets/twilightforest/models/item/music_disc_findings.json +03baa484efe9c1311440f878ed7455a9d5734418 assets/twilightforest/models/item/music_disc_home.json +f9b2f9e4a45bf80dcc6161a57d4cc76da917615c assets/twilightforest/models/item/music_disc_maker.json +5d7cf01b371bd99861adc2b6afbc21b0ee7ed308 assets/twilightforest/models/item/music_disc_motion.json +de47e4e74077c2e92415a170ad02de0c239e1a35 assets/twilightforest/models/item/music_disc_radiance.json +360ee96e60519b7e60dadc6003ad353ce90900ab assets/twilightforest/models/item/music_disc_steps.json +39ed9caada50dfbecbcb27d08887f6a03708c93b assets/twilightforest/models/item/music_disc_superstitious.json +cf4bb049c531db874c9bd1e508b0cff9c773f241 assets/twilightforest/models/item/music_disc_thread.json +2fcac44fcd93bb7e4cdd8dddf3d72f62f481cd85 assets/twilightforest/models/item/music_disc_wayfarer.json +93d410af4b89d9331737f1a4f8b0e26023c93c8a assets/twilightforest/models/item/nagastone.json +252d2edf25d0d7fa0c53faff52c866929dcede4a assets/twilightforest/models/item/nagastone_head.json +314125ee8f11192a78647c4b5affdddead3a29b9 assets/twilightforest/models/item/nagastone_pillar.json +101c5ee8f08118f34274dcefc51ecd988251ab92 assets/twilightforest/models/item/nagastone_stairs_left.json +28367b6b33028cdd83c86a5752f8012dbab95788 assets/twilightforest/models/item/nagastone_stairs_right.json +0ca7dc7b4daec376dd0f85d57465830781584c7d assets/twilightforest/models/item/naga_banner_pattern.json +17203ca19cd437b70ed9a4cd2fa866e6cfa422fd assets/twilightforest/models/item/naga_boss_spawner.json +ae78b5cfebca2c316fa03c445c85a9438998da65 assets/twilightforest/models/item/naga_chestplate.json +9adae69bfda93a24b4ffc8ddf7c9265f22d5cc5d assets/twilightforest/models/item/naga_courtyard_miniature_structure.json +83c57251a8b8ff0cc1d155c8ab5517e28b6d28f2 assets/twilightforest/models/item/naga_leggings.json +e80919ce5e6ce3931333871ce7d80d8e4b5ab5cb assets/twilightforest/models/item/naga_scale.json +63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/twilightforest/models/item/naga_spawn_egg.json +621a3a44e9aa5fc8a52bf833e473ca652f4c15b9 assets/twilightforest/models/item/naga_trophy.json +c825e1c3550c80ba6c507e2c09827c83201c8508 assets/twilightforest/models/item/oak_banister.json +5e9c8652c022e5e87e03ecc2d633d409cd925eda assets/twilightforest/models/item/orange_force_field.json +35bb2ccaee394bdf18283605473487d3c8ce18ff assets/twilightforest/models/item/ore_magnet.json +22e324b55d19e2071beef8f01398500b3eab3af4 assets/twilightforest/models/item/ore_magnet_pulling_1.json +89c4694f967c2688ac73dfb92ab7da4bcac4e847 assets/twilightforest/models/item/ore_magnet_pulling_2.json +87c22b18b60c3e3d7ac5c538c6e39460bd6d4766 assets/twilightforest/models/item/ore_map.json +9e32f7687d91298eddf200a515772df2dfd03a6f assets/twilightforest/models/item/ore_meter.json +4e8f03fef77b6c1268f8728996f584808cff1161 assets/twilightforest/models/item/peacock_feather_fan.json +63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/twilightforest/models/item/penguin_spawn_egg.json +205ad65aa0e9e1d6006f3016e6d6c2cd9c66a186 assets/twilightforest/models/item/phantom_chestplate.json +70a88a074822326142e4e0faeaa8a06f6e127278 assets/twilightforest/models/item/phantom_helmet.json +63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/twilightforest/models/item/pinch_beetle_spawn_egg.json +9de285e500a8850308690ee3d059c70163298ac4 assets/twilightforest/models/item/pink_castle_door.json +b27493eda49748814ba36a9543ccdcd33d7b44e2 assets/twilightforest/models/item/pink_castle_rune_brick.json +5e9c8652c022e5e87e03ecc2d633d409cd925eda assets/twilightforest/models/item/pink_force_field.json +bf81b7da7483a7cb79e848de49ff41d1c6c832f9 assets/twilightforest/models/item/player_skull_candle.json +0ca7dc7b4daec376dd0f85d57465830781584c7d assets/twilightforest/models/item/quest_ram_banner_pattern.json +63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/twilightforest/models/item/quest_ram_spawn_egg.json +621a3a44e9aa5fc8a52bf833e473ca652f4c15b9 assets/twilightforest/models/item/quest_ram_trophy.json +1d4124402b5b329592afaa4863a9115cd149f81f assets/twilightforest/models/item/rainbow_oak_leaves.json +b2e0e0513eb1aef915a551acb1c6d3996ad29b5b assets/twilightforest/models/item/rainbow_oak_sapling.json +5003500e023117b7b4dfb278ae8397d843dcb178 assets/twilightforest/models/item/raven_feather.json +63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/twilightforest/models/item/raven_spawn_egg.json +1e4c3d381913d42fdb65677fd5a2e3e4eb1b8589 assets/twilightforest/models/item/raw_ironwood.json +6564efa1440a974c23735ae4b4d65dbcde17af4c assets/twilightforest/models/item/raw_meef.json +1bbdd61f3f1d2b53812fbe21f1e53e42b55a7de7 assets/twilightforest/models/item/raw_venison.json +34f086e26bfdc800d357f3e53e4976a0df5fa8df assets/twilightforest/models/item/reappearing_block.json +63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/twilightforest/models/item/redcap_sapper_spawn_egg.json +63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/twilightforest/models/item/redcap_spawn_egg.json +3cc0368c255ca57c543c1fc41804c8e04daf47c8 assets/twilightforest/models/item/red_thread.json +40f22ccfa085414838c7cab1bb685b6270733126 assets/twilightforest/models/item/root.json +8537a6ba9f4a50d69cf01630607b3b2bbdd7c50e assets/twilightforest/models/item/root_strand.json +d595f519d3b0bc04d05df292af27f32faafa1c7f assets/twilightforest/models/item/seeker_bow.json +014ac2a2d0d5ddb4e3d41552c2d7ff2e5527ab33 assets/twilightforest/models/item/seeker_bow_pulling_0.json +02dbf7d47b4be510da10aa9eeca37841abd09fae assets/twilightforest/models/item/seeker_bow_pulling_1.json +efd1f5c64c16dacd32b8b1320d9e713ddc58f339 assets/twilightforest/models/item/seeker_bow_pulling_2.json +a450c4e34bd472d349597e9e1740eb26e6e98d80 assets/twilightforest/models/item/shield.json +63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/twilightforest/models/item/skeleton_druid_spawn_egg.json +bf81b7da7483a7cb79e848de49ff41d1c6c832f9 assets/twilightforest/models/item/skeleton_skull_candle.json +0ee6598ddfeb5eff5d72843cdec68f0c35f15363 assets/twilightforest/models/item/slider.json +63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/twilightforest/models/item/slime_beetle_spawn_egg.json +9b85fe6ee3248abb58c52a8e4de51ee5593d9017 assets/twilightforest/models/item/smoker.json +63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/twilightforest/models/item/snow_guardian_spawn_egg.json +0ca7dc7b4daec376dd0f85d57465830781584c7d assets/twilightforest/models/item/snow_queen_banner_pattern.json +17203ca19cd437b70ed9a4cd2fa866e6cfa422fd assets/twilightforest/models/item/snow_queen_boss_spawner.json +63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/twilightforest/models/item/snow_queen_spawn_egg.json +621a3a44e9aa5fc8a52bf833e473ca652f4c15b9 assets/twilightforest/models/item/snow_queen_trophy.json +69ddd39807bf14bca8daadd4d6f4e2fc93be4b0e assets/twilightforest/models/item/sorting_banister.json +d4a5f01bd0560ede6d9756cee312a4fcd2c7747f assets/twilightforest/models/item/sorting_boat.json +eec745adb23307394b4da3a0885e667ac5d905a7 assets/twilightforest/models/item/sorting_button.json +baf331fe48b0c7e31646021ff8213e5da18accd2 assets/twilightforest/models/item/sorting_chest.json +981582268f737ff0a1812a3b5915f5765a5bd3a6 assets/twilightforest/models/item/sorting_chest_boat.json +9d193534b14b488093ab0b1ffe7deb45798ae731 assets/twilightforest/models/item/sorting_door.json +7bd222ed172753649803e71146a34f3e51605460 assets/twilightforest/models/item/sorting_fence.json +8cb3cc83a4c59a44682c28d24df65e872dee2f90 assets/twilightforest/models/item/sorting_fence_gate.json +7292153fe1b8832e69fad74002f074bd0259b692 assets/twilightforest/models/item/sorting_leaves.json +d47163e14b264504a1452819a1a3b000769fd9f7 assets/twilightforest/models/item/sorting_log.json +d256609da1d883874778060e6b86465c86d6c06b assets/twilightforest/models/item/sorting_log_core.json +7d4977482c454d00a3147600f0e1d0458d6ee7db assets/twilightforest/models/item/sorting_planks.json +7d53ac8424fba3ea27544f9b0170e350d3ca5062 assets/twilightforest/models/item/sorting_pressure_plate.json +ad3c942dfa6146c1c4f3b6af1ab70c3ce9db5e1e assets/twilightforest/models/item/sorting_sapling.json +66a4b8ef4d8017b25026d785e825695f12621090 assets/twilightforest/models/item/sorting_sign.json +ef75896042acdf73250a50f2495915f4cd663236 assets/twilightforest/models/item/sorting_slab.json +12fb9b83acfdfd15de13664997263bde064a13a5 assets/twilightforest/models/item/sorting_stairs.json +e28d32bc2ee3cae533d79f3a46ae30e794dc1bc5 assets/twilightforest/models/item/sorting_trapdoor.json +f1e4179eba00d06306f5c674b11d4b20b3524372 assets/twilightforest/models/item/sorting_wood.json +eea7e6bed56b2ad2bc55425ab9ba01c359ac29dd assets/twilightforest/models/item/spiral_bricks.json +87e85db2a6bfd1b67e3c5f547228ac77b4fc0971 assets/twilightforest/models/item/spruce_banister.json +63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/twilightforest/models/item/squirrel_spawn_egg.json +63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/twilightforest/models/item/stable_ice_core_spawn_egg.json +0528882d5d5ab12726109a66dba7b4ee98a5a655 assets/twilightforest/models/item/steeleaf_axe.json +5b7f129cbe9eb8a521dba26e7d55c03220166a96 assets/twilightforest/models/item/steeleaf_block.json +6052ded3891d43b5aaccfe2f522b4bafd9490282 assets/twilightforest/models/item/steeleaf_boots.json +2f7a963967b1c42e0dfe7e6ac5057072f1a995ba assets/twilightforest/models/item/steeleaf_chestplate.json +51d3636e48d5276f0e16cec759f6bcd8899d390e assets/twilightforest/models/item/steeleaf_helmet.json +4609f69a56738e2f31946d80ae0f5a79f83d4405 assets/twilightforest/models/item/steeleaf_hoe.json +d8da3fc36b054cf749ead027ff4aba65a4cbffdc assets/twilightforest/models/item/steeleaf_ingot.json +63cecfaf2970cdee4821c7e5547c80d64b6e8ff1 assets/twilightforest/models/item/steeleaf_leggings.json +323add4d7b4a44d0b2bb6e9500ea6b449cd8fbaa assets/twilightforest/models/item/steeleaf_pickaxe.json +cc69788d326fa77606a26c669f54cebe419e3bc1 assets/twilightforest/models/item/steeleaf_shovel.json +207815171673e6652c902cbcca7a2fd42fc821e2 assets/twilightforest/models/item/steeleaf_sword.json +2c7e66d55fbfb3c0c49c43795a50d2862acd6219 assets/twilightforest/models/item/stripped_canopy_log.json +ddd5146c050304317fe5956c8c867ed798fb5566 assets/twilightforest/models/item/stripped_canopy_wood.json +174b403e30bb805496fb13ef4d929c100932e636 assets/twilightforest/models/item/stripped_dark_log.json +227cc6ad47343f2ee443fa9675d8baa93d838ba5 assets/twilightforest/models/item/stripped_dark_wood.json +76b349d287c080b47705c0a9c05f25b29aab21f8 assets/twilightforest/models/item/stripped_mangrove_log.json +6132b72a485339cf45845e3ce3cabe0facc35c17 assets/twilightforest/models/item/stripped_mangrove_wood.json +13bce5cca2a248b971f85dfd3381118272cd9824 assets/twilightforest/models/item/stripped_mining_log.json +6b772d78449b4527b4f35b8d03a96d7907646277 assets/twilightforest/models/item/stripped_mining_wood.json +a0de7dc7f21bcabbdc495bd0bde0c9d3b3af2759 assets/twilightforest/models/item/stripped_sorting_log.json +5c639aa6ca27383d7c5b32305c58ae26bb044512 assets/twilightforest/models/item/stripped_sorting_wood.json +85d7f6d8cdfaff6f2c4e3a1005ecb5e8869b182b assets/twilightforest/models/item/stripped_time_log.json +78d0ced81c52d47b9145f63592d2de7ad3a55d16 assets/twilightforest/models/item/stripped_time_wood.json +22cfadb561fef3871b58322fe7cee38697dd6334 assets/twilightforest/models/item/stripped_transformation_log.json +164b290ec549cbafc29cac1b3a2192baf9e1b93a assets/twilightforest/models/item/stripped_transformation_wood.json +ee065f8e4f9df73fd8cec17cadf3c219607928da assets/twilightforest/models/item/stripped_twilight_oak_log.json +6944ef6f561af2c195b161f856e1e5628c12b3d3 assets/twilightforest/models/item/stripped_twilight_oak_wood.json +96cc061452d7448bbe0acdbcda714c489edebae2 assets/twilightforest/models/item/stronghold_shield.json +63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/twilightforest/models/item/swarm_spider_spawn_egg.json +6846b15a2df412a91954cada0d0d4b219c5f343e assets/twilightforest/models/item/thick_castle_brick.json +78629f1e6bc7d7af1d8bd03d9d445f839bcb37f8 assets/twilightforest/models/item/think115.json +bd8ec10fba2faf5c43a345a3f6324458ffccf0aa assets/twilightforest/models/item/thorn_leaves.json +aad4989349f5b4e6181e6b098ad2f70d5dd90310 assets/twilightforest/models/item/thorn_rose.json +1047a38ca0cdd1c9c2d06a595ec90a75542822d5 assets/twilightforest/models/item/time_banister.json +ecaf3f57e02a00bccfe67d03fb6134a103da5e57 assets/twilightforest/models/item/time_boat.json +a2077cefba62c44a727abc94a6f60f50e04e3916 assets/twilightforest/models/item/time_button.json +6ba07d1a8d6b8f67ea3f66939d6ba5aa7e960e44 assets/twilightforest/models/item/time_chest.json +906908712bbd50660e7651cf2d5428d6d663d18b assets/twilightforest/models/item/time_chest_boat.json +d18e3e48cd0ee23767355e2cb7a25c8b13abe95c assets/twilightforest/models/item/time_door.json +7ae7c18bca645eb02bb1aaa1c399db5a1234946d assets/twilightforest/models/item/time_fence.json +46274f71a21e2b3cc9a892fc9d9829cb5e6c3eef assets/twilightforest/models/item/time_fence_gate.json +5929bbe18c301576617e77717cfaaeffa5a70b17 assets/twilightforest/models/item/time_leaves.json +4740347147af87bfbb4176997bcf5fb581106aed assets/twilightforest/models/item/time_log.json +5184b754e43312abee72a646180ae4b009ce28f9 assets/twilightforest/models/item/time_log_core.json +169c665a0db20fb0968e9b3c779132a992cfeffa assets/twilightforest/models/item/time_planks.json +21f87a0f2d893c220a0fe629625f231f819ed7f6 assets/twilightforest/models/item/time_pressure_plate.json +b8b14f90fb2dce3e231361082d926fe478c962a4 assets/twilightforest/models/item/time_sapling.json +4779242a129f3a76e2b38f07859596c2a5bf7fff assets/twilightforest/models/item/time_sign.json +6205de46246c4a31a6e7a8749a813f3b831ed5b8 assets/twilightforest/models/item/time_slab.json +85e20bcc8fd5c81f5d1142f614921199dbb597ba assets/twilightforest/models/item/time_stairs.json +88873f57364950d02f235ad28aeeed4e3a16841f assets/twilightforest/models/item/time_trapdoor.json +06d56cdcc57225e0463b41c881a26b912cf89951 assets/twilightforest/models/item/time_wood.json +63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/twilightforest/models/item/tiny_bird_spawn_egg.json +03141883c43cd8918641db7e11d74a9fdf4a59b7 assets/twilightforest/models/item/torchberries.json +04b469cff60997a1388783e97ea012da256a12df assets/twilightforest/models/item/torchberry_plant.json +dc4655f39194eac0cda7a76f744d12f7d3266940 assets/twilightforest/models/item/towerwood.json +63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/twilightforest/models/item/towerwood_borer_spawn_egg.json +0c844ff1360664732598cfb0f68e330759ffd7d6 assets/twilightforest/models/item/tower_key.json +7374ce1ab869a82285264585b6fcf8b533b866c2 assets/twilightforest/models/item/transformation_banister.json +d82c6c8c0ce2c8162b0fdd3a791d86bfa3a041fe assets/twilightforest/models/item/transformation_boat.json +f2e89acef3c72f0bc1489c8c474c540c68590d6e assets/twilightforest/models/item/transformation_button.json +33ac6113af3f5557214c8f1cefc83651ad423098 assets/twilightforest/models/item/transformation_chest.json +a3b7e3ba101a2c3817556277bf41e34ce55d45d4 assets/twilightforest/models/item/transformation_chest_boat.json +8207cd235ffd9dfcd41ce8baa38f1150f322ee25 assets/twilightforest/models/item/transformation_door.json +e1de5e105ccdb958dd9d27bb8bbc85ba8bdde1a4 assets/twilightforest/models/item/transformation_fence.json +669e6ebf3c0419e7acfc74d458403aa8bd2638ca assets/twilightforest/models/item/transformation_fence_gate.json +da75406be36ed5f6bbc48b879127b48e1ad366b4 assets/twilightforest/models/item/transformation_leaves.json +bfc17b6c26906352cc1f7f177e84521f4982bf47 assets/twilightforest/models/item/transformation_log.json +6e1ff1837d8c2377c1aa7b4335aa0d0be26608b8 assets/twilightforest/models/item/transformation_log_core.json +85a5b28e761e6a7d7fc799e269cc2dc54089fc57 assets/twilightforest/models/item/transformation_planks.json +6055c86a78d31445d3502ae1313250965cfd1cf0 assets/twilightforest/models/item/transformation_powder.json +faeb2224cdf78a679dcb77d00516b4e4fe8804fc assets/twilightforest/models/item/transformation_pressure_plate.json +363b8667dd45e96c69a73afc55aa1ba370dad285 assets/twilightforest/models/item/transformation_sapling.json +19c8bbc9a51cba2ab8e2d978b2a7271297e4a9a6 assets/twilightforest/models/item/transformation_sign.json +3c8737b2be6c76f1831d13ffebb31b7e05731b5f assets/twilightforest/models/item/transformation_slab.json +f38c08272d6a41e4a2b8b6d9913371bafa165ace assets/twilightforest/models/item/transformation_stairs.json +a992a739de1b34be3dcf106964c75ab8d1299ce4 assets/twilightforest/models/item/transformation_trapdoor.json +e13d8f18390763349ac4ad44f7241ba058518ae5 assets/twilightforest/models/item/transformation_wood.json +5bc1edf6b84c4ad6ce22df3d063818dc4e15debe assets/twilightforest/models/item/triple_bow.json +a01e709e7b119f1c1c6c1f19c37a45adce96fe23 assets/twilightforest/models/item/triple_bow_pulling_0.json +da8ccbaaf7197d8de6f5a670061779d6c9bd69b8 assets/twilightforest/models/item/triple_bow_pulling_1.json +1e9c9118a16e3aae53792c02900e73a27d2e8855 assets/twilightforest/models/item/triple_bow_pulling_2.json +10fe4ffbfd9f8331fc671518c1601a37d29dca92 assets/twilightforest/models/item/trollber.json +143fcec33946ad1372d8bdba061bc72f5838b117 assets/twilightforest/models/item/trollsteinn.json +c40a954fe657d4d44a308596d3fcdc3ad6de9faf assets/twilightforest/models/item/trollvidr.json +63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/twilightforest/models/item/troll_spawn_egg.json +44ba301b492f28d0b9bfd8cc87b39c994c056e5d assets/twilightforest/models/item/trophy.json +6bd39542a0254d0e686843560dbdd0cf3f365f54 assets/twilightforest/models/item/trophy_minor.json +2b527ae9d5ec3c96beeb9df4af0f5d1be79a23dc assets/twilightforest/models/item/trophy_pedestal.json +1bcf251cd7d77b9e841783508272d4d56ad7310e assets/twilightforest/models/item/trophy_quest.json +0f69546d0d0e0a17d51591d20fe7916d1475f61a assets/twilightforest/models/item/twilight_oak_banister.json +ef21acc3297ac54d490d74b2a786ff5719d1ee37 assets/twilightforest/models/item/twilight_oak_boat.json +4cd02ba209d06193c8390cd5fc2c4a0119d57195 assets/twilightforest/models/item/twilight_oak_button.json +1d30aecfb6d633284fd06aaf7eb6d46b50a7d054 assets/twilightforest/models/item/twilight_oak_chest.json +3ea199525ea66cba3a033aa0dfe6b8c46cb6dea9 assets/twilightforest/models/item/twilight_oak_chest_boat.json +15ce1289e73311e1fe88fe8d113cc0529c85c95a assets/twilightforest/models/item/twilight_oak_door.json +ec881a7891beaefde4905c088ba9371634d29b79 assets/twilightforest/models/item/twilight_oak_fence.json +f2da80d0b49c023e7f9e2294f5cf7c87aa8758c6 assets/twilightforest/models/item/twilight_oak_fence_gate.json +2978d869de5d9a8170d09ab77faab640c8054bf4 assets/twilightforest/models/item/twilight_oak_leaves.json +a3d818c213bdcacac34fd47c384c582d01fc747c assets/twilightforest/models/item/twilight_oak_log.json +4c43514258b888e4832d2452412f92a938fd5894 assets/twilightforest/models/item/twilight_oak_planks.json +f1aaff9b53d604e02477584772eb9f90f8a04fa6 assets/twilightforest/models/item/twilight_oak_pressure_plate.json +0e287853f29d505391da2d87810c6f4a34187db6 assets/twilightforest/models/item/twilight_oak_sapling.json +42e491c6bc3e76b8719bc4f7e96e75c5c45e9813 assets/twilightforest/models/item/twilight_oak_sign.json +8a77ddce7b3438548caff6086c14e1e5a29c581f assets/twilightforest/models/item/twilight_oak_slab.json +c8675deca2f0af4e04414bbd91d330e1708120f3 assets/twilightforest/models/item/twilight_oak_stairs.json +75d9ab07c45d5b2c1cebf2bfb97db15788f4e5c5 assets/twilightforest/models/item/twilight_oak_trapdoor.json +62aa21b537796034cf666e24af61878988e6d8ad assets/twilightforest/models/item/twilight_oak_wood.json +3a3f31e541352d322d34d9c7eca97e37022a3df4 assets/twilightforest/models/item/twilight_portal_miniature_structure.json +8d6955b7035e3b64f6325f3d620a3a1becab03a1 assets/twilightforest/models/item/twilight_scepter.json +346191ba71f08a63339da23f2cfd8a838ca42d19 assets/twilightforest/models/item/twisted_stone.json +dc62911efe227989279f2b81245fb69d2b91176e assets/twilightforest/models/item/twisted_stone_pillar.json +3ef6d3814b46257ee79142830d80e4e88105ec66 assets/twilightforest/models/item/uberous_soil.json +7975f894e7c442319def838cb6718378dbf4f1d9 assets/twilightforest/models/item/uncrafting_table.json +62a18ba733344120afd6317a4021e600afeb6254 assets/twilightforest/models/item/underbrick.json +ede9b3743ddb43acfd5adcc8fad03db0e1eedb44 assets/twilightforest/models/item/underbrick_floor.json +221ae2bf8b6db463b4909daac2b03451fd52792b assets/twilightforest/models/item/unripe_trollber.json +63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/twilightforest/models/item/unstable_ice_core_spawn_egg.json +0ca7dc7b4daec376dd0f85d57465830781584c7d assets/twilightforest/models/item/ur_ghast_banner_pattern.json +17203ca19cd437b70ed9a4cd2fa866e6cfa422fd assets/twilightforest/models/item/ur_ghast_boss_spawner.json +63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/twilightforest/models/item/ur_ghast_spawn_egg.json +90df13099476672a311c2357cc700eca4c0aa811 assets/twilightforest/models/item/vangrove_banister.json +37baaba38fedb22ac69ef5a704ceb8bcf037b80e assets/twilightforest/models/item/vanishing_block.json +d93ab5f6a936abfc93ca6f442dd6eccc75868d76 assets/twilightforest/models/item/violet_castle_door.json +b27493eda49748814ba36a9543ccdcd33d7b44e2 assets/twilightforest/models/item/violet_castle_rune_brick.json +5e9c8652c022e5e87e03ecc2d633d409cd925eda assets/twilightforest/models/item/violet_force_field.json +c142dd7b39e68876cc272ffff0803adecc0b9398 assets/twilightforest/models/item/warped_banister.json +f9bea0cd2dcd603057e136167935ec827f15f565 assets/twilightforest/models/item/weathered_deadrock.json +63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/twilightforest/models/item/winter_wolf_spawn_egg.json +8cf3760ad280f15b167028c42b9eac047a6767ce assets/twilightforest/models/item/wispy_cloud.json +bf81b7da7483a7cb79e848de49ff41d1c6c832f9 assets/twilightforest/models/item/wither_skeleton_skull_candle.json +5569c9ade74d97c8a24f99537d1578d1b460680d assets/twilightforest/models/item/worn_castle_brick.json +5bf06f896d41e73af2aca9d220481e511b796409 assets/twilightforest/models/item/worn_castle_brick_stairs.json +63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/twilightforest/models/item/wraith_spawn_egg.json +9d0f9474de92d909e4a9134343798791cd01aa46 assets/twilightforest/models/item/yellow_castle_door.json +b27493eda49748814ba36a9543ccdcd33d7b44e2 assets/twilightforest/models/item/yellow_castle_rune_brick.json +0229fa1d67eea7895e2c8330a25b4f20cdc643f8 assets/twilightforest/models/item/yeti_boots.json +9951ccbf3f389ed936a081b53a96d8736f2a814b assets/twilightforest/models/item/yeti_chestplate.json +aed3aee86c1b146b9d1da909e24a6bca1cef4a1e assets/twilightforest/models/item/yeti_helmet.json +c6c020c42807f56fff0147b869720987066be378 assets/twilightforest/models/item/yeti_leggings.json +63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/twilightforest/models/item/yeti_spawn_egg.json +5c5358f8dadee7998b214b7105b8927dd6d6fcd3 assets/twilightforest/models/item/zombie_scepter.json +bf81b7da7483a7cb79e848de49ff41d1c6c832f9 assets/twilightforest/models/item/zombie_skull_candle.json diff --git a/src/generated/resources/.cache/9c786d47f960fc71cc836bbc881cf12f37fa5408 b/src/generated/resources/.cache/9c786d47f960fc71cc836bbc881cf12f37fa5408 new file mode 100644 index 0000000000..955a72b46e --- /dev/null +++ b/src/generated/resources/.cache/9c786d47f960fc71cc836bbc881cf12f37fa5408 @@ -0,0 +1,24 @@ +// 1.19.4 2023-03-15T21:24:53.5698355 Twilight Forest Biome Tags +de7eae9ce12a34bc9ba7e9b0a080f206b7bf5ab8 data/minecraft/tags/worldgen/biome/has_closer_water_fog.json +6fcfc9f11967d4486971cf630ce3613738d77290 data/minecraft/tags/worldgen/biome/snow_golem_melts.json +d465db5120f478c5dbf3e4038d755aaec6ea9eed data/minecraft/tags/worldgen/biome/spawns_cold_variant_frogs.json +d465db5120f478c5dbf3e4038d755aaec6ea9eed data/minecraft/tags/worldgen/biome/spawns_snow_foxes.json +6fcfc9f11967d4486971cf630ce3613738d77290 data/minecraft/tags/worldgen/biome/spawns_warm_variant_frogs.json +cb846337ee5998dbc62b197a9a1f006cbc978bf2 data/minecraft/tags/worldgen/biome/without_patrol_spawns.json +cb846337ee5998dbc62b197a9a1f006cbc978bf2 data/minecraft/tags/worldgen/biome/without_wandering_trader_spawns.json +cb846337ee5998dbc62b197a9a1f006cbc978bf2 data/minecraft/tags/worldgen/biome/without_zombie_sieges.json +0c664e7a353239e4d176a7b59ae493337633edc6 data/twilightforest/tags/worldgen/biome/in_twilight_forest.json +089e3f639e6201676ac279a83e322bf14f2af7f9 data/twilightforest/tags/worldgen/biome/valid_aurora_palace_biomes.json +bd0de92370a6ecd43b98916ae731430b57c06693 data/twilightforest/tags/worldgen/biome/valid_dark_tower_biomes.json +ffed46f1c73aadb1dec87c223b4930163ccd7036 data/twilightforest/tags/worldgen/biome/valid_final_castle_biomes.json +5dbc0593cfefd9710d1e409268dc18f9778ebaf9 data/twilightforest/tags/worldgen/biome/valid_hedge_maze_biomes.json +5dbc0593cfefd9710d1e409268dc18f9778ebaf9 data/twilightforest/tags/worldgen/biome/valid_hollow_hill_biomes.json +5fd1719d0b22f0d7e010f4116f4eb77dee86b226 data/twilightforest/tags/worldgen/biome/valid_hydra_lair_biomes.json +2a382bb5f70078ea9ba821ce46214def4f712510 data/twilightforest/tags/worldgen/biome/valid_knight_stronghold_biomes.json +a14f9ef2cc3bd86f97831c44eea5ff0b28102c38 data/twilightforest/tags/worldgen/biome/valid_labyrinth_biomes.json +5dbc0593cfefd9710d1e409268dc18f9778ebaf9 data/twilightforest/tags/worldgen/biome/valid_lich_tower_biomes.json +92b48a1581c1464ce588c770723ace329715d86f data/twilightforest/tags/worldgen/biome/valid_mushroom_tower_biomes.json +5dbc0593cfefd9710d1e409268dc18f9778ebaf9 data/twilightforest/tags/worldgen/biome/valid_naga_courtyard_biomes.json +af6fcb99600af8de2062598323e5c7c815ed6946 data/twilightforest/tags/worldgen/biome/valid_quest_grove_biomes.json +314565d6885146dded331c51c43558f6992cd4f2 data/twilightforest/tags/worldgen/biome/valid_troll_cave_biomes.json +42495f5d6b52b76067a886c454c134b6e2c18caa data/twilightforest/tags/worldgen/biome/valid_yeti_cave_biomes.json diff --git a/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e b/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e new file mode 100644 index 0000000000..76a1d55882 --- /dev/null +++ b/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e @@ -0,0 +1,660 @@ +// 1.19.4 2023-05-24T22:09:24.7638615 Recipes +4c349c3d4bf95cb50c96521172c333b9537f515f data/twilightforest/advancements/recipes/building_blocks/aurora_pillar.json +6eb608c85edd353726e1ef96b1f4de68c6513ff0 data/twilightforest/advancements/recipes/building_blocks/canopy_bookshelf.json +97addb9ea43b0c7946556857b27ce6c2605c56d9 data/twilightforest/advancements/recipes/building_blocks/castleblock/bold_castle_brick_pillar.json +7af1a5d0841bb1573bb2692851672dff7cd1aa88 data/twilightforest/advancements/recipes/building_blocks/castleblock/bold_castle_brick_stairs.json +2d6102445a57c25109c5cc29ac9f389631050471 data/twilightforest/advancements/recipes/building_blocks/castleblock/bold_castle_brick_tile.json +e112e4a13517959fd83b8d542456950f5660ccca data/twilightforest/advancements/recipes/building_blocks/castleblock/bold_castle_pillar_from_tile.json +9e4f442dc783affa0098effb80365acb6259490d data/twilightforest/advancements/recipes/building_blocks/castleblock/castle_brick_stairs.json +6f728f358c4fd38463e95714d2a3b18bc580a036 data/twilightforest/advancements/recipes/building_blocks/castleblock/cracked_castle_brick_stairs.json +5c163d61e114955c13c41465024c78469c377442 data/twilightforest/advancements/recipes/building_blocks/castleblock/encased_castle_brick_stairs.json +d3fb3ba94d1951b7812f15222358a4e7b0e8edd5 data/twilightforest/advancements/recipes/building_blocks/castleblock/encased_castle_pillar.json +8e6fffb192efb046291aa2f7d208703158eaf901 data/twilightforest/advancements/recipes/building_blocks/castleblock/mossy_castle_brick.json +424c2bad6c8ffb4cffecebe9b652d8936ddd2717 data/twilightforest/advancements/recipes/building_blocks/castleblock/mossy_castle_brick_stairs.json +de46f4be3ec29a447017bdfa22626ce2f9899bd3 data/twilightforest/advancements/recipes/building_blocks/castleblock/smelted_cracked_castle_brick.json +ab444397804a80435c2fb1975d46b6b7e2f94c26 data/twilightforest/advancements/recipes/building_blocks/castleblock/thick_castle_brick.json +1df8551c927046bc0610844f79863d099bd2ec68 data/twilightforest/advancements/recipes/building_blocks/castleblock/worn_castle_brick_stairs.json +f07b3b35af2d6067f59a78dd8732f553addb8443 data/twilightforest/advancements/recipes/building_blocks/compressed_blocks/arctic_block.json +356ac8e0bdf5a1696f9f0a03d8c9420ac133d0b2 data/twilightforest/advancements/recipes/building_blocks/compressed_blocks/carminite_block.json +b5dee403bc5eef818561538e664c9f093c5abe6b data/twilightforest/advancements/recipes/building_blocks/compressed_blocks/fiery_block.json +1fbf653dfe20070916573db71d27706261375381 data/twilightforest/advancements/recipes/building_blocks/compressed_blocks/ironwood_block.json +4543fbc196585f93901fed27de8be0edf426148c data/twilightforest/advancements/recipes/building_blocks/compressed_blocks/knightmetal_block.json +0f82af2b4d480bff39891ecc210eae85257520a8 data/twilightforest/advancements/recipes/building_blocks/compressed_blocks/steeleaf_block.json +1a8772e0dad6058119bfacea07edd29190a911cc data/twilightforest/advancements/recipes/building_blocks/empty_canopy_bookshelf.json +ea05c8d36fd17775fb7d33b2184f979899a341fd data/twilightforest/advancements/recipes/building_blocks/giant_cobblestone_to_cobblestone.json +27e2de4ce0df90643330781f1939b8f6ec31c0c8 data/twilightforest/advancements/recipes/building_blocks/giant_leaves_to_oak_leaves.json +8b5df38be13a88e6ba2272c76ecb143b392a399c data/twilightforest/advancements/recipes/building_blocks/giant_log_to_oak_planks.json +4e7880e935e3eceb983e5ed64e2e269011a38061 data/twilightforest/advancements/recipes/building_blocks/maze_stone/mossy_mazestone.json +819ff978bfcb34a5f15f208ee7907e73052fd655 data/twilightforest/advancements/recipes/building_blocks/maze_stone/smelted_maze_stone_cracked.json +6beff8216fb94a7935e0c12db1a8397d5cf9b3bb data/twilightforest/advancements/recipes/building_blocks/mossy_underbrick.json +c185ded22d4d38d5ef6bce115e0031a3470b5c82 data/twilightforest/advancements/recipes/building_blocks/nagastone/cracked_nagastone_stairs_left.json +6aa88a21cf8dea5a0ada9c15407d589e9ec61229 data/twilightforest/advancements/recipes/building_blocks/nagastone/cracked_nagastone_stairs_right.json +a19e66f656626c4265507a576ad68c669aa34e7a data/twilightforest/advancements/recipes/building_blocks/nagastone/mossy_etched_nagastone.json +f464e0bba5cf50ec55cac376d852ee54f89e3483 data/twilightforest/advancements/recipes/building_blocks/nagastone/mossy_nagastone_pillar.json +0d79f3590626b2c4173eb40c8b73ce25a27ccb7e data/twilightforest/advancements/recipes/building_blocks/nagastone/mossy_nagastone_stairs_left.json +df374ccd6fcf6b75c9f99d29878a6859e5ff1fcd data/twilightforest/advancements/recipes/building_blocks/nagastone/mossy_nagastone_stairs_right.json +766b3aa4f8fb49df0a704a725a6d3ea43353e0c0 data/twilightforest/advancements/recipes/building_blocks/nagastone/nagastone_spiral.json +17a817bb6172df2c2b9f682dc4665aa8ad8c848b data/twilightforest/advancements/recipes/building_blocks/nagastone/nagastone_stairs_left.json +acaf00d0a7a23caad96d96b72d101673999b1fb4 data/twilightforest/advancements/recipes/building_blocks/nagastone/nagastone_stairs_right.json +0d245b5b66933e2e1ae3999d33cedee88f160f8f data/twilightforest/advancements/recipes/building_blocks/nagastone/smelted_cracked_etched_nagastone.json +d37065920bc4b985cd6ae312d396e3855fdafce0 data/twilightforest/advancements/recipes/building_blocks/nagastone/smelted_cracked_nagastone_pillar.json +2b2896b203996f7b5375dfe48dd9ee5bfbb5f423 data/twilightforest/advancements/recipes/building_blocks/smelted_cracked_underbrick.json +eb8acdcae35fa146ddb0eb31d31dbfd2d67c2fcc data/twilightforest/advancements/recipes/building_blocks/tf_moss_to_vanilla.json +5b7cfaac4d8d03a83c70260b0496c69225b0e46f data/twilightforest/advancements/recipes/building_blocks/wood/aurora_slab_slab.json +ec708da531e3ccab4615d2d59ce61df42b0e9ebb data/twilightforest/advancements/recipes/building_blocks/wood/canopy_from_stripped_planks.json +1a4367c3215cd13de9d1c7a02a3b4f0aa9ddb472 data/twilightforest/advancements/recipes/building_blocks/wood/canopy_from_stripped_wood_planks.json +f05a3c69c2957747d2bd1750ce4bc7a7c07a6540 data/twilightforest/advancements/recipes/building_blocks/wood/canopy_from_wood_planks.json +f17c8e74bfeaf16b5e8cec752ef017f5a8233118 data/twilightforest/advancements/recipes/building_blocks/wood/canopy_planks.json +66b0a14eb5d780afbc943684808a58daf3079956 data/twilightforest/advancements/recipes/building_blocks/wood/canopy_slab.json +57c7edb448b363273c2b41f9a60b2275286131dd data/twilightforest/advancements/recipes/building_blocks/wood/canopy_stairs.json +171239edccc41c39f8abca6de32d7cd19c1f27ca data/twilightforest/advancements/recipes/building_blocks/wood/canopy_stripped_wood.json +f96da98bde265370067118b28681b3abc0ccd732 data/twilightforest/advancements/recipes/building_blocks/wood/canopy_wood.json +c3bc17fbf086af2b4091713e1aac3a64f3dd6777 data/twilightforest/advancements/recipes/building_blocks/wood/darkwood_from_stripped_planks.json +a7e0e9da63c7ce5798f9ab1c0364189c808be3ff data/twilightforest/advancements/recipes/building_blocks/wood/darkwood_from_stripped_wood_planks.json +be6185a0fb37e7c4014679e7fa2fc7ca0e2785f3 data/twilightforest/advancements/recipes/building_blocks/wood/darkwood_from_wood_planks.json +67d25b193cc3b96cd549727d83b1e620117b7693 data/twilightforest/advancements/recipes/building_blocks/wood/darkwood_planks.json +14f2fc9dc77f261f29bc5df2e947ba05e8850aa5 data/twilightforest/advancements/recipes/building_blocks/wood/darkwood_slab.json +90cdc39b05f74320212d619bf91856d79ea3158b data/twilightforest/advancements/recipes/building_blocks/wood/darkwood_stairs.json +8903ecf48aeea1d0f0d9c1adf3eafaab366958a1 data/twilightforest/advancements/recipes/building_blocks/wood/darkwood_stripped_wood.json +a68bded4da4e13b102c294f808892c5fff031b0a data/twilightforest/advancements/recipes/building_blocks/wood/darkwood_wood.json +88a7521ca6d359ddf44f9115421ac94c3e5bf1ed data/twilightforest/advancements/recipes/building_blocks/wood/mangrove_from_stripped_planks.json +3cb88291d71592d4360d20076cad521908464930 data/twilightforest/advancements/recipes/building_blocks/wood/mangrove_from_stripped_wood_planks.json +5e67b899cde47270bfe87ff219860bda87efb871 data/twilightforest/advancements/recipes/building_blocks/wood/mangrove_from_wood_planks.json +cf8042fa91f733482d3ecdafaacfac8a21de6c54 data/twilightforest/advancements/recipes/building_blocks/wood/mangrove_planks.json +ce1423b981efc51b3f462be45c5ae0254277ee39 data/twilightforest/advancements/recipes/building_blocks/wood/mangrove_slab.json +e323845dc555066d535d5c1b87cb185e0e41317a data/twilightforest/advancements/recipes/building_blocks/wood/mangrove_stairs.json +924fbba2182eef6165009b0a72c8e707090ac6d8 data/twilightforest/advancements/recipes/building_blocks/wood/mangrove_stripped_wood.json +ce730d8864da597be5e84ea37fac58f249402bf3 data/twilightforest/advancements/recipes/building_blocks/wood/mangrove_wood.json +f2920bf821750b1264ccdab2b150594c907f4b20 data/twilightforest/advancements/recipes/building_blocks/wood/mining_from_stripped_planks.json +aeec47556343762817d4b861128360627c41087f data/twilightforest/advancements/recipes/building_blocks/wood/mining_from_stripped_wood_planks.json +72ccfd0a90db00293846bfc8ebf646783ef7f051 data/twilightforest/advancements/recipes/building_blocks/wood/mining_from_wood_planks.json +37c188b375854010063ac1d7f78295fd67cade87 data/twilightforest/advancements/recipes/building_blocks/wood/mining_planks.json +78b7bedea8bd3ed6d00327b6d74721964e2d073f data/twilightforest/advancements/recipes/building_blocks/wood/mining_slab.json +e6fcd4890eed7a243ecb3518b0693e765a8f40f0 data/twilightforest/advancements/recipes/building_blocks/wood/mining_stairs.json +24bf87148743e608e03d2c8816625c99bc102a27 data/twilightforest/advancements/recipes/building_blocks/wood/mining_stripped_wood.json +d77c273bd94f08228905130a98e25a14e5a7145d data/twilightforest/advancements/recipes/building_blocks/wood/mining_wood.json +eda241d8b7469e1fc416cf149e04d0a607a6381f data/twilightforest/advancements/recipes/building_blocks/wood/mossy_towerwood.json +bd590e8d26b4919f427290cb961b23bf4fdf114e data/twilightforest/advancements/recipes/building_blocks/wood/smoked_cracked_towerwood.json +6d51d5013e75126f2d266fdb8b6cbbcb57106651 data/twilightforest/advancements/recipes/building_blocks/wood/sorting_from_stripped_planks.json +cbda51336f6e0d82155a18eb4b526f01b89adb9e data/twilightforest/advancements/recipes/building_blocks/wood/sorting_from_stripped_wood_planks.json +a2b49e7d21cbf753f4c3958c60c3e889307f91bb data/twilightforest/advancements/recipes/building_blocks/wood/sorting_from_wood_planks.json +6afb885fb41f7a36067bbf1225e0ef6855e173bd data/twilightforest/advancements/recipes/building_blocks/wood/sorting_planks.json +062f47970c80a7df4b23ca8ef56af4e57511fb7d data/twilightforest/advancements/recipes/building_blocks/wood/sorting_slab.json +4cc3c093e4ef579aed9e3d64d39d14f64da151a2 data/twilightforest/advancements/recipes/building_blocks/wood/sorting_stairs.json +05b5963208879dd2b31fc584187bada213aac7ff data/twilightforest/advancements/recipes/building_blocks/wood/sorting_stripped_wood.json +3651761bc24c84263f945c41d05630a46e98becf data/twilightforest/advancements/recipes/building_blocks/wood/sorting_wood.json +6dac45341ca964fa0dd28934429cf40392812c70 data/twilightforest/advancements/recipes/building_blocks/wood/time_from_stripped_planks.json +6f193259b39b14f9552a7b4b94d1cb356fbd291c data/twilightforest/advancements/recipes/building_blocks/wood/time_from_stripped_wood_planks.json +98019fa239869d528d347d080b41dde094e83137 data/twilightforest/advancements/recipes/building_blocks/wood/time_from_wood_planks.json +e4753b846ec9e85a10dc890ed5e2bd0de45b5fdb data/twilightforest/advancements/recipes/building_blocks/wood/time_planks.json +178123106b46c785f492dd73b1a8c999936626c0 data/twilightforest/advancements/recipes/building_blocks/wood/time_slab.json +3f67f312ab394fdd2f3642e468032201c87d3de5 data/twilightforest/advancements/recipes/building_blocks/wood/time_stairs.json +3fcfc7ac3e8cfcb698a1a17d3f016c62d859b896 data/twilightforest/advancements/recipes/building_blocks/wood/time_stripped_wood.json +5a125059d7690d65eb5cd7d96d3def012bc7441b data/twilightforest/advancements/recipes/building_blocks/wood/time_wood.json +13a18f76ae7398ad91844e0682e83ff61112ff67 data/twilightforest/advancements/recipes/building_blocks/wood/transformation_from_stripped_planks.json +569aeaac4d12b3f86fb61e45b8aa3e5b7c312735 data/twilightforest/advancements/recipes/building_blocks/wood/transformation_from_stripped_wood_planks.json +532c79f5afbf9757f39df549bd485fa99e29e87b data/twilightforest/advancements/recipes/building_blocks/wood/transformation_from_wood_planks.json +940cb6bd2d64f59a00476ca25feccb6b0151b9e2 data/twilightforest/advancements/recipes/building_blocks/wood/transformation_planks.json +a1fb33a331066672667c8d1d10882d768a57038d data/twilightforest/advancements/recipes/building_blocks/wood/transformation_slab.json +4733324b4f62f01fcb8d4390b506bc7ea7173789 data/twilightforest/advancements/recipes/building_blocks/wood/transformation_stairs.json +06f6db69842a2d704b11239862c2fe27eff0d84b data/twilightforest/advancements/recipes/building_blocks/wood/transformation_stripped_wood.json +0178f1a1b62dc7cf4469f195ee2dd9134e4d20a2 data/twilightforest/advancements/recipes/building_blocks/wood/transformation_wood.json +2331f84ef64edbce994c73d4daa0df8ff2e554c2 data/twilightforest/advancements/recipes/building_blocks/wood/twilight_oak_from_stripped_planks.json +86741a74313ff9c8ee5bf36cc0e876a7223c8b16 data/twilightforest/advancements/recipes/building_blocks/wood/twilight_oak_from_stripped_wood_planks.json +138cc7278149d2a76f5f74185c2c2fc898dd674b data/twilightforest/advancements/recipes/building_blocks/wood/twilight_oak_from_wood_planks.json +496384b1d1cf27e8295a7e0cea186c5aff976836 data/twilightforest/advancements/recipes/building_blocks/wood/twilight_oak_planks.json +1fcfee617a6d475b1b6d51ea16ebf20bf93c8ad5 data/twilightforest/advancements/recipes/building_blocks/wood/twilight_oak_slab.json +45e7310f1cb8c89fda9f06266b0631e7778aec01 data/twilightforest/advancements/recipes/building_blocks/wood/twilight_oak_stairs.json +f4a6378b73320536f2d97f9f9a0e4e69458eac2d data/twilightforest/advancements/recipes/building_blocks/wood/twilight_oak_stripped_wood.json +6510ff2a91fe17f2f312f9db0978c4cc620cf0e1 data/twilightforest/advancements/recipes/building_blocks/wood/twilight_oak_wood.json +3c4ac5bc3eb121bb1a4898fbede40308e682fe33 data/twilightforest/advancements/recipes/combat/equipment/arctic_boots.json +d9cf56db1a91c410cc6691eb0e7de21377bb6021 data/twilightforest/advancements/recipes/combat/equipment/arctic_chestplate.json +0523a256d1921a68a2728f1f156d37f7605fd2c6 data/twilightforest/advancements/recipes/combat/equipment/arctic_helmet.json +a54cec97cf93139fc76c31e076a2df9189c93e69 data/twilightforest/advancements/recipes/combat/equipment/arctic_leggings.json +6547591f6afb1f017a8690900daa3e8168d912fb data/twilightforest/advancements/recipes/combat/equipment/block_and_chain.json +b213e54fa2b5bbd22498746f99b8624f5bd22344 data/twilightforest/advancements/recipes/combat/equipment/fiery_boots.json +797e2c1e94f6ea45b86170b5124cb181f823aa4c data/twilightforest/advancements/recipes/combat/equipment/fiery_chestplate.json +729749bb639eceddd76e5e199e923970f64c08c5 data/twilightforest/advancements/recipes/combat/equipment/fiery_fiery_boots.json +9de76646d674afaac6ce2663d91f0ec08d29ddf5 data/twilightforest/advancements/recipes/combat/equipment/fiery_fiery_chestplate.json +ae9e3ce2021e312f5f319d50c8bcab2c1919f103 data/twilightforest/advancements/recipes/combat/equipment/fiery_fiery_helmet.json +ecb4ede93a41b80d6415c7ead701f26a93242729 data/twilightforest/advancements/recipes/combat/equipment/fiery_fiery_leggings.json +ac2db55062b27cf290ca95d775a46094acf64915 data/twilightforest/advancements/recipes/combat/equipment/fiery_helmet.json +114164c277625a6bf4373eb8ea3fe5b482d49c1d data/twilightforest/advancements/recipes/combat/equipment/fiery_iron_sword.json +cd690a317b71f019803fa6744ac2e1a33808f4f1 data/twilightforest/advancements/recipes/combat/equipment/fiery_leggings.json +ccd5999b9e070288c8a06ed12b2c893952bad741 data/twilightforest/advancements/recipes/combat/equipment/fiery_sword.json +20e182ce9bc38f773f0c6e3beea9288266041cba data/twilightforest/advancements/recipes/combat/equipment/fortification_scepter.json +18133f995f0e2f206aa9bd9b76fcf3619ceb5ccd data/twilightforest/advancements/recipes/combat/equipment/knightmetal_boots.json +1e86fdc33c3e9cae66b4b880989acf99a27ebce4 data/twilightforest/advancements/recipes/combat/equipment/knightmetal_chestplate.json +404b881d28278eba6547989e674d5f3d0fe391b3 data/twilightforest/advancements/recipes/combat/equipment/knightmetal_helmet.json +032f9392d8101fab693d0d3c08b07ded00eb083f data/twilightforest/advancements/recipes/combat/equipment/knightmetal_leggings.json +62e2c6cd2c713f0fd3108d260eeaad684083dce3 data/twilightforest/advancements/recipes/combat/equipment/knightmetal_shield.json +7fd4d7a7e493b41173763543e53aaa706584a307 data/twilightforest/advancements/recipes/combat/equipment/knightmetal_sword.json +ca9d8db91842a6cc97031bfe5bdfe60b12b53067 data/twilightforest/advancements/recipes/combat/equipment/lifedrain_scepter.json +512007188a278f9bcc78b4ebcf8e7e30881209c1 data/twilightforest/advancements/recipes/combat/equipment/twilight_scepter.json +698137757705ff345cce7be942e7219320dda5ef data/twilightforest/advancements/recipes/combat/equipment/zombie_scepter.json +0cc8f40363a3af67c12e14e1355e7d55e72ed8dd data/twilightforest/advancements/recipes/decorations/berry_torch.json +af9b09287509bb85cc601942f8d5fe634ba707b8 data/twilightforest/advancements/recipes/decorations/cicada_jar.json +75e92cc0ecb75ff0c6dc071d1757bc1ba99bb404 data/twilightforest/advancements/recipes/decorations/firefly_jar.json +e124110c85ad76514925d55fd5648ccca3f5eafc data/twilightforest/advancements/recipes/decorations/firefly_particle_spawner.json +63a316a32ca6082bf2a108b8609d07b979c5fe66 data/twilightforest/advancements/recipes/decorations/iron_ladder.json +536c84eff93ca82dac533cba2528135afaacddf1 data/twilightforest/advancements/recipes/decorations/tf_to_vanilla_lilypad.json +4c064a27e781c64a8e133d2ca21469c8110c6d6a data/twilightforest/advancements/recipes/decorations/uncrafting_table.json +946e4f8d97278314db9bce0c716fc6f506bd7e8d data/twilightforest/advancements/recipes/decorations/vanilla_to_tf_lilypad.json +d628e1d0640a87c1ca7cab36077f6e862045014e data/twilightforest/advancements/recipes/decorations/vanilla_to_tf_moss.json +719aa323fd8427f873d35d718772aa95482176f7 data/twilightforest/advancements/recipes/decorations/wood/acacia_banister.json +67ce84985786068de80099c74cde608324f139c3 data/twilightforest/advancements/recipes/decorations/wood/birch_banister.json +6e577a7800e6a38972afd50e48c06b9652479dea data/twilightforest/advancements/recipes/decorations/wood/canopy_banister.json +88af62f4deb4c0c3f38472d1a8788d6757618897 data/twilightforest/advancements/recipes/decorations/wood/canopy_chest.json +1b817e5273b9f6deb015afc8573f8f3f1f3e5b92 data/twilightforest/advancements/recipes/decorations/wood/canopy_fence.json +172ab8fcbbff74dc76d95c034a3db4677e0abfc4 data/twilightforest/advancements/recipes/decorations/wood/canopy_sign_wood.json +98bf595d789844be7f1e7dd31ddfe2275dea7074 data/twilightforest/advancements/recipes/decorations/wood/crimson_banister.json +1e59b9ae645ee6e218666b29cd54c2f0280dd782 data/twilightforest/advancements/recipes/decorations/wood/darkwood_banister.json +3cc8689321aacb993751c2bca27e879bd7c81b22 data/twilightforest/advancements/recipes/decorations/wood/darkwood_chest.json +dd27305eced6a0fd69644b106626492788d7b82a data/twilightforest/advancements/recipes/decorations/wood/darkwood_fence.json +7ee6898d400cad9b24d772e9c50be5c74a7472f4 data/twilightforest/advancements/recipes/decorations/wood/darkwood_sign_wood.json +4d757bee41247854c07b7770b69aa636085b6b1f data/twilightforest/advancements/recipes/decorations/wood/dark_oak_banister.json +bed78472430782e64aa83b34d36df161af281ad4 data/twilightforest/advancements/recipes/decorations/wood/jungle_banister.json +7d76595429fe6c0b7c896ebcfcdfb141d4eca7ff data/twilightforest/advancements/recipes/decorations/wood/mangrove_banister.json +f1ab3ffec3884e602eaad7a7faaeee3a8257a369 data/twilightforest/advancements/recipes/decorations/wood/mangrove_chest.json +7615856820cba04e3700bd2607c5390b58131f4c data/twilightforest/advancements/recipes/decorations/wood/mangrove_fence.json +677ab61d85d7e1495462921f25a57c486dc4f452 data/twilightforest/advancements/recipes/decorations/wood/mangrove_sign_wood.json +a0ee83d160a856076693239ae876ca614ff01e40 data/twilightforest/advancements/recipes/decorations/wood/mining_banister.json +cc46ca47b6483a685a370e416746bdc0e2b288bc data/twilightforest/advancements/recipes/decorations/wood/mining_chest.json +07494d55ce250cbb1c8be4ba275afeb629533f7e data/twilightforest/advancements/recipes/decorations/wood/mining_fence.json +5547927f02b71a44f07e6f7179ed05b044792498 data/twilightforest/advancements/recipes/decorations/wood/mining_sign_wood.json +7718d45660cfe1dd6362da4578de8c4b07c2556c data/twilightforest/advancements/recipes/decorations/wood/oak_banister.json +350f80c662086808c480d10b318cd0e0fb5cdc1b data/twilightforest/advancements/recipes/decorations/wood/sorting_banister.json +d4a33dd768926952a2a6e648cdb48024e55999a7 data/twilightforest/advancements/recipes/decorations/wood/sorting_chest.json +f0be3d25fd1c014c768d5a40d4b8ea873527e122 data/twilightforest/advancements/recipes/decorations/wood/sorting_fence.json +400b9b0a054e449b54b86e086bfa96f7821614d5 data/twilightforest/advancements/recipes/decorations/wood/sorting_sign_wood.json +2a7d28d356cd69477d72bae1de8be6b9cafa8625 data/twilightforest/advancements/recipes/decorations/wood/spruce_banister.json +49f1777a4efc59d20de7bc7176c55cdda61584d4 data/twilightforest/advancements/recipes/decorations/wood/time_banister.json +5e3bf71f736dba1bba94abf1506252c4b814972c data/twilightforest/advancements/recipes/decorations/wood/time_chest.json +9aeb5ec29c4c7b796a6bf8917ba88ee87bd7d110 data/twilightforest/advancements/recipes/decorations/wood/time_fence.json +02c04e51d6676a0b4ff9223cde458b80e1b5b264 data/twilightforest/advancements/recipes/decorations/wood/time_sign_wood.json +9d586772cd00a7dbb42b343ab7c39a405b0468af data/twilightforest/advancements/recipes/decorations/wood/transformation_banister.json +8191fd53457ed3be298ae35a750eb4a9fe668269 data/twilightforest/advancements/recipes/decorations/wood/transformation_chest.json +73079d920008c9fb19207c7c55e35f4f12299c1e data/twilightforest/advancements/recipes/decorations/wood/transformation_fence.json +f70abe6ee85e7f2007cc59ca42b00068a746c302 data/twilightforest/advancements/recipes/decorations/wood/transformation_sign_wood.json +194619f5dd3dcde0a7b7370423ca8ca752515793 data/twilightforest/advancements/recipes/decorations/wood/twilight_oak_banister.json +ff68f9eadf79b57fdb81e4dfc4c16c64bea9b045 data/twilightforest/advancements/recipes/decorations/wood/twilight_oak_chest.json +b2ea85fa38fa1fc691e6d5f6960293c0c2ca1e9d data/twilightforest/advancements/recipes/decorations/wood/twilight_oak_fence.json +cd96f397bbb6c83b3d11f12f00c3b43b9a7fc993 data/twilightforest/advancements/recipes/decorations/wood/twilight_oak_sign_wood.json +f73e3838f398e7bd8b2048aa26136cd4119211d0 data/twilightforest/advancements/recipes/decorations/wood/vangrove_banister.json +254c7790bb522ee6548c314e254062a37f0df7b1 data/twilightforest/advancements/recipes/decorations/wood/warped_banister.json +9582b256bcf70b1c70222243435c7bc086930842 data/twilightforest/advancements/recipes/food/food/campfired_meef.json +3187fb645be9c98428895635409a06b66c082b04 data/twilightforest/advancements/recipes/food/food/campfired_venison.json +56685f8b41537e9fc4382724e66a30996a118752 data/twilightforest/advancements/recipes/food/food/smelted_meef.json +6917d70991934a11873fab9a3c6df46a52c530c5 data/twilightforest/advancements/recipes/food/food/smelted_venison.json +5d1362e6f3d82a278d7b1bd889b8a811d76abc9b data/twilightforest/advancements/recipes/food/food/smoked_meef.json +6f0a2858fe32af164067c157d3fc37be190747c7 data/twilightforest/advancements/recipes/food/food/smoked_venison.json +9eb3a0214fb11d855bd0c090b20e93e9732abedf data/twilightforest/advancements/recipes/misc/alpha_yeti_banner_pattern.json +33eef65f31455fb999c1a6bc64fd8e5088f88f9e data/twilightforest/advancements/recipes/misc/compressed_blocks/reversed/arctic_block_to_item.json +0299660314f0809bb996d60650a8839bc8b4e69d data/twilightforest/advancements/recipes/misc/compressed_blocks/reversed/carminite_block_to_item.json +971a3b349607415b9663d1ca5dc7cce19191c9ee data/twilightforest/advancements/recipes/misc/compressed_blocks/reversed/fiery_block_to_ingot.json +4ddd852c587e27863705e4d75590469956e531ae data/twilightforest/advancements/recipes/misc/compressed_blocks/reversed/ironwood_block_ingot.json +6f5385990cf938538574cf2fd1419d03d90d6765 data/twilightforest/advancements/recipes/misc/compressed_blocks/reversed/knightmetal_block_ingot.json +5fc6fd10ef1b8d3f2371751f9278af566baa43e9 data/twilightforest/advancements/recipes/misc/compressed_blocks/reversed/steeleaf_block_ingot.json +31ddb7446ecf220a96a4d30e5caccabab72f629e data/twilightforest/advancements/recipes/misc/equipment/fiery_ingot_crafting.json +8e4a233e3f68d28d1aff2328b7f79a78507739d6 data/twilightforest/advancements/recipes/misc/equipment/knightmetal_ring.json +a88983eae2dd81a43dce3f4c7b455365c4e1766a data/twilightforest/advancements/recipes/misc/hydra_banner_pattern.json +ec70336cccd528305e4a41cf4c4d3bfef08d2102 data/twilightforest/advancements/recipes/misc/knight_phantom_banner_pattern.json +ca3c91862c6cb57f2dc0d70a6a42c7869addc23d data/twilightforest/advancements/recipes/misc/lich_banner_pattern.json +4953f30e4002338067d0ed3c0318d7b8f39ec664 data/twilightforest/advancements/recipes/misc/magic_map.json +ef6222a0392e38f40946559f970c79f72b4fc41f data/twilightforest/advancements/recipes/misc/magic_map_focus.json +ad3668c35b73b236282d602ebb4b75ed7e809333 data/twilightforest/advancements/recipes/misc/material/armor_shard_cluster.json +b900da10638ed70f5d663d5fde1514d362be6374 data/twilightforest/advancements/recipes/misc/material/blasted_ironwood_ingot.json +c473cfd6e77a7938c2c977e88d3e379ffec69609 data/twilightforest/advancements/recipes/misc/material/blasted_knightmetal_ingot.json +655527009bf229024167529ccbd9b1725b6e3083 data/twilightforest/advancements/recipes/misc/material/carminite.json +3721ec69723980f6b2f0bbd6c4ecced63fb9d947 data/twilightforest/advancements/recipes/misc/material/raw_ironwood.json +6013439fb9e307c63080525aa87429461e65dca6 data/twilightforest/advancements/recipes/misc/material/smelted_ironwood_ingot.json +0bf0043d771d076e5cea4a457f40b854a4bd32fe data/twilightforest/advancements/recipes/misc/material/smelted_knightmetal_ingot.json +390b635e7b863fc736841bb6488b48a12f63cf2f data/twilightforest/advancements/recipes/misc/maze_map.json +e3dee7607b7ec4a9b0d981b253ad140c5b22fb1c data/twilightforest/advancements/recipes/misc/minoshroom_banner_pattern.json +167ba6c0094f4e2aa04353622bfa72e14ead0cd1 data/twilightforest/advancements/recipes/misc/naga_banner_pattern.json +3445da42506efe191cae881a87bc6ee62c03be2c data/twilightforest/advancements/recipes/misc/ore_map.json +2efa5f64f48d4040fff6172b442968786460676b data/twilightforest/advancements/recipes/misc/quest_ram_banner_pattern.json +bc28382d557146f0cd99c03d9afa5358be559c06 data/twilightforest/advancements/recipes/misc/root_stick.json +218279ae2a4606744ca6928a7338df83e5bb0b76 data/twilightforest/advancements/recipes/misc/snow_queen_banner_pattern.json +61485362c481c8a1fa31e78bb68fc5b35c602e92 data/twilightforest/advancements/recipes/misc/thorn_rose_to_red.json +bbe6dfa9548fa104b09310469a7737e117b3051a data/twilightforest/advancements/recipes/misc/ur_ghast_banner_pattern.json +a0e83dcce15cf67d538eda4009d8d6d207a6ba5b data/twilightforest/advancements/recipes/misc/waterlily_to_magenta.json +a5c4d2842418f9d71dd9fdfab7a11838f21b9255 data/twilightforest/advancements/recipes/redstone/carminite_builder.json +f7a4f5b501e3d154469f21525b8d7737d7fbfc10 data/twilightforest/advancements/recipes/redstone/carminite_reactor.json +00397c42258c43c2bec5a8feef5fb9ae028b1f79 data/twilightforest/advancements/recipes/redstone/encased_fire_jet.json +4643c832f9b297909a48e1b2eb3aebcdc5065482 data/twilightforest/advancements/recipes/redstone/encased_smoker.json +1c92a093c3980b3db7fb421a38c149792a0c5d7e data/twilightforest/advancements/recipes/redstone/reappearing_block.json +9ecb5ec183a2624092aec39931c82b4e7ae9cb06 data/twilightforest/advancements/recipes/redstone/vanishing_block.json +26d4c90d06bc15f4f97f31838495ce26a776f3d5 data/twilightforest/advancements/recipes/redstone/wood/canopy_button.json +12f5135626593bccb3add6803247aac43bcd10f4 data/twilightforest/advancements/recipes/redstone/wood/canopy_door.json +71638bcb316f59c8e7123498e430fa98570b6b30 data/twilightforest/advancements/recipes/redstone/wood/canopy_gate.json +5d6126699c4dae51d78fdb40e222426625416e9a data/twilightforest/advancements/recipes/redstone/wood/canopy_plate.json +65f321d6ed2d31f3472ba640bff92107f07a3251 data/twilightforest/advancements/recipes/redstone/wood/canopy_trapdoor.json +fadb25b7bc1eef9961a33ec75704670a7fb835cf data/twilightforest/advancements/recipes/redstone/wood/darkwood_button.json +67fd0b5fbe74e58a72f6fc7b372d21312ba7d183 data/twilightforest/advancements/recipes/redstone/wood/darkwood_door.json +897b8f5d23809257085f850e9b8fce2b44afaef7 data/twilightforest/advancements/recipes/redstone/wood/darkwood_gate.json +5bf0a3378c548d97e37ce7d72fff81b640afc3fc data/twilightforest/advancements/recipes/redstone/wood/darkwood_plate.json +7ba8b81169a68e2940d6b3c1bae74d0b90c10ee9 data/twilightforest/advancements/recipes/redstone/wood/darkwood_trapdoor.json +042a95927033a6f62cd53c371afc016e1f57e22e data/twilightforest/advancements/recipes/redstone/wood/mangrove_button.json +7e22d60fb8e178bebe8578c44325c17c0c7a5484 data/twilightforest/advancements/recipes/redstone/wood/mangrove_door.json +62271bae1b2e2d1e342261860db27b75b1b76e5a data/twilightforest/advancements/recipes/redstone/wood/mangrove_gate.json +5957fedbc73d1ab0823cc3ac134fc1522798a25c data/twilightforest/advancements/recipes/redstone/wood/mangrove_plate.json +4a5805e53ff75e0eb67e5e3795564963f9dd594f data/twilightforest/advancements/recipes/redstone/wood/mangrove_trapdoor.json +8b978da746c289c8113d00991735fcdd63d8079c data/twilightforest/advancements/recipes/redstone/wood/mining_button.json +128512f4a700dbd0e29d35c035abe6f72c138442 data/twilightforest/advancements/recipes/redstone/wood/mining_door.json +feb631624a33e5b6577e60e99166d98440635a24 data/twilightforest/advancements/recipes/redstone/wood/mining_gate.json +cf892f49a47d102fc375a796488170491f2f4b2a data/twilightforest/advancements/recipes/redstone/wood/mining_plate.json +4d1160f0b54a8c67b95bdc162a5c435631d08247 data/twilightforest/advancements/recipes/redstone/wood/mining_trapdoor.json +15031aa424e51e315547b891e4f6486feda13a32 data/twilightforest/advancements/recipes/redstone/wood/sorting_button.json +a60edc4330ddf92e3a445add49ab1c60857eeef6 data/twilightforest/advancements/recipes/redstone/wood/sorting_door.json +d6c36f23b47b24b11dd8fed99d03f3324a11d95c data/twilightforest/advancements/recipes/redstone/wood/sorting_gate.json +722e16d0bae65bdb4f49a3f684476694b160d7dc data/twilightforest/advancements/recipes/redstone/wood/sorting_plate.json +b6e35a9c15e936b1ebf694521fe8a237308a7df6 data/twilightforest/advancements/recipes/redstone/wood/sorting_trapdoor.json +a11500a97ae2b27f862842eefc61bc1242a29d84 data/twilightforest/advancements/recipes/redstone/wood/time_button.json +7091e267884cc41190cfc9d6ce6e30444bb1a848 data/twilightforest/advancements/recipes/redstone/wood/time_door.json +df5fab41c11847a6cb072b3113557084cf9b5254 data/twilightforest/advancements/recipes/redstone/wood/time_gate.json +fda6b0d10e06a52512da167b86c4a1409f4779af data/twilightforest/advancements/recipes/redstone/wood/time_plate.json +782d3b3076f8fd2fbe5479ceeecb27d44a4af9d7 data/twilightforest/advancements/recipes/redstone/wood/time_trapdoor.json +081eea9b72c63fb35cbe175288ae58a56c4c3f35 data/twilightforest/advancements/recipes/redstone/wood/transformation_button.json +b72519bbbc7cb2fa1f008c56656987374be8496b data/twilightforest/advancements/recipes/redstone/wood/transformation_door.json +a792d14795b6a8f61f3c09d34d2d3e5670f1cd00 data/twilightforest/advancements/recipes/redstone/wood/transformation_gate.json +ebd62280a5ffb1c58751919c7bc3ed90674813a8 data/twilightforest/advancements/recipes/redstone/wood/transformation_plate.json +cba74ff441ec2541be61c8228ca9f114b38dc6ea data/twilightforest/advancements/recipes/redstone/wood/transformation_trapdoor.json +b0da5af97dfebaf1b75c65e526180b4e7779eadd data/twilightforest/advancements/recipes/redstone/wood/twilight_oak_button.json +b4f477c9948ccd0d3c6f42eb0b3b3696683bd3e2 data/twilightforest/advancements/recipes/redstone/wood/twilight_oak_door.json +984559d0c9366dc13407167458c7f7cc9aecc254 data/twilightforest/advancements/recipes/redstone/wood/twilight_oak_gate.json +227ad306ee5ec654b15239819b17b2f88c1e7d36 data/twilightforest/advancements/recipes/redstone/wood/twilight_oak_plate.json +b045f3d70d7ccd4a1497b647d92429752d60c904 data/twilightforest/advancements/recipes/redstone/wood/twilight_oak_trapdoor.json +7f8deef236895f8ad2765f0c76abc75db6de564d data/twilightforest/advancements/recipes/tools/charm_of_keeping_2.json +407dcce10b2831a25f183571ca054c745fa9bb53 data/twilightforest/advancements/recipes/tools/charm_of_keeping_3.json +dbfaf2f1780ce0c8aa88807ff2a4c4b62e0ad83a data/twilightforest/advancements/recipes/tools/charm_of_life_2.json +020505edbc2871b20f6f130ca75ff5b0a58ffe32 data/twilightforest/advancements/recipes/tools/equipment/fiery_iron_pickaxe.json +e380adc24dcf651cf4084b2862dda2996bf29378 data/twilightforest/advancements/recipes/tools/equipment/fiery_pickaxe.json +74d75c1e05e576a0863695db3b5d1807975eb57a data/twilightforest/advancements/recipes/tools/equipment/giant_pickaxe.json +3611fda9381d272b9dcfdcfa383b0cb9190bfe6c data/twilightforest/advancements/recipes/tools/equipment/giant_sword.json +a8bc895a66d0bce88f3214e1a9c17f08dbf685ba data/twilightforest/advancements/recipes/tools/equipment/knightmetal_axe.json +ef9b1b08efe0d12b9f01a660acdd7eaf23c4a910 data/twilightforest/advancements/recipes/tools/equipment/knightmetal_pickaxe.json +6455c72487680c42e98401efccb980b1fa2b5ae6 data/twilightforest/advancements/recipes/transportation/canopy_boat.json +7b5584d9bac902236b859c5a7af9a5979fcae545 data/twilightforest/advancements/recipes/transportation/canopy_chest_boat.json +122cbfa3fe75c416324f0c1f87b145c353ec8ca9 data/twilightforest/advancements/recipes/transportation/dark_boat.json +bab5c3a338efb2365f385b15d713cd3912086b5f data/twilightforest/advancements/recipes/transportation/dark_chest_boat.json +7321d7c677049254b93488b50ea3b192b64a750d data/twilightforest/advancements/recipes/transportation/mangrove_boat.json +f4ef02be8a22837c926f8cafde165acd1b3fcd50 data/twilightforest/advancements/recipes/transportation/mangrove_chest_boat.json +fa87a4f4d95dd6e0de4e3fdd9f19205faba35114 data/twilightforest/advancements/recipes/transportation/mining_boat.json +61a9521aaf402c6c89e6e3e09c806212baa5842a data/twilightforest/advancements/recipes/transportation/mining_chest_boat.json +7e8ae3e2d2807c390a4733aa53435f1a47eb5e08 data/twilightforest/advancements/recipes/transportation/sorting_boat.json +c9e74ac43b1b6b6e2c2c00a008e684ed36a68df9 data/twilightforest/advancements/recipes/transportation/sorting_chest_boat.json +7f9cf3b628e7377575f0a436929ae80deed81754 data/twilightforest/advancements/recipes/transportation/time_boat.json +affdce2a276839c8e6d8aca896858e0c52199623 data/twilightforest/advancements/recipes/transportation/time_chest_boat.json +4cddbc2d667b0ae51df7984831c926812e5c11fd data/twilightforest/advancements/recipes/transportation/transformation_boat.json +9845bcb82bf981a8abcb6b6a5743620397dcbec5 data/twilightforest/advancements/recipes/transportation/transformation_chest_boat.json +7c3c7de4ddb79cef2e6fbd73e00d46c8b6dd2c64 data/twilightforest/advancements/recipes/transportation/twilight_oak_boat.json +842debbb1da23e4aa4a084b303838e62a83585d4 data/twilightforest/advancements/recipes/transportation/twilight_oak_chest_boat.json +09f2bd910673a89e1acad7511336eb1a2790aaf4 data/twilightforest/recipes/alpha_yeti_banner_pattern.json +6cd9cc1a7a1e0eb1ef5db7caa0a498c95470d952 data/twilightforest/recipes/aurora_pillar.json +acfef956c24a0fec0124c016df011e91f0fde32b data/twilightforest/recipes/berry_torch.json +0402961987705d5ae4bcd1f95b9874f7d286468f data/twilightforest/recipes/canopy_boat.json +8fa8fe72684d558cd3b3e07ef0947f18e2add07a data/twilightforest/recipes/canopy_bookshelf.json +dcbd1f400a24291a728f60272cc9a23896781b21 data/twilightforest/recipes/canopy_chest_boat.json +7a1310acd398587a3db7a70798288c9fd9b29ceb data/twilightforest/recipes/carminite_builder.json +0a710c485a200634eb7d2f5b823af867c13c41d3 data/twilightforest/recipes/carminite_reactor.json +f125cb8ab34a1a9421e329c448c53a9b66df40f6 data/twilightforest/recipes/castleblock/bold_castle_brick_pillar.json +f81a9a7a6fbbf8015eb28f461be6269b8a123663 data/twilightforest/recipes/castleblock/bold_castle_brick_stairs.json +a7880a56369b070a5808d1a1ac3e58f69aa982b0 data/twilightforest/recipes/castleblock/bold_castle_brick_tile.json +010bab8586d4878ac16e0f744499f502e0382a63 data/twilightforest/recipes/castleblock/bold_castle_pillar_from_tile.json +039aeb7a8f014faf0c1283517e0b206ef921830c data/twilightforest/recipes/castleblock/castle_brick_stairs.json +a434849bb50d66574947e198020df4ec852bbe1e data/twilightforest/recipes/castleblock/cracked_castle_brick_stairs.json +0bf33c07af090ca1839a55e393675a6b0c23b54d data/twilightforest/recipes/castleblock/encased_castle_brick_stairs.json +5fe0d6e66dd9ab0ed59098cb24dfab81178dd0b0 data/twilightforest/recipes/castleblock/encased_castle_pillar.json +29652df73719f80c51c340c9686ec170aa603093 data/twilightforest/recipes/castleblock/mossy_castle_brick.json +d7ca313e4acbcb4c58fea3e842f32847b2fe1f53 data/twilightforest/recipes/castleblock/mossy_castle_brick_stairs.json +ddea91484f2a98d249cf80cc9866b8432ee8c19b data/twilightforest/recipes/castleblock/smelted_cracked_castle_brick.json +01659f552d6ae78f027ad99919b6273015240433 data/twilightforest/recipes/castleblock/thick_castle_brick.json +f663c4d900ad961a2c30daa7685f7c5b84cd9f2b data/twilightforest/recipes/castleblock/worn_castle_brick_stairs.json +08b13792620dc214fb48775ec10ab544e0243345 data/twilightforest/recipes/charm_of_keeping_2.json +83ac46131ac4b5f552bc3ad97933032f88d2d66f data/twilightforest/recipes/charm_of_keeping_3.json +53ac2e1ba67f41b1f6c1cd22f637077f8cecb29e data/twilightforest/recipes/charm_of_life_2.json +d07bf3df8af70a798bce1bf7d12477cc12121b43 data/twilightforest/recipes/cicada_jar.json +bff7abc0ee978511c8e924ae9fa662e7fad58a8f data/twilightforest/recipes/compressed_blocks/arctic_block.json +8f6f57498c26f8979f2284a8babd180485db3804 data/twilightforest/recipes/compressed_blocks/carminite_block.json +950e4e930f053476f58fab2fe4136c5adafb0e49 data/twilightforest/recipes/compressed_blocks/fiery_block.json +f52ba0d157bd482b25a47451ae30c9d9fe5323c4 data/twilightforest/recipes/compressed_blocks/ironwood_block.json +66127a2b4c4380e504f2a8a2512ad8f332f31d1a data/twilightforest/recipes/compressed_blocks/knightmetal_block.json +4d3cab999a9fc122fd9f56ea3c22197da295f325 data/twilightforest/recipes/compressed_blocks/reversed/arctic_block_to_item.json +9e3d5a726277b7e23b7f66569fc5799328f01630 data/twilightforest/recipes/compressed_blocks/reversed/carminite_block_to_item.json +29cfec9d3f2ccd86b552008b3e8fb25ac0947701 data/twilightforest/recipes/compressed_blocks/reversed/fiery_block_to_ingot.json +37db668b14f3ee6b87070d10db579a19b717b49a data/twilightforest/recipes/compressed_blocks/reversed/ironwood_block_ingot.json +c6e5c711988766ac3164eb386d4aabff84375be9 data/twilightforest/recipes/compressed_blocks/reversed/knightmetal_block_ingot.json +f011cda34e1fb63583f40b4a05615149b56e0eda data/twilightforest/recipes/compressed_blocks/reversed/steeleaf_block_ingot.json +bbe0d8091909e8b02455035b98bc14b49479a447 data/twilightforest/recipes/compressed_blocks/steeleaf_block.json +18251490fe6363ba779d723b4a8d7477ab0330ab data/twilightforest/recipes/dark_boat.json +9647808a14c3b9b696f3dc0e4efd4e0943f66288 data/twilightforest/recipes/dark_chest_boat.json +f89adac54ea3e4d4bdb1c833e70acc8dc18bdbb0 data/twilightforest/recipes/empty_canopy_bookshelf.json +5fdc4a94a13356ffdaa865cd4f1346b5e92e9f1e data/twilightforest/recipes/encased_fire_jet.json +1ef9f54f03b9d14394f54e9689cbe37e5729a336 data/twilightforest/recipes/encased_smoker.json +c9b9b1567303e383fa20da002513856ed1e32d27 data/twilightforest/recipes/equipment/arctic_boots.json +0bf4439c33bab7142fe12a0f7a2e69a7193e5393 data/twilightforest/recipes/equipment/arctic_chestplate.json +273ea8b630474cc0e1697b6bd899dd8e383223f7 data/twilightforest/recipes/equipment/arctic_helmet.json +8cfb39ef86ba9f24764dded9fc116748a39ca014 data/twilightforest/recipes/equipment/arctic_leggings.json +c05dcd65c7329ab9ede10c49c6789cffac7b69fc data/twilightforest/recipes/equipment/block_and_chain.json +f2eb54395dac327d393c596f4275ed1a91488a53 data/twilightforest/recipes/equipment/fiery_boots.json +f0e729703a809df1e7d86eddc98576d912c8cb72 data/twilightforest/recipes/equipment/fiery_chestplate.json +b0a0f5681d7b017558ece169868be20d1d066e2a data/twilightforest/recipes/equipment/fiery_fiery_boots.json +0c362bf3fc65a8fe9f37a73ca45fdc669f026a7f data/twilightforest/recipes/equipment/fiery_fiery_chestplate.json +37f0551b8033d82c594d546fe523edde588ea42a data/twilightforest/recipes/equipment/fiery_fiery_helmet.json +001f37b37fba7861f0207d832cdc7b2ae3ede731 data/twilightforest/recipes/equipment/fiery_fiery_leggings.json +187cd4143ca678ae1c88b991d0dd936b983aa969 data/twilightforest/recipes/equipment/fiery_helmet.json +e4d7138cd69266724dd1618e8b2a49c66aaba99b data/twilightforest/recipes/equipment/fiery_ingot_crafting.json +074551d60c25f4a08581a2b2cad2cc2a7b18ceb5 data/twilightforest/recipes/equipment/fiery_iron_pickaxe.json +4705214ff944ff073f579cd85c675a7523f4ca95 data/twilightforest/recipes/equipment/fiery_iron_sword.json +6ecf42789915479785dc36185efa723249edb971 data/twilightforest/recipes/equipment/fiery_leggings.json +585621c78fde978c6918121d9c9bf4c90e7b4879 data/twilightforest/recipes/equipment/fiery_pickaxe.json +a0877e0aaa58a63851bbcede3a674d942ee03e92 data/twilightforest/recipes/equipment/fiery_sword.json +654e9878b6d0b3d07212fd3d28c0976df0111415 data/twilightforest/recipes/equipment/fortification_scepter.json +1465da5ca54802a647f35ba1485b23a27c2504a7 data/twilightforest/recipes/equipment/giant_pickaxe.json +1b9d88ce471a7511ebf4085f1dcb7766226cc7db data/twilightforest/recipes/equipment/giant_sword.json +514374be982cbcb4b51e81072992631b45097815 data/twilightforest/recipes/equipment/knightmetal_axe.json +4c9cd5151b6d57013fa3b9e206b4a019d9229659 data/twilightforest/recipes/equipment/knightmetal_boots.json +bb24f1b5b3c2c04be70cf361a4dc6b83e5a0a37e data/twilightforest/recipes/equipment/knightmetal_chestplate.json +c9447ca211acc826882def1763096aeceb441681 data/twilightforest/recipes/equipment/knightmetal_helmet.json +249434ab2da68e32d223d559906d6959649d0b9d data/twilightforest/recipes/equipment/knightmetal_leggings.json +7d4a1aaab3d54cec52aa8bc136e0f6a893953e76 data/twilightforest/recipes/equipment/knightmetal_pickaxe.json +68b4d9a334a16bb922657d1c93837ca88cd1f7c7 data/twilightforest/recipes/equipment/knightmetal_ring.json +277cfecfb59731abcf9c4722bc02b219f661ffe1 data/twilightforest/recipes/equipment/knightmetal_shield.json +422f2e059a3742c41b9ffba19710e28ba12f105b data/twilightforest/recipes/equipment/knightmetal_sword.json +482aa908dfde80ffcf284c5d43eeb3f954689c2b data/twilightforest/recipes/equipment/lifedrain_scepter.json +43c65d2a95b34828d960220b226b53796572de6d data/twilightforest/recipes/equipment/twilight_scepter.json +a4a3b05311d5b94a92aff8d0fc5c1a2073913562 data/twilightforest/recipes/equipment/zombie_scepter.json +4f5e7b531c92516b270229dd6872220c164b24a3 data/twilightforest/recipes/firefly_jar.json +61630cfab251b1e037e048636ade22f6e74ada7c data/twilightforest/recipes/firefly_particle_spawner.json +9472a04efe3e5a4df2855a815702dc27b2c6e513 data/twilightforest/recipes/food/campfired_meef.json +aaf8cdbca06d4e51f57fbde333c670e2b9f2f28f data/twilightforest/recipes/food/campfired_venison.json +6a22a4dd9c4899241822c228e44786b5a86b0161 data/twilightforest/recipes/food/smelted_meef.json +e1a65de3e4dedf15819c795be50a197fc7a12595 data/twilightforest/recipes/food/smelted_venison.json +3a3e1fcd3ae0b74911b2784386b53ce838d97ae0 data/twilightforest/recipes/food/smoked_meef.json +4dd6e17471376a8d409c289451597830a44507eb data/twilightforest/recipes/food/smoked_venison.json +8e6786f9d3e26ec73cda228d2ae6f262f2cc8598 data/twilightforest/recipes/giant_cobblestone_to_cobblestone.json +8a4e6443d1b91e76bf8f63274d717ac29d8b99ce data/twilightforest/recipes/giant_leaves_to_oak_leaves.json +528673de1a9c1dfc4e635108acbb3668d08f14fd data/twilightforest/recipes/giant_log_to_oak_planks.json +61e9745f538acab28df64b593480433875ad871a data/twilightforest/recipes/hydra_banner_pattern.json +1d2a964a57f7664c10abcb1f0f2328cd8ad7d3b0 data/twilightforest/recipes/iron_ladder.json +26066fb8088010b7b9b78875ab73f866095853a3 data/twilightforest/recipes/knight_phantom_banner_pattern.json +3181e0822e3d61dadb1d4edecd7e48510643740c data/twilightforest/recipes/lich_banner_pattern.json +cd4324b386c488e68aadaf8f290ff5bab33f67c6 data/twilightforest/recipes/magic_map.json +ee87bbfacdcba0dc0556a64d5b235cf30a1bdb1d data/twilightforest/recipes/magic_map_cloning_recipe.json +69d2c93326de6cccddce3e6ced7dc63bd058e721 data/twilightforest/recipes/magic_map_focus.json +2a5d4ea627e8ab94d2a5ee5b55f373cdc88f5505 data/twilightforest/recipes/mangrove_boat.json +a88aa9b9f314fdb92fef050405d3a5e34f684d4e data/twilightforest/recipes/mangrove_chest_boat.json +3c29222124ee6ce42f3c332f3031c61be10a3d78 data/twilightforest/recipes/material/armor_shard_cluster.json +7aa22d95f1b16350bd017c4e54a8608ac9f7ca27 data/twilightforest/recipes/material/blasted_ironwood_ingot.json +c5e944ef8d8715a0e6a495e8a83875b33471279a data/twilightforest/recipes/material/blasted_knightmetal_ingot.json +b357967807bdaa2eb13b0a0a061962eb2f868928 data/twilightforest/recipes/material/carminite.json +8f590059d3ee374c78f2ef4c48470d514e3209de data/twilightforest/recipes/material/raw_ironwood.json +0824edf50416c0b773b3a8dd65ac962d85cc7362 data/twilightforest/recipes/material/smelted_ironwood_ingot.json +d65812dc8ac0ad19e82253499520d7458b6db20a data/twilightforest/recipes/material/smelted_knightmetal_ingot.json +b20e18013c4614bbc1c48b80ee09d9f1cd5f519e data/twilightforest/recipes/maze_map.json +a5c9d4901758df641cbd9b646298e3246f6ef77d data/twilightforest/recipes/maze_map_cloning_recipe.json +5380d99c39e967f77c0b0d7709a67a6cba25f346 data/twilightforest/recipes/maze_stone/mossy_mazestone.json +44fee9c5571b75e7e6c68ab47b8c2d0c07551bd9 data/twilightforest/recipes/maze_stone/smelted_maze_stone_cracked.json +2e0e391d60da0254f25ae3e00d4756ae16f996b7 data/twilightforest/recipes/mining_boat.json +938c5f401a1f211772882f46599c52f050ada245 data/twilightforest/recipes/mining_chest_boat.json +e166dffb72f8163e50240a275dc36a4c6d798972 data/twilightforest/recipes/minoshroom_banner_pattern.json +24e0885053bb5389bf69bed02a45cc598c0b4a8b data/twilightforest/recipes/moonworm_queen_repair_recipe.json +da749bec267115373d892fcaaa70d17515864001 data/twilightforest/recipes/mossy_underbrick.json +13fd2c26a3663961c3075da5bbc50103145b7569 data/twilightforest/recipes/nagastone/cracked_nagastone_stairs_left.json +238ca4b18a3111dcc9325f5a180111694e1a95d3 data/twilightforest/recipes/nagastone/cracked_nagastone_stairs_right.json +52f65e47db0623262665c74464064cebe00b92cc data/twilightforest/recipes/nagastone/mossy_etched_nagastone.json +f7055f019c9c2fca9d6185340e5ed85ae4679a11 data/twilightforest/recipes/nagastone/mossy_nagastone_pillar.json +1bdc5924141404091a862f752c0a56872b21d9af data/twilightforest/recipes/nagastone/mossy_nagastone_stairs_left.json +81fce3915795436724530c72b7d9a6ea1eebf548 data/twilightforest/recipes/nagastone/mossy_nagastone_stairs_right.json +608ffd686a64b0ad01468a92859517e0921eda1e data/twilightforest/recipes/nagastone/nagastone_spiral.json +f899c9a8b0be5f90ccba0aded035970195862700 data/twilightforest/recipes/nagastone/nagastone_stairs_left.json +5044e1b2a213b41edfe9b1e958191b09a6d32d56 data/twilightforest/recipes/nagastone/nagastone_stairs_right.json +5ecf9ec1a7cb03409eea3f6ef4469c00a1caf3a4 data/twilightforest/recipes/nagastone/smelted_cracked_etched_nagastone.json +ba45d1c4612c069c8979f418ff799ec7e919d9ea data/twilightforest/recipes/nagastone/smelted_cracked_nagastone_pillar.json +18ea9b2bb8fef11feae4a610169809c70897b7ee data/twilightforest/recipes/naga_banner_pattern.json +85c2df5a995dc7f51a05ab0f3be53e72ad0ffbd4 data/twilightforest/recipes/ore_map.json +fefc4685cd167913a7cac17bfbcb391a1340c721 data/twilightforest/recipes/quest_ram_banner_pattern.json +04bd436b60e6343c1844f52ba5cf411daa5eddb5 data/twilightforest/recipes/reappearing_block.json +350deef403e4e91694278cef31f4a19e009ac0e3 data/twilightforest/recipes/root_stick.json +552f542a19173fd1073db90c2691c0ea4ebc0c97 data/twilightforest/recipes/smelted_cracked_underbrick.json +5608b8720bdd408aeb773f3a55dbb854923374fe data/twilightforest/recipes/snow_queen_banner_pattern.json +7d6f5fc72d23846b37c81f2a449270325b2fcba2 data/twilightforest/recipes/sorting_boat.json +13db395d18c2f139063159d2fb4c28c622a36464 data/twilightforest/recipes/sorting_chest_boat.json +dc19687d5d325698e981ce2fc33854be011f3d0b data/twilightforest/recipes/stonecutting/acacia_log/hollow_acacia_log.json +da54098517f6a1e8fb16bd7ae15a29720ed4bd24 data/twilightforest/recipes/stonecutting/birch_log/hollow_birch_log.json +f4769b3bc12b6c003159e518115d560b35484fab data/twilightforest/recipes/stonecutting/bold_castle_brick_pillar/bold_castle_brick_stairs.json +bcdf02fc2f4234430841023e778a3462b8c1cf31 data/twilightforest/recipes/stonecutting/bold_castle_brick_pillar/bold_castle_brick_tile.json +53e3e00b3af28181b6f38b22e28ba8734b849f39 data/twilightforest/recipes/stonecutting/canopy_log/hollow_canopy_log.json +49db632ebbd58b0d74ad6b3e011e47c458ab96b9 data/twilightforest/recipes/stonecutting/castle_brick/castle_brick_stairs.json +f8aaa8c268aa8300cff637e35c094b360c93f90e data/twilightforest/recipes/stonecutting/castle_brick/thick_castle_brick.json +95ab8b58a295dc7c48e3e9b0b21d6f84c1b3d83a data/twilightforest/recipes/stonecutting/castle_brick/worn_castle_brick.json +d9fc6d68d0e5a5a20b0e748c5b24245d41b0c3d6 data/twilightforest/recipes/stonecutting/cracked_castle_brick/cracked_castle_brick_stairs.json +937d9705e3870d80cc5d5c5bf9ad3250cc18dc2f data/twilightforest/recipes/stonecutting/cracked_castle_brick/thick_castle_brick.json +4f0c6610e1445c71b4b128b72148fbd2a264cbbd data/twilightforest/recipes/stonecutting/cracked_etched_nagastone/cracked_nagastone_stairs_left.json +54b5a187f702930db7890c7c2707dea7f7dd9c52 data/twilightforest/recipes/stonecutting/cracked_etched_nagastone/cracked_nagastone_stairs_right.json +c03ebbaf678268efc9e1365b636209f68080f135 data/twilightforest/recipes/stonecutting/cracked_nagastone_stairs_left/cracked_nagastone_stairs_right.json +70510efd34fc9dbcbcc30df38d93f214185749fd data/twilightforest/recipes/stonecutting/cracked_nagastone_stairs_right/cracked_nagastone_stairs_left.json +480318a66dab655ae5352a4cd495e070ec43b2e2 data/twilightforest/recipes/stonecutting/crimson_stem/hollow_crimson_stem.json +f37afc7efc9458a4e9d6bfc444553970f9799343 data/twilightforest/recipes/stonecutting/cut_mazestone/decorative_mazestone.json +91b832197a83c055c5b10d78443918ba9a37ab56 data/twilightforest/recipes/stonecutting/cut_mazestone/mazestone_border.json +cb9ed0c350c621c90e3bfa3ee8a90442c4f75d82 data/twilightforest/recipes/stonecutting/cut_mazestone/mazestone_brick.json +c9504c5f6c678738f7483e9964b78994e5c98f4f data/twilightforest/recipes/stonecutting/cut_mazestone/mazestone_mosaic.json +4846970e5f7d3d43f4aee21c99f349bcc19e96a6 data/twilightforest/recipes/stonecutting/dark_log/hollow_dark_log.json +49a10fcd81d7f3838d0ddc4f7b254b874b94875b data/twilightforest/recipes/stonecutting/dark_log/towerwood.json +e83ade6d48303995bd096c3a6b90a33556aa5bc3 data/twilightforest/recipes/stonecutting/dark_oak_log/hollow_dark_oak_log.json +be32cfd54740ad426f813008d77fc7c976149436 data/twilightforest/recipes/stonecutting/dark_wood/towerwood.json +b107c8afa18a1b6d3ca29f1b0ad85808bd9f0d72 data/twilightforest/recipes/stonecutting/decorative_mazestone/cut_mazestone.json +19750141f1813db3072cd88c268e3bd435ba559d data/twilightforest/recipes/stonecutting/decorative_mazestone/mazestone_border.json +20ed134a56c2f0fcda2823cbf925803a700b2159 data/twilightforest/recipes/stonecutting/decorative_mazestone/mazestone_brick.json +93d3002289eb5028be67a345f532bb3a62046dd0 data/twilightforest/recipes/stonecutting/decorative_mazestone/mazestone_mosaic.json +23f3f151279cffea9999d667eadbba70fce86976 data/twilightforest/recipes/stonecutting/encased_castle_brick_pillar/encased_castle_brick_stairs.json +042de3f07664a499d7b905c7b9afd8d278402675 data/twilightforest/recipes/stonecutting/encased_castle_brick_pillar/encased_castle_brick_tile.json +71c0456cace6938c3e35fa80130f8d800e44505b data/twilightforest/recipes/stonecutting/etched_nagastone/nagastone_stairs_left.json +d289a6df2bcff463b4fd69efc47164b7713b2255 data/twilightforest/recipes/stonecutting/etched_nagastone/nagastone_stairs_right.json +8df4cd88d44e8c2b03ea2d406eeef9ac3852622a data/twilightforest/recipes/stonecutting/jungle_log/hollow_jungle_log.json +9d94e38d432ec161985ec2cc6bb8fa306ca2b987 data/twilightforest/recipes/stonecutting/mangrove_log/hollow_mangrove_log.json +b6c054e4172265a2074c7882f5f3ee36c93e799a data/twilightforest/recipes/stonecutting/mangrove_log/hollow_vangrove_log.json +d9aa1915f011c70ad5df53f7f011a3c947ec9e51 data/twilightforest/recipes/stonecutting/mazestone/cut_mazestone.json +879b3d3160c67fc1c1105a585fa53e00e1208e88 data/twilightforest/recipes/stonecutting/mazestone/decorative_mazestone.json +73a2b409161dec04bf3735881a58e93219f8b81c data/twilightforest/recipes/stonecutting/mazestone/mazestone_border.json +6042e3d4165a27b236516f7c5dd4f5ba79193ac4 data/twilightforest/recipes/stonecutting/mazestone/mazestone_brick.json +979b4b45d99fc21018bded93500eddff4c3f3387 data/twilightforest/recipes/stonecutting/mazestone/mazestone_mosaic.json +3e6c5fd99379402e432be568975fc50aca53d36c data/twilightforest/recipes/stonecutting/mazestone_border/cut_mazestone.json +546064ffbf0889b3b62d0e34108504a3e8f7d250 data/twilightforest/recipes/stonecutting/mazestone_border/decorative_mazestone.json +9a767694c59bec3ae9ad5a19a3eeb4ce3f419ab3 data/twilightforest/recipes/stonecutting/mazestone_border/mazestone_brick.json +2f090baf805f5d2e5b2122f1b5b7a511feeca4ee data/twilightforest/recipes/stonecutting/mazestone_border/mazestone_mosaic.json +a6df75d3745f8800838584e21e89e7345ed721c2 data/twilightforest/recipes/stonecutting/mazestone_brick/cut_mazestone.json +e181132043ac13c3a3f0f082ea5f2113745237a5 data/twilightforest/recipes/stonecutting/mazestone_brick/decorative_mazestone.json +427164532fdebf72d53da1e2605d85e255af4399 data/twilightforest/recipes/stonecutting/mazestone_brick/mazestone_border.json +eb09cdfb7eac13035a3251dc632060ebd1e92932 data/twilightforest/recipes/stonecutting/mazestone_brick/mazestone_mosaic.json +63f8fc376fdcfd77f9824a4d2e25f0204ca1f2ce data/twilightforest/recipes/stonecutting/mazestone_mosaic/cut_mazestone.json +96a96d830119a18278d50284badf8de7d30ab402 data/twilightforest/recipes/stonecutting/mazestone_mosaic/decorative_mazestone.json +8fc4926fed313e08fbe92f049d1ae448c80f3f78 data/twilightforest/recipes/stonecutting/mazestone_mosaic/mazestone_border.json +7abdcfba005470fe4c32d2144aeab19392e8839d data/twilightforest/recipes/stonecutting/mazestone_mosaic/mazestone_brick.json +adf84fae038a129aa3ed740325fb661b85e0bffb data/twilightforest/recipes/stonecutting/mining_log/hollow_mining_log.json +1bf5a5f4ec8bb9e5873ffcd8f7f8b43b37757810 data/twilightforest/recipes/stonecutting/mossy_castle_brick/mossy_castle_brick_stairs.json +c506464427edb3ea8fc000accd0fc9dc9e91abb0 data/twilightforest/recipes/stonecutting/mossy_castle_brick/thick_castle_brick.json +e7a9c360b2335a7082a51b013990935380b76b21 data/twilightforest/recipes/stonecutting/mossy_etched_nagastone/mossy_nagastone_stairs_left.json +9f9c5512ade5fe60ccb39733af8346ceedd5d818 data/twilightforest/recipes/stonecutting/mossy_etched_nagastone/mossy_nagastone_stairs_right.json +baced714b54ae72b276e8f2999ba30e943ae1aba data/twilightforest/recipes/stonecutting/mossy_nagastone_stairs_left/mossy_nagastone_stairs_right.json +fb9c9d3a7ad6344d377d3fe6228df47f91d05f50 data/twilightforest/recipes/stonecutting/mossy_nagastone_stairs_right/mossy_nagastone_stairs_left.json +cfe105db17fc29d038505a8cab3969956803d29e data/twilightforest/recipes/stonecutting/nagastone_stairs_left/nagastone_stairs_right.json +e73c309eee80708f5951cf617325c55fc1aa34a2 data/twilightforest/recipes/stonecutting/nagastone_stairs_right/nagastone_stairs_left.json +54ca198099fbaf934368d20be9dd398dbe1fafda data/twilightforest/recipes/stonecutting/oak_log/hollow_oak_log.json +dd731c6fb8cba4c7321abc60f291a2f2d30f227c data/twilightforest/recipes/stonecutting/sorting_log/hollow_sorting_log.json +d1737eedfd7cf0a8c60b12905b89d4d9f452f19d data/twilightforest/recipes/stonecutting/spruce_log/hollow_spruce_log.json +95bb19b2153d9236c4fd6c3c8583474b137c04e6 data/twilightforest/recipes/stonecutting/stone/bold_stone_pillar.json +d705d28a93af8c64ab5b3a692c09bee30c348de2 data/twilightforest/recipes/stonecutting/stone/twisted_stone.json +8ef694d81dc77cb9ec34cfddb485c841d7077393 data/twilightforest/recipes/stonecutting/thick_castle_brick/bold_castle_brick_pillar.json +c627938d05060b3374bee83ac47e70401eb90ee0 data/twilightforest/recipes/stonecutting/time_log/hollow_time_log.json +ead4a09b820e0d831554a0d4ac82cc6a1eb1947e data/twilightforest/recipes/stonecutting/towerwood/encased_towerwood.json +2a47aed21fe8cc988f0ec7dbdae1870db5f974fd data/twilightforest/recipes/stonecutting/transformation_log/hollow_transformation_log.json +35f815b8b2527601abf6386aa72a547abb392a00 data/twilightforest/recipes/stonecutting/twilight_oak_log/hollow_twilight_oak_log.json +11fb981fbaf3e6f2c8fc9736bfca8e78a9554781 data/twilightforest/recipes/stonecutting/underbrick/underbrick_floor.json +2ccf757af4c1d78253a0e30224d81810c571a4cb data/twilightforest/recipes/stonecutting/warped_stem/hollow_warped_stem.json +ef79ce8c0764bc6c8ccaa16d61487d2aa3faa955 data/twilightforest/recipes/stonecutting/worn_castle_brick/thick_castle_brick.json +93e549a920825900273ccfe8eb2eaa51467afa4f data/twilightforest/recipes/stonecutting/worn_castle_brick/worn_castle_brick_stairs.json +43809ab37b711c81d301807232f80fd5cbf55c68 data/twilightforest/recipes/tf_moss_to_vanilla.json +6962a21528c527d9aad7930390b72ca47fc1639d data/twilightforest/recipes/tf_to_vanilla_lilypad.json +2ab757b637ff7c15a0fadb1fbd03edca4708b2cc data/twilightforest/recipes/thorn_rose_to_red.json +d0100d7673177326564c7264d39cdb1fbfec1b78 data/twilightforest/recipes/time_boat.json +0bd43469c1787d0355374f09b5dde27e45960a13 data/twilightforest/recipes/time_chest_boat.json +6a8fdbefac6e4541886fb70e1ce73b3b424929e4 data/twilightforest/recipes/transformation_boat.json +2ac849d1523b2aff0adc636eb5060477373a9dc2 data/twilightforest/recipes/transformation_chest_boat.json +d2df57e26c7e64f0d6c3c06fb1de3c27d7b45090 data/twilightforest/recipes/twilight_oak_boat.json +df8e51ef7b71a366ed52ad4554095630345979c6 data/twilightforest/recipes/twilight_oak_chest_boat.json +511bd4a8bab171e7aa3cc98cad2471f8fe83e9e6 data/twilightforest/recipes/uncrafting_table.json +116ebbe4b19a735dc164f293560f8cbf8bcc6e8b data/twilightforest/recipes/ur_ghast_banner_pattern.json +059e3e2dfd006404ce1ef022edce2539a821cf3b data/twilightforest/recipes/vanilla_to_tf_lilypad.json +3fa8d6fce3cf2f0080c500211324926bb435cbed data/twilightforest/recipes/vanilla_to_tf_moss.json +e5d62617c15d89ad80c6e5445c652cb0e39d58c9 data/twilightforest/recipes/vanishing_block.json +cd6f09fac8265ddab3a6ae432e9518cd7969453f data/twilightforest/recipes/waterlily_to_magenta.json +0a74e8e9a75737cc72d4a754f3c297c50479e252 data/twilightforest/recipes/wood/acacia_banister.json +6b723c8aa0189c5b4ba124d9966d051ad855423a data/twilightforest/recipes/wood/aurora_slab_slab.json +317f4bbaa12627a45884757a036d402c44c8ba2b data/twilightforest/recipes/wood/birch_banister.json +5aeae2980a49764372401cdf6545e11567b6024b data/twilightforest/recipes/wood/canopy_banister.json +ae87f92e25e308002b10a1445db459d01a6c56ca data/twilightforest/recipes/wood/canopy_button.json +a80501ddf8bbd907b355bde6dc93bbcc2874f2f7 data/twilightforest/recipes/wood/canopy_chest.json +a2ea4fd932971815b40672a76a359c40215e6967 data/twilightforest/recipes/wood/canopy_door.json +8e26246a8542f8cff99ed126989d51733df8db17 data/twilightforest/recipes/wood/canopy_fence.json +9084a7673eceeebbc85db19d8bf6f8da92c62c06 data/twilightforest/recipes/wood/canopy_from_stripped_planks.json +d79bb324bc1eab751015be37aee5975acae3732f data/twilightforest/recipes/wood/canopy_from_stripped_wood_planks.json +24d07f48158e24d84c77249e39fd19c17fa3df99 data/twilightforest/recipes/wood/canopy_from_wood_planks.json +94f53d983929cde2e5d46dc2a2a44e9ea29a6127 data/twilightforest/recipes/wood/canopy_gate.json +c4638549cded90e7444149d320d4935b85562dad data/twilightforest/recipes/wood/canopy_planks.json +5cebbd0194894981c54d9f090e8a901ea90b7c50 data/twilightforest/recipes/wood/canopy_plate.json +c63047d10d9f8d2e779251768a5d67d16dfe1246 data/twilightforest/recipes/wood/canopy_sign_wood.json +5da4d44f081f6134888de1d6f20e7772e534c67f data/twilightforest/recipes/wood/canopy_slab.json +e7d03536605ac2ac2899dd8e8ec4fba741b821cb data/twilightforest/recipes/wood/canopy_stairs.json +13bed402273ec0d8fe1ab97a106958566919ac5e data/twilightforest/recipes/wood/canopy_stripped_wood.json +cd317a3e0e52acfaf53fbb56ed3274efd4959468 data/twilightforest/recipes/wood/canopy_trapdoor.json +8d8e9246195ac41710d3441c8b04317e8bcac99c data/twilightforest/recipes/wood/canopy_wood.json +4a357d71cdfc7bcd48353769c564f9400b4b4817 data/twilightforest/recipes/wood/crimson_banister.json +e2d4ddf539ff9961550942e5b9c3b5b63f8d11b0 data/twilightforest/recipes/wood/darkwood_banister.json +1ce6a328c40246ee7d77e8b8bde6062fad20dec5 data/twilightforest/recipes/wood/darkwood_button.json +481f4b75d6225b31fde20acb8712d945e72f1902 data/twilightforest/recipes/wood/darkwood_chest.json +d9d481bf6a85250015ba89ad2ec0218d8dd60524 data/twilightforest/recipes/wood/darkwood_door.json +f12805f772dd5feb3374877ee824d2d89459fb4b data/twilightforest/recipes/wood/darkwood_fence.json +4c4e7dc70eaf8d2d9df4c60e5fa159ed3522f5b1 data/twilightforest/recipes/wood/darkwood_from_stripped_planks.json +bfe11ec1a0f07159ff0be15f5bbb7393cb7bb315 data/twilightforest/recipes/wood/darkwood_from_stripped_wood_planks.json +44ea165bd5e5ec30a4a48597777eba8a6b695fed data/twilightforest/recipes/wood/darkwood_from_wood_planks.json +2be28a9f1e6fdcb8478776b68c7fcedb222294a7 data/twilightforest/recipes/wood/darkwood_gate.json +cb501b010bf124b39d628d02ca88c5d168477bb2 data/twilightforest/recipes/wood/darkwood_planks.json +0b71274fa0b5ad3f06a0e785ac981c08f259026d data/twilightforest/recipes/wood/darkwood_plate.json +9ffc2a76c3ea1dfc72bddba6b73c7fc0b336b9d9 data/twilightforest/recipes/wood/darkwood_sign_wood.json +e6a4dde6271722853e0eaf9dce19dd2bbee83b20 data/twilightforest/recipes/wood/darkwood_slab.json +1d62c7f0f6cddcf50c00645f7ab3a9f226bb40d0 data/twilightforest/recipes/wood/darkwood_stairs.json +21b940df4d9eb18a4fee6720fb5273af90f79831 data/twilightforest/recipes/wood/darkwood_stripped_wood.json +e7e0de35d580be9486080c654de17c31c30a717c data/twilightforest/recipes/wood/darkwood_trapdoor.json +738e3bfa789e6e4d6f130dbc01ed37c1833493a5 data/twilightforest/recipes/wood/darkwood_wood.json +f19b34ad8d35f80a7999749016b0a256afd9242c data/twilightforest/recipes/wood/dark_oak_banister.json +be1b914bc01a732f7c6955d2646b52a8b815a395 data/twilightforest/recipes/wood/jungle_banister.json +ea99b14b14f99cc7184f25bc1cb3810b5cb8b537 data/twilightforest/recipes/wood/mangrove_banister.json +a1dc28ec6b4890c528e47313f3e255462fb93662 data/twilightforest/recipes/wood/mangrove_button.json +a6a54ccc1b3a8b3c889c3eb6afc8af2fd750753c data/twilightforest/recipes/wood/mangrove_chest.json +88e8edf931223c4ebec3f0658b3c7317d80669d3 data/twilightforest/recipes/wood/mangrove_door.json +891c69c55e5057c60cdf783fd12e1dfdd837bcca data/twilightforest/recipes/wood/mangrove_fence.json +69d852acf326b952412d80427d5de1b8423ff44a data/twilightforest/recipes/wood/mangrove_from_stripped_planks.json +e78e1c42bd6b0e99e0061a4195eb41358eaf4657 data/twilightforest/recipes/wood/mangrove_from_stripped_wood_planks.json +ca4610eba321b0d99866a28fc5357d4f88622511 data/twilightforest/recipes/wood/mangrove_from_wood_planks.json +f75a32a4b8fd7561877e05b4b113719cb06823b1 data/twilightforest/recipes/wood/mangrove_gate.json +82cd471efa5f881449a3b51ad9664be9d2dcc41a data/twilightforest/recipes/wood/mangrove_planks.json +7ca961487a1888c5f130038db15c533c48c96c57 data/twilightforest/recipes/wood/mangrove_plate.json +a3028079a948addb4fdb8823803b0539c9a4e44d data/twilightforest/recipes/wood/mangrove_sign_wood.json +69482c26a692fb26c3be15f4ea82453486aa048d data/twilightforest/recipes/wood/mangrove_slab.json +3d4e55a425bab82a72df85316173e4b0a133baad data/twilightforest/recipes/wood/mangrove_stairs.json +32b302608ffaad75e2a626777a98e72efea21338 data/twilightforest/recipes/wood/mangrove_stripped_wood.json +21c3bf4b8107453a45aa2bbe36f96775fed5a971 data/twilightforest/recipes/wood/mangrove_trapdoor.json +6080f059affed7b746ea62948916605a0e166a7d data/twilightforest/recipes/wood/mangrove_wood.json +03e79f7bd0c13e61cf86a570d969c877f55eeb8b data/twilightforest/recipes/wood/mining_banister.json +6693b0330df8cec50899d05774b093494aa1de62 data/twilightforest/recipes/wood/mining_button.json +55dc51e19afc8f782c853c7cfbe565dc051676e4 data/twilightforest/recipes/wood/mining_chest.json +c0280028f6a9fa4071939197f5a1fa0578dd9220 data/twilightforest/recipes/wood/mining_door.json +2964cf7cf905a88667b9baa5338999a1e793f0b7 data/twilightforest/recipes/wood/mining_fence.json +e5c31a7458ae4d2c462b35d0f4c5840f1b1a50d6 data/twilightforest/recipes/wood/mining_from_stripped_planks.json +5dbad1cd89df73f2e38ad865736e7664dc0d0009 data/twilightforest/recipes/wood/mining_from_stripped_wood_planks.json +12ee9400ff1aa6dd8991ec0cc71aec9497789392 data/twilightforest/recipes/wood/mining_from_wood_planks.json +4e7360e4ca98034fe76a17cd9b50919a3723a3d8 data/twilightforest/recipes/wood/mining_gate.json +cef2bebb9f7eacf04a3874809c673d2c7b93dd7a data/twilightforest/recipes/wood/mining_planks.json +9c7076c6c007e7e88a538bc9aaad784084eb3cea data/twilightforest/recipes/wood/mining_plate.json +a6ebfb3b17c4d167e759c30bc4328657496e179e data/twilightforest/recipes/wood/mining_sign_wood.json +25752ae52efa6ae537c9d7f6f2814fe3b3f74681 data/twilightforest/recipes/wood/mining_slab.json +5561b18ca4c67f478f0ebb950d6e12b550e6c019 data/twilightforest/recipes/wood/mining_stairs.json +2146ea1dc6b735914930417559b0edbaa71c6ff6 data/twilightforest/recipes/wood/mining_stripped_wood.json +0f66d3775f6c2910568f349647caba7a8ab7d71b data/twilightforest/recipes/wood/mining_trapdoor.json +55a8b6702145a05f432da61a8a929cdd4ced382d data/twilightforest/recipes/wood/mining_wood.json +965e6c4f31470613e9f0353be8b20262ecc29ca0 data/twilightforest/recipes/wood/mossy_towerwood.json +f36c0f7d2de0cb2a2d154faadb4e3948f2138a55 data/twilightforest/recipes/wood/oak_banister.json +69855fbb7858552e377e21a99d1917b010d09636 data/twilightforest/recipes/wood/smoked_cracked_towerwood.json +19afa0cd9fd6055213eb95faabd4a9885aaa9550 data/twilightforest/recipes/wood/sorting_banister.json +092197c6be534a1f52ff15c01b6e5151d485127a data/twilightforest/recipes/wood/sorting_button.json +ff5d7141bd23caa42b0d5a83c23ab4bea8f4106e data/twilightforest/recipes/wood/sorting_chest.json +7f252a1a7a5f0f3478b179a5c4e6b9436fee34ff data/twilightforest/recipes/wood/sorting_door.json +adf7a3e5622e0eb393b9a96218c7e93f4208c7c2 data/twilightforest/recipes/wood/sorting_fence.json +cf2f012d1f07ef786cf97b3de5061689d4f0e108 data/twilightforest/recipes/wood/sorting_from_stripped_planks.json +ef306fb178d027b81e0a8c7277dab9f225a803a2 data/twilightforest/recipes/wood/sorting_from_stripped_wood_planks.json +f1bff1983aa1b565f3f0cd7ab55b47d22a69db00 data/twilightforest/recipes/wood/sorting_from_wood_planks.json +b947aae1b44b93a0383c1b792b4b61c40768e3f8 data/twilightforest/recipes/wood/sorting_gate.json +5a76e1cb91415008a2066be6588cea839e25411a data/twilightforest/recipes/wood/sorting_planks.json +57d05867e1fc5e5aad0f30dc218e43963ba92655 data/twilightforest/recipes/wood/sorting_plate.json +ba4e4b49a789a009be42e2aaaec3dce76198b837 data/twilightforest/recipes/wood/sorting_sign_wood.json +9c1a9d4af682bc7b591f1ba2711b695d7d48e3c4 data/twilightforest/recipes/wood/sorting_slab.json +f7563deca97563aa167a15df76c747d4b73779e8 data/twilightforest/recipes/wood/sorting_stairs.json +1b97cf8d3a3858173d3bda70f3659f50605b8afe data/twilightforest/recipes/wood/sorting_stripped_wood.json +98be5d2683c2f974f335541916a33b855eab0454 data/twilightforest/recipes/wood/sorting_trapdoor.json +57ffaec7d300dbc7251aa7de2b980280ac875eb7 data/twilightforest/recipes/wood/sorting_wood.json +29595e6915177c66dd31c012daba1623e5447034 data/twilightforest/recipes/wood/spruce_banister.json +71b50eb7adecd93b5c1ee07dc4816393944b569f data/twilightforest/recipes/wood/time_banister.json +e0b4374f1c0cb8042461484846a441e9577dc62d data/twilightforest/recipes/wood/time_button.json +6fb7c4559c0554349192f9581778a45989d7b5e3 data/twilightforest/recipes/wood/time_chest.json +b63ac7c8988bddea1d1d6ec25ed10e048fb45017 data/twilightforest/recipes/wood/time_door.json +73f41548c01fe60cea2ee452b543dcb3df5ed361 data/twilightforest/recipes/wood/time_fence.json +11a123eb5f5537d7a359853f7ae684cbfe45cb6e data/twilightforest/recipes/wood/time_from_stripped_planks.json +942301657df362dcf74d31b0bc09243a0a509607 data/twilightforest/recipes/wood/time_from_stripped_wood_planks.json +3dd98182783485bd3f97903d0d936a6ba1d577ab data/twilightforest/recipes/wood/time_from_wood_planks.json +515c2cad8e9f22860fdbf896b3befc40eded3cd1 data/twilightforest/recipes/wood/time_gate.json +3350089e60b94671d661c2b0016368bcf0071dd5 data/twilightforest/recipes/wood/time_planks.json +e1c13b744a986d5fa5c31273e675e475a229a33b data/twilightforest/recipes/wood/time_plate.json +19668b88319cfef0942a56b8ac734079961cf408 data/twilightforest/recipes/wood/time_sign_wood.json +70c411f5c92e9b22bbd59ec6758886a5c6cb7d3d data/twilightforest/recipes/wood/time_slab.json +27cfbf0f5a1d2196d0702b087035e3220401313b data/twilightforest/recipes/wood/time_stairs.json +90384fbfd391aef7a4bb972b3c71c79f977d16ec data/twilightforest/recipes/wood/time_stripped_wood.json +1ab7bbc97270cdb89e2fd90e372db65a7921a670 data/twilightforest/recipes/wood/time_trapdoor.json +731f47d1f037ae225805868058fcd2d0cc9386f3 data/twilightforest/recipes/wood/time_wood.json +81d62e9a7f54244dd934744b6858099731c6a6e7 data/twilightforest/recipes/wood/transformation_banister.json +d8b26a055c5dd42da51d3aed87529ecdcaee8d83 data/twilightforest/recipes/wood/transformation_button.json +b92b38cb9694ce21e6b1a1ca5595951c4df469e9 data/twilightforest/recipes/wood/transformation_chest.json +e396ce9da23b38314f6d822ac8417546cf5c7df4 data/twilightforest/recipes/wood/transformation_door.json +18e4d601baa1e38e245c3103811f7bc00b9d00f1 data/twilightforest/recipes/wood/transformation_fence.json +f51135c0882eb9093b6463cc0ab52e51c53f00ca data/twilightforest/recipes/wood/transformation_from_stripped_planks.json +24e011b83703c708d7f55e23dcadbb513eae6241 data/twilightforest/recipes/wood/transformation_from_stripped_wood_planks.json +258e85eec05c417bd3480b8e80bb0a026c37ec25 data/twilightforest/recipes/wood/transformation_from_wood_planks.json +29aed9273f0dd5d1b093baf9545c32cc077183f8 data/twilightforest/recipes/wood/transformation_gate.json +d880f9d8461b669d647b095c89dd9f1fac97a500 data/twilightforest/recipes/wood/transformation_planks.json +4866dee976ae043412e7a273e9a6a2913495a822 data/twilightforest/recipes/wood/transformation_plate.json +6d5695e22759d8bdb50cee7aad8e1b62c7d7c5b1 data/twilightforest/recipes/wood/transformation_sign_wood.json +a208ebe3f2054faaa9f59969e95a293625fb3ea1 data/twilightforest/recipes/wood/transformation_slab.json +f8f2f892d68e44f37149ac302512315ef67c5e93 data/twilightforest/recipes/wood/transformation_stairs.json +87bb208eef25f522c14ab157fd888354662a8e87 data/twilightforest/recipes/wood/transformation_stripped_wood.json +c0172f45e0fcf1a99832f74843e358d14a059aee data/twilightforest/recipes/wood/transformation_trapdoor.json +a95324c8addf5d0c084b6d0b1e94ccd89152ce1f data/twilightforest/recipes/wood/transformation_wood.json +79688ccef8066423deacfd13c2f8cc355022d9d7 data/twilightforest/recipes/wood/twilight_oak_banister.json +5a82c4271a12e2a98a760e65c707518ff5e85ff4 data/twilightforest/recipes/wood/twilight_oak_button.json +395314b6dd95ada4730e22a7f409012fceca9566 data/twilightforest/recipes/wood/twilight_oak_chest.json +4b54351cde6b203f08f773f4c55fe10dadbff0db data/twilightforest/recipes/wood/twilight_oak_door.json +df3af485943c5876cf8902e662d997be29ad903f data/twilightforest/recipes/wood/twilight_oak_fence.json +67becbe6a602c4c4dc59e8edc2c09d353dabf904 data/twilightforest/recipes/wood/twilight_oak_from_stripped_planks.json +c56a6c33a4539faec1d69fcb0c2e854861e78624 data/twilightforest/recipes/wood/twilight_oak_from_stripped_wood_planks.json +e131073d8fe6748445c1807e5feef4e26f186c0d data/twilightforest/recipes/wood/twilight_oak_from_wood_planks.json +b852fc1d7a3d7c8a6da8f90e179a5ca26560dbfd data/twilightforest/recipes/wood/twilight_oak_gate.json +b0d5f2459121e9b2d14964e2fd601f859cd749e6 data/twilightforest/recipes/wood/twilight_oak_planks.json +8de93998775cda45848eb9b27c75da9b5191f159 data/twilightforest/recipes/wood/twilight_oak_plate.json +cbed4e03096e4471a43049c9a2168c707f436965 data/twilightforest/recipes/wood/twilight_oak_sign_wood.json +1fb5e4ca4c206e66e5339c6f5f561a6888ce8885 data/twilightforest/recipes/wood/twilight_oak_slab.json +ee0733c90899a7980800619e5b1cbc5620ec71ca data/twilightforest/recipes/wood/twilight_oak_stairs.json +bcb6f1d197ec380b10420c4e4b032e2556474109 data/twilightforest/recipes/wood/twilight_oak_stripped_wood.json +cc88682a697c41b85a4a39ef1fe82f5a0da15432 data/twilightforest/recipes/wood/twilight_oak_trapdoor.json +8088daa08da2aeec27e0629ec9d6aa10e939f2ad data/twilightforest/recipes/wood/twilight_oak_wood.json +9f33f0a16ff481b6f7be21709a16cff639027b1b data/twilightforest/recipes/wood/vangrove_banister.json +5cad8d7eb1db8afc984f0a866b0ccfca053b7a44 data/twilightforest/recipes/wood/warped_banister.json diff --git a/src/generated/resources/.cache/a3b661b9d1602c79ab58dae8db9f53b60de85edc b/src/generated/resources/.cache/a3b661b9d1602c79ab58dae8db9f53b60de85edc new file mode 100644 index 0000000000..3f93cdd8b2 --- /dev/null +++ b/src/generated/resources/.cache/a3b661b9d1602c79ab58dae8db9f53b60de85edc @@ -0,0 +1,84 @@ +// 1.19.4 2023-06-04T23:10:12.8555879 Twilight Forest Item Tags +4dced7c5c98b183e1d94bafa23126914eb919706 data/createaddition/tags/items/plants.json +932db6906454527b9d89f0655bd6071261e0ebd3 data/createaddition/tags/items/plant_foods.json +3fd61fbbfac1e6fc37d3e6300cb548fdf13b2688 data/curios/tags/items/charm.json +28506418ae14efe13cfbe34765fa39ba5d6e03e7 data/curios/tags/items/head.json +017a0eae9dcb1c009506ab7fb1bf5ed2867507aa data/forge/tags/items/armors/boots.json +03872ed5aa0d028cd3b99a2831294e3a644fe8cc data/forge/tags/items/armors/chestplates.json +026e98f4ffeff627fe9fe8cfc5cb65d8cb836366 data/forge/tags/items/armors/helmets.json +655cef31e84248dab842522100e9d348cc681c2d data/forge/tags/items/armors/leggings.json +3d56c0ea016f639fad4fae4272d928867251da04 data/forge/tags/items/chests/wooden.json +359528c25cb6b4d29dc01cbafbeb8f161c0dac0f data/forge/tags/items/feathers.json +879fc86d9d7face7697fbbb62565885740fc7f41 data/forge/tags/items/fences.json +879fc86d9d7face7697fbbb62565885740fc7f41 data/forge/tags/items/fences/wooden.json +211134157771c86a72a0c5a1985c2b05da55729b data/forge/tags/items/fence_gates.json +211134157771c86a72a0c5a1985c2b05da55729b data/forge/tags/items/fence_gates/wooden.json +7cd3b2411fa5446314de9b697ced80544311ae21 data/forge/tags/items/gems.json +59f0dea7ea969cac60bf1ef1576b47003387759e data/forge/tags/items/gems/carminite.json +2cde752e787c2b7f52cdf813f13bf14697aad5c0 data/forge/tags/items/heads.json +6134f84d115da289273e5d022184f4ecb976af76 data/forge/tags/items/ingots.json +c4ca6360cc73d65fd4a4a4c6cf7de2143124ccbf data/forge/tags/items/ingots/fiery.json +bed43612fb08f85dd3dc7dbc5a4a871f7440b9d7 data/forge/tags/items/ingots/ironwood.json +980eaf5c00d22d6f49e221d0c1effd89470aaee8 data/forge/tags/items/ingots/knightmetal.json +69966a0aa274f8bcccc17ecf8d9a4e446e7897eb data/forge/tags/items/ingots/steeleaf.json +886e5e1db1abef8583882d996f8600275f839c37 data/forge/tags/items/paper.json +d0a907bc0d88a34d6265d4b4f8a2848cf585b6bf data/forge/tags/items/raw_materials.json +2973f905270dbbc53a2d666941d72485a9e85946 data/forge/tags/items/raw_materials/ironwood.json +4148b1147e82840f7df067661493919bf23a189c data/forge/tags/items/raw_materials/knightmetal.json +865a3c15802955f17d8824a2936544182ef437e0 data/forge/tags/items/storage_blocks.json +894142a18566c008a63daa05efba2dde1ef6eb26 data/forge/tags/items/storage_blocks/arctic_fur.json +bb31db15f2b155aafc5bc956c01454bb27f14f72 data/forge/tags/items/storage_blocks/carminite.json +c15f20a0c7467da527d9bde3456b9eb9e6a86021 data/forge/tags/items/storage_blocks/fiery.json +b1bdb774a7cf90e5cfbf8d045a3ccca943b8e073 data/forge/tags/items/storage_blocks/ironwood.json +e1e1daa9f0fa727681cf4eb0a0a2cbde40e6708d data/forge/tags/items/storage_blocks/knightmetal.json +34bb5d122fd15f6d868a5ff3cfe8ac8eafc6e892 data/forge/tags/items/storage_blocks/steeleaf.json +2973abf7fe5598a763a9738ca24c06f80b1eb5b1 data/forge/tags/items/tools/bows.json +1b205b8add451aa431d3db9121828f233c2cbad2 data/forge/tags/items/tools/shields.json +bbc3c7d372a10410465d7fb27cb47b47e553f7c1 data/minecraft/tags/items/axes.json +932bd2980da6d582ac5ba3cb6d86e51597a713b4 data/minecraft/tags/items/boats.json +dc2f26c3fd06fccd7385a8d16527701a68efb05a data/minecraft/tags/items/chest_boats.json +387c3d6fc3d958d7d90aea6c542e7a1a46ed16d9 data/minecraft/tags/items/cluster_max_harvestables.json +e66649b3248e051912913e282cb83d3b5006cde0 data/minecraft/tags/items/freeze_immune_wearables.json +b696524eda9e607bebc1b307e19c2b1633b8b0b1 data/minecraft/tags/items/hoes.json +30b260e82242a2b548549ed7a4f89117c8d2c3c3 data/minecraft/tags/items/leaves.json +19bd74ce640c043c09053d7571fb7a9915d41417 data/minecraft/tags/items/logs.json +0af80d33dcbb7226a5afcb9d8a4c1a73a2c38c9d data/minecraft/tags/items/logs_that_burn.json +ad2bcf700afb5778088104db20e72dfd8488ee10 data/minecraft/tags/items/music_discs.json +387c3d6fc3d958d7d90aea6c542e7a1a46ed16d9 data/minecraft/tags/items/pickaxes.json +7a960588ed4fd6095224c2d48caf5b3df99dc587 data/minecraft/tags/items/piglin_loved.json +9358df5f5420b32a08f45ed7924867342cd14b47 data/minecraft/tags/items/planks.json +c1c4b1bbf5dca762f8c2dc1b6021bf08b541ac8f data/minecraft/tags/items/saplings.json +c962432d898202b279bf401da90ab10b601de742 data/minecraft/tags/items/shovels.json +0074c60e923669a4539ccbc5bd0c293f255ff5a5 data/minecraft/tags/items/signs.json +bb39f860aaf80d261eee2fc6cf18ee75a411d1c1 data/minecraft/tags/items/slabs.json +4304b5a72638ce0626ae45be178a5669cea32d38 data/minecraft/tags/items/small_flowers.json +60d2c0021214d67e32e5edc0ee008326caa52bf7 data/minecraft/tags/items/stairs.json +931bc115353e6c267d36d480a5891285fde13487 data/minecraft/tags/items/swords.json +f0813a14ba178a941ba37c4059a25e6b19f77091 data/minecraft/tags/items/wooden_buttons.json +3ff910b3376b5166da794689b1bf7569ad0b2e87 data/minecraft/tags/items/wooden_doors.json +879fc86d9d7face7697fbbb62565885740fc7f41 data/minecraft/tags/items/wooden_fences.json +1d347a5494b98a22c03317e180c51db859e4e309 data/minecraft/tags/items/wooden_pressure_plates.json +e4144fc27ee121d3f7d17a5fdff02e93e1d7f7d8 data/minecraft/tags/items/wooden_slabs.json +f3de4b0d6d2929c8fab124e75ff6269ca7642aa7 data/minecraft/tags/items/wooden_stairs.json +8522d5d06fec7c30601264eb04aebaa58886a948 data/minecraft/tags/items/wooden_trapdoors.json +da18183378ce02b94193b95eb3da20c71fd6d086 data/randomium/tags/items/blacklist.json +b365ad6615ef9b05f43067637b8c869c06150e9e data/twilightforest/tags/items/arctic_fur.json +03701e27c1ba9819ac4dc5865a2bd2ab3be6a7be data/twilightforest/tags/items/banned_uncraftables.json +db3a933719c405a3ec1c7ba068704346c2eb30a0 data/twilightforest/tags/items/banned_uncrafting_ingredients.json +84101198c6b6d645c6e155abb5349d33e7279300 data/twilightforest/tags/items/canopy_logs.json +97652f431059f64ffc5747f498cdcf278ddd0555 data/twilightforest/tags/items/darkwood_logs.json +b428c7e83405bbb26b44a4f5e0471b9c8d8b3721 data/twilightforest/tags/items/fiery_vial.json +a0f401c3c8c79c599a3c1ad8d6b92d06e9f38bb0 data/twilightforest/tags/items/kept_on_death.json +0bdc999a7f653eecbb3c513a0baf1b963a2587ab data/twilightforest/tags/items/kobold_pacification_breads.json +33bdeefc5a85e9afb7b260809bec0d2a615d1f0f data/twilightforest/tags/items/logs.json +089e4347e6320066de4cd4d08b3e04a9442f4090 data/twilightforest/tags/items/mangrove_logs.json +9a0837862b33f048722739e6314f5c471d56b2d6 data/twilightforest/tags/items/mining_logs.json +25c135245d5bd7956f68c82fce05fb61389767b4 data/twilightforest/tags/items/nyi.json +a38efefda0bff84df4844f584f966a588fcac9de data/twilightforest/tags/items/portal/activator.json +e40d95a628eb206ce0b4bac90782bccc789cf8dc data/twilightforest/tags/items/sortwood_logs.json +aa9ca0bf521d8c6b198f2c25e4d5528917308d9f data/twilightforest/tags/items/timewood_logs.json +6352667067c11a27cfc37713a8f8543507c1f18e data/twilightforest/tags/items/towerwood.json +548dfc9d7e2225c6f7d761216b3fafc120978f73 data/twilightforest/tags/items/transwood_logs.json +d94381f990d5908c2d71247b1b14946ef4a4ef3d data/twilightforest/tags/items/twilight_oak_logs.json +00307f9c52357fb388557306df3446b2f1fcef42 data/twilightforest/tags/items/uncrafting_ignores_cost.json +3421219660c684eee32fe81d8b6d0b6f764fd899 data/twilightforest/tags/items/wip.json diff --git a/src/generated/resources/.cache/a78dc9e1930fa0198dc2dbde57400f35b0ca28c2 b/src/generated/resources/.cache/a78dc9e1930fa0198dc2dbde57400f35b0ca28c2 new file mode 100644 index 0000000000..f2c514d15b --- /dev/null +++ b/src/generated/resources/.cache/a78dc9e1930fa0198dc2dbde57400f35b0ca28c2 @@ -0,0 +1,3 @@ +// 1.19.4 2023-05-01T20:06:24.3835096 Twilight Forest Block Entity Tags +d90144e4f0404eeddfa109a5d61bf452e626203a data/forge/tags/block_entity_type/immovable.json +d90144e4f0404eeddfa109a5d61bf452e626203a data/forge/tags/block_entity_type/relocation_not_supported.json diff --git a/src/generated/resources/.cache/a93be942ff9d97bf11ef3d32537a7e9a5d77a651 b/src/generated/resources/.cache/a93be942ff9d97bf11ef3d32537a7e9a5d77a651 new file mode 100644 index 0000000000..fa30fb5d4f --- /dev/null +++ b/src/generated/resources/.cache/a93be942ff9d97bf11ef3d32537a7e9a5d77a651 @@ -0,0 +1,17 @@ +// 1.19.4 2023-03-15T19:43:56.8972454 twilightforest Transformation Powder Transformations +655fa15c9a858fdc70b4ed9ee2b2ce7dd1e8f913 data/twilightforest/recipes/transformation_powder/bighorn_sheep_to_sheep.json +8b338f958fa1cd8756651151a7479bab434599fa data/twilightforest/recipes/transformation_powder/boar_to_pig.json +28070261a7546a2e466100b0bac20f5f108812b8 data/twilightforest/recipes/transformation_powder/carminite_ghastguard_to_ghast.json +2efd561cc264be4680c101bc278efa24905bda8f data/twilightforest/recipes/transformation_powder/deer_to_cow.json +7b98cc7fabd4b6421213c0596b1ac41408c1f0e2 data/twilightforest/recipes/transformation_powder/dwarf_rabbit_to_rabbit.json +354be92e6b5e89d7e87c26af3cf50df92051fdab data/twilightforest/recipes/transformation_powder/hedge_spider_to_spider.json +e3b44fa6a4c9d30403cadd8de803afe1e6547683 data/twilightforest/recipes/transformation_powder/hostile_wolf_to_wolf.json +94f000364267ff316367b2defce1a11a827af5dd data/twilightforest/recipes/transformation_powder/maze_slime_to_slime.json +795450df7e24677a9adecb07c8ddda7d0e9a27c5 data/twilightforest/recipes/transformation_powder/minotaur_to_zombified_piglin.json +9adf90714e483c65939dbcdfb484a86442e8e833 data/twilightforest/recipes/transformation_powder/penguin_to_chicken.json +8ed365e88bce0517c9ae6a3f6c916b6e0caa1ba3 data/twilightforest/recipes/transformation_powder/raven_to_bat.json +7cd5c980517e0e8bf0ec1c46b0b65d1dc3918e10 data/twilightforest/recipes/transformation_powder/skeleton_druid_to_witch.json +22eb0dd5e83d49c96ffbea167da5648805eae4bb data/twilightforest/recipes/transformation_powder/swarm_spider_to_cave_spider.json +b03c8ce88458ee3510d97369b65900fb599a955b data/twilightforest/recipes/transformation_powder/tiny_bird_to_parrot.json +bbbd2646b9ef94e84743c7a67f18e6f0aff0b6f6 data/twilightforest/recipes/transformation_powder/towerwood_borer_to_silverfish.json +0aaf44fab890b4e2f33019ba4fa32ea267dc5b3f data/twilightforest/recipes/transformation_powder/wraith_to_vex.json diff --git a/src/generated/resources/.cache/aceeec62bf10186f98b7c0ef34c2a200449b25e2 b/src/generated/resources/.cache/aceeec62bf10186f98b7c0ef34c2a200449b25e2 new file mode 100644 index 0000000000..2dd5e557ac --- /dev/null +++ b/src/generated/resources/.cache/aceeec62bf10186f98b7c0ef34c2a200449b25e2 @@ -0,0 +1,102 @@ +// 1.19.4 2023-06-04T23:10:12.8520658 Twilight Forest Block Tags +3d56c0ea016f639fad4fae4272d928867251da04 data/forge/tags/blocks/chests/wooden.json +879fc86d9d7face7697fbbb62565885740fc7f41 data/forge/tags/blocks/fences.json +879fc86d9d7face7697fbbb62565885740fc7f41 data/forge/tags/blocks/fences/wooden.json +211134157771c86a72a0c5a1985c2b05da55729b data/forge/tags/blocks/fence_gates.json +211134157771c86a72a0c5a1985c2b05da55729b data/forge/tags/blocks/fence_gates/wooden.json +1a3851518ec5b50270b1ce6602e3ee7ac98b8d90 data/forge/tags/blocks/immovable.json +9f7a15a8b7d1cd07e3898e7065ca511dafefba46 data/forge/tags/blocks/needs_wood_tool.json +078ffd510c10188061614a42c5165e8a6b146fd7 data/forge/tags/blocks/ores_in_ground/root.json +092125a387f652f754cbd3e2eef2d3fe0a67bd55 data/forge/tags/blocks/ore_bearing_ground/root.json +1a3851518ec5b50270b1ce6602e3ee7ac98b8d90 data/forge/tags/blocks/relocation_not_supported.json +82ad1b0beb97d202d619464e397341cab3fc4ea1 data/forge/tags/blocks/storage_blocks.json +82ad1b0beb97d202d619464e397341cab3fc4ea1 data/minecraft/tags/blocks/beacon_base_blocks.json +421e214e66436fb5f6d5903b7cdce6c73e7c4ef8 data/minecraft/tags/blocks/climbable.json +ae78e21d1c31cc73a6963c28dc434ec41063c9f9 data/minecraft/tags/blocks/dampens_vibrations.json +6be3f00e1fa63bb65b978bb8e2c63bbf79b5775e data/minecraft/tags/blocks/dirt.json +1094f05635217cf3ce4a1062e85d14129a347cef data/minecraft/tags/blocks/dragon_immune.json +f285ead821ac84499caf16d88d7a2b79c397953b data/minecraft/tags/blocks/features_cannot_replace.json +211134157771c86a72a0c5a1985c2b05da55729b data/minecraft/tags/blocks/fence_gates.json +e121d38615572a340044db73e20622af4e2a0a7c data/minecraft/tags/blocks/flower_pots.json +89b1de786c6a6e577b7de5733e462baa124cd138 data/minecraft/tags/blocks/frog_prefer_jump_to.json +65049c26c09e844c582a701fe66bd426a58aec5d data/minecraft/tags/blocks/invalid_spawn_inside.json +30b260e82242a2b548549ed7a4f89117c8d2c3c3 data/minecraft/tags/blocks/leaves.json +19bd74ce640c043c09053d7571fb7a9915d41417 data/minecraft/tags/blocks/logs.json +0af80d33dcbb7226a5afcb9d8a4c1a73a2c38c9d data/minecraft/tags/blocks/logs_that_burn.json +ad110363e23ddf18147ccfd6089231dd432b1fe9 data/minecraft/tags/blocks/mineable/axe.json +7177f5d8a3deacfcbfc12170902b73749e87213c data/minecraft/tags/blocks/mineable/hoe.json +41b8339a5b228fe9968f2a35de32ab8c82c0a4ad data/minecraft/tags/blocks/mineable/pickaxe.json +944d5178d1a94490d123e31a73bc58d4eea852ab data/minecraft/tags/blocks/mineable/shovel.json +44cc0123e6b6b654303a046d924b4e8fca617f41 data/minecraft/tags/blocks/moss_replaceable.json +6be3f00e1fa63bb65b978bb8e2c63bbf79b5775e data/minecraft/tags/blocks/mushroom_grow_block.json +2cc71b4b02486e3d8d669e95fa7c0778dca273d8 data/minecraft/tags/blocks/needs_diamond_tool.json +d1f677ac5e8be6bff6bd3a82b3586cd745434ef9 data/minecraft/tags/blocks/needs_iron_tool.json +dfe388780d9d636ad393c72d71b3ff7e0d725c09 data/minecraft/tags/blocks/needs_stone_tool.json +894142a18566c008a63daa05efba2dde1ef6eb26 data/minecraft/tags/blocks/occludes_vibration_signals.json +e33c5143db03e28da803a9f265902c39e93589e2 data/minecraft/tags/blocks/overworld_carver_replaceables.json +9358df5f5420b32a08f45ed7924867342cd14b47 data/minecraft/tags/blocks/planks.json +65049c26c09e844c582a701fe66bd426a58aec5d data/minecraft/tags/blocks/portals.json +71d34124020e8085ba2d886811250d261dd9d886 data/minecraft/tags/blocks/replaceable_plants.json +c1c4b1bbf5dca762f8c2dc1b6021bf08b541ac8f data/minecraft/tags/blocks/saplings.json +bb39f860aaf80d261eee2fc6cf18ee75a411d1c1 data/minecraft/tags/blocks/slabs.json +6be3f00e1fa63bb65b978bb8e2c63bbf79b5775e data/minecraft/tags/blocks/small_dripleaf_placeable.json +60d2c0021214d67e32e5edc0ee008326caa52bf7 data/minecraft/tags/blocks/stairs.json +0074c60e923669a4539ccbc5bd0c293f255ff5a5 data/minecraft/tags/blocks/standing_signs.json +c15f20a0c7467da527d9bde3456b9eb9e6a86021 data/minecraft/tags/blocks/strider_warm_blocks.json +8b7e0d4d896e5e197798d761800abbb1510d92e8 data/minecraft/tags/blocks/wall_signs.json +21d68ed46d202a9b9c5b709deebf8105df972ec0 data/minecraft/tags/blocks/wither_immune.json +f0813a14ba178a941ba37c4059a25e6b19f77091 data/minecraft/tags/blocks/wooden_buttons.json +3ff910b3376b5166da794689b1bf7569ad0b2e87 data/minecraft/tags/blocks/wooden_doors.json +879fc86d9d7face7697fbbb62565885740fc7f41 data/minecraft/tags/blocks/wooden_fences.json +1d347a5494b98a22c03317e180c51db859e4e309 data/minecraft/tags/blocks/wooden_pressure_plates.json +e4144fc27ee121d3f7d17a5fdff02e93e1d7f7d8 data/minecraft/tags/blocks/wooden_slabs.json +f3de4b0d6d2929c8fab124e75ff6269ca7642aa7 data/minecraft/tags/blocks/wooden_stairs.json +8522d5d06fec7c30601264eb04aebaa58886a948 data/minecraft/tags/blocks/wooden_trapdoors.json +e61eeb87b9b5ecebdb3a29a8ba0b33a4881b48c7 data/twilightforest/tags/blocks/annihilation_inclusions.json +894771e557845fa22ca82b71283c23be8ab1847a data/twilightforest/tags/blocks/antibuilder_ignores.json +fcebcf4a65bba0654976c6e9302f7fc8d98a6245 data/twilightforest/tags/blocks/banisters.json +84101198c6b6d645c6e155abb5349d33e7279300 data/twilightforest/tags/blocks/canopy_logs.json +65138d47619b3b87ed5cdf3b4ec226e0bfebfb64 data/twilightforest/tags/blocks/carminite_reactor_immune.json +66c63c2aea9e2f572dee901056877665b812ae56 data/twilightforest/tags/blocks/carminite_reactor_ores.json +ecd0a9f97ab5b54a7c21ed4f6af6896d564ea5f0 data/twilightforest/tags/blocks/castle_blocks.json +981ca24d355367f28a0a94beab8608f2915c6c76 data/twilightforest/tags/blocks/common_protections.json +97652f431059f64ffc5747f498cdcf278ddd0555 data/twilightforest/tags/blocks/darkwood_logs.json +29d004c820708d44b1747a2f31f506646efb1a27 data/twilightforest/tags/blocks/dark_tower_allowed_pots.json +388b70ed5b9e017727bc41c5b23c10261c71f166 data/twilightforest/tags/blocks/druid_projectile_replaceable.json +db6195d77bd598771b111d12750ba39f41fe35c7 data/twilightforest/tags/blocks/fire_jet_fuel.json +b491aceb6e547cf99e296737c6ca8ae308169227 data/twilightforest/tags/blocks/giants_spawnable_on.json +e222b54e9f838dbf2e905bf0b137ed8b0c60b328 data/twilightforest/tags/blocks/hollow_logs.json +7a1d959542375b7817357292b7a7f8dc238c109b data/twilightforest/tags/blocks/hollow_logs_climbable.json +83ddb0814968e64db4d54827610be02084d45254 data/twilightforest/tags/blocks/hollow_logs_horizontal.json +446a27521a52d926ace15efa14ae73ff4f39d931 data/twilightforest/tags/blocks/hollow_logs_vertical.json +c8fafdcc498cb38e705f74c899c6adee8c1c137e data/twilightforest/tags/blocks/ice_bomb_replaceables.json +33bdeefc5a85e9afb7b260809bec0d2a615d1f0f data/twilightforest/tags/blocks/logs.json +089e4347e6320066de4cd4d08b3e04a9442f4090 data/twilightforest/tags/blocks/mangrove_logs.json +dd1f6af3c96cc308a52726613452fddc17b9833c data/twilightforest/tags/blocks/mazebreaker_accelerated_mining.json +6983cf03e3e0ed197a353c175ee65000bac02492 data/twilightforest/tags/blocks/mazestone.json +9a0837862b33f048722739e6314f5c471d56b2d6 data/twilightforest/tags/blocks/mining_logs.json +2e3669ba44aac2e69249800a996f0e1b27c08e54 data/twilightforest/tags/blocks/ore_magnet/ignored_ores.json +d82abba18e7ff90d2c891453ddff813ffdb8e55d data/twilightforest/tags/blocks/ore_magnet/ore_safe_replace_block.json +52413a870520da3227b0d97b44e5455211b16e49 data/twilightforest/tags/blocks/penguins_spawnable_on.json +0ce6b55aef503d7bff8b5dd86b38092ba2b14c46 data/twilightforest/tags/blocks/plants_hang_on.json +5a058578494508fcfdd485cdba3b037f53933b8e data/twilightforest/tags/blocks/portal/decoration.json +17f5f40a39ad2e8e8411db23ecf39507a1131725 data/twilightforest/tags/blocks/portal/edge.json +cf3608bd187922aeb48c566c19e8482b0dca34c7 data/twilightforest/tags/blocks/portal/fluid.json +44dc958d8a99b82a63e4cc95f42038fdd4e2909c data/twilightforest/tags/blocks/portal/generated_decoration.json +58275c15a8c2699ac23fb5057a9ef14b13b733d9 data/twilightforest/tags/blocks/progression_allow_breaking.json +e40d95a628eb206ce0b4bac90782bccc789cf8dc data/twilightforest/tags/blocks/sortwood_logs.json +894142a18566c008a63daa05efba2dde1ef6eb26 data/twilightforest/tags/blocks/storage_blocks/arctic_fur.json +bb31db15f2b155aafc5bc956c01454bb27f14f72 data/twilightforest/tags/blocks/storage_blocks/carminite.json +c15f20a0c7467da527d9bde3456b9eb9e6a86021 data/twilightforest/tags/blocks/storage_blocks/fiery.json +b1bdb774a7cf90e5cfbf8d045a3ccca943b8e073 data/twilightforest/tags/blocks/storage_blocks/ironwood.json +e1e1daa9f0fa727681cf4eb0a0a2cbde40e6708d data/twilightforest/tags/blocks/storage_blocks/knightmetal.json +34bb5d122fd15f6d868a5ff3cfe8ac8eafc6e892 data/twilightforest/tags/blocks/storage_blocks/steeleaf.json +c6759d0cd015a70c590dd1ec9d0cd2941d3f45dc data/twilightforest/tags/blocks/structure_banned_interactions.json +aa9ca0bf521d8c6b198f2c25e4d5528917308d9f data/twilightforest/tags/blocks/timewood_logs.json +6ac229128975c2e8f70b767e08a76386b7bc81df data/twilightforest/tags/blocks/time_core_excluded.json +6352667067c11a27cfc37713a8f8543507c1f18e data/twilightforest/tags/blocks/towerwood.json +548dfc9d7e2225c6f7d761216b3fafc120978f73 data/twilightforest/tags/blocks/transwood_logs.json +fefe9165712fc88657d59e31e991a5e4ea7eed72 data/twilightforest/tags/blocks/tree_roots_skip.json +bf847accd5b18676d59a86e224adcfc328d677e6 data/twilightforest/tags/blocks/trophies.json +d94381f990d5908c2d71247b1b14946ef4a4ef3d data/twilightforest/tags/blocks/twilight_oak_logs.json +bd913acdcab0dc149a1173c1a856ab03639caa31 data/twilightforest/tags/blocks/worldgen_replaceables.json diff --git a/src/generated/resources/.cache/b17028165bfdfd3da5ae135d42f0edeb25cc773b b/src/generated/resources/.cache/b17028165bfdfd3da5ae135d42f0edeb25cc773b new file mode 100644 index 0000000000..4ec76a45d8 --- /dev/null +++ b/src/generated/resources/.cache/b17028165bfdfd3da5ae135d42f0edeb25cc773b @@ -0,0 +1,37 @@ +// 1.19.4 2023-03-15T19:43:56.8972454 twilightforest Crumble Horn Transformations +e02e9a992d1c67308b9e7846a5cfc0f2708e6a77 data/twilightforest/recipes/crumble_horn/castle_brick_to_cracked_castle_brick.json +145edb3e24ecc95bcf8838050d577453c800dfb3 data/twilightforest/recipes/crumble_horn/coarse_dirt_to_dirt.json +b389c95122b7ec9f1b9d4c0fb5fbccc9928bcc9a data/twilightforest/recipes/crumble_horn/cobblestone_to_gravel.json +3c13df3de6258bdc3e9d0917063bdadb411ea742 data/twilightforest/recipes/crumble_horn/cracked_polished_blackstone_bricks_to_blackstone.json +2e15ce41bc25351328c8cd426fecd4f872d89940 data/twilightforest/recipes/crumble_horn/deadrock_to_cracked_deadrock.json +33ee806b52f6e86d502cdec13f2175abeab01997 data/twilightforest/recipes/crumble_horn/deepslate_bricks_to_cracked_deepslate_bricks.json +f490b999d208e7846b4d4dcb4d5ec9258a1938a7 data/twilightforest/recipes/crumble_horn/deepslate_tiles_to_cracked_deepslate_tiles.json +d1fc12d87223092ac93440a7a3c1c92ef0aed126 data/twilightforest/recipes/crumble_horn/dissolve_andesite.json +0e3964422b1526f82060c928904f4e77e0dd322d data/twilightforest/recipes/crumble_horn/dissolve_clay.json +3a3202117e0a5c2b668dfeeb55679c8360cba3fb data/twilightforest/recipes/crumble_horn/dissolve_diorite.json +a32a33bae91ede631dbb7979370489583c539f17 data/twilightforest/recipes/crumble_horn/dissolve_dirt.json +443193f5da97f2193f971c1142df781cc98be8ae data/twilightforest/recipes/crumble_horn/dissolve_granite.json +6b9c7e407fadde403f82298a340df80a12455493 data/twilightforest/recipes/crumble_horn/dissolve_gravel.json +8b6874c5fbfd7566088a334cec95909829e83311 data/twilightforest/recipes/crumble_horn/dissolve_red_sand.json +20a71ebdf302182753f9ef06d0d0408f8f312f9a data/twilightforest/recipes/crumble_horn/dissolve_sand.json +af605259c81aa42925748f926a1e5086902cb6eb data/twilightforest/recipes/crumble_horn/etched_nagastone_to_cracked_etched_nagastone.json +bd38b9f55c64e7145e8181044e4236cf80a8854b data/twilightforest/recipes/crumble_horn/exposed_copper_to_copper_block.json +cf0f2c5c0c9156ecf24f95e1254e7cb92d14b4b8 data/twilightforest/recipes/crumble_horn/exposed_cut_copper_to_cut_copper.json +0720e837f466ff6f0a2902c30cb8d8ae01c129b0 data/twilightforest/recipes/crumble_horn/grass_block_to_dirt.json +f3464f592c6be55f827b00b706e7880599454e18 data/twilightforest/recipes/crumble_horn/mazestone_brick_to_cracked_mazestone.json +21db9b7867ef7d843baab5c91293730881159b1a data/twilightforest/recipes/crumble_horn/mycelium_to_dirt.json +676363d733fbf8feb4853a0ac032637eebd19ff1 data/twilightforest/recipes/crumble_horn/nagastone_pillar_to_cracked_nagastone_pillar.json +21e61bfd60eda21d0346a61943752180d18dc86a data/twilightforest/recipes/crumble_horn/nether_bricks_to_cracked_nether_bricks.json +195904b9cc4a2ae981795f8ed8850fcbbfc9ad9d data/twilightforest/recipes/crumble_horn/oxidized_copper_to_weathered_copper.json +6276962e84a62f08d4b6eb5a3ff796e5f56b7b89 data/twilightforest/recipes/crumble_horn/oxidized_cut_copper_to_weathered_cut_copper.json +be310dd7957a4372e3aff71d774e860f8f53f3b8 data/twilightforest/recipes/crumble_horn/podzol_to_dirt.json +57fb1b203fcd549a5e1137d11984ade2c2c4a1fb data/twilightforest/recipes/crumble_horn/polished_blackstone_bricks_to_cracked_polished_blackstone_bricks.json +f4601deb9ee76c2909e4500acfb4e0841cda5811 data/twilightforest/recipes/crumble_horn/red_sandstone_to_red_sand.json +000abab70658a34e2fdebec34a846b2d32bdc464 data/twilightforest/recipes/crumble_horn/rooted_dirt_to_dirt.json +207f1e3769e8e0e01aba4fda86d28809ce78e8e3 data/twilightforest/recipes/crumble_horn/sandstone_to_sand.json +22583e793a0fbabf21cf83d514067b48c13b2860 data/twilightforest/recipes/crumble_horn/stone_bricks_to_cracked_stone_bricks.json +b21f3825b92c03741930ac5892346ddfc89c61e0 data/twilightforest/recipes/crumble_horn/stone_to_cobblestone.json +a9a6a499cd5ea0749fba69edbd14eb154a17d101 data/twilightforest/recipes/crumble_horn/towerwood_to_cracked_towerwood.json +d6af821dbf705a4103d0d5b26d04053fbe133aac data/twilightforest/recipes/crumble_horn/underbrick_to_cracked_underbrick.json +8f0161dc585a4f0f70666c1af16429c114b29ee6 data/twilightforest/recipes/crumble_horn/weathered_copper_to_exposed_copper.json +06baf2b445267f5ac5df09a895f7ae7da3c15552 data/twilightforest/recipes/crumble_horn/weathered_cut_copper_to_exposed_cut_copper.json diff --git a/src/generated/resources/.cache/bd3c258a938cc6036d1d3d8417c4b7d38da2a57c b/src/generated/resources/.cache/bd3c258a938cc6036d1d3d8417c4b7d38da2a57c new file mode 100644 index 0000000000..4f599951b1 --- /dev/null +++ b/src/generated/resources/.cache/bd3c258a938cc6036d1d3d8417c4b7d38da2a57c @@ -0,0 +1,10 @@ +// 1.19.4 2023-03-15T19:43:56.9151977 Twilight Forest Banner Pattern Tags +9e25f367347054bfeb2795c2817298a5ea2476f1 data/twilightforest/tags/banner_pattern/pattern_item/alpha_yeti.json +3201a363347edfd87df1964f045b967bb03bb554 data/twilightforest/tags/banner_pattern/pattern_item/hydra.json +682b1fc8cf54182a6882ecbb4c5766a96a936caf data/twilightforest/tags/banner_pattern/pattern_item/knight_phantom.json +c9d830e3bb988898b90b3cee348f327dcad628c4 data/twilightforest/tags/banner_pattern/pattern_item/lich.json +16bbcf004c02ab4da34c072c07435f7e729a20a5 data/twilightforest/tags/banner_pattern/pattern_item/minoshroom.json +b31b643f0b4c93c4dfa247efe16772d8e5f9a5e0 data/twilightforest/tags/banner_pattern/pattern_item/naga.json +85ebce1dce097cfce83370ae723755dec45bee1b data/twilightforest/tags/banner_pattern/pattern_item/quest_ram.json +76825b44618cc5a7135d485c1957e12f4431179c data/twilightforest/tags/banner_pattern/pattern_item/snow_queen.json +745289af8c3557834938bef75eb7226955c81a22 data/twilightforest/tags/banner_pattern/pattern_item/ur_ghast.json diff --git a/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 b/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 new file mode 100644 index 0000000000..4e1984ca50 --- /dev/null +++ b/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 @@ -0,0 +1,2 @@ +// 1.19.4 2023-05-29T21:40:50.7344137 Languages: en_us +93244be88d082f6c08cc0b94daa9d86ace45bcf3 assets/twilightforest/lang/en_us.json diff --git a/src/generated/resources/.cache/c8cd847b7fd34763d45d37011b05a30c2dfeb774 b/src/generated/resources/.cache/c8cd847b7fd34763d45d37011b05a30c2dfeb774 new file mode 100644 index 0000000000..4f1b06e5d4 --- /dev/null +++ b/src/generated/resources/.cache/c8cd847b7fd34763d45d37011b05a30c2dfeb774 @@ -0,0 +1,16 @@ +// 1.19.4 2023-05-10T17:53:29.3813417 Twilight Forest Entity Tags +0865b5410d11831c91b4a4164d890df4852489ff data/forge/tags/entity_types/bosses.json +96a1f9f2c5c062278d532397563660cb0c4982a7 data/minecraft/tags/entity_types/arrows.json +e5bff3b10b54d6af46050743b454bd8cce4993e0 data/minecraft/tags/entity_types/fall_damage_immune.json +9e5f68b2faa6d767538d0f4264a7145d32a2bdda data/minecraft/tags/entity_types/freeze_hurts_extra_types.json +f0201eef926830e5f1c0aaaf18c674c503d22c0b data/minecraft/tags/entity_types/freeze_immune_entity_types.json +4cc81785a3c2c7f11c11bac6cf2ad3c0d89c9ad5 data/minecraft/tags/entity_types/frog_food.json +2cbca68c050a403295054fe0e0f2705244f9a0ee data/minecraft/tags/entity_types/impact_projectiles.json +e1ec2146a12c67e6333cd9738c81291aded74036 data/minecraft/tags/entity_types/powder_snow_walkable_mobs.json +f5d299a6ccce3d8fc7700b44c444b6733bd2506c data/minecraft/tags/entity_types/skeletons.json +38bf80bb5d608168d87dbbc33e3314fd1d0135d9 data/twilightforest/tags/entity_types/bosses.json +bfe454dfc8b286c9a748229c8338e4e382fb5348 data/twilightforest/tags/entity_types/dont_kill_bugs.json +97ff9312c2bcde14cf20a5eec42f4dedc8dc8e6f data/twilightforest/tags/entity_types/lich_poppables.json +89130461ab941c91d37ae7e0d43ccaccfbdc44fb data/twilightforest/tags/entity_types/lifedrain_drops_no_flesh.json +3ee8c8fc2a97ac50a0823d806c70f772cf32f52b data/twilightforest/tags/entity_types/rides_obstruct_snatching.json +f42bc250a191bdb941d3e073c78555e3139a09b9 data/twilightforest/tags/entity_types/sortable_entities.json diff --git a/src/generated/resources/.cache/d54fd8e9cae1e749d9d0842965090e18ed3af4f3 b/src/generated/resources/.cache/d54fd8e9cae1e749d9d0842965090e18ed3af4f3 new file mode 100644 index 0000000000..9d3c27743c --- /dev/null +++ b/src/generated/resources/.cache/d54fd8e9cae1e749d9d0842965090e18ed3af4f3 @@ -0,0 +1,13 @@ +// 1.19.4 2023-04-25T17:58:33.901161 Tags for minecraft:damage_type mod id twilightforest +e871224cfaf3f71ec4cef5455688114b0d13ee16 data/minecraft/tags/damage_type/always_most_significant_fall.json +4ab0a038b74c9a0de0c5f73f23c69d420b5d1334 data/minecraft/tags/damage_type/bypasses_armor.json +a6ba639a122a7a458de0be23570a49780563792d data/minecraft/tags/damage_type/bypasses_enchantments.json +e871224cfaf3f71ec4cef5455688114b0d13ee16 data/minecraft/tags/damage_type/bypasses_invulnerability.json +e871224cfaf3f71ec4cef5455688114b0d13ee16 data/minecraft/tags/damage_type/bypasses_resistance.json +370292a3495d06a886b1248faac983a2151db90d data/minecraft/tags/damage_type/damages_helmet.json +f953fcb77923694dc4d54294fa83a1bc6249f0fb data/minecraft/tags/damage_type/is_fall.json +0e66deefa87f2ded7e7322b983560595b71f0729 data/minecraft/tags/damage_type/is_fire.json +ff72fbe0de04463d707c15d9387381e1df485f00 data/minecraft/tags/damage_type/is_projectile.json +3dfac6ba22176c226475f47389e1f7af39d799b1 data/minecraft/tags/damage_type/no_anger.json +b9cd88787282e94bc2a87ca2afa5d5936306d057 data/minecraft/tags/damage_type/witch_resistant_to.json +cb9600cb8f9e9956af60f6614c0b9c87073656f5 data/twilightforest/tags/damage_type/breaks_lich_shields.json diff --git a/src/generated/resources/.cache/e5c5eb35b4ba40351ecb7d9f04c3527f2f5779b0 b/src/generated/resources/.cache/e5c5eb35b4ba40351ecb7d9f04c3527f2f5779b0 new file mode 100644 index 0000000000..ad851707aa --- /dev/null +++ b/src/generated/resources/.cache/e5c5eb35b4ba40351ecb7d9f04c3527f2f5779b0 @@ -0,0 +1,42 @@ +// 1.19.4 2023-05-26T23:35:22.7904726 Advancements +b0a3caacb42b1c3c3817249d5e52592b02cff521 data/twilightforest/advancements/arborist.json +048bd4b6c634f17c5abf12c776874fcf46efbb5c data/twilightforest/advancements/arctic_armor_dyed.json +3bc66b3b1e99eded264cfd5edf6fabc31340a563 data/twilightforest/advancements/beanstalk.json +def0e697232d1db0170cd20f6c59cafa48e1e178 data/twilightforest/advancements/break_glass_sword.json +0186f991e0a6f2fa030418054b708aeb9a47d9a6 data/twilightforest/advancements/experiment_115.json +d0ff3f6de3510bded8244fbb3b5d2b5b5a70626a data/twilightforest/advancements/experiment_115_115.json +276d5535888ebb5dc8673d6603460b3f24a30eb0 data/twilightforest/advancements/experiment_115_self_replenishing.json +705dd817b5a600fe8723f42ea18cdd77cd9752f4 data/twilightforest/advancements/fiery_set.json +6aac086602dfc3fdb41fab3e614c1b8a2c94ea72 data/twilightforest/advancements/full_mettle_alchemist.json +0be16421902216ecf1023c1e479dc78252cf3af8 data/twilightforest/advancements/ghast_trap.json +0aab9a05081eb9713d584a127278561e4312cead data/twilightforest/advancements/giants.json +f64a027b7a2c25fb1bb6051ea6e81afa834f1714 data/twilightforest/advancements/hedge.json +b854b173a2a50aabf802ebda886de29de40bdcc2 data/twilightforest/advancements/hill1.json +fae073cdadbf918248fb970edb60b6e83e8c0f5a data/twilightforest/advancements/hill2.json +a934dc57a964df47c7276fbfc894eecde19f6ded data/twilightforest/advancements/hill3.json +c465ce596f09d80a11af1e6af31139e309700846 data/twilightforest/advancements/hydra_chop.json +50b13ceb6955066d7b69ca930e33b48c670f41ce data/twilightforest/advancements/kill_cicada.json +4c982bd7e777fd468c36f387e0229a56ec6b40ce data/twilightforest/advancements/lich_scepters.json +3b60e64923da38f192bc21bae7038612c370f5ae data/twilightforest/advancements/magic_map.json +98738d97e44e00c0a92a9406f5fadc4a4dd451f5 data/twilightforest/advancements/magic_map_focus.json +33cc2696e0bfc947b20f422f9b593cc0f9dd73e2 data/twilightforest/advancements/mazebreaker.json +a4a09288e95cd927be708fd2a681bc80f493ae1d data/twilightforest/advancements/maze_map.json +768bfad87f3cb401dac67e61ad0f20e0a93433e3 data/twilightforest/advancements/naga_armors.json +0ce7833be6b23429e49d90da39749deed6f86127 data/twilightforest/advancements/ore_map.json +12d9e7686419e24c1dfee3fc92992985368ba3d5 data/twilightforest/advancements/progression_end.json +5e4a1217cc71f566a3e4d3c0fc1169a6223f42b0 data/twilightforest/advancements/progress_glacier.json +c33943170832df860634b8a9ab0e499735be81e8 data/twilightforest/advancements/progress_hydra.json +82142caeb39c3272c467975f2ff0e4f52709518d data/twilightforest/advancements/progress_knights.json +63a68897e6cd290ad34c89c08f0b63c1c6812e40 data/twilightforest/advancements/progress_labyrinth.json +884e18bf2c97fa4a63bd8ba02b053bda90419b69 data/twilightforest/advancements/progress_lich.json +aae37bf93e1cb5c758e5aaee9663fd63f4670b78 data/twilightforest/advancements/progress_merge.json +15cd4e44ad8476a8cf0cbdd23a014254f492a929 data/twilightforest/advancements/progress_naga.json +1c8848cf421be367c86a65c78537608ce46ed93b data/twilightforest/advancements/progress_troll.json +0fda0675503ec75dfc399edfbc497c837e091b29 data/twilightforest/advancements/progress_trophy_pedestal.json +44db7246e46858f1e49e952ef84bdd7068652f67 data/twilightforest/advancements/progress_ur_ghast.json +822232d1909435751f514dfb00ef8dcfdf154f49 data/twilightforest/advancements/progress_yeti.json +8e5965280117317ea48b6bcaca275788a105cca2 data/twilightforest/advancements/quest_ram.json +02a0d42f64c3b45d13c21de3c720680322e7b42a data/twilightforest/advancements/root.json +aaeec7a0b1eb93bc976c3e7e56f87d7106856d97 data/twilightforest/advancements/troll.json +dba5a8d814ee469aef07afbeb6f6cce4c0a84fd6 data/twilightforest/advancements/twilight_dinner.json +95bd90fb88363692dde23bcf7f0508c08cf9ce52 data/twilightforest/advancements/twilight_hunter.json diff --git a/src/generated/resources/.cache/ec1948d2d036209856d7c40ea3c7c1670a5008a1 b/src/generated/resources/.cache/ec1948d2d036209856d7c40ea3c7c1670a5008a1 new file mode 100644 index 0000000000..8140eb9c84 --- /dev/null +++ b/src/generated/resources/.cache/ec1948d2d036209856d7c40ea3c7c1670a5008a1 @@ -0,0 +1,13 @@ +// 1.19.4 2023-03-15T19:43:56.8741264 Twilight Forest Hollow Hill Stalactites +f396119325e0cc93e4100c5a79703f932cbfcbb3 data/twilightforest/stalactites/entries/coal_ore_stalactite.json +f8d4189d7149b02298cb0091beed9faeb78fdd7d data/twilightforest/stalactites/entries/copper_ore_raw_copper_block_stalactite.json +e3db1ece64965a8aa26db009758f4a55985d55f1 data/twilightforest/stalactites/entries/diamond_ore_stalactite.json +206e7378f768e626ddaf7da320008c2740113268 data/twilightforest/stalactites/entries/emerald_ore_stalactite.json +356d41de77855ff124c49af8f68301cfadcd288c data/twilightforest/stalactites/entries/glowstone_stalactite.json +67628e7fc16fe91a012ff65aa6b3927b24580794 data/twilightforest/stalactites/entries/gold_ore_raw_gold_block_stalactite.json +250e6ff041503b86c6ad40c80347a48f4e69ecf9 data/twilightforest/stalactites/entries/iron_ore_raw_iron_block_stalactite.json +ca9aade3436da12abb7a41eb31b6ef990087aee6 data/twilightforest/stalactites/entries/lapis_ore_stalactite.json +0910e0188a106a0a4a22d0be05be0c182aee77e8 data/twilightforest/stalactites/entries/redstone_ore_stalactite.json +44af623337e718b17d18658fb8baf3f3a3c01cb4 data/twilightforest/stalactites/large_hollow_hill.json +abd5c475063d3a9c2ed314c2b4d06842f7dece9c data/twilightforest/stalactites/medium_hollow_hill.json +d4e52c2cfb9057a08fe855ce11adbd138a394af7 data/twilightforest/stalactites/small_hollow_hill.json diff --git a/src/generated/resources/assets/minecraft/atlases/chests.json b/src/generated/resources/assets/minecraft/atlases/chests.json new file mode 100644 index 0000000000..70150a17c6 --- /dev/null +++ b/src/generated/resources/assets/minecraft/atlases/chests.json @@ -0,0 +1,100 @@ +{ + "sources": [ + { + "type": "minecraft:single", + "resource": "twilightforest:model/chest/twilight/twilight" + }, + { + "type": "minecraft:single", + "resource": "twilightforest:model/chest/twilight/left" + }, + { + "type": "minecraft:single", + "resource": "twilightforest:model/chest/twilight/right" + }, + { + "type": "minecraft:single", + "resource": "twilightforest:model/chest/canopy/canopy" + }, + { + "type": "minecraft:single", + "resource": "twilightforest:model/chest/canopy/left" + }, + { + "type": "minecraft:single", + "resource": "twilightforest:model/chest/canopy/right" + }, + { + "type": "minecraft:single", + "resource": "twilightforest:model/chest/mangrove/mangrove" + }, + { + "type": "minecraft:single", + "resource": "twilightforest:model/chest/mangrove/left" + }, + { + "type": "minecraft:single", + "resource": "twilightforest:model/chest/mangrove/right" + }, + { + "type": "minecraft:single", + "resource": "twilightforest:model/chest/darkwood/darkwood" + }, + { + "type": "minecraft:single", + "resource": "twilightforest:model/chest/darkwood/left" + }, + { + "type": "minecraft:single", + "resource": "twilightforest:model/chest/darkwood/right" + }, + { + "type": "minecraft:single", + "resource": "twilightforest:model/chest/time/time" + }, + { + "type": "minecraft:single", + "resource": "twilightforest:model/chest/time/left" + }, + { + "type": "minecraft:single", + "resource": "twilightforest:model/chest/time/right" + }, + { + "type": "minecraft:single", + "resource": "twilightforest:model/chest/trans/trans" + }, + { + "type": "minecraft:single", + "resource": "twilightforest:model/chest/trans/left" + }, + { + "type": "minecraft:single", + "resource": "twilightforest:model/chest/trans/right" + }, + { + "type": "minecraft:single", + "resource": "twilightforest:model/chest/mining/mining" + }, + { + "type": "minecraft:single", + "resource": "twilightforest:model/chest/mining/left" + }, + { + "type": "minecraft:single", + "resource": "twilightforest:model/chest/mining/right" + }, + { + "type": "minecraft:single", + "resource": "twilightforest:model/chest/sort/sort" + }, + { + "type": "minecraft:single", + "resource": "twilightforest:model/chest/sort/left" + }, + { + "type": "minecraft:single", + "resource": "twilightforest:model/chest/sort/right" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/minecraft/atlases/shield_patterns.json b/src/generated/resources/assets/minecraft/atlases/shield_patterns.json new file mode 100644 index 0000000000..19897f72df --- /dev/null +++ b/src/generated/resources/assets/minecraft/atlases/shield_patterns.json @@ -0,0 +1,8 @@ +{ + "sources": [ + { + "type": "minecraft:single", + "resource": "twilightforest:model/knightmetal_shield" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/acacia_banister.json b/src/generated/resources/assets/twilightforest/blockstates/acacia_banister.json new file mode 100644 index 0000000000..e10f56684c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/acacia_banister.json @@ -0,0 +1,94 @@ +{ + "variants": { + "extended=false,facing=east,shape=connected": { + "model": "twilightforest:block/wood/banister/acacia/acacia_banister_connected", + "y": 270 + }, + "extended=false,facing=east,shape=short": { + "model": "twilightforest:block/wood/banister/acacia/acacia_banister_short", + "y": 270 + }, + "extended=false,facing=east,shape=tall": { + "model": "twilightforest:block/wood/banister/acacia/acacia_banister_tall", + "y": 270 + }, + "extended=false,facing=north,shape=connected": { + "model": "twilightforest:block/wood/banister/acacia/acacia_banister_connected", + "y": 180 + }, + "extended=false,facing=north,shape=short": { + "model": "twilightforest:block/wood/banister/acacia/acacia_banister_short", + "y": 180 + }, + "extended=false,facing=north,shape=tall": { + "model": "twilightforest:block/wood/banister/acacia/acacia_banister_tall", + "y": 180 + }, + "extended=false,facing=south,shape=connected": { + "model": "twilightforest:block/wood/banister/acacia/acacia_banister_connected" + }, + "extended=false,facing=south,shape=short": { + "model": "twilightforest:block/wood/banister/acacia/acacia_banister_short" + }, + "extended=false,facing=south,shape=tall": { + "model": "twilightforest:block/wood/banister/acacia/acacia_banister_tall" + }, + "extended=false,facing=west,shape=connected": { + "model": "twilightforest:block/wood/banister/acacia/acacia_banister_connected", + "y": 90 + }, + "extended=false,facing=west,shape=short": { + "model": "twilightforest:block/wood/banister/acacia/acacia_banister_short", + "y": 90 + }, + "extended=false,facing=west,shape=tall": { + "model": "twilightforest:block/wood/banister/acacia/acacia_banister_tall", + "y": 90 + }, + "extended=true,facing=east,shape=connected": { + "model": "twilightforest:block/wood/banister/acacia/acacia_banister_connected_extended", + "y": 270 + }, + "extended=true,facing=east,shape=short": { + "model": "twilightforest:block/wood/banister/acacia/acacia_banister_short_extended", + "y": 270 + }, + "extended=true,facing=east,shape=tall": { + "model": "twilightforest:block/wood/banister/acacia/acacia_banister_tall_extended", + "y": 270 + }, + "extended=true,facing=north,shape=connected": { + "model": "twilightforest:block/wood/banister/acacia/acacia_banister_connected_extended", + "y": 180 + }, + "extended=true,facing=north,shape=short": { + "model": "twilightforest:block/wood/banister/acacia/acacia_banister_short_extended", + "y": 180 + }, + "extended=true,facing=north,shape=tall": { + "model": "twilightforest:block/wood/banister/acacia/acacia_banister_tall_extended", + "y": 180 + }, + "extended=true,facing=south,shape=connected": { + "model": "twilightforest:block/wood/banister/acacia/acacia_banister_connected_extended" + }, + "extended=true,facing=south,shape=short": { + "model": "twilightforest:block/wood/banister/acacia/acacia_banister_short_extended" + }, + "extended=true,facing=south,shape=tall": { + "model": "twilightforest:block/wood/banister/acacia/acacia_banister_tall_extended" + }, + "extended=true,facing=west,shape=connected": { + "model": "twilightforest:block/wood/banister/acacia/acacia_banister_connected_extended", + "y": 90 + }, + "extended=true,facing=west,shape=short": { + "model": "twilightforest:block/wood/banister/acacia/acacia_banister_short_extended", + "y": 90 + }, + "extended=true,facing=west,shape=tall": { + "model": "twilightforest:block/wood/banister/acacia/acacia_banister_tall_extended", + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/alpha_yeti_boss_spawner.json b/src/generated/resources/assets/twilightforest/blockstates/alpha_yeti_boss_spawner.json new file mode 100644 index 0000000000..fab51f8dc9 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/alpha_yeti_boss_spawner.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/boss_spawner" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/alpha_yeti_trophy.json b/src/generated/resources/assets/twilightforest/blockstates/alpha_yeti_trophy.json new file mode 100644 index 0000000000..3951e3eea5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/alpha_yeti_trophy.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "minecraft:block/skull" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/alpha_yeti_wall_trophy.json b/src/generated/resources/assets/twilightforest/blockstates/alpha_yeti_wall_trophy.json new file mode 100644 index 0000000000..3951e3eea5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/alpha_yeti_wall_trophy.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "minecraft:block/skull" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/antibuilder.json b/src/generated/resources/assets/twilightforest/blockstates/antibuilder.json new file mode 100644 index 0000000000..c1b7762a90 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/antibuilder.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/antibuilder" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/antibuilt_block.json b/src/generated/resources/assets/twilightforest/blockstates/antibuilt_block.json new file mode 100644 index 0000000000..5741a34c02 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/antibuilt_block.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/antibuilt_block" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/arctic_fur_block.json b/src/generated/resources/assets/twilightforest/blockstates/arctic_fur_block.json new file mode 100644 index 0000000000..6c4f8a6dd5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/arctic_fur_block.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/arctic_fur_block" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/aurora_block.json b/src/generated/resources/assets/twilightforest/blockstates/aurora_block.json new file mode 100644 index 0000000000..7ccbbf84ea --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/aurora_block.json @@ -0,0 +1,148 @@ +{ + "variants": { + "variant=0": [ + { + "model": "twilightforest:block/aurora_block_0", + "weight": 3 + }, + { + "model": "twilightforest:block/aurora_block_1" + } + ], + "variant=1": [ + { + "model": "twilightforest:block/aurora_block_1", + "weight": 3 + }, + { + "model": "twilightforest:block/aurora_block_2" + } + ], + "variant=10": [ + { + "model": "twilightforest:block/aurora_block_10", + "weight": 3 + }, + { + "model": "twilightforest:block/aurora_block_11" + } + ], + "variant=11": [ + { + "model": "twilightforest:block/aurora_block_11", + "weight": 3 + }, + { + "model": "twilightforest:block/aurora_block_12" + } + ], + "variant=12": [ + { + "model": "twilightforest:block/aurora_block_12", + "weight": 3 + }, + { + "model": "twilightforest:block/aurora_block_13" + } + ], + "variant=13": [ + { + "model": "twilightforest:block/aurora_block_13", + "weight": 3 + }, + { + "model": "twilightforest:block/aurora_block_14" + } + ], + "variant=14": [ + { + "model": "twilightforest:block/aurora_block_14", + "weight": 3 + }, + { + "model": "twilightforest:block/aurora_block_15" + } + ], + "variant=15": [ + { + "model": "twilightforest:block/aurora_block_15", + "weight": 3 + }, + { + "model": "twilightforest:block/aurora_block_0" + } + ], + "variant=2": [ + { + "model": "twilightforest:block/aurora_block_2", + "weight": 3 + }, + { + "model": "twilightforest:block/aurora_block_3" + } + ], + "variant=3": [ + { + "model": "twilightforest:block/aurora_block_3", + "weight": 3 + }, + { + "model": "twilightforest:block/aurora_block_4" + } + ], + "variant=4": [ + { + "model": "twilightforest:block/aurora_block_4", + "weight": 3 + }, + { + "model": "twilightforest:block/aurora_block_5" + } + ], + "variant=5": [ + { + "model": "twilightforest:block/aurora_block_5", + "weight": 3 + }, + { + "model": "twilightforest:block/aurora_block_6" + } + ], + "variant=6": [ + { + "model": "twilightforest:block/aurora_block_6", + "weight": 3 + }, + { + "model": "twilightforest:block/aurora_block_7" + } + ], + "variant=7": [ + { + "model": "twilightforest:block/aurora_block_7", + "weight": 3 + }, + { + "model": "twilightforest:block/aurora_block_8" + } + ], + "variant=8": [ + { + "model": "twilightforest:block/aurora_block_8", + "weight": 3 + }, + { + "model": "twilightforest:block/aurora_block_9" + } + ], + "variant=9": [ + { + "model": "twilightforest:block/aurora_block_9", + "weight": 3 + }, + { + "model": "twilightforest:block/aurora_block_10" + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/aurora_pillar.json b/src/generated/resources/assets/twilightforest/blockstates/aurora_pillar.json new file mode 100644 index 0000000000..559fa862c7 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/aurora_pillar.json @@ -0,0 +1,16 @@ +{ + "variants": { + "axis=x": { + "model": "twilightforest:block/aurora_pillar", + "x": 90, + "y": 90 + }, + "axis=y": { + "model": "twilightforest:block/aurora_pillar" + }, + "axis=z": { + "model": "twilightforest:block/aurora_pillar", + "x": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/aurora_slab.json b/src/generated/resources/assets/twilightforest/blockstates/aurora_slab.json new file mode 100644 index 0000000000..c7af2bc243 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/aurora_slab.json @@ -0,0 +1,15 @@ +{ + "variants": { + "type=bottom": { + "model": "twilightforest:block/aurora_slab" + }, + "type=double": { + "model": "twilightforest:block/aurora_slab_double" + }, + "type=top": { + "model": "twilightforest:block/aurora_slab", + "uvlock": true, + "x": 180 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/auroralized_glass.json b/src/generated/resources/assets/twilightforest/blockstates/auroralized_glass.json new file mode 100644 index 0000000000..127e4a902e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/auroralized_glass.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/auroralized_glass" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/beanstalk_grower.json b/src/generated/resources/assets/twilightforest/blockstates/beanstalk_grower.json new file mode 100644 index 0000000000..8a4da80912 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/beanstalk_grower.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/beanstalk_grower" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/beanstalk_leaves.json b/src/generated/resources/assets/twilightforest/blockstates/beanstalk_leaves.json new file mode 100644 index 0000000000..650794b7e5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/beanstalk_leaves.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/beanstalk_leaves" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/birch_banister.json b/src/generated/resources/assets/twilightforest/blockstates/birch_banister.json new file mode 100644 index 0000000000..b166cad6e0 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/birch_banister.json @@ -0,0 +1,94 @@ +{ + "variants": { + "extended=false,facing=east,shape=connected": { + "model": "twilightforest:block/wood/banister/birch/birch_banister_connected", + "y": 270 + }, + "extended=false,facing=east,shape=short": { + "model": "twilightforest:block/wood/banister/birch/birch_banister_short", + "y": 270 + }, + "extended=false,facing=east,shape=tall": { + "model": "twilightforest:block/wood/banister/birch/birch_banister_tall", + "y": 270 + }, + "extended=false,facing=north,shape=connected": { + "model": "twilightforest:block/wood/banister/birch/birch_banister_connected", + "y": 180 + }, + "extended=false,facing=north,shape=short": { + "model": "twilightforest:block/wood/banister/birch/birch_banister_short", + "y": 180 + }, + "extended=false,facing=north,shape=tall": { + "model": "twilightforest:block/wood/banister/birch/birch_banister_tall", + "y": 180 + }, + "extended=false,facing=south,shape=connected": { + "model": "twilightforest:block/wood/banister/birch/birch_banister_connected" + }, + "extended=false,facing=south,shape=short": { + "model": "twilightforest:block/wood/banister/birch/birch_banister_short" + }, + "extended=false,facing=south,shape=tall": { + "model": "twilightforest:block/wood/banister/birch/birch_banister_tall" + }, + "extended=false,facing=west,shape=connected": { + "model": "twilightforest:block/wood/banister/birch/birch_banister_connected", + "y": 90 + }, + "extended=false,facing=west,shape=short": { + "model": "twilightforest:block/wood/banister/birch/birch_banister_short", + "y": 90 + }, + "extended=false,facing=west,shape=tall": { + "model": "twilightforest:block/wood/banister/birch/birch_banister_tall", + "y": 90 + }, + "extended=true,facing=east,shape=connected": { + "model": "twilightforest:block/wood/banister/birch/birch_banister_connected_extended", + "y": 270 + }, + "extended=true,facing=east,shape=short": { + "model": "twilightforest:block/wood/banister/birch/birch_banister_short_extended", + "y": 270 + }, + "extended=true,facing=east,shape=tall": { + "model": "twilightforest:block/wood/banister/birch/birch_banister_tall_extended", + "y": 270 + }, + "extended=true,facing=north,shape=connected": { + "model": "twilightforest:block/wood/banister/birch/birch_banister_connected_extended", + "y": 180 + }, + "extended=true,facing=north,shape=short": { + "model": "twilightforest:block/wood/banister/birch/birch_banister_short_extended", + "y": 180 + }, + "extended=true,facing=north,shape=tall": { + "model": "twilightforest:block/wood/banister/birch/birch_banister_tall_extended", + "y": 180 + }, + "extended=true,facing=south,shape=connected": { + "model": "twilightforest:block/wood/banister/birch/birch_banister_connected_extended" + }, + "extended=true,facing=south,shape=short": { + "model": "twilightforest:block/wood/banister/birch/birch_banister_short_extended" + }, + "extended=true,facing=south,shape=tall": { + "model": "twilightforest:block/wood/banister/birch/birch_banister_tall_extended" + }, + "extended=true,facing=west,shape=connected": { + "model": "twilightforest:block/wood/banister/birch/birch_banister_connected_extended", + "y": 90 + }, + "extended=true,facing=west,shape=short": { + "model": "twilightforest:block/wood/banister/birch/birch_banister_short_extended", + "y": 90 + }, + "extended=true,facing=west,shape=tall": { + "model": "twilightforest:block/wood/banister/birch/birch_banister_tall_extended", + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/blue_castle_door.json b/src/generated/resources/assets/twilightforest/blockstates/blue_castle_door.json new file mode 100644 index 0000000000..f3c53d5598 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/blue_castle_door.json @@ -0,0 +1,16 @@ +{ + "variants": { + "active=false,vanish=false": { + "model": "twilightforest:block/blue_castle_door" + }, + "active=false,vanish=true": { + "model": "twilightforest:block/blue_castle_door_vanished" + }, + "active=true,vanish=false": { + "model": "twilightforest:block/blue_castle_door" + }, + "active=true,vanish=true": { + "model": "twilightforest:block/blue_castle_door_vanished" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/blue_castle_rune_brick.json b/src/generated/resources/assets/twilightforest/blockstates/blue_castle_rune_brick.json new file mode 100644 index 0000000000..057df861ac --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/blue_castle_rune_brick.json @@ -0,0 +1,30 @@ +{ + "variants": { + "": [ + { + "model": "twilightforest:block/castle_rune_brick_0" + }, + { + "model": "twilightforest:block/castle_rune_brick_1" + }, + { + "model": "twilightforest:block/castle_rune_brick_2" + }, + { + "model": "twilightforest:block/castle_rune_brick_3" + }, + { + "model": "twilightforest:block/castle_rune_brick_4" + }, + { + "model": "twilightforest:block/castle_rune_brick_5" + }, + { + "model": "twilightforest:block/castle_rune_brick_6" + }, + { + "model": "twilightforest:block/castle_rune_brick_7" + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/blue_force_field.json b/src/generated/resources/assets/twilightforest/blockstates/blue_force_field.json new file mode 100644 index 0000000000..8b3fa8ea30 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/blue_force_field.json @@ -0,0 +1,1036 @@ +{ + "multipart": [ + { + "apply": { + "model": "twilightforest:block/force_field/blue_force_field_west", + "uvlock": true + }, + "when": { + "west": "true" + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/blue_force_field_no_west", + "uvlock": true + }, + "when": { + "west": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/blue_force_field_east", + "uvlock": true + }, + "when": { + "east": "true" + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/blue_force_field_no_east", + "uvlock": true + }, + "when": { + "east": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/blue_force_field_down", + "uvlock": true + }, + "when": { + "down": "true" + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/blue_force_field_no_down", + "uvlock": true + }, + "when": { + "down": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/blue_force_field_up", + "uvlock": true + }, + "when": { + "up": "true" + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/blue_force_field_no_up", + "uvlock": true + }, + "when": { + "up": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/blue_force_field_north", + "uvlock": true + }, + "when": { + "north": "true" + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/blue_force_field_no_north", + "uvlock": true + }, + "when": { + "north": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/blue_force_field_south", + "uvlock": true + }, + "when": { + "south": "true" + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/blue_force_field_no_south", + "uvlock": true + }, + "when": { + "south": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/blue_force_field_down_west", + "uvlock": true + }, + "when": { + "OR": [ + { + "down": "true", + "north": "false", + "west": "true" + }, + { + "down": "true", + "south": "false", + "west": "true" + }, + { + "axis": "y|x", + "down": "true", + "west": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/blue_force_field_down_no_west", + "uvlock": true + }, + "when": { + "OR": [ + { + "down": "true", + "west": "false" + }, + { + "axis": "z", + "down": "true", + "north": "true", + "south": "true", + "west": "true" + }, + { + "axis": "z", + "down": "true", + "west": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/blue_force_field_west_no_down", + "uvlock": true + }, + "when": { + "OR": [ + { + "down": "false", + "west": "true" + }, + { + "axis": "z", + "down": "true", + "north": "true", + "south": "true", + "west": "true" + }, + { + "axis": "z", + "down": "true", + "west": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/blue_force_field_down_east", + "uvlock": true + }, + "when": { + "OR": [ + { + "down": "true", + "east": "true", + "north": "false" + }, + { + "down": "true", + "east": "true", + "south": "false" + }, + { + "axis": "y|x", + "down": "true", + "east": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/blue_force_field_down_no_east", + "uvlock": true + }, + "when": { + "OR": [ + { + "down": "true", + "east": "false" + }, + { + "axis": "z", + "down": "true", + "east": "true", + "north": "true", + "south": "true" + }, + { + "axis": "z", + "down": "true", + "east": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/blue_force_field_east_no_down", + "uvlock": true + }, + "when": { + "OR": [ + { + "down": "false", + "east": "true" + }, + { + "axis": "z", + "down": "true", + "east": "true", + "north": "true", + "south": "true" + }, + { + "axis": "z", + "down": "true", + "east": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/blue_force_field_down_north", + "uvlock": true + }, + "when": { + "OR": [ + { + "down": "true", + "north": "true", + "west": "false" + }, + { + "down": "true", + "east": "false", + "north": "true" + }, + { + "axis": "y|z", + "down": "true", + "north": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/blue_force_field_down_no_north", + "uvlock": true + }, + "when": { + "OR": [ + { + "down": "true", + "north": "false" + }, + { + "axis": "x", + "down": "true", + "east": "true", + "north": "true", + "west": "true" + }, + { + "axis": "x", + "down": "true", + "north": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/blue_force_field_north_no_down", + "uvlock": true + }, + "when": { + "OR": [ + { + "down": "false", + "north": "true" + }, + { + "axis": "x", + "down": "true", + "east": "true", + "north": "true", + "west": "true" + }, + { + "axis": "x", + "down": "true", + "north": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/blue_force_field_down_south", + "uvlock": true + }, + "when": { + "OR": [ + { + "down": "true", + "south": "true", + "west": "false" + }, + { + "down": "true", + "east": "false", + "south": "true" + }, + { + "axis": "y|z", + "down": "true", + "south": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/blue_force_field_down_no_south", + "uvlock": true + }, + "when": { + "OR": [ + { + "down": "true", + "south": "false" + }, + { + "axis": "x", + "down": "true", + "east": "true", + "south": "true", + "west": "true" + }, + { + "axis": "x", + "down": "true", + "south": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/blue_force_field_south_no_down", + "uvlock": true + }, + "when": { + "OR": [ + { + "down": "false", + "south": "true" + }, + { + "axis": "x", + "down": "true", + "east": "true", + "south": "true", + "west": "true" + }, + { + "axis": "x", + "down": "true", + "south": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/blue_force_field_up_west", + "uvlock": true + }, + "when": { + "OR": [ + { + "north": "false", + "up": "true", + "west": "true" + }, + { + "south": "false", + "up": "true", + "west": "true" + }, + { + "axis": "y|x", + "up": "true", + "west": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/blue_force_field_up_no_west", + "uvlock": true + }, + "when": { + "OR": [ + { + "up": "true", + "west": "false" + }, + { + "axis": "z", + "north": "true", + "south": "true", + "up": "true", + "west": "true" + }, + { + "axis": "z", + "up": "true", + "west": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/blue_force_field_west_no_up", + "uvlock": true + }, + "when": { + "OR": [ + { + "up": "false", + "west": "true" + }, + { + "axis": "z", + "north": "true", + "south": "true", + "up": "true", + "west": "true" + }, + { + "axis": "z", + "up": "true", + "west": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/blue_force_field_up_east", + "uvlock": true + }, + "when": { + "OR": [ + { + "east": "true", + "north": "false", + "up": "true" + }, + { + "east": "true", + "south": "false", + "up": "true" + }, + { + "axis": "y|x", + "east": "true", + "up": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/blue_force_field_up_no_east", + "uvlock": true + }, + "when": { + "OR": [ + { + "east": "false", + "up": "true" + }, + { + "axis": "z", + "east": "true", + "north": "true", + "south": "true", + "up": "true" + }, + { + "axis": "z", + "east": "true", + "up": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/blue_force_field_east_no_up", + "uvlock": true + }, + "when": { + "OR": [ + { + "east": "true", + "up": "false" + }, + { + "axis": "z", + "east": "true", + "north": "true", + "south": "true", + "up": "true" + }, + { + "axis": "z", + "east": "true", + "up": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/blue_force_field_up_north", + "uvlock": true + }, + "when": { + "OR": [ + { + "north": "true", + "up": "true", + "west": "false" + }, + { + "east": "false", + "north": "true", + "up": "true" + }, + { + "axis": "y|z", + "north": "true", + "up": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/blue_force_field_up_no_north", + "uvlock": true + }, + "when": { + "OR": [ + { + "north": "false", + "up": "true" + }, + { + "axis": "x", + "east": "true", + "north": "true", + "up": "true", + "west": "true" + }, + { + "axis": "x", + "north": "true", + "up": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/blue_force_field_north_no_up", + "uvlock": true + }, + "when": { + "OR": [ + { + "north": "true", + "up": "false" + }, + { + "axis": "x", + "east": "true", + "north": "true", + "up": "true", + "west": "true" + }, + { + "axis": "x", + "north": "true", + "up": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/blue_force_field_up_south", + "uvlock": true + }, + "when": { + "OR": [ + { + "south": "true", + "up": "true", + "west": "false" + }, + { + "east": "false", + "south": "true", + "up": "true" + }, + { + "axis": "y|z", + "south": "true", + "up": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/blue_force_field_up_no_south", + "uvlock": true + }, + "when": { + "OR": [ + { + "south": "false", + "up": "true" + }, + { + "axis": "x", + "east": "true", + "south": "true", + "up": "true", + "west": "true" + }, + { + "axis": "x", + "south": "true", + "up": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/blue_force_field_south_no_up", + "uvlock": true + }, + "when": { + "OR": [ + { + "south": "true", + "up": "false" + }, + { + "axis": "x", + "east": "true", + "south": "true", + "up": "true", + "west": "true" + }, + { + "axis": "x", + "south": "true", + "up": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/blue_force_field_north_west", + "uvlock": true + }, + "when": { + "OR": [ + { + "down": "false", + "north": "true", + "west": "true" + }, + { + "north": "true", + "up": "false", + "west": "true" + }, + { + "axis": "x|z", + "north": "true", + "west": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/blue_force_field_north_no_west", + "uvlock": true + }, + "when": { + "OR": [ + { + "north": "true", + "west": "false" + }, + { + "axis": "y", + "down": "true", + "north": "true", + "up": "true", + "west": "true" + }, + { + "axis": "y", + "north": "true", + "west": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/blue_force_field_west_no_north", + "uvlock": true + }, + "when": { + "OR": [ + { + "north": "false", + "west": "true" + }, + { + "axis": "y", + "down": "true", + "north": "true", + "up": "true", + "west": "true" + }, + { + "axis": "y", + "north": "true", + "west": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/blue_force_field_north_east", + "uvlock": true + }, + "when": { + "OR": [ + { + "down": "false", + "east": "true", + "north": "true" + }, + { + "east": "true", + "north": "true", + "up": "false" + }, + { + "axis": "x|z", + "east": "true", + "north": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/blue_force_field_north_no_east", + "uvlock": true + }, + "when": { + "OR": [ + { + "east": "false", + "north": "true" + }, + { + "axis": "y", + "down": "true", + "east": "true", + "north": "true", + "up": "true" + }, + { + "axis": "y", + "east": "true", + "north": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/blue_force_field_east_no_north", + "uvlock": true + }, + "when": { + "OR": [ + { + "east": "true", + "north": "false" + }, + { + "axis": "y", + "down": "true", + "east": "true", + "north": "true", + "up": "true" + }, + { + "axis": "y", + "east": "true", + "north": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/blue_force_field_south_west", + "uvlock": true + }, + "when": { + "OR": [ + { + "down": "false", + "south": "true", + "west": "true" + }, + { + "south": "true", + "up": "false", + "west": "true" + }, + { + "axis": "x|z", + "south": "true", + "west": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/blue_force_field_south_no_west", + "uvlock": true + }, + "when": { + "OR": [ + { + "south": "true", + "west": "false" + }, + { + "axis": "y", + "down": "true", + "south": "true", + "up": "true", + "west": "true" + }, + { + "axis": "y", + "south": "true", + "west": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/blue_force_field_west_no_south", + "uvlock": true + }, + "when": { + "OR": [ + { + "south": "false", + "west": "true" + }, + { + "axis": "y", + "down": "true", + "south": "true", + "up": "true", + "west": "true" + }, + { + "axis": "y", + "south": "true", + "west": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/blue_force_field_south_east", + "uvlock": true + }, + "when": { + "OR": [ + { + "down": "false", + "east": "true", + "south": "true" + }, + { + "east": "true", + "south": "true", + "up": "false" + }, + { + "axis": "x|z", + "east": "true", + "south": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/blue_force_field_south_no_east", + "uvlock": true + }, + "when": { + "OR": [ + { + "east": "false", + "south": "true" + }, + { + "axis": "y", + "down": "true", + "east": "true", + "south": "true", + "up": "true" + }, + { + "axis": "y", + "east": "true", + "south": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/blue_force_field_east_no_south", + "uvlock": true + }, + "when": { + "OR": [ + { + "east": "true", + "south": "false" + }, + { + "axis": "y", + "down": "true", + "east": "true", + "south": "true", + "up": "true" + }, + { + "axis": "y", + "east": "true", + "south": "true" + } + ] + } + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/bold_castle_brick_pillar.json b/src/generated/resources/assets/twilightforest/blockstates/bold_castle_brick_pillar.json new file mode 100644 index 0000000000..7c631e198a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/bold_castle_brick_pillar.json @@ -0,0 +1,16 @@ +{ + "variants": { + "axis=x": { + "model": "twilightforest:block/bold_castle_brick_pillar_x", + "x": 90, + "y": 90 + }, + "axis=y": { + "model": "twilightforest:block/bold_castle_brick_pillar" + }, + "axis=z": { + "model": "twilightforest:block/bold_castle_brick_pillar_z", + "x": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/bold_castle_brick_stairs.json b/src/generated/resources/assets/twilightforest/blockstates/bold_castle_brick_stairs.json new file mode 100644 index 0000000000..bde8115516 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/bold_castle_brick_stairs.json @@ -0,0 +1,209 @@ +{ + "variants": { + "facing=east,half=bottom,shape=inner_left": { + "model": "twilightforest:block/bold_castle_brick_stairs_inner", + "uvlock": true, + "y": 270 + }, + "facing=east,half=bottom,shape=inner_right": { + "model": "twilightforest:block/bold_castle_brick_stairs_inner" + }, + "facing=east,half=bottom,shape=outer_left": { + "model": "twilightforest:block/bold_castle_brick_stairs_outer", + "uvlock": true, + "y": 270 + }, + "facing=east,half=bottom,shape=outer_right": { + "model": "twilightforest:block/bold_castle_brick_stairs_outer" + }, + "facing=east,half=bottom,shape=straight": { + "model": "twilightforest:block/bold_castle_brick_stairs" + }, + "facing=east,half=top,shape=inner_left": { + "model": "twilightforest:block/bold_castle_brick_stairs_inner", + "uvlock": true, + "x": 180 + }, + "facing=east,half=top,shape=inner_right": { + "model": "twilightforest:block/bold_castle_brick_stairs_inner", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=east,half=top,shape=outer_left": { + "model": "twilightforest:block/bold_castle_brick_stairs_outer", + "uvlock": true, + "x": 180 + }, + "facing=east,half=top,shape=outer_right": { + "model": "twilightforest:block/bold_castle_brick_stairs_outer", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=east,half=top,shape=straight": { + "model": "twilightforest:block/bold_castle_brick_stairs", + "uvlock": true, + "x": 180 + }, + "facing=north,half=bottom,shape=inner_left": { + "model": "twilightforest:block/bold_castle_brick_stairs_inner", + "uvlock": true, + "y": 180 + }, + "facing=north,half=bottom,shape=inner_right": { + "model": "twilightforest:block/bold_castle_brick_stairs_inner", + "uvlock": true, + "y": 270 + }, + "facing=north,half=bottom,shape=outer_left": { + "model": "twilightforest:block/bold_castle_brick_stairs_outer", + "uvlock": true, + "y": 180 + }, + "facing=north,half=bottom,shape=outer_right": { + "model": "twilightforest:block/bold_castle_brick_stairs_outer", + "uvlock": true, + "y": 270 + }, + "facing=north,half=bottom,shape=straight": { + "model": "twilightforest:block/bold_castle_brick_stairs", + "uvlock": true, + "y": 270 + }, + "facing=north,half=top,shape=inner_left": { + "model": "twilightforest:block/bold_castle_brick_stairs_inner", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=north,half=top,shape=inner_right": { + "model": "twilightforest:block/bold_castle_brick_stairs_inner", + "uvlock": true, + "x": 180 + }, + "facing=north,half=top,shape=outer_left": { + "model": "twilightforest:block/bold_castle_brick_stairs_outer", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=north,half=top,shape=outer_right": { + "model": "twilightforest:block/bold_castle_brick_stairs_outer", + "uvlock": true, + "x": 180 + }, + "facing=north,half=top,shape=straight": { + "model": "twilightforest:block/bold_castle_brick_stairs", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=south,half=bottom,shape=inner_left": { + "model": "twilightforest:block/bold_castle_brick_stairs_inner" + }, + "facing=south,half=bottom,shape=inner_right": { + "model": "twilightforest:block/bold_castle_brick_stairs_inner", + "uvlock": true, + "y": 90 + }, + "facing=south,half=bottom,shape=outer_left": { + "model": "twilightforest:block/bold_castle_brick_stairs_outer" + }, + "facing=south,half=bottom,shape=outer_right": { + "model": "twilightforest:block/bold_castle_brick_stairs_outer", + "uvlock": true, + "y": 90 + }, + "facing=south,half=bottom,shape=straight": { + "model": "twilightforest:block/bold_castle_brick_stairs", + "uvlock": true, + "y": 90 + }, + "facing=south,half=top,shape=inner_left": { + "model": "twilightforest:block/bold_castle_brick_stairs_inner", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=south,half=top,shape=inner_right": { + "model": "twilightforest:block/bold_castle_brick_stairs_inner", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=south,half=top,shape=outer_left": { + "model": "twilightforest:block/bold_castle_brick_stairs_outer", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=south,half=top,shape=outer_right": { + "model": "twilightforest:block/bold_castle_brick_stairs_outer", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=south,half=top,shape=straight": { + "model": "twilightforest:block/bold_castle_brick_stairs", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=west,half=bottom,shape=inner_left": { + "model": "twilightforest:block/bold_castle_brick_stairs_inner", + "uvlock": true, + "y": 90 + }, + "facing=west,half=bottom,shape=inner_right": { + "model": "twilightforest:block/bold_castle_brick_stairs_inner", + "uvlock": true, + "y": 180 + }, + "facing=west,half=bottom,shape=outer_left": { + "model": "twilightforest:block/bold_castle_brick_stairs_outer", + "uvlock": true, + "y": 90 + }, + "facing=west,half=bottom,shape=outer_right": { + "model": "twilightforest:block/bold_castle_brick_stairs_outer", + "uvlock": true, + "y": 180 + }, + "facing=west,half=bottom,shape=straight": { + "model": "twilightforest:block/bold_castle_brick_stairs", + "uvlock": true, + "y": 180 + }, + "facing=west,half=top,shape=inner_left": { + "model": "twilightforest:block/bold_castle_brick_stairs_inner", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=west,half=top,shape=inner_right": { + "model": "twilightforest:block/bold_castle_brick_stairs_inner", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=west,half=top,shape=outer_left": { + "model": "twilightforest:block/bold_castle_brick_stairs_outer", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=west,half=top,shape=outer_right": { + "model": "twilightforest:block/bold_castle_brick_stairs_outer", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=west,half=top,shape=straight": { + "model": "twilightforest:block/bold_castle_brick_stairs", + "uvlock": true, + "x": 180, + "y": 180 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/bold_castle_brick_tile.json b/src/generated/resources/assets/twilightforest/blockstates/bold_castle_brick_tile.json new file mode 100644 index 0000000000..485f87d1ff --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/bold_castle_brick_tile.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/bold_castle_brick_tile" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/bold_stone_pillar.json b/src/generated/resources/assets/twilightforest/blockstates/bold_stone_pillar.json new file mode 100644 index 0000000000..580c818a43 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/bold_stone_pillar.json @@ -0,0 +1,16 @@ +{ + "variants": { + "axis=x": { + "model": "twilightforest:block/bold_stone_pillar_horizontal", + "x": 90, + "y": 90 + }, + "axis=y": { + "model": "twilightforest:block/bold_stone_pillar" + }, + "axis=z": { + "model": "twilightforest:block/bold_stone_pillar_horizontal", + "x": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/brown_thorns.json b/src/generated/resources/assets/twilightforest/blockstates/brown_thorns.json new file mode 100644 index 0000000000..90825dde62 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/brown_thorns.json @@ -0,0 +1,203 @@ +{ + "multipart": [ + { + "apply": { + "model": "twilightforest:block/brown_thorns_thorns" + }, + "when": { + "axis": "y" + } + }, + { + "apply": { + "model": "twilightforest:block/brown_thorns_thorns", + "x": 90 + }, + "when": { + "axis": "z" + } + }, + { + "apply": { + "model": "twilightforest:block/brown_thorns_thorns", + "x": 90, + "y": 90 + }, + "when": { + "axis": "x" + } + }, + { + "apply": { + "model": "twilightforest:block/brown_thorns_top", + "x": 90 + }, + "when": { + "up": "true" + } + }, + { + "apply": { + "model": "twilightforest:block/brown_thorns_no_section", + "x": 270 + }, + "when": { + "axis": "z|y", + "up": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/brown_thorns_no_section", + "x": 270, + "y": 90 + }, + "when": { + "axis": "x", + "up": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/brown_thorns_bottom", + "x": 90 + }, + "when": { + "down": "true" + } + }, + { + "apply": { + "model": "twilightforest:block/brown_thorns_no_section", + "x": 90 + }, + "when": { + "axis": "z|y", + "down": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/brown_thorns_no_section", + "x": 90, + "y": 90 + }, + "when": { + "axis": "x", + "down": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/brown_thorns_top", + "y": 270 + }, + "when": { + "east": "true" + } + }, + { + "apply": { + "model": "twilightforest:block/brown_thorns_no_section", + "y": 90 + }, + "when": { + "axis": "y|x", + "east": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/brown_thorns_no_section_alt", + "y": 90 + }, + "when": { + "axis": "z", + "east": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/brown_thorns_bottom", + "y": 270 + }, + "when": { + "west": "true" + } + }, + { + "apply": { + "model": "twilightforest:block/brown_thorns_no_section", + "y": 270 + }, + "when": { + "axis": "y|x", + "west": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/brown_thorns_no_section_alt", + "y": 270 + }, + "when": { + "axis": "z", + "west": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/brown_thorns_top" + }, + "when": { + "south": "true" + } + }, + { + "apply": { + "model": "twilightforest:block/brown_thorns_no_section", + "y": 180 + }, + "when": { + "axis": "y|z", + "south": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/brown_thorns_no_section_alt", + "y": 180 + }, + "when": { + "axis": "x", + "south": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/brown_thorns_bottom" + }, + "when": { + "north": "true" + } + }, + { + "apply": { + "model": "twilightforest:block/brown_thorns_no_section" + }, + "when": { + "axis": "y|z", + "north": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/brown_thorns_no_section_alt" + }, + "when": { + "axis": "x", + "north": "false" + } + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/built_block.json b/src/generated/resources/assets/twilightforest/blockstates/built_block.json new file mode 100644 index 0000000000..f522189a91 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/built_block.json @@ -0,0 +1,10 @@ +{ + "variants": { + "active=false": { + "model": "twilightforest:block/built_block" + }, + "active=true": { + "model": "twilightforest:block/built_block_active" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/burnt_thorns.json b/src/generated/resources/assets/twilightforest/blockstates/burnt_thorns.json new file mode 100644 index 0000000000..d3455f57ea --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/burnt_thorns.json @@ -0,0 +1,203 @@ +{ + "multipart": [ + { + "apply": { + "model": "twilightforest:block/burnt_thorns_thorns" + }, + "when": { + "axis": "y" + } + }, + { + "apply": { + "model": "twilightforest:block/burnt_thorns_thorns", + "x": 90 + }, + "when": { + "axis": "z" + } + }, + { + "apply": { + "model": "twilightforest:block/burnt_thorns_thorns", + "x": 90, + "y": 90 + }, + "when": { + "axis": "x" + } + }, + { + "apply": { + "model": "twilightforest:block/burnt_thorns_top", + "x": 90 + }, + "when": { + "up": "true" + } + }, + { + "apply": { + "model": "twilightforest:block/burnt_thorns_no_section", + "x": 270 + }, + "when": { + "axis": "z|y", + "up": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/burnt_thorns_no_section", + "x": 270, + "y": 90 + }, + "when": { + "axis": "x", + "up": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/burnt_thorns_bottom", + "x": 90 + }, + "when": { + "down": "true" + } + }, + { + "apply": { + "model": "twilightforest:block/burnt_thorns_no_section", + "x": 90 + }, + "when": { + "axis": "z|y", + "down": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/burnt_thorns_no_section", + "x": 90, + "y": 90 + }, + "when": { + "axis": "x", + "down": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/burnt_thorns_top", + "y": 270 + }, + "when": { + "east": "true" + } + }, + { + "apply": { + "model": "twilightforest:block/burnt_thorns_no_section", + "y": 90 + }, + "when": { + "axis": "y|x", + "east": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/burnt_thorns_no_section_alt", + "y": 90 + }, + "when": { + "axis": "z", + "east": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/burnt_thorns_bottom", + "y": 270 + }, + "when": { + "west": "true" + } + }, + { + "apply": { + "model": "twilightforest:block/burnt_thorns_no_section", + "y": 270 + }, + "when": { + "axis": "y|x", + "west": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/burnt_thorns_no_section_alt", + "y": 270 + }, + "when": { + "axis": "z", + "west": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/burnt_thorns_top" + }, + "when": { + "south": "true" + } + }, + { + "apply": { + "model": "twilightforest:block/burnt_thorns_no_section", + "y": 180 + }, + "when": { + "axis": "y|z", + "south": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/burnt_thorns_no_section_alt", + "y": 180 + }, + "when": { + "axis": "x", + "south": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/burnt_thorns_bottom" + }, + "when": { + "north": "true" + } + }, + { + "apply": { + "model": "twilightforest:block/burnt_thorns_no_section" + }, + "when": { + "axis": "y|z", + "north": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/burnt_thorns_no_section_alt" + }, + "when": { + "axis": "x", + "north": "false" + } + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/candelabra.json b/src/generated/resources/assets/twilightforest/blockstates/candelabra.json new file mode 100644 index 0000000000..5a02fe1821 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/candelabra.json @@ -0,0 +1,1540 @@ +{ + "variants": { + "facing=east,lighting=none,on_wall=false,waterlogged=false": [ + { + "model": "twilightforest:block/candelabra_4_4_4_plain", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_5_4_4_plain", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_4_5_4_plain", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_5_5_4_plain", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_4_4_5_plain", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_5_4_5_plain", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_4_5_5_plain", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_5_5_5_plain", + "y": 270 + } + ], + "facing=east,lighting=none,on_wall=false,waterlogged=true": [ + { + "model": "twilightforest:block/candelabra_4_4_4_plain", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_5_4_4_plain", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_4_5_4_plain", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_5_5_4_plain", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_4_4_5_plain", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_5_4_5_plain", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_4_5_5_plain", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_5_5_5_plain", + "y": 270 + } + ], + "facing=east,lighting=none,on_wall=true,waterlogged=false": [ + { + "model": "twilightforest:block/candelabra_wall_4_4_4_plain", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_wall_5_4_4_plain", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_wall_4_5_4_plain", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_wall_5_5_4_plain", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_wall_4_4_5_plain", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_wall_5_4_5_plain", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_wall_4_5_5_plain", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_wall_5_5_5_plain", + "y": 270 + } + ], + "facing=east,lighting=none,on_wall=true,waterlogged=true": [ + { + "model": "twilightforest:block/candelabra_wall_4_4_4_plain", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_wall_5_4_4_plain", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_wall_4_5_4_plain", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_wall_5_5_4_plain", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_wall_4_4_5_plain", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_wall_5_4_5_plain", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_wall_4_5_5_plain", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_wall_5_5_5_plain", + "y": 270 + } + ], + "facing=east,lighting=normal,on_wall=false,waterlogged=false": [ + { + "model": "twilightforest:block/candelabra_4_4_4_plain_lit", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_5_4_4_plain_lit", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_4_5_4_plain_lit", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_5_5_4_plain_lit", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_4_4_5_plain_lit", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_5_4_5_plain_lit", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_4_5_5_plain_lit", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_5_5_5_plain_lit", + "y": 270 + } + ], + "facing=east,lighting=normal,on_wall=false,waterlogged=true": [ + { + "model": "twilightforest:block/candelabra_4_4_4_plain_lit", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_5_4_4_plain_lit", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_4_5_4_plain_lit", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_5_5_4_plain_lit", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_4_4_5_plain_lit", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_5_4_5_plain_lit", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_4_5_5_plain_lit", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_5_5_5_plain_lit", + "y": 270 + } + ], + "facing=east,lighting=normal,on_wall=true,waterlogged=false": [ + { + "model": "twilightforest:block/candelabra_wall_4_4_4_plain_lit", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_wall_5_4_4_plain_lit", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_wall_4_5_4_plain_lit", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_wall_5_5_4_plain_lit", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_wall_4_4_5_plain_lit", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_wall_5_4_5_plain_lit", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_wall_4_5_5_plain_lit", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_wall_5_5_5_plain_lit", + "y": 270 + } + ], + "facing=east,lighting=normal,on_wall=true,waterlogged=true": [ + { + "model": "twilightforest:block/candelabra_wall_4_4_4_plain_lit", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_wall_5_4_4_plain_lit", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_wall_4_5_4_plain_lit", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_wall_5_5_4_plain_lit", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_wall_4_4_5_plain_lit", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_wall_5_4_5_plain_lit", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_wall_4_5_5_plain_lit", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_wall_5_5_5_plain_lit", + "y": 270 + } + ], + "facing=east,lighting=ominous,on_wall=false,waterlogged=false": [ + { + "model": "twilightforest:block/candelabra_4_4_4_plain_lit", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_5_4_4_plain_lit", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_4_5_4_plain_lit", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_5_5_4_plain_lit", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_4_4_5_plain_lit", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_5_4_5_plain_lit", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_4_5_5_plain_lit", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_5_5_5_plain_lit", + "y": 270 + } + ], + "facing=east,lighting=ominous,on_wall=false,waterlogged=true": [ + { + "model": "twilightforest:block/candelabra_4_4_4_plain_lit", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_5_4_4_plain_lit", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_4_5_4_plain_lit", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_5_5_4_plain_lit", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_4_4_5_plain_lit", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_5_4_5_plain_lit", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_4_5_5_plain_lit", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_5_5_5_plain_lit", + "y": 270 + } + ], + "facing=east,lighting=ominous,on_wall=true,waterlogged=false": [ + { + "model": "twilightforest:block/candelabra_wall_4_4_4_plain_lit", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_wall_5_4_4_plain_lit", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_wall_4_5_4_plain_lit", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_wall_5_5_4_plain_lit", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_wall_4_4_5_plain_lit", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_wall_5_4_5_plain_lit", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_wall_4_5_5_plain_lit", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_wall_5_5_5_plain_lit", + "y": 270 + } + ], + "facing=east,lighting=ominous,on_wall=true,waterlogged=true": [ + { + "model": "twilightforest:block/candelabra_wall_4_4_4_plain_lit", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_wall_5_4_4_plain_lit", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_wall_4_5_4_plain_lit", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_wall_5_5_4_plain_lit", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_wall_4_4_5_plain_lit", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_wall_5_4_5_plain_lit", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_wall_4_5_5_plain_lit", + "y": 270 + }, + { + "model": "twilightforest:block/candelabra_wall_5_5_5_plain_lit", + "y": 270 + } + ], + "facing=north,lighting=none,on_wall=false,waterlogged=false": [ + { + "model": "twilightforest:block/candelabra_4_4_4_plain", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_5_4_4_plain", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_4_5_4_plain", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_5_5_4_plain", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_4_4_5_plain", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_5_4_5_plain", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_4_5_5_plain", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_5_5_5_plain", + "y": 180 + } + ], + "facing=north,lighting=none,on_wall=false,waterlogged=true": [ + { + "model": "twilightforest:block/candelabra_4_4_4_plain", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_5_4_4_plain", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_4_5_4_plain", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_5_5_4_plain", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_4_4_5_plain", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_5_4_5_plain", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_4_5_5_plain", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_5_5_5_plain", + "y": 180 + } + ], + "facing=north,lighting=none,on_wall=true,waterlogged=false": [ + { + "model": "twilightforest:block/candelabra_wall_4_4_4_plain", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_wall_5_4_4_plain", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_wall_4_5_4_plain", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_wall_5_5_4_plain", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_wall_4_4_5_plain", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_wall_5_4_5_plain", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_wall_4_5_5_plain", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_wall_5_5_5_plain", + "y": 180 + } + ], + "facing=north,lighting=none,on_wall=true,waterlogged=true": [ + { + "model": "twilightforest:block/candelabra_wall_4_4_4_plain", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_wall_5_4_4_plain", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_wall_4_5_4_plain", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_wall_5_5_4_plain", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_wall_4_4_5_plain", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_wall_5_4_5_plain", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_wall_4_5_5_plain", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_wall_5_5_5_plain", + "y": 180 + } + ], + "facing=north,lighting=normal,on_wall=false,waterlogged=false": [ + { + "model": "twilightforest:block/candelabra_4_4_4_plain_lit", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_5_4_4_plain_lit", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_4_5_4_plain_lit", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_5_5_4_plain_lit", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_4_4_5_plain_lit", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_5_4_5_plain_lit", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_4_5_5_plain_lit", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_5_5_5_plain_lit", + "y": 180 + } + ], + "facing=north,lighting=normal,on_wall=false,waterlogged=true": [ + { + "model": "twilightforest:block/candelabra_4_4_4_plain_lit", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_5_4_4_plain_lit", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_4_5_4_plain_lit", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_5_5_4_plain_lit", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_4_4_5_plain_lit", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_5_4_5_plain_lit", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_4_5_5_plain_lit", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_5_5_5_plain_lit", + "y": 180 + } + ], + "facing=north,lighting=normal,on_wall=true,waterlogged=false": [ + { + "model": "twilightforest:block/candelabra_wall_4_4_4_plain_lit", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_wall_5_4_4_plain_lit", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_wall_4_5_4_plain_lit", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_wall_5_5_4_plain_lit", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_wall_4_4_5_plain_lit", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_wall_5_4_5_plain_lit", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_wall_4_5_5_plain_lit", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_wall_5_5_5_plain_lit", + "y": 180 + } + ], + "facing=north,lighting=normal,on_wall=true,waterlogged=true": [ + { + "model": "twilightforest:block/candelabra_wall_4_4_4_plain_lit", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_wall_5_4_4_plain_lit", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_wall_4_5_4_plain_lit", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_wall_5_5_4_plain_lit", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_wall_4_4_5_plain_lit", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_wall_5_4_5_plain_lit", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_wall_4_5_5_plain_lit", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_wall_5_5_5_plain_lit", + "y": 180 + } + ], + "facing=north,lighting=ominous,on_wall=false,waterlogged=false": [ + { + "model": "twilightforest:block/candelabra_4_4_4_plain_lit", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_5_4_4_plain_lit", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_4_5_4_plain_lit", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_5_5_4_plain_lit", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_4_4_5_plain_lit", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_5_4_5_plain_lit", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_4_5_5_plain_lit", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_5_5_5_plain_lit", + "y": 180 + } + ], + "facing=north,lighting=ominous,on_wall=false,waterlogged=true": [ + { + "model": "twilightforest:block/candelabra_4_4_4_plain_lit", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_5_4_4_plain_lit", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_4_5_4_plain_lit", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_5_5_4_plain_lit", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_4_4_5_plain_lit", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_5_4_5_plain_lit", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_4_5_5_plain_lit", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_5_5_5_plain_lit", + "y": 180 + } + ], + "facing=north,lighting=ominous,on_wall=true,waterlogged=false": [ + { + "model": "twilightforest:block/candelabra_wall_4_4_4_plain_lit", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_wall_5_4_4_plain_lit", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_wall_4_5_4_plain_lit", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_wall_5_5_4_plain_lit", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_wall_4_4_5_plain_lit", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_wall_5_4_5_plain_lit", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_wall_4_5_5_plain_lit", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_wall_5_5_5_plain_lit", + "y": 180 + } + ], + "facing=north,lighting=ominous,on_wall=true,waterlogged=true": [ + { + "model": "twilightforest:block/candelabra_wall_4_4_4_plain_lit", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_wall_5_4_4_plain_lit", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_wall_4_5_4_plain_lit", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_wall_5_5_4_plain_lit", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_wall_4_4_5_plain_lit", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_wall_5_4_5_plain_lit", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_wall_4_5_5_plain_lit", + "y": 180 + }, + { + "model": "twilightforest:block/candelabra_wall_5_5_5_plain_lit", + "y": 180 + } + ], + "facing=south,lighting=none,on_wall=false,waterlogged=false": [ + { + "model": "twilightforest:block/candelabra_4_4_4_plain" + }, + { + "model": "twilightforest:block/candelabra_5_4_4_plain" + }, + { + "model": "twilightforest:block/candelabra_4_5_4_plain" + }, + { + "model": "twilightforest:block/candelabra_5_5_4_plain" + }, + { + "model": "twilightforest:block/candelabra_4_4_5_plain" + }, + { + "model": "twilightforest:block/candelabra_5_4_5_plain" + }, + { + "model": "twilightforest:block/candelabra_4_5_5_plain" + }, + { + "model": "twilightforest:block/candelabra_5_5_5_plain" + } + ], + "facing=south,lighting=none,on_wall=false,waterlogged=true": [ + { + "model": "twilightforest:block/candelabra_4_4_4_plain" + }, + { + "model": "twilightforest:block/candelabra_5_4_4_plain" + }, + { + "model": "twilightforest:block/candelabra_4_5_4_plain" + }, + { + "model": "twilightforest:block/candelabra_5_5_4_plain" + }, + { + "model": "twilightforest:block/candelabra_4_4_5_plain" + }, + { + "model": "twilightforest:block/candelabra_5_4_5_plain" + }, + { + "model": "twilightforest:block/candelabra_4_5_5_plain" + }, + { + "model": "twilightforest:block/candelabra_5_5_5_plain" + } + ], + "facing=south,lighting=none,on_wall=true,waterlogged=false": [ + { + "model": "twilightforest:block/candelabra_wall_4_4_4_plain" + }, + { + "model": "twilightforest:block/candelabra_wall_5_4_4_plain" + }, + { + "model": "twilightforest:block/candelabra_wall_4_5_4_plain" + }, + { + "model": "twilightforest:block/candelabra_wall_5_5_4_plain" + }, + { + "model": "twilightforest:block/candelabra_wall_4_4_5_plain" + }, + { + "model": "twilightforest:block/candelabra_wall_5_4_5_plain" + }, + { + "model": "twilightforest:block/candelabra_wall_4_5_5_plain" + }, + { + "model": "twilightforest:block/candelabra_wall_5_5_5_plain" + } + ], + "facing=south,lighting=none,on_wall=true,waterlogged=true": [ + { + "model": "twilightforest:block/candelabra_wall_4_4_4_plain" + }, + { + "model": "twilightforest:block/candelabra_wall_5_4_4_plain" + }, + { + "model": "twilightforest:block/candelabra_wall_4_5_4_plain" + }, + { + "model": "twilightforest:block/candelabra_wall_5_5_4_plain" + }, + { + "model": "twilightforest:block/candelabra_wall_4_4_5_plain" + }, + { + "model": "twilightforest:block/candelabra_wall_5_4_5_plain" + }, + { + "model": "twilightforest:block/candelabra_wall_4_5_5_plain" + }, + { + "model": "twilightforest:block/candelabra_wall_5_5_5_plain" + } + ], + "facing=south,lighting=normal,on_wall=false,waterlogged=false": [ + { + "model": "twilightforest:block/candelabra_4_4_4_plain_lit" + }, + { + "model": "twilightforest:block/candelabra_5_4_4_plain_lit" + }, + { + "model": "twilightforest:block/candelabra_4_5_4_plain_lit" + }, + { + "model": "twilightforest:block/candelabra_5_5_4_plain_lit" + }, + { + "model": "twilightforest:block/candelabra_4_4_5_plain_lit" + }, + { + "model": "twilightforest:block/candelabra_5_4_5_plain_lit" + }, + { + "model": "twilightforest:block/candelabra_4_5_5_plain_lit" + }, + { + "model": "twilightforest:block/candelabra_5_5_5_plain_lit" + } + ], + "facing=south,lighting=normal,on_wall=false,waterlogged=true": [ + { + "model": "twilightforest:block/candelabra_4_4_4_plain_lit" + }, + { + "model": "twilightforest:block/candelabra_5_4_4_plain_lit" + }, + { + "model": "twilightforest:block/candelabra_4_5_4_plain_lit" + }, + { + "model": "twilightforest:block/candelabra_5_5_4_plain_lit" + }, + { + "model": "twilightforest:block/candelabra_4_4_5_plain_lit" + }, + { + "model": "twilightforest:block/candelabra_5_4_5_plain_lit" + }, + { + "model": "twilightforest:block/candelabra_4_5_5_plain_lit" + }, + { + "model": "twilightforest:block/candelabra_5_5_5_plain_lit" + } + ], + "facing=south,lighting=normal,on_wall=true,waterlogged=false": [ + { + "model": "twilightforest:block/candelabra_wall_4_4_4_plain_lit" + }, + { + "model": "twilightforest:block/candelabra_wall_5_4_4_plain_lit" + }, + { + "model": "twilightforest:block/candelabra_wall_4_5_4_plain_lit" + }, + { + "model": "twilightforest:block/candelabra_wall_5_5_4_plain_lit" + }, + { + "model": "twilightforest:block/candelabra_wall_4_4_5_plain_lit" + }, + { + "model": "twilightforest:block/candelabra_wall_5_4_5_plain_lit" + }, + { + "model": "twilightforest:block/candelabra_wall_4_5_5_plain_lit" + }, + { + "model": "twilightforest:block/candelabra_wall_5_5_5_plain_lit" + } + ], + "facing=south,lighting=normal,on_wall=true,waterlogged=true": [ + { + "model": "twilightforest:block/candelabra_wall_4_4_4_plain_lit" + }, + { + "model": "twilightforest:block/candelabra_wall_5_4_4_plain_lit" + }, + { + "model": "twilightforest:block/candelabra_wall_4_5_4_plain_lit" + }, + { + "model": "twilightforest:block/candelabra_wall_5_5_4_plain_lit" + }, + { + "model": "twilightforest:block/candelabra_wall_4_4_5_plain_lit" + }, + { + "model": "twilightforest:block/candelabra_wall_5_4_5_plain_lit" + }, + { + "model": "twilightforest:block/candelabra_wall_4_5_5_plain_lit" + }, + { + "model": "twilightforest:block/candelabra_wall_5_5_5_plain_lit" + } + ], + "facing=south,lighting=ominous,on_wall=false,waterlogged=false": [ + { + "model": "twilightforest:block/candelabra_4_4_4_plain_lit" + }, + { + "model": "twilightforest:block/candelabra_5_4_4_plain_lit" + }, + { + "model": "twilightforest:block/candelabra_4_5_4_plain_lit" + }, + { + "model": "twilightforest:block/candelabra_5_5_4_plain_lit" + }, + { + "model": "twilightforest:block/candelabra_4_4_5_plain_lit" + }, + { + "model": "twilightforest:block/candelabra_5_4_5_plain_lit" + }, + { + "model": "twilightforest:block/candelabra_4_5_5_plain_lit" + }, + { + "model": "twilightforest:block/candelabra_5_5_5_plain_lit" + } + ], + "facing=south,lighting=ominous,on_wall=false,waterlogged=true": [ + { + "model": "twilightforest:block/candelabra_4_4_4_plain_lit" + }, + { + "model": "twilightforest:block/candelabra_5_4_4_plain_lit" + }, + { + "model": "twilightforest:block/candelabra_4_5_4_plain_lit" + }, + { + "model": "twilightforest:block/candelabra_5_5_4_plain_lit" + }, + { + "model": "twilightforest:block/candelabra_4_4_5_plain_lit" + }, + { + "model": "twilightforest:block/candelabra_5_4_5_plain_lit" + }, + { + "model": "twilightforest:block/candelabra_4_5_5_plain_lit" + }, + { + "model": "twilightforest:block/candelabra_5_5_5_plain_lit" + } + ], + "facing=south,lighting=ominous,on_wall=true,waterlogged=false": [ + { + "model": "twilightforest:block/candelabra_wall_4_4_4_plain_lit" + }, + { + "model": "twilightforest:block/candelabra_wall_5_4_4_plain_lit" + }, + { + "model": "twilightforest:block/candelabra_wall_4_5_4_plain_lit" + }, + { + "model": "twilightforest:block/candelabra_wall_5_5_4_plain_lit" + }, + { + "model": "twilightforest:block/candelabra_wall_4_4_5_plain_lit" + }, + { + "model": "twilightforest:block/candelabra_wall_5_4_5_plain_lit" + }, + { + "model": "twilightforest:block/candelabra_wall_4_5_5_plain_lit" + }, + { + "model": "twilightforest:block/candelabra_wall_5_5_5_plain_lit" + } + ], + "facing=south,lighting=ominous,on_wall=true,waterlogged=true": [ + { + "model": "twilightforest:block/candelabra_wall_4_4_4_plain_lit" + }, + { + "model": "twilightforest:block/candelabra_wall_5_4_4_plain_lit" + }, + { + "model": "twilightforest:block/candelabra_wall_4_5_4_plain_lit" + }, + { + "model": "twilightforest:block/candelabra_wall_5_5_4_plain_lit" + }, + { + "model": "twilightforest:block/candelabra_wall_4_4_5_plain_lit" + }, + { + "model": "twilightforest:block/candelabra_wall_5_4_5_plain_lit" + }, + { + "model": "twilightforest:block/candelabra_wall_4_5_5_plain_lit" + }, + { + "model": "twilightforest:block/candelabra_wall_5_5_5_plain_lit" + } + ], + "facing=west,lighting=none,on_wall=false,waterlogged=false": [ + { + "model": "twilightforest:block/candelabra_4_4_4_plain", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_5_4_4_plain", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_4_5_4_plain", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_5_5_4_plain", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_4_4_5_plain", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_5_4_5_plain", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_4_5_5_plain", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_5_5_5_plain", + "y": 90 + } + ], + "facing=west,lighting=none,on_wall=false,waterlogged=true": [ + { + "model": "twilightforest:block/candelabra_4_4_4_plain", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_5_4_4_plain", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_4_5_4_plain", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_5_5_4_plain", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_4_4_5_plain", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_5_4_5_plain", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_4_5_5_plain", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_5_5_5_plain", + "y": 90 + } + ], + "facing=west,lighting=none,on_wall=true,waterlogged=false": [ + { + "model": "twilightforest:block/candelabra_wall_4_4_4_plain", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_wall_5_4_4_plain", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_wall_4_5_4_plain", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_wall_5_5_4_plain", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_wall_4_4_5_plain", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_wall_5_4_5_plain", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_wall_4_5_5_plain", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_wall_5_5_5_plain", + "y": 90 + } + ], + "facing=west,lighting=none,on_wall=true,waterlogged=true": [ + { + "model": "twilightforest:block/candelabra_wall_4_4_4_plain", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_wall_5_4_4_plain", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_wall_4_5_4_plain", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_wall_5_5_4_plain", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_wall_4_4_5_plain", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_wall_5_4_5_plain", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_wall_4_5_5_plain", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_wall_5_5_5_plain", + "y": 90 + } + ], + "facing=west,lighting=normal,on_wall=false,waterlogged=false": [ + { + "model": "twilightforest:block/candelabra_4_4_4_plain_lit", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_5_4_4_plain_lit", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_4_5_4_plain_lit", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_5_5_4_plain_lit", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_4_4_5_plain_lit", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_5_4_5_plain_lit", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_4_5_5_plain_lit", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_5_5_5_plain_lit", + "y": 90 + } + ], + "facing=west,lighting=normal,on_wall=false,waterlogged=true": [ + { + "model": "twilightforest:block/candelabra_4_4_4_plain_lit", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_5_4_4_plain_lit", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_4_5_4_plain_lit", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_5_5_4_plain_lit", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_4_4_5_plain_lit", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_5_4_5_plain_lit", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_4_5_5_plain_lit", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_5_5_5_plain_lit", + "y": 90 + } + ], + "facing=west,lighting=normal,on_wall=true,waterlogged=false": [ + { + "model": "twilightforest:block/candelabra_wall_4_4_4_plain_lit", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_wall_5_4_4_plain_lit", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_wall_4_5_4_plain_lit", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_wall_5_5_4_plain_lit", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_wall_4_4_5_plain_lit", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_wall_5_4_5_plain_lit", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_wall_4_5_5_plain_lit", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_wall_5_5_5_plain_lit", + "y": 90 + } + ], + "facing=west,lighting=normal,on_wall=true,waterlogged=true": [ + { + "model": "twilightforest:block/candelabra_wall_4_4_4_plain_lit", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_wall_5_4_4_plain_lit", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_wall_4_5_4_plain_lit", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_wall_5_5_4_plain_lit", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_wall_4_4_5_plain_lit", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_wall_5_4_5_plain_lit", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_wall_4_5_5_plain_lit", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_wall_5_5_5_plain_lit", + "y": 90 + } + ], + "facing=west,lighting=ominous,on_wall=false,waterlogged=false": [ + { + "model": "twilightforest:block/candelabra_4_4_4_plain_lit", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_5_4_4_plain_lit", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_4_5_4_plain_lit", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_5_5_4_plain_lit", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_4_4_5_plain_lit", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_5_4_5_plain_lit", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_4_5_5_plain_lit", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_5_5_5_plain_lit", + "y": 90 + } + ], + "facing=west,lighting=ominous,on_wall=false,waterlogged=true": [ + { + "model": "twilightforest:block/candelabra_4_4_4_plain_lit", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_5_4_4_plain_lit", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_4_5_4_plain_lit", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_5_5_4_plain_lit", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_4_4_5_plain_lit", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_5_4_5_plain_lit", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_4_5_5_plain_lit", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_5_5_5_plain_lit", + "y": 90 + } + ], + "facing=west,lighting=ominous,on_wall=true,waterlogged=false": [ + { + "model": "twilightforest:block/candelabra_wall_4_4_4_plain_lit", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_wall_5_4_4_plain_lit", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_wall_4_5_4_plain_lit", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_wall_5_5_4_plain_lit", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_wall_4_4_5_plain_lit", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_wall_5_4_5_plain_lit", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_wall_4_5_5_plain_lit", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_wall_5_5_5_plain_lit", + "y": 90 + } + ], + "facing=west,lighting=ominous,on_wall=true,waterlogged=true": [ + { + "model": "twilightforest:block/candelabra_wall_4_4_4_plain_lit", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_wall_5_4_4_plain_lit", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_wall_4_5_4_plain_lit", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_wall_5_5_4_plain_lit", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_wall_4_4_5_plain_lit", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_wall_5_4_5_plain_lit", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_wall_4_5_5_plain_lit", + "y": 90 + }, + { + "model": "twilightforest:block/candelabra_wall_5_5_5_plain_lit", + "y": 90 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/canopy_banister.json b/src/generated/resources/assets/twilightforest/blockstates/canopy_banister.json new file mode 100644 index 0000000000..e3bab945ff --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/canopy_banister.json @@ -0,0 +1,460 @@ +{ + "variants": { + "extended=false,facing=east,shape=connected": [ + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_connected", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_connected_1", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_connected_2", + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_connected_3", + "y": 270 + } + ], + "extended=false,facing=east,shape=short": [ + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_short", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_short_1", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_short_2", + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_short_3", + "y": 270 + } + ], + "extended=false,facing=east,shape=tall": [ + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_tall", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_tall_1", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_tall_2", + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_tall_3", + "y": 270 + } + ], + "extended=false,facing=north,shape=connected": [ + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_connected", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_connected_1", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_connected_2", + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_connected_3", + "y": 180 + } + ], + "extended=false,facing=north,shape=short": [ + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_short", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_short_1", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_short_2", + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_short_3", + "y": 180 + } + ], + "extended=false,facing=north,shape=tall": [ + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_tall", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_tall_1", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_tall_2", + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_tall_3", + "y": 180 + } + ], + "extended=false,facing=south,shape=connected": [ + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_connected", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_connected_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_connected_2" + }, + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_connected_3" + } + ], + "extended=false,facing=south,shape=short": [ + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_short", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_short_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_short_2" + }, + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_short_3" + } + ], + "extended=false,facing=south,shape=tall": [ + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_tall", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_tall_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_tall_2" + }, + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_tall_3" + } + ], + "extended=false,facing=west,shape=connected": [ + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_connected", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_connected_1", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_connected_2", + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_connected_3", + "y": 90 + } + ], + "extended=false,facing=west,shape=short": [ + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_short", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_short_1", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_short_2", + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_short_3", + "y": 90 + } + ], + "extended=false,facing=west,shape=tall": [ + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_tall", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_tall_1", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_tall_2", + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_tall_3", + "y": 90 + } + ], + "extended=true,facing=east,shape=connected": [ + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_connected_extended", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_connected_extended_1", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_connected_extended_2", + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_connected_extended_3", + "y": 270 + } + ], + "extended=true,facing=east,shape=short": [ + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_short_extended", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_short_extended_1", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_short_extended_2", + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_short_extended_3", + "y": 270 + } + ], + "extended=true,facing=east,shape=tall": [ + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_tall_extended", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_tall_extended_1", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_tall_extended_2", + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_tall_extended_3", + "y": 270 + } + ], + "extended=true,facing=north,shape=connected": [ + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_connected_extended", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_connected_extended_1", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_connected_extended_2", + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_connected_extended_3", + "y": 180 + } + ], + "extended=true,facing=north,shape=short": [ + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_short_extended", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_short_extended_1", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_short_extended_2", + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_short_extended_3", + "y": 180 + } + ], + "extended=true,facing=north,shape=tall": [ + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_tall_extended", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_tall_extended_1", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_tall_extended_2", + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_tall_extended_3", + "y": 180 + } + ], + "extended=true,facing=south,shape=connected": [ + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_connected_extended", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_connected_extended_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_connected_extended_2" + }, + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_connected_extended_3" + } + ], + "extended=true,facing=south,shape=short": [ + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_short_extended", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_short_extended_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_short_extended_2" + }, + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_short_extended_3" + } + ], + "extended=true,facing=south,shape=tall": [ + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_tall_extended", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_tall_extended_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_tall_extended_2" + }, + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_tall_extended_3" + } + ], + "extended=true,facing=west,shape=connected": [ + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_connected_extended", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_connected_extended_1", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_connected_extended_2", + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_connected_extended_3", + "y": 90 + } + ], + "extended=true,facing=west,shape=short": [ + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_short_extended", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_short_extended_1", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_short_extended_2", + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_short_extended_3", + "y": 90 + } + ], + "extended=true,facing=west,shape=tall": [ + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_tall_extended", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_tall_extended_1", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_tall_extended_2", + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/canopy/canopy_banister_tall_extended_3", + "y": 90 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/canopy_bookshelf.json b/src/generated/resources/assets/twilightforest/blockstates/canopy_bookshelf.json new file mode 100644 index 0000000000..e26c21001a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/canopy_bookshelf.json @@ -0,0 +1,19 @@ +{ + "variants": { + "": [ + { + "model": "twilightforest:block/canopy_bookshelf", + "weight": 3 + }, + { + "model": "twilightforest:block/canopy_bookshelf_1" + }, + { + "model": "twilightforest:block/canopy_bookshelf_2" + }, + { + "model": "twilightforest:block/canopy_bookshelf_3" + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/canopy_button.json b/src/generated/resources/assets/twilightforest/blockstates/canopy_button.json new file mode 100644 index 0000000000..703ebbded0 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/canopy_button.json @@ -0,0 +1,556 @@ +{ + "variants": { + "face=ceiling,facing=east,powered=false": [ + { + "model": "twilightforest:block/wood/button/canopy/canopy_button", + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_1", + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_2", + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_3", + "x": 180, + "y": 270 + } + ], + "face=ceiling,facing=east,powered=true": [ + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_pressed", + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_pressed_1", + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_pressed_2", + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_pressed_3", + "x": 180, + "y": 270 + } + ], + "face=ceiling,facing=north,powered=false": [ + { + "model": "twilightforest:block/wood/button/canopy/canopy_button", + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_1", + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_2", + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_3", + "x": 180, + "y": 180 + } + ], + "face=ceiling,facing=north,powered=true": [ + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_pressed", + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_pressed_1", + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_pressed_2", + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_pressed_3", + "x": 180, + "y": 180 + } + ], + "face=ceiling,facing=south,powered=false": [ + { + "model": "twilightforest:block/wood/button/canopy/canopy_button", + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_1", + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_2", + "x": 180 + }, + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_3", + "x": 180 + } + ], + "face=ceiling,facing=south,powered=true": [ + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_pressed", + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_pressed_1", + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_pressed_2", + "x": 180 + }, + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_pressed_3", + "x": 180 + } + ], + "face=ceiling,facing=west,powered=false": [ + { + "model": "twilightforest:block/wood/button/canopy/canopy_button", + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_1", + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_2", + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_3", + "x": 180, + "y": 90 + } + ], + "face=ceiling,facing=west,powered=true": [ + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_pressed", + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_pressed_1", + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_pressed_2", + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_pressed_3", + "x": 180, + "y": 90 + } + ], + "face=floor,facing=east,powered=false": [ + { + "model": "twilightforest:block/wood/button/canopy/canopy_button", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_1", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_2", + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_3", + "y": 90 + } + ], + "face=floor,facing=east,powered=true": [ + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_pressed", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_pressed_1", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_pressed_2", + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_pressed_3", + "y": 90 + } + ], + "face=floor,facing=north,powered=false": [ + { + "model": "twilightforest:block/wood/button/canopy/canopy_button", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_2" + }, + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_3" + } + ], + "face=floor,facing=north,powered=true": [ + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_pressed", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_pressed_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_pressed_2" + }, + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_pressed_3" + } + ], + "face=floor,facing=south,powered=false": [ + { + "model": "twilightforest:block/wood/button/canopy/canopy_button", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_1", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_2", + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_3", + "y": 180 + } + ], + "face=floor,facing=south,powered=true": [ + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_pressed", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_pressed_1", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_pressed_2", + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_pressed_3", + "y": 180 + } + ], + "face=floor,facing=west,powered=false": [ + { + "model": "twilightforest:block/wood/button/canopy/canopy_button", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_1", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_2", + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_3", + "y": 270 + } + ], + "face=floor,facing=west,powered=true": [ + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_pressed", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_pressed_1", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_pressed_2", + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_pressed_3", + "y": 270 + } + ], + "face=wall,facing=east,powered=false": [ + { + "model": "twilightforest:block/wood/button/canopy/canopy_button", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_1", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_2", + "uvlock": true, + "x": 90, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_3", + "uvlock": true, + "x": 90, + "y": 90 + } + ], + "face=wall,facing=east,powered=true": [ + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_pressed", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_pressed_1", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_pressed_2", + "uvlock": true, + "x": 90, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_pressed_3", + "uvlock": true, + "x": 90, + "y": 90 + } + ], + "face=wall,facing=north,powered=false": [ + { + "model": "twilightforest:block/wood/button/canopy/canopy_button", + "uvlock": true, + "weight": 10, + "x": 90 + }, + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_1", + "uvlock": true, + "weight": 10, + "x": 90 + }, + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_2", + "uvlock": true, + "x": 90 + }, + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_3", + "uvlock": true, + "x": 90 + } + ], + "face=wall,facing=north,powered=true": [ + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_pressed", + "uvlock": true, + "weight": 10, + "x": 90 + }, + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_pressed_1", + "uvlock": true, + "weight": 10, + "x": 90 + }, + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_pressed_2", + "uvlock": true, + "x": 90 + }, + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_pressed_3", + "uvlock": true, + "x": 90 + } + ], + "face=wall,facing=south,powered=false": [ + { + "model": "twilightforest:block/wood/button/canopy/canopy_button", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_1", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_2", + "uvlock": true, + "x": 90, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_3", + "uvlock": true, + "x": 90, + "y": 180 + } + ], + "face=wall,facing=south,powered=true": [ + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_pressed", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_pressed_1", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_pressed_2", + "uvlock": true, + "x": 90, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_pressed_3", + "uvlock": true, + "x": 90, + "y": 180 + } + ], + "face=wall,facing=west,powered=false": [ + { + "model": "twilightforest:block/wood/button/canopy/canopy_button", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_1", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_2", + "uvlock": true, + "x": 90, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_3", + "uvlock": true, + "x": 90, + "y": 270 + } + ], + "face=wall,facing=west,powered=true": [ + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_pressed", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_pressed_1", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_pressed_2", + "uvlock": true, + "x": 90, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/canopy/canopy_button_pressed_3", + "uvlock": true, + "x": 90, + "y": 270 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/canopy_chest.json b/src/generated/resources/assets/twilightforest/blockstates/canopy_chest.json new file mode 100644 index 0000000000..a9d8e7d468 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/canopy_chest.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/canopy_chest" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/canopy_door.json b/src/generated/resources/assets/twilightforest/blockstates/canopy_door.json new file mode 100644 index 0000000000..f3a7e1052a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/canopy_door.json @@ -0,0 +1,124 @@ +{ + "variants": { + "facing=east,half=lower,hinge=left,open=false": { + "model": "twilightforest:block/wood/door/canopy/canopy_door_door_bottom_left" + }, + "facing=east,half=lower,hinge=left,open=true": { + "model": "twilightforest:block/wood/door/canopy/canopy_door_door_bottom_left_open", + "y": 90 + }, + "facing=east,half=lower,hinge=right,open=false": { + "model": "twilightforest:block/wood/door/canopy/canopy_door_door_bottom_right" + }, + "facing=east,half=lower,hinge=right,open=true": { + "model": "twilightforest:block/wood/door/canopy/canopy_door_door_bottom_right_open", + "y": 270 + }, + "facing=east,half=upper,hinge=left,open=false": { + "model": "twilightforest:block/wood/door/canopy/canopy_door_door_top_left" + }, + "facing=east,half=upper,hinge=left,open=true": { + "model": "twilightforest:block/wood/door/canopy/canopy_door_door_top_left_open", + "y": 90 + }, + "facing=east,half=upper,hinge=right,open=false": { + "model": "twilightforest:block/wood/door/canopy/canopy_door_door_top_right" + }, + "facing=east,half=upper,hinge=right,open=true": { + "model": "twilightforest:block/wood/door/canopy/canopy_door_door_top_right_open", + "y": 270 + }, + "facing=north,half=lower,hinge=left,open=false": { + "model": "twilightforest:block/wood/door/canopy/canopy_door_door_bottom_left", + "y": 270 + }, + "facing=north,half=lower,hinge=left,open=true": { + "model": "twilightforest:block/wood/door/canopy/canopy_door_door_bottom_left_open" + }, + "facing=north,half=lower,hinge=right,open=false": { + "model": "twilightforest:block/wood/door/canopy/canopy_door_door_bottom_right", + "y": 270 + }, + "facing=north,half=lower,hinge=right,open=true": { + "model": "twilightforest:block/wood/door/canopy/canopy_door_door_bottom_right_open", + "y": 180 + }, + "facing=north,half=upper,hinge=left,open=false": { + "model": "twilightforest:block/wood/door/canopy/canopy_door_door_top_left", + "y": 270 + }, + "facing=north,half=upper,hinge=left,open=true": { + "model": "twilightforest:block/wood/door/canopy/canopy_door_door_top_left_open" + }, + "facing=north,half=upper,hinge=right,open=false": { + "model": "twilightforest:block/wood/door/canopy/canopy_door_door_top_right", + "y": 270 + }, + "facing=north,half=upper,hinge=right,open=true": { + "model": "twilightforest:block/wood/door/canopy/canopy_door_door_top_right_open", + "y": 180 + }, + "facing=south,half=lower,hinge=left,open=false": { + "model": "twilightforest:block/wood/door/canopy/canopy_door_door_bottom_left", + "y": 90 + }, + "facing=south,half=lower,hinge=left,open=true": { + "model": "twilightforest:block/wood/door/canopy/canopy_door_door_bottom_left_open", + "y": 180 + }, + "facing=south,half=lower,hinge=right,open=false": { + "model": "twilightforest:block/wood/door/canopy/canopy_door_door_bottom_right", + "y": 90 + }, + "facing=south,half=lower,hinge=right,open=true": { + "model": "twilightforest:block/wood/door/canopy/canopy_door_door_bottom_right_open" + }, + "facing=south,half=upper,hinge=left,open=false": { + "model": "twilightforest:block/wood/door/canopy/canopy_door_door_top_left", + "y": 90 + }, + "facing=south,half=upper,hinge=left,open=true": { + "model": "twilightforest:block/wood/door/canopy/canopy_door_door_top_left_open", + "y": 180 + }, + "facing=south,half=upper,hinge=right,open=false": { + "model": "twilightforest:block/wood/door/canopy/canopy_door_door_top_right", + "y": 90 + }, + "facing=south,half=upper,hinge=right,open=true": { + "model": "twilightforest:block/wood/door/canopy/canopy_door_door_top_right_open" + }, + "facing=west,half=lower,hinge=left,open=false": { + "model": "twilightforest:block/wood/door/canopy/canopy_door_door_bottom_left", + "y": 180 + }, + "facing=west,half=lower,hinge=left,open=true": { + "model": "twilightforest:block/wood/door/canopy/canopy_door_door_bottom_left_open", + "y": 270 + }, + "facing=west,half=lower,hinge=right,open=false": { + "model": "twilightforest:block/wood/door/canopy/canopy_door_door_bottom_right", + "y": 180 + }, + "facing=west,half=lower,hinge=right,open=true": { + "model": "twilightforest:block/wood/door/canopy/canopy_door_door_bottom_right_open", + "y": 90 + }, + "facing=west,half=upper,hinge=left,open=false": { + "model": "twilightforest:block/wood/door/canopy/canopy_door_door_top_left", + "y": 180 + }, + "facing=west,half=upper,hinge=left,open=true": { + "model": "twilightforest:block/wood/door/canopy/canopy_door_door_top_left_open", + "y": 270 + }, + "facing=west,half=upper,hinge=right,open=false": { + "model": "twilightforest:block/wood/door/canopy/canopy_door_door_top_right", + "y": 180 + }, + "facing=west,half=upper,hinge=right,open=true": { + "model": "twilightforest:block/wood/door/canopy/canopy_door_door_top_right_open", + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/canopy_fence.json b/src/generated/resources/assets/twilightforest/blockstates/canopy_fence.json new file mode 100644 index 0000000000..b400d8bf6c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/canopy_fence.json @@ -0,0 +1,134 @@ +{ + "multipart": [ + { + "apply": [ + { + "model": "twilightforest:block/wood/fence/canopy/canopy_fence_post", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence/canopy/canopy_fence_post_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence/canopy/canopy_fence_post_2" + }, + { + "model": "twilightforest:block/wood/fence/canopy/canopy_fence_post_3" + } + ] + }, + { + "apply": [ + { + "model": "twilightforest:block/wood/fence/canopy/canopy_fence_side", + "uvlock": true, + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence/canopy/canopy_fence_side_1", + "uvlock": true, + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence/canopy/canopy_fence_side_2", + "uvlock": true + }, + { + "model": "twilightforest:block/wood/fence/canopy/canopy_fence_side_3", + "uvlock": true + } + ], + "when": { + "north": "true" + } + }, + { + "apply": [ + { + "model": "twilightforest:block/wood/fence/canopy/canopy_fence_side", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence/canopy/canopy_fence_side_1", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence/canopy/canopy_fence_side_2", + "uvlock": true, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence/canopy/canopy_fence_side_3", + "uvlock": true, + "y": 180 + } + ], + "when": { + "south": "true" + } + }, + { + "apply": [ + { + "model": "twilightforest:block/wood/fence/canopy/canopy_fence_side", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence/canopy/canopy_fence_side_1", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence/canopy/canopy_fence_side_2", + "uvlock": true, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence/canopy/canopy_fence_side_3", + "uvlock": true, + "y": 270 + } + ], + "when": { + "west": "true" + } + }, + { + "apply": [ + { + "model": "twilightforest:block/wood/fence/canopy/canopy_fence_side", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence/canopy/canopy_fence_side_1", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence/canopy/canopy_fence_side_2", + "uvlock": true, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence/canopy/canopy_fence_side_3", + "uvlock": true, + "y": 90 + } + ], + "when": { + "east": "true" + } + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/canopy_fence_gate.json b/src/generated/resources/assets/twilightforest/blockstates/canopy_fence_gate.json new file mode 100644 index 0000000000..f15786da6b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/canopy_fence_gate.json @@ -0,0 +1,372 @@ +{ + "variants": { + "facing=east,in_wall=false,open=false": [ + { + "model": "twilightforest:block/wood/fence_gate/canopy/canopy_fence_gate", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/canopy/canopy_fence_gate_1", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/canopy/canopy_fence_gate_2", + "uvlock": true, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/canopy/canopy_fence_gate_3", + "uvlock": true, + "y": 270 + } + ], + "facing=east,in_wall=false,open=true": [ + { + "model": "twilightforest:block/wood/fence_gate/canopy/canopy_fence_gate_open", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/canopy/canopy_fence_gate_open_1", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/canopy/canopy_fence_gate_open_2", + "uvlock": true, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/canopy/canopy_fence_gate_open_3", + "uvlock": true, + "y": 270 + } + ], + "facing=east,in_wall=true,open=false": [ + { + "model": "twilightforest:block/wood/fence_gate/canopy/canopy_fence_gate_wall", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/canopy/canopy_fence_gate_wall_1", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/canopy/canopy_fence_gate_wall_2", + "uvlock": true, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/canopy/canopy_fence_gate_wall_3", + "uvlock": true, + "y": 270 + } + ], + "facing=east,in_wall=true,open=true": [ + { + "model": "twilightforest:block/wood/fence_gate/canopy/canopy_fence_gate_wall_open", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/canopy/canopy_fence_gate_wall_open_1", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/canopy/canopy_fence_gate_wall_open_2", + "uvlock": true, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/canopy/canopy_fence_gate_wall_open_3", + "uvlock": true, + "y": 270 + } + ], + "facing=north,in_wall=false,open=false": [ + { + "model": "twilightforest:block/wood/fence_gate/canopy/canopy_fence_gate", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/canopy/canopy_fence_gate_1", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/canopy/canopy_fence_gate_2", + "uvlock": true, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/canopy/canopy_fence_gate_3", + "uvlock": true, + "y": 180 + } + ], + "facing=north,in_wall=false,open=true": [ + { + "model": "twilightforest:block/wood/fence_gate/canopy/canopy_fence_gate_open", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/canopy/canopy_fence_gate_open_1", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/canopy/canopy_fence_gate_open_2", + "uvlock": true, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/canopy/canopy_fence_gate_open_3", + "uvlock": true, + "y": 180 + } + ], + "facing=north,in_wall=true,open=false": [ + { + "model": "twilightforest:block/wood/fence_gate/canopy/canopy_fence_gate_wall", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/canopy/canopy_fence_gate_wall_1", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/canopy/canopy_fence_gate_wall_2", + "uvlock": true, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/canopy/canopy_fence_gate_wall_3", + "uvlock": true, + "y": 180 + } + ], + "facing=north,in_wall=true,open=true": [ + { + "model": "twilightforest:block/wood/fence_gate/canopy/canopy_fence_gate_wall_open", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/canopy/canopy_fence_gate_wall_open_1", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/canopy/canopy_fence_gate_wall_open_2", + "uvlock": true, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/canopy/canopy_fence_gate_wall_open_3", + "uvlock": true, + "y": 180 + } + ], + "facing=south,in_wall=false,open=false": [ + { + "model": "twilightforest:block/wood/fence_gate/canopy/canopy_fence_gate", + "uvlock": true, + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence_gate/canopy/canopy_fence_gate_1", + "uvlock": true, + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence_gate/canopy/canopy_fence_gate_2", + "uvlock": true + }, + { + "model": "twilightforest:block/wood/fence_gate/canopy/canopy_fence_gate_3", + "uvlock": true + } + ], + "facing=south,in_wall=false,open=true": [ + { + "model": "twilightforest:block/wood/fence_gate/canopy/canopy_fence_gate_open", + "uvlock": true, + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence_gate/canopy/canopy_fence_gate_open_1", + "uvlock": true, + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence_gate/canopy/canopy_fence_gate_open_2", + "uvlock": true + }, + { + "model": "twilightforest:block/wood/fence_gate/canopy/canopy_fence_gate_open_3", + "uvlock": true + } + ], + "facing=south,in_wall=true,open=false": [ + { + "model": "twilightforest:block/wood/fence_gate/canopy/canopy_fence_gate_wall", + "uvlock": true, + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence_gate/canopy/canopy_fence_gate_wall_1", + "uvlock": true, + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence_gate/canopy/canopy_fence_gate_wall_2", + "uvlock": true + }, + { + "model": "twilightforest:block/wood/fence_gate/canopy/canopy_fence_gate_wall_3", + "uvlock": true + } + ], + "facing=south,in_wall=true,open=true": [ + { + "model": "twilightforest:block/wood/fence_gate/canopy/canopy_fence_gate_wall_open", + "uvlock": true, + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence_gate/canopy/canopy_fence_gate_wall_open_1", + "uvlock": true, + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence_gate/canopy/canopy_fence_gate_wall_open_2", + "uvlock": true + }, + { + "model": "twilightforest:block/wood/fence_gate/canopy/canopy_fence_gate_wall_open_3", + "uvlock": true + } + ], + "facing=west,in_wall=false,open=false": [ + { + "model": "twilightforest:block/wood/fence_gate/canopy/canopy_fence_gate", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/canopy/canopy_fence_gate_1", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/canopy/canopy_fence_gate_2", + "uvlock": true, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/canopy/canopy_fence_gate_3", + "uvlock": true, + "y": 90 + } + ], + "facing=west,in_wall=false,open=true": [ + { + "model": "twilightforest:block/wood/fence_gate/canopy/canopy_fence_gate_open", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/canopy/canopy_fence_gate_open_1", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/canopy/canopy_fence_gate_open_2", + "uvlock": true, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/canopy/canopy_fence_gate_open_3", + "uvlock": true, + "y": 90 + } + ], + "facing=west,in_wall=true,open=false": [ + { + "model": "twilightforest:block/wood/fence_gate/canopy/canopy_fence_gate_wall", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/canopy/canopy_fence_gate_wall_1", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/canopy/canopy_fence_gate_wall_2", + "uvlock": true, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/canopy/canopy_fence_gate_wall_3", + "uvlock": true, + "y": 90 + } + ], + "facing=west,in_wall=true,open=true": [ + { + "model": "twilightforest:block/wood/fence_gate/canopy/canopy_fence_gate_wall_open", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/canopy/canopy_fence_gate_wall_open_1", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/canopy/canopy_fence_gate_wall_open_2", + "uvlock": true, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/canopy/canopy_fence_gate_wall_open_3", + "uvlock": true, + "y": 90 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/canopy_leaves.json b/src/generated/resources/assets/twilightforest/blockstates/canopy_leaves.json new file mode 100644 index 0000000000..0bda7e00d9 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/canopy_leaves.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/canopy_leaves" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/canopy_log.json b/src/generated/resources/assets/twilightforest/blockstates/canopy_log.json new file mode 100644 index 0000000000..eaedea8a20 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/canopy_log.json @@ -0,0 +1,16 @@ +{ + "variants": { + "axis=x": { + "model": "twilightforest:block/canopy_log_horizontal", + "x": 90, + "y": 90 + }, + "axis=y": { + "model": "twilightforest:block/canopy_log" + }, + "axis=z": { + "model": "twilightforest:block/canopy_log_horizontal", + "x": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/canopy_planks.json b/src/generated/resources/assets/twilightforest/blockstates/canopy_planks.json new file mode 100644 index 0000000000..bf1efcb9c5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/canopy_planks.json @@ -0,0 +1,20 @@ +{ + "variants": { + "": [ + { + "model": "twilightforest:block/wood/planks/canopy/canopy_planks", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/planks/canopy/canopy_planks_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/planks/canopy/canopy_planks_2" + }, + { + "model": "twilightforest:block/wood/planks/canopy/canopy_planks_3" + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/canopy_pressure_plate.json b/src/generated/resources/assets/twilightforest/blockstates/canopy_pressure_plate.json new file mode 100644 index 0000000000..9cc3672d5c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/canopy_pressure_plate.json @@ -0,0 +1,36 @@ +{ + "variants": { + "powered=false": [ + { + "model": "twilightforest:block/wood/pressure_plate/canopy/canopy_pressure_plate", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/pressure_plate/canopy/canopy_pressure_plate_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/pressure_plate/canopy/canopy_pressure_plate_2" + }, + { + "model": "twilightforest:block/wood/pressure_plate/canopy/canopy_pressure_plate_3" + } + ], + "powered=true": [ + { + "model": "twilightforest:block/wood/pressure_plate/canopy/canopy_pressure_plate_down", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/pressure_plate/canopy/canopy_pressure_plate_down_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/pressure_plate/canopy/canopy_pressure_plate_down_2" + }, + { + "model": "twilightforest:block/wood/pressure_plate/canopy/canopy_pressure_plate_down_3" + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/canopy_sapling.json b/src/generated/resources/assets/twilightforest/blockstates/canopy_sapling.json new file mode 100644 index 0000000000..841a98fcc3 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/canopy_sapling.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/canopy_sapling" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/canopy_sign.json b/src/generated/resources/assets/twilightforest/blockstates/canopy_sign.json new file mode 100644 index 0000000000..03273a43cd --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/canopy_sign.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/canopy_sign" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/canopy_slab.json b/src/generated/resources/assets/twilightforest/blockstates/canopy_slab.json new file mode 100644 index 0000000000..6f340810aa --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/canopy_slab.json @@ -0,0 +1,60 @@ +{ + "variants": { + "type=bottom": [ + { + "model": "twilightforest:block/wood/slab/canopy/canopy_slab", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/slab/canopy/canopy_slab_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/slab/canopy/canopy_slab_2" + }, + { + "model": "twilightforest:block/wood/slab/canopy/canopy_slab_3" + } + ], + "type=double": [ + { + "model": "twilightforest:block/wood/planks/canopy/canopy_planks", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/planks/canopy/canopy_planks_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/planks/canopy/canopy_planks_2" + }, + { + "model": "twilightforest:block/wood/planks/canopy/canopy_planks_3" + } + ], + "type=top": [ + { + "model": "twilightforest:block/wood/slab/canopy/canopy_slab", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/slab/canopy/canopy_slab_1", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/slab/canopy/canopy_slab_2", + "uvlock": true, + "x": 180 + }, + { + "model": "twilightforest:block/wood/slab/canopy/canopy_slab_3", + "uvlock": true, + "x": 180 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/canopy_stairs.json b/src/generated/resources/assets/twilightforest/blockstates/canopy_stairs.json new file mode 100644 index 0000000000..ae7a78c67e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/canopy_stairs.json @@ -0,0 +1,984 @@ +{ + "variants": { + "facing=east,half=bottom,shape=inner_left": [ + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_inner", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_inner_1", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_inner_2", + "uvlock": true, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_inner_3", + "uvlock": true, + "y": 270 + } + ], + "facing=east,half=bottom,shape=inner_right": [ + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_inner", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_inner_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_inner_2" + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_inner_3" + } + ], + "facing=east,half=bottom,shape=outer_left": [ + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_outer", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_outer_1", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_outer_2", + "uvlock": true, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_outer_3", + "uvlock": true, + "y": 270 + } + ], + "facing=east,half=bottom,shape=outer_right": [ + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_outer", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_outer_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_outer_2" + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_outer_3" + } + ], + "facing=east,half=bottom,shape=straight": [ + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_2" + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_3" + } + ], + "facing=east,half=top,shape=inner_left": [ + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_inner", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_inner_1", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_inner_2", + "uvlock": true, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_inner_3", + "uvlock": true, + "x": 180 + } + ], + "facing=east,half=top,shape=inner_right": [ + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_inner", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_inner_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_inner_2", + "uvlock": true, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_inner_3", + "uvlock": true, + "x": 180, + "y": 90 + } + ], + "facing=east,half=top,shape=outer_left": [ + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_outer", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_outer_1", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_outer_2", + "uvlock": true, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_outer_3", + "uvlock": true, + "x": 180 + } + ], + "facing=east,half=top,shape=outer_right": [ + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_outer", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_outer_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_outer_2", + "uvlock": true, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_outer_3", + "uvlock": true, + "x": 180, + "y": 90 + } + ], + "facing=east,half=top,shape=straight": [ + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_1", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_2", + "uvlock": true, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_3", + "uvlock": true, + "x": 180 + } + ], + "facing=north,half=bottom,shape=inner_left": [ + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_inner", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_inner_1", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_inner_2", + "uvlock": true, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_inner_3", + "uvlock": true, + "y": 180 + } + ], + "facing=north,half=bottom,shape=inner_right": [ + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_inner", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_inner_1", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_inner_2", + "uvlock": true, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_inner_3", + "uvlock": true, + "y": 270 + } + ], + "facing=north,half=bottom,shape=outer_left": [ + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_outer", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_outer_1", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_outer_2", + "uvlock": true, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_outer_3", + "uvlock": true, + "y": 180 + } + ], + "facing=north,half=bottom,shape=outer_right": [ + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_outer", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_outer_1", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_outer_2", + "uvlock": true, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_outer_3", + "uvlock": true, + "y": 270 + } + ], + "facing=north,half=bottom,shape=straight": [ + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_1", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_2", + "uvlock": true, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_3", + "uvlock": true, + "y": 270 + } + ], + "facing=north,half=top,shape=inner_left": [ + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_inner", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_inner_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_inner_2", + "uvlock": true, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_inner_3", + "uvlock": true, + "x": 180, + "y": 270 + } + ], + "facing=north,half=top,shape=inner_right": [ + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_inner", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_inner_1", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_inner_2", + "uvlock": true, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_inner_3", + "uvlock": true, + "x": 180 + } + ], + "facing=north,half=top,shape=outer_left": [ + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_outer", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_outer_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_outer_2", + "uvlock": true, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_outer_3", + "uvlock": true, + "x": 180, + "y": 270 + } + ], + "facing=north,half=top,shape=outer_right": [ + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_outer", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_outer_1", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_outer_2", + "uvlock": true, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_outer_3", + "uvlock": true, + "x": 180 + } + ], + "facing=north,half=top,shape=straight": [ + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_2", + "uvlock": true, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_3", + "uvlock": true, + "x": 180, + "y": 270 + } + ], + "facing=south,half=bottom,shape=inner_left": [ + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_inner", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_inner_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_inner_2" + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_inner_3" + } + ], + "facing=south,half=bottom,shape=inner_right": [ + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_inner", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_inner_1", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_inner_2", + "uvlock": true, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_inner_3", + "uvlock": true, + "y": 90 + } + ], + "facing=south,half=bottom,shape=outer_left": [ + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_outer", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_outer_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_outer_2" + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_outer_3" + } + ], + "facing=south,half=bottom,shape=outer_right": [ + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_outer", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_outer_1", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_outer_2", + "uvlock": true, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_outer_3", + "uvlock": true, + "y": 90 + } + ], + "facing=south,half=bottom,shape=straight": [ + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_1", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_2", + "uvlock": true, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_3", + "uvlock": true, + "y": 90 + } + ], + "facing=south,half=top,shape=inner_left": [ + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_inner", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_inner_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_inner_2", + "uvlock": true, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_inner_3", + "uvlock": true, + "x": 180, + "y": 90 + } + ], + "facing=south,half=top,shape=inner_right": [ + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_inner", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_inner_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_inner_2", + "uvlock": true, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_inner_3", + "uvlock": true, + "x": 180, + "y": 180 + } + ], + "facing=south,half=top,shape=outer_left": [ + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_outer", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_outer_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_outer_2", + "uvlock": true, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_outer_3", + "uvlock": true, + "x": 180, + "y": 90 + } + ], + "facing=south,half=top,shape=outer_right": [ + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_outer", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_outer_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_outer_2", + "uvlock": true, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_outer_3", + "uvlock": true, + "x": 180, + "y": 180 + } + ], + "facing=south,half=top,shape=straight": [ + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_2", + "uvlock": true, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_3", + "uvlock": true, + "x": 180, + "y": 90 + } + ], + "facing=west,half=bottom,shape=inner_left": [ + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_inner", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_inner_1", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_inner_2", + "uvlock": true, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_inner_3", + "uvlock": true, + "y": 90 + } + ], + "facing=west,half=bottom,shape=inner_right": [ + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_inner", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_inner_1", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_inner_2", + "uvlock": true, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_inner_3", + "uvlock": true, + "y": 180 + } + ], + "facing=west,half=bottom,shape=outer_left": [ + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_outer", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_outer_1", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_outer_2", + "uvlock": true, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_outer_3", + "uvlock": true, + "y": 90 + } + ], + "facing=west,half=bottom,shape=outer_right": [ + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_outer", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_outer_1", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_outer_2", + "uvlock": true, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_outer_3", + "uvlock": true, + "y": 180 + } + ], + "facing=west,half=bottom,shape=straight": [ + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_1", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_2", + "uvlock": true, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_3", + "uvlock": true, + "y": 180 + } + ], + "facing=west,half=top,shape=inner_left": [ + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_inner", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_inner_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_inner_2", + "uvlock": true, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_inner_3", + "uvlock": true, + "x": 180, + "y": 180 + } + ], + "facing=west,half=top,shape=inner_right": [ + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_inner", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_inner_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_inner_2", + "uvlock": true, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_inner_3", + "uvlock": true, + "x": 180, + "y": 270 + } + ], + "facing=west,half=top,shape=outer_left": [ + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_outer", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_outer_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_outer_2", + "uvlock": true, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_outer_3", + "uvlock": true, + "x": 180, + "y": 180 + } + ], + "facing=west,half=top,shape=outer_right": [ + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_outer", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_outer_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_outer_2", + "uvlock": true, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_outer_3", + "uvlock": true, + "x": 180, + "y": 270 + } + ], + "facing=west,half=top,shape=straight": [ + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_2", + "uvlock": true, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/canopy/canopy_stairs_3", + "uvlock": true, + "x": 180, + "y": 180 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/canopy_trapdoor.json b/src/generated/resources/assets/twilightforest/blockstates/canopy_trapdoor.json new file mode 100644 index 0000000000..66443180c4 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/canopy_trapdoor.json @@ -0,0 +1,68 @@ +{ + "variants": { + "facing=east,half=bottom,open=false": { + "model": "twilightforest:block/wood/trapdoor/canopy/canopy_trapdoor_bottom", + "y": 90 + }, + "facing=east,half=bottom,open=true": { + "model": "twilightforest:block/wood/trapdoor/canopy/canopy_trapdoor_open", + "y": 90 + }, + "facing=east,half=top,open=false": { + "model": "twilightforest:block/wood/trapdoor/canopy/canopy_trapdoor_top", + "y": 90 + }, + "facing=east,half=top,open=true": { + "model": "twilightforest:block/wood/trapdoor/canopy/canopy_trapdoor_open", + "x": 180, + "y": 270 + }, + "facing=north,half=bottom,open=false": { + "model": "twilightforest:block/wood/trapdoor/canopy/canopy_trapdoor_bottom" + }, + "facing=north,half=bottom,open=true": { + "model": "twilightforest:block/wood/trapdoor/canopy/canopy_trapdoor_open" + }, + "facing=north,half=top,open=false": { + "model": "twilightforest:block/wood/trapdoor/canopy/canopy_trapdoor_top" + }, + "facing=north,half=top,open=true": { + "model": "twilightforest:block/wood/trapdoor/canopy/canopy_trapdoor_open", + "x": 180, + "y": 180 + }, + "facing=south,half=bottom,open=false": { + "model": "twilightforest:block/wood/trapdoor/canopy/canopy_trapdoor_bottom", + "y": 180 + }, + "facing=south,half=bottom,open=true": { + "model": "twilightforest:block/wood/trapdoor/canopy/canopy_trapdoor_open", + "y": 180 + }, + "facing=south,half=top,open=false": { + "model": "twilightforest:block/wood/trapdoor/canopy/canopy_trapdoor_top", + "y": 180 + }, + "facing=south,half=top,open=true": { + "model": "twilightforest:block/wood/trapdoor/canopy/canopy_trapdoor_open", + "x": 180 + }, + "facing=west,half=bottom,open=false": { + "model": "twilightforest:block/wood/trapdoor/canopy/canopy_trapdoor_bottom", + "y": 270 + }, + "facing=west,half=bottom,open=true": { + "model": "twilightforest:block/wood/trapdoor/canopy/canopy_trapdoor_open", + "y": 270 + }, + "facing=west,half=top,open=false": { + "model": "twilightforest:block/wood/trapdoor/canopy/canopy_trapdoor_top", + "y": 270 + }, + "facing=west,half=top,open=true": { + "model": "twilightforest:block/wood/trapdoor/canopy/canopy_trapdoor_open", + "x": 180, + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/canopy_wall_sign.json b/src/generated/resources/assets/twilightforest/blockstates/canopy_wall_sign.json new file mode 100644 index 0000000000..51c1b13ef5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/canopy_wall_sign.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/canopy_wall_sign" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/canopy_wood.json b/src/generated/resources/assets/twilightforest/blockstates/canopy_wood.json new file mode 100644 index 0000000000..dfed572230 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/canopy_wood.json @@ -0,0 +1,16 @@ +{ + "variants": { + "axis=x": { + "model": "twilightforest:block/canopy_wood_horizontal", + "x": 90, + "y": 90 + }, + "axis=y": { + "model": "twilightforest:block/canopy_wood" + }, + "axis=z": { + "model": "twilightforest:block/canopy_wood_horizontal", + "x": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/carminite_block.json b/src/generated/resources/assets/twilightforest/blockstates/carminite_block.json new file mode 100644 index 0000000000..9e059588c5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/carminite_block.json @@ -0,0 +1,50 @@ +{ + "variants": { + "": [ + { + "model": "twilightforest:block/carminite_block" + }, + { + "model": "twilightforest:block/carminite_block", + "y": 90 + }, + { + "model": "twilightforest:block/carminite_block", + "y": 180 + }, + { + "model": "twilightforest:block/carminite_block", + "x": 90 + }, + { + "model": "twilightforest:block/carminite_block", + "x": 90, + "y": 90 + }, + { + "model": "twilightforest:block/carminite_block", + "x": 90, + "y": 180 + }, + { + "model": "twilightforest:block/carminite_block", + "x": 180 + }, + { + "model": "twilightforest:block/carminite_block", + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/carminite_block", + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/carminite_block", + "x": 270, + "y": 270 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/carminite_builder.json b/src/generated/resources/assets/twilightforest/blockstates/carminite_builder.json new file mode 100644 index 0000000000..32cee74366 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/carminite_builder.json @@ -0,0 +1,13 @@ +{ + "variants": { + "state=builder_active": { + "model": "twilightforest:block/carminite_builder_active" + }, + "state=builder_inactive": { + "model": "twilightforest:block/carminite_builder" + }, + "state=builder_timeout": { + "model": "twilightforest:block/carminite_builder_timeout" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/carminite_reactor.json b/src/generated/resources/assets/twilightforest/blockstates/carminite_reactor.json new file mode 100644 index 0000000000..57dcecedbc --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/carminite_reactor.json @@ -0,0 +1,10 @@ +{ + "variants": { + "active=false": { + "model": "twilightforest:block/carminite_reactor" + }, + "active=true": { + "model": "twilightforest:block/carminite_reactor_active" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/castle_brick.json b/src/generated/resources/assets/twilightforest/blockstates/castle_brick.json new file mode 100644 index 0000000000..b91a3715b9 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/castle_brick.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/castle_brick" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/castle_brick_stairs.json b/src/generated/resources/assets/twilightforest/blockstates/castle_brick_stairs.json new file mode 100644 index 0000000000..faf9c319a3 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/castle_brick_stairs.json @@ -0,0 +1,209 @@ +{ + "variants": { + "facing=east,half=bottom,shape=inner_left": { + "model": "twilightforest:block/castle_brick_stairs_inner", + "uvlock": true, + "y": 270 + }, + "facing=east,half=bottom,shape=inner_right": { + "model": "twilightforest:block/castle_brick_stairs_inner" + }, + "facing=east,half=bottom,shape=outer_left": { + "model": "twilightforest:block/castle_brick_stairs_outer", + "uvlock": true, + "y": 270 + }, + "facing=east,half=bottom,shape=outer_right": { + "model": "twilightforest:block/castle_brick_stairs_outer" + }, + "facing=east,half=bottom,shape=straight": { + "model": "twilightforest:block/castle_brick_stairs" + }, + "facing=east,half=top,shape=inner_left": { + "model": "twilightforest:block/castle_brick_stairs_inner", + "uvlock": true, + "x": 180 + }, + "facing=east,half=top,shape=inner_right": { + "model": "twilightforest:block/castle_brick_stairs_inner", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=east,half=top,shape=outer_left": { + "model": "twilightforest:block/castle_brick_stairs_outer", + "uvlock": true, + "x": 180 + }, + "facing=east,half=top,shape=outer_right": { + "model": "twilightforest:block/castle_brick_stairs_outer", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=east,half=top,shape=straight": { + "model": "twilightforest:block/castle_brick_stairs", + "uvlock": true, + "x": 180 + }, + "facing=north,half=bottom,shape=inner_left": { + "model": "twilightforest:block/castle_brick_stairs_inner", + "uvlock": true, + "y": 180 + }, + "facing=north,half=bottom,shape=inner_right": { + "model": "twilightforest:block/castle_brick_stairs_inner", + "uvlock": true, + "y": 270 + }, + "facing=north,half=bottom,shape=outer_left": { + "model": "twilightforest:block/castle_brick_stairs_outer", + "uvlock": true, + "y": 180 + }, + "facing=north,half=bottom,shape=outer_right": { + "model": "twilightforest:block/castle_brick_stairs_outer", + "uvlock": true, + "y": 270 + }, + "facing=north,half=bottom,shape=straight": { + "model": "twilightforest:block/castle_brick_stairs", + "uvlock": true, + "y": 270 + }, + "facing=north,half=top,shape=inner_left": { + "model": "twilightforest:block/castle_brick_stairs_inner", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=north,half=top,shape=inner_right": { + "model": "twilightforest:block/castle_brick_stairs_inner", + "uvlock": true, + "x": 180 + }, + "facing=north,half=top,shape=outer_left": { + "model": "twilightforest:block/castle_brick_stairs_outer", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=north,half=top,shape=outer_right": { + "model": "twilightforest:block/castle_brick_stairs_outer", + "uvlock": true, + "x": 180 + }, + "facing=north,half=top,shape=straight": { + "model": "twilightforest:block/castle_brick_stairs", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=south,half=bottom,shape=inner_left": { + "model": "twilightforest:block/castle_brick_stairs_inner" + }, + "facing=south,half=bottom,shape=inner_right": { + "model": "twilightforest:block/castle_brick_stairs_inner", + "uvlock": true, + "y": 90 + }, + "facing=south,half=bottom,shape=outer_left": { + "model": "twilightforest:block/castle_brick_stairs_outer" + }, + "facing=south,half=bottom,shape=outer_right": { + "model": "twilightforest:block/castle_brick_stairs_outer", + "uvlock": true, + "y": 90 + }, + "facing=south,half=bottom,shape=straight": { + "model": "twilightforest:block/castle_brick_stairs", + "uvlock": true, + "y": 90 + }, + "facing=south,half=top,shape=inner_left": { + "model": "twilightforest:block/castle_brick_stairs_inner", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=south,half=top,shape=inner_right": { + "model": "twilightforest:block/castle_brick_stairs_inner", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=south,half=top,shape=outer_left": { + "model": "twilightforest:block/castle_brick_stairs_outer", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=south,half=top,shape=outer_right": { + "model": "twilightforest:block/castle_brick_stairs_outer", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=south,half=top,shape=straight": { + "model": "twilightforest:block/castle_brick_stairs", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=west,half=bottom,shape=inner_left": { + "model": "twilightforest:block/castle_brick_stairs_inner", + "uvlock": true, + "y": 90 + }, + "facing=west,half=bottom,shape=inner_right": { + "model": "twilightforest:block/castle_brick_stairs_inner", + "uvlock": true, + "y": 180 + }, + "facing=west,half=bottom,shape=outer_left": { + "model": "twilightforest:block/castle_brick_stairs_outer", + "uvlock": true, + "y": 90 + }, + "facing=west,half=bottom,shape=outer_right": { + "model": "twilightforest:block/castle_brick_stairs_outer", + "uvlock": true, + "y": 180 + }, + "facing=west,half=bottom,shape=straight": { + "model": "twilightforest:block/castle_brick_stairs", + "uvlock": true, + "y": 180 + }, + "facing=west,half=top,shape=inner_left": { + "model": "twilightforest:block/castle_brick_stairs_inner", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=west,half=top,shape=inner_right": { + "model": "twilightforest:block/castle_brick_stairs_inner", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=west,half=top,shape=outer_left": { + "model": "twilightforest:block/castle_brick_stairs_outer", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=west,half=top,shape=outer_right": { + "model": "twilightforest:block/castle_brick_stairs_outer", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=west,half=top,shape=straight": { + "model": "twilightforest:block/castle_brick_stairs", + "uvlock": true, + "x": 180, + "y": 180 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/castle_roof_tile.json b/src/generated/resources/assets/twilightforest/blockstates/castle_roof_tile.json new file mode 100644 index 0000000000..62cf114fe0 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/castle_roof_tile.json @@ -0,0 +1,50 @@ +{ + "variants": { + "": [ + { + "model": "twilightforest:block/castle_roof_tile" + }, + { + "model": "twilightforest:block/castle_roof_tile", + "y": 90 + }, + { + "model": "twilightforest:block/castle_roof_tile", + "y": 180 + }, + { + "model": "twilightforest:block/castle_roof_tile", + "x": 90 + }, + { + "model": "twilightforest:block/castle_roof_tile", + "x": 90, + "y": 90 + }, + { + "model": "twilightforest:block/castle_roof_tile", + "x": 90, + "y": 180 + }, + { + "model": "twilightforest:block/castle_roof_tile", + "x": 180 + }, + { + "model": "twilightforest:block/castle_roof_tile", + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/castle_roof_tile", + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/castle_roof_tile", + "x": 270, + "y": 270 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/cicada.json b/src/generated/resources/assets/twilightforest/blockstates/cicada.json new file mode 100644 index 0000000000..ac24db2db8 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/cicada.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/cicada" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/cicada_jar.json b/src/generated/resources/assets/twilightforest/blockstates/cicada_jar.json new file mode 100644 index 0000000000..7475fc902b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/cicada_jar.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/cicada_jar" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/cinder_furnace.json b/src/generated/resources/assets/twilightforest/blockstates/cinder_furnace.json new file mode 100644 index 0000000000..9c31d91fc8 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/cinder_furnace.json @@ -0,0 +1,34 @@ +{ + "variants": { + "facing=east,lit=false": { + "model": "minecraft:block/furnace", + "y": 90 + }, + "facing=east,lit=true": { + "model": "minecraft:block/furnace_on", + "y": 90 + }, + "facing=north,lit=false": { + "model": "minecraft:block/furnace" + }, + "facing=north,lit=true": { + "model": "minecraft:block/furnace_on" + }, + "facing=south,lit=false": { + "model": "minecraft:block/furnace", + "y": 180 + }, + "facing=south,lit=true": { + "model": "minecraft:block/furnace_on", + "y": 180 + }, + "facing=west,lit=false": { + "model": "minecraft:block/furnace", + "y": 270 + }, + "facing=west,lit=true": { + "model": "minecraft:block/furnace_on", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/cinder_log.json b/src/generated/resources/assets/twilightforest/blockstates/cinder_log.json new file mode 100644 index 0000000000..403cb08ea0 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/cinder_log.json @@ -0,0 +1,16 @@ +{ + "variants": { + "axis=x": { + "model": "twilightforest:block/cinder_log_horizontal", + "x": 90, + "y": 90 + }, + "axis=y": { + "model": "twilightforest:block/cinder_log" + }, + "axis=z": { + "model": "twilightforest:block/cinder_log_horizontal", + "x": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/cinder_wood.json b/src/generated/resources/assets/twilightforest/blockstates/cinder_wood.json new file mode 100644 index 0000000000..ee1c8d58ca --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/cinder_wood.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/cinder_wood" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/clover_patch.json b/src/generated/resources/assets/twilightforest/blockstates/clover_patch.json new file mode 100644 index 0000000000..fcbe33679d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/clover_patch.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/clover_patch" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/cracked_castle_brick.json b/src/generated/resources/assets/twilightforest/blockstates/cracked_castle_brick.json new file mode 100644 index 0000000000..a765fed592 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/cracked_castle_brick.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/cracked_castle_brick" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/cracked_castle_brick_stairs.json b/src/generated/resources/assets/twilightforest/blockstates/cracked_castle_brick_stairs.json new file mode 100644 index 0000000000..61ba48f1a0 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/cracked_castle_brick_stairs.json @@ -0,0 +1,209 @@ +{ + "variants": { + "facing=east,half=bottom,shape=inner_left": { + "model": "twilightforest:block/cracked_castle_brick_stairs_inner", + "uvlock": true, + "y": 270 + }, + "facing=east,half=bottom,shape=inner_right": { + "model": "twilightforest:block/cracked_castle_brick_stairs_inner" + }, + "facing=east,half=bottom,shape=outer_left": { + "model": "twilightforest:block/cracked_castle_brick_stairs_outer", + "uvlock": true, + "y": 270 + }, + "facing=east,half=bottom,shape=outer_right": { + "model": "twilightforest:block/cracked_castle_brick_stairs_outer" + }, + "facing=east,half=bottom,shape=straight": { + "model": "twilightforest:block/cracked_castle_brick_stairs" + }, + "facing=east,half=top,shape=inner_left": { + "model": "twilightforest:block/cracked_castle_brick_stairs_inner", + "uvlock": true, + "x": 180 + }, + "facing=east,half=top,shape=inner_right": { + "model": "twilightforest:block/cracked_castle_brick_stairs_inner", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=east,half=top,shape=outer_left": { + "model": "twilightforest:block/cracked_castle_brick_stairs_outer", + "uvlock": true, + "x": 180 + }, + "facing=east,half=top,shape=outer_right": { + "model": "twilightforest:block/cracked_castle_brick_stairs_outer", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=east,half=top,shape=straight": { + "model": "twilightforest:block/cracked_castle_brick_stairs", + "uvlock": true, + "x": 180 + }, + "facing=north,half=bottom,shape=inner_left": { + "model": "twilightforest:block/cracked_castle_brick_stairs_inner", + "uvlock": true, + "y": 180 + }, + "facing=north,half=bottom,shape=inner_right": { + "model": "twilightforest:block/cracked_castle_brick_stairs_inner", + "uvlock": true, + "y": 270 + }, + "facing=north,half=bottom,shape=outer_left": { + "model": "twilightforest:block/cracked_castle_brick_stairs_outer", + "uvlock": true, + "y": 180 + }, + "facing=north,half=bottom,shape=outer_right": { + "model": "twilightforest:block/cracked_castle_brick_stairs_outer", + "uvlock": true, + "y": 270 + }, + "facing=north,half=bottom,shape=straight": { + "model": "twilightforest:block/cracked_castle_brick_stairs", + "uvlock": true, + "y": 270 + }, + "facing=north,half=top,shape=inner_left": { + "model": "twilightforest:block/cracked_castle_brick_stairs_inner", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=north,half=top,shape=inner_right": { + "model": "twilightforest:block/cracked_castle_brick_stairs_inner", + "uvlock": true, + "x": 180 + }, + "facing=north,half=top,shape=outer_left": { + "model": "twilightforest:block/cracked_castle_brick_stairs_outer", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=north,half=top,shape=outer_right": { + "model": "twilightforest:block/cracked_castle_brick_stairs_outer", + "uvlock": true, + "x": 180 + }, + "facing=north,half=top,shape=straight": { + "model": "twilightforest:block/cracked_castle_brick_stairs", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=south,half=bottom,shape=inner_left": { + "model": "twilightforest:block/cracked_castle_brick_stairs_inner" + }, + "facing=south,half=bottom,shape=inner_right": { + "model": "twilightforest:block/cracked_castle_brick_stairs_inner", + "uvlock": true, + "y": 90 + }, + "facing=south,half=bottom,shape=outer_left": { + "model": "twilightforest:block/cracked_castle_brick_stairs_outer" + }, + "facing=south,half=bottom,shape=outer_right": { + "model": "twilightforest:block/cracked_castle_brick_stairs_outer", + "uvlock": true, + "y": 90 + }, + "facing=south,half=bottom,shape=straight": { + "model": "twilightforest:block/cracked_castle_brick_stairs", + "uvlock": true, + "y": 90 + }, + "facing=south,half=top,shape=inner_left": { + "model": "twilightforest:block/cracked_castle_brick_stairs_inner", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=south,half=top,shape=inner_right": { + "model": "twilightforest:block/cracked_castle_brick_stairs_inner", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=south,half=top,shape=outer_left": { + "model": "twilightforest:block/cracked_castle_brick_stairs_outer", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=south,half=top,shape=outer_right": { + "model": "twilightforest:block/cracked_castle_brick_stairs_outer", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=south,half=top,shape=straight": { + "model": "twilightforest:block/cracked_castle_brick_stairs", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=west,half=bottom,shape=inner_left": { + "model": "twilightforest:block/cracked_castle_brick_stairs_inner", + "uvlock": true, + "y": 90 + }, + "facing=west,half=bottom,shape=inner_right": { + "model": "twilightforest:block/cracked_castle_brick_stairs_inner", + "uvlock": true, + "y": 180 + }, + "facing=west,half=bottom,shape=outer_left": { + "model": "twilightforest:block/cracked_castle_brick_stairs_outer", + "uvlock": true, + "y": 90 + }, + "facing=west,half=bottom,shape=outer_right": { + "model": "twilightforest:block/cracked_castle_brick_stairs_outer", + "uvlock": true, + "y": 180 + }, + "facing=west,half=bottom,shape=straight": { + "model": "twilightforest:block/cracked_castle_brick_stairs", + "uvlock": true, + "y": 180 + }, + "facing=west,half=top,shape=inner_left": { + "model": "twilightforest:block/cracked_castle_brick_stairs_inner", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=west,half=top,shape=inner_right": { + "model": "twilightforest:block/cracked_castle_brick_stairs_inner", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=west,half=top,shape=outer_left": { + "model": "twilightforest:block/cracked_castle_brick_stairs_outer", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=west,half=top,shape=outer_right": { + "model": "twilightforest:block/cracked_castle_brick_stairs_outer", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=west,half=top,shape=straight": { + "model": "twilightforest:block/cracked_castle_brick_stairs", + "uvlock": true, + "x": 180, + "y": 180 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/cracked_deadrock.json b/src/generated/resources/assets/twilightforest/blockstates/cracked_deadrock.json new file mode 100644 index 0000000000..3ddf677544 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/cracked_deadrock.json @@ -0,0 +1,50 @@ +{ + "variants": { + "": [ + { + "model": "twilightforest:block/cracked_deadrock" + }, + { + "model": "twilightforest:block/cracked_deadrock", + "y": 90 + }, + { + "model": "twilightforest:block/cracked_deadrock", + "y": 180 + }, + { + "model": "twilightforest:block/cracked_deadrock", + "x": 90 + }, + { + "model": "twilightforest:block/cracked_deadrock", + "x": 90, + "y": 90 + }, + { + "model": "twilightforest:block/cracked_deadrock", + "x": 90, + "y": 180 + }, + { + "model": "twilightforest:block/cracked_deadrock", + "x": 180 + }, + { + "model": "twilightforest:block/cracked_deadrock", + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/cracked_deadrock", + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/cracked_deadrock", + "x": 270, + "y": 270 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/cracked_etched_nagastone.json b/src/generated/resources/assets/twilightforest/blockstates/cracked_etched_nagastone.json new file mode 100644 index 0000000000..2b76a6a1b1 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/cracked_etched_nagastone.json @@ -0,0 +1,22 @@ +{ + "variants": { + "facing=down": { + "model": "twilightforest:block/cracked_etched_nagastone" + }, + "facing=east": { + "model": "twilightforest:block/cracked_etched_nagastone_east" + }, + "facing=north": { + "model": "twilightforest:block/cracked_etched_nagastone_north" + }, + "facing=south": { + "model": "twilightforest:block/cracked_etched_nagastone_south" + }, + "facing=up": { + "model": "twilightforest:block/cracked_etched_nagastone_up" + }, + "facing=west": { + "model": "twilightforest:block/cracked_etched_nagastone_west" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/cracked_mazestone.json b/src/generated/resources/assets/twilightforest/blockstates/cracked_mazestone.json new file mode 100644 index 0000000000..d4a6f137c0 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/cracked_mazestone.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/cracked_mazestone" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/cracked_nagastone_pillar.json b/src/generated/resources/assets/twilightforest/blockstates/cracked_nagastone_pillar.json new file mode 100644 index 0000000000..b41907a75b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/cracked_nagastone_pillar.json @@ -0,0 +1,28 @@ +{ + "variants": { + "axis=x,reversed=false": { + "model": "twilightforest:block/cracked_nagastone_pillar", + "x": 270, + "y": 270 + }, + "axis=x,reversed=true": { + "model": "twilightforest:block/cracked_nagastone_pillar_reversed", + "x": 270, + "y": 270 + }, + "axis=y,reversed=false": { + "model": "twilightforest:block/cracked_nagastone_pillar" + }, + "axis=y,reversed=true": { + "model": "twilightforest:block/cracked_nagastone_pillar_reversed" + }, + "axis=z,reversed=false": { + "model": "twilightforest:block/cracked_nagastone_pillar", + "x": 270 + }, + "axis=z,reversed=true": { + "model": "twilightforest:block/cracked_nagastone_pillar_reversed", + "x": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/cracked_nagastone_stairs_left.json b/src/generated/resources/assets/twilightforest/blockstates/cracked_nagastone_stairs_left.json new file mode 100644 index 0000000000..11518df5e1 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/cracked_nagastone_stairs_left.json @@ -0,0 +1,209 @@ +{ + "variants": { + "facing=east,half=bottom,shape=inner_left": { + "model": "twilightforest:block/cracked_nagastone_stairs_left_inner", + "uvlock": true, + "y": 270 + }, + "facing=east,half=bottom,shape=inner_right": { + "model": "twilightforest:block/cracked_nagastone_stairs_left_inner" + }, + "facing=east,half=bottom,shape=outer_left": { + "model": "twilightforest:block/cracked_nagastone_stairs_left_outer", + "uvlock": true, + "y": 270 + }, + "facing=east,half=bottom,shape=outer_right": { + "model": "twilightforest:block/cracked_nagastone_stairs_left_outer" + }, + "facing=east,half=bottom,shape=straight": { + "model": "twilightforest:block/cracked_nagastone_stairs_left" + }, + "facing=east,half=top,shape=inner_left": { + "model": "twilightforest:block/cracked_nagastone_stairs_left_inner", + "uvlock": true, + "x": 180 + }, + "facing=east,half=top,shape=inner_right": { + "model": "twilightforest:block/cracked_nagastone_stairs_left_inner", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=east,half=top,shape=outer_left": { + "model": "twilightforest:block/cracked_nagastone_stairs_left_outer", + "uvlock": true, + "x": 180 + }, + "facing=east,half=top,shape=outer_right": { + "model": "twilightforest:block/cracked_nagastone_stairs_left_outer", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=east,half=top,shape=straight": { + "model": "twilightforest:block/cracked_nagastone_stairs_left", + "uvlock": true, + "x": 180 + }, + "facing=north,half=bottom,shape=inner_left": { + "model": "twilightforest:block/cracked_nagastone_stairs_left_inner", + "uvlock": true, + "y": 180 + }, + "facing=north,half=bottom,shape=inner_right": { + "model": "twilightforest:block/cracked_nagastone_stairs_left_inner", + "uvlock": true, + "y": 270 + }, + "facing=north,half=bottom,shape=outer_left": { + "model": "twilightforest:block/cracked_nagastone_stairs_left_outer", + "uvlock": true, + "y": 180 + }, + "facing=north,half=bottom,shape=outer_right": { + "model": "twilightforest:block/cracked_nagastone_stairs_left_outer", + "uvlock": true, + "y": 270 + }, + "facing=north,half=bottom,shape=straight": { + "model": "twilightforest:block/cracked_nagastone_stairs_left", + "uvlock": true, + "y": 270 + }, + "facing=north,half=top,shape=inner_left": { + "model": "twilightforest:block/cracked_nagastone_stairs_left_inner", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=north,half=top,shape=inner_right": { + "model": "twilightforest:block/cracked_nagastone_stairs_left_inner", + "uvlock": true, + "x": 180 + }, + "facing=north,half=top,shape=outer_left": { + "model": "twilightforest:block/cracked_nagastone_stairs_left_outer", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=north,half=top,shape=outer_right": { + "model": "twilightforest:block/cracked_nagastone_stairs_left_outer", + "uvlock": true, + "x": 180 + }, + "facing=north,half=top,shape=straight": { + "model": "twilightforest:block/cracked_nagastone_stairs_left", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=south,half=bottom,shape=inner_left": { + "model": "twilightforest:block/cracked_nagastone_stairs_left_inner" + }, + "facing=south,half=bottom,shape=inner_right": { + "model": "twilightforest:block/cracked_nagastone_stairs_left_inner", + "uvlock": true, + "y": 90 + }, + "facing=south,half=bottom,shape=outer_left": { + "model": "twilightforest:block/cracked_nagastone_stairs_left_outer" + }, + "facing=south,half=bottom,shape=outer_right": { + "model": "twilightforest:block/cracked_nagastone_stairs_left_outer", + "uvlock": true, + "y": 90 + }, + "facing=south,half=bottom,shape=straight": { + "model": "twilightforest:block/cracked_nagastone_stairs_left", + "uvlock": true, + "y": 90 + }, + "facing=south,half=top,shape=inner_left": { + "model": "twilightforest:block/cracked_nagastone_stairs_left_inner", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=south,half=top,shape=inner_right": { + "model": "twilightforest:block/cracked_nagastone_stairs_left_inner", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=south,half=top,shape=outer_left": { + "model": "twilightforest:block/cracked_nagastone_stairs_left_outer", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=south,half=top,shape=outer_right": { + "model": "twilightforest:block/cracked_nagastone_stairs_left_outer", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=south,half=top,shape=straight": { + "model": "twilightforest:block/cracked_nagastone_stairs_left", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=west,half=bottom,shape=inner_left": { + "model": "twilightforest:block/cracked_nagastone_stairs_left_inner", + "uvlock": true, + "y": 90 + }, + "facing=west,half=bottom,shape=inner_right": { + "model": "twilightforest:block/cracked_nagastone_stairs_left_inner", + "uvlock": true, + "y": 180 + }, + "facing=west,half=bottom,shape=outer_left": { + "model": "twilightforest:block/cracked_nagastone_stairs_left_outer", + "uvlock": true, + "y": 90 + }, + "facing=west,half=bottom,shape=outer_right": { + "model": "twilightforest:block/cracked_nagastone_stairs_left_outer", + "uvlock": true, + "y": 180 + }, + "facing=west,half=bottom,shape=straight": { + "model": "twilightforest:block/cracked_nagastone_stairs_left", + "uvlock": true, + "y": 180 + }, + "facing=west,half=top,shape=inner_left": { + "model": "twilightforest:block/cracked_nagastone_stairs_left_inner", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=west,half=top,shape=inner_right": { + "model": "twilightforest:block/cracked_nagastone_stairs_left_inner", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=west,half=top,shape=outer_left": { + "model": "twilightforest:block/cracked_nagastone_stairs_left_outer", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=west,half=top,shape=outer_right": { + "model": "twilightforest:block/cracked_nagastone_stairs_left_outer", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=west,half=top,shape=straight": { + "model": "twilightforest:block/cracked_nagastone_stairs_left", + "uvlock": true, + "x": 180, + "y": 180 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/cracked_nagastone_stairs_right.json b/src/generated/resources/assets/twilightforest/blockstates/cracked_nagastone_stairs_right.json new file mode 100644 index 0000000000..8303abe4bb --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/cracked_nagastone_stairs_right.json @@ -0,0 +1,209 @@ +{ + "variants": { + "facing=east,half=bottom,shape=inner_left": { + "model": "twilightforest:block/cracked_nagastone_stairs_right_inner", + "uvlock": true, + "y": 270 + }, + "facing=east,half=bottom,shape=inner_right": { + "model": "twilightforest:block/cracked_nagastone_stairs_right_inner" + }, + "facing=east,half=bottom,shape=outer_left": { + "model": "twilightforest:block/cracked_nagastone_stairs_right_outer", + "uvlock": true, + "y": 270 + }, + "facing=east,half=bottom,shape=outer_right": { + "model": "twilightforest:block/cracked_nagastone_stairs_right_outer" + }, + "facing=east,half=bottom,shape=straight": { + "model": "twilightforest:block/cracked_nagastone_stairs_right" + }, + "facing=east,half=top,shape=inner_left": { + "model": "twilightforest:block/cracked_nagastone_stairs_right_inner", + "uvlock": true, + "x": 180 + }, + "facing=east,half=top,shape=inner_right": { + "model": "twilightforest:block/cracked_nagastone_stairs_right_inner", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=east,half=top,shape=outer_left": { + "model": "twilightforest:block/cracked_nagastone_stairs_right_outer", + "uvlock": true, + "x": 180 + }, + "facing=east,half=top,shape=outer_right": { + "model": "twilightforest:block/cracked_nagastone_stairs_right_outer", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=east,half=top,shape=straight": { + "model": "twilightforest:block/cracked_nagastone_stairs_right", + "uvlock": true, + "x": 180 + }, + "facing=north,half=bottom,shape=inner_left": { + "model": "twilightforest:block/cracked_nagastone_stairs_right_inner", + "uvlock": true, + "y": 180 + }, + "facing=north,half=bottom,shape=inner_right": { + "model": "twilightforest:block/cracked_nagastone_stairs_right_inner", + "uvlock": true, + "y": 270 + }, + "facing=north,half=bottom,shape=outer_left": { + "model": "twilightforest:block/cracked_nagastone_stairs_right_outer", + "uvlock": true, + "y": 180 + }, + "facing=north,half=bottom,shape=outer_right": { + "model": "twilightforest:block/cracked_nagastone_stairs_right_outer", + "uvlock": true, + "y": 270 + }, + "facing=north,half=bottom,shape=straight": { + "model": "twilightforest:block/cracked_nagastone_stairs_right", + "uvlock": true, + "y": 270 + }, + "facing=north,half=top,shape=inner_left": { + "model": "twilightforest:block/cracked_nagastone_stairs_right_inner", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=north,half=top,shape=inner_right": { + "model": "twilightforest:block/cracked_nagastone_stairs_right_inner", + "uvlock": true, + "x": 180 + }, + "facing=north,half=top,shape=outer_left": { + "model": "twilightforest:block/cracked_nagastone_stairs_right_outer", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=north,half=top,shape=outer_right": { + "model": "twilightforest:block/cracked_nagastone_stairs_right_outer", + "uvlock": true, + "x": 180 + }, + "facing=north,half=top,shape=straight": { + "model": "twilightforest:block/cracked_nagastone_stairs_right", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=south,half=bottom,shape=inner_left": { + "model": "twilightforest:block/cracked_nagastone_stairs_right_inner" + }, + "facing=south,half=bottom,shape=inner_right": { + "model": "twilightforest:block/cracked_nagastone_stairs_right_inner", + "uvlock": true, + "y": 90 + }, + "facing=south,half=bottom,shape=outer_left": { + "model": "twilightforest:block/cracked_nagastone_stairs_right_outer" + }, + "facing=south,half=bottom,shape=outer_right": { + "model": "twilightforest:block/cracked_nagastone_stairs_right_outer", + "uvlock": true, + "y": 90 + }, + "facing=south,half=bottom,shape=straight": { + "model": "twilightforest:block/cracked_nagastone_stairs_right", + "uvlock": true, + "y": 90 + }, + "facing=south,half=top,shape=inner_left": { + "model": "twilightforest:block/cracked_nagastone_stairs_right_inner", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=south,half=top,shape=inner_right": { + "model": "twilightforest:block/cracked_nagastone_stairs_right_inner", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=south,half=top,shape=outer_left": { + "model": "twilightforest:block/cracked_nagastone_stairs_right_outer", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=south,half=top,shape=outer_right": { + "model": "twilightforest:block/cracked_nagastone_stairs_right_outer", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=south,half=top,shape=straight": { + "model": "twilightforest:block/cracked_nagastone_stairs_right", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=west,half=bottom,shape=inner_left": { + "model": "twilightforest:block/cracked_nagastone_stairs_right_inner", + "uvlock": true, + "y": 90 + }, + "facing=west,half=bottom,shape=inner_right": { + "model": "twilightforest:block/cracked_nagastone_stairs_right_inner", + "uvlock": true, + "y": 180 + }, + "facing=west,half=bottom,shape=outer_left": { + "model": "twilightforest:block/cracked_nagastone_stairs_right_outer", + "uvlock": true, + "y": 90 + }, + "facing=west,half=bottom,shape=outer_right": { + "model": "twilightforest:block/cracked_nagastone_stairs_right_outer", + "uvlock": true, + "y": 180 + }, + "facing=west,half=bottom,shape=straight": { + "model": "twilightforest:block/cracked_nagastone_stairs_right", + "uvlock": true, + "y": 180 + }, + "facing=west,half=top,shape=inner_left": { + "model": "twilightforest:block/cracked_nagastone_stairs_right_inner", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=west,half=top,shape=inner_right": { + "model": "twilightforest:block/cracked_nagastone_stairs_right_inner", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=west,half=top,shape=outer_left": { + "model": "twilightforest:block/cracked_nagastone_stairs_right_outer", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=west,half=top,shape=outer_right": { + "model": "twilightforest:block/cracked_nagastone_stairs_right_outer", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=west,half=top,shape=straight": { + "model": "twilightforest:block/cracked_nagastone_stairs_right", + "uvlock": true, + "x": 180, + "y": 180 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/cracked_towerwood.json b/src/generated/resources/assets/twilightforest/blockstates/cracked_towerwood.json new file mode 100644 index 0000000000..0dffcf8811 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/cracked_towerwood.json @@ -0,0 +1,18 @@ +{ + "variants": { + "": [ + { + "model": "twilightforest:block/cracked_towerwood" + }, + { + "model": "twilightforest:block/cracked_towerwood_flipped" + }, + { + "model": "twilightforest:block/cracked_towerwood_alt" + }, + { + "model": "twilightforest:block/cracked_towerwood_alt_flipped" + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/cracked_underbrick.json b/src/generated/resources/assets/twilightforest/blockstates/cracked_underbrick.json new file mode 100644 index 0000000000..1a8dbe5ead --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/cracked_underbrick.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/cracked_underbrick" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/creeper_skull_candle.json b/src/generated/resources/assets/twilightforest/blockstates/creeper_skull_candle.json new file mode 100644 index 0000000000..3951e3eea5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/creeper_skull_candle.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "minecraft:block/skull" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/creeper_wall_skull_candle.json b/src/generated/resources/assets/twilightforest/blockstates/creeper_wall_skull_candle.json new file mode 100644 index 0000000000..3951e3eea5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/creeper_wall_skull_candle.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "minecraft:block/skull" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/crimson_banister.json b/src/generated/resources/assets/twilightforest/blockstates/crimson_banister.json new file mode 100644 index 0000000000..498d69d95c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/crimson_banister.json @@ -0,0 +1,94 @@ +{ + "variants": { + "extended=false,facing=east,shape=connected": { + "model": "twilightforest:block/wood/banister/crimson/crimson_banister_connected", + "y": 270 + }, + "extended=false,facing=east,shape=short": { + "model": "twilightforest:block/wood/banister/crimson/crimson_banister_short", + "y": 270 + }, + "extended=false,facing=east,shape=tall": { + "model": "twilightforest:block/wood/banister/crimson/crimson_banister_tall", + "y": 270 + }, + "extended=false,facing=north,shape=connected": { + "model": "twilightforest:block/wood/banister/crimson/crimson_banister_connected", + "y": 180 + }, + "extended=false,facing=north,shape=short": { + "model": "twilightforest:block/wood/banister/crimson/crimson_banister_short", + "y": 180 + }, + "extended=false,facing=north,shape=tall": { + "model": "twilightforest:block/wood/banister/crimson/crimson_banister_tall", + "y": 180 + }, + "extended=false,facing=south,shape=connected": { + "model": "twilightforest:block/wood/banister/crimson/crimson_banister_connected" + }, + "extended=false,facing=south,shape=short": { + "model": "twilightforest:block/wood/banister/crimson/crimson_banister_short" + }, + "extended=false,facing=south,shape=tall": { + "model": "twilightforest:block/wood/banister/crimson/crimson_banister_tall" + }, + "extended=false,facing=west,shape=connected": { + "model": "twilightforest:block/wood/banister/crimson/crimson_banister_connected", + "y": 90 + }, + "extended=false,facing=west,shape=short": { + "model": "twilightforest:block/wood/banister/crimson/crimson_banister_short", + "y": 90 + }, + "extended=false,facing=west,shape=tall": { + "model": "twilightforest:block/wood/banister/crimson/crimson_banister_tall", + "y": 90 + }, + "extended=true,facing=east,shape=connected": { + "model": "twilightforest:block/wood/banister/crimson/crimson_banister_connected_extended", + "y": 270 + }, + "extended=true,facing=east,shape=short": { + "model": "twilightforest:block/wood/banister/crimson/crimson_banister_short_extended", + "y": 270 + }, + "extended=true,facing=east,shape=tall": { + "model": "twilightforest:block/wood/banister/crimson/crimson_banister_tall_extended", + "y": 270 + }, + "extended=true,facing=north,shape=connected": { + "model": "twilightforest:block/wood/banister/crimson/crimson_banister_connected_extended", + "y": 180 + }, + "extended=true,facing=north,shape=short": { + "model": "twilightforest:block/wood/banister/crimson/crimson_banister_short_extended", + "y": 180 + }, + "extended=true,facing=north,shape=tall": { + "model": "twilightforest:block/wood/banister/crimson/crimson_banister_tall_extended", + "y": 180 + }, + "extended=true,facing=south,shape=connected": { + "model": "twilightforest:block/wood/banister/crimson/crimson_banister_connected_extended" + }, + "extended=true,facing=south,shape=short": { + "model": "twilightforest:block/wood/banister/crimson/crimson_banister_short_extended" + }, + "extended=true,facing=south,shape=tall": { + "model": "twilightforest:block/wood/banister/crimson/crimson_banister_tall_extended" + }, + "extended=true,facing=west,shape=connected": { + "model": "twilightforest:block/wood/banister/crimson/crimson_banister_connected_extended", + "y": 90 + }, + "extended=true,facing=west,shape=short": { + "model": "twilightforest:block/wood/banister/crimson/crimson_banister_short_extended", + "y": 90 + }, + "extended=true,facing=west,shape=tall": { + "model": "twilightforest:block/wood/banister/crimson/crimson_banister_tall_extended", + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/cut_mazestone.json b/src/generated/resources/assets/twilightforest/blockstates/cut_mazestone.json new file mode 100644 index 0000000000..b713a8137f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/cut_mazestone.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/cut_mazestone" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/dark_banister.json b/src/generated/resources/assets/twilightforest/blockstates/dark_banister.json new file mode 100644 index 0000000000..e69b92274b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/dark_banister.json @@ -0,0 +1,460 @@ +{ + "variants": { + "extended=false,facing=east,shape=connected": [ + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_connected", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_connected_1", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_connected_2", + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_connected_3", + "y": 270 + } + ], + "extended=false,facing=east,shape=short": [ + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_short", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_short_1", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_short_2", + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_short_3", + "y": 270 + } + ], + "extended=false,facing=east,shape=tall": [ + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_tall", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_tall_1", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_tall_2", + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_tall_3", + "y": 270 + } + ], + "extended=false,facing=north,shape=connected": [ + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_connected", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_connected_1", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_connected_2", + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_connected_3", + "y": 180 + } + ], + "extended=false,facing=north,shape=short": [ + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_short", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_short_1", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_short_2", + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_short_3", + "y": 180 + } + ], + "extended=false,facing=north,shape=tall": [ + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_tall", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_tall_1", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_tall_2", + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_tall_3", + "y": 180 + } + ], + "extended=false,facing=south,shape=connected": [ + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_connected", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_connected_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_connected_2" + }, + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_connected_3" + } + ], + "extended=false,facing=south,shape=short": [ + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_short", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_short_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_short_2" + }, + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_short_3" + } + ], + "extended=false,facing=south,shape=tall": [ + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_tall", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_tall_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_tall_2" + }, + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_tall_3" + } + ], + "extended=false,facing=west,shape=connected": [ + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_connected", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_connected_1", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_connected_2", + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_connected_3", + "y": 90 + } + ], + "extended=false,facing=west,shape=short": [ + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_short", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_short_1", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_short_2", + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_short_3", + "y": 90 + } + ], + "extended=false,facing=west,shape=tall": [ + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_tall", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_tall_1", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_tall_2", + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_tall_3", + "y": 90 + } + ], + "extended=true,facing=east,shape=connected": [ + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_connected_extended", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_connected_extended_1", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_connected_extended_2", + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_connected_extended_3", + "y": 270 + } + ], + "extended=true,facing=east,shape=short": [ + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_short_extended", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_short_extended_1", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_short_extended_2", + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_short_extended_3", + "y": 270 + } + ], + "extended=true,facing=east,shape=tall": [ + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_tall_extended", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_tall_extended_1", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_tall_extended_2", + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_tall_extended_3", + "y": 270 + } + ], + "extended=true,facing=north,shape=connected": [ + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_connected_extended", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_connected_extended_1", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_connected_extended_2", + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_connected_extended_3", + "y": 180 + } + ], + "extended=true,facing=north,shape=short": [ + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_short_extended", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_short_extended_1", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_short_extended_2", + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_short_extended_3", + "y": 180 + } + ], + "extended=true,facing=north,shape=tall": [ + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_tall_extended", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_tall_extended_1", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_tall_extended_2", + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_tall_extended_3", + "y": 180 + } + ], + "extended=true,facing=south,shape=connected": [ + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_connected_extended", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_connected_extended_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_connected_extended_2" + }, + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_connected_extended_3" + } + ], + "extended=true,facing=south,shape=short": [ + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_short_extended", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_short_extended_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_short_extended_2" + }, + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_short_extended_3" + } + ], + "extended=true,facing=south,shape=tall": [ + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_tall_extended", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_tall_extended_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_tall_extended_2" + }, + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_tall_extended_3" + } + ], + "extended=true,facing=west,shape=connected": [ + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_connected_extended", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_connected_extended_1", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_connected_extended_2", + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_connected_extended_3", + "y": 90 + } + ], + "extended=true,facing=west,shape=short": [ + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_short_extended", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_short_extended_1", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_short_extended_2", + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_short_extended_3", + "y": 90 + } + ], + "extended=true,facing=west,shape=tall": [ + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_tall_extended", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_tall_extended_1", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_tall_extended_2", + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/darkwood/dark_banister_tall_extended_3", + "y": 90 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/dark_button.json b/src/generated/resources/assets/twilightforest/blockstates/dark_button.json new file mode 100644 index 0000000000..ec3c73c70c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/dark_button.json @@ -0,0 +1,556 @@ +{ + "variants": { + "face=ceiling,facing=east,powered=false": [ + { + "model": "twilightforest:block/wood/button/darkwood/dark_button", + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_1", + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_2", + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_3", + "x": 180, + "y": 270 + } + ], + "face=ceiling,facing=east,powered=true": [ + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_pressed", + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_pressed_1", + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_pressed_2", + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_pressed_3", + "x": 180, + "y": 270 + } + ], + "face=ceiling,facing=north,powered=false": [ + { + "model": "twilightforest:block/wood/button/darkwood/dark_button", + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_1", + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_2", + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_3", + "x": 180, + "y": 180 + } + ], + "face=ceiling,facing=north,powered=true": [ + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_pressed", + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_pressed_1", + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_pressed_2", + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_pressed_3", + "x": 180, + "y": 180 + } + ], + "face=ceiling,facing=south,powered=false": [ + { + "model": "twilightforest:block/wood/button/darkwood/dark_button", + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_1", + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_2", + "x": 180 + }, + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_3", + "x": 180 + } + ], + "face=ceiling,facing=south,powered=true": [ + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_pressed", + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_pressed_1", + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_pressed_2", + "x": 180 + }, + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_pressed_3", + "x": 180 + } + ], + "face=ceiling,facing=west,powered=false": [ + { + "model": "twilightforest:block/wood/button/darkwood/dark_button", + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_1", + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_2", + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_3", + "x": 180, + "y": 90 + } + ], + "face=ceiling,facing=west,powered=true": [ + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_pressed", + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_pressed_1", + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_pressed_2", + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_pressed_3", + "x": 180, + "y": 90 + } + ], + "face=floor,facing=east,powered=false": [ + { + "model": "twilightforest:block/wood/button/darkwood/dark_button", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_1", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_2", + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_3", + "y": 90 + } + ], + "face=floor,facing=east,powered=true": [ + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_pressed", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_pressed_1", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_pressed_2", + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_pressed_3", + "y": 90 + } + ], + "face=floor,facing=north,powered=false": [ + { + "model": "twilightforest:block/wood/button/darkwood/dark_button", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_2" + }, + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_3" + } + ], + "face=floor,facing=north,powered=true": [ + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_pressed", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_pressed_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_pressed_2" + }, + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_pressed_3" + } + ], + "face=floor,facing=south,powered=false": [ + { + "model": "twilightforest:block/wood/button/darkwood/dark_button", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_1", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_2", + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_3", + "y": 180 + } + ], + "face=floor,facing=south,powered=true": [ + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_pressed", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_pressed_1", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_pressed_2", + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_pressed_3", + "y": 180 + } + ], + "face=floor,facing=west,powered=false": [ + { + "model": "twilightforest:block/wood/button/darkwood/dark_button", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_1", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_2", + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_3", + "y": 270 + } + ], + "face=floor,facing=west,powered=true": [ + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_pressed", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_pressed_1", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_pressed_2", + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_pressed_3", + "y": 270 + } + ], + "face=wall,facing=east,powered=false": [ + { + "model": "twilightforest:block/wood/button/darkwood/dark_button", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_1", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_2", + "uvlock": true, + "x": 90, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_3", + "uvlock": true, + "x": 90, + "y": 90 + } + ], + "face=wall,facing=east,powered=true": [ + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_pressed", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_pressed_1", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_pressed_2", + "uvlock": true, + "x": 90, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_pressed_3", + "uvlock": true, + "x": 90, + "y": 90 + } + ], + "face=wall,facing=north,powered=false": [ + { + "model": "twilightforest:block/wood/button/darkwood/dark_button", + "uvlock": true, + "weight": 10, + "x": 90 + }, + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_1", + "uvlock": true, + "weight": 10, + "x": 90 + }, + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_2", + "uvlock": true, + "x": 90 + }, + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_3", + "uvlock": true, + "x": 90 + } + ], + "face=wall,facing=north,powered=true": [ + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_pressed", + "uvlock": true, + "weight": 10, + "x": 90 + }, + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_pressed_1", + "uvlock": true, + "weight": 10, + "x": 90 + }, + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_pressed_2", + "uvlock": true, + "x": 90 + }, + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_pressed_3", + "uvlock": true, + "x": 90 + } + ], + "face=wall,facing=south,powered=false": [ + { + "model": "twilightforest:block/wood/button/darkwood/dark_button", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_1", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_2", + "uvlock": true, + "x": 90, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_3", + "uvlock": true, + "x": 90, + "y": 180 + } + ], + "face=wall,facing=south,powered=true": [ + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_pressed", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_pressed_1", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_pressed_2", + "uvlock": true, + "x": 90, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_pressed_3", + "uvlock": true, + "x": 90, + "y": 180 + } + ], + "face=wall,facing=west,powered=false": [ + { + "model": "twilightforest:block/wood/button/darkwood/dark_button", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_1", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_2", + "uvlock": true, + "x": 90, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_3", + "uvlock": true, + "x": 90, + "y": 270 + } + ], + "face=wall,facing=west,powered=true": [ + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_pressed", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_pressed_1", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_pressed_2", + "uvlock": true, + "x": 90, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/darkwood/dark_button_pressed_3", + "uvlock": true, + "x": 90, + "y": 270 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/dark_chest.json b/src/generated/resources/assets/twilightforest/blockstates/dark_chest.json new file mode 100644 index 0000000000..c051cced6b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/dark_chest.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/dark_chest" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/dark_door.json b/src/generated/resources/assets/twilightforest/blockstates/dark_door.json new file mode 100644 index 0000000000..5613c60c8e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/dark_door.json @@ -0,0 +1,124 @@ +{ + "variants": { + "facing=east,half=lower,hinge=left,open=false": { + "model": "twilightforest:block/wood/door/darkwood/dark_door_door_bottom_left" + }, + "facing=east,half=lower,hinge=left,open=true": { + "model": "twilightforest:block/wood/door/darkwood/dark_door_door_bottom_left_open", + "y": 90 + }, + "facing=east,half=lower,hinge=right,open=false": { + "model": "twilightforest:block/wood/door/darkwood/dark_door_door_bottom_right" + }, + "facing=east,half=lower,hinge=right,open=true": { + "model": "twilightforest:block/wood/door/darkwood/dark_door_door_bottom_right_open", + "y": 270 + }, + "facing=east,half=upper,hinge=left,open=false": { + "model": "twilightforest:block/wood/door/darkwood/dark_door_door_top_left" + }, + "facing=east,half=upper,hinge=left,open=true": { + "model": "twilightforest:block/wood/door/darkwood/dark_door_door_top_left_open", + "y": 90 + }, + "facing=east,half=upper,hinge=right,open=false": { + "model": "twilightforest:block/wood/door/darkwood/dark_door_door_top_right" + }, + "facing=east,half=upper,hinge=right,open=true": { + "model": "twilightforest:block/wood/door/darkwood/dark_door_door_top_right_open", + "y": 270 + }, + "facing=north,half=lower,hinge=left,open=false": { + "model": "twilightforest:block/wood/door/darkwood/dark_door_door_bottom_left", + "y": 270 + }, + "facing=north,half=lower,hinge=left,open=true": { + "model": "twilightforest:block/wood/door/darkwood/dark_door_door_bottom_left_open" + }, + "facing=north,half=lower,hinge=right,open=false": { + "model": "twilightforest:block/wood/door/darkwood/dark_door_door_bottom_right", + "y": 270 + }, + "facing=north,half=lower,hinge=right,open=true": { + "model": "twilightforest:block/wood/door/darkwood/dark_door_door_bottom_right_open", + "y": 180 + }, + "facing=north,half=upper,hinge=left,open=false": { + "model": "twilightforest:block/wood/door/darkwood/dark_door_door_top_left", + "y": 270 + }, + "facing=north,half=upper,hinge=left,open=true": { + "model": "twilightforest:block/wood/door/darkwood/dark_door_door_top_left_open" + }, + "facing=north,half=upper,hinge=right,open=false": { + "model": "twilightforest:block/wood/door/darkwood/dark_door_door_top_right", + "y": 270 + }, + "facing=north,half=upper,hinge=right,open=true": { + "model": "twilightforest:block/wood/door/darkwood/dark_door_door_top_right_open", + "y": 180 + }, + "facing=south,half=lower,hinge=left,open=false": { + "model": "twilightforest:block/wood/door/darkwood/dark_door_door_bottom_left", + "y": 90 + }, + "facing=south,half=lower,hinge=left,open=true": { + "model": "twilightforest:block/wood/door/darkwood/dark_door_door_bottom_left_open", + "y": 180 + }, + "facing=south,half=lower,hinge=right,open=false": { + "model": "twilightforest:block/wood/door/darkwood/dark_door_door_bottom_right", + "y": 90 + }, + "facing=south,half=lower,hinge=right,open=true": { + "model": "twilightforest:block/wood/door/darkwood/dark_door_door_bottom_right_open" + }, + "facing=south,half=upper,hinge=left,open=false": { + "model": "twilightforest:block/wood/door/darkwood/dark_door_door_top_left", + "y": 90 + }, + "facing=south,half=upper,hinge=left,open=true": { + "model": "twilightforest:block/wood/door/darkwood/dark_door_door_top_left_open", + "y": 180 + }, + "facing=south,half=upper,hinge=right,open=false": { + "model": "twilightforest:block/wood/door/darkwood/dark_door_door_top_right", + "y": 90 + }, + "facing=south,half=upper,hinge=right,open=true": { + "model": "twilightforest:block/wood/door/darkwood/dark_door_door_top_right_open" + }, + "facing=west,half=lower,hinge=left,open=false": { + "model": "twilightforest:block/wood/door/darkwood/dark_door_door_bottom_left", + "y": 180 + }, + "facing=west,half=lower,hinge=left,open=true": { + "model": "twilightforest:block/wood/door/darkwood/dark_door_door_bottom_left_open", + "y": 270 + }, + "facing=west,half=lower,hinge=right,open=false": { + "model": "twilightforest:block/wood/door/darkwood/dark_door_door_bottom_right", + "y": 180 + }, + "facing=west,half=lower,hinge=right,open=true": { + "model": "twilightforest:block/wood/door/darkwood/dark_door_door_bottom_right_open", + "y": 90 + }, + "facing=west,half=upper,hinge=left,open=false": { + "model": "twilightforest:block/wood/door/darkwood/dark_door_door_top_left", + "y": 180 + }, + "facing=west,half=upper,hinge=left,open=true": { + "model": "twilightforest:block/wood/door/darkwood/dark_door_door_top_left_open", + "y": 270 + }, + "facing=west,half=upper,hinge=right,open=false": { + "model": "twilightforest:block/wood/door/darkwood/dark_door_door_top_right", + "y": 180 + }, + "facing=west,half=upper,hinge=right,open=true": { + "model": "twilightforest:block/wood/door/darkwood/dark_door_door_top_right_open", + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/dark_fence.json b/src/generated/resources/assets/twilightforest/blockstates/dark_fence.json new file mode 100644 index 0000000000..e8ad16cbed --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/dark_fence.json @@ -0,0 +1,134 @@ +{ + "multipart": [ + { + "apply": [ + { + "model": "twilightforest:block/wood/fence/darkwood/dark_fence_post", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence/darkwood/dark_fence_post_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence/darkwood/dark_fence_post_2" + }, + { + "model": "twilightforest:block/wood/fence/darkwood/dark_fence_post_3" + } + ] + }, + { + "apply": [ + { + "model": "twilightforest:block/wood/fence/darkwood/dark_fence_side", + "uvlock": true, + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence/darkwood/dark_fence_side_1", + "uvlock": true, + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence/darkwood/dark_fence_side_2", + "uvlock": true + }, + { + "model": "twilightforest:block/wood/fence/darkwood/dark_fence_side_3", + "uvlock": true + } + ], + "when": { + "north": "true" + } + }, + { + "apply": [ + { + "model": "twilightforest:block/wood/fence/darkwood/dark_fence_side", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence/darkwood/dark_fence_side_1", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence/darkwood/dark_fence_side_2", + "uvlock": true, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence/darkwood/dark_fence_side_3", + "uvlock": true, + "y": 180 + } + ], + "when": { + "south": "true" + } + }, + { + "apply": [ + { + "model": "twilightforest:block/wood/fence/darkwood/dark_fence_side", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence/darkwood/dark_fence_side_1", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence/darkwood/dark_fence_side_2", + "uvlock": true, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence/darkwood/dark_fence_side_3", + "uvlock": true, + "y": 270 + } + ], + "when": { + "west": "true" + } + }, + { + "apply": [ + { + "model": "twilightforest:block/wood/fence/darkwood/dark_fence_side", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence/darkwood/dark_fence_side_1", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence/darkwood/dark_fence_side_2", + "uvlock": true, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence/darkwood/dark_fence_side_3", + "uvlock": true, + "y": 90 + } + ], + "when": { + "east": "true" + } + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/dark_fence_gate.json b/src/generated/resources/assets/twilightforest/blockstates/dark_fence_gate.json new file mode 100644 index 0000000000..3b641e0127 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/dark_fence_gate.json @@ -0,0 +1,372 @@ +{ + "variants": { + "facing=east,in_wall=false,open=false": [ + { + "model": "twilightforest:block/wood/fence_gate/darkwood/dark_fence_gate", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/darkwood/dark_fence_gate_1", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/darkwood/dark_fence_gate_2", + "uvlock": true, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/darkwood/dark_fence_gate_3", + "uvlock": true, + "y": 270 + } + ], + "facing=east,in_wall=false,open=true": [ + { + "model": "twilightforest:block/wood/fence_gate/darkwood/dark_fence_gate_open", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/darkwood/dark_fence_gate_open_1", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/darkwood/dark_fence_gate_open_2", + "uvlock": true, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/darkwood/dark_fence_gate_open_3", + "uvlock": true, + "y": 270 + } + ], + "facing=east,in_wall=true,open=false": [ + { + "model": "twilightforest:block/wood/fence_gate/darkwood/dark_fence_gate_wall", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/darkwood/dark_fence_gate_wall_1", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/darkwood/dark_fence_gate_wall_2", + "uvlock": true, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/darkwood/dark_fence_gate_wall_3", + "uvlock": true, + "y": 270 + } + ], + "facing=east,in_wall=true,open=true": [ + { + "model": "twilightforest:block/wood/fence_gate/darkwood/dark_fence_gate_wall_open", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/darkwood/dark_fence_gate_wall_open_1", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/darkwood/dark_fence_gate_wall_open_2", + "uvlock": true, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/darkwood/dark_fence_gate_wall_open_3", + "uvlock": true, + "y": 270 + } + ], + "facing=north,in_wall=false,open=false": [ + { + "model": "twilightforest:block/wood/fence_gate/darkwood/dark_fence_gate", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/darkwood/dark_fence_gate_1", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/darkwood/dark_fence_gate_2", + "uvlock": true, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/darkwood/dark_fence_gate_3", + "uvlock": true, + "y": 180 + } + ], + "facing=north,in_wall=false,open=true": [ + { + "model": "twilightforest:block/wood/fence_gate/darkwood/dark_fence_gate_open", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/darkwood/dark_fence_gate_open_1", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/darkwood/dark_fence_gate_open_2", + "uvlock": true, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/darkwood/dark_fence_gate_open_3", + "uvlock": true, + "y": 180 + } + ], + "facing=north,in_wall=true,open=false": [ + { + "model": "twilightforest:block/wood/fence_gate/darkwood/dark_fence_gate_wall", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/darkwood/dark_fence_gate_wall_1", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/darkwood/dark_fence_gate_wall_2", + "uvlock": true, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/darkwood/dark_fence_gate_wall_3", + "uvlock": true, + "y": 180 + } + ], + "facing=north,in_wall=true,open=true": [ + { + "model": "twilightforest:block/wood/fence_gate/darkwood/dark_fence_gate_wall_open", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/darkwood/dark_fence_gate_wall_open_1", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/darkwood/dark_fence_gate_wall_open_2", + "uvlock": true, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/darkwood/dark_fence_gate_wall_open_3", + "uvlock": true, + "y": 180 + } + ], + "facing=south,in_wall=false,open=false": [ + { + "model": "twilightforest:block/wood/fence_gate/darkwood/dark_fence_gate", + "uvlock": true, + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence_gate/darkwood/dark_fence_gate_1", + "uvlock": true, + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence_gate/darkwood/dark_fence_gate_2", + "uvlock": true + }, + { + "model": "twilightforest:block/wood/fence_gate/darkwood/dark_fence_gate_3", + "uvlock": true + } + ], + "facing=south,in_wall=false,open=true": [ + { + "model": "twilightforest:block/wood/fence_gate/darkwood/dark_fence_gate_open", + "uvlock": true, + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence_gate/darkwood/dark_fence_gate_open_1", + "uvlock": true, + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence_gate/darkwood/dark_fence_gate_open_2", + "uvlock": true + }, + { + "model": "twilightforest:block/wood/fence_gate/darkwood/dark_fence_gate_open_3", + "uvlock": true + } + ], + "facing=south,in_wall=true,open=false": [ + { + "model": "twilightforest:block/wood/fence_gate/darkwood/dark_fence_gate_wall", + "uvlock": true, + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence_gate/darkwood/dark_fence_gate_wall_1", + "uvlock": true, + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence_gate/darkwood/dark_fence_gate_wall_2", + "uvlock": true + }, + { + "model": "twilightforest:block/wood/fence_gate/darkwood/dark_fence_gate_wall_3", + "uvlock": true + } + ], + "facing=south,in_wall=true,open=true": [ + { + "model": "twilightforest:block/wood/fence_gate/darkwood/dark_fence_gate_wall_open", + "uvlock": true, + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence_gate/darkwood/dark_fence_gate_wall_open_1", + "uvlock": true, + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence_gate/darkwood/dark_fence_gate_wall_open_2", + "uvlock": true + }, + { + "model": "twilightforest:block/wood/fence_gate/darkwood/dark_fence_gate_wall_open_3", + "uvlock": true + } + ], + "facing=west,in_wall=false,open=false": [ + { + "model": "twilightforest:block/wood/fence_gate/darkwood/dark_fence_gate", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/darkwood/dark_fence_gate_1", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/darkwood/dark_fence_gate_2", + "uvlock": true, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/darkwood/dark_fence_gate_3", + "uvlock": true, + "y": 90 + } + ], + "facing=west,in_wall=false,open=true": [ + { + "model": "twilightforest:block/wood/fence_gate/darkwood/dark_fence_gate_open", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/darkwood/dark_fence_gate_open_1", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/darkwood/dark_fence_gate_open_2", + "uvlock": true, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/darkwood/dark_fence_gate_open_3", + "uvlock": true, + "y": 90 + } + ], + "facing=west,in_wall=true,open=false": [ + { + "model": "twilightforest:block/wood/fence_gate/darkwood/dark_fence_gate_wall", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/darkwood/dark_fence_gate_wall_1", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/darkwood/dark_fence_gate_wall_2", + "uvlock": true, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/darkwood/dark_fence_gate_wall_3", + "uvlock": true, + "y": 90 + } + ], + "facing=west,in_wall=true,open=true": [ + { + "model": "twilightforest:block/wood/fence_gate/darkwood/dark_fence_gate_wall_open", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/darkwood/dark_fence_gate_wall_open_1", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/darkwood/dark_fence_gate_wall_open_2", + "uvlock": true, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/darkwood/dark_fence_gate_wall_open_3", + "uvlock": true, + "y": 90 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/dark_leaves.json b/src/generated/resources/assets/twilightforest/blockstates/dark_leaves.json new file mode 100644 index 0000000000..3d92f70654 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/dark_leaves.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/dark_leaves" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/dark_log.json b/src/generated/resources/assets/twilightforest/blockstates/dark_log.json new file mode 100644 index 0000000000..2ccd5a44f4 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/dark_log.json @@ -0,0 +1,16 @@ +{ + "variants": { + "axis=x": { + "model": "twilightforest:block/dark_log_horizontal", + "x": 90, + "y": 90 + }, + "axis=y": { + "model": "twilightforest:block/dark_log" + }, + "axis=z": { + "model": "twilightforest:block/dark_log_horizontal", + "x": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/dark_oak_banister.json b/src/generated/resources/assets/twilightforest/blockstates/dark_oak_banister.json new file mode 100644 index 0000000000..d0a5652b6a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/dark_oak_banister.json @@ -0,0 +1,94 @@ +{ + "variants": { + "extended=false,facing=east,shape=connected": { + "model": "twilightforest:block/wood/banister/dark_oak/dark_oak_banister_connected", + "y": 270 + }, + "extended=false,facing=east,shape=short": { + "model": "twilightforest:block/wood/banister/dark_oak/dark_oak_banister_short", + "y": 270 + }, + "extended=false,facing=east,shape=tall": { + "model": "twilightforest:block/wood/banister/dark_oak/dark_oak_banister_tall", + "y": 270 + }, + "extended=false,facing=north,shape=connected": { + "model": "twilightforest:block/wood/banister/dark_oak/dark_oak_banister_connected", + "y": 180 + }, + "extended=false,facing=north,shape=short": { + "model": "twilightforest:block/wood/banister/dark_oak/dark_oak_banister_short", + "y": 180 + }, + "extended=false,facing=north,shape=tall": { + "model": "twilightforest:block/wood/banister/dark_oak/dark_oak_banister_tall", + "y": 180 + }, + "extended=false,facing=south,shape=connected": { + "model": "twilightforest:block/wood/banister/dark_oak/dark_oak_banister_connected" + }, + "extended=false,facing=south,shape=short": { + "model": "twilightforest:block/wood/banister/dark_oak/dark_oak_banister_short" + }, + "extended=false,facing=south,shape=tall": { + "model": "twilightforest:block/wood/banister/dark_oak/dark_oak_banister_tall" + }, + "extended=false,facing=west,shape=connected": { + "model": "twilightforest:block/wood/banister/dark_oak/dark_oak_banister_connected", + "y": 90 + }, + "extended=false,facing=west,shape=short": { + "model": "twilightforest:block/wood/banister/dark_oak/dark_oak_banister_short", + "y": 90 + }, + "extended=false,facing=west,shape=tall": { + "model": "twilightforest:block/wood/banister/dark_oak/dark_oak_banister_tall", + "y": 90 + }, + "extended=true,facing=east,shape=connected": { + "model": "twilightforest:block/wood/banister/dark_oak/dark_oak_banister_connected_extended", + "y": 270 + }, + "extended=true,facing=east,shape=short": { + "model": "twilightforest:block/wood/banister/dark_oak/dark_oak_banister_short_extended", + "y": 270 + }, + "extended=true,facing=east,shape=tall": { + "model": "twilightforest:block/wood/banister/dark_oak/dark_oak_banister_tall_extended", + "y": 270 + }, + "extended=true,facing=north,shape=connected": { + "model": "twilightforest:block/wood/banister/dark_oak/dark_oak_banister_connected_extended", + "y": 180 + }, + "extended=true,facing=north,shape=short": { + "model": "twilightforest:block/wood/banister/dark_oak/dark_oak_banister_short_extended", + "y": 180 + }, + "extended=true,facing=north,shape=tall": { + "model": "twilightforest:block/wood/banister/dark_oak/dark_oak_banister_tall_extended", + "y": 180 + }, + "extended=true,facing=south,shape=connected": { + "model": "twilightforest:block/wood/banister/dark_oak/dark_oak_banister_connected_extended" + }, + "extended=true,facing=south,shape=short": { + "model": "twilightforest:block/wood/banister/dark_oak/dark_oak_banister_short_extended" + }, + "extended=true,facing=south,shape=tall": { + "model": "twilightforest:block/wood/banister/dark_oak/dark_oak_banister_tall_extended" + }, + "extended=true,facing=west,shape=connected": { + "model": "twilightforest:block/wood/banister/dark_oak/dark_oak_banister_connected_extended", + "y": 90 + }, + "extended=true,facing=west,shape=short": { + "model": "twilightforest:block/wood/banister/dark_oak/dark_oak_banister_short_extended", + "y": 90 + }, + "extended=true,facing=west,shape=tall": { + "model": "twilightforest:block/wood/banister/dark_oak/dark_oak_banister_tall_extended", + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/dark_planks.json b/src/generated/resources/assets/twilightforest/blockstates/dark_planks.json new file mode 100644 index 0000000000..5be7fc56e5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/dark_planks.json @@ -0,0 +1,20 @@ +{ + "variants": { + "": [ + { + "model": "twilightforest:block/wood/planks/darkwood/dark_planks", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/planks/darkwood/dark_planks_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/planks/darkwood/dark_planks_2" + }, + { + "model": "twilightforest:block/wood/planks/darkwood/dark_planks_3" + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/dark_pressure_plate.json b/src/generated/resources/assets/twilightforest/blockstates/dark_pressure_plate.json new file mode 100644 index 0000000000..75e2986e57 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/dark_pressure_plate.json @@ -0,0 +1,36 @@ +{ + "variants": { + "powered=false": [ + { + "model": "twilightforest:block/wood/pressure_plate/darkwood/dark_pressure_plate", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/pressure_plate/darkwood/dark_pressure_plate_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/pressure_plate/darkwood/dark_pressure_plate_2" + }, + { + "model": "twilightforest:block/wood/pressure_plate/darkwood/dark_pressure_plate_3" + } + ], + "powered=true": [ + { + "model": "twilightforest:block/wood/pressure_plate/darkwood/dark_pressure_plate_down", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/pressure_plate/darkwood/dark_pressure_plate_down_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/pressure_plate/darkwood/dark_pressure_plate_down_2" + }, + { + "model": "twilightforest:block/wood/pressure_plate/darkwood/dark_pressure_plate_down_3" + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/dark_sign.json b/src/generated/resources/assets/twilightforest/blockstates/dark_sign.json new file mode 100644 index 0000000000..765ce9c4aa --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/dark_sign.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/dark_sign" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/dark_slab.json b/src/generated/resources/assets/twilightforest/blockstates/dark_slab.json new file mode 100644 index 0000000000..c2dac30aca --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/dark_slab.json @@ -0,0 +1,60 @@ +{ + "variants": { + "type=bottom": [ + { + "model": "twilightforest:block/wood/slab/darkwood/dark_slab", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/slab/darkwood/dark_slab_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/slab/darkwood/dark_slab_2" + }, + { + "model": "twilightforest:block/wood/slab/darkwood/dark_slab_3" + } + ], + "type=double": [ + { + "model": "twilightforest:block/wood/planks/darkwood/dark_planks", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/planks/darkwood/dark_planks_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/planks/darkwood/dark_planks_2" + }, + { + "model": "twilightforest:block/wood/planks/darkwood/dark_planks_3" + } + ], + "type=top": [ + { + "model": "twilightforest:block/wood/slab/darkwood/dark_slab", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/slab/darkwood/dark_slab_1", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/slab/darkwood/dark_slab_2", + "uvlock": true, + "x": 180 + }, + { + "model": "twilightforest:block/wood/slab/darkwood/dark_slab_3", + "uvlock": true, + "x": 180 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/dark_stairs.json b/src/generated/resources/assets/twilightforest/blockstates/dark_stairs.json new file mode 100644 index 0000000000..b0956b4d79 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/dark_stairs.json @@ -0,0 +1,984 @@ +{ + "variants": { + "facing=east,half=bottom,shape=inner_left": [ + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_inner", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_inner_1", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_inner_2", + "uvlock": true, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_inner_3", + "uvlock": true, + "y": 270 + } + ], + "facing=east,half=bottom,shape=inner_right": [ + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_inner", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_inner_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_inner_2" + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_inner_3" + } + ], + "facing=east,half=bottom,shape=outer_left": [ + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_outer", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_outer_1", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_outer_2", + "uvlock": true, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_outer_3", + "uvlock": true, + "y": 270 + } + ], + "facing=east,half=bottom,shape=outer_right": [ + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_outer", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_outer_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_outer_2" + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_outer_3" + } + ], + "facing=east,half=bottom,shape=straight": [ + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_2" + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_3" + } + ], + "facing=east,half=top,shape=inner_left": [ + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_inner", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_inner_1", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_inner_2", + "uvlock": true, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_inner_3", + "uvlock": true, + "x": 180 + } + ], + "facing=east,half=top,shape=inner_right": [ + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_inner", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_inner_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_inner_2", + "uvlock": true, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_inner_3", + "uvlock": true, + "x": 180, + "y": 90 + } + ], + "facing=east,half=top,shape=outer_left": [ + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_outer", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_outer_1", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_outer_2", + "uvlock": true, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_outer_3", + "uvlock": true, + "x": 180 + } + ], + "facing=east,half=top,shape=outer_right": [ + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_outer", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_outer_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_outer_2", + "uvlock": true, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_outer_3", + "uvlock": true, + "x": 180, + "y": 90 + } + ], + "facing=east,half=top,shape=straight": [ + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_1", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_2", + "uvlock": true, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_3", + "uvlock": true, + "x": 180 + } + ], + "facing=north,half=bottom,shape=inner_left": [ + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_inner", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_inner_1", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_inner_2", + "uvlock": true, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_inner_3", + "uvlock": true, + "y": 180 + } + ], + "facing=north,half=bottom,shape=inner_right": [ + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_inner", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_inner_1", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_inner_2", + "uvlock": true, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_inner_3", + "uvlock": true, + "y": 270 + } + ], + "facing=north,half=bottom,shape=outer_left": [ + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_outer", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_outer_1", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_outer_2", + "uvlock": true, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_outer_3", + "uvlock": true, + "y": 180 + } + ], + "facing=north,half=bottom,shape=outer_right": [ + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_outer", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_outer_1", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_outer_2", + "uvlock": true, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_outer_3", + "uvlock": true, + "y": 270 + } + ], + "facing=north,half=bottom,shape=straight": [ + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_1", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_2", + "uvlock": true, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_3", + "uvlock": true, + "y": 270 + } + ], + "facing=north,half=top,shape=inner_left": [ + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_inner", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_inner_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_inner_2", + "uvlock": true, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_inner_3", + "uvlock": true, + "x": 180, + "y": 270 + } + ], + "facing=north,half=top,shape=inner_right": [ + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_inner", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_inner_1", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_inner_2", + "uvlock": true, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_inner_3", + "uvlock": true, + "x": 180 + } + ], + "facing=north,half=top,shape=outer_left": [ + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_outer", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_outer_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_outer_2", + "uvlock": true, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_outer_3", + "uvlock": true, + "x": 180, + "y": 270 + } + ], + "facing=north,half=top,shape=outer_right": [ + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_outer", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_outer_1", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_outer_2", + "uvlock": true, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_outer_3", + "uvlock": true, + "x": 180 + } + ], + "facing=north,half=top,shape=straight": [ + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_2", + "uvlock": true, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_3", + "uvlock": true, + "x": 180, + "y": 270 + } + ], + "facing=south,half=bottom,shape=inner_left": [ + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_inner", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_inner_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_inner_2" + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_inner_3" + } + ], + "facing=south,half=bottom,shape=inner_right": [ + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_inner", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_inner_1", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_inner_2", + "uvlock": true, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_inner_3", + "uvlock": true, + "y": 90 + } + ], + "facing=south,half=bottom,shape=outer_left": [ + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_outer", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_outer_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_outer_2" + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_outer_3" + } + ], + "facing=south,half=bottom,shape=outer_right": [ + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_outer", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_outer_1", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_outer_2", + "uvlock": true, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_outer_3", + "uvlock": true, + "y": 90 + } + ], + "facing=south,half=bottom,shape=straight": [ + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_1", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_2", + "uvlock": true, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_3", + "uvlock": true, + "y": 90 + } + ], + "facing=south,half=top,shape=inner_left": [ + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_inner", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_inner_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_inner_2", + "uvlock": true, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_inner_3", + "uvlock": true, + "x": 180, + "y": 90 + } + ], + "facing=south,half=top,shape=inner_right": [ + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_inner", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_inner_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_inner_2", + "uvlock": true, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_inner_3", + "uvlock": true, + "x": 180, + "y": 180 + } + ], + "facing=south,half=top,shape=outer_left": [ + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_outer", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_outer_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_outer_2", + "uvlock": true, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_outer_3", + "uvlock": true, + "x": 180, + "y": 90 + } + ], + "facing=south,half=top,shape=outer_right": [ + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_outer", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_outer_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_outer_2", + "uvlock": true, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_outer_3", + "uvlock": true, + "x": 180, + "y": 180 + } + ], + "facing=south,half=top,shape=straight": [ + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_2", + "uvlock": true, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_3", + "uvlock": true, + "x": 180, + "y": 90 + } + ], + "facing=west,half=bottom,shape=inner_left": [ + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_inner", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_inner_1", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_inner_2", + "uvlock": true, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_inner_3", + "uvlock": true, + "y": 90 + } + ], + "facing=west,half=bottom,shape=inner_right": [ + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_inner", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_inner_1", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_inner_2", + "uvlock": true, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_inner_3", + "uvlock": true, + "y": 180 + } + ], + "facing=west,half=bottom,shape=outer_left": [ + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_outer", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_outer_1", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_outer_2", + "uvlock": true, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_outer_3", + "uvlock": true, + "y": 90 + } + ], + "facing=west,half=bottom,shape=outer_right": [ + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_outer", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_outer_1", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_outer_2", + "uvlock": true, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_outer_3", + "uvlock": true, + "y": 180 + } + ], + "facing=west,half=bottom,shape=straight": [ + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_1", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_2", + "uvlock": true, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_3", + "uvlock": true, + "y": 180 + } + ], + "facing=west,half=top,shape=inner_left": [ + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_inner", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_inner_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_inner_2", + "uvlock": true, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_inner_3", + "uvlock": true, + "x": 180, + "y": 180 + } + ], + "facing=west,half=top,shape=inner_right": [ + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_inner", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_inner_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_inner_2", + "uvlock": true, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_inner_3", + "uvlock": true, + "x": 180, + "y": 270 + } + ], + "facing=west,half=top,shape=outer_left": [ + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_outer", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_outer_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_outer_2", + "uvlock": true, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_outer_3", + "uvlock": true, + "x": 180, + "y": 180 + } + ], + "facing=west,half=top,shape=outer_right": [ + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_outer", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_outer_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_outer_2", + "uvlock": true, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_outer_3", + "uvlock": true, + "x": 180, + "y": 270 + } + ], + "facing=west,half=top,shape=straight": [ + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_2", + "uvlock": true, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/darkwood/dark_stairs_3", + "uvlock": true, + "x": 180, + "y": 180 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/dark_trapdoor.json b/src/generated/resources/assets/twilightforest/blockstates/dark_trapdoor.json new file mode 100644 index 0000000000..bdbe431136 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/dark_trapdoor.json @@ -0,0 +1,68 @@ +{ + "variants": { + "facing=east,half=bottom,open=false": { + "model": "twilightforest:block/wood/trapdoor/darkwood/darkwood_trapdoor_bottom", + "y": 90 + }, + "facing=east,half=bottom,open=true": { + "model": "twilightforest:block/wood/trapdoor/darkwood/darkwood_trapdoor_open", + "y": 90 + }, + "facing=east,half=top,open=false": { + "model": "twilightforest:block/wood/trapdoor/darkwood/darkwood_trapdoor_top", + "y": 90 + }, + "facing=east,half=top,open=true": { + "model": "twilightforest:block/wood/trapdoor/darkwood/darkwood_trapdoor_open", + "x": 180, + "y": 270 + }, + "facing=north,half=bottom,open=false": { + "model": "twilightforest:block/wood/trapdoor/darkwood/darkwood_trapdoor_bottom" + }, + "facing=north,half=bottom,open=true": { + "model": "twilightforest:block/wood/trapdoor/darkwood/darkwood_trapdoor_open" + }, + "facing=north,half=top,open=false": { + "model": "twilightforest:block/wood/trapdoor/darkwood/darkwood_trapdoor_top" + }, + "facing=north,half=top,open=true": { + "model": "twilightforest:block/wood/trapdoor/darkwood/darkwood_trapdoor_open", + "x": 180, + "y": 180 + }, + "facing=south,half=bottom,open=false": { + "model": "twilightforest:block/wood/trapdoor/darkwood/darkwood_trapdoor_bottom", + "y": 180 + }, + "facing=south,half=bottom,open=true": { + "model": "twilightforest:block/wood/trapdoor/darkwood/darkwood_trapdoor_open", + "y": 180 + }, + "facing=south,half=top,open=false": { + "model": "twilightforest:block/wood/trapdoor/darkwood/darkwood_trapdoor_top", + "y": 180 + }, + "facing=south,half=top,open=true": { + "model": "twilightforest:block/wood/trapdoor/darkwood/darkwood_trapdoor_open", + "x": 180 + }, + "facing=west,half=bottom,open=false": { + "model": "twilightforest:block/wood/trapdoor/darkwood/darkwood_trapdoor_bottom", + "y": 270 + }, + "facing=west,half=bottom,open=true": { + "model": "twilightforest:block/wood/trapdoor/darkwood/darkwood_trapdoor_open", + "y": 270 + }, + "facing=west,half=top,open=false": { + "model": "twilightforest:block/wood/trapdoor/darkwood/darkwood_trapdoor_top", + "y": 270 + }, + "facing=west,half=top,open=true": { + "model": "twilightforest:block/wood/trapdoor/darkwood/darkwood_trapdoor_open", + "x": 180, + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/dark_wall_sign.json b/src/generated/resources/assets/twilightforest/blockstates/dark_wall_sign.json new file mode 100644 index 0000000000..d8c01aa91d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/dark_wall_sign.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/dark_wall_sign" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/dark_wood.json b/src/generated/resources/assets/twilightforest/blockstates/dark_wood.json new file mode 100644 index 0000000000..d14b590ae7 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/dark_wood.json @@ -0,0 +1,16 @@ +{ + "variants": { + "axis=x": { + "model": "twilightforest:block/dark_wood_horizontal", + "x": 90, + "y": 90 + }, + "axis=y": { + "model": "twilightforest:block/dark_wood" + }, + "axis=z": { + "model": "twilightforest:block/dark_wood_horizontal", + "x": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/darkwood_sapling.json b/src/generated/resources/assets/twilightforest/blockstates/darkwood_sapling.json new file mode 100644 index 0000000000..0c4a6f940d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/darkwood_sapling.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/darkwood_sapling" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/deadrock.json b/src/generated/resources/assets/twilightforest/blockstates/deadrock.json new file mode 100644 index 0000000000..3409633569 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/deadrock.json @@ -0,0 +1,21 @@ +{ + "variants": { + "": [ + { + "model": "twilightforest:block/deadrock" + }, + { + "model": "twilightforest:block/deadrock", + "y": 180 + }, + { + "model": "twilightforest:block/deadrock", + "y": 90 + }, + { + "model": "twilightforest:block/deadrock", + "y": 270 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/death_tome_spawner.json b/src/generated/resources/assets/twilightforest/blockstates/death_tome_spawner.json new file mode 100644 index 0000000000..ce2ec1ce85 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/death_tome_spawner.json @@ -0,0 +1,34 @@ +{ + "variants": { + "book_stages=1": { + "model": "twilightforest:block/death_tome_spawner_1" + }, + "book_stages=10": { + "model": "twilightforest:block/death_tome_spawner_10" + }, + "book_stages=2": { + "model": "twilightforest:block/death_tome_spawner_2" + }, + "book_stages=3": { + "model": "twilightforest:block/death_tome_spawner_3" + }, + "book_stages=4": { + "model": "twilightforest:block/death_tome_spawner_4" + }, + "book_stages=5": { + "model": "twilightforest:block/death_tome_spawner_5" + }, + "book_stages=6": { + "model": "twilightforest:block/death_tome_spawner_6" + }, + "book_stages=7": { + "model": "twilightforest:block/death_tome_spawner_7" + }, + "book_stages=8": { + "model": "twilightforest:block/death_tome_spawner_8" + }, + "book_stages=9": { + "model": "twilightforest:block/death_tome_spawner_9" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/decorative_mazestone.json b/src/generated/resources/assets/twilightforest/blockstates/decorative_mazestone.json new file mode 100644 index 0000000000..2f0d91fe67 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/decorative_mazestone.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/decorative_mazestone" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/empty_canopy_bookshelf.json b/src/generated/resources/assets/twilightforest/blockstates/empty_canopy_bookshelf.json new file mode 100644 index 0000000000..e5d8c4d63f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/empty_canopy_bookshelf.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/empty_canopy_bookshelf" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/encased_castle_brick_pillar.json b/src/generated/resources/assets/twilightforest/blockstates/encased_castle_brick_pillar.json new file mode 100644 index 0000000000..966f3b6c5c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/encased_castle_brick_pillar.json @@ -0,0 +1,16 @@ +{ + "variants": { + "axis=x": { + "model": "twilightforest:block/encased_castle_brick_pillar_x", + "x": 90, + "y": 90 + }, + "axis=y": { + "model": "twilightforest:block/encased_castle_brick_pillar" + }, + "axis=z": { + "model": "twilightforest:block/encased_castle_brick_pillar_z", + "x": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/encased_castle_brick_stairs.json b/src/generated/resources/assets/twilightforest/blockstates/encased_castle_brick_stairs.json new file mode 100644 index 0000000000..86f26854f1 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/encased_castle_brick_stairs.json @@ -0,0 +1,209 @@ +{ + "variants": { + "facing=east,half=bottom,shape=inner_left": { + "model": "twilightforest:block/encased_castle_brick_stairs_inner", + "uvlock": true, + "y": 270 + }, + "facing=east,half=bottom,shape=inner_right": { + "model": "twilightforest:block/encased_castle_brick_stairs_inner" + }, + "facing=east,half=bottom,shape=outer_left": { + "model": "twilightforest:block/encased_castle_brick_stairs_outer", + "uvlock": true, + "y": 270 + }, + "facing=east,half=bottom,shape=outer_right": { + "model": "twilightforest:block/encased_castle_brick_stairs_outer" + }, + "facing=east,half=bottom,shape=straight": { + "model": "twilightforest:block/encased_castle_brick_stairs" + }, + "facing=east,half=top,shape=inner_left": { + "model": "twilightforest:block/encased_castle_brick_stairs_inner", + "uvlock": true, + "x": 180 + }, + "facing=east,half=top,shape=inner_right": { + "model": "twilightforest:block/encased_castle_brick_stairs_inner", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=east,half=top,shape=outer_left": { + "model": "twilightforest:block/encased_castle_brick_stairs_outer", + "uvlock": true, + "x": 180 + }, + "facing=east,half=top,shape=outer_right": { + "model": "twilightforest:block/encased_castle_brick_stairs_outer", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=east,half=top,shape=straight": { + "model": "twilightforest:block/encased_castle_brick_stairs", + "uvlock": true, + "x": 180 + }, + "facing=north,half=bottom,shape=inner_left": { + "model": "twilightforest:block/encased_castle_brick_stairs_inner", + "uvlock": true, + "y": 180 + }, + "facing=north,half=bottom,shape=inner_right": { + "model": "twilightforest:block/encased_castle_brick_stairs_inner", + "uvlock": true, + "y": 270 + }, + "facing=north,half=bottom,shape=outer_left": { + "model": "twilightforest:block/encased_castle_brick_stairs_outer", + "uvlock": true, + "y": 180 + }, + "facing=north,half=bottom,shape=outer_right": { + "model": "twilightforest:block/encased_castle_brick_stairs_outer", + "uvlock": true, + "y": 270 + }, + "facing=north,half=bottom,shape=straight": { + "model": "twilightforest:block/encased_castle_brick_stairs", + "uvlock": true, + "y": 270 + }, + "facing=north,half=top,shape=inner_left": { + "model": "twilightforest:block/encased_castle_brick_stairs_inner", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=north,half=top,shape=inner_right": { + "model": "twilightforest:block/encased_castle_brick_stairs_inner", + "uvlock": true, + "x": 180 + }, + "facing=north,half=top,shape=outer_left": { + "model": "twilightforest:block/encased_castle_brick_stairs_outer", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=north,half=top,shape=outer_right": { + "model": "twilightforest:block/encased_castle_brick_stairs_outer", + "uvlock": true, + "x": 180 + }, + "facing=north,half=top,shape=straight": { + "model": "twilightforest:block/encased_castle_brick_stairs", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=south,half=bottom,shape=inner_left": { + "model": "twilightforest:block/encased_castle_brick_stairs_inner" + }, + "facing=south,half=bottom,shape=inner_right": { + "model": "twilightforest:block/encased_castle_brick_stairs_inner", + "uvlock": true, + "y": 90 + }, + "facing=south,half=bottom,shape=outer_left": { + "model": "twilightforest:block/encased_castle_brick_stairs_outer" + }, + "facing=south,half=bottom,shape=outer_right": { + "model": "twilightforest:block/encased_castle_brick_stairs_outer", + "uvlock": true, + "y": 90 + }, + "facing=south,half=bottom,shape=straight": { + "model": "twilightforest:block/encased_castle_brick_stairs", + "uvlock": true, + "y": 90 + }, + "facing=south,half=top,shape=inner_left": { + "model": "twilightforest:block/encased_castle_brick_stairs_inner", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=south,half=top,shape=inner_right": { + "model": "twilightforest:block/encased_castle_brick_stairs_inner", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=south,half=top,shape=outer_left": { + "model": "twilightforest:block/encased_castle_brick_stairs_outer", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=south,half=top,shape=outer_right": { + "model": "twilightforest:block/encased_castle_brick_stairs_outer", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=south,half=top,shape=straight": { + "model": "twilightforest:block/encased_castle_brick_stairs", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=west,half=bottom,shape=inner_left": { + "model": "twilightforest:block/encased_castle_brick_stairs_inner", + "uvlock": true, + "y": 90 + }, + "facing=west,half=bottom,shape=inner_right": { + "model": "twilightforest:block/encased_castle_brick_stairs_inner", + "uvlock": true, + "y": 180 + }, + "facing=west,half=bottom,shape=outer_left": { + "model": "twilightforest:block/encased_castle_brick_stairs_outer", + "uvlock": true, + "y": 90 + }, + "facing=west,half=bottom,shape=outer_right": { + "model": "twilightforest:block/encased_castle_brick_stairs_outer", + "uvlock": true, + "y": 180 + }, + "facing=west,half=bottom,shape=straight": { + "model": "twilightforest:block/encased_castle_brick_stairs", + "uvlock": true, + "y": 180 + }, + "facing=west,half=top,shape=inner_left": { + "model": "twilightforest:block/encased_castle_brick_stairs_inner", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=west,half=top,shape=inner_right": { + "model": "twilightforest:block/encased_castle_brick_stairs_inner", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=west,half=top,shape=outer_left": { + "model": "twilightforest:block/encased_castle_brick_stairs_outer", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=west,half=top,shape=outer_right": { + "model": "twilightforest:block/encased_castle_brick_stairs_outer", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=west,half=top,shape=straight": { + "model": "twilightforest:block/encased_castle_brick_stairs", + "uvlock": true, + "x": 180, + "y": 180 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/encased_castle_brick_tile.json b/src/generated/resources/assets/twilightforest/blockstates/encased_castle_brick_tile.json new file mode 100644 index 0000000000..c78d16005c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/encased_castle_brick_tile.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/encased_castle_brick_tile" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/encased_fire_jet.json b/src/generated/resources/assets/twilightforest/blockstates/encased_fire_jet.json new file mode 100644 index 0000000000..bd4290a542 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/encased_fire_jet.json @@ -0,0 +1,16 @@ +{ + "variants": { + "state=flame": { + "model": "twilightforest:block/encased_fire_jet_on" + }, + "state=idle": { + "model": "twilightforest:block/encased_fire_jet" + }, + "state=popping": { + "model": "twilightforest:block/encased_fire_jet_on" + }, + "state=timeout": { + "model": "twilightforest:block/encased_fire_jet" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/encased_smoker.json b/src/generated/resources/assets/twilightforest/blockstates/encased_smoker.json new file mode 100644 index 0000000000..d9a99cdcb5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/encased_smoker.json @@ -0,0 +1,10 @@ +{ + "variants": { + "active=false": { + "model": "twilightforest:block/encased_smoker" + }, + "active=true": { + "model": "twilightforest:block/encased_smoker_on" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/encased_towerwood.json b/src/generated/resources/assets/twilightforest/blockstates/encased_towerwood.json new file mode 100644 index 0000000000..cfc2306fb0 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/encased_towerwood.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/encased_towerwood" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/etched_nagastone.json b/src/generated/resources/assets/twilightforest/blockstates/etched_nagastone.json new file mode 100644 index 0000000000..f878dc8370 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/etched_nagastone.json @@ -0,0 +1,22 @@ +{ + "variants": { + "facing=down": { + "model": "twilightforest:block/etched_nagastone" + }, + "facing=east": { + "model": "twilightforest:block/etched_nagastone_east" + }, + "facing=north": { + "model": "twilightforest:block/etched_nagastone_north" + }, + "facing=south": { + "model": "twilightforest:block/etched_nagastone_south" + }, + "facing=up": { + "model": "twilightforest:block/etched_nagastone_up" + }, + "facing=west": { + "model": "twilightforest:block/etched_nagastone_west" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/experiment_115.json b/src/generated/resources/assets/twilightforest/blockstates/experiment_115.json new file mode 100644 index 0000000000..94e6635a41 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/experiment_115.json @@ -0,0 +1,52 @@ +{ + "variants": { + "omnomnom=0,regenerate=false": { + "model": "twilightforest:block/experiment115_8_8" + }, + "omnomnom=0,regenerate=true": { + "model": "twilightforest:block/experiment115_8_8_regenerating" + }, + "omnomnom=1,regenerate=false": { + "model": "twilightforest:block/experiment115_7_8" + }, + "omnomnom=1,regenerate=true": { + "model": "twilightforest:block/experiment115_7_8_regenerating" + }, + "omnomnom=2,regenerate=false": { + "model": "twilightforest:block/experiment115_6_8" + }, + "omnomnom=2,regenerate=true": { + "model": "twilightforest:block/experiment115_6_8_regenerating" + }, + "omnomnom=3,regenerate=false": { + "model": "twilightforest:block/experiment115_5_8" + }, + "omnomnom=3,regenerate=true": { + "model": "twilightforest:block/experiment115_5_8_regenerating" + }, + "omnomnom=4,regenerate=false": { + "model": "twilightforest:block/experiment115_4_8" + }, + "omnomnom=4,regenerate=true": { + "model": "twilightforest:block/experiment115_4_8_regenerating" + }, + "omnomnom=5,regenerate=false": { + "model": "twilightforest:block/experiment115_3_8" + }, + "omnomnom=5,regenerate=true": { + "model": "twilightforest:block/experiment115_3_8_regenerating" + }, + "omnomnom=6,regenerate=false": { + "model": "twilightforest:block/experiment115_2_8" + }, + "omnomnom=6,regenerate=true": { + "model": "twilightforest:block/experiment115_2_8_regenerating" + }, + "omnomnom=7,regenerate=false": { + "model": "twilightforest:block/experiment115_1_8" + }, + "omnomnom=7,regenerate=true": { + "model": "twilightforest:block/experiment115_1_8_regenerating" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/fake_diamond.json b/src/generated/resources/assets/twilightforest/blockstates/fake_diamond.json new file mode 100644 index 0000000000..5a5d8888f7 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/fake_diamond.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "minecraft:block/diamond_block" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/fake_gold.json b/src/generated/resources/assets/twilightforest/blockstates/fake_gold.json new file mode 100644 index 0000000000..475eff0256 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/fake_gold.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "minecraft:block/gold_block" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/fallen_leaves.json b/src/generated/resources/assets/twilightforest/blockstates/fallen_leaves.json new file mode 100644 index 0000000000..f27fc339e8 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/fallen_leaves.json @@ -0,0 +1,28 @@ +{ + "variants": { + "layers=1": { + "model": "twilightforest:block/fallen_leaves1" + }, + "layers=2": { + "model": "twilightforest:block/fallen_leaves2" + }, + "layers=3": { + "model": "twilightforest:block/fallen_leaves3" + }, + "layers=4": { + "model": "twilightforest:block/fallen_leaves4" + }, + "layers=5": { + "model": "twilightforest:block/fallen_leaves5" + }, + "layers=6": { + "model": "twilightforest:block/fallen_leaves6" + }, + "layers=7": { + "model": "twilightforest:block/fallen_leaves7" + }, + "layers=8": { + "model": "twilightforest:block/fallen_leaves8" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/fiddlehead.json b/src/generated/resources/assets/twilightforest/blockstates/fiddlehead.json new file mode 100644 index 0000000000..5a397bc647 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/fiddlehead.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/fiddlehead" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/fiery_block.json b/src/generated/resources/assets/twilightforest/blockstates/fiery_block.json new file mode 100644 index 0000000000..206dc5ddec --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/fiery_block.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/fiery_block" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/final_boss_boss_spawner.json b/src/generated/resources/assets/twilightforest/blockstates/final_boss_boss_spawner.json new file mode 100644 index 0000000000..fab51f8dc9 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/final_boss_boss_spawner.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/boss_spawner" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/fire_jet.json b/src/generated/resources/assets/twilightforest/blockstates/fire_jet.json new file mode 100644 index 0000000000..acac3cfc2a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/fire_jet.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/fire_jet" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/firefly.json b/src/generated/resources/assets/twilightforest/blockstates/firefly.json new file mode 100644 index 0000000000..0bc92efee3 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/firefly.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/firefly" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/firefly_jar.json b/src/generated/resources/assets/twilightforest/blockstates/firefly_jar.json new file mode 100644 index 0000000000..dabfcc638a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/firefly_jar.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/firefly_jar" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/firefly_particle_spawner.json b/src/generated/resources/assets/twilightforest/blockstates/firefly_particle_spawner.json new file mode 100644 index 0000000000..0933fe9e08 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/firefly_particle_spawner.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/firefly_particle_spawner" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/fluffy_cloud.json b/src/generated/resources/assets/twilightforest/blockstates/fluffy_cloud.json new file mode 100644 index 0000000000..1d5a460e8b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/fluffy_cloud.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/fluffy_cloud" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/ghast_trap.json b/src/generated/resources/assets/twilightforest/blockstates/ghast_trap.json new file mode 100644 index 0000000000..5329087c9f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/ghast_trap.json @@ -0,0 +1,10 @@ +{ + "variants": { + "active=false": { + "model": "twilightforest:block/ghast_trap" + }, + "active=true": { + "model": "twilightforest:block/ghast_trap_active" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/giant_cobblestone.json b/src/generated/resources/assets/twilightforest/blockstates/giant_cobblestone.json new file mode 100644 index 0000000000..e8ab5cf005 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/giant_cobblestone.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/giant_cobblestone" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/giant_leaves.json b/src/generated/resources/assets/twilightforest/blockstates/giant_leaves.json new file mode 100644 index 0000000000..c3746d2d2e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/giant_leaves.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/giant_leaves" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/giant_log.json b/src/generated/resources/assets/twilightforest/blockstates/giant_log.json new file mode 100644 index 0000000000..e96a728e6b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/giant_log.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/giant_log" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/giant_obsidian.json b/src/generated/resources/assets/twilightforest/blockstates/giant_obsidian.json new file mode 100644 index 0000000000..f84e58daee --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/giant_obsidian.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/giant_obsidian" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/green_force_field.json b/src/generated/resources/assets/twilightforest/blockstates/green_force_field.json new file mode 100644 index 0000000000..0ee5a08046 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/green_force_field.json @@ -0,0 +1,1036 @@ +{ + "multipart": [ + { + "apply": { + "model": "twilightforest:block/force_field/green_force_field_west", + "uvlock": true + }, + "when": { + "west": "true" + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/green_force_field_no_west", + "uvlock": true + }, + "when": { + "west": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/green_force_field_east", + "uvlock": true + }, + "when": { + "east": "true" + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/green_force_field_no_east", + "uvlock": true + }, + "when": { + "east": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/green_force_field_down", + "uvlock": true + }, + "when": { + "down": "true" + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/green_force_field_no_down", + "uvlock": true + }, + "when": { + "down": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/green_force_field_up", + "uvlock": true + }, + "when": { + "up": "true" + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/green_force_field_no_up", + "uvlock": true + }, + "when": { + "up": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/green_force_field_north", + "uvlock": true + }, + "when": { + "north": "true" + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/green_force_field_no_north", + "uvlock": true + }, + "when": { + "north": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/green_force_field_south", + "uvlock": true + }, + "when": { + "south": "true" + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/green_force_field_no_south", + "uvlock": true + }, + "when": { + "south": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/green_force_field_down_west", + "uvlock": true + }, + "when": { + "OR": [ + { + "down": "true", + "north": "false", + "west": "true" + }, + { + "down": "true", + "south": "false", + "west": "true" + }, + { + "axis": "y|x", + "down": "true", + "west": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/green_force_field_down_no_west", + "uvlock": true + }, + "when": { + "OR": [ + { + "down": "true", + "west": "false" + }, + { + "axis": "z", + "down": "true", + "north": "true", + "south": "true", + "west": "true" + }, + { + "axis": "z", + "down": "true", + "west": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/green_force_field_west_no_down", + "uvlock": true + }, + "when": { + "OR": [ + { + "down": "false", + "west": "true" + }, + { + "axis": "z", + "down": "true", + "north": "true", + "south": "true", + "west": "true" + }, + { + "axis": "z", + "down": "true", + "west": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/green_force_field_down_east", + "uvlock": true + }, + "when": { + "OR": [ + { + "down": "true", + "east": "true", + "north": "false" + }, + { + "down": "true", + "east": "true", + "south": "false" + }, + { + "axis": "y|x", + "down": "true", + "east": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/green_force_field_down_no_east", + "uvlock": true + }, + "when": { + "OR": [ + { + "down": "true", + "east": "false" + }, + { + "axis": "z", + "down": "true", + "east": "true", + "north": "true", + "south": "true" + }, + { + "axis": "z", + "down": "true", + "east": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/green_force_field_east_no_down", + "uvlock": true + }, + "when": { + "OR": [ + { + "down": "false", + "east": "true" + }, + { + "axis": "z", + "down": "true", + "east": "true", + "north": "true", + "south": "true" + }, + { + "axis": "z", + "down": "true", + "east": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/green_force_field_down_north", + "uvlock": true + }, + "when": { + "OR": [ + { + "down": "true", + "north": "true", + "west": "false" + }, + { + "down": "true", + "east": "false", + "north": "true" + }, + { + "axis": "y|z", + "down": "true", + "north": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/green_force_field_down_no_north", + "uvlock": true + }, + "when": { + "OR": [ + { + "down": "true", + "north": "false" + }, + { + "axis": "x", + "down": "true", + "east": "true", + "north": "true", + "west": "true" + }, + { + "axis": "x", + "down": "true", + "north": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/green_force_field_north_no_down", + "uvlock": true + }, + "when": { + "OR": [ + { + "down": "false", + "north": "true" + }, + { + "axis": "x", + "down": "true", + "east": "true", + "north": "true", + "west": "true" + }, + { + "axis": "x", + "down": "true", + "north": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/green_force_field_down_south", + "uvlock": true + }, + "when": { + "OR": [ + { + "down": "true", + "south": "true", + "west": "false" + }, + { + "down": "true", + "east": "false", + "south": "true" + }, + { + "axis": "y|z", + "down": "true", + "south": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/green_force_field_down_no_south", + "uvlock": true + }, + "when": { + "OR": [ + { + "down": "true", + "south": "false" + }, + { + "axis": "x", + "down": "true", + "east": "true", + "south": "true", + "west": "true" + }, + { + "axis": "x", + "down": "true", + "south": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/green_force_field_south_no_down", + "uvlock": true + }, + "when": { + "OR": [ + { + "down": "false", + "south": "true" + }, + { + "axis": "x", + "down": "true", + "east": "true", + "south": "true", + "west": "true" + }, + { + "axis": "x", + "down": "true", + "south": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/green_force_field_up_west", + "uvlock": true + }, + "when": { + "OR": [ + { + "north": "false", + "up": "true", + "west": "true" + }, + { + "south": "false", + "up": "true", + "west": "true" + }, + { + "axis": "y|x", + "up": "true", + "west": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/green_force_field_up_no_west", + "uvlock": true + }, + "when": { + "OR": [ + { + "up": "true", + "west": "false" + }, + { + "axis": "z", + "north": "true", + "south": "true", + "up": "true", + "west": "true" + }, + { + "axis": "z", + "up": "true", + "west": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/green_force_field_west_no_up", + "uvlock": true + }, + "when": { + "OR": [ + { + "up": "false", + "west": "true" + }, + { + "axis": "z", + "north": "true", + "south": "true", + "up": "true", + "west": "true" + }, + { + "axis": "z", + "up": "true", + "west": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/green_force_field_up_east", + "uvlock": true + }, + "when": { + "OR": [ + { + "east": "true", + "north": "false", + "up": "true" + }, + { + "east": "true", + "south": "false", + "up": "true" + }, + { + "axis": "y|x", + "east": "true", + "up": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/green_force_field_up_no_east", + "uvlock": true + }, + "when": { + "OR": [ + { + "east": "false", + "up": "true" + }, + { + "axis": "z", + "east": "true", + "north": "true", + "south": "true", + "up": "true" + }, + { + "axis": "z", + "east": "true", + "up": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/green_force_field_east_no_up", + "uvlock": true + }, + "when": { + "OR": [ + { + "east": "true", + "up": "false" + }, + { + "axis": "z", + "east": "true", + "north": "true", + "south": "true", + "up": "true" + }, + { + "axis": "z", + "east": "true", + "up": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/green_force_field_up_north", + "uvlock": true + }, + "when": { + "OR": [ + { + "north": "true", + "up": "true", + "west": "false" + }, + { + "east": "false", + "north": "true", + "up": "true" + }, + { + "axis": "y|z", + "north": "true", + "up": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/green_force_field_up_no_north", + "uvlock": true + }, + "when": { + "OR": [ + { + "north": "false", + "up": "true" + }, + { + "axis": "x", + "east": "true", + "north": "true", + "up": "true", + "west": "true" + }, + { + "axis": "x", + "north": "true", + "up": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/green_force_field_north_no_up", + "uvlock": true + }, + "when": { + "OR": [ + { + "north": "true", + "up": "false" + }, + { + "axis": "x", + "east": "true", + "north": "true", + "up": "true", + "west": "true" + }, + { + "axis": "x", + "north": "true", + "up": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/green_force_field_up_south", + "uvlock": true + }, + "when": { + "OR": [ + { + "south": "true", + "up": "true", + "west": "false" + }, + { + "east": "false", + "south": "true", + "up": "true" + }, + { + "axis": "y|z", + "south": "true", + "up": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/green_force_field_up_no_south", + "uvlock": true + }, + "when": { + "OR": [ + { + "south": "false", + "up": "true" + }, + { + "axis": "x", + "east": "true", + "south": "true", + "up": "true", + "west": "true" + }, + { + "axis": "x", + "south": "true", + "up": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/green_force_field_south_no_up", + "uvlock": true + }, + "when": { + "OR": [ + { + "south": "true", + "up": "false" + }, + { + "axis": "x", + "east": "true", + "south": "true", + "up": "true", + "west": "true" + }, + { + "axis": "x", + "south": "true", + "up": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/green_force_field_north_west", + "uvlock": true + }, + "when": { + "OR": [ + { + "down": "false", + "north": "true", + "west": "true" + }, + { + "north": "true", + "up": "false", + "west": "true" + }, + { + "axis": "x|z", + "north": "true", + "west": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/green_force_field_north_no_west", + "uvlock": true + }, + "when": { + "OR": [ + { + "north": "true", + "west": "false" + }, + { + "axis": "y", + "down": "true", + "north": "true", + "up": "true", + "west": "true" + }, + { + "axis": "y", + "north": "true", + "west": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/green_force_field_west_no_north", + "uvlock": true + }, + "when": { + "OR": [ + { + "north": "false", + "west": "true" + }, + { + "axis": "y", + "down": "true", + "north": "true", + "up": "true", + "west": "true" + }, + { + "axis": "y", + "north": "true", + "west": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/green_force_field_north_east", + "uvlock": true + }, + "when": { + "OR": [ + { + "down": "false", + "east": "true", + "north": "true" + }, + { + "east": "true", + "north": "true", + "up": "false" + }, + { + "axis": "x|z", + "east": "true", + "north": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/green_force_field_north_no_east", + "uvlock": true + }, + "when": { + "OR": [ + { + "east": "false", + "north": "true" + }, + { + "axis": "y", + "down": "true", + "east": "true", + "north": "true", + "up": "true" + }, + { + "axis": "y", + "east": "true", + "north": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/green_force_field_east_no_north", + "uvlock": true + }, + "when": { + "OR": [ + { + "east": "true", + "north": "false" + }, + { + "axis": "y", + "down": "true", + "east": "true", + "north": "true", + "up": "true" + }, + { + "axis": "y", + "east": "true", + "north": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/green_force_field_south_west", + "uvlock": true + }, + "when": { + "OR": [ + { + "down": "false", + "south": "true", + "west": "true" + }, + { + "south": "true", + "up": "false", + "west": "true" + }, + { + "axis": "x|z", + "south": "true", + "west": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/green_force_field_south_no_west", + "uvlock": true + }, + "when": { + "OR": [ + { + "south": "true", + "west": "false" + }, + { + "axis": "y", + "down": "true", + "south": "true", + "up": "true", + "west": "true" + }, + { + "axis": "y", + "south": "true", + "west": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/green_force_field_west_no_south", + "uvlock": true + }, + "when": { + "OR": [ + { + "south": "false", + "west": "true" + }, + { + "axis": "y", + "down": "true", + "south": "true", + "up": "true", + "west": "true" + }, + { + "axis": "y", + "south": "true", + "west": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/green_force_field_south_east", + "uvlock": true + }, + "when": { + "OR": [ + { + "down": "false", + "east": "true", + "south": "true" + }, + { + "east": "true", + "south": "true", + "up": "false" + }, + { + "axis": "x|z", + "east": "true", + "south": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/green_force_field_south_no_east", + "uvlock": true + }, + "when": { + "OR": [ + { + "east": "false", + "south": "true" + }, + { + "axis": "y", + "down": "true", + "east": "true", + "south": "true", + "up": "true" + }, + { + "axis": "y", + "east": "true", + "south": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/green_force_field_east_no_south", + "uvlock": true + }, + "when": { + "OR": [ + { + "east": "true", + "south": "false" + }, + { + "axis": "y", + "down": "true", + "east": "true", + "south": "true", + "up": "true" + }, + { + "axis": "y", + "east": "true", + "south": "true" + } + ] + } + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/green_thorns.json b/src/generated/resources/assets/twilightforest/blockstates/green_thorns.json new file mode 100644 index 0000000000..5132487b56 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/green_thorns.json @@ -0,0 +1,203 @@ +{ + "multipart": [ + { + "apply": { + "model": "twilightforest:block/green_thorns_thorns" + }, + "when": { + "axis": "y" + } + }, + { + "apply": { + "model": "twilightforest:block/green_thorns_thorns", + "x": 90 + }, + "when": { + "axis": "z" + } + }, + { + "apply": { + "model": "twilightforest:block/green_thorns_thorns", + "x": 90, + "y": 90 + }, + "when": { + "axis": "x" + } + }, + { + "apply": { + "model": "twilightforest:block/green_thorns_top", + "x": 90 + }, + "when": { + "up": "true" + } + }, + { + "apply": { + "model": "twilightforest:block/green_thorns_no_section", + "x": 270 + }, + "when": { + "axis": "z|y", + "up": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/green_thorns_no_section", + "x": 270, + "y": 90 + }, + "when": { + "axis": "x", + "up": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/green_thorns_bottom", + "x": 90 + }, + "when": { + "down": "true" + } + }, + { + "apply": { + "model": "twilightforest:block/green_thorns_no_section", + "x": 90 + }, + "when": { + "axis": "z|y", + "down": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/green_thorns_no_section", + "x": 90, + "y": 90 + }, + "when": { + "axis": "x", + "down": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/green_thorns_top", + "y": 270 + }, + "when": { + "east": "true" + } + }, + { + "apply": { + "model": "twilightforest:block/green_thorns_no_section", + "y": 90 + }, + "when": { + "axis": "y|x", + "east": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/green_thorns_no_section_alt", + "y": 90 + }, + "when": { + "axis": "z", + "east": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/green_thorns_bottom", + "y": 270 + }, + "when": { + "west": "true" + } + }, + { + "apply": { + "model": "twilightforest:block/green_thorns_no_section", + "y": 270 + }, + "when": { + "axis": "y|x", + "west": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/green_thorns_no_section_alt", + "y": 270 + }, + "when": { + "axis": "z", + "west": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/green_thorns_top" + }, + "when": { + "south": "true" + } + }, + { + "apply": { + "model": "twilightforest:block/green_thorns_no_section", + "y": 180 + }, + "when": { + "axis": "y|z", + "south": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/green_thorns_no_section_alt", + "y": 180 + }, + "when": { + "axis": "x", + "south": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/green_thorns_bottom" + }, + "when": { + "north": "true" + } + }, + { + "apply": { + "model": "twilightforest:block/green_thorns_no_section" + }, + "when": { + "axis": "y|z", + "north": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/green_thorns_no_section_alt" + }, + "when": { + "axis": "x", + "north": "false" + } + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/hardened_dark_leaves.json b/src/generated/resources/assets/twilightforest/blockstates/hardened_dark_leaves.json new file mode 100644 index 0000000000..8898e41fa6 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/hardened_dark_leaves.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/hardened_dark_leaves" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/hedge.json b/src/generated/resources/assets/twilightforest/blockstates/hedge.json new file mode 100644 index 0000000000..f73b1ab041 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/hedge.json @@ -0,0 +1,13 @@ +{ + "variants": { + "": [ + { + "model": "twilightforest:block/hedge", + "weight": 10 + }, + { + "model": "twilightforest:block/hedge_rose" + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/hollow_acacia_log_climbable.json b/src/generated/resources/assets/twilightforest/blockstates/hollow_acacia_log_climbable.json new file mode 100644 index 0000000000..e1a0a63dcd --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/hollow_acacia_log_climbable.json @@ -0,0 +1,61 @@ +{ + "variants": { + "facing=east,variant=ladder": { + "model": "twilightforest:block/hollow_acacia_log_climbable_ladder", + "uvlock": true, + "y": 270 + }, + "facing=east,variant=ladder_waterlogged": { + "model": "twilightforest:block/hollow_acacia_log_climbable_ladder", + "uvlock": true, + "y": 270 + }, + "facing=east,variant=vine": { + "model": "twilightforest:block/hollow_acacia_log_climbable_vine", + "uvlock": true, + "y": 270 + }, + "facing=north,variant=ladder": { + "model": "twilightforest:block/hollow_acacia_log_climbable_ladder", + "uvlock": true, + "y": 180 + }, + "facing=north,variant=ladder_waterlogged": { + "model": "twilightforest:block/hollow_acacia_log_climbable_ladder", + "uvlock": true, + "y": 180 + }, + "facing=north,variant=vine": { + "model": "twilightforest:block/hollow_acacia_log_climbable_vine", + "uvlock": true, + "y": 180 + }, + "facing=south,variant=ladder": { + "model": "twilightforest:block/hollow_acacia_log_climbable_ladder", + "uvlock": true + }, + "facing=south,variant=ladder_waterlogged": { + "model": "twilightforest:block/hollow_acacia_log_climbable_ladder", + "uvlock": true + }, + "facing=south,variant=vine": { + "model": "twilightforest:block/hollow_acacia_log_climbable_vine", + "uvlock": true + }, + "facing=west,variant=ladder": { + "model": "twilightforest:block/hollow_acacia_log_climbable_ladder", + "uvlock": true, + "y": 90 + }, + "facing=west,variant=ladder_waterlogged": { + "model": "twilightforest:block/hollow_acacia_log_climbable_ladder", + "uvlock": true, + "y": 90 + }, + "facing=west,variant=vine": { + "model": "twilightforest:block/hollow_acacia_log_climbable_vine", + "uvlock": true, + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/hollow_acacia_log_horizontal.json b/src/generated/resources/assets/twilightforest/blockstates/hollow_acacia_log_horizontal.json new file mode 100644 index 0000000000..bddced0624 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/hollow_acacia_log_horizontal.json @@ -0,0 +1,39 @@ +{ + "variants": { + "axis=x,variant=empty": { + "model": "twilightforest:block/hollow_acacia_log_horizontal", + "y": 90 + }, + "axis=x,variant=moss": { + "model": "twilightforest:block/hollow_acacia_log_horizontal_moss", + "y": 90 + }, + "axis=x,variant=moss_and_grass": { + "model": "twilightforest:block/hollow_acacia_log_horizontal_moss_grass", + "y": 90 + }, + "axis=x,variant=snow": { + "model": "twilightforest:block/hollow_acacia_log_horizontal_snow", + "y": 90 + }, + "axis=x,variant=waterlogged": { + "model": "twilightforest:block/hollow_acacia_log_horizontal", + "y": 90 + }, + "axis=z,variant=empty": { + "model": "twilightforest:block/hollow_acacia_log_horizontal" + }, + "axis=z,variant=moss": { + "model": "twilightforest:block/hollow_acacia_log_horizontal_moss" + }, + "axis=z,variant=moss_and_grass": { + "model": "twilightforest:block/hollow_acacia_log_horizontal_moss_grass" + }, + "axis=z,variant=snow": { + "model": "twilightforest:block/hollow_acacia_log_horizontal_snow" + }, + "axis=z,variant=waterlogged": { + "model": "twilightforest:block/hollow_acacia_log_horizontal" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/hollow_acacia_log_vertical.json b/src/generated/resources/assets/twilightforest/blockstates/hollow_acacia_log_vertical.json new file mode 100644 index 0000000000..e112abfc57 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/hollow_acacia_log_vertical.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/hollow_acacia_log_vertical" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/hollow_birch_log_climbable.json b/src/generated/resources/assets/twilightforest/blockstates/hollow_birch_log_climbable.json new file mode 100644 index 0000000000..05dbe203e3 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/hollow_birch_log_climbable.json @@ -0,0 +1,61 @@ +{ + "variants": { + "facing=east,variant=ladder": { + "model": "twilightforest:block/hollow_birch_log_climbable_ladder", + "uvlock": true, + "y": 270 + }, + "facing=east,variant=ladder_waterlogged": { + "model": "twilightforest:block/hollow_birch_log_climbable_ladder", + "uvlock": true, + "y": 270 + }, + "facing=east,variant=vine": { + "model": "twilightforest:block/hollow_birch_log_climbable_vine", + "uvlock": true, + "y": 270 + }, + "facing=north,variant=ladder": { + "model": "twilightforest:block/hollow_birch_log_climbable_ladder", + "uvlock": true, + "y": 180 + }, + "facing=north,variant=ladder_waterlogged": { + "model": "twilightforest:block/hollow_birch_log_climbable_ladder", + "uvlock": true, + "y": 180 + }, + "facing=north,variant=vine": { + "model": "twilightforest:block/hollow_birch_log_climbable_vine", + "uvlock": true, + "y": 180 + }, + "facing=south,variant=ladder": { + "model": "twilightforest:block/hollow_birch_log_climbable_ladder", + "uvlock": true + }, + "facing=south,variant=ladder_waterlogged": { + "model": "twilightforest:block/hollow_birch_log_climbable_ladder", + "uvlock": true + }, + "facing=south,variant=vine": { + "model": "twilightforest:block/hollow_birch_log_climbable_vine", + "uvlock": true + }, + "facing=west,variant=ladder": { + "model": "twilightforest:block/hollow_birch_log_climbable_ladder", + "uvlock": true, + "y": 90 + }, + "facing=west,variant=ladder_waterlogged": { + "model": "twilightforest:block/hollow_birch_log_climbable_ladder", + "uvlock": true, + "y": 90 + }, + "facing=west,variant=vine": { + "model": "twilightforest:block/hollow_birch_log_climbable_vine", + "uvlock": true, + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/hollow_birch_log_horizontal.json b/src/generated/resources/assets/twilightforest/blockstates/hollow_birch_log_horizontal.json new file mode 100644 index 0000000000..5c058cb0e0 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/hollow_birch_log_horizontal.json @@ -0,0 +1,39 @@ +{ + "variants": { + "axis=x,variant=empty": { + "model": "twilightforest:block/hollow_birch_log_horizontal", + "y": 90 + }, + "axis=x,variant=moss": { + "model": "twilightforest:block/hollow_birch_log_horizontal_moss", + "y": 90 + }, + "axis=x,variant=moss_and_grass": { + "model": "twilightforest:block/hollow_birch_log_horizontal_moss_grass", + "y": 90 + }, + "axis=x,variant=snow": { + "model": "twilightforest:block/hollow_birch_log_horizontal_snow", + "y": 90 + }, + "axis=x,variant=waterlogged": { + "model": "twilightforest:block/hollow_birch_log_horizontal", + "y": 90 + }, + "axis=z,variant=empty": { + "model": "twilightforest:block/hollow_birch_log_horizontal" + }, + "axis=z,variant=moss": { + "model": "twilightforest:block/hollow_birch_log_horizontal_moss" + }, + "axis=z,variant=moss_and_grass": { + "model": "twilightforest:block/hollow_birch_log_horizontal_moss_grass" + }, + "axis=z,variant=snow": { + "model": "twilightforest:block/hollow_birch_log_horizontal_snow" + }, + "axis=z,variant=waterlogged": { + "model": "twilightforest:block/hollow_birch_log_horizontal" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/hollow_birch_log_vertical.json b/src/generated/resources/assets/twilightforest/blockstates/hollow_birch_log_vertical.json new file mode 100644 index 0000000000..0990fa4a9d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/hollow_birch_log_vertical.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/hollow_birch_log_vertical" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/hollow_canopy_log_climbable.json b/src/generated/resources/assets/twilightforest/blockstates/hollow_canopy_log_climbable.json new file mode 100644 index 0000000000..0bd60edfaa --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/hollow_canopy_log_climbable.json @@ -0,0 +1,61 @@ +{ + "variants": { + "facing=east,variant=ladder": { + "model": "twilightforest:block/hollow_canopy_log_climbable_ladder", + "uvlock": true, + "y": 270 + }, + "facing=east,variant=ladder_waterlogged": { + "model": "twilightforest:block/hollow_canopy_log_climbable_ladder", + "uvlock": true, + "y": 270 + }, + "facing=east,variant=vine": { + "model": "twilightforest:block/hollow_canopy_log_climbable_vine", + "uvlock": true, + "y": 270 + }, + "facing=north,variant=ladder": { + "model": "twilightforest:block/hollow_canopy_log_climbable_ladder", + "uvlock": true, + "y": 180 + }, + "facing=north,variant=ladder_waterlogged": { + "model": "twilightforest:block/hollow_canopy_log_climbable_ladder", + "uvlock": true, + "y": 180 + }, + "facing=north,variant=vine": { + "model": "twilightforest:block/hollow_canopy_log_climbable_vine", + "uvlock": true, + "y": 180 + }, + "facing=south,variant=ladder": { + "model": "twilightforest:block/hollow_canopy_log_climbable_ladder", + "uvlock": true + }, + "facing=south,variant=ladder_waterlogged": { + "model": "twilightforest:block/hollow_canopy_log_climbable_ladder", + "uvlock": true + }, + "facing=south,variant=vine": { + "model": "twilightforest:block/hollow_canopy_log_climbable_vine", + "uvlock": true + }, + "facing=west,variant=ladder": { + "model": "twilightforest:block/hollow_canopy_log_climbable_ladder", + "uvlock": true, + "y": 90 + }, + "facing=west,variant=ladder_waterlogged": { + "model": "twilightforest:block/hollow_canopy_log_climbable_ladder", + "uvlock": true, + "y": 90 + }, + "facing=west,variant=vine": { + "model": "twilightforest:block/hollow_canopy_log_climbable_vine", + "uvlock": true, + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/hollow_canopy_log_horizontal.json b/src/generated/resources/assets/twilightforest/blockstates/hollow_canopy_log_horizontal.json new file mode 100644 index 0000000000..3691873687 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/hollow_canopy_log_horizontal.json @@ -0,0 +1,39 @@ +{ + "variants": { + "axis=x,variant=empty": { + "model": "twilightforest:block/hollow_canopy_log_horizontal", + "y": 90 + }, + "axis=x,variant=moss": { + "model": "twilightforest:block/hollow_canopy_log_horizontal_moss", + "y": 90 + }, + "axis=x,variant=moss_and_grass": { + "model": "twilightforest:block/hollow_canopy_log_horizontal_moss_grass", + "y": 90 + }, + "axis=x,variant=snow": { + "model": "twilightforest:block/hollow_canopy_log_horizontal_snow", + "y": 90 + }, + "axis=x,variant=waterlogged": { + "model": "twilightforest:block/hollow_canopy_log_horizontal", + "y": 90 + }, + "axis=z,variant=empty": { + "model": "twilightforest:block/hollow_canopy_log_horizontal" + }, + "axis=z,variant=moss": { + "model": "twilightforest:block/hollow_canopy_log_horizontal_moss" + }, + "axis=z,variant=moss_and_grass": { + "model": "twilightforest:block/hollow_canopy_log_horizontal_moss_grass" + }, + "axis=z,variant=snow": { + "model": "twilightforest:block/hollow_canopy_log_horizontal_snow" + }, + "axis=z,variant=waterlogged": { + "model": "twilightforest:block/hollow_canopy_log_horizontal" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/hollow_canopy_log_vertical.json b/src/generated/resources/assets/twilightforest/blockstates/hollow_canopy_log_vertical.json new file mode 100644 index 0000000000..0f8345b5f4 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/hollow_canopy_log_vertical.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/hollow_canopy_log_vertical" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/hollow_crimson_stem_climbable.json b/src/generated/resources/assets/twilightforest/blockstates/hollow_crimson_stem_climbable.json new file mode 100644 index 0000000000..3df0cbd668 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/hollow_crimson_stem_climbable.json @@ -0,0 +1,61 @@ +{ + "variants": { + "facing=east,variant=ladder": { + "model": "twilightforest:block/hollow_crimson_stem_climbable_ladder", + "uvlock": true, + "y": 270 + }, + "facing=east,variant=ladder_waterlogged": { + "model": "twilightforest:block/hollow_crimson_stem_climbable_ladder", + "uvlock": true, + "y": 270 + }, + "facing=east,variant=vine": { + "model": "twilightforest:block/hollow_crimson_stem_climbable_vine", + "uvlock": true, + "y": 270 + }, + "facing=north,variant=ladder": { + "model": "twilightforest:block/hollow_crimson_stem_climbable_ladder", + "uvlock": true, + "y": 180 + }, + "facing=north,variant=ladder_waterlogged": { + "model": "twilightforest:block/hollow_crimson_stem_climbable_ladder", + "uvlock": true, + "y": 180 + }, + "facing=north,variant=vine": { + "model": "twilightforest:block/hollow_crimson_stem_climbable_vine", + "uvlock": true, + "y": 180 + }, + "facing=south,variant=ladder": { + "model": "twilightforest:block/hollow_crimson_stem_climbable_ladder", + "uvlock": true + }, + "facing=south,variant=ladder_waterlogged": { + "model": "twilightforest:block/hollow_crimson_stem_climbable_ladder", + "uvlock": true + }, + "facing=south,variant=vine": { + "model": "twilightforest:block/hollow_crimson_stem_climbable_vine", + "uvlock": true + }, + "facing=west,variant=ladder": { + "model": "twilightforest:block/hollow_crimson_stem_climbable_ladder", + "uvlock": true, + "y": 90 + }, + "facing=west,variant=ladder_waterlogged": { + "model": "twilightforest:block/hollow_crimson_stem_climbable_ladder", + "uvlock": true, + "y": 90 + }, + "facing=west,variant=vine": { + "model": "twilightforest:block/hollow_crimson_stem_climbable_vine", + "uvlock": true, + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/hollow_crimson_stem_horizontal.json b/src/generated/resources/assets/twilightforest/blockstates/hollow_crimson_stem_horizontal.json new file mode 100644 index 0000000000..39ae7b5181 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/hollow_crimson_stem_horizontal.json @@ -0,0 +1,39 @@ +{ + "variants": { + "axis=x,variant=empty": { + "model": "twilightforest:block/hollow_crimson_stem_horizontal", + "y": 90 + }, + "axis=x,variant=moss": { + "model": "twilightforest:block/hollow_crimson_stem_horizontal_moss", + "y": 90 + }, + "axis=x,variant=moss_and_grass": { + "model": "twilightforest:block/hollow_crimson_stem_horizontal_moss_grass", + "y": 90 + }, + "axis=x,variant=snow": { + "model": "twilightforest:block/hollow_crimson_stem_horizontal_snow", + "y": 90 + }, + "axis=x,variant=waterlogged": { + "model": "twilightforest:block/hollow_crimson_stem_horizontal", + "y": 90 + }, + "axis=z,variant=empty": { + "model": "twilightforest:block/hollow_crimson_stem_horizontal" + }, + "axis=z,variant=moss": { + "model": "twilightforest:block/hollow_crimson_stem_horizontal_moss" + }, + "axis=z,variant=moss_and_grass": { + "model": "twilightforest:block/hollow_crimson_stem_horizontal_moss_grass" + }, + "axis=z,variant=snow": { + "model": "twilightforest:block/hollow_crimson_stem_horizontal_snow" + }, + "axis=z,variant=waterlogged": { + "model": "twilightforest:block/hollow_crimson_stem_horizontal" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/hollow_crimson_stem_vertical.json b/src/generated/resources/assets/twilightforest/blockstates/hollow_crimson_stem_vertical.json new file mode 100644 index 0000000000..89c764a610 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/hollow_crimson_stem_vertical.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/hollow_crimson_stem_vertical" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/hollow_dark_log_climbable.json b/src/generated/resources/assets/twilightforest/blockstates/hollow_dark_log_climbable.json new file mode 100644 index 0000000000..22b843fad9 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/hollow_dark_log_climbable.json @@ -0,0 +1,61 @@ +{ + "variants": { + "facing=east,variant=ladder": { + "model": "twilightforest:block/hollow_dark_log_climbable_ladder", + "uvlock": true, + "y": 270 + }, + "facing=east,variant=ladder_waterlogged": { + "model": "twilightforest:block/hollow_dark_log_climbable_ladder", + "uvlock": true, + "y": 270 + }, + "facing=east,variant=vine": { + "model": "twilightforest:block/hollow_dark_log_climbable_vine", + "uvlock": true, + "y": 270 + }, + "facing=north,variant=ladder": { + "model": "twilightforest:block/hollow_dark_log_climbable_ladder", + "uvlock": true, + "y": 180 + }, + "facing=north,variant=ladder_waterlogged": { + "model": "twilightforest:block/hollow_dark_log_climbable_ladder", + "uvlock": true, + "y": 180 + }, + "facing=north,variant=vine": { + "model": "twilightforest:block/hollow_dark_log_climbable_vine", + "uvlock": true, + "y": 180 + }, + "facing=south,variant=ladder": { + "model": "twilightforest:block/hollow_dark_log_climbable_ladder", + "uvlock": true + }, + "facing=south,variant=ladder_waterlogged": { + "model": "twilightforest:block/hollow_dark_log_climbable_ladder", + "uvlock": true + }, + "facing=south,variant=vine": { + "model": "twilightforest:block/hollow_dark_log_climbable_vine", + "uvlock": true + }, + "facing=west,variant=ladder": { + "model": "twilightforest:block/hollow_dark_log_climbable_ladder", + "uvlock": true, + "y": 90 + }, + "facing=west,variant=ladder_waterlogged": { + "model": "twilightforest:block/hollow_dark_log_climbable_ladder", + "uvlock": true, + "y": 90 + }, + "facing=west,variant=vine": { + "model": "twilightforest:block/hollow_dark_log_climbable_vine", + "uvlock": true, + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/hollow_dark_log_horizontal.json b/src/generated/resources/assets/twilightforest/blockstates/hollow_dark_log_horizontal.json new file mode 100644 index 0000000000..45418730e9 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/hollow_dark_log_horizontal.json @@ -0,0 +1,39 @@ +{ + "variants": { + "axis=x,variant=empty": { + "model": "twilightforest:block/hollow_dark_log_horizontal", + "y": 90 + }, + "axis=x,variant=moss": { + "model": "twilightforest:block/hollow_dark_log_horizontal_moss", + "y": 90 + }, + "axis=x,variant=moss_and_grass": { + "model": "twilightforest:block/hollow_dark_log_horizontal_moss_grass", + "y": 90 + }, + "axis=x,variant=snow": { + "model": "twilightforest:block/hollow_dark_log_horizontal_snow", + "y": 90 + }, + "axis=x,variant=waterlogged": { + "model": "twilightforest:block/hollow_dark_log_horizontal", + "y": 90 + }, + "axis=z,variant=empty": { + "model": "twilightforest:block/hollow_dark_log_horizontal" + }, + "axis=z,variant=moss": { + "model": "twilightforest:block/hollow_dark_log_horizontal_moss" + }, + "axis=z,variant=moss_and_grass": { + "model": "twilightforest:block/hollow_dark_log_horizontal_moss_grass" + }, + "axis=z,variant=snow": { + "model": "twilightforest:block/hollow_dark_log_horizontal_snow" + }, + "axis=z,variant=waterlogged": { + "model": "twilightforest:block/hollow_dark_log_horizontal" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/hollow_dark_log_vertical.json b/src/generated/resources/assets/twilightforest/blockstates/hollow_dark_log_vertical.json new file mode 100644 index 0000000000..853a096a5c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/hollow_dark_log_vertical.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/hollow_dark_log_vertical" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/hollow_dark_oak_log_climbable.json b/src/generated/resources/assets/twilightforest/blockstates/hollow_dark_oak_log_climbable.json new file mode 100644 index 0000000000..e15bb13c8f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/hollow_dark_oak_log_climbable.json @@ -0,0 +1,61 @@ +{ + "variants": { + "facing=east,variant=ladder": { + "model": "twilightforest:block/hollow_dark_oak_log_climbable_ladder", + "uvlock": true, + "y": 270 + }, + "facing=east,variant=ladder_waterlogged": { + "model": "twilightforest:block/hollow_dark_oak_log_climbable_ladder", + "uvlock": true, + "y": 270 + }, + "facing=east,variant=vine": { + "model": "twilightforest:block/hollow_dark_oak_log_climbable_vine", + "uvlock": true, + "y": 270 + }, + "facing=north,variant=ladder": { + "model": "twilightforest:block/hollow_dark_oak_log_climbable_ladder", + "uvlock": true, + "y": 180 + }, + "facing=north,variant=ladder_waterlogged": { + "model": "twilightforest:block/hollow_dark_oak_log_climbable_ladder", + "uvlock": true, + "y": 180 + }, + "facing=north,variant=vine": { + "model": "twilightforest:block/hollow_dark_oak_log_climbable_vine", + "uvlock": true, + "y": 180 + }, + "facing=south,variant=ladder": { + "model": "twilightforest:block/hollow_dark_oak_log_climbable_ladder", + "uvlock": true + }, + "facing=south,variant=ladder_waterlogged": { + "model": "twilightforest:block/hollow_dark_oak_log_climbable_ladder", + "uvlock": true + }, + "facing=south,variant=vine": { + "model": "twilightforest:block/hollow_dark_oak_log_climbable_vine", + "uvlock": true + }, + "facing=west,variant=ladder": { + "model": "twilightforest:block/hollow_dark_oak_log_climbable_ladder", + "uvlock": true, + "y": 90 + }, + "facing=west,variant=ladder_waterlogged": { + "model": "twilightforest:block/hollow_dark_oak_log_climbable_ladder", + "uvlock": true, + "y": 90 + }, + "facing=west,variant=vine": { + "model": "twilightforest:block/hollow_dark_oak_log_climbable_vine", + "uvlock": true, + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/hollow_dark_oak_log_horizontal.json b/src/generated/resources/assets/twilightforest/blockstates/hollow_dark_oak_log_horizontal.json new file mode 100644 index 0000000000..42f9aaf0a8 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/hollow_dark_oak_log_horizontal.json @@ -0,0 +1,39 @@ +{ + "variants": { + "axis=x,variant=empty": { + "model": "twilightforest:block/hollow_dark_oak_log_horizontal", + "y": 90 + }, + "axis=x,variant=moss": { + "model": "twilightforest:block/hollow_dark_oak_log_horizontal_moss", + "y": 90 + }, + "axis=x,variant=moss_and_grass": { + "model": "twilightforest:block/hollow_dark_oak_log_horizontal_moss_grass", + "y": 90 + }, + "axis=x,variant=snow": { + "model": "twilightforest:block/hollow_dark_oak_log_horizontal_snow", + "y": 90 + }, + "axis=x,variant=waterlogged": { + "model": "twilightforest:block/hollow_dark_oak_log_horizontal", + "y": 90 + }, + "axis=z,variant=empty": { + "model": "twilightforest:block/hollow_dark_oak_log_horizontal" + }, + "axis=z,variant=moss": { + "model": "twilightforest:block/hollow_dark_oak_log_horizontal_moss" + }, + "axis=z,variant=moss_and_grass": { + "model": "twilightforest:block/hollow_dark_oak_log_horizontal_moss_grass" + }, + "axis=z,variant=snow": { + "model": "twilightforest:block/hollow_dark_oak_log_horizontal_snow" + }, + "axis=z,variant=waterlogged": { + "model": "twilightforest:block/hollow_dark_oak_log_horizontal" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/hollow_dark_oak_log_vertical.json b/src/generated/resources/assets/twilightforest/blockstates/hollow_dark_oak_log_vertical.json new file mode 100644 index 0000000000..51f6ae3fb2 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/hollow_dark_oak_log_vertical.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/hollow_dark_oak_log_vertical" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/hollow_jungle_log_climbable.json b/src/generated/resources/assets/twilightforest/blockstates/hollow_jungle_log_climbable.json new file mode 100644 index 0000000000..3c19da0ad3 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/hollow_jungle_log_climbable.json @@ -0,0 +1,61 @@ +{ + "variants": { + "facing=east,variant=ladder": { + "model": "twilightforest:block/hollow_jungle_log_climbable_ladder", + "uvlock": true, + "y": 270 + }, + "facing=east,variant=ladder_waterlogged": { + "model": "twilightforest:block/hollow_jungle_log_climbable_ladder", + "uvlock": true, + "y": 270 + }, + "facing=east,variant=vine": { + "model": "twilightforest:block/hollow_jungle_log_climbable_vine", + "uvlock": true, + "y": 270 + }, + "facing=north,variant=ladder": { + "model": "twilightforest:block/hollow_jungle_log_climbable_ladder", + "uvlock": true, + "y": 180 + }, + "facing=north,variant=ladder_waterlogged": { + "model": "twilightforest:block/hollow_jungle_log_climbable_ladder", + "uvlock": true, + "y": 180 + }, + "facing=north,variant=vine": { + "model": "twilightforest:block/hollow_jungle_log_climbable_vine", + "uvlock": true, + "y": 180 + }, + "facing=south,variant=ladder": { + "model": "twilightforest:block/hollow_jungle_log_climbable_ladder", + "uvlock": true + }, + "facing=south,variant=ladder_waterlogged": { + "model": "twilightforest:block/hollow_jungle_log_climbable_ladder", + "uvlock": true + }, + "facing=south,variant=vine": { + "model": "twilightforest:block/hollow_jungle_log_climbable_vine", + "uvlock": true + }, + "facing=west,variant=ladder": { + "model": "twilightforest:block/hollow_jungle_log_climbable_ladder", + "uvlock": true, + "y": 90 + }, + "facing=west,variant=ladder_waterlogged": { + "model": "twilightforest:block/hollow_jungle_log_climbable_ladder", + "uvlock": true, + "y": 90 + }, + "facing=west,variant=vine": { + "model": "twilightforest:block/hollow_jungle_log_climbable_vine", + "uvlock": true, + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/hollow_jungle_log_horizontal.json b/src/generated/resources/assets/twilightforest/blockstates/hollow_jungle_log_horizontal.json new file mode 100644 index 0000000000..e7c75e1328 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/hollow_jungle_log_horizontal.json @@ -0,0 +1,39 @@ +{ + "variants": { + "axis=x,variant=empty": { + "model": "twilightforest:block/hollow_jungle_log_horizontal", + "y": 90 + }, + "axis=x,variant=moss": { + "model": "twilightforest:block/hollow_jungle_log_horizontal_moss", + "y": 90 + }, + "axis=x,variant=moss_and_grass": { + "model": "twilightforest:block/hollow_jungle_log_horizontal_moss_grass", + "y": 90 + }, + "axis=x,variant=snow": { + "model": "twilightforest:block/hollow_jungle_log_horizontal_snow", + "y": 90 + }, + "axis=x,variant=waterlogged": { + "model": "twilightforest:block/hollow_jungle_log_horizontal", + "y": 90 + }, + "axis=z,variant=empty": { + "model": "twilightforest:block/hollow_jungle_log_horizontal" + }, + "axis=z,variant=moss": { + "model": "twilightforest:block/hollow_jungle_log_horizontal_moss" + }, + "axis=z,variant=moss_and_grass": { + "model": "twilightforest:block/hollow_jungle_log_horizontal_moss_grass" + }, + "axis=z,variant=snow": { + "model": "twilightforest:block/hollow_jungle_log_horizontal_snow" + }, + "axis=z,variant=waterlogged": { + "model": "twilightforest:block/hollow_jungle_log_horizontal" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/hollow_jungle_log_vertical.json b/src/generated/resources/assets/twilightforest/blockstates/hollow_jungle_log_vertical.json new file mode 100644 index 0000000000..9cb9ca2cac --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/hollow_jungle_log_vertical.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/hollow_jungle_log_vertical" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/hollow_mangrove_log_climbable.json b/src/generated/resources/assets/twilightforest/blockstates/hollow_mangrove_log_climbable.json new file mode 100644 index 0000000000..b1eecbf6e2 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/hollow_mangrove_log_climbable.json @@ -0,0 +1,61 @@ +{ + "variants": { + "facing=east,variant=ladder": { + "model": "twilightforest:block/hollow_mangrove_log_climbable_ladder", + "uvlock": true, + "y": 270 + }, + "facing=east,variant=ladder_waterlogged": { + "model": "twilightforest:block/hollow_mangrove_log_climbable_ladder", + "uvlock": true, + "y": 270 + }, + "facing=east,variant=vine": { + "model": "twilightforest:block/hollow_mangrove_log_climbable_vine", + "uvlock": true, + "y": 270 + }, + "facing=north,variant=ladder": { + "model": "twilightforest:block/hollow_mangrove_log_climbable_ladder", + "uvlock": true, + "y": 180 + }, + "facing=north,variant=ladder_waterlogged": { + "model": "twilightforest:block/hollow_mangrove_log_climbable_ladder", + "uvlock": true, + "y": 180 + }, + "facing=north,variant=vine": { + "model": "twilightforest:block/hollow_mangrove_log_climbable_vine", + "uvlock": true, + "y": 180 + }, + "facing=south,variant=ladder": { + "model": "twilightforest:block/hollow_mangrove_log_climbable_ladder", + "uvlock": true + }, + "facing=south,variant=ladder_waterlogged": { + "model": "twilightforest:block/hollow_mangrove_log_climbable_ladder", + "uvlock": true + }, + "facing=south,variant=vine": { + "model": "twilightforest:block/hollow_mangrove_log_climbable_vine", + "uvlock": true + }, + "facing=west,variant=ladder": { + "model": "twilightforest:block/hollow_mangrove_log_climbable_ladder", + "uvlock": true, + "y": 90 + }, + "facing=west,variant=ladder_waterlogged": { + "model": "twilightforest:block/hollow_mangrove_log_climbable_ladder", + "uvlock": true, + "y": 90 + }, + "facing=west,variant=vine": { + "model": "twilightforest:block/hollow_mangrove_log_climbable_vine", + "uvlock": true, + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/hollow_mangrove_log_horizontal.json b/src/generated/resources/assets/twilightforest/blockstates/hollow_mangrove_log_horizontal.json new file mode 100644 index 0000000000..fe64cac4f8 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/hollow_mangrove_log_horizontal.json @@ -0,0 +1,39 @@ +{ + "variants": { + "axis=x,variant=empty": { + "model": "twilightforest:block/hollow_mangrove_log_horizontal", + "y": 90 + }, + "axis=x,variant=moss": { + "model": "twilightforest:block/hollow_mangrove_log_horizontal_moss", + "y": 90 + }, + "axis=x,variant=moss_and_grass": { + "model": "twilightforest:block/hollow_mangrove_log_horizontal_moss_grass", + "y": 90 + }, + "axis=x,variant=snow": { + "model": "twilightforest:block/hollow_mangrove_log_horizontal_snow", + "y": 90 + }, + "axis=x,variant=waterlogged": { + "model": "twilightforest:block/hollow_mangrove_log_horizontal", + "y": 90 + }, + "axis=z,variant=empty": { + "model": "twilightforest:block/hollow_mangrove_log_horizontal" + }, + "axis=z,variant=moss": { + "model": "twilightforest:block/hollow_mangrove_log_horizontal_moss" + }, + "axis=z,variant=moss_and_grass": { + "model": "twilightforest:block/hollow_mangrove_log_horizontal_moss_grass" + }, + "axis=z,variant=snow": { + "model": "twilightforest:block/hollow_mangrove_log_horizontal_snow" + }, + "axis=z,variant=waterlogged": { + "model": "twilightforest:block/hollow_mangrove_log_horizontal" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/hollow_mangrove_log_vertical.json b/src/generated/resources/assets/twilightforest/blockstates/hollow_mangrove_log_vertical.json new file mode 100644 index 0000000000..2d2092f7a6 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/hollow_mangrove_log_vertical.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/hollow_mangrove_log_vertical" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/hollow_mining_log_climbable.json b/src/generated/resources/assets/twilightforest/blockstates/hollow_mining_log_climbable.json new file mode 100644 index 0000000000..fc79a5c58d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/hollow_mining_log_climbable.json @@ -0,0 +1,61 @@ +{ + "variants": { + "facing=east,variant=ladder": { + "model": "twilightforest:block/hollow_mining_log_climbable_ladder", + "uvlock": true, + "y": 270 + }, + "facing=east,variant=ladder_waterlogged": { + "model": "twilightforest:block/hollow_mining_log_climbable_ladder", + "uvlock": true, + "y": 270 + }, + "facing=east,variant=vine": { + "model": "twilightforest:block/hollow_mining_log_climbable_vine", + "uvlock": true, + "y": 270 + }, + "facing=north,variant=ladder": { + "model": "twilightforest:block/hollow_mining_log_climbable_ladder", + "uvlock": true, + "y": 180 + }, + "facing=north,variant=ladder_waterlogged": { + "model": "twilightforest:block/hollow_mining_log_climbable_ladder", + "uvlock": true, + "y": 180 + }, + "facing=north,variant=vine": { + "model": "twilightforest:block/hollow_mining_log_climbable_vine", + "uvlock": true, + "y": 180 + }, + "facing=south,variant=ladder": { + "model": "twilightforest:block/hollow_mining_log_climbable_ladder", + "uvlock": true + }, + "facing=south,variant=ladder_waterlogged": { + "model": "twilightforest:block/hollow_mining_log_climbable_ladder", + "uvlock": true + }, + "facing=south,variant=vine": { + "model": "twilightforest:block/hollow_mining_log_climbable_vine", + "uvlock": true + }, + "facing=west,variant=ladder": { + "model": "twilightforest:block/hollow_mining_log_climbable_ladder", + "uvlock": true, + "y": 90 + }, + "facing=west,variant=ladder_waterlogged": { + "model": "twilightforest:block/hollow_mining_log_climbable_ladder", + "uvlock": true, + "y": 90 + }, + "facing=west,variant=vine": { + "model": "twilightforest:block/hollow_mining_log_climbable_vine", + "uvlock": true, + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/hollow_mining_log_horizontal.json b/src/generated/resources/assets/twilightforest/blockstates/hollow_mining_log_horizontal.json new file mode 100644 index 0000000000..e3f9fc3da2 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/hollow_mining_log_horizontal.json @@ -0,0 +1,39 @@ +{ + "variants": { + "axis=x,variant=empty": { + "model": "twilightforest:block/hollow_mining_log_horizontal", + "y": 90 + }, + "axis=x,variant=moss": { + "model": "twilightforest:block/hollow_mining_log_horizontal_moss", + "y": 90 + }, + "axis=x,variant=moss_and_grass": { + "model": "twilightforest:block/hollow_mining_log_horizontal_moss_grass", + "y": 90 + }, + "axis=x,variant=snow": { + "model": "twilightforest:block/hollow_mining_log_horizontal_snow", + "y": 90 + }, + "axis=x,variant=waterlogged": { + "model": "twilightforest:block/hollow_mining_log_horizontal", + "y": 90 + }, + "axis=z,variant=empty": { + "model": "twilightforest:block/hollow_mining_log_horizontal" + }, + "axis=z,variant=moss": { + "model": "twilightforest:block/hollow_mining_log_horizontal_moss" + }, + "axis=z,variant=moss_and_grass": { + "model": "twilightforest:block/hollow_mining_log_horizontal_moss_grass" + }, + "axis=z,variant=snow": { + "model": "twilightforest:block/hollow_mining_log_horizontal_snow" + }, + "axis=z,variant=waterlogged": { + "model": "twilightforest:block/hollow_mining_log_horizontal" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/hollow_mining_log_vertical.json b/src/generated/resources/assets/twilightforest/blockstates/hollow_mining_log_vertical.json new file mode 100644 index 0000000000..1082e9c72d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/hollow_mining_log_vertical.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/hollow_mining_log_vertical" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/hollow_oak_log_climbable.json b/src/generated/resources/assets/twilightforest/blockstates/hollow_oak_log_climbable.json new file mode 100644 index 0000000000..695ac8a153 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/hollow_oak_log_climbable.json @@ -0,0 +1,61 @@ +{ + "variants": { + "facing=east,variant=ladder": { + "model": "twilightforest:block/hollow_oak_log_climbable_ladder", + "uvlock": true, + "y": 270 + }, + "facing=east,variant=ladder_waterlogged": { + "model": "twilightforest:block/hollow_oak_log_climbable_ladder", + "uvlock": true, + "y": 270 + }, + "facing=east,variant=vine": { + "model": "twilightforest:block/hollow_oak_log_climbable_vine", + "uvlock": true, + "y": 270 + }, + "facing=north,variant=ladder": { + "model": "twilightforest:block/hollow_oak_log_climbable_ladder", + "uvlock": true, + "y": 180 + }, + "facing=north,variant=ladder_waterlogged": { + "model": "twilightforest:block/hollow_oak_log_climbable_ladder", + "uvlock": true, + "y": 180 + }, + "facing=north,variant=vine": { + "model": "twilightforest:block/hollow_oak_log_climbable_vine", + "uvlock": true, + "y": 180 + }, + "facing=south,variant=ladder": { + "model": "twilightforest:block/hollow_oak_log_climbable_ladder", + "uvlock": true + }, + "facing=south,variant=ladder_waterlogged": { + "model": "twilightforest:block/hollow_oak_log_climbable_ladder", + "uvlock": true + }, + "facing=south,variant=vine": { + "model": "twilightforest:block/hollow_oak_log_climbable_vine", + "uvlock": true + }, + "facing=west,variant=ladder": { + "model": "twilightforest:block/hollow_oak_log_climbable_ladder", + "uvlock": true, + "y": 90 + }, + "facing=west,variant=ladder_waterlogged": { + "model": "twilightforest:block/hollow_oak_log_climbable_ladder", + "uvlock": true, + "y": 90 + }, + "facing=west,variant=vine": { + "model": "twilightforest:block/hollow_oak_log_climbable_vine", + "uvlock": true, + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/hollow_oak_log_horizontal.json b/src/generated/resources/assets/twilightforest/blockstates/hollow_oak_log_horizontal.json new file mode 100644 index 0000000000..978ac8b0f9 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/hollow_oak_log_horizontal.json @@ -0,0 +1,39 @@ +{ + "variants": { + "axis=x,variant=empty": { + "model": "twilightforest:block/hollow_oak_log_horizontal", + "y": 90 + }, + "axis=x,variant=moss": { + "model": "twilightforest:block/hollow_oak_log_horizontal_moss", + "y": 90 + }, + "axis=x,variant=moss_and_grass": { + "model": "twilightforest:block/hollow_oak_log_horizontal_moss_grass", + "y": 90 + }, + "axis=x,variant=snow": { + "model": "twilightforest:block/hollow_oak_log_horizontal_snow", + "y": 90 + }, + "axis=x,variant=waterlogged": { + "model": "twilightforest:block/hollow_oak_log_horizontal", + "y": 90 + }, + "axis=z,variant=empty": { + "model": "twilightforest:block/hollow_oak_log_horizontal" + }, + "axis=z,variant=moss": { + "model": "twilightforest:block/hollow_oak_log_horizontal_moss" + }, + "axis=z,variant=moss_and_grass": { + "model": "twilightforest:block/hollow_oak_log_horizontal_moss_grass" + }, + "axis=z,variant=snow": { + "model": "twilightforest:block/hollow_oak_log_horizontal_snow" + }, + "axis=z,variant=waterlogged": { + "model": "twilightforest:block/hollow_oak_log_horizontal" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/hollow_oak_log_vertical.json b/src/generated/resources/assets/twilightforest/blockstates/hollow_oak_log_vertical.json new file mode 100644 index 0000000000..b3593936ab --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/hollow_oak_log_vertical.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/hollow_oak_log_vertical" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/hollow_oak_sapling.json b/src/generated/resources/assets/twilightforest/blockstates/hollow_oak_sapling.json new file mode 100644 index 0000000000..5b4a07ec18 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/hollow_oak_sapling.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/hollow_oak_sapling" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/hollow_sorting_log_climbable.json b/src/generated/resources/assets/twilightforest/blockstates/hollow_sorting_log_climbable.json new file mode 100644 index 0000000000..6791806d01 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/hollow_sorting_log_climbable.json @@ -0,0 +1,61 @@ +{ + "variants": { + "facing=east,variant=ladder": { + "model": "twilightforest:block/hollow_sorting_log_climbable_ladder", + "uvlock": true, + "y": 270 + }, + "facing=east,variant=ladder_waterlogged": { + "model": "twilightforest:block/hollow_sorting_log_climbable_ladder", + "uvlock": true, + "y": 270 + }, + "facing=east,variant=vine": { + "model": "twilightforest:block/hollow_sorting_log_climbable_vine", + "uvlock": true, + "y": 270 + }, + "facing=north,variant=ladder": { + "model": "twilightforest:block/hollow_sorting_log_climbable_ladder", + "uvlock": true, + "y": 180 + }, + "facing=north,variant=ladder_waterlogged": { + "model": "twilightforest:block/hollow_sorting_log_climbable_ladder", + "uvlock": true, + "y": 180 + }, + "facing=north,variant=vine": { + "model": "twilightforest:block/hollow_sorting_log_climbable_vine", + "uvlock": true, + "y": 180 + }, + "facing=south,variant=ladder": { + "model": "twilightforest:block/hollow_sorting_log_climbable_ladder", + "uvlock": true + }, + "facing=south,variant=ladder_waterlogged": { + "model": "twilightforest:block/hollow_sorting_log_climbable_ladder", + "uvlock": true + }, + "facing=south,variant=vine": { + "model": "twilightforest:block/hollow_sorting_log_climbable_vine", + "uvlock": true + }, + "facing=west,variant=ladder": { + "model": "twilightforest:block/hollow_sorting_log_climbable_ladder", + "uvlock": true, + "y": 90 + }, + "facing=west,variant=ladder_waterlogged": { + "model": "twilightforest:block/hollow_sorting_log_climbable_ladder", + "uvlock": true, + "y": 90 + }, + "facing=west,variant=vine": { + "model": "twilightforest:block/hollow_sorting_log_climbable_vine", + "uvlock": true, + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/hollow_sorting_log_horizontal.json b/src/generated/resources/assets/twilightforest/blockstates/hollow_sorting_log_horizontal.json new file mode 100644 index 0000000000..12363b9a60 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/hollow_sorting_log_horizontal.json @@ -0,0 +1,39 @@ +{ + "variants": { + "axis=x,variant=empty": { + "model": "twilightforest:block/hollow_sorting_log_horizontal", + "y": 90 + }, + "axis=x,variant=moss": { + "model": "twilightforest:block/hollow_sorting_log_horizontal_moss", + "y": 90 + }, + "axis=x,variant=moss_and_grass": { + "model": "twilightforest:block/hollow_sorting_log_horizontal_moss_grass", + "y": 90 + }, + "axis=x,variant=snow": { + "model": "twilightforest:block/hollow_sorting_log_horizontal_snow", + "y": 90 + }, + "axis=x,variant=waterlogged": { + "model": "twilightforest:block/hollow_sorting_log_horizontal", + "y": 90 + }, + "axis=z,variant=empty": { + "model": "twilightforest:block/hollow_sorting_log_horizontal" + }, + "axis=z,variant=moss": { + "model": "twilightforest:block/hollow_sorting_log_horizontal_moss" + }, + "axis=z,variant=moss_and_grass": { + "model": "twilightforest:block/hollow_sorting_log_horizontal_moss_grass" + }, + "axis=z,variant=snow": { + "model": "twilightforest:block/hollow_sorting_log_horizontal_snow" + }, + "axis=z,variant=waterlogged": { + "model": "twilightforest:block/hollow_sorting_log_horizontal" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/hollow_sorting_log_vertical.json b/src/generated/resources/assets/twilightforest/blockstates/hollow_sorting_log_vertical.json new file mode 100644 index 0000000000..ea73693e5c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/hollow_sorting_log_vertical.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/hollow_sorting_log_vertical" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/hollow_spruce_log_climbable.json b/src/generated/resources/assets/twilightforest/blockstates/hollow_spruce_log_climbable.json new file mode 100644 index 0000000000..ecd93255f8 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/hollow_spruce_log_climbable.json @@ -0,0 +1,61 @@ +{ + "variants": { + "facing=east,variant=ladder": { + "model": "twilightforest:block/hollow_spruce_log_climbable_ladder", + "uvlock": true, + "y": 270 + }, + "facing=east,variant=ladder_waterlogged": { + "model": "twilightforest:block/hollow_spruce_log_climbable_ladder", + "uvlock": true, + "y": 270 + }, + "facing=east,variant=vine": { + "model": "twilightforest:block/hollow_spruce_log_climbable_vine", + "uvlock": true, + "y": 270 + }, + "facing=north,variant=ladder": { + "model": "twilightforest:block/hollow_spruce_log_climbable_ladder", + "uvlock": true, + "y": 180 + }, + "facing=north,variant=ladder_waterlogged": { + "model": "twilightforest:block/hollow_spruce_log_climbable_ladder", + "uvlock": true, + "y": 180 + }, + "facing=north,variant=vine": { + "model": "twilightforest:block/hollow_spruce_log_climbable_vine", + "uvlock": true, + "y": 180 + }, + "facing=south,variant=ladder": { + "model": "twilightforest:block/hollow_spruce_log_climbable_ladder", + "uvlock": true + }, + "facing=south,variant=ladder_waterlogged": { + "model": "twilightforest:block/hollow_spruce_log_climbable_ladder", + "uvlock": true + }, + "facing=south,variant=vine": { + "model": "twilightforest:block/hollow_spruce_log_climbable_vine", + "uvlock": true + }, + "facing=west,variant=ladder": { + "model": "twilightforest:block/hollow_spruce_log_climbable_ladder", + "uvlock": true, + "y": 90 + }, + "facing=west,variant=ladder_waterlogged": { + "model": "twilightforest:block/hollow_spruce_log_climbable_ladder", + "uvlock": true, + "y": 90 + }, + "facing=west,variant=vine": { + "model": "twilightforest:block/hollow_spruce_log_climbable_vine", + "uvlock": true, + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/hollow_spruce_log_horizontal.json b/src/generated/resources/assets/twilightforest/blockstates/hollow_spruce_log_horizontal.json new file mode 100644 index 0000000000..8fc00a1108 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/hollow_spruce_log_horizontal.json @@ -0,0 +1,39 @@ +{ + "variants": { + "axis=x,variant=empty": { + "model": "twilightforest:block/hollow_spruce_log_horizontal", + "y": 90 + }, + "axis=x,variant=moss": { + "model": "twilightforest:block/hollow_spruce_log_horizontal_moss", + "y": 90 + }, + "axis=x,variant=moss_and_grass": { + "model": "twilightforest:block/hollow_spruce_log_horizontal_moss_grass", + "y": 90 + }, + "axis=x,variant=snow": { + "model": "twilightforest:block/hollow_spruce_log_horizontal_snow", + "y": 90 + }, + "axis=x,variant=waterlogged": { + "model": "twilightforest:block/hollow_spruce_log_horizontal", + "y": 90 + }, + "axis=z,variant=empty": { + "model": "twilightforest:block/hollow_spruce_log_horizontal" + }, + "axis=z,variant=moss": { + "model": "twilightforest:block/hollow_spruce_log_horizontal_moss" + }, + "axis=z,variant=moss_and_grass": { + "model": "twilightforest:block/hollow_spruce_log_horizontal_moss_grass" + }, + "axis=z,variant=snow": { + "model": "twilightforest:block/hollow_spruce_log_horizontal_snow" + }, + "axis=z,variant=waterlogged": { + "model": "twilightforest:block/hollow_spruce_log_horizontal" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/hollow_spruce_log_vertical.json b/src/generated/resources/assets/twilightforest/blockstates/hollow_spruce_log_vertical.json new file mode 100644 index 0000000000..01a08f7fb2 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/hollow_spruce_log_vertical.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/hollow_spruce_log_vertical" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/hollow_time_log_climbable.json b/src/generated/resources/assets/twilightforest/blockstates/hollow_time_log_climbable.json new file mode 100644 index 0000000000..73e998e49a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/hollow_time_log_climbable.json @@ -0,0 +1,61 @@ +{ + "variants": { + "facing=east,variant=ladder": { + "model": "twilightforest:block/hollow_time_log_climbable_ladder", + "uvlock": true, + "y": 270 + }, + "facing=east,variant=ladder_waterlogged": { + "model": "twilightforest:block/hollow_time_log_climbable_ladder", + "uvlock": true, + "y": 270 + }, + "facing=east,variant=vine": { + "model": "twilightforest:block/hollow_time_log_climbable_vine", + "uvlock": true, + "y": 270 + }, + "facing=north,variant=ladder": { + "model": "twilightforest:block/hollow_time_log_climbable_ladder", + "uvlock": true, + "y": 180 + }, + "facing=north,variant=ladder_waterlogged": { + "model": "twilightforest:block/hollow_time_log_climbable_ladder", + "uvlock": true, + "y": 180 + }, + "facing=north,variant=vine": { + "model": "twilightforest:block/hollow_time_log_climbable_vine", + "uvlock": true, + "y": 180 + }, + "facing=south,variant=ladder": { + "model": "twilightforest:block/hollow_time_log_climbable_ladder", + "uvlock": true + }, + "facing=south,variant=ladder_waterlogged": { + "model": "twilightforest:block/hollow_time_log_climbable_ladder", + "uvlock": true + }, + "facing=south,variant=vine": { + "model": "twilightforest:block/hollow_time_log_climbable_vine", + "uvlock": true + }, + "facing=west,variant=ladder": { + "model": "twilightforest:block/hollow_time_log_climbable_ladder", + "uvlock": true, + "y": 90 + }, + "facing=west,variant=ladder_waterlogged": { + "model": "twilightforest:block/hollow_time_log_climbable_ladder", + "uvlock": true, + "y": 90 + }, + "facing=west,variant=vine": { + "model": "twilightforest:block/hollow_time_log_climbable_vine", + "uvlock": true, + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/hollow_time_log_horizontal.json b/src/generated/resources/assets/twilightforest/blockstates/hollow_time_log_horizontal.json new file mode 100644 index 0000000000..2297478bc6 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/hollow_time_log_horizontal.json @@ -0,0 +1,39 @@ +{ + "variants": { + "axis=x,variant=empty": { + "model": "twilightforest:block/hollow_time_log_horizontal", + "y": 90 + }, + "axis=x,variant=moss": { + "model": "twilightforest:block/hollow_time_log_horizontal_moss", + "y": 90 + }, + "axis=x,variant=moss_and_grass": { + "model": "twilightforest:block/hollow_time_log_horizontal_moss_grass", + "y": 90 + }, + "axis=x,variant=snow": { + "model": "twilightforest:block/hollow_time_log_horizontal_snow", + "y": 90 + }, + "axis=x,variant=waterlogged": { + "model": "twilightforest:block/hollow_time_log_horizontal", + "y": 90 + }, + "axis=z,variant=empty": { + "model": "twilightforest:block/hollow_time_log_horizontal" + }, + "axis=z,variant=moss": { + "model": "twilightforest:block/hollow_time_log_horizontal_moss" + }, + "axis=z,variant=moss_and_grass": { + "model": "twilightforest:block/hollow_time_log_horizontal_moss_grass" + }, + "axis=z,variant=snow": { + "model": "twilightforest:block/hollow_time_log_horizontal_snow" + }, + "axis=z,variant=waterlogged": { + "model": "twilightforest:block/hollow_time_log_horizontal" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/hollow_time_log_vertical.json b/src/generated/resources/assets/twilightforest/blockstates/hollow_time_log_vertical.json new file mode 100644 index 0000000000..034dca3bcc --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/hollow_time_log_vertical.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/hollow_time_log_vertical" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/hollow_transformation_log_climbable.json b/src/generated/resources/assets/twilightforest/blockstates/hollow_transformation_log_climbable.json new file mode 100644 index 0000000000..b29197dd6b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/hollow_transformation_log_climbable.json @@ -0,0 +1,61 @@ +{ + "variants": { + "facing=east,variant=ladder": { + "model": "twilightforest:block/hollow_transformation_log_climbable_ladder", + "uvlock": true, + "y": 270 + }, + "facing=east,variant=ladder_waterlogged": { + "model": "twilightforest:block/hollow_transformation_log_climbable_ladder", + "uvlock": true, + "y": 270 + }, + "facing=east,variant=vine": { + "model": "twilightforest:block/hollow_transformation_log_climbable_vine", + "uvlock": true, + "y": 270 + }, + "facing=north,variant=ladder": { + "model": "twilightforest:block/hollow_transformation_log_climbable_ladder", + "uvlock": true, + "y": 180 + }, + "facing=north,variant=ladder_waterlogged": { + "model": "twilightforest:block/hollow_transformation_log_climbable_ladder", + "uvlock": true, + "y": 180 + }, + "facing=north,variant=vine": { + "model": "twilightforest:block/hollow_transformation_log_climbable_vine", + "uvlock": true, + "y": 180 + }, + "facing=south,variant=ladder": { + "model": "twilightforest:block/hollow_transformation_log_climbable_ladder", + "uvlock": true + }, + "facing=south,variant=ladder_waterlogged": { + "model": "twilightforest:block/hollow_transformation_log_climbable_ladder", + "uvlock": true + }, + "facing=south,variant=vine": { + "model": "twilightforest:block/hollow_transformation_log_climbable_vine", + "uvlock": true + }, + "facing=west,variant=ladder": { + "model": "twilightforest:block/hollow_transformation_log_climbable_ladder", + "uvlock": true, + "y": 90 + }, + "facing=west,variant=ladder_waterlogged": { + "model": "twilightforest:block/hollow_transformation_log_climbable_ladder", + "uvlock": true, + "y": 90 + }, + "facing=west,variant=vine": { + "model": "twilightforest:block/hollow_transformation_log_climbable_vine", + "uvlock": true, + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/hollow_transformation_log_horizontal.json b/src/generated/resources/assets/twilightforest/blockstates/hollow_transformation_log_horizontal.json new file mode 100644 index 0000000000..c689f366ae --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/hollow_transformation_log_horizontal.json @@ -0,0 +1,39 @@ +{ + "variants": { + "axis=x,variant=empty": { + "model": "twilightforest:block/hollow_transformation_log_horizontal", + "y": 90 + }, + "axis=x,variant=moss": { + "model": "twilightforest:block/hollow_transformation_log_horizontal_moss", + "y": 90 + }, + "axis=x,variant=moss_and_grass": { + "model": "twilightforest:block/hollow_transformation_log_horizontal_moss_grass", + "y": 90 + }, + "axis=x,variant=snow": { + "model": "twilightforest:block/hollow_transformation_log_horizontal_snow", + "y": 90 + }, + "axis=x,variant=waterlogged": { + "model": "twilightforest:block/hollow_transformation_log_horizontal", + "y": 90 + }, + "axis=z,variant=empty": { + "model": "twilightforest:block/hollow_transformation_log_horizontal" + }, + "axis=z,variant=moss": { + "model": "twilightforest:block/hollow_transformation_log_horizontal_moss" + }, + "axis=z,variant=moss_and_grass": { + "model": "twilightforest:block/hollow_transformation_log_horizontal_moss_grass" + }, + "axis=z,variant=snow": { + "model": "twilightforest:block/hollow_transformation_log_horizontal_snow" + }, + "axis=z,variant=waterlogged": { + "model": "twilightforest:block/hollow_transformation_log_horizontal" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/hollow_transformation_log_vertical.json b/src/generated/resources/assets/twilightforest/blockstates/hollow_transformation_log_vertical.json new file mode 100644 index 0000000000..8f68343c0c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/hollow_transformation_log_vertical.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/hollow_transformation_log_vertical" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/hollow_twilight_oak_log_climbable.json b/src/generated/resources/assets/twilightforest/blockstates/hollow_twilight_oak_log_climbable.json new file mode 100644 index 0000000000..711b0e1af8 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/hollow_twilight_oak_log_climbable.json @@ -0,0 +1,61 @@ +{ + "variants": { + "facing=east,variant=ladder": { + "model": "twilightforest:block/hollow_twilight_oak_log_climbable_ladder", + "uvlock": true, + "y": 270 + }, + "facing=east,variant=ladder_waterlogged": { + "model": "twilightforest:block/hollow_twilight_oak_log_climbable_ladder", + "uvlock": true, + "y": 270 + }, + "facing=east,variant=vine": { + "model": "twilightforest:block/hollow_twilight_oak_log_climbable_vine", + "uvlock": true, + "y": 270 + }, + "facing=north,variant=ladder": { + "model": "twilightforest:block/hollow_twilight_oak_log_climbable_ladder", + "uvlock": true, + "y": 180 + }, + "facing=north,variant=ladder_waterlogged": { + "model": "twilightforest:block/hollow_twilight_oak_log_climbable_ladder", + "uvlock": true, + "y": 180 + }, + "facing=north,variant=vine": { + "model": "twilightforest:block/hollow_twilight_oak_log_climbable_vine", + "uvlock": true, + "y": 180 + }, + "facing=south,variant=ladder": { + "model": "twilightforest:block/hollow_twilight_oak_log_climbable_ladder", + "uvlock": true + }, + "facing=south,variant=ladder_waterlogged": { + "model": "twilightforest:block/hollow_twilight_oak_log_climbable_ladder", + "uvlock": true + }, + "facing=south,variant=vine": { + "model": "twilightforest:block/hollow_twilight_oak_log_climbable_vine", + "uvlock": true + }, + "facing=west,variant=ladder": { + "model": "twilightforest:block/hollow_twilight_oak_log_climbable_ladder", + "uvlock": true, + "y": 90 + }, + "facing=west,variant=ladder_waterlogged": { + "model": "twilightforest:block/hollow_twilight_oak_log_climbable_ladder", + "uvlock": true, + "y": 90 + }, + "facing=west,variant=vine": { + "model": "twilightforest:block/hollow_twilight_oak_log_climbable_vine", + "uvlock": true, + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/hollow_twilight_oak_log_horizontal.json b/src/generated/resources/assets/twilightforest/blockstates/hollow_twilight_oak_log_horizontal.json new file mode 100644 index 0000000000..a00df252e3 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/hollow_twilight_oak_log_horizontal.json @@ -0,0 +1,39 @@ +{ + "variants": { + "axis=x,variant=empty": { + "model": "twilightforest:block/hollow_twilight_oak_log_horizontal", + "y": 90 + }, + "axis=x,variant=moss": { + "model": "twilightforest:block/hollow_twilight_oak_log_horizontal_moss", + "y": 90 + }, + "axis=x,variant=moss_and_grass": { + "model": "twilightforest:block/hollow_twilight_oak_log_horizontal_moss_grass", + "y": 90 + }, + "axis=x,variant=snow": { + "model": "twilightforest:block/hollow_twilight_oak_log_horizontal_snow", + "y": 90 + }, + "axis=x,variant=waterlogged": { + "model": "twilightforest:block/hollow_twilight_oak_log_horizontal", + "y": 90 + }, + "axis=z,variant=empty": { + "model": "twilightforest:block/hollow_twilight_oak_log_horizontal" + }, + "axis=z,variant=moss": { + "model": "twilightforest:block/hollow_twilight_oak_log_horizontal_moss" + }, + "axis=z,variant=moss_and_grass": { + "model": "twilightforest:block/hollow_twilight_oak_log_horizontal_moss_grass" + }, + "axis=z,variant=snow": { + "model": "twilightforest:block/hollow_twilight_oak_log_horizontal_snow" + }, + "axis=z,variant=waterlogged": { + "model": "twilightforest:block/hollow_twilight_oak_log_horizontal" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/hollow_twilight_oak_log_vertical.json b/src/generated/resources/assets/twilightforest/blockstates/hollow_twilight_oak_log_vertical.json new file mode 100644 index 0000000000..dba4dd7d20 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/hollow_twilight_oak_log_vertical.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/hollow_twilight_oak_log_vertical" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/hollow_vangrove_log_climbable.json b/src/generated/resources/assets/twilightforest/blockstates/hollow_vangrove_log_climbable.json new file mode 100644 index 0000000000..45e78eb215 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/hollow_vangrove_log_climbable.json @@ -0,0 +1,61 @@ +{ + "variants": { + "facing=east,variant=ladder": { + "model": "twilightforest:block/hollow_vangrove_log_climbable_ladder", + "uvlock": true, + "y": 270 + }, + "facing=east,variant=ladder_waterlogged": { + "model": "twilightforest:block/hollow_vangrove_log_climbable_ladder", + "uvlock": true, + "y": 270 + }, + "facing=east,variant=vine": { + "model": "twilightforest:block/hollow_vangrove_log_climbable_vine", + "uvlock": true, + "y": 270 + }, + "facing=north,variant=ladder": { + "model": "twilightforest:block/hollow_vangrove_log_climbable_ladder", + "uvlock": true, + "y": 180 + }, + "facing=north,variant=ladder_waterlogged": { + "model": "twilightforest:block/hollow_vangrove_log_climbable_ladder", + "uvlock": true, + "y": 180 + }, + "facing=north,variant=vine": { + "model": "twilightforest:block/hollow_vangrove_log_climbable_vine", + "uvlock": true, + "y": 180 + }, + "facing=south,variant=ladder": { + "model": "twilightforest:block/hollow_vangrove_log_climbable_ladder", + "uvlock": true + }, + "facing=south,variant=ladder_waterlogged": { + "model": "twilightforest:block/hollow_vangrove_log_climbable_ladder", + "uvlock": true + }, + "facing=south,variant=vine": { + "model": "twilightforest:block/hollow_vangrove_log_climbable_vine", + "uvlock": true + }, + "facing=west,variant=ladder": { + "model": "twilightforest:block/hollow_vangrove_log_climbable_ladder", + "uvlock": true, + "y": 90 + }, + "facing=west,variant=ladder_waterlogged": { + "model": "twilightforest:block/hollow_vangrove_log_climbable_ladder", + "uvlock": true, + "y": 90 + }, + "facing=west,variant=vine": { + "model": "twilightforest:block/hollow_vangrove_log_climbable_vine", + "uvlock": true, + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/hollow_vangrove_log_horizontal.json b/src/generated/resources/assets/twilightforest/blockstates/hollow_vangrove_log_horizontal.json new file mode 100644 index 0000000000..42ba0e6c20 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/hollow_vangrove_log_horizontal.json @@ -0,0 +1,39 @@ +{ + "variants": { + "axis=x,variant=empty": { + "model": "twilightforest:block/hollow_vangrove_log_horizontal", + "y": 90 + }, + "axis=x,variant=moss": { + "model": "twilightforest:block/hollow_vangrove_log_horizontal_moss", + "y": 90 + }, + "axis=x,variant=moss_and_grass": { + "model": "twilightforest:block/hollow_vangrove_log_horizontal_moss_grass", + "y": 90 + }, + "axis=x,variant=snow": { + "model": "twilightforest:block/hollow_vangrove_log_horizontal_snow", + "y": 90 + }, + "axis=x,variant=waterlogged": { + "model": "twilightforest:block/hollow_vangrove_log_horizontal", + "y": 90 + }, + "axis=z,variant=empty": { + "model": "twilightforest:block/hollow_vangrove_log_horizontal" + }, + "axis=z,variant=moss": { + "model": "twilightforest:block/hollow_vangrove_log_horizontal_moss" + }, + "axis=z,variant=moss_and_grass": { + "model": "twilightforest:block/hollow_vangrove_log_horizontal_moss_grass" + }, + "axis=z,variant=snow": { + "model": "twilightforest:block/hollow_vangrove_log_horizontal_snow" + }, + "axis=z,variant=waterlogged": { + "model": "twilightforest:block/hollow_vangrove_log_horizontal" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/hollow_vangrove_log_vertical.json b/src/generated/resources/assets/twilightforest/blockstates/hollow_vangrove_log_vertical.json new file mode 100644 index 0000000000..118ea9b13c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/hollow_vangrove_log_vertical.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/hollow_vangrove_log_vertical" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/hollow_warped_stem_climbable.json b/src/generated/resources/assets/twilightforest/blockstates/hollow_warped_stem_climbable.json new file mode 100644 index 0000000000..ffb7cac164 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/hollow_warped_stem_climbable.json @@ -0,0 +1,61 @@ +{ + "variants": { + "facing=east,variant=ladder": { + "model": "twilightforest:block/hollow_warped_stem_climbable_ladder", + "uvlock": true, + "y": 270 + }, + "facing=east,variant=ladder_waterlogged": { + "model": "twilightforest:block/hollow_warped_stem_climbable_ladder", + "uvlock": true, + "y": 270 + }, + "facing=east,variant=vine": { + "model": "twilightforest:block/hollow_warped_stem_climbable_vine", + "uvlock": true, + "y": 270 + }, + "facing=north,variant=ladder": { + "model": "twilightforest:block/hollow_warped_stem_climbable_ladder", + "uvlock": true, + "y": 180 + }, + "facing=north,variant=ladder_waterlogged": { + "model": "twilightforest:block/hollow_warped_stem_climbable_ladder", + "uvlock": true, + "y": 180 + }, + "facing=north,variant=vine": { + "model": "twilightforest:block/hollow_warped_stem_climbable_vine", + "uvlock": true, + "y": 180 + }, + "facing=south,variant=ladder": { + "model": "twilightforest:block/hollow_warped_stem_climbable_ladder", + "uvlock": true + }, + "facing=south,variant=ladder_waterlogged": { + "model": "twilightforest:block/hollow_warped_stem_climbable_ladder", + "uvlock": true + }, + "facing=south,variant=vine": { + "model": "twilightforest:block/hollow_warped_stem_climbable_vine", + "uvlock": true + }, + "facing=west,variant=ladder": { + "model": "twilightforest:block/hollow_warped_stem_climbable_ladder", + "uvlock": true, + "y": 90 + }, + "facing=west,variant=ladder_waterlogged": { + "model": "twilightforest:block/hollow_warped_stem_climbable_ladder", + "uvlock": true, + "y": 90 + }, + "facing=west,variant=vine": { + "model": "twilightforest:block/hollow_warped_stem_climbable_vine", + "uvlock": true, + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/hollow_warped_stem_horizontal.json b/src/generated/resources/assets/twilightforest/blockstates/hollow_warped_stem_horizontal.json new file mode 100644 index 0000000000..a5efc9ab4a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/hollow_warped_stem_horizontal.json @@ -0,0 +1,39 @@ +{ + "variants": { + "axis=x,variant=empty": { + "model": "twilightforest:block/hollow_warped_stem_horizontal", + "y": 90 + }, + "axis=x,variant=moss": { + "model": "twilightforest:block/hollow_warped_stem_horizontal_moss", + "y": 90 + }, + "axis=x,variant=moss_and_grass": { + "model": "twilightforest:block/hollow_warped_stem_horizontal_moss_grass", + "y": 90 + }, + "axis=x,variant=snow": { + "model": "twilightforest:block/hollow_warped_stem_horizontal_snow", + "y": 90 + }, + "axis=x,variant=waterlogged": { + "model": "twilightforest:block/hollow_warped_stem_horizontal", + "y": 90 + }, + "axis=z,variant=empty": { + "model": "twilightforest:block/hollow_warped_stem_horizontal" + }, + "axis=z,variant=moss": { + "model": "twilightforest:block/hollow_warped_stem_horizontal_moss" + }, + "axis=z,variant=moss_and_grass": { + "model": "twilightforest:block/hollow_warped_stem_horizontal_moss_grass" + }, + "axis=z,variant=snow": { + "model": "twilightforest:block/hollow_warped_stem_horizontal_snow" + }, + "axis=z,variant=waterlogged": { + "model": "twilightforest:block/hollow_warped_stem_horizontal" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/hollow_warped_stem_vertical.json b/src/generated/resources/assets/twilightforest/blockstates/hollow_warped_stem_vertical.json new file mode 100644 index 0000000000..4ac94b82f7 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/hollow_warped_stem_vertical.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/hollow_warped_stem_vertical" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/huge_lily_pad.json b/src/generated/resources/assets/twilightforest/blockstates/huge_lily_pad.json new file mode 100644 index 0000000000..bcf68baf2e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/huge_lily_pad.json @@ -0,0 +1,64 @@ +{ + "variants": { + "facing=east,piece=ne": { + "model": "twilightforest:block/huge_lily_pad_1", + "y": 90 + }, + "facing=east,piece=nw": { + "model": "twilightforest:block/huge_lily_pad_2", + "y": 90 + }, + "facing=east,piece=se": { + "model": "twilightforest:block/huge_lily_pad_0", + "y": 90 + }, + "facing=east,piece=sw": { + "model": "twilightforest:block/huge_lily_pad_3", + "y": 90 + }, + "facing=north,piece=ne": { + "model": "twilightforest:block/huge_lily_pad_0" + }, + "facing=north,piece=nw": { + "model": "twilightforest:block/huge_lily_pad_1" + }, + "facing=north,piece=se": { + "model": "twilightforest:block/huge_lily_pad_3" + }, + "facing=north,piece=sw": { + "model": "twilightforest:block/huge_lily_pad_2" + }, + "facing=south,piece=ne": { + "model": "twilightforest:block/huge_lily_pad_2", + "y": 180 + }, + "facing=south,piece=nw": { + "model": "twilightforest:block/huge_lily_pad_3", + "y": 180 + }, + "facing=south,piece=se": { + "model": "twilightforest:block/huge_lily_pad_1", + "y": 180 + }, + "facing=south,piece=sw": { + "model": "twilightforest:block/huge_lily_pad_0", + "y": 180 + }, + "facing=west,piece=ne": { + "model": "twilightforest:block/huge_lily_pad_3", + "y": 270 + }, + "facing=west,piece=nw": { + "model": "twilightforest:block/huge_lily_pad_0", + "y": 270 + }, + "facing=west,piece=se": { + "model": "twilightforest:block/huge_lily_pad_2", + "y": 270 + }, + "facing=west,piece=sw": { + "model": "twilightforest:block/huge_lily_pad_1", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/huge_mushgloom.json b/src/generated/resources/assets/twilightforest/blockstates/huge_mushgloom.json new file mode 100644 index 0000000000..c60a5c032f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/huge_mushgloom.json @@ -0,0 +1,120 @@ +{ + "multipart": [ + { + "apply": { + "model": "twilightforest:block/huge_mushgloom_inside" + }, + "when": { + "north": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/huge_mushgloom_outside" + }, + "when": { + "north": "true" + } + }, + { + "apply": { + "model": "twilightforest:block/huge_mushgloom_inside", + "uvlock": true, + "y": 180 + }, + "when": { + "south": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/huge_mushgloom_outside", + "uvlock": true, + "y": 180 + }, + "when": { + "south": "true" + } + }, + { + "apply": { + "model": "twilightforest:block/huge_mushgloom_inside", + "uvlock": true, + "y": 270 + }, + "when": { + "west": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/huge_mushgloom_outside", + "uvlock": true, + "y": 270 + }, + "when": { + "west": "true" + } + }, + { + "apply": { + "model": "twilightforest:block/huge_mushgloom_inside", + "uvlock": true, + "y": 90 + }, + "when": { + "east": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/huge_mushgloom_outside", + "uvlock": true, + "y": 90 + }, + "when": { + "east": "true" + } + }, + { + "apply": { + "model": "twilightforest:block/huge_mushgloom_inside", + "uvlock": true, + "x": 270 + }, + "when": { + "up": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/huge_mushgloom_outside", + "uvlock": true, + "x": 270 + }, + "when": { + "up": "true" + } + }, + { + "apply": { + "model": "twilightforest:block/huge_mushgloom_inside", + "uvlock": true, + "x": 90 + }, + "when": { + "down": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/huge_mushgloom_outside", + "uvlock": true, + "x": 90 + }, + "when": { + "down": "true" + } + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/huge_mushgloom_stem.json b/src/generated/resources/assets/twilightforest/blockstates/huge_mushgloom_stem.json new file mode 100644 index 0000000000..2ab4e9720c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/huge_mushgloom_stem.json @@ -0,0 +1,120 @@ +{ + "multipart": [ + { + "apply": { + "model": "twilightforest:block/huge_mushgloom_stem_inside" + }, + "when": { + "north": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/huge_mushgloom_stem_outside" + }, + "when": { + "north": "true" + } + }, + { + "apply": { + "model": "twilightforest:block/huge_mushgloom_stem_inside", + "uvlock": true, + "y": 180 + }, + "when": { + "south": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/huge_mushgloom_stem_outside", + "uvlock": true, + "y": 180 + }, + "when": { + "south": "true" + } + }, + { + "apply": { + "model": "twilightforest:block/huge_mushgloom_stem_inside", + "uvlock": true, + "y": 270 + }, + "when": { + "west": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/huge_mushgloom_stem_outside", + "uvlock": true, + "y": 270 + }, + "when": { + "west": "true" + } + }, + { + "apply": { + "model": "twilightforest:block/huge_mushgloom_stem_inside", + "uvlock": true, + "y": 90 + }, + "when": { + "east": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/huge_mushgloom_stem_outside", + "uvlock": true, + "y": 90 + }, + "when": { + "east": "true" + } + }, + { + "apply": { + "model": "twilightforest:block/huge_mushgloom_stem_inside", + "uvlock": true, + "x": 270 + }, + "when": { + "up": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/huge_mushgloom_stem_outside", + "uvlock": true, + "x": 270 + }, + "when": { + "up": "true" + } + }, + { + "apply": { + "model": "twilightforest:block/huge_mushgloom_stem_inside", + "uvlock": true, + "x": 90 + }, + "when": { + "down": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/huge_mushgloom_stem_outside", + "uvlock": true, + "x": 90 + }, + "when": { + "down": "true" + } + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/huge_stalk.json b/src/generated/resources/assets/twilightforest/blockstates/huge_stalk.json new file mode 100644 index 0000000000..1850d54be6 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/huge_stalk.json @@ -0,0 +1,16 @@ +{ + "variants": { + "axis=x": { + "model": "twilightforest:block/huge_stalk_horizontal", + "x": 90, + "y": 90 + }, + "axis=y": { + "model": "twilightforest:block/huge_stalk" + }, + "axis=z": { + "model": "twilightforest:block/huge_stalk_horizontal", + "x": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/huge_water_lily.json b/src/generated/resources/assets/twilightforest/blockstates/huge_water_lily.json new file mode 100644 index 0000000000..1f724dd5a8 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/huge_water_lily.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/huge_water_lily" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/hydra_boss_spawner.json b/src/generated/resources/assets/twilightforest/blockstates/hydra_boss_spawner.json new file mode 100644 index 0000000000..fab51f8dc9 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/hydra_boss_spawner.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/boss_spawner" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/hydra_trophy.json b/src/generated/resources/assets/twilightforest/blockstates/hydra_trophy.json new file mode 100644 index 0000000000..3951e3eea5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/hydra_trophy.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "minecraft:block/skull" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/hydra_wall_trophy.json b/src/generated/resources/assets/twilightforest/blockstates/hydra_wall_trophy.json new file mode 100644 index 0000000000..3951e3eea5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/hydra_wall_trophy.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "minecraft:block/skull" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/infested_towerwood.json b/src/generated/resources/assets/twilightforest/blockstates/infested_towerwood.json new file mode 100644 index 0000000000..fa1fe3eafc --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/infested_towerwood.json @@ -0,0 +1,12 @@ +{ + "variants": { + "": [ + { + "model": "twilightforest:block/infested_towerwood" + }, + { + "model": "twilightforest:block/infested_towerwood_flipped" + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/iron_ladder.json b/src/generated/resources/assets/twilightforest/blockstates/iron_ladder.json new file mode 100644 index 0000000000..d5c5bb58dc --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/iron_ladder.json @@ -0,0 +1,160 @@ +{ + "multipart": [ + { + "apply": { + "model": "twilightforest:block/iron_ladder_left" + }, + "when": { + "facing": "north", + "left": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/iron_ladder_left_connection" + }, + "when": { + "facing": "north", + "left": "true" + } + }, + { + "apply": { + "model": "twilightforest:block/iron_ladder_right" + }, + "when": { + "facing": "north", + "right": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/iron_ladder_right_connection" + }, + "when": { + "facing": "north", + "right": "true" + } + }, + { + "apply": { + "model": "twilightforest:block/iron_ladder_left", + "y": 90 + }, + "when": { + "facing": "east", + "left": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/iron_ladder_left_connection", + "y": 90 + }, + "when": { + "facing": "east", + "left": "true" + } + }, + { + "apply": { + "model": "twilightforest:block/iron_ladder_right", + "y": 90 + }, + "when": { + "facing": "east", + "right": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/iron_ladder_right_connection", + "y": 90 + }, + "when": { + "facing": "east", + "right": "true" + } + }, + { + "apply": { + "model": "twilightforest:block/iron_ladder_left", + "y": 180 + }, + "when": { + "facing": "south", + "left": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/iron_ladder_left_connection", + "y": 180 + }, + "when": { + "facing": "south", + "left": "true" + } + }, + { + "apply": { + "model": "twilightforest:block/iron_ladder_right", + "y": 180 + }, + "when": { + "facing": "south", + "right": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/iron_ladder_right_connection", + "y": 180 + }, + "when": { + "facing": "south", + "right": "true" + } + }, + { + "apply": { + "model": "twilightforest:block/iron_ladder_left", + "y": 270 + }, + "when": { + "facing": "west", + "left": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/iron_ladder_left_connection", + "y": 270 + }, + "when": { + "facing": "west", + "left": "true" + } + }, + { + "apply": { + "model": "twilightforest:block/iron_ladder_right", + "y": 270 + }, + "when": { + "facing": "west", + "right": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/iron_ladder_right_connection", + "y": 270 + }, + "when": { + "facing": "west", + "right": "true" + } + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/ironwood_block.json b/src/generated/resources/assets/twilightforest/blockstates/ironwood_block.json new file mode 100644 index 0000000000..033537c87a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/ironwood_block.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/ironwood_block" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/jungle_banister.json b/src/generated/resources/assets/twilightforest/blockstates/jungle_banister.json new file mode 100644 index 0000000000..4a2f491715 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/jungle_banister.json @@ -0,0 +1,94 @@ +{ + "variants": { + "extended=false,facing=east,shape=connected": { + "model": "twilightforest:block/wood/banister/jungle/jungle_banister_connected", + "y": 270 + }, + "extended=false,facing=east,shape=short": { + "model": "twilightforest:block/wood/banister/jungle/jungle_banister_short", + "y": 270 + }, + "extended=false,facing=east,shape=tall": { + "model": "twilightforest:block/wood/banister/jungle/jungle_banister_tall", + "y": 270 + }, + "extended=false,facing=north,shape=connected": { + "model": "twilightforest:block/wood/banister/jungle/jungle_banister_connected", + "y": 180 + }, + "extended=false,facing=north,shape=short": { + "model": "twilightforest:block/wood/banister/jungle/jungle_banister_short", + "y": 180 + }, + "extended=false,facing=north,shape=tall": { + "model": "twilightforest:block/wood/banister/jungle/jungle_banister_tall", + "y": 180 + }, + "extended=false,facing=south,shape=connected": { + "model": "twilightforest:block/wood/banister/jungle/jungle_banister_connected" + }, + "extended=false,facing=south,shape=short": { + "model": "twilightforest:block/wood/banister/jungle/jungle_banister_short" + }, + "extended=false,facing=south,shape=tall": { + "model": "twilightforest:block/wood/banister/jungle/jungle_banister_tall" + }, + "extended=false,facing=west,shape=connected": { + "model": "twilightforest:block/wood/banister/jungle/jungle_banister_connected", + "y": 90 + }, + "extended=false,facing=west,shape=short": { + "model": "twilightforest:block/wood/banister/jungle/jungle_banister_short", + "y": 90 + }, + "extended=false,facing=west,shape=tall": { + "model": "twilightforest:block/wood/banister/jungle/jungle_banister_tall", + "y": 90 + }, + "extended=true,facing=east,shape=connected": { + "model": "twilightforest:block/wood/banister/jungle/jungle_banister_connected_extended", + "y": 270 + }, + "extended=true,facing=east,shape=short": { + "model": "twilightforest:block/wood/banister/jungle/jungle_banister_short_extended", + "y": 270 + }, + "extended=true,facing=east,shape=tall": { + "model": "twilightforest:block/wood/banister/jungle/jungle_banister_tall_extended", + "y": 270 + }, + "extended=true,facing=north,shape=connected": { + "model": "twilightforest:block/wood/banister/jungle/jungle_banister_connected_extended", + "y": 180 + }, + "extended=true,facing=north,shape=short": { + "model": "twilightforest:block/wood/banister/jungle/jungle_banister_short_extended", + "y": 180 + }, + "extended=true,facing=north,shape=tall": { + "model": "twilightforest:block/wood/banister/jungle/jungle_banister_tall_extended", + "y": 180 + }, + "extended=true,facing=south,shape=connected": { + "model": "twilightforest:block/wood/banister/jungle/jungle_banister_connected_extended" + }, + "extended=true,facing=south,shape=short": { + "model": "twilightforest:block/wood/banister/jungle/jungle_banister_short_extended" + }, + "extended=true,facing=south,shape=tall": { + "model": "twilightforest:block/wood/banister/jungle/jungle_banister_tall_extended" + }, + "extended=true,facing=west,shape=connected": { + "model": "twilightforest:block/wood/banister/jungle/jungle_banister_connected_extended", + "y": 90 + }, + "extended=true,facing=west,shape=short": { + "model": "twilightforest:block/wood/banister/jungle/jungle_banister_short_extended", + "y": 90 + }, + "extended=true,facing=west,shape=tall": { + "model": "twilightforest:block/wood/banister/jungle/jungle_banister_tall_extended", + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/keepsake_casket.json b/src/generated/resources/assets/twilightforest/blockstates/keepsake_casket.json new file mode 100644 index 0000000000..662ebf9f75 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/keepsake_casket.json @@ -0,0 +1,22 @@ +{ + "variants": { + "multilogged=air": { + "model": "twilightforest:block/keepsake_casket" + }, + "multilogged=basalt": { + "model": "twilightforest:block/casket_basalt" + }, + "multilogged=lava": { + "model": "twilightforest:block/keepsake_casket" + }, + "multilogged=obsidian": { + "model": "twilightforest:block/casket_obsidian" + }, + "multilogged=stone": { + "model": "twilightforest:block/casket_stone" + }, + "multilogged=water": { + "model": "twilightforest:block/keepsake_casket" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/knight_phantom_boss_spawner.json b/src/generated/resources/assets/twilightforest/blockstates/knight_phantom_boss_spawner.json new file mode 100644 index 0000000000..fab51f8dc9 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/knight_phantom_boss_spawner.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/boss_spawner" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/knight_phantom_trophy.json b/src/generated/resources/assets/twilightforest/blockstates/knight_phantom_trophy.json new file mode 100644 index 0000000000..3951e3eea5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/knight_phantom_trophy.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "minecraft:block/skull" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/knight_phantom_wall_trophy.json b/src/generated/resources/assets/twilightforest/blockstates/knight_phantom_wall_trophy.json new file mode 100644 index 0000000000..3951e3eea5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/knight_phantom_wall_trophy.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "minecraft:block/skull" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/knightmetal_block.json b/src/generated/resources/assets/twilightforest/blockstates/knightmetal_block.json new file mode 100644 index 0000000000..5eeff7b670 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/knightmetal_block.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/knightmetal_block" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/lich_boss_spawner.json b/src/generated/resources/assets/twilightforest/blockstates/lich_boss_spawner.json new file mode 100644 index 0000000000..fab51f8dc9 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/lich_boss_spawner.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/boss_spawner" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/lich_tower_miniature_structure.json b/src/generated/resources/assets/twilightforest/blockstates/lich_tower_miniature_structure.json new file mode 100644 index 0000000000..bb134420f7 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/lich_tower_miniature_structure.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/miniature/lich_tower" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/lich_trophy.json b/src/generated/resources/assets/twilightforest/blockstates/lich_trophy.json new file mode 100644 index 0000000000..3951e3eea5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/lich_trophy.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "minecraft:block/skull" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/lich_wall_trophy.json b/src/generated/resources/assets/twilightforest/blockstates/lich_wall_trophy.json new file mode 100644 index 0000000000..3951e3eea5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/lich_wall_trophy.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "minecraft:block/skull" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/liveroot_block.json b/src/generated/resources/assets/twilightforest/blockstates/liveroot_block.json new file mode 100644 index 0000000000..cffdcd4355 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/liveroot_block.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/liveroot_block" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/locked_vanishing_block.json b/src/generated/resources/assets/twilightforest/blockstates/locked_vanishing_block.json new file mode 100644 index 0000000000..220ee44423 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/locked_vanishing_block.json @@ -0,0 +1,10 @@ +{ + "variants": { + "locked=false": { + "model": "twilightforest:block/locked_vanishing_block_unlocked" + }, + "locked=true": { + "model": "twilightforest:block/locked_vanishing_block" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/mangrove_banister.json b/src/generated/resources/assets/twilightforest/blockstates/mangrove_banister.json new file mode 100644 index 0000000000..92ea0133d7 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/mangrove_banister.json @@ -0,0 +1,460 @@ +{ + "variants": { + "extended=false,facing=east,shape=connected": [ + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_connected", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_connected_1", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_connected_2", + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_connected_3", + "y": 270 + } + ], + "extended=false,facing=east,shape=short": [ + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_short", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_short_1", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_short_2", + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_short_3", + "y": 270 + } + ], + "extended=false,facing=east,shape=tall": [ + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_tall", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_tall_1", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_tall_2", + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_tall_3", + "y": 270 + } + ], + "extended=false,facing=north,shape=connected": [ + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_connected", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_connected_1", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_connected_2", + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_connected_3", + "y": 180 + } + ], + "extended=false,facing=north,shape=short": [ + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_short", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_short_1", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_short_2", + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_short_3", + "y": 180 + } + ], + "extended=false,facing=north,shape=tall": [ + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_tall", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_tall_1", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_tall_2", + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_tall_3", + "y": 180 + } + ], + "extended=false,facing=south,shape=connected": [ + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_connected", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_connected_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_connected_2" + }, + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_connected_3" + } + ], + "extended=false,facing=south,shape=short": [ + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_short", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_short_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_short_2" + }, + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_short_3" + } + ], + "extended=false,facing=south,shape=tall": [ + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_tall", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_tall_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_tall_2" + }, + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_tall_3" + } + ], + "extended=false,facing=west,shape=connected": [ + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_connected", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_connected_1", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_connected_2", + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_connected_3", + "y": 90 + } + ], + "extended=false,facing=west,shape=short": [ + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_short", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_short_1", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_short_2", + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_short_3", + "y": 90 + } + ], + "extended=false,facing=west,shape=tall": [ + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_tall", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_tall_1", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_tall_2", + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_tall_3", + "y": 90 + } + ], + "extended=true,facing=east,shape=connected": [ + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_connected_extended", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_connected_extended_1", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_connected_extended_2", + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_connected_extended_3", + "y": 270 + } + ], + "extended=true,facing=east,shape=short": [ + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_short_extended", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_short_extended_1", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_short_extended_2", + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_short_extended_3", + "y": 270 + } + ], + "extended=true,facing=east,shape=tall": [ + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_tall_extended", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_tall_extended_1", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_tall_extended_2", + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_tall_extended_3", + "y": 270 + } + ], + "extended=true,facing=north,shape=connected": [ + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_connected_extended", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_connected_extended_1", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_connected_extended_2", + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_connected_extended_3", + "y": 180 + } + ], + "extended=true,facing=north,shape=short": [ + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_short_extended", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_short_extended_1", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_short_extended_2", + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_short_extended_3", + "y": 180 + } + ], + "extended=true,facing=north,shape=tall": [ + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_tall_extended", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_tall_extended_1", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_tall_extended_2", + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_tall_extended_3", + "y": 180 + } + ], + "extended=true,facing=south,shape=connected": [ + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_connected_extended", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_connected_extended_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_connected_extended_2" + }, + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_connected_extended_3" + } + ], + "extended=true,facing=south,shape=short": [ + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_short_extended", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_short_extended_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_short_extended_2" + }, + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_short_extended_3" + } + ], + "extended=true,facing=south,shape=tall": [ + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_tall_extended", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_tall_extended_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_tall_extended_2" + }, + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_tall_extended_3" + } + ], + "extended=true,facing=west,shape=connected": [ + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_connected_extended", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_connected_extended_1", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_connected_extended_2", + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_connected_extended_3", + "y": 90 + } + ], + "extended=true,facing=west,shape=short": [ + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_short_extended", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_short_extended_1", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_short_extended_2", + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_short_extended_3", + "y": 90 + } + ], + "extended=true,facing=west,shape=tall": [ + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_tall_extended", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_tall_extended_1", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_tall_extended_2", + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/mangrove/mangrove_banister_tall_extended_3", + "y": 90 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/mangrove_button.json b/src/generated/resources/assets/twilightforest/blockstates/mangrove_button.json new file mode 100644 index 0000000000..7766751b3b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/mangrove_button.json @@ -0,0 +1,556 @@ +{ + "variants": { + "face=ceiling,facing=east,powered=false": [ + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button", + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_1", + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_2", + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_3", + "x": 180, + "y": 270 + } + ], + "face=ceiling,facing=east,powered=true": [ + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_pressed", + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_pressed_1", + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_pressed_2", + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_pressed_3", + "x": 180, + "y": 270 + } + ], + "face=ceiling,facing=north,powered=false": [ + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button", + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_1", + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_2", + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_3", + "x": 180, + "y": 180 + } + ], + "face=ceiling,facing=north,powered=true": [ + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_pressed", + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_pressed_1", + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_pressed_2", + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_pressed_3", + "x": 180, + "y": 180 + } + ], + "face=ceiling,facing=south,powered=false": [ + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button", + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_1", + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_2", + "x": 180 + }, + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_3", + "x": 180 + } + ], + "face=ceiling,facing=south,powered=true": [ + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_pressed", + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_pressed_1", + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_pressed_2", + "x": 180 + }, + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_pressed_3", + "x": 180 + } + ], + "face=ceiling,facing=west,powered=false": [ + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button", + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_1", + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_2", + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_3", + "x": 180, + "y": 90 + } + ], + "face=ceiling,facing=west,powered=true": [ + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_pressed", + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_pressed_1", + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_pressed_2", + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_pressed_3", + "x": 180, + "y": 90 + } + ], + "face=floor,facing=east,powered=false": [ + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_1", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_2", + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_3", + "y": 90 + } + ], + "face=floor,facing=east,powered=true": [ + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_pressed", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_pressed_1", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_pressed_2", + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_pressed_3", + "y": 90 + } + ], + "face=floor,facing=north,powered=false": [ + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_2" + }, + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_3" + } + ], + "face=floor,facing=north,powered=true": [ + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_pressed", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_pressed_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_pressed_2" + }, + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_pressed_3" + } + ], + "face=floor,facing=south,powered=false": [ + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_1", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_2", + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_3", + "y": 180 + } + ], + "face=floor,facing=south,powered=true": [ + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_pressed", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_pressed_1", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_pressed_2", + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_pressed_3", + "y": 180 + } + ], + "face=floor,facing=west,powered=false": [ + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_1", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_2", + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_3", + "y": 270 + } + ], + "face=floor,facing=west,powered=true": [ + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_pressed", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_pressed_1", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_pressed_2", + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_pressed_3", + "y": 270 + } + ], + "face=wall,facing=east,powered=false": [ + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_1", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_2", + "uvlock": true, + "x": 90, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_3", + "uvlock": true, + "x": 90, + "y": 90 + } + ], + "face=wall,facing=east,powered=true": [ + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_pressed", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_pressed_1", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_pressed_2", + "uvlock": true, + "x": 90, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_pressed_3", + "uvlock": true, + "x": 90, + "y": 90 + } + ], + "face=wall,facing=north,powered=false": [ + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button", + "uvlock": true, + "weight": 10, + "x": 90 + }, + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_1", + "uvlock": true, + "weight": 10, + "x": 90 + }, + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_2", + "uvlock": true, + "x": 90 + }, + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_3", + "uvlock": true, + "x": 90 + } + ], + "face=wall,facing=north,powered=true": [ + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_pressed", + "uvlock": true, + "weight": 10, + "x": 90 + }, + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_pressed_1", + "uvlock": true, + "weight": 10, + "x": 90 + }, + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_pressed_2", + "uvlock": true, + "x": 90 + }, + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_pressed_3", + "uvlock": true, + "x": 90 + } + ], + "face=wall,facing=south,powered=false": [ + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_1", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_2", + "uvlock": true, + "x": 90, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_3", + "uvlock": true, + "x": 90, + "y": 180 + } + ], + "face=wall,facing=south,powered=true": [ + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_pressed", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_pressed_1", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_pressed_2", + "uvlock": true, + "x": 90, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_pressed_3", + "uvlock": true, + "x": 90, + "y": 180 + } + ], + "face=wall,facing=west,powered=false": [ + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_1", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_2", + "uvlock": true, + "x": 90, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_3", + "uvlock": true, + "x": 90, + "y": 270 + } + ], + "face=wall,facing=west,powered=true": [ + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_pressed", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_pressed_1", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_pressed_2", + "uvlock": true, + "x": 90, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/mangrove/mangrove_button_pressed_3", + "uvlock": true, + "x": 90, + "y": 270 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/mangrove_chest.json b/src/generated/resources/assets/twilightforest/blockstates/mangrove_chest.json new file mode 100644 index 0000000000..9b926aad8d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/mangrove_chest.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/mangrove_chest" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/mangrove_door.json b/src/generated/resources/assets/twilightforest/blockstates/mangrove_door.json new file mode 100644 index 0000000000..9e63986fce --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/mangrove_door.json @@ -0,0 +1,124 @@ +{ + "variants": { + "facing=east,half=lower,hinge=left,open=false": { + "model": "twilightforest:block/wood/door/mangrove/mangrove_door_door_bottom_left" + }, + "facing=east,half=lower,hinge=left,open=true": { + "model": "twilightforest:block/wood/door/mangrove/mangrove_door_door_bottom_left_open", + "y": 90 + }, + "facing=east,half=lower,hinge=right,open=false": { + "model": "twilightforest:block/wood/door/mangrove/mangrove_door_door_bottom_right" + }, + "facing=east,half=lower,hinge=right,open=true": { + "model": "twilightforest:block/wood/door/mangrove/mangrove_door_door_bottom_right_open", + "y": 270 + }, + "facing=east,half=upper,hinge=left,open=false": { + "model": "twilightforest:block/wood/door/mangrove/mangrove_door_door_top_left" + }, + "facing=east,half=upper,hinge=left,open=true": { + "model": "twilightforest:block/wood/door/mangrove/mangrove_door_door_top_left_open", + "y": 90 + }, + "facing=east,half=upper,hinge=right,open=false": { + "model": "twilightforest:block/wood/door/mangrove/mangrove_door_door_top_right" + }, + "facing=east,half=upper,hinge=right,open=true": { + "model": "twilightforest:block/wood/door/mangrove/mangrove_door_door_top_right_open", + "y": 270 + }, + "facing=north,half=lower,hinge=left,open=false": { + "model": "twilightforest:block/wood/door/mangrove/mangrove_door_door_bottom_left", + "y": 270 + }, + "facing=north,half=lower,hinge=left,open=true": { + "model": "twilightforest:block/wood/door/mangrove/mangrove_door_door_bottom_left_open" + }, + "facing=north,half=lower,hinge=right,open=false": { + "model": "twilightforest:block/wood/door/mangrove/mangrove_door_door_bottom_right", + "y": 270 + }, + "facing=north,half=lower,hinge=right,open=true": { + "model": "twilightforest:block/wood/door/mangrove/mangrove_door_door_bottom_right_open", + "y": 180 + }, + "facing=north,half=upper,hinge=left,open=false": { + "model": "twilightforest:block/wood/door/mangrove/mangrove_door_door_top_left", + "y": 270 + }, + "facing=north,half=upper,hinge=left,open=true": { + "model": "twilightforest:block/wood/door/mangrove/mangrove_door_door_top_left_open" + }, + "facing=north,half=upper,hinge=right,open=false": { + "model": "twilightforest:block/wood/door/mangrove/mangrove_door_door_top_right", + "y": 270 + }, + "facing=north,half=upper,hinge=right,open=true": { + "model": "twilightforest:block/wood/door/mangrove/mangrove_door_door_top_right_open", + "y": 180 + }, + "facing=south,half=lower,hinge=left,open=false": { + "model": "twilightforest:block/wood/door/mangrove/mangrove_door_door_bottom_left", + "y": 90 + }, + "facing=south,half=lower,hinge=left,open=true": { + "model": "twilightforest:block/wood/door/mangrove/mangrove_door_door_bottom_left_open", + "y": 180 + }, + "facing=south,half=lower,hinge=right,open=false": { + "model": "twilightforest:block/wood/door/mangrove/mangrove_door_door_bottom_right", + "y": 90 + }, + "facing=south,half=lower,hinge=right,open=true": { + "model": "twilightforest:block/wood/door/mangrove/mangrove_door_door_bottom_right_open" + }, + "facing=south,half=upper,hinge=left,open=false": { + "model": "twilightforest:block/wood/door/mangrove/mangrove_door_door_top_left", + "y": 90 + }, + "facing=south,half=upper,hinge=left,open=true": { + "model": "twilightforest:block/wood/door/mangrove/mangrove_door_door_top_left_open", + "y": 180 + }, + "facing=south,half=upper,hinge=right,open=false": { + "model": "twilightforest:block/wood/door/mangrove/mangrove_door_door_top_right", + "y": 90 + }, + "facing=south,half=upper,hinge=right,open=true": { + "model": "twilightforest:block/wood/door/mangrove/mangrove_door_door_top_right_open" + }, + "facing=west,half=lower,hinge=left,open=false": { + "model": "twilightforest:block/wood/door/mangrove/mangrove_door_door_bottom_left", + "y": 180 + }, + "facing=west,half=lower,hinge=left,open=true": { + "model": "twilightforest:block/wood/door/mangrove/mangrove_door_door_bottom_left_open", + "y": 270 + }, + "facing=west,half=lower,hinge=right,open=false": { + "model": "twilightforest:block/wood/door/mangrove/mangrove_door_door_bottom_right", + "y": 180 + }, + "facing=west,half=lower,hinge=right,open=true": { + "model": "twilightforest:block/wood/door/mangrove/mangrove_door_door_bottom_right_open", + "y": 90 + }, + "facing=west,half=upper,hinge=left,open=false": { + "model": "twilightforest:block/wood/door/mangrove/mangrove_door_door_top_left", + "y": 180 + }, + "facing=west,half=upper,hinge=left,open=true": { + "model": "twilightforest:block/wood/door/mangrove/mangrove_door_door_top_left_open", + "y": 270 + }, + "facing=west,half=upper,hinge=right,open=false": { + "model": "twilightforest:block/wood/door/mangrove/mangrove_door_door_top_right", + "y": 180 + }, + "facing=west,half=upper,hinge=right,open=true": { + "model": "twilightforest:block/wood/door/mangrove/mangrove_door_door_top_right_open", + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/mangrove_fence.json b/src/generated/resources/assets/twilightforest/blockstates/mangrove_fence.json new file mode 100644 index 0000000000..d91bcafbba --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/mangrove_fence.json @@ -0,0 +1,134 @@ +{ + "multipart": [ + { + "apply": [ + { + "model": "twilightforest:block/wood/fence/mangrove/mangrove_fence_post", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence/mangrove/mangrove_fence_post_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence/mangrove/mangrove_fence_post_2" + }, + { + "model": "twilightforest:block/wood/fence/mangrove/mangrove_fence_post_3" + } + ] + }, + { + "apply": [ + { + "model": "twilightforest:block/wood/fence/mangrove/mangrove_fence_side", + "uvlock": true, + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence/mangrove/mangrove_fence_side_1", + "uvlock": true, + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence/mangrove/mangrove_fence_side_2", + "uvlock": true + }, + { + "model": "twilightforest:block/wood/fence/mangrove/mangrove_fence_side_3", + "uvlock": true + } + ], + "when": { + "north": "true" + } + }, + { + "apply": [ + { + "model": "twilightforest:block/wood/fence/mangrove/mangrove_fence_side", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence/mangrove/mangrove_fence_side_1", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence/mangrove/mangrove_fence_side_2", + "uvlock": true, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence/mangrove/mangrove_fence_side_3", + "uvlock": true, + "y": 180 + } + ], + "when": { + "south": "true" + } + }, + { + "apply": [ + { + "model": "twilightforest:block/wood/fence/mangrove/mangrove_fence_side", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence/mangrove/mangrove_fence_side_1", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence/mangrove/mangrove_fence_side_2", + "uvlock": true, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence/mangrove/mangrove_fence_side_3", + "uvlock": true, + "y": 270 + } + ], + "when": { + "west": "true" + } + }, + { + "apply": [ + { + "model": "twilightforest:block/wood/fence/mangrove/mangrove_fence_side", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence/mangrove/mangrove_fence_side_1", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence/mangrove/mangrove_fence_side_2", + "uvlock": true, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence/mangrove/mangrove_fence_side_3", + "uvlock": true, + "y": 90 + } + ], + "when": { + "east": "true" + } + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/mangrove_fence_gate.json b/src/generated/resources/assets/twilightforest/blockstates/mangrove_fence_gate.json new file mode 100644 index 0000000000..d0122dbf0b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/mangrove_fence_gate.json @@ -0,0 +1,372 @@ +{ + "variants": { + "facing=east,in_wall=false,open=false": [ + { + "model": "twilightforest:block/wood/fence_gate/mangrove/mangrove_fence_gate", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/mangrove/mangrove_fence_gate_1", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/mangrove/mangrove_fence_gate_2", + "uvlock": true, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/mangrove/mangrove_fence_gate_3", + "uvlock": true, + "y": 270 + } + ], + "facing=east,in_wall=false,open=true": [ + { + "model": "twilightforest:block/wood/fence_gate/mangrove/mangrove_fence_gate_open", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/mangrove/mangrove_fence_gate_open_1", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/mangrove/mangrove_fence_gate_open_2", + "uvlock": true, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/mangrove/mangrove_fence_gate_open_3", + "uvlock": true, + "y": 270 + } + ], + "facing=east,in_wall=true,open=false": [ + { + "model": "twilightforest:block/wood/fence_gate/mangrove/mangrove_fence_gate_wall", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/mangrove/mangrove_fence_gate_wall_1", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/mangrove/mangrove_fence_gate_wall_2", + "uvlock": true, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/mangrove/mangrove_fence_gate_wall_3", + "uvlock": true, + "y": 270 + } + ], + "facing=east,in_wall=true,open=true": [ + { + "model": "twilightforest:block/wood/fence_gate/mangrove/mangrove_fence_gate_wall_open", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/mangrove/mangrove_fence_gate_wall_open_1", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/mangrove/mangrove_fence_gate_wall_open_2", + "uvlock": true, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/mangrove/mangrove_fence_gate_wall_open_3", + "uvlock": true, + "y": 270 + } + ], + "facing=north,in_wall=false,open=false": [ + { + "model": "twilightforest:block/wood/fence_gate/mangrove/mangrove_fence_gate", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/mangrove/mangrove_fence_gate_1", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/mangrove/mangrove_fence_gate_2", + "uvlock": true, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/mangrove/mangrove_fence_gate_3", + "uvlock": true, + "y": 180 + } + ], + "facing=north,in_wall=false,open=true": [ + { + "model": "twilightforest:block/wood/fence_gate/mangrove/mangrove_fence_gate_open", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/mangrove/mangrove_fence_gate_open_1", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/mangrove/mangrove_fence_gate_open_2", + "uvlock": true, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/mangrove/mangrove_fence_gate_open_3", + "uvlock": true, + "y": 180 + } + ], + "facing=north,in_wall=true,open=false": [ + { + "model": "twilightforest:block/wood/fence_gate/mangrove/mangrove_fence_gate_wall", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/mangrove/mangrove_fence_gate_wall_1", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/mangrove/mangrove_fence_gate_wall_2", + "uvlock": true, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/mangrove/mangrove_fence_gate_wall_3", + "uvlock": true, + "y": 180 + } + ], + "facing=north,in_wall=true,open=true": [ + { + "model": "twilightforest:block/wood/fence_gate/mangrove/mangrove_fence_gate_wall_open", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/mangrove/mangrove_fence_gate_wall_open_1", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/mangrove/mangrove_fence_gate_wall_open_2", + "uvlock": true, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/mangrove/mangrove_fence_gate_wall_open_3", + "uvlock": true, + "y": 180 + } + ], + "facing=south,in_wall=false,open=false": [ + { + "model": "twilightforest:block/wood/fence_gate/mangrove/mangrove_fence_gate", + "uvlock": true, + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence_gate/mangrove/mangrove_fence_gate_1", + "uvlock": true, + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence_gate/mangrove/mangrove_fence_gate_2", + "uvlock": true + }, + { + "model": "twilightforest:block/wood/fence_gate/mangrove/mangrove_fence_gate_3", + "uvlock": true + } + ], + "facing=south,in_wall=false,open=true": [ + { + "model": "twilightforest:block/wood/fence_gate/mangrove/mangrove_fence_gate_open", + "uvlock": true, + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence_gate/mangrove/mangrove_fence_gate_open_1", + "uvlock": true, + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence_gate/mangrove/mangrove_fence_gate_open_2", + "uvlock": true + }, + { + "model": "twilightforest:block/wood/fence_gate/mangrove/mangrove_fence_gate_open_3", + "uvlock": true + } + ], + "facing=south,in_wall=true,open=false": [ + { + "model": "twilightforest:block/wood/fence_gate/mangrove/mangrove_fence_gate_wall", + "uvlock": true, + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence_gate/mangrove/mangrove_fence_gate_wall_1", + "uvlock": true, + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence_gate/mangrove/mangrove_fence_gate_wall_2", + "uvlock": true + }, + { + "model": "twilightforest:block/wood/fence_gate/mangrove/mangrove_fence_gate_wall_3", + "uvlock": true + } + ], + "facing=south,in_wall=true,open=true": [ + { + "model": "twilightforest:block/wood/fence_gate/mangrove/mangrove_fence_gate_wall_open", + "uvlock": true, + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence_gate/mangrove/mangrove_fence_gate_wall_open_1", + "uvlock": true, + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence_gate/mangrove/mangrove_fence_gate_wall_open_2", + "uvlock": true + }, + { + "model": "twilightforest:block/wood/fence_gate/mangrove/mangrove_fence_gate_wall_open_3", + "uvlock": true + } + ], + "facing=west,in_wall=false,open=false": [ + { + "model": "twilightforest:block/wood/fence_gate/mangrove/mangrove_fence_gate", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/mangrove/mangrove_fence_gate_1", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/mangrove/mangrove_fence_gate_2", + "uvlock": true, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/mangrove/mangrove_fence_gate_3", + "uvlock": true, + "y": 90 + } + ], + "facing=west,in_wall=false,open=true": [ + { + "model": "twilightforest:block/wood/fence_gate/mangrove/mangrove_fence_gate_open", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/mangrove/mangrove_fence_gate_open_1", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/mangrove/mangrove_fence_gate_open_2", + "uvlock": true, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/mangrove/mangrove_fence_gate_open_3", + "uvlock": true, + "y": 90 + } + ], + "facing=west,in_wall=true,open=false": [ + { + "model": "twilightforest:block/wood/fence_gate/mangrove/mangrove_fence_gate_wall", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/mangrove/mangrove_fence_gate_wall_1", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/mangrove/mangrove_fence_gate_wall_2", + "uvlock": true, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/mangrove/mangrove_fence_gate_wall_3", + "uvlock": true, + "y": 90 + } + ], + "facing=west,in_wall=true,open=true": [ + { + "model": "twilightforest:block/wood/fence_gate/mangrove/mangrove_fence_gate_wall_open", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/mangrove/mangrove_fence_gate_wall_open_1", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/mangrove/mangrove_fence_gate_wall_open_2", + "uvlock": true, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/mangrove/mangrove_fence_gate_wall_open_3", + "uvlock": true, + "y": 90 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/mangrove_leaves.json b/src/generated/resources/assets/twilightforest/blockstates/mangrove_leaves.json new file mode 100644 index 0000000000..4d4d8f9bfa --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/mangrove_leaves.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/mangrove_leaves" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/mangrove_log.json b/src/generated/resources/assets/twilightforest/blockstates/mangrove_log.json new file mode 100644 index 0000000000..efa5363840 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/mangrove_log.json @@ -0,0 +1,16 @@ +{ + "variants": { + "axis=x": { + "model": "twilightforest:block/mangrove_log_horizontal", + "x": 90, + "y": 90 + }, + "axis=y": { + "model": "twilightforest:block/mangrove_log" + }, + "axis=z": { + "model": "twilightforest:block/mangrove_log_horizontal", + "x": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/mangrove_planks.json b/src/generated/resources/assets/twilightforest/blockstates/mangrove_planks.json new file mode 100644 index 0000000000..9d1693ebb0 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/mangrove_planks.json @@ -0,0 +1,20 @@ +{ + "variants": { + "": [ + { + "model": "twilightforest:block/wood/planks/mangrove/mangrove_planks", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/planks/mangrove/mangrove_planks_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/planks/mangrove/mangrove_planks_2" + }, + { + "model": "twilightforest:block/wood/planks/mangrove/mangrove_planks_3" + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/mangrove_pressure_plate.json b/src/generated/resources/assets/twilightforest/blockstates/mangrove_pressure_plate.json new file mode 100644 index 0000000000..971270386d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/mangrove_pressure_plate.json @@ -0,0 +1,36 @@ +{ + "variants": { + "powered=false": [ + { + "model": "twilightforest:block/wood/pressure_plate/mangrove/mangrove_pressure_plate", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/pressure_plate/mangrove/mangrove_pressure_plate_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/pressure_plate/mangrove/mangrove_pressure_plate_2" + }, + { + "model": "twilightforest:block/wood/pressure_plate/mangrove/mangrove_pressure_plate_3" + } + ], + "powered=true": [ + { + "model": "twilightforest:block/wood/pressure_plate/mangrove/mangrove_pressure_plate_down", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/pressure_plate/mangrove/mangrove_pressure_plate_down_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/pressure_plate/mangrove/mangrove_pressure_plate_down_2" + }, + { + "model": "twilightforest:block/wood/pressure_plate/mangrove/mangrove_pressure_plate_down_3" + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/mangrove_root.json b/src/generated/resources/assets/twilightforest/blockstates/mangrove_root.json new file mode 100644 index 0000000000..7c1efafea6 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/mangrove_root.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/mangrove_root" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/mangrove_sapling.json b/src/generated/resources/assets/twilightforest/blockstates/mangrove_sapling.json new file mode 100644 index 0000000000..d4dc7d3a90 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/mangrove_sapling.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/mangrove_sapling" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/mangrove_sign.json b/src/generated/resources/assets/twilightforest/blockstates/mangrove_sign.json new file mode 100644 index 0000000000..c335cc2952 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/mangrove_sign.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/mangrove_sign" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/mangrove_slab.json b/src/generated/resources/assets/twilightforest/blockstates/mangrove_slab.json new file mode 100644 index 0000000000..82205d9eed --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/mangrove_slab.json @@ -0,0 +1,60 @@ +{ + "variants": { + "type=bottom": [ + { + "model": "twilightforest:block/wood/slab/mangrove/mangrove_slab", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/slab/mangrove/mangrove_slab_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/slab/mangrove/mangrove_slab_2" + }, + { + "model": "twilightforest:block/wood/slab/mangrove/mangrove_slab_3" + } + ], + "type=double": [ + { + "model": "twilightforest:block/wood/planks/mangrove/mangrove_planks", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/planks/mangrove/mangrove_planks_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/planks/mangrove/mangrove_planks_2" + }, + { + "model": "twilightforest:block/wood/planks/mangrove/mangrove_planks_3" + } + ], + "type=top": [ + { + "model": "twilightforest:block/wood/slab/mangrove/mangrove_slab", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/slab/mangrove/mangrove_slab_1", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/slab/mangrove/mangrove_slab_2", + "uvlock": true, + "x": 180 + }, + { + "model": "twilightforest:block/wood/slab/mangrove/mangrove_slab_3", + "uvlock": true, + "x": 180 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/mangrove_stairs.json b/src/generated/resources/assets/twilightforest/blockstates/mangrove_stairs.json new file mode 100644 index 0000000000..7bbafd6917 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/mangrove_stairs.json @@ -0,0 +1,984 @@ +{ + "variants": { + "facing=east,half=bottom,shape=inner_left": [ + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_inner", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_inner_1", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_inner_2", + "uvlock": true, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_inner_3", + "uvlock": true, + "y": 270 + } + ], + "facing=east,half=bottom,shape=inner_right": [ + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_inner", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_inner_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_inner_2" + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_inner_3" + } + ], + "facing=east,half=bottom,shape=outer_left": [ + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_outer", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_outer_1", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_outer_2", + "uvlock": true, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_outer_3", + "uvlock": true, + "y": 270 + } + ], + "facing=east,half=bottom,shape=outer_right": [ + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_outer", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_outer_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_outer_2" + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_outer_3" + } + ], + "facing=east,half=bottom,shape=straight": [ + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_2" + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_3" + } + ], + "facing=east,half=top,shape=inner_left": [ + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_inner", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_inner_1", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_inner_2", + "uvlock": true, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_inner_3", + "uvlock": true, + "x": 180 + } + ], + "facing=east,half=top,shape=inner_right": [ + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_inner", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_inner_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_inner_2", + "uvlock": true, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_inner_3", + "uvlock": true, + "x": 180, + "y": 90 + } + ], + "facing=east,half=top,shape=outer_left": [ + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_outer", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_outer_1", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_outer_2", + "uvlock": true, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_outer_3", + "uvlock": true, + "x": 180 + } + ], + "facing=east,half=top,shape=outer_right": [ + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_outer", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_outer_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_outer_2", + "uvlock": true, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_outer_3", + "uvlock": true, + "x": 180, + "y": 90 + } + ], + "facing=east,half=top,shape=straight": [ + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_1", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_2", + "uvlock": true, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_3", + "uvlock": true, + "x": 180 + } + ], + "facing=north,half=bottom,shape=inner_left": [ + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_inner", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_inner_1", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_inner_2", + "uvlock": true, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_inner_3", + "uvlock": true, + "y": 180 + } + ], + "facing=north,half=bottom,shape=inner_right": [ + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_inner", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_inner_1", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_inner_2", + "uvlock": true, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_inner_3", + "uvlock": true, + "y": 270 + } + ], + "facing=north,half=bottom,shape=outer_left": [ + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_outer", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_outer_1", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_outer_2", + "uvlock": true, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_outer_3", + "uvlock": true, + "y": 180 + } + ], + "facing=north,half=bottom,shape=outer_right": [ + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_outer", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_outer_1", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_outer_2", + "uvlock": true, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_outer_3", + "uvlock": true, + "y": 270 + } + ], + "facing=north,half=bottom,shape=straight": [ + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_1", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_2", + "uvlock": true, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_3", + "uvlock": true, + "y": 270 + } + ], + "facing=north,half=top,shape=inner_left": [ + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_inner", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_inner_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_inner_2", + "uvlock": true, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_inner_3", + "uvlock": true, + "x": 180, + "y": 270 + } + ], + "facing=north,half=top,shape=inner_right": [ + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_inner", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_inner_1", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_inner_2", + "uvlock": true, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_inner_3", + "uvlock": true, + "x": 180 + } + ], + "facing=north,half=top,shape=outer_left": [ + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_outer", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_outer_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_outer_2", + "uvlock": true, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_outer_3", + "uvlock": true, + "x": 180, + "y": 270 + } + ], + "facing=north,half=top,shape=outer_right": [ + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_outer", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_outer_1", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_outer_2", + "uvlock": true, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_outer_3", + "uvlock": true, + "x": 180 + } + ], + "facing=north,half=top,shape=straight": [ + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_2", + "uvlock": true, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_3", + "uvlock": true, + "x": 180, + "y": 270 + } + ], + "facing=south,half=bottom,shape=inner_left": [ + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_inner", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_inner_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_inner_2" + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_inner_3" + } + ], + "facing=south,half=bottom,shape=inner_right": [ + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_inner", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_inner_1", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_inner_2", + "uvlock": true, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_inner_3", + "uvlock": true, + "y": 90 + } + ], + "facing=south,half=bottom,shape=outer_left": [ + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_outer", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_outer_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_outer_2" + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_outer_3" + } + ], + "facing=south,half=bottom,shape=outer_right": [ + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_outer", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_outer_1", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_outer_2", + "uvlock": true, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_outer_3", + "uvlock": true, + "y": 90 + } + ], + "facing=south,half=bottom,shape=straight": [ + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_1", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_2", + "uvlock": true, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_3", + "uvlock": true, + "y": 90 + } + ], + "facing=south,half=top,shape=inner_left": [ + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_inner", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_inner_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_inner_2", + "uvlock": true, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_inner_3", + "uvlock": true, + "x": 180, + "y": 90 + } + ], + "facing=south,half=top,shape=inner_right": [ + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_inner", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_inner_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_inner_2", + "uvlock": true, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_inner_3", + "uvlock": true, + "x": 180, + "y": 180 + } + ], + "facing=south,half=top,shape=outer_left": [ + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_outer", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_outer_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_outer_2", + "uvlock": true, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_outer_3", + "uvlock": true, + "x": 180, + "y": 90 + } + ], + "facing=south,half=top,shape=outer_right": [ + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_outer", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_outer_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_outer_2", + "uvlock": true, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_outer_3", + "uvlock": true, + "x": 180, + "y": 180 + } + ], + "facing=south,half=top,shape=straight": [ + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_2", + "uvlock": true, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_3", + "uvlock": true, + "x": 180, + "y": 90 + } + ], + "facing=west,half=bottom,shape=inner_left": [ + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_inner", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_inner_1", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_inner_2", + "uvlock": true, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_inner_3", + "uvlock": true, + "y": 90 + } + ], + "facing=west,half=bottom,shape=inner_right": [ + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_inner", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_inner_1", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_inner_2", + "uvlock": true, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_inner_3", + "uvlock": true, + "y": 180 + } + ], + "facing=west,half=bottom,shape=outer_left": [ + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_outer", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_outer_1", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_outer_2", + "uvlock": true, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_outer_3", + "uvlock": true, + "y": 90 + } + ], + "facing=west,half=bottom,shape=outer_right": [ + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_outer", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_outer_1", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_outer_2", + "uvlock": true, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_outer_3", + "uvlock": true, + "y": 180 + } + ], + "facing=west,half=bottom,shape=straight": [ + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_1", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_2", + "uvlock": true, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_3", + "uvlock": true, + "y": 180 + } + ], + "facing=west,half=top,shape=inner_left": [ + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_inner", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_inner_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_inner_2", + "uvlock": true, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_inner_3", + "uvlock": true, + "x": 180, + "y": 180 + } + ], + "facing=west,half=top,shape=inner_right": [ + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_inner", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_inner_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_inner_2", + "uvlock": true, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_inner_3", + "uvlock": true, + "x": 180, + "y": 270 + } + ], + "facing=west,half=top,shape=outer_left": [ + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_outer", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_outer_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_outer_2", + "uvlock": true, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_outer_3", + "uvlock": true, + "x": 180, + "y": 180 + } + ], + "facing=west,half=top,shape=outer_right": [ + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_outer", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_outer_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_outer_2", + "uvlock": true, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_outer_3", + "uvlock": true, + "x": 180, + "y": 270 + } + ], + "facing=west,half=top,shape=straight": [ + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_2", + "uvlock": true, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs_3", + "uvlock": true, + "x": 180, + "y": 180 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/mangrove_trapdoor.json b/src/generated/resources/assets/twilightforest/blockstates/mangrove_trapdoor.json new file mode 100644 index 0000000000..2314d7521f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/mangrove_trapdoor.json @@ -0,0 +1,68 @@ +{ + "variants": { + "facing=east,half=bottom,open=false": { + "model": "twilightforest:block/wood/trapdoor/mangrove/mangrove_trapdoor_bottom", + "y": 90 + }, + "facing=east,half=bottom,open=true": { + "model": "twilightforest:block/wood/trapdoor/mangrove/mangrove_trapdoor_open", + "y": 90 + }, + "facing=east,half=top,open=false": { + "model": "twilightforest:block/wood/trapdoor/mangrove/mangrove_trapdoor_top", + "y": 90 + }, + "facing=east,half=top,open=true": { + "model": "twilightforest:block/wood/trapdoor/mangrove/mangrove_trapdoor_open", + "x": 180, + "y": 270 + }, + "facing=north,half=bottom,open=false": { + "model": "twilightforest:block/wood/trapdoor/mangrove/mangrove_trapdoor_bottom" + }, + "facing=north,half=bottom,open=true": { + "model": "twilightforest:block/wood/trapdoor/mangrove/mangrove_trapdoor_open" + }, + "facing=north,half=top,open=false": { + "model": "twilightforest:block/wood/trapdoor/mangrove/mangrove_trapdoor_top" + }, + "facing=north,half=top,open=true": { + "model": "twilightforest:block/wood/trapdoor/mangrove/mangrove_trapdoor_open", + "x": 180, + "y": 180 + }, + "facing=south,half=bottom,open=false": { + "model": "twilightforest:block/wood/trapdoor/mangrove/mangrove_trapdoor_bottom", + "y": 180 + }, + "facing=south,half=bottom,open=true": { + "model": "twilightforest:block/wood/trapdoor/mangrove/mangrove_trapdoor_open", + "y": 180 + }, + "facing=south,half=top,open=false": { + "model": "twilightforest:block/wood/trapdoor/mangrove/mangrove_trapdoor_top", + "y": 180 + }, + "facing=south,half=top,open=true": { + "model": "twilightforest:block/wood/trapdoor/mangrove/mangrove_trapdoor_open", + "x": 180 + }, + "facing=west,half=bottom,open=false": { + "model": "twilightforest:block/wood/trapdoor/mangrove/mangrove_trapdoor_bottom", + "y": 270 + }, + "facing=west,half=bottom,open=true": { + "model": "twilightforest:block/wood/trapdoor/mangrove/mangrove_trapdoor_open", + "y": 270 + }, + "facing=west,half=top,open=false": { + "model": "twilightforest:block/wood/trapdoor/mangrove/mangrove_trapdoor_top", + "y": 270 + }, + "facing=west,half=top,open=true": { + "model": "twilightforest:block/wood/trapdoor/mangrove/mangrove_trapdoor_open", + "x": 180, + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/mangrove_wall_sign.json b/src/generated/resources/assets/twilightforest/blockstates/mangrove_wall_sign.json new file mode 100644 index 0000000000..6d3771c897 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/mangrove_wall_sign.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/mangrove_wall_sign" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/mangrove_wood.json b/src/generated/resources/assets/twilightforest/blockstates/mangrove_wood.json new file mode 100644 index 0000000000..2783d6bc6e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/mangrove_wood.json @@ -0,0 +1,16 @@ +{ + "variants": { + "axis=x": { + "model": "twilightforest:block/mangrove_wood_horizontal", + "x": 90, + "y": 90 + }, + "axis=y": { + "model": "twilightforest:block/mangrove_wood" + }, + "axis=z": { + "model": "twilightforest:block/mangrove_wood_horizontal", + "x": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/mayapple.json b/src/generated/resources/assets/twilightforest/blockstates/mayapple.json new file mode 100644 index 0000000000..29725cde93 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/mayapple.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/mayapple" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/mazestone.json b/src/generated/resources/assets/twilightforest/blockstates/mazestone.json new file mode 100644 index 0000000000..bed1afda45 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/mazestone.json @@ -0,0 +1,16 @@ +{ + "variants": { + "": [ + { + "model": "twilightforest:block/mazestone", + "x": 90, + "y": 90 + }, + { + "model": "twilightforest:block/mazestone", + "x": 270, + "y": 270 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/mazestone_border.json b/src/generated/resources/assets/twilightforest/blockstates/mazestone_border.json new file mode 100644 index 0000000000..a2d8fe0aae --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/mazestone_border.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/mazestone_border" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/mazestone_brick.json b/src/generated/resources/assets/twilightforest/blockstates/mazestone_brick.json new file mode 100644 index 0000000000..03ce3e1e03 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/mazestone_brick.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/mazestone_brick" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/mazestone_mosaic.json b/src/generated/resources/assets/twilightforest/blockstates/mazestone_mosaic.json new file mode 100644 index 0000000000..ccabe8096a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/mazestone_mosaic.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/mazestone_mosaic" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/mining_banister.json b/src/generated/resources/assets/twilightforest/blockstates/mining_banister.json new file mode 100644 index 0000000000..06ce6bcdca --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/mining_banister.json @@ -0,0 +1,460 @@ +{ + "variants": { + "extended=false,facing=east,shape=connected": [ + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_connected", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_connected_1", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_connected_2", + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_connected_3", + "y": 270 + } + ], + "extended=false,facing=east,shape=short": [ + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_short", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_short_1", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_short_2", + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_short_3", + "y": 270 + } + ], + "extended=false,facing=east,shape=tall": [ + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_tall", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_tall_1", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_tall_2", + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_tall_3", + "y": 270 + } + ], + "extended=false,facing=north,shape=connected": [ + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_connected", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_connected_1", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_connected_2", + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_connected_3", + "y": 180 + } + ], + "extended=false,facing=north,shape=short": [ + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_short", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_short_1", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_short_2", + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_short_3", + "y": 180 + } + ], + "extended=false,facing=north,shape=tall": [ + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_tall", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_tall_1", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_tall_2", + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_tall_3", + "y": 180 + } + ], + "extended=false,facing=south,shape=connected": [ + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_connected", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_connected_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_connected_2" + }, + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_connected_3" + } + ], + "extended=false,facing=south,shape=short": [ + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_short", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_short_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_short_2" + }, + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_short_3" + } + ], + "extended=false,facing=south,shape=tall": [ + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_tall", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_tall_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_tall_2" + }, + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_tall_3" + } + ], + "extended=false,facing=west,shape=connected": [ + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_connected", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_connected_1", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_connected_2", + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_connected_3", + "y": 90 + } + ], + "extended=false,facing=west,shape=short": [ + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_short", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_short_1", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_short_2", + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_short_3", + "y": 90 + } + ], + "extended=false,facing=west,shape=tall": [ + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_tall", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_tall_1", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_tall_2", + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_tall_3", + "y": 90 + } + ], + "extended=true,facing=east,shape=connected": [ + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_connected_extended", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_connected_extended_1", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_connected_extended_2", + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_connected_extended_3", + "y": 270 + } + ], + "extended=true,facing=east,shape=short": [ + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_short_extended", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_short_extended_1", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_short_extended_2", + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_short_extended_3", + "y": 270 + } + ], + "extended=true,facing=east,shape=tall": [ + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_tall_extended", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_tall_extended_1", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_tall_extended_2", + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_tall_extended_3", + "y": 270 + } + ], + "extended=true,facing=north,shape=connected": [ + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_connected_extended", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_connected_extended_1", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_connected_extended_2", + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_connected_extended_3", + "y": 180 + } + ], + "extended=true,facing=north,shape=short": [ + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_short_extended", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_short_extended_1", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_short_extended_2", + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_short_extended_3", + "y": 180 + } + ], + "extended=true,facing=north,shape=tall": [ + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_tall_extended", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_tall_extended_1", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_tall_extended_2", + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_tall_extended_3", + "y": 180 + } + ], + "extended=true,facing=south,shape=connected": [ + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_connected_extended", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_connected_extended_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_connected_extended_2" + }, + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_connected_extended_3" + } + ], + "extended=true,facing=south,shape=short": [ + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_short_extended", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_short_extended_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_short_extended_2" + }, + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_short_extended_3" + } + ], + "extended=true,facing=south,shape=tall": [ + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_tall_extended", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_tall_extended_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_tall_extended_2" + }, + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_tall_extended_3" + } + ], + "extended=true,facing=west,shape=connected": [ + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_connected_extended", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_connected_extended_1", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_connected_extended_2", + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_connected_extended_3", + "y": 90 + } + ], + "extended=true,facing=west,shape=short": [ + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_short_extended", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_short_extended_1", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_short_extended_2", + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_short_extended_3", + "y": 90 + } + ], + "extended=true,facing=west,shape=tall": [ + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_tall_extended", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_tall_extended_1", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_tall_extended_2", + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/mine/mining_banister_tall_extended_3", + "y": 90 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/mining_button.json b/src/generated/resources/assets/twilightforest/blockstates/mining_button.json new file mode 100644 index 0000000000..583088ea04 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/mining_button.json @@ -0,0 +1,556 @@ +{ + "variants": { + "face=ceiling,facing=east,powered=false": [ + { + "model": "twilightforest:block/wood/button/mine/mining_button", + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/mine/mining_button_1", + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/mine/mining_button_2", + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/mine/mining_button_3", + "x": 180, + "y": 270 + } + ], + "face=ceiling,facing=east,powered=true": [ + { + "model": "twilightforest:block/wood/button/mine/mining_button_pressed", + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/mine/mining_button_pressed_1", + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/mine/mining_button_pressed_2", + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/mine/mining_button_pressed_3", + "x": 180, + "y": 270 + } + ], + "face=ceiling,facing=north,powered=false": [ + { + "model": "twilightforest:block/wood/button/mine/mining_button", + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/mine/mining_button_1", + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/mine/mining_button_2", + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/mine/mining_button_3", + "x": 180, + "y": 180 + } + ], + "face=ceiling,facing=north,powered=true": [ + { + "model": "twilightforest:block/wood/button/mine/mining_button_pressed", + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/mine/mining_button_pressed_1", + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/mine/mining_button_pressed_2", + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/mine/mining_button_pressed_3", + "x": 180, + "y": 180 + } + ], + "face=ceiling,facing=south,powered=false": [ + { + "model": "twilightforest:block/wood/button/mine/mining_button", + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/button/mine/mining_button_1", + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/button/mine/mining_button_2", + "x": 180 + }, + { + "model": "twilightforest:block/wood/button/mine/mining_button_3", + "x": 180 + } + ], + "face=ceiling,facing=south,powered=true": [ + { + "model": "twilightforest:block/wood/button/mine/mining_button_pressed", + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/button/mine/mining_button_pressed_1", + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/button/mine/mining_button_pressed_2", + "x": 180 + }, + { + "model": "twilightforest:block/wood/button/mine/mining_button_pressed_3", + "x": 180 + } + ], + "face=ceiling,facing=west,powered=false": [ + { + "model": "twilightforest:block/wood/button/mine/mining_button", + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/mine/mining_button_1", + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/mine/mining_button_2", + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/mine/mining_button_3", + "x": 180, + "y": 90 + } + ], + "face=ceiling,facing=west,powered=true": [ + { + "model": "twilightforest:block/wood/button/mine/mining_button_pressed", + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/mine/mining_button_pressed_1", + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/mine/mining_button_pressed_2", + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/mine/mining_button_pressed_3", + "x": 180, + "y": 90 + } + ], + "face=floor,facing=east,powered=false": [ + { + "model": "twilightforest:block/wood/button/mine/mining_button", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/mine/mining_button_1", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/mine/mining_button_2", + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/mine/mining_button_3", + "y": 90 + } + ], + "face=floor,facing=east,powered=true": [ + { + "model": "twilightforest:block/wood/button/mine/mining_button_pressed", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/mine/mining_button_pressed_1", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/mine/mining_button_pressed_2", + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/mine/mining_button_pressed_3", + "y": 90 + } + ], + "face=floor,facing=north,powered=false": [ + { + "model": "twilightforest:block/wood/button/mine/mining_button", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/button/mine/mining_button_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/button/mine/mining_button_2" + }, + { + "model": "twilightforest:block/wood/button/mine/mining_button_3" + } + ], + "face=floor,facing=north,powered=true": [ + { + "model": "twilightforest:block/wood/button/mine/mining_button_pressed", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/button/mine/mining_button_pressed_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/button/mine/mining_button_pressed_2" + }, + { + "model": "twilightforest:block/wood/button/mine/mining_button_pressed_3" + } + ], + "face=floor,facing=south,powered=false": [ + { + "model": "twilightforest:block/wood/button/mine/mining_button", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/mine/mining_button_1", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/mine/mining_button_2", + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/mine/mining_button_3", + "y": 180 + } + ], + "face=floor,facing=south,powered=true": [ + { + "model": "twilightforest:block/wood/button/mine/mining_button_pressed", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/mine/mining_button_pressed_1", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/mine/mining_button_pressed_2", + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/mine/mining_button_pressed_3", + "y": 180 + } + ], + "face=floor,facing=west,powered=false": [ + { + "model": "twilightforest:block/wood/button/mine/mining_button", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/mine/mining_button_1", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/mine/mining_button_2", + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/mine/mining_button_3", + "y": 270 + } + ], + "face=floor,facing=west,powered=true": [ + { + "model": "twilightforest:block/wood/button/mine/mining_button_pressed", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/mine/mining_button_pressed_1", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/mine/mining_button_pressed_2", + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/mine/mining_button_pressed_3", + "y": 270 + } + ], + "face=wall,facing=east,powered=false": [ + { + "model": "twilightforest:block/wood/button/mine/mining_button", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/mine/mining_button_1", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/mine/mining_button_2", + "uvlock": true, + "x": 90, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/mine/mining_button_3", + "uvlock": true, + "x": 90, + "y": 90 + } + ], + "face=wall,facing=east,powered=true": [ + { + "model": "twilightforest:block/wood/button/mine/mining_button_pressed", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/mine/mining_button_pressed_1", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/mine/mining_button_pressed_2", + "uvlock": true, + "x": 90, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/mine/mining_button_pressed_3", + "uvlock": true, + "x": 90, + "y": 90 + } + ], + "face=wall,facing=north,powered=false": [ + { + "model": "twilightforest:block/wood/button/mine/mining_button", + "uvlock": true, + "weight": 10, + "x": 90 + }, + { + "model": "twilightforest:block/wood/button/mine/mining_button_1", + "uvlock": true, + "weight": 10, + "x": 90 + }, + { + "model": "twilightforest:block/wood/button/mine/mining_button_2", + "uvlock": true, + "x": 90 + }, + { + "model": "twilightforest:block/wood/button/mine/mining_button_3", + "uvlock": true, + "x": 90 + } + ], + "face=wall,facing=north,powered=true": [ + { + "model": "twilightforest:block/wood/button/mine/mining_button_pressed", + "uvlock": true, + "weight": 10, + "x": 90 + }, + { + "model": "twilightforest:block/wood/button/mine/mining_button_pressed_1", + "uvlock": true, + "weight": 10, + "x": 90 + }, + { + "model": "twilightforest:block/wood/button/mine/mining_button_pressed_2", + "uvlock": true, + "x": 90 + }, + { + "model": "twilightforest:block/wood/button/mine/mining_button_pressed_3", + "uvlock": true, + "x": 90 + } + ], + "face=wall,facing=south,powered=false": [ + { + "model": "twilightforest:block/wood/button/mine/mining_button", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/mine/mining_button_1", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/mine/mining_button_2", + "uvlock": true, + "x": 90, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/mine/mining_button_3", + "uvlock": true, + "x": 90, + "y": 180 + } + ], + "face=wall,facing=south,powered=true": [ + { + "model": "twilightforest:block/wood/button/mine/mining_button_pressed", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/mine/mining_button_pressed_1", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/mine/mining_button_pressed_2", + "uvlock": true, + "x": 90, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/mine/mining_button_pressed_3", + "uvlock": true, + "x": 90, + "y": 180 + } + ], + "face=wall,facing=west,powered=false": [ + { + "model": "twilightforest:block/wood/button/mine/mining_button", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/mine/mining_button_1", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/mine/mining_button_2", + "uvlock": true, + "x": 90, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/mine/mining_button_3", + "uvlock": true, + "x": 90, + "y": 270 + } + ], + "face=wall,facing=west,powered=true": [ + { + "model": "twilightforest:block/wood/button/mine/mining_button_pressed", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/mine/mining_button_pressed_1", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/mine/mining_button_pressed_2", + "uvlock": true, + "x": 90, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/mine/mining_button_pressed_3", + "uvlock": true, + "x": 90, + "y": 270 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/mining_chest.json b/src/generated/resources/assets/twilightforest/blockstates/mining_chest.json new file mode 100644 index 0000000000..6c44d2b8f3 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/mining_chest.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/mining_chest" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/mining_door.json b/src/generated/resources/assets/twilightforest/blockstates/mining_door.json new file mode 100644 index 0000000000..5e32424a6b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/mining_door.json @@ -0,0 +1,124 @@ +{ + "variants": { + "facing=east,half=lower,hinge=left,open=false": { + "model": "twilightforest:block/wood/door/mine/mining_door_door_bottom_left" + }, + "facing=east,half=lower,hinge=left,open=true": { + "model": "twilightforest:block/wood/door/mine/mining_door_door_bottom_left_open", + "y": 90 + }, + "facing=east,half=lower,hinge=right,open=false": { + "model": "twilightforest:block/wood/door/mine/mining_door_door_bottom_right" + }, + "facing=east,half=lower,hinge=right,open=true": { + "model": "twilightforest:block/wood/door/mine/mining_door_door_bottom_right_open", + "y": 270 + }, + "facing=east,half=upper,hinge=left,open=false": { + "model": "twilightforest:block/wood/door/mine/mining_door_door_top_left" + }, + "facing=east,half=upper,hinge=left,open=true": { + "model": "twilightforest:block/wood/door/mine/mining_door_door_top_left_open", + "y": 90 + }, + "facing=east,half=upper,hinge=right,open=false": { + "model": "twilightforest:block/wood/door/mine/mining_door_door_top_right" + }, + "facing=east,half=upper,hinge=right,open=true": { + "model": "twilightforest:block/wood/door/mine/mining_door_door_top_right_open", + "y": 270 + }, + "facing=north,half=lower,hinge=left,open=false": { + "model": "twilightforest:block/wood/door/mine/mining_door_door_bottom_left", + "y": 270 + }, + "facing=north,half=lower,hinge=left,open=true": { + "model": "twilightforest:block/wood/door/mine/mining_door_door_bottom_left_open" + }, + "facing=north,half=lower,hinge=right,open=false": { + "model": "twilightforest:block/wood/door/mine/mining_door_door_bottom_right", + "y": 270 + }, + "facing=north,half=lower,hinge=right,open=true": { + "model": "twilightforest:block/wood/door/mine/mining_door_door_bottom_right_open", + "y": 180 + }, + "facing=north,half=upper,hinge=left,open=false": { + "model": "twilightforest:block/wood/door/mine/mining_door_door_top_left", + "y": 270 + }, + "facing=north,half=upper,hinge=left,open=true": { + "model": "twilightforest:block/wood/door/mine/mining_door_door_top_left_open" + }, + "facing=north,half=upper,hinge=right,open=false": { + "model": "twilightforest:block/wood/door/mine/mining_door_door_top_right", + "y": 270 + }, + "facing=north,half=upper,hinge=right,open=true": { + "model": "twilightforest:block/wood/door/mine/mining_door_door_top_right_open", + "y": 180 + }, + "facing=south,half=lower,hinge=left,open=false": { + "model": "twilightforest:block/wood/door/mine/mining_door_door_bottom_left", + "y": 90 + }, + "facing=south,half=lower,hinge=left,open=true": { + "model": "twilightforest:block/wood/door/mine/mining_door_door_bottom_left_open", + "y": 180 + }, + "facing=south,half=lower,hinge=right,open=false": { + "model": "twilightforest:block/wood/door/mine/mining_door_door_bottom_right", + "y": 90 + }, + "facing=south,half=lower,hinge=right,open=true": { + "model": "twilightforest:block/wood/door/mine/mining_door_door_bottom_right_open" + }, + "facing=south,half=upper,hinge=left,open=false": { + "model": "twilightforest:block/wood/door/mine/mining_door_door_top_left", + "y": 90 + }, + "facing=south,half=upper,hinge=left,open=true": { + "model": "twilightforest:block/wood/door/mine/mining_door_door_top_left_open", + "y": 180 + }, + "facing=south,half=upper,hinge=right,open=false": { + "model": "twilightforest:block/wood/door/mine/mining_door_door_top_right", + "y": 90 + }, + "facing=south,half=upper,hinge=right,open=true": { + "model": "twilightforest:block/wood/door/mine/mining_door_door_top_right_open" + }, + "facing=west,half=lower,hinge=left,open=false": { + "model": "twilightforest:block/wood/door/mine/mining_door_door_bottom_left", + "y": 180 + }, + "facing=west,half=lower,hinge=left,open=true": { + "model": "twilightforest:block/wood/door/mine/mining_door_door_bottom_left_open", + "y": 270 + }, + "facing=west,half=lower,hinge=right,open=false": { + "model": "twilightforest:block/wood/door/mine/mining_door_door_bottom_right", + "y": 180 + }, + "facing=west,half=lower,hinge=right,open=true": { + "model": "twilightforest:block/wood/door/mine/mining_door_door_bottom_right_open", + "y": 90 + }, + "facing=west,half=upper,hinge=left,open=false": { + "model": "twilightforest:block/wood/door/mine/mining_door_door_top_left", + "y": 180 + }, + "facing=west,half=upper,hinge=left,open=true": { + "model": "twilightforest:block/wood/door/mine/mining_door_door_top_left_open", + "y": 270 + }, + "facing=west,half=upper,hinge=right,open=false": { + "model": "twilightforest:block/wood/door/mine/mining_door_door_top_right", + "y": 180 + }, + "facing=west,half=upper,hinge=right,open=true": { + "model": "twilightforest:block/wood/door/mine/mining_door_door_top_right_open", + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/mining_fence.json b/src/generated/resources/assets/twilightforest/blockstates/mining_fence.json new file mode 100644 index 0000000000..760c84a644 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/mining_fence.json @@ -0,0 +1,134 @@ +{ + "multipart": [ + { + "apply": [ + { + "model": "twilightforest:block/wood/fence/mine/mining_fence_post", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence/mine/mining_fence_post_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence/mine/mining_fence_post_2" + }, + { + "model": "twilightforest:block/wood/fence/mine/mining_fence_post_3" + } + ] + }, + { + "apply": [ + { + "model": "twilightforest:block/wood/fence/mine/mining_fence_side", + "uvlock": true, + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence/mine/mining_fence_side_1", + "uvlock": true, + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence/mine/mining_fence_side_2", + "uvlock": true + }, + { + "model": "twilightforest:block/wood/fence/mine/mining_fence_side_3", + "uvlock": true + } + ], + "when": { + "north": "true" + } + }, + { + "apply": [ + { + "model": "twilightforest:block/wood/fence/mine/mining_fence_side", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence/mine/mining_fence_side_1", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence/mine/mining_fence_side_2", + "uvlock": true, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence/mine/mining_fence_side_3", + "uvlock": true, + "y": 180 + } + ], + "when": { + "south": "true" + } + }, + { + "apply": [ + { + "model": "twilightforest:block/wood/fence/mine/mining_fence_side", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence/mine/mining_fence_side_1", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence/mine/mining_fence_side_2", + "uvlock": true, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence/mine/mining_fence_side_3", + "uvlock": true, + "y": 270 + } + ], + "when": { + "west": "true" + } + }, + { + "apply": [ + { + "model": "twilightforest:block/wood/fence/mine/mining_fence_side", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence/mine/mining_fence_side_1", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence/mine/mining_fence_side_2", + "uvlock": true, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence/mine/mining_fence_side_3", + "uvlock": true, + "y": 90 + } + ], + "when": { + "east": "true" + } + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/mining_fence_gate.json b/src/generated/resources/assets/twilightforest/blockstates/mining_fence_gate.json new file mode 100644 index 0000000000..80669da68f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/mining_fence_gate.json @@ -0,0 +1,372 @@ +{ + "variants": { + "facing=east,in_wall=false,open=false": [ + { + "model": "twilightforest:block/wood/fence_gate/mine/mining_fence_gate", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/mine/mining_fence_gate_1", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/mine/mining_fence_gate_2", + "uvlock": true, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/mine/mining_fence_gate_3", + "uvlock": true, + "y": 270 + } + ], + "facing=east,in_wall=false,open=true": [ + { + "model": "twilightforest:block/wood/fence_gate/mine/mining_fence_gate_open", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/mine/mining_fence_gate_open_1", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/mine/mining_fence_gate_open_2", + "uvlock": true, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/mine/mining_fence_gate_open_3", + "uvlock": true, + "y": 270 + } + ], + "facing=east,in_wall=true,open=false": [ + { + "model": "twilightforest:block/wood/fence_gate/mine/mining_fence_gate_wall", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/mine/mining_fence_gate_wall_1", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/mine/mining_fence_gate_wall_2", + "uvlock": true, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/mine/mining_fence_gate_wall_3", + "uvlock": true, + "y": 270 + } + ], + "facing=east,in_wall=true,open=true": [ + { + "model": "twilightforest:block/wood/fence_gate/mine/mining_fence_gate_wall_open", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/mine/mining_fence_gate_wall_open_1", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/mine/mining_fence_gate_wall_open_2", + "uvlock": true, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/mine/mining_fence_gate_wall_open_3", + "uvlock": true, + "y": 270 + } + ], + "facing=north,in_wall=false,open=false": [ + { + "model": "twilightforest:block/wood/fence_gate/mine/mining_fence_gate", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/mine/mining_fence_gate_1", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/mine/mining_fence_gate_2", + "uvlock": true, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/mine/mining_fence_gate_3", + "uvlock": true, + "y": 180 + } + ], + "facing=north,in_wall=false,open=true": [ + { + "model": "twilightforest:block/wood/fence_gate/mine/mining_fence_gate_open", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/mine/mining_fence_gate_open_1", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/mine/mining_fence_gate_open_2", + "uvlock": true, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/mine/mining_fence_gate_open_3", + "uvlock": true, + "y": 180 + } + ], + "facing=north,in_wall=true,open=false": [ + { + "model": "twilightforest:block/wood/fence_gate/mine/mining_fence_gate_wall", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/mine/mining_fence_gate_wall_1", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/mine/mining_fence_gate_wall_2", + "uvlock": true, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/mine/mining_fence_gate_wall_3", + "uvlock": true, + "y": 180 + } + ], + "facing=north,in_wall=true,open=true": [ + { + "model": "twilightforest:block/wood/fence_gate/mine/mining_fence_gate_wall_open", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/mine/mining_fence_gate_wall_open_1", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/mine/mining_fence_gate_wall_open_2", + "uvlock": true, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/mine/mining_fence_gate_wall_open_3", + "uvlock": true, + "y": 180 + } + ], + "facing=south,in_wall=false,open=false": [ + { + "model": "twilightforest:block/wood/fence_gate/mine/mining_fence_gate", + "uvlock": true, + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence_gate/mine/mining_fence_gate_1", + "uvlock": true, + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence_gate/mine/mining_fence_gate_2", + "uvlock": true + }, + { + "model": "twilightforest:block/wood/fence_gate/mine/mining_fence_gate_3", + "uvlock": true + } + ], + "facing=south,in_wall=false,open=true": [ + { + "model": "twilightforest:block/wood/fence_gate/mine/mining_fence_gate_open", + "uvlock": true, + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence_gate/mine/mining_fence_gate_open_1", + "uvlock": true, + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence_gate/mine/mining_fence_gate_open_2", + "uvlock": true + }, + { + "model": "twilightforest:block/wood/fence_gate/mine/mining_fence_gate_open_3", + "uvlock": true + } + ], + "facing=south,in_wall=true,open=false": [ + { + "model": "twilightforest:block/wood/fence_gate/mine/mining_fence_gate_wall", + "uvlock": true, + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence_gate/mine/mining_fence_gate_wall_1", + "uvlock": true, + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence_gate/mine/mining_fence_gate_wall_2", + "uvlock": true + }, + { + "model": "twilightforest:block/wood/fence_gate/mine/mining_fence_gate_wall_3", + "uvlock": true + } + ], + "facing=south,in_wall=true,open=true": [ + { + "model": "twilightforest:block/wood/fence_gate/mine/mining_fence_gate_wall_open", + "uvlock": true, + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence_gate/mine/mining_fence_gate_wall_open_1", + "uvlock": true, + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence_gate/mine/mining_fence_gate_wall_open_2", + "uvlock": true + }, + { + "model": "twilightforest:block/wood/fence_gate/mine/mining_fence_gate_wall_open_3", + "uvlock": true + } + ], + "facing=west,in_wall=false,open=false": [ + { + "model": "twilightforest:block/wood/fence_gate/mine/mining_fence_gate", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/mine/mining_fence_gate_1", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/mine/mining_fence_gate_2", + "uvlock": true, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/mine/mining_fence_gate_3", + "uvlock": true, + "y": 90 + } + ], + "facing=west,in_wall=false,open=true": [ + { + "model": "twilightforest:block/wood/fence_gate/mine/mining_fence_gate_open", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/mine/mining_fence_gate_open_1", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/mine/mining_fence_gate_open_2", + "uvlock": true, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/mine/mining_fence_gate_open_3", + "uvlock": true, + "y": 90 + } + ], + "facing=west,in_wall=true,open=false": [ + { + "model": "twilightforest:block/wood/fence_gate/mine/mining_fence_gate_wall", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/mine/mining_fence_gate_wall_1", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/mine/mining_fence_gate_wall_2", + "uvlock": true, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/mine/mining_fence_gate_wall_3", + "uvlock": true, + "y": 90 + } + ], + "facing=west,in_wall=true,open=true": [ + { + "model": "twilightforest:block/wood/fence_gate/mine/mining_fence_gate_wall_open", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/mine/mining_fence_gate_wall_open_1", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/mine/mining_fence_gate_wall_open_2", + "uvlock": true, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/mine/mining_fence_gate_wall_open_3", + "uvlock": true, + "y": 90 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/mining_leaves.json b/src/generated/resources/assets/twilightforest/blockstates/mining_leaves.json new file mode 100644 index 0000000000..869eb33ce9 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/mining_leaves.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/mining_leaves" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/mining_log.json b/src/generated/resources/assets/twilightforest/blockstates/mining_log.json new file mode 100644 index 0000000000..04a2f3a819 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/mining_log.json @@ -0,0 +1,16 @@ +{ + "variants": { + "axis=x": { + "model": "twilightforest:block/mining_log_horizontal", + "x": 90, + "y": 90 + }, + "axis=y": { + "model": "twilightforest:block/mining_log" + }, + "axis=z": { + "model": "twilightforest:block/mining_log_horizontal", + "x": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/mining_log_core.json b/src/generated/resources/assets/twilightforest/blockstates/mining_log_core.json new file mode 100644 index 0000000000..77570fcbb0 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/mining_log_core.json @@ -0,0 +1,28 @@ +{ + "variants": { + "active=false,axis=x": { + "model": "twilightforest:block/mining_log_core", + "x": 90, + "y": 90 + }, + "active=false,axis=y": { + "model": "twilightforest:block/mining_log_core" + }, + "active=false,axis=z": { + "model": "twilightforest:block/mining_log_core", + "x": 90 + }, + "active=true,axis=x": { + "model": "twilightforest:block/mining_log_core_on", + "x": 90, + "y": 90 + }, + "active=true,axis=y": { + "model": "twilightforest:block/mining_log_core_on" + }, + "active=true,axis=z": { + "model": "twilightforest:block/mining_log_core_on", + "x": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/mining_planks.json b/src/generated/resources/assets/twilightforest/blockstates/mining_planks.json new file mode 100644 index 0000000000..6f91fed996 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/mining_planks.json @@ -0,0 +1,20 @@ +{ + "variants": { + "": [ + { + "model": "twilightforest:block/wood/planks/mine/mining_planks", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/planks/mine/mining_planks_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/planks/mine/mining_planks_2" + }, + { + "model": "twilightforest:block/wood/planks/mine/mining_planks_3" + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/mining_pressure_plate.json b/src/generated/resources/assets/twilightforest/blockstates/mining_pressure_plate.json new file mode 100644 index 0000000000..63f95a8ab2 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/mining_pressure_plate.json @@ -0,0 +1,36 @@ +{ + "variants": { + "powered=false": [ + { + "model": "twilightforest:block/wood/pressure_plate/mine/mining_pressure_plate", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/pressure_plate/mine/mining_pressure_plate_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/pressure_plate/mine/mining_pressure_plate_2" + }, + { + "model": "twilightforest:block/wood/pressure_plate/mine/mining_pressure_plate_3" + } + ], + "powered=true": [ + { + "model": "twilightforest:block/wood/pressure_plate/mine/mining_pressure_plate_down", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/pressure_plate/mine/mining_pressure_plate_down_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/pressure_plate/mine/mining_pressure_plate_down_2" + }, + { + "model": "twilightforest:block/wood/pressure_plate/mine/mining_pressure_plate_down_3" + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/mining_sapling.json b/src/generated/resources/assets/twilightforest/blockstates/mining_sapling.json new file mode 100644 index 0000000000..d50a75380e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/mining_sapling.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/mining_sapling" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/mining_sign.json b/src/generated/resources/assets/twilightforest/blockstates/mining_sign.json new file mode 100644 index 0000000000..207b4d5c2c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/mining_sign.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/mining_sign" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/mining_slab.json b/src/generated/resources/assets/twilightforest/blockstates/mining_slab.json new file mode 100644 index 0000000000..5f979aaf3b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/mining_slab.json @@ -0,0 +1,60 @@ +{ + "variants": { + "type=bottom": [ + { + "model": "twilightforest:block/wood/slab/mine/mining_slab", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/slab/mine/mining_slab_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/slab/mine/mining_slab_2" + }, + { + "model": "twilightforest:block/wood/slab/mine/mining_slab_3" + } + ], + "type=double": [ + { + "model": "twilightforest:block/wood/planks/mine/mining_planks", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/planks/mine/mining_planks_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/planks/mine/mining_planks_2" + }, + { + "model": "twilightforest:block/wood/planks/mine/mining_planks_3" + } + ], + "type=top": [ + { + "model": "twilightforest:block/wood/slab/mine/mining_slab", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/slab/mine/mining_slab_1", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/slab/mine/mining_slab_2", + "uvlock": true, + "x": 180 + }, + { + "model": "twilightforest:block/wood/slab/mine/mining_slab_3", + "uvlock": true, + "x": 180 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/mining_stairs.json b/src/generated/resources/assets/twilightforest/blockstates/mining_stairs.json new file mode 100644 index 0000000000..dc989f10d2 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/mining_stairs.json @@ -0,0 +1,984 @@ +{ + "variants": { + "facing=east,half=bottom,shape=inner_left": [ + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_inner", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_inner_1", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_inner_2", + "uvlock": true, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_inner_3", + "uvlock": true, + "y": 270 + } + ], + "facing=east,half=bottom,shape=inner_right": [ + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_inner", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_inner_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_inner_2" + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_inner_3" + } + ], + "facing=east,half=bottom,shape=outer_left": [ + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_outer", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_outer_1", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_outer_2", + "uvlock": true, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_outer_3", + "uvlock": true, + "y": 270 + } + ], + "facing=east,half=bottom,shape=outer_right": [ + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_outer", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_outer_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_outer_2" + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_outer_3" + } + ], + "facing=east,half=bottom,shape=straight": [ + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_2" + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_3" + } + ], + "facing=east,half=top,shape=inner_left": [ + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_inner", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_inner_1", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_inner_2", + "uvlock": true, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_inner_3", + "uvlock": true, + "x": 180 + } + ], + "facing=east,half=top,shape=inner_right": [ + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_inner", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_inner_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_inner_2", + "uvlock": true, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_inner_3", + "uvlock": true, + "x": 180, + "y": 90 + } + ], + "facing=east,half=top,shape=outer_left": [ + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_outer", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_outer_1", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_outer_2", + "uvlock": true, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_outer_3", + "uvlock": true, + "x": 180 + } + ], + "facing=east,half=top,shape=outer_right": [ + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_outer", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_outer_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_outer_2", + "uvlock": true, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_outer_3", + "uvlock": true, + "x": 180, + "y": 90 + } + ], + "facing=east,half=top,shape=straight": [ + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_1", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_2", + "uvlock": true, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_3", + "uvlock": true, + "x": 180 + } + ], + "facing=north,half=bottom,shape=inner_left": [ + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_inner", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_inner_1", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_inner_2", + "uvlock": true, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_inner_3", + "uvlock": true, + "y": 180 + } + ], + "facing=north,half=bottom,shape=inner_right": [ + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_inner", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_inner_1", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_inner_2", + "uvlock": true, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_inner_3", + "uvlock": true, + "y": 270 + } + ], + "facing=north,half=bottom,shape=outer_left": [ + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_outer", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_outer_1", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_outer_2", + "uvlock": true, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_outer_3", + "uvlock": true, + "y": 180 + } + ], + "facing=north,half=bottom,shape=outer_right": [ + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_outer", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_outer_1", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_outer_2", + "uvlock": true, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_outer_3", + "uvlock": true, + "y": 270 + } + ], + "facing=north,half=bottom,shape=straight": [ + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_1", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_2", + "uvlock": true, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_3", + "uvlock": true, + "y": 270 + } + ], + "facing=north,half=top,shape=inner_left": [ + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_inner", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_inner_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_inner_2", + "uvlock": true, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_inner_3", + "uvlock": true, + "x": 180, + "y": 270 + } + ], + "facing=north,half=top,shape=inner_right": [ + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_inner", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_inner_1", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_inner_2", + "uvlock": true, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_inner_3", + "uvlock": true, + "x": 180 + } + ], + "facing=north,half=top,shape=outer_left": [ + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_outer", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_outer_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_outer_2", + "uvlock": true, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_outer_3", + "uvlock": true, + "x": 180, + "y": 270 + } + ], + "facing=north,half=top,shape=outer_right": [ + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_outer", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_outer_1", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_outer_2", + "uvlock": true, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_outer_3", + "uvlock": true, + "x": 180 + } + ], + "facing=north,half=top,shape=straight": [ + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_2", + "uvlock": true, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_3", + "uvlock": true, + "x": 180, + "y": 270 + } + ], + "facing=south,half=bottom,shape=inner_left": [ + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_inner", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_inner_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_inner_2" + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_inner_3" + } + ], + "facing=south,half=bottom,shape=inner_right": [ + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_inner", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_inner_1", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_inner_2", + "uvlock": true, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_inner_3", + "uvlock": true, + "y": 90 + } + ], + "facing=south,half=bottom,shape=outer_left": [ + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_outer", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_outer_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_outer_2" + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_outer_3" + } + ], + "facing=south,half=bottom,shape=outer_right": [ + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_outer", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_outer_1", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_outer_2", + "uvlock": true, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_outer_3", + "uvlock": true, + "y": 90 + } + ], + "facing=south,half=bottom,shape=straight": [ + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_1", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_2", + "uvlock": true, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_3", + "uvlock": true, + "y": 90 + } + ], + "facing=south,half=top,shape=inner_left": [ + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_inner", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_inner_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_inner_2", + "uvlock": true, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_inner_3", + "uvlock": true, + "x": 180, + "y": 90 + } + ], + "facing=south,half=top,shape=inner_right": [ + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_inner", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_inner_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_inner_2", + "uvlock": true, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_inner_3", + "uvlock": true, + "x": 180, + "y": 180 + } + ], + "facing=south,half=top,shape=outer_left": [ + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_outer", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_outer_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_outer_2", + "uvlock": true, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_outer_3", + "uvlock": true, + "x": 180, + "y": 90 + } + ], + "facing=south,half=top,shape=outer_right": [ + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_outer", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_outer_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_outer_2", + "uvlock": true, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_outer_3", + "uvlock": true, + "x": 180, + "y": 180 + } + ], + "facing=south,half=top,shape=straight": [ + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_2", + "uvlock": true, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_3", + "uvlock": true, + "x": 180, + "y": 90 + } + ], + "facing=west,half=bottom,shape=inner_left": [ + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_inner", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_inner_1", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_inner_2", + "uvlock": true, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_inner_3", + "uvlock": true, + "y": 90 + } + ], + "facing=west,half=bottom,shape=inner_right": [ + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_inner", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_inner_1", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_inner_2", + "uvlock": true, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_inner_3", + "uvlock": true, + "y": 180 + } + ], + "facing=west,half=bottom,shape=outer_left": [ + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_outer", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_outer_1", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_outer_2", + "uvlock": true, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_outer_3", + "uvlock": true, + "y": 90 + } + ], + "facing=west,half=bottom,shape=outer_right": [ + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_outer", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_outer_1", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_outer_2", + "uvlock": true, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_outer_3", + "uvlock": true, + "y": 180 + } + ], + "facing=west,half=bottom,shape=straight": [ + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_1", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_2", + "uvlock": true, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_3", + "uvlock": true, + "y": 180 + } + ], + "facing=west,half=top,shape=inner_left": [ + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_inner", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_inner_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_inner_2", + "uvlock": true, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_inner_3", + "uvlock": true, + "x": 180, + "y": 180 + } + ], + "facing=west,half=top,shape=inner_right": [ + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_inner", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_inner_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_inner_2", + "uvlock": true, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_inner_3", + "uvlock": true, + "x": 180, + "y": 270 + } + ], + "facing=west,half=top,shape=outer_left": [ + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_outer", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_outer_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_outer_2", + "uvlock": true, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_outer_3", + "uvlock": true, + "x": 180, + "y": 180 + } + ], + "facing=west,half=top,shape=outer_right": [ + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_outer", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_outer_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_outer_2", + "uvlock": true, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_outer_3", + "uvlock": true, + "x": 180, + "y": 270 + } + ], + "facing=west,half=top,shape=straight": [ + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_2", + "uvlock": true, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/mine/mining_stairs_3", + "uvlock": true, + "x": 180, + "y": 180 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/mining_trapdoor.json b/src/generated/resources/assets/twilightforest/blockstates/mining_trapdoor.json new file mode 100644 index 0000000000..3ed5c52225 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/mining_trapdoor.json @@ -0,0 +1,68 @@ +{ + "variants": { + "facing=east,half=bottom,open=false": { + "model": "twilightforest:block/wood/trapdoor/mine/mine_trapdoor_bottom", + "y": 90 + }, + "facing=east,half=bottom,open=true": { + "model": "twilightforest:block/wood/trapdoor/mine/mine_trapdoor_open", + "y": 90 + }, + "facing=east,half=top,open=false": { + "model": "twilightforest:block/wood/trapdoor/mine/mine_trapdoor_top", + "y": 90 + }, + "facing=east,half=top,open=true": { + "model": "twilightforest:block/wood/trapdoor/mine/mine_trapdoor_open", + "x": 180, + "y": 270 + }, + "facing=north,half=bottom,open=false": { + "model": "twilightforest:block/wood/trapdoor/mine/mine_trapdoor_bottom" + }, + "facing=north,half=bottom,open=true": { + "model": "twilightforest:block/wood/trapdoor/mine/mine_trapdoor_open" + }, + "facing=north,half=top,open=false": { + "model": "twilightforest:block/wood/trapdoor/mine/mine_trapdoor_top" + }, + "facing=north,half=top,open=true": { + "model": "twilightforest:block/wood/trapdoor/mine/mine_trapdoor_open", + "x": 180, + "y": 180 + }, + "facing=south,half=bottom,open=false": { + "model": "twilightforest:block/wood/trapdoor/mine/mine_trapdoor_bottom", + "y": 180 + }, + "facing=south,half=bottom,open=true": { + "model": "twilightforest:block/wood/trapdoor/mine/mine_trapdoor_open", + "y": 180 + }, + "facing=south,half=top,open=false": { + "model": "twilightforest:block/wood/trapdoor/mine/mine_trapdoor_top", + "y": 180 + }, + "facing=south,half=top,open=true": { + "model": "twilightforest:block/wood/trapdoor/mine/mine_trapdoor_open", + "x": 180 + }, + "facing=west,half=bottom,open=false": { + "model": "twilightforest:block/wood/trapdoor/mine/mine_trapdoor_bottom", + "y": 270 + }, + "facing=west,half=bottom,open=true": { + "model": "twilightforest:block/wood/trapdoor/mine/mine_trapdoor_open", + "y": 270 + }, + "facing=west,half=top,open=false": { + "model": "twilightforest:block/wood/trapdoor/mine/mine_trapdoor_top", + "y": 270 + }, + "facing=west,half=top,open=true": { + "model": "twilightforest:block/wood/trapdoor/mine/mine_trapdoor_open", + "x": 180, + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/mining_wall_sign.json b/src/generated/resources/assets/twilightforest/blockstates/mining_wall_sign.json new file mode 100644 index 0000000000..0e5eda3026 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/mining_wall_sign.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/mining_wall_sign" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/mining_wood.json b/src/generated/resources/assets/twilightforest/blockstates/mining_wood.json new file mode 100644 index 0000000000..66e3fb9e6e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/mining_wood.json @@ -0,0 +1,16 @@ +{ + "variants": { + "axis=x": { + "model": "twilightforest:block/mining_wood_horizontal", + "x": 90, + "y": 90 + }, + "axis=y": { + "model": "twilightforest:block/mining_wood" + }, + "axis=z": { + "model": "twilightforest:block/mining_wood_horizontal", + "x": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/minoshroom_boss_spawner.json b/src/generated/resources/assets/twilightforest/blockstates/minoshroom_boss_spawner.json new file mode 100644 index 0000000000..fab51f8dc9 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/minoshroom_boss_spawner.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/boss_spawner" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/minoshroom_trophy.json b/src/generated/resources/assets/twilightforest/blockstates/minoshroom_trophy.json new file mode 100644 index 0000000000..3951e3eea5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/minoshroom_trophy.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "minecraft:block/skull" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/minoshroom_wall_trophy.json b/src/generated/resources/assets/twilightforest/blockstates/minoshroom_wall_trophy.json new file mode 100644 index 0000000000..3951e3eea5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/minoshroom_wall_trophy.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "minecraft:block/skull" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/moonworm.json b/src/generated/resources/assets/twilightforest/blockstates/moonworm.json new file mode 100644 index 0000000000..0de856876a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/moonworm.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/moonworm" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/moss_patch.json b/src/generated/resources/assets/twilightforest/blockstates/moss_patch.json new file mode 100644 index 0000000000..4ac5897356 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/moss_patch.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/moss_patch" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/mossy_castle_brick.json b/src/generated/resources/assets/twilightforest/blockstates/mossy_castle_brick.json new file mode 100644 index 0000000000..9ac525262c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/mossy_castle_brick.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/mossy_castle_brick" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/mossy_castle_brick_stairs.json b/src/generated/resources/assets/twilightforest/blockstates/mossy_castle_brick_stairs.json new file mode 100644 index 0000000000..00b2201141 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/mossy_castle_brick_stairs.json @@ -0,0 +1,209 @@ +{ + "variants": { + "facing=east,half=bottom,shape=inner_left": { + "model": "twilightforest:block/mossy_castle_brick_stairs_inner", + "uvlock": true, + "y": 270 + }, + "facing=east,half=bottom,shape=inner_right": { + "model": "twilightforest:block/mossy_castle_brick_stairs_inner" + }, + "facing=east,half=bottom,shape=outer_left": { + "model": "twilightforest:block/mossy_castle_brick_stairs_outer", + "uvlock": true, + "y": 270 + }, + "facing=east,half=bottom,shape=outer_right": { + "model": "twilightforest:block/mossy_castle_brick_stairs_outer" + }, + "facing=east,half=bottom,shape=straight": { + "model": "twilightforest:block/mossy_castle_brick_stairs" + }, + "facing=east,half=top,shape=inner_left": { + "model": "twilightforest:block/mossy_castle_brick_stairs_inner", + "uvlock": true, + "x": 180 + }, + "facing=east,half=top,shape=inner_right": { + "model": "twilightforest:block/mossy_castle_brick_stairs_inner", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=east,half=top,shape=outer_left": { + "model": "twilightforest:block/mossy_castle_brick_stairs_outer", + "uvlock": true, + "x": 180 + }, + "facing=east,half=top,shape=outer_right": { + "model": "twilightforest:block/mossy_castle_brick_stairs_outer", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=east,half=top,shape=straight": { + "model": "twilightforest:block/mossy_castle_brick_stairs", + "uvlock": true, + "x": 180 + }, + "facing=north,half=bottom,shape=inner_left": { + "model": "twilightforest:block/mossy_castle_brick_stairs_inner", + "uvlock": true, + "y": 180 + }, + "facing=north,half=bottom,shape=inner_right": { + "model": "twilightforest:block/mossy_castle_brick_stairs_inner", + "uvlock": true, + "y": 270 + }, + "facing=north,half=bottom,shape=outer_left": { + "model": "twilightforest:block/mossy_castle_brick_stairs_outer", + "uvlock": true, + "y": 180 + }, + "facing=north,half=bottom,shape=outer_right": { + "model": "twilightforest:block/mossy_castle_brick_stairs_outer", + "uvlock": true, + "y": 270 + }, + "facing=north,half=bottom,shape=straight": { + "model": "twilightforest:block/mossy_castle_brick_stairs", + "uvlock": true, + "y": 270 + }, + "facing=north,half=top,shape=inner_left": { + "model": "twilightforest:block/mossy_castle_brick_stairs_inner", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=north,half=top,shape=inner_right": { + "model": "twilightforest:block/mossy_castle_brick_stairs_inner", + "uvlock": true, + "x": 180 + }, + "facing=north,half=top,shape=outer_left": { + "model": "twilightforest:block/mossy_castle_brick_stairs_outer", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=north,half=top,shape=outer_right": { + "model": "twilightforest:block/mossy_castle_brick_stairs_outer", + "uvlock": true, + "x": 180 + }, + "facing=north,half=top,shape=straight": { + "model": "twilightforest:block/mossy_castle_brick_stairs", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=south,half=bottom,shape=inner_left": { + "model": "twilightforest:block/mossy_castle_brick_stairs_inner" + }, + "facing=south,half=bottom,shape=inner_right": { + "model": "twilightforest:block/mossy_castle_brick_stairs_inner", + "uvlock": true, + "y": 90 + }, + "facing=south,half=bottom,shape=outer_left": { + "model": "twilightforest:block/mossy_castle_brick_stairs_outer" + }, + "facing=south,half=bottom,shape=outer_right": { + "model": "twilightforest:block/mossy_castle_brick_stairs_outer", + "uvlock": true, + "y": 90 + }, + "facing=south,half=bottom,shape=straight": { + "model": "twilightforest:block/mossy_castle_brick_stairs", + "uvlock": true, + "y": 90 + }, + "facing=south,half=top,shape=inner_left": { + "model": "twilightforest:block/mossy_castle_brick_stairs_inner", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=south,half=top,shape=inner_right": { + "model": "twilightforest:block/mossy_castle_brick_stairs_inner", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=south,half=top,shape=outer_left": { + "model": "twilightforest:block/mossy_castle_brick_stairs_outer", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=south,half=top,shape=outer_right": { + "model": "twilightforest:block/mossy_castle_brick_stairs_outer", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=south,half=top,shape=straight": { + "model": "twilightforest:block/mossy_castle_brick_stairs", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=west,half=bottom,shape=inner_left": { + "model": "twilightforest:block/mossy_castle_brick_stairs_inner", + "uvlock": true, + "y": 90 + }, + "facing=west,half=bottom,shape=inner_right": { + "model": "twilightforest:block/mossy_castle_brick_stairs_inner", + "uvlock": true, + "y": 180 + }, + "facing=west,half=bottom,shape=outer_left": { + "model": "twilightforest:block/mossy_castle_brick_stairs_outer", + "uvlock": true, + "y": 90 + }, + "facing=west,half=bottom,shape=outer_right": { + "model": "twilightforest:block/mossy_castle_brick_stairs_outer", + "uvlock": true, + "y": 180 + }, + "facing=west,half=bottom,shape=straight": { + "model": "twilightforest:block/mossy_castle_brick_stairs", + "uvlock": true, + "y": 180 + }, + "facing=west,half=top,shape=inner_left": { + "model": "twilightforest:block/mossy_castle_brick_stairs_inner", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=west,half=top,shape=inner_right": { + "model": "twilightforest:block/mossy_castle_brick_stairs_inner", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=west,half=top,shape=outer_left": { + "model": "twilightforest:block/mossy_castle_brick_stairs_outer", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=west,half=top,shape=outer_right": { + "model": "twilightforest:block/mossy_castle_brick_stairs_outer", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=west,half=top,shape=straight": { + "model": "twilightforest:block/mossy_castle_brick_stairs", + "uvlock": true, + "x": 180, + "y": 180 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/mossy_etched_nagastone.json b/src/generated/resources/assets/twilightforest/blockstates/mossy_etched_nagastone.json new file mode 100644 index 0000000000..0666ba4d18 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/mossy_etched_nagastone.json @@ -0,0 +1,22 @@ +{ + "variants": { + "facing=down": { + "model": "twilightforest:block/mossy_etched_nagastone" + }, + "facing=east": { + "model": "twilightforest:block/mossy_etched_nagastone_east" + }, + "facing=north": { + "model": "twilightforest:block/mossy_etched_nagastone_north" + }, + "facing=south": { + "model": "twilightforest:block/mossy_etched_nagastone_south" + }, + "facing=up": { + "model": "twilightforest:block/mossy_etched_nagastone_up" + }, + "facing=west": { + "model": "twilightforest:block/mossy_etched_nagastone_west" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/mossy_mazestone.json b/src/generated/resources/assets/twilightforest/blockstates/mossy_mazestone.json new file mode 100644 index 0000000000..61311cd0a0 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/mossy_mazestone.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/mossy_mazestone" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/mossy_nagastone_pillar.json b/src/generated/resources/assets/twilightforest/blockstates/mossy_nagastone_pillar.json new file mode 100644 index 0000000000..7ccb81fcd1 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/mossy_nagastone_pillar.json @@ -0,0 +1,28 @@ +{ + "variants": { + "axis=x,reversed=false": { + "model": "twilightforest:block/mossy_nagastone_pillar", + "x": 270, + "y": 270 + }, + "axis=x,reversed=true": { + "model": "twilightforest:block/mossy_nagastone_pillar_reversed", + "x": 270, + "y": 270 + }, + "axis=y,reversed=false": { + "model": "twilightforest:block/mossy_nagastone_pillar" + }, + "axis=y,reversed=true": { + "model": "twilightforest:block/mossy_nagastone_pillar_reversed" + }, + "axis=z,reversed=false": { + "model": "twilightforest:block/mossy_nagastone_pillar", + "x": 270 + }, + "axis=z,reversed=true": { + "model": "twilightforest:block/mossy_nagastone_pillar_reversed", + "x": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/mossy_nagastone_stairs_left.json b/src/generated/resources/assets/twilightforest/blockstates/mossy_nagastone_stairs_left.json new file mode 100644 index 0000000000..0370ed5eae --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/mossy_nagastone_stairs_left.json @@ -0,0 +1,209 @@ +{ + "variants": { + "facing=east,half=bottom,shape=inner_left": { + "model": "twilightforest:block/mossy_nagastone_stairs_left_inner", + "uvlock": true, + "y": 270 + }, + "facing=east,half=bottom,shape=inner_right": { + "model": "twilightforest:block/mossy_nagastone_stairs_left_inner" + }, + "facing=east,half=bottom,shape=outer_left": { + "model": "twilightforest:block/mossy_nagastone_stairs_left_outer", + "uvlock": true, + "y": 270 + }, + "facing=east,half=bottom,shape=outer_right": { + "model": "twilightforest:block/mossy_nagastone_stairs_left_outer" + }, + "facing=east,half=bottom,shape=straight": { + "model": "twilightforest:block/mossy_nagastone_stairs_left" + }, + "facing=east,half=top,shape=inner_left": { + "model": "twilightforest:block/mossy_nagastone_stairs_left_inner", + "uvlock": true, + "x": 180 + }, + "facing=east,half=top,shape=inner_right": { + "model": "twilightforest:block/mossy_nagastone_stairs_left_inner", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=east,half=top,shape=outer_left": { + "model": "twilightforest:block/mossy_nagastone_stairs_left_outer", + "uvlock": true, + "x": 180 + }, + "facing=east,half=top,shape=outer_right": { + "model": "twilightforest:block/mossy_nagastone_stairs_left_outer", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=east,half=top,shape=straight": { + "model": "twilightforest:block/mossy_nagastone_stairs_left", + "uvlock": true, + "x": 180 + }, + "facing=north,half=bottom,shape=inner_left": { + "model": "twilightforest:block/mossy_nagastone_stairs_left_inner", + "uvlock": true, + "y": 180 + }, + "facing=north,half=bottom,shape=inner_right": { + "model": "twilightforest:block/mossy_nagastone_stairs_left_inner", + "uvlock": true, + "y": 270 + }, + "facing=north,half=bottom,shape=outer_left": { + "model": "twilightforest:block/mossy_nagastone_stairs_left_outer", + "uvlock": true, + "y": 180 + }, + "facing=north,half=bottom,shape=outer_right": { + "model": "twilightforest:block/mossy_nagastone_stairs_left_outer", + "uvlock": true, + "y": 270 + }, + "facing=north,half=bottom,shape=straight": { + "model": "twilightforest:block/mossy_nagastone_stairs_left", + "uvlock": true, + "y": 270 + }, + "facing=north,half=top,shape=inner_left": { + "model": "twilightforest:block/mossy_nagastone_stairs_left_inner", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=north,half=top,shape=inner_right": { + "model": "twilightforest:block/mossy_nagastone_stairs_left_inner", + "uvlock": true, + "x": 180 + }, + "facing=north,half=top,shape=outer_left": { + "model": "twilightforest:block/mossy_nagastone_stairs_left_outer", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=north,half=top,shape=outer_right": { + "model": "twilightforest:block/mossy_nagastone_stairs_left_outer", + "uvlock": true, + "x": 180 + }, + "facing=north,half=top,shape=straight": { + "model": "twilightforest:block/mossy_nagastone_stairs_left", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=south,half=bottom,shape=inner_left": { + "model": "twilightforest:block/mossy_nagastone_stairs_left_inner" + }, + "facing=south,half=bottom,shape=inner_right": { + "model": "twilightforest:block/mossy_nagastone_stairs_left_inner", + "uvlock": true, + "y": 90 + }, + "facing=south,half=bottom,shape=outer_left": { + "model": "twilightforest:block/mossy_nagastone_stairs_left_outer" + }, + "facing=south,half=bottom,shape=outer_right": { + "model": "twilightforest:block/mossy_nagastone_stairs_left_outer", + "uvlock": true, + "y": 90 + }, + "facing=south,half=bottom,shape=straight": { + "model": "twilightforest:block/mossy_nagastone_stairs_left", + "uvlock": true, + "y": 90 + }, + "facing=south,half=top,shape=inner_left": { + "model": "twilightforest:block/mossy_nagastone_stairs_left_inner", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=south,half=top,shape=inner_right": { + "model": "twilightforest:block/mossy_nagastone_stairs_left_inner", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=south,half=top,shape=outer_left": { + "model": "twilightforest:block/mossy_nagastone_stairs_left_outer", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=south,half=top,shape=outer_right": { + "model": "twilightforest:block/mossy_nagastone_stairs_left_outer", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=south,half=top,shape=straight": { + "model": "twilightforest:block/mossy_nagastone_stairs_left", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=west,half=bottom,shape=inner_left": { + "model": "twilightforest:block/mossy_nagastone_stairs_left_inner", + "uvlock": true, + "y": 90 + }, + "facing=west,half=bottom,shape=inner_right": { + "model": "twilightforest:block/mossy_nagastone_stairs_left_inner", + "uvlock": true, + "y": 180 + }, + "facing=west,half=bottom,shape=outer_left": { + "model": "twilightforest:block/mossy_nagastone_stairs_left_outer", + "uvlock": true, + "y": 90 + }, + "facing=west,half=bottom,shape=outer_right": { + "model": "twilightforest:block/mossy_nagastone_stairs_left_outer", + "uvlock": true, + "y": 180 + }, + "facing=west,half=bottom,shape=straight": { + "model": "twilightforest:block/mossy_nagastone_stairs_left", + "uvlock": true, + "y": 180 + }, + "facing=west,half=top,shape=inner_left": { + "model": "twilightforest:block/mossy_nagastone_stairs_left_inner", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=west,half=top,shape=inner_right": { + "model": "twilightforest:block/mossy_nagastone_stairs_left_inner", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=west,half=top,shape=outer_left": { + "model": "twilightforest:block/mossy_nagastone_stairs_left_outer", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=west,half=top,shape=outer_right": { + "model": "twilightforest:block/mossy_nagastone_stairs_left_outer", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=west,half=top,shape=straight": { + "model": "twilightforest:block/mossy_nagastone_stairs_left", + "uvlock": true, + "x": 180, + "y": 180 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/mossy_nagastone_stairs_right.json b/src/generated/resources/assets/twilightforest/blockstates/mossy_nagastone_stairs_right.json new file mode 100644 index 0000000000..ae73fc6b8c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/mossy_nagastone_stairs_right.json @@ -0,0 +1,209 @@ +{ + "variants": { + "facing=east,half=bottom,shape=inner_left": { + "model": "twilightforest:block/mossy_nagastone_stairs_right_inner", + "uvlock": true, + "y": 270 + }, + "facing=east,half=bottom,shape=inner_right": { + "model": "twilightforest:block/mossy_nagastone_stairs_right_inner" + }, + "facing=east,half=bottom,shape=outer_left": { + "model": "twilightforest:block/mossy_nagastone_stairs_right_outer", + "uvlock": true, + "y": 270 + }, + "facing=east,half=bottom,shape=outer_right": { + "model": "twilightforest:block/mossy_nagastone_stairs_right_outer" + }, + "facing=east,half=bottom,shape=straight": { + "model": "twilightforest:block/mossy_nagastone_stairs_right" + }, + "facing=east,half=top,shape=inner_left": { + "model": "twilightforest:block/mossy_nagastone_stairs_right_inner", + "uvlock": true, + "x": 180 + }, + "facing=east,half=top,shape=inner_right": { + "model": "twilightforest:block/mossy_nagastone_stairs_right_inner", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=east,half=top,shape=outer_left": { + "model": "twilightforest:block/mossy_nagastone_stairs_right_outer", + "uvlock": true, + "x": 180 + }, + "facing=east,half=top,shape=outer_right": { + "model": "twilightforest:block/mossy_nagastone_stairs_right_outer", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=east,half=top,shape=straight": { + "model": "twilightforest:block/mossy_nagastone_stairs_right", + "uvlock": true, + "x": 180 + }, + "facing=north,half=bottom,shape=inner_left": { + "model": "twilightforest:block/mossy_nagastone_stairs_right_inner", + "uvlock": true, + "y": 180 + }, + "facing=north,half=bottom,shape=inner_right": { + "model": "twilightforest:block/mossy_nagastone_stairs_right_inner", + "uvlock": true, + "y": 270 + }, + "facing=north,half=bottom,shape=outer_left": { + "model": "twilightforest:block/mossy_nagastone_stairs_right_outer", + "uvlock": true, + "y": 180 + }, + "facing=north,half=bottom,shape=outer_right": { + "model": "twilightforest:block/mossy_nagastone_stairs_right_outer", + "uvlock": true, + "y": 270 + }, + "facing=north,half=bottom,shape=straight": { + "model": "twilightforest:block/mossy_nagastone_stairs_right", + "uvlock": true, + "y": 270 + }, + "facing=north,half=top,shape=inner_left": { + "model": "twilightforest:block/mossy_nagastone_stairs_right_inner", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=north,half=top,shape=inner_right": { + "model": "twilightforest:block/mossy_nagastone_stairs_right_inner", + "uvlock": true, + "x": 180 + }, + "facing=north,half=top,shape=outer_left": { + "model": "twilightforest:block/mossy_nagastone_stairs_right_outer", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=north,half=top,shape=outer_right": { + "model": "twilightforest:block/mossy_nagastone_stairs_right_outer", + "uvlock": true, + "x": 180 + }, + "facing=north,half=top,shape=straight": { + "model": "twilightforest:block/mossy_nagastone_stairs_right", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=south,half=bottom,shape=inner_left": { + "model": "twilightforest:block/mossy_nagastone_stairs_right_inner" + }, + "facing=south,half=bottom,shape=inner_right": { + "model": "twilightforest:block/mossy_nagastone_stairs_right_inner", + "uvlock": true, + "y": 90 + }, + "facing=south,half=bottom,shape=outer_left": { + "model": "twilightforest:block/mossy_nagastone_stairs_right_outer" + }, + "facing=south,half=bottom,shape=outer_right": { + "model": "twilightforest:block/mossy_nagastone_stairs_right_outer", + "uvlock": true, + "y": 90 + }, + "facing=south,half=bottom,shape=straight": { + "model": "twilightforest:block/mossy_nagastone_stairs_right", + "uvlock": true, + "y": 90 + }, + "facing=south,half=top,shape=inner_left": { + "model": "twilightforest:block/mossy_nagastone_stairs_right_inner", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=south,half=top,shape=inner_right": { + "model": "twilightforest:block/mossy_nagastone_stairs_right_inner", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=south,half=top,shape=outer_left": { + "model": "twilightforest:block/mossy_nagastone_stairs_right_outer", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=south,half=top,shape=outer_right": { + "model": "twilightforest:block/mossy_nagastone_stairs_right_outer", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=south,half=top,shape=straight": { + "model": "twilightforest:block/mossy_nagastone_stairs_right", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=west,half=bottom,shape=inner_left": { + "model": "twilightforest:block/mossy_nagastone_stairs_right_inner", + "uvlock": true, + "y": 90 + }, + "facing=west,half=bottom,shape=inner_right": { + "model": "twilightforest:block/mossy_nagastone_stairs_right_inner", + "uvlock": true, + "y": 180 + }, + "facing=west,half=bottom,shape=outer_left": { + "model": "twilightforest:block/mossy_nagastone_stairs_right_outer", + "uvlock": true, + "y": 90 + }, + "facing=west,half=bottom,shape=outer_right": { + "model": "twilightforest:block/mossy_nagastone_stairs_right_outer", + "uvlock": true, + "y": 180 + }, + "facing=west,half=bottom,shape=straight": { + "model": "twilightforest:block/mossy_nagastone_stairs_right", + "uvlock": true, + "y": 180 + }, + "facing=west,half=top,shape=inner_left": { + "model": "twilightforest:block/mossy_nagastone_stairs_right_inner", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=west,half=top,shape=inner_right": { + "model": "twilightforest:block/mossy_nagastone_stairs_right_inner", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=west,half=top,shape=outer_left": { + "model": "twilightforest:block/mossy_nagastone_stairs_right_outer", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=west,half=top,shape=outer_right": { + "model": "twilightforest:block/mossy_nagastone_stairs_right_outer", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=west,half=top,shape=straight": { + "model": "twilightforest:block/mossy_nagastone_stairs_right", + "uvlock": true, + "x": 180, + "y": 180 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/mossy_towerwood.json b/src/generated/resources/assets/twilightforest/blockstates/mossy_towerwood.json new file mode 100644 index 0000000000..359cd76cd6 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/mossy_towerwood.json @@ -0,0 +1,12 @@ +{ + "variants": { + "": [ + { + "model": "twilightforest:block/mossy_towerwood" + }, + { + "model": "twilightforest:block/mossy_towerwood_flipped" + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/mossy_underbrick.json b/src/generated/resources/assets/twilightforest/blockstates/mossy_underbrick.json new file mode 100644 index 0000000000..2ffc0af535 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/mossy_underbrick.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/mossy_underbrick" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/mushgloom.json b/src/generated/resources/assets/twilightforest/blockstates/mushgloom.json new file mode 100644 index 0000000000..527e2bc657 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/mushgloom.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/mushgloom" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/naga_boss_spawner.json b/src/generated/resources/assets/twilightforest/blockstates/naga_boss_spawner.json new file mode 100644 index 0000000000..fab51f8dc9 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/naga_boss_spawner.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/boss_spawner" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/naga_courtyard_miniature_structure.json b/src/generated/resources/assets/twilightforest/blockstates/naga_courtyard_miniature_structure.json new file mode 100644 index 0000000000..4fd1c16fbb --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/naga_courtyard_miniature_structure.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/miniature/naga_courtyard" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/naga_trophy.json b/src/generated/resources/assets/twilightforest/blockstates/naga_trophy.json new file mode 100644 index 0000000000..3951e3eea5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/naga_trophy.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "minecraft:block/skull" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/naga_wall_trophy.json b/src/generated/resources/assets/twilightforest/blockstates/naga_wall_trophy.json new file mode 100644 index 0000000000..3951e3eea5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/naga_wall_trophy.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "minecraft:block/skull" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/nagastone.json b/src/generated/resources/assets/twilightforest/blockstates/nagastone.json new file mode 100644 index 0000000000..757e9e0f23 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/nagastone.json @@ -0,0 +1,47 @@ +{ + "variants": { + "variant=axis_x": { + "model": "twilightforest:block/naga_segment/horizontal" + }, + "variant=axis_y": { + "model": "twilightforest:block/naga_segment/vertical" + }, + "variant=axis_z": { + "model": "twilightforest:block/naga_segment/horizontal", + "y": 90 + }, + "variant=east_down": { + "model": "twilightforest:block/naga_segment/down" + }, + "variant=east_up": { + "model": "twilightforest:block/naga_segment/up" + }, + "variant=north_down": { + "model": "twilightforest:block/naga_segment/down", + "y": 270 + }, + "variant=north_up": { + "model": "twilightforest:block/naga_segment/up", + "y": 270 + }, + "variant=solid": { + "model": "twilightforest:block/nagastone" + }, + "variant=south_down": { + "model": "twilightforest:block/naga_segment/down", + "y": 90 + }, + "variant=south_up": { + "model": "twilightforest:block/naga_segment/up", + "y": 90 + }, + "variant=west_down": { + "model": "twilightforest:block/naga_segment/down", + "y": 180 + }, + "variant=west_up": { + "model": "twilightforest:block/naga_segment/up", + "y": 180 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/nagastone_head.json b/src/generated/resources/assets/twilightforest/blockstates/nagastone_head.json new file mode 100644 index 0000000000..3d7fd51dbf --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/nagastone_head.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "twilightforest:block/nagastone_head", + "y": 90 + }, + "facing=north": { + "model": "twilightforest:block/nagastone_head" + }, + "facing=south": { + "model": "twilightforest:block/nagastone_head", + "y": 180 + }, + "facing=west": { + "model": "twilightforest:block/nagastone_head", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/nagastone_pillar.json b/src/generated/resources/assets/twilightforest/blockstates/nagastone_pillar.json new file mode 100644 index 0000000000..11530c0e3d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/nagastone_pillar.json @@ -0,0 +1,28 @@ +{ + "variants": { + "axis=x,reversed=false": { + "model": "twilightforest:block/nagastone_pillar", + "x": 270, + "y": 270 + }, + "axis=x,reversed=true": { + "model": "twilightforest:block/nagastone_pillar_reversed", + "x": 270, + "y": 270 + }, + "axis=y,reversed=false": { + "model": "twilightforest:block/nagastone_pillar" + }, + "axis=y,reversed=true": { + "model": "twilightforest:block/nagastone_pillar_reversed" + }, + "axis=z,reversed=false": { + "model": "twilightforest:block/nagastone_pillar", + "x": 270 + }, + "axis=z,reversed=true": { + "model": "twilightforest:block/nagastone_pillar_reversed", + "x": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/nagastone_stairs_left.json b/src/generated/resources/assets/twilightforest/blockstates/nagastone_stairs_left.json new file mode 100644 index 0000000000..0d376f758e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/nagastone_stairs_left.json @@ -0,0 +1,209 @@ +{ + "variants": { + "facing=east,half=bottom,shape=inner_left": { + "model": "twilightforest:block/nagastone_stairs_left_inner", + "uvlock": true, + "y": 270 + }, + "facing=east,half=bottom,shape=inner_right": { + "model": "twilightforest:block/nagastone_stairs_left_inner" + }, + "facing=east,half=bottom,shape=outer_left": { + "model": "twilightforest:block/nagastone_stairs_left_outer", + "uvlock": true, + "y": 270 + }, + "facing=east,half=bottom,shape=outer_right": { + "model": "twilightforest:block/nagastone_stairs_left_outer" + }, + "facing=east,half=bottom,shape=straight": { + "model": "twilightforest:block/nagastone_stairs_left" + }, + "facing=east,half=top,shape=inner_left": { + "model": "twilightforest:block/nagastone_stairs_left_inner", + "uvlock": true, + "x": 180 + }, + "facing=east,half=top,shape=inner_right": { + "model": "twilightforest:block/nagastone_stairs_left_inner", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=east,half=top,shape=outer_left": { + "model": "twilightforest:block/nagastone_stairs_left_outer", + "uvlock": true, + "x": 180 + }, + "facing=east,half=top,shape=outer_right": { + "model": "twilightforest:block/nagastone_stairs_left_outer", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=east,half=top,shape=straight": { + "model": "twilightforest:block/nagastone_stairs_left", + "uvlock": true, + "x": 180 + }, + "facing=north,half=bottom,shape=inner_left": { + "model": "twilightforest:block/nagastone_stairs_left_inner", + "uvlock": true, + "y": 180 + }, + "facing=north,half=bottom,shape=inner_right": { + "model": "twilightforest:block/nagastone_stairs_left_inner", + "uvlock": true, + "y": 270 + }, + "facing=north,half=bottom,shape=outer_left": { + "model": "twilightforest:block/nagastone_stairs_left_outer", + "uvlock": true, + "y": 180 + }, + "facing=north,half=bottom,shape=outer_right": { + "model": "twilightforest:block/nagastone_stairs_left_outer", + "uvlock": true, + "y": 270 + }, + "facing=north,half=bottom,shape=straight": { + "model": "twilightforest:block/nagastone_stairs_left", + "uvlock": true, + "y": 270 + }, + "facing=north,half=top,shape=inner_left": { + "model": "twilightforest:block/nagastone_stairs_left_inner", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=north,half=top,shape=inner_right": { + "model": "twilightforest:block/nagastone_stairs_left_inner", + "uvlock": true, + "x": 180 + }, + "facing=north,half=top,shape=outer_left": { + "model": "twilightforest:block/nagastone_stairs_left_outer", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=north,half=top,shape=outer_right": { + "model": "twilightforest:block/nagastone_stairs_left_outer", + "uvlock": true, + "x": 180 + }, + "facing=north,half=top,shape=straight": { + "model": "twilightforest:block/nagastone_stairs_left", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=south,half=bottom,shape=inner_left": { + "model": "twilightforest:block/nagastone_stairs_left_inner" + }, + "facing=south,half=bottom,shape=inner_right": { + "model": "twilightforest:block/nagastone_stairs_left_inner", + "uvlock": true, + "y": 90 + }, + "facing=south,half=bottom,shape=outer_left": { + "model": "twilightforest:block/nagastone_stairs_left_outer" + }, + "facing=south,half=bottom,shape=outer_right": { + "model": "twilightforest:block/nagastone_stairs_left_outer", + "uvlock": true, + "y": 90 + }, + "facing=south,half=bottom,shape=straight": { + "model": "twilightforest:block/nagastone_stairs_left", + "uvlock": true, + "y": 90 + }, + "facing=south,half=top,shape=inner_left": { + "model": "twilightforest:block/nagastone_stairs_left_inner", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=south,half=top,shape=inner_right": { + "model": "twilightforest:block/nagastone_stairs_left_inner", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=south,half=top,shape=outer_left": { + "model": "twilightforest:block/nagastone_stairs_left_outer", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=south,half=top,shape=outer_right": { + "model": "twilightforest:block/nagastone_stairs_left_outer", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=south,half=top,shape=straight": { + "model": "twilightforest:block/nagastone_stairs_left", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=west,half=bottom,shape=inner_left": { + "model": "twilightforest:block/nagastone_stairs_left_inner", + "uvlock": true, + "y": 90 + }, + "facing=west,half=bottom,shape=inner_right": { + "model": "twilightforest:block/nagastone_stairs_left_inner", + "uvlock": true, + "y": 180 + }, + "facing=west,half=bottom,shape=outer_left": { + "model": "twilightforest:block/nagastone_stairs_left_outer", + "uvlock": true, + "y": 90 + }, + "facing=west,half=bottom,shape=outer_right": { + "model": "twilightforest:block/nagastone_stairs_left_outer", + "uvlock": true, + "y": 180 + }, + "facing=west,half=bottom,shape=straight": { + "model": "twilightforest:block/nagastone_stairs_left", + "uvlock": true, + "y": 180 + }, + "facing=west,half=top,shape=inner_left": { + "model": "twilightforest:block/nagastone_stairs_left_inner", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=west,half=top,shape=inner_right": { + "model": "twilightforest:block/nagastone_stairs_left_inner", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=west,half=top,shape=outer_left": { + "model": "twilightforest:block/nagastone_stairs_left_outer", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=west,half=top,shape=outer_right": { + "model": "twilightforest:block/nagastone_stairs_left_outer", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=west,half=top,shape=straight": { + "model": "twilightforest:block/nagastone_stairs_left", + "uvlock": true, + "x": 180, + "y": 180 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/nagastone_stairs_right.json b/src/generated/resources/assets/twilightforest/blockstates/nagastone_stairs_right.json new file mode 100644 index 0000000000..87b00de54a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/nagastone_stairs_right.json @@ -0,0 +1,209 @@ +{ + "variants": { + "facing=east,half=bottom,shape=inner_left": { + "model": "twilightforest:block/nagastone_stairs_right_inner", + "uvlock": true, + "y": 270 + }, + "facing=east,half=bottom,shape=inner_right": { + "model": "twilightforest:block/nagastone_stairs_right_inner" + }, + "facing=east,half=bottom,shape=outer_left": { + "model": "twilightforest:block/nagastone_stairs_right_outer", + "uvlock": true, + "y": 270 + }, + "facing=east,half=bottom,shape=outer_right": { + "model": "twilightforest:block/nagastone_stairs_right_outer" + }, + "facing=east,half=bottom,shape=straight": { + "model": "twilightforest:block/nagastone_stairs_right" + }, + "facing=east,half=top,shape=inner_left": { + "model": "twilightforest:block/nagastone_stairs_right_inner", + "uvlock": true, + "x": 180 + }, + "facing=east,half=top,shape=inner_right": { + "model": "twilightforest:block/nagastone_stairs_right_inner", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=east,half=top,shape=outer_left": { + "model": "twilightforest:block/nagastone_stairs_right_outer", + "uvlock": true, + "x": 180 + }, + "facing=east,half=top,shape=outer_right": { + "model": "twilightforest:block/nagastone_stairs_right_outer", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=east,half=top,shape=straight": { + "model": "twilightforest:block/nagastone_stairs_right", + "uvlock": true, + "x": 180 + }, + "facing=north,half=bottom,shape=inner_left": { + "model": "twilightforest:block/nagastone_stairs_right_inner", + "uvlock": true, + "y": 180 + }, + "facing=north,half=bottom,shape=inner_right": { + "model": "twilightforest:block/nagastone_stairs_right_inner", + "uvlock": true, + "y": 270 + }, + "facing=north,half=bottom,shape=outer_left": { + "model": "twilightforest:block/nagastone_stairs_right_outer", + "uvlock": true, + "y": 180 + }, + "facing=north,half=bottom,shape=outer_right": { + "model": "twilightforest:block/nagastone_stairs_right_outer", + "uvlock": true, + "y": 270 + }, + "facing=north,half=bottom,shape=straight": { + "model": "twilightforest:block/nagastone_stairs_right", + "uvlock": true, + "y": 270 + }, + "facing=north,half=top,shape=inner_left": { + "model": "twilightforest:block/nagastone_stairs_right_inner", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=north,half=top,shape=inner_right": { + "model": "twilightforest:block/nagastone_stairs_right_inner", + "uvlock": true, + "x": 180 + }, + "facing=north,half=top,shape=outer_left": { + "model": "twilightforest:block/nagastone_stairs_right_outer", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=north,half=top,shape=outer_right": { + "model": "twilightforest:block/nagastone_stairs_right_outer", + "uvlock": true, + "x": 180 + }, + "facing=north,half=top,shape=straight": { + "model": "twilightforest:block/nagastone_stairs_right", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=south,half=bottom,shape=inner_left": { + "model": "twilightforest:block/nagastone_stairs_right_inner" + }, + "facing=south,half=bottom,shape=inner_right": { + "model": "twilightforest:block/nagastone_stairs_right_inner", + "uvlock": true, + "y": 90 + }, + "facing=south,half=bottom,shape=outer_left": { + "model": "twilightforest:block/nagastone_stairs_right_outer" + }, + "facing=south,half=bottom,shape=outer_right": { + "model": "twilightforest:block/nagastone_stairs_right_outer", + "uvlock": true, + "y": 90 + }, + "facing=south,half=bottom,shape=straight": { + "model": "twilightforest:block/nagastone_stairs_right", + "uvlock": true, + "y": 90 + }, + "facing=south,half=top,shape=inner_left": { + "model": "twilightforest:block/nagastone_stairs_right_inner", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=south,half=top,shape=inner_right": { + "model": "twilightforest:block/nagastone_stairs_right_inner", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=south,half=top,shape=outer_left": { + "model": "twilightforest:block/nagastone_stairs_right_outer", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=south,half=top,shape=outer_right": { + "model": "twilightforest:block/nagastone_stairs_right_outer", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=south,half=top,shape=straight": { + "model": "twilightforest:block/nagastone_stairs_right", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=west,half=bottom,shape=inner_left": { + "model": "twilightforest:block/nagastone_stairs_right_inner", + "uvlock": true, + "y": 90 + }, + "facing=west,half=bottom,shape=inner_right": { + "model": "twilightforest:block/nagastone_stairs_right_inner", + "uvlock": true, + "y": 180 + }, + "facing=west,half=bottom,shape=outer_left": { + "model": "twilightforest:block/nagastone_stairs_right_outer", + "uvlock": true, + "y": 90 + }, + "facing=west,half=bottom,shape=outer_right": { + "model": "twilightforest:block/nagastone_stairs_right_outer", + "uvlock": true, + "y": 180 + }, + "facing=west,half=bottom,shape=straight": { + "model": "twilightforest:block/nagastone_stairs_right", + "uvlock": true, + "y": 180 + }, + "facing=west,half=top,shape=inner_left": { + "model": "twilightforest:block/nagastone_stairs_right_inner", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=west,half=top,shape=inner_right": { + "model": "twilightforest:block/nagastone_stairs_right_inner", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=west,half=top,shape=outer_left": { + "model": "twilightforest:block/nagastone_stairs_right_outer", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=west,half=top,shape=outer_right": { + "model": "twilightforest:block/nagastone_stairs_right_outer", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=west,half=top,shape=straight": { + "model": "twilightforest:block/nagastone_stairs_right", + "uvlock": true, + "x": 180, + "y": 180 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/oak_banister.json b/src/generated/resources/assets/twilightforest/blockstates/oak_banister.json new file mode 100644 index 0000000000..e0f4e55d77 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/oak_banister.json @@ -0,0 +1,94 @@ +{ + "variants": { + "extended=false,facing=east,shape=connected": { + "model": "twilightforest:block/wood/banister/oak/oak_banister_connected", + "y": 270 + }, + "extended=false,facing=east,shape=short": { + "model": "twilightforest:block/wood/banister/oak/oak_banister_short", + "y": 270 + }, + "extended=false,facing=east,shape=tall": { + "model": "twilightforest:block/wood/banister/oak/oak_banister_tall", + "y": 270 + }, + "extended=false,facing=north,shape=connected": { + "model": "twilightforest:block/wood/banister/oak/oak_banister_connected", + "y": 180 + }, + "extended=false,facing=north,shape=short": { + "model": "twilightforest:block/wood/banister/oak/oak_banister_short", + "y": 180 + }, + "extended=false,facing=north,shape=tall": { + "model": "twilightforest:block/wood/banister/oak/oak_banister_tall", + "y": 180 + }, + "extended=false,facing=south,shape=connected": { + "model": "twilightforest:block/wood/banister/oak/oak_banister_connected" + }, + "extended=false,facing=south,shape=short": { + "model": "twilightforest:block/wood/banister/oak/oak_banister_short" + }, + "extended=false,facing=south,shape=tall": { + "model": "twilightforest:block/wood/banister/oak/oak_banister_tall" + }, + "extended=false,facing=west,shape=connected": { + "model": "twilightforest:block/wood/banister/oak/oak_banister_connected", + "y": 90 + }, + "extended=false,facing=west,shape=short": { + "model": "twilightforest:block/wood/banister/oak/oak_banister_short", + "y": 90 + }, + "extended=false,facing=west,shape=tall": { + "model": "twilightforest:block/wood/banister/oak/oak_banister_tall", + "y": 90 + }, + "extended=true,facing=east,shape=connected": { + "model": "twilightforest:block/wood/banister/oak/oak_banister_connected_extended", + "y": 270 + }, + "extended=true,facing=east,shape=short": { + "model": "twilightforest:block/wood/banister/oak/oak_banister_short_extended", + "y": 270 + }, + "extended=true,facing=east,shape=tall": { + "model": "twilightforest:block/wood/banister/oak/oak_banister_tall_extended", + "y": 270 + }, + "extended=true,facing=north,shape=connected": { + "model": "twilightforest:block/wood/banister/oak/oak_banister_connected_extended", + "y": 180 + }, + "extended=true,facing=north,shape=short": { + "model": "twilightforest:block/wood/banister/oak/oak_banister_short_extended", + "y": 180 + }, + "extended=true,facing=north,shape=tall": { + "model": "twilightforest:block/wood/banister/oak/oak_banister_tall_extended", + "y": 180 + }, + "extended=true,facing=south,shape=connected": { + "model": "twilightforest:block/wood/banister/oak/oak_banister_connected_extended" + }, + "extended=true,facing=south,shape=short": { + "model": "twilightforest:block/wood/banister/oak/oak_banister_short_extended" + }, + "extended=true,facing=south,shape=tall": { + "model": "twilightforest:block/wood/banister/oak/oak_banister_tall_extended" + }, + "extended=true,facing=west,shape=connected": { + "model": "twilightforest:block/wood/banister/oak/oak_banister_connected_extended", + "y": 90 + }, + "extended=true,facing=west,shape=short": { + "model": "twilightforest:block/wood/banister/oak/oak_banister_short_extended", + "y": 90 + }, + "extended=true,facing=west,shape=tall": { + "model": "twilightforest:block/wood/banister/oak/oak_banister_tall_extended", + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/orange_force_field.json b/src/generated/resources/assets/twilightforest/blockstates/orange_force_field.json new file mode 100644 index 0000000000..7116f869bc --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/orange_force_field.json @@ -0,0 +1,1036 @@ +{ + "multipart": [ + { + "apply": { + "model": "twilightforest:block/force_field/orange_force_field_west", + "uvlock": true + }, + "when": { + "west": "true" + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/orange_force_field_no_west", + "uvlock": true + }, + "when": { + "west": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/orange_force_field_east", + "uvlock": true + }, + "when": { + "east": "true" + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/orange_force_field_no_east", + "uvlock": true + }, + "when": { + "east": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/orange_force_field_down", + "uvlock": true + }, + "when": { + "down": "true" + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/orange_force_field_no_down", + "uvlock": true + }, + "when": { + "down": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/orange_force_field_up", + "uvlock": true + }, + "when": { + "up": "true" + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/orange_force_field_no_up", + "uvlock": true + }, + "when": { + "up": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/orange_force_field_north", + "uvlock": true + }, + "when": { + "north": "true" + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/orange_force_field_no_north", + "uvlock": true + }, + "when": { + "north": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/orange_force_field_south", + "uvlock": true + }, + "when": { + "south": "true" + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/orange_force_field_no_south", + "uvlock": true + }, + "when": { + "south": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/orange_force_field_down_west", + "uvlock": true + }, + "when": { + "OR": [ + { + "down": "true", + "north": "false", + "west": "true" + }, + { + "down": "true", + "south": "false", + "west": "true" + }, + { + "axis": "y|x", + "down": "true", + "west": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/orange_force_field_down_no_west", + "uvlock": true + }, + "when": { + "OR": [ + { + "down": "true", + "west": "false" + }, + { + "axis": "z", + "down": "true", + "north": "true", + "south": "true", + "west": "true" + }, + { + "axis": "z", + "down": "true", + "west": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/orange_force_field_west_no_down", + "uvlock": true + }, + "when": { + "OR": [ + { + "down": "false", + "west": "true" + }, + { + "axis": "z", + "down": "true", + "north": "true", + "south": "true", + "west": "true" + }, + { + "axis": "z", + "down": "true", + "west": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/orange_force_field_down_east", + "uvlock": true + }, + "when": { + "OR": [ + { + "down": "true", + "east": "true", + "north": "false" + }, + { + "down": "true", + "east": "true", + "south": "false" + }, + { + "axis": "y|x", + "down": "true", + "east": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/orange_force_field_down_no_east", + "uvlock": true + }, + "when": { + "OR": [ + { + "down": "true", + "east": "false" + }, + { + "axis": "z", + "down": "true", + "east": "true", + "north": "true", + "south": "true" + }, + { + "axis": "z", + "down": "true", + "east": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/orange_force_field_east_no_down", + "uvlock": true + }, + "when": { + "OR": [ + { + "down": "false", + "east": "true" + }, + { + "axis": "z", + "down": "true", + "east": "true", + "north": "true", + "south": "true" + }, + { + "axis": "z", + "down": "true", + "east": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/orange_force_field_down_north", + "uvlock": true + }, + "when": { + "OR": [ + { + "down": "true", + "north": "true", + "west": "false" + }, + { + "down": "true", + "east": "false", + "north": "true" + }, + { + "axis": "y|z", + "down": "true", + "north": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/orange_force_field_down_no_north", + "uvlock": true + }, + "when": { + "OR": [ + { + "down": "true", + "north": "false" + }, + { + "axis": "x", + "down": "true", + "east": "true", + "north": "true", + "west": "true" + }, + { + "axis": "x", + "down": "true", + "north": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/orange_force_field_north_no_down", + "uvlock": true + }, + "when": { + "OR": [ + { + "down": "false", + "north": "true" + }, + { + "axis": "x", + "down": "true", + "east": "true", + "north": "true", + "west": "true" + }, + { + "axis": "x", + "down": "true", + "north": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/orange_force_field_down_south", + "uvlock": true + }, + "when": { + "OR": [ + { + "down": "true", + "south": "true", + "west": "false" + }, + { + "down": "true", + "east": "false", + "south": "true" + }, + { + "axis": "y|z", + "down": "true", + "south": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/orange_force_field_down_no_south", + "uvlock": true + }, + "when": { + "OR": [ + { + "down": "true", + "south": "false" + }, + { + "axis": "x", + "down": "true", + "east": "true", + "south": "true", + "west": "true" + }, + { + "axis": "x", + "down": "true", + "south": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/orange_force_field_south_no_down", + "uvlock": true + }, + "when": { + "OR": [ + { + "down": "false", + "south": "true" + }, + { + "axis": "x", + "down": "true", + "east": "true", + "south": "true", + "west": "true" + }, + { + "axis": "x", + "down": "true", + "south": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/orange_force_field_up_west", + "uvlock": true + }, + "when": { + "OR": [ + { + "north": "false", + "up": "true", + "west": "true" + }, + { + "south": "false", + "up": "true", + "west": "true" + }, + { + "axis": "y|x", + "up": "true", + "west": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/orange_force_field_up_no_west", + "uvlock": true + }, + "when": { + "OR": [ + { + "up": "true", + "west": "false" + }, + { + "axis": "z", + "north": "true", + "south": "true", + "up": "true", + "west": "true" + }, + { + "axis": "z", + "up": "true", + "west": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/orange_force_field_west_no_up", + "uvlock": true + }, + "when": { + "OR": [ + { + "up": "false", + "west": "true" + }, + { + "axis": "z", + "north": "true", + "south": "true", + "up": "true", + "west": "true" + }, + { + "axis": "z", + "up": "true", + "west": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/orange_force_field_up_east", + "uvlock": true + }, + "when": { + "OR": [ + { + "east": "true", + "north": "false", + "up": "true" + }, + { + "east": "true", + "south": "false", + "up": "true" + }, + { + "axis": "y|x", + "east": "true", + "up": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/orange_force_field_up_no_east", + "uvlock": true + }, + "when": { + "OR": [ + { + "east": "false", + "up": "true" + }, + { + "axis": "z", + "east": "true", + "north": "true", + "south": "true", + "up": "true" + }, + { + "axis": "z", + "east": "true", + "up": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/orange_force_field_east_no_up", + "uvlock": true + }, + "when": { + "OR": [ + { + "east": "true", + "up": "false" + }, + { + "axis": "z", + "east": "true", + "north": "true", + "south": "true", + "up": "true" + }, + { + "axis": "z", + "east": "true", + "up": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/orange_force_field_up_north", + "uvlock": true + }, + "when": { + "OR": [ + { + "north": "true", + "up": "true", + "west": "false" + }, + { + "east": "false", + "north": "true", + "up": "true" + }, + { + "axis": "y|z", + "north": "true", + "up": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/orange_force_field_up_no_north", + "uvlock": true + }, + "when": { + "OR": [ + { + "north": "false", + "up": "true" + }, + { + "axis": "x", + "east": "true", + "north": "true", + "up": "true", + "west": "true" + }, + { + "axis": "x", + "north": "true", + "up": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/orange_force_field_north_no_up", + "uvlock": true + }, + "when": { + "OR": [ + { + "north": "true", + "up": "false" + }, + { + "axis": "x", + "east": "true", + "north": "true", + "up": "true", + "west": "true" + }, + { + "axis": "x", + "north": "true", + "up": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/orange_force_field_up_south", + "uvlock": true + }, + "when": { + "OR": [ + { + "south": "true", + "up": "true", + "west": "false" + }, + { + "east": "false", + "south": "true", + "up": "true" + }, + { + "axis": "y|z", + "south": "true", + "up": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/orange_force_field_up_no_south", + "uvlock": true + }, + "when": { + "OR": [ + { + "south": "false", + "up": "true" + }, + { + "axis": "x", + "east": "true", + "south": "true", + "up": "true", + "west": "true" + }, + { + "axis": "x", + "south": "true", + "up": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/orange_force_field_south_no_up", + "uvlock": true + }, + "when": { + "OR": [ + { + "south": "true", + "up": "false" + }, + { + "axis": "x", + "east": "true", + "south": "true", + "up": "true", + "west": "true" + }, + { + "axis": "x", + "south": "true", + "up": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/orange_force_field_north_west", + "uvlock": true + }, + "when": { + "OR": [ + { + "down": "false", + "north": "true", + "west": "true" + }, + { + "north": "true", + "up": "false", + "west": "true" + }, + { + "axis": "x|z", + "north": "true", + "west": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/orange_force_field_north_no_west", + "uvlock": true + }, + "when": { + "OR": [ + { + "north": "true", + "west": "false" + }, + { + "axis": "y", + "down": "true", + "north": "true", + "up": "true", + "west": "true" + }, + { + "axis": "y", + "north": "true", + "west": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/orange_force_field_west_no_north", + "uvlock": true + }, + "when": { + "OR": [ + { + "north": "false", + "west": "true" + }, + { + "axis": "y", + "down": "true", + "north": "true", + "up": "true", + "west": "true" + }, + { + "axis": "y", + "north": "true", + "west": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/orange_force_field_north_east", + "uvlock": true + }, + "when": { + "OR": [ + { + "down": "false", + "east": "true", + "north": "true" + }, + { + "east": "true", + "north": "true", + "up": "false" + }, + { + "axis": "x|z", + "east": "true", + "north": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/orange_force_field_north_no_east", + "uvlock": true + }, + "when": { + "OR": [ + { + "east": "false", + "north": "true" + }, + { + "axis": "y", + "down": "true", + "east": "true", + "north": "true", + "up": "true" + }, + { + "axis": "y", + "east": "true", + "north": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/orange_force_field_east_no_north", + "uvlock": true + }, + "when": { + "OR": [ + { + "east": "true", + "north": "false" + }, + { + "axis": "y", + "down": "true", + "east": "true", + "north": "true", + "up": "true" + }, + { + "axis": "y", + "east": "true", + "north": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/orange_force_field_south_west", + "uvlock": true + }, + "when": { + "OR": [ + { + "down": "false", + "south": "true", + "west": "true" + }, + { + "south": "true", + "up": "false", + "west": "true" + }, + { + "axis": "x|z", + "south": "true", + "west": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/orange_force_field_south_no_west", + "uvlock": true + }, + "when": { + "OR": [ + { + "south": "true", + "west": "false" + }, + { + "axis": "y", + "down": "true", + "south": "true", + "up": "true", + "west": "true" + }, + { + "axis": "y", + "south": "true", + "west": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/orange_force_field_west_no_south", + "uvlock": true + }, + "when": { + "OR": [ + { + "south": "false", + "west": "true" + }, + { + "axis": "y", + "down": "true", + "south": "true", + "up": "true", + "west": "true" + }, + { + "axis": "y", + "south": "true", + "west": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/orange_force_field_south_east", + "uvlock": true + }, + "when": { + "OR": [ + { + "down": "false", + "east": "true", + "south": "true" + }, + { + "east": "true", + "south": "true", + "up": "false" + }, + { + "axis": "x|z", + "east": "true", + "south": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/orange_force_field_south_no_east", + "uvlock": true + }, + "when": { + "OR": [ + { + "east": "false", + "south": "true" + }, + { + "axis": "y", + "down": "true", + "east": "true", + "south": "true", + "up": "true" + }, + { + "axis": "y", + "east": "true", + "south": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/orange_force_field_east_no_south", + "uvlock": true + }, + "when": { + "OR": [ + { + "east": "true", + "south": "false" + }, + { + "axis": "y", + "down": "true", + "east": "true", + "south": "true", + "up": "true" + }, + { + "axis": "y", + "east": "true", + "south": "true" + } + ] + } + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/pink_castle_door.json b/src/generated/resources/assets/twilightforest/blockstates/pink_castle_door.json new file mode 100644 index 0000000000..b2e22b3fca --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/pink_castle_door.json @@ -0,0 +1,16 @@ +{ + "variants": { + "active=false,vanish=false": { + "model": "twilightforest:block/pink_castle_door" + }, + "active=false,vanish=true": { + "model": "twilightforest:block/pink_castle_door_vanished" + }, + "active=true,vanish=false": { + "model": "twilightforest:block/pink_castle_door" + }, + "active=true,vanish=true": { + "model": "twilightforest:block/pink_castle_door_vanished" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/pink_castle_rune_brick.json b/src/generated/resources/assets/twilightforest/blockstates/pink_castle_rune_brick.json new file mode 100644 index 0000000000..057df861ac --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/pink_castle_rune_brick.json @@ -0,0 +1,30 @@ +{ + "variants": { + "": [ + { + "model": "twilightforest:block/castle_rune_brick_0" + }, + { + "model": "twilightforest:block/castle_rune_brick_1" + }, + { + "model": "twilightforest:block/castle_rune_brick_2" + }, + { + "model": "twilightforest:block/castle_rune_brick_3" + }, + { + "model": "twilightforest:block/castle_rune_brick_4" + }, + { + "model": "twilightforest:block/castle_rune_brick_5" + }, + { + "model": "twilightforest:block/castle_rune_brick_6" + }, + { + "model": "twilightforest:block/castle_rune_brick_7" + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/pink_force_field.json b/src/generated/resources/assets/twilightforest/blockstates/pink_force_field.json new file mode 100644 index 0000000000..2f98684488 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/pink_force_field.json @@ -0,0 +1,1036 @@ +{ + "multipart": [ + { + "apply": { + "model": "twilightforest:block/force_field/pink_force_field_west", + "uvlock": true + }, + "when": { + "west": "true" + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/pink_force_field_no_west", + "uvlock": true + }, + "when": { + "west": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/pink_force_field_east", + "uvlock": true + }, + "when": { + "east": "true" + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/pink_force_field_no_east", + "uvlock": true + }, + "when": { + "east": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/pink_force_field_down", + "uvlock": true + }, + "when": { + "down": "true" + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/pink_force_field_no_down", + "uvlock": true + }, + "when": { + "down": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/pink_force_field_up", + "uvlock": true + }, + "when": { + "up": "true" + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/pink_force_field_no_up", + "uvlock": true + }, + "when": { + "up": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/pink_force_field_north", + "uvlock": true + }, + "when": { + "north": "true" + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/pink_force_field_no_north", + "uvlock": true + }, + "when": { + "north": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/pink_force_field_south", + "uvlock": true + }, + "when": { + "south": "true" + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/pink_force_field_no_south", + "uvlock": true + }, + "when": { + "south": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/pink_force_field_down_west", + "uvlock": true + }, + "when": { + "OR": [ + { + "down": "true", + "north": "false", + "west": "true" + }, + { + "down": "true", + "south": "false", + "west": "true" + }, + { + "axis": "y|x", + "down": "true", + "west": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/pink_force_field_down_no_west", + "uvlock": true + }, + "when": { + "OR": [ + { + "down": "true", + "west": "false" + }, + { + "axis": "z", + "down": "true", + "north": "true", + "south": "true", + "west": "true" + }, + { + "axis": "z", + "down": "true", + "west": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/pink_force_field_west_no_down", + "uvlock": true + }, + "when": { + "OR": [ + { + "down": "false", + "west": "true" + }, + { + "axis": "z", + "down": "true", + "north": "true", + "south": "true", + "west": "true" + }, + { + "axis": "z", + "down": "true", + "west": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/pink_force_field_down_east", + "uvlock": true + }, + "when": { + "OR": [ + { + "down": "true", + "east": "true", + "north": "false" + }, + { + "down": "true", + "east": "true", + "south": "false" + }, + { + "axis": "y|x", + "down": "true", + "east": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/pink_force_field_down_no_east", + "uvlock": true + }, + "when": { + "OR": [ + { + "down": "true", + "east": "false" + }, + { + "axis": "z", + "down": "true", + "east": "true", + "north": "true", + "south": "true" + }, + { + "axis": "z", + "down": "true", + "east": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/pink_force_field_east_no_down", + "uvlock": true + }, + "when": { + "OR": [ + { + "down": "false", + "east": "true" + }, + { + "axis": "z", + "down": "true", + "east": "true", + "north": "true", + "south": "true" + }, + { + "axis": "z", + "down": "true", + "east": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/pink_force_field_down_north", + "uvlock": true + }, + "when": { + "OR": [ + { + "down": "true", + "north": "true", + "west": "false" + }, + { + "down": "true", + "east": "false", + "north": "true" + }, + { + "axis": "y|z", + "down": "true", + "north": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/pink_force_field_down_no_north", + "uvlock": true + }, + "when": { + "OR": [ + { + "down": "true", + "north": "false" + }, + { + "axis": "x", + "down": "true", + "east": "true", + "north": "true", + "west": "true" + }, + { + "axis": "x", + "down": "true", + "north": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/pink_force_field_north_no_down", + "uvlock": true + }, + "when": { + "OR": [ + { + "down": "false", + "north": "true" + }, + { + "axis": "x", + "down": "true", + "east": "true", + "north": "true", + "west": "true" + }, + { + "axis": "x", + "down": "true", + "north": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/pink_force_field_down_south", + "uvlock": true + }, + "when": { + "OR": [ + { + "down": "true", + "south": "true", + "west": "false" + }, + { + "down": "true", + "east": "false", + "south": "true" + }, + { + "axis": "y|z", + "down": "true", + "south": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/pink_force_field_down_no_south", + "uvlock": true + }, + "when": { + "OR": [ + { + "down": "true", + "south": "false" + }, + { + "axis": "x", + "down": "true", + "east": "true", + "south": "true", + "west": "true" + }, + { + "axis": "x", + "down": "true", + "south": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/pink_force_field_south_no_down", + "uvlock": true + }, + "when": { + "OR": [ + { + "down": "false", + "south": "true" + }, + { + "axis": "x", + "down": "true", + "east": "true", + "south": "true", + "west": "true" + }, + { + "axis": "x", + "down": "true", + "south": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/pink_force_field_up_west", + "uvlock": true + }, + "when": { + "OR": [ + { + "north": "false", + "up": "true", + "west": "true" + }, + { + "south": "false", + "up": "true", + "west": "true" + }, + { + "axis": "y|x", + "up": "true", + "west": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/pink_force_field_up_no_west", + "uvlock": true + }, + "when": { + "OR": [ + { + "up": "true", + "west": "false" + }, + { + "axis": "z", + "north": "true", + "south": "true", + "up": "true", + "west": "true" + }, + { + "axis": "z", + "up": "true", + "west": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/pink_force_field_west_no_up", + "uvlock": true + }, + "when": { + "OR": [ + { + "up": "false", + "west": "true" + }, + { + "axis": "z", + "north": "true", + "south": "true", + "up": "true", + "west": "true" + }, + { + "axis": "z", + "up": "true", + "west": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/pink_force_field_up_east", + "uvlock": true + }, + "when": { + "OR": [ + { + "east": "true", + "north": "false", + "up": "true" + }, + { + "east": "true", + "south": "false", + "up": "true" + }, + { + "axis": "y|x", + "east": "true", + "up": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/pink_force_field_up_no_east", + "uvlock": true + }, + "when": { + "OR": [ + { + "east": "false", + "up": "true" + }, + { + "axis": "z", + "east": "true", + "north": "true", + "south": "true", + "up": "true" + }, + { + "axis": "z", + "east": "true", + "up": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/pink_force_field_east_no_up", + "uvlock": true + }, + "when": { + "OR": [ + { + "east": "true", + "up": "false" + }, + { + "axis": "z", + "east": "true", + "north": "true", + "south": "true", + "up": "true" + }, + { + "axis": "z", + "east": "true", + "up": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/pink_force_field_up_north", + "uvlock": true + }, + "when": { + "OR": [ + { + "north": "true", + "up": "true", + "west": "false" + }, + { + "east": "false", + "north": "true", + "up": "true" + }, + { + "axis": "y|z", + "north": "true", + "up": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/pink_force_field_up_no_north", + "uvlock": true + }, + "when": { + "OR": [ + { + "north": "false", + "up": "true" + }, + { + "axis": "x", + "east": "true", + "north": "true", + "up": "true", + "west": "true" + }, + { + "axis": "x", + "north": "true", + "up": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/pink_force_field_north_no_up", + "uvlock": true + }, + "when": { + "OR": [ + { + "north": "true", + "up": "false" + }, + { + "axis": "x", + "east": "true", + "north": "true", + "up": "true", + "west": "true" + }, + { + "axis": "x", + "north": "true", + "up": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/pink_force_field_up_south", + "uvlock": true + }, + "when": { + "OR": [ + { + "south": "true", + "up": "true", + "west": "false" + }, + { + "east": "false", + "south": "true", + "up": "true" + }, + { + "axis": "y|z", + "south": "true", + "up": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/pink_force_field_up_no_south", + "uvlock": true + }, + "when": { + "OR": [ + { + "south": "false", + "up": "true" + }, + { + "axis": "x", + "east": "true", + "south": "true", + "up": "true", + "west": "true" + }, + { + "axis": "x", + "south": "true", + "up": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/pink_force_field_south_no_up", + "uvlock": true + }, + "when": { + "OR": [ + { + "south": "true", + "up": "false" + }, + { + "axis": "x", + "east": "true", + "south": "true", + "up": "true", + "west": "true" + }, + { + "axis": "x", + "south": "true", + "up": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/pink_force_field_north_west", + "uvlock": true + }, + "when": { + "OR": [ + { + "down": "false", + "north": "true", + "west": "true" + }, + { + "north": "true", + "up": "false", + "west": "true" + }, + { + "axis": "x|z", + "north": "true", + "west": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/pink_force_field_north_no_west", + "uvlock": true + }, + "when": { + "OR": [ + { + "north": "true", + "west": "false" + }, + { + "axis": "y", + "down": "true", + "north": "true", + "up": "true", + "west": "true" + }, + { + "axis": "y", + "north": "true", + "west": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/pink_force_field_west_no_north", + "uvlock": true + }, + "when": { + "OR": [ + { + "north": "false", + "west": "true" + }, + { + "axis": "y", + "down": "true", + "north": "true", + "up": "true", + "west": "true" + }, + { + "axis": "y", + "north": "true", + "west": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/pink_force_field_north_east", + "uvlock": true + }, + "when": { + "OR": [ + { + "down": "false", + "east": "true", + "north": "true" + }, + { + "east": "true", + "north": "true", + "up": "false" + }, + { + "axis": "x|z", + "east": "true", + "north": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/pink_force_field_north_no_east", + "uvlock": true + }, + "when": { + "OR": [ + { + "east": "false", + "north": "true" + }, + { + "axis": "y", + "down": "true", + "east": "true", + "north": "true", + "up": "true" + }, + { + "axis": "y", + "east": "true", + "north": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/pink_force_field_east_no_north", + "uvlock": true + }, + "when": { + "OR": [ + { + "east": "true", + "north": "false" + }, + { + "axis": "y", + "down": "true", + "east": "true", + "north": "true", + "up": "true" + }, + { + "axis": "y", + "east": "true", + "north": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/pink_force_field_south_west", + "uvlock": true + }, + "when": { + "OR": [ + { + "down": "false", + "south": "true", + "west": "true" + }, + { + "south": "true", + "up": "false", + "west": "true" + }, + { + "axis": "x|z", + "south": "true", + "west": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/pink_force_field_south_no_west", + "uvlock": true + }, + "when": { + "OR": [ + { + "south": "true", + "west": "false" + }, + { + "axis": "y", + "down": "true", + "south": "true", + "up": "true", + "west": "true" + }, + { + "axis": "y", + "south": "true", + "west": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/pink_force_field_west_no_south", + "uvlock": true + }, + "when": { + "OR": [ + { + "south": "false", + "west": "true" + }, + { + "axis": "y", + "down": "true", + "south": "true", + "up": "true", + "west": "true" + }, + { + "axis": "y", + "south": "true", + "west": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/pink_force_field_south_east", + "uvlock": true + }, + "when": { + "OR": [ + { + "down": "false", + "east": "true", + "south": "true" + }, + { + "east": "true", + "south": "true", + "up": "false" + }, + { + "axis": "x|z", + "east": "true", + "south": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/pink_force_field_south_no_east", + "uvlock": true + }, + "when": { + "OR": [ + { + "east": "false", + "south": "true" + }, + { + "axis": "y", + "down": "true", + "east": "true", + "south": "true", + "up": "true" + }, + { + "axis": "y", + "east": "true", + "south": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/pink_force_field_east_no_south", + "uvlock": true + }, + "when": { + "OR": [ + { + "east": "true", + "south": "false" + }, + { + "axis": "y", + "down": "true", + "east": "true", + "south": "true", + "up": "true" + }, + { + "axis": "y", + "east": "true", + "south": "true" + } + ] + } + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/player_skull_candle.json b/src/generated/resources/assets/twilightforest/blockstates/player_skull_candle.json new file mode 100644 index 0000000000..3951e3eea5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/player_skull_candle.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "minecraft:block/skull" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/player_wall_skull_candle.json b/src/generated/resources/assets/twilightforest/blockstates/player_wall_skull_candle.json new file mode 100644 index 0000000000..3951e3eea5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/player_wall_skull_candle.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "minecraft:block/skull" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/potted_canopy_sapling.json b/src/generated/resources/assets/twilightforest/blockstates/potted_canopy_sapling.json new file mode 100644 index 0000000000..ef1422328c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/potted_canopy_sapling.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/potted_canopy_sapling" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/potted_darkwood_sapling.json b/src/generated/resources/assets/twilightforest/blockstates/potted_darkwood_sapling.json new file mode 100644 index 0000000000..9419b847cf --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/potted_darkwood_sapling.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/potted_darkwood_sapling" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/potted_dead_thorn.json b/src/generated/resources/assets/twilightforest/blockstates/potted_dead_thorn.json new file mode 100644 index 0000000000..4cff1fc400 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/potted_dead_thorn.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/potted_thorn" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/potted_fiddlehead.json b/src/generated/resources/assets/twilightforest/blockstates/potted_fiddlehead.json new file mode 100644 index 0000000000..b0618f4353 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/potted_fiddlehead.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/potted_fiddlehead" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/potted_green_thorn.json b/src/generated/resources/assets/twilightforest/blockstates/potted_green_thorn.json new file mode 100644 index 0000000000..4cff1fc400 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/potted_green_thorn.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/potted_thorn" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/potted_hollow_oak_sapling.json b/src/generated/resources/assets/twilightforest/blockstates/potted_hollow_oak_sapling.json new file mode 100644 index 0000000000..272ba1ac93 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/potted_hollow_oak_sapling.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/potted_hollow_oak_sapling" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/potted_mangrove_sapling.json b/src/generated/resources/assets/twilightforest/blockstates/potted_mangrove_sapling.json new file mode 100644 index 0000000000..e42748e75c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/potted_mangrove_sapling.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/potted_mangrove_sapling" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/potted_mayapple.json b/src/generated/resources/assets/twilightforest/blockstates/potted_mayapple.json new file mode 100644 index 0000000000..93b27e22f7 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/potted_mayapple.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/potted_mayapple" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/potted_mining_sapling.json b/src/generated/resources/assets/twilightforest/blockstates/potted_mining_sapling.json new file mode 100644 index 0000000000..2a57bcf307 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/potted_mining_sapling.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/potted_mining_sapling" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/potted_mushgloom.json b/src/generated/resources/assets/twilightforest/blockstates/potted_mushgloom.json new file mode 100644 index 0000000000..a52eac7001 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/potted_mushgloom.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/potted_mushgloom" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/potted_rainbow_oak_sapling.json b/src/generated/resources/assets/twilightforest/blockstates/potted_rainbow_oak_sapling.json new file mode 100644 index 0000000000..7b1209be89 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/potted_rainbow_oak_sapling.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/potted_rainbow_oak_sapling" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/potted_sorting_sapling.json b/src/generated/resources/assets/twilightforest/blockstates/potted_sorting_sapling.json new file mode 100644 index 0000000000..beb03624ef --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/potted_sorting_sapling.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/potted_sorting_sapling" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/potted_thorn.json b/src/generated/resources/assets/twilightforest/blockstates/potted_thorn.json new file mode 100644 index 0000000000..4cff1fc400 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/potted_thorn.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/potted_thorn" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/potted_time_sapling.json b/src/generated/resources/assets/twilightforest/blockstates/potted_time_sapling.json new file mode 100644 index 0000000000..74700594d6 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/potted_time_sapling.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/potted_time_sapling" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/potted_transformation_sapling.json b/src/generated/resources/assets/twilightforest/blockstates/potted_transformation_sapling.json new file mode 100644 index 0000000000..297c4e23e3 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/potted_transformation_sapling.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/potted_transformation_sapling" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/potted_twilight_oak_sapling.json b/src/generated/resources/assets/twilightforest/blockstates/potted_twilight_oak_sapling.json new file mode 100644 index 0000000000..8e66090e66 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/potted_twilight_oak_sapling.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/potted_twilight_oak_sapling" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/quest_ram_trophy.json b/src/generated/resources/assets/twilightforest/blockstates/quest_ram_trophy.json new file mode 100644 index 0000000000..3951e3eea5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/quest_ram_trophy.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "minecraft:block/skull" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/quest_ram_wall_trophy.json b/src/generated/resources/assets/twilightforest/blockstates/quest_ram_wall_trophy.json new file mode 100644 index 0000000000..3951e3eea5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/quest_ram_wall_trophy.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "minecraft:block/skull" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/rainbow_oak_leaves.json b/src/generated/resources/assets/twilightforest/blockstates/rainbow_oak_leaves.json new file mode 100644 index 0000000000..966529094e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/rainbow_oak_leaves.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/rainbow_oak_leaves" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/rainbow_oak_sapling.json b/src/generated/resources/assets/twilightforest/blockstates/rainbow_oak_sapling.json new file mode 100644 index 0000000000..d4ce9514e6 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/rainbow_oak_sapling.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/rainbow_oak_sapling" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/reactor_debris.json b/src/generated/resources/assets/twilightforest/blockstates/reactor_debris.json new file mode 100644 index 0000000000..ef42588071 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/reactor_debris.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/reactor_debris" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/reappearing_block.json b/src/generated/resources/assets/twilightforest/blockstates/reappearing_block.json new file mode 100644 index 0000000000..71ff6c92eb --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/reappearing_block.json @@ -0,0 +1,16 @@ +{ + "variants": { + "active=false,vanished=false": { + "model": "twilightforest:block/reappearing_block" + }, + "active=false,vanished=true": { + "model": "twilightforest:block/reappearing_block_vanished" + }, + "active=true,vanished=false": { + "model": "twilightforest:block/reappearing_block_active" + }, + "active=true,vanished=true": { + "model": "twilightforest:block/reappearing_block_vanished_active" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/red_thread.json b/src/generated/resources/assets/twilightforest/blockstates/red_thread.json new file mode 100644 index 0000000000..74496b7773 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/red_thread.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/red_thread" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/root.json b/src/generated/resources/assets/twilightforest/blockstates/root.json new file mode 100644 index 0000000000..ce963c622f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/root.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/root" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/root_strand.json b/src/generated/resources/assets/twilightforest/blockstates/root_strand.json new file mode 100644 index 0000000000..b51b6e44ab --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/root_strand.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/root_strand" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/skeleton_skull_candle.json b/src/generated/resources/assets/twilightforest/blockstates/skeleton_skull_candle.json new file mode 100644 index 0000000000..3951e3eea5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/skeleton_skull_candle.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "minecraft:block/skull" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/skeleton_wall_skull_candle.json b/src/generated/resources/assets/twilightforest/blockstates/skeleton_wall_skull_candle.json new file mode 100644 index 0000000000..3951e3eea5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/skeleton_wall_skull_candle.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "minecraft:block/skull" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/slider.json b/src/generated/resources/assets/twilightforest/blockstates/slider.json new file mode 100644 index 0000000000..b25a21f399 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/slider.json @@ -0,0 +1,100 @@ +{ + "variants": { + "axis=x,delay=0,waterlogged=false": { + "model": "twilightforest:block/slider_horiz", + "x": 90, + "y": 90 + }, + "axis=x,delay=0,waterlogged=true": { + "model": "twilightforest:block/slider_horiz", + "x": 90, + "y": 90 + }, + "axis=x,delay=1,waterlogged=false": { + "model": "twilightforest:block/slider_horiz", + "x": 90, + "y": 90 + }, + "axis=x,delay=1,waterlogged=true": { + "model": "twilightforest:block/slider_horiz", + "x": 90, + "y": 90 + }, + "axis=x,delay=2,waterlogged=false": { + "model": "twilightforest:block/slider_horiz", + "x": 90, + "y": 90 + }, + "axis=x,delay=2,waterlogged=true": { + "model": "twilightforest:block/slider_horiz", + "x": 90, + "y": 90 + }, + "axis=x,delay=3,waterlogged=false": { + "model": "twilightforest:block/slider_horiz", + "x": 90, + "y": 90 + }, + "axis=x,delay=3,waterlogged=true": { + "model": "twilightforest:block/slider_horiz", + "x": 90, + "y": 90 + }, + "axis=y,delay=0,waterlogged=false": { + "model": "twilightforest:block/slider" + }, + "axis=y,delay=0,waterlogged=true": { + "model": "twilightforest:block/slider" + }, + "axis=y,delay=1,waterlogged=false": { + "model": "twilightforest:block/slider" + }, + "axis=y,delay=1,waterlogged=true": { + "model": "twilightforest:block/slider" + }, + "axis=y,delay=2,waterlogged=false": { + "model": "twilightforest:block/slider" + }, + "axis=y,delay=2,waterlogged=true": { + "model": "twilightforest:block/slider" + }, + "axis=y,delay=3,waterlogged=false": { + "model": "twilightforest:block/slider" + }, + "axis=y,delay=3,waterlogged=true": { + "model": "twilightforest:block/slider" + }, + "axis=z,delay=0,waterlogged=false": { + "model": "twilightforest:block/slider_horiz", + "x": 90 + }, + "axis=z,delay=0,waterlogged=true": { + "model": "twilightforest:block/slider_horiz", + "x": 90 + }, + "axis=z,delay=1,waterlogged=false": { + "model": "twilightforest:block/slider_horiz", + "x": 90 + }, + "axis=z,delay=1,waterlogged=true": { + "model": "twilightforest:block/slider_horiz", + "x": 90 + }, + "axis=z,delay=2,waterlogged=false": { + "model": "twilightforest:block/slider_horiz", + "x": 90 + }, + "axis=z,delay=2,waterlogged=true": { + "model": "twilightforest:block/slider_horiz", + "x": 90 + }, + "axis=z,delay=3,waterlogged=false": { + "model": "twilightforest:block/slider_horiz", + "x": 90 + }, + "axis=z,delay=3,waterlogged=true": { + "model": "twilightforest:block/slider_horiz", + "x": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/smoker.json b/src/generated/resources/assets/twilightforest/blockstates/smoker.json new file mode 100644 index 0000000000..e6d73d4076 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/smoker.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/smoker" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/snow_queen_boss_spawner.json b/src/generated/resources/assets/twilightforest/blockstates/snow_queen_boss_spawner.json new file mode 100644 index 0000000000..fab51f8dc9 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/snow_queen_boss_spawner.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/boss_spawner" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/snow_queen_trophy.json b/src/generated/resources/assets/twilightforest/blockstates/snow_queen_trophy.json new file mode 100644 index 0000000000..3951e3eea5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/snow_queen_trophy.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "minecraft:block/skull" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/snow_queen_wall_trophy.json b/src/generated/resources/assets/twilightforest/blockstates/snow_queen_wall_trophy.json new file mode 100644 index 0000000000..3951e3eea5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/snow_queen_wall_trophy.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "minecraft:block/skull" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/sorting_banister.json b/src/generated/resources/assets/twilightforest/blockstates/sorting_banister.json new file mode 100644 index 0000000000..134afb4e49 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/sorting_banister.json @@ -0,0 +1,460 @@ +{ + "variants": { + "extended=false,facing=east,shape=connected": [ + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_connected", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_connected_1", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_connected_2", + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_connected_3", + "y": 270 + } + ], + "extended=false,facing=east,shape=short": [ + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_short", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_short_1", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_short_2", + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_short_3", + "y": 270 + } + ], + "extended=false,facing=east,shape=tall": [ + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_tall", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_tall_1", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_tall_2", + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_tall_3", + "y": 270 + } + ], + "extended=false,facing=north,shape=connected": [ + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_connected", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_connected_1", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_connected_2", + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_connected_3", + "y": 180 + } + ], + "extended=false,facing=north,shape=short": [ + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_short", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_short_1", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_short_2", + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_short_3", + "y": 180 + } + ], + "extended=false,facing=north,shape=tall": [ + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_tall", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_tall_1", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_tall_2", + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_tall_3", + "y": 180 + } + ], + "extended=false,facing=south,shape=connected": [ + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_connected", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_connected_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_connected_2" + }, + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_connected_3" + } + ], + "extended=false,facing=south,shape=short": [ + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_short", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_short_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_short_2" + }, + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_short_3" + } + ], + "extended=false,facing=south,shape=tall": [ + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_tall", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_tall_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_tall_2" + }, + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_tall_3" + } + ], + "extended=false,facing=west,shape=connected": [ + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_connected", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_connected_1", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_connected_2", + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_connected_3", + "y": 90 + } + ], + "extended=false,facing=west,shape=short": [ + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_short", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_short_1", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_short_2", + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_short_3", + "y": 90 + } + ], + "extended=false,facing=west,shape=tall": [ + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_tall", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_tall_1", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_tall_2", + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_tall_3", + "y": 90 + } + ], + "extended=true,facing=east,shape=connected": [ + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_connected_extended", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_connected_extended_1", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_connected_extended_2", + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_connected_extended_3", + "y": 270 + } + ], + "extended=true,facing=east,shape=short": [ + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_short_extended", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_short_extended_1", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_short_extended_2", + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_short_extended_3", + "y": 270 + } + ], + "extended=true,facing=east,shape=tall": [ + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_tall_extended", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_tall_extended_1", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_tall_extended_2", + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_tall_extended_3", + "y": 270 + } + ], + "extended=true,facing=north,shape=connected": [ + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_connected_extended", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_connected_extended_1", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_connected_extended_2", + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_connected_extended_3", + "y": 180 + } + ], + "extended=true,facing=north,shape=short": [ + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_short_extended", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_short_extended_1", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_short_extended_2", + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_short_extended_3", + "y": 180 + } + ], + "extended=true,facing=north,shape=tall": [ + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_tall_extended", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_tall_extended_1", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_tall_extended_2", + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_tall_extended_3", + "y": 180 + } + ], + "extended=true,facing=south,shape=connected": [ + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_connected_extended", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_connected_extended_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_connected_extended_2" + }, + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_connected_extended_3" + } + ], + "extended=true,facing=south,shape=short": [ + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_short_extended", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_short_extended_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_short_extended_2" + }, + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_short_extended_3" + } + ], + "extended=true,facing=south,shape=tall": [ + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_tall_extended", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_tall_extended_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_tall_extended_2" + }, + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_tall_extended_3" + } + ], + "extended=true,facing=west,shape=connected": [ + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_connected_extended", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_connected_extended_1", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_connected_extended_2", + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_connected_extended_3", + "y": 90 + } + ], + "extended=true,facing=west,shape=short": [ + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_short_extended", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_short_extended_1", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_short_extended_2", + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_short_extended_3", + "y": 90 + } + ], + "extended=true,facing=west,shape=tall": [ + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_tall_extended", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_tall_extended_1", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_tall_extended_2", + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/sort/sorting_banister_tall_extended_3", + "y": 90 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/sorting_button.json b/src/generated/resources/assets/twilightforest/blockstates/sorting_button.json new file mode 100644 index 0000000000..e1effdce13 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/sorting_button.json @@ -0,0 +1,556 @@ +{ + "variants": { + "face=ceiling,facing=east,powered=false": [ + { + "model": "twilightforest:block/wood/button/sort/sorting_button", + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/sort/sorting_button_1", + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/sort/sorting_button_2", + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/sort/sorting_button_3", + "x": 180, + "y": 270 + } + ], + "face=ceiling,facing=east,powered=true": [ + { + "model": "twilightforest:block/wood/button/sort/sorting_button_pressed", + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/sort/sorting_button_pressed_1", + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/sort/sorting_button_pressed_2", + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/sort/sorting_button_pressed_3", + "x": 180, + "y": 270 + } + ], + "face=ceiling,facing=north,powered=false": [ + { + "model": "twilightforest:block/wood/button/sort/sorting_button", + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/sort/sorting_button_1", + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/sort/sorting_button_2", + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/sort/sorting_button_3", + "x": 180, + "y": 180 + } + ], + "face=ceiling,facing=north,powered=true": [ + { + "model": "twilightforest:block/wood/button/sort/sorting_button_pressed", + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/sort/sorting_button_pressed_1", + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/sort/sorting_button_pressed_2", + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/sort/sorting_button_pressed_3", + "x": 180, + "y": 180 + } + ], + "face=ceiling,facing=south,powered=false": [ + { + "model": "twilightforest:block/wood/button/sort/sorting_button", + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/button/sort/sorting_button_1", + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/button/sort/sorting_button_2", + "x": 180 + }, + { + "model": "twilightforest:block/wood/button/sort/sorting_button_3", + "x": 180 + } + ], + "face=ceiling,facing=south,powered=true": [ + { + "model": "twilightforest:block/wood/button/sort/sorting_button_pressed", + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/button/sort/sorting_button_pressed_1", + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/button/sort/sorting_button_pressed_2", + "x": 180 + }, + { + "model": "twilightforest:block/wood/button/sort/sorting_button_pressed_3", + "x": 180 + } + ], + "face=ceiling,facing=west,powered=false": [ + { + "model": "twilightforest:block/wood/button/sort/sorting_button", + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/sort/sorting_button_1", + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/sort/sorting_button_2", + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/sort/sorting_button_3", + "x": 180, + "y": 90 + } + ], + "face=ceiling,facing=west,powered=true": [ + { + "model": "twilightforest:block/wood/button/sort/sorting_button_pressed", + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/sort/sorting_button_pressed_1", + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/sort/sorting_button_pressed_2", + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/sort/sorting_button_pressed_3", + "x": 180, + "y": 90 + } + ], + "face=floor,facing=east,powered=false": [ + { + "model": "twilightforest:block/wood/button/sort/sorting_button", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/sort/sorting_button_1", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/sort/sorting_button_2", + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/sort/sorting_button_3", + "y": 90 + } + ], + "face=floor,facing=east,powered=true": [ + { + "model": "twilightforest:block/wood/button/sort/sorting_button_pressed", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/sort/sorting_button_pressed_1", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/sort/sorting_button_pressed_2", + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/sort/sorting_button_pressed_3", + "y": 90 + } + ], + "face=floor,facing=north,powered=false": [ + { + "model": "twilightforest:block/wood/button/sort/sorting_button", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/button/sort/sorting_button_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/button/sort/sorting_button_2" + }, + { + "model": "twilightforest:block/wood/button/sort/sorting_button_3" + } + ], + "face=floor,facing=north,powered=true": [ + { + "model": "twilightforest:block/wood/button/sort/sorting_button_pressed", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/button/sort/sorting_button_pressed_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/button/sort/sorting_button_pressed_2" + }, + { + "model": "twilightforest:block/wood/button/sort/sorting_button_pressed_3" + } + ], + "face=floor,facing=south,powered=false": [ + { + "model": "twilightforest:block/wood/button/sort/sorting_button", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/sort/sorting_button_1", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/sort/sorting_button_2", + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/sort/sorting_button_3", + "y": 180 + } + ], + "face=floor,facing=south,powered=true": [ + { + "model": "twilightforest:block/wood/button/sort/sorting_button_pressed", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/sort/sorting_button_pressed_1", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/sort/sorting_button_pressed_2", + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/sort/sorting_button_pressed_3", + "y": 180 + } + ], + "face=floor,facing=west,powered=false": [ + { + "model": "twilightforest:block/wood/button/sort/sorting_button", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/sort/sorting_button_1", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/sort/sorting_button_2", + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/sort/sorting_button_3", + "y": 270 + } + ], + "face=floor,facing=west,powered=true": [ + { + "model": "twilightforest:block/wood/button/sort/sorting_button_pressed", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/sort/sorting_button_pressed_1", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/sort/sorting_button_pressed_2", + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/sort/sorting_button_pressed_3", + "y": 270 + } + ], + "face=wall,facing=east,powered=false": [ + { + "model": "twilightforest:block/wood/button/sort/sorting_button", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/sort/sorting_button_1", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/sort/sorting_button_2", + "uvlock": true, + "x": 90, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/sort/sorting_button_3", + "uvlock": true, + "x": 90, + "y": 90 + } + ], + "face=wall,facing=east,powered=true": [ + { + "model": "twilightforest:block/wood/button/sort/sorting_button_pressed", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/sort/sorting_button_pressed_1", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/sort/sorting_button_pressed_2", + "uvlock": true, + "x": 90, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/sort/sorting_button_pressed_3", + "uvlock": true, + "x": 90, + "y": 90 + } + ], + "face=wall,facing=north,powered=false": [ + { + "model": "twilightforest:block/wood/button/sort/sorting_button", + "uvlock": true, + "weight": 10, + "x": 90 + }, + { + "model": "twilightforest:block/wood/button/sort/sorting_button_1", + "uvlock": true, + "weight": 10, + "x": 90 + }, + { + "model": "twilightforest:block/wood/button/sort/sorting_button_2", + "uvlock": true, + "x": 90 + }, + { + "model": "twilightforest:block/wood/button/sort/sorting_button_3", + "uvlock": true, + "x": 90 + } + ], + "face=wall,facing=north,powered=true": [ + { + "model": "twilightforest:block/wood/button/sort/sorting_button_pressed", + "uvlock": true, + "weight": 10, + "x": 90 + }, + { + "model": "twilightforest:block/wood/button/sort/sorting_button_pressed_1", + "uvlock": true, + "weight": 10, + "x": 90 + }, + { + "model": "twilightforest:block/wood/button/sort/sorting_button_pressed_2", + "uvlock": true, + "x": 90 + }, + { + "model": "twilightforest:block/wood/button/sort/sorting_button_pressed_3", + "uvlock": true, + "x": 90 + } + ], + "face=wall,facing=south,powered=false": [ + { + "model": "twilightforest:block/wood/button/sort/sorting_button", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/sort/sorting_button_1", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/sort/sorting_button_2", + "uvlock": true, + "x": 90, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/sort/sorting_button_3", + "uvlock": true, + "x": 90, + "y": 180 + } + ], + "face=wall,facing=south,powered=true": [ + { + "model": "twilightforest:block/wood/button/sort/sorting_button_pressed", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/sort/sorting_button_pressed_1", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/sort/sorting_button_pressed_2", + "uvlock": true, + "x": 90, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/sort/sorting_button_pressed_3", + "uvlock": true, + "x": 90, + "y": 180 + } + ], + "face=wall,facing=west,powered=false": [ + { + "model": "twilightforest:block/wood/button/sort/sorting_button", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/sort/sorting_button_1", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/sort/sorting_button_2", + "uvlock": true, + "x": 90, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/sort/sorting_button_3", + "uvlock": true, + "x": 90, + "y": 270 + } + ], + "face=wall,facing=west,powered=true": [ + { + "model": "twilightforest:block/wood/button/sort/sorting_button_pressed", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/sort/sorting_button_pressed_1", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/sort/sorting_button_pressed_2", + "uvlock": true, + "x": 90, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/sort/sorting_button_pressed_3", + "uvlock": true, + "x": 90, + "y": 270 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/sorting_chest.json b/src/generated/resources/assets/twilightforest/blockstates/sorting_chest.json new file mode 100644 index 0000000000..5a0f1fd55b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/sorting_chest.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/sorting_chest" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/sorting_door.json b/src/generated/resources/assets/twilightforest/blockstates/sorting_door.json new file mode 100644 index 0000000000..b856f218ea --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/sorting_door.json @@ -0,0 +1,124 @@ +{ + "variants": { + "facing=east,half=lower,hinge=left,open=false": { + "model": "twilightforest:block/wood/door/sort/sorting_door_door_bottom_left" + }, + "facing=east,half=lower,hinge=left,open=true": { + "model": "twilightforest:block/wood/door/sort/sorting_door_door_bottom_left_open", + "y": 90 + }, + "facing=east,half=lower,hinge=right,open=false": { + "model": "twilightforest:block/wood/door/sort/sorting_door_door_bottom_right" + }, + "facing=east,half=lower,hinge=right,open=true": { + "model": "twilightforest:block/wood/door/sort/sorting_door_door_bottom_right_open", + "y": 270 + }, + "facing=east,half=upper,hinge=left,open=false": { + "model": "twilightforest:block/wood/door/sort/sorting_door_door_top_left" + }, + "facing=east,half=upper,hinge=left,open=true": { + "model": "twilightforest:block/wood/door/sort/sorting_door_door_top_left_open", + "y": 90 + }, + "facing=east,half=upper,hinge=right,open=false": { + "model": "twilightforest:block/wood/door/sort/sorting_door_door_top_right" + }, + "facing=east,half=upper,hinge=right,open=true": { + "model": "twilightforest:block/wood/door/sort/sorting_door_door_top_right_open", + "y": 270 + }, + "facing=north,half=lower,hinge=left,open=false": { + "model": "twilightforest:block/wood/door/sort/sorting_door_door_bottom_left", + "y": 270 + }, + "facing=north,half=lower,hinge=left,open=true": { + "model": "twilightforest:block/wood/door/sort/sorting_door_door_bottom_left_open" + }, + "facing=north,half=lower,hinge=right,open=false": { + "model": "twilightforest:block/wood/door/sort/sorting_door_door_bottom_right", + "y": 270 + }, + "facing=north,half=lower,hinge=right,open=true": { + "model": "twilightforest:block/wood/door/sort/sorting_door_door_bottom_right_open", + "y": 180 + }, + "facing=north,half=upper,hinge=left,open=false": { + "model": "twilightforest:block/wood/door/sort/sorting_door_door_top_left", + "y": 270 + }, + "facing=north,half=upper,hinge=left,open=true": { + "model": "twilightforest:block/wood/door/sort/sorting_door_door_top_left_open" + }, + "facing=north,half=upper,hinge=right,open=false": { + "model": "twilightforest:block/wood/door/sort/sorting_door_door_top_right", + "y": 270 + }, + "facing=north,half=upper,hinge=right,open=true": { + "model": "twilightforest:block/wood/door/sort/sorting_door_door_top_right_open", + "y": 180 + }, + "facing=south,half=lower,hinge=left,open=false": { + "model": "twilightforest:block/wood/door/sort/sorting_door_door_bottom_left", + "y": 90 + }, + "facing=south,half=lower,hinge=left,open=true": { + "model": "twilightforest:block/wood/door/sort/sorting_door_door_bottom_left_open", + "y": 180 + }, + "facing=south,half=lower,hinge=right,open=false": { + "model": "twilightforest:block/wood/door/sort/sorting_door_door_bottom_right", + "y": 90 + }, + "facing=south,half=lower,hinge=right,open=true": { + "model": "twilightforest:block/wood/door/sort/sorting_door_door_bottom_right_open" + }, + "facing=south,half=upper,hinge=left,open=false": { + "model": "twilightforest:block/wood/door/sort/sorting_door_door_top_left", + "y": 90 + }, + "facing=south,half=upper,hinge=left,open=true": { + "model": "twilightforest:block/wood/door/sort/sorting_door_door_top_left_open", + "y": 180 + }, + "facing=south,half=upper,hinge=right,open=false": { + "model": "twilightforest:block/wood/door/sort/sorting_door_door_top_right", + "y": 90 + }, + "facing=south,half=upper,hinge=right,open=true": { + "model": "twilightforest:block/wood/door/sort/sorting_door_door_top_right_open" + }, + "facing=west,half=lower,hinge=left,open=false": { + "model": "twilightforest:block/wood/door/sort/sorting_door_door_bottom_left", + "y": 180 + }, + "facing=west,half=lower,hinge=left,open=true": { + "model": "twilightforest:block/wood/door/sort/sorting_door_door_bottom_left_open", + "y": 270 + }, + "facing=west,half=lower,hinge=right,open=false": { + "model": "twilightforest:block/wood/door/sort/sorting_door_door_bottom_right", + "y": 180 + }, + "facing=west,half=lower,hinge=right,open=true": { + "model": "twilightforest:block/wood/door/sort/sorting_door_door_bottom_right_open", + "y": 90 + }, + "facing=west,half=upper,hinge=left,open=false": { + "model": "twilightforest:block/wood/door/sort/sorting_door_door_top_left", + "y": 180 + }, + "facing=west,half=upper,hinge=left,open=true": { + "model": "twilightforest:block/wood/door/sort/sorting_door_door_top_left_open", + "y": 270 + }, + "facing=west,half=upper,hinge=right,open=false": { + "model": "twilightforest:block/wood/door/sort/sorting_door_door_top_right", + "y": 180 + }, + "facing=west,half=upper,hinge=right,open=true": { + "model": "twilightforest:block/wood/door/sort/sorting_door_door_top_right_open", + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/sorting_fence.json b/src/generated/resources/assets/twilightforest/blockstates/sorting_fence.json new file mode 100644 index 0000000000..e2387a5ef0 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/sorting_fence.json @@ -0,0 +1,134 @@ +{ + "multipart": [ + { + "apply": [ + { + "model": "twilightforest:block/wood/fence/sort/sorting_fence_post", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence/sort/sorting_fence_post_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence/sort/sorting_fence_post_2" + }, + { + "model": "twilightforest:block/wood/fence/sort/sorting_fence_post_3" + } + ] + }, + { + "apply": [ + { + "model": "twilightforest:block/wood/fence/sort/sorting_fence_side", + "uvlock": true, + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence/sort/sorting_fence_side_1", + "uvlock": true, + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence/sort/sorting_fence_side_2", + "uvlock": true + }, + { + "model": "twilightforest:block/wood/fence/sort/sorting_fence_side_3", + "uvlock": true + } + ], + "when": { + "north": "true" + } + }, + { + "apply": [ + { + "model": "twilightforest:block/wood/fence/sort/sorting_fence_side", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence/sort/sorting_fence_side_1", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence/sort/sorting_fence_side_2", + "uvlock": true, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence/sort/sorting_fence_side_3", + "uvlock": true, + "y": 180 + } + ], + "when": { + "south": "true" + } + }, + { + "apply": [ + { + "model": "twilightforest:block/wood/fence/sort/sorting_fence_side", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence/sort/sorting_fence_side_1", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence/sort/sorting_fence_side_2", + "uvlock": true, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence/sort/sorting_fence_side_3", + "uvlock": true, + "y": 270 + } + ], + "when": { + "west": "true" + } + }, + { + "apply": [ + { + "model": "twilightforest:block/wood/fence/sort/sorting_fence_side", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence/sort/sorting_fence_side_1", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence/sort/sorting_fence_side_2", + "uvlock": true, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence/sort/sorting_fence_side_3", + "uvlock": true, + "y": 90 + } + ], + "when": { + "east": "true" + } + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/sorting_fence_gate.json b/src/generated/resources/assets/twilightforest/blockstates/sorting_fence_gate.json new file mode 100644 index 0000000000..0bf3c0043d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/sorting_fence_gate.json @@ -0,0 +1,372 @@ +{ + "variants": { + "facing=east,in_wall=false,open=false": [ + { + "model": "twilightforest:block/wood/fence_gate/sort/sorting_fence_gate", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/sort/sorting_fence_gate_1", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/sort/sorting_fence_gate_2", + "uvlock": true, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/sort/sorting_fence_gate_3", + "uvlock": true, + "y": 270 + } + ], + "facing=east,in_wall=false,open=true": [ + { + "model": "twilightforest:block/wood/fence_gate/sort/sorting_fence_gate_open", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/sort/sorting_fence_gate_open_1", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/sort/sorting_fence_gate_open_2", + "uvlock": true, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/sort/sorting_fence_gate_open_3", + "uvlock": true, + "y": 270 + } + ], + "facing=east,in_wall=true,open=false": [ + { + "model": "twilightforest:block/wood/fence_gate/sort/sorting_fence_gate_wall", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/sort/sorting_fence_gate_wall_1", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/sort/sorting_fence_gate_wall_2", + "uvlock": true, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/sort/sorting_fence_gate_wall_3", + "uvlock": true, + "y": 270 + } + ], + "facing=east,in_wall=true,open=true": [ + { + "model": "twilightforest:block/wood/fence_gate/sort/sorting_fence_gate_wall_open", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/sort/sorting_fence_gate_wall_open_1", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/sort/sorting_fence_gate_wall_open_2", + "uvlock": true, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/sort/sorting_fence_gate_wall_open_3", + "uvlock": true, + "y": 270 + } + ], + "facing=north,in_wall=false,open=false": [ + { + "model": "twilightforest:block/wood/fence_gate/sort/sorting_fence_gate", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/sort/sorting_fence_gate_1", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/sort/sorting_fence_gate_2", + "uvlock": true, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/sort/sorting_fence_gate_3", + "uvlock": true, + "y": 180 + } + ], + "facing=north,in_wall=false,open=true": [ + { + "model": "twilightforest:block/wood/fence_gate/sort/sorting_fence_gate_open", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/sort/sorting_fence_gate_open_1", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/sort/sorting_fence_gate_open_2", + "uvlock": true, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/sort/sorting_fence_gate_open_3", + "uvlock": true, + "y": 180 + } + ], + "facing=north,in_wall=true,open=false": [ + { + "model": "twilightforest:block/wood/fence_gate/sort/sorting_fence_gate_wall", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/sort/sorting_fence_gate_wall_1", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/sort/sorting_fence_gate_wall_2", + "uvlock": true, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/sort/sorting_fence_gate_wall_3", + "uvlock": true, + "y": 180 + } + ], + "facing=north,in_wall=true,open=true": [ + { + "model": "twilightforest:block/wood/fence_gate/sort/sorting_fence_gate_wall_open", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/sort/sorting_fence_gate_wall_open_1", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/sort/sorting_fence_gate_wall_open_2", + "uvlock": true, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/sort/sorting_fence_gate_wall_open_3", + "uvlock": true, + "y": 180 + } + ], + "facing=south,in_wall=false,open=false": [ + { + "model": "twilightforest:block/wood/fence_gate/sort/sorting_fence_gate", + "uvlock": true, + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence_gate/sort/sorting_fence_gate_1", + "uvlock": true, + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence_gate/sort/sorting_fence_gate_2", + "uvlock": true + }, + { + "model": "twilightforest:block/wood/fence_gate/sort/sorting_fence_gate_3", + "uvlock": true + } + ], + "facing=south,in_wall=false,open=true": [ + { + "model": "twilightforest:block/wood/fence_gate/sort/sorting_fence_gate_open", + "uvlock": true, + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence_gate/sort/sorting_fence_gate_open_1", + "uvlock": true, + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence_gate/sort/sorting_fence_gate_open_2", + "uvlock": true + }, + { + "model": "twilightforest:block/wood/fence_gate/sort/sorting_fence_gate_open_3", + "uvlock": true + } + ], + "facing=south,in_wall=true,open=false": [ + { + "model": "twilightforest:block/wood/fence_gate/sort/sorting_fence_gate_wall", + "uvlock": true, + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence_gate/sort/sorting_fence_gate_wall_1", + "uvlock": true, + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence_gate/sort/sorting_fence_gate_wall_2", + "uvlock": true + }, + { + "model": "twilightforest:block/wood/fence_gate/sort/sorting_fence_gate_wall_3", + "uvlock": true + } + ], + "facing=south,in_wall=true,open=true": [ + { + "model": "twilightforest:block/wood/fence_gate/sort/sorting_fence_gate_wall_open", + "uvlock": true, + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence_gate/sort/sorting_fence_gate_wall_open_1", + "uvlock": true, + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence_gate/sort/sorting_fence_gate_wall_open_2", + "uvlock": true + }, + { + "model": "twilightforest:block/wood/fence_gate/sort/sorting_fence_gate_wall_open_3", + "uvlock": true + } + ], + "facing=west,in_wall=false,open=false": [ + { + "model": "twilightforest:block/wood/fence_gate/sort/sorting_fence_gate", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/sort/sorting_fence_gate_1", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/sort/sorting_fence_gate_2", + "uvlock": true, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/sort/sorting_fence_gate_3", + "uvlock": true, + "y": 90 + } + ], + "facing=west,in_wall=false,open=true": [ + { + "model": "twilightforest:block/wood/fence_gate/sort/sorting_fence_gate_open", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/sort/sorting_fence_gate_open_1", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/sort/sorting_fence_gate_open_2", + "uvlock": true, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/sort/sorting_fence_gate_open_3", + "uvlock": true, + "y": 90 + } + ], + "facing=west,in_wall=true,open=false": [ + { + "model": "twilightforest:block/wood/fence_gate/sort/sorting_fence_gate_wall", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/sort/sorting_fence_gate_wall_1", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/sort/sorting_fence_gate_wall_2", + "uvlock": true, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/sort/sorting_fence_gate_wall_3", + "uvlock": true, + "y": 90 + } + ], + "facing=west,in_wall=true,open=true": [ + { + "model": "twilightforest:block/wood/fence_gate/sort/sorting_fence_gate_wall_open", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/sort/sorting_fence_gate_wall_open_1", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/sort/sorting_fence_gate_wall_open_2", + "uvlock": true, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/sort/sorting_fence_gate_wall_open_3", + "uvlock": true, + "y": 90 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/sorting_leaves.json b/src/generated/resources/assets/twilightforest/blockstates/sorting_leaves.json new file mode 100644 index 0000000000..3266789032 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/sorting_leaves.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/sorting_leaves" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/sorting_log.json b/src/generated/resources/assets/twilightforest/blockstates/sorting_log.json new file mode 100644 index 0000000000..42b270e4f5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/sorting_log.json @@ -0,0 +1,16 @@ +{ + "variants": { + "axis=x": { + "model": "twilightforest:block/sorting_log_horizontal", + "x": 90, + "y": 90 + }, + "axis=y": { + "model": "twilightforest:block/sorting_log" + }, + "axis=z": { + "model": "twilightforest:block/sorting_log_horizontal", + "x": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/sorting_log_core.json b/src/generated/resources/assets/twilightforest/blockstates/sorting_log_core.json new file mode 100644 index 0000000000..9b16fb98f4 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/sorting_log_core.json @@ -0,0 +1,28 @@ +{ + "variants": { + "active=false,axis=x": { + "model": "twilightforest:block/sorting_log_core", + "x": 90, + "y": 90 + }, + "active=false,axis=y": { + "model": "twilightforest:block/sorting_log_core" + }, + "active=false,axis=z": { + "model": "twilightforest:block/sorting_log_core", + "x": 90 + }, + "active=true,axis=x": { + "model": "twilightforest:block/sorting_log_core_on", + "x": 90, + "y": 90 + }, + "active=true,axis=y": { + "model": "twilightforest:block/sorting_log_core_on" + }, + "active=true,axis=z": { + "model": "twilightforest:block/sorting_log_core_on", + "x": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/sorting_planks.json b/src/generated/resources/assets/twilightforest/blockstates/sorting_planks.json new file mode 100644 index 0000000000..227ff92216 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/sorting_planks.json @@ -0,0 +1,20 @@ +{ + "variants": { + "": [ + { + "model": "twilightforest:block/wood/planks/sort/sorting_planks", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/planks/sort/sorting_planks_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/planks/sort/sorting_planks_2" + }, + { + "model": "twilightforest:block/wood/planks/sort/sorting_planks_3" + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/sorting_pressure_plate.json b/src/generated/resources/assets/twilightforest/blockstates/sorting_pressure_plate.json new file mode 100644 index 0000000000..c793d94d91 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/sorting_pressure_plate.json @@ -0,0 +1,36 @@ +{ + "variants": { + "powered=false": [ + { + "model": "twilightforest:block/wood/pressure_plate/sort/sorting_pressure_plate", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/pressure_plate/sort/sorting_pressure_plate_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/pressure_plate/sort/sorting_pressure_plate_2" + }, + { + "model": "twilightforest:block/wood/pressure_plate/sort/sorting_pressure_plate_3" + } + ], + "powered=true": [ + { + "model": "twilightforest:block/wood/pressure_plate/sort/sorting_pressure_plate_down", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/pressure_plate/sort/sorting_pressure_plate_down_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/pressure_plate/sort/sorting_pressure_plate_down_2" + }, + { + "model": "twilightforest:block/wood/pressure_plate/sort/sorting_pressure_plate_down_3" + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/sorting_sapling.json b/src/generated/resources/assets/twilightforest/blockstates/sorting_sapling.json new file mode 100644 index 0000000000..c72b45e96a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/sorting_sapling.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/sorting_sapling" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/sorting_sign.json b/src/generated/resources/assets/twilightforest/blockstates/sorting_sign.json new file mode 100644 index 0000000000..2f032431b0 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/sorting_sign.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/sorting_sign" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/sorting_slab.json b/src/generated/resources/assets/twilightforest/blockstates/sorting_slab.json new file mode 100644 index 0000000000..60fbf7b663 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/sorting_slab.json @@ -0,0 +1,60 @@ +{ + "variants": { + "type=bottom": [ + { + "model": "twilightforest:block/wood/slab/sort/sorting_slab", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/slab/sort/sorting_slab_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/slab/sort/sorting_slab_2" + }, + { + "model": "twilightforest:block/wood/slab/sort/sorting_slab_3" + } + ], + "type=double": [ + { + "model": "twilightforest:block/wood/planks/sort/sorting_planks", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/planks/sort/sorting_planks_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/planks/sort/sorting_planks_2" + }, + { + "model": "twilightforest:block/wood/planks/sort/sorting_planks_3" + } + ], + "type=top": [ + { + "model": "twilightforest:block/wood/slab/sort/sorting_slab", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/slab/sort/sorting_slab_1", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/slab/sort/sorting_slab_2", + "uvlock": true, + "x": 180 + }, + { + "model": "twilightforest:block/wood/slab/sort/sorting_slab_3", + "uvlock": true, + "x": 180 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/sorting_stairs.json b/src/generated/resources/assets/twilightforest/blockstates/sorting_stairs.json new file mode 100644 index 0000000000..ba991886c3 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/sorting_stairs.json @@ -0,0 +1,984 @@ +{ + "variants": { + "facing=east,half=bottom,shape=inner_left": [ + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_inner", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_inner_1", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_inner_2", + "uvlock": true, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_inner_3", + "uvlock": true, + "y": 270 + } + ], + "facing=east,half=bottom,shape=inner_right": [ + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_inner", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_inner_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_inner_2" + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_inner_3" + } + ], + "facing=east,half=bottom,shape=outer_left": [ + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_outer", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_outer_1", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_outer_2", + "uvlock": true, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_outer_3", + "uvlock": true, + "y": 270 + } + ], + "facing=east,half=bottom,shape=outer_right": [ + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_outer", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_outer_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_outer_2" + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_outer_3" + } + ], + "facing=east,half=bottom,shape=straight": [ + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_2" + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_3" + } + ], + "facing=east,half=top,shape=inner_left": [ + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_inner", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_inner_1", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_inner_2", + "uvlock": true, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_inner_3", + "uvlock": true, + "x": 180 + } + ], + "facing=east,half=top,shape=inner_right": [ + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_inner", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_inner_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_inner_2", + "uvlock": true, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_inner_3", + "uvlock": true, + "x": 180, + "y": 90 + } + ], + "facing=east,half=top,shape=outer_left": [ + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_outer", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_outer_1", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_outer_2", + "uvlock": true, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_outer_3", + "uvlock": true, + "x": 180 + } + ], + "facing=east,half=top,shape=outer_right": [ + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_outer", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_outer_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_outer_2", + "uvlock": true, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_outer_3", + "uvlock": true, + "x": 180, + "y": 90 + } + ], + "facing=east,half=top,shape=straight": [ + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_1", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_2", + "uvlock": true, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_3", + "uvlock": true, + "x": 180 + } + ], + "facing=north,half=bottom,shape=inner_left": [ + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_inner", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_inner_1", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_inner_2", + "uvlock": true, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_inner_3", + "uvlock": true, + "y": 180 + } + ], + "facing=north,half=bottom,shape=inner_right": [ + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_inner", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_inner_1", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_inner_2", + "uvlock": true, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_inner_3", + "uvlock": true, + "y": 270 + } + ], + "facing=north,half=bottom,shape=outer_left": [ + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_outer", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_outer_1", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_outer_2", + "uvlock": true, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_outer_3", + "uvlock": true, + "y": 180 + } + ], + "facing=north,half=bottom,shape=outer_right": [ + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_outer", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_outer_1", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_outer_2", + "uvlock": true, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_outer_3", + "uvlock": true, + "y": 270 + } + ], + "facing=north,half=bottom,shape=straight": [ + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_1", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_2", + "uvlock": true, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_3", + "uvlock": true, + "y": 270 + } + ], + "facing=north,half=top,shape=inner_left": [ + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_inner", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_inner_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_inner_2", + "uvlock": true, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_inner_3", + "uvlock": true, + "x": 180, + "y": 270 + } + ], + "facing=north,half=top,shape=inner_right": [ + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_inner", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_inner_1", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_inner_2", + "uvlock": true, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_inner_3", + "uvlock": true, + "x": 180 + } + ], + "facing=north,half=top,shape=outer_left": [ + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_outer", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_outer_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_outer_2", + "uvlock": true, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_outer_3", + "uvlock": true, + "x": 180, + "y": 270 + } + ], + "facing=north,half=top,shape=outer_right": [ + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_outer", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_outer_1", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_outer_2", + "uvlock": true, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_outer_3", + "uvlock": true, + "x": 180 + } + ], + "facing=north,half=top,shape=straight": [ + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_2", + "uvlock": true, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_3", + "uvlock": true, + "x": 180, + "y": 270 + } + ], + "facing=south,half=bottom,shape=inner_left": [ + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_inner", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_inner_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_inner_2" + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_inner_3" + } + ], + "facing=south,half=bottom,shape=inner_right": [ + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_inner", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_inner_1", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_inner_2", + "uvlock": true, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_inner_3", + "uvlock": true, + "y": 90 + } + ], + "facing=south,half=bottom,shape=outer_left": [ + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_outer", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_outer_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_outer_2" + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_outer_3" + } + ], + "facing=south,half=bottom,shape=outer_right": [ + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_outer", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_outer_1", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_outer_2", + "uvlock": true, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_outer_3", + "uvlock": true, + "y": 90 + } + ], + "facing=south,half=bottom,shape=straight": [ + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_1", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_2", + "uvlock": true, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_3", + "uvlock": true, + "y": 90 + } + ], + "facing=south,half=top,shape=inner_left": [ + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_inner", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_inner_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_inner_2", + "uvlock": true, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_inner_3", + "uvlock": true, + "x": 180, + "y": 90 + } + ], + "facing=south,half=top,shape=inner_right": [ + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_inner", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_inner_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_inner_2", + "uvlock": true, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_inner_3", + "uvlock": true, + "x": 180, + "y": 180 + } + ], + "facing=south,half=top,shape=outer_left": [ + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_outer", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_outer_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_outer_2", + "uvlock": true, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_outer_3", + "uvlock": true, + "x": 180, + "y": 90 + } + ], + "facing=south,half=top,shape=outer_right": [ + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_outer", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_outer_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_outer_2", + "uvlock": true, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_outer_3", + "uvlock": true, + "x": 180, + "y": 180 + } + ], + "facing=south,half=top,shape=straight": [ + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_2", + "uvlock": true, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_3", + "uvlock": true, + "x": 180, + "y": 90 + } + ], + "facing=west,half=bottom,shape=inner_left": [ + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_inner", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_inner_1", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_inner_2", + "uvlock": true, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_inner_3", + "uvlock": true, + "y": 90 + } + ], + "facing=west,half=bottom,shape=inner_right": [ + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_inner", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_inner_1", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_inner_2", + "uvlock": true, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_inner_3", + "uvlock": true, + "y": 180 + } + ], + "facing=west,half=bottom,shape=outer_left": [ + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_outer", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_outer_1", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_outer_2", + "uvlock": true, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_outer_3", + "uvlock": true, + "y": 90 + } + ], + "facing=west,half=bottom,shape=outer_right": [ + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_outer", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_outer_1", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_outer_2", + "uvlock": true, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_outer_3", + "uvlock": true, + "y": 180 + } + ], + "facing=west,half=bottom,shape=straight": [ + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_1", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_2", + "uvlock": true, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_3", + "uvlock": true, + "y": 180 + } + ], + "facing=west,half=top,shape=inner_left": [ + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_inner", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_inner_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_inner_2", + "uvlock": true, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_inner_3", + "uvlock": true, + "x": 180, + "y": 180 + } + ], + "facing=west,half=top,shape=inner_right": [ + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_inner", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_inner_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_inner_2", + "uvlock": true, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_inner_3", + "uvlock": true, + "x": 180, + "y": 270 + } + ], + "facing=west,half=top,shape=outer_left": [ + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_outer", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_outer_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_outer_2", + "uvlock": true, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_outer_3", + "uvlock": true, + "x": 180, + "y": 180 + } + ], + "facing=west,half=top,shape=outer_right": [ + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_outer", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_outer_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_outer_2", + "uvlock": true, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_outer_3", + "uvlock": true, + "x": 180, + "y": 270 + } + ], + "facing=west,half=top,shape=straight": [ + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_2", + "uvlock": true, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/sort/sorting_stairs_3", + "uvlock": true, + "x": 180, + "y": 180 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/sorting_trapdoor.json b/src/generated/resources/assets/twilightforest/blockstates/sorting_trapdoor.json new file mode 100644 index 0000000000..fe44536df5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/sorting_trapdoor.json @@ -0,0 +1,68 @@ +{ + "variants": { + "facing=east,half=bottom,open=false": { + "model": "twilightforest:block/wood/trapdoor/sort/sort_trapdoor_bottom", + "y": 90 + }, + "facing=east,half=bottom,open=true": { + "model": "twilightforest:block/wood/trapdoor/sort/sort_trapdoor_open", + "y": 90 + }, + "facing=east,half=top,open=false": { + "model": "twilightforest:block/wood/trapdoor/sort/sort_trapdoor_top", + "y": 90 + }, + "facing=east,half=top,open=true": { + "model": "twilightforest:block/wood/trapdoor/sort/sort_trapdoor_open", + "x": 180, + "y": 270 + }, + "facing=north,half=bottom,open=false": { + "model": "twilightforest:block/wood/trapdoor/sort/sort_trapdoor_bottom" + }, + "facing=north,half=bottom,open=true": { + "model": "twilightforest:block/wood/trapdoor/sort/sort_trapdoor_open" + }, + "facing=north,half=top,open=false": { + "model": "twilightforest:block/wood/trapdoor/sort/sort_trapdoor_top" + }, + "facing=north,half=top,open=true": { + "model": "twilightforest:block/wood/trapdoor/sort/sort_trapdoor_open", + "x": 180, + "y": 180 + }, + "facing=south,half=bottom,open=false": { + "model": "twilightforest:block/wood/trapdoor/sort/sort_trapdoor_bottom", + "y": 180 + }, + "facing=south,half=bottom,open=true": { + "model": "twilightforest:block/wood/trapdoor/sort/sort_trapdoor_open", + "y": 180 + }, + "facing=south,half=top,open=false": { + "model": "twilightforest:block/wood/trapdoor/sort/sort_trapdoor_top", + "y": 180 + }, + "facing=south,half=top,open=true": { + "model": "twilightforest:block/wood/trapdoor/sort/sort_trapdoor_open", + "x": 180 + }, + "facing=west,half=bottom,open=false": { + "model": "twilightforest:block/wood/trapdoor/sort/sort_trapdoor_bottom", + "y": 270 + }, + "facing=west,half=bottom,open=true": { + "model": "twilightforest:block/wood/trapdoor/sort/sort_trapdoor_open", + "y": 270 + }, + "facing=west,half=top,open=false": { + "model": "twilightforest:block/wood/trapdoor/sort/sort_trapdoor_top", + "y": 270 + }, + "facing=west,half=top,open=true": { + "model": "twilightforest:block/wood/trapdoor/sort/sort_trapdoor_open", + "x": 180, + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/sorting_wall_sign.json b/src/generated/resources/assets/twilightforest/blockstates/sorting_wall_sign.json new file mode 100644 index 0000000000..f28fa09ed3 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/sorting_wall_sign.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/sorting_wall_sign" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/sorting_wood.json b/src/generated/resources/assets/twilightforest/blockstates/sorting_wood.json new file mode 100644 index 0000000000..bbb2e25785 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/sorting_wood.json @@ -0,0 +1,16 @@ +{ + "variants": { + "axis=x": { + "model": "twilightforest:block/sorting_wood_horizontal", + "x": 90, + "y": 90 + }, + "axis=y": { + "model": "twilightforest:block/sorting_wood" + }, + "axis=z": { + "model": "twilightforest:block/sorting_wood_horizontal", + "x": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/spiral_bricks.json b/src/generated/resources/assets/twilightforest/blockstates/spiral_bricks.json new file mode 100644 index 0000000000..edc867630e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/spiral_bricks.json @@ -0,0 +1,40 @@ +{ + "variants": { + "axis=x,diagonal=bottom_left": { + "model": "twilightforest:block/spiral_bricks/x_spiral_bottom_left" + }, + "axis=x,diagonal=bottom_right": { + "model": "twilightforest:block/spiral_bricks/x_spiral_bottom_right" + }, + "axis=x,diagonal=top_left": { + "model": "twilightforest:block/spiral_bricks/x_spiral_top_left" + }, + "axis=x,diagonal=top_right": { + "model": "twilightforest:block/spiral_bricks/x_spiral_top_right" + }, + "axis=y,diagonal=bottom_left": { + "model": "twilightforest:block/spiral_bricks/y_spiral_bottom_left" + }, + "axis=y,diagonal=bottom_right": { + "model": "twilightforest:block/spiral_bricks/y_spiral_bottom_right" + }, + "axis=y,diagonal=top_left": { + "model": "twilightforest:block/spiral_bricks/y_spiral_top_left" + }, + "axis=y,diagonal=top_right": { + "model": "twilightforest:block/spiral_bricks/y_spiral_top_right" + }, + "axis=z,diagonal=bottom_left": { + "model": "twilightforest:block/spiral_bricks/z_spiral_bottom_left" + }, + "axis=z,diagonal=bottom_right": { + "model": "twilightforest:block/spiral_bricks/z_spiral_bottom_right" + }, + "axis=z,diagonal=top_left": { + "model": "twilightforest:block/spiral_bricks/z_spiral_top_left" + }, + "axis=z,diagonal=top_right": { + "model": "twilightforest:block/spiral_bricks/z_spiral_top_right" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/spruce_banister.json b/src/generated/resources/assets/twilightforest/blockstates/spruce_banister.json new file mode 100644 index 0000000000..25fccdbf0a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/spruce_banister.json @@ -0,0 +1,94 @@ +{ + "variants": { + "extended=false,facing=east,shape=connected": { + "model": "twilightforest:block/wood/banister/spruce/spruce_banister_connected", + "y": 270 + }, + "extended=false,facing=east,shape=short": { + "model": "twilightforest:block/wood/banister/spruce/spruce_banister_short", + "y": 270 + }, + "extended=false,facing=east,shape=tall": { + "model": "twilightforest:block/wood/banister/spruce/spruce_banister_tall", + "y": 270 + }, + "extended=false,facing=north,shape=connected": { + "model": "twilightforest:block/wood/banister/spruce/spruce_banister_connected", + "y": 180 + }, + "extended=false,facing=north,shape=short": { + "model": "twilightforest:block/wood/banister/spruce/spruce_banister_short", + "y": 180 + }, + "extended=false,facing=north,shape=tall": { + "model": "twilightforest:block/wood/banister/spruce/spruce_banister_tall", + "y": 180 + }, + "extended=false,facing=south,shape=connected": { + "model": "twilightforest:block/wood/banister/spruce/spruce_banister_connected" + }, + "extended=false,facing=south,shape=short": { + "model": "twilightforest:block/wood/banister/spruce/spruce_banister_short" + }, + "extended=false,facing=south,shape=tall": { + "model": "twilightforest:block/wood/banister/spruce/spruce_banister_tall" + }, + "extended=false,facing=west,shape=connected": { + "model": "twilightforest:block/wood/banister/spruce/spruce_banister_connected", + "y": 90 + }, + "extended=false,facing=west,shape=short": { + "model": "twilightforest:block/wood/banister/spruce/spruce_banister_short", + "y": 90 + }, + "extended=false,facing=west,shape=tall": { + "model": "twilightforest:block/wood/banister/spruce/spruce_banister_tall", + "y": 90 + }, + "extended=true,facing=east,shape=connected": { + "model": "twilightforest:block/wood/banister/spruce/spruce_banister_connected_extended", + "y": 270 + }, + "extended=true,facing=east,shape=short": { + "model": "twilightforest:block/wood/banister/spruce/spruce_banister_short_extended", + "y": 270 + }, + "extended=true,facing=east,shape=tall": { + "model": "twilightforest:block/wood/banister/spruce/spruce_banister_tall_extended", + "y": 270 + }, + "extended=true,facing=north,shape=connected": { + "model": "twilightforest:block/wood/banister/spruce/spruce_banister_connected_extended", + "y": 180 + }, + "extended=true,facing=north,shape=short": { + "model": "twilightforest:block/wood/banister/spruce/spruce_banister_short_extended", + "y": 180 + }, + "extended=true,facing=north,shape=tall": { + "model": "twilightforest:block/wood/banister/spruce/spruce_banister_tall_extended", + "y": 180 + }, + "extended=true,facing=south,shape=connected": { + "model": "twilightforest:block/wood/banister/spruce/spruce_banister_connected_extended" + }, + "extended=true,facing=south,shape=short": { + "model": "twilightforest:block/wood/banister/spruce/spruce_banister_short_extended" + }, + "extended=true,facing=south,shape=tall": { + "model": "twilightforest:block/wood/banister/spruce/spruce_banister_tall_extended" + }, + "extended=true,facing=west,shape=connected": { + "model": "twilightforest:block/wood/banister/spruce/spruce_banister_connected_extended", + "y": 90 + }, + "extended=true,facing=west,shape=short": { + "model": "twilightforest:block/wood/banister/spruce/spruce_banister_short_extended", + "y": 90 + }, + "extended=true,facing=west,shape=tall": { + "model": "twilightforest:block/wood/banister/spruce/spruce_banister_tall_extended", + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/steeleaf_block.json b/src/generated/resources/assets/twilightforest/blockstates/steeleaf_block.json new file mode 100644 index 0000000000..1160e979ac --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/steeleaf_block.json @@ -0,0 +1,50 @@ +{ + "variants": { + "": [ + { + "model": "twilightforest:block/steeleaf_block" + }, + { + "model": "twilightforest:block/steeleaf_block", + "y": 90 + }, + { + "model": "twilightforest:block/steeleaf_block", + "y": 180 + }, + { + "model": "twilightforest:block/steeleaf_block", + "x": 90 + }, + { + "model": "twilightforest:block/steeleaf_block", + "x": 90, + "y": 90 + }, + { + "model": "twilightforest:block/steeleaf_block", + "x": 90, + "y": 180 + }, + { + "model": "twilightforest:block/steeleaf_block", + "x": 180 + }, + { + "model": "twilightforest:block/steeleaf_block", + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/steeleaf_block", + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/steeleaf_block", + "x": 270, + "y": 270 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/stripped_canopy_log.json b/src/generated/resources/assets/twilightforest/blockstates/stripped_canopy_log.json new file mode 100644 index 0000000000..6e2cf1faa1 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/stripped_canopy_log.json @@ -0,0 +1,16 @@ +{ + "variants": { + "axis=x": { + "model": "twilightforest:block/stripped_canopy_log_horizontal", + "x": 90, + "y": 90 + }, + "axis=y": { + "model": "twilightforest:block/stripped_canopy_log" + }, + "axis=z": { + "model": "twilightforest:block/stripped_canopy_log_horizontal", + "x": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/stripped_canopy_wood.json b/src/generated/resources/assets/twilightforest/blockstates/stripped_canopy_wood.json new file mode 100644 index 0000000000..da43a11a26 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/stripped_canopy_wood.json @@ -0,0 +1,16 @@ +{ + "variants": { + "axis=x": { + "model": "twilightforest:block/stripped_canopy_wood_horizontal", + "x": 90, + "y": 90 + }, + "axis=y": { + "model": "twilightforest:block/stripped_canopy_wood" + }, + "axis=z": { + "model": "twilightforest:block/stripped_canopy_wood_horizontal", + "x": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/stripped_dark_log.json b/src/generated/resources/assets/twilightforest/blockstates/stripped_dark_log.json new file mode 100644 index 0000000000..1eac8721fb --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/stripped_dark_log.json @@ -0,0 +1,16 @@ +{ + "variants": { + "axis=x": { + "model": "twilightforest:block/stripped_dark_log_horizontal", + "x": 90, + "y": 90 + }, + "axis=y": { + "model": "twilightforest:block/stripped_dark_log" + }, + "axis=z": { + "model": "twilightforest:block/stripped_dark_log_horizontal", + "x": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/stripped_dark_wood.json b/src/generated/resources/assets/twilightforest/blockstates/stripped_dark_wood.json new file mode 100644 index 0000000000..3c3d314da5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/stripped_dark_wood.json @@ -0,0 +1,16 @@ +{ + "variants": { + "axis=x": { + "model": "twilightforest:block/stripped_dark_wood_horizontal", + "x": 90, + "y": 90 + }, + "axis=y": { + "model": "twilightforest:block/stripped_dark_wood" + }, + "axis=z": { + "model": "twilightforest:block/stripped_dark_wood_horizontal", + "x": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/stripped_mangrove_log.json b/src/generated/resources/assets/twilightforest/blockstates/stripped_mangrove_log.json new file mode 100644 index 0000000000..9df911bfff --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/stripped_mangrove_log.json @@ -0,0 +1,16 @@ +{ + "variants": { + "axis=x": { + "model": "twilightforest:block/stripped_mangrove_log_horizontal", + "x": 90, + "y": 90 + }, + "axis=y": { + "model": "twilightforest:block/stripped_mangrove_log" + }, + "axis=z": { + "model": "twilightforest:block/stripped_mangrove_log_horizontal", + "x": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/stripped_mangrove_wood.json b/src/generated/resources/assets/twilightforest/blockstates/stripped_mangrove_wood.json new file mode 100644 index 0000000000..9f3f51938f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/stripped_mangrove_wood.json @@ -0,0 +1,16 @@ +{ + "variants": { + "axis=x": { + "model": "twilightforest:block/stripped_mangrove_wood_horizontal", + "x": 90, + "y": 90 + }, + "axis=y": { + "model": "twilightforest:block/stripped_mangrove_wood" + }, + "axis=z": { + "model": "twilightforest:block/stripped_mangrove_wood_horizontal", + "x": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/stripped_mining_log.json b/src/generated/resources/assets/twilightforest/blockstates/stripped_mining_log.json new file mode 100644 index 0000000000..4a22501f95 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/stripped_mining_log.json @@ -0,0 +1,16 @@ +{ + "variants": { + "axis=x": { + "model": "twilightforest:block/stripped_mining_log_horizontal", + "x": 90, + "y": 90 + }, + "axis=y": { + "model": "twilightforest:block/stripped_mining_log" + }, + "axis=z": { + "model": "twilightforest:block/stripped_mining_log_horizontal", + "x": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/stripped_mining_wood.json b/src/generated/resources/assets/twilightforest/blockstates/stripped_mining_wood.json new file mode 100644 index 0000000000..af717ebd6f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/stripped_mining_wood.json @@ -0,0 +1,16 @@ +{ + "variants": { + "axis=x": { + "model": "twilightforest:block/stripped_mining_wood_horizontal", + "x": 90, + "y": 90 + }, + "axis=y": { + "model": "twilightforest:block/stripped_mining_wood" + }, + "axis=z": { + "model": "twilightforest:block/stripped_mining_wood_horizontal", + "x": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/stripped_sorting_log.json b/src/generated/resources/assets/twilightforest/blockstates/stripped_sorting_log.json new file mode 100644 index 0000000000..b96b90681f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/stripped_sorting_log.json @@ -0,0 +1,16 @@ +{ + "variants": { + "axis=x": { + "model": "twilightforest:block/stripped_sorting_log_horizontal", + "x": 90, + "y": 90 + }, + "axis=y": { + "model": "twilightforest:block/stripped_sorting_log" + }, + "axis=z": { + "model": "twilightforest:block/stripped_sorting_log_horizontal", + "x": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/stripped_sorting_wood.json b/src/generated/resources/assets/twilightforest/blockstates/stripped_sorting_wood.json new file mode 100644 index 0000000000..8d73136ddd --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/stripped_sorting_wood.json @@ -0,0 +1,16 @@ +{ + "variants": { + "axis=x": { + "model": "twilightforest:block/stripped_sorting_wood_horizontal", + "x": 90, + "y": 90 + }, + "axis=y": { + "model": "twilightforest:block/stripped_sorting_wood" + }, + "axis=z": { + "model": "twilightforest:block/stripped_sorting_wood_horizontal", + "x": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/stripped_time_log.json b/src/generated/resources/assets/twilightforest/blockstates/stripped_time_log.json new file mode 100644 index 0000000000..dca486bba4 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/stripped_time_log.json @@ -0,0 +1,16 @@ +{ + "variants": { + "axis=x": { + "model": "twilightforest:block/stripped_time_log_horizontal", + "x": 90, + "y": 90 + }, + "axis=y": { + "model": "twilightforest:block/stripped_time_log" + }, + "axis=z": { + "model": "twilightforest:block/stripped_time_log_horizontal", + "x": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/stripped_time_wood.json b/src/generated/resources/assets/twilightforest/blockstates/stripped_time_wood.json new file mode 100644 index 0000000000..ac3577c6fe --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/stripped_time_wood.json @@ -0,0 +1,16 @@ +{ + "variants": { + "axis=x": { + "model": "twilightforest:block/stripped_time_wood_horizontal", + "x": 90, + "y": 90 + }, + "axis=y": { + "model": "twilightforest:block/stripped_time_wood" + }, + "axis=z": { + "model": "twilightforest:block/stripped_time_wood_horizontal", + "x": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/stripped_transformation_log.json b/src/generated/resources/assets/twilightforest/blockstates/stripped_transformation_log.json new file mode 100644 index 0000000000..7e7bbbd8ef --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/stripped_transformation_log.json @@ -0,0 +1,16 @@ +{ + "variants": { + "axis=x": { + "model": "twilightforest:block/stripped_transformation_log_horizontal", + "x": 90, + "y": 90 + }, + "axis=y": { + "model": "twilightforest:block/stripped_transformation_log" + }, + "axis=z": { + "model": "twilightforest:block/stripped_transformation_log_horizontal", + "x": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/stripped_transformation_wood.json b/src/generated/resources/assets/twilightforest/blockstates/stripped_transformation_wood.json new file mode 100644 index 0000000000..569f5328a6 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/stripped_transformation_wood.json @@ -0,0 +1,16 @@ +{ + "variants": { + "axis=x": { + "model": "twilightforest:block/stripped_transformation_wood_horizontal", + "x": 90, + "y": 90 + }, + "axis=y": { + "model": "twilightforest:block/stripped_transformation_wood" + }, + "axis=z": { + "model": "twilightforest:block/stripped_transformation_wood_horizontal", + "x": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/stripped_twilight_oak_log.json b/src/generated/resources/assets/twilightforest/blockstates/stripped_twilight_oak_log.json new file mode 100644 index 0000000000..f87e2cb42d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/stripped_twilight_oak_log.json @@ -0,0 +1,16 @@ +{ + "variants": { + "axis=x": { + "model": "twilightforest:block/stripped_twilight_oak_log_horizontal", + "x": 90, + "y": 90 + }, + "axis=y": { + "model": "twilightforest:block/stripped_twilight_oak_log" + }, + "axis=z": { + "model": "twilightforest:block/stripped_twilight_oak_log_horizontal", + "x": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/stripped_twilight_oak_wood.json b/src/generated/resources/assets/twilightforest/blockstates/stripped_twilight_oak_wood.json new file mode 100644 index 0000000000..b3c46adcac --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/stripped_twilight_oak_wood.json @@ -0,0 +1,16 @@ +{ + "variants": { + "axis=x": { + "model": "twilightforest:block/stripped_twilight_oak_wood_horizontal", + "x": 90, + "y": 90 + }, + "axis=y": { + "model": "twilightforest:block/stripped_twilight_oak_wood" + }, + "axis=z": { + "model": "twilightforest:block/stripped_twilight_oak_wood_horizontal", + "x": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/stronghold_shield.json b/src/generated/resources/assets/twilightforest/blockstates/stronghold_shield.json new file mode 100644 index 0000000000..a21f2b14da --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/stronghold_shield.json @@ -0,0 +1,36 @@ +{ + "variants": { + "facing=down": { + "model": "twilightforest:block/stronghold_shield", + "uvlock": true, + "x": 180 + }, + "facing=east": { + "model": "twilightforest:block/stronghold_shield", + "uvlock": true, + "x": 90, + "y": 270 + }, + "facing=north": { + "model": "twilightforest:block/stronghold_shield", + "uvlock": true, + "x": 90, + "y": 180 + }, + "facing=south": { + "model": "twilightforest:block/stronghold_shield", + "uvlock": true, + "x": 90 + }, + "facing=up": { + "model": "twilightforest:block/stronghold_shield", + "uvlock": true + }, + "facing=west": { + "model": "twilightforest:block/stronghold_shield", + "uvlock": true, + "x": 90, + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/thick_castle_brick.json b/src/generated/resources/assets/twilightforest/blockstates/thick_castle_brick.json new file mode 100644 index 0000000000..f7470ac49a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/thick_castle_brick.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/thick_castle_brick" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/thorn_leaves.json b/src/generated/resources/assets/twilightforest/blockstates/thorn_leaves.json new file mode 100644 index 0000000000..4aa066cc0d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/thorn_leaves.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/thorn_leaves" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/thorn_rose.json b/src/generated/resources/assets/twilightforest/blockstates/thorn_rose.json new file mode 100644 index 0000000000..2c3bd04d1d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/thorn_rose.json @@ -0,0 +1,29 @@ +{ + "variants": { + "facing=down": { + "model": "twilightforest:block/thorn_rose", + "x": 180 + }, + "facing=east": { + "model": "twilightforest:block/thorn_rose", + "x": 90, + "y": 90 + }, + "facing=north": { + "model": "twilightforest:block/thorn_rose", + "x": 90 + }, + "facing=south": { + "model": "twilightforest:block/thorn_rose", + "x": 270 + }, + "facing=up": { + "model": "twilightforest:block/thorn_rose" + }, + "facing=west": { + "model": "twilightforest:block/thorn_rose", + "x": 270, + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/time_banister.json b/src/generated/resources/assets/twilightforest/blockstates/time_banister.json new file mode 100644 index 0000000000..3e8c47e10e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/time_banister.json @@ -0,0 +1,460 @@ +{ + "variants": { + "extended=false,facing=east,shape=connected": [ + { + "model": "twilightforest:block/wood/banister/time/time_banister_connected", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/time/time_banister_connected_1", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/time/time_banister_connected_2", + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/time/time_banister_connected_3", + "y": 270 + } + ], + "extended=false,facing=east,shape=short": [ + { + "model": "twilightforest:block/wood/banister/time/time_banister_short", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/time/time_banister_short_1", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/time/time_banister_short_2", + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/time/time_banister_short_3", + "y": 270 + } + ], + "extended=false,facing=east,shape=tall": [ + { + "model": "twilightforest:block/wood/banister/time/time_banister_tall", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/time/time_banister_tall_1", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/time/time_banister_tall_2", + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/time/time_banister_tall_3", + "y": 270 + } + ], + "extended=false,facing=north,shape=connected": [ + { + "model": "twilightforest:block/wood/banister/time/time_banister_connected", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/time/time_banister_connected_1", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/time/time_banister_connected_2", + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/time/time_banister_connected_3", + "y": 180 + } + ], + "extended=false,facing=north,shape=short": [ + { + "model": "twilightforest:block/wood/banister/time/time_banister_short", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/time/time_banister_short_1", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/time/time_banister_short_2", + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/time/time_banister_short_3", + "y": 180 + } + ], + "extended=false,facing=north,shape=tall": [ + { + "model": "twilightforest:block/wood/banister/time/time_banister_tall", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/time/time_banister_tall_1", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/time/time_banister_tall_2", + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/time/time_banister_tall_3", + "y": 180 + } + ], + "extended=false,facing=south,shape=connected": [ + { + "model": "twilightforest:block/wood/banister/time/time_banister_connected", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/time/time_banister_connected_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/time/time_banister_connected_2" + }, + { + "model": "twilightforest:block/wood/banister/time/time_banister_connected_3" + } + ], + "extended=false,facing=south,shape=short": [ + { + "model": "twilightforest:block/wood/banister/time/time_banister_short", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/time/time_banister_short_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/time/time_banister_short_2" + }, + { + "model": "twilightforest:block/wood/banister/time/time_banister_short_3" + } + ], + "extended=false,facing=south,shape=tall": [ + { + "model": "twilightforest:block/wood/banister/time/time_banister_tall", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/time/time_banister_tall_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/time/time_banister_tall_2" + }, + { + "model": "twilightforest:block/wood/banister/time/time_banister_tall_3" + } + ], + "extended=false,facing=west,shape=connected": [ + { + "model": "twilightforest:block/wood/banister/time/time_banister_connected", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/time/time_banister_connected_1", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/time/time_banister_connected_2", + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/time/time_banister_connected_3", + "y": 90 + } + ], + "extended=false,facing=west,shape=short": [ + { + "model": "twilightforest:block/wood/banister/time/time_banister_short", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/time/time_banister_short_1", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/time/time_banister_short_2", + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/time/time_banister_short_3", + "y": 90 + } + ], + "extended=false,facing=west,shape=tall": [ + { + "model": "twilightforest:block/wood/banister/time/time_banister_tall", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/time/time_banister_tall_1", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/time/time_banister_tall_2", + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/time/time_banister_tall_3", + "y": 90 + } + ], + "extended=true,facing=east,shape=connected": [ + { + "model": "twilightforest:block/wood/banister/time/time_banister_connected_extended", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/time/time_banister_connected_extended_1", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/time/time_banister_connected_extended_2", + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/time/time_banister_connected_extended_3", + "y": 270 + } + ], + "extended=true,facing=east,shape=short": [ + { + "model": "twilightforest:block/wood/banister/time/time_banister_short_extended", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/time/time_banister_short_extended_1", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/time/time_banister_short_extended_2", + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/time/time_banister_short_extended_3", + "y": 270 + } + ], + "extended=true,facing=east,shape=tall": [ + { + "model": "twilightforest:block/wood/banister/time/time_banister_tall_extended", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/time/time_banister_tall_extended_1", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/time/time_banister_tall_extended_2", + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/time/time_banister_tall_extended_3", + "y": 270 + } + ], + "extended=true,facing=north,shape=connected": [ + { + "model": "twilightforest:block/wood/banister/time/time_banister_connected_extended", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/time/time_banister_connected_extended_1", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/time/time_banister_connected_extended_2", + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/time/time_banister_connected_extended_3", + "y": 180 + } + ], + "extended=true,facing=north,shape=short": [ + { + "model": "twilightforest:block/wood/banister/time/time_banister_short_extended", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/time/time_banister_short_extended_1", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/time/time_banister_short_extended_2", + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/time/time_banister_short_extended_3", + "y": 180 + } + ], + "extended=true,facing=north,shape=tall": [ + { + "model": "twilightforest:block/wood/banister/time/time_banister_tall_extended", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/time/time_banister_tall_extended_1", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/time/time_banister_tall_extended_2", + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/time/time_banister_tall_extended_3", + "y": 180 + } + ], + "extended=true,facing=south,shape=connected": [ + { + "model": "twilightforest:block/wood/banister/time/time_banister_connected_extended", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/time/time_banister_connected_extended_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/time/time_banister_connected_extended_2" + }, + { + "model": "twilightforest:block/wood/banister/time/time_banister_connected_extended_3" + } + ], + "extended=true,facing=south,shape=short": [ + { + "model": "twilightforest:block/wood/banister/time/time_banister_short_extended", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/time/time_banister_short_extended_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/time/time_banister_short_extended_2" + }, + { + "model": "twilightforest:block/wood/banister/time/time_banister_short_extended_3" + } + ], + "extended=true,facing=south,shape=tall": [ + { + "model": "twilightforest:block/wood/banister/time/time_banister_tall_extended", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/time/time_banister_tall_extended_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/time/time_banister_tall_extended_2" + }, + { + "model": "twilightforest:block/wood/banister/time/time_banister_tall_extended_3" + } + ], + "extended=true,facing=west,shape=connected": [ + { + "model": "twilightforest:block/wood/banister/time/time_banister_connected_extended", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/time/time_banister_connected_extended_1", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/time/time_banister_connected_extended_2", + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/time/time_banister_connected_extended_3", + "y": 90 + } + ], + "extended=true,facing=west,shape=short": [ + { + "model": "twilightforest:block/wood/banister/time/time_banister_short_extended", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/time/time_banister_short_extended_1", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/time/time_banister_short_extended_2", + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/time/time_banister_short_extended_3", + "y": 90 + } + ], + "extended=true,facing=west,shape=tall": [ + { + "model": "twilightforest:block/wood/banister/time/time_banister_tall_extended", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/time/time_banister_tall_extended_1", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/time/time_banister_tall_extended_2", + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/time/time_banister_tall_extended_3", + "y": 90 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/time_button.json b/src/generated/resources/assets/twilightforest/blockstates/time_button.json new file mode 100644 index 0000000000..8bac63003d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/time_button.json @@ -0,0 +1,556 @@ +{ + "variants": { + "face=ceiling,facing=east,powered=false": [ + { + "model": "twilightforest:block/wood/button/time/time_button", + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/time/time_button_1", + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/time/time_button_2", + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/time/time_button_3", + "x": 180, + "y": 270 + } + ], + "face=ceiling,facing=east,powered=true": [ + { + "model": "twilightforest:block/wood/button/time/time_button_pressed", + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/time/time_button_pressed_1", + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/time/time_button_pressed_2", + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/time/time_button_pressed_3", + "x": 180, + "y": 270 + } + ], + "face=ceiling,facing=north,powered=false": [ + { + "model": "twilightforest:block/wood/button/time/time_button", + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/time/time_button_1", + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/time/time_button_2", + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/time/time_button_3", + "x": 180, + "y": 180 + } + ], + "face=ceiling,facing=north,powered=true": [ + { + "model": "twilightforest:block/wood/button/time/time_button_pressed", + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/time/time_button_pressed_1", + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/time/time_button_pressed_2", + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/time/time_button_pressed_3", + "x": 180, + "y": 180 + } + ], + "face=ceiling,facing=south,powered=false": [ + { + "model": "twilightforest:block/wood/button/time/time_button", + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/button/time/time_button_1", + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/button/time/time_button_2", + "x": 180 + }, + { + "model": "twilightforest:block/wood/button/time/time_button_3", + "x": 180 + } + ], + "face=ceiling,facing=south,powered=true": [ + { + "model": "twilightforest:block/wood/button/time/time_button_pressed", + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/button/time/time_button_pressed_1", + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/button/time/time_button_pressed_2", + "x": 180 + }, + { + "model": "twilightforest:block/wood/button/time/time_button_pressed_3", + "x": 180 + } + ], + "face=ceiling,facing=west,powered=false": [ + { + "model": "twilightforest:block/wood/button/time/time_button", + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/time/time_button_1", + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/time/time_button_2", + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/time/time_button_3", + "x": 180, + "y": 90 + } + ], + "face=ceiling,facing=west,powered=true": [ + { + "model": "twilightforest:block/wood/button/time/time_button_pressed", + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/time/time_button_pressed_1", + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/time/time_button_pressed_2", + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/time/time_button_pressed_3", + "x": 180, + "y": 90 + } + ], + "face=floor,facing=east,powered=false": [ + { + "model": "twilightforest:block/wood/button/time/time_button", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/time/time_button_1", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/time/time_button_2", + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/time/time_button_3", + "y": 90 + } + ], + "face=floor,facing=east,powered=true": [ + { + "model": "twilightforest:block/wood/button/time/time_button_pressed", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/time/time_button_pressed_1", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/time/time_button_pressed_2", + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/time/time_button_pressed_3", + "y": 90 + } + ], + "face=floor,facing=north,powered=false": [ + { + "model": "twilightforest:block/wood/button/time/time_button", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/button/time/time_button_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/button/time/time_button_2" + }, + { + "model": "twilightforest:block/wood/button/time/time_button_3" + } + ], + "face=floor,facing=north,powered=true": [ + { + "model": "twilightforest:block/wood/button/time/time_button_pressed", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/button/time/time_button_pressed_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/button/time/time_button_pressed_2" + }, + { + "model": "twilightforest:block/wood/button/time/time_button_pressed_3" + } + ], + "face=floor,facing=south,powered=false": [ + { + "model": "twilightforest:block/wood/button/time/time_button", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/time/time_button_1", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/time/time_button_2", + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/time/time_button_3", + "y": 180 + } + ], + "face=floor,facing=south,powered=true": [ + { + "model": "twilightforest:block/wood/button/time/time_button_pressed", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/time/time_button_pressed_1", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/time/time_button_pressed_2", + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/time/time_button_pressed_3", + "y": 180 + } + ], + "face=floor,facing=west,powered=false": [ + { + "model": "twilightforest:block/wood/button/time/time_button", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/time/time_button_1", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/time/time_button_2", + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/time/time_button_3", + "y": 270 + } + ], + "face=floor,facing=west,powered=true": [ + { + "model": "twilightforest:block/wood/button/time/time_button_pressed", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/time/time_button_pressed_1", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/time/time_button_pressed_2", + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/time/time_button_pressed_3", + "y": 270 + } + ], + "face=wall,facing=east,powered=false": [ + { + "model": "twilightforest:block/wood/button/time/time_button", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/time/time_button_1", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/time/time_button_2", + "uvlock": true, + "x": 90, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/time/time_button_3", + "uvlock": true, + "x": 90, + "y": 90 + } + ], + "face=wall,facing=east,powered=true": [ + { + "model": "twilightforest:block/wood/button/time/time_button_pressed", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/time/time_button_pressed_1", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/time/time_button_pressed_2", + "uvlock": true, + "x": 90, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/time/time_button_pressed_3", + "uvlock": true, + "x": 90, + "y": 90 + } + ], + "face=wall,facing=north,powered=false": [ + { + "model": "twilightforest:block/wood/button/time/time_button", + "uvlock": true, + "weight": 10, + "x": 90 + }, + { + "model": "twilightforest:block/wood/button/time/time_button_1", + "uvlock": true, + "weight": 10, + "x": 90 + }, + { + "model": "twilightforest:block/wood/button/time/time_button_2", + "uvlock": true, + "x": 90 + }, + { + "model": "twilightforest:block/wood/button/time/time_button_3", + "uvlock": true, + "x": 90 + } + ], + "face=wall,facing=north,powered=true": [ + { + "model": "twilightforest:block/wood/button/time/time_button_pressed", + "uvlock": true, + "weight": 10, + "x": 90 + }, + { + "model": "twilightforest:block/wood/button/time/time_button_pressed_1", + "uvlock": true, + "weight": 10, + "x": 90 + }, + { + "model": "twilightforest:block/wood/button/time/time_button_pressed_2", + "uvlock": true, + "x": 90 + }, + { + "model": "twilightforest:block/wood/button/time/time_button_pressed_3", + "uvlock": true, + "x": 90 + } + ], + "face=wall,facing=south,powered=false": [ + { + "model": "twilightforest:block/wood/button/time/time_button", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/time/time_button_1", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/time/time_button_2", + "uvlock": true, + "x": 90, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/time/time_button_3", + "uvlock": true, + "x": 90, + "y": 180 + } + ], + "face=wall,facing=south,powered=true": [ + { + "model": "twilightforest:block/wood/button/time/time_button_pressed", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/time/time_button_pressed_1", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/time/time_button_pressed_2", + "uvlock": true, + "x": 90, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/time/time_button_pressed_3", + "uvlock": true, + "x": 90, + "y": 180 + } + ], + "face=wall,facing=west,powered=false": [ + { + "model": "twilightforest:block/wood/button/time/time_button", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/time/time_button_1", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/time/time_button_2", + "uvlock": true, + "x": 90, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/time/time_button_3", + "uvlock": true, + "x": 90, + "y": 270 + } + ], + "face=wall,facing=west,powered=true": [ + { + "model": "twilightforest:block/wood/button/time/time_button_pressed", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/time/time_button_pressed_1", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/time/time_button_pressed_2", + "uvlock": true, + "x": 90, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/time/time_button_pressed_3", + "uvlock": true, + "x": 90, + "y": 270 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/time_chest.json b/src/generated/resources/assets/twilightforest/blockstates/time_chest.json new file mode 100644 index 0000000000..519919ee1a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/time_chest.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/time_chest" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/time_door.json b/src/generated/resources/assets/twilightforest/blockstates/time_door.json new file mode 100644 index 0000000000..1a3641d0eb --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/time_door.json @@ -0,0 +1,124 @@ +{ + "variants": { + "facing=east,half=lower,hinge=left,open=false": { + "model": "twilightforest:block/wood/door/time/time_door_door_bottom_left" + }, + "facing=east,half=lower,hinge=left,open=true": { + "model": "twilightforest:block/wood/door/time/time_door_door_bottom_left_open", + "y": 90 + }, + "facing=east,half=lower,hinge=right,open=false": { + "model": "twilightforest:block/wood/door/time/time_door_door_bottom_right" + }, + "facing=east,half=lower,hinge=right,open=true": { + "model": "twilightforest:block/wood/door/time/time_door_door_bottom_right_open", + "y": 270 + }, + "facing=east,half=upper,hinge=left,open=false": { + "model": "twilightforest:block/wood/door/time/time_door_door_top_left" + }, + "facing=east,half=upper,hinge=left,open=true": { + "model": "twilightforest:block/wood/door/time/time_door_door_top_left_open", + "y": 90 + }, + "facing=east,half=upper,hinge=right,open=false": { + "model": "twilightforest:block/wood/door/time/time_door_door_top_right" + }, + "facing=east,half=upper,hinge=right,open=true": { + "model": "twilightforest:block/wood/door/time/time_door_door_top_right_open", + "y": 270 + }, + "facing=north,half=lower,hinge=left,open=false": { + "model": "twilightforest:block/wood/door/time/time_door_door_bottom_left", + "y": 270 + }, + "facing=north,half=lower,hinge=left,open=true": { + "model": "twilightforest:block/wood/door/time/time_door_door_bottom_left_open" + }, + "facing=north,half=lower,hinge=right,open=false": { + "model": "twilightforest:block/wood/door/time/time_door_door_bottom_right", + "y": 270 + }, + "facing=north,half=lower,hinge=right,open=true": { + "model": "twilightforest:block/wood/door/time/time_door_door_bottom_right_open", + "y": 180 + }, + "facing=north,half=upper,hinge=left,open=false": { + "model": "twilightforest:block/wood/door/time/time_door_door_top_left", + "y": 270 + }, + "facing=north,half=upper,hinge=left,open=true": { + "model": "twilightforest:block/wood/door/time/time_door_door_top_left_open" + }, + "facing=north,half=upper,hinge=right,open=false": { + "model": "twilightforest:block/wood/door/time/time_door_door_top_right", + "y": 270 + }, + "facing=north,half=upper,hinge=right,open=true": { + "model": "twilightforest:block/wood/door/time/time_door_door_top_right_open", + "y": 180 + }, + "facing=south,half=lower,hinge=left,open=false": { + "model": "twilightforest:block/wood/door/time/time_door_door_bottom_left", + "y": 90 + }, + "facing=south,half=lower,hinge=left,open=true": { + "model": "twilightforest:block/wood/door/time/time_door_door_bottom_left_open", + "y": 180 + }, + "facing=south,half=lower,hinge=right,open=false": { + "model": "twilightforest:block/wood/door/time/time_door_door_bottom_right", + "y": 90 + }, + "facing=south,half=lower,hinge=right,open=true": { + "model": "twilightforest:block/wood/door/time/time_door_door_bottom_right_open" + }, + "facing=south,half=upper,hinge=left,open=false": { + "model": "twilightforest:block/wood/door/time/time_door_door_top_left", + "y": 90 + }, + "facing=south,half=upper,hinge=left,open=true": { + "model": "twilightforest:block/wood/door/time/time_door_door_top_left_open", + "y": 180 + }, + "facing=south,half=upper,hinge=right,open=false": { + "model": "twilightforest:block/wood/door/time/time_door_door_top_right", + "y": 90 + }, + "facing=south,half=upper,hinge=right,open=true": { + "model": "twilightforest:block/wood/door/time/time_door_door_top_right_open" + }, + "facing=west,half=lower,hinge=left,open=false": { + "model": "twilightforest:block/wood/door/time/time_door_door_bottom_left", + "y": 180 + }, + "facing=west,half=lower,hinge=left,open=true": { + "model": "twilightforest:block/wood/door/time/time_door_door_bottom_left_open", + "y": 270 + }, + "facing=west,half=lower,hinge=right,open=false": { + "model": "twilightforest:block/wood/door/time/time_door_door_bottom_right", + "y": 180 + }, + "facing=west,half=lower,hinge=right,open=true": { + "model": "twilightforest:block/wood/door/time/time_door_door_bottom_right_open", + "y": 90 + }, + "facing=west,half=upper,hinge=left,open=false": { + "model": "twilightforest:block/wood/door/time/time_door_door_top_left", + "y": 180 + }, + "facing=west,half=upper,hinge=left,open=true": { + "model": "twilightforest:block/wood/door/time/time_door_door_top_left_open", + "y": 270 + }, + "facing=west,half=upper,hinge=right,open=false": { + "model": "twilightforest:block/wood/door/time/time_door_door_top_right", + "y": 180 + }, + "facing=west,half=upper,hinge=right,open=true": { + "model": "twilightforest:block/wood/door/time/time_door_door_top_right_open", + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/time_fence.json b/src/generated/resources/assets/twilightforest/blockstates/time_fence.json new file mode 100644 index 0000000000..f66b7a0d18 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/time_fence.json @@ -0,0 +1,134 @@ +{ + "multipart": [ + { + "apply": [ + { + "model": "twilightforest:block/wood/fence/time/time_fence_post", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence/time/time_fence_post_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence/time/time_fence_post_2" + }, + { + "model": "twilightforest:block/wood/fence/time/time_fence_post_3" + } + ] + }, + { + "apply": [ + { + "model": "twilightforest:block/wood/fence/time/time_fence_side", + "uvlock": true, + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence/time/time_fence_side_1", + "uvlock": true, + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence/time/time_fence_side_2", + "uvlock": true + }, + { + "model": "twilightforest:block/wood/fence/time/time_fence_side_3", + "uvlock": true + } + ], + "when": { + "north": "true" + } + }, + { + "apply": [ + { + "model": "twilightforest:block/wood/fence/time/time_fence_side", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence/time/time_fence_side_1", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence/time/time_fence_side_2", + "uvlock": true, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence/time/time_fence_side_3", + "uvlock": true, + "y": 180 + } + ], + "when": { + "south": "true" + } + }, + { + "apply": [ + { + "model": "twilightforest:block/wood/fence/time/time_fence_side", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence/time/time_fence_side_1", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence/time/time_fence_side_2", + "uvlock": true, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence/time/time_fence_side_3", + "uvlock": true, + "y": 270 + } + ], + "when": { + "west": "true" + } + }, + { + "apply": [ + { + "model": "twilightforest:block/wood/fence/time/time_fence_side", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence/time/time_fence_side_1", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence/time/time_fence_side_2", + "uvlock": true, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence/time/time_fence_side_3", + "uvlock": true, + "y": 90 + } + ], + "when": { + "east": "true" + } + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/time_fence_gate.json b/src/generated/resources/assets/twilightforest/blockstates/time_fence_gate.json new file mode 100644 index 0000000000..f9e0eac394 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/time_fence_gate.json @@ -0,0 +1,372 @@ +{ + "variants": { + "facing=east,in_wall=false,open=false": [ + { + "model": "twilightforest:block/wood/fence_gate/time/time_fence_gate", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/time/time_fence_gate_1", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/time/time_fence_gate_2", + "uvlock": true, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/time/time_fence_gate_3", + "uvlock": true, + "y": 270 + } + ], + "facing=east,in_wall=false,open=true": [ + { + "model": "twilightforest:block/wood/fence_gate/time/time_fence_gate_open", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/time/time_fence_gate_open_1", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/time/time_fence_gate_open_2", + "uvlock": true, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/time/time_fence_gate_open_3", + "uvlock": true, + "y": 270 + } + ], + "facing=east,in_wall=true,open=false": [ + { + "model": "twilightforest:block/wood/fence_gate/time/time_fence_gate_wall", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/time/time_fence_gate_wall_1", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/time/time_fence_gate_wall_2", + "uvlock": true, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/time/time_fence_gate_wall_3", + "uvlock": true, + "y": 270 + } + ], + "facing=east,in_wall=true,open=true": [ + { + "model": "twilightforest:block/wood/fence_gate/time/time_fence_gate_wall_open", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/time/time_fence_gate_wall_open_1", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/time/time_fence_gate_wall_open_2", + "uvlock": true, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/time/time_fence_gate_wall_open_3", + "uvlock": true, + "y": 270 + } + ], + "facing=north,in_wall=false,open=false": [ + { + "model": "twilightforest:block/wood/fence_gate/time/time_fence_gate", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/time/time_fence_gate_1", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/time/time_fence_gate_2", + "uvlock": true, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/time/time_fence_gate_3", + "uvlock": true, + "y": 180 + } + ], + "facing=north,in_wall=false,open=true": [ + { + "model": "twilightforest:block/wood/fence_gate/time/time_fence_gate_open", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/time/time_fence_gate_open_1", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/time/time_fence_gate_open_2", + "uvlock": true, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/time/time_fence_gate_open_3", + "uvlock": true, + "y": 180 + } + ], + "facing=north,in_wall=true,open=false": [ + { + "model": "twilightforest:block/wood/fence_gate/time/time_fence_gate_wall", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/time/time_fence_gate_wall_1", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/time/time_fence_gate_wall_2", + "uvlock": true, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/time/time_fence_gate_wall_3", + "uvlock": true, + "y": 180 + } + ], + "facing=north,in_wall=true,open=true": [ + { + "model": "twilightforest:block/wood/fence_gate/time/time_fence_gate_wall_open", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/time/time_fence_gate_wall_open_1", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/time/time_fence_gate_wall_open_2", + "uvlock": true, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/time/time_fence_gate_wall_open_3", + "uvlock": true, + "y": 180 + } + ], + "facing=south,in_wall=false,open=false": [ + { + "model": "twilightforest:block/wood/fence_gate/time/time_fence_gate", + "uvlock": true, + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence_gate/time/time_fence_gate_1", + "uvlock": true, + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence_gate/time/time_fence_gate_2", + "uvlock": true + }, + { + "model": "twilightforest:block/wood/fence_gate/time/time_fence_gate_3", + "uvlock": true + } + ], + "facing=south,in_wall=false,open=true": [ + { + "model": "twilightforest:block/wood/fence_gate/time/time_fence_gate_open", + "uvlock": true, + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence_gate/time/time_fence_gate_open_1", + "uvlock": true, + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence_gate/time/time_fence_gate_open_2", + "uvlock": true + }, + { + "model": "twilightforest:block/wood/fence_gate/time/time_fence_gate_open_3", + "uvlock": true + } + ], + "facing=south,in_wall=true,open=false": [ + { + "model": "twilightforest:block/wood/fence_gate/time/time_fence_gate_wall", + "uvlock": true, + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence_gate/time/time_fence_gate_wall_1", + "uvlock": true, + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence_gate/time/time_fence_gate_wall_2", + "uvlock": true + }, + { + "model": "twilightforest:block/wood/fence_gate/time/time_fence_gate_wall_3", + "uvlock": true + } + ], + "facing=south,in_wall=true,open=true": [ + { + "model": "twilightforest:block/wood/fence_gate/time/time_fence_gate_wall_open", + "uvlock": true, + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence_gate/time/time_fence_gate_wall_open_1", + "uvlock": true, + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence_gate/time/time_fence_gate_wall_open_2", + "uvlock": true + }, + { + "model": "twilightforest:block/wood/fence_gate/time/time_fence_gate_wall_open_3", + "uvlock": true + } + ], + "facing=west,in_wall=false,open=false": [ + { + "model": "twilightforest:block/wood/fence_gate/time/time_fence_gate", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/time/time_fence_gate_1", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/time/time_fence_gate_2", + "uvlock": true, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/time/time_fence_gate_3", + "uvlock": true, + "y": 90 + } + ], + "facing=west,in_wall=false,open=true": [ + { + "model": "twilightforest:block/wood/fence_gate/time/time_fence_gate_open", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/time/time_fence_gate_open_1", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/time/time_fence_gate_open_2", + "uvlock": true, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/time/time_fence_gate_open_3", + "uvlock": true, + "y": 90 + } + ], + "facing=west,in_wall=true,open=false": [ + { + "model": "twilightforest:block/wood/fence_gate/time/time_fence_gate_wall", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/time/time_fence_gate_wall_1", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/time/time_fence_gate_wall_2", + "uvlock": true, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/time/time_fence_gate_wall_3", + "uvlock": true, + "y": 90 + } + ], + "facing=west,in_wall=true,open=true": [ + { + "model": "twilightforest:block/wood/fence_gate/time/time_fence_gate_wall_open", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/time/time_fence_gate_wall_open_1", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/time/time_fence_gate_wall_open_2", + "uvlock": true, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/time/time_fence_gate_wall_open_3", + "uvlock": true, + "y": 90 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/time_leaves.json b/src/generated/resources/assets/twilightforest/blockstates/time_leaves.json new file mode 100644 index 0000000000..28d91296f3 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/time_leaves.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/time_leaves" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/time_log.json b/src/generated/resources/assets/twilightforest/blockstates/time_log.json new file mode 100644 index 0000000000..ea54e43ede --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/time_log.json @@ -0,0 +1,16 @@ +{ + "variants": { + "axis=x": { + "model": "twilightforest:block/time_log_horizontal", + "x": 90, + "y": 90 + }, + "axis=y": { + "model": "twilightforest:block/time_log" + }, + "axis=z": { + "model": "twilightforest:block/time_log_horizontal", + "x": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/time_log_core.json b/src/generated/resources/assets/twilightforest/blockstates/time_log_core.json new file mode 100644 index 0000000000..8c8477af92 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/time_log_core.json @@ -0,0 +1,28 @@ +{ + "variants": { + "active=false,axis=x": { + "model": "twilightforest:block/time_log_core", + "x": 90, + "y": 90 + }, + "active=false,axis=y": { + "model": "twilightforest:block/time_log_core" + }, + "active=false,axis=z": { + "model": "twilightforest:block/time_log_core", + "x": 90 + }, + "active=true,axis=x": { + "model": "twilightforest:block/time_log_core_on", + "x": 90, + "y": 90 + }, + "active=true,axis=y": { + "model": "twilightforest:block/time_log_core_on" + }, + "active=true,axis=z": { + "model": "twilightforest:block/time_log_core_on", + "x": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/time_planks.json b/src/generated/resources/assets/twilightforest/blockstates/time_planks.json new file mode 100644 index 0000000000..94cfd0f46b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/time_planks.json @@ -0,0 +1,20 @@ +{ + "variants": { + "": [ + { + "model": "twilightforest:block/wood/planks/time/time_planks", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/planks/time/time_planks_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/planks/time/time_planks_2" + }, + { + "model": "twilightforest:block/wood/planks/time/time_planks_3" + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/time_pressure_plate.json b/src/generated/resources/assets/twilightforest/blockstates/time_pressure_plate.json new file mode 100644 index 0000000000..4a5b6e9818 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/time_pressure_plate.json @@ -0,0 +1,36 @@ +{ + "variants": { + "powered=false": [ + { + "model": "twilightforest:block/wood/pressure_plate/time/time_pressure_plate", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/pressure_plate/time/time_pressure_plate_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/pressure_plate/time/time_pressure_plate_2" + }, + { + "model": "twilightforest:block/wood/pressure_plate/time/time_pressure_plate_3" + } + ], + "powered=true": [ + { + "model": "twilightforest:block/wood/pressure_plate/time/time_pressure_plate_down", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/pressure_plate/time/time_pressure_plate_down_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/pressure_plate/time/time_pressure_plate_down_2" + }, + { + "model": "twilightforest:block/wood/pressure_plate/time/time_pressure_plate_down_3" + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/time_sapling.json b/src/generated/resources/assets/twilightforest/blockstates/time_sapling.json new file mode 100644 index 0000000000..d03c9a2a53 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/time_sapling.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/time_sapling" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/time_sign.json b/src/generated/resources/assets/twilightforest/blockstates/time_sign.json new file mode 100644 index 0000000000..b790a339df --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/time_sign.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/time_sign" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/time_slab.json b/src/generated/resources/assets/twilightforest/blockstates/time_slab.json new file mode 100644 index 0000000000..0c4888fd63 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/time_slab.json @@ -0,0 +1,60 @@ +{ + "variants": { + "type=bottom": [ + { + "model": "twilightforest:block/wood/slab/time/time_slab", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/slab/time/time_slab_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/slab/time/time_slab_2" + }, + { + "model": "twilightforest:block/wood/slab/time/time_slab_3" + } + ], + "type=double": [ + { + "model": "twilightforest:block/wood/planks/time/time_planks", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/planks/time/time_planks_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/planks/time/time_planks_2" + }, + { + "model": "twilightforest:block/wood/planks/time/time_planks_3" + } + ], + "type=top": [ + { + "model": "twilightforest:block/wood/slab/time/time_slab", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/slab/time/time_slab_1", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/slab/time/time_slab_2", + "uvlock": true, + "x": 180 + }, + { + "model": "twilightforest:block/wood/slab/time/time_slab_3", + "uvlock": true, + "x": 180 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/time_stairs.json b/src/generated/resources/assets/twilightforest/blockstates/time_stairs.json new file mode 100644 index 0000000000..046fb378cc --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/time_stairs.json @@ -0,0 +1,984 @@ +{ + "variants": { + "facing=east,half=bottom,shape=inner_left": [ + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_inner", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_inner_1", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_inner_2", + "uvlock": true, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_inner_3", + "uvlock": true, + "y": 270 + } + ], + "facing=east,half=bottom,shape=inner_right": [ + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_inner", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_inner_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_inner_2" + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_inner_3" + } + ], + "facing=east,half=bottom,shape=outer_left": [ + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_outer", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_outer_1", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_outer_2", + "uvlock": true, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_outer_3", + "uvlock": true, + "y": 270 + } + ], + "facing=east,half=bottom,shape=outer_right": [ + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_outer", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_outer_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_outer_2" + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_outer_3" + } + ], + "facing=east,half=bottom,shape=straight": [ + { + "model": "twilightforest:block/wood/stairs/time/time_stairs", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_2" + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_3" + } + ], + "facing=east,half=top,shape=inner_left": [ + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_inner", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_inner_1", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_inner_2", + "uvlock": true, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_inner_3", + "uvlock": true, + "x": 180 + } + ], + "facing=east,half=top,shape=inner_right": [ + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_inner", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_inner_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_inner_2", + "uvlock": true, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_inner_3", + "uvlock": true, + "x": 180, + "y": 90 + } + ], + "facing=east,half=top,shape=outer_left": [ + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_outer", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_outer_1", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_outer_2", + "uvlock": true, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_outer_3", + "uvlock": true, + "x": 180 + } + ], + "facing=east,half=top,shape=outer_right": [ + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_outer", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_outer_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_outer_2", + "uvlock": true, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_outer_3", + "uvlock": true, + "x": 180, + "y": 90 + } + ], + "facing=east,half=top,shape=straight": [ + { + "model": "twilightforest:block/wood/stairs/time/time_stairs", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_1", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_2", + "uvlock": true, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_3", + "uvlock": true, + "x": 180 + } + ], + "facing=north,half=bottom,shape=inner_left": [ + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_inner", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_inner_1", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_inner_2", + "uvlock": true, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_inner_3", + "uvlock": true, + "y": 180 + } + ], + "facing=north,half=bottom,shape=inner_right": [ + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_inner", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_inner_1", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_inner_2", + "uvlock": true, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_inner_3", + "uvlock": true, + "y": 270 + } + ], + "facing=north,half=bottom,shape=outer_left": [ + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_outer", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_outer_1", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_outer_2", + "uvlock": true, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_outer_3", + "uvlock": true, + "y": 180 + } + ], + "facing=north,half=bottom,shape=outer_right": [ + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_outer", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_outer_1", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_outer_2", + "uvlock": true, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_outer_3", + "uvlock": true, + "y": 270 + } + ], + "facing=north,half=bottom,shape=straight": [ + { + "model": "twilightforest:block/wood/stairs/time/time_stairs", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_1", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_2", + "uvlock": true, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_3", + "uvlock": true, + "y": 270 + } + ], + "facing=north,half=top,shape=inner_left": [ + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_inner", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_inner_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_inner_2", + "uvlock": true, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_inner_3", + "uvlock": true, + "x": 180, + "y": 270 + } + ], + "facing=north,half=top,shape=inner_right": [ + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_inner", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_inner_1", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_inner_2", + "uvlock": true, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_inner_3", + "uvlock": true, + "x": 180 + } + ], + "facing=north,half=top,shape=outer_left": [ + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_outer", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_outer_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_outer_2", + "uvlock": true, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_outer_3", + "uvlock": true, + "x": 180, + "y": 270 + } + ], + "facing=north,half=top,shape=outer_right": [ + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_outer", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_outer_1", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_outer_2", + "uvlock": true, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_outer_3", + "uvlock": true, + "x": 180 + } + ], + "facing=north,half=top,shape=straight": [ + { + "model": "twilightforest:block/wood/stairs/time/time_stairs", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_2", + "uvlock": true, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_3", + "uvlock": true, + "x": 180, + "y": 270 + } + ], + "facing=south,half=bottom,shape=inner_left": [ + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_inner", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_inner_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_inner_2" + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_inner_3" + } + ], + "facing=south,half=bottom,shape=inner_right": [ + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_inner", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_inner_1", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_inner_2", + "uvlock": true, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_inner_3", + "uvlock": true, + "y": 90 + } + ], + "facing=south,half=bottom,shape=outer_left": [ + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_outer", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_outer_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_outer_2" + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_outer_3" + } + ], + "facing=south,half=bottom,shape=outer_right": [ + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_outer", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_outer_1", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_outer_2", + "uvlock": true, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_outer_3", + "uvlock": true, + "y": 90 + } + ], + "facing=south,half=bottom,shape=straight": [ + { + "model": "twilightforest:block/wood/stairs/time/time_stairs", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_1", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_2", + "uvlock": true, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_3", + "uvlock": true, + "y": 90 + } + ], + "facing=south,half=top,shape=inner_left": [ + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_inner", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_inner_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_inner_2", + "uvlock": true, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_inner_3", + "uvlock": true, + "x": 180, + "y": 90 + } + ], + "facing=south,half=top,shape=inner_right": [ + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_inner", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_inner_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_inner_2", + "uvlock": true, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_inner_3", + "uvlock": true, + "x": 180, + "y": 180 + } + ], + "facing=south,half=top,shape=outer_left": [ + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_outer", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_outer_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_outer_2", + "uvlock": true, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_outer_3", + "uvlock": true, + "x": 180, + "y": 90 + } + ], + "facing=south,half=top,shape=outer_right": [ + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_outer", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_outer_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_outer_2", + "uvlock": true, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_outer_3", + "uvlock": true, + "x": 180, + "y": 180 + } + ], + "facing=south,half=top,shape=straight": [ + { + "model": "twilightforest:block/wood/stairs/time/time_stairs", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_2", + "uvlock": true, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_3", + "uvlock": true, + "x": 180, + "y": 90 + } + ], + "facing=west,half=bottom,shape=inner_left": [ + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_inner", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_inner_1", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_inner_2", + "uvlock": true, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_inner_3", + "uvlock": true, + "y": 90 + } + ], + "facing=west,half=bottom,shape=inner_right": [ + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_inner", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_inner_1", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_inner_2", + "uvlock": true, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_inner_3", + "uvlock": true, + "y": 180 + } + ], + "facing=west,half=bottom,shape=outer_left": [ + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_outer", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_outer_1", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_outer_2", + "uvlock": true, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_outer_3", + "uvlock": true, + "y": 90 + } + ], + "facing=west,half=bottom,shape=outer_right": [ + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_outer", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_outer_1", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_outer_2", + "uvlock": true, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_outer_3", + "uvlock": true, + "y": 180 + } + ], + "facing=west,half=bottom,shape=straight": [ + { + "model": "twilightforest:block/wood/stairs/time/time_stairs", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_1", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_2", + "uvlock": true, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_3", + "uvlock": true, + "y": 180 + } + ], + "facing=west,half=top,shape=inner_left": [ + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_inner", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_inner_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_inner_2", + "uvlock": true, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_inner_3", + "uvlock": true, + "x": 180, + "y": 180 + } + ], + "facing=west,half=top,shape=inner_right": [ + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_inner", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_inner_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_inner_2", + "uvlock": true, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_inner_3", + "uvlock": true, + "x": 180, + "y": 270 + } + ], + "facing=west,half=top,shape=outer_left": [ + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_outer", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_outer_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_outer_2", + "uvlock": true, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_outer_3", + "uvlock": true, + "x": 180, + "y": 180 + } + ], + "facing=west,half=top,shape=outer_right": [ + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_outer", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_outer_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_outer_2", + "uvlock": true, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_outer_3", + "uvlock": true, + "x": 180, + "y": 270 + } + ], + "facing=west,half=top,shape=straight": [ + { + "model": "twilightforest:block/wood/stairs/time/time_stairs", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_2", + "uvlock": true, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/time/time_stairs_3", + "uvlock": true, + "x": 180, + "y": 180 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/time_trapdoor.json b/src/generated/resources/assets/twilightforest/blockstates/time_trapdoor.json new file mode 100644 index 0000000000..2e319d6f1a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/time_trapdoor.json @@ -0,0 +1,68 @@ +{ + "variants": { + "facing=east,half=bottom,open=false": { + "model": "twilightforest:block/wood/trapdoor/time/time_trapdoor_bottom", + "y": 90 + }, + "facing=east,half=bottom,open=true": { + "model": "twilightforest:block/wood/trapdoor/time/time_trapdoor_open", + "y": 90 + }, + "facing=east,half=top,open=false": { + "model": "twilightforest:block/wood/trapdoor/time/time_trapdoor_top", + "y": 90 + }, + "facing=east,half=top,open=true": { + "model": "twilightforest:block/wood/trapdoor/time/time_trapdoor_open", + "x": 180, + "y": 270 + }, + "facing=north,half=bottom,open=false": { + "model": "twilightforest:block/wood/trapdoor/time/time_trapdoor_bottom" + }, + "facing=north,half=bottom,open=true": { + "model": "twilightforest:block/wood/trapdoor/time/time_trapdoor_open" + }, + "facing=north,half=top,open=false": { + "model": "twilightforest:block/wood/trapdoor/time/time_trapdoor_top" + }, + "facing=north,half=top,open=true": { + "model": "twilightforest:block/wood/trapdoor/time/time_trapdoor_open", + "x": 180, + "y": 180 + }, + "facing=south,half=bottom,open=false": { + "model": "twilightforest:block/wood/trapdoor/time/time_trapdoor_bottom", + "y": 180 + }, + "facing=south,half=bottom,open=true": { + "model": "twilightforest:block/wood/trapdoor/time/time_trapdoor_open", + "y": 180 + }, + "facing=south,half=top,open=false": { + "model": "twilightforest:block/wood/trapdoor/time/time_trapdoor_top", + "y": 180 + }, + "facing=south,half=top,open=true": { + "model": "twilightforest:block/wood/trapdoor/time/time_trapdoor_open", + "x": 180 + }, + "facing=west,half=bottom,open=false": { + "model": "twilightforest:block/wood/trapdoor/time/time_trapdoor_bottom", + "y": 270 + }, + "facing=west,half=bottom,open=true": { + "model": "twilightforest:block/wood/trapdoor/time/time_trapdoor_open", + "y": 270 + }, + "facing=west,half=top,open=false": { + "model": "twilightforest:block/wood/trapdoor/time/time_trapdoor_top", + "y": 270 + }, + "facing=west,half=top,open=true": { + "model": "twilightforest:block/wood/trapdoor/time/time_trapdoor_open", + "x": 180, + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/time_wall_sign.json b/src/generated/resources/assets/twilightforest/blockstates/time_wall_sign.json new file mode 100644 index 0000000000..411f128f0c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/time_wall_sign.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/time_wall_sign" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/time_wood.json b/src/generated/resources/assets/twilightforest/blockstates/time_wood.json new file mode 100644 index 0000000000..bd62e8feef --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/time_wood.json @@ -0,0 +1,16 @@ +{ + "variants": { + "axis=x": { + "model": "twilightforest:block/time_wood_horizontal", + "x": 90, + "y": 90 + }, + "axis=y": { + "model": "twilightforest:block/time_wood" + }, + "axis=z": { + "model": "twilightforest:block/time_wood_horizontal", + "x": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/torchberry_plant.json b/src/generated/resources/assets/twilightforest/blockstates/torchberry_plant.json new file mode 100644 index 0000000000..ceeed889a6 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/torchberry_plant.json @@ -0,0 +1,10 @@ +{ + "variants": { + "has_torchberries=false": { + "model": "twilightforest:block/torchberry_plant_no_berries" + }, + "has_torchberries=true": { + "model": "twilightforest:block/torchberry_plant" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/towerwood.json b/src/generated/resources/assets/twilightforest/blockstates/towerwood.json new file mode 100644 index 0000000000..121d9be2fa --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/towerwood.json @@ -0,0 +1,12 @@ +{ + "variants": { + "": [ + { + "model": "twilightforest:block/towerwood" + }, + { + "model": "twilightforest:block/towerwood_flipped" + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/transformation_banister.json b/src/generated/resources/assets/twilightforest/blockstates/transformation_banister.json new file mode 100644 index 0000000000..033624d3ea --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/transformation_banister.json @@ -0,0 +1,460 @@ +{ + "variants": { + "extended=false,facing=east,shape=connected": [ + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_connected", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_connected_1", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_connected_2", + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_connected_3", + "y": 270 + } + ], + "extended=false,facing=east,shape=short": [ + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_short", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_short_1", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_short_2", + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_short_3", + "y": 270 + } + ], + "extended=false,facing=east,shape=tall": [ + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_tall", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_tall_1", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_tall_2", + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_tall_3", + "y": 270 + } + ], + "extended=false,facing=north,shape=connected": [ + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_connected", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_connected_1", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_connected_2", + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_connected_3", + "y": 180 + } + ], + "extended=false,facing=north,shape=short": [ + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_short", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_short_1", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_short_2", + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_short_3", + "y": 180 + } + ], + "extended=false,facing=north,shape=tall": [ + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_tall", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_tall_1", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_tall_2", + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_tall_3", + "y": 180 + } + ], + "extended=false,facing=south,shape=connected": [ + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_connected", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_connected_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_connected_2" + }, + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_connected_3" + } + ], + "extended=false,facing=south,shape=short": [ + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_short", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_short_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_short_2" + }, + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_short_3" + } + ], + "extended=false,facing=south,shape=tall": [ + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_tall", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_tall_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_tall_2" + }, + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_tall_3" + } + ], + "extended=false,facing=west,shape=connected": [ + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_connected", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_connected_1", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_connected_2", + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_connected_3", + "y": 90 + } + ], + "extended=false,facing=west,shape=short": [ + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_short", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_short_1", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_short_2", + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_short_3", + "y": 90 + } + ], + "extended=false,facing=west,shape=tall": [ + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_tall", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_tall_1", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_tall_2", + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_tall_3", + "y": 90 + } + ], + "extended=true,facing=east,shape=connected": [ + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_connected_extended", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_connected_extended_1", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_connected_extended_2", + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_connected_extended_3", + "y": 270 + } + ], + "extended=true,facing=east,shape=short": [ + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_short_extended", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_short_extended_1", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_short_extended_2", + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_short_extended_3", + "y": 270 + } + ], + "extended=true,facing=east,shape=tall": [ + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_tall_extended", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_tall_extended_1", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_tall_extended_2", + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_tall_extended_3", + "y": 270 + } + ], + "extended=true,facing=north,shape=connected": [ + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_connected_extended", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_connected_extended_1", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_connected_extended_2", + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_connected_extended_3", + "y": 180 + } + ], + "extended=true,facing=north,shape=short": [ + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_short_extended", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_short_extended_1", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_short_extended_2", + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_short_extended_3", + "y": 180 + } + ], + "extended=true,facing=north,shape=tall": [ + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_tall_extended", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_tall_extended_1", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_tall_extended_2", + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_tall_extended_3", + "y": 180 + } + ], + "extended=true,facing=south,shape=connected": [ + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_connected_extended", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_connected_extended_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_connected_extended_2" + }, + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_connected_extended_3" + } + ], + "extended=true,facing=south,shape=short": [ + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_short_extended", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_short_extended_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_short_extended_2" + }, + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_short_extended_3" + } + ], + "extended=true,facing=south,shape=tall": [ + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_tall_extended", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_tall_extended_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_tall_extended_2" + }, + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_tall_extended_3" + } + ], + "extended=true,facing=west,shape=connected": [ + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_connected_extended", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_connected_extended_1", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_connected_extended_2", + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_connected_extended_3", + "y": 90 + } + ], + "extended=true,facing=west,shape=short": [ + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_short_extended", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_short_extended_1", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_short_extended_2", + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_short_extended_3", + "y": 90 + } + ], + "extended=true,facing=west,shape=tall": [ + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_tall_extended", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_tall_extended_1", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_tall_extended_2", + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/trans/transformation_banister_tall_extended_3", + "y": 90 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/transformation_button.json b/src/generated/resources/assets/twilightforest/blockstates/transformation_button.json new file mode 100644 index 0000000000..d4509e1658 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/transformation_button.json @@ -0,0 +1,556 @@ +{ + "variants": { + "face=ceiling,facing=east,powered=false": [ + { + "model": "twilightforest:block/wood/button/trans/transformation_button", + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/trans/transformation_button_1", + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/trans/transformation_button_2", + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/trans/transformation_button_3", + "x": 180, + "y": 270 + } + ], + "face=ceiling,facing=east,powered=true": [ + { + "model": "twilightforest:block/wood/button/trans/transformation_button_pressed", + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/trans/transformation_button_pressed_1", + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/trans/transformation_button_pressed_2", + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/trans/transformation_button_pressed_3", + "x": 180, + "y": 270 + } + ], + "face=ceiling,facing=north,powered=false": [ + { + "model": "twilightforest:block/wood/button/trans/transformation_button", + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/trans/transformation_button_1", + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/trans/transformation_button_2", + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/trans/transformation_button_3", + "x": 180, + "y": 180 + } + ], + "face=ceiling,facing=north,powered=true": [ + { + "model": "twilightforest:block/wood/button/trans/transformation_button_pressed", + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/trans/transformation_button_pressed_1", + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/trans/transformation_button_pressed_2", + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/trans/transformation_button_pressed_3", + "x": 180, + "y": 180 + } + ], + "face=ceiling,facing=south,powered=false": [ + { + "model": "twilightforest:block/wood/button/trans/transformation_button", + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/button/trans/transformation_button_1", + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/button/trans/transformation_button_2", + "x": 180 + }, + { + "model": "twilightforest:block/wood/button/trans/transformation_button_3", + "x": 180 + } + ], + "face=ceiling,facing=south,powered=true": [ + { + "model": "twilightforest:block/wood/button/trans/transformation_button_pressed", + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/button/trans/transformation_button_pressed_1", + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/button/trans/transformation_button_pressed_2", + "x": 180 + }, + { + "model": "twilightforest:block/wood/button/trans/transformation_button_pressed_3", + "x": 180 + } + ], + "face=ceiling,facing=west,powered=false": [ + { + "model": "twilightforest:block/wood/button/trans/transformation_button", + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/trans/transformation_button_1", + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/trans/transformation_button_2", + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/trans/transformation_button_3", + "x": 180, + "y": 90 + } + ], + "face=ceiling,facing=west,powered=true": [ + { + "model": "twilightforest:block/wood/button/trans/transformation_button_pressed", + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/trans/transformation_button_pressed_1", + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/trans/transformation_button_pressed_2", + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/trans/transformation_button_pressed_3", + "x": 180, + "y": 90 + } + ], + "face=floor,facing=east,powered=false": [ + { + "model": "twilightforest:block/wood/button/trans/transformation_button", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/trans/transformation_button_1", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/trans/transformation_button_2", + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/trans/transformation_button_3", + "y": 90 + } + ], + "face=floor,facing=east,powered=true": [ + { + "model": "twilightforest:block/wood/button/trans/transformation_button_pressed", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/trans/transformation_button_pressed_1", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/trans/transformation_button_pressed_2", + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/trans/transformation_button_pressed_3", + "y": 90 + } + ], + "face=floor,facing=north,powered=false": [ + { + "model": "twilightforest:block/wood/button/trans/transformation_button", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/button/trans/transformation_button_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/button/trans/transformation_button_2" + }, + { + "model": "twilightforest:block/wood/button/trans/transformation_button_3" + } + ], + "face=floor,facing=north,powered=true": [ + { + "model": "twilightforest:block/wood/button/trans/transformation_button_pressed", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/button/trans/transformation_button_pressed_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/button/trans/transformation_button_pressed_2" + }, + { + "model": "twilightforest:block/wood/button/trans/transformation_button_pressed_3" + } + ], + "face=floor,facing=south,powered=false": [ + { + "model": "twilightforest:block/wood/button/trans/transformation_button", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/trans/transformation_button_1", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/trans/transformation_button_2", + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/trans/transformation_button_3", + "y": 180 + } + ], + "face=floor,facing=south,powered=true": [ + { + "model": "twilightforest:block/wood/button/trans/transformation_button_pressed", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/trans/transformation_button_pressed_1", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/trans/transformation_button_pressed_2", + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/trans/transformation_button_pressed_3", + "y": 180 + } + ], + "face=floor,facing=west,powered=false": [ + { + "model": "twilightforest:block/wood/button/trans/transformation_button", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/trans/transformation_button_1", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/trans/transformation_button_2", + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/trans/transformation_button_3", + "y": 270 + } + ], + "face=floor,facing=west,powered=true": [ + { + "model": "twilightforest:block/wood/button/trans/transformation_button_pressed", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/trans/transformation_button_pressed_1", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/trans/transformation_button_pressed_2", + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/trans/transformation_button_pressed_3", + "y": 270 + } + ], + "face=wall,facing=east,powered=false": [ + { + "model": "twilightforest:block/wood/button/trans/transformation_button", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/trans/transformation_button_1", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/trans/transformation_button_2", + "uvlock": true, + "x": 90, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/trans/transformation_button_3", + "uvlock": true, + "x": 90, + "y": 90 + } + ], + "face=wall,facing=east,powered=true": [ + { + "model": "twilightforest:block/wood/button/trans/transformation_button_pressed", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/trans/transformation_button_pressed_1", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/trans/transformation_button_pressed_2", + "uvlock": true, + "x": 90, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/trans/transformation_button_pressed_3", + "uvlock": true, + "x": 90, + "y": 90 + } + ], + "face=wall,facing=north,powered=false": [ + { + "model": "twilightforest:block/wood/button/trans/transformation_button", + "uvlock": true, + "weight": 10, + "x": 90 + }, + { + "model": "twilightforest:block/wood/button/trans/transformation_button_1", + "uvlock": true, + "weight": 10, + "x": 90 + }, + { + "model": "twilightforest:block/wood/button/trans/transformation_button_2", + "uvlock": true, + "x": 90 + }, + { + "model": "twilightforest:block/wood/button/trans/transformation_button_3", + "uvlock": true, + "x": 90 + } + ], + "face=wall,facing=north,powered=true": [ + { + "model": "twilightforest:block/wood/button/trans/transformation_button_pressed", + "uvlock": true, + "weight": 10, + "x": 90 + }, + { + "model": "twilightforest:block/wood/button/trans/transformation_button_pressed_1", + "uvlock": true, + "weight": 10, + "x": 90 + }, + { + "model": "twilightforest:block/wood/button/trans/transformation_button_pressed_2", + "uvlock": true, + "x": 90 + }, + { + "model": "twilightforest:block/wood/button/trans/transformation_button_pressed_3", + "uvlock": true, + "x": 90 + } + ], + "face=wall,facing=south,powered=false": [ + { + "model": "twilightforest:block/wood/button/trans/transformation_button", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/trans/transformation_button_1", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/trans/transformation_button_2", + "uvlock": true, + "x": 90, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/trans/transformation_button_3", + "uvlock": true, + "x": 90, + "y": 180 + } + ], + "face=wall,facing=south,powered=true": [ + { + "model": "twilightforest:block/wood/button/trans/transformation_button_pressed", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/trans/transformation_button_pressed_1", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/trans/transformation_button_pressed_2", + "uvlock": true, + "x": 90, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/trans/transformation_button_pressed_3", + "uvlock": true, + "x": 90, + "y": 180 + } + ], + "face=wall,facing=west,powered=false": [ + { + "model": "twilightforest:block/wood/button/trans/transformation_button", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/trans/transformation_button_1", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/trans/transformation_button_2", + "uvlock": true, + "x": 90, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/trans/transformation_button_3", + "uvlock": true, + "x": 90, + "y": 270 + } + ], + "face=wall,facing=west,powered=true": [ + { + "model": "twilightforest:block/wood/button/trans/transformation_button_pressed", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/trans/transformation_button_pressed_1", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/trans/transformation_button_pressed_2", + "uvlock": true, + "x": 90, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/trans/transformation_button_pressed_3", + "uvlock": true, + "x": 90, + "y": 270 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/transformation_chest.json b/src/generated/resources/assets/twilightforest/blockstates/transformation_chest.json new file mode 100644 index 0000000000..1dc649d0d5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/transformation_chest.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/transformation_chest" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/transformation_door.json b/src/generated/resources/assets/twilightforest/blockstates/transformation_door.json new file mode 100644 index 0000000000..2816c5567f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/transformation_door.json @@ -0,0 +1,124 @@ +{ + "variants": { + "facing=east,half=lower,hinge=left,open=false": { + "model": "twilightforest:block/wood/door/trans/transformation_door_door_bottom_left" + }, + "facing=east,half=lower,hinge=left,open=true": { + "model": "twilightforest:block/wood/door/trans/transformation_door_door_bottom_left_open", + "y": 90 + }, + "facing=east,half=lower,hinge=right,open=false": { + "model": "twilightforest:block/wood/door/trans/transformation_door_door_bottom_right" + }, + "facing=east,half=lower,hinge=right,open=true": { + "model": "twilightforest:block/wood/door/trans/transformation_door_door_bottom_right_open", + "y": 270 + }, + "facing=east,half=upper,hinge=left,open=false": { + "model": "twilightforest:block/wood/door/trans/transformation_door_door_top_left" + }, + "facing=east,half=upper,hinge=left,open=true": { + "model": "twilightforest:block/wood/door/trans/transformation_door_door_top_left_open", + "y": 90 + }, + "facing=east,half=upper,hinge=right,open=false": { + "model": "twilightforest:block/wood/door/trans/transformation_door_door_top_right" + }, + "facing=east,half=upper,hinge=right,open=true": { + "model": "twilightforest:block/wood/door/trans/transformation_door_door_top_right_open", + "y": 270 + }, + "facing=north,half=lower,hinge=left,open=false": { + "model": "twilightforest:block/wood/door/trans/transformation_door_door_bottom_left", + "y": 270 + }, + "facing=north,half=lower,hinge=left,open=true": { + "model": "twilightforest:block/wood/door/trans/transformation_door_door_bottom_left_open" + }, + "facing=north,half=lower,hinge=right,open=false": { + "model": "twilightforest:block/wood/door/trans/transformation_door_door_bottom_right", + "y": 270 + }, + "facing=north,half=lower,hinge=right,open=true": { + "model": "twilightforest:block/wood/door/trans/transformation_door_door_bottom_right_open", + "y": 180 + }, + "facing=north,half=upper,hinge=left,open=false": { + "model": "twilightforest:block/wood/door/trans/transformation_door_door_top_left", + "y": 270 + }, + "facing=north,half=upper,hinge=left,open=true": { + "model": "twilightforest:block/wood/door/trans/transformation_door_door_top_left_open" + }, + "facing=north,half=upper,hinge=right,open=false": { + "model": "twilightforest:block/wood/door/trans/transformation_door_door_top_right", + "y": 270 + }, + "facing=north,half=upper,hinge=right,open=true": { + "model": "twilightforest:block/wood/door/trans/transformation_door_door_top_right_open", + "y": 180 + }, + "facing=south,half=lower,hinge=left,open=false": { + "model": "twilightforest:block/wood/door/trans/transformation_door_door_bottom_left", + "y": 90 + }, + "facing=south,half=lower,hinge=left,open=true": { + "model": "twilightforest:block/wood/door/trans/transformation_door_door_bottom_left_open", + "y": 180 + }, + "facing=south,half=lower,hinge=right,open=false": { + "model": "twilightforest:block/wood/door/trans/transformation_door_door_bottom_right", + "y": 90 + }, + "facing=south,half=lower,hinge=right,open=true": { + "model": "twilightforest:block/wood/door/trans/transformation_door_door_bottom_right_open" + }, + "facing=south,half=upper,hinge=left,open=false": { + "model": "twilightforest:block/wood/door/trans/transformation_door_door_top_left", + "y": 90 + }, + "facing=south,half=upper,hinge=left,open=true": { + "model": "twilightforest:block/wood/door/trans/transformation_door_door_top_left_open", + "y": 180 + }, + "facing=south,half=upper,hinge=right,open=false": { + "model": "twilightforest:block/wood/door/trans/transformation_door_door_top_right", + "y": 90 + }, + "facing=south,half=upper,hinge=right,open=true": { + "model": "twilightforest:block/wood/door/trans/transformation_door_door_top_right_open" + }, + "facing=west,half=lower,hinge=left,open=false": { + "model": "twilightforest:block/wood/door/trans/transformation_door_door_bottom_left", + "y": 180 + }, + "facing=west,half=lower,hinge=left,open=true": { + "model": "twilightforest:block/wood/door/trans/transformation_door_door_bottom_left_open", + "y": 270 + }, + "facing=west,half=lower,hinge=right,open=false": { + "model": "twilightforest:block/wood/door/trans/transformation_door_door_bottom_right", + "y": 180 + }, + "facing=west,half=lower,hinge=right,open=true": { + "model": "twilightforest:block/wood/door/trans/transformation_door_door_bottom_right_open", + "y": 90 + }, + "facing=west,half=upper,hinge=left,open=false": { + "model": "twilightforest:block/wood/door/trans/transformation_door_door_top_left", + "y": 180 + }, + "facing=west,half=upper,hinge=left,open=true": { + "model": "twilightforest:block/wood/door/trans/transformation_door_door_top_left_open", + "y": 270 + }, + "facing=west,half=upper,hinge=right,open=false": { + "model": "twilightforest:block/wood/door/trans/transformation_door_door_top_right", + "y": 180 + }, + "facing=west,half=upper,hinge=right,open=true": { + "model": "twilightforest:block/wood/door/trans/transformation_door_door_top_right_open", + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/transformation_fence.json b/src/generated/resources/assets/twilightforest/blockstates/transformation_fence.json new file mode 100644 index 0000000000..d94fd330f9 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/transformation_fence.json @@ -0,0 +1,134 @@ +{ + "multipart": [ + { + "apply": [ + { + "model": "twilightforest:block/wood/fence/trans/transformation_fence_post", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence/trans/transformation_fence_post_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence/trans/transformation_fence_post_2" + }, + { + "model": "twilightforest:block/wood/fence/trans/transformation_fence_post_3" + } + ] + }, + { + "apply": [ + { + "model": "twilightforest:block/wood/fence/trans/transformation_fence_side", + "uvlock": true, + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence/trans/transformation_fence_side_1", + "uvlock": true, + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence/trans/transformation_fence_side_2", + "uvlock": true + }, + { + "model": "twilightforest:block/wood/fence/trans/transformation_fence_side_3", + "uvlock": true + } + ], + "when": { + "north": "true" + } + }, + { + "apply": [ + { + "model": "twilightforest:block/wood/fence/trans/transformation_fence_side", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence/trans/transformation_fence_side_1", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence/trans/transformation_fence_side_2", + "uvlock": true, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence/trans/transformation_fence_side_3", + "uvlock": true, + "y": 180 + } + ], + "when": { + "south": "true" + } + }, + { + "apply": [ + { + "model": "twilightforest:block/wood/fence/trans/transformation_fence_side", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence/trans/transformation_fence_side_1", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence/trans/transformation_fence_side_2", + "uvlock": true, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence/trans/transformation_fence_side_3", + "uvlock": true, + "y": 270 + } + ], + "when": { + "west": "true" + } + }, + { + "apply": [ + { + "model": "twilightforest:block/wood/fence/trans/transformation_fence_side", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence/trans/transformation_fence_side_1", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence/trans/transformation_fence_side_2", + "uvlock": true, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence/trans/transformation_fence_side_3", + "uvlock": true, + "y": 90 + } + ], + "when": { + "east": "true" + } + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/transformation_fence_gate.json b/src/generated/resources/assets/twilightforest/blockstates/transformation_fence_gate.json new file mode 100644 index 0000000000..4b4c9689f5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/transformation_fence_gate.json @@ -0,0 +1,372 @@ +{ + "variants": { + "facing=east,in_wall=false,open=false": [ + { + "model": "twilightforest:block/wood/fence_gate/trans/transformation_fence_gate", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/trans/transformation_fence_gate_1", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/trans/transformation_fence_gate_2", + "uvlock": true, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/trans/transformation_fence_gate_3", + "uvlock": true, + "y": 270 + } + ], + "facing=east,in_wall=false,open=true": [ + { + "model": "twilightforest:block/wood/fence_gate/trans/transformation_fence_gate_open", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/trans/transformation_fence_gate_open_1", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/trans/transformation_fence_gate_open_2", + "uvlock": true, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/trans/transformation_fence_gate_open_3", + "uvlock": true, + "y": 270 + } + ], + "facing=east,in_wall=true,open=false": [ + { + "model": "twilightforest:block/wood/fence_gate/trans/transformation_fence_gate_wall", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/trans/transformation_fence_gate_wall_1", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/trans/transformation_fence_gate_wall_2", + "uvlock": true, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/trans/transformation_fence_gate_wall_3", + "uvlock": true, + "y": 270 + } + ], + "facing=east,in_wall=true,open=true": [ + { + "model": "twilightforest:block/wood/fence_gate/trans/transformation_fence_gate_wall_open", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/trans/transformation_fence_gate_wall_open_1", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/trans/transformation_fence_gate_wall_open_2", + "uvlock": true, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/trans/transformation_fence_gate_wall_open_3", + "uvlock": true, + "y": 270 + } + ], + "facing=north,in_wall=false,open=false": [ + { + "model": "twilightforest:block/wood/fence_gate/trans/transformation_fence_gate", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/trans/transformation_fence_gate_1", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/trans/transformation_fence_gate_2", + "uvlock": true, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/trans/transformation_fence_gate_3", + "uvlock": true, + "y": 180 + } + ], + "facing=north,in_wall=false,open=true": [ + { + "model": "twilightforest:block/wood/fence_gate/trans/transformation_fence_gate_open", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/trans/transformation_fence_gate_open_1", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/trans/transformation_fence_gate_open_2", + "uvlock": true, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/trans/transformation_fence_gate_open_3", + "uvlock": true, + "y": 180 + } + ], + "facing=north,in_wall=true,open=false": [ + { + "model": "twilightforest:block/wood/fence_gate/trans/transformation_fence_gate_wall", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/trans/transformation_fence_gate_wall_1", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/trans/transformation_fence_gate_wall_2", + "uvlock": true, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/trans/transformation_fence_gate_wall_3", + "uvlock": true, + "y": 180 + } + ], + "facing=north,in_wall=true,open=true": [ + { + "model": "twilightforest:block/wood/fence_gate/trans/transformation_fence_gate_wall_open", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/trans/transformation_fence_gate_wall_open_1", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/trans/transformation_fence_gate_wall_open_2", + "uvlock": true, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/trans/transformation_fence_gate_wall_open_3", + "uvlock": true, + "y": 180 + } + ], + "facing=south,in_wall=false,open=false": [ + { + "model": "twilightforest:block/wood/fence_gate/trans/transformation_fence_gate", + "uvlock": true, + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence_gate/trans/transformation_fence_gate_1", + "uvlock": true, + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence_gate/trans/transformation_fence_gate_2", + "uvlock": true + }, + { + "model": "twilightforest:block/wood/fence_gate/trans/transformation_fence_gate_3", + "uvlock": true + } + ], + "facing=south,in_wall=false,open=true": [ + { + "model": "twilightforest:block/wood/fence_gate/trans/transformation_fence_gate_open", + "uvlock": true, + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence_gate/trans/transformation_fence_gate_open_1", + "uvlock": true, + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence_gate/trans/transformation_fence_gate_open_2", + "uvlock": true + }, + { + "model": "twilightforest:block/wood/fence_gate/trans/transformation_fence_gate_open_3", + "uvlock": true + } + ], + "facing=south,in_wall=true,open=false": [ + { + "model": "twilightforest:block/wood/fence_gate/trans/transformation_fence_gate_wall", + "uvlock": true, + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence_gate/trans/transformation_fence_gate_wall_1", + "uvlock": true, + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence_gate/trans/transformation_fence_gate_wall_2", + "uvlock": true + }, + { + "model": "twilightforest:block/wood/fence_gate/trans/transformation_fence_gate_wall_3", + "uvlock": true + } + ], + "facing=south,in_wall=true,open=true": [ + { + "model": "twilightforest:block/wood/fence_gate/trans/transformation_fence_gate_wall_open", + "uvlock": true, + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence_gate/trans/transformation_fence_gate_wall_open_1", + "uvlock": true, + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence_gate/trans/transformation_fence_gate_wall_open_2", + "uvlock": true + }, + { + "model": "twilightforest:block/wood/fence_gate/trans/transformation_fence_gate_wall_open_3", + "uvlock": true + } + ], + "facing=west,in_wall=false,open=false": [ + { + "model": "twilightforest:block/wood/fence_gate/trans/transformation_fence_gate", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/trans/transformation_fence_gate_1", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/trans/transformation_fence_gate_2", + "uvlock": true, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/trans/transformation_fence_gate_3", + "uvlock": true, + "y": 90 + } + ], + "facing=west,in_wall=false,open=true": [ + { + "model": "twilightforest:block/wood/fence_gate/trans/transformation_fence_gate_open", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/trans/transformation_fence_gate_open_1", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/trans/transformation_fence_gate_open_2", + "uvlock": true, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/trans/transformation_fence_gate_open_3", + "uvlock": true, + "y": 90 + } + ], + "facing=west,in_wall=true,open=false": [ + { + "model": "twilightforest:block/wood/fence_gate/trans/transformation_fence_gate_wall", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/trans/transformation_fence_gate_wall_1", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/trans/transformation_fence_gate_wall_2", + "uvlock": true, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/trans/transformation_fence_gate_wall_3", + "uvlock": true, + "y": 90 + } + ], + "facing=west,in_wall=true,open=true": [ + { + "model": "twilightforest:block/wood/fence_gate/trans/transformation_fence_gate_wall_open", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/trans/transformation_fence_gate_wall_open_1", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/trans/transformation_fence_gate_wall_open_2", + "uvlock": true, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/trans/transformation_fence_gate_wall_open_3", + "uvlock": true, + "y": 90 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/transformation_leaves.json b/src/generated/resources/assets/twilightforest/blockstates/transformation_leaves.json new file mode 100644 index 0000000000..303e750aa8 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/transformation_leaves.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/transformation_leaves" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/transformation_log.json b/src/generated/resources/assets/twilightforest/blockstates/transformation_log.json new file mode 100644 index 0000000000..af68b66486 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/transformation_log.json @@ -0,0 +1,16 @@ +{ + "variants": { + "axis=x": { + "model": "twilightforest:block/transformation_log_horizontal", + "x": 90, + "y": 90 + }, + "axis=y": { + "model": "twilightforest:block/transformation_log" + }, + "axis=z": { + "model": "twilightforest:block/transformation_log_horizontal", + "x": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/transformation_log_core.json b/src/generated/resources/assets/twilightforest/blockstates/transformation_log_core.json new file mode 100644 index 0000000000..ead37db4bc --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/transformation_log_core.json @@ -0,0 +1,28 @@ +{ + "variants": { + "active=false,axis=x": { + "model": "twilightforest:block/transformation_log_core", + "x": 90, + "y": 90 + }, + "active=false,axis=y": { + "model": "twilightforest:block/transformation_log_core" + }, + "active=false,axis=z": { + "model": "twilightforest:block/transformation_log_core", + "x": 90 + }, + "active=true,axis=x": { + "model": "twilightforest:block/transformation_log_core_on", + "x": 90, + "y": 90 + }, + "active=true,axis=y": { + "model": "twilightforest:block/transformation_log_core_on" + }, + "active=true,axis=z": { + "model": "twilightforest:block/transformation_log_core_on", + "x": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/transformation_planks.json b/src/generated/resources/assets/twilightforest/blockstates/transformation_planks.json new file mode 100644 index 0000000000..7e82c37292 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/transformation_planks.json @@ -0,0 +1,20 @@ +{ + "variants": { + "": [ + { + "model": "twilightforest:block/wood/planks/trans/transformation_planks", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/planks/trans/transformation_planks_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/planks/trans/transformation_planks_2" + }, + { + "model": "twilightforest:block/wood/planks/trans/transformation_planks_3" + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/transformation_pressure_plate.json b/src/generated/resources/assets/twilightforest/blockstates/transformation_pressure_plate.json new file mode 100644 index 0000000000..3c40e99d57 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/transformation_pressure_plate.json @@ -0,0 +1,36 @@ +{ + "variants": { + "powered=false": [ + { + "model": "twilightforest:block/wood/pressure_plate/trans/transformation_pressure_plate", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/pressure_plate/trans/transformation_pressure_plate_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/pressure_plate/trans/transformation_pressure_plate_2" + }, + { + "model": "twilightforest:block/wood/pressure_plate/trans/transformation_pressure_plate_3" + } + ], + "powered=true": [ + { + "model": "twilightforest:block/wood/pressure_plate/trans/transformation_pressure_plate_down", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/pressure_plate/trans/transformation_pressure_plate_down_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/pressure_plate/trans/transformation_pressure_plate_down_2" + }, + { + "model": "twilightforest:block/wood/pressure_plate/trans/transformation_pressure_plate_down_3" + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/transformation_sapling.json b/src/generated/resources/assets/twilightforest/blockstates/transformation_sapling.json new file mode 100644 index 0000000000..bbaa25ff7c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/transformation_sapling.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/transformation_sapling" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/transformation_sign.json b/src/generated/resources/assets/twilightforest/blockstates/transformation_sign.json new file mode 100644 index 0000000000..d946d106ca --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/transformation_sign.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/transformation_sign" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/transformation_slab.json b/src/generated/resources/assets/twilightforest/blockstates/transformation_slab.json new file mode 100644 index 0000000000..01d51669d4 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/transformation_slab.json @@ -0,0 +1,60 @@ +{ + "variants": { + "type=bottom": [ + { + "model": "twilightforest:block/wood/slab/trans/transformation_slab", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/slab/trans/transformation_slab_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/slab/trans/transformation_slab_2" + }, + { + "model": "twilightforest:block/wood/slab/trans/transformation_slab_3" + } + ], + "type=double": [ + { + "model": "twilightforest:block/wood/planks/trans/transformation_planks", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/planks/trans/transformation_planks_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/planks/trans/transformation_planks_2" + }, + { + "model": "twilightforest:block/wood/planks/trans/transformation_planks_3" + } + ], + "type=top": [ + { + "model": "twilightforest:block/wood/slab/trans/transformation_slab", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/slab/trans/transformation_slab_1", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/slab/trans/transformation_slab_2", + "uvlock": true, + "x": 180 + }, + { + "model": "twilightforest:block/wood/slab/trans/transformation_slab_3", + "uvlock": true, + "x": 180 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/transformation_stairs.json b/src/generated/resources/assets/twilightforest/blockstates/transformation_stairs.json new file mode 100644 index 0000000000..d3800f75f0 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/transformation_stairs.json @@ -0,0 +1,984 @@ +{ + "variants": { + "facing=east,half=bottom,shape=inner_left": [ + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_inner", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_inner_1", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_inner_2", + "uvlock": true, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_inner_3", + "uvlock": true, + "y": 270 + } + ], + "facing=east,half=bottom,shape=inner_right": [ + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_inner", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_inner_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_inner_2" + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_inner_3" + } + ], + "facing=east,half=bottom,shape=outer_left": [ + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_outer", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_outer_1", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_outer_2", + "uvlock": true, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_outer_3", + "uvlock": true, + "y": 270 + } + ], + "facing=east,half=bottom,shape=outer_right": [ + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_outer", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_outer_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_outer_2" + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_outer_3" + } + ], + "facing=east,half=bottom,shape=straight": [ + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_2" + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_3" + } + ], + "facing=east,half=top,shape=inner_left": [ + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_inner", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_inner_1", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_inner_2", + "uvlock": true, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_inner_3", + "uvlock": true, + "x": 180 + } + ], + "facing=east,half=top,shape=inner_right": [ + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_inner", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_inner_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_inner_2", + "uvlock": true, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_inner_3", + "uvlock": true, + "x": 180, + "y": 90 + } + ], + "facing=east,half=top,shape=outer_left": [ + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_outer", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_outer_1", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_outer_2", + "uvlock": true, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_outer_3", + "uvlock": true, + "x": 180 + } + ], + "facing=east,half=top,shape=outer_right": [ + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_outer", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_outer_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_outer_2", + "uvlock": true, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_outer_3", + "uvlock": true, + "x": 180, + "y": 90 + } + ], + "facing=east,half=top,shape=straight": [ + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_1", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_2", + "uvlock": true, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_3", + "uvlock": true, + "x": 180 + } + ], + "facing=north,half=bottom,shape=inner_left": [ + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_inner", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_inner_1", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_inner_2", + "uvlock": true, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_inner_3", + "uvlock": true, + "y": 180 + } + ], + "facing=north,half=bottom,shape=inner_right": [ + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_inner", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_inner_1", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_inner_2", + "uvlock": true, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_inner_3", + "uvlock": true, + "y": 270 + } + ], + "facing=north,half=bottom,shape=outer_left": [ + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_outer", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_outer_1", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_outer_2", + "uvlock": true, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_outer_3", + "uvlock": true, + "y": 180 + } + ], + "facing=north,half=bottom,shape=outer_right": [ + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_outer", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_outer_1", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_outer_2", + "uvlock": true, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_outer_3", + "uvlock": true, + "y": 270 + } + ], + "facing=north,half=bottom,shape=straight": [ + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_1", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_2", + "uvlock": true, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_3", + "uvlock": true, + "y": 270 + } + ], + "facing=north,half=top,shape=inner_left": [ + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_inner", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_inner_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_inner_2", + "uvlock": true, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_inner_3", + "uvlock": true, + "x": 180, + "y": 270 + } + ], + "facing=north,half=top,shape=inner_right": [ + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_inner", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_inner_1", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_inner_2", + "uvlock": true, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_inner_3", + "uvlock": true, + "x": 180 + } + ], + "facing=north,half=top,shape=outer_left": [ + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_outer", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_outer_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_outer_2", + "uvlock": true, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_outer_3", + "uvlock": true, + "x": 180, + "y": 270 + } + ], + "facing=north,half=top,shape=outer_right": [ + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_outer", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_outer_1", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_outer_2", + "uvlock": true, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_outer_3", + "uvlock": true, + "x": 180 + } + ], + "facing=north,half=top,shape=straight": [ + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_2", + "uvlock": true, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_3", + "uvlock": true, + "x": 180, + "y": 270 + } + ], + "facing=south,half=bottom,shape=inner_left": [ + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_inner", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_inner_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_inner_2" + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_inner_3" + } + ], + "facing=south,half=bottom,shape=inner_right": [ + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_inner", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_inner_1", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_inner_2", + "uvlock": true, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_inner_3", + "uvlock": true, + "y": 90 + } + ], + "facing=south,half=bottom,shape=outer_left": [ + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_outer", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_outer_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_outer_2" + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_outer_3" + } + ], + "facing=south,half=bottom,shape=outer_right": [ + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_outer", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_outer_1", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_outer_2", + "uvlock": true, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_outer_3", + "uvlock": true, + "y": 90 + } + ], + "facing=south,half=bottom,shape=straight": [ + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_1", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_2", + "uvlock": true, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_3", + "uvlock": true, + "y": 90 + } + ], + "facing=south,half=top,shape=inner_left": [ + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_inner", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_inner_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_inner_2", + "uvlock": true, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_inner_3", + "uvlock": true, + "x": 180, + "y": 90 + } + ], + "facing=south,half=top,shape=inner_right": [ + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_inner", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_inner_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_inner_2", + "uvlock": true, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_inner_3", + "uvlock": true, + "x": 180, + "y": 180 + } + ], + "facing=south,half=top,shape=outer_left": [ + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_outer", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_outer_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_outer_2", + "uvlock": true, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_outer_3", + "uvlock": true, + "x": 180, + "y": 90 + } + ], + "facing=south,half=top,shape=outer_right": [ + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_outer", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_outer_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_outer_2", + "uvlock": true, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_outer_3", + "uvlock": true, + "x": 180, + "y": 180 + } + ], + "facing=south,half=top,shape=straight": [ + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_2", + "uvlock": true, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_3", + "uvlock": true, + "x": 180, + "y": 90 + } + ], + "facing=west,half=bottom,shape=inner_left": [ + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_inner", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_inner_1", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_inner_2", + "uvlock": true, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_inner_3", + "uvlock": true, + "y": 90 + } + ], + "facing=west,half=bottom,shape=inner_right": [ + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_inner", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_inner_1", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_inner_2", + "uvlock": true, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_inner_3", + "uvlock": true, + "y": 180 + } + ], + "facing=west,half=bottom,shape=outer_left": [ + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_outer", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_outer_1", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_outer_2", + "uvlock": true, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_outer_3", + "uvlock": true, + "y": 90 + } + ], + "facing=west,half=bottom,shape=outer_right": [ + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_outer", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_outer_1", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_outer_2", + "uvlock": true, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_outer_3", + "uvlock": true, + "y": 180 + } + ], + "facing=west,half=bottom,shape=straight": [ + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_1", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_2", + "uvlock": true, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_3", + "uvlock": true, + "y": 180 + } + ], + "facing=west,half=top,shape=inner_left": [ + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_inner", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_inner_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_inner_2", + "uvlock": true, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_inner_3", + "uvlock": true, + "x": 180, + "y": 180 + } + ], + "facing=west,half=top,shape=inner_right": [ + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_inner", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_inner_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_inner_2", + "uvlock": true, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_inner_3", + "uvlock": true, + "x": 180, + "y": 270 + } + ], + "facing=west,half=top,shape=outer_left": [ + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_outer", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_outer_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_outer_2", + "uvlock": true, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_outer_3", + "uvlock": true, + "x": 180, + "y": 180 + } + ], + "facing=west,half=top,shape=outer_right": [ + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_outer", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_outer_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_outer_2", + "uvlock": true, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_outer_3", + "uvlock": true, + "x": 180, + "y": 270 + } + ], + "facing=west,half=top,shape=straight": [ + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_2", + "uvlock": true, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/trans/transformation_stairs_3", + "uvlock": true, + "x": 180, + "y": 180 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/transformation_trapdoor.json b/src/generated/resources/assets/twilightforest/blockstates/transformation_trapdoor.json new file mode 100644 index 0000000000..59b44b2baf --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/transformation_trapdoor.json @@ -0,0 +1,68 @@ +{ + "variants": { + "facing=east,half=bottom,open=false": { + "model": "twilightforest:block/wood/trapdoor/trans/trans_trapdoor_bottom", + "y": 90 + }, + "facing=east,half=bottom,open=true": { + "model": "twilightforest:block/wood/trapdoor/trans/trans_trapdoor_open", + "y": 90 + }, + "facing=east,half=top,open=false": { + "model": "twilightforest:block/wood/trapdoor/trans/trans_trapdoor_top", + "y": 90 + }, + "facing=east,half=top,open=true": { + "model": "twilightforest:block/wood/trapdoor/trans/trans_trapdoor_open", + "x": 180, + "y": 270 + }, + "facing=north,half=bottom,open=false": { + "model": "twilightforest:block/wood/trapdoor/trans/trans_trapdoor_bottom" + }, + "facing=north,half=bottom,open=true": { + "model": "twilightforest:block/wood/trapdoor/trans/trans_trapdoor_open" + }, + "facing=north,half=top,open=false": { + "model": "twilightforest:block/wood/trapdoor/trans/trans_trapdoor_top" + }, + "facing=north,half=top,open=true": { + "model": "twilightforest:block/wood/trapdoor/trans/trans_trapdoor_open", + "x": 180, + "y": 180 + }, + "facing=south,half=bottom,open=false": { + "model": "twilightforest:block/wood/trapdoor/trans/trans_trapdoor_bottom", + "y": 180 + }, + "facing=south,half=bottom,open=true": { + "model": "twilightforest:block/wood/trapdoor/trans/trans_trapdoor_open", + "y": 180 + }, + "facing=south,half=top,open=false": { + "model": "twilightforest:block/wood/trapdoor/trans/trans_trapdoor_top", + "y": 180 + }, + "facing=south,half=top,open=true": { + "model": "twilightforest:block/wood/trapdoor/trans/trans_trapdoor_open", + "x": 180 + }, + "facing=west,half=bottom,open=false": { + "model": "twilightforest:block/wood/trapdoor/trans/trans_trapdoor_bottom", + "y": 270 + }, + "facing=west,half=bottom,open=true": { + "model": "twilightforest:block/wood/trapdoor/trans/trans_trapdoor_open", + "y": 270 + }, + "facing=west,half=top,open=false": { + "model": "twilightforest:block/wood/trapdoor/trans/trans_trapdoor_top", + "y": 270 + }, + "facing=west,half=top,open=true": { + "model": "twilightforest:block/wood/trapdoor/trans/trans_trapdoor_open", + "x": 180, + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/transformation_wall_sign.json b/src/generated/resources/assets/twilightforest/blockstates/transformation_wall_sign.json new file mode 100644 index 0000000000..e5f09a4b94 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/transformation_wall_sign.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/transformation_wall_sign" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/transformation_wood.json b/src/generated/resources/assets/twilightforest/blockstates/transformation_wood.json new file mode 100644 index 0000000000..cff78ebc92 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/transformation_wood.json @@ -0,0 +1,16 @@ +{ + "variants": { + "axis=x": { + "model": "twilightforest:block/transformation_wood_horizontal", + "x": 90, + "y": 90 + }, + "axis=y": { + "model": "twilightforest:block/transformation_wood" + }, + "axis=z": { + "model": "twilightforest:block/transformation_wood_horizontal", + "x": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/trollber.json b/src/generated/resources/assets/twilightforest/blockstates/trollber.json new file mode 100644 index 0000000000..057f6d3888 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/trollber.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/trollber" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/trollsteinn.json b/src/generated/resources/assets/twilightforest/blockstates/trollsteinn.json new file mode 100644 index 0000000000..b8192fe725 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/trollsteinn.json @@ -0,0 +1,120 @@ +{ + "multipart": [ + { + "apply": { + "model": "twilightforest:block/trollsteinn_inside" + }, + "when": { + "north": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/trollsteinn_outside" + }, + "when": { + "north": "true" + } + }, + { + "apply": { + "model": "twilightforest:block/trollsteinn_inside", + "uvlock": true, + "y": 180 + }, + "when": { + "south": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/trollsteinn_outside", + "uvlock": true, + "y": 180 + }, + "when": { + "south": "true" + } + }, + { + "apply": { + "model": "twilightforest:block/trollsteinn_inside", + "uvlock": true, + "y": 270 + }, + "when": { + "west": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/trollsteinn_outside", + "uvlock": true, + "y": 270 + }, + "when": { + "west": "true" + } + }, + { + "apply": { + "model": "twilightforest:block/trollsteinn_inside", + "uvlock": true, + "y": 90 + }, + "when": { + "east": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/trollsteinn_outside", + "uvlock": true, + "y": 90 + }, + "when": { + "east": "true" + } + }, + { + "apply": { + "model": "twilightforest:block/trollsteinn_inside", + "uvlock": true, + "x": 270 + }, + "when": { + "up": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/trollsteinn_outside", + "uvlock": true, + "x": 270 + }, + "when": { + "up": "true" + } + }, + { + "apply": { + "model": "twilightforest:block/trollsteinn_inside", + "uvlock": true, + "x": 90 + }, + "when": { + "down": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/trollsteinn_outside", + "uvlock": true, + "x": 90 + }, + "when": { + "down": "true" + } + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/trollvidr.json b/src/generated/resources/assets/twilightforest/blockstates/trollvidr.json new file mode 100644 index 0000000000..fd7adcfe0e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/trollvidr.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/trollvidr" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/trophy_pedestal.json b/src/generated/resources/assets/twilightforest/blockstates/trophy_pedestal.json new file mode 100644 index 0000000000..60ba61d0e2 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/trophy_pedestal.json @@ -0,0 +1,158 @@ +{ + "variants": { + "active=false": [ + { + "model": "twilightforest:block/trophy_pedestal" + }, + { + "model": "twilightforest:block/trophy_pedestal", + "y": 90 + }, + { + "model": "twilightforest:block/trophy_pedestal", + "y": 180 + }, + { + "model": "twilightforest:block/trophy_pedestal", + "y": 270 + }, + { + "model": "twilightforest:block/trophy_pedestal_1" + }, + { + "model": "twilightforest:block/trophy_pedestal_1", + "y": 90 + }, + { + "model": "twilightforest:block/trophy_pedestal_1", + "y": 180 + }, + { + "model": "twilightforest:block/trophy_pedestal_1", + "y": 270 + }, + { + "model": "twilightforest:block/trophy_pedestal_2" + }, + { + "model": "twilightforest:block/trophy_pedestal_2", + "y": 90 + }, + { + "model": "twilightforest:block/trophy_pedestal_2", + "y": 180 + }, + { + "model": "twilightforest:block/trophy_pedestal_2", + "y": 270 + }, + { + "model": "twilightforest:block/trophy_pedestal_3" + }, + { + "model": "twilightforest:block/trophy_pedestal_3", + "y": 90 + }, + { + "model": "twilightforest:block/trophy_pedestal_3", + "y": 180 + }, + { + "model": "twilightforest:block/trophy_pedestal_3", + "y": 270 + }, + { + "model": "twilightforest:block/trophy_pedestal_4" + }, + { + "model": "twilightforest:block/trophy_pedestal_4", + "y": 90 + }, + { + "model": "twilightforest:block/trophy_pedestal_4", + "y": 180 + }, + { + "model": "twilightforest:block/trophy_pedestal_4", + "y": 270 + } + ], + "active=true": [ + { + "model": "twilightforest:block/trophy_pedestal_active" + }, + { + "model": "twilightforest:block/trophy_pedestal_active", + "y": 90 + }, + { + "model": "twilightforest:block/trophy_pedestal_active", + "y": 180 + }, + { + "model": "twilightforest:block/trophy_pedestal_active", + "y": 270 + }, + { + "model": "twilightforest:block/trophy_pedestal_active_1" + }, + { + "model": "twilightforest:block/trophy_pedestal_active_1", + "y": 90 + }, + { + "model": "twilightforest:block/trophy_pedestal_active_1", + "y": 180 + }, + { + "model": "twilightforest:block/trophy_pedestal_active_1", + "y": 270 + }, + { + "model": "twilightforest:block/trophy_pedestal_active_2" + }, + { + "model": "twilightforest:block/trophy_pedestal_active_2", + "y": 90 + }, + { + "model": "twilightforest:block/trophy_pedestal_active_2", + "y": 180 + }, + { + "model": "twilightforest:block/trophy_pedestal_active_2", + "y": 270 + }, + { + "model": "twilightforest:block/trophy_pedestal_active_3" + }, + { + "model": "twilightforest:block/trophy_pedestal_active_3", + "y": 90 + }, + { + "model": "twilightforest:block/trophy_pedestal_active_3", + "y": 180 + }, + { + "model": "twilightforest:block/trophy_pedestal_active_3", + "y": 270 + }, + { + "model": "twilightforest:block/trophy_pedestal_active_4" + }, + { + "model": "twilightforest:block/trophy_pedestal_active_4", + "y": 90 + }, + { + "model": "twilightforest:block/trophy_pedestal_active_4", + "y": 180 + }, + { + "model": "twilightforest:block/trophy_pedestal_active_4", + "y": 270 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/twilight_oak_banister.json b/src/generated/resources/assets/twilightforest/blockstates/twilight_oak_banister.json new file mode 100644 index 0000000000..70e0c95a8f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/twilight_oak_banister.json @@ -0,0 +1,460 @@ +{ + "variants": { + "extended=false,facing=east,shape=connected": [ + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_connected", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_connected_1", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_connected_2", + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_connected_3", + "y": 270 + } + ], + "extended=false,facing=east,shape=short": [ + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_short", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_short_1", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_short_2", + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_short_3", + "y": 270 + } + ], + "extended=false,facing=east,shape=tall": [ + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_tall", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_tall_1", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_tall_2", + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_tall_3", + "y": 270 + } + ], + "extended=false,facing=north,shape=connected": [ + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_connected", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_connected_1", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_connected_2", + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_connected_3", + "y": 180 + } + ], + "extended=false,facing=north,shape=short": [ + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_short", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_short_1", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_short_2", + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_short_3", + "y": 180 + } + ], + "extended=false,facing=north,shape=tall": [ + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_tall", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_tall_1", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_tall_2", + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_tall_3", + "y": 180 + } + ], + "extended=false,facing=south,shape=connected": [ + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_connected", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_connected_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_connected_2" + }, + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_connected_3" + } + ], + "extended=false,facing=south,shape=short": [ + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_short", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_short_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_short_2" + }, + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_short_3" + } + ], + "extended=false,facing=south,shape=tall": [ + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_tall", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_tall_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_tall_2" + }, + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_tall_3" + } + ], + "extended=false,facing=west,shape=connected": [ + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_connected", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_connected_1", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_connected_2", + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_connected_3", + "y": 90 + } + ], + "extended=false,facing=west,shape=short": [ + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_short", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_short_1", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_short_2", + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_short_3", + "y": 90 + } + ], + "extended=false,facing=west,shape=tall": [ + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_tall", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_tall_1", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_tall_2", + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_tall_3", + "y": 90 + } + ], + "extended=true,facing=east,shape=connected": [ + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_connected_extended", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_connected_extended_1", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_connected_extended_2", + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_connected_extended_3", + "y": 270 + } + ], + "extended=true,facing=east,shape=short": [ + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_short_extended", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_short_extended_1", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_short_extended_2", + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_short_extended_3", + "y": 270 + } + ], + "extended=true,facing=east,shape=tall": [ + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_tall_extended", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_tall_extended_1", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_tall_extended_2", + "y": 270 + }, + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_tall_extended_3", + "y": 270 + } + ], + "extended=true,facing=north,shape=connected": [ + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_connected_extended", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_connected_extended_1", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_connected_extended_2", + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_connected_extended_3", + "y": 180 + } + ], + "extended=true,facing=north,shape=short": [ + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_short_extended", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_short_extended_1", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_short_extended_2", + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_short_extended_3", + "y": 180 + } + ], + "extended=true,facing=north,shape=tall": [ + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_tall_extended", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_tall_extended_1", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_tall_extended_2", + "y": 180 + }, + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_tall_extended_3", + "y": 180 + } + ], + "extended=true,facing=south,shape=connected": [ + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_connected_extended", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_connected_extended_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_connected_extended_2" + }, + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_connected_extended_3" + } + ], + "extended=true,facing=south,shape=short": [ + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_short_extended", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_short_extended_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_short_extended_2" + }, + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_short_extended_3" + } + ], + "extended=true,facing=south,shape=tall": [ + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_tall_extended", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_tall_extended_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_tall_extended_2" + }, + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_tall_extended_3" + } + ], + "extended=true,facing=west,shape=connected": [ + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_connected_extended", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_connected_extended_1", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_connected_extended_2", + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_connected_extended_3", + "y": 90 + } + ], + "extended=true,facing=west,shape=short": [ + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_short_extended", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_short_extended_1", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_short_extended_2", + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_short_extended_3", + "y": 90 + } + ], + "extended=true,facing=west,shape=tall": [ + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_tall_extended", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_tall_extended_1", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_tall_extended_2", + "y": 90 + }, + { + "model": "twilightforest:block/wood/banister/twilight_oak/twilight_oak_banister_tall_extended_3", + "y": 90 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/twilight_oak_button.json b/src/generated/resources/assets/twilightforest/blockstates/twilight_oak_button.json new file mode 100644 index 0000000000..d698b5781b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/twilight_oak_button.json @@ -0,0 +1,556 @@ +{ + "variants": { + "face=ceiling,facing=east,powered=false": [ + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button", + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_1", + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_2", + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_3", + "x": 180, + "y": 270 + } + ], + "face=ceiling,facing=east,powered=true": [ + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_pressed", + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_pressed_1", + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_pressed_2", + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_pressed_3", + "x": 180, + "y": 270 + } + ], + "face=ceiling,facing=north,powered=false": [ + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button", + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_1", + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_2", + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_3", + "x": 180, + "y": 180 + } + ], + "face=ceiling,facing=north,powered=true": [ + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_pressed", + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_pressed_1", + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_pressed_2", + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_pressed_3", + "x": 180, + "y": 180 + } + ], + "face=ceiling,facing=south,powered=false": [ + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button", + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_1", + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_2", + "x": 180 + }, + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_3", + "x": 180 + } + ], + "face=ceiling,facing=south,powered=true": [ + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_pressed", + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_pressed_1", + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_pressed_2", + "x": 180 + }, + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_pressed_3", + "x": 180 + } + ], + "face=ceiling,facing=west,powered=false": [ + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button", + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_1", + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_2", + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_3", + "x": 180, + "y": 90 + } + ], + "face=ceiling,facing=west,powered=true": [ + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_pressed", + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_pressed_1", + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_pressed_2", + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_pressed_3", + "x": 180, + "y": 90 + } + ], + "face=floor,facing=east,powered=false": [ + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_1", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_2", + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_3", + "y": 90 + } + ], + "face=floor,facing=east,powered=true": [ + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_pressed", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_pressed_1", + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_pressed_2", + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_pressed_3", + "y": 90 + } + ], + "face=floor,facing=north,powered=false": [ + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_2" + }, + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_3" + } + ], + "face=floor,facing=north,powered=true": [ + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_pressed", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_pressed_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_pressed_2" + }, + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_pressed_3" + } + ], + "face=floor,facing=south,powered=false": [ + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_1", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_2", + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_3", + "y": 180 + } + ], + "face=floor,facing=south,powered=true": [ + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_pressed", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_pressed_1", + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_pressed_2", + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_pressed_3", + "y": 180 + } + ], + "face=floor,facing=west,powered=false": [ + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_1", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_2", + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_3", + "y": 270 + } + ], + "face=floor,facing=west,powered=true": [ + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_pressed", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_pressed_1", + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_pressed_2", + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_pressed_3", + "y": 270 + } + ], + "face=wall,facing=east,powered=false": [ + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_1", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_2", + "uvlock": true, + "x": 90, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_3", + "uvlock": true, + "x": 90, + "y": 90 + } + ], + "face=wall,facing=east,powered=true": [ + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_pressed", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_pressed_1", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_pressed_2", + "uvlock": true, + "x": 90, + "y": 90 + }, + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_pressed_3", + "uvlock": true, + "x": 90, + "y": 90 + } + ], + "face=wall,facing=north,powered=false": [ + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button", + "uvlock": true, + "weight": 10, + "x": 90 + }, + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_1", + "uvlock": true, + "weight": 10, + "x": 90 + }, + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_2", + "uvlock": true, + "x": 90 + }, + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_3", + "uvlock": true, + "x": 90 + } + ], + "face=wall,facing=north,powered=true": [ + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_pressed", + "uvlock": true, + "weight": 10, + "x": 90 + }, + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_pressed_1", + "uvlock": true, + "weight": 10, + "x": 90 + }, + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_pressed_2", + "uvlock": true, + "x": 90 + }, + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_pressed_3", + "uvlock": true, + "x": 90 + } + ], + "face=wall,facing=south,powered=false": [ + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_1", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_2", + "uvlock": true, + "x": 90, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_3", + "uvlock": true, + "x": 90, + "y": 180 + } + ], + "face=wall,facing=south,powered=true": [ + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_pressed", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_pressed_1", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_pressed_2", + "uvlock": true, + "x": 90, + "y": 180 + }, + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_pressed_3", + "uvlock": true, + "x": 90, + "y": 180 + } + ], + "face=wall,facing=west,powered=false": [ + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_1", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_2", + "uvlock": true, + "x": 90, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_3", + "uvlock": true, + "x": 90, + "y": 270 + } + ], + "face=wall,facing=west,powered=true": [ + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_pressed", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_pressed_1", + "uvlock": true, + "weight": 10, + "x": 90, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_pressed_2", + "uvlock": true, + "x": 90, + "y": 270 + }, + { + "model": "twilightforest:block/wood/button/twilight_oak/twilight_oak_button_pressed_3", + "uvlock": true, + "x": 90, + "y": 270 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/twilight_oak_chest.json b/src/generated/resources/assets/twilightforest/blockstates/twilight_oak_chest.json new file mode 100644 index 0000000000..0c543026d1 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/twilight_oak_chest.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/twilight_oak_chest" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/twilight_oak_door.json b/src/generated/resources/assets/twilightforest/blockstates/twilight_oak_door.json new file mode 100644 index 0000000000..fffd61c5c5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/twilight_oak_door.json @@ -0,0 +1,124 @@ +{ + "variants": { + "facing=east,half=lower,hinge=left,open=false": { + "model": "twilightforest:block/wood/door/twilight_oak/twilight_oak_door_door_bottom_left" + }, + "facing=east,half=lower,hinge=left,open=true": { + "model": "twilightforest:block/wood/door/twilight_oak/twilight_oak_door_door_bottom_left_open", + "y": 90 + }, + "facing=east,half=lower,hinge=right,open=false": { + "model": "twilightforest:block/wood/door/twilight_oak/twilight_oak_door_door_bottom_right" + }, + "facing=east,half=lower,hinge=right,open=true": { + "model": "twilightforest:block/wood/door/twilight_oak/twilight_oak_door_door_bottom_right_open", + "y": 270 + }, + "facing=east,half=upper,hinge=left,open=false": { + "model": "twilightforest:block/wood/door/twilight_oak/twilight_oak_door_door_top_left" + }, + "facing=east,half=upper,hinge=left,open=true": { + "model": "twilightforest:block/wood/door/twilight_oak/twilight_oak_door_door_top_left_open", + "y": 90 + }, + "facing=east,half=upper,hinge=right,open=false": { + "model": "twilightforest:block/wood/door/twilight_oak/twilight_oak_door_door_top_right" + }, + "facing=east,half=upper,hinge=right,open=true": { + "model": "twilightforest:block/wood/door/twilight_oak/twilight_oak_door_door_top_right_open", + "y": 270 + }, + "facing=north,half=lower,hinge=left,open=false": { + "model": "twilightforest:block/wood/door/twilight_oak/twilight_oak_door_door_bottom_left", + "y": 270 + }, + "facing=north,half=lower,hinge=left,open=true": { + "model": "twilightforest:block/wood/door/twilight_oak/twilight_oak_door_door_bottom_left_open" + }, + "facing=north,half=lower,hinge=right,open=false": { + "model": "twilightforest:block/wood/door/twilight_oak/twilight_oak_door_door_bottom_right", + "y": 270 + }, + "facing=north,half=lower,hinge=right,open=true": { + "model": "twilightforest:block/wood/door/twilight_oak/twilight_oak_door_door_bottom_right_open", + "y": 180 + }, + "facing=north,half=upper,hinge=left,open=false": { + "model": "twilightforest:block/wood/door/twilight_oak/twilight_oak_door_door_top_left", + "y": 270 + }, + "facing=north,half=upper,hinge=left,open=true": { + "model": "twilightforest:block/wood/door/twilight_oak/twilight_oak_door_door_top_left_open" + }, + "facing=north,half=upper,hinge=right,open=false": { + "model": "twilightforest:block/wood/door/twilight_oak/twilight_oak_door_door_top_right", + "y": 270 + }, + "facing=north,half=upper,hinge=right,open=true": { + "model": "twilightforest:block/wood/door/twilight_oak/twilight_oak_door_door_top_right_open", + "y": 180 + }, + "facing=south,half=lower,hinge=left,open=false": { + "model": "twilightforest:block/wood/door/twilight_oak/twilight_oak_door_door_bottom_left", + "y": 90 + }, + "facing=south,half=lower,hinge=left,open=true": { + "model": "twilightforest:block/wood/door/twilight_oak/twilight_oak_door_door_bottom_left_open", + "y": 180 + }, + "facing=south,half=lower,hinge=right,open=false": { + "model": "twilightforest:block/wood/door/twilight_oak/twilight_oak_door_door_bottom_right", + "y": 90 + }, + "facing=south,half=lower,hinge=right,open=true": { + "model": "twilightforest:block/wood/door/twilight_oak/twilight_oak_door_door_bottom_right_open" + }, + "facing=south,half=upper,hinge=left,open=false": { + "model": "twilightforest:block/wood/door/twilight_oak/twilight_oak_door_door_top_left", + "y": 90 + }, + "facing=south,half=upper,hinge=left,open=true": { + "model": "twilightforest:block/wood/door/twilight_oak/twilight_oak_door_door_top_left_open", + "y": 180 + }, + "facing=south,half=upper,hinge=right,open=false": { + "model": "twilightforest:block/wood/door/twilight_oak/twilight_oak_door_door_top_right", + "y": 90 + }, + "facing=south,half=upper,hinge=right,open=true": { + "model": "twilightforest:block/wood/door/twilight_oak/twilight_oak_door_door_top_right_open" + }, + "facing=west,half=lower,hinge=left,open=false": { + "model": "twilightforest:block/wood/door/twilight_oak/twilight_oak_door_door_bottom_left", + "y": 180 + }, + "facing=west,half=lower,hinge=left,open=true": { + "model": "twilightforest:block/wood/door/twilight_oak/twilight_oak_door_door_bottom_left_open", + "y": 270 + }, + "facing=west,half=lower,hinge=right,open=false": { + "model": "twilightforest:block/wood/door/twilight_oak/twilight_oak_door_door_bottom_right", + "y": 180 + }, + "facing=west,half=lower,hinge=right,open=true": { + "model": "twilightforest:block/wood/door/twilight_oak/twilight_oak_door_door_bottom_right_open", + "y": 90 + }, + "facing=west,half=upper,hinge=left,open=false": { + "model": "twilightforest:block/wood/door/twilight_oak/twilight_oak_door_door_top_left", + "y": 180 + }, + "facing=west,half=upper,hinge=left,open=true": { + "model": "twilightforest:block/wood/door/twilight_oak/twilight_oak_door_door_top_left_open", + "y": 270 + }, + "facing=west,half=upper,hinge=right,open=false": { + "model": "twilightforest:block/wood/door/twilight_oak/twilight_oak_door_door_top_right", + "y": 180 + }, + "facing=west,half=upper,hinge=right,open=true": { + "model": "twilightforest:block/wood/door/twilight_oak/twilight_oak_door_door_top_right_open", + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/twilight_oak_fence.json b/src/generated/resources/assets/twilightforest/blockstates/twilight_oak_fence.json new file mode 100644 index 0000000000..46e4e62031 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/twilight_oak_fence.json @@ -0,0 +1,134 @@ +{ + "multipart": [ + { + "apply": [ + { + "model": "twilightforest:block/wood/fence/twilight_oak/twilight_oak_fence_post", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence/twilight_oak/twilight_oak_fence_post_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence/twilight_oak/twilight_oak_fence_post_2" + }, + { + "model": "twilightforest:block/wood/fence/twilight_oak/twilight_oak_fence_post_3" + } + ] + }, + { + "apply": [ + { + "model": "twilightforest:block/wood/fence/twilight_oak/twilight_oak_fence_side", + "uvlock": true, + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence/twilight_oak/twilight_oak_fence_side_1", + "uvlock": true, + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence/twilight_oak/twilight_oak_fence_side_2", + "uvlock": true + }, + { + "model": "twilightforest:block/wood/fence/twilight_oak/twilight_oak_fence_side_3", + "uvlock": true + } + ], + "when": { + "north": "true" + } + }, + { + "apply": [ + { + "model": "twilightforest:block/wood/fence/twilight_oak/twilight_oak_fence_side", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence/twilight_oak/twilight_oak_fence_side_1", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence/twilight_oak/twilight_oak_fence_side_2", + "uvlock": true, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence/twilight_oak/twilight_oak_fence_side_3", + "uvlock": true, + "y": 180 + } + ], + "when": { + "south": "true" + } + }, + { + "apply": [ + { + "model": "twilightforest:block/wood/fence/twilight_oak/twilight_oak_fence_side", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence/twilight_oak/twilight_oak_fence_side_1", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence/twilight_oak/twilight_oak_fence_side_2", + "uvlock": true, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence/twilight_oak/twilight_oak_fence_side_3", + "uvlock": true, + "y": 270 + } + ], + "when": { + "west": "true" + } + }, + { + "apply": [ + { + "model": "twilightforest:block/wood/fence/twilight_oak/twilight_oak_fence_side", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence/twilight_oak/twilight_oak_fence_side_1", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence/twilight_oak/twilight_oak_fence_side_2", + "uvlock": true, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence/twilight_oak/twilight_oak_fence_side_3", + "uvlock": true, + "y": 90 + } + ], + "when": { + "east": "true" + } + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/twilight_oak_fence_gate.json b/src/generated/resources/assets/twilightforest/blockstates/twilight_oak_fence_gate.json new file mode 100644 index 0000000000..3faed497b2 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/twilight_oak_fence_gate.json @@ -0,0 +1,372 @@ +{ + "variants": { + "facing=east,in_wall=false,open=false": [ + { + "model": "twilightforest:block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_1", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_2", + "uvlock": true, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_3", + "uvlock": true, + "y": 270 + } + ], + "facing=east,in_wall=false,open=true": [ + { + "model": "twilightforest:block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_open", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_open_1", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_open_2", + "uvlock": true, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_open_3", + "uvlock": true, + "y": 270 + } + ], + "facing=east,in_wall=true,open=false": [ + { + "model": "twilightforest:block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_wall", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_wall_1", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_wall_2", + "uvlock": true, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_wall_3", + "uvlock": true, + "y": 270 + } + ], + "facing=east,in_wall=true,open=true": [ + { + "model": "twilightforest:block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_wall_open", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_wall_open_1", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_wall_open_2", + "uvlock": true, + "y": 270 + }, + { + "model": "twilightforest:block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_wall_open_3", + "uvlock": true, + "y": 270 + } + ], + "facing=north,in_wall=false,open=false": [ + { + "model": "twilightforest:block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_1", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_2", + "uvlock": true, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_3", + "uvlock": true, + "y": 180 + } + ], + "facing=north,in_wall=false,open=true": [ + { + "model": "twilightforest:block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_open", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_open_1", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_open_2", + "uvlock": true, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_open_3", + "uvlock": true, + "y": 180 + } + ], + "facing=north,in_wall=true,open=false": [ + { + "model": "twilightforest:block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_wall", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_wall_1", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_wall_2", + "uvlock": true, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_wall_3", + "uvlock": true, + "y": 180 + } + ], + "facing=north,in_wall=true,open=true": [ + { + "model": "twilightforest:block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_wall_open", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_wall_open_1", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_wall_open_2", + "uvlock": true, + "y": 180 + }, + { + "model": "twilightforest:block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_wall_open_3", + "uvlock": true, + "y": 180 + } + ], + "facing=south,in_wall=false,open=false": [ + { + "model": "twilightforest:block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate", + "uvlock": true, + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_1", + "uvlock": true, + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_2", + "uvlock": true + }, + { + "model": "twilightforest:block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_3", + "uvlock": true + } + ], + "facing=south,in_wall=false,open=true": [ + { + "model": "twilightforest:block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_open", + "uvlock": true, + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_open_1", + "uvlock": true, + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_open_2", + "uvlock": true + }, + { + "model": "twilightforest:block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_open_3", + "uvlock": true + } + ], + "facing=south,in_wall=true,open=false": [ + { + "model": "twilightforest:block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_wall", + "uvlock": true, + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_wall_1", + "uvlock": true, + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_wall_2", + "uvlock": true + }, + { + "model": "twilightforest:block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_wall_3", + "uvlock": true + } + ], + "facing=south,in_wall=true,open=true": [ + { + "model": "twilightforest:block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_wall_open", + "uvlock": true, + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_wall_open_1", + "uvlock": true, + "weight": 10 + }, + { + "model": "twilightforest:block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_wall_open_2", + "uvlock": true + }, + { + "model": "twilightforest:block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_wall_open_3", + "uvlock": true + } + ], + "facing=west,in_wall=false,open=false": [ + { + "model": "twilightforest:block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_1", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_2", + "uvlock": true, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_3", + "uvlock": true, + "y": 90 + } + ], + "facing=west,in_wall=false,open=true": [ + { + "model": "twilightforest:block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_open", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_open_1", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_open_2", + "uvlock": true, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_open_3", + "uvlock": true, + "y": 90 + } + ], + "facing=west,in_wall=true,open=false": [ + { + "model": "twilightforest:block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_wall", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_wall_1", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_wall_2", + "uvlock": true, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_wall_3", + "uvlock": true, + "y": 90 + } + ], + "facing=west,in_wall=true,open=true": [ + { + "model": "twilightforest:block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_wall_open", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_wall_open_1", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_wall_open_2", + "uvlock": true, + "y": 90 + }, + { + "model": "twilightforest:block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_wall_open_3", + "uvlock": true, + "y": 90 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/twilight_oak_leaves.json b/src/generated/resources/assets/twilightforest/blockstates/twilight_oak_leaves.json new file mode 100644 index 0000000000..405f18207c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/twilight_oak_leaves.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/twilight_oak_leaves" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/twilight_oak_log.json b/src/generated/resources/assets/twilightforest/blockstates/twilight_oak_log.json new file mode 100644 index 0000000000..3947cde7d2 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/twilight_oak_log.json @@ -0,0 +1,16 @@ +{ + "variants": { + "axis=x": { + "model": "twilightforest:block/twilight_oak_log_horizontal", + "x": 90, + "y": 90 + }, + "axis=y": { + "model": "twilightforest:block/twilight_oak_log" + }, + "axis=z": { + "model": "twilightforest:block/twilight_oak_log_horizontal", + "x": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/twilight_oak_planks.json b/src/generated/resources/assets/twilightforest/blockstates/twilight_oak_planks.json new file mode 100644 index 0000000000..16a68117d8 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/twilight_oak_planks.json @@ -0,0 +1,20 @@ +{ + "variants": { + "": [ + { + "model": "twilightforest:block/wood/planks/twilight_oak/twilight_oak_planks", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/planks/twilight_oak/twilight_oak_planks_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/planks/twilight_oak/twilight_oak_planks_2" + }, + { + "model": "twilightforest:block/wood/planks/twilight_oak/twilight_oak_planks_3" + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/twilight_oak_pressure_plate.json b/src/generated/resources/assets/twilightforest/blockstates/twilight_oak_pressure_plate.json new file mode 100644 index 0000000000..b891fe6684 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/twilight_oak_pressure_plate.json @@ -0,0 +1,36 @@ +{ + "variants": { + "powered=false": [ + { + "model": "twilightforest:block/wood/pressure_plate/twilight_oak/twilight_oak_pressure_plate", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/pressure_plate/twilight_oak/twilight_oak_pressure_plate_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/pressure_plate/twilight_oak/twilight_oak_pressure_plate_2" + }, + { + "model": "twilightforest:block/wood/pressure_plate/twilight_oak/twilight_oak_pressure_plate_3" + } + ], + "powered=true": [ + { + "model": "twilightforest:block/wood/pressure_plate/twilight_oak/twilight_oak_pressure_plate_down", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/pressure_plate/twilight_oak/twilight_oak_pressure_plate_down_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/pressure_plate/twilight_oak/twilight_oak_pressure_plate_down_2" + }, + { + "model": "twilightforest:block/wood/pressure_plate/twilight_oak/twilight_oak_pressure_plate_down_3" + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/twilight_oak_sapling.json b/src/generated/resources/assets/twilightforest/blockstates/twilight_oak_sapling.json new file mode 100644 index 0000000000..ff44e6a446 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/twilight_oak_sapling.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/twilight_oak_sapling" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/twilight_oak_sign.json b/src/generated/resources/assets/twilightforest/blockstates/twilight_oak_sign.json new file mode 100644 index 0000000000..6abb68ae62 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/twilight_oak_sign.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/twilight_oak_sign" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/twilight_oak_slab.json b/src/generated/resources/assets/twilightforest/blockstates/twilight_oak_slab.json new file mode 100644 index 0000000000..89e9f14ecc --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/twilight_oak_slab.json @@ -0,0 +1,60 @@ +{ + "variants": { + "type=bottom": [ + { + "model": "twilightforest:block/wood/slab/twilight_oak/twilight_oak_slab", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/slab/twilight_oak/twilight_oak_slab_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/slab/twilight_oak/twilight_oak_slab_2" + }, + { + "model": "twilightforest:block/wood/slab/twilight_oak/twilight_oak_slab_3" + } + ], + "type=double": [ + { + "model": "twilightforest:block/wood/planks/twilight_oak/twilight_oak_planks", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/planks/twilight_oak/twilight_oak_planks_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/planks/twilight_oak/twilight_oak_planks_2" + }, + { + "model": "twilightforest:block/wood/planks/twilight_oak/twilight_oak_planks_3" + } + ], + "type=top": [ + { + "model": "twilightforest:block/wood/slab/twilight_oak/twilight_oak_slab", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/slab/twilight_oak/twilight_oak_slab_1", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/slab/twilight_oak/twilight_oak_slab_2", + "uvlock": true, + "x": 180 + }, + { + "model": "twilightforest:block/wood/slab/twilight_oak/twilight_oak_slab_3", + "uvlock": true, + "x": 180 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/twilight_oak_stairs.json b/src/generated/resources/assets/twilightforest/blockstates/twilight_oak_stairs.json new file mode 100644 index 0000000000..9f6d242e12 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/twilight_oak_stairs.json @@ -0,0 +1,984 @@ +{ + "variants": { + "facing=east,half=bottom,shape=inner_left": [ + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_inner", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_inner_1", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_inner_2", + "uvlock": true, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_inner_3", + "uvlock": true, + "y": 270 + } + ], + "facing=east,half=bottom,shape=inner_right": [ + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_inner", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_inner_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_inner_2" + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_inner_3" + } + ], + "facing=east,half=bottom,shape=outer_left": [ + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_outer", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_outer_1", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_outer_2", + "uvlock": true, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_outer_3", + "uvlock": true, + "y": 270 + } + ], + "facing=east,half=bottom,shape=outer_right": [ + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_outer", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_outer_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_outer_2" + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_outer_3" + } + ], + "facing=east,half=bottom,shape=straight": [ + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_2" + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_3" + } + ], + "facing=east,half=top,shape=inner_left": [ + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_inner", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_inner_1", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_inner_2", + "uvlock": true, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_inner_3", + "uvlock": true, + "x": 180 + } + ], + "facing=east,half=top,shape=inner_right": [ + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_inner", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_inner_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_inner_2", + "uvlock": true, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_inner_3", + "uvlock": true, + "x": 180, + "y": 90 + } + ], + "facing=east,half=top,shape=outer_left": [ + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_outer", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_outer_1", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_outer_2", + "uvlock": true, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_outer_3", + "uvlock": true, + "x": 180 + } + ], + "facing=east,half=top,shape=outer_right": [ + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_outer", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_outer_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_outer_2", + "uvlock": true, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_outer_3", + "uvlock": true, + "x": 180, + "y": 90 + } + ], + "facing=east,half=top,shape=straight": [ + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_1", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_2", + "uvlock": true, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_3", + "uvlock": true, + "x": 180 + } + ], + "facing=north,half=bottom,shape=inner_left": [ + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_inner", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_inner_1", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_inner_2", + "uvlock": true, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_inner_3", + "uvlock": true, + "y": 180 + } + ], + "facing=north,half=bottom,shape=inner_right": [ + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_inner", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_inner_1", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_inner_2", + "uvlock": true, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_inner_3", + "uvlock": true, + "y": 270 + } + ], + "facing=north,half=bottom,shape=outer_left": [ + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_outer", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_outer_1", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_outer_2", + "uvlock": true, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_outer_3", + "uvlock": true, + "y": 180 + } + ], + "facing=north,half=bottom,shape=outer_right": [ + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_outer", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_outer_1", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_outer_2", + "uvlock": true, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_outer_3", + "uvlock": true, + "y": 270 + } + ], + "facing=north,half=bottom,shape=straight": [ + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_1", + "uvlock": true, + "weight": 10, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_2", + "uvlock": true, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_3", + "uvlock": true, + "y": 270 + } + ], + "facing=north,half=top,shape=inner_left": [ + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_inner", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_inner_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_inner_2", + "uvlock": true, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_inner_3", + "uvlock": true, + "x": 180, + "y": 270 + } + ], + "facing=north,half=top,shape=inner_right": [ + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_inner", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_inner_1", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_inner_2", + "uvlock": true, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_inner_3", + "uvlock": true, + "x": 180 + } + ], + "facing=north,half=top,shape=outer_left": [ + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_outer", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_outer_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_outer_2", + "uvlock": true, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_outer_3", + "uvlock": true, + "x": 180, + "y": 270 + } + ], + "facing=north,half=top,shape=outer_right": [ + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_outer", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_outer_1", + "uvlock": true, + "weight": 10, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_outer_2", + "uvlock": true, + "x": 180 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_outer_3", + "uvlock": true, + "x": 180 + } + ], + "facing=north,half=top,shape=straight": [ + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_2", + "uvlock": true, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_3", + "uvlock": true, + "x": 180, + "y": 270 + } + ], + "facing=south,half=bottom,shape=inner_left": [ + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_inner", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_inner_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_inner_2" + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_inner_3" + } + ], + "facing=south,half=bottom,shape=inner_right": [ + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_inner", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_inner_1", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_inner_2", + "uvlock": true, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_inner_3", + "uvlock": true, + "y": 90 + } + ], + "facing=south,half=bottom,shape=outer_left": [ + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_outer", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_outer_1", + "weight": 10 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_outer_2" + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_outer_3" + } + ], + "facing=south,half=bottom,shape=outer_right": [ + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_outer", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_outer_1", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_outer_2", + "uvlock": true, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_outer_3", + "uvlock": true, + "y": 90 + } + ], + "facing=south,half=bottom,shape=straight": [ + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_1", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_2", + "uvlock": true, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_3", + "uvlock": true, + "y": 90 + } + ], + "facing=south,half=top,shape=inner_left": [ + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_inner", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_inner_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_inner_2", + "uvlock": true, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_inner_3", + "uvlock": true, + "x": 180, + "y": 90 + } + ], + "facing=south,half=top,shape=inner_right": [ + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_inner", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_inner_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_inner_2", + "uvlock": true, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_inner_3", + "uvlock": true, + "x": 180, + "y": 180 + } + ], + "facing=south,half=top,shape=outer_left": [ + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_outer", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_outer_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_outer_2", + "uvlock": true, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_outer_3", + "uvlock": true, + "x": 180, + "y": 90 + } + ], + "facing=south,half=top,shape=outer_right": [ + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_outer", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_outer_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_outer_2", + "uvlock": true, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_outer_3", + "uvlock": true, + "x": 180, + "y": 180 + } + ], + "facing=south,half=top,shape=straight": [ + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_2", + "uvlock": true, + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_3", + "uvlock": true, + "x": 180, + "y": 90 + } + ], + "facing=west,half=bottom,shape=inner_left": [ + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_inner", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_inner_1", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_inner_2", + "uvlock": true, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_inner_3", + "uvlock": true, + "y": 90 + } + ], + "facing=west,half=bottom,shape=inner_right": [ + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_inner", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_inner_1", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_inner_2", + "uvlock": true, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_inner_3", + "uvlock": true, + "y": 180 + } + ], + "facing=west,half=bottom,shape=outer_left": [ + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_outer", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_outer_1", + "uvlock": true, + "weight": 10, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_outer_2", + "uvlock": true, + "y": 90 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_outer_3", + "uvlock": true, + "y": 90 + } + ], + "facing=west,half=bottom,shape=outer_right": [ + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_outer", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_outer_1", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_outer_2", + "uvlock": true, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_outer_3", + "uvlock": true, + "y": 180 + } + ], + "facing=west,half=bottom,shape=straight": [ + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_1", + "uvlock": true, + "weight": 10, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_2", + "uvlock": true, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_3", + "uvlock": true, + "y": 180 + } + ], + "facing=west,half=top,shape=inner_left": [ + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_inner", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_inner_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_inner_2", + "uvlock": true, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_inner_3", + "uvlock": true, + "x": 180, + "y": 180 + } + ], + "facing=west,half=top,shape=inner_right": [ + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_inner", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_inner_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_inner_2", + "uvlock": true, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_inner_3", + "uvlock": true, + "x": 180, + "y": 270 + } + ], + "facing=west,half=top,shape=outer_left": [ + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_outer", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_outer_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_outer_2", + "uvlock": true, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_outer_3", + "uvlock": true, + "x": 180, + "y": 180 + } + ], + "facing=west,half=top,shape=outer_right": [ + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_outer", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_outer_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_outer_2", + "uvlock": true, + "x": 180, + "y": 270 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_outer_3", + "uvlock": true, + "x": 180, + "y": 270 + } + ], + "facing=west,half=top,shape=straight": [ + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_1", + "uvlock": true, + "weight": 10, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_2", + "uvlock": true, + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs_3", + "uvlock": true, + "x": 180, + "y": 180 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/twilight_oak_trapdoor.json b/src/generated/resources/assets/twilightforest/blockstates/twilight_oak_trapdoor.json new file mode 100644 index 0000000000..cb3b39f4ed --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/twilight_oak_trapdoor.json @@ -0,0 +1,68 @@ +{ + "variants": { + "facing=east,half=bottom,open=false": { + "model": "twilightforest:block/wood/trapdoor/twilight_oak/twilight_oak_trapdoor_bottom", + "y": 90 + }, + "facing=east,half=bottom,open=true": { + "model": "twilightforest:block/wood/trapdoor/twilight_oak/twilight_oak_trapdoor_open", + "y": 90 + }, + "facing=east,half=top,open=false": { + "model": "twilightforest:block/wood/trapdoor/twilight_oak/twilight_oak_trapdoor_top", + "y": 90 + }, + "facing=east,half=top,open=true": { + "model": "twilightforest:block/wood/trapdoor/twilight_oak/twilight_oak_trapdoor_open", + "x": 180, + "y": 270 + }, + "facing=north,half=bottom,open=false": { + "model": "twilightforest:block/wood/trapdoor/twilight_oak/twilight_oak_trapdoor_bottom" + }, + "facing=north,half=bottom,open=true": { + "model": "twilightforest:block/wood/trapdoor/twilight_oak/twilight_oak_trapdoor_open" + }, + "facing=north,half=top,open=false": { + "model": "twilightforest:block/wood/trapdoor/twilight_oak/twilight_oak_trapdoor_top" + }, + "facing=north,half=top,open=true": { + "model": "twilightforest:block/wood/trapdoor/twilight_oak/twilight_oak_trapdoor_open", + "x": 180, + "y": 180 + }, + "facing=south,half=bottom,open=false": { + "model": "twilightforest:block/wood/trapdoor/twilight_oak/twilight_oak_trapdoor_bottom", + "y": 180 + }, + "facing=south,half=bottom,open=true": { + "model": "twilightforest:block/wood/trapdoor/twilight_oak/twilight_oak_trapdoor_open", + "y": 180 + }, + "facing=south,half=top,open=false": { + "model": "twilightforest:block/wood/trapdoor/twilight_oak/twilight_oak_trapdoor_top", + "y": 180 + }, + "facing=south,half=top,open=true": { + "model": "twilightforest:block/wood/trapdoor/twilight_oak/twilight_oak_trapdoor_open", + "x": 180 + }, + "facing=west,half=bottom,open=false": { + "model": "twilightforest:block/wood/trapdoor/twilight_oak/twilight_oak_trapdoor_bottom", + "y": 270 + }, + "facing=west,half=bottom,open=true": { + "model": "twilightforest:block/wood/trapdoor/twilight_oak/twilight_oak_trapdoor_open", + "y": 270 + }, + "facing=west,half=top,open=false": { + "model": "twilightforest:block/wood/trapdoor/twilight_oak/twilight_oak_trapdoor_top", + "y": 270 + }, + "facing=west,half=top,open=true": { + "model": "twilightforest:block/wood/trapdoor/twilight_oak/twilight_oak_trapdoor_open", + "x": 180, + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/twilight_oak_wood.json b/src/generated/resources/assets/twilightforest/blockstates/twilight_oak_wood.json new file mode 100644 index 0000000000..042b463434 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/twilight_oak_wood.json @@ -0,0 +1,16 @@ +{ + "variants": { + "axis=x": { + "model": "twilightforest:block/twilight_oak_wood_horizontal", + "x": 90, + "y": 90 + }, + "axis=y": { + "model": "twilightforest:block/twilight_oak_wood" + }, + "axis=z": { + "model": "twilightforest:block/twilight_oak_wood_horizontal", + "x": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/twilight_portal.json b/src/generated/resources/assets/twilightforest/blockstates/twilight_portal.json new file mode 100644 index 0000000000..486562246c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/twilight_portal.json @@ -0,0 +1,17 @@ +{ + "multipart": [ + { + "apply": { + "model": "twilightforest:block/twilight_portal" + } + }, + { + "apply": { + "model": "twilightforest:block/twilight_portal_barrier" + }, + "when": { + "is_one_way": "true" + } + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/twilight_portal_miniature_structure.json b/src/generated/resources/assets/twilightforest/blockstates/twilight_portal_miniature_structure.json new file mode 100644 index 0000000000..a5a6bf56e4 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/twilight_portal_miniature_structure.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/miniature/portal" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/twilight_wall_sign.json b/src/generated/resources/assets/twilightforest/blockstates/twilight_wall_sign.json new file mode 100644 index 0000000000..f173abcb85 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/twilight_wall_sign.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/twilight_wall_sign" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/twisted_stone.json b/src/generated/resources/assets/twilightforest/blockstates/twisted_stone.json new file mode 100644 index 0000000000..0fa02cc1ef --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/twisted_stone.json @@ -0,0 +1,16 @@ +{ + "variants": { + "axis=x": { + "model": "twilightforest:block/twisted_stone_horizontal", + "x": 90, + "y": 90 + }, + "axis=y": { + "model": "twilightforest:block/twisted_stone" + }, + "axis=z": { + "model": "twilightforest:block/twisted_stone_horizontal", + "x": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/twisted_stone_pillar.json b/src/generated/resources/assets/twilightforest/blockstates/twisted_stone_pillar.json new file mode 100644 index 0000000000..126aec8733 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/twisted_stone_pillar.json @@ -0,0 +1,94 @@ +{ + "multipart": [ + { + "apply": { + "model": "twilightforest:block/pillar_main_x", + "uvlock": true, + "x": 90, + "y": 90 + }, + "when": { + "axis": "x" + } + }, + { + "apply": { + "model": "twilightforest:block/pillar_top_x", + "x": 90, + "y": 90 + }, + "when": { + "axis": "x", + "east": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/pillar_bottom_x", + "x": 90, + "y": 90 + }, + "when": { + "axis": "x", + "west": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/pillar_main_y", + "uvlock": true + }, + "when": { + "axis": "y" + } + }, + { + "apply": { + "model": "twilightforest:block/pillar_top_y" + }, + "when": { + "axis": "y", + "up": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/pillar_bottom_y" + }, + "when": { + "axis": "y", + "down": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/pillar_main_z", + "uvlock": true, + "x": 90 + }, + "when": { + "axis": "z" + } + }, + { + "apply": { + "model": "twilightforest:block/pillar_top_z", + "x": 90 + }, + "when": { + "axis": "z", + "north": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/pillar_bottom_z", + "x": 90 + }, + "when": { + "axis": "z", + "south": "false" + } + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/uberous_soil.json b/src/generated/resources/assets/twilightforest/blockstates/uberous_soil.json new file mode 100644 index 0000000000..793558b465 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/uberous_soil.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/uberous_soil" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/uncrafting_table.json b/src/generated/resources/assets/twilightforest/blockstates/uncrafting_table.json new file mode 100644 index 0000000000..ffc8d13139 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/uncrafting_table.json @@ -0,0 +1,10 @@ +{ + "variants": { + "powered=false": { + "model": "twilightforest:block/uncrafting_table" + }, + "powered=true": { + "model": "twilightforest:block/uncrafting_table_glowing" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/underbrick.json b/src/generated/resources/assets/twilightforest/blockstates/underbrick.json new file mode 100644 index 0000000000..33ede8a37a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/underbrick.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/underbrick" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/underbrick_floor.json b/src/generated/resources/assets/twilightforest/blockstates/underbrick_floor.json new file mode 100644 index 0000000000..2efbd9dab0 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/underbrick_floor.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/underbrick_floor" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/unripe_trollber.json b/src/generated/resources/assets/twilightforest/blockstates/unripe_trollber.json new file mode 100644 index 0000000000..22661489b3 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/unripe_trollber.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/unripe_trollber" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/ur_ghast_boss_spawner.json b/src/generated/resources/assets/twilightforest/blockstates/ur_ghast_boss_spawner.json new file mode 100644 index 0000000000..fab51f8dc9 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/ur_ghast_boss_spawner.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/boss_spawner" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/ur_ghast_trophy.json b/src/generated/resources/assets/twilightforest/blockstates/ur_ghast_trophy.json new file mode 100644 index 0000000000..3951e3eea5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/ur_ghast_trophy.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "minecraft:block/skull" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/ur_ghast_wall_trophy.json b/src/generated/resources/assets/twilightforest/blockstates/ur_ghast_wall_trophy.json new file mode 100644 index 0000000000..3951e3eea5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/ur_ghast_wall_trophy.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "minecraft:block/skull" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/vangrove_banister.json b/src/generated/resources/assets/twilightforest/blockstates/vangrove_banister.json new file mode 100644 index 0000000000..313af8ccd6 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/vangrove_banister.json @@ -0,0 +1,94 @@ +{ + "variants": { + "extended=false,facing=east,shape=connected": { + "model": "twilightforest:block/wood/banister/vanilla_mangrove/vangrove_banister_connected", + "y": 270 + }, + "extended=false,facing=east,shape=short": { + "model": "twilightforest:block/wood/banister/vanilla_mangrove/vangrove_banister_short", + "y": 270 + }, + "extended=false,facing=east,shape=tall": { + "model": "twilightforest:block/wood/banister/vanilla_mangrove/vangrove_banister_tall", + "y": 270 + }, + "extended=false,facing=north,shape=connected": { + "model": "twilightforest:block/wood/banister/vanilla_mangrove/vangrove_banister_connected", + "y": 180 + }, + "extended=false,facing=north,shape=short": { + "model": "twilightforest:block/wood/banister/vanilla_mangrove/vangrove_banister_short", + "y": 180 + }, + "extended=false,facing=north,shape=tall": { + "model": "twilightforest:block/wood/banister/vanilla_mangrove/vangrove_banister_tall", + "y": 180 + }, + "extended=false,facing=south,shape=connected": { + "model": "twilightforest:block/wood/banister/vanilla_mangrove/vangrove_banister_connected" + }, + "extended=false,facing=south,shape=short": { + "model": "twilightforest:block/wood/banister/vanilla_mangrove/vangrove_banister_short" + }, + "extended=false,facing=south,shape=tall": { + "model": "twilightforest:block/wood/banister/vanilla_mangrove/vangrove_banister_tall" + }, + "extended=false,facing=west,shape=connected": { + "model": "twilightforest:block/wood/banister/vanilla_mangrove/vangrove_banister_connected", + "y": 90 + }, + "extended=false,facing=west,shape=short": { + "model": "twilightforest:block/wood/banister/vanilla_mangrove/vangrove_banister_short", + "y": 90 + }, + "extended=false,facing=west,shape=tall": { + "model": "twilightforest:block/wood/banister/vanilla_mangrove/vangrove_banister_tall", + "y": 90 + }, + "extended=true,facing=east,shape=connected": { + "model": "twilightforest:block/wood/banister/vanilla_mangrove/vangrove_banister_connected_extended", + "y": 270 + }, + "extended=true,facing=east,shape=short": { + "model": "twilightforest:block/wood/banister/vanilla_mangrove/vangrove_banister_short_extended", + "y": 270 + }, + "extended=true,facing=east,shape=tall": { + "model": "twilightforest:block/wood/banister/vanilla_mangrove/vangrove_banister_tall_extended", + "y": 270 + }, + "extended=true,facing=north,shape=connected": { + "model": "twilightforest:block/wood/banister/vanilla_mangrove/vangrove_banister_connected_extended", + "y": 180 + }, + "extended=true,facing=north,shape=short": { + "model": "twilightforest:block/wood/banister/vanilla_mangrove/vangrove_banister_short_extended", + "y": 180 + }, + "extended=true,facing=north,shape=tall": { + "model": "twilightforest:block/wood/banister/vanilla_mangrove/vangrove_banister_tall_extended", + "y": 180 + }, + "extended=true,facing=south,shape=connected": { + "model": "twilightforest:block/wood/banister/vanilla_mangrove/vangrove_banister_connected_extended" + }, + "extended=true,facing=south,shape=short": { + "model": "twilightforest:block/wood/banister/vanilla_mangrove/vangrove_banister_short_extended" + }, + "extended=true,facing=south,shape=tall": { + "model": "twilightforest:block/wood/banister/vanilla_mangrove/vangrove_banister_tall_extended" + }, + "extended=true,facing=west,shape=connected": { + "model": "twilightforest:block/wood/banister/vanilla_mangrove/vangrove_banister_connected_extended", + "y": 90 + }, + "extended=true,facing=west,shape=short": { + "model": "twilightforest:block/wood/banister/vanilla_mangrove/vangrove_banister_short_extended", + "y": 90 + }, + "extended=true,facing=west,shape=tall": { + "model": "twilightforest:block/wood/banister/vanilla_mangrove/vangrove_banister_tall_extended", + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/vanishing_block.json b/src/generated/resources/assets/twilightforest/blockstates/vanishing_block.json new file mode 100644 index 0000000000..f231e31845 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/vanishing_block.json @@ -0,0 +1,10 @@ +{ + "variants": { + "active=false": { + "model": "twilightforest:block/vanishing_block" + }, + "active=true": { + "model": "twilightforest:block/vanishing_block_active" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/violet_castle_door.json b/src/generated/resources/assets/twilightforest/blockstates/violet_castle_door.json new file mode 100644 index 0000000000..42bf1edd06 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/violet_castle_door.json @@ -0,0 +1,16 @@ +{ + "variants": { + "active=false,vanish=false": { + "model": "twilightforest:block/violet_castle_door" + }, + "active=false,vanish=true": { + "model": "twilightforest:block/violet_castle_door_vanished" + }, + "active=true,vanish=false": { + "model": "twilightforest:block/violet_castle_door" + }, + "active=true,vanish=true": { + "model": "twilightforest:block/violet_castle_door_vanished" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/violet_castle_rune_brick.json b/src/generated/resources/assets/twilightforest/blockstates/violet_castle_rune_brick.json new file mode 100644 index 0000000000..057df861ac --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/violet_castle_rune_brick.json @@ -0,0 +1,30 @@ +{ + "variants": { + "": [ + { + "model": "twilightforest:block/castle_rune_brick_0" + }, + { + "model": "twilightforest:block/castle_rune_brick_1" + }, + { + "model": "twilightforest:block/castle_rune_brick_2" + }, + { + "model": "twilightforest:block/castle_rune_brick_3" + }, + { + "model": "twilightforest:block/castle_rune_brick_4" + }, + { + "model": "twilightforest:block/castle_rune_brick_5" + }, + { + "model": "twilightforest:block/castle_rune_brick_6" + }, + { + "model": "twilightforest:block/castle_rune_brick_7" + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/violet_force_field.json b/src/generated/resources/assets/twilightforest/blockstates/violet_force_field.json new file mode 100644 index 0000000000..475e179d8d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/violet_force_field.json @@ -0,0 +1,1036 @@ +{ + "multipart": [ + { + "apply": { + "model": "twilightforest:block/force_field/violet_force_field_west", + "uvlock": true + }, + "when": { + "west": "true" + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/violet_force_field_no_west", + "uvlock": true + }, + "when": { + "west": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/violet_force_field_east", + "uvlock": true + }, + "when": { + "east": "true" + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/violet_force_field_no_east", + "uvlock": true + }, + "when": { + "east": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/violet_force_field_down", + "uvlock": true + }, + "when": { + "down": "true" + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/violet_force_field_no_down", + "uvlock": true + }, + "when": { + "down": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/violet_force_field_up", + "uvlock": true + }, + "when": { + "up": "true" + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/violet_force_field_no_up", + "uvlock": true + }, + "when": { + "up": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/violet_force_field_north", + "uvlock": true + }, + "when": { + "north": "true" + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/violet_force_field_no_north", + "uvlock": true + }, + "when": { + "north": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/violet_force_field_south", + "uvlock": true + }, + "when": { + "south": "true" + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/violet_force_field_no_south", + "uvlock": true + }, + "when": { + "south": "false" + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/violet_force_field_down_west", + "uvlock": true + }, + "when": { + "OR": [ + { + "down": "true", + "north": "false", + "west": "true" + }, + { + "down": "true", + "south": "false", + "west": "true" + }, + { + "axis": "y|x", + "down": "true", + "west": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/violet_force_field_down_no_west", + "uvlock": true + }, + "when": { + "OR": [ + { + "down": "true", + "west": "false" + }, + { + "axis": "z", + "down": "true", + "north": "true", + "south": "true", + "west": "true" + }, + { + "axis": "z", + "down": "true", + "west": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/violet_force_field_west_no_down", + "uvlock": true + }, + "when": { + "OR": [ + { + "down": "false", + "west": "true" + }, + { + "axis": "z", + "down": "true", + "north": "true", + "south": "true", + "west": "true" + }, + { + "axis": "z", + "down": "true", + "west": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/violet_force_field_down_east", + "uvlock": true + }, + "when": { + "OR": [ + { + "down": "true", + "east": "true", + "north": "false" + }, + { + "down": "true", + "east": "true", + "south": "false" + }, + { + "axis": "y|x", + "down": "true", + "east": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/violet_force_field_down_no_east", + "uvlock": true + }, + "when": { + "OR": [ + { + "down": "true", + "east": "false" + }, + { + "axis": "z", + "down": "true", + "east": "true", + "north": "true", + "south": "true" + }, + { + "axis": "z", + "down": "true", + "east": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/violet_force_field_east_no_down", + "uvlock": true + }, + "when": { + "OR": [ + { + "down": "false", + "east": "true" + }, + { + "axis": "z", + "down": "true", + "east": "true", + "north": "true", + "south": "true" + }, + { + "axis": "z", + "down": "true", + "east": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/violet_force_field_down_north", + "uvlock": true + }, + "when": { + "OR": [ + { + "down": "true", + "north": "true", + "west": "false" + }, + { + "down": "true", + "east": "false", + "north": "true" + }, + { + "axis": "y|z", + "down": "true", + "north": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/violet_force_field_down_no_north", + "uvlock": true + }, + "when": { + "OR": [ + { + "down": "true", + "north": "false" + }, + { + "axis": "x", + "down": "true", + "east": "true", + "north": "true", + "west": "true" + }, + { + "axis": "x", + "down": "true", + "north": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/violet_force_field_north_no_down", + "uvlock": true + }, + "when": { + "OR": [ + { + "down": "false", + "north": "true" + }, + { + "axis": "x", + "down": "true", + "east": "true", + "north": "true", + "west": "true" + }, + { + "axis": "x", + "down": "true", + "north": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/violet_force_field_down_south", + "uvlock": true + }, + "when": { + "OR": [ + { + "down": "true", + "south": "true", + "west": "false" + }, + { + "down": "true", + "east": "false", + "south": "true" + }, + { + "axis": "y|z", + "down": "true", + "south": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/violet_force_field_down_no_south", + "uvlock": true + }, + "when": { + "OR": [ + { + "down": "true", + "south": "false" + }, + { + "axis": "x", + "down": "true", + "east": "true", + "south": "true", + "west": "true" + }, + { + "axis": "x", + "down": "true", + "south": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/violet_force_field_south_no_down", + "uvlock": true + }, + "when": { + "OR": [ + { + "down": "false", + "south": "true" + }, + { + "axis": "x", + "down": "true", + "east": "true", + "south": "true", + "west": "true" + }, + { + "axis": "x", + "down": "true", + "south": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/violet_force_field_up_west", + "uvlock": true + }, + "when": { + "OR": [ + { + "north": "false", + "up": "true", + "west": "true" + }, + { + "south": "false", + "up": "true", + "west": "true" + }, + { + "axis": "y|x", + "up": "true", + "west": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/violet_force_field_up_no_west", + "uvlock": true + }, + "when": { + "OR": [ + { + "up": "true", + "west": "false" + }, + { + "axis": "z", + "north": "true", + "south": "true", + "up": "true", + "west": "true" + }, + { + "axis": "z", + "up": "true", + "west": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/violet_force_field_west_no_up", + "uvlock": true + }, + "when": { + "OR": [ + { + "up": "false", + "west": "true" + }, + { + "axis": "z", + "north": "true", + "south": "true", + "up": "true", + "west": "true" + }, + { + "axis": "z", + "up": "true", + "west": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/violet_force_field_up_east", + "uvlock": true + }, + "when": { + "OR": [ + { + "east": "true", + "north": "false", + "up": "true" + }, + { + "east": "true", + "south": "false", + "up": "true" + }, + { + "axis": "y|x", + "east": "true", + "up": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/violet_force_field_up_no_east", + "uvlock": true + }, + "when": { + "OR": [ + { + "east": "false", + "up": "true" + }, + { + "axis": "z", + "east": "true", + "north": "true", + "south": "true", + "up": "true" + }, + { + "axis": "z", + "east": "true", + "up": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/violet_force_field_east_no_up", + "uvlock": true + }, + "when": { + "OR": [ + { + "east": "true", + "up": "false" + }, + { + "axis": "z", + "east": "true", + "north": "true", + "south": "true", + "up": "true" + }, + { + "axis": "z", + "east": "true", + "up": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/violet_force_field_up_north", + "uvlock": true + }, + "when": { + "OR": [ + { + "north": "true", + "up": "true", + "west": "false" + }, + { + "east": "false", + "north": "true", + "up": "true" + }, + { + "axis": "y|z", + "north": "true", + "up": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/violet_force_field_up_no_north", + "uvlock": true + }, + "when": { + "OR": [ + { + "north": "false", + "up": "true" + }, + { + "axis": "x", + "east": "true", + "north": "true", + "up": "true", + "west": "true" + }, + { + "axis": "x", + "north": "true", + "up": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/violet_force_field_north_no_up", + "uvlock": true + }, + "when": { + "OR": [ + { + "north": "true", + "up": "false" + }, + { + "axis": "x", + "east": "true", + "north": "true", + "up": "true", + "west": "true" + }, + { + "axis": "x", + "north": "true", + "up": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/violet_force_field_up_south", + "uvlock": true + }, + "when": { + "OR": [ + { + "south": "true", + "up": "true", + "west": "false" + }, + { + "east": "false", + "south": "true", + "up": "true" + }, + { + "axis": "y|z", + "south": "true", + "up": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/violet_force_field_up_no_south", + "uvlock": true + }, + "when": { + "OR": [ + { + "south": "false", + "up": "true" + }, + { + "axis": "x", + "east": "true", + "south": "true", + "up": "true", + "west": "true" + }, + { + "axis": "x", + "south": "true", + "up": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/violet_force_field_south_no_up", + "uvlock": true + }, + "when": { + "OR": [ + { + "south": "true", + "up": "false" + }, + { + "axis": "x", + "east": "true", + "south": "true", + "up": "true", + "west": "true" + }, + { + "axis": "x", + "south": "true", + "up": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/violet_force_field_north_west", + "uvlock": true + }, + "when": { + "OR": [ + { + "down": "false", + "north": "true", + "west": "true" + }, + { + "north": "true", + "up": "false", + "west": "true" + }, + { + "axis": "x|z", + "north": "true", + "west": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/violet_force_field_north_no_west", + "uvlock": true + }, + "when": { + "OR": [ + { + "north": "true", + "west": "false" + }, + { + "axis": "y", + "down": "true", + "north": "true", + "up": "true", + "west": "true" + }, + { + "axis": "y", + "north": "true", + "west": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/violet_force_field_west_no_north", + "uvlock": true + }, + "when": { + "OR": [ + { + "north": "false", + "west": "true" + }, + { + "axis": "y", + "down": "true", + "north": "true", + "up": "true", + "west": "true" + }, + { + "axis": "y", + "north": "true", + "west": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/violet_force_field_north_east", + "uvlock": true + }, + "when": { + "OR": [ + { + "down": "false", + "east": "true", + "north": "true" + }, + { + "east": "true", + "north": "true", + "up": "false" + }, + { + "axis": "x|z", + "east": "true", + "north": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/violet_force_field_north_no_east", + "uvlock": true + }, + "when": { + "OR": [ + { + "east": "false", + "north": "true" + }, + { + "axis": "y", + "down": "true", + "east": "true", + "north": "true", + "up": "true" + }, + { + "axis": "y", + "east": "true", + "north": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/violet_force_field_east_no_north", + "uvlock": true + }, + "when": { + "OR": [ + { + "east": "true", + "north": "false" + }, + { + "axis": "y", + "down": "true", + "east": "true", + "north": "true", + "up": "true" + }, + { + "axis": "y", + "east": "true", + "north": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/violet_force_field_south_west", + "uvlock": true + }, + "when": { + "OR": [ + { + "down": "false", + "south": "true", + "west": "true" + }, + { + "south": "true", + "up": "false", + "west": "true" + }, + { + "axis": "x|z", + "south": "true", + "west": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/violet_force_field_south_no_west", + "uvlock": true + }, + "when": { + "OR": [ + { + "south": "true", + "west": "false" + }, + { + "axis": "y", + "down": "true", + "south": "true", + "up": "true", + "west": "true" + }, + { + "axis": "y", + "south": "true", + "west": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/violet_force_field_west_no_south", + "uvlock": true + }, + "when": { + "OR": [ + { + "south": "false", + "west": "true" + }, + { + "axis": "y", + "down": "true", + "south": "true", + "up": "true", + "west": "true" + }, + { + "axis": "y", + "south": "true", + "west": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/violet_force_field_south_east", + "uvlock": true + }, + "when": { + "OR": [ + { + "down": "false", + "east": "true", + "south": "true" + }, + { + "east": "true", + "south": "true", + "up": "false" + }, + { + "axis": "x|z", + "east": "true", + "south": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/violet_force_field_south_no_east", + "uvlock": true + }, + "when": { + "OR": [ + { + "east": "false", + "south": "true" + }, + { + "axis": "y", + "down": "true", + "east": "true", + "south": "true", + "up": "true" + }, + { + "axis": "y", + "east": "true", + "south": "true" + } + ] + } + }, + { + "apply": { + "model": "twilightforest:block/force_field/violet_force_field_east_no_south", + "uvlock": true + }, + "when": { + "OR": [ + { + "east": "true", + "south": "false" + }, + { + "axis": "y", + "down": "true", + "east": "true", + "south": "true", + "up": "true" + }, + { + "axis": "y", + "east": "true", + "south": "true" + } + ] + } + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/warped_banister.json b/src/generated/resources/assets/twilightforest/blockstates/warped_banister.json new file mode 100644 index 0000000000..55fde437ca --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/warped_banister.json @@ -0,0 +1,94 @@ +{ + "variants": { + "extended=false,facing=east,shape=connected": { + "model": "twilightforest:block/wood/banister/warped/warped_banister_connected", + "y": 270 + }, + "extended=false,facing=east,shape=short": { + "model": "twilightforest:block/wood/banister/warped/warped_banister_short", + "y": 270 + }, + "extended=false,facing=east,shape=tall": { + "model": "twilightforest:block/wood/banister/warped/warped_banister_tall", + "y": 270 + }, + "extended=false,facing=north,shape=connected": { + "model": "twilightforest:block/wood/banister/warped/warped_banister_connected", + "y": 180 + }, + "extended=false,facing=north,shape=short": { + "model": "twilightforest:block/wood/banister/warped/warped_banister_short", + "y": 180 + }, + "extended=false,facing=north,shape=tall": { + "model": "twilightforest:block/wood/banister/warped/warped_banister_tall", + "y": 180 + }, + "extended=false,facing=south,shape=connected": { + "model": "twilightforest:block/wood/banister/warped/warped_banister_connected" + }, + "extended=false,facing=south,shape=short": { + "model": "twilightforest:block/wood/banister/warped/warped_banister_short" + }, + "extended=false,facing=south,shape=tall": { + "model": "twilightforest:block/wood/banister/warped/warped_banister_tall" + }, + "extended=false,facing=west,shape=connected": { + "model": "twilightforest:block/wood/banister/warped/warped_banister_connected", + "y": 90 + }, + "extended=false,facing=west,shape=short": { + "model": "twilightforest:block/wood/banister/warped/warped_banister_short", + "y": 90 + }, + "extended=false,facing=west,shape=tall": { + "model": "twilightforest:block/wood/banister/warped/warped_banister_tall", + "y": 90 + }, + "extended=true,facing=east,shape=connected": { + "model": "twilightforest:block/wood/banister/warped/warped_banister_connected_extended", + "y": 270 + }, + "extended=true,facing=east,shape=short": { + "model": "twilightforest:block/wood/banister/warped/warped_banister_short_extended", + "y": 270 + }, + "extended=true,facing=east,shape=tall": { + "model": "twilightforest:block/wood/banister/warped/warped_banister_tall_extended", + "y": 270 + }, + "extended=true,facing=north,shape=connected": { + "model": "twilightforest:block/wood/banister/warped/warped_banister_connected_extended", + "y": 180 + }, + "extended=true,facing=north,shape=short": { + "model": "twilightforest:block/wood/banister/warped/warped_banister_short_extended", + "y": 180 + }, + "extended=true,facing=north,shape=tall": { + "model": "twilightforest:block/wood/banister/warped/warped_banister_tall_extended", + "y": 180 + }, + "extended=true,facing=south,shape=connected": { + "model": "twilightforest:block/wood/banister/warped/warped_banister_connected_extended" + }, + "extended=true,facing=south,shape=short": { + "model": "twilightforest:block/wood/banister/warped/warped_banister_short_extended" + }, + "extended=true,facing=south,shape=tall": { + "model": "twilightforest:block/wood/banister/warped/warped_banister_tall_extended" + }, + "extended=true,facing=west,shape=connected": { + "model": "twilightforest:block/wood/banister/warped/warped_banister_connected_extended", + "y": 90 + }, + "extended=true,facing=west,shape=short": { + "model": "twilightforest:block/wood/banister/warped/warped_banister_short_extended", + "y": 90 + }, + "extended=true,facing=west,shape=tall": { + "model": "twilightforest:block/wood/banister/warped/warped_banister_tall_extended", + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/weathered_deadrock.json b/src/generated/resources/assets/twilightforest/blockstates/weathered_deadrock.json new file mode 100644 index 0000000000..c1410b8a18 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/weathered_deadrock.json @@ -0,0 +1,50 @@ +{ + "variants": { + "": [ + { + "model": "twilightforest:block/weathered_deadrock" + }, + { + "model": "twilightforest:block/weathered_deadrock", + "y": 90 + }, + { + "model": "twilightforest:block/weathered_deadrock", + "y": 180 + }, + { + "model": "twilightforest:block/weathered_deadrock", + "x": 90 + }, + { + "model": "twilightforest:block/weathered_deadrock", + "x": 90, + "y": 90 + }, + { + "model": "twilightforest:block/weathered_deadrock", + "x": 90, + "y": 180 + }, + { + "model": "twilightforest:block/weathered_deadrock", + "x": 180 + }, + { + "model": "twilightforest:block/weathered_deadrock", + "x": 180, + "y": 90 + }, + { + "model": "twilightforest:block/weathered_deadrock", + "x": 180, + "y": 180 + }, + { + "model": "twilightforest:block/weathered_deadrock", + "x": 270, + "y": 270 + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/wispy_cloud.json b/src/generated/resources/assets/twilightforest/blockstates/wispy_cloud.json new file mode 100644 index 0000000000..eb60991e17 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/wispy_cloud.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/wispy_cloud" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/wither_skeleton_skull_candle.json b/src/generated/resources/assets/twilightforest/blockstates/wither_skeleton_skull_candle.json new file mode 100644 index 0000000000..3951e3eea5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/wither_skeleton_skull_candle.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "minecraft:block/skull" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/wither_skeleton_wall_skull_candle.json b/src/generated/resources/assets/twilightforest/blockstates/wither_skeleton_wall_skull_candle.json new file mode 100644 index 0000000000..3951e3eea5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/wither_skeleton_wall_skull_candle.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "minecraft:block/skull" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/worn_castle_brick.json b/src/generated/resources/assets/twilightforest/blockstates/worn_castle_brick.json new file mode 100644 index 0000000000..87e3c4b875 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/worn_castle_brick.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "twilightforest:block/worn_castle_brick" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/worn_castle_brick_stairs.json b/src/generated/resources/assets/twilightforest/blockstates/worn_castle_brick_stairs.json new file mode 100644 index 0000000000..2fcac84671 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/worn_castle_brick_stairs.json @@ -0,0 +1,209 @@ +{ + "variants": { + "facing=east,half=bottom,shape=inner_left": { + "model": "twilightforest:block/worn_castle_brick_stairs_inner", + "uvlock": true, + "y": 270 + }, + "facing=east,half=bottom,shape=inner_right": { + "model": "twilightforest:block/worn_castle_brick_stairs_inner" + }, + "facing=east,half=bottom,shape=outer_left": { + "model": "twilightforest:block/worn_castle_brick_stairs_outer", + "uvlock": true, + "y": 270 + }, + "facing=east,half=bottom,shape=outer_right": { + "model": "twilightforest:block/worn_castle_brick_stairs_outer" + }, + "facing=east,half=bottom,shape=straight": { + "model": "twilightforest:block/worn_castle_brick_stairs" + }, + "facing=east,half=top,shape=inner_left": { + "model": "twilightforest:block/worn_castle_brick_stairs_inner", + "uvlock": true, + "x": 180 + }, + "facing=east,half=top,shape=inner_right": { + "model": "twilightforest:block/worn_castle_brick_stairs_inner", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=east,half=top,shape=outer_left": { + "model": "twilightforest:block/worn_castle_brick_stairs_outer", + "uvlock": true, + "x": 180 + }, + "facing=east,half=top,shape=outer_right": { + "model": "twilightforest:block/worn_castle_brick_stairs_outer", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=east,half=top,shape=straight": { + "model": "twilightforest:block/worn_castle_brick_stairs", + "uvlock": true, + "x": 180 + }, + "facing=north,half=bottom,shape=inner_left": { + "model": "twilightforest:block/worn_castle_brick_stairs_inner", + "uvlock": true, + "y": 180 + }, + "facing=north,half=bottom,shape=inner_right": { + "model": "twilightforest:block/worn_castle_brick_stairs_inner", + "uvlock": true, + "y": 270 + }, + "facing=north,half=bottom,shape=outer_left": { + "model": "twilightforest:block/worn_castle_brick_stairs_outer", + "uvlock": true, + "y": 180 + }, + "facing=north,half=bottom,shape=outer_right": { + "model": "twilightforest:block/worn_castle_brick_stairs_outer", + "uvlock": true, + "y": 270 + }, + "facing=north,half=bottom,shape=straight": { + "model": "twilightforest:block/worn_castle_brick_stairs", + "uvlock": true, + "y": 270 + }, + "facing=north,half=top,shape=inner_left": { + "model": "twilightforest:block/worn_castle_brick_stairs_inner", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=north,half=top,shape=inner_right": { + "model": "twilightforest:block/worn_castle_brick_stairs_inner", + "uvlock": true, + "x": 180 + }, + "facing=north,half=top,shape=outer_left": { + "model": "twilightforest:block/worn_castle_brick_stairs_outer", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=north,half=top,shape=outer_right": { + "model": "twilightforest:block/worn_castle_brick_stairs_outer", + "uvlock": true, + "x": 180 + }, + "facing=north,half=top,shape=straight": { + "model": "twilightforest:block/worn_castle_brick_stairs", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=south,half=bottom,shape=inner_left": { + "model": "twilightforest:block/worn_castle_brick_stairs_inner" + }, + "facing=south,half=bottom,shape=inner_right": { + "model": "twilightforest:block/worn_castle_brick_stairs_inner", + "uvlock": true, + "y": 90 + }, + "facing=south,half=bottom,shape=outer_left": { + "model": "twilightforest:block/worn_castle_brick_stairs_outer" + }, + "facing=south,half=bottom,shape=outer_right": { + "model": "twilightforest:block/worn_castle_brick_stairs_outer", + "uvlock": true, + "y": 90 + }, + "facing=south,half=bottom,shape=straight": { + "model": "twilightforest:block/worn_castle_brick_stairs", + "uvlock": true, + "y": 90 + }, + "facing=south,half=top,shape=inner_left": { + "model": "twilightforest:block/worn_castle_brick_stairs_inner", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=south,half=top,shape=inner_right": { + "model": "twilightforest:block/worn_castle_brick_stairs_inner", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=south,half=top,shape=outer_left": { + "model": "twilightforest:block/worn_castle_brick_stairs_outer", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=south,half=top,shape=outer_right": { + "model": "twilightforest:block/worn_castle_brick_stairs_outer", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=south,half=top,shape=straight": { + "model": "twilightforest:block/worn_castle_brick_stairs", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=west,half=bottom,shape=inner_left": { + "model": "twilightforest:block/worn_castle_brick_stairs_inner", + "uvlock": true, + "y": 90 + }, + "facing=west,half=bottom,shape=inner_right": { + "model": "twilightforest:block/worn_castle_brick_stairs_inner", + "uvlock": true, + "y": 180 + }, + "facing=west,half=bottom,shape=outer_left": { + "model": "twilightforest:block/worn_castle_brick_stairs_outer", + "uvlock": true, + "y": 90 + }, + "facing=west,half=bottom,shape=outer_right": { + "model": "twilightforest:block/worn_castle_brick_stairs_outer", + "uvlock": true, + "y": 180 + }, + "facing=west,half=bottom,shape=straight": { + "model": "twilightforest:block/worn_castle_brick_stairs", + "uvlock": true, + "y": 180 + }, + "facing=west,half=top,shape=inner_left": { + "model": "twilightforest:block/worn_castle_brick_stairs_inner", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=west,half=top,shape=inner_right": { + "model": "twilightforest:block/worn_castle_brick_stairs_inner", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=west,half=top,shape=outer_left": { + "model": "twilightforest:block/worn_castle_brick_stairs_outer", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=west,half=top,shape=outer_right": { + "model": "twilightforest:block/worn_castle_brick_stairs_outer", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=west,half=top,shape=straight": { + "model": "twilightforest:block/worn_castle_brick_stairs", + "uvlock": true, + "x": 180, + "y": 180 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/yellow_castle_door.json b/src/generated/resources/assets/twilightforest/blockstates/yellow_castle_door.json new file mode 100644 index 0000000000..f9201e6165 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/yellow_castle_door.json @@ -0,0 +1,16 @@ +{ + "variants": { + "active=false,vanish=false": { + "model": "twilightforest:block/yellow_castle_door" + }, + "active=false,vanish=true": { + "model": "twilightforest:block/yellow_castle_door_vanished" + }, + "active=true,vanish=false": { + "model": "twilightforest:block/yellow_castle_door" + }, + "active=true,vanish=true": { + "model": "twilightforest:block/yellow_castle_door_vanished" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/yellow_castle_rune_brick.json b/src/generated/resources/assets/twilightforest/blockstates/yellow_castle_rune_brick.json new file mode 100644 index 0000000000..057df861ac --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/yellow_castle_rune_brick.json @@ -0,0 +1,30 @@ +{ + "variants": { + "": [ + { + "model": "twilightforest:block/castle_rune_brick_0" + }, + { + "model": "twilightforest:block/castle_rune_brick_1" + }, + { + "model": "twilightforest:block/castle_rune_brick_2" + }, + { + "model": "twilightforest:block/castle_rune_brick_3" + }, + { + "model": "twilightforest:block/castle_rune_brick_4" + }, + { + "model": "twilightforest:block/castle_rune_brick_5" + }, + { + "model": "twilightforest:block/castle_rune_brick_6" + }, + { + "model": "twilightforest:block/castle_rune_brick_7" + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/zombie_skull_candle.json b/src/generated/resources/assets/twilightforest/blockstates/zombie_skull_candle.json new file mode 100644 index 0000000000..3951e3eea5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/zombie_skull_candle.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "minecraft:block/skull" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/blockstates/zombie_wall_skull_candle.json b/src/generated/resources/assets/twilightforest/blockstates/zombie_wall_skull_candle.json new file mode 100644 index 0000000000..3951e3eea5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/blockstates/zombie_wall_skull_candle.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "minecraft:block/skull" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/lang/en_us.json b/src/generated/resources/assets/twilightforest/lang/en_us.json new file mode 100644 index 0000000000..c6a75c2803 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/lang/en_us.json @@ -0,0 +1,1416 @@ +{ + "advancement.twilightforest.arborist": "Maniacal Dendrologist", + "advancement.twilightforest.arborist.desc": "Get your axes and shears ready. Search every nook and cranny and get anything and everything that comes from trees! Craft, loot, obtain every slab... sapling... leaves... more... everything. ALL OF IT!", + "advancement.twilightforest.arctic_dyed": "Getting in Fashion", + "advancement.twilightforest.arctic_dyed.desc": "Dye four unique pieces of Arctic armor", + "advancement.twilightforest.beanstalk": "Jack and the Beanstalk", + "advancement.twilightforest.beanstalk.desc": "Obtain some %s in the troll caves and use them on the glowing soil beneath the clouds", + "advancement.twilightforest.experiment_115": "Mystery Meat?", + "advancement.twilightforest.experiment_115.desc": "It looks like cake, though...", + "advancement.twilightforest.experiment_115_2": "Making a note: Huge Success!", + "advancement.twilightforest.experiment_115_2.desc": "It's so delicious and moist!", + "advancement.twilightforest.experiment_115_3": "Eating 115 Everyday, 115 Years, Forever", + "advancement.twilightforest.experiment_115_3.desc": "eating experiment one-hundred-fifteen all day, forever, one-hundred-fifteen times experiment one-hundred-fifteen, experiment one-hundred-fifteen dot com, double-u double-u double-u dot experiment one-hundred-fifteen dot com, one-hundred-fifteen years, every minute experiment one-hundred-fifteen dot com, double-u double-u double-u dot one-hundred-fifteen times experiment one-hundred-fifteen dot com", + "advancement.twilightforest.fiery_set": "Gallons of Blood and Tears", + "advancement.twilightforest.fiery_set.desc": "Wield a fiery tool or weapon while having at least one piece of fiery armor in your inventory", + "advancement.twilightforest.full_mettle_alchemist": "Full Mettle Alchemist", + "advancement.twilightforest.full_mettle_alchemist.desc": "Drink four doses of Harming II from a potion flask in under 8 seconds and survive", + "advancement.twilightforest.ghast_trap": "Something Strange in Towerwood", + "advancement.twilightforest.ghast_trap.desc": "Slay the %ss around a %s and activate to wrench the %s from the sky!", + "advancement.twilightforest.giants": "I'm on Cloud Nine", + "advancement.twilightforest.giants.desc": "Kill a %s in the clouds, retrieve a %s, and return back to the troll caves", + "advancement.twilightforest.glass_sword": "One Hit Wonder", + "advancement.twilightforest.glass_sword.desc": "Hope you made good use of that.", + "advancement.twilightforest.hedge": "Bug Stomper", + "advancement.twilightforest.hedge.desc": "Defeat a spider in a Hedge Maze", + "advancement.twilightforest.hill1": "The Boots Are Mine!", + "advancement.twilightforest.hill1.desc": "Defeat a %s in a Small Hollow Hill", + "advancement.twilightforest.hill2": "What Was That Noise?", + "advancement.twilightforest.hill2.desc": "Defeat a %s in a Medium Hollow Hill", + "advancement.twilightforest.hill3": "I See Right Through You", + "advancement.twilightforest.hill3.desc": "Defeat a %s in a Large Hollow Hill", + "advancement.twilightforest.hydra_chop": "Hydra Chop, Baby!", + "advancement.twilightforest.hydra_chop.desc": "Chow down on a %s when your hunger bar is depleted", + "advancement.twilightforest.kill_cicada": "Shut", + "advancement.twilightforest.kill_cicada.desc": "Kill a Cicada", + "advancement.twilightforest.kill_hydra": "Hydra Slayer", + "advancement.twilightforest.kill_hydra.desc": "Defeat the mighty %s and empower yourself", + "advancement.twilightforest.kill_lich": "Bring Out Your Dead", + "advancement.twilightforest.kill_lich.desc": "Slay the %s at top of his tower and retrieve a scepter to clear poisonous mosquitoes from the Swamp, see through blinding darkness of the Dark Forest's curse, and resist the Snowy Forest's chill", + "advancement.twilightforest.kill_naga": "Time To Even The Scales", + "advancement.twilightforest.kill_naga.desc": "Slay the %s in its forest courtyard and obtain a %s to overcome the barrier magic surrounding the Lich's tower", + "advancement.twilightforest.lich_scepters": "By Our Powers Combined!", + "advancement.twilightforest.lich_scepters.desc": "Acquire all four scepters of power", + "advancement.twilightforest.magic_map": "I Can See Forever", + "advancement.twilightforest.magic_map.desc": "Craft the %s", + "advancement.twilightforest.magic_map_focus": "With Fire It Writes", + "advancement.twilightforest.magic_map_focus.desc": "Craft the %s with a %s, %s, and %s", + "advancement.twilightforest.maze_map": "And Now, to Find the Exit", + "advancement.twilightforest.maze_map.desc": "Craft the %s after obtaining the focus from the labyrinth", + "advancement.twilightforest.mazebreaker": "Breaking the Maze", + "advancement.twilightforest.mazebreaker.desc": "Find the %s pickaxe in the secret labyrinth vault", + "advancement.twilightforest.naga_armors": "Naga Armorer", + "advancement.twilightforest.naga_armors.desc": "Craft both %s chest and leg armor", + "advancement.twilightforest.ore_map": "How Can That Be Worth It?", + "advancement.twilightforest.ore_map.desc": "Craft the %s", + "advancement.twilightforest.progress_glacier": "Clear Skies", + "advancement.twilightforest.progress_glacier.desc": "Defeat the %s atop the Aurora Palace", + "advancement.twilightforest.progress_knights": "Carminite Acclimation", + "advancement.twilightforest.progress_knights.desc": "Settle the restless phantoms in the knight's tomb and the carminite tower's devices will obey you", + "advancement.twilightforest.progress_labyrinth": "Mighty Stroganoff", + "advancement.twilightforest.progress_labyrinth.desc": "Eat the Meef Stroganoff to acclimatize your body to the dangerous heat of the Fire Swamp", + "advancement.twilightforest.progress_merge": "Ultimate Showdown", + "advancement.twilightforest.progress_merge.desc": "Slay the %s, %s, and %s to clear the acid rain and embolden yourself for the Highlands", + "advancement.twilightforest.progress_troll": "I Wish For More Burning", + "advancement.twilightforest.progress_troll.desc": "Find the %s in the troll caves, and you can burn away the thorn barriers", + "advancement.twilightforest.progress_trophy_pedestal": "Trophied Champion", + "advancement.twilightforest.progress_trophy_pedestal.desc": "Claim your title by placing a trophy on the pedestal in the Dark Forest ruins", + "advancement.twilightforest.progress_ur_ghast": "Tears of Fire", + "advancement.twilightforest.progress_ur_ghast.desc": "Touch the fiery red tears of the %s", + "advancement.twilightforest.progress_yeti": "Alpha Fur", + "advancement.twilightforest.progress_yeti.desc": "Line your garments with the soft fur from the %s, keeping you safe from the Glacier's cold", + "advancement.twilightforest.progression_end": "End of Progression", + "advancement.twilightforest.progression_end.desc": "Anything past this point in the Highlands is a work in progress. It will be finished in the future", + "advancement.twilightforest.quest_ram": "Consummate Baaahs", + "advancement.twilightforest.quest_ram.desc": "Give the %s what it is missing", + "advancement.twilightforest.root": "Twilight Forest", + "advancement.twilightforest.root.desc": "Enter the mysterious, magical woodlands: the Twilight Forest", + "advancement.twilightforest.troll": "We Do a Little Trolling", + "advancement.twilightforest.troll.desc": "Find and kill a %s", + "advancement.twilightforest.twilight_dining": "We Dine At Eternal Sundown", + "advancement.twilightforest.twilight_dining.desc": "Eat every edible item exclusive to Twilight Forest", + "advancement.twilightforest.twilight_hunter": "The Silence of the Forest", + "advancement.twilightforest.twilight_hunter.desc": "Hunt some of the local wildlife", + "biome.twilightforest.clearing": "Twilight Clearing", + "biome.twilightforest.dark_forest": "Dark Forest", + "biome.twilightforest.dark_forest_center": "Dark Forest Center", + "biome.twilightforest.dense_forest": "Dense Forest", + "biome.twilightforest.dense_mushroom_forest": "Dense Mushroom Forest", + "biome.twilightforest.enchanted_forest": "Enchanted Forest", + "biome.twilightforest.final_plateau": "Final Plateau", + "biome.twilightforest.fire_swamp": "Fire Swamp", + "biome.twilightforest.firefly_forest": "Firefly Forest", + "biome.twilightforest.forest": "Twilight Forest", + "biome.twilightforest.glacier": "Twilight Glacier", + "biome.twilightforest.highlands": "Twilight Highlands", + "biome.twilightforest.lake": "Twilight Lake", + "biome.twilightforest.mushroom_forest": "Mushroom Forest", + "biome.twilightforest.oak_savannah": "Oak Savanna", + "biome.twilightforest.snowy_forest": "Snowy Forest", + "biome.twilightforest.spooky_forest": "Spooky Forest", + "biome.twilightforest.stream": "Twilight Stream", + "biome.twilightforest.swamp": "Twilight Swamp", + "biome.twilightforest.thornlands": "Thornlands", + "biome.twilightforest.underground": "Underground", + "block.minecraft.banner.twilightforest.alpha_yeti.black": "Black Alpha Yeti Face", + "block.minecraft.banner.twilightforest.alpha_yeti.blue": "Blue Alpha Yeti Face", + "block.minecraft.banner.twilightforest.alpha_yeti.brown": "Brown Alpha Yeti Face", + "block.minecraft.banner.twilightforest.alpha_yeti.cyan": "Cyan Alpha Yeti Face", + "block.minecraft.banner.twilightforest.alpha_yeti.gray": "Gray Alpha Yeti Face", + "block.minecraft.banner.twilightforest.alpha_yeti.green": "Green Alpha Yeti Face", + "block.minecraft.banner.twilightforest.alpha_yeti.light_blue": "Light Blue Alpha Yeti Face", + "block.minecraft.banner.twilightforest.alpha_yeti.light_gray": "Light Gray Alpha Yeti Face", + "block.minecraft.banner.twilightforest.alpha_yeti.lime": "Lime Alpha Yeti Face", + "block.minecraft.banner.twilightforest.alpha_yeti.magenta": "Magenta Alpha Yeti Face", + "block.minecraft.banner.twilightforest.alpha_yeti.orange": "Orange Alpha Yeti Face", + "block.minecraft.banner.twilightforest.alpha_yeti.pink": "Pink Alpha Yeti Face", + "block.minecraft.banner.twilightforest.alpha_yeti.purple": "Purple Alpha Yeti Face", + "block.minecraft.banner.twilightforest.alpha_yeti.red": "Red Alpha Yeti Face", + "block.minecraft.banner.twilightforest.alpha_yeti.white": "White Alpha Yeti Face", + "block.minecraft.banner.twilightforest.alpha_yeti.yellow": "Yellow Alpha Yeti Face", + "block.minecraft.banner.twilightforest.hydra.black": "Black Hydra Flame", + "block.minecraft.banner.twilightforest.hydra.blue": "Blue Hydra Flame", + "block.minecraft.banner.twilightforest.hydra.brown": "Brown Hydra Flame", + "block.minecraft.banner.twilightforest.hydra.cyan": "Cyan Hydra Flame", + "block.minecraft.banner.twilightforest.hydra.gray": "Gray Hydra Flame", + "block.minecraft.banner.twilightforest.hydra.green": "Green Hydra Flame", + "block.minecraft.banner.twilightforest.hydra.light_blue": "Light Blue Hydra Flame", + "block.minecraft.banner.twilightforest.hydra.light_gray": "Light Gray Hydra Flame", + "block.minecraft.banner.twilightforest.hydra.lime": "Lime Hydra Flame", + "block.minecraft.banner.twilightforest.hydra.magenta": "Magenta Hydra Flame", + "block.minecraft.banner.twilightforest.hydra.orange": "Orange Hydra Flame", + "block.minecraft.banner.twilightforest.hydra.pink": "Pink Hydra Flame", + "block.minecraft.banner.twilightforest.hydra.purple": "Purple Hydra Flame", + "block.minecraft.banner.twilightforest.hydra.red": "Red Hydra Flame", + "block.minecraft.banner.twilightforest.hydra.white": "White Hydra Flame", + "block.minecraft.banner.twilightforest.hydra.yellow": "Yellow Hydra Flame", + "block.minecraft.banner.twilightforest.knight_phantom.black": "Black Knight Helmet", + "block.minecraft.banner.twilightforest.knight_phantom.blue": "Blue Knight Helmet", + "block.minecraft.banner.twilightforest.knight_phantom.brown": "Brown Knight Helmet", + "block.minecraft.banner.twilightforest.knight_phantom.cyan": "Cyan Knight Helmet", + "block.minecraft.banner.twilightforest.knight_phantom.gray": "Gray Knight Helmet", + "block.minecraft.banner.twilightforest.knight_phantom.green": "Green Knight Helmet", + "block.minecraft.banner.twilightforest.knight_phantom.light_blue": "Light Blue Knight Helmet", + "block.minecraft.banner.twilightforest.knight_phantom.light_gray": "Light Gray Knight Helmet", + "block.minecraft.banner.twilightforest.knight_phantom.lime": "Lime Knight Helmet", + "block.minecraft.banner.twilightforest.knight_phantom.magenta": "Magenta Knight Helmet", + "block.minecraft.banner.twilightforest.knight_phantom.orange": "Orange Knight Helmet", + "block.minecraft.banner.twilightforest.knight_phantom.pink": "Pink Knight Helmet", + "block.minecraft.banner.twilightforest.knight_phantom.purple": "Purple Knight Helmet", + "block.minecraft.banner.twilightforest.knight_phantom.red": "Red Knight Helmet", + "block.minecraft.banner.twilightforest.knight_phantom.white": "White Knight Helmet", + "block.minecraft.banner.twilightforest.knight_phantom.yellow": "Yellow Knight Helmet", + "block.minecraft.banner.twilightforest.lich.black": "Black Lich Crown", + "block.minecraft.banner.twilightforest.lich.blue": "Blue Lich Crown", + "block.minecraft.banner.twilightforest.lich.brown": "Brown Lich Crown", + "block.minecraft.banner.twilightforest.lich.cyan": "Cyan Lich Crown", + "block.minecraft.banner.twilightforest.lich.gray": "Gray Lich Crown", + "block.minecraft.banner.twilightforest.lich.green": "Green Lich Crown", + "block.minecraft.banner.twilightforest.lich.light_blue": "Light Blue Lich Crown", + "block.minecraft.banner.twilightforest.lich.light_gray": "Light Gray Lich Crown", + "block.minecraft.banner.twilightforest.lich.lime": "Lime Lich Crown", + "block.minecraft.banner.twilightforest.lich.magenta": "Magenta Lich Crown", + "block.minecraft.banner.twilightforest.lich.orange": "Orange Lich Crown", + "block.minecraft.banner.twilightforest.lich.pink": "Pink Lich Crown", + "block.minecraft.banner.twilightforest.lich.purple": "Purple Lich Crown", + "block.minecraft.banner.twilightforest.lich.red": "Red Lich Crown", + "block.minecraft.banner.twilightforest.lich.white": "White Lich Crown", + "block.minecraft.banner.twilightforest.lich.yellow": "Yellow Lich Crown", + "block.minecraft.banner.twilightforest.minoshroom.black": "Black Minoshroom Axes", + "block.minecraft.banner.twilightforest.minoshroom.blue": "Blue Minoshroom Axes", + "block.minecraft.banner.twilightforest.minoshroom.brown": "Brown Minoshroom Axes", + "block.minecraft.banner.twilightforest.minoshroom.cyan": "Cyan Minoshroom Axes", + "block.minecraft.banner.twilightforest.minoshroom.gray": "Gray Minoshroom Axes", + "block.minecraft.banner.twilightforest.minoshroom.green": "Green Minoshroom Axes", + "block.minecraft.banner.twilightforest.minoshroom.light_blue": "Light Blue Minoshroom Axes", + "block.minecraft.banner.twilightforest.minoshroom.light_gray": "Light Gray Minoshroom Axes", + "block.minecraft.banner.twilightforest.minoshroom.lime": "Lime Minoshroom Axes", + "block.minecraft.banner.twilightforest.minoshroom.magenta": "Magenta Minoshroom Axes", + "block.minecraft.banner.twilightforest.minoshroom.orange": "Orange Minoshroom Axes", + "block.minecraft.banner.twilightforest.minoshroom.pink": "Pink Minoshroom Axes", + "block.minecraft.banner.twilightforest.minoshroom.purple": "Purple Minoshroom Axes", + "block.minecraft.banner.twilightforest.minoshroom.red": "Red Minoshroom Axes", + "block.minecraft.banner.twilightforest.minoshroom.white": "White Minoshroom Axes", + "block.minecraft.banner.twilightforest.minoshroom.yellow": "Yellow Minoshroom Axes", + "block.minecraft.banner.twilightforest.naga.black": "Black Naga Scales", + "block.minecraft.banner.twilightforest.naga.blue": "Blue Naga Scales", + "block.minecraft.banner.twilightforest.naga.brown": "Brown Naga Scales", + "block.minecraft.banner.twilightforest.naga.cyan": "Cyan Naga Scales", + "block.minecraft.banner.twilightforest.naga.gray": "Gray Naga Scales", + "block.minecraft.banner.twilightforest.naga.green": "Green Naga Scales", + "block.minecraft.banner.twilightforest.naga.light_blue": "Light Blue Naga Scales", + "block.minecraft.banner.twilightforest.naga.light_gray": "Light Gray Naga Scales", + "block.minecraft.banner.twilightforest.naga.lime": "Lime Naga Scales", + "block.minecraft.banner.twilightforest.naga.magenta": "Magenta Naga Scales", + "block.minecraft.banner.twilightforest.naga.orange": "Orange Naga Scales", + "block.minecraft.banner.twilightforest.naga.pink": "Pink Naga Scales", + "block.minecraft.banner.twilightforest.naga.purple": "Purple Naga Scales", + "block.minecraft.banner.twilightforest.naga.red": "Red Naga Scales", + "block.minecraft.banner.twilightforest.naga.white": "White Naga Scales", + "block.minecraft.banner.twilightforest.naga.yellow": "Yellow Naga Scales", + "block.minecraft.banner.twilightforest.quest_ram.black": "Black Quest Ram Swirls", + "block.minecraft.banner.twilightforest.quest_ram.blue": "Blue Quest Ram Swirls", + "block.minecraft.banner.twilightforest.quest_ram.brown": "Brown Quest Ram Swirls", + "block.minecraft.banner.twilightforest.quest_ram.cyan": "Cyan Quest Ram Swirls", + "block.minecraft.banner.twilightforest.quest_ram.gray": "Gray Quest Ram Swirls", + "block.minecraft.banner.twilightforest.quest_ram.green": "Green Quest Ram Swirls", + "block.minecraft.banner.twilightforest.quest_ram.light_blue": "Light Blue Quest Ram Swirls", + "block.minecraft.banner.twilightforest.quest_ram.light_gray": "Light Gray Quest Ram Swirls", + "block.minecraft.banner.twilightforest.quest_ram.lime": "Lime Quest Ram Swirls", + "block.minecraft.banner.twilightforest.quest_ram.magenta": "Magenta Quest Ram Swirls", + "block.minecraft.banner.twilightforest.quest_ram.orange": "Orange Quest Ram Swirls", + "block.minecraft.banner.twilightforest.quest_ram.pink": "Pink Quest Ram Swirls", + "block.minecraft.banner.twilightforest.quest_ram.purple": "Purple Quest Ram Swirls", + "block.minecraft.banner.twilightforest.quest_ram.red": "Red Quest Ram Swirls", + "block.minecraft.banner.twilightforest.quest_ram.white": "White Quest Ram Swirls", + "block.minecraft.banner.twilightforest.quest_ram.yellow": "Yellow Quest Ram Swirls", + "block.minecraft.banner.twilightforest.snow_queen.black": "Black Snow Queen Crown", + "block.minecraft.banner.twilightforest.snow_queen.blue": "Blue Snow Queen Crown", + "block.minecraft.banner.twilightforest.snow_queen.brown": "Brown Snow Queen Crown", + "block.minecraft.banner.twilightforest.snow_queen.cyan": "Cyan Snow Queen Crown", + "block.minecraft.banner.twilightforest.snow_queen.gray": "Gray Snow Queen Crown", + "block.minecraft.banner.twilightforest.snow_queen.green": "Green Snow Queen Crown", + "block.minecraft.banner.twilightforest.snow_queen.light_blue": "Light Blue Snow Queen Crown", + "block.minecraft.banner.twilightforest.snow_queen.light_gray": "Light Gray Snow Queen Crown", + "block.minecraft.banner.twilightforest.snow_queen.lime": "Lime Snow Queen Crown", + "block.minecraft.banner.twilightforest.snow_queen.magenta": "Magenta Snow Queen Crown", + "block.minecraft.banner.twilightforest.snow_queen.orange": "Orange Snow Queen Crown", + "block.minecraft.banner.twilightforest.snow_queen.pink": "Pink Snow Queen Crown", + "block.minecraft.banner.twilightforest.snow_queen.purple": "Purple Snow Queen Crown", + "block.minecraft.banner.twilightforest.snow_queen.red": "Red Snow Queen Crown", + "block.minecraft.banner.twilightforest.snow_queen.white": "White Snow Queen Crown", + "block.minecraft.banner.twilightforest.snow_queen.yellow": "Yellow Snow Queen Crown", + "block.minecraft.banner.twilightforest.ur_ghast.black": "Black Carminite Border", + "block.minecraft.banner.twilightforest.ur_ghast.blue": "Blue Carminite Border", + "block.minecraft.banner.twilightforest.ur_ghast.brown": "Brown Carminite Border", + "block.minecraft.banner.twilightforest.ur_ghast.cyan": "Cyan Carminite Border", + "block.minecraft.banner.twilightforest.ur_ghast.gray": "Gray Carminite Border", + "block.minecraft.banner.twilightforest.ur_ghast.green": "Green Carminite Border", + "block.minecraft.banner.twilightforest.ur_ghast.light_blue": "Light Blue Carminite Border", + "block.minecraft.banner.twilightforest.ur_ghast.light_gray": "Light Gray Carminite Border", + "block.minecraft.banner.twilightforest.ur_ghast.lime": "Lime Carminite Border", + "block.minecraft.banner.twilightforest.ur_ghast.magenta": "Magenta Carminite Border", + "block.minecraft.banner.twilightforest.ur_ghast.orange": "Orange Carminite Border", + "block.minecraft.banner.twilightforest.ur_ghast.pink": "Pink Carminite Border", + "block.minecraft.banner.twilightforest.ur_ghast.purple": "Purple Carminite Border", + "block.minecraft.banner.twilightforest.ur_ghast.red": "Red Carminite Border", + "block.minecraft.banner.twilightforest.ur_ghast.white": "White Carminite Border", + "block.minecraft.banner.twilightforest.ur_ghast.yellow": "Yellow Carminite Border", + "block.twilightforest.acacia_banister": "Acacia Banister", + "block.twilightforest.alpha_yeti_boss_spawner": "Alpha Yeti Boss Spawner", + "block.twilightforest.alpha_yeti_trophy": "Alpha Yeti Trophy", + "block.twilightforest.antibuilder": "Antibuilder", + "block.twilightforest.antibuilt_block": "Antibuilt Block", + "block.twilightforest.arctic_fur_block": "Block of Arctic Fur", + "block.twilightforest.arctic_fur_block.desc": "Reduces fall damage by 90%", + "block.twilightforest.aurora_block": "Aurora Block", + "block.twilightforest.aurora_pillar": "Aurora Pillar", + "block.twilightforest.aurora_slab": "Aurora Slab", + "block.twilightforest.auroralized_glass": "Auroralized Glass", + "block.twilightforest.banister.cycle": "Right click with an axe to cycle", + "block.twilightforest.beanstalk_leaves": "Beanstalk Leaves", + "block.twilightforest.birch_banister": "Birch Banister", + "block.twilightforest.blue_castle_door": "Blue Castle Door", + "block.twilightforest.blue_castle_rune_brick": "Blue Castle Rune Brick", + "block.twilightforest.blue_force_field": "Blue Force Field", + "block.twilightforest.bold_castle_brick_pillar": "Bold Castle Brick Pillar", + "block.twilightforest.bold_castle_brick_stairs": "Bold Castle Brick Stairs", + "block.twilightforest.bold_castle_brick_tile": "Bold Castle Brick Tile", + "block.twilightforest.bold_stone_pillar": "Bold Stone Pillar", + "block.twilightforest.brown_thorns": "Thorns", + "block.twilightforest.built_block": "Built Block", + "block.twilightforest.burnt_thorns": "Burnt Thorns", + "block.twilightforest.candelabra": "Candelabra", + "block.twilightforest.canopy_banister": "Canopy Banister", + "block.twilightforest.canopy_bookshelf": "Canopy Bookshelf", + "block.twilightforest.canopy_button": "Canopy Button", + "block.twilightforest.canopy_chest": "Canopy Chest", + "block.twilightforest.canopy_door": "Canopy Door", + "block.twilightforest.canopy_fence": "Canopy Fence", + "block.twilightforest.canopy_fence_gate": "Canopy Fence Gate", + "block.twilightforest.canopy_leaves": "Canopy Tree Leaves", + "block.twilightforest.canopy_log": "Canopy Tree Log", + "block.twilightforest.canopy_planks": "Canopy Planks", + "block.twilightforest.canopy_pressure_plate": "Canopy Pressure Plate", + "block.twilightforest.canopy_sapling": "Canopy Tree Sapling", + "block.twilightforest.canopy_sign": "Canopy Sign", + "block.twilightforest.canopy_slab": "Canopy Slab", + "block.twilightforest.canopy_stairs": "Canopy Stairs", + "block.twilightforest.canopy_trapdoor": "Canopy Trapdoor", + "block.twilightforest.canopy_wall_sign": "Canopy Wall Sign", + "block.twilightforest.canopy_wood": "Canopy Tree Wood", + "block.twilightforest.carminite_block": "Block of Carminite", + "block.twilightforest.carminite_builder": "Carminite Builder", + "block.twilightforest.carminite_reactor": "Carminite Reactor", + "block.twilightforest.casket.broken": "Your Keepsake Casket was too damaged to hold any more items. All items that would be stored in your casket were dropped on the ground.", + "block.twilightforest.casket.locked": "This Casket can only be opened by %s!", + "block.twilightforest.castle_brick": "Castle Brick", + "block.twilightforest.castle_brick_stairs": "Castle Brick Stairs", + "block.twilightforest.castle_roof_tile": "Castle Roof Tile", + "block.twilightforest.cicada": "Cicada", + "block.twilightforest.cicada_jar": "Cicada Jar", + "block.twilightforest.cinder_furnace": "Cinder Furnace", + "block.twilightforest.cinder_log": "Cinder Log", + "block.twilightforest.cinder_wood": "Cinder Wood", + "block.twilightforest.clover_patch": "Clover Patch", + "block.twilightforest.cracked_castle_brick": "Cracked Castle Brick", + "block.twilightforest.cracked_castle_brick_stairs": "Cracked Castle Brick Stairs", + "block.twilightforest.cracked_deadrock": "Cracked Deadrock", + "block.twilightforest.cracked_etched_nagastone": "Cracked Etched Nagastone", + "block.twilightforest.cracked_mazestone": "Cracked Mazestone Brick", + "block.twilightforest.cracked_nagastone_pillar": "Cracked Nagastone Pillar", + "block.twilightforest.cracked_nagastone_stairs_left": "Cracked Nagastone Stairs (Left)", + "block.twilightforest.cracked_nagastone_stairs_right": "Cracked Nagastone Stairs (Right)", + "block.twilightforest.cracked_towerwood": "Cracked Towerwood Planks", + "block.twilightforest.cracked_underbrick": "Cracked Underbrick", + "block.twilightforest.creeper_skull_candle": "Creeper Skull Candle", + "block.twilightforest.creeper_wall_skull_candle": "Creeper Wall Skull Candle", + "block.twilightforest.crimson_banister": "Crimson Banister", + "block.twilightforest.cut_mazestone": "Cut Mazestone", + "block.twilightforest.dark_banister": "Darkwood Banister", + "block.twilightforest.dark_button": "Darkwood Button", + "block.twilightforest.dark_chest": "Darkwood Chest", + "block.twilightforest.dark_door": "Darkwood Door", + "block.twilightforest.dark_fence": "Darkwood Fence", + "block.twilightforest.dark_fence_gate": "Darkwood Fence Gate", + "block.twilightforest.dark_leaves": "Darkwood Leaves", + "block.twilightforest.dark_log": "Darkwood Log", + "block.twilightforest.dark_oak_banister": "Dark Oak Banister", + "block.twilightforest.dark_planks": "Darkwood Planks", + "block.twilightforest.dark_pressure_plate": "Darkwood Pressure Plate", + "block.twilightforest.dark_sign": "Darkwood Sign", + "block.twilightforest.dark_slab": "Darkwood Slab", + "block.twilightforest.dark_stairs": "Darkwood Stairs", + "block.twilightforest.dark_trapdoor": "Darkwood Trapdoor", + "block.twilightforest.dark_wall_sign": "Darkwood Wall Sign", + "block.twilightforest.dark_wood": "Darkwood Wood", + "block.twilightforest.darkwood_sapling": "Darkwood Sapling", + "block.twilightforest.deadrock": "Deadrock", + "block.twilightforest.death_tome_spawner": "Death Tome Spawner", + "block.twilightforest.decorative_mazestone": "Decorative Mazestone Brick", + "block.twilightforest.empty_canopy_bookshelf": "Empty Canopy Bookshelf", + "block.twilightforest.encased_castle_brick_pillar": "Encased Castle Brick Pillar", + "block.twilightforest.encased_castle_brick_stairs": "Encased Castle Brick Stairs", + "block.twilightforest.encased_castle_brick_tile": "Encased Castle Brick Tile", + "block.twilightforest.encased_fire_jet": "Encased Fire Jet", + "block.twilightforest.encased_smoker": "Encased Smoker", + "block.twilightforest.encased_towerwood": "Encased Towerwood Planks", + "block.twilightforest.etched_nagastone": "Etched Nagastone", + "block.twilightforest.experiment_115": "Experiment 115", + "block.twilightforest.fake_diamond": "Diamond Block", + "block.twilightforest.fake_gold": "Gold Block", + "block.twilightforest.fallen_leaves": "Fallen Leaves", + "block.twilightforest.fiddlehead": "Mayapple", + "block.twilightforest.fiery_block": "Block of Fiery Metal", + "block.twilightforest.final_boss_boss_spawner": "Final Boss Boss Spawner", + "block.twilightforest.fire_jet": "Fire Jet", + "block.twilightforest.firefly": "Firefly", + "block.twilightforest.firefly_jar": "Firefly Jar", + "block.twilightforest.firefly_particle_spawner": "Firefly Particle Spawner", + "block.twilightforest.fluffy_cloud": "Fluffy Cloud", + "block.twilightforest.ghast_trap": "Ghast Trap", + "block.twilightforest.giant_cobblestone": "Giant Cobblestone", + "block.twilightforest.giant_leaves": "Giant Leaves", + "block.twilightforest.giant_log": "Giant Log", + "block.twilightforest.giant_obsidian": "Giant Obsidian", + "block.twilightforest.green_force_field": "Green Force Field", + "block.twilightforest.green_thorns": "Green Thorns", + "block.twilightforest.hardened_dark_leaves": "Thick Darkwood Leaves", + "block.twilightforest.hedge": "Hedge", + "block.twilightforest.hollow_acacia_log_climbable": "Hollow Acacia Log", + "block.twilightforest.hollow_acacia_log_horizontal": "Hollow Acacia Log", + "block.twilightforest.hollow_acacia_log_vertical": "Hollow Acacia Log", + "block.twilightforest.hollow_birch_log_climbable": "Hollow Birch Log", + "block.twilightforest.hollow_birch_log_horizontal": "Hollow Birch Log", + "block.twilightforest.hollow_birch_log_vertical": "Hollow Birch Log", + "block.twilightforest.hollow_canopy_log_climbable": "Hollow Canopy Tree Log", + "block.twilightforest.hollow_canopy_log_horizontal": "Hollow Canopy Tree Log", + "block.twilightforest.hollow_canopy_log_vertical": "Hollow Canopy Tree Log", + "block.twilightforest.hollow_crimson_stem_climbable": "Hollow Crimson Stem", + "block.twilightforest.hollow_crimson_stem_horizontal": "Hollow Crimson Stem", + "block.twilightforest.hollow_crimson_stem_vertical": "Hollow Crimson Stem", + "block.twilightforest.hollow_dark_log_climbable": "Hollow Darkwood Log", + "block.twilightforest.hollow_dark_log_horizontal": "Hollow Darkwood Log", + "block.twilightforest.hollow_dark_log_vertical": "Hollow Darkwood Log", + "block.twilightforest.hollow_dark_oak_log_climbable": "Hollow Dark Oak Log", + "block.twilightforest.hollow_dark_oak_log_horizontal": "Hollow Dark Oak Log", + "block.twilightforest.hollow_dark_oak_log_vertical": "Hollow Dark Oak Log", + "block.twilightforest.hollow_jungle_log_climbable": "Hollow Jungle Log", + "block.twilightforest.hollow_jungle_log_horizontal": "Hollow Jungle Log", + "block.twilightforest.hollow_jungle_log_vertical": "Hollow Jungle Log", + "block.twilightforest.hollow_mangrove_log_climbable": "Hollow Mangrove Log", + "block.twilightforest.hollow_mangrove_log_horizontal": "Hollow Mangrove Log", + "block.twilightforest.hollow_mangrove_log_vertical": "Hollow Mangrove Log", + "block.twilightforest.hollow_mining_log_climbable": "Hollow Minewood Log", + "block.twilightforest.hollow_mining_log_horizontal": "Hollow Minewood Log", + "block.twilightforest.hollow_mining_log_vertical": "Hollow Minewood Log", + "block.twilightforest.hollow_oak_log_climbable": "Hollow Oak Log", + "block.twilightforest.hollow_oak_log_horizontal": "Hollow Oak Log", + "block.twilightforest.hollow_oak_log_vertical": "Hollow Oak Log", + "block.twilightforest.hollow_oak_sapling": "Robust Twilight Oak Sapling", + "block.twilightforest.hollow_sorting_log_climbable": "Hollow Sortingwood Log", + "block.twilightforest.hollow_sorting_log_horizontal": "Hollow Sortingwood Log", + "block.twilightforest.hollow_sorting_log_vertical": "Hollow Sortingwood Log", + "block.twilightforest.hollow_spruce_log_climbable": "Hollow Spruce Log", + "block.twilightforest.hollow_spruce_log_horizontal": "Hollow Spruce Log", + "block.twilightforest.hollow_spruce_log_vertical": "Hollow Spruce Log", + "block.twilightforest.hollow_time_log_climbable": "Hollow Timewood Log", + "block.twilightforest.hollow_time_log_horizontal": "Hollow Timewood Log", + "block.twilightforest.hollow_time_log_vertical": "Hollow Timewood Log", + "block.twilightforest.hollow_transformation_log_climbable": "Hollow Transwood Log", + "block.twilightforest.hollow_transformation_log_horizontal": "Hollow Transwood Log", + "block.twilightforest.hollow_transformation_log_vertical": "Hollow Transwood Log", + "block.twilightforest.hollow_twilight_oak_log_climbable": "Hollow Twilight Oak Log", + "block.twilightforest.hollow_twilight_oak_log_horizontal": "Hollow Twilight Oak Log", + "block.twilightforest.hollow_twilight_oak_log_vertical": "Hollow Twilight Oak Log", + "block.twilightforest.hollow_vangrove_log_climbable": "Hollow Mangrove Log", + "block.twilightforest.hollow_vangrove_log_horizontal": "Hollow Mangrove Log", + "block.twilightforest.hollow_vangrove_log_vertical": "Hollow Mangrove Log", + "block.twilightforest.hollow_warped_stem_climbable": "Hollow Warped Stem", + "block.twilightforest.hollow_warped_stem_horizontal": "Hollow Warped Stem", + "block.twilightforest.hollow_warped_stem_vertical": "Hollow Warped Stem", + "block.twilightforest.huge_lily_pad": "Huge Lily Pad", + "block.twilightforest.huge_mushgloom": "Huge Mushgloom Block", + "block.twilightforest.huge_mushgloom_stem": "Huge Mushgloom Stem", + "block.twilightforest.huge_stalk": "Huge Stalk", + "block.twilightforest.huge_water_lily": "Huge Water Lily", + "block.twilightforest.hydra_boss_spawner": "Hydra Boss Spawner", + "block.twilightforest.hydra_trophy": "Hydra Trophy", + "block.twilightforest.infested_towerwood": "Infested Towerwood Planks", + "block.twilightforest.iron_ladder": "Iron Ladder", + "block.twilightforest.ironwood_block": "Block of Ironwood", + "block.twilightforest.jungle_banister": "Jungle Banister", + "block.twilightforest.keepsake_casket": "Keepsake Casket", + "block.twilightforest.knight_phantom_boss_spawner": "Knight Phantom Boss Spawner", + "block.twilightforest.knight_phantom_trophy": "Knight Phantom Trophy", + "block.twilightforest.knightmetal_block": "Block of Knightmetal", + "block.twilightforest.knightmetal_block.desc": "Works as a stronger cactus", + "block.twilightforest.lich_boss_spawner": "Lich Boss Spawner", + "block.twilightforest.lich_tower_miniature_structure": "Miniature Lich Tower", + "block.twilightforest.lich_trophy": "Lich Trophy", + "block.twilightforest.liveroot_block": "Liveroots", + "block.twilightforest.locked_vanishing_block": "Locked Vanishing Block", + "block.twilightforest.mangrove_banister": "Mangrove Banister", + "block.twilightforest.mangrove_button": "Mangrove Button", + "block.twilightforest.mangrove_chest": "Mangrove Chest", + "block.twilightforest.mangrove_door": "Mangrove Door", + "block.twilightforest.mangrove_fence": "Mangrove Fence", + "block.twilightforest.mangrove_fence_gate": "Mangrove Fence Gate", + "block.twilightforest.mangrove_leaves": "Mangrove Leaves", + "block.twilightforest.mangrove_log": "Mangrove Log", + "block.twilightforest.mangrove_planks": "Mangrove Planks", + "block.twilightforest.mangrove_pressure_plate": "Mangrove Pressure Plate", + "block.twilightforest.mangrove_root": "Mangrove Roots", + "block.twilightforest.mangrove_sapling": "Mangrove Sapling", + "block.twilightforest.mangrove_sign": "Mangrove Sign", + "block.twilightforest.mangrove_slab": "Mangrove Slab", + "block.twilightforest.mangrove_stairs": "Mangrove Stairs", + "block.twilightforest.mangrove_trapdoor": "Mangrove Trapdoor", + "block.twilightforest.mangrove_wall_sign": "Mangrove Wall Sign", + "block.twilightforest.mangrove_wood": "Mangrove Wood", + "block.twilightforest.mayapple": "Mayapple", + "block.twilightforest.mazestone": "Mazestone", + "block.twilightforest.mazestone_border": "Mazestone Border", + "block.twilightforest.mazestone_brick": "Mazestone Brick", + "block.twilightforest.mazestone_mosaic": "Mazestone Mosaic", + "block.twilightforest.mining_banister": "Minewood Banister", + "block.twilightforest.mining_button": "Minewood Button", + "block.twilightforest.mining_chest": "Minewood Chest", + "block.twilightforest.mining_door": "Minewood Door", + "block.twilightforest.mining_fence": "Minewood Fence", + "block.twilightforest.mining_fence_gate": "Minewood Fence Gate", + "block.twilightforest.mining_leaves": "Miner's Leaves", + "block.twilightforest.mining_log": "Minewood Log", + "block.twilightforest.mining_log_core": "Minewood Core", + "block.twilightforest.mining_planks": "Minewood Planks", + "block.twilightforest.mining_pressure_plate": "Minewood Pressure Plate", + "block.twilightforest.mining_sapling": "Miner's Tree Sapling", + "block.twilightforest.mining_sign": "Minewood Sign", + "block.twilightforest.mining_slab": "Minewood Slab", + "block.twilightforest.mining_stairs": "Minewood Stairs", + "block.twilightforest.mining_trapdoor": "Minewood Trapdoor", + "block.twilightforest.mining_wall_sign": "Minewood Wall Sign", + "block.twilightforest.mining_wood": "Minewood Wood", + "block.twilightforest.minoshroom_boss_spawner": "Minoshroom Boss Spawner", + "block.twilightforest.minoshroom_trophy": "Minoshroom Trophy", + "block.twilightforest.moonworm": "Moonworm", + "block.twilightforest.moss_patch": "Moss Patch", + "block.twilightforest.mossy_castle_brick": "Mossy Castle Brick", + "block.twilightforest.mossy_castle_brick_stairs": "Mossy Castle Brick Stairs", + "block.twilightforest.mossy_etched_nagastone": "Mossy Etched Nagastone", + "block.twilightforest.mossy_mazestone": "Mossy Mazestone Brick", + "block.twilightforest.mossy_nagastone_pillar": "Mossy Nagastone Pillar", + "block.twilightforest.mossy_nagastone_stairs_left": "Mossy Nagastone Stairs (Left)", + "block.twilightforest.mossy_nagastone_stairs_right": "Mossy Nagastone Stairs (Right)", + "block.twilightforest.mossy_towerwood": "Mossy Towerwood Planks", + "block.twilightforest.mossy_underbrick": "Mossy Underbrick", + "block.twilightforest.mushgloom": "Mushgloom", + "block.twilightforest.naga_boss_spawner": "Naga Boss Spawner", + "block.twilightforest.naga_courtyard_miniature_structure": "Miniature Naga Courtyard", + "block.twilightforest.naga_trophy": "Naga Trophy", + "block.twilightforest.nagastone": "Nagastone", + "block.twilightforest.nagastone_head": "Nagastone Head", + "block.twilightforest.nagastone_pillar": "Nagastone Pillar", + "block.twilightforest.nagastone_stairs_left": "Nagastone Stairs (Left)", + "block.twilightforest.nagastone_stairs_right": "Nagastone Stairs (Right)", + "block.twilightforest.oak_banister": "Oak Banister", + "block.twilightforest.orange_force_field": "Orange Force Field", + "block.twilightforest.pink_castle_door": "Magenta Castle Door", + "block.twilightforest.pink_castle_rune_brick": "Magenta Castle Rune Brick", + "block.twilightforest.pink_force_field": "Magenta Force Field", + "block.twilightforest.player_skull_candle": "Player Skull Candle", + "block.twilightforest.player_skull_candle.named": "%s's Head with Candles", + "block.twilightforest.player_wall_skull_candle": "Player Wall Skull Candle", + "block.twilightforest.potted_canopy_sapling": "Potted Canopy Tree Sapling", + "block.twilightforest.potted_darkwood_sapling": "Potted Darkwood Sapling", + "block.twilightforest.potted_dead_thorn": "Potted Burnt Thorn", + "block.twilightforest.potted_fiddlehead": "Potted Mayapple", + "block.twilightforest.potted_green_thorn": "Potted Green Thorn", + "block.twilightforest.potted_hollow_oak_sapling": "Potted Robust Twilight Oak Sapling", + "block.twilightforest.potted_mangrove_sapling": "Potted Mangrove Sapling", + "block.twilightforest.potted_mayapple": "Potted Mayapple", + "block.twilightforest.potted_mining_sapling": "Potted Miner's Tree Sapling", + "block.twilightforest.potted_mushgloom": "Potted Mushgloom", + "block.twilightforest.potted_rainbow_oak_sapling": "Potted Rainbow Oak Sapling", + "block.twilightforest.potted_sorting_sapling": "Potted Sorting Tree Sapling", + "block.twilightforest.potted_thorn": "Potted Thorn", + "block.twilightforest.potted_time_sapling": "Potted Tree of Time Sapling", + "block.twilightforest.potted_transformation_sapling": "Potted Tree of Transformation Sapling", + "block.twilightforest.potted_twilight_oak_sapling": "Potted Sickly Twilight Oak Sapling", + "block.twilightforest.quest_ram_trophy": "Quest Ram Trophy", + "block.twilightforest.rainbow_oak_leaves": "Rainbow Oak Leaves", + "block.twilightforest.rainbow_oak_sapling": "Rainbow Oak Sapling", + "block.twilightforest.reactor_debris": "Reactor Debris", + "block.twilightforest.reappearing_block": "Reappearing Block", + "block.twilightforest.red_thread": "Red Thread", + "block.twilightforest.root": "Roots", + "block.twilightforest.root_strand": "Root Strands", + "block.twilightforest.skeleton_skull_candle": "Skeleton Skull Candle", + "block.twilightforest.skeleton_wall_skull_candle": "Skeleton Wall Skull Candle", + "block.twilightforest.slider": "Slide Trap", + "block.twilightforest.smoker": "Smoker", + "block.twilightforest.snow_queen_boss_spawner": "Snow Queen Boss Spawner", + "block.twilightforest.snow_queen_trophy": "Snow Queen Trophy", + "block.twilightforest.sorting_banister": "Sortingwood Banister", + "block.twilightforest.sorting_button": "Sortingwood Button", + "block.twilightforest.sorting_chest": "Sortingwood Chest", + "block.twilightforest.sorting_door": "Sortingwood Door", + "block.twilightforest.sorting_fence": "Sortingwood Fence", + "block.twilightforest.sorting_fence_gate": "Sortingwood Fence Gate", + "block.twilightforest.sorting_leaves": "Sorting Leaves", + "block.twilightforest.sorting_log": "Sortingwood Log", + "block.twilightforest.sorting_log_core": "Sortingwood Engine", + "block.twilightforest.sorting_planks": "Sortingwood Planks", + "block.twilightforest.sorting_pressure_plate": "Sortingwood Pressure Plate", + "block.twilightforest.sorting_sapling": "Sorting Tree Sapling", + "block.twilightforest.sorting_sign": "Sortingwood Sign", + "block.twilightforest.sorting_slab": "Sortingwood Slab", + "block.twilightforest.sorting_stairs": "Sortingwood Stairs", + "block.twilightforest.sorting_trapdoor": "Sortingwood Trapdoor", + "block.twilightforest.sorting_wall_sign": "Sortingwood Wall Sign", + "block.twilightforest.sorting_wood": "Sortingwood Wood", + "block.twilightforest.spiral_bricks": "Spiral Bricks", + "block.twilightforest.spruce_banister": "Spruce Banister", + "block.twilightforest.steeleaf_block": "Block of Steeleaf", + "block.twilightforest.stripped_canopy_log": "Stripped Canopy Tree Log", + "block.twilightforest.stripped_canopy_wood": "Stripped Canopy Tree Wood", + "block.twilightforest.stripped_dark_log": "Stripped Darkwood Log", + "block.twilightforest.stripped_dark_wood": "Stripped Darkwood Wood", + "block.twilightforest.stripped_mangrove_log": "Stripped Mangrove Log", + "block.twilightforest.stripped_mangrove_wood": "Stripped Mangrove Wood", + "block.twilightforest.stripped_mining_log": "Stripped Minewood Log", + "block.twilightforest.stripped_mining_wood": "Stripped Minewood Wood", + "block.twilightforest.stripped_sorting_log": "Stripped Sortingwood Log", + "block.twilightforest.stripped_sorting_wood": "Stripped Sortingwood Wood", + "block.twilightforest.stripped_time_log": "Stripped Timewood Log", + "block.twilightforest.stripped_time_wood": "Stripped Timewood Wood", + "block.twilightforest.stripped_transformation_log": "Stripped Transwood Log", + "block.twilightforest.stripped_transformation_wood": "Stripped Transwood Wood", + "block.twilightforest.stripped_twilight_oak_log": "Stripped Twilight Oak Log", + "block.twilightforest.stripped_twilight_oak_wood": "Stripped Twilight Oak Wood", + "block.twilightforest.stronghold_shield": "Stronghold Shield", + "block.twilightforest.thick_castle_brick": "Thick Castle Brick", + "block.twilightforest.thorn_leaves": "Thorn Leaves", + "block.twilightforest.thorn_rose": "Thorn Rose", + "block.twilightforest.time_banister": "Timewood Banister", + "block.twilightforest.time_button": "Timewood Button", + "block.twilightforest.time_chest": "Timewood Chest", + "block.twilightforest.time_door": "Timewood Door", + "block.twilightforest.time_fence": "Timewood Fence", + "block.twilightforest.time_fence_gate": "Timewood Fence Gate", + "block.twilightforest.time_leaves": "Timewood Leaves", + "block.twilightforest.time_log": "Timewood Log", + "block.twilightforest.time_log_core": "Timewood Clock", + "block.twilightforest.time_planks": "Timewood Planks", + "block.twilightforest.time_pressure_plate": "Timewood Pressure Plate", + "block.twilightforest.time_sapling": "Tree of Time Sapling", + "block.twilightforest.time_sign": "Timewood Sign", + "block.twilightforest.time_slab": "Timewood Slab", + "block.twilightforest.time_stairs": "Timewood Stairs", + "block.twilightforest.time_trapdoor": "Timewood Trapdoor", + "block.twilightforest.time_wall_sign": "Timewood Wall Sign", + "block.twilightforest.time_wood": "Timewood Wood", + "block.twilightforest.torchberry_plant": "Torchberry Plant", + "block.twilightforest.towerwood": "Towerwood Planks", + "block.twilightforest.transformation_banister": "Transwood Banister", + "block.twilightforest.transformation_button": "Transwood Button", + "block.twilightforest.transformation_chest": "Transwood Chest", + "block.twilightforest.transformation_door": "Transwood Door", + "block.twilightforest.transformation_fence": "Transwood Fence", + "block.twilightforest.transformation_fence_gate": "Transwood Fence Gate", + "block.twilightforest.transformation_leaves": "Leaves of Transformation", + "block.twilightforest.transformation_log": "Transwood Log", + "block.twilightforest.transformation_log_core": "Heart of Transformation", + "block.twilightforest.transformation_planks": "Transwood Planks", + "block.twilightforest.transformation_pressure_plate": "Transwood Pressure Plate", + "block.twilightforest.transformation_sapling": "Tree of Transformation Sapling", + "block.twilightforest.transformation_sign": "Transwood Sign", + "block.twilightforest.transformation_slab": "Transwood Slab", + "block.twilightforest.transformation_stairs": "Transwood Stairs", + "block.twilightforest.transformation_trapdoor": "Transwood Trapdoor", + "block.twilightforest.transformation_wall_sign": "Transwood Wall Sign", + "block.twilightforest.transformation_wood": "Transwood Wood", + "block.twilightforest.trollber": "Trollber", + "block.twilightforest.trollsteinn": "Trollsteinn", + "block.twilightforest.trollvidr": "Trollvidr", + "block.twilightforest.trophy_pedestal": "Trophy Pedestal", + "block.twilightforest.twilight_oak_banister": "Twilight Oak Banister", + "block.twilightforest.twilight_oak_button": "Twilight Oak Button", + "block.twilightforest.twilight_oak_chest": "Twilight Oak Chest", + "block.twilightforest.twilight_oak_door": "Twilight Oak Door", + "block.twilightforest.twilight_oak_fence": "Twilight Oak Fence", + "block.twilightforest.twilight_oak_fence_gate": "Twilight Oak Fence Gate", + "block.twilightforest.twilight_oak_leaves": "Twilight Oak Leaves", + "block.twilightforest.twilight_oak_log": "Twilight Oak Log", + "block.twilightforest.twilight_oak_planks": "Twilight Oak Planks", + "block.twilightforest.twilight_oak_pressure_plate": "Twilight Oak Pressure Plate", + "block.twilightforest.twilight_oak_sapling": "Sickly Twilight Oak Sapling", + "block.twilightforest.twilight_oak_sign": "Twilight Oak Sign", + "block.twilightforest.twilight_oak_slab": "Twilight Oak Slab", + "block.twilightforest.twilight_oak_stairs": "Twilight Oak Stairs", + "block.twilightforest.twilight_oak_trapdoor": "Twilight Oak Trapdoor", + "block.twilightforest.twilight_oak_wall_sign": "Twilight Oak Wall Sign", + "block.twilightforest.twilight_oak_wood": "Twilight Oak Wood", + "block.twilightforest.twilight_portal": "Twilight Forest Portal", + "block.twilightforest.twilight_portal_miniature_structure": "Miniature Twilight Forest Portal", + "block.twilightforest.twisted_stone": "Twisted Stone", + "block.twilightforest.twisted_stone_pillar": "Twisted Stone Pillar", + "block.twilightforest.uberous_soil": "Uberous Soil", + "block.twilightforest.uncrafting_table": "Uncrafting Table", + "block.twilightforest.underbrick": "Underbrick", + "block.twilightforest.underbrick_floor": "Underbrick Floor", + "block.twilightforest.unripe_trollber": "Unripe Trollber", + "block.twilightforest.ur_ghast_boss_spawner": "Ur-Ghast Boss Spawner", + "block.twilightforest.ur_ghast_trophy": "Ur-Ghast Trophy", + "block.twilightforest.vangrove_banister": "Mangrove Banister", + "block.twilightforest.vanishing_block": "Vanishing Block", + "block.twilightforest.violet_castle_door": "Violet Castle Door", + "block.twilightforest.violet_castle_rune_brick": "Violet Castle Rune Brick", + "block.twilightforest.violet_force_field": "Violet Force Field", + "block.twilightforest.warped_banister": "Warped Banister", + "block.twilightforest.weathered_deadrock": "Weathered Deadrock", + "block.twilightforest.wispy_cloud": "Wispy Cloud", + "block.twilightforest.wither_skeleton_skull_candle": "Wither Skeleton Skull Candle", + "block.twilightforest.wither_skeleton_wall_skull_candle": "Wither Skeleton Wall Skull Candle", + "block.twilightforest.worn_castle_brick": "Worn Castle Brick", + "block.twilightforest.worn_castle_brick_stairs": "Worn Castle Brick Stairs", + "block.twilightforest.yellow_castle_door": "Yellow Castle Door", + "block.twilightforest.yellow_castle_rune_brick": "Yellow Castle Rune Brick", + "block.twilightforest.zombie_skull_candle": "Zombie Skull Candle", + "block.twilightforest.zombie_wall_skull_candle": "Zombie Wall Skull Candle", + "commands.tffeature.center": "Center of feature: %s", + "commands.tffeature.chunk": "Located in feature chunk: %s", + "commands.tffeature.nearest": "The nearest feature is: %s", + "commands.tffeature.none_nearby": "Couldn't find a feature nearby!", + "commands.tffeature.not_in_twilight_forest": "You are not in the Twilight Forest dimension", + "commands.tffeature.not_player": "This command must be run by a valid player!", + "commands.tffeature.structure.conquer.status": "Structure conquer flag: %s", + "commands.tffeature.structure.conquer.update": "Structure conquer flag was %s, changing to %s", + "commands.tffeature.structure.inside": "You are in a Landmark structure", + "commands.tffeature.structure.outside": "You are not in a Landmark structure", + "commands.tffeature.structure.required": "You are not in a structure", + "commands.tffeature.structure.spawn_info": "%s, Weight %s", + "commands.tffeature.structure.spawn_list": "Spawn list for this area is:", + "commands.tffeature.usage": "/%s ", + "config.jade.plugin_twilightforest.quest_ram_wool": "Quest Ram Wool", + "container.twilightforest.uncrafting_table": "Uncrafting Table", + "container.twilightforest.uncrafting_table.disabled": "Uncrafting is disabled via config", + "container.twilightforest.uncrafting_table.disabled_item": "Uncrafting this item is disabled.", + "death.attack.twilightforest.ant": "%1$s was squashed like an ant by %2$s", + "death.attack.twilightforest.ant.item": "%1$s was squashed like an ant by %2$s holding %3$s", + "death.attack.twilightforest.axing": "%1$s was chopped up by %2$s", + "death.attack.twilightforest.axing.item": "%1$s was chopped up by %2$s using %3$s", + "death.attack.twilightforest.chillingBreath": "%1$s was frozen to death by the Snow Queen", + "death.attack.twilightforest.chillingBreath.player": "%1$s was frozen to death by the Snow Queen while escaping %2$s", + "death.attack.twilightforest.clamped": "%1$s was squeezed to death by %2$s", + "death.attack.twilightforest.clamped.item": "%1$s was squeezed to death by %2$s using %3$s", + "death.attack.twilightforest.expired": "%1$s's life expired", + "death.attack.twilightforest.expired.player": "%1$s's life expired", + "death.attack.twilightforest.fiery": "%1$s walked onto a Fiery block", + "death.attack.twilightforest.fiery.player": "%1$s walked onto a Fiery block while escaping %2$s", + "death.attack.twilightforest.fireJet": "%1$s accidentally walked into a Fire Jet", + "death.attack.twilightforest.fireJet.player": "%1$s accidentally walked into a Fire Jet while escaping %2$s", + "death.attack.twilightforest.frozen": "%1$s was frozen by %2$s using an Ice Bomb", + "death.attack.twilightforest.frozen.item": "%1$s was frozen by %2$s using %3$s", + "death.attack.twilightforest.ghastTear": "%1$s was scalded by fiery tears", + "death.attack.twilightforest.ghastTear.player": "%1$s was scalded by fiery tears while escaping %2$s", + "death.attack.twilightforest.haunt": "%1$s joined the %2$s's haunt", + "death.attack.twilightforest.haunt.item": "%1$s joined the %2$s's haunt after being killed by %3$s", + "death.attack.twilightforest.hydraBite": "%1$s's skin was ripped off by the Hydra", + "death.attack.twilightforest.hydraBite.player": "%1$s's skin was ripped off by the Hydra while escaping %2$s", + "death.attack.twilightforest.hydraFire": "%1$s was roasted alive by the Hydra", + "death.attack.twilightforest.hydraFire.player": "%1$s was roasted alive by the Hydra while escaping %2$s", + "death.attack.twilightforest.knightmetal": "%1$s was skewered by a Knightmetal block", + "death.attack.twilightforest.knightmetal.player": "%1$s was skewered by a Knightmetal block while escaping %2$s", + "death.attack.twilightforest.leafBrain": "%1$s's brain was turned into leaves by %2$s", + "death.attack.twilightforest.leafBrain.item": "%1$s's brain was turned into leaves by %2$s using %3$s", + "death.attack.twilightforest.lichBolt": "The Lich's aim was better than %1$s", + "death.attack.twilightforest.lichBolt.player": "The Lich and %2$s had better aim than %1$s", + "death.attack.twilightforest.lichBomb": "%1$s succumbed to the Lich's explosive magic", + "death.attack.twilightforest.lichBomb.player": "%1$s succumbed to the Lich's explosive magic while escaping %2$s", + "death.attack.twilightforest.lifedrain": "%1$s's life was drained by %2$s", + "death.attack.twilightforest.lifedrain.item": "%1$s's life was drained by %2$s using %3$s", + "death.attack.twilightforest.lostWords": "%1$s was at a loss for words after being killed by %2$s", + "death.attack.twilightforest.lostWords.item": "%1$s was at a loss for words after being killed by %2$s using %3$s", + "death.attack.twilightforest.moonworm": "%1$s was shot by Moonworm", + "death.attack.twilightforest.reactor": "%1$s stood too close to a Carminite Reactor", + "death.attack.twilightforest.reactor.player": "%1$s stood too close to a Carminite Reactor while escaping %2$s", + "death.attack.twilightforest.schooled": "%1$s was schooled by %2$s", + "death.attack.twilightforest.schooled.item": "%1$s was schooled by %2$s using %3$s", + "death.attack.twilightforest.scorched": "%1$s was scorched by %2$s", + "death.attack.twilightforest.scorched.item": "%1$s was scorched by %2$s using %3$s", + "death.attack.twilightforest.slider": "%1$s was sliced up by a Sliding Trap", + "death.attack.twilightforest.slider.player": "%1$s was sliced up by a Sliding Trap while escaping %2$s", + "death.attack.twilightforest.snowballFight": "%1$s lost a snowball fight to %2$s", + "death.attack.twilightforest.snowballFight.item": "%1$s lost a snowball fight to %2$s using %3$s", + "death.attack.twilightforest.spiked": "%1$s was skewered by %2$s", + "death.attack.twilightforest.spiked.item": "%1$s was skewered by %2$s using %3$s", + "death.attack.twilightforest.squish": "%1$s was squashed by the Snow Queen", + "death.attack.twilightforest.squish.player": "%1$s was squashed by the Snow Queen while escaping %2$s", + "death.attack.twilightforest.thorns": "%1$s walked into some thorns", + "death.attack.twilightforest.thorns.player": "%1$s walked into some thorns while escaping %2$s", + "death.attack.twilightforest.thrownAxe": "%1$s was decapitated by a thrown axe", + "death.attack.twilightforest.thrownAxe.player": "%1$s was decapitated by a thrown axe while escaping %2$s", + "death.attack.twilightforest.thrownBlock": "%1$s was squashed by a thrown block", + "death.attack.twilightforest.thrownBlock.player": "%1$s was squashed by a thrown block while escaping %2$s", + "death.attack.twilightforest.thrownPickaxe": "%1$s was decapitated by a thrown pickaxe", + "death.attack.twilightforest.thrownPickaxe.player": "%1$s was decapitated by a thrown pickaxe while escaping %2$s", + "death.attack.twilightforest.yeeted": "%1$s was yeeted for the last time", + "death.attack.twilightforest.yeeted.entity": "%1$s was yeeted for the last time by %2$s", + "death.attack.twilightforest.yeeted.item": "%1$s was yeeted for the last time by %2$s while somehow holding %3$s", + "dimension.twilightforest.twilightforest": "Twilight Forest", + "effect.twilightforest.frosted": "Frosted", + "enchantment.twilightforest.chill_aura": "Chill Aura", + "enchantment.twilightforest.chill_aura.desc": "Adds a chance for the attacker to gain the frosted effect after hitting the wearer.", + "enchantment.twilightforest.destruction": "Destruction", + "enchantment.twilightforest.destruction.desc": "Allows the Block and Chain to break blocks with a higher mining tier.", + "enchantment.twilightforest.fire_react": "Fire React", + "enchantment.twilightforest.fire_react.desc": "Adds a chance for the attacker to be set on fire after hitting the wearer.", + "entity.twilightforest.adherent": "Adherent", + "entity.twilightforest.alpha_yeti": "Alpha Yeti", + "entity.twilightforest.armored_giant": "Armored Giant", + "entity.twilightforest.bighorn_sheep": "Bighorn Sheep", + "entity.twilightforest.blockchain_goblin": "Block and Chain Goblin", + "entity.twilightforest.boar": "Boar", + "entity.twilightforest.boat": "Boat", + "entity.twilightforest.carminite_broodling": "Carminite Broodling", + "entity.twilightforest.carminite_ghastguard": "Carminite Ghastguard", + "entity.twilightforest.carminite_ghastling": "Carminite Ghastling", + "entity.twilightforest.carminite_golem": "Carminite Golem", + "entity.twilightforest.chain_block": "Block and Chain", + "entity.twilightforest.charm_effect": "Charm Effect", + "entity.twilightforest.chest_boat": "Boat with Chest", + "entity.twilightforest.cube_of_annihilation": "Cube of Annihilation", + "entity.twilightforest.death_tome": "Death Tome", + "entity.twilightforest.deer": "Deer", + "entity.twilightforest.dwarf_rabbit": "Dwarf Rabbit", + "entity.twilightforest.falling_ice": "Falling Ice", + "entity.twilightforest.fire_beetle": "Fire Beetle", + "entity.twilightforest.giant_miner": "Giant Miner", + "entity.twilightforest.harbinger_cube": "Harbinger Cube", + "entity.twilightforest.hedge_spider": "Hedge Spider", + "entity.twilightforest.helmet_crab": "Helmet Crab", + "entity.twilightforest.hostile_wolf": "Hostile Wolf", + "entity.twilightforest.hydra": "Hydra", + "entity.twilightforest.hydra_mortar": "Hydra Mortar", + "entity.twilightforest.ice_arrow": "Ice Arrow", + "entity.twilightforest.ice_crystal": "Ice Crystal", + "entity.twilightforest.ice_snowball": "Ice Snowball", + "entity.twilightforest.king_spider": "King Spider", + "entity.twilightforest.knight_phantom": "Knight Phantom", + "entity.twilightforest.kobold": "Kobold", + "entity.twilightforest.lich": "Lich", + "entity.twilightforest.lich_bolt": "Lich Bolt", + "entity.twilightforest.lich_bomb": "Explosive Lich Bolt", + "entity.twilightforest.lich_minion": "Lich Minion", + "entity.twilightforest.lower_goblin_knight": "Lower Goblin Knight", + "entity.twilightforest.loyal_zombie": "Loyal Zombie", + "entity.twilightforest.maze_slime": "Maze Slime", + "entity.twilightforest.minoshroom": "Minoshroom", + "entity.twilightforest.minotaur": "Minotaur", + "entity.twilightforest.mist_wolf": "Mist Wolf", + "entity.twilightforest.moonworm_shot": "Moonworm", + "entity.twilightforest.mosquito_swarm": "Mosquito Swarm", + "entity.twilightforest.naga": "Naga", + "entity.twilightforest.nature_bolt": "Nature Bolt", + "entity.twilightforest.penguin": "Penguin", + "entity.twilightforest.pinch_beetle": "Pinch Beetle", + "entity.twilightforest.protection_box": "Progression Protection Box", + "entity.twilightforest.quest_ram": "Quest Ram", + "entity.twilightforest.raven": "Raven", + "entity.twilightforest.redcap": "Redcap", + "entity.twilightforest.redcap_sapper": "Redcap Sapper", + "entity.twilightforest.rising_zombie": "Zombie", + "entity.twilightforest.roving_cube": "Roving Cube", + "entity.twilightforest.seeker_arrow": "Seeker Arrow", + "entity.twilightforest.skeleton_druid": "Skeleton Druid", + "entity.twilightforest.slider": "Moving Slide Trap", + "entity.twilightforest.slime_beetle": "Slime Beetle", + "entity.twilightforest.slime_blob": "Slime Blob", + "entity.twilightforest.snow_guardian": "Snow Guardian", + "entity.twilightforest.snow_queen": "Snow Queen", + "entity.twilightforest.squirrel": "Squirrel", + "entity.twilightforest.stable_ice_core": "Stable Ice Core", + "entity.twilightforest.swarm_spider": "Swarm Spider", + "entity.twilightforest.thrown_block": "Thrown Block", + "entity.twilightforest.thrown_wep": "Thrown Weapon", + "entity.twilightforest.tiny_bird": "Tiny Bird", + "entity.twilightforest.tome_bolt": "Death Tome Bolt", + "entity.twilightforest.towerwood_borer": "Towerwood Borer", + "entity.twilightforest.troll": "Troll", + "entity.twilightforest.unstable_ice_core": "Unstable Ice Core", + "entity.twilightforest.upper_goblin_knight": "Upper Goblin Knight", + "entity.twilightforest.ur_ghast": "Ur-Ghast", + "entity.twilightforest.wand_bolt": "Twilight Scepter Bolt", + "entity.twilightforest.winter_wolf": "Winter Wolf", + "entity.twilightforest.wraith": "Wraith", + "entity.twilightforest.yeti": "Yeti", + "gamerule.tfEnforcedProgression": "Twilight Forest: Enforced Progression", + "gamerule.tfEnforcedProgression.description": "Some Twilight Forest biomes will be locked until you defeat certain bosses in the dimension. (You can check the progression order in your advancements)", + "gui.twilightforest.crumble_horn_jei": "Crumble Horn", + "gui.twilightforest.optifine.message": "Before proceeding, please note that Optifine is known to cause crashes, multipart entity visual bugs and many other issues.\n\nBefore reporting a bug, please remove Optifine first and check again to see if the bug is still present.\n\nOptifine-related issues are not solvable on Twilight Forest's end!\n\nThis screen may be disabled in the Client Config.", + "gui.twilightforest.optifine.suggestions": "Here's a selection of mods that we recommend using instead.", + "gui.twilightforest.optifine.title": "WARNING: OPTIFINE DETECTED", + "gui.twilightforest.transformation_jei": "Transformation Powder", + "gui.twilightforest.uncrafting_jei": "Uncrafting", + "item.twilightforest.adherent_spawn_egg": "Adherent Spawn Egg", + "item.twilightforest.alpha_yeti_banner_pattern": "Banner Pattern", + "item.twilightforest.alpha_yeti_banner_pattern.desc": "Alpha Yeti Face", + "item.twilightforest.alpha_yeti_fur": "Alpha Yeti Fur", + "item.twilightforest.alpha_yeti_spawn_egg": "Alpha Yeti Spawn Egg", + "item.twilightforest.arctic_armor.desc": "Dyeable", + "item.twilightforest.arctic_boots": "Arctic Boots", + "item.twilightforest.arctic_chestplate": "Arctic Jacket", + "item.twilightforest.arctic_fur": "Arctic Fur", + "item.twilightforest.arctic_helmet": "Arctic Hood", + "item.twilightforest.arctic_leggings": "Arctic Leggings", + "item.twilightforest.armor_shard": "Armor Shard", + "item.twilightforest.armor_shard_cluster": "Armor Shard Cluster", + "item.twilightforest.armored_giant_spawn_egg": "Armored Giant Spawn Egg", + "item.twilightforest.bighorn_sheep_spawn_egg": "Bighorn Sheep Spawn Egg", + "item.twilightforest.block_and_chain": "Block and Chain", + "item.twilightforest.blockchain_goblin_spawn_egg": "Block and Chain Goblin Spawn Egg", + "item.twilightforest.boar_spawn_egg": "Boar Spawn Egg", + "item.twilightforest.borer_essence": "Borer Essence", + "item.twilightforest.brittle_potion_flask": "Brittle Potion Flask", + "item.twilightforest.canopy_boat": "Canopy Boat", + "item.twilightforest.canopy_chest_boat": "Canopy Chest Boat", + "item.twilightforest.carminite": "Carminite", + "item.twilightforest.carminite_broodling_spawn_egg": "Carminite Broodling Spawn Egg", + "item.twilightforest.carminite_ghastguard_spawn_egg": "Carminite Ghastguard Spawn Egg", + "item.twilightforest.carminite_ghastling_spawn_egg": "Carminite Ghastling Spawn Egg", + "item.twilightforest.carminite_golem_spawn_egg": "Carminite Golem Spawn Egg", + "item.twilightforest.charm_of_keeping_1": "Charm of Keeping I", + "item.twilightforest.charm_of_keeping_2": "Charm of Keeping II", + "item.twilightforest.charm_of_keeping_3": "Charm of Keeping III", + "item.twilightforest.charm_of_life_1": "Charm of Life I", + "item.twilightforest.charm_of_life_2": "Charm of Life II", + "item.twilightforest.cooked_meef": "Meef Steak", + "item.twilightforest.cooked_venison": "Venison Steak", + "item.twilightforest.crumble_horn": "Crumble Horn", + "item.twilightforest.cube_of_annihilation": "Cube of Annihilation", + "item.twilightforest.cube_talisman": "Talisman of the Cube", + "item.twilightforest.dark_boat": "Darkwood Boat", + "item.twilightforest.dark_chest_boat": "Darkwood Chest Boat", + "item.twilightforest.death_tome_spawn_egg": "Death Tome Spawn Egg", + "item.twilightforest.deer_spawn_egg": "Deer Spawn Egg", + "item.twilightforest.diamond_minotaur_axe": "Diamond Minotaur Axe", + "item.twilightforest.dwarf_rabbit_spawn_egg": "Dwarf Rabbit Spawn Egg", + "item.twilightforest.ender_bow": "Ender Bow", + "item.twilightforest.fiery_armor.desc": "Burns attackers", + "item.twilightforest.fiery_blood": "Fiery Blood", + "item.twilightforest.fiery_boots": "Fiery Boots", + "item.twilightforest.fiery_chestplate": "Fiery Chestplate", + "item.twilightforest.fiery_helmet": "Fiery Helmet", + "item.twilightforest.fiery_ingot": "Fiery Ingot", + "item.twilightforest.fiery_leggings": "Fiery Leggings", + "item.twilightforest.fiery_pickaxe": "Fiery Pickaxe", + "item.twilightforest.fiery_pickaxe.desc": "Auto-smelting", + "item.twilightforest.fiery_sword": "Fiery Sword", + "item.twilightforest.fiery_sword.desc": "Burns targets", + "item.twilightforest.fiery_tears": "Fiery Tears", + "item.twilightforest.filled_magic_map": "Magic Map", + "item.twilightforest.filled_maze_map": "Maze Map", + "item.twilightforest.filled_ore_map": "Maze/Ore Map", + "item.twilightforest.fire_beetle_spawn_egg": "Fire Beetle Spawn Egg", + "item.twilightforest.flask.doses": "Doses: %s/%s", + "item.twilightforest.flask.no_refill": "Cannot be refilled", + "item.twilightforest.fortification_scepter": "Scepter of Fortification", + "item.twilightforest.giant_miner_spawn_egg": "Giant Miner Spawn Egg", + "item.twilightforest.giant_pickaxe": "Giant's Pickaxe", + "item.twilightforest.giant_pickaxe.desc": "Breaks giant blocks", + "item.twilightforest.giant_sword": "Giant's Sword", + "item.twilightforest.glass_sword": "Glass Sword", + "item.twilightforest.glass_sword.desc": "Creative Mode only", + "item.twilightforest.gold_minotaur_axe": "Golden Minotaur Axe", + "item.twilightforest.greater_potion_flask": "Greater Potion Flask", + "item.twilightforest.harbinger_cube_spawn_egg": "Harbinger Cube Spawn Egg", + "item.twilightforest.hedge_spider_spawn_egg": "Hedge Spider Spawn Egg", + "item.twilightforest.helmet_crab_spawn_egg": "Helmet Crab Spawn Egg", + "item.twilightforest.hostile_wolf_spawn_egg": "Hostile Wolf Spawn Egg", + "item.twilightforest.hydra_banner_pattern": "Banner Pattern", + "item.twilightforest.hydra_banner_pattern.desc": "Hydra Flame", + "item.twilightforest.hydra_chop": "Hydra Chop", + "item.twilightforest.hydra_spawn_egg": "Hydra Spawn Egg", + "item.twilightforest.ice_bomb": "Ice Bomb", + "item.twilightforest.ice_bow": "Ice Bow", + "item.twilightforest.ice_crystal_spawn_egg": "Ice Crystal Spawn Egg", + "item.twilightforest.ice_sword": "Ice Sword", + "item.twilightforest.ironwood_axe": "Ironwood Axe", + "item.twilightforest.ironwood_boots": "Ironwood Boots", + "item.twilightforest.ironwood_chestplate": "Ironwood Chestplate", + "item.twilightforest.ironwood_helmet": "Ironwood Helmet", + "item.twilightforest.ironwood_hoe": "Ironwood Hoe", + "item.twilightforest.ironwood_ingot": "Ironwood Ingot", + "item.twilightforest.ironwood_leggings": "Ironwood Leggings", + "item.twilightforest.ironwood_pickaxe": "Ironwood Pickaxe", + "item.twilightforest.ironwood_shovel": "Ironwood Shovel", + "item.twilightforest.ironwood_sword": "Ironwood Sword", + "item.twilightforest.king_spider_spawn_egg": "King Spider Spawn Egg", + "item.twilightforest.knight_phantom_banner_pattern": "Banner Pattern", + "item.twilightforest.knight_phantom_banner_pattern.desc": "Knight Helmet", + "item.twilightforest.knight_phantom_spawn_egg": "Knight Phantom Spawn Egg", + "item.twilightforest.knightmetal_axe": "Knightmetal Axe", + "item.twilightforest.knightmetal_axe.desc": "Extra damage to unarmored targets", + "item.twilightforest.knightmetal_boots": "Knightmetal Boots", + "item.twilightforest.knightmetal_chestplate": "Knightmetal Chestplate", + "item.twilightforest.knightmetal_helmet": "Knightmetal Helmet", + "item.twilightforest.knightmetal_ingot": "Knightmetal Ingot", + "item.twilightforest.knightmetal_leggings": "Knightmetal Greaves", + "item.twilightforest.knightmetal_pickaxe": "Knightmetal Pickaxe", + "item.twilightforest.knightmetal_pickaxe.desc": "Extra damage to armored targets", + "item.twilightforest.knightmetal_ring": "Knightmetal Loop", + "item.twilightforest.knightmetal_shield": "Knightmetal Shield", + "item.twilightforest.knightmetal_sword": "Knightmetal Sword", + "item.twilightforest.knightmetal_sword.desc": "Extra damage to armored targets", + "item.twilightforest.kobold_spawn_egg": "Kobold Spawn Egg", + "item.twilightforest.lamp_of_cinders": "Lamp of Cinders", + "item.twilightforest.lich_banner_pattern": "Banner Pattern", + "item.twilightforest.lich_banner_pattern.desc": "Lich Crown", + "item.twilightforest.lich_spawn_egg": "Lich Spawn Egg", + "item.twilightforest.lifedrain_scepter": "Scepter of Life Draining", + "item.twilightforest.liveroot": "Liveroot", + "item.twilightforest.lower_goblin_knight_spawn_egg": "Goblin Knight Spawn Egg", + "item.twilightforest.magic_beans": "Magic Beans", + "item.twilightforest.magic_map": "Blank Magic Map", + "item.twilightforest.magic_map_focus": "Magic Map Focus", + "item.twilightforest.mangrove_boat": "Mangrove Boat", + "item.twilightforest.mangrove_chest_boat": "Mangrove Chest Boat", + "item.twilightforest.maze_map": "Blank Maze Map", + "item.twilightforest.maze_map_focus": "Maze Map Focus", + "item.twilightforest.maze_slime_spawn_egg": "Maze Slime Spawn Egg", + "item.twilightforest.maze_wafer": "Maze Wafer", + "item.twilightforest.mazebreaker_pickaxe": "Mazebreaker", + "item.twilightforest.meef_stroganoff": "Meef Stroganoff", + "item.twilightforest.mining_boat": "Minewood Boat", + "item.twilightforest.mining_chest_boat": "Minewood Chest Boat", + "item.twilightforest.minoshroom_banner_pattern": "Banner Pattern", + "item.twilightforest.minoshroom_banner_pattern.desc": "Minoshroom Axes", + "item.twilightforest.minoshroom_spawn_egg": "Minoshroom Spawn Egg", + "item.twilightforest.minotaur_axe.desc": "Extra damage while charging", + "item.twilightforest.minotaur_spawn_egg": "Minotaur Spawn Egg", + "item.twilightforest.mist_wolf_spawn_egg": "Mist Wolf Spawn Egg", + "item.twilightforest.moon_dial": "Moon Dial", + "item.twilightforest.moon_dial.phase_0": "Full Moon", + "item.twilightforest.moon_dial.phase_1": "Waning Gibbous", + "item.twilightforest.moon_dial.phase_2": "Third Quarter", + "item.twilightforest.moon_dial.phase_3": "Waning Crescent", + "item.twilightforest.moon_dial.phase_4": "New Moon", + "item.twilightforest.moon_dial.phase_5": "Waxing Crescent", + "item.twilightforest.moon_dial.phase_6": "First Quarter", + "item.twilightforest.moon_dial.phase_7": "Waxing Gibbous", + "item.twilightforest.moon_dial.phase_unknown": "Moon phase indeterminate", + "item.twilightforest.moon_dial.phase_unknown_fools": "404 moon not found", + "item.twilightforest.moonworm_queen": "Moonworm Queen", + "item.twilightforest.mosquito_swarm_spawn_egg": "Mosquito Swarm Spawn Egg", + "item.twilightforest.music_disc_findings": "Music Disc", + "item.twilightforest.music_disc_findings.desc": "MrCompost - Findings", + "item.twilightforest.music_disc_home": "Music Disc", + "item.twilightforest.music_disc_home.desc": "MrCompost - Home", + "item.twilightforest.music_disc_maker": "Music Disc", + "item.twilightforest.music_disc_maker.desc": "MrCompost - Maker", + "item.twilightforest.music_disc_motion": "Music Disc", + "item.twilightforest.music_disc_motion.desc": "MrCompost - Motion", + "item.twilightforest.music_disc_radiance": "Music Disc", + "item.twilightforest.music_disc_radiance.desc": "Rotch Gwylt - Radiance", + "item.twilightforest.music_disc_steps": "Music Disc", + "item.twilightforest.music_disc_steps.desc": "Rotch Gwylt - Steps", + "item.twilightforest.music_disc_superstitious": "Music Disc", + "item.twilightforest.music_disc_superstitious.desc": "Rotch Gwylt - Superstitious", + "item.twilightforest.music_disc_thread": "Music Disc", + "item.twilightforest.music_disc_thread.desc": "MrCompost - Thread", + "item.twilightforest.music_disc_wayfarer": "Music Disc", + "item.twilightforest.music_disc_wayfarer.desc": "MrCompost - Wayfarer", + "item.twilightforest.naga_banner_pattern": "Banner Pattern", + "item.twilightforest.naga_banner_pattern.desc": "Naga Scales", + "item.twilightforest.naga_chestplate": "Naga Scale Tunic", + "item.twilightforest.naga_leggings": "Naga Scale Leggings", + "item.twilightforest.naga_scale": "Naga Scale", + "item.twilightforest.naga_spawn_egg": "Naga Spawn Egg", + "item.twilightforest.ore_magnet": "Ore Magnet", + "item.twilightforest.ore_map": "Blank Maze/Ore Map", + "item.twilightforest.ore_meter": "Ore Meter", + "item.twilightforest.peacock_feather_fan": "Peacock Feather Fan", + "item.twilightforest.penguin_spawn_egg": "Penguin Spawn Egg", + "item.twilightforest.phantom_armor.desc": "Is never lost on death", + "item.twilightforest.phantom_chestplate": "Phantom Chestplate", + "item.twilightforest.phantom_helmet": "Phantom Helmet", + "item.twilightforest.pinch_beetle_spawn_egg": "Pinch Beetle Spawn Egg", + "item.twilightforest.quest_ram_banner_pattern": "Banner Pattern", + "item.twilightforest.quest_ram_banner_pattern.desc": "Quest Ram Swirls", + "item.twilightforest.quest_ram_spawn_egg": "Quest Ram Spawn Egg", + "item.twilightforest.raven_feather": "Raven Feather", + "item.twilightforest.raven_spawn_egg": "Raven Spawn Egg", + "item.twilightforest.raw_ironwood": "Raw Ironwood", + "item.twilightforest.raw_meef": "Raw Meef", + "item.twilightforest.raw_venison": "Raw Venison", + "item.twilightforest.redcap_sapper_spawn_egg": "Redcap Sapper Spawn Egg", + "item.twilightforest.redcap_spawn_egg": "Redcap Spawn Egg", + "item.twilightforest.scepter.desc": "%s charges left", + "item.twilightforest.seeker_bow": "Seeker Bow", + "item.twilightforest.skeleton_druid_spawn_egg": "Skeleton Druid Spawn Egg", + "item.twilightforest.skull_candle.desc": "Has: %s %s Candle", + "item.twilightforest.skull_candle.desc.multiple": "Has: %s %s Candles", + "item.twilightforest.slime_beetle_spawn_egg": "Slime Beetle Spawn Egg", + "item.twilightforest.snow_guardian_spawn_egg": "Snow Guardian Spawn Egg", + "item.twilightforest.snow_queen_banner_pattern": "Banner Pattern", + "item.twilightforest.snow_queen_banner_pattern.desc": "Snow Queen Crown", + "item.twilightforest.snow_queen_spawn_egg": "Snow Queen Spawn Egg", + "item.twilightforest.sorting_boat": "Sortingwood Boat", + "item.twilightforest.sorting_chest_boat": "Sortingwood Chest Boat", + "item.twilightforest.squirrel_spawn_egg": "Squirrel Spawn Egg", + "item.twilightforest.stable_ice_core_spawn_egg": "Stable Ice Core Spawn Egg", + "item.twilightforest.steeleaf_axe": "Steeleaf Axe", + "item.twilightforest.steeleaf_boots": "Steeleaf Boots", + "item.twilightforest.steeleaf_chestplate": "Steeleaf Chestplate", + "item.twilightforest.steeleaf_helmet": "Steeleaf Helmet", + "item.twilightforest.steeleaf_hoe": "Steeleaf Hoe", + "item.twilightforest.steeleaf_ingot": "Steeleaf", + "item.twilightforest.steeleaf_leggings": "Steeleaf Leggings", + "item.twilightforest.steeleaf_pickaxe": "Steeleaf Pickaxe", + "item.twilightforest.steeleaf_shovel": "Steeleaf Shovel", + "item.twilightforest.steeleaf_sword": "Steeleaf Sword", + "item.twilightforest.swarm_spider_spawn_egg": "Swarm Spider Spawn Egg", + "item.twilightforest.time_boat": "Timewood Boat", + "item.twilightforest.time_chest_boat": "Timewood Chest Boat", + "item.twilightforest.tiny_bird_spawn_egg": "Tiny Bird Spawn Egg", + "item.twilightforest.torchberries": "Torchberries", + "item.twilightforest.tower_key": "Tower Key", + "item.twilightforest.towerwood_borer_spawn_egg": "Towerwood Borer Spawn Egg", + "item.twilightforest.transformation_boat": "Transwood Boat", + "item.twilightforest.transformation_chest_boat": "Transwood Chest Boat", + "item.twilightforest.transformation_powder": "Transformation Powder", + "item.twilightforest.triple_bow": "Tri-Bow", + "item.twilightforest.troll_spawn_egg": "Troll Spawn Egg", + "item.twilightforest.twilight_oak_boat": "Twilight Oak Boat", + "item.twilightforest.twilight_oak_chest_boat": "Twilight Oak Chest Boat", + "item.twilightforest.twilight_scepter": "Scepter of Twilight", + "item.twilightforest.unstable_ice_core_spawn_egg": "Unstable Ice Core Spawn Egg", + "item.twilightforest.ur_ghast_banner_pattern": "Banner Pattern", + "item.twilightforest.ur_ghast_banner_pattern.desc": "Carminite Border", + "item.twilightforest.ur_ghast_spawn_egg": "Ur-Ghast Spawn Egg", + "item.twilightforest.winter_wolf_spawn_egg": "Winter Wolf Spawn Egg", + "item.twilightforest.wraith_spawn_egg": "Wraith Spawn Egg", + "item.twilightforest.yeti_armor.desc": "Chills attackers", + "item.twilightforest.yeti_boots": "Yeti Boots", + "item.twilightforest.yeti_chestplate": "Yeti Jacket", + "item.twilightforest.yeti_helmet": "Yeti Horned Helm", + "item.twilightforest.yeti_leggings": "Yeti Leggings", + "item.twilightforest.yeti_spawn_egg": "Yeti Spawn Egg", + "item.twilightforest.zombie_scepter": "Zombie Scepter", + "itemGroup.twilightforest.blocks": "Twilight Forest: Blocks", + "itemGroup.twilightforest.equipment": "Twilight Forest: Equipment", + "itemGroup.twilightforest.items": "Twilight Forest: Items", + "misc.twilightforest.advancement_hidden": "", + "misc.twilightforest.advancement_required": "Advancement Required:", + "misc.twilightforest.biome_locked": "Biome Locked!", + "misc.twilightforest.biome_locked_2": "Check your advancements", + "misc.twilightforest.core_disabled": "%s is disabled via config", + "misc.twilightforest.firefly_spawner_radius": "Firefly Particle Radius: %s Blocks", + "misc.twilightforest.magic_map_fail": "The Magic faltered. Perhaps it doesn't work here?", + "misc.twilightforest.nyi": "This feature has effects that are not yet implemented.", + "misc.twilightforest.ore_meter_exposed": "Exposed: %s", + "misc.twilightforest.ore_meter_range": "Radius: %s, Origin: [%s, %s]", + "misc.twilightforest.pedestal_ineligible": "You are unworthy.", + "misc.twilightforest.portal_unsafe": "It doesn't seem safe here...", + "misc.twilightforest.portal_unworthy": "The Portal pool is unresponsive. Perhaps something was neglected?", + "misc.twilightforest.wip0": "This feature is a work in progress and may have bugs or unintended effects that may damage your world.", + "misc.twilightforest.wip1": "Use with caution.", + "stat.twilightforest.blocks_crumbled": "Blocks Crumbled", + "stat.twilightforest.bugs_squished": "Bugs Squashed", + "stat.twilightforest.e115_slices_eaten": "Experiment 115 Slices Eaten", + "stat.twilightforest.keeping_charms_activated": "Charms of Keeping Used", + "stat.twilightforest.life_charms_activated": "Charms of Life Used", + "stat.twilightforest.skull_candles_made": "Skull Candles Created", + "stat.twilightforest.tf_shields_broken": "Fortification Shields Broken", + "stat.twilightforest.torchberries_harvested": "Torchberries Harvested", + "stat.twilightforest.trophy_pedestals_activated": "Trophy Pedestals Activated", + "stat.twilightforest.uncrafting_table_interactions": "Interactions with Uncrafting Table", + "structure.twilightforest.aurora_palace": "Aurora Palace", + "structure.twilightforest.dark_tower": "Dark Tower", + "structure.twilightforest.final_castle": "Final Plateau Castle", + "structure.twilightforest.hedge_maze": "Hedge Maze", + "structure.twilightforest.hydra_lair": "Hydra's Lair", + "structure.twilightforest.knight_stronghold": "Knight Stronghold", + "structure.twilightforest.labyrinth": "Minotaur Labyrinth", + "structure.twilightforest.large_hollow_hill": "Large Hollow Hill", + "structure.twilightforest.lich_tower": "Lich Tower", + "structure.twilightforest.medium_hollow_hill": "Medium Hollow Hill", + "structure.twilightforest.mushroom_tower": "Mushroom Castle", + "structure.twilightforest.naga_courtyard": "Naga Courtyard", + "structure.twilightforest.quest_grove": "Quest Grove", + "structure.twilightforest.small_hollow_hill": "Small Hollow Hill", + "structure.twilightforest.troll_cave": "Troll Cave", + "structure.twilightforest.yeti_cave": "Yeti Cave", + "subtitles.twilightforest.block.beanstalk.grow": "Ground rumbles", + "subtitles.twilightforest.block.boss_chest.appear": "Boss Chest appears", + "subtitles.twilightforest.block.bug.squish": "Bug gets squished :(", + "subtitles.twilightforest.block.builder.create": "Carminite Builder creates block", + "subtitles.twilightforest.block.builder.off": "Carminite Builder deactivates", + "subtitles.twilightforest.block.builder.on": "Carminite Builder activates", + "subtitles.twilightforest.block.builder.replace": "Built Block expires", + "subtitles.twilightforest.block.casket.close": "Keepsake Casket closes", + "subtitles.twilightforest.block.casket.locked": "Keepsake Casket clicks", + "subtitles.twilightforest.block.casket.open": "Keepsake Casket opens", + "subtitles.twilightforest.block.casket.repair": "Keepsake Casket repaired", + "subtitles.twilightforest.block.cicada": "Cicada screams", + "subtitles.twilightforest.block.core.time": "Tree of Time ticks", + "subtitles.twilightforest.block.core.transformation": "Tree of Transformation hums", + "subtitles.twilightforest.block.door.activate": "Castle Door clicks", + "subtitles.twilightforest.block.door.reappear": "Castle Door reappears", + "subtitles.twilightforest.block.door.vanish": "Castle Door vanishes", + "subtitles.twilightforest.block.generic.annihilation": "Block dissolves", + "subtitles.twilightforest.block.ghast_trap.ambient": "Ghast Trap dings", + "subtitles.twilightforest.block.ghast_trap.on": "Ghast Trap buzzes", + "subtitles.twilightforest.block.ghast_trap.spindown": "Ghast Trap shuts off", + "subtitles.twilightforest.block.ghast_trap.warmup": "Ghast Trap warms up", + "subtitles.twilightforest.block.jet.active": "Fire Jet flares", + "subtitles.twilightforest.block.jet.pop": "Fire Jet pops", + "subtitles.twilightforest.block.jet.start": "Fire Jet activates", + "subtitles.twilightforest.block.portal.whoosh": "Twilight Forest Portal beckons", + "subtitles.twilightforest.block.reactor.ambient": "Carminite Reactor whooshes", + "subtitles.twilightforest.block.reappearing_block.reappear": "Reappearing Block reappears", + "subtitles.twilightforest.block.reappearing_block.vanish": "Reappearing Block disappears", + "subtitles.twilightforest.block.slider.move": "Sliding Trap creaks", + "subtitles.twilightforest.block.smoker.start": "Smoker activates", + "subtitles.twilightforest.block.torchberry.harvest": "Torchberries pop", + "subtitles.twilightforest.block.trophy_pedestal.activate": "Trophy Pedestal accepts trophy", + "subtitles.twilightforest.block.vanish.locked": "Towerwood door clicks", + "subtitles.twilightforest.block.vanish.unlock": "Towerwood door unlocks", + "subtitles.twilightforest.block.vanish.vanish": "Vanishing Block vanishes", + "subtitles.twilightforest.entity.alpha_yeti.alert": "Alpha Yeti takes notice", + "subtitles.twilightforest.entity.alpha_yeti.death": "Alpha Yeti dies", + "subtitles.twilightforest.entity.alpha_yeti.grab": "Alpha Yeti grabs", + "subtitles.twilightforest.entity.alpha_yeti.growl": "Alpha Yeti growls", + "subtitles.twilightforest.entity.alpha_yeti.hurt": "Alpha Yeti hurts", + "subtitles.twilightforest.entity.alpha_yeti.ice": "Alpha Yeti throws ice", + "subtitles.twilightforest.entity.alpha_yeti.pant": "Alpha Yeti pants", + "subtitles.twilightforest.entity.alpha_yeti.roar": "Alpha Yeti roars", + "subtitles.twilightforest.entity.alpha_yeti.throw": "Alpha Yeti throws", + "subtitles.twilightforest.entity.bighorn_sheep.ambient": "Bighorn Sheep bleats", + "subtitles.twilightforest.entity.bighorn_sheep.death": "Bighorn Sheep dies", + "subtitles.twilightforest.entity.bighorn_sheep.hurt": "Bighorn Sheep hurts", + "subtitles.twilightforest.entity.blockchain_goblin.ambient": "Block and Chain Goblin chuckles", + "subtitles.twilightforest.entity.blockchain_goblin.death": "Block and Chain Goblin dies", + "subtitles.twilightforest.entity.blockchain_goblin.hurt": "Block and Chain Goblin screams", + "subtitles.twilightforest.entity.boar.ambient": "Boar oinks", + "subtitles.twilightforest.entity.boar.death": "Boar dies", + "subtitles.twilightforest.entity.boar.hurt": "Boar hurts", + "subtitles.twilightforest.entity.carminite_broodling.ambient": "Carminite Broodling hisses", + "subtitles.twilightforest.entity.carminite_broodling.death": "Carminite Broodling dies", + "subtitles.twilightforest.entity.carminite_broodling.hurt": "Carminite Broodling hurts", + "subtitles.twilightforest.entity.carminite_ghastguard.ambient": "Carminite Ghastguard cries", + "subtitles.twilightforest.entity.carminite_ghastguard.death": "Carminite Ghastguard dies", + "subtitles.twilightforest.entity.carminite_ghastguard.hurt": "Carminite Ghastguard screams", + "subtitles.twilightforest.entity.carminite_ghastguard.shoot": "Carminite Ghastguard shoots", + "subtitles.twilightforest.entity.carminite_ghastling.ambient": "Carminite Ghastling cries", + "subtitles.twilightforest.entity.carminite_ghastling.death": "Carminite Ghastling dies", + "subtitles.twilightforest.entity.carminite_ghastling.hurt": "Carminite Ghastling screams", + "subtitles.twilightforest.entity.carminite_ghastling.shoot": "Carminite Ghastling shoots", + "subtitles.twilightforest.entity.carminite_golem.attack": "Carminite Golem swings", + "subtitles.twilightforest.entity.carminite_golem.death": "Carminite Golem dies", + "subtitles.twilightforest.entity.carminite_golem.hurt": "Carminite Golem hurts", + "subtitles.twilightforest.entity.death_tome.ambient": "Death Tome flips pages", + "subtitles.twilightforest.entity.death_tome.death": "Death Tome falls apart", + "subtitles.twilightforest.entity.death_tome.hurt": "Death Tome creases", + "subtitles.twilightforest.entity.deer.ambient": "Deer moos", + "subtitles.twilightforest.entity.deer.death": "Deer dies", + "subtitles.twilightforest.entity.deer.hurt": "Deer hurts", + "subtitles.twilightforest.entity.dwarf_rabbit.ambient": "Dwarf Rabbit squeaks", + "subtitles.twilightforest.entity.dwarf_rabbit.death": "Dwarf Rabbit dies", + "subtitles.twilightforest.entity.dwarf_rabbit.hurt": "Dwarf Rabbit hurts", + "subtitles.twilightforest.entity.fire_beetle.death": "Fire Beetle dies", + "subtitles.twilightforest.entity.fire_beetle.hurt": "Fire Beetle hurts", + "subtitles.twilightforest.entity.fire_beetle.shoot": "Fire Beetle spews flames", + "subtitles.twilightforest.entity.goblin_knight.ambient": "Goblin Knight chuckles", + "subtitles.twilightforest.entity.goblin_knight.death": "Goblin Knight groans in agony", + "subtitles.twilightforest.entity.goblin_knight.hurt": "Goblin Knight screeches in pain", + "subtitles.twilightforest.entity.goblin_knight.muffled.ambient": "Muffled Goblin Knight chuckles", + "subtitles.twilightforest.entity.goblin_knight.muffled.death": "Muffled Goblin Knight groans in agony", + "subtitles.twilightforest.entity.goblin_knight.muffled.hurt": "Muffled Goblin Knight screeches in pain", + "subtitles.twilightforest.entity.hedge_spider.ambient": "Hedge Spider hisses", + "subtitles.twilightforest.entity.hedge_spider.death": "Hedge Spider dies", + "subtitles.twilightforest.entity.hedge_spider.hurt": "Hedge Spider hurts", + "subtitles.twilightforest.entity.helmet_crab.death": "Helmet Crab dies", + "subtitles.twilightforest.entity.helmet_crab.hurt": "Helmet Crab hurts", + "subtitles.twilightforest.entity.hostile_wolf.ambient": "Hostile Wolf growls", + "subtitles.twilightforest.entity.hostile_wolf.death": "Hostile Wolf dies", + "subtitles.twilightforest.entity.hostile_wolf.hurt": "Hostile Wolf hurts", + "subtitles.twilightforest.entity.hostile_wolf.target": "Hostile Wolf takes notice", + "subtitles.twilightforest.entity.hydra.death": "Hydra roars in defeat", + "subtitles.twilightforest.entity.hydra.growl": "Hydra growls", + "subtitles.twilightforest.entity.hydra.hurt": "Hydra hurts", + "subtitles.twilightforest.entity.hydra.roar": "Hydra roars", + "subtitles.twilightforest.entity.hydra.shoot": "Hydra shoots mortar", + "subtitles.twilightforest.entity.hydra.shoot_fire": "Hydra shoots fire", + "subtitles.twilightforest.entity.hydra.warn": "Hydra prepares to bite", + "subtitles.twilightforest.entity.ice.ambient": "Ice Core crackles", + "subtitles.twilightforest.entity.ice.death": "Ice Core dies", + "subtitles.twilightforest.entity.ice.hurt": "Ice Core hurts", + "subtitles.twilightforest.entity.ice.shoot": "Ice Core shoots snowball", + "subtitles.twilightforest.entity.king_spider.ambient": "King Spider hisses", + "subtitles.twilightforest.entity.king_spider.death": "King Spider dies", + "subtitles.twilightforest.entity.king_spider.hurt": "King Spider hurts", + "subtitles.twilightforest.entity.knight_phantom.ambient": "Knight Phantom gasps", + "subtitles.twilightforest.entity.knight_phantom.axe": "Knight Phantom throws pickaxe", + "subtitles.twilightforest.entity.knight_phantom.death": "Knight Phantom dies", + "subtitles.twilightforest.entity.knight_phantom.hurt": "Knight Phantom hurts", + "subtitles.twilightforest.entity.knight_phantom.pickaxe": "Knight Phantom throws axe", + "subtitles.twilightforest.entity.kobold.ambient": "Kobold grumbles", + "subtitles.twilightforest.entity.kobold.death": "Kobold dies", + "subtitles.twilightforest.entity.kobold.hurt": "Kobold hurts", + "subtitles.twilightforest.entity.kobold.munch": "Kobold munches on food", + "subtitles.twilightforest.entity.lich.ambient": "Lich breathes", + "subtitles.twilightforest.entity.lich.death": "Lich dies", + "subtitles.twilightforest.entity.lich.hurt": "Lich hurts", + "subtitles.twilightforest.entity.lich.pop_mob": "Lich absorbs mob", + "subtitles.twilightforest.entity.lich.shoot": "Lich shoots", + "subtitles.twilightforest.entity.lich.teleport": "Lich teleports", + "subtitles.twilightforest.entity.lich_clone.hurt": "Lich shadow clone bypasses attack", + "subtitles.twilightforest.entity.loyal_zombie.ambient": "Loyal Zombie groans", + "subtitles.twilightforest.entity.loyal_zombie.death": "Loyal Zombie dies", + "subtitles.twilightforest.entity.loyal_zombie.hurt": "Loyal Zombie hurts", + "subtitles.twilightforest.entity.loyal_zombie.summon": "Loyal Zombie summoned", + "subtitles.twilightforest.entity.maze_slime.death": "Maze Slime dies", + "subtitles.twilightforest.entity.maze_slime.hurt": "Maze Slime hurts", + "subtitles.twilightforest.entity.maze_slime.squish": "Maze Slime squishes", + "subtitles.twilightforest.entity.minion.ambient": "Lich Minion groans", + "subtitles.twilightforest.entity.minion.death": "Lich Minion dies", + "subtitles.twilightforest.entity.minion.hurt": "Lich Minion hurts", + "subtitles.twilightforest.entity.minion.summon": "Lich summons new Minion", + "subtitles.twilightforest.entity.minoshroom.ambient": "Minoshroom moos", + "subtitles.twilightforest.entity.minoshroom.attack": "Minoshroom attacks", + "subtitles.twilightforest.entity.minoshroom.death": "Minoshroom dies", + "subtitles.twilightforest.entity.minoshroom.hurt": "Minoshroom hurts", + "subtitles.twilightforest.entity.minoshroom.slam": "Minoshroom slams ground", + "subtitles.twilightforest.entity.minotaur.ambient": "Minotaur moos", + "subtitles.twilightforest.entity.minotaur.attack": "Minotaur attacks", + "subtitles.twilightforest.entity.minotaur.death": "Minotaur dies", + "subtitles.twilightforest.entity.minotaur.hurt": "Minotaur hurts", + "subtitles.twilightforest.entity.mist_wolf.ambient": "Mist Wolf growls", + "subtitles.twilightforest.entity.mist_wolf.death": "Mist Wolf dies", + "subtitles.twilightforest.entity.mist_wolf.hurt": "Mist Wolf hurts", + "subtitles.twilightforest.entity.mist_wolf.target": "Mist Wolf takes notice", + "subtitles.twilightforest.entity.mosquito.ambient": "Mosquitoes buzz", + "subtitles.twilightforest.entity.naga.hiss": "Naga hisses", + "subtitles.twilightforest.entity.naga.hurt": "Naga hurts", + "subtitles.twilightforest.entity.naga.rattle": "Naga rattles", + "subtitles.twilightforest.entity.parrot.imitate.alpha_yeti": "Parrot coldly growls", + "subtitles.twilightforest.entity.parrot.imitate.carminite_golem": "Parrot thunks", + "subtitles.twilightforest.entity.parrot.imitate.death_tome": "Parrot makes book noises", + "subtitles.twilightforest.entity.parrot.imitate.hostile_wolf": "Parrot growls", + "subtitles.twilightforest.entity.parrot.imitate.hydra": "Parrot roars", + "subtitles.twilightforest.entity.parrot.imitate.ice_core": "Parrot crackles", + "subtitles.twilightforest.entity.parrot.imitate.kobold": "Parrot grumbles", + "subtitles.twilightforest.entity.parrot.imitate.minotaur": "Parrot moos angrily", + "subtitles.twilightforest.entity.parrot.imitate.mosquito": "Parrot buzzes", + "subtitles.twilightforest.entity.parrot.imitate.naga": "Parrot rattles", + "subtitles.twilightforest.entity.parrot.imitate.redcap": "Parrot chuckles", + "subtitles.twilightforest.entity.parrot.imitate.wraith": "Parrot gasps", + "subtitles.twilightforest.entity.pinch_beetle.death": "Pinch Beetle dies", + "subtitles.twilightforest.entity.pinch_beetle.hurt": "Pinch Beetle hurts", + "subtitles.twilightforest.entity.quest_ram.ambient": "Quest Ram bleats", + "subtitles.twilightforest.entity.quest_ram.death": "Quest Ram dies", + "subtitles.twilightforest.entity.quest_ram.hurt": "Quest Ram hurts", + "subtitles.twilightforest.entity.raven.caw": "Raven caws", + "subtitles.twilightforest.entity.raven.squawk": "Raven squawks in pain", + "subtitles.twilightforest.entity.redcap.ambient": "Redcap chuckles", + "subtitles.twilightforest.entity.redcap.death": "Redcap groans in agony", + "subtitles.twilightforest.entity.redcap.hurt": "Redcap screeches in pain", + "subtitles.twilightforest.entity.shield.add": "Fortification Shield spawns", + "subtitles.twilightforest.entity.shield.break": "Fortification Shield breaks", + "subtitles.twilightforest.entity.skeleton_druid.ambient": "Skeleton Druid rattles", + "subtitles.twilightforest.entity.skeleton_druid.death": "Skeleton Druid dies", + "subtitles.twilightforest.entity.skeleton_druid.hurt": "Skeleton Druid hurts", + "subtitles.twilightforest.entity.skeleton_druid.shoot": "Skeleton Druid shoots", + "subtitles.twilightforest.entity.slime_beetle.death": "Slime Beetle dies", + "subtitles.twilightforest.entity.slime_beetle.hurt": "Slime Beetle hurts", + "subtitles.twilightforest.entity.slime_beetle.squish": "Slime Beetle shoots", + "subtitles.twilightforest.entity.snow_guardian.ambient": "Snow Guardian crackles", + "subtitles.twilightforest.entity.snow_guardian.death": "Snow Guardian dies", + "subtitles.twilightforest.entity.snow_guardian.hurt": "Snow Guardian hurts", + "subtitles.twilightforest.entity.snow_queen.ambient": "Snow Queen crackles", + "subtitles.twilightforest.entity.snow_queen.attack": "Snow Queen attacks", + "subtitles.twilightforest.entity.snow_queen.break": "Snow Queen deflects attack", + "subtitles.twilightforest.entity.snow_queen.death": "Snow Queen dies", + "subtitles.twilightforest.entity.snow_queen.hurt": "Snow Queen hurts", + "subtitles.twilightforest.entity.swarm_spider.ambient": "Swarm Spider hisses", + "subtitles.twilightforest.entity.swarm_spider.death": "Swarm Spider dies", + "subtitles.twilightforest.entity.swarm_spider.hurt": "Swarm Spider hurts", + "subtitles.twilightforest.entity.tear.break": "Ur-Ghast tear shatters", + "subtitles.twilightforest.entity.tiny_bird.chirp": "Bird chirps", + "subtitles.twilightforest.entity.tiny_bird.hurt": "Bird squeaks in pain", + "subtitles.twilightforest.entity.tiny_bird.song": "Bird sings", + "subtitles.twilightforest.entity.tiny_bird.takeoff": "Bird takes off", + "subtitles.twilightforest.entity.troll.throw_rock": "Troll chucks block", + "subtitles.twilightforest.entity.ur_ghast.ambient": "Ur-Ghast cries", + "subtitles.twilightforest.entity.ur_ghast.death": "Ur-Ghast dies", + "subtitles.twilightforest.entity.ur_ghast.hurt": "Ur-Ghast screams", + "subtitles.twilightforest.entity.ur_ghast.shoot": "Ur-Ghast shoots", + "subtitles.twilightforest.entity.ur_ghast.tantrum": "Ur-Ghast wails", + "subtitles.twilightforest.entity.winter_wolf.ambient": "Winter Wolf growls", + "subtitles.twilightforest.entity.winter_wolf.death": "Winter Wolf dies", + "subtitles.twilightforest.entity.winter_wolf.hurt": "Winter Wolf hurts", + "subtitles.twilightforest.entity.winter_wolf.shoot": "Winter Wolf shoots", + "subtitles.twilightforest.entity.winter_wolf.target": "Winter Wolf takes notice", + "subtitles.twilightforest.entity.wraith.ambient": "Wraith gasps", + "subtitles.twilightforest.entity.wraith.death": "Wraith dies", + "subtitles.twilightforest.entity.wraith.hurt": "Wraith hurts", + "subtitles.twilightforest.entity.yeti.death": "Yeti dies", + "subtitles.twilightforest.entity.yeti.grab": "Yeti grabs", + "subtitles.twilightforest.entity.yeti.growl": "Yeti growls", + "subtitles.twilightforest.entity.yeti.hurt": "Yeti hurts", + "subtitles.twilightforest.entity.yeti.throw": "Yeti throws", + "subtitles.twilightforest.environment.acid_rain": "Acid rain scalds", + "subtitles.twilightforest.item.block_and_chain.collide": "Block and Chain hits block", + "subtitles.twilightforest.item.block_and_chain.fire": "Block and Chain fires", + "subtitles.twilightforest.item.block_and_chain.hit": "Block and Chain hits entity", + "subtitles.twilightforest.item.charm.keep": "Charm of Keeping returns items", + "subtitles.twilightforest.item.charm.life": "Charm of Keeping regenerates", + "subtitles.twilightforest.item.fan.whoosh": "Peacock Feather Fan blows", + "subtitles.twilightforest.item.flask.break": "Brittle Flask shatters", + "subtitles.twilightforest.item.flask.crack": "Brittle Flask cracks", + "subtitles.twilightforest.item.flask.fill": "Potion Flask fills", + "subtitles.twilightforest.item.glass_sword.break": "Glass Sword shatters", + "subtitles.twilightforest.item.ice_bomb.fired": "Ice Bomb thrown", + "subtitles.twilightforest.item.knightmetal_armor.equip": "Knightmetal Armor clanks", + "subtitles.twilightforest.item.knightmetal_shield.shatter": "Metal Shield shatters", + "subtitles.twilightforest.item.lamp.burn": "Lamp of Cinders ignites area", + "subtitles.twilightforest.item.magnet.grab": "Ore Magnet pulls up ore", + "subtitles.twilightforest.item.moonworm.squish": "Moonworm fires", + "subtitles.twilightforest.item.scepter.drain": "Life Scepter drains", + "subtitles.twilightforest.item.scepter.pearl": "Twilight Scepter throws pearl", + "subtitles.twilightforest.item.shield.shatter": "Wooden Shield shatters", + "subtitles.twilightforest.item.transformation_powder.use": "Mob Transforms", + "twilightforest.book.author": "a forgotten explorer", + "twilightforest.book.darktower": "Notes on a Wooden Tower", + "twilightforest.book.darktower.1": "§8[[An explorer's notebook that seems to have survived an explosion]]§0\n\nThis tower clearly has mechanisms that are not responding to me. Their magic almost yearns to acknowledge my touch, but it cannot. It is if the devices of the tower are being", + "twilightforest.book.darktower.2": "suppressed by a powerful group of beings nearby.\n\n§8[[Next entry]]§0\n\nThe magic seems to emanate from deep within the strongholds nearby. It can't come from the goblins, as their magic is charming, but unfocused. There", + "twilightforest.book.darktower.3": "must still be some force still active in the strongholds.\n\n§8[[Next entry]]§0\n\nMy analysis indicates that it comes from several sources, operating as a group. I will head back to the stronghold after I resupply...", + "twilightforest.book.hydralair": "Notes on the Fire Swamp", + "twilightforest.book.hydralair.1": "§8[[An explorer's notebook, written on fireproof paper]]§0\n\nFire is a trivial obstacle for a master explorer such as myself. I have traversed seas of fire, and swam through oceans of lava. The burning air here is an interesting variation, but", + "twilightforest.book.hydralair.2": "ultimately no hindrance.\n\nWhat does stop me though is that I have encountered another protection spell, this time surrounding a mighty creature that must be king of this fire swamp. This is not the first protection spell I have encountered, and I am", + "twilightforest.book.hydralair.3": "beginning to unravel the mysteries of how they work.\n\nIf this spell is like the others, it will be sustained by a powerful creature nearby. Surrounding the fire swamp are several wet swamps, and under those swamps are labyrinths full of minotaurs.", + "twilightforest.book.hydralair.4": "The logical choice to bind such a spell to would be some sort of powerful minotaur, different in some way from the others that surround it...", + "twilightforest.book.icetower": "Notes on Auroral Fortification", + "twilightforest.book.icetower.1": "§8[[An explorer's notebook, caked in ice]]§0\n\nI overcame one blizzard, only to run into this terrible ice storm atop the glacier. My explorations have shown me the splendor of an ice palace, shining with the colors of the", + "twilightforest.book.icetower.2": "polar aurora. It all seems protected by some sort of curse.\n\n§8[[Next entry]]§0\n\nI am no novice. This curse is fed by the power of a creature nearby. The cause of the curse surrounding the fire swamp was built off the power of the", + "twilightforest.book.icetower.3": "leader of the minotaurs nearby.\n\nSurrounding this glacier, there are masses of yetis. Perhaps the yetis have some sort of leader...", + "twilightforest.book.labyrinth": "Notes on a Swampy Labyrinth", + "twilightforest.book.labyrinth.1": "§8[[An explorer's notebook, written on waterproof paper]]§0\n\nThe mosquitoes in this swamp are vexing, but strange. The vast majority of them seem to have no natural source, nor do they seem to have a role in the local ecology. I have begun to suspect that they are", + "twilightforest.book.labyrinth.2": "some kind of magical curse.\n\n§8[[Next entry]]§0\n\nNow that I have encountered a protection spell on the ruined labyrinth here, I consider my suspicions confirmed. Both the protection spell and the mosquitoes are a", + "twilightforest.book.labyrinth.3": "curse. This curse seems to have a different source from the others I have encountered. I will have to research further...\n\n§8[[Next entry]]§0\n\nThe curse seems to be of a type too powerful for one being alone to", + "twilightforest.book.labyrinth.4": "produce. Several wizards working in combination would be necessary.\n\nIf one of the wizards stopped contributing, the whole of the curse over the entire swamp would fall. Strangely, my divinations do not show signs of any nearby living wizards.", + "twilightforest.book.labyrinth.5": "I did see something interesting in one of the nearby pointy-roofed towers though...", + "twilightforest.book.lichtower": "Notes on a Pointy Tower", + "twilightforest.book.lichtower.1": "§8[An explorer's notebook, gnawed on by monsters]§0\n\nI have begun examining the strange aura surrounding this tower. The bricks of the tower are protected by a curse, stronger than any I've seen before. The magic from the curse is boiling off into the", + "twilightforest.book.lichtower.2": "surrounding area.\n\nIn my homeland I would have many options for dealing with this magic, but here my supplies are limited. I shall have to research...", + "twilightforest.book.lichtower.3": "§8[[Many entries later]]§0\n\nA breakthrough! In my journeys I sighted a huge snake-like monster in a decorated courtyard. Nearby, I picked up a worn down, discarded green scale.\n\nThe magic in the scale seems to have the curse-breaking", + "twilightforest.book.lichtower.4": "properties I need, but the magic is too dim. I may need to acquire a fresher specimen, directly from the creature.", + "twilightforest.book.tfstronghold": "Notes on a Stronghold", + "twilightforest.book.tfstronghold.1": "§8[[An explorer's notebook, written on faintly glowing paper]]§0\n\nThe tendrils of darkness surrounding this area are just a manifestation of a protective spell over the entire dark forest. The spell causes blindness, which is quite vexing. I have seen several", + "twilightforest.book.tfstronghold.2": "interesting things in the area and would like to keep exploring.\n\n§8[[Next entry]]§0\n\nI have found ruins in the dark forest. They belong to a stronghold, of a type usually inhabited by knights. Rather than knights though, this stronghold is full of", + "twilightforest.book.tfstronghold.3": "goblins. They wear knightly armor, but their behavior is most un-knightly.\n\n§8[[Next entry]]§0\n\nDeep in the ruins, I have found a pedestal. The pedestal seems to be of a type that knights would place trophies on to prove their strength.", + "twilightforest.book.tfstronghold.4": "Obtaining a powerful scepter would seem to weaken the curse on the dark forest, and placing a trophy associated with a powerful creature on the pedestal would likely grant access into the main part of the stronghold.", + "twilightforest.book.trollcave": "Notes on the Highlands", + "twilightforest.book.trollcave.1": "§8[[An explorer's notebook, damaged by acid]]§0\n\nThere seems to be no way to protect myself from the toxic rainstorm surrounding this area. In my brief excursions, I have also encountered another protection spell, similar to the others I have", + "twilightforest.book.trollcave.2": "witnessed. The spell must be connected to the toxic storm in some way. Further research to follow...\n\n§8[[Next entry]]§0\n\nSuch supreme weather magic must be the result of multiple undefeated great evils in this world. My studies contain", + "twilightforest.book.trollcave.3": "several clues pointing at a searing swamp, a forest coated in deep darkness, and a realm coated in snow.", + "twilightforest.book.unknown": "Notes on the Unexplained", + "twilightforest.book.unknown.1": "§8[[This book shows signs of having been copied many times]]§0\n\nI cannot explain the field surrounding this structure, but the magic is powerful. If this curse is like the others, then the answer to unlocking it lies elsewhere. Perhaps there is something I have left", + "twilightforest.book.unknown.2": "undone, or some monster I have yet to defeat. I will have to turn back. I will return to this place later, to see if anything has changed.", + "twilightforest.book.yeticave": "Notes on an Icy Cave", + "twilightforest.book.yeticave.1": "§8[[An explorer's notebook, covered in frost]]§0\n\nThe blizzard surrounding these snowy lands is unceasing. This is no ordinary snowfall--this is a magical phenomenon. I will have to conduct experiments to find what is capable of", + "twilightforest.book.yeticave.2": "causing such an effect.\n\n§8[[Next entry]]§0\n\nThe curse seems to be of a type too powerful for one being alone to produce. Several wizards working in combination would be necessary. If one of the wizards stopped", + "twilightforest.book.yeticave.3": "contributing, the blizzard would calm. Strangely, my divinations do not show signs of any nearby living wizards. I did see something interesting in one of the nearby pointy-roofed towers though..." +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/antibuilder.json b/src/generated/resources/assets/twilightforest/models/block/antibuilder.json new file mode 100644 index 0000000000..af290d232c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/antibuilder.json @@ -0,0 +1,192 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "texture": "#bottom" + }, + "east": { + "cullface": "east", + "texture": "#east" + }, + "north": { + "cullface": "north", + "texture": "#north" + }, + "south": { + "cullface": "south", + "texture": "#south" + }, + "up": { + "cullface": "up", + "texture": "#top" + }, + "west": { + "cullface": "west", + "texture": "#west" + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + }, + { + "faces": { + "down": { + "cullface": "down", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#bottom2" + }, + "east": { + "cullface": "east", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#east2" + }, + "north": { + "cullface": "north", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#north2" + }, + "south": { + "cullface": "south", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#south2" + }, + "up": { + "cullface": "up", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#top2" + }, + "west": { + "cullface": "west", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#west2" + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + }, + { + "faces": { + "down": { + "cullface": "down", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#bottom3" + }, + "east": { + "cullface": "east", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#east3" + }, + "north": { + "cullface": "north", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#north3" + }, + "south": { + "cullface": "south", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#south3" + }, + "up": { + "cullface": "up", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#top3" + }, + "west": { + "cullface": "west", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#west3" + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + } + ], + "render_type": "minecraft:cutout", + "textures": { + "all": "twilightforest:block/towerdev_antibuilder", + "all2": "twilightforest:block/tower_device_level_1/towerdev_antibuilder_1", + "all3": "twilightforest:block/tower_device_level_2/towerdev_antibuilder_2", + "bottom": "#all", + "bottom2": "#all2", + "bottom3": "#all3", + "east": "#all", + "east2": "#all2", + "east3": "#all3", + "north": "#all", + "north2": "#all2", + "north3": "#all3", + "particle": "#bottom", + "south": "#all", + "south2": "#all2", + "south3": "#all3", + "top": "#all", + "top2": "#all2", + "top3": "#all3", + "west": "#all", + "west2": "#all2", + "west3": "#all3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/antibuilt_block.json b/src/generated/resources/assets/twilightforest/models/block/antibuilt_block.json new file mode 100644 index 0000000000..a94f0a35f1 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/antibuilt_block.json @@ -0,0 +1,130 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "texture": "#bottom" + }, + "east": { + "cullface": "east", + "texture": "#east" + }, + "north": { + "cullface": "north", + "texture": "#north" + }, + "south": { + "cullface": "south", + "texture": "#south" + }, + "up": { + "cullface": "up", + "texture": "#top" + }, + "west": { + "cullface": "west", + "texture": "#west" + } + }, + "from": [ + 0, + 0, + 0 + ], + "shade": false, + "to": [ + 16, + 16, + 16 + ] + }, + { + "faces": { + "down": { + "cullface": "down", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#bottom2", + "tintindex": 0 + }, + "east": { + "cullface": "east", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#east2", + "tintindex": 0 + }, + "north": { + "cullface": "north", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#north2", + "tintindex": 0 + }, + "south": { + "cullface": "south", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#south2", + "tintindex": 0 + }, + "up": { + "cullface": "up", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#top2", + "tintindex": 0 + }, + "west": { + "cullface": "west", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#west2", + "tintindex": 0 + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + } + ], + "render_type": "minecraft:cutout", + "textures": { + "all": "twilightforest:block/towerdev_antibuilt", + "all2": "twilightforest:block/tower_device_level_2/towerdev_antibuilt_1", + "bottom": "#all", + "bottom2": "#all2", + "east": "#all", + "east2": "#all2", + "north": "#all", + "north2": "#all2", + "particle": "#bottom", + "south": "#all", + "south2": "#all2", + "top": "#all", + "top2": "#all2", + "west": "#all", + "west2": "#all2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/arctic_fur_block.json b/src/generated/resources/assets/twilightforest/models/block/arctic_fur_block.json new file mode 100644 index 0000000000..18daa46a3e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/arctic_fur_block.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "twilightforest:block/arctic_fur_block" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/aurora_block_0.json b/src/generated/resources/assets/twilightforest/models/block/aurora_block_0.json new file mode 100644 index 0000000000..ef7379347f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/aurora_block_0.json @@ -0,0 +1,60 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "texture": "#down", + "tintindex": 0 + }, + "east": { + "cullface": "east", + "texture": "#east", + "tintindex": 0 + }, + "north": { + "cullface": "north", + "texture": "#north", + "tintindex": 0 + }, + "south": { + "cullface": "south", + "texture": "#south", + "tintindex": 0 + }, + "up": { + "cullface": "up", + "texture": "#up", + "tintindex": 0 + }, + "west": { + "cullface": "west", + "texture": "#west", + "tintindex": 0 + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + } + ], + "render_type": "minecraft:solid", + "textures": { + "all": "twilightforest:block/aurora_block_0", + "down": "#all", + "east": "#all", + "north": "#all", + "particle": "#north", + "south": "#all", + "up": "#all", + "west": "#all" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/aurora_block_1.json b/src/generated/resources/assets/twilightforest/models/block/aurora_block_1.json new file mode 100644 index 0000000000..f0ce97de95 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/aurora_block_1.json @@ -0,0 +1,60 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "texture": "#down", + "tintindex": 0 + }, + "east": { + "cullface": "east", + "texture": "#east", + "tintindex": 0 + }, + "north": { + "cullface": "north", + "texture": "#north", + "tintindex": 0 + }, + "south": { + "cullface": "south", + "texture": "#south", + "tintindex": 0 + }, + "up": { + "cullface": "up", + "texture": "#up", + "tintindex": 0 + }, + "west": { + "cullface": "west", + "texture": "#west", + "tintindex": 0 + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + } + ], + "render_type": "minecraft:solid", + "textures": { + "all": "twilightforest:block/aurora_block_1", + "down": "#all", + "east": "#all", + "north": "#all", + "particle": "#north", + "south": "#all", + "up": "#all", + "west": "#all" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/aurora_block_10.json b/src/generated/resources/assets/twilightforest/models/block/aurora_block_10.json new file mode 100644 index 0000000000..2021c26853 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/aurora_block_10.json @@ -0,0 +1,60 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "texture": "#down", + "tintindex": 0 + }, + "east": { + "cullface": "east", + "texture": "#east", + "tintindex": 0 + }, + "north": { + "cullface": "north", + "texture": "#north", + "tintindex": 0 + }, + "south": { + "cullface": "south", + "texture": "#south", + "tintindex": 0 + }, + "up": { + "cullface": "up", + "texture": "#up", + "tintindex": 0 + }, + "west": { + "cullface": "west", + "texture": "#west", + "tintindex": 0 + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + } + ], + "render_type": "minecraft:solid", + "textures": { + "all": "twilightforest:block/aurora_block_10", + "down": "#all", + "east": "#all", + "north": "#all", + "particle": "#north", + "south": "#all", + "up": "#all", + "west": "#all" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/aurora_block_11.json b/src/generated/resources/assets/twilightforest/models/block/aurora_block_11.json new file mode 100644 index 0000000000..222bbb9b0e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/aurora_block_11.json @@ -0,0 +1,60 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "texture": "#down", + "tintindex": 0 + }, + "east": { + "cullface": "east", + "texture": "#east", + "tintindex": 0 + }, + "north": { + "cullface": "north", + "texture": "#north", + "tintindex": 0 + }, + "south": { + "cullface": "south", + "texture": "#south", + "tintindex": 0 + }, + "up": { + "cullface": "up", + "texture": "#up", + "tintindex": 0 + }, + "west": { + "cullface": "west", + "texture": "#west", + "tintindex": 0 + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + } + ], + "render_type": "minecraft:solid", + "textures": { + "all": "twilightforest:block/aurora_block_11", + "down": "#all", + "east": "#all", + "north": "#all", + "particle": "#north", + "south": "#all", + "up": "#all", + "west": "#all" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/aurora_block_12.json b/src/generated/resources/assets/twilightforest/models/block/aurora_block_12.json new file mode 100644 index 0000000000..a424868c3c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/aurora_block_12.json @@ -0,0 +1,60 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "texture": "#down", + "tintindex": 0 + }, + "east": { + "cullface": "east", + "texture": "#east", + "tintindex": 0 + }, + "north": { + "cullface": "north", + "texture": "#north", + "tintindex": 0 + }, + "south": { + "cullface": "south", + "texture": "#south", + "tintindex": 0 + }, + "up": { + "cullface": "up", + "texture": "#up", + "tintindex": 0 + }, + "west": { + "cullface": "west", + "texture": "#west", + "tintindex": 0 + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + } + ], + "render_type": "minecraft:solid", + "textures": { + "all": "twilightforest:block/aurora_block_12", + "down": "#all", + "east": "#all", + "north": "#all", + "particle": "#north", + "south": "#all", + "up": "#all", + "west": "#all" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/aurora_block_13.json b/src/generated/resources/assets/twilightforest/models/block/aurora_block_13.json new file mode 100644 index 0000000000..0855e1ae5c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/aurora_block_13.json @@ -0,0 +1,60 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "texture": "#down", + "tintindex": 0 + }, + "east": { + "cullface": "east", + "texture": "#east", + "tintindex": 0 + }, + "north": { + "cullface": "north", + "texture": "#north", + "tintindex": 0 + }, + "south": { + "cullface": "south", + "texture": "#south", + "tintindex": 0 + }, + "up": { + "cullface": "up", + "texture": "#up", + "tintindex": 0 + }, + "west": { + "cullface": "west", + "texture": "#west", + "tintindex": 0 + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + } + ], + "render_type": "minecraft:solid", + "textures": { + "all": "twilightforest:block/aurora_block_13", + "down": "#all", + "east": "#all", + "north": "#all", + "particle": "#north", + "south": "#all", + "up": "#all", + "west": "#all" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/aurora_block_14.json b/src/generated/resources/assets/twilightforest/models/block/aurora_block_14.json new file mode 100644 index 0000000000..8eed929325 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/aurora_block_14.json @@ -0,0 +1,60 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "texture": "#down", + "tintindex": 0 + }, + "east": { + "cullface": "east", + "texture": "#east", + "tintindex": 0 + }, + "north": { + "cullface": "north", + "texture": "#north", + "tintindex": 0 + }, + "south": { + "cullface": "south", + "texture": "#south", + "tintindex": 0 + }, + "up": { + "cullface": "up", + "texture": "#up", + "tintindex": 0 + }, + "west": { + "cullface": "west", + "texture": "#west", + "tintindex": 0 + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + } + ], + "render_type": "minecraft:solid", + "textures": { + "all": "twilightforest:block/aurora_block_14", + "down": "#all", + "east": "#all", + "north": "#all", + "particle": "#north", + "south": "#all", + "up": "#all", + "west": "#all" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/aurora_block_15.json b/src/generated/resources/assets/twilightforest/models/block/aurora_block_15.json new file mode 100644 index 0000000000..f8dff75295 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/aurora_block_15.json @@ -0,0 +1,60 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "texture": "#down", + "tintindex": 0 + }, + "east": { + "cullface": "east", + "texture": "#east", + "tintindex": 0 + }, + "north": { + "cullface": "north", + "texture": "#north", + "tintindex": 0 + }, + "south": { + "cullface": "south", + "texture": "#south", + "tintindex": 0 + }, + "up": { + "cullface": "up", + "texture": "#up", + "tintindex": 0 + }, + "west": { + "cullface": "west", + "texture": "#west", + "tintindex": 0 + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + } + ], + "render_type": "minecraft:solid", + "textures": { + "all": "twilightforest:block/aurora_block_15", + "down": "#all", + "east": "#all", + "north": "#all", + "particle": "#north", + "south": "#all", + "up": "#all", + "west": "#all" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/aurora_block_2.json b/src/generated/resources/assets/twilightforest/models/block/aurora_block_2.json new file mode 100644 index 0000000000..3628664eb4 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/aurora_block_2.json @@ -0,0 +1,60 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "texture": "#down", + "tintindex": 0 + }, + "east": { + "cullface": "east", + "texture": "#east", + "tintindex": 0 + }, + "north": { + "cullface": "north", + "texture": "#north", + "tintindex": 0 + }, + "south": { + "cullface": "south", + "texture": "#south", + "tintindex": 0 + }, + "up": { + "cullface": "up", + "texture": "#up", + "tintindex": 0 + }, + "west": { + "cullface": "west", + "texture": "#west", + "tintindex": 0 + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + } + ], + "render_type": "minecraft:solid", + "textures": { + "all": "twilightforest:block/aurora_block_2", + "down": "#all", + "east": "#all", + "north": "#all", + "particle": "#north", + "south": "#all", + "up": "#all", + "west": "#all" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/aurora_block_3.json b/src/generated/resources/assets/twilightforest/models/block/aurora_block_3.json new file mode 100644 index 0000000000..3805b21bc1 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/aurora_block_3.json @@ -0,0 +1,60 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "texture": "#down", + "tintindex": 0 + }, + "east": { + "cullface": "east", + "texture": "#east", + "tintindex": 0 + }, + "north": { + "cullface": "north", + "texture": "#north", + "tintindex": 0 + }, + "south": { + "cullface": "south", + "texture": "#south", + "tintindex": 0 + }, + "up": { + "cullface": "up", + "texture": "#up", + "tintindex": 0 + }, + "west": { + "cullface": "west", + "texture": "#west", + "tintindex": 0 + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + } + ], + "render_type": "minecraft:solid", + "textures": { + "all": "twilightforest:block/aurora_block_3", + "down": "#all", + "east": "#all", + "north": "#all", + "particle": "#north", + "south": "#all", + "up": "#all", + "west": "#all" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/aurora_block_4.json b/src/generated/resources/assets/twilightforest/models/block/aurora_block_4.json new file mode 100644 index 0000000000..a967a8facf --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/aurora_block_4.json @@ -0,0 +1,60 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "texture": "#down", + "tintindex": 0 + }, + "east": { + "cullface": "east", + "texture": "#east", + "tintindex": 0 + }, + "north": { + "cullface": "north", + "texture": "#north", + "tintindex": 0 + }, + "south": { + "cullface": "south", + "texture": "#south", + "tintindex": 0 + }, + "up": { + "cullface": "up", + "texture": "#up", + "tintindex": 0 + }, + "west": { + "cullface": "west", + "texture": "#west", + "tintindex": 0 + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + } + ], + "render_type": "minecraft:solid", + "textures": { + "all": "twilightforest:block/aurora_block_4", + "down": "#all", + "east": "#all", + "north": "#all", + "particle": "#north", + "south": "#all", + "up": "#all", + "west": "#all" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/aurora_block_5.json b/src/generated/resources/assets/twilightforest/models/block/aurora_block_5.json new file mode 100644 index 0000000000..2ad883e44f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/aurora_block_5.json @@ -0,0 +1,60 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "texture": "#down", + "tintindex": 0 + }, + "east": { + "cullface": "east", + "texture": "#east", + "tintindex": 0 + }, + "north": { + "cullface": "north", + "texture": "#north", + "tintindex": 0 + }, + "south": { + "cullface": "south", + "texture": "#south", + "tintindex": 0 + }, + "up": { + "cullface": "up", + "texture": "#up", + "tintindex": 0 + }, + "west": { + "cullface": "west", + "texture": "#west", + "tintindex": 0 + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + } + ], + "render_type": "minecraft:solid", + "textures": { + "all": "twilightforest:block/aurora_block_5", + "down": "#all", + "east": "#all", + "north": "#all", + "particle": "#north", + "south": "#all", + "up": "#all", + "west": "#all" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/aurora_block_6.json b/src/generated/resources/assets/twilightforest/models/block/aurora_block_6.json new file mode 100644 index 0000000000..f49486ef48 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/aurora_block_6.json @@ -0,0 +1,60 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "texture": "#down", + "tintindex": 0 + }, + "east": { + "cullface": "east", + "texture": "#east", + "tintindex": 0 + }, + "north": { + "cullface": "north", + "texture": "#north", + "tintindex": 0 + }, + "south": { + "cullface": "south", + "texture": "#south", + "tintindex": 0 + }, + "up": { + "cullface": "up", + "texture": "#up", + "tintindex": 0 + }, + "west": { + "cullface": "west", + "texture": "#west", + "tintindex": 0 + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + } + ], + "render_type": "minecraft:solid", + "textures": { + "all": "twilightforest:block/aurora_block_6", + "down": "#all", + "east": "#all", + "north": "#all", + "particle": "#north", + "south": "#all", + "up": "#all", + "west": "#all" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/aurora_block_7.json b/src/generated/resources/assets/twilightforest/models/block/aurora_block_7.json new file mode 100644 index 0000000000..1c063682bd --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/aurora_block_7.json @@ -0,0 +1,60 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "texture": "#down", + "tintindex": 0 + }, + "east": { + "cullface": "east", + "texture": "#east", + "tintindex": 0 + }, + "north": { + "cullface": "north", + "texture": "#north", + "tintindex": 0 + }, + "south": { + "cullface": "south", + "texture": "#south", + "tintindex": 0 + }, + "up": { + "cullface": "up", + "texture": "#up", + "tintindex": 0 + }, + "west": { + "cullface": "west", + "texture": "#west", + "tintindex": 0 + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + } + ], + "render_type": "minecraft:solid", + "textures": { + "all": "twilightforest:block/aurora_block_7", + "down": "#all", + "east": "#all", + "north": "#all", + "particle": "#north", + "south": "#all", + "up": "#all", + "west": "#all" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/aurora_block_8.json b/src/generated/resources/assets/twilightforest/models/block/aurora_block_8.json new file mode 100644 index 0000000000..baf05c5444 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/aurora_block_8.json @@ -0,0 +1,60 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "texture": "#down", + "tintindex": 0 + }, + "east": { + "cullface": "east", + "texture": "#east", + "tintindex": 0 + }, + "north": { + "cullface": "north", + "texture": "#north", + "tintindex": 0 + }, + "south": { + "cullface": "south", + "texture": "#south", + "tintindex": 0 + }, + "up": { + "cullface": "up", + "texture": "#up", + "tintindex": 0 + }, + "west": { + "cullface": "west", + "texture": "#west", + "tintindex": 0 + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + } + ], + "render_type": "minecraft:solid", + "textures": { + "all": "twilightforest:block/aurora_block_8", + "down": "#all", + "east": "#all", + "north": "#all", + "particle": "#north", + "south": "#all", + "up": "#all", + "west": "#all" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/aurora_block_9.json b/src/generated/resources/assets/twilightforest/models/block/aurora_block_9.json new file mode 100644 index 0000000000..6bc49c6018 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/aurora_block_9.json @@ -0,0 +1,60 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "texture": "#down", + "tintindex": 0 + }, + "east": { + "cullface": "east", + "texture": "#east", + "tintindex": 0 + }, + "north": { + "cullface": "north", + "texture": "#north", + "tintindex": 0 + }, + "south": { + "cullface": "south", + "texture": "#south", + "tintindex": 0 + }, + "up": { + "cullface": "up", + "texture": "#up", + "tintindex": 0 + }, + "west": { + "cullface": "west", + "texture": "#west", + "tintindex": 0 + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + } + ], + "render_type": "minecraft:solid", + "textures": { + "all": "twilightforest:block/aurora_block_9", + "down": "#all", + "east": "#all", + "north": "#all", + "particle": "#north", + "south": "#all", + "up": "#all", + "west": "#all" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/aurora_pillar.json b/src/generated/resources/assets/twilightforest/models/block/aurora_pillar.json new file mode 100644 index 0000000000..cf443253ff --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/aurora_pillar.json @@ -0,0 +1,61 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "texture": "#down", + "tintindex": 0 + }, + "east": { + "cullface": "east", + "texture": "#east", + "tintindex": 0 + }, + "north": { + "cullface": "north", + "texture": "#north", + "tintindex": 0 + }, + "south": { + "cullface": "south", + "texture": "#south", + "tintindex": 0 + }, + "up": { + "cullface": "up", + "texture": "#up", + "tintindex": 0 + }, + "west": { + "cullface": "west", + "texture": "#west", + "tintindex": 0 + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + } + ], + "render_type": "minecraft:solid", + "textures": { + "down": "#end", + "east": "#side", + "end": "twilightforest:block/aurora_pillar_top", + "north": "#side", + "particle": "#north", + "side": "twilightforest:block/aurora_pillar", + "south": "#side", + "up": "#end", + "west": "#side" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/aurora_slab.json b/src/generated/resources/assets/twilightforest/models/block/aurora_slab.json new file mode 100644 index 0000000000..b87b61d80b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/aurora_slab.json @@ -0,0 +1,54 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "texture": "#bottom", + "tintindex": 0 + }, + "east": { + "cullface": "east", + "texture": "#side", + "tintindex": 0 + }, + "north": { + "cullface": "north", + "texture": "#side", + "tintindex": 0 + }, + "south": { + "cullface": "south", + "texture": "#side", + "tintindex": 0 + }, + "up": { + "texture": "#top", + "tintindex": 0 + }, + "west": { + "cullface": "west", + "texture": "#side", + "tintindex": 0 + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 8, + 16 + ] + } + ], + "textures": { + "bottom": "twilightforest:block/aurora_pillar_top", + "particle": "#side", + "side": "twilightforest:block/aurora_slab_side", + "top": "twilightforest:block/aurora_pillar_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/aurora_slab_double.json b/src/generated/resources/assets/twilightforest/models/block/aurora_slab_double.json new file mode 100644 index 0000000000..b4610132c6 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/aurora_slab_double.json @@ -0,0 +1,61 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "texture": "#down", + "tintindex": 0 + }, + "east": { + "cullface": "east", + "texture": "#east", + "tintindex": 0 + }, + "north": { + "cullface": "north", + "texture": "#north", + "tintindex": 0 + }, + "south": { + "cullface": "south", + "texture": "#south", + "tintindex": 0 + }, + "up": { + "cullface": "up", + "texture": "#up", + "tintindex": 0 + }, + "west": { + "cullface": "west", + "texture": "#west", + "tintindex": 0 + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + } + ], + "render_type": "minecraft:solid", + "textures": { + "down": "#end", + "east": "#side", + "end": "twilightforest:block/aurora_pillar_top", + "north": "#side", + "particle": "#north", + "side": "twilightforest:block/aurora_slab_side", + "south": "#side", + "up": "#end", + "west": "#side" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/auroralized_glass.json b/src/generated/resources/assets/twilightforest/models/block/auroralized_glass.json new file mode 100644 index 0000000000..e96b71dc30 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/auroralized_glass.json @@ -0,0 +1,60 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "texture": "#down", + "tintindex": 0 + }, + "east": { + "cullface": "east", + "texture": "#east", + "tintindex": 0 + }, + "north": { + "cullface": "north", + "texture": "#north", + "tintindex": 0 + }, + "south": { + "cullface": "south", + "texture": "#south", + "tintindex": 0 + }, + "up": { + "cullface": "up", + "texture": "#up", + "tintindex": 0 + }, + "west": { + "cullface": "west", + "texture": "#west", + "tintindex": 0 + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + } + ], + "render_type": "minecraft:translucent", + "textures": { + "all": "twilightforest:block/auroralized_glass", + "down": "#all", + "east": "#all", + "north": "#all", + "particle": "#north", + "south": "#all", + "up": "#all", + "west": "#all" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/beanstalk_grower.json b/src/generated/resources/assets/twilightforest/models/block/beanstalk_grower.json new file mode 100644 index 0000000000..472ab29d49 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/beanstalk_grower.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:builtin/entity", + "textures": { + "particle": "twilightforest:block/stone_twist/twist_blank" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/beanstalk_leaves.json b/src/generated/resources/assets/twilightforest/models/block/beanstalk_leaves.json new file mode 100644 index 0000000000..6b26318be1 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/beanstalk_leaves.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/azalea_leaves" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/blue_castle_door.json b/src/generated/resources/assets/twilightforest/models/block/blue_castle_door.json new file mode 100644 index 0000000000..94f18d7e7c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/blue_castle_door.json @@ -0,0 +1,11 @@ +{ + "parent": "minecraft:block/block", + "loader": "twilightforest:castle_door", + "render_type": "minecraft:cutout", + "textures": { + "base": "twilightforest:block/castle_door", + "overlay": "twilightforest:block/castle_door_rune_corners", + "overlay_connected": "twilightforest:block/castle_door_rune_ctm", + "particle": "twilightforest:block/castle_door" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/blue_castle_door_vanished.json b/src/generated/resources/assets/twilightforest/models/block/blue_castle_door_vanished.json new file mode 100644 index 0000000000..9307588e5a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/blue_castle_door_vanished.json @@ -0,0 +1,11 @@ +{ + "parent": "minecraft:block/block", + "loader": "twilightforest:castle_door", + "render_type": "minecraft:cutout", + "textures": { + "base": "twilightforest:block/castle_door_vanished", + "overlay": "twilightforest:block/castle_door_rune_corners", + "overlay_connected": "twilightforest:block/castle_door_rune_ctm", + "particle": "twilightforest:block/castle_door_vanished" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/bold_castle_brick_pillar.json b/src/generated/resources/assets/twilightforest/models/block/bold_castle_brick_pillar.json new file mode 100644 index 0000000000..4255e437b6 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/bold_castle_brick_pillar.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "twilightforest:block/bold_castle_brick_pillar_end", + "side": "twilightforest:block/bold_castle_brick_pillar_side" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/bold_castle_brick_pillar_x.json b/src/generated/resources/assets/twilightforest/models/block/bold_castle_brick_pillar_x.json new file mode 100644 index 0000000000..2962bf0e52 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/bold_castle_brick_pillar_x.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/util/cube_column_rotationally_correct_x", + "textures": { + "end": "twilightforest:block/bold_castle_brick_pillar_end", + "side": "twilightforest:block/bold_castle_brick_pillar_side" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/bold_castle_brick_pillar_z.json b/src/generated/resources/assets/twilightforest/models/block/bold_castle_brick_pillar_z.json new file mode 100644 index 0000000000..fc90e894ac --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/bold_castle_brick_pillar_z.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/util/cube_column_rotationally_correct_z", + "textures": { + "end": "twilightforest:block/bold_castle_brick_pillar_end", + "side": "twilightforest:block/bold_castle_brick_pillar_side" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/bold_castle_brick_stairs.json b/src/generated/resources/assets/twilightforest/models/block/bold_castle_brick_stairs.json new file mode 100644 index 0000000000..bae5746ac8 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/bold_castle_brick_stairs.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/stairs", + "textures": { + "bottom": "twilightforest:block/bold_castle_brick_tile", + "side": "twilightforest:block/bold_castle_brick_tile", + "top": "twilightforest:block/bold_castle_brick_tile" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/bold_castle_brick_stairs_inner.json b/src/generated/resources/assets/twilightforest/models/block/bold_castle_brick_stairs_inner.json new file mode 100644 index 0000000000..3b413338aa --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/bold_castle_brick_stairs_inner.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/inner_stairs", + "textures": { + "bottom": "twilightforest:block/bold_castle_brick_tile", + "side": "twilightforest:block/bold_castle_brick_tile", + "top": "twilightforest:block/bold_castle_brick_tile" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/bold_castle_brick_stairs_outer.json b/src/generated/resources/assets/twilightforest/models/block/bold_castle_brick_stairs_outer.json new file mode 100644 index 0000000000..b7604f8996 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/bold_castle_brick_stairs_outer.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/outer_stairs", + "textures": { + "bottom": "twilightforest:block/bold_castle_brick_tile", + "side": "twilightforest:block/bold_castle_brick_tile", + "top": "twilightforest:block/bold_castle_brick_tile" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/bold_castle_brick_tile.json b/src/generated/resources/assets/twilightforest/models/block/bold_castle_brick_tile.json new file mode 100644 index 0000000000..6ff9a45057 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/bold_castle_brick_tile.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "twilightforest:block/bold_castle_brick_tile" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/bold_stone_pillar.json b/src/generated/resources/assets/twilightforest/models/block/bold_stone_pillar.json new file mode 100644 index 0000000000..dcb983fca4 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/bold_stone_pillar.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "twilightforest:block/stone_pillar_end", + "side": "twilightforest:block/stone_pillar_side" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/bold_stone_pillar_horizontal.json b/src/generated/resources/assets/twilightforest/models/block/bold_stone_pillar_horizontal.json new file mode 100644 index 0000000000..3e9e404ffc --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/bold_stone_pillar_horizontal.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column_horizontal", + "textures": { + "end": "twilightforest:block/stone_pillar_end", + "side": "twilightforest:block/stone_pillar_side" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/boss_spawner.json b/src/generated/resources/assets/twilightforest/models/block/boss_spawner.json new file mode 100644 index 0000000000..ca18b784ef --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/boss_spawner.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_all", + "render_type": "minecraft:cutout", + "textures": { + "all": "twilightforest:block/boss_spawner" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/brown_thorns.json b/src/generated/resources/assets/twilightforest/models/block/brown_thorns.json new file mode 100644 index 0000000000..f1d233108c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/brown_thorns.json @@ -0,0 +1,8 @@ +{ + "parent": "twilightforest:block/thorns_main", + "render_type": "minecraft:cutout", + "textures": { + "end": "twilightforest:block/brown_thorns_top", + "side": "twilightforest:block/brown_thorns_side" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/brown_thorns_bottom.json b/src/generated/resources/assets/twilightforest/models/block/brown_thorns_bottom.json new file mode 100644 index 0000000000..95eb3f5a65 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/brown_thorns_bottom.json @@ -0,0 +1,8 @@ +{ + "parent": "twilightforest:block/thorns_section_bottom", + "render_type": "minecraft:cutout", + "textures": { + "end": "twilightforest:block/brown_thorns_top", + "side": "twilightforest:block/brown_thorns_side" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/brown_thorns_no_section.json b/src/generated/resources/assets/twilightforest/models/block/brown_thorns_no_section.json new file mode 100644 index 0000000000..3828a2613c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/brown_thorns_no_section.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/thorns_no_section", + "render_type": "minecraft:cutout", + "textures": { + "side": "twilightforest:block/brown_thorns_side" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/brown_thorns_no_section_alt.json b/src/generated/resources/assets/twilightforest/models/block/brown_thorns_no_section_alt.json new file mode 100644 index 0000000000..6f7064dc68 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/brown_thorns_no_section_alt.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/thorns_no_section_alt", + "render_type": "minecraft:cutout", + "textures": { + "side": "twilightforest:block/brown_thorns_side" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/brown_thorns_thorns.json b/src/generated/resources/assets/twilightforest/models/block/brown_thorns_thorns.json new file mode 100644 index 0000000000..9b3886f6d8 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/brown_thorns_thorns.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/thorns", + "render_type": "minecraft:cutout", + "textures": { + "side": "twilightforest:block/brown_thorns_side" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/brown_thorns_top.json b/src/generated/resources/assets/twilightforest/models/block/brown_thorns_top.json new file mode 100644 index 0000000000..2eeeec976b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/brown_thorns_top.json @@ -0,0 +1,8 @@ +{ + "parent": "twilightforest:block/thorns_section_top", + "render_type": "minecraft:cutout", + "textures": { + "end": "twilightforest:block/brown_thorns_top", + "side": "twilightforest:block/brown_thorns_side" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/built_block.json b/src/generated/resources/assets/twilightforest/models/block/built_block.json new file mode 100644 index 0000000000..e59a29c8a1 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/built_block.json @@ -0,0 +1,154 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#bottom" + }, + "east": { + "cullface": "east", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#east" + }, + "north": { + "cullface": "north", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#north" + }, + "south": { + "cullface": "south", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#south" + }, + "up": { + "cullface": "up", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#top" + }, + "west": { + "cullface": "west", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#west" + } + }, + "from": [ + 0, + 0, + 0 + ], + "shade": false, + "to": [ + 16, + 16, + 16 + ] + }, + { + "faces": { + "down": { + "cullface": "down", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#bottom2", + "tintindex": 0 + }, + "east": { + "cullface": "east", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#east2", + "tintindex": 0 + }, + "north": { + "cullface": "north", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#north2", + "tintindex": 0 + }, + "south": { + "cullface": "south", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#south2", + "tintindex": 0 + }, + "up": { + "cullface": "up", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#top2", + "tintindex": 0 + }, + "west": { + "cullface": "west", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#west2", + "tintindex": 0 + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + } + ], + "render_type": "minecraft:cutout", + "textures": { + "all": "twilightforest:block/towerdev_built_off", + "all2": "twilightforest:block/tower_device_level_1/towerdev_builder_off_1", + "bottom": "#all", + "bottom2": "#all2", + "east": "#all", + "east2": "#all2", + "north": "#all", + "north2": "#all2", + "particle": "#bottom", + "south": "#all", + "south2": "#all2", + "top": "#all", + "top2": "#all2", + "west": "#all", + "west2": "#all2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/built_block_active.json b/src/generated/resources/assets/twilightforest/models/block/built_block_active.json new file mode 100644 index 0000000000..6f8845028d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/built_block_active.json @@ -0,0 +1,154 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#bottom" + }, + "east": { + "cullface": "east", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#east" + }, + "north": { + "cullface": "north", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#north" + }, + "south": { + "cullface": "south", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#south" + }, + "up": { + "cullface": "up", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#top" + }, + "west": { + "cullface": "west", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#west" + } + }, + "from": [ + 0, + 0, + 0 + ], + "shade": false, + "to": [ + 16, + 16, + 16 + ] + }, + { + "faces": { + "down": { + "cullface": "down", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#bottom2", + "tintindex": 0 + }, + "east": { + "cullface": "east", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#east2", + "tintindex": 0 + }, + "north": { + "cullface": "north", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#north2", + "tintindex": 0 + }, + "south": { + "cullface": "south", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#south2", + "tintindex": 0 + }, + "up": { + "cullface": "up", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#top2", + "tintindex": 0 + }, + "west": { + "cullface": "west", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#west2", + "tintindex": 0 + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + } + ], + "render_type": "minecraft:cutout", + "textures": { + "all": "twilightforest:block/towerdev_built_on", + "all2": "twilightforest:block/tower_device_level_1/towerdev_builder_on_1", + "bottom": "#all", + "bottom2": "#all2", + "east": "#all", + "east2": "#all2", + "north": "#all", + "north2": "#all2", + "particle": "#bottom", + "south": "#all", + "south2": "#all2", + "top": "#all", + "top2": "#all2", + "west": "#all", + "west2": "#all2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/burnt_thorns.json b/src/generated/resources/assets/twilightforest/models/block/burnt_thorns.json new file mode 100644 index 0000000000..e07dabe882 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/burnt_thorns.json @@ -0,0 +1,8 @@ +{ + "parent": "twilightforest:block/thorns_main", + "render_type": "minecraft:cutout", + "textures": { + "end": "twilightforest:block/burnt_thorns_top", + "side": "twilightforest:block/burnt_thorns_side" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/burnt_thorns_bottom.json b/src/generated/resources/assets/twilightforest/models/block/burnt_thorns_bottom.json new file mode 100644 index 0000000000..dfb94c281a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/burnt_thorns_bottom.json @@ -0,0 +1,8 @@ +{ + "parent": "twilightforest:block/thorns_section_bottom", + "render_type": "minecraft:cutout", + "textures": { + "end": "twilightforest:block/burnt_thorns_top", + "side": "twilightforest:block/burnt_thorns_side" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/burnt_thorns_no_section.json b/src/generated/resources/assets/twilightforest/models/block/burnt_thorns_no_section.json new file mode 100644 index 0000000000..c1fa487152 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/burnt_thorns_no_section.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/thorns_no_section", + "render_type": "minecraft:cutout", + "textures": { + "side": "twilightforest:block/burnt_thorns_side" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/burnt_thorns_no_section_alt.json b/src/generated/resources/assets/twilightforest/models/block/burnt_thorns_no_section_alt.json new file mode 100644 index 0000000000..290db581c5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/burnt_thorns_no_section_alt.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/thorns_no_section_alt", + "render_type": "minecraft:cutout", + "textures": { + "side": "twilightforest:block/burnt_thorns_side" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/burnt_thorns_thorns.json b/src/generated/resources/assets/twilightforest/models/block/burnt_thorns_thorns.json new file mode 100644 index 0000000000..848bb20ff2 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/burnt_thorns_thorns.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/thorns", + "render_type": "minecraft:cutout", + "textures": { + "side": "twilightforest:block/burnt_thorns_side" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/burnt_thorns_top.json b/src/generated/resources/assets/twilightforest/models/block/burnt_thorns_top.json new file mode 100644 index 0000000000..993dacf0c7 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/burnt_thorns_top.json @@ -0,0 +1,8 @@ +{ + "parent": "twilightforest:block/thorns_section_top", + "render_type": "minecraft:cutout", + "textures": { + "end": "twilightforest:block/burnt_thorns_top", + "side": "twilightforest:block/burnt_thorns_side" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/candelabra_4_4_4.json b/src/generated/resources/assets/twilightforest/models/block/candelabra_4_4_4.json new file mode 100644 index 0000000000..33c4d09769 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/candelabra_4_4_4.json @@ -0,0 +1,769 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "north": { + "texture": "#candelabra", + "uv": [ + 0.0, + 0.0, + 16.0, + 6.0 + ] + }, + "south": { + "texture": "#candelabra", + "uv": [ + 16.0, + 0.0, + 0.0, + 6.0 + ] + } + }, + "from": [ + 0, + 1, + 8 + ], + "to": [ + 16, + 7, + 8 + ] + }, + { + "faces": { + "east": { + "texture": "#candelabra", + "uv": [ + 0.0, + 6.0, + 6.0, + 12.0 + ] + }, + "west": { + "texture": "#candelabra", + "uv": [ + 6.0, + 6.0, + 0.0, + 12.0 + ] + } + }, + "from": [ + 8, + 1, + 5 + ], + "to": [ + 8, + 7, + 11 + ] + }, + { + "faces": { + "down": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "east": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "north": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "south": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "up": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "west": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + } + }, + "from": [ + 1, + 7, + 6 + ], + "to": [ + 5, + 8, + 10 + ] + }, + { + "faces": { + "down": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "east": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "north": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "south": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "up": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "west": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + } + }, + "from": [ + 6, + 7, + 6 + ], + "to": [ + 10, + 8, + 10 + ] + }, + { + "faces": { + "down": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "east": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "north": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "south": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "up": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "west": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + } + }, + "from": [ + 11, + 7, + 6 + ], + "to": [ + 15, + 8, + 10 + ] + }, + { + "faces": { + "down": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "east": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "north": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "south": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "up": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "west": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + } + }, + "from": [ + 6, + 0, + 6 + ], + "to": [ + 10, + 1, + 10 + ] + }, + { + "faces": { + "east": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + }, + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + }, + "up": { + "texture": "#candle", + "uv": [ + 0.0, + 6.0, + 2.0, + 8.0 + ] + }, + "west": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + } + }, + "from": [ + 2, + 8, + 7 + ], + "to": [ + 4, + 12, + 9 + ] + }, + { + "faces": { + "east": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + }, + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + }, + "up": { + "texture": "#candle", + "uv": [ + 0.0, + 6.0, + 2.0, + 8.0 + ] + }, + "west": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + } + }, + "from": [ + 7, + 8, + 7 + ], + "to": [ + 9, + 12, + 9 + ] + }, + { + "faces": { + "east": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + }, + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + }, + "up": { + "texture": "#candle", + "uv": [ + 0.0, + 6.0, + 2.0, + 8.0 + ] + }, + "west": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + } + }, + "from": [ + 12, + 8, + 7 + ], + "to": [ + 14, + 12, + 9 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 2.5, + 12, + 8 + ], + "rotation": { + "angle": 45.0, + "axis": "y", + "origin": [ + 3, + 12, + 8 + ] + }, + "to": [ + 3.5, + 13, + 8 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 2.5, + 12, + 8 + ], + "rotation": { + "angle": -45.0, + "axis": "y", + "origin": [ + 3, + 12, + 8 + ] + }, + "to": [ + 3.5, + 13, + 8 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 7.5, + 12, + 8 + ], + "rotation": { + "angle": 45.0, + "axis": "y", + "origin": [ + 8, + 12, + 8 + ] + }, + "to": [ + 8.5, + 13, + 8 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 7.5, + 12, + 8 + ], + "rotation": { + "angle": -45.0, + "axis": "y", + "origin": [ + 8, + 12, + 8 + ] + }, + "to": [ + 8.5, + 13, + 8 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 12.5, + 12, + 8 + ], + "rotation": { + "angle": 45.0, + "axis": "y", + "origin": [ + 13, + 12, + 8 + ] + }, + "to": [ + 13.5, + 13, + 8 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 12.5, + 12, + 8 + ], + "rotation": { + "angle": -45.0, + "axis": "y", + "origin": [ + 13, + 12, + 8 + ] + }, + "to": [ + 13.5, + 13, + 8 + ] + } + ], + "render_type": "minecraft:cutout", + "textures": { + "candelabra": "twilightforest:block/candelabra", + "particle": "#candelabra" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/candelabra_4_4_4_plain.json b/src/generated/resources/assets/twilightforest/models/block/candelabra_4_4_4_plain.json new file mode 100644 index 0000000000..bf05de2bc5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/candelabra_4_4_4_plain.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/candelabra_4_4_4", + "render_type": "minecraft:cutout", + "textures": { + "candle": "minecraft:block/candle" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/candelabra_4_4_4_plain_lit.json b/src/generated/resources/assets/twilightforest/models/block/candelabra_4_4_4_plain_lit.json new file mode 100644 index 0000000000..e09868c231 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/candelabra_4_4_4_plain_lit.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/candelabra_4_4_4", + "render_type": "minecraft:cutout", + "textures": { + "candle": "minecraft:block/candle_lit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/candelabra_4_4_5.json b/src/generated/resources/assets/twilightforest/models/block/candelabra_4_4_5.json new file mode 100644 index 0000000000..b3b7203602 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/candelabra_4_4_5.json @@ -0,0 +1,769 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "north": { + "texture": "#candelabra", + "uv": [ + 0.0, + 0.0, + 16.0, + 6.0 + ] + }, + "south": { + "texture": "#candelabra", + "uv": [ + 16.0, + 0.0, + 0.0, + 6.0 + ] + } + }, + "from": [ + 0, + 1, + 8 + ], + "to": [ + 16, + 7, + 8 + ] + }, + { + "faces": { + "east": { + "texture": "#candelabra", + "uv": [ + 0.0, + 6.0, + 6.0, + 12.0 + ] + }, + "west": { + "texture": "#candelabra", + "uv": [ + 6.0, + 6.0, + 0.0, + 12.0 + ] + } + }, + "from": [ + 8, + 1, + 5 + ], + "to": [ + 8, + 7, + 11 + ] + }, + { + "faces": { + "down": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "east": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "north": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "south": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "up": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "west": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + } + }, + "from": [ + 1, + 7, + 6 + ], + "to": [ + 5, + 8, + 10 + ] + }, + { + "faces": { + "down": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "east": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "north": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "south": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "up": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "west": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + } + }, + "from": [ + 6, + 7, + 6 + ], + "to": [ + 10, + 8, + 10 + ] + }, + { + "faces": { + "down": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "east": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "north": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "south": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "up": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "west": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + } + }, + "from": [ + 11, + 7, + 6 + ], + "to": [ + 15, + 8, + 10 + ] + }, + { + "faces": { + "down": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "east": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "north": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "south": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "up": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "west": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + } + }, + "from": [ + 6, + 0, + 6 + ], + "to": [ + 10, + 1, + 10 + ] + }, + { + "faces": { + "east": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + }, + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + }, + "up": { + "texture": "#candle", + "uv": [ + 0.0, + 6.0, + 2.0, + 8.0 + ] + }, + "west": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + } + }, + "from": [ + 2, + 8, + 7 + ], + "to": [ + 4, + 12, + 9 + ] + }, + { + "faces": { + "east": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + }, + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + }, + "up": { + "texture": "#candle", + "uv": [ + 0.0, + 6.0, + 2.0, + 8.0 + ] + }, + "west": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + } + }, + "from": [ + 7, + 8, + 7 + ], + "to": [ + 9, + 12, + 9 + ] + }, + { + "faces": { + "east": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + }, + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + }, + "up": { + "texture": "#candle", + "uv": [ + 0.0, + 6.0, + 2.0, + 8.0 + ] + }, + "west": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + } + }, + "from": [ + 12, + 8, + 7 + ], + "to": [ + 14, + 13, + 9 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 2.5, + 12, + 8 + ], + "rotation": { + "angle": 45.0, + "axis": "y", + "origin": [ + 3, + 12, + 8 + ] + }, + "to": [ + 3.5, + 13, + 8 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 2.5, + 12, + 8 + ], + "rotation": { + "angle": -45.0, + "axis": "y", + "origin": [ + 3, + 12, + 8 + ] + }, + "to": [ + 3.5, + 13, + 8 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 7.5, + 12, + 8 + ], + "rotation": { + "angle": 45.0, + "axis": "y", + "origin": [ + 8, + 12, + 8 + ] + }, + "to": [ + 8.5, + 13, + 8 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 7.5, + 12, + 8 + ], + "rotation": { + "angle": -45.0, + "axis": "y", + "origin": [ + 8, + 12, + 8 + ] + }, + "to": [ + 8.5, + 13, + 8 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 12.5, + 13, + 8 + ], + "rotation": { + "angle": 45.0, + "axis": "y", + "origin": [ + 13, + 13, + 8 + ] + }, + "to": [ + 13.5, + 14, + 8 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 12.5, + 13, + 8 + ], + "rotation": { + "angle": -45.0, + "axis": "y", + "origin": [ + 13, + 13, + 8 + ] + }, + "to": [ + 13.5, + 14, + 8 + ] + } + ], + "render_type": "minecraft:cutout", + "textures": { + "candelabra": "twilightforest:block/candelabra", + "particle": "#candelabra" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/candelabra_4_4_5_plain.json b/src/generated/resources/assets/twilightforest/models/block/candelabra_4_4_5_plain.json new file mode 100644 index 0000000000..9a825c8120 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/candelabra_4_4_5_plain.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/candelabra_4_4_5", + "render_type": "minecraft:cutout", + "textures": { + "candle": "minecraft:block/candle" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/candelabra_4_4_5_plain_lit.json b/src/generated/resources/assets/twilightforest/models/block/candelabra_4_4_5_plain_lit.json new file mode 100644 index 0000000000..5d0a6bdb0d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/candelabra_4_4_5_plain_lit.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/candelabra_4_4_5", + "render_type": "minecraft:cutout", + "textures": { + "candle": "minecraft:block/candle_lit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/candelabra_4_5_4.json b/src/generated/resources/assets/twilightforest/models/block/candelabra_4_5_4.json new file mode 100644 index 0000000000..3281fcc04c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/candelabra_4_5_4.json @@ -0,0 +1,769 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "north": { + "texture": "#candelabra", + "uv": [ + 0.0, + 0.0, + 16.0, + 6.0 + ] + }, + "south": { + "texture": "#candelabra", + "uv": [ + 16.0, + 0.0, + 0.0, + 6.0 + ] + } + }, + "from": [ + 0, + 1, + 8 + ], + "to": [ + 16, + 7, + 8 + ] + }, + { + "faces": { + "east": { + "texture": "#candelabra", + "uv": [ + 0.0, + 6.0, + 6.0, + 12.0 + ] + }, + "west": { + "texture": "#candelabra", + "uv": [ + 6.0, + 6.0, + 0.0, + 12.0 + ] + } + }, + "from": [ + 8, + 1, + 5 + ], + "to": [ + 8, + 7, + 11 + ] + }, + { + "faces": { + "down": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "east": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "north": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "south": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "up": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "west": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + } + }, + "from": [ + 1, + 7, + 6 + ], + "to": [ + 5, + 8, + 10 + ] + }, + { + "faces": { + "down": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "east": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "north": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "south": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "up": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "west": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + } + }, + "from": [ + 6, + 7, + 6 + ], + "to": [ + 10, + 8, + 10 + ] + }, + { + "faces": { + "down": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "east": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "north": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "south": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "up": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "west": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + } + }, + "from": [ + 11, + 7, + 6 + ], + "to": [ + 15, + 8, + 10 + ] + }, + { + "faces": { + "down": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "east": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "north": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "south": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "up": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "west": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + } + }, + "from": [ + 6, + 0, + 6 + ], + "to": [ + 10, + 1, + 10 + ] + }, + { + "faces": { + "east": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + }, + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + }, + "up": { + "texture": "#candle", + "uv": [ + 0.0, + 6.0, + 2.0, + 8.0 + ] + }, + "west": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + } + }, + "from": [ + 2, + 8, + 7 + ], + "to": [ + 4, + 12, + 9 + ] + }, + { + "faces": { + "east": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + }, + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + }, + "up": { + "texture": "#candle", + "uv": [ + 0.0, + 6.0, + 2.0, + 8.0 + ] + }, + "west": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + } + }, + "from": [ + 7, + 8, + 7 + ], + "to": [ + 9, + 13, + 9 + ] + }, + { + "faces": { + "east": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + }, + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + }, + "up": { + "texture": "#candle", + "uv": [ + 0.0, + 6.0, + 2.0, + 8.0 + ] + }, + "west": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + } + }, + "from": [ + 12, + 8, + 7 + ], + "to": [ + 14, + 12, + 9 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 2.5, + 12, + 8 + ], + "rotation": { + "angle": 45.0, + "axis": "y", + "origin": [ + 3, + 12, + 8 + ] + }, + "to": [ + 3.5, + 13, + 8 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 2.5, + 12, + 8 + ], + "rotation": { + "angle": -45.0, + "axis": "y", + "origin": [ + 3, + 12, + 8 + ] + }, + "to": [ + 3.5, + 13, + 8 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 7.5, + 13, + 8 + ], + "rotation": { + "angle": 45.0, + "axis": "y", + "origin": [ + 8, + 13, + 8 + ] + }, + "to": [ + 8.5, + 14, + 8 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 7.5, + 13, + 8 + ], + "rotation": { + "angle": -45.0, + "axis": "y", + "origin": [ + 8, + 13, + 8 + ] + }, + "to": [ + 8.5, + 14, + 8 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 12.5, + 12, + 8 + ], + "rotation": { + "angle": 45.0, + "axis": "y", + "origin": [ + 13, + 12, + 8 + ] + }, + "to": [ + 13.5, + 13, + 8 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 12.5, + 12, + 8 + ], + "rotation": { + "angle": -45.0, + "axis": "y", + "origin": [ + 13, + 12, + 8 + ] + }, + "to": [ + 13.5, + 13, + 8 + ] + } + ], + "render_type": "minecraft:cutout", + "textures": { + "candelabra": "twilightforest:block/candelabra", + "particle": "#candelabra" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/candelabra_4_5_4_plain.json b/src/generated/resources/assets/twilightforest/models/block/candelabra_4_5_4_plain.json new file mode 100644 index 0000000000..d8c12308df --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/candelabra_4_5_4_plain.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/candelabra_4_5_4", + "render_type": "minecraft:cutout", + "textures": { + "candle": "minecraft:block/candle" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/candelabra_4_5_4_plain_lit.json b/src/generated/resources/assets/twilightforest/models/block/candelabra_4_5_4_plain_lit.json new file mode 100644 index 0000000000..9a3747bb52 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/candelabra_4_5_4_plain_lit.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/candelabra_4_5_4", + "render_type": "minecraft:cutout", + "textures": { + "candle": "minecraft:block/candle_lit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/candelabra_4_5_5.json b/src/generated/resources/assets/twilightforest/models/block/candelabra_4_5_5.json new file mode 100644 index 0000000000..fcf09d342f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/candelabra_4_5_5.json @@ -0,0 +1,769 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "north": { + "texture": "#candelabra", + "uv": [ + 0.0, + 0.0, + 16.0, + 6.0 + ] + }, + "south": { + "texture": "#candelabra", + "uv": [ + 16.0, + 0.0, + 0.0, + 6.0 + ] + } + }, + "from": [ + 0, + 1, + 8 + ], + "to": [ + 16, + 7, + 8 + ] + }, + { + "faces": { + "east": { + "texture": "#candelabra", + "uv": [ + 0.0, + 6.0, + 6.0, + 12.0 + ] + }, + "west": { + "texture": "#candelabra", + "uv": [ + 6.0, + 6.0, + 0.0, + 12.0 + ] + } + }, + "from": [ + 8, + 1, + 5 + ], + "to": [ + 8, + 7, + 11 + ] + }, + { + "faces": { + "down": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "east": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "north": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "south": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "up": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "west": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + } + }, + "from": [ + 1, + 7, + 6 + ], + "to": [ + 5, + 8, + 10 + ] + }, + { + "faces": { + "down": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "east": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "north": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "south": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "up": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "west": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + } + }, + "from": [ + 6, + 7, + 6 + ], + "to": [ + 10, + 8, + 10 + ] + }, + { + "faces": { + "down": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "east": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "north": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "south": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "up": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "west": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + } + }, + "from": [ + 11, + 7, + 6 + ], + "to": [ + 15, + 8, + 10 + ] + }, + { + "faces": { + "down": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "east": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "north": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "south": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "up": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "west": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + } + }, + "from": [ + 6, + 0, + 6 + ], + "to": [ + 10, + 1, + 10 + ] + }, + { + "faces": { + "east": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + }, + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + }, + "up": { + "texture": "#candle", + "uv": [ + 0.0, + 6.0, + 2.0, + 8.0 + ] + }, + "west": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + } + }, + "from": [ + 2, + 8, + 7 + ], + "to": [ + 4, + 12, + 9 + ] + }, + { + "faces": { + "east": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + }, + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + }, + "up": { + "texture": "#candle", + "uv": [ + 0.0, + 6.0, + 2.0, + 8.0 + ] + }, + "west": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + } + }, + "from": [ + 7, + 8, + 7 + ], + "to": [ + 9, + 13, + 9 + ] + }, + { + "faces": { + "east": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + }, + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + }, + "up": { + "texture": "#candle", + "uv": [ + 0.0, + 6.0, + 2.0, + 8.0 + ] + }, + "west": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + } + }, + "from": [ + 12, + 8, + 7 + ], + "to": [ + 14, + 13, + 9 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 2.5, + 12, + 8 + ], + "rotation": { + "angle": 45.0, + "axis": "y", + "origin": [ + 3, + 12, + 8 + ] + }, + "to": [ + 3.5, + 13, + 8 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 2.5, + 12, + 8 + ], + "rotation": { + "angle": -45.0, + "axis": "y", + "origin": [ + 3, + 12, + 8 + ] + }, + "to": [ + 3.5, + 13, + 8 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 7.5, + 13, + 8 + ], + "rotation": { + "angle": 45.0, + "axis": "y", + "origin": [ + 8, + 13, + 8 + ] + }, + "to": [ + 8.5, + 14, + 8 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 7.5, + 13, + 8 + ], + "rotation": { + "angle": -45.0, + "axis": "y", + "origin": [ + 8, + 13, + 8 + ] + }, + "to": [ + 8.5, + 14, + 8 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 12.5, + 13, + 8 + ], + "rotation": { + "angle": 45.0, + "axis": "y", + "origin": [ + 13, + 13, + 8 + ] + }, + "to": [ + 13.5, + 14, + 8 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 12.5, + 13, + 8 + ], + "rotation": { + "angle": -45.0, + "axis": "y", + "origin": [ + 13, + 13, + 8 + ] + }, + "to": [ + 13.5, + 14, + 8 + ] + } + ], + "render_type": "minecraft:cutout", + "textures": { + "candelabra": "twilightforest:block/candelabra", + "particle": "#candelabra" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/candelabra_4_5_5_plain.json b/src/generated/resources/assets/twilightforest/models/block/candelabra_4_5_5_plain.json new file mode 100644 index 0000000000..c8ef6388c7 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/candelabra_4_5_5_plain.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/candelabra_4_5_5", + "render_type": "minecraft:cutout", + "textures": { + "candle": "minecraft:block/candle" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/candelabra_4_5_5_plain_lit.json b/src/generated/resources/assets/twilightforest/models/block/candelabra_4_5_5_plain_lit.json new file mode 100644 index 0000000000..ff9b4ca2d7 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/candelabra_4_5_5_plain_lit.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/candelabra_4_5_5", + "render_type": "minecraft:cutout", + "textures": { + "candle": "minecraft:block/candle_lit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/candelabra_5_4_4.json b/src/generated/resources/assets/twilightforest/models/block/candelabra_5_4_4.json new file mode 100644 index 0000000000..34dc666c91 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/candelabra_5_4_4.json @@ -0,0 +1,769 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "north": { + "texture": "#candelabra", + "uv": [ + 0.0, + 0.0, + 16.0, + 6.0 + ] + }, + "south": { + "texture": "#candelabra", + "uv": [ + 16.0, + 0.0, + 0.0, + 6.0 + ] + } + }, + "from": [ + 0, + 1, + 8 + ], + "to": [ + 16, + 7, + 8 + ] + }, + { + "faces": { + "east": { + "texture": "#candelabra", + "uv": [ + 0.0, + 6.0, + 6.0, + 12.0 + ] + }, + "west": { + "texture": "#candelabra", + "uv": [ + 6.0, + 6.0, + 0.0, + 12.0 + ] + } + }, + "from": [ + 8, + 1, + 5 + ], + "to": [ + 8, + 7, + 11 + ] + }, + { + "faces": { + "down": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "east": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "north": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "south": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "up": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "west": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + } + }, + "from": [ + 1, + 7, + 6 + ], + "to": [ + 5, + 8, + 10 + ] + }, + { + "faces": { + "down": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "east": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "north": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "south": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "up": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "west": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + } + }, + "from": [ + 6, + 7, + 6 + ], + "to": [ + 10, + 8, + 10 + ] + }, + { + "faces": { + "down": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "east": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "north": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "south": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "up": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "west": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + } + }, + "from": [ + 11, + 7, + 6 + ], + "to": [ + 15, + 8, + 10 + ] + }, + { + "faces": { + "down": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "east": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "north": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "south": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "up": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "west": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + } + }, + "from": [ + 6, + 0, + 6 + ], + "to": [ + 10, + 1, + 10 + ] + }, + { + "faces": { + "east": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + }, + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + }, + "up": { + "texture": "#candle", + "uv": [ + 0.0, + 6.0, + 2.0, + 8.0 + ] + }, + "west": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + } + }, + "from": [ + 2, + 8, + 7 + ], + "to": [ + 4, + 13, + 9 + ] + }, + { + "faces": { + "east": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + }, + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + }, + "up": { + "texture": "#candle", + "uv": [ + 0.0, + 6.0, + 2.0, + 8.0 + ] + }, + "west": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + } + }, + "from": [ + 7, + 8, + 7 + ], + "to": [ + 9, + 12, + 9 + ] + }, + { + "faces": { + "east": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + }, + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + }, + "up": { + "texture": "#candle", + "uv": [ + 0.0, + 6.0, + 2.0, + 8.0 + ] + }, + "west": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + } + }, + "from": [ + 12, + 8, + 7 + ], + "to": [ + 14, + 12, + 9 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 2.5, + 13, + 8 + ], + "rotation": { + "angle": 45.0, + "axis": "y", + "origin": [ + 3, + 13, + 8 + ] + }, + "to": [ + 3.5, + 14, + 8 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 2.5, + 13, + 8 + ], + "rotation": { + "angle": -45.0, + "axis": "y", + "origin": [ + 3, + 13, + 8 + ] + }, + "to": [ + 3.5, + 14, + 8 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 7.5, + 12, + 8 + ], + "rotation": { + "angle": 45.0, + "axis": "y", + "origin": [ + 8, + 12, + 8 + ] + }, + "to": [ + 8.5, + 13, + 8 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 7.5, + 12, + 8 + ], + "rotation": { + "angle": -45.0, + "axis": "y", + "origin": [ + 8, + 12, + 8 + ] + }, + "to": [ + 8.5, + 13, + 8 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 12.5, + 12, + 8 + ], + "rotation": { + "angle": 45.0, + "axis": "y", + "origin": [ + 13, + 12, + 8 + ] + }, + "to": [ + 13.5, + 13, + 8 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 12.5, + 12, + 8 + ], + "rotation": { + "angle": -45.0, + "axis": "y", + "origin": [ + 13, + 12, + 8 + ] + }, + "to": [ + 13.5, + 13, + 8 + ] + } + ], + "render_type": "minecraft:cutout", + "textures": { + "candelabra": "twilightforest:block/candelabra", + "particle": "#candelabra" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/candelabra_5_4_4_plain.json b/src/generated/resources/assets/twilightforest/models/block/candelabra_5_4_4_plain.json new file mode 100644 index 0000000000..4449fcc0e3 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/candelabra_5_4_4_plain.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/candelabra_5_4_4", + "render_type": "minecraft:cutout", + "textures": { + "candle": "minecraft:block/candle" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/candelabra_5_4_4_plain_lit.json b/src/generated/resources/assets/twilightforest/models/block/candelabra_5_4_4_plain_lit.json new file mode 100644 index 0000000000..ef5eb22169 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/candelabra_5_4_4_plain_lit.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/candelabra_5_4_4", + "render_type": "minecraft:cutout", + "textures": { + "candle": "minecraft:block/candle_lit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/candelabra_5_4_5.json b/src/generated/resources/assets/twilightforest/models/block/candelabra_5_4_5.json new file mode 100644 index 0000000000..2c1f9f4d78 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/candelabra_5_4_5.json @@ -0,0 +1,769 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "north": { + "texture": "#candelabra", + "uv": [ + 0.0, + 0.0, + 16.0, + 6.0 + ] + }, + "south": { + "texture": "#candelabra", + "uv": [ + 16.0, + 0.0, + 0.0, + 6.0 + ] + } + }, + "from": [ + 0, + 1, + 8 + ], + "to": [ + 16, + 7, + 8 + ] + }, + { + "faces": { + "east": { + "texture": "#candelabra", + "uv": [ + 0.0, + 6.0, + 6.0, + 12.0 + ] + }, + "west": { + "texture": "#candelabra", + "uv": [ + 6.0, + 6.0, + 0.0, + 12.0 + ] + } + }, + "from": [ + 8, + 1, + 5 + ], + "to": [ + 8, + 7, + 11 + ] + }, + { + "faces": { + "down": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "east": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "north": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "south": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "up": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "west": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + } + }, + "from": [ + 1, + 7, + 6 + ], + "to": [ + 5, + 8, + 10 + ] + }, + { + "faces": { + "down": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "east": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "north": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "south": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "up": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "west": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + } + }, + "from": [ + 6, + 7, + 6 + ], + "to": [ + 10, + 8, + 10 + ] + }, + { + "faces": { + "down": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "east": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "north": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "south": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "up": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "west": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + } + }, + "from": [ + 11, + 7, + 6 + ], + "to": [ + 15, + 8, + 10 + ] + }, + { + "faces": { + "down": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "east": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "north": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "south": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "up": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "west": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + } + }, + "from": [ + 6, + 0, + 6 + ], + "to": [ + 10, + 1, + 10 + ] + }, + { + "faces": { + "east": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + }, + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + }, + "up": { + "texture": "#candle", + "uv": [ + 0.0, + 6.0, + 2.0, + 8.0 + ] + }, + "west": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + } + }, + "from": [ + 2, + 8, + 7 + ], + "to": [ + 4, + 13, + 9 + ] + }, + { + "faces": { + "east": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + }, + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + }, + "up": { + "texture": "#candle", + "uv": [ + 0.0, + 6.0, + 2.0, + 8.0 + ] + }, + "west": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + } + }, + "from": [ + 7, + 8, + 7 + ], + "to": [ + 9, + 12, + 9 + ] + }, + { + "faces": { + "east": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + }, + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + }, + "up": { + "texture": "#candle", + "uv": [ + 0.0, + 6.0, + 2.0, + 8.0 + ] + }, + "west": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + } + }, + "from": [ + 12, + 8, + 7 + ], + "to": [ + 14, + 13, + 9 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 2.5, + 13, + 8 + ], + "rotation": { + "angle": 45.0, + "axis": "y", + "origin": [ + 3, + 13, + 8 + ] + }, + "to": [ + 3.5, + 14, + 8 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 2.5, + 13, + 8 + ], + "rotation": { + "angle": -45.0, + "axis": "y", + "origin": [ + 3, + 13, + 8 + ] + }, + "to": [ + 3.5, + 14, + 8 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 7.5, + 12, + 8 + ], + "rotation": { + "angle": 45.0, + "axis": "y", + "origin": [ + 8, + 12, + 8 + ] + }, + "to": [ + 8.5, + 13, + 8 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 7.5, + 12, + 8 + ], + "rotation": { + "angle": -45.0, + "axis": "y", + "origin": [ + 8, + 12, + 8 + ] + }, + "to": [ + 8.5, + 13, + 8 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 12.5, + 13, + 8 + ], + "rotation": { + "angle": 45.0, + "axis": "y", + "origin": [ + 13, + 13, + 8 + ] + }, + "to": [ + 13.5, + 14, + 8 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 12.5, + 13, + 8 + ], + "rotation": { + "angle": -45.0, + "axis": "y", + "origin": [ + 13, + 13, + 8 + ] + }, + "to": [ + 13.5, + 14, + 8 + ] + } + ], + "render_type": "minecraft:cutout", + "textures": { + "candelabra": "twilightforest:block/candelabra", + "particle": "#candelabra" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/candelabra_5_4_5_plain.json b/src/generated/resources/assets/twilightforest/models/block/candelabra_5_4_5_plain.json new file mode 100644 index 0000000000..4e0942d07e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/candelabra_5_4_5_plain.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/candelabra_5_4_5", + "render_type": "minecraft:cutout", + "textures": { + "candle": "minecraft:block/candle" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/candelabra_5_4_5_plain_lit.json b/src/generated/resources/assets/twilightforest/models/block/candelabra_5_4_5_plain_lit.json new file mode 100644 index 0000000000..cdf7300313 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/candelabra_5_4_5_plain_lit.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/candelabra_5_4_5", + "render_type": "minecraft:cutout", + "textures": { + "candle": "minecraft:block/candle_lit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/candelabra_5_5_4.json b/src/generated/resources/assets/twilightforest/models/block/candelabra_5_5_4.json new file mode 100644 index 0000000000..df1b31c2ff --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/candelabra_5_5_4.json @@ -0,0 +1,769 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "north": { + "texture": "#candelabra", + "uv": [ + 0.0, + 0.0, + 16.0, + 6.0 + ] + }, + "south": { + "texture": "#candelabra", + "uv": [ + 16.0, + 0.0, + 0.0, + 6.0 + ] + } + }, + "from": [ + 0, + 1, + 8 + ], + "to": [ + 16, + 7, + 8 + ] + }, + { + "faces": { + "east": { + "texture": "#candelabra", + "uv": [ + 0.0, + 6.0, + 6.0, + 12.0 + ] + }, + "west": { + "texture": "#candelabra", + "uv": [ + 6.0, + 6.0, + 0.0, + 12.0 + ] + } + }, + "from": [ + 8, + 1, + 5 + ], + "to": [ + 8, + 7, + 11 + ] + }, + { + "faces": { + "down": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "east": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "north": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "south": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "up": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "west": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + } + }, + "from": [ + 1, + 7, + 6 + ], + "to": [ + 5, + 8, + 10 + ] + }, + { + "faces": { + "down": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "east": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "north": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "south": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "up": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "west": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + } + }, + "from": [ + 6, + 7, + 6 + ], + "to": [ + 10, + 8, + 10 + ] + }, + { + "faces": { + "down": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "east": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "north": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "south": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "up": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "west": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + } + }, + "from": [ + 11, + 7, + 6 + ], + "to": [ + 15, + 8, + 10 + ] + }, + { + "faces": { + "down": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "east": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "north": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "south": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "up": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "west": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + } + }, + "from": [ + 6, + 0, + 6 + ], + "to": [ + 10, + 1, + 10 + ] + }, + { + "faces": { + "east": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + }, + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + }, + "up": { + "texture": "#candle", + "uv": [ + 0.0, + 6.0, + 2.0, + 8.0 + ] + }, + "west": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + } + }, + "from": [ + 2, + 8, + 7 + ], + "to": [ + 4, + 13, + 9 + ] + }, + { + "faces": { + "east": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + }, + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + }, + "up": { + "texture": "#candle", + "uv": [ + 0.0, + 6.0, + 2.0, + 8.0 + ] + }, + "west": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + } + }, + "from": [ + 7, + 8, + 7 + ], + "to": [ + 9, + 13, + 9 + ] + }, + { + "faces": { + "east": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + }, + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + }, + "up": { + "texture": "#candle", + "uv": [ + 0.0, + 6.0, + 2.0, + 8.0 + ] + }, + "west": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + } + }, + "from": [ + 12, + 8, + 7 + ], + "to": [ + 14, + 12, + 9 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 2.5, + 13, + 8 + ], + "rotation": { + "angle": 45.0, + "axis": "y", + "origin": [ + 3, + 13, + 8 + ] + }, + "to": [ + 3.5, + 14, + 8 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 2.5, + 13, + 8 + ], + "rotation": { + "angle": -45.0, + "axis": "y", + "origin": [ + 3, + 13, + 8 + ] + }, + "to": [ + 3.5, + 14, + 8 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 7.5, + 13, + 8 + ], + "rotation": { + "angle": 45.0, + "axis": "y", + "origin": [ + 8, + 13, + 8 + ] + }, + "to": [ + 8.5, + 14, + 8 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 7.5, + 13, + 8 + ], + "rotation": { + "angle": -45.0, + "axis": "y", + "origin": [ + 8, + 13, + 8 + ] + }, + "to": [ + 8.5, + 14, + 8 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 12.5, + 12, + 8 + ], + "rotation": { + "angle": 45.0, + "axis": "y", + "origin": [ + 13, + 12, + 8 + ] + }, + "to": [ + 13.5, + 13, + 8 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 12.5, + 12, + 8 + ], + "rotation": { + "angle": -45.0, + "axis": "y", + "origin": [ + 13, + 12, + 8 + ] + }, + "to": [ + 13.5, + 13, + 8 + ] + } + ], + "render_type": "minecraft:cutout", + "textures": { + "candelabra": "twilightforest:block/candelabra", + "particle": "#candelabra" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/candelabra_5_5_4_plain.json b/src/generated/resources/assets/twilightforest/models/block/candelabra_5_5_4_plain.json new file mode 100644 index 0000000000..6e6ececac4 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/candelabra_5_5_4_plain.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/candelabra_5_5_4", + "render_type": "minecraft:cutout", + "textures": { + "candle": "minecraft:block/candle" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/candelabra_5_5_4_plain_lit.json b/src/generated/resources/assets/twilightforest/models/block/candelabra_5_5_4_plain_lit.json new file mode 100644 index 0000000000..0e11958df0 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/candelabra_5_5_4_plain_lit.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/candelabra_5_5_4", + "render_type": "minecraft:cutout", + "textures": { + "candle": "minecraft:block/candle_lit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/candelabra_5_5_5.json b/src/generated/resources/assets/twilightforest/models/block/candelabra_5_5_5.json new file mode 100644 index 0000000000..d0469e13ad --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/candelabra_5_5_5.json @@ -0,0 +1,769 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "north": { + "texture": "#candelabra", + "uv": [ + 0.0, + 0.0, + 16.0, + 6.0 + ] + }, + "south": { + "texture": "#candelabra", + "uv": [ + 16.0, + 0.0, + 0.0, + 6.0 + ] + } + }, + "from": [ + 0, + 1, + 8 + ], + "to": [ + 16, + 7, + 8 + ] + }, + { + "faces": { + "east": { + "texture": "#candelabra", + "uv": [ + 0.0, + 6.0, + 6.0, + 12.0 + ] + }, + "west": { + "texture": "#candelabra", + "uv": [ + 6.0, + 6.0, + 0.0, + 12.0 + ] + } + }, + "from": [ + 8, + 1, + 5 + ], + "to": [ + 8, + 7, + 11 + ] + }, + { + "faces": { + "down": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "east": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "north": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "south": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "up": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "west": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + } + }, + "from": [ + 1, + 7, + 6 + ], + "to": [ + 5, + 8, + 10 + ] + }, + { + "faces": { + "down": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "east": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "north": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "south": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "up": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "west": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + } + }, + "from": [ + 6, + 7, + 6 + ], + "to": [ + 10, + 8, + 10 + ] + }, + { + "faces": { + "down": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "east": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "north": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "south": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "up": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "west": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + } + }, + "from": [ + 11, + 7, + 6 + ], + "to": [ + 15, + 8, + 10 + ] + }, + { + "faces": { + "down": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "east": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "north": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "south": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "up": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "west": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + } + }, + "from": [ + 6, + 0, + 6 + ], + "to": [ + 10, + 1, + 10 + ] + }, + { + "faces": { + "east": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + }, + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + }, + "up": { + "texture": "#candle", + "uv": [ + 0.0, + 6.0, + 2.0, + 8.0 + ] + }, + "west": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + } + }, + "from": [ + 2, + 8, + 7 + ], + "to": [ + 4, + 13, + 9 + ] + }, + { + "faces": { + "east": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + }, + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + }, + "up": { + "texture": "#candle", + "uv": [ + 0.0, + 6.0, + 2.0, + 8.0 + ] + }, + "west": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + } + }, + "from": [ + 7, + 8, + 7 + ], + "to": [ + 9, + 13, + 9 + ] + }, + { + "faces": { + "east": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + }, + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + }, + "up": { + "texture": "#candle", + "uv": [ + 0.0, + 6.0, + 2.0, + 8.0 + ] + }, + "west": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + } + }, + "from": [ + 12, + 8, + 7 + ], + "to": [ + 14, + 13, + 9 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 2.5, + 13, + 8 + ], + "rotation": { + "angle": 45.0, + "axis": "y", + "origin": [ + 3, + 13, + 8 + ] + }, + "to": [ + 3.5, + 14, + 8 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 2.5, + 13, + 8 + ], + "rotation": { + "angle": -45.0, + "axis": "y", + "origin": [ + 3, + 13, + 8 + ] + }, + "to": [ + 3.5, + 14, + 8 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 7.5, + 13, + 8 + ], + "rotation": { + "angle": 45.0, + "axis": "y", + "origin": [ + 8, + 13, + 8 + ] + }, + "to": [ + 8.5, + 14, + 8 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 7.5, + 13, + 8 + ], + "rotation": { + "angle": -45.0, + "axis": "y", + "origin": [ + 8, + 13, + 8 + ] + }, + "to": [ + 8.5, + 14, + 8 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 12.5, + 13, + 8 + ], + "rotation": { + "angle": 45.0, + "axis": "y", + "origin": [ + 13, + 13, + 8 + ] + }, + "to": [ + 13.5, + 14, + 8 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 12.5, + 13, + 8 + ], + "rotation": { + "angle": -45.0, + "axis": "y", + "origin": [ + 13, + 13, + 8 + ] + }, + "to": [ + 13.5, + 14, + 8 + ] + } + ], + "render_type": "minecraft:cutout", + "textures": { + "candelabra": "twilightforest:block/candelabra", + "particle": "#candelabra" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/candelabra_5_5_5_plain.json b/src/generated/resources/assets/twilightforest/models/block/candelabra_5_5_5_plain.json new file mode 100644 index 0000000000..3f475b2991 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/candelabra_5_5_5_plain.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/candelabra_5_5_5", + "render_type": "minecraft:cutout", + "textures": { + "candle": "minecraft:block/candle" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/candelabra_5_5_5_plain_lit.json b/src/generated/resources/assets/twilightforest/models/block/candelabra_5_5_5_plain_lit.json new file mode 100644 index 0000000000..ec9583cfa6 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/candelabra_5_5_5_plain_lit.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/candelabra_5_5_5", + "render_type": "minecraft:cutout", + "textures": { + "candle": "minecraft:block/candle_lit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/candelabra_wall_4_4_4.json b/src/generated/resources/assets/twilightforest/models/block/candelabra_wall_4_4_4.json new file mode 100644 index 0000000000..5b687dbc93 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/candelabra_wall_4_4_4.json @@ -0,0 +1,769 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "north": { + "texture": "#candelabra", + "uv": [ + 0.0, + 0.0, + 16.0, + 6.0 + ] + }, + "south": { + "texture": "#candelabra", + "uv": [ + 16.0, + 0.0, + 0.0, + 6.0 + ] + } + }, + "from": [ + 0, + 1, + 12 + ], + "to": [ + 16, + 7, + 12 + ] + }, + { + "faces": { + "east": { + "texture": "#candelabra", + "uv": [ + 0.0, + 6.0, + 6.0, + 12.0 + ] + }, + "west": { + "texture": "#candelabra", + "uv": [ + 6.0, + 6.0, + 0.0, + 12.0 + ] + } + }, + "from": [ + 8, + 1, + 9 + ], + "to": [ + 8, + 7, + 15 + ] + }, + { + "faces": { + "down": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "east": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "north": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "south": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "up": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "west": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + } + }, + "from": [ + 1, + 7, + 10 + ], + "to": [ + 5, + 8, + 14 + ] + }, + { + "faces": { + "down": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "east": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "north": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "south": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "up": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "west": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + } + }, + "from": [ + 6, + 7, + 10 + ], + "to": [ + 10, + 8, + 14 + ] + }, + { + "faces": { + "down": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "east": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "north": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "south": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "up": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "west": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + } + }, + "from": [ + 11, + 7, + 10 + ], + "to": [ + 15, + 8, + 14 + ] + }, + { + "faces": { + "down": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "east": { + "texture": "#candelabra", + "uv": [ + 3.0, + 12.0, + 4.0, + 16.0 + ] + }, + "north": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "south": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "up": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "west": { + "texture": "#candelabra", + "uv": [ + 3.0, + 12.0, + 4.0, + 16.0 + ] + } + }, + "from": [ + 6, + 2, + 15 + ], + "to": [ + 10, + 6, + 16 + ] + }, + { + "faces": { + "east": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + }, + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + }, + "up": { + "texture": "#candle", + "uv": [ + 0.0, + 6.0, + 2.0, + 8.0 + ] + }, + "west": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + } + }, + "from": [ + 2, + 8, + 11 + ], + "to": [ + 4, + 12, + 13 + ] + }, + { + "faces": { + "east": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + }, + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + }, + "up": { + "texture": "#candle", + "uv": [ + 0.0, + 6.0, + 2.0, + 8.0 + ] + }, + "west": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + } + }, + "from": [ + 7, + 8, + 11 + ], + "to": [ + 9, + 12, + 13 + ] + }, + { + "faces": { + "east": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + }, + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + }, + "up": { + "texture": "#candle", + "uv": [ + 0.0, + 6.0, + 2.0, + 8.0 + ] + }, + "west": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + } + }, + "from": [ + 12, + 8, + 11 + ], + "to": [ + 14, + 12, + 13 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 2.5, + 12, + 12 + ], + "rotation": { + "angle": 45.0, + "axis": "y", + "origin": [ + 3, + 12, + 12 + ] + }, + "to": [ + 3.5, + 13, + 12 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 2.5, + 12, + 12 + ], + "rotation": { + "angle": -45.0, + "axis": "y", + "origin": [ + 3, + 12, + 12 + ] + }, + "to": [ + 3.5, + 13, + 12 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 7.5, + 12, + 12 + ], + "rotation": { + "angle": 45.0, + "axis": "y", + "origin": [ + 8, + 12, + 12 + ] + }, + "to": [ + 8.5, + 13, + 12 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 7.5, + 12, + 12 + ], + "rotation": { + "angle": -45.0, + "axis": "y", + "origin": [ + 8, + 12, + 12 + ] + }, + "to": [ + 8.5, + 13, + 12 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 12.5, + 12, + 12 + ], + "rotation": { + "angle": 45.0, + "axis": "y", + "origin": [ + 13, + 12, + 12 + ] + }, + "to": [ + 13.5, + 13, + 12 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 12.5, + 12, + 12 + ], + "rotation": { + "angle": -45.0, + "axis": "y", + "origin": [ + 13, + 12, + 12 + ] + }, + "to": [ + 13.5, + 13, + 12 + ] + } + ], + "render_type": "minecraft:cutout", + "textures": { + "candelabra": "twilightforest:block/candelabra", + "particle": "#candelabra" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/candelabra_wall_4_4_4_plain.json b/src/generated/resources/assets/twilightforest/models/block/candelabra_wall_4_4_4_plain.json new file mode 100644 index 0000000000..3cee2e2a5a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/candelabra_wall_4_4_4_plain.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/candelabra_wall_4_4_4", + "render_type": "minecraft:cutout", + "textures": { + "candle": "minecraft:block/candle" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/candelabra_wall_4_4_4_plain_lit.json b/src/generated/resources/assets/twilightforest/models/block/candelabra_wall_4_4_4_plain_lit.json new file mode 100644 index 0000000000..d3f8064e4a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/candelabra_wall_4_4_4_plain_lit.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/candelabra_wall_4_4_4", + "render_type": "minecraft:cutout", + "textures": { + "candle": "minecraft:block/candle_lit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/candelabra_wall_4_4_5.json b/src/generated/resources/assets/twilightforest/models/block/candelabra_wall_4_4_5.json new file mode 100644 index 0000000000..4c7fb5b2d4 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/candelabra_wall_4_4_5.json @@ -0,0 +1,769 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "north": { + "texture": "#candelabra", + "uv": [ + 0.0, + 0.0, + 16.0, + 6.0 + ] + }, + "south": { + "texture": "#candelabra", + "uv": [ + 16.0, + 0.0, + 0.0, + 6.0 + ] + } + }, + "from": [ + 0, + 1, + 12 + ], + "to": [ + 16, + 7, + 12 + ] + }, + { + "faces": { + "east": { + "texture": "#candelabra", + "uv": [ + 0.0, + 6.0, + 6.0, + 12.0 + ] + }, + "west": { + "texture": "#candelabra", + "uv": [ + 6.0, + 6.0, + 0.0, + 12.0 + ] + } + }, + "from": [ + 8, + 1, + 9 + ], + "to": [ + 8, + 7, + 15 + ] + }, + { + "faces": { + "down": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "east": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "north": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "south": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "up": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "west": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + } + }, + "from": [ + 1, + 7, + 10 + ], + "to": [ + 5, + 8, + 14 + ] + }, + { + "faces": { + "down": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "east": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "north": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "south": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "up": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "west": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + } + }, + "from": [ + 6, + 7, + 10 + ], + "to": [ + 10, + 8, + 14 + ] + }, + { + "faces": { + "down": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "east": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "north": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "south": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "up": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "west": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + } + }, + "from": [ + 11, + 7, + 10 + ], + "to": [ + 15, + 8, + 14 + ] + }, + { + "faces": { + "down": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "east": { + "texture": "#candelabra", + "uv": [ + 3.0, + 12.0, + 4.0, + 16.0 + ] + }, + "north": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "south": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "up": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "west": { + "texture": "#candelabra", + "uv": [ + 3.0, + 12.0, + 4.0, + 16.0 + ] + } + }, + "from": [ + 6, + 2, + 15 + ], + "to": [ + 10, + 6, + 16 + ] + }, + { + "faces": { + "east": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + }, + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + }, + "up": { + "texture": "#candle", + "uv": [ + 0.0, + 6.0, + 2.0, + 8.0 + ] + }, + "west": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + } + }, + "from": [ + 2, + 8, + 11 + ], + "to": [ + 4, + 12, + 13 + ] + }, + { + "faces": { + "east": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + }, + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + }, + "up": { + "texture": "#candle", + "uv": [ + 0.0, + 6.0, + 2.0, + 8.0 + ] + }, + "west": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + } + }, + "from": [ + 7, + 8, + 11 + ], + "to": [ + 9, + 12, + 13 + ] + }, + { + "faces": { + "east": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + }, + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + }, + "up": { + "texture": "#candle", + "uv": [ + 0.0, + 6.0, + 2.0, + 8.0 + ] + }, + "west": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + } + }, + "from": [ + 12, + 8, + 11 + ], + "to": [ + 14, + 13, + 13 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 2.5, + 12, + 12 + ], + "rotation": { + "angle": 45.0, + "axis": "y", + "origin": [ + 3, + 12, + 12 + ] + }, + "to": [ + 3.5, + 13, + 12 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 2.5, + 12, + 12 + ], + "rotation": { + "angle": -45.0, + "axis": "y", + "origin": [ + 3, + 12, + 12 + ] + }, + "to": [ + 3.5, + 13, + 12 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 7.5, + 12, + 12 + ], + "rotation": { + "angle": 45.0, + "axis": "y", + "origin": [ + 8, + 12, + 12 + ] + }, + "to": [ + 8.5, + 13, + 12 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 7.5, + 12, + 12 + ], + "rotation": { + "angle": -45.0, + "axis": "y", + "origin": [ + 8, + 12, + 12 + ] + }, + "to": [ + 8.5, + 13, + 12 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 12.5, + 13, + 12 + ], + "rotation": { + "angle": 45.0, + "axis": "y", + "origin": [ + 13, + 13, + 12 + ] + }, + "to": [ + 13.5, + 14, + 12 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 12.5, + 13, + 12 + ], + "rotation": { + "angle": -45.0, + "axis": "y", + "origin": [ + 13, + 13, + 12 + ] + }, + "to": [ + 13.5, + 14, + 12 + ] + } + ], + "render_type": "minecraft:cutout", + "textures": { + "candelabra": "twilightforest:block/candelabra", + "particle": "#candelabra" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/candelabra_wall_4_4_5_plain.json b/src/generated/resources/assets/twilightforest/models/block/candelabra_wall_4_4_5_plain.json new file mode 100644 index 0000000000..748a188a83 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/candelabra_wall_4_4_5_plain.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/candelabra_wall_4_4_5", + "render_type": "minecraft:cutout", + "textures": { + "candle": "minecraft:block/candle" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/candelabra_wall_4_4_5_plain_lit.json b/src/generated/resources/assets/twilightforest/models/block/candelabra_wall_4_4_5_plain_lit.json new file mode 100644 index 0000000000..b882c7d2cc --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/candelabra_wall_4_4_5_plain_lit.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/candelabra_wall_4_4_5", + "render_type": "minecraft:cutout", + "textures": { + "candle": "minecraft:block/candle_lit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/candelabra_wall_4_5_4.json b/src/generated/resources/assets/twilightforest/models/block/candelabra_wall_4_5_4.json new file mode 100644 index 0000000000..888b330cc0 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/candelabra_wall_4_5_4.json @@ -0,0 +1,769 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "north": { + "texture": "#candelabra", + "uv": [ + 0.0, + 0.0, + 16.0, + 6.0 + ] + }, + "south": { + "texture": "#candelabra", + "uv": [ + 16.0, + 0.0, + 0.0, + 6.0 + ] + } + }, + "from": [ + 0, + 1, + 12 + ], + "to": [ + 16, + 7, + 12 + ] + }, + { + "faces": { + "east": { + "texture": "#candelabra", + "uv": [ + 0.0, + 6.0, + 6.0, + 12.0 + ] + }, + "west": { + "texture": "#candelabra", + "uv": [ + 6.0, + 6.0, + 0.0, + 12.0 + ] + } + }, + "from": [ + 8, + 1, + 9 + ], + "to": [ + 8, + 7, + 15 + ] + }, + { + "faces": { + "down": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "east": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "north": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "south": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "up": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "west": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + } + }, + "from": [ + 1, + 7, + 10 + ], + "to": [ + 5, + 8, + 14 + ] + }, + { + "faces": { + "down": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "east": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "north": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "south": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "up": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "west": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + } + }, + "from": [ + 6, + 7, + 10 + ], + "to": [ + 10, + 8, + 14 + ] + }, + { + "faces": { + "down": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "east": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "north": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "south": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "up": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "west": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + } + }, + "from": [ + 11, + 7, + 10 + ], + "to": [ + 15, + 8, + 14 + ] + }, + { + "faces": { + "down": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "east": { + "texture": "#candelabra", + "uv": [ + 3.0, + 12.0, + 4.0, + 16.0 + ] + }, + "north": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "south": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "up": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "west": { + "texture": "#candelabra", + "uv": [ + 3.0, + 12.0, + 4.0, + 16.0 + ] + } + }, + "from": [ + 6, + 2, + 15 + ], + "to": [ + 10, + 6, + 16 + ] + }, + { + "faces": { + "east": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + }, + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + }, + "up": { + "texture": "#candle", + "uv": [ + 0.0, + 6.0, + 2.0, + 8.0 + ] + }, + "west": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + } + }, + "from": [ + 2, + 8, + 11 + ], + "to": [ + 4, + 12, + 13 + ] + }, + { + "faces": { + "east": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + }, + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + }, + "up": { + "texture": "#candle", + "uv": [ + 0.0, + 6.0, + 2.0, + 8.0 + ] + }, + "west": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + } + }, + "from": [ + 7, + 8, + 11 + ], + "to": [ + 9, + 13, + 13 + ] + }, + { + "faces": { + "east": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + }, + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + }, + "up": { + "texture": "#candle", + "uv": [ + 0.0, + 6.0, + 2.0, + 8.0 + ] + }, + "west": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + } + }, + "from": [ + 12, + 8, + 11 + ], + "to": [ + 14, + 12, + 13 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 2.5, + 12, + 12 + ], + "rotation": { + "angle": 45.0, + "axis": "y", + "origin": [ + 3, + 12, + 12 + ] + }, + "to": [ + 3.5, + 13, + 12 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 2.5, + 12, + 12 + ], + "rotation": { + "angle": -45.0, + "axis": "y", + "origin": [ + 3, + 12, + 12 + ] + }, + "to": [ + 3.5, + 13, + 12 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 7.5, + 13, + 12 + ], + "rotation": { + "angle": 45.0, + "axis": "y", + "origin": [ + 8, + 13, + 12 + ] + }, + "to": [ + 8.5, + 14, + 12 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 7.5, + 13, + 12 + ], + "rotation": { + "angle": -45.0, + "axis": "y", + "origin": [ + 8, + 13, + 12 + ] + }, + "to": [ + 8.5, + 14, + 12 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 12.5, + 12, + 12 + ], + "rotation": { + "angle": 45.0, + "axis": "y", + "origin": [ + 13, + 12, + 12 + ] + }, + "to": [ + 13.5, + 13, + 12 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 12.5, + 12, + 12 + ], + "rotation": { + "angle": -45.0, + "axis": "y", + "origin": [ + 13, + 12, + 12 + ] + }, + "to": [ + 13.5, + 13, + 12 + ] + } + ], + "render_type": "minecraft:cutout", + "textures": { + "candelabra": "twilightforest:block/candelabra", + "particle": "#candelabra" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/candelabra_wall_4_5_4_plain.json b/src/generated/resources/assets/twilightforest/models/block/candelabra_wall_4_5_4_plain.json new file mode 100644 index 0000000000..3682dc2078 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/candelabra_wall_4_5_4_plain.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/candelabra_wall_4_5_4", + "render_type": "minecraft:cutout", + "textures": { + "candle": "minecraft:block/candle" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/candelabra_wall_4_5_4_plain_lit.json b/src/generated/resources/assets/twilightforest/models/block/candelabra_wall_4_5_4_plain_lit.json new file mode 100644 index 0000000000..dd7c93ba0b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/candelabra_wall_4_5_4_plain_lit.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/candelabra_wall_4_5_4", + "render_type": "minecraft:cutout", + "textures": { + "candle": "minecraft:block/candle_lit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/candelabra_wall_4_5_5.json b/src/generated/resources/assets/twilightforest/models/block/candelabra_wall_4_5_5.json new file mode 100644 index 0000000000..3d0f45e0f8 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/candelabra_wall_4_5_5.json @@ -0,0 +1,769 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "north": { + "texture": "#candelabra", + "uv": [ + 0.0, + 0.0, + 16.0, + 6.0 + ] + }, + "south": { + "texture": "#candelabra", + "uv": [ + 16.0, + 0.0, + 0.0, + 6.0 + ] + } + }, + "from": [ + 0, + 1, + 12 + ], + "to": [ + 16, + 7, + 12 + ] + }, + { + "faces": { + "east": { + "texture": "#candelabra", + "uv": [ + 0.0, + 6.0, + 6.0, + 12.0 + ] + }, + "west": { + "texture": "#candelabra", + "uv": [ + 6.0, + 6.0, + 0.0, + 12.0 + ] + } + }, + "from": [ + 8, + 1, + 9 + ], + "to": [ + 8, + 7, + 15 + ] + }, + { + "faces": { + "down": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "east": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "north": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "south": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "up": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "west": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + } + }, + "from": [ + 1, + 7, + 10 + ], + "to": [ + 5, + 8, + 14 + ] + }, + { + "faces": { + "down": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "east": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "north": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "south": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "up": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "west": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + } + }, + "from": [ + 6, + 7, + 10 + ], + "to": [ + 10, + 8, + 14 + ] + }, + { + "faces": { + "down": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "east": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "north": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "south": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "up": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "west": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + } + }, + "from": [ + 11, + 7, + 10 + ], + "to": [ + 15, + 8, + 14 + ] + }, + { + "faces": { + "down": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "east": { + "texture": "#candelabra", + "uv": [ + 3.0, + 12.0, + 4.0, + 16.0 + ] + }, + "north": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "south": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "up": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "west": { + "texture": "#candelabra", + "uv": [ + 3.0, + 12.0, + 4.0, + 16.0 + ] + } + }, + "from": [ + 6, + 2, + 15 + ], + "to": [ + 10, + 6, + 16 + ] + }, + { + "faces": { + "east": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + }, + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + }, + "up": { + "texture": "#candle", + "uv": [ + 0.0, + 6.0, + 2.0, + 8.0 + ] + }, + "west": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + } + }, + "from": [ + 2, + 8, + 11 + ], + "to": [ + 4, + 12, + 13 + ] + }, + { + "faces": { + "east": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + }, + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + }, + "up": { + "texture": "#candle", + "uv": [ + 0.0, + 6.0, + 2.0, + 8.0 + ] + }, + "west": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + } + }, + "from": [ + 7, + 8, + 11 + ], + "to": [ + 9, + 13, + 13 + ] + }, + { + "faces": { + "east": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + }, + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + }, + "up": { + "texture": "#candle", + "uv": [ + 0.0, + 6.0, + 2.0, + 8.0 + ] + }, + "west": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + } + }, + "from": [ + 12, + 8, + 11 + ], + "to": [ + 14, + 13, + 13 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 2.5, + 12, + 12 + ], + "rotation": { + "angle": 45.0, + "axis": "y", + "origin": [ + 3, + 12, + 12 + ] + }, + "to": [ + 3.5, + 13, + 12 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 2.5, + 12, + 12 + ], + "rotation": { + "angle": -45.0, + "axis": "y", + "origin": [ + 3, + 12, + 12 + ] + }, + "to": [ + 3.5, + 13, + 12 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 7.5, + 13, + 12 + ], + "rotation": { + "angle": 45.0, + "axis": "y", + "origin": [ + 8, + 13, + 12 + ] + }, + "to": [ + 8.5, + 14, + 12 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 7.5, + 13, + 12 + ], + "rotation": { + "angle": -45.0, + "axis": "y", + "origin": [ + 8, + 13, + 12 + ] + }, + "to": [ + 8.5, + 14, + 12 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 12.5, + 13, + 12 + ], + "rotation": { + "angle": 45.0, + "axis": "y", + "origin": [ + 13, + 13, + 12 + ] + }, + "to": [ + 13.5, + 14, + 12 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 12.5, + 13, + 12 + ], + "rotation": { + "angle": -45.0, + "axis": "y", + "origin": [ + 13, + 13, + 12 + ] + }, + "to": [ + 13.5, + 14, + 12 + ] + } + ], + "render_type": "minecraft:cutout", + "textures": { + "candelabra": "twilightforest:block/candelabra", + "particle": "#candelabra" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/candelabra_wall_4_5_5_plain.json b/src/generated/resources/assets/twilightforest/models/block/candelabra_wall_4_5_5_plain.json new file mode 100644 index 0000000000..1cb7d30d6f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/candelabra_wall_4_5_5_plain.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/candelabra_wall_4_5_5", + "render_type": "minecraft:cutout", + "textures": { + "candle": "minecraft:block/candle" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/candelabra_wall_4_5_5_plain_lit.json b/src/generated/resources/assets/twilightforest/models/block/candelabra_wall_4_5_5_plain_lit.json new file mode 100644 index 0000000000..fdd9811986 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/candelabra_wall_4_5_5_plain_lit.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/candelabra_wall_4_5_5", + "render_type": "minecraft:cutout", + "textures": { + "candle": "minecraft:block/candle_lit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/candelabra_wall_5_4_4.json b/src/generated/resources/assets/twilightforest/models/block/candelabra_wall_5_4_4.json new file mode 100644 index 0000000000..3acb146b53 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/candelabra_wall_5_4_4.json @@ -0,0 +1,769 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "north": { + "texture": "#candelabra", + "uv": [ + 0.0, + 0.0, + 16.0, + 6.0 + ] + }, + "south": { + "texture": "#candelabra", + "uv": [ + 16.0, + 0.0, + 0.0, + 6.0 + ] + } + }, + "from": [ + 0, + 1, + 12 + ], + "to": [ + 16, + 7, + 12 + ] + }, + { + "faces": { + "east": { + "texture": "#candelabra", + "uv": [ + 0.0, + 6.0, + 6.0, + 12.0 + ] + }, + "west": { + "texture": "#candelabra", + "uv": [ + 6.0, + 6.0, + 0.0, + 12.0 + ] + } + }, + "from": [ + 8, + 1, + 9 + ], + "to": [ + 8, + 7, + 15 + ] + }, + { + "faces": { + "down": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "east": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "north": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "south": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "up": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "west": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + } + }, + "from": [ + 1, + 7, + 10 + ], + "to": [ + 5, + 8, + 14 + ] + }, + { + "faces": { + "down": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "east": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "north": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "south": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "up": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "west": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + } + }, + "from": [ + 6, + 7, + 10 + ], + "to": [ + 10, + 8, + 14 + ] + }, + { + "faces": { + "down": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "east": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "north": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "south": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "up": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "west": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + } + }, + "from": [ + 11, + 7, + 10 + ], + "to": [ + 15, + 8, + 14 + ] + }, + { + "faces": { + "down": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "east": { + "texture": "#candelabra", + "uv": [ + 3.0, + 12.0, + 4.0, + 16.0 + ] + }, + "north": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "south": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "up": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "west": { + "texture": "#candelabra", + "uv": [ + 3.0, + 12.0, + 4.0, + 16.0 + ] + } + }, + "from": [ + 6, + 2, + 15 + ], + "to": [ + 10, + 6, + 16 + ] + }, + { + "faces": { + "east": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + }, + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + }, + "up": { + "texture": "#candle", + "uv": [ + 0.0, + 6.0, + 2.0, + 8.0 + ] + }, + "west": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + } + }, + "from": [ + 2, + 8, + 11 + ], + "to": [ + 4, + 13, + 13 + ] + }, + { + "faces": { + "east": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + }, + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + }, + "up": { + "texture": "#candle", + "uv": [ + 0.0, + 6.0, + 2.0, + 8.0 + ] + }, + "west": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + } + }, + "from": [ + 7, + 8, + 11 + ], + "to": [ + 9, + 12, + 13 + ] + }, + { + "faces": { + "east": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + }, + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + }, + "up": { + "texture": "#candle", + "uv": [ + 0.0, + 6.0, + 2.0, + 8.0 + ] + }, + "west": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + } + }, + "from": [ + 12, + 8, + 11 + ], + "to": [ + 14, + 12, + 13 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 2.5, + 13, + 12 + ], + "rotation": { + "angle": 45.0, + "axis": "y", + "origin": [ + 3, + 13, + 12 + ] + }, + "to": [ + 3.5, + 14, + 12 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 2.5, + 13, + 12 + ], + "rotation": { + "angle": -45.0, + "axis": "y", + "origin": [ + 3, + 13, + 12 + ] + }, + "to": [ + 3.5, + 14, + 12 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 7.5, + 12, + 12 + ], + "rotation": { + "angle": 45.0, + "axis": "y", + "origin": [ + 8, + 12, + 12 + ] + }, + "to": [ + 8.5, + 13, + 12 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 7.5, + 12, + 12 + ], + "rotation": { + "angle": -45.0, + "axis": "y", + "origin": [ + 8, + 12, + 12 + ] + }, + "to": [ + 8.5, + 13, + 12 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 12.5, + 12, + 12 + ], + "rotation": { + "angle": 45.0, + "axis": "y", + "origin": [ + 13, + 12, + 12 + ] + }, + "to": [ + 13.5, + 13, + 12 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 12.5, + 12, + 12 + ], + "rotation": { + "angle": -45.0, + "axis": "y", + "origin": [ + 13, + 12, + 12 + ] + }, + "to": [ + 13.5, + 13, + 12 + ] + } + ], + "render_type": "minecraft:cutout", + "textures": { + "candelabra": "twilightforest:block/candelabra", + "particle": "#candelabra" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/candelabra_wall_5_4_4_plain.json b/src/generated/resources/assets/twilightforest/models/block/candelabra_wall_5_4_4_plain.json new file mode 100644 index 0000000000..a09fa678f9 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/candelabra_wall_5_4_4_plain.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/candelabra_wall_5_4_4", + "render_type": "minecraft:cutout", + "textures": { + "candle": "minecraft:block/candle" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/candelabra_wall_5_4_4_plain_lit.json b/src/generated/resources/assets/twilightforest/models/block/candelabra_wall_5_4_4_plain_lit.json new file mode 100644 index 0000000000..479f5e0a45 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/candelabra_wall_5_4_4_plain_lit.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/candelabra_wall_5_4_4", + "render_type": "minecraft:cutout", + "textures": { + "candle": "minecraft:block/candle_lit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/candelabra_wall_5_4_5.json b/src/generated/resources/assets/twilightforest/models/block/candelabra_wall_5_4_5.json new file mode 100644 index 0000000000..c17c924e89 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/candelabra_wall_5_4_5.json @@ -0,0 +1,769 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "north": { + "texture": "#candelabra", + "uv": [ + 0.0, + 0.0, + 16.0, + 6.0 + ] + }, + "south": { + "texture": "#candelabra", + "uv": [ + 16.0, + 0.0, + 0.0, + 6.0 + ] + } + }, + "from": [ + 0, + 1, + 12 + ], + "to": [ + 16, + 7, + 12 + ] + }, + { + "faces": { + "east": { + "texture": "#candelabra", + "uv": [ + 0.0, + 6.0, + 6.0, + 12.0 + ] + }, + "west": { + "texture": "#candelabra", + "uv": [ + 6.0, + 6.0, + 0.0, + 12.0 + ] + } + }, + "from": [ + 8, + 1, + 9 + ], + "to": [ + 8, + 7, + 15 + ] + }, + { + "faces": { + "down": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "east": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "north": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "south": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "up": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "west": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + } + }, + "from": [ + 1, + 7, + 10 + ], + "to": [ + 5, + 8, + 14 + ] + }, + { + "faces": { + "down": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "east": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "north": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "south": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "up": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "west": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + } + }, + "from": [ + 6, + 7, + 10 + ], + "to": [ + 10, + 8, + 14 + ] + }, + { + "faces": { + "down": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "east": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "north": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "south": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "up": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "west": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + } + }, + "from": [ + 11, + 7, + 10 + ], + "to": [ + 15, + 8, + 14 + ] + }, + { + "faces": { + "down": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "east": { + "texture": "#candelabra", + "uv": [ + 3.0, + 12.0, + 4.0, + 16.0 + ] + }, + "north": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "south": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "up": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "west": { + "texture": "#candelabra", + "uv": [ + 3.0, + 12.0, + 4.0, + 16.0 + ] + } + }, + "from": [ + 6, + 2, + 15 + ], + "to": [ + 10, + 6, + 16 + ] + }, + { + "faces": { + "east": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + }, + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + }, + "up": { + "texture": "#candle", + "uv": [ + 0.0, + 6.0, + 2.0, + 8.0 + ] + }, + "west": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + } + }, + "from": [ + 2, + 8, + 11 + ], + "to": [ + 4, + 13, + 13 + ] + }, + { + "faces": { + "east": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + }, + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + }, + "up": { + "texture": "#candle", + "uv": [ + 0.0, + 6.0, + 2.0, + 8.0 + ] + }, + "west": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + } + }, + "from": [ + 7, + 8, + 11 + ], + "to": [ + 9, + 12, + 13 + ] + }, + { + "faces": { + "east": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + }, + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + }, + "up": { + "texture": "#candle", + "uv": [ + 0.0, + 6.0, + 2.0, + 8.0 + ] + }, + "west": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + } + }, + "from": [ + 12, + 8, + 11 + ], + "to": [ + 14, + 13, + 13 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 2.5, + 13, + 12 + ], + "rotation": { + "angle": 45.0, + "axis": "y", + "origin": [ + 3, + 13, + 12 + ] + }, + "to": [ + 3.5, + 14, + 12 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 2.5, + 13, + 12 + ], + "rotation": { + "angle": -45.0, + "axis": "y", + "origin": [ + 3, + 13, + 12 + ] + }, + "to": [ + 3.5, + 14, + 12 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 7.5, + 12, + 12 + ], + "rotation": { + "angle": 45.0, + "axis": "y", + "origin": [ + 8, + 12, + 12 + ] + }, + "to": [ + 8.5, + 13, + 12 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 7.5, + 12, + 12 + ], + "rotation": { + "angle": -45.0, + "axis": "y", + "origin": [ + 8, + 12, + 12 + ] + }, + "to": [ + 8.5, + 13, + 12 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 12.5, + 13, + 12 + ], + "rotation": { + "angle": 45.0, + "axis": "y", + "origin": [ + 13, + 13, + 12 + ] + }, + "to": [ + 13.5, + 14, + 12 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 12.5, + 13, + 12 + ], + "rotation": { + "angle": -45.0, + "axis": "y", + "origin": [ + 13, + 13, + 12 + ] + }, + "to": [ + 13.5, + 14, + 12 + ] + } + ], + "render_type": "minecraft:cutout", + "textures": { + "candelabra": "twilightforest:block/candelabra", + "particle": "#candelabra" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/candelabra_wall_5_4_5_plain.json b/src/generated/resources/assets/twilightforest/models/block/candelabra_wall_5_4_5_plain.json new file mode 100644 index 0000000000..f98cacdb8e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/candelabra_wall_5_4_5_plain.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/candelabra_wall_5_4_5", + "render_type": "minecraft:cutout", + "textures": { + "candle": "minecraft:block/candle" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/candelabra_wall_5_4_5_plain_lit.json b/src/generated/resources/assets/twilightforest/models/block/candelabra_wall_5_4_5_plain_lit.json new file mode 100644 index 0000000000..72775bc609 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/candelabra_wall_5_4_5_plain_lit.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/candelabra_wall_5_4_5", + "render_type": "minecraft:cutout", + "textures": { + "candle": "minecraft:block/candle_lit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/candelabra_wall_5_5_4.json b/src/generated/resources/assets/twilightforest/models/block/candelabra_wall_5_5_4.json new file mode 100644 index 0000000000..7764688b55 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/candelabra_wall_5_5_4.json @@ -0,0 +1,769 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "north": { + "texture": "#candelabra", + "uv": [ + 0.0, + 0.0, + 16.0, + 6.0 + ] + }, + "south": { + "texture": "#candelabra", + "uv": [ + 16.0, + 0.0, + 0.0, + 6.0 + ] + } + }, + "from": [ + 0, + 1, + 12 + ], + "to": [ + 16, + 7, + 12 + ] + }, + { + "faces": { + "east": { + "texture": "#candelabra", + "uv": [ + 0.0, + 6.0, + 6.0, + 12.0 + ] + }, + "west": { + "texture": "#candelabra", + "uv": [ + 6.0, + 6.0, + 0.0, + 12.0 + ] + } + }, + "from": [ + 8, + 1, + 9 + ], + "to": [ + 8, + 7, + 15 + ] + }, + { + "faces": { + "down": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "east": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "north": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "south": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "up": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "west": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + } + }, + "from": [ + 1, + 7, + 10 + ], + "to": [ + 5, + 8, + 14 + ] + }, + { + "faces": { + "down": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "east": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "north": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "south": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "up": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "west": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + } + }, + "from": [ + 6, + 7, + 10 + ], + "to": [ + 10, + 8, + 14 + ] + }, + { + "faces": { + "down": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "east": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "north": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "south": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "up": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "west": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + } + }, + "from": [ + 11, + 7, + 10 + ], + "to": [ + 15, + 8, + 14 + ] + }, + { + "faces": { + "down": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "east": { + "texture": "#candelabra", + "uv": [ + 3.0, + 12.0, + 4.0, + 16.0 + ] + }, + "north": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "south": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "up": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "west": { + "texture": "#candelabra", + "uv": [ + 3.0, + 12.0, + 4.0, + 16.0 + ] + } + }, + "from": [ + 6, + 2, + 15 + ], + "to": [ + 10, + 6, + 16 + ] + }, + { + "faces": { + "east": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + }, + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + }, + "up": { + "texture": "#candle", + "uv": [ + 0.0, + 6.0, + 2.0, + 8.0 + ] + }, + "west": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + } + }, + "from": [ + 2, + 8, + 11 + ], + "to": [ + 4, + 13, + 13 + ] + }, + { + "faces": { + "east": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + }, + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + }, + "up": { + "texture": "#candle", + "uv": [ + 0.0, + 6.0, + 2.0, + 8.0 + ] + }, + "west": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + } + }, + "from": [ + 7, + 8, + 11 + ], + "to": [ + 9, + 13, + 13 + ] + }, + { + "faces": { + "east": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + }, + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + }, + "up": { + "texture": "#candle", + "uv": [ + 0.0, + 6.0, + 2.0, + 8.0 + ] + }, + "west": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 12.0 + ] + } + }, + "from": [ + 12, + 8, + 11 + ], + "to": [ + 14, + 12, + 13 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 2.5, + 13, + 12 + ], + "rotation": { + "angle": 45.0, + "axis": "y", + "origin": [ + 3, + 13, + 12 + ] + }, + "to": [ + 3.5, + 14, + 12 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 2.5, + 13, + 12 + ], + "rotation": { + "angle": -45.0, + "axis": "y", + "origin": [ + 3, + 13, + 12 + ] + }, + "to": [ + 3.5, + 14, + 12 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 7.5, + 13, + 12 + ], + "rotation": { + "angle": 45.0, + "axis": "y", + "origin": [ + 8, + 13, + 12 + ] + }, + "to": [ + 8.5, + 14, + 12 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 7.5, + 13, + 12 + ], + "rotation": { + "angle": -45.0, + "axis": "y", + "origin": [ + 8, + 13, + 12 + ] + }, + "to": [ + 8.5, + 14, + 12 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 12.5, + 12, + 12 + ], + "rotation": { + "angle": 45.0, + "axis": "y", + "origin": [ + 13, + 12, + 12 + ] + }, + "to": [ + 13.5, + 13, + 12 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 12.5, + 12, + 12 + ], + "rotation": { + "angle": -45.0, + "axis": "y", + "origin": [ + 13, + 12, + 12 + ] + }, + "to": [ + 13.5, + 13, + 12 + ] + } + ], + "render_type": "minecraft:cutout", + "textures": { + "candelabra": "twilightforest:block/candelabra", + "particle": "#candelabra" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/candelabra_wall_5_5_4_plain.json b/src/generated/resources/assets/twilightforest/models/block/candelabra_wall_5_5_4_plain.json new file mode 100644 index 0000000000..d728f7739d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/candelabra_wall_5_5_4_plain.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/candelabra_wall_5_5_4", + "render_type": "minecraft:cutout", + "textures": { + "candle": "minecraft:block/candle" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/candelabra_wall_5_5_4_plain_lit.json b/src/generated/resources/assets/twilightforest/models/block/candelabra_wall_5_5_4_plain_lit.json new file mode 100644 index 0000000000..75418cf1c3 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/candelabra_wall_5_5_4_plain_lit.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/candelabra_wall_5_5_4", + "render_type": "minecraft:cutout", + "textures": { + "candle": "minecraft:block/candle_lit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/candelabra_wall_5_5_5.json b/src/generated/resources/assets/twilightforest/models/block/candelabra_wall_5_5_5.json new file mode 100644 index 0000000000..62ac92de55 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/candelabra_wall_5_5_5.json @@ -0,0 +1,769 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "north": { + "texture": "#candelabra", + "uv": [ + 0.0, + 0.0, + 16.0, + 6.0 + ] + }, + "south": { + "texture": "#candelabra", + "uv": [ + 16.0, + 0.0, + 0.0, + 6.0 + ] + } + }, + "from": [ + 0, + 1, + 12 + ], + "to": [ + 16, + 7, + 12 + ] + }, + { + "faces": { + "east": { + "texture": "#candelabra", + "uv": [ + 0.0, + 6.0, + 6.0, + 12.0 + ] + }, + "west": { + "texture": "#candelabra", + "uv": [ + 6.0, + 6.0, + 0.0, + 12.0 + ] + } + }, + "from": [ + 8, + 1, + 9 + ], + "to": [ + 8, + 7, + 15 + ] + }, + { + "faces": { + "down": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "east": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "north": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "south": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "up": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "west": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + } + }, + "from": [ + 1, + 7, + 10 + ], + "to": [ + 5, + 8, + 14 + ] + }, + { + "faces": { + "down": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "east": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "north": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "south": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "up": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "west": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + } + }, + "from": [ + 6, + 7, + 10 + ], + "to": [ + 10, + 8, + 14 + ] + }, + { + "faces": { + "down": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "east": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "north": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "south": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "up": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "west": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + } + }, + "from": [ + 11, + 7, + 10 + ], + "to": [ + 15, + 8, + 14 + ] + }, + { + "faces": { + "down": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "east": { + "texture": "#candelabra", + "uv": [ + 3.0, + 12.0, + 4.0, + 16.0 + ] + }, + "north": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "south": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 16.0 + ] + }, + "up": { + "texture": "#candelabra", + "uv": [ + 0.0, + 12.0, + 4.0, + 13.0 + ] + }, + "west": { + "texture": "#candelabra", + "uv": [ + 3.0, + 12.0, + 4.0, + 16.0 + ] + } + }, + "from": [ + 6, + 2, + 15 + ], + "to": [ + 10, + 6, + 16 + ] + }, + { + "faces": { + "east": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + }, + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + }, + "up": { + "texture": "#candle", + "uv": [ + 0.0, + 6.0, + 2.0, + 8.0 + ] + }, + "west": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + } + }, + "from": [ + 2, + 8, + 11 + ], + "to": [ + 4, + 13, + 13 + ] + }, + { + "faces": { + "east": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + }, + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + }, + "up": { + "texture": "#candle", + "uv": [ + 0.0, + 6.0, + 2.0, + 8.0 + ] + }, + "west": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + } + }, + "from": [ + 7, + 8, + 11 + ], + "to": [ + 9, + 13, + 13 + ] + }, + { + "faces": { + "east": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + }, + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + }, + "up": { + "texture": "#candle", + "uv": [ + 0.0, + 6.0, + 2.0, + 8.0 + ] + }, + "west": { + "texture": "#candle", + "uv": [ + 0.0, + 8.0, + 2.0, + 13.0 + ] + } + }, + "from": [ + 12, + 8, + 11 + ], + "to": [ + 14, + 13, + 13 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 2.5, + 13, + 12 + ], + "rotation": { + "angle": 45.0, + "axis": "y", + "origin": [ + 3, + 13, + 12 + ] + }, + "to": [ + 3.5, + 14, + 12 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 2.5, + 13, + 12 + ], + "rotation": { + "angle": -45.0, + "axis": "y", + "origin": [ + 3, + 13, + 12 + ] + }, + "to": [ + 3.5, + 14, + 12 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 7.5, + 13, + 12 + ], + "rotation": { + "angle": 45.0, + "axis": "y", + "origin": [ + 8, + 13, + 12 + ] + }, + "to": [ + 8.5, + 14, + 12 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 7.5, + 13, + 12 + ], + "rotation": { + "angle": -45.0, + "axis": "y", + "origin": [ + 8, + 13, + 12 + ] + }, + "to": [ + 8.5, + 14, + 12 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 12.5, + 13, + 12 + ], + "rotation": { + "angle": 45.0, + "axis": "y", + "origin": [ + 13, + 13, + 12 + ] + }, + "to": [ + 13.5, + 14, + 12 + ] + }, + { + "faces": { + "north": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + }, + "south": { + "texture": "#candle", + "uv": [ + 0.0, + 5.0, + 1.0, + 6.0 + ] + } + }, + "from": [ + 12.5, + 13, + 12 + ], + "rotation": { + "angle": -45.0, + "axis": "y", + "origin": [ + 13, + 13, + 12 + ] + }, + "to": [ + 13.5, + 14, + 12 + ] + } + ], + "render_type": "minecraft:cutout", + "textures": { + "candelabra": "twilightforest:block/candelabra", + "particle": "#candelabra" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/candelabra_wall_5_5_5_plain.json b/src/generated/resources/assets/twilightforest/models/block/candelabra_wall_5_5_5_plain.json new file mode 100644 index 0000000000..1f6fed484e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/candelabra_wall_5_5_5_plain.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/candelabra_wall_5_5_5", + "render_type": "minecraft:cutout", + "textures": { + "candle": "minecraft:block/candle" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/candelabra_wall_5_5_5_plain_lit.json b/src/generated/resources/assets/twilightforest/models/block/candelabra_wall_5_5_5_plain_lit.json new file mode 100644 index 0000000000..003ef901e0 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/candelabra_wall_5_5_5_plain_lit.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/candelabra_wall_5_5_5", + "render_type": "minecraft:cutout", + "textures": { + "candle": "minecraft:block/candle_lit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/canopy_bookshelf.json b/src/generated/resources/assets/twilightforest/models/block/canopy_bookshelf.json new file mode 100644 index 0000000000..e5cf295ecd --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/canopy_bookshelf.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "twilightforest:block/wood/planks_canopy_0", + "side": "twilightforest:block/wood/bookshelf_canopy" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/canopy_bookshelf_1.json b/src/generated/resources/assets/twilightforest/models/block/canopy_bookshelf_1.json new file mode 100644 index 0000000000..8fc7299bed --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/canopy_bookshelf_1.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "twilightforest:block/wood/planks_canopy_0", + "side": "twilightforest:block/wood/bookshelf_canopy_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/canopy_bookshelf_2.json b/src/generated/resources/assets/twilightforest/models/block/canopy_bookshelf_2.json new file mode 100644 index 0000000000..24f2ee86a0 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/canopy_bookshelf_2.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "twilightforest:block/wood/planks_canopy_0", + "side": "twilightforest:block/wood/bookshelf_canopy_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/canopy_bookshelf_3.json b/src/generated/resources/assets/twilightforest/models/block/canopy_bookshelf_3.json new file mode 100644 index 0000000000..3515ee4558 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/canopy_bookshelf_3.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "twilightforest:block/wood/planks_canopy_0", + "side": "twilightforest:block/wood/bookshelf_canopy_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/canopy_chest.json b/src/generated/resources/assets/twilightforest/models/block/canopy_chest.json new file mode 100644 index 0000000000..46cfb0fbdc --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/canopy_chest.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:builtin/entity", + "textures": { + "particle": "twilightforest:block/wood/planks_canopy_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/canopy_leaves.json b/src/generated/resources/assets/twilightforest/models/block/canopy_leaves.json new file mode 100644 index 0000000000..fe8ae0dd7d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/canopy_leaves.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/leaves", + "textures": { + "all": "minecraft:block/spruce_leaves" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/canopy_log.json b/src/generated/resources/assets/twilightforest/models/block/canopy_log.json new file mode 100644 index 0000000000..c5c9ae6665 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/canopy_log.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "twilightforest:block/canopy_log_top", + "side": "twilightforest:block/canopy_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/canopy_log_horizontal.json b/src/generated/resources/assets/twilightforest/models/block/canopy_log_horizontal.json new file mode 100644 index 0000000000..c4366a02ba --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/canopy_log_horizontal.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column_horizontal", + "textures": { + "end": "twilightforest:block/canopy_log_top", + "side": "twilightforest:block/canopy_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/canopy_sapling.json b/src/generated/resources/assets/twilightforest/models/block/canopy_sapling.json new file mode 100644 index 0000000000..cfa9b53ef5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/canopy_sapling.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cross", + "render_type": "minecraft:cutout", + "textures": { + "cross": "twilightforest:block/canopy_sapling" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/canopy_sign.json b/src/generated/resources/assets/twilightforest/models/block/canopy_sign.json new file mode 100644 index 0000000000..46cfb0fbdc --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/canopy_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:builtin/entity", + "textures": { + "particle": "twilightforest:block/wood/planks_canopy_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/canopy_wall_sign.json b/src/generated/resources/assets/twilightforest/models/block/canopy_wall_sign.json new file mode 100644 index 0000000000..46cfb0fbdc --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/canopy_wall_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:builtin/entity", + "textures": { + "particle": "twilightforest:block/wood/planks_canopy_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/canopy_wood.json b/src/generated/resources/assets/twilightforest/models/block/canopy_wood.json new file mode 100644 index 0000000000..311e20c723 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/canopy_wood.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "twilightforest:block/canopy_log", + "side": "twilightforest:block/canopy_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/canopy_wood_horizontal.json b/src/generated/resources/assets/twilightforest/models/block/canopy_wood_horizontal.json new file mode 100644 index 0000000000..70091cfe98 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/canopy_wood_horizontal.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column_horizontal", + "textures": { + "end": "twilightforest:block/canopy_log", + "side": "twilightforest:block/canopy_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/carminite_block.json b/src/generated/resources/assets/twilightforest/models/block/carminite_block.json new file mode 100644 index 0000000000..d6392d7088 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/carminite_block.json @@ -0,0 +1,153 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "forge_data": { + "block_light": 4, + "sky_light": 4 + }, + "texture": "#bottom" + }, + "east": { + "cullface": "east", + "forge_data": { + "block_light": 4, + "sky_light": 4 + }, + "texture": "#east" + }, + "north": { + "cullface": "north", + "forge_data": { + "block_light": 4, + "sky_light": 4 + }, + "texture": "#north" + }, + "south": { + "cullface": "south", + "forge_data": { + "block_light": 4, + "sky_light": 4 + }, + "texture": "#south" + }, + "up": { + "cullface": "up", + "forge_data": { + "block_light": 4, + "sky_light": 4 + }, + "texture": "#top" + }, + "west": { + "cullface": "west", + "forge_data": { + "block_light": 4, + "sky_light": 4 + }, + "texture": "#west" + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + }, + { + "faces": { + "down": { + "cullface": "down", + "forge_data": { + "block_light": 7, + "sky_light": 7 + }, + "texture": "#bottom2", + "tintindex": 0 + }, + "east": { + "cullface": "east", + "forge_data": { + "block_light": 7, + "sky_light": 7 + }, + "texture": "#east2", + "tintindex": 0 + }, + "north": { + "cullface": "north", + "forge_data": { + "block_light": 7, + "sky_light": 7 + }, + "texture": "#north2", + "tintindex": 0 + }, + "south": { + "cullface": "south", + "forge_data": { + "block_light": 7, + "sky_light": 7 + }, + "texture": "#south2", + "tintindex": 0 + }, + "up": { + "cullface": "up", + "forge_data": { + "block_light": 7, + "sky_light": 7 + }, + "texture": "#top2", + "tintindex": 0 + }, + "west": { + "cullface": "west", + "forge_data": { + "block_light": 7, + "sky_light": 7 + }, + "texture": "#west2", + "tintindex": 0 + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + } + ], + "render_type": "minecraft:solid", + "textures": { + "all": "twilightforest:block/carminite_block", + "all2": "twilightforest:block/carminite_block_overlay", + "bottom": "#all", + "bottom2": "#all2", + "east": "#all", + "east2": "#all2", + "north": "#all", + "north2": "#all2", + "particle": "#bottom", + "south": "#all", + "south2": "#all2", + "top": "#all", + "top2": "#all2", + "west": "#all", + "west2": "#all2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/carminite_builder.json b/src/generated/resources/assets/twilightforest/models/block/carminite_builder.json new file mode 100644 index 0000000000..f22454b004 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/carminite_builder.json @@ -0,0 +1,192 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "texture": "#bottom" + }, + "east": { + "cullface": "east", + "texture": "#east" + }, + "north": { + "cullface": "north", + "texture": "#north" + }, + "south": { + "cullface": "south", + "texture": "#south" + }, + "up": { + "cullface": "up", + "texture": "#top" + }, + "west": { + "cullface": "west", + "texture": "#west" + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + }, + { + "faces": { + "down": { + "cullface": "down", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#bottom2" + }, + "east": { + "cullface": "east", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#east2" + }, + "north": { + "cullface": "north", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#north2" + }, + "south": { + "cullface": "south", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#south2" + }, + "up": { + "cullface": "up", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#top2" + }, + "west": { + "cullface": "west", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#west2" + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + }, + { + "faces": { + "down": { + "cullface": "down", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#bottom3" + }, + "east": { + "cullface": "east", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#east3" + }, + "north": { + "cullface": "north", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#north3" + }, + "south": { + "cullface": "south", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#south3" + }, + "up": { + "cullface": "up", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#top3" + }, + "west": { + "cullface": "west", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#west3" + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + } + ], + "render_type": "minecraft:cutout", + "textures": { + "all": "twilightforest:block/towerdev_builder_off", + "all2": "twilightforest:block/tower_device_level_1/towerdev_builder_off_1", + "all3": "twilightforest:block/tower_device_level_2/towerdev_builder_off_2", + "bottom": "#all", + "bottom2": "#all2", + "bottom3": "#all3", + "east": "#all", + "east2": "#all2", + "east3": "#all3", + "north": "#all", + "north2": "#all2", + "north3": "#all3", + "particle": "#bottom", + "south": "#all", + "south2": "#all2", + "south3": "#all3", + "top": "#all", + "top2": "#all2", + "top3": "#all3", + "west": "#all", + "west2": "#all2", + "west3": "#all3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/carminite_builder_active.json b/src/generated/resources/assets/twilightforest/models/block/carminite_builder_active.json new file mode 100644 index 0000000000..f37981713d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/carminite_builder_active.json @@ -0,0 +1,192 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "texture": "#bottom" + }, + "east": { + "cullface": "east", + "texture": "#east" + }, + "north": { + "cullface": "north", + "texture": "#north" + }, + "south": { + "cullface": "south", + "texture": "#south" + }, + "up": { + "cullface": "up", + "texture": "#top" + }, + "west": { + "cullface": "west", + "texture": "#west" + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + }, + { + "faces": { + "down": { + "cullface": "down", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#bottom2" + }, + "east": { + "cullface": "east", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#east2" + }, + "north": { + "cullface": "north", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#north2" + }, + "south": { + "cullface": "south", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#south2" + }, + "up": { + "cullface": "up", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#top2" + }, + "west": { + "cullface": "west", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#west2" + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + }, + { + "faces": { + "down": { + "cullface": "down", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#bottom3" + }, + "east": { + "cullface": "east", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#east3" + }, + "north": { + "cullface": "north", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#north3" + }, + "south": { + "cullface": "south", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#south3" + }, + "up": { + "cullface": "up", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#top3" + }, + "west": { + "cullface": "west", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#west3" + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + } + ], + "render_type": "minecraft:cutout", + "textures": { + "all": "twilightforest:block/towerdev_builder_on", + "all2": "twilightforest:block/tower_device_level_1/towerdev_builder_on_1", + "all3": "twilightforest:block/tower_device_level_2/towerdev_builder_on_2", + "bottom": "#all", + "bottom2": "#all2", + "bottom3": "#all3", + "east": "#all", + "east2": "#all2", + "east3": "#all3", + "north": "#all", + "north2": "#all2", + "north3": "#all3", + "particle": "#bottom", + "south": "#all", + "south2": "#all2", + "south3": "#all3", + "top": "#all", + "top2": "#all2", + "top3": "#all3", + "west": "#all", + "west2": "#all2", + "west3": "#all3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/carminite_builder_timeout.json b/src/generated/resources/assets/twilightforest/models/block/carminite_builder_timeout.json new file mode 100644 index 0000000000..5caf57e0ed --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/carminite_builder_timeout.json @@ -0,0 +1,192 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "texture": "#bottom" + }, + "east": { + "cullface": "east", + "texture": "#east" + }, + "north": { + "cullface": "north", + "texture": "#north" + }, + "south": { + "cullface": "south", + "texture": "#south" + }, + "up": { + "cullface": "up", + "texture": "#top" + }, + "west": { + "cullface": "west", + "texture": "#west" + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + }, + { + "faces": { + "down": { + "cullface": "down", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#bottom2" + }, + "east": { + "cullface": "east", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#east2" + }, + "north": { + "cullface": "north", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#north2" + }, + "south": { + "cullface": "south", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#south2" + }, + "up": { + "cullface": "up", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#top2" + }, + "west": { + "cullface": "west", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#west2" + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + }, + { + "faces": { + "down": { + "cullface": "down", + "forge_data": { + "block_light": 7, + "sky_light": 7 + }, + "texture": "#bottom3" + }, + "east": { + "cullface": "east", + "forge_data": { + "block_light": 7, + "sky_light": 7 + }, + "texture": "#east3" + }, + "north": { + "cullface": "north", + "forge_data": { + "block_light": 7, + "sky_light": 7 + }, + "texture": "#north3" + }, + "south": { + "cullface": "south", + "forge_data": { + "block_light": 7, + "sky_light": 7 + }, + "texture": "#south3" + }, + "up": { + "cullface": "up", + "forge_data": { + "block_light": 7, + "sky_light": 7 + }, + "texture": "#top3" + }, + "west": { + "cullface": "west", + "forge_data": { + "block_light": 7, + "sky_light": 7 + }, + "texture": "#west3" + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + } + ], + "render_type": "minecraft:cutout", + "textures": { + "all": "twilightforest:block/towerdev_builder_timeout", + "all2": "twilightforest:block/tower_device_level_2/towerdev_builder_timeout_1", + "all3": "twilightforest:block/tower_device_level_3/towerdev_builder_timeout_2", + "bottom": "#all", + "bottom2": "#all2", + "bottom3": "#all3", + "east": "#all", + "east2": "#all2", + "east3": "#all3", + "north": "#all", + "north2": "#all2", + "north3": "#all3", + "particle": "#bottom", + "south": "#all", + "south2": "#all2", + "south3": "#all3", + "top": "#all", + "top2": "#all2", + "top3": "#all3", + "west": "#all", + "west2": "#all2", + "west3": "#all3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/carminite_reactor.json b/src/generated/resources/assets/twilightforest/models/block/carminite_reactor.json new file mode 100644 index 0000000000..307aa2c9c6 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/carminite_reactor.json @@ -0,0 +1,192 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "texture": "#bottom" + }, + "east": { + "cullface": "east", + "texture": "#east" + }, + "north": { + "cullface": "north", + "texture": "#north" + }, + "south": { + "cullface": "south", + "texture": "#south" + }, + "up": { + "cullface": "up", + "texture": "#top" + }, + "west": { + "cullface": "west", + "texture": "#west" + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + }, + { + "faces": { + "down": { + "cullface": "down", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#bottom2" + }, + "east": { + "cullface": "east", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#east2" + }, + "north": { + "cullface": "north", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#north2" + }, + "south": { + "cullface": "south", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#south2" + }, + "up": { + "cullface": "up", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#top2" + }, + "west": { + "cullface": "west", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#west2" + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + }, + { + "faces": { + "down": { + "cullface": "down", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#bottom3" + }, + "east": { + "cullface": "east", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#east3" + }, + "north": { + "cullface": "north", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#north3" + }, + "south": { + "cullface": "south", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#south3" + }, + "up": { + "cullface": "up", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#top3" + }, + "west": { + "cullface": "west", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#west3" + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + } + ], + "render_type": "minecraft:cutout", + "textures": { + "all": "twilightforest:block/towerdev_reactor_off", + "all2": "twilightforest:block/tower_device_level_1/towerdev_reactor_off_1", + "all3": "twilightforest:block/tower_device_level_2/towerdev_reactor_off_2", + "bottom": "#all", + "bottom2": "#all2", + "bottom3": "#all3", + "east": "#all", + "east2": "#all2", + "east3": "#all3", + "north": "#all", + "north2": "#all2", + "north3": "#all3", + "particle": "#bottom", + "south": "#all", + "south2": "#all2", + "south3": "#all3", + "top": "#all", + "top2": "#all2", + "top3": "#all3", + "west": "#all", + "west2": "#all2", + "west3": "#all3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/carminite_reactor_active.json b/src/generated/resources/assets/twilightforest/models/block/carminite_reactor_active.json new file mode 100644 index 0000000000..c8ab75d6c1 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/carminite_reactor_active.json @@ -0,0 +1,192 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "texture": "#bottom" + }, + "east": { + "cullface": "east", + "texture": "#east" + }, + "north": { + "cullface": "north", + "texture": "#north" + }, + "south": { + "cullface": "south", + "texture": "#south" + }, + "up": { + "cullface": "up", + "texture": "#top" + }, + "west": { + "cullface": "west", + "texture": "#west" + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + }, + { + "faces": { + "down": { + "cullface": "down", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#bottom2" + }, + "east": { + "cullface": "east", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#east2" + }, + "north": { + "cullface": "north", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#north2" + }, + "south": { + "cullface": "south", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#south2" + }, + "up": { + "cullface": "up", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#top2" + }, + "west": { + "cullface": "west", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#west2" + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + }, + { + "faces": { + "down": { + "cullface": "down", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#bottom3" + }, + "east": { + "cullface": "east", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#east3" + }, + "north": { + "cullface": "north", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#north3" + }, + "south": { + "cullface": "south", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#south3" + }, + "up": { + "cullface": "up", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#top3" + }, + "west": { + "cullface": "west", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#west3" + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + } + ], + "render_type": "minecraft:cutout", + "textures": { + "all": "twilightforest:block/towerdev_reactor_on", + "all2": "twilightforest:block/tower_device_level_1/towerdev_reactor_on_1", + "all3": "twilightforest:block/tower_device_level_2/towerdev_reactor_on_2", + "bottom": "#all", + "bottom2": "#all2", + "bottom3": "#all3", + "east": "#all", + "east2": "#all2", + "east3": "#all3", + "north": "#all", + "north2": "#all2", + "north3": "#all3", + "particle": "#bottom", + "south": "#all", + "south2": "#all2", + "south3": "#all3", + "top": "#all", + "top2": "#all2", + "top3": "#all3", + "west": "#all", + "west2": "#all2", + "west3": "#all3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/casket_basalt.json b/src/generated/resources/assets/twilightforest/models/block/casket_basalt.json new file mode 100644 index 0000000000..af47f03978 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/casket_basalt.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/casket_solid_template", + "textures": { + "side": "minecraft:block/basalt_side", + "top": "minecraft:block/basalt_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/casket_obsidian.json b/src/generated/resources/assets/twilightforest/models/block/casket_obsidian.json new file mode 100644 index 0000000000..7831465748 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/casket_obsidian.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/casket_solid_template", + "textures": { + "side": "minecraft:block/obsidian", + "top": "minecraft:block/obsidian" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/casket_stone.json b/src/generated/resources/assets/twilightforest/models/block/casket_stone.json new file mode 100644 index 0000000000..0c1381020a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/casket_stone.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/casket_solid_template", + "textures": { + "side": "minecraft:block/stone", + "top": "minecraft:block/stone" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/castle_brick.json b/src/generated/resources/assets/twilightforest/models/block/castle_brick.json new file mode 100644 index 0000000000..5304b6e112 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/castle_brick.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "twilightforest:block/castle_brick" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/castle_brick_stairs.json b/src/generated/resources/assets/twilightforest/models/block/castle_brick_stairs.json new file mode 100644 index 0000000000..117341599b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/castle_brick_stairs.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/stairs", + "textures": { + "bottom": "twilightforest:block/castle_brick_stairs", + "side": "twilightforest:block/castle_brick_stairs", + "top": "twilightforest:block/castle_brick_stairs" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/castle_brick_stairs_inner.json b/src/generated/resources/assets/twilightforest/models/block/castle_brick_stairs_inner.json new file mode 100644 index 0000000000..9fb5391198 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/castle_brick_stairs_inner.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/inner_stairs", + "textures": { + "bottom": "twilightforest:block/castle_brick_stairs", + "side": "twilightforest:block/castle_brick_stairs", + "top": "twilightforest:block/castle_brick_stairs" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/castle_brick_stairs_outer.json b/src/generated/resources/assets/twilightforest/models/block/castle_brick_stairs_outer.json new file mode 100644 index 0000000000..918c8fdaa2 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/castle_brick_stairs_outer.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/outer_stairs", + "textures": { + "bottom": "twilightforest:block/castle_brick_stairs", + "side": "twilightforest:block/castle_brick_stairs", + "top": "twilightforest:block/castle_brick_stairs" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/castle_roof_tile.json b/src/generated/resources/assets/twilightforest/models/block/castle_roof_tile.json new file mode 100644 index 0000000000..ec2ba231a2 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/castle_roof_tile.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "twilightforest:block/castle_roof_tile" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/castle_rune_brick_0.json b/src/generated/resources/assets/twilightforest/models/block/castle_rune_brick_0.json new file mode 100644 index 0000000000..9d08b8c133 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/castle_rune_brick_0.json @@ -0,0 +1,103 @@ +{ + "parent": "minecraft:block/block", + "children": { + "brick": { + "parent": "minecraft:block/cube_all", + "textures": { + "all": "twilightforest:block/castle_brick" + } + }, + "runes": { + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#down", + "tintindex": 0 + }, + "east": { + "cullface": "east", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#east", + "tintindex": 0 + }, + "north": { + "cullface": "north", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#north", + "tintindex": 0 + }, + "south": { + "cullface": "south", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#south", + "tintindex": 0 + }, + "up": { + "cullface": "up", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#up", + "tintindex": 0 + }, + "west": { + "cullface": "west", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#west", + "tintindex": 0 + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + } + ], + "render_type": "minecraft:cutout", + "textures": { + "all": "twilightforest:block/castleblock_magic_0", + "down": "#all", + "east": "#all", + "north": "#all", + "particle": "#north", + "south": "#all", + "up": "#all", + "west": "#all" + } + } + }, + "item_render_order": [ + "brick", + "runes" + ], + "loader": "forge:composite", + "textures": { + "particle": "twilightforest:block/castle_brick" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/castle_rune_brick_1.json b/src/generated/resources/assets/twilightforest/models/block/castle_rune_brick_1.json new file mode 100644 index 0000000000..19cac84053 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/castle_rune_brick_1.json @@ -0,0 +1,103 @@ +{ + "parent": "minecraft:block/block", + "children": { + "brick": { + "parent": "minecraft:block/cube_all", + "textures": { + "all": "twilightforest:block/castle_brick" + } + }, + "runes": { + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#down", + "tintindex": 0 + }, + "east": { + "cullface": "east", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#east", + "tintindex": 0 + }, + "north": { + "cullface": "north", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#north", + "tintindex": 0 + }, + "south": { + "cullface": "south", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#south", + "tintindex": 0 + }, + "up": { + "cullface": "up", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#up", + "tintindex": 0 + }, + "west": { + "cullface": "west", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#west", + "tintindex": 0 + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + } + ], + "render_type": "minecraft:cutout", + "textures": { + "all": "twilightforest:block/castleblock_magic_1", + "down": "#all", + "east": "#all", + "north": "#all", + "particle": "#north", + "south": "#all", + "up": "#all", + "west": "#all" + } + } + }, + "item_render_order": [ + "brick", + "runes" + ], + "loader": "forge:composite", + "textures": { + "particle": "twilightforest:block/castle_brick" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/castle_rune_brick_2.json b/src/generated/resources/assets/twilightforest/models/block/castle_rune_brick_2.json new file mode 100644 index 0000000000..b62705e459 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/castle_rune_brick_2.json @@ -0,0 +1,103 @@ +{ + "parent": "minecraft:block/block", + "children": { + "brick": { + "parent": "minecraft:block/cube_all", + "textures": { + "all": "twilightforest:block/castle_brick" + } + }, + "runes": { + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#down", + "tintindex": 0 + }, + "east": { + "cullface": "east", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#east", + "tintindex": 0 + }, + "north": { + "cullface": "north", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#north", + "tintindex": 0 + }, + "south": { + "cullface": "south", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#south", + "tintindex": 0 + }, + "up": { + "cullface": "up", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#up", + "tintindex": 0 + }, + "west": { + "cullface": "west", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#west", + "tintindex": 0 + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + } + ], + "render_type": "minecraft:cutout", + "textures": { + "all": "twilightforest:block/castleblock_magic_2", + "down": "#all", + "east": "#all", + "north": "#all", + "particle": "#north", + "south": "#all", + "up": "#all", + "west": "#all" + } + } + }, + "item_render_order": [ + "brick", + "runes" + ], + "loader": "forge:composite", + "textures": { + "particle": "twilightforest:block/castle_brick" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/castle_rune_brick_3.json b/src/generated/resources/assets/twilightforest/models/block/castle_rune_brick_3.json new file mode 100644 index 0000000000..11ab999a8b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/castle_rune_brick_3.json @@ -0,0 +1,103 @@ +{ + "parent": "minecraft:block/block", + "children": { + "brick": { + "parent": "minecraft:block/cube_all", + "textures": { + "all": "twilightforest:block/castle_brick" + } + }, + "runes": { + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#down", + "tintindex": 0 + }, + "east": { + "cullface": "east", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#east", + "tintindex": 0 + }, + "north": { + "cullface": "north", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#north", + "tintindex": 0 + }, + "south": { + "cullface": "south", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#south", + "tintindex": 0 + }, + "up": { + "cullface": "up", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#up", + "tintindex": 0 + }, + "west": { + "cullface": "west", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#west", + "tintindex": 0 + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + } + ], + "render_type": "minecraft:cutout", + "textures": { + "all": "twilightforest:block/castleblock_magic_3", + "down": "#all", + "east": "#all", + "north": "#all", + "particle": "#north", + "south": "#all", + "up": "#all", + "west": "#all" + } + } + }, + "item_render_order": [ + "brick", + "runes" + ], + "loader": "forge:composite", + "textures": { + "particle": "twilightforest:block/castle_brick" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/castle_rune_brick_4.json b/src/generated/resources/assets/twilightforest/models/block/castle_rune_brick_4.json new file mode 100644 index 0000000000..a4469a54d2 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/castle_rune_brick_4.json @@ -0,0 +1,103 @@ +{ + "parent": "minecraft:block/block", + "children": { + "brick": { + "parent": "minecraft:block/cube_all", + "textures": { + "all": "twilightforest:block/castle_brick" + } + }, + "runes": { + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#down", + "tintindex": 0 + }, + "east": { + "cullface": "east", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#east", + "tintindex": 0 + }, + "north": { + "cullface": "north", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#north", + "tintindex": 0 + }, + "south": { + "cullface": "south", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#south", + "tintindex": 0 + }, + "up": { + "cullface": "up", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#up", + "tintindex": 0 + }, + "west": { + "cullface": "west", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#west", + "tintindex": 0 + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + } + ], + "render_type": "minecraft:cutout", + "textures": { + "all": "twilightforest:block/castleblock_magic_4", + "down": "#all", + "east": "#all", + "north": "#all", + "particle": "#north", + "south": "#all", + "up": "#all", + "west": "#all" + } + } + }, + "item_render_order": [ + "brick", + "runes" + ], + "loader": "forge:composite", + "textures": { + "particle": "twilightforest:block/castle_brick" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/castle_rune_brick_5.json b/src/generated/resources/assets/twilightforest/models/block/castle_rune_brick_5.json new file mode 100644 index 0000000000..759abeb3ee --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/castle_rune_brick_5.json @@ -0,0 +1,103 @@ +{ + "parent": "minecraft:block/block", + "children": { + "brick": { + "parent": "minecraft:block/cube_all", + "textures": { + "all": "twilightforest:block/castle_brick" + } + }, + "runes": { + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#down", + "tintindex": 0 + }, + "east": { + "cullface": "east", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#east", + "tintindex": 0 + }, + "north": { + "cullface": "north", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#north", + "tintindex": 0 + }, + "south": { + "cullface": "south", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#south", + "tintindex": 0 + }, + "up": { + "cullface": "up", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#up", + "tintindex": 0 + }, + "west": { + "cullface": "west", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#west", + "tintindex": 0 + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + } + ], + "render_type": "minecraft:cutout", + "textures": { + "all": "twilightforest:block/castleblock_magic_5", + "down": "#all", + "east": "#all", + "north": "#all", + "particle": "#north", + "south": "#all", + "up": "#all", + "west": "#all" + } + } + }, + "item_render_order": [ + "brick", + "runes" + ], + "loader": "forge:composite", + "textures": { + "particle": "twilightforest:block/castle_brick" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/castle_rune_brick_6.json b/src/generated/resources/assets/twilightforest/models/block/castle_rune_brick_6.json new file mode 100644 index 0000000000..a75a1390ea --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/castle_rune_brick_6.json @@ -0,0 +1,103 @@ +{ + "parent": "minecraft:block/block", + "children": { + "brick": { + "parent": "minecraft:block/cube_all", + "textures": { + "all": "twilightforest:block/castle_brick" + } + }, + "runes": { + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#down", + "tintindex": 0 + }, + "east": { + "cullface": "east", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#east", + "tintindex": 0 + }, + "north": { + "cullface": "north", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#north", + "tintindex": 0 + }, + "south": { + "cullface": "south", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#south", + "tintindex": 0 + }, + "up": { + "cullface": "up", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#up", + "tintindex": 0 + }, + "west": { + "cullface": "west", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#west", + "tintindex": 0 + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + } + ], + "render_type": "minecraft:cutout", + "textures": { + "all": "twilightforest:block/castleblock_magic_6", + "down": "#all", + "east": "#all", + "north": "#all", + "particle": "#north", + "south": "#all", + "up": "#all", + "west": "#all" + } + } + }, + "item_render_order": [ + "brick", + "runes" + ], + "loader": "forge:composite", + "textures": { + "particle": "twilightforest:block/castle_brick" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/castle_rune_brick_7.json b/src/generated/resources/assets/twilightforest/models/block/castle_rune_brick_7.json new file mode 100644 index 0000000000..c4b38fe488 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/castle_rune_brick_7.json @@ -0,0 +1,103 @@ +{ + "parent": "minecraft:block/block", + "children": { + "brick": { + "parent": "minecraft:block/cube_all", + "textures": { + "all": "twilightforest:block/castle_brick" + } + }, + "runes": { + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#down", + "tintindex": 0 + }, + "east": { + "cullface": "east", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#east", + "tintindex": 0 + }, + "north": { + "cullface": "north", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#north", + "tintindex": 0 + }, + "south": { + "cullface": "south", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#south", + "tintindex": 0 + }, + "up": { + "cullface": "up", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#up", + "tintindex": 0 + }, + "west": { + "cullface": "west", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#west", + "tintindex": 0 + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + } + ], + "render_type": "minecraft:cutout", + "textures": { + "all": "twilightforest:block/castleblock_magic_7", + "down": "#all", + "east": "#all", + "north": "#all", + "particle": "#north", + "south": "#all", + "up": "#all", + "west": "#all" + } + } + }, + "item_render_order": [ + "brick", + "runes" + ], + "loader": "forge:composite", + "textures": { + "particle": "twilightforest:block/castle_brick" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/castle_rune_bricks.json b/src/generated/resources/assets/twilightforest/models/block/castle_rune_bricks.json new file mode 100644 index 0000000000..5304b6e112 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/castle_rune_bricks.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "twilightforest:block/castle_brick" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/castle_rune_inventory.json b/src/generated/resources/assets/twilightforest/models/block/castle_rune_inventory.json new file mode 100644 index 0000000000..35838ff688 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/castle_rune_inventory.json @@ -0,0 +1,130 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "texture": "#bottom" + }, + "east": { + "cullface": "east", + "texture": "#east" + }, + "north": { + "cullface": "north", + "texture": "#north" + }, + "south": { + "cullface": "south", + "texture": "#south" + }, + "up": { + "cullface": "up", + "texture": "#top" + }, + "west": { + "cullface": "west", + "texture": "#west" + } + }, + "from": [ + 0, + 0, + 0 + ], + "shade": false, + "to": [ + 16, + 16, + 16 + ] + }, + { + "faces": { + "down": { + "cullface": "down", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#bottom2", + "tintindex": 0 + }, + "east": { + "cullface": "east", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#east2", + "tintindex": 0 + }, + "north": { + "cullface": "north", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#north2", + "tintindex": 0 + }, + "south": { + "cullface": "south", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#south2", + "tintindex": 0 + }, + "up": { + "cullface": "up", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#top2", + "tintindex": 0 + }, + "west": { + "cullface": "west", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#west2", + "tintindex": 0 + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + } + ], + "render_type": "minecraft:cutout", + "textures": { + "all": "twilightforest:block/castle_brick", + "all2": "twilightforest:block/castleblock_magic_0", + "bottom": "#all", + "bottom2": "#all2", + "east": "#all", + "east2": "#all2", + "north": "#all", + "north2": "#all2", + "particle": "#bottom", + "south": "#all", + "south2": "#all2", + "top": "#all", + "top2": "#all2", + "west": "#all", + "west2": "#all2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/castle_runes_0.json b/src/generated/resources/assets/twilightforest/models/block/castle_runes_0.json new file mode 100644 index 0000000000..b2cefa677e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/castle_runes_0.json @@ -0,0 +1,84 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#down", + "tintindex": 0 + }, + "east": { + "cullface": "east", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#east", + "tintindex": 0 + }, + "north": { + "cullface": "north", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#north", + "tintindex": 0 + }, + "south": { + "cullface": "south", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#south", + "tintindex": 0 + }, + "up": { + "cullface": "up", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#up", + "tintindex": 0 + }, + "west": { + "cullface": "west", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#west", + "tintindex": 0 + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + } + ], + "render_type": "minecraft:cutout", + "textures": { + "all": "twilightforest:block/castleblock_magic_0", + "down": "#all", + "east": "#all", + "north": "#all", + "particle": "#north", + "south": "#all", + "up": "#all", + "west": "#all" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/castle_runes_1.json b/src/generated/resources/assets/twilightforest/models/block/castle_runes_1.json new file mode 100644 index 0000000000..b879c521df --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/castle_runes_1.json @@ -0,0 +1,84 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#down", + "tintindex": 0 + }, + "east": { + "cullface": "east", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#east", + "tintindex": 0 + }, + "north": { + "cullface": "north", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#north", + "tintindex": 0 + }, + "south": { + "cullface": "south", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#south", + "tintindex": 0 + }, + "up": { + "cullface": "up", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#up", + "tintindex": 0 + }, + "west": { + "cullface": "west", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#west", + "tintindex": 0 + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + } + ], + "render_type": "minecraft:cutout", + "textures": { + "all": "twilightforest:block/castleblock_magic_1", + "down": "#all", + "east": "#all", + "north": "#all", + "particle": "#north", + "south": "#all", + "up": "#all", + "west": "#all" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/castle_runes_2.json b/src/generated/resources/assets/twilightforest/models/block/castle_runes_2.json new file mode 100644 index 0000000000..f93565b6f9 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/castle_runes_2.json @@ -0,0 +1,84 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#down", + "tintindex": 0 + }, + "east": { + "cullface": "east", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#east", + "tintindex": 0 + }, + "north": { + "cullface": "north", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#north", + "tintindex": 0 + }, + "south": { + "cullface": "south", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#south", + "tintindex": 0 + }, + "up": { + "cullface": "up", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#up", + "tintindex": 0 + }, + "west": { + "cullface": "west", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#west", + "tintindex": 0 + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + } + ], + "render_type": "minecraft:cutout", + "textures": { + "all": "twilightforest:block/castleblock_magic_2", + "down": "#all", + "east": "#all", + "north": "#all", + "particle": "#north", + "south": "#all", + "up": "#all", + "west": "#all" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/castle_runes_3.json b/src/generated/resources/assets/twilightforest/models/block/castle_runes_3.json new file mode 100644 index 0000000000..7c198abc82 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/castle_runes_3.json @@ -0,0 +1,84 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#down", + "tintindex": 0 + }, + "east": { + "cullface": "east", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#east", + "tintindex": 0 + }, + "north": { + "cullface": "north", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#north", + "tintindex": 0 + }, + "south": { + "cullface": "south", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#south", + "tintindex": 0 + }, + "up": { + "cullface": "up", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#up", + "tintindex": 0 + }, + "west": { + "cullface": "west", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#west", + "tintindex": 0 + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + } + ], + "render_type": "minecraft:cutout", + "textures": { + "all": "twilightforest:block/castleblock_magic_3", + "down": "#all", + "east": "#all", + "north": "#all", + "particle": "#north", + "south": "#all", + "up": "#all", + "west": "#all" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/castle_runes_4.json b/src/generated/resources/assets/twilightforest/models/block/castle_runes_4.json new file mode 100644 index 0000000000..8858a4759f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/castle_runes_4.json @@ -0,0 +1,84 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#down", + "tintindex": 0 + }, + "east": { + "cullface": "east", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#east", + "tintindex": 0 + }, + "north": { + "cullface": "north", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#north", + "tintindex": 0 + }, + "south": { + "cullface": "south", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#south", + "tintindex": 0 + }, + "up": { + "cullface": "up", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#up", + "tintindex": 0 + }, + "west": { + "cullface": "west", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#west", + "tintindex": 0 + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + } + ], + "render_type": "minecraft:cutout", + "textures": { + "all": "twilightforest:block/castleblock_magic_4", + "down": "#all", + "east": "#all", + "north": "#all", + "particle": "#north", + "south": "#all", + "up": "#all", + "west": "#all" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/castle_runes_5.json b/src/generated/resources/assets/twilightforest/models/block/castle_runes_5.json new file mode 100644 index 0000000000..acb2630bed --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/castle_runes_5.json @@ -0,0 +1,84 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#down", + "tintindex": 0 + }, + "east": { + "cullface": "east", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#east", + "tintindex": 0 + }, + "north": { + "cullface": "north", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#north", + "tintindex": 0 + }, + "south": { + "cullface": "south", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#south", + "tintindex": 0 + }, + "up": { + "cullface": "up", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#up", + "tintindex": 0 + }, + "west": { + "cullface": "west", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#west", + "tintindex": 0 + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + } + ], + "render_type": "minecraft:cutout", + "textures": { + "all": "twilightforest:block/castleblock_magic_5", + "down": "#all", + "east": "#all", + "north": "#all", + "particle": "#north", + "south": "#all", + "up": "#all", + "west": "#all" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/castle_runes_6.json b/src/generated/resources/assets/twilightforest/models/block/castle_runes_6.json new file mode 100644 index 0000000000..0cf8126efb --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/castle_runes_6.json @@ -0,0 +1,84 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#down", + "tintindex": 0 + }, + "east": { + "cullface": "east", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#east", + "tintindex": 0 + }, + "north": { + "cullface": "north", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#north", + "tintindex": 0 + }, + "south": { + "cullface": "south", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#south", + "tintindex": 0 + }, + "up": { + "cullface": "up", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#up", + "tintindex": 0 + }, + "west": { + "cullface": "west", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#west", + "tintindex": 0 + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + } + ], + "render_type": "minecraft:cutout", + "textures": { + "all": "twilightforest:block/castleblock_magic_6", + "down": "#all", + "east": "#all", + "north": "#all", + "particle": "#north", + "south": "#all", + "up": "#all", + "west": "#all" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/castle_runes_7.json b/src/generated/resources/assets/twilightforest/models/block/castle_runes_7.json new file mode 100644 index 0000000000..7a3818a3fd --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/castle_runes_7.json @@ -0,0 +1,84 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#down", + "tintindex": 0 + }, + "east": { + "cullface": "east", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#east", + "tintindex": 0 + }, + "north": { + "cullface": "north", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#north", + "tintindex": 0 + }, + "south": { + "cullface": "south", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#south", + "tintindex": 0 + }, + "up": { + "cullface": "up", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#up", + "tintindex": 0 + }, + "west": { + "cullface": "west", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#west", + "tintindex": 0 + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + } + ], + "render_type": "minecraft:cutout", + "textures": { + "all": "twilightforest:block/castleblock_magic_7", + "down": "#all", + "east": "#all", + "north": "#all", + "particle": "#north", + "south": "#all", + "up": "#all", + "west": "#all" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/cicada.json b/src/generated/resources/assets/twilightforest/models/block/cicada.json new file mode 100644 index 0000000000..472ab29d49 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/cicada.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:builtin/entity", + "textures": { + "particle": "twilightforest:block/stone_twist/twist_blank" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/cicada_jar.json b/src/generated/resources/assets/twilightforest/models/block/cicada_jar.json new file mode 100644 index 0000000000..32c682e939 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/cicada_jar.json @@ -0,0 +1,79 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "texture": "#bottom" + }, + "east": { + "texture": "#side" + }, + "north": { + "texture": "#side" + }, + "south": { + "texture": "#side" + }, + "up": { + "texture": "#top" + }, + "west": { + "texture": "#side" + } + }, + "from": [ + 3, + 0, + 3 + ], + "to": [ + 13, + 14, + 13 + ] + }, + { + "faces": { + "down": { + "texture": "#cork" + }, + "east": { + "texture": "#cork" + }, + "north": { + "texture": "#cork" + }, + "south": { + "texture": "#cork" + }, + "up": { + "cullface": "up", + "texture": "#cork" + }, + "west": { + "texture": "#cork" + } + }, + "from": [ + 4, + 12, + 4 + ], + "to": [ + 12, + 16, + 12 + ] + } + ], + "render_type": "minecraft:cutout", + "textures": { + "bottom": "twilightforest:block/jar_bottom", + "cork": "twilightforest:block/cicada_jar_cork", + "particle": "#side", + "side": "twilightforest:block/jar_side", + "top": "twilightforest:block/jar_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/cinder_log.json b/src/generated/resources/assets/twilightforest/models/block/cinder_log.json new file mode 100644 index 0000000000..c1b02cab7f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/cinder_log.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "twilightforest:block/cinder_log_top", + "side": "twilightforest:block/cinder_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/cinder_log_horizontal.json b/src/generated/resources/assets/twilightforest/models/block/cinder_log_horizontal.json new file mode 100644 index 0000000000..e8961aa2b6 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/cinder_log_horizontal.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column_horizontal", + "textures": { + "end": "twilightforest:block/cinder_log_top", + "side": "twilightforest:block/cinder_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/cinder_wood.json b/src/generated/resources/assets/twilightforest/models/block/cinder_wood.json new file mode 100644 index 0000000000..8242bb7f98 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/cinder_wood.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "twilightforest:block/cinder_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/cracked_castle_brick.json b/src/generated/resources/assets/twilightforest/models/block/cracked_castle_brick.json new file mode 100644 index 0000000000..97c0d42e4b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/cracked_castle_brick.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "twilightforest:block/cracked_castle_brick" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/cracked_castle_brick_stairs.json b/src/generated/resources/assets/twilightforest/models/block/cracked_castle_brick_stairs.json new file mode 100644 index 0000000000..6ea3294dda --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/cracked_castle_brick_stairs.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/stairs", + "textures": { + "bottom": "twilightforest:block/cracked_castle_brick_stairs", + "side": "twilightforest:block/cracked_castle_brick_stairs", + "top": "twilightforest:block/cracked_castle_brick_stairs" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/cracked_castle_brick_stairs_inner.json b/src/generated/resources/assets/twilightforest/models/block/cracked_castle_brick_stairs_inner.json new file mode 100644 index 0000000000..8d8c55d8a5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/cracked_castle_brick_stairs_inner.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/inner_stairs", + "textures": { + "bottom": "twilightforest:block/cracked_castle_brick_stairs", + "side": "twilightforest:block/cracked_castle_brick_stairs", + "top": "twilightforest:block/cracked_castle_brick_stairs" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/cracked_castle_brick_stairs_outer.json b/src/generated/resources/assets/twilightforest/models/block/cracked_castle_brick_stairs_outer.json new file mode 100644 index 0000000000..31957467d0 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/cracked_castle_brick_stairs_outer.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/outer_stairs", + "textures": { + "bottom": "twilightforest:block/cracked_castle_brick_stairs", + "side": "twilightforest:block/cracked_castle_brick_stairs", + "top": "twilightforest:block/cracked_castle_brick_stairs" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/cracked_deadrock.json b/src/generated/resources/assets/twilightforest/models/block/cracked_deadrock.json new file mode 100644 index 0000000000..041cda4860 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/cracked_deadrock.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "twilightforest:block/cracked_deadrock" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/cracked_etched_nagastone.json b/src/generated/resources/assets/twilightforest/models/block/cracked_etched_nagastone.json new file mode 100644 index 0000000000..0c3250806a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/cracked_etched_nagastone.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "twilightforest:block/stone_tiles_weathered", + "side": "twilightforest:block/etched_nagastone_down_weathered" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/cracked_etched_nagastone_east.json b/src/generated/resources/assets/twilightforest/models/block/cracked_etched_nagastone_east.json new file mode 100644 index 0000000000..3b0672abe8 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/cracked_etched_nagastone_east.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "twilightforest:block/etched_nagastone_right_weathered", + "east": "twilightforest:block/stone_tiles_weathered", + "north": "twilightforest:block/etched_nagastone_left_weathered", + "particle": "#down", + "south": "twilightforest:block/etched_nagastone_right_weathered", + "up": "twilightforest:block/etched_nagastone_left_weathered", + "west": "twilightforest:block/stone_tiles_weathered" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/cracked_etched_nagastone_north.json b/src/generated/resources/assets/twilightforest/models/block/cracked_etched_nagastone_north.json new file mode 100644 index 0000000000..2698431dfe --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/cracked_etched_nagastone_north.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "twilightforest:block/etched_nagastone_up_weathered", + "east": "twilightforest:block/etched_nagastone_right_weathered", + "north": "twilightforest:block/stone_tiles_weathered", + "particle": "#down", + "south": "twilightforest:block/stone_tiles_weathered", + "up": "twilightforest:block/etched_nagastone_up_weathered", + "west": "twilightforest:block/etched_nagastone_left_weathered" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/cracked_etched_nagastone_south.json b/src/generated/resources/assets/twilightforest/models/block/cracked_etched_nagastone_south.json new file mode 100644 index 0000000000..6e61724ee4 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/cracked_etched_nagastone_south.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "twilightforest:block/etched_nagastone_down_weathered", + "east": "twilightforest:block/etched_nagastone_left_weathered", + "north": "twilightforest:block/stone_tiles_weathered", + "particle": "#down", + "south": "twilightforest:block/stone_tiles_weathered", + "up": "twilightforest:block/etched_nagastone_down_weathered", + "west": "twilightforest:block/etched_nagastone_right_weathered" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/cracked_etched_nagastone_up.json b/src/generated/resources/assets/twilightforest/models/block/cracked_etched_nagastone_up.json new file mode 100644 index 0000000000..3f7d1545a6 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/cracked_etched_nagastone_up.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "twilightforest:block/stone_tiles_weathered", + "side": "twilightforest:block/etched_nagastone_up_weathered" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/cracked_etched_nagastone_west.json b/src/generated/resources/assets/twilightforest/models/block/cracked_etched_nagastone_west.json new file mode 100644 index 0000000000..17255883f7 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/cracked_etched_nagastone_west.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "twilightforest:block/etched_nagastone_left_weathered", + "east": "twilightforest:block/stone_tiles_weathered", + "north": "twilightforest:block/etched_nagastone_right_weathered", + "particle": "#down", + "south": "twilightforest:block/etched_nagastone_left_weathered", + "up": "twilightforest:block/etched_nagastone_right_weathered", + "west": "twilightforest:block/stone_tiles_weathered" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/cracked_mazestone.json b/src/generated/resources/assets/twilightforest/models/block/cracked_mazestone.json new file mode 100644 index 0000000000..8e0ef0828e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/cracked_mazestone.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "twilightforest:block/cracked_mazestone" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/cracked_nagastone_pillar.json b/src/generated/resources/assets/twilightforest/models/block/cracked_nagastone_pillar.json new file mode 100644 index 0000000000..ffa748c21e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/cracked_nagastone_pillar.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "twilightforest:block/nagastone_pillar_end_weathered", + "side": "twilightforest:block/nagastone_pillar_side_weathered" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/cracked_nagastone_pillar_reversed.json b/src/generated/resources/assets/twilightforest/models/block/cracked_nagastone_pillar_reversed.json new file mode 100644 index 0000000000..98f5a76a51 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/cracked_nagastone_pillar_reversed.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "twilightforest:block/nagastone_pillar_end_weathered", + "side": "twilightforest:block/nagastone_pillar_side_weathered_alt" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/cracked_nagastone_stairs_left.json b/src/generated/resources/assets/twilightforest/models/block/cracked_nagastone_stairs_left.json new file mode 100644 index 0000000000..905be7b11a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/cracked_nagastone_stairs_left.json @@ -0,0 +1,8 @@ +{ + "parent": "twilightforest:block/util/bisected_stairs", + "textures": { + "end": "twilightforest:block/stone_tiles_weathered", + "middle": "twilightforest:block/nagastone_bare_weathered", + "side": "twilightforest:block/etched_nagastone_left_weathered" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/cracked_nagastone_stairs_left_inner.json b/src/generated/resources/assets/twilightforest/models/block/cracked_nagastone_stairs_left_inner.json new file mode 100644 index 0000000000..0d3c90cfd8 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/cracked_nagastone_stairs_left_inner.json @@ -0,0 +1,8 @@ +{ + "parent": "twilightforest:block/util/bisected_inner_stairs", + "textures": { + "end": "twilightforest:block/stone_tiles_weathered", + "middle": "twilightforest:block/nagastone_bare_weathered", + "side": "twilightforest:block/etched_nagastone_left_weathered" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/cracked_nagastone_stairs_left_outer.json b/src/generated/resources/assets/twilightforest/models/block/cracked_nagastone_stairs_left_outer.json new file mode 100644 index 0000000000..2daa4733a4 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/cracked_nagastone_stairs_left_outer.json @@ -0,0 +1,8 @@ +{ + "parent": "twilightforest:block/util/bisected_outer_stairs", + "textures": { + "end": "twilightforest:block/stone_tiles_weathered", + "middle": "twilightforest:block/nagastone_bare_weathered", + "side": "twilightforest:block/etched_nagastone_left_weathered" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/cracked_nagastone_stairs_right.json b/src/generated/resources/assets/twilightforest/models/block/cracked_nagastone_stairs_right.json new file mode 100644 index 0000000000..48f389e3eb --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/cracked_nagastone_stairs_right.json @@ -0,0 +1,8 @@ +{ + "parent": "twilightforest:block/util/bisected_stairs", + "textures": { + "end": "twilightforest:block/stone_tiles_weathered", + "middle": "twilightforest:block/nagastone_bare_weathered", + "side": "twilightforest:block/etched_nagastone_right_weathered" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/cracked_nagastone_stairs_right_inner.json b/src/generated/resources/assets/twilightforest/models/block/cracked_nagastone_stairs_right_inner.json new file mode 100644 index 0000000000..a3431901d3 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/cracked_nagastone_stairs_right_inner.json @@ -0,0 +1,8 @@ +{ + "parent": "twilightforest:block/util/bisected_inner_stairs", + "textures": { + "end": "twilightforest:block/stone_tiles_weathered", + "middle": "twilightforest:block/nagastone_bare_weathered", + "side": "twilightforest:block/etched_nagastone_right_weathered" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/cracked_nagastone_stairs_right_outer.json b/src/generated/resources/assets/twilightforest/models/block/cracked_nagastone_stairs_right_outer.json new file mode 100644 index 0000000000..9e20f1c564 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/cracked_nagastone_stairs_right_outer.json @@ -0,0 +1,8 @@ +{ + "parent": "twilightforest:block/util/bisected_outer_stairs", + "textures": { + "end": "twilightforest:block/stone_tiles_weathered", + "middle": "twilightforest:block/nagastone_bare_weathered", + "side": "twilightforest:block/etched_nagastone_right_weathered" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/cracked_towerwood.json b/src/generated/resources/assets/twilightforest/models/block/cracked_towerwood.json new file mode 100644 index 0000000000..4b8d1f0055 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/cracked_towerwood.json @@ -0,0 +1,60 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "texture": "#down", + "tintindex": 0 + }, + "east": { + "cullface": "east", + "texture": "#east", + "tintindex": 0 + }, + "north": { + "cullface": "north", + "texture": "#north", + "tintindex": 0 + }, + "south": { + "cullface": "south", + "texture": "#south", + "tintindex": 0 + }, + "up": { + "cullface": "up", + "texture": "#up", + "tintindex": 0 + }, + "west": { + "cullface": "west", + "texture": "#west", + "tintindex": 0 + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + } + ], + "render_type": "minecraft:solid", + "textures": { + "all": "twilightforest:block/cracked_towerwood", + "down": "#all", + "east": "#all", + "north": "#all", + "particle": "#north", + "south": "#all", + "up": "#all", + "west": "#all" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/cracked_towerwood_alt.json b/src/generated/resources/assets/twilightforest/models/block/cracked_towerwood_alt.json new file mode 100644 index 0000000000..e66e4b0ad3 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/cracked_towerwood_alt.json @@ -0,0 +1,60 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "texture": "#down", + "tintindex": 0 + }, + "east": { + "cullface": "east", + "texture": "#east", + "tintindex": 0 + }, + "north": { + "cullface": "north", + "texture": "#north", + "tintindex": 0 + }, + "south": { + "cullface": "south", + "texture": "#south", + "tintindex": 0 + }, + "up": { + "cullface": "up", + "texture": "#up", + "tintindex": 0 + }, + "west": { + "cullface": "west", + "texture": "#west", + "tintindex": 0 + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + } + ], + "render_type": "minecraft:solid", + "textures": { + "all": "twilightforest:block/cracked_towerwood_alt", + "down": "#all", + "east": "#all", + "north": "#all", + "particle": "#north", + "south": "#all", + "up": "#all", + "west": "#all" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/cracked_towerwood_alt_flipped.json b/src/generated/resources/assets/twilightforest/models/block/cracked_towerwood_alt_flipped.json new file mode 100644 index 0000000000..7be7d8142d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/cracked_towerwood_alt_flipped.json @@ -0,0 +1,89 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "texture": "#all", + "tintindex": 0, + "uv": [ + 0.0, + 16.0, + 16.0, + 0.0 + ] + }, + "east": { + "cullface": "east", + "texture": "#all", + "tintindex": 0, + "uv": [ + 0.0, + 16.0, + 16.0, + 0.0 + ] + }, + "north": { + "cullface": "north", + "texture": "#all", + "tintindex": 0, + "uv": [ + 0.0, + 16.0, + 16.0, + 0.0 + ] + }, + "south": { + "cullface": "south", + "texture": "#all", + "tintindex": 0, + "uv": [ + 0.0, + 16.0, + 16.0, + 0.0 + ] + }, + "up": { + "cullface": "up", + "texture": "#all", + "tintindex": 0, + "uv": [ + 0.0, + 16.0, + 16.0, + 0.0 + ] + }, + "west": { + "cullface": "west", + "texture": "#all", + "tintindex": 0, + "uv": [ + 0.0, + 16.0, + 16.0, + 0.0 + ] + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + } + ], + "textures": { + "all": "twilightforest:block/cracked_towerwood_alt", + "particle": "#all" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/cracked_towerwood_flipped.json b/src/generated/resources/assets/twilightforest/models/block/cracked_towerwood_flipped.json new file mode 100644 index 0000000000..17644fcc20 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/cracked_towerwood_flipped.json @@ -0,0 +1,89 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "texture": "#all", + "tintindex": 0, + "uv": [ + 0.0, + 16.0, + 16.0, + 0.0 + ] + }, + "east": { + "cullface": "east", + "texture": "#all", + "tintindex": 0, + "uv": [ + 0.0, + 16.0, + 16.0, + 0.0 + ] + }, + "north": { + "cullface": "north", + "texture": "#all", + "tintindex": 0, + "uv": [ + 0.0, + 16.0, + 16.0, + 0.0 + ] + }, + "south": { + "cullface": "south", + "texture": "#all", + "tintindex": 0, + "uv": [ + 0.0, + 16.0, + 16.0, + 0.0 + ] + }, + "up": { + "cullface": "up", + "texture": "#all", + "tintindex": 0, + "uv": [ + 0.0, + 16.0, + 16.0, + 0.0 + ] + }, + "west": { + "cullface": "west", + "texture": "#all", + "tintindex": 0, + "uv": [ + 0.0, + 16.0, + 16.0, + 0.0 + ] + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + } + ], + "textures": { + "all": "twilightforest:block/cracked_towerwood", + "particle": "#all" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/cracked_underbrick.json b/src/generated/resources/assets/twilightforest/models/block/cracked_underbrick.json new file mode 100644 index 0000000000..d0b26f024e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/cracked_underbrick.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "twilightforest:block/cracked_underbrick" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/cut_mazestone.json b/src/generated/resources/assets/twilightforest/models/block/cut_mazestone.json new file mode 100644 index 0000000000..ee1eef0c5f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/cut_mazestone.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "twilightforest:block/mazestone", + "side": "twilightforest:block/cut_mazestone" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/dark_chest.json b/src/generated/resources/assets/twilightforest/models/block/dark_chest.json new file mode 100644 index 0000000000..ca82df65aa --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/dark_chest.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:builtin/entity", + "textures": { + "particle": "twilightforest:block/wood/planks_darkwood_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/dark_leaves.json b/src/generated/resources/assets/twilightforest/models/block/dark_leaves.json new file mode 100644 index 0000000000..411459b464 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/dark_leaves.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/leaves", + "textures": { + "all": "twilightforest:block/darkwood_leaves" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/dark_log.json b/src/generated/resources/assets/twilightforest/models/block/dark_log.json new file mode 100644 index 0000000000..5689b6b2e6 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/dark_log.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "twilightforest:block/dark_log_top", + "side": "twilightforest:block/dark_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/dark_log_horizontal.json b/src/generated/resources/assets/twilightforest/models/block/dark_log_horizontal.json new file mode 100644 index 0000000000..982c782773 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/dark_log_horizontal.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column_horizontal", + "textures": { + "end": "twilightforest:block/dark_log_top", + "side": "twilightforest:block/dark_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/dark_sign.json b/src/generated/resources/assets/twilightforest/models/block/dark_sign.json new file mode 100644 index 0000000000..ca82df65aa --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/dark_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:builtin/entity", + "textures": { + "particle": "twilightforest:block/wood/planks_darkwood_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/dark_wall_sign.json b/src/generated/resources/assets/twilightforest/models/block/dark_wall_sign.json new file mode 100644 index 0000000000..ca82df65aa --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/dark_wall_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:builtin/entity", + "textures": { + "particle": "twilightforest:block/wood/planks_darkwood_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/dark_wood.json b/src/generated/resources/assets/twilightforest/models/block/dark_wood.json new file mode 100644 index 0000000000..5077d4920b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/dark_wood.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "twilightforest:block/dark_log", + "side": "twilightforest:block/dark_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/dark_wood_horizontal.json b/src/generated/resources/assets/twilightforest/models/block/dark_wood_horizontal.json new file mode 100644 index 0000000000..a496c0beda --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/dark_wood_horizontal.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column_horizontal", + "textures": { + "end": "twilightforest:block/dark_log", + "side": "twilightforest:block/dark_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/darkwood_sapling.json b/src/generated/resources/assets/twilightforest/models/block/darkwood_sapling.json new file mode 100644 index 0000000000..7aab063098 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/darkwood_sapling.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cross", + "render_type": "minecraft:cutout", + "textures": { + "cross": "twilightforest:block/darkwood_sapling" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/deadrock.json b/src/generated/resources/assets/twilightforest/models/block/deadrock.json new file mode 100644 index 0000000000..67571829aa --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/deadrock.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "twilightforest:block/deadrock" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/death_tome_spawner_1.json b/src/generated/resources/assets/twilightforest/models/block/death_tome_spawner_1.json new file mode 100644 index 0000000000..0bcd298247 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/death_tome_spawner_1.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "twilightforest:block/wood/planks_canopy_0", + "side": "twilightforest:block/wood/bookshelf_spawner/bookshelf_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/death_tome_spawner_10.json b/src/generated/resources/assets/twilightforest/models/block/death_tome_spawner_10.json new file mode 100644 index 0000000000..e5cf295ecd --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/death_tome_spawner_10.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "twilightforest:block/wood/planks_canopy_0", + "side": "twilightforest:block/wood/bookshelf_canopy" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/death_tome_spawner_2.json b/src/generated/resources/assets/twilightforest/models/block/death_tome_spawner_2.json new file mode 100644 index 0000000000..1aef7fc0f0 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/death_tome_spawner_2.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "twilightforest:block/wood/planks_canopy_0", + "side": "twilightforest:block/wood/bookshelf_spawner/bookshelf_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/death_tome_spawner_3.json b/src/generated/resources/assets/twilightforest/models/block/death_tome_spawner_3.json new file mode 100644 index 0000000000..46d1a32548 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/death_tome_spawner_3.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "twilightforest:block/wood/planks_canopy_0", + "side": "twilightforest:block/wood/bookshelf_spawner/bookshelf_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/death_tome_spawner_4.json b/src/generated/resources/assets/twilightforest/models/block/death_tome_spawner_4.json new file mode 100644 index 0000000000..7e3f2fd2b1 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/death_tome_spawner_4.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "twilightforest:block/wood/planks_canopy_0", + "side": "twilightforest:block/wood/bookshelf_spawner/bookshelf_4" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/death_tome_spawner_5.json b/src/generated/resources/assets/twilightforest/models/block/death_tome_spawner_5.json new file mode 100644 index 0000000000..e01220eaf3 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/death_tome_spawner_5.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "twilightforest:block/wood/planks_canopy_0", + "side": "twilightforest:block/wood/bookshelf_spawner/bookshelf_5" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/death_tome_spawner_6.json b/src/generated/resources/assets/twilightforest/models/block/death_tome_spawner_6.json new file mode 100644 index 0000000000..7bd694540d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/death_tome_spawner_6.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "twilightforest:block/wood/planks_canopy_0", + "side": "twilightforest:block/wood/bookshelf_spawner/bookshelf_6" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/death_tome_spawner_7.json b/src/generated/resources/assets/twilightforest/models/block/death_tome_spawner_7.json new file mode 100644 index 0000000000..1919d54762 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/death_tome_spawner_7.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "twilightforest:block/wood/planks_canopy_0", + "side": "twilightforest:block/wood/bookshelf_spawner/bookshelf_7" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/death_tome_spawner_8.json b/src/generated/resources/assets/twilightforest/models/block/death_tome_spawner_8.json new file mode 100644 index 0000000000..3ef62a24d1 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/death_tome_spawner_8.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "twilightforest:block/wood/planks_canopy_0", + "side": "twilightforest:block/wood/bookshelf_spawner/bookshelf_8" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/death_tome_spawner_9.json b/src/generated/resources/assets/twilightforest/models/block/death_tome_spawner_9.json new file mode 100644 index 0000000000..e900e11872 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/death_tome_spawner_9.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "twilightforest:block/wood/planks_canopy_0", + "side": "twilightforest:block/wood/bookshelf_spawner/bookshelf_9" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/decorative_mazestone.json b/src/generated/resources/assets/twilightforest/models/block/decorative_mazestone.json new file mode 100644 index 0000000000..ba98fb2f91 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/decorative_mazestone.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "twilightforest:block/mazestone", + "side": "twilightforest:block/decorative_mazestone" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/empty_canopy_bookshelf.json b/src/generated/resources/assets/twilightforest/models/block/empty_canopy_bookshelf.json new file mode 100644 index 0000000000..2e4cd89c9e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/empty_canopy_bookshelf.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "twilightforest:block/wood/planks_canopy_0", + "side": "twilightforest:block/wood/bookshelf_spawner/bookshelf_empty" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/encased_castle_brick_pillar.json b/src/generated/resources/assets/twilightforest/models/block/encased_castle_brick_pillar.json new file mode 100644 index 0000000000..88daa891f9 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/encased_castle_brick_pillar.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "twilightforest:block/encased_castle_brick_pillar_end", + "side": "twilightforest:block/encased_castle_brick_pillar_side" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/encased_castle_brick_pillar_x.json b/src/generated/resources/assets/twilightforest/models/block/encased_castle_brick_pillar_x.json new file mode 100644 index 0000000000..44ffd23933 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/encased_castle_brick_pillar_x.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/util/cube_column_rotationally_correct_x", + "textures": { + "end": "twilightforest:block/encased_castle_brick_pillar_end", + "side": "twilightforest:block/encased_castle_brick_pillar_side" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/encased_castle_brick_pillar_z.json b/src/generated/resources/assets/twilightforest/models/block/encased_castle_brick_pillar_z.json new file mode 100644 index 0000000000..267b9c2cd5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/encased_castle_brick_pillar_z.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/util/cube_column_rotationally_correct_z", + "textures": { + "end": "twilightforest:block/encased_castle_brick_pillar_end", + "side": "twilightforest:block/encased_castle_brick_pillar_side" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/encased_castle_brick_stairs.json b/src/generated/resources/assets/twilightforest/models/block/encased_castle_brick_stairs.json new file mode 100644 index 0000000000..a32257f0b3 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/encased_castle_brick_stairs.json @@ -0,0 +1,8 @@ +{ + "parent": "twilightforest:block/util/bisected_stairs", + "textures": { + "end": "twilightforest:block/castleblock_tile", + "middle": "twilightforest:block/castle_roof_tile", + "side": "twilightforest:block/encased_castle_brick_pillar_h" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/encased_castle_brick_stairs_inner.json b/src/generated/resources/assets/twilightforest/models/block/encased_castle_brick_stairs_inner.json new file mode 100644 index 0000000000..9b55193c11 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/encased_castle_brick_stairs_inner.json @@ -0,0 +1,8 @@ +{ + "parent": "twilightforest:block/util/bisected_inner_stairs", + "textures": { + "end": "twilightforest:block/castleblock_tile", + "middle": "twilightforest:block/castle_roof_tile", + "side": "twilightforest:block/encased_castle_brick_pillar_h" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/encased_castle_brick_stairs_outer.json b/src/generated/resources/assets/twilightforest/models/block/encased_castle_brick_stairs_outer.json new file mode 100644 index 0000000000..532c7c6257 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/encased_castle_brick_stairs_outer.json @@ -0,0 +1,8 @@ +{ + "parent": "twilightforest:block/util/bisected_outer_stairs", + "textures": { + "end": "twilightforest:block/castleblock_tile", + "middle": "twilightforest:block/castle_roof_tile", + "side": "twilightforest:block/encased_castle_brick_pillar_h" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/encased_castle_brick_tile.json b/src/generated/resources/assets/twilightforest/models/block/encased_castle_brick_tile.json new file mode 100644 index 0000000000..4016edbbde --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/encased_castle_brick_tile.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "twilightforest:block/encased_castle_brick_pillar_end" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/encased_fire_jet.json b/src/generated/resources/assets/twilightforest/models/block/encased_fire_jet.json new file mode 100644 index 0000000000..63892f5b8b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/encased_fire_jet.json @@ -0,0 +1,157 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "texture": "#bottom" + }, + "east": { + "cullface": "east", + "texture": "#side" + }, + "north": { + "cullface": "north", + "texture": "#side" + }, + "south": { + "cullface": "south", + "texture": "#side" + }, + "up": { + "cullface": "up", + "texture": "#top" + }, + "west": { + "cullface": "west", + "texture": "#side" + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + }, + { + "faces": { + "east": { + "cullface": "east", + "forge_data": { + "block_light": 15 + }, + "texture": "#side2" + }, + "north": { + "cullface": "north", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#side2" + }, + "south": { + "cullface": "south", + "forge_data": { + "block_light": 15 + }, + "texture": "#side2" + }, + "up": { + "cullface": "up", + "forge_data": { + "block_light": 10 + }, + "texture": "#top2" + }, + "west": { + "cullface": "west", + "forge_data": { + "block_light": 15 + }, + "texture": "#side2" + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + }, + { + "faces": { + "east": { + "cullface": "east", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#side3" + }, + "north": { + "cullface": "north", + "forge_data": { + "block_light": 10 + }, + "texture": "#side3" + }, + "south": { + "cullface": "south", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#side3" + }, + "up": { + "cullface": "up", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#top3" + }, + "west": { + "cullface": "west", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#side3" + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + } + ], + "render_type": "minecraft:cutout", + "textures": { + "bottom": "twilightforest:block/encased_towerwood", + "particle": "#bottom", + "side": "twilightforest:block/towerdev_firejet_off", + "side2": "twilightforest:block/tower_device_level_1/towerdev_firejet_1", + "side3": "twilightforest:block/tower_device_level_2/towerdev_firejet_off_1", + "top": "twilightforest:block/towerdev_ghasttraplid_off", + "top2": "twilightforest:block/tower_device_level_2/towerdev_ghasttraplid_off_1", + "top3": "twilightforest:block/tower_device_level_2/towerdev_ghasttraplid_off_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/encased_fire_jet_on.json b/src/generated/resources/assets/twilightforest/models/block/encased_fire_jet_on.json new file mode 100644 index 0000000000..af11d1a1a5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/encased_fire_jet_on.json @@ -0,0 +1,157 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "texture": "#bottom" + }, + "east": { + "cullface": "east", + "texture": "#side" + }, + "north": { + "cullface": "north", + "texture": "#side" + }, + "south": { + "cullface": "south", + "texture": "#side" + }, + "up": { + "cullface": "up", + "texture": "#top" + }, + "west": { + "cullface": "west", + "texture": "#side" + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + }, + { + "faces": { + "east": { + "cullface": "east", + "forge_data": { + "block_light": 15 + }, + "texture": "#side2" + }, + "north": { + "cullface": "north", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#side2" + }, + "south": { + "cullface": "south", + "forge_data": { + "block_light": 15 + }, + "texture": "#side2" + }, + "up": { + "cullface": "up", + "forge_data": { + "block_light": 10 + }, + "texture": "#top2" + }, + "west": { + "cullface": "west", + "forge_data": { + "block_light": 15 + }, + "texture": "#side2" + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + }, + { + "faces": { + "east": { + "cullface": "east", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#side3" + }, + "north": { + "cullface": "north", + "forge_data": { + "block_light": 10 + }, + "texture": "#side3" + }, + "south": { + "cullface": "south", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#side3" + }, + "up": { + "cullface": "up", + "forge_data": { + "block_light": 7, + "sky_light": 7 + }, + "texture": "#top3" + }, + "west": { + "cullface": "west", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#side3" + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + } + ], + "render_type": "minecraft:cutout", + "textures": { + "bottom": "twilightforest:block/encased_towerwood", + "particle": "#bottom", + "side": "twilightforest:block/towerdev_firejet_on", + "side2": "twilightforest:block/tower_device_level_1/towerdev_firejet_1", + "side3": "twilightforest:block/tower_device_level_2/towerdev_firejet_on_1", + "top": "twilightforest:block/towerdev_ghasttraplid_on", + "top2": "twilightforest:block/tower_device_level_2/towerdev_ghasttraplid_on_1", + "top3": "twilightforest:block/tower_device_level_3/towerdev_ghasttraplid_on_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/encased_smoker.json b/src/generated/resources/assets/twilightforest/models/block/encased_smoker.json new file mode 100644 index 0000000000..6be9ad5c56 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/encased_smoker.json @@ -0,0 +1,157 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "texture": "#bottom" + }, + "east": { + "cullface": "east", + "texture": "#side" + }, + "north": { + "cullface": "north", + "texture": "#side" + }, + "south": { + "cullface": "south", + "texture": "#side" + }, + "up": { + "cullface": "up", + "texture": "#top" + }, + "west": { + "cullface": "west", + "texture": "#side" + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + }, + { + "faces": { + "east": { + "cullface": "east", + "forge_data": { + "block_light": 15 + }, + "texture": "#side2" + }, + "north": { + "cullface": "north", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#side2" + }, + "south": { + "cullface": "south", + "forge_data": { + "block_light": 15 + }, + "texture": "#side2" + }, + "up": { + "cullface": "up", + "forge_data": { + "block_light": 10 + }, + "texture": "#top2" + }, + "west": { + "cullface": "west", + "forge_data": { + "block_light": 15 + }, + "texture": "#side2" + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + }, + { + "faces": { + "east": { + "cullface": "east", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#side3" + }, + "north": { + "cullface": "north", + "forge_data": { + "block_light": 10 + }, + "texture": "#side3" + }, + "south": { + "cullface": "south", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#side3" + }, + "up": { + "cullface": "up", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#top3" + }, + "west": { + "cullface": "west", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#side3" + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + } + ], + "render_type": "minecraft:cutout", + "textures": { + "bottom": "twilightforest:block/encased_towerwood", + "particle": "#bottom", + "side": "twilightforest:block/towerdev_smoker_off", + "side2": "twilightforest:block/tower_device_level_1/towerdev_smoker_1", + "side3": "twilightforest:block/tower_device_level_2/towerdev_smoker_off_1", + "top": "twilightforest:block/towerdev_ghasttraplid_off", + "top2": "twilightforest:block/tower_device_level_2/towerdev_ghasttraplid_off_1", + "top3": "twilightforest:block/tower_device_level_2/towerdev_ghasttraplid_off_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/encased_smoker_on.json b/src/generated/resources/assets/twilightforest/models/block/encased_smoker_on.json new file mode 100644 index 0000000000..64cf23f8e1 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/encased_smoker_on.json @@ -0,0 +1,157 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "texture": "#bottom" + }, + "east": { + "cullface": "east", + "texture": "#side" + }, + "north": { + "cullface": "north", + "texture": "#side" + }, + "south": { + "cullface": "south", + "texture": "#side" + }, + "up": { + "cullface": "up", + "texture": "#top" + }, + "west": { + "cullface": "west", + "texture": "#side" + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + }, + { + "faces": { + "east": { + "cullface": "east", + "forge_data": { + "block_light": 15 + }, + "texture": "#side2" + }, + "north": { + "cullface": "north", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#side2" + }, + "south": { + "cullface": "south", + "forge_data": { + "block_light": 15 + }, + "texture": "#side2" + }, + "up": { + "cullface": "up", + "forge_data": { + "block_light": 10 + }, + "texture": "#top2" + }, + "west": { + "cullface": "west", + "forge_data": { + "block_light": 15 + }, + "texture": "#side2" + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + }, + { + "faces": { + "east": { + "cullface": "east", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#side3" + }, + "north": { + "cullface": "north", + "forge_data": { + "block_light": 10 + }, + "texture": "#side3" + }, + "south": { + "cullface": "south", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#side3" + }, + "up": { + "cullface": "up", + "forge_data": { + "block_light": 7, + "sky_light": 7 + }, + "texture": "#top3" + }, + "west": { + "cullface": "west", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#side3" + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + } + ], + "render_type": "minecraft:cutout", + "textures": { + "bottom": "twilightforest:block/encased_towerwood", + "particle": "#bottom", + "side": "twilightforest:block/towerdev_firejet_on", + "side2": "twilightforest:block/tower_device_level_1/towerdev_smoker_1", + "side3": "twilightforest:block/tower_device_level_2/towerdev_smoker_on_1", + "top": "twilightforest:block/towerdev_ghasttraplid_on", + "top2": "twilightforest:block/tower_device_level_2/towerdev_ghasttraplid_on_1", + "top3": "twilightforest:block/tower_device_level_3/towerdev_ghasttraplid_on_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/encased_towerwood.json b/src/generated/resources/assets/twilightforest/models/block/encased_towerwood.json new file mode 100644 index 0000000000..b5076ffa64 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/encased_towerwood.json @@ -0,0 +1,60 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "texture": "#down", + "tintindex": 0 + }, + "east": { + "cullface": "east", + "texture": "#east", + "tintindex": 0 + }, + "north": { + "cullface": "north", + "texture": "#north", + "tintindex": 0 + }, + "south": { + "cullface": "south", + "texture": "#south", + "tintindex": 0 + }, + "up": { + "cullface": "up", + "texture": "#up", + "tintindex": 0 + }, + "west": { + "cullface": "west", + "texture": "#west", + "tintindex": 0 + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + } + ], + "render_type": "minecraft:solid", + "textures": { + "all": "twilightforest:block/encased_towerwood", + "down": "#all", + "east": "#all", + "north": "#all", + "particle": "#north", + "south": "#all", + "up": "#all", + "west": "#all" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/etched_nagastone.json b/src/generated/resources/assets/twilightforest/models/block/etched_nagastone.json new file mode 100644 index 0000000000..04f0f7b501 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/etched_nagastone.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "twilightforest:block/stone_tiles", + "side": "twilightforest:block/etched_nagastone_down" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/etched_nagastone_east.json b/src/generated/resources/assets/twilightforest/models/block/etched_nagastone_east.json new file mode 100644 index 0000000000..37049bad42 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/etched_nagastone_east.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "twilightforest:block/etched_nagastone_right", + "east": "twilightforest:block/stone_tiles", + "north": "twilightforest:block/etched_nagastone_left", + "particle": "#down", + "south": "twilightforest:block/etched_nagastone_right", + "up": "twilightforest:block/etched_nagastone_left", + "west": "twilightforest:block/stone_tiles" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/etched_nagastone_north.json b/src/generated/resources/assets/twilightforest/models/block/etched_nagastone_north.json new file mode 100644 index 0000000000..59485701cf --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/etched_nagastone_north.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "twilightforest:block/etched_nagastone_up", + "east": "twilightforest:block/etched_nagastone_right", + "north": "twilightforest:block/stone_tiles", + "particle": "#down", + "south": "twilightforest:block/stone_tiles", + "up": "twilightforest:block/etched_nagastone_up", + "west": "twilightforest:block/etched_nagastone_left" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/etched_nagastone_south.json b/src/generated/resources/assets/twilightforest/models/block/etched_nagastone_south.json new file mode 100644 index 0000000000..11bc534d47 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/etched_nagastone_south.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "twilightforest:block/etched_nagastone_down", + "east": "twilightforest:block/etched_nagastone_left", + "north": "twilightforest:block/stone_tiles", + "particle": "#down", + "south": "twilightforest:block/stone_tiles", + "up": "twilightforest:block/etched_nagastone_down", + "west": "twilightforest:block/etched_nagastone_right" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/etched_nagastone_up.json b/src/generated/resources/assets/twilightforest/models/block/etched_nagastone_up.json new file mode 100644 index 0000000000..9f11091019 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/etched_nagastone_up.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "twilightforest:block/stone_tiles", + "side": "twilightforest:block/etched_nagastone_up" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/etched_nagastone_west.json b/src/generated/resources/assets/twilightforest/models/block/etched_nagastone_west.json new file mode 100644 index 0000000000..42ac89b0af --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/etched_nagastone_west.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "twilightforest:block/etched_nagastone_left", + "east": "twilightforest:block/stone_tiles", + "north": "twilightforest:block/etched_nagastone_right", + "particle": "#down", + "south": "twilightforest:block/etched_nagastone_left", + "up": "twilightforest:block/etched_nagastone_right", + "west": "twilightforest:block/stone_tiles" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/experiment115_1_8_regenerating.json b/src/generated/resources/assets/twilightforest/models/block/experiment115_1_8_regenerating.json new file mode 100644 index 0000000000..2c1a4fca1a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/experiment115_1_8_regenerating.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/experiment115_1_8", + "textures": { + "top_2": "twilightforest:block/experiment115/experiment115_sprinkle" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/experiment115_2_8_regenerating.json b/src/generated/resources/assets/twilightforest/models/block/experiment115_2_8_regenerating.json new file mode 100644 index 0000000000..dc7ae4cec3 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/experiment115_2_8_regenerating.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/experiment115_2_8", + "textures": { + "top_2": "twilightforest:block/experiment115/experiment115_sprinkle" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/experiment115_3_8_regenerating.json b/src/generated/resources/assets/twilightforest/models/block/experiment115_3_8_regenerating.json new file mode 100644 index 0000000000..6a22b77591 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/experiment115_3_8_regenerating.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/experiment115_3_8", + "textures": { + "top_2": "twilightforest:block/experiment115/experiment115_sprinkle" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/experiment115_4_8_regenerating.json b/src/generated/resources/assets/twilightforest/models/block/experiment115_4_8_regenerating.json new file mode 100644 index 0000000000..0930d24475 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/experiment115_4_8_regenerating.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/experiment115_4_8", + "textures": { + "top_2": "twilightforest:block/experiment115/experiment115_sprinkle" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/experiment115_5_8_regenerating.json b/src/generated/resources/assets/twilightforest/models/block/experiment115_5_8_regenerating.json new file mode 100644 index 0000000000..8210803135 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/experiment115_5_8_regenerating.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/experiment115_5_8", + "textures": { + "top_2": "twilightforest:block/experiment115/experiment115_sprinkle" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/experiment115_6_8_regenerating.json b/src/generated/resources/assets/twilightforest/models/block/experiment115_6_8_regenerating.json new file mode 100644 index 0000000000..1e3a4e2822 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/experiment115_6_8_regenerating.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/experiment115_6_8", + "textures": { + "top_2": "twilightforest:block/experiment115/experiment115_sprinkle" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/experiment115_7_8_regenerating.json b/src/generated/resources/assets/twilightforest/models/block/experiment115_7_8_regenerating.json new file mode 100644 index 0000000000..765dfbfbf2 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/experiment115_7_8_regenerating.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/experiment115_7_8", + "textures": { + "top_2": "twilightforest:block/experiment115/experiment115_sprinkle" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/experiment115_8_8_regenerating.json b/src/generated/resources/assets/twilightforest/models/block/experiment115_8_8_regenerating.json new file mode 100644 index 0000000000..97d4075cf4 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/experiment115_8_8_regenerating.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/experiment115_8_8", + "textures": { + "top_2": "twilightforest:block/experiment115/experiment115_sprinkle" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/fallen_leaves1.json b/src/generated/resources/assets/twilightforest/models/block/fallen_leaves1.json new file mode 100644 index 0000000000..7821e3e043 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/fallen_leaves1.json @@ -0,0 +1,71 @@ +{ + "elements": [ + { + "faces": { + "down": { + "texture": "#all", + "tintindex": 0 + }, + "east": { + "texture": "#all", + "tintindex": 0, + "uv": [ + 0.0, + 0.0, + 16.0, + 0.2 + ] + }, + "north": { + "texture": "#all", + "tintindex": 0, + "uv": [ + 0.0, + 0.0, + 16.0, + 0.2 + ] + }, + "south": { + "texture": "#all", + "tintindex": 0, + "uv": [ + 0.0, + 0.0, + 16.0, + 0.2 + ] + }, + "up": { + "texture": "#all", + "tintindex": 0 + }, + "west": { + "texture": "#all", + "tintindex": 0, + "uv": [ + 0.0, + 0.0, + 16.0, + 0.2 + ] + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 0.2, + 16 + ] + } + ], + "render_type": "minecraft:cutout", + "textures": { + "all": "minecraft:block/oak_leaves", + "particle": "#all" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/fallen_leaves2.json b/src/generated/resources/assets/twilightforest/models/block/fallen_leaves2.json new file mode 100644 index 0000000000..24e1928436 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/fallen_leaves2.json @@ -0,0 +1,71 @@ +{ + "elements": [ + { + "faces": { + "down": { + "texture": "#all", + "tintindex": 0 + }, + "east": { + "texture": "#all", + "tintindex": 0, + "uv": [ + 0.0, + 0.0, + 16.0, + 2.0 + ] + }, + "north": { + "texture": "#all", + "tintindex": 0, + "uv": [ + 0.0, + 0.0, + 16.0, + 2.0 + ] + }, + "south": { + "texture": "#all", + "tintindex": 0, + "uv": [ + 0.0, + 0.0, + 16.0, + 2.0 + ] + }, + "up": { + "texture": "#all", + "tintindex": 0 + }, + "west": { + "texture": "#all", + "tintindex": 0, + "uv": [ + 0.0, + 0.0, + 16.0, + 2.0 + ] + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 2, + 16 + ] + } + ], + "render_type": "minecraft:cutout", + "textures": { + "all": "minecraft:block/oak_leaves", + "particle": "#all" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/fallen_leaves3.json b/src/generated/resources/assets/twilightforest/models/block/fallen_leaves3.json new file mode 100644 index 0000000000..310c2964dc --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/fallen_leaves3.json @@ -0,0 +1,71 @@ +{ + "elements": [ + { + "faces": { + "down": { + "texture": "#all", + "tintindex": 0 + }, + "east": { + "texture": "#all", + "tintindex": 0, + "uv": [ + 0.0, + 0.0, + 16.0, + 4.0 + ] + }, + "north": { + "texture": "#all", + "tintindex": 0, + "uv": [ + 0.0, + 0.0, + 16.0, + 4.0 + ] + }, + "south": { + "texture": "#all", + "tintindex": 0, + "uv": [ + 0.0, + 0.0, + 16.0, + 4.0 + ] + }, + "up": { + "texture": "#all", + "tintindex": 0 + }, + "west": { + "texture": "#all", + "tintindex": 0, + "uv": [ + 0.0, + 0.0, + 16.0, + 4.0 + ] + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 4, + 16 + ] + } + ], + "render_type": "minecraft:cutout", + "textures": { + "all": "minecraft:block/oak_leaves", + "particle": "#all" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/fallen_leaves4.json b/src/generated/resources/assets/twilightforest/models/block/fallen_leaves4.json new file mode 100644 index 0000000000..72f1a63c03 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/fallen_leaves4.json @@ -0,0 +1,71 @@ +{ + "elements": [ + { + "faces": { + "down": { + "texture": "#all", + "tintindex": 0 + }, + "east": { + "texture": "#all", + "tintindex": 0, + "uv": [ + 0.0, + 0.0, + 16.0, + 6.0 + ] + }, + "north": { + "texture": "#all", + "tintindex": 0, + "uv": [ + 0.0, + 0.0, + 16.0, + 6.0 + ] + }, + "south": { + "texture": "#all", + "tintindex": 0, + "uv": [ + 0.0, + 0.0, + 16.0, + 6.0 + ] + }, + "up": { + "texture": "#all", + "tintindex": 0 + }, + "west": { + "texture": "#all", + "tintindex": 0, + "uv": [ + 0.0, + 0.0, + 16.0, + 6.0 + ] + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 6, + 16 + ] + } + ], + "render_type": "minecraft:cutout", + "textures": { + "all": "minecraft:block/oak_leaves", + "particle": "#all" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/fallen_leaves5.json b/src/generated/resources/assets/twilightforest/models/block/fallen_leaves5.json new file mode 100644 index 0000000000..9600a77730 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/fallen_leaves5.json @@ -0,0 +1,71 @@ +{ + "elements": [ + { + "faces": { + "down": { + "texture": "#all", + "tintindex": 0 + }, + "east": { + "texture": "#all", + "tintindex": 0, + "uv": [ + 0.0, + 0.0, + 16.0, + 8.0 + ] + }, + "north": { + "texture": "#all", + "tintindex": 0, + "uv": [ + 0.0, + 0.0, + 16.0, + 8.0 + ] + }, + "south": { + "texture": "#all", + "tintindex": 0, + "uv": [ + 0.0, + 0.0, + 16.0, + 8.0 + ] + }, + "up": { + "texture": "#all", + "tintindex": 0 + }, + "west": { + "texture": "#all", + "tintindex": 0, + "uv": [ + 0.0, + 0.0, + 16.0, + 8.0 + ] + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 8, + 16 + ] + } + ], + "render_type": "minecraft:cutout", + "textures": { + "all": "minecraft:block/oak_leaves", + "particle": "#all" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/fallen_leaves6.json b/src/generated/resources/assets/twilightforest/models/block/fallen_leaves6.json new file mode 100644 index 0000000000..db78e1c72f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/fallen_leaves6.json @@ -0,0 +1,71 @@ +{ + "elements": [ + { + "faces": { + "down": { + "texture": "#all", + "tintindex": 0 + }, + "east": { + "texture": "#all", + "tintindex": 0, + "uv": [ + 0.0, + 0.0, + 16.0, + 10.0 + ] + }, + "north": { + "texture": "#all", + "tintindex": 0, + "uv": [ + 0.0, + 0.0, + 16.0, + 10.0 + ] + }, + "south": { + "texture": "#all", + "tintindex": 0, + "uv": [ + 0.0, + 0.0, + 16.0, + 10.0 + ] + }, + "up": { + "texture": "#all", + "tintindex": 0 + }, + "west": { + "texture": "#all", + "tintindex": 0, + "uv": [ + 0.0, + 0.0, + 16.0, + 10.0 + ] + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 10, + 16 + ] + } + ], + "render_type": "minecraft:cutout", + "textures": { + "all": "minecraft:block/oak_leaves", + "particle": "#all" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/fallen_leaves7.json b/src/generated/resources/assets/twilightforest/models/block/fallen_leaves7.json new file mode 100644 index 0000000000..6099af85d1 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/fallen_leaves7.json @@ -0,0 +1,71 @@ +{ + "elements": [ + { + "faces": { + "down": { + "texture": "#all", + "tintindex": 0 + }, + "east": { + "texture": "#all", + "tintindex": 0, + "uv": [ + 0.0, + 0.0, + 16.0, + 12.0 + ] + }, + "north": { + "texture": "#all", + "tintindex": 0, + "uv": [ + 0.0, + 0.0, + 16.0, + 12.0 + ] + }, + "south": { + "texture": "#all", + "tintindex": 0, + "uv": [ + 0.0, + 0.0, + 16.0, + 12.0 + ] + }, + "up": { + "texture": "#all", + "tintindex": 0 + }, + "west": { + "texture": "#all", + "tintindex": 0, + "uv": [ + 0.0, + 0.0, + 16.0, + 12.0 + ] + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 12, + 16 + ] + } + ], + "render_type": "minecraft:cutout", + "textures": { + "all": "minecraft:block/oak_leaves", + "particle": "#all" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/fallen_leaves8.json b/src/generated/resources/assets/twilightforest/models/block/fallen_leaves8.json new file mode 100644 index 0000000000..53641e0637 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/fallen_leaves8.json @@ -0,0 +1,71 @@ +{ + "elements": [ + { + "faces": { + "down": { + "texture": "#all", + "tintindex": 0 + }, + "east": { + "texture": "#all", + "tintindex": 0, + "uv": [ + 0.0, + 0.0, + 16.0, + 14.0 + ] + }, + "north": { + "texture": "#all", + "tintindex": 0, + "uv": [ + 0.0, + 0.0, + 16.0, + 14.0 + ] + }, + "south": { + "texture": "#all", + "tintindex": 0, + "uv": [ + 0.0, + 0.0, + 16.0, + 14.0 + ] + }, + "up": { + "texture": "#all", + "tintindex": 0 + }, + "west": { + "texture": "#all", + "tintindex": 0, + "uv": [ + 0.0, + 0.0, + 16.0, + 14.0 + ] + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 14, + 16 + ] + } + ], + "render_type": "minecraft:cutout", + "textures": { + "all": "minecraft:block/oak_leaves", + "particle": "#all" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/fiddlehead.json b/src/generated/resources/assets/twilightforest/models/block/fiddlehead.json new file mode 100644 index 0000000000..236d56ad87 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/fiddlehead.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/tinted_cross", + "render_type": "minecraft:cutout", + "textures": { + "cross": "twilightforest:block/fiddlehead" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/fire_jet.json b/src/generated/resources/assets/twilightforest/models/block/fire_jet.json new file mode 100644 index 0000000000..d621a2f4a0 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/fire_jet.json @@ -0,0 +1,62 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "texture": "#down", + "tintindex": 0 + }, + "east": { + "cullface": "east", + "texture": "#east", + "tintindex": 0 + }, + "north": { + "cullface": "north", + "texture": "#north", + "tintindex": 0 + }, + "south": { + "cullface": "south", + "texture": "#south", + "tintindex": 0 + }, + "up": { + "cullface": "up", + "texture": "#up", + "tintindex": 0 + }, + "west": { + "cullface": "west", + "texture": "#west", + "tintindex": 0 + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + } + ], + "render_type": "minecraft:solid", + "textures": { + "bottom": "minecraft:block/grass_block_top", + "down": "#bottom", + "east": "#side", + "north": "#side", + "particle": "#north", + "side": "twilightforest:block/firejet_side", + "south": "#side", + "top": "twilightforest:block/firejet_top", + "up": "#top", + "west": "#side" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/firefly.json b/src/generated/resources/assets/twilightforest/models/block/firefly.json new file mode 100644 index 0000000000..472ab29d49 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/firefly.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:builtin/entity", + "textures": { + "particle": "twilightforest:block/stone_twist/twist_blank" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/firefly_jar.json b/src/generated/resources/assets/twilightforest/models/block/firefly_jar.json new file mode 100644 index 0000000000..4eac8ada16 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/firefly_jar.json @@ -0,0 +1,79 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "texture": "#bottom" + }, + "east": { + "texture": "#side" + }, + "north": { + "texture": "#side" + }, + "south": { + "texture": "#side" + }, + "up": { + "texture": "#top" + }, + "west": { + "texture": "#side" + } + }, + "from": [ + 3, + 0, + 3 + ], + "to": [ + 13, + 14, + 13 + ] + }, + { + "faces": { + "down": { + "texture": "#cork" + }, + "east": { + "texture": "#cork" + }, + "north": { + "texture": "#cork" + }, + "south": { + "texture": "#cork" + }, + "up": { + "cullface": "up", + "texture": "#cork" + }, + "west": { + "texture": "#cork" + } + }, + "from": [ + 4, + 12, + 4 + ], + "to": [ + 12, + 16, + 12 + ] + } + ], + "render_type": "minecraft:cutout", + "textures": { + "bottom": "twilightforest:block/jar_bottom", + "cork": "twilightforest:block/firefly_jar_cork", + "particle": "#side", + "side": "twilightforest:block/jar_side", + "top": "twilightforest:block/jar_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/fluffy_cloud.json b/src/generated/resources/assets/twilightforest/models/block/fluffy_cloud.json new file mode 100644 index 0000000000..c2f71ed26f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/fluffy_cloud.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "twilightforest:block/fluffy_cloud" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_down.json b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_down.json new file mode 100644 index 0000000000..b7db50e014 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_down.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_down", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/blue_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_down_east.json b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_down_east.json new file mode 100644 index 0000000000..4c8f765f5c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_down_east.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_down_east", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/blue_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_down_no_east.json b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_down_no_east.json new file mode 100644 index 0000000000..418bcb203e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_down_no_east.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_down_no_east", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/blue_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_down_no_north.json b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_down_no_north.json new file mode 100644 index 0000000000..d7cc94e343 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_down_no_north.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_down_no_north", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/blue_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_down_no_south.json b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_down_no_south.json new file mode 100644 index 0000000000..d8f03af640 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_down_no_south.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_down_no_south", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/blue_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_down_no_west.json b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_down_no_west.json new file mode 100644 index 0000000000..d59a392e91 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_down_no_west.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_down_no_west", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/blue_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_down_north.json b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_down_north.json new file mode 100644 index 0000000000..b7817eabbd --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_down_north.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_down_north", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/blue_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_down_south.json b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_down_south.json new file mode 100644 index 0000000000..e28ec7d969 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_down_south.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_down_south", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/blue_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_down_west.json b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_down_west.json new file mode 100644 index 0000000000..2a446c6d72 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_down_west.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_down_west", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/blue_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_east.json b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_east.json new file mode 100644 index 0000000000..b9b943fb2f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_east.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_east", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/blue_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_east_no_down.json b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_east_no_down.json new file mode 100644 index 0000000000..a107f5f1ad --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_east_no_down.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_east_no_down", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/blue_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_east_no_north.json b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_east_no_north.json new file mode 100644 index 0000000000..f0148c2dce --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_east_no_north.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_east_no_north", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/blue_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_east_no_south.json b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_east_no_south.json new file mode 100644 index 0000000000..827b4b8126 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_east_no_south.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_east_no_south", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/blue_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_east_no_up.json b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_east_no_up.json new file mode 100644 index 0000000000..122a730317 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_east_no_up.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_east_no_up", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/blue_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_no_down.json b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_no_down.json new file mode 100644 index 0000000000..015718225c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_no_down.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_no_down", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/blue_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_no_east.json b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_no_east.json new file mode 100644 index 0000000000..0dc7a0313e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_no_east.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_no_east", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/blue_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_no_north.json b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_no_north.json new file mode 100644 index 0000000000..7433e75dab --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_no_north.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_no_north", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/blue_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_no_south.json b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_no_south.json new file mode 100644 index 0000000000..3b5d84483d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_no_south.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_no_south", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/blue_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_no_up.json b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_no_up.json new file mode 100644 index 0000000000..0eb8aaec49 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_no_up.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_no_up", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/blue_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_no_west.json b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_no_west.json new file mode 100644 index 0000000000..babfef4990 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_no_west.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_no_west", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/blue_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_north.json b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_north.json new file mode 100644 index 0000000000..708bd9149e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_north.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_north", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/blue_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_north_east.json b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_north_east.json new file mode 100644 index 0000000000..4f99ad6b7b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_north_east.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_north_east", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/blue_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_north_no_down.json b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_north_no_down.json new file mode 100644 index 0000000000..8c55fd6f42 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_north_no_down.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_north_no_down", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/blue_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_north_no_east.json b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_north_no_east.json new file mode 100644 index 0000000000..bfe169e6b2 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_north_no_east.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_north_no_east", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/blue_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_north_no_up.json b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_north_no_up.json new file mode 100644 index 0000000000..7f7ebf3ba1 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_north_no_up.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_north_no_up", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/blue_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_north_no_west.json b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_north_no_west.json new file mode 100644 index 0000000000..6fa85f9cbb --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_north_no_west.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_north_no_west", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/blue_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_north_west.json b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_north_west.json new file mode 100644 index 0000000000..4b46924f9a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_north_west.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_north_west", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/blue_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_south.json b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_south.json new file mode 100644 index 0000000000..8331f6b43b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_south.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_south", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/blue_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_south_east.json b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_south_east.json new file mode 100644 index 0000000000..7e0cd286e4 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_south_east.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_south_east", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/blue_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_south_no_down.json b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_south_no_down.json new file mode 100644 index 0000000000..1872501e6a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_south_no_down.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_south_no_down", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/blue_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_south_no_east.json b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_south_no_east.json new file mode 100644 index 0000000000..854bf8ff89 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_south_no_east.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_south_no_east", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/blue_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_south_no_up.json b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_south_no_up.json new file mode 100644 index 0000000000..4394062e0b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_south_no_up.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_south_no_up", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/blue_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_south_no_west.json b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_south_no_west.json new file mode 100644 index 0000000000..5bb30f4d1a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_south_no_west.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_south_no_west", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/blue_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_south_west.json b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_south_west.json new file mode 100644 index 0000000000..37b625924f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_south_west.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_south_west", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/blue_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_up.json b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_up.json new file mode 100644 index 0000000000..0997df8e2b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_up.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_up", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/blue_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_up_east.json b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_up_east.json new file mode 100644 index 0000000000..78488de2b5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_up_east.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_up_east", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/blue_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_up_no_east.json b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_up_no_east.json new file mode 100644 index 0000000000..115832efde --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_up_no_east.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_up_no_east", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/blue_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_up_no_north.json b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_up_no_north.json new file mode 100644 index 0000000000..4a18caac82 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_up_no_north.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_up_no_north", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/blue_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_up_no_south.json b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_up_no_south.json new file mode 100644 index 0000000000..e72ace5c19 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_up_no_south.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_up_no_south", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/blue_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_up_no_west.json b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_up_no_west.json new file mode 100644 index 0000000000..0d5d700bc9 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_up_no_west.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_up_no_west", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/blue_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_up_north.json b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_up_north.json new file mode 100644 index 0000000000..29bde08091 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_up_north.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_up_north", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/blue_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_up_south.json b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_up_south.json new file mode 100644 index 0000000000..5725843e23 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_up_south.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_up_south", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/blue_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_up_west.json b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_up_west.json new file mode 100644 index 0000000000..71378fcf4d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_up_west.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_up_west", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/blue_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_west.json b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_west.json new file mode 100644 index 0000000000..6c7361e39c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_west.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_west", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/blue_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_west_no_down.json b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_west_no_down.json new file mode 100644 index 0000000000..1d9e03f690 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_west_no_down.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_west_no_down", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/blue_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_west_no_north.json b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_west_no_north.json new file mode 100644 index 0000000000..646b2371e3 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_west_no_north.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_west_no_north", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/blue_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_west_no_south.json b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_west_no_south.json new file mode 100644 index 0000000000..a899ed76ac --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_west_no_south.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_west_no_south", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/blue_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_west_no_up.json b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_west_no_up.json new file mode 100644 index 0000000000..b4fa8d9c69 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/blue_force_field_west_no_up.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_west_no_up", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/blue_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_down.json b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_down.json new file mode 100644 index 0000000000..02b5fcae50 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_down.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "ambientocclusion": false, + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane" + } + }, + "from": [ + 7, + 0, + 7 + ], + "shade": false, + "to": [ + 9, + 7, + 9 + ] + } + ], + "textures": { + "particle": "#pane" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_down_east.json b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_down_east.json new file mode 100644 index 0000000000..1c7f6d1b6a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_down_east.json @@ -0,0 +1,72 @@ +{ + "parent": "minecraft:block/block", + "ambientocclusion": false, + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane" + }, + "east": { + "cullface": "east", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane", + "uv": [ + 7.0, + 0.0, + 9.0, + 7.0 + ] + }, + "north": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane", + "uv": [ + 9.0, + 0.0, + 16.0, + 7.0 + ] + }, + "south": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane", + "uv": [ + 0.0, + 0.0, + 7.0, + 7.0 + ] + } + }, + "from": [ + 9, + 0, + 7 + ], + "shade": false, + "to": [ + 16, + 7, + 9 + ] + } + ], + "textures": { + "particle": "#pane" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_down_no_east.json b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_down_no_east.json new file mode 100644 index 0000000000..6949b27780 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_down_no_east.json @@ -0,0 +1,37 @@ +{ + "parent": "minecraft:block/block", + "ambientocclusion": false, + "elements": [ + { + "faces": { + "east": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane", + "uv": [ + 7.0, + 0.0, + 9.0, + 7.0 + ] + } + }, + "from": [ + 7, + 0, + 7 + ], + "shade": false, + "to": [ + 9, + 7, + 9 + ] + } + ], + "textures": { + "particle": "#pane" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_down_no_north.json b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_down_no_north.json new file mode 100644 index 0000000000..f3017999a5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_down_no_north.json @@ -0,0 +1,37 @@ +{ + "parent": "minecraft:block/block", + "ambientocclusion": false, + "elements": [ + { + "faces": { + "north": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane", + "uv": [ + 7.0, + 0.0, + 9.0, + 7.0 + ] + } + }, + "from": [ + 7, + 0, + 7 + ], + "shade": false, + "to": [ + 9, + 7, + 9 + ] + } + ], + "textures": { + "particle": "#pane" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_down_no_south.json b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_down_no_south.json new file mode 100644 index 0000000000..f8413f44e2 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_down_no_south.json @@ -0,0 +1,37 @@ +{ + "parent": "minecraft:block/block", + "ambientocclusion": false, + "elements": [ + { + "faces": { + "south": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane", + "uv": [ + 7.0, + 0.0, + 9.0, + 7.0 + ] + } + }, + "from": [ + 7, + 0, + 7 + ], + "shade": false, + "to": [ + 9, + 7, + 9 + ] + } + ], + "textures": { + "particle": "#pane" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_down_no_west.json b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_down_no_west.json new file mode 100644 index 0000000000..4f859f4d37 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_down_no_west.json @@ -0,0 +1,37 @@ +{ + "parent": "minecraft:block/block", + "ambientocclusion": false, + "elements": [ + { + "faces": { + "west": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane", + "uv": [ + 7.0, + 0.0, + 9.0, + 7.0 + ] + } + }, + "from": [ + 7, + 0, + 7 + ], + "shade": false, + "to": [ + 9, + 7, + 9 + ] + } + ], + "textures": { + "particle": "#pane" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_down_north.json b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_down_north.json new file mode 100644 index 0000000000..ebfec7778e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_down_north.json @@ -0,0 +1,72 @@ +{ + "parent": "minecraft:block/block", + "ambientocclusion": false, + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane", + "uv": [ + 7.0, + 0.0, + 9.0, + 7.0 + ] + }, + "east": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane" + }, + "north": { + "cullface": "north", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane", + "uv": [ + 7.0, + 0.0, + 9.0, + 7.0 + ] + }, + "west": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane", + "uv": [ + 0.0, + 0.0, + 7.0, + 7.0 + ] + } + }, + "from": [ + 7, + 0, + 0 + ], + "shade": false, + "to": [ + 9, + 7, + 7 + ] + } + ], + "textures": { + "particle": "#pane" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_down_south.json b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_down_south.json new file mode 100644 index 0000000000..3182ab3210 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_down_south.json @@ -0,0 +1,78 @@ +{ + "parent": "minecraft:block/block", + "ambientocclusion": false, + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane", + "uv": [ + 7.0, + 9.0, + 9.0, + 16.0 + ] + }, + "east": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane", + "uv": [ + 0.0, + 0.0, + 7.0, + 7.0 + ] + }, + "south": { + "cullface": "south", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane", + "uv": [ + 7.0, + 0.0, + 9.0, + 7.0 + ] + }, + "west": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane", + "uv": [ + 9.0, + 0.0, + 16.0, + 7.0 + ] + } + }, + "from": [ + 7, + 0, + 9 + ], + "shade": false, + "to": [ + 9, + 7, + 16 + ] + } + ], + "textures": { + "particle": "#pane" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_down_west.json b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_down_west.json new file mode 100644 index 0000000000..aa28ddc0ac --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_down_west.json @@ -0,0 +1,72 @@ +{ + "parent": "minecraft:block/block", + "ambientocclusion": false, + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane" + }, + "north": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane", + "uv": [ + 0.0, + 0.0, + 7.0, + 7.0 + ] + }, + "south": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane", + "uv": [ + 9.0, + 0.0, + 16.0, + 7.0 + ] + }, + "west": { + "cullface": "west", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane", + "uv": [ + 7.0, + 0.0, + 9.0, + 7.0 + ] + } + }, + "from": [ + 0, + 0, + 7 + ], + "shade": false, + "to": [ + 7, + 7, + 9 + ] + } + ], + "textures": { + "particle": "#pane" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_east.json b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_east.json new file mode 100644 index 0000000000..26a8b8a9f2 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_east.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "ambientocclusion": false, + "elements": [ + { + "faces": { + "east": { + "cullface": "east", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane" + } + }, + "from": [ + 9, + 7, + 7 + ], + "shade": false, + "to": [ + 16, + 9, + 9 + ] + } + ], + "textures": { + "particle": "#pane" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_east_no_down.json b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_east_no_down.json new file mode 100644 index 0000000000..d32d0e0e01 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_east_no_down.json @@ -0,0 +1,31 @@ +{ + "parent": "minecraft:block/block", + "ambientocclusion": false, + "elements": [ + { + "faces": { + "down": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane" + } + }, + "from": [ + 9, + 7, + 7 + ], + "shade": false, + "to": [ + 16, + 9, + 9 + ] + } + ], + "textures": { + "particle": "#pane" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_east_no_north.json b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_east_no_north.json new file mode 100644 index 0000000000..9c94fa1c5b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_east_no_north.json @@ -0,0 +1,37 @@ +{ + "parent": "minecraft:block/block", + "ambientocclusion": false, + "elements": [ + { + "faces": { + "north": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane", + "uv": [ + 9.0, + 7.0, + 16.0, + 9.0 + ] + } + }, + "from": [ + 9, + 7, + 7 + ], + "shade": false, + "to": [ + 16, + 9, + 9 + ] + } + ], + "textures": { + "particle": "#pane" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_east_no_south.json b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_east_no_south.json new file mode 100644 index 0000000000..284882478a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_east_no_south.json @@ -0,0 +1,37 @@ +{ + "parent": "minecraft:block/block", + "ambientocclusion": false, + "elements": [ + { + "faces": { + "south": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane", + "uv": [ + 0.0, + 7.0, + 7.0, + 9.0 + ] + } + }, + "from": [ + 9, + 7, + 7 + ], + "shade": false, + "to": [ + 16, + 9, + 9 + ] + } + ], + "textures": { + "particle": "#pane" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_east_no_up.json b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_east_no_up.json new file mode 100644 index 0000000000..2d88ebadab --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_east_no_up.json @@ -0,0 +1,31 @@ +{ + "parent": "minecraft:block/block", + "ambientocclusion": false, + "elements": [ + { + "faces": { + "up": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane" + } + }, + "from": [ + 9, + 7, + 7 + ], + "shade": false, + "to": [ + 16, + 9, + 9 + ] + } + ], + "textures": { + "particle": "#pane" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_no_down.json b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_no_down.json new file mode 100644 index 0000000000..4c95e85c54 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_no_down.json @@ -0,0 +1,31 @@ +{ + "parent": "minecraft:block/block", + "ambientocclusion": false, + "elements": [ + { + "faces": { + "down": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane" + } + }, + "from": [ + 7, + 7, + 7 + ], + "shade": false, + "to": [ + 9, + 9, + 9 + ] + } + ], + "textures": { + "particle": "#pane" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_no_east.json b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_no_east.json new file mode 100644 index 0000000000..ec5082eb1c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_no_east.json @@ -0,0 +1,31 @@ +{ + "parent": "minecraft:block/block", + "ambientocclusion": false, + "elements": [ + { + "faces": { + "east": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane" + } + }, + "from": [ + 7, + 7, + 7 + ], + "shade": false, + "to": [ + 9, + 9, + 9 + ] + } + ], + "textures": { + "particle": "#pane" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_no_north.json b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_no_north.json new file mode 100644 index 0000000000..cf5254c788 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_no_north.json @@ -0,0 +1,31 @@ +{ + "parent": "minecraft:block/block", + "ambientocclusion": false, + "elements": [ + { + "faces": { + "north": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane" + } + }, + "from": [ + 7, + 7, + 7 + ], + "shade": false, + "to": [ + 9, + 9, + 9 + ] + } + ], + "textures": { + "particle": "#pane" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_no_south.json b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_no_south.json new file mode 100644 index 0000000000..86c56744c2 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_no_south.json @@ -0,0 +1,31 @@ +{ + "parent": "minecraft:block/block", + "ambientocclusion": false, + "elements": [ + { + "faces": { + "south": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane" + } + }, + "from": [ + 7, + 7, + 7 + ], + "shade": false, + "to": [ + 9, + 9, + 9 + ] + } + ], + "textures": { + "particle": "#pane" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_no_up.json b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_no_up.json new file mode 100644 index 0000000000..d30bf16153 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_no_up.json @@ -0,0 +1,31 @@ +{ + "parent": "minecraft:block/block", + "ambientocclusion": false, + "elements": [ + { + "faces": { + "up": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane" + } + }, + "from": [ + 7, + 7, + 7 + ], + "shade": false, + "to": [ + 9, + 9, + 9 + ] + } + ], + "textures": { + "particle": "#pane" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_no_west.json b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_no_west.json new file mode 100644 index 0000000000..4dddcdd298 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_no_west.json @@ -0,0 +1,31 @@ +{ + "parent": "minecraft:block/block", + "ambientocclusion": false, + "elements": [ + { + "faces": { + "west": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane" + } + }, + "from": [ + 7, + 7, + 7 + ], + "shade": false, + "to": [ + 9, + 9, + 9 + ] + } + ], + "textures": { + "particle": "#pane" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_north.json b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_north.json new file mode 100644 index 0000000000..d3dfbc4465 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_north.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "ambientocclusion": false, + "elements": [ + { + "faces": { + "north": { + "cullface": "north", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane" + } + }, + "from": [ + 7, + 7, + 0 + ], + "shade": false, + "to": [ + 9, + 9, + 7 + ] + } + ], + "textures": { + "particle": "#pane" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_north_east.json b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_north_east.json new file mode 100644 index 0000000000..9251394d38 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_north_east.json @@ -0,0 +1,72 @@ +{ + "parent": "minecraft:block/block", + "ambientocclusion": false, + "elements": [ + { + "faces": { + "down": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane" + }, + "east": { + "cullface": "east", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane", + "uv": [ + 0.0, + 7.0, + 7.0, + 9.0 + ] + }, + "north": { + "cullface": "north", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane", + "uv": [ + 9.0, + 7.0, + 16.0, + 9.0 + ] + }, + "up": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane", + "uv": [ + 0.0, + 9.0, + 7.0, + 16.0 + ] + } + }, + "from": [ + 9, + 7, + 0 + ], + "shade": false, + "to": [ + 16, + 9, + 7 + ] + } + ], + "textures": { + "particle": "#pane" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_north_no_down.json b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_north_no_down.json new file mode 100644 index 0000000000..8cc1c0b83e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_north_no_down.json @@ -0,0 +1,37 @@ +{ + "parent": "minecraft:block/block", + "ambientocclusion": false, + "elements": [ + { + "faces": { + "down": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane", + "uv": [ + 7.0, + 0.0, + 9.0, + 7.0 + ] + } + }, + "from": [ + 7, + 7, + 0 + ], + "shade": false, + "to": [ + 9, + 9, + 7 + ] + } + ], + "textures": { + "particle": "#pane" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_north_no_east.json b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_north_no_east.json new file mode 100644 index 0000000000..e1e5349810 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_north_no_east.json @@ -0,0 +1,37 @@ +{ + "parent": "minecraft:block/block", + "ambientocclusion": false, + "elements": [ + { + "faces": { + "east": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane", + "uv": [ + 0.0, + 7.0, + 7.0, + 9.0 + ] + } + }, + "from": [ + 7, + 7, + 0 + ], + "shade": false, + "to": [ + 9, + 9, + 7 + ] + } + ], + "textures": { + "particle": "#pane" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_north_no_up.json b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_north_no_up.json new file mode 100644 index 0000000000..3682985624 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_north_no_up.json @@ -0,0 +1,31 @@ +{ + "parent": "minecraft:block/block", + "ambientocclusion": false, + "elements": [ + { + "faces": { + "up": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane" + } + }, + "from": [ + 7, + 7, + 0 + ], + "shade": false, + "to": [ + 9, + 9, + 7 + ] + } + ], + "textures": { + "particle": "#pane" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_north_no_west.json b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_north_no_west.json new file mode 100644 index 0000000000..1a557363d5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_north_no_west.json @@ -0,0 +1,37 @@ +{ + "parent": "minecraft:block/block", + "ambientocclusion": false, + "elements": [ + { + "faces": { + "west": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane", + "uv": [ + 9.0, + 7.0, + 16.0, + 9.0 + ] + } + }, + "from": [ + 7, + 7, + 0 + ], + "shade": false, + "to": [ + 9, + 9, + 7 + ] + } + ], + "textures": { + "particle": "#pane" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_north_west.json b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_north_west.json new file mode 100644 index 0000000000..00c34247ac --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_north_west.json @@ -0,0 +1,72 @@ +{ + "parent": "minecraft:block/block", + "ambientocclusion": false, + "elements": [ + { + "faces": { + "down": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane" + }, + "north": { + "cullface": "north", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane", + "uv": [ + 0.0, + 7.0, + 7.0, + 9.0 + ] + }, + "up": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane", + "uv": [ + 9.0, + 9.0, + 16.0, + 16.0 + ] + }, + "west": { + "cullface": "west", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane", + "uv": [ + 9.0, + 7.0, + 16.0, + 9.0 + ] + } + }, + "from": [ + 0, + 7, + 0 + ], + "shade": false, + "to": [ + 7, + 9, + 7 + ] + } + ], + "textures": { + "particle": "#pane" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_south.json b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_south.json new file mode 100644 index 0000000000..501f3f0691 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_south.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "ambientocclusion": false, + "elements": [ + { + "faces": { + "south": { + "cullface": "south", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane" + } + }, + "from": [ + 7, + 7, + 9 + ], + "shade": false, + "to": [ + 9, + 9, + 16 + ] + } + ], + "textures": { + "particle": "#pane" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_south_east.json b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_south_east.json new file mode 100644 index 0000000000..2e64bfabe6 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_south_east.json @@ -0,0 +1,78 @@ +{ + "parent": "minecraft:block/block", + "ambientocclusion": false, + "elements": [ + { + "faces": { + "down": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane", + "uv": [ + 9.0, + 9.0, + 16.0, + 16.0 + ] + }, + "east": { + "cullface": "east", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane", + "uv": [ + 9.0, + 7.0, + 16.0, + 9.0 + ] + }, + "south": { + "cullface": "south", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane", + "uv": [ + 0.0, + 7.0, + 7.0, + 9.0 + ] + }, + "up": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane", + "uv": [ + 0.0, + 9.0, + 7.0, + 16.0 + ] + } + }, + "from": [ + 9, + 7, + 9 + ], + "shade": false, + "to": [ + 16, + 9, + 16 + ] + } + ], + "textures": { + "particle": "#pane" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_south_no_down.json b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_south_no_down.json new file mode 100644 index 0000000000..e3249ec611 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_south_no_down.json @@ -0,0 +1,37 @@ +{ + "parent": "minecraft:block/block", + "ambientocclusion": false, + "elements": [ + { + "faces": { + "down": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane", + "uv": [ + 7.0, + 9.0, + 9.0, + 16.0 + ] + } + }, + "from": [ + 7, + 7, + 9 + ], + "shade": false, + "to": [ + 9, + 9, + 16 + ] + } + ], + "textures": { + "particle": "#pane" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_south_no_east.json b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_south_no_east.json new file mode 100644 index 0000000000..313785d03e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_south_no_east.json @@ -0,0 +1,37 @@ +{ + "parent": "minecraft:block/block", + "ambientocclusion": false, + "elements": [ + { + "faces": { + "east": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane", + "uv": [ + 9.0, + 7.0, + 16.0, + 9.0 + ] + } + }, + "from": [ + 7, + 7, + 9 + ], + "shade": false, + "to": [ + 9, + 9, + 16 + ] + } + ], + "textures": { + "particle": "#pane" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_south_no_up.json b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_south_no_up.json new file mode 100644 index 0000000000..08b146435d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_south_no_up.json @@ -0,0 +1,31 @@ +{ + "parent": "minecraft:block/block", + "ambientocclusion": false, + "elements": [ + { + "faces": { + "up": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane" + } + }, + "from": [ + 7, + 7, + 9 + ], + "shade": false, + "to": [ + 9, + 9, + 16 + ] + } + ], + "textures": { + "particle": "#pane" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_south_no_west.json b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_south_no_west.json new file mode 100644 index 0000000000..c2921331d5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_south_no_west.json @@ -0,0 +1,31 @@ +{ + "parent": "minecraft:block/block", + "ambientocclusion": false, + "elements": [ + { + "faces": { + "west": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane" + } + }, + "from": [ + 7, + 7, + 9 + ], + "shade": false, + "to": [ + 9, + 9, + 16 + ] + } + ], + "textures": { + "particle": "#pane" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_south_west.json b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_south_west.json new file mode 100644 index 0000000000..a96e735672 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_south_west.json @@ -0,0 +1,66 @@ +{ + "parent": "minecraft:block/block", + "ambientocclusion": false, + "elements": [ + { + "faces": { + "down": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane", + "uv": [ + 0.0, + 9.0, + 7.0, + 16.0 + ] + }, + "south": { + "cullface": "south", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane" + }, + "up": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane", + "uv": [ + 9.0, + 9.0, + 16.0, + 16.0 + ] + }, + "west": { + "cullface": "west", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane" + } + }, + "from": [ + 0, + 7, + 9 + ], + "shade": false, + "to": [ + 7, + 9, + 16 + ] + } + ], + "textures": { + "particle": "#pane" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_up.json b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_up.json new file mode 100644 index 0000000000..b83c2340f4 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_up.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "ambientocclusion": false, + "elements": [ + { + "faces": { + "up": { + "cullface": "up", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane" + } + }, + "from": [ + 7, + 9, + 7 + ], + "shade": false, + "to": [ + 9, + 16, + 9 + ] + } + ], + "textures": { + "particle": "#pane" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_up_east.json b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_up_east.json new file mode 100644 index 0000000000..b1c0c2e793 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_up_east.json @@ -0,0 +1,72 @@ +{ + "parent": "minecraft:block/block", + "ambientocclusion": false, + "elements": [ + { + "faces": { + "east": { + "cullface": "east", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane", + "uv": [ + 7.0, + 9.0, + 9.0, + 16.0 + ] + }, + "north": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane", + "uv": [ + 9.0, + 9.0, + 16.0, + 16.0 + ] + }, + "south": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane", + "uv": [ + 0.0, + 9.0, + 7.0, + 16.0 + ] + }, + "up": { + "cullface": "up", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane" + } + }, + "from": [ + 9, + 9, + 7 + ], + "shade": false, + "to": [ + 16, + 16, + 9 + ] + } + ], + "textures": { + "particle": "#pane" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_up_no_east.json b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_up_no_east.json new file mode 100644 index 0000000000..6390d4a3aa --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_up_no_east.json @@ -0,0 +1,37 @@ +{ + "parent": "minecraft:block/block", + "ambientocclusion": false, + "elements": [ + { + "faces": { + "east": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane", + "uv": [ + 7.0, + 9.0, + 9.0, + 16.0 + ] + } + }, + "from": [ + 7, + 9, + 7 + ], + "shade": false, + "to": [ + 9, + 16, + 9 + ] + } + ], + "textures": { + "particle": "#pane" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_up_no_north.json b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_up_no_north.json new file mode 100644 index 0000000000..eade264aee --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_up_no_north.json @@ -0,0 +1,37 @@ +{ + "parent": "minecraft:block/block", + "ambientocclusion": false, + "elements": [ + { + "faces": { + "north": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane", + "uv": [ + 7.0, + 9.0, + 9.0, + 16.0 + ] + } + }, + "from": [ + 7, + 9, + 7 + ], + "shade": false, + "to": [ + 9, + 16, + 9 + ] + } + ], + "textures": { + "particle": "#pane" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_up_no_south.json b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_up_no_south.json new file mode 100644 index 0000000000..142db4bf9b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_up_no_south.json @@ -0,0 +1,37 @@ +{ + "parent": "minecraft:block/block", + "ambientocclusion": false, + "elements": [ + { + "faces": { + "south": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane", + "uv": [ + 7.0, + 9.0, + 9.0, + 16.0 + ] + } + }, + "from": [ + 7, + 9, + 7 + ], + "shade": false, + "to": [ + 9, + 16, + 9 + ] + } + ], + "textures": { + "particle": "#pane" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_up_no_west.json b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_up_no_west.json new file mode 100644 index 0000000000..c923338688 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_up_no_west.json @@ -0,0 +1,37 @@ +{ + "parent": "minecraft:block/block", + "ambientocclusion": false, + "elements": [ + { + "faces": { + "west": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane", + "uv": [ + 7.0, + 9.0, + 9.0, + 16.0 + ] + } + }, + "from": [ + 7, + 9, + 7 + ], + "shade": false, + "to": [ + 9, + 16, + 9 + ] + } + ], + "textures": { + "particle": "#pane" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_up_north.json b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_up_north.json new file mode 100644 index 0000000000..eae3c7caf4 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_up_north.json @@ -0,0 +1,72 @@ +{ + "parent": "minecraft:block/block", + "ambientocclusion": false, + "elements": [ + { + "faces": { + "east": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane", + "uv": [ + 9.0, + 9.0, + 16.0, + 16.0 + ] + }, + "north": { + "cullface": "north", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane", + "uv": [ + 7.0, + 9.0, + 9.0, + 16.0 + ] + }, + "up": { + "cullface": "up", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane" + }, + "west": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane", + "uv": [ + 0.0, + 9.0, + 7.0, + 16.0 + ] + } + }, + "from": [ + 7, + 9, + 0 + ], + "shade": false, + "to": [ + 9, + 16, + 7 + ] + } + ], + "textures": { + "particle": "#pane" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_up_south.json b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_up_south.json new file mode 100644 index 0000000000..a3fdec33dc --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_up_south.json @@ -0,0 +1,72 @@ +{ + "parent": "minecraft:block/block", + "ambientocclusion": false, + "elements": [ + { + "faces": { + "east": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane", + "uv": [ + 0.0, + 9.0, + 7.0, + 16.0 + ] + }, + "south": { + "cullface": "south", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane", + "uv": [ + 7.0, + 9.0, + 9.0, + 16.0 + ] + }, + "up": { + "cullface": "up", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane" + }, + "west": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane", + "uv": [ + 9.0, + 9.0, + 16.0, + 16.0 + ] + } + }, + "from": [ + 7, + 9, + 9 + ], + "shade": false, + "to": [ + 9, + 16, + 16 + ] + } + ], + "textures": { + "particle": "#pane" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_up_west.json b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_up_west.json new file mode 100644 index 0000000000..b2c93a1d7b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_up_west.json @@ -0,0 +1,72 @@ +{ + "parent": "minecraft:block/block", + "ambientocclusion": false, + "elements": [ + { + "faces": { + "north": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane", + "uv": [ + 0.0, + 9.0, + 7.0, + 16.0 + ] + }, + "south": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane", + "uv": [ + 9.0, + 9.0, + 16.0, + 16.0 + ] + }, + "up": { + "cullface": "up", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane" + }, + "west": { + "cullface": "west", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane", + "uv": [ + 7.0, + 9.0, + 9.0, + 16.0 + ] + } + }, + "from": [ + 0, + 9, + 7 + ], + "shade": false, + "to": [ + 7, + 16, + 9 + ] + } + ], + "textures": { + "particle": "#pane" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_west.json b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_west.json new file mode 100644 index 0000000000..e3a74c0942 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_west.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "ambientocclusion": false, + "elements": [ + { + "faces": { + "west": { + "cullface": "west", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane" + } + }, + "from": [ + 0, + 7, + 7 + ], + "shade": false, + "to": [ + 7, + 9, + 9 + ] + } + ], + "textures": { + "particle": "#pane" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_west_no_down.json b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_west_no_down.json new file mode 100644 index 0000000000..ea8f79d8d6 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_west_no_down.json @@ -0,0 +1,31 @@ +{ + "parent": "minecraft:block/block", + "ambientocclusion": false, + "elements": [ + { + "faces": { + "down": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane" + } + }, + "from": [ + 0, + 7, + 7 + ], + "shade": false, + "to": [ + 7, + 9, + 9 + ] + } + ], + "textures": { + "particle": "#pane" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_west_no_north.json b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_west_no_north.json new file mode 100644 index 0000000000..340026f21f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_west_no_north.json @@ -0,0 +1,37 @@ +{ + "parent": "minecraft:block/block", + "ambientocclusion": false, + "elements": [ + { + "faces": { + "north": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane", + "uv": [ + 0.0, + 7.0, + 7.0, + 9.0 + ] + } + }, + "from": [ + 0, + 7, + 7 + ], + "shade": false, + "to": [ + 7, + 9, + 9 + ] + } + ], + "textures": { + "particle": "#pane" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_west_no_south.json b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_west_no_south.json new file mode 100644 index 0000000000..dc06a5ab62 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_west_no_south.json @@ -0,0 +1,31 @@ +{ + "parent": "minecraft:block/block", + "ambientocclusion": false, + "elements": [ + { + "faces": { + "south": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane" + } + }, + "from": [ + 0, + 7, + 7 + ], + "shade": false, + "to": [ + 7, + 9, + 9 + ] + } + ], + "textures": { + "particle": "#pane" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_west_no_up.json b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_west_no_up.json new file mode 100644 index 0000000000..0002e7b68d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/force_field_west_no_up.json @@ -0,0 +1,31 @@ +{ + "parent": "minecraft:block/block", + "ambientocclusion": false, + "elements": [ + { + "faces": { + "up": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#pane" + } + }, + "from": [ + 0, + 7, + 7 + ], + "shade": false, + "to": [ + 7, + 9, + 9 + ] + } + ], + "textures": { + "particle": "#pane" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_down.json b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_down.json new file mode 100644 index 0000000000..2fda226233 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_down.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_down", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/green_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_down_east.json b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_down_east.json new file mode 100644 index 0000000000..0aeb39349f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_down_east.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_down_east", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/green_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_down_no_east.json b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_down_no_east.json new file mode 100644 index 0000000000..0279d559ea --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_down_no_east.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_down_no_east", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/green_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_down_no_north.json b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_down_no_north.json new file mode 100644 index 0000000000..8daf9f7a4b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_down_no_north.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_down_no_north", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/green_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_down_no_south.json b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_down_no_south.json new file mode 100644 index 0000000000..11a4c0e144 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_down_no_south.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_down_no_south", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/green_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_down_no_west.json b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_down_no_west.json new file mode 100644 index 0000000000..b2aa83b52b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_down_no_west.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_down_no_west", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/green_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_down_north.json b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_down_north.json new file mode 100644 index 0000000000..8a24e0919d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_down_north.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_down_north", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/green_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_down_south.json b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_down_south.json new file mode 100644 index 0000000000..13994f6735 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_down_south.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_down_south", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/green_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_down_west.json b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_down_west.json new file mode 100644 index 0000000000..fbad24ce69 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_down_west.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_down_west", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/green_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_east.json b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_east.json new file mode 100644 index 0000000000..a8c5ffe638 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_east.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_east", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/green_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_east_no_down.json b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_east_no_down.json new file mode 100644 index 0000000000..1643299660 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_east_no_down.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_east_no_down", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/green_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_east_no_north.json b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_east_no_north.json new file mode 100644 index 0000000000..3329fab0af --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_east_no_north.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_east_no_north", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/green_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_east_no_south.json b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_east_no_south.json new file mode 100644 index 0000000000..a6106bdc7d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_east_no_south.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_east_no_south", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/green_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_east_no_up.json b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_east_no_up.json new file mode 100644 index 0000000000..753019eeeb --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_east_no_up.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_east_no_up", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/green_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_no_down.json b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_no_down.json new file mode 100644 index 0000000000..cb892a7760 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_no_down.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_no_down", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/green_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_no_east.json b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_no_east.json new file mode 100644 index 0000000000..b5f4e66655 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_no_east.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_no_east", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/green_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_no_north.json b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_no_north.json new file mode 100644 index 0000000000..0279eba965 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_no_north.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_no_north", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/green_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_no_south.json b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_no_south.json new file mode 100644 index 0000000000..76a45a43cd --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_no_south.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_no_south", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/green_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_no_up.json b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_no_up.json new file mode 100644 index 0000000000..dfbd485a30 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_no_up.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_no_up", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/green_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_no_west.json b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_no_west.json new file mode 100644 index 0000000000..7418accb20 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_no_west.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_no_west", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/green_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_north.json b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_north.json new file mode 100644 index 0000000000..4b29304dc2 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_north.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_north", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/green_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_north_east.json b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_north_east.json new file mode 100644 index 0000000000..c0499086b1 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_north_east.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_north_east", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/green_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_north_no_down.json b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_north_no_down.json new file mode 100644 index 0000000000..a818db9379 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_north_no_down.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_north_no_down", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/green_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_north_no_east.json b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_north_no_east.json new file mode 100644 index 0000000000..9cbf0deafa --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_north_no_east.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_north_no_east", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/green_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_north_no_up.json b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_north_no_up.json new file mode 100644 index 0000000000..4f67292d7f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_north_no_up.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_north_no_up", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/green_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_north_no_west.json b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_north_no_west.json new file mode 100644 index 0000000000..a7923d793a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_north_no_west.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_north_no_west", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/green_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_north_west.json b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_north_west.json new file mode 100644 index 0000000000..205f6e1936 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_north_west.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_north_west", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/green_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_south.json b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_south.json new file mode 100644 index 0000000000..98a22f82df --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_south.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_south", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/green_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_south_east.json b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_south_east.json new file mode 100644 index 0000000000..2186fc3051 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_south_east.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_south_east", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/green_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_south_no_down.json b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_south_no_down.json new file mode 100644 index 0000000000..3c82ae1250 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_south_no_down.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_south_no_down", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/green_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_south_no_east.json b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_south_no_east.json new file mode 100644 index 0000000000..e7e12c63e5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_south_no_east.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_south_no_east", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/green_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_south_no_up.json b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_south_no_up.json new file mode 100644 index 0000000000..09ba3d2dd4 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_south_no_up.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_south_no_up", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/green_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_south_no_west.json b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_south_no_west.json new file mode 100644 index 0000000000..316f97f07d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_south_no_west.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_south_no_west", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/green_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_south_west.json b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_south_west.json new file mode 100644 index 0000000000..2c7ec1c8f8 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_south_west.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_south_west", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/green_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_up.json b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_up.json new file mode 100644 index 0000000000..60041a34a4 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_up.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_up", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/green_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_up_east.json b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_up_east.json new file mode 100644 index 0000000000..eb90c8bc2a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_up_east.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_up_east", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/green_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_up_no_east.json b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_up_no_east.json new file mode 100644 index 0000000000..f42d9d9ea0 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_up_no_east.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_up_no_east", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/green_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_up_no_north.json b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_up_no_north.json new file mode 100644 index 0000000000..82e73f67e9 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_up_no_north.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_up_no_north", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/green_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_up_no_south.json b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_up_no_south.json new file mode 100644 index 0000000000..d641f681f3 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_up_no_south.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_up_no_south", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/green_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_up_no_west.json b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_up_no_west.json new file mode 100644 index 0000000000..0c90d37a2d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_up_no_west.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_up_no_west", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/green_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_up_north.json b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_up_north.json new file mode 100644 index 0000000000..222b79f840 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_up_north.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_up_north", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/green_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_up_south.json b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_up_south.json new file mode 100644 index 0000000000..489dd6537f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_up_south.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_up_south", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/green_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_up_west.json b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_up_west.json new file mode 100644 index 0000000000..4549fcdae9 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_up_west.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_up_west", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/green_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_west.json b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_west.json new file mode 100644 index 0000000000..fe4f583f23 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_west.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_west", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/green_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_west_no_down.json b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_west_no_down.json new file mode 100644 index 0000000000..0f9557f12f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_west_no_down.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_west_no_down", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/green_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_west_no_north.json b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_west_no_north.json new file mode 100644 index 0000000000..e857fcd854 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_west_no_north.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_west_no_north", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/green_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_west_no_south.json b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_west_no_south.json new file mode 100644 index 0000000000..0a51dce73a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_west_no_south.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_west_no_south", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/green_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_west_no_up.json b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_west_no_up.json new file mode 100644 index 0000000000..f7250552b9 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/green_force_field_west_no_up.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_west_no_up", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/green_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_down.json b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_down.json new file mode 100644 index 0000000000..9da95957a3 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_down.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_down", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/orange_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_down_east.json b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_down_east.json new file mode 100644 index 0000000000..775e6e20b9 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_down_east.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_down_east", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/orange_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_down_no_east.json b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_down_no_east.json new file mode 100644 index 0000000000..b3ea418415 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_down_no_east.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_down_no_east", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/orange_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_down_no_north.json b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_down_no_north.json new file mode 100644 index 0000000000..929f17c18a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_down_no_north.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_down_no_north", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/orange_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_down_no_south.json b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_down_no_south.json new file mode 100644 index 0000000000..fde07c7a53 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_down_no_south.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_down_no_south", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/orange_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_down_no_west.json b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_down_no_west.json new file mode 100644 index 0000000000..3d549d6dae --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_down_no_west.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_down_no_west", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/orange_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_down_north.json b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_down_north.json new file mode 100644 index 0000000000..fb1a919072 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_down_north.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_down_north", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/orange_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_down_south.json b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_down_south.json new file mode 100644 index 0000000000..cdffcac471 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_down_south.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_down_south", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/orange_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_down_west.json b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_down_west.json new file mode 100644 index 0000000000..38d03c35e3 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_down_west.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_down_west", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/orange_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_east.json b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_east.json new file mode 100644 index 0000000000..a3f77ca568 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_east.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_east", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/orange_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_east_no_down.json b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_east_no_down.json new file mode 100644 index 0000000000..8f18ad92ca --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_east_no_down.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_east_no_down", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/orange_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_east_no_north.json b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_east_no_north.json new file mode 100644 index 0000000000..07b8c58878 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_east_no_north.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_east_no_north", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/orange_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_east_no_south.json b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_east_no_south.json new file mode 100644 index 0000000000..ccc789712e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_east_no_south.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_east_no_south", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/orange_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_east_no_up.json b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_east_no_up.json new file mode 100644 index 0000000000..17a3b280a9 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_east_no_up.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_east_no_up", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/orange_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_no_down.json b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_no_down.json new file mode 100644 index 0000000000..8da4ffaef6 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_no_down.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_no_down", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/orange_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_no_east.json b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_no_east.json new file mode 100644 index 0000000000..5fb5578858 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_no_east.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_no_east", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/orange_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_no_north.json b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_no_north.json new file mode 100644 index 0000000000..e809403d3c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_no_north.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_no_north", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/orange_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_no_south.json b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_no_south.json new file mode 100644 index 0000000000..14f0f7b2d8 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_no_south.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_no_south", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/orange_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_no_up.json b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_no_up.json new file mode 100644 index 0000000000..5ee646721b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_no_up.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_no_up", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/orange_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_no_west.json b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_no_west.json new file mode 100644 index 0000000000..c969f7a3c1 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_no_west.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_no_west", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/orange_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_north.json b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_north.json new file mode 100644 index 0000000000..006aa2d34f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_north.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_north", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/orange_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_north_east.json b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_north_east.json new file mode 100644 index 0000000000..ef3f58d48c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_north_east.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_north_east", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/orange_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_north_no_down.json b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_north_no_down.json new file mode 100644 index 0000000000..4c418c01ef --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_north_no_down.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_north_no_down", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/orange_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_north_no_east.json b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_north_no_east.json new file mode 100644 index 0000000000..1645a03671 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_north_no_east.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_north_no_east", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/orange_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_north_no_up.json b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_north_no_up.json new file mode 100644 index 0000000000..8d22daa284 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_north_no_up.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_north_no_up", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/orange_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_north_no_west.json b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_north_no_west.json new file mode 100644 index 0000000000..a8770ebd91 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_north_no_west.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_north_no_west", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/orange_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_north_west.json b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_north_west.json new file mode 100644 index 0000000000..1f7d98f5d6 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_north_west.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_north_west", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/orange_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_south.json b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_south.json new file mode 100644 index 0000000000..2db7bde579 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_south.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_south", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/orange_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_south_east.json b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_south_east.json new file mode 100644 index 0000000000..263a1e0c3b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_south_east.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_south_east", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/orange_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_south_no_down.json b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_south_no_down.json new file mode 100644 index 0000000000..14c29cc2c8 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_south_no_down.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_south_no_down", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/orange_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_south_no_east.json b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_south_no_east.json new file mode 100644 index 0000000000..1121fdcd8e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_south_no_east.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_south_no_east", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/orange_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_south_no_up.json b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_south_no_up.json new file mode 100644 index 0000000000..f9d8ce0640 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_south_no_up.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_south_no_up", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/orange_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_south_no_west.json b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_south_no_west.json new file mode 100644 index 0000000000..b264b5f511 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_south_no_west.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_south_no_west", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/orange_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_south_west.json b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_south_west.json new file mode 100644 index 0000000000..879cd2f465 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_south_west.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_south_west", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/orange_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_up.json b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_up.json new file mode 100644 index 0000000000..fd7404787b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_up.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_up", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/orange_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_up_east.json b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_up_east.json new file mode 100644 index 0000000000..1abdafc0e3 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_up_east.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_up_east", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/orange_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_up_no_east.json b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_up_no_east.json new file mode 100644 index 0000000000..fc4a7e99ea --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_up_no_east.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_up_no_east", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/orange_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_up_no_north.json b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_up_no_north.json new file mode 100644 index 0000000000..83a9d339f8 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_up_no_north.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_up_no_north", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/orange_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_up_no_south.json b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_up_no_south.json new file mode 100644 index 0000000000..2ef80ce110 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_up_no_south.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_up_no_south", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/orange_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_up_no_west.json b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_up_no_west.json new file mode 100644 index 0000000000..4f9baed3a6 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_up_no_west.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_up_no_west", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/orange_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_up_north.json b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_up_north.json new file mode 100644 index 0000000000..f8f7d9447e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_up_north.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_up_north", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/orange_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_up_south.json b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_up_south.json new file mode 100644 index 0000000000..b6ff6f75e3 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_up_south.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_up_south", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/orange_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_up_west.json b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_up_west.json new file mode 100644 index 0000000000..aaa461d105 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_up_west.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_up_west", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/orange_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_west.json b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_west.json new file mode 100644 index 0000000000..5fcd34a04d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_west.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_west", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/orange_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_west_no_down.json b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_west_no_down.json new file mode 100644 index 0000000000..257632d243 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_west_no_down.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_west_no_down", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/orange_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_west_no_north.json b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_west_no_north.json new file mode 100644 index 0000000000..9689a06599 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_west_no_north.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_west_no_north", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/orange_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_west_no_south.json b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_west_no_south.json new file mode 100644 index 0000000000..d436a6a132 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_west_no_south.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_west_no_south", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/orange_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_west_no_up.json b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_west_no_up.json new file mode 100644 index 0000000000..4f550859a1 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/orange_force_field_west_no_up.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_west_no_up", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/orange_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_down.json b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_down.json new file mode 100644 index 0000000000..4a5f0300ef --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_down.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_down", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/pink_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_down_east.json b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_down_east.json new file mode 100644 index 0000000000..47d5474778 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_down_east.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_down_east", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/pink_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_down_no_east.json b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_down_no_east.json new file mode 100644 index 0000000000..c5e344fc3d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_down_no_east.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_down_no_east", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/pink_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_down_no_north.json b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_down_no_north.json new file mode 100644 index 0000000000..b0158cfa99 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_down_no_north.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_down_no_north", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/pink_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_down_no_south.json b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_down_no_south.json new file mode 100644 index 0000000000..c4ebad5f5d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_down_no_south.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_down_no_south", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/pink_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_down_no_west.json b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_down_no_west.json new file mode 100644 index 0000000000..9dc350c612 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_down_no_west.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_down_no_west", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/pink_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_down_north.json b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_down_north.json new file mode 100644 index 0000000000..aae26db490 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_down_north.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_down_north", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/pink_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_down_south.json b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_down_south.json new file mode 100644 index 0000000000..36d957a314 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_down_south.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_down_south", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/pink_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_down_west.json b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_down_west.json new file mode 100644 index 0000000000..a15239f13a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_down_west.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_down_west", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/pink_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_east.json b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_east.json new file mode 100644 index 0000000000..fec146e7bd --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_east.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_east", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/pink_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_east_no_down.json b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_east_no_down.json new file mode 100644 index 0000000000..3863879d78 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_east_no_down.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_east_no_down", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/pink_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_east_no_north.json b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_east_no_north.json new file mode 100644 index 0000000000..8e3146b7e9 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_east_no_north.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_east_no_north", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/pink_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_east_no_south.json b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_east_no_south.json new file mode 100644 index 0000000000..31aeec352a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_east_no_south.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_east_no_south", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/pink_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_east_no_up.json b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_east_no_up.json new file mode 100644 index 0000000000..514ba14eb8 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_east_no_up.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_east_no_up", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/pink_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_no_down.json b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_no_down.json new file mode 100644 index 0000000000..d463a19783 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_no_down.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_no_down", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/pink_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_no_east.json b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_no_east.json new file mode 100644 index 0000000000..7a8bbb2962 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_no_east.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_no_east", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/pink_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_no_north.json b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_no_north.json new file mode 100644 index 0000000000..018911fd09 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_no_north.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_no_north", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/pink_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_no_south.json b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_no_south.json new file mode 100644 index 0000000000..762b6de151 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_no_south.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_no_south", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/pink_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_no_up.json b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_no_up.json new file mode 100644 index 0000000000..a9cbc1443e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_no_up.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_no_up", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/pink_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_no_west.json b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_no_west.json new file mode 100644 index 0000000000..df4d56aa1e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_no_west.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_no_west", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/pink_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_north.json b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_north.json new file mode 100644 index 0000000000..648b05b9a8 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_north.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_north", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/pink_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_north_east.json b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_north_east.json new file mode 100644 index 0000000000..96b9b5b40f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_north_east.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_north_east", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/pink_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_north_no_down.json b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_north_no_down.json new file mode 100644 index 0000000000..e9dd424e3d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_north_no_down.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_north_no_down", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/pink_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_north_no_east.json b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_north_no_east.json new file mode 100644 index 0000000000..f3d8b1a5fe --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_north_no_east.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_north_no_east", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/pink_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_north_no_up.json b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_north_no_up.json new file mode 100644 index 0000000000..499c60a461 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_north_no_up.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_north_no_up", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/pink_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_north_no_west.json b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_north_no_west.json new file mode 100644 index 0000000000..ec026517ca --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_north_no_west.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_north_no_west", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/pink_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_north_west.json b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_north_west.json new file mode 100644 index 0000000000..cb1cea35fb --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_north_west.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_north_west", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/pink_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_south.json b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_south.json new file mode 100644 index 0000000000..61698c90da --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_south.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_south", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/pink_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_south_east.json b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_south_east.json new file mode 100644 index 0000000000..d217dbb8c2 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_south_east.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_south_east", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/pink_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_south_no_down.json b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_south_no_down.json new file mode 100644 index 0000000000..f886d2668c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_south_no_down.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_south_no_down", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/pink_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_south_no_east.json b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_south_no_east.json new file mode 100644 index 0000000000..4d27663aca --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_south_no_east.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_south_no_east", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/pink_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_south_no_up.json b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_south_no_up.json new file mode 100644 index 0000000000..1f80cfd630 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_south_no_up.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_south_no_up", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/pink_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_south_no_west.json b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_south_no_west.json new file mode 100644 index 0000000000..2a7ef2870e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_south_no_west.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_south_no_west", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/pink_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_south_west.json b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_south_west.json new file mode 100644 index 0000000000..110a5a7160 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_south_west.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_south_west", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/pink_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_up.json b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_up.json new file mode 100644 index 0000000000..8bc5111ae3 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_up.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_up", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/pink_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_up_east.json b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_up_east.json new file mode 100644 index 0000000000..981be160f7 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_up_east.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_up_east", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/pink_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_up_no_east.json b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_up_no_east.json new file mode 100644 index 0000000000..e7f96f0b20 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_up_no_east.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_up_no_east", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/pink_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_up_no_north.json b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_up_no_north.json new file mode 100644 index 0000000000..f625dc3baf --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_up_no_north.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_up_no_north", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/pink_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_up_no_south.json b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_up_no_south.json new file mode 100644 index 0000000000..d6662fad0b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_up_no_south.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_up_no_south", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/pink_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_up_no_west.json b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_up_no_west.json new file mode 100644 index 0000000000..41bdb199c6 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_up_no_west.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_up_no_west", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/pink_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_up_north.json b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_up_north.json new file mode 100644 index 0000000000..3351a04991 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_up_north.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_up_north", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/pink_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_up_south.json b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_up_south.json new file mode 100644 index 0000000000..466038798d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_up_south.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_up_south", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/pink_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_up_west.json b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_up_west.json new file mode 100644 index 0000000000..056b7ecf48 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_up_west.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_up_west", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/pink_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_west.json b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_west.json new file mode 100644 index 0000000000..2459831c95 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_west.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_west", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/pink_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_west_no_down.json b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_west_no_down.json new file mode 100644 index 0000000000..3c53357838 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_west_no_down.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_west_no_down", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/pink_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_west_no_north.json b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_west_no_north.json new file mode 100644 index 0000000000..50f3565a94 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_west_no_north.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_west_no_north", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/pink_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_west_no_south.json b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_west_no_south.json new file mode 100644 index 0000000000..530823ae14 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_west_no_south.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_west_no_south", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/pink_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_west_no_up.json b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_west_no_up.json new file mode 100644 index 0000000000..638aab5801 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/pink_force_field_west_no_up.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_west_no_up", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/pink_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_down.json b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_down.json new file mode 100644 index 0000000000..7bc11ef170 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_down.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_down", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/violet_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_down_east.json b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_down_east.json new file mode 100644 index 0000000000..b1af8c9a17 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_down_east.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_down_east", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/violet_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_down_no_east.json b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_down_no_east.json new file mode 100644 index 0000000000..e7b87dfca3 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_down_no_east.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_down_no_east", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/violet_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_down_no_north.json b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_down_no_north.json new file mode 100644 index 0000000000..c180a75410 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_down_no_north.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_down_no_north", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/violet_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_down_no_south.json b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_down_no_south.json new file mode 100644 index 0000000000..69459b7ffa --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_down_no_south.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_down_no_south", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/violet_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_down_no_west.json b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_down_no_west.json new file mode 100644 index 0000000000..bce812d940 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_down_no_west.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_down_no_west", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/violet_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_down_north.json b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_down_north.json new file mode 100644 index 0000000000..49951f1066 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_down_north.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_down_north", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/violet_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_down_south.json b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_down_south.json new file mode 100644 index 0000000000..de401c8e1e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_down_south.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_down_south", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/violet_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_down_west.json b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_down_west.json new file mode 100644 index 0000000000..6b5343fb20 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_down_west.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_down_west", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/violet_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_east.json b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_east.json new file mode 100644 index 0000000000..e54a205b8c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_east.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_east", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/violet_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_east_no_down.json b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_east_no_down.json new file mode 100644 index 0000000000..b1b5dd57b1 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_east_no_down.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_east_no_down", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/violet_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_east_no_north.json b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_east_no_north.json new file mode 100644 index 0000000000..c99d2fc2b0 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_east_no_north.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_east_no_north", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/violet_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_east_no_south.json b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_east_no_south.json new file mode 100644 index 0000000000..40a923ab96 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_east_no_south.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_east_no_south", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/violet_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_east_no_up.json b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_east_no_up.json new file mode 100644 index 0000000000..f22f2d6685 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_east_no_up.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_east_no_up", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/violet_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_no_down.json b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_no_down.json new file mode 100644 index 0000000000..f15899175d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_no_down.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_no_down", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/violet_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_no_east.json b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_no_east.json new file mode 100644 index 0000000000..33d2b394f7 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_no_east.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_no_east", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/violet_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_no_north.json b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_no_north.json new file mode 100644 index 0000000000..71d105cd66 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_no_north.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_no_north", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/violet_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_no_south.json b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_no_south.json new file mode 100644 index 0000000000..2d0c25353f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_no_south.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_no_south", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/violet_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_no_up.json b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_no_up.json new file mode 100644 index 0000000000..c243285461 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_no_up.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_no_up", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/violet_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_no_west.json b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_no_west.json new file mode 100644 index 0000000000..9244d1cef9 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_no_west.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_no_west", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/violet_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_north.json b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_north.json new file mode 100644 index 0000000000..8fb73f3d9e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_north.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_north", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/violet_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_north_east.json b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_north_east.json new file mode 100644 index 0000000000..532fb974a3 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_north_east.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_north_east", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/violet_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_north_no_down.json b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_north_no_down.json new file mode 100644 index 0000000000..ae7a5b18ab --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_north_no_down.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_north_no_down", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/violet_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_north_no_east.json b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_north_no_east.json new file mode 100644 index 0000000000..ef86b14f87 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_north_no_east.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_north_no_east", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/violet_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_north_no_up.json b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_north_no_up.json new file mode 100644 index 0000000000..009f9b3397 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_north_no_up.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_north_no_up", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/violet_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_north_no_west.json b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_north_no_west.json new file mode 100644 index 0000000000..03a5d3313d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_north_no_west.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_north_no_west", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/violet_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_north_west.json b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_north_west.json new file mode 100644 index 0000000000..dd1e2f3d04 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_north_west.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_north_west", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/violet_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_south.json b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_south.json new file mode 100644 index 0000000000..0d65c053c8 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_south.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_south", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/violet_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_south_east.json b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_south_east.json new file mode 100644 index 0000000000..2abab7609a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_south_east.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_south_east", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/violet_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_south_no_down.json b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_south_no_down.json new file mode 100644 index 0000000000..2ebf3fa02d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_south_no_down.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_south_no_down", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/violet_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_south_no_east.json b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_south_no_east.json new file mode 100644 index 0000000000..7a02c91532 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_south_no_east.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_south_no_east", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/violet_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_south_no_up.json b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_south_no_up.json new file mode 100644 index 0000000000..a976c9905a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_south_no_up.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_south_no_up", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/violet_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_south_no_west.json b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_south_no_west.json new file mode 100644 index 0000000000..ee2f3826f3 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_south_no_west.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_south_no_west", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/violet_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_south_west.json b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_south_west.json new file mode 100644 index 0000000000..a5b1f85d52 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_south_west.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_south_west", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/violet_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_up.json b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_up.json new file mode 100644 index 0000000000..8e5ba3def9 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_up.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_up", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/violet_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_up_east.json b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_up_east.json new file mode 100644 index 0000000000..d7561b9fe4 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_up_east.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_up_east", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/violet_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_up_no_east.json b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_up_no_east.json new file mode 100644 index 0000000000..fc183df019 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_up_no_east.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_up_no_east", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/violet_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_up_no_north.json b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_up_no_north.json new file mode 100644 index 0000000000..8c6d0a407a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_up_no_north.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_up_no_north", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/violet_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_up_no_south.json b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_up_no_south.json new file mode 100644 index 0000000000..b57d0dd125 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_up_no_south.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_up_no_south", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/violet_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_up_no_west.json b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_up_no_west.json new file mode 100644 index 0000000000..959da71b37 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_up_no_west.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_up_no_west", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/violet_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_up_north.json b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_up_north.json new file mode 100644 index 0000000000..118cd86df4 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_up_north.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_up_north", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/violet_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_up_south.json b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_up_south.json new file mode 100644 index 0000000000..61ea980a41 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_up_south.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_up_south", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/violet_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_up_west.json b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_up_west.json new file mode 100644 index 0000000000..608636b200 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_up_west.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_up_west", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/violet_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_west.json b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_west.json new file mode 100644 index 0000000000..8e6c6d2497 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_west.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_west", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/violet_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_west_no_down.json b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_west_no_down.json new file mode 100644 index 0000000000..0474cabd7f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_west_no_down.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_west_no_down", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/violet_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_west_no_north.json b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_west_no_north.json new file mode 100644 index 0000000000..803504c112 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_west_no_north.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_west_no_north", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/violet_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_west_no_south.json b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_west_no_south.json new file mode 100644 index 0000000000..d8b87997e2 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_west_no_south.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_west_no_south", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/violet_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_west_no_up.json b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_west_no_up.json new file mode 100644 index 0000000000..c8fb7db89a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/force_field/violet_force_field_west_no_up.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/force_field/force_field_west_no_up", + "render_type": "minecraft:translucent", + "textures": { + "pane": "twilightforest:block/violet_force_field" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/ghast_trap.json b/src/generated/resources/assets/twilightforest/models/block/ghast_trap.json new file mode 100644 index 0000000000..674c92a5da --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/ghast_trap.json @@ -0,0 +1,157 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "texture": "#bottom" + }, + "east": { + "cullface": "east", + "texture": "#side" + }, + "north": { + "cullface": "north", + "texture": "#side" + }, + "south": { + "cullface": "south", + "texture": "#side" + }, + "up": { + "cullface": "up", + "texture": "#top" + }, + "west": { + "cullface": "west", + "texture": "#side" + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + }, + { + "faces": { + "east": { + "cullface": "east", + "forge_data": { + "block_light": 15 + }, + "texture": "#side2" + }, + "north": { + "cullface": "north", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#side2" + }, + "south": { + "cullface": "south", + "forge_data": { + "block_light": 15 + }, + "texture": "#side2" + }, + "up": { + "cullface": "up", + "forge_data": { + "block_light": 10 + }, + "texture": "#top2" + }, + "west": { + "cullface": "west", + "forge_data": { + "block_light": 15 + }, + "texture": "#side2" + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + }, + { + "faces": { + "east": { + "cullface": "east", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#side3" + }, + "north": { + "cullface": "north", + "forge_data": { + "block_light": 10 + }, + "texture": "#side3" + }, + "south": { + "cullface": "south", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#side3" + }, + "up": { + "cullface": "up", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#top3" + }, + "west": { + "cullface": "west", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#side3" + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + } + ], + "render_type": "minecraft:cutout", + "textures": { + "bottom": "twilightforest:block/encased_towerwood", + "particle": "#bottom", + "side": "twilightforest:block/towerdev_ghasttrap_off", + "side2": "twilightforest:block/tower_device_level_1/towerdev_ghasttrap_off_1", + "side3": "twilightforest:block/tower_device_level_2/towerdev_ghasttrap_off_2", + "top": "twilightforest:block/towerdev_ghasttraplid_off", + "top2": "twilightforest:block/tower_device_level_2/towerdev_ghasttraplid_off_1", + "top3": "twilightforest:block/tower_device_level_2/towerdev_ghasttraplid_off_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/ghast_trap_active.json b/src/generated/resources/assets/twilightforest/models/block/ghast_trap_active.json new file mode 100644 index 0000000000..88da6957b2 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/ghast_trap_active.json @@ -0,0 +1,157 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "texture": "#bottom" + }, + "east": { + "cullface": "east", + "texture": "#side" + }, + "north": { + "cullface": "north", + "texture": "#side" + }, + "south": { + "cullface": "south", + "texture": "#side" + }, + "up": { + "cullface": "up", + "texture": "#top" + }, + "west": { + "cullface": "west", + "texture": "#side" + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + }, + { + "faces": { + "east": { + "cullface": "east", + "forge_data": { + "block_light": 15 + }, + "texture": "#side2" + }, + "north": { + "cullface": "north", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#side2" + }, + "south": { + "cullface": "south", + "forge_data": { + "block_light": 15 + }, + "texture": "#side2" + }, + "up": { + "cullface": "up", + "forge_data": { + "block_light": 10 + }, + "texture": "#top2" + }, + "west": { + "cullface": "west", + "forge_data": { + "block_light": 15 + }, + "texture": "#side2" + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + }, + { + "faces": { + "east": { + "cullface": "east", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#side3" + }, + "north": { + "cullface": "north", + "forge_data": { + "block_light": 10 + }, + "texture": "#side3" + }, + "south": { + "cullface": "south", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#side3" + }, + "up": { + "cullface": "up", + "forge_data": { + "block_light": 7, + "sky_light": 7 + }, + "texture": "#top3" + }, + "west": { + "cullface": "west", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#side3" + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + } + ], + "render_type": "minecraft:cutout", + "textures": { + "bottom": "twilightforest:block/encased_towerwood", + "particle": "#bottom", + "side": "twilightforest:block/towerdev_ghasttrap_on", + "side2": "twilightforest:block/tower_device_level_1/towerdev_ghasttrap_on_1", + "side3": "twilightforest:block/tower_device_level_2/towerdev_ghasttrap_on_2", + "top": "twilightforest:block/towerdev_ghasttraplid_on", + "top2": "twilightforest:block/tower_device_level_2/towerdev_ghasttraplid_on_1", + "top3": "twilightforest:block/tower_device_level_3/towerdev_ghasttraplid_on_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/giant_cobblestone.json b/src/generated/resources/assets/twilightforest/models/block/giant_cobblestone.json new file mode 100644 index 0000000000..897f1dab18 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/giant_cobblestone.json @@ -0,0 +1,9 @@ +{ + "parent": "minecraft:block/block", + "loader": "twilightforest:giant_block", + "parent_block": "minecraft:cobblestone", + "textures": { + "all": "minecraft:block/cobblestone", + "particle": "minecraft:block/cobblestone" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/giant_leaves.json b/src/generated/resources/assets/twilightforest/models/block/giant_leaves.json new file mode 100644 index 0000000000..28f794f4ee --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/giant_leaves.json @@ -0,0 +1,10 @@ +{ + "parent": "minecraft:block/block", + "loader": "twilightforest:giant_block", + "parent_block": "minecraft:oak_leaves", + "render_type": "minecraft:cutout_mipped", + "textures": { + "all": "minecraft:block/oak_leaves", + "particle": "minecraft:block/oak_leaves" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/giant_log.json b/src/generated/resources/assets/twilightforest/models/block/giant_log.json new file mode 100644 index 0000000000..0d728a48c0 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/giant_log.json @@ -0,0 +1,14 @@ +{ + "parent": "minecraft:block/block", + "loader": "twilightforest:giant_block", + "parent_block": "minecraft:oak_log", + "textures": { + "down": "minecraft:block/oak_log_top", + "east": "minecraft:block/oak_log", + "north": "minecraft:block/oak_log", + "particle": "minecraft:block/oak_log", + "south": "minecraft:block/oak_log", + "up": "minecraft:block/oak_log_top", + "west": "minecraft:block/oak_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/giant_obsidian.json b/src/generated/resources/assets/twilightforest/models/block/giant_obsidian.json new file mode 100644 index 0000000000..9bbf736f4b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/giant_obsidian.json @@ -0,0 +1,9 @@ +{ + "parent": "minecraft:block/block", + "loader": "twilightforest:giant_block", + "parent_block": "minecraft:obsidian", + "textures": { + "all": "minecraft:block/obsidian", + "particle": "minecraft:block/obsidian" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/green_thorns.json b/src/generated/resources/assets/twilightforest/models/block/green_thorns.json new file mode 100644 index 0000000000..f2783d4a3a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/green_thorns.json @@ -0,0 +1,8 @@ +{ + "parent": "twilightforest:block/thorns_main", + "render_type": "minecraft:cutout", + "textures": { + "end": "twilightforest:block/green_thorns_top", + "side": "twilightforest:block/green_thorns_side" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/green_thorns_bottom.json b/src/generated/resources/assets/twilightforest/models/block/green_thorns_bottom.json new file mode 100644 index 0000000000..cd9c1a17a0 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/green_thorns_bottom.json @@ -0,0 +1,8 @@ +{ + "parent": "twilightforest:block/thorns_section_bottom", + "render_type": "minecraft:cutout", + "textures": { + "end": "twilightforest:block/green_thorns_top", + "side": "twilightforest:block/green_thorns_side" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/green_thorns_no_section.json b/src/generated/resources/assets/twilightforest/models/block/green_thorns_no_section.json new file mode 100644 index 0000000000..95a285bfd0 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/green_thorns_no_section.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/thorns_no_section", + "render_type": "minecraft:cutout", + "textures": { + "side": "twilightforest:block/green_thorns_side" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/green_thorns_no_section_alt.json b/src/generated/resources/assets/twilightforest/models/block/green_thorns_no_section_alt.json new file mode 100644 index 0000000000..dd9d9c620c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/green_thorns_no_section_alt.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/thorns_no_section_alt", + "render_type": "minecraft:cutout", + "textures": { + "side": "twilightforest:block/green_thorns_side" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/green_thorns_thorns.json b/src/generated/resources/assets/twilightforest/models/block/green_thorns_thorns.json new file mode 100644 index 0000000000..a87684718b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/green_thorns_thorns.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/thorns", + "render_type": "minecraft:cutout", + "textures": { + "side": "twilightforest:block/green_thorns_side" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/green_thorns_top.json b/src/generated/resources/assets/twilightforest/models/block/green_thorns_top.json new file mode 100644 index 0000000000..4a657394c5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/green_thorns_top.json @@ -0,0 +1,8 @@ +{ + "parent": "twilightforest:block/thorns_section_top", + "render_type": "minecraft:cutout", + "textures": { + "end": "twilightforest:block/green_thorns_top", + "side": "twilightforest:block/green_thorns_side" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hardened_dark_leaves.json b/src/generated/resources/assets/twilightforest/models/block/hardened_dark_leaves.json new file mode 100644 index 0000000000..411459b464 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hardened_dark_leaves.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/leaves", + "textures": { + "all": "twilightforest:block/darkwood_leaves" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hedge.json b/src/generated/resources/assets/twilightforest/models/block/hedge.json new file mode 100644 index 0000000000..575d5d0ff9 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hedge.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "twilightforest:block/hedge" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hedge_rose.json b/src/generated/resources/assets/twilightforest/models/block/hedge_rose.json new file mode 100644 index 0000000000..a3d48944ff --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hedge_rose.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "twilightforest:block/hedge_rose" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_acacia_log_climbable_ladder.json b/src/generated/resources/assets/twilightforest/models/block/hollow_acacia_log_climbable_ladder.json new file mode 100644 index 0000000000..4e76c2dea6 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_acacia_log_climbable_ladder.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/vertical_hollow_log_ladder", + "render_type": "minecraft:cutout", + "textures": { + "inner": "minecraft:block/stripped_acacia_log", + "side": "minecraft:block/acacia_log", + "top": "minecraft:block/acacia_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_acacia_log_climbable_vine.json b/src/generated/resources/assets/twilightforest/models/block/hollow_acacia_log_climbable_vine.json new file mode 100644 index 0000000000..595e44ecc3 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_acacia_log_climbable_vine.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/vertical_hollow_log_vine", + "render_type": "minecraft:cutout", + "textures": { + "inner": "minecraft:block/stripped_acacia_log", + "side": "minecraft:block/acacia_log", + "top": "minecraft:block/acacia_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_acacia_log_horizontal.json b/src/generated/resources/assets/twilightforest/models/block/hollow_acacia_log_horizontal.json new file mode 100644 index 0000000000..e397e12e0b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_acacia_log_horizontal.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/horizontal_hollow_log", + "render_type": "minecraft:cutout", + "textures": { + "inner": "minecraft:block/stripped_acacia_log", + "side": "minecraft:block/acacia_log", + "top": "minecraft:block/acacia_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_acacia_log_horizontal_moss.json b/src/generated/resources/assets/twilightforest/models/block/hollow_acacia_log_horizontal_moss.json new file mode 100644 index 0000000000..621dc15e58 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_acacia_log_horizontal_moss.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/hollow_log_moss", + "render_type": "minecraft:cutout", + "textures": { + "inner": "minecraft:block/stripped_acacia_log", + "side": "minecraft:block/acacia_log", + "top": "minecraft:block/acacia_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_acacia_log_horizontal_moss_grass.json b/src/generated/resources/assets/twilightforest/models/block/hollow_acacia_log_horizontal_moss_grass.json new file mode 100644 index 0000000000..faa70e3726 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_acacia_log_horizontal_moss_grass.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/hollow_log_moss_grass", + "render_type": "minecraft:cutout", + "textures": { + "inner": "minecraft:block/stripped_acacia_log", + "side": "minecraft:block/acacia_log", + "top": "minecraft:block/acacia_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_acacia_log_horizontal_snow.json b/src/generated/resources/assets/twilightforest/models/block/hollow_acacia_log_horizontal_snow.json new file mode 100644 index 0000000000..23d3a318d5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_acacia_log_horizontal_snow.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/hollow_log_snow", + "render_type": "minecraft:cutout", + "textures": { + "inner": "minecraft:block/stripped_acacia_log", + "side": "minecraft:block/acacia_log", + "top": "minecraft:block/acacia_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_acacia_log_vertical.json b/src/generated/resources/assets/twilightforest/models/block/hollow_acacia_log_vertical.json new file mode 100644 index 0000000000..4fc5e31022 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_acacia_log_vertical.json @@ -0,0 +1,8 @@ +{ + "parent": "twilightforest:block/vertical_hollow_log", + "textures": { + "inner": "minecraft:block/stripped_acacia_log", + "side": "minecraft:block/acacia_log", + "top": "minecraft:block/acacia_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_birch_log_climbable_ladder.json b/src/generated/resources/assets/twilightforest/models/block/hollow_birch_log_climbable_ladder.json new file mode 100644 index 0000000000..5ccd483379 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_birch_log_climbable_ladder.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/vertical_hollow_log_ladder", + "render_type": "minecraft:cutout", + "textures": { + "inner": "minecraft:block/stripped_birch_log", + "side": "minecraft:block/birch_log", + "top": "minecraft:block/birch_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_birch_log_climbable_vine.json b/src/generated/resources/assets/twilightforest/models/block/hollow_birch_log_climbable_vine.json new file mode 100644 index 0000000000..bd0f2578a8 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_birch_log_climbable_vine.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/vertical_hollow_log_vine", + "render_type": "minecraft:cutout", + "textures": { + "inner": "minecraft:block/stripped_birch_log", + "side": "minecraft:block/birch_log", + "top": "minecraft:block/birch_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_birch_log_horizontal.json b/src/generated/resources/assets/twilightforest/models/block/hollow_birch_log_horizontal.json new file mode 100644 index 0000000000..61b7050c19 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_birch_log_horizontal.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/horizontal_hollow_log", + "render_type": "minecraft:cutout", + "textures": { + "inner": "minecraft:block/stripped_birch_log", + "side": "minecraft:block/birch_log", + "top": "minecraft:block/birch_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_birch_log_horizontal_moss.json b/src/generated/resources/assets/twilightforest/models/block/hollow_birch_log_horizontal_moss.json new file mode 100644 index 0000000000..37701dbf1b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_birch_log_horizontal_moss.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/hollow_log_moss", + "render_type": "minecraft:cutout", + "textures": { + "inner": "minecraft:block/stripped_birch_log", + "side": "minecraft:block/birch_log", + "top": "minecraft:block/birch_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_birch_log_horizontal_moss_grass.json b/src/generated/resources/assets/twilightforest/models/block/hollow_birch_log_horizontal_moss_grass.json new file mode 100644 index 0000000000..ddb29f7bff --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_birch_log_horizontal_moss_grass.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/hollow_log_moss_grass", + "render_type": "minecraft:cutout", + "textures": { + "inner": "minecraft:block/stripped_birch_log", + "side": "minecraft:block/birch_log", + "top": "minecraft:block/birch_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_birch_log_horizontal_snow.json b/src/generated/resources/assets/twilightforest/models/block/hollow_birch_log_horizontal_snow.json new file mode 100644 index 0000000000..851bc9643b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_birch_log_horizontal_snow.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/hollow_log_snow", + "render_type": "minecraft:cutout", + "textures": { + "inner": "minecraft:block/stripped_birch_log", + "side": "minecraft:block/birch_log", + "top": "minecraft:block/birch_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_birch_log_vertical.json b/src/generated/resources/assets/twilightforest/models/block/hollow_birch_log_vertical.json new file mode 100644 index 0000000000..40f8d0e777 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_birch_log_vertical.json @@ -0,0 +1,8 @@ +{ + "parent": "twilightforest:block/vertical_hollow_log", + "textures": { + "inner": "minecraft:block/stripped_birch_log", + "side": "minecraft:block/birch_log", + "top": "minecraft:block/birch_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_canopy_log_climbable_ladder.json b/src/generated/resources/assets/twilightforest/models/block/hollow_canopy_log_climbable_ladder.json new file mode 100644 index 0000000000..fef2d3d107 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_canopy_log_climbable_ladder.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/vertical_hollow_log_ladder", + "render_type": "minecraft:cutout", + "textures": { + "inner": "twilightforest:block/stripped_canopy_log", + "side": "twilightforest:block/canopy_log", + "top": "twilightforest:block/canopy_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_canopy_log_climbable_vine.json b/src/generated/resources/assets/twilightforest/models/block/hollow_canopy_log_climbable_vine.json new file mode 100644 index 0000000000..30c32f1798 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_canopy_log_climbable_vine.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/vertical_hollow_log_vine", + "render_type": "minecraft:cutout", + "textures": { + "inner": "twilightforest:block/stripped_canopy_log", + "side": "twilightforest:block/canopy_log", + "top": "twilightforest:block/canopy_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_canopy_log_horizontal.json b/src/generated/resources/assets/twilightforest/models/block/hollow_canopy_log_horizontal.json new file mode 100644 index 0000000000..e266b7a463 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_canopy_log_horizontal.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/horizontal_hollow_log", + "render_type": "minecraft:cutout", + "textures": { + "inner": "twilightforest:block/stripped_canopy_log", + "side": "twilightforest:block/canopy_log", + "top": "twilightforest:block/canopy_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_canopy_log_horizontal_moss.json b/src/generated/resources/assets/twilightforest/models/block/hollow_canopy_log_horizontal_moss.json new file mode 100644 index 0000000000..70bdd2accf --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_canopy_log_horizontal_moss.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/hollow_log_moss", + "render_type": "minecraft:cutout", + "textures": { + "inner": "twilightforest:block/stripped_canopy_log", + "side": "twilightforest:block/canopy_log", + "top": "twilightforest:block/canopy_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_canopy_log_horizontal_moss_grass.json b/src/generated/resources/assets/twilightforest/models/block/hollow_canopy_log_horizontal_moss_grass.json new file mode 100644 index 0000000000..a31e7f303d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_canopy_log_horizontal_moss_grass.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/hollow_log_moss_grass", + "render_type": "minecraft:cutout", + "textures": { + "inner": "twilightforest:block/stripped_canopy_log", + "side": "twilightforest:block/canopy_log", + "top": "twilightforest:block/canopy_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_canopy_log_horizontal_snow.json b/src/generated/resources/assets/twilightforest/models/block/hollow_canopy_log_horizontal_snow.json new file mode 100644 index 0000000000..2bc95589d4 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_canopy_log_horizontal_snow.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/hollow_log_snow", + "render_type": "minecraft:cutout", + "textures": { + "inner": "twilightforest:block/stripped_canopy_log", + "side": "twilightforest:block/canopy_log", + "top": "twilightforest:block/canopy_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_canopy_log_vertical.json b/src/generated/resources/assets/twilightforest/models/block/hollow_canopy_log_vertical.json new file mode 100644 index 0000000000..55d22d0b19 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_canopy_log_vertical.json @@ -0,0 +1,8 @@ +{ + "parent": "twilightforest:block/vertical_hollow_log", + "textures": { + "inner": "twilightforest:block/stripped_canopy_log", + "side": "twilightforest:block/canopy_log", + "top": "twilightforest:block/canopy_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_crimson_stem_climbable_ladder.json b/src/generated/resources/assets/twilightforest/models/block/hollow_crimson_stem_climbable_ladder.json new file mode 100644 index 0000000000..e2d0ea5aac --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_crimson_stem_climbable_ladder.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/vertical_hollow_log_ladder", + "render_type": "minecraft:cutout", + "textures": { + "inner": "minecraft:block/stripped_crimson_stem", + "side": "minecraft:block/crimson_stem", + "top": "minecraft:block/crimson_stem_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_crimson_stem_climbable_vine.json b/src/generated/resources/assets/twilightforest/models/block/hollow_crimson_stem_climbable_vine.json new file mode 100644 index 0000000000..42f82077b8 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_crimson_stem_climbable_vine.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/vertical_hollow_log_vine", + "render_type": "minecraft:cutout", + "textures": { + "inner": "minecraft:block/stripped_crimson_stem", + "side": "minecraft:block/crimson_stem", + "top": "minecraft:block/crimson_stem_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_crimson_stem_horizontal.json b/src/generated/resources/assets/twilightforest/models/block/hollow_crimson_stem_horizontal.json new file mode 100644 index 0000000000..25590dd9c7 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_crimson_stem_horizontal.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/horizontal_hollow_log", + "render_type": "minecraft:cutout", + "textures": { + "inner": "minecraft:block/stripped_crimson_stem", + "side": "minecraft:block/crimson_stem", + "top": "minecraft:block/crimson_stem_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_crimson_stem_horizontal_moss.json b/src/generated/resources/assets/twilightforest/models/block/hollow_crimson_stem_horizontal_moss.json new file mode 100644 index 0000000000..f82ab9a13c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_crimson_stem_horizontal_moss.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/hollow_log_moss", + "render_type": "minecraft:cutout", + "textures": { + "inner": "minecraft:block/stripped_crimson_stem", + "side": "minecraft:block/crimson_stem", + "top": "minecraft:block/crimson_stem_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_crimson_stem_horizontal_moss_grass.json b/src/generated/resources/assets/twilightforest/models/block/hollow_crimson_stem_horizontal_moss_grass.json new file mode 100644 index 0000000000..d517470b37 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_crimson_stem_horizontal_moss_grass.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/hollow_log_moss_grass", + "render_type": "minecraft:cutout", + "textures": { + "inner": "minecraft:block/stripped_crimson_stem", + "side": "minecraft:block/crimson_stem", + "top": "minecraft:block/crimson_stem_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_crimson_stem_horizontal_snow.json b/src/generated/resources/assets/twilightforest/models/block/hollow_crimson_stem_horizontal_snow.json new file mode 100644 index 0000000000..915ede94cd --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_crimson_stem_horizontal_snow.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/hollow_log_snow", + "render_type": "minecraft:cutout", + "textures": { + "inner": "minecraft:block/stripped_crimson_stem", + "side": "minecraft:block/crimson_stem", + "top": "minecraft:block/crimson_stem_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_crimson_stem_vertical.json b/src/generated/resources/assets/twilightforest/models/block/hollow_crimson_stem_vertical.json new file mode 100644 index 0000000000..6abbe1f20b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_crimson_stem_vertical.json @@ -0,0 +1,8 @@ +{ + "parent": "twilightforest:block/vertical_hollow_log", + "textures": { + "inner": "minecraft:block/stripped_crimson_stem", + "side": "minecraft:block/crimson_stem", + "top": "minecraft:block/crimson_stem_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_dark_log_climbable_ladder.json b/src/generated/resources/assets/twilightforest/models/block/hollow_dark_log_climbable_ladder.json new file mode 100644 index 0000000000..c7348b7f9c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_dark_log_climbable_ladder.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/vertical_hollow_log_ladder", + "render_type": "minecraft:cutout", + "textures": { + "inner": "twilightforest:block/stripped_dark_log", + "side": "twilightforest:block/dark_log", + "top": "twilightforest:block/dark_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_dark_log_climbable_vine.json b/src/generated/resources/assets/twilightforest/models/block/hollow_dark_log_climbable_vine.json new file mode 100644 index 0000000000..c97c3417a0 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_dark_log_climbable_vine.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/vertical_hollow_log_vine", + "render_type": "minecraft:cutout", + "textures": { + "inner": "twilightforest:block/stripped_dark_log", + "side": "twilightforest:block/dark_log", + "top": "twilightforest:block/dark_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_dark_log_horizontal.json b/src/generated/resources/assets/twilightforest/models/block/hollow_dark_log_horizontal.json new file mode 100644 index 0000000000..3a804b76d9 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_dark_log_horizontal.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/horizontal_hollow_log", + "render_type": "minecraft:cutout", + "textures": { + "inner": "twilightforest:block/stripped_dark_log", + "side": "twilightforest:block/dark_log", + "top": "twilightforest:block/dark_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_dark_log_horizontal_moss.json b/src/generated/resources/assets/twilightforest/models/block/hollow_dark_log_horizontal_moss.json new file mode 100644 index 0000000000..2e0651e711 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_dark_log_horizontal_moss.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/hollow_log_moss", + "render_type": "minecraft:cutout", + "textures": { + "inner": "twilightforest:block/stripped_dark_log", + "side": "twilightforest:block/dark_log", + "top": "twilightforest:block/dark_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_dark_log_horizontal_moss_grass.json b/src/generated/resources/assets/twilightforest/models/block/hollow_dark_log_horizontal_moss_grass.json new file mode 100644 index 0000000000..9edfe93f4a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_dark_log_horizontal_moss_grass.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/hollow_log_moss_grass", + "render_type": "minecraft:cutout", + "textures": { + "inner": "twilightforest:block/stripped_dark_log", + "side": "twilightforest:block/dark_log", + "top": "twilightforest:block/dark_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_dark_log_horizontal_snow.json b/src/generated/resources/assets/twilightforest/models/block/hollow_dark_log_horizontal_snow.json new file mode 100644 index 0000000000..d5310276d5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_dark_log_horizontal_snow.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/hollow_log_snow", + "render_type": "minecraft:cutout", + "textures": { + "inner": "twilightforest:block/stripped_dark_log", + "side": "twilightforest:block/dark_log", + "top": "twilightforest:block/dark_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_dark_log_vertical.json b/src/generated/resources/assets/twilightforest/models/block/hollow_dark_log_vertical.json new file mode 100644 index 0000000000..846f6ff8e9 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_dark_log_vertical.json @@ -0,0 +1,8 @@ +{ + "parent": "twilightforest:block/vertical_hollow_log", + "textures": { + "inner": "twilightforest:block/stripped_dark_log", + "side": "twilightforest:block/dark_log", + "top": "twilightforest:block/dark_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_dark_oak_log_climbable_ladder.json b/src/generated/resources/assets/twilightforest/models/block/hollow_dark_oak_log_climbable_ladder.json new file mode 100644 index 0000000000..9853f9a6b3 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_dark_oak_log_climbable_ladder.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/vertical_hollow_log_ladder", + "render_type": "minecraft:cutout", + "textures": { + "inner": "minecraft:block/stripped_dark_oak_log", + "side": "minecraft:block/dark_oak_log", + "top": "minecraft:block/dark_oak_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_dark_oak_log_climbable_vine.json b/src/generated/resources/assets/twilightforest/models/block/hollow_dark_oak_log_climbable_vine.json new file mode 100644 index 0000000000..8042648f80 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_dark_oak_log_climbable_vine.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/vertical_hollow_log_vine", + "render_type": "minecraft:cutout", + "textures": { + "inner": "minecraft:block/stripped_dark_oak_log", + "side": "minecraft:block/dark_oak_log", + "top": "minecraft:block/dark_oak_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_dark_oak_log_horizontal.json b/src/generated/resources/assets/twilightforest/models/block/hollow_dark_oak_log_horizontal.json new file mode 100644 index 0000000000..d57e2bc171 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_dark_oak_log_horizontal.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/horizontal_hollow_log", + "render_type": "minecraft:cutout", + "textures": { + "inner": "minecraft:block/stripped_dark_oak_log", + "side": "minecraft:block/dark_oak_log", + "top": "minecraft:block/dark_oak_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_dark_oak_log_horizontal_moss.json b/src/generated/resources/assets/twilightforest/models/block/hollow_dark_oak_log_horizontal_moss.json new file mode 100644 index 0000000000..a5801e1630 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_dark_oak_log_horizontal_moss.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/hollow_log_moss", + "render_type": "minecraft:cutout", + "textures": { + "inner": "minecraft:block/stripped_dark_oak_log", + "side": "minecraft:block/dark_oak_log", + "top": "minecraft:block/dark_oak_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_dark_oak_log_horizontal_moss_grass.json b/src/generated/resources/assets/twilightforest/models/block/hollow_dark_oak_log_horizontal_moss_grass.json new file mode 100644 index 0000000000..fd99ca2137 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_dark_oak_log_horizontal_moss_grass.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/hollow_log_moss_grass", + "render_type": "minecraft:cutout", + "textures": { + "inner": "minecraft:block/stripped_dark_oak_log", + "side": "minecraft:block/dark_oak_log", + "top": "minecraft:block/dark_oak_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_dark_oak_log_horizontal_snow.json b/src/generated/resources/assets/twilightforest/models/block/hollow_dark_oak_log_horizontal_snow.json new file mode 100644 index 0000000000..3ed07e2eae --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_dark_oak_log_horizontal_snow.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/hollow_log_snow", + "render_type": "minecraft:cutout", + "textures": { + "inner": "minecraft:block/stripped_dark_oak_log", + "side": "minecraft:block/dark_oak_log", + "top": "minecraft:block/dark_oak_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_dark_oak_log_vertical.json b/src/generated/resources/assets/twilightforest/models/block/hollow_dark_oak_log_vertical.json new file mode 100644 index 0000000000..620a71df04 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_dark_oak_log_vertical.json @@ -0,0 +1,8 @@ +{ + "parent": "twilightforest:block/vertical_hollow_log", + "textures": { + "inner": "minecraft:block/stripped_dark_oak_log", + "side": "minecraft:block/dark_oak_log", + "top": "minecraft:block/dark_oak_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_jungle_log_climbable_ladder.json b/src/generated/resources/assets/twilightforest/models/block/hollow_jungle_log_climbable_ladder.json new file mode 100644 index 0000000000..4535833cd5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_jungle_log_climbable_ladder.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/vertical_hollow_log_ladder", + "render_type": "minecraft:cutout", + "textures": { + "inner": "minecraft:block/stripped_jungle_log", + "side": "minecraft:block/jungle_log", + "top": "minecraft:block/jungle_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_jungle_log_climbable_vine.json b/src/generated/resources/assets/twilightforest/models/block/hollow_jungle_log_climbable_vine.json new file mode 100644 index 0000000000..2f85d29835 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_jungle_log_climbable_vine.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/vertical_hollow_log_vine", + "render_type": "minecraft:cutout", + "textures": { + "inner": "minecraft:block/stripped_jungle_log", + "side": "minecraft:block/jungle_log", + "top": "minecraft:block/jungle_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_jungle_log_horizontal.json b/src/generated/resources/assets/twilightforest/models/block/hollow_jungle_log_horizontal.json new file mode 100644 index 0000000000..173486e8e7 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_jungle_log_horizontal.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/horizontal_hollow_log", + "render_type": "minecraft:cutout", + "textures": { + "inner": "minecraft:block/stripped_jungle_log", + "side": "minecraft:block/jungle_log", + "top": "minecraft:block/jungle_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_jungle_log_horizontal_moss.json b/src/generated/resources/assets/twilightforest/models/block/hollow_jungle_log_horizontal_moss.json new file mode 100644 index 0000000000..31ce880b41 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_jungle_log_horizontal_moss.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/hollow_log_moss", + "render_type": "minecraft:cutout", + "textures": { + "inner": "minecraft:block/stripped_jungle_log", + "side": "minecraft:block/jungle_log", + "top": "minecraft:block/jungle_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_jungle_log_horizontal_moss_grass.json b/src/generated/resources/assets/twilightforest/models/block/hollow_jungle_log_horizontal_moss_grass.json new file mode 100644 index 0000000000..0f113e8994 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_jungle_log_horizontal_moss_grass.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/hollow_log_moss_grass", + "render_type": "minecraft:cutout", + "textures": { + "inner": "minecraft:block/stripped_jungle_log", + "side": "minecraft:block/jungle_log", + "top": "minecraft:block/jungle_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_jungle_log_horizontal_snow.json b/src/generated/resources/assets/twilightforest/models/block/hollow_jungle_log_horizontal_snow.json new file mode 100644 index 0000000000..6e606ce640 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_jungle_log_horizontal_snow.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/hollow_log_snow", + "render_type": "minecraft:cutout", + "textures": { + "inner": "minecraft:block/stripped_jungle_log", + "side": "minecraft:block/jungle_log", + "top": "minecraft:block/jungle_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_jungle_log_vertical.json b/src/generated/resources/assets/twilightforest/models/block/hollow_jungle_log_vertical.json new file mode 100644 index 0000000000..7d07afb345 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_jungle_log_vertical.json @@ -0,0 +1,8 @@ +{ + "parent": "twilightforest:block/vertical_hollow_log", + "textures": { + "inner": "minecraft:block/stripped_jungle_log", + "side": "minecraft:block/jungle_log", + "top": "minecraft:block/jungle_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_log_moss.json b/src/generated/resources/assets/twilightforest/models/block/hollow_log_moss.json new file mode 100644 index 0000000000..87526e7b0b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_log_moss.json @@ -0,0 +1,8 @@ +{ + "parent": "twilightforest:block/horizontal_hollow_log_carpet", + "render_type": "minecraft:cutout", + "textures": { + "carpet": "twilightforest:block/mosspatch", + "overhang": "twilightforest:block/moss_overhang" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_log_moss_grass.json b/src/generated/resources/assets/twilightforest/models/block/hollow_log_moss_grass.json new file mode 100644 index 0000000000..0b42ca69c1 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_log_moss_grass.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/horizontal_hollow_log_plant", + "render_type": "minecraft:cutout", + "textures": { + "carpet": "twilightforest:block/mosspatch", + "overhang": "twilightforest:block/moss_overhang", + "plant": "minecraft:block/grass" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_log_snow.json b/src/generated/resources/assets/twilightforest/models/block/hollow_log_snow.json new file mode 100644 index 0000000000..e7e8a3b9a0 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_log_snow.json @@ -0,0 +1,8 @@ +{ + "parent": "twilightforest:block/horizontal_hollow_log_carpet", + "render_type": "minecraft:cutout", + "textures": { + "carpet": "minecraft:block/snow", + "overhang": "twilightforest:block/snow_overhang" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_mangrove_log_climbable_ladder.json b/src/generated/resources/assets/twilightforest/models/block/hollow_mangrove_log_climbable_ladder.json new file mode 100644 index 0000000000..150c685ea7 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_mangrove_log_climbable_ladder.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/vertical_hollow_log_ladder", + "render_type": "minecraft:cutout", + "textures": { + "inner": "twilightforest:block/stripped_mangrove_log", + "side": "twilightforest:block/mangrove_log", + "top": "twilightforest:block/mangrove_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_mangrove_log_climbable_vine.json b/src/generated/resources/assets/twilightforest/models/block/hollow_mangrove_log_climbable_vine.json new file mode 100644 index 0000000000..d886567249 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_mangrove_log_climbable_vine.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/vertical_hollow_log_vine", + "render_type": "minecraft:cutout", + "textures": { + "inner": "twilightforest:block/stripped_mangrove_log", + "side": "twilightforest:block/mangrove_log", + "top": "twilightforest:block/mangrove_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_mangrove_log_horizontal.json b/src/generated/resources/assets/twilightforest/models/block/hollow_mangrove_log_horizontal.json new file mode 100644 index 0000000000..42bf1400e0 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_mangrove_log_horizontal.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/horizontal_hollow_log", + "render_type": "minecraft:cutout", + "textures": { + "inner": "twilightforest:block/stripped_mangrove_log", + "side": "twilightforest:block/mangrove_log", + "top": "twilightforest:block/mangrove_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_mangrove_log_horizontal_moss.json b/src/generated/resources/assets/twilightforest/models/block/hollow_mangrove_log_horizontal_moss.json new file mode 100644 index 0000000000..b36fb53db9 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_mangrove_log_horizontal_moss.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/hollow_log_moss", + "render_type": "minecraft:cutout", + "textures": { + "inner": "twilightforest:block/stripped_mangrove_log", + "side": "twilightforest:block/mangrove_log", + "top": "twilightforest:block/mangrove_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_mangrove_log_horizontal_moss_grass.json b/src/generated/resources/assets/twilightforest/models/block/hollow_mangrove_log_horizontal_moss_grass.json new file mode 100644 index 0000000000..9440a95022 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_mangrove_log_horizontal_moss_grass.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/hollow_log_moss_grass", + "render_type": "minecraft:cutout", + "textures": { + "inner": "twilightforest:block/stripped_mangrove_log", + "side": "twilightforest:block/mangrove_log", + "top": "twilightforest:block/mangrove_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_mangrove_log_horizontal_snow.json b/src/generated/resources/assets/twilightforest/models/block/hollow_mangrove_log_horizontal_snow.json new file mode 100644 index 0000000000..fc83f93742 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_mangrove_log_horizontal_snow.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/hollow_log_snow", + "render_type": "minecraft:cutout", + "textures": { + "inner": "twilightforest:block/stripped_mangrove_log", + "side": "twilightforest:block/mangrove_log", + "top": "twilightforest:block/mangrove_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_mangrove_log_vertical.json b/src/generated/resources/assets/twilightforest/models/block/hollow_mangrove_log_vertical.json new file mode 100644 index 0000000000..9dfae25385 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_mangrove_log_vertical.json @@ -0,0 +1,8 @@ +{ + "parent": "twilightforest:block/vertical_hollow_log", + "textures": { + "inner": "twilightforest:block/stripped_mangrove_log", + "side": "twilightforest:block/mangrove_log", + "top": "twilightforest:block/mangrove_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_mining_log_climbable_ladder.json b/src/generated/resources/assets/twilightforest/models/block/hollow_mining_log_climbable_ladder.json new file mode 100644 index 0000000000..07a9787989 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_mining_log_climbable_ladder.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/vertical_hollow_log_ladder", + "render_type": "minecraft:cutout", + "textures": { + "inner": "twilightforest:block/stripped_mining_log", + "side": "twilightforest:block/mining_log", + "top": "twilightforest:block/mining_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_mining_log_climbable_vine.json b/src/generated/resources/assets/twilightforest/models/block/hollow_mining_log_climbable_vine.json new file mode 100644 index 0000000000..2186f5e2bc --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_mining_log_climbable_vine.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/vertical_hollow_log_vine", + "render_type": "minecraft:cutout", + "textures": { + "inner": "twilightforest:block/stripped_mining_log", + "side": "twilightforest:block/mining_log", + "top": "twilightforest:block/mining_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_mining_log_horizontal.json b/src/generated/resources/assets/twilightforest/models/block/hollow_mining_log_horizontal.json new file mode 100644 index 0000000000..b8afff3f1e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_mining_log_horizontal.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/horizontal_hollow_log", + "render_type": "minecraft:cutout", + "textures": { + "inner": "twilightforest:block/stripped_mining_log", + "side": "twilightforest:block/mining_log", + "top": "twilightforest:block/mining_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_mining_log_horizontal_moss.json b/src/generated/resources/assets/twilightforest/models/block/hollow_mining_log_horizontal_moss.json new file mode 100644 index 0000000000..79f33579c6 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_mining_log_horizontal_moss.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/hollow_log_moss", + "render_type": "minecraft:cutout", + "textures": { + "inner": "twilightforest:block/stripped_mining_log", + "side": "twilightforest:block/mining_log", + "top": "twilightforest:block/mining_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_mining_log_horizontal_moss_grass.json b/src/generated/resources/assets/twilightforest/models/block/hollow_mining_log_horizontal_moss_grass.json new file mode 100644 index 0000000000..974d88ee3b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_mining_log_horizontal_moss_grass.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/hollow_log_moss_grass", + "render_type": "minecraft:cutout", + "textures": { + "inner": "twilightforest:block/stripped_mining_log", + "side": "twilightforest:block/mining_log", + "top": "twilightforest:block/mining_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_mining_log_horizontal_snow.json b/src/generated/resources/assets/twilightforest/models/block/hollow_mining_log_horizontal_snow.json new file mode 100644 index 0000000000..b0beac78f8 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_mining_log_horizontal_snow.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/hollow_log_snow", + "render_type": "minecraft:cutout", + "textures": { + "inner": "twilightforest:block/stripped_mining_log", + "side": "twilightforest:block/mining_log", + "top": "twilightforest:block/mining_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_mining_log_vertical.json b/src/generated/resources/assets/twilightforest/models/block/hollow_mining_log_vertical.json new file mode 100644 index 0000000000..d7cb3823a3 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_mining_log_vertical.json @@ -0,0 +1,8 @@ +{ + "parent": "twilightforest:block/vertical_hollow_log", + "textures": { + "inner": "twilightforest:block/stripped_mining_log", + "side": "twilightforest:block/mining_log", + "top": "twilightforest:block/mining_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_oak_log_climbable_ladder.json b/src/generated/resources/assets/twilightforest/models/block/hollow_oak_log_climbable_ladder.json new file mode 100644 index 0000000000..e15ba27e4a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_oak_log_climbable_ladder.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/vertical_hollow_log_ladder", + "render_type": "minecraft:cutout", + "textures": { + "inner": "minecraft:block/stripped_oak_log", + "side": "minecraft:block/oak_log", + "top": "minecraft:block/oak_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_oak_log_climbable_vine.json b/src/generated/resources/assets/twilightforest/models/block/hollow_oak_log_climbable_vine.json new file mode 100644 index 0000000000..f2d2f2e63c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_oak_log_climbable_vine.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/vertical_hollow_log_vine", + "render_type": "minecraft:cutout", + "textures": { + "inner": "minecraft:block/stripped_oak_log", + "side": "minecraft:block/oak_log", + "top": "minecraft:block/oak_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_oak_log_horizontal.json b/src/generated/resources/assets/twilightforest/models/block/hollow_oak_log_horizontal.json new file mode 100644 index 0000000000..fec38ae7bd --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_oak_log_horizontal.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/horizontal_hollow_log", + "render_type": "minecraft:cutout", + "textures": { + "inner": "minecraft:block/stripped_oak_log", + "side": "minecraft:block/oak_log", + "top": "minecraft:block/oak_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_oak_log_horizontal_moss.json b/src/generated/resources/assets/twilightforest/models/block/hollow_oak_log_horizontal_moss.json new file mode 100644 index 0000000000..fe724d4ec2 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_oak_log_horizontal_moss.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/hollow_log_moss", + "render_type": "minecraft:cutout", + "textures": { + "inner": "minecraft:block/stripped_oak_log", + "side": "minecraft:block/oak_log", + "top": "minecraft:block/oak_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_oak_log_horizontal_moss_grass.json b/src/generated/resources/assets/twilightforest/models/block/hollow_oak_log_horizontal_moss_grass.json new file mode 100644 index 0000000000..e880d737c4 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_oak_log_horizontal_moss_grass.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/hollow_log_moss_grass", + "render_type": "minecraft:cutout", + "textures": { + "inner": "minecraft:block/stripped_oak_log", + "side": "minecraft:block/oak_log", + "top": "minecraft:block/oak_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_oak_log_horizontal_snow.json b/src/generated/resources/assets/twilightforest/models/block/hollow_oak_log_horizontal_snow.json new file mode 100644 index 0000000000..7f29c759f9 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_oak_log_horizontal_snow.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/hollow_log_snow", + "render_type": "minecraft:cutout", + "textures": { + "inner": "minecraft:block/stripped_oak_log", + "side": "minecraft:block/oak_log", + "top": "minecraft:block/oak_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_oak_log_vertical.json b/src/generated/resources/assets/twilightforest/models/block/hollow_oak_log_vertical.json new file mode 100644 index 0000000000..45ec388ced --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_oak_log_vertical.json @@ -0,0 +1,8 @@ +{ + "parent": "twilightforest:block/vertical_hollow_log", + "textures": { + "inner": "minecraft:block/stripped_oak_log", + "side": "minecraft:block/oak_log", + "top": "minecraft:block/oak_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_oak_sapling.json b/src/generated/resources/assets/twilightforest/models/block/hollow_oak_sapling.json new file mode 100644 index 0000000000..3f6e001c38 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_oak_sapling.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cross", + "render_type": "minecraft:cutout", + "textures": { + "cross": "twilightforest:block/hollow_oak_sapling" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_sorting_log_climbable_ladder.json b/src/generated/resources/assets/twilightforest/models/block/hollow_sorting_log_climbable_ladder.json new file mode 100644 index 0000000000..53290465db --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_sorting_log_climbable_ladder.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/vertical_hollow_log_ladder", + "render_type": "minecraft:cutout", + "textures": { + "inner": "twilightforest:block/stripped_sorting_log", + "side": "twilightforest:block/sorting_log", + "top": "twilightforest:block/sorting_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_sorting_log_climbable_vine.json b/src/generated/resources/assets/twilightforest/models/block/hollow_sorting_log_climbable_vine.json new file mode 100644 index 0000000000..78a37a070d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_sorting_log_climbable_vine.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/vertical_hollow_log_vine", + "render_type": "minecraft:cutout", + "textures": { + "inner": "twilightforest:block/stripped_sorting_log", + "side": "twilightforest:block/sorting_log", + "top": "twilightforest:block/sorting_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_sorting_log_horizontal.json b/src/generated/resources/assets/twilightforest/models/block/hollow_sorting_log_horizontal.json new file mode 100644 index 0000000000..e2f83349a1 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_sorting_log_horizontal.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/horizontal_hollow_log", + "render_type": "minecraft:cutout", + "textures": { + "inner": "twilightforest:block/stripped_sorting_log", + "side": "twilightforest:block/sorting_log", + "top": "twilightforest:block/sorting_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_sorting_log_horizontal_moss.json b/src/generated/resources/assets/twilightforest/models/block/hollow_sorting_log_horizontal_moss.json new file mode 100644 index 0000000000..ba8d8bd0af --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_sorting_log_horizontal_moss.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/hollow_log_moss", + "render_type": "minecraft:cutout", + "textures": { + "inner": "twilightforest:block/stripped_sorting_log", + "side": "twilightforest:block/sorting_log", + "top": "twilightforest:block/sorting_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_sorting_log_horizontal_moss_grass.json b/src/generated/resources/assets/twilightforest/models/block/hollow_sorting_log_horizontal_moss_grass.json new file mode 100644 index 0000000000..794cd12fe8 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_sorting_log_horizontal_moss_grass.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/hollow_log_moss_grass", + "render_type": "minecraft:cutout", + "textures": { + "inner": "twilightforest:block/stripped_sorting_log", + "side": "twilightforest:block/sorting_log", + "top": "twilightforest:block/sorting_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_sorting_log_horizontal_snow.json b/src/generated/resources/assets/twilightforest/models/block/hollow_sorting_log_horizontal_snow.json new file mode 100644 index 0000000000..0070dc5faf --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_sorting_log_horizontal_snow.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/hollow_log_snow", + "render_type": "minecraft:cutout", + "textures": { + "inner": "twilightforest:block/stripped_sorting_log", + "side": "twilightforest:block/sorting_log", + "top": "twilightforest:block/sorting_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_sorting_log_vertical.json b/src/generated/resources/assets/twilightforest/models/block/hollow_sorting_log_vertical.json new file mode 100644 index 0000000000..baa048a6ea --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_sorting_log_vertical.json @@ -0,0 +1,8 @@ +{ + "parent": "twilightforest:block/vertical_hollow_log", + "textures": { + "inner": "twilightforest:block/stripped_sorting_log", + "side": "twilightforest:block/sorting_log", + "top": "twilightforest:block/sorting_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_spruce_log_climbable_ladder.json b/src/generated/resources/assets/twilightforest/models/block/hollow_spruce_log_climbable_ladder.json new file mode 100644 index 0000000000..23cba37e9c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_spruce_log_climbable_ladder.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/vertical_hollow_log_ladder", + "render_type": "minecraft:cutout", + "textures": { + "inner": "minecraft:block/stripped_spruce_log", + "side": "minecraft:block/spruce_log", + "top": "minecraft:block/spruce_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_spruce_log_climbable_vine.json b/src/generated/resources/assets/twilightforest/models/block/hollow_spruce_log_climbable_vine.json new file mode 100644 index 0000000000..25b288012b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_spruce_log_climbable_vine.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/vertical_hollow_log_vine", + "render_type": "minecraft:cutout", + "textures": { + "inner": "minecraft:block/stripped_spruce_log", + "side": "minecraft:block/spruce_log", + "top": "minecraft:block/spruce_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_spruce_log_horizontal.json b/src/generated/resources/assets/twilightforest/models/block/hollow_spruce_log_horizontal.json new file mode 100644 index 0000000000..e821a1aba9 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_spruce_log_horizontal.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/horizontal_hollow_log", + "render_type": "minecraft:cutout", + "textures": { + "inner": "minecraft:block/stripped_spruce_log", + "side": "minecraft:block/spruce_log", + "top": "minecraft:block/spruce_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_spruce_log_horizontal_moss.json b/src/generated/resources/assets/twilightforest/models/block/hollow_spruce_log_horizontal_moss.json new file mode 100644 index 0000000000..3959922f64 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_spruce_log_horizontal_moss.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/hollow_log_moss", + "render_type": "minecraft:cutout", + "textures": { + "inner": "minecraft:block/stripped_spruce_log", + "side": "minecraft:block/spruce_log", + "top": "minecraft:block/spruce_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_spruce_log_horizontal_moss_grass.json b/src/generated/resources/assets/twilightforest/models/block/hollow_spruce_log_horizontal_moss_grass.json new file mode 100644 index 0000000000..50c18e55d1 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_spruce_log_horizontal_moss_grass.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/hollow_log_moss_grass", + "render_type": "minecraft:cutout", + "textures": { + "inner": "minecraft:block/stripped_spruce_log", + "side": "minecraft:block/spruce_log", + "top": "minecraft:block/spruce_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_spruce_log_horizontal_snow.json b/src/generated/resources/assets/twilightforest/models/block/hollow_spruce_log_horizontal_snow.json new file mode 100644 index 0000000000..03f61274c1 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_spruce_log_horizontal_snow.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/hollow_log_snow", + "render_type": "minecraft:cutout", + "textures": { + "inner": "minecraft:block/stripped_spruce_log", + "side": "minecraft:block/spruce_log", + "top": "minecraft:block/spruce_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_spruce_log_vertical.json b/src/generated/resources/assets/twilightforest/models/block/hollow_spruce_log_vertical.json new file mode 100644 index 0000000000..be8248355c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_spruce_log_vertical.json @@ -0,0 +1,8 @@ +{ + "parent": "twilightforest:block/vertical_hollow_log", + "textures": { + "inner": "minecraft:block/stripped_spruce_log", + "side": "minecraft:block/spruce_log", + "top": "minecraft:block/spruce_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_time_log_climbable_ladder.json b/src/generated/resources/assets/twilightforest/models/block/hollow_time_log_climbable_ladder.json new file mode 100644 index 0000000000..c6e0c4f093 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_time_log_climbable_ladder.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/vertical_hollow_log_ladder", + "render_type": "minecraft:cutout", + "textures": { + "inner": "twilightforest:block/stripped_time_log", + "side": "twilightforest:block/time_log", + "top": "twilightforest:block/time_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_time_log_climbable_vine.json b/src/generated/resources/assets/twilightforest/models/block/hollow_time_log_climbable_vine.json new file mode 100644 index 0000000000..3ea69ca1d4 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_time_log_climbable_vine.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/vertical_hollow_log_vine", + "render_type": "minecraft:cutout", + "textures": { + "inner": "twilightforest:block/stripped_time_log", + "side": "twilightforest:block/time_log", + "top": "twilightforest:block/time_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_time_log_horizontal.json b/src/generated/resources/assets/twilightforest/models/block/hollow_time_log_horizontal.json new file mode 100644 index 0000000000..b182ff8aa6 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_time_log_horizontal.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/horizontal_hollow_log", + "render_type": "minecraft:cutout", + "textures": { + "inner": "twilightforest:block/stripped_time_log", + "side": "twilightforest:block/time_log", + "top": "twilightforest:block/time_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_time_log_horizontal_moss.json b/src/generated/resources/assets/twilightforest/models/block/hollow_time_log_horizontal_moss.json new file mode 100644 index 0000000000..c533c5118b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_time_log_horizontal_moss.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/hollow_log_moss", + "render_type": "minecraft:cutout", + "textures": { + "inner": "twilightforest:block/stripped_time_log", + "side": "twilightforest:block/time_log", + "top": "twilightforest:block/time_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_time_log_horizontal_moss_grass.json b/src/generated/resources/assets/twilightforest/models/block/hollow_time_log_horizontal_moss_grass.json new file mode 100644 index 0000000000..9a73ce4f83 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_time_log_horizontal_moss_grass.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/hollow_log_moss_grass", + "render_type": "minecraft:cutout", + "textures": { + "inner": "twilightforest:block/stripped_time_log", + "side": "twilightforest:block/time_log", + "top": "twilightforest:block/time_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_time_log_horizontal_snow.json b/src/generated/resources/assets/twilightforest/models/block/hollow_time_log_horizontal_snow.json new file mode 100644 index 0000000000..a87e2a3013 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_time_log_horizontal_snow.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/hollow_log_snow", + "render_type": "minecraft:cutout", + "textures": { + "inner": "twilightforest:block/stripped_time_log", + "side": "twilightforest:block/time_log", + "top": "twilightforest:block/time_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_time_log_vertical.json b/src/generated/resources/assets/twilightforest/models/block/hollow_time_log_vertical.json new file mode 100644 index 0000000000..23816197a0 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_time_log_vertical.json @@ -0,0 +1,8 @@ +{ + "parent": "twilightforest:block/vertical_hollow_log", + "textures": { + "inner": "twilightforest:block/stripped_time_log", + "side": "twilightforest:block/time_log", + "top": "twilightforest:block/time_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_transformation_log_climbable_ladder.json b/src/generated/resources/assets/twilightforest/models/block/hollow_transformation_log_climbable_ladder.json new file mode 100644 index 0000000000..300916d90c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_transformation_log_climbable_ladder.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/vertical_hollow_log_ladder", + "render_type": "minecraft:cutout", + "textures": { + "inner": "twilightforest:block/stripped_transformation_log", + "side": "twilightforest:block/transformation_log", + "top": "twilightforest:block/transformation_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_transformation_log_climbable_vine.json b/src/generated/resources/assets/twilightforest/models/block/hollow_transformation_log_climbable_vine.json new file mode 100644 index 0000000000..c83567a7ec --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_transformation_log_climbable_vine.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/vertical_hollow_log_vine", + "render_type": "minecraft:cutout", + "textures": { + "inner": "twilightforest:block/stripped_transformation_log", + "side": "twilightforest:block/transformation_log", + "top": "twilightforest:block/transformation_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_transformation_log_horizontal.json b/src/generated/resources/assets/twilightforest/models/block/hollow_transformation_log_horizontal.json new file mode 100644 index 0000000000..6ff1b1b472 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_transformation_log_horizontal.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/horizontal_hollow_log", + "render_type": "minecraft:cutout", + "textures": { + "inner": "twilightforest:block/stripped_transformation_log", + "side": "twilightforest:block/transformation_log", + "top": "twilightforest:block/transformation_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_transformation_log_horizontal_moss.json b/src/generated/resources/assets/twilightforest/models/block/hollow_transformation_log_horizontal_moss.json new file mode 100644 index 0000000000..c3e998816e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_transformation_log_horizontal_moss.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/hollow_log_moss", + "render_type": "minecraft:cutout", + "textures": { + "inner": "twilightforest:block/stripped_transformation_log", + "side": "twilightforest:block/transformation_log", + "top": "twilightforest:block/transformation_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_transformation_log_horizontal_moss_grass.json b/src/generated/resources/assets/twilightforest/models/block/hollow_transformation_log_horizontal_moss_grass.json new file mode 100644 index 0000000000..62ff802448 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_transformation_log_horizontal_moss_grass.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/hollow_log_moss_grass", + "render_type": "minecraft:cutout", + "textures": { + "inner": "twilightforest:block/stripped_transformation_log", + "side": "twilightforest:block/transformation_log", + "top": "twilightforest:block/transformation_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_transformation_log_horizontal_snow.json b/src/generated/resources/assets/twilightforest/models/block/hollow_transformation_log_horizontal_snow.json new file mode 100644 index 0000000000..c9b3069b25 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_transformation_log_horizontal_snow.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/hollow_log_snow", + "render_type": "minecraft:cutout", + "textures": { + "inner": "twilightforest:block/stripped_transformation_log", + "side": "twilightforest:block/transformation_log", + "top": "twilightforest:block/transformation_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_transformation_log_vertical.json b/src/generated/resources/assets/twilightforest/models/block/hollow_transformation_log_vertical.json new file mode 100644 index 0000000000..49966898a6 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_transformation_log_vertical.json @@ -0,0 +1,8 @@ +{ + "parent": "twilightforest:block/vertical_hollow_log", + "textures": { + "inner": "twilightforest:block/stripped_transformation_log", + "side": "twilightforest:block/transformation_log", + "top": "twilightforest:block/transformation_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_twilight_oak_log_climbable_ladder.json b/src/generated/resources/assets/twilightforest/models/block/hollow_twilight_oak_log_climbable_ladder.json new file mode 100644 index 0000000000..1e08a0713d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_twilight_oak_log_climbable_ladder.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/vertical_hollow_log_ladder", + "render_type": "minecraft:cutout", + "textures": { + "inner": "twilightforest:block/stripped_twilight_oak_log", + "side": "twilightforest:block/twilight_oak_log", + "top": "twilightforest:block/twilight_oak_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_twilight_oak_log_climbable_vine.json b/src/generated/resources/assets/twilightforest/models/block/hollow_twilight_oak_log_climbable_vine.json new file mode 100644 index 0000000000..a6eb7f3f79 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_twilight_oak_log_climbable_vine.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/vertical_hollow_log_vine", + "render_type": "minecraft:cutout", + "textures": { + "inner": "twilightforest:block/stripped_twilight_oak_log", + "side": "twilightforest:block/twilight_oak_log", + "top": "twilightforest:block/twilight_oak_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_twilight_oak_log_horizontal.json b/src/generated/resources/assets/twilightforest/models/block/hollow_twilight_oak_log_horizontal.json new file mode 100644 index 0000000000..86180ff451 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_twilight_oak_log_horizontal.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/horizontal_hollow_log", + "render_type": "minecraft:cutout", + "textures": { + "inner": "twilightforest:block/stripped_twilight_oak_log", + "side": "twilightforest:block/twilight_oak_log", + "top": "twilightforest:block/twilight_oak_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_twilight_oak_log_horizontal_moss.json b/src/generated/resources/assets/twilightforest/models/block/hollow_twilight_oak_log_horizontal_moss.json new file mode 100644 index 0000000000..a7e3447c9b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_twilight_oak_log_horizontal_moss.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/hollow_log_moss", + "render_type": "minecraft:cutout", + "textures": { + "inner": "twilightforest:block/stripped_twilight_oak_log", + "side": "twilightforest:block/twilight_oak_log", + "top": "twilightforest:block/twilight_oak_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_twilight_oak_log_horizontal_moss_grass.json b/src/generated/resources/assets/twilightforest/models/block/hollow_twilight_oak_log_horizontal_moss_grass.json new file mode 100644 index 0000000000..e1d6104a4f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_twilight_oak_log_horizontal_moss_grass.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/hollow_log_moss_grass", + "render_type": "minecraft:cutout", + "textures": { + "inner": "twilightforest:block/stripped_twilight_oak_log", + "side": "twilightforest:block/twilight_oak_log", + "top": "twilightforest:block/twilight_oak_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_twilight_oak_log_horizontal_snow.json b/src/generated/resources/assets/twilightforest/models/block/hollow_twilight_oak_log_horizontal_snow.json new file mode 100644 index 0000000000..5d5e62fe87 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_twilight_oak_log_horizontal_snow.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/hollow_log_snow", + "render_type": "minecraft:cutout", + "textures": { + "inner": "twilightforest:block/stripped_twilight_oak_log", + "side": "twilightforest:block/twilight_oak_log", + "top": "twilightforest:block/twilight_oak_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_twilight_oak_log_vertical.json b/src/generated/resources/assets/twilightforest/models/block/hollow_twilight_oak_log_vertical.json new file mode 100644 index 0000000000..a161c34941 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_twilight_oak_log_vertical.json @@ -0,0 +1,8 @@ +{ + "parent": "twilightforest:block/vertical_hollow_log", + "textures": { + "inner": "twilightforest:block/stripped_twilight_oak_log", + "side": "twilightforest:block/twilight_oak_log", + "top": "twilightforest:block/twilight_oak_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_vangrove_log_climbable_ladder.json b/src/generated/resources/assets/twilightforest/models/block/hollow_vangrove_log_climbable_ladder.json new file mode 100644 index 0000000000..20d136cfc2 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_vangrove_log_climbable_ladder.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/vertical_hollow_log_ladder", + "render_type": "minecraft:cutout", + "textures": { + "inner": "minecraft:block/stripped_mangrove_log", + "side": "minecraft:block/mangrove_log", + "top": "minecraft:block/mangrove_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_vangrove_log_climbable_vine.json b/src/generated/resources/assets/twilightforest/models/block/hollow_vangrove_log_climbable_vine.json new file mode 100644 index 0000000000..85704eea3b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_vangrove_log_climbable_vine.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/vertical_hollow_log_vine", + "render_type": "minecraft:cutout", + "textures": { + "inner": "minecraft:block/stripped_mangrove_log", + "side": "minecraft:block/mangrove_log", + "top": "minecraft:block/mangrove_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_vangrove_log_horizontal.json b/src/generated/resources/assets/twilightforest/models/block/hollow_vangrove_log_horizontal.json new file mode 100644 index 0000000000..26cff16cdb --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_vangrove_log_horizontal.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/horizontal_hollow_log", + "render_type": "minecraft:cutout", + "textures": { + "inner": "minecraft:block/stripped_mangrove_log", + "side": "minecraft:block/mangrove_log", + "top": "minecraft:block/mangrove_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_vangrove_log_horizontal_moss.json b/src/generated/resources/assets/twilightforest/models/block/hollow_vangrove_log_horizontal_moss.json new file mode 100644 index 0000000000..8c4c44908e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_vangrove_log_horizontal_moss.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/hollow_log_moss", + "render_type": "minecraft:cutout", + "textures": { + "inner": "minecraft:block/stripped_mangrove_log", + "side": "minecraft:block/mangrove_log", + "top": "minecraft:block/mangrove_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_vangrove_log_horizontal_moss_grass.json b/src/generated/resources/assets/twilightforest/models/block/hollow_vangrove_log_horizontal_moss_grass.json new file mode 100644 index 0000000000..3c03fecab0 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_vangrove_log_horizontal_moss_grass.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/hollow_log_moss_grass", + "render_type": "minecraft:cutout", + "textures": { + "inner": "minecraft:block/stripped_mangrove_log", + "side": "minecraft:block/mangrove_log", + "top": "minecraft:block/mangrove_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_vangrove_log_horizontal_snow.json b/src/generated/resources/assets/twilightforest/models/block/hollow_vangrove_log_horizontal_snow.json new file mode 100644 index 0000000000..1cc79baafb --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_vangrove_log_horizontal_snow.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/hollow_log_snow", + "render_type": "minecraft:cutout", + "textures": { + "inner": "minecraft:block/stripped_mangrove_log", + "side": "minecraft:block/mangrove_log", + "top": "minecraft:block/mangrove_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_vangrove_log_vertical.json b/src/generated/resources/assets/twilightforest/models/block/hollow_vangrove_log_vertical.json new file mode 100644 index 0000000000..999b38f34b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_vangrove_log_vertical.json @@ -0,0 +1,8 @@ +{ + "parent": "twilightforest:block/vertical_hollow_log", + "textures": { + "inner": "minecraft:block/stripped_mangrove_log", + "side": "minecraft:block/mangrove_log", + "top": "minecraft:block/mangrove_log_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_warped_stem_climbable_ladder.json b/src/generated/resources/assets/twilightforest/models/block/hollow_warped_stem_climbable_ladder.json new file mode 100644 index 0000000000..396cf3c6ae --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_warped_stem_climbable_ladder.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/vertical_hollow_log_ladder", + "render_type": "minecraft:cutout", + "textures": { + "inner": "minecraft:block/stripped_warped_stem", + "side": "minecraft:block/warped_stem", + "top": "minecraft:block/warped_stem_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_warped_stem_climbable_vine.json b/src/generated/resources/assets/twilightforest/models/block/hollow_warped_stem_climbable_vine.json new file mode 100644 index 0000000000..02cc320d01 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_warped_stem_climbable_vine.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/vertical_hollow_log_vine", + "render_type": "minecraft:cutout", + "textures": { + "inner": "minecraft:block/stripped_warped_stem", + "side": "minecraft:block/warped_stem", + "top": "minecraft:block/warped_stem_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_warped_stem_horizontal.json b/src/generated/resources/assets/twilightforest/models/block/hollow_warped_stem_horizontal.json new file mode 100644 index 0000000000..7ff954b848 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_warped_stem_horizontal.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/horizontal_hollow_log", + "render_type": "minecraft:cutout", + "textures": { + "inner": "minecraft:block/stripped_warped_stem", + "side": "minecraft:block/warped_stem", + "top": "minecraft:block/warped_stem_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_warped_stem_horizontal_moss.json b/src/generated/resources/assets/twilightforest/models/block/hollow_warped_stem_horizontal_moss.json new file mode 100644 index 0000000000..c0d167f4f9 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_warped_stem_horizontal_moss.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/hollow_log_moss", + "render_type": "minecraft:cutout", + "textures": { + "inner": "minecraft:block/stripped_warped_stem", + "side": "minecraft:block/warped_stem", + "top": "minecraft:block/warped_stem_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_warped_stem_horizontal_moss_grass.json b/src/generated/resources/assets/twilightforest/models/block/hollow_warped_stem_horizontal_moss_grass.json new file mode 100644 index 0000000000..9ec95ab3bd --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_warped_stem_horizontal_moss_grass.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/hollow_log_moss_grass", + "render_type": "minecraft:cutout", + "textures": { + "inner": "minecraft:block/stripped_warped_stem", + "side": "minecraft:block/warped_stem", + "top": "minecraft:block/warped_stem_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_warped_stem_horizontal_snow.json b/src/generated/resources/assets/twilightforest/models/block/hollow_warped_stem_horizontal_snow.json new file mode 100644 index 0000000000..dc27fa87ad --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_warped_stem_horizontal_snow.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/hollow_log_snow", + "render_type": "minecraft:cutout", + "textures": { + "inner": "minecraft:block/stripped_warped_stem", + "side": "minecraft:block/warped_stem", + "top": "minecraft:block/warped_stem_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/hollow_warped_stem_vertical.json b/src/generated/resources/assets/twilightforest/models/block/hollow_warped_stem_vertical.json new file mode 100644 index 0000000000..68e9d9002a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/hollow_warped_stem_vertical.json @@ -0,0 +1,8 @@ +{ + "parent": "twilightforest:block/vertical_hollow_log", + "textures": { + "inner": "minecraft:block/stripped_warped_stem", + "side": "minecraft:block/warped_stem", + "top": "minecraft:block/warped_stem_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/horizontal_hollow_log.json b/src/generated/resources/assets/twilightforest/models/block/horizontal_hollow_log.json new file mode 100644 index 0000000000..63added2fc --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/horizontal_hollow_log.json @@ -0,0 +1,199 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "rotation": 180, + "texture": "#side" + }, + "east": { + "cullface": "east", + "rotation": 90, + "texture": "#side", + "uv": [ + 14.0, + 0.0, + 16.0, + 16.0 + ] + }, + "north": { + "cullface": "north", + "texture": "#top" + }, + "south": { + "cullface": "south", + "texture": "#top" + }, + "up": { + "texture": "#inner" + }, + "west": { + "cullface": "west", + "rotation": 270, + "texture": "#side", + "uv": [ + 0.0, + 0.0, + 2.0, + 16.0 + ] + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 2, + 16 + ] + }, + { + "faces": { + "down": { + "rotation": 180, + "texture": "#inner" + }, + "east": { + "cullface": "east", + "rotation": 90, + "texture": "#side", + "uv": [ + 0.0, + 0.0, + 2.0, + 16.0 + ] + }, + "north": { + "cullface": "north", + "texture": "#top" + }, + "south": { + "cullface": "south", + "texture": "#top" + }, + "up": { + "cullface": "up", + "texture": "#side" + }, + "west": { + "cullface": "west", + "rotation": 270, + "texture": "#side", + "uv": [ + 14.0, + 0.0, + 16.0, + 16.0 + ] + } + }, + "from": [ + 0, + 14, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + }, + { + "faces": { + "east": { + "rotation": 90, + "texture": "#inner", + "uv": [ + 2.0, + 0.0, + 14.0, + 16.0 + ] + }, + "north": { + "cullface": "north", + "texture": "#top" + }, + "south": { + "cullface": "south", + "texture": "#top" + }, + "west": { + "cullface": "west", + "rotation": 270, + "texture": "#side", + "uv": [ + 2.0, + 0.0, + 14.0, + 16.0 + ] + } + }, + "from": [ + 0, + 2, + 0 + ], + "to": [ + 2, + 14, + 16 + ] + }, + { + "faces": { + "east": { + "cullface": "east", + "rotation": 90, + "texture": "#side", + "uv": [ + 2.0, + 0.0, + 14.0, + 16.0 + ] + }, + "north": { + "cullface": "north", + "texture": "#top" + }, + "south": { + "cullface": "south", + "texture": "#top" + }, + "west": { + "rotation": 270, + "texture": "#inner", + "uv": [ + 2.0, + 0.0, + 14.0, + 16.0 + ] + } + }, + "from": [ + 14, + 2, + 0 + ], + "to": [ + 16, + 14, + 16 + ] + } + ], + "render_type": "minecraft:cutout", + "textures": { + "particle": "#side" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/horizontal_hollow_log_carpet.json b/src/generated/resources/assets/twilightforest/models/block/horizontal_hollow_log_carpet.json new file mode 100644 index 0000000000..a72cc39beb --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/horizontal_hollow_log_carpet.json @@ -0,0 +1,219 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "rotation": 180, + "texture": "#side" + }, + "east": { + "cullface": "east", + "rotation": 90, + "texture": "#side", + "uv": [ + 13.0, + 0.0, + 16.0, + 16.0 + ] + }, + "north": { + "cullface": "north", + "texture": "#top" + }, + "south": { + "cullface": "south", + "texture": "#top" + }, + "up": { + "texture": "#carpet" + }, + "west": { + "cullface": "west", + "rotation": 270, + "texture": "#side", + "uv": [ + 0.0, + 0.0, + 3.0, + 16.0 + ] + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 3, + 16 + ] + }, + { + "faces": { + "down": { + "rotation": 180, + "texture": "#inner" + }, + "east": { + "cullface": "east", + "rotation": 90, + "texture": "#side", + "uv": [ + 0.0, + 0.0, + 2.0, + 16.0 + ] + }, + "north": { + "cullface": "north", + "texture": "#top" + }, + "south": { + "cullface": "south", + "texture": "#top" + }, + "up": { + "cullface": "up", + "texture": "#side" + }, + "west": { + "cullface": "west", + "rotation": 270, + "texture": "#side", + "uv": [ + 14.0, + 0.0, + 16.0, + 16.0 + ] + } + }, + "from": [ + 0, + 14, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + }, + { + "faces": { + "east": { + "rotation": 90, + "texture": "#inner", + "uv": [ + 2.0, + 0.0, + 13.0, + 16.0 + ] + }, + "north": { + "cullface": "north", + "texture": "#top" + }, + "south": { + "cullface": "south", + "texture": "#top" + }, + "west": { + "cullface": "west", + "rotation": 270, + "texture": "#side", + "uv": [ + 3.0, + 0.0, + 14.0, + 16.0 + ] + } + }, + "from": [ + 0, + 3, + 0 + ], + "to": [ + 2, + 14, + 16 + ] + }, + { + "faces": { + "east": { + "cullface": "east", + "rotation": 90, + "texture": "#side", + "uv": [ + 2.0, + 0.0, + 13.0, + 16.0 + ] + }, + "north": { + "cullface": "north", + "texture": "#top" + }, + "south": { + "cullface": "south", + "texture": "#top" + }, + "west": { + "rotation": 270, + "texture": "#inner", + "uv": [ + 3.0, + 0.0, + 14.0, + 16.0 + ] + } + }, + "from": [ + 14, + 3, + 0 + ], + "to": [ + 16, + 14, + 16 + ] + }, + { + "faces": { + "north": { + "texture": "#overhang" + }, + "south": { + "texture": "#overhang" + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 3, + 16 + ] + } + ], + "render_type": "minecraft:cutout", + "textures": { + "particle": "#side" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/horizontal_hollow_log_plant.json b/src/generated/resources/assets/twilightforest/models/block/horizontal_hollow_log_plant.json new file mode 100644 index 0000000000..9d5e27f4e1 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/horizontal_hollow_log_plant.json @@ -0,0 +1,309 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "rotation": 180, + "texture": "#side" + }, + "east": { + "cullface": "east", + "rotation": 90, + "texture": "#side", + "uv": [ + 13.0, + 0.0, + 16.0, + 16.0 + ] + }, + "north": { + "cullface": "north", + "texture": "#top" + }, + "south": { + "cullface": "south", + "texture": "#top" + }, + "up": { + "texture": "#carpet" + }, + "west": { + "cullface": "west", + "rotation": 270, + "texture": "#side", + "uv": [ + 0.0, + 0.0, + 3.0, + 16.0 + ] + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 3, + 16 + ] + }, + { + "faces": { + "down": { + "rotation": 180, + "texture": "#inner" + }, + "east": { + "cullface": "east", + "rotation": 90, + "texture": "#side", + "uv": [ + 0.0, + 0.0, + 2.0, + 16.0 + ] + }, + "north": { + "cullface": "north", + "texture": "#top" + }, + "south": { + "cullface": "south", + "texture": "#top" + }, + "up": { + "cullface": "up", + "texture": "#side" + }, + "west": { + "cullface": "west", + "rotation": 270, + "texture": "#side", + "uv": [ + 14.0, + 0.0, + 16.0, + 16.0 + ] + } + }, + "from": [ + 0, + 14, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + }, + { + "faces": { + "east": { + "rotation": 90, + "texture": "#inner", + "uv": [ + 2.0, + 0.0, + 13.0, + 16.0 + ] + }, + "north": { + "cullface": "north", + "texture": "#top" + }, + "south": { + "cullface": "south", + "texture": "#top" + }, + "west": { + "cullface": "west", + "rotation": 270, + "texture": "#side", + "uv": [ + 3.0, + 0.0, + 14.0, + 16.0 + ] + } + }, + "from": [ + 0, + 3, + 0 + ], + "to": [ + 2, + 14, + 16 + ] + }, + { + "faces": { + "east": { + "cullface": "east", + "rotation": 90, + "texture": "#side", + "uv": [ + 2.0, + 0.0, + 13.0, + 16.0 + ] + }, + "north": { + "cullface": "north", + "texture": "#top" + }, + "south": { + "cullface": "south", + "texture": "#top" + }, + "west": { + "rotation": 270, + "texture": "#inner", + "uv": [ + 3.0, + 0.0, + 14.0, + 16.0 + ] + } + }, + "from": [ + 14, + 3, + 0 + ], + "to": [ + 16, + 14, + 16 + ] + }, + { + "faces": { + "north": { + "texture": "#overhang" + }, + "south": { + "texture": "#overhang" + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 3, + 16 + ] + }, + { + "faces": { + "north": { + "texture": "#plant", + "tintindex": 1, + "uv": [ + 0.0, + 3.0, + 16.0, + 14.0 + ] + }, + "south": { + "texture": "#plant", + "tintindex": 1, + "uv": [ + 0.0, + 3.0, + 16.0, + 14.0 + ] + } + }, + "from": [ + 0.8, + 3, + 8 + ], + "rotation": { + "angle": 45.0, + "axis": "y", + "origin": [ + 8, + 8, + 8 + ], + "rescale": true + }, + "shade": false, + "to": [ + 15.2, + 14, + 8 + ] + }, + { + "faces": { + "east": { + "texture": "#plant", + "tintindex": 1, + "uv": [ + 0.0, + 3.0, + 16.0, + 14.0 + ] + }, + "west": { + "texture": "#plant", + "tintindex": 1, + "uv": [ + 0.0, + 3.0, + 16.0, + 14.0 + ] + } + }, + "from": [ + 8, + 3, + 0.8 + ], + "rotation": { + "angle": 45.0, + "axis": "y", + "origin": [ + 8, + 8, + 8 + ], + "rescale": true + }, + "shade": false, + "to": [ + 8, + 14, + 15.2 + ] + } + ], + "render_type": "minecraft:cutout", + "textures": { + "particle": "#side" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/huge_lily_pad_0.json b/src/generated/resources/assets/twilightforest/models/block/huge_lily_pad_0.json new file mode 100644 index 0000000000..a687ab5179 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/huge_lily_pad_0.json @@ -0,0 +1,8 @@ +{ + "parent": "twilightforest:block/huge_lily_pad", + "render_type": "minecraft:cutout", + "textures": { + "particle": "#texture", + "texture": "twilightforest:block/huge_lily_pad_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/huge_lily_pad_1.json b/src/generated/resources/assets/twilightforest/models/block/huge_lily_pad_1.json new file mode 100644 index 0000000000..1a59f6cce6 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/huge_lily_pad_1.json @@ -0,0 +1,8 @@ +{ + "parent": "twilightforest:block/huge_lily_pad", + "render_type": "minecraft:cutout", + "textures": { + "particle": "#texture", + "texture": "twilightforest:block/huge_lily_pad_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/huge_lily_pad_2.json b/src/generated/resources/assets/twilightforest/models/block/huge_lily_pad_2.json new file mode 100644 index 0000000000..eaa730cb63 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/huge_lily_pad_2.json @@ -0,0 +1,8 @@ +{ + "parent": "twilightforest:block/huge_lily_pad", + "render_type": "minecraft:cutout", + "textures": { + "particle": "#texture", + "texture": "twilightforest:block/huge_lily_pad_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/huge_lily_pad_3.json b/src/generated/resources/assets/twilightforest/models/block/huge_lily_pad_3.json new file mode 100644 index 0000000000..ba234b90ae --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/huge_lily_pad_3.json @@ -0,0 +1,8 @@ +{ + "parent": "twilightforest:block/huge_lily_pad", + "render_type": "minecraft:cutout", + "textures": { + "particle": "#texture", + "texture": "twilightforest:block/huge_lily_pad_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/huge_mushgloom_inside.json b/src/generated/resources/assets/twilightforest/models/block/huge_mushgloom_inside.json new file mode 100644 index 0000000000..04ea7b0e67 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/huge_mushgloom_inside.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_single_face", + "textures": { + "texture": "twilightforest:block/huge_gloom_inside" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/huge_mushgloom_outside.json b/src/generated/resources/assets/twilightforest/models/block/huge_mushgloom_outside.json new file mode 100644 index 0000000000..935ce2d8c0 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/huge_mushgloom_outside.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_single_face", + "textures": { + "texture": "twilightforest:block/huge_gloom_cap" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/huge_mushgloom_stem_inside.json b/src/generated/resources/assets/twilightforest/models/block/huge_mushgloom_stem_inside.json new file mode 100644 index 0000000000..04ea7b0e67 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/huge_mushgloom_stem_inside.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_single_face", + "textures": { + "texture": "twilightforest:block/huge_gloom_inside" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/huge_mushgloom_stem_outside.json b/src/generated/resources/assets/twilightforest/models/block/huge_mushgloom_stem_outside.json new file mode 100644 index 0000000000..880120056b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/huge_mushgloom_stem_outside.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_single_face", + "textures": { + "texture": "twilightforest:block/huge_mushgloom_stem" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/huge_stalk.json b/src/generated/resources/assets/twilightforest/models/block/huge_stalk.json new file mode 100644 index 0000000000..f578b9152d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/huge_stalk.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "twilightforest:block/huge_stalk_top", + "side": "twilightforest:block/huge_stalk" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/huge_stalk_horizontal.json b/src/generated/resources/assets/twilightforest/models/block/huge_stalk_horizontal.json new file mode 100644 index 0000000000..ff03364a8a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/huge_stalk_horizontal.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column_horizontal", + "textures": { + "end": "twilightforest:block/huge_stalk_top", + "side": "twilightforest:block/huge_stalk" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/huge_water_lily.json b/src/generated/resources/assets/twilightforest/models/block/huge_water_lily.json new file mode 100644 index 0000000000..b50105aa04 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/huge_water_lily.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cross", + "render_type": "minecraft:cutout", + "textures": { + "cross": "twilightforest:block/huge_water_lily" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/infested_towerwood.json b/src/generated/resources/assets/twilightforest/models/block/infested_towerwood.json new file mode 100644 index 0000000000..72a2044afd --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/infested_towerwood.json @@ -0,0 +1,60 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "texture": "#down", + "tintindex": 0 + }, + "east": { + "cullface": "east", + "texture": "#east", + "tintindex": 0 + }, + "north": { + "cullface": "north", + "texture": "#north", + "tintindex": 0 + }, + "south": { + "cullface": "south", + "texture": "#south", + "tintindex": 0 + }, + "up": { + "cullface": "up", + "texture": "#up", + "tintindex": 0 + }, + "west": { + "cullface": "west", + "texture": "#west", + "tintindex": 0 + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + } + ], + "render_type": "minecraft:solid", + "textures": { + "all": "twilightforest:block/infested_towerwood", + "down": "#all", + "east": "#all", + "north": "#all", + "particle": "#north", + "south": "#all", + "up": "#all", + "west": "#all" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/infested_towerwood_flipped.json b/src/generated/resources/assets/twilightforest/models/block/infested_towerwood_flipped.json new file mode 100644 index 0000000000..60ef442c5b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/infested_towerwood_flipped.json @@ -0,0 +1,89 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "texture": "#all", + "tintindex": 0, + "uv": [ + 0.0, + 16.0, + 16.0, + 0.0 + ] + }, + "east": { + "cullface": "east", + "texture": "#all", + "tintindex": 0, + "uv": [ + 0.0, + 16.0, + 16.0, + 0.0 + ] + }, + "north": { + "cullface": "north", + "texture": "#all", + "tintindex": 0, + "uv": [ + 0.0, + 16.0, + 16.0, + 0.0 + ] + }, + "south": { + "cullface": "south", + "texture": "#all", + "tintindex": 0, + "uv": [ + 0.0, + 16.0, + 16.0, + 0.0 + ] + }, + "up": { + "cullface": "up", + "texture": "#all", + "tintindex": 0, + "uv": [ + 0.0, + 16.0, + 16.0, + 0.0 + ] + }, + "west": { + "cullface": "west", + "texture": "#all", + "tintindex": 0, + "uv": [ + 0.0, + 16.0, + 16.0, + 0.0 + ] + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + } + ], + "textures": { + "all": "twilightforest:block/infested_towerwood", + "particle": "#all" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/ironwood_block.json b/src/generated/resources/assets/twilightforest/models/block/ironwood_block.json new file mode 100644 index 0000000000..229511a80f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/ironwood_block.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "twilightforest:block/ironwood_block" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/keepsake_casket.json b/src/generated/resources/assets/twilightforest/models/block/keepsake_casket.json new file mode 100644 index 0000000000..a00dd11a3c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/keepsake_casket.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:builtin/entity", + "textures": { + "particle": "minecraft:block/netherite_block" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/liveroot_block.json b/src/generated/resources/assets/twilightforest/models/block/liveroot_block.json new file mode 100644 index 0000000000..d05f7efeeb --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/liveroot_block.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "twilightforest:block/liveroot_block" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/locked_vanishing_block.json b/src/generated/resources/assets/twilightforest/models/block/locked_vanishing_block.json new file mode 100644 index 0000000000..f4c5c03a07 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/locked_vanishing_block.json @@ -0,0 +1,192 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "texture": "#bottom" + }, + "east": { + "cullface": "east", + "texture": "#east" + }, + "north": { + "cullface": "north", + "texture": "#north" + }, + "south": { + "cullface": "south", + "texture": "#south" + }, + "up": { + "cullface": "up", + "texture": "#top" + }, + "west": { + "cullface": "west", + "texture": "#west" + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + }, + { + "faces": { + "down": { + "cullface": "down", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#bottom2" + }, + "east": { + "cullface": "east", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#east2" + }, + "north": { + "cullface": "north", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#north2" + }, + "south": { + "cullface": "south", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#south2" + }, + "up": { + "cullface": "up", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#top2" + }, + "west": { + "cullface": "west", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#west2" + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + }, + { + "faces": { + "down": { + "cullface": "down", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#bottom3" + }, + "east": { + "cullface": "east", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#east3" + }, + "north": { + "cullface": "north", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#north3" + }, + "south": { + "cullface": "south", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#south3" + }, + "up": { + "cullface": "up", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#top3" + }, + "west": { + "cullface": "west", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#west3" + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + } + ], + "render_type": "minecraft:cutout", + "textures": { + "all": "twilightforest:block/towerdev_lock_on", + "all2": "twilightforest:block/tower_device_level_1/towerdev_lock_on_1", + "all3": "twilightforest:block/tower_device_level_2/towerdev_lock_on_2", + "bottom": "#all", + "bottom2": "#all2", + "bottom3": "#all3", + "east": "#all", + "east2": "#all2", + "east3": "#all3", + "north": "#all", + "north2": "#all2", + "north3": "#all3", + "particle": "#bottom", + "south": "#all", + "south2": "#all2", + "south3": "#all3", + "top": "#all", + "top2": "#all2", + "top3": "#all3", + "west": "#all", + "west2": "#all2", + "west3": "#all3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/locked_vanishing_block_unlocked.json b/src/generated/resources/assets/twilightforest/models/block/locked_vanishing_block_unlocked.json new file mode 100644 index 0000000000..371a7f40b7 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/locked_vanishing_block_unlocked.json @@ -0,0 +1,192 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "texture": "#bottom" + }, + "east": { + "cullface": "east", + "texture": "#east" + }, + "north": { + "cullface": "north", + "texture": "#north" + }, + "south": { + "cullface": "south", + "texture": "#south" + }, + "up": { + "cullface": "up", + "texture": "#top" + }, + "west": { + "cullface": "west", + "texture": "#west" + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + }, + { + "faces": { + "down": { + "cullface": "down", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#bottom2" + }, + "east": { + "cullface": "east", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#east2" + }, + "north": { + "cullface": "north", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#north2" + }, + "south": { + "cullface": "south", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#south2" + }, + "up": { + "cullface": "up", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#top2" + }, + "west": { + "cullface": "west", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#west2" + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + }, + { + "faces": { + "down": { + "cullface": "down", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#bottom3" + }, + "east": { + "cullface": "east", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#east3" + }, + "north": { + "cullface": "north", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#north3" + }, + "south": { + "cullface": "south", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#south3" + }, + "up": { + "cullface": "up", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#top3" + }, + "west": { + "cullface": "west", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#west3" + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + } + ], + "render_type": "minecraft:cutout", + "textures": { + "all": "twilightforest:block/towerdev_lock_off", + "all2": "twilightforest:block/tower_device_level_1/towerdev_lock_off_1", + "all3": "twilightforest:block/tower_device_level_2/towerdev_lock_off_2", + "bottom": "#all", + "bottom2": "#all2", + "bottom3": "#all3", + "east": "#all", + "east2": "#all2", + "east3": "#all3", + "north": "#all", + "north2": "#all2", + "north3": "#all3", + "particle": "#bottom", + "south": "#all", + "south2": "#all2", + "south3": "#all3", + "top": "#all", + "top2": "#all2", + "top3": "#all3", + "west": "#all", + "west2": "#all2", + "west3": "#all3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/mangrove_chest.json b/src/generated/resources/assets/twilightforest/models/block/mangrove_chest.json new file mode 100644 index 0000000000..99f19008db --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/mangrove_chest.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:builtin/entity", + "textures": { + "particle": "twilightforest:block/wood/planks_mangrove_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/mangrove_leaves.json b/src/generated/resources/assets/twilightforest/models/block/mangrove_leaves.json new file mode 100644 index 0000000000..6f7f331c30 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/mangrove_leaves.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/leaves", + "textures": { + "all": "minecraft:block/birch_leaves" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/mangrove_log.json b/src/generated/resources/assets/twilightforest/models/block/mangrove_log.json new file mode 100644 index 0000000000..786619440b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/mangrove_log.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "twilightforest:block/mangrove_log_top", + "side": "twilightforest:block/mangrove_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/mangrove_log_horizontal.json b/src/generated/resources/assets/twilightforest/models/block/mangrove_log_horizontal.json new file mode 100644 index 0000000000..37d2834244 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/mangrove_log_horizontal.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column_horizontal", + "textures": { + "end": "twilightforest:block/mangrove_log_top", + "side": "twilightforest:block/mangrove_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/mangrove_root.json b/src/generated/resources/assets/twilightforest/models/block/mangrove_root.json new file mode 100644 index 0000000000..a293a21f5d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/mangrove_root.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "twilightforest:block/mangrove_root" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/mangrove_sapling.json b/src/generated/resources/assets/twilightforest/models/block/mangrove_sapling.json new file mode 100644 index 0000000000..1b33ff9188 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/mangrove_sapling.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cross", + "render_type": "minecraft:cutout", + "textures": { + "cross": "twilightforest:block/mangrove_sapling" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/mangrove_sign.json b/src/generated/resources/assets/twilightforest/models/block/mangrove_sign.json new file mode 100644 index 0000000000..99f19008db --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/mangrove_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:builtin/entity", + "textures": { + "particle": "twilightforest:block/wood/planks_mangrove_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/mangrove_wall_sign.json b/src/generated/resources/assets/twilightforest/models/block/mangrove_wall_sign.json new file mode 100644 index 0000000000..99f19008db --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/mangrove_wall_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:builtin/entity", + "textures": { + "particle": "twilightforest:block/wood/planks_mangrove_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/mangrove_wood.json b/src/generated/resources/assets/twilightforest/models/block/mangrove_wood.json new file mode 100644 index 0000000000..c85d3f105c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/mangrove_wood.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "twilightforest:block/mangrove_log", + "side": "twilightforest:block/mangrove_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/mangrove_wood_horizontal.json b/src/generated/resources/assets/twilightforest/models/block/mangrove_wood_horizontal.json new file mode 100644 index 0000000000..dbb252c458 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/mangrove_wood_horizontal.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column_horizontal", + "textures": { + "end": "twilightforest:block/mangrove_log", + "side": "twilightforest:block/mangrove_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/mazestone.json b/src/generated/resources/assets/twilightforest/models/block/mazestone.json new file mode 100644 index 0000000000..e4310b811d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/mazestone.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "twilightforest:block/mazestone" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/mazestone_border.json b/src/generated/resources/assets/twilightforest/models/block/mazestone_border.json new file mode 100644 index 0000000000..9a3ff477f2 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/mazestone_border.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "twilightforest:block/mazestone_border", + "side": "twilightforest:block/mazestone_brick" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/mazestone_brick.json b/src/generated/resources/assets/twilightforest/models/block/mazestone_brick.json new file mode 100644 index 0000000000..a9ac7c9527 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/mazestone_brick.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "twilightforest:block/mazestone_brick" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/mazestone_mosaic.json b/src/generated/resources/assets/twilightforest/models/block/mazestone_mosaic.json new file mode 100644 index 0000000000..16ecf5b3da --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/mazestone_mosaic.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "twilightforest:block/mazestone_mosaic", + "side": "twilightforest:block/mazestone_brick" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/mining_chest.json b/src/generated/resources/assets/twilightforest/models/block/mining_chest.json new file mode 100644 index 0000000000..ebb13ce4c8 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/mining_chest.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:builtin/entity", + "textures": { + "particle": "twilightforest:block/wood/planks_mine_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/mining_leaves.json b/src/generated/resources/assets/twilightforest/models/block/mining_leaves.json new file mode 100644 index 0000000000..44e13395a9 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/mining_leaves.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/leaves", + "textures": { + "all": "twilightforest:block/mining_leaves" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/mining_log.json b/src/generated/resources/assets/twilightforest/models/block/mining_log.json new file mode 100644 index 0000000000..54e29dd521 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/mining_log.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "twilightforest:block/mining_log_top", + "side": "twilightforest:block/mining_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/mining_log_core.json b/src/generated/resources/assets/twilightforest/models/block/mining_log_core.json new file mode 100644 index 0000000000..624e819022 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/mining_log_core.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "twilightforest:block/mining_log_top", + "side": "twilightforest:block/mining_log_core" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/mining_log_core_on.json b/src/generated/resources/assets/twilightforest/models/block/mining_log_core_on.json new file mode 100644 index 0000000000..1cc9a50c91 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/mining_log_core_on.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "twilightforest:block/mining_log_top", + "side": "twilightforest:block/mining_log_core_on" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/mining_log_horizontal.json b/src/generated/resources/assets/twilightforest/models/block/mining_log_horizontal.json new file mode 100644 index 0000000000..20562c72b7 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/mining_log_horizontal.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column_horizontal", + "textures": { + "end": "twilightforest:block/mining_log_top", + "side": "twilightforest:block/mining_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/mining_sapling.json b/src/generated/resources/assets/twilightforest/models/block/mining_sapling.json new file mode 100644 index 0000000000..232f541efb --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/mining_sapling.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cross", + "render_type": "minecraft:cutout", + "textures": { + "cross": "twilightforest:block/mining_sapling" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/mining_sign.json b/src/generated/resources/assets/twilightforest/models/block/mining_sign.json new file mode 100644 index 0000000000..ebb13ce4c8 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/mining_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:builtin/entity", + "textures": { + "particle": "twilightforest:block/wood/planks_mine_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/mining_wall_sign.json b/src/generated/resources/assets/twilightforest/models/block/mining_wall_sign.json new file mode 100644 index 0000000000..ebb13ce4c8 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/mining_wall_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:builtin/entity", + "textures": { + "particle": "twilightforest:block/wood/planks_mine_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/mining_wood.json b/src/generated/resources/assets/twilightforest/models/block/mining_wood.json new file mode 100644 index 0000000000..ff5fa742f4 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/mining_wood.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "twilightforest:block/mining_log", + "side": "twilightforest:block/mining_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/mining_wood_horizontal.json b/src/generated/resources/assets/twilightforest/models/block/mining_wood_horizontal.json new file mode 100644 index 0000000000..d7c22d3aa3 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/mining_wood_horizontal.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column_horizontal", + "textures": { + "end": "twilightforest:block/mining_log", + "side": "twilightforest:block/mining_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/moonworm.json b/src/generated/resources/assets/twilightforest/models/block/moonworm.json new file mode 100644 index 0000000000..472ab29d49 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/moonworm.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:builtin/entity", + "textures": { + "particle": "twilightforest:block/stone_twist/twist_blank" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/mossy_castle_brick.json b/src/generated/resources/assets/twilightforest/models/block/mossy_castle_brick.json new file mode 100644 index 0000000000..ce733f68ba --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/mossy_castle_brick.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "twilightforest:block/mossy_castle_brick" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/mossy_castle_brick_stairs.json b/src/generated/resources/assets/twilightforest/models/block/mossy_castle_brick_stairs.json new file mode 100644 index 0000000000..23b4d2b599 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/mossy_castle_brick_stairs.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/stairs", + "textures": { + "bottom": "twilightforest:block/mossy_castle_brick_stairs", + "side": "twilightforest:block/mossy_castle_brick_stairs", + "top": "twilightforest:block/mossy_castle_brick_stairs" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/mossy_castle_brick_stairs_inner.json b/src/generated/resources/assets/twilightforest/models/block/mossy_castle_brick_stairs_inner.json new file mode 100644 index 0000000000..920da8e9c5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/mossy_castle_brick_stairs_inner.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/inner_stairs", + "textures": { + "bottom": "twilightforest:block/mossy_castle_brick_stairs", + "side": "twilightforest:block/mossy_castle_brick_stairs", + "top": "twilightforest:block/mossy_castle_brick_stairs" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/mossy_castle_brick_stairs_outer.json b/src/generated/resources/assets/twilightforest/models/block/mossy_castle_brick_stairs_outer.json new file mode 100644 index 0000000000..f18703f020 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/mossy_castle_brick_stairs_outer.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/outer_stairs", + "textures": { + "bottom": "twilightforest:block/mossy_castle_brick_stairs", + "side": "twilightforest:block/mossy_castle_brick_stairs", + "top": "twilightforest:block/mossy_castle_brick_stairs" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/mossy_etched_nagastone.json b/src/generated/resources/assets/twilightforest/models/block/mossy_etched_nagastone.json new file mode 100644 index 0000000000..1ac84bf82f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/mossy_etched_nagastone.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "twilightforest:block/stone_tiles_mossy", + "side": "twilightforest:block/etched_nagastone_down_mossy" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/mossy_etched_nagastone_east.json b/src/generated/resources/assets/twilightforest/models/block/mossy_etched_nagastone_east.json new file mode 100644 index 0000000000..13a8af5856 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/mossy_etched_nagastone_east.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "twilightforest:block/etched_nagastone_right_mossy", + "east": "twilightforest:block/stone_tiles_mossy", + "north": "twilightforest:block/etched_nagastone_left_mossy", + "particle": "#down", + "south": "twilightforest:block/etched_nagastone_right_mossy", + "up": "twilightforest:block/etched_nagastone_left_mossy", + "west": "twilightforest:block/stone_tiles_mossy" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/mossy_etched_nagastone_north.json b/src/generated/resources/assets/twilightforest/models/block/mossy_etched_nagastone_north.json new file mode 100644 index 0000000000..d5458278a1 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/mossy_etched_nagastone_north.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "twilightforest:block/etched_nagastone_up_mossy", + "east": "twilightforest:block/etched_nagastone_right_mossy", + "north": "twilightforest:block/stone_tiles_mossy", + "particle": "#down", + "south": "twilightforest:block/stone_tiles_mossy", + "up": "twilightforest:block/etched_nagastone_up_mossy", + "west": "twilightforest:block/etched_nagastone_left_mossy" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/mossy_etched_nagastone_south.json b/src/generated/resources/assets/twilightforest/models/block/mossy_etched_nagastone_south.json new file mode 100644 index 0000000000..3c249fa25a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/mossy_etched_nagastone_south.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "twilightforest:block/etched_nagastone_down_mossy", + "east": "twilightforest:block/etched_nagastone_left_mossy", + "north": "twilightforest:block/stone_tiles_mossy", + "particle": "#down", + "south": "twilightforest:block/stone_tiles_mossy", + "up": "twilightforest:block/etched_nagastone_down_mossy", + "west": "twilightforest:block/etched_nagastone_right_mossy" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/mossy_etched_nagastone_up.json b/src/generated/resources/assets/twilightforest/models/block/mossy_etched_nagastone_up.json new file mode 100644 index 0000000000..b72e5cb733 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/mossy_etched_nagastone_up.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "twilightforest:block/stone_tiles_mossy", + "side": "twilightforest:block/etched_nagastone_up_mossy" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/mossy_etched_nagastone_west.json b/src/generated/resources/assets/twilightforest/models/block/mossy_etched_nagastone_west.json new file mode 100644 index 0000000000..9c6b19c501 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/mossy_etched_nagastone_west.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "twilightforest:block/etched_nagastone_left_mossy", + "east": "twilightforest:block/stone_tiles_mossy", + "north": "twilightforest:block/etched_nagastone_right_mossy", + "particle": "#down", + "south": "twilightforest:block/etched_nagastone_left_mossy", + "up": "twilightforest:block/etched_nagastone_right_mossy", + "west": "twilightforest:block/stone_tiles_mossy" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/mossy_mazestone.json b/src/generated/resources/assets/twilightforest/models/block/mossy_mazestone.json new file mode 100644 index 0000000000..c495b2eebb --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/mossy_mazestone.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "twilightforest:block/mossy_mazestone" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/mossy_nagastone_pillar.json b/src/generated/resources/assets/twilightforest/models/block/mossy_nagastone_pillar.json new file mode 100644 index 0000000000..1ba8c1fee0 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/mossy_nagastone_pillar.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "twilightforest:block/nagastone_pillar_end_mossy", + "side": "twilightforest:block/nagastone_pillar_side_mossy" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/mossy_nagastone_pillar_reversed.json b/src/generated/resources/assets/twilightforest/models/block/mossy_nagastone_pillar_reversed.json new file mode 100644 index 0000000000..63bac76e66 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/mossy_nagastone_pillar_reversed.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "twilightforest:block/nagastone_pillar_end_mossy", + "side": "twilightforest:block/nagastone_pillar_side_mossy_alt" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/mossy_nagastone_stairs_left.json b/src/generated/resources/assets/twilightforest/models/block/mossy_nagastone_stairs_left.json new file mode 100644 index 0000000000..afb5058d05 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/mossy_nagastone_stairs_left.json @@ -0,0 +1,8 @@ +{ + "parent": "twilightforest:block/util/bisected_stairs", + "textures": { + "end": "twilightforest:block/stone_tiles_mossy", + "middle": "twilightforest:block/nagastone_bare_mossy", + "side": "twilightforest:block/etched_nagastone_left_mossy" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/mossy_nagastone_stairs_left_inner.json b/src/generated/resources/assets/twilightforest/models/block/mossy_nagastone_stairs_left_inner.json new file mode 100644 index 0000000000..62414bae4a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/mossy_nagastone_stairs_left_inner.json @@ -0,0 +1,8 @@ +{ + "parent": "twilightforest:block/util/bisected_inner_stairs", + "textures": { + "end": "twilightforest:block/stone_tiles_mossy", + "middle": "twilightforest:block/nagastone_bare_mossy", + "side": "twilightforest:block/etched_nagastone_left_mossy" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/mossy_nagastone_stairs_left_outer.json b/src/generated/resources/assets/twilightforest/models/block/mossy_nagastone_stairs_left_outer.json new file mode 100644 index 0000000000..1eb023560d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/mossy_nagastone_stairs_left_outer.json @@ -0,0 +1,8 @@ +{ + "parent": "twilightforest:block/util/bisected_outer_stairs", + "textures": { + "end": "twilightforest:block/stone_tiles_mossy", + "middle": "twilightforest:block/nagastone_bare_mossy", + "side": "twilightforest:block/etched_nagastone_left_mossy" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/mossy_nagastone_stairs_right.json b/src/generated/resources/assets/twilightforest/models/block/mossy_nagastone_stairs_right.json new file mode 100644 index 0000000000..4756231760 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/mossy_nagastone_stairs_right.json @@ -0,0 +1,8 @@ +{ + "parent": "twilightforest:block/util/bisected_stairs", + "textures": { + "end": "twilightforest:block/stone_tiles_mossy", + "middle": "twilightforest:block/nagastone_bare_mossy", + "side": "twilightforest:block/etched_nagastone_right_mossy" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/mossy_nagastone_stairs_right_inner.json b/src/generated/resources/assets/twilightforest/models/block/mossy_nagastone_stairs_right_inner.json new file mode 100644 index 0000000000..c6b4e0fb4a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/mossy_nagastone_stairs_right_inner.json @@ -0,0 +1,8 @@ +{ + "parent": "twilightforest:block/util/bisected_inner_stairs", + "textures": { + "end": "twilightforest:block/stone_tiles_mossy", + "middle": "twilightforest:block/nagastone_bare_mossy", + "side": "twilightforest:block/etched_nagastone_right_mossy" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/mossy_nagastone_stairs_right_outer.json b/src/generated/resources/assets/twilightforest/models/block/mossy_nagastone_stairs_right_outer.json new file mode 100644 index 0000000000..a59b1077b0 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/mossy_nagastone_stairs_right_outer.json @@ -0,0 +1,8 @@ +{ + "parent": "twilightforest:block/util/bisected_outer_stairs", + "textures": { + "end": "twilightforest:block/stone_tiles_mossy", + "middle": "twilightforest:block/nagastone_bare_mossy", + "side": "twilightforest:block/etched_nagastone_right_mossy" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/mossy_towerwood.json b/src/generated/resources/assets/twilightforest/models/block/mossy_towerwood.json new file mode 100644 index 0000000000..0ba692fbf6 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/mossy_towerwood.json @@ -0,0 +1,60 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "texture": "#down", + "tintindex": 0 + }, + "east": { + "cullface": "east", + "texture": "#east", + "tintindex": 0 + }, + "north": { + "cullface": "north", + "texture": "#north", + "tintindex": 0 + }, + "south": { + "cullface": "south", + "texture": "#south", + "tintindex": 0 + }, + "up": { + "cullface": "up", + "texture": "#up", + "tintindex": 0 + }, + "west": { + "cullface": "west", + "texture": "#west", + "tintindex": 0 + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + } + ], + "render_type": "minecraft:solid", + "textures": { + "all": "twilightforest:block/mossy_towerwood", + "down": "#all", + "east": "#all", + "north": "#all", + "particle": "#north", + "south": "#all", + "up": "#all", + "west": "#all" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/mossy_towerwood_flipped.json b/src/generated/resources/assets/twilightforest/models/block/mossy_towerwood_flipped.json new file mode 100644 index 0000000000..228b1e766d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/mossy_towerwood_flipped.json @@ -0,0 +1,89 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "texture": "#all", + "tintindex": 0, + "uv": [ + 0.0, + 16.0, + 16.0, + 0.0 + ] + }, + "east": { + "cullface": "east", + "texture": "#all", + "tintindex": 0, + "uv": [ + 0.0, + 16.0, + 16.0, + 0.0 + ] + }, + "north": { + "cullface": "north", + "texture": "#all", + "tintindex": 0, + "uv": [ + 0.0, + 16.0, + 16.0, + 0.0 + ] + }, + "south": { + "cullface": "south", + "texture": "#all", + "tintindex": 0, + "uv": [ + 0.0, + 16.0, + 16.0, + 0.0 + ] + }, + "up": { + "cullface": "up", + "texture": "#all", + "tintindex": 0, + "uv": [ + 0.0, + 16.0, + 16.0, + 0.0 + ] + }, + "west": { + "cullface": "west", + "texture": "#all", + "tintindex": 0, + "uv": [ + 0.0, + 16.0, + 16.0, + 0.0 + ] + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + } + ], + "textures": { + "all": "twilightforest:block/mossy_towerwood", + "particle": "#all" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/mossy_underbrick.json b/src/generated/resources/assets/twilightforest/models/block/mossy_underbrick.json new file mode 100644 index 0000000000..8593fdbe60 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/mossy_underbrick.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "twilightforest:block/mossy_underbrick" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/mushgloom.json b/src/generated/resources/assets/twilightforest/models/block/mushgloom.json new file mode 100644 index 0000000000..fd48d8e1ef --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/mushgloom.json @@ -0,0 +1,215 @@ +{ + "ambientocclusion": false, + "elements": [ + { + "faces": { + "north": { + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#cross", + "uv": [ + 0.0, + 0.0, + 16.0, + 16.0 + ] + }, + "south": { + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#cross", + "uv": [ + 0.0, + 0.0, + 16.0, + 16.0 + ] + } + }, + "from": [ + 0.8, + 0, + 8 + ], + "rotation": { + "angle": 45.0, + "axis": "y", + "origin": [ + 8, + 8, + 8 + ], + "rescale": true + }, + "shade": false, + "to": [ + 15.2, + 16, + 8 + ] + }, + { + "faces": { + "east": { + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#cross", + "uv": [ + 0.0, + 0.0, + 16.0, + 16.0 + ] + }, + "west": { + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#cross", + "uv": [ + 0.0, + 0.0, + 16.0, + 16.0 + ] + } + }, + "from": [ + 8, + 0, + 0.8 + ], + "rotation": { + "angle": 45.0, + "axis": "y", + "origin": [ + 8, + 8, + 8 + ], + "rescale": true + }, + "shade": false, + "to": [ + 8, + 16, + 15.2 + ] + }, + { + "faces": { + "north": { + "forge_data": { + "block_light": 6, + "sky_light": 6 + }, + "texture": "#cross2", + "uv": [ + 0.0, + 0.0, + 16.0, + 16.0 + ] + }, + "south": { + "forge_data": { + "block_light": 6, + "sky_light": 6 + }, + "texture": "#cross2", + "uv": [ + 0.0, + 0.0, + 16.0, + 16.0 + ] + } + }, + "from": [ + 0.8, + 0, + 8 + ], + "rotation": { + "angle": 45.0, + "axis": "y", + "origin": [ + 8, + 8, + 8 + ], + "rescale": true + }, + "shade": false, + "to": [ + 15.2, + 16, + 8 + ] + }, + { + "faces": { + "east": { + "forge_data": { + "block_light": 6, + "sky_light": 6 + }, + "texture": "#cross2", + "uv": [ + 0.0, + 0.0, + 16.0, + 16.0 + ] + }, + "west": { + "forge_data": { + "block_light": 6, + "sky_light": 6 + }, + "texture": "#cross2", + "uv": [ + 0.0, + 0.0, + 16.0, + 16.0 + ] + } + }, + "from": [ + 8, + 0, + 0.8 + ], + "rotation": { + "angle": 45.0, + "axis": "y", + "origin": [ + 8, + 8, + 8 + ], + "rescale": true + }, + "shade": false, + "to": [ + 8, + 16, + 15.2 + ] + } + ], + "render_type": "minecraft:cutout", + "textures": { + "cross": "twilightforest:block/mushgloom", + "cross2": "twilightforest:block/mushgloom_head", + "particle": "#cross" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/nagastone.json b/src/generated/resources/assets/twilightforest/models/block/nagastone.json new file mode 100644 index 0000000000..375f83cb72 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/nagastone.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/cube_bottom_top", + "textures": { + "bottom": "twilightforest:block/nagastone_bottom_long", + "side": "twilightforest:block/nagastone_long_side", + "top": "twilightforest:block/nagastone_turn_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/nagastone_pillar.json b/src/generated/resources/assets/twilightforest/models/block/nagastone_pillar.json new file mode 100644 index 0000000000..d930ffb46f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/nagastone_pillar.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "twilightforest:block/nagastone_pillar_end", + "side": "twilightforest:block/nagastone_pillar_side" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/nagastone_pillar_reversed.json b/src/generated/resources/assets/twilightforest/models/block/nagastone_pillar_reversed.json new file mode 100644 index 0000000000..fd6b92fa6e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/nagastone_pillar_reversed.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "twilightforest:block/nagastone_pillar_end", + "side": "twilightforest:block/nagastone_pillar_side_alt" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/nagastone_stairs_left.json b/src/generated/resources/assets/twilightforest/models/block/nagastone_stairs_left.json new file mode 100644 index 0000000000..0149ab77f1 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/nagastone_stairs_left.json @@ -0,0 +1,8 @@ +{ + "parent": "twilightforest:block/util/bisected_stairs", + "textures": { + "end": "twilightforest:block/stone_tiles", + "middle": "twilightforest:block/nagastone_bare", + "side": "twilightforest:block/etched_nagastone_left" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/nagastone_stairs_left_inner.json b/src/generated/resources/assets/twilightforest/models/block/nagastone_stairs_left_inner.json new file mode 100644 index 0000000000..96c00045cb --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/nagastone_stairs_left_inner.json @@ -0,0 +1,8 @@ +{ + "parent": "twilightforest:block/util/bisected_inner_stairs", + "textures": { + "end": "twilightforest:block/stone_tiles", + "middle": "twilightforest:block/nagastone_bare", + "side": "twilightforest:block/etched_nagastone_left" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/nagastone_stairs_left_outer.json b/src/generated/resources/assets/twilightforest/models/block/nagastone_stairs_left_outer.json new file mode 100644 index 0000000000..1a9b75a53a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/nagastone_stairs_left_outer.json @@ -0,0 +1,8 @@ +{ + "parent": "twilightforest:block/util/bisected_outer_stairs", + "textures": { + "end": "twilightforest:block/stone_tiles", + "middle": "twilightforest:block/nagastone_bare", + "side": "twilightforest:block/etched_nagastone_left" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/nagastone_stairs_right.json b/src/generated/resources/assets/twilightforest/models/block/nagastone_stairs_right.json new file mode 100644 index 0000000000..fecf83f78f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/nagastone_stairs_right.json @@ -0,0 +1,8 @@ +{ + "parent": "twilightforest:block/util/bisected_stairs", + "textures": { + "end": "twilightforest:block/stone_tiles", + "middle": "twilightforest:block/nagastone_bare", + "side": "twilightforest:block/etched_nagastone_right" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/nagastone_stairs_right_inner.json b/src/generated/resources/assets/twilightforest/models/block/nagastone_stairs_right_inner.json new file mode 100644 index 0000000000..db52e7358c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/nagastone_stairs_right_inner.json @@ -0,0 +1,8 @@ +{ + "parent": "twilightforest:block/util/bisected_inner_stairs", + "textures": { + "end": "twilightforest:block/stone_tiles", + "middle": "twilightforest:block/nagastone_bare", + "side": "twilightforest:block/etched_nagastone_right" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/nagastone_stairs_right_outer.json b/src/generated/resources/assets/twilightforest/models/block/nagastone_stairs_right_outer.json new file mode 100644 index 0000000000..0f5cb4a313 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/nagastone_stairs_right_outer.json @@ -0,0 +1,8 @@ +{ + "parent": "twilightforest:block/util/bisected_outer_stairs", + "textures": { + "end": "twilightforest:block/stone_tiles", + "middle": "twilightforest:block/nagastone_bare", + "side": "twilightforest:block/etched_nagastone_right" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/pillar_bottom_x.json b/src/generated/resources/assets/twilightforest/models/block/pillar_bottom_x.json new file mode 100644 index 0000000000..bea5bdecbd --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/pillar_bottom_x.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/pillar/pillar_bottom", + "render_type": "minecraft:cutout", + "textures": { + "bottom_cap": "twilightforest:block/stone_twist/cap/end_bottom_x", + "bottom_x": "twilightforest:block/stone_twist/cap/y_y_bottom", + "bottom_z": "twilightforest:block/stone_twist/cap/y_y_bottom" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/pillar_bottom_y.json b/src/generated/resources/assets/twilightforest/models/block/pillar_bottom_y.json new file mode 100644 index 0000000000..0066ad3a13 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/pillar_bottom_y.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/pillar/pillar_bottom", + "render_type": "minecraft:cutout", + "textures": { + "bottom_cap": "twilightforest:block/stone_twist/cap/end_bottom_y", + "bottom_x": "twilightforest:block/stone_twist/cap/y_y_bottom", + "bottom_z": "twilightforest:block/stone_twist/cap/y_y_bottom" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/pillar_bottom_z.json b/src/generated/resources/assets/twilightforest/models/block/pillar_bottom_z.json new file mode 100644 index 0000000000..4d24ea85d8 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/pillar_bottom_z.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/pillar/pillar_bottom", + "render_type": "minecraft:cutout", + "textures": { + "bottom_cap": "twilightforest:block/stone_twist/cap/end_bottom_z", + "bottom_x": "twilightforest:block/stone_twist/cap/y_y_bottom", + "bottom_z": "twilightforest:block/stone_twist/cap/y_y_bottom" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/pillar_main_x.json b/src/generated/resources/assets/twilightforest/models/block/pillar_main_x.json new file mode 100644 index 0000000000..c5ba82cdb3 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/pillar_main_x.json @@ -0,0 +1,8 @@ +{ + "parent": "twilightforest:block/pillar/pillar_12_ctm", + "render_type": "minecraft:cutout", + "textures": { + "side_x": "twilightforest:block/stone_twist/twist_x", + "side_z": "twilightforest:block/stone_twist/twist_x" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/pillar_main_y.json b/src/generated/resources/assets/twilightforest/models/block/pillar_main_y.json new file mode 100644 index 0000000000..fec0833904 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/pillar_main_y.json @@ -0,0 +1,8 @@ +{ + "parent": "twilightforest:block/pillar/pillar_12_ctm", + "render_type": "minecraft:cutout", + "textures": { + "side_x": "twilightforest:block/stone_twist/twist_y", + "side_z": "twilightforest:block/stone_twist/twist_y" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/pillar_main_z.json b/src/generated/resources/assets/twilightforest/models/block/pillar_main_z.json new file mode 100644 index 0000000000..ee78afed32 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/pillar_main_z.json @@ -0,0 +1,8 @@ +{ + "parent": "twilightforest:block/pillar/pillar_12_ctm", + "render_type": "minecraft:cutout", + "textures": { + "side_x": "twilightforest:block/stone_twist/twist_x", + "side_z": "twilightforest:block/stone_twist/twist_y" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/pillar_top_x.json b/src/generated/resources/assets/twilightforest/models/block/pillar_top_x.json new file mode 100644 index 0000000000..50a94fd4e0 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/pillar_top_x.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/pillar/pillar_top", + "render_type": "minecraft:cutout", + "textures": { + "top_cap": "twilightforest:block/stone_twist/cap/end_top_x", + "top_x": "twilightforest:block/stone_twist/cap/y_y_top", + "top_z": "twilightforest:block/stone_twist/cap/y_y_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/pillar_top_y.json b/src/generated/resources/assets/twilightforest/models/block/pillar_top_y.json new file mode 100644 index 0000000000..7682563bfe --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/pillar_top_y.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/pillar/pillar_top", + "render_type": "minecraft:cutout", + "textures": { + "top_cap": "twilightforest:block/stone_twist/cap/end_top_y", + "top_x": "twilightforest:block/stone_twist/cap/y_y_top", + "top_z": "twilightforest:block/stone_twist/cap/y_y_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/pillar_top_z.json b/src/generated/resources/assets/twilightforest/models/block/pillar_top_z.json new file mode 100644 index 0000000000..211be4f01d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/pillar_top_z.json @@ -0,0 +1,9 @@ +{ + "parent": "twilightforest:block/pillar/pillar_top", + "render_type": "minecraft:cutout", + "textures": { + "top_cap": "twilightforest:block/stone_twist/cap/end_top_z", + "top_x": "twilightforest:block/stone_twist/cap/y_y_top", + "top_z": "twilightforest:block/stone_twist/cap/y_y_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/pink_castle_door.json b/src/generated/resources/assets/twilightforest/models/block/pink_castle_door.json new file mode 100644 index 0000000000..94f18d7e7c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/pink_castle_door.json @@ -0,0 +1,11 @@ +{ + "parent": "minecraft:block/block", + "loader": "twilightforest:castle_door", + "render_type": "minecraft:cutout", + "textures": { + "base": "twilightforest:block/castle_door", + "overlay": "twilightforest:block/castle_door_rune_corners", + "overlay_connected": "twilightforest:block/castle_door_rune_ctm", + "particle": "twilightforest:block/castle_door" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/pink_castle_door_vanished.json b/src/generated/resources/assets/twilightforest/models/block/pink_castle_door_vanished.json new file mode 100644 index 0000000000..9307588e5a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/pink_castle_door_vanished.json @@ -0,0 +1,11 @@ +{ + "parent": "minecraft:block/block", + "loader": "twilightforest:castle_door", + "render_type": "minecraft:cutout", + "textures": { + "base": "twilightforest:block/castle_door_vanished", + "overlay": "twilightforest:block/castle_door_rune_corners", + "overlay_connected": "twilightforest:block/castle_door_rune_ctm", + "particle": "twilightforest:block/castle_door_vanished" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/potted_canopy_sapling.json b/src/generated/resources/assets/twilightforest/models/block/potted_canopy_sapling.json new file mode 100644 index 0000000000..cf12f85cb8 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/potted_canopy_sapling.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/flower_pot_cross", + "render_type": "minecraft:cutout", + "textures": { + "plant": "twilightforest:block/canopy_sapling" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/potted_darkwood_sapling.json b/src/generated/resources/assets/twilightforest/models/block/potted_darkwood_sapling.json new file mode 100644 index 0000000000..75dfc5e281 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/potted_darkwood_sapling.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/potted_larger_sapling", + "render_type": "minecraft:cutout", + "textures": { + "plant": "twilightforest:block/darkwood_sapling" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/potted_fiddlehead.json b/src/generated/resources/assets/twilightforest/models/block/potted_fiddlehead.json new file mode 100644 index 0000000000..5bdf04c729 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/potted_fiddlehead.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/tinted_flower_pot_cross", + "render_type": "minecraft:cutout", + "textures": { + "plant": "twilightforest:block/potted_fiddlehead" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/potted_hollow_oak_sapling.json b/src/generated/resources/assets/twilightforest/models/block/potted_hollow_oak_sapling.json new file mode 100644 index 0000000000..057c7e9098 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/potted_hollow_oak_sapling.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/flower_pot_cross", + "render_type": "minecraft:cutout", + "textures": { + "plant": "twilightforest:block/hollow_oak_sapling" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/potted_mangrove_sapling.json b/src/generated/resources/assets/twilightforest/models/block/potted_mangrove_sapling.json new file mode 100644 index 0000000000..0d660cca10 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/potted_mangrove_sapling.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/potted_larger_sapling", + "render_type": "minecraft:cutout", + "textures": { + "plant": "twilightforest:block/mangrove_sapling" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/potted_mining_sapling.json b/src/generated/resources/assets/twilightforest/models/block/potted_mining_sapling.json new file mode 100644 index 0000000000..8dce3a10ed --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/potted_mining_sapling.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/flower_pot_cross", + "render_type": "minecraft:cutout", + "textures": { + "plant": "twilightforest:block/mining_sapling" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/potted_mushgloom.json b/src/generated/resources/assets/twilightforest/models/block/potted_mushgloom.json new file mode 100644 index 0000000000..a678d4cbc4 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/potted_mushgloom.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/flower_pot_cross", + "render_type": "minecraft:cutout", + "textures": { + "plant": "twilightforest:block/potted_mushgloom" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/potted_rainbow_oak_sapling.json b/src/generated/resources/assets/twilightforest/models/block/potted_rainbow_oak_sapling.json new file mode 100644 index 0000000000..03af8642b9 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/potted_rainbow_oak_sapling.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/flower_pot_cross", + "render_type": "minecraft:cutout", + "textures": { + "plant": "twilightforest:block/rainbow_oak_sapling" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/potted_sorting_sapling.json b/src/generated/resources/assets/twilightforest/models/block/potted_sorting_sapling.json new file mode 100644 index 0000000000..7567d44f0c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/potted_sorting_sapling.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/flower_pot_cross", + "render_type": "minecraft:cutout", + "textures": { + "plant": "twilightforest:block/sorting_sapling" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/potted_thorn.json b/src/generated/resources/assets/twilightforest/models/block/potted_thorn.json new file mode 100644 index 0000000000..13277f5005 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/potted_thorn.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/potted_thorn_template", + "textures": { + "thorn_side": "twilightforest:block/burnt_thorns_side", + "thorn_top": "twilightforest:block/burnt_thorns_top" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/potted_time_sapling.json b/src/generated/resources/assets/twilightforest/models/block/potted_time_sapling.json new file mode 100644 index 0000000000..4327031708 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/potted_time_sapling.json @@ -0,0 +1,7 @@ +{ + "parent": "twilightforest:block/potted_larger_sapling", + "render_type": "minecraft:cutout", + "textures": { + "plant": "twilightforest:block/time_sapling" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/potted_transformation_sapling.json b/src/generated/resources/assets/twilightforest/models/block/potted_transformation_sapling.json new file mode 100644 index 0000000000..b8cb63b843 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/potted_transformation_sapling.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/flower_pot_cross", + "render_type": "minecraft:cutout", + "textures": { + "plant": "twilightforest:block/transformation_sapling" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/potted_twilight_oak_sapling.json b/src/generated/resources/assets/twilightforest/models/block/potted_twilight_oak_sapling.json new file mode 100644 index 0000000000..6f6606efdc --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/potted_twilight_oak_sapling.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/flower_pot_cross", + "render_type": "minecraft:cutout", + "textures": { + "plant": "twilightforest:block/twilight_oak_sapling" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/rainbow_oak_leaves.json b/src/generated/resources/assets/twilightforest/models/block/rainbow_oak_leaves.json new file mode 100644 index 0000000000..192ebd6700 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/rainbow_oak_leaves.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/leaves", + "textures": { + "all": "minecraft:block/oak_leaves" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/rainbow_oak_sapling.json b/src/generated/resources/assets/twilightforest/models/block/rainbow_oak_sapling.json new file mode 100644 index 0000000000..edefd457d8 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/rainbow_oak_sapling.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cross", + "render_type": "minecraft:cutout", + "textures": { + "cross": "twilightforest:block/rainbow_oak_sapling" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/reactor_debris.json b/src/generated/resources/assets/twilightforest/models/block/reactor_debris.json new file mode 100644 index 0000000000..95efd05ca4 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/reactor_debris.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_all", + "render_type": "minecraft:cutout", + "textures": { + "all": "minecraft:block/destroy_stage_9" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/reappearing_block.json b/src/generated/resources/assets/twilightforest/models/block/reappearing_block.json new file mode 100644 index 0000000000..5005236a32 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/reappearing_block.json @@ -0,0 +1,192 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "texture": "#bottom" + }, + "east": { + "cullface": "east", + "texture": "#east" + }, + "north": { + "cullface": "north", + "texture": "#north" + }, + "south": { + "cullface": "south", + "texture": "#south" + }, + "up": { + "cullface": "up", + "texture": "#top" + }, + "west": { + "cullface": "west", + "texture": "#west" + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + }, + { + "faces": { + "down": { + "cullface": "down", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#bottom2" + }, + "east": { + "cullface": "east", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#east2" + }, + "north": { + "cullface": "north", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#north2" + }, + "south": { + "cullface": "south", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#south2" + }, + "up": { + "cullface": "up", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#top2" + }, + "west": { + "cullface": "west", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#west2" + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + }, + { + "faces": { + "down": { + "cullface": "down", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#bottom3" + }, + "east": { + "cullface": "east", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#east3" + }, + "north": { + "cullface": "north", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#north3" + }, + "south": { + "cullface": "south", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#south3" + }, + "up": { + "cullface": "up", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#top3" + }, + "west": { + "cullface": "west", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#west3" + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + } + ], + "render_type": "minecraft:cutout", + "textures": { + "all": "twilightforest:block/towerdev_reappearing_off", + "all2": "twilightforest:block/tower_device_level_1/towerdev_reappearing_off_1", + "all3": "twilightforest:block/tower_device_level_2/towerdev_reappearing_off_2", + "bottom": "#all", + "bottom2": "#all2", + "bottom3": "#all3", + "east": "#all", + "east2": "#all2", + "east3": "#all3", + "north": "#all", + "north2": "#all2", + "north3": "#all3", + "particle": "#bottom", + "south": "#all", + "south2": "#all2", + "south3": "#all3", + "top": "#all", + "top2": "#all2", + "top3": "#all3", + "west": "#all", + "west2": "#all2", + "west3": "#all3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/reappearing_block_active.json b/src/generated/resources/assets/twilightforest/models/block/reappearing_block_active.json new file mode 100644 index 0000000000..5bac5b50ae --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/reappearing_block_active.json @@ -0,0 +1,192 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "texture": "#bottom" + }, + "east": { + "cullface": "east", + "texture": "#east" + }, + "north": { + "cullface": "north", + "texture": "#north" + }, + "south": { + "cullface": "south", + "texture": "#south" + }, + "up": { + "cullface": "up", + "texture": "#top" + }, + "west": { + "cullface": "west", + "texture": "#west" + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + }, + { + "faces": { + "down": { + "cullface": "down", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#bottom2" + }, + "east": { + "cullface": "east", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#east2" + }, + "north": { + "cullface": "north", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#north2" + }, + "south": { + "cullface": "south", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#south2" + }, + "up": { + "cullface": "up", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#top2" + }, + "west": { + "cullface": "west", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#west2" + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + }, + { + "faces": { + "down": { + "cullface": "down", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#bottom3" + }, + "east": { + "cullface": "east", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#east3" + }, + "north": { + "cullface": "north", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#north3" + }, + "south": { + "cullface": "south", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#south3" + }, + "up": { + "cullface": "up", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#top3" + }, + "west": { + "cullface": "west", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#west3" + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + } + ], + "render_type": "minecraft:cutout", + "textures": { + "all": "twilightforest:block/towerdev_reappearing_on", + "all2": "twilightforest:block/tower_device_level_1/towerdev_reappearing_on_1", + "all3": "twilightforest:block/tower_device_level_2/towerdev_reappearing_on_2", + "bottom": "#all", + "bottom2": "#all2", + "bottom3": "#all3", + "east": "#all", + "east2": "#all2", + "east3": "#all3", + "north": "#all", + "north2": "#all2", + "north3": "#all3", + "particle": "#bottom", + "south": "#all", + "south2": "#all2", + "south3": "#all3", + "top": "#all", + "top2": "#all2", + "top3": "#all3", + "west": "#all", + "west2": "#all2", + "west3": "#all3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/reappearing_block_vanished.json b/src/generated/resources/assets/twilightforest/models/block/reappearing_block_vanished.json new file mode 100644 index 0000000000..1e1de842a1 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/reappearing_block_vanished.json @@ -0,0 +1,72 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#all" + }, + "east": { + "cullface": "east", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#all" + }, + "north": { + "cullface": "north", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#all" + }, + "south": { + "cullface": "south", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#all" + }, + "up": { + "cullface": "up", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#all" + }, + "west": { + "cullface": "west", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#all" + } + }, + "from": [ + 6, + 6, + 6 + ], + "to": [ + 10, + 10, + 10 + ] + } + ], + "render_type": "minecraft:cutout", + "textures": { + "all": "twilightforest:block/towerdev_reappearing_trace_off", + "particle": "#all" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/reappearing_block_vanished_active.json b/src/generated/resources/assets/twilightforest/models/block/reappearing_block_vanished_active.json new file mode 100644 index 0000000000..e802d3bd60 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/reappearing_block_vanished_active.json @@ -0,0 +1,72 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#all" + }, + "east": { + "cullface": "east", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#all" + }, + "north": { + "cullface": "north", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#all" + }, + "south": { + "cullface": "south", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#all" + }, + "up": { + "cullface": "up", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#all" + }, + "west": { + "cullface": "west", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#all" + } + }, + "from": [ + 6, + 6, + 6 + ], + "to": [ + 10, + 10, + 10 + ] + } + ], + "render_type": "minecraft:cutout", + "textures": { + "all": "twilightforest:block/towerdev_reappearing_trace_on", + "particle": "#all" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/red_thread.json b/src/generated/resources/assets/twilightforest/models/block/red_thread.json new file mode 100644 index 0000000000..472ab29d49 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/red_thread.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:builtin/entity", + "textures": { + "particle": "twilightforest:block/stone_twist/twist_blank" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/root.json b/src/generated/resources/assets/twilightforest/models/block/root.json new file mode 100644 index 0000000000..93a5846c14 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/root.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "twilightforest:block/root" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/smoker.json b/src/generated/resources/assets/twilightforest/models/block/smoker.json new file mode 100644 index 0000000000..d621a2f4a0 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/smoker.json @@ -0,0 +1,62 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "texture": "#down", + "tintindex": 0 + }, + "east": { + "cullface": "east", + "texture": "#east", + "tintindex": 0 + }, + "north": { + "cullface": "north", + "texture": "#north", + "tintindex": 0 + }, + "south": { + "cullface": "south", + "texture": "#south", + "tintindex": 0 + }, + "up": { + "cullface": "up", + "texture": "#up", + "tintindex": 0 + }, + "west": { + "cullface": "west", + "texture": "#west", + "tintindex": 0 + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + } + ], + "render_type": "minecraft:solid", + "textures": { + "bottom": "minecraft:block/grass_block_top", + "down": "#bottom", + "east": "#side", + "north": "#side", + "particle": "#north", + "side": "twilightforest:block/firejet_side", + "south": "#side", + "top": "twilightforest:block/firejet_top", + "up": "#top", + "west": "#side" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/sorting_chest.json b/src/generated/resources/assets/twilightforest/models/block/sorting_chest.json new file mode 100644 index 0000000000..2709aa493d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/sorting_chest.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:builtin/entity", + "textures": { + "particle": "twilightforest:block/wood/planks_sort_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/sorting_leaves.json b/src/generated/resources/assets/twilightforest/models/block/sorting_leaves.json new file mode 100644 index 0000000000..14b1bfeb07 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/sorting_leaves.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/leaves", + "textures": { + "all": "twilightforest:block/sorting_leaves" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/sorting_log.json b/src/generated/resources/assets/twilightforest/models/block/sorting_log.json new file mode 100644 index 0000000000..0b3306fa32 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/sorting_log.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "twilightforest:block/sorting_log_top", + "side": "twilightforest:block/sorting_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/sorting_log_core.json b/src/generated/resources/assets/twilightforest/models/block/sorting_log_core.json new file mode 100644 index 0000000000..17933ba690 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/sorting_log_core.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "twilightforest:block/sorting_log_top", + "side": "twilightforest:block/sorting_log_core" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/sorting_log_core_on.json b/src/generated/resources/assets/twilightforest/models/block/sorting_log_core_on.json new file mode 100644 index 0000000000..e85ed166de --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/sorting_log_core_on.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "twilightforest:block/sorting_log_top", + "side": "twilightforest:block/sorting_log_core_on" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/sorting_log_horizontal.json b/src/generated/resources/assets/twilightforest/models/block/sorting_log_horizontal.json new file mode 100644 index 0000000000..c2d48243ae --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/sorting_log_horizontal.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column_horizontal", + "textures": { + "end": "twilightforest:block/sorting_log_top", + "side": "twilightforest:block/sorting_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/sorting_sapling.json b/src/generated/resources/assets/twilightforest/models/block/sorting_sapling.json new file mode 100644 index 0000000000..8b144a2638 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/sorting_sapling.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cross", + "render_type": "minecraft:cutout", + "textures": { + "cross": "twilightforest:block/sorting_sapling" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/sorting_sign.json b/src/generated/resources/assets/twilightforest/models/block/sorting_sign.json new file mode 100644 index 0000000000..2709aa493d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/sorting_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:builtin/entity", + "textures": { + "particle": "twilightforest:block/wood/planks_sort_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/sorting_wall_sign.json b/src/generated/resources/assets/twilightforest/models/block/sorting_wall_sign.json new file mode 100644 index 0000000000..2709aa493d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/sorting_wall_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:builtin/entity", + "textures": { + "particle": "twilightforest:block/wood/planks_sort_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/sorting_wood.json b/src/generated/resources/assets/twilightforest/models/block/sorting_wood.json new file mode 100644 index 0000000000..afe659a100 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/sorting_wood.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "twilightforest:block/sorting_log", + "side": "twilightforest:block/sorting_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/sorting_wood_horizontal.json b/src/generated/resources/assets/twilightforest/models/block/sorting_wood_horizontal.json new file mode 100644 index 0000000000..6b0fef1114 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/sorting_wood_horizontal.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column_horizontal", + "textures": { + "end": "twilightforest:block/sorting_log", + "side": "twilightforest:block/sorting_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/steeleaf_block.json b/src/generated/resources/assets/twilightforest/models/block/steeleaf_block.json new file mode 100644 index 0000000000..091304454f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/steeleaf_block.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "twilightforest:block/steeleaf_block" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/stripped_canopy_log.json b/src/generated/resources/assets/twilightforest/models/block/stripped_canopy_log.json new file mode 100644 index 0000000000..3574749d00 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/stripped_canopy_log.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "twilightforest:block/stripped_canopy_log_top", + "side": "twilightforest:block/stripped_canopy_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/stripped_canopy_log_horizontal.json b/src/generated/resources/assets/twilightforest/models/block/stripped_canopy_log_horizontal.json new file mode 100644 index 0000000000..912a3d0b0c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/stripped_canopy_log_horizontal.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column_horizontal", + "textures": { + "end": "twilightforest:block/stripped_canopy_log_top", + "side": "twilightforest:block/stripped_canopy_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/stripped_canopy_wood.json b/src/generated/resources/assets/twilightforest/models/block/stripped_canopy_wood.json new file mode 100644 index 0000000000..24cb69f30c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/stripped_canopy_wood.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "twilightforest:block/stripped_canopy_log", + "side": "twilightforest:block/stripped_canopy_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/stripped_canopy_wood_horizontal.json b/src/generated/resources/assets/twilightforest/models/block/stripped_canopy_wood_horizontal.json new file mode 100644 index 0000000000..0d94845d14 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/stripped_canopy_wood_horizontal.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column_horizontal", + "textures": { + "end": "twilightforest:block/stripped_canopy_log", + "side": "twilightforest:block/stripped_canopy_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/stripped_dark_log.json b/src/generated/resources/assets/twilightforest/models/block/stripped_dark_log.json new file mode 100644 index 0000000000..c87f00787e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/stripped_dark_log.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "twilightforest:block/stripped_dark_log_top", + "side": "twilightforest:block/stripped_dark_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/stripped_dark_log_horizontal.json b/src/generated/resources/assets/twilightforest/models/block/stripped_dark_log_horizontal.json new file mode 100644 index 0000000000..5ef59dbf65 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/stripped_dark_log_horizontal.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column_horizontal", + "textures": { + "end": "twilightforest:block/stripped_dark_log_top", + "side": "twilightforest:block/stripped_dark_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/stripped_dark_wood.json b/src/generated/resources/assets/twilightforest/models/block/stripped_dark_wood.json new file mode 100644 index 0000000000..3d5201f24e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/stripped_dark_wood.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "twilightforest:block/stripped_dark_log", + "side": "twilightforest:block/stripped_dark_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/stripped_dark_wood_horizontal.json b/src/generated/resources/assets/twilightforest/models/block/stripped_dark_wood_horizontal.json new file mode 100644 index 0000000000..e7ab928506 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/stripped_dark_wood_horizontal.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column_horizontal", + "textures": { + "end": "twilightforest:block/stripped_dark_log", + "side": "twilightforest:block/stripped_dark_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/stripped_mangrove_log.json b/src/generated/resources/assets/twilightforest/models/block/stripped_mangrove_log.json new file mode 100644 index 0000000000..5e2c5d3864 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/stripped_mangrove_log.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "twilightforest:block/stripped_mangrove_log_top", + "side": "twilightforest:block/stripped_mangrove_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/stripped_mangrove_log_horizontal.json b/src/generated/resources/assets/twilightforest/models/block/stripped_mangrove_log_horizontal.json new file mode 100644 index 0000000000..34f4b7fa88 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/stripped_mangrove_log_horizontal.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column_horizontal", + "textures": { + "end": "twilightforest:block/stripped_mangrove_log_top", + "side": "twilightforest:block/stripped_mangrove_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/stripped_mangrove_wood.json b/src/generated/resources/assets/twilightforest/models/block/stripped_mangrove_wood.json new file mode 100644 index 0000000000..3e82f3a108 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/stripped_mangrove_wood.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "twilightforest:block/stripped_mangrove_log", + "side": "twilightforest:block/stripped_mangrove_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/stripped_mangrove_wood_horizontal.json b/src/generated/resources/assets/twilightforest/models/block/stripped_mangrove_wood_horizontal.json new file mode 100644 index 0000000000..5be0aa6bf9 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/stripped_mangrove_wood_horizontal.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column_horizontal", + "textures": { + "end": "twilightforest:block/stripped_mangrove_log", + "side": "twilightforest:block/stripped_mangrove_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/stripped_mining_log.json b/src/generated/resources/assets/twilightforest/models/block/stripped_mining_log.json new file mode 100644 index 0000000000..a28005962c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/stripped_mining_log.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "twilightforest:block/stripped_mining_log_top", + "side": "twilightforest:block/stripped_mining_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/stripped_mining_log_horizontal.json b/src/generated/resources/assets/twilightforest/models/block/stripped_mining_log_horizontal.json new file mode 100644 index 0000000000..47e11cf3dd --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/stripped_mining_log_horizontal.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column_horizontal", + "textures": { + "end": "twilightforest:block/stripped_mining_log_top", + "side": "twilightforest:block/stripped_mining_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/stripped_mining_wood.json b/src/generated/resources/assets/twilightforest/models/block/stripped_mining_wood.json new file mode 100644 index 0000000000..8673294350 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/stripped_mining_wood.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "twilightforest:block/stripped_mining_log", + "side": "twilightforest:block/stripped_mining_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/stripped_mining_wood_horizontal.json b/src/generated/resources/assets/twilightforest/models/block/stripped_mining_wood_horizontal.json new file mode 100644 index 0000000000..fc5081276d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/stripped_mining_wood_horizontal.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column_horizontal", + "textures": { + "end": "twilightforest:block/stripped_mining_log", + "side": "twilightforest:block/stripped_mining_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/stripped_sorting_log.json b/src/generated/resources/assets/twilightforest/models/block/stripped_sorting_log.json new file mode 100644 index 0000000000..e4aa12ad00 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/stripped_sorting_log.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "twilightforest:block/stripped_sorting_log_top", + "side": "twilightforest:block/stripped_sorting_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/stripped_sorting_log_horizontal.json b/src/generated/resources/assets/twilightforest/models/block/stripped_sorting_log_horizontal.json new file mode 100644 index 0000000000..b4379c931b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/stripped_sorting_log_horizontal.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column_horizontal", + "textures": { + "end": "twilightforest:block/stripped_sorting_log_top", + "side": "twilightforest:block/stripped_sorting_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/stripped_sorting_wood.json b/src/generated/resources/assets/twilightforest/models/block/stripped_sorting_wood.json new file mode 100644 index 0000000000..6a1f01d208 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/stripped_sorting_wood.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "twilightforest:block/stripped_sorting_log", + "side": "twilightforest:block/stripped_sorting_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/stripped_sorting_wood_horizontal.json b/src/generated/resources/assets/twilightforest/models/block/stripped_sorting_wood_horizontal.json new file mode 100644 index 0000000000..fefd5984bd --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/stripped_sorting_wood_horizontal.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column_horizontal", + "textures": { + "end": "twilightforest:block/stripped_sorting_log", + "side": "twilightforest:block/stripped_sorting_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/stripped_time_log.json b/src/generated/resources/assets/twilightforest/models/block/stripped_time_log.json new file mode 100644 index 0000000000..6feda53830 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/stripped_time_log.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "twilightforest:block/stripped_time_log_top", + "side": "twilightforest:block/stripped_time_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/stripped_time_log_horizontal.json b/src/generated/resources/assets/twilightforest/models/block/stripped_time_log_horizontal.json new file mode 100644 index 0000000000..343f9f1f0b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/stripped_time_log_horizontal.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column_horizontal", + "textures": { + "end": "twilightforest:block/stripped_time_log_top", + "side": "twilightforest:block/stripped_time_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/stripped_time_wood.json b/src/generated/resources/assets/twilightforest/models/block/stripped_time_wood.json new file mode 100644 index 0000000000..422d3038f4 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/stripped_time_wood.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "twilightforest:block/stripped_time_log", + "side": "twilightforest:block/stripped_time_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/stripped_time_wood_horizontal.json b/src/generated/resources/assets/twilightforest/models/block/stripped_time_wood_horizontal.json new file mode 100644 index 0000000000..9b97cca6df --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/stripped_time_wood_horizontal.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column_horizontal", + "textures": { + "end": "twilightforest:block/stripped_time_log", + "side": "twilightforest:block/stripped_time_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/stripped_transformation_log.json b/src/generated/resources/assets/twilightforest/models/block/stripped_transformation_log.json new file mode 100644 index 0000000000..2c701602d4 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/stripped_transformation_log.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "twilightforest:block/stripped_transformation_log_top", + "side": "twilightforest:block/stripped_transformation_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/stripped_transformation_log_horizontal.json b/src/generated/resources/assets/twilightforest/models/block/stripped_transformation_log_horizontal.json new file mode 100644 index 0000000000..2545f7d408 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/stripped_transformation_log_horizontal.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column_horizontal", + "textures": { + "end": "twilightforest:block/stripped_transformation_log_top", + "side": "twilightforest:block/stripped_transformation_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/stripped_transformation_wood.json b/src/generated/resources/assets/twilightforest/models/block/stripped_transformation_wood.json new file mode 100644 index 0000000000..6ed6f1b6c3 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/stripped_transformation_wood.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "twilightforest:block/stripped_transformation_log", + "side": "twilightforest:block/stripped_transformation_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/stripped_transformation_wood_horizontal.json b/src/generated/resources/assets/twilightforest/models/block/stripped_transformation_wood_horizontal.json new file mode 100644 index 0000000000..f2c0ea67a9 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/stripped_transformation_wood_horizontal.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column_horizontal", + "textures": { + "end": "twilightforest:block/stripped_transformation_log", + "side": "twilightforest:block/stripped_transformation_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/stripped_twilight_oak_log.json b/src/generated/resources/assets/twilightforest/models/block/stripped_twilight_oak_log.json new file mode 100644 index 0000000000..43c292d795 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/stripped_twilight_oak_log.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "twilightforest:block/stripped_twilight_oak_log_top", + "side": "twilightforest:block/stripped_twilight_oak_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/stripped_twilight_oak_log_horizontal.json b/src/generated/resources/assets/twilightforest/models/block/stripped_twilight_oak_log_horizontal.json new file mode 100644 index 0000000000..d6ed59905e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/stripped_twilight_oak_log_horizontal.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column_horizontal", + "textures": { + "end": "twilightforest:block/stripped_twilight_oak_log_top", + "side": "twilightforest:block/stripped_twilight_oak_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/stripped_twilight_oak_wood.json b/src/generated/resources/assets/twilightforest/models/block/stripped_twilight_oak_wood.json new file mode 100644 index 0000000000..bd3e822a4a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/stripped_twilight_oak_wood.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "twilightforest:block/stripped_twilight_oak_log", + "side": "twilightforest:block/stripped_twilight_oak_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/stripped_twilight_oak_wood_horizontal.json b/src/generated/resources/assets/twilightforest/models/block/stripped_twilight_oak_wood_horizontal.json new file mode 100644 index 0000000000..6c3efa2bb8 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/stripped_twilight_oak_wood_horizontal.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column_horizontal", + "textures": { + "end": "twilightforest:block/stripped_twilight_oak_log", + "side": "twilightforest:block/stripped_twilight_oak_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/stronghold_shield.json b/src/generated/resources/assets/twilightforest/models/block/stronghold_shield.json new file mode 100644 index 0000000000..34835577a4 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/stronghold_shield.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_top", + "textures": { + "side": "twilightforest:block/shield_outside", + "top": "twilightforest:block/shield_inside" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/thick_castle_brick.json b/src/generated/resources/assets/twilightforest/models/block/thick_castle_brick.json new file mode 100644 index 0000000000..8e8e1f91d6 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/thick_castle_brick.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "twilightforest:block/thick_castle_brick" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/thorn_leaves.json b/src/generated/resources/assets/twilightforest/models/block/thorn_leaves.json new file mode 100644 index 0000000000..a54fc8a7a4 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/thorn_leaves.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/oak_leaves" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/thorn_rose.json b/src/generated/resources/assets/twilightforest/models/block/thorn_rose.json new file mode 100644 index 0000000000..fee1a80b90 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/thorn_rose.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cross", + "render_type": "minecraft:cutout", + "textures": { + "cross": "twilightforest:block/thorn_rose" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/time_chest.json b/src/generated/resources/assets/twilightforest/models/block/time_chest.json new file mode 100644 index 0000000000..11ee7d09c6 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/time_chest.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:builtin/entity", + "textures": { + "particle": "twilightforest:block/wood/planks_time_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/time_leaves.json b/src/generated/resources/assets/twilightforest/models/block/time_leaves.json new file mode 100644 index 0000000000..285bf0cf5e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/time_leaves.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/leaves", + "textures": { + "all": "twilightforest:block/time_leaves" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/time_log.json b/src/generated/resources/assets/twilightforest/models/block/time_log.json new file mode 100644 index 0000000000..65153404b7 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/time_log.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "twilightforest:block/time_log_top", + "side": "twilightforest:block/time_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/time_log_core.json b/src/generated/resources/assets/twilightforest/models/block/time_log_core.json new file mode 100644 index 0000000000..20ae09c07b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/time_log_core.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "twilightforest:block/time_log_top", + "side": "twilightforest:block/time_log_core" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/time_log_core_on.json b/src/generated/resources/assets/twilightforest/models/block/time_log_core_on.json new file mode 100644 index 0000000000..0c1a8b7569 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/time_log_core_on.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "twilightforest:block/time_log_top", + "side": "twilightforest:block/time_log_core_on" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/time_log_horizontal.json b/src/generated/resources/assets/twilightforest/models/block/time_log_horizontal.json new file mode 100644 index 0000000000..5e2c01fc56 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/time_log_horizontal.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column_horizontal", + "textures": { + "end": "twilightforest:block/time_log_top", + "side": "twilightforest:block/time_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/time_sapling.json b/src/generated/resources/assets/twilightforest/models/block/time_sapling.json new file mode 100644 index 0000000000..fc0dd24b5c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/time_sapling.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cross", + "render_type": "minecraft:cutout", + "textures": { + "cross": "twilightforest:block/time_sapling" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/time_sign.json b/src/generated/resources/assets/twilightforest/models/block/time_sign.json new file mode 100644 index 0000000000..11ee7d09c6 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/time_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:builtin/entity", + "textures": { + "particle": "twilightforest:block/wood/planks_time_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/time_wall_sign.json b/src/generated/resources/assets/twilightforest/models/block/time_wall_sign.json new file mode 100644 index 0000000000..11ee7d09c6 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/time_wall_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:builtin/entity", + "textures": { + "particle": "twilightforest:block/wood/planks_time_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/time_wood.json b/src/generated/resources/assets/twilightforest/models/block/time_wood.json new file mode 100644 index 0000000000..9f0dd33195 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/time_wood.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "twilightforest:block/time_log", + "side": "twilightforest:block/time_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/time_wood_horizontal.json b/src/generated/resources/assets/twilightforest/models/block/time_wood_horizontal.json new file mode 100644 index 0000000000..b5b02c6667 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/time_wood_horizontal.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column_horizontal", + "textures": { + "end": "twilightforest:block/time_log", + "side": "twilightforest:block/time_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/torchberry_plant.json b/src/generated/resources/assets/twilightforest/models/block/torchberry_plant.json new file mode 100644 index 0000000000..11b385a00e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/torchberry_plant.json @@ -0,0 +1,199 @@ +{ + "ambientocclusion": false, + "elements": [ + { + "faces": { + "north": { + "texture": "#cross", + "uv": [ + 0.0, + 0.0, + 16.0, + 16.0 + ] + }, + "south": { + "texture": "#cross", + "uv": [ + 0.0, + 0.0, + 16.0, + 16.0 + ] + } + }, + "from": [ + 0.8, + 0, + 8 + ], + "rotation": { + "angle": 45.0, + "axis": "y", + "origin": [ + 8, + 8, + 8 + ], + "rescale": true + }, + "shade": false, + "to": [ + 15.2, + 16, + 8 + ] + }, + { + "faces": { + "east": { + "texture": "#cross", + "uv": [ + 0.0, + 0.0, + 16.0, + 16.0 + ] + }, + "west": { + "texture": "#cross", + "uv": [ + 0.0, + 0.0, + 16.0, + 16.0 + ] + } + }, + "from": [ + 8, + 0, + 0.8 + ], + "rotation": { + "angle": 45.0, + "axis": "y", + "origin": [ + 8, + 8, + 8 + ], + "rescale": true + }, + "shade": false, + "to": [ + 8, + 16, + 15.2 + ] + }, + { + "faces": { + "north": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#cross2", + "uv": [ + 0.0, + 0.0, + 16.0, + 16.0 + ] + }, + "south": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#cross2", + "uv": [ + 0.0, + 0.0, + 16.0, + 16.0 + ] + } + }, + "from": [ + 0.8, + 0, + 8 + ], + "rotation": { + "angle": 45.0, + "axis": "y", + "origin": [ + 8, + 8, + 8 + ], + "rescale": true + }, + "shade": false, + "to": [ + 15.2, + 16, + 8 + ] + }, + { + "faces": { + "east": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#cross2", + "uv": [ + 0.0, + 0.0, + 16.0, + 16.0 + ] + }, + "west": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#cross2", + "uv": [ + 0.0, + 0.0, + 16.0, + 16.0 + ] + } + }, + "from": [ + 8, + 0, + 0.8 + ], + "rotation": { + "angle": 45.0, + "axis": "y", + "origin": [ + 8, + 8, + 8 + ], + "rescale": true + }, + "shade": false, + "to": [ + 8, + 16, + 15.2 + ] + } + ], + "render_type": "minecraft:cutout", + "textures": { + "cross": "twilightforest:block/torchberry_plant", + "cross2": "twilightforest:block/torchberry_plant_glow", + "particle": "#cross" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/torchberry_plant_no_berries.json b/src/generated/resources/assets/twilightforest/models/block/torchberry_plant_no_berries.json new file mode 100644 index 0000000000..46d4bb57e1 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/torchberry_plant_no_berries.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cross", + "render_type": "minecraft:cutout", + "textures": { + "cross": "twilightforest:block/torchberry_plant" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/towerwood.json b/src/generated/resources/assets/twilightforest/models/block/towerwood.json new file mode 100644 index 0000000000..2b609cd313 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/towerwood.json @@ -0,0 +1,60 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "texture": "#down", + "tintindex": 0 + }, + "east": { + "cullface": "east", + "texture": "#east", + "tintindex": 0 + }, + "north": { + "cullface": "north", + "texture": "#north", + "tintindex": 0 + }, + "south": { + "cullface": "south", + "texture": "#south", + "tintindex": 0 + }, + "up": { + "cullface": "up", + "texture": "#up", + "tintindex": 0 + }, + "west": { + "cullface": "west", + "texture": "#west", + "tintindex": 0 + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + } + ], + "render_type": "minecraft:solid", + "textures": { + "all": "twilightforest:block/towerwood", + "down": "#all", + "east": "#all", + "north": "#all", + "particle": "#north", + "south": "#all", + "up": "#all", + "west": "#all" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/towerwood_flipped.json b/src/generated/resources/assets/twilightforest/models/block/towerwood_flipped.json new file mode 100644 index 0000000000..037cb1879a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/towerwood_flipped.json @@ -0,0 +1,89 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "texture": "#all", + "tintindex": 0, + "uv": [ + 0.0, + 16.0, + 16.0, + 0.0 + ] + }, + "east": { + "cullface": "east", + "texture": "#all", + "tintindex": 0, + "uv": [ + 0.0, + 16.0, + 16.0, + 0.0 + ] + }, + "north": { + "cullface": "north", + "texture": "#all", + "tintindex": 0, + "uv": [ + 0.0, + 16.0, + 16.0, + 0.0 + ] + }, + "south": { + "cullface": "south", + "texture": "#all", + "tintindex": 0, + "uv": [ + 0.0, + 16.0, + 16.0, + 0.0 + ] + }, + "up": { + "cullface": "up", + "texture": "#all", + "tintindex": 0, + "uv": [ + 0.0, + 16.0, + 16.0, + 0.0 + ] + }, + "west": { + "cullface": "west", + "texture": "#all", + "tintindex": 0, + "uv": [ + 0.0, + 16.0, + 16.0, + 0.0 + ] + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + } + ], + "textures": { + "all": "twilightforest:block/towerwood", + "particle": "#all" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/transformation_chest.json b/src/generated/resources/assets/twilightforest/models/block/transformation_chest.json new file mode 100644 index 0000000000..c5cbcbe750 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/transformation_chest.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:builtin/entity", + "textures": { + "particle": "twilightforest:block/wood/planks_trans_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/transformation_leaves.json b/src/generated/resources/assets/twilightforest/models/block/transformation_leaves.json new file mode 100644 index 0000000000..0f8ddeb0b0 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/transformation_leaves.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/leaves", + "textures": { + "all": "twilightforest:block/transformation_leaves" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/transformation_log.json b/src/generated/resources/assets/twilightforest/models/block/transformation_log.json new file mode 100644 index 0000000000..3527ec1920 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/transformation_log.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "twilightforest:block/transformation_log_top", + "side": "twilightforest:block/transformation_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/transformation_log_core.json b/src/generated/resources/assets/twilightforest/models/block/transformation_log_core.json new file mode 100644 index 0000000000..90546d62e6 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/transformation_log_core.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "twilightforest:block/transformation_log_top", + "side": "twilightforest:block/transformation_log_core" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/transformation_log_core_on.json b/src/generated/resources/assets/twilightforest/models/block/transformation_log_core_on.json new file mode 100644 index 0000000000..8483eb6ddc --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/transformation_log_core_on.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "twilightforest:block/transformation_log_top", + "side": "twilightforest:block/transformation_log_core_on" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/transformation_log_horizontal.json b/src/generated/resources/assets/twilightforest/models/block/transformation_log_horizontal.json new file mode 100644 index 0000000000..424d673add --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/transformation_log_horizontal.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column_horizontal", + "textures": { + "end": "twilightforest:block/transformation_log_top", + "side": "twilightforest:block/transformation_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/transformation_sapling.json b/src/generated/resources/assets/twilightforest/models/block/transformation_sapling.json new file mode 100644 index 0000000000..d1f5846d81 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/transformation_sapling.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cross", + "render_type": "minecraft:cutout", + "textures": { + "cross": "twilightforest:block/transformation_sapling" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/transformation_sign.json b/src/generated/resources/assets/twilightforest/models/block/transformation_sign.json new file mode 100644 index 0000000000..c5cbcbe750 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/transformation_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:builtin/entity", + "textures": { + "particle": "twilightforest:block/wood/planks_trans_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/transformation_wall_sign.json b/src/generated/resources/assets/twilightforest/models/block/transformation_wall_sign.json new file mode 100644 index 0000000000..c5cbcbe750 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/transformation_wall_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:builtin/entity", + "textures": { + "particle": "twilightforest:block/wood/planks_trans_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/transformation_wood.json b/src/generated/resources/assets/twilightforest/models/block/transformation_wood.json new file mode 100644 index 0000000000..a4c57d7029 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/transformation_wood.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "twilightforest:block/transformation_log", + "side": "twilightforest:block/transformation_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/transformation_wood_horizontal.json b/src/generated/resources/assets/twilightforest/models/block/transformation_wood_horizontal.json new file mode 100644 index 0000000000..5b62a84e57 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/transformation_wood_horizontal.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column_horizontal", + "textures": { + "end": "twilightforest:block/transformation_log", + "side": "twilightforest:block/transformation_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/trollber.json b/src/generated/resources/assets/twilightforest/models/block/trollber.json new file mode 100644 index 0000000000..21f2f881d6 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/trollber.json @@ -0,0 +1,215 @@ +{ + "ambientocclusion": false, + "elements": [ + { + "faces": { + "north": { + "forge_data": { + "block_light": 1, + "sky_light": 1 + }, + "texture": "#cross", + "uv": [ + 0.0, + 0.0, + 16.0, + 16.0 + ] + }, + "south": { + "forge_data": { + "block_light": 1, + "sky_light": 1 + }, + "texture": "#cross", + "uv": [ + 0.0, + 0.0, + 16.0, + 16.0 + ] + } + }, + "from": [ + 0.8, + 0, + 8 + ], + "rotation": { + "angle": 45.0, + "axis": "y", + "origin": [ + 8, + 8, + 8 + ], + "rescale": true + }, + "shade": false, + "to": [ + 15.2, + 16, + 8 + ] + }, + { + "faces": { + "east": { + "forge_data": { + "block_light": 1, + "sky_light": 1 + }, + "texture": "#cross", + "uv": [ + 0.0, + 0.0, + 16.0, + 16.0 + ] + }, + "west": { + "forge_data": { + "block_light": 1, + "sky_light": 1 + }, + "texture": "#cross", + "uv": [ + 0.0, + 0.0, + 16.0, + 16.0 + ] + } + }, + "from": [ + 8, + 0, + 0.8 + ], + "rotation": { + "angle": 45.0, + "axis": "y", + "origin": [ + 8, + 8, + 8 + ], + "rescale": true + }, + "shade": false, + "to": [ + 8, + 16, + 15.2 + ] + }, + { + "faces": { + "north": { + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#cross2", + "uv": [ + 0.0, + 0.0, + 16.0, + 16.0 + ] + }, + "south": { + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#cross2", + "uv": [ + 0.0, + 0.0, + 16.0, + 16.0 + ] + } + }, + "from": [ + 0.8, + 0, + 8 + ], + "rotation": { + "angle": 45.0, + "axis": "y", + "origin": [ + 8, + 8, + 8 + ], + "rescale": true + }, + "shade": false, + "to": [ + 15.2, + 16, + 8 + ] + }, + { + "faces": { + "east": { + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#cross2", + "uv": [ + 0.0, + 0.0, + 16.0, + 16.0 + ] + }, + "west": { + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#cross2", + "uv": [ + 0.0, + 0.0, + 16.0, + 16.0 + ] + } + }, + "from": [ + 8, + 0, + 0.8 + ], + "rotation": { + "angle": 45.0, + "axis": "y", + "origin": [ + 8, + 8, + 8 + ], + "rescale": true + }, + "shade": false, + "to": [ + 8, + 16, + 15.2 + ] + } + ], + "render_type": "minecraft:cutout", + "textures": { + "cross": "twilightforest:block/trollber", + "cross2": "twilightforest:block/trollber_glow", + "particle": "#cross" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/trollsteinn_inside.json b/src/generated/resources/assets/twilightforest/models/block/trollsteinn_inside.json new file mode 100644 index 0000000000..04845b224d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/trollsteinn_inside.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_single_face", + "textures": { + "texture": "twilightforest:block/trollsteinn" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/trollsteinn_outside.json b/src/generated/resources/assets/twilightforest/models/block/trollsteinn_outside.json new file mode 100644 index 0000000000..7038f3c987 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/trollsteinn_outside.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_single_face", + "textures": { + "texture": "twilightforest:block/trollsteinn_light" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/trollvidr.json b/src/generated/resources/assets/twilightforest/models/block/trollvidr.json new file mode 100644 index 0000000000..c26456ae41 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/trollvidr.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cross", + "render_type": "minecraft:cutout", + "textures": { + "cross": "twilightforest:block/trollvidr" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/trophy_pedestal.json b/src/generated/resources/assets/twilightforest/models/block/trophy_pedestal.json new file mode 100644 index 0000000000..0d9a6b5492 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/trophy_pedestal.json @@ -0,0 +1,222 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "east": { + "texture": "#east" + }, + "north": { + "texture": "#north" + }, + "south": { + "texture": "#south" + }, + "west": { + "texture": "#west" + } + }, + "from": [ + 2, + 3, + 2 + ], + "to": [ + 14, + 13, + 14 + ] + }, + { + "faces": { + "down": { + "cullface": "down", + "texture": "#end" + }, + "east": { + "texture": "#east" + }, + "north": { + "texture": "#north" + }, + "south": { + "texture": "#south" + }, + "up": { + "texture": "#end" + }, + "west": { + "texture": "#west" + } + }, + "from": [ + 1, + 0, + 1 + ], + "to": [ + 15, + 3, + 15 + ] + }, + { + "faces": { + "down": { + "texture": "#end" + }, + "east": { + "texture": "#east" + }, + "north": { + "texture": "#north" + }, + "south": { + "texture": "#south" + }, + "up": { + "cullface": "up", + "texture": "#end" + }, + "west": { + "texture": "#west" + } + }, + "from": [ + 1, + 13, + 1 + ], + "to": [ + 15, + 16, + 15 + ] + }, + { + "faces": { + "down": { + "texture": "#end" + }, + "east": { + "texture": "#east" + }, + "north": { + "texture": "#north" + }, + "south": { + "texture": "#south" + }, + "west": { + "texture": "#west" + } + }, + "from": [ + 1, + 12, + 1 + ], + "to": [ + 4, + 13, + 4 + ] + }, + { + "faces": { + "down": { + "texture": "#end" + }, + "east": { + "texture": "#east" + }, + "north": { + "texture": "#north" + }, + "south": { + "texture": "#south" + }, + "west": { + "texture": "#west" + } + }, + "from": [ + 12, + 12, + 1 + ], + "to": [ + 15, + 13, + 4 + ] + }, + { + "faces": { + "down": { + "texture": "#end" + }, + "east": { + "texture": "#east" + }, + "north": { + "texture": "#north" + }, + "south": { + "texture": "#south" + }, + "west": { + "texture": "#west" + } + }, + "from": [ + 1, + 12, + 12 + ], + "to": [ + 4, + 13, + 15 + ] + }, + { + "faces": { + "down": { + "texture": "#end" + }, + "east": { + "texture": "#east" + }, + "north": { + "texture": "#north" + }, + "south": { + "texture": "#south" + }, + "west": { + "texture": "#west" + } + }, + "from": [ + 12, + 12, + 12 + ], + "to": [ + 15, + 13, + 15 + ] + } + ], + "render_type": "minecraft:translucent", + "textures": { + "east": "twilightforest:block/pedestal/ur-ghast_latent", + "end": "twilightforest:block/pedestal/top", + "north": "twilightforest:block/pedestal/naga_latent", + "particle": "#end", + "south": "twilightforest:block/pedestal/lich_latent", + "west": "twilightforest:block/pedestal/hydra_latent" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/trophy_pedestal_1.json b/src/generated/resources/assets/twilightforest/models/block/trophy_pedestal_1.json new file mode 100644 index 0000000000..50df4f0ab7 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/trophy_pedestal_1.json @@ -0,0 +1,222 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "east": { + "texture": "#east" + }, + "north": { + "texture": "#north" + }, + "south": { + "texture": "#south" + }, + "west": { + "texture": "#west" + } + }, + "from": [ + 2, + 3, + 2 + ], + "to": [ + 14, + 13, + 14 + ] + }, + { + "faces": { + "down": { + "cullface": "down", + "texture": "#end" + }, + "east": { + "texture": "#east" + }, + "north": { + "texture": "#north" + }, + "south": { + "texture": "#south" + }, + "up": { + "texture": "#end" + }, + "west": { + "texture": "#west" + } + }, + "from": [ + 1, + 0, + 1 + ], + "to": [ + 15, + 3, + 15 + ] + }, + { + "faces": { + "down": { + "texture": "#end" + }, + "east": { + "texture": "#east" + }, + "north": { + "texture": "#north" + }, + "south": { + "texture": "#south" + }, + "up": { + "cullface": "up", + "texture": "#end" + }, + "west": { + "texture": "#west" + } + }, + "from": [ + 1, + 13, + 1 + ], + "to": [ + 15, + 16, + 15 + ] + }, + { + "faces": { + "down": { + "texture": "#end" + }, + "east": { + "texture": "#east" + }, + "north": { + "texture": "#north" + }, + "south": { + "texture": "#south" + }, + "west": { + "texture": "#west" + } + }, + "from": [ + 1, + 12, + 1 + ], + "to": [ + 4, + 13, + 4 + ] + }, + { + "faces": { + "down": { + "texture": "#end" + }, + "east": { + "texture": "#east" + }, + "north": { + "texture": "#north" + }, + "south": { + "texture": "#south" + }, + "west": { + "texture": "#west" + } + }, + "from": [ + 12, + 12, + 1 + ], + "to": [ + 15, + 13, + 4 + ] + }, + { + "faces": { + "down": { + "texture": "#end" + }, + "east": { + "texture": "#east" + }, + "north": { + "texture": "#north" + }, + "south": { + "texture": "#south" + }, + "west": { + "texture": "#west" + } + }, + "from": [ + 1, + 12, + 12 + ], + "to": [ + 4, + 13, + 15 + ] + }, + { + "faces": { + "down": { + "texture": "#end" + }, + "east": { + "texture": "#east" + }, + "north": { + "texture": "#north" + }, + "south": { + "texture": "#south" + }, + "west": { + "texture": "#west" + } + }, + "from": [ + 12, + 12, + 12 + ], + "to": [ + 15, + 13, + 15 + ] + } + ], + "render_type": "minecraft:translucent", + "textures": { + "east": "twilightforest:block/pedestal/hydra_latent", + "end": "twilightforest:block/pedestal/top", + "north": "twilightforest:block/pedestal/snow_queen_latent", + "particle": "#end", + "south": "twilightforest:block/pedestal/naga_latent", + "west": "twilightforest:block/pedestal/lich_latent" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/trophy_pedestal_2.json b/src/generated/resources/assets/twilightforest/models/block/trophy_pedestal_2.json new file mode 100644 index 0000000000..815b793633 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/trophy_pedestal_2.json @@ -0,0 +1,222 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "east": { + "texture": "#east" + }, + "north": { + "texture": "#north" + }, + "south": { + "texture": "#south" + }, + "west": { + "texture": "#west" + } + }, + "from": [ + 2, + 3, + 2 + ], + "to": [ + 14, + 13, + 14 + ] + }, + { + "faces": { + "down": { + "cullface": "down", + "texture": "#end" + }, + "east": { + "texture": "#east" + }, + "north": { + "texture": "#north" + }, + "south": { + "texture": "#south" + }, + "up": { + "texture": "#end" + }, + "west": { + "texture": "#west" + } + }, + "from": [ + 1, + 0, + 1 + ], + "to": [ + 15, + 3, + 15 + ] + }, + { + "faces": { + "down": { + "texture": "#end" + }, + "east": { + "texture": "#east" + }, + "north": { + "texture": "#north" + }, + "south": { + "texture": "#south" + }, + "up": { + "cullface": "up", + "texture": "#end" + }, + "west": { + "texture": "#west" + } + }, + "from": [ + 1, + 13, + 1 + ], + "to": [ + 15, + 16, + 15 + ] + }, + { + "faces": { + "down": { + "texture": "#end" + }, + "east": { + "texture": "#east" + }, + "north": { + "texture": "#north" + }, + "south": { + "texture": "#south" + }, + "west": { + "texture": "#west" + } + }, + "from": [ + 1, + 12, + 1 + ], + "to": [ + 4, + 13, + 4 + ] + }, + { + "faces": { + "down": { + "texture": "#end" + }, + "east": { + "texture": "#east" + }, + "north": { + "texture": "#north" + }, + "south": { + "texture": "#south" + }, + "west": { + "texture": "#west" + } + }, + "from": [ + 12, + 12, + 1 + ], + "to": [ + 15, + 13, + 4 + ] + }, + { + "faces": { + "down": { + "texture": "#end" + }, + "east": { + "texture": "#east" + }, + "north": { + "texture": "#north" + }, + "south": { + "texture": "#south" + }, + "west": { + "texture": "#west" + } + }, + "from": [ + 1, + 12, + 12 + ], + "to": [ + 4, + 13, + 15 + ] + }, + { + "faces": { + "down": { + "texture": "#end" + }, + "east": { + "texture": "#east" + }, + "north": { + "texture": "#north" + }, + "south": { + "texture": "#south" + }, + "west": { + "texture": "#west" + } + }, + "from": [ + 12, + 12, + 12 + ], + "to": [ + 15, + 13, + 15 + ] + } + ], + "render_type": "minecraft:translucent", + "textures": { + "east": "twilightforest:block/pedestal/lich_latent", + "end": "twilightforest:block/pedestal/top", + "north": "twilightforest:block/pedestal/ur-ghast_latent", + "particle": "#end", + "south": "twilightforest:block/pedestal/snow_queen_latent", + "west": "twilightforest:block/pedestal/naga_latent" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/trophy_pedestal_3.json b/src/generated/resources/assets/twilightforest/models/block/trophy_pedestal_3.json new file mode 100644 index 0000000000..09e2a57a2b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/trophy_pedestal_3.json @@ -0,0 +1,222 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "east": { + "texture": "#east" + }, + "north": { + "texture": "#north" + }, + "south": { + "texture": "#south" + }, + "west": { + "texture": "#west" + } + }, + "from": [ + 2, + 3, + 2 + ], + "to": [ + 14, + 13, + 14 + ] + }, + { + "faces": { + "down": { + "cullface": "down", + "texture": "#end" + }, + "east": { + "texture": "#east" + }, + "north": { + "texture": "#north" + }, + "south": { + "texture": "#south" + }, + "up": { + "texture": "#end" + }, + "west": { + "texture": "#west" + } + }, + "from": [ + 1, + 0, + 1 + ], + "to": [ + 15, + 3, + 15 + ] + }, + { + "faces": { + "down": { + "texture": "#end" + }, + "east": { + "texture": "#east" + }, + "north": { + "texture": "#north" + }, + "south": { + "texture": "#south" + }, + "up": { + "cullface": "up", + "texture": "#end" + }, + "west": { + "texture": "#west" + } + }, + "from": [ + 1, + 13, + 1 + ], + "to": [ + 15, + 16, + 15 + ] + }, + { + "faces": { + "down": { + "texture": "#end" + }, + "east": { + "texture": "#east" + }, + "north": { + "texture": "#north" + }, + "south": { + "texture": "#south" + }, + "west": { + "texture": "#west" + } + }, + "from": [ + 1, + 12, + 1 + ], + "to": [ + 4, + 13, + 4 + ] + }, + { + "faces": { + "down": { + "texture": "#end" + }, + "east": { + "texture": "#east" + }, + "north": { + "texture": "#north" + }, + "south": { + "texture": "#south" + }, + "west": { + "texture": "#west" + } + }, + "from": [ + 12, + 12, + 1 + ], + "to": [ + 15, + 13, + 4 + ] + }, + { + "faces": { + "down": { + "texture": "#end" + }, + "east": { + "texture": "#east" + }, + "north": { + "texture": "#north" + }, + "south": { + "texture": "#south" + }, + "west": { + "texture": "#west" + } + }, + "from": [ + 1, + 12, + 12 + ], + "to": [ + 4, + 13, + 15 + ] + }, + { + "faces": { + "down": { + "texture": "#end" + }, + "east": { + "texture": "#east" + }, + "north": { + "texture": "#north" + }, + "south": { + "texture": "#south" + }, + "west": { + "texture": "#west" + } + }, + "from": [ + 12, + 12, + 12 + ], + "to": [ + 15, + 13, + 15 + ] + } + ], + "render_type": "minecraft:translucent", + "textures": { + "east": "twilightforest:block/pedestal/naga_latent", + "end": "twilightforest:block/pedestal/top", + "north": "twilightforest:block/pedestal/hydra_latent", + "particle": "#end", + "south": "twilightforest:block/pedestal/ur-ghast_latent", + "west": "twilightforest:block/pedestal/snow_queen_latent" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/trophy_pedestal_4.json b/src/generated/resources/assets/twilightforest/models/block/trophy_pedestal_4.json new file mode 100644 index 0000000000..8334459b50 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/trophy_pedestal_4.json @@ -0,0 +1,222 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "east": { + "texture": "#east" + }, + "north": { + "texture": "#north" + }, + "south": { + "texture": "#south" + }, + "west": { + "texture": "#west" + } + }, + "from": [ + 2, + 3, + 2 + ], + "to": [ + 14, + 13, + 14 + ] + }, + { + "faces": { + "down": { + "cullface": "down", + "texture": "#end" + }, + "east": { + "texture": "#east" + }, + "north": { + "texture": "#north" + }, + "south": { + "texture": "#south" + }, + "up": { + "texture": "#end" + }, + "west": { + "texture": "#west" + } + }, + "from": [ + 1, + 0, + 1 + ], + "to": [ + 15, + 3, + 15 + ] + }, + { + "faces": { + "down": { + "texture": "#end" + }, + "east": { + "texture": "#east" + }, + "north": { + "texture": "#north" + }, + "south": { + "texture": "#south" + }, + "up": { + "cullface": "up", + "texture": "#end" + }, + "west": { + "texture": "#west" + } + }, + "from": [ + 1, + 13, + 1 + ], + "to": [ + 15, + 16, + 15 + ] + }, + { + "faces": { + "down": { + "texture": "#end" + }, + "east": { + "texture": "#east" + }, + "north": { + "texture": "#north" + }, + "south": { + "texture": "#south" + }, + "west": { + "texture": "#west" + } + }, + "from": [ + 1, + 12, + 1 + ], + "to": [ + 4, + 13, + 4 + ] + }, + { + "faces": { + "down": { + "texture": "#end" + }, + "east": { + "texture": "#east" + }, + "north": { + "texture": "#north" + }, + "south": { + "texture": "#south" + }, + "west": { + "texture": "#west" + } + }, + "from": [ + 12, + 12, + 1 + ], + "to": [ + 15, + 13, + 4 + ] + }, + { + "faces": { + "down": { + "texture": "#end" + }, + "east": { + "texture": "#east" + }, + "north": { + "texture": "#north" + }, + "south": { + "texture": "#south" + }, + "west": { + "texture": "#west" + } + }, + "from": [ + 1, + 12, + 12 + ], + "to": [ + 4, + 13, + 15 + ] + }, + { + "faces": { + "down": { + "texture": "#end" + }, + "east": { + "texture": "#east" + }, + "north": { + "texture": "#north" + }, + "south": { + "texture": "#south" + }, + "west": { + "texture": "#west" + } + }, + "from": [ + 12, + 12, + 12 + ], + "to": [ + 15, + 13, + 15 + ] + } + ], + "render_type": "minecraft:translucent", + "textures": { + "east": "twilightforest:block/pedestal/snow_queen_latent", + "end": "twilightforest:block/pedestal/top", + "north": "twilightforest:block/pedestal/lich_latent", + "particle": "#end", + "south": "twilightforest:block/pedestal/hydra_latent", + "west": "twilightforest:block/pedestal/ur-ghast_latent" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/trophy_pedestal_active.json b/src/generated/resources/assets/twilightforest/models/block/trophy_pedestal_active.json new file mode 100644 index 0000000000..ca9e1e3f94 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/trophy_pedestal_active.json @@ -0,0 +1,513 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "east": { + "texture": "#east" + }, + "north": { + "texture": "#north" + }, + "south": { + "texture": "#south" + }, + "west": { + "texture": "#west" + } + }, + "from": [ + 2, + 3, + 2 + ], + "to": [ + 14, + 13, + 14 + ] + }, + { + "faces": { + "down": { + "cullface": "down", + "texture": "#end" + }, + "east": { + "texture": "#east" + }, + "north": { + "texture": "#north" + }, + "south": { + "texture": "#south" + }, + "up": { + "texture": "#end" + }, + "west": { + "texture": "#west" + } + }, + "from": [ + 1, + 0, + 1 + ], + "to": [ + 15, + 3, + 15 + ] + }, + { + "faces": { + "down": { + "texture": "#end" + }, + "east": { + "texture": "#east" + }, + "north": { + "texture": "#north" + }, + "south": { + "texture": "#south" + }, + "up": { + "cullface": "up", + "texture": "#end" + }, + "west": { + "texture": "#west" + } + }, + "from": [ + 1, + 13, + 1 + ], + "to": [ + 15, + 16, + 15 + ] + }, + { + "faces": { + "down": { + "texture": "#end" + }, + "east": { + "texture": "#east" + }, + "north": { + "texture": "#north" + }, + "south": { + "texture": "#south" + }, + "west": { + "texture": "#west" + } + }, + "from": [ + 1, + 12, + 1 + ], + "to": [ + 4, + 13, + 4 + ] + }, + { + "faces": { + "down": { + "texture": "#end" + }, + "east": { + "texture": "#east" + }, + "north": { + "texture": "#north" + }, + "south": { + "texture": "#south" + }, + "west": { + "texture": "#west" + } + }, + "from": [ + 12, + 12, + 1 + ], + "to": [ + 15, + 13, + 4 + ] + }, + { + "faces": { + "down": { + "texture": "#end" + }, + "east": { + "texture": "#east" + }, + "north": { + "texture": "#north" + }, + "south": { + "texture": "#south" + }, + "west": { + "texture": "#west" + } + }, + "from": [ + 1, + 12, + 12 + ], + "to": [ + 4, + 13, + 15 + ] + }, + { + "faces": { + "down": { + "texture": "#end" + }, + "east": { + "texture": "#east" + }, + "north": { + "texture": "#north" + }, + "south": { + "texture": "#south" + }, + "west": { + "texture": "#west" + } + }, + "from": [ + 12, + 12, + 12 + ], + "to": [ + 15, + 13, + 15 + ] + }, + { + "faces": { + "east": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#east2" + }, + "north": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#north2" + }, + "south": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#south2" + }, + "west": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#west2" + } + }, + "from": [ + 2, + 3, + 2 + ], + "to": [ + 14, + 13, + 14 + ] + }, + { + "faces": { + "down": { + "cullface": "down", + "forge_data": { + "block_light": 12, + "sky_light": 12 + }, + "texture": "#end2" + }, + "up": { + "cullface": "up", + "forge_data": { + "block_light": 12, + "sky_light": 12 + }, + "texture": "#end2" + } + }, + "from": [ + 1, + 0, + 1 + ], + "to": [ + 15, + 16, + 15 + ] + }, + { + "faces": { + "east": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#east2" + }, + "north": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#north2" + }, + "south": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#south2" + }, + "west": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#west2" + } + }, + "from": [ + 1, + 12, + 1 + ], + "to": [ + 4, + 13, + 4 + ] + }, + { + "faces": { + "east": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#east2" + }, + "north": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#north2" + }, + "south": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#south2" + }, + "west": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#west2" + } + }, + "from": [ + 12, + 12, + 1 + ], + "to": [ + 15, + 13, + 4 + ] + }, + { + "faces": { + "east": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#east2" + }, + "north": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#north2" + }, + "south": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#south2" + }, + "west": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#west2" + } + }, + "from": [ + 1, + 12, + 12 + ], + "to": [ + 4, + 13, + 15 + ] + }, + { + "faces": { + "east": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#east2" + }, + "north": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#north2" + }, + "south": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#south2" + }, + "west": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#west2" + } + }, + "from": [ + 12, + 12, + 12 + ], + "to": [ + 15, + 13, + 15 + ] + }, + { + "faces": { + "east": { + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#east3" + }, + "north": { + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#north3" + }, + "south": { + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#south3" + }, + "west": { + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#west3" + } + }, + "from": [ + 2, + 3, + 2 + ], + "to": [ + 14, + 13, + 14 + ] + } + ], + "render_type": "minecraft:translucent", + "textures": { + "east": "twilightforest:block/pedestal/ur-ghast_latent", + "east2": "twilightforest:block/pedestal/ur-ghast_glow", + "east3": "twilightforest:block/pedestal/ur-ghast", + "end": "twilightforest:block/pedestal/top", + "end2": "twilightforest:block/pedestal/top_glow", + "north": "twilightforest:block/pedestal/naga_latent", + "north2": "twilightforest:block/pedestal/naga_glow", + "north3": "twilightforest:block/pedestal/naga", + "particle": "#end", + "south": "twilightforest:block/pedestal/lich_latent", + "south2": "twilightforest:block/pedestal/lich_glow", + "south3": "twilightforest:block/pedestal/lich", + "west": "twilightforest:block/pedestal/hydra_latent", + "west2": "twilightforest:block/pedestal/hydra_glow", + "west3": "twilightforest:block/pedestal/hydra" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/trophy_pedestal_active_1.json b/src/generated/resources/assets/twilightforest/models/block/trophy_pedestal_active_1.json new file mode 100644 index 0000000000..1f51621d86 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/trophy_pedestal_active_1.json @@ -0,0 +1,513 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "east": { + "texture": "#east" + }, + "north": { + "texture": "#north" + }, + "south": { + "texture": "#south" + }, + "west": { + "texture": "#west" + } + }, + "from": [ + 2, + 3, + 2 + ], + "to": [ + 14, + 13, + 14 + ] + }, + { + "faces": { + "down": { + "cullface": "down", + "texture": "#end" + }, + "east": { + "texture": "#east" + }, + "north": { + "texture": "#north" + }, + "south": { + "texture": "#south" + }, + "up": { + "texture": "#end" + }, + "west": { + "texture": "#west" + } + }, + "from": [ + 1, + 0, + 1 + ], + "to": [ + 15, + 3, + 15 + ] + }, + { + "faces": { + "down": { + "texture": "#end" + }, + "east": { + "texture": "#east" + }, + "north": { + "texture": "#north" + }, + "south": { + "texture": "#south" + }, + "up": { + "cullface": "up", + "texture": "#end" + }, + "west": { + "texture": "#west" + } + }, + "from": [ + 1, + 13, + 1 + ], + "to": [ + 15, + 16, + 15 + ] + }, + { + "faces": { + "down": { + "texture": "#end" + }, + "east": { + "texture": "#east" + }, + "north": { + "texture": "#north" + }, + "south": { + "texture": "#south" + }, + "west": { + "texture": "#west" + } + }, + "from": [ + 1, + 12, + 1 + ], + "to": [ + 4, + 13, + 4 + ] + }, + { + "faces": { + "down": { + "texture": "#end" + }, + "east": { + "texture": "#east" + }, + "north": { + "texture": "#north" + }, + "south": { + "texture": "#south" + }, + "west": { + "texture": "#west" + } + }, + "from": [ + 12, + 12, + 1 + ], + "to": [ + 15, + 13, + 4 + ] + }, + { + "faces": { + "down": { + "texture": "#end" + }, + "east": { + "texture": "#east" + }, + "north": { + "texture": "#north" + }, + "south": { + "texture": "#south" + }, + "west": { + "texture": "#west" + } + }, + "from": [ + 1, + 12, + 12 + ], + "to": [ + 4, + 13, + 15 + ] + }, + { + "faces": { + "down": { + "texture": "#end" + }, + "east": { + "texture": "#east" + }, + "north": { + "texture": "#north" + }, + "south": { + "texture": "#south" + }, + "west": { + "texture": "#west" + } + }, + "from": [ + 12, + 12, + 12 + ], + "to": [ + 15, + 13, + 15 + ] + }, + { + "faces": { + "east": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#east2" + }, + "north": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#north2" + }, + "south": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#south2" + }, + "west": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#west2" + } + }, + "from": [ + 2, + 3, + 2 + ], + "to": [ + 14, + 13, + 14 + ] + }, + { + "faces": { + "down": { + "cullface": "down", + "forge_data": { + "block_light": 12, + "sky_light": 12 + }, + "texture": "#end2" + }, + "up": { + "cullface": "up", + "forge_data": { + "block_light": 12, + "sky_light": 12 + }, + "texture": "#end2" + } + }, + "from": [ + 1, + 0, + 1 + ], + "to": [ + 15, + 16, + 15 + ] + }, + { + "faces": { + "east": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#east2" + }, + "north": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#north2" + }, + "south": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#south2" + }, + "west": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#west2" + } + }, + "from": [ + 1, + 12, + 1 + ], + "to": [ + 4, + 13, + 4 + ] + }, + { + "faces": { + "east": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#east2" + }, + "north": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#north2" + }, + "south": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#south2" + }, + "west": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#west2" + } + }, + "from": [ + 12, + 12, + 1 + ], + "to": [ + 15, + 13, + 4 + ] + }, + { + "faces": { + "east": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#east2" + }, + "north": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#north2" + }, + "south": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#south2" + }, + "west": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#west2" + } + }, + "from": [ + 1, + 12, + 12 + ], + "to": [ + 4, + 13, + 15 + ] + }, + { + "faces": { + "east": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#east2" + }, + "north": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#north2" + }, + "south": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#south2" + }, + "west": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#west2" + } + }, + "from": [ + 12, + 12, + 12 + ], + "to": [ + 15, + 13, + 15 + ] + }, + { + "faces": { + "east": { + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#east3" + }, + "north": { + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#north3" + }, + "south": { + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#south3" + }, + "west": { + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#west3" + } + }, + "from": [ + 2, + 3, + 2 + ], + "to": [ + 14, + 13, + 14 + ] + } + ], + "render_type": "minecraft:translucent", + "textures": { + "east": "twilightforest:block/pedestal/hydra_latent", + "east2": "twilightforest:block/pedestal/hydra_glow", + "east3": "twilightforest:block/pedestal/hydra", + "end": "twilightforest:block/pedestal/top", + "end2": "twilightforest:block/pedestal/top_glow", + "north": "twilightforest:block/pedestal/snow_queen_latent", + "north2": "twilightforest:block/pedestal/snow_queen_glow", + "north3": "twilightforest:block/pedestal/snow_queen", + "particle": "#end", + "south": "twilightforest:block/pedestal/naga_latent", + "south2": "twilightforest:block/pedestal/naga_glow", + "south3": "twilightforest:block/pedestal/naga", + "west": "twilightforest:block/pedestal/lich_latent", + "west2": "twilightforest:block/pedestal/lich_glow", + "west3": "twilightforest:block/pedestal/lich" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/trophy_pedestal_active_2.json b/src/generated/resources/assets/twilightforest/models/block/trophy_pedestal_active_2.json new file mode 100644 index 0000000000..698b2c1e4a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/trophy_pedestal_active_2.json @@ -0,0 +1,513 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "east": { + "texture": "#east" + }, + "north": { + "texture": "#north" + }, + "south": { + "texture": "#south" + }, + "west": { + "texture": "#west" + } + }, + "from": [ + 2, + 3, + 2 + ], + "to": [ + 14, + 13, + 14 + ] + }, + { + "faces": { + "down": { + "cullface": "down", + "texture": "#end" + }, + "east": { + "texture": "#east" + }, + "north": { + "texture": "#north" + }, + "south": { + "texture": "#south" + }, + "up": { + "texture": "#end" + }, + "west": { + "texture": "#west" + } + }, + "from": [ + 1, + 0, + 1 + ], + "to": [ + 15, + 3, + 15 + ] + }, + { + "faces": { + "down": { + "texture": "#end" + }, + "east": { + "texture": "#east" + }, + "north": { + "texture": "#north" + }, + "south": { + "texture": "#south" + }, + "up": { + "cullface": "up", + "texture": "#end" + }, + "west": { + "texture": "#west" + } + }, + "from": [ + 1, + 13, + 1 + ], + "to": [ + 15, + 16, + 15 + ] + }, + { + "faces": { + "down": { + "texture": "#end" + }, + "east": { + "texture": "#east" + }, + "north": { + "texture": "#north" + }, + "south": { + "texture": "#south" + }, + "west": { + "texture": "#west" + } + }, + "from": [ + 1, + 12, + 1 + ], + "to": [ + 4, + 13, + 4 + ] + }, + { + "faces": { + "down": { + "texture": "#end" + }, + "east": { + "texture": "#east" + }, + "north": { + "texture": "#north" + }, + "south": { + "texture": "#south" + }, + "west": { + "texture": "#west" + } + }, + "from": [ + 12, + 12, + 1 + ], + "to": [ + 15, + 13, + 4 + ] + }, + { + "faces": { + "down": { + "texture": "#end" + }, + "east": { + "texture": "#east" + }, + "north": { + "texture": "#north" + }, + "south": { + "texture": "#south" + }, + "west": { + "texture": "#west" + } + }, + "from": [ + 1, + 12, + 12 + ], + "to": [ + 4, + 13, + 15 + ] + }, + { + "faces": { + "down": { + "texture": "#end" + }, + "east": { + "texture": "#east" + }, + "north": { + "texture": "#north" + }, + "south": { + "texture": "#south" + }, + "west": { + "texture": "#west" + } + }, + "from": [ + 12, + 12, + 12 + ], + "to": [ + 15, + 13, + 15 + ] + }, + { + "faces": { + "east": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#east2" + }, + "north": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#north2" + }, + "south": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#south2" + }, + "west": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#west2" + } + }, + "from": [ + 2, + 3, + 2 + ], + "to": [ + 14, + 13, + 14 + ] + }, + { + "faces": { + "down": { + "cullface": "down", + "forge_data": { + "block_light": 12, + "sky_light": 12 + }, + "texture": "#end2" + }, + "up": { + "cullface": "up", + "forge_data": { + "block_light": 12, + "sky_light": 12 + }, + "texture": "#end2" + } + }, + "from": [ + 1, + 0, + 1 + ], + "to": [ + 15, + 16, + 15 + ] + }, + { + "faces": { + "east": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#east2" + }, + "north": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#north2" + }, + "south": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#south2" + }, + "west": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#west2" + } + }, + "from": [ + 1, + 12, + 1 + ], + "to": [ + 4, + 13, + 4 + ] + }, + { + "faces": { + "east": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#east2" + }, + "north": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#north2" + }, + "south": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#south2" + }, + "west": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#west2" + } + }, + "from": [ + 12, + 12, + 1 + ], + "to": [ + 15, + 13, + 4 + ] + }, + { + "faces": { + "east": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#east2" + }, + "north": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#north2" + }, + "south": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#south2" + }, + "west": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#west2" + } + }, + "from": [ + 1, + 12, + 12 + ], + "to": [ + 4, + 13, + 15 + ] + }, + { + "faces": { + "east": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#east2" + }, + "north": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#north2" + }, + "south": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#south2" + }, + "west": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#west2" + } + }, + "from": [ + 12, + 12, + 12 + ], + "to": [ + 15, + 13, + 15 + ] + }, + { + "faces": { + "east": { + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#east3" + }, + "north": { + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#north3" + }, + "south": { + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#south3" + }, + "west": { + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#west3" + } + }, + "from": [ + 2, + 3, + 2 + ], + "to": [ + 14, + 13, + 14 + ] + } + ], + "render_type": "minecraft:translucent", + "textures": { + "east": "twilightforest:block/pedestal/lich_latent", + "east2": "twilightforest:block/pedestal/lich_glow", + "east3": "twilightforest:block/pedestal/lich", + "end": "twilightforest:block/pedestal/top", + "end2": "twilightforest:block/pedestal/top_glow", + "north": "twilightforest:block/pedestal/ur-ghast_latent", + "north2": "twilightforest:block/pedestal/ur-ghast_glow", + "north3": "twilightforest:block/pedestal/ur-ghast", + "particle": "#end", + "south": "twilightforest:block/pedestal/snow_queen_latent", + "south2": "twilightforest:block/pedestal/snow_queen_glow", + "south3": "twilightforest:block/pedestal/snow_queen", + "west": "twilightforest:block/pedestal/naga_latent", + "west2": "twilightforest:block/pedestal/naga_glow", + "west3": "twilightforest:block/pedestal/naga" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/trophy_pedestal_active_3.json b/src/generated/resources/assets/twilightforest/models/block/trophy_pedestal_active_3.json new file mode 100644 index 0000000000..d76bd3daf9 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/trophy_pedestal_active_3.json @@ -0,0 +1,513 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "east": { + "texture": "#east" + }, + "north": { + "texture": "#north" + }, + "south": { + "texture": "#south" + }, + "west": { + "texture": "#west" + } + }, + "from": [ + 2, + 3, + 2 + ], + "to": [ + 14, + 13, + 14 + ] + }, + { + "faces": { + "down": { + "cullface": "down", + "texture": "#end" + }, + "east": { + "texture": "#east" + }, + "north": { + "texture": "#north" + }, + "south": { + "texture": "#south" + }, + "up": { + "texture": "#end" + }, + "west": { + "texture": "#west" + } + }, + "from": [ + 1, + 0, + 1 + ], + "to": [ + 15, + 3, + 15 + ] + }, + { + "faces": { + "down": { + "texture": "#end" + }, + "east": { + "texture": "#east" + }, + "north": { + "texture": "#north" + }, + "south": { + "texture": "#south" + }, + "up": { + "cullface": "up", + "texture": "#end" + }, + "west": { + "texture": "#west" + } + }, + "from": [ + 1, + 13, + 1 + ], + "to": [ + 15, + 16, + 15 + ] + }, + { + "faces": { + "down": { + "texture": "#end" + }, + "east": { + "texture": "#east" + }, + "north": { + "texture": "#north" + }, + "south": { + "texture": "#south" + }, + "west": { + "texture": "#west" + } + }, + "from": [ + 1, + 12, + 1 + ], + "to": [ + 4, + 13, + 4 + ] + }, + { + "faces": { + "down": { + "texture": "#end" + }, + "east": { + "texture": "#east" + }, + "north": { + "texture": "#north" + }, + "south": { + "texture": "#south" + }, + "west": { + "texture": "#west" + } + }, + "from": [ + 12, + 12, + 1 + ], + "to": [ + 15, + 13, + 4 + ] + }, + { + "faces": { + "down": { + "texture": "#end" + }, + "east": { + "texture": "#east" + }, + "north": { + "texture": "#north" + }, + "south": { + "texture": "#south" + }, + "west": { + "texture": "#west" + } + }, + "from": [ + 1, + 12, + 12 + ], + "to": [ + 4, + 13, + 15 + ] + }, + { + "faces": { + "down": { + "texture": "#end" + }, + "east": { + "texture": "#east" + }, + "north": { + "texture": "#north" + }, + "south": { + "texture": "#south" + }, + "west": { + "texture": "#west" + } + }, + "from": [ + 12, + 12, + 12 + ], + "to": [ + 15, + 13, + 15 + ] + }, + { + "faces": { + "east": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#east2" + }, + "north": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#north2" + }, + "south": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#south2" + }, + "west": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#west2" + } + }, + "from": [ + 2, + 3, + 2 + ], + "to": [ + 14, + 13, + 14 + ] + }, + { + "faces": { + "down": { + "cullface": "down", + "forge_data": { + "block_light": 12, + "sky_light": 12 + }, + "texture": "#end2" + }, + "up": { + "cullface": "up", + "forge_data": { + "block_light": 12, + "sky_light": 12 + }, + "texture": "#end2" + } + }, + "from": [ + 1, + 0, + 1 + ], + "to": [ + 15, + 16, + 15 + ] + }, + { + "faces": { + "east": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#east2" + }, + "north": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#north2" + }, + "south": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#south2" + }, + "west": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#west2" + } + }, + "from": [ + 1, + 12, + 1 + ], + "to": [ + 4, + 13, + 4 + ] + }, + { + "faces": { + "east": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#east2" + }, + "north": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#north2" + }, + "south": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#south2" + }, + "west": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#west2" + } + }, + "from": [ + 12, + 12, + 1 + ], + "to": [ + 15, + 13, + 4 + ] + }, + { + "faces": { + "east": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#east2" + }, + "north": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#north2" + }, + "south": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#south2" + }, + "west": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#west2" + } + }, + "from": [ + 1, + 12, + 12 + ], + "to": [ + 4, + 13, + 15 + ] + }, + { + "faces": { + "east": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#east2" + }, + "north": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#north2" + }, + "south": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#south2" + }, + "west": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#west2" + } + }, + "from": [ + 12, + 12, + 12 + ], + "to": [ + 15, + 13, + 15 + ] + }, + { + "faces": { + "east": { + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#east3" + }, + "north": { + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#north3" + }, + "south": { + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#south3" + }, + "west": { + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#west3" + } + }, + "from": [ + 2, + 3, + 2 + ], + "to": [ + 14, + 13, + 14 + ] + } + ], + "render_type": "minecraft:translucent", + "textures": { + "east": "twilightforest:block/pedestal/naga_latent", + "east2": "twilightforest:block/pedestal/naga_glow", + "east3": "twilightforest:block/pedestal/naga", + "end": "twilightforest:block/pedestal/top", + "end2": "twilightforest:block/pedestal/top_glow", + "north": "twilightforest:block/pedestal/hydra_latent", + "north2": "twilightforest:block/pedestal/hydra_glow", + "north3": "twilightforest:block/pedestal/hydra", + "particle": "#end", + "south": "twilightforest:block/pedestal/ur-ghast_latent", + "south2": "twilightforest:block/pedestal/ur-ghast_glow", + "south3": "twilightforest:block/pedestal/ur-ghast", + "west": "twilightforest:block/pedestal/snow_queen_latent", + "west2": "twilightforest:block/pedestal/snow_queen_glow", + "west3": "twilightforest:block/pedestal/snow_queen" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/trophy_pedestal_active_4.json b/src/generated/resources/assets/twilightforest/models/block/trophy_pedestal_active_4.json new file mode 100644 index 0000000000..56f317c587 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/trophy_pedestal_active_4.json @@ -0,0 +1,513 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "east": { + "texture": "#east" + }, + "north": { + "texture": "#north" + }, + "south": { + "texture": "#south" + }, + "west": { + "texture": "#west" + } + }, + "from": [ + 2, + 3, + 2 + ], + "to": [ + 14, + 13, + 14 + ] + }, + { + "faces": { + "down": { + "cullface": "down", + "texture": "#end" + }, + "east": { + "texture": "#east" + }, + "north": { + "texture": "#north" + }, + "south": { + "texture": "#south" + }, + "up": { + "texture": "#end" + }, + "west": { + "texture": "#west" + } + }, + "from": [ + 1, + 0, + 1 + ], + "to": [ + 15, + 3, + 15 + ] + }, + { + "faces": { + "down": { + "texture": "#end" + }, + "east": { + "texture": "#east" + }, + "north": { + "texture": "#north" + }, + "south": { + "texture": "#south" + }, + "up": { + "cullface": "up", + "texture": "#end" + }, + "west": { + "texture": "#west" + } + }, + "from": [ + 1, + 13, + 1 + ], + "to": [ + 15, + 16, + 15 + ] + }, + { + "faces": { + "down": { + "texture": "#end" + }, + "east": { + "texture": "#east" + }, + "north": { + "texture": "#north" + }, + "south": { + "texture": "#south" + }, + "west": { + "texture": "#west" + } + }, + "from": [ + 1, + 12, + 1 + ], + "to": [ + 4, + 13, + 4 + ] + }, + { + "faces": { + "down": { + "texture": "#end" + }, + "east": { + "texture": "#east" + }, + "north": { + "texture": "#north" + }, + "south": { + "texture": "#south" + }, + "west": { + "texture": "#west" + } + }, + "from": [ + 12, + 12, + 1 + ], + "to": [ + 15, + 13, + 4 + ] + }, + { + "faces": { + "down": { + "texture": "#end" + }, + "east": { + "texture": "#east" + }, + "north": { + "texture": "#north" + }, + "south": { + "texture": "#south" + }, + "west": { + "texture": "#west" + } + }, + "from": [ + 1, + 12, + 12 + ], + "to": [ + 4, + 13, + 15 + ] + }, + { + "faces": { + "down": { + "texture": "#end" + }, + "east": { + "texture": "#east" + }, + "north": { + "texture": "#north" + }, + "south": { + "texture": "#south" + }, + "west": { + "texture": "#west" + } + }, + "from": [ + 12, + 12, + 12 + ], + "to": [ + 15, + 13, + 15 + ] + }, + { + "faces": { + "east": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#east2" + }, + "north": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#north2" + }, + "south": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#south2" + }, + "west": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#west2" + } + }, + "from": [ + 2, + 3, + 2 + ], + "to": [ + 14, + 13, + 14 + ] + }, + { + "faces": { + "down": { + "cullface": "down", + "forge_data": { + "block_light": 12, + "sky_light": 12 + }, + "texture": "#end2" + }, + "up": { + "cullface": "up", + "forge_data": { + "block_light": 12, + "sky_light": 12 + }, + "texture": "#end2" + } + }, + "from": [ + 1, + 0, + 1 + ], + "to": [ + 15, + 16, + 15 + ] + }, + { + "faces": { + "east": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#east2" + }, + "north": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#north2" + }, + "south": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#south2" + }, + "west": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#west2" + } + }, + "from": [ + 1, + 12, + 1 + ], + "to": [ + 4, + 13, + 4 + ] + }, + { + "faces": { + "east": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#east2" + }, + "north": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#north2" + }, + "south": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#south2" + }, + "west": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#west2" + } + }, + "from": [ + 12, + 12, + 1 + ], + "to": [ + 15, + 13, + 4 + ] + }, + { + "faces": { + "east": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#east2" + }, + "north": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#north2" + }, + "south": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#south2" + }, + "west": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#west2" + } + }, + "from": [ + 1, + 12, + 12 + ], + "to": [ + 4, + 13, + 15 + ] + }, + { + "faces": { + "east": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#east2" + }, + "north": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#north2" + }, + "south": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#south2" + }, + "west": { + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#west2" + } + }, + "from": [ + 12, + 12, + 12 + ], + "to": [ + 15, + 13, + 15 + ] + }, + { + "faces": { + "east": { + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#east3" + }, + "north": { + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#north3" + }, + "south": { + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#south3" + }, + "west": { + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#west3" + } + }, + "from": [ + 2, + 3, + 2 + ], + "to": [ + 14, + 13, + 14 + ] + } + ], + "render_type": "minecraft:translucent", + "textures": { + "east": "twilightforest:block/pedestal/snow_queen_latent", + "east2": "twilightforest:block/pedestal/snow_queen_glow", + "east3": "twilightforest:block/pedestal/snow_queen", + "end": "twilightforest:block/pedestal/top", + "end2": "twilightforest:block/pedestal/top_glow", + "north": "twilightforest:block/pedestal/lich_latent", + "north2": "twilightforest:block/pedestal/lich_glow", + "north3": "twilightforest:block/pedestal/lich", + "particle": "#end", + "south": "twilightforest:block/pedestal/hydra_latent", + "south2": "twilightforest:block/pedestal/hydra_glow", + "south3": "twilightforest:block/pedestal/hydra", + "west": "twilightforest:block/pedestal/ur-ghast_latent", + "west2": "twilightforest:block/pedestal/ur-ghast_glow", + "west3": "twilightforest:block/pedestal/ur-ghast" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/twilight_oak_chest.json b/src/generated/resources/assets/twilightforest/models/block/twilight_oak_chest.json new file mode 100644 index 0000000000..bec2997d0b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/twilight_oak_chest.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:builtin/entity", + "textures": { + "particle": "twilightforest:block/wood/planks_twilight_oak_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/twilight_oak_leaves.json b/src/generated/resources/assets/twilightforest/models/block/twilight_oak_leaves.json new file mode 100644 index 0000000000..192ebd6700 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/twilight_oak_leaves.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/leaves", + "textures": { + "all": "minecraft:block/oak_leaves" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/twilight_oak_log.json b/src/generated/resources/assets/twilightforest/models/block/twilight_oak_log.json new file mode 100644 index 0000000000..bc10bb5229 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/twilight_oak_log.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "twilightforest:block/twilight_oak_log_top", + "side": "twilightforest:block/twilight_oak_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/twilight_oak_log_horizontal.json b/src/generated/resources/assets/twilightforest/models/block/twilight_oak_log_horizontal.json new file mode 100644 index 0000000000..8bae78f7f1 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/twilight_oak_log_horizontal.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column_horizontal", + "textures": { + "end": "twilightforest:block/twilight_oak_log_top", + "side": "twilightforest:block/twilight_oak_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/twilight_oak_sapling.json b/src/generated/resources/assets/twilightforest/models/block/twilight_oak_sapling.json new file mode 100644 index 0000000000..9420fa5a4b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/twilight_oak_sapling.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cross", + "render_type": "minecraft:cutout", + "textures": { + "cross": "twilightforest:block/twilight_oak_sapling" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/twilight_oak_sign.json b/src/generated/resources/assets/twilightforest/models/block/twilight_oak_sign.json new file mode 100644 index 0000000000..bec2997d0b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/twilight_oak_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:builtin/entity", + "textures": { + "particle": "twilightforest:block/wood/planks_twilight_oak_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/twilight_oak_wood.json b/src/generated/resources/assets/twilightforest/models/block/twilight_oak_wood.json new file mode 100644 index 0000000000..d03e345bd6 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/twilight_oak_wood.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "twilightforest:block/twilight_oak_log", + "side": "twilightforest:block/twilight_oak_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/twilight_oak_wood_horizontal.json b/src/generated/resources/assets/twilightforest/models/block/twilight_oak_wood_horizontal.json new file mode 100644 index 0000000000..ff7be7a7fe --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/twilight_oak_wood_horizontal.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column_horizontal", + "textures": { + "end": "twilightforest:block/twilight_oak_log", + "side": "twilightforest:block/twilight_oak_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/twilight_wall_sign.json b/src/generated/resources/assets/twilightforest/models/block/twilight_wall_sign.json new file mode 100644 index 0000000000..bec2997d0b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/twilight_wall_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:builtin/entity", + "textures": { + "particle": "twilightforest:block/wood/planks_twilight_oak_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/twisted_stone.json b/src/generated/resources/assets/twilightforest/models/block/twisted_stone.json new file mode 100644 index 0000000000..55581e4eb2 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/twisted_stone.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "twilightforest:block/stone_twist/twist_end", + "side": "twilightforest:block/stone_twist/twist_side" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/twisted_stone_horizontal.json b/src/generated/resources/assets/twilightforest/models/block/twisted_stone_horizontal.json new file mode 100644 index 0000000000..b10d123c8f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/twisted_stone_horizontal.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column_horizontal", + "textures": { + "end": "twilightforest:block/stone_twist/twist_end", + "side": "twilightforest:block/stone_twist/twist_side" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/uberous_soil.json b/src/generated/resources/assets/twilightforest/models/block/uberous_soil.json new file mode 100644 index 0000000000..4d877e264a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/uberous_soil.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/template_farmland", + "render_type": "minecraft:translucent", + "textures": { + "dirt": "twilightforest:block/uberous_soil", + "top": "twilightforest:block/uberous_soil" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/uncrafting_table.json b/src/generated/resources/assets/twilightforest/models/block/uncrafting_table.json new file mode 100644 index 0000000000..d4fd5b4e9d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/uncrafting_table.json @@ -0,0 +1,76 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "texture": "#bottom" + }, + "east": { + "cullface": "east", + "texture": "#east" + }, + "north": { + "cullface": "north", + "texture": "#north" + }, + "south": { + "cullface": "south", + "texture": "#south" + }, + "up": { + "cullface": "up", + "texture": "#top" + }, + "west": { + "cullface": "west", + "texture": "#west" + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + }, + { + "faces": { + "up": { + "cullface": "up", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#top2" + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + } + ], + "render_type": "minecraft:translucent", + "textures": { + "bottom": "minecraft:block/jungle_planks", + "east": "twilightforest:block/uncrafting_side", + "north": "twilightforest:block/uncrafting_side", + "particle": "#bottom", + "south": "twilightforest:block/uncrafting_side", + "top": "twilightforest:block/uncrafting_top", + "top2": "twilightforest:block/uncrafting_glow", + "west": "twilightforest:block/uncrafting_side" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/uncrafting_table_glowing.json b/src/generated/resources/assets/twilightforest/models/block/uncrafting_table_glowing.json new file mode 100644 index 0000000000..1d2e93bd64 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/uncrafting_table_glowing.json @@ -0,0 +1,112 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "texture": "#bottom" + }, + "east": { + "cullface": "east", + "texture": "#east" + }, + "north": { + "cullface": "north", + "texture": "#north" + }, + "south": { + "cullface": "south", + "texture": "#south" + }, + "up": { + "cullface": "up", + "texture": "#top" + }, + "west": { + "cullface": "west", + "texture": "#west" + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + }, + { + "faces": { + "east": { + "cullface": "east", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#east2" + }, + "north": { + "cullface": "north", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#north2" + }, + "south": { + "cullface": "south", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#south2" + }, + "up": { + "cullface": "up", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#top2" + }, + "west": { + "cullface": "west", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#west2" + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + } + ], + "render_type": "minecraft:translucent", + "textures": { + "bottom": "minecraft:block/jungle_planks", + "east": "twilightforest:block/uncrafting_side", + "east2": "twilightforest:block/uncrafting_glow_side", + "north": "twilightforest:block/uncrafting_side", + "north2": "twilightforest:block/uncrafting_glow_side", + "particle": "#bottom", + "south": "twilightforest:block/uncrafting_side", + "south2": "twilightforest:block/uncrafting_glow_side", + "top": "twilightforest:block/uncrafting_top", + "top2": "twilightforest:block/uncrafting_glow", + "west": "twilightforest:block/uncrafting_side", + "west2": "twilightforest:block/uncrafting_glow_side" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/underbrick.json b/src/generated/resources/assets/twilightforest/models/block/underbrick.json new file mode 100644 index 0000000000..122c935ea3 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/underbrick.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "twilightforest:block/underbrick" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/underbrick_floor.json b/src/generated/resources/assets/twilightforest/models/block/underbrick_floor.json new file mode 100644 index 0000000000..495b0409b2 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/underbrick_floor.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "twilightforest:block/underbrick_floor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/unripe_trollber.json b/src/generated/resources/assets/twilightforest/models/block/unripe_trollber.json new file mode 100644 index 0000000000..375efed697 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/unripe_trollber.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cross", + "render_type": "minecraft:cutout", + "textures": { + "cross": "twilightforest:block/unripe_trollber" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/vanishing_block.json b/src/generated/resources/assets/twilightforest/models/block/vanishing_block.json new file mode 100644 index 0000000000..a069cbbde0 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/vanishing_block.json @@ -0,0 +1,192 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "texture": "#bottom" + }, + "east": { + "cullface": "east", + "texture": "#east" + }, + "north": { + "cullface": "north", + "texture": "#north" + }, + "south": { + "cullface": "south", + "texture": "#south" + }, + "up": { + "cullface": "up", + "texture": "#top" + }, + "west": { + "cullface": "west", + "texture": "#west" + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + }, + { + "faces": { + "down": { + "cullface": "down", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#bottom2" + }, + "east": { + "cullface": "east", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#east2" + }, + "north": { + "cullface": "north", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#north2" + }, + "south": { + "cullface": "south", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#south2" + }, + "up": { + "cullface": "up", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#top2" + }, + "west": { + "cullface": "west", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#west2" + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + }, + { + "faces": { + "down": { + "cullface": "down", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#bottom3" + }, + "east": { + "cullface": "east", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#east3" + }, + "north": { + "cullface": "north", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#north3" + }, + "south": { + "cullface": "south", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#south3" + }, + "up": { + "cullface": "up", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#top3" + }, + "west": { + "cullface": "west", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#west3" + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + } + ], + "render_type": "minecraft:cutout", + "textures": { + "all": "twilightforest:block/towerdev_vanish_off", + "all2": "twilightforest:block/tower_device_level_1/towerdev_vanish_off_1", + "all3": "twilightforest:block/tower_device_level_2/towerdev_vanish_off_2", + "bottom": "#all", + "bottom2": "#all2", + "bottom3": "#all3", + "east": "#all", + "east2": "#all2", + "east3": "#all3", + "north": "#all", + "north2": "#all2", + "north3": "#all3", + "particle": "#bottom", + "south": "#all", + "south2": "#all2", + "south3": "#all3", + "top": "#all", + "top2": "#all2", + "top3": "#all3", + "west": "#all", + "west2": "#all2", + "west3": "#all3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/vanishing_block_active.json b/src/generated/resources/assets/twilightforest/models/block/vanishing_block_active.json new file mode 100644 index 0000000000..20dc7367e4 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/vanishing_block_active.json @@ -0,0 +1,192 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "texture": "#bottom" + }, + "east": { + "cullface": "east", + "texture": "#east" + }, + "north": { + "cullface": "north", + "texture": "#north" + }, + "south": { + "cullface": "south", + "texture": "#south" + }, + "up": { + "cullface": "up", + "texture": "#top" + }, + "west": { + "cullface": "west", + "texture": "#west" + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + }, + { + "faces": { + "down": { + "cullface": "down", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#bottom2" + }, + "east": { + "cullface": "east", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#east2" + }, + "north": { + "cullface": "north", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#north2" + }, + "south": { + "cullface": "south", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#south2" + }, + "up": { + "cullface": "up", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#top2" + }, + "west": { + "cullface": "west", + "forge_data": { + "block_light": 15, + "sky_light": 15 + }, + "texture": "#west2" + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + }, + { + "faces": { + "down": { + "cullface": "down", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#bottom3" + }, + "east": { + "cullface": "east", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#east3" + }, + "north": { + "cullface": "north", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#north3" + }, + "south": { + "cullface": "south", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#south3" + }, + "up": { + "cullface": "up", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#top3" + }, + "west": { + "cullface": "west", + "forge_data": { + "block_light": 10, + "sky_light": 10 + }, + "texture": "#west3" + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + } + ], + "render_type": "minecraft:cutout", + "textures": { + "all": "twilightforest:block/towerdev_vanish_on", + "all2": "twilightforest:block/tower_device_level_1/towerdev_vanish_on_1", + "all3": "twilightforest:block/tower_device_level_2/towerdev_vanish_on_2", + "bottom": "#all", + "bottom2": "#all2", + "bottom3": "#all3", + "east": "#all", + "east2": "#all2", + "east3": "#all3", + "north": "#all", + "north2": "#all2", + "north3": "#all3", + "particle": "#bottom", + "south": "#all", + "south2": "#all2", + "south3": "#all3", + "top": "#all", + "top2": "#all2", + "top3": "#all3", + "west": "#all", + "west2": "#all2", + "west3": "#all3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/vertical_hollow_log.json b/src/generated/resources/assets/twilightforest/models/block/vertical_hollow_log.json new file mode 100644 index 0000000000..f5e7dd9af7 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/vertical_hollow_log.json @@ -0,0 +1,156 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "texture": "#top" + }, + "east": { + "texture": "#inner" + }, + "north": { + "cullface": "north", + "texture": "#side" + }, + "south": { + "cullface": "south", + "texture": "#side" + }, + "up": { + "cullface": "up", + "texture": "#top" + }, + "west": { + "cullface": "west", + "texture": "#side" + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 2, + 16, + 16 + ] + }, + { + "faces": { + "down": { + "cullface": "down", + "texture": "#top" + }, + "east": { + "cullface": "east", + "texture": "#side" + }, + "north": { + "cullface": "north", + "texture": "#side" + }, + "south": { + "cullface": "south", + "texture": "#side" + }, + "up": { + "cullface": "up", + "texture": "#top" + }, + "west": { + "texture": "#inner" + } + }, + "from": [ + 14, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + }, + { + "faces": { + "down": { + "cullface": "down", + "texture": "#top" + }, + "east": { + "cullface": "east", + "texture": "#side" + }, + "north": { + "cullface": "north", + "texture": "#side" + }, + "south": { + "texture": "#inner" + }, + "up": { + "cullface": "up", + "texture": "#top" + }, + "west": { + "cullface": "west", + "texture": "#side" + } + }, + "from": [ + 2, + 0, + 0 + ], + "to": [ + 14, + 16, + 2 + ] + }, + { + "faces": { + "down": { + "cullface": "down", + "texture": "#top" + }, + "east": { + "cullface": "east", + "texture": "#side" + }, + "north": { + "texture": "#inner" + }, + "south": { + "cullface": "south", + "texture": "#side" + }, + "up": { + "cullface": "up", + "texture": "#top" + }, + "west": { + "cullface": "west", + "texture": "#side" + } + }, + "from": [ + 2, + 0, + 14 + ], + "to": [ + 14, + 16, + 16 + ] + } + ], + "textures": { + "particle": "#side" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/vertical_hollow_log_ladder.json b/src/generated/resources/assets/twilightforest/models/block/vertical_hollow_log_ladder.json new file mode 100644 index 0000000000..1c0c7bfd68 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/vertical_hollow_log_ladder.json @@ -0,0 +1,181 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "texture": "#top" + }, + "east": { + "texture": "#inner" + }, + "north": { + "cullface": "north", + "texture": "#side" + }, + "south": { + "cullface": "south", + "texture": "#side" + }, + "up": { + "cullface": "up", + "texture": "#top" + }, + "west": { + "cullface": "west", + "texture": "#side" + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 2, + 16, + 16 + ] + }, + { + "faces": { + "down": { + "cullface": "down", + "texture": "#top" + }, + "east": { + "cullface": "east", + "texture": "#side" + }, + "north": { + "cullface": "north", + "texture": "#side" + }, + "south": { + "cullface": "south", + "texture": "#side" + }, + "up": { + "cullface": "up", + "texture": "#top" + }, + "west": { + "texture": "#inner" + } + }, + "from": [ + 14, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + }, + { + "faces": { + "down": { + "cullface": "down", + "texture": "#top" + }, + "east": { + "cullface": "east", + "texture": "#side" + }, + "north": { + "cullface": "north", + "texture": "#side" + }, + "south": { + "texture": "#inner" + }, + "up": { + "cullface": "up", + "texture": "#top" + }, + "west": { + "cullface": "west", + "texture": "#side" + } + }, + "from": [ + 2, + 0, + 0 + ], + "to": [ + 14, + 16, + 2 + ] + }, + { + "faces": { + "down": { + "cullface": "down", + "texture": "#top" + }, + "east": { + "cullface": "east", + "texture": "#side" + }, + "north": { + "texture": "#inner" + }, + "south": { + "cullface": "south", + "texture": "#side" + }, + "up": { + "cullface": "up", + "texture": "#top" + }, + "west": { + "cullface": "west", + "texture": "#side" + } + }, + "from": [ + 2, + 0, + 14 + ], + "to": [ + 14, + 16, + 16 + ] + }, + { + "faces": { + "north": { + "texture": "#climbable", + "tintindex": 1 + }, + "south": { + "texture": "#climbable", + "tintindex": 1 + } + }, + "from": [ + 2, + 0, + 2.8 + ], + "shade": false, + "to": [ + 14, + 16, + 2.8 + ] + } + ], + "render_type": "minecraft:cutout", + "textures": { + "climbable": "minecraft:block/ladder", + "particle": "#side" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/vertical_hollow_log_vine.json b/src/generated/resources/assets/twilightforest/models/block/vertical_hollow_log_vine.json new file mode 100644 index 0000000000..a17a4010a3 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/vertical_hollow_log_vine.json @@ -0,0 +1,181 @@ +{ + "parent": "minecraft:block/block", + "elements": [ + { + "faces": { + "down": { + "cullface": "down", + "texture": "#top" + }, + "east": { + "texture": "#inner" + }, + "north": { + "cullface": "north", + "texture": "#side" + }, + "south": { + "cullface": "south", + "texture": "#side" + }, + "up": { + "cullface": "up", + "texture": "#top" + }, + "west": { + "cullface": "west", + "texture": "#side" + } + }, + "from": [ + 0, + 0, + 0 + ], + "to": [ + 2, + 16, + 16 + ] + }, + { + "faces": { + "down": { + "cullface": "down", + "texture": "#top" + }, + "east": { + "cullface": "east", + "texture": "#side" + }, + "north": { + "cullface": "north", + "texture": "#side" + }, + "south": { + "cullface": "south", + "texture": "#side" + }, + "up": { + "cullface": "up", + "texture": "#top" + }, + "west": { + "texture": "#inner" + } + }, + "from": [ + 14, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ] + }, + { + "faces": { + "down": { + "cullface": "down", + "texture": "#top" + }, + "east": { + "cullface": "east", + "texture": "#side" + }, + "north": { + "cullface": "north", + "texture": "#side" + }, + "south": { + "texture": "#inner" + }, + "up": { + "cullface": "up", + "texture": "#top" + }, + "west": { + "cullface": "west", + "texture": "#side" + } + }, + "from": [ + 2, + 0, + 0 + ], + "to": [ + 14, + 16, + 2 + ] + }, + { + "faces": { + "down": { + "cullface": "down", + "texture": "#top" + }, + "east": { + "cullface": "east", + "texture": "#side" + }, + "north": { + "texture": "#inner" + }, + "south": { + "cullface": "south", + "texture": "#side" + }, + "up": { + "cullface": "up", + "texture": "#top" + }, + "west": { + "cullface": "west", + "texture": "#side" + } + }, + "from": [ + 2, + 0, + 14 + ], + "to": [ + 14, + 16, + 16 + ] + }, + { + "faces": { + "north": { + "texture": "#climbable", + "tintindex": 1 + }, + "south": { + "texture": "#climbable", + "tintindex": 1 + } + }, + "from": [ + 2, + 0, + 2.8 + ], + "shade": false, + "to": [ + 14, + 16, + 2.8 + ] + } + ], + "render_type": "minecraft:cutout", + "textures": { + "climbable": "minecraft:block/vine", + "particle": "#side" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/violet_castle_door.json b/src/generated/resources/assets/twilightforest/models/block/violet_castle_door.json new file mode 100644 index 0000000000..94f18d7e7c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/violet_castle_door.json @@ -0,0 +1,11 @@ +{ + "parent": "minecraft:block/block", + "loader": "twilightforest:castle_door", + "render_type": "minecraft:cutout", + "textures": { + "base": "twilightforest:block/castle_door", + "overlay": "twilightforest:block/castle_door_rune_corners", + "overlay_connected": "twilightforest:block/castle_door_rune_ctm", + "particle": "twilightforest:block/castle_door" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/violet_castle_door_vanished.json b/src/generated/resources/assets/twilightforest/models/block/violet_castle_door_vanished.json new file mode 100644 index 0000000000..9307588e5a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/violet_castle_door_vanished.json @@ -0,0 +1,11 @@ +{ + "parent": "minecraft:block/block", + "loader": "twilightforest:castle_door", + "render_type": "minecraft:cutout", + "textures": { + "base": "twilightforest:block/castle_door_vanished", + "overlay": "twilightforest:block/castle_door_rune_corners", + "overlay_connected": "twilightforest:block/castle_door_rune_ctm", + "particle": "twilightforest:block/castle_door_vanished" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/weathered_deadrock.json b/src/generated/resources/assets/twilightforest/models/block/weathered_deadrock.json new file mode 100644 index 0000000000..a63cb1921d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/weathered_deadrock.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "twilightforest:block/weathered_deadrock" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wispy_cloud.json b/src/generated/resources/assets/twilightforest/models/block/wispy_cloud.json new file mode 100644 index 0000000000..b9fa33fd77 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wispy_cloud.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_all", + "render_type": "minecraft:translucent", + "textures": { + "all": "twilightforest:block/wispy_cloud" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/acacia/acacia_banister_connected.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/acacia/acacia_banister_connected.json new file mode 100644 index 0000000000..7342820af0 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/acacia/acacia_banister_connected.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected", + "textures": { + "texture": "minecraft:block/acacia_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/acacia/acacia_banister_connected_extended.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/acacia/acacia_banister_connected_extended.json new file mode 100644 index 0000000000..c20ade991c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/acacia/acacia_banister_connected_extended.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected_extended", + "textures": { + "texture": "minecraft:block/acacia_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/acacia/acacia_banister_short.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/acacia/acacia_banister_short.json new file mode 100644 index 0000000000..7779538089 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/acacia/acacia_banister_short.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short", + "textures": { + "texture": "minecraft:block/acacia_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/acacia/acacia_banister_short_extended.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/acacia/acacia_banister_short_extended.json new file mode 100644 index 0000000000..3abe2f72ba --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/acacia/acacia_banister_short_extended.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short_extended", + "textures": { + "texture": "minecraft:block/acacia_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/acacia/acacia_banister_tall.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/acacia/acacia_banister_tall.json new file mode 100644 index 0000000000..442eae40bd --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/acacia/acacia_banister_tall.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall", + "textures": { + "texture": "minecraft:block/acacia_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/acacia/acacia_banister_tall_extended.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/acacia/acacia_banister_tall_extended.json new file mode 100644 index 0000000000..e619e7599c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/acacia/acacia_banister_tall_extended.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall_extended", + "textures": { + "texture": "minecraft:block/acacia_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/birch/birch_banister_connected.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/birch/birch_banister_connected.json new file mode 100644 index 0000000000..fa4cc2929f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/birch/birch_banister_connected.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected", + "textures": { + "texture": "minecraft:block/birch_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/birch/birch_banister_connected_extended.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/birch/birch_banister_connected_extended.json new file mode 100644 index 0000000000..26476ee44d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/birch/birch_banister_connected_extended.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected_extended", + "textures": { + "texture": "minecraft:block/birch_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/birch/birch_banister_short.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/birch/birch_banister_short.json new file mode 100644 index 0000000000..c4ab3565dd --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/birch/birch_banister_short.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short", + "textures": { + "texture": "minecraft:block/birch_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/birch/birch_banister_short_extended.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/birch/birch_banister_short_extended.json new file mode 100644 index 0000000000..dfae781421 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/birch/birch_banister_short_extended.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short_extended", + "textures": { + "texture": "minecraft:block/birch_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/birch/birch_banister_tall.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/birch/birch_banister_tall.json new file mode 100644 index 0000000000..c0a6a4554e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/birch/birch_banister_tall.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall", + "textures": { + "texture": "minecraft:block/birch_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/birch/birch_banister_tall_extended.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/birch/birch_banister_tall_extended.json new file mode 100644 index 0000000000..226b8d6332 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/birch/birch_banister_tall_extended.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall_extended", + "textures": { + "texture": "minecraft:block/birch_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_connected.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_connected.json new file mode 100644 index 0000000000..4c0acd4f48 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_connected.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected", + "textures": { + "texture": "twilightforest:block/wood/planks_canopy_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_connected_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_connected_1.json new file mode 100644 index 0000000000..f79d055034 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_connected_1.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected", + "textures": { + "texture": "twilightforest:block/wood/planks_canopy_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_connected_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_connected_2.json new file mode 100644 index 0000000000..7a01b090eb --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_connected_2.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected", + "textures": { + "texture": "twilightforest:block/wood/planks_canopy_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_connected_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_connected_3.json new file mode 100644 index 0000000000..f9261e8240 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_connected_3.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected", + "textures": { + "texture": "twilightforest:block/wood/planks_canopy_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_connected_extended.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_connected_extended.json new file mode 100644 index 0000000000..baf0d5c398 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_connected_extended.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_canopy_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_connected_extended_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_connected_extended_1.json new file mode 100644 index 0000000000..d141715565 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_connected_extended_1.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_canopy_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_connected_extended_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_connected_extended_2.json new file mode 100644 index 0000000000..5a5f12cd15 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_connected_extended_2.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_canopy_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_connected_extended_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_connected_extended_3.json new file mode 100644 index 0000000000..3dbd9c68ea --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_connected_extended_3.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_canopy_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_short.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_short.json new file mode 100644 index 0000000000..6e6333e956 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_short.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short", + "textures": { + "texture": "twilightforest:block/wood/planks_canopy_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_short_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_short_1.json new file mode 100644 index 0000000000..8f517735d0 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_short_1.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short", + "textures": { + "texture": "twilightforest:block/wood/planks_canopy_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_short_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_short_2.json new file mode 100644 index 0000000000..e0ab51df13 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_short_2.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short", + "textures": { + "texture": "twilightforest:block/wood/planks_canopy_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_short_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_short_3.json new file mode 100644 index 0000000000..fd370c6a99 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_short_3.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short", + "textures": { + "texture": "twilightforest:block/wood/planks_canopy_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_short_extended.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_short_extended.json new file mode 100644 index 0000000000..efd0c2dce0 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_short_extended.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_canopy_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_short_extended_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_short_extended_1.json new file mode 100644 index 0000000000..b03458c969 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_short_extended_1.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_canopy_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_short_extended_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_short_extended_2.json new file mode 100644 index 0000000000..d5822ac59f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_short_extended_2.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_canopy_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_short_extended_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_short_extended_3.json new file mode 100644 index 0000000000..dbac90299e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_short_extended_3.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_canopy_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_tall.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_tall.json new file mode 100644 index 0000000000..29a4f4545b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_tall.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall", + "textures": { + "texture": "twilightforest:block/wood/planks_canopy_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_tall_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_tall_1.json new file mode 100644 index 0000000000..6296dbce26 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_tall_1.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall", + "textures": { + "texture": "twilightforest:block/wood/planks_canopy_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_tall_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_tall_2.json new file mode 100644 index 0000000000..0dcd0a97ac --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_tall_2.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall", + "textures": { + "texture": "twilightforest:block/wood/planks_canopy_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_tall_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_tall_3.json new file mode 100644 index 0000000000..34348b8e65 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_tall_3.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall", + "textures": { + "texture": "twilightforest:block/wood/planks_canopy_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_tall_extended.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_tall_extended.json new file mode 100644 index 0000000000..24514ff389 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_tall_extended.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_canopy_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_tall_extended_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_tall_extended_1.json new file mode 100644 index 0000000000..3650df6559 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_tall_extended_1.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_canopy_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_tall_extended_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_tall_extended_2.json new file mode 100644 index 0000000000..9d53194913 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_tall_extended_2.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_canopy_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_tall_extended_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_tall_extended_3.json new file mode 100644 index 0000000000..cd4eedf1e3 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/canopy/canopy_banister_tall_extended_3.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_canopy_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/crimson/crimson_banister_connected.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/crimson/crimson_banister_connected.json new file mode 100644 index 0000000000..0143a7c4fc --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/crimson/crimson_banister_connected.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected", + "textures": { + "texture": "minecraft:block/crimson_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/crimson/crimson_banister_connected_extended.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/crimson/crimson_banister_connected_extended.json new file mode 100644 index 0000000000..4dccb65769 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/crimson/crimson_banister_connected_extended.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected_extended", + "textures": { + "texture": "minecraft:block/crimson_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/crimson/crimson_banister_short.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/crimson/crimson_banister_short.json new file mode 100644 index 0000000000..c1d322700d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/crimson/crimson_banister_short.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short", + "textures": { + "texture": "minecraft:block/crimson_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/crimson/crimson_banister_short_extended.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/crimson/crimson_banister_short_extended.json new file mode 100644 index 0000000000..8e95b32550 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/crimson/crimson_banister_short_extended.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short_extended", + "textures": { + "texture": "minecraft:block/crimson_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/crimson/crimson_banister_tall.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/crimson/crimson_banister_tall.json new file mode 100644 index 0000000000..3dff414fb4 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/crimson/crimson_banister_tall.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall", + "textures": { + "texture": "minecraft:block/crimson_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/crimson/crimson_banister_tall_extended.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/crimson/crimson_banister_tall_extended.json new file mode 100644 index 0000000000..4051bf2e61 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/crimson/crimson_banister_tall_extended.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall_extended", + "textures": { + "texture": "minecraft:block/crimson_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/dark_oak/dark_oak_banister_connected.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/dark_oak/dark_oak_banister_connected.json new file mode 100644 index 0000000000..07657005bb --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/dark_oak/dark_oak_banister_connected.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected", + "textures": { + "texture": "minecraft:block/dark_oak_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/dark_oak/dark_oak_banister_connected_extended.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/dark_oak/dark_oak_banister_connected_extended.json new file mode 100644 index 0000000000..116d07cd74 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/dark_oak/dark_oak_banister_connected_extended.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected_extended", + "textures": { + "texture": "minecraft:block/dark_oak_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/dark_oak/dark_oak_banister_short.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/dark_oak/dark_oak_banister_short.json new file mode 100644 index 0000000000..9596d84216 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/dark_oak/dark_oak_banister_short.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short", + "textures": { + "texture": "minecraft:block/dark_oak_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/dark_oak/dark_oak_banister_short_extended.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/dark_oak/dark_oak_banister_short_extended.json new file mode 100644 index 0000000000..17677f7396 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/dark_oak/dark_oak_banister_short_extended.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short_extended", + "textures": { + "texture": "minecraft:block/dark_oak_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/dark_oak/dark_oak_banister_tall.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/dark_oak/dark_oak_banister_tall.json new file mode 100644 index 0000000000..586797c7b0 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/dark_oak/dark_oak_banister_tall.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall", + "textures": { + "texture": "minecraft:block/dark_oak_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/dark_oak/dark_oak_banister_tall_extended.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/dark_oak/dark_oak_banister_tall_extended.json new file mode 100644 index 0000000000..d4ced5d29d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/dark_oak/dark_oak_banister_tall_extended.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall_extended", + "textures": { + "texture": "minecraft:block/dark_oak_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_connected.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_connected.json new file mode 100644 index 0000000000..264610b5c6 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_connected.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected", + "textures": { + "texture": "twilightforest:block/wood/planks_darkwood_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_connected_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_connected_1.json new file mode 100644 index 0000000000..b0346c93e4 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_connected_1.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected", + "textures": { + "texture": "twilightforest:block/wood/planks_darkwood_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_connected_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_connected_2.json new file mode 100644 index 0000000000..2e121c45f2 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_connected_2.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected", + "textures": { + "texture": "twilightforest:block/wood/planks_darkwood_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_connected_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_connected_3.json new file mode 100644 index 0000000000..74fff02f30 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_connected_3.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected", + "textures": { + "texture": "twilightforest:block/wood/planks_darkwood_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_connected_extended.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_connected_extended.json new file mode 100644 index 0000000000..031d655206 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_connected_extended.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_darkwood_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_connected_extended_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_connected_extended_1.json new file mode 100644 index 0000000000..b0013207cb --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_connected_extended_1.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_darkwood_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_connected_extended_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_connected_extended_2.json new file mode 100644 index 0000000000..23b656023d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_connected_extended_2.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_darkwood_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_connected_extended_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_connected_extended_3.json new file mode 100644 index 0000000000..c328f98962 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_connected_extended_3.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_darkwood_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_short.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_short.json new file mode 100644 index 0000000000..c515e2809c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_short.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short", + "textures": { + "texture": "twilightforest:block/wood/planks_darkwood_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_short_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_short_1.json new file mode 100644 index 0000000000..97920e526b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_short_1.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short", + "textures": { + "texture": "twilightforest:block/wood/planks_darkwood_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_short_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_short_2.json new file mode 100644 index 0000000000..8c10cb5162 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_short_2.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short", + "textures": { + "texture": "twilightforest:block/wood/planks_darkwood_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_short_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_short_3.json new file mode 100644 index 0000000000..40285c59c8 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_short_3.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short", + "textures": { + "texture": "twilightforest:block/wood/planks_darkwood_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_short_extended.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_short_extended.json new file mode 100644 index 0000000000..34d340651c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_short_extended.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_darkwood_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_short_extended_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_short_extended_1.json new file mode 100644 index 0000000000..a55b9a4d88 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_short_extended_1.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_darkwood_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_short_extended_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_short_extended_2.json new file mode 100644 index 0000000000..235f4e5a32 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_short_extended_2.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_darkwood_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_short_extended_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_short_extended_3.json new file mode 100644 index 0000000000..3549dee902 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_short_extended_3.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_darkwood_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_tall.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_tall.json new file mode 100644 index 0000000000..9df6a8bd3a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_tall.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall", + "textures": { + "texture": "twilightforest:block/wood/planks_darkwood_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_tall_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_tall_1.json new file mode 100644 index 0000000000..5af7c1c23c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_tall_1.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall", + "textures": { + "texture": "twilightforest:block/wood/planks_darkwood_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_tall_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_tall_2.json new file mode 100644 index 0000000000..90436e42d6 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_tall_2.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall", + "textures": { + "texture": "twilightforest:block/wood/planks_darkwood_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_tall_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_tall_3.json new file mode 100644 index 0000000000..e9531402eb --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_tall_3.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall", + "textures": { + "texture": "twilightforest:block/wood/planks_darkwood_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_tall_extended.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_tall_extended.json new file mode 100644 index 0000000000..0d05a300a4 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_tall_extended.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_darkwood_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_tall_extended_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_tall_extended_1.json new file mode 100644 index 0000000000..5638235338 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_tall_extended_1.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_darkwood_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_tall_extended_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_tall_extended_2.json new file mode 100644 index 0000000000..3944231750 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_tall_extended_2.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_darkwood_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_tall_extended_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_tall_extended_3.json new file mode 100644 index 0000000000..d523977631 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/darkwood/dark_banister_tall_extended_3.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_darkwood_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/jungle/jungle_banister_connected.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/jungle/jungle_banister_connected.json new file mode 100644 index 0000000000..c4594bcbac --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/jungle/jungle_banister_connected.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected", + "textures": { + "texture": "minecraft:block/jungle_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/jungle/jungle_banister_connected_extended.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/jungle/jungle_banister_connected_extended.json new file mode 100644 index 0000000000..3933ae91c2 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/jungle/jungle_banister_connected_extended.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected_extended", + "textures": { + "texture": "minecraft:block/jungle_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/jungle/jungle_banister_short.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/jungle/jungle_banister_short.json new file mode 100644 index 0000000000..40f03a530f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/jungle/jungle_banister_short.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short", + "textures": { + "texture": "minecraft:block/jungle_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/jungle/jungle_banister_short_extended.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/jungle/jungle_banister_short_extended.json new file mode 100644 index 0000000000..214707115d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/jungle/jungle_banister_short_extended.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short_extended", + "textures": { + "texture": "minecraft:block/jungle_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/jungle/jungle_banister_tall.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/jungle/jungle_banister_tall.json new file mode 100644 index 0000000000..2097e2c571 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/jungle/jungle_banister_tall.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall", + "textures": { + "texture": "minecraft:block/jungle_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/jungle/jungle_banister_tall_extended.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/jungle/jungle_banister_tall_extended.json new file mode 100644 index 0000000000..8a31a8dfea --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/jungle/jungle_banister_tall_extended.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall_extended", + "textures": { + "texture": "minecraft:block/jungle_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_connected.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_connected.json new file mode 100644 index 0000000000..fb8e9ae387 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_connected.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected", + "textures": { + "texture": "twilightforest:block/wood/planks_mangrove_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_connected_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_connected_1.json new file mode 100644 index 0000000000..21c3d2fba4 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_connected_1.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected", + "textures": { + "texture": "twilightforest:block/wood/planks_mangrove_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_connected_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_connected_2.json new file mode 100644 index 0000000000..58a2932c67 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_connected_2.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected", + "textures": { + "texture": "twilightforest:block/wood/planks_mangrove_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_connected_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_connected_3.json new file mode 100644 index 0000000000..4383a74355 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_connected_3.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected", + "textures": { + "texture": "twilightforest:block/wood/planks_mangrove_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_connected_extended.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_connected_extended.json new file mode 100644 index 0000000000..10bca6e26d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_connected_extended.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_mangrove_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_connected_extended_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_connected_extended_1.json new file mode 100644 index 0000000000..3f5e3e2605 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_connected_extended_1.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_mangrove_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_connected_extended_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_connected_extended_2.json new file mode 100644 index 0000000000..3b76d3ba7c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_connected_extended_2.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_mangrove_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_connected_extended_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_connected_extended_3.json new file mode 100644 index 0000000000..860dc323d8 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_connected_extended_3.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_mangrove_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_short.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_short.json new file mode 100644 index 0000000000..e0c9019a35 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_short.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short", + "textures": { + "texture": "twilightforest:block/wood/planks_mangrove_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_short_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_short_1.json new file mode 100644 index 0000000000..786f9c376d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_short_1.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short", + "textures": { + "texture": "twilightforest:block/wood/planks_mangrove_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_short_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_short_2.json new file mode 100644 index 0000000000..b62b84ff50 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_short_2.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short", + "textures": { + "texture": "twilightforest:block/wood/planks_mangrove_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_short_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_short_3.json new file mode 100644 index 0000000000..866df0df45 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_short_3.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short", + "textures": { + "texture": "twilightforest:block/wood/planks_mangrove_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_short_extended.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_short_extended.json new file mode 100644 index 0000000000..e2951fbae1 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_short_extended.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_mangrove_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_short_extended_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_short_extended_1.json new file mode 100644 index 0000000000..3ddca21903 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_short_extended_1.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_mangrove_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_short_extended_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_short_extended_2.json new file mode 100644 index 0000000000..288c4c1915 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_short_extended_2.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_mangrove_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_short_extended_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_short_extended_3.json new file mode 100644 index 0000000000..05f837c3e5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_short_extended_3.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_mangrove_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_tall.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_tall.json new file mode 100644 index 0000000000..a9442d7b5e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_tall.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall", + "textures": { + "texture": "twilightforest:block/wood/planks_mangrove_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_tall_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_tall_1.json new file mode 100644 index 0000000000..2a9e773d64 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_tall_1.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall", + "textures": { + "texture": "twilightforest:block/wood/planks_mangrove_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_tall_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_tall_2.json new file mode 100644 index 0000000000..032e2ba515 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_tall_2.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall", + "textures": { + "texture": "twilightforest:block/wood/planks_mangrove_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_tall_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_tall_3.json new file mode 100644 index 0000000000..b82b331c5f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_tall_3.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall", + "textures": { + "texture": "twilightforest:block/wood/planks_mangrove_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_tall_extended.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_tall_extended.json new file mode 100644 index 0000000000..de9cc2cb81 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_tall_extended.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_mangrove_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_tall_extended_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_tall_extended_1.json new file mode 100644 index 0000000000..cf7fe0b21d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_tall_extended_1.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_mangrove_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_tall_extended_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_tall_extended_2.json new file mode 100644 index 0000000000..b47bd02045 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_tall_extended_2.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_mangrove_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_tall_extended_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_tall_extended_3.json new file mode 100644 index 0000000000..4e0e916324 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mangrove/mangrove_banister_tall_extended_3.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_mangrove_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/mine/mining_banister_connected.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mine/mining_banister_connected.json new file mode 100644 index 0000000000..b43d73e5d1 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mine/mining_banister_connected.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected", + "textures": { + "texture": "twilightforest:block/wood/planks_mine_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/mine/mining_banister_connected_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mine/mining_banister_connected_1.json new file mode 100644 index 0000000000..519ed9c7ab --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mine/mining_banister_connected_1.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected", + "textures": { + "texture": "twilightforest:block/wood/planks_mine_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/mine/mining_banister_connected_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mine/mining_banister_connected_2.json new file mode 100644 index 0000000000..f5ff663da1 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mine/mining_banister_connected_2.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected", + "textures": { + "texture": "twilightforest:block/wood/planks_mine_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/mine/mining_banister_connected_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mine/mining_banister_connected_3.json new file mode 100644 index 0000000000..94e008efbb --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mine/mining_banister_connected_3.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected", + "textures": { + "texture": "twilightforest:block/wood/planks_mine_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/mine/mining_banister_connected_extended.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mine/mining_banister_connected_extended.json new file mode 100644 index 0000000000..e197954831 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mine/mining_banister_connected_extended.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_mine_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/mine/mining_banister_connected_extended_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mine/mining_banister_connected_extended_1.json new file mode 100644 index 0000000000..709b0345c2 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mine/mining_banister_connected_extended_1.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_mine_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/mine/mining_banister_connected_extended_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mine/mining_banister_connected_extended_2.json new file mode 100644 index 0000000000..a8ba303fb4 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mine/mining_banister_connected_extended_2.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_mine_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/mine/mining_banister_connected_extended_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mine/mining_banister_connected_extended_3.json new file mode 100644 index 0000000000..6ec201361a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mine/mining_banister_connected_extended_3.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_mine_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/mine/mining_banister_short.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mine/mining_banister_short.json new file mode 100644 index 0000000000..e815eee19f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mine/mining_banister_short.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short", + "textures": { + "texture": "twilightforest:block/wood/planks_mine_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/mine/mining_banister_short_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mine/mining_banister_short_1.json new file mode 100644 index 0000000000..ba9e12a121 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mine/mining_banister_short_1.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short", + "textures": { + "texture": "twilightforest:block/wood/planks_mine_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/mine/mining_banister_short_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mine/mining_banister_short_2.json new file mode 100644 index 0000000000..1aa4336b70 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mine/mining_banister_short_2.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short", + "textures": { + "texture": "twilightforest:block/wood/planks_mine_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/mine/mining_banister_short_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mine/mining_banister_short_3.json new file mode 100644 index 0000000000..7624281ff1 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mine/mining_banister_short_3.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short", + "textures": { + "texture": "twilightforest:block/wood/planks_mine_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/mine/mining_banister_short_extended.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mine/mining_banister_short_extended.json new file mode 100644 index 0000000000..7cfdc08beb --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mine/mining_banister_short_extended.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_mine_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/mine/mining_banister_short_extended_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mine/mining_banister_short_extended_1.json new file mode 100644 index 0000000000..82b10cafa8 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mine/mining_banister_short_extended_1.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_mine_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/mine/mining_banister_short_extended_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mine/mining_banister_short_extended_2.json new file mode 100644 index 0000000000..e02a29db4d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mine/mining_banister_short_extended_2.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_mine_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/mine/mining_banister_short_extended_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mine/mining_banister_short_extended_3.json new file mode 100644 index 0000000000..a623c6a434 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mine/mining_banister_short_extended_3.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_mine_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/mine/mining_banister_tall.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mine/mining_banister_tall.json new file mode 100644 index 0000000000..8d95d35b05 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mine/mining_banister_tall.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall", + "textures": { + "texture": "twilightforest:block/wood/planks_mine_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/mine/mining_banister_tall_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mine/mining_banister_tall_1.json new file mode 100644 index 0000000000..820b0107da --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mine/mining_banister_tall_1.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall", + "textures": { + "texture": "twilightforest:block/wood/planks_mine_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/mine/mining_banister_tall_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mine/mining_banister_tall_2.json new file mode 100644 index 0000000000..37bf37dc1c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mine/mining_banister_tall_2.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall", + "textures": { + "texture": "twilightforest:block/wood/planks_mine_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/mine/mining_banister_tall_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mine/mining_banister_tall_3.json new file mode 100644 index 0000000000..c5c9dd0c51 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mine/mining_banister_tall_3.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall", + "textures": { + "texture": "twilightforest:block/wood/planks_mine_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/mine/mining_banister_tall_extended.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mine/mining_banister_tall_extended.json new file mode 100644 index 0000000000..1c2032e348 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mine/mining_banister_tall_extended.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_mine_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/mine/mining_banister_tall_extended_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mine/mining_banister_tall_extended_1.json new file mode 100644 index 0000000000..56f3f5604a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mine/mining_banister_tall_extended_1.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_mine_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/mine/mining_banister_tall_extended_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mine/mining_banister_tall_extended_2.json new file mode 100644 index 0000000000..c4032255f3 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mine/mining_banister_tall_extended_2.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_mine_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/mine/mining_banister_tall_extended_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mine/mining_banister_tall_extended_3.json new file mode 100644 index 0000000000..b0c4d91f05 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/mine/mining_banister_tall_extended_3.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_mine_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/oak/oak_banister_connected.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/oak/oak_banister_connected.json new file mode 100644 index 0000000000..15c4e648ce --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/oak/oak_banister_connected.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected", + "textures": { + "texture": "minecraft:block/oak_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/oak/oak_banister_connected_extended.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/oak/oak_banister_connected_extended.json new file mode 100644 index 0000000000..a12b8d3084 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/oak/oak_banister_connected_extended.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected_extended", + "textures": { + "texture": "minecraft:block/oak_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/oak/oak_banister_short.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/oak/oak_banister_short.json new file mode 100644 index 0000000000..8e434e96cd --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/oak/oak_banister_short.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short", + "textures": { + "texture": "minecraft:block/oak_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/oak/oak_banister_short_extended.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/oak/oak_banister_short_extended.json new file mode 100644 index 0000000000..3ca258b05f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/oak/oak_banister_short_extended.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short_extended", + "textures": { + "texture": "minecraft:block/oak_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/oak/oak_banister_tall.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/oak/oak_banister_tall.json new file mode 100644 index 0000000000..25a80be090 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/oak/oak_banister_tall.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall", + "textures": { + "texture": "minecraft:block/oak_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/oak/oak_banister_tall_extended.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/oak/oak_banister_tall_extended.json new file mode 100644 index 0000000000..a6c16480e1 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/oak/oak_banister_tall_extended.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall_extended", + "textures": { + "texture": "minecraft:block/oak_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/sort/sorting_banister_connected.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/sort/sorting_banister_connected.json new file mode 100644 index 0000000000..d512549236 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/sort/sorting_banister_connected.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected", + "textures": { + "texture": "twilightforest:block/wood/planks_sort_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/sort/sorting_banister_connected_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/sort/sorting_banister_connected_1.json new file mode 100644 index 0000000000..88789dbb56 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/sort/sorting_banister_connected_1.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected", + "textures": { + "texture": "twilightforest:block/wood/planks_sort_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/sort/sorting_banister_connected_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/sort/sorting_banister_connected_2.json new file mode 100644 index 0000000000..4520e7b14c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/sort/sorting_banister_connected_2.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected", + "textures": { + "texture": "twilightforest:block/wood/planks_sort_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/sort/sorting_banister_connected_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/sort/sorting_banister_connected_3.json new file mode 100644 index 0000000000..41ae0e96d9 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/sort/sorting_banister_connected_3.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected", + "textures": { + "texture": "twilightforest:block/wood/planks_sort_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/sort/sorting_banister_connected_extended.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/sort/sorting_banister_connected_extended.json new file mode 100644 index 0000000000..1ff5fcb614 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/sort/sorting_banister_connected_extended.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_sort_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/sort/sorting_banister_connected_extended_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/sort/sorting_banister_connected_extended_1.json new file mode 100644 index 0000000000..b7a6dc9e73 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/sort/sorting_banister_connected_extended_1.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_sort_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/sort/sorting_banister_connected_extended_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/sort/sorting_banister_connected_extended_2.json new file mode 100644 index 0000000000..0a92fdd404 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/sort/sorting_banister_connected_extended_2.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_sort_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/sort/sorting_banister_connected_extended_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/sort/sorting_banister_connected_extended_3.json new file mode 100644 index 0000000000..c2a42c018c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/sort/sorting_banister_connected_extended_3.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_sort_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/sort/sorting_banister_short.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/sort/sorting_banister_short.json new file mode 100644 index 0000000000..4d3a93b710 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/sort/sorting_banister_short.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short", + "textures": { + "texture": "twilightforest:block/wood/planks_sort_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/sort/sorting_banister_short_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/sort/sorting_banister_short_1.json new file mode 100644 index 0000000000..b06d26ad11 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/sort/sorting_banister_short_1.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short", + "textures": { + "texture": "twilightforest:block/wood/planks_sort_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/sort/sorting_banister_short_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/sort/sorting_banister_short_2.json new file mode 100644 index 0000000000..c445791d9b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/sort/sorting_banister_short_2.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short", + "textures": { + "texture": "twilightforest:block/wood/planks_sort_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/sort/sorting_banister_short_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/sort/sorting_banister_short_3.json new file mode 100644 index 0000000000..51e511bea0 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/sort/sorting_banister_short_3.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short", + "textures": { + "texture": "twilightforest:block/wood/planks_sort_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/sort/sorting_banister_short_extended.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/sort/sorting_banister_short_extended.json new file mode 100644 index 0000000000..1c8c603859 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/sort/sorting_banister_short_extended.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_sort_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/sort/sorting_banister_short_extended_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/sort/sorting_banister_short_extended_1.json new file mode 100644 index 0000000000..71307f3a1e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/sort/sorting_banister_short_extended_1.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_sort_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/sort/sorting_banister_short_extended_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/sort/sorting_banister_short_extended_2.json new file mode 100644 index 0000000000..f274907292 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/sort/sorting_banister_short_extended_2.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_sort_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/sort/sorting_banister_short_extended_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/sort/sorting_banister_short_extended_3.json new file mode 100644 index 0000000000..ce3bb83292 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/sort/sorting_banister_short_extended_3.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_sort_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/sort/sorting_banister_tall.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/sort/sorting_banister_tall.json new file mode 100644 index 0000000000..1b1b50bf9d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/sort/sorting_banister_tall.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall", + "textures": { + "texture": "twilightforest:block/wood/planks_sort_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/sort/sorting_banister_tall_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/sort/sorting_banister_tall_1.json new file mode 100644 index 0000000000..b4a76d9174 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/sort/sorting_banister_tall_1.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall", + "textures": { + "texture": "twilightforest:block/wood/planks_sort_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/sort/sorting_banister_tall_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/sort/sorting_banister_tall_2.json new file mode 100644 index 0000000000..4f3568c717 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/sort/sorting_banister_tall_2.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall", + "textures": { + "texture": "twilightforest:block/wood/planks_sort_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/sort/sorting_banister_tall_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/sort/sorting_banister_tall_3.json new file mode 100644 index 0000000000..950aa0d3b7 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/sort/sorting_banister_tall_3.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall", + "textures": { + "texture": "twilightforest:block/wood/planks_sort_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/sort/sorting_banister_tall_extended.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/sort/sorting_banister_tall_extended.json new file mode 100644 index 0000000000..fb1edfb316 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/sort/sorting_banister_tall_extended.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_sort_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/sort/sorting_banister_tall_extended_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/sort/sorting_banister_tall_extended_1.json new file mode 100644 index 0000000000..b9faa521a3 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/sort/sorting_banister_tall_extended_1.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_sort_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/sort/sorting_banister_tall_extended_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/sort/sorting_banister_tall_extended_2.json new file mode 100644 index 0000000000..e533aae8f2 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/sort/sorting_banister_tall_extended_2.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_sort_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/sort/sorting_banister_tall_extended_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/sort/sorting_banister_tall_extended_3.json new file mode 100644 index 0000000000..2b8c280490 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/sort/sorting_banister_tall_extended_3.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_sort_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/spruce/spruce_banister_connected.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/spruce/spruce_banister_connected.json new file mode 100644 index 0000000000..6691af2e0e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/spruce/spruce_banister_connected.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected", + "textures": { + "texture": "minecraft:block/spruce_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/spruce/spruce_banister_connected_extended.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/spruce/spruce_banister_connected_extended.json new file mode 100644 index 0000000000..a65ce0e878 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/spruce/spruce_banister_connected_extended.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected_extended", + "textures": { + "texture": "minecraft:block/spruce_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/spruce/spruce_banister_short.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/spruce/spruce_banister_short.json new file mode 100644 index 0000000000..5275d00275 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/spruce/spruce_banister_short.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short", + "textures": { + "texture": "minecraft:block/spruce_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/spruce/spruce_banister_short_extended.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/spruce/spruce_banister_short_extended.json new file mode 100644 index 0000000000..8009461821 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/spruce/spruce_banister_short_extended.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short_extended", + "textures": { + "texture": "minecraft:block/spruce_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/spruce/spruce_banister_tall.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/spruce/spruce_banister_tall.json new file mode 100644 index 0000000000..4de62f0a26 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/spruce/spruce_banister_tall.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall", + "textures": { + "texture": "minecraft:block/spruce_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/spruce/spruce_banister_tall_extended.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/spruce/spruce_banister_tall_extended.json new file mode 100644 index 0000000000..8fcd8189c6 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/spruce/spruce_banister_tall_extended.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall_extended", + "textures": { + "texture": "minecraft:block/spruce_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/time/time_banister_connected.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/time/time_banister_connected.json new file mode 100644 index 0000000000..3d8b591716 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/time/time_banister_connected.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected", + "textures": { + "texture": "twilightforest:block/wood/planks_time_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/time/time_banister_connected_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/time/time_banister_connected_1.json new file mode 100644 index 0000000000..5b6a087405 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/time/time_banister_connected_1.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected", + "textures": { + "texture": "twilightforest:block/wood/planks_time_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/time/time_banister_connected_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/time/time_banister_connected_2.json new file mode 100644 index 0000000000..15154b64fc --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/time/time_banister_connected_2.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected", + "textures": { + "texture": "twilightforest:block/wood/planks_time_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/time/time_banister_connected_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/time/time_banister_connected_3.json new file mode 100644 index 0000000000..a5d118fdf1 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/time/time_banister_connected_3.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected", + "textures": { + "texture": "twilightforest:block/wood/planks_time_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/time/time_banister_connected_extended.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/time/time_banister_connected_extended.json new file mode 100644 index 0000000000..e3be2a1c0d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/time/time_banister_connected_extended.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_time_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/time/time_banister_connected_extended_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/time/time_banister_connected_extended_1.json new file mode 100644 index 0000000000..c27809d7ce --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/time/time_banister_connected_extended_1.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_time_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/time/time_banister_connected_extended_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/time/time_banister_connected_extended_2.json new file mode 100644 index 0000000000..c6899679e8 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/time/time_banister_connected_extended_2.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_time_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/time/time_banister_connected_extended_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/time/time_banister_connected_extended_3.json new file mode 100644 index 0000000000..8033407f7c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/time/time_banister_connected_extended_3.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_time_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/time/time_banister_short.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/time/time_banister_short.json new file mode 100644 index 0000000000..adba227a60 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/time/time_banister_short.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short", + "textures": { + "texture": "twilightforest:block/wood/planks_time_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/time/time_banister_short_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/time/time_banister_short_1.json new file mode 100644 index 0000000000..1a15abc77d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/time/time_banister_short_1.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short", + "textures": { + "texture": "twilightforest:block/wood/planks_time_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/time/time_banister_short_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/time/time_banister_short_2.json new file mode 100644 index 0000000000..05a06d43b1 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/time/time_banister_short_2.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short", + "textures": { + "texture": "twilightforest:block/wood/planks_time_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/time/time_banister_short_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/time/time_banister_short_3.json new file mode 100644 index 0000000000..9bef054f4c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/time/time_banister_short_3.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short", + "textures": { + "texture": "twilightforest:block/wood/planks_time_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/time/time_banister_short_extended.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/time/time_banister_short_extended.json new file mode 100644 index 0000000000..19fae12267 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/time/time_banister_short_extended.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_time_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/time/time_banister_short_extended_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/time/time_banister_short_extended_1.json new file mode 100644 index 0000000000..ca95d5f162 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/time/time_banister_short_extended_1.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_time_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/time/time_banister_short_extended_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/time/time_banister_short_extended_2.json new file mode 100644 index 0000000000..44b9ab4768 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/time/time_banister_short_extended_2.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_time_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/time/time_banister_short_extended_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/time/time_banister_short_extended_3.json new file mode 100644 index 0000000000..a9c84402bd --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/time/time_banister_short_extended_3.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_time_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/time/time_banister_tall.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/time/time_banister_tall.json new file mode 100644 index 0000000000..2a27bd312f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/time/time_banister_tall.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall", + "textures": { + "texture": "twilightforest:block/wood/planks_time_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/time/time_banister_tall_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/time/time_banister_tall_1.json new file mode 100644 index 0000000000..de32a74e72 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/time/time_banister_tall_1.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall", + "textures": { + "texture": "twilightforest:block/wood/planks_time_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/time/time_banister_tall_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/time/time_banister_tall_2.json new file mode 100644 index 0000000000..7046238041 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/time/time_banister_tall_2.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall", + "textures": { + "texture": "twilightforest:block/wood/planks_time_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/time/time_banister_tall_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/time/time_banister_tall_3.json new file mode 100644 index 0000000000..af85e699da --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/time/time_banister_tall_3.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall", + "textures": { + "texture": "twilightforest:block/wood/planks_time_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/time/time_banister_tall_extended.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/time/time_banister_tall_extended.json new file mode 100644 index 0000000000..ef4bc822eb --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/time/time_banister_tall_extended.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_time_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/time/time_banister_tall_extended_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/time/time_banister_tall_extended_1.json new file mode 100644 index 0000000000..23046a814d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/time/time_banister_tall_extended_1.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_time_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/time/time_banister_tall_extended_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/time/time_banister_tall_extended_2.json new file mode 100644 index 0000000000..aadab1cdd1 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/time/time_banister_tall_extended_2.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_time_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/time/time_banister_tall_extended_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/time/time_banister_tall_extended_3.json new file mode 100644 index 0000000000..f5aea59467 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/time/time_banister_tall_extended_3.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_time_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/trans/transformation_banister_connected.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/trans/transformation_banister_connected.json new file mode 100644 index 0000000000..2bd465f911 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/trans/transformation_banister_connected.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected", + "textures": { + "texture": "twilightforest:block/wood/planks_trans_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/trans/transformation_banister_connected_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/trans/transformation_banister_connected_1.json new file mode 100644 index 0000000000..7d18e50991 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/trans/transformation_banister_connected_1.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected", + "textures": { + "texture": "twilightforest:block/wood/planks_trans_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/trans/transformation_banister_connected_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/trans/transformation_banister_connected_2.json new file mode 100644 index 0000000000..991f2e52e9 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/trans/transformation_banister_connected_2.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected", + "textures": { + "texture": "twilightforest:block/wood/planks_trans_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/trans/transformation_banister_connected_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/trans/transformation_banister_connected_3.json new file mode 100644 index 0000000000..d655e034b3 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/trans/transformation_banister_connected_3.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected", + "textures": { + "texture": "twilightforest:block/wood/planks_trans_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/trans/transformation_banister_connected_extended.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/trans/transformation_banister_connected_extended.json new file mode 100644 index 0000000000..59bafd5fa3 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/trans/transformation_banister_connected_extended.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_trans_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/trans/transformation_banister_connected_extended_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/trans/transformation_banister_connected_extended_1.json new file mode 100644 index 0000000000..ddd4947ea5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/trans/transformation_banister_connected_extended_1.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_trans_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/trans/transformation_banister_connected_extended_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/trans/transformation_banister_connected_extended_2.json new file mode 100644 index 0000000000..b3e90fc4ac --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/trans/transformation_banister_connected_extended_2.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_trans_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/trans/transformation_banister_connected_extended_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/trans/transformation_banister_connected_extended_3.json new file mode 100644 index 0000000000..112f43b0cb --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/trans/transformation_banister_connected_extended_3.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_trans_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/trans/transformation_banister_short.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/trans/transformation_banister_short.json new file mode 100644 index 0000000000..5f416c775d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/trans/transformation_banister_short.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short", + "textures": { + "texture": "twilightforest:block/wood/planks_trans_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/trans/transformation_banister_short_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/trans/transformation_banister_short_1.json new file mode 100644 index 0000000000..735d8edc3f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/trans/transformation_banister_short_1.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short", + "textures": { + "texture": "twilightforest:block/wood/planks_trans_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/trans/transformation_banister_short_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/trans/transformation_banister_short_2.json new file mode 100644 index 0000000000..d2e0c058d1 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/trans/transformation_banister_short_2.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short", + "textures": { + "texture": "twilightforest:block/wood/planks_trans_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/trans/transformation_banister_short_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/trans/transformation_banister_short_3.json new file mode 100644 index 0000000000..7d20e694dc --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/trans/transformation_banister_short_3.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short", + "textures": { + "texture": "twilightforest:block/wood/planks_trans_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/trans/transformation_banister_short_extended.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/trans/transformation_banister_short_extended.json new file mode 100644 index 0000000000..f1c636c2ae --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/trans/transformation_banister_short_extended.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_trans_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/trans/transformation_banister_short_extended_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/trans/transformation_banister_short_extended_1.json new file mode 100644 index 0000000000..46ce025bc1 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/trans/transformation_banister_short_extended_1.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_trans_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/trans/transformation_banister_short_extended_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/trans/transformation_banister_short_extended_2.json new file mode 100644 index 0000000000..2081f235f1 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/trans/transformation_banister_short_extended_2.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_trans_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/trans/transformation_banister_short_extended_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/trans/transformation_banister_short_extended_3.json new file mode 100644 index 0000000000..2a0a09b95a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/trans/transformation_banister_short_extended_3.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_trans_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/trans/transformation_banister_tall.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/trans/transformation_banister_tall.json new file mode 100644 index 0000000000..7e5b34e727 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/trans/transformation_banister_tall.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall", + "textures": { + "texture": "twilightforest:block/wood/planks_trans_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/trans/transformation_banister_tall_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/trans/transformation_banister_tall_1.json new file mode 100644 index 0000000000..0709c3c09f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/trans/transformation_banister_tall_1.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall", + "textures": { + "texture": "twilightforest:block/wood/planks_trans_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/trans/transformation_banister_tall_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/trans/transformation_banister_tall_2.json new file mode 100644 index 0000000000..37a1c5be99 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/trans/transformation_banister_tall_2.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall", + "textures": { + "texture": "twilightforest:block/wood/planks_trans_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/trans/transformation_banister_tall_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/trans/transformation_banister_tall_3.json new file mode 100644 index 0000000000..b22520887d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/trans/transformation_banister_tall_3.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall", + "textures": { + "texture": "twilightforest:block/wood/planks_trans_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/trans/transformation_banister_tall_extended.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/trans/transformation_banister_tall_extended.json new file mode 100644 index 0000000000..a1ad3e865d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/trans/transformation_banister_tall_extended.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_trans_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/trans/transformation_banister_tall_extended_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/trans/transformation_banister_tall_extended_1.json new file mode 100644 index 0000000000..dce2772ee2 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/trans/transformation_banister_tall_extended_1.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_trans_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/trans/transformation_banister_tall_extended_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/trans/transformation_banister_tall_extended_2.json new file mode 100644 index 0000000000..9dd6654f4b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/trans/transformation_banister_tall_extended_2.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_trans_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/trans/transformation_banister_tall_extended_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/trans/transformation_banister_tall_extended_3.json new file mode 100644 index 0000000000..5db8a447fd --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/trans/transformation_banister_tall_extended_3.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_trans_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_connected.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_connected.json new file mode 100644 index 0000000000..c384bca462 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_connected.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected", + "textures": { + "texture": "twilightforest:block/wood/planks_twilight_oak_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_connected_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_connected_1.json new file mode 100644 index 0000000000..e9e3069ea5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_connected_1.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected", + "textures": { + "texture": "twilightforest:block/wood/planks_twilight_oak_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_connected_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_connected_2.json new file mode 100644 index 0000000000..acba7b9ee8 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_connected_2.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected", + "textures": { + "texture": "twilightforest:block/wood/planks_twilight_oak_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_connected_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_connected_3.json new file mode 100644 index 0000000000..211fd22fc1 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_connected_3.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected", + "textures": { + "texture": "twilightforest:block/wood/planks_twilight_oak_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_connected_extended.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_connected_extended.json new file mode 100644 index 0000000000..b56798f428 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_connected_extended.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_twilight_oak_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_connected_extended_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_connected_extended_1.json new file mode 100644 index 0000000000..efd198f37a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_connected_extended_1.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_twilight_oak_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_connected_extended_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_connected_extended_2.json new file mode 100644 index 0000000000..e342465037 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_connected_extended_2.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_twilight_oak_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_connected_extended_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_connected_extended_3.json new file mode 100644 index 0000000000..f900b24983 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_connected_extended_3.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_twilight_oak_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_short.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_short.json new file mode 100644 index 0000000000..8d85b87a11 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_short.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short", + "textures": { + "texture": "twilightforest:block/wood/planks_twilight_oak_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_short_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_short_1.json new file mode 100644 index 0000000000..64fc09843c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_short_1.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short", + "textures": { + "texture": "twilightforest:block/wood/planks_twilight_oak_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_short_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_short_2.json new file mode 100644 index 0000000000..559a5dd0ae --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_short_2.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short", + "textures": { + "texture": "twilightforest:block/wood/planks_twilight_oak_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_short_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_short_3.json new file mode 100644 index 0000000000..56dba80a0e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_short_3.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short", + "textures": { + "texture": "twilightforest:block/wood/planks_twilight_oak_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_short_extended.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_short_extended.json new file mode 100644 index 0000000000..ce1171faea --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_short_extended.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_twilight_oak_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_short_extended_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_short_extended_1.json new file mode 100644 index 0000000000..91d3bf25ba --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_short_extended_1.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_twilight_oak_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_short_extended_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_short_extended_2.json new file mode 100644 index 0000000000..87dee5ab10 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_short_extended_2.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_twilight_oak_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_short_extended_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_short_extended_3.json new file mode 100644 index 0000000000..135f84557b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_short_extended_3.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_twilight_oak_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_tall.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_tall.json new file mode 100644 index 0000000000..2bdc79ed3c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_tall.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall", + "textures": { + "texture": "twilightforest:block/wood/planks_twilight_oak_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_tall_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_tall_1.json new file mode 100644 index 0000000000..c1e4359756 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_tall_1.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall", + "textures": { + "texture": "twilightforest:block/wood/planks_twilight_oak_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_tall_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_tall_2.json new file mode 100644 index 0000000000..7985e9a145 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_tall_2.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall", + "textures": { + "texture": "twilightforest:block/wood/planks_twilight_oak_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_tall_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_tall_3.json new file mode 100644 index 0000000000..6aa723dabd --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_tall_3.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall", + "textures": { + "texture": "twilightforest:block/wood/planks_twilight_oak_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_tall_extended.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_tall_extended.json new file mode 100644 index 0000000000..f75187a8ab --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_tall_extended.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_twilight_oak_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_tall_extended_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_tall_extended_1.json new file mode 100644 index 0000000000..c22370c9d6 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_tall_extended_1.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_twilight_oak_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_tall_extended_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_tall_extended_2.json new file mode 100644 index 0000000000..a0c8170abf --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_tall_extended_2.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_twilight_oak_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_tall_extended_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_tall_extended_3.json new file mode 100644 index 0000000000..e47a088610 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/twilight_oak/twilight_oak_banister_tall_extended_3.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall_extended", + "textures": { + "texture": "twilightforest:block/wood/planks_twilight_oak_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/vanilla_mangrove/vangrove_banister_connected.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/vanilla_mangrove/vangrove_banister_connected.json new file mode 100644 index 0000000000..3fb69ad91c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/vanilla_mangrove/vangrove_banister_connected.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected", + "textures": { + "texture": "minecraft:block/mangrove_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/vanilla_mangrove/vangrove_banister_connected_extended.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/vanilla_mangrove/vangrove_banister_connected_extended.json new file mode 100644 index 0000000000..6a6674e53b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/vanilla_mangrove/vangrove_banister_connected_extended.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected_extended", + "textures": { + "texture": "minecraft:block/mangrove_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/vanilla_mangrove/vangrove_banister_short.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/vanilla_mangrove/vangrove_banister_short.json new file mode 100644 index 0000000000..3024071d86 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/vanilla_mangrove/vangrove_banister_short.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short", + "textures": { + "texture": "minecraft:block/mangrove_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/vanilla_mangrove/vangrove_banister_short_extended.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/vanilla_mangrove/vangrove_banister_short_extended.json new file mode 100644 index 0000000000..a345270624 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/vanilla_mangrove/vangrove_banister_short_extended.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short_extended", + "textures": { + "texture": "minecraft:block/mangrove_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/vanilla_mangrove/vangrove_banister_tall.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/vanilla_mangrove/vangrove_banister_tall.json new file mode 100644 index 0000000000..83db5abc90 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/vanilla_mangrove/vangrove_banister_tall.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall", + "textures": { + "texture": "minecraft:block/mangrove_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/vanilla_mangrove/vangrove_banister_tall_extended.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/vanilla_mangrove/vangrove_banister_tall_extended.json new file mode 100644 index 0000000000..5f69763106 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/vanilla_mangrove/vangrove_banister_tall_extended.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall_extended", + "textures": { + "texture": "minecraft:block/mangrove_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/warped/warped_banister_connected.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/warped/warped_banister_connected.json new file mode 100644 index 0000000000..1eb2d9cef3 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/warped/warped_banister_connected.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected", + "textures": { + "texture": "minecraft:block/warped_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/warped/warped_banister_connected_extended.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/warped/warped_banister_connected_extended.json new file mode 100644 index 0000000000..875a809f10 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/warped/warped_banister_connected_extended.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_connected_extended", + "textures": { + "texture": "minecraft:block/warped_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/warped/warped_banister_short.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/warped/warped_banister_short.json new file mode 100644 index 0000000000..3894fb54ed --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/warped/warped_banister_short.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short", + "textures": { + "texture": "minecraft:block/warped_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/warped/warped_banister_short_extended.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/warped/warped_banister_short_extended.json new file mode 100644 index 0000000000..6811ac3e65 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/warped/warped_banister_short_extended.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_short_extended", + "textures": { + "texture": "minecraft:block/warped_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/warped/warped_banister_tall.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/warped/warped_banister_tall.json new file mode 100644 index 0000000000..3927f3d227 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/warped/warped_banister_tall.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall", + "textures": { + "texture": "minecraft:block/warped_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/banister/warped/warped_banister_tall_extended.json b/src/generated/resources/assets/twilightforest/models/block/wood/banister/warped/warped_banister_tall_extended.json new file mode 100644 index 0000000000..69edb177c5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/banister/warped/warped_banister_tall_extended.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:block/banister_tall_extended", + "textures": { + "texture": "minecraft:block/warped_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/button/canopy/canopy_button.json b/src/generated/resources/assets/twilightforest/models/block/wood/button/canopy/canopy_button.json new file mode 100644 index 0000000000..389d2d4b1f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/button/canopy/canopy_button.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button", + "textures": { + "texture": "twilightforest:block/wood/planks_canopy_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/button/canopy/canopy_button_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/button/canopy/canopy_button_1.json new file mode 100644 index 0000000000..72b923fd45 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/button/canopy/canopy_button_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button", + "textures": { + "texture": "twilightforest:block/wood/planks_canopy_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/button/canopy/canopy_button_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/button/canopy/canopy_button_2.json new file mode 100644 index 0000000000..f6a582e49c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/button/canopy/canopy_button_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button", + "textures": { + "texture": "twilightforest:block/wood/planks_canopy_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/button/canopy/canopy_button_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/button/canopy/canopy_button_3.json new file mode 100644 index 0000000000..031417ed31 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/button/canopy/canopy_button_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button", + "textures": { + "texture": "twilightforest:block/wood/planks_canopy_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/button/canopy/canopy_button_pressed.json b/src/generated/resources/assets/twilightforest/models/block/wood/button/canopy/canopy_button_pressed.json new file mode 100644 index 0000000000..2d48328364 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/button/canopy/canopy_button_pressed.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button_pressed", + "textures": { + "texture": "twilightforest:block/wood/planks_canopy_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/button/canopy/canopy_button_pressed_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/button/canopy/canopy_button_pressed_1.json new file mode 100644 index 0000000000..29e88445e4 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/button/canopy/canopy_button_pressed_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button_pressed", + "textures": { + "texture": "twilightforest:block/wood/planks_canopy_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/button/canopy/canopy_button_pressed_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/button/canopy/canopy_button_pressed_2.json new file mode 100644 index 0000000000..db60f91a61 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/button/canopy/canopy_button_pressed_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button_pressed", + "textures": { + "texture": "twilightforest:block/wood/planks_canopy_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/button/canopy/canopy_button_pressed_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/button/canopy/canopy_button_pressed_3.json new file mode 100644 index 0000000000..bca4b32228 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/button/canopy/canopy_button_pressed_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button_pressed", + "textures": { + "texture": "twilightforest:block/wood/planks_canopy_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/button/darkwood/dark_button.json b/src/generated/resources/assets/twilightforest/models/block/wood/button/darkwood/dark_button.json new file mode 100644 index 0000000000..9bd643d662 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/button/darkwood/dark_button.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button", + "textures": { + "texture": "twilightforest:block/wood/planks_darkwood_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/button/darkwood/dark_button_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/button/darkwood/dark_button_1.json new file mode 100644 index 0000000000..a4c287d77b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/button/darkwood/dark_button_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button", + "textures": { + "texture": "twilightforest:block/wood/planks_darkwood_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/button/darkwood/dark_button_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/button/darkwood/dark_button_2.json new file mode 100644 index 0000000000..f76d3bfa67 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/button/darkwood/dark_button_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button", + "textures": { + "texture": "twilightforest:block/wood/planks_darkwood_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/button/darkwood/dark_button_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/button/darkwood/dark_button_3.json new file mode 100644 index 0000000000..fb667756d6 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/button/darkwood/dark_button_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button", + "textures": { + "texture": "twilightforest:block/wood/planks_darkwood_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/button/darkwood/dark_button_pressed.json b/src/generated/resources/assets/twilightforest/models/block/wood/button/darkwood/dark_button_pressed.json new file mode 100644 index 0000000000..80d4211b62 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/button/darkwood/dark_button_pressed.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button_pressed", + "textures": { + "texture": "twilightforest:block/wood/planks_darkwood_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/button/darkwood/dark_button_pressed_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/button/darkwood/dark_button_pressed_1.json new file mode 100644 index 0000000000..533ed7dd42 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/button/darkwood/dark_button_pressed_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button_pressed", + "textures": { + "texture": "twilightforest:block/wood/planks_darkwood_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/button/darkwood/dark_button_pressed_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/button/darkwood/dark_button_pressed_2.json new file mode 100644 index 0000000000..c45e6a84c4 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/button/darkwood/dark_button_pressed_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button_pressed", + "textures": { + "texture": "twilightforest:block/wood/planks_darkwood_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/button/darkwood/dark_button_pressed_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/button/darkwood/dark_button_pressed_3.json new file mode 100644 index 0000000000..717a6af858 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/button/darkwood/dark_button_pressed_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button_pressed", + "textures": { + "texture": "twilightforest:block/wood/planks_darkwood_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/button/mangrove/mangrove_button.json b/src/generated/resources/assets/twilightforest/models/block/wood/button/mangrove/mangrove_button.json new file mode 100644 index 0000000000..57163b685d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/button/mangrove/mangrove_button.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button", + "textures": { + "texture": "twilightforest:block/wood/planks_mangrove_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/button/mangrove/mangrove_button_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/button/mangrove/mangrove_button_1.json new file mode 100644 index 0000000000..6116739954 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/button/mangrove/mangrove_button_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button", + "textures": { + "texture": "twilightforest:block/wood/planks_mangrove_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/button/mangrove/mangrove_button_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/button/mangrove/mangrove_button_2.json new file mode 100644 index 0000000000..228b0bab2c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/button/mangrove/mangrove_button_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button", + "textures": { + "texture": "twilightforest:block/wood/planks_mangrove_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/button/mangrove/mangrove_button_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/button/mangrove/mangrove_button_3.json new file mode 100644 index 0000000000..d41eaee578 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/button/mangrove/mangrove_button_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button", + "textures": { + "texture": "twilightforest:block/wood/planks_mangrove_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/button/mangrove/mangrove_button_pressed.json b/src/generated/resources/assets/twilightforest/models/block/wood/button/mangrove/mangrove_button_pressed.json new file mode 100644 index 0000000000..c7f2bea182 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/button/mangrove/mangrove_button_pressed.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button_pressed", + "textures": { + "texture": "twilightforest:block/wood/planks_mangrove_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/button/mangrove/mangrove_button_pressed_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/button/mangrove/mangrove_button_pressed_1.json new file mode 100644 index 0000000000..3c7f6f4983 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/button/mangrove/mangrove_button_pressed_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button_pressed", + "textures": { + "texture": "twilightforest:block/wood/planks_mangrove_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/button/mangrove/mangrove_button_pressed_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/button/mangrove/mangrove_button_pressed_2.json new file mode 100644 index 0000000000..29431114aa --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/button/mangrove/mangrove_button_pressed_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button_pressed", + "textures": { + "texture": "twilightforest:block/wood/planks_mangrove_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/button/mangrove/mangrove_button_pressed_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/button/mangrove/mangrove_button_pressed_3.json new file mode 100644 index 0000000000..eeac8c36ec --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/button/mangrove/mangrove_button_pressed_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button_pressed", + "textures": { + "texture": "twilightforest:block/wood/planks_mangrove_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/button/mine/mining_button.json b/src/generated/resources/assets/twilightforest/models/block/wood/button/mine/mining_button.json new file mode 100644 index 0000000000..9935f2469a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/button/mine/mining_button.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button", + "textures": { + "texture": "twilightforest:block/wood/planks_mine_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/button/mine/mining_button_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/button/mine/mining_button_1.json new file mode 100644 index 0000000000..f17794a3c0 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/button/mine/mining_button_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button", + "textures": { + "texture": "twilightforest:block/wood/planks_mine_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/button/mine/mining_button_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/button/mine/mining_button_2.json new file mode 100644 index 0000000000..ccd7d7bb76 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/button/mine/mining_button_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button", + "textures": { + "texture": "twilightforest:block/wood/planks_mine_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/button/mine/mining_button_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/button/mine/mining_button_3.json new file mode 100644 index 0000000000..d80c60cc4f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/button/mine/mining_button_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button", + "textures": { + "texture": "twilightforest:block/wood/planks_mine_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/button/mine/mining_button_pressed.json b/src/generated/resources/assets/twilightforest/models/block/wood/button/mine/mining_button_pressed.json new file mode 100644 index 0000000000..4a1d74951c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/button/mine/mining_button_pressed.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button_pressed", + "textures": { + "texture": "twilightforest:block/wood/planks_mine_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/button/mine/mining_button_pressed_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/button/mine/mining_button_pressed_1.json new file mode 100644 index 0000000000..0f3eb70b3b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/button/mine/mining_button_pressed_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button_pressed", + "textures": { + "texture": "twilightforest:block/wood/planks_mine_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/button/mine/mining_button_pressed_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/button/mine/mining_button_pressed_2.json new file mode 100644 index 0000000000..b132db8ab8 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/button/mine/mining_button_pressed_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button_pressed", + "textures": { + "texture": "twilightforest:block/wood/planks_mine_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/button/mine/mining_button_pressed_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/button/mine/mining_button_pressed_3.json new file mode 100644 index 0000000000..c5d4e98c4f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/button/mine/mining_button_pressed_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button_pressed", + "textures": { + "texture": "twilightforest:block/wood/planks_mine_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/button/sort/sorting_button.json b/src/generated/resources/assets/twilightforest/models/block/wood/button/sort/sorting_button.json new file mode 100644 index 0000000000..473133f4a9 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/button/sort/sorting_button.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button", + "textures": { + "texture": "twilightforest:block/wood/planks_sort_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/button/sort/sorting_button_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/button/sort/sorting_button_1.json new file mode 100644 index 0000000000..513d335dc4 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/button/sort/sorting_button_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button", + "textures": { + "texture": "twilightforest:block/wood/planks_sort_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/button/sort/sorting_button_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/button/sort/sorting_button_2.json new file mode 100644 index 0000000000..9b3a301662 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/button/sort/sorting_button_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button", + "textures": { + "texture": "twilightforest:block/wood/planks_sort_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/button/sort/sorting_button_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/button/sort/sorting_button_3.json new file mode 100644 index 0000000000..4fd77cb9ba --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/button/sort/sorting_button_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button", + "textures": { + "texture": "twilightforest:block/wood/planks_sort_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/button/sort/sorting_button_pressed.json b/src/generated/resources/assets/twilightforest/models/block/wood/button/sort/sorting_button_pressed.json new file mode 100644 index 0000000000..733fa99dcd --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/button/sort/sorting_button_pressed.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button_pressed", + "textures": { + "texture": "twilightforest:block/wood/planks_sort_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/button/sort/sorting_button_pressed_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/button/sort/sorting_button_pressed_1.json new file mode 100644 index 0000000000..3bd5afc630 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/button/sort/sorting_button_pressed_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button_pressed", + "textures": { + "texture": "twilightforest:block/wood/planks_sort_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/button/sort/sorting_button_pressed_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/button/sort/sorting_button_pressed_2.json new file mode 100644 index 0000000000..2a28897565 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/button/sort/sorting_button_pressed_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button_pressed", + "textures": { + "texture": "twilightforest:block/wood/planks_sort_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/button/sort/sorting_button_pressed_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/button/sort/sorting_button_pressed_3.json new file mode 100644 index 0000000000..28163e5d7b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/button/sort/sorting_button_pressed_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button_pressed", + "textures": { + "texture": "twilightforest:block/wood/planks_sort_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/button/time/time_button.json b/src/generated/resources/assets/twilightforest/models/block/wood/button/time/time_button.json new file mode 100644 index 0000000000..74d67a676c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/button/time/time_button.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button", + "textures": { + "texture": "twilightforest:block/wood/planks_time_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/button/time/time_button_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/button/time/time_button_1.json new file mode 100644 index 0000000000..5c90a170d9 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/button/time/time_button_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button", + "textures": { + "texture": "twilightforest:block/wood/planks_time_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/button/time/time_button_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/button/time/time_button_2.json new file mode 100644 index 0000000000..4669c753a0 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/button/time/time_button_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button", + "textures": { + "texture": "twilightforest:block/wood/planks_time_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/button/time/time_button_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/button/time/time_button_3.json new file mode 100644 index 0000000000..a1e148a24a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/button/time/time_button_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button", + "textures": { + "texture": "twilightforest:block/wood/planks_time_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/button/time/time_button_pressed.json b/src/generated/resources/assets/twilightforest/models/block/wood/button/time/time_button_pressed.json new file mode 100644 index 0000000000..4c5d401bd7 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/button/time/time_button_pressed.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button_pressed", + "textures": { + "texture": "twilightforest:block/wood/planks_time_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/button/time/time_button_pressed_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/button/time/time_button_pressed_1.json new file mode 100644 index 0000000000..5b07636a96 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/button/time/time_button_pressed_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button_pressed", + "textures": { + "texture": "twilightforest:block/wood/planks_time_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/button/time/time_button_pressed_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/button/time/time_button_pressed_2.json new file mode 100644 index 0000000000..d8d3df6a18 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/button/time/time_button_pressed_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button_pressed", + "textures": { + "texture": "twilightforest:block/wood/planks_time_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/button/time/time_button_pressed_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/button/time/time_button_pressed_3.json new file mode 100644 index 0000000000..c9856492a1 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/button/time/time_button_pressed_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button_pressed", + "textures": { + "texture": "twilightforest:block/wood/planks_time_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/button/trans/transformation_button.json b/src/generated/resources/assets/twilightforest/models/block/wood/button/trans/transformation_button.json new file mode 100644 index 0000000000..becf12f980 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/button/trans/transformation_button.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button", + "textures": { + "texture": "twilightforest:block/wood/planks_trans_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/button/trans/transformation_button_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/button/trans/transformation_button_1.json new file mode 100644 index 0000000000..3d671fe0f2 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/button/trans/transformation_button_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button", + "textures": { + "texture": "twilightforest:block/wood/planks_trans_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/button/trans/transformation_button_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/button/trans/transformation_button_2.json new file mode 100644 index 0000000000..0fd25ddd28 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/button/trans/transformation_button_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button", + "textures": { + "texture": "twilightforest:block/wood/planks_trans_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/button/trans/transformation_button_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/button/trans/transformation_button_3.json new file mode 100644 index 0000000000..eb7f25cfae --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/button/trans/transformation_button_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button", + "textures": { + "texture": "twilightforest:block/wood/planks_trans_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/button/trans/transformation_button_pressed.json b/src/generated/resources/assets/twilightforest/models/block/wood/button/trans/transformation_button_pressed.json new file mode 100644 index 0000000000..65719bc700 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/button/trans/transformation_button_pressed.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button_pressed", + "textures": { + "texture": "twilightforest:block/wood/planks_trans_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/button/trans/transformation_button_pressed_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/button/trans/transformation_button_pressed_1.json new file mode 100644 index 0000000000..e1672d1711 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/button/trans/transformation_button_pressed_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button_pressed", + "textures": { + "texture": "twilightforest:block/wood/planks_trans_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/button/trans/transformation_button_pressed_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/button/trans/transformation_button_pressed_2.json new file mode 100644 index 0000000000..43581f9be0 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/button/trans/transformation_button_pressed_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button_pressed", + "textures": { + "texture": "twilightforest:block/wood/planks_trans_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/button/trans/transformation_button_pressed_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/button/trans/transformation_button_pressed_3.json new file mode 100644 index 0000000000..43b620f28b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/button/trans/transformation_button_pressed_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button_pressed", + "textures": { + "texture": "twilightforest:block/wood/planks_trans_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/button/twilight_oak/twilight_oak_button.json b/src/generated/resources/assets/twilightforest/models/block/wood/button/twilight_oak/twilight_oak_button.json new file mode 100644 index 0000000000..574d188235 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/button/twilight_oak/twilight_oak_button.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button", + "textures": { + "texture": "twilightforest:block/wood/planks_twilight_oak_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/button/twilight_oak/twilight_oak_button_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/button/twilight_oak/twilight_oak_button_1.json new file mode 100644 index 0000000000..a58bc23aa0 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/button/twilight_oak/twilight_oak_button_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button", + "textures": { + "texture": "twilightforest:block/wood/planks_twilight_oak_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/button/twilight_oak/twilight_oak_button_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/button/twilight_oak/twilight_oak_button_2.json new file mode 100644 index 0000000000..e1fb866957 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/button/twilight_oak/twilight_oak_button_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button", + "textures": { + "texture": "twilightforest:block/wood/planks_twilight_oak_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/button/twilight_oak/twilight_oak_button_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/button/twilight_oak/twilight_oak_button_3.json new file mode 100644 index 0000000000..0c471f27bf --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/button/twilight_oak/twilight_oak_button_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button", + "textures": { + "texture": "twilightforest:block/wood/planks_twilight_oak_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/button/twilight_oak/twilight_oak_button_pressed.json b/src/generated/resources/assets/twilightforest/models/block/wood/button/twilight_oak/twilight_oak_button_pressed.json new file mode 100644 index 0000000000..58685a3ba8 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/button/twilight_oak/twilight_oak_button_pressed.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button_pressed", + "textures": { + "texture": "twilightforest:block/wood/planks_twilight_oak_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/button/twilight_oak/twilight_oak_button_pressed_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/button/twilight_oak/twilight_oak_button_pressed_1.json new file mode 100644 index 0000000000..9a00d6ddec --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/button/twilight_oak/twilight_oak_button_pressed_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button_pressed", + "textures": { + "texture": "twilightforest:block/wood/planks_twilight_oak_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/button/twilight_oak/twilight_oak_button_pressed_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/button/twilight_oak/twilight_oak_button_pressed_2.json new file mode 100644 index 0000000000..ed7b5edfa7 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/button/twilight_oak/twilight_oak_button_pressed_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button_pressed", + "textures": { + "texture": "twilightforest:block/wood/planks_twilight_oak_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/button/twilight_oak/twilight_oak_button_pressed_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/button/twilight_oak/twilight_oak_button_pressed_3.json new file mode 100644 index 0000000000..24df1d001a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/button/twilight_oak/twilight_oak_button_pressed_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button_pressed", + "textures": { + "texture": "twilightforest:block/wood/planks_twilight_oak_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/door/canopy/canopy_door_door_bottom_left.json b/src/generated/resources/assets/twilightforest/models/block/wood/door/canopy/canopy_door_door_bottom_left.json new file mode 100644 index 0000000000..33b66d155a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/door/canopy/canopy_door_door_bottom_left.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_bottom_left", + "textures": { + "bottom": "twilightforest:block/wood/door/canopy_lower", + "top": "twilightforest:block/wood/door/canopy_upper" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/door/canopy/canopy_door_door_bottom_left_open.json b/src/generated/resources/assets/twilightforest/models/block/wood/door/canopy/canopy_door_door_bottom_left_open.json new file mode 100644 index 0000000000..72df84cf2f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/door/canopy/canopy_door_door_bottom_left_open.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_bottom_left_open", + "textures": { + "bottom": "twilightforest:block/wood/door/canopy_lower", + "top": "twilightforest:block/wood/door/canopy_upper" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/door/canopy/canopy_door_door_bottom_right.json b/src/generated/resources/assets/twilightforest/models/block/wood/door/canopy/canopy_door_door_bottom_right.json new file mode 100644 index 0000000000..c387fbee5f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/door/canopy/canopy_door_door_bottom_right.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_bottom_right", + "textures": { + "bottom": "twilightforest:block/wood/door/canopy_lower", + "top": "twilightforest:block/wood/door/canopy_upper" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/door/canopy/canopy_door_door_bottom_right_open.json b/src/generated/resources/assets/twilightforest/models/block/wood/door/canopy/canopy_door_door_bottom_right_open.json new file mode 100644 index 0000000000..769e1b10b2 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/door/canopy/canopy_door_door_bottom_right_open.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_bottom_right_open", + "textures": { + "bottom": "twilightforest:block/wood/door/canopy_lower", + "top": "twilightforest:block/wood/door/canopy_upper" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/door/canopy/canopy_door_door_top_left.json b/src/generated/resources/assets/twilightforest/models/block/wood/door/canopy/canopy_door_door_top_left.json new file mode 100644 index 0000000000..3dcac6a83c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/door/canopy/canopy_door_door_top_left.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_top_left", + "textures": { + "bottom": "twilightforest:block/wood/door/canopy_lower", + "top": "twilightforest:block/wood/door/canopy_upper" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/door/canopy/canopy_door_door_top_left_open.json b/src/generated/resources/assets/twilightforest/models/block/wood/door/canopy/canopy_door_door_top_left_open.json new file mode 100644 index 0000000000..4e9acc5b25 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/door/canopy/canopy_door_door_top_left_open.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_top_left_open", + "textures": { + "bottom": "twilightforest:block/wood/door/canopy_lower", + "top": "twilightforest:block/wood/door/canopy_upper" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/door/canopy/canopy_door_door_top_right.json b/src/generated/resources/assets/twilightforest/models/block/wood/door/canopy/canopy_door_door_top_right.json new file mode 100644 index 0000000000..6e009c566d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/door/canopy/canopy_door_door_top_right.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_top_right", + "textures": { + "bottom": "twilightforest:block/wood/door/canopy_lower", + "top": "twilightforest:block/wood/door/canopy_upper" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/door/canopy/canopy_door_door_top_right_open.json b/src/generated/resources/assets/twilightforest/models/block/wood/door/canopy/canopy_door_door_top_right_open.json new file mode 100644 index 0000000000..02a8d4eeca --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/door/canopy/canopy_door_door_top_right_open.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_top_right_open", + "textures": { + "bottom": "twilightforest:block/wood/door/canopy_lower", + "top": "twilightforest:block/wood/door/canopy_upper" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/door/darkwood/dark_door_door_bottom_left.json b/src/generated/resources/assets/twilightforest/models/block/wood/door/darkwood/dark_door_door_bottom_left.json new file mode 100644 index 0000000000..44b39352a7 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/door/darkwood/dark_door_door_bottom_left.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_bottom_left", + "textures": { + "bottom": "twilightforest:block/wood/door/darkwood_lower", + "top": "twilightforest:block/wood/door/darkwood_upper" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/door/darkwood/dark_door_door_bottom_left_open.json b/src/generated/resources/assets/twilightforest/models/block/wood/door/darkwood/dark_door_door_bottom_left_open.json new file mode 100644 index 0000000000..6b632f8e36 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/door/darkwood/dark_door_door_bottom_left_open.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_bottom_left_open", + "textures": { + "bottom": "twilightforest:block/wood/door/darkwood_lower", + "top": "twilightforest:block/wood/door/darkwood_upper" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/door/darkwood/dark_door_door_bottom_right.json b/src/generated/resources/assets/twilightforest/models/block/wood/door/darkwood/dark_door_door_bottom_right.json new file mode 100644 index 0000000000..aa32fe7808 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/door/darkwood/dark_door_door_bottom_right.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_bottom_right", + "textures": { + "bottom": "twilightforest:block/wood/door/darkwood_lower", + "top": "twilightforest:block/wood/door/darkwood_upper" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/door/darkwood/dark_door_door_bottom_right_open.json b/src/generated/resources/assets/twilightforest/models/block/wood/door/darkwood/dark_door_door_bottom_right_open.json new file mode 100644 index 0000000000..d3c9210f56 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/door/darkwood/dark_door_door_bottom_right_open.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_bottom_right_open", + "textures": { + "bottom": "twilightforest:block/wood/door/darkwood_lower", + "top": "twilightforest:block/wood/door/darkwood_upper" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/door/darkwood/dark_door_door_top_left.json b/src/generated/resources/assets/twilightforest/models/block/wood/door/darkwood/dark_door_door_top_left.json new file mode 100644 index 0000000000..4dd5231bcc --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/door/darkwood/dark_door_door_top_left.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_top_left", + "textures": { + "bottom": "twilightforest:block/wood/door/darkwood_lower", + "top": "twilightforest:block/wood/door/darkwood_upper" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/door/darkwood/dark_door_door_top_left_open.json b/src/generated/resources/assets/twilightforest/models/block/wood/door/darkwood/dark_door_door_top_left_open.json new file mode 100644 index 0000000000..39ab6653ac --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/door/darkwood/dark_door_door_top_left_open.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_top_left_open", + "textures": { + "bottom": "twilightforest:block/wood/door/darkwood_lower", + "top": "twilightforest:block/wood/door/darkwood_upper" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/door/darkwood/dark_door_door_top_right.json b/src/generated/resources/assets/twilightforest/models/block/wood/door/darkwood/dark_door_door_top_right.json new file mode 100644 index 0000000000..5ddb9eb71e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/door/darkwood/dark_door_door_top_right.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_top_right", + "textures": { + "bottom": "twilightforest:block/wood/door/darkwood_lower", + "top": "twilightforest:block/wood/door/darkwood_upper" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/door/darkwood/dark_door_door_top_right_open.json b/src/generated/resources/assets/twilightforest/models/block/wood/door/darkwood/dark_door_door_top_right_open.json new file mode 100644 index 0000000000..3077f28b2c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/door/darkwood/dark_door_door_top_right_open.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_top_right_open", + "textures": { + "bottom": "twilightforest:block/wood/door/darkwood_lower", + "top": "twilightforest:block/wood/door/darkwood_upper" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/door/mangrove/mangrove_door_door_bottom_left.json b/src/generated/resources/assets/twilightforest/models/block/wood/door/mangrove/mangrove_door_door_bottom_left.json new file mode 100644 index 0000000000..7ca7b95a1e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/door/mangrove/mangrove_door_door_bottom_left.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_bottom_left", + "textures": { + "bottom": "twilightforest:block/wood/door/mangrove_lower", + "top": "twilightforest:block/wood/door/mangrove_upper" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/door/mangrove/mangrove_door_door_bottom_left_open.json b/src/generated/resources/assets/twilightforest/models/block/wood/door/mangrove/mangrove_door_door_bottom_left_open.json new file mode 100644 index 0000000000..4c606d316c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/door/mangrove/mangrove_door_door_bottom_left_open.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_bottom_left_open", + "textures": { + "bottom": "twilightforest:block/wood/door/mangrove_lower", + "top": "twilightforest:block/wood/door/mangrove_upper" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/door/mangrove/mangrove_door_door_bottom_right.json b/src/generated/resources/assets/twilightforest/models/block/wood/door/mangrove/mangrove_door_door_bottom_right.json new file mode 100644 index 0000000000..1969bde3a3 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/door/mangrove/mangrove_door_door_bottom_right.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_bottom_right", + "textures": { + "bottom": "twilightforest:block/wood/door/mangrove_lower", + "top": "twilightforest:block/wood/door/mangrove_upper" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/door/mangrove/mangrove_door_door_bottom_right_open.json b/src/generated/resources/assets/twilightforest/models/block/wood/door/mangrove/mangrove_door_door_bottom_right_open.json new file mode 100644 index 0000000000..708eb7c96f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/door/mangrove/mangrove_door_door_bottom_right_open.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_bottom_right_open", + "textures": { + "bottom": "twilightforest:block/wood/door/mangrove_lower", + "top": "twilightforest:block/wood/door/mangrove_upper" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/door/mangrove/mangrove_door_door_top_left.json b/src/generated/resources/assets/twilightforest/models/block/wood/door/mangrove/mangrove_door_door_top_left.json new file mode 100644 index 0000000000..bf10f5060f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/door/mangrove/mangrove_door_door_top_left.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_top_left", + "textures": { + "bottom": "twilightforest:block/wood/door/mangrove_lower", + "top": "twilightforest:block/wood/door/mangrove_upper" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/door/mangrove/mangrove_door_door_top_left_open.json b/src/generated/resources/assets/twilightforest/models/block/wood/door/mangrove/mangrove_door_door_top_left_open.json new file mode 100644 index 0000000000..96e623c128 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/door/mangrove/mangrove_door_door_top_left_open.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_top_left_open", + "textures": { + "bottom": "twilightforest:block/wood/door/mangrove_lower", + "top": "twilightforest:block/wood/door/mangrove_upper" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/door/mangrove/mangrove_door_door_top_right.json b/src/generated/resources/assets/twilightforest/models/block/wood/door/mangrove/mangrove_door_door_top_right.json new file mode 100644 index 0000000000..460f39b261 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/door/mangrove/mangrove_door_door_top_right.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_top_right", + "textures": { + "bottom": "twilightforest:block/wood/door/mangrove_lower", + "top": "twilightforest:block/wood/door/mangrove_upper" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/door/mangrove/mangrove_door_door_top_right_open.json b/src/generated/resources/assets/twilightforest/models/block/wood/door/mangrove/mangrove_door_door_top_right_open.json new file mode 100644 index 0000000000..2d7f9fbe3f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/door/mangrove/mangrove_door_door_top_right_open.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_top_right_open", + "textures": { + "bottom": "twilightforest:block/wood/door/mangrove_lower", + "top": "twilightforest:block/wood/door/mangrove_upper" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/door/mine/mining_door_door_bottom_left.json b/src/generated/resources/assets/twilightforest/models/block/wood/door/mine/mining_door_door_bottom_left.json new file mode 100644 index 0000000000..1b5b6e7183 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/door/mine/mining_door_door_bottom_left.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_bottom_left", + "textures": { + "bottom": "twilightforest:block/wood/door/mine_lower", + "top": "twilightforest:block/wood/door/mine_upper" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/door/mine/mining_door_door_bottom_left_open.json b/src/generated/resources/assets/twilightforest/models/block/wood/door/mine/mining_door_door_bottom_left_open.json new file mode 100644 index 0000000000..41cb6a11c7 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/door/mine/mining_door_door_bottom_left_open.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_bottom_left_open", + "textures": { + "bottom": "twilightforest:block/wood/door/mine_lower", + "top": "twilightforest:block/wood/door/mine_upper" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/door/mine/mining_door_door_bottom_right.json b/src/generated/resources/assets/twilightforest/models/block/wood/door/mine/mining_door_door_bottom_right.json new file mode 100644 index 0000000000..cc0480804e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/door/mine/mining_door_door_bottom_right.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_bottom_right", + "textures": { + "bottom": "twilightforest:block/wood/door/mine_lower", + "top": "twilightforest:block/wood/door/mine_upper" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/door/mine/mining_door_door_bottom_right_open.json b/src/generated/resources/assets/twilightforest/models/block/wood/door/mine/mining_door_door_bottom_right_open.json new file mode 100644 index 0000000000..7f671c73df --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/door/mine/mining_door_door_bottom_right_open.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_bottom_right_open", + "textures": { + "bottom": "twilightforest:block/wood/door/mine_lower", + "top": "twilightforest:block/wood/door/mine_upper" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/door/mine/mining_door_door_top_left.json b/src/generated/resources/assets/twilightforest/models/block/wood/door/mine/mining_door_door_top_left.json new file mode 100644 index 0000000000..47ee41d486 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/door/mine/mining_door_door_top_left.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_top_left", + "textures": { + "bottom": "twilightforest:block/wood/door/mine_lower", + "top": "twilightforest:block/wood/door/mine_upper" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/door/mine/mining_door_door_top_left_open.json b/src/generated/resources/assets/twilightforest/models/block/wood/door/mine/mining_door_door_top_left_open.json new file mode 100644 index 0000000000..75bc0c89bc --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/door/mine/mining_door_door_top_left_open.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_top_left_open", + "textures": { + "bottom": "twilightforest:block/wood/door/mine_lower", + "top": "twilightforest:block/wood/door/mine_upper" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/door/mine/mining_door_door_top_right.json b/src/generated/resources/assets/twilightforest/models/block/wood/door/mine/mining_door_door_top_right.json new file mode 100644 index 0000000000..0cc8209362 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/door/mine/mining_door_door_top_right.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_top_right", + "textures": { + "bottom": "twilightforest:block/wood/door/mine_lower", + "top": "twilightforest:block/wood/door/mine_upper" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/door/mine/mining_door_door_top_right_open.json b/src/generated/resources/assets/twilightforest/models/block/wood/door/mine/mining_door_door_top_right_open.json new file mode 100644 index 0000000000..b1ec3a0b6a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/door/mine/mining_door_door_top_right_open.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_top_right_open", + "textures": { + "bottom": "twilightforest:block/wood/door/mine_lower", + "top": "twilightforest:block/wood/door/mine_upper" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/door/sort/sorting_door_door_bottom_left.json b/src/generated/resources/assets/twilightforest/models/block/wood/door/sort/sorting_door_door_bottom_left.json new file mode 100644 index 0000000000..36ad88db4f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/door/sort/sorting_door_door_bottom_left.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/door_bottom_left", + "render_type": "minecraft:cutout", + "textures": { + "bottom": "twilightforest:block/wood/door/sort_lower", + "top": "twilightforest:block/wood/door/sort_upper" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/door/sort/sorting_door_door_bottom_left_open.json b/src/generated/resources/assets/twilightforest/models/block/wood/door/sort/sorting_door_door_bottom_left_open.json new file mode 100644 index 0000000000..a1855475c2 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/door/sort/sorting_door_door_bottom_left_open.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/door_bottom_left_open", + "render_type": "minecraft:cutout", + "textures": { + "bottom": "twilightforest:block/wood/door/sort_lower", + "top": "twilightforest:block/wood/door/sort_upper" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/door/sort/sorting_door_door_bottom_right.json b/src/generated/resources/assets/twilightforest/models/block/wood/door/sort/sorting_door_door_bottom_right.json new file mode 100644 index 0000000000..9bd7e93645 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/door/sort/sorting_door_door_bottom_right.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/door_bottom_right", + "render_type": "minecraft:cutout", + "textures": { + "bottom": "twilightforest:block/wood/door/sort_lower", + "top": "twilightforest:block/wood/door/sort_upper" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/door/sort/sorting_door_door_bottom_right_open.json b/src/generated/resources/assets/twilightforest/models/block/wood/door/sort/sorting_door_door_bottom_right_open.json new file mode 100644 index 0000000000..5fe037351e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/door/sort/sorting_door_door_bottom_right_open.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/door_bottom_right_open", + "render_type": "minecraft:cutout", + "textures": { + "bottom": "twilightforest:block/wood/door/sort_lower", + "top": "twilightforest:block/wood/door/sort_upper" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/door/sort/sorting_door_door_top_left.json b/src/generated/resources/assets/twilightforest/models/block/wood/door/sort/sorting_door_door_top_left.json new file mode 100644 index 0000000000..6a194441f4 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/door/sort/sorting_door_door_top_left.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/door_top_left", + "render_type": "minecraft:cutout", + "textures": { + "bottom": "twilightforest:block/wood/door/sort_lower", + "top": "twilightforest:block/wood/door/sort_upper" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/door/sort/sorting_door_door_top_left_open.json b/src/generated/resources/assets/twilightforest/models/block/wood/door/sort/sorting_door_door_top_left_open.json new file mode 100644 index 0000000000..420b851d27 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/door/sort/sorting_door_door_top_left_open.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/door_top_left_open", + "render_type": "minecraft:cutout", + "textures": { + "bottom": "twilightforest:block/wood/door/sort_lower", + "top": "twilightforest:block/wood/door/sort_upper" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/door/sort/sorting_door_door_top_right.json b/src/generated/resources/assets/twilightforest/models/block/wood/door/sort/sorting_door_door_top_right.json new file mode 100644 index 0000000000..1b434cc42d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/door/sort/sorting_door_door_top_right.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/door_top_right", + "render_type": "minecraft:cutout", + "textures": { + "bottom": "twilightforest:block/wood/door/sort_lower", + "top": "twilightforest:block/wood/door/sort_upper" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/door/sort/sorting_door_door_top_right_open.json b/src/generated/resources/assets/twilightforest/models/block/wood/door/sort/sorting_door_door_top_right_open.json new file mode 100644 index 0000000000..1448f00754 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/door/sort/sorting_door_door_top_right_open.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/door_top_right_open", + "render_type": "minecraft:cutout", + "textures": { + "bottom": "twilightforest:block/wood/door/sort_lower", + "top": "twilightforest:block/wood/door/sort_upper" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/door/time/time_door_door_bottom_left.json b/src/generated/resources/assets/twilightforest/models/block/wood/door/time/time_door_door_bottom_left.json new file mode 100644 index 0000000000..927c830adc --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/door/time/time_door_door_bottom_left.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/door_bottom_left", + "render_type": "minecraft:cutout", + "textures": { + "bottom": "twilightforest:block/wood/door/time_lower", + "top": "twilightforest:block/wood/door/time_upper" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/door/time/time_door_door_bottom_left_open.json b/src/generated/resources/assets/twilightforest/models/block/wood/door/time/time_door_door_bottom_left_open.json new file mode 100644 index 0000000000..f1fd1c603f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/door/time/time_door_door_bottom_left_open.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/door_bottom_left_open", + "render_type": "minecraft:cutout", + "textures": { + "bottom": "twilightforest:block/wood/door/time_lower", + "top": "twilightforest:block/wood/door/time_upper" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/door/time/time_door_door_bottom_right.json b/src/generated/resources/assets/twilightforest/models/block/wood/door/time/time_door_door_bottom_right.json new file mode 100644 index 0000000000..fc24aca70e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/door/time/time_door_door_bottom_right.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/door_bottom_right", + "render_type": "minecraft:cutout", + "textures": { + "bottom": "twilightforest:block/wood/door/time_lower", + "top": "twilightforest:block/wood/door/time_upper" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/door/time/time_door_door_bottom_right_open.json b/src/generated/resources/assets/twilightforest/models/block/wood/door/time/time_door_door_bottom_right_open.json new file mode 100644 index 0000000000..6fd204b110 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/door/time/time_door_door_bottom_right_open.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/door_bottom_right_open", + "render_type": "minecraft:cutout", + "textures": { + "bottom": "twilightforest:block/wood/door/time_lower", + "top": "twilightforest:block/wood/door/time_upper" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/door/time/time_door_door_top_left.json b/src/generated/resources/assets/twilightforest/models/block/wood/door/time/time_door_door_top_left.json new file mode 100644 index 0000000000..ff5758a795 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/door/time/time_door_door_top_left.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/door_top_left", + "render_type": "minecraft:cutout", + "textures": { + "bottom": "twilightforest:block/wood/door/time_lower", + "top": "twilightforest:block/wood/door/time_upper" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/door/time/time_door_door_top_left_open.json b/src/generated/resources/assets/twilightforest/models/block/wood/door/time/time_door_door_top_left_open.json new file mode 100644 index 0000000000..af7689a60a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/door/time/time_door_door_top_left_open.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/door_top_left_open", + "render_type": "minecraft:cutout", + "textures": { + "bottom": "twilightforest:block/wood/door/time_lower", + "top": "twilightforest:block/wood/door/time_upper" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/door/time/time_door_door_top_right.json b/src/generated/resources/assets/twilightforest/models/block/wood/door/time/time_door_door_top_right.json new file mode 100644 index 0000000000..f15ebf37b5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/door/time/time_door_door_top_right.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/door_top_right", + "render_type": "minecraft:cutout", + "textures": { + "bottom": "twilightforest:block/wood/door/time_lower", + "top": "twilightforest:block/wood/door/time_upper" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/door/time/time_door_door_top_right_open.json b/src/generated/resources/assets/twilightforest/models/block/wood/door/time/time_door_door_top_right_open.json new file mode 100644 index 0000000000..eb188e1935 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/door/time/time_door_door_top_right_open.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/door_top_right_open", + "render_type": "minecraft:cutout", + "textures": { + "bottom": "twilightforest:block/wood/door/time_lower", + "top": "twilightforest:block/wood/door/time_upper" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/door/trans/transformation_door_door_bottom_left.json b/src/generated/resources/assets/twilightforest/models/block/wood/door/trans/transformation_door_door_bottom_left.json new file mode 100644 index 0000000000..f17f18a44e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/door/trans/transformation_door_door_bottom_left.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/door_bottom_left", + "render_type": "minecraft:cutout", + "textures": { + "bottom": "twilightforest:block/wood/door/trans_lower", + "top": "twilightforest:block/wood/door/trans_upper" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/door/trans/transformation_door_door_bottom_left_open.json b/src/generated/resources/assets/twilightforest/models/block/wood/door/trans/transformation_door_door_bottom_left_open.json new file mode 100644 index 0000000000..0506080952 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/door/trans/transformation_door_door_bottom_left_open.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/door_bottom_left_open", + "render_type": "minecraft:cutout", + "textures": { + "bottom": "twilightforest:block/wood/door/trans_lower", + "top": "twilightforest:block/wood/door/trans_upper" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/door/trans/transformation_door_door_bottom_right.json b/src/generated/resources/assets/twilightforest/models/block/wood/door/trans/transformation_door_door_bottom_right.json new file mode 100644 index 0000000000..92cd26a49f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/door/trans/transformation_door_door_bottom_right.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/door_bottom_right", + "render_type": "minecraft:cutout", + "textures": { + "bottom": "twilightforest:block/wood/door/trans_lower", + "top": "twilightforest:block/wood/door/trans_upper" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/door/trans/transformation_door_door_bottom_right_open.json b/src/generated/resources/assets/twilightforest/models/block/wood/door/trans/transformation_door_door_bottom_right_open.json new file mode 100644 index 0000000000..f2605909ac --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/door/trans/transformation_door_door_bottom_right_open.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/door_bottom_right_open", + "render_type": "minecraft:cutout", + "textures": { + "bottom": "twilightforest:block/wood/door/trans_lower", + "top": "twilightforest:block/wood/door/trans_upper" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/door/trans/transformation_door_door_top_left.json b/src/generated/resources/assets/twilightforest/models/block/wood/door/trans/transformation_door_door_top_left.json new file mode 100644 index 0000000000..5e89ee564b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/door/trans/transformation_door_door_top_left.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/door_top_left", + "render_type": "minecraft:cutout", + "textures": { + "bottom": "twilightforest:block/wood/door/trans_lower", + "top": "twilightforest:block/wood/door/trans_upper" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/door/trans/transformation_door_door_top_left_open.json b/src/generated/resources/assets/twilightforest/models/block/wood/door/trans/transformation_door_door_top_left_open.json new file mode 100644 index 0000000000..f3b0016ef8 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/door/trans/transformation_door_door_top_left_open.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/door_top_left_open", + "render_type": "minecraft:cutout", + "textures": { + "bottom": "twilightforest:block/wood/door/trans_lower", + "top": "twilightforest:block/wood/door/trans_upper" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/door/trans/transformation_door_door_top_right.json b/src/generated/resources/assets/twilightforest/models/block/wood/door/trans/transformation_door_door_top_right.json new file mode 100644 index 0000000000..29892655cc --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/door/trans/transformation_door_door_top_right.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/door_top_right", + "render_type": "minecraft:cutout", + "textures": { + "bottom": "twilightforest:block/wood/door/trans_lower", + "top": "twilightforest:block/wood/door/trans_upper" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/door/trans/transformation_door_door_top_right_open.json b/src/generated/resources/assets/twilightforest/models/block/wood/door/trans/transformation_door_door_top_right_open.json new file mode 100644 index 0000000000..07cf009da1 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/door/trans/transformation_door_door_top_right_open.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/door_top_right_open", + "render_type": "minecraft:cutout", + "textures": { + "bottom": "twilightforest:block/wood/door/trans_lower", + "top": "twilightforest:block/wood/door/trans_upper" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/door/twilight_oak/twilight_oak_door_door_bottom_left.json b/src/generated/resources/assets/twilightforest/models/block/wood/door/twilight_oak/twilight_oak_door_door_bottom_left.json new file mode 100644 index 0000000000..a827d59e49 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/door/twilight_oak/twilight_oak_door_door_bottom_left.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_bottom_left", + "textures": { + "bottom": "twilightforest:block/wood/door/twilight_oak_lower", + "top": "twilightforest:block/wood/door/twilight_oak_upper" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/door/twilight_oak/twilight_oak_door_door_bottom_left_open.json b/src/generated/resources/assets/twilightforest/models/block/wood/door/twilight_oak/twilight_oak_door_door_bottom_left_open.json new file mode 100644 index 0000000000..99bf6cc112 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/door/twilight_oak/twilight_oak_door_door_bottom_left_open.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_bottom_left_open", + "textures": { + "bottom": "twilightforest:block/wood/door/twilight_oak_lower", + "top": "twilightforest:block/wood/door/twilight_oak_upper" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/door/twilight_oak/twilight_oak_door_door_bottom_right.json b/src/generated/resources/assets/twilightforest/models/block/wood/door/twilight_oak/twilight_oak_door_door_bottom_right.json new file mode 100644 index 0000000000..3a56791b3b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/door/twilight_oak/twilight_oak_door_door_bottom_right.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_bottom_right", + "textures": { + "bottom": "twilightforest:block/wood/door/twilight_oak_lower", + "top": "twilightforest:block/wood/door/twilight_oak_upper" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/door/twilight_oak/twilight_oak_door_door_bottom_right_open.json b/src/generated/resources/assets/twilightforest/models/block/wood/door/twilight_oak/twilight_oak_door_door_bottom_right_open.json new file mode 100644 index 0000000000..3b14d4e715 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/door/twilight_oak/twilight_oak_door_door_bottom_right_open.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_bottom_right_open", + "textures": { + "bottom": "twilightforest:block/wood/door/twilight_oak_lower", + "top": "twilightforest:block/wood/door/twilight_oak_upper" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/door/twilight_oak/twilight_oak_door_door_top_left.json b/src/generated/resources/assets/twilightforest/models/block/wood/door/twilight_oak/twilight_oak_door_door_top_left.json new file mode 100644 index 0000000000..6db62a159e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/door/twilight_oak/twilight_oak_door_door_top_left.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_top_left", + "textures": { + "bottom": "twilightforest:block/wood/door/twilight_oak_lower", + "top": "twilightforest:block/wood/door/twilight_oak_upper" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/door/twilight_oak/twilight_oak_door_door_top_left_open.json b/src/generated/resources/assets/twilightforest/models/block/wood/door/twilight_oak/twilight_oak_door_door_top_left_open.json new file mode 100644 index 0000000000..95c2cab078 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/door/twilight_oak/twilight_oak_door_door_top_left_open.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_top_left_open", + "textures": { + "bottom": "twilightforest:block/wood/door/twilight_oak_lower", + "top": "twilightforest:block/wood/door/twilight_oak_upper" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/door/twilight_oak/twilight_oak_door_door_top_right.json b/src/generated/resources/assets/twilightforest/models/block/wood/door/twilight_oak/twilight_oak_door_door_top_right.json new file mode 100644 index 0000000000..13558d55cd --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/door/twilight_oak/twilight_oak_door_door_top_right.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_top_right", + "textures": { + "bottom": "twilightforest:block/wood/door/twilight_oak_lower", + "top": "twilightforest:block/wood/door/twilight_oak_upper" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/door/twilight_oak/twilight_oak_door_door_top_right_open.json b/src/generated/resources/assets/twilightforest/models/block/wood/door/twilight_oak/twilight_oak_door_door_top_right_open.json new file mode 100644 index 0000000000..273b604f67 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/door/twilight_oak/twilight_oak_door_door_top_right_open.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_top_right_open", + "textures": { + "bottom": "twilightforest:block/wood/door/twilight_oak_lower", + "top": "twilightforest:block/wood/door/twilight_oak_upper" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence/canopy/canopy_fence_post.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence/canopy/canopy_fence_post.json new file mode 100644 index 0000000000..47812dcbc5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence/canopy/canopy_fence_post.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_post", + "textures": { + "texture": "twilightforest:block/wood/planks_canopy_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence/canopy/canopy_fence_post_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence/canopy/canopy_fence_post_1.json new file mode 100644 index 0000000000..acbb134d64 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence/canopy/canopy_fence_post_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_post", + "textures": { + "texture": "twilightforest:block/wood/planks_canopy_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence/canopy/canopy_fence_post_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence/canopy/canopy_fence_post_2.json new file mode 100644 index 0000000000..79f6366e47 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence/canopy/canopy_fence_post_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_post", + "textures": { + "texture": "twilightforest:block/wood/planks_canopy_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence/canopy/canopy_fence_post_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence/canopy/canopy_fence_post_3.json new file mode 100644 index 0000000000..83ac8a4959 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence/canopy/canopy_fence_post_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_post", + "textures": { + "texture": "twilightforest:block/wood/planks_canopy_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence/canopy/canopy_fence_side.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence/canopy/canopy_fence_side.json new file mode 100644 index 0000000000..1b77b3025e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence/canopy/canopy_fence_side.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_side", + "textures": { + "texture": "twilightforest:block/wood/planks_canopy_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence/canopy/canopy_fence_side_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence/canopy/canopy_fence_side_1.json new file mode 100644 index 0000000000..69e2515fae --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence/canopy/canopy_fence_side_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_side", + "textures": { + "texture": "twilightforest:block/wood/planks_canopy_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence/canopy/canopy_fence_side_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence/canopy/canopy_fence_side_2.json new file mode 100644 index 0000000000..87d760d6a2 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence/canopy/canopy_fence_side_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_side", + "textures": { + "texture": "twilightforest:block/wood/planks_canopy_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence/canopy/canopy_fence_side_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence/canopy/canopy_fence_side_3.json new file mode 100644 index 0000000000..a349b8c065 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence/canopy/canopy_fence_side_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_side", + "textures": { + "texture": "twilightforest:block/wood/planks_canopy_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence/darkwood/dark_fence_post.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence/darkwood/dark_fence_post.json new file mode 100644 index 0000000000..c2b32c2abe --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence/darkwood/dark_fence_post.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_post", + "textures": { + "texture": "twilightforest:block/wood/planks_darkwood_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence/darkwood/dark_fence_post_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence/darkwood/dark_fence_post_1.json new file mode 100644 index 0000000000..16a70443f6 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence/darkwood/dark_fence_post_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_post", + "textures": { + "texture": "twilightforest:block/wood/planks_darkwood_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence/darkwood/dark_fence_post_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence/darkwood/dark_fence_post_2.json new file mode 100644 index 0000000000..66651b66a1 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence/darkwood/dark_fence_post_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_post", + "textures": { + "texture": "twilightforest:block/wood/planks_darkwood_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence/darkwood/dark_fence_post_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence/darkwood/dark_fence_post_3.json new file mode 100644 index 0000000000..e14817fe4b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence/darkwood/dark_fence_post_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_post", + "textures": { + "texture": "twilightforest:block/wood/planks_darkwood_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence/darkwood/dark_fence_side.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence/darkwood/dark_fence_side.json new file mode 100644 index 0000000000..3a3a5f2ed1 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence/darkwood/dark_fence_side.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_side", + "textures": { + "texture": "twilightforest:block/wood/planks_darkwood_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence/darkwood/dark_fence_side_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence/darkwood/dark_fence_side_1.json new file mode 100644 index 0000000000..7a5bab165c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence/darkwood/dark_fence_side_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_side", + "textures": { + "texture": "twilightforest:block/wood/planks_darkwood_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence/darkwood/dark_fence_side_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence/darkwood/dark_fence_side_2.json new file mode 100644 index 0000000000..d871c5f209 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence/darkwood/dark_fence_side_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_side", + "textures": { + "texture": "twilightforest:block/wood/planks_darkwood_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence/darkwood/dark_fence_side_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence/darkwood/dark_fence_side_3.json new file mode 100644 index 0000000000..8b838f665c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence/darkwood/dark_fence_side_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_side", + "textures": { + "texture": "twilightforest:block/wood/planks_darkwood_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence/mangrove/mangrove_fence_post.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence/mangrove/mangrove_fence_post.json new file mode 100644 index 0000000000..8dde75ab83 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence/mangrove/mangrove_fence_post.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_post", + "textures": { + "texture": "twilightforest:block/wood/planks_mangrove_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence/mangrove/mangrove_fence_post_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence/mangrove/mangrove_fence_post_1.json new file mode 100644 index 0000000000..412348ef60 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence/mangrove/mangrove_fence_post_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_post", + "textures": { + "texture": "twilightforest:block/wood/planks_mangrove_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence/mangrove/mangrove_fence_post_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence/mangrove/mangrove_fence_post_2.json new file mode 100644 index 0000000000..ef7479342c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence/mangrove/mangrove_fence_post_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_post", + "textures": { + "texture": "twilightforest:block/wood/planks_mangrove_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence/mangrove/mangrove_fence_post_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence/mangrove/mangrove_fence_post_3.json new file mode 100644 index 0000000000..c411d87fc1 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence/mangrove/mangrove_fence_post_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_post", + "textures": { + "texture": "twilightforest:block/wood/planks_mangrove_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence/mangrove/mangrove_fence_side.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence/mangrove/mangrove_fence_side.json new file mode 100644 index 0000000000..55b8e5d125 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence/mangrove/mangrove_fence_side.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_side", + "textures": { + "texture": "twilightforest:block/wood/planks_mangrove_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence/mangrove/mangrove_fence_side_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence/mangrove/mangrove_fence_side_1.json new file mode 100644 index 0000000000..2414679d2a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence/mangrove/mangrove_fence_side_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_side", + "textures": { + "texture": "twilightforest:block/wood/planks_mangrove_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence/mangrove/mangrove_fence_side_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence/mangrove/mangrove_fence_side_2.json new file mode 100644 index 0000000000..81e5df4b66 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence/mangrove/mangrove_fence_side_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_side", + "textures": { + "texture": "twilightforest:block/wood/planks_mangrove_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence/mangrove/mangrove_fence_side_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence/mangrove/mangrove_fence_side_3.json new file mode 100644 index 0000000000..562ca870fb --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence/mangrove/mangrove_fence_side_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_side", + "textures": { + "texture": "twilightforest:block/wood/planks_mangrove_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence/mine/mining_fence_post.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence/mine/mining_fence_post.json new file mode 100644 index 0000000000..d87193b097 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence/mine/mining_fence_post.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_post", + "textures": { + "texture": "twilightforest:block/wood/planks_mine_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence/mine/mining_fence_post_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence/mine/mining_fence_post_1.json new file mode 100644 index 0000000000..c32d3f2468 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence/mine/mining_fence_post_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_post", + "textures": { + "texture": "twilightforest:block/wood/planks_mine_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence/mine/mining_fence_post_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence/mine/mining_fence_post_2.json new file mode 100644 index 0000000000..412b6cd5a0 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence/mine/mining_fence_post_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_post", + "textures": { + "texture": "twilightforest:block/wood/planks_mine_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence/mine/mining_fence_post_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence/mine/mining_fence_post_3.json new file mode 100644 index 0000000000..df65c5b3ad --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence/mine/mining_fence_post_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_post", + "textures": { + "texture": "twilightforest:block/wood/planks_mine_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence/mine/mining_fence_side.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence/mine/mining_fence_side.json new file mode 100644 index 0000000000..99ad78c43c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence/mine/mining_fence_side.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_side", + "textures": { + "texture": "twilightforest:block/wood/planks_mine_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence/mine/mining_fence_side_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence/mine/mining_fence_side_1.json new file mode 100644 index 0000000000..af55e0ecb3 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence/mine/mining_fence_side_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_side", + "textures": { + "texture": "twilightforest:block/wood/planks_mine_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence/mine/mining_fence_side_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence/mine/mining_fence_side_2.json new file mode 100644 index 0000000000..940fc8795e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence/mine/mining_fence_side_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_side", + "textures": { + "texture": "twilightforest:block/wood/planks_mine_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence/mine/mining_fence_side_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence/mine/mining_fence_side_3.json new file mode 100644 index 0000000000..b8e6bfe99e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence/mine/mining_fence_side_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_side", + "textures": { + "texture": "twilightforest:block/wood/planks_mine_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence/sort/sorting_fence_post.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence/sort/sorting_fence_post.json new file mode 100644 index 0000000000..afee7fe587 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence/sort/sorting_fence_post.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_post", + "textures": { + "texture": "twilightforest:block/wood/planks_sort_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence/sort/sorting_fence_post_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence/sort/sorting_fence_post_1.json new file mode 100644 index 0000000000..f95b0153f2 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence/sort/sorting_fence_post_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_post", + "textures": { + "texture": "twilightforest:block/wood/planks_sort_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence/sort/sorting_fence_post_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence/sort/sorting_fence_post_2.json new file mode 100644 index 0000000000..4352980618 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence/sort/sorting_fence_post_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_post", + "textures": { + "texture": "twilightforest:block/wood/planks_sort_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence/sort/sorting_fence_post_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence/sort/sorting_fence_post_3.json new file mode 100644 index 0000000000..575c286a83 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence/sort/sorting_fence_post_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_post", + "textures": { + "texture": "twilightforest:block/wood/planks_sort_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence/sort/sorting_fence_side.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence/sort/sorting_fence_side.json new file mode 100644 index 0000000000..86c90f3ba9 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence/sort/sorting_fence_side.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_side", + "textures": { + "texture": "twilightforest:block/wood/planks_sort_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence/sort/sorting_fence_side_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence/sort/sorting_fence_side_1.json new file mode 100644 index 0000000000..b5fabb2609 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence/sort/sorting_fence_side_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_side", + "textures": { + "texture": "twilightforest:block/wood/planks_sort_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence/sort/sorting_fence_side_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence/sort/sorting_fence_side_2.json new file mode 100644 index 0000000000..aa8359892f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence/sort/sorting_fence_side_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_side", + "textures": { + "texture": "twilightforest:block/wood/planks_sort_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence/sort/sorting_fence_side_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence/sort/sorting_fence_side_3.json new file mode 100644 index 0000000000..95f7b28074 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence/sort/sorting_fence_side_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_side", + "textures": { + "texture": "twilightforest:block/wood/planks_sort_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence/time/time_fence_post.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence/time/time_fence_post.json new file mode 100644 index 0000000000..5de6b115b7 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence/time/time_fence_post.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_post", + "textures": { + "texture": "twilightforest:block/wood/planks_time_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence/time/time_fence_post_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence/time/time_fence_post_1.json new file mode 100644 index 0000000000..3e657b2c95 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence/time/time_fence_post_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_post", + "textures": { + "texture": "twilightforest:block/wood/planks_time_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence/time/time_fence_post_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence/time/time_fence_post_2.json new file mode 100644 index 0000000000..74c35c29ca --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence/time/time_fence_post_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_post", + "textures": { + "texture": "twilightforest:block/wood/planks_time_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence/time/time_fence_post_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence/time/time_fence_post_3.json new file mode 100644 index 0000000000..29a25a0cd8 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence/time/time_fence_post_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_post", + "textures": { + "texture": "twilightforest:block/wood/planks_time_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence/time/time_fence_side.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence/time/time_fence_side.json new file mode 100644 index 0000000000..71645cfb09 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence/time/time_fence_side.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_side", + "textures": { + "texture": "twilightforest:block/wood/planks_time_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence/time/time_fence_side_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence/time/time_fence_side_1.json new file mode 100644 index 0000000000..b36cf88609 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence/time/time_fence_side_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_side", + "textures": { + "texture": "twilightforest:block/wood/planks_time_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence/time/time_fence_side_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence/time/time_fence_side_2.json new file mode 100644 index 0000000000..af9a5303ef --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence/time/time_fence_side_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_side", + "textures": { + "texture": "twilightforest:block/wood/planks_time_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence/time/time_fence_side_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence/time/time_fence_side_3.json new file mode 100644 index 0000000000..4a82483123 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence/time/time_fence_side_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_side", + "textures": { + "texture": "twilightforest:block/wood/planks_time_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence/trans/transformation_fence_post.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence/trans/transformation_fence_post.json new file mode 100644 index 0000000000..d35c57fc94 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence/trans/transformation_fence_post.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_post", + "textures": { + "texture": "twilightforest:block/wood/planks_trans_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence/trans/transformation_fence_post_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence/trans/transformation_fence_post_1.json new file mode 100644 index 0000000000..9946c6efb6 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence/trans/transformation_fence_post_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_post", + "textures": { + "texture": "twilightforest:block/wood/planks_trans_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence/trans/transformation_fence_post_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence/trans/transformation_fence_post_2.json new file mode 100644 index 0000000000..478251d174 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence/trans/transformation_fence_post_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_post", + "textures": { + "texture": "twilightforest:block/wood/planks_trans_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence/trans/transformation_fence_post_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence/trans/transformation_fence_post_3.json new file mode 100644 index 0000000000..29669576db --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence/trans/transformation_fence_post_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_post", + "textures": { + "texture": "twilightforest:block/wood/planks_trans_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence/trans/transformation_fence_side.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence/trans/transformation_fence_side.json new file mode 100644 index 0000000000..c88667d715 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence/trans/transformation_fence_side.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_side", + "textures": { + "texture": "twilightforest:block/wood/planks_trans_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence/trans/transformation_fence_side_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence/trans/transformation_fence_side_1.json new file mode 100644 index 0000000000..e0b6329266 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence/trans/transformation_fence_side_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_side", + "textures": { + "texture": "twilightforest:block/wood/planks_trans_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence/trans/transformation_fence_side_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence/trans/transformation_fence_side_2.json new file mode 100644 index 0000000000..e6ad73ea4f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence/trans/transformation_fence_side_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_side", + "textures": { + "texture": "twilightforest:block/wood/planks_trans_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence/trans/transformation_fence_side_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence/trans/transformation_fence_side_3.json new file mode 100644 index 0000000000..dabea1a99f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence/trans/transformation_fence_side_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_side", + "textures": { + "texture": "twilightforest:block/wood/planks_trans_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence/twilight_oak/twilight_oak_fence_post.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence/twilight_oak/twilight_oak_fence_post.json new file mode 100644 index 0000000000..4cc091d214 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence/twilight_oak/twilight_oak_fence_post.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_post", + "textures": { + "texture": "twilightforest:block/wood/planks_twilight_oak_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence/twilight_oak/twilight_oak_fence_post_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence/twilight_oak/twilight_oak_fence_post_1.json new file mode 100644 index 0000000000..652aed54fc --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence/twilight_oak/twilight_oak_fence_post_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_post", + "textures": { + "texture": "twilightforest:block/wood/planks_twilight_oak_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence/twilight_oak/twilight_oak_fence_post_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence/twilight_oak/twilight_oak_fence_post_2.json new file mode 100644 index 0000000000..fe7501062d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence/twilight_oak/twilight_oak_fence_post_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_post", + "textures": { + "texture": "twilightforest:block/wood/planks_twilight_oak_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence/twilight_oak/twilight_oak_fence_post_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence/twilight_oak/twilight_oak_fence_post_3.json new file mode 100644 index 0000000000..7f849eefb1 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence/twilight_oak/twilight_oak_fence_post_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_post", + "textures": { + "texture": "twilightforest:block/wood/planks_twilight_oak_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence/twilight_oak/twilight_oak_fence_side.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence/twilight_oak/twilight_oak_fence_side.json new file mode 100644 index 0000000000..0618acf705 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence/twilight_oak/twilight_oak_fence_side.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_side", + "textures": { + "texture": "twilightforest:block/wood/planks_twilight_oak_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence/twilight_oak/twilight_oak_fence_side_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence/twilight_oak/twilight_oak_fence_side_1.json new file mode 100644 index 0000000000..cc51b493d7 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence/twilight_oak/twilight_oak_fence_side_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_side", + "textures": { + "texture": "twilightforest:block/wood/planks_twilight_oak_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence/twilight_oak/twilight_oak_fence_side_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence/twilight_oak/twilight_oak_fence_side_2.json new file mode 100644 index 0000000000..14fe457255 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence/twilight_oak/twilight_oak_fence_side_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_side", + "textures": { + "texture": "twilightforest:block/wood/planks_twilight_oak_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence/twilight_oak/twilight_oak_fence_side_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence/twilight_oak/twilight_oak_fence_side_3.json new file mode 100644 index 0000000000..260c2f3745 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence/twilight_oak/twilight_oak_fence_side_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_side", + "textures": { + "texture": "twilightforest:block/wood/planks_twilight_oak_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/canopy/canopy_fence_gate.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/canopy/canopy_fence_gate.json new file mode 100644 index 0000000000..bd9f3a175b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/canopy/canopy_fence_gate.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate", + "textures": { + "texture": "twilightforest:block/wood/planks_canopy_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/canopy/canopy_fence_gate_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/canopy/canopy_fence_gate_1.json new file mode 100644 index 0000000000..215c629bcf --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/canopy/canopy_fence_gate_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate", + "textures": { + "texture": "twilightforest:block/wood/planks_canopy_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/canopy/canopy_fence_gate_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/canopy/canopy_fence_gate_2.json new file mode 100644 index 0000000000..021f66d64d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/canopy/canopy_fence_gate_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate", + "textures": { + "texture": "twilightforest:block/wood/planks_canopy_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/canopy/canopy_fence_gate_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/canopy/canopy_fence_gate_3.json new file mode 100644 index 0000000000..f577d11f85 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/canopy/canopy_fence_gate_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate", + "textures": { + "texture": "twilightforest:block/wood/planks_canopy_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/canopy/canopy_fence_gate_open.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/canopy/canopy_fence_gate_open.json new file mode 100644 index 0000000000..871bc2435a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/canopy/canopy_fence_gate_open.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_open", + "textures": { + "texture": "twilightforest:block/wood/planks_canopy_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/canopy/canopy_fence_gate_open_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/canopy/canopy_fence_gate_open_1.json new file mode 100644 index 0000000000..7fe9daeeb4 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/canopy/canopy_fence_gate_open_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_open", + "textures": { + "texture": "twilightforest:block/wood/planks_canopy_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/canopy/canopy_fence_gate_open_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/canopy/canopy_fence_gate_open_2.json new file mode 100644 index 0000000000..646ddc3d06 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/canopy/canopy_fence_gate_open_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_open", + "textures": { + "texture": "twilightforest:block/wood/planks_canopy_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/canopy/canopy_fence_gate_open_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/canopy/canopy_fence_gate_open_3.json new file mode 100644 index 0000000000..5ded92dca4 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/canopy/canopy_fence_gate_open_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_open", + "textures": { + "texture": "twilightforest:block/wood/planks_canopy_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/canopy/canopy_fence_gate_wall.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/canopy/canopy_fence_gate_wall.json new file mode 100644 index 0000000000..da8f46b0cc --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/canopy/canopy_fence_gate_wall.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_wall", + "textures": { + "texture": "twilightforest:block/wood/planks_canopy_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/canopy/canopy_fence_gate_wall_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/canopy/canopy_fence_gate_wall_1.json new file mode 100644 index 0000000000..d7476ac4e9 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/canopy/canopy_fence_gate_wall_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_wall", + "textures": { + "texture": "twilightforest:block/wood/planks_canopy_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/canopy/canopy_fence_gate_wall_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/canopy/canopy_fence_gate_wall_2.json new file mode 100644 index 0000000000..e826fcb2fa --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/canopy/canopy_fence_gate_wall_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_wall", + "textures": { + "texture": "twilightforest:block/wood/planks_canopy_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/canopy/canopy_fence_gate_wall_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/canopy/canopy_fence_gate_wall_3.json new file mode 100644 index 0000000000..8d1775b39b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/canopy/canopy_fence_gate_wall_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_wall", + "textures": { + "texture": "twilightforest:block/wood/planks_canopy_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/canopy/canopy_fence_gate_wall_open.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/canopy/canopy_fence_gate_wall_open.json new file mode 100644 index 0000000000..b9161b5319 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/canopy/canopy_fence_gate_wall_open.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_wall_open", + "textures": { + "texture": "twilightforest:block/wood/planks_canopy_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/canopy/canopy_fence_gate_wall_open_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/canopy/canopy_fence_gate_wall_open_1.json new file mode 100644 index 0000000000..733ce097ed --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/canopy/canopy_fence_gate_wall_open_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_wall_open", + "textures": { + "texture": "twilightforest:block/wood/planks_canopy_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/canopy/canopy_fence_gate_wall_open_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/canopy/canopy_fence_gate_wall_open_2.json new file mode 100644 index 0000000000..61af06162c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/canopy/canopy_fence_gate_wall_open_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_wall_open", + "textures": { + "texture": "twilightforest:block/wood/planks_canopy_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/canopy/canopy_fence_gate_wall_open_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/canopy/canopy_fence_gate_wall_open_3.json new file mode 100644 index 0000000000..312f637b51 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/canopy/canopy_fence_gate_wall_open_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_wall_open", + "textures": { + "texture": "twilightforest:block/wood/planks_canopy_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/darkwood/dark_fence_gate.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/darkwood/dark_fence_gate.json new file mode 100644 index 0000000000..e203d1b73a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/darkwood/dark_fence_gate.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate", + "textures": { + "texture": "twilightforest:block/wood/planks_darkwood_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/darkwood/dark_fence_gate_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/darkwood/dark_fence_gate_1.json new file mode 100644 index 0000000000..d59d62478f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/darkwood/dark_fence_gate_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate", + "textures": { + "texture": "twilightforest:block/wood/planks_darkwood_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/darkwood/dark_fence_gate_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/darkwood/dark_fence_gate_2.json new file mode 100644 index 0000000000..7e3c7eaec3 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/darkwood/dark_fence_gate_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate", + "textures": { + "texture": "twilightforest:block/wood/planks_darkwood_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/darkwood/dark_fence_gate_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/darkwood/dark_fence_gate_3.json new file mode 100644 index 0000000000..5f83146ed2 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/darkwood/dark_fence_gate_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate", + "textures": { + "texture": "twilightforest:block/wood/planks_darkwood_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/darkwood/dark_fence_gate_open.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/darkwood/dark_fence_gate_open.json new file mode 100644 index 0000000000..05f8f474df --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/darkwood/dark_fence_gate_open.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_open", + "textures": { + "texture": "twilightforest:block/wood/planks_darkwood_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/darkwood/dark_fence_gate_open_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/darkwood/dark_fence_gate_open_1.json new file mode 100644 index 0000000000..50ef160e33 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/darkwood/dark_fence_gate_open_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_open", + "textures": { + "texture": "twilightforest:block/wood/planks_darkwood_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/darkwood/dark_fence_gate_open_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/darkwood/dark_fence_gate_open_2.json new file mode 100644 index 0000000000..6acfcb4158 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/darkwood/dark_fence_gate_open_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_open", + "textures": { + "texture": "twilightforest:block/wood/planks_darkwood_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/darkwood/dark_fence_gate_open_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/darkwood/dark_fence_gate_open_3.json new file mode 100644 index 0000000000..71da9ce62a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/darkwood/dark_fence_gate_open_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_open", + "textures": { + "texture": "twilightforest:block/wood/planks_darkwood_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/darkwood/dark_fence_gate_wall.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/darkwood/dark_fence_gate_wall.json new file mode 100644 index 0000000000..0f33ae0406 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/darkwood/dark_fence_gate_wall.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_wall", + "textures": { + "texture": "twilightforest:block/wood/planks_darkwood_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/darkwood/dark_fence_gate_wall_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/darkwood/dark_fence_gate_wall_1.json new file mode 100644 index 0000000000..64a079c1bc --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/darkwood/dark_fence_gate_wall_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_wall", + "textures": { + "texture": "twilightforest:block/wood/planks_darkwood_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/darkwood/dark_fence_gate_wall_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/darkwood/dark_fence_gate_wall_2.json new file mode 100644 index 0000000000..a286b09828 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/darkwood/dark_fence_gate_wall_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_wall", + "textures": { + "texture": "twilightforest:block/wood/planks_darkwood_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/darkwood/dark_fence_gate_wall_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/darkwood/dark_fence_gate_wall_3.json new file mode 100644 index 0000000000..ae61b122eb --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/darkwood/dark_fence_gate_wall_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_wall", + "textures": { + "texture": "twilightforest:block/wood/planks_darkwood_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/darkwood/dark_fence_gate_wall_open.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/darkwood/dark_fence_gate_wall_open.json new file mode 100644 index 0000000000..2898c8ab3d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/darkwood/dark_fence_gate_wall_open.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_wall_open", + "textures": { + "texture": "twilightforest:block/wood/planks_darkwood_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/darkwood/dark_fence_gate_wall_open_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/darkwood/dark_fence_gate_wall_open_1.json new file mode 100644 index 0000000000..443447d7e5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/darkwood/dark_fence_gate_wall_open_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_wall_open", + "textures": { + "texture": "twilightforest:block/wood/planks_darkwood_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/darkwood/dark_fence_gate_wall_open_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/darkwood/dark_fence_gate_wall_open_2.json new file mode 100644 index 0000000000..49e52c6524 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/darkwood/dark_fence_gate_wall_open_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_wall_open", + "textures": { + "texture": "twilightforest:block/wood/planks_darkwood_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/darkwood/dark_fence_gate_wall_open_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/darkwood/dark_fence_gate_wall_open_3.json new file mode 100644 index 0000000000..7752c8d604 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/darkwood/dark_fence_gate_wall_open_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_wall_open", + "textures": { + "texture": "twilightforest:block/wood/planks_darkwood_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mangrove/mangrove_fence_gate.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mangrove/mangrove_fence_gate.json new file mode 100644 index 0000000000..0e9125657f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mangrove/mangrove_fence_gate.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate", + "textures": { + "texture": "twilightforest:block/wood/planks_mangrove_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mangrove/mangrove_fence_gate_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mangrove/mangrove_fence_gate_1.json new file mode 100644 index 0000000000..2cd8f01480 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mangrove/mangrove_fence_gate_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate", + "textures": { + "texture": "twilightforest:block/wood/planks_mangrove_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mangrove/mangrove_fence_gate_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mangrove/mangrove_fence_gate_2.json new file mode 100644 index 0000000000..871d663525 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mangrove/mangrove_fence_gate_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate", + "textures": { + "texture": "twilightforest:block/wood/planks_mangrove_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mangrove/mangrove_fence_gate_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mangrove/mangrove_fence_gate_3.json new file mode 100644 index 0000000000..658146fb82 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mangrove/mangrove_fence_gate_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate", + "textures": { + "texture": "twilightforest:block/wood/planks_mangrove_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mangrove/mangrove_fence_gate_open.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mangrove/mangrove_fence_gate_open.json new file mode 100644 index 0000000000..b684011bb1 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mangrove/mangrove_fence_gate_open.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_open", + "textures": { + "texture": "twilightforest:block/wood/planks_mangrove_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mangrove/mangrove_fence_gate_open_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mangrove/mangrove_fence_gate_open_1.json new file mode 100644 index 0000000000..3c3c58cffa --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mangrove/mangrove_fence_gate_open_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_open", + "textures": { + "texture": "twilightforest:block/wood/planks_mangrove_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mangrove/mangrove_fence_gate_open_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mangrove/mangrove_fence_gate_open_2.json new file mode 100644 index 0000000000..d5a3d239e3 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mangrove/mangrove_fence_gate_open_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_open", + "textures": { + "texture": "twilightforest:block/wood/planks_mangrove_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mangrove/mangrove_fence_gate_open_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mangrove/mangrove_fence_gate_open_3.json new file mode 100644 index 0000000000..2d91b4ca89 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mangrove/mangrove_fence_gate_open_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_open", + "textures": { + "texture": "twilightforest:block/wood/planks_mangrove_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mangrove/mangrove_fence_gate_wall.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mangrove/mangrove_fence_gate_wall.json new file mode 100644 index 0000000000..cd13f7bf6b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mangrove/mangrove_fence_gate_wall.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_wall", + "textures": { + "texture": "twilightforest:block/wood/planks_mangrove_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mangrove/mangrove_fence_gate_wall_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mangrove/mangrove_fence_gate_wall_1.json new file mode 100644 index 0000000000..854832b8a0 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mangrove/mangrove_fence_gate_wall_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_wall", + "textures": { + "texture": "twilightforest:block/wood/planks_mangrove_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mangrove/mangrove_fence_gate_wall_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mangrove/mangrove_fence_gate_wall_2.json new file mode 100644 index 0000000000..c318b44d25 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mangrove/mangrove_fence_gate_wall_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_wall", + "textures": { + "texture": "twilightforest:block/wood/planks_mangrove_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mangrove/mangrove_fence_gate_wall_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mangrove/mangrove_fence_gate_wall_3.json new file mode 100644 index 0000000000..add8dcae02 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mangrove/mangrove_fence_gate_wall_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_wall", + "textures": { + "texture": "twilightforest:block/wood/planks_mangrove_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mangrove/mangrove_fence_gate_wall_open.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mangrove/mangrove_fence_gate_wall_open.json new file mode 100644 index 0000000000..2c9660c555 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mangrove/mangrove_fence_gate_wall_open.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_wall_open", + "textures": { + "texture": "twilightforest:block/wood/planks_mangrove_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mangrove/mangrove_fence_gate_wall_open_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mangrove/mangrove_fence_gate_wall_open_1.json new file mode 100644 index 0000000000..62cf686190 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mangrove/mangrove_fence_gate_wall_open_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_wall_open", + "textures": { + "texture": "twilightforest:block/wood/planks_mangrove_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mangrove/mangrove_fence_gate_wall_open_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mangrove/mangrove_fence_gate_wall_open_2.json new file mode 100644 index 0000000000..4333ccf052 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mangrove/mangrove_fence_gate_wall_open_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_wall_open", + "textures": { + "texture": "twilightforest:block/wood/planks_mangrove_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mangrove/mangrove_fence_gate_wall_open_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mangrove/mangrove_fence_gate_wall_open_3.json new file mode 100644 index 0000000000..8e1876a1de --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mangrove/mangrove_fence_gate_wall_open_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_wall_open", + "textures": { + "texture": "twilightforest:block/wood/planks_mangrove_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mine/mining_fence_gate.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mine/mining_fence_gate.json new file mode 100644 index 0000000000..ae58dfe9ed --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mine/mining_fence_gate.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate", + "textures": { + "texture": "twilightforest:block/wood/planks_mine_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mine/mining_fence_gate_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mine/mining_fence_gate_1.json new file mode 100644 index 0000000000..0d194f3d30 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mine/mining_fence_gate_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate", + "textures": { + "texture": "twilightforest:block/wood/planks_mine_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mine/mining_fence_gate_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mine/mining_fence_gate_2.json new file mode 100644 index 0000000000..369f5540d6 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mine/mining_fence_gate_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate", + "textures": { + "texture": "twilightforest:block/wood/planks_mine_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mine/mining_fence_gate_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mine/mining_fence_gate_3.json new file mode 100644 index 0000000000..9f92bac7f6 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mine/mining_fence_gate_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate", + "textures": { + "texture": "twilightforest:block/wood/planks_mine_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mine/mining_fence_gate_open.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mine/mining_fence_gate_open.json new file mode 100644 index 0000000000..d26e485a70 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mine/mining_fence_gate_open.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_open", + "textures": { + "texture": "twilightforest:block/wood/planks_mine_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mine/mining_fence_gate_open_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mine/mining_fence_gate_open_1.json new file mode 100644 index 0000000000..0391ed4037 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mine/mining_fence_gate_open_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_open", + "textures": { + "texture": "twilightforest:block/wood/planks_mine_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mine/mining_fence_gate_open_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mine/mining_fence_gate_open_2.json new file mode 100644 index 0000000000..5577b262ac --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mine/mining_fence_gate_open_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_open", + "textures": { + "texture": "twilightforest:block/wood/planks_mine_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mine/mining_fence_gate_open_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mine/mining_fence_gate_open_3.json new file mode 100644 index 0000000000..e92d0ec9e7 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mine/mining_fence_gate_open_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_open", + "textures": { + "texture": "twilightforest:block/wood/planks_mine_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mine/mining_fence_gate_wall.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mine/mining_fence_gate_wall.json new file mode 100644 index 0000000000..698a9722df --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mine/mining_fence_gate_wall.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_wall", + "textures": { + "texture": "twilightforest:block/wood/planks_mine_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mine/mining_fence_gate_wall_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mine/mining_fence_gate_wall_1.json new file mode 100644 index 0000000000..d455150f50 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mine/mining_fence_gate_wall_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_wall", + "textures": { + "texture": "twilightforest:block/wood/planks_mine_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mine/mining_fence_gate_wall_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mine/mining_fence_gate_wall_2.json new file mode 100644 index 0000000000..375ca25e0c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mine/mining_fence_gate_wall_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_wall", + "textures": { + "texture": "twilightforest:block/wood/planks_mine_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mine/mining_fence_gate_wall_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mine/mining_fence_gate_wall_3.json new file mode 100644 index 0000000000..ba47fb519f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mine/mining_fence_gate_wall_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_wall", + "textures": { + "texture": "twilightforest:block/wood/planks_mine_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mine/mining_fence_gate_wall_open.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mine/mining_fence_gate_wall_open.json new file mode 100644 index 0000000000..d239b1ec5b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mine/mining_fence_gate_wall_open.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_wall_open", + "textures": { + "texture": "twilightforest:block/wood/planks_mine_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mine/mining_fence_gate_wall_open_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mine/mining_fence_gate_wall_open_1.json new file mode 100644 index 0000000000..7cf540d7fb --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mine/mining_fence_gate_wall_open_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_wall_open", + "textures": { + "texture": "twilightforest:block/wood/planks_mine_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mine/mining_fence_gate_wall_open_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mine/mining_fence_gate_wall_open_2.json new file mode 100644 index 0000000000..20109051f1 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mine/mining_fence_gate_wall_open_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_wall_open", + "textures": { + "texture": "twilightforest:block/wood/planks_mine_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mine/mining_fence_gate_wall_open_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mine/mining_fence_gate_wall_open_3.json new file mode 100644 index 0000000000..3ea81ce3ae --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/mine/mining_fence_gate_wall_open_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_wall_open", + "textures": { + "texture": "twilightforest:block/wood/planks_mine_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/sort/sorting_fence_gate.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/sort/sorting_fence_gate.json new file mode 100644 index 0000000000..1295c3db65 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/sort/sorting_fence_gate.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate", + "textures": { + "texture": "twilightforest:block/wood/planks_sort_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/sort/sorting_fence_gate_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/sort/sorting_fence_gate_1.json new file mode 100644 index 0000000000..904054ae9f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/sort/sorting_fence_gate_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate", + "textures": { + "texture": "twilightforest:block/wood/planks_sort_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/sort/sorting_fence_gate_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/sort/sorting_fence_gate_2.json new file mode 100644 index 0000000000..04563febbb --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/sort/sorting_fence_gate_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate", + "textures": { + "texture": "twilightforest:block/wood/planks_sort_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/sort/sorting_fence_gate_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/sort/sorting_fence_gate_3.json new file mode 100644 index 0000000000..ec86eaedd0 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/sort/sorting_fence_gate_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate", + "textures": { + "texture": "twilightforest:block/wood/planks_sort_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/sort/sorting_fence_gate_open.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/sort/sorting_fence_gate_open.json new file mode 100644 index 0000000000..cd50a234e4 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/sort/sorting_fence_gate_open.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_open", + "textures": { + "texture": "twilightforest:block/wood/planks_sort_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/sort/sorting_fence_gate_open_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/sort/sorting_fence_gate_open_1.json new file mode 100644 index 0000000000..c7329ee593 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/sort/sorting_fence_gate_open_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_open", + "textures": { + "texture": "twilightforest:block/wood/planks_sort_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/sort/sorting_fence_gate_open_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/sort/sorting_fence_gate_open_2.json new file mode 100644 index 0000000000..11fb58e7df --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/sort/sorting_fence_gate_open_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_open", + "textures": { + "texture": "twilightforest:block/wood/planks_sort_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/sort/sorting_fence_gate_open_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/sort/sorting_fence_gate_open_3.json new file mode 100644 index 0000000000..70cbb96601 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/sort/sorting_fence_gate_open_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_open", + "textures": { + "texture": "twilightforest:block/wood/planks_sort_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/sort/sorting_fence_gate_wall.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/sort/sorting_fence_gate_wall.json new file mode 100644 index 0000000000..48069aecda --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/sort/sorting_fence_gate_wall.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_wall", + "textures": { + "texture": "twilightforest:block/wood/planks_sort_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/sort/sorting_fence_gate_wall_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/sort/sorting_fence_gate_wall_1.json new file mode 100644 index 0000000000..fa7f3480f5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/sort/sorting_fence_gate_wall_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_wall", + "textures": { + "texture": "twilightforest:block/wood/planks_sort_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/sort/sorting_fence_gate_wall_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/sort/sorting_fence_gate_wall_2.json new file mode 100644 index 0000000000..4435085230 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/sort/sorting_fence_gate_wall_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_wall", + "textures": { + "texture": "twilightforest:block/wood/planks_sort_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/sort/sorting_fence_gate_wall_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/sort/sorting_fence_gate_wall_3.json new file mode 100644 index 0000000000..4d2e54679c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/sort/sorting_fence_gate_wall_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_wall", + "textures": { + "texture": "twilightforest:block/wood/planks_sort_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/sort/sorting_fence_gate_wall_open.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/sort/sorting_fence_gate_wall_open.json new file mode 100644 index 0000000000..33ee479c60 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/sort/sorting_fence_gate_wall_open.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_wall_open", + "textures": { + "texture": "twilightforest:block/wood/planks_sort_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/sort/sorting_fence_gate_wall_open_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/sort/sorting_fence_gate_wall_open_1.json new file mode 100644 index 0000000000..28c0a044d6 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/sort/sorting_fence_gate_wall_open_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_wall_open", + "textures": { + "texture": "twilightforest:block/wood/planks_sort_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/sort/sorting_fence_gate_wall_open_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/sort/sorting_fence_gate_wall_open_2.json new file mode 100644 index 0000000000..9f058615c7 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/sort/sorting_fence_gate_wall_open_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_wall_open", + "textures": { + "texture": "twilightforest:block/wood/planks_sort_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/sort/sorting_fence_gate_wall_open_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/sort/sorting_fence_gate_wall_open_3.json new file mode 100644 index 0000000000..ed0c246236 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/sort/sorting_fence_gate_wall_open_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_wall_open", + "textures": { + "texture": "twilightforest:block/wood/planks_sort_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/time/time_fence_gate.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/time/time_fence_gate.json new file mode 100644 index 0000000000..ba639e9322 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/time/time_fence_gate.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate", + "textures": { + "texture": "twilightforest:block/wood/planks_time_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/time/time_fence_gate_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/time/time_fence_gate_1.json new file mode 100644 index 0000000000..214226461f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/time/time_fence_gate_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate", + "textures": { + "texture": "twilightforest:block/wood/planks_time_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/time/time_fence_gate_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/time/time_fence_gate_2.json new file mode 100644 index 0000000000..680ac32606 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/time/time_fence_gate_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate", + "textures": { + "texture": "twilightforest:block/wood/planks_time_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/time/time_fence_gate_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/time/time_fence_gate_3.json new file mode 100644 index 0000000000..656c9fcf14 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/time/time_fence_gate_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate", + "textures": { + "texture": "twilightforest:block/wood/planks_time_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/time/time_fence_gate_open.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/time/time_fence_gate_open.json new file mode 100644 index 0000000000..a4662f7097 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/time/time_fence_gate_open.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_open", + "textures": { + "texture": "twilightforest:block/wood/planks_time_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/time/time_fence_gate_open_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/time/time_fence_gate_open_1.json new file mode 100644 index 0000000000..d2e4b0a573 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/time/time_fence_gate_open_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_open", + "textures": { + "texture": "twilightforest:block/wood/planks_time_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/time/time_fence_gate_open_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/time/time_fence_gate_open_2.json new file mode 100644 index 0000000000..f70a98ac59 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/time/time_fence_gate_open_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_open", + "textures": { + "texture": "twilightforest:block/wood/planks_time_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/time/time_fence_gate_open_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/time/time_fence_gate_open_3.json new file mode 100644 index 0000000000..47ed346005 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/time/time_fence_gate_open_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_open", + "textures": { + "texture": "twilightforest:block/wood/planks_time_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/time/time_fence_gate_wall.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/time/time_fence_gate_wall.json new file mode 100644 index 0000000000..252d8798c9 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/time/time_fence_gate_wall.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_wall", + "textures": { + "texture": "twilightforest:block/wood/planks_time_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/time/time_fence_gate_wall_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/time/time_fence_gate_wall_1.json new file mode 100644 index 0000000000..3f9b7348df --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/time/time_fence_gate_wall_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_wall", + "textures": { + "texture": "twilightforest:block/wood/planks_time_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/time/time_fence_gate_wall_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/time/time_fence_gate_wall_2.json new file mode 100644 index 0000000000..3c41d7f593 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/time/time_fence_gate_wall_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_wall", + "textures": { + "texture": "twilightforest:block/wood/planks_time_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/time/time_fence_gate_wall_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/time/time_fence_gate_wall_3.json new file mode 100644 index 0000000000..39fb66ddba --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/time/time_fence_gate_wall_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_wall", + "textures": { + "texture": "twilightforest:block/wood/planks_time_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/time/time_fence_gate_wall_open.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/time/time_fence_gate_wall_open.json new file mode 100644 index 0000000000..650446e81e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/time/time_fence_gate_wall_open.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_wall_open", + "textures": { + "texture": "twilightforest:block/wood/planks_time_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/time/time_fence_gate_wall_open_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/time/time_fence_gate_wall_open_1.json new file mode 100644 index 0000000000..3919c63d66 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/time/time_fence_gate_wall_open_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_wall_open", + "textures": { + "texture": "twilightforest:block/wood/planks_time_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/time/time_fence_gate_wall_open_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/time/time_fence_gate_wall_open_2.json new file mode 100644 index 0000000000..d41cc2ff18 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/time/time_fence_gate_wall_open_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_wall_open", + "textures": { + "texture": "twilightforest:block/wood/planks_time_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/time/time_fence_gate_wall_open_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/time/time_fence_gate_wall_open_3.json new file mode 100644 index 0000000000..44dacec61c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/time/time_fence_gate_wall_open_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_wall_open", + "textures": { + "texture": "twilightforest:block/wood/planks_time_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/trans/transformation_fence_gate.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/trans/transformation_fence_gate.json new file mode 100644 index 0000000000..4adabcd971 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/trans/transformation_fence_gate.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate", + "textures": { + "texture": "twilightforest:block/wood/planks_trans_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/trans/transformation_fence_gate_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/trans/transformation_fence_gate_1.json new file mode 100644 index 0000000000..44e37f5144 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/trans/transformation_fence_gate_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate", + "textures": { + "texture": "twilightforest:block/wood/planks_trans_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/trans/transformation_fence_gate_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/trans/transformation_fence_gate_2.json new file mode 100644 index 0000000000..75d359c244 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/trans/transformation_fence_gate_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate", + "textures": { + "texture": "twilightforest:block/wood/planks_trans_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/trans/transformation_fence_gate_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/trans/transformation_fence_gate_3.json new file mode 100644 index 0000000000..5086ee2aae --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/trans/transformation_fence_gate_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate", + "textures": { + "texture": "twilightforest:block/wood/planks_trans_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/trans/transformation_fence_gate_open.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/trans/transformation_fence_gate_open.json new file mode 100644 index 0000000000..9487128ffd --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/trans/transformation_fence_gate_open.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_open", + "textures": { + "texture": "twilightforest:block/wood/planks_trans_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/trans/transformation_fence_gate_open_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/trans/transformation_fence_gate_open_1.json new file mode 100644 index 0000000000..0b59546787 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/trans/transformation_fence_gate_open_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_open", + "textures": { + "texture": "twilightforest:block/wood/planks_trans_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/trans/transformation_fence_gate_open_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/trans/transformation_fence_gate_open_2.json new file mode 100644 index 0000000000..b7122e6c4f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/trans/transformation_fence_gate_open_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_open", + "textures": { + "texture": "twilightforest:block/wood/planks_trans_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/trans/transformation_fence_gate_open_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/trans/transformation_fence_gate_open_3.json new file mode 100644 index 0000000000..9636b27423 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/trans/transformation_fence_gate_open_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_open", + "textures": { + "texture": "twilightforest:block/wood/planks_trans_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/trans/transformation_fence_gate_wall.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/trans/transformation_fence_gate_wall.json new file mode 100644 index 0000000000..b07baea2f4 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/trans/transformation_fence_gate_wall.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_wall", + "textures": { + "texture": "twilightforest:block/wood/planks_trans_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/trans/transformation_fence_gate_wall_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/trans/transformation_fence_gate_wall_1.json new file mode 100644 index 0000000000..7a0ad23004 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/trans/transformation_fence_gate_wall_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_wall", + "textures": { + "texture": "twilightforest:block/wood/planks_trans_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/trans/transformation_fence_gate_wall_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/trans/transformation_fence_gate_wall_2.json new file mode 100644 index 0000000000..dd664042fe --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/trans/transformation_fence_gate_wall_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_wall", + "textures": { + "texture": "twilightforest:block/wood/planks_trans_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/trans/transformation_fence_gate_wall_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/trans/transformation_fence_gate_wall_3.json new file mode 100644 index 0000000000..44ce2dee43 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/trans/transformation_fence_gate_wall_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_wall", + "textures": { + "texture": "twilightforest:block/wood/planks_trans_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/trans/transformation_fence_gate_wall_open.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/trans/transformation_fence_gate_wall_open.json new file mode 100644 index 0000000000..323737d9cb --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/trans/transformation_fence_gate_wall_open.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_wall_open", + "textures": { + "texture": "twilightforest:block/wood/planks_trans_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/trans/transformation_fence_gate_wall_open_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/trans/transformation_fence_gate_wall_open_1.json new file mode 100644 index 0000000000..502b1df3fe --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/trans/transformation_fence_gate_wall_open_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_wall_open", + "textures": { + "texture": "twilightforest:block/wood/planks_trans_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/trans/transformation_fence_gate_wall_open_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/trans/transformation_fence_gate_wall_open_2.json new file mode 100644 index 0000000000..af8971ea4c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/trans/transformation_fence_gate_wall_open_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_wall_open", + "textures": { + "texture": "twilightforest:block/wood/planks_trans_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/trans/transformation_fence_gate_wall_open_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/trans/transformation_fence_gate_wall_open_3.json new file mode 100644 index 0000000000..715d41ee4f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/trans/transformation_fence_gate_wall_open_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_wall_open", + "textures": { + "texture": "twilightforest:block/wood/planks_trans_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate.json new file mode 100644 index 0000000000..cedd933454 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate", + "textures": { + "texture": "twilightforest:block/wood/planks_twilight_oak_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_1.json new file mode 100644 index 0000000000..7dfe5d1af5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate", + "textures": { + "texture": "twilightforest:block/wood/planks_twilight_oak_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_2.json new file mode 100644 index 0000000000..39e77641ee --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate", + "textures": { + "texture": "twilightforest:block/wood/planks_twilight_oak_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_3.json new file mode 100644 index 0000000000..4212d96978 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate", + "textures": { + "texture": "twilightforest:block/wood/planks_twilight_oak_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_open.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_open.json new file mode 100644 index 0000000000..5abe16bcda --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_open.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_open", + "textures": { + "texture": "twilightforest:block/wood/planks_twilight_oak_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_open_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_open_1.json new file mode 100644 index 0000000000..2cd77f8b27 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_open_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_open", + "textures": { + "texture": "twilightforest:block/wood/planks_twilight_oak_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_open_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_open_2.json new file mode 100644 index 0000000000..de63a658b3 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_open_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_open", + "textures": { + "texture": "twilightforest:block/wood/planks_twilight_oak_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_open_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_open_3.json new file mode 100644 index 0000000000..a99d41824a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_open_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_open", + "textures": { + "texture": "twilightforest:block/wood/planks_twilight_oak_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_wall.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_wall.json new file mode 100644 index 0000000000..99810d8b14 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_wall.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_wall", + "textures": { + "texture": "twilightforest:block/wood/planks_twilight_oak_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_wall_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_wall_1.json new file mode 100644 index 0000000000..4d84357f8b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_wall_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_wall", + "textures": { + "texture": "twilightforest:block/wood/planks_twilight_oak_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_wall_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_wall_2.json new file mode 100644 index 0000000000..cfa35e2c5d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_wall_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_wall", + "textures": { + "texture": "twilightforest:block/wood/planks_twilight_oak_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_wall_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_wall_3.json new file mode 100644 index 0000000000..56e63fda16 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_wall_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_wall", + "textures": { + "texture": "twilightforest:block/wood/planks_twilight_oak_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_wall_open.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_wall_open.json new file mode 100644 index 0000000000..f2aa930155 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_wall_open.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_wall_open", + "textures": { + "texture": "twilightforest:block/wood/planks_twilight_oak_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_wall_open_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_wall_open_1.json new file mode 100644 index 0000000000..fa169280be --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_wall_open_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_wall_open", + "textures": { + "texture": "twilightforest:block/wood/planks_twilight_oak_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_wall_open_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_wall_open_2.json new file mode 100644 index 0000000000..9a6aaed820 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_wall_open_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_wall_open", + "textures": { + "texture": "twilightforest:block/wood/planks_twilight_oak_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_wall_open_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_wall_open_3.json new file mode 100644 index 0000000000..329e1f334f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate_wall_open_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_wall_open", + "textures": { + "texture": "twilightforest:block/wood/planks_twilight_oak_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/planks/canopy/canopy_planks.json b/src/generated/resources/assets/twilightforest/models/block/wood/planks/canopy/canopy_planks.json new file mode 100644 index 0000000000..455aad0c3e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/planks/canopy/canopy_planks.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "twilightforest:block/wood/planks_canopy_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/planks/canopy/canopy_planks_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/planks/canopy/canopy_planks_1.json new file mode 100644 index 0000000000..feeb2d897f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/planks/canopy/canopy_planks_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "twilightforest:block/wood/planks_canopy_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/planks/canopy/canopy_planks_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/planks/canopy/canopy_planks_2.json new file mode 100644 index 0000000000..917455aa68 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/planks/canopy/canopy_planks_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "twilightforest:block/wood/planks_canopy_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/planks/canopy/canopy_planks_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/planks/canopy/canopy_planks_3.json new file mode 100644 index 0000000000..3677f8a55d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/planks/canopy/canopy_planks_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "twilightforest:block/wood/planks_canopy_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/planks/darkwood/dark_planks.json b/src/generated/resources/assets/twilightforest/models/block/wood/planks/darkwood/dark_planks.json new file mode 100644 index 0000000000..ff95e5d3d6 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/planks/darkwood/dark_planks.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "twilightforest:block/wood/planks_darkwood_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/planks/darkwood/dark_planks_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/planks/darkwood/dark_planks_1.json new file mode 100644 index 0000000000..6c1e9a9491 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/planks/darkwood/dark_planks_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "twilightforest:block/wood/planks_darkwood_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/planks/darkwood/dark_planks_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/planks/darkwood/dark_planks_2.json new file mode 100644 index 0000000000..3c3b2daf35 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/planks/darkwood/dark_planks_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "twilightforest:block/wood/planks_darkwood_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/planks/darkwood/dark_planks_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/planks/darkwood/dark_planks_3.json new file mode 100644 index 0000000000..68f608ee95 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/planks/darkwood/dark_planks_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "twilightforest:block/wood/planks_darkwood_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/planks/mangrove/mangrove_planks.json b/src/generated/resources/assets/twilightforest/models/block/wood/planks/mangrove/mangrove_planks.json new file mode 100644 index 0000000000..951e5df806 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/planks/mangrove/mangrove_planks.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "twilightforest:block/wood/planks_mangrove_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/planks/mangrove/mangrove_planks_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/planks/mangrove/mangrove_planks_1.json new file mode 100644 index 0000000000..0124d88424 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/planks/mangrove/mangrove_planks_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "twilightforest:block/wood/planks_mangrove_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/planks/mangrove/mangrove_planks_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/planks/mangrove/mangrove_planks_2.json new file mode 100644 index 0000000000..edeab9ffc3 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/planks/mangrove/mangrove_planks_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "twilightforest:block/wood/planks_mangrove_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/planks/mangrove/mangrove_planks_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/planks/mangrove/mangrove_planks_3.json new file mode 100644 index 0000000000..3029113213 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/planks/mangrove/mangrove_planks_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "twilightforest:block/wood/planks_mangrove_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/planks/mine/mining_planks.json b/src/generated/resources/assets/twilightforest/models/block/wood/planks/mine/mining_planks.json new file mode 100644 index 0000000000..aa1539c281 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/planks/mine/mining_planks.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "twilightforest:block/wood/planks_mine_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/planks/mine/mining_planks_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/planks/mine/mining_planks_1.json new file mode 100644 index 0000000000..b81463486e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/planks/mine/mining_planks_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "twilightforest:block/wood/planks_mine_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/planks/mine/mining_planks_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/planks/mine/mining_planks_2.json new file mode 100644 index 0000000000..b31b7c17dd --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/planks/mine/mining_planks_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "twilightforest:block/wood/planks_mine_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/planks/mine/mining_planks_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/planks/mine/mining_planks_3.json new file mode 100644 index 0000000000..6eba60f66c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/planks/mine/mining_planks_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "twilightforest:block/wood/planks_mine_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/planks/sort/sorting_planks.json b/src/generated/resources/assets/twilightforest/models/block/wood/planks/sort/sorting_planks.json new file mode 100644 index 0000000000..bbfbb0a94a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/planks/sort/sorting_planks.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "twilightforest:block/wood/planks_sort_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/planks/sort/sorting_planks_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/planks/sort/sorting_planks_1.json new file mode 100644 index 0000000000..4c50dec202 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/planks/sort/sorting_planks_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "twilightforest:block/wood/planks_sort_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/planks/sort/sorting_planks_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/planks/sort/sorting_planks_2.json new file mode 100644 index 0000000000..30efb1ca87 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/planks/sort/sorting_planks_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "twilightforest:block/wood/planks_sort_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/planks/sort/sorting_planks_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/planks/sort/sorting_planks_3.json new file mode 100644 index 0000000000..b945ff0d29 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/planks/sort/sorting_planks_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "twilightforest:block/wood/planks_sort_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/planks/time/time_planks.json b/src/generated/resources/assets/twilightforest/models/block/wood/planks/time/time_planks.json new file mode 100644 index 0000000000..89743029ab --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/planks/time/time_planks.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "twilightforest:block/wood/planks_time_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/planks/time/time_planks_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/planks/time/time_planks_1.json new file mode 100644 index 0000000000..3d7e8d778e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/planks/time/time_planks_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "twilightforest:block/wood/planks_time_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/planks/time/time_planks_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/planks/time/time_planks_2.json new file mode 100644 index 0000000000..e9cbb765cc --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/planks/time/time_planks_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "twilightforest:block/wood/planks_time_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/planks/time/time_planks_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/planks/time/time_planks_3.json new file mode 100644 index 0000000000..0d34599556 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/planks/time/time_planks_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "twilightforest:block/wood/planks_time_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/planks/trans/transformation_planks.json b/src/generated/resources/assets/twilightforest/models/block/wood/planks/trans/transformation_planks.json new file mode 100644 index 0000000000..0067cde171 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/planks/trans/transformation_planks.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "twilightforest:block/wood/planks_trans_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/planks/trans/transformation_planks_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/planks/trans/transformation_planks_1.json new file mode 100644 index 0000000000..07ddb8ae27 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/planks/trans/transformation_planks_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "twilightforest:block/wood/planks_trans_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/planks/trans/transformation_planks_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/planks/trans/transformation_planks_2.json new file mode 100644 index 0000000000..a4139e0fbd --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/planks/trans/transformation_planks_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "twilightforest:block/wood/planks_trans_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/planks/trans/transformation_planks_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/planks/trans/transformation_planks_3.json new file mode 100644 index 0000000000..63321d7ce1 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/planks/trans/transformation_planks_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "twilightforest:block/wood/planks_trans_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/planks/twilight_oak/twilight_oak_planks.json b/src/generated/resources/assets/twilightforest/models/block/wood/planks/twilight_oak/twilight_oak_planks.json new file mode 100644 index 0000000000..949738c2e7 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/planks/twilight_oak/twilight_oak_planks.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "twilightforest:block/wood/planks_twilight_oak_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/planks/twilight_oak/twilight_oak_planks_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/planks/twilight_oak/twilight_oak_planks_1.json new file mode 100644 index 0000000000..bee5e72776 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/planks/twilight_oak/twilight_oak_planks_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "twilightforest:block/wood/planks_twilight_oak_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/planks/twilight_oak/twilight_oak_planks_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/planks/twilight_oak/twilight_oak_planks_2.json new file mode 100644 index 0000000000..13d13002c6 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/planks/twilight_oak/twilight_oak_planks_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "twilightforest:block/wood/planks_twilight_oak_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/planks/twilight_oak/twilight_oak_planks_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/planks/twilight_oak/twilight_oak_planks_3.json new file mode 100644 index 0000000000..8ef434ff0a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/planks/twilight_oak/twilight_oak_planks_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "twilightforest:block/wood/planks_twilight_oak_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/canopy/canopy_pressure_plate.json b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/canopy/canopy_pressure_plate.json new file mode 100644 index 0000000000..bcd2a1e4f9 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/canopy/canopy_pressure_plate.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/pressure_plate_up", + "textures": { + "texture": "twilightforest:block/wood/planks_canopy_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/canopy/canopy_pressure_plate_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/canopy/canopy_pressure_plate_1.json new file mode 100644 index 0000000000..a3dbeab784 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/canopy/canopy_pressure_plate_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/pressure_plate_up", + "textures": { + "texture": "twilightforest:block/wood/planks_canopy_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/canopy/canopy_pressure_plate_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/canopy/canopy_pressure_plate_2.json new file mode 100644 index 0000000000..103b38695d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/canopy/canopy_pressure_plate_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/pressure_plate_up", + "textures": { + "texture": "twilightforest:block/wood/planks_canopy_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/canopy/canopy_pressure_plate_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/canopy/canopy_pressure_plate_3.json new file mode 100644 index 0000000000..24015303e4 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/canopy/canopy_pressure_plate_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/pressure_plate_up", + "textures": { + "texture": "twilightforest:block/wood/planks_canopy_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/canopy/canopy_pressure_plate_down.json b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/canopy/canopy_pressure_plate_down.json new file mode 100644 index 0000000000..faa756b02f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/canopy/canopy_pressure_plate_down.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/pressure_plate_down", + "textures": { + "texture": "twilightforest:block/wood/planks_canopy_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/canopy/canopy_pressure_plate_down_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/canopy/canopy_pressure_plate_down_1.json new file mode 100644 index 0000000000..b3683cc085 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/canopy/canopy_pressure_plate_down_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/pressure_plate_down", + "textures": { + "texture": "twilightforest:block/wood/planks_canopy_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/canopy/canopy_pressure_plate_down_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/canopy/canopy_pressure_plate_down_2.json new file mode 100644 index 0000000000..50fef04336 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/canopy/canopy_pressure_plate_down_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/pressure_plate_down", + "textures": { + "texture": "twilightforest:block/wood/planks_canopy_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/canopy/canopy_pressure_plate_down_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/canopy/canopy_pressure_plate_down_3.json new file mode 100644 index 0000000000..613c5b8c25 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/canopy/canopy_pressure_plate_down_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/pressure_plate_down", + "textures": { + "texture": "twilightforest:block/wood/planks_canopy_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/darkwood/dark_pressure_plate.json b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/darkwood/dark_pressure_plate.json new file mode 100644 index 0000000000..99681092ed --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/darkwood/dark_pressure_plate.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/pressure_plate_up", + "textures": { + "texture": "twilightforest:block/wood/planks_darkwood_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/darkwood/dark_pressure_plate_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/darkwood/dark_pressure_plate_1.json new file mode 100644 index 0000000000..b1d0b70692 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/darkwood/dark_pressure_plate_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/pressure_plate_up", + "textures": { + "texture": "twilightforest:block/wood/planks_darkwood_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/darkwood/dark_pressure_plate_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/darkwood/dark_pressure_plate_2.json new file mode 100644 index 0000000000..a7bd382b68 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/darkwood/dark_pressure_plate_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/pressure_plate_up", + "textures": { + "texture": "twilightforest:block/wood/planks_darkwood_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/darkwood/dark_pressure_plate_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/darkwood/dark_pressure_plate_3.json new file mode 100644 index 0000000000..34dd91f5d1 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/darkwood/dark_pressure_plate_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/pressure_plate_up", + "textures": { + "texture": "twilightforest:block/wood/planks_darkwood_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/darkwood/dark_pressure_plate_down.json b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/darkwood/dark_pressure_plate_down.json new file mode 100644 index 0000000000..26b287e65c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/darkwood/dark_pressure_plate_down.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/pressure_plate_down", + "textures": { + "texture": "twilightforest:block/wood/planks_darkwood_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/darkwood/dark_pressure_plate_down_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/darkwood/dark_pressure_plate_down_1.json new file mode 100644 index 0000000000..eb6ed5f76f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/darkwood/dark_pressure_plate_down_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/pressure_plate_down", + "textures": { + "texture": "twilightforest:block/wood/planks_darkwood_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/darkwood/dark_pressure_plate_down_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/darkwood/dark_pressure_plate_down_2.json new file mode 100644 index 0000000000..103a8ec9f9 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/darkwood/dark_pressure_plate_down_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/pressure_plate_down", + "textures": { + "texture": "twilightforest:block/wood/planks_darkwood_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/darkwood/dark_pressure_plate_down_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/darkwood/dark_pressure_plate_down_3.json new file mode 100644 index 0000000000..2758bf0fb0 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/darkwood/dark_pressure_plate_down_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/pressure_plate_down", + "textures": { + "texture": "twilightforest:block/wood/planks_darkwood_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/mangrove/mangrove_pressure_plate.json b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/mangrove/mangrove_pressure_plate.json new file mode 100644 index 0000000000..fd000262a6 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/mangrove/mangrove_pressure_plate.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/pressure_plate_up", + "textures": { + "texture": "twilightforest:block/wood/planks_mangrove_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/mangrove/mangrove_pressure_plate_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/mangrove/mangrove_pressure_plate_1.json new file mode 100644 index 0000000000..7d16298fee --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/mangrove/mangrove_pressure_plate_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/pressure_plate_up", + "textures": { + "texture": "twilightforest:block/wood/planks_mangrove_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/mangrove/mangrove_pressure_plate_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/mangrove/mangrove_pressure_plate_2.json new file mode 100644 index 0000000000..0f06efdf56 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/mangrove/mangrove_pressure_plate_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/pressure_plate_up", + "textures": { + "texture": "twilightforest:block/wood/planks_mangrove_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/mangrove/mangrove_pressure_plate_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/mangrove/mangrove_pressure_plate_3.json new file mode 100644 index 0000000000..6a4ffdd087 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/mangrove/mangrove_pressure_plate_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/pressure_plate_up", + "textures": { + "texture": "twilightforest:block/wood/planks_mangrove_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/mangrove/mangrove_pressure_plate_down.json b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/mangrove/mangrove_pressure_plate_down.json new file mode 100644 index 0000000000..45d15a2e90 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/mangrove/mangrove_pressure_plate_down.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/pressure_plate_down", + "textures": { + "texture": "twilightforest:block/wood/planks_mangrove_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/mangrove/mangrove_pressure_plate_down_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/mangrove/mangrove_pressure_plate_down_1.json new file mode 100644 index 0000000000..607865e433 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/mangrove/mangrove_pressure_plate_down_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/pressure_plate_down", + "textures": { + "texture": "twilightforest:block/wood/planks_mangrove_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/mangrove/mangrove_pressure_plate_down_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/mangrove/mangrove_pressure_plate_down_2.json new file mode 100644 index 0000000000..6c70384126 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/mangrove/mangrove_pressure_plate_down_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/pressure_plate_down", + "textures": { + "texture": "twilightforest:block/wood/planks_mangrove_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/mangrove/mangrove_pressure_plate_down_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/mangrove/mangrove_pressure_plate_down_3.json new file mode 100644 index 0000000000..a2164b0e8d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/mangrove/mangrove_pressure_plate_down_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/pressure_plate_down", + "textures": { + "texture": "twilightforest:block/wood/planks_mangrove_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/mine/mining_pressure_plate.json b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/mine/mining_pressure_plate.json new file mode 100644 index 0000000000..1838bb7cd3 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/mine/mining_pressure_plate.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/pressure_plate_up", + "textures": { + "texture": "twilightforest:block/wood/planks_mine_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/mine/mining_pressure_plate_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/mine/mining_pressure_plate_1.json new file mode 100644 index 0000000000..a5e2e2c374 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/mine/mining_pressure_plate_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/pressure_plate_up", + "textures": { + "texture": "twilightforest:block/wood/planks_mine_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/mine/mining_pressure_plate_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/mine/mining_pressure_plate_2.json new file mode 100644 index 0000000000..9de4f8304a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/mine/mining_pressure_plate_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/pressure_plate_up", + "textures": { + "texture": "twilightforest:block/wood/planks_mine_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/mine/mining_pressure_plate_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/mine/mining_pressure_plate_3.json new file mode 100644 index 0000000000..cfe67349ca --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/mine/mining_pressure_plate_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/pressure_plate_up", + "textures": { + "texture": "twilightforest:block/wood/planks_mine_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/mine/mining_pressure_plate_down.json b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/mine/mining_pressure_plate_down.json new file mode 100644 index 0000000000..39e10dab1e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/mine/mining_pressure_plate_down.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/pressure_plate_down", + "textures": { + "texture": "twilightforest:block/wood/planks_mine_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/mine/mining_pressure_plate_down_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/mine/mining_pressure_plate_down_1.json new file mode 100644 index 0000000000..4aca4652a1 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/mine/mining_pressure_plate_down_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/pressure_plate_down", + "textures": { + "texture": "twilightforest:block/wood/planks_mine_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/mine/mining_pressure_plate_down_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/mine/mining_pressure_plate_down_2.json new file mode 100644 index 0000000000..e2cfdc5897 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/mine/mining_pressure_plate_down_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/pressure_plate_down", + "textures": { + "texture": "twilightforest:block/wood/planks_mine_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/mine/mining_pressure_plate_down_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/mine/mining_pressure_plate_down_3.json new file mode 100644 index 0000000000..ea2aeb1873 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/mine/mining_pressure_plate_down_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/pressure_plate_down", + "textures": { + "texture": "twilightforest:block/wood/planks_mine_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/sort/sorting_pressure_plate.json b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/sort/sorting_pressure_plate.json new file mode 100644 index 0000000000..23fd6bc4a2 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/sort/sorting_pressure_plate.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/pressure_plate_up", + "textures": { + "texture": "twilightforest:block/wood/planks_sort_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/sort/sorting_pressure_plate_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/sort/sorting_pressure_plate_1.json new file mode 100644 index 0000000000..42bacb156f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/sort/sorting_pressure_plate_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/pressure_plate_up", + "textures": { + "texture": "twilightforest:block/wood/planks_sort_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/sort/sorting_pressure_plate_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/sort/sorting_pressure_plate_2.json new file mode 100644 index 0000000000..d824914c88 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/sort/sorting_pressure_plate_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/pressure_plate_up", + "textures": { + "texture": "twilightforest:block/wood/planks_sort_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/sort/sorting_pressure_plate_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/sort/sorting_pressure_plate_3.json new file mode 100644 index 0000000000..5bc01f407e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/sort/sorting_pressure_plate_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/pressure_plate_up", + "textures": { + "texture": "twilightforest:block/wood/planks_sort_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/sort/sorting_pressure_plate_down.json b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/sort/sorting_pressure_plate_down.json new file mode 100644 index 0000000000..8c1c9776be --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/sort/sorting_pressure_plate_down.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/pressure_plate_down", + "textures": { + "texture": "twilightforest:block/wood/planks_sort_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/sort/sorting_pressure_plate_down_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/sort/sorting_pressure_plate_down_1.json new file mode 100644 index 0000000000..e8d6097f1a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/sort/sorting_pressure_plate_down_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/pressure_plate_down", + "textures": { + "texture": "twilightforest:block/wood/planks_sort_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/sort/sorting_pressure_plate_down_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/sort/sorting_pressure_plate_down_2.json new file mode 100644 index 0000000000..2d1632b8a2 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/sort/sorting_pressure_plate_down_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/pressure_plate_down", + "textures": { + "texture": "twilightforest:block/wood/planks_sort_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/sort/sorting_pressure_plate_down_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/sort/sorting_pressure_plate_down_3.json new file mode 100644 index 0000000000..d163651657 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/sort/sorting_pressure_plate_down_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/pressure_plate_down", + "textures": { + "texture": "twilightforest:block/wood/planks_sort_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/time/time_pressure_plate.json b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/time/time_pressure_plate.json new file mode 100644 index 0000000000..938680b524 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/time/time_pressure_plate.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/pressure_plate_up", + "textures": { + "texture": "twilightforest:block/wood/planks_time_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/time/time_pressure_plate_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/time/time_pressure_plate_1.json new file mode 100644 index 0000000000..8cde2fb4f1 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/time/time_pressure_plate_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/pressure_plate_up", + "textures": { + "texture": "twilightforest:block/wood/planks_time_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/time/time_pressure_plate_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/time/time_pressure_plate_2.json new file mode 100644 index 0000000000..5ce426c418 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/time/time_pressure_plate_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/pressure_plate_up", + "textures": { + "texture": "twilightforest:block/wood/planks_time_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/time/time_pressure_plate_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/time/time_pressure_plate_3.json new file mode 100644 index 0000000000..70130b839f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/time/time_pressure_plate_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/pressure_plate_up", + "textures": { + "texture": "twilightforest:block/wood/planks_time_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/time/time_pressure_plate_down.json b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/time/time_pressure_plate_down.json new file mode 100644 index 0000000000..7151544044 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/time/time_pressure_plate_down.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/pressure_plate_down", + "textures": { + "texture": "twilightforest:block/wood/planks_time_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/time/time_pressure_plate_down_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/time/time_pressure_plate_down_1.json new file mode 100644 index 0000000000..67ffba1783 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/time/time_pressure_plate_down_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/pressure_plate_down", + "textures": { + "texture": "twilightforest:block/wood/planks_time_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/time/time_pressure_plate_down_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/time/time_pressure_plate_down_2.json new file mode 100644 index 0000000000..ebf7a0bcb5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/time/time_pressure_plate_down_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/pressure_plate_down", + "textures": { + "texture": "twilightforest:block/wood/planks_time_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/time/time_pressure_plate_down_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/time/time_pressure_plate_down_3.json new file mode 100644 index 0000000000..adaf86e196 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/time/time_pressure_plate_down_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/pressure_plate_down", + "textures": { + "texture": "twilightforest:block/wood/planks_time_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/trans/transformation_pressure_plate.json b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/trans/transformation_pressure_plate.json new file mode 100644 index 0000000000..df2885548d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/trans/transformation_pressure_plate.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/pressure_plate_up", + "textures": { + "texture": "twilightforest:block/wood/planks_trans_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/trans/transformation_pressure_plate_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/trans/transformation_pressure_plate_1.json new file mode 100644 index 0000000000..91eea59400 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/trans/transformation_pressure_plate_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/pressure_plate_up", + "textures": { + "texture": "twilightforest:block/wood/planks_trans_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/trans/transformation_pressure_plate_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/trans/transformation_pressure_plate_2.json new file mode 100644 index 0000000000..5c166f5a37 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/trans/transformation_pressure_plate_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/pressure_plate_up", + "textures": { + "texture": "twilightforest:block/wood/planks_trans_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/trans/transformation_pressure_plate_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/trans/transformation_pressure_plate_3.json new file mode 100644 index 0000000000..c687e73256 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/trans/transformation_pressure_plate_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/pressure_plate_up", + "textures": { + "texture": "twilightforest:block/wood/planks_trans_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/trans/transformation_pressure_plate_down.json b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/trans/transformation_pressure_plate_down.json new file mode 100644 index 0000000000..b15960274d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/trans/transformation_pressure_plate_down.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/pressure_plate_down", + "textures": { + "texture": "twilightforest:block/wood/planks_trans_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/trans/transformation_pressure_plate_down_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/trans/transformation_pressure_plate_down_1.json new file mode 100644 index 0000000000..a2974d432e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/trans/transformation_pressure_plate_down_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/pressure_plate_down", + "textures": { + "texture": "twilightforest:block/wood/planks_trans_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/trans/transformation_pressure_plate_down_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/trans/transformation_pressure_plate_down_2.json new file mode 100644 index 0000000000..261c1629c9 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/trans/transformation_pressure_plate_down_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/pressure_plate_down", + "textures": { + "texture": "twilightforest:block/wood/planks_trans_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/trans/transformation_pressure_plate_down_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/trans/transformation_pressure_plate_down_3.json new file mode 100644 index 0000000000..0095077bf0 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/trans/transformation_pressure_plate_down_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/pressure_plate_down", + "textures": { + "texture": "twilightforest:block/wood/planks_trans_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/twilight_oak/twilight_oak_pressure_plate.json b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/twilight_oak/twilight_oak_pressure_plate.json new file mode 100644 index 0000000000..1e97a7bc52 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/twilight_oak/twilight_oak_pressure_plate.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/pressure_plate_up", + "textures": { + "texture": "twilightforest:block/wood/planks_twilight_oak_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/twilight_oak/twilight_oak_pressure_plate_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/twilight_oak/twilight_oak_pressure_plate_1.json new file mode 100644 index 0000000000..4942afdb8a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/twilight_oak/twilight_oak_pressure_plate_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/pressure_plate_up", + "textures": { + "texture": "twilightforest:block/wood/planks_twilight_oak_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/twilight_oak/twilight_oak_pressure_plate_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/twilight_oak/twilight_oak_pressure_plate_2.json new file mode 100644 index 0000000000..1c5608c8c6 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/twilight_oak/twilight_oak_pressure_plate_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/pressure_plate_up", + "textures": { + "texture": "twilightforest:block/wood/planks_twilight_oak_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/twilight_oak/twilight_oak_pressure_plate_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/twilight_oak/twilight_oak_pressure_plate_3.json new file mode 100644 index 0000000000..fb5f4044f4 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/twilight_oak/twilight_oak_pressure_plate_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/pressure_plate_up", + "textures": { + "texture": "twilightforest:block/wood/planks_twilight_oak_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/twilight_oak/twilight_oak_pressure_plate_down.json b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/twilight_oak/twilight_oak_pressure_plate_down.json new file mode 100644 index 0000000000..9ec653ed43 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/twilight_oak/twilight_oak_pressure_plate_down.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/pressure_plate_down", + "textures": { + "texture": "twilightforest:block/wood/planks_twilight_oak_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/twilight_oak/twilight_oak_pressure_plate_down_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/twilight_oak/twilight_oak_pressure_plate_down_1.json new file mode 100644 index 0000000000..55d463ba5a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/twilight_oak/twilight_oak_pressure_plate_down_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/pressure_plate_down", + "textures": { + "texture": "twilightforest:block/wood/planks_twilight_oak_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/twilight_oak/twilight_oak_pressure_plate_down_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/twilight_oak/twilight_oak_pressure_plate_down_2.json new file mode 100644 index 0000000000..3440b8ac94 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/twilight_oak/twilight_oak_pressure_plate_down_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/pressure_plate_down", + "textures": { + "texture": "twilightforest:block/wood/planks_twilight_oak_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/twilight_oak/twilight_oak_pressure_plate_down_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/twilight_oak/twilight_oak_pressure_plate_down_3.json new file mode 100644 index 0000000000..5fe92b38c6 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/pressure_plate/twilight_oak/twilight_oak_pressure_plate_down_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/pressure_plate_down", + "textures": { + "texture": "twilightforest:block/wood/planks_twilight_oak_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/slab/canopy/canopy_slab.json b/src/generated/resources/assets/twilightforest/models/block/wood/slab/canopy/canopy_slab.json new file mode 100644 index 0000000000..b2a4bbdc13 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/slab/canopy/canopy_slab.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/slab", + "textures": { + "bottom": "twilightforest:block/wood/planks_canopy_0", + "side": "twilightforest:block/wood/planks_canopy_0", + "top": "twilightforest:block/wood/planks_canopy_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/slab/canopy/canopy_slab_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/slab/canopy/canopy_slab_1.json new file mode 100644 index 0000000000..e2230b4b8e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/slab/canopy/canopy_slab_1.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/slab", + "textures": { + "bottom": "twilightforest:block/wood/planks_canopy_1", + "side": "twilightforest:block/wood/planks_canopy_1", + "top": "twilightforest:block/wood/planks_canopy_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/slab/canopy/canopy_slab_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/slab/canopy/canopy_slab_2.json new file mode 100644 index 0000000000..e6eb753247 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/slab/canopy/canopy_slab_2.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/slab", + "textures": { + "bottom": "twilightforest:block/wood/planks_canopy_2", + "side": "twilightforest:block/wood/planks_canopy_2", + "top": "twilightforest:block/wood/planks_canopy_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/slab/canopy/canopy_slab_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/slab/canopy/canopy_slab_3.json new file mode 100644 index 0000000000..34e8dd64c4 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/slab/canopy/canopy_slab_3.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/slab", + "textures": { + "bottom": "twilightforest:block/wood/planks_canopy_3", + "side": "twilightforest:block/wood/planks_canopy_3", + "top": "twilightforest:block/wood/planks_canopy_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/slab/darkwood/dark_slab.json b/src/generated/resources/assets/twilightforest/models/block/wood/slab/darkwood/dark_slab.json new file mode 100644 index 0000000000..269e6c5c5c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/slab/darkwood/dark_slab.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/slab", + "textures": { + "bottom": "twilightforest:block/wood/planks_darkwood_0", + "side": "twilightforest:block/wood/planks_darkwood_0", + "top": "twilightforest:block/wood/planks_darkwood_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/slab/darkwood/dark_slab_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/slab/darkwood/dark_slab_1.json new file mode 100644 index 0000000000..bc0d04fada --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/slab/darkwood/dark_slab_1.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/slab", + "textures": { + "bottom": "twilightforest:block/wood/planks_darkwood_1", + "side": "twilightforest:block/wood/planks_darkwood_1", + "top": "twilightforest:block/wood/planks_darkwood_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/slab/darkwood/dark_slab_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/slab/darkwood/dark_slab_2.json new file mode 100644 index 0000000000..b276214465 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/slab/darkwood/dark_slab_2.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/slab", + "textures": { + "bottom": "twilightforest:block/wood/planks_darkwood_2", + "side": "twilightforest:block/wood/planks_darkwood_2", + "top": "twilightforest:block/wood/planks_darkwood_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/slab/darkwood/dark_slab_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/slab/darkwood/dark_slab_3.json new file mode 100644 index 0000000000..62e1d9bb41 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/slab/darkwood/dark_slab_3.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/slab", + "textures": { + "bottom": "twilightforest:block/wood/planks_darkwood_3", + "side": "twilightforest:block/wood/planks_darkwood_3", + "top": "twilightforest:block/wood/planks_darkwood_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/slab/mangrove/mangrove_slab.json b/src/generated/resources/assets/twilightforest/models/block/wood/slab/mangrove/mangrove_slab.json new file mode 100644 index 0000000000..4ca7149fbf --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/slab/mangrove/mangrove_slab.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/slab", + "textures": { + "bottom": "twilightforest:block/wood/planks_mangrove_0", + "side": "twilightforest:block/wood/planks_mangrove_0", + "top": "twilightforest:block/wood/planks_mangrove_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/slab/mangrove/mangrove_slab_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/slab/mangrove/mangrove_slab_1.json new file mode 100644 index 0000000000..5ab9de8895 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/slab/mangrove/mangrove_slab_1.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/slab", + "textures": { + "bottom": "twilightforest:block/wood/planks_mangrove_1", + "side": "twilightforest:block/wood/planks_mangrove_1", + "top": "twilightforest:block/wood/planks_mangrove_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/slab/mangrove/mangrove_slab_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/slab/mangrove/mangrove_slab_2.json new file mode 100644 index 0000000000..bf32131fef --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/slab/mangrove/mangrove_slab_2.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/slab", + "textures": { + "bottom": "twilightforest:block/wood/planks_mangrove_2", + "side": "twilightforest:block/wood/planks_mangrove_2", + "top": "twilightforest:block/wood/planks_mangrove_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/slab/mangrove/mangrove_slab_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/slab/mangrove/mangrove_slab_3.json new file mode 100644 index 0000000000..6ee04fa35d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/slab/mangrove/mangrove_slab_3.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/slab", + "textures": { + "bottom": "twilightforest:block/wood/planks_mangrove_3", + "side": "twilightforest:block/wood/planks_mangrove_3", + "top": "twilightforest:block/wood/planks_mangrove_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/slab/mine/mining_slab.json b/src/generated/resources/assets/twilightforest/models/block/wood/slab/mine/mining_slab.json new file mode 100644 index 0000000000..eb43330605 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/slab/mine/mining_slab.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/slab", + "textures": { + "bottom": "twilightforest:block/wood/planks_mine_0", + "side": "twilightforest:block/wood/planks_mine_0", + "top": "twilightforest:block/wood/planks_mine_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/slab/mine/mining_slab_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/slab/mine/mining_slab_1.json new file mode 100644 index 0000000000..b02e2793b8 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/slab/mine/mining_slab_1.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/slab", + "textures": { + "bottom": "twilightforest:block/wood/planks_mine_1", + "side": "twilightforest:block/wood/planks_mine_1", + "top": "twilightforest:block/wood/planks_mine_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/slab/mine/mining_slab_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/slab/mine/mining_slab_2.json new file mode 100644 index 0000000000..dd923839c5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/slab/mine/mining_slab_2.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/slab", + "textures": { + "bottom": "twilightforest:block/wood/planks_mine_2", + "side": "twilightforest:block/wood/planks_mine_2", + "top": "twilightforest:block/wood/planks_mine_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/slab/mine/mining_slab_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/slab/mine/mining_slab_3.json new file mode 100644 index 0000000000..e3492e727d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/slab/mine/mining_slab_3.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/slab", + "textures": { + "bottom": "twilightforest:block/wood/planks_mine_3", + "side": "twilightforest:block/wood/planks_mine_3", + "top": "twilightforest:block/wood/planks_mine_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/slab/sort/sorting_slab.json b/src/generated/resources/assets/twilightforest/models/block/wood/slab/sort/sorting_slab.json new file mode 100644 index 0000000000..4fc3761664 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/slab/sort/sorting_slab.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/slab", + "textures": { + "bottom": "twilightforest:block/wood/planks_sort_0", + "side": "twilightforest:block/wood/planks_sort_0", + "top": "twilightforest:block/wood/planks_sort_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/slab/sort/sorting_slab_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/slab/sort/sorting_slab_1.json new file mode 100644 index 0000000000..03f6edc11b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/slab/sort/sorting_slab_1.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/slab", + "textures": { + "bottom": "twilightforest:block/wood/planks_sort_1", + "side": "twilightforest:block/wood/planks_sort_1", + "top": "twilightforest:block/wood/planks_sort_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/slab/sort/sorting_slab_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/slab/sort/sorting_slab_2.json new file mode 100644 index 0000000000..586a07f66c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/slab/sort/sorting_slab_2.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/slab", + "textures": { + "bottom": "twilightforest:block/wood/planks_sort_2", + "side": "twilightforest:block/wood/planks_sort_2", + "top": "twilightforest:block/wood/planks_sort_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/slab/sort/sorting_slab_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/slab/sort/sorting_slab_3.json new file mode 100644 index 0000000000..225370ea46 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/slab/sort/sorting_slab_3.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/slab", + "textures": { + "bottom": "twilightforest:block/wood/planks_sort_3", + "side": "twilightforest:block/wood/planks_sort_3", + "top": "twilightforest:block/wood/planks_sort_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/slab/time/time_slab.json b/src/generated/resources/assets/twilightforest/models/block/wood/slab/time/time_slab.json new file mode 100644 index 0000000000..5fae3b0b94 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/slab/time/time_slab.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/slab", + "textures": { + "bottom": "twilightforest:block/wood/planks_time_0", + "side": "twilightforest:block/wood/planks_time_0", + "top": "twilightforest:block/wood/planks_time_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/slab/time/time_slab_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/slab/time/time_slab_1.json new file mode 100644 index 0000000000..ec30062f65 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/slab/time/time_slab_1.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/slab", + "textures": { + "bottom": "twilightforest:block/wood/planks_time_1", + "side": "twilightforest:block/wood/planks_time_1", + "top": "twilightforest:block/wood/planks_time_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/slab/time/time_slab_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/slab/time/time_slab_2.json new file mode 100644 index 0000000000..5dd6b6837b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/slab/time/time_slab_2.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/slab", + "textures": { + "bottom": "twilightforest:block/wood/planks_time_2", + "side": "twilightforest:block/wood/planks_time_2", + "top": "twilightforest:block/wood/planks_time_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/slab/time/time_slab_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/slab/time/time_slab_3.json new file mode 100644 index 0000000000..78619128ae --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/slab/time/time_slab_3.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/slab", + "textures": { + "bottom": "twilightforest:block/wood/planks_time_3", + "side": "twilightforest:block/wood/planks_time_3", + "top": "twilightforest:block/wood/planks_time_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/slab/trans/transformation_slab.json b/src/generated/resources/assets/twilightforest/models/block/wood/slab/trans/transformation_slab.json new file mode 100644 index 0000000000..c4600d1978 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/slab/trans/transformation_slab.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/slab", + "textures": { + "bottom": "twilightforest:block/wood/planks_trans_0", + "side": "twilightforest:block/wood/planks_trans_0", + "top": "twilightforest:block/wood/planks_trans_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/slab/trans/transformation_slab_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/slab/trans/transformation_slab_1.json new file mode 100644 index 0000000000..4143fab1bc --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/slab/trans/transformation_slab_1.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/slab", + "textures": { + "bottom": "twilightforest:block/wood/planks_trans_1", + "side": "twilightforest:block/wood/planks_trans_1", + "top": "twilightforest:block/wood/planks_trans_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/slab/trans/transformation_slab_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/slab/trans/transformation_slab_2.json new file mode 100644 index 0000000000..156a305ffa --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/slab/trans/transformation_slab_2.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/slab", + "textures": { + "bottom": "twilightforest:block/wood/planks_trans_2", + "side": "twilightforest:block/wood/planks_trans_2", + "top": "twilightforest:block/wood/planks_trans_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/slab/trans/transformation_slab_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/slab/trans/transformation_slab_3.json new file mode 100644 index 0000000000..dc9841bc93 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/slab/trans/transformation_slab_3.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/slab", + "textures": { + "bottom": "twilightforest:block/wood/planks_trans_3", + "side": "twilightforest:block/wood/planks_trans_3", + "top": "twilightforest:block/wood/planks_trans_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/slab/twilight_oak/twilight_oak_slab.json b/src/generated/resources/assets/twilightforest/models/block/wood/slab/twilight_oak/twilight_oak_slab.json new file mode 100644 index 0000000000..7a0e8a48a3 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/slab/twilight_oak/twilight_oak_slab.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/slab", + "textures": { + "bottom": "twilightforest:block/wood/planks_twilight_oak_0", + "side": "twilightforest:block/wood/planks_twilight_oak_0", + "top": "twilightforest:block/wood/planks_twilight_oak_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/slab/twilight_oak/twilight_oak_slab_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/slab/twilight_oak/twilight_oak_slab_1.json new file mode 100644 index 0000000000..65823eab68 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/slab/twilight_oak/twilight_oak_slab_1.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/slab", + "textures": { + "bottom": "twilightforest:block/wood/planks_twilight_oak_1", + "side": "twilightforest:block/wood/planks_twilight_oak_1", + "top": "twilightforest:block/wood/planks_twilight_oak_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/slab/twilight_oak/twilight_oak_slab_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/slab/twilight_oak/twilight_oak_slab_2.json new file mode 100644 index 0000000000..edcb999027 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/slab/twilight_oak/twilight_oak_slab_2.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/slab", + "textures": { + "bottom": "twilightforest:block/wood/planks_twilight_oak_2", + "side": "twilightforest:block/wood/planks_twilight_oak_2", + "top": "twilightforest:block/wood/planks_twilight_oak_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/slab/twilight_oak/twilight_oak_slab_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/slab/twilight_oak/twilight_oak_slab_3.json new file mode 100644 index 0000000000..15c5fb680d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/slab/twilight_oak/twilight_oak_slab_3.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/slab", + "textures": { + "bottom": "twilightforest:block/wood/planks_twilight_oak_3", + "side": "twilightforest:block/wood/planks_twilight_oak_3", + "top": "twilightforest:block/wood/planks_twilight_oak_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/canopy/canopy_stairs.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/canopy/canopy_stairs.json new file mode 100644 index 0000000000..069b84144e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/canopy/canopy_stairs.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_canopy_0", + "side": "twilightforest:block/wood/planks_canopy_0", + "top": "twilightforest:block/wood/planks_canopy_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/canopy/canopy_stairs_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/canopy/canopy_stairs_1.json new file mode 100644 index 0000000000..3d9b1813b2 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/canopy/canopy_stairs_1.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_canopy_1", + "side": "twilightforest:block/wood/planks_canopy_1", + "top": "twilightforest:block/wood/planks_canopy_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/canopy/canopy_stairs_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/canopy/canopy_stairs_2.json new file mode 100644 index 0000000000..5dfb0f1c0e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/canopy/canopy_stairs_2.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_canopy_2", + "side": "twilightforest:block/wood/planks_canopy_2", + "top": "twilightforest:block/wood/planks_canopy_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/canopy/canopy_stairs_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/canopy/canopy_stairs_3.json new file mode 100644 index 0000000000..694aa4b121 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/canopy/canopy_stairs_3.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_canopy_3", + "side": "twilightforest:block/wood/planks_canopy_3", + "top": "twilightforest:block/wood/planks_canopy_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/canopy/canopy_stairs_inner.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/canopy/canopy_stairs_inner.json new file mode 100644 index 0000000000..1f286756b4 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/canopy/canopy_stairs_inner.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/inner_stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_canopy_0", + "side": "twilightforest:block/wood/planks_canopy_0", + "top": "twilightforest:block/wood/planks_canopy_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/canopy/canopy_stairs_inner_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/canopy/canopy_stairs_inner_1.json new file mode 100644 index 0000000000..02f3f0d74d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/canopy/canopy_stairs_inner_1.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/inner_stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_canopy_1", + "side": "twilightforest:block/wood/planks_canopy_1", + "top": "twilightforest:block/wood/planks_canopy_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/canopy/canopy_stairs_inner_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/canopy/canopy_stairs_inner_2.json new file mode 100644 index 0000000000..7888d78341 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/canopy/canopy_stairs_inner_2.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/inner_stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_canopy_2", + "side": "twilightforest:block/wood/planks_canopy_2", + "top": "twilightforest:block/wood/planks_canopy_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/canopy/canopy_stairs_inner_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/canopy/canopy_stairs_inner_3.json new file mode 100644 index 0000000000..1a2f0009a2 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/canopy/canopy_stairs_inner_3.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/inner_stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_canopy_3", + "side": "twilightforest:block/wood/planks_canopy_3", + "top": "twilightforest:block/wood/planks_canopy_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/canopy/canopy_stairs_outer.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/canopy/canopy_stairs_outer.json new file mode 100644 index 0000000000..3f36388889 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/canopy/canopy_stairs_outer.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/outer_stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_canopy_0", + "side": "twilightforest:block/wood/planks_canopy_0", + "top": "twilightforest:block/wood/planks_canopy_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/canopy/canopy_stairs_outer_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/canopy/canopy_stairs_outer_1.json new file mode 100644 index 0000000000..5cfdda3f59 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/canopy/canopy_stairs_outer_1.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/outer_stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_canopy_1", + "side": "twilightforest:block/wood/planks_canopy_1", + "top": "twilightforest:block/wood/planks_canopy_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/canopy/canopy_stairs_outer_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/canopy/canopy_stairs_outer_2.json new file mode 100644 index 0000000000..794a9bf68f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/canopy/canopy_stairs_outer_2.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/outer_stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_canopy_2", + "side": "twilightforest:block/wood/planks_canopy_2", + "top": "twilightforest:block/wood/planks_canopy_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/canopy/canopy_stairs_outer_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/canopy/canopy_stairs_outer_3.json new file mode 100644 index 0000000000..ed1546fbe1 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/canopy/canopy_stairs_outer_3.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/outer_stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_canopy_3", + "side": "twilightforest:block/wood/planks_canopy_3", + "top": "twilightforest:block/wood/planks_canopy_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/darkwood/dark_stairs.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/darkwood/dark_stairs.json new file mode 100644 index 0000000000..af69de5567 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/darkwood/dark_stairs.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_darkwood_0", + "side": "twilightforest:block/wood/planks_darkwood_0", + "top": "twilightforest:block/wood/planks_darkwood_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/darkwood/dark_stairs_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/darkwood/dark_stairs_1.json new file mode 100644 index 0000000000..96890351ec --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/darkwood/dark_stairs_1.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_darkwood_1", + "side": "twilightforest:block/wood/planks_darkwood_1", + "top": "twilightforest:block/wood/planks_darkwood_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/darkwood/dark_stairs_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/darkwood/dark_stairs_2.json new file mode 100644 index 0000000000..3e388eb4f7 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/darkwood/dark_stairs_2.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_darkwood_2", + "side": "twilightforest:block/wood/planks_darkwood_2", + "top": "twilightforest:block/wood/planks_darkwood_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/darkwood/dark_stairs_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/darkwood/dark_stairs_3.json new file mode 100644 index 0000000000..41bf546663 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/darkwood/dark_stairs_3.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_darkwood_3", + "side": "twilightforest:block/wood/planks_darkwood_3", + "top": "twilightforest:block/wood/planks_darkwood_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/darkwood/dark_stairs_inner.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/darkwood/dark_stairs_inner.json new file mode 100644 index 0000000000..9a65c7f91c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/darkwood/dark_stairs_inner.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/inner_stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_darkwood_0", + "side": "twilightforest:block/wood/planks_darkwood_0", + "top": "twilightforest:block/wood/planks_darkwood_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/darkwood/dark_stairs_inner_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/darkwood/dark_stairs_inner_1.json new file mode 100644 index 0000000000..835485ff0d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/darkwood/dark_stairs_inner_1.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/inner_stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_darkwood_1", + "side": "twilightforest:block/wood/planks_darkwood_1", + "top": "twilightforest:block/wood/planks_darkwood_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/darkwood/dark_stairs_inner_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/darkwood/dark_stairs_inner_2.json new file mode 100644 index 0000000000..fa997a9f8c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/darkwood/dark_stairs_inner_2.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/inner_stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_darkwood_2", + "side": "twilightforest:block/wood/planks_darkwood_2", + "top": "twilightforest:block/wood/planks_darkwood_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/darkwood/dark_stairs_inner_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/darkwood/dark_stairs_inner_3.json new file mode 100644 index 0000000000..b4ba293f3f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/darkwood/dark_stairs_inner_3.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/inner_stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_darkwood_3", + "side": "twilightforest:block/wood/planks_darkwood_3", + "top": "twilightforest:block/wood/planks_darkwood_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/darkwood/dark_stairs_outer.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/darkwood/dark_stairs_outer.json new file mode 100644 index 0000000000..27e377c3ac --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/darkwood/dark_stairs_outer.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/outer_stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_darkwood_0", + "side": "twilightforest:block/wood/planks_darkwood_0", + "top": "twilightforest:block/wood/planks_darkwood_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/darkwood/dark_stairs_outer_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/darkwood/dark_stairs_outer_1.json new file mode 100644 index 0000000000..05e69e2841 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/darkwood/dark_stairs_outer_1.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/outer_stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_darkwood_1", + "side": "twilightforest:block/wood/planks_darkwood_1", + "top": "twilightforest:block/wood/planks_darkwood_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/darkwood/dark_stairs_outer_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/darkwood/dark_stairs_outer_2.json new file mode 100644 index 0000000000..eb363f6f27 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/darkwood/dark_stairs_outer_2.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/outer_stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_darkwood_2", + "side": "twilightforest:block/wood/planks_darkwood_2", + "top": "twilightforest:block/wood/planks_darkwood_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/darkwood/dark_stairs_outer_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/darkwood/dark_stairs_outer_3.json new file mode 100644 index 0000000000..5da22d87fe --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/darkwood/dark_stairs_outer_3.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/outer_stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_darkwood_3", + "side": "twilightforest:block/wood/planks_darkwood_3", + "top": "twilightforest:block/wood/planks_darkwood_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/mangrove/mangrove_stairs.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/mangrove/mangrove_stairs.json new file mode 100644 index 0000000000..96ddc4dfc7 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/mangrove/mangrove_stairs.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_mangrove_0", + "side": "twilightforest:block/wood/planks_mangrove_0", + "top": "twilightforest:block/wood/planks_mangrove_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/mangrove/mangrove_stairs_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/mangrove/mangrove_stairs_1.json new file mode 100644 index 0000000000..6f3e106bee --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/mangrove/mangrove_stairs_1.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_mangrove_1", + "side": "twilightforest:block/wood/planks_mangrove_1", + "top": "twilightforest:block/wood/planks_mangrove_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/mangrove/mangrove_stairs_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/mangrove/mangrove_stairs_2.json new file mode 100644 index 0000000000..0a1fe02463 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/mangrove/mangrove_stairs_2.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_mangrove_2", + "side": "twilightforest:block/wood/planks_mangrove_2", + "top": "twilightforest:block/wood/planks_mangrove_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/mangrove/mangrove_stairs_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/mangrove/mangrove_stairs_3.json new file mode 100644 index 0000000000..ccae3ede18 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/mangrove/mangrove_stairs_3.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_mangrove_3", + "side": "twilightforest:block/wood/planks_mangrove_3", + "top": "twilightforest:block/wood/planks_mangrove_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/mangrove/mangrove_stairs_inner.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/mangrove/mangrove_stairs_inner.json new file mode 100644 index 0000000000..dcc9c15f46 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/mangrove/mangrove_stairs_inner.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/inner_stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_mangrove_0", + "side": "twilightforest:block/wood/planks_mangrove_0", + "top": "twilightforest:block/wood/planks_mangrove_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/mangrove/mangrove_stairs_inner_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/mangrove/mangrove_stairs_inner_1.json new file mode 100644 index 0000000000..5525129d8a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/mangrove/mangrove_stairs_inner_1.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/inner_stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_mangrove_1", + "side": "twilightforest:block/wood/planks_mangrove_1", + "top": "twilightforest:block/wood/planks_mangrove_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/mangrove/mangrove_stairs_inner_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/mangrove/mangrove_stairs_inner_2.json new file mode 100644 index 0000000000..05e2974528 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/mangrove/mangrove_stairs_inner_2.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/inner_stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_mangrove_2", + "side": "twilightforest:block/wood/planks_mangrove_2", + "top": "twilightforest:block/wood/planks_mangrove_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/mangrove/mangrove_stairs_inner_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/mangrove/mangrove_stairs_inner_3.json new file mode 100644 index 0000000000..e8ae37c8ce --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/mangrove/mangrove_stairs_inner_3.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/inner_stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_mangrove_3", + "side": "twilightforest:block/wood/planks_mangrove_3", + "top": "twilightforest:block/wood/planks_mangrove_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/mangrove/mangrove_stairs_outer.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/mangrove/mangrove_stairs_outer.json new file mode 100644 index 0000000000..9354858d1a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/mangrove/mangrove_stairs_outer.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/outer_stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_mangrove_0", + "side": "twilightforest:block/wood/planks_mangrove_0", + "top": "twilightforest:block/wood/planks_mangrove_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/mangrove/mangrove_stairs_outer_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/mangrove/mangrove_stairs_outer_1.json new file mode 100644 index 0000000000..51676b91a2 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/mangrove/mangrove_stairs_outer_1.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/outer_stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_mangrove_1", + "side": "twilightforest:block/wood/planks_mangrove_1", + "top": "twilightforest:block/wood/planks_mangrove_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/mangrove/mangrove_stairs_outer_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/mangrove/mangrove_stairs_outer_2.json new file mode 100644 index 0000000000..f6f5e3ad3c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/mangrove/mangrove_stairs_outer_2.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/outer_stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_mangrove_2", + "side": "twilightforest:block/wood/planks_mangrove_2", + "top": "twilightforest:block/wood/planks_mangrove_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/mangrove/mangrove_stairs_outer_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/mangrove/mangrove_stairs_outer_3.json new file mode 100644 index 0000000000..28240e4c84 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/mangrove/mangrove_stairs_outer_3.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/outer_stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_mangrove_3", + "side": "twilightforest:block/wood/planks_mangrove_3", + "top": "twilightforest:block/wood/planks_mangrove_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/mine/mining_stairs.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/mine/mining_stairs.json new file mode 100644 index 0000000000..d62bff0c52 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/mine/mining_stairs.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_mine_0", + "side": "twilightforest:block/wood/planks_mine_0", + "top": "twilightforest:block/wood/planks_mine_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/mine/mining_stairs_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/mine/mining_stairs_1.json new file mode 100644 index 0000000000..6107253703 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/mine/mining_stairs_1.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_mine_1", + "side": "twilightforest:block/wood/planks_mine_1", + "top": "twilightforest:block/wood/planks_mine_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/mine/mining_stairs_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/mine/mining_stairs_2.json new file mode 100644 index 0000000000..728ab4c302 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/mine/mining_stairs_2.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_mine_2", + "side": "twilightforest:block/wood/planks_mine_2", + "top": "twilightforest:block/wood/planks_mine_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/mine/mining_stairs_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/mine/mining_stairs_3.json new file mode 100644 index 0000000000..c6cc702cd8 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/mine/mining_stairs_3.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_mine_3", + "side": "twilightforest:block/wood/planks_mine_3", + "top": "twilightforest:block/wood/planks_mine_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/mine/mining_stairs_inner.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/mine/mining_stairs_inner.json new file mode 100644 index 0000000000..55e98e2290 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/mine/mining_stairs_inner.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/inner_stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_mine_0", + "side": "twilightforest:block/wood/planks_mine_0", + "top": "twilightforest:block/wood/planks_mine_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/mine/mining_stairs_inner_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/mine/mining_stairs_inner_1.json new file mode 100644 index 0000000000..c86f4aa5a7 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/mine/mining_stairs_inner_1.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/inner_stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_mine_1", + "side": "twilightforest:block/wood/planks_mine_1", + "top": "twilightforest:block/wood/planks_mine_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/mine/mining_stairs_inner_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/mine/mining_stairs_inner_2.json new file mode 100644 index 0000000000..9ba604c8cf --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/mine/mining_stairs_inner_2.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/inner_stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_mine_2", + "side": "twilightforest:block/wood/planks_mine_2", + "top": "twilightforest:block/wood/planks_mine_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/mine/mining_stairs_inner_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/mine/mining_stairs_inner_3.json new file mode 100644 index 0000000000..9294195f38 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/mine/mining_stairs_inner_3.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/inner_stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_mine_3", + "side": "twilightforest:block/wood/planks_mine_3", + "top": "twilightforest:block/wood/planks_mine_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/mine/mining_stairs_outer.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/mine/mining_stairs_outer.json new file mode 100644 index 0000000000..0aefe0a0d4 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/mine/mining_stairs_outer.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/outer_stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_mine_0", + "side": "twilightforest:block/wood/planks_mine_0", + "top": "twilightforest:block/wood/planks_mine_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/mine/mining_stairs_outer_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/mine/mining_stairs_outer_1.json new file mode 100644 index 0000000000..4b977e4cbc --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/mine/mining_stairs_outer_1.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/outer_stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_mine_1", + "side": "twilightforest:block/wood/planks_mine_1", + "top": "twilightforest:block/wood/planks_mine_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/mine/mining_stairs_outer_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/mine/mining_stairs_outer_2.json new file mode 100644 index 0000000000..578aad2763 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/mine/mining_stairs_outer_2.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/outer_stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_mine_2", + "side": "twilightforest:block/wood/planks_mine_2", + "top": "twilightforest:block/wood/planks_mine_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/mine/mining_stairs_outer_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/mine/mining_stairs_outer_3.json new file mode 100644 index 0000000000..f742fbe02a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/mine/mining_stairs_outer_3.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/outer_stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_mine_3", + "side": "twilightforest:block/wood/planks_mine_3", + "top": "twilightforest:block/wood/planks_mine_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/sort/sorting_stairs.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/sort/sorting_stairs.json new file mode 100644 index 0000000000..8abd552c81 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/sort/sorting_stairs.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_sort_0", + "side": "twilightforest:block/wood/planks_sort_0", + "top": "twilightforest:block/wood/planks_sort_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/sort/sorting_stairs_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/sort/sorting_stairs_1.json new file mode 100644 index 0000000000..c3eee9a1a8 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/sort/sorting_stairs_1.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_sort_1", + "side": "twilightforest:block/wood/planks_sort_1", + "top": "twilightforest:block/wood/planks_sort_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/sort/sorting_stairs_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/sort/sorting_stairs_2.json new file mode 100644 index 0000000000..d99f2c6a4a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/sort/sorting_stairs_2.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_sort_2", + "side": "twilightforest:block/wood/planks_sort_2", + "top": "twilightforest:block/wood/planks_sort_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/sort/sorting_stairs_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/sort/sorting_stairs_3.json new file mode 100644 index 0000000000..a2608cda2d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/sort/sorting_stairs_3.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_sort_3", + "side": "twilightforest:block/wood/planks_sort_3", + "top": "twilightforest:block/wood/planks_sort_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/sort/sorting_stairs_inner.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/sort/sorting_stairs_inner.json new file mode 100644 index 0000000000..a84bdca11c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/sort/sorting_stairs_inner.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/inner_stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_sort_0", + "side": "twilightforest:block/wood/planks_sort_0", + "top": "twilightforest:block/wood/planks_sort_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/sort/sorting_stairs_inner_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/sort/sorting_stairs_inner_1.json new file mode 100644 index 0000000000..81007e0aed --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/sort/sorting_stairs_inner_1.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/inner_stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_sort_1", + "side": "twilightforest:block/wood/planks_sort_1", + "top": "twilightforest:block/wood/planks_sort_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/sort/sorting_stairs_inner_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/sort/sorting_stairs_inner_2.json new file mode 100644 index 0000000000..80c90553c8 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/sort/sorting_stairs_inner_2.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/inner_stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_sort_2", + "side": "twilightforest:block/wood/planks_sort_2", + "top": "twilightforest:block/wood/planks_sort_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/sort/sorting_stairs_inner_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/sort/sorting_stairs_inner_3.json new file mode 100644 index 0000000000..d8079cc704 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/sort/sorting_stairs_inner_3.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/inner_stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_sort_3", + "side": "twilightforest:block/wood/planks_sort_3", + "top": "twilightforest:block/wood/planks_sort_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/sort/sorting_stairs_outer.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/sort/sorting_stairs_outer.json new file mode 100644 index 0000000000..2c06ff07f9 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/sort/sorting_stairs_outer.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/outer_stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_sort_0", + "side": "twilightforest:block/wood/planks_sort_0", + "top": "twilightforest:block/wood/planks_sort_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/sort/sorting_stairs_outer_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/sort/sorting_stairs_outer_1.json new file mode 100644 index 0000000000..795472c95b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/sort/sorting_stairs_outer_1.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/outer_stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_sort_1", + "side": "twilightforest:block/wood/planks_sort_1", + "top": "twilightforest:block/wood/planks_sort_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/sort/sorting_stairs_outer_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/sort/sorting_stairs_outer_2.json new file mode 100644 index 0000000000..44e8eb512d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/sort/sorting_stairs_outer_2.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/outer_stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_sort_2", + "side": "twilightforest:block/wood/planks_sort_2", + "top": "twilightforest:block/wood/planks_sort_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/sort/sorting_stairs_outer_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/sort/sorting_stairs_outer_3.json new file mode 100644 index 0000000000..95c0b61072 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/sort/sorting_stairs_outer_3.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/outer_stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_sort_3", + "side": "twilightforest:block/wood/planks_sort_3", + "top": "twilightforest:block/wood/planks_sort_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/time/time_stairs.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/time/time_stairs.json new file mode 100644 index 0000000000..0b45ec64e5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/time/time_stairs.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_time_0", + "side": "twilightforest:block/wood/planks_time_0", + "top": "twilightforest:block/wood/planks_time_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/time/time_stairs_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/time/time_stairs_1.json new file mode 100644 index 0000000000..d1ba258ac0 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/time/time_stairs_1.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_time_1", + "side": "twilightforest:block/wood/planks_time_1", + "top": "twilightforest:block/wood/planks_time_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/time/time_stairs_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/time/time_stairs_2.json new file mode 100644 index 0000000000..71500c9107 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/time/time_stairs_2.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_time_2", + "side": "twilightforest:block/wood/planks_time_2", + "top": "twilightforest:block/wood/planks_time_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/time/time_stairs_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/time/time_stairs_3.json new file mode 100644 index 0000000000..c3a7bc5c3e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/time/time_stairs_3.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_time_3", + "side": "twilightforest:block/wood/planks_time_3", + "top": "twilightforest:block/wood/planks_time_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/time/time_stairs_inner.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/time/time_stairs_inner.json new file mode 100644 index 0000000000..6b7cab6e5e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/time/time_stairs_inner.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/inner_stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_time_0", + "side": "twilightforest:block/wood/planks_time_0", + "top": "twilightforest:block/wood/planks_time_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/time/time_stairs_inner_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/time/time_stairs_inner_1.json new file mode 100644 index 0000000000..aa1825ad9d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/time/time_stairs_inner_1.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/inner_stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_time_1", + "side": "twilightforest:block/wood/planks_time_1", + "top": "twilightforest:block/wood/planks_time_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/time/time_stairs_inner_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/time/time_stairs_inner_2.json new file mode 100644 index 0000000000..8b32c434af --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/time/time_stairs_inner_2.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/inner_stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_time_2", + "side": "twilightforest:block/wood/planks_time_2", + "top": "twilightforest:block/wood/planks_time_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/time/time_stairs_inner_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/time/time_stairs_inner_3.json new file mode 100644 index 0000000000..5f4cee58fb --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/time/time_stairs_inner_3.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/inner_stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_time_3", + "side": "twilightforest:block/wood/planks_time_3", + "top": "twilightforest:block/wood/planks_time_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/time/time_stairs_outer.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/time/time_stairs_outer.json new file mode 100644 index 0000000000..558378e926 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/time/time_stairs_outer.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/outer_stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_time_0", + "side": "twilightforest:block/wood/planks_time_0", + "top": "twilightforest:block/wood/planks_time_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/time/time_stairs_outer_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/time/time_stairs_outer_1.json new file mode 100644 index 0000000000..ad6ef44384 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/time/time_stairs_outer_1.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/outer_stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_time_1", + "side": "twilightforest:block/wood/planks_time_1", + "top": "twilightforest:block/wood/planks_time_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/time/time_stairs_outer_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/time/time_stairs_outer_2.json new file mode 100644 index 0000000000..0ec3b55829 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/time/time_stairs_outer_2.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/outer_stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_time_2", + "side": "twilightforest:block/wood/planks_time_2", + "top": "twilightforest:block/wood/planks_time_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/time/time_stairs_outer_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/time/time_stairs_outer_3.json new file mode 100644 index 0000000000..20bf8785e4 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/time/time_stairs_outer_3.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/outer_stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_time_3", + "side": "twilightforest:block/wood/planks_time_3", + "top": "twilightforest:block/wood/planks_time_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/trans/transformation_stairs.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/trans/transformation_stairs.json new file mode 100644 index 0000000000..4d9bb9d7f5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/trans/transformation_stairs.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_trans_0", + "side": "twilightforest:block/wood/planks_trans_0", + "top": "twilightforest:block/wood/planks_trans_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/trans/transformation_stairs_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/trans/transformation_stairs_1.json new file mode 100644 index 0000000000..4090b3f4c5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/trans/transformation_stairs_1.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_trans_1", + "side": "twilightforest:block/wood/planks_trans_1", + "top": "twilightforest:block/wood/planks_trans_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/trans/transformation_stairs_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/trans/transformation_stairs_2.json new file mode 100644 index 0000000000..cc5722a93a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/trans/transformation_stairs_2.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_trans_2", + "side": "twilightforest:block/wood/planks_trans_2", + "top": "twilightforest:block/wood/planks_trans_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/trans/transformation_stairs_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/trans/transformation_stairs_3.json new file mode 100644 index 0000000000..2c7f116eb8 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/trans/transformation_stairs_3.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_trans_3", + "side": "twilightforest:block/wood/planks_trans_3", + "top": "twilightforest:block/wood/planks_trans_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/trans/transformation_stairs_inner.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/trans/transformation_stairs_inner.json new file mode 100644 index 0000000000..462e67cce5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/trans/transformation_stairs_inner.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/inner_stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_trans_0", + "side": "twilightforest:block/wood/planks_trans_0", + "top": "twilightforest:block/wood/planks_trans_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/trans/transformation_stairs_inner_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/trans/transformation_stairs_inner_1.json new file mode 100644 index 0000000000..59c28b63e6 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/trans/transformation_stairs_inner_1.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/inner_stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_trans_1", + "side": "twilightforest:block/wood/planks_trans_1", + "top": "twilightforest:block/wood/planks_trans_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/trans/transformation_stairs_inner_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/trans/transformation_stairs_inner_2.json new file mode 100644 index 0000000000..843c7cbfaa --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/trans/transformation_stairs_inner_2.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/inner_stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_trans_2", + "side": "twilightforest:block/wood/planks_trans_2", + "top": "twilightforest:block/wood/planks_trans_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/trans/transformation_stairs_inner_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/trans/transformation_stairs_inner_3.json new file mode 100644 index 0000000000..22984c564a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/trans/transformation_stairs_inner_3.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/inner_stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_trans_3", + "side": "twilightforest:block/wood/planks_trans_3", + "top": "twilightforest:block/wood/planks_trans_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/trans/transformation_stairs_outer.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/trans/transformation_stairs_outer.json new file mode 100644 index 0000000000..5e920c2b0a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/trans/transformation_stairs_outer.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/outer_stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_trans_0", + "side": "twilightforest:block/wood/planks_trans_0", + "top": "twilightforest:block/wood/planks_trans_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/trans/transformation_stairs_outer_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/trans/transformation_stairs_outer_1.json new file mode 100644 index 0000000000..b6b3389d36 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/trans/transformation_stairs_outer_1.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/outer_stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_trans_1", + "side": "twilightforest:block/wood/planks_trans_1", + "top": "twilightforest:block/wood/planks_trans_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/trans/transformation_stairs_outer_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/trans/transformation_stairs_outer_2.json new file mode 100644 index 0000000000..962cc5ebb1 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/trans/transformation_stairs_outer_2.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/outer_stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_trans_2", + "side": "twilightforest:block/wood/planks_trans_2", + "top": "twilightforest:block/wood/planks_trans_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/trans/transformation_stairs_outer_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/trans/transformation_stairs_outer_3.json new file mode 100644 index 0000000000..48cd5293ef --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/trans/transformation_stairs_outer_3.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/outer_stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_trans_3", + "side": "twilightforest:block/wood/planks_trans_3", + "top": "twilightforest:block/wood/planks_trans_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/twilight_oak/twilight_oak_stairs.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/twilight_oak/twilight_oak_stairs.json new file mode 100644 index 0000000000..3048d1fde2 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/twilight_oak/twilight_oak_stairs.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_twilight_oak_0", + "side": "twilightforest:block/wood/planks_twilight_oak_0", + "top": "twilightforest:block/wood/planks_twilight_oak_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/twilight_oak/twilight_oak_stairs_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/twilight_oak/twilight_oak_stairs_1.json new file mode 100644 index 0000000000..32df12c245 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/twilight_oak/twilight_oak_stairs_1.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_twilight_oak_1", + "side": "twilightforest:block/wood/planks_twilight_oak_1", + "top": "twilightforest:block/wood/planks_twilight_oak_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/twilight_oak/twilight_oak_stairs_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/twilight_oak/twilight_oak_stairs_2.json new file mode 100644 index 0000000000..b44ad1f421 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/twilight_oak/twilight_oak_stairs_2.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_twilight_oak_2", + "side": "twilightforest:block/wood/planks_twilight_oak_2", + "top": "twilightforest:block/wood/planks_twilight_oak_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/twilight_oak/twilight_oak_stairs_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/twilight_oak/twilight_oak_stairs_3.json new file mode 100644 index 0000000000..02a9a23c10 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/twilight_oak/twilight_oak_stairs_3.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_twilight_oak_3", + "side": "twilightforest:block/wood/planks_twilight_oak_3", + "top": "twilightforest:block/wood/planks_twilight_oak_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/twilight_oak/twilight_oak_stairs_inner.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/twilight_oak/twilight_oak_stairs_inner.json new file mode 100644 index 0000000000..5c1ee0551e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/twilight_oak/twilight_oak_stairs_inner.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/inner_stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_twilight_oak_0", + "side": "twilightforest:block/wood/planks_twilight_oak_0", + "top": "twilightforest:block/wood/planks_twilight_oak_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/twilight_oak/twilight_oak_stairs_inner_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/twilight_oak/twilight_oak_stairs_inner_1.json new file mode 100644 index 0000000000..c8b502bdeb --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/twilight_oak/twilight_oak_stairs_inner_1.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/inner_stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_twilight_oak_1", + "side": "twilightforest:block/wood/planks_twilight_oak_1", + "top": "twilightforest:block/wood/planks_twilight_oak_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/twilight_oak/twilight_oak_stairs_inner_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/twilight_oak/twilight_oak_stairs_inner_2.json new file mode 100644 index 0000000000..7ae482df15 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/twilight_oak/twilight_oak_stairs_inner_2.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/inner_stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_twilight_oak_2", + "side": "twilightforest:block/wood/planks_twilight_oak_2", + "top": "twilightforest:block/wood/planks_twilight_oak_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/twilight_oak/twilight_oak_stairs_inner_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/twilight_oak/twilight_oak_stairs_inner_3.json new file mode 100644 index 0000000000..b5c0d542ec --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/twilight_oak/twilight_oak_stairs_inner_3.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/inner_stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_twilight_oak_3", + "side": "twilightforest:block/wood/planks_twilight_oak_3", + "top": "twilightforest:block/wood/planks_twilight_oak_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/twilight_oak/twilight_oak_stairs_outer.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/twilight_oak/twilight_oak_stairs_outer.json new file mode 100644 index 0000000000..4c7b59216c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/twilight_oak/twilight_oak_stairs_outer.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/outer_stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_twilight_oak_0", + "side": "twilightforest:block/wood/planks_twilight_oak_0", + "top": "twilightforest:block/wood/planks_twilight_oak_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/twilight_oak/twilight_oak_stairs_outer_1.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/twilight_oak/twilight_oak_stairs_outer_1.json new file mode 100644 index 0000000000..5f73cd7343 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/twilight_oak/twilight_oak_stairs_outer_1.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/outer_stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_twilight_oak_1", + "side": "twilightforest:block/wood/planks_twilight_oak_1", + "top": "twilightforest:block/wood/planks_twilight_oak_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/twilight_oak/twilight_oak_stairs_outer_2.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/twilight_oak/twilight_oak_stairs_outer_2.json new file mode 100644 index 0000000000..207e088397 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/twilight_oak/twilight_oak_stairs_outer_2.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/outer_stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_twilight_oak_2", + "side": "twilightforest:block/wood/planks_twilight_oak_2", + "top": "twilightforest:block/wood/planks_twilight_oak_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/stairs/twilight_oak/twilight_oak_stairs_outer_3.json b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/twilight_oak/twilight_oak_stairs_outer_3.json new file mode 100644 index 0000000000..eb4cf27af0 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/stairs/twilight_oak/twilight_oak_stairs_outer_3.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/outer_stairs", + "textures": { + "bottom": "twilightforest:block/wood/planks_twilight_oak_3", + "side": "twilightforest:block/wood/planks_twilight_oak_3", + "top": "twilightforest:block/wood/planks_twilight_oak_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/trapdoor/canopy/canopy_trapdoor_bottom.json b/src/generated/resources/assets/twilightforest/models/block/wood/trapdoor/canopy/canopy_trapdoor_bottom.json new file mode 100644 index 0000000000..086b93e1ae --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/trapdoor/canopy/canopy_trapdoor_bottom.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_orientable_trapdoor_bottom", + "textures": { + "texture": "twilightforest:block/wood/trapdoor/canopy_trapdoor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/trapdoor/canopy/canopy_trapdoor_open.json b/src/generated/resources/assets/twilightforest/models/block/wood/trapdoor/canopy/canopy_trapdoor_open.json new file mode 100644 index 0000000000..333ff0fb2a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/trapdoor/canopy/canopy_trapdoor_open.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_orientable_trapdoor_open", + "textures": { + "texture": "twilightforest:block/wood/trapdoor/canopy_trapdoor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/trapdoor/canopy/canopy_trapdoor_top.json b/src/generated/resources/assets/twilightforest/models/block/wood/trapdoor/canopy/canopy_trapdoor_top.json new file mode 100644 index 0000000000..db6fcc69d8 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/trapdoor/canopy/canopy_trapdoor_top.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_orientable_trapdoor_top", + "textures": { + "texture": "twilightforest:block/wood/trapdoor/canopy_trapdoor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/trapdoor/darkwood/darkwood_trapdoor_bottom.json b/src/generated/resources/assets/twilightforest/models/block/wood/trapdoor/darkwood/darkwood_trapdoor_bottom.json new file mode 100644 index 0000000000..5d191f014a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/trapdoor/darkwood/darkwood_trapdoor_bottom.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_orientable_trapdoor_bottom", + "textures": { + "texture": "twilightforest:block/wood/trapdoor/darkwood_trapdoor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/trapdoor/darkwood/darkwood_trapdoor_open.json b/src/generated/resources/assets/twilightforest/models/block/wood/trapdoor/darkwood/darkwood_trapdoor_open.json new file mode 100644 index 0000000000..8f202c728e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/trapdoor/darkwood/darkwood_trapdoor_open.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_orientable_trapdoor_open", + "textures": { + "texture": "twilightforest:block/wood/trapdoor/darkwood_trapdoor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/trapdoor/darkwood/darkwood_trapdoor_top.json b/src/generated/resources/assets/twilightforest/models/block/wood/trapdoor/darkwood/darkwood_trapdoor_top.json new file mode 100644 index 0000000000..439fef6730 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/trapdoor/darkwood/darkwood_trapdoor_top.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_orientable_trapdoor_top", + "textures": { + "texture": "twilightforest:block/wood/trapdoor/darkwood_trapdoor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/trapdoor/mangrove/mangrove_trapdoor_bottom.json b/src/generated/resources/assets/twilightforest/models/block/wood/trapdoor/mangrove/mangrove_trapdoor_bottom.json new file mode 100644 index 0000000000..229d1611ea --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/trapdoor/mangrove/mangrove_trapdoor_bottom.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_orientable_trapdoor_bottom", + "textures": { + "texture": "twilightforest:block/wood/trapdoor/mangrove_trapdoor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/trapdoor/mangrove/mangrove_trapdoor_open.json b/src/generated/resources/assets/twilightforest/models/block/wood/trapdoor/mangrove/mangrove_trapdoor_open.json new file mode 100644 index 0000000000..d42e95902b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/trapdoor/mangrove/mangrove_trapdoor_open.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_orientable_trapdoor_open", + "textures": { + "texture": "twilightforest:block/wood/trapdoor/mangrove_trapdoor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/trapdoor/mangrove/mangrove_trapdoor_top.json b/src/generated/resources/assets/twilightforest/models/block/wood/trapdoor/mangrove/mangrove_trapdoor_top.json new file mode 100644 index 0000000000..b255a5a8fe --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/trapdoor/mangrove/mangrove_trapdoor_top.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_orientable_trapdoor_top", + "textures": { + "texture": "twilightforest:block/wood/trapdoor/mangrove_trapdoor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/trapdoor/mine/mine_trapdoor_bottom.json b/src/generated/resources/assets/twilightforest/models/block/wood/trapdoor/mine/mine_trapdoor_bottom.json new file mode 100644 index 0000000000..5078b28e0c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/trapdoor/mine/mine_trapdoor_bottom.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_orientable_trapdoor_bottom", + "textures": { + "texture": "twilightforest:block/wood/trapdoor/mine_trapdoor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/trapdoor/mine/mine_trapdoor_open.json b/src/generated/resources/assets/twilightforest/models/block/wood/trapdoor/mine/mine_trapdoor_open.json new file mode 100644 index 0000000000..48a678f7d0 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/trapdoor/mine/mine_trapdoor_open.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_orientable_trapdoor_open", + "textures": { + "texture": "twilightforest:block/wood/trapdoor/mine_trapdoor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/trapdoor/mine/mine_trapdoor_top.json b/src/generated/resources/assets/twilightforest/models/block/wood/trapdoor/mine/mine_trapdoor_top.json new file mode 100644 index 0000000000..73dbdfe7c1 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/trapdoor/mine/mine_trapdoor_top.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_orientable_trapdoor_top", + "textures": { + "texture": "twilightforest:block/wood/trapdoor/mine_trapdoor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/trapdoor/sort/sort_trapdoor_bottom.json b/src/generated/resources/assets/twilightforest/models/block/wood/trapdoor/sort/sort_trapdoor_bottom.json new file mode 100644 index 0000000000..f980653cd4 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/trapdoor/sort/sort_trapdoor_bottom.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_orientable_trapdoor_bottom", + "render_type": "minecraft:cutout", + "textures": { + "texture": "twilightforest:block/wood/trapdoor/sort_trapdoor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/trapdoor/sort/sort_trapdoor_open.json b/src/generated/resources/assets/twilightforest/models/block/wood/trapdoor/sort/sort_trapdoor_open.json new file mode 100644 index 0000000000..738f024edc --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/trapdoor/sort/sort_trapdoor_open.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_orientable_trapdoor_open", + "render_type": "minecraft:cutout", + "textures": { + "texture": "twilightforest:block/wood/trapdoor/sort_trapdoor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/trapdoor/sort/sort_trapdoor_top.json b/src/generated/resources/assets/twilightforest/models/block/wood/trapdoor/sort/sort_trapdoor_top.json new file mode 100644 index 0000000000..ab6d8e8f97 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/trapdoor/sort/sort_trapdoor_top.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_orientable_trapdoor_top", + "render_type": "minecraft:cutout", + "textures": { + "texture": "twilightforest:block/wood/trapdoor/sort_trapdoor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/trapdoor/time/time_trapdoor_bottom.json b/src/generated/resources/assets/twilightforest/models/block/wood/trapdoor/time/time_trapdoor_bottom.json new file mode 100644 index 0000000000..af5ffb87d8 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/trapdoor/time/time_trapdoor_bottom.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_orientable_trapdoor_bottom", + "render_type": "minecraft:cutout", + "textures": { + "texture": "twilightforest:block/wood/trapdoor/time_trapdoor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/trapdoor/time/time_trapdoor_open.json b/src/generated/resources/assets/twilightforest/models/block/wood/trapdoor/time/time_trapdoor_open.json new file mode 100644 index 0000000000..8a1aefc5dd --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/trapdoor/time/time_trapdoor_open.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_orientable_trapdoor_open", + "render_type": "minecraft:cutout", + "textures": { + "texture": "twilightforest:block/wood/trapdoor/time_trapdoor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/trapdoor/time/time_trapdoor_top.json b/src/generated/resources/assets/twilightforest/models/block/wood/trapdoor/time/time_trapdoor_top.json new file mode 100644 index 0000000000..60bd345ae2 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/trapdoor/time/time_trapdoor_top.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_orientable_trapdoor_top", + "render_type": "minecraft:cutout", + "textures": { + "texture": "twilightforest:block/wood/trapdoor/time_trapdoor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/trapdoor/trans/trans_trapdoor_bottom.json b/src/generated/resources/assets/twilightforest/models/block/wood/trapdoor/trans/trans_trapdoor_bottom.json new file mode 100644 index 0000000000..387517b5ce --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/trapdoor/trans/trans_trapdoor_bottom.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_orientable_trapdoor_bottom", + "render_type": "minecraft:cutout", + "textures": { + "texture": "twilightforest:block/wood/trapdoor/trans_trapdoor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/trapdoor/trans/trans_trapdoor_open.json b/src/generated/resources/assets/twilightforest/models/block/wood/trapdoor/trans/trans_trapdoor_open.json new file mode 100644 index 0000000000..f7b32bc2be --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/trapdoor/trans/trans_trapdoor_open.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_orientable_trapdoor_open", + "render_type": "minecraft:cutout", + "textures": { + "texture": "twilightforest:block/wood/trapdoor/trans_trapdoor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/trapdoor/trans/trans_trapdoor_top.json b/src/generated/resources/assets/twilightforest/models/block/wood/trapdoor/trans/trans_trapdoor_top.json new file mode 100644 index 0000000000..5dfd129e89 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/trapdoor/trans/trans_trapdoor_top.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_orientable_trapdoor_top", + "render_type": "minecraft:cutout", + "textures": { + "texture": "twilightforest:block/wood/trapdoor/trans_trapdoor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/trapdoor/twilight_oak/twilight_oak_trapdoor_bottom.json b/src/generated/resources/assets/twilightforest/models/block/wood/trapdoor/twilight_oak/twilight_oak_trapdoor_bottom.json new file mode 100644 index 0000000000..269222a5cd --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/trapdoor/twilight_oak/twilight_oak_trapdoor_bottom.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_orientable_trapdoor_bottom", + "textures": { + "texture": "twilightforest:block/wood/trapdoor/twilight_oak_trapdoor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/trapdoor/twilight_oak/twilight_oak_trapdoor_open.json b/src/generated/resources/assets/twilightforest/models/block/wood/trapdoor/twilight_oak/twilight_oak_trapdoor_open.json new file mode 100644 index 0000000000..95ebba0e6e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/trapdoor/twilight_oak/twilight_oak_trapdoor_open.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_orientable_trapdoor_open", + "textures": { + "texture": "twilightforest:block/wood/trapdoor/twilight_oak_trapdoor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/wood/trapdoor/twilight_oak/twilight_oak_trapdoor_top.json b/src/generated/resources/assets/twilightforest/models/block/wood/trapdoor/twilight_oak/twilight_oak_trapdoor_top.json new file mode 100644 index 0000000000..876670372d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/wood/trapdoor/twilight_oak/twilight_oak_trapdoor_top.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_orientable_trapdoor_top", + "textures": { + "texture": "twilightforest:block/wood/trapdoor/twilight_oak_trapdoor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/worn_castle_brick.json b/src/generated/resources/assets/twilightforest/models/block/worn_castle_brick.json new file mode 100644 index 0000000000..ffe1f1b85e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/worn_castle_brick.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "twilightforest:block/worn_castle_brick" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/worn_castle_brick_stairs.json b/src/generated/resources/assets/twilightforest/models/block/worn_castle_brick_stairs.json new file mode 100644 index 0000000000..e42a754fbe --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/worn_castle_brick_stairs.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/stairs", + "textures": { + "bottom": "twilightforest:block/worn_castle_brick", + "side": "twilightforest:block/worn_castle_brick", + "top": "twilightforest:block/worn_castle_brick" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/worn_castle_brick_stairs_inner.json b/src/generated/resources/assets/twilightforest/models/block/worn_castle_brick_stairs_inner.json new file mode 100644 index 0000000000..9159c97a15 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/worn_castle_brick_stairs_inner.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/inner_stairs", + "textures": { + "bottom": "twilightforest:block/worn_castle_brick", + "side": "twilightforest:block/worn_castle_brick", + "top": "twilightforest:block/worn_castle_brick" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/worn_castle_brick_stairs_outer.json b/src/generated/resources/assets/twilightforest/models/block/worn_castle_brick_stairs_outer.json new file mode 100644 index 0000000000..d4691a6aae --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/worn_castle_brick_stairs_outer.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/outer_stairs", + "textures": { + "bottom": "twilightforest:block/worn_castle_brick", + "side": "twilightforest:block/worn_castle_brick", + "top": "twilightforest:block/worn_castle_brick" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/yellow_castle_door.json b/src/generated/resources/assets/twilightforest/models/block/yellow_castle_door.json new file mode 100644 index 0000000000..94f18d7e7c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/yellow_castle_door.json @@ -0,0 +1,11 @@ +{ + "parent": "minecraft:block/block", + "loader": "twilightforest:castle_door", + "render_type": "minecraft:cutout", + "textures": { + "base": "twilightforest:block/castle_door", + "overlay": "twilightforest:block/castle_door_rune_corners", + "overlay_connected": "twilightforest:block/castle_door_rune_ctm", + "particle": "twilightforest:block/castle_door" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/block/yellow_castle_door_vanished.json b/src/generated/resources/assets/twilightforest/models/block/yellow_castle_door_vanished.json new file mode 100644 index 0000000000..9307588e5a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/block/yellow_castle_door_vanished.json @@ -0,0 +1,11 @@ +{ + "parent": "minecraft:block/block", + "loader": "twilightforest:castle_door", + "render_type": "minecraft:cutout", + "textures": { + "base": "twilightforest:block/castle_door_vanished", + "overlay": "twilightforest:block/castle_door_rune_corners", + "overlay_connected": "twilightforest:block/castle_door_rune_ctm", + "particle": "twilightforest:block/castle_door_vanished" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/acacia_banister.json b/src/generated/resources/assets/twilightforest/models/item/acacia_banister.json new file mode 100644 index 0000000000..886990daf0 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/acacia_banister.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:item/banister_item", + "textures": { + "texture": "minecraft:block/acacia_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/adherent_spawn_egg.json b/src/generated/resources/assets/twilightforest/models/item/adherent_spawn_egg.json new file mode 100644 index 0000000000..d1aaa9d6ef --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/adherent_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/alpha_yeti_banner_pattern.json b/src/generated/resources/assets/twilightforest/models/item/alpha_yeti_banner_pattern.json new file mode 100644 index 0000000000..dd801b92f0 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/alpha_yeti_banner_pattern.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/tf_banner_pattern" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/alpha_yeti_boss_spawner.json b/src/generated/resources/assets/twilightforest/models/item/alpha_yeti_boss_spawner.json new file mode 100644 index 0000000000..f54a94f6b5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/alpha_yeti_boss_spawner.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/spawner" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/alpha_yeti_fur.json b/src/generated/resources/assets/twilightforest/models/item/alpha_yeti_fur.json new file mode 100644 index 0000000000..8e5c7652e6 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/alpha_yeti_fur.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/alpha_yeti_fur" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/alpha_yeti_spawn_egg.json b/src/generated/resources/assets/twilightforest/models/item/alpha_yeti_spawn_egg.json new file mode 100644 index 0000000000..d1aaa9d6ef --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/alpha_yeti_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/antibuilder.json b/src/generated/resources/assets/twilightforest/models/item/antibuilder.json new file mode 100644 index 0000000000..975daf35d4 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/antibuilder.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/antibuilder" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/arctic_boots.json b/src/generated/resources/assets/twilightforest/models/item/arctic_boots.json new file mode 100644 index 0000000000..81f23545f3 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/arctic_boots.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/arctic_boots", + "layer1": "twilightforest:item/arctic_boots_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/arctic_chestplate.json b/src/generated/resources/assets/twilightforest/models/item/arctic_chestplate.json new file mode 100644 index 0000000000..6ea7d500a2 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/arctic_chestplate.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/arctic_chestplate", + "layer1": "twilightforest:item/arctic_chestplate_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/arctic_fur.json b/src/generated/resources/assets/twilightforest/models/item/arctic_fur.json new file mode 100644 index 0000000000..4200460423 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/arctic_fur.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/arctic_fur" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/arctic_fur_block.json b/src/generated/resources/assets/twilightforest/models/item/arctic_fur_block.json new file mode 100644 index 0000000000..b3895072c0 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/arctic_fur_block.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/arctic_fur_block" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/arctic_helmet.json b/src/generated/resources/assets/twilightforest/models/item/arctic_helmet.json new file mode 100644 index 0000000000..ac451063dc --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/arctic_helmet.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/arctic_helmet", + "layer1": "twilightforest:item/arctic_helmet_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/arctic_leggings.json b/src/generated/resources/assets/twilightforest/models/item/arctic_leggings.json new file mode 100644 index 0000000000..8d57c3f254 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/arctic_leggings.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/arctic_leggings", + "layer1": "twilightforest:item/arctic_leggings_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/armor_shard.json b/src/generated/resources/assets/twilightforest/models/item/armor_shard.json new file mode 100644 index 0000000000..303fe8fd51 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/armor_shard.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/armor_shard" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/armor_shard_cluster.json b/src/generated/resources/assets/twilightforest/models/item/armor_shard_cluster.json new file mode 100644 index 0000000000..c74eab4610 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/armor_shard_cluster.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/armor_shard_cluster" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/armored_giant_spawn_egg.json b/src/generated/resources/assets/twilightforest/models/item/armored_giant_spawn_egg.json new file mode 100644 index 0000000000..d1aaa9d6ef --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/armored_giant_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/aurora_block.json b/src/generated/resources/assets/twilightforest/models/item/aurora_block.json new file mode 100644 index 0000000000..8b70f7d6fd --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/aurora_block.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/aurora_block_0" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/aurora_pillar.json b/src/generated/resources/assets/twilightforest/models/item/aurora_pillar.json new file mode 100644 index 0000000000..fc1b18cfb1 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/aurora_pillar.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/aurora_pillar" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/aurora_slab.json b/src/generated/resources/assets/twilightforest/models/item/aurora_slab.json new file mode 100644 index 0000000000..27d9612470 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/aurora_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/aurora_slab" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/auroralized_glass.json b/src/generated/resources/assets/twilightforest/models/item/auroralized_glass.json new file mode 100644 index 0000000000..4da35e1469 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/auroralized_glass.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/auroralized_glass" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/beanstalk_leaves.json b/src/generated/resources/assets/twilightforest/models/item/beanstalk_leaves.json new file mode 100644 index 0000000000..6b26318be1 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/beanstalk_leaves.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/azalea_leaves" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/bighorn_sheep_spawn_egg.json b/src/generated/resources/assets/twilightforest/models/item/bighorn_sheep_spawn_egg.json new file mode 100644 index 0000000000..d1aaa9d6ef --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/bighorn_sheep_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/birch_banister.json b/src/generated/resources/assets/twilightforest/models/item/birch_banister.json new file mode 100644 index 0000000000..483a9169c2 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/birch_banister.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:item/banister_item", + "textures": { + "texture": "minecraft:block/birch_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/block_and_chain.json b/src/generated/resources/assets/twilightforest/models/item/block_and_chain.json new file mode 100644 index 0000000000..33c36a58a6 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/block_and_chain.json @@ -0,0 +1,14 @@ +{ + "parent": "minecraft:item/handheld", + "overrides": [ + { + "model": "twilightforest:item/block_and_chain_thrown", + "predicate": { + "twilightforest:thrown": 1.0 + } + } + ], + "textures": { + "layer0": "twilightforest:item/block_and_chain" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/block_and_chain_thrown.json b/src/generated/resources/assets/twilightforest/models/item/block_and_chain_thrown.json new file mode 100644 index 0000000000..518564e9a5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/block_and_chain_thrown.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "twilightforest:item/block_and_chain_thrown" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/blockchain_goblin_spawn_egg.json b/src/generated/resources/assets/twilightforest/models/item/blockchain_goblin_spawn_egg.json new file mode 100644 index 0000000000..d1aaa9d6ef --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/blockchain_goblin_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/blue_castle_door.json b/src/generated/resources/assets/twilightforest/models/item/blue_castle_door.json new file mode 100644 index 0000000000..44ec011156 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/blue_castle_door.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/blue_castle_door" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/blue_castle_rune_brick.json b/src/generated/resources/assets/twilightforest/models/item/blue_castle_rune_brick.json new file mode 100644 index 0000000000..4f73415787 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/blue_castle_rune_brick.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/castle_rune_inventory" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/blue_force_field.json b/src/generated/resources/assets/twilightforest/models/item/blue_force_field.json new file mode 100644 index 0000000000..457bcfcf18 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/blue_force_field.json @@ -0,0 +1,20 @@ +{ + "parent": "minecraft:item/generated", + "forge_data": { + "layers": { + "0": { + "block_light": 15, + "sky_light": 15 + } + } + }, + "loader": "forge:item_layers", + "render_types": { + "minecraft:translucent": [ + 0 + ] + }, + "textures": { + "layer0": "twilightforest:block/forcefield_white" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/boar_spawn_egg.json b/src/generated/resources/assets/twilightforest/models/item/boar_spawn_egg.json new file mode 100644 index 0000000000..d1aaa9d6ef --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/boar_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/bold_castle_brick_pillar.json b/src/generated/resources/assets/twilightforest/models/item/bold_castle_brick_pillar.json new file mode 100644 index 0000000000..6d5cfabbfc --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/bold_castle_brick_pillar.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/bold_castle_brick_pillar" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/bold_castle_brick_stairs.json b/src/generated/resources/assets/twilightforest/models/item/bold_castle_brick_stairs.json new file mode 100644 index 0000000000..a943012ac2 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/bold_castle_brick_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/bold_castle_brick_stairs" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/bold_castle_brick_tile.json b/src/generated/resources/assets/twilightforest/models/item/bold_castle_brick_tile.json new file mode 100644 index 0000000000..f3debb4426 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/bold_castle_brick_tile.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/bold_castle_brick_tile" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/bold_stone_pillar.json b/src/generated/resources/assets/twilightforest/models/item/bold_stone_pillar.json new file mode 100644 index 0000000000..3364f5e23c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/bold_stone_pillar.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/bold_stone_pillar" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/borer_essence.json b/src/generated/resources/assets/twilightforest/models/item/borer_essence.json new file mode 100644 index 0000000000..80e23c3640 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/borer_essence.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/borer_essence", + "layer1": "twilightforest:item/borer_essence_particles" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/brittle_flask_0.json b/src/generated/resources/assets/twilightforest/models/item/brittle_flask_0.json new file mode 100644 index 0000000000..611079fd3d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/brittle_flask_0.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/brittle_potion_flask_1", + "layer1": "twilightforest:item/brittle_potion_flask_labelled" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/brittle_flask_0_cracked.json b/src/generated/resources/assets/twilightforest/models/item/brittle_flask_0_cracked.json new file mode 100644 index 0000000000..5d28c4553f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/brittle_flask_0_cracked.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/brittle_potion_flask_1", + "layer1": "twilightforest:item/brittle_potion_flask_cracked" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/brittle_flask_0_damaged.json b/src/generated/resources/assets/twilightforest/models/item/brittle_flask_0_damaged.json new file mode 100644 index 0000000000..0eed2c3b3d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/brittle_flask_0_damaged.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/brittle_potion_flask_1", + "layer1": "twilightforest:item/brittle_potion_flask_damaged" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/brittle_flask_0_splintered.json b/src/generated/resources/assets/twilightforest/models/item/brittle_flask_0_splintered.json new file mode 100644 index 0000000000..866b16041a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/brittle_flask_0_splintered.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/brittle_potion_flask_1", + "layer1": "twilightforest:item/brittle_potion_flask_splintered" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/brittle_flask_1.json b/src/generated/resources/assets/twilightforest/models/item/brittle_flask_1.json new file mode 100644 index 0000000000..964bd06559 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/brittle_flask_1.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/brittle_potion_flask_2", + "layer1": "twilightforest:item/brittle_potion_flask_labelled" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/brittle_flask_1_cracked.json b/src/generated/resources/assets/twilightforest/models/item/brittle_flask_1_cracked.json new file mode 100644 index 0000000000..f227ec088b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/brittle_flask_1_cracked.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/brittle_potion_flask_2", + "layer1": "twilightforest:item/brittle_potion_flask_cracked" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/brittle_flask_1_damaged.json b/src/generated/resources/assets/twilightforest/models/item/brittle_flask_1_damaged.json new file mode 100644 index 0000000000..7deaf25c6f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/brittle_flask_1_damaged.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/brittle_potion_flask_2", + "layer1": "twilightforest:item/brittle_potion_flask_damaged" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/brittle_flask_1_splintered.json b/src/generated/resources/assets/twilightforest/models/item/brittle_flask_1_splintered.json new file mode 100644 index 0000000000..dc1e67e1f2 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/brittle_flask_1_splintered.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/brittle_potion_flask_2", + "layer1": "twilightforest:item/brittle_potion_flask_splintered" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/brittle_flask_2.json b/src/generated/resources/assets/twilightforest/models/item/brittle_flask_2.json new file mode 100644 index 0000000000..aaecf4b4de --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/brittle_flask_2.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/brittle_potion_flask_3", + "layer1": "twilightforest:item/brittle_potion_flask_labelled" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/brittle_flask_2_cracked.json b/src/generated/resources/assets/twilightforest/models/item/brittle_flask_2_cracked.json new file mode 100644 index 0000000000..dde0e5d257 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/brittle_flask_2_cracked.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/brittle_potion_flask_3", + "layer1": "twilightforest:item/brittle_potion_flask_cracked" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/brittle_flask_2_damaged.json b/src/generated/resources/assets/twilightforest/models/item/brittle_flask_2_damaged.json new file mode 100644 index 0000000000..d062a5e338 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/brittle_flask_2_damaged.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/brittle_potion_flask_3", + "layer1": "twilightforest:item/brittle_potion_flask_damaged" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/brittle_flask_2_splintered.json b/src/generated/resources/assets/twilightforest/models/item/brittle_flask_2_splintered.json new file mode 100644 index 0000000000..90e470ac82 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/brittle_flask_2_splintered.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/brittle_potion_flask_3", + "layer1": "twilightforest:item/brittle_potion_flask_splintered" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/brittle_flask_3.json b/src/generated/resources/assets/twilightforest/models/item/brittle_flask_3.json new file mode 100644 index 0000000000..7921da6150 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/brittle_flask_3.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/brittle_potion_flask_4", + "layer1": "twilightforest:item/brittle_potion_flask_labelled" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/brittle_flask_3_cracked.json b/src/generated/resources/assets/twilightforest/models/item/brittle_flask_3_cracked.json new file mode 100644 index 0000000000..4074420c7b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/brittle_flask_3_cracked.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/brittle_potion_flask_4", + "layer1": "twilightforest:item/brittle_potion_flask_cracked" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/brittle_flask_3_damaged.json b/src/generated/resources/assets/twilightforest/models/item/brittle_flask_3_damaged.json new file mode 100644 index 0000000000..baf04c46b6 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/brittle_flask_3_damaged.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/brittle_potion_flask_4", + "layer1": "twilightforest:item/brittle_potion_flask_damaged" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/brittle_flask_3_splintered.json b/src/generated/resources/assets/twilightforest/models/item/brittle_flask_3_splintered.json new file mode 100644 index 0000000000..e6926cf611 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/brittle_flask_3_splintered.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/brittle_potion_flask_4", + "layer1": "twilightforest:item/brittle_potion_flask_splintered" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/brittle_flask_cracked.json b/src/generated/resources/assets/twilightforest/models/item/brittle_flask_cracked.json new file mode 100644 index 0000000000..34c656d14f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/brittle_flask_cracked.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/brittle_potion_flask_cracked" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/brittle_flask_damaged.json b/src/generated/resources/assets/twilightforest/models/item/brittle_flask_damaged.json new file mode 100644 index 0000000000..89392c32bc --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/brittle_flask_damaged.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/brittle_potion_flask_damaged" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/brittle_flask_splintered.json b/src/generated/resources/assets/twilightforest/models/item/brittle_flask_splintered.json new file mode 100644 index 0000000000..3bd06289ec --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/brittle_flask_splintered.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/brittle_potion_flask_splintered" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/brittle_potion_flask.json b/src/generated/resources/assets/twilightforest/models/item/brittle_potion_flask.json new file mode 100644 index 0000000000..b440b1d22e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/brittle_potion_flask.json @@ -0,0 +1,138 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "twilightforest:item/brittle_flask_0", + "predicate": { + "twilightforest:potion_level": 1.0 + } + }, + { + "model": "twilightforest:item/brittle_flask_1", + "predicate": { + "twilightforest:potion_level": 2.0 + } + }, + { + "model": "twilightforest:item/brittle_flask_2", + "predicate": { + "twilightforest:potion_level": 3.0 + } + }, + { + "model": "twilightforest:item/brittle_flask_3", + "predicate": { + "twilightforest:potion_level": 4.0 + } + }, + { + "model": "twilightforest:item/brittle_flask_splintered", + "predicate": { + "twilightforest:breakage": 1.0, + "twilightforest:potion_level": 0.0 + } + }, + { + "model": "twilightforest:item/brittle_flask_0_splintered", + "predicate": { + "twilightforest:breakage": 1.0, + "twilightforest:potion_level": 1.0 + } + }, + { + "model": "twilightforest:item/brittle_flask_1_splintered", + "predicate": { + "twilightforest:breakage": 1.0, + "twilightforest:potion_level": 2.0 + } + }, + { + "model": "twilightforest:item/brittle_flask_2_splintered", + "predicate": { + "twilightforest:breakage": 1.0, + "twilightforest:potion_level": 3.0 + } + }, + { + "model": "twilightforest:item/brittle_flask_3_splintered", + "predicate": { + "twilightforest:breakage": 1.0, + "twilightforest:potion_level": 4.0 + } + }, + { + "model": "twilightforest:item/brittle_flask_cracked", + "predicate": { + "twilightforest:breakage": 2.0, + "twilightforest:potion_level": 0.0 + } + }, + { + "model": "twilightforest:item/brittle_flask_0_cracked", + "predicate": { + "twilightforest:breakage": 2.0, + "twilightforest:potion_level": 1.0 + } + }, + { + "model": "twilightforest:item/brittle_flask_1_cracked", + "predicate": { + "twilightforest:breakage": 2.0, + "twilightforest:potion_level": 2.0 + } + }, + { + "model": "twilightforest:item/brittle_flask_2_cracked", + "predicate": { + "twilightforest:breakage": 2.0, + "twilightforest:potion_level": 3.0 + } + }, + { + "model": "twilightforest:item/brittle_flask_3_cracked", + "predicate": { + "twilightforest:breakage": 2.0, + "twilightforest:potion_level": 4.0 + } + }, + { + "model": "twilightforest:item/brittle_flask_damaged", + "predicate": { + "twilightforest:breakage": 3.0, + "twilightforest:potion_level": 0.0 + } + }, + { + "model": "twilightforest:item/brittle_flask_0_damaged", + "predicate": { + "twilightforest:breakage": 3.0, + "twilightforest:potion_level": 1.0 + } + }, + { + "model": "twilightforest:item/brittle_flask_1_damaged", + "predicate": { + "twilightforest:breakage": 3.0, + "twilightforest:potion_level": 2.0 + } + }, + { + "model": "twilightforest:item/brittle_flask_2_damaged", + "predicate": { + "twilightforest:breakage": 3.0, + "twilightforest:potion_level": 3.0 + } + }, + { + "model": "twilightforest:item/brittle_flask_3_damaged", + "predicate": { + "twilightforest:breakage": 3.0, + "twilightforest:potion_level": 4.0 + } + } + ], + "textures": { + "layer0": "twilightforest:block/stone_twist/twist_blank", + "layer1": "twilightforest:item/brittle_potion_flask" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/brown_thorns.json b/src/generated/resources/assets/twilightforest/models/item/brown_thorns.json new file mode 100644 index 0000000000..9b99c77b42 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/brown_thorns.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/brown_thorns" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/burnt_thorns.json b/src/generated/resources/assets/twilightforest/models/item/burnt_thorns.json new file mode 100644 index 0000000000..41b25f609d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/burnt_thorns.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/burnt_thorns" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/candelabra.json b/src/generated/resources/assets/twilightforest/models/item/candelabra.json new file mode 100644 index 0000000000..334ad28c42 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/candelabra.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/candelabra_4_5_4_plain" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/canopy_banister.json b/src/generated/resources/assets/twilightforest/models/item/canopy_banister.json new file mode 100644 index 0000000000..d504019d5f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/canopy_banister.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:item/banister_item", + "textures": { + "texture": "twilightforest:block/wood/planks_canopy_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/canopy_boat.json b/src/generated/resources/assets/twilightforest/models/item/canopy_boat.json new file mode 100644 index 0000000000..ca45b0358f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/canopy_boat.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/canopy_boat" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/canopy_bookshelf.json b/src/generated/resources/assets/twilightforest/models/item/canopy_bookshelf.json new file mode 100644 index 0000000000..6431011c64 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/canopy_bookshelf.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/canopy_bookshelf" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/canopy_button.json b/src/generated/resources/assets/twilightforest/models/item/canopy_button.json new file mode 100644 index 0000000000..0d7eb99629 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/canopy_button.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button_inventory", + "textures": { + "texture": "twilightforest:block/wood/planks_canopy_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/canopy_chest.json b/src/generated/resources/assets/twilightforest/models/item/canopy_chest.json new file mode 100644 index 0000000000..a8c7196bcb --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/canopy_chest.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/chest", + "textures": { + "particle": "twilightforest:block/wood/planks_canopy_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/canopy_chest_boat.json b/src/generated/resources/assets/twilightforest/models/item/canopy_chest_boat.json new file mode 100644 index 0000000000..21afc5d334 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/canopy_chest_boat.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/canopy_chest_boat" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/canopy_door.json b/src/generated/resources/assets/twilightforest/models/item/canopy_door.json new file mode 100644 index 0000000000..e7be68750f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/canopy_door.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/canopy_door" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/canopy_fence.json b/src/generated/resources/assets/twilightforest/models/item/canopy_fence.json new file mode 100644 index 0000000000..04ed8bb774 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/canopy_fence.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_inventory", + "textures": { + "texture": "twilightforest:block/wood/planks_canopy_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/canopy_fence_gate.json b/src/generated/resources/assets/twilightforest/models/item/canopy_fence_gate.json new file mode 100644 index 0000000000..01bcc462c3 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/canopy_fence_gate.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/wood/fence_gate/canopy/canopy_fence_gate" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/canopy_leaves.json b/src/generated/resources/assets/twilightforest/models/item/canopy_leaves.json new file mode 100644 index 0000000000..75bfcae4f3 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/canopy_leaves.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/canopy_leaves" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/canopy_log.json b/src/generated/resources/assets/twilightforest/models/item/canopy_log.json new file mode 100644 index 0000000000..992fa9b216 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/canopy_log.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/canopy_log" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/canopy_planks.json b/src/generated/resources/assets/twilightforest/models/item/canopy_planks.json new file mode 100644 index 0000000000..7df192e39b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/canopy_planks.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/wood/planks/canopy/canopy_planks" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/canopy_pressure_plate.json b/src/generated/resources/assets/twilightforest/models/item/canopy_pressure_plate.json new file mode 100644 index 0000000000..5b5a4f81ee --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/canopy_pressure_plate.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/wood/pressure_plate/canopy/canopy_pressure_plate" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/canopy_sapling.json b/src/generated/resources/assets/twilightforest/models/item/canopy_sapling.json new file mode 100644 index 0000000000..ab9a73b0e9 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/canopy_sapling.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:block/canopy_sapling" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/canopy_sign.json b/src/generated/resources/assets/twilightforest/models/item/canopy_sign.json new file mode 100644 index 0000000000..7efa83aec1 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/canopy_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/canopy_sign" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/canopy_slab.json b/src/generated/resources/assets/twilightforest/models/item/canopy_slab.json new file mode 100644 index 0000000000..c91bc2f777 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/canopy_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/wood/slab/canopy/canopy_slab" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/canopy_stairs.json b/src/generated/resources/assets/twilightforest/models/item/canopy_stairs.json new file mode 100644 index 0000000000..8d83d22a6b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/canopy_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/wood/stairs/canopy/canopy_stairs" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/canopy_trapdoor.json b/src/generated/resources/assets/twilightforest/models/item/canopy_trapdoor.json new file mode 100644 index 0000000000..7eab5a0d11 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/canopy_trapdoor.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/wood/trapdoor/canopy/canopy_trapdoor_bottom" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/canopy_wood.json b/src/generated/resources/assets/twilightforest/models/item/canopy_wood.json new file mode 100644 index 0000000000..20166e9fc1 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/canopy_wood.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/canopy_wood" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/carminite.json b/src/generated/resources/assets/twilightforest/models/item/carminite.json new file mode 100644 index 0000000000..4cae2d5989 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/carminite.json @@ -0,0 +1,20 @@ +{ + "parent": "minecraft:item/generated", + "forge_data": { + "layers": { + "0": { + "block_light": 7, + "sky_light": 7 + } + } + }, + "loader": "forge:item_layers", + "render_types": { + "twilightforest:forge_entity_unsorted_translucent": [ + 0 + ] + }, + "textures": { + "layer0": "twilightforest:item/carminite" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/carminite_block.json b/src/generated/resources/assets/twilightforest/models/item/carminite_block.json new file mode 100644 index 0000000000..2ed29fec71 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/carminite_block.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/carminite_block" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/carminite_broodling_spawn_egg.json b/src/generated/resources/assets/twilightforest/models/item/carminite_broodling_spawn_egg.json new file mode 100644 index 0000000000..d1aaa9d6ef --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/carminite_broodling_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/carminite_builder.json b/src/generated/resources/assets/twilightforest/models/item/carminite_builder.json new file mode 100644 index 0000000000..5fe89a0955 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/carminite_builder.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/carminite_builder" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/carminite_ghastguard_spawn_egg.json b/src/generated/resources/assets/twilightforest/models/item/carminite_ghastguard_spawn_egg.json new file mode 100644 index 0000000000..d1aaa9d6ef --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/carminite_ghastguard_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/carminite_ghastling_spawn_egg.json b/src/generated/resources/assets/twilightforest/models/item/carminite_ghastling_spawn_egg.json new file mode 100644 index 0000000000..d1aaa9d6ef --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/carminite_ghastling_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/carminite_golem_spawn_egg.json b/src/generated/resources/assets/twilightforest/models/item/carminite_golem_spawn_egg.json new file mode 100644 index 0000000000..d1aaa9d6ef --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/carminite_golem_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/carminite_reactor.json b/src/generated/resources/assets/twilightforest/models/item/carminite_reactor.json new file mode 100644 index 0000000000..692c3ce79e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/carminite_reactor.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/carminite_reactor" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/castle_brick.json b/src/generated/resources/assets/twilightforest/models/item/castle_brick.json new file mode 100644 index 0000000000..9db4cbb16d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/castle_brick.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/castle_brick" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/castle_brick_stairs.json b/src/generated/resources/assets/twilightforest/models/item/castle_brick_stairs.json new file mode 100644 index 0000000000..4684aee469 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/castle_brick_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/castle_brick_stairs" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/castle_roof_tile.json b/src/generated/resources/assets/twilightforest/models/item/castle_roof_tile.json new file mode 100644 index 0000000000..50bb1af401 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/castle_roof_tile.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/castle_roof_tile" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/charm_of_keeping_1.json b/src/generated/resources/assets/twilightforest/models/item/charm_of_keeping_1.json new file mode 100644 index 0000000000..3c061c8277 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/charm_of_keeping_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/charm_of_keeping_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/charm_of_keeping_2.json b/src/generated/resources/assets/twilightforest/models/item/charm_of_keeping_2.json new file mode 100644 index 0000000000..c38ebe17e8 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/charm_of_keeping_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/charm_of_keeping_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/charm_of_keeping_3.json b/src/generated/resources/assets/twilightforest/models/item/charm_of_keeping_3.json new file mode 100644 index 0000000000..94304a88b4 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/charm_of_keeping_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/charm_of_keeping_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/charm_of_life_1.json b/src/generated/resources/assets/twilightforest/models/item/charm_of_life_1.json new file mode 100644 index 0000000000..5fe40f9ec2 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/charm_of_life_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/charm_of_life_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/charm_of_life_2.json b/src/generated/resources/assets/twilightforest/models/item/charm_of_life_2.json new file mode 100644 index 0000000000..f2a0c73b9a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/charm_of_life_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/charm_of_life_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/cicada_jar.json b/src/generated/resources/assets/twilightforest/models/item/cicada_jar.json new file mode 100644 index 0000000000..c8f625453a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/cicada_jar.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/cicada_jar" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/cinder_furnace.json b/src/generated/resources/assets/twilightforest/models/item/cinder_furnace.json new file mode 100644 index 0000000000..593027e9da --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/cinder_furnace.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/furnace" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/cinder_log.json b/src/generated/resources/assets/twilightforest/models/item/cinder_log.json new file mode 100644 index 0000000000..d8ccc8464f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/cinder_log.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/cinder_log" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/cinder_wood.json b/src/generated/resources/assets/twilightforest/models/item/cinder_wood.json new file mode 100644 index 0000000000..0fc6c4daeb --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/cinder_wood.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/cinder_wood" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/clover_patch.json b/src/generated/resources/assets/twilightforest/models/item/clover_patch.json new file mode 100644 index 0000000000..f372a71af7 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/clover_patch.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:block/patch/clover" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/cooked_meef.json b/src/generated/resources/assets/twilightforest/models/item/cooked_meef.json new file mode 100644 index 0000000000..66c327c41f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/cooked_meef.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/cooked_meef" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/cooked_venison.json b/src/generated/resources/assets/twilightforest/models/item/cooked_venison.json new file mode 100644 index 0000000000..41097f7bc3 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/cooked_venison.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/cooked_venison" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/cracked_castle_brick.json b/src/generated/resources/assets/twilightforest/models/item/cracked_castle_brick.json new file mode 100644 index 0000000000..3d2bebc0c5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/cracked_castle_brick.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/cracked_castle_brick" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/cracked_castle_brick_stairs.json b/src/generated/resources/assets/twilightforest/models/item/cracked_castle_brick_stairs.json new file mode 100644 index 0000000000..33eac37ce5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/cracked_castle_brick_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/cracked_castle_brick_stairs" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/cracked_deadrock.json b/src/generated/resources/assets/twilightforest/models/item/cracked_deadrock.json new file mode 100644 index 0000000000..e244b87550 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/cracked_deadrock.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/cracked_deadrock" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/cracked_etched_nagastone.json b/src/generated/resources/assets/twilightforest/models/item/cracked_etched_nagastone.json new file mode 100644 index 0000000000..a3ca085096 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/cracked_etched_nagastone.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/cracked_etched_nagastone" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/cracked_mazestone.json b/src/generated/resources/assets/twilightforest/models/item/cracked_mazestone.json new file mode 100644 index 0000000000..863c7e0f0a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/cracked_mazestone.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/cracked_mazestone" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/cracked_nagastone_pillar.json b/src/generated/resources/assets/twilightforest/models/item/cracked_nagastone_pillar.json new file mode 100644 index 0000000000..101d3e4106 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/cracked_nagastone_pillar.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/cracked_nagastone_pillar" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/cracked_nagastone_stairs_left.json b/src/generated/resources/assets/twilightforest/models/item/cracked_nagastone_stairs_left.json new file mode 100644 index 0000000000..023b74fe5b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/cracked_nagastone_stairs_left.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/cracked_nagastone_stairs_left" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/cracked_nagastone_stairs_right.json b/src/generated/resources/assets/twilightforest/models/item/cracked_nagastone_stairs_right.json new file mode 100644 index 0000000000..415a113f6c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/cracked_nagastone_stairs_right.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/cracked_nagastone_stairs_right" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/cracked_towerwood.json b/src/generated/resources/assets/twilightforest/models/item/cracked_towerwood.json new file mode 100644 index 0000000000..b49a9bbffc --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/cracked_towerwood.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/cracked_towerwood" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/cracked_underbrick.json b/src/generated/resources/assets/twilightforest/models/item/cracked_underbrick.json new file mode 100644 index 0000000000..e4ab4bb91e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/cracked_underbrick.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/cracked_underbrick" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/creeper_skull_candle.json b/src/generated/resources/assets/twilightforest/models/item/creeper_skull_candle.json new file mode 100644 index 0000000000..23bec58c92 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/creeper_skull_candle.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:item/template_skull_candle" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/crimson_banister.json b/src/generated/resources/assets/twilightforest/models/item/crimson_banister.json new file mode 100644 index 0000000000..734a7c6ac0 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/crimson_banister.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:item/banister_item", + "textures": { + "texture": "minecraft:block/crimson_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/crumble_horn.json b/src/generated/resources/assets/twilightforest/models/item/crumble_horn.json new file mode 100644 index 0000000000..4ba8ff0f16 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/crumble_horn.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "twilightforest:item/crumble_horn" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/cube_of_annihilation.json b/src/generated/resources/assets/twilightforest/models/item/cube_of_annihilation.json new file mode 100644 index 0000000000..22871d2d82 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/cube_of_annihilation.json @@ -0,0 +1,14 @@ +{ + "parent": "minecraft:item/handheld", + "overrides": [ + { + "model": "twilightforest:item/cube_of_annihilation_thrown", + "predicate": { + "twilightforest:thrown": 1.0 + } + } + ], + "textures": { + "layer0": "twilightforest:item/cube_of_annihilation" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/cube_of_annihilation_thrown.json b/src/generated/resources/assets/twilightforest/models/item/cube_of_annihilation_thrown.json new file mode 100644 index 0000000000..9d8b44da00 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/cube_of_annihilation_thrown.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "twilightforest:item/cube_of_annihilation_thrown" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/cube_talisman.json b/src/generated/resources/assets/twilightforest/models/item/cube_talisman.json new file mode 100644 index 0000000000..97850a047f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/cube_talisman.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/cube_talisman" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/cut_mazestone.json b/src/generated/resources/assets/twilightforest/models/item/cut_mazestone.json new file mode 100644 index 0000000000..b8e97665c2 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/cut_mazestone.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/cut_mazestone" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/dark_banister.json b/src/generated/resources/assets/twilightforest/models/item/dark_banister.json new file mode 100644 index 0000000000..199a7691aa --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/dark_banister.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:item/banister_item", + "textures": { + "texture": "twilightforest:block/wood/planks_darkwood_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/dark_boat.json b/src/generated/resources/assets/twilightforest/models/item/dark_boat.json new file mode 100644 index 0000000000..0f80b5d53c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/dark_boat.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/dark_boat" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/dark_button.json b/src/generated/resources/assets/twilightforest/models/item/dark_button.json new file mode 100644 index 0000000000..ea1006619c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/dark_button.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button_inventory", + "textures": { + "texture": "twilightforest:block/wood/planks_darkwood_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/dark_chest.json b/src/generated/resources/assets/twilightforest/models/item/dark_chest.json new file mode 100644 index 0000000000..c302f07749 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/dark_chest.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/chest", + "textures": { + "particle": "twilightforest:block/wood/planks_darkwood_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/dark_chest_boat.json b/src/generated/resources/assets/twilightforest/models/item/dark_chest_boat.json new file mode 100644 index 0000000000..3e135bfb12 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/dark_chest_boat.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/dark_chest_boat" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/dark_door.json b/src/generated/resources/assets/twilightforest/models/item/dark_door.json new file mode 100644 index 0000000000..6b97e61f86 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/dark_door.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/dark_door" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/dark_fence.json b/src/generated/resources/assets/twilightforest/models/item/dark_fence.json new file mode 100644 index 0000000000..abee87e004 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/dark_fence.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_inventory", + "textures": { + "texture": "twilightforest:block/wood/planks_darkwood_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/dark_fence_gate.json b/src/generated/resources/assets/twilightforest/models/item/dark_fence_gate.json new file mode 100644 index 0000000000..6d643f403c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/dark_fence_gate.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/wood/fence_gate/darkwood/dark_fence_gate" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/dark_leaves.json b/src/generated/resources/assets/twilightforest/models/item/dark_leaves.json new file mode 100644 index 0000000000..1d27f36d86 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/dark_leaves.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/dark_leaves" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/dark_log.json b/src/generated/resources/assets/twilightforest/models/item/dark_log.json new file mode 100644 index 0000000000..93d94ebadb --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/dark_log.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/dark_log" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/dark_oak_banister.json b/src/generated/resources/assets/twilightforest/models/item/dark_oak_banister.json new file mode 100644 index 0000000000..95a44405b6 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/dark_oak_banister.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:item/banister_item", + "textures": { + "texture": "minecraft:block/dark_oak_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/dark_planks.json b/src/generated/resources/assets/twilightforest/models/item/dark_planks.json new file mode 100644 index 0000000000..3f0cf4cedb --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/dark_planks.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/wood/planks/darkwood/dark_planks" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/dark_pressure_plate.json b/src/generated/resources/assets/twilightforest/models/item/dark_pressure_plate.json new file mode 100644 index 0000000000..63601d8e88 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/dark_pressure_plate.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/wood/pressure_plate/darkwood/dark_pressure_plate" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/dark_sign.json b/src/generated/resources/assets/twilightforest/models/item/dark_sign.json new file mode 100644 index 0000000000..59916f8579 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/dark_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/dark_sign" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/dark_slab.json b/src/generated/resources/assets/twilightforest/models/item/dark_slab.json new file mode 100644 index 0000000000..2fc8a7bd39 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/dark_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/wood/slab/darkwood/dark_slab" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/dark_stairs.json b/src/generated/resources/assets/twilightforest/models/item/dark_stairs.json new file mode 100644 index 0000000000..f588329134 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/dark_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/wood/stairs/darkwood/dark_stairs" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/dark_trapdoor.json b/src/generated/resources/assets/twilightforest/models/item/dark_trapdoor.json new file mode 100644 index 0000000000..fcdb9f1441 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/dark_trapdoor.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/wood/trapdoor/darkwood/darkwood_trapdoor_bottom" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/dark_wood.json b/src/generated/resources/assets/twilightforest/models/item/dark_wood.json new file mode 100644 index 0000000000..3cf7d3d7dd --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/dark_wood.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/dark_wood" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/darkwood_sapling.json b/src/generated/resources/assets/twilightforest/models/item/darkwood_sapling.json new file mode 100644 index 0000000000..5b2ef00c92 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/darkwood_sapling.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:block/darkwood_sapling" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/deadrock.json b/src/generated/resources/assets/twilightforest/models/item/deadrock.json new file mode 100644 index 0000000000..c63be4be62 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/deadrock.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/deadrock" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/death_tome_spawn_egg.json b/src/generated/resources/assets/twilightforest/models/item/death_tome_spawn_egg.json new file mode 100644 index 0000000000..d1aaa9d6ef --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/death_tome_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/death_tome_spawner.json b/src/generated/resources/assets/twilightforest/models/item/death_tome_spawner.json new file mode 100644 index 0000000000..468015092e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/death_tome_spawner.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/death_tome_spawner_10" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/decorative_mazestone.json b/src/generated/resources/assets/twilightforest/models/item/decorative_mazestone.json new file mode 100644 index 0000000000..b495342bf7 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/decorative_mazestone.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/decorative_mazestone" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/deer_spawn_egg.json b/src/generated/resources/assets/twilightforest/models/item/deer_spawn_egg.json new file mode 100644 index 0000000000..d1aaa9d6ef --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/deer_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/diamond_minotaur_axe.json b/src/generated/resources/assets/twilightforest/models/item/diamond_minotaur_axe.json new file mode 100644 index 0000000000..b754381b6c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/diamond_minotaur_axe.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "twilightforest:item/diamond_minotaur_axe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/dwarf_rabbit_spawn_egg.json b/src/generated/resources/assets/twilightforest/models/item/dwarf_rabbit_spawn_egg.json new file mode 100644 index 0000000000..d1aaa9d6ef --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/dwarf_rabbit_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/empty_canopy_bookshelf.json b/src/generated/resources/assets/twilightforest/models/item/empty_canopy_bookshelf.json new file mode 100644 index 0000000000..9b27a25149 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/empty_canopy_bookshelf.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/empty_canopy_bookshelf" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/encased_castle_brick_pillar.json b/src/generated/resources/assets/twilightforest/models/item/encased_castle_brick_pillar.json new file mode 100644 index 0000000000..f6f2d87dae --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/encased_castle_brick_pillar.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/encased_castle_brick_pillar" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/encased_castle_brick_stairs.json b/src/generated/resources/assets/twilightforest/models/item/encased_castle_brick_stairs.json new file mode 100644 index 0000000000..b95823db7d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/encased_castle_brick_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/encased_castle_brick_stairs" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/encased_castle_brick_tile.json b/src/generated/resources/assets/twilightforest/models/item/encased_castle_brick_tile.json new file mode 100644 index 0000000000..a732029eb5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/encased_castle_brick_tile.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/encased_castle_brick_tile" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/encased_fire_jet.json b/src/generated/resources/assets/twilightforest/models/item/encased_fire_jet.json new file mode 100644 index 0000000000..79e67d7bae --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/encased_fire_jet.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/encased_fire_jet" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/encased_smoker.json b/src/generated/resources/assets/twilightforest/models/item/encased_smoker.json new file mode 100644 index 0000000000..ce04c78e10 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/encased_smoker.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/encased_smoker" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/encased_towerwood.json b/src/generated/resources/assets/twilightforest/models/item/encased_towerwood.json new file mode 100644 index 0000000000..9f90031108 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/encased_towerwood.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/encased_towerwood" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/ender_bow.json b/src/generated/resources/assets/twilightforest/models/item/ender_bow.json new file mode 100644 index 0000000000..f567d7c71c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/ender_bow.json @@ -0,0 +1,28 @@ +{ + "parent": "minecraft:item/bow", + "overrides": [ + { + "model": "twilightforest:item/ender_bow_pulling_0", + "predicate": { + "minecraft:pulling": 1.0 + } + }, + { + "model": "twilightforest:item/ender_bow_pulling_1", + "predicate": { + "minecraft:pull": 0.65, + "minecraft:pulling": 1.0 + } + }, + { + "model": "twilightforest:item/ender_bow_pulling_2", + "predicate": { + "minecraft:pull": 0.9, + "minecraft:pulling": 1.0 + } + } + ], + "textures": { + "layer0": "twilightforest:item/ender_bow" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/ender_bow_pulling_0.json b/src/generated/resources/assets/twilightforest/models/item/ender_bow_pulling_0.json new file mode 100644 index 0000000000..69140d3a11 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/ender_bow_pulling_0.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/bow", + "textures": { + "layer0": "twilightforest:item/ender_bow_pulling_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/ender_bow_pulling_1.json b/src/generated/resources/assets/twilightforest/models/item/ender_bow_pulling_1.json new file mode 100644 index 0000000000..4b1722f7c4 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/ender_bow_pulling_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/bow", + "textures": { + "layer0": "twilightforest:item/ender_bow_pulling_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/ender_bow_pulling_2.json b/src/generated/resources/assets/twilightforest/models/item/ender_bow_pulling_2.json new file mode 100644 index 0000000000..678c85407d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/ender_bow_pulling_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/bow", + "textures": { + "layer0": "twilightforest:item/ender_bow_pulling_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/etched_nagastone.json b/src/generated/resources/assets/twilightforest/models/item/etched_nagastone.json new file mode 100644 index 0000000000..97032df774 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/etched_nagastone.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/etched_nagastone" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/experiment_115.json b/src/generated/resources/assets/twilightforest/models/item/experiment_115.json new file mode 100644 index 0000000000..2d423dfbfe --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/experiment_115.json @@ -0,0 +1,20 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "twilightforest:item/think115", + "predicate": { + "twilightforest:think": 1.0 + } + }, + { + "model": "twilightforest:block/experiment115_8_8_regenerating", + "predicate": { + "twilightforest:full": 1.0 + } + } + ], + "textures": { + "layer0": "twilightforest:item/experiment_115" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/fake_diamond.json b/src/generated/resources/assets/twilightforest/models/item/fake_diamond.json new file mode 100644 index 0000000000..48d351c4b1 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/fake_diamond.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/diamond_block" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/fake_gold.json b/src/generated/resources/assets/twilightforest/models/item/fake_gold.json new file mode 100644 index 0000000000..f9cefd04e9 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/fake_gold.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/gold_block" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/fallen_leaves.json b/src/generated/resources/assets/twilightforest/models/item/fallen_leaves.json new file mode 100644 index 0000000000..eda19fe164 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/fallen_leaves.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/oak_leaves" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/fiddlehead.json b/src/generated/resources/assets/twilightforest/models/item/fiddlehead.json new file mode 100644 index 0000000000..dc965e1fa6 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/fiddlehead.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:block/fiddlehead" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/fiery_block.json b/src/generated/resources/assets/twilightforest/models/item/fiery_block.json new file mode 100644 index 0000000000..8cbfe0ad9c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/fiery_block.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/fiery_block" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/fiery_blood.json b/src/generated/resources/assets/twilightforest/models/item/fiery_blood.json new file mode 100644 index 0000000000..70fe84c17c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/fiery_blood.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/fiery_blood" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/fiery_boots.json b/src/generated/resources/assets/twilightforest/models/item/fiery_boots.json new file mode 100644 index 0000000000..fe7b6ce32a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/fiery_boots.json @@ -0,0 +1,20 @@ +{ + "parent": "minecraft:item/generated", + "forge_data": { + "layers": { + "0": { + "block_light": 15, + "sky_light": 15 + } + } + }, + "loader": "forge:item_layers", + "render_types": { + "twilightforest:forge_entity_unsorted_translucent": [ + 0 + ] + }, + "textures": { + "layer0": "twilightforest:item/fiery_boots" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/fiery_chestplate.json b/src/generated/resources/assets/twilightforest/models/item/fiery_chestplate.json new file mode 100644 index 0000000000..546d80c816 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/fiery_chestplate.json @@ -0,0 +1,20 @@ +{ + "parent": "minecraft:item/generated", + "forge_data": { + "layers": { + "0": { + "block_light": 15, + "sky_light": 15 + } + } + }, + "loader": "forge:item_layers", + "render_types": { + "twilightforest:forge_entity_unsorted_translucent": [ + 0 + ] + }, + "textures": { + "layer0": "twilightforest:item/fiery_chestplate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/fiery_helmet.json b/src/generated/resources/assets/twilightforest/models/item/fiery_helmet.json new file mode 100644 index 0000000000..c422f9b3dc --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/fiery_helmet.json @@ -0,0 +1,20 @@ +{ + "parent": "minecraft:item/generated", + "forge_data": { + "layers": { + "0": { + "block_light": 15, + "sky_light": 15 + } + } + }, + "loader": "forge:item_layers", + "render_types": { + "twilightforest:forge_entity_unsorted_translucent": [ + 0 + ] + }, + "textures": { + "layer0": "twilightforest:item/fiery_helmet" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/fiery_ingot.json b/src/generated/resources/assets/twilightforest/models/item/fiery_ingot.json new file mode 100644 index 0000000000..c39d0f8480 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/fiery_ingot.json @@ -0,0 +1,20 @@ +{ + "parent": "minecraft:item/generated", + "forge_data": { + "layers": { + "0": { + "block_light": 15, + "sky_light": 15 + } + } + }, + "loader": "forge:item_layers", + "render_types": { + "twilightforest:forge_entity_unsorted_translucent": [ + 0 + ] + }, + "textures": { + "layer0": "twilightforest:item/fiery_ingot" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/fiery_leggings.json b/src/generated/resources/assets/twilightforest/models/item/fiery_leggings.json new file mode 100644 index 0000000000..c1cb5f14e8 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/fiery_leggings.json @@ -0,0 +1,20 @@ +{ + "parent": "minecraft:item/generated", + "forge_data": { + "layers": { + "0": { + "block_light": 15, + "sky_light": 15 + } + } + }, + "loader": "forge:item_layers", + "render_types": { + "twilightforest:forge_entity_unsorted_translucent": [ + 0 + ] + }, + "textures": { + "layer0": "twilightforest:item/fiery_leggings" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/fiery_pickaxe.json b/src/generated/resources/assets/twilightforest/models/item/fiery_pickaxe.json new file mode 100644 index 0000000000..fb986c907e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/fiery_pickaxe.json @@ -0,0 +1,20 @@ +{ + "parent": "minecraft:item/handheld", + "forge_data": { + "layers": { + "0": { + "block_light": 15, + "sky_light": 15 + } + } + }, + "loader": "forge:item_layers", + "render_types": { + "twilightforest:forge_entity_unsorted_translucent": [ + 0 + ] + }, + "textures": { + "layer0": "twilightforest:item/fiery_pickaxe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/fiery_sword.json b/src/generated/resources/assets/twilightforest/models/item/fiery_sword.json new file mode 100644 index 0000000000..6a4735b045 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/fiery_sword.json @@ -0,0 +1,20 @@ +{ + "parent": "minecraft:item/handheld", + "forge_data": { + "layers": { + "0": { + "block_light": 15, + "sky_light": 15 + } + } + }, + "loader": "forge:item_layers", + "render_types": { + "twilightforest:forge_entity_unsorted_translucent": [ + 0 + ] + }, + "textures": { + "layer0": "twilightforest:item/fiery_sword" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/fiery_tears.json b/src/generated/resources/assets/twilightforest/models/item/fiery_tears.json new file mode 100644 index 0000000000..2ab0066949 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/fiery_tears.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/fiery_tears" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/filled_magic_map.json b/src/generated/resources/assets/twilightforest/models/item/filled_magic_map.json new file mode 100644 index 0000000000..fc36c9f13f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/filled_magic_map.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/filled_magic_map" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/filled_maze_map.json b/src/generated/resources/assets/twilightforest/models/item/filled_maze_map.json new file mode 100644 index 0000000000..2d03aa2a31 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/filled_maze_map.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/filled_maze_map" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/filled_ore_map.json b/src/generated/resources/assets/twilightforest/models/item/filled_ore_map.json new file mode 100644 index 0000000000..2e8fd0893c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/filled_ore_map.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/filled_ore_map" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/final_boss_boss_spawner.json b/src/generated/resources/assets/twilightforest/models/item/final_boss_boss_spawner.json new file mode 100644 index 0000000000..f54a94f6b5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/final_boss_boss_spawner.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/spawner" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/fire_beetle_spawn_egg.json b/src/generated/resources/assets/twilightforest/models/item/fire_beetle_spawn_egg.json new file mode 100644 index 0000000000..d1aaa9d6ef --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/fire_beetle_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/fire_jet.json b/src/generated/resources/assets/twilightforest/models/item/fire_jet.json new file mode 100644 index 0000000000..90809f8834 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/fire_jet.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/fire_jet" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/firefly_jar.json b/src/generated/resources/assets/twilightforest/models/item/firefly_jar.json new file mode 100644 index 0000000000..c83828eb78 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/firefly_jar.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/firefly_jar" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/firefly_particle_spawner.json b/src/generated/resources/assets/twilightforest/models/item/firefly_particle_spawner.json new file mode 100644 index 0000000000..d6df02006d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/firefly_particle_spawner.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/firefly_particle_spawner" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/fluffy_cloud.json b/src/generated/resources/assets/twilightforest/models/item/fluffy_cloud.json new file mode 100644 index 0000000000..455657e71d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/fluffy_cloud.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/fluffy_cloud" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/fortification_scepter.json b/src/generated/resources/assets/twilightforest/models/item/fortification_scepter.json new file mode 100644 index 0000000000..6840716034 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/fortification_scepter.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "twilightforest:item/fortification_scepter" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/ghast_trap.json b/src/generated/resources/assets/twilightforest/models/item/ghast_trap.json new file mode 100644 index 0000000000..e35672f8f9 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/ghast_trap.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/ghast_trap" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/giant_cobblestone.json b/src/generated/resources/assets/twilightforest/models/item/giant_cobblestone.json new file mode 100644 index 0000000000..35e828df61 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/giant_cobblestone.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cobblestone" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/giant_leaves.json b/src/generated/resources/assets/twilightforest/models/item/giant_leaves.json new file mode 100644 index 0000000000..a54fc8a7a4 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/giant_leaves.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/oak_leaves" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/giant_log.json b/src/generated/resources/assets/twilightforest/models/item/giant_log.json new file mode 100644 index 0000000000..b450f38fae --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/giant_log.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/oak_log" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/giant_miner_spawn_egg.json b/src/generated/resources/assets/twilightforest/models/item/giant_miner_spawn_egg.json new file mode 100644 index 0000000000..d1aaa9d6ef --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/giant_miner_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/giant_obsidian.json b/src/generated/resources/assets/twilightforest/models/item/giant_obsidian.json new file mode 100644 index 0000000000..0c124ed6f0 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/giant_obsidian.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/obsidian" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/glass_sword.json b/src/generated/resources/assets/twilightforest/models/item/glass_sword.json new file mode 100644 index 0000000000..c1676fbbe7 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/glass_sword.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "twilightforest:item/glass_sword_solid", + "layer1": "twilightforest:item/glass_sword_clear" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/gold_minotaur_axe.json b/src/generated/resources/assets/twilightforest/models/item/gold_minotaur_axe.json new file mode 100644 index 0000000000..398d9eab7c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/gold_minotaur_axe.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "twilightforest:item/gold_minotaur_axe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/greater_flask_0.json b/src/generated/resources/assets/twilightforest/models/item/greater_flask_0.json new file mode 100644 index 0000000000..f83fa70321 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/greater_flask_0.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/greater_potion_flask_1", + "layer1": "twilightforest:item/greater_potion_flask" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/greater_flask_1.json b/src/generated/resources/assets/twilightforest/models/item/greater_flask_1.json new file mode 100644 index 0000000000..007364461a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/greater_flask_1.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/greater_potion_flask_2", + "layer1": "twilightforest:item/greater_potion_flask" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/greater_flask_2.json b/src/generated/resources/assets/twilightforest/models/item/greater_flask_2.json new file mode 100644 index 0000000000..5b6a5fbdb5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/greater_flask_2.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/greater_potion_flask_3", + "layer1": "twilightforest:item/greater_potion_flask" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/greater_flask_3.json b/src/generated/resources/assets/twilightforest/models/item/greater_flask_3.json new file mode 100644 index 0000000000..2ab7c1b7d3 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/greater_flask_3.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/greater_potion_flask_4", + "layer1": "twilightforest:item/greater_potion_flask" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/greater_potion_flask.json b/src/generated/resources/assets/twilightforest/models/item/greater_potion_flask.json new file mode 100644 index 0000000000..ecfd57126f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/greater_potion_flask.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "twilightforest:item/greater_flask_0", + "predicate": { + "twilightforest:potion_level": 1.0 + } + }, + { + "model": "twilightforest:item/greater_flask_1", + "predicate": { + "twilightforest:potion_level": 2.0 + } + }, + { + "model": "twilightforest:item/greater_flask_2", + "predicate": { + "twilightforest:potion_level": 3.0 + } + }, + { + "model": "twilightforest:item/greater_flask_3", + "predicate": { + "twilightforest:potion_level": 4.0 + } + } + ], + "textures": { + "layer0": "twilightforest:block/stone_twist/twist_blank", + "layer1": "twilightforest:item/greater_potion_flask" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/green_force_field.json b/src/generated/resources/assets/twilightforest/models/item/green_force_field.json new file mode 100644 index 0000000000..457bcfcf18 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/green_force_field.json @@ -0,0 +1,20 @@ +{ + "parent": "minecraft:item/generated", + "forge_data": { + "layers": { + "0": { + "block_light": 15, + "sky_light": 15 + } + } + }, + "loader": "forge:item_layers", + "render_types": { + "minecraft:translucent": [ + 0 + ] + }, + "textures": { + "layer0": "twilightforest:block/forcefield_white" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/green_thorns.json b/src/generated/resources/assets/twilightforest/models/item/green_thorns.json new file mode 100644 index 0000000000..7be51decde --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/green_thorns.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/green_thorns" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/harbinger_cube_spawn_egg.json b/src/generated/resources/assets/twilightforest/models/item/harbinger_cube_spawn_egg.json new file mode 100644 index 0000000000..d1aaa9d6ef --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/harbinger_cube_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/hedge.json b/src/generated/resources/assets/twilightforest/models/item/hedge.json new file mode 100644 index 0000000000..7ccaa35ccf --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/hedge.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/hedge" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/hedge_spider_spawn_egg.json b/src/generated/resources/assets/twilightforest/models/item/hedge_spider_spawn_egg.json new file mode 100644 index 0000000000..d1aaa9d6ef --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/hedge_spider_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/helmet_crab_spawn_egg.json b/src/generated/resources/assets/twilightforest/models/item/helmet_crab_spawn_egg.json new file mode 100644 index 0000000000..d1aaa9d6ef --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/helmet_crab_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/hollow_acacia_log.json b/src/generated/resources/assets/twilightforest/models/item/hollow_acacia_log.json new file mode 100644 index 0000000000..482c7f56d9 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/hollow_acacia_log.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/hollow_acacia_log_horizontal" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/hollow_birch_log.json b/src/generated/resources/assets/twilightforest/models/item/hollow_birch_log.json new file mode 100644 index 0000000000..97e4501b0c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/hollow_birch_log.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/hollow_birch_log_horizontal" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/hollow_canopy_log.json b/src/generated/resources/assets/twilightforest/models/item/hollow_canopy_log.json new file mode 100644 index 0000000000..b0c6135c47 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/hollow_canopy_log.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/hollow_canopy_log_horizontal" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/hollow_crimson_stem.json b/src/generated/resources/assets/twilightforest/models/item/hollow_crimson_stem.json new file mode 100644 index 0000000000..da3bb77318 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/hollow_crimson_stem.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/hollow_crimson_stem_horizontal" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/hollow_dark_log.json b/src/generated/resources/assets/twilightforest/models/item/hollow_dark_log.json new file mode 100644 index 0000000000..29fd06f26a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/hollow_dark_log.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/hollow_dark_log_horizontal" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/hollow_dark_oak_log.json b/src/generated/resources/assets/twilightforest/models/item/hollow_dark_oak_log.json new file mode 100644 index 0000000000..7c93747647 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/hollow_dark_oak_log.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/hollow_dark_oak_log_horizontal" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/hollow_jungle_log.json b/src/generated/resources/assets/twilightforest/models/item/hollow_jungle_log.json new file mode 100644 index 0000000000..b99eccd148 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/hollow_jungle_log.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/hollow_jungle_log_horizontal" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/hollow_mangrove_log.json b/src/generated/resources/assets/twilightforest/models/item/hollow_mangrove_log.json new file mode 100644 index 0000000000..9e4d552445 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/hollow_mangrove_log.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/hollow_mangrove_log_horizontal" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/hollow_mining_log.json b/src/generated/resources/assets/twilightforest/models/item/hollow_mining_log.json new file mode 100644 index 0000000000..fe471fd7e3 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/hollow_mining_log.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/hollow_mining_log_horizontal" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/hollow_oak_log.json b/src/generated/resources/assets/twilightforest/models/item/hollow_oak_log.json new file mode 100644 index 0000000000..24f24186dd --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/hollow_oak_log.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/hollow_oak_log_horizontal" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/hollow_oak_sapling.json b/src/generated/resources/assets/twilightforest/models/item/hollow_oak_sapling.json new file mode 100644 index 0000000000..987d48341d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/hollow_oak_sapling.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:block/hollow_oak_sapling" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/hollow_sorting_log.json b/src/generated/resources/assets/twilightforest/models/item/hollow_sorting_log.json new file mode 100644 index 0000000000..8a172c5932 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/hollow_sorting_log.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/hollow_sorting_log_horizontal" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/hollow_spruce_log.json b/src/generated/resources/assets/twilightforest/models/item/hollow_spruce_log.json new file mode 100644 index 0000000000..002d5b3312 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/hollow_spruce_log.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/hollow_spruce_log_horizontal" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/hollow_time_log.json b/src/generated/resources/assets/twilightforest/models/item/hollow_time_log.json new file mode 100644 index 0000000000..8928b919fa --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/hollow_time_log.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/hollow_time_log_horizontal" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/hollow_transformation_log.json b/src/generated/resources/assets/twilightforest/models/item/hollow_transformation_log.json new file mode 100644 index 0000000000..43c802131a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/hollow_transformation_log.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/hollow_transformation_log_horizontal" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/hollow_twilight_oak_log.json b/src/generated/resources/assets/twilightforest/models/item/hollow_twilight_oak_log.json new file mode 100644 index 0000000000..c9679f1c6b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/hollow_twilight_oak_log.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/hollow_twilight_oak_log_horizontal" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/hollow_vangrove_log.json b/src/generated/resources/assets/twilightforest/models/item/hollow_vangrove_log.json new file mode 100644 index 0000000000..5a8ae7b7b2 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/hollow_vangrove_log.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/hollow_vangrove_log_horizontal" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/hollow_warped_stem.json b/src/generated/resources/assets/twilightforest/models/item/hollow_warped_stem.json new file mode 100644 index 0000000000..5cafe35674 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/hollow_warped_stem.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/hollow_warped_stem_horizontal" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/hostile_wolf_spawn_egg.json b/src/generated/resources/assets/twilightforest/models/item/hostile_wolf_spawn_egg.json new file mode 100644 index 0000000000..d1aaa9d6ef --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/hostile_wolf_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/huge_lily_pad.json b/src/generated/resources/assets/twilightforest/models/item/huge_lily_pad.json new file mode 100644 index 0000000000..ab0c179c9b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/huge_lily_pad.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:block/huge_lily_pad" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/huge_mushgloom.json b/src/generated/resources/assets/twilightforest/models/item/huge_mushgloom.json new file mode 100644 index 0000000000..d55f058795 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/huge_mushgloom.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "twilightforest:block/huge_gloom_cap" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/huge_mushgloom_stem.json b/src/generated/resources/assets/twilightforest/models/item/huge_mushgloom_stem.json new file mode 100644 index 0000000000..b36a8be547 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/huge_mushgloom_stem.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "twilightforest:block/huge_mushgloom_stem" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/huge_stalk.json b/src/generated/resources/assets/twilightforest/models/item/huge_stalk.json new file mode 100644 index 0000000000..5e48b18950 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/huge_stalk.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/huge_stalk" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/huge_water_lily.json b/src/generated/resources/assets/twilightforest/models/item/huge_water_lily.json new file mode 100644 index 0000000000..cd09267b40 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/huge_water_lily.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:block/huge_water_lily" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/hydra_banner_pattern.json b/src/generated/resources/assets/twilightforest/models/item/hydra_banner_pattern.json new file mode 100644 index 0000000000..dd801b92f0 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/hydra_banner_pattern.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/tf_banner_pattern" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/hydra_boss_spawner.json b/src/generated/resources/assets/twilightforest/models/item/hydra_boss_spawner.json new file mode 100644 index 0000000000..f54a94f6b5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/hydra_boss_spawner.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/spawner" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/hydra_chop.json b/src/generated/resources/assets/twilightforest/models/item/hydra_chop.json new file mode 100644 index 0000000000..a5feb45244 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/hydra_chop.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/hydra_chop" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/hydra_spawn_egg.json b/src/generated/resources/assets/twilightforest/models/item/hydra_spawn_egg.json new file mode 100644 index 0000000000..d1aaa9d6ef --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/hydra_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/hydra_trophy.json b/src/generated/resources/assets/twilightforest/models/item/hydra_trophy.json new file mode 100644 index 0000000000..117525e741 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/hydra_trophy.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:item/template_trophy" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/ice_bomb.json b/src/generated/resources/assets/twilightforest/models/item/ice_bomb.json new file mode 100644 index 0000000000..63ccea02f6 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/ice_bomb.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/ice_bomb" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/ice_bow.json b/src/generated/resources/assets/twilightforest/models/item/ice_bow.json new file mode 100644 index 0000000000..8cf311b79a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/ice_bow.json @@ -0,0 +1,29 @@ +{ + "parent": "minecraft:item/bow", + "overrides": [ + { + "model": "twilightforest:item/ice_bow_pulling_0", + "predicate": { + "minecraft:pulling": 1.0 + } + }, + { + "model": "twilightforest:item/ice_bow_pulling_1", + "predicate": { + "minecraft:pull": 0.65, + "minecraft:pulling": 1.0 + } + }, + { + "model": "twilightforest:item/ice_bow_pulling_2", + "predicate": { + "minecraft:pull": 0.9, + "minecraft:pulling": 1.0 + } + } + ], + "textures": { + "layer0": "twilightforest:item/ice_bow_solid", + "layer1": "twilightforest:item/ice_bow_clear" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/ice_bow_pulling_0.json b/src/generated/resources/assets/twilightforest/models/item/ice_bow_pulling_0.json new file mode 100644 index 0000000000..5a1fe12ce4 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/ice_bow_pulling_0.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/bow", + "textures": { + "layer0": "twilightforest:item/ice_bow_solid_pulling_0", + "layer1": "twilightforest:item/ice_bow_clear_pulling_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/ice_bow_pulling_1.json b/src/generated/resources/assets/twilightforest/models/item/ice_bow_pulling_1.json new file mode 100644 index 0000000000..97d309993b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/ice_bow_pulling_1.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/bow", + "textures": { + "layer0": "twilightforest:item/ice_bow_solid_pulling_1", + "layer1": "twilightforest:item/ice_bow_clear_pulling_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/ice_bow_pulling_2.json b/src/generated/resources/assets/twilightforest/models/item/ice_bow_pulling_2.json new file mode 100644 index 0000000000..6979878263 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/ice_bow_pulling_2.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/bow", + "textures": { + "layer0": "twilightforest:item/ice_bow_solid_pulling_2", + "layer1": "twilightforest:item/ice_bow_clear_pulling_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/ice_crystal_spawn_egg.json b/src/generated/resources/assets/twilightforest/models/item/ice_crystal_spawn_egg.json new file mode 100644 index 0000000000..d1aaa9d6ef --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/ice_crystal_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/ice_sword.json b/src/generated/resources/assets/twilightforest/models/item/ice_sword.json new file mode 100644 index 0000000000..77713e7af3 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/ice_sword.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "twilightforest:item/ice_sword_solid", + "layer1": "twilightforest:item/ice_sword_clear" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/infested_towerwood.json b/src/generated/resources/assets/twilightforest/models/item/infested_towerwood.json new file mode 100644 index 0000000000..1839a17cf6 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/infested_towerwood.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/infested_towerwood" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/ironwood_axe.json b/src/generated/resources/assets/twilightforest/models/item/ironwood_axe.json new file mode 100644 index 0000000000..518207c3ca --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/ironwood_axe.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "twilightforest:item/ironwood_axe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/ironwood_block.json b/src/generated/resources/assets/twilightforest/models/item/ironwood_block.json new file mode 100644 index 0000000000..9919664e68 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/ironwood_block.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/ironwood_block" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/ironwood_boots.json b/src/generated/resources/assets/twilightforest/models/item/ironwood_boots.json new file mode 100644 index 0000000000..f1fbecbc03 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/ironwood_boots.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/ironwood_boots" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/ironwood_chestplate.json b/src/generated/resources/assets/twilightforest/models/item/ironwood_chestplate.json new file mode 100644 index 0000000000..911ee165cd --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/ironwood_chestplate.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/ironwood_chestplate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/ironwood_helmet.json b/src/generated/resources/assets/twilightforest/models/item/ironwood_helmet.json new file mode 100644 index 0000000000..1e9ab12177 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/ironwood_helmet.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/ironwood_helmet" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/ironwood_hoe.json b/src/generated/resources/assets/twilightforest/models/item/ironwood_hoe.json new file mode 100644 index 0000000000..9dc869efa4 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/ironwood_hoe.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "twilightforest:item/ironwood_hoe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/ironwood_ingot.json b/src/generated/resources/assets/twilightforest/models/item/ironwood_ingot.json new file mode 100644 index 0000000000..55a5374281 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/ironwood_ingot.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/ironwood_ingot" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/ironwood_leggings.json b/src/generated/resources/assets/twilightforest/models/item/ironwood_leggings.json new file mode 100644 index 0000000000..79bf9da4cd --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/ironwood_leggings.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/ironwood_leggings" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/ironwood_pickaxe.json b/src/generated/resources/assets/twilightforest/models/item/ironwood_pickaxe.json new file mode 100644 index 0000000000..2dae6dafa0 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/ironwood_pickaxe.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "twilightforest:item/ironwood_pickaxe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/ironwood_shovel.json b/src/generated/resources/assets/twilightforest/models/item/ironwood_shovel.json new file mode 100644 index 0000000000..b8cb8ae9ca --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/ironwood_shovel.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "twilightforest:item/ironwood_shovel" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/ironwood_sword.json b/src/generated/resources/assets/twilightforest/models/item/ironwood_sword.json new file mode 100644 index 0000000000..8b7aa4351d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/ironwood_sword.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "twilightforest:item/ironwood_sword" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/jungle_banister.json b/src/generated/resources/assets/twilightforest/models/item/jungle_banister.json new file mode 100644 index 0000000000..13afe0904a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/jungle_banister.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:item/banister_item", + "textures": { + "texture": "minecraft:block/jungle_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/king_spider_spawn_egg.json b/src/generated/resources/assets/twilightforest/models/item/king_spider_spawn_egg.json new file mode 100644 index 0000000000..d1aaa9d6ef --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/king_spider_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/knight_phantom_banner_pattern.json b/src/generated/resources/assets/twilightforest/models/item/knight_phantom_banner_pattern.json new file mode 100644 index 0000000000..dd801b92f0 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/knight_phantom_banner_pattern.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/tf_banner_pattern" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/knight_phantom_boss_spawner.json b/src/generated/resources/assets/twilightforest/models/item/knight_phantom_boss_spawner.json new file mode 100644 index 0000000000..f54a94f6b5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/knight_phantom_boss_spawner.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/spawner" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/knight_phantom_spawn_egg.json b/src/generated/resources/assets/twilightforest/models/item/knight_phantom_spawn_egg.json new file mode 100644 index 0000000000..d1aaa9d6ef --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/knight_phantom_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/knight_phantom_trophy.json b/src/generated/resources/assets/twilightforest/models/item/knight_phantom_trophy.json new file mode 100644 index 0000000000..117525e741 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/knight_phantom_trophy.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:item/template_trophy" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/knightmetal_axe.json b/src/generated/resources/assets/twilightforest/models/item/knightmetal_axe.json new file mode 100644 index 0000000000..90ba49cf41 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/knightmetal_axe.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "twilightforest:item/knightmetal_axe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/knightmetal_block.json b/src/generated/resources/assets/twilightforest/models/item/knightmetal_block.json new file mode 100644 index 0000000000..96246727d5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/knightmetal_block.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/knightmetal_block" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/knightmetal_boots.json b/src/generated/resources/assets/twilightforest/models/item/knightmetal_boots.json new file mode 100644 index 0000000000..138688dc88 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/knightmetal_boots.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/knightmetal_boots" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/knightmetal_chestplate.json b/src/generated/resources/assets/twilightforest/models/item/knightmetal_chestplate.json new file mode 100644 index 0000000000..5cd25f0fac --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/knightmetal_chestplate.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/knightmetal_chestplate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/knightmetal_helmet.json b/src/generated/resources/assets/twilightforest/models/item/knightmetal_helmet.json new file mode 100644 index 0000000000..110687d977 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/knightmetal_helmet.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/knightmetal_helmet" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/knightmetal_ingot.json b/src/generated/resources/assets/twilightforest/models/item/knightmetal_ingot.json new file mode 100644 index 0000000000..a81cdfb939 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/knightmetal_ingot.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/knightmetal_ingot" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/knightmetal_leggings.json b/src/generated/resources/assets/twilightforest/models/item/knightmetal_leggings.json new file mode 100644 index 0000000000..0075a2ec83 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/knightmetal_leggings.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/knightmetal_leggings" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/knightmetal_pickaxe.json b/src/generated/resources/assets/twilightforest/models/item/knightmetal_pickaxe.json new file mode 100644 index 0000000000..23929bc4dd --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/knightmetal_pickaxe.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "twilightforest:item/knightmetal_pickaxe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/knightmetal_ring.json b/src/generated/resources/assets/twilightforest/models/item/knightmetal_ring.json new file mode 100644 index 0000000000..f690316e44 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/knightmetal_ring.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/knightmetal_ring" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/knightmetal_sword.json b/src/generated/resources/assets/twilightforest/models/item/knightmetal_sword.json new file mode 100644 index 0000000000..f59104c8db --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/knightmetal_sword.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "twilightforest:item/knightmetal_sword" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/kobold_spawn_egg.json b/src/generated/resources/assets/twilightforest/models/item/kobold_spawn_egg.json new file mode 100644 index 0000000000..d1aaa9d6ef --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/kobold_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/lamp_of_cinders.json b/src/generated/resources/assets/twilightforest/models/item/lamp_of_cinders.json new file mode 100644 index 0000000000..3b128a8b58 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/lamp_of_cinders.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/lamp_of_cinders" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/lich_banner_pattern.json b/src/generated/resources/assets/twilightforest/models/item/lich_banner_pattern.json new file mode 100644 index 0000000000..dd801b92f0 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/lich_banner_pattern.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/tf_banner_pattern" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/lich_boss_spawner.json b/src/generated/resources/assets/twilightforest/models/item/lich_boss_spawner.json new file mode 100644 index 0000000000..f54a94f6b5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/lich_boss_spawner.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/spawner" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/lich_spawn_egg.json b/src/generated/resources/assets/twilightforest/models/item/lich_spawn_egg.json new file mode 100644 index 0000000000..d1aaa9d6ef --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/lich_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/lich_tower_miniature_structure.json b/src/generated/resources/assets/twilightforest/models/item/lich_tower_miniature_structure.json new file mode 100644 index 0000000000..57942a87cb --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/lich_tower_miniature_structure.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/miniature/lich_tower" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/lich_trophy.json b/src/generated/resources/assets/twilightforest/models/item/lich_trophy.json new file mode 100644 index 0000000000..117525e741 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/lich_trophy.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:item/template_trophy" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/lifedrain_scepter.json b/src/generated/resources/assets/twilightforest/models/item/lifedrain_scepter.json new file mode 100644 index 0000000000..08a8b5ff9b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/lifedrain_scepter.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "twilightforest:item/lifedrain_scepter" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/liveroot.json b/src/generated/resources/assets/twilightforest/models/item/liveroot.json new file mode 100644 index 0000000000..bd28e4fa52 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/liveroot.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/liveroot" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/liveroot_block.json b/src/generated/resources/assets/twilightforest/models/item/liveroot_block.json new file mode 100644 index 0000000000..a8ec99721b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/liveroot_block.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/liveroot_block" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/locked_vanishing_block.json b/src/generated/resources/assets/twilightforest/models/item/locked_vanishing_block.json new file mode 100644 index 0000000000..e17d592b9b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/locked_vanishing_block.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/locked_vanishing_block" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/lower_goblin_knight_spawn_egg.json b/src/generated/resources/assets/twilightforest/models/item/lower_goblin_knight_spawn_egg.json new file mode 100644 index 0000000000..d1aaa9d6ef --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/lower_goblin_knight_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/magic_beans.json b/src/generated/resources/assets/twilightforest/models/item/magic_beans.json new file mode 100644 index 0000000000..b87fbcc6ff --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/magic_beans.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/magic_beans" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/magic_map.json b/src/generated/resources/assets/twilightforest/models/item/magic_map.json new file mode 100644 index 0000000000..de39777f1e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/magic_map.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/magic_map" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/magic_map_focus.json b/src/generated/resources/assets/twilightforest/models/item/magic_map_focus.json new file mode 100644 index 0000000000..62f5ac25a8 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/magic_map_focus.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/magic_map_focus" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/mangrove_banister.json b/src/generated/resources/assets/twilightforest/models/item/mangrove_banister.json new file mode 100644 index 0000000000..6fd1a4742d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/mangrove_banister.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:item/banister_item", + "textures": { + "texture": "twilightforest:block/wood/planks_mangrove_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/mangrove_boat.json b/src/generated/resources/assets/twilightforest/models/item/mangrove_boat.json new file mode 100644 index 0000000000..44a66b28d9 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/mangrove_boat.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/mangrove_boat" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/mangrove_button.json b/src/generated/resources/assets/twilightforest/models/item/mangrove_button.json new file mode 100644 index 0000000000..b0f58a9e33 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/mangrove_button.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button_inventory", + "textures": { + "texture": "twilightforest:block/wood/planks_mangrove_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/mangrove_chest.json b/src/generated/resources/assets/twilightforest/models/item/mangrove_chest.json new file mode 100644 index 0000000000..f81db21291 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/mangrove_chest.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/chest", + "textures": { + "particle": "twilightforest:block/wood/planks_mangrove_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/mangrove_chest_boat.json b/src/generated/resources/assets/twilightforest/models/item/mangrove_chest_boat.json new file mode 100644 index 0000000000..f8df83e1d9 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/mangrove_chest_boat.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/mangrove_chest_boat" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/mangrove_door.json b/src/generated/resources/assets/twilightforest/models/item/mangrove_door.json new file mode 100644 index 0000000000..ea38a65ac5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/mangrove_door.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/mangrove_door" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/mangrove_fence.json b/src/generated/resources/assets/twilightforest/models/item/mangrove_fence.json new file mode 100644 index 0000000000..665669fc15 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/mangrove_fence.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_inventory", + "textures": { + "texture": "twilightforest:block/wood/planks_mangrove_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/mangrove_fence_gate.json b/src/generated/resources/assets/twilightforest/models/item/mangrove_fence_gate.json new file mode 100644 index 0000000000..2ad60af558 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/mangrove_fence_gate.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/wood/fence_gate/mangrove/mangrove_fence_gate" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/mangrove_leaves.json b/src/generated/resources/assets/twilightforest/models/item/mangrove_leaves.json new file mode 100644 index 0000000000..226edb6df0 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/mangrove_leaves.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/mangrove_leaves" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/mangrove_log.json b/src/generated/resources/assets/twilightforest/models/item/mangrove_log.json new file mode 100644 index 0000000000..574610d3e6 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/mangrove_log.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/mangrove_log" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/mangrove_planks.json b/src/generated/resources/assets/twilightforest/models/item/mangrove_planks.json new file mode 100644 index 0000000000..346733718e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/mangrove_planks.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/wood/planks/mangrove/mangrove_planks" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/mangrove_pressure_plate.json b/src/generated/resources/assets/twilightforest/models/item/mangrove_pressure_plate.json new file mode 100644 index 0000000000..b86b8b24a5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/mangrove_pressure_plate.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/wood/pressure_plate/mangrove/mangrove_pressure_plate" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/mangrove_root.json b/src/generated/resources/assets/twilightforest/models/item/mangrove_root.json new file mode 100644 index 0000000000..1e2bce61a0 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/mangrove_root.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/mangrove_root" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/mangrove_sapling.json b/src/generated/resources/assets/twilightforest/models/item/mangrove_sapling.json new file mode 100644 index 0000000000..2fbd592643 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/mangrove_sapling.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:block/mangrove_sapling" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/mangrove_sign.json b/src/generated/resources/assets/twilightforest/models/item/mangrove_sign.json new file mode 100644 index 0000000000..4702a85003 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/mangrove_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/mangrove_sign" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/mangrove_slab.json b/src/generated/resources/assets/twilightforest/models/item/mangrove_slab.json new file mode 100644 index 0000000000..6b866984d3 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/mangrove_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/wood/slab/mangrove/mangrove_slab" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/mangrove_stairs.json b/src/generated/resources/assets/twilightforest/models/item/mangrove_stairs.json new file mode 100644 index 0000000000..b853b8ed65 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/mangrove_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/wood/stairs/mangrove/mangrove_stairs" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/mangrove_trapdoor.json b/src/generated/resources/assets/twilightforest/models/item/mangrove_trapdoor.json new file mode 100644 index 0000000000..93e8ecc9d7 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/mangrove_trapdoor.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/wood/trapdoor/mangrove/mangrove_trapdoor_bottom" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/mangrove_wood.json b/src/generated/resources/assets/twilightforest/models/item/mangrove_wood.json new file mode 100644 index 0000000000..02fcf403f2 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/mangrove_wood.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/mangrove_wood" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/mayapple.json b/src/generated/resources/assets/twilightforest/models/item/mayapple.json new file mode 100644 index 0000000000..362f9a61d7 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/mayapple.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:block/mayapple" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/maze_map.json b/src/generated/resources/assets/twilightforest/models/item/maze_map.json new file mode 100644 index 0000000000..91692f3d77 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/maze_map.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/maze_map" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/maze_map_focus.json b/src/generated/resources/assets/twilightforest/models/item/maze_map_focus.json new file mode 100644 index 0000000000..8bc4b8d344 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/maze_map_focus.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/maze_map_focus" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/maze_slime_spawn_egg.json b/src/generated/resources/assets/twilightforest/models/item/maze_slime_spawn_egg.json new file mode 100644 index 0000000000..d1aaa9d6ef --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/maze_slime_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/maze_wafer.json b/src/generated/resources/assets/twilightforest/models/item/maze_wafer.json new file mode 100644 index 0000000000..3cf46fc101 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/maze_wafer.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/maze_wafer" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/mazebreaker_pickaxe.json b/src/generated/resources/assets/twilightforest/models/item/mazebreaker_pickaxe.json new file mode 100644 index 0000000000..8976a5a1a0 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/mazebreaker_pickaxe.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "twilightforest:item/mazebreaker_pickaxe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/mazestone.json b/src/generated/resources/assets/twilightforest/models/item/mazestone.json new file mode 100644 index 0000000000..c0b57ecde4 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/mazestone.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/mazestone" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/mazestone_border.json b/src/generated/resources/assets/twilightforest/models/item/mazestone_border.json new file mode 100644 index 0000000000..e55d951560 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/mazestone_border.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/mazestone_border" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/mazestone_brick.json b/src/generated/resources/assets/twilightforest/models/item/mazestone_brick.json new file mode 100644 index 0000000000..2cff2acc15 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/mazestone_brick.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/mazestone_brick" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/mazestone_mosaic.json b/src/generated/resources/assets/twilightforest/models/item/mazestone_mosaic.json new file mode 100644 index 0000000000..4c7d798769 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/mazestone_mosaic.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/mazestone_mosaic" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/meef_stroganoff.json b/src/generated/resources/assets/twilightforest/models/item/meef_stroganoff.json new file mode 100644 index 0000000000..eff168e9bc --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/meef_stroganoff.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/meef_stroganoff" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/mining_banister.json b/src/generated/resources/assets/twilightforest/models/item/mining_banister.json new file mode 100644 index 0000000000..0b319c3156 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/mining_banister.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:item/banister_item", + "textures": { + "texture": "twilightforest:block/wood/planks_mine_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/mining_boat.json b/src/generated/resources/assets/twilightforest/models/item/mining_boat.json new file mode 100644 index 0000000000..9b31cc33af --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/mining_boat.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/mining_boat" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/mining_button.json b/src/generated/resources/assets/twilightforest/models/item/mining_button.json new file mode 100644 index 0000000000..b70a3e95f1 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/mining_button.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button_inventory", + "textures": { + "texture": "twilightforest:block/wood/planks_mine_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/mining_chest.json b/src/generated/resources/assets/twilightforest/models/item/mining_chest.json new file mode 100644 index 0000000000..f261cc3cbc --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/mining_chest.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/chest", + "textures": { + "particle": "twilightforest:block/wood/planks_mine_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/mining_chest_boat.json b/src/generated/resources/assets/twilightforest/models/item/mining_chest_boat.json new file mode 100644 index 0000000000..814ea07d7e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/mining_chest_boat.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/mining_chest_boat" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/mining_door.json b/src/generated/resources/assets/twilightforest/models/item/mining_door.json new file mode 100644 index 0000000000..339c14a2c5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/mining_door.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/mining_door" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/mining_fence.json b/src/generated/resources/assets/twilightforest/models/item/mining_fence.json new file mode 100644 index 0000000000..0ca3e253a3 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/mining_fence.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_inventory", + "textures": { + "texture": "twilightforest:block/wood/planks_mine_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/mining_fence_gate.json b/src/generated/resources/assets/twilightforest/models/item/mining_fence_gate.json new file mode 100644 index 0000000000..d5675195d5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/mining_fence_gate.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/wood/fence_gate/mine/mining_fence_gate" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/mining_leaves.json b/src/generated/resources/assets/twilightforest/models/item/mining_leaves.json new file mode 100644 index 0000000000..c44707cd64 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/mining_leaves.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/mining_leaves" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/mining_log.json b/src/generated/resources/assets/twilightforest/models/item/mining_log.json new file mode 100644 index 0000000000..4eb2eefe53 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/mining_log.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/mining_log" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/mining_log_core.json b/src/generated/resources/assets/twilightforest/models/item/mining_log_core.json new file mode 100644 index 0000000000..b61b7c8779 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/mining_log_core.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/mining_log_core" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/mining_planks.json b/src/generated/resources/assets/twilightforest/models/item/mining_planks.json new file mode 100644 index 0000000000..932c5fcc78 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/mining_planks.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/wood/planks/mine/mining_planks" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/mining_pressure_plate.json b/src/generated/resources/assets/twilightforest/models/item/mining_pressure_plate.json new file mode 100644 index 0000000000..57e9814eed --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/mining_pressure_plate.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/wood/pressure_plate/mine/mining_pressure_plate" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/mining_sapling.json b/src/generated/resources/assets/twilightforest/models/item/mining_sapling.json new file mode 100644 index 0000000000..d0a70a4f35 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/mining_sapling.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:block/mining_sapling" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/mining_sign.json b/src/generated/resources/assets/twilightforest/models/item/mining_sign.json new file mode 100644 index 0000000000..878990d137 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/mining_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/mining_sign" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/mining_slab.json b/src/generated/resources/assets/twilightforest/models/item/mining_slab.json new file mode 100644 index 0000000000..2c1666069e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/mining_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/wood/slab/mine/mining_slab" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/mining_stairs.json b/src/generated/resources/assets/twilightforest/models/item/mining_stairs.json new file mode 100644 index 0000000000..7553bfb809 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/mining_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/wood/stairs/mine/mining_stairs" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/mining_trapdoor.json b/src/generated/resources/assets/twilightforest/models/item/mining_trapdoor.json new file mode 100644 index 0000000000..85ee243193 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/mining_trapdoor.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/wood/trapdoor/mine/mine_trapdoor_bottom" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/mining_wood.json b/src/generated/resources/assets/twilightforest/models/item/mining_wood.json new file mode 100644 index 0000000000..863f720a61 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/mining_wood.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/mining_wood" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/minoshroom_banner_pattern.json b/src/generated/resources/assets/twilightforest/models/item/minoshroom_banner_pattern.json new file mode 100644 index 0000000000..dd801b92f0 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/minoshroom_banner_pattern.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/tf_banner_pattern" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/minoshroom_boss_spawner.json b/src/generated/resources/assets/twilightforest/models/item/minoshroom_boss_spawner.json new file mode 100644 index 0000000000..f54a94f6b5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/minoshroom_boss_spawner.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/spawner" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/minoshroom_spawn_egg.json b/src/generated/resources/assets/twilightforest/models/item/minoshroom_spawn_egg.json new file mode 100644 index 0000000000..d1aaa9d6ef --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/minoshroom_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/minoshroom_trophy.json b/src/generated/resources/assets/twilightforest/models/item/minoshroom_trophy.json new file mode 100644 index 0000000000..117525e741 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/minoshroom_trophy.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:item/template_trophy" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/minotaur_spawn_egg.json b/src/generated/resources/assets/twilightforest/models/item/minotaur_spawn_egg.json new file mode 100644 index 0000000000..d1aaa9d6ef --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/minotaur_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/mist_wolf_spawn_egg.json b/src/generated/resources/assets/twilightforest/models/item/mist_wolf_spawn_egg.json new file mode 100644 index 0000000000..d1aaa9d6ef --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/mist_wolf_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/moon_dial.json b/src/generated/resources/assets/twilightforest/models/item/moon_dial.json new file mode 100644 index 0000000000..b7e16c0d8b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/moon_dial.json @@ -0,0 +1,56 @@ +{ + "parent": "twilightforest:item/moon_dial_template", + "overrides": [ + { + "model": "twilightforest:item/moon_dial_full", + "predicate": { + "minecraft:phase": 0.0 + } + }, + { + "model": "twilightforest:item/moon_dial_waning_gib", + "predicate": { + "minecraft:phase": 0.125 + } + }, + { + "model": "twilightforest:item/moon_dial_quarter3", + "predicate": { + "minecraft:phase": 0.25 + } + }, + { + "model": "twilightforest:item/moon_dial_waning_cres", + "predicate": { + "minecraft:phase": 0.375 + } + }, + { + "model": "twilightforest:item/moon_dial_new", + "predicate": { + "minecraft:phase": 0.5 + } + }, + { + "model": "twilightforest:item/moon_dial_waxing_cres", + "predicate": { + "minecraft:phase": 0.625 + } + }, + { + "model": "twilightforest:item/moon_dial_quarter1", + "predicate": { + "minecraft:phase": 0.75 + } + }, + { + "model": "twilightforest:item/moon_dial_waxing_gib", + "predicate": { + "minecraft:phase": 0.875 + } + } + ], + "textures": { + "layer0": "twilightforest:item/moon_dial/full" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/moon_dial_full.json b/src/generated/resources/assets/twilightforest/models/item/moon_dial_full.json new file mode 100644 index 0000000000..7d23530f6b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/moon_dial_full.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:item/moon_dial_template", + "textures": { + "layer0": "twilightforest:item/moon_dial/full" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/moon_dial_new.json b/src/generated/resources/assets/twilightforest/models/item/moon_dial_new.json new file mode 100644 index 0000000000..42eec815b0 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/moon_dial_new.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:item/moon_dial_template", + "textures": { + "layer0": "twilightforest:item/moon_dial/new" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/moon_dial_quarter1.json b/src/generated/resources/assets/twilightforest/models/item/moon_dial_quarter1.json new file mode 100644 index 0000000000..0e77c9641d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/moon_dial_quarter1.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:item/moon_dial_template", + "textures": { + "layer0": "twilightforest:item/moon_dial/first_quarter" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/moon_dial_quarter3.json b/src/generated/resources/assets/twilightforest/models/item/moon_dial_quarter3.json new file mode 100644 index 0000000000..9dcad165cb --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/moon_dial_quarter3.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:item/moon_dial_template", + "textures": { + "layer0": "twilightforest:item/moon_dial/third_quarter" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/moon_dial_waning_cres.json b/src/generated/resources/assets/twilightforest/models/item/moon_dial_waning_cres.json new file mode 100644 index 0000000000..8e65187ce7 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/moon_dial_waning_cres.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:item/moon_dial_template", + "textures": { + "layer0": "twilightforest:item/moon_dial/waning_cresent" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/moon_dial_waning_gib.json b/src/generated/resources/assets/twilightforest/models/item/moon_dial_waning_gib.json new file mode 100644 index 0000000000..d78cdd691d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/moon_dial_waning_gib.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:item/moon_dial_template", + "textures": { + "layer0": "twilightforest:item/moon_dial/waning_gibbous" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/moon_dial_waxing_cres.json b/src/generated/resources/assets/twilightforest/models/item/moon_dial_waxing_cres.json new file mode 100644 index 0000000000..9133cff5b0 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/moon_dial_waxing_cres.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:item/moon_dial_template", + "textures": { + "layer0": "twilightforest:item/moon_dial/waxing_cresent" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/moon_dial_waxing_gib.json b/src/generated/resources/assets/twilightforest/models/item/moon_dial_waxing_gib.json new file mode 100644 index 0000000000..00c978be26 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/moon_dial_waxing_gib.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:item/moon_dial_template", + "textures": { + "layer0": "twilightforest:item/moon_dial/waxing_gibbous" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/moonworm_queen.json b/src/generated/resources/assets/twilightforest/models/item/moonworm_queen.json new file mode 100644 index 0000000000..43e560323c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/moonworm_queen.json @@ -0,0 +1,28 @@ +{ + "parent": "minecraft:item/handheld", + "forge_data": { + "layers": { + "0": { + "block_light": 15, + "sky_light": 15 + } + } + }, + "loader": "forge:item_layers", + "overrides": [ + { + "model": "twilightforest:item/moonworm_queen_alt", + "predicate": { + "twilightforest:alt": 1.0 + } + } + ], + "render_types": { + "twilightforest:forge_entity_unsorted_translucent": [ + 0 + ] + }, + "textures": { + "layer0": "twilightforest:item/moonworm_queen" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/moonworm_queen_alt.json b/src/generated/resources/assets/twilightforest/models/item/moonworm_queen_alt.json new file mode 100644 index 0000000000..dbdd8216f3 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/moonworm_queen_alt.json @@ -0,0 +1,20 @@ +{ + "parent": "minecraft:item/handheld", + "forge_data": { + "layers": { + "0": { + "block_light": 15, + "sky_light": 15 + } + } + }, + "loader": "forge:item_layers", + "render_types": { + "twilightforest:forge_entity_unsorted_translucent": [ + 0 + ] + }, + "textures": { + "layer0": "twilightforest:item/moonworm_queen_alt" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/mosquito_swarm_spawn_egg.json b/src/generated/resources/assets/twilightforest/models/item/mosquito_swarm_spawn_egg.json new file mode 100644 index 0000000000..d1aaa9d6ef --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/mosquito_swarm_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/moss_patch.json b/src/generated/resources/assets/twilightforest/models/item/moss_patch.json new file mode 100644 index 0000000000..3104124711 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/moss_patch.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:block/patch/moss" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/mossy_castle_brick.json b/src/generated/resources/assets/twilightforest/models/item/mossy_castle_brick.json new file mode 100644 index 0000000000..56b5416180 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/mossy_castle_brick.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/mossy_castle_brick" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/mossy_castle_brick_stairs.json b/src/generated/resources/assets/twilightforest/models/item/mossy_castle_brick_stairs.json new file mode 100644 index 0000000000..a1abfa8bc7 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/mossy_castle_brick_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/mossy_castle_brick_stairs" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/mossy_etched_nagastone.json b/src/generated/resources/assets/twilightforest/models/item/mossy_etched_nagastone.json new file mode 100644 index 0000000000..72a2dc3311 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/mossy_etched_nagastone.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/mossy_etched_nagastone" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/mossy_mazestone.json b/src/generated/resources/assets/twilightforest/models/item/mossy_mazestone.json new file mode 100644 index 0000000000..3fac9675b8 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/mossy_mazestone.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/mossy_mazestone" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/mossy_nagastone_pillar.json b/src/generated/resources/assets/twilightforest/models/item/mossy_nagastone_pillar.json new file mode 100644 index 0000000000..c111b8eb62 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/mossy_nagastone_pillar.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/mossy_nagastone_pillar" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/mossy_nagastone_stairs_left.json b/src/generated/resources/assets/twilightforest/models/item/mossy_nagastone_stairs_left.json new file mode 100644 index 0000000000..37f54f031a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/mossy_nagastone_stairs_left.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/mossy_nagastone_stairs_left" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/mossy_nagastone_stairs_right.json b/src/generated/resources/assets/twilightforest/models/item/mossy_nagastone_stairs_right.json new file mode 100644 index 0000000000..c725039dde --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/mossy_nagastone_stairs_right.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/mossy_nagastone_stairs_right" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/mossy_towerwood.json b/src/generated/resources/assets/twilightforest/models/item/mossy_towerwood.json new file mode 100644 index 0000000000..d6a5b14870 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/mossy_towerwood.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/mossy_towerwood" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/mossy_underbrick.json b/src/generated/resources/assets/twilightforest/models/item/mossy_underbrick.json new file mode 100644 index 0000000000..801a35f17b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/mossy_underbrick.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/mossy_underbrick" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/mushgloom.json b/src/generated/resources/assets/twilightforest/models/item/mushgloom.json new file mode 100644 index 0000000000..4e409e94f9 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/mushgloom.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:block/mushgloom", + "layer1": "twilightforest:block/mushgloom_head" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/music_disc_findings.json b/src/generated/resources/assets/twilightforest/models/item/music_disc_findings.json new file mode 100644 index 0000000000..d15d6a18ea --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/music_disc_findings.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/music_disc_findings" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/music_disc_home.json b/src/generated/resources/assets/twilightforest/models/item/music_disc_home.json new file mode 100644 index 0000000000..391c6c555d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/music_disc_home.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/music_disc_home" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/music_disc_maker.json b/src/generated/resources/assets/twilightforest/models/item/music_disc_maker.json new file mode 100644 index 0000000000..95b80ae285 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/music_disc_maker.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/music_disc_maker" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/music_disc_motion.json b/src/generated/resources/assets/twilightforest/models/item/music_disc_motion.json new file mode 100644 index 0000000000..0e014ab878 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/music_disc_motion.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/music_disc_motion" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/music_disc_radiance.json b/src/generated/resources/assets/twilightforest/models/item/music_disc_radiance.json new file mode 100644 index 0000000000..56d0db0983 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/music_disc_radiance.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/music_disc_radiance" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/music_disc_steps.json b/src/generated/resources/assets/twilightforest/models/item/music_disc_steps.json new file mode 100644 index 0000000000..d374d9c04d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/music_disc_steps.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/music_disc_steps" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/music_disc_superstitious.json b/src/generated/resources/assets/twilightforest/models/item/music_disc_superstitious.json new file mode 100644 index 0000000000..4cd4e7a5f7 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/music_disc_superstitious.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/music_disc_superstitious" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/music_disc_thread.json b/src/generated/resources/assets/twilightforest/models/item/music_disc_thread.json new file mode 100644 index 0000000000..7b72a330d2 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/music_disc_thread.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/music_disc_thread" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/music_disc_wayfarer.json b/src/generated/resources/assets/twilightforest/models/item/music_disc_wayfarer.json new file mode 100644 index 0000000000..99be2ada83 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/music_disc_wayfarer.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/music_disc_wayfarer" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/naga_banner_pattern.json b/src/generated/resources/assets/twilightforest/models/item/naga_banner_pattern.json new file mode 100644 index 0000000000..dd801b92f0 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/naga_banner_pattern.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/tf_banner_pattern" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/naga_boss_spawner.json b/src/generated/resources/assets/twilightforest/models/item/naga_boss_spawner.json new file mode 100644 index 0000000000..f54a94f6b5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/naga_boss_spawner.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/spawner" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/naga_chestplate.json b/src/generated/resources/assets/twilightforest/models/item/naga_chestplate.json new file mode 100644 index 0000000000..c94482aaa9 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/naga_chestplate.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/naga_chestplate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/naga_courtyard_miniature_structure.json b/src/generated/resources/assets/twilightforest/models/item/naga_courtyard_miniature_structure.json new file mode 100644 index 0000000000..1285124301 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/naga_courtyard_miniature_structure.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/miniature/naga_courtyard" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/naga_leggings.json b/src/generated/resources/assets/twilightforest/models/item/naga_leggings.json new file mode 100644 index 0000000000..30014e2e78 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/naga_leggings.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/naga_leggings" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/naga_scale.json b/src/generated/resources/assets/twilightforest/models/item/naga_scale.json new file mode 100644 index 0000000000..64f5ecf187 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/naga_scale.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/naga_scale" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/naga_spawn_egg.json b/src/generated/resources/assets/twilightforest/models/item/naga_spawn_egg.json new file mode 100644 index 0000000000..d1aaa9d6ef --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/naga_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/naga_trophy.json b/src/generated/resources/assets/twilightforest/models/item/naga_trophy.json new file mode 100644 index 0000000000..117525e741 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/naga_trophy.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:item/template_trophy" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/nagastone.json b/src/generated/resources/assets/twilightforest/models/item/nagastone.json new file mode 100644 index 0000000000..92767555b1 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/nagastone.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/nagastone" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/nagastone_head.json b/src/generated/resources/assets/twilightforest/models/item/nagastone_head.json new file mode 100644 index 0000000000..5f43f69d4c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/nagastone_head.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/nagastone_head" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/nagastone_pillar.json b/src/generated/resources/assets/twilightforest/models/item/nagastone_pillar.json new file mode 100644 index 0000000000..e629f0b89d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/nagastone_pillar.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/nagastone_pillar" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/nagastone_stairs_left.json b/src/generated/resources/assets/twilightforest/models/item/nagastone_stairs_left.json new file mode 100644 index 0000000000..00be7670a6 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/nagastone_stairs_left.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/nagastone_stairs_left" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/nagastone_stairs_right.json b/src/generated/resources/assets/twilightforest/models/item/nagastone_stairs_right.json new file mode 100644 index 0000000000..80cf74fbce --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/nagastone_stairs_right.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/nagastone_stairs_right" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/oak_banister.json b/src/generated/resources/assets/twilightforest/models/item/oak_banister.json new file mode 100644 index 0000000000..103d6750f3 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/oak_banister.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:item/banister_item", + "textures": { + "texture": "minecraft:block/oak_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/orange_force_field.json b/src/generated/resources/assets/twilightforest/models/item/orange_force_field.json new file mode 100644 index 0000000000..457bcfcf18 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/orange_force_field.json @@ -0,0 +1,20 @@ +{ + "parent": "minecraft:item/generated", + "forge_data": { + "layers": { + "0": { + "block_light": 15, + "sky_light": 15 + } + } + }, + "loader": "forge:item_layers", + "render_types": { + "minecraft:translucent": [ + 0 + ] + }, + "textures": { + "layer0": "twilightforest:block/forcefield_white" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/ore_magnet.json b/src/generated/resources/assets/twilightforest/models/item/ore_magnet.json new file mode 100644 index 0000000000..523df99f72 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/ore_magnet.json @@ -0,0 +1,22 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "twilightforest:item/ore_magnet_pulling_1", + "predicate": { + "minecraft:pull": 0.5, + "minecraft:pulling": 1.0 + } + }, + { + "model": "twilightforest:item/ore_magnet_pulling_2", + "predicate": { + "minecraft:pull": 1.0, + "minecraft:pulling": 1.0 + } + } + ], + "textures": { + "layer0": "twilightforest:item/ore_magnet" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/ore_magnet_pulling_1.json b/src/generated/resources/assets/twilightforest/models/item/ore_magnet_pulling_1.json new file mode 100644 index 0000000000..b41c1aefb3 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/ore_magnet_pulling_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/ore_magnet_pulling_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/ore_magnet_pulling_2.json b/src/generated/resources/assets/twilightforest/models/item/ore_magnet_pulling_2.json new file mode 100644 index 0000000000..5b0f5f78f8 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/ore_magnet_pulling_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/ore_magnet_pulling_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/ore_map.json b/src/generated/resources/assets/twilightforest/models/item/ore_map.json new file mode 100644 index 0000000000..a1c17db094 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/ore_map.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/ore_map" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/ore_meter.json b/src/generated/resources/assets/twilightforest/models/item/ore_meter.json new file mode 100644 index 0000000000..49717de4b9 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/ore_meter.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/ore_meter" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/peacock_feather_fan.json b/src/generated/resources/assets/twilightforest/models/item/peacock_feather_fan.json new file mode 100644 index 0000000000..ce05d5def2 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/peacock_feather_fan.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "twilightforest:item/peacock_feather_fan" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/penguin_spawn_egg.json b/src/generated/resources/assets/twilightforest/models/item/penguin_spawn_egg.json new file mode 100644 index 0000000000..d1aaa9d6ef --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/penguin_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/phantom_chestplate.json b/src/generated/resources/assets/twilightforest/models/item/phantom_chestplate.json new file mode 100644 index 0000000000..e8617d1784 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/phantom_chestplate.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/phantom_chestplate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/phantom_helmet.json b/src/generated/resources/assets/twilightforest/models/item/phantom_helmet.json new file mode 100644 index 0000000000..6a1d33a4d3 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/phantom_helmet.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/phantom_helmet" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/pinch_beetle_spawn_egg.json b/src/generated/resources/assets/twilightforest/models/item/pinch_beetle_spawn_egg.json new file mode 100644 index 0000000000..d1aaa9d6ef --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/pinch_beetle_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/pink_castle_door.json b/src/generated/resources/assets/twilightforest/models/item/pink_castle_door.json new file mode 100644 index 0000000000..4ac65c2102 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/pink_castle_door.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/pink_castle_door" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/pink_castle_rune_brick.json b/src/generated/resources/assets/twilightforest/models/item/pink_castle_rune_brick.json new file mode 100644 index 0000000000..4f73415787 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/pink_castle_rune_brick.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/castle_rune_inventory" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/pink_force_field.json b/src/generated/resources/assets/twilightforest/models/item/pink_force_field.json new file mode 100644 index 0000000000..457bcfcf18 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/pink_force_field.json @@ -0,0 +1,20 @@ +{ + "parent": "minecraft:item/generated", + "forge_data": { + "layers": { + "0": { + "block_light": 15, + "sky_light": 15 + } + } + }, + "loader": "forge:item_layers", + "render_types": { + "minecraft:translucent": [ + 0 + ] + }, + "textures": { + "layer0": "twilightforest:block/forcefield_white" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/player_skull_candle.json b/src/generated/resources/assets/twilightforest/models/item/player_skull_candle.json new file mode 100644 index 0000000000..23bec58c92 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/player_skull_candle.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:item/template_skull_candle" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/quest_ram_banner_pattern.json b/src/generated/resources/assets/twilightforest/models/item/quest_ram_banner_pattern.json new file mode 100644 index 0000000000..dd801b92f0 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/quest_ram_banner_pattern.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/tf_banner_pattern" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/quest_ram_spawn_egg.json b/src/generated/resources/assets/twilightforest/models/item/quest_ram_spawn_egg.json new file mode 100644 index 0000000000..d1aaa9d6ef --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/quest_ram_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/quest_ram_trophy.json b/src/generated/resources/assets/twilightforest/models/item/quest_ram_trophy.json new file mode 100644 index 0000000000..117525e741 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/quest_ram_trophy.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:item/template_trophy" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/rainbow_oak_leaves.json b/src/generated/resources/assets/twilightforest/models/item/rainbow_oak_leaves.json new file mode 100644 index 0000000000..5bf9c22add --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/rainbow_oak_leaves.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/rainbow_oak_leaves" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/rainbow_oak_sapling.json b/src/generated/resources/assets/twilightforest/models/item/rainbow_oak_sapling.json new file mode 100644 index 0000000000..59118d8c32 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/rainbow_oak_sapling.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:block/rainbow_oak_sapling" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/raven_feather.json b/src/generated/resources/assets/twilightforest/models/item/raven_feather.json new file mode 100644 index 0000000000..e95f0de81a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/raven_feather.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/raven_feather" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/raven_spawn_egg.json b/src/generated/resources/assets/twilightforest/models/item/raven_spawn_egg.json new file mode 100644 index 0000000000..d1aaa9d6ef --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/raven_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/raw_ironwood.json b/src/generated/resources/assets/twilightforest/models/item/raw_ironwood.json new file mode 100644 index 0000000000..e71f26b91c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/raw_ironwood.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/raw_ironwood" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/raw_meef.json b/src/generated/resources/assets/twilightforest/models/item/raw_meef.json new file mode 100644 index 0000000000..08ebdbb881 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/raw_meef.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/raw_meef" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/raw_venison.json b/src/generated/resources/assets/twilightforest/models/item/raw_venison.json new file mode 100644 index 0000000000..44f850478b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/raw_venison.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/raw_venison" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/reappearing_block.json b/src/generated/resources/assets/twilightforest/models/item/reappearing_block.json new file mode 100644 index 0000000000..e87b4e112c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/reappearing_block.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/reappearing_block" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/red_thread.json b/src/generated/resources/assets/twilightforest/models/item/red_thread.json new file mode 100644 index 0000000000..8ff686a146 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/red_thread.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/red_thread" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/redcap_sapper_spawn_egg.json b/src/generated/resources/assets/twilightforest/models/item/redcap_sapper_spawn_egg.json new file mode 100644 index 0000000000..d1aaa9d6ef --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/redcap_sapper_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/redcap_spawn_egg.json b/src/generated/resources/assets/twilightforest/models/item/redcap_spawn_egg.json new file mode 100644 index 0000000000..d1aaa9d6ef --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/redcap_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/root.json b/src/generated/resources/assets/twilightforest/models/item/root.json new file mode 100644 index 0000000000..60839b9735 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/root.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/root" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/root_strand.json b/src/generated/resources/assets/twilightforest/models/item/root_strand.json new file mode 100644 index 0000000000..70871ee6c3 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/root_strand.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:block/root_strand" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/seeker_bow.json b/src/generated/resources/assets/twilightforest/models/item/seeker_bow.json new file mode 100644 index 0000000000..c61abf774e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/seeker_bow.json @@ -0,0 +1,28 @@ +{ + "parent": "minecraft:item/bow", + "overrides": [ + { + "model": "twilightforest:item/seeker_bow_pulling_0", + "predicate": { + "minecraft:pulling": 1.0 + } + }, + { + "model": "twilightforest:item/seeker_bow_pulling_1", + "predicate": { + "minecraft:pull": 0.65, + "minecraft:pulling": 1.0 + } + }, + { + "model": "twilightforest:item/seeker_bow_pulling_2", + "predicate": { + "minecraft:pull": 0.9, + "minecraft:pulling": 1.0 + } + } + ], + "textures": { + "layer0": "twilightforest:item/seeker_bow" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/seeker_bow_pulling_0.json b/src/generated/resources/assets/twilightforest/models/item/seeker_bow_pulling_0.json new file mode 100644 index 0000000000..95d134e8a5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/seeker_bow_pulling_0.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/bow", + "textures": { + "layer0": "twilightforest:item/seeker_bow_pulling_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/seeker_bow_pulling_1.json b/src/generated/resources/assets/twilightforest/models/item/seeker_bow_pulling_1.json new file mode 100644 index 0000000000..9419e40330 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/seeker_bow_pulling_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/bow", + "textures": { + "layer0": "twilightforest:item/seeker_bow_pulling_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/seeker_bow_pulling_2.json b/src/generated/resources/assets/twilightforest/models/item/seeker_bow_pulling_2.json new file mode 100644 index 0000000000..1b41b13dd6 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/seeker_bow_pulling_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/bow", + "textures": { + "layer0": "twilightforest:item/seeker_bow_pulling_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/shield.json b/src/generated/resources/assets/twilightforest/models/item/shield.json new file mode 100644 index 0000000000..70f4930ac3 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/shield.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/lich_shield_frame", + "layer1": "twilightforest:item/lich_shield_fill" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/skeleton_druid_spawn_egg.json b/src/generated/resources/assets/twilightforest/models/item/skeleton_druid_spawn_egg.json new file mode 100644 index 0000000000..d1aaa9d6ef --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/skeleton_druid_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/skeleton_skull_candle.json b/src/generated/resources/assets/twilightforest/models/item/skeleton_skull_candle.json new file mode 100644 index 0000000000..23bec58c92 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/skeleton_skull_candle.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:item/template_skull_candle" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/slider.json b/src/generated/resources/assets/twilightforest/models/item/slider.json new file mode 100644 index 0000000000..0a517e4d0e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/slider.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/slider" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/slime_beetle_spawn_egg.json b/src/generated/resources/assets/twilightforest/models/item/slime_beetle_spawn_egg.json new file mode 100644 index 0000000000..d1aaa9d6ef --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/slime_beetle_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/smoker.json b/src/generated/resources/assets/twilightforest/models/item/smoker.json new file mode 100644 index 0000000000..660f4da9ad --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/smoker.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/smoker" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/snow_guardian_spawn_egg.json b/src/generated/resources/assets/twilightforest/models/item/snow_guardian_spawn_egg.json new file mode 100644 index 0000000000..d1aaa9d6ef --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/snow_guardian_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/snow_queen_banner_pattern.json b/src/generated/resources/assets/twilightforest/models/item/snow_queen_banner_pattern.json new file mode 100644 index 0000000000..dd801b92f0 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/snow_queen_banner_pattern.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/tf_banner_pattern" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/snow_queen_boss_spawner.json b/src/generated/resources/assets/twilightforest/models/item/snow_queen_boss_spawner.json new file mode 100644 index 0000000000..f54a94f6b5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/snow_queen_boss_spawner.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/spawner" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/snow_queen_spawn_egg.json b/src/generated/resources/assets/twilightforest/models/item/snow_queen_spawn_egg.json new file mode 100644 index 0000000000..d1aaa9d6ef --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/snow_queen_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/snow_queen_trophy.json b/src/generated/resources/assets/twilightforest/models/item/snow_queen_trophy.json new file mode 100644 index 0000000000..117525e741 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/snow_queen_trophy.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:item/template_trophy" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/sorting_banister.json b/src/generated/resources/assets/twilightforest/models/item/sorting_banister.json new file mode 100644 index 0000000000..0715fee033 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/sorting_banister.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:item/banister_item", + "textures": { + "texture": "twilightforest:block/wood/planks_sort_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/sorting_boat.json b/src/generated/resources/assets/twilightforest/models/item/sorting_boat.json new file mode 100644 index 0000000000..6c74dec7c5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/sorting_boat.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/sorting_boat" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/sorting_button.json b/src/generated/resources/assets/twilightforest/models/item/sorting_button.json new file mode 100644 index 0000000000..b5c3f85cee --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/sorting_button.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button_inventory", + "textures": { + "texture": "twilightforest:block/wood/planks_sort_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/sorting_chest.json b/src/generated/resources/assets/twilightforest/models/item/sorting_chest.json new file mode 100644 index 0000000000..b5965e27ce --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/sorting_chest.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/chest", + "textures": { + "particle": "twilightforest:block/wood/planks_sort_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/sorting_chest_boat.json b/src/generated/resources/assets/twilightforest/models/item/sorting_chest_boat.json new file mode 100644 index 0000000000..eab49c0bef --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/sorting_chest_boat.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/sorting_chest_boat" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/sorting_door.json b/src/generated/resources/assets/twilightforest/models/item/sorting_door.json new file mode 100644 index 0000000000..1a8add654c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/sorting_door.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/sorting_door" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/sorting_fence.json b/src/generated/resources/assets/twilightforest/models/item/sorting_fence.json new file mode 100644 index 0000000000..e70b125828 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/sorting_fence.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_inventory", + "textures": { + "texture": "twilightforest:block/wood/planks_sort_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/sorting_fence_gate.json b/src/generated/resources/assets/twilightforest/models/item/sorting_fence_gate.json new file mode 100644 index 0000000000..089618076d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/sorting_fence_gate.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/wood/fence_gate/sort/sorting_fence_gate" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/sorting_leaves.json b/src/generated/resources/assets/twilightforest/models/item/sorting_leaves.json new file mode 100644 index 0000000000..5def1ba1b6 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/sorting_leaves.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/sorting_leaves" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/sorting_log.json b/src/generated/resources/assets/twilightforest/models/item/sorting_log.json new file mode 100644 index 0000000000..47cef344d6 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/sorting_log.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/sorting_log" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/sorting_log_core.json b/src/generated/resources/assets/twilightforest/models/item/sorting_log_core.json new file mode 100644 index 0000000000..a06ffddf1f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/sorting_log_core.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/sorting_log_core" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/sorting_planks.json b/src/generated/resources/assets/twilightforest/models/item/sorting_planks.json new file mode 100644 index 0000000000..afe8fc77aa --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/sorting_planks.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/wood/planks/sort/sorting_planks" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/sorting_pressure_plate.json b/src/generated/resources/assets/twilightforest/models/item/sorting_pressure_plate.json new file mode 100644 index 0000000000..5e6f3598e3 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/sorting_pressure_plate.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/wood/pressure_plate/sort/sorting_pressure_plate" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/sorting_sapling.json b/src/generated/resources/assets/twilightforest/models/item/sorting_sapling.json new file mode 100644 index 0000000000..35219ce0fb --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/sorting_sapling.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:block/sorting_sapling" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/sorting_sign.json b/src/generated/resources/assets/twilightforest/models/item/sorting_sign.json new file mode 100644 index 0000000000..6d78384498 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/sorting_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/sorting_sign" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/sorting_slab.json b/src/generated/resources/assets/twilightforest/models/item/sorting_slab.json new file mode 100644 index 0000000000..f7594ac165 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/sorting_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/wood/slab/sort/sorting_slab" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/sorting_stairs.json b/src/generated/resources/assets/twilightforest/models/item/sorting_stairs.json new file mode 100644 index 0000000000..d7769a85f0 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/sorting_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/wood/stairs/sort/sorting_stairs" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/sorting_trapdoor.json b/src/generated/resources/assets/twilightforest/models/item/sorting_trapdoor.json new file mode 100644 index 0000000000..a4f82a474a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/sorting_trapdoor.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/wood/trapdoor/sort/sort_trapdoor_bottom" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/sorting_wood.json b/src/generated/resources/assets/twilightforest/models/item/sorting_wood.json new file mode 100644 index 0000000000..643e7c286c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/sorting_wood.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/sorting_wood" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/spiral_bricks.json b/src/generated/resources/assets/twilightforest/models/item/spiral_bricks.json new file mode 100644 index 0000000000..ce4eab50ed --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/spiral_bricks.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/spiral_bricks/x_spiral_bottom_right" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/spruce_banister.json b/src/generated/resources/assets/twilightforest/models/item/spruce_banister.json new file mode 100644 index 0000000000..7f51f203bf --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/spruce_banister.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:item/banister_item", + "textures": { + "texture": "minecraft:block/spruce_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/squirrel_spawn_egg.json b/src/generated/resources/assets/twilightforest/models/item/squirrel_spawn_egg.json new file mode 100644 index 0000000000..d1aaa9d6ef --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/squirrel_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/stable_ice_core_spawn_egg.json b/src/generated/resources/assets/twilightforest/models/item/stable_ice_core_spawn_egg.json new file mode 100644 index 0000000000..d1aaa9d6ef --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/stable_ice_core_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/steeleaf_axe.json b/src/generated/resources/assets/twilightforest/models/item/steeleaf_axe.json new file mode 100644 index 0000000000..57f40a805b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/steeleaf_axe.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "twilightforest:item/steeleaf_axe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/steeleaf_block.json b/src/generated/resources/assets/twilightforest/models/item/steeleaf_block.json new file mode 100644 index 0000000000..551a97044c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/steeleaf_block.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/steeleaf_block" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/steeleaf_boots.json b/src/generated/resources/assets/twilightforest/models/item/steeleaf_boots.json new file mode 100644 index 0000000000..12e9311712 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/steeleaf_boots.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/steeleaf_boots" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/steeleaf_chestplate.json b/src/generated/resources/assets/twilightforest/models/item/steeleaf_chestplate.json new file mode 100644 index 0000000000..98e2d2ebca --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/steeleaf_chestplate.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/steeleaf_chestplate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/steeleaf_helmet.json b/src/generated/resources/assets/twilightforest/models/item/steeleaf_helmet.json new file mode 100644 index 0000000000..c1e1a8d745 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/steeleaf_helmet.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/steeleaf_helmet" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/steeleaf_hoe.json b/src/generated/resources/assets/twilightforest/models/item/steeleaf_hoe.json new file mode 100644 index 0000000000..6ef48388a3 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/steeleaf_hoe.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "twilightforest:item/steeleaf_hoe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/steeleaf_ingot.json b/src/generated/resources/assets/twilightforest/models/item/steeleaf_ingot.json new file mode 100644 index 0000000000..3911ced4c3 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/steeleaf_ingot.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/steeleaf_ingot" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/steeleaf_leggings.json b/src/generated/resources/assets/twilightforest/models/item/steeleaf_leggings.json new file mode 100644 index 0000000000..11f4fdda54 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/steeleaf_leggings.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/steeleaf_leggings" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/steeleaf_pickaxe.json b/src/generated/resources/assets/twilightforest/models/item/steeleaf_pickaxe.json new file mode 100644 index 0000000000..3948d038d6 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/steeleaf_pickaxe.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "twilightforest:item/steeleaf_pickaxe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/steeleaf_shovel.json b/src/generated/resources/assets/twilightforest/models/item/steeleaf_shovel.json new file mode 100644 index 0000000000..0386f9464a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/steeleaf_shovel.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "twilightforest:item/steeleaf_shovel" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/steeleaf_sword.json b/src/generated/resources/assets/twilightforest/models/item/steeleaf_sword.json new file mode 100644 index 0000000000..d48523092c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/steeleaf_sword.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "twilightforest:item/steeleaf_sword" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/stripped_canopy_log.json b/src/generated/resources/assets/twilightforest/models/item/stripped_canopy_log.json new file mode 100644 index 0000000000..ac43b32627 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/stripped_canopy_log.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/stripped_canopy_log" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/stripped_canopy_wood.json b/src/generated/resources/assets/twilightforest/models/item/stripped_canopy_wood.json new file mode 100644 index 0000000000..9608f324f1 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/stripped_canopy_wood.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/stripped_canopy_wood" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/stripped_dark_log.json b/src/generated/resources/assets/twilightforest/models/item/stripped_dark_log.json new file mode 100644 index 0000000000..0ba4aaa005 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/stripped_dark_log.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/stripped_dark_log" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/stripped_dark_wood.json b/src/generated/resources/assets/twilightforest/models/item/stripped_dark_wood.json new file mode 100644 index 0000000000..da7ee0870b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/stripped_dark_wood.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/stripped_dark_wood" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/stripped_mangrove_log.json b/src/generated/resources/assets/twilightforest/models/item/stripped_mangrove_log.json new file mode 100644 index 0000000000..a31980c684 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/stripped_mangrove_log.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/stripped_mangrove_log" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/stripped_mangrove_wood.json b/src/generated/resources/assets/twilightforest/models/item/stripped_mangrove_wood.json new file mode 100644 index 0000000000..9e5aaf12ee --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/stripped_mangrove_wood.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/stripped_mangrove_wood" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/stripped_mining_log.json b/src/generated/resources/assets/twilightforest/models/item/stripped_mining_log.json new file mode 100644 index 0000000000..9d9127999f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/stripped_mining_log.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/stripped_mining_log" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/stripped_mining_wood.json b/src/generated/resources/assets/twilightforest/models/item/stripped_mining_wood.json new file mode 100644 index 0000000000..ee37e1351e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/stripped_mining_wood.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/stripped_mining_wood" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/stripped_sorting_log.json b/src/generated/resources/assets/twilightforest/models/item/stripped_sorting_log.json new file mode 100644 index 0000000000..bab6875329 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/stripped_sorting_log.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/stripped_sorting_log" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/stripped_sorting_wood.json b/src/generated/resources/assets/twilightforest/models/item/stripped_sorting_wood.json new file mode 100644 index 0000000000..42950d890e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/stripped_sorting_wood.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/stripped_sorting_wood" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/stripped_time_log.json b/src/generated/resources/assets/twilightforest/models/item/stripped_time_log.json new file mode 100644 index 0000000000..dc408fe269 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/stripped_time_log.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/stripped_time_log" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/stripped_time_wood.json b/src/generated/resources/assets/twilightforest/models/item/stripped_time_wood.json new file mode 100644 index 0000000000..72805b0f5a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/stripped_time_wood.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/stripped_time_wood" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/stripped_transformation_log.json b/src/generated/resources/assets/twilightforest/models/item/stripped_transformation_log.json new file mode 100644 index 0000000000..c943e2c16f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/stripped_transformation_log.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/stripped_transformation_log" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/stripped_transformation_wood.json b/src/generated/resources/assets/twilightforest/models/item/stripped_transformation_wood.json new file mode 100644 index 0000000000..79f2260436 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/stripped_transformation_wood.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/stripped_transformation_wood" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/stripped_twilight_oak_log.json b/src/generated/resources/assets/twilightforest/models/item/stripped_twilight_oak_log.json new file mode 100644 index 0000000000..c9a2a464b8 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/stripped_twilight_oak_log.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/stripped_twilight_oak_log" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/stripped_twilight_oak_wood.json b/src/generated/resources/assets/twilightforest/models/item/stripped_twilight_oak_wood.json new file mode 100644 index 0000000000..e0b8ee9f80 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/stripped_twilight_oak_wood.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/stripped_twilight_oak_wood" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/stronghold_shield.json b/src/generated/resources/assets/twilightforest/models/item/stronghold_shield.json new file mode 100644 index 0000000000..1bac796ff0 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/stronghold_shield.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/stronghold_shield" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/swarm_spider_spawn_egg.json b/src/generated/resources/assets/twilightforest/models/item/swarm_spider_spawn_egg.json new file mode 100644 index 0000000000..d1aaa9d6ef --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/swarm_spider_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/thick_castle_brick.json b/src/generated/resources/assets/twilightforest/models/item/thick_castle_brick.json new file mode 100644 index 0000000000..8b6f6813a3 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/thick_castle_brick.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/thick_castle_brick" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/think115.json b/src/generated/resources/assets/twilightforest/models/item/think115.json new file mode 100644 index 0000000000..3682ce71c2 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/think115.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/think115" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/thorn_leaves.json b/src/generated/resources/assets/twilightforest/models/item/thorn_leaves.json new file mode 100644 index 0000000000..a54fc8a7a4 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/thorn_leaves.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/oak_leaves" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/thorn_rose.json b/src/generated/resources/assets/twilightforest/models/item/thorn_rose.json new file mode 100644 index 0000000000..efb8e3676b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/thorn_rose.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:block/thorn_rose" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/time_banister.json b/src/generated/resources/assets/twilightforest/models/item/time_banister.json new file mode 100644 index 0000000000..98c9f53f3f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/time_banister.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:item/banister_item", + "textures": { + "texture": "twilightforest:block/wood/planks_time_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/time_boat.json b/src/generated/resources/assets/twilightforest/models/item/time_boat.json new file mode 100644 index 0000000000..224b4dcf4f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/time_boat.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/time_boat" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/time_button.json b/src/generated/resources/assets/twilightforest/models/item/time_button.json new file mode 100644 index 0000000000..8bd3a32c76 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/time_button.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button_inventory", + "textures": { + "texture": "twilightforest:block/wood/planks_time_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/time_chest.json b/src/generated/resources/assets/twilightforest/models/item/time_chest.json new file mode 100644 index 0000000000..a21931a1f6 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/time_chest.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/chest", + "textures": { + "particle": "twilightforest:block/wood/planks_time_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/time_chest_boat.json b/src/generated/resources/assets/twilightforest/models/item/time_chest_boat.json new file mode 100644 index 0000000000..cc6ccd6504 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/time_chest_boat.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/time_chest_boat" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/time_door.json b/src/generated/resources/assets/twilightforest/models/item/time_door.json new file mode 100644 index 0000000000..5cf9135994 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/time_door.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/time_door" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/time_fence.json b/src/generated/resources/assets/twilightforest/models/item/time_fence.json new file mode 100644 index 0000000000..f36e8a7f44 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/time_fence.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_inventory", + "textures": { + "texture": "twilightforest:block/wood/planks_time_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/time_fence_gate.json b/src/generated/resources/assets/twilightforest/models/item/time_fence_gate.json new file mode 100644 index 0000000000..666b055a8e --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/time_fence_gate.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/wood/fence_gate/time/time_fence_gate" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/time_leaves.json b/src/generated/resources/assets/twilightforest/models/item/time_leaves.json new file mode 100644 index 0000000000..e99e2cbe00 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/time_leaves.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/time_leaves" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/time_log.json b/src/generated/resources/assets/twilightforest/models/item/time_log.json new file mode 100644 index 0000000000..4ccfe326aa --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/time_log.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/time_log" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/time_log_core.json b/src/generated/resources/assets/twilightforest/models/item/time_log_core.json new file mode 100644 index 0000000000..59c34dfcf8 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/time_log_core.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/time_log_core" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/time_planks.json b/src/generated/resources/assets/twilightforest/models/item/time_planks.json new file mode 100644 index 0000000000..4b99e9162d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/time_planks.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/wood/planks/time/time_planks" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/time_pressure_plate.json b/src/generated/resources/assets/twilightforest/models/item/time_pressure_plate.json new file mode 100644 index 0000000000..4bf9753171 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/time_pressure_plate.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/wood/pressure_plate/time/time_pressure_plate" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/time_sapling.json b/src/generated/resources/assets/twilightforest/models/item/time_sapling.json new file mode 100644 index 0000000000..afa3eee5d6 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/time_sapling.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:block/time_sapling" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/time_sign.json b/src/generated/resources/assets/twilightforest/models/item/time_sign.json new file mode 100644 index 0000000000..cd0876f9d7 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/time_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/time_sign" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/time_slab.json b/src/generated/resources/assets/twilightforest/models/item/time_slab.json new file mode 100644 index 0000000000..7a7ca9a737 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/time_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/wood/slab/time/time_slab" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/time_stairs.json b/src/generated/resources/assets/twilightforest/models/item/time_stairs.json new file mode 100644 index 0000000000..1a56050b81 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/time_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/wood/stairs/time/time_stairs" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/time_trapdoor.json b/src/generated/resources/assets/twilightforest/models/item/time_trapdoor.json new file mode 100644 index 0000000000..f6561a132c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/time_trapdoor.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/wood/trapdoor/time/time_trapdoor_bottom" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/time_wood.json b/src/generated/resources/assets/twilightforest/models/item/time_wood.json new file mode 100644 index 0000000000..17eda41743 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/time_wood.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/time_wood" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/tiny_bird_spawn_egg.json b/src/generated/resources/assets/twilightforest/models/item/tiny_bird_spawn_egg.json new file mode 100644 index 0000000000..d1aaa9d6ef --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/tiny_bird_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/torchberries.json b/src/generated/resources/assets/twilightforest/models/item/torchberries.json new file mode 100644 index 0000000000..a9c49017e5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/torchberries.json @@ -0,0 +1,20 @@ +{ + "parent": "minecraft:item/generated", + "forge_data": { + "layers": { + "0": { + "block_light": 15, + "sky_light": 15 + } + } + }, + "loader": "forge:item_layers", + "render_types": { + "twilightforest:forge_entity_unsorted_translucent": [ + 0 + ] + }, + "textures": { + "layer0": "twilightforest:item/torchberries" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/torchberry_plant.json b/src/generated/resources/assets/twilightforest/models/item/torchberry_plant.json new file mode 100644 index 0000000000..390a5cb1b4 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/torchberry_plant.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:block/torchberry_plant" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/tower_key.json b/src/generated/resources/assets/twilightforest/models/item/tower_key.json new file mode 100644 index 0000000000..5dba8183cf --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/tower_key.json @@ -0,0 +1,20 @@ +{ + "parent": "minecraft:item/generated", + "forge_data": { + "layers": { + "0": { + "block_light": 15, + "sky_light": 15 + } + } + }, + "loader": "forge:item_layers", + "render_types": { + "twilightforest:forge_entity_unsorted_translucent": [ + 0 + ] + }, + "textures": { + "layer0": "twilightforest:item/tower_key" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/towerwood.json b/src/generated/resources/assets/twilightforest/models/item/towerwood.json new file mode 100644 index 0000000000..8811672feb --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/towerwood.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/towerwood" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/towerwood_borer_spawn_egg.json b/src/generated/resources/assets/twilightforest/models/item/towerwood_borer_spawn_egg.json new file mode 100644 index 0000000000..d1aaa9d6ef --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/towerwood_borer_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/transformation_banister.json b/src/generated/resources/assets/twilightforest/models/item/transformation_banister.json new file mode 100644 index 0000000000..098681ca3b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/transformation_banister.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:item/banister_item", + "textures": { + "texture": "twilightforest:block/wood/planks_trans_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/transformation_boat.json b/src/generated/resources/assets/twilightforest/models/item/transformation_boat.json new file mode 100644 index 0000000000..7cead504de --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/transformation_boat.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/transformation_boat" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/transformation_button.json b/src/generated/resources/assets/twilightforest/models/item/transformation_button.json new file mode 100644 index 0000000000..16c7544195 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/transformation_button.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button_inventory", + "textures": { + "texture": "twilightforest:block/wood/planks_trans_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/transformation_chest.json b/src/generated/resources/assets/twilightforest/models/item/transformation_chest.json new file mode 100644 index 0000000000..af46f979e1 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/transformation_chest.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/chest", + "textures": { + "particle": "twilightforest:block/wood/planks_trans_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/transformation_chest_boat.json b/src/generated/resources/assets/twilightforest/models/item/transformation_chest_boat.json new file mode 100644 index 0000000000..c19c5d7d22 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/transformation_chest_boat.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/transformation_chest_boat" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/transformation_door.json b/src/generated/resources/assets/twilightforest/models/item/transformation_door.json new file mode 100644 index 0000000000..8611e46276 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/transformation_door.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/transformation_door" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/transformation_fence.json b/src/generated/resources/assets/twilightforest/models/item/transformation_fence.json new file mode 100644 index 0000000000..c40cd3717d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/transformation_fence.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_inventory", + "textures": { + "texture": "twilightforest:block/wood/planks_trans_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/transformation_fence_gate.json b/src/generated/resources/assets/twilightforest/models/item/transformation_fence_gate.json new file mode 100644 index 0000000000..b090751473 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/transformation_fence_gate.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/wood/fence_gate/trans/transformation_fence_gate" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/transformation_leaves.json b/src/generated/resources/assets/twilightforest/models/item/transformation_leaves.json new file mode 100644 index 0000000000..e4d68be246 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/transformation_leaves.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/transformation_leaves" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/transformation_log.json b/src/generated/resources/assets/twilightforest/models/item/transformation_log.json new file mode 100644 index 0000000000..a3b1ad8888 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/transformation_log.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/transformation_log" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/transformation_log_core.json b/src/generated/resources/assets/twilightforest/models/item/transformation_log_core.json new file mode 100644 index 0000000000..31c48eada8 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/transformation_log_core.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/transformation_log_core" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/transformation_planks.json b/src/generated/resources/assets/twilightforest/models/item/transformation_planks.json new file mode 100644 index 0000000000..c074a656a0 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/transformation_planks.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/wood/planks/trans/transformation_planks" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/transformation_powder.json b/src/generated/resources/assets/twilightforest/models/item/transformation_powder.json new file mode 100644 index 0000000000..aa99cfdc3c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/transformation_powder.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/transformation_powder" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/transformation_pressure_plate.json b/src/generated/resources/assets/twilightforest/models/item/transformation_pressure_plate.json new file mode 100644 index 0000000000..e1b12fb432 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/transformation_pressure_plate.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/wood/pressure_plate/trans/transformation_pressure_plate" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/transformation_sapling.json b/src/generated/resources/assets/twilightforest/models/item/transformation_sapling.json new file mode 100644 index 0000000000..cc36cc4c34 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/transformation_sapling.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:block/transformation_sapling" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/transformation_sign.json b/src/generated/resources/assets/twilightforest/models/item/transformation_sign.json new file mode 100644 index 0000000000..edfd052fb1 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/transformation_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/transformation_sign" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/transformation_slab.json b/src/generated/resources/assets/twilightforest/models/item/transformation_slab.json new file mode 100644 index 0000000000..77bc02ab19 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/transformation_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/wood/slab/trans/transformation_slab" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/transformation_stairs.json b/src/generated/resources/assets/twilightforest/models/item/transformation_stairs.json new file mode 100644 index 0000000000..b7912d5789 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/transformation_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/wood/stairs/trans/transformation_stairs" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/transformation_trapdoor.json b/src/generated/resources/assets/twilightforest/models/item/transformation_trapdoor.json new file mode 100644 index 0000000000..6cf23c5bfc --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/transformation_trapdoor.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/wood/trapdoor/trans/trans_trapdoor_bottom" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/transformation_wood.json b/src/generated/resources/assets/twilightforest/models/item/transformation_wood.json new file mode 100644 index 0000000000..038b110afb --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/transformation_wood.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/transformation_wood" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/triple_bow.json b/src/generated/resources/assets/twilightforest/models/item/triple_bow.json new file mode 100644 index 0000000000..31c736f615 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/triple_bow.json @@ -0,0 +1,28 @@ +{ + "parent": "minecraft:item/bow", + "overrides": [ + { + "model": "twilightforest:item/triple_bow_pulling_0", + "predicate": { + "minecraft:pulling": 1.0 + } + }, + { + "model": "twilightforest:item/triple_bow_pulling_1", + "predicate": { + "minecraft:pull": 0.65, + "minecraft:pulling": 1.0 + } + }, + { + "model": "twilightforest:item/triple_bow_pulling_2", + "predicate": { + "minecraft:pull": 0.9, + "minecraft:pulling": 1.0 + } + } + ], + "textures": { + "layer0": "twilightforest:item/triple_bow" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/triple_bow_pulling_0.json b/src/generated/resources/assets/twilightforest/models/item/triple_bow_pulling_0.json new file mode 100644 index 0000000000..f55d9524a8 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/triple_bow_pulling_0.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/bow", + "textures": { + "layer0": "twilightforest:item/triple_bow_pulling_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/triple_bow_pulling_1.json b/src/generated/resources/assets/twilightforest/models/item/triple_bow_pulling_1.json new file mode 100644 index 0000000000..71bf85898b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/triple_bow_pulling_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/bow", + "textures": { + "layer0": "twilightforest:item/triple_bow_pulling_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/triple_bow_pulling_2.json b/src/generated/resources/assets/twilightforest/models/item/triple_bow_pulling_2.json new file mode 100644 index 0000000000..91abffa3eb --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/triple_bow_pulling_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/bow", + "textures": { + "layer0": "twilightforest:item/triple_bow_pulling_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/troll_spawn_egg.json b/src/generated/resources/assets/twilightforest/models/item/troll_spawn_egg.json new file mode 100644 index 0000000000..d1aaa9d6ef --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/troll_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/trollber.json b/src/generated/resources/assets/twilightforest/models/item/trollber.json new file mode 100644 index 0000000000..8c7e1b72ea --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/trollber.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:block/trollber" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/trollsteinn.json b/src/generated/resources/assets/twilightforest/models/item/trollsteinn.json new file mode 100644 index 0000000000..a3eaf4c6b9 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/trollsteinn.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "twilightforest:block/trollsteinn" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/trollvidr.json b/src/generated/resources/assets/twilightforest/models/item/trollvidr.json new file mode 100644 index 0000000000..0fef655689 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/trollvidr.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:block/trollvidr" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/trophy.json b/src/generated/resources/assets/twilightforest/models/item/trophy.json new file mode 100644 index 0000000000..7556be3ae3 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/trophy.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/trophy" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/trophy_minor.json b/src/generated/resources/assets/twilightforest/models/item/trophy_minor.json new file mode 100644 index 0000000000..98f06e03d0 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/trophy_minor.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/trophy_minor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/trophy_pedestal.json b/src/generated/resources/assets/twilightforest/models/item/trophy_pedestal.json new file mode 100644 index 0000000000..9a0319dff5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/trophy_pedestal.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/trophy_pedestal" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/trophy_quest.json b/src/generated/resources/assets/twilightforest/models/item/trophy_quest.json new file mode 100644 index 0000000000..1e164d47c7 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/trophy_quest.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/trophy_quest" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/twilight_oak_banister.json b/src/generated/resources/assets/twilightforest/models/item/twilight_oak_banister.json new file mode 100644 index 0000000000..9ae7b2aba8 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/twilight_oak_banister.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:item/banister_item", + "textures": { + "texture": "twilightforest:block/wood/planks_twilight_oak_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/twilight_oak_boat.json b/src/generated/resources/assets/twilightforest/models/item/twilight_oak_boat.json new file mode 100644 index 0000000000..e451f83d08 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/twilight_oak_boat.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/twilight_oak_boat" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/twilight_oak_button.json b/src/generated/resources/assets/twilightforest/models/item/twilight_oak_button.json new file mode 100644 index 0000000000..dde8b1ad4b --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/twilight_oak_button.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button_inventory", + "textures": { + "texture": "twilightforest:block/wood/planks_twilight_oak_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/twilight_oak_chest.json b/src/generated/resources/assets/twilightforest/models/item/twilight_oak_chest.json new file mode 100644 index 0000000000..4270085d32 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/twilight_oak_chest.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/chest", + "textures": { + "particle": "twilightforest:block/wood/planks_twilight_oak_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/twilight_oak_chest_boat.json b/src/generated/resources/assets/twilightforest/models/item/twilight_oak_chest_boat.json new file mode 100644 index 0000000000..72f10516cd --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/twilight_oak_chest_boat.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/twilight_oak_chest_boat" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/twilight_oak_door.json b/src/generated/resources/assets/twilightforest/models/item/twilight_oak_door.json new file mode 100644 index 0000000000..f7a75c0233 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/twilight_oak_door.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/twilight_oak_door" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/twilight_oak_fence.json b/src/generated/resources/assets/twilightforest/models/item/twilight_oak_fence.json new file mode 100644 index 0000000000..460b8a4fe0 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/twilight_oak_fence.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_inventory", + "textures": { + "texture": "twilightforest:block/wood/planks_twilight_oak_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/twilight_oak_fence_gate.json b/src/generated/resources/assets/twilightforest/models/item/twilight_oak_fence_gate.json new file mode 100644 index 0000000000..9aa34c2fe1 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/twilight_oak_fence_gate.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/wood/fence_gate/twilight_oak/twilight_oak_fence_gate" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/twilight_oak_leaves.json b/src/generated/resources/assets/twilightforest/models/item/twilight_oak_leaves.json new file mode 100644 index 0000000000..72646483d6 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/twilight_oak_leaves.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/twilight_oak_leaves" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/twilight_oak_log.json b/src/generated/resources/assets/twilightforest/models/item/twilight_oak_log.json new file mode 100644 index 0000000000..14edac0d37 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/twilight_oak_log.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/twilight_oak_log" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/twilight_oak_planks.json b/src/generated/resources/assets/twilightforest/models/item/twilight_oak_planks.json new file mode 100644 index 0000000000..a7668c53eb --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/twilight_oak_planks.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/wood/planks/twilight_oak/twilight_oak_planks" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/twilight_oak_pressure_plate.json b/src/generated/resources/assets/twilightforest/models/item/twilight_oak_pressure_plate.json new file mode 100644 index 0000000000..356f17b2c2 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/twilight_oak_pressure_plate.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/wood/pressure_plate/twilight_oak/twilight_oak_pressure_plate" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/twilight_oak_sapling.json b/src/generated/resources/assets/twilightforest/models/item/twilight_oak_sapling.json new file mode 100644 index 0000000000..bbb071583d --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/twilight_oak_sapling.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:block/twilight_oak_sapling" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/twilight_oak_sign.json b/src/generated/resources/assets/twilightforest/models/item/twilight_oak_sign.json new file mode 100644 index 0000000000..a1a523f726 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/twilight_oak_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/twilight_oak_sign" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/twilight_oak_slab.json b/src/generated/resources/assets/twilightforest/models/item/twilight_oak_slab.json new file mode 100644 index 0000000000..29adc519f3 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/twilight_oak_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/wood/slab/twilight_oak/twilight_oak_slab" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/twilight_oak_stairs.json b/src/generated/resources/assets/twilightforest/models/item/twilight_oak_stairs.json new file mode 100644 index 0000000000..f9001303b8 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/twilight_oak_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/wood/stairs/twilight_oak/twilight_oak_stairs" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/twilight_oak_trapdoor.json b/src/generated/resources/assets/twilightforest/models/item/twilight_oak_trapdoor.json new file mode 100644 index 0000000000..da849e6ee3 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/twilight_oak_trapdoor.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/wood/trapdoor/twilight_oak/twilight_oak_trapdoor_bottom" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/twilight_oak_wood.json b/src/generated/resources/assets/twilightforest/models/item/twilight_oak_wood.json new file mode 100644 index 0000000000..69e796a5c0 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/twilight_oak_wood.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/twilight_oak_wood" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/twilight_portal_miniature_structure.json b/src/generated/resources/assets/twilightforest/models/item/twilight_portal_miniature_structure.json new file mode 100644 index 0000000000..361b7cad8a --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/twilight_portal_miniature_structure.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/miniature/portal" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/twilight_scepter.json b/src/generated/resources/assets/twilightforest/models/item/twilight_scepter.json new file mode 100644 index 0000000000..f072865113 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/twilight_scepter.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "twilightforest:item/twilight_scepter" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/twisted_stone.json b/src/generated/resources/assets/twilightforest/models/item/twisted_stone.json new file mode 100644 index 0000000000..41928dbcdc --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/twisted_stone.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/twisted_stone" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/twisted_stone_pillar.json b/src/generated/resources/assets/twilightforest/models/item/twisted_stone_pillar.json new file mode 100644 index 0000000000..b59c667c66 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/twisted_stone_pillar.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/pillar/pillar_inventory" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/uberous_soil.json b/src/generated/resources/assets/twilightforest/models/item/uberous_soil.json new file mode 100644 index 0000000000..770207fbdb --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/uberous_soil.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/uberous_soil" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/uncrafting_table.json b/src/generated/resources/assets/twilightforest/models/item/uncrafting_table.json new file mode 100644 index 0000000000..e56690a266 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/uncrafting_table.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/uncrafting_table" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/underbrick.json b/src/generated/resources/assets/twilightforest/models/item/underbrick.json new file mode 100644 index 0000000000..53b5c06d4c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/underbrick.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/underbrick" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/underbrick_floor.json b/src/generated/resources/assets/twilightforest/models/item/underbrick_floor.json new file mode 100644 index 0000000000..fda23fed21 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/underbrick_floor.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/underbrick_floor" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/unripe_trollber.json b/src/generated/resources/assets/twilightforest/models/item/unripe_trollber.json new file mode 100644 index 0000000000..3a58f48b1c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/unripe_trollber.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:block/unripe_trollber" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/unstable_ice_core_spawn_egg.json b/src/generated/resources/assets/twilightforest/models/item/unstable_ice_core_spawn_egg.json new file mode 100644 index 0000000000..d1aaa9d6ef --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/unstable_ice_core_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/ur_ghast_banner_pattern.json b/src/generated/resources/assets/twilightforest/models/item/ur_ghast_banner_pattern.json new file mode 100644 index 0000000000..dd801b92f0 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/ur_ghast_banner_pattern.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/tf_banner_pattern" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/ur_ghast_boss_spawner.json b/src/generated/resources/assets/twilightforest/models/item/ur_ghast_boss_spawner.json new file mode 100644 index 0000000000..f54a94f6b5 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/ur_ghast_boss_spawner.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/spawner" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/ur_ghast_spawn_egg.json b/src/generated/resources/assets/twilightforest/models/item/ur_ghast_spawn_egg.json new file mode 100644 index 0000000000..d1aaa9d6ef --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/ur_ghast_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/vangrove_banister.json b/src/generated/resources/assets/twilightforest/models/item/vangrove_banister.json new file mode 100644 index 0000000000..91fe271789 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/vangrove_banister.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:item/banister_item", + "textures": { + "texture": "minecraft:block/mangrove_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/vanishing_block.json b/src/generated/resources/assets/twilightforest/models/item/vanishing_block.json new file mode 100644 index 0000000000..2b948a91ce --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/vanishing_block.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/vanishing_block" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/violet_castle_door.json b/src/generated/resources/assets/twilightforest/models/item/violet_castle_door.json new file mode 100644 index 0000000000..caf027ae5f --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/violet_castle_door.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/violet_castle_door" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/violet_castle_rune_brick.json b/src/generated/resources/assets/twilightforest/models/item/violet_castle_rune_brick.json new file mode 100644 index 0000000000..4f73415787 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/violet_castle_rune_brick.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/castle_rune_inventory" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/violet_force_field.json b/src/generated/resources/assets/twilightforest/models/item/violet_force_field.json new file mode 100644 index 0000000000..457bcfcf18 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/violet_force_field.json @@ -0,0 +1,20 @@ +{ + "parent": "minecraft:item/generated", + "forge_data": { + "layers": { + "0": { + "block_light": 15, + "sky_light": 15 + } + } + }, + "loader": "forge:item_layers", + "render_types": { + "minecraft:translucent": [ + 0 + ] + }, + "textures": { + "layer0": "twilightforest:block/forcefield_white" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/warped_banister.json b/src/generated/resources/assets/twilightforest/models/item/warped_banister.json new file mode 100644 index 0000000000..c54ef808fa --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/warped_banister.json @@ -0,0 +1,6 @@ +{ + "parent": "twilightforest:item/banister_item", + "textures": { + "texture": "minecraft:block/warped_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/weathered_deadrock.json b/src/generated/resources/assets/twilightforest/models/item/weathered_deadrock.json new file mode 100644 index 0000000000..8a89b817e3 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/weathered_deadrock.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/weathered_deadrock" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/winter_wolf_spawn_egg.json b/src/generated/resources/assets/twilightforest/models/item/winter_wolf_spawn_egg.json new file mode 100644 index 0000000000..d1aaa9d6ef --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/winter_wolf_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/wispy_cloud.json b/src/generated/resources/assets/twilightforest/models/item/wispy_cloud.json new file mode 100644 index 0000000000..cdb1ec9371 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/wispy_cloud.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/wispy_cloud" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/wither_skeleton_skull_candle.json b/src/generated/resources/assets/twilightforest/models/item/wither_skeleton_skull_candle.json new file mode 100644 index 0000000000..23bec58c92 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/wither_skeleton_skull_candle.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:item/template_skull_candle" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/worn_castle_brick.json b/src/generated/resources/assets/twilightforest/models/item/worn_castle_brick.json new file mode 100644 index 0000000000..ad8c949b86 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/worn_castle_brick.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/worn_castle_brick" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/worn_castle_brick_stairs.json b/src/generated/resources/assets/twilightforest/models/item/worn_castle_brick_stairs.json new file mode 100644 index 0000000000..0fa4e53cdb --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/worn_castle_brick_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/worn_castle_brick_stairs" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/wraith_spawn_egg.json b/src/generated/resources/assets/twilightforest/models/item/wraith_spawn_egg.json new file mode 100644 index 0000000000..d1aaa9d6ef --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/wraith_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/yellow_castle_door.json b/src/generated/resources/assets/twilightforest/models/item/yellow_castle_door.json new file mode 100644 index 0000000000..2ca5e3fd10 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/yellow_castle_door.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/yellow_castle_door" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/yellow_castle_rune_brick.json b/src/generated/resources/assets/twilightforest/models/item/yellow_castle_rune_brick.json new file mode 100644 index 0000000000..4f73415787 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/yellow_castle_rune_brick.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:block/castle_rune_inventory" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/yeti_boots.json b/src/generated/resources/assets/twilightforest/models/item/yeti_boots.json new file mode 100644 index 0000000000..74be518d1c --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/yeti_boots.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/yeti_boots" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/yeti_chestplate.json b/src/generated/resources/assets/twilightforest/models/item/yeti_chestplate.json new file mode 100644 index 0000000000..6197784750 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/yeti_chestplate.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/yeti_chestplate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/yeti_helmet.json b/src/generated/resources/assets/twilightforest/models/item/yeti_helmet.json new file mode 100644 index 0000000000..a1b7a3c4e9 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/yeti_helmet.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/yeti_helmet" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/yeti_leggings.json b/src/generated/resources/assets/twilightforest/models/item/yeti_leggings.json new file mode 100644 index 0000000000..b78efdd8c6 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/yeti_leggings.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "twilightforest:item/yeti_leggings" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/yeti_spawn_egg.json b/src/generated/resources/assets/twilightforest/models/item/yeti_spawn_egg.json new file mode 100644 index 0000000000..d1aaa9d6ef --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/yeti_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/zombie_scepter.json b/src/generated/resources/assets/twilightforest/models/item/zombie_scepter.json new file mode 100644 index 0000000000..a9d32593d8 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/zombie_scepter.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "twilightforest:item/zombie_scepter" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/models/item/zombie_skull_candle.json b/src/generated/resources/assets/twilightforest/models/item/zombie_skull_candle.json new file mode 100644 index 0000000000..23bec58c92 --- /dev/null +++ b/src/generated/resources/assets/twilightforest/models/item/zombie_skull_candle.json @@ -0,0 +1,3 @@ +{ + "parent": "twilightforest:item/template_skull_candle" +} \ No newline at end of file diff --git a/src/generated/resources/assets/twilightforest/sounds.json b/src/generated/resources/assets/twilightforest/sounds.json new file mode 100644 index 0000000000..87179b97fc --- /dev/null +++ b/src/generated/resources/assets/twilightforest/sounds.json @@ -0,0 +1,2435 @@ +{ + "block.twilightforest.beanstalk.grow": { + "sounds": [ + "twilightforest:random/beanstalk_grow" + ], + "subtitle": "subtitles.twilightforest.block.beanstalk.grow" + }, + "block.twilightforest.boss_chest.appear": { + "sounds": [ + { + "type": "event", + "name": "entity.evoker.prepare_summon" + } + ], + "subtitle": "subtitles.twilightforest.block.boss_chest.appear" + }, + "block.twilightforest.bug.squish": { + "sounds": [ + { + "type": "event", + "name": "entity.slime.squish_small" + } + ], + "subtitle": "subtitles.twilightforest.block.bug.squish" + }, + "block.twilightforest.builder.create": { + "sounds": [ + { + "type": "event", + "name": "block.comparator.click" + } + ], + "subtitle": "subtitles.twilightforest.block.builder.create" + }, + "block.twilightforest.builder.off": { + "sounds": [ + { + "type": "event", + "name": "block.comparator.click" + } + ], + "subtitle": "subtitles.twilightforest.block.builder.off" + }, + "block.twilightforest.builder.on": { + "sounds": [ + { + "type": "event", + "name": "block.comparator.click" + } + ], + "subtitle": "subtitles.twilightforest.block.builder.on" + }, + "block.twilightforest.builder.replace": { + "sounds": [ + { + "type": "event", + "name": "entity.item.pickup" + } + ], + "subtitle": "subtitles.twilightforest.block.builder.replace" + }, + "block.twilightforest.casket.close": { + "sounds": [ + "twilightforest:random/casket/close" + ], + "subtitle": "subtitles.twilightforest.block.casket.close" + }, + "block.twilightforest.casket.locked": { + "sounds": [ + { + "type": "event", + "name": "block.chest.locked" + } + ], + "subtitle": "subtitles.twilightforest.block.casket.locked" + }, + "block.twilightforest.casket.open": { + "sounds": [ + "twilightforest:random/casket/open" + ], + "subtitle": "subtitles.twilightforest.block.casket.open" + }, + "block.twilightforest.casket.repair": { + "sounds": [ + "twilightforest:random/casket/repair" + ], + "subtitle": "subtitles.twilightforest.block.casket.repair" + }, + "block.twilightforest.cicada": { + "sounds": [ + "twilightforest:mob/cicada1", + "twilightforest:mob/cicada2" + ], + "subtitle": "subtitles.twilightforest.block.cicada" + }, + "block.twilightforest.core.time": { + "sounds": [ + { + "type": "event", + "name": "block.comparator.click" + } + ], + "subtitle": "subtitles.twilightforest.block.core.time" + }, + "block.twilightforest.core.transformation": { + "sounds": [ + { + "type": "event", + "name": "block.note_block.harp" + } + ], + "subtitle": "subtitles.twilightforest.block.core.transformation" + }, + "block.twilightforest.door.activate": { + "sounds": [ + { + "type": "event", + "name": "block.comparator.click" + } + ], + "subtitle": "subtitles.twilightforest.block.door.activate" + }, + "block.twilightforest.door.reappear": { + "sounds": [ + { + "type": "event", + "name": "block.fire.extinguish" + } + ], + "subtitle": "subtitles.twilightforest.block.door.reappear" + }, + "block.twilightforest.door.vanish": { + "sounds": [ + { + "type": "event", + "name": "block.fire.extinguish" + } + ], + "subtitle": "subtitles.twilightforest.block.door.vanish" + }, + "block.twilightforest.generic.annihilation": { + "sounds": [ + { + "type": "event", + "name": "block.fire.extinguish" + } + ], + "subtitle": "subtitles.twilightforest.block.generic.annihilation" + }, + "block.twilightforest.ghast_trap.ambient": { + "sounds": [ + { + "type": "event", + "name": "block.note_block.harp" + } + ], + "subtitle": "subtitles.twilightforest.block.ghast_trap.ambient" + }, + "block.twilightforest.ghast_trap.on": { + "sounds": [ + "twilightforest:mob/ur_ghast/trap_on1", + "twilightforest:mob/ur_ghast/trap_on2", + "twilightforest:mob/ur_ghast/trap_on3", + "twilightforest:mob/ur_ghast/trap_on4", + "twilightforest:mob/ur_ghast/trap_on5" + ], + "subtitle": "subtitles.twilightforest.block.ghast_trap.on" + }, + "block.twilightforest.ghast_trap.spindown": { + "sounds": [ + "twilightforest:mob/ur_ghast/trap_spin_down" + ], + "subtitle": "subtitles.twilightforest.block.ghast_trap.spindown" + }, + "block.twilightforest.ghast_trap.warmup": { + "sounds": [ + "twilightforest:mob/ur_ghast/trap_warmup" + ], + "subtitle": "subtitles.twilightforest.block.ghast_trap.warmup" + }, + "block.twilightforest.jet.active": { + "sounds": [ + { + "type": "event", + "name": "entity.ghast.shoot" + } + ], + "subtitle": "subtitles.twilightforest.block.jet.active" + }, + "block.twilightforest.jet.pop": { + "sounds": [ + { + "type": "event", + "name": "block.lava.pop" + } + ], + "subtitle": "subtitles.twilightforest.block.jet.pop" + }, + "block.twilightforest.jet.start": { + "sounds": [ + { + "type": "event", + "name": "block.comparator.click" + } + ], + "subtitle": "subtitles.twilightforest.block.jet.start" + }, + "block.twilightforest.portal.whoosh": { + "sounds": [ + { + "type": "event", + "name": "block.portal.ambient" + } + ], + "subtitle": "subtitles.twilightforest.block.portal.whoosh" + }, + "block.twilightforest.reactor.ambient": { + "sounds": [ + { + "type": "event", + "name": "block.portal.ambient" + } + ], + "subtitle": "subtitles.twilightforest.block.reactor.ambient" + }, + "block.twilightforest.reappearing_block.reappear": { + "sounds": [ + { + "type": "event", + "name": "entity.item.pickup" + } + ], + "subtitle": "subtitles.twilightforest.block.reappearing_block.reappear" + }, + "block.twilightforest.reappearing_block.vanish": { + "sounds": [ + { + "type": "event", + "name": "entity.item.pickup" + } + ], + "subtitle": "subtitles.twilightforest.block.reappearing_block.vanish" + }, + "block.twilightforest.slider.move": { + "sounds": [ + "twilightforest:random/creakgo2" + ], + "subtitle": "subtitles.twilightforest.block.slider.move" + }, + "block.twilightforest.smoker.start": { + "sounds": [ + { + "type": "event", + "name": "block.comparator.click" + } + ], + "subtitle": "subtitles.twilightforest.block.smoker.start" + }, + "block.twilightforest.torchberry.harvest": { + "sounds": [ + { + "type": "event", + "name": "block.sweet_berry_bush.pick_berries" + } + ], + "subtitle": "subtitles.twilightforest.block.torchberry.harvest" + }, + "block.twilightforest.trophy_pedestal.activate": { + "sounds": [ + { + "type": "event", + "name": "entity.zombie.infect" + } + ], + "subtitle": "subtitles.twilightforest.block.trophy_pedestal.activate" + }, + "block.twilightforest.uncrafting_table.activate": { + "sounds": [ + { + "type": "event", + "name": "block.end_portal.spawn" + } + ] + }, + "block.twilightforest.vanish.locked": { + "sounds": [ + { + "type": "event", + "name": "block.comparator.click" + } + ], + "subtitle": "subtitles.twilightforest.block.vanish.locked" + }, + "block.twilightforest.vanish.unlock": { + "sounds": [ + { + "type": "event", + "name": "block.comparator.click" + } + ], + "subtitle": "subtitles.twilightforest.block.vanish.unlock" + }, + "block.twilightforest.vanish.vanish": { + "sounds": [ + { + "type": "event", + "name": "entity.item.pickup" + } + ], + "subtitle": "subtitles.twilightforest.block.vanish.vanish" + }, + "entity.twilightforest.alpha_yeti.alert": { + "sounds": [ + "twilightforest:mob/alpha_yeti/alert" + ], + "subtitle": "subtitles.twilightforest.entity.alpha_yeti.alert" + }, + "entity.twilightforest.alpha_yeti.death": { + "sounds": [ + "twilightforest:mob/alpha_yeti/death" + ], + "subtitle": "subtitles.twilightforest.entity.alpha_yeti.death" + }, + "entity.twilightforest.alpha_yeti.grab": { + "sounds": [ + "twilightforest:mob/alpha_yeti/grab" + ], + "subtitle": "subtitles.twilightforest.entity.alpha_yeti.grab" + }, + "entity.twilightforest.alpha_yeti.growl": { + "sounds": [ + "twilightforest:mob/alpha_yeti/growl1", + "twilightforest:mob/alpha_yeti/growl2", + "twilightforest:mob/alpha_yeti/growl3" + ], + "subtitle": "subtitles.twilightforest.entity.alpha_yeti.growl" + }, + "entity.twilightforest.alpha_yeti.hurt": { + "sounds": [ + "twilightforest:mob/alpha_yeti/hurt1", + "twilightforest:mob/alpha_yeti/hurt2", + "twilightforest:mob/alpha_yeti/hurt3" + ], + "subtitle": "subtitles.twilightforest.entity.alpha_yeti.hurt" + }, + "entity.twilightforest.alpha_yeti.ice": { + "sounds": [ + { + "type": "event", + "name": "entity.arrow.shoot" + } + ], + "subtitle": "subtitles.twilightforest.entity.alpha_yeti.ice" + }, + "entity.twilightforest.alpha_yeti.pant": { + "sounds": [ + "twilightforest:mob/alpha_yeti/pant1", + "twilightforest:mob/alpha_yeti/pant2", + "twilightforest:mob/alpha_yeti/pant3" + ], + "subtitle": "subtitles.twilightforest.entity.alpha_yeti.pant" + }, + "entity.twilightforest.alpha_yeti.roar": { + "sounds": [ + "twilightforest:mob/alpha_yeti/roar" + ], + "subtitle": "subtitles.twilightforest.entity.alpha_yeti.roar" + }, + "entity.twilightforest.alpha_yeti.throw": { + "sounds": [ + "twilightforest:mob/alpha_yeti/throw" + ], + "subtitle": "subtitles.twilightforest.entity.alpha_yeti.throw" + }, + "entity.twilightforest.bighorn_sheep.ambient": { + "sounds": [ + { + "type": "event", + "name": "entity.sheep.ambient" + } + ], + "subtitle": "subtitles.twilightforest.entity.bighorn_sheep.ambient" + }, + "entity.twilightforest.bighorn_sheep.death": { + "sounds": [ + { + "type": "event", + "name": "entity.sheep.death" + } + ], + "subtitle": "subtitles.twilightforest.entity.bighorn_sheep.death" + }, + "entity.twilightforest.bighorn_sheep.hurt": { + "sounds": [ + { + "type": "event", + "name": "entity.sheep.hurt" + } + ], + "subtitle": "subtitles.twilightforest.entity.bighorn_sheep.hurt" + }, + "entity.twilightforest.bighorn_sheep.step": { + "sounds": [ + { + "type": "event", + "name": "entity.sheep.step" + } + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.twilightforest.blockchain_goblin.ambient": { + "sounds": [ + "twilightforest:mob/redcap/redcap1", + "twilightforest:mob/redcap/redcap2", + "twilightforest:mob/redcap/redcap3", + "twilightforest:mob/redcap/redcap4", + "twilightforest:mob/redcap/redcap5", + "twilightforest:mob/redcap/redcap6" + ], + "subtitle": "subtitles.twilightforest.entity.blockchain_goblin.ambient" + }, + "entity.twilightforest.blockchain_goblin.death": { + "sounds": [ + "twilightforest:mob/redcap/die1", + "twilightforest:mob/redcap/die2", + "twilightforest:mob/redcap/die3" + ], + "subtitle": "subtitles.twilightforest.entity.blockchain_goblin.death" + }, + "entity.twilightforest.blockchain_goblin.hurt": { + "sounds": [ + "twilightforest:mob/redcap/hurt1", + "twilightforest:mob/redcap/hurt2", + "twilightforest:mob/redcap/hurt3", + "twilightforest:mob/redcap/hurt4" + ], + "subtitle": "subtitles.twilightforest.entity.blockchain_goblin.hurt" + }, + "entity.twilightforest.boar.ambient": { + "sounds": [ + { + "type": "event", + "name": "entity.pig.ambient" + } + ], + "subtitle": "subtitles.twilightforest.entity.boar.ambient" + }, + "entity.twilightforest.boar.death": { + "sounds": [ + { + "type": "event", + "name": "entity.pig.death" + } + ], + "subtitle": "subtitles.twilightforest.entity.boar.death" + }, + "entity.twilightforest.boar.hurt": { + "sounds": [ + { + "type": "event", + "name": "entity.pig.hurt" + } + ], + "subtitle": "subtitles.twilightforest.entity.boar.hurt" + }, + "entity.twilightforest.boar.step": { + "sounds": [ + { + "type": "event", + "name": "entity.pig.step" + } + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.twilightforest.carminite_broodling.ambient": { + "sounds": [ + { + "type": "event", + "name": "entity.spider.ambient" + } + ], + "subtitle": "subtitles.twilightforest.entity.carminite_broodling.ambient" + }, + "entity.twilightforest.carminite_broodling.death": { + "sounds": [ + { + "type": "event", + "name": "entity.spider.death" + } + ], + "subtitle": "subtitles.twilightforest.entity.carminite_broodling.death" + }, + "entity.twilightforest.carminite_broodling.hurt": { + "sounds": [ + { + "type": "event", + "name": "entity.spider.hurt" + } + ], + "subtitle": "subtitles.twilightforest.entity.carminite_broodling.hurt" + }, + "entity.twilightforest.carminite_broodling.step": { + "sounds": [ + { + "type": "event", + "name": "entity.spider.step" + } + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.twilightforest.carminite_ghastguard.ambient": { + "sounds": [ + { + "type": "event", + "name": "entity.ghast.ambient" + } + ], + "subtitle": "subtitles.twilightforest.entity.carminite_ghastguard.ambient" + }, + "entity.twilightforest.carminite_ghastguard.death": { + "sounds": [ + { + "type": "event", + "name": "entity.ghast.death" + } + ], + "subtitle": "subtitles.twilightforest.entity.carminite_ghastguard.death" + }, + "entity.twilightforest.carminite_ghastguard.hurt": { + "sounds": [ + { + "type": "event", + "name": "entity.ghast.hurt" + } + ], + "subtitle": "subtitles.twilightforest.entity.carminite_ghastguard.hurt" + }, + "entity.twilightforest.carminite_ghastguard.shoot": { + "sounds": [ + { + "type": "event", + "name": "entity.ghast.shoot" + } + ], + "subtitle": "subtitles.twilightforest.entity.carminite_ghastguard.shoot" + }, + "entity.twilightforest.carminite_ghastguard.warn": { + "sounds": [ + { + "type": "event", + "name": "entity.ghast.warn" + } + ], + "subtitle": "subtitles.twilightforest.entity.carminite_ghastguard.shoot" + }, + "entity.twilightforest.carminite_ghastling.ambient": { + "sounds": [ + { + "type": "event", + "name": "entity.ghast.ambient" + } + ], + "subtitle": "subtitles.twilightforest.entity.carminite_ghastling.ambient" + }, + "entity.twilightforest.carminite_ghastling.death": { + "sounds": [ + { + "type": "event", + "name": "entity.ghast.death" + } + ], + "subtitle": "subtitles.twilightforest.entity.carminite_ghastling.death" + }, + "entity.twilightforest.carminite_ghastling.hurt": { + "sounds": [ + { + "type": "event", + "name": "entity.ghast.hurt" + } + ], + "subtitle": "subtitles.twilightforest.entity.carminite_ghastling.hurt" + }, + "entity.twilightforest.carminite_ghastling.shoot": { + "sounds": [ + { + "type": "event", + "name": "entity.ghast.shoot" + } + ], + "subtitle": "subtitles.twilightforest.entity.carminite_ghastling.shoot" + }, + "entity.twilightforest.carminite_ghastling.warn": { + "sounds": [ + { + "type": "event", + "name": "entity.ghast.warn" + } + ], + "subtitle": "subtitles.twilightforest.entity.carminite_ghastling.shoot" + }, + "entity.twilightforest.carminite_golem.attack": { + "sounds": [ + { + "type": "event", + "name": "entity.iron_golem.attack" + } + ], + "subtitle": "subtitles.twilightforest.entity.carminite_golem.attack" + }, + "entity.twilightforest.carminite_golem.death": { + "sounds": [ + { + "type": "event", + "name": "entity.iron_golem.death" + } + ], + "subtitle": "subtitles.twilightforest.entity.carminite_golem.death" + }, + "entity.twilightforest.carminite_golem.hurt": { + "sounds": [ + { + "type": "event", + "name": "entity.iron_golem.hurt" + } + ], + "subtitle": "subtitles.twilightforest.entity.carminite_golem.hurt" + }, + "entity.twilightforest.carminite_golem.step": { + "sounds": [ + { + "type": "event", + "name": "entity.iron_golem.step" + } + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.twilightforest.death_tome.ambient": { + "sounds": [ + "twilightforest:mob/tome/idle1", + "twilightforest:mob/tome/idle2" + ], + "subtitle": "subtitles.twilightforest.entity.death_tome.ambient" + }, + "entity.twilightforest.death_tome.death": { + "sounds": [ + "twilightforest:mob/tome/death" + ], + "subtitle": "subtitles.twilightforest.entity.death_tome.death" + }, + "entity.twilightforest.death_tome.hurt": { + "sounds": [ + "twilightforest:mob/tome/hurt1", + "twilightforest:mob/tome/hurt2", + "twilightforest:mob/tome/hurt3" + ], + "subtitle": "subtitles.twilightforest.entity.death_tome.hurt" + }, + "entity.twilightforest.deer.ambient": { + "sounds": [ + "twilightforest:mob/deer/idle1", + "twilightforest:mob/deer/idle2", + "twilightforest:mob/deer/idle3" + ], + "subtitle": "subtitles.twilightforest.entity.deer.ambient" + }, + "entity.twilightforest.deer.death": { + "sounds": [ + "twilightforest:mob/deer/death" + ], + "subtitle": "subtitles.twilightforest.entity.deer.death" + }, + "entity.twilightforest.deer.hurt": { + "sounds": [ + "twilightforest:mob/deer/hurt1", + "twilightforest:mob/deer/hurt2" + ], + "subtitle": "subtitles.twilightforest.entity.deer.hurt" + }, + "entity.twilightforest.dwarf_rabbit.ambient": { + "sounds": [ + { + "type": "event", + "name": "entity.rabbit.ambient" + } + ], + "subtitle": "subtitles.twilightforest.entity.dwarf_rabbit.ambient" + }, + "entity.twilightforest.dwarf_rabbit.death": { + "sounds": [ + { + "type": "event", + "name": "entity.rabbit.death" + } + ], + "subtitle": "subtitles.twilightforest.entity.dwarf_rabbit.death" + }, + "entity.twilightforest.dwarf_rabbit.hurt": { + "sounds": [ + { + "type": "event", + "name": "entity.rabbit.hurt" + } + ], + "subtitle": "subtitles.twilightforest.entity.dwarf_rabbit.hurt" + }, + "entity.twilightforest.fire_beetle.death": { + "sounds": [ + { + "type": "event", + "name": "entity.spider.death" + } + ], + "subtitle": "subtitles.twilightforest.entity.fire_beetle.death" + }, + "entity.twilightforest.fire_beetle.hurt": { + "sounds": [ + { + "type": "event", + "name": "entity.spider.hurt" + } + ], + "subtitle": "subtitles.twilightforest.entity.fire_beetle.hurt" + }, + "entity.twilightforest.fire_beetle.shoot": { + "sounds": [ + { + "type": "event", + "name": "entity.ghast.shoot" + } + ], + "subtitle": "subtitles.twilightforest.entity.fire_beetle.shoot" + }, + "entity.twilightforest.fire_beetle.step": { + "sounds": [ + { + "type": "event", + "name": "entity.spider.step" + } + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.twilightforest.goblin_knight.ambient": { + "sounds": [ + "twilightforest:mob/redcap/redcap1", + "twilightforest:mob/redcap/redcap2", + "twilightforest:mob/redcap/redcap3", + "twilightforest:mob/redcap/redcap4", + "twilightforest:mob/redcap/redcap5", + "twilightforest:mob/redcap/redcap6" + ], + "subtitle": "subtitles.twilightforest.entity.goblin_knight.ambient" + }, + "entity.twilightforest.goblin_knight.death": { + "sounds": [ + "twilightforest:mob/redcap/die1", + "twilightforest:mob/redcap/die2", + "twilightforest:mob/redcap/die3" + ], + "subtitle": "subtitles.twilightforest.entity.goblin_knight.death" + }, + "entity.twilightforest.goblin_knight.hurt": { + "sounds": [ + "twilightforest:mob/redcap/hurt1", + "twilightforest:mob/redcap/hurt2", + "twilightforest:mob/redcap/hurt3", + "twilightforest:mob/redcap/hurt4" + ], + "subtitle": "subtitles.twilightforest.entity.goblin_knight.hurt" + }, + "entity.twilightforest.goblin_knight.muffled.ambient": { + "sounds": [ + "twilightforest:mob/redcap/muffled/redcap1", + "twilightforest:mob/redcap/muffled/redcap2", + "twilightforest:mob/redcap/muffled/redcap3", + "twilightforest:mob/redcap/muffled/redcap4", + "twilightforest:mob/redcap/muffled/redcap5", + "twilightforest:mob/redcap/muffled/redcap6" + ], + "subtitle": "subtitles.twilightforest.entity.goblin_knight.muffled.ambient" + }, + "entity.twilightforest.goblin_knight.muffled.death": { + "sounds": [ + "twilightforest:mob/redcap/muffled/die1", + "twilightforest:mob/redcap/muffled/die2", + "twilightforest:mob/redcap/muffled/die3" + ], + "subtitle": "subtitles.twilightforest.entity.goblin_knight.muffled.death" + }, + "entity.twilightforest.goblin_knight.muffled.hurt": { + "sounds": [ + "twilightforest:mob/redcap/muffled/hurt1", + "twilightforest:mob/redcap/muffled/hurt2", + "twilightforest:mob/redcap/muffled/hurt3", + "twilightforest:mob/redcap/muffled/hurt4" + ], + "subtitle": "subtitles.twilightforest.entity.goblin_knight.muffled.hurt" + }, + "entity.twilightforest.hedge_spider.ambient": { + "sounds": [ + { + "type": "event", + "name": "entity.spider.ambient" + } + ], + "subtitle": "subtitles.twilightforest.entity.hedge_spider.ambient" + }, + "entity.twilightforest.hedge_spider.death": { + "sounds": [ + { + "type": "event", + "name": "entity.spider.death" + } + ], + "subtitle": "subtitles.twilightforest.entity.hedge_spider.death" + }, + "entity.twilightforest.hedge_spider.hurt": { + "sounds": [ + { + "type": "event", + "name": "entity.spider.hurt" + } + ], + "subtitle": "subtitles.twilightforest.entity.hedge_spider.hurt" + }, + "entity.twilightforest.hedge_spider.step": { + "sounds": [ + { + "type": "event", + "name": "entity.spider.step" + } + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.twilightforest.helmet_crab.death": { + "sounds": [ + { + "type": "event", + "name": "entity.spider.death" + } + ], + "subtitle": "subtitles.twilightforest.entity.helmet_crab.death" + }, + "entity.twilightforest.helmet_crab.hurt": { + "sounds": [ + { + "type": "event", + "name": "entity.spider.hurt" + } + ], + "subtitle": "subtitles.twilightforest.entity.helmet_crab.hurt" + }, + "entity.twilightforest.helmet_crab.step": { + "sounds": [ + { + "type": "event", + "name": "entity.spider.step" + } + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.twilightforest.hostile_wolf.ambient": { + "sounds": [ + "twilightforest:mob/mist_wolf/idle1", + "twilightforest:mob/mist_wolf/idle2", + "twilightforest:mob/mist_wolf/idle3" + ], + "subtitle": "subtitles.twilightforest.entity.hostile_wolf.ambient" + }, + "entity.twilightforest.hostile_wolf.death": { + "sounds": [ + { + "type": "event", + "name": "entity.wolf.death" + } + ], + "subtitle": "subtitles.twilightforest.entity.hostile_wolf.death" + }, + "entity.twilightforest.hostile_wolf.hurt": { + "sounds": [ + "twilightforest:mob/mist_wolf/hurt1", + "twilightforest:mob/mist_wolf/hurt2" + ], + "subtitle": "subtitles.twilightforest.entity.hostile_wolf.hurt" + }, + "entity.twilightforest.hostile_wolf.target": { + "sounds": [ + "twilightforest:mob/mist_wolf/target" + ], + "subtitle": "subtitles.twilightforest.entity.hostile_wolf.target" + }, + "entity.twilightforest.hydra.death": { + "sounds": [ + "twilightforest:mob/hydra/death" + ], + "subtitle": "subtitles.twilightforest.entity.hydra.death" + }, + "entity.twilightforest.hydra.growl": { + "sounds": [ + "twilightforest:mob/hydra/growl1", + "twilightforest:mob/hydra/growl2", + "twilightforest:mob/hydra/growl3" + ], + "subtitle": "subtitles.twilightforest.entity.hydra.growl" + }, + "entity.twilightforest.hydra.hurt": { + "sounds": [ + "twilightforest:mob/hydra/hurt1", + "twilightforest:mob/hydra/hurt2", + "twilightforest:mob/hydra/hurt3", + "twilightforest:mob/hydra/hurt4" + ], + "subtitle": "subtitles.twilightforest.entity.hydra.hurt" + }, + "entity.twilightforest.hydra.roar": { + "sounds": [ + "twilightforest:mob/hydra/roar1", + "twilightforest:mob/hydra/roar2" + ], + "subtitle": "subtitles.twilightforest.entity.hydra.roar" + }, + "entity.twilightforest.hydra.shoot": { + "sounds": [ + { + "type": "event", + "name": "entity.ghast.shoot" + } + ], + "subtitle": "subtitles.twilightforest.entity.hydra.shoot" + }, + "entity.twilightforest.hydra.shoot_fire": { + "sounds": [ + { + "type": "event", + "name": "entity.ghast.shoot" + } + ], + "subtitle": "subtitles.twilightforest.entity.hydra.shoot_fire" + }, + "entity.twilightforest.hydra.warn": { + "sounds": [ + "twilightforest:mob/hydra/warn" + ], + "subtitle": "subtitles.twilightforest.entity.hydra.warn" + }, + "entity.twilightforest.ice.ambient": { + "sounds": [ + "twilightforest:mob/ice/crackle1", + "twilightforest:mob/ice/crackle2" + ], + "subtitle": "subtitles.twilightforest.entity.ice.ambient" + }, + "entity.twilightforest.ice.death": { + "sounds": [ + "twilightforest:mob/ice/death1", + "twilightforest:mob/ice/death2" + ], + "subtitle": "subtitles.twilightforest.entity.ice.death" + }, + "entity.twilightforest.ice.hurt": { + "sounds": [ + "twilightforest:mob/ice/hurt1", + "twilightforest:mob/ice/hurt2" + ], + "subtitle": "subtitles.twilightforest.entity.ice.hurt" + }, + "entity.twilightforest.ice.shoot": { + "sounds": [ + { + "type": "event", + "name": "entity.snowball.throw" + } + ], + "subtitle": "subtitles.twilightforest.entity.ice.shoot" + }, + "entity.twilightforest.king_spider.ambient": { + "sounds": [ + { + "type": "event", + "name": "entity.spider.ambient" + } + ], + "subtitle": "subtitles.twilightforest.entity.king_spider.ambient" + }, + "entity.twilightforest.king_spider.death": { + "sounds": [ + { + "type": "event", + "name": "entity.spider.death" + } + ], + "subtitle": "subtitles.twilightforest.entity.king_spider.death" + }, + "entity.twilightforest.king_spider.hurt": { + "sounds": [ + { + "type": "event", + "name": "entity.spider.hurt" + } + ], + "subtitle": "subtitles.twilightforest.entity.king_spider.hurt" + }, + "entity.twilightforest.king_spider.step": { + "sounds": [ + { + "type": "event", + "name": "entity.spider.step" + } + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.twilightforest.knight_phantom.ambient": { + "sounds": [ + "twilightforest:mob/wraith/wraith1", + "twilightforest:mob/wraith/wraith2", + "twilightforest:mob/wraith/wraith3", + "twilightforest:mob/wraith/wraith4" + ], + "subtitle": "subtitles.twilightforest.entity.knight_phantom.ambient" + }, + "entity.twilightforest.knight_phantom.axe": { + "sounds": [ + { + "type": "event", + "name": "entity.arrow.shoot" + } + ], + "subtitle": "subtitles.twilightforest.entity.knight_phantom.axe" + }, + "entity.twilightforest.knight_phantom.death": { + "sounds": [ + "twilightforest:mob/wraith/wraith1", + "twilightforest:mob/wraith/wraith2", + "twilightforest:mob/wraith/wraith3", + "twilightforest:mob/wraith/wraith4" + ], + "subtitle": "subtitles.twilightforest.entity.knight_phantom.death" + }, + "entity.twilightforest.knight_phantom.hurt": { + "sounds": [ + "twilightforest:mob/wraith/wraith1", + "twilightforest:mob/wraith/wraith2", + "twilightforest:mob/wraith/wraith3", + "twilightforest:mob/wraith/wraith4" + ], + "subtitle": "subtitles.twilightforest.entity.knight_phantom.hurt" + }, + "entity.twilightforest.knight_phantom.pickaxe": { + "sounds": [ + { + "type": "event", + "name": "entity.arrow.shoot" + } + ], + "subtitle": "subtitles.twilightforest.entity.knight_phantom.pickaxe" + }, + "entity.twilightforest.kobold.ambient": { + "sounds": [ + "twilightforest:mob/kobold/ambient1", + "twilightforest:mob/kobold/ambient2", + "twilightforest:mob/kobold/ambient3", + "twilightforest:mob/kobold/ambient4", + "twilightforest:mob/kobold/ambient5", + "twilightforest:mob/kobold/ambient6" + ], + "subtitle": "subtitles.twilightforest.entity.kobold.ambient" + }, + "entity.twilightforest.kobold.death": { + "sounds": [ + "twilightforest:mob/kobold/death1", + "twilightforest:mob/kobold/death2", + "twilightforest:mob/kobold/death3" + ], + "subtitle": "subtitles.twilightforest.entity.kobold.death" + }, + "entity.twilightforest.kobold.hurt": { + "sounds": [ + "twilightforest:mob/kobold/hurt1", + "twilightforest:mob/kobold/hurt2", + "twilightforest:mob/kobold/hurt3" + ], + "subtitle": "subtitles.twilightforest.entity.kobold.hurt" + }, + "entity.twilightforest.kobold.munch": { + "sounds": [ + { + "type": "event", + "name": "entity.generic.eat" + } + ], + "subtitle": "subtitles.twilightforest.entity.kobold.munch" + }, + "entity.twilightforest.lich.ambient": { + "sounds": [ + { + "type": "event", + "name": "entity.blaze.ambient" + } + ], + "subtitle": "subtitles.twilightforest.entity.lich.ambient" + }, + "entity.twilightforest.lich.death": { + "sounds": [ + { + "type": "event", + "name": "entity.blaze.death" + } + ], + "subtitle": "subtitles.twilightforest.entity.lich.death" + }, + "entity.twilightforest.lich.hurt": { + "sounds": [ + { + "type": "event", + "name": "entity.blaze.hurt" + } + ], + "subtitle": "subtitles.twilightforest.entity.lich.hurt" + }, + "entity.twilightforest.lich.pop_mob": { + "sounds": [ + { + "type": "event", + "name": "entity.chicken.egg" + } + ], + "subtitle": "subtitles.twilightforest.entity.lich.pop_mob" + }, + "entity.twilightforest.lich.shoot": { + "sounds": [ + { + "type": "event", + "name": "entity.ghast.shoot" + } + ], + "subtitle": "subtitles.twilightforest.entity.lich.shoot" + }, + "entity.twilightforest.lich.teleport": { + "sounds": [ + { + "type": "event", + "name": "item.chorus_fruit.teleport" + } + ], + "subtitle": "subtitles.twilightforest.entity.lich.teleport" + }, + "entity.twilightforest.lich_clone.hurt": { + "sounds": [ + { + "type": "event", + "name": "block.fire.extinguish" + } + ], + "subtitle": "subtitles.twilightforest.entity.lich_clone.hurt" + }, + "entity.twilightforest.loyal_zombie.ambient": { + "sounds": [ + { + "type": "event", + "name": "entity.zombie.ambient" + } + ], + "subtitle": "subtitles.twilightforest.entity.loyal_zombie.ambient" + }, + "entity.twilightforest.loyal_zombie.death": { + "sounds": [ + { + "type": "event", + "name": "entity.zombie.death" + } + ], + "subtitle": "subtitles.twilightforest.entity.loyal_zombie.death" + }, + "entity.twilightforest.loyal_zombie.hurt": { + "sounds": [ + { + "type": "event", + "name": "entity.zombie.hurt" + } + ], + "subtitle": "subtitles.twilightforest.entity.loyal_zombie.hurt" + }, + "entity.twilightforest.loyal_zombie.step": { + "sounds": [ + { + "type": "event", + "name": "entity.zombie.step" + } + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.twilightforest.loyal_zombie.summon": { + "sounds": [ + { + "type": "event", + "name": "entity.item.pickup" + } + ], + "subtitle": "subtitles.twilightforest.entity.loyal_zombie.summon" + }, + "entity.twilightforest.maze_slime.death": { + "sounds": [ + { + "type": "event", + "name": "entity.slime.death" + } + ], + "subtitle": "subtitles.twilightforest.entity.maze_slime.death" + }, + "entity.twilightforest.maze_slime.hurt": { + "sounds": [ + { + "type": "event", + "name": "entity.slime.hurt" + } + ], + "subtitle": "subtitles.twilightforest.entity.maze_slime.hurt" + }, + "entity.twilightforest.maze_slime.squish": { + "sounds": [ + { + "type": "event", + "name": "entity.slime.squish" + } + ], + "subtitle": "subtitles.twilightforest.entity.maze_slime.squish" + }, + "entity.twilightforest.maze_slime_small.death": { + "sounds": [ + { + "type": "event", + "name": "entity.slime.death_small" + } + ], + "subtitle": "subtitles.twilightforest.entity.maze_slime.death" + }, + "entity.twilightforest.maze_slime_small.hurt": { + "sounds": [ + { + "type": "event", + "name": "entity.slime.hurt_small" + } + ], + "subtitle": "subtitles.twilightforest.entity.maze_slime.hurt" + }, + "entity.twilightforest.maze_slime_small.squish": { + "sounds": [ + { + "type": "event", + "name": "entity.slime.squish_small" + } + ], + "subtitle": "subtitles.twilightforest.entity.maze_slime.squish" + }, + "entity.twilightforest.minion.ambient": { + "sounds": [ + { + "type": "event", + "name": "entity.zombie.ambient" + } + ], + "subtitle": "subtitles.twilightforest.entity.minion.ambient" + }, + "entity.twilightforest.minion.death": { + "sounds": [ + { + "type": "event", + "name": "entity.zombie.death" + } + ], + "subtitle": "subtitles.twilightforest.entity.minion.death" + }, + "entity.twilightforest.minion.hurt": { + "sounds": [ + { + "type": "event", + "name": "entity.zombie.hurt" + } + ], + "subtitle": "subtitles.twilightforest.entity.minion.hurt" + }, + "entity.twilightforest.minion.step": { + "sounds": [ + { + "type": "event", + "name": "entity.zombie.step" + } + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.twilightforest.minion.summon": { + "sounds": [ + { + "type": "event", + "name": "entity.item.pickup" + } + ], + "subtitle": "subtitles.twilightforest.entity.minion.summon" + }, + "entity.twilightforest.minoshroom.ambient": { + "sounds": [ + { + "type": "event", + "name": "entity.cow.ambient" + } + ], + "subtitle": "subtitles.twilightforest.entity.minoshroom.ambient" + }, + "entity.twilightforest.minoshroom.attack": { + "sounds": [ + { + "type": "event", + "name": "entity.iron_golem.attack" + } + ], + "subtitle": "subtitles.twilightforest.entity.minoshroom.attack" + }, + "entity.twilightforest.minoshroom.death": { + "sounds": [ + { + "type": "event", + "name": "entity.cow.death" + } + ], + "subtitle": "subtitles.twilightforest.entity.minoshroom.death" + }, + "entity.twilightforest.minoshroom.hurt": { + "sounds": [ + { + "type": "event", + "name": "entity.cow.hurt" + } + ], + "subtitle": "subtitles.twilightforest.entity.minoshroom.hurt" + }, + "entity.twilightforest.minoshroom.slam": { + "sounds": [ + { + "type": "event", + "name": "entity.lightning_bolt.impact" + } + ], + "subtitle": "subtitles.twilightforest.entity.minoshroom.slam" + }, + "entity.twilightforest.minoshroom.step": { + "sounds": [ + { + "type": "event", + "name": "entity.cow.step" + } + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.twilightforest.minotaur.ambient": { + "sounds": [ + { + "type": "event", + "name": "entity.cow.ambient" + } + ], + "subtitle": "subtitles.twilightforest.entity.minotaur.ambient" + }, + "entity.twilightforest.minotaur.attack": { + "sounds": [ + { + "type": "event", + "name": "entity.iron_golem.attack" + } + ], + "subtitle": "subtitles.twilightforest.entity.minotaur.attack" + }, + "entity.twilightforest.minotaur.death": { + "sounds": [ + { + "type": "event", + "name": "entity.cow.death" + } + ], + "subtitle": "subtitles.twilightforest.entity.minotaur.death" + }, + "entity.twilightforest.minotaur.hurt": { + "sounds": [ + { + "type": "event", + "name": "entity.cow.hurt" + } + ], + "subtitle": "subtitles.twilightforest.entity.minotaur.hurt" + }, + "entity.twilightforest.minotaur.step": { + "sounds": [ + { + "type": "event", + "name": "entity.cow.step" + } + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.twilightforest.mist_wolf.ambient": { + "sounds": [ + "twilightforest:mob/mist_wolf/idle1", + "twilightforest:mob/mist_wolf/idle2", + "twilightforest:mob/mist_wolf/idle3" + ], + "subtitle": "subtitles.twilightforest.entity.mist_wolf.ambient" + }, + "entity.twilightforest.mist_wolf.death": { + "sounds": [ + { + "type": "event", + "name": "entity.wolf.death" + } + ], + "subtitle": "subtitles.twilightforest.entity.mist_wolf.death" + }, + "entity.twilightforest.mist_wolf.hurt": { + "sounds": [ + "twilightforest:mob/mist_wolf/hurt1", + "twilightforest:mob/mist_wolf/hurt2" + ], + "subtitle": "subtitles.twilightforest.entity.mist_wolf.hurt" + }, + "entity.twilightforest.mist_wolf.target": { + "sounds": [ + "twilightforest:mob/mist_wolf/target" + ], + "subtitle": "subtitles.twilightforest.entity.mist_wolf.target" + }, + "entity.twilightforest.mosquito.ambient": { + "sounds": [ + "twilightforest:mob/mosquito/animals132" + ], + "subtitle": "subtitles.twilightforest.entity.mosquito.ambient" + }, + "entity.twilightforest.naga.hiss": { + "sounds": [ + "twilightforest:mob/naga/hiss1", + "twilightforest:mob/naga/hiss2", + "twilightforest:mob/naga/hiss3" + ], + "subtitle": "subtitles.twilightforest.entity.naga.hiss" + }, + "entity.twilightforest.naga.hurt": { + "sounds": [ + "twilightforest:mob/naga/hurt1", + "twilightforest:mob/naga/hurt2", + "twilightforest:mob/naga/hurt3" + ], + "subtitle": "subtitles.twilightforest.entity.naga.hurt" + }, + "entity.twilightforest.naga.rattle": { + "sounds": [ + "twilightforest:mob/naga/rattle1", + "twilightforest:mob/naga/rattle2" + ], + "subtitle": "subtitles.twilightforest.entity.naga.rattle" + }, + "entity.twilightforest.parrot.imitate.alpha_yeti": { + "sounds": [ + { + "type": "event", + "name": "twilightforest:entity.twilightforest.alpha_yeti.growl", + "pitch": 1.8, + "volume": 0.6 + } + ], + "subtitle": "subtitles.twilightforest.entity.parrot.imitate.alpha_yeti" + }, + "entity.twilightforest.parrot.imitate.carminite_golem": { + "sounds": [ + { + "type": "event", + "name": "twilightforest:entity.twilightforest.carminite_golem.hurt", + "pitch": 1.8, + "volume": 0.6 + } + ], + "subtitle": "subtitles.twilightforest.entity.parrot.imitate.carminite_golem" + }, + "entity.twilightforest.parrot.imitate.death_tome": { + "sounds": [ + { + "type": "event", + "name": "twilightforest:entity.twilightforest.death_tome.ambient", + "pitch": 1.8, + "volume": 0.6 + } + ], + "subtitle": "subtitles.twilightforest.entity.parrot.imitate.death_tome" + }, + "entity.twilightforest.parrot.imitate.hostile_wolf": { + "sounds": [ + { + "type": "event", + "name": "twilightforest:entity.twilightforest.hostile_wolf.ambient", + "pitch": 1.8, + "volume": 0.6 + } + ], + "subtitle": "subtitles.twilightforest.entity.parrot.imitate.hostile_wolf" + }, + "entity.twilightforest.parrot.imitate.hydra": { + "sounds": [ + { + "type": "event", + "name": "twilightforest:entity.twilightforest.hydra.growl", + "pitch": 1.8, + "volume": 0.6 + } + ], + "subtitle": "subtitles.twilightforest.entity.parrot.imitate.hydra" + }, + "entity.twilightforest.parrot.imitate.ice_core": { + "sounds": [ + { + "type": "event", + "name": "twilightforest:entity.twilightforest.ice.ambient", + "pitch": 1.8, + "volume": 0.6 + } + ], + "subtitle": "subtitles.twilightforest.entity.parrot.imitate.ice_core" + }, + "entity.twilightforest.parrot.imitate.kobold": { + "sounds": [ + { + "type": "event", + "name": "twilightforest:entity.twilightforest.kobold.ambient", + "pitch": 1.8, + "volume": 0.6 + } + ], + "subtitle": "subtitles.twilightforest.entity.parrot.imitate.kobold" + }, + "entity.twilightforest.parrot.imitate.minotaur": { + "sounds": [ + { + "type": "event", + "name": "twilightforest:entity.twilightforest.minotaur.ambient", + "pitch": 1.8, + "volume": 0.6 + } + ], + "subtitle": "subtitles.twilightforest.entity.parrot.imitate.minotaur" + }, + "entity.twilightforest.parrot.imitate.mosquito": { + "sounds": [ + { + "type": "event", + "name": "twilightforest:entity.twilightforest.mosquito.ambient", + "pitch": 1.8, + "volume": 0.6 + } + ], + "subtitle": "subtitles.twilightforest.entity.parrot.imitate.mosquito" + }, + "entity.twilightforest.parrot.imitate.naga": { + "sounds": [ + { + "type": "event", + "name": "twilightforest:entity.twilightforest.naga.hiss", + "pitch": 1.8, + "volume": 0.6 + } + ], + "subtitle": "subtitles.twilightforest.entity.parrot.imitate.naga" + }, + "entity.twilightforest.parrot.imitate.redcap": { + "sounds": [ + { + "type": "event", + "name": "twilightforest:entity.twilightforest.redcap.ambient", + "pitch": 1.8, + "volume": 0.6 + } + ], + "subtitle": "subtitles.twilightforest.entity.parrot.imitate.redcap" + }, + "entity.twilightforest.parrot.imitate.wraith": { + "sounds": [ + { + "type": "event", + "name": "twilightforest:entity.twilightforest.wraith.ambient", + "pitch": 1.8, + "volume": 0.6 + } + ], + "subtitle": "subtitles.twilightforest.entity.parrot.imitate.wraith" + }, + "entity.twilightforest.pinch_beetle.death": { + "sounds": [ + { + "type": "event", + "name": "entity.spider.death" + } + ], + "subtitle": "subtitles.twilightforest.entity.pinch_beetle.death" + }, + "entity.twilightforest.pinch_beetle.hurt": { + "sounds": [ + { + "type": "event", + "name": "entity.spider.hurt" + } + ], + "subtitle": "subtitles.twilightforest.entity.pinch_beetle.hurt" + }, + "entity.twilightforest.pinch_beetle.step": { + "sounds": [ + { + "type": "event", + "name": "entity.spider.step" + } + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.twilightforest.quest_ram.ambient": { + "sounds": [ + { + "type": "event", + "name": "entity.sheep.ambient" + } + ], + "subtitle": "subtitles.twilightforest.entity.quest_ram.ambient" + }, + "entity.twilightforest.quest_ram.death": { + "sounds": [ + { + "type": "event", + "name": "entity.sheep.death" + } + ], + "subtitle": "subtitles.twilightforest.entity.quest_ram.death" + }, + "entity.twilightforest.quest_ram.hurt": { + "sounds": [ + { + "type": "event", + "name": "entity.sheep.hurt" + } + ], + "subtitle": "subtitles.twilightforest.entity.quest_ram.hurt" + }, + "entity.twilightforest.quest_ram.step": { + "sounds": [ + { + "type": "event", + "name": "entity.sheep.step" + } + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.twilightforest.raven.caw": { + "sounds": [ + "twilightforest:mob/raven/caw1", + "twilightforest:mob/raven/caw2" + ], + "subtitle": "subtitles.twilightforest.entity.raven.caw" + }, + "entity.twilightforest.raven.squawk": { + "sounds": [ + "twilightforest:mob/raven/squawk1", + "twilightforest:mob/raven/squawk2" + ], + "subtitle": "subtitles.twilightforest.entity.raven.squawk" + }, + "entity.twilightforest.redcap.ambient": { + "sounds": [ + "twilightforest:mob/redcap/redcap1", + "twilightforest:mob/redcap/redcap2", + "twilightforest:mob/redcap/redcap3", + "twilightforest:mob/redcap/redcap4", + "twilightforest:mob/redcap/redcap5", + "twilightforest:mob/redcap/redcap6" + ], + "subtitle": "subtitles.twilightforest.entity.redcap.ambient" + }, + "entity.twilightforest.redcap.death": { + "sounds": [ + "twilightforest:mob/redcap/die1", + "twilightforest:mob/redcap/die2", + "twilightforest:mob/redcap/die3" + ], + "subtitle": "subtitles.twilightforest.entity.redcap.death" + }, + "entity.twilightforest.redcap.hurt": { + "sounds": [ + "twilightforest:mob/redcap/hurt1", + "twilightforest:mob/redcap/hurt2", + "twilightforest:mob/redcap/hurt3", + "twilightforest:mob/redcap/hurt4" + ], + "subtitle": "subtitles.twilightforest.entity.redcap.hurt" + }, + "entity.twilightforest.shield.add": { + "sounds": [ + { + "type": "event", + "name": "entity.chicken.egg" + } + ], + "subtitle": "subtitles.twilightforest.entity.shield.add" + }, + "entity.twilightforest.shield.break": { + "sounds": [ + { + "type": "event", + "name": "entity.item.break" + } + ], + "subtitle": "subtitles.twilightforest.entity.shield.break" + }, + "entity.twilightforest.skeleton_druid.ambient": { + "sounds": [ + { + "type": "event", + "name": "entity.stray.ambient" + } + ], + "subtitle": "subtitles.twilightforest.entity.skeleton_druid.ambient" + }, + "entity.twilightforest.skeleton_druid.death": { + "sounds": [ + { + "type": "event", + "name": "entity.stray.death" + } + ], + "subtitle": "subtitles.twilightforest.entity.skeleton_druid.death" + }, + "entity.twilightforest.skeleton_druid.hurt": { + "sounds": [ + { + "type": "event", + "name": "entity.stray.hurt" + } + ], + "subtitle": "subtitles.twilightforest.entity.skeleton_druid.hurt" + }, + "entity.twilightforest.skeleton_druid.shoot": { + "sounds": [ + { + "type": "event", + "name": "entity.ghast.shoot" + } + ], + "subtitle": "subtitles.twilightforest.entity.skeleton_druid.shoot" + }, + "entity.twilightforest.skeleton_druid.step": { + "sounds": [ + { + "type": "event", + "name": "entity.skeleton.step" + } + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.twilightforest.slime_beetle.death": { + "sounds": [ + { + "type": "event", + "name": "entity.spider.death" + } + ], + "subtitle": "subtitles.twilightforest.entity.slime_beetle.death" + }, + "entity.twilightforest.slime_beetle.hurt": { + "sounds": [ + { + "type": "event", + "name": "entity.spider.hurt" + } + ], + "subtitle": "subtitles.twilightforest.entity.slime_beetle.hurt" + }, + "entity.twilightforest.slime_beetle.squish": { + "sounds": [ + { + "type": "event", + "name": "entity.slime.squish_small" + } + ], + "subtitle": "subtitles.twilightforest.entity.slime_beetle.squish" + }, + "entity.twilightforest.slime_beetle.step": { + "sounds": [ + { + "type": "event", + "name": "entity.spider.step" + } + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.twilightforest.snow_guardian.ambient": { + "sounds": [ + "twilightforest:mob/ice/crackle1", + "twilightforest:mob/ice/crackle2" + ], + "subtitle": "subtitles.twilightforest.entity.snow_guardian.ambient" + }, + "entity.twilightforest.snow_guardian.death": { + "sounds": [ + "twilightforest:mob/ice/death1", + "twilightforest:mob/ice/death2" + ], + "subtitle": "subtitles.twilightforest.entity.snow_guardian.death" + }, + "entity.twilightforest.snow_guardian.hurt": { + "sounds": [ + "twilightforest:mob/ice/hurt1", + "twilightforest:mob/ice/hurt2" + ], + "subtitle": "subtitles.twilightforest.entity.snow_guardian.hurt" + }, + "entity.twilightforest.snow_queen.ambient": { + "sounds": [ + "twilightforest:mob/ice/crackle1", + "twilightforest:mob/ice/crackle2" + ], + "subtitle": "subtitles.twilightforest.entity.snow_queen.ambient" + }, + "entity.twilightforest.snow_queen.attack": { + "sounds": [ + { + "type": "event", + "name": "entity.iron_golem.attack" + } + ], + "subtitle": "subtitles.twilightforest.entity.snow_queen.attack" + }, + "entity.twilightforest.snow_queen.break": { + "sounds": [ + { + "type": "event", + "name": "entity.item.break" + } + ], + "subtitle": "subtitles.twilightforest.entity.snow_queen.break" + }, + "entity.twilightforest.snow_queen.death": { + "sounds": [ + "twilightforest:mob/ice/death1", + "twilightforest:mob/ice/death2" + ], + "subtitle": "subtitles.twilightforest.entity.snow_queen.death" + }, + "entity.twilightforest.snow_queen.hurt": { + "sounds": [ + "twilightforest:mob/ice/hurt1", + "twilightforest:mob/ice/hurt2" + ], + "subtitle": "subtitles.twilightforest.entity.snow_queen.hurt" + }, + "entity.twilightforest.swarm_spider.ambient": { + "sounds": [ + { + "type": "event", + "name": "entity.spider.ambient" + } + ], + "subtitle": "subtitles.twilightforest.entity.swarm_spider.ambient" + }, + "entity.twilightforest.swarm_spider.death": { + "sounds": [ + { + "type": "event", + "name": "entity.spider.death" + } + ], + "subtitle": "subtitles.twilightforest.entity.swarm_spider.death" + }, + "entity.twilightforest.swarm_spider.hurt": { + "sounds": [ + { + "type": "event", + "name": "entity.spider.hurt" + } + ], + "subtitle": "subtitles.twilightforest.entity.swarm_spider.hurt" + }, + "entity.twilightforest.swarm_spider.step": { + "sounds": [ + { + "type": "event", + "name": "entity.spider.step" + } + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.twilightforest.tear.break": { + "sounds": [ + { + "type": "event", + "name": "block.glass.break" + } + ], + "subtitle": "subtitles.twilightforest.entity.tear.break" + }, + "entity.twilightforest.tiny_bird.chirp": { + "sounds": [ + "twilightforest:mob/tiny_bird/chirp1", + "twilightforest:mob/tiny_bird/chirp2", + "twilightforest:mob/tiny_bird/chirp3" + ], + "subtitle": "subtitles.twilightforest.entity.tiny_bird.chirp" + }, + "entity.twilightforest.tiny_bird.hurt": { + "sounds": [ + "twilightforest:mob/tiny_bird/hurt1", + "twilightforest:mob/tiny_bird/hurt2" + ], + "subtitle": "subtitles.twilightforest.entity.tiny_bird.hurt" + }, + "entity.twilightforest.tiny_bird.song": { + "sounds": [ + "twilightforest:mob/tiny_bird/song1", + "twilightforest:mob/tiny_bird/song2" + ], + "subtitle": "subtitles.twilightforest.entity.tiny_bird.song" + }, + "entity.twilightforest.tiny_bird.takeoff": { + "sounds": [ + { + "type": "event", + "name": "entity.bat.takeoff" + } + ], + "subtitle": "subtitles.twilightforest.entity.tiny_bird.takeoff" + }, + "entity.twilightforest.towerwood_borer.ambient": { + "sounds": [ + { + "type": "event", + "name": "entity.silverfish.ambient" + } + ], + "subtitle": "subtitles.twilightforest.entity.towerwood_borer.ambient" + }, + "entity.twilightforest.towerwood_borer.death": { + "sounds": [ + { + "type": "event", + "name": "entity.silverfish.death" + } + ], + "subtitle": "subtitles.twilightforest.entity.towerwood_borer.death" + }, + "entity.twilightforest.towerwood_borer.hurt": { + "sounds": [ + { + "type": "event", + "name": "entity.silverfish.hurt" + } + ], + "subtitle": "subtitles.twilightforest.entity.towerwood_borer.hurt" + }, + "entity.twilightforest.towerwood_borer.step": { + "sounds": [ + { + "type": "event", + "name": "entity.silverfish.step" + } + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.twilightforest.troll.throw_rock": { + "sounds": [ + { + "type": "event", + "name": "entity.arrow.shoot" + } + ], + "subtitle": "subtitles.twilightforest.entity.troll.throw_rock" + }, + "entity.twilightforest.ur_ghast.ambient": { + "sounds": [ + { + "type": "event", + "name": "entity.ghast.ambient" + } + ], + "subtitle": "subtitles.twilightforest.entity.ur_ghast.ambient" + }, + "entity.twilightforest.ur_ghast.death": { + "sounds": [ + { + "type": "event", + "name": "entity.ghast.death" + } + ], + "subtitle": "subtitles.twilightforest.entity.ur_ghast.death" + }, + "entity.twilightforest.ur_ghast.hurt": { + "sounds": [ + { + "type": "event", + "name": "entity.ghast.hurt" + } + ], + "subtitle": "subtitles.twilightforest.entity.ur_ghast.hurt" + }, + "entity.twilightforest.ur_ghast.shoot": { + "sounds": [ + { + "type": "event", + "name": "entity.ghast.shoot" + } + ], + "subtitle": "subtitles.twilightforest.entity.ur_ghast.shoot" + }, + "entity.twilightforest.ur_ghast.tantrum": { + "sounds": [ + { + "type": "event", + "name": "entity.ghast.hurt" + } + ], + "subtitle": "subtitles.twilightforest.entity.ur_ghast.tantrum" + }, + "entity.twilightforest.ur_ghast.warn": { + "sounds": [ + { + "type": "event", + "name": "entity.ghast.warn" + } + ], + "subtitle": "subtitles.twilightforest.entity.ur_ghast.shoot" + }, + "entity.twilightforest.winter_wolf.ambient": { + "sounds": [ + "twilightforest:mob/mist_wolf/idle1", + "twilightforest:mob/mist_wolf/idle2", + "twilightforest:mob/mist_wolf/idle3" + ], + "subtitle": "subtitles.twilightforest.entity.winter_wolf.ambient" + }, + "entity.twilightforest.winter_wolf.death": { + "sounds": [ + { + "type": "event", + "name": "entity.wolf.death" + } + ], + "subtitle": "subtitles.twilightforest.entity.winter_wolf.death" + }, + "entity.twilightforest.winter_wolf.hurt": { + "sounds": [ + "twilightforest:mob/mist_wolf/hurt1", + "twilightforest:mob/mist_wolf/hurt2" + ], + "subtitle": "subtitles.twilightforest.entity.winter_wolf.hurt" + }, + "entity.twilightforest.winter_wolf.shoot": { + "sounds": [ + { + "type": "event", + "name": "entity.ghast.shoot" + } + ], + "subtitle": "subtitles.twilightforest.entity.winter_wolf.shoot" + }, + "entity.twilightforest.winter_wolf.target": { + "sounds": [ + "twilightforest:mob/mist_wolf/target" + ], + "subtitle": "subtitles.twilightforest.entity.winter_wolf.target" + }, + "entity.twilightforest.wraith.ambient": { + "sounds": [ + "twilightforest:mob/wraith/wraith1", + "twilightforest:mob/wraith/wraith2", + "twilightforest:mob/wraith/wraith3", + "twilightforest:mob/wraith/wraith4" + ], + "subtitle": "subtitles.twilightforest.entity.wraith.ambient" + }, + "entity.twilightforest.wraith.death": { + "sounds": [ + "twilightforest:mob/wraith/wraith1", + "twilightforest:mob/wraith/wraith2", + "twilightforest:mob/wraith/wraith3", + "twilightforest:mob/wraith/wraith4" + ], + "subtitle": "subtitles.twilightforest.entity.wraith.death" + }, + "entity.twilightforest.wraith.hurt": { + "sounds": [ + "twilightforest:mob/wraith/wraith1", + "twilightforest:mob/wraith/wraith2", + "twilightforest:mob/wraith/wraith3", + "twilightforest:mob/wraith/wraith4" + ], + "subtitle": "subtitles.twilightforest.entity.wraith.hurt" + }, + "entity.twilightforest.yeti.death": { + "sounds": [ + "twilightforest:mob/alpha_yeti/death" + ], + "subtitle": "subtitles.twilightforest.entity.yeti.death" + }, + "entity.twilightforest.yeti.grab": { + "sounds": [ + "twilightforest:mob/alpha_yeti/grab" + ], + "subtitle": "subtitles.twilightforest.entity.yeti.grab" + }, + "entity.twilightforest.yeti.growl": { + "sounds": [ + "twilightforest:mob/alpha_yeti/growl1", + "twilightforest:mob/alpha_yeti/growl2", + "twilightforest:mob/alpha_yeti/growl3" + ], + "subtitle": "subtitles.twilightforest.entity.yeti.growl" + }, + "entity.twilightforest.yeti.hurt": { + "sounds": [ + "twilightforest:mob/alpha_yeti/hurt1", + "twilightforest:mob/alpha_yeti/hurt2", + "twilightforest:mob/alpha_yeti/hurt3" + ], + "subtitle": "subtitles.twilightforest.entity.yeti.hurt" + }, + "entity.twilightforest.yeti.throw": { + "sounds": [ + "twilightforest:mob/alpha_yeti/throw" + ], + "subtitle": "subtitles.twilightforest.entity.yeti.throw" + }, + "environment.twilightforest.acid_rain": { + "sounds": [ + { + "type": "event", + "name": "block.fire.extinguish" + } + ], + "subtitle": "subtitles.twilightforest.environment.acid_rain" + }, + "item.twilightforest.block_and_chain.collide": { + "sounds": [ + { + "type": "event", + "name": "block.anvil.land" + } + ], + "subtitle": "subtitles.twilightforest.item.block_and_chain.collide" + }, + "item.twilightforest.block_and_chain.fire": { + "sounds": [ + { + "type": "event", + "name": "entity.arrow.shoot" + } + ], + "subtitle": "subtitles.twilightforest.item.block_and_chain.fire" + }, + "item.twilightforest.block_and_chain.hit": { + "sounds": [ + { + "type": "event", + "name": "entity.iron_golem.attack" + } + ], + "subtitle": "subtitles.twilightforest.item.block_and_chain.hit" + }, + "item.twilightforest.charm.keep": { + "sounds": [ + { + "type": "event", + "name": "entity.zombie_villager.converted" + } + ], + "subtitle": "subtitles.twilightforest.item.charm.keep" + }, + "item.twilightforest.charm.life": { + "sounds": [ + { + "type": "event", + "name": "item.totem.use" + } + ], + "subtitle": "subtitles.twilightforest.item.charm.life" + }, + "item.twilightforest.fan.whoosh": { + "sounds": [ + "random/breath" + ], + "subtitle": "subtitles.twilightforest.item.fan.whoosh" + }, + "item.twilightforest.flask.break": { + "sounds": [ + { + "type": "event", + "name": "block.glass.break" + } + ], + "subtitle": "subtitles.twilightforest.item.flask.break" + }, + "item.twilightforest.flask.crack": { + "sounds": [ + { + "type": "event", + "name": "block.glass.break" + } + ], + "subtitle": "subtitles.twilightforest.item.flask.crack" + }, + "item.twilightforest.flask.fill": { + "sounds": [ + { + "type": "event", + "name": "block.brewing_stand.brew" + } + ], + "subtitle": "subtitles.twilightforest.item.flask.fill" + }, + "item.twilightforest.glass_sword.break": { + "sounds": [ + { + "type": "event", + "name": "block.glass.break" + } + ], + "subtitle": "subtitles.twilightforest.item.glass_sword.break" + }, + "item.twilightforest.ice_bomb.fired": { + "sounds": [ + { + "type": "event", + "name": "entity.arrow.shoot" + } + ], + "subtitle": "subtitles.twilightforest.item.ice_bomb.fired" + }, + "item.twilightforest.knightmetal_armor.equip": { + "sounds": [ + { + "type": "event", + "name": "item.armor.equip_netherite" + } + ], + "subtitle": "subtitles.twilightforest.item.knightmetal_armor.equip" + }, + "item.twilightforest.knightmetal_shield.shatter": { + "sounds": [ + { + "type": "event", + "name": "entity.zombie.attack_iron_door" + } + ], + "subtitle": "subtitles.twilightforest.item.knightmetal_shield.shatter" + }, + "item.twilightforest.lamp.burn": { + "sounds": [ + { + "type": "event", + "name": "entity.ghast.shoot" + } + ], + "subtitle": "subtitles.twilightforest.item.lamp.burn" + }, + "item.twilightforest.magnet.grab": { + "sounds": [ + { + "type": "event", + "name": "item.chorus_fruit.teleport" + } + ], + "subtitle": "subtitles.twilightforest.item.magnet.grab" + }, + "item.twilightforest.moonworm.squish": { + "sounds": [ + { + "type": "event", + "name": "entity.slime.squish_small" + } + ], + "subtitle": "subtitles.twilightforest.item.moonworm.squish" + }, + "item.twilightforest.scepter.drain": { + "sounds": [ + { + "type": "event", + "name": "entity.generic.big_fall" + } + ], + "subtitle": "subtitles.twilightforest.item.scepter.drain" + }, + "item.twilightforest.scepter.pearl": { + "sounds": [ + { + "type": "event", + "name": "item.flintandsteel.use" + } + ], + "subtitle": "subtitles.twilightforest.item.scepter.pearl" + }, + "item.twilightforest.shield.shatter": { + "sounds": [ + { + "type": "event", + "name": "entity.zombie.break_wooden_door" + } + ], + "subtitle": "subtitles.twilightforest.item.shield.shatter" + }, + "item.twilightforest.transformation_powder.use": { + "sounds": [ + { + "type": "event", + "name": "entity.zombie_villager.cure" + } + ], + "subtitle": "subtitles.twilightforest.item.transformation_powder.use" + }, + "music.twilightforest.twilight_forest": { + "sounds": [ + { + "name": "twilightforest:music/superstitious", + "stream": true, + "volume": 0.5 + }, + { + "name": "twilightforest:music/steps", + "stream": true, + "volume": 0.5 + }, + { + "name": "twilightforest:music/radiance", + "stream": true, + "volume": 0.5 + }, + { + "name": "twilightforest:music/home", + "stream": true, + "volume": 0.5 + }, + { + "name": "twilightforest:music/wayfarer", + "stream": true, + "volume": 0.5 + }, + { + "name": "twilightforest:music/findings", + "stream": true, + "volume": 0.5 + }, + { + "name": "twilightforest:music/maker", + "stream": true, + "volume": 0.5 + }, + { + "name": "twilightforest:music/thread", + "stream": true, + "volume": 0.5 + }, + { + "name": "twilightforest:music/motion", + "stream": true, + "volume": 0.5 + } + ] + }, + "music_disc.twilightforest.findings": { + "sounds": [ + { + "name": "twilightforest:music/findings", + "stream": true + } + ] + }, + "music_disc.twilightforest.home": { + "sounds": [ + { + "name": "twilightforest:music/home", + "stream": true + } + ] + }, + "music_disc.twilightforest.maker": { + "sounds": [ + { + "name": "twilightforest:music/maker", + "stream": true + } + ] + }, + "music_disc.twilightforest.motion": { + "sounds": [ + { + "name": "twilightforest:music/motion", + "stream": true + } + ] + }, + "music_disc.twilightforest.radiance": { + "sounds": [ + { + "name": "twilightforest:music/radiance", + "stream": true + } + ] + }, + "music_disc.twilightforest.steps": { + "sounds": [ + { + "name": "twilightforest:music/steps", + "stream": true + } + ] + }, + "music_disc.twilightforest.superstitious": { + "sounds": [ + { + "name": "twilightforest:music/superstitious", + "stream": true + } + ] + }, + "music_disc.twilightforest.thread": { + "sounds": [ + { + "name": "twilightforest:music/thread", + "stream": true + } + ] + }, + "music_disc.twilightforest.wayfarer": { + "sounds": [ + { + "name": "twilightforest:music/wayfarer", + "stream": true + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/createaddition/tags/items/plant_foods.json b/src/generated/resources/data/createaddition/tags/items/plant_foods.json new file mode 100644 index 0000000000..63dea67a30 --- /dev/null +++ b/src/generated/resources/data/createaddition/tags/items/plant_foods.json @@ -0,0 +1,5 @@ +{ + "values": [ + "twilightforest:torchberries" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/createaddition/tags/items/plants.json b/src/generated/resources/data/createaddition/tags/items/plants.json new file mode 100644 index 0000000000..e26035eb6b --- /dev/null +++ b/src/generated/resources/data/createaddition/tags/items/plants.json @@ -0,0 +1,23 @@ +{ + "values": [ + "twilightforest:liveroot", + "twilightforest:magic_beans", + "twilightforest:huge_water_lily", + "twilightforest:huge_lily_pad", + "twilightforest:trollvidr", + "twilightforest:unripe_trollber", + "twilightforest:trollber", + "twilightforest:huge_stalk", + "twilightforest:thorn_rose", + "twilightforest:mayapple", + "twilightforest:clover_patch", + "twilightforest:fiddlehead", + "twilightforest:mushgloom", + "twilightforest:torchberry_plant", + "twilightforest:root_strand", + "twilightforest:fallen_leaves", + "twilightforest:hedge", + "twilightforest:root", + "twilightforest:liveroot_block" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/curios/tags/items/charm.json b/src/generated/resources/data/curios/tags/items/charm.json new file mode 100644 index 0000000000..9987166e5c --- /dev/null +++ b/src/generated/resources/data/curios/tags/items/charm.json @@ -0,0 +1,9 @@ +{ + "values": [ + "twilightforest:charm_of_life_1", + "twilightforest:charm_of_life_2", + "twilightforest:charm_of_keeping_1", + "twilightforest:charm_of_keeping_2", + "twilightforest:charm_of_keeping_3" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/curios/tags/items/head.json b/src/generated/resources/data/curios/tags/items/head.json new file mode 100644 index 0000000000..7dd5c1661f --- /dev/null +++ b/src/generated/resources/data/curios/tags/items/head.json @@ -0,0 +1,21 @@ +{ + "values": [ + "twilightforest:naga_trophy", + "twilightforest:lich_trophy", + "twilightforest:minoshroom_trophy", + "twilightforest:hydra_trophy", + "twilightforest:knight_phantom_trophy", + "twilightforest:ur_ghast_trophy", + "twilightforest:alpha_yeti_trophy", + "twilightforest:snow_queen_trophy", + "twilightforest:quest_ram_trophy", + "twilightforest:cicada", + "twilightforest:firefly", + "twilightforest:moonworm", + "twilightforest:creeper_skull_candle", + "twilightforest:player_skull_candle", + "twilightforest:skeleton_skull_candle", + "twilightforest:wither_skeleton_skull_candle", + "twilightforest:zombie_skull_candle" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/loot_modifiers/global_loot_modifiers.json b/src/generated/resources/data/forge/loot_modifiers/global_loot_modifiers.json new file mode 100644 index 0000000000..7c02759008 --- /dev/null +++ b/src/generated/resources/data/forge/loot_modifiers/global_loot_modifiers.json @@ -0,0 +1,7 @@ +{ + "entries": [ + "twilightforest:giant_pick_grouping", + "twilightforest:fiery_pick_smelting" + ], + "replace": false +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/block_entity_type/immovable.json b/src/generated/resources/data/forge/tags/block_entity_type/immovable.json new file mode 100644 index 0000000000..f2ae2df9dc --- /dev/null +++ b/src/generated/resources/data/forge/tags/block_entity_type/immovable.json @@ -0,0 +1,15 @@ +{ + "values": [ + "twilightforest:antibuilder", + "twilightforest:beanstalk_grower", + "twilightforest:naga_spawner", + "twilightforest:lich_spawner", + "twilightforest:minoshroom_spawner", + "twilightforest:hydra_boss_spawner", + "twilightforest:knight_phantom_spawner", + "twilightforest:tower_boss_spawner", + "twilightforest:alpha_yeti_spawner", + "twilightforest:snow_queen_spawner", + "twilightforest:final_boss_spawner" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/block_entity_type/relocation_not_supported.json b/src/generated/resources/data/forge/tags/block_entity_type/relocation_not_supported.json new file mode 100644 index 0000000000..f2ae2df9dc --- /dev/null +++ b/src/generated/resources/data/forge/tags/block_entity_type/relocation_not_supported.json @@ -0,0 +1,15 @@ +{ + "values": [ + "twilightforest:antibuilder", + "twilightforest:beanstalk_grower", + "twilightforest:naga_spawner", + "twilightforest:lich_spawner", + "twilightforest:minoshroom_spawner", + "twilightforest:hydra_boss_spawner", + "twilightforest:knight_phantom_spawner", + "twilightforest:tower_boss_spawner", + "twilightforest:alpha_yeti_spawner", + "twilightforest:snow_queen_spawner", + "twilightforest:final_boss_spawner" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/blocks/chests/wooden.json b/src/generated/resources/data/forge/tags/blocks/chests/wooden.json new file mode 100644 index 0000000000..14abf0922a --- /dev/null +++ b/src/generated/resources/data/forge/tags/blocks/chests/wooden.json @@ -0,0 +1,12 @@ +{ + "values": [ + "twilightforest:twilight_oak_chest", + "twilightforest:canopy_chest", + "twilightforest:mangrove_chest", + "twilightforest:dark_chest", + "twilightforest:time_chest", + "twilightforest:transformation_chest", + "twilightforest:mining_chest", + "twilightforest:sorting_chest" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/blocks/fence_gates.json b/src/generated/resources/data/forge/tags/blocks/fence_gates.json new file mode 100644 index 0000000000..eb4aeb48a2 --- /dev/null +++ b/src/generated/resources/data/forge/tags/blocks/fence_gates.json @@ -0,0 +1,12 @@ +{ + "values": [ + "twilightforest:twilight_oak_fence_gate", + "twilightforest:canopy_fence_gate", + "twilightforest:mangrove_fence_gate", + "twilightforest:dark_fence_gate", + "twilightforest:time_fence_gate", + "twilightforest:transformation_fence_gate", + "twilightforest:mining_fence_gate", + "twilightforest:sorting_fence_gate" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/blocks/fence_gates/wooden.json b/src/generated/resources/data/forge/tags/blocks/fence_gates/wooden.json new file mode 100644 index 0000000000..eb4aeb48a2 --- /dev/null +++ b/src/generated/resources/data/forge/tags/blocks/fence_gates/wooden.json @@ -0,0 +1,12 @@ +{ + "values": [ + "twilightforest:twilight_oak_fence_gate", + "twilightforest:canopy_fence_gate", + "twilightforest:mangrove_fence_gate", + "twilightforest:dark_fence_gate", + "twilightforest:time_fence_gate", + "twilightforest:transformation_fence_gate", + "twilightforest:mining_fence_gate", + "twilightforest:sorting_fence_gate" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/blocks/fences.json b/src/generated/resources/data/forge/tags/blocks/fences.json new file mode 100644 index 0000000000..cd0e2d5b1c --- /dev/null +++ b/src/generated/resources/data/forge/tags/blocks/fences.json @@ -0,0 +1,12 @@ +{ + "values": [ + "twilightforest:twilight_oak_fence", + "twilightforest:canopy_fence", + "twilightforest:mangrove_fence", + "twilightforest:dark_fence", + "twilightforest:time_fence", + "twilightforest:transformation_fence", + "twilightforest:mining_fence", + "twilightforest:sorting_fence" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/blocks/fences/wooden.json b/src/generated/resources/data/forge/tags/blocks/fences/wooden.json new file mode 100644 index 0000000000..cd0e2d5b1c --- /dev/null +++ b/src/generated/resources/data/forge/tags/blocks/fences/wooden.json @@ -0,0 +1,12 @@ +{ + "values": [ + "twilightforest:twilight_oak_fence", + "twilightforest:canopy_fence", + "twilightforest:mangrove_fence", + "twilightforest:dark_fence", + "twilightforest:time_fence", + "twilightforest:transformation_fence", + "twilightforest:mining_fence", + "twilightforest:sorting_fence" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/blocks/immovable.json b/src/generated/resources/data/forge/tags/blocks/immovable.json new file mode 100644 index 0000000000..f6f5e1dcc9 --- /dev/null +++ b/src/generated/resources/data/forge/tags/blocks/immovable.json @@ -0,0 +1,40 @@ +{ + "values": [ + "twilightforest:twilight_portal", + "twilightforest:stronghold_shield", + "twilightforest:time_log_core", + "twilightforest:transformation_log_core", + "twilightforest:mining_log_core", + "twilightforest:sorting_log_core", + "twilightforest:antibuilder", + "twilightforest:built_block", + "twilightforest:fake_diamond", + "twilightforest:fake_gold", + "twilightforest:reactor_debris", + "twilightforest:locked_vanishing_block", + "twilightforest:vanishing_block", + "twilightforest:reappearing_block", + "twilightforest:beanstalk_grower", + "twilightforest:giant_cobblestone", + "twilightforest:giant_log", + "twilightforest:giant_leaves", + "twilightforest:giant_obsidian", + "twilightforest:brown_thorns", + "twilightforest:green_thorns", + "twilightforest:burnt_thorns", + "twilightforest:pink_force_field", + "twilightforest:orange_force_field", + "twilightforest:green_force_field", + "twilightforest:blue_force_field", + "twilightforest:violet_force_field", + "twilightforest:final_boss_boss_spawner", + "twilightforest:naga_boss_spawner", + "twilightforest:lich_boss_spawner", + "twilightforest:minoshroom_boss_spawner", + "twilightforest:hydra_boss_spawner", + "twilightforest:knight_phantom_boss_spawner", + "twilightforest:ur_ghast_boss_spawner", + "twilightforest:alpha_yeti_boss_spawner", + "twilightforest:snow_queen_boss_spawner" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/blocks/needs_wood_tool.json b/src/generated/resources/data/forge/tags/blocks/needs_wood_tool.json new file mode 100644 index 0000000000..3993ec4490 --- /dev/null +++ b/src/generated/resources/data/forge/tags/blocks/needs_wood_tool.json @@ -0,0 +1,25 @@ +{ + "values": [ + "twilightforest:nagastone", + "twilightforest:nagastone_head", + "twilightforest:etched_nagastone", + "twilightforest:cracked_etched_nagastone", + "twilightforest:mossy_etched_nagastone", + "twilightforest:nagastone_pillar", + "twilightforest:cracked_nagastone_pillar", + "twilightforest:mossy_nagastone_pillar", + "twilightforest:nagastone_stairs_left", + "twilightforest:cracked_nagastone_stairs_left", + "twilightforest:mossy_nagastone_stairs_left", + "twilightforest:nagastone_stairs_right", + "twilightforest:cracked_nagastone_stairs_right", + "twilightforest:mossy_nagastone_stairs_right", + "twilightforest:spiral_bricks", + "twilightforest:twisted_stone", + "twilightforest:twisted_stone_pillar", + "twilightforest:bold_stone_pillar", + "twilightforest:aurora_pillar", + "twilightforest:aurora_slab", + "twilightforest:trollsteinn" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/blocks/ore_bearing_ground/root.json b/src/generated/resources/data/forge/tags/blocks/ore_bearing_ground/root.json new file mode 100644 index 0000000000..5f51fbec0d --- /dev/null +++ b/src/generated/resources/data/forge/tags/blocks/ore_bearing_ground/root.json @@ -0,0 +1,5 @@ +{ + "values": [ + "twilightforest:root" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/blocks/ores_in_ground/root.json b/src/generated/resources/data/forge/tags/blocks/ores_in_ground/root.json new file mode 100644 index 0000000000..ca351f4c8e --- /dev/null +++ b/src/generated/resources/data/forge/tags/blocks/ores_in_ground/root.json @@ -0,0 +1,5 @@ +{ + "values": [ + "twilightforest:liveroot_block" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/blocks/relocation_not_supported.json b/src/generated/resources/data/forge/tags/blocks/relocation_not_supported.json new file mode 100644 index 0000000000..f6f5e1dcc9 --- /dev/null +++ b/src/generated/resources/data/forge/tags/blocks/relocation_not_supported.json @@ -0,0 +1,40 @@ +{ + "values": [ + "twilightforest:twilight_portal", + "twilightforest:stronghold_shield", + "twilightforest:time_log_core", + "twilightforest:transformation_log_core", + "twilightforest:mining_log_core", + "twilightforest:sorting_log_core", + "twilightforest:antibuilder", + "twilightforest:built_block", + "twilightforest:fake_diamond", + "twilightforest:fake_gold", + "twilightforest:reactor_debris", + "twilightforest:locked_vanishing_block", + "twilightforest:vanishing_block", + "twilightforest:reappearing_block", + "twilightforest:beanstalk_grower", + "twilightforest:giant_cobblestone", + "twilightforest:giant_log", + "twilightforest:giant_leaves", + "twilightforest:giant_obsidian", + "twilightforest:brown_thorns", + "twilightforest:green_thorns", + "twilightforest:burnt_thorns", + "twilightforest:pink_force_field", + "twilightforest:orange_force_field", + "twilightforest:green_force_field", + "twilightforest:blue_force_field", + "twilightforest:violet_force_field", + "twilightforest:final_boss_boss_spawner", + "twilightforest:naga_boss_spawner", + "twilightforest:lich_boss_spawner", + "twilightforest:minoshroom_boss_spawner", + "twilightforest:hydra_boss_spawner", + "twilightforest:knight_phantom_boss_spawner", + "twilightforest:ur_ghast_boss_spawner", + "twilightforest:alpha_yeti_boss_spawner", + "twilightforest:snow_queen_boss_spawner" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/blocks/storage_blocks.json b/src/generated/resources/data/forge/tags/blocks/storage_blocks.json new file mode 100644 index 0000000000..63c69c3161 --- /dev/null +++ b/src/generated/resources/data/forge/tags/blocks/storage_blocks.json @@ -0,0 +1,10 @@ +{ + "values": [ + "#twilightforest:storage_blocks/arctic_fur", + "#twilightforest:storage_blocks/carminite", + "#twilightforest:storage_blocks/fiery", + "#twilightforest:storage_blocks/ironwood", + "#twilightforest:storage_blocks/knightmetal", + "#twilightforest:storage_blocks/steeleaf" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/entity_types/bosses.json b/src/generated/resources/data/forge/tags/entity_types/bosses.json new file mode 100644 index 0000000000..32a85f065c --- /dev/null +++ b/src/generated/resources/data/forge/tags/entity_types/bosses.json @@ -0,0 +1,5 @@ +{ + "values": [ + "#twilightforest:bosses" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/armors/boots.json b/src/generated/resources/data/forge/tags/items/armors/boots.json new file mode 100644 index 0000000000..ac57129678 --- /dev/null +++ b/src/generated/resources/data/forge/tags/items/armors/boots.json @@ -0,0 +1,10 @@ +{ + "values": [ + "twilightforest:ironwood_boots", + "twilightforest:steeleaf_boots", + "twilightforest:knightmetal_boots", + "twilightforest:fiery_boots", + "twilightforest:arctic_boots", + "twilightforest:yeti_boots" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/armors/chestplates.json b/src/generated/resources/data/forge/tags/items/armors/chestplates.json new file mode 100644 index 0000000000..f1435c1f61 --- /dev/null +++ b/src/generated/resources/data/forge/tags/items/armors/chestplates.json @@ -0,0 +1,12 @@ +{ + "values": [ + "twilightforest:naga_chestplate", + "twilightforest:ironwood_chestplate", + "twilightforest:steeleaf_chestplate", + "twilightforest:knightmetal_chestplate", + "twilightforest:phantom_chestplate", + "twilightforest:fiery_chestplate", + "twilightforest:arctic_chestplate", + "twilightforest:yeti_chestplate" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/armors/helmets.json b/src/generated/resources/data/forge/tags/items/armors/helmets.json new file mode 100644 index 0000000000..dbea3f092f --- /dev/null +++ b/src/generated/resources/data/forge/tags/items/armors/helmets.json @@ -0,0 +1,11 @@ +{ + "values": [ + "twilightforest:ironwood_helmet", + "twilightforest:steeleaf_helmet", + "twilightforest:knightmetal_helmet", + "twilightforest:phantom_helmet", + "twilightforest:fiery_helmet", + "twilightforest:arctic_helmet", + "twilightforest:yeti_helmet" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/armors/leggings.json b/src/generated/resources/data/forge/tags/items/armors/leggings.json new file mode 100644 index 0000000000..b3d3ffa0ec --- /dev/null +++ b/src/generated/resources/data/forge/tags/items/armors/leggings.json @@ -0,0 +1,11 @@ +{ + "values": [ + "twilightforest:naga_leggings", + "twilightforest:ironwood_leggings", + "twilightforest:steeleaf_leggings", + "twilightforest:knightmetal_leggings", + "twilightforest:fiery_leggings", + "twilightforest:arctic_leggings", + "twilightforest:yeti_leggings" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/chests/wooden.json b/src/generated/resources/data/forge/tags/items/chests/wooden.json new file mode 100644 index 0000000000..14abf0922a --- /dev/null +++ b/src/generated/resources/data/forge/tags/items/chests/wooden.json @@ -0,0 +1,12 @@ +{ + "values": [ + "twilightforest:twilight_oak_chest", + "twilightforest:canopy_chest", + "twilightforest:mangrove_chest", + "twilightforest:dark_chest", + "twilightforest:time_chest", + "twilightforest:transformation_chest", + "twilightforest:mining_chest", + "twilightforest:sorting_chest" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/feathers.json b/src/generated/resources/data/forge/tags/items/feathers.json new file mode 100644 index 0000000000..6c348f7e1e --- /dev/null +++ b/src/generated/resources/data/forge/tags/items/feathers.json @@ -0,0 +1,6 @@ +{ + "values": [ + "minecraft:feather", + "twilightforest:raven_feather" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/fence_gates.json b/src/generated/resources/data/forge/tags/items/fence_gates.json new file mode 100644 index 0000000000..eb4aeb48a2 --- /dev/null +++ b/src/generated/resources/data/forge/tags/items/fence_gates.json @@ -0,0 +1,12 @@ +{ + "values": [ + "twilightforest:twilight_oak_fence_gate", + "twilightforest:canopy_fence_gate", + "twilightforest:mangrove_fence_gate", + "twilightforest:dark_fence_gate", + "twilightforest:time_fence_gate", + "twilightforest:transformation_fence_gate", + "twilightforest:mining_fence_gate", + "twilightforest:sorting_fence_gate" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/fence_gates/wooden.json b/src/generated/resources/data/forge/tags/items/fence_gates/wooden.json new file mode 100644 index 0000000000..eb4aeb48a2 --- /dev/null +++ b/src/generated/resources/data/forge/tags/items/fence_gates/wooden.json @@ -0,0 +1,12 @@ +{ + "values": [ + "twilightforest:twilight_oak_fence_gate", + "twilightforest:canopy_fence_gate", + "twilightforest:mangrove_fence_gate", + "twilightforest:dark_fence_gate", + "twilightforest:time_fence_gate", + "twilightforest:transformation_fence_gate", + "twilightforest:mining_fence_gate", + "twilightforest:sorting_fence_gate" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/fences.json b/src/generated/resources/data/forge/tags/items/fences.json new file mode 100644 index 0000000000..cd0e2d5b1c --- /dev/null +++ b/src/generated/resources/data/forge/tags/items/fences.json @@ -0,0 +1,12 @@ +{ + "values": [ + "twilightforest:twilight_oak_fence", + "twilightforest:canopy_fence", + "twilightforest:mangrove_fence", + "twilightforest:dark_fence", + "twilightforest:time_fence", + "twilightforest:transformation_fence", + "twilightforest:mining_fence", + "twilightforest:sorting_fence" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/fences/wooden.json b/src/generated/resources/data/forge/tags/items/fences/wooden.json new file mode 100644 index 0000000000..cd0e2d5b1c --- /dev/null +++ b/src/generated/resources/data/forge/tags/items/fences/wooden.json @@ -0,0 +1,12 @@ +{ + "values": [ + "twilightforest:twilight_oak_fence", + "twilightforest:canopy_fence", + "twilightforest:mangrove_fence", + "twilightforest:dark_fence", + "twilightforest:time_fence", + "twilightforest:transformation_fence", + "twilightforest:mining_fence", + "twilightforest:sorting_fence" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/gems.json b/src/generated/resources/data/forge/tags/items/gems.json new file mode 100644 index 0000000000..c9d1b43a03 --- /dev/null +++ b/src/generated/resources/data/forge/tags/items/gems.json @@ -0,0 +1,5 @@ +{ + "values": [ + "#forge:gems/carminite" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/gems/carminite.json b/src/generated/resources/data/forge/tags/items/gems/carminite.json new file mode 100644 index 0000000000..93c6ac6fcc --- /dev/null +++ b/src/generated/resources/data/forge/tags/items/gems/carminite.json @@ -0,0 +1,5 @@ +{ + "values": [ + "twilightforest:carminite" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/heads.json b/src/generated/resources/data/forge/tags/items/heads.json new file mode 100644 index 0000000000..5097d32ac6 --- /dev/null +++ b/src/generated/resources/data/forge/tags/items/heads.json @@ -0,0 +1,9 @@ +{ + "values": [ + "twilightforest:zombie_skull_candle", + "twilightforest:skeleton_skull_candle", + "twilightforest:wither_skeleton_skull_candle", + "twilightforest:creeper_skull_candle", + "twilightforest:player_skull_candle" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/ingots.json b/src/generated/resources/data/forge/tags/items/ingots.json new file mode 100644 index 0000000000..636adb6a25 --- /dev/null +++ b/src/generated/resources/data/forge/tags/items/ingots.json @@ -0,0 +1,8 @@ +{ + "values": [ + "#forge:ingots/ironwood", + "#forge:ingots/fiery", + "#forge:ingots/knightmetal", + "#forge:ingots/steeleaf" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/ingots/fiery.json b/src/generated/resources/data/forge/tags/items/ingots/fiery.json new file mode 100644 index 0000000000..08f7d821a3 --- /dev/null +++ b/src/generated/resources/data/forge/tags/items/ingots/fiery.json @@ -0,0 +1,5 @@ +{ + "values": [ + "twilightforest:fiery_ingot" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/ingots/ironwood.json b/src/generated/resources/data/forge/tags/items/ingots/ironwood.json new file mode 100644 index 0000000000..348987db4a --- /dev/null +++ b/src/generated/resources/data/forge/tags/items/ingots/ironwood.json @@ -0,0 +1,5 @@ +{ + "values": [ + "twilightforest:ironwood_ingot" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/ingots/knightmetal.json b/src/generated/resources/data/forge/tags/items/ingots/knightmetal.json new file mode 100644 index 0000000000..0671fff24e --- /dev/null +++ b/src/generated/resources/data/forge/tags/items/ingots/knightmetal.json @@ -0,0 +1,5 @@ +{ + "values": [ + "twilightforest:knightmetal_ingot" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/ingots/steeleaf.json b/src/generated/resources/data/forge/tags/items/ingots/steeleaf.json new file mode 100644 index 0000000000..d35de07730 --- /dev/null +++ b/src/generated/resources/data/forge/tags/items/ingots/steeleaf.json @@ -0,0 +1,5 @@ +{ + "values": [ + "twilightforest:steeleaf_ingot" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/paper.json b/src/generated/resources/data/forge/tags/items/paper.json new file mode 100644 index 0000000000..bfff02cdf6 --- /dev/null +++ b/src/generated/resources/data/forge/tags/items/paper.json @@ -0,0 +1,5 @@ +{ + "values": [ + "minecraft:paper" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/raw_materials.json b/src/generated/resources/data/forge/tags/items/raw_materials.json new file mode 100644 index 0000000000..729a82c6be --- /dev/null +++ b/src/generated/resources/data/forge/tags/items/raw_materials.json @@ -0,0 +1,6 @@ +{ + "values": [ + "#forge:raw_materials/ironwood", + "#forge:raw_materials/knightmetal" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/raw_materials/ironwood.json b/src/generated/resources/data/forge/tags/items/raw_materials/ironwood.json new file mode 100644 index 0000000000..8101d8a86a --- /dev/null +++ b/src/generated/resources/data/forge/tags/items/raw_materials/ironwood.json @@ -0,0 +1,5 @@ +{ + "values": [ + "twilightforest:raw_ironwood" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/raw_materials/knightmetal.json b/src/generated/resources/data/forge/tags/items/raw_materials/knightmetal.json new file mode 100644 index 0000000000..6ee7a2b5e7 --- /dev/null +++ b/src/generated/resources/data/forge/tags/items/raw_materials/knightmetal.json @@ -0,0 +1,5 @@ +{ + "values": [ + "twilightforest:armor_shard_cluster" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/storage_blocks.json b/src/generated/resources/data/forge/tags/items/storage_blocks.json new file mode 100644 index 0000000000..d6424f8dca --- /dev/null +++ b/src/generated/resources/data/forge/tags/items/storage_blocks.json @@ -0,0 +1,10 @@ +{ + "values": [ + "#forge:storage_blocks/fiery", + "#forge:storage_blocks/arctic_fur", + "#forge:storage_blocks/carminite", + "#forge:storage_blocks/ironwood", + "#forge:storage_blocks/knightmetal", + "#forge:storage_blocks/steeleaf" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/storage_blocks/arctic_fur.json b/src/generated/resources/data/forge/tags/items/storage_blocks/arctic_fur.json new file mode 100644 index 0000000000..fce3c65e35 --- /dev/null +++ b/src/generated/resources/data/forge/tags/items/storage_blocks/arctic_fur.json @@ -0,0 +1,5 @@ +{ + "values": [ + "twilightforest:arctic_fur_block" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/storage_blocks/carminite.json b/src/generated/resources/data/forge/tags/items/storage_blocks/carminite.json new file mode 100644 index 0000000000..cda29ab98b --- /dev/null +++ b/src/generated/resources/data/forge/tags/items/storage_blocks/carminite.json @@ -0,0 +1,5 @@ +{ + "values": [ + "twilightforest:carminite_block" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/storage_blocks/fiery.json b/src/generated/resources/data/forge/tags/items/storage_blocks/fiery.json new file mode 100644 index 0000000000..567fd67368 --- /dev/null +++ b/src/generated/resources/data/forge/tags/items/storage_blocks/fiery.json @@ -0,0 +1,5 @@ +{ + "values": [ + "twilightforest:fiery_block" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/storage_blocks/ironwood.json b/src/generated/resources/data/forge/tags/items/storage_blocks/ironwood.json new file mode 100644 index 0000000000..4a5c62ce86 --- /dev/null +++ b/src/generated/resources/data/forge/tags/items/storage_blocks/ironwood.json @@ -0,0 +1,5 @@ +{ + "values": [ + "twilightforest:ironwood_block" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/storage_blocks/knightmetal.json b/src/generated/resources/data/forge/tags/items/storage_blocks/knightmetal.json new file mode 100644 index 0000000000..0e3becb730 --- /dev/null +++ b/src/generated/resources/data/forge/tags/items/storage_blocks/knightmetal.json @@ -0,0 +1,5 @@ +{ + "values": [ + "twilightforest:knightmetal_block" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/storage_blocks/steeleaf.json b/src/generated/resources/data/forge/tags/items/storage_blocks/steeleaf.json new file mode 100644 index 0000000000..e3b48ca018 --- /dev/null +++ b/src/generated/resources/data/forge/tags/items/storage_blocks/steeleaf.json @@ -0,0 +1,5 @@ +{ + "values": [ + "twilightforest:steeleaf_block" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/tools/bows.json b/src/generated/resources/data/forge/tags/items/tools/bows.json new file mode 100644 index 0000000000..e4da734842 --- /dev/null +++ b/src/generated/resources/data/forge/tags/items/tools/bows.json @@ -0,0 +1,8 @@ +{ + "values": [ + "twilightforest:triple_bow", + "twilightforest:seeker_bow", + "twilightforest:ice_bow", + "twilightforest:ender_bow" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/tools/shields.json b/src/generated/resources/data/forge/tags/items/tools/shields.json new file mode 100644 index 0000000000..d34f5f18de --- /dev/null +++ b/src/generated/resources/data/forge/tags/items/tools/shields.json @@ -0,0 +1,5 @@ +{ + "values": [ + "twilightforest:knightmetal_shield" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/beacon_base_blocks.json b/src/generated/resources/data/minecraft/tags/blocks/beacon_base_blocks.json new file mode 100644 index 0000000000..63c69c3161 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/beacon_base_blocks.json @@ -0,0 +1,10 @@ +{ + "values": [ + "#twilightforest:storage_blocks/arctic_fur", + "#twilightforest:storage_blocks/carminite", + "#twilightforest:storage_blocks/fiery", + "#twilightforest:storage_blocks/ironwood", + "#twilightforest:storage_blocks/knightmetal", + "#twilightforest:storage_blocks/steeleaf" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/climbable.json b/src/generated/resources/data/minecraft/tags/blocks/climbable.json new file mode 100644 index 0000000000..02b314d7d0 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/climbable.json @@ -0,0 +1,7 @@ +{ + "values": [ + "twilightforest:iron_ladder", + "twilightforest:root_strand", + "#twilightforest:hollow_logs_climbable" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/dampens_vibrations.json b/src/generated/resources/data/minecraft/tags/blocks/dampens_vibrations.json new file mode 100644 index 0000000000..9e65cebd0e --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/dampens_vibrations.json @@ -0,0 +1,7 @@ +{ + "values": [ + "twilightforest:arctic_fur_block", + "twilightforest:fluffy_cloud", + "twilightforest:wispy_cloud" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/dirt.json b/src/generated/resources/data/minecraft/tags/blocks/dirt.json new file mode 100644 index 0000000000..66e7da7bd6 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/dirt.json @@ -0,0 +1,5 @@ +{ + "values": [ + "twilightforest:uberous_soil" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/dragon_immune.json b/src/generated/resources/data/minecraft/tags/blocks/dragon_immune.json new file mode 100644 index 0000000000..908b8e1dee --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/dragon_immune.json @@ -0,0 +1,8 @@ +{ + "values": [ + "#twilightforest:common_protections", + "twilightforest:giant_obsidian", + "twilightforest:fake_diamond", + "twilightforest:fake_gold" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/features_cannot_replace.json b/src/generated/resources/data/minecraft/tags/blocks/features_cannot_replace.json new file mode 100644 index 0000000000..2dfc142797 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/features_cannot_replace.json @@ -0,0 +1,7 @@ +{ + "values": [ + "#twilightforest:common_protections", + "twilightforest:liveroot_block", + "twilightforest:mangrove_root" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/fence_gates.json b/src/generated/resources/data/minecraft/tags/blocks/fence_gates.json new file mode 100644 index 0000000000..eb4aeb48a2 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/fence_gates.json @@ -0,0 +1,12 @@ +{ + "values": [ + "twilightforest:twilight_oak_fence_gate", + "twilightforest:canopy_fence_gate", + "twilightforest:mangrove_fence_gate", + "twilightforest:dark_fence_gate", + "twilightforest:time_fence_gate", + "twilightforest:transformation_fence_gate", + "twilightforest:mining_fence_gate", + "twilightforest:sorting_fence_gate" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/flower_pots.json b/src/generated/resources/data/minecraft/tags/blocks/flower_pots.json new file mode 100644 index 0000000000..04513a43bb --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/flower_pots.json @@ -0,0 +1,20 @@ +{ + "values": [ + "twilightforest:potted_twilight_oak_sapling", + "twilightforest:potted_canopy_sapling", + "twilightforest:potted_mangrove_sapling", + "twilightforest:potted_darkwood_sapling", + "twilightforest:potted_rainbow_oak_sapling", + "twilightforest:potted_hollow_oak_sapling", + "twilightforest:potted_time_sapling", + "twilightforest:potted_transformation_sapling", + "twilightforest:potted_mining_sapling", + "twilightforest:potted_sorting_sapling", + "twilightforest:potted_mayapple", + "twilightforest:potted_fiddlehead", + "twilightforest:potted_mushgloom", + "twilightforest:potted_thorn", + "twilightforest:potted_green_thorn", + "twilightforest:potted_dead_thorn" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/frog_prefer_jump_to.json b/src/generated/resources/data/minecraft/tags/blocks/frog_prefer_jump_to.json new file mode 100644 index 0000000000..a6c254b360 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/frog_prefer_jump_to.json @@ -0,0 +1,5 @@ +{ + "values": [ + "twilightforest:huge_lily_pad" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/invalid_spawn_inside.json b/src/generated/resources/data/minecraft/tags/blocks/invalid_spawn_inside.json new file mode 100644 index 0000000000..5545365a5c --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/invalid_spawn_inside.json @@ -0,0 +1,5 @@ +{ + "values": [ + "twilightforest:twilight_portal" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/leaves.json b/src/generated/resources/data/minecraft/tags/blocks/leaves.json new file mode 100644 index 0000000000..2943edf594 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/leaves.json @@ -0,0 +1,15 @@ +{ + "values": [ + "twilightforest:rainbow_oak_leaves", + "twilightforest:twilight_oak_leaves", + "twilightforest:canopy_leaves", + "twilightforest:mangrove_leaves", + "twilightforest:dark_leaves", + "twilightforest:time_leaves", + "twilightforest:transformation_leaves", + "twilightforest:mining_leaves", + "twilightforest:sorting_leaves", + "twilightforest:thorn_leaves", + "twilightforest:beanstalk_leaves" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/logs.json b/src/generated/resources/data/minecraft/tags/blocks/logs.json new file mode 100644 index 0000000000..0c770b26f7 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/logs.json @@ -0,0 +1,5 @@ +{ + "values": [ + "#twilightforest:logs" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/logs_that_burn.json b/src/generated/resources/data/minecraft/tags/blocks/logs_that_burn.json new file mode 100644 index 0000000000..3ce1f080c4 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/logs_that_burn.json @@ -0,0 +1,11 @@ +{ + "values": [ + "#twilightforest:twilight_oak_logs", + "#twilightforest:canopy_logs", + "#twilightforest:mangrove_logs", + "#twilightforest:timewood_logs", + "#twilightforest:transwood_logs", + "#twilightforest:mining_logs", + "#twilightforest:sortwood_logs" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/mineable/axe.json b/src/generated/resources/data/minecraft/tags/blocks/mineable/axe.json new file mode 100644 index 0000000000..9fbc7b7594 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/mineable/axe.json @@ -0,0 +1,40 @@ +{ + "values": [ + "twilightforest:hedge", + "twilightforest:root", + "twilightforest:liveroot_block", + "twilightforest:mangrove_root", + "twilightforest:uncrafting_table", + "twilightforest:encased_smoker", + "twilightforest:encased_fire_jet", + "twilightforest:time_log_core", + "twilightforest:transformation_log_core", + "twilightforest:mining_log_core", + "twilightforest:sorting_log_core", + "twilightforest:reappearing_block", + "twilightforest:antibuilder", + "twilightforest:carminite_reactor", + "twilightforest:carminite_builder", + "twilightforest:ghast_trap", + "twilightforest:huge_stalk", + "twilightforest:huge_mushgloom", + "twilightforest:huge_mushgloom_stem", + "twilightforest:cinder_log", + "twilightforest:cinder_wood", + "twilightforest:ironwood_block", + "twilightforest:death_tome_spawner", + "twilightforest:empty_canopy_bookshelf", + "twilightforest:canopy_bookshelf", + "twilightforest:twilight_oak_chest", + "twilightforest:canopy_chest", + "twilightforest:mangrove_chest", + "twilightforest:dark_chest", + "twilightforest:time_chest", + "twilightforest:transformation_chest", + "twilightforest:mining_chest", + "twilightforest:sorting_chest", + "#twilightforest:banisters", + "#twilightforest:hollow_logs", + "#twilightforest:towerwood" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/mineable/hoe.json b/src/generated/resources/data/minecraft/tags/blocks/mineable/hoe.json new file mode 100644 index 0000000000..8e53bf7caa --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/mineable/hoe.json @@ -0,0 +1,18 @@ +{ + "values": [ + "twilightforest:twilight_oak_leaves", + "twilightforest:canopy_leaves", + "twilightforest:mangrove_leaves", + "twilightforest:dark_leaves", + "twilightforest:rainbow_oak_leaves", + "twilightforest:time_leaves", + "twilightforest:transformation_leaves", + "twilightforest:mining_leaves", + "twilightforest:sorting_leaves", + "twilightforest:thorn_leaves", + "twilightforest:thorn_rose", + "twilightforest:beanstalk_leaves", + "twilightforest:steeleaf_block", + "twilightforest:arctic_fur_block" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json b/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json new file mode 100644 index 0000000000..0bc7d04991 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json @@ -0,0 +1,49 @@ +{ + "values": [ + "twilightforest:nagastone", + "twilightforest:nagastone_head", + "twilightforest:stronghold_shield", + "twilightforest:trophy_pedestal", + "twilightforest:aurora_pillar", + "twilightforest:aurora_slab", + "twilightforest:underbrick", + "twilightforest:mossy_underbrick", + "twilightforest:cracked_underbrick", + "twilightforest:underbrick_floor", + "twilightforest:deadrock", + "twilightforest:cracked_deadrock", + "twilightforest:weathered_deadrock", + "twilightforest:trollsteinn", + "twilightforest:giant_leaves", + "twilightforest:giant_obsidian", + "twilightforest:giant_cobblestone", + "twilightforest:giant_log", + "twilightforest:cinder_furnace", + "twilightforest:twilight_portal_miniature_structure", + "twilightforest:naga_courtyard_miniature_structure", + "twilightforest:lich_tower_miniature_structure", + "twilightforest:knightmetal_block", + "twilightforest:ironwood_block", + "twilightforest:fiery_block", + "twilightforest:spiral_bricks", + "twilightforest:etched_nagastone", + "twilightforest:nagastone_pillar", + "twilightforest:nagastone_stairs_left", + "twilightforest:nagastone_stairs_right", + "twilightforest:mossy_etched_nagastone", + "twilightforest:mossy_nagastone_pillar", + "twilightforest:mossy_nagastone_stairs_left", + "twilightforest:mossy_nagastone_stairs_right", + "twilightforest:cracked_etched_nagastone", + "twilightforest:cracked_nagastone_pillar", + "twilightforest:cracked_nagastone_stairs_left", + "twilightforest:cracked_nagastone_stairs_right", + "twilightforest:iron_ladder", + "twilightforest:twisted_stone", + "twilightforest:twisted_stone_pillar", + "twilightforest:keepsake_casket", + "twilightforest:bold_stone_pillar", + "#twilightforest:mazestone", + "#twilightforest:castle_blocks" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/mineable/shovel.json b/src/generated/resources/data/minecraft/tags/blocks/mineable/shovel.json new file mode 100644 index 0000000000..e5a163fbab --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/mineable/shovel.json @@ -0,0 +1,7 @@ +{ + "values": [ + "twilightforest:smoker", + "twilightforest:fire_jet", + "twilightforest:uberous_soil" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/moss_replaceable.json b/src/generated/resources/data/minecraft/tags/blocks/moss_replaceable.json new file mode 100644 index 0000000000..17c62f1702 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/moss_replaceable.json @@ -0,0 +1,7 @@ +{ + "values": [ + "twilightforest:root", + "twilightforest:liveroot_block", + "twilightforest:trollsteinn" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/mushroom_grow_block.json b/src/generated/resources/data/minecraft/tags/blocks/mushroom_grow_block.json new file mode 100644 index 0000000000..66e7da7bd6 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/mushroom_grow_block.json @@ -0,0 +1,5 @@ +{ + "values": [ + "twilightforest:uberous_soil" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/needs_diamond_tool.json b/src/generated/resources/data/minecraft/tags/blocks/needs_diamond_tool.json new file mode 100644 index 0000000000..625cbb721b --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/needs_diamond_tool.json @@ -0,0 +1,10 @@ +{ + "values": [ + "twilightforest:aurora_block", + "twilightforest:deadrock", + "twilightforest:cracked_deadrock", + "twilightforest:weathered_deadrock", + "#twilightforest:castle_blocks", + "#twilightforest:mazestone" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/needs_iron_tool.json b/src/generated/resources/data/minecraft/tags/blocks/needs_iron_tool.json new file mode 100644 index 0000000000..5594400f86 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/needs_iron_tool.json @@ -0,0 +1,6 @@ +{ + "values": [ + "twilightforest:fiery_block", + "twilightforest:knightmetal_block" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/needs_stone_tool.json b/src/generated/resources/data/minecraft/tags/blocks/needs_stone_tool.json new file mode 100644 index 0000000000..affe3c9573 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/needs_stone_tool.json @@ -0,0 +1,9 @@ +{ + "values": [ + "twilightforest:underbrick", + "twilightforest:cracked_underbrick", + "twilightforest:mossy_underbrick", + "twilightforest:underbrick_floor", + "twilightforest:iron_ladder" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/occludes_vibration_signals.json b/src/generated/resources/data/minecraft/tags/blocks/occludes_vibration_signals.json new file mode 100644 index 0000000000..fce3c65e35 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/occludes_vibration_signals.json @@ -0,0 +1,5 @@ +{ + "values": [ + "twilightforest:arctic_fur_block" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/overworld_carver_replaceables.json b/src/generated/resources/data/minecraft/tags/blocks/overworld_carver_replaceables.json new file mode 100644 index 0000000000..00f11fd076 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/overworld_carver_replaceables.json @@ -0,0 +1,5 @@ +{ + "values": [ + "twilightforest:trollsteinn" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/planks.json b/src/generated/resources/data/minecraft/tags/blocks/planks.json new file mode 100644 index 0000000000..dfc86d18be --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/planks.json @@ -0,0 +1,17 @@ +{ + "values": [ + "twilightforest:twilight_oak_planks", + "twilightforest:canopy_planks", + "twilightforest:mangrove_planks", + "twilightforest:dark_planks", + "twilightforest:time_planks", + "twilightforest:transformation_planks", + "twilightforest:mining_planks", + "twilightforest:sorting_planks", + "twilightforest:towerwood", + "twilightforest:encased_towerwood", + "twilightforest:cracked_towerwood", + "twilightforest:mossy_towerwood", + "twilightforest:infested_towerwood" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/portals.json b/src/generated/resources/data/minecraft/tags/blocks/portals.json new file mode 100644 index 0000000000..5545365a5c --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/portals.json @@ -0,0 +1,5 @@ +{ + "values": [ + "twilightforest:twilight_portal" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/replaceable_plants.json b/src/generated/resources/data/minecraft/tags/blocks/replaceable_plants.json new file mode 100644 index 0000000000..60da7fcc61 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/replaceable_plants.json @@ -0,0 +1,12 @@ +{ + "values": [ + "twilightforest:mayapple", + "twilightforest:fiddlehead", + "twilightforest:mushgloom", + "twilightforest:torchberry_plant", + "twilightforest:root_strand", + "twilightforest:moss_patch", + "twilightforest:clover_patch", + "twilightforest:fallen_leaves" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/saplings.json b/src/generated/resources/data/minecraft/tags/blocks/saplings.json new file mode 100644 index 0000000000..7f540c86d2 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/saplings.json @@ -0,0 +1,14 @@ +{ + "values": [ + "twilightforest:twilight_oak_sapling", + "twilightforest:canopy_sapling", + "twilightforest:mangrove_sapling", + "twilightforest:darkwood_sapling", + "twilightforest:time_sapling", + "twilightforest:transformation_sapling", + "twilightforest:mining_sapling", + "twilightforest:sorting_sapling", + "twilightforest:hollow_oak_sapling", + "twilightforest:rainbow_oak_sapling" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/slabs.json b/src/generated/resources/data/minecraft/tags/blocks/slabs.json new file mode 100644 index 0000000000..d5fb2ef1ba --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/slabs.json @@ -0,0 +1,5 @@ +{ + "values": [ + "twilightforest:aurora_slab" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/small_dripleaf_placeable.json b/src/generated/resources/data/minecraft/tags/blocks/small_dripleaf_placeable.json new file mode 100644 index 0000000000..66e7da7bd6 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/small_dripleaf_placeable.json @@ -0,0 +1,5 @@ +{ + "values": [ + "twilightforest:uberous_soil" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/stairs.json b/src/generated/resources/data/minecraft/tags/blocks/stairs.json new file mode 100644 index 0000000000..85663c2f0a --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/stairs.json @@ -0,0 +1,16 @@ +{ + "values": [ + "twilightforest:castle_brick_stairs", + "twilightforest:worn_castle_brick_stairs", + "twilightforest:cracked_castle_brick_stairs", + "twilightforest:mossy_castle_brick_stairs", + "twilightforest:encased_castle_brick_stairs", + "twilightforest:bold_castle_brick_stairs", + "twilightforest:nagastone_stairs_left", + "twilightforest:nagastone_stairs_right", + "twilightforest:mossy_nagastone_stairs_left", + "twilightforest:mossy_nagastone_stairs_right", + "twilightforest:cracked_nagastone_stairs_left", + "twilightforest:cracked_nagastone_stairs_right" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/standing_signs.json b/src/generated/resources/data/minecraft/tags/blocks/standing_signs.json new file mode 100644 index 0000000000..7ac2b45773 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/standing_signs.json @@ -0,0 +1,12 @@ +{ + "values": [ + "twilightforest:twilight_oak_sign", + "twilightforest:canopy_sign", + "twilightforest:mangrove_sign", + "twilightforest:dark_sign", + "twilightforest:time_sign", + "twilightforest:transformation_sign", + "twilightforest:mining_sign", + "twilightforest:sorting_sign" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/strider_warm_blocks.json b/src/generated/resources/data/minecraft/tags/blocks/strider_warm_blocks.json new file mode 100644 index 0000000000..567fd67368 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/strider_warm_blocks.json @@ -0,0 +1,5 @@ +{ + "values": [ + "twilightforest:fiery_block" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/wall_signs.json b/src/generated/resources/data/minecraft/tags/blocks/wall_signs.json new file mode 100644 index 0000000000..59ff4c7e1d --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/wall_signs.json @@ -0,0 +1,12 @@ +{ + "values": [ + "twilightforest:twilight_wall_sign", + "twilightforest:canopy_wall_sign", + "twilightforest:mangrove_wall_sign", + "twilightforest:dark_wall_sign", + "twilightforest:time_wall_sign", + "twilightforest:transformation_wall_sign", + "twilightforest:mining_wall_sign", + "twilightforest:sorting_wall_sign" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/wither_immune.json b/src/generated/resources/data/minecraft/tags/blocks/wither_immune.json new file mode 100644 index 0000000000..eccaaa52a7 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/wither_immune.json @@ -0,0 +1,7 @@ +{ + "values": [ + "#twilightforest:common_protections", + "twilightforest:fake_diamond", + "twilightforest:fake_gold" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/wooden_buttons.json b/src/generated/resources/data/minecraft/tags/blocks/wooden_buttons.json new file mode 100644 index 0000000000..96942b798f --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/wooden_buttons.json @@ -0,0 +1,12 @@ +{ + "values": [ + "twilightforest:twilight_oak_button", + "twilightforest:canopy_button", + "twilightforest:mangrove_button", + "twilightforest:dark_button", + "twilightforest:time_button", + "twilightforest:transformation_button", + "twilightforest:mining_button", + "twilightforest:sorting_button" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/wooden_doors.json b/src/generated/resources/data/minecraft/tags/blocks/wooden_doors.json new file mode 100644 index 0000000000..a41f371875 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/wooden_doors.json @@ -0,0 +1,12 @@ +{ + "values": [ + "twilightforest:twilight_oak_door", + "twilightforest:canopy_door", + "twilightforest:mangrove_door", + "twilightforest:dark_door", + "twilightforest:time_door", + "twilightforest:transformation_door", + "twilightforest:mining_door", + "twilightforest:sorting_door" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/wooden_fences.json b/src/generated/resources/data/minecraft/tags/blocks/wooden_fences.json new file mode 100644 index 0000000000..cd0e2d5b1c --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/wooden_fences.json @@ -0,0 +1,12 @@ +{ + "values": [ + "twilightforest:twilight_oak_fence", + "twilightforest:canopy_fence", + "twilightforest:mangrove_fence", + "twilightforest:dark_fence", + "twilightforest:time_fence", + "twilightforest:transformation_fence", + "twilightforest:mining_fence", + "twilightforest:sorting_fence" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/wooden_pressure_plates.json b/src/generated/resources/data/minecraft/tags/blocks/wooden_pressure_plates.json new file mode 100644 index 0000000000..962f626582 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/wooden_pressure_plates.json @@ -0,0 +1,12 @@ +{ + "values": [ + "twilightforest:twilight_oak_pressure_plate", + "twilightforest:canopy_pressure_plate", + "twilightforest:mangrove_pressure_plate", + "twilightforest:dark_pressure_plate", + "twilightforest:time_pressure_plate", + "twilightforest:transformation_pressure_plate", + "twilightforest:mining_pressure_plate", + "twilightforest:sorting_pressure_plate" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/wooden_slabs.json b/src/generated/resources/data/minecraft/tags/blocks/wooden_slabs.json new file mode 100644 index 0000000000..fe39dd35cc --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/wooden_slabs.json @@ -0,0 +1,12 @@ +{ + "values": [ + "twilightforest:twilight_oak_slab", + "twilightforest:canopy_slab", + "twilightforest:mangrove_slab", + "twilightforest:dark_slab", + "twilightforest:time_slab", + "twilightforest:transformation_slab", + "twilightforest:mining_slab", + "twilightforest:sorting_slab" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/wooden_stairs.json b/src/generated/resources/data/minecraft/tags/blocks/wooden_stairs.json new file mode 100644 index 0000000000..4c92e85931 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/wooden_stairs.json @@ -0,0 +1,12 @@ +{ + "values": [ + "twilightforest:twilight_oak_stairs", + "twilightforest:canopy_stairs", + "twilightforest:mangrove_stairs", + "twilightforest:dark_stairs", + "twilightforest:time_stairs", + "twilightforest:transformation_stairs", + "twilightforest:mining_stairs", + "twilightforest:sorting_stairs" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/wooden_trapdoors.json b/src/generated/resources/data/minecraft/tags/blocks/wooden_trapdoors.json new file mode 100644 index 0000000000..255d4ea4d1 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/wooden_trapdoors.json @@ -0,0 +1,12 @@ +{ + "values": [ + "twilightforest:twilight_oak_trapdoor", + "twilightforest:canopy_trapdoor", + "twilightforest:mangrove_trapdoor", + "twilightforest:dark_trapdoor", + "twilightforest:time_trapdoor", + "twilightforest:transformation_trapdoor", + "twilightforest:mining_trapdoor", + "twilightforest:sorting_trapdoor" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/damage_type/always_most_significant_fall.json b/src/generated/resources/data/minecraft/tags/damage_type/always_most_significant_fall.json new file mode 100644 index 0000000000..b80940fdcc --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/damage_type/always_most_significant_fall.json @@ -0,0 +1,5 @@ +{ + "values": [ + "twilightforest:expired" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/damage_type/bypasses_armor.json b/src/generated/resources/data/minecraft/tags/damage_type/bypasses_armor.json new file mode 100644 index 0000000000..c3e58c74e3 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/damage_type/bypasses_armor.json @@ -0,0 +1,14 @@ +{ + "values": [ + "twilightforest:ghast_tear", + "twilightforest:slam", + "twilightforest:lich_bolt", + "twilightforest:lich_bomb", + "twilightforest:leaf_brain", + "twilightforest:lost_words", + "twilightforest:schooled", + "twilightforest:lifedrain", + "twilightforest:expired", + "twilightforest:yeeted" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/damage_type/bypasses_enchantments.json b/src/generated/resources/data/minecraft/tags/damage_type/bypasses_enchantments.json new file mode 100644 index 0000000000..37ae5f783a --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/damage_type/bypasses_enchantments.json @@ -0,0 +1,5 @@ +{ + "values": [ + "twilightforest:falling_ice" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/damage_type/bypasses_invulnerability.json b/src/generated/resources/data/minecraft/tags/damage_type/bypasses_invulnerability.json new file mode 100644 index 0000000000..b80940fdcc --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/damage_type/bypasses_invulnerability.json @@ -0,0 +1,5 @@ +{ + "values": [ + "twilightforest:expired" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/damage_type/bypasses_resistance.json b/src/generated/resources/data/minecraft/tags/damage_type/bypasses_resistance.json new file mode 100644 index 0000000000..b80940fdcc --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/damage_type/bypasses_resistance.json @@ -0,0 +1,5 @@ +{ + "values": [ + "twilightforest:expired" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/damage_type/damages_helmet.json b/src/generated/resources/data/minecraft/tags/damage_type/damages_helmet.json new file mode 100644 index 0000000000..6f44b5e531 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/damage_type/damages_helmet.json @@ -0,0 +1,6 @@ +{ + "values": [ + "twilightforest:ghast_tear", + "twilightforest:thrown_block" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/damage_type/is_fall.json b/src/generated/resources/data/minecraft/tags/damage_type/is_fall.json new file mode 100644 index 0000000000..ba31d47878 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/damage_type/is_fall.json @@ -0,0 +1,5 @@ +{ + "values": [ + "twilightforest:yeeted" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/damage_type/is_fire.json b/src/generated/resources/data/minecraft/tags/damage_type/is_fire.json new file mode 100644 index 0000000000..1a09777b4f --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/damage_type/is_fire.json @@ -0,0 +1,6 @@ +{ + "values": [ + "twilightforest:hydra_mortar", + "twilightforest:hydra_fire" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/damage_type/is_projectile.json b/src/generated/resources/data/minecraft/tags/damage_type/is_projectile.json new file mode 100644 index 0000000000..bf60bd767e --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/damage_type/is_projectile.json @@ -0,0 +1,15 @@ +{ + "values": [ + "twilightforest:twilight_scepter", + "twilightforest:lich_bolt", + "twilightforest:lich_bomb", + "twilightforest:thrown_pickaxe", + "twilightforest:thrown_axe", + "twilightforest:thrown_block", + "twilightforest:leaf_brain", + "twilightforest:lost_words", + "twilightforest:schooled", + "twilightforest:snowball_fight", + "twilightforest:lifedrain" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/damage_type/no_anger.json b/src/generated/resources/data/minecraft/tags/damage_type/no_anger.json new file mode 100644 index 0000000000..ae1cd2d41e --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/damage_type/no_anger.json @@ -0,0 +1,5 @@ +{ + "values": [ + "twilightforest:slam" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/damage_type/witch_resistant_to.json b/src/generated/resources/data/minecraft/tags/damage_type/witch_resistant_to.json new file mode 100644 index 0000000000..f84df4562e --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/damage_type/witch_resistant_to.json @@ -0,0 +1,9 @@ +{ + "values": [ + "twilightforest:lich_bomb", + "twilightforest:lich_bolt", + "twilightforest:leaf_brain", + "twilightforest:lost_words", + "twilightforest:schooled" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/entity_types/arrows.json b/src/generated/resources/data/minecraft/tags/entity_types/arrows.json new file mode 100644 index 0000000000..2e6c52167f --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/entity_types/arrows.json @@ -0,0 +1,6 @@ +{ + "values": [ + "twilightforest:ice_arrow", + "twilightforest:seeker_arrow" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/entity_types/fall_damage_immune.json b/src/generated/resources/data/minecraft/tags/entity_types/fall_damage_immune.json new file mode 100644 index 0000000000..03dc964aa1 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/entity_types/fall_damage_immune.json @@ -0,0 +1,22 @@ +{ + "values": [ + "twilightforest:naga", + "twilightforest:squirrel", + "twilightforest:wraith", + "twilightforest:carminite_golem", + "twilightforest:death_tome", + "twilightforest:ur_ghast", + "twilightforest:carminite_ghastling", + "twilightforest:knight_phantom", + "twilightforest:snow_queen", + "twilightforest:penguin", + "twilightforest:raven", + "twilightforest:snow_guardian", + "twilightforest:stable_ice_core", + "twilightforest:mosquito_swarm", + "twilightforest:unstable_ice_core", + "twilightforest:ice_crystal", + "twilightforest:carminite_ghastguard", + "twilightforest:tiny_bird" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/entity_types/freeze_hurts_extra_types.json b/src/generated/resources/data/minecraft/tags/entity_types/freeze_hurts_extra_types.json new file mode 100644 index 0000000000..406d8cdb75 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/entity_types/freeze_hurts_extra_types.json @@ -0,0 +1,5 @@ +{ + "values": [ + "twilightforest:fire_beetle" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/entity_types/freeze_immune_entity_types.json b/src/generated/resources/data/minecraft/tags/entity_types/freeze_immune_entity_types.json new file mode 100644 index 0000000000..d2d3e16f6e --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/entity_types/freeze_immune_entity_types.json @@ -0,0 +1,14 @@ +{ + "values": [ + "twilightforest:penguin", + "twilightforest:stable_ice_core", + "twilightforest:unstable_ice_core", + "twilightforest:snow_guardian", + "twilightforest:ice_crystal", + "twilightforest:wraith", + "twilightforest:knight_phantom", + "twilightforest:winter_wolf", + "twilightforest:yeti", + "#twilightforest:bosses" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/entity_types/frog_food.json b/src/generated/resources/data/minecraft/tags/entity_types/frog_food.json new file mode 100644 index 0000000000..5f3f6e0d89 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/entity_types/frog_food.json @@ -0,0 +1,5 @@ +{ + "values": [ + "twilightforest:maze_slime" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/entity_types/impact_projectiles.json b/src/generated/resources/data/minecraft/tags/entity_types/impact_projectiles.json new file mode 100644 index 0000000000..2f61ec4141 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/entity_types/impact_projectiles.json @@ -0,0 +1,14 @@ +{ + "values": [ + "twilightforest:nature_bolt", + "twilightforest:lich_bolt", + "twilightforest:wand_bolt", + "twilightforest:lich_bomb", + "twilightforest:moonworm_shot", + "twilightforest:slime_blob", + "twilightforest:thrown_wep", + "twilightforest:thrown_ice", + "twilightforest:falling_ice", + "twilightforest:ice_snowball" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/entity_types/powder_snow_walkable_mobs.json b/src/generated/resources/data/minecraft/tags/entity_types/powder_snow_walkable_mobs.json new file mode 100644 index 0000000000..cda178a750 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/entity_types/powder_snow_walkable_mobs.json @@ -0,0 +1,17 @@ +{ + "values": [ + "twilightforest:penguin", + "twilightforest:stable_ice_core", + "twilightforest:unstable_ice_core", + "twilightforest:snow_guardian", + "twilightforest:ice_crystal", + "twilightforest:raven", + "twilightforest:squirrel", + "twilightforest:dwarf_rabbit", + "twilightforest:tiny_bird", + "twilightforest:kobold", + "twilightforest:death_tome", + "twilightforest:mosquito_swarm", + "twilightforest:towerwood_borer" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/entity_types/skeletons.json b/src/generated/resources/data/minecraft/tags/entity_types/skeletons.json new file mode 100644 index 0000000000..97defeb088 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/entity_types/skeletons.json @@ -0,0 +1,5 @@ +{ + "values": [ + "twilightforest:skeleton_druid" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/items/axes.json b/src/generated/resources/data/minecraft/tags/items/axes.json new file mode 100644 index 0000000000..e3a6e1c0e2 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/items/axes.json @@ -0,0 +1,7 @@ +{ + "values": [ + "twilightforest:ironwood_axe", + "twilightforest:steeleaf_axe", + "twilightforest:knightmetal_axe" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/items/boats.json b/src/generated/resources/data/minecraft/tags/items/boats.json new file mode 100644 index 0000000000..05cc38b06f --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/items/boats.json @@ -0,0 +1,12 @@ +{ + "values": [ + "twilightforest:twilight_oak_boat", + "twilightforest:canopy_boat", + "twilightforest:mangrove_boat", + "twilightforest:dark_boat", + "twilightforest:time_boat", + "twilightforest:transformation_boat", + "twilightforest:mining_boat", + "twilightforest:sorting_boat" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/items/chest_boats.json b/src/generated/resources/data/minecraft/tags/items/chest_boats.json new file mode 100644 index 0000000000..750706cc43 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/items/chest_boats.json @@ -0,0 +1,12 @@ +{ + "values": [ + "twilightforest:twilight_oak_chest_boat", + "twilightforest:canopy_chest_boat", + "twilightforest:mangrove_chest_boat", + "twilightforest:dark_chest_boat", + "twilightforest:time_chest_boat", + "twilightforest:transformation_chest_boat", + "twilightforest:mining_chest_boat", + "twilightforest:sorting_chest_boat" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/items/cluster_max_harvestables.json b/src/generated/resources/data/minecraft/tags/items/cluster_max_harvestables.json new file mode 100644 index 0000000000..4778be8d22 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/items/cluster_max_harvestables.json @@ -0,0 +1,10 @@ +{ + "values": [ + "twilightforest:ironwood_pickaxe", + "twilightforest:steeleaf_pickaxe", + "twilightforest:knightmetal_pickaxe", + "twilightforest:mazebreaker_pickaxe", + "twilightforest:fiery_pickaxe", + "twilightforest:giant_pickaxe" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/items/freeze_immune_wearables.json b/src/generated/resources/data/minecraft/tags/items/freeze_immune_wearables.json new file mode 100644 index 0000000000..6ff26a9c4e --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/items/freeze_immune_wearables.json @@ -0,0 +1,16 @@ +{ + "values": [ + "twilightforest:fiery_helmet", + "twilightforest:fiery_chestplate", + "twilightforest:fiery_leggings", + "twilightforest:fiery_boots", + "twilightforest:arctic_helmet", + "twilightforest:arctic_chestplate", + "twilightforest:arctic_leggings", + "twilightforest:arctic_boots", + "twilightforest:yeti_helmet", + "twilightforest:yeti_chestplate", + "twilightforest:yeti_leggings", + "twilightforest:yeti_boots" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/items/hoes.json b/src/generated/resources/data/minecraft/tags/items/hoes.json new file mode 100644 index 0000000000..e567c82862 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/items/hoes.json @@ -0,0 +1,6 @@ +{ + "values": [ + "twilightforest:ironwood_hoe", + "twilightforest:steeleaf_hoe" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/items/leaves.json b/src/generated/resources/data/minecraft/tags/items/leaves.json new file mode 100644 index 0000000000..2943edf594 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/items/leaves.json @@ -0,0 +1,15 @@ +{ + "values": [ + "twilightforest:rainbow_oak_leaves", + "twilightforest:twilight_oak_leaves", + "twilightforest:canopy_leaves", + "twilightforest:mangrove_leaves", + "twilightforest:dark_leaves", + "twilightforest:time_leaves", + "twilightforest:transformation_leaves", + "twilightforest:mining_leaves", + "twilightforest:sorting_leaves", + "twilightforest:thorn_leaves", + "twilightforest:beanstalk_leaves" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/items/logs.json b/src/generated/resources/data/minecraft/tags/items/logs.json new file mode 100644 index 0000000000..0c770b26f7 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/items/logs.json @@ -0,0 +1,5 @@ +{ + "values": [ + "#twilightforest:logs" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/items/logs_that_burn.json b/src/generated/resources/data/minecraft/tags/items/logs_that_burn.json new file mode 100644 index 0000000000..3ce1f080c4 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/items/logs_that_burn.json @@ -0,0 +1,11 @@ +{ + "values": [ + "#twilightforest:twilight_oak_logs", + "#twilightforest:canopy_logs", + "#twilightforest:mangrove_logs", + "#twilightforest:timewood_logs", + "#twilightforest:transwood_logs", + "#twilightforest:mining_logs", + "#twilightforest:sortwood_logs" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/items/music_discs.json b/src/generated/resources/data/minecraft/tags/items/music_discs.json new file mode 100644 index 0000000000..56fe46799a --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/items/music_discs.json @@ -0,0 +1,13 @@ +{ + "values": [ + "twilightforest:music_disc_findings", + "twilightforest:music_disc_home", + "twilightforest:music_disc_maker", + "twilightforest:music_disc_motion", + "twilightforest:music_disc_radiance", + "twilightforest:music_disc_steps", + "twilightforest:music_disc_superstitious", + "twilightforest:music_disc_thread", + "twilightforest:music_disc_wayfarer" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/items/pickaxes.json b/src/generated/resources/data/minecraft/tags/items/pickaxes.json new file mode 100644 index 0000000000..4778be8d22 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/items/pickaxes.json @@ -0,0 +1,10 @@ +{ + "values": [ + "twilightforest:ironwood_pickaxe", + "twilightforest:steeleaf_pickaxe", + "twilightforest:knightmetal_pickaxe", + "twilightforest:mazebreaker_pickaxe", + "twilightforest:fiery_pickaxe", + "twilightforest:giant_pickaxe" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/items/piglin_loved.json b/src/generated/resources/data/minecraft/tags/items/piglin_loved.json new file mode 100644 index 0000000000..aef1ea248a --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/items/piglin_loved.json @@ -0,0 +1,8 @@ +{ + "values": [ + "twilightforest:gold_minotaur_axe", + "twilightforest:charm_of_keeping_3", + "twilightforest:charm_of_life_2", + "twilightforest:lamp_of_cinders" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/items/planks.json b/src/generated/resources/data/minecraft/tags/items/planks.json new file mode 100644 index 0000000000..dfc86d18be --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/items/planks.json @@ -0,0 +1,17 @@ +{ + "values": [ + "twilightforest:twilight_oak_planks", + "twilightforest:canopy_planks", + "twilightforest:mangrove_planks", + "twilightforest:dark_planks", + "twilightforest:time_planks", + "twilightforest:transformation_planks", + "twilightforest:mining_planks", + "twilightforest:sorting_planks", + "twilightforest:towerwood", + "twilightforest:encased_towerwood", + "twilightforest:cracked_towerwood", + "twilightforest:mossy_towerwood", + "twilightforest:infested_towerwood" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/items/saplings.json b/src/generated/resources/data/minecraft/tags/items/saplings.json new file mode 100644 index 0000000000..7f540c86d2 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/items/saplings.json @@ -0,0 +1,14 @@ +{ + "values": [ + "twilightforest:twilight_oak_sapling", + "twilightforest:canopy_sapling", + "twilightforest:mangrove_sapling", + "twilightforest:darkwood_sapling", + "twilightforest:time_sapling", + "twilightforest:transformation_sapling", + "twilightforest:mining_sapling", + "twilightforest:sorting_sapling", + "twilightforest:hollow_oak_sapling", + "twilightforest:rainbow_oak_sapling" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/items/shovels.json b/src/generated/resources/data/minecraft/tags/items/shovels.json new file mode 100644 index 0000000000..d850106a5d --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/items/shovels.json @@ -0,0 +1,6 @@ +{ + "values": [ + "twilightforest:ironwood_shovel", + "twilightforest:steeleaf_shovel" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/items/signs.json b/src/generated/resources/data/minecraft/tags/items/signs.json new file mode 100644 index 0000000000..7ac2b45773 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/items/signs.json @@ -0,0 +1,12 @@ +{ + "values": [ + "twilightforest:twilight_oak_sign", + "twilightforest:canopy_sign", + "twilightforest:mangrove_sign", + "twilightforest:dark_sign", + "twilightforest:time_sign", + "twilightforest:transformation_sign", + "twilightforest:mining_sign", + "twilightforest:sorting_sign" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/items/slabs.json b/src/generated/resources/data/minecraft/tags/items/slabs.json new file mode 100644 index 0000000000..d5fb2ef1ba --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/items/slabs.json @@ -0,0 +1,5 @@ +{ + "values": [ + "twilightforest:aurora_slab" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/items/small_flowers.json b/src/generated/resources/data/minecraft/tags/items/small_flowers.json new file mode 100644 index 0000000000..f49c89fa6a --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/items/small_flowers.json @@ -0,0 +1,5 @@ +{ + "values": [ + "twilightforest:thorn_rose" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/items/stairs.json b/src/generated/resources/data/minecraft/tags/items/stairs.json new file mode 100644 index 0000000000..85663c2f0a --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/items/stairs.json @@ -0,0 +1,16 @@ +{ + "values": [ + "twilightforest:castle_brick_stairs", + "twilightforest:worn_castle_brick_stairs", + "twilightforest:cracked_castle_brick_stairs", + "twilightforest:mossy_castle_brick_stairs", + "twilightforest:encased_castle_brick_stairs", + "twilightforest:bold_castle_brick_stairs", + "twilightforest:nagastone_stairs_left", + "twilightforest:nagastone_stairs_right", + "twilightforest:mossy_nagastone_stairs_left", + "twilightforest:mossy_nagastone_stairs_right", + "twilightforest:cracked_nagastone_stairs_left", + "twilightforest:cracked_nagastone_stairs_right" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/items/swords.json b/src/generated/resources/data/minecraft/tags/items/swords.json new file mode 100644 index 0000000000..ae649705ab --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/items/swords.json @@ -0,0 +1,11 @@ +{ + "values": [ + "twilightforest:ironwood_sword", + "twilightforest:steeleaf_sword", + "twilightforest:knightmetal_sword", + "twilightforest:fiery_sword", + "twilightforest:giant_sword", + "twilightforest:ice_sword", + "twilightforest:glass_sword" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/items/wooden_buttons.json b/src/generated/resources/data/minecraft/tags/items/wooden_buttons.json new file mode 100644 index 0000000000..96942b798f --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/items/wooden_buttons.json @@ -0,0 +1,12 @@ +{ + "values": [ + "twilightforest:twilight_oak_button", + "twilightforest:canopy_button", + "twilightforest:mangrove_button", + "twilightforest:dark_button", + "twilightforest:time_button", + "twilightforest:transformation_button", + "twilightforest:mining_button", + "twilightforest:sorting_button" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/items/wooden_doors.json b/src/generated/resources/data/minecraft/tags/items/wooden_doors.json new file mode 100644 index 0000000000..a41f371875 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/items/wooden_doors.json @@ -0,0 +1,12 @@ +{ + "values": [ + "twilightforest:twilight_oak_door", + "twilightforest:canopy_door", + "twilightforest:mangrove_door", + "twilightforest:dark_door", + "twilightforest:time_door", + "twilightforest:transformation_door", + "twilightforest:mining_door", + "twilightforest:sorting_door" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/items/wooden_fences.json b/src/generated/resources/data/minecraft/tags/items/wooden_fences.json new file mode 100644 index 0000000000..cd0e2d5b1c --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/items/wooden_fences.json @@ -0,0 +1,12 @@ +{ + "values": [ + "twilightforest:twilight_oak_fence", + "twilightforest:canopy_fence", + "twilightforest:mangrove_fence", + "twilightforest:dark_fence", + "twilightforest:time_fence", + "twilightforest:transformation_fence", + "twilightforest:mining_fence", + "twilightforest:sorting_fence" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/items/wooden_pressure_plates.json b/src/generated/resources/data/minecraft/tags/items/wooden_pressure_plates.json new file mode 100644 index 0000000000..962f626582 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/items/wooden_pressure_plates.json @@ -0,0 +1,12 @@ +{ + "values": [ + "twilightforest:twilight_oak_pressure_plate", + "twilightforest:canopy_pressure_plate", + "twilightforest:mangrove_pressure_plate", + "twilightforest:dark_pressure_plate", + "twilightforest:time_pressure_plate", + "twilightforest:transformation_pressure_plate", + "twilightforest:mining_pressure_plate", + "twilightforest:sorting_pressure_plate" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/items/wooden_slabs.json b/src/generated/resources/data/minecraft/tags/items/wooden_slabs.json new file mode 100644 index 0000000000..fe39dd35cc --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/items/wooden_slabs.json @@ -0,0 +1,12 @@ +{ + "values": [ + "twilightforest:twilight_oak_slab", + "twilightforest:canopy_slab", + "twilightforest:mangrove_slab", + "twilightforest:dark_slab", + "twilightforest:time_slab", + "twilightforest:transformation_slab", + "twilightforest:mining_slab", + "twilightforest:sorting_slab" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/items/wooden_stairs.json b/src/generated/resources/data/minecraft/tags/items/wooden_stairs.json new file mode 100644 index 0000000000..4c92e85931 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/items/wooden_stairs.json @@ -0,0 +1,12 @@ +{ + "values": [ + "twilightforest:twilight_oak_stairs", + "twilightforest:canopy_stairs", + "twilightforest:mangrove_stairs", + "twilightforest:dark_stairs", + "twilightforest:time_stairs", + "twilightforest:transformation_stairs", + "twilightforest:mining_stairs", + "twilightforest:sorting_stairs" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/items/wooden_trapdoors.json b/src/generated/resources/data/minecraft/tags/items/wooden_trapdoors.json new file mode 100644 index 0000000000..255d4ea4d1 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/items/wooden_trapdoors.json @@ -0,0 +1,12 @@ +{ + "values": [ + "twilightforest:twilight_oak_trapdoor", + "twilightforest:canopy_trapdoor", + "twilightforest:mangrove_trapdoor", + "twilightforest:dark_trapdoor", + "twilightforest:time_trapdoor", + "twilightforest:transformation_trapdoor", + "twilightforest:mining_trapdoor", + "twilightforest:sorting_trapdoor" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/worldgen/biome/has_closer_water_fog.json b/src/generated/resources/data/minecraft/tags/worldgen/biome/has_closer_water_fog.json new file mode 100644 index 0000000000..3cd4e54dd4 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/worldgen/biome/has_closer_water_fog.json @@ -0,0 +1,7 @@ +{ + "values": [ + "twilightforest:spooky_forest", + "twilightforest:swamp", + "twilightforest:fire_swamp" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/worldgen/biome/snow_golem_melts.json b/src/generated/resources/data/minecraft/tags/worldgen/biome/snow_golem_melts.json new file mode 100644 index 0000000000..5c66c01734 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/worldgen/biome/snow_golem_melts.json @@ -0,0 +1,6 @@ +{ + "values": [ + "twilightforest:oak_savannah", + "twilightforest:fire_swamp" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/worldgen/biome/spawns_cold_variant_frogs.json b/src/generated/resources/data/minecraft/tags/worldgen/biome/spawns_cold_variant_frogs.json new file mode 100644 index 0000000000..385d760ee9 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/worldgen/biome/spawns_cold_variant_frogs.json @@ -0,0 +1,6 @@ +{ + "values": [ + "twilightforest:snowy_forest", + "twilightforest:glacier" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/worldgen/biome/spawns_snow_foxes.json b/src/generated/resources/data/minecraft/tags/worldgen/biome/spawns_snow_foxes.json new file mode 100644 index 0000000000..385d760ee9 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/worldgen/biome/spawns_snow_foxes.json @@ -0,0 +1,6 @@ +{ + "values": [ + "twilightforest:snowy_forest", + "twilightforest:glacier" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/worldgen/biome/spawns_warm_variant_frogs.json b/src/generated/resources/data/minecraft/tags/worldgen/biome/spawns_warm_variant_frogs.json new file mode 100644 index 0000000000..5c66c01734 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/worldgen/biome/spawns_warm_variant_frogs.json @@ -0,0 +1,6 @@ +{ + "values": [ + "twilightforest:oak_savannah", + "twilightforest:fire_swamp" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/worldgen/biome/without_patrol_spawns.json b/src/generated/resources/data/minecraft/tags/worldgen/biome/without_patrol_spawns.json new file mode 100644 index 0000000000..eadc590bda --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/worldgen/biome/without_patrol_spawns.json @@ -0,0 +1,5 @@ +{ + "values": [ + "#twilightforest:in_twilight_forest" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/worldgen/biome/without_wandering_trader_spawns.json b/src/generated/resources/data/minecraft/tags/worldgen/biome/without_wandering_trader_spawns.json new file mode 100644 index 0000000000..eadc590bda --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/worldgen/biome/without_wandering_trader_spawns.json @@ -0,0 +1,5 @@ +{ + "values": [ + "#twilightforest:in_twilight_forest" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/worldgen/biome/without_zombie_sieges.json b/src/generated/resources/data/minecraft/tags/worldgen/biome/without_zombie_sieges.json new file mode 100644 index 0000000000..eadc590bda --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/worldgen/biome/without_zombie_sieges.json @@ -0,0 +1,5 @@ +{ + "values": [ + "#twilightforest:in_twilight_forest" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/twilight/wood_palettes/acacia.json b/src/generated/resources/data/minecraft/twilight/wood_palettes/acacia.json new file mode 100644 index 0000000000..5d0842c6d5 --- /dev/null +++ b/src/generated/resources/data/minecraft/twilight/wood_palettes/acacia.json @@ -0,0 +1,10 @@ +{ + "banister": "twilightforest:acacia_banister", + "button": "minecraft:acacia_button", + "fence": "minecraft:acacia_fence", + "gate": "minecraft:acacia_fence_gate", + "planks": "minecraft:acacia_planks", + "plate": "minecraft:acacia_pressure_plate", + "slab": "minecraft:acacia_slab", + "stairs": "minecraft:acacia_stairs" +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/twilight/wood_palettes/birch.json b/src/generated/resources/data/minecraft/twilight/wood_palettes/birch.json new file mode 100644 index 0000000000..33d1886947 --- /dev/null +++ b/src/generated/resources/data/minecraft/twilight/wood_palettes/birch.json @@ -0,0 +1,10 @@ +{ + "banister": "twilightforest:birch_banister", + "button": "minecraft:birch_button", + "fence": "minecraft:birch_fence", + "gate": "minecraft:birch_fence_gate", + "planks": "minecraft:birch_planks", + "plate": "minecraft:birch_pressure_plate", + "slab": "minecraft:birch_slab", + "stairs": "minecraft:birch_stairs" +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/twilight/wood_palettes/crimson.json b/src/generated/resources/data/minecraft/twilight/wood_palettes/crimson.json new file mode 100644 index 0000000000..c64551b890 --- /dev/null +++ b/src/generated/resources/data/minecraft/twilight/wood_palettes/crimson.json @@ -0,0 +1,10 @@ +{ + "banister": "twilightforest:crimson_banister", + "button": "minecraft:crimson_button", + "fence": "minecraft:crimson_fence", + "gate": "minecraft:crimson_fence_gate", + "planks": "minecraft:crimson_planks", + "plate": "minecraft:crimson_pressure_plate", + "slab": "minecraft:crimson_slab", + "stairs": "minecraft:crimson_stairs" +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/twilight/wood_palettes/dark_oak.json b/src/generated/resources/data/minecraft/twilight/wood_palettes/dark_oak.json new file mode 100644 index 0000000000..1967856fc1 --- /dev/null +++ b/src/generated/resources/data/minecraft/twilight/wood_palettes/dark_oak.json @@ -0,0 +1,10 @@ +{ + "banister": "twilightforest:dark_oak_banister", + "button": "minecraft:dark_oak_button", + "fence": "minecraft:dark_oak_fence", + "gate": "minecraft:dark_oak_fence_gate", + "planks": "minecraft:dark_oak_planks", + "plate": "minecraft:dark_oak_pressure_plate", + "slab": "minecraft:dark_oak_slab", + "stairs": "minecraft:dark_oak_stairs" +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/twilight/wood_palettes/jungle.json b/src/generated/resources/data/minecraft/twilight/wood_palettes/jungle.json new file mode 100644 index 0000000000..0185beb46a --- /dev/null +++ b/src/generated/resources/data/minecraft/twilight/wood_palettes/jungle.json @@ -0,0 +1,10 @@ +{ + "banister": "twilightforest:jungle_banister", + "button": "minecraft:jungle_button", + "fence": "minecraft:jungle_fence", + "gate": "minecraft:jungle_fence_gate", + "planks": "minecraft:jungle_planks", + "plate": "minecraft:jungle_pressure_plate", + "slab": "minecraft:jungle_slab", + "stairs": "minecraft:jungle_stairs" +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/twilight/wood_palettes/mangrove.json b/src/generated/resources/data/minecraft/twilight/wood_palettes/mangrove.json new file mode 100644 index 0000000000..135ca54fff --- /dev/null +++ b/src/generated/resources/data/minecraft/twilight/wood_palettes/mangrove.json @@ -0,0 +1,10 @@ +{ + "banister": "twilightforest:vangrove_banister", + "button": "minecraft:mangrove_button", + "fence": "minecraft:mangrove_fence", + "gate": "minecraft:mangrove_fence_gate", + "planks": "minecraft:mangrove_planks", + "plate": "minecraft:mangrove_pressure_plate", + "slab": "minecraft:mangrove_slab", + "stairs": "minecraft:mangrove_stairs" +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/twilight/wood_palettes/oak.json b/src/generated/resources/data/minecraft/twilight/wood_palettes/oak.json new file mode 100644 index 0000000000..d992ade689 --- /dev/null +++ b/src/generated/resources/data/minecraft/twilight/wood_palettes/oak.json @@ -0,0 +1,10 @@ +{ + "banister": "twilightforest:oak_banister", + "button": "minecraft:oak_button", + "fence": "minecraft:oak_fence", + "gate": "minecraft:oak_fence_gate", + "planks": "minecraft:oak_planks", + "plate": "minecraft:oak_pressure_plate", + "slab": "minecraft:oak_slab", + "stairs": "minecraft:oak_stairs" +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/twilight/wood_palettes/spruce.json b/src/generated/resources/data/minecraft/twilight/wood_palettes/spruce.json new file mode 100644 index 0000000000..14a91a63c5 --- /dev/null +++ b/src/generated/resources/data/minecraft/twilight/wood_palettes/spruce.json @@ -0,0 +1,10 @@ +{ + "banister": "twilightforest:spruce_banister", + "button": "minecraft:spruce_button", + "fence": "minecraft:spruce_fence", + "gate": "minecraft:spruce_fence_gate", + "planks": "minecraft:spruce_planks", + "plate": "minecraft:spruce_pressure_plate", + "slab": "minecraft:spruce_slab", + "stairs": "minecraft:spruce_stairs" +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/twilight/wood_palettes/warped.json b/src/generated/resources/data/minecraft/twilight/wood_palettes/warped.json new file mode 100644 index 0000000000..c9b4fe104e --- /dev/null +++ b/src/generated/resources/data/minecraft/twilight/wood_palettes/warped.json @@ -0,0 +1,10 @@ +{ + "banister": "twilightforest:warped_banister", + "button": "minecraft:warped_button", + "fence": "minecraft:warped_fence", + "gate": "minecraft:warped_fence_gate", + "planks": "minecraft:warped_planks", + "plate": "minecraft:warped_pressure_plate", + "slab": "minecraft:warped_slab", + "stairs": "minecraft:warped_stairs" +} \ No newline at end of file diff --git a/src/generated/resources/data/randomium/tags/items/blacklist.json b/src/generated/resources/data/randomium/tags/items/blacklist.json new file mode 100644 index 0000000000..84a7b6edab --- /dev/null +++ b/src/generated/resources/data/randomium/tags/items/blacklist.json @@ -0,0 +1,31 @@ +{ + "values": [ + "#twilightforest:nyi", + "#twilightforest:wip", + "twilightforest:glass_sword", + "twilightforest:time_log_core", + "twilightforest:transformation_log_core", + "twilightforest:mining_log_core", + "twilightforest:sorting_log_core", + "twilightforest:antibuilder", + "twilightforest:stronghold_shield", + "twilightforest:locked_vanishing_block", + "twilightforest:brown_thorns", + "twilightforest:green_thorns", + "twilightforest:burnt_thorns", + "twilightforest:pink_force_field", + "twilightforest:orange_force_field", + "twilightforest:green_force_field", + "twilightforest:blue_force_field", + "twilightforest:violet_force_field", + "twilightforest:final_boss_boss_spawner", + "twilightforest:naga_boss_spawner", + "twilightforest:lich_boss_spawner", + "twilightforest:minoshroom_boss_spawner", + "twilightforest:hydra_boss_spawner", + "twilightforest:knight_phantom_boss_spawner", + "twilightforest:ur_ghast_boss_spawner", + "twilightforest:alpha_yeti_boss_spawner", + "twilightforest:snow_queen_boss_spawner" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/arborist.json b/src/generated/resources/data/twilightforest/advancements/arborist.json new file mode 100644 index 0000000000..01658f129c --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/arborist.json @@ -0,0 +1,2875 @@ +{ + "parent": "twilightforest:root", + "criteria": { + "beanstalk_leaves": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:beanstalk_leaves" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "canopy_banister": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:canopy_banister" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "canopy_boat": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:canopy_boat" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "canopy_bookshelf": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:canopy_bookshelf" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "canopy_button": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:canopy_button" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "canopy_chest": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:canopy_chest" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "canopy_chest_boat": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:canopy_chest_boat" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "canopy_door": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:canopy_door" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "canopy_fence": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:canopy_fence" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "canopy_fence_gate": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:canopy_fence_gate" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "canopy_leaves": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:canopy_leaves" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "canopy_log": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:canopy_log" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "canopy_planks": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:canopy_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "canopy_pressure_plate": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:canopy_pressure_plate" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "canopy_sapling": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:canopy_sapling" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "canopy_sign": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:canopy_sign" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "canopy_slab": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:canopy_slab" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "canopy_stairs": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:canopy_stairs" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "canopy_trapdoor": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:canopy_trapdoor" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "canopy_wood": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:canopy_wood" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "cracked_towerwood": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:cracked_towerwood" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "dark_banister": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:dark_banister" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "dark_boat": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:dark_boat" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "dark_button": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:dark_button" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "dark_chest": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:dark_chest" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "dark_chest_boat": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:dark_chest_boat" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "dark_door": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:dark_door" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "dark_fence": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:dark_fence" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "dark_fence_gate": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:dark_fence_gate" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "dark_leaves": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:dark_leaves" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "dark_log": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:dark_log" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "dark_planks": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:dark_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "dark_pressure_plate": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:dark_pressure_plate" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "dark_sign": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:dark_sign" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "dark_slab": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:dark_slab" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "dark_stairs": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:dark_stairs" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "dark_trapdoor": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:dark_trapdoor" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "dark_wood": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:dark_wood" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "darkwood_sapling": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:darkwood_sapling" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "empty_canopy_bookshelf": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:empty_canopy_bookshelf" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "encased_towerwood": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:encased_towerwood" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "fallen_leaves": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:fallen_leaves" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "giant_leaves": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:giant_leaves" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "giant_log": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:giant_log" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "hedge": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:hedge" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "hollow_canopy_log": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:hollow_canopy_log" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "hollow_dark_log": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:hollow_dark_log" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "hollow_mangrove_log": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:hollow_mangrove_log" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "hollow_mining_log": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:hollow_mining_log" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "hollow_oak_sapling": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:hollow_oak_sapling" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "hollow_sorting_log": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:hollow_sorting_log" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "hollow_time_log": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:hollow_time_log" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "hollow_transformation_log": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:hollow_transformation_log" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "hollow_twilight_oak_log": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:hollow_twilight_oak_log" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "huge_stalk": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:huge_stalk" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "liveroot": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:liveroot" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "liveroot_block": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:liveroot_block" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "mangrove_banister": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:mangrove_banister" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "mangrove_boat": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:mangrove_boat" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "mangrove_button": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:mangrove_button" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "mangrove_chest": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:mangrove_chest" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "mangrove_chest_boat": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:mangrove_chest_boat" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "mangrove_door": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:mangrove_door" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "mangrove_fence": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:mangrove_fence" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "mangrove_fence_gate": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:mangrove_fence_gate" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "mangrove_leaves": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:mangrove_leaves" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "mangrove_log": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:mangrove_log" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "mangrove_planks": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:mangrove_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "mangrove_pressure_plate": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:mangrove_pressure_plate" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "mangrove_root": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:mangrove_root" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "mangrove_sapling": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:mangrove_sapling" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "mangrove_sign": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:mangrove_sign" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "mangrove_slab": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:mangrove_slab" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "mangrove_stairs": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:mangrove_stairs" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "mangrove_trapdoor": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:mangrove_trapdoor" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "mangrove_wood": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:mangrove_wood" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "mining_banister": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:mining_banister" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "mining_boat": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:mining_boat" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "mining_button": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:mining_button" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "mining_chest": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:mining_chest" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "mining_chest_boat": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:mining_chest_boat" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "mining_door": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:mining_door" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "mining_fence": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:mining_fence" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "mining_fence_gate": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:mining_fence_gate" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "mining_leaves": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:mining_leaves" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "mining_log": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:mining_log" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "mining_planks": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:mining_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "mining_pressure_plate": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:mining_pressure_plate" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "mining_sapling": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:mining_sapling" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "mining_sign": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:mining_sign" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "mining_slab": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:mining_slab" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "mining_stairs": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:mining_stairs" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "mining_trapdoor": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:mining_trapdoor" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "mining_wood": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:mining_wood" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "mossy_towerwood": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:mossy_towerwood" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "rainbow_oak_leaves": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:rainbow_oak_leaves" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "rainbow_oak_sapling": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:rainbow_oak_sapling" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "root": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:root" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "root_strand": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:root_strand" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "sorting_banister": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:sorting_banister" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "sorting_boat": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:sorting_boat" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "sorting_button": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:sorting_button" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "sorting_chest": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:sorting_chest" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "sorting_chest_boat": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:sorting_chest_boat" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "sorting_door": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:sorting_door" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "sorting_fence": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:sorting_fence" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "sorting_fence_gate": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:sorting_fence_gate" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "sorting_leaves": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:sorting_leaves" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "sorting_log": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:sorting_log" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "sorting_planks": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:sorting_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "sorting_pressure_plate": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:sorting_pressure_plate" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "sorting_sapling": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:sorting_sapling" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "sorting_sign": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:sorting_sign" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "sorting_slab": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:sorting_slab" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "sorting_stairs": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:sorting_stairs" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "sorting_trapdoor": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:sorting_trapdoor" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "sorting_wood": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:sorting_wood" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "stripped_canopy_log": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:stripped_canopy_log" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "stripped_canopy_wood": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:stripped_canopy_wood" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "stripped_dark_log": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:stripped_dark_log" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "stripped_dark_wood": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:stripped_dark_wood" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "stripped_mangrove_log": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:stripped_mangrove_log" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "stripped_mangrove_wood": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:stripped_mangrove_wood" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "stripped_mining_log": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:stripped_mining_log" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "stripped_mining_wood": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:stripped_mining_wood" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "stripped_sorting_log": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:stripped_sorting_log" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "stripped_sorting_wood": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:stripped_sorting_wood" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "stripped_time_log": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:stripped_time_log" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "stripped_time_wood": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:stripped_time_wood" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "stripped_transformation_log": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:stripped_transformation_log" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "stripped_transformation_wood": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:stripped_transformation_wood" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "stripped_twilight_oak_log": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:stripped_twilight_oak_log" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "stripped_twilight_oak_wood": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:stripped_twilight_oak_wood" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "thorn_leaves": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:thorn_leaves" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "thorn_rose": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:thorn_rose" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "time_banister": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:time_banister" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "time_boat": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:time_boat" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "time_button": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:time_button" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "time_chest": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:time_chest" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "time_chest_boat": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:time_chest_boat" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "time_door": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:time_door" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "time_fence": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:time_fence" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "time_fence_gate": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:time_fence_gate" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "time_leaves": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:time_leaves" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "time_log": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:time_log" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "time_planks": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:time_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "time_pressure_plate": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:time_pressure_plate" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "time_sapling": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:time_sapling" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "time_sign": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:time_sign" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "time_slab": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:time_slab" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "time_stairs": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:time_stairs" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "time_trapdoor": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:time_trapdoor" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "time_wood": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:time_wood" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "towerwood": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:towerwood" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "transformation_banister": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:transformation_banister" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "transformation_boat": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:transformation_boat" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "transformation_button": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:transformation_button" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "transformation_chest": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:transformation_chest" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "transformation_chest_boat": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:transformation_chest_boat" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "transformation_door": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:transformation_door" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "transformation_fence": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:transformation_fence" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "transformation_fence_gate": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:transformation_fence_gate" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "transformation_leaves": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:transformation_leaves" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "transformation_log": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:transformation_log" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "transformation_planks": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:transformation_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "transformation_pressure_plate": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:transformation_pressure_plate" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "transformation_sapling": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:transformation_sapling" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "transformation_sign": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:transformation_sign" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "transformation_slab": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:transformation_slab" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "transformation_stairs": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:transformation_stairs" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "transformation_trapdoor": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:transformation_trapdoor" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "transformation_wood": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:transformation_wood" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "twilight_oak_banister": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:twilight_oak_banister" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "twilight_oak_boat": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:twilight_oak_boat" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "twilight_oak_button": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:twilight_oak_button" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "twilight_oak_chest": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:twilight_oak_chest" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "twilight_oak_chest_boat": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:twilight_oak_chest_boat" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "twilight_oak_door": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:twilight_oak_door" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "twilight_oak_fence": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:twilight_oak_fence" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "twilight_oak_fence_gate": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:twilight_oak_fence_gate" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "twilight_oak_leaves": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:twilight_oak_leaves" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "twilight_oak_log": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:twilight_oak_log" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "twilight_oak_planks": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:twilight_oak_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "twilight_oak_pressure_plate": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:twilight_oak_pressure_plate" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "twilight_oak_sapling": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:twilight_oak_sapling" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "twilight_oak_sign": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:twilight_oak_sign" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "twilight_oak_slab": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:twilight_oak_slab" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "twilight_oak_stairs": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:twilight_oak_stairs" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "twilight_oak_trapdoor": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:twilight_oak_trapdoor" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "twilight_oak_wood": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:twilight_oak_wood" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "display": { + "announce_to_chat": true, + "description": { + "translate": "advancement.twilightforest.arborist.desc" + }, + "frame": "challenge", + "hidden": false, + "icon": { + "item": "twilightforest:twilight_oak_fence" + }, + "show_toast": true, + "title": { + "translate": "advancement.twilightforest.arborist" + } + }, + "requirements": [ + [ + "twilight_oak_log" + ], + [ + "twilight_oak_wood" + ], + [ + "stripped_twilight_oak_log" + ], + [ + "stripped_twilight_oak_wood" + ], + [ + "hollow_twilight_oak_log" + ], + [ + "twilight_oak_leaves" + ], + [ + "twilight_oak_sapling" + ], + [ + "twilight_oak_planks" + ], + [ + "twilight_oak_slab" + ], + [ + "twilight_oak_stairs" + ], + [ + "twilight_oak_button" + ], + [ + "twilight_oak_fence" + ], + [ + "twilight_oak_fence_gate" + ], + [ + "twilight_oak_pressure_plate" + ], + [ + "twilight_oak_door" + ], + [ + "twilight_oak_trapdoor" + ], + [ + "twilight_oak_sign" + ], + [ + "twilight_oak_chest" + ], + [ + "twilight_oak_banister" + ], + [ + "twilight_oak_boat" + ], + [ + "twilight_oak_chest_boat" + ], + [ + "canopy_log" + ], + [ + "canopy_wood" + ], + [ + "stripped_canopy_log" + ], + [ + "stripped_canopy_wood" + ], + [ + "hollow_canopy_log" + ], + [ + "canopy_leaves" + ], + [ + "canopy_sapling" + ], + [ + "canopy_planks" + ], + [ + "canopy_slab" + ], + [ + "canopy_stairs" + ], + [ + "canopy_button" + ], + [ + "canopy_fence" + ], + [ + "canopy_fence_gate" + ], + [ + "canopy_pressure_plate" + ], + [ + "canopy_door" + ], + [ + "canopy_trapdoor" + ], + [ + "canopy_sign" + ], + [ + "canopy_chest" + ], + [ + "canopy_banister" + ], + [ + "canopy_bookshelf" + ], + [ + "empty_canopy_bookshelf" + ], + [ + "canopy_boat" + ], + [ + "canopy_chest_boat" + ], + [ + "mangrove_log" + ], + [ + "mangrove_wood" + ], + [ + "stripped_mangrove_log" + ], + [ + "stripped_mangrove_wood" + ], + [ + "hollow_mangrove_log" + ], + [ + "mangrove_leaves" + ], + [ + "mangrove_sapling" + ], + [ + "mangrove_planks" + ], + [ + "mangrove_slab" + ], + [ + "mangrove_stairs" + ], + [ + "mangrove_button" + ], + [ + "mangrove_fence" + ], + [ + "mangrove_fence_gate" + ], + [ + "mangrove_pressure_plate" + ], + [ + "mangrove_door" + ], + [ + "mangrove_trapdoor" + ], + [ + "mangrove_sign" + ], + [ + "mangrove_chest" + ], + [ + "mangrove_banister" + ], + [ + "mangrove_boat" + ], + [ + "mangrove_chest_boat" + ], + [ + "dark_log" + ], + [ + "dark_wood" + ], + [ + "stripped_dark_log" + ], + [ + "stripped_dark_wood" + ], + [ + "hollow_dark_log" + ], + [ + "dark_leaves" + ], + [ + "darkwood_sapling" + ], + [ + "dark_planks" + ], + [ + "dark_slab" + ], + [ + "dark_stairs" + ], + [ + "dark_button" + ], + [ + "dark_fence" + ], + [ + "dark_fence_gate" + ], + [ + "dark_pressure_plate" + ], + [ + "dark_door" + ], + [ + "dark_trapdoor" + ], + [ + "dark_sign" + ], + [ + "dark_chest" + ], + [ + "dark_banister" + ], + [ + "dark_boat" + ], + [ + "dark_chest_boat" + ], + [ + "time_log" + ], + [ + "time_wood" + ], + [ + "stripped_time_log" + ], + [ + "stripped_time_wood" + ], + [ + "hollow_time_log" + ], + [ + "time_leaves" + ], + [ + "time_sapling" + ], + [ + "time_planks" + ], + [ + "time_slab" + ], + [ + "time_stairs" + ], + [ + "time_button" + ], + [ + "time_fence" + ], + [ + "time_fence_gate" + ], + [ + "time_pressure_plate" + ], + [ + "time_door" + ], + [ + "time_trapdoor" + ], + [ + "time_sign" + ], + [ + "time_chest" + ], + [ + "time_banister" + ], + [ + "time_boat" + ], + [ + "time_chest_boat" + ], + [ + "transformation_log" + ], + [ + "transformation_wood" + ], + [ + "stripped_transformation_log" + ], + [ + "stripped_transformation_wood" + ], + [ + "hollow_transformation_log" + ], + [ + "transformation_leaves" + ], + [ + "transformation_sapling" + ], + [ + "transformation_planks" + ], + [ + "transformation_slab" + ], + [ + "transformation_stairs" + ], + [ + "transformation_button" + ], + [ + "transformation_fence" + ], + [ + "transformation_fence_gate" + ], + [ + "transformation_pressure_plate" + ], + [ + "transformation_door" + ], + [ + "transformation_trapdoor" + ], + [ + "transformation_sign" + ], + [ + "transformation_chest" + ], + [ + "transformation_banister" + ], + [ + "transformation_boat" + ], + [ + "transformation_chest_boat" + ], + [ + "mining_log" + ], + [ + "mining_wood" + ], + [ + "stripped_mining_log" + ], + [ + "stripped_mining_wood" + ], + [ + "hollow_mining_log" + ], + [ + "mining_leaves" + ], + [ + "mining_sapling" + ], + [ + "mining_planks" + ], + [ + "mining_slab" + ], + [ + "mining_stairs" + ], + [ + "mining_button" + ], + [ + "mining_fence" + ], + [ + "mining_fence_gate" + ], + [ + "mining_pressure_plate" + ], + [ + "mining_door" + ], + [ + "mining_trapdoor" + ], + [ + "mining_sign" + ], + [ + "mining_chest" + ], + [ + "mining_banister" + ], + [ + "mining_boat" + ], + [ + "mining_chest_boat" + ], + [ + "sorting_log" + ], + [ + "sorting_wood" + ], + [ + "stripped_sorting_log" + ], + [ + "stripped_sorting_wood" + ], + [ + "hollow_sorting_log" + ], + [ + "sorting_leaves" + ], + [ + "sorting_sapling" + ], + [ + "sorting_planks" + ], + [ + "sorting_slab" + ], + [ + "sorting_stairs" + ], + [ + "sorting_button" + ], + [ + "sorting_fence" + ], + [ + "sorting_fence_gate" + ], + [ + "sorting_pressure_plate" + ], + [ + "sorting_door" + ], + [ + "sorting_trapdoor" + ], + [ + "sorting_sign" + ], + [ + "sorting_chest" + ], + [ + "sorting_banister" + ], + [ + "sorting_boat" + ], + [ + "sorting_chest_boat" + ], + [ + "towerwood" + ], + [ + "cracked_towerwood" + ], + [ + "mossy_towerwood" + ], + [ + "encased_towerwood" + ], + [ + "root" + ], + [ + "root_strand" + ], + [ + "liveroot_block" + ], + [ + "liveroot" + ], + [ + "hollow_oak_sapling" + ], + [ + "rainbow_oak_sapling" + ], + [ + "rainbow_oak_leaves" + ], + [ + "giant_log" + ], + [ + "giant_leaves" + ], + [ + "huge_stalk" + ], + [ + "beanstalk_leaves" + ], + [ + "thorn_leaves" + ], + [ + "thorn_rose" + ], + [ + "hedge" + ], + [ + "fallen_leaves" + ], + [ + "mangrove_root" + ] + ], + "rewards": { + "experience": 1000 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/arctic_armor_dyed.json b/src/generated/resources/data/twilightforest/advancements/arctic_armor_dyed.json new file mode 100644 index 0000000000..2bf92f060d --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/arctic_armor_dyed.json @@ -0,0 +1,90 @@ +{ + "parent": "twilightforest:progress_yeti", + "criteria": { + "boots": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:arctic_boots" + ], + "nbt": "{display:{hasColor:1b}}" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "chestplate": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:arctic_chestplate" + ], + "nbt": "{display:{hasColor:1b}}" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "helmet": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:arctic_helmet" + ], + "nbt": "{display:{hasColor:1b}}" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "leggings": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:arctic_leggings" + ], + "nbt": "{display:{hasColor:1b}}" + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "display": { + "announce_to_chat": true, + "description": { + "translate": "advancement.twilightforest.arctic_dyed.desc" + }, + "frame": "task", + "hidden": false, + "icon": { + "item": "twilightforest:arctic_chestplate", + "nbt": "{Damage:0}" + }, + "show_toast": true, + "title": { + "translate": "advancement.twilightforest.arctic_dyed" + } + }, + "requirements": [ + [ + "helmet" + ], + [ + "chestplate" + ], + [ + "leggings" + ], + [ + "boots" + ] + ], + "rewards": { + "experience": 25 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/beanstalk.json b/src/generated/resources/data/twilightforest/advancements/beanstalk.json new file mode 100644 index 0000000000..6784ccef5f --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/beanstalk.json @@ -0,0 +1,62 @@ +{ + "parent": "twilightforest:progress_merge", + "criteria": { + "beans": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:magic_beans" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "use_beans": { + "conditions": { + "item": { + "items": [ + "twilightforest:magic_beans" + ] + }, + "location": { + "block": { + "blocks": [ + "twilightforest:uberous_soil" + ] + } + } + }, + "trigger": "minecraft:item_used_on_block" + } + }, + "display": { + "announce_to_chat": true, + "description": { + "translate": "advancement.twilightforest.beanstalk.desc", + "with": [ + { + "translate": "item.twilightforest.magic_beans" + } + ] + }, + "frame": "goal", + "hidden": false, + "icon": { + "item": "twilightforest:huge_stalk" + }, + "show_toast": true, + "title": { + "translate": "advancement.twilightforest.beanstalk" + } + }, + "requirements": [ + [ + "beans" + ], + [ + "use_beans" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/break_glass_sword.json b/src/generated/resources/data/twilightforest/advancements/break_glass_sword.json new file mode 100644 index 0000000000..b9a7f98714 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/break_glass_sword.json @@ -0,0 +1,43 @@ +{ + "parent": "twilightforest:progress_yeti", + "criteria": { + "broken_sword": { + "conditions": { + "durability": -1, + "item": { + "items": [ + "twilightforest:glass_sword" + ] + } + }, + "trigger": "minecraft:item_durability_changed" + } + }, + "display": { + "announce_to_chat": true, + "description": { + "translate": "advancement.twilightforest.glass_sword.desc" + }, + "frame": "challenge", + "hidden": true, + "icon": { + "item": "twilightforest:glass_sword", + "nbt": "{Damage:0}" + }, + "show_toast": true, + "title": { + "translate": "advancement.twilightforest.glass_sword" + } + }, + "requirements": [ + [ + "broken_sword" + ] + ], + "rewards": { + "experience": 42, + "loot": [ + "twilightforest:glass_sword" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/experiment_115.json b/src/generated/resources/data/twilightforest/advancements/experiment_115.json new file mode 100644 index 0000000000..c4a5fc9831 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/experiment_115.json @@ -0,0 +1,35 @@ +{ + "parent": "twilightforest:progress_knights", + "criteria": { + "eat_experiment_115": { + "conditions": { + "item": { + "items": [ + "twilightforest:experiment_115" + ] + } + }, + "trigger": "minecraft:consume_item" + } + }, + "display": { + "announce_to_chat": true, + "description": { + "translate": "advancement.twilightforest.experiment_115.desc" + }, + "frame": "task", + "hidden": false, + "icon": { + "item": "twilightforest:experiment_115" + }, + "show_toast": true, + "title": { + "translate": "advancement.twilightforest.experiment_115" + } + }, + "requirements": [ + [ + "eat_experiment_115" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/experiment_115_115.json b/src/generated/resources/data/twilightforest/advancements/experiment_115_115.json new file mode 100644 index 0000000000..18151c6b6e --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/experiment_115_115.json @@ -0,0 +1,51 @@ +{ + "parent": "twilightforest:experiment_115", + "criteria": { + "eat_115_e115": { + "conditions": { + "player": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type_specific": { + "type": "player", + "stats": [ + { + "type": "minecraft:custom", + "stat": "twilightforest:e115_slices_eaten", + "value": { + "min": 115 + } + } + ] + } + } + } + ] + }, + "trigger": "minecraft:location" + } + }, + "display": { + "announce_to_chat": true, + "description": { + "translate": "advancement.twilightforest.experiment_115_3.desc" + }, + "frame": "challenge", + "hidden": true, + "icon": { + "item": "twilightforest:experiment_115", + "nbt": "{think:{think:1}}" + }, + "show_toast": true, + "title": { + "translate": "advancement.twilightforest.experiment_115_3" + } + }, + "requirements": [ + [ + "eat_115_e115" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/experiment_115_self_replenishing.json b/src/generated/resources/data/twilightforest/advancements/experiment_115_self_replenishing.json new file mode 100644 index 0000000000..48cd4a5430 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/experiment_115_self_replenishing.json @@ -0,0 +1,46 @@ +{ + "parent": "twilightforest:experiment_115", + "criteria": { + "place_complete_e115": { + "conditions": { + "item": { + "items": [ + "minecraft:redstone" + ] + }, + "location": { + "block": { + "blocks": [ + "twilightforest:experiment_115" + ], + "state": { + "regenerate": "true" + } + } + } + }, + "trigger": "minecraft:item_used_on_block" + } + }, + "display": { + "announce_to_chat": true, + "description": { + "translate": "advancement.twilightforest.experiment_115_2.desc" + }, + "frame": "challenge", + "hidden": true, + "icon": { + "item": "twilightforest:experiment_115", + "nbt": "{full:{full:1}}" + }, + "show_toast": true, + "title": { + "translate": "advancement.twilightforest.experiment_115_2" + } + }, + "requirements": [ + [ + "place_complete_e115" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/fiery_set.json b/src/generated/resources/data/twilightforest/advancements/fiery_set.json new file mode 100644 index 0000000000..56a94e3d55 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/fiery_set.json @@ -0,0 +1,108 @@ +{ + "parent": "twilightforest:progress_hydra", + "criteria": { + "fiery_boots": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:fiery_boots" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "fiery_chestplate": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:fiery_chestplate" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "fiery_helmet": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:fiery_helmet" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "fiery_leggings": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:fiery_leggings" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "fiery_pick": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:fiery_pickaxe" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "fiery_sword": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:fiery_sword" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "display": { + "announce_to_chat": true, + "description": { + "translate": "advancement.twilightforest.fiery_set.desc" + }, + "frame": "challenge", + "hidden": false, + "icon": { + "item": "twilightforest:fiery_sword", + "nbt": "{Damage:0}" + }, + "show_toast": true, + "title": { + "translate": "advancement.twilightforest.fiery_set" + } + }, + "requirements": [ + [ + "fiery_pick", + "fiery_sword" + ], + [ + "fiery_helmet", + "fiery_chestplate", + "fiery_leggings", + "fiery_boots" + ] + ], + "rewards": { + "experience": 75 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/full_mettle_alchemist.json b/src/generated/resources/data/twilightforest/advancements/full_mettle_alchemist.json new file mode 100644 index 0000000000..d919871caa --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/full_mettle_alchemist.json @@ -0,0 +1,36 @@ +{ + "parent": "twilightforest:progress_lich", + "criteria": { + "drink_4_harming": { + "conditions": { + "doses": 4, + "potion": "minecraft:strong_harming" + }, + "trigger": "twilightforest:drink_from_flask" + } + }, + "display": { + "announce_to_chat": true, + "description": { + "translate": "advancement.twilightforest.full_mettle_alchemist.desc" + }, + "frame": "challenge", + "hidden": true, + "icon": { + "item": "twilightforest:greater_potion_flask", + "nbt": "{Potion:\"minecraft:strong_harming\",Uses:4}" + }, + "show_toast": true, + "title": { + "translate": "advancement.twilightforest.full_mettle_alchemist" + } + }, + "requirements": [ + [ + "drink_4_harming" + ] + ], + "rewards": { + "experience": 100 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/ghast_trap.json b/src/generated/resources/data/twilightforest/advancements/ghast_trap.json new file mode 100644 index 0000000000..e0a0f89331 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/ghast_trap.json @@ -0,0 +1,40 @@ +{ + "parent": "twilightforest:progress_knights", + "criteria": { + "activate_ghast_trap": { + "conditions": {}, + "trigger": "twilightforest:activate_ghast_trap" + } + }, + "display": { + "announce_to_chat": true, + "description": { + "translate": "advancement.twilightforest.ghast_trap.desc", + "with": [ + { + "translate": "entity.twilightforest.carminite_ghastling" + }, + { + "translate": "block.twilightforest.ghast_trap" + }, + { + "translate": "entity.twilightforest.ur_ghast" + } + ] + }, + "frame": "task", + "hidden": false, + "icon": { + "item": "twilightforest:ghast_trap" + }, + "show_toast": true, + "title": { + "translate": "advancement.twilightforest.ghast_trap" + } + }, + "requirements": [ + [ + "activate_ghast_trap" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/giants.json b/src/generated/resources/data/twilightforest/advancements/giants.json new file mode 100644 index 0000000000..8f93016e45 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/giants.json @@ -0,0 +1,63 @@ +{ + "parent": "twilightforest:beanstalk", + "criteria": { + "giant": { + "conditions": { + "entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "twilightforest:giant_miner" + } + } + ] + }, + "trigger": "minecraft:player_killed_entity" + }, + "pickaxe": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:magic_beans" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "display": { + "announce_to_chat": true, + "description": { + "translate": "advancement.twilightforest.giants.desc", + "with": [ + { + "translate": "entity.twilightforest.giant_miner" + }, + { + "translate": "item.twilightforest.giant_pickaxe" + } + ] + }, + "frame": "goal", + "hidden": false, + "icon": { + "item": "twilightforest:giant_pickaxe", + "nbt": "{Damage:0}" + }, + "show_toast": true, + "title": { + "translate": "advancement.twilightforest.giants" + } + }, + "requirements": [ + [ + "giant" + ], + [ + "pickaxe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/hedge.json b/src/generated/resources/data/twilightforest/advancements/hedge.json new file mode 100644 index 0000000000..f3ccfa9bc5 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/hedge.json @@ -0,0 +1,60 @@ +{ + "parent": "twilightforest:root", + "criteria": { + "hedge_spider": { + "conditions": { + "entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "twilightforest:hedge_spider", + "location": { + "structure": "twilightforest:hedge_maze" + } + } + } + ] + }, + "trigger": "minecraft:player_killed_entity" + }, + "swarm_spider": { + "conditions": { + "entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "twilightforest:swarm_spider", + "location": { + "structure": "twilightforest:hedge_maze" + } + } + } + ] + }, + "trigger": "minecraft:player_killed_entity" + } + }, + "display": { + "announce_to_chat": true, + "description": { + "translate": "advancement.twilightforest.hedge.desc" + }, + "frame": "task", + "hidden": false, + "icon": { + "item": "twilightforest:hedge" + }, + "show_toast": true, + "title": { + "translate": "advancement.twilightforest.hedge" + } + }, + "requirements": [ + [ + "hedge_spider", + "swarm_spider" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/hill1.json b/src/generated/resources/data/twilightforest/advancements/hill1.json new file mode 100644 index 0000000000..37599c9024 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/hill1.json @@ -0,0 +1,48 @@ +{ + "parent": "twilightforest:root", + "criteria": { + "redcap": { + "conditions": { + "entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "twilightforest:redcap", + "location": { + "structure": "twilightforest:small_hollow_hill" + } + } + } + ] + }, + "trigger": "minecraft:player_killed_entity" + } + }, + "display": { + "announce_to_chat": true, + "description": { + "translate": "advancement.twilightforest.hill1.desc", + "with": [ + { + "translate": "entity.twilightforest.redcap" + } + ] + }, + "frame": "task", + "hidden": false, + "icon": { + "item": "minecraft:iron_boots", + "nbt": "{Damage:0}" + }, + "show_toast": true, + "title": { + "translate": "advancement.twilightforest.hill1" + } + }, + "requirements": [ + [ + "redcap" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/hill2.json b/src/generated/resources/data/twilightforest/advancements/hill2.json new file mode 100644 index 0000000000..88920dc5f5 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/hill2.json @@ -0,0 +1,48 @@ +{ + "parent": "twilightforest:hill1", + "criteria": { + "redcap": { + "conditions": { + "entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "twilightforest:redcap_sapper", + "location": { + "structure": "twilightforest:medium_hollow_hill" + } + } + } + ] + }, + "trigger": "minecraft:player_killed_entity" + } + }, + "display": { + "announce_to_chat": true, + "description": { + "translate": "advancement.twilightforest.hill2.desc", + "with": [ + { + "translate": "entity.twilightforest.redcap_sapper" + } + ] + }, + "frame": "task", + "hidden": false, + "icon": { + "item": "twilightforest:ironwood_pickaxe", + "nbt": "{Damage:0}" + }, + "show_toast": true, + "title": { + "translate": "advancement.twilightforest.hill2" + } + }, + "requirements": [ + [ + "redcap" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/hill3.json b/src/generated/resources/data/twilightforest/advancements/hill3.json new file mode 100644 index 0000000000..a35e39726a --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/hill3.json @@ -0,0 +1,47 @@ +{ + "parent": "twilightforest:hill2", + "criteria": { + "redcap": { + "conditions": { + "entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "twilightforest:wraith", + "location": { + "structure": "twilightforest:large_hollow_hill" + } + } + } + ] + }, + "trigger": "minecraft:player_killed_entity" + } + }, + "display": { + "announce_to_chat": true, + "description": { + "translate": "advancement.twilightforest.hill3.desc", + "with": [ + { + "translate": "entity.twilightforest.wraith" + } + ] + }, + "frame": "task", + "hidden": false, + "icon": { + "item": "minecraft:glowstone_dust" + }, + "show_toast": true, + "title": { + "translate": "advancement.twilightforest.hill3" + } + }, + "requirements": [ + [ + "redcap" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/hydra_chop.json b/src/generated/resources/data/twilightforest/advancements/hydra_chop.json new file mode 100644 index 0000000000..17a51b0fbe --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/hydra_chop.json @@ -0,0 +1,34 @@ +{ + "parent": "twilightforest:progress_hydra", + "criteria": { + "hydra_chop": { + "conditions": {}, + "trigger": "twilightforest:consume_hydra_chop_on_low_hunger" + } + }, + "display": { + "announce_to_chat": true, + "description": { + "translate": "advancement.twilightforest.hydra_chop.desc", + "with": [ + { + "translate": "entity.twilightforest.hydra" + } + ] + }, + "frame": "task", + "hidden": false, + "icon": { + "item": "twilightforest:hydra_chop" + }, + "show_toast": true, + "title": { + "translate": "advancement.twilightforest.hydra_chop" + } + }, + "requirements": [ + [ + "hydra_chop" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/kill_cicada.json b/src/generated/resources/data/twilightforest/advancements/kill_cicada.json new file mode 100644 index 0000000000..a65c3afb9d --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/kill_cicada.json @@ -0,0 +1,36 @@ +{ + "parent": "twilightforest:root", + "criteria": { + "kill_cicada": { + "conditions": { + "bug": "twilightforest:cicada" + }, + "trigger": "twilightforest:kill_bug" + } + }, + "display": { + "announce_to_chat": false, + "description": { + "translate": "advancement.twilightforest.kill_cicada.desc", + "with": [ + { + "translate": "block.twilightforest.cicada" + } + ] + }, + "frame": "task", + "hidden": true, + "icon": { + "item": "twilightforest:cicada" + }, + "show_toast": true, + "title": { + "translate": "advancement.twilightforest.kill_cicada" + } + }, + "requirements": [ + [ + "kill_cicada" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/lich_scepters.json b/src/generated/resources/data/twilightforest/advancements/lich_scepters.json new file mode 100644 index 0000000000..acdd15e0c5 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/lich_scepters.json @@ -0,0 +1,56 @@ +{ + "parent": "twilightforest:progress_lich", + "criteria": { + "scepters": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:lifedrain_scepter" + ] + }, + { + "items": [ + "twilightforest:twilight_scepter" + ] + }, + { + "items": [ + "twilightforest:zombie_scepter" + ] + }, + { + "items": [ + "twilightforest:fortification_scepter" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "display": { + "announce_to_chat": true, + "description": { + "translate": "advancement.twilightforest.lich_scepters.desc" + }, + "frame": "challenge", + "hidden": true, + "icon": { + "item": "twilightforest:zombie_scepter", + "nbt": "{Damage:0}" + }, + "show_toast": true, + "title": { + "translate": "advancement.twilightforest.lich_scepters" + } + }, + "requirements": [ + [ + "scepters" + ] + ], + "rewards": { + "experience": 100 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/magic_map.json b/src/generated/resources/data/twilightforest/advancements/magic_map.json new file mode 100644 index 0000000000..3fa7bec138 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/magic_map.json @@ -0,0 +1,42 @@ +{ + "parent": "twilightforest:magic_map_focus", + "criteria": { + "magic_map": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:filled_magic_map" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "display": { + "announce_to_chat": true, + "description": { + "translate": "advancement.twilightforest.magic_map.desc", + "with": [ + { + "translate": "item.twilightforest.filled_magic_map" + } + ] + }, + "frame": "task", + "hidden": false, + "icon": { + "item": "twilightforest:filled_magic_map" + }, + "show_toast": true, + "title": { + "translate": "advancement.twilightforest.magic_map" + } + }, + "requirements": [ + [ + "magic_map" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/magic_map_focus.json b/src/generated/resources/data/twilightforest/advancements/magic_map_focus.json new file mode 100644 index 0000000000..260d2d3a2a --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/magic_map_focus.json @@ -0,0 +1,51 @@ +{ + "parent": "twilightforest:twilight_hunter", + "criteria": { + "focus": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:magic_map_focus" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "display": { + "announce_to_chat": true, + "description": { + "translate": "advancement.twilightforest.magic_map_focus.desc", + "with": [ + { + "translate": "item.twilightforest.magic_map_focus" + }, + { + "translate": "item.twilightforest.raven_feather" + }, + { + "translate": "item.minecraft.glowstone_dust" + }, + { + "translate": "item.twilightforest.torchberries" + } + ] + }, + "frame": "task", + "hidden": false, + "icon": { + "item": "twilightforest:magic_map_focus" + }, + "show_toast": true, + "title": { + "translate": "advancement.twilightforest.magic_map_focus" + } + }, + "requirements": [ + [ + "focus" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/maze_map.json b/src/generated/resources/data/twilightforest/advancements/maze_map.json new file mode 100644 index 0000000000..c73d3f4aa0 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/maze_map.json @@ -0,0 +1,42 @@ +{ + "parent": "twilightforest:magic_map", + "criteria": { + "maze_map": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:filled_maze_map" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "display": { + "announce_to_chat": true, + "description": { + "translate": "advancement.twilightforest.maze_map.desc", + "with": [ + { + "translate": "item.twilightforest.filled_maze_map" + } + ] + }, + "frame": "goal", + "hidden": false, + "icon": { + "item": "twilightforest:filled_maze_map" + }, + "show_toast": true, + "title": { + "translate": "advancement.twilightforest.maze_map" + } + }, + "requirements": [ + [ + "maze_map" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/mazebreaker.json b/src/generated/resources/data/twilightforest/advancements/mazebreaker.json new file mode 100644 index 0000000000..3f65082aa8 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/mazebreaker.json @@ -0,0 +1,46 @@ +{ + "parent": "twilightforest:progress_labyrinth", + "criteria": { + "pick": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:mazebreaker_pickaxe" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "display": { + "announce_to_chat": true, + "description": { + "translate": "advancement.twilightforest.mazebreaker.desc", + "with": [ + { + "translate": "item.twilightforest.mazebreaker_pickaxe" + } + ] + }, + "frame": "challenge", + "hidden": false, + "icon": { + "item": "twilightforest:mazebreaker_pickaxe", + "nbt": "{Damage:0}" + }, + "show_toast": true, + "title": { + "translate": "advancement.twilightforest.mazebreaker" + } + }, + "requirements": [ + [ + "pick" + ] + ], + "rewards": { + "experience": 50 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/naga_armors.json b/src/generated/resources/data/twilightforest/advancements/naga_armors.json new file mode 100644 index 0000000000..2ec8cb201d --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/naga_armors.json @@ -0,0 +1,51 @@ +{ + "parent": "twilightforest:progress_naga", + "criteria": { + "armor": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:naga_chestplate" + ] + }, + { + "items": [ + "twilightforest:naga_leggings" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "display": { + "announce_to_chat": true, + "description": { + "translate": "advancement.twilightforest.naga_armors.desc", + "with": [ + { + "translate": "item.twilightforest.naga_scale" + } + ] + }, + "frame": "challenge", + "hidden": false, + "icon": { + "item": "twilightforest:naga_chestplate", + "nbt": "{Damage:0}" + }, + "show_toast": true, + "title": { + "translate": "advancement.twilightforest.naga_armors" + } + }, + "requirements": [ + [ + "armor" + ] + ], + "rewards": { + "experience": 25 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/ore_map.json b/src/generated/resources/data/twilightforest/advancements/ore_map.json new file mode 100644 index 0000000000..2530dee9c8 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/ore_map.json @@ -0,0 +1,42 @@ +{ + "parent": "twilightforest:maze_map", + "criteria": { + "ore_map": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:filled_ore_map" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "display": { + "announce_to_chat": true, + "description": { + "translate": "advancement.twilightforest.ore_map.desc", + "with": [ + { + "translate": "item.twilightforest.filled_ore_map" + } + ] + }, + "frame": "challenge", + "hidden": true, + "icon": { + "item": "twilightforest:filled_ore_map" + }, + "show_toast": true, + "title": { + "translate": "advancement.twilightforest.ore_map" + } + }, + "requirements": [ + [ + "ore_map" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/progress_glacier.json b/src/generated/resources/data/twilightforest/advancements/progress_glacier.json new file mode 100644 index 0000000000..548f1d955c --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/progress_glacier.json @@ -0,0 +1,94 @@ +{ + "parent": "twilightforest:progress_yeti", + "criteria": { + "previous_progression": { + "conditions": { + "player": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type_specific": { + "type": "player", + "advancements": { + "twilightforest:progress_yeti": true + } + } + } + } + ] + }, + "trigger": "minecraft:tick" + }, + "queen": { + "conditions": { + "entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "twilightforest:snow_queen" + } + } + ] + }, + "trigger": "minecraft:player_killed_entity" + }, + "trophy": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:snow_queen_trophy" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "was_in_fight": { + "conditions": { + "hurt_entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "twilightforest:snow_queen" + } + } + ] + }, + "trigger": "twilightforest:hurt_boss" + } + }, + "display": { + "announce_to_chat": true, + "description": { + "translate": "advancement.twilightforest.progress_glacier.desc", + "with": [ + { + "translate": "entity.twilightforest.snow_queen" + } + ] + }, + "frame": "goal", + "hidden": false, + "icon": { + "item": "twilightforest:snow_queen_trophy" + }, + "show_toast": true, + "title": { + "translate": "advancement.twilightforest.progress_glacier" + } + }, + "requirements": [ + [ + "queen", + "trophy", + "was_in_fight" + ], + [ + "previous_progression" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/progress_hydra.json b/src/generated/resources/data/twilightforest/advancements/progress_hydra.json new file mode 100644 index 0000000000..3e4171ea9f --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/progress_hydra.json @@ -0,0 +1,94 @@ +{ + "parent": "twilightforest:progress_labyrinth", + "criteria": { + "kill_hydra": { + "conditions": { + "entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "twilightforest:hydra" + } + } + ] + }, + "trigger": "minecraft:player_killed_entity" + }, + "stroganoff": { + "conditions": { + "player": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type_specific": { + "type": "player", + "advancements": { + "twilightforest:progress_labyrinth": true + } + } + } + } + ] + }, + "trigger": "minecraft:tick" + }, + "trophy": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:hydra_trophy" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "was_in_fight": { + "conditions": { + "hurt_entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "twilightforest:hydra" + } + } + ] + }, + "trigger": "twilightforest:hurt_boss" + } + }, + "display": { + "announce_to_chat": true, + "description": { + "translate": "advancement.twilightforest.kill_hydra.desc", + "with": [ + { + "translate": "entity.twilightforest.hydra" + } + ] + }, + "frame": "goal", + "hidden": false, + "icon": { + "item": "twilightforest:hydra_trophy" + }, + "show_toast": true, + "title": { + "translate": "advancement.twilightforest.kill_hydra" + } + }, + "requirements": [ + [ + "kill_hydra", + "trophy", + "was_in_fight" + ], + [ + "stroganoff" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/progress_knights.json b/src/generated/resources/data/twilightforest/advancements/progress_knights.json new file mode 100644 index 0000000000..b47e6c78ad --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/progress_knights.json @@ -0,0 +1,79 @@ +{ + "parent": "twilightforest:progress_trophy_pedestal", + "criteria": { + "all_knights": { + "conditions": {}, + "trigger": "twilightforest:kill_all_phantoms" + }, + "previous_progression": { + "conditions": { + "player": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type_specific": { + "type": "player", + "advancements": { + "twilightforest:progress_trophy_pedestal": true + } + } + } + } + ] + }, + "trigger": "minecraft:tick" + }, + "trophy": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:knight_phantom_trophy" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "was_in_fight": { + "conditions": { + "hurt_entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "twilightforest:knight_phantom" + } + } + ] + }, + "trigger": "twilightforest:hurt_boss" + } + }, + "display": { + "announce_to_chat": true, + "description": { + "translate": "advancement.twilightforest.progress_knights.desc" + }, + "frame": "goal", + "hidden": false, + "icon": { + "item": "twilightforest:knight_phantom_trophy" + }, + "show_toast": true, + "title": { + "translate": "advancement.twilightforest.progress_knights" + } + }, + "requirements": [ + [ + "all_knights", + "trophy", + "was_in_fight" + ], + [ + "previous_progression" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/progress_labyrinth.json b/src/generated/resources/data/twilightforest/advancements/progress_labyrinth.json new file mode 100644 index 0000000000..20c3a5d641 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/progress_labyrinth.json @@ -0,0 +1,57 @@ +{ + "parent": "twilightforest:progress_lich", + "criteria": { + "kill_lich": { + "conditions": { + "player": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type_specific": { + "type": "player", + "advancements": { + "twilightforest:progress_lich": true + } + } + } + } + ] + }, + "trigger": "minecraft:tick" + }, + "meef": { + "conditions": { + "item": { + "items": [ + "twilightforest:meef_stroganoff" + ] + } + }, + "trigger": "minecraft:consume_item" + } + }, + "display": { + "announce_to_chat": true, + "description": { + "translate": "advancement.twilightforest.progress_labyrinth.desc" + }, + "frame": "goal", + "hidden": false, + "icon": { + "item": "twilightforest:meef_stroganoff" + }, + "show_toast": true, + "title": { + "translate": "advancement.twilightforest.progress_labyrinth" + } + }, + "requirements": [ + [ + "meef" + ], + [ + "kill_lich" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/progress_lich.json b/src/generated/resources/data/twilightforest/advancements/progress_lich.json new file mode 100644 index 0000000000..99e13adf21 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/progress_lich.json @@ -0,0 +1,146 @@ +{ + "parent": "twilightforest:progress_naga", + "criteria": { + "kill_lich": { + "conditions": { + "entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "twilightforest:lich" + } + } + ] + }, + "trigger": "minecraft:player_killed_entity" + }, + "kill_naga": { + "conditions": { + "player": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type_specific": { + "type": "player", + "advancements": { + "twilightforest:progress_naga": true + } + } + } + } + ] + }, + "trigger": "minecraft:tick" + }, + "lifedrain_scepter": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:lifedrain_scepter" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "shield_scepter": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:fortification_scepter" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "trophy": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:lich_trophy" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "twilight_scepter": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:twilight_scepter" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "was_in_fight": { + "conditions": { + "hurt_entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "twilightforest:lich" + } + } + ] + }, + "trigger": "twilightforest:hurt_boss" + }, + "zombie_scepter": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:zombie_scepter" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "display": { + "announce_to_chat": true, + "description": { + "translate": "advancement.twilightforest.kill_lich.desc", + "with": [ + { + "translate": "entity.twilightforest.lich" + } + ] + }, + "frame": "goal", + "hidden": false, + "icon": { + "item": "twilightforest:lich_tower_miniature_structure" + }, + "show_toast": true, + "title": { + "translate": "advancement.twilightforest.kill_lich" + } + }, + "requirements": [ + [ + "kill_lich", + "trophy", + "lifedrain_scepter", + "twilight_scepter", + "zombie_scepter", + "shield_scepter", + "was_in_fight" + ], + [ + "kill_naga" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/progress_merge.json b/src/generated/resources/data/twilightforest/advancements/progress_merge.json new file mode 100644 index 0000000000..c50c252b94 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/progress_merge.json @@ -0,0 +1,99 @@ +{ + "parent": "twilightforest:progress_lich", + "criteria": { + "hydra": { + "conditions": { + "player": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type_specific": { + "type": "player", + "advancements": { + "twilightforest:progress_hydra": true + } + } + } + } + ] + }, + "trigger": "minecraft:tick" + }, + "snow_queen": { + "conditions": { + "player": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type_specific": { + "type": "player", + "advancements": { + "twilightforest:progress_glacier": true + } + } + } + } + ] + }, + "trigger": "minecraft:tick" + }, + "ur_ghast": { + "conditions": { + "player": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type_specific": { + "type": "player", + "advancements": { + "twilightforest:progress_ur_ghast": true + } + } + } + } + ] + }, + "trigger": "minecraft:tick" + } + }, + "display": { + "announce_to_chat": true, + "description": { + "translate": "advancement.twilightforest.progress_merge.desc", + "with": [ + { + "translate": "entity.twilightforest.hydra" + }, + { + "translate": "entity.twilightforest.ur_ghast" + }, + { + "translate": "entity.twilightforest.snow_queen" + } + ] + }, + "frame": "goal", + "hidden": false, + "icon": { + "item": "twilightforest:uberous_soil" + }, + "show_toast": true, + "title": { + "translate": "advancement.twilightforest.progress_merge" + } + }, + "requirements": [ + [ + "hydra" + ], + [ + "ur_ghast" + ], + [ + "snow_queen" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/progress_naga.json b/src/generated/resources/data/twilightforest/advancements/progress_naga.json new file mode 100644 index 0000000000..01927ec9c7 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/progress_naga.json @@ -0,0 +1,88 @@ +{ + "parent": "twilightforest:root", + "criteria": { + "naga": { + "conditions": { + "entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "twilightforest:naga" + } + } + ] + }, + "trigger": "minecraft:player_killed_entity" + }, + "scale": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:naga_scale" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "trophy": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:naga_trophy" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "was_in_fight": { + "conditions": { + "hurt_entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "twilightforest:naga" + } + } + ] + }, + "trigger": "twilightforest:hurt_boss" + } + }, + "display": { + "announce_to_chat": true, + "description": { + "translate": "advancement.twilightforest.kill_naga.desc", + "with": [ + { + "translate": "entity.twilightforest.naga" + }, + { + "translate": "item.twilightforest.naga_scale" + } + ] + }, + "frame": "goal", + "hidden": false, + "icon": { + "item": "twilightforest:naga_courtyard_miniature_structure" + }, + "show_toast": true, + "title": { + "translate": "advancement.twilightforest.kill_naga" + } + }, + "requirements": [ + [ + "naga", + "trophy", + "scale", + "was_in_fight" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/progress_troll.json b/src/generated/resources/data/twilightforest/advancements/progress_troll.json new file mode 100644 index 0000000000..ea27de69de --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/progress_troll.json @@ -0,0 +1,65 @@ +{ + "parent": "twilightforest:giants", + "criteria": { + "lamp": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:lamp_of_cinders" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "previous_progression": { + "conditions": { + "player": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type_specific": { + "type": "player", + "advancements": { + "twilightforest:progress_merge": true + } + } + } + } + ] + }, + "trigger": "minecraft:tick" + } + }, + "display": { + "announce_to_chat": true, + "description": { + "translate": "advancement.twilightforest.progress_troll.desc", + "with": [ + { + "translate": "item.twilightforest.lamp_of_cinders" + } + ] + }, + "frame": "goal", + "hidden": false, + "icon": { + "item": "twilightforest:lamp_of_cinders", + "nbt": "{Damage:0}" + }, + "show_toast": true, + "title": { + "translate": "advancement.twilightforest.progress_troll" + } + }, + "requirements": [ + [ + "lamp" + ], + [ + "previous_progression" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/progress_trophy_pedestal.json b/src/generated/resources/data/twilightforest/advancements/progress_trophy_pedestal.json new file mode 100644 index 0000000000..eccf6a1b37 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/progress_trophy_pedestal.json @@ -0,0 +1,51 @@ +{ + "parent": "twilightforest:progress_lich", + "criteria": { + "kill_lich": { + "conditions": { + "player": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type_specific": { + "type": "player", + "advancements": { + "twilightforest:progress_lich": true + } + } + } + } + ] + }, + "trigger": "minecraft:tick" + }, + "trophy_pedestal": { + "conditions": {}, + "trigger": "twilightforest:placed_on_trophy_pedestal" + } + }, + "display": { + "announce_to_chat": true, + "description": { + "translate": "advancement.twilightforest.progress_trophy_pedestal.desc" + }, + "frame": "goal", + "hidden": false, + "icon": { + "item": "twilightforest:trophy_pedestal" + }, + "show_toast": true, + "title": { + "translate": "advancement.twilightforest.progress_trophy_pedestal" + } + }, + "requirements": [ + [ + "trophy_pedestal" + ], + [ + "kill_lich" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/progress_ur_ghast.json b/src/generated/resources/data/twilightforest/advancements/progress_ur_ghast.json new file mode 100644 index 0000000000..4f08ddfb6d --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/progress_ur_ghast.json @@ -0,0 +1,94 @@ +{ + "parent": "twilightforest:ghast_trap", + "criteria": { + "ghast": { + "conditions": { + "entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "twilightforest:ur_ghast" + } + } + ] + }, + "trigger": "minecraft:player_killed_entity" + }, + "previous_progression": { + "conditions": { + "player": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type_specific": { + "type": "player", + "advancements": { + "twilightforest:progress_knights": true + } + } + } + } + ] + }, + "trigger": "minecraft:tick" + }, + "trophy": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:ur_ghast_trophy" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "was_in_fight": { + "conditions": { + "hurt_entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "twilightforest:ur_ghast" + } + } + ] + }, + "trigger": "twilightforest:hurt_boss" + } + }, + "display": { + "announce_to_chat": true, + "description": { + "translate": "advancement.twilightforest.progress_ur_ghast.desc", + "with": [ + { + "translate": "entity.twilightforest.ur_ghast" + } + ] + }, + "frame": "goal", + "hidden": false, + "icon": { + "item": "twilightforest:ur_ghast_trophy" + }, + "show_toast": true, + "title": { + "translate": "advancement.twilightforest.progress_ur_ghast" + } + }, + "requirements": [ + [ + "ghast", + "trophy", + "was_in_fight" + ], + [ + "previous_progression" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/progress_yeti.json b/src/generated/resources/data/twilightforest/advancements/progress_yeti.json new file mode 100644 index 0000000000..9fa69c4d59 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/progress_yeti.json @@ -0,0 +1,107 @@ +{ + "parent": "twilightforest:progress_lich", + "criteria": { + "fur": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:alpha_yeti_fur" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "previous_progression": { + "conditions": { + "player": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type_specific": { + "type": "player", + "advancements": { + "twilightforest:progress_lich": true + } + } + } + } + ] + }, + "trigger": "minecraft:tick" + }, + "trophy": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:alpha_yeti_trophy" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "was_in_fight": { + "conditions": { + "hurt_entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "twilightforest:alpha_yeti" + } + } + ] + }, + "trigger": "twilightforest:hurt_boss" + }, + "yeti": { + "conditions": { + "entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "twilightforest:alpha_yeti" + } + } + ] + }, + "trigger": "minecraft:player_killed_entity" + } + }, + "display": { + "announce_to_chat": true, + "description": { + "translate": "advancement.twilightforest.progress_yeti.desc", + "with": [ + { + "translate": "entity.twilightforest.alpha_yeti" + } + ] + }, + "frame": "goal", + "hidden": false, + "icon": { + "item": "twilightforest:alpha_yeti_fur" + }, + "show_toast": true, + "title": { + "translate": "advancement.twilightforest.progress_yeti" + } + }, + "requirements": [ + [ + "yeti", + "trophy", + "fur", + "was_in_fight" + ], + [ + "previous_progression" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/progression_end.json b/src/generated/resources/data/twilightforest/advancements/progression_end.json new file mode 100644 index 0000000000..2a46934628 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/progression_end.json @@ -0,0 +1,63 @@ +{ + "parent": "twilightforest:progress_troll", + "criteria": { + "plateau": { + "conditions": { + "player": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "location": { + "biome": "twilightforest:final_plateau" + } + } + } + ] + }, + "trigger": "minecraft:location" + }, + "previous_progression": { + "conditions": { + "player": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type_specific": { + "type": "player", + "advancements": { + "twilightforest:progress_troll": true + } + } + } + } + ] + }, + "trigger": "minecraft:tick" + } + }, + "display": { + "announce_to_chat": false, + "description": { + "translate": "advancement.twilightforest.progression_end.desc" + }, + "frame": "goal", + "hidden": false, + "icon": { + "item": "minecraft:structure_void" + }, + "show_toast": true, + "title": { + "translate": "advancement.twilightforest.progression_end" + } + }, + "requirements": [ + [ + "previous_progression" + ], + [ + "plateau" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/quest_ram.json b/src/generated/resources/data/twilightforest/advancements/quest_ram.json new file mode 100644 index 0000000000..bbb11c0787 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/quest_ram.json @@ -0,0 +1,37 @@ +{ + "parent": "twilightforest:root", + "criteria": { + "quest_ram_complete": { + "conditions": {}, + "trigger": "twilightforest:complete_quest_ram" + } + }, + "display": { + "announce_to_chat": true, + "description": { + "translate": "advancement.twilightforest.quest_ram.desc", + "with": [ + { + "translate": "entity.twilightforest.quest_ram" + } + ] + }, + "frame": "goal", + "hidden": false, + "icon": { + "item": "twilightforest:quest_ram_trophy" + }, + "show_toast": true, + "title": { + "translate": "advancement.twilightforest.quest_ram" + } + }, + "requirements": [ + [ + "quest_ram_complete" + ] + ], + "rewards": { + "experience": 100 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/aurora_pillar.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/aurora_pillar.json new file mode 100644 index 0000000000..29f3deae12 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/aurora_pillar.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_slab": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:aurora_slab" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:aurora_pillar" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_slab", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:aurora_pillar" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/canopy_bookshelf.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/canopy_bookshelf.json new file mode 100644 index 0000000000..cbd427aecb --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/canopy_bookshelf.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:canopy_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:canopy_bookshelf" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:canopy_bookshelf" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/castleblock/bold_castle_brick_pillar.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/castleblock/bold_castle_brick_pillar.json new file mode 100644 index 0000000000..08febfc485 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/castleblock/bold_castle_brick_pillar.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_castle_brick": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:castle_brick" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:castleblock/bold_castle_brick_pillar" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_castle_brick", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:castleblock/bold_castle_brick_pillar" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/castleblock/bold_castle_brick_stairs.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/castleblock/bold_castle_brick_stairs.json new file mode 100644 index 0000000000..59b3c84dd5 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/castleblock/bold_castle_brick_stairs.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:bold_castle_brick_pillar" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:castleblock/bold_castle_brick_stairs" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:castleblock/bold_castle_brick_stairs" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/castleblock/bold_castle_brick_tile.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/castleblock/bold_castle_brick_tile.json new file mode 100644 index 0000000000..78d748622e --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/castleblock/bold_castle_brick_tile.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_castle_brick": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:castle_brick" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:castleblock/bold_castle_brick_tile" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_castle_brick", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:castleblock/bold_castle_brick_tile" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/castleblock/bold_castle_pillar_from_tile.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/castleblock/bold_castle_pillar_from_tile.json new file mode 100644 index 0000000000..a9e763c847 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/castleblock/bold_castle_pillar_from_tile.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_castle_brick": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:castle_brick" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:castleblock/bold_castle_pillar_from_tile" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_castle_brick", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:castleblock/bold_castle_pillar_from_tile" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/castleblock/castle_brick_stairs.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/castleblock/castle_brick_stairs.json new file mode 100644 index 0000000000..f0dad90f13 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/castleblock/castle_brick_stairs.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:castle_brick" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:castleblock/castle_brick_stairs" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:castleblock/castle_brick_stairs" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/castleblock/cracked_castle_brick_stairs.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/castleblock/cracked_castle_brick_stairs.json new file mode 100644 index 0000000000..4b1bb6a5a3 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/castleblock/cracked_castle_brick_stairs.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:cracked_castle_brick" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:castleblock/cracked_castle_brick_stairs" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:castleblock/cracked_castle_brick_stairs" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/castleblock/encased_castle_brick_stairs.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/castleblock/encased_castle_brick_stairs.json new file mode 100644 index 0000000000..aafc728e95 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/castleblock/encased_castle_brick_stairs.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:encased_castle_brick_pillar" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:castleblock/encased_castle_brick_stairs" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:castleblock/encased_castle_brick_stairs" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/castleblock/encased_castle_pillar.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/castleblock/encased_castle_pillar.json new file mode 100644 index 0000000000..bb9b42a16b --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/castleblock/encased_castle_pillar.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_castle_brick": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:castle_brick" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:castleblock/encased_castle_pillar" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_castle_brick", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:castleblock/encased_castle_pillar" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/castleblock/mossy_castle_brick.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/castleblock/mossy_castle_brick.json new file mode 100644 index 0000000000..12f7c8c27e --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/castleblock/mossy_castle_brick.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:castle_brick" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:castleblock/mossy_castle_brick" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:castleblock/mossy_castle_brick" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/castleblock/mossy_castle_brick_stairs.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/castleblock/mossy_castle_brick_stairs.json new file mode 100644 index 0000000000..b035f0ff79 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/castleblock/mossy_castle_brick_stairs.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:mossy_castle_brick" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:castleblock/mossy_castle_brick_stairs" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:castleblock/mossy_castle_brick_stairs" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/castleblock/smelted_cracked_castle_brick.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/castleblock/smelted_cracked_castle_brick.json new file mode 100644 index 0000000000..9af25aab0c --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/castleblock/smelted_cracked_castle_brick.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:castle_brick" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:castleblock/smelted_cracked_castle_brick" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:castleblock/smelted_cracked_castle_brick" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/castleblock/thick_castle_brick.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/castleblock/thick_castle_brick.json new file mode 100644 index 0000000000..5f20f5ca1f --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/castleblock/thick_castle_brick.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_castle_brick": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:castle_brick" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:castleblock/thick_castle_brick" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_castle_brick", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:castleblock/thick_castle_brick" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/castleblock/worn_castle_brick_stairs.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/castleblock/worn_castle_brick_stairs.json new file mode 100644 index 0000000000..3e1733265a --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/castleblock/worn_castle_brick_stairs.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:worn_castle_brick" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:castleblock/worn_castle_brick_stairs" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:castleblock/worn_castle_brick_stairs" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/compressed_blocks/arctic_block.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/compressed_blocks/arctic_block.json new file mode 100644 index 0000000000..45bf1f3180 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/compressed_blocks/arctic_block.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "tag": "twilightforest:arctic_fur" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:compressed_blocks/arctic_block" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:compressed_blocks/arctic_block" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/compressed_blocks/carminite_block.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/compressed_blocks/carminite_block.json new file mode 100644 index 0000000000..170efa835c --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/compressed_blocks/carminite_block.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "tag": "forge:gems/carminite" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:compressed_blocks/carminite_block" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:compressed_blocks/carminite_block" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/compressed_blocks/fiery_block.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/compressed_blocks/fiery_block.json new file mode 100644 index 0000000000..f0ff9b71e0 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/compressed_blocks/fiery_block.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "tag": "forge:ingots/fiery" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:compressed_blocks/fiery_block" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:compressed_blocks/fiery_block" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/compressed_blocks/ironwood_block.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/compressed_blocks/ironwood_block.json new file mode 100644 index 0000000000..427c562e28 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/compressed_blocks/ironwood_block.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "tag": "forge:ingots/ironwood" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:compressed_blocks/ironwood_block" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:compressed_blocks/ironwood_block" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/compressed_blocks/knightmetal_block.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/compressed_blocks/knightmetal_block.json new file mode 100644 index 0000000000..148c654ac0 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/compressed_blocks/knightmetal_block.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "tag": "forge:ingots/knightmetal" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:compressed_blocks/knightmetal_block" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:compressed_blocks/knightmetal_block" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/compressed_blocks/steeleaf_block.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/compressed_blocks/steeleaf_block.json new file mode 100644 index 0000000000..46cb80b3af --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/compressed_blocks/steeleaf_block.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "tag": "forge:ingots/steeleaf" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:compressed_blocks/steeleaf_block" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:compressed_blocks/steeleaf_block" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/empty_canopy_bookshelf.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/empty_canopy_bookshelf.json new file mode 100644 index 0000000000..86a4a2cc5c --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/empty_canopy_bookshelf.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:canopy_slab" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:empty_canopy_bookshelf" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:empty_canopy_bookshelf" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/giant_cobblestone_to_cobblestone.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/giant_cobblestone_to_cobblestone.json new file mode 100644 index 0000000000..6e46c35d41 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/giant_cobblestone_to_cobblestone.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:giant_cobblestone" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:giant_cobblestone_to_cobblestone" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:giant_cobblestone_to_cobblestone" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/giant_leaves_to_oak_leaves.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/giant_leaves_to_oak_leaves.json new file mode 100644 index 0000000000..13ddbb1b2d --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/giant_leaves_to_oak_leaves.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:giant_leaves" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:giant_leaves_to_oak_leaves" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:giant_leaves_to_oak_leaves" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/giant_log_to_oak_planks.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/giant_log_to_oak_planks.json new file mode 100644 index 0000000000..dbe0bdc2da --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/giant_log_to_oak_planks.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:giant_log" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:giant_log_to_oak_planks" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:giant_log_to_oak_planks" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/maze_stone/mossy_mazestone.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/maze_stone/mossy_mazestone.json new file mode 100644 index 0000000000..f8cc6e8a9e --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/maze_stone/mossy_mazestone.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:mazestone_brick" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:maze_stone/mossy_mazestone" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:maze_stone/mossy_mazestone" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/maze_stone/smelted_maze_stone_cracked.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/maze_stone/smelted_maze_stone_cracked.json new file mode 100644 index 0000000000..8e68e465c8 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/maze_stone/smelted_maze_stone_cracked.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:mazestone_brick" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:maze_stone/smelted_maze_stone_cracked" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:maze_stone/smelted_maze_stone_cracked" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/mossy_underbrick.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/mossy_underbrick.json new file mode 100644 index 0000000000..be9e918945 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/mossy_underbrick.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:underbrick" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:mossy_underbrick" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:mossy_underbrick" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/nagastone/cracked_nagastone_stairs_left.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/nagastone/cracked_nagastone_stairs_left.json new file mode 100644 index 0000000000..9abfaefbcb --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/nagastone/cracked_nagastone_stairs_left.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:cracked_etched_nagastone" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:nagastone/cracked_nagastone_stairs_left" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:nagastone/cracked_nagastone_stairs_left" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/nagastone/cracked_nagastone_stairs_right.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/nagastone/cracked_nagastone_stairs_right.json new file mode 100644 index 0000000000..60724d1d91 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/nagastone/cracked_nagastone_stairs_right.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:cracked_etched_nagastone" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:nagastone/cracked_nagastone_stairs_right" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:nagastone/cracked_nagastone_stairs_right" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/nagastone/mossy_etched_nagastone.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/nagastone/mossy_etched_nagastone.json new file mode 100644 index 0000000000..38402e97c5 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/nagastone/mossy_etched_nagastone.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:etched_nagastone" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:nagastone/mossy_etched_nagastone" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:nagastone/mossy_etched_nagastone" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/nagastone/mossy_nagastone_pillar.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/nagastone/mossy_nagastone_pillar.json new file mode 100644 index 0000000000..0d8ad32fdb --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/nagastone/mossy_nagastone_pillar.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:nagastone_pillar" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:nagastone/mossy_nagastone_pillar" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:nagastone/mossy_nagastone_pillar" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/nagastone/mossy_nagastone_stairs_left.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/nagastone/mossy_nagastone_stairs_left.json new file mode 100644 index 0000000000..4769448e36 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/nagastone/mossy_nagastone_stairs_left.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:mossy_etched_nagastone" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:nagastone/mossy_nagastone_stairs_left" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:nagastone/mossy_nagastone_stairs_left" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/nagastone/mossy_nagastone_stairs_right.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/nagastone/mossy_nagastone_stairs_right.json new file mode 100644 index 0000000000..27d4b107f2 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/nagastone/mossy_nagastone_stairs_right.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:mossy_etched_nagastone" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:nagastone/mossy_nagastone_stairs_right" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:nagastone/mossy_nagastone_stairs_right" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/nagastone/nagastone_spiral.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/nagastone/nagastone_spiral.json new file mode 100644 index 0000000000..1005feced1 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/nagastone/nagastone_spiral.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:spiral_bricks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:nagastone/nagastone_spiral" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:nagastone/nagastone_spiral" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/nagastone/nagastone_stairs_left.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/nagastone/nagastone_stairs_left.json new file mode 100644 index 0000000000..708b5f744c --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/nagastone/nagastone_stairs_left.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:etched_nagastone" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:nagastone/nagastone_stairs_left" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:nagastone/nagastone_stairs_left" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/nagastone/nagastone_stairs_right.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/nagastone/nagastone_stairs_right.json new file mode 100644 index 0000000000..cf73b71c1e --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/nagastone/nagastone_stairs_right.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:etched_nagastone" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:nagastone/nagastone_stairs_right" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:nagastone/nagastone_stairs_right" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/nagastone/smelted_cracked_etched_nagastone.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/nagastone/smelted_cracked_etched_nagastone.json new file mode 100644 index 0000000000..7e94107b6c --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/nagastone/smelted_cracked_etched_nagastone.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:etched_nagastone" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:nagastone/smelted_cracked_etched_nagastone" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:nagastone/smelted_cracked_etched_nagastone" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/nagastone/smelted_cracked_nagastone_pillar.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/nagastone/smelted_cracked_nagastone_pillar.json new file mode 100644 index 0000000000..2c10c009f8 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/nagastone/smelted_cracked_nagastone_pillar.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:nagastone_pillar" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:nagastone/smelted_cracked_nagastone_pillar" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:nagastone/smelted_cracked_nagastone_pillar" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/smelted_cracked_underbrick.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/smelted_cracked_underbrick.json new file mode 100644 index 0000000000..df684025ed --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/smelted_cracked_underbrick.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:underbrick" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:smelted_cracked_underbrick" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:smelted_cracked_underbrick" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/tf_moss_to_vanilla.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/tf_moss_to_vanilla.json new file mode 100644 index 0000000000..1fe806a93a --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/tf_moss_to_vanilla.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:transformation_powder" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:tf_moss_to_vanilla" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:tf_moss_to_vanilla" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/aurora_slab_slab.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/aurora_slab_slab.json new file mode 100644 index 0000000000..607b605e97 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/aurora_slab_slab.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:aurora_block" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/aurora_slab_slab" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/aurora_slab_slab" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/canopy_from_stripped_planks.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/canopy_from_stripped_planks.json new file mode 100644 index 0000000000..cb3b710ab3 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/canopy_from_stripped_planks.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:stripped_canopy_log" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/canopy_from_stripped_planks" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/canopy_from_stripped_planks" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/canopy_from_stripped_wood_planks.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/canopy_from_stripped_wood_planks.json new file mode 100644 index 0000000000..50acbe7855 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/canopy_from_stripped_wood_planks.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:stripped_canopy_wood" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/canopy_from_stripped_wood_planks" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/canopy_from_stripped_wood_planks" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/canopy_from_wood_planks.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/canopy_from_wood_planks.json new file mode 100644 index 0000000000..706b48a167 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/canopy_from_wood_planks.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:canopy_wood" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/canopy_from_wood_planks" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/canopy_from_wood_planks" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/canopy_planks.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/canopy_planks.json new file mode 100644 index 0000000000..3e6fb79fc3 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/canopy_planks.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:canopy_log" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/canopy_planks" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/canopy_planks" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/canopy_slab.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/canopy_slab.json new file mode 100644 index 0000000000..78b848a939 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/canopy_slab.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:canopy_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/canopy_slab" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/canopy_slab" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/canopy_stairs.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/canopy_stairs.json new file mode 100644 index 0000000000..f1a60a642e --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/canopy_stairs.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:canopy_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/canopy_stairs" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/canopy_stairs" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/canopy_stripped_wood.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/canopy_stripped_wood.json new file mode 100644 index 0000000000..a2044792bc --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/canopy_stripped_wood.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:stripped_canopy_log" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/canopy_stripped_wood" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/canopy_stripped_wood" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/canopy_wood.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/canopy_wood.json new file mode 100644 index 0000000000..79bae9b1a7 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/canopy_wood.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:canopy_log" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/canopy_wood" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/canopy_wood" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/darkwood_from_stripped_planks.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/darkwood_from_stripped_planks.json new file mode 100644 index 0000000000..b8216b360d --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/darkwood_from_stripped_planks.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:stripped_dark_log" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/darkwood_from_stripped_planks" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/darkwood_from_stripped_planks" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/darkwood_from_stripped_wood_planks.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/darkwood_from_stripped_wood_planks.json new file mode 100644 index 0000000000..d3d9430620 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/darkwood_from_stripped_wood_planks.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:stripped_dark_wood" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/darkwood_from_stripped_wood_planks" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/darkwood_from_stripped_wood_planks" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/darkwood_from_wood_planks.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/darkwood_from_wood_planks.json new file mode 100644 index 0000000000..74dc717332 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/darkwood_from_wood_planks.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:dark_wood" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/darkwood_from_wood_planks" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/darkwood_from_wood_planks" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/darkwood_planks.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/darkwood_planks.json new file mode 100644 index 0000000000..3ceacbba99 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/darkwood_planks.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:dark_log" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/darkwood_planks" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/darkwood_planks" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/darkwood_slab.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/darkwood_slab.json new file mode 100644 index 0000000000..76cba2ba15 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/darkwood_slab.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:dark_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/darkwood_slab" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/darkwood_slab" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/darkwood_stairs.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/darkwood_stairs.json new file mode 100644 index 0000000000..4a219caf67 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/darkwood_stairs.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:dark_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/darkwood_stairs" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/darkwood_stairs" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/darkwood_stripped_wood.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/darkwood_stripped_wood.json new file mode 100644 index 0000000000..14b811d7a2 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/darkwood_stripped_wood.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:stripped_dark_log" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/darkwood_stripped_wood" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/darkwood_stripped_wood" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/darkwood_wood.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/darkwood_wood.json new file mode 100644 index 0000000000..32ca9016fc --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/darkwood_wood.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:dark_log" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/darkwood_wood" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/darkwood_wood" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/mangrove_from_stripped_planks.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/mangrove_from_stripped_planks.json new file mode 100644 index 0000000000..bcb8762d93 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/mangrove_from_stripped_planks.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:stripped_mangrove_log" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/mangrove_from_stripped_planks" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/mangrove_from_stripped_planks" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/mangrove_from_stripped_wood_planks.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/mangrove_from_stripped_wood_planks.json new file mode 100644 index 0000000000..21342234fb --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/mangrove_from_stripped_wood_planks.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:stripped_mangrove_wood" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/mangrove_from_stripped_wood_planks" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/mangrove_from_stripped_wood_planks" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/mangrove_from_wood_planks.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/mangrove_from_wood_planks.json new file mode 100644 index 0000000000..c9e5c00163 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/mangrove_from_wood_planks.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:mangrove_wood" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/mangrove_from_wood_planks" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/mangrove_from_wood_planks" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/mangrove_planks.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/mangrove_planks.json new file mode 100644 index 0000000000..085980c58b --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/mangrove_planks.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:mangrove_log" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/mangrove_planks" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/mangrove_planks" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/mangrove_slab.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/mangrove_slab.json new file mode 100644 index 0000000000..e57fb42c75 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/mangrove_slab.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:mangrove_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/mangrove_slab" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/mangrove_slab" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/mangrove_stairs.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/mangrove_stairs.json new file mode 100644 index 0000000000..96809c6d5a --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/mangrove_stairs.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:mangrove_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/mangrove_stairs" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/mangrove_stairs" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/mangrove_stripped_wood.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/mangrove_stripped_wood.json new file mode 100644 index 0000000000..3f13492c07 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/mangrove_stripped_wood.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:stripped_mangrove_log" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/mangrove_stripped_wood" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/mangrove_stripped_wood" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/mangrove_wood.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/mangrove_wood.json new file mode 100644 index 0000000000..2bf60cad08 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/mangrove_wood.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:mangrove_log" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/mangrove_wood" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/mangrove_wood" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/mining_from_stripped_planks.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/mining_from_stripped_planks.json new file mode 100644 index 0000000000..222be20af1 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/mining_from_stripped_planks.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:stripped_mining_log" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/mining_from_stripped_planks" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/mining_from_stripped_planks" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/mining_from_stripped_wood_planks.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/mining_from_stripped_wood_planks.json new file mode 100644 index 0000000000..d20d256dcc --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/mining_from_stripped_wood_planks.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:stripped_mining_wood" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/mining_from_stripped_wood_planks" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/mining_from_stripped_wood_planks" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/mining_from_wood_planks.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/mining_from_wood_planks.json new file mode 100644 index 0000000000..da766a3ec1 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/mining_from_wood_planks.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:mining_wood" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/mining_from_wood_planks" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/mining_from_wood_planks" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/mining_planks.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/mining_planks.json new file mode 100644 index 0000000000..92df19bc53 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/mining_planks.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:mining_log" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/mining_planks" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/mining_planks" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/mining_slab.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/mining_slab.json new file mode 100644 index 0000000000..8b55324cdc --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/mining_slab.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:mining_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/mining_slab" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/mining_slab" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/mining_stairs.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/mining_stairs.json new file mode 100644 index 0000000000..0767c1456f --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/mining_stairs.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:mining_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/mining_stairs" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/mining_stairs" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/mining_stripped_wood.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/mining_stripped_wood.json new file mode 100644 index 0000000000..19b8aed1da --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/mining_stripped_wood.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:stripped_mining_log" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/mining_stripped_wood" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/mining_stripped_wood" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/mining_wood.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/mining_wood.json new file mode 100644 index 0000000000..fd467a0399 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/mining_wood.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:mining_log" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/mining_wood" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/mining_wood" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/mossy_towerwood.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/mossy_towerwood.json new file mode 100644 index 0000000000..5db5b5fe0a --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/mossy_towerwood.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:towerwood" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/mossy_towerwood" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/mossy_towerwood" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/smoked_cracked_towerwood.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/smoked_cracked_towerwood.json new file mode 100644 index 0000000000..0c3ebd1747 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/smoked_cracked_towerwood.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:towerwood" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/smoked_cracked_towerwood" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/smoked_cracked_towerwood" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/sorting_from_stripped_planks.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/sorting_from_stripped_planks.json new file mode 100644 index 0000000000..4b776874f6 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/sorting_from_stripped_planks.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:stripped_sorting_log" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/sorting_from_stripped_planks" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/sorting_from_stripped_planks" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/sorting_from_stripped_wood_planks.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/sorting_from_stripped_wood_planks.json new file mode 100644 index 0000000000..796affe0cb --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/sorting_from_stripped_wood_planks.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:stripped_sorting_wood" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/sorting_from_stripped_wood_planks" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/sorting_from_stripped_wood_planks" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/sorting_from_wood_planks.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/sorting_from_wood_planks.json new file mode 100644 index 0000000000..57bad9e267 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/sorting_from_wood_planks.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:sorting_wood" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/sorting_from_wood_planks" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/sorting_from_wood_planks" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/sorting_planks.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/sorting_planks.json new file mode 100644 index 0000000000..d795a51353 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/sorting_planks.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:sorting_log" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/sorting_planks" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/sorting_planks" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/sorting_slab.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/sorting_slab.json new file mode 100644 index 0000000000..9bfb413098 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/sorting_slab.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:sorting_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/sorting_slab" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/sorting_slab" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/sorting_stairs.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/sorting_stairs.json new file mode 100644 index 0000000000..9d139b8432 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/sorting_stairs.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:sorting_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/sorting_stairs" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/sorting_stairs" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/sorting_stripped_wood.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/sorting_stripped_wood.json new file mode 100644 index 0000000000..f9df8229e3 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/sorting_stripped_wood.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:stripped_sorting_log" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/sorting_stripped_wood" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/sorting_stripped_wood" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/sorting_wood.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/sorting_wood.json new file mode 100644 index 0000000000..8cf4ca4b62 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/sorting_wood.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:sorting_log" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/sorting_wood" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/sorting_wood" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/time_from_stripped_planks.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/time_from_stripped_planks.json new file mode 100644 index 0000000000..37632a1647 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/time_from_stripped_planks.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:stripped_time_log" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/time_from_stripped_planks" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/time_from_stripped_planks" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/time_from_stripped_wood_planks.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/time_from_stripped_wood_planks.json new file mode 100644 index 0000000000..c62d99c7c3 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/time_from_stripped_wood_planks.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:stripped_time_wood" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/time_from_stripped_wood_planks" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/time_from_stripped_wood_planks" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/time_from_wood_planks.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/time_from_wood_planks.json new file mode 100644 index 0000000000..7621545a07 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/time_from_wood_planks.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:time_wood" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/time_from_wood_planks" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/time_from_wood_planks" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/time_planks.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/time_planks.json new file mode 100644 index 0000000000..2ff233d97a --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/time_planks.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:time_log" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/time_planks" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/time_planks" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/time_slab.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/time_slab.json new file mode 100644 index 0000000000..37588d7db5 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/time_slab.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:time_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/time_slab" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/time_slab" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/time_stairs.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/time_stairs.json new file mode 100644 index 0000000000..9524cd59c6 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/time_stairs.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:time_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/time_stairs" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/time_stairs" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/time_stripped_wood.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/time_stripped_wood.json new file mode 100644 index 0000000000..a5220a42ca --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/time_stripped_wood.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:stripped_time_log" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/time_stripped_wood" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/time_stripped_wood" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/time_wood.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/time_wood.json new file mode 100644 index 0000000000..56a1d7f916 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/time_wood.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:time_log" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/time_wood" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/time_wood" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/transformation_from_stripped_planks.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/transformation_from_stripped_planks.json new file mode 100644 index 0000000000..7f5d8eee03 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/transformation_from_stripped_planks.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:stripped_transformation_log" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/transformation_from_stripped_planks" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/transformation_from_stripped_planks" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/transformation_from_stripped_wood_planks.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/transformation_from_stripped_wood_planks.json new file mode 100644 index 0000000000..99808ebea3 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/transformation_from_stripped_wood_planks.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:stripped_transformation_wood" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/transformation_from_stripped_wood_planks" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/transformation_from_stripped_wood_planks" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/transformation_from_wood_planks.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/transformation_from_wood_planks.json new file mode 100644 index 0000000000..1002c0ab5b --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/transformation_from_wood_planks.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:transformation_wood" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/transformation_from_wood_planks" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/transformation_from_wood_planks" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/transformation_planks.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/transformation_planks.json new file mode 100644 index 0000000000..74514aa59d --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/transformation_planks.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:transformation_log" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/transformation_planks" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/transformation_planks" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/transformation_slab.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/transformation_slab.json new file mode 100644 index 0000000000..cf30221240 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/transformation_slab.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:transformation_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/transformation_slab" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/transformation_slab" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/transformation_stairs.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/transformation_stairs.json new file mode 100644 index 0000000000..9a01b8bcf3 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/transformation_stairs.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:transformation_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/transformation_stairs" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/transformation_stairs" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/transformation_stripped_wood.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/transformation_stripped_wood.json new file mode 100644 index 0000000000..b717e6b4ca --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/transformation_stripped_wood.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:stripped_transformation_log" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/transformation_stripped_wood" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/transformation_stripped_wood" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/transformation_wood.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/transformation_wood.json new file mode 100644 index 0000000000..91157281d0 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/transformation_wood.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:transformation_log" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/transformation_wood" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/transformation_wood" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/twilight_oak_from_stripped_planks.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/twilight_oak_from_stripped_planks.json new file mode 100644 index 0000000000..5dd45d50c5 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/twilight_oak_from_stripped_planks.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:stripped_twilight_oak_log" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/twilight_oak_from_stripped_planks" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/twilight_oak_from_stripped_planks" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/twilight_oak_from_stripped_wood_planks.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/twilight_oak_from_stripped_wood_planks.json new file mode 100644 index 0000000000..a2edc80e9e --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/twilight_oak_from_stripped_wood_planks.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:stripped_twilight_oak_wood" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/twilight_oak_from_stripped_wood_planks" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/twilight_oak_from_stripped_wood_planks" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/twilight_oak_from_wood_planks.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/twilight_oak_from_wood_planks.json new file mode 100644 index 0000000000..dfb4574a58 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/twilight_oak_from_wood_planks.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:twilight_oak_wood" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/twilight_oak_from_wood_planks" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/twilight_oak_from_wood_planks" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/twilight_oak_planks.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/twilight_oak_planks.json new file mode 100644 index 0000000000..47cf50cf85 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/twilight_oak_planks.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:twilight_oak_log" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/twilight_oak_planks" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/twilight_oak_planks" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/twilight_oak_slab.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/twilight_oak_slab.json new file mode 100644 index 0000000000..47e5435bd9 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/twilight_oak_slab.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:twilight_oak_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/twilight_oak_slab" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/twilight_oak_slab" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/twilight_oak_stairs.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/twilight_oak_stairs.json new file mode 100644 index 0000000000..4ed691abf3 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/twilight_oak_stairs.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:twilight_oak_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/twilight_oak_stairs" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/twilight_oak_stairs" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/twilight_oak_stripped_wood.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/twilight_oak_stripped_wood.json new file mode 100644 index 0000000000..f4c99e12ff --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/twilight_oak_stripped_wood.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:stripped_twilight_oak_log" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/twilight_oak_stripped_wood" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/twilight_oak_stripped_wood" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/twilight_oak_wood.json b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/twilight_oak_wood.json new file mode 100644 index 0000000000..ad262434cd --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/building_blocks/wood/twilight_oak_wood.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:twilight_oak_log" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/twilight_oak_wood" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/twilight_oak_wood" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/combat/equipment/arctic_boots.json b/src/generated/resources/data/twilightforest/advancements/recipes/combat/equipment/arctic_boots.json new file mode 100644 index 0000000000..05a81a65f1 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/combat/equipment/arctic_boots.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "tag": "twilightforest:arctic_fur" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:equipment/arctic_boots" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:equipment/arctic_boots" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/combat/equipment/arctic_chestplate.json b/src/generated/resources/data/twilightforest/advancements/recipes/combat/equipment/arctic_chestplate.json new file mode 100644 index 0000000000..4762faeba8 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/combat/equipment/arctic_chestplate.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "tag": "twilightforest:arctic_fur" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:equipment/arctic_chestplate" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:equipment/arctic_chestplate" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/combat/equipment/arctic_helmet.json b/src/generated/resources/data/twilightforest/advancements/recipes/combat/equipment/arctic_helmet.json new file mode 100644 index 0000000000..96ce0ed57e --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/combat/equipment/arctic_helmet.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "tag": "twilightforest:arctic_fur" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:equipment/arctic_helmet" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:equipment/arctic_helmet" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/combat/equipment/arctic_leggings.json b/src/generated/resources/data/twilightforest/advancements/recipes/combat/equipment/arctic_leggings.json new file mode 100644 index 0000000000..9bf1ae6e18 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/combat/equipment/arctic_leggings.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "tag": "twilightforest:arctic_fur" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:equipment/arctic_leggings" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:equipment/arctic_leggings" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/combat/equipment/block_and_chain.json b/src/generated/resources/data/twilightforest/advancements/recipes/combat/equipment/block_and_chain.json new file mode 100644 index 0000000000..9a6377f01e --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/combat/equipment/block_and_chain.json @@ -0,0 +1,56 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_block": { + "conditions": { + "items": [ + { + "tag": "forge:storage_blocks/knightmetal" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_ingot": { + "conditions": { + "items": [ + { + "tag": "forge:ingots/knightmetal" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_ring": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:knightmetal_ring" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:equipment/block_and_chain" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_block", + "has_ingot", + "has_ring", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:equipment/block_and_chain" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/combat/equipment/fiery_boots.json b/src/generated/resources/data/twilightforest/advancements/recipes/combat/equipment/fiery_boots.json new file mode 100644 index 0000000000..2082bcc511 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/combat/equipment/fiery_boots.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "tag": "forge:ingots/fiery" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:equipment/fiery_boots" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:equipment/fiery_boots" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/combat/equipment/fiery_chestplate.json b/src/generated/resources/data/twilightforest/advancements/recipes/combat/equipment/fiery_chestplate.json new file mode 100644 index 0000000000..21b338a068 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/combat/equipment/fiery_chestplate.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "tag": "forge:ingots/fiery" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:equipment/fiery_chestplate" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:equipment/fiery_chestplate" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/combat/equipment/fiery_fiery_boots.json b/src/generated/resources/data/twilightforest/advancements/recipes/combat/equipment/fiery_fiery_boots.json new file mode 100644 index 0000000000..0287815d75 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/combat/equipment/fiery_fiery_boots.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "tag": "twilightforest:fiery_vial" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:equipment/fiery_fiery_boots" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:equipment/fiery_fiery_boots" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/combat/equipment/fiery_fiery_chestplate.json b/src/generated/resources/data/twilightforest/advancements/recipes/combat/equipment/fiery_fiery_chestplate.json new file mode 100644 index 0000000000..70184ce066 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/combat/equipment/fiery_fiery_chestplate.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "tag": "twilightforest:fiery_vial" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:equipment/fiery_fiery_chestplate" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:equipment/fiery_fiery_chestplate" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/combat/equipment/fiery_fiery_helmet.json b/src/generated/resources/data/twilightforest/advancements/recipes/combat/equipment/fiery_fiery_helmet.json new file mode 100644 index 0000000000..d5454aae53 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/combat/equipment/fiery_fiery_helmet.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "tag": "twilightforest:fiery_vial" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:equipment/fiery_fiery_helmet" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:equipment/fiery_fiery_helmet" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/combat/equipment/fiery_fiery_leggings.json b/src/generated/resources/data/twilightforest/advancements/recipes/combat/equipment/fiery_fiery_leggings.json new file mode 100644 index 0000000000..db06bf6fb4 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/combat/equipment/fiery_fiery_leggings.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "tag": "twilightforest:fiery_vial" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:equipment/fiery_fiery_leggings" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:equipment/fiery_fiery_leggings" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/combat/equipment/fiery_helmet.json b/src/generated/resources/data/twilightforest/advancements/recipes/combat/equipment/fiery_helmet.json new file mode 100644 index 0000000000..3ffdbf218b --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/combat/equipment/fiery_helmet.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "tag": "forge:ingots/fiery" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:equipment/fiery_helmet" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:equipment/fiery_helmet" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/combat/equipment/fiery_iron_sword.json b/src/generated/resources/data/twilightforest/advancements/recipes/combat/equipment/fiery_iron_sword.json new file mode 100644 index 0000000000..4e55bbb331 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/combat/equipment/fiery_iron_sword.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "tag": "twilightforest:fiery_vial" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:equipment/fiery_iron_sword" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:equipment/fiery_iron_sword" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/combat/equipment/fiery_leggings.json b/src/generated/resources/data/twilightforest/advancements/recipes/combat/equipment/fiery_leggings.json new file mode 100644 index 0000000000..cf86a85ed9 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/combat/equipment/fiery_leggings.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "tag": "forge:ingots/fiery" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:equipment/fiery_leggings" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:equipment/fiery_leggings" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/combat/equipment/fiery_sword.json b/src/generated/resources/data/twilightforest/advancements/recipes/combat/equipment/fiery_sword.json new file mode 100644 index 0000000000..ddd2c6d1f8 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/combat/equipment/fiery_sword.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "tag": "forge:ingots/fiery" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:equipment/fiery_sword" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:equipment/fiery_sword" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/combat/equipment/fortification_scepter.json b/src/generated/resources/data/twilightforest/advancements/recipes/combat/equipment/fortification_scepter.json new file mode 100644 index 0000000000..568406830a --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/combat/equipment/fortification_scepter.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:fortification_scepter" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:equipment/fortification_scepter" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:equipment/fortification_scepter" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/combat/equipment/knightmetal_boots.json b/src/generated/resources/data/twilightforest/advancements/recipes/combat/equipment/knightmetal_boots.json new file mode 100644 index 0000000000..1b205164cc --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/combat/equipment/knightmetal_boots.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "tag": "forge:ingots/knightmetal" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:equipment/knightmetal_boots" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:equipment/knightmetal_boots" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/combat/equipment/knightmetal_chestplate.json b/src/generated/resources/data/twilightforest/advancements/recipes/combat/equipment/knightmetal_chestplate.json new file mode 100644 index 0000000000..bd495ded7e --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/combat/equipment/knightmetal_chestplate.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "tag": "forge:ingots/knightmetal" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:equipment/knightmetal_chestplate" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:equipment/knightmetal_chestplate" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/combat/equipment/knightmetal_helmet.json b/src/generated/resources/data/twilightforest/advancements/recipes/combat/equipment/knightmetal_helmet.json new file mode 100644 index 0000000000..93933cb1c6 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/combat/equipment/knightmetal_helmet.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "tag": "forge:ingots/knightmetal" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:equipment/knightmetal_helmet" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:equipment/knightmetal_helmet" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/combat/equipment/knightmetal_leggings.json b/src/generated/resources/data/twilightforest/advancements/recipes/combat/equipment/knightmetal_leggings.json new file mode 100644 index 0000000000..d58e95d6ad --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/combat/equipment/knightmetal_leggings.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "tag": "forge:ingots/knightmetal" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:equipment/knightmetal_leggings" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:equipment/knightmetal_leggings" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/combat/equipment/knightmetal_shield.json b/src/generated/resources/data/twilightforest/advancements/recipes/combat/equipment/knightmetal_shield.json new file mode 100644 index 0000000000..3a7a586c01 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/combat/equipment/knightmetal_shield.json @@ -0,0 +1,45 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_ingot": { + "conditions": { + "items": [ + { + "tag": "forge:ingots/knightmetal" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_ring": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:knightmetal_ring" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:equipment/knightmetal_shield" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_ingot", + "has_ring", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:equipment/knightmetal_shield" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/combat/equipment/knightmetal_sword.json b/src/generated/resources/data/twilightforest/advancements/recipes/combat/equipment/knightmetal_sword.json new file mode 100644 index 0000000000..9f8ce53a28 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/combat/equipment/knightmetal_sword.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "tag": "forge:ingots/knightmetal" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:equipment/knightmetal_sword" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:equipment/knightmetal_sword" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/combat/equipment/lifedrain_scepter.json b/src/generated/resources/data/twilightforest/advancements/recipes/combat/equipment/lifedrain_scepter.json new file mode 100644 index 0000000000..deda12a63f --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/combat/equipment/lifedrain_scepter.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:lifedrain_scepter" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:equipment/lifedrain_scepter" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:equipment/lifedrain_scepter" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/combat/equipment/twilight_scepter.json b/src/generated/resources/data/twilightforest/advancements/recipes/combat/equipment/twilight_scepter.json new file mode 100644 index 0000000000..d9fc0288e1 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/combat/equipment/twilight_scepter.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:twilight_scepter" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:equipment/twilight_scepter" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:equipment/twilight_scepter" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/combat/equipment/zombie_scepter.json b/src/generated/resources/data/twilightforest/advancements/recipes/combat/equipment/zombie_scepter.json new file mode 100644 index 0000000000..e382dccfac --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/combat/equipment/zombie_scepter.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:zombie_scepter" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:equipment/zombie_scepter" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:equipment/zombie_scepter" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/decorations/berry_torch.json b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/berry_torch.json new file mode 100644 index 0000000000..861dd51c94 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/berry_torch.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:torchberries" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:berry_torch" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:berry_torch" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/decorations/cicada_jar.json b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/cicada_jar.json new file mode 100644 index 0000000000..ba9f0c7347 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/cicada_jar.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:cicada" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:cicada_jar" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:cicada_jar" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/decorations/firefly_jar.json b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/firefly_jar.json new file mode 100644 index 0000000000..9100f9032c --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/firefly_jar.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:firefly" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:firefly_jar" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:firefly_jar" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/decorations/firefly_particle_spawner.json b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/firefly_particle_spawner.json new file mode 100644 index 0000000000..669c6fc13d --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/firefly_particle_spawner.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_jar": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:firefly_jar" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:firefly_particle_spawner" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_jar", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:firefly_particle_spawner" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/decorations/iron_ladder.json b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/iron_ladder.json new file mode 100644 index 0000000000..dcafec8f6a --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/iron_ladder.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_iron_bars": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:iron_bars" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:iron_ladder" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_iron_bars", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:iron_ladder" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/decorations/tf_to_vanilla_lilypad.json b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/tf_to_vanilla_lilypad.json new file mode 100644 index 0000000000..d5efc2ede0 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/tf_to_vanilla_lilypad.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:transformation_powder" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:tf_to_vanilla_lilypad" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:tf_to_vanilla_lilypad" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/decorations/uncrafting_table.json b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/uncrafting_table.json new file mode 100644 index 0000000000..5e448adc3d --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/uncrafting_table.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:uncrafting_table" + }, + "trigger": "minecraft:recipe_unlocked" + }, + "has_uncrafting_table": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:uncrafting_table" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "requirements": [ + [ + "has_uncrafting_table", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:uncrafting_table" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/decorations/vanilla_to_tf_lilypad.json b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/vanilla_to_tf_lilypad.json new file mode 100644 index 0000000000..adb401495d --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/vanilla_to_tf_lilypad.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:transformation_powder" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:vanilla_to_tf_lilypad" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:vanilla_to_tf_lilypad" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/decorations/vanilla_to_tf_moss.json b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/vanilla_to_tf_moss.json new file mode 100644 index 0000000000..1c093280c6 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/vanilla_to_tf_moss.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:transformation_powder" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:vanilla_to_tf_moss" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:vanilla_to_tf_moss" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/acacia_banister.json b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/acacia_banister.json new file mode 100644 index 0000000000..cf293a42ba --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/acacia_banister.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:acacia_slab" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/acacia_banister" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/acacia_banister" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/birch_banister.json b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/birch_banister.json new file mode 100644 index 0000000000..e83b4ea1c1 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/birch_banister.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:birch_slab" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/birch_banister" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/birch_banister" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/canopy_banister.json b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/canopy_banister.json new file mode 100644 index 0000000000..188f30b6a2 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/canopy_banister.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:canopy_slab" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/canopy_banister" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/canopy_banister" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/canopy_chest.json b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/canopy_chest.json new file mode 100644 index 0000000000..b4d851cf24 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/canopy_chest.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:canopy_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/canopy_chest" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/canopy_chest" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/canopy_fence.json b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/canopy_fence.json new file mode 100644 index 0000000000..637e26aef0 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/canopy_fence.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:canopy_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/canopy_fence" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/canopy_fence" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/canopy_sign_wood.json b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/canopy_sign_wood.json new file mode 100644 index 0000000000..423e37c4c5 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/canopy_sign_wood.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:canopy_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/canopy_sign_wood" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/canopy_sign_wood" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/crimson_banister.json b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/crimson_banister.json new file mode 100644 index 0000000000..9cd7d812ca --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/crimson_banister.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:crimson_slab" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/crimson_banister" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/crimson_banister" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/dark_oak_banister.json b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/dark_oak_banister.json new file mode 100644 index 0000000000..76bfa3f93f --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/dark_oak_banister.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:dark_oak_slab" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/dark_oak_banister" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/dark_oak_banister" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/darkwood_banister.json b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/darkwood_banister.json new file mode 100644 index 0000000000..e614c64ab7 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/darkwood_banister.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:dark_slab" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/darkwood_banister" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/darkwood_banister" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/darkwood_chest.json b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/darkwood_chest.json new file mode 100644 index 0000000000..4cdd5745ab --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/darkwood_chest.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:dark_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/darkwood_chest" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/darkwood_chest" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/darkwood_fence.json b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/darkwood_fence.json new file mode 100644 index 0000000000..50c3fd08d6 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/darkwood_fence.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:dark_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/darkwood_fence" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/darkwood_fence" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/darkwood_sign_wood.json b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/darkwood_sign_wood.json new file mode 100644 index 0000000000..99e8b6dbd2 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/darkwood_sign_wood.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:dark_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/darkwood_sign_wood" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/darkwood_sign_wood" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/jungle_banister.json b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/jungle_banister.json new file mode 100644 index 0000000000..3fcb63d7f3 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/jungle_banister.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:jungle_slab" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/jungle_banister" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/jungle_banister" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/mangrove_banister.json b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/mangrove_banister.json new file mode 100644 index 0000000000..2bbab63cef --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/mangrove_banister.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:mangrove_slab" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/mangrove_banister" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/mangrove_banister" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/mangrove_chest.json b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/mangrove_chest.json new file mode 100644 index 0000000000..eb6aa78cfa --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/mangrove_chest.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:mangrove_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/mangrove_chest" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/mangrove_chest" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/mangrove_fence.json b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/mangrove_fence.json new file mode 100644 index 0000000000..f6293b95a1 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/mangrove_fence.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:mangrove_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/mangrove_fence" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/mangrove_fence" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/mangrove_sign_wood.json b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/mangrove_sign_wood.json new file mode 100644 index 0000000000..e5f9306599 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/mangrove_sign_wood.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:mangrove_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/mangrove_sign_wood" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/mangrove_sign_wood" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/mining_banister.json b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/mining_banister.json new file mode 100644 index 0000000000..2dc6bf83c4 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/mining_banister.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:mining_slab" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/mining_banister" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/mining_banister" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/mining_chest.json b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/mining_chest.json new file mode 100644 index 0000000000..981f5b063e --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/mining_chest.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:mining_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/mining_chest" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/mining_chest" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/mining_fence.json b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/mining_fence.json new file mode 100644 index 0000000000..35a7a71a63 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/mining_fence.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:mining_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/mining_fence" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/mining_fence" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/mining_sign_wood.json b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/mining_sign_wood.json new file mode 100644 index 0000000000..910ac95b86 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/mining_sign_wood.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:mining_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/mining_sign_wood" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/mining_sign_wood" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/oak_banister.json b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/oak_banister.json new file mode 100644 index 0000000000..8a81b16f9b --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/oak_banister.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:oak_slab" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/oak_banister" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/oak_banister" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/sorting_banister.json b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/sorting_banister.json new file mode 100644 index 0000000000..7a7e4e53a6 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/sorting_banister.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:sorting_slab" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/sorting_banister" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/sorting_banister" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/sorting_chest.json b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/sorting_chest.json new file mode 100644 index 0000000000..002da329c9 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/sorting_chest.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:sorting_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/sorting_chest" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/sorting_chest" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/sorting_fence.json b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/sorting_fence.json new file mode 100644 index 0000000000..1146a6be79 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/sorting_fence.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:sorting_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/sorting_fence" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/sorting_fence" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/sorting_sign_wood.json b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/sorting_sign_wood.json new file mode 100644 index 0000000000..93c68d05b4 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/sorting_sign_wood.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:sorting_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/sorting_sign_wood" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/sorting_sign_wood" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/spruce_banister.json b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/spruce_banister.json new file mode 100644 index 0000000000..3f8c7c898e --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/spruce_banister.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:spruce_slab" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/spruce_banister" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/spruce_banister" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/time_banister.json b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/time_banister.json new file mode 100644 index 0000000000..bfaf266f0d --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/time_banister.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:time_slab" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/time_banister" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/time_banister" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/time_chest.json b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/time_chest.json new file mode 100644 index 0000000000..47d41ee614 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/time_chest.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:time_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/time_chest" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/time_chest" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/time_fence.json b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/time_fence.json new file mode 100644 index 0000000000..1d5deb8b3a --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/time_fence.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:time_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/time_fence" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/time_fence" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/time_sign_wood.json b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/time_sign_wood.json new file mode 100644 index 0000000000..b0f00c94b8 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/time_sign_wood.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:time_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/time_sign_wood" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/time_sign_wood" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/transformation_banister.json b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/transformation_banister.json new file mode 100644 index 0000000000..ee0e05c2b6 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/transformation_banister.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:transformation_slab" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/transformation_banister" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/transformation_banister" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/transformation_chest.json b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/transformation_chest.json new file mode 100644 index 0000000000..c5a58fcbad --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/transformation_chest.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:transformation_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/transformation_chest" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/transformation_chest" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/transformation_fence.json b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/transformation_fence.json new file mode 100644 index 0000000000..c93d579ea6 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/transformation_fence.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:transformation_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/transformation_fence" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/transformation_fence" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/transformation_sign_wood.json b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/transformation_sign_wood.json new file mode 100644 index 0000000000..c121c107d5 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/transformation_sign_wood.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:transformation_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/transformation_sign_wood" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/transformation_sign_wood" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/twilight_oak_banister.json b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/twilight_oak_banister.json new file mode 100644 index 0000000000..24c2404c9e --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/twilight_oak_banister.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:twilight_oak_slab" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/twilight_oak_banister" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/twilight_oak_banister" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/twilight_oak_chest.json b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/twilight_oak_chest.json new file mode 100644 index 0000000000..3c0dc6b99b --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/twilight_oak_chest.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:twilight_oak_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/twilight_oak_chest" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/twilight_oak_chest" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/twilight_oak_fence.json b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/twilight_oak_fence.json new file mode 100644 index 0000000000..979c8104ce --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/twilight_oak_fence.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:twilight_oak_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/twilight_oak_fence" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/twilight_oak_fence" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/twilight_oak_sign_wood.json b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/twilight_oak_sign_wood.json new file mode 100644 index 0000000000..bafa0759d1 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/twilight_oak_sign_wood.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:twilight_oak_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/twilight_oak_sign_wood" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/twilight_oak_sign_wood" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/vangrove_banister.json b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/vangrove_banister.json new file mode 100644 index 0000000000..f0efffb90a --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/vangrove_banister.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:mangrove_slab" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/vangrove_banister" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/vangrove_banister" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/warped_banister.json b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/warped_banister.json new file mode 100644 index 0000000000..a5d77c7e13 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/decorations/wood/warped_banister.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:warped_slab" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/warped_banister" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/warped_banister" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/food/food/campfired_meef.json b/src/generated/resources/data/twilightforest/advancements/recipes/food/food/campfired_meef.json new file mode 100644 index 0000000000..7a28c34dcf --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/food/food/campfired_meef.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_food": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:raw_meef" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:food/campfired_meef" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_food", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:food/campfired_meef" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/food/food/campfired_venison.json b/src/generated/resources/data/twilightforest/advancements/recipes/food/food/campfired_venison.json new file mode 100644 index 0000000000..a230563160 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/food/food/campfired_venison.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_food": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:raw_venison" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:food/campfired_venison" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_food", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:food/campfired_venison" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/food/food/smelted_meef.json b/src/generated/resources/data/twilightforest/advancements/recipes/food/food/smelted_meef.json new file mode 100644 index 0000000000..504ee2664c --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/food/food/smelted_meef.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_food": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:raw_meef" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:food/smelted_meef" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_food", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:food/smelted_meef" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/food/food/smelted_venison.json b/src/generated/resources/data/twilightforest/advancements/recipes/food/food/smelted_venison.json new file mode 100644 index 0000000000..162f85ae38 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/food/food/smelted_venison.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_food": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:raw_venison" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:food/smelted_venison" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_food", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:food/smelted_venison" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/food/food/smoked_meef.json b/src/generated/resources/data/twilightforest/advancements/recipes/food/food/smoked_meef.json new file mode 100644 index 0000000000..0f3e5638bb --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/food/food/smoked_meef.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_food": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:raw_meef" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:food/smoked_meef" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_food", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:food/smoked_meef" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/food/food/smoked_venison.json b/src/generated/resources/data/twilightforest/advancements/recipes/food/food/smoked_venison.json new file mode 100644 index 0000000000..7343c75840 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/food/food/smoked_venison.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_food": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:raw_venison" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:food/smoked_venison" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_food", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:food/smoked_venison" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/misc/alpha_yeti_banner_pattern.json b/src/generated/resources/data/twilightforest/advancements/recipes/misc/alpha_yeti_banner_pattern.json new file mode 100644 index 0000000000..0d93e1b6b6 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/misc/alpha_yeti_banner_pattern.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:alpha_yeti_banner_pattern" + }, + "trigger": "minecraft:recipe_unlocked" + }, + "has_trophy": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:alpha_yeti_trophy" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "requirements": [ + [ + "has_trophy", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:alpha_yeti_banner_pattern" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/misc/compressed_blocks/reversed/arctic_block_to_item.json b/src/generated/resources/data/twilightforest/advancements/recipes/misc/compressed_blocks/reversed/arctic_block_to_item.json new file mode 100644 index 0000000000..7ef27f3fd4 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/misc/compressed_blocks/reversed/arctic_block_to_item.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "tag": "forge:storage_blocks/arctic_fur" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:compressed_blocks/reversed/arctic_block_to_item" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:compressed_blocks/reversed/arctic_block_to_item" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/misc/compressed_blocks/reversed/carminite_block_to_item.json b/src/generated/resources/data/twilightforest/advancements/recipes/misc/compressed_blocks/reversed/carminite_block_to_item.json new file mode 100644 index 0000000000..90819dd242 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/misc/compressed_blocks/reversed/carminite_block_to_item.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "tag": "forge:storage_blocks/carminite" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:compressed_blocks/reversed/carminite_block_to_item" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:compressed_blocks/reversed/carminite_block_to_item" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/misc/compressed_blocks/reversed/fiery_block_to_ingot.json b/src/generated/resources/data/twilightforest/advancements/recipes/misc/compressed_blocks/reversed/fiery_block_to_ingot.json new file mode 100644 index 0000000000..f30613c15d --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/misc/compressed_blocks/reversed/fiery_block_to_ingot.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "tag": "forge:storage_blocks/fiery" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:compressed_blocks/reversed/fiery_block_to_ingot" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:compressed_blocks/reversed/fiery_block_to_ingot" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/misc/compressed_blocks/reversed/ironwood_block_ingot.json b/src/generated/resources/data/twilightforest/advancements/recipes/misc/compressed_blocks/reversed/ironwood_block_ingot.json new file mode 100644 index 0000000000..a10d0d6016 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/misc/compressed_blocks/reversed/ironwood_block_ingot.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "tag": "forge:storage_blocks/ironwood" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:compressed_blocks/reversed/ironwood_block_ingot" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:compressed_blocks/reversed/ironwood_block_ingot" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/misc/compressed_blocks/reversed/knightmetal_block_ingot.json b/src/generated/resources/data/twilightforest/advancements/recipes/misc/compressed_blocks/reversed/knightmetal_block_ingot.json new file mode 100644 index 0000000000..a808f0f399 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/misc/compressed_blocks/reversed/knightmetal_block_ingot.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "tag": "forge:storage_blocks/knightmetal" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:compressed_blocks/reversed/knightmetal_block_ingot" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:compressed_blocks/reversed/knightmetal_block_ingot" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/misc/compressed_blocks/reversed/steeleaf_block_ingot.json b/src/generated/resources/data/twilightforest/advancements/recipes/misc/compressed_blocks/reversed/steeleaf_block_ingot.json new file mode 100644 index 0000000000..608d6ab333 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/misc/compressed_blocks/reversed/steeleaf_block_ingot.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "tag": "forge:storage_blocks/steeleaf" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:compressed_blocks/reversed/steeleaf_block_ingot" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:compressed_blocks/reversed/steeleaf_block_ingot" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/misc/equipment/fiery_ingot_crafting.json b/src/generated/resources/data/twilightforest/advancements/recipes/misc/equipment/fiery_ingot_crafting.json new file mode 100644 index 0000000000..89c4d5f83a --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/misc/equipment/fiery_ingot_crafting.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "tag": "twilightforest:fiery_vial" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:equipment/fiery_ingot_crafting" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:equipment/fiery_ingot_crafting" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/misc/equipment/knightmetal_ring.json b/src/generated/resources/data/twilightforest/advancements/recipes/misc/equipment/knightmetal_ring.json new file mode 100644 index 0000000000..42bb359551 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/misc/equipment/knightmetal_ring.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "tag": "forge:ingots/knightmetal" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:equipment/knightmetal_ring" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:equipment/knightmetal_ring" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/misc/hydra_banner_pattern.json b/src/generated/resources/data/twilightforest/advancements/recipes/misc/hydra_banner_pattern.json new file mode 100644 index 0000000000..670bd05958 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/misc/hydra_banner_pattern.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:hydra_banner_pattern" + }, + "trigger": "minecraft:recipe_unlocked" + }, + "has_trophy": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:hydra_trophy" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "requirements": [ + [ + "has_trophy", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:hydra_banner_pattern" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/misc/knight_phantom_banner_pattern.json b/src/generated/resources/data/twilightforest/advancements/recipes/misc/knight_phantom_banner_pattern.json new file mode 100644 index 0000000000..4a84f25b38 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/misc/knight_phantom_banner_pattern.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:knight_phantom_banner_pattern" + }, + "trigger": "minecraft:recipe_unlocked" + }, + "has_trophy": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:knight_phantom_trophy" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "requirements": [ + [ + "has_trophy", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:knight_phantom_banner_pattern" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/misc/lich_banner_pattern.json b/src/generated/resources/data/twilightforest/advancements/recipes/misc/lich_banner_pattern.json new file mode 100644 index 0000000000..10db759de8 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/misc/lich_banner_pattern.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:lich_banner_pattern" + }, + "trigger": "minecraft:recipe_unlocked" + }, + "has_trophy": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:lich_trophy" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "requirements": [ + [ + "has_trophy", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:lich_banner_pattern" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/misc/magic_map.json b/src/generated/resources/data/twilightforest/advancements/recipes/misc/magic_map.json new file mode 100644 index 0000000000..9f028494e3 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/misc/magic_map.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:magic_map_focus" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:magic_map" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:magic_map" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/misc/magic_map_focus.json b/src/generated/resources/data/twilightforest/advancements/recipes/misc/magic_map_focus.json new file mode 100644 index 0000000000..b0e7eb3208 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/misc/magic_map_focus.json @@ -0,0 +1,47 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_berries": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:torchberries" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_feather": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:raven_feather" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:magic_map_focus" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_berries", + "has_feather", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:magic_map_focus" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/misc/material/armor_shard_cluster.json b/src/generated/resources/data/twilightforest/advancements/recipes/misc/material/armor_shard_cluster.json new file mode 100644 index 0000000000..408994f79f --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/misc/material/armor_shard_cluster.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:armor_shard" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:material/armor_shard_cluster" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:material/armor_shard_cluster" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/misc/material/blasted_ironwood_ingot.json b/src/generated/resources/data/twilightforest/advancements/recipes/misc/material/blasted_ironwood_ingot.json new file mode 100644 index 0000000000..917e145471 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/misc/material/blasted_ironwood_ingot.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:raw_ironwood" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:material/blasted_ironwood_ingot" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:material/blasted_ironwood_ingot" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/misc/material/blasted_knightmetal_ingot.json b/src/generated/resources/data/twilightforest/advancements/recipes/misc/material/blasted_knightmetal_ingot.json new file mode 100644 index 0000000000..0a7d491abc --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/misc/material/blasted_knightmetal_ingot.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:armor_shard_cluster" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:material/blasted_knightmetal_ingot" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:material/blasted_knightmetal_ingot" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/misc/material/carminite.json b/src/generated/resources/data/twilightforest/advancements/recipes/misc/material/carminite.json new file mode 100644 index 0000000000..aeec4f185d --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/misc/material/carminite.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:borer_essence" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:material/carminite" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:material/carminite" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/misc/material/raw_ironwood.json b/src/generated/resources/data/twilightforest/advancements/recipes/misc/material/raw_ironwood.json new file mode 100644 index 0000000000..51ca8a1ca9 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/misc/material/raw_ironwood.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:liveroot" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:material/raw_ironwood" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:material/raw_ironwood" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/misc/material/smelted_ironwood_ingot.json b/src/generated/resources/data/twilightforest/advancements/recipes/misc/material/smelted_ironwood_ingot.json new file mode 100644 index 0000000000..719f4c7460 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/misc/material/smelted_ironwood_ingot.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:raw_ironwood" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:material/smelted_ironwood_ingot" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:material/smelted_ironwood_ingot" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/misc/material/smelted_knightmetal_ingot.json b/src/generated/resources/data/twilightforest/advancements/recipes/misc/material/smelted_knightmetal_ingot.json new file mode 100644 index 0000000000..8b490edfe9 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/misc/material/smelted_knightmetal_ingot.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:armor_shard_cluster" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:material/smelted_knightmetal_ingot" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:material/smelted_knightmetal_ingot" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/misc/maze_map.json b/src/generated/resources/data/twilightforest/advancements/recipes/misc/maze_map.json new file mode 100644 index 0000000000..add0895b51 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/misc/maze_map.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:maze_map_focus" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:maze_map" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:maze_map" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/misc/minoshroom_banner_pattern.json b/src/generated/resources/data/twilightforest/advancements/recipes/misc/minoshroom_banner_pattern.json new file mode 100644 index 0000000000..a4ca2bb26d --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/misc/minoshroom_banner_pattern.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:minoshroom_banner_pattern" + }, + "trigger": "minecraft:recipe_unlocked" + }, + "has_trophy": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:minoshroom_trophy" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "requirements": [ + [ + "has_trophy", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:minoshroom_banner_pattern" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/misc/naga_banner_pattern.json b/src/generated/resources/data/twilightforest/advancements/recipes/misc/naga_banner_pattern.json new file mode 100644 index 0000000000..52bb1b6fa1 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/misc/naga_banner_pattern.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:naga_banner_pattern" + }, + "trigger": "minecraft:recipe_unlocked" + }, + "has_trophy": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:naga_trophy" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "requirements": [ + [ + "has_trophy", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:naga_banner_pattern" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/misc/ore_map.json b/src/generated/resources/data/twilightforest/advancements/recipes/misc/ore_map.json new file mode 100644 index 0000000000..b201a93b42 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/misc/ore_map.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:maze_map" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:ore_map" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:ore_map" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/misc/quest_ram_banner_pattern.json b/src/generated/resources/data/twilightforest/advancements/recipes/misc/quest_ram_banner_pattern.json new file mode 100644 index 0000000000..e3ee678b88 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/misc/quest_ram_banner_pattern.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:quest_ram_banner_pattern" + }, + "trigger": "minecraft:recipe_unlocked" + }, + "has_trophy": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:quest_ram_trophy" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "requirements": [ + [ + "has_trophy", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:quest_ram_banner_pattern" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/misc/root_stick.json b/src/generated/resources/data/twilightforest/advancements/recipes/misc/root_stick.json new file mode 100644 index 0000000000..d07b91b543 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/misc/root_stick.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:root_strand" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:root_stick" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:root_stick" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/misc/snow_queen_banner_pattern.json b/src/generated/resources/data/twilightforest/advancements/recipes/misc/snow_queen_banner_pattern.json new file mode 100644 index 0000000000..fc20d87654 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/misc/snow_queen_banner_pattern.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:snow_queen_banner_pattern" + }, + "trigger": "minecraft:recipe_unlocked" + }, + "has_trophy": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:snow_queen_trophy" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "requirements": [ + [ + "has_trophy", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:snow_queen_banner_pattern" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/misc/thorn_rose_to_red.json b/src/generated/resources/data/twilightforest/advancements/recipes/misc/thorn_rose_to_red.json new file mode 100644 index 0000000000..bbab41da19 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/misc/thorn_rose_to_red.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:thorn_rose" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:thorn_rose_to_red" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:thorn_rose_to_red" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/misc/ur_ghast_banner_pattern.json b/src/generated/resources/data/twilightforest/advancements/recipes/misc/ur_ghast_banner_pattern.json new file mode 100644 index 0000000000..a3672b39a4 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/misc/ur_ghast_banner_pattern.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:ur_ghast_banner_pattern" + }, + "trigger": "minecraft:recipe_unlocked" + }, + "has_trophy": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:ur_ghast_trophy" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "requirements": [ + [ + "has_trophy", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:ur_ghast_banner_pattern" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/misc/waterlily_to_magenta.json b/src/generated/resources/data/twilightforest/advancements/recipes/misc/waterlily_to_magenta.json new file mode 100644 index 0000000000..fbcbb24b1e --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/misc/waterlily_to_magenta.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:huge_water_lily" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:waterlily_to_magenta" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:waterlily_to_magenta" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/redstone/carminite_builder.json b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/carminite_builder.json new file mode 100644 index 0000000000..32cd013ecf --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/carminite_builder.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "tag": "forge:gems/carminite" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:carminite_builder" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:carminite_builder" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/redstone/carminite_reactor.json b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/carminite_reactor.json new file mode 100644 index 0000000000..d7d335b24d --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/carminite_reactor.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "tag": "forge:gems/carminite" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:carminite_reactor" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:carminite_reactor" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/redstone/encased_fire_jet.json b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/encased_fire_jet.json new file mode 100644 index 0000000000..3706c151be --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/encased_fire_jet.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:fire_jet" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:encased_fire_jet" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:encased_fire_jet" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/redstone/encased_smoker.json b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/encased_smoker.json new file mode 100644 index 0000000000..b41beaae9e --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/encased_smoker.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:smoker" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:encased_smoker" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:encased_smoker" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/redstone/reappearing_block.json b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/reappearing_block.json new file mode 100644 index 0000000000..4a8e6981e9 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/reappearing_block.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:reappearing_block" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:reappearing_block" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:reappearing_block" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/redstone/vanishing_block.json b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/vanishing_block.json new file mode 100644 index 0000000000..8af060f22a --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/vanishing_block.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:reappearing_block" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:vanishing_block" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:vanishing_block" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/canopy_button.json b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/canopy_button.json new file mode 100644 index 0000000000..99fcef5918 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/canopy_button.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:canopy_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/canopy_button" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/canopy_button" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/canopy_door.json b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/canopy_door.json new file mode 100644 index 0000000000..a5e16538c2 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/canopy_door.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:canopy_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/canopy_door" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/canopy_door" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/canopy_gate.json b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/canopy_gate.json new file mode 100644 index 0000000000..9887eaeb8c --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/canopy_gate.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:canopy_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/canopy_gate" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/canopy_gate" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/canopy_plate.json b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/canopy_plate.json new file mode 100644 index 0000000000..7b1628e71f --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/canopy_plate.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:canopy_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/canopy_plate" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/canopy_plate" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/canopy_trapdoor.json b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/canopy_trapdoor.json new file mode 100644 index 0000000000..44fec8a417 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/canopy_trapdoor.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:canopy_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/canopy_trapdoor" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/canopy_trapdoor" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/darkwood_button.json b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/darkwood_button.json new file mode 100644 index 0000000000..87ad45a729 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/darkwood_button.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:dark_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/darkwood_button" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/darkwood_button" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/darkwood_door.json b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/darkwood_door.json new file mode 100644 index 0000000000..34d8a2d7f2 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/darkwood_door.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:dark_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/darkwood_door" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/darkwood_door" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/darkwood_gate.json b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/darkwood_gate.json new file mode 100644 index 0000000000..22c875c9d2 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/darkwood_gate.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:dark_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/darkwood_gate" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/darkwood_gate" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/darkwood_plate.json b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/darkwood_plate.json new file mode 100644 index 0000000000..965ee75c1b --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/darkwood_plate.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:dark_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/darkwood_plate" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/darkwood_plate" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/darkwood_trapdoor.json b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/darkwood_trapdoor.json new file mode 100644 index 0000000000..36f6a13057 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/darkwood_trapdoor.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:dark_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/darkwood_trapdoor" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/darkwood_trapdoor" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/mangrove_button.json b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/mangrove_button.json new file mode 100644 index 0000000000..b708aef520 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/mangrove_button.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:mangrove_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/mangrove_button" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/mangrove_button" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/mangrove_door.json b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/mangrove_door.json new file mode 100644 index 0000000000..c59030b119 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/mangrove_door.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:mangrove_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/mangrove_door" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/mangrove_door" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/mangrove_gate.json b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/mangrove_gate.json new file mode 100644 index 0000000000..90690c6911 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/mangrove_gate.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:mangrove_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/mangrove_gate" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/mangrove_gate" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/mangrove_plate.json b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/mangrove_plate.json new file mode 100644 index 0000000000..a587330bdf --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/mangrove_plate.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:mangrove_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/mangrove_plate" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/mangrove_plate" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/mangrove_trapdoor.json b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/mangrove_trapdoor.json new file mode 100644 index 0000000000..0b3fb0e69c --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/mangrove_trapdoor.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:mangrove_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/mangrove_trapdoor" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/mangrove_trapdoor" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/mining_button.json b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/mining_button.json new file mode 100644 index 0000000000..a889a86c3e --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/mining_button.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:mining_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/mining_button" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/mining_button" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/mining_door.json b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/mining_door.json new file mode 100644 index 0000000000..06b665e589 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/mining_door.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:mining_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/mining_door" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/mining_door" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/mining_gate.json b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/mining_gate.json new file mode 100644 index 0000000000..48d5521bc3 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/mining_gate.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:mining_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/mining_gate" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/mining_gate" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/mining_plate.json b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/mining_plate.json new file mode 100644 index 0000000000..449a127bc4 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/mining_plate.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:mining_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/mining_plate" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/mining_plate" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/mining_trapdoor.json b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/mining_trapdoor.json new file mode 100644 index 0000000000..477ab29c2d --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/mining_trapdoor.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:mining_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/mining_trapdoor" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/mining_trapdoor" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/sorting_button.json b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/sorting_button.json new file mode 100644 index 0000000000..b5620d57e7 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/sorting_button.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:sorting_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/sorting_button" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/sorting_button" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/sorting_door.json b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/sorting_door.json new file mode 100644 index 0000000000..fdb4109736 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/sorting_door.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:sorting_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/sorting_door" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/sorting_door" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/sorting_gate.json b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/sorting_gate.json new file mode 100644 index 0000000000..84ff1450a2 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/sorting_gate.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:sorting_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/sorting_gate" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/sorting_gate" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/sorting_plate.json b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/sorting_plate.json new file mode 100644 index 0000000000..351574a1b6 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/sorting_plate.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:sorting_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/sorting_plate" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/sorting_plate" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/sorting_trapdoor.json b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/sorting_trapdoor.json new file mode 100644 index 0000000000..1ba6b50c17 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/sorting_trapdoor.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:sorting_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/sorting_trapdoor" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/sorting_trapdoor" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/time_button.json b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/time_button.json new file mode 100644 index 0000000000..4b11d6561e --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/time_button.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:time_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/time_button" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/time_button" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/time_door.json b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/time_door.json new file mode 100644 index 0000000000..ad67d36021 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/time_door.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:time_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/time_door" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/time_door" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/time_gate.json b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/time_gate.json new file mode 100644 index 0000000000..bc30fb5b0c --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/time_gate.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:time_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/time_gate" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/time_gate" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/time_plate.json b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/time_plate.json new file mode 100644 index 0000000000..1c932fc23b --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/time_plate.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:time_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/time_plate" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/time_plate" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/time_trapdoor.json b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/time_trapdoor.json new file mode 100644 index 0000000000..ec5d81b73b --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/time_trapdoor.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:time_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/time_trapdoor" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/time_trapdoor" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/transformation_button.json b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/transformation_button.json new file mode 100644 index 0000000000..c147b23ed4 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/transformation_button.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:transformation_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/transformation_button" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/transformation_button" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/transformation_door.json b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/transformation_door.json new file mode 100644 index 0000000000..ac35e15820 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/transformation_door.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:transformation_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/transformation_door" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/transformation_door" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/transformation_gate.json b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/transformation_gate.json new file mode 100644 index 0000000000..670eace06c --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/transformation_gate.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:transformation_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/transformation_gate" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/transformation_gate" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/transformation_plate.json b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/transformation_plate.json new file mode 100644 index 0000000000..c3291af62f --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/transformation_plate.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:transformation_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/transformation_plate" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/transformation_plate" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/transformation_trapdoor.json b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/transformation_trapdoor.json new file mode 100644 index 0000000000..5caf0a11d7 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/transformation_trapdoor.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:transformation_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/transformation_trapdoor" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/transformation_trapdoor" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/twilight_oak_button.json b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/twilight_oak_button.json new file mode 100644 index 0000000000..a0b2da8431 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/twilight_oak_button.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:twilight_oak_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/twilight_oak_button" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/twilight_oak_button" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/twilight_oak_door.json b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/twilight_oak_door.json new file mode 100644 index 0000000000..6cdb30de7a --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/twilight_oak_door.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:twilight_oak_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/twilight_oak_door" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/twilight_oak_door" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/twilight_oak_gate.json b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/twilight_oak_gate.json new file mode 100644 index 0000000000..3d3096db8f --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/twilight_oak_gate.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:twilight_oak_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/twilight_oak_gate" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/twilight_oak_gate" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/twilight_oak_plate.json b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/twilight_oak_plate.json new file mode 100644 index 0000000000..c0f9fd8046 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/twilight_oak_plate.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:twilight_oak_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/twilight_oak_plate" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/twilight_oak_plate" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/twilight_oak_trapdoor.json b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/twilight_oak_trapdoor.json new file mode 100644 index 0000000000..c30842c3f7 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/redstone/wood/twilight_oak_trapdoor.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:twilight_oak_planks" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:wood/twilight_oak_trapdoor" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:wood/twilight_oak_trapdoor" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/tools/charm_of_keeping_2.json b/src/generated/resources/data/twilightforest/advancements/recipes/tools/charm_of_keeping_2.json new file mode 100644 index 0000000000..4b03295e12 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/tools/charm_of_keeping_2.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:charm_of_keeping_1" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:charm_of_keeping_2" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:charm_of_keeping_2" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/tools/charm_of_keeping_3.json b/src/generated/resources/data/twilightforest/advancements/recipes/tools/charm_of_keeping_3.json new file mode 100644 index 0000000000..eb774c0dea --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/tools/charm_of_keeping_3.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:charm_of_keeping_2" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:charm_of_keeping_3" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:charm_of_keeping_3" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/tools/charm_of_life_2.json b/src/generated/resources/data/twilightforest/advancements/recipes/tools/charm_of_life_2.json new file mode 100644 index 0000000000..2fffbea687 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/tools/charm_of_life_2.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:charm_of_life_1" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:charm_of_life_2" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:charm_of_life_2" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/tools/equipment/fiery_iron_pickaxe.json b/src/generated/resources/data/twilightforest/advancements/recipes/tools/equipment/fiery_iron_pickaxe.json new file mode 100644 index 0000000000..b3d7bd21fc --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/tools/equipment/fiery_iron_pickaxe.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "tag": "twilightforest:fiery_vial" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:equipment/fiery_iron_pickaxe" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:equipment/fiery_iron_pickaxe" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/tools/equipment/fiery_pickaxe.json b/src/generated/resources/data/twilightforest/advancements/recipes/tools/equipment/fiery_pickaxe.json new file mode 100644 index 0000000000..699ffd53cd --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/tools/equipment/fiery_pickaxe.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "tag": "forge:ingots/fiery" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:equipment/fiery_pickaxe" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:equipment/fiery_pickaxe" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/tools/equipment/giant_pickaxe.json b/src/generated/resources/data/twilightforest/advancements/recipes/tools/equipment/giant_pickaxe.json new file mode 100644 index 0000000000..530b752c16 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/tools/equipment/giant_pickaxe.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:giant_cobblestone" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:equipment/giant_pickaxe" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:equipment/giant_pickaxe" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/tools/equipment/giant_sword.json b/src/generated/resources/data/twilightforest/advancements/recipes/tools/equipment/giant_sword.json new file mode 100644 index 0000000000..568ae547da --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/tools/equipment/giant_sword.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "twilightforest:giant_cobblestone" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:equipment/giant_sword" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:equipment/giant_sword" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/tools/equipment/knightmetal_axe.json b/src/generated/resources/data/twilightforest/advancements/recipes/tools/equipment/knightmetal_axe.json new file mode 100644 index 0000000000..df86e9d5c1 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/tools/equipment/knightmetal_axe.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "tag": "forge:ingots/knightmetal" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:equipment/knightmetal_axe" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:equipment/knightmetal_axe" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/tools/equipment/knightmetal_pickaxe.json b/src/generated/resources/data/twilightforest/advancements/recipes/tools/equipment/knightmetal_pickaxe.json new file mode 100644 index 0000000000..d190ca77b1 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/tools/equipment/knightmetal_pickaxe.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "tag": "forge:ingots/knightmetal" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:equipment/knightmetal_pickaxe" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:equipment/knightmetal_pickaxe" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/transportation/canopy_boat.json b/src/generated/resources/data/twilightforest/advancements/recipes/transportation/canopy_boat.json new file mode 100644 index 0000000000..2826fe8426 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/transportation/canopy_boat.json @@ -0,0 +1,28 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:canopy_boat" + }, + "trigger": "minecraft:recipe_unlocked" + }, + "in_water": { + "conditions": { + "block": "minecraft:water" + }, + "trigger": "minecraft:enter_block" + } + }, + "requirements": [ + [ + "in_water", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:canopy_boat" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/transportation/canopy_chest_boat.json b/src/generated/resources/data/twilightforest/advancements/recipes/transportation/canopy_chest_boat.json new file mode 100644 index 0000000000..d4d9d4ca52 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/transportation/canopy_chest_boat.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_boat": { + "conditions": { + "items": [ + { + "tag": "minecraft:boats" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:canopy_chest_boat" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_boat", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:canopy_chest_boat" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/transportation/dark_boat.json b/src/generated/resources/data/twilightforest/advancements/recipes/transportation/dark_boat.json new file mode 100644 index 0000000000..533a494d6f --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/transportation/dark_boat.json @@ -0,0 +1,28 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:dark_boat" + }, + "trigger": "minecraft:recipe_unlocked" + }, + "in_water": { + "conditions": { + "block": "minecraft:water" + }, + "trigger": "minecraft:enter_block" + } + }, + "requirements": [ + [ + "in_water", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:dark_boat" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/transportation/dark_chest_boat.json b/src/generated/resources/data/twilightforest/advancements/recipes/transportation/dark_chest_boat.json new file mode 100644 index 0000000000..8cb01d3d4a --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/transportation/dark_chest_boat.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_boat": { + "conditions": { + "items": [ + { + "tag": "minecraft:boats" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:dark_chest_boat" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_boat", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:dark_chest_boat" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/transportation/mangrove_boat.json b/src/generated/resources/data/twilightforest/advancements/recipes/transportation/mangrove_boat.json new file mode 100644 index 0000000000..eab2b6b745 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/transportation/mangrove_boat.json @@ -0,0 +1,28 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:mangrove_boat" + }, + "trigger": "minecraft:recipe_unlocked" + }, + "in_water": { + "conditions": { + "block": "minecraft:water" + }, + "trigger": "minecraft:enter_block" + } + }, + "requirements": [ + [ + "in_water", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:mangrove_boat" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/transportation/mangrove_chest_boat.json b/src/generated/resources/data/twilightforest/advancements/recipes/transportation/mangrove_chest_boat.json new file mode 100644 index 0000000000..230efce777 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/transportation/mangrove_chest_boat.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_boat": { + "conditions": { + "items": [ + { + "tag": "minecraft:boats" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:mangrove_chest_boat" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_boat", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:mangrove_chest_boat" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/transportation/mining_boat.json b/src/generated/resources/data/twilightforest/advancements/recipes/transportation/mining_boat.json new file mode 100644 index 0000000000..743a888aed --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/transportation/mining_boat.json @@ -0,0 +1,28 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:mining_boat" + }, + "trigger": "minecraft:recipe_unlocked" + }, + "in_water": { + "conditions": { + "block": "minecraft:water" + }, + "trigger": "minecraft:enter_block" + } + }, + "requirements": [ + [ + "in_water", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:mining_boat" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/transportation/mining_chest_boat.json b/src/generated/resources/data/twilightforest/advancements/recipes/transportation/mining_chest_boat.json new file mode 100644 index 0000000000..9f916c4c90 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/transportation/mining_chest_boat.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_boat": { + "conditions": { + "items": [ + { + "tag": "minecraft:boats" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:mining_chest_boat" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_boat", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:mining_chest_boat" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/transportation/sorting_boat.json b/src/generated/resources/data/twilightforest/advancements/recipes/transportation/sorting_boat.json new file mode 100644 index 0000000000..55c894a292 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/transportation/sorting_boat.json @@ -0,0 +1,28 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:sorting_boat" + }, + "trigger": "minecraft:recipe_unlocked" + }, + "in_water": { + "conditions": { + "block": "minecraft:water" + }, + "trigger": "minecraft:enter_block" + } + }, + "requirements": [ + [ + "in_water", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:sorting_boat" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/transportation/sorting_chest_boat.json b/src/generated/resources/data/twilightforest/advancements/recipes/transportation/sorting_chest_boat.json new file mode 100644 index 0000000000..610bd4e995 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/transportation/sorting_chest_boat.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_boat": { + "conditions": { + "items": [ + { + "tag": "minecraft:boats" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:sorting_chest_boat" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_boat", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:sorting_chest_boat" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/transportation/time_boat.json b/src/generated/resources/data/twilightforest/advancements/recipes/transportation/time_boat.json new file mode 100644 index 0000000000..7ffaf10132 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/transportation/time_boat.json @@ -0,0 +1,28 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:time_boat" + }, + "trigger": "minecraft:recipe_unlocked" + }, + "in_water": { + "conditions": { + "block": "minecraft:water" + }, + "trigger": "minecraft:enter_block" + } + }, + "requirements": [ + [ + "in_water", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:time_boat" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/transportation/time_chest_boat.json b/src/generated/resources/data/twilightforest/advancements/recipes/transportation/time_chest_boat.json new file mode 100644 index 0000000000..1122e2d30a --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/transportation/time_chest_boat.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_boat": { + "conditions": { + "items": [ + { + "tag": "minecraft:boats" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:time_chest_boat" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_boat", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:time_chest_boat" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/transportation/transformation_boat.json b/src/generated/resources/data/twilightforest/advancements/recipes/transportation/transformation_boat.json new file mode 100644 index 0000000000..93488f56ab --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/transportation/transformation_boat.json @@ -0,0 +1,28 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:transformation_boat" + }, + "trigger": "minecraft:recipe_unlocked" + }, + "in_water": { + "conditions": { + "block": "minecraft:water" + }, + "trigger": "minecraft:enter_block" + } + }, + "requirements": [ + [ + "in_water", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:transformation_boat" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/transportation/transformation_chest_boat.json b/src/generated/resources/data/twilightforest/advancements/recipes/transportation/transformation_chest_boat.json new file mode 100644 index 0000000000..a6d5f44632 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/transportation/transformation_chest_boat.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_boat": { + "conditions": { + "items": [ + { + "tag": "minecraft:boats" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:transformation_chest_boat" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_boat", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:transformation_chest_boat" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/transportation/twilight_oak_boat.json b/src/generated/resources/data/twilightforest/advancements/recipes/transportation/twilight_oak_boat.json new file mode 100644 index 0000000000..76e4e7ee93 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/transportation/twilight_oak_boat.json @@ -0,0 +1,28 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:twilight_oak_boat" + }, + "trigger": "minecraft:recipe_unlocked" + }, + "in_water": { + "conditions": { + "block": "minecraft:water" + }, + "trigger": "minecraft:enter_block" + } + }, + "requirements": [ + [ + "in_water", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:twilight_oak_boat" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/recipes/transportation/twilight_oak_chest_boat.json b/src/generated/resources/data/twilightforest/advancements/recipes/transportation/twilight_oak_chest_boat.json new file mode 100644 index 0000000000..32a6e6c57c --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/recipes/transportation/twilight_oak_chest_boat.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_boat": { + "conditions": { + "items": [ + { + "tag": "minecraft:boats" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "twilightforest:twilight_oak_chest_boat" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_boat", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "twilightforest:twilight_oak_chest_boat" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/root.json b/src/generated/resources/data/twilightforest/advancements/root.json new file mode 100644 index 0000000000..6a01c226a2 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/root.json @@ -0,0 +1,46 @@ +{ + "criteria": { + "in_tf": { + "conditions": { + "player": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "location": { + "dimension": "twilightforest:twilight_forest" + } + } + } + ] + }, + "trigger": "minecraft:location" + }, + "make_portal": { + "conditions": {}, + "trigger": "twilightforest:make_tf_portal" + } + }, + "display": { + "announce_to_chat": false, + "background": "twilightforest:textures/block/mazestone_large_brick.png", + "description": { + "translate": "advancement.twilightforest.root.desc" + }, + "frame": "task", + "hidden": false, + "icon": { + "item": "twilightforest:twilight_portal_miniature_structure" + }, + "show_toast": true, + "title": { + "translate": "advancement.twilightforest.root" + } + }, + "requirements": [ + [ + "in_tf", + "make_portal" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/troll.json b/src/generated/resources/data/twilightforest/advancements/troll.json new file mode 100644 index 0000000000..55c3c18d4f --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/troll.json @@ -0,0 +1,47 @@ +{ + "parent": "twilightforest:progress_merge", + "criteria": { + "troll": { + "conditions": { + "entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "twilightforest:troll", + "location": { + "structure": "twilightforest:troll_cave" + } + } + } + ] + }, + "trigger": "minecraft:player_killed_entity" + } + }, + "display": { + "announce_to_chat": true, + "description": { + "translate": "advancement.twilightforest.troll.desc", + "with": [ + { + "translate": "entity.twilightforest.troll" + } + ] + }, + "frame": "task", + "hidden": false, + "icon": { + "item": "twilightforest:magic_beans" + }, + "show_toast": true, + "title": { + "translate": "advancement.twilightforest.troll" + } + }, + "requirements": [ + [ + "troll" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/twilight_dinner.json b/src/generated/resources/data/twilightforest/advancements/twilight_dinner.json new file mode 100644 index 0000000000..0fe96eca5d --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/twilight_dinner.json @@ -0,0 +1,138 @@ +{ + "parent": "twilightforest:root", + "criteria": { + "cooked_meef": { + "conditions": { + "item": { + "items": [ + "twilightforest:cooked_meef" + ] + } + }, + "trigger": "minecraft:consume_item" + }, + "cooked_venison": { + "conditions": { + "item": { + "items": [ + "twilightforest:cooked_venison" + ] + } + }, + "trigger": "minecraft:consume_item" + }, + "experiment_115": { + "conditions": { + "item": { + "items": [ + "twilightforest:experiment_115" + ] + } + }, + "trigger": "minecraft:consume_item" + }, + "hydra_chop": { + "conditions": { + "item": { + "items": [ + "twilightforest:hydra_chop" + ] + } + }, + "trigger": "minecraft:consume_item" + }, + "maze_wafer": { + "conditions": { + "item": { + "items": [ + "twilightforest:maze_wafer" + ] + } + }, + "trigger": "minecraft:consume_item" + }, + "meef_stroganoff": { + "conditions": { + "item": { + "items": [ + "twilightforest:meef_stroganoff" + ] + } + }, + "trigger": "minecraft:consume_item" + }, + "raw_meef": { + "conditions": { + "item": { + "items": [ + "twilightforest:raw_meef" + ] + } + }, + "trigger": "minecraft:consume_item" + }, + "raw_venison": { + "conditions": { + "item": { + "items": [ + "twilightforest:raw_venison" + ] + } + }, + "trigger": "minecraft:consume_item" + }, + "torchberries": { + "conditions": { + "item": { + "items": [ + "twilightforest:torchberries" + ] + } + }, + "trigger": "minecraft:consume_item" + } + }, + "display": { + "announce_to_chat": true, + "description": { + "translate": "advancement.twilightforest.twilight_dining.desc" + }, + "frame": "challenge", + "hidden": false, + "icon": { + "item": "minecraft:bowl" + }, + "show_toast": true, + "title": { + "translate": "advancement.twilightforest.twilight_dining" + } + }, + "requirements": [ + [ + "raw_venison", + "cooked_venison" + ], + [ + "raw_meef", + "cooked_meef" + ], + [ + "meef_stroganoff" + ], + [ + "hydra_chop" + ], + [ + "maze_wafer" + ], + [ + "experiment_115" + ], + [ + "torchberries" + ] + ], + "rewards": { + "experience": 75 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/advancements/twilight_hunter.json b/src/generated/resources/data/twilightforest/advancements/twilight_hunter.json new file mode 100644 index 0000000000..b116a58c33 --- /dev/null +++ b/src/generated/resources/data/twilightforest/advancements/twilight_hunter.json @@ -0,0 +1,1014 @@ +{ + "parent": "twilightforest:root", + "criteria": { + "adherent": { + "conditions": { + "entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "twilightforest:adherent", + "location": { + "dimension": "twilightforest:twilight_forest" + } + } + } + ] + }, + "trigger": "minecraft:player_killed_entity" + }, + "alpha_yeti": { + "conditions": { + "entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "twilightforest:alpha_yeti", + "location": { + "dimension": "twilightforest:twilight_forest" + } + } + } + ] + }, + "trigger": "minecraft:player_killed_entity" + }, + "armored_giant": { + "conditions": { + "entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "twilightforest:armored_giant", + "location": { + "dimension": "twilightforest:twilight_forest" + } + } + } + ] + }, + "trigger": "minecraft:player_killed_entity" + }, + "bighorn_sheep": { + "conditions": { + "entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "twilightforest:bighorn_sheep", + "location": { + "dimension": "twilightforest:twilight_forest" + } + } + } + ] + }, + "trigger": "minecraft:player_killed_entity" + }, + "blockchain_goblin": { + "conditions": { + "entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "twilightforest:blockchain_goblin", + "location": { + "dimension": "twilightforest:twilight_forest" + } + } + } + ] + }, + "trigger": "minecraft:player_killed_entity" + }, + "boar": { + "conditions": { + "entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "twilightforest:boar", + "location": { + "dimension": "twilightforest:twilight_forest" + } + } + } + ] + }, + "trigger": "minecraft:player_killed_entity" + }, + "carminite_broodling": { + "conditions": { + "entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "twilightforest:carminite_broodling", + "location": { + "dimension": "twilightforest:twilight_forest" + } + } + } + ] + }, + "trigger": "minecraft:player_killed_entity" + }, + "carminite_ghastguard": { + "conditions": { + "entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "twilightforest:carminite_ghastguard", + "location": { + "dimension": "twilightforest:twilight_forest" + } + } + } + ] + }, + "trigger": "minecraft:player_killed_entity" + }, + "carminite_ghastling": { + "conditions": { + "entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "twilightforest:carminite_ghastling", + "location": { + "dimension": "twilightforest:twilight_forest" + } + } + } + ] + }, + "trigger": "minecraft:player_killed_entity" + }, + "carminite_golem": { + "conditions": { + "entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "twilightforest:carminite_golem", + "location": { + "dimension": "twilightforest:twilight_forest" + } + } + } + ] + }, + "trigger": "minecraft:player_killed_entity" + }, + "death_tome": { + "conditions": { + "entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "twilightforest:death_tome", + "location": { + "dimension": "twilightforest:twilight_forest" + } + } + } + ] + }, + "trigger": "minecraft:player_killed_entity" + }, + "deer": { + "conditions": { + "entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "twilightforest:deer", + "location": { + "dimension": "twilightforest:twilight_forest" + } + } + } + ] + }, + "trigger": "minecraft:player_killed_entity" + }, + "dwarf_rabbit": { + "conditions": { + "entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "twilightforest:dwarf_rabbit", + "location": { + "dimension": "twilightforest:twilight_forest" + } + } + } + ] + }, + "trigger": "minecraft:player_killed_entity" + }, + "fire_beetle": { + "conditions": { + "entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "twilightforest:fire_beetle", + "location": { + "dimension": "twilightforest:twilight_forest" + } + } + } + ] + }, + "trigger": "minecraft:player_killed_entity" + }, + "giant_miner": { + "conditions": { + "entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "twilightforest:giant_miner", + "location": { + "dimension": "twilightforest:twilight_forest" + } + } + } + ] + }, + "trigger": "minecraft:player_killed_entity" + }, + "harbinger_cube": { + "conditions": { + "entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "twilightforest:harbinger_cube", + "location": { + "dimension": "twilightforest:twilight_forest" + } + } + } + ] + }, + "trigger": "minecraft:player_killed_entity" + }, + "hedge_spider": { + "conditions": { + "entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "twilightforest:hedge_spider", + "location": { + "dimension": "twilightforest:twilight_forest" + } + } + } + ] + }, + "trigger": "minecraft:player_killed_entity" + }, + "helmet_crab": { + "conditions": { + "entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "twilightforest:helmet_crab", + "location": { + "dimension": "twilightforest:twilight_forest" + } + } + } + ] + }, + "trigger": "minecraft:player_killed_entity" + }, + "hostile_wolf": { + "conditions": { + "entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "twilightforest:hostile_wolf", + "location": { + "dimension": "twilightforest:twilight_forest" + } + } + } + ] + }, + "trigger": "minecraft:player_killed_entity" + }, + "hydra": { + "conditions": { + "entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "twilightforest:hydra", + "location": { + "dimension": "twilightforest:twilight_forest" + } + } + } + ] + }, + "trigger": "minecraft:player_killed_entity" + }, + "king_spider": { + "conditions": { + "entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "twilightforest:king_spider", + "location": { + "dimension": "twilightforest:twilight_forest" + } + } + } + ] + }, + "trigger": "minecraft:player_killed_entity" + }, + "knight_phantom": { + "conditions": { + "entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "twilightforest:knight_phantom", + "location": { + "dimension": "twilightforest:twilight_forest" + } + } + } + ] + }, + "trigger": "minecraft:player_killed_entity" + }, + "kobold": { + "conditions": { + "entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "twilightforest:kobold", + "location": { + "dimension": "twilightforest:twilight_forest" + } + } + } + ] + }, + "trigger": "minecraft:player_killed_entity" + }, + "lich": { + "conditions": { + "entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "twilightforest:lich", + "location": { + "dimension": "twilightforest:twilight_forest" + } + } + } + ] + }, + "trigger": "minecraft:player_killed_entity" + }, + "lich_minion": { + "conditions": { + "entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "twilightforest:lich_minion", + "location": { + "dimension": "twilightforest:twilight_forest" + } + } + } + ] + }, + "trigger": "minecraft:player_killed_entity" + }, + "lower_goblin_knight": { + "conditions": { + "entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "twilightforest:lower_goblin_knight", + "location": { + "dimension": "twilightforest:twilight_forest" + } + } + } + ] + }, + "trigger": "minecraft:player_killed_entity" + }, + "maze_slime": { + "conditions": { + "entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "twilightforest:maze_slime", + "location": { + "dimension": "twilightforest:twilight_forest" + } + } + } + ] + }, + "trigger": "minecraft:player_killed_entity" + }, + "minoshroom": { + "conditions": { + "entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "twilightforest:minoshroom", + "location": { + "dimension": "twilightforest:twilight_forest" + } + } + } + ] + }, + "trigger": "minecraft:player_killed_entity" + }, + "minotaur": { + "conditions": { + "entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "twilightforest:minotaur", + "location": { + "dimension": "twilightforest:twilight_forest" + } + } + } + ] + }, + "trigger": "minecraft:player_killed_entity" + }, + "mist_wolf": { + "conditions": { + "entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "twilightforest:mist_wolf", + "location": { + "dimension": "twilightforest:twilight_forest" + } + } + } + ] + }, + "trigger": "minecraft:player_killed_entity" + }, + "mosquito_swarm": { + "conditions": { + "entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "twilightforest:mosquito_swarm", + "location": { + "dimension": "twilightforest:twilight_forest" + } + } + } + ] + }, + "trigger": "minecraft:player_killed_entity" + }, + "naga": { + "conditions": { + "entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "twilightforest:naga", + "location": { + "dimension": "twilightforest:twilight_forest" + } + } + } + ] + }, + "trigger": "minecraft:player_killed_entity" + }, + "penguin": { + "conditions": { + "entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "twilightforest:penguin", + "location": { + "dimension": "twilightforest:twilight_forest" + } + } + } + ] + }, + "trigger": "minecraft:player_killed_entity" + }, + "pinch_beetle": { + "conditions": { + "entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "twilightforest:pinch_beetle", + "location": { + "dimension": "twilightforest:twilight_forest" + } + } + } + ] + }, + "trigger": "minecraft:player_killed_entity" + }, + "plateau_boss": { + "conditions": { + "entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "twilightforest:plateau_boss", + "location": { + "dimension": "twilightforest:twilight_forest" + } + } + } + ] + }, + "trigger": "minecraft:player_killed_entity" + }, + "quest_ram": { + "conditions": { + "entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "twilightforest:quest_ram", + "location": { + "dimension": "twilightforest:twilight_forest" + } + } + } + ] + }, + "trigger": "minecraft:player_killed_entity" + }, + "raven": { + "conditions": { + "entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "twilightforest:raven", + "location": { + "dimension": "twilightforest:twilight_forest" + } + } + } + ] + }, + "trigger": "minecraft:player_killed_entity" + }, + "redcap": { + "conditions": { + "entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "twilightforest:redcap", + "location": { + "dimension": "twilightforest:twilight_forest" + } + } + } + ] + }, + "trigger": "minecraft:player_killed_entity" + }, + "redcap_sapper": { + "conditions": { + "entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "twilightforest:redcap_sapper", + "location": { + "dimension": "twilightforest:twilight_forest" + } + } + } + ] + }, + "trigger": "minecraft:player_killed_entity" + }, + "skeleton_druid": { + "conditions": { + "entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "twilightforest:skeleton_druid", + "location": { + "dimension": "twilightforest:twilight_forest" + } + } + } + ] + }, + "trigger": "minecraft:player_killed_entity" + }, + "slime_beetle": { + "conditions": { + "entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "twilightforest:slime_beetle", + "location": { + "dimension": "twilightforest:twilight_forest" + } + } + } + ] + }, + "trigger": "minecraft:player_killed_entity" + }, + "snow_guardian": { + "conditions": { + "entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "twilightforest:snow_guardian", + "location": { + "dimension": "twilightforest:twilight_forest" + } + } + } + ] + }, + "trigger": "minecraft:player_killed_entity" + }, + "snow_queen": { + "conditions": { + "entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "twilightforest:snow_queen", + "location": { + "dimension": "twilightforest:twilight_forest" + } + } + } + ] + }, + "trigger": "minecraft:player_killed_entity" + }, + "squirrel": { + "conditions": { + "entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "twilightforest:squirrel", + "location": { + "dimension": "twilightforest:twilight_forest" + } + } + } + ] + }, + "trigger": "minecraft:player_killed_entity" + }, + "stable_ice_core": { + "conditions": { + "entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "twilightforest:stable_ice_core", + "location": { + "dimension": "twilightforest:twilight_forest" + } + } + } + ] + }, + "trigger": "minecraft:player_killed_entity" + }, + "swarm_spider": { + "conditions": { + "entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "twilightforest:swarm_spider", + "location": { + "dimension": "twilightforest:twilight_forest" + } + } + } + ] + }, + "trigger": "minecraft:player_killed_entity" + }, + "tiny_bird": { + "conditions": { + "entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "twilightforest:tiny_bird", + "location": { + "dimension": "twilightforest:twilight_forest" + } + } + } + ] + }, + "trigger": "minecraft:player_killed_entity" + }, + "towerwood_borer": { + "conditions": { + "entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "twilightforest:towerwood_borer", + "location": { + "dimension": "twilightforest:twilight_forest" + } + } + } + ] + }, + "trigger": "minecraft:player_killed_entity" + }, + "troll": { + "conditions": { + "entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "twilightforest:troll", + "location": { + "dimension": "twilightforest:twilight_forest" + } + } + } + ] + }, + "trigger": "minecraft:player_killed_entity" + }, + "unstable_ice_core": { + "conditions": { + "entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "twilightforest:unstable_ice_core", + "location": { + "dimension": "twilightforest:twilight_forest" + } + } + } + ] + }, + "trigger": "minecraft:player_killed_entity" + }, + "upper_goblin_knight": { + "conditions": { + "entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "twilightforest:upper_goblin_knight", + "location": { + "dimension": "twilightforest:twilight_forest" + } + } + } + ] + }, + "trigger": "minecraft:player_killed_entity" + }, + "ur_ghast": { + "conditions": { + "entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "twilightforest:ur_ghast", + "location": { + "dimension": "twilightforest:twilight_forest" + } + } + } + ] + }, + "trigger": "minecraft:player_killed_entity" + }, + "winter_wolf": { + "conditions": { + "entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "twilightforest:winter_wolf", + "location": { + "dimension": "twilightforest:twilight_forest" + } + } + } + ] + }, + "trigger": "minecraft:player_killed_entity" + }, + "wraith": { + "conditions": { + "entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "twilightforest:wraith", + "location": { + "dimension": "twilightforest:twilight_forest" + } + } + } + ] + }, + "trigger": "minecraft:player_killed_entity" + }, + "yeti": { + "conditions": { + "entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "twilightforest:yeti", + "location": { + "dimension": "twilightforest:twilight_forest" + } + } + } + ] + }, + "trigger": "minecraft:player_killed_entity" + } + }, + "display": { + "announce_to_chat": true, + "description": { + "translate": "advancement.twilightforest.twilight_hunter.desc" + }, + "frame": "task", + "hidden": false, + "icon": { + "item": "twilightforest:raven_feather" + }, + "show_toast": true, + "title": { + "translate": "advancement.twilightforest.twilight_hunter" + } + }, + "requirements": [ + [ + "adherent", + "armored_giant", + "bighorn_sheep", + "blockchain_goblin", + "dwarf_rabbit", + "death_tome", + "deer", + "fire_beetle", + "giant_miner", + "lower_goblin_knight", + "upper_goblin_knight", + "harbinger_cube", + "hedge_spider", + "helmet_crab", + "hostile_wolf", + "hydra", + "king_spider", + "knight_phantom", + "kobold", + "lich", + "lich_minion", + "maze_slime", + "carminite_ghastling", + "minoshroom", + "minotaur", + "mist_wolf", + "mosquito_swarm", + "naga", + "penguin", + "pinch_beetle", + "plateau_boss", + "quest_ram", + "raven", + "redcap", + "redcap_sapper", + "skeleton_druid", + "slime_beetle", + "snow_guardian", + "snow_queen", + "squirrel", + "stable_ice_core", + "swarm_spider", + "tiny_bird", + "carminite_broodling", + "carminite_ghastguard", + "carminite_golem", + "towerwood_borer", + "troll", + "unstable_ice_core", + "ur_ghast", + "boar", + "winter_wolf", + "wraith", + "yeti", + "alpha_yeti" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/damage_type/ant.json b/src/generated/resources/data/twilightforest/damage_type/ant.json new file mode 100644 index 0000000000..40459263b8 --- /dev/null +++ b/src/generated/resources/data/twilightforest/damage_type/ant.json @@ -0,0 +1,5 @@ +{ + "exhaustion": 0.1, + "message_id": "twilightforest.ant", + "scaling": "when_caused_by_living_non_player" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/damage_type/axing.json b/src/generated/resources/data/twilightforest/damage_type/axing.json new file mode 100644 index 0000000000..da63a73511 --- /dev/null +++ b/src/generated/resources/data/twilightforest/damage_type/axing.json @@ -0,0 +1,5 @@ +{ + "exhaustion": 0.1, + "message_id": "twilightforest.axing", + "scaling": "when_caused_by_living_non_player" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/damage_type/chilling_breath.json b/src/generated/resources/data/twilightforest/damage_type/chilling_breath.json new file mode 100644 index 0000000000..94f7890d07 --- /dev/null +++ b/src/generated/resources/data/twilightforest/damage_type/chilling_breath.json @@ -0,0 +1,6 @@ +{ + "effects": "freezing", + "exhaustion": 0.0, + "message_id": "twilightforest.chillingBreath", + "scaling": "when_caused_by_living_non_player" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/damage_type/clamped.json b/src/generated/resources/data/twilightforest/damage_type/clamped.json new file mode 100644 index 0000000000..e27764f5b2 --- /dev/null +++ b/src/generated/resources/data/twilightforest/damage_type/clamped.json @@ -0,0 +1,5 @@ +{ + "exhaustion": 0.1, + "message_id": "twilightforest.clamped", + "scaling": "when_caused_by_living_non_player" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/damage_type/expired.json b/src/generated/resources/data/twilightforest/damage_type/expired.json new file mode 100644 index 0000000000..5def9a52bc --- /dev/null +++ b/src/generated/resources/data/twilightforest/damage_type/expired.json @@ -0,0 +1,5 @@ +{ + "exhaustion": 0.0, + "message_id": "twilightforest.expired", + "scaling": "when_caused_by_living_non_player" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/damage_type/falling_ice.json b/src/generated/resources/data/twilightforest/damage_type/falling_ice.json new file mode 100644 index 0000000000..0559902808 --- /dev/null +++ b/src/generated/resources/data/twilightforest/damage_type/falling_ice.json @@ -0,0 +1,5 @@ +{ + "exhaustion": 0.1, + "message_id": "fallingBlock", + "scaling": "when_caused_by_living_non_player" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/damage_type/fiery.json b/src/generated/resources/data/twilightforest/damage_type/fiery.json new file mode 100644 index 0000000000..4a5283a789 --- /dev/null +++ b/src/generated/resources/data/twilightforest/damage_type/fiery.json @@ -0,0 +1,6 @@ +{ + "effects": "burning", + "exhaustion": 0.1, + "message_id": "twilightforest.fiery", + "scaling": "when_caused_by_living_non_player" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/damage_type/fire_jet.json b/src/generated/resources/data/twilightforest/damage_type/fire_jet.json new file mode 100644 index 0000000000..b1ccde5899 --- /dev/null +++ b/src/generated/resources/data/twilightforest/damage_type/fire_jet.json @@ -0,0 +1,6 @@ +{ + "effects": "burning", + "exhaustion": 0.1, + "message_id": "twilightforest.fireJet", + "scaling": "when_caused_by_living_non_player" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/damage_type/frozen.json b/src/generated/resources/data/twilightforest/damage_type/frozen.json new file mode 100644 index 0000000000..4348cd6178 --- /dev/null +++ b/src/generated/resources/data/twilightforest/damage_type/frozen.json @@ -0,0 +1,6 @@ +{ + "effects": "freezing", + "exhaustion": 0.1, + "message_id": "twilightforest.frozen", + "scaling": "when_caused_by_living_non_player" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/damage_type/ghast_tear.json b/src/generated/resources/data/twilightforest/damage_type/ghast_tear.json new file mode 100644 index 0000000000..2039a26841 --- /dev/null +++ b/src/generated/resources/data/twilightforest/damage_type/ghast_tear.json @@ -0,0 +1,5 @@ +{ + "exhaustion": 0.0, + "message_id": "twilightforest.ghastTear", + "scaling": "when_caused_by_living_non_player" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/damage_type/haunt.json b/src/generated/resources/data/twilightforest/damage_type/haunt.json new file mode 100644 index 0000000000..473b18ec0b --- /dev/null +++ b/src/generated/resources/data/twilightforest/damage_type/haunt.json @@ -0,0 +1,5 @@ +{ + "exhaustion": 0.1, + "message_id": "twilightforest.haunt", + "scaling": "when_caused_by_living_non_player" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/damage_type/hydra_bite.json b/src/generated/resources/data/twilightforest/damage_type/hydra_bite.json new file mode 100644 index 0000000000..c2a2a8e8ff --- /dev/null +++ b/src/generated/resources/data/twilightforest/damage_type/hydra_bite.json @@ -0,0 +1,5 @@ +{ + "exhaustion": 0.0, + "message_id": "twilightforest.hydraBite", + "scaling": "when_caused_by_living_non_player" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/damage_type/hydra_fire.json b/src/generated/resources/data/twilightforest/damage_type/hydra_fire.json new file mode 100644 index 0000000000..a10c1a414c --- /dev/null +++ b/src/generated/resources/data/twilightforest/damage_type/hydra_fire.json @@ -0,0 +1,5 @@ +{ + "exhaustion": 0.0, + "message_id": "twilightforest.hydraFire", + "scaling": "when_caused_by_living_non_player" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/damage_type/hydra_mortar.json b/src/generated/resources/data/twilightforest/damage_type/hydra_mortar.json new file mode 100644 index 0000000000..bc19ee2ced --- /dev/null +++ b/src/generated/resources/data/twilightforest/damage_type/hydra_mortar.json @@ -0,0 +1,6 @@ +{ + "effects": "burning", + "exhaustion": 0.0, + "message_id": "onFire", + "scaling": "when_caused_by_living_non_player" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/damage_type/knightmetal.json b/src/generated/resources/data/twilightforest/damage_type/knightmetal.json new file mode 100644 index 0000000000..80feb378d2 --- /dev/null +++ b/src/generated/resources/data/twilightforest/damage_type/knightmetal.json @@ -0,0 +1,5 @@ +{ + "exhaustion": 0.1, + "message_id": "twilightforest.knightmetal", + "scaling": "when_caused_by_living_non_player" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/damage_type/leaf_brain.json b/src/generated/resources/data/twilightforest/damage_type/leaf_brain.json new file mode 100644 index 0000000000..5e1bbf9a06 --- /dev/null +++ b/src/generated/resources/data/twilightforest/damage_type/leaf_brain.json @@ -0,0 +1,5 @@ +{ + "exhaustion": 0.1, + "message_id": "twilightforest.leafBrain", + "scaling": "when_caused_by_living_non_player" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/damage_type/lich_bolt.json b/src/generated/resources/data/twilightforest/damage_type/lich_bolt.json new file mode 100644 index 0000000000..30d7f8bbb3 --- /dev/null +++ b/src/generated/resources/data/twilightforest/damage_type/lich_bolt.json @@ -0,0 +1,5 @@ +{ + "exhaustion": 0.0, + "message_id": "twilightforest.lichBolt", + "scaling": "when_caused_by_living_non_player" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/damage_type/lich_bomb.json b/src/generated/resources/data/twilightforest/damage_type/lich_bomb.json new file mode 100644 index 0000000000..e24521fd80 --- /dev/null +++ b/src/generated/resources/data/twilightforest/damage_type/lich_bomb.json @@ -0,0 +1,5 @@ +{ + "exhaustion": 0.0, + "message_id": "twilightforest.lichBomb", + "scaling": "when_caused_by_living_non_player" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/damage_type/lifedrain.json b/src/generated/resources/data/twilightforest/damage_type/lifedrain.json new file mode 100644 index 0000000000..7b4f02af68 --- /dev/null +++ b/src/generated/resources/data/twilightforest/damage_type/lifedrain.json @@ -0,0 +1,5 @@ +{ + "exhaustion": 0.0, + "message_id": "twilightforest.lifedrain", + "scaling": "when_caused_by_living_non_player" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/damage_type/lost_words.json b/src/generated/resources/data/twilightforest/damage_type/lost_words.json new file mode 100644 index 0000000000..89ccf211a1 --- /dev/null +++ b/src/generated/resources/data/twilightforest/damage_type/lost_words.json @@ -0,0 +1,5 @@ +{ + "exhaustion": 0.1, + "message_id": "twilightforest.lostWords", + "scaling": "when_caused_by_living_non_player" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/damage_type/moonworm.json b/src/generated/resources/data/twilightforest/damage_type/moonworm.json new file mode 100644 index 0000000000..577d49f4bd --- /dev/null +++ b/src/generated/resources/data/twilightforest/damage_type/moonworm.json @@ -0,0 +1,5 @@ +{ + "exhaustion": 0.0, + "message_id": "twilightforest.moonworm", + "scaling": "when_caused_by_living_non_player" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/damage_type/reactor.json b/src/generated/resources/data/twilightforest/damage_type/reactor.json new file mode 100644 index 0000000000..6276b88425 --- /dev/null +++ b/src/generated/resources/data/twilightforest/damage_type/reactor.json @@ -0,0 +1,5 @@ +{ + "exhaustion": 0.1, + "message_id": "twilightforest.reactor", + "scaling": "when_caused_by_living_non_player" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/damage_type/schooled.json b/src/generated/resources/data/twilightforest/damage_type/schooled.json new file mode 100644 index 0000000000..53306608bb --- /dev/null +++ b/src/generated/resources/data/twilightforest/damage_type/schooled.json @@ -0,0 +1,5 @@ +{ + "exhaustion": 0.1, + "message_id": "twilightforest.schooled", + "scaling": "when_caused_by_living_non_player" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/damage_type/scorched.json b/src/generated/resources/data/twilightforest/damage_type/scorched.json new file mode 100644 index 0000000000..e8b3958cbf --- /dev/null +++ b/src/generated/resources/data/twilightforest/damage_type/scorched.json @@ -0,0 +1,6 @@ +{ + "effects": "burning", + "exhaustion": 0.1, + "message_id": "twilightforest.scorched", + "scaling": "when_caused_by_living_non_player" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/damage_type/slam.json b/src/generated/resources/data/twilightforest/damage_type/slam.json new file mode 100644 index 0000000000..da63a73511 --- /dev/null +++ b/src/generated/resources/data/twilightforest/damage_type/slam.json @@ -0,0 +1,5 @@ +{ + "exhaustion": 0.1, + "message_id": "twilightforest.axing", + "scaling": "when_caused_by_living_non_player" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/damage_type/slider.json b/src/generated/resources/data/twilightforest/damage_type/slider.json new file mode 100644 index 0000000000..6c8819ac06 --- /dev/null +++ b/src/generated/resources/data/twilightforest/damage_type/slider.json @@ -0,0 +1,5 @@ +{ + "exhaustion": 0.1, + "message_id": "twilightforest.slider", + "scaling": "when_caused_by_living_non_player" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/damage_type/snowball_fight.json b/src/generated/resources/data/twilightforest/damage_type/snowball_fight.json new file mode 100644 index 0000000000..65b9b614ba --- /dev/null +++ b/src/generated/resources/data/twilightforest/damage_type/snowball_fight.json @@ -0,0 +1,6 @@ +{ + "effects": "freezing", + "exhaustion": 0.1, + "message_id": "twilightforest.snowballFight", + "scaling": "when_caused_by_living_non_player" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/damage_type/spiked.json b/src/generated/resources/data/twilightforest/damage_type/spiked.json new file mode 100644 index 0000000000..3ced2ba834 --- /dev/null +++ b/src/generated/resources/data/twilightforest/damage_type/spiked.json @@ -0,0 +1,5 @@ +{ + "exhaustion": 0.1, + "message_id": "twilightforest.spiked", + "scaling": "when_caused_by_living_non_player" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/damage_type/squish.json b/src/generated/resources/data/twilightforest/damage_type/squish.json new file mode 100644 index 0000000000..cd1624508a --- /dev/null +++ b/src/generated/resources/data/twilightforest/damage_type/squish.json @@ -0,0 +1,5 @@ +{ + "exhaustion": 0.0, + "message_id": "twilightforest.squish", + "scaling": "when_caused_by_living_non_player" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/damage_type/thorns.json b/src/generated/resources/data/twilightforest/damage_type/thorns.json new file mode 100644 index 0000000000..6bcd6982c7 --- /dev/null +++ b/src/generated/resources/data/twilightforest/damage_type/thorns.json @@ -0,0 +1,5 @@ +{ + "exhaustion": 0.1, + "message_id": "twilightforest.thorns", + "scaling": "when_caused_by_living_non_player" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/damage_type/thrown_axe.json b/src/generated/resources/data/twilightforest/damage_type/thrown_axe.json new file mode 100644 index 0000000000..81001c0ad2 --- /dev/null +++ b/src/generated/resources/data/twilightforest/damage_type/thrown_axe.json @@ -0,0 +1,5 @@ +{ + "exhaustion": 0.0, + "message_id": "twilightforest.thrownAxe", + "scaling": "when_caused_by_living_non_player" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/damage_type/thrown_block.json b/src/generated/resources/data/twilightforest/damage_type/thrown_block.json new file mode 100644 index 0000000000..d3aec13df9 --- /dev/null +++ b/src/generated/resources/data/twilightforest/damage_type/thrown_block.json @@ -0,0 +1,5 @@ +{ + "exhaustion": 0.1, + "message_id": "twilightforest.thrownBlock", + "scaling": "when_caused_by_living_non_player" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/damage_type/thrown_pickaxe.json b/src/generated/resources/data/twilightforest/damage_type/thrown_pickaxe.json new file mode 100644 index 0000000000..54da473324 --- /dev/null +++ b/src/generated/resources/data/twilightforest/damage_type/thrown_pickaxe.json @@ -0,0 +1,5 @@ +{ + "exhaustion": 0.0, + "message_id": "twilightforest.thrownPickaxe", + "scaling": "when_caused_by_living_non_player" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/damage_type/twilight_scepter.json b/src/generated/resources/data/twilightforest/damage_type/twilight_scepter.json new file mode 100644 index 0000000000..86fb3ec983 --- /dev/null +++ b/src/generated/resources/data/twilightforest/damage_type/twilight_scepter.json @@ -0,0 +1,5 @@ +{ + "exhaustion": 0.0, + "message_id": "indirectMagic", + "scaling": "when_caused_by_living_non_player" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/damage_type/yeeted.json b/src/generated/resources/data/twilightforest/damage_type/yeeted.json new file mode 100644 index 0000000000..7c60fe21b1 --- /dev/null +++ b/src/generated/resources/data/twilightforest/damage_type/yeeted.json @@ -0,0 +1,5 @@ +{ + "exhaustion": 0.1, + "message_id": "twilightforest.yeeted", + "scaling": "when_caused_by_living_non_player" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/dimension/twilight_forest.json b/src/generated/resources/data/twilightforest/dimension/twilight_forest.json new file mode 100644 index 0000000000..7e73a3fd9b --- /dev/null +++ b/src/generated/resources/data/twilightforest/dimension/twilight_forest.json @@ -0,0 +1,228 @@ +{ + "type": "twilightforest:twilight_forest_type", + "generator": { + "type": "twilightforest:structure_locating_wrapper", + "dark_forest_canopy_height": 19, + "generate_dark_forest_canopy": true, + "landmark_placement_allowed_biomes": { + "twilightforest:dark_forest": [ + "knight_stronghold" + ], + "twilightforest:dark_forest_center": [ + "dark_tower" + ], + "twilightforest:enchanted_forest": [ + "quest_grove" + ], + "twilightforest:final_plateau": [ + "final_castle" + ], + "twilightforest:fire_swamp": [ + "hydra_lair" + ], + "twilightforest:glacier": [ + "ice_tower" + ], + "twilightforest:highlands": [ + "troll_lairs" + ], + "twilightforest:snowy_forest": [ + "yeti_lairs" + ], + "twilightforest:swamp": [ + "labyrinth" + ] + }, + "noise_generation_settings": "twilightforest:twilight_noise_gen", + "wrapped_generator": { + "type": "minecraft:noise", + "biome_source": { + "type": "twilightforest:twilight_biomes", + "base_factor": 2.5, + "base_offset": -1.25, + "biome_landscape": [ + { + "biome_layers": { + "-1.0": "twilightforest:clearing", + "-3.0": "twilightforest:underground" + }, + "depth": 0.005, + "key_biome": "twilightforest:clearing", + "scale": 0.005 + }, + { + "biome_layers": { + "-1.0": "twilightforest:dark_forest", + "-3.0": "twilightforest:underground" + }, + "depth": 0.025, + "key_biome": "twilightforest:dark_forest", + "scale": 0.005 + }, + { + "biome_layers": { + "-1.0": "twilightforest:dark_forest_center", + "-3.0": "twilightforest:underground" + }, + "depth": 0.025, + "key_biome": "twilightforest:dark_forest_center", + "scale": 0.005 + }, + { + "biome_layers": { + "-1.0": "twilightforest:dense_forest", + "-3.0": "twilightforest:underground" + }, + "depth": 0.1, + "key_biome": "twilightforest:dense_forest", + "scale": 0.2 + }, + { + "biome_layers": { + "-1.0": "twilightforest:dense_mushroom_forest", + "-3.0": "twilightforest:underground" + }, + "depth": 0.05, + "key_biome": "twilightforest:dense_mushroom_forest", + "scale": 0.05 + }, + { + "biome_layers": { + "-1.0": "twilightforest:enchanted_forest", + "-3.0": "twilightforest:underground" + }, + "depth": 0.025, + "key_biome": "twilightforest:enchanted_forest", + "scale": 0.05 + }, + { + "biome_layers": { + "0.0": "twilightforest:final_plateau" + }, + "depth": 13.75, + "key_biome": "twilightforest:final_plateau", + "scale": 0.025 + }, + { + "biome_layers": { + "-1.2": "twilightforest:fire_swamp", + "-3.2": "twilightforest:underground" + }, + "depth": -0.2, + "key_biome": "twilightforest:fire_swamp", + "scale": 0.05 + }, + { + "biome_layers": { + "-1.0": "twilightforest:firefly_forest", + "-3.0": "twilightforest:underground" + }, + "depth": 0.0625, + "key_biome": "twilightforest:firefly_forest", + "scale": 0.05 + }, + { + "biome_layers": { + "-1.0": "twilightforest:forest", + "-3.0": "twilightforest:underground" + }, + "depth": 0.025, + "key_biome": "twilightforest:forest", + "scale": 0.05 + }, + { + "biome_layers": { + "-1.0": "twilightforest:glacier", + "-3.0": "twilightforest:underground" + }, + "depth": 0.025, + "key_biome": "twilightforest:glacier", + "scale": 0.05 + }, + { + "biome_layers": { + "-1.0": "twilightforest:highlands", + "-3.0": "twilightforest:underground" + }, + "depth": 3.0, + "key_biome": "twilightforest:highlands", + "scale": 0.25 + }, + { + "biome_layers": { + "-2.97": "twilightforest:lake", + "-4.9700003": "twilightforest:underground" + }, + "depth": -1.97, + "key_biome": "twilightforest:lake", + "scale": 0.0 + }, + { + "biome_layers": { + "-1.0": "twilightforest:mushroom_forest", + "-3.0": "twilightforest:underground" + }, + "depth": 0.025, + "key_biome": "twilightforest:mushroom_forest", + "scale": 0.05 + }, + { + "biome_layers": { + "-1.0": "twilightforest:oak_savannah", + "-3.0": "twilightforest:underground" + }, + "depth": 0.05, + "key_biome": "twilightforest:oak_savannah", + "scale": 0.1 + }, + { + "biome_layers": { + "-1.0": "twilightforest:snowy_forest", + "-3.0": "twilightforest:underground" + }, + "depth": 0.05, + "key_biome": "twilightforest:snowy_forest", + "scale": 0.15 + }, + { + "biome_layers": { + "-1.0": "twilightforest:spooky_forest", + "-3.0": "twilightforest:underground" + }, + "depth": 0.025, + "key_biome": "twilightforest:spooky_forest", + "scale": 0.05 + }, + { + "biome_layers": { + "-2.65": "twilightforest:stream", + "-4.65": "twilightforest:underground" + }, + "depth": -1.65, + "key_biome": "twilightforest:stream", + "scale": 0.25 + }, + { + "biome_layers": { + "-1.9": "twilightforest:swamp", + "-3.9": "twilightforest:underground" + }, + "depth": -0.9, + "key_biome": "twilightforest:swamp", + "scale": 0.15 + }, + { + "biome_layers": { + "0.0": "twilightforest:thornlands" + }, + "depth": 7.0, + "key_biome": "twilightforest:thornlands", + "scale": 0.1 + } + ], + "biome_layer_config": "twilightforest:biomes_along_streams" + }, + "settings": "twilightforest:twilight_noise_gen" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/dimension_type/twilight_forest_type.json b/src/generated/resources/data/twilightforest/dimension_type/twilight_forest_type.json new file mode 100644 index 0000000000..a90f94d049 --- /dev/null +++ b/src/generated/resources/data/twilightforest/dimension_type/twilight_forest_type.json @@ -0,0 +1,26 @@ +{ + "ambient_light": 0.0, + "bed_works": true, + "coordinate_scale": 0.125, + "effects": "twilightforest:renderer", + "fixed_time": 13000, + "has_ceiling": false, + "has_raids": false, + "has_skylight": true, + "height": 288, + "infiniburn": "#minecraft:infiniburn_overworld", + "logical_height": 288, + "min_y": -32, + "monster_spawn_block_light_limit": 7, + "monster_spawn_light_level": { + "type": "minecraft:uniform", + "value": { + "max_inclusive": 7, + "min_inclusive": 0 + } + }, + "natural": true, + "piglin_safe": false, + "respawn_anchor_works": true, + "ultrawarm": false +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_modifiers/fiery_pick_smelting.json b/src/generated/resources/data/twilightforest/loot_modifiers/fiery_pick_smelting.json new file mode 100644 index 0000000000..e6ce7ae0a2 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_modifiers/fiery_pick_smelting.json @@ -0,0 +1,13 @@ +{ + "type": "twilightforest:fiery_pick_smelting", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "items": [ + "twilightforest:fiery_pickaxe" + ] + } + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_modifiers/giant_pick_grouping.json b/src/generated/resources/data/twilightforest/loot_modifiers/giant_pick_grouping.json new file mode 100644 index 0000000000..6dc7656ae4 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_modifiers/giant_pick_grouping.json @@ -0,0 +1,13 @@ +{ + "type": "twilightforest:giant_block_grouping", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "items": [ + "twilightforest:giant_pickaxe" + ] + } + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/acacia_banister.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/acacia_banister.json new file mode 100644 index 0000000000..5f92c2feed --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/acacia_banister.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:acacia_banister" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/alpha_yeti_trophy.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/alpha_yeti_trophy.json new file mode 100644 index 0000000000..aa7e98cd0e --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/alpha_yeti_trophy.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:alpha_yeti_trophy" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/alpha_yeti_wall_trophy.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/alpha_yeti_wall_trophy.json new file mode 100644 index 0000000000..aa7e98cd0e --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/alpha_yeti_wall_trophy.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:alpha_yeti_trophy" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/antibuilder.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/antibuilder.json new file mode 100644 index 0000000000..68701f9f6e --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/antibuilder.json @@ -0,0 +1,3 @@ +{ + "type": "minecraft:block" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/arctic_fur_block.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/arctic_fur_block.json new file mode 100644 index 0000000000..a44eec57fe --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/arctic_fur_block.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:arctic_fur_block" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/aurora_block.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/aurora_block.json new file mode 100644 index 0000000000..ed47da5b2f --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/aurora_block.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:aurora_block" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/aurora_pillar.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/aurora_pillar.json new file mode 100644 index 0000000000..7b246ecf44 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/aurora_pillar.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:aurora_pillar" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/aurora_slab.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/aurora_slab.json new file mode 100644 index 0000000000..2c828c134c --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/aurora_slab.json @@ -0,0 +1,34 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "conditions": [ + { + "block": "twilightforest:aurora_slab", + "condition": "minecraft:block_state_property", + "properties": { + "type": "double" + } + } + ], + "count": 2.0, + "function": "minecraft:set_count" + }, + { + "function": "minecraft:explosion_decay" + } + ], + "name": "twilightforest:aurora_slab" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/auroralized_glass.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/auroralized_glass.json new file mode 100644 index 0000000000..1891566e24 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/auroralized_glass.json @@ -0,0 +1,30 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:auroralized_glass" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/beanstalk_leaves.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/beanstalk_leaves.json new file mode 100644 index 0000000000..9a4db4f727 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/beanstalk_leaves.json @@ -0,0 +1,132 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:alternative", + "terms": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "tag": "forge:shears" + } + }, + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ] + } + ], + "name": "twilightforest:beanstalk_leaves" + }, + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:survives_explosion" + }, + { + "chances": [ + 0.025, + 0.027777778, + 0.03125, + 0.041666668, + 0.1 + ], + "condition": "minecraft:table_bonus", + "enchantment": "minecraft:fortune" + } + ], + "name": "twilightforest:magic_beans" + } + ] + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:inverted", + "term": { + "condition": "minecraft:alternative", + "terms": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "tag": "forge:shears" + } + }, + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ] + } + } + ], + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "chances": [ + 0.02, + 0.022222223, + 0.025, + 0.033333335, + 0.1 + ], + "condition": "minecraft:table_bonus", + "enchantment": "minecraft:fortune" + } + ], + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 2.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + }, + { + "function": "minecraft:explosion_decay" + } + ], + "name": "minecraft:stick" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/birch_banister.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/birch_banister.json new file mode 100644 index 0000000000..593195519d --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/birch_banister.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:birch_banister" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/blue_castle_door.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/blue_castle_door.json new file mode 100644 index 0000000000..3ab14f4f71 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/blue_castle_door.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:blue_castle_door" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/blue_castle_rune_brick.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/blue_castle_rune_brick.json new file mode 100644 index 0000000000..08c3de8a76 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/blue_castle_rune_brick.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:blue_castle_rune_brick" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/bold_castle_brick_pillar.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/bold_castle_brick_pillar.json new file mode 100644 index 0000000000..8a4388a1a5 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/bold_castle_brick_pillar.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:bold_castle_brick_pillar" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/bold_castle_brick_stairs.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/bold_castle_brick_stairs.json new file mode 100644 index 0000000000..9f91a3da55 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/bold_castle_brick_stairs.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:bold_castle_brick_stairs" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/bold_castle_brick_tile.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/bold_castle_brick_tile.json new file mode 100644 index 0000000000..e06315f298 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/bold_castle_brick_tile.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:bold_castle_brick_tile" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/bold_stone_pillar.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/bold_stone_pillar.json new file mode 100644 index 0000000000..0a4cec7ff0 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/bold_stone_pillar.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:bold_stone_pillar" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/candelabra.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/candelabra.json new file mode 100644 index 0000000000..5c652dea9d --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/candelabra.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:candelabra" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/canopy_banister.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/canopy_banister.json new file mode 100644 index 0000000000..01c7dd6e7b --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/canopy_banister.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:canopy_banister" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/canopy_bookshelf.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/canopy_bookshelf.json new file mode 100644 index 0000000000..d6d907313c --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/canopy_bookshelf.json @@ -0,0 +1,49 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "name": "twilightforest:canopy_bookshelf" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": 2.0, + "function": "minecraft:set_count" + }, + { + "function": "minecraft:explosion_decay" + } + ], + "name": "minecraft:book" + } + ] + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/canopy_button.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/canopy_button.json new file mode 100644 index 0000000000..9f96ee192a --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/canopy_button.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:canopy_button" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/canopy_chest.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/canopy_chest.json new file mode 100644 index 0000000000..64b559319b --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/canopy_chest.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:canopy_chest" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/canopy_door.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/canopy_door.json new file mode 100644 index 0000000000..40a16db73a --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/canopy_door.json @@ -0,0 +1,29 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:canopy_door", + "condition": "minecraft:block_state_property", + "properties": { + "half": "lower" + } + } + ], + "name": "twilightforest:canopy_door" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/canopy_fence.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/canopy_fence.json new file mode 100644 index 0000000000..6ee3139725 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/canopy_fence.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:canopy_fence" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/canopy_fence_gate.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/canopy_fence_gate.json new file mode 100644 index 0000000000..db785f9748 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/canopy_fence_gate.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:canopy_fence_gate" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/canopy_leaves.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/canopy_leaves.json new file mode 100644 index 0000000000..efc4d667c2 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/canopy_leaves.json @@ -0,0 +1,131 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:alternative", + "terms": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "tag": "forge:shears" + } + }, + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ] + } + ], + "name": "twilightforest:canopy_leaves" + }, + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:survives_explosion" + }, + { + "chances": [ + 0.05, + 0.0625, + 0.083333336, + 0.1 + ], + "condition": "minecraft:table_bonus", + "enchantment": "minecraft:fortune" + } + ], + "name": "twilightforest:canopy_sapling" + } + ] + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:inverted", + "term": { + "condition": "minecraft:alternative", + "terms": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "tag": "forge:shears" + } + }, + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ] + } + } + ], + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "chances": [ + 0.02, + 0.022222223, + 0.025, + 0.033333335, + 0.1 + ], + "condition": "minecraft:table_bonus", + "enchantment": "minecraft:fortune" + } + ], + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 2.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + }, + { + "function": "minecraft:explosion_decay" + } + ], + "name": "minecraft:stick" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/canopy_log.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/canopy_log.json new file mode 100644 index 0000000000..d188fe7a83 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/canopy_log.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:canopy_log" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/canopy_planks.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/canopy_planks.json new file mode 100644 index 0000000000..bf1b78fe35 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/canopy_planks.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:canopy_planks" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/canopy_pressure_plate.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/canopy_pressure_plate.json new file mode 100644 index 0000000000..914783b315 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/canopy_pressure_plate.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:canopy_pressure_plate" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/canopy_sapling.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/canopy_sapling.json new file mode 100644 index 0000000000..2a5234ca80 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/canopy_sapling.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:canopy_sapling" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/canopy_sign.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/canopy_sign.json new file mode 100644 index 0000000000..fda47a2d6c --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/canopy_sign.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:canopy_sign" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/canopy_slab.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/canopy_slab.json new file mode 100644 index 0000000000..82802b57d2 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/canopy_slab.json @@ -0,0 +1,34 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "conditions": [ + { + "block": "twilightforest:canopy_slab", + "condition": "minecraft:block_state_property", + "properties": { + "type": "double" + } + } + ], + "count": 2.0, + "function": "minecraft:set_count" + }, + { + "function": "minecraft:explosion_decay" + } + ], + "name": "twilightforest:canopy_slab" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/canopy_stairs.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/canopy_stairs.json new file mode 100644 index 0000000000..bd049416e9 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/canopy_stairs.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:canopy_stairs" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/canopy_trapdoor.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/canopy_trapdoor.json new file mode 100644 index 0000000000..36ef9aa2c5 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/canopy_trapdoor.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:canopy_trapdoor" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/canopy_wall_sign.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/canopy_wall_sign.json new file mode 100644 index 0000000000..fda47a2d6c --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/canopy_wall_sign.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:canopy_sign" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/canopy_wood.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/canopy_wood.json new file mode 100644 index 0000000000..7c8073ce94 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/canopy_wood.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:canopy_wood" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/carminite_block.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/carminite_block.json new file mode 100644 index 0000000000..20c0b5d8a0 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/carminite_block.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:carminite_block" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/carminite_builder.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/carminite_builder.json new file mode 100644 index 0000000000..a83f2e8e9e --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/carminite_builder.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:carminite_builder" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/carminite_reactor.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/carminite_reactor.json new file mode 100644 index 0000000000..00b04cefd4 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/carminite_reactor.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:carminite_reactor" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/castle_brick.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/castle_brick.json new file mode 100644 index 0000000000..9d0856dcd2 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/castle_brick.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:castle_brick" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/castle_brick_stairs.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/castle_brick_stairs.json new file mode 100644 index 0000000000..eaa8eb73d2 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/castle_brick_stairs.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:castle_brick_stairs" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/castle_roof_tile.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/castle_roof_tile.json new file mode 100644 index 0000000000..593f761e6a --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/castle_roof_tile.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:castle_roof_tile" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/cicada.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/cicada.json new file mode 100644 index 0000000000..1d6a3ad2b7 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/cicada.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:cicada" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/cicada_jar.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/cicada_jar.json new file mode 100644 index 0000000000..e7a2046a54 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/cicada_jar.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:cicada_jar" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/cicada_squish.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/cicada_squish.json new file mode 100644 index 0000000000..864bdd6a01 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/cicada_squish.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:empty", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:gray_dye" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/cinder_furnace.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/cinder_furnace.json new file mode 100644 index 0000000000..dda0d9a196 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/cinder_furnace.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:cinder_furnace" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/cinder_log.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/cinder_log.json new file mode 100644 index 0000000000..14f6201ed9 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/cinder_log.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:cinder_log" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/cinder_wood.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/cinder_wood.json new file mode 100644 index 0000000000..e5a496d5e5 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/cinder_wood.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:cinder_wood" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/clover_patch.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/clover_patch.json new file mode 100644 index 0000000000..9cf23fed99 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/clover_patch.json @@ -0,0 +1,23 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "tag": "forge:shears" + } + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:clover_patch" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/cracked_castle_brick.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/cracked_castle_brick.json new file mode 100644 index 0000000000..e2c9baf607 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/cracked_castle_brick.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:cracked_castle_brick" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/cracked_castle_brick_stairs.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/cracked_castle_brick_stairs.json new file mode 100644 index 0000000000..83fa4da44b --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/cracked_castle_brick_stairs.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:cracked_castle_brick_stairs" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/cracked_deadrock.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/cracked_deadrock.json new file mode 100644 index 0000000000..e587b576fa --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/cracked_deadrock.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:cracked_deadrock" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/cracked_etched_nagastone.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/cracked_etched_nagastone.json new file mode 100644 index 0000000000..c69d24a61a --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/cracked_etched_nagastone.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:cracked_etched_nagastone" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/cracked_mazestone.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/cracked_mazestone.json new file mode 100644 index 0000000000..9e75fac8cb --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/cracked_mazestone.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:cracked_mazestone" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/cracked_nagastone_pillar.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/cracked_nagastone_pillar.json new file mode 100644 index 0000000000..b09fad6b05 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/cracked_nagastone_pillar.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:cracked_nagastone_pillar" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/cracked_nagastone_stairs_left.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/cracked_nagastone_stairs_left.json new file mode 100644 index 0000000000..dcfe963677 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/cracked_nagastone_stairs_left.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:cracked_nagastone_stairs_left" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/cracked_nagastone_stairs_right.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/cracked_nagastone_stairs_right.json new file mode 100644 index 0000000000..8bf0b955ac --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/cracked_nagastone_stairs_right.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:cracked_nagastone_stairs_right" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/cracked_towerwood.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/cracked_towerwood.json new file mode 100644 index 0000000000..8e5746c96d --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/cracked_towerwood.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:cracked_towerwood" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/cracked_underbrick.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/cracked_underbrick.json new file mode 100644 index 0000000000..d16d788f33 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/cracked_underbrick.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:cracked_underbrick" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/creeper_skull_candle.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/creeper_skull_candle.json new file mode 100644 index 0000000000..29f31e1f7f --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/creeper_skull_candle.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:creeper_head" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/creeper_wall_skull_candle.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/creeper_wall_skull_candle.json new file mode 100644 index 0000000000..29f31e1f7f --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/creeper_wall_skull_candle.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:creeper_head" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/crimson_banister.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/crimson_banister.json new file mode 100644 index 0000000000..295a6bc6eb --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/crimson_banister.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:crimson_banister" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/cut_mazestone.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/cut_mazestone.json new file mode 100644 index 0000000000..cd73f4ad40 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/cut_mazestone.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:cut_mazestone" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/dark_banister.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/dark_banister.json new file mode 100644 index 0000000000..763e7488aa --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/dark_banister.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:dark_banister" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/dark_button.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/dark_button.json new file mode 100644 index 0000000000..f82a4d3fc9 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/dark_button.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:dark_button" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/dark_chest.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/dark_chest.json new file mode 100644 index 0000000000..f8fa7ca0f6 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/dark_chest.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:dark_chest" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/dark_door.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/dark_door.json new file mode 100644 index 0000000000..656e01565e --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/dark_door.json @@ -0,0 +1,29 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:dark_door", + "condition": "minecraft:block_state_property", + "properties": { + "half": "lower" + } + } + ], + "name": "twilightforest:dark_door" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/dark_fence.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/dark_fence.json new file mode 100644 index 0000000000..8fd05ebfaa --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/dark_fence.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:dark_fence" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/dark_fence_gate.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/dark_fence_gate.json new file mode 100644 index 0000000000..258b4a7e49 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/dark_fence_gate.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:dark_fence_gate" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/dark_leaves.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/dark_leaves.json new file mode 100644 index 0000000000..15995a67c1 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/dark_leaves.json @@ -0,0 +1,132 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:alternative", + "terms": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "tag": "forge:shears" + } + }, + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ] + } + ], + "name": "twilightforest:dark_leaves" + }, + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:survives_explosion" + }, + { + "chances": [ + 0.025, + 0.027777778, + 0.03125, + 0.041666668, + 0.1 + ], + "condition": "minecraft:table_bonus", + "enchantment": "minecraft:fortune" + } + ], + "name": "twilightforest:darkwood_sapling" + } + ] + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:inverted", + "term": { + "condition": "minecraft:alternative", + "terms": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "tag": "forge:shears" + } + }, + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ] + } + } + ], + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "chances": [ + 0.02, + 0.022222223, + 0.025, + 0.033333335, + 0.1 + ], + "condition": "minecraft:table_bonus", + "enchantment": "minecraft:fortune" + } + ], + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 2.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + }, + { + "function": "minecraft:explosion_decay" + } + ], + "name": "minecraft:stick" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/dark_log.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/dark_log.json new file mode 100644 index 0000000000..f57677e894 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/dark_log.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:dark_log" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/dark_oak_banister.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/dark_oak_banister.json new file mode 100644 index 0000000000..3102c0e3f8 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/dark_oak_banister.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:dark_oak_banister" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/dark_planks.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/dark_planks.json new file mode 100644 index 0000000000..b175c629b8 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/dark_planks.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:dark_planks" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/dark_pressure_plate.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/dark_pressure_plate.json new file mode 100644 index 0000000000..12948120e3 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/dark_pressure_plate.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:dark_pressure_plate" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/dark_sign.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/dark_sign.json new file mode 100644 index 0000000000..3b36aff962 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/dark_sign.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:dark_sign" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/dark_slab.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/dark_slab.json new file mode 100644 index 0000000000..2fb51bd0c9 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/dark_slab.json @@ -0,0 +1,34 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "conditions": [ + { + "block": "twilightforest:dark_slab", + "condition": "minecraft:block_state_property", + "properties": { + "type": "double" + } + } + ], + "count": 2.0, + "function": "minecraft:set_count" + }, + { + "function": "minecraft:explosion_decay" + } + ], + "name": "twilightforest:dark_slab" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/dark_stairs.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/dark_stairs.json new file mode 100644 index 0000000000..a03dc8ae24 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/dark_stairs.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:dark_stairs" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/dark_trapdoor.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/dark_trapdoor.json new file mode 100644 index 0000000000..441a0252f6 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/dark_trapdoor.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:dark_trapdoor" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/dark_wall_sign.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/dark_wall_sign.json new file mode 100644 index 0000000000..3b36aff962 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/dark_wall_sign.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:dark_sign" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/dark_wood.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/dark_wood.json new file mode 100644 index 0000000000..87f158e7fe --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/dark_wood.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:dark_wood" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/darkwood_sapling.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/darkwood_sapling.json new file mode 100644 index 0000000000..ca27b8cbc0 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/darkwood_sapling.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:darkwood_sapling" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/deadrock.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/deadrock.json new file mode 100644 index 0000000000..98714e7f0e --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/deadrock.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:deadrock" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/death_tome_spawner.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/death_tome_spawner.json new file mode 100644 index 0000000000..68701f9f6e --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/death_tome_spawner.json @@ -0,0 +1,3 @@ +{ + "type": "minecraft:block" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/decorative_mazestone.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/decorative_mazestone.json new file mode 100644 index 0000000000..ed01a26766 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/decorative_mazestone.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:decorative_mazestone" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/empty_canopy_bookshelf.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/empty_canopy_bookshelf.json new file mode 100644 index 0000000000..c484e0f5e4 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/empty_canopy_bookshelf.json @@ -0,0 +1,30 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:empty_canopy_bookshelf" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/encased_castle_brick_pillar.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/encased_castle_brick_pillar.json new file mode 100644 index 0000000000..50031909d1 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/encased_castle_brick_pillar.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:encased_castle_brick_pillar" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/encased_castle_brick_stairs.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/encased_castle_brick_stairs.json new file mode 100644 index 0000000000..8841733745 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/encased_castle_brick_stairs.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:encased_castle_brick_stairs" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/encased_castle_brick_tile.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/encased_castle_brick_tile.json new file mode 100644 index 0000000000..e48e4598e8 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/encased_castle_brick_tile.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:encased_castle_brick_tile" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/encased_fire_jet.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/encased_fire_jet.json new file mode 100644 index 0000000000..d9c9627ef1 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/encased_fire_jet.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:encased_fire_jet" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/encased_smoker.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/encased_smoker.json new file mode 100644 index 0000000000..91f9cd72a3 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/encased_smoker.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:encased_smoker" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/encased_towerwood.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/encased_towerwood.json new file mode 100644 index 0000000000..90d1f978ca --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/encased_towerwood.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:encased_towerwood" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/etched_nagastone.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/etched_nagastone.json new file mode 100644 index 0000000000..d81d00164c --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/etched_nagastone.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:etched_nagastone" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/experiment_115.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/experiment_115.json new file mode 100644 index 0000000000..68701f9f6e --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/experiment_115.json @@ -0,0 +1,3 @@ +{ + "type": "minecraft:block" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/fallen_leaves.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/fallen_leaves.json new file mode 100644 index 0000000000..4ad7c65496 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/fallen_leaves.json @@ -0,0 +1,189 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:fallen_leaves", + "condition": "minecraft:block_state_property", + "properties": { + "layers": "1" + } + } + ], + "functions": [ + { + "add": false, + "count": 1.0, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:fallen_leaves" + }, + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:fallen_leaves", + "condition": "minecraft:block_state_property", + "properties": { + "layers": "2" + } + } + ], + "functions": [ + { + "add": false, + "count": 2.0, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:fallen_leaves" + }, + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:fallen_leaves", + "condition": "minecraft:block_state_property", + "properties": { + "layers": "3" + } + } + ], + "functions": [ + { + "add": false, + "count": 3.0, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:fallen_leaves" + }, + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:fallen_leaves", + "condition": "minecraft:block_state_property", + "properties": { + "layers": "4" + } + } + ], + "functions": [ + { + "add": false, + "count": 4.0, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:fallen_leaves" + }, + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:fallen_leaves", + "condition": "minecraft:block_state_property", + "properties": { + "layers": "5" + } + } + ], + "functions": [ + { + "add": false, + "count": 5.0, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:fallen_leaves" + }, + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:fallen_leaves", + "condition": "minecraft:block_state_property", + "properties": { + "layers": "6" + } + } + ], + "functions": [ + { + "add": false, + "count": 6.0, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:fallen_leaves" + }, + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:fallen_leaves", + "condition": "minecraft:block_state_property", + "properties": { + "layers": "7" + } + } + ], + "functions": [ + { + "add": false, + "count": 7.0, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:fallen_leaves" + }, + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:fallen_leaves", + "condition": "minecraft:block_state_property", + "properties": { + "layers": "8" + } + } + ], + "functions": [ + { + "add": false, + "count": 8.0, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:fallen_leaves" + } + ], + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "tag": "forge:shears" + } + } + ] + } + ] + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/fiddlehead.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/fiddlehead.json new file mode 100644 index 0000000000..2190db8ddf --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/fiddlehead.json @@ -0,0 +1,23 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "tag": "forge:shears" + } + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:fiddlehead" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/fiery_block.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/fiery_block.json new file mode 100644 index 0000000000..b487ec554c --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/fiery_block.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:fiery_block" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/fire_jet.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/fire_jet.json new file mode 100644 index 0000000000..799d2dcdcc --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/fire_jet.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:fire_jet" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/firefly.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/firefly.json new file mode 100644 index 0000000000..6782272f43 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/firefly.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:firefly" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/firefly_jar.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/firefly_jar.json new file mode 100644 index 0000000000..59ad38355c --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/firefly_jar.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:firefly_jar" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/firefly_particle_spawner.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/firefly_particle_spawner.json new file mode 100644 index 0000000000..c17df80609 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/firefly_particle_spawner.json @@ -0,0 +1,236 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:explosion_decay" + } + ], + "name": "twilightforest:firefly_particle_spawner" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:firefly_particle_spawner", + "condition": "minecraft:block_state_property", + "properties": { + "particle_radius": "1" + } + } + ], + "functions": [ + { + "add": false, + "count": 0.0, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:firefly" + }, + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:firefly_particle_spawner", + "condition": "minecraft:block_state_property", + "properties": { + "particle_radius": "2" + } + } + ], + "functions": [ + { + "add": false, + "count": 1.0, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:firefly" + }, + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:firefly_particle_spawner", + "condition": "minecraft:block_state_property", + "properties": { + "particle_radius": "3" + } + } + ], + "functions": [ + { + "add": false, + "count": 2.0, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:firefly" + }, + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:firefly_particle_spawner", + "condition": "minecraft:block_state_property", + "properties": { + "particle_radius": "4" + } + } + ], + "functions": [ + { + "add": false, + "count": 3.0, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:firefly" + }, + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:firefly_particle_spawner", + "condition": "minecraft:block_state_property", + "properties": { + "particle_radius": "5" + } + } + ], + "functions": [ + { + "add": false, + "count": 4.0, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:firefly" + }, + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:firefly_particle_spawner", + "condition": "minecraft:block_state_property", + "properties": { + "particle_radius": "6" + } + } + ], + "functions": [ + { + "add": false, + "count": 5.0, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:firefly" + }, + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:firefly_particle_spawner", + "condition": "minecraft:block_state_property", + "properties": { + "particle_radius": "7" + } + } + ], + "functions": [ + { + "add": false, + "count": 6.0, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:firefly" + }, + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:firefly_particle_spawner", + "condition": "minecraft:block_state_property", + "properties": { + "particle_radius": "8" + } + } + ], + "functions": [ + { + "add": false, + "count": 7.0, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:firefly" + }, + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:firefly_particle_spawner", + "condition": "minecraft:block_state_property", + "properties": { + "particle_radius": "9" + } + } + ], + "functions": [ + { + "add": false, + "count": 8.0, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:firefly" + }, + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:firefly_particle_spawner", + "condition": "minecraft:block_state_property", + "properties": { + "particle_radius": "10" + } + } + ], + "functions": [ + { + "add": false, + "count": 9.0, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:firefly" + } + ] + } + ] + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/firefly_squish.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/firefly_squish.json new file mode 100644 index 0000000000..d2399d145b --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/firefly_squish.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:empty", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:glowstone_dust" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/fluffy_cloud.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/fluffy_cloud.json new file mode 100644 index 0000000000..a0c0490af1 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/fluffy_cloud.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:fluffy_cloud" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/ghast_trap.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/ghast_trap.json new file mode 100644 index 0000000000..c0ca2f8ba3 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/ghast_trap.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:ghast_trap" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/giant_cobblestone.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/giant_cobblestone.json new file mode 100644 index 0000000000..73ff6034b0 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/giant_cobblestone.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:giant_cobblestone" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/giant_leaves.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/giant_leaves.json new file mode 100644 index 0000000000..5b838ae4f9 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/giant_leaves.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:giant_leaves" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/giant_log.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/giant_log.json new file mode 100644 index 0000000000..1c06a26569 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/giant_log.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:giant_log" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/giant_obsidian.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/giant_obsidian.json new file mode 100644 index 0000000000..bb29cb2bcd --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/giant_obsidian.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:giant_obsidian" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/hardened_dark_leaves.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/hardened_dark_leaves.json new file mode 100644 index 0000000000..15995a67c1 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/hardened_dark_leaves.json @@ -0,0 +1,132 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:alternative", + "terms": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "tag": "forge:shears" + } + }, + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ] + } + ], + "name": "twilightforest:dark_leaves" + }, + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:survives_explosion" + }, + { + "chances": [ + 0.025, + 0.027777778, + 0.03125, + 0.041666668, + 0.1 + ], + "condition": "minecraft:table_bonus", + "enchantment": "minecraft:fortune" + } + ], + "name": "twilightforest:darkwood_sapling" + } + ] + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:inverted", + "term": { + "condition": "minecraft:alternative", + "terms": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "tag": "forge:shears" + } + }, + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ] + } + } + ], + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "chances": [ + 0.02, + 0.022222223, + 0.025, + 0.033333335, + 0.1 + ], + "condition": "minecraft:table_bonus", + "enchantment": "minecraft:fortune" + } + ], + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 2.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + }, + { + "function": "minecraft:explosion_decay" + } + ], + "name": "minecraft:stick" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/hedge.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/hedge.json new file mode 100644 index 0000000000..4ef1afae5c --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/hedge.json @@ -0,0 +1,30 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:hedge" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_acacia_log_climbable.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_acacia_log_climbable.json new file mode 100644 index 0000000000..9a511bb724 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_acacia_log_climbable.json @@ -0,0 +1,256 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "name": "twilightforest:hollow_acacia_log" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 2.0 + }, + "function": "minecraft:set_count" + }, + { + "enchantment": "minecraft:fortune", + "formula": "minecraft:uniform_bonus_count", + "function": "minecraft:apply_bonus", + "parameters": { + "bonusMultiplier": 1 + } + } + ], + "name": "minecraft:stick" + } + ] + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_acacia_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss_and_grass" + } + } + ], + "name": "minecraft:grass" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_acacia_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss_and_grass" + } + } + ], + "name": "twilightforest:moss_patch" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_acacia_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss" + } + } + ], + "name": "twilightforest:moss_patch" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_acacia_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "snow" + } + } + ], + "name": "minecraft:snowball" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_acacia_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "vine" + } + } + ], + "name": "minecraft:vine" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:hollow_acacia_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "ladder" + } + } + ], + "name": "minecraft:ladder" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:hollow_acacia_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "ladder_waterlogged" + } + } + ], + "name": "minecraft:ladder" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_acacia_log_horizontal.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_acacia_log_horizontal.json new file mode 100644 index 0000000000..bda2f99bb1 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_acacia_log_horizontal.json @@ -0,0 +1,256 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "name": "twilightforest:hollow_acacia_log" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 2.0 + }, + "function": "minecraft:set_count" + }, + { + "enchantment": "minecraft:fortune", + "formula": "minecraft:uniform_bonus_count", + "function": "minecraft:apply_bonus", + "parameters": { + "bonusMultiplier": 1 + } + } + ], + "name": "minecraft:stick" + } + ] + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_acacia_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss_and_grass" + } + } + ], + "name": "minecraft:grass" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_acacia_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss_and_grass" + } + } + ], + "name": "twilightforest:moss_patch" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_acacia_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss" + } + } + ], + "name": "twilightforest:moss_patch" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_acacia_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "snow" + } + } + ], + "name": "minecraft:snowball" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_acacia_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "vine" + } + } + ], + "name": "minecraft:vine" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:hollow_acacia_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "ladder" + } + } + ], + "name": "minecraft:ladder" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:hollow_acacia_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "ladder_waterlogged" + } + } + ], + "name": "minecraft:ladder" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_acacia_log_vertical.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_acacia_log_vertical.json new file mode 100644 index 0000000000..e794c3e4d8 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_acacia_log_vertical.json @@ -0,0 +1,58 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "name": "twilightforest:hollow_acacia_log" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 2.0 + }, + "function": "minecraft:set_count" + }, + { + "enchantment": "minecraft:fortune", + "formula": "minecraft:uniform_bonus_count", + "function": "minecraft:apply_bonus", + "parameters": { + "bonusMultiplier": 1 + } + } + ], + "name": "minecraft:stick" + } + ] + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_birch_log_climbable.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_birch_log_climbable.json new file mode 100644 index 0000000000..d0b442109c --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_birch_log_climbable.json @@ -0,0 +1,256 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "name": "twilightforest:hollow_birch_log" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 2.0 + }, + "function": "minecraft:set_count" + }, + { + "enchantment": "minecraft:fortune", + "formula": "minecraft:uniform_bonus_count", + "function": "minecraft:apply_bonus", + "parameters": { + "bonusMultiplier": 1 + } + } + ], + "name": "minecraft:stick" + } + ] + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_birch_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss_and_grass" + } + } + ], + "name": "minecraft:grass" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_birch_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss_and_grass" + } + } + ], + "name": "twilightforest:moss_patch" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_birch_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss" + } + } + ], + "name": "twilightforest:moss_patch" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_birch_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "snow" + } + } + ], + "name": "minecraft:snowball" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_birch_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "vine" + } + } + ], + "name": "minecraft:vine" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:hollow_birch_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "ladder" + } + } + ], + "name": "minecraft:ladder" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:hollow_birch_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "ladder_waterlogged" + } + } + ], + "name": "minecraft:ladder" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_birch_log_horizontal.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_birch_log_horizontal.json new file mode 100644 index 0000000000..be7dc179a0 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_birch_log_horizontal.json @@ -0,0 +1,256 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "name": "twilightforest:hollow_birch_log" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 2.0 + }, + "function": "minecraft:set_count" + }, + { + "enchantment": "minecraft:fortune", + "formula": "minecraft:uniform_bonus_count", + "function": "minecraft:apply_bonus", + "parameters": { + "bonusMultiplier": 1 + } + } + ], + "name": "minecraft:stick" + } + ] + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_birch_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss_and_grass" + } + } + ], + "name": "minecraft:grass" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_birch_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss_and_grass" + } + } + ], + "name": "twilightforest:moss_patch" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_birch_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss" + } + } + ], + "name": "twilightforest:moss_patch" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_birch_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "snow" + } + } + ], + "name": "minecraft:snowball" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_birch_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "vine" + } + } + ], + "name": "minecraft:vine" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:hollow_birch_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "ladder" + } + } + ], + "name": "minecraft:ladder" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:hollow_birch_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "ladder_waterlogged" + } + } + ], + "name": "minecraft:ladder" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_birch_log_vertical.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_birch_log_vertical.json new file mode 100644 index 0000000000..082ecbc72e --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_birch_log_vertical.json @@ -0,0 +1,58 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "name": "twilightforest:hollow_birch_log" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 2.0 + }, + "function": "minecraft:set_count" + }, + { + "enchantment": "minecraft:fortune", + "formula": "minecraft:uniform_bonus_count", + "function": "minecraft:apply_bonus", + "parameters": { + "bonusMultiplier": 1 + } + } + ], + "name": "minecraft:stick" + } + ] + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_canopy_log_climbable.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_canopy_log_climbable.json new file mode 100644 index 0000000000..4927ad62bd --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_canopy_log_climbable.json @@ -0,0 +1,256 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "name": "twilightforest:hollow_canopy_log" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 2.0 + }, + "function": "minecraft:set_count" + }, + { + "enchantment": "minecraft:fortune", + "formula": "minecraft:uniform_bonus_count", + "function": "minecraft:apply_bonus", + "parameters": { + "bonusMultiplier": 1 + } + } + ], + "name": "minecraft:stick" + } + ] + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_canopy_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss_and_grass" + } + } + ], + "name": "minecraft:grass" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_canopy_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss_and_grass" + } + } + ], + "name": "twilightforest:moss_patch" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_canopy_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss" + } + } + ], + "name": "twilightforest:moss_patch" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_canopy_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "snow" + } + } + ], + "name": "minecraft:snowball" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_canopy_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "vine" + } + } + ], + "name": "minecraft:vine" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:hollow_canopy_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "ladder" + } + } + ], + "name": "minecraft:ladder" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:hollow_canopy_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "ladder_waterlogged" + } + } + ], + "name": "minecraft:ladder" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_canopy_log_horizontal.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_canopy_log_horizontal.json new file mode 100644 index 0000000000..f940f8d346 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_canopy_log_horizontal.json @@ -0,0 +1,256 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "name": "twilightforest:hollow_canopy_log" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 2.0 + }, + "function": "minecraft:set_count" + }, + { + "enchantment": "minecraft:fortune", + "formula": "minecraft:uniform_bonus_count", + "function": "minecraft:apply_bonus", + "parameters": { + "bonusMultiplier": 1 + } + } + ], + "name": "minecraft:stick" + } + ] + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_canopy_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss_and_grass" + } + } + ], + "name": "minecraft:grass" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_canopy_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss_and_grass" + } + } + ], + "name": "twilightforest:moss_patch" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_canopy_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss" + } + } + ], + "name": "twilightforest:moss_patch" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_canopy_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "snow" + } + } + ], + "name": "minecraft:snowball" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_canopy_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "vine" + } + } + ], + "name": "minecraft:vine" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:hollow_canopy_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "ladder" + } + } + ], + "name": "minecraft:ladder" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:hollow_canopy_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "ladder_waterlogged" + } + } + ], + "name": "minecraft:ladder" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_canopy_log_vertical.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_canopy_log_vertical.json new file mode 100644 index 0000000000..c5e81a85df --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_canopy_log_vertical.json @@ -0,0 +1,58 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "name": "twilightforest:hollow_canopy_log" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 2.0 + }, + "function": "minecraft:set_count" + }, + { + "enchantment": "minecraft:fortune", + "formula": "minecraft:uniform_bonus_count", + "function": "minecraft:apply_bonus", + "parameters": { + "bonusMultiplier": 1 + } + } + ], + "name": "minecraft:stick" + } + ] + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_crimson_stem_climbable.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_crimson_stem_climbable.json new file mode 100644 index 0000000000..5cd27fd79c --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_crimson_stem_climbable.json @@ -0,0 +1,256 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "name": "twilightforest:hollow_crimson_stem" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 2.0 + }, + "function": "minecraft:set_count" + }, + { + "enchantment": "minecraft:fortune", + "formula": "minecraft:uniform_bonus_count", + "function": "minecraft:apply_bonus", + "parameters": { + "bonusMultiplier": 1 + } + } + ], + "name": "minecraft:stick" + } + ] + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_crimson_stem_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss_and_grass" + } + } + ], + "name": "minecraft:grass" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_crimson_stem_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss_and_grass" + } + } + ], + "name": "twilightforest:moss_patch" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_crimson_stem_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss" + } + } + ], + "name": "twilightforest:moss_patch" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_crimson_stem_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "snow" + } + } + ], + "name": "minecraft:snowball" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_crimson_stem_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "vine" + } + } + ], + "name": "minecraft:vine" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:hollow_crimson_stem_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "ladder" + } + } + ], + "name": "minecraft:ladder" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:hollow_crimson_stem_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "ladder_waterlogged" + } + } + ], + "name": "minecraft:ladder" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_crimson_stem_horizontal.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_crimson_stem_horizontal.json new file mode 100644 index 0000000000..51241ce1ed --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_crimson_stem_horizontal.json @@ -0,0 +1,256 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "name": "twilightforest:hollow_crimson_stem" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 2.0 + }, + "function": "minecraft:set_count" + }, + { + "enchantment": "minecraft:fortune", + "formula": "minecraft:uniform_bonus_count", + "function": "minecraft:apply_bonus", + "parameters": { + "bonusMultiplier": 1 + } + } + ], + "name": "minecraft:stick" + } + ] + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_crimson_stem_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss_and_grass" + } + } + ], + "name": "minecraft:grass" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_crimson_stem_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss_and_grass" + } + } + ], + "name": "twilightforest:moss_patch" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_crimson_stem_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss" + } + } + ], + "name": "twilightforest:moss_patch" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_crimson_stem_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "snow" + } + } + ], + "name": "minecraft:snowball" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_crimson_stem_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "vine" + } + } + ], + "name": "minecraft:vine" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:hollow_crimson_stem_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "ladder" + } + } + ], + "name": "minecraft:ladder" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:hollow_crimson_stem_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "ladder_waterlogged" + } + } + ], + "name": "minecraft:ladder" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_crimson_stem_vertical.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_crimson_stem_vertical.json new file mode 100644 index 0000000000..80f0d6eff6 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_crimson_stem_vertical.json @@ -0,0 +1,58 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "name": "twilightforest:hollow_crimson_stem" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 2.0 + }, + "function": "minecraft:set_count" + }, + { + "enchantment": "minecraft:fortune", + "formula": "minecraft:uniform_bonus_count", + "function": "minecraft:apply_bonus", + "parameters": { + "bonusMultiplier": 1 + } + } + ], + "name": "minecraft:stick" + } + ] + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_dark_log_climbable.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_dark_log_climbable.json new file mode 100644 index 0000000000..823fade7be --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_dark_log_climbable.json @@ -0,0 +1,256 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "name": "twilightforest:hollow_dark_log" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 2.0 + }, + "function": "minecraft:set_count" + }, + { + "enchantment": "minecraft:fortune", + "formula": "minecraft:uniform_bonus_count", + "function": "minecraft:apply_bonus", + "parameters": { + "bonusMultiplier": 1 + } + } + ], + "name": "minecraft:stick" + } + ] + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_dark_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss_and_grass" + } + } + ], + "name": "minecraft:grass" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_dark_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss_and_grass" + } + } + ], + "name": "twilightforest:moss_patch" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_dark_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss" + } + } + ], + "name": "twilightforest:moss_patch" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_dark_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "snow" + } + } + ], + "name": "minecraft:snowball" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_dark_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "vine" + } + } + ], + "name": "minecraft:vine" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:hollow_dark_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "ladder" + } + } + ], + "name": "minecraft:ladder" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:hollow_dark_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "ladder_waterlogged" + } + } + ], + "name": "minecraft:ladder" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_dark_log_horizontal.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_dark_log_horizontal.json new file mode 100644 index 0000000000..99b9910fc9 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_dark_log_horizontal.json @@ -0,0 +1,256 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "name": "twilightforest:hollow_dark_log" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 2.0 + }, + "function": "minecraft:set_count" + }, + { + "enchantment": "minecraft:fortune", + "formula": "minecraft:uniform_bonus_count", + "function": "minecraft:apply_bonus", + "parameters": { + "bonusMultiplier": 1 + } + } + ], + "name": "minecraft:stick" + } + ] + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_dark_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss_and_grass" + } + } + ], + "name": "minecraft:grass" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_dark_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss_and_grass" + } + } + ], + "name": "twilightforest:moss_patch" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_dark_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss" + } + } + ], + "name": "twilightforest:moss_patch" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_dark_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "snow" + } + } + ], + "name": "minecraft:snowball" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_dark_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "vine" + } + } + ], + "name": "minecraft:vine" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:hollow_dark_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "ladder" + } + } + ], + "name": "minecraft:ladder" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:hollow_dark_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "ladder_waterlogged" + } + } + ], + "name": "minecraft:ladder" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_dark_log_vertical.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_dark_log_vertical.json new file mode 100644 index 0000000000..01fbb4e145 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_dark_log_vertical.json @@ -0,0 +1,58 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "name": "twilightforest:hollow_dark_log" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 2.0 + }, + "function": "minecraft:set_count" + }, + { + "enchantment": "minecraft:fortune", + "formula": "minecraft:uniform_bonus_count", + "function": "minecraft:apply_bonus", + "parameters": { + "bonusMultiplier": 1 + } + } + ], + "name": "minecraft:stick" + } + ] + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_dark_oak_log_climbable.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_dark_oak_log_climbable.json new file mode 100644 index 0000000000..dce013ecd7 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_dark_oak_log_climbable.json @@ -0,0 +1,256 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "name": "twilightforest:hollow_dark_oak_log" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 2.0 + }, + "function": "minecraft:set_count" + }, + { + "enchantment": "minecraft:fortune", + "formula": "minecraft:uniform_bonus_count", + "function": "minecraft:apply_bonus", + "parameters": { + "bonusMultiplier": 1 + } + } + ], + "name": "minecraft:stick" + } + ] + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_dark_oak_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss_and_grass" + } + } + ], + "name": "minecraft:grass" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_dark_oak_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss_and_grass" + } + } + ], + "name": "twilightforest:moss_patch" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_dark_oak_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss" + } + } + ], + "name": "twilightforest:moss_patch" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_dark_oak_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "snow" + } + } + ], + "name": "minecraft:snowball" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_dark_oak_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "vine" + } + } + ], + "name": "minecraft:vine" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:hollow_dark_oak_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "ladder" + } + } + ], + "name": "minecraft:ladder" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:hollow_dark_oak_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "ladder_waterlogged" + } + } + ], + "name": "minecraft:ladder" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_dark_oak_log_horizontal.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_dark_oak_log_horizontal.json new file mode 100644 index 0000000000..af2379ac17 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_dark_oak_log_horizontal.json @@ -0,0 +1,256 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "name": "twilightforest:hollow_dark_oak_log" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 2.0 + }, + "function": "minecraft:set_count" + }, + { + "enchantment": "minecraft:fortune", + "formula": "minecraft:uniform_bonus_count", + "function": "minecraft:apply_bonus", + "parameters": { + "bonusMultiplier": 1 + } + } + ], + "name": "minecraft:stick" + } + ] + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_dark_oak_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss_and_grass" + } + } + ], + "name": "minecraft:grass" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_dark_oak_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss_and_grass" + } + } + ], + "name": "twilightforest:moss_patch" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_dark_oak_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss" + } + } + ], + "name": "twilightforest:moss_patch" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_dark_oak_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "snow" + } + } + ], + "name": "minecraft:snowball" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_dark_oak_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "vine" + } + } + ], + "name": "minecraft:vine" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:hollow_dark_oak_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "ladder" + } + } + ], + "name": "minecraft:ladder" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:hollow_dark_oak_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "ladder_waterlogged" + } + } + ], + "name": "minecraft:ladder" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_dark_oak_log_vertical.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_dark_oak_log_vertical.json new file mode 100644 index 0000000000..21418c1a9f --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_dark_oak_log_vertical.json @@ -0,0 +1,58 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "name": "twilightforest:hollow_dark_oak_log" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 2.0 + }, + "function": "minecraft:set_count" + }, + { + "enchantment": "minecraft:fortune", + "formula": "minecraft:uniform_bonus_count", + "function": "minecraft:apply_bonus", + "parameters": { + "bonusMultiplier": 1 + } + } + ], + "name": "minecraft:stick" + } + ] + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_jungle_log_climbable.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_jungle_log_climbable.json new file mode 100644 index 0000000000..1944f0b88c --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_jungle_log_climbable.json @@ -0,0 +1,256 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "name": "twilightforest:hollow_jungle_log" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 2.0 + }, + "function": "minecraft:set_count" + }, + { + "enchantment": "minecraft:fortune", + "formula": "minecraft:uniform_bonus_count", + "function": "minecraft:apply_bonus", + "parameters": { + "bonusMultiplier": 1 + } + } + ], + "name": "minecraft:stick" + } + ] + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_jungle_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss_and_grass" + } + } + ], + "name": "minecraft:grass" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_jungle_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss_and_grass" + } + } + ], + "name": "twilightforest:moss_patch" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_jungle_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss" + } + } + ], + "name": "twilightforest:moss_patch" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_jungle_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "snow" + } + } + ], + "name": "minecraft:snowball" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_jungle_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "vine" + } + } + ], + "name": "minecraft:vine" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:hollow_jungle_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "ladder" + } + } + ], + "name": "minecraft:ladder" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:hollow_jungle_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "ladder_waterlogged" + } + } + ], + "name": "minecraft:ladder" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_jungle_log_horizontal.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_jungle_log_horizontal.json new file mode 100644 index 0000000000..2ef07580a2 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_jungle_log_horizontal.json @@ -0,0 +1,256 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "name": "twilightforest:hollow_jungle_log" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 2.0 + }, + "function": "minecraft:set_count" + }, + { + "enchantment": "minecraft:fortune", + "formula": "minecraft:uniform_bonus_count", + "function": "minecraft:apply_bonus", + "parameters": { + "bonusMultiplier": 1 + } + } + ], + "name": "minecraft:stick" + } + ] + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_jungle_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss_and_grass" + } + } + ], + "name": "minecraft:grass" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_jungle_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss_and_grass" + } + } + ], + "name": "twilightforest:moss_patch" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_jungle_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss" + } + } + ], + "name": "twilightforest:moss_patch" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_jungle_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "snow" + } + } + ], + "name": "minecraft:snowball" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_jungle_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "vine" + } + } + ], + "name": "minecraft:vine" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:hollow_jungle_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "ladder" + } + } + ], + "name": "minecraft:ladder" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:hollow_jungle_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "ladder_waterlogged" + } + } + ], + "name": "minecraft:ladder" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_jungle_log_vertical.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_jungle_log_vertical.json new file mode 100644 index 0000000000..56e7172e04 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_jungle_log_vertical.json @@ -0,0 +1,58 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "name": "twilightforest:hollow_jungle_log" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 2.0 + }, + "function": "minecraft:set_count" + }, + { + "enchantment": "minecraft:fortune", + "formula": "minecraft:uniform_bonus_count", + "function": "minecraft:apply_bonus", + "parameters": { + "bonusMultiplier": 1 + } + } + ], + "name": "minecraft:stick" + } + ] + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_mangrove_log_climbable.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_mangrove_log_climbable.json new file mode 100644 index 0000000000..f69ad8a626 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_mangrove_log_climbable.json @@ -0,0 +1,256 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "name": "twilightforest:hollow_mangrove_log" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 2.0 + }, + "function": "minecraft:set_count" + }, + { + "enchantment": "minecraft:fortune", + "formula": "minecraft:uniform_bonus_count", + "function": "minecraft:apply_bonus", + "parameters": { + "bonusMultiplier": 1 + } + } + ], + "name": "minecraft:stick" + } + ] + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_mangrove_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss_and_grass" + } + } + ], + "name": "minecraft:grass" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_mangrove_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss_and_grass" + } + } + ], + "name": "twilightforest:moss_patch" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_mangrove_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss" + } + } + ], + "name": "twilightforest:moss_patch" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_mangrove_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "snow" + } + } + ], + "name": "minecraft:snowball" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_mangrove_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "vine" + } + } + ], + "name": "minecraft:vine" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:hollow_mangrove_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "ladder" + } + } + ], + "name": "minecraft:ladder" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:hollow_mangrove_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "ladder_waterlogged" + } + } + ], + "name": "minecraft:ladder" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_mangrove_log_horizontal.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_mangrove_log_horizontal.json new file mode 100644 index 0000000000..368811c259 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_mangrove_log_horizontal.json @@ -0,0 +1,256 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "name": "twilightforest:hollow_mangrove_log" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 2.0 + }, + "function": "minecraft:set_count" + }, + { + "enchantment": "minecraft:fortune", + "formula": "minecraft:uniform_bonus_count", + "function": "minecraft:apply_bonus", + "parameters": { + "bonusMultiplier": 1 + } + } + ], + "name": "minecraft:stick" + } + ] + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_mangrove_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss_and_grass" + } + } + ], + "name": "minecraft:grass" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_mangrove_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss_and_grass" + } + } + ], + "name": "twilightforest:moss_patch" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_mangrove_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss" + } + } + ], + "name": "twilightforest:moss_patch" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_mangrove_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "snow" + } + } + ], + "name": "minecraft:snowball" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_mangrove_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "vine" + } + } + ], + "name": "minecraft:vine" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:hollow_mangrove_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "ladder" + } + } + ], + "name": "minecraft:ladder" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:hollow_mangrove_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "ladder_waterlogged" + } + } + ], + "name": "minecraft:ladder" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_mangrove_log_vertical.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_mangrove_log_vertical.json new file mode 100644 index 0000000000..326878e803 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_mangrove_log_vertical.json @@ -0,0 +1,58 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "name": "twilightforest:hollow_mangrove_log" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 2.0 + }, + "function": "minecraft:set_count" + }, + { + "enchantment": "minecraft:fortune", + "formula": "minecraft:uniform_bonus_count", + "function": "minecraft:apply_bonus", + "parameters": { + "bonusMultiplier": 1 + } + } + ], + "name": "minecraft:stick" + } + ] + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_mining_log_climbable.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_mining_log_climbable.json new file mode 100644 index 0000000000..0b7d3ece8a --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_mining_log_climbable.json @@ -0,0 +1,256 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "name": "twilightforest:hollow_mining_log" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 2.0 + }, + "function": "minecraft:set_count" + }, + { + "enchantment": "minecraft:fortune", + "formula": "minecraft:uniform_bonus_count", + "function": "minecraft:apply_bonus", + "parameters": { + "bonusMultiplier": 1 + } + } + ], + "name": "minecraft:stick" + } + ] + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_mining_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss_and_grass" + } + } + ], + "name": "minecraft:grass" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_mining_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss_and_grass" + } + } + ], + "name": "twilightforest:moss_patch" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_mining_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss" + } + } + ], + "name": "twilightforest:moss_patch" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_mining_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "snow" + } + } + ], + "name": "minecraft:snowball" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_mining_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "vine" + } + } + ], + "name": "minecraft:vine" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:hollow_mining_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "ladder" + } + } + ], + "name": "minecraft:ladder" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:hollow_mining_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "ladder_waterlogged" + } + } + ], + "name": "minecraft:ladder" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_mining_log_horizontal.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_mining_log_horizontal.json new file mode 100644 index 0000000000..189040194e --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_mining_log_horizontal.json @@ -0,0 +1,256 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "name": "twilightforest:hollow_mining_log" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 2.0 + }, + "function": "minecraft:set_count" + }, + { + "enchantment": "minecraft:fortune", + "formula": "minecraft:uniform_bonus_count", + "function": "minecraft:apply_bonus", + "parameters": { + "bonusMultiplier": 1 + } + } + ], + "name": "minecraft:stick" + } + ] + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_mining_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss_and_grass" + } + } + ], + "name": "minecraft:grass" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_mining_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss_and_grass" + } + } + ], + "name": "twilightforest:moss_patch" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_mining_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss" + } + } + ], + "name": "twilightforest:moss_patch" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_mining_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "snow" + } + } + ], + "name": "minecraft:snowball" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_mining_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "vine" + } + } + ], + "name": "minecraft:vine" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:hollow_mining_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "ladder" + } + } + ], + "name": "minecraft:ladder" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:hollow_mining_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "ladder_waterlogged" + } + } + ], + "name": "minecraft:ladder" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_mining_log_vertical.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_mining_log_vertical.json new file mode 100644 index 0000000000..0204e143e3 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_mining_log_vertical.json @@ -0,0 +1,58 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "name": "twilightforest:hollow_mining_log" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 2.0 + }, + "function": "minecraft:set_count" + }, + { + "enchantment": "minecraft:fortune", + "formula": "minecraft:uniform_bonus_count", + "function": "minecraft:apply_bonus", + "parameters": { + "bonusMultiplier": 1 + } + } + ], + "name": "minecraft:stick" + } + ] + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_oak_log_climbable.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_oak_log_climbable.json new file mode 100644 index 0000000000..31a1b39593 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_oak_log_climbable.json @@ -0,0 +1,256 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "name": "twilightforest:hollow_oak_log" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 2.0 + }, + "function": "minecraft:set_count" + }, + { + "enchantment": "minecraft:fortune", + "formula": "minecraft:uniform_bonus_count", + "function": "minecraft:apply_bonus", + "parameters": { + "bonusMultiplier": 1 + } + } + ], + "name": "minecraft:stick" + } + ] + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_oak_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss_and_grass" + } + } + ], + "name": "minecraft:grass" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_oak_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss_and_grass" + } + } + ], + "name": "twilightforest:moss_patch" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_oak_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss" + } + } + ], + "name": "twilightforest:moss_patch" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_oak_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "snow" + } + } + ], + "name": "minecraft:snowball" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_oak_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "vine" + } + } + ], + "name": "minecraft:vine" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:hollow_oak_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "ladder" + } + } + ], + "name": "minecraft:ladder" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:hollow_oak_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "ladder_waterlogged" + } + } + ], + "name": "minecraft:ladder" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_oak_log_horizontal.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_oak_log_horizontal.json new file mode 100644 index 0000000000..dbbdba478f --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_oak_log_horizontal.json @@ -0,0 +1,256 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "name": "twilightforest:hollow_oak_log" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 2.0 + }, + "function": "minecraft:set_count" + }, + { + "enchantment": "minecraft:fortune", + "formula": "minecraft:uniform_bonus_count", + "function": "minecraft:apply_bonus", + "parameters": { + "bonusMultiplier": 1 + } + } + ], + "name": "minecraft:stick" + } + ] + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_oak_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss_and_grass" + } + } + ], + "name": "minecraft:grass" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_oak_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss_and_grass" + } + } + ], + "name": "twilightforest:moss_patch" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_oak_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss" + } + } + ], + "name": "twilightforest:moss_patch" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_oak_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "snow" + } + } + ], + "name": "minecraft:snowball" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_oak_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "vine" + } + } + ], + "name": "minecraft:vine" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:hollow_oak_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "ladder" + } + } + ], + "name": "minecraft:ladder" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:hollow_oak_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "ladder_waterlogged" + } + } + ], + "name": "minecraft:ladder" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_oak_log_vertical.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_oak_log_vertical.json new file mode 100644 index 0000000000..98431c91e1 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_oak_log_vertical.json @@ -0,0 +1,58 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "name": "twilightforest:hollow_oak_log" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 2.0 + }, + "function": "minecraft:set_count" + }, + { + "enchantment": "minecraft:fortune", + "formula": "minecraft:uniform_bonus_count", + "function": "minecraft:apply_bonus", + "parameters": { + "bonusMultiplier": 1 + } + } + ], + "name": "minecraft:stick" + } + ] + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_oak_sapling.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_oak_sapling.json new file mode 100644 index 0000000000..e6f8273762 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_oak_sapling.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:hollow_oak_sapling" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_sorting_log_climbable.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_sorting_log_climbable.json new file mode 100644 index 0000000000..5e8421cb8b --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_sorting_log_climbable.json @@ -0,0 +1,256 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "name": "twilightforest:hollow_sorting_log" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 2.0 + }, + "function": "minecraft:set_count" + }, + { + "enchantment": "minecraft:fortune", + "formula": "minecraft:uniform_bonus_count", + "function": "minecraft:apply_bonus", + "parameters": { + "bonusMultiplier": 1 + } + } + ], + "name": "minecraft:stick" + } + ] + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_sorting_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss_and_grass" + } + } + ], + "name": "minecraft:grass" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_sorting_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss_and_grass" + } + } + ], + "name": "twilightforest:moss_patch" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_sorting_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss" + } + } + ], + "name": "twilightforest:moss_patch" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_sorting_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "snow" + } + } + ], + "name": "minecraft:snowball" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_sorting_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "vine" + } + } + ], + "name": "minecraft:vine" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:hollow_sorting_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "ladder" + } + } + ], + "name": "minecraft:ladder" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:hollow_sorting_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "ladder_waterlogged" + } + } + ], + "name": "minecraft:ladder" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_sorting_log_horizontal.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_sorting_log_horizontal.json new file mode 100644 index 0000000000..724efa5963 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_sorting_log_horizontal.json @@ -0,0 +1,256 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "name": "twilightforest:hollow_sorting_log" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 2.0 + }, + "function": "minecraft:set_count" + }, + { + "enchantment": "minecraft:fortune", + "formula": "minecraft:uniform_bonus_count", + "function": "minecraft:apply_bonus", + "parameters": { + "bonusMultiplier": 1 + } + } + ], + "name": "minecraft:stick" + } + ] + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_sorting_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss_and_grass" + } + } + ], + "name": "minecraft:grass" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_sorting_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss_and_grass" + } + } + ], + "name": "twilightforest:moss_patch" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_sorting_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss" + } + } + ], + "name": "twilightforest:moss_patch" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_sorting_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "snow" + } + } + ], + "name": "minecraft:snowball" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_sorting_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "vine" + } + } + ], + "name": "minecraft:vine" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:hollow_sorting_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "ladder" + } + } + ], + "name": "minecraft:ladder" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:hollow_sorting_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "ladder_waterlogged" + } + } + ], + "name": "minecraft:ladder" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_sorting_log_vertical.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_sorting_log_vertical.json new file mode 100644 index 0000000000..aa7baafd13 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_sorting_log_vertical.json @@ -0,0 +1,58 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "name": "twilightforest:hollow_sorting_log" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 2.0 + }, + "function": "minecraft:set_count" + }, + { + "enchantment": "minecraft:fortune", + "formula": "minecraft:uniform_bonus_count", + "function": "minecraft:apply_bonus", + "parameters": { + "bonusMultiplier": 1 + } + } + ], + "name": "minecraft:stick" + } + ] + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_spruce_log_climbable.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_spruce_log_climbable.json new file mode 100644 index 0000000000..c96bad49dc --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_spruce_log_climbable.json @@ -0,0 +1,256 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "name": "twilightforest:hollow_spruce_log" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 2.0 + }, + "function": "minecraft:set_count" + }, + { + "enchantment": "minecraft:fortune", + "formula": "minecraft:uniform_bonus_count", + "function": "minecraft:apply_bonus", + "parameters": { + "bonusMultiplier": 1 + } + } + ], + "name": "minecraft:stick" + } + ] + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_spruce_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss_and_grass" + } + } + ], + "name": "minecraft:grass" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_spruce_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss_and_grass" + } + } + ], + "name": "twilightforest:moss_patch" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_spruce_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss" + } + } + ], + "name": "twilightforest:moss_patch" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_spruce_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "snow" + } + } + ], + "name": "minecraft:snowball" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_spruce_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "vine" + } + } + ], + "name": "minecraft:vine" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:hollow_spruce_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "ladder" + } + } + ], + "name": "minecraft:ladder" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:hollow_spruce_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "ladder_waterlogged" + } + } + ], + "name": "minecraft:ladder" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_spruce_log_horizontal.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_spruce_log_horizontal.json new file mode 100644 index 0000000000..a3d633f336 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_spruce_log_horizontal.json @@ -0,0 +1,256 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "name": "twilightforest:hollow_spruce_log" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 2.0 + }, + "function": "minecraft:set_count" + }, + { + "enchantment": "minecraft:fortune", + "formula": "minecraft:uniform_bonus_count", + "function": "minecraft:apply_bonus", + "parameters": { + "bonusMultiplier": 1 + } + } + ], + "name": "minecraft:stick" + } + ] + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_spruce_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss_and_grass" + } + } + ], + "name": "minecraft:grass" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_spruce_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss_and_grass" + } + } + ], + "name": "twilightforest:moss_patch" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_spruce_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss" + } + } + ], + "name": "twilightforest:moss_patch" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_spruce_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "snow" + } + } + ], + "name": "minecraft:snowball" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_spruce_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "vine" + } + } + ], + "name": "minecraft:vine" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:hollow_spruce_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "ladder" + } + } + ], + "name": "minecraft:ladder" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:hollow_spruce_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "ladder_waterlogged" + } + } + ], + "name": "minecraft:ladder" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_spruce_log_vertical.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_spruce_log_vertical.json new file mode 100644 index 0000000000..563a7f3ace --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_spruce_log_vertical.json @@ -0,0 +1,58 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "name": "twilightforest:hollow_spruce_log" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 2.0 + }, + "function": "minecraft:set_count" + }, + { + "enchantment": "minecraft:fortune", + "formula": "minecraft:uniform_bonus_count", + "function": "minecraft:apply_bonus", + "parameters": { + "bonusMultiplier": 1 + } + } + ], + "name": "minecraft:stick" + } + ] + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_time_log_climbable.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_time_log_climbable.json new file mode 100644 index 0000000000..e5caa9f416 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_time_log_climbable.json @@ -0,0 +1,256 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "name": "twilightforest:hollow_time_log" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 2.0 + }, + "function": "minecraft:set_count" + }, + { + "enchantment": "minecraft:fortune", + "formula": "minecraft:uniform_bonus_count", + "function": "minecraft:apply_bonus", + "parameters": { + "bonusMultiplier": 1 + } + } + ], + "name": "minecraft:stick" + } + ] + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_time_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss_and_grass" + } + } + ], + "name": "minecraft:grass" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_time_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss_and_grass" + } + } + ], + "name": "twilightforest:moss_patch" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_time_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss" + } + } + ], + "name": "twilightforest:moss_patch" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_time_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "snow" + } + } + ], + "name": "minecraft:snowball" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_time_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "vine" + } + } + ], + "name": "minecraft:vine" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:hollow_time_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "ladder" + } + } + ], + "name": "minecraft:ladder" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:hollow_time_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "ladder_waterlogged" + } + } + ], + "name": "minecraft:ladder" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_time_log_horizontal.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_time_log_horizontal.json new file mode 100644 index 0000000000..6a8f881666 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_time_log_horizontal.json @@ -0,0 +1,256 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "name": "twilightforest:hollow_time_log" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 2.0 + }, + "function": "minecraft:set_count" + }, + { + "enchantment": "minecraft:fortune", + "formula": "minecraft:uniform_bonus_count", + "function": "minecraft:apply_bonus", + "parameters": { + "bonusMultiplier": 1 + } + } + ], + "name": "minecraft:stick" + } + ] + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_time_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss_and_grass" + } + } + ], + "name": "minecraft:grass" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_time_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss_and_grass" + } + } + ], + "name": "twilightforest:moss_patch" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_time_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss" + } + } + ], + "name": "twilightforest:moss_patch" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_time_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "snow" + } + } + ], + "name": "minecraft:snowball" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_time_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "vine" + } + } + ], + "name": "minecraft:vine" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:hollow_time_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "ladder" + } + } + ], + "name": "minecraft:ladder" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:hollow_time_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "ladder_waterlogged" + } + } + ], + "name": "minecraft:ladder" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_time_log_vertical.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_time_log_vertical.json new file mode 100644 index 0000000000..f83475f0cf --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_time_log_vertical.json @@ -0,0 +1,58 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "name": "twilightforest:hollow_time_log" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 2.0 + }, + "function": "minecraft:set_count" + }, + { + "enchantment": "minecraft:fortune", + "formula": "minecraft:uniform_bonus_count", + "function": "minecraft:apply_bonus", + "parameters": { + "bonusMultiplier": 1 + } + } + ], + "name": "minecraft:stick" + } + ] + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_transformation_log_climbable.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_transformation_log_climbable.json new file mode 100644 index 0000000000..80980d4f42 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_transformation_log_climbable.json @@ -0,0 +1,256 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "name": "twilightforest:hollow_transformation_log" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 2.0 + }, + "function": "minecraft:set_count" + }, + { + "enchantment": "minecraft:fortune", + "formula": "minecraft:uniform_bonus_count", + "function": "minecraft:apply_bonus", + "parameters": { + "bonusMultiplier": 1 + } + } + ], + "name": "minecraft:stick" + } + ] + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_transformation_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss_and_grass" + } + } + ], + "name": "minecraft:grass" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_transformation_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss_and_grass" + } + } + ], + "name": "twilightforest:moss_patch" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_transformation_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss" + } + } + ], + "name": "twilightforest:moss_patch" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_transformation_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "snow" + } + } + ], + "name": "minecraft:snowball" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_transformation_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "vine" + } + } + ], + "name": "minecraft:vine" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:hollow_transformation_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "ladder" + } + } + ], + "name": "minecraft:ladder" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:hollow_transformation_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "ladder_waterlogged" + } + } + ], + "name": "minecraft:ladder" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_transformation_log_horizontal.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_transformation_log_horizontal.json new file mode 100644 index 0000000000..071a67b309 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_transformation_log_horizontal.json @@ -0,0 +1,256 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "name": "twilightforest:hollow_transformation_log" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 2.0 + }, + "function": "minecraft:set_count" + }, + { + "enchantment": "minecraft:fortune", + "formula": "minecraft:uniform_bonus_count", + "function": "minecraft:apply_bonus", + "parameters": { + "bonusMultiplier": 1 + } + } + ], + "name": "minecraft:stick" + } + ] + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_transformation_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss_and_grass" + } + } + ], + "name": "minecraft:grass" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_transformation_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss_and_grass" + } + } + ], + "name": "twilightforest:moss_patch" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_transformation_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss" + } + } + ], + "name": "twilightforest:moss_patch" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_transformation_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "snow" + } + } + ], + "name": "minecraft:snowball" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_transformation_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "vine" + } + } + ], + "name": "minecraft:vine" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:hollow_transformation_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "ladder" + } + } + ], + "name": "minecraft:ladder" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:hollow_transformation_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "ladder_waterlogged" + } + } + ], + "name": "minecraft:ladder" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_transformation_log_vertical.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_transformation_log_vertical.json new file mode 100644 index 0000000000..88cc25d515 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_transformation_log_vertical.json @@ -0,0 +1,58 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "name": "twilightforest:hollow_transformation_log" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 2.0 + }, + "function": "minecraft:set_count" + }, + { + "enchantment": "minecraft:fortune", + "formula": "minecraft:uniform_bonus_count", + "function": "minecraft:apply_bonus", + "parameters": { + "bonusMultiplier": 1 + } + } + ], + "name": "minecraft:stick" + } + ] + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_twilight_oak_log_climbable.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_twilight_oak_log_climbable.json new file mode 100644 index 0000000000..743d150063 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_twilight_oak_log_climbable.json @@ -0,0 +1,256 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "name": "twilightforest:hollow_twilight_oak_log" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 2.0 + }, + "function": "minecraft:set_count" + }, + { + "enchantment": "minecraft:fortune", + "formula": "minecraft:uniform_bonus_count", + "function": "minecraft:apply_bonus", + "parameters": { + "bonusMultiplier": 1 + } + } + ], + "name": "minecraft:stick" + } + ] + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_twilight_oak_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss_and_grass" + } + } + ], + "name": "minecraft:grass" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_twilight_oak_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss_and_grass" + } + } + ], + "name": "twilightforest:moss_patch" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_twilight_oak_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss" + } + } + ], + "name": "twilightforest:moss_patch" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_twilight_oak_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "snow" + } + } + ], + "name": "minecraft:snowball" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_twilight_oak_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "vine" + } + } + ], + "name": "minecraft:vine" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:hollow_twilight_oak_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "ladder" + } + } + ], + "name": "minecraft:ladder" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:hollow_twilight_oak_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "ladder_waterlogged" + } + } + ], + "name": "minecraft:ladder" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_twilight_oak_log_horizontal.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_twilight_oak_log_horizontal.json new file mode 100644 index 0000000000..03332e9481 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_twilight_oak_log_horizontal.json @@ -0,0 +1,256 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "name": "twilightforest:hollow_twilight_oak_log" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 2.0 + }, + "function": "minecraft:set_count" + }, + { + "enchantment": "minecraft:fortune", + "formula": "minecraft:uniform_bonus_count", + "function": "minecraft:apply_bonus", + "parameters": { + "bonusMultiplier": 1 + } + } + ], + "name": "minecraft:stick" + } + ] + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_twilight_oak_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss_and_grass" + } + } + ], + "name": "minecraft:grass" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_twilight_oak_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss_and_grass" + } + } + ], + "name": "twilightforest:moss_patch" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_twilight_oak_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss" + } + } + ], + "name": "twilightforest:moss_patch" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_twilight_oak_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "snow" + } + } + ], + "name": "minecraft:snowball" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_twilight_oak_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "vine" + } + } + ], + "name": "minecraft:vine" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:hollow_twilight_oak_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "ladder" + } + } + ], + "name": "minecraft:ladder" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:hollow_twilight_oak_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "ladder_waterlogged" + } + } + ], + "name": "minecraft:ladder" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_twilight_oak_log_vertical.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_twilight_oak_log_vertical.json new file mode 100644 index 0000000000..bf097d06df --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_twilight_oak_log_vertical.json @@ -0,0 +1,58 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "name": "twilightforest:hollow_twilight_oak_log" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 2.0 + }, + "function": "minecraft:set_count" + }, + { + "enchantment": "minecraft:fortune", + "formula": "minecraft:uniform_bonus_count", + "function": "minecraft:apply_bonus", + "parameters": { + "bonusMultiplier": 1 + } + } + ], + "name": "minecraft:stick" + } + ] + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_vangrove_log_climbable.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_vangrove_log_climbable.json new file mode 100644 index 0000000000..0b64251ce4 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_vangrove_log_climbable.json @@ -0,0 +1,256 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "name": "twilightforest:hollow_vangrove_log" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 2.0 + }, + "function": "minecraft:set_count" + }, + { + "enchantment": "minecraft:fortune", + "formula": "minecraft:uniform_bonus_count", + "function": "minecraft:apply_bonus", + "parameters": { + "bonusMultiplier": 1 + } + } + ], + "name": "minecraft:stick" + } + ] + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_vangrove_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss_and_grass" + } + } + ], + "name": "minecraft:grass" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_vangrove_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss_and_grass" + } + } + ], + "name": "twilightforest:moss_patch" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_vangrove_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss" + } + } + ], + "name": "twilightforest:moss_patch" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_vangrove_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "snow" + } + } + ], + "name": "minecraft:snowball" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_vangrove_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "vine" + } + } + ], + "name": "minecraft:vine" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:hollow_vangrove_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "ladder" + } + } + ], + "name": "minecraft:ladder" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:hollow_vangrove_log_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "ladder_waterlogged" + } + } + ], + "name": "minecraft:ladder" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_vangrove_log_horizontal.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_vangrove_log_horizontal.json new file mode 100644 index 0000000000..bb55375a76 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_vangrove_log_horizontal.json @@ -0,0 +1,256 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "name": "twilightforest:hollow_vangrove_log" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 2.0 + }, + "function": "minecraft:set_count" + }, + { + "enchantment": "minecraft:fortune", + "formula": "minecraft:uniform_bonus_count", + "function": "minecraft:apply_bonus", + "parameters": { + "bonusMultiplier": 1 + } + } + ], + "name": "minecraft:stick" + } + ] + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_vangrove_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss_and_grass" + } + } + ], + "name": "minecraft:grass" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_vangrove_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss_and_grass" + } + } + ], + "name": "twilightforest:moss_patch" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_vangrove_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss" + } + } + ], + "name": "twilightforest:moss_patch" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_vangrove_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "snow" + } + } + ], + "name": "minecraft:snowball" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_vangrove_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "vine" + } + } + ], + "name": "minecraft:vine" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:hollow_vangrove_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "ladder" + } + } + ], + "name": "minecraft:ladder" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:hollow_vangrove_log_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "ladder_waterlogged" + } + } + ], + "name": "minecraft:ladder" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_vangrove_log_vertical.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_vangrove_log_vertical.json new file mode 100644 index 0000000000..60d0fe8f5f --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_vangrove_log_vertical.json @@ -0,0 +1,58 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "name": "twilightforest:hollow_vangrove_log" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 2.0 + }, + "function": "minecraft:set_count" + }, + { + "enchantment": "minecraft:fortune", + "formula": "minecraft:uniform_bonus_count", + "function": "minecraft:apply_bonus", + "parameters": { + "bonusMultiplier": 1 + } + } + ], + "name": "minecraft:stick" + } + ] + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_warped_stem_climbable.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_warped_stem_climbable.json new file mode 100644 index 0000000000..ddb1b76e30 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_warped_stem_climbable.json @@ -0,0 +1,256 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "name": "twilightforest:hollow_warped_stem" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 2.0 + }, + "function": "minecraft:set_count" + }, + { + "enchantment": "minecraft:fortune", + "formula": "minecraft:uniform_bonus_count", + "function": "minecraft:apply_bonus", + "parameters": { + "bonusMultiplier": 1 + } + } + ], + "name": "minecraft:stick" + } + ] + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_warped_stem_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss_and_grass" + } + } + ], + "name": "minecraft:grass" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_warped_stem_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss_and_grass" + } + } + ], + "name": "twilightforest:moss_patch" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_warped_stem_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss" + } + } + ], + "name": "twilightforest:moss_patch" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_warped_stem_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "snow" + } + } + ], + "name": "minecraft:snowball" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_warped_stem_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "vine" + } + } + ], + "name": "minecraft:vine" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:hollow_warped_stem_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "ladder" + } + } + ], + "name": "minecraft:ladder" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:hollow_warped_stem_climbable", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "ladder_waterlogged" + } + } + ], + "name": "minecraft:ladder" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_warped_stem_horizontal.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_warped_stem_horizontal.json new file mode 100644 index 0000000000..78afd2ae08 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_warped_stem_horizontal.json @@ -0,0 +1,256 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "name": "twilightforest:hollow_warped_stem" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 2.0 + }, + "function": "minecraft:set_count" + }, + { + "enchantment": "minecraft:fortune", + "formula": "minecraft:uniform_bonus_count", + "function": "minecraft:apply_bonus", + "parameters": { + "bonusMultiplier": 1 + } + } + ], + "name": "minecraft:stick" + } + ] + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_warped_stem_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss_and_grass" + } + } + ], + "name": "minecraft:grass" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_warped_stem_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss_and_grass" + } + } + ], + "name": "twilightforest:moss_patch" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_warped_stem_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "moss" + } + } + ], + "name": "twilightforest:moss_patch" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_warped_stem_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "snow" + } + } + ], + "name": "minecraft:snowball" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + }, + { + "block": "twilightforest:hollow_warped_stem_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "vine" + } + } + ], + "name": "minecraft:vine" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:hollow_warped_stem_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "ladder" + } + } + ], + "name": "minecraft:ladder" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:hollow_warped_stem_horizontal", + "condition": "minecraft:block_state_property", + "properties": { + "variant": "ladder_waterlogged" + } + } + ], + "name": "minecraft:ladder" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_warped_stem_vertical.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_warped_stem_vertical.json new file mode 100644 index 0000000000..706a4787c0 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/hollow_warped_stem_vertical.json @@ -0,0 +1,58 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "name": "twilightforest:hollow_warped_stem" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 2.0 + }, + "function": "minecraft:set_count" + }, + { + "enchantment": "minecraft:fortune", + "formula": "minecraft:uniform_bonus_count", + "function": "minecraft:apply_bonus", + "parameters": { + "bonusMultiplier": 1 + } + } + ], + "name": "minecraft:stick" + } + ] + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/huge_lily_pad.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/huge_lily_pad.json new file mode 100644 index 0000000000..058b8a0f7b --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/huge_lily_pad.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:huge_lily_pad" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/huge_mushgloom.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/huge_mushgloom.json new file mode 100644 index 0000000000..636d4799d2 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/huge_mushgloom.json @@ -0,0 +1,59 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "name": "twilightforest:huge_mushgloom" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 2.0, + "min": -6.0 + }, + "function": "minecraft:set_count" + }, + { + "function": "minecraft:limit_count", + "limit": { + "min": 0.0 + } + }, + { + "function": "minecraft:explosion_decay" + } + ], + "name": "twilightforest:mushgloom" + } + ] + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/huge_mushgloom_stem.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/huge_mushgloom_stem.json new file mode 100644 index 0000000000..0214b4a14b --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/huge_mushgloom_stem.json @@ -0,0 +1,59 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "name": "twilightforest:huge_mushgloom_stem" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 2.0, + "min": -6.0 + }, + "function": "minecraft:set_count" + }, + { + "function": "minecraft:limit_count", + "limit": { + "min": 0.0 + } + }, + { + "function": "minecraft:explosion_decay" + } + ], + "name": "twilightforest:mushgloom" + } + ] + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/huge_stalk.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/huge_stalk.json new file mode 100644 index 0000000000..7c25043350 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/huge_stalk.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:huge_stalk" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/huge_water_lily.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/huge_water_lily.json new file mode 100644 index 0000000000..084eb02941 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/huge_water_lily.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:huge_water_lily" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/hydra_trophy.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/hydra_trophy.json new file mode 100644 index 0000000000..9278e30055 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/hydra_trophy.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:hydra_trophy" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/hydra_wall_trophy.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/hydra_wall_trophy.json new file mode 100644 index 0000000000..9278e30055 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/hydra_wall_trophy.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:hydra_trophy" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/infested_towerwood.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/infested_towerwood.json new file mode 100644 index 0000000000..68701f9f6e --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/infested_towerwood.json @@ -0,0 +1,3 @@ +{ + "type": "minecraft:block" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/iron_ladder.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/iron_ladder.json new file mode 100644 index 0000000000..e4b812014c --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/iron_ladder.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:iron_ladder" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/ironwood_block.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/ironwood_block.json new file mode 100644 index 0000000000..a4b611ad55 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/ironwood_block.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:ironwood_block" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/jungle_banister.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/jungle_banister.json new file mode 100644 index 0000000000..c5c562f2c3 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/jungle_banister.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:jungle_banister" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/keepsake_casket.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/keepsake_casket.json new file mode 100644 index 0000000000..c08eeab33a --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/keepsake_casket.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [], + "functions": [ + { + "block": "twilightforest:keepsake_casket", + "function": "minecraft:copy_state", + "properties": [ + "damage" + ] + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/knight_phantom_trophy.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/knight_phantom_trophy.json new file mode 100644 index 0000000000..38d939dfa8 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/knight_phantom_trophy.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:knight_phantom_trophy" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/knight_phantom_wall_trophy.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/knight_phantom_wall_trophy.json new file mode 100644 index 0000000000..38d939dfa8 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/knight_phantom_wall_trophy.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:knight_phantom_trophy" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/knightmetal_block.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/knightmetal_block.json new file mode 100644 index 0000000000..6c5f14027b --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/knightmetal_block.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:knightmetal_block" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/lich_tower_miniature_structure.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/lich_tower_miniature_structure.json new file mode 100644 index 0000000000..ec0a9e7806 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/lich_tower_miniature_structure.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:lich_tower_miniature_structure" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/lich_trophy.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/lich_trophy.json new file mode 100644 index 0000000000..61932572bb --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/lich_trophy.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:lich_trophy" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/lich_wall_trophy.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/lich_wall_trophy.json new file mode 100644 index 0000000000..61932572bb --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/lich_wall_trophy.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:lich_trophy" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/liveroot_block.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/liveroot_block.json new file mode 100644 index 0000000000..222c0dc206 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/liveroot_block.json @@ -0,0 +1,51 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "name": "twilightforest:liveroot_block" + }, + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "functions": [ + { + "enchantment": "minecraft:fortune", + "formula": "minecraft:ore_drops", + "function": "minecraft:apply_bonus" + } + ], + "name": "twilightforest:liveroot" + } + ] + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/locked_vanishing_block.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/locked_vanishing_block.json new file mode 100644 index 0000000000..0f052e61ff --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/locked_vanishing_block.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:locked_vanishing_block" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/mangrove_banister.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/mangrove_banister.json new file mode 100644 index 0000000000..9039736fab --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/mangrove_banister.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:mangrove_banister" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/mangrove_button.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/mangrove_button.json new file mode 100644 index 0000000000..d39c857014 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/mangrove_button.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:mangrove_button" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/mangrove_chest.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/mangrove_chest.json new file mode 100644 index 0000000000..716fe977c4 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/mangrove_chest.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:mangrove_chest" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/mangrove_door.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/mangrove_door.json new file mode 100644 index 0000000000..6158906385 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/mangrove_door.json @@ -0,0 +1,29 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:mangrove_door", + "condition": "minecraft:block_state_property", + "properties": { + "half": "lower" + } + } + ], + "name": "twilightforest:mangrove_door" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/mangrove_fence.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/mangrove_fence.json new file mode 100644 index 0000000000..995c71d6eb --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/mangrove_fence.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:mangrove_fence" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/mangrove_fence_gate.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/mangrove_fence_gate.json new file mode 100644 index 0000000000..b3a4638cdd --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/mangrove_fence_gate.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:mangrove_fence_gate" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/mangrove_leaves.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/mangrove_leaves.json new file mode 100644 index 0000000000..d8f5773544 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/mangrove_leaves.json @@ -0,0 +1,131 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:alternative", + "terms": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "tag": "forge:shears" + } + }, + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ] + } + ], + "name": "twilightforest:mangrove_leaves" + }, + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:survives_explosion" + }, + { + "chances": [ + 0.05, + 0.0625, + 0.083333336, + 0.1 + ], + "condition": "minecraft:table_bonus", + "enchantment": "minecraft:fortune" + } + ], + "name": "twilightforest:mangrove_sapling" + } + ] + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:inverted", + "term": { + "condition": "minecraft:alternative", + "terms": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "tag": "forge:shears" + } + }, + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ] + } + } + ], + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "chances": [ + 0.02, + 0.022222223, + 0.025, + 0.033333335, + 0.1 + ], + "condition": "minecraft:table_bonus", + "enchantment": "minecraft:fortune" + } + ], + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 2.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + }, + { + "function": "minecraft:explosion_decay" + } + ], + "name": "minecraft:stick" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/mangrove_log.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/mangrove_log.json new file mode 100644 index 0000000000..e83c729284 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/mangrove_log.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:mangrove_log" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/mangrove_planks.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/mangrove_planks.json new file mode 100644 index 0000000000..2fdd691c7d --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/mangrove_planks.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:mangrove_planks" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/mangrove_pressure_plate.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/mangrove_pressure_plate.json new file mode 100644 index 0000000000..c4f3152f38 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/mangrove_pressure_plate.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:mangrove_pressure_plate" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/mangrove_root.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/mangrove_root.json new file mode 100644 index 0000000000..52396ed66b --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/mangrove_root.json @@ -0,0 +1,53 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "name": "twilightforest:mangrove_root" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 5.0, + "min": 3.0 + }, + "function": "minecraft:set_count" + }, + { + "function": "minecraft:explosion_decay" + } + ], + "name": "minecraft:stick" + } + ] + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/mangrove_sapling.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/mangrove_sapling.json new file mode 100644 index 0000000000..fbd4537a14 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/mangrove_sapling.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:mangrove_sapling" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/mangrove_sign.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/mangrove_sign.json new file mode 100644 index 0000000000..cb22b2e76f --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/mangrove_sign.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:mangrove_sign" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/mangrove_slab.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/mangrove_slab.json new file mode 100644 index 0000000000..d1795a5c17 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/mangrove_slab.json @@ -0,0 +1,34 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "conditions": [ + { + "block": "twilightforest:mangrove_slab", + "condition": "minecraft:block_state_property", + "properties": { + "type": "double" + } + } + ], + "count": 2.0, + "function": "minecraft:set_count" + }, + { + "function": "minecraft:explosion_decay" + } + ], + "name": "twilightforest:mangrove_slab" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/mangrove_stairs.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/mangrove_stairs.json new file mode 100644 index 0000000000..cf3d83d929 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/mangrove_stairs.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:mangrove_stairs" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/mangrove_trapdoor.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/mangrove_trapdoor.json new file mode 100644 index 0000000000..472a87dfd4 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/mangrove_trapdoor.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:mangrove_trapdoor" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/mangrove_wall_sign.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/mangrove_wall_sign.json new file mode 100644 index 0000000000..cb22b2e76f --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/mangrove_wall_sign.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:mangrove_sign" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/mangrove_wood.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/mangrove_wood.json new file mode 100644 index 0000000000..cc3fc1ac1f --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/mangrove_wood.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:mangrove_wood" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/mayapple.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/mayapple.json new file mode 100644 index 0000000000..32d9b8de9a --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/mayapple.json @@ -0,0 +1,23 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "tag": "forge:shears" + } + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:mayapple" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/mazestone.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/mazestone.json new file mode 100644 index 0000000000..b4ce6777ce --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/mazestone.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:mazestone" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/mazestone_border.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/mazestone_border.json new file mode 100644 index 0000000000..bb08cb40cf --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/mazestone_border.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:mazestone_border" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/mazestone_brick.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/mazestone_brick.json new file mode 100644 index 0000000000..de11716c52 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/mazestone_brick.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:mazestone_brick" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/mazestone_mosaic.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/mazestone_mosaic.json new file mode 100644 index 0000000000..2f39438ab1 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/mazestone_mosaic.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:mazestone_mosaic" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/mining_banister.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/mining_banister.json new file mode 100644 index 0000000000..7a5ee038b0 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/mining_banister.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:mining_banister" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/mining_button.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/mining_button.json new file mode 100644 index 0000000000..8aac740c36 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/mining_button.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:mining_button" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/mining_chest.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/mining_chest.json new file mode 100644 index 0000000000..266677a555 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/mining_chest.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:mining_chest" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/mining_door.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/mining_door.json new file mode 100644 index 0000000000..d594f38dc4 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/mining_door.json @@ -0,0 +1,29 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:mining_door", + "condition": "minecraft:block_state_property", + "properties": { + "half": "lower" + } + } + ], + "name": "twilightforest:mining_door" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/mining_fence.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/mining_fence.json new file mode 100644 index 0000000000..92a636e15e --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/mining_fence.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:mining_fence" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/mining_fence_gate.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/mining_fence_gate.json new file mode 100644 index 0000000000..1eae15fc97 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/mining_fence_gate.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:mining_fence_gate" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/mining_leaves.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/mining_leaves.json new file mode 100644 index 0000000000..a3fd403917 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/mining_leaves.json @@ -0,0 +1,77 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:alternative", + "terms": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "tag": "forge:shears" + } + }, + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ] + } + ], + "name": "twilightforest:mining_leaves" + }, + { + "type": "minecraft:item", + "conditions": [ + { + "chances": [ + 0.02, + 0.022222223, + 0.025, + 0.033333335, + 0.1 + ], + "condition": "minecraft:table_bonus", + "enchantment": "minecraft:fortune" + } + ], + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 2.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + }, + { + "function": "minecraft:explosion_decay" + } + ], + "name": "minecraft:stick" + } + ] + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/mining_log.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/mining_log.json new file mode 100644 index 0000000000..23beefa412 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/mining_log.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:mining_log" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/mining_log_core.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/mining_log_core.json new file mode 100644 index 0000000000..23beefa412 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/mining_log_core.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:mining_log" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/mining_planks.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/mining_planks.json new file mode 100644 index 0000000000..1bbb82aabf --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/mining_planks.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:mining_planks" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/mining_pressure_plate.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/mining_pressure_plate.json new file mode 100644 index 0000000000..e9fa98ca23 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/mining_pressure_plate.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:mining_pressure_plate" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/mining_sapling.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/mining_sapling.json new file mode 100644 index 0000000000..1692d2909c --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/mining_sapling.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:mining_sapling" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/mining_sign.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/mining_sign.json new file mode 100644 index 0000000000..774b05c740 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/mining_sign.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:mining_sign" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/mining_slab.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/mining_slab.json new file mode 100644 index 0000000000..570a15e7bf --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/mining_slab.json @@ -0,0 +1,34 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "conditions": [ + { + "block": "twilightforest:mining_slab", + "condition": "minecraft:block_state_property", + "properties": { + "type": "double" + } + } + ], + "count": 2.0, + "function": "minecraft:set_count" + }, + { + "function": "minecraft:explosion_decay" + } + ], + "name": "twilightforest:mining_slab" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/mining_stairs.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/mining_stairs.json new file mode 100644 index 0000000000..4777f05f30 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/mining_stairs.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:mining_stairs" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/mining_trapdoor.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/mining_trapdoor.json new file mode 100644 index 0000000000..f2a8d8f284 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/mining_trapdoor.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:mining_trapdoor" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/mining_wall_sign.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/mining_wall_sign.json new file mode 100644 index 0000000000..774b05c740 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/mining_wall_sign.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:mining_sign" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/mining_wood.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/mining_wood.json new file mode 100644 index 0000000000..deb5484d39 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/mining_wood.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:mining_wood" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/minoshroom_trophy.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/minoshroom_trophy.json new file mode 100644 index 0000000000..4b1835e483 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/minoshroom_trophy.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:minoshroom_trophy" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/minoshroom_wall_trophy.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/minoshroom_wall_trophy.json new file mode 100644 index 0000000000..4b1835e483 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/minoshroom_wall_trophy.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:minoshroom_trophy" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/moonworm.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/moonworm.json new file mode 100644 index 0000000000..8bda58b2ab --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/moonworm.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:moonworm" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/moonworm_squish.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/moonworm_squish.json new file mode 100644 index 0000000000..69d41ed659 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/moonworm_squish.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:empty", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:lime_dye" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/moss_patch.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/moss_patch.json new file mode 100644 index 0000000000..c5145f2d4d --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/moss_patch.json @@ -0,0 +1,23 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "tag": "forge:shears" + } + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:moss_patch" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/mossy_castle_brick.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/mossy_castle_brick.json new file mode 100644 index 0000000000..08f53a93b6 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/mossy_castle_brick.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:mossy_castle_brick" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/mossy_castle_brick_stairs.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/mossy_castle_brick_stairs.json new file mode 100644 index 0000000000..a5436d8de8 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/mossy_castle_brick_stairs.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:mossy_castle_brick_stairs" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/mossy_etched_nagastone.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/mossy_etched_nagastone.json new file mode 100644 index 0000000000..3d9a951837 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/mossy_etched_nagastone.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:mossy_etched_nagastone" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/mossy_mazestone.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/mossy_mazestone.json new file mode 100644 index 0000000000..255163fe3d --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/mossy_mazestone.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:mossy_mazestone" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/mossy_nagastone_pillar.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/mossy_nagastone_pillar.json new file mode 100644 index 0000000000..48460d00ae --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/mossy_nagastone_pillar.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:mossy_nagastone_pillar" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/mossy_nagastone_stairs_left.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/mossy_nagastone_stairs_left.json new file mode 100644 index 0000000000..60b16756f1 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/mossy_nagastone_stairs_left.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:mossy_nagastone_stairs_left" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/mossy_nagastone_stairs_right.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/mossy_nagastone_stairs_right.json new file mode 100644 index 0000000000..13836d1d6b --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/mossy_nagastone_stairs_right.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:mossy_nagastone_stairs_right" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/mossy_towerwood.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/mossy_towerwood.json new file mode 100644 index 0000000000..c14c978da8 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/mossy_towerwood.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:mossy_towerwood" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/mossy_underbrick.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/mossy_underbrick.json new file mode 100644 index 0000000000..2f1690e91e --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/mossy_underbrick.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:mossy_underbrick" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/mushgloom.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/mushgloom.json new file mode 100644 index 0000000000..8538058358 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/mushgloom.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:mushgloom" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/naga_courtyard_miniature_structure.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/naga_courtyard_miniature_structure.json new file mode 100644 index 0000000000..c8a63509e6 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/naga_courtyard_miniature_structure.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:naga_courtyard_miniature_structure" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/naga_trophy.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/naga_trophy.json new file mode 100644 index 0000000000..1195a3d4ad --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/naga_trophy.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:naga_trophy" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/naga_wall_trophy.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/naga_wall_trophy.json new file mode 100644 index 0000000000..1195a3d4ad --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/naga_wall_trophy.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:naga_trophy" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/nagastone.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/nagastone.json new file mode 100644 index 0000000000..12e2b41233 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/nagastone.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:nagastone" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/nagastone_head.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/nagastone_head.json new file mode 100644 index 0000000000..dd6f19935e --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/nagastone_head.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:nagastone_head" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/nagastone_pillar.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/nagastone_pillar.json new file mode 100644 index 0000000000..6952fd9def --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/nagastone_pillar.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:nagastone_pillar" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/nagastone_stairs_left.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/nagastone_stairs_left.json new file mode 100644 index 0000000000..70c1efa14f --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/nagastone_stairs_left.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:nagastone_stairs_left" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/nagastone_stairs_right.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/nagastone_stairs_right.json new file mode 100644 index 0000000000..4386e7ca21 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/nagastone_stairs_right.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:nagastone_stairs_right" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/oak_banister.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/oak_banister.json new file mode 100644 index 0000000000..6d12109706 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/oak_banister.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:oak_banister" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/pink_castle_door.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/pink_castle_door.json new file mode 100644 index 0000000000..f7ef463270 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/pink_castle_door.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:pink_castle_door" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/pink_castle_rune_brick.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/pink_castle_rune_brick.json new file mode 100644 index 0000000000..c482a317a4 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/pink_castle_rune_brick.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:pink_castle_rune_brick" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/player_skull_candle.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/player_skull_candle.json new file mode 100644 index 0000000000..252bf7fc9d --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/player_skull_candle.json @@ -0,0 +1,33 @@ +{ + "type": "minecraft:block", + "functions": [ + { + "function": "minecraft:copy_nbt", + "ops": [ + { + "op": "replace", + "source": "SkullOwner", + "target": "SkullOwner" + } + ], + "source": "block_entity" + } + ], + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:player_head" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/player_wall_skull_candle.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/player_wall_skull_candle.json new file mode 100644 index 0000000000..252bf7fc9d --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/player_wall_skull_candle.json @@ -0,0 +1,33 @@ +{ + "type": "minecraft:block", + "functions": [ + { + "function": "minecraft:copy_nbt", + "ops": [ + { + "op": "replace", + "source": "SkullOwner", + "target": "SkullOwner" + } + ], + "source": "block_entity" + } + ], + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:player_head" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/potted_canopy_sapling.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/potted_canopy_sapling.json new file mode 100644 index 0000000000..72986bc708 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/potted_canopy_sapling.json @@ -0,0 +1,35 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:flower_pot" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:canopy_sapling" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/potted_darkwood_sapling.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/potted_darkwood_sapling.json new file mode 100644 index 0000000000..03232c29e1 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/potted_darkwood_sapling.json @@ -0,0 +1,35 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:flower_pot" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:darkwood_sapling" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/potted_dead_thorn.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/potted_dead_thorn.json new file mode 100644 index 0000000000..ff70daa7c4 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/potted_dead_thorn.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:flower_pot" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/potted_fiddlehead.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/potted_fiddlehead.json new file mode 100644 index 0000000000..ff89c59cdd --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/potted_fiddlehead.json @@ -0,0 +1,35 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:flower_pot" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:fiddlehead" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/potted_green_thorn.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/potted_green_thorn.json new file mode 100644 index 0000000000..ff70daa7c4 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/potted_green_thorn.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:flower_pot" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/potted_hollow_oak_sapling.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/potted_hollow_oak_sapling.json new file mode 100644 index 0000000000..c9ffba6e2a --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/potted_hollow_oak_sapling.json @@ -0,0 +1,35 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:flower_pot" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:hollow_oak_sapling" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/potted_mangrove_sapling.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/potted_mangrove_sapling.json new file mode 100644 index 0000000000..3fe844d4f6 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/potted_mangrove_sapling.json @@ -0,0 +1,35 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:flower_pot" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:mangrove_sapling" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/potted_mayapple.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/potted_mayapple.json new file mode 100644 index 0000000000..5c316fe287 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/potted_mayapple.json @@ -0,0 +1,35 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:flower_pot" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:mayapple" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/potted_mining_sapling.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/potted_mining_sapling.json new file mode 100644 index 0000000000..4687b7e269 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/potted_mining_sapling.json @@ -0,0 +1,35 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:flower_pot" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:mining_sapling" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/potted_mushgloom.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/potted_mushgloom.json new file mode 100644 index 0000000000..d3fc548359 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/potted_mushgloom.json @@ -0,0 +1,35 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:flower_pot" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:mushgloom" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/potted_rainbow_oak_sapling.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/potted_rainbow_oak_sapling.json new file mode 100644 index 0000000000..882a76bf42 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/potted_rainbow_oak_sapling.json @@ -0,0 +1,35 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:flower_pot" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:rainbow_oak_sapling" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/potted_sorting_sapling.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/potted_sorting_sapling.json new file mode 100644 index 0000000000..36b4dc2fa6 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/potted_sorting_sapling.json @@ -0,0 +1,35 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:flower_pot" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:sorting_sapling" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/potted_thorn.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/potted_thorn.json new file mode 100644 index 0000000000..ff70daa7c4 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/potted_thorn.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:flower_pot" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/potted_time_sapling.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/potted_time_sapling.json new file mode 100644 index 0000000000..3fd95d27cd --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/potted_time_sapling.json @@ -0,0 +1,35 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:flower_pot" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:time_sapling" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/potted_transformation_sapling.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/potted_transformation_sapling.json new file mode 100644 index 0000000000..f722f28ea3 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/potted_transformation_sapling.json @@ -0,0 +1,35 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:flower_pot" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:transformation_sapling" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/potted_twilight_oak_sapling.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/potted_twilight_oak_sapling.json new file mode 100644 index 0000000000..f8bbaf9a29 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/potted_twilight_oak_sapling.json @@ -0,0 +1,35 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:flower_pot" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:twilight_oak_sapling" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/quest_ram_trophy.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/quest_ram_trophy.json new file mode 100644 index 0000000000..90b6944d7b --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/quest_ram_trophy.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:quest_ram_trophy" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/quest_ram_wall_trophy.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/quest_ram_wall_trophy.json new file mode 100644 index 0000000000..90b6944d7b --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/quest_ram_wall_trophy.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:quest_ram_trophy" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/rainbow_oak_leaves.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/rainbow_oak_leaves.json new file mode 100644 index 0000000000..c9d681c36d --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/rainbow_oak_leaves.json @@ -0,0 +1,132 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:alternative", + "terms": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "tag": "forge:shears" + } + }, + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ] + } + ], + "name": "twilightforest:rainbow_oak_leaves" + }, + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:survives_explosion" + }, + { + "chances": [ + 0.025, + 0.027777778, + 0.03125, + 0.041666668, + 0.1 + ], + "condition": "minecraft:table_bonus", + "enchantment": "minecraft:fortune" + } + ], + "name": "twilightforest:rainbow_oak_sapling" + } + ] + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:inverted", + "term": { + "condition": "minecraft:alternative", + "terms": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "tag": "forge:shears" + } + }, + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ] + } + } + ], + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "chances": [ + 0.02, + 0.022222223, + 0.025, + 0.033333335, + 0.1 + ], + "condition": "minecraft:table_bonus", + "enchantment": "minecraft:fortune" + } + ], + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 2.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + }, + { + "function": "minecraft:explosion_decay" + } + ], + "name": "minecraft:stick" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/rainbow_oak_sapling.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/rainbow_oak_sapling.json new file mode 100644 index 0000000000..9e7f704853 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/rainbow_oak_sapling.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:rainbow_oak_sapling" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/reappearing_block.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/reappearing_block.json new file mode 100644 index 0000000000..e1a791ce74 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/reappearing_block.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:reappearing_block" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/red_thread.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/red_thread.json new file mode 100644 index 0000000000..a394cc57e3 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/red_thread.json @@ -0,0 +1,109 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": true, + "conditions": [ + { + "block": "twilightforest:red_thread", + "condition": "minecraft:block_state_property", + "properties": { + "east": "true" + } + } + ], + "count": 1.0, + "function": "minecraft:set_count" + }, + { + "add": true, + "conditions": [ + { + "block": "twilightforest:red_thread", + "condition": "minecraft:block_state_property", + "properties": { + "west": "true" + } + } + ], + "count": 1.0, + "function": "minecraft:set_count" + }, + { + "add": true, + "conditions": [ + { + "block": "twilightforest:red_thread", + "condition": "minecraft:block_state_property", + "properties": { + "north": "true" + } + } + ], + "count": 1.0, + "function": "minecraft:set_count" + }, + { + "add": true, + "conditions": [ + { + "block": "twilightforest:red_thread", + "condition": "minecraft:block_state_property", + "properties": { + "south": "true" + } + } + ], + "count": 1.0, + "function": "minecraft:set_count" + }, + { + "add": true, + "conditions": [ + { + "block": "twilightforest:red_thread", + "condition": "minecraft:block_state_property", + "properties": { + "up": "true" + } + } + ], + "count": 1.0, + "function": "minecraft:set_count" + }, + { + "add": true, + "conditions": [ + { + "block": "twilightforest:red_thread", + "condition": "minecraft:block_state_property", + "properties": { + "down": "true" + } + } + ], + "count": 1.0, + "function": "minecraft:set_count" + }, + { + "add": true, + "count": -1.0, + "function": "minecraft:set_count" + }, + { + "function": "minecraft:explosion_decay" + } + ], + "name": "twilightforest:red_thread" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/root.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/root.json new file mode 100644 index 0000000000..c6af4e7620 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/root.json @@ -0,0 +1,53 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "name": "twilightforest:root" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 5.0, + "min": 3.0 + }, + "function": "minecraft:set_count" + }, + { + "function": "minecraft:explosion_decay" + } + ], + "name": "minecraft:stick" + } + ] + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/root_strand.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/root_strand.json new file mode 100644 index 0000000000..25b8c5577e --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/root_strand.json @@ -0,0 +1,46 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "tag": "forge:shears" + } + } + ], + "name": "twilightforest:root_strand" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 3.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + }, + { + "function": "minecraft:explosion_decay" + } + ], + "name": "minecraft:stick" + } + ] + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/skeleton_skull_candle.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/skeleton_skull_candle.json new file mode 100644 index 0000000000..da719a3248 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/skeleton_skull_candle.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:skeleton_skull" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/skeleton_wall_skull_candle.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/skeleton_wall_skull_candle.json new file mode 100644 index 0000000000..da719a3248 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/skeleton_wall_skull_candle.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:skeleton_skull" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/slider.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/slider.json new file mode 100644 index 0000000000..68701f9f6e --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/slider.json @@ -0,0 +1,3 @@ +{ + "type": "minecraft:block" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/smoker.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/smoker.json new file mode 100644 index 0000000000..3a7fb4fc39 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/smoker.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:smoker" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/snow_queen_trophy.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/snow_queen_trophy.json new file mode 100644 index 0000000000..b4fbfbfe62 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/snow_queen_trophy.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:snow_queen_trophy" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/snow_queen_wall_trophy.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/snow_queen_wall_trophy.json new file mode 100644 index 0000000000..b4fbfbfe62 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/snow_queen_wall_trophy.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:snow_queen_trophy" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/sorting_banister.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/sorting_banister.json new file mode 100644 index 0000000000..6489ea11a2 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/sorting_banister.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:sorting_banister" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/sorting_button.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/sorting_button.json new file mode 100644 index 0000000000..af89018049 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/sorting_button.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:sorting_button" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/sorting_chest.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/sorting_chest.json new file mode 100644 index 0000000000..d57faa00f9 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/sorting_chest.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:sorting_chest" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/sorting_door.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/sorting_door.json new file mode 100644 index 0000000000..123dce9d21 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/sorting_door.json @@ -0,0 +1,29 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:sorting_door", + "condition": "minecraft:block_state_property", + "properties": { + "half": "lower" + } + } + ], + "name": "twilightforest:sorting_door" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/sorting_fence.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/sorting_fence.json new file mode 100644 index 0000000000..24f27beca3 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/sorting_fence.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:sorting_fence" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/sorting_fence_gate.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/sorting_fence_gate.json new file mode 100644 index 0000000000..cbd90a7769 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/sorting_fence_gate.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:sorting_fence_gate" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/sorting_leaves.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/sorting_leaves.json new file mode 100644 index 0000000000..a170a9ff8b --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/sorting_leaves.json @@ -0,0 +1,77 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:alternative", + "terms": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "tag": "forge:shears" + } + }, + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ] + } + ], + "name": "twilightforest:sorting_leaves" + }, + { + "type": "minecraft:item", + "conditions": [ + { + "chances": [ + 0.02, + 0.022222223, + 0.025, + 0.033333335, + 0.1 + ], + "condition": "minecraft:table_bonus", + "enchantment": "minecraft:fortune" + } + ], + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 2.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + }, + { + "function": "minecraft:explosion_decay" + } + ], + "name": "minecraft:stick" + } + ] + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/sorting_log.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/sorting_log.json new file mode 100644 index 0000000000..b5300b29e9 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/sorting_log.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:sorting_log" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/sorting_log_core.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/sorting_log_core.json new file mode 100644 index 0000000000..b5300b29e9 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/sorting_log_core.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:sorting_log" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/sorting_planks.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/sorting_planks.json new file mode 100644 index 0000000000..1fc372c993 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/sorting_planks.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:sorting_planks" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/sorting_pressure_plate.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/sorting_pressure_plate.json new file mode 100644 index 0000000000..8209dde94b --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/sorting_pressure_plate.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:sorting_pressure_plate" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/sorting_sapling.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/sorting_sapling.json new file mode 100644 index 0000000000..8b02ca4de3 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/sorting_sapling.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:sorting_sapling" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/sorting_sign.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/sorting_sign.json new file mode 100644 index 0000000000..cc13c408b2 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/sorting_sign.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:sorting_sign" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/sorting_slab.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/sorting_slab.json new file mode 100644 index 0000000000..72dd5b9dcc --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/sorting_slab.json @@ -0,0 +1,34 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "conditions": [ + { + "block": "twilightforest:sorting_slab", + "condition": "minecraft:block_state_property", + "properties": { + "type": "double" + } + } + ], + "count": 2.0, + "function": "minecraft:set_count" + }, + { + "function": "minecraft:explosion_decay" + } + ], + "name": "twilightforest:sorting_slab" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/sorting_stairs.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/sorting_stairs.json new file mode 100644 index 0000000000..a2b69acf5d --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/sorting_stairs.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:sorting_stairs" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/sorting_trapdoor.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/sorting_trapdoor.json new file mode 100644 index 0000000000..81ff662d95 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/sorting_trapdoor.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:sorting_trapdoor" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/sorting_wall_sign.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/sorting_wall_sign.json new file mode 100644 index 0000000000..cc13c408b2 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/sorting_wall_sign.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:sorting_sign" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/sorting_wood.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/sorting_wood.json new file mode 100644 index 0000000000..2042e85b63 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/sorting_wood.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:sorting_wood" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/spiral_bricks.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/spiral_bricks.json new file mode 100644 index 0000000000..9affeaea6a --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/spiral_bricks.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:spiral_bricks" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/spruce_banister.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/spruce_banister.json new file mode 100644 index 0000000000..925b111448 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/spruce_banister.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:spruce_banister" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/steeleaf_block.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/steeleaf_block.json new file mode 100644 index 0000000000..17767f5371 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/steeleaf_block.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:steeleaf_block" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/stripped_canopy_log.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/stripped_canopy_log.json new file mode 100644 index 0000000000..4b44507ca4 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/stripped_canopy_log.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:stripped_canopy_log" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/stripped_canopy_wood.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/stripped_canopy_wood.json new file mode 100644 index 0000000000..5d6204e6d9 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/stripped_canopy_wood.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:stripped_canopy_wood" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/stripped_dark_log.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/stripped_dark_log.json new file mode 100644 index 0000000000..c070d6c982 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/stripped_dark_log.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:stripped_dark_log" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/stripped_dark_wood.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/stripped_dark_wood.json new file mode 100644 index 0000000000..11819514b3 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/stripped_dark_wood.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:stripped_dark_wood" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/stripped_mangrove_log.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/stripped_mangrove_log.json new file mode 100644 index 0000000000..9793014920 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/stripped_mangrove_log.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:stripped_mangrove_log" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/stripped_mangrove_wood.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/stripped_mangrove_wood.json new file mode 100644 index 0000000000..2b197b0dfd --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/stripped_mangrove_wood.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:stripped_mangrove_wood" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/stripped_mining_log.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/stripped_mining_log.json new file mode 100644 index 0000000000..7ed487d893 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/stripped_mining_log.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:stripped_mining_log" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/stripped_mining_wood.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/stripped_mining_wood.json new file mode 100644 index 0000000000..424a0f7c6b --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/stripped_mining_wood.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:stripped_mining_wood" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/stripped_sorting_log.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/stripped_sorting_log.json new file mode 100644 index 0000000000..41a1d80eee --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/stripped_sorting_log.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:stripped_sorting_log" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/stripped_sorting_wood.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/stripped_sorting_wood.json new file mode 100644 index 0000000000..28b8f8c244 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/stripped_sorting_wood.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:stripped_sorting_wood" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/stripped_time_log.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/stripped_time_log.json new file mode 100644 index 0000000000..72c6d73dd4 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/stripped_time_log.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:stripped_time_log" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/stripped_time_wood.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/stripped_time_wood.json new file mode 100644 index 0000000000..1ec27f29bf --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/stripped_time_wood.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:stripped_time_wood" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/stripped_transformation_log.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/stripped_transformation_log.json new file mode 100644 index 0000000000..8f9b5f5270 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/stripped_transformation_log.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:stripped_transformation_log" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/stripped_transformation_wood.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/stripped_transformation_wood.json new file mode 100644 index 0000000000..fb27b62905 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/stripped_transformation_wood.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:stripped_transformation_wood" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/stripped_twilight_oak_log.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/stripped_twilight_oak_log.json new file mode 100644 index 0000000000..b55d121c6b --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/stripped_twilight_oak_log.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:stripped_twilight_oak_log" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/stripped_twilight_oak_wood.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/stripped_twilight_oak_wood.json new file mode 100644 index 0000000000..7f1eeb4c45 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/stripped_twilight_oak_wood.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:stripped_twilight_oak_wood" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/thick_castle_brick.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/thick_castle_brick.json new file mode 100644 index 0000000000..695303cf1e --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/thick_castle_brick.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:thick_castle_brick" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/thorn_leaves.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/thorn_leaves.json new file mode 100644 index 0000000000..d381c3343f --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/thorn_leaves.json @@ -0,0 +1,132 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:alternative", + "terms": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "tag": "forge:shears" + } + }, + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ] + } + ], + "name": "twilightforest:thorn_leaves" + }, + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:survives_explosion" + }, + { + "chances": [ + 0.025, + 0.027777778, + 0.03125, + 0.041666668, + 0.1 + ], + "condition": "minecraft:table_bonus", + "enchantment": "minecraft:fortune" + } + ], + "name": "minecraft:stick" + } + ] + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:inverted", + "term": { + "condition": "minecraft:alternative", + "terms": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "tag": "forge:shears" + } + }, + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ] + } + } + ], + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "chances": [ + 0.02, + 0.022222223, + 0.025, + 0.033333335, + 0.1 + ], + "condition": "minecraft:table_bonus", + "enchantment": "minecraft:fortune" + } + ], + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 2.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + }, + { + "function": "minecraft:explosion_decay" + } + ], + "name": "minecraft:stick" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/thorn_rose.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/thorn_rose.json new file mode 100644 index 0000000000..394de7d48b --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/thorn_rose.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:thorn_rose" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/time_banister.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/time_banister.json new file mode 100644 index 0000000000..a041792fc7 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/time_banister.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:time_banister" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/time_button.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/time_button.json new file mode 100644 index 0000000000..317945ed38 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/time_button.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:time_button" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/time_chest.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/time_chest.json new file mode 100644 index 0000000000..91a0804660 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/time_chest.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:time_chest" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/time_door.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/time_door.json new file mode 100644 index 0000000000..b2e41ab296 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/time_door.json @@ -0,0 +1,29 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:time_door", + "condition": "minecraft:block_state_property", + "properties": { + "half": "lower" + } + } + ], + "name": "twilightforest:time_door" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/time_fence.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/time_fence.json new file mode 100644 index 0000000000..8319c39603 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/time_fence.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:time_fence" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/time_fence_gate.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/time_fence_gate.json new file mode 100644 index 0000000000..3ae2083edf --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/time_fence_gate.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:time_fence_gate" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/time_leaves.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/time_leaves.json new file mode 100644 index 0000000000..7dd02e0a0c --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/time_leaves.json @@ -0,0 +1,77 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:alternative", + "terms": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "tag": "forge:shears" + } + }, + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ] + } + ], + "name": "twilightforest:time_leaves" + }, + { + "type": "minecraft:item", + "conditions": [ + { + "chances": [ + 0.02, + 0.022222223, + 0.025, + 0.033333335, + 0.1 + ], + "condition": "minecraft:table_bonus", + "enchantment": "minecraft:fortune" + } + ], + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 2.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + }, + { + "function": "minecraft:explosion_decay" + } + ], + "name": "minecraft:stick" + } + ] + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/time_log.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/time_log.json new file mode 100644 index 0000000000..75f2141c0c --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/time_log.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:time_log" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/time_log_core.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/time_log_core.json new file mode 100644 index 0000000000..75f2141c0c --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/time_log_core.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:time_log" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/time_planks.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/time_planks.json new file mode 100644 index 0000000000..98ffcfe572 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/time_planks.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:time_planks" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/time_pressure_plate.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/time_pressure_plate.json new file mode 100644 index 0000000000..8ebfb0f244 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/time_pressure_plate.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:time_pressure_plate" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/time_sapling.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/time_sapling.json new file mode 100644 index 0000000000..f385de8e63 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/time_sapling.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:time_sapling" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/time_sign.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/time_sign.json new file mode 100644 index 0000000000..78fe806b77 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/time_sign.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:time_sign" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/time_slab.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/time_slab.json new file mode 100644 index 0000000000..4bdc53b1c2 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/time_slab.json @@ -0,0 +1,34 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "conditions": [ + { + "block": "twilightforest:time_slab", + "condition": "minecraft:block_state_property", + "properties": { + "type": "double" + } + } + ], + "count": 2.0, + "function": "minecraft:set_count" + }, + { + "function": "minecraft:explosion_decay" + } + ], + "name": "twilightforest:time_slab" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/time_stairs.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/time_stairs.json new file mode 100644 index 0000000000..451523b001 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/time_stairs.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:time_stairs" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/time_trapdoor.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/time_trapdoor.json new file mode 100644 index 0000000000..38183ff07e --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/time_trapdoor.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:time_trapdoor" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/time_wall_sign.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/time_wall_sign.json new file mode 100644 index 0000000000..78fe806b77 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/time_wall_sign.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:time_sign" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/time_wood.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/time_wood.json new file mode 100644 index 0000000000..f4baf5ed13 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/time_wood.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:time_wood" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/torchberry_plant.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/torchberry_plant.json new file mode 100644 index 0000000000..e79fe9eb8a --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/torchberry_plant.json @@ -0,0 +1,42 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "tag": "forge:shears" + } + } + ], + "name": "twilightforest:torchberry_plant" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:torchberry_plant", + "condition": "minecraft:block_state_property", + "properties": { + "has_torchberries": "true" + } + } + ], + "name": "twilightforest:torchberries" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/towerwood.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/towerwood.json new file mode 100644 index 0000000000..4108b3b233 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/towerwood.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:towerwood" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/transformation_banister.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/transformation_banister.json new file mode 100644 index 0000000000..48a4ecced5 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/transformation_banister.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:transformation_banister" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/transformation_button.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/transformation_button.json new file mode 100644 index 0000000000..f41d316005 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/transformation_button.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:transformation_button" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/transformation_chest.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/transformation_chest.json new file mode 100644 index 0000000000..7a90daed8a --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/transformation_chest.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:transformation_chest" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/transformation_door.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/transformation_door.json new file mode 100644 index 0000000000..b9bdb2d1a5 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/transformation_door.json @@ -0,0 +1,29 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:transformation_door", + "condition": "minecraft:block_state_property", + "properties": { + "half": "lower" + } + } + ], + "name": "twilightforest:transformation_door" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/transformation_fence.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/transformation_fence.json new file mode 100644 index 0000000000..7b75e732ba --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/transformation_fence.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:transformation_fence" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/transformation_fence_gate.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/transformation_fence_gate.json new file mode 100644 index 0000000000..f356dd448c --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/transformation_fence_gate.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:transformation_fence_gate" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/transformation_leaves.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/transformation_leaves.json new file mode 100644 index 0000000000..ae70b11ea2 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/transformation_leaves.json @@ -0,0 +1,77 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:alternative", + "terms": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "tag": "forge:shears" + } + }, + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ] + } + ], + "name": "twilightforest:transformation_leaves" + }, + { + "type": "minecraft:item", + "conditions": [ + { + "chances": [ + 0.02, + 0.022222223, + 0.025, + 0.033333335, + 0.1 + ], + "condition": "minecraft:table_bonus", + "enchantment": "minecraft:fortune" + } + ], + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 2.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + }, + { + "function": "minecraft:explosion_decay" + } + ], + "name": "minecraft:stick" + } + ] + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/transformation_log.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/transformation_log.json new file mode 100644 index 0000000000..663c715b43 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/transformation_log.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:transformation_log" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/transformation_log_core.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/transformation_log_core.json new file mode 100644 index 0000000000..663c715b43 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/transformation_log_core.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:transformation_log" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/transformation_planks.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/transformation_planks.json new file mode 100644 index 0000000000..34e78e81a1 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/transformation_planks.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:transformation_planks" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/transformation_pressure_plate.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/transformation_pressure_plate.json new file mode 100644 index 0000000000..a0d2b51e5c --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/transformation_pressure_plate.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:transformation_pressure_plate" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/transformation_sapling.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/transformation_sapling.json new file mode 100644 index 0000000000..7e0d1a96f1 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/transformation_sapling.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:transformation_sapling" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/transformation_sign.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/transformation_sign.json new file mode 100644 index 0000000000..e578c866b0 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/transformation_sign.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:transformation_sign" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/transformation_slab.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/transformation_slab.json new file mode 100644 index 0000000000..42153b6c70 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/transformation_slab.json @@ -0,0 +1,34 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "conditions": [ + { + "block": "twilightforest:transformation_slab", + "condition": "minecraft:block_state_property", + "properties": { + "type": "double" + } + } + ], + "count": 2.0, + "function": "minecraft:set_count" + }, + { + "function": "minecraft:explosion_decay" + } + ], + "name": "twilightforest:transformation_slab" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/transformation_stairs.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/transformation_stairs.json new file mode 100644 index 0000000000..8b046002a3 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/transformation_stairs.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:transformation_stairs" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/transformation_trapdoor.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/transformation_trapdoor.json new file mode 100644 index 0000000000..16a2de85fc --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/transformation_trapdoor.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:transformation_trapdoor" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/transformation_wall_sign.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/transformation_wall_sign.json new file mode 100644 index 0000000000..e578c866b0 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/transformation_wall_sign.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:transformation_sign" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/transformation_wood.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/transformation_wood.json new file mode 100644 index 0000000000..4a0b54d67e --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/transformation_wood.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:transformation_wood" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/trollber.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/trollber.json new file mode 100644 index 0000000000..5720b4d6ee --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/trollber.json @@ -0,0 +1,48 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "tag": "forge:shears" + } + } + ], + "name": "twilightforest:trollber" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 8.0, + "min": 4.0 + }, + "function": "minecraft:set_count" + }, + { + "enchantment": "minecraft:fortune", + "formula": "minecraft:ore_drops", + "function": "minecraft:apply_bonus" + } + ], + "name": "twilightforest:torchberries" + } + ] + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/trollsteinn.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/trollsteinn.json new file mode 100644 index 0000000000..bc249a4271 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/trollsteinn.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:trollsteinn" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/trollvidr.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/trollvidr.json new file mode 100644 index 0000000000..ad79b829f9 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/trollvidr.json @@ -0,0 +1,23 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "tag": "forge:shears" + } + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:trollvidr" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/trophy_pedestal.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/trophy_pedestal.json new file mode 100644 index 0000000000..87f2a606aa --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/trophy_pedestal.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:trophy_pedestal" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/twilight_oak_banister.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/twilight_oak_banister.json new file mode 100644 index 0000000000..72ab679c7c --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/twilight_oak_banister.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:twilight_oak_banister" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/twilight_oak_button.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/twilight_oak_button.json new file mode 100644 index 0000000000..b187993c9b --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/twilight_oak_button.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:twilight_oak_button" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/twilight_oak_chest.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/twilight_oak_chest.json new file mode 100644 index 0000000000..4d7e6c3b55 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/twilight_oak_chest.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:twilight_oak_chest" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/twilight_oak_door.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/twilight_oak_door.json new file mode 100644 index 0000000000..88a79a465f --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/twilight_oak_door.json @@ -0,0 +1,29 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "twilightforest:twilight_oak_door", + "condition": "minecraft:block_state_property", + "properties": { + "half": "lower" + } + } + ], + "name": "twilightforest:twilight_oak_door" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/twilight_oak_fence.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/twilight_oak_fence.json new file mode 100644 index 0000000000..6c776d1e0b --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/twilight_oak_fence.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:twilight_oak_fence" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/twilight_oak_fence_gate.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/twilight_oak_fence_gate.json new file mode 100644 index 0000000000..c65a10a9be --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/twilight_oak_fence_gate.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:twilight_oak_fence_gate" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/twilight_oak_leaves.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/twilight_oak_leaves.json new file mode 100644 index 0000000000..a8a346b231 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/twilight_oak_leaves.json @@ -0,0 +1,131 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:alternative", + "terms": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "tag": "forge:shears" + } + }, + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ] + } + ], + "name": "twilightforest:twilight_oak_leaves" + }, + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:survives_explosion" + }, + { + "chances": [ + 0.05, + 0.0625, + 0.083333336, + 0.1 + ], + "condition": "minecraft:table_bonus", + "enchantment": "minecraft:fortune" + } + ], + "name": "twilightforest:twilight_oak_sapling" + } + ] + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:inverted", + "term": { + "condition": "minecraft:alternative", + "terms": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "tag": "forge:shears" + } + }, + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ] + } + } + ], + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "chances": [ + 0.02, + 0.022222223, + 0.025, + 0.033333335, + 0.1 + ], + "condition": "minecraft:table_bonus", + "enchantment": "minecraft:fortune" + } + ], + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 2.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + }, + { + "function": "minecraft:explosion_decay" + } + ], + "name": "minecraft:stick" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/twilight_oak_log.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/twilight_oak_log.json new file mode 100644 index 0000000000..11c9a83b3f --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/twilight_oak_log.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:twilight_oak_log" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/twilight_oak_planks.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/twilight_oak_planks.json new file mode 100644 index 0000000000..8d314bd557 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/twilight_oak_planks.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:twilight_oak_planks" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/twilight_oak_pressure_plate.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/twilight_oak_pressure_plate.json new file mode 100644 index 0000000000..973f85c6e5 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/twilight_oak_pressure_plate.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:twilight_oak_pressure_plate" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/twilight_oak_sapling.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/twilight_oak_sapling.json new file mode 100644 index 0000000000..11b25efba1 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/twilight_oak_sapling.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:twilight_oak_sapling" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/twilight_oak_sign.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/twilight_oak_sign.json new file mode 100644 index 0000000000..1c089e5440 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/twilight_oak_sign.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:twilight_oak_sign" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/twilight_oak_slab.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/twilight_oak_slab.json new file mode 100644 index 0000000000..a6cff7a09c --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/twilight_oak_slab.json @@ -0,0 +1,34 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "conditions": [ + { + "block": "twilightforest:twilight_oak_slab", + "condition": "minecraft:block_state_property", + "properties": { + "type": "double" + } + } + ], + "count": 2.0, + "function": "minecraft:set_count" + }, + { + "function": "minecraft:explosion_decay" + } + ], + "name": "twilightforest:twilight_oak_slab" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/twilight_oak_stairs.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/twilight_oak_stairs.json new file mode 100644 index 0000000000..44961a7242 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/twilight_oak_stairs.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:twilight_oak_stairs" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/twilight_oak_trapdoor.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/twilight_oak_trapdoor.json new file mode 100644 index 0000000000..0d4faa9f40 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/twilight_oak_trapdoor.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:twilight_oak_trapdoor" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/twilight_oak_wood.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/twilight_oak_wood.json new file mode 100644 index 0000000000..d486f3e423 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/twilight_oak_wood.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:twilight_oak_wood" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/twilight_portal_miniature_structure.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/twilight_portal_miniature_structure.json new file mode 100644 index 0000000000..38bb960970 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/twilight_portal_miniature_structure.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:twilight_portal_miniature_structure" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/twilight_wall_sign.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/twilight_wall_sign.json new file mode 100644 index 0000000000..1c089e5440 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/twilight_wall_sign.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:twilight_oak_sign" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/twisted_stone.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/twisted_stone.json new file mode 100644 index 0000000000..ff36b03f01 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/twisted_stone.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:twisted_stone" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/twisted_stone_pillar.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/twisted_stone_pillar.json new file mode 100644 index 0000000000..c4870567f4 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/twisted_stone_pillar.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:twisted_stone_pillar" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/uberous_soil.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/uberous_soil.json new file mode 100644 index 0000000000..7b4acd39ce --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/uberous_soil.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:dirt" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/uncrafting_table.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/uncrafting_table.json new file mode 100644 index 0000000000..1c4e811ee0 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/uncrafting_table.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:uncrafting_table" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/underbrick.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/underbrick.json new file mode 100644 index 0000000000..e23227f825 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/underbrick.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:underbrick" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/underbrick_floor.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/underbrick_floor.json new file mode 100644 index 0000000000..9c97423ea6 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/underbrick_floor.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:underbrick_floor" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/unripe_trollber.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/unripe_trollber.json new file mode 100644 index 0000000000..ad1d41ed61 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/unripe_trollber.json @@ -0,0 +1,23 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "tag": "forge:shears" + } + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:unripe_trollber" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/ur_ghast_trophy.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/ur_ghast_trophy.json new file mode 100644 index 0000000000..4fb2bd8b17 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/ur_ghast_trophy.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:ur_ghast_trophy" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/ur_ghast_wall_trophy.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/ur_ghast_wall_trophy.json new file mode 100644 index 0000000000..4fb2bd8b17 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/ur_ghast_wall_trophy.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:ur_ghast_trophy" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/vangrove_banister.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/vangrove_banister.json new file mode 100644 index 0000000000..e7a9a44c96 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/vangrove_banister.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:vangrove_banister" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/vanishing_block.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/vanishing_block.json new file mode 100644 index 0000000000..5480d2890f --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/vanishing_block.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:vanishing_block" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/violet_castle_door.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/violet_castle_door.json new file mode 100644 index 0000000000..9100b9cd66 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/violet_castle_door.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:violet_castle_door" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/violet_castle_rune_brick.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/violet_castle_rune_brick.json new file mode 100644 index 0000000000..1879b1e00b --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/violet_castle_rune_brick.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:violet_castle_rune_brick" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/warped_banister.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/warped_banister.json new file mode 100644 index 0000000000..17fe452767 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/warped_banister.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:warped_banister" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/weathered_deadrock.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/weathered_deadrock.json new file mode 100644 index 0000000000..387fd8bc2a --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/weathered_deadrock.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:weathered_deadrock" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/wispy_cloud.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/wispy_cloud.json new file mode 100644 index 0000000000..0698e2e4a2 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/wispy_cloud.json @@ -0,0 +1,30 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:wispy_cloud" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/wither_skeleton_skull_candle.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/wither_skeleton_skull_candle.json new file mode 100644 index 0000000000..8b78ab5521 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/wither_skeleton_skull_candle.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:wither_skeleton_skull" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/wither_skeleton_wall_skull_candle.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/wither_skeleton_wall_skull_candle.json new file mode 100644 index 0000000000..8b78ab5521 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/wither_skeleton_wall_skull_candle.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:wither_skeleton_skull" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/worn_castle_brick.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/worn_castle_brick.json new file mode 100644 index 0000000000..3842fbf3af --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/worn_castle_brick.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:worn_castle_brick" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/worn_castle_brick_stairs.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/worn_castle_brick_stairs.json new file mode 100644 index 0000000000..0436071509 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/worn_castle_brick_stairs.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:worn_castle_brick_stairs" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/yellow_castle_door.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/yellow_castle_door.json new file mode 100644 index 0000000000..8571924e3c --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/yellow_castle_door.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:yellow_castle_door" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/yellow_castle_rune_brick.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/yellow_castle_rune_brick.json new file mode 100644 index 0000000000..0694a61b9e --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/yellow_castle_rune_brick.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:yellow_castle_rune_brick" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/zombie_skull_candle.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/zombie_skull_candle.json new file mode 100644 index 0000000000..35945da5eb --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/zombie_skull_candle.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:zombie_head" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/blocks/zombie_wall_skull_candle.json b/src/generated/resources/data/twilightforest/loot_tables/blocks/zombie_wall_skull_candle.json new file mode 100644 index 0000000000..35945da5eb --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/blocks/zombie_wall_skull_candle.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:zombie_head" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/chests/aurora_cache.json b/src/generated/resources/data/twilightforest/loot_tables/chests/aurora_cache.json new file mode 100644 index 0000000000..42f8ede22f --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/chests/aurora_cache.json @@ -0,0 +1,318 @@ +{ + "type": "minecraft:chest", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:loot_table", + "name": "twilightforest:chests/useless", + "weight": 25 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 12.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:stick", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 12.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:coal", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 12.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:arrow", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:ice", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:packed_ice", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 2.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:ironwood_ingot", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 9.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:maze_wafer", + "weight": 75 + } + ], + "rolls": 4.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:charm_of_keeping_1" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 6.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:ironwood_ingot" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 5.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:firefly" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 12.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:aurora_block" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 3.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:arctic_fur" + } + ], + "rolls": 2.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 8.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:arctic_fur", + "weight": 75 + }, + { + "type": "minecraft:item", + "name": "twilightforest:ice_bow", + "weight": 75 + }, + { + "type": "minecraft:item", + "name": "twilightforest:ender_bow", + "weight": 75 + }, + { + "type": "minecraft:item", + "name": "twilightforest:ice_sword", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "enchantments": { + "minecraft:sharpness": 4.0 + }, + "function": "minecraft:set_enchantments" + } + ], + "name": "minecraft:enchanted_book", + "weight": 25 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "enchantments": { + "minecraft:power": 4.0 + }, + "function": "minecraft:set_enchantments" + } + ], + "name": "minecraft:enchanted_book", + "weight": 25 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "enchantments": { + "minecraft:punch": 2.0 + }, + "function": "minecraft:set_enchantments" + } + ], + "name": "minecraft:enchanted_book", + "weight": 25 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "enchantments": { + "minecraft:unbreaking": 2.0 + }, + "function": "minecraft:set_enchantments" + } + ], + "name": "minecraft:enchanted_book", + "weight": 25 + }, + { + "type": "minecraft:item", + "functions": [ + { + "enchantments": [ + "twilightforest:chill_aura" + ], + "function": "minecraft:enchant_randomly" + } + ], + "name": "minecraft:book", + "weight": 25 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "enchantments": { + "minecraft:infinity": 1.0 + }, + "function": "minecraft:set_enchantments" + } + ], + "name": "minecraft:enchanted_book", + "weight": 25 + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/chests/aurora_room.json b/src/generated/resources/data/twilightforest/loot_tables/chests/aurora_room.json new file mode 100644 index 0000000000..1e5e90a704 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/chests/aurora_room.json @@ -0,0 +1,197 @@ +{ + "type": "minecraft:chest", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 12.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:maze_wafer" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:ice_bomb" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 5.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:firefly" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:ice" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:packed_ice" + } + ], + "rolls": 4.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 6.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:arctic_fur" + }, + { + "type": "minecraft:item", + "name": "twilightforest:arctic_helmet" + }, + { + "type": "minecraft:item", + "name": "twilightforest:arctic_chestplate" + }, + { + "type": "minecraft:item", + "name": "twilightforest:arctic_leggings" + }, + { + "type": "minecraft:item", + "name": "twilightforest:arctic_boots" + }, + { + "type": "minecraft:item", + "name": "twilightforest:knightmetal_chestplate" + }, + { + "type": "minecraft:item", + "name": "twilightforest:knightmetal_sword" + }, + { + "type": "minecraft:item", + "name": "twilightforest:charm_of_life_1" + } + ], + "rolls": 2.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:enchant_with_levels", + "levels": 30.0, + "treasure": false + } + ], + "name": "twilightforest:ice_bow" + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:enchant_with_levels", + "levels": 5.0, + "treasure": false + } + ], + "name": "twilightforest:ender_bow" + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:enchant_with_levels", + "levels": 25.0, + "treasure": false + } + ], + "name": "twilightforest:ice_sword" + }, + { + "type": "minecraft:item", + "functions": [ + { + "enchantments": [ + "twilightforest:chill_aura" + ], + "function": "minecraft:enchant_randomly" + } + ], + "name": "minecraft:book" + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:enchant_with_levels", + "levels": 20.0, + "treasure": false + } + ], + "name": "twilightforest:glass_sword" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/chests/basement.json b/src/generated/resources/data/twilightforest/loot_tables/chests/basement.json new file mode 100644 index 0000000000..3a0f3cbffb --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/chests/basement.json @@ -0,0 +1,387 @@ +{ + "type": "minecraft:chest", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:loot_table", + "name": "twilightforest:chests/useless", + "weight": 25 + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:set_nbt", + "tag": "{Potion:\"minecraft:water\"}" + } + ], + "name": "minecraft:potion", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 6.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:rotten_flesh", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 2.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:poisonous_potato", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 6.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:wheat", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 6.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:potato", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 6.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:carrot", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 6.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:melon_slice", + "weight": 75 + }, + { + "type": "minecraft:item", + "name": "minecraft:water_bucket", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 12.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:torch", + "weight": 75 + }, + { + "type": "minecraft:item", + "name": "minecraft:mushroom_stew", + "weight": 75 + }, + { + "type": "minecraft:item", + "name": "minecraft:milk_bucket", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 7.0, + "min": 2.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:sweet_berries", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 5.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:melon_seeds", + "weight": 75 + } + ], + "rolls": 4.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 8.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:bread" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 6.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:cooked_beef" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 8.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:cooked_porkchop" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 8.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:baked_potato" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 10.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:cooked_chicken" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 8.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:cooked_cod" + } + ], + "rolls": 2.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 12.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:glistering_melon_slice", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 12.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:apple", + "weight": 75 + }, + { + "type": "minecraft:item", + "name": "minecraft:map", + "weight": 75 + }, + { + "type": "minecraft:item", + "name": "twilightforest:charm_of_keeping_1", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 2.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:golden_apple", + "weight": 25 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 2.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:golden_carrot", + "weight": 25 + }, + { + "type": "minecraft:item", + "name": "minecraft:cake", + "weight": 25 + }, + { + "type": "minecraft:item", + "name": "minecraft:oak_boat", + "weight": 25 + }, + { + "type": "minecraft:item", + "name": "twilightforest:hollow_oak_sapling", + "weight": 25 + }, + { + "type": "minecraft:item", + "name": "twilightforest:music_disc_home", + "weight": 15 + }, + { + "type": "minecraft:item", + "name": "twilightforest:music_disc_radiance", + "weight": 15 + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/chests/darktower_boss.json b/src/generated/resources/data/twilightforest/loot_tables/chests/darktower_boss.json new file mode 100644 index 0000000000..f66d3dc9dd --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/chests/darktower_boss.json @@ -0,0 +1,57 @@ +{ + "type": "minecraft:chest", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 3.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:carminite" + } + ], + "rolls": 4.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 5.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:fiery_tears" + } + ], + "rolls": 2.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:ur_ghast_trophy" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/chests/darktower_cache.json b/src/generated/resources/data/twilightforest/loot_tables/chests/darktower_cache.json new file mode 100644 index 0000000000..fe6489d919 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/chests/darktower_cache.json @@ -0,0 +1,207 @@ +{ + "type": "minecraft:chest", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:loot_table", + "name": "twilightforest:chests/useless", + "weight": 25 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 12.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:stick", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 12.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:charcoal", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 12.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:arrow", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 9.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:experiment_115", + "weight": 75 + }, + { + "type": "minecraft:item", + "name": "minecraft:red_wool", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 6.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:redstone", + "weight": 75 + } + ], + "rolls": 4.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:redstone_lamp" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 6.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:iron_ingot" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 8.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:ironwood_ingot" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 5.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:firefly" + }, + { + "type": "minecraft:item", + "name": "twilightforest:charm_of_keeping_1" + } + ], + "rolls": 2.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 8.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:steeleaf_ingot" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 2.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:diamond" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/chests/darktower_key.json b/src/generated/resources/data/twilightforest/loot_tables/chests/darktower_key.json new file mode 100644 index 0000000000..852a7c348a --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/chests/darktower_key.json @@ -0,0 +1,240 @@ +{ + "type": "minecraft:chest", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:loot_table", + "name": "twilightforest:chests/useless", + "weight": 25 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:iron_ingot", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:gunpowder", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:ironwood_ingot", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 5.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:firefly", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 12.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:experiment_115", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 12.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:glowstone_dust", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 6.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:redstone", + "weight": 75 + } + ], + "rolls": 4.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 6.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:steeleaf_ingot" + }, + { + "type": "minecraft:item", + "name": "twilightforest:charm_of_keeping_1" + }, + { + "type": "minecraft:item", + "name": "twilightforest:steeleaf_helmet" + }, + { + "type": "minecraft:item", + "name": "twilightforest:steeleaf_chestplate" + }, + { + "type": "minecraft:item", + "name": "twilightforest:steeleaf_leggings" + }, + { + "type": "minecraft:item", + "name": "twilightforest:steeleaf_boots" + }, + { + "type": "minecraft:item", + "name": "twilightforest:steeleaf_pickaxe" + }, + { + "type": "minecraft:item", + "name": "twilightforest:ironwood_chestplate" + }, + { + "type": "minecraft:item", + "name": "twilightforest:ironwood_sword" + } + ], + "rolls": 2.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:charm_of_life_1" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "enchantments": { + "minecraft:feather_falling": 3.0 + }, + "function": "minecraft:set_enchantments" + } + ], + "name": "minecraft:enchanted_book" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "enchantments": { + "minecraft:knockback": 2.0 + }, + "function": "minecraft:set_enchantments" + } + ], + "name": "minecraft:enchanted_book" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "enchantments": { + "minecraft:efficiency": 3.0 + }, + "function": "minecraft:set_enchantments" + } + ], + "name": "minecraft:enchanted_book" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:tower_key" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/chests/fancy_well.json b/src/generated/resources/data/twilightforest/loot_tables/chests/fancy_well.json new file mode 100644 index 0000000000..b8dcbe5ce8 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/chests/fancy_well.json @@ -0,0 +1,230 @@ +{ + "type": "minecraft:chest", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 15.0, + "min": 5.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:gold_nugget" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 12.0, + "min": 6.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:iron_nugget" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 7.0, + "min": 4.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:string" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 20.0, + "min": 5.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:stick" + } + ], + "rolls": 4.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:bucket" + }, + { + "type": "minecraft:item", + "name": "minecraft:water_bucket" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 7.0, + "min": 3.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:raw_ironwood" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 5.0, + "min": 3.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:iron_ingot" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 2.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:gold_ingot" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 8.0, + "min": 4.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:copper_ingot" + } + ], + "rolls": 2.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 9.0, + "min": 5.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:experience_bottle", + "weight": 75 + }, + { + "type": "minecraft:item", + "name": "twilightforest:charm_of_life_1", + "weight": 75 + }, + { + "type": "minecraft:item", + "name": "twilightforest:music_disc_steps", + "weight": 50 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 9.0, + "min": 4.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:emerald", + "weight": 25 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 5.0, + "min": 3.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:diamond", + "weight": 25 + }, + { + "type": "minecraft:item", + "name": "twilightforest:charm_of_keeping_2", + "weight": 25 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 17.0, + "min": 5.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:transformation_powder", + "weight": 25 + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/chests/foundation_basement.json b/src/generated/resources/data/twilightforest/loot_tables/chests/foundation_basement.json new file mode 100644 index 0000000000..d5c22cdf76 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/chests/foundation_basement.json @@ -0,0 +1,260 @@ +{ + "type": "minecraft:chest", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:loot_table", + "name": "twilightforest:chests/useless", + "weight": 25 + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:set_nbt", + "tag": "{Potion:\"minecraft:water\"}" + } + ], + "name": "minecraft:potion", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 6.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:rotten_flesh", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 2.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:poisonous_potato", + "weight": 75 + }, + { + "type": "minecraft:item", + "name": "minecraft:water_bucket", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 12.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:torch", + "weight": 75 + }, + { + "type": "minecraft:item", + "name": "minecraft:milk_bucket", + "weight": 75 + } + ], + "rolls": 4.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 6.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:wheat" + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:set_nbt", + "tag": "{Potion:\"minecraft:awkward\"}" + } + ], + "name": "minecraft:potion" + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:set_nbt", + "tag": "{Potion:\"minecraft:mundane\"}" + } + ], + "name": "minecraft:potion" + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:set_nbt", + "tag": "{Potion:\"minecraft:thick\"}" + } + ], + "name": "minecraft:potion" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 6.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:rotten_flesh" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 5.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:melon_seeds" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 5.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:pumpkin_seeds" + } + ], + "rolls": 2.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 12.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:glistering_melon_slice", + "weight": 75 + }, + { + "type": "minecraft:item", + "name": "minecraft:map", + "weight": 75 + }, + { + "type": "minecraft:item", + "name": "twilightforest:charm_of_keeping_1", + "weight": 75 + }, + { + "type": "minecraft:item", + "name": "twilightforest:music_disc_thread", + "weight": 50 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 2.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:golden_apple", + "weight": 25 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 2.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:golden_carrot", + "weight": 25 + }, + { + "type": "minecraft:item", + "name": "minecraft:oak_boat", + "weight": 25 + }, + { + "type": "minecraft:item", + "name": "twilightforest:hollow_oak_sapling", + "weight": 25 + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/chests/graveyard.json b/src/generated/resources/data/twilightforest/loot_tables/chests/graveyard.json new file mode 100644 index 0000000000..f4f08dee15 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/chests/graveyard.json @@ -0,0 +1,110 @@ +{ + "type": "minecraft:chest", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 32.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:pumpkin_seeds" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 6.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:pumpkin_pie" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 16.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:torchberries" + } + ], + "rolls": 4.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 6.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:diamond" + }, + { + "type": "minecraft:item", + "name": "twilightforest:moon_dial" + } + ], + "rolls": 2.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 12.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:transformation_powder" + }, + { + "type": "minecraft:item", + "name": "twilightforest:uncrafting_table" + }, + { + "type": "minecraft:item", + "name": "minecraft:golden_apple" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/chests/hedge_maze.json b/src/generated/resources/data/twilightforest/loot_tables/chests/hedge_maze.json new file mode 100644 index 0000000000..f618b80749 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/chests/hedge_maze.json @@ -0,0 +1,271 @@ +{ + "type": "minecraft:chest", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:loot_table", + "name": "twilightforest:chests/useless", + "weight": 25 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:oak_planks", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:brown_mushroom", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:red_mushroom", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:wheat", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:string", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 6.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:stick", + "weight": 75 + } + ], + "rolls": 4.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:melon_slice" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:melon_seeds" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:pumpkin_seeds" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 12.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:arrow" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:firefly" + } + ], + "rolls": 2.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:cobweb", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 2.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:apple", + "weight": 75 + }, + { + "type": "minecraft:item", + "name": "minecraft:shears", + "weight": 75 + }, + { + "type": "minecraft:item", + "name": "minecraft:saddle", + "weight": 75 + }, + { + "type": "minecraft:item", + "name": "minecraft:bow", + "weight": 75 + }, + { + "type": "minecraft:item", + "name": "minecraft:golden_apple", + "weight": 25 + }, + { + "type": "minecraft:item", + "name": "minecraft:mushroom_stew", + "weight": 25 + }, + { + "type": "minecraft:item", + "name": "minecraft:diamond", + "weight": 25 + }, + { + "type": "minecraft:item", + "name": "minecraft:diamond_hoe", + "weight": 25 + }, + { + "type": "minecraft:item", + "name": "twilightforest:music_disc_motion", + "weight": 15 + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/chests/hill_1.json b/src/generated/resources/data/twilightforest/loot_tables/chests/hill_1.json new file mode 100644 index 0000000000..0b79550d35 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/chests/hill_1.json @@ -0,0 +1,213 @@ +{ + "type": "minecraft:chest", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:loot_table", + "name": "twilightforest:chests/useless", + "weight": 25 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:iron_ingot", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:wheat", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:string", + "weight": 75 + }, + { + "type": "minecraft:item", + "name": "minecraft:bucket", + "weight": 75 + } + ], + "rolls": 4.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 12.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:torch" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 12.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:arrow" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:gunpowder" + }, + { + "type": "minecraft:item", + "name": "minecraft:bread" + }, + { + "type": "minecraft:item", + "name": "twilightforest:ore_magnet" + } + ], + "rolls": 2.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 3.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:liveroot", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 3.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:gold_ingot", + "weight": 75 + }, + { + "type": "minecraft:item", + "name": "minecraft:iron_pickaxe", + "weight": 75 + }, + { + "type": "minecraft:item", + "name": "minecraft:diamond", + "weight": 25 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 12.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:transformation_powder", + "weight": 25 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 3.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:steeleaf_ingot", + "weight": 25 + }, + { + "type": "minecraft:item", + "name": "twilightforest:music_disc_findings", + "weight": 25 + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/chests/hill_2.json b/src/generated/resources/data/twilightforest/loot_tables/chests/hill_2.json new file mode 100644 index 0000000000..87fb6709f6 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/chests/hill_2.json @@ -0,0 +1,207 @@ +{ + "type": "minecraft:chest", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:loot_table", + "name": "twilightforest:chests/useless", + "weight": 25 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:iron_ingot", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:carrot", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 6.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:ladder", + "weight": 75 + }, + { + "type": "minecraft:item", + "name": "minecraft:bucket", + "weight": 75 + } + ], + "rolls": 4.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 2.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:baked_potato" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 12.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:arrow" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 12.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:torch" + }, + { + "type": "minecraft:item", + "name": "twilightforest:ore_magnet" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:ironwood_ingot" + } + ], + "rolls": 2.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:magic_map", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 12.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:transformation_powder", + "weight": 75 + }, + { + "type": "minecraft:item", + "name": "twilightforest:uncrafting_table", + "weight": 75 + }, + { + "type": "minecraft:item", + "name": "minecraft:diamond", + "weight": 25 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 6.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:emerald", + "weight": 25 + }, + { + "type": "minecraft:item", + "name": "twilightforest:peacock_feather_fan", + "weight": 25 + }, + { + "type": "minecraft:item", + "name": "twilightforest:charm_of_life_1", + "weight": 25 + }, + { + "type": "minecraft:item", + "name": "twilightforest:music_disc_wayfarer", + "weight": 25 + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/chests/hill_3.json b/src/generated/resources/data/twilightforest/loot_tables/chests/hill_3.json new file mode 100644 index 0000000000..c88e835c8f --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/chests/hill_3.json @@ -0,0 +1,237 @@ +{ + "type": "minecraft:chest", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:loot_table", + "name": "twilightforest:chests/useless", + "weight": 25 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 9.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:gold_nugget", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:potato", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:cod", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 5.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:torchberries", + "weight": 75 + } + ], + "rolls": 4.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 12.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:torch" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 12.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:arrow" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:gunpowder" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:steeleaf_ingot" + }, + { + "type": "minecraft:item", + "name": "minecraft:pumpkin_pie" + }, + { + "type": "minecraft:item", + "name": "twilightforest:ore_magnet" + } + ], + "rolls": 2.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 12.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:transformation_powder", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "enchantments": { + "minecraft:efficiency": 1.0, + "minecraft:fortune": 1.0 + }, + "function": "minecraft:set_enchantments" + } + ], + "name": "twilightforest:ironwood_pickaxe", + "weight": 75 + }, + { + "type": "minecraft:item", + "name": "twilightforest:magic_map", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 2.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:diamond", + "weight": 25 + }, + { + "type": "minecraft:item", + "name": "twilightforest:moonworm_queen", + "weight": 25 + }, + { + "type": "minecraft:item", + "name": "twilightforest:charm_of_life_1", + "weight": 25 + }, + { + "type": "minecraft:item", + "name": "twilightforest:charm_of_keeping_1", + "weight": 25 + }, + { + "type": "minecraft:item", + "name": "twilightforest:ironwood_block", + "weight": 25 + }, + { + "type": "minecraft:item", + "name": "twilightforest:music_disc_maker", + "weight": 20 + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/chests/labyrinth_dead_end.json b/src/generated/resources/data/twilightforest/loot_tables/chests/labyrinth_dead_end.json new file mode 100644 index 0000000000..d45b89b8f1 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/chests/labyrinth_dead_end.json @@ -0,0 +1,247 @@ +{ + "type": "minecraft:chest", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:loot_table", + "name": "twilightforest:chests/useless", + "weight": 25 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 6.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:stick", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 6.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:coal", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 6.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:arrow", + "weight": 75 + }, + { + "type": "minecraft:item", + "name": "minecraft:mushroom_stew", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 5.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:maze_wafer", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 6.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:paper", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 2.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:leather", + "weight": 75 + } + ], + "rolls": 4.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:milk_bucket" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 5.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:paper" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 3.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:iron_ingot" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:ironwood_ingot" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 2.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:firefly" + }, + { + "type": "minecraft:item", + "name": "twilightforest:charm_of_keeping_1" + } + ], + "rolls": 2.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:golden_apple" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 18.0, + "min": 5.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:red_thread" + }, + { + "type": "minecraft:item", + "name": "minecraft:blaze_rod" + }, + { + "type": "minecraft:item", + "functions": [ + { + "enchantments": [ + "twilightforest:fire_react" + ], + "function": "minecraft:enchant_randomly" + } + ], + "name": "minecraft:book" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:steeleaf_ingot" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/chests/labyrinth_room.json b/src/generated/resources/data/twilightforest/loot_tables/chests/labyrinth_room.json new file mode 100644 index 0000000000..47d44a3a3a --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/chests/labyrinth_room.json @@ -0,0 +1,205 @@ +{ + "type": "minecraft:chest", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:iron_ingot" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:gunpowder" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:ironwood_ingot" + }, + { + "type": "minecraft:item", + "name": "minecraft:milk_bucket" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 12.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:maze_wafer" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 5.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:firefly" + } + ], + "rolls": 4.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 6.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:steeleaf_ingot" + }, + { + "type": "minecraft:item", + "name": "twilightforest:charm_of_keeping_1" + }, + { + "type": "minecraft:item", + "name": "twilightforest:steeleaf_helmet" + }, + { + "type": "minecraft:item", + "name": "twilightforest:steeleaf_chestplate" + }, + { + "type": "minecraft:item", + "name": "twilightforest:steeleaf_leggings" + }, + { + "type": "minecraft:item", + "name": "twilightforest:steeleaf_boots" + }, + { + "type": "minecraft:item", + "name": "twilightforest:steeleaf_pickaxe" + }, + { + "type": "minecraft:item", + "name": "twilightforest:ironwood_chestplate" + }, + { + "type": "minecraft:item", + "name": "twilightforest:ironwood_sword" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 15.0, + "min": 5.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:red_thread" + } + ], + "rolls": 2.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:maze_map_focus" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 3.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:tnt" + }, + { + "type": "minecraft:item", + "functions": [ + { + "enchantments": [ + "twilightforest:fire_react" + ], + "function": "minecraft:enchant_randomly" + } + ], + "name": "minecraft:book" + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:set_nbt", + "tag": "{Potion:\"minecraft:strong_healing\"}" + } + ], + "name": "minecraft:potion" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/chests/labyrinth_vault.json b/src/generated/resources/data/twilightforest/loot_tables/chests/labyrinth_vault.json new file mode 100644 index 0000000000..28c24a7f61 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/chests/labyrinth_vault.json @@ -0,0 +1,297 @@ +{ + "type": "minecraft:chest", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 9.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:iron_ingot" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 5.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:emerald" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 9.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:ironwood_ingot" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 12.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:maze_wafer" + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:set_nbt", + "tag": "{Potion:\"minecraft:strong_regeneration\"}" + } + ], + "name": "minecraft:potion" + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:set_nbt", + "tag": "{Potion:\"minecraft:strong_healing\"}" + } + ], + "name": "minecraft:potion" + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:set_nbt", + "tag": "{Potion:\"minecraft:strong_swiftness\"}" + } + ], + "name": "minecraft:potion" + } + ], + "rolls": 4.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "enchantments": { + "minecraft:infinity": 1.0, + "minecraft:punch": 2.0 + }, + "function": "minecraft:set_enchantments" + } + ], + "name": "minecraft:bow" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "enchantments": { + "minecraft:flame": 1.0, + "minecraft:power": 3.0 + }, + "function": "minecraft:set_enchantments" + } + ], + "name": "minecraft:bow" + }, + { + "type": "minecraft:item", + "functions": [ + { + "enchantments": [ + "twilightforest:fire_react" + ], + "function": "minecraft:enchant_randomly" + } + ], + "name": "minecraft:book" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 12.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:steeleaf_ingot" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "enchantments": { + "minecraft:efficiency": 4.0, + "minecraft:unbreaking": 2.0 + }, + "function": "minecraft:set_enchantments" + } + ], + "name": "twilightforest:steeleaf_shovel" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "enchantments": { + "minecraft:efficiency": 5.0 + }, + "function": "minecraft:set_enchantments" + } + ], + "name": "twilightforest:steeleaf_axe" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "enchantments": { + "minecraft:protection": 3.0 + }, + "function": "minecraft:set_enchantments" + } + ], + "name": "twilightforest:steeleaf_chestplate" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "enchantments": { + "minecraft:protection": 2.0 + }, + "function": "minecraft:set_enchantments" + } + ], + "name": "twilightforest:steeleaf_boots" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "enchantments": { + "minecraft:fire_protection": 4.0 + }, + "function": "minecraft:set_enchantments" + } + ], + "name": "twilightforest:steeleaf_leggings" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "enchantments": { + "minecraft:respiration": 3.0 + }, + "function": "minecraft:set_enchantments" + } + ], + "name": "twilightforest:steeleaf_helmet" + } + ], + "rolls": 2.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:emerald_block" + }, + { + "type": "minecraft:item", + "name": "minecraft:ender_chest" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "enchantments": { + "minecraft:efficiency": 4.0, + "minecraft:silk_touch": 1.0 + }, + "function": "minecraft:set_enchantments" + } + ], + "name": "twilightforest:steeleaf_pickaxe" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "enchantments": { + "minecraft:knockback": 2.0, + "minecraft:sharpness": 4.0 + }, + "function": "minecraft:set_enchantments" + } + ], + "name": "twilightforest:steeleaf_sword" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "enchantments": { + "minecraft:bane_of_arthropods": 5.0, + "minecraft:fire_aspect": 2.0 + }, + "function": "minecraft:set_enchantments" + } + ], + "name": "twilightforest:steeleaf_sword" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/chests/labyrinth_vault_jackpot.json b/src/generated/resources/data/twilightforest/loot_tables/chests/labyrinth_vault_jackpot.json new file mode 100644 index 0000000000..692a42cda1 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/chests/labyrinth_vault_jackpot.json @@ -0,0 +1,36 @@ +{ + "type": "minecraft:chest", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:loot_table", + "name": "twilightforest:chests/labyrinth_vault" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "enchantments": { + "minecraft:efficiency": 4.0, + "minecraft:fortune": 2.0, + "minecraft:unbreaking": 3.0 + }, + "function": "minecraft:set_enchantments" + } + ], + "name": "twilightforest:mazebreaker_pickaxe" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/chests/quest_grove_dropper.json b/src/generated/resources/data/twilightforest/loot_tables/chests/quest_grove_dropper.json new file mode 100644 index 0000000000..b898b152cf --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/chests/quest_grove_dropper.json @@ -0,0 +1,75 @@ +{ + "type": "minecraft:chest", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:white_wool" + }, + { + "type": "minecraft:item", + "name": "minecraft:orange_wool" + }, + { + "type": "minecraft:item", + "name": "minecraft:magenta_wool" + }, + { + "type": "minecraft:item", + "name": "minecraft:light_blue_wool" + }, + { + "type": "minecraft:item", + "name": "minecraft:yellow_wool" + }, + { + "type": "minecraft:item", + "name": "minecraft:lime_wool" + }, + { + "type": "minecraft:item", + "name": "minecraft:pink_wool" + }, + { + "type": "minecraft:item", + "name": "minecraft:gray_wool" + }, + { + "type": "minecraft:item", + "name": "minecraft:light_gray_wool" + }, + { + "type": "minecraft:item", + "name": "minecraft:cyan_wool" + }, + { + "type": "minecraft:item", + "name": "minecraft:purple_wool" + }, + { + "type": "minecraft:item", + "name": "minecraft:blue_wool" + }, + { + "type": "minecraft:item", + "name": "minecraft:brown_wool" + }, + { + "type": "minecraft:item", + "name": "minecraft:green_wool" + }, + { + "type": "minecraft:item", + "name": "minecraft:red_wool" + }, + { + "type": "minecraft:item", + "name": "minecraft:black_wool" + } + ], + "rolls": 4.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/chests/stronghold_boss.json b/src/generated/resources/data/twilightforest/loot_tables/chests/stronghold_boss.json new file mode 100644 index 0000000000..49a968d974 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/chests/stronghold_boss.json @@ -0,0 +1,110 @@ +{ + "type": "minecraft:chest", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:enchant_with_levels", + "levels": 20.0, + "treasure": false + } + ], + "name": "twilightforest:knightmetal_sword" + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:enchant_with_levels", + "levels": 20.0, + "treasure": false + } + ], + "name": "twilightforest:knightmetal_pickaxe" + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:enchant_with_levels", + "levels": 20.0, + "treasure": false + } + ], + "name": "twilightforest:knightmetal_axe" + } + ], + "rolls": 4.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:enchant_with_levels", + "levels": 20.0, + "treasure": false + } + ], + "name": "twilightforest:phantom_helmet" + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:enchant_with_levels", + "levels": 20.0, + "treasure": false + } + ], + "name": "twilightforest:phantom_chestplate" + } + ], + "rolls": 2.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:enchant_with_levels", + "levels": 30.0, + "treasure": false + } + ], + "name": "twilightforest:phantom_helmet" + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:enchant_with_levels", + "levels": 30.0, + "treasure": false + } + ], + "name": "twilightforest:phantom_chestplate" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:knight_phantom_trophy" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/chests/stronghold_cache.json b/src/generated/resources/data/twilightforest/loot_tables/chests/stronghold_cache.json new file mode 100644 index 0000000000..b7b8ca2136 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/chests/stronghold_cache.json @@ -0,0 +1,345 @@ +{ + "type": "minecraft:chest", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 12.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:stick" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 12.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:coal" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 12.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:arrow" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 9.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:maze_wafer" + }, + { + "type": "minecraft:item", + "name": "minecraft:blue_wool" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 2.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:iron_ingot" + } + ], + "rolls": 4.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:bucket" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 6.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:iron_ingot" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 6.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:ironwood_ingot" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 5.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:firefly" + }, + { + "type": "minecraft:item", + "name": "twilightforest:charm_of_keeping_1" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 3.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:armor_shard" + } + ], + "rolls": 2.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 8.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:knightmetal_ingot", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:enchant_with_levels", + "levels": 20.0, + "treasure": false + } + ], + "name": "minecraft:bow", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:enchant_with_levels", + "levels": 20.0, + "treasure": false + } + ], + "name": "minecraft:iron_sword", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:enchant_with_levels", + "levels": 15.0, + "treasure": false + } + ], + "name": "twilightforest:ironwood_sword", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:enchant_with_levels", + "levels": 10.0, + "treasure": false + } + ], + "name": "twilightforest:steeleaf_sword", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "enchantments": { + "minecraft:bane_of_arthropods": 4.0 + }, + "function": "minecraft:set_enchantments" + } + ], + "name": "minecraft:enchanted_book", + "weight": 25 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "enchantments": { + "minecraft:sharpness": 4.0 + }, + "function": "minecraft:set_enchantments" + } + ], + "name": "minecraft:enchanted_book", + "weight": 25 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "enchantments": { + "minecraft:smite": 4.0 + }, + "function": "minecraft:set_enchantments" + } + ], + "name": "minecraft:enchanted_book", + "weight": 25 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "enchantments": { + "minecraft:unbreaking": 2.0 + }, + "function": "minecraft:set_enchantments" + } + ], + "name": "minecraft:enchanted_book", + "weight": 25 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "enchantments": { + "minecraft:protection": 3.0 + }, + "function": "minecraft:set_enchantments" + } + ], + "name": "minecraft:enchanted_book", + "weight": 25 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "enchantments": { + "minecraft:projectile_protection": 3.0 + }, + "function": "minecraft:set_enchantments" + } + ], + "name": "minecraft:enchanted_book", + "weight": 25 + }, + { + "type": "minecraft:item", + "functions": [ + { + "enchantments": [ + "twilightforest:destruction" + ], + "function": "minecraft:enchant_randomly" + } + ], + "name": "minecraft:book", + "weight": 25 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "enchantments": { + "minecraft:feather_falling": 3.0 + }, + "function": "minecraft:set_enchantments" + } + ], + "name": "minecraft:enchanted_book", + "weight": 25 + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/chests/stronghold_room.json b/src/generated/resources/data/twilightforest/loot_tables/chests/stronghold_room.json new file mode 100644 index 0000000000..e29fa9dfde --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/chests/stronghold_room.json @@ -0,0 +1,231 @@ +{ + "type": "minecraft:chest", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:loot_table", + "name": "twilightforest:chests/useless", + "weight": 25 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:iron_ingot", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:gunpowder", + "weight": 75 + }, + { + "type": "minecraft:item", + "name": "minecraft:milk_bucket", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 12.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:maze_wafer", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:ironwood_ingot", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 5.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:firefly", + "weight": 75 + } + ], + "rolls": 4.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 6.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:steeleaf_ingot" + }, + { + "type": "minecraft:item", + "name": "twilightforest:charm_of_life_1" + }, + { + "type": "minecraft:item", + "name": "twilightforest:steeleaf_helmet" + }, + { + "type": "minecraft:item", + "name": "twilightforest:steeleaf_chestplate" + }, + { + "type": "minecraft:item", + "name": "twilightforest:steeleaf_leggings" + }, + { + "type": "minecraft:item", + "name": "twilightforest:steeleaf_boots" + }, + { + "type": "minecraft:item", + "name": "twilightforest:steeleaf_pickaxe" + }, + { + "type": "minecraft:item", + "name": "twilightforest:ironwood_chestplate" + }, + { + "type": "minecraft:item", + "name": "twilightforest:ironwood_sword" + } + ], + "rolls": 2.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:enchant_with_levels", + "levels": 25.0, + "treasure": false + } + ], + "name": "twilightforest:ironwood_sword" + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:enchant_with_levels", + "levels": 20.0, + "treasure": false + } + ], + "name": "twilightforest:steeleaf_sword" + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:enchant_with_levels", + "levels": 30.0, + "treasure": false + } + ], + "name": "minecraft:iron_sword" + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:enchant_with_levels", + "levels": 30.0, + "treasure": false + } + ], + "name": "minecraft:bow" + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:enchant_with_levels", + "levels": 15.0, + "treasure": false + } + ], + "name": "minecraft:diamond_sword" + }, + { + "type": "minecraft:item", + "functions": [ + { + "enchantments": [ + "twilightforest:destruction" + ], + "function": "minecraft:enchant_randomly" + } + ], + "name": "minecraft:book" + }, + { + "type": "minecraft:item", + "name": "twilightforest:maze_map_focus" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/chests/tower_library.json b/src/generated/resources/data/twilightforest/loot_tables/chests/tower_library.json new file mode 100644 index 0000000000..c7d6d5ab2f --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/chests/tower_library.json @@ -0,0 +1,374 @@ +{ + "type": "minecraft:chest", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:loot_table", + "name": "twilightforest:chests/useless", + "weight": 25 + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:set_nbt", + "tag": "{Potion:\"minecraft:water\"}" + } + ], + "name": "minecraft:potion", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 6.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:glass_bottle", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 6.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:ladder", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 6.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:paper", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 6.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:bone", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 6.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:gold_nugget", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 12.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:clay_ball", + "weight": 75 + } + ], + "rolls": 4.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:enchant_with_levels", + "levels": 5.0, + "treasure": false + } + ], + "name": "minecraft:iron_leggings" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 3.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:fire_charge" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 5.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:book" + }, + { + "type": "minecraft:item", + "name": "minecraft:map" + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:set_nbt", + "tag": "{Potion:\"minecraft:poison\"}" + } + ], + "name": "minecraft:potion" + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:set_nbt", + "tag": "{Potion:\"minecraft:awkward\"}" + } + ], + "name": "minecraft:potion" + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:set_nbt", + "tag": "{Potion:\"minecraft:weakness\"}" + } + ], + "name": "minecraft:potion" + } + ], + "rolls": 2.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:enchant_with_levels", + "levels": 10.0, + "treasure": false + } + ], + "name": "minecraft:stone_sword", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:enchant_with_levels", + "levels": 15.0, + "treasure": false + } + ], + "name": "minecraft:wooden_sword", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:enchant_with_levels", + "levels": 5.0, + "treasure": false + } + ], + "name": "minecraft:bow", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:set_nbt", + "tag": "{Potion:\"minecraft:weakness\"}" + } + ], + "name": "minecraft:splash_potion", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:set_nbt", + "tag": "{Potion:\"minecraft:strong_regeneration\"}" + } + ], + "name": "minecraft:potion", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:set_nbt", + "tag": "{Potion:\"minecraft:strong_healing\"}" + } + ], + "name": "minecraft:potion", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:set_nbt", + "tag": "{Potion:\"minecraft:strong_swiftness\"}" + } + ], + "name": "minecraft:potion", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:enchant_with_levels", + "levels": 10.0, + "treasure": false + } + ], + "name": "minecraft:golden_pickaxe", + "weight": 25 + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:enchant_with_levels", + "levels": 20.0, + "treasure": false + } + ], + "name": "minecraft:iron_sword", + "weight": 25 + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:enchant_with_levels", + "levels": 30.0, + "treasure": false + } + ], + "name": "minecraft:bow", + "weight": 25 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 5.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:bookshelf", + "weight": 25 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 2.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:ender_pearl", + "weight": 25 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 6.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:experience_bottle", + "weight": 25 + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/chests/tower_room.json b/src/generated/resources/data/twilightforest/loot_tables/chests/tower_room.json new file mode 100644 index 0000000000..6e45de2d97 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/chests/tower_room.json @@ -0,0 +1,353 @@ +{ + "type": "minecraft:chest", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:loot_table", + "name": "twilightforest:chests/useless", + "weight": 25 + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:set_nbt", + "tag": "{Potion:\"minecraft:water\"}" + } + ], + "name": "minecraft:potion", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 6.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:glass_bottle", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 5.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:sugar", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 3.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:spider_eye", + "weight": 75 + }, + { + "type": "minecraft:item", + "name": "minecraft:ghast_tear", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 2.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:magma_cream", + "weight": 75 + }, + { + "type": "minecraft:item", + "name": "minecraft:fermented_spider_eye", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 2.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:glistering_melon_slice", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 3.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:blaze_powder", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 6.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:paper", + "weight": 75 + } + ], + "rolls": 4.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:enchant_with_levels", + "levels": 10.0, + "treasure": false + } + ], + "name": "minecraft:golden_sword" + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:enchant_with_levels", + "levels": 7.0, + "treasure": false + } + ], + "name": "minecraft:golden_sword" + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:set_nbt", + "tag": "{Potion:\"minecraft:swiftness\"}" + } + ], + "name": "minecraft:potion" + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:set_nbt", + "tag": "{Potion:\"minecraft:healing\"}" + } + ], + "name": "minecraft:potion" + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:set_nbt", + "tag": "{Potion:\"minecraft:fire_resistance\"}" + } + ], + "name": "minecraft:potion" + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:set_nbt", + "tag": "{Potion:\"minecraft:harming\"}" + } + ], + "name": "minecraft:potion" + } + ], + "rolls": 2.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:enchant_with_levels", + "levels": 10.0, + "treasure": false + } + ], + "name": "minecraft:golden_helmet", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 12.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:transformation_powder", + "weight": 75 + }, + { + "type": "minecraft:item", + "name": "twilightforest:charm_of_keeping_1", + "weight": 75 + }, + { + "type": "minecraft:item", + "name": "twilightforest:charm_of_life_1", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:set_nbt", + "tag": "{Potion:\"minecraft:healing\"}" + } + ], + "name": "minecraft:splash_potion", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:set_nbt", + "tag": "{Potion:\"minecraft:strong_harming\"}" + } + ], + "name": "minecraft:splash_potion", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:set_nbt", + "tag": "{Potion:\"minecraft:strong_swiftness\"}" + } + ], + "name": "minecraft:potion", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:set_nbt", + "tag": "{Potion:\"minecraft:strong_regeneration\"}" + } + ], + "name": "minecraft:potion", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:enchant_with_levels", + "levels": 20.0, + "treasure": false + } + ], + "name": "minecraft:golden_axe", + "weight": 25 + }, + { + "type": "minecraft:item", + "name": "minecraft:ender_pearl", + "weight": 25 + }, + { + "type": "minecraft:item", + "name": "minecraft:diamond", + "weight": 25 + }, + { + "type": "minecraft:item", + "name": "twilightforest:moonworm_queen", + "weight": 25 + }, + { + "type": "minecraft:item", + "name": "twilightforest:peacock_feather_fan", + "weight": 25 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:obsidian", + "weight": 25 + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/chests/tree_cache.json b/src/generated/resources/data/twilightforest/loot_tables/chests/tree_cache.json new file mode 100644 index 0000000000..2f471e3c43 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/chests/tree_cache.json @@ -0,0 +1,281 @@ +{ + "type": "minecraft:chest", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:loot_table", + "name": "twilightforest:chests/useless", + "weight": 25 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 2.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:poisonous_potato", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 6.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:wheat", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 6.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:potato", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 6.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:carrot", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 6.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:melon_slice", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 5.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:melon_seeds", + "weight": 75 + }, + { + "type": "minecraft:item", + "name": "minecraft:water_bucket", + "weight": 75 + }, + { + "type": "minecraft:item", + "name": "minecraft:milk_bucket", + "weight": 75 + } + ], + "rolls": 4.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:twilight_oak_sapling" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:canopy_sapling" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:mangrove_sapling" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:darkwood_sapling" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 12.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:firefly" + } + ], + "rolls": 2.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 12.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:pumpkin_pie", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 12.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:apple", + "weight": 75 + }, + { + "type": "minecraft:item", + "name": "twilightforest:charm_of_keeping_1", + "weight": 75 + }, + { + "type": "minecraft:item", + "name": "twilightforest:charm_of_life_1", + "weight": 75 + }, + { + "type": "minecraft:item", + "name": "twilightforest:hollow_oak_sapling", + "weight": 25 + }, + { + "type": "minecraft:item", + "name": "twilightforest:time_sapling", + "weight": 25 + }, + { + "type": "minecraft:item", + "name": "twilightforest:transformation_sapling", + "weight": 25 + }, + { + "type": "minecraft:item", + "name": "twilightforest:mining_sapling", + "weight": 25 + }, + { + "type": "minecraft:item", + "name": "twilightforest:sorting_sapling", + "weight": 25 + }, + { + "type": "minecraft:item", + "name": "twilightforest:music_disc_superstitious", + "weight": 25 + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/chests/troll_garden.json b/src/generated/resources/data/twilightforest/loot_tables/chests/troll_garden.json new file mode 100644 index 0000000000..66e626062e --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/chests/troll_garden.json @@ -0,0 +1,147 @@ +{ + "type": "minecraft:chest", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:red_mushroom" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:brown_mushroom" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 6.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:wheat_seeds" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 6.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:carrot" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 6.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:potato" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 6.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:melon_seeds" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 12.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:bone_meal" + } + ], + "rolls": 4.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 6.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:uberous_soil" + } + ], + "rolls": 2.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:magic_beans" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/chests/troll_vault.json b/src/generated/resources/data/twilightforest/loot_tables/chests/troll_vault.json new file mode 100644 index 0000000000..7a85c80804 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/chests/troll_vault.json @@ -0,0 +1,92 @@ +{ + "type": "minecraft:chest", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 16.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:coal" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 16.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:torchberries" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 6.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:emerald" + } + ], + "rolls": 4.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 6.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "twilightforest:trollsteinn" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 6.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:obsidian" + } + ], + "rolls": 2.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/chests/troll_vault_with_lamp.json b/src/generated/resources/data/twilightforest/loot_tables/chests/troll_vault_with_lamp.json new file mode 100644 index 0000000000..ca27b159dd --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/chests/troll_vault_with_lamp.json @@ -0,0 +1,25 @@ +{ + "type": "minecraft:chest", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:loot_table", + "name": "twilightforest:chests/troll_vault" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:lamp_of_cinders" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/chests/useless.json b/src/generated/resources/data/twilightforest/loot_tables/chests/useless.json new file mode 100644 index 0000000000..2d6a20a70b --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/chests/useless.json @@ -0,0 +1,139 @@ +{ + "type": "minecraft:chest", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:poppy" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:dandelion" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 3.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:feather" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 2.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:wheat_seeds" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 2.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:flint" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 2.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:cactus" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:sugar_cane" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:sand" + }, + { + "type": "minecraft:item", + "name": "minecraft:flower_pot" + }, + { + "type": "minecraft:item", + "name": "minecraft:bone_meal" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/chests/well.json b/src/generated/resources/data/twilightforest/loot_tables/chests/well.json new file mode 100644 index 0000000000..d3342f54d5 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/chests/well.json @@ -0,0 +1,224 @@ +{ + "type": "minecraft:chest", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 5.0, + "min": 3.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:gold_nugget", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 3.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:iron_nugget", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 6.0, + "min": 2.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:string", + "weight": 75 + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 7.0, + "min": 3.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:stick", + "weight": 75 + }, + { + "type": "minecraft:empty", + "weight": 25 + } + ], + "rolls": 4.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:bucket" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:melon_seeds" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:pumpkin_seeds" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 2.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:ink_sac" + }, + { + "type": "minecraft:item", + "name": "minecraft:water_bucket" + }, + { + "type": "minecraft:item", + "name": "minecraft:bowl" + }, + { + "type": "minecraft:item", + "name": "twilightforest:raw_ironwood" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 2.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:iron_ingot" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 2.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:gold_ingot" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 2.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:copper_ingot" + } + ], + "rolls": 2.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:shears" + }, + { + "type": "minecraft:item", + "name": "minecraft:saddle" + }, + { + "type": "minecraft:item", + "name": "minecraft:diamond" + }, + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 2.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:experience_bottle" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/entities/adherent.json b/src/generated/resources/data/twilightforest/loot_tables/entities/adherent.json new file mode 100644 index 0000000000..601c1935a9 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/entities/adherent.json @@ -0,0 +1,3 @@ +{ + "type": "minecraft:entity" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/entities/alpha_yeti.json b/src/generated/resources/data/twilightforest/loot_tables/entities/alpha_yeti.json new file mode 100644 index 0000000000..d1957133f9 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/entities/alpha_yeti.json @@ -0,0 +1,65 @@ +{ + "type": "minecraft:entity", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": 6.0, + "function": "minecraft:set_count" + }, + { + "count": { + "type": "minecraft:uniform", + "max": 1.0, + "min": 0.0 + }, + "function": "minecraft:looting_enchant" + } + ], + "name": "twilightforest:alpha_yeti_fur" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": 6.0, + "function": "minecraft:set_count" + }, + { + "count": { + "type": "minecraft:uniform", + "max": 1.0, + "min": 0.0 + }, + "function": "minecraft:looting_enchant" + } + ], + "name": "twilightforest:ice_bomb" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:alpha_yeti_trophy" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/entities/armored_giant.json b/src/generated/resources/data/twilightforest/loot_tables/entities/armored_giant.json new file mode 100644 index 0000000000..d5c25f2b83 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/entities/armored_giant.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:entity", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:killed_by_player" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:giant_sword" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/entities/bighorn_sheep.json b/src/generated/resources/data/twilightforest/loot_tables/entities/bighorn_sheep.json new file mode 100644 index 0000000000..11150238fa --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/entities/bighorn_sheep.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:entity", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:loot_table", + "name": "minecraft:entities/sheep" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/entities/bighorn_sheep/black.json b/src/generated/resources/data/twilightforest/loot_tables/entities/bighorn_sheep/black.json new file mode 100644 index 0000000000..7225150fa1 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/entities/bighorn_sheep/black.json @@ -0,0 +1,25 @@ +{ + "type": "minecraft:entity", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:black_wool" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:loot_table", + "name": "minecraft:entities/sheep" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/entities/bighorn_sheep/blue.json b/src/generated/resources/data/twilightforest/loot_tables/entities/bighorn_sheep/blue.json new file mode 100644 index 0000000000..e4435a8813 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/entities/bighorn_sheep/blue.json @@ -0,0 +1,25 @@ +{ + "type": "minecraft:entity", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:blue_wool" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:loot_table", + "name": "minecraft:entities/sheep" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/entities/bighorn_sheep/brown.json b/src/generated/resources/data/twilightforest/loot_tables/entities/bighorn_sheep/brown.json new file mode 100644 index 0000000000..14b67e81da --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/entities/bighorn_sheep/brown.json @@ -0,0 +1,25 @@ +{ + "type": "minecraft:entity", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:brown_wool" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:loot_table", + "name": "minecraft:entities/sheep" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/entities/bighorn_sheep/cyan.json b/src/generated/resources/data/twilightforest/loot_tables/entities/bighorn_sheep/cyan.json new file mode 100644 index 0000000000..e9edb1a2d0 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/entities/bighorn_sheep/cyan.json @@ -0,0 +1,25 @@ +{ + "type": "minecraft:entity", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:cyan_wool" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:loot_table", + "name": "minecraft:entities/sheep" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/entities/bighorn_sheep/gray.json b/src/generated/resources/data/twilightforest/loot_tables/entities/bighorn_sheep/gray.json new file mode 100644 index 0000000000..2045573a21 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/entities/bighorn_sheep/gray.json @@ -0,0 +1,25 @@ +{ + "type": "minecraft:entity", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:gray_wool" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:loot_table", + "name": "minecraft:entities/sheep" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/entities/bighorn_sheep/green.json b/src/generated/resources/data/twilightforest/loot_tables/entities/bighorn_sheep/green.json new file mode 100644 index 0000000000..a109acc279 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/entities/bighorn_sheep/green.json @@ -0,0 +1,25 @@ +{ + "type": "minecraft:entity", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:green_wool" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:loot_table", + "name": "minecraft:entities/sheep" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/entities/bighorn_sheep/light_blue.json b/src/generated/resources/data/twilightforest/loot_tables/entities/bighorn_sheep/light_blue.json new file mode 100644 index 0000000000..3710ad2aea --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/entities/bighorn_sheep/light_blue.json @@ -0,0 +1,25 @@ +{ + "type": "minecraft:entity", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:light_blue_wool" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:loot_table", + "name": "minecraft:entities/sheep" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/entities/bighorn_sheep/light_gray.json b/src/generated/resources/data/twilightforest/loot_tables/entities/bighorn_sheep/light_gray.json new file mode 100644 index 0000000000..4c81b0d738 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/entities/bighorn_sheep/light_gray.json @@ -0,0 +1,25 @@ +{ + "type": "minecraft:entity", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:light_gray_wool" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:loot_table", + "name": "minecraft:entities/sheep" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/entities/bighorn_sheep/lime.json b/src/generated/resources/data/twilightforest/loot_tables/entities/bighorn_sheep/lime.json new file mode 100644 index 0000000000..5246e80f0c --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/entities/bighorn_sheep/lime.json @@ -0,0 +1,25 @@ +{ + "type": "minecraft:entity", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:lime_wool" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:loot_table", + "name": "minecraft:entities/sheep" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/entities/bighorn_sheep/magenta.json b/src/generated/resources/data/twilightforest/loot_tables/entities/bighorn_sheep/magenta.json new file mode 100644 index 0000000000..54798e8cd6 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/entities/bighorn_sheep/magenta.json @@ -0,0 +1,25 @@ +{ + "type": "minecraft:entity", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:magenta_wool" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:loot_table", + "name": "minecraft:entities/sheep" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/entities/bighorn_sheep/orange.json b/src/generated/resources/data/twilightforest/loot_tables/entities/bighorn_sheep/orange.json new file mode 100644 index 0000000000..5a2cd83139 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/entities/bighorn_sheep/orange.json @@ -0,0 +1,25 @@ +{ + "type": "minecraft:entity", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:orange_wool" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:loot_table", + "name": "minecraft:entities/sheep" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/entities/bighorn_sheep/pink.json b/src/generated/resources/data/twilightforest/loot_tables/entities/bighorn_sheep/pink.json new file mode 100644 index 0000000000..bbd44d2082 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/entities/bighorn_sheep/pink.json @@ -0,0 +1,25 @@ +{ + "type": "minecraft:entity", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:pink_wool" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:loot_table", + "name": "minecraft:entities/sheep" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/entities/bighorn_sheep/purple.json b/src/generated/resources/data/twilightforest/loot_tables/entities/bighorn_sheep/purple.json new file mode 100644 index 0000000000..6f72e25e07 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/entities/bighorn_sheep/purple.json @@ -0,0 +1,25 @@ +{ + "type": "minecraft:entity", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:purple_wool" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:loot_table", + "name": "minecraft:entities/sheep" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/entities/bighorn_sheep/red.json b/src/generated/resources/data/twilightforest/loot_tables/entities/bighorn_sheep/red.json new file mode 100644 index 0000000000..e7fa9cf50a --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/entities/bighorn_sheep/red.json @@ -0,0 +1,25 @@ +{ + "type": "minecraft:entity", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:red_wool" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:loot_table", + "name": "minecraft:entities/sheep" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/entities/bighorn_sheep/white.json b/src/generated/resources/data/twilightforest/loot_tables/entities/bighorn_sheep/white.json new file mode 100644 index 0000000000..24cfed003c --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/entities/bighorn_sheep/white.json @@ -0,0 +1,25 @@ +{ + "type": "minecraft:entity", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:white_wool" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:loot_table", + "name": "minecraft:entities/sheep" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/entities/bighorn_sheep/yellow.json b/src/generated/resources/data/twilightforest/loot_tables/entities/bighorn_sheep/yellow.json new file mode 100644 index 0000000000..1c18ca72f5 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/entities/bighorn_sheep/yellow.json @@ -0,0 +1,25 @@ +{ + "type": "minecraft:entity", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:yellow_wool" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:loot_table", + "name": "minecraft:entities/sheep" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/entities/blockchain_goblin.json b/src/generated/resources/data/twilightforest/loot_tables/entities/blockchain_goblin.json new file mode 100644 index 0000000000..9ffdc50d10 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/entities/blockchain_goblin.json @@ -0,0 +1,34 @@ +{ + "type": "minecraft:entity", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 2.0, + "min": 0.0 + }, + "function": "minecraft:set_count" + }, + { + "count": { + "type": "minecraft:uniform", + "max": 1.0, + "min": 0.0 + }, + "function": "minecraft:looting_enchant" + } + ], + "name": "twilightforest:armor_shard" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/entities/boar.json b/src/generated/resources/data/twilightforest/loot_tables/entities/boar.json new file mode 100644 index 0000000000..c7b1bf48ba --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/entities/boar.json @@ -0,0 +1,48 @@ +{ + "type": "minecraft:entity", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 3.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + }, + { + "conditions": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "flags": { + "is_on_fire": true + } + } + } + ], + "function": "minecraft:furnace_smelt" + }, + { + "count": { + "type": "minecraft:uniform", + "max": 1.0, + "min": 0.0 + }, + "function": "minecraft:looting_enchant" + } + ], + "name": "minecraft:porkchop" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/entities/carminite_broodling.json b/src/generated/resources/data/twilightforest/loot_tables/entities/carminite_broodling.json new file mode 100644 index 0000000000..174c1794f0 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/entities/carminite_broodling.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:entity", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:loot_table", + "name": "minecraft:entities/spider" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/entities/carminite_ghastguard.json b/src/generated/resources/data/twilightforest/loot_tables/entities/carminite_ghastguard.json new file mode 100644 index 0000000000..8277e654bf --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/entities/carminite_ghastguard.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:entity", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:loot_table", + "name": "minecraft:entities/ghast" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/entities/carminite_ghastling.json b/src/generated/resources/data/twilightforest/loot_tables/entities/carminite_ghastling.json new file mode 100644 index 0000000000..2dd9e11b10 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/entities/carminite_ghastling.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:entity", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "twilightforest:is_minion", + "inverse": true + } + ], + "entries": [ + { + "type": "minecraft:loot_table", + "name": "minecraft:entities/ghast" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/entities/carminite_golem.json b/src/generated/resources/data/twilightforest/loot_tables/entities/carminite_golem.json new file mode 100644 index 0000000000..2f510d8481 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/entities/carminite_golem.json @@ -0,0 +1,63 @@ +{ + "type": "minecraft:entity", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 2.0, + "min": 0.0 + }, + "function": "minecraft:set_count" + }, + { + "count": { + "type": "minecraft:uniform", + "max": 1.0, + "min": 0.0 + }, + "function": "minecraft:looting_enchant" + } + ], + "name": "minecraft:iron_ingot" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:towerwood" + } + ], + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 2.0, + "min": 0.0 + }, + "function": "minecraft:set_count" + }, + { + "count": { + "type": "minecraft:uniform", + "max": 1.0, + "min": 0.0 + }, + "function": "minecraft:looting_enchant" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/entities/death_tome.json b/src/generated/resources/data/twilightforest/loot_tables/entities/death_tome.json new file mode 100644 index 0000000000..fff61e69d0 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/entities/death_tome.json @@ -0,0 +1,71 @@ +{ + "type": "minecraft:entity", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:paper" + } + ], + "functions": [ + { + "add": false, + "count": 3.0, + "function": "minecraft:set_count" + }, + { + "count": { + "type": "minecraft:uniform", + "max": 1.0, + "min": 0.0 + }, + "function": "minecraft:looting_enchant" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:writable_book", + "quality": 3, + "weight": 2 + }, + { + "type": "minecraft:item", + "name": "minecraft:book", + "weight": 19 + }, + { + "type": "minecraft:loot_table", + "name": "twilightforest:entities/death_tome_books" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:killed_by_player" + }, + { + "chance": 0.025, + "condition": "minecraft:random_chance_with_looting", + "looting_multiplier": 0.005 + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:magic_map_focus" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/entities/death_tome_books.json b/src/generated/resources/data/twilightforest/loot_tables/entities/death_tome_books.json new file mode 100644 index 0000000000..04c83c0633 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/entities/death_tome_books.json @@ -0,0 +1,74 @@ +{ + "type": "minecraft:entity", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:enchant_with_levels", + "levels": { + "type": "minecraft:uniform", + "max": 10.0, + "min": 1.0 + }, + "treasure": false + } + ], + "name": "minecraft:book", + "weight": 32 + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:enchant_with_levels", + "levels": { + "type": "minecraft:uniform", + "max": 20.0, + "min": 11.0 + }, + "treasure": false + } + ], + "name": "minecraft:book", + "weight": 8 + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:enchant_with_levels", + "levels": { + "type": "minecraft:uniform", + "max": 30.0, + "min": 21.0 + }, + "treasure": false + } + ], + "name": "minecraft:book", + "weight": 4 + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:enchant_with_levels", + "levels": { + "type": "minecraft:uniform", + "max": 40.0, + "min": 31.0 + }, + "treasure": false + } + ], + "name": "minecraft:book" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/entities/death_tome_hurt.json b/src/generated/resources/data/twilightforest/loot_tables/entities/death_tome_hurt.json new file mode 100644 index 0000000000..1183c4b199 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/entities/death_tome_hurt.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:entity", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:loot_table", + "name": "minecraft:empty" + }, + { + "type": "minecraft:item", + "name": "minecraft:paper" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/entities/deer.json b/src/generated/resources/data/twilightforest/loot_tables/entities/deer.json new file mode 100644 index 0000000000..26af4396e0 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/entities/deer.json @@ -0,0 +1,77 @@ +{ + "type": "minecraft:entity", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 2.0, + "min": 0.0 + }, + "function": "minecraft:set_count" + }, + { + "count": { + "type": "minecraft:uniform", + "max": 1.0, + "min": 0.0 + }, + "function": "minecraft:looting_enchant" + } + ], + "name": "minecraft:leather" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 3.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + }, + { + "conditions": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "flags": { + "is_on_fire": true + } + } + } + ], + "function": "minecraft:furnace_smelt" + }, + { + "count": { + "type": "minecraft:uniform", + "max": 1.0, + "min": 0.0 + }, + "function": "minecraft:looting_enchant" + } + ], + "name": "twilightforest:raw_venison" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/entities/dwarf_rabbit.json b/src/generated/resources/data/twilightforest/loot_tables/entities/dwarf_rabbit.json new file mode 100644 index 0000000000..9d6253759b --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/entities/dwarf_rabbit.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:entity", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:loot_table", + "name": "minecraft:entities/rabbit" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/entities/fire_beetle.json b/src/generated/resources/data/twilightforest/loot_tables/entities/fire_beetle.json new file mode 100644 index 0000000000..9e588daebb --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/entities/fire_beetle.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:entity", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:loot_table", + "name": "minecraft:entities/creeper" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/entities/giant_miner.json b/src/generated/resources/data/twilightforest/loot_tables/entities/giant_miner.json new file mode 100644 index 0000000000..9cd1a7db72 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/entities/giant_miner.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:entity", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:killed_by_player" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:giant_pickaxe" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/entities/harbinger_cube.json b/src/generated/resources/data/twilightforest/loot_tables/entities/harbinger_cube.json new file mode 100644 index 0000000000..601c1935a9 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/entities/harbinger_cube.json @@ -0,0 +1,3 @@ +{ + "type": "minecraft:entity" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/entities/hedge_spider.json b/src/generated/resources/data/twilightforest/loot_tables/entities/hedge_spider.json new file mode 100644 index 0000000000..174c1794f0 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/entities/hedge_spider.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:entity", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:loot_table", + "name": "minecraft:entities/spider" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/entities/helmet_crab.json b/src/generated/resources/data/twilightforest/loot_tables/entities/helmet_crab.json new file mode 100644 index 0000000000..82c663268f --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/entities/helmet_crab.json @@ -0,0 +1,84 @@ +{ + "type": "minecraft:entity", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 2.0, + "min": 0.0 + }, + "function": "minecraft:set_count" + }, + { + "count": { + "type": "minecraft:uniform", + "max": 1.0, + "min": 0.0 + }, + "function": "minecraft:looting_enchant" + } + ], + "name": "twilightforest:armor_shard" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "conditions": [ + { + "chance": 0.5, + "condition": "minecraft:random_chance_with_looting", + "looting_multiplier": 0.1 + } + ], + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 1.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + }, + { + "conditions": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "flags": { + "is_on_fire": true + } + } + } + ], + "function": "minecraft:furnace_smelt" + }, + { + "count": { + "type": "minecraft:uniform", + "max": 1.0, + "min": 0.0 + }, + "function": "minecraft:looting_enchant" + } + ], + "name": "minecraft:cod" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/entities/hostile_wolf.json b/src/generated/resources/data/twilightforest/loot_tables/entities/hostile_wolf.json new file mode 100644 index 0000000000..1cbdaab7c7 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/entities/hostile_wolf.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:entity", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:loot_table", + "name": "minecraft:entities/wolf" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/entities/hydra.json b/src/generated/resources/data/twilightforest/loot_tables/entities/hydra.json new file mode 100644 index 0000000000..37426aec8b --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/entities/hydra.json @@ -0,0 +1,73 @@ +{ + "type": "minecraft:entity", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 35.0, + "min": 5.0 + }, + "function": "minecraft:set_count" + }, + { + "count": { + "type": "minecraft:uniform", + "max": 1.0, + "min": 0.0 + }, + "function": "minecraft:looting_enchant" + } + ], + "name": "twilightforest:hydra_chop" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 10.0, + "min": 7.0 + }, + "function": "minecraft:set_count" + }, + { + "count": { + "type": "minecraft:uniform", + "max": 2.0, + "min": 0.0 + }, + "function": "minecraft:looting_enchant" + } + ], + "name": "twilightforest:fiery_blood" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:hydra_trophy" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/entities/ice_crystal.json b/src/generated/resources/data/twilightforest/loot_tables/entities/ice_crystal.json new file mode 100644 index 0000000000..e4f3d2b5f4 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/entities/ice_crystal.json @@ -0,0 +1,34 @@ +{ + "type": "minecraft:entity", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 2.0, + "min": 0.0 + }, + "function": "minecraft:set_count" + }, + { + "count": { + "type": "minecraft:uniform", + "max": 1.0, + "min": 0.0 + }, + "function": "minecraft:looting_enchant" + } + ], + "name": "minecraft:snowball" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/entities/king_spider.json b/src/generated/resources/data/twilightforest/loot_tables/entities/king_spider.json new file mode 100644 index 0000000000..174c1794f0 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/entities/king_spider.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:entity", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:loot_table", + "name": "minecraft:entities/spider" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/entities/knight_phantom.json b/src/generated/resources/data/twilightforest/loot_tables/entities/knight_phantom.json new file mode 100644 index 0000000000..601c1935a9 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/entities/knight_phantom.json @@ -0,0 +1,3 @@ +{ + "type": "minecraft:entity" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/entities/kobold.json b/src/generated/resources/data/twilightforest/loot_tables/entities/kobold.json new file mode 100644 index 0000000000..ef0cfc3330 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/entities/kobold.json @@ -0,0 +1,68 @@ +{ + "type": "minecraft:entity", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 2.0, + "min": 0.0 + }, + "function": "minecraft:set_count" + }, + { + "count": { + "type": "minecraft:uniform", + "max": 1.0, + "min": 0.0 + }, + "function": "minecraft:looting_enchant" + } + ], + "name": "minecraft:wheat" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:killed_by_player" + } + ], + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 1.0, + "min": -1.0 + }, + "function": "minecraft:set_count" + }, + { + "count": { + "type": "minecraft:uniform", + "max": 1.0, + "min": 0.0 + }, + "function": "minecraft:looting_enchant" + } + ], + "name": "minecraft:gold_nugget" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/entities/lich.json b/src/generated/resources/data/twilightforest/loot_tables/entities/lich.json new file mode 100644 index 0000000000..19ecdeba7e --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/entities/lich.json @@ -0,0 +1,180 @@ +{ + "type": "minecraft:entity", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:twilight_scepter" + }, + { + "type": "minecraft:item", + "name": "twilightforest:lifedrain_scepter" + }, + { + "type": "minecraft:item", + "name": "twilightforest:zombie_scepter" + }, + { + "type": "minecraft:item", + "name": "twilightforest:fortification_scepter" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:enchant_with_levels", + "levels": { + "type": "minecraft:uniform", + "max": 40.0, + "min": 10.0 + }, + "treasure": false + } + ], + "name": "minecraft:golden_sword" + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:enchant_with_levels", + "levels": { + "type": "minecraft:uniform", + "max": 40.0, + "min": 10.0 + }, + "treasure": false + } + ], + "name": "minecraft:golden_helmet" + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:enchant_with_levels", + "levels": { + "type": "minecraft:uniform", + "max": 40.0, + "min": 10.0 + }, + "treasure": false + } + ], + "name": "minecraft:golden_chestplate" + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:enchant_with_levels", + "levels": { + "type": "minecraft:uniform", + "max": 40.0, + "min": 10.0 + }, + "treasure": false + } + ], + "name": "minecraft:golden_leggings" + }, + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:enchant_with_levels", + "levels": { + "type": "minecraft:uniform", + "max": 40.0, + "min": 10.0 + }, + "treasure": false + } + ], + "name": "minecraft:golden_boots" + } + ], + "rolls": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 2.0 + } + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + }, + { + "count": { + "type": "minecraft:uniform", + "max": 1.0, + "min": 0.0 + }, + "function": "minecraft:looting_enchant" + } + ], + "name": "minecraft:ender_pearl" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 9.0, + "min": 5.0 + }, + "function": "minecraft:set_count" + }, + { + "count": { + "type": "minecraft:uniform", + "max": 1.0, + "min": 0.0 + }, + "function": "minecraft:looting_enchant" + } + ], + "name": "minecraft:bone" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:lich_trophy" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/entities/lich_minion.json b/src/generated/resources/data/twilightforest/loot_tables/entities/lich_minion.json new file mode 100644 index 0000000000..601c1935a9 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/entities/lich_minion.json @@ -0,0 +1,3 @@ +{ + "type": "minecraft:entity" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/entities/lower_goblin_knight.json b/src/generated/resources/data/twilightforest/loot_tables/entities/lower_goblin_knight.json new file mode 100644 index 0000000000..9ffdc50d10 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/entities/lower_goblin_knight.json @@ -0,0 +1,34 @@ +{ + "type": "minecraft:entity", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 2.0, + "min": 0.0 + }, + "function": "minecraft:set_count" + }, + { + "count": { + "type": "minecraft:uniform", + "max": 1.0, + "min": 0.0 + }, + "function": "minecraft:looting_enchant" + } + ], + "name": "twilightforest:armor_shard" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/entities/loyal_zombie.json b/src/generated/resources/data/twilightforest/loot_tables/entities/loyal_zombie.json new file mode 100644 index 0000000000..601c1935a9 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/entities/loyal_zombie.json @@ -0,0 +1,3 @@ +{ + "type": "minecraft:entity" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/entities/maze_slime.json b/src/generated/resources/data/twilightforest/loot_tables/entities/maze_slime.json new file mode 100644 index 0000000000..7d6aa42799 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/entities/maze_slime.json @@ -0,0 +1,47 @@ +{ + "type": "minecraft:entity", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": 1.0, + "function": "minecraft:set_count" + }, + { + "count": { + "type": "minecraft:uniform", + "max": 1.0, + "min": 0.0 + }, + "function": "minecraft:looting_enchant" + } + ], + "name": "minecraft:slime_ball" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "conditions": [ + { + "chance": 0.015, + "condition": "minecraft:random_chance_with_looting", + "looting_multiplier": 0.005 + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:charm_of_keeping_1" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/entities/minoshroom.json b/src/generated/resources/data/twilightforest/loot_tables/entities/minoshroom.json new file mode 100644 index 0000000000..c588bae6fb --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/entities/minoshroom.json @@ -0,0 +1,49 @@ +{ + "type": "minecraft:entity", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "count": { + "type": "minecraft:uniform", + "max": 1.0, + "min": 0.0 + }, + "function": "minecraft:looting_enchant" + } + ], + "name": "twilightforest:meef_stroganoff" + } + ], + "rolls": { + "type": "minecraft:uniform", + "max": 5.0, + "min": 2.0 + } + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:minoshroom_trophy" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:diamond_minotaur_axe" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/entities/minotaur.json b/src/generated/resources/data/twilightforest/loot_tables/entities/minotaur.json new file mode 100644 index 0000000000..89d9c92a35 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/entities/minotaur.json @@ -0,0 +1,61 @@ +{ + "type": "minecraft:entity", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": 1.0, + "function": "minecraft:set_count" + }, + { + "count": { + "type": "minecraft:uniform", + "max": 1.0, + "min": 0.0 + }, + "function": "minecraft:looting_enchant" + }, + { + "conditions": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "flags": { + "is_on_fire": true + } + } + } + ], + "function": "minecraft:furnace_smelt" + } + ], + "name": "twilightforest:raw_meef" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "conditions": [ + { + "chance": 0.025, + "condition": "minecraft:random_chance_with_looting", + "looting_multiplier": 0.01 + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:maze_map_focus" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/entities/mist_wolf.json b/src/generated/resources/data/twilightforest/loot_tables/entities/mist_wolf.json new file mode 100644 index 0000000000..1cbdaab7c7 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/entities/mist_wolf.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:entity", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:loot_table", + "name": "minecraft:entities/wolf" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/entities/mosquito_swarm.json b/src/generated/resources/data/twilightforest/loot_tables/entities/mosquito_swarm.json new file mode 100644 index 0000000000..601c1935a9 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/entities/mosquito_swarm.json @@ -0,0 +1,3 @@ +{ + "type": "minecraft:entity" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/entities/naga.json b/src/generated/resources/data/twilightforest/loot_tables/entities/naga.json new file mode 100644 index 0000000000..e042f3c38a --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/entities/naga.json @@ -0,0 +1,44 @@ +{ + "type": "minecraft:entity", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 11.0, + "min": 6.0 + }, + "function": "minecraft:set_count" + }, + { + "count": { + "type": "minecraft:uniform", + "max": 1.0, + "min": 0.0 + }, + "function": "minecraft:looting_enchant" + } + ], + "name": "twilightforest:naga_scale" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:naga_trophy" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/entities/penguin.json b/src/generated/resources/data/twilightforest/loot_tables/entities/penguin.json new file mode 100644 index 0000000000..5872867c97 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/entities/penguin.json @@ -0,0 +1,34 @@ +{ + "type": "minecraft:entity", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 2.0, + "min": 0.0 + }, + "function": "minecraft:set_count" + }, + { + "count": { + "type": "minecraft:uniform", + "max": 1.0, + "min": 0.0 + }, + "function": "minecraft:looting_enchant" + } + ], + "name": "minecraft:feather" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/entities/pinch_beetle.json b/src/generated/resources/data/twilightforest/loot_tables/entities/pinch_beetle.json new file mode 100644 index 0000000000..601c1935a9 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/entities/pinch_beetle.json @@ -0,0 +1,3 @@ +{ + "type": "minecraft:entity" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/entities/plateau_boss.json b/src/generated/resources/data/twilightforest/loot_tables/entities/plateau_boss.json new file mode 100644 index 0000000000..601c1935a9 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/entities/plateau_boss.json @@ -0,0 +1,3 @@ +{ + "type": "minecraft:entity" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/entities/quest_ram.json b/src/generated/resources/data/twilightforest/loot_tables/entities/quest_ram.json new file mode 100644 index 0000000000..601c1935a9 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/entities/quest_ram.json @@ -0,0 +1,3 @@ +{ + "type": "minecraft:entity" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/entities/questing_ram_rewards.json b/src/generated/resources/data/twilightforest/loot_tables/entities/questing_ram_rewards.json new file mode 100644 index 0000000000..c5b8248b71 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/entities/questing_ram_rewards.json @@ -0,0 +1,31 @@ +{ + "type": "minecraft:entity", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:crumble_horn" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:set_nbt", + "tag": "{Items:[{Count:1b,id:\"twilightforest:quest_ram_trophy\"},{Count:1b,id:\"minecraft:coal_block\"},{Count:1b,id:\"minecraft:iron_block\"},{Count:1b,id:\"minecraft:copper_block\"},{Count:1b,id:\"minecraft:lapis_block\"},{Count:1b,id:\"minecraft:gold_block\"},{Count:1b,id:\"minecraft:diamond_block\"},{Count:1b,id:\"minecraft:emerald_block\"}]}" + } + ], + "name": "minecraft:bundle" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/entities/raven.json b/src/generated/resources/data/twilightforest/loot_tables/entities/raven.json new file mode 100644 index 0000000000..68912ac32d --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/entities/raven.json @@ -0,0 +1,34 @@ +{ + "type": "minecraft:entity", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 2.0, + "min": 0.0 + }, + "function": "minecraft:set_count" + }, + { + "count": { + "type": "minecraft:uniform", + "max": 1.0, + "min": 0.0 + }, + "function": "minecraft:looting_enchant" + } + ], + "name": "twilightforest:raven_feather" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/entities/redcap.json b/src/generated/resources/data/twilightforest/loot_tables/entities/redcap.json new file mode 100644 index 0000000000..1f87839680 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/entities/redcap.json @@ -0,0 +1,34 @@ +{ + "type": "minecraft:entity", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 1.0, + "min": 0.0 + }, + "function": "minecraft:set_count" + }, + { + "count": { + "type": "minecraft:uniform", + "max": 1.0, + "min": 0.0 + }, + "function": "minecraft:looting_enchant" + } + ], + "name": "minecraft:coal" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/entities/redcap_sapper.json b/src/generated/resources/data/twilightforest/loot_tables/entities/redcap_sapper.json new file mode 100644 index 0000000000..a3d789863d --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/entities/redcap_sapper.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:entity", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:loot_table", + "name": "twilightforest:entities/redcap" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/entities/rising_zombie.json b/src/generated/resources/data/twilightforest/loot_tables/entities/rising_zombie.json new file mode 100644 index 0000000000..21c065f095 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/entities/rising_zombie.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:entity", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:loot_table", + "name": "minecraft:entities/zombie" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/entities/roving_cube.json b/src/generated/resources/data/twilightforest/loot_tables/entities/roving_cube.json new file mode 100644 index 0000000000..601c1935a9 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/entities/roving_cube.json @@ -0,0 +1,3 @@ +{ + "type": "minecraft:entity" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/entities/skeleton_druid.json b/src/generated/resources/data/twilightforest/loot_tables/entities/skeleton_druid.json new file mode 100644 index 0000000000..d3986be9b0 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/entities/skeleton_druid.json @@ -0,0 +1,63 @@ +{ + "type": "minecraft:entity", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 2.0, + "min": 0.0 + }, + "function": "minecraft:set_count" + }, + { + "count": { + "type": "minecraft:uniform", + "max": 1.0, + "min": 0.0 + }, + "function": "minecraft:looting_enchant" + } + ], + "name": "minecraft:bone" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 2.0, + "min": 0.0 + }, + "function": "minecraft:set_count" + }, + { + "count": { + "type": "minecraft:uniform", + "max": 1.0, + "min": 0.0 + }, + "function": "minecraft:looting_enchant" + } + ], + "name": "twilightforest:torchberries" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/entities/slime_beetle.json b/src/generated/resources/data/twilightforest/loot_tables/entities/slime_beetle.json new file mode 100644 index 0000000000..67c4fb2928 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/entities/slime_beetle.json @@ -0,0 +1,34 @@ +{ + "type": "minecraft:entity", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 2.0, + "min": 0.0 + }, + "function": "minecraft:set_count" + }, + { + "count": { + "type": "minecraft:uniform", + "max": 1.0, + "min": 0.0 + }, + "function": "minecraft:looting_enchant" + } + ], + "name": "minecraft:slime_ball" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/entities/snow_guardian.json b/src/generated/resources/data/twilightforest/loot_tables/entities/snow_guardian.json new file mode 100644 index 0000000000..e4f3d2b5f4 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/entities/snow_guardian.json @@ -0,0 +1,34 @@ +{ + "type": "minecraft:entity", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 2.0, + "min": 0.0 + }, + "function": "minecraft:set_count" + }, + { + "count": { + "type": "minecraft:uniform", + "max": 1.0, + "min": 0.0 + }, + "function": "minecraft:looting_enchant" + } + ], + "name": "minecraft:snowball" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/entities/snow_queen.json b/src/generated/resources/data/twilightforest/loot_tables/entities/snow_queen.json new file mode 100644 index 0000000000..6773b52fae --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/entities/snow_queen.json @@ -0,0 +1,79 @@ +{ + "type": "minecraft:entity", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:triple_bow" + }, + { + "type": "minecraft:item", + "name": "twilightforest:seeker_bow" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": 7.0, + "function": "minecraft:set_count" + }, + { + "count": { + "type": "minecraft:uniform", + "max": 1.0, + "min": 0.0 + }, + "function": "minecraft:looting_enchant" + } + ], + "name": "minecraft:packed_ice" + } + ], + "rolls": { + "type": "minecraft:uniform", + "max": 4.0, + "min": 1.0 + } + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": 16.0, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:snowball" + } + ], + "rolls": { + "type": "minecraft:uniform", + "max": 5.0, + "min": 2.0 + } + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:snow_queen_trophy" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/entities/squirrel.json b/src/generated/resources/data/twilightforest/loot_tables/entities/squirrel.json new file mode 100644 index 0000000000..601c1935a9 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/entities/squirrel.json @@ -0,0 +1,3 @@ +{ + "type": "minecraft:entity" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/entities/stable_ice_core.json b/src/generated/resources/data/twilightforest/loot_tables/entities/stable_ice_core.json new file mode 100644 index 0000000000..e4f3d2b5f4 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/entities/stable_ice_core.json @@ -0,0 +1,34 @@ +{ + "type": "minecraft:entity", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 2.0, + "min": 0.0 + }, + "function": "minecraft:set_count" + }, + { + "count": { + "type": "minecraft:uniform", + "max": 1.0, + "min": 0.0 + }, + "function": "minecraft:looting_enchant" + } + ], + "name": "minecraft:snowball" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/entities/swarm_spider.json b/src/generated/resources/data/twilightforest/loot_tables/entities/swarm_spider.json new file mode 100644 index 0000000000..174c1794f0 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/entities/swarm_spider.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:entity", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:loot_table", + "name": "minecraft:entities/spider" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/entities/tiny_bird.json b/src/generated/resources/data/twilightforest/loot_tables/entities/tiny_bird.json new file mode 100644 index 0000000000..5872867c97 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/entities/tiny_bird.json @@ -0,0 +1,34 @@ +{ + "type": "minecraft:entity", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 2.0, + "min": 0.0 + }, + "function": "minecraft:set_count" + }, + { + "count": { + "type": "minecraft:uniform", + "max": 1.0, + "min": 0.0 + }, + "function": "minecraft:looting_enchant" + } + ], + "name": "minecraft:feather" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/entities/towerwood_borer.json b/src/generated/resources/data/twilightforest/loot_tables/entities/towerwood_borer.json new file mode 100644 index 0000000000..797d979a5f --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/entities/towerwood_borer.json @@ -0,0 +1,34 @@ +{ + "type": "minecraft:entity", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 2.0, + "min": 0.0 + }, + "function": "minecraft:set_count" + }, + { + "count": { + "type": "minecraft:uniform", + "max": 1.0, + "min": 0.0 + }, + "function": "minecraft:looting_enchant" + } + ], + "name": "twilightforest:borer_essence" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/entities/troll.json b/src/generated/resources/data/twilightforest/loot_tables/entities/troll.json new file mode 100644 index 0000000000..9e0200c076 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/entities/troll.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:entity", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "chance": 0.025, + "condition": "minecraft:random_chance_with_looting", + "looting_multiplier": 0.01 + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:magic_beans" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/entities/unstable_ice_core.json b/src/generated/resources/data/twilightforest/loot_tables/entities/unstable_ice_core.json new file mode 100644 index 0000000000..e4f3d2b5f4 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/entities/unstable_ice_core.json @@ -0,0 +1,34 @@ +{ + "type": "minecraft:entity", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 2.0, + "min": 0.0 + }, + "function": "minecraft:set_count" + }, + { + "count": { + "type": "minecraft:uniform", + "max": 1.0, + "min": 0.0 + }, + "function": "minecraft:looting_enchant" + } + ], + "name": "minecraft:snowball" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/entities/upper_goblin_knight.json b/src/generated/resources/data/twilightforest/loot_tables/entities/upper_goblin_knight.json new file mode 100644 index 0000000000..9ffdc50d10 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/entities/upper_goblin_knight.json @@ -0,0 +1,34 @@ +{ + "type": "minecraft:entity", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 2.0, + "min": 0.0 + }, + "function": "minecraft:set_count" + }, + { + "count": { + "type": "minecraft:uniform", + "max": 1.0, + "min": 0.0 + }, + "function": "minecraft:looting_enchant" + } + ], + "name": "twilightforest:armor_shard" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/entities/ur_ghast.json b/src/generated/resources/data/twilightforest/loot_tables/entities/ur_ghast.json new file mode 100644 index 0000000000..4c90081f6c --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/entities/ur_ghast.json @@ -0,0 +1,73 @@ +{ + "type": "minecraft:entity", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 3.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + }, + { + "count": { + "type": "minecraft:uniform", + "max": 1.0, + "min": 0.0 + }, + "function": "minecraft:looting_enchant" + } + ], + "name": "twilightforest:carminite" + } + ], + "rolls": 4.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 5.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + }, + { + "count": { + "type": "minecraft:uniform", + "max": 1.0, + "min": 0.0 + }, + "function": "minecraft:looting_enchant" + } + ], + "name": "twilightforest:fiery_tears" + } + ], + "rolls": 2.0 + }, + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "name": "twilightforest:ur_ghast_trophy" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/entities/winter_wolf.json b/src/generated/resources/data/twilightforest/loot_tables/entities/winter_wolf.json new file mode 100644 index 0000000000..5b54046e35 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/entities/winter_wolf.json @@ -0,0 +1,34 @@ +{ + "type": "minecraft:entity", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 2.0, + "min": 0.0 + }, + "function": "minecraft:set_count" + }, + { + "count": { + "type": "minecraft:uniform", + "max": 1.0, + "min": 0.0 + }, + "function": "minecraft:looting_enchant" + } + ], + "name": "twilightforest:arctic_fur" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/entities/wraith.json b/src/generated/resources/data/twilightforest/loot_tables/entities/wraith.json new file mode 100644 index 0000000000..2d90c7f1b4 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/entities/wraith.json @@ -0,0 +1,34 @@ +{ + "type": "minecraft:entity", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 2.0, + "min": 0.0 + }, + "function": "minecraft:set_count" + }, + { + "count": { + "type": "minecraft:uniform", + "max": 1.0, + "min": 0.0 + }, + "function": "minecraft:looting_enchant" + } + ], + "name": "minecraft:glowstone_dust" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/loot_tables/entities/yeti.json b/src/generated/resources/data/twilightforest/loot_tables/entities/yeti.json new file mode 100644 index 0000000000..5b54046e35 --- /dev/null +++ b/src/generated/resources/data/twilightforest/loot_tables/entities/yeti.json @@ -0,0 +1,34 @@ +{ + "type": "minecraft:entity", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 2.0, + "min": 0.0 + }, + "function": "minecraft:set_count" + }, + { + "count": { + "type": "minecraft:uniform", + "max": 1.0, + "min": 0.0 + }, + "function": "minecraft:looting_enchant" + } + ], + "name": "twilightforest:arctic_fur" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/alpha_yeti_banner_pattern.json b/src/generated/resources/data/twilightforest/recipes/alpha_yeti_banner_pattern.json new file mode 100644 index 0000000000..5248ce9b13 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/alpha_yeti_banner_pattern.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "tag": "forge:paper" + }, + { + "item": "twilightforest:alpha_yeti_trophy" + } + ], + "result": { + "item": "twilightforest:alpha_yeti_banner_pattern" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/aurora_pillar.json b/src/generated/resources/data/twilightforest/recipes/aurora_pillar.json new file mode 100644 index 0000000000..156b48ff8c --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/aurora_pillar.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "#": { + "item": "twilightforest:aurora_block" + } + }, + "pattern": [ + "#", + "#" + ], + "result": { + "count": 2, + "item": "twilightforest:aurora_pillar" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/berry_torch.json b/src/generated/resources/data/twilightforest/recipes/berry_torch.json new file mode 100644 index 0000000000..f43c89882c --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/berry_torch.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "|": { + "tag": "forge:rods/wooden" + }, + "∴": { + "item": "twilightforest:torchberries" + } + }, + "pattern": [ + "∴", + "|" + ], + "result": { + "count": 5, + "item": "minecraft:torch" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/canopy_boat.json b/src/generated/resources/data/twilightforest/recipes/canopy_boat.json new file mode 100644 index 0000000000..c5822eb054 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/canopy_boat.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "group": "boat", + "key": { + "P": { + "item": "twilightforest:canopy_planks" + } + }, + "pattern": [ + "P P", + "PPP" + ], + "result": { + "item": "twilightforest:canopy_boat" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/canopy_bookshelf.json b/src/generated/resources/data/twilightforest/recipes/canopy_bookshelf.json new file mode 100644 index 0000000000..83c9822382 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/canopy_bookshelf.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "-": { + "item": "twilightforest:canopy_planks" + }, + "B": { + "item": "minecraft:book" + } + }, + "pattern": [ + "---", + "B B", + "---" + ], + "result": { + "item": "twilightforest:canopy_bookshelf" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/canopy_chest_boat.json b/src/generated/resources/data/twilightforest/recipes/canopy_chest_boat.json new file mode 100644 index 0000000000..c9ddf45c19 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/canopy_chest_boat.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "group": "chest_boat", + "ingredients": [ + { + "item": "twilightforest:canopy_boat" + }, + { + "tag": "forge:chests/wooden" + } + ], + "result": { + "item": "twilightforest:canopy_chest_boat" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/carminite_builder.json b/src/generated/resources/data/twilightforest/recipes/carminite_builder.json new file mode 100644 index 0000000000..6aec830136 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/carminite_builder.json @@ -0,0 +1,24 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "redstone", + "key": { + "#": { + "item": "twilightforest:encased_towerwood" + }, + "6": { + "tag": "forge:gems/carminite" + }, + "o": { + "item": "minecraft:dispenser" + } + }, + "pattern": [ + "#6#", + "6o6", + "#6#" + ], + "result": { + "item": "twilightforest:carminite_builder" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/carminite_reactor.json b/src/generated/resources/data/twilightforest/recipes/carminite_reactor.json new file mode 100644 index 0000000000..63f9ba1281 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/carminite_reactor.json @@ -0,0 +1,24 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "redstone", + "key": { + "#": { + "item": "twilightforest:encased_towerwood" + }, + "%": { + "tag": "forge:ores/redstone" + }, + "6": { + "tag": "forge:gems/carminite" + } + }, + "pattern": [ + "#6#", + "6%6", + "#6#" + ], + "result": { + "item": "twilightforest:carminite_reactor" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/castleblock/bold_castle_brick_pillar.json b/src/generated/resources/data/twilightforest/recipes/castleblock/bold_castle_brick_pillar.json new file mode 100644 index 0000000000..dab32876b0 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/castleblock/bold_castle_brick_pillar.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "#": { + "item": "twilightforest:thick_castle_brick" + } + }, + "pattern": [ + "##", + "##" + ], + "result": { + "count": 4, + "item": "twilightforest:bold_castle_brick_pillar" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/castleblock/bold_castle_brick_stairs.json b/src/generated/resources/data/twilightforest/recipes/castleblock/bold_castle_brick_stairs.json new file mode 100644 index 0000000000..dc614298cd --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/castleblock/bold_castle_brick_stairs.json @@ -0,0 +1,24 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "#": [ + { + "item": "twilightforest:bold_castle_brick_pillar" + }, + { + "item": "twilightforest:bold_castle_brick_tile" + } + ] + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "result": { + "count": 8, + "item": "twilightforest:bold_castle_brick_stairs" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/castleblock/bold_castle_brick_tile.json b/src/generated/resources/data/twilightforest/recipes/castleblock/bold_castle_brick_tile.json new file mode 100644 index 0000000000..3f31ccd302 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/castleblock/bold_castle_brick_tile.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "#": { + "item": "twilightforest:bold_castle_brick_pillar" + } + }, + "pattern": [ + "##", + "##" + ], + "result": { + "count": 4, + "item": "twilightforest:bold_castle_brick_tile" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/castleblock/bold_castle_pillar_from_tile.json b/src/generated/resources/data/twilightforest/recipes/castleblock/bold_castle_pillar_from_tile.json new file mode 100644 index 0000000000..9749030eed --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/castleblock/bold_castle_pillar_from_tile.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "#": { + "item": "twilightforest:bold_castle_brick_tile" + } + }, + "pattern": [ + "##", + "##" + ], + "result": { + "count": 4, + "item": "twilightforest:bold_castle_brick_pillar" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/castleblock/castle_brick_stairs.json b/src/generated/resources/data/twilightforest/recipes/castleblock/castle_brick_stairs.json new file mode 100644 index 0000000000..5ba26c9cc2 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/castleblock/castle_brick_stairs.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "#": { + "item": "twilightforest:castle_brick" + } + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "result": { + "count": 8, + "item": "twilightforest:castle_brick_stairs" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/castleblock/cracked_castle_brick_stairs.json b/src/generated/resources/data/twilightforest/recipes/castleblock/cracked_castle_brick_stairs.json new file mode 100644 index 0000000000..246c457530 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/castleblock/cracked_castle_brick_stairs.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "#": { + "item": "twilightforest:cracked_castle_brick" + } + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "result": { + "count": 8, + "item": "twilightforest:cracked_castle_brick_stairs" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/castleblock/encased_castle_brick_stairs.json b/src/generated/resources/data/twilightforest/recipes/castleblock/encased_castle_brick_stairs.json new file mode 100644 index 0000000000..5b7c045ff9 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/castleblock/encased_castle_brick_stairs.json @@ -0,0 +1,24 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "#": [ + { + "item": "twilightforest:encased_castle_brick_pillar" + }, + { + "item": "twilightforest:encased_castle_brick_tile" + } + ] + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "result": { + "count": 8, + "item": "twilightforest:encased_castle_brick_stairs" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/castleblock/encased_castle_pillar.json b/src/generated/resources/data/twilightforest/recipes/castleblock/encased_castle_pillar.json new file mode 100644 index 0000000000..233019356f --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/castleblock/encased_castle_pillar.json @@ -0,0 +1,46 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "#": [ + { + "item": "twilightforest:castle_brick" + }, + { + "item": "twilightforest:worn_castle_brick" + }, + { + "item": "twilightforest:cracked_castle_brick" + }, + { + "item": "twilightforest:mossy_castle_brick" + }, + { + "item": "twilightforest:thick_castle_brick" + } + ], + "H": [ + { + "item": "twilightforest:encased_castle_brick_pillar" + }, + { + "item": "twilightforest:encased_castle_brick_tile" + }, + { + "item": "twilightforest:bold_castle_brick_pillar" + }, + { + "item": "twilightforest:bold_castle_brick_tile" + } + ] + }, + "pattern": [ + "#H#", + "#H#" + ], + "result": { + "count": 6, + "item": "twilightforest:encased_castle_brick_pillar" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/castleblock/mossy_castle_brick.json b/src/generated/resources/data/twilightforest/recipes/castleblock/mossy_castle_brick.json new file mode 100644 index 0000000000..c1062c5451 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/castleblock/mossy_castle_brick.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + [ + { + "item": "minecraft:vine" + }, + { + "item": "minecraft:moss_block" + } + ], + { + "item": "twilightforest:castle_brick" + } + ], + "result": { + "item": "twilightforest:mossy_castle_brick" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/castleblock/mossy_castle_brick_stairs.json b/src/generated/resources/data/twilightforest/recipes/castleblock/mossy_castle_brick_stairs.json new file mode 100644 index 0000000000..6123bca950 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/castleblock/mossy_castle_brick_stairs.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "#": { + "item": "twilightforest:mossy_castle_brick" + } + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "result": { + "count": 8, + "item": "twilightforest:mossy_castle_brick_stairs" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/castleblock/smelted_cracked_castle_brick.json b/src/generated/resources/data/twilightforest/recipes/castleblock/smelted_cracked_castle_brick.json new file mode 100644 index 0000000000..0579aece79 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/castleblock/smelted_cracked_castle_brick.json @@ -0,0 +1,10 @@ +{ + "type": "minecraft:smelting", + "category": "blocks", + "cookingtime": 200, + "experience": 0.3, + "ingredient": { + "item": "twilightforest:castle_brick" + }, + "result": "twilightforest:cracked_castle_brick" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/castleblock/thick_castle_brick.json b/src/generated/resources/data/twilightforest/recipes/castleblock/thick_castle_brick.json new file mode 100644 index 0000000000..b5043a9a2b --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/castleblock/thick_castle_brick.json @@ -0,0 +1,29 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "#": [ + { + "item": "twilightforest:castle_brick" + }, + { + "item": "twilightforest:worn_castle_brick" + }, + { + "item": "twilightforest:cracked_castle_brick" + }, + { + "item": "twilightforest:mossy_castle_brick" + } + ] + }, + "pattern": [ + "##", + "##" + ], + "result": { + "count": 4, + "item": "twilightforest:thick_castle_brick" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/castleblock/worn_castle_brick_stairs.json b/src/generated/resources/data/twilightforest/recipes/castleblock/worn_castle_brick_stairs.json new file mode 100644 index 0000000000..5ede57527a --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/castleblock/worn_castle_brick_stairs.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "#": { + "item": "twilightforest:worn_castle_brick" + } + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "result": { + "count": 8, + "item": "twilightforest:worn_castle_brick_stairs" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/charm_of_keeping_2.json b/src/generated/resources/data/twilightforest/recipes/charm_of_keeping_2.json new file mode 100644 index 0000000000..165ee24cef --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/charm_of_keeping_2.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "equipment", + "ingredients": [ + { + "item": "twilightforest:charm_of_keeping_1" + }, + { + "item": "twilightforest:charm_of_keeping_1" + }, + { + "item": "twilightforest:charm_of_keeping_1" + }, + { + "item": "twilightforest:charm_of_keeping_1" + } + ], + "result": { + "item": "twilightforest:charm_of_keeping_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/charm_of_keeping_3.json b/src/generated/resources/data/twilightforest/recipes/charm_of_keeping_3.json new file mode 100644 index 0000000000..7b82732425 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/charm_of_keeping_3.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "equipment", + "ingredients": [ + { + "item": "twilightforest:charm_of_keeping_2" + }, + { + "item": "twilightforest:charm_of_keeping_2" + }, + { + "item": "twilightforest:charm_of_keeping_2" + }, + { + "item": "twilightforest:charm_of_keeping_2" + } + ], + "result": { + "item": "twilightforest:charm_of_keeping_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/charm_of_life_2.json b/src/generated/resources/data/twilightforest/recipes/charm_of_life_2.json new file mode 100644 index 0000000000..e388043134 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/charm_of_life_2.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "equipment", + "ingredients": [ + { + "item": "twilightforest:charm_of_life_1" + }, + { + "item": "twilightforest:charm_of_life_1" + }, + { + "item": "twilightforest:charm_of_life_1" + }, + { + "item": "twilightforest:charm_of_life_1" + } + ], + "result": { + "item": "twilightforest:charm_of_life_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/cicada_jar.json b/src/generated/resources/data/twilightforest/recipes/cicada_jar.json new file mode 100644 index 0000000000..a3a5f662f8 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/cicada_jar.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "twilightforest:cicada" + }, + { + "item": "minecraft:glass_bottle" + } + ], + "result": { + "item": "twilightforest:cicada_jar" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/compressed_blocks/arctic_block.json b/src/generated/resources/data/twilightforest/recipes/compressed_blocks/arctic_block.json new file mode 100644 index 0000000000..9d555f6c93 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/compressed_blocks/arctic_block.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "#": { + "tag": "twilightforest:arctic_fur" + } + }, + "pattern": [ + "###", + "###", + "###" + ], + "result": { + "item": "twilightforest:arctic_fur_block" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/compressed_blocks/carminite_block.json b/src/generated/resources/data/twilightforest/recipes/compressed_blocks/carminite_block.json new file mode 100644 index 0000000000..53e40d7395 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/compressed_blocks/carminite_block.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "#": { + "tag": "forge:gems/carminite" + } + }, + "pattern": [ + "###", + "###", + "###" + ], + "result": { + "item": "twilightforest:carminite_block" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/compressed_blocks/fiery_block.json b/src/generated/resources/data/twilightforest/recipes/compressed_blocks/fiery_block.json new file mode 100644 index 0000000000..9a03418636 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/compressed_blocks/fiery_block.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "#": { + "tag": "forge:ingots/fiery" + } + }, + "pattern": [ + "###", + "###", + "###" + ], + "result": { + "item": "twilightforest:fiery_block" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/compressed_blocks/ironwood_block.json b/src/generated/resources/data/twilightforest/recipes/compressed_blocks/ironwood_block.json new file mode 100644 index 0000000000..2f781ef82f --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/compressed_blocks/ironwood_block.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "#": { + "tag": "forge:ingots/ironwood" + } + }, + "pattern": [ + "###", + "###", + "###" + ], + "result": { + "item": "twilightforest:ironwood_block" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/compressed_blocks/knightmetal_block.json b/src/generated/resources/data/twilightforest/recipes/compressed_blocks/knightmetal_block.json new file mode 100644 index 0000000000..00f0d1399e --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/compressed_blocks/knightmetal_block.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "#": { + "tag": "forge:ingots/knightmetal" + } + }, + "pattern": [ + "###", + "###", + "###" + ], + "result": { + "item": "twilightforest:knightmetal_block" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/compressed_blocks/reversed/arctic_block_to_item.json b/src/generated/resources/data/twilightforest/recipes/compressed_blocks/reversed/arctic_block_to_item.json new file mode 100644 index 0000000000..92fdd35030 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/compressed_blocks/reversed/arctic_block_to_item.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "tag": "forge:storage_blocks/arctic_fur" + } + ], + "result": { + "count": 9, + "item": "twilightforest:arctic_fur" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/compressed_blocks/reversed/carminite_block_to_item.json b/src/generated/resources/data/twilightforest/recipes/compressed_blocks/reversed/carminite_block_to_item.json new file mode 100644 index 0000000000..d4612b4b4b --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/compressed_blocks/reversed/carminite_block_to_item.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "tag": "forge:storage_blocks/carminite" + } + ], + "result": { + "count": 9, + "item": "twilightforest:carminite" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/compressed_blocks/reversed/fiery_block_to_ingot.json b/src/generated/resources/data/twilightforest/recipes/compressed_blocks/reversed/fiery_block_to_ingot.json new file mode 100644 index 0000000000..e9dfbead67 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/compressed_blocks/reversed/fiery_block_to_ingot.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "tag": "forge:storage_blocks/fiery" + } + ], + "result": { + "count": 9, + "item": "twilightforest:fiery_ingot" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/compressed_blocks/reversed/ironwood_block_ingot.json b/src/generated/resources/data/twilightforest/recipes/compressed_blocks/reversed/ironwood_block_ingot.json new file mode 100644 index 0000000000..5055d74df2 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/compressed_blocks/reversed/ironwood_block_ingot.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "tag": "forge:storage_blocks/ironwood" + } + ], + "result": { + "count": 9, + "item": "twilightforest:ironwood_ingot" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/compressed_blocks/reversed/knightmetal_block_ingot.json b/src/generated/resources/data/twilightforest/recipes/compressed_blocks/reversed/knightmetal_block_ingot.json new file mode 100644 index 0000000000..3a68aa1531 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/compressed_blocks/reversed/knightmetal_block_ingot.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "tag": "forge:storage_blocks/knightmetal" + } + ], + "result": { + "count": 9, + "item": "twilightforest:knightmetal_ingot" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/compressed_blocks/reversed/steeleaf_block_ingot.json b/src/generated/resources/data/twilightforest/recipes/compressed_blocks/reversed/steeleaf_block_ingot.json new file mode 100644 index 0000000000..249d5762ad --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/compressed_blocks/reversed/steeleaf_block_ingot.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "tag": "forge:storage_blocks/steeleaf" + } + ], + "result": { + "count": 9, + "item": "twilightforest:steeleaf_ingot" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/compressed_blocks/steeleaf_block.json b/src/generated/resources/data/twilightforest/recipes/compressed_blocks/steeleaf_block.json new file mode 100644 index 0000000000..2d54e70d19 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/compressed_blocks/steeleaf_block.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "#": { + "tag": "forge:ingots/steeleaf" + } + }, + "pattern": [ + "###", + "###", + "###" + ], + "result": { + "item": "twilightforest:steeleaf_block" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/crumble_horn/castle_brick_to_cracked_castle_brick.json b/src/generated/resources/data/twilightforest/recipes/crumble_horn/castle_brick_to_cracked_castle_brick.json new file mode 100644 index 0000000000..e6e911aa67 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/crumble_horn/castle_brick_to_cracked_castle_brick.json @@ -0,0 +1,5 @@ +{ + "type": "twilightforest:crumble_horn", + "from": "twilightforest:castle_brick", + "to": "twilightforest:cracked_castle_brick" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/crumble_horn/coarse_dirt_to_dirt.json b/src/generated/resources/data/twilightforest/recipes/crumble_horn/coarse_dirt_to_dirt.json new file mode 100644 index 0000000000..5b931e9c59 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/crumble_horn/coarse_dirt_to_dirt.json @@ -0,0 +1,5 @@ +{ + "type": "twilightforest:crumble_horn", + "from": "minecraft:coarse_dirt", + "to": "minecraft:dirt" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/crumble_horn/cobblestone_to_gravel.json b/src/generated/resources/data/twilightforest/recipes/crumble_horn/cobblestone_to_gravel.json new file mode 100644 index 0000000000..40bfa45f70 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/crumble_horn/cobblestone_to_gravel.json @@ -0,0 +1,5 @@ +{ + "type": "twilightforest:crumble_horn", + "from": "minecraft:cobblestone", + "to": "minecraft:gravel" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/crumble_horn/cracked_polished_blackstone_bricks_to_blackstone.json b/src/generated/resources/data/twilightforest/recipes/crumble_horn/cracked_polished_blackstone_bricks_to_blackstone.json new file mode 100644 index 0000000000..ad2f3d77a3 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/crumble_horn/cracked_polished_blackstone_bricks_to_blackstone.json @@ -0,0 +1,5 @@ +{ + "type": "twilightforest:crumble_horn", + "from": "minecraft:cracked_polished_blackstone_bricks", + "to": "minecraft:blackstone" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/crumble_horn/deadrock_to_cracked_deadrock.json b/src/generated/resources/data/twilightforest/recipes/crumble_horn/deadrock_to_cracked_deadrock.json new file mode 100644 index 0000000000..3a36774725 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/crumble_horn/deadrock_to_cracked_deadrock.json @@ -0,0 +1,5 @@ +{ + "type": "twilightforest:crumble_horn", + "from": "twilightforest:deadrock", + "to": "twilightforest:cracked_deadrock" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/crumble_horn/deepslate_bricks_to_cracked_deepslate_bricks.json b/src/generated/resources/data/twilightforest/recipes/crumble_horn/deepslate_bricks_to_cracked_deepslate_bricks.json new file mode 100644 index 0000000000..be33cda00f --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/crumble_horn/deepslate_bricks_to_cracked_deepslate_bricks.json @@ -0,0 +1,5 @@ +{ + "type": "twilightforest:crumble_horn", + "from": "minecraft:deepslate_bricks", + "to": "minecraft:cracked_deepslate_bricks" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/crumble_horn/deepslate_tiles_to_cracked_deepslate_tiles.json b/src/generated/resources/data/twilightforest/recipes/crumble_horn/deepslate_tiles_to_cracked_deepslate_tiles.json new file mode 100644 index 0000000000..c1f7da7945 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/crumble_horn/deepslate_tiles_to_cracked_deepslate_tiles.json @@ -0,0 +1,5 @@ +{ + "type": "twilightforest:crumble_horn", + "from": "minecraft:deepslate_tiles", + "to": "minecraft:cracked_deepslate_tiles" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/crumble_horn/dissolve_andesite.json b/src/generated/resources/data/twilightforest/recipes/crumble_horn/dissolve_andesite.json new file mode 100644 index 0000000000..700b9f5565 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/crumble_horn/dissolve_andesite.json @@ -0,0 +1,5 @@ +{ + "type": "twilightforest:crumble_horn", + "from": "minecraft:andesite", + "to": "minecraft:air" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/crumble_horn/dissolve_clay.json b/src/generated/resources/data/twilightforest/recipes/crumble_horn/dissolve_clay.json new file mode 100644 index 0000000000..b08caa00e3 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/crumble_horn/dissolve_clay.json @@ -0,0 +1,5 @@ +{ + "type": "twilightforest:crumble_horn", + "from": "minecraft:clay", + "to": "minecraft:air" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/crumble_horn/dissolve_diorite.json b/src/generated/resources/data/twilightforest/recipes/crumble_horn/dissolve_diorite.json new file mode 100644 index 0000000000..f48b046c0d --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/crumble_horn/dissolve_diorite.json @@ -0,0 +1,5 @@ +{ + "type": "twilightforest:crumble_horn", + "from": "minecraft:diorite", + "to": "minecraft:air" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/crumble_horn/dissolve_dirt.json b/src/generated/resources/data/twilightforest/recipes/crumble_horn/dissolve_dirt.json new file mode 100644 index 0000000000..35a68d1d98 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/crumble_horn/dissolve_dirt.json @@ -0,0 +1,5 @@ +{ + "type": "twilightforest:crumble_horn", + "from": "minecraft:dirt", + "to": "minecraft:air" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/crumble_horn/dissolve_granite.json b/src/generated/resources/data/twilightforest/recipes/crumble_horn/dissolve_granite.json new file mode 100644 index 0000000000..5d9285d660 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/crumble_horn/dissolve_granite.json @@ -0,0 +1,5 @@ +{ + "type": "twilightforest:crumble_horn", + "from": "minecraft:granite", + "to": "minecraft:air" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/crumble_horn/dissolve_gravel.json b/src/generated/resources/data/twilightforest/recipes/crumble_horn/dissolve_gravel.json new file mode 100644 index 0000000000..096c71a8e0 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/crumble_horn/dissolve_gravel.json @@ -0,0 +1,5 @@ +{ + "type": "twilightforest:crumble_horn", + "from": "minecraft:gravel", + "to": "minecraft:air" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/crumble_horn/dissolve_red_sand.json b/src/generated/resources/data/twilightforest/recipes/crumble_horn/dissolve_red_sand.json new file mode 100644 index 0000000000..a524d3a1ee --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/crumble_horn/dissolve_red_sand.json @@ -0,0 +1,5 @@ +{ + "type": "twilightforest:crumble_horn", + "from": "minecraft:red_sand", + "to": "minecraft:air" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/crumble_horn/dissolve_sand.json b/src/generated/resources/data/twilightforest/recipes/crumble_horn/dissolve_sand.json new file mode 100644 index 0000000000..5ca47c2b95 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/crumble_horn/dissolve_sand.json @@ -0,0 +1,5 @@ +{ + "type": "twilightforest:crumble_horn", + "from": "minecraft:sand", + "to": "minecraft:air" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/crumble_horn/etched_nagastone_to_cracked_etched_nagastone.json b/src/generated/resources/data/twilightforest/recipes/crumble_horn/etched_nagastone_to_cracked_etched_nagastone.json new file mode 100644 index 0000000000..b08689e03c --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/crumble_horn/etched_nagastone_to_cracked_etched_nagastone.json @@ -0,0 +1,5 @@ +{ + "type": "twilightforest:crumble_horn", + "from": "twilightforest:etched_nagastone", + "to": "twilightforest:cracked_etched_nagastone" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/crumble_horn/exposed_copper_to_copper_block.json b/src/generated/resources/data/twilightforest/recipes/crumble_horn/exposed_copper_to_copper_block.json new file mode 100644 index 0000000000..5b6f96cc41 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/crumble_horn/exposed_copper_to_copper_block.json @@ -0,0 +1,5 @@ +{ + "type": "twilightforest:crumble_horn", + "from": "minecraft:exposed_copper", + "to": "minecraft:copper_block" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/crumble_horn/exposed_cut_copper_to_cut_copper.json b/src/generated/resources/data/twilightforest/recipes/crumble_horn/exposed_cut_copper_to_cut_copper.json new file mode 100644 index 0000000000..ce70ddfeaa --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/crumble_horn/exposed_cut_copper_to_cut_copper.json @@ -0,0 +1,5 @@ +{ + "type": "twilightforest:crumble_horn", + "from": "minecraft:exposed_cut_copper", + "to": "minecraft:cut_copper" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/crumble_horn/grass_block_to_dirt.json b/src/generated/resources/data/twilightforest/recipes/crumble_horn/grass_block_to_dirt.json new file mode 100644 index 0000000000..747947bbc0 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/crumble_horn/grass_block_to_dirt.json @@ -0,0 +1,5 @@ +{ + "type": "twilightforest:crumble_horn", + "from": "minecraft:grass_block", + "to": "minecraft:dirt" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/crumble_horn/mazestone_brick_to_cracked_mazestone.json b/src/generated/resources/data/twilightforest/recipes/crumble_horn/mazestone_brick_to_cracked_mazestone.json new file mode 100644 index 0000000000..b76ecee6a9 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/crumble_horn/mazestone_brick_to_cracked_mazestone.json @@ -0,0 +1,5 @@ +{ + "type": "twilightforest:crumble_horn", + "from": "twilightforest:mazestone_brick", + "to": "twilightforest:cracked_mazestone" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/crumble_horn/mycelium_to_dirt.json b/src/generated/resources/data/twilightforest/recipes/crumble_horn/mycelium_to_dirt.json new file mode 100644 index 0000000000..ecd609fee8 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/crumble_horn/mycelium_to_dirt.json @@ -0,0 +1,5 @@ +{ + "type": "twilightforest:crumble_horn", + "from": "minecraft:mycelium", + "to": "minecraft:dirt" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/crumble_horn/nagastone_pillar_to_cracked_nagastone_pillar.json b/src/generated/resources/data/twilightforest/recipes/crumble_horn/nagastone_pillar_to_cracked_nagastone_pillar.json new file mode 100644 index 0000000000..9e3301a242 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/crumble_horn/nagastone_pillar_to_cracked_nagastone_pillar.json @@ -0,0 +1,5 @@ +{ + "type": "twilightforest:crumble_horn", + "from": "twilightforest:nagastone_pillar", + "to": "twilightforest:cracked_nagastone_pillar" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/crumble_horn/nether_bricks_to_cracked_nether_bricks.json b/src/generated/resources/data/twilightforest/recipes/crumble_horn/nether_bricks_to_cracked_nether_bricks.json new file mode 100644 index 0000000000..efe9eb5cf1 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/crumble_horn/nether_bricks_to_cracked_nether_bricks.json @@ -0,0 +1,5 @@ +{ + "type": "twilightforest:crumble_horn", + "from": "minecraft:nether_bricks", + "to": "minecraft:cracked_nether_bricks" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/crumble_horn/oxidized_copper_to_weathered_copper.json b/src/generated/resources/data/twilightforest/recipes/crumble_horn/oxidized_copper_to_weathered_copper.json new file mode 100644 index 0000000000..4f354800e2 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/crumble_horn/oxidized_copper_to_weathered_copper.json @@ -0,0 +1,5 @@ +{ + "type": "twilightforest:crumble_horn", + "from": "minecraft:oxidized_copper", + "to": "minecraft:weathered_copper" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/crumble_horn/oxidized_cut_copper_to_weathered_cut_copper.json b/src/generated/resources/data/twilightforest/recipes/crumble_horn/oxidized_cut_copper_to_weathered_cut_copper.json new file mode 100644 index 0000000000..6b93e19e99 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/crumble_horn/oxidized_cut_copper_to_weathered_cut_copper.json @@ -0,0 +1,5 @@ +{ + "type": "twilightforest:crumble_horn", + "from": "minecraft:oxidized_cut_copper", + "to": "minecraft:weathered_cut_copper" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/crumble_horn/podzol_to_dirt.json b/src/generated/resources/data/twilightforest/recipes/crumble_horn/podzol_to_dirt.json new file mode 100644 index 0000000000..7bdc54a0b9 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/crumble_horn/podzol_to_dirt.json @@ -0,0 +1,5 @@ +{ + "type": "twilightforest:crumble_horn", + "from": "minecraft:podzol", + "to": "minecraft:dirt" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/crumble_horn/polished_blackstone_bricks_to_cracked_polished_blackstone_bricks.json b/src/generated/resources/data/twilightforest/recipes/crumble_horn/polished_blackstone_bricks_to_cracked_polished_blackstone_bricks.json new file mode 100644 index 0000000000..1bded9c6f6 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/crumble_horn/polished_blackstone_bricks_to_cracked_polished_blackstone_bricks.json @@ -0,0 +1,5 @@ +{ + "type": "twilightforest:crumble_horn", + "from": "minecraft:polished_blackstone_bricks", + "to": "minecraft:cracked_polished_blackstone_bricks" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/crumble_horn/red_sandstone_to_red_sand.json b/src/generated/resources/data/twilightforest/recipes/crumble_horn/red_sandstone_to_red_sand.json new file mode 100644 index 0000000000..301b404c4d --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/crumble_horn/red_sandstone_to_red_sand.json @@ -0,0 +1,5 @@ +{ + "type": "twilightforest:crumble_horn", + "from": "minecraft:red_sandstone", + "to": "minecraft:red_sand" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/crumble_horn/rooted_dirt_to_dirt.json b/src/generated/resources/data/twilightforest/recipes/crumble_horn/rooted_dirt_to_dirt.json new file mode 100644 index 0000000000..11a0e139cd --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/crumble_horn/rooted_dirt_to_dirt.json @@ -0,0 +1,5 @@ +{ + "type": "twilightforest:crumble_horn", + "from": "minecraft:rooted_dirt", + "to": "minecraft:dirt" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/crumble_horn/sandstone_to_sand.json b/src/generated/resources/data/twilightforest/recipes/crumble_horn/sandstone_to_sand.json new file mode 100644 index 0000000000..a7dad28bb8 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/crumble_horn/sandstone_to_sand.json @@ -0,0 +1,5 @@ +{ + "type": "twilightforest:crumble_horn", + "from": "minecraft:sandstone", + "to": "minecraft:sand" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/crumble_horn/stone_bricks_to_cracked_stone_bricks.json b/src/generated/resources/data/twilightforest/recipes/crumble_horn/stone_bricks_to_cracked_stone_bricks.json new file mode 100644 index 0000000000..5fa1ec4bfe --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/crumble_horn/stone_bricks_to_cracked_stone_bricks.json @@ -0,0 +1,5 @@ +{ + "type": "twilightforest:crumble_horn", + "from": "minecraft:stone_bricks", + "to": "minecraft:cracked_stone_bricks" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/crumble_horn/stone_to_cobblestone.json b/src/generated/resources/data/twilightforest/recipes/crumble_horn/stone_to_cobblestone.json new file mode 100644 index 0000000000..a00eb6316c --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/crumble_horn/stone_to_cobblestone.json @@ -0,0 +1,5 @@ +{ + "type": "twilightforest:crumble_horn", + "from": "minecraft:stone", + "to": "minecraft:cobblestone" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/crumble_horn/towerwood_to_cracked_towerwood.json b/src/generated/resources/data/twilightforest/recipes/crumble_horn/towerwood_to_cracked_towerwood.json new file mode 100644 index 0000000000..437866983c --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/crumble_horn/towerwood_to_cracked_towerwood.json @@ -0,0 +1,5 @@ +{ + "type": "twilightforest:crumble_horn", + "from": "twilightforest:towerwood", + "to": "twilightforest:cracked_towerwood" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/crumble_horn/underbrick_to_cracked_underbrick.json b/src/generated/resources/data/twilightforest/recipes/crumble_horn/underbrick_to_cracked_underbrick.json new file mode 100644 index 0000000000..953f3441a2 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/crumble_horn/underbrick_to_cracked_underbrick.json @@ -0,0 +1,5 @@ +{ + "type": "twilightforest:crumble_horn", + "from": "twilightforest:underbrick", + "to": "twilightforest:cracked_underbrick" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/crumble_horn/weathered_copper_to_exposed_copper.json b/src/generated/resources/data/twilightforest/recipes/crumble_horn/weathered_copper_to_exposed_copper.json new file mode 100644 index 0000000000..77ebd36305 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/crumble_horn/weathered_copper_to_exposed_copper.json @@ -0,0 +1,5 @@ +{ + "type": "twilightforest:crumble_horn", + "from": "minecraft:weathered_copper", + "to": "minecraft:exposed_copper" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/crumble_horn/weathered_cut_copper_to_exposed_cut_copper.json b/src/generated/resources/data/twilightforest/recipes/crumble_horn/weathered_cut_copper_to_exposed_cut_copper.json new file mode 100644 index 0000000000..ad5bfed913 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/crumble_horn/weathered_cut_copper_to_exposed_cut_copper.json @@ -0,0 +1,5 @@ +{ + "type": "twilightforest:crumble_horn", + "from": "minecraft:weathered_cut_copper", + "to": "minecraft:exposed_cut_copper" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/dark_boat.json b/src/generated/resources/data/twilightforest/recipes/dark_boat.json new file mode 100644 index 0000000000..b61b219b40 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/dark_boat.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "group": "boat", + "key": { + "P": { + "item": "twilightforest:dark_planks" + } + }, + "pattern": [ + "P P", + "PPP" + ], + "result": { + "item": "twilightforest:dark_boat" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/dark_chest_boat.json b/src/generated/resources/data/twilightforest/recipes/dark_chest_boat.json new file mode 100644 index 0000000000..f40485a34f --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/dark_chest_boat.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "group": "chest_boat", + "ingredients": [ + { + "item": "twilightforest:dark_boat" + }, + { + "tag": "forge:chests/wooden" + } + ], + "result": { + "item": "twilightforest:dark_chest_boat" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/empty_canopy_bookshelf.json b/src/generated/resources/data/twilightforest/recipes/empty_canopy_bookshelf.json new file mode 100644 index 0000000000..34e17bf579 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/empty_canopy_bookshelf.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "-": { + "item": "twilightforest:canopy_slab" + } + }, + "pattern": [ + "---", + " ", + "---" + ], + "result": { + "item": "twilightforest:empty_canopy_bookshelf" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/encased_fire_jet.json b/src/generated/resources/data/twilightforest/recipes/encased_fire_jet.json new file mode 100644 index 0000000000..9970b866ac --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/encased_fire_jet.json @@ -0,0 +1,27 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "redstone", + "key": { + "#": { + "item": "twilightforest:encased_towerwood" + }, + "^": { + "item": "twilightforest:fire_jet" + }, + "u": { + "item": "minecraft:lava_bucket" + }, + "∴": { + "tag": "forge:dusts/redstone" + } + }, + "pattern": [ + "#∴#", + "∴^∴", + "uuu" + ], + "result": { + "item": "twilightforest:encased_fire_jet" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/encased_smoker.json b/src/generated/resources/data/twilightforest/recipes/encased_smoker.json new file mode 100644 index 0000000000..762b976a47 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/encased_smoker.json @@ -0,0 +1,24 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "redstone", + "key": { + "#": { + "item": "twilightforest:encased_towerwood" + }, + "^": { + "item": "twilightforest:smoker" + }, + "∴": { + "tag": "forge:dusts/redstone" + } + }, + "pattern": [ + "#∴#", + "∴^∴", + "#∴#" + ], + "result": { + "item": "twilightforest:encased_smoker" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/equipment/arctic_boots.json b/src/generated/resources/data/twilightforest/recipes/equipment/arctic_boots.json new file mode 100644 index 0000000000..52a7b5d4d7 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/equipment/arctic_boots.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "key": { + "#": { + "tag": "twilightforest:arctic_fur" + } + }, + "pattern": [ + "# #", + "# #" + ], + "result": { + "item": "twilightforest:arctic_boots" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/equipment/arctic_chestplate.json b/src/generated/resources/data/twilightforest/recipes/equipment/arctic_chestplate.json new file mode 100644 index 0000000000..1d855ce493 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/equipment/arctic_chestplate.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "key": { + "#": { + "tag": "twilightforest:arctic_fur" + } + }, + "pattern": [ + "# #", + "###", + "###" + ], + "result": { + "item": "twilightforest:arctic_chestplate" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/equipment/arctic_helmet.json b/src/generated/resources/data/twilightforest/recipes/equipment/arctic_helmet.json new file mode 100644 index 0000000000..3113b07468 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/equipment/arctic_helmet.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "key": { + "#": { + "tag": "twilightforest:arctic_fur" + } + }, + "pattern": [ + "###", + "# #" + ], + "result": { + "item": "twilightforest:arctic_helmet" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/equipment/arctic_leggings.json b/src/generated/resources/data/twilightforest/recipes/equipment/arctic_leggings.json new file mode 100644 index 0000000000..4d66718a4e --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/equipment/arctic_leggings.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "key": { + "#": { + "tag": "twilightforest:arctic_fur" + } + }, + "pattern": [ + "###", + "# #", + "# #" + ], + "result": { + "item": "twilightforest:arctic_leggings" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/equipment/block_and_chain.json b/src/generated/resources/data/twilightforest/recipes/equipment/block_and_chain.json new file mode 100644 index 0000000000..9260567e4b --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/equipment/block_and_chain.json @@ -0,0 +1,24 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "equipment", + "ingredients": [ + { + "tag": "forge:storage_blocks/knightmetal" + }, + { + "tag": "forge:ingots/knightmetal" + }, + { + "tag": "forge:ingots/knightmetal" + }, + { + "tag": "forge:ingots/knightmetal" + }, + { + "item": "twilightforest:knightmetal_ring" + } + ], + "result": { + "item": "twilightforest:block_and_chain" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/equipment/fiery_boots.json b/src/generated/resources/data/twilightforest/recipes/equipment/fiery_boots.json new file mode 100644 index 0000000000..eb502738aa --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/equipment/fiery_boots.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "key": { + "#": { + "tag": "forge:ingots/fiery" + } + }, + "pattern": [ + "# #", + "# #" + ], + "result": { + "item": "twilightforest:fiery_boots" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/equipment/fiery_chestplate.json b/src/generated/resources/data/twilightforest/recipes/equipment/fiery_chestplate.json new file mode 100644 index 0000000000..a8cb2c066f --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/equipment/fiery_chestplate.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "key": { + "#": { + "tag": "forge:ingots/fiery" + } + }, + "pattern": [ + "# #", + "###", + "###" + ], + "result": { + "item": "twilightforest:fiery_chestplate" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/equipment/fiery_fiery_boots.json b/src/generated/resources/data/twilightforest/recipes/equipment/fiery_fiery_boots.json new file mode 100644 index 0000000000..87b06a069c --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/equipment/fiery_fiery_boots.json @@ -0,0 +1,24 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "equipment", + "ingredients": [ + { + "item": "minecraft:iron_boots" + }, + { + "tag": "twilightforest:fiery_vial" + }, + { + "tag": "twilightforest:fiery_vial" + }, + { + "tag": "twilightforest:fiery_vial" + }, + { + "tag": "twilightforest:fiery_vial" + } + ], + "result": { + "item": "twilightforest:fiery_boots" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/equipment/fiery_fiery_chestplate.json b/src/generated/resources/data/twilightforest/recipes/equipment/fiery_fiery_chestplate.json new file mode 100644 index 0000000000..ab9eee438a --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/equipment/fiery_fiery_chestplate.json @@ -0,0 +1,36 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "equipment", + "ingredients": [ + { + "item": "minecraft:iron_chestplate" + }, + { + "tag": "twilightforest:fiery_vial" + }, + { + "tag": "twilightforest:fiery_vial" + }, + { + "tag": "twilightforest:fiery_vial" + }, + { + "tag": "twilightforest:fiery_vial" + }, + { + "tag": "twilightforest:fiery_vial" + }, + { + "tag": "twilightforest:fiery_vial" + }, + { + "tag": "twilightforest:fiery_vial" + }, + { + "tag": "twilightforest:fiery_vial" + } + ], + "result": { + "item": "twilightforest:fiery_chestplate" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/equipment/fiery_fiery_helmet.json b/src/generated/resources/data/twilightforest/recipes/equipment/fiery_fiery_helmet.json new file mode 100644 index 0000000000..6b828ced0b --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/equipment/fiery_fiery_helmet.json @@ -0,0 +1,27 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "equipment", + "ingredients": [ + { + "item": "minecraft:iron_helmet" + }, + { + "tag": "twilightforest:fiery_vial" + }, + { + "tag": "twilightforest:fiery_vial" + }, + { + "tag": "twilightforest:fiery_vial" + }, + { + "tag": "twilightforest:fiery_vial" + }, + { + "tag": "twilightforest:fiery_vial" + } + ], + "result": { + "item": "twilightforest:fiery_helmet" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/equipment/fiery_fiery_leggings.json b/src/generated/resources/data/twilightforest/recipes/equipment/fiery_fiery_leggings.json new file mode 100644 index 0000000000..2b537cbb2a --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/equipment/fiery_fiery_leggings.json @@ -0,0 +1,33 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "equipment", + "ingredients": [ + { + "item": "minecraft:iron_leggings" + }, + { + "tag": "twilightforest:fiery_vial" + }, + { + "tag": "twilightforest:fiery_vial" + }, + { + "tag": "twilightforest:fiery_vial" + }, + { + "tag": "twilightforest:fiery_vial" + }, + { + "tag": "twilightforest:fiery_vial" + }, + { + "tag": "twilightforest:fiery_vial" + }, + { + "tag": "twilightforest:fiery_vial" + } + ], + "result": { + "item": "twilightforest:fiery_leggings" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/equipment/fiery_helmet.json b/src/generated/resources/data/twilightforest/recipes/equipment/fiery_helmet.json new file mode 100644 index 0000000000..e0dff1747c --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/equipment/fiery_helmet.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "key": { + "#": { + "tag": "forge:ingots/fiery" + } + }, + "pattern": [ + "###", + "# #" + ], + "result": { + "item": "twilightforest:fiery_helmet" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/equipment/fiery_ingot_crafting.json b/src/generated/resources/data/twilightforest/recipes/equipment/fiery_ingot_crafting.json new file mode 100644 index 0000000000..cdf76ee3f3 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/equipment/fiery_ingot_crafting.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "tag": "twilightforest:fiery_vial" + }, + { + "tag": "forge:ingots/iron" + } + ], + "result": { + "item": "twilightforest:fiery_ingot" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/equipment/fiery_iron_pickaxe.json b/src/generated/resources/data/twilightforest/recipes/equipment/fiery_iron_pickaxe.json new file mode 100644 index 0000000000..935150dcfd --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/equipment/fiery_iron_pickaxe.json @@ -0,0 +1,27 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "equipment", + "ingredients": [ + { + "item": "minecraft:iron_pickaxe" + }, + { + "tag": "twilightforest:fiery_vial" + }, + { + "tag": "twilightforest:fiery_vial" + }, + { + "tag": "twilightforest:fiery_vial" + }, + { + "tag": "forge:rods/blaze" + }, + { + "tag": "forge:rods/blaze" + } + ], + "result": { + "item": "twilightforest:fiery_pickaxe" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/equipment/fiery_iron_sword.json b/src/generated/resources/data/twilightforest/recipes/equipment/fiery_iron_sword.json new file mode 100644 index 0000000000..95d5d7e54d --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/equipment/fiery_iron_sword.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "equipment", + "ingredients": [ + { + "item": "minecraft:iron_sword" + }, + { + "tag": "twilightforest:fiery_vial" + }, + { + "tag": "twilightforest:fiery_vial" + }, + { + "tag": "forge:rods/blaze" + } + ], + "result": { + "item": "twilightforest:fiery_sword" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/equipment/fiery_leggings.json b/src/generated/resources/data/twilightforest/recipes/equipment/fiery_leggings.json new file mode 100644 index 0000000000..b1a07b5683 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/equipment/fiery_leggings.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "key": { + "#": { + "tag": "forge:ingots/fiery" + } + }, + "pattern": [ + "###", + "# #", + "# #" + ], + "result": { + "item": "twilightforest:fiery_leggings" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/equipment/fiery_pickaxe.json b/src/generated/resources/data/twilightforest/recipes/equipment/fiery_pickaxe.json new file mode 100644 index 0000000000..ca5ccecde6 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/equipment/fiery_pickaxe.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "key": { + "#": { + "tag": "forge:ingots/fiery" + }, + "X": { + "tag": "forge:rods/blaze" + } + }, + "pattern": [ + "###", + " X ", + " X " + ], + "result": { + "item": "twilightforest:fiery_pickaxe" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/equipment/fiery_sword.json b/src/generated/resources/data/twilightforest/recipes/equipment/fiery_sword.json new file mode 100644 index 0000000000..b6268900ac --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/equipment/fiery_sword.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "key": { + "#": { + "tag": "forge:ingots/fiery" + }, + "X": { + "tag": "forge:rods/blaze" + } + }, + "pattern": [ + "#", + "#", + "X" + ], + "result": { + "item": "twilightforest:fiery_sword" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/equipment/fortification_scepter.json b/src/generated/resources/data/twilightforest/recipes/equipment/fortification_scepter.json new file mode 100644 index 0000000000..d1c0f1050d --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/equipment/fortification_scepter.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "equipment", + "ingredients": [ + { + "type": "forge:partial_nbt", + "item": "twilightforest:fortification_scepter", + "nbt": "{Damage:9}" + }, + { + "item": "minecraft:golden_apple" + } + ], + "result": { + "item": "twilightforest:fortification_scepter" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/equipment/giant_pickaxe.json b/src/generated/resources/data/twilightforest/recipes/equipment/giant_pickaxe.json new file mode 100644 index 0000000000..32cb8b7e68 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/equipment/giant_pickaxe.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "key": { + "#": { + "item": "twilightforest:giant_cobblestone" + }, + "X": { + "item": "twilightforest:giant_log" + } + }, + "pattern": [ + "###", + " X ", + " X " + ], + "result": { + "item": "twilightforest:giant_pickaxe" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/equipment/giant_sword.json b/src/generated/resources/data/twilightforest/recipes/equipment/giant_sword.json new file mode 100644 index 0000000000..8d2386025d --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/equipment/giant_sword.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "key": { + "#": { + "item": "twilightforest:giant_cobblestone" + }, + "X": { + "item": "twilightforest:giant_log" + } + }, + "pattern": [ + "#", + "#", + "X" + ], + "result": { + "item": "twilightforest:giant_sword" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/equipment/knightmetal_axe.json b/src/generated/resources/data/twilightforest/recipes/equipment/knightmetal_axe.json new file mode 100644 index 0000000000..7d5953a95e --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/equipment/knightmetal_axe.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "key": { + "#": { + "tag": "forge:ingots/knightmetal" + }, + "X": { + "tag": "forge:rods/wooden" + } + }, + "pattern": [ + "##", + "#X", + " X" + ], + "result": { + "item": "twilightforest:knightmetal_axe" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/equipment/knightmetal_boots.json b/src/generated/resources/data/twilightforest/recipes/equipment/knightmetal_boots.json new file mode 100644 index 0000000000..36c9f81596 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/equipment/knightmetal_boots.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "key": { + "#": { + "tag": "forge:ingots/knightmetal" + } + }, + "pattern": [ + "# #", + "# #" + ], + "result": { + "item": "twilightforest:knightmetal_boots" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/equipment/knightmetal_chestplate.json b/src/generated/resources/data/twilightforest/recipes/equipment/knightmetal_chestplate.json new file mode 100644 index 0000000000..66d9ab997e --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/equipment/knightmetal_chestplate.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "key": { + "#": { + "tag": "forge:ingots/knightmetal" + } + }, + "pattern": [ + "# #", + "###", + "###" + ], + "result": { + "item": "twilightforest:knightmetal_chestplate" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/equipment/knightmetal_helmet.json b/src/generated/resources/data/twilightforest/recipes/equipment/knightmetal_helmet.json new file mode 100644 index 0000000000..f35fa3a652 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/equipment/knightmetal_helmet.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "key": { + "#": { + "tag": "forge:ingots/knightmetal" + } + }, + "pattern": [ + "###", + "# #" + ], + "result": { + "item": "twilightforest:knightmetal_helmet" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/equipment/knightmetal_leggings.json b/src/generated/resources/data/twilightforest/recipes/equipment/knightmetal_leggings.json new file mode 100644 index 0000000000..076e9be28f --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/equipment/knightmetal_leggings.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "key": { + "#": { + "tag": "forge:ingots/knightmetal" + } + }, + "pattern": [ + "###", + "# #", + "# #" + ], + "result": { + "item": "twilightforest:knightmetal_leggings" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/equipment/knightmetal_pickaxe.json b/src/generated/resources/data/twilightforest/recipes/equipment/knightmetal_pickaxe.json new file mode 100644 index 0000000000..1f31038184 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/equipment/knightmetal_pickaxe.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "key": { + "#": { + "tag": "forge:ingots/knightmetal" + }, + "X": { + "tag": "forge:rods/wooden" + } + }, + "pattern": [ + "###", + " X ", + " X " + ], + "result": { + "item": "twilightforest:knightmetal_pickaxe" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/equipment/knightmetal_ring.json b/src/generated/resources/data/twilightforest/recipes/equipment/knightmetal_ring.json new file mode 100644 index 0000000000..129bae6a2a --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/equipment/knightmetal_ring.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "-": { + "tag": "forge:ingots/knightmetal" + } + }, + "pattern": [ + " - ", + "- -", + " - " + ], + "result": { + "item": "twilightforest:knightmetal_ring" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/equipment/knightmetal_shield.json b/src/generated/resources/data/twilightforest/recipes/equipment/knightmetal_shield.json new file mode 100644 index 0000000000..237d48875e --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/equipment/knightmetal_shield.json @@ -0,0 +1,24 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "key": { + "#": { + "tag": "twilightforest:towerwood" + }, + "-": { + "tag": "forge:ingots/knightmetal" + }, + "o": { + "item": "twilightforest:knightmetal_ring" + } + }, + "pattern": [ + "-#", + "-o", + "-#" + ], + "result": { + "item": "twilightforest:knightmetal_shield" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/equipment/knightmetal_sword.json b/src/generated/resources/data/twilightforest/recipes/equipment/knightmetal_sword.json new file mode 100644 index 0000000000..5a4ae5efdc --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/equipment/knightmetal_sword.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "key": { + "#": { + "tag": "forge:ingots/knightmetal" + }, + "X": { + "tag": "forge:rods/wooden" + } + }, + "pattern": [ + "#", + "#", + "X" + ], + "result": { + "item": "twilightforest:knightmetal_sword" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/equipment/lifedrain_scepter.json b/src/generated/resources/data/twilightforest/recipes/equipment/lifedrain_scepter.json new file mode 100644 index 0000000000..8bd7a2d642 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/equipment/lifedrain_scepter.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "equipment", + "ingredients": [ + { + "type": "forge:partial_nbt", + "item": "twilightforest:lifedrain_scepter", + "nbt": "{Damage:99}" + }, + { + "item": "minecraft:fermented_spider_eye" + } + ], + "result": { + "item": "twilightforest:lifedrain_scepter" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/equipment/twilight_scepter.json b/src/generated/resources/data/twilightforest/recipes/equipment/twilight_scepter.json new file mode 100644 index 0000000000..f4150ce88c --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/equipment/twilight_scepter.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "equipment", + "ingredients": [ + { + "type": "forge:partial_nbt", + "item": "twilightforest:twilight_scepter", + "nbt": "{Damage:99}" + }, + { + "tag": "forge:ender_pearls" + } + ], + "result": { + "item": "twilightforest:twilight_scepter" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/equipment/zombie_scepter.json b/src/generated/resources/data/twilightforest/recipes/equipment/zombie_scepter.json new file mode 100644 index 0000000000..b3cde0eaef --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/equipment/zombie_scepter.json @@ -0,0 +1,34 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "equipment", + "ingredients": [ + [ + { + "type": "forge:partial_nbt", + "item": "minecraft:potion", + "nbt": "{Potion:\"minecraft:strength\"}" + }, + { + "type": "forge:partial_nbt", + "item": "minecraft:potion", + "nbt": "{Potion:\"minecraft:strong_strength\"}" + }, + { + "type": "forge:partial_nbt", + "item": "minecraft:potion", + "nbt": "{Potion:\"minecraft:long_strength\"}" + } + ], + { + "type": "forge:partial_nbt", + "item": "twilightforest:zombie_scepter", + "nbt": "{Damage:9}" + }, + { + "item": "minecraft:rotten_flesh" + } + ], + "result": { + "item": "twilightforest:zombie_scepter" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/firefly_jar.json b/src/generated/resources/data/twilightforest/recipes/firefly_jar.json new file mode 100644 index 0000000000..99f3b9e97d --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/firefly_jar.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "twilightforest:firefly" + }, + { + "item": "minecraft:glass_bottle" + } + ], + "result": { + "item": "twilightforest:firefly_jar" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/firefly_particle_spawner.json b/src/generated/resources/data/twilightforest/recipes/firefly_particle_spawner.json new file mode 100644 index 0000000000..8ea55f11b4 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/firefly_particle_spawner.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "twilightforest:firefly_jar" + }, + { + "item": "twilightforest:firefly" + }, + { + "item": "minecraft:poppy" + } + ], + "result": { + "item": "twilightforest:firefly_particle_spawner" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/food/campfired_meef.json b/src/generated/resources/data/twilightforest/recipes/food/campfired_meef.json new file mode 100644 index 0000000000..40982a45b7 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/food/campfired_meef.json @@ -0,0 +1,10 @@ +{ + "type": "minecraft:campfire_cooking", + "category": "food", + "cookingtime": 600, + "experience": 0.3, + "ingredient": { + "item": "twilightforest:raw_meef" + }, + "result": "twilightforest:cooked_meef" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/food/campfired_venison.json b/src/generated/resources/data/twilightforest/recipes/food/campfired_venison.json new file mode 100644 index 0000000000..c5d23e1fff --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/food/campfired_venison.json @@ -0,0 +1,10 @@ +{ + "type": "minecraft:campfire_cooking", + "category": "food", + "cookingtime": 600, + "experience": 0.3, + "ingredient": { + "item": "twilightforest:raw_venison" + }, + "result": "twilightforest:cooked_venison" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/food/smelted_meef.json b/src/generated/resources/data/twilightforest/recipes/food/smelted_meef.json new file mode 100644 index 0000000000..fee30f40e7 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/food/smelted_meef.json @@ -0,0 +1,10 @@ +{ + "type": "minecraft:smelting", + "category": "food", + "cookingtime": 200, + "experience": 0.3, + "ingredient": { + "item": "twilightforest:raw_meef" + }, + "result": "twilightforest:cooked_meef" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/food/smelted_venison.json b/src/generated/resources/data/twilightforest/recipes/food/smelted_venison.json new file mode 100644 index 0000000000..b8ec17aeae --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/food/smelted_venison.json @@ -0,0 +1,10 @@ +{ + "type": "minecraft:smelting", + "category": "food", + "cookingtime": 200, + "experience": 0.3, + "ingredient": { + "item": "twilightforest:raw_venison" + }, + "result": "twilightforest:cooked_venison" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/food/smoked_meef.json b/src/generated/resources/data/twilightforest/recipes/food/smoked_meef.json new file mode 100644 index 0000000000..9f669b1602 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/food/smoked_meef.json @@ -0,0 +1,10 @@ +{ + "type": "minecraft:smoking", + "category": "food", + "cookingtime": 100, + "experience": 0.3, + "ingredient": { + "item": "twilightforest:raw_meef" + }, + "result": "twilightforest:cooked_meef" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/food/smoked_venison.json b/src/generated/resources/data/twilightforest/recipes/food/smoked_venison.json new file mode 100644 index 0000000000..07cf35d069 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/food/smoked_venison.json @@ -0,0 +1,10 @@ +{ + "type": "minecraft:smoking", + "category": "food", + "cookingtime": 100, + "experience": 0.3, + "ingredient": { + "item": "twilightforest:raw_venison" + }, + "result": "twilightforest:cooked_venison" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/giant_cobblestone_to_cobblestone.json b/src/generated/resources/data/twilightforest/recipes/giant_cobblestone_to_cobblestone.json new file mode 100644 index 0000000000..d023281c97 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/giant_cobblestone_to_cobblestone.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "item": "twilightforest:giant_cobblestone" + } + ], + "result": { + "count": 64, + "item": "minecraft:cobblestone" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/giant_leaves_to_oak_leaves.json b/src/generated/resources/data/twilightforest/recipes/giant_leaves_to_oak_leaves.json new file mode 100644 index 0000000000..5baa42cd75 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/giant_leaves_to_oak_leaves.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "item": "twilightforest:giant_leaves" + } + ], + "result": { + "count": 64, + "item": "minecraft:oak_leaves" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/giant_log_to_oak_planks.json b/src/generated/resources/data/twilightforest/recipes/giant_log_to_oak_planks.json new file mode 100644 index 0000000000..16ad316b78 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/giant_log_to_oak_planks.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "item": "twilightforest:giant_log" + } + ], + "result": { + "count": 64, + "item": "minecraft:oak_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/hydra_banner_pattern.json b/src/generated/resources/data/twilightforest/recipes/hydra_banner_pattern.json new file mode 100644 index 0000000000..24ce503b90 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/hydra_banner_pattern.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "tag": "forge:paper" + }, + { + "item": "twilightforest:hydra_trophy" + } + ], + "result": { + "item": "twilightforest:hydra_banner_pattern" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/iron_ladder.json b/src/generated/resources/data/twilightforest/recipes/iron_ladder.json new file mode 100644 index 0000000000..e2995e04a4 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/iron_ladder.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "#": { + "item": "minecraft:iron_bars" + }, + "-": { + "tag": "forge:nuggets/iron" + } + }, + "pattern": [ + "-#-", + "-#-" + ], + "result": { + "count": 3, + "item": "twilightforest:iron_ladder" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/knight_phantom_banner_pattern.json b/src/generated/resources/data/twilightforest/recipes/knight_phantom_banner_pattern.json new file mode 100644 index 0000000000..d63ab82f12 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/knight_phantom_banner_pattern.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "tag": "forge:paper" + }, + { + "item": "twilightforest:knight_phantom_trophy" + } + ], + "result": { + "item": "twilightforest:knight_phantom_banner_pattern" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/lich_banner_pattern.json b/src/generated/resources/data/twilightforest/recipes/lich_banner_pattern.json new file mode 100644 index 0000000000..cd77d77c0a --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/lich_banner_pattern.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "tag": "forge:paper" + }, + { + "item": "twilightforest:lich_trophy" + } + ], + "result": { + "item": "twilightforest:lich_banner_pattern" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/magic_map.json b/src/generated/resources/data/twilightforest/recipes/magic_map.json new file mode 100644 index 0000000000..867cd72bab --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/magic_map.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "#": { + "tag": "forge:paper" + }, + "•": { + "item": "twilightforest:magic_map_focus" + } + }, + "pattern": [ + "###", + "#•#", + "###" + ], + "result": { + "item": "twilightforest:magic_map" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/magic_map_cloning_recipe.json b/src/generated/resources/data/twilightforest/recipes/magic_map_cloning_recipe.json new file mode 100644 index 0000000000..967cb80515 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/magic_map_cloning_recipe.json @@ -0,0 +1,4 @@ +{ + "type": "twilightforest:magic_map_cloning_recipe", + "category": "misc" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/magic_map_focus.json b/src/generated/resources/data/twilightforest/recipes/magic_map_focus.json new file mode 100644 index 0000000000..601d866ded --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/magic_map_focus.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "twilightforest:raven_feather" + }, + { + "item": "twilightforest:torchberries" + }, + { + "tag": "forge:dusts/glowstone" + } + ], + "result": { + "item": "twilightforest:magic_map_focus" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/mangrove_boat.json b/src/generated/resources/data/twilightforest/recipes/mangrove_boat.json new file mode 100644 index 0000000000..c13fc9c47a --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/mangrove_boat.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "group": "boat", + "key": { + "P": { + "item": "twilightforest:mangrove_planks" + } + }, + "pattern": [ + "P P", + "PPP" + ], + "result": { + "item": "twilightforest:mangrove_boat" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/mangrove_chest_boat.json b/src/generated/resources/data/twilightforest/recipes/mangrove_chest_boat.json new file mode 100644 index 0000000000..2e7a060f18 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/mangrove_chest_boat.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "group": "chest_boat", + "ingredients": [ + { + "item": "twilightforest:mangrove_boat" + }, + { + "tag": "forge:chests/wooden" + } + ], + "result": { + "item": "twilightforest:mangrove_chest_boat" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/material/armor_shard_cluster.json b/src/generated/resources/data/twilightforest/recipes/material/armor_shard_cluster.json new file mode 100644 index 0000000000..b3d00a4a75 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/material/armor_shard_cluster.json @@ -0,0 +1,36 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "twilightforest:armor_shard" + }, + { + "item": "twilightforest:armor_shard" + }, + { + "item": "twilightforest:armor_shard" + }, + { + "item": "twilightforest:armor_shard" + }, + { + "item": "twilightforest:armor_shard" + }, + { + "item": "twilightforest:armor_shard" + }, + { + "item": "twilightforest:armor_shard" + }, + { + "item": "twilightforest:armor_shard" + }, + { + "item": "twilightforest:armor_shard" + } + ], + "result": { + "item": "twilightforest:armor_shard_cluster" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/material/blasted_ironwood_ingot.json b/src/generated/resources/data/twilightforest/recipes/material/blasted_ironwood_ingot.json new file mode 100644 index 0000000000..09d6a3ac60 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/material/blasted_ironwood_ingot.json @@ -0,0 +1,10 @@ +{ + "type": "minecraft:blasting", + "category": "misc", + "cookingtime": 100, + "experience": 1.0, + "ingredient": { + "item": "twilightforest:raw_ironwood" + }, + "result": "twilightforest:ironwood_ingot" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/material/blasted_knightmetal_ingot.json b/src/generated/resources/data/twilightforest/recipes/material/blasted_knightmetal_ingot.json new file mode 100644 index 0000000000..1a42144c74 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/material/blasted_knightmetal_ingot.json @@ -0,0 +1,10 @@ +{ + "type": "minecraft:blasting", + "category": "misc", + "cookingtime": 100, + "experience": 1.0, + "ingredient": { + "item": "twilightforest:armor_shard_cluster" + }, + "result": "twilightforest:knightmetal_ingot" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/material/carminite.json b/src/generated/resources/data/twilightforest/recipes/material/carminite.json new file mode 100644 index 0000000000..299f8dcbb4 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/material/carminite.json @@ -0,0 +1,36 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "twilightforest:borer_essence" + }, + { + "tag": "forge:dusts/redstone" + }, + { + "item": "twilightforest:borer_essence" + }, + { + "tag": "forge:dusts/redstone" + }, + { + "item": "minecraft:ghast_tear" + }, + { + "tag": "forge:dusts/redstone" + }, + { + "item": "twilightforest:borer_essence" + }, + { + "tag": "forge:dusts/redstone" + }, + { + "item": "twilightforest:borer_essence" + } + ], + "result": { + "item": "twilightforest:carminite" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/material/raw_ironwood.json b/src/generated/resources/data/twilightforest/recipes/material/raw_ironwood.json new file mode 100644 index 0000000000..60d6e9f9c8 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/material/raw_ironwood.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "twilightforest:liveroot" + }, + { + "item": "minecraft:raw_iron" + }, + { + "tag": "forge:nuggets/gold" + } + ], + "result": { + "count": 2, + "item": "twilightforest:raw_ironwood" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/material/smelted_ironwood_ingot.json b/src/generated/resources/data/twilightforest/recipes/material/smelted_ironwood_ingot.json new file mode 100644 index 0000000000..a38c244ead --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/material/smelted_ironwood_ingot.json @@ -0,0 +1,10 @@ +{ + "type": "minecraft:smelting", + "category": "misc", + "cookingtime": 200, + "experience": 1.0, + "ingredient": { + "item": "twilightforest:raw_ironwood" + }, + "result": "twilightforest:ironwood_ingot" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/material/smelted_knightmetal_ingot.json b/src/generated/resources/data/twilightforest/recipes/material/smelted_knightmetal_ingot.json new file mode 100644 index 0000000000..90709e313d --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/material/smelted_knightmetal_ingot.json @@ -0,0 +1,10 @@ +{ + "type": "minecraft:smelting", + "category": "misc", + "cookingtime": 200, + "experience": 1.0, + "ingredient": { + "item": "twilightforest:armor_shard_cluster" + }, + "result": "twilightforest:knightmetal_ingot" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/maze_map.json b/src/generated/resources/data/twilightforest/recipes/maze_map.json new file mode 100644 index 0000000000..2e55495464 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/maze_map.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "#": { + "tag": "forge:paper" + }, + "•": { + "item": "twilightforest:maze_map_focus" + } + }, + "pattern": [ + "###", + "#•#", + "###" + ], + "result": { + "item": "twilightforest:maze_map" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/maze_map_cloning_recipe.json b/src/generated/resources/data/twilightforest/recipes/maze_map_cloning_recipe.json new file mode 100644 index 0000000000..979ddb73bb --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/maze_map_cloning_recipe.json @@ -0,0 +1,4 @@ +{ + "type": "twilightforest:maze_map_cloning_recipe", + "category": "misc" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/maze_stone/mossy_mazestone.json b/src/generated/resources/data/twilightforest/recipes/maze_stone/mossy_mazestone.json new file mode 100644 index 0000000000..ab2a947bc7 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/maze_stone/mossy_mazestone.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + [ + { + "item": "minecraft:vine" + }, + { + "item": "minecraft:moss_block" + } + ], + { + "item": "twilightforest:mazestone_brick" + } + ], + "result": { + "item": "twilightforest:mossy_mazestone" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/maze_stone/smelted_maze_stone_cracked.json b/src/generated/resources/data/twilightforest/recipes/maze_stone/smelted_maze_stone_cracked.json new file mode 100644 index 0000000000..9ef0d2aafa --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/maze_stone/smelted_maze_stone_cracked.json @@ -0,0 +1,10 @@ +{ + "type": "minecraft:smelting", + "category": "blocks", + "cookingtime": 200, + "experience": 0.3, + "ingredient": { + "item": "twilightforest:mazestone_brick" + }, + "result": "twilightforest:cracked_mazestone" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/mining_boat.json b/src/generated/resources/data/twilightforest/recipes/mining_boat.json new file mode 100644 index 0000000000..143f11748c --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/mining_boat.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "group": "boat", + "key": { + "P": { + "item": "twilightforest:mining_planks" + } + }, + "pattern": [ + "P P", + "PPP" + ], + "result": { + "item": "twilightforest:mining_boat" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/mining_chest_boat.json b/src/generated/resources/data/twilightforest/recipes/mining_chest_boat.json new file mode 100644 index 0000000000..484c87efaa --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/mining_chest_boat.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "group": "chest_boat", + "ingredients": [ + { + "item": "twilightforest:mining_boat" + }, + { + "tag": "forge:chests/wooden" + } + ], + "result": { + "item": "twilightforest:mining_chest_boat" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/minoshroom_banner_pattern.json b/src/generated/resources/data/twilightforest/recipes/minoshroom_banner_pattern.json new file mode 100644 index 0000000000..502f31100d --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/minoshroom_banner_pattern.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "tag": "forge:paper" + }, + { + "item": "twilightforest:minoshroom_trophy" + } + ], + "result": { + "item": "twilightforest:minoshroom_banner_pattern" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/moonworm_queen_repair_recipe.json b/src/generated/resources/data/twilightforest/recipes/moonworm_queen_repair_recipe.json new file mode 100644 index 0000000000..24129d6c8f --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/moonworm_queen_repair_recipe.json @@ -0,0 +1,4 @@ +{ + "type": "twilightforest:moonworm_queen_repair_recipe", + "category": "misc" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/mossy_underbrick.json b/src/generated/resources/data/twilightforest/recipes/mossy_underbrick.json new file mode 100644 index 0000000000..6a5c44ddc2 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/mossy_underbrick.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + [ + { + "item": "minecraft:vine" + }, + { + "item": "minecraft:moss_block" + } + ], + { + "item": "twilightforest:underbrick" + } + ], + "result": { + "item": "twilightforest:mossy_underbrick" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/naga_banner_pattern.json b/src/generated/resources/data/twilightforest/recipes/naga_banner_pattern.json new file mode 100644 index 0000000000..73e90a2a8b --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/naga_banner_pattern.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "tag": "forge:paper" + }, + { + "item": "twilightforest:naga_trophy" + } + ], + "result": { + "item": "twilightforest:naga_banner_pattern" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/nagastone/cracked_nagastone_stairs_left.json b/src/generated/resources/data/twilightforest/recipes/nagastone/cracked_nagastone_stairs_left.json new file mode 100644 index 0000000000..dc6a0bcb38 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/nagastone/cracked_nagastone_stairs_left.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "#": { + "item": "twilightforest:cracked_etched_nagastone" + } + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "result": { + "count": 8, + "item": "twilightforest:cracked_nagastone_stairs_left" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/nagastone/cracked_nagastone_stairs_right.json b/src/generated/resources/data/twilightforest/recipes/nagastone/cracked_nagastone_stairs_right.json new file mode 100644 index 0000000000..ad4358f2fd --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/nagastone/cracked_nagastone_stairs_right.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "#": { + "item": "twilightforest:cracked_etched_nagastone" + } + }, + "pattern": [ + "###", + " ##", + " #" + ], + "result": { + "count": 8, + "item": "twilightforest:cracked_nagastone_stairs_right" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/nagastone/mossy_etched_nagastone.json b/src/generated/resources/data/twilightforest/recipes/nagastone/mossy_etched_nagastone.json new file mode 100644 index 0000000000..feead1c6b8 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/nagastone/mossy_etched_nagastone.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + [ + { + "item": "minecraft:vine" + }, + { + "item": "minecraft:moss_block" + } + ], + { + "item": "twilightforest:etched_nagastone" + } + ], + "result": { + "item": "twilightforest:mossy_etched_nagastone" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/nagastone/mossy_nagastone_pillar.json b/src/generated/resources/data/twilightforest/recipes/nagastone/mossy_nagastone_pillar.json new file mode 100644 index 0000000000..9109ff5975 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/nagastone/mossy_nagastone_pillar.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + [ + { + "item": "minecraft:vine" + }, + { + "item": "minecraft:moss_block" + } + ], + { + "item": "twilightforest:nagastone_pillar" + } + ], + "result": { + "item": "twilightforest:mossy_nagastone_pillar" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/nagastone/mossy_nagastone_stairs_left.json b/src/generated/resources/data/twilightforest/recipes/nagastone/mossy_nagastone_stairs_left.json new file mode 100644 index 0000000000..ebf50418c9 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/nagastone/mossy_nagastone_stairs_left.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "#": { + "item": "twilightforest:mossy_etched_nagastone" + } + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "result": { + "count": 8, + "item": "twilightforest:mossy_nagastone_stairs_left" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/nagastone/mossy_nagastone_stairs_right.json b/src/generated/resources/data/twilightforest/recipes/nagastone/mossy_nagastone_stairs_right.json new file mode 100644 index 0000000000..a603ab2f6f --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/nagastone/mossy_nagastone_stairs_right.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "#": { + "item": "twilightforest:mossy_etched_nagastone" + } + }, + "pattern": [ + "###", + " ##", + " #" + ], + "result": { + "count": 8, + "item": "twilightforest:mossy_nagastone_stairs_right" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/nagastone/nagastone_spiral.json b/src/generated/resources/data/twilightforest/recipes/nagastone/nagastone_spiral.json new file mode 100644 index 0000000000..f38a48ffc0 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/nagastone/nagastone_spiral.json @@ -0,0 +1,38 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "B": [ + { + "item": "minecraft:stone_bricks" + }, + { + "item": "minecraft:mossy_stone_bricks" + }, + { + "item": "minecraft:cracked_stone_bricks" + }, + { + "item": "minecraft:chiseled_stone_bricks" + } + ], + "S": [ + { + "item": "minecraft:stone_slab" + }, + { + "item": "minecraft:stone_brick_slab" + } + ] + }, + "pattern": [ + "BSS", + "BSS", + "BBB" + ], + "result": { + "count": 8, + "item": "twilightforest:spiral_bricks" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/nagastone/nagastone_stairs_left.json b/src/generated/resources/data/twilightforest/recipes/nagastone/nagastone_stairs_left.json new file mode 100644 index 0000000000..8ff934e071 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/nagastone/nagastone_stairs_left.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "#": { + "item": "twilightforest:etched_nagastone" + } + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "result": { + "count": 8, + "item": "twilightforest:nagastone_stairs_left" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/nagastone/nagastone_stairs_right.json b/src/generated/resources/data/twilightforest/recipes/nagastone/nagastone_stairs_right.json new file mode 100644 index 0000000000..141ac1ef36 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/nagastone/nagastone_stairs_right.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "#": { + "item": "twilightforest:etched_nagastone" + } + }, + "pattern": [ + "###", + " ##", + " #" + ], + "result": { + "count": 8, + "item": "twilightforest:nagastone_stairs_right" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/nagastone/smelted_cracked_etched_nagastone.json b/src/generated/resources/data/twilightforest/recipes/nagastone/smelted_cracked_etched_nagastone.json new file mode 100644 index 0000000000..3466b26cf7 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/nagastone/smelted_cracked_etched_nagastone.json @@ -0,0 +1,10 @@ +{ + "type": "minecraft:smelting", + "category": "blocks", + "cookingtime": 200, + "experience": 0.3, + "ingredient": { + "item": "twilightforest:etched_nagastone" + }, + "result": "twilightforest:cracked_etched_nagastone" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/nagastone/smelted_cracked_nagastone_pillar.json b/src/generated/resources/data/twilightforest/recipes/nagastone/smelted_cracked_nagastone_pillar.json new file mode 100644 index 0000000000..a41d1d662c --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/nagastone/smelted_cracked_nagastone_pillar.json @@ -0,0 +1,10 @@ +{ + "type": "minecraft:smelting", + "category": "blocks", + "cookingtime": 200, + "experience": 0.3, + "ingredient": { + "item": "twilightforest:nagastone_pillar" + }, + "result": "twilightforest:cracked_nagastone_pillar" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/ore_map.json b/src/generated/resources/data/twilightforest/recipes/ore_map.json new file mode 100644 index 0000000000..456b783a9c --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/ore_map.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "twilightforest:maze_map" + }, + { + "tag": "forge:storage_blocks/diamond" + }, + { + "tag": "forge:storage_blocks/gold" + }, + { + "tag": "forge:storage_blocks/iron" + } + ], + "result": { + "item": "twilightforest:ore_map" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/quest_ram_banner_pattern.json b/src/generated/resources/data/twilightforest/recipes/quest_ram_banner_pattern.json new file mode 100644 index 0000000000..ead650db07 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/quest_ram_banner_pattern.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "tag": "forge:paper" + }, + { + "item": "twilightforest:quest_ram_trophy" + } + ], + "result": { + "item": "twilightforest:quest_ram_banner_pattern" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/reappearing_block.json b/src/generated/resources/data/twilightforest/recipes/reappearing_block.json new file mode 100644 index 0000000000..a8ae1f2d5b --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/reappearing_block.json @@ -0,0 +1,25 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "redstone", + "key": { + "#": { + "item": "twilightforest:encased_towerwood" + }, + "6": { + "tag": "forge:gems/carminite" + }, + "∴": { + "tag": "forge:dusts/redstone" + } + }, + "pattern": [ + "#∴#", + "∴6∴", + "#∴#" + ], + "result": { + "count": 2, + "item": "twilightforest:reappearing_block" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/root_stick.json b/src/generated/resources/data/twilightforest/recipes/root_stick.json new file mode 100644 index 0000000000..9d012a2f98 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/root_stick.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "twilightforest:root_strand" + } + ], + "result": { + "item": "minecraft:stick" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/smelted_cracked_underbrick.json b/src/generated/resources/data/twilightforest/recipes/smelted_cracked_underbrick.json new file mode 100644 index 0000000000..f8c3a812c2 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/smelted_cracked_underbrick.json @@ -0,0 +1,10 @@ +{ + "type": "minecraft:smelting", + "category": "blocks", + "cookingtime": 200, + "experience": 0.3, + "ingredient": { + "item": "twilightforest:underbrick" + }, + "result": "twilightforest:cracked_underbrick" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/snow_queen_banner_pattern.json b/src/generated/resources/data/twilightforest/recipes/snow_queen_banner_pattern.json new file mode 100644 index 0000000000..ee662b2c0a --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/snow_queen_banner_pattern.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "tag": "forge:paper" + }, + { + "item": "twilightforest:snow_queen_trophy" + } + ], + "result": { + "item": "twilightforest:snow_queen_banner_pattern" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/sorting_boat.json b/src/generated/resources/data/twilightforest/recipes/sorting_boat.json new file mode 100644 index 0000000000..fde79016b9 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/sorting_boat.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "group": "boat", + "key": { + "P": { + "item": "twilightforest:sorting_planks" + } + }, + "pattern": [ + "P P", + "PPP" + ], + "result": { + "item": "twilightforest:sorting_boat" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/sorting_chest_boat.json b/src/generated/resources/data/twilightforest/recipes/sorting_chest_boat.json new file mode 100644 index 0000000000..d64e9966b8 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/sorting_chest_boat.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "group": "chest_boat", + "ingredients": [ + { + "item": "twilightforest:sorting_boat" + }, + { + "tag": "forge:chests/wooden" + } + ], + "result": { + "item": "twilightforest:sorting_chest_boat" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/stonecutting/acacia_log/hollow_acacia_log.json b/src/generated/resources/data/twilightforest/recipes/stonecutting/acacia_log/hollow_acacia_log.json new file mode 100644 index 0000000000..0d843f3331 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/stonecutting/acacia_log/hollow_acacia_log.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "item": "minecraft:acacia_log" + }, + "result": "twilightforest:hollow_acacia_log" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/stonecutting/birch_log/hollow_birch_log.json b/src/generated/resources/data/twilightforest/recipes/stonecutting/birch_log/hollow_birch_log.json new file mode 100644 index 0000000000..528887fe2d --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/stonecutting/birch_log/hollow_birch_log.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "item": "minecraft:birch_log" + }, + "result": "twilightforest:hollow_birch_log" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/stonecutting/bold_castle_brick_pillar/bold_castle_brick_stairs.json b/src/generated/resources/data/twilightforest/recipes/stonecutting/bold_castle_brick_pillar/bold_castle_brick_stairs.json new file mode 100644 index 0000000000..33c14a6e7f --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/stonecutting/bold_castle_brick_pillar/bold_castle_brick_stairs.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "item": "twilightforest:bold_castle_brick_pillar" + }, + "result": "twilightforest:bold_castle_brick_stairs" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/stonecutting/bold_castle_brick_pillar/bold_castle_brick_tile.json b/src/generated/resources/data/twilightforest/recipes/stonecutting/bold_castle_brick_pillar/bold_castle_brick_tile.json new file mode 100644 index 0000000000..101d330eaa --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/stonecutting/bold_castle_brick_pillar/bold_castle_brick_tile.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "item": "twilightforest:bold_castle_brick_pillar" + }, + "result": "twilightforest:bold_castle_brick_tile" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/stonecutting/canopy_log/hollow_canopy_log.json b/src/generated/resources/data/twilightforest/recipes/stonecutting/canopy_log/hollow_canopy_log.json new file mode 100644 index 0000000000..b9451a3325 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/stonecutting/canopy_log/hollow_canopy_log.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "item": "twilightforest:canopy_log" + }, + "result": "twilightforest:hollow_canopy_log" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/stonecutting/castle_brick/castle_brick_stairs.json b/src/generated/resources/data/twilightforest/recipes/stonecutting/castle_brick/castle_brick_stairs.json new file mode 100644 index 0000000000..9d8897234b --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/stonecutting/castle_brick/castle_brick_stairs.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "item": "twilightforest:castle_brick" + }, + "result": "twilightforest:castle_brick_stairs" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/stonecutting/castle_brick/thick_castle_brick.json b/src/generated/resources/data/twilightforest/recipes/stonecutting/castle_brick/thick_castle_brick.json new file mode 100644 index 0000000000..e945dbb4aa --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/stonecutting/castle_brick/thick_castle_brick.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "item": "twilightforest:castle_brick" + }, + "result": "twilightforest:thick_castle_brick" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/stonecutting/castle_brick/worn_castle_brick.json b/src/generated/resources/data/twilightforest/recipes/stonecutting/castle_brick/worn_castle_brick.json new file mode 100644 index 0000000000..4ddbffdf0d --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/stonecutting/castle_brick/worn_castle_brick.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "item": "twilightforest:castle_brick" + }, + "result": "twilightforest:worn_castle_brick" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/stonecutting/cracked_castle_brick/cracked_castle_brick_stairs.json b/src/generated/resources/data/twilightforest/recipes/stonecutting/cracked_castle_brick/cracked_castle_brick_stairs.json new file mode 100644 index 0000000000..c99d9a80dd --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/stonecutting/cracked_castle_brick/cracked_castle_brick_stairs.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "item": "twilightforest:cracked_castle_brick" + }, + "result": "twilightforest:cracked_castle_brick_stairs" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/stonecutting/cracked_castle_brick/thick_castle_brick.json b/src/generated/resources/data/twilightforest/recipes/stonecutting/cracked_castle_brick/thick_castle_brick.json new file mode 100644 index 0000000000..8ef8c2b9c5 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/stonecutting/cracked_castle_brick/thick_castle_brick.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "item": "twilightforest:cracked_castle_brick" + }, + "result": "twilightforest:thick_castle_brick" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/stonecutting/cracked_etched_nagastone/cracked_nagastone_stairs_left.json b/src/generated/resources/data/twilightforest/recipes/stonecutting/cracked_etched_nagastone/cracked_nagastone_stairs_left.json new file mode 100644 index 0000000000..f4ef01ea05 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/stonecutting/cracked_etched_nagastone/cracked_nagastone_stairs_left.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "item": "twilightforest:cracked_etched_nagastone" + }, + "result": "twilightforest:cracked_nagastone_stairs_left" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/stonecutting/cracked_etched_nagastone/cracked_nagastone_stairs_right.json b/src/generated/resources/data/twilightforest/recipes/stonecutting/cracked_etched_nagastone/cracked_nagastone_stairs_right.json new file mode 100644 index 0000000000..c77269b369 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/stonecutting/cracked_etched_nagastone/cracked_nagastone_stairs_right.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "item": "twilightforest:cracked_etched_nagastone" + }, + "result": "twilightforest:cracked_nagastone_stairs_right" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/stonecutting/cracked_nagastone_stairs_left/cracked_nagastone_stairs_right.json b/src/generated/resources/data/twilightforest/recipes/stonecutting/cracked_nagastone_stairs_left/cracked_nagastone_stairs_right.json new file mode 100644 index 0000000000..0a4ebdeb40 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/stonecutting/cracked_nagastone_stairs_left/cracked_nagastone_stairs_right.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "item": "twilightforest:cracked_nagastone_stairs_left" + }, + "result": "twilightforest:cracked_nagastone_stairs_right" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/stonecutting/cracked_nagastone_stairs_right/cracked_nagastone_stairs_left.json b/src/generated/resources/data/twilightforest/recipes/stonecutting/cracked_nagastone_stairs_right/cracked_nagastone_stairs_left.json new file mode 100644 index 0000000000..6e6b8538b5 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/stonecutting/cracked_nagastone_stairs_right/cracked_nagastone_stairs_left.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "item": "twilightforest:cracked_nagastone_stairs_right" + }, + "result": "twilightforest:cracked_nagastone_stairs_left" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/stonecutting/crimson_stem/hollow_crimson_stem.json b/src/generated/resources/data/twilightforest/recipes/stonecutting/crimson_stem/hollow_crimson_stem.json new file mode 100644 index 0000000000..05810842fe --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/stonecutting/crimson_stem/hollow_crimson_stem.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "item": "minecraft:crimson_stem" + }, + "result": "twilightforest:hollow_crimson_stem" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/stonecutting/cut_mazestone/decorative_mazestone.json b/src/generated/resources/data/twilightforest/recipes/stonecutting/cut_mazestone/decorative_mazestone.json new file mode 100644 index 0000000000..ba1b420cc5 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/stonecutting/cut_mazestone/decorative_mazestone.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "item": "twilightforest:cut_mazestone" + }, + "result": "twilightforest:decorative_mazestone" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/stonecutting/cut_mazestone/mazestone_border.json b/src/generated/resources/data/twilightforest/recipes/stonecutting/cut_mazestone/mazestone_border.json new file mode 100644 index 0000000000..70b57ff1e8 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/stonecutting/cut_mazestone/mazestone_border.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "item": "twilightforest:cut_mazestone" + }, + "result": "twilightforest:mazestone_border" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/stonecutting/cut_mazestone/mazestone_brick.json b/src/generated/resources/data/twilightforest/recipes/stonecutting/cut_mazestone/mazestone_brick.json new file mode 100644 index 0000000000..415adc125f --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/stonecutting/cut_mazestone/mazestone_brick.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "item": "twilightforest:cut_mazestone" + }, + "result": "twilightforest:mazestone_brick" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/stonecutting/cut_mazestone/mazestone_mosaic.json b/src/generated/resources/data/twilightforest/recipes/stonecutting/cut_mazestone/mazestone_mosaic.json new file mode 100644 index 0000000000..76a727ce20 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/stonecutting/cut_mazestone/mazestone_mosaic.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "item": "twilightforest:cut_mazestone" + }, + "result": "twilightforest:mazestone_mosaic" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/stonecutting/dark_log/hollow_dark_log.json b/src/generated/resources/data/twilightforest/recipes/stonecutting/dark_log/hollow_dark_log.json new file mode 100644 index 0000000000..29aa0ee153 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/stonecutting/dark_log/hollow_dark_log.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "item": "twilightforest:dark_log" + }, + "result": "twilightforest:hollow_dark_log" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/stonecutting/dark_log/towerwood.json b/src/generated/resources/data/twilightforest/recipes/stonecutting/dark_log/towerwood.json new file mode 100644 index 0000000000..2d1e62764c --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/stonecutting/dark_log/towerwood.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "item": "twilightforest:dark_log" + }, + "result": "twilightforest:towerwood" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/stonecutting/dark_oak_log/hollow_dark_oak_log.json b/src/generated/resources/data/twilightforest/recipes/stonecutting/dark_oak_log/hollow_dark_oak_log.json new file mode 100644 index 0000000000..90fc0fb946 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/stonecutting/dark_oak_log/hollow_dark_oak_log.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "item": "minecraft:dark_oak_log" + }, + "result": "twilightforest:hollow_dark_oak_log" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/stonecutting/dark_wood/towerwood.json b/src/generated/resources/data/twilightforest/recipes/stonecutting/dark_wood/towerwood.json new file mode 100644 index 0000000000..fb8f385e36 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/stonecutting/dark_wood/towerwood.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "item": "twilightforest:dark_wood" + }, + "result": "twilightforest:towerwood" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/stonecutting/decorative_mazestone/cut_mazestone.json b/src/generated/resources/data/twilightforest/recipes/stonecutting/decorative_mazestone/cut_mazestone.json new file mode 100644 index 0000000000..9589004431 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/stonecutting/decorative_mazestone/cut_mazestone.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "item": "twilightforest:decorative_mazestone" + }, + "result": "twilightforest:cut_mazestone" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/stonecutting/decorative_mazestone/mazestone_border.json b/src/generated/resources/data/twilightforest/recipes/stonecutting/decorative_mazestone/mazestone_border.json new file mode 100644 index 0000000000..6c76dcb1cd --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/stonecutting/decorative_mazestone/mazestone_border.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "item": "twilightforest:decorative_mazestone" + }, + "result": "twilightforest:mazestone_border" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/stonecutting/decorative_mazestone/mazestone_brick.json b/src/generated/resources/data/twilightforest/recipes/stonecutting/decorative_mazestone/mazestone_brick.json new file mode 100644 index 0000000000..35283b2ae1 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/stonecutting/decorative_mazestone/mazestone_brick.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "item": "twilightforest:decorative_mazestone" + }, + "result": "twilightforest:mazestone_brick" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/stonecutting/decorative_mazestone/mazestone_mosaic.json b/src/generated/resources/data/twilightforest/recipes/stonecutting/decorative_mazestone/mazestone_mosaic.json new file mode 100644 index 0000000000..953a6df01f --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/stonecutting/decorative_mazestone/mazestone_mosaic.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "item": "twilightforest:decorative_mazestone" + }, + "result": "twilightforest:mazestone_mosaic" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/stonecutting/encased_castle_brick_pillar/encased_castle_brick_stairs.json b/src/generated/resources/data/twilightforest/recipes/stonecutting/encased_castle_brick_pillar/encased_castle_brick_stairs.json new file mode 100644 index 0000000000..74c4050765 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/stonecutting/encased_castle_brick_pillar/encased_castle_brick_stairs.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "item": "twilightforest:encased_castle_brick_pillar" + }, + "result": "twilightforest:encased_castle_brick_stairs" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/stonecutting/encased_castle_brick_pillar/encased_castle_brick_tile.json b/src/generated/resources/data/twilightforest/recipes/stonecutting/encased_castle_brick_pillar/encased_castle_brick_tile.json new file mode 100644 index 0000000000..835e6342ca --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/stonecutting/encased_castle_brick_pillar/encased_castle_brick_tile.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "item": "twilightforest:encased_castle_brick_pillar" + }, + "result": "twilightforest:encased_castle_brick_tile" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/stonecutting/etched_nagastone/nagastone_stairs_left.json b/src/generated/resources/data/twilightforest/recipes/stonecutting/etched_nagastone/nagastone_stairs_left.json new file mode 100644 index 0000000000..0ac2aff76d --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/stonecutting/etched_nagastone/nagastone_stairs_left.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "item": "twilightforest:etched_nagastone" + }, + "result": "twilightforest:nagastone_stairs_left" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/stonecutting/etched_nagastone/nagastone_stairs_right.json b/src/generated/resources/data/twilightforest/recipes/stonecutting/etched_nagastone/nagastone_stairs_right.json new file mode 100644 index 0000000000..77030dbf43 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/stonecutting/etched_nagastone/nagastone_stairs_right.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "item": "twilightforest:etched_nagastone" + }, + "result": "twilightforest:nagastone_stairs_right" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/stonecutting/jungle_log/hollow_jungle_log.json b/src/generated/resources/data/twilightforest/recipes/stonecutting/jungle_log/hollow_jungle_log.json new file mode 100644 index 0000000000..76ffd43ba7 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/stonecutting/jungle_log/hollow_jungle_log.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "item": "minecraft:jungle_log" + }, + "result": "twilightforest:hollow_jungle_log" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/stonecutting/mangrove_log/hollow_mangrove_log.json b/src/generated/resources/data/twilightforest/recipes/stonecutting/mangrove_log/hollow_mangrove_log.json new file mode 100644 index 0000000000..7728137387 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/stonecutting/mangrove_log/hollow_mangrove_log.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "item": "twilightforest:mangrove_log" + }, + "result": "twilightforest:hollow_mangrove_log" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/stonecutting/mangrove_log/hollow_vangrove_log.json b/src/generated/resources/data/twilightforest/recipes/stonecutting/mangrove_log/hollow_vangrove_log.json new file mode 100644 index 0000000000..1005f4d1c2 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/stonecutting/mangrove_log/hollow_vangrove_log.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "item": "minecraft:mangrove_log" + }, + "result": "twilightforest:hollow_vangrove_log" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/stonecutting/mazestone/cut_mazestone.json b/src/generated/resources/data/twilightforest/recipes/stonecutting/mazestone/cut_mazestone.json new file mode 100644 index 0000000000..8fddb8f3b7 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/stonecutting/mazestone/cut_mazestone.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "item": "twilightforest:mazestone" + }, + "result": "twilightforest:cut_mazestone" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/stonecutting/mazestone/decorative_mazestone.json b/src/generated/resources/data/twilightforest/recipes/stonecutting/mazestone/decorative_mazestone.json new file mode 100644 index 0000000000..7f5c225014 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/stonecutting/mazestone/decorative_mazestone.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "item": "twilightforest:mazestone" + }, + "result": "twilightforest:decorative_mazestone" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/stonecutting/mazestone/mazestone_border.json b/src/generated/resources/data/twilightforest/recipes/stonecutting/mazestone/mazestone_border.json new file mode 100644 index 0000000000..5a8ff4ca2c --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/stonecutting/mazestone/mazestone_border.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "item": "twilightforest:mazestone" + }, + "result": "twilightforest:mazestone_border" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/stonecutting/mazestone/mazestone_brick.json b/src/generated/resources/data/twilightforest/recipes/stonecutting/mazestone/mazestone_brick.json new file mode 100644 index 0000000000..f3755723ac --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/stonecutting/mazestone/mazestone_brick.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "item": "twilightforest:mazestone" + }, + "result": "twilightforest:mazestone_brick" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/stonecutting/mazestone/mazestone_mosaic.json b/src/generated/resources/data/twilightforest/recipes/stonecutting/mazestone/mazestone_mosaic.json new file mode 100644 index 0000000000..bf2afc79cd --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/stonecutting/mazestone/mazestone_mosaic.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "item": "twilightforest:mazestone" + }, + "result": "twilightforest:mazestone_mosaic" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/stonecutting/mazestone_border/cut_mazestone.json b/src/generated/resources/data/twilightforest/recipes/stonecutting/mazestone_border/cut_mazestone.json new file mode 100644 index 0000000000..a5f895ef84 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/stonecutting/mazestone_border/cut_mazestone.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "item": "twilightforest:mazestone_border" + }, + "result": "twilightforest:cut_mazestone" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/stonecutting/mazestone_border/decorative_mazestone.json b/src/generated/resources/data/twilightforest/recipes/stonecutting/mazestone_border/decorative_mazestone.json new file mode 100644 index 0000000000..93a7991d18 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/stonecutting/mazestone_border/decorative_mazestone.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "item": "twilightforest:mazestone_border" + }, + "result": "twilightforest:decorative_mazestone" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/stonecutting/mazestone_border/mazestone_brick.json b/src/generated/resources/data/twilightforest/recipes/stonecutting/mazestone_border/mazestone_brick.json new file mode 100644 index 0000000000..db636aeab1 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/stonecutting/mazestone_border/mazestone_brick.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "item": "twilightforest:mazestone_border" + }, + "result": "twilightforest:mazestone_brick" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/stonecutting/mazestone_border/mazestone_mosaic.json b/src/generated/resources/data/twilightforest/recipes/stonecutting/mazestone_border/mazestone_mosaic.json new file mode 100644 index 0000000000..13e9eadc3b --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/stonecutting/mazestone_border/mazestone_mosaic.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "item": "twilightforest:mazestone_border" + }, + "result": "twilightforest:mazestone_mosaic" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/stonecutting/mazestone_brick/cut_mazestone.json b/src/generated/resources/data/twilightforest/recipes/stonecutting/mazestone_brick/cut_mazestone.json new file mode 100644 index 0000000000..e8a3e6ca61 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/stonecutting/mazestone_brick/cut_mazestone.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "item": "twilightforest:mazestone_brick" + }, + "result": "twilightforest:cut_mazestone" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/stonecutting/mazestone_brick/decorative_mazestone.json b/src/generated/resources/data/twilightforest/recipes/stonecutting/mazestone_brick/decorative_mazestone.json new file mode 100644 index 0000000000..c1dc96b2b3 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/stonecutting/mazestone_brick/decorative_mazestone.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "item": "twilightforest:mazestone_brick" + }, + "result": "twilightforest:decorative_mazestone" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/stonecutting/mazestone_brick/mazestone_border.json b/src/generated/resources/data/twilightforest/recipes/stonecutting/mazestone_brick/mazestone_border.json new file mode 100644 index 0000000000..312fccc3e1 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/stonecutting/mazestone_brick/mazestone_border.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "item": "twilightforest:mazestone_brick" + }, + "result": "twilightforest:mazestone_border" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/stonecutting/mazestone_brick/mazestone_mosaic.json b/src/generated/resources/data/twilightforest/recipes/stonecutting/mazestone_brick/mazestone_mosaic.json new file mode 100644 index 0000000000..513c3853a8 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/stonecutting/mazestone_brick/mazestone_mosaic.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "item": "twilightforest:mazestone_brick" + }, + "result": "twilightforest:mazestone_mosaic" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/stonecutting/mazestone_mosaic/cut_mazestone.json b/src/generated/resources/data/twilightforest/recipes/stonecutting/mazestone_mosaic/cut_mazestone.json new file mode 100644 index 0000000000..1ca15f53b4 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/stonecutting/mazestone_mosaic/cut_mazestone.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "item": "twilightforest:mazestone_mosaic" + }, + "result": "twilightforest:cut_mazestone" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/stonecutting/mazestone_mosaic/decorative_mazestone.json b/src/generated/resources/data/twilightforest/recipes/stonecutting/mazestone_mosaic/decorative_mazestone.json new file mode 100644 index 0000000000..571e047d86 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/stonecutting/mazestone_mosaic/decorative_mazestone.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "item": "twilightforest:mazestone_mosaic" + }, + "result": "twilightforest:decorative_mazestone" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/stonecutting/mazestone_mosaic/mazestone_border.json b/src/generated/resources/data/twilightforest/recipes/stonecutting/mazestone_mosaic/mazestone_border.json new file mode 100644 index 0000000000..1150f4f752 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/stonecutting/mazestone_mosaic/mazestone_border.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "item": "twilightforest:mazestone_mosaic" + }, + "result": "twilightforest:mazestone_border" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/stonecutting/mazestone_mosaic/mazestone_brick.json b/src/generated/resources/data/twilightforest/recipes/stonecutting/mazestone_mosaic/mazestone_brick.json new file mode 100644 index 0000000000..cf5036f271 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/stonecutting/mazestone_mosaic/mazestone_brick.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "item": "twilightforest:mazestone_mosaic" + }, + "result": "twilightforest:mazestone_brick" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/stonecutting/mining_log/hollow_mining_log.json b/src/generated/resources/data/twilightforest/recipes/stonecutting/mining_log/hollow_mining_log.json new file mode 100644 index 0000000000..7450c050c1 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/stonecutting/mining_log/hollow_mining_log.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "item": "twilightforest:mining_log" + }, + "result": "twilightforest:hollow_mining_log" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/stonecutting/mossy_castle_brick/mossy_castle_brick_stairs.json b/src/generated/resources/data/twilightforest/recipes/stonecutting/mossy_castle_brick/mossy_castle_brick_stairs.json new file mode 100644 index 0000000000..d3ec983e94 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/stonecutting/mossy_castle_brick/mossy_castle_brick_stairs.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "item": "twilightforest:mossy_castle_brick" + }, + "result": "twilightforest:mossy_castle_brick_stairs" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/stonecutting/mossy_castle_brick/thick_castle_brick.json b/src/generated/resources/data/twilightforest/recipes/stonecutting/mossy_castle_brick/thick_castle_brick.json new file mode 100644 index 0000000000..42b678ff8d --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/stonecutting/mossy_castle_brick/thick_castle_brick.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "item": "twilightforest:mossy_castle_brick" + }, + "result": "twilightforest:thick_castle_brick" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/stonecutting/mossy_etched_nagastone/mossy_nagastone_stairs_left.json b/src/generated/resources/data/twilightforest/recipes/stonecutting/mossy_etched_nagastone/mossy_nagastone_stairs_left.json new file mode 100644 index 0000000000..b14c531e1c --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/stonecutting/mossy_etched_nagastone/mossy_nagastone_stairs_left.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "item": "twilightforest:mossy_etched_nagastone" + }, + "result": "twilightforest:mossy_nagastone_stairs_left" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/stonecutting/mossy_etched_nagastone/mossy_nagastone_stairs_right.json b/src/generated/resources/data/twilightforest/recipes/stonecutting/mossy_etched_nagastone/mossy_nagastone_stairs_right.json new file mode 100644 index 0000000000..860638f097 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/stonecutting/mossy_etched_nagastone/mossy_nagastone_stairs_right.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "item": "twilightforest:mossy_etched_nagastone" + }, + "result": "twilightforest:mossy_nagastone_stairs_right" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/stonecutting/mossy_nagastone_stairs_left/mossy_nagastone_stairs_right.json b/src/generated/resources/data/twilightforest/recipes/stonecutting/mossy_nagastone_stairs_left/mossy_nagastone_stairs_right.json new file mode 100644 index 0000000000..b73367dd8a --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/stonecutting/mossy_nagastone_stairs_left/mossy_nagastone_stairs_right.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "item": "twilightforest:mossy_nagastone_stairs_left" + }, + "result": "twilightforest:mossy_nagastone_stairs_right" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/stonecutting/mossy_nagastone_stairs_right/mossy_nagastone_stairs_left.json b/src/generated/resources/data/twilightforest/recipes/stonecutting/mossy_nagastone_stairs_right/mossy_nagastone_stairs_left.json new file mode 100644 index 0000000000..a4c5233e98 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/stonecutting/mossy_nagastone_stairs_right/mossy_nagastone_stairs_left.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "item": "twilightforest:mossy_nagastone_stairs_right" + }, + "result": "twilightforest:mossy_nagastone_stairs_left" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/stonecutting/nagastone_stairs_left/nagastone_stairs_right.json b/src/generated/resources/data/twilightforest/recipes/stonecutting/nagastone_stairs_left/nagastone_stairs_right.json new file mode 100644 index 0000000000..29e94ec1bd --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/stonecutting/nagastone_stairs_left/nagastone_stairs_right.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "item": "twilightforest:nagastone_stairs_left" + }, + "result": "twilightforest:nagastone_stairs_right" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/stonecutting/nagastone_stairs_right/nagastone_stairs_left.json b/src/generated/resources/data/twilightforest/recipes/stonecutting/nagastone_stairs_right/nagastone_stairs_left.json new file mode 100644 index 0000000000..c7ab6bb2fd --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/stonecutting/nagastone_stairs_right/nagastone_stairs_left.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "item": "twilightforest:nagastone_stairs_right" + }, + "result": "twilightforest:nagastone_stairs_left" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/stonecutting/oak_log/hollow_oak_log.json b/src/generated/resources/data/twilightforest/recipes/stonecutting/oak_log/hollow_oak_log.json new file mode 100644 index 0000000000..53a22d5402 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/stonecutting/oak_log/hollow_oak_log.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "item": "minecraft:oak_log" + }, + "result": "twilightforest:hollow_oak_log" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/stonecutting/sorting_log/hollow_sorting_log.json b/src/generated/resources/data/twilightforest/recipes/stonecutting/sorting_log/hollow_sorting_log.json new file mode 100644 index 0000000000..940b2b1633 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/stonecutting/sorting_log/hollow_sorting_log.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "item": "twilightforest:sorting_log" + }, + "result": "twilightforest:hollow_sorting_log" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/stonecutting/spruce_log/hollow_spruce_log.json b/src/generated/resources/data/twilightforest/recipes/stonecutting/spruce_log/hollow_spruce_log.json new file mode 100644 index 0000000000..ca85d423db --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/stonecutting/spruce_log/hollow_spruce_log.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "item": "minecraft:spruce_log" + }, + "result": "twilightforest:hollow_spruce_log" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/stonecutting/stone/bold_stone_pillar.json b/src/generated/resources/data/twilightforest/recipes/stonecutting/stone/bold_stone_pillar.json new file mode 100644 index 0000000000..f064c912c4 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/stonecutting/stone/bold_stone_pillar.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "item": "minecraft:stone" + }, + "result": "twilightforest:bold_stone_pillar" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/stonecutting/stone/twisted_stone.json b/src/generated/resources/data/twilightforest/recipes/stonecutting/stone/twisted_stone.json new file mode 100644 index 0000000000..e08c63e99b --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/stonecutting/stone/twisted_stone.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "item": "minecraft:stone" + }, + "result": "twilightforest:twisted_stone" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/stonecutting/thick_castle_brick/bold_castle_brick_pillar.json b/src/generated/resources/data/twilightforest/recipes/stonecutting/thick_castle_brick/bold_castle_brick_pillar.json new file mode 100644 index 0000000000..6e1a1cf227 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/stonecutting/thick_castle_brick/bold_castle_brick_pillar.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "item": "twilightforest:thick_castle_brick" + }, + "result": "twilightforest:bold_castle_brick_pillar" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/stonecutting/time_log/hollow_time_log.json b/src/generated/resources/data/twilightforest/recipes/stonecutting/time_log/hollow_time_log.json new file mode 100644 index 0000000000..cfa2feec48 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/stonecutting/time_log/hollow_time_log.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "item": "twilightforest:time_log" + }, + "result": "twilightforest:hollow_time_log" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/stonecutting/towerwood/encased_towerwood.json b/src/generated/resources/data/twilightforest/recipes/stonecutting/towerwood/encased_towerwood.json new file mode 100644 index 0000000000..68178342af --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/stonecutting/towerwood/encased_towerwood.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "item": "twilightforest:towerwood" + }, + "result": "twilightforest:encased_towerwood" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/stonecutting/transformation_log/hollow_transformation_log.json b/src/generated/resources/data/twilightforest/recipes/stonecutting/transformation_log/hollow_transformation_log.json new file mode 100644 index 0000000000..0756827d92 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/stonecutting/transformation_log/hollow_transformation_log.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "item": "twilightforest:transformation_log" + }, + "result": "twilightforest:hollow_transformation_log" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/stonecutting/twilight_oak_log/hollow_twilight_oak_log.json b/src/generated/resources/data/twilightforest/recipes/stonecutting/twilight_oak_log/hollow_twilight_oak_log.json new file mode 100644 index 0000000000..4d6f2a1a67 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/stonecutting/twilight_oak_log/hollow_twilight_oak_log.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "item": "twilightforest:twilight_oak_log" + }, + "result": "twilightforest:hollow_twilight_oak_log" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/stonecutting/underbrick/underbrick_floor.json b/src/generated/resources/data/twilightforest/recipes/stonecutting/underbrick/underbrick_floor.json new file mode 100644 index 0000000000..5878b14ffd --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/stonecutting/underbrick/underbrick_floor.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "item": "twilightforest:underbrick" + }, + "result": "twilightforest:underbrick_floor" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/stonecutting/warped_stem/hollow_warped_stem.json b/src/generated/resources/data/twilightforest/recipes/stonecutting/warped_stem/hollow_warped_stem.json new file mode 100644 index 0000000000..df501d5f09 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/stonecutting/warped_stem/hollow_warped_stem.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "item": "minecraft:warped_stem" + }, + "result": "twilightforest:hollow_warped_stem" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/stonecutting/worn_castle_brick/thick_castle_brick.json b/src/generated/resources/data/twilightforest/recipes/stonecutting/worn_castle_brick/thick_castle_brick.json new file mode 100644 index 0000000000..4bf94d2cca --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/stonecutting/worn_castle_brick/thick_castle_brick.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "item": "twilightforest:worn_castle_brick" + }, + "result": "twilightforest:thick_castle_brick" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/stonecutting/worn_castle_brick/worn_castle_brick_stairs.json b/src/generated/resources/data/twilightforest/recipes/stonecutting/worn_castle_brick/worn_castle_brick_stairs.json new file mode 100644 index 0000000000..fa0820df37 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/stonecutting/worn_castle_brick/worn_castle_brick_stairs.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:stonecutting", + "count": 1, + "ingredient": { + "item": "twilightforest:worn_castle_brick" + }, + "result": "twilightforest:worn_castle_brick_stairs" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/tf_moss_to_vanilla.json b/src/generated/resources/data/twilightforest/recipes/tf_moss_to_vanilla.json new file mode 100644 index 0000000000..f777d847bb --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/tf_moss_to_vanilla.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "m": { + "item": "twilightforest:moss_patch" + }, + "t": { + "item": "twilightforest:transformation_powder" + } + }, + "pattern": [ + "mmm", + "mtm", + "mmm" + ], + "result": { + "item": "minecraft:moss_block" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/tf_to_vanilla_lilypad.json b/src/generated/resources/data/twilightforest/recipes/tf_to_vanilla_lilypad.json new file mode 100644 index 0000000000..8e6d4ba401 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/tf_to_vanilla_lilypad.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "twilightforest:huge_lily_pad" + }, + { + "item": "twilightforest:transformation_powder" + } + ], + "result": { + "count": 4, + "item": "minecraft:lily_pad" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/thorn_rose_to_red.json b/src/generated/resources/data/twilightforest/recipes/thorn_rose_to_red.json new file mode 100644 index 0000000000..a1d8b8247a --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/thorn_rose_to_red.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "twilightforest:thorn_rose" + } + ], + "result": { + "item": "minecraft:red_dye" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/time_boat.json b/src/generated/resources/data/twilightforest/recipes/time_boat.json new file mode 100644 index 0000000000..6658a004cf --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/time_boat.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "group": "boat", + "key": { + "P": { + "item": "twilightforest:time_planks" + } + }, + "pattern": [ + "P P", + "PPP" + ], + "result": { + "item": "twilightforest:time_boat" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/time_chest_boat.json b/src/generated/resources/data/twilightforest/recipes/time_chest_boat.json new file mode 100644 index 0000000000..8acbe8ebe5 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/time_chest_boat.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "group": "chest_boat", + "ingredients": [ + { + "item": "twilightforest:time_boat" + }, + { + "tag": "forge:chests/wooden" + } + ], + "result": { + "item": "twilightforest:time_chest_boat" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/transformation_boat.json b/src/generated/resources/data/twilightforest/recipes/transformation_boat.json new file mode 100644 index 0000000000..0dcb0da62b --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/transformation_boat.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "group": "boat", + "key": { + "P": { + "item": "twilightforest:transformation_planks" + } + }, + "pattern": [ + "P P", + "PPP" + ], + "result": { + "item": "twilightforest:transformation_boat" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/transformation_chest_boat.json b/src/generated/resources/data/twilightforest/recipes/transformation_chest_boat.json new file mode 100644 index 0000000000..be87614dc3 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/transformation_chest_boat.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "group": "chest_boat", + "ingredients": [ + { + "item": "twilightforest:transformation_boat" + }, + { + "tag": "forge:chests/wooden" + } + ], + "result": { + "item": "twilightforest:transformation_chest_boat" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/transformation_powder/bighorn_sheep_to_sheep.json b/src/generated/resources/data/twilightforest/recipes/transformation_powder/bighorn_sheep_to_sheep.json new file mode 100644 index 0000000000..30fbeb0ff0 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/transformation_powder/bighorn_sheep_to_sheep.json @@ -0,0 +1,6 @@ +{ + "type": "twilightforest:transformation_powder", + "from": "twilightforest:bighorn_sheep", + "reversible": true, + "to": "minecraft:sheep" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/transformation_powder/boar_to_pig.json b/src/generated/resources/data/twilightforest/recipes/transformation_powder/boar_to_pig.json new file mode 100644 index 0000000000..6a212f9a88 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/transformation_powder/boar_to_pig.json @@ -0,0 +1,7 @@ +{ + "type": "twilightforest:transformation_powder", + "from": "twilightforest:boar", + "reversible": true, + "to": "minecraft:pig" +} + diff --git a/src/generated/resources/data/twilightforest/recipes/transformation_powder/carminite_ghastguard_to_ghast.json b/src/generated/resources/data/twilightforest/recipes/transformation_powder/carminite_ghastguard_to_ghast.json new file mode 100644 index 0000000000..ff21204a66 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/transformation_powder/carminite_ghastguard_to_ghast.json @@ -0,0 +1,6 @@ +{ + "type": "twilightforest:transformation_powder", + "from": "twilightforest:carminite_ghastguard", + "reversible": true, + "to": "minecraft:ghast" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/transformation_powder/deer_to_cow.json b/src/generated/resources/data/twilightforest/recipes/transformation_powder/deer_to_cow.json new file mode 100644 index 0000000000..e27436c720 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/transformation_powder/deer_to_cow.json @@ -0,0 +1,7 @@ +{ + "type": "twilightforest:transformation_powder", + "from": "twilightforest:deer", + "reversible": true, + "to": "minecraft:cow" +} + diff --git a/src/generated/resources/data/twilightforest/recipes/transformation_powder/dwarf_rabbit_to_rabbit.json b/src/generated/resources/data/twilightforest/recipes/transformation_powder/dwarf_rabbit_to_rabbit.json new file mode 100644 index 0000000000..f7492635f0 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/transformation_powder/dwarf_rabbit_to_rabbit.json @@ -0,0 +1,6 @@ +{ + "type": "twilightforest:transformation_powder", + "from": "twilightforest:dwarf_rabbit", + "reversible": true, + "to": "minecraft:rabbit" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/transformation_powder/hedge_spider_to_spider.json b/src/generated/resources/data/twilightforest/recipes/transformation_powder/hedge_spider_to_spider.json new file mode 100644 index 0000000000..c79e8be8b2 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/transformation_powder/hedge_spider_to_spider.json @@ -0,0 +1,6 @@ +{ + "type": "twilightforest:transformation_powder", + "from": "twilightforest:hedge_spider", + "reversible": true, + "to": "minecraft:spider" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/transformation_powder/hostile_wolf_to_wolf.json b/src/generated/resources/data/twilightforest/recipes/transformation_powder/hostile_wolf_to_wolf.json new file mode 100644 index 0000000000..55df74f999 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/transformation_powder/hostile_wolf_to_wolf.json @@ -0,0 +1,6 @@ +{ + "type": "twilightforest:transformation_powder", + "from": "twilightforest:hostile_wolf", + "reversible": true, + "to": "minecraft:wolf" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/transformation_powder/maze_slime_to_slime.json b/src/generated/resources/data/twilightforest/recipes/transformation_powder/maze_slime_to_slime.json new file mode 100644 index 0000000000..f8e1ee3aa1 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/transformation_powder/maze_slime_to_slime.json @@ -0,0 +1,6 @@ +{ + "type": "twilightforest:transformation_powder", + "from": "twilightforest:maze_slime", + "reversible": true, + "to": "minecraft:slime" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/transformation_powder/minotaur_to_zombified_piglin.json b/src/generated/resources/data/twilightforest/recipes/transformation_powder/minotaur_to_zombified_piglin.json new file mode 100644 index 0000000000..52db189329 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/transformation_powder/minotaur_to_zombified_piglin.json @@ -0,0 +1,6 @@ +{ + "type": "twilightforest:transformation_powder", + "from": "twilightforest:minotaur", + "reversible": true, + "to": "minecraft:zombified_piglin" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/transformation_powder/penguin_to_chicken.json b/src/generated/resources/data/twilightforest/recipes/transformation_powder/penguin_to_chicken.json new file mode 100644 index 0000000000..9e7d701fb4 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/transformation_powder/penguin_to_chicken.json @@ -0,0 +1,6 @@ +{ + "type": "twilightforest:transformation_powder", + "from": "twilightforest:penguin", + "reversible": true, + "to": "minecraft:chicken" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/transformation_powder/raven_to_bat.json b/src/generated/resources/data/twilightforest/recipes/transformation_powder/raven_to_bat.json new file mode 100644 index 0000000000..fe61e8aa29 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/transformation_powder/raven_to_bat.json @@ -0,0 +1,6 @@ +{ + "type": "twilightforest:transformation_powder", + "from": "twilightforest:raven", + "reversible": true, + "to": "minecraft:bat" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/transformation_powder/skeleton_druid_to_witch.json b/src/generated/resources/data/twilightforest/recipes/transformation_powder/skeleton_druid_to_witch.json new file mode 100644 index 0000000000..676041ca37 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/transformation_powder/skeleton_druid_to_witch.json @@ -0,0 +1,6 @@ +{ + "type": "twilightforest:transformation_powder", + "from": "twilightforest:skeleton_druid", + "reversible": true, + "to": "minecraft:witch" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/transformation_powder/swarm_spider_to_cave_spider.json b/src/generated/resources/data/twilightforest/recipes/transformation_powder/swarm_spider_to_cave_spider.json new file mode 100644 index 0000000000..9e5ee81671 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/transformation_powder/swarm_spider_to_cave_spider.json @@ -0,0 +1,6 @@ +{ + "type": "twilightforest:transformation_powder", + "from": "twilightforest:swarm_spider", + "reversible": true, + "to": "minecraft:cave_spider" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/transformation_powder/tiny_bird_to_parrot.json b/src/generated/resources/data/twilightforest/recipes/transformation_powder/tiny_bird_to_parrot.json new file mode 100644 index 0000000000..424248cb2e --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/transformation_powder/tiny_bird_to_parrot.json @@ -0,0 +1,6 @@ +{ + "type": "twilightforest:transformation_powder", + "from": "twilightforest:tiny_bird", + "reversible": true, + "to": "minecraft:parrot" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/transformation_powder/towerwood_borer_to_silverfish.json b/src/generated/resources/data/twilightforest/recipes/transformation_powder/towerwood_borer_to_silverfish.json new file mode 100644 index 0000000000..f529320142 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/transformation_powder/towerwood_borer_to_silverfish.json @@ -0,0 +1,6 @@ +{ + "type": "twilightforest:transformation_powder", + "from": "twilightforest:towerwood_borer", + "reversible": true, + "to": "minecraft:silverfish" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/transformation_powder/wraith_to_vex.json b/src/generated/resources/data/twilightforest/recipes/transformation_powder/wraith_to_vex.json new file mode 100644 index 0000000000..33c7a48779 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/transformation_powder/wraith_to_vex.json @@ -0,0 +1,6 @@ +{ + "type": "twilightforest:transformation_powder", + "from": "twilightforest:wraith", + "reversible": true, + "to": "minecraft:vex" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/twilight_oak_boat.json b/src/generated/resources/data/twilightforest/recipes/twilight_oak_boat.json new file mode 100644 index 0000000000..7df67f0c4c --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/twilight_oak_boat.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "group": "boat", + "key": { + "P": { + "item": "twilightforest:twilight_oak_planks" + } + }, + "pattern": [ + "P P", + "PPP" + ], + "result": { + "item": "twilightforest:twilight_oak_boat" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/twilight_oak_chest_boat.json b/src/generated/resources/data/twilightforest/recipes/twilight_oak_chest_boat.json new file mode 100644 index 0000000000..c9382e293c --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/twilight_oak_chest_boat.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "group": "chest_boat", + "ingredients": [ + { + "item": "twilightforest:twilight_oak_boat" + }, + { + "tag": "forge:chests/wooden" + } + ], + "result": { + "item": "twilightforest:twilight_oak_chest_boat" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/uncrafting/tipped_arrow_uncraft.json b/src/generated/resources/data/twilightforest/recipes/uncrafting/tipped_arrow_uncraft.json new file mode 100644 index 0000000000..c52b6c6961 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/uncrafting/tipped_arrow_uncraft.json @@ -0,0 +1,18 @@ +{ + "type": "twilightforest:uncrafting", + "cost": 4, + "count": 8, + "ingredient": { + "item": "minecraft:tipped_arrow" + }, + "key": { + "A": { + "item": "minecraft:arrow" + } + }, + "pattern": [ + "AAA", + "A A", + "AAA" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/uncrafting_table.json b/src/generated/resources/data/twilightforest/recipes/uncrafting_table.json new file mode 100644 index 0000000000..802744b7e0 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/uncrafting_table.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "#": { + "item": "minecraft:crafting_table" + }, + "X": { + "item": "twilightforest:maze_map_focus" + } + }, + "pattern": [ + "###", + "#X#", + "###" + ], + "result": { + "item": "twilightforest:uncrafting_table" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/ur_ghast_banner_pattern.json b/src/generated/resources/data/twilightforest/recipes/ur_ghast_banner_pattern.json new file mode 100644 index 0000000000..cbb90fe10e --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/ur_ghast_banner_pattern.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "tag": "forge:paper" + }, + { + "item": "twilightforest:ur_ghast_trophy" + } + ], + "result": { + "item": "twilightforest:ur_ghast_banner_pattern" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/vanilla_to_tf_lilypad.json b/src/generated/resources/data/twilightforest/recipes/vanilla_to_tf_lilypad.json new file mode 100644 index 0000000000..cd9f2df4cc --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/vanilla_to_tf_lilypad.json @@ -0,0 +1,24 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "minecraft:lily_pad" + }, + { + "item": "minecraft:lily_pad" + }, + { + "item": "minecraft:lily_pad" + }, + { + "item": "minecraft:lily_pad" + }, + { + "item": "twilightforest:transformation_powder" + } + ], + "result": { + "item": "twilightforest:huge_lily_pad" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/vanilla_to_tf_moss.json b/src/generated/resources/data/twilightforest/recipes/vanilla_to_tf_moss.json new file mode 100644 index 0000000000..b532ee9e3c --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/vanilla_to_tf_moss.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "minecraft:moss_block" + }, + { + "item": "twilightforest:transformation_powder" + } + ], + "result": { + "count": 8, + "item": "twilightforest:moss_patch" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/vanishing_block.json b/src/generated/resources/data/twilightforest/recipes/vanishing_block.json new file mode 100644 index 0000000000..b1b3db8854 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/vanishing_block.json @@ -0,0 +1,25 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "redstone", + "key": { + "#": { + "item": "twilightforest:encased_towerwood" + }, + "6": { + "tag": "forge:gems/carminite" + }, + "w": { + "tag": "twilightforest:towerwood" + } + }, + "pattern": [ + "#w#", + "w6w", + "#w#" + ], + "result": { + "count": 8, + "item": "twilightforest:vanishing_block" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/waterlily_to_magenta.json b/src/generated/resources/data/twilightforest/recipes/waterlily_to_magenta.json new file mode 100644 index 0000000000..0bd375b3cc --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/waterlily_to_magenta.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "twilightforest:huge_water_lily" + } + ], + "result": { + "item": "minecraft:magenta_dye" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/acacia_banister.json b/src/generated/resources/data/twilightforest/recipes/wood/acacia_banister.json new file mode 100644 index 0000000000..61aa94123f --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/acacia_banister.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "-": { + "item": "minecraft:acacia_slab" + }, + "|": { + "tag": "forge:rods/wooden" + } + }, + "pattern": [ + "---", + "| |" + ], + "result": { + "count": 3, + "item": "twilightforest:acacia_banister" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/aurora_slab_slab.json b/src/generated/resources/data/twilightforest/recipes/wood/aurora_slab_slab.json new file mode 100644 index 0000000000..f303010968 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/aurora_slab_slab.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "#": { + "item": "twilightforest:aurora_block" + } + }, + "pattern": [ + "###" + ], + "result": { + "count": 6, + "item": "twilightforest:aurora_slab" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/birch_banister.json b/src/generated/resources/data/twilightforest/recipes/wood/birch_banister.json new file mode 100644 index 0000000000..c93af60d39 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/birch_banister.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "-": { + "item": "minecraft:birch_slab" + }, + "|": { + "tag": "forge:rods/wooden" + } + }, + "pattern": [ + "---", + "| |" + ], + "result": { + "count": 3, + "item": "twilightforest:birch_banister" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/canopy_banister.json b/src/generated/resources/data/twilightforest/recipes/wood/canopy_banister.json new file mode 100644 index 0000000000..0239346943 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/canopy_banister.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "-": { + "item": "twilightforest:canopy_slab" + }, + "|": { + "tag": "forge:rods/wooden" + } + }, + "pattern": [ + "---", + "| |" + ], + "result": { + "count": 3, + "item": "twilightforest:canopy_banister" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/canopy_button.json b/src/generated/resources/data/twilightforest/recipes/wood/canopy_button.json new file mode 100644 index 0000000000..5104efd37c --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/canopy_button.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "redstone", + "ingredients": [ + { + "item": "twilightforest:canopy_planks" + } + ], + "result": { + "item": "twilightforest:canopy_button" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/canopy_chest.json b/src/generated/resources/data/twilightforest/recipes/wood/canopy_chest.json new file mode 100644 index 0000000000..754e60f5f9 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/canopy_chest.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "#": { + "item": "twilightforest:canopy_planks" + }, + "C": { + "tag": "forge:chests/wooden" + } + }, + "pattern": [ + "###", + "#C#", + "###" + ], + "result": { + "count": 2, + "item": "twilightforest:canopy_chest" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/canopy_door.json b/src/generated/resources/data/twilightforest/recipes/wood/canopy_door.json new file mode 100644 index 0000000000..fdbee36fd2 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/canopy_door.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "redstone", + "key": { + "#": { + "item": "twilightforest:canopy_planks" + } + }, + "pattern": [ + "##", + "##", + "##" + ], + "result": { + "count": 3, + "item": "twilightforest:canopy_door" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/canopy_fence.json b/src/generated/resources/data/twilightforest/recipes/wood/canopy_fence.json new file mode 100644 index 0000000000..3c7d84ef47 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/canopy_fence.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "#": { + "item": "twilightforest:canopy_planks" + }, + "S": { + "tag": "forge:rods/wooden" + } + }, + "pattern": [ + "#S#", + "#S#" + ], + "result": { + "count": 3, + "item": "twilightforest:canopy_fence" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/canopy_from_stripped_planks.json b/src/generated/resources/data/twilightforest/recipes/wood/canopy_from_stripped_planks.json new file mode 100644 index 0000000000..a32aed3854 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/canopy_from_stripped_planks.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "item": "twilightforest:stripped_canopy_log" + } + ], + "result": { + "count": 4, + "item": "twilightforest:canopy_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/canopy_from_stripped_wood_planks.json b/src/generated/resources/data/twilightforest/recipes/wood/canopy_from_stripped_wood_planks.json new file mode 100644 index 0000000000..b1d2aab810 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/canopy_from_stripped_wood_planks.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "item": "twilightforest:stripped_canopy_wood" + } + ], + "result": { + "count": 4, + "item": "twilightforest:canopy_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/canopy_from_wood_planks.json b/src/generated/resources/data/twilightforest/recipes/wood/canopy_from_wood_planks.json new file mode 100644 index 0000000000..7952356ede --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/canopy_from_wood_planks.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "item": "twilightforest:canopy_wood" + } + ], + "result": { + "count": 4, + "item": "twilightforest:canopy_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/canopy_gate.json b/src/generated/resources/data/twilightforest/recipes/wood/canopy_gate.json new file mode 100644 index 0000000000..0b8b7c8cba --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/canopy_gate.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "redstone", + "key": { + "#": { + "item": "twilightforest:canopy_planks" + }, + "S": { + "tag": "forge:rods/wooden" + } + }, + "pattern": [ + "S#S", + "S#S" + ], + "result": { + "item": "twilightforest:canopy_fence_gate" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/canopy_planks.json b/src/generated/resources/data/twilightforest/recipes/wood/canopy_planks.json new file mode 100644 index 0000000000..66ee820cf1 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/canopy_planks.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "item": "twilightforest:canopy_log" + } + ], + "result": { + "count": 4, + "item": "twilightforest:canopy_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/canopy_plate.json b/src/generated/resources/data/twilightforest/recipes/wood/canopy_plate.json new file mode 100644 index 0000000000..2ecf93962b --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/canopy_plate.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "redstone", + "key": { + "#": { + "item": "twilightforest:canopy_planks" + } + }, + "pattern": [ + "##" + ], + "result": { + "item": "twilightforest:canopy_pressure_plate" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/canopy_sign_wood.json b/src/generated/resources/data/twilightforest/recipes/wood/canopy_sign_wood.json new file mode 100644 index 0000000000..2b14efb3b8 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/canopy_sign_wood.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "#": { + "item": "twilightforest:canopy_planks" + }, + "-": { + "tag": "forge:rods/wooden" + } + }, + "pattern": [ + "###", + "###", + " - " + ], + "result": { + "count": 3, + "item": "twilightforest:canopy_sign" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/canopy_slab.json b/src/generated/resources/data/twilightforest/recipes/wood/canopy_slab.json new file mode 100644 index 0000000000..ffb9dc2cf6 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/canopy_slab.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "#": { + "item": "twilightforest:canopy_planks" + } + }, + "pattern": [ + "###" + ], + "result": { + "count": 6, + "item": "twilightforest:canopy_slab" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/canopy_stairs.json b/src/generated/resources/data/twilightforest/recipes/wood/canopy_stairs.json new file mode 100644 index 0000000000..077b57b9a6 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/canopy_stairs.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "#": { + "item": "twilightforest:canopy_planks" + } + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "result": { + "count": 8, + "item": "twilightforest:canopy_stairs" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/canopy_stripped_wood.json b/src/generated/resources/data/twilightforest/recipes/wood/canopy_stripped_wood.json new file mode 100644 index 0000000000..18f41af4fa --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/canopy_stripped_wood.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "#": { + "item": "twilightforest:stripped_canopy_log" + } + }, + "pattern": [ + "##", + "##" + ], + "result": { + "count": 3, + "item": "twilightforest:stripped_canopy_wood" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/canopy_trapdoor.json b/src/generated/resources/data/twilightforest/recipes/wood/canopy_trapdoor.json new file mode 100644 index 0000000000..2d0e31441a --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/canopy_trapdoor.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "redstone", + "key": { + "#": { + "item": "twilightforest:canopy_planks" + } + }, + "pattern": [ + "###", + "###" + ], + "result": { + "count": 2, + "item": "twilightforest:canopy_trapdoor" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/canopy_wood.json b/src/generated/resources/data/twilightforest/recipes/wood/canopy_wood.json new file mode 100644 index 0000000000..5411a0b3d1 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/canopy_wood.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "#": { + "item": "twilightforest:canopy_log" + } + }, + "pattern": [ + "##", + "##" + ], + "result": { + "count": 3, + "item": "twilightforest:canopy_wood" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/crimson_banister.json b/src/generated/resources/data/twilightforest/recipes/wood/crimson_banister.json new file mode 100644 index 0000000000..ffb1470c0e --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/crimson_banister.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "-": { + "item": "minecraft:crimson_slab" + }, + "|": { + "tag": "forge:rods/wooden" + } + }, + "pattern": [ + "---", + "| |" + ], + "result": { + "count": 3, + "item": "twilightforest:crimson_banister" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/dark_oak_banister.json b/src/generated/resources/data/twilightforest/recipes/wood/dark_oak_banister.json new file mode 100644 index 0000000000..6f355bd6e8 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/dark_oak_banister.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "-": { + "item": "minecraft:dark_oak_slab" + }, + "|": { + "tag": "forge:rods/wooden" + } + }, + "pattern": [ + "---", + "| |" + ], + "result": { + "count": 3, + "item": "twilightforest:dark_oak_banister" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/darkwood_banister.json b/src/generated/resources/data/twilightforest/recipes/wood/darkwood_banister.json new file mode 100644 index 0000000000..5797f3d0aa --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/darkwood_banister.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "-": { + "item": "twilightforest:dark_slab" + }, + "|": { + "tag": "forge:rods/wooden" + } + }, + "pattern": [ + "---", + "| |" + ], + "result": { + "count": 3, + "item": "twilightforest:dark_banister" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/darkwood_button.json b/src/generated/resources/data/twilightforest/recipes/wood/darkwood_button.json new file mode 100644 index 0000000000..cb5c28b991 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/darkwood_button.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "redstone", + "ingredients": [ + { + "item": "twilightforest:dark_planks" + } + ], + "result": { + "item": "twilightforest:dark_button" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/darkwood_chest.json b/src/generated/resources/data/twilightforest/recipes/wood/darkwood_chest.json new file mode 100644 index 0000000000..207332b618 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/darkwood_chest.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "#": { + "item": "twilightforest:dark_planks" + }, + "C": { + "tag": "forge:chests/wooden" + } + }, + "pattern": [ + "###", + "#C#", + "###" + ], + "result": { + "count": 2, + "item": "twilightforest:dark_chest" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/darkwood_door.json b/src/generated/resources/data/twilightforest/recipes/wood/darkwood_door.json new file mode 100644 index 0000000000..523d08c164 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/darkwood_door.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "redstone", + "key": { + "#": { + "item": "twilightforest:dark_planks" + } + }, + "pattern": [ + "##", + "##", + "##" + ], + "result": { + "count": 3, + "item": "twilightforest:dark_door" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/darkwood_fence.json b/src/generated/resources/data/twilightforest/recipes/wood/darkwood_fence.json new file mode 100644 index 0000000000..f3005cc9c3 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/darkwood_fence.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "#": { + "item": "twilightforest:dark_planks" + }, + "S": { + "tag": "forge:rods/wooden" + } + }, + "pattern": [ + "#S#", + "#S#" + ], + "result": { + "count": 3, + "item": "twilightforest:dark_fence" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/darkwood_from_stripped_planks.json b/src/generated/resources/data/twilightforest/recipes/wood/darkwood_from_stripped_planks.json new file mode 100644 index 0000000000..c026ef5bdd --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/darkwood_from_stripped_planks.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "item": "twilightforest:stripped_dark_log" + } + ], + "result": { + "count": 4, + "item": "twilightforest:dark_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/darkwood_from_stripped_wood_planks.json b/src/generated/resources/data/twilightforest/recipes/wood/darkwood_from_stripped_wood_planks.json new file mode 100644 index 0000000000..1454e96d05 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/darkwood_from_stripped_wood_planks.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "item": "twilightforest:stripped_dark_wood" + } + ], + "result": { + "count": 4, + "item": "twilightforest:dark_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/darkwood_from_wood_planks.json b/src/generated/resources/data/twilightforest/recipes/wood/darkwood_from_wood_planks.json new file mode 100644 index 0000000000..98ca6c6ecf --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/darkwood_from_wood_planks.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "item": "twilightforest:dark_wood" + } + ], + "result": { + "count": 4, + "item": "twilightforest:dark_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/darkwood_gate.json b/src/generated/resources/data/twilightforest/recipes/wood/darkwood_gate.json new file mode 100644 index 0000000000..ce3fa3225d --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/darkwood_gate.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "redstone", + "key": { + "#": { + "item": "twilightforest:dark_planks" + }, + "S": { + "tag": "forge:rods/wooden" + } + }, + "pattern": [ + "S#S", + "S#S" + ], + "result": { + "item": "twilightforest:dark_fence_gate" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/darkwood_planks.json b/src/generated/resources/data/twilightforest/recipes/wood/darkwood_planks.json new file mode 100644 index 0000000000..b5619f5dc4 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/darkwood_planks.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "item": "twilightforest:dark_log" + } + ], + "result": { + "count": 4, + "item": "twilightforest:dark_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/darkwood_plate.json b/src/generated/resources/data/twilightforest/recipes/wood/darkwood_plate.json new file mode 100644 index 0000000000..778be829e5 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/darkwood_plate.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "redstone", + "key": { + "#": { + "item": "twilightforest:dark_planks" + } + }, + "pattern": [ + "##" + ], + "result": { + "item": "twilightforest:dark_pressure_plate" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/darkwood_sign_wood.json b/src/generated/resources/data/twilightforest/recipes/wood/darkwood_sign_wood.json new file mode 100644 index 0000000000..1450795ee5 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/darkwood_sign_wood.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "#": { + "item": "twilightforest:dark_planks" + }, + "-": { + "tag": "forge:rods/wooden" + } + }, + "pattern": [ + "###", + "###", + " - " + ], + "result": { + "count": 3, + "item": "twilightforest:dark_sign" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/darkwood_slab.json b/src/generated/resources/data/twilightforest/recipes/wood/darkwood_slab.json new file mode 100644 index 0000000000..63a2f99e11 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/darkwood_slab.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "#": { + "item": "twilightforest:dark_planks" + } + }, + "pattern": [ + "###" + ], + "result": { + "count": 6, + "item": "twilightforest:dark_slab" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/darkwood_stairs.json b/src/generated/resources/data/twilightforest/recipes/wood/darkwood_stairs.json new file mode 100644 index 0000000000..ee52e9c6cf --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/darkwood_stairs.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "#": { + "item": "twilightforest:dark_planks" + } + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "result": { + "count": 8, + "item": "twilightforest:dark_stairs" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/darkwood_stripped_wood.json b/src/generated/resources/data/twilightforest/recipes/wood/darkwood_stripped_wood.json new file mode 100644 index 0000000000..7f6092c8ad --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/darkwood_stripped_wood.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "#": { + "item": "twilightforest:stripped_dark_log" + } + }, + "pattern": [ + "##", + "##" + ], + "result": { + "count": 3, + "item": "twilightforest:stripped_dark_wood" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/darkwood_trapdoor.json b/src/generated/resources/data/twilightforest/recipes/wood/darkwood_trapdoor.json new file mode 100644 index 0000000000..b92b434010 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/darkwood_trapdoor.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "redstone", + "key": { + "#": { + "item": "twilightforest:dark_planks" + } + }, + "pattern": [ + "###", + "###" + ], + "result": { + "count": 2, + "item": "twilightforest:dark_trapdoor" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/darkwood_wood.json b/src/generated/resources/data/twilightforest/recipes/wood/darkwood_wood.json new file mode 100644 index 0000000000..9c70440527 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/darkwood_wood.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "#": { + "item": "twilightforest:dark_log" + } + }, + "pattern": [ + "##", + "##" + ], + "result": { + "count": 3, + "item": "twilightforest:dark_wood" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/jungle_banister.json b/src/generated/resources/data/twilightforest/recipes/wood/jungle_banister.json new file mode 100644 index 0000000000..48536bf03c --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/jungle_banister.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "-": { + "item": "minecraft:jungle_slab" + }, + "|": { + "tag": "forge:rods/wooden" + } + }, + "pattern": [ + "---", + "| |" + ], + "result": { + "count": 3, + "item": "twilightforest:jungle_banister" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/mangrove_banister.json b/src/generated/resources/data/twilightforest/recipes/wood/mangrove_banister.json new file mode 100644 index 0000000000..0d57e0a7fe --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/mangrove_banister.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "-": { + "item": "twilightforest:mangrove_slab" + }, + "|": { + "tag": "forge:rods/wooden" + } + }, + "pattern": [ + "---", + "| |" + ], + "result": { + "count": 3, + "item": "twilightforest:mangrove_banister" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/mangrove_button.json b/src/generated/resources/data/twilightforest/recipes/wood/mangrove_button.json new file mode 100644 index 0000000000..ebc44e2581 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/mangrove_button.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "redstone", + "ingredients": [ + { + "item": "twilightforest:mangrove_planks" + } + ], + "result": { + "item": "twilightforest:mangrove_button" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/mangrove_chest.json b/src/generated/resources/data/twilightforest/recipes/wood/mangrove_chest.json new file mode 100644 index 0000000000..a0f9f5afda --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/mangrove_chest.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "#": { + "item": "twilightforest:mangrove_planks" + }, + "C": { + "tag": "forge:chests/wooden" + } + }, + "pattern": [ + "###", + "#C#", + "###" + ], + "result": { + "count": 2, + "item": "twilightforest:mangrove_chest" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/mangrove_door.json b/src/generated/resources/data/twilightforest/recipes/wood/mangrove_door.json new file mode 100644 index 0000000000..14d67d0c8e --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/mangrove_door.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "redstone", + "key": { + "#": { + "item": "twilightforest:mangrove_planks" + } + }, + "pattern": [ + "##", + "##", + "##" + ], + "result": { + "count": 3, + "item": "twilightforest:mangrove_door" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/mangrove_fence.json b/src/generated/resources/data/twilightforest/recipes/wood/mangrove_fence.json new file mode 100644 index 0000000000..6eef07e21c --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/mangrove_fence.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "#": { + "item": "twilightforest:mangrove_planks" + }, + "S": { + "tag": "forge:rods/wooden" + } + }, + "pattern": [ + "#S#", + "#S#" + ], + "result": { + "count": 3, + "item": "twilightforest:mangrove_fence" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/mangrove_from_stripped_planks.json b/src/generated/resources/data/twilightforest/recipes/wood/mangrove_from_stripped_planks.json new file mode 100644 index 0000000000..b1529c8db3 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/mangrove_from_stripped_planks.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "item": "twilightforest:stripped_mangrove_log" + } + ], + "result": { + "count": 4, + "item": "twilightforest:mangrove_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/mangrove_from_stripped_wood_planks.json b/src/generated/resources/data/twilightforest/recipes/wood/mangrove_from_stripped_wood_planks.json new file mode 100644 index 0000000000..5e7669f29a --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/mangrove_from_stripped_wood_planks.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "item": "twilightforest:stripped_mangrove_wood" + } + ], + "result": { + "count": 4, + "item": "twilightforest:mangrove_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/mangrove_from_wood_planks.json b/src/generated/resources/data/twilightforest/recipes/wood/mangrove_from_wood_planks.json new file mode 100644 index 0000000000..15415b148d --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/mangrove_from_wood_planks.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "item": "twilightforest:mangrove_wood" + } + ], + "result": { + "count": 4, + "item": "twilightforest:mangrove_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/mangrove_gate.json b/src/generated/resources/data/twilightforest/recipes/wood/mangrove_gate.json new file mode 100644 index 0000000000..5701334ba7 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/mangrove_gate.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "redstone", + "key": { + "#": { + "item": "twilightforest:mangrove_planks" + }, + "S": { + "tag": "forge:rods/wooden" + } + }, + "pattern": [ + "S#S", + "S#S" + ], + "result": { + "item": "twilightforest:mangrove_fence_gate" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/mangrove_planks.json b/src/generated/resources/data/twilightforest/recipes/wood/mangrove_planks.json new file mode 100644 index 0000000000..6691394379 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/mangrove_planks.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "item": "twilightforest:mangrove_log" + } + ], + "result": { + "count": 4, + "item": "twilightforest:mangrove_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/mangrove_plate.json b/src/generated/resources/data/twilightforest/recipes/wood/mangrove_plate.json new file mode 100644 index 0000000000..acabf5c031 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/mangrove_plate.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "redstone", + "key": { + "#": { + "item": "twilightforest:mangrove_planks" + } + }, + "pattern": [ + "##" + ], + "result": { + "item": "twilightforest:mangrove_pressure_plate" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/mangrove_sign_wood.json b/src/generated/resources/data/twilightforest/recipes/wood/mangrove_sign_wood.json new file mode 100644 index 0000000000..8bc601fd64 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/mangrove_sign_wood.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "#": { + "item": "twilightforest:mangrove_planks" + }, + "-": { + "tag": "forge:rods/wooden" + } + }, + "pattern": [ + "###", + "###", + " - " + ], + "result": { + "count": 3, + "item": "twilightforest:mangrove_sign" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/mangrove_slab.json b/src/generated/resources/data/twilightforest/recipes/wood/mangrove_slab.json new file mode 100644 index 0000000000..9f67929c1f --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/mangrove_slab.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "#": { + "item": "twilightforest:mangrove_planks" + } + }, + "pattern": [ + "###" + ], + "result": { + "count": 6, + "item": "twilightforest:mangrove_slab" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/mangrove_stairs.json b/src/generated/resources/data/twilightforest/recipes/wood/mangrove_stairs.json new file mode 100644 index 0000000000..34db599f5c --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/mangrove_stairs.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "#": { + "item": "twilightforest:mangrove_planks" + } + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "result": { + "count": 8, + "item": "twilightforest:mangrove_stairs" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/mangrove_stripped_wood.json b/src/generated/resources/data/twilightforest/recipes/wood/mangrove_stripped_wood.json new file mode 100644 index 0000000000..aa49407231 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/mangrove_stripped_wood.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "#": { + "item": "twilightforest:stripped_mangrove_log" + } + }, + "pattern": [ + "##", + "##" + ], + "result": { + "count": 3, + "item": "twilightforest:stripped_mangrove_wood" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/mangrove_trapdoor.json b/src/generated/resources/data/twilightforest/recipes/wood/mangrove_trapdoor.json new file mode 100644 index 0000000000..abcb371658 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/mangrove_trapdoor.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "redstone", + "key": { + "#": { + "item": "twilightforest:mangrove_planks" + } + }, + "pattern": [ + "###", + "###" + ], + "result": { + "count": 2, + "item": "twilightforest:mangrove_trapdoor" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/mangrove_wood.json b/src/generated/resources/data/twilightforest/recipes/wood/mangrove_wood.json new file mode 100644 index 0000000000..abf77eb7e9 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/mangrove_wood.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "#": { + "item": "twilightforest:mangrove_log" + } + }, + "pattern": [ + "##", + "##" + ], + "result": { + "count": 3, + "item": "twilightforest:mangrove_wood" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/mining_banister.json b/src/generated/resources/data/twilightforest/recipes/wood/mining_banister.json new file mode 100644 index 0000000000..bd994388cc --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/mining_banister.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "-": { + "item": "twilightforest:mining_slab" + }, + "|": { + "tag": "forge:rods/wooden" + } + }, + "pattern": [ + "---", + "| |" + ], + "result": { + "count": 3, + "item": "twilightforest:mining_banister" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/mining_button.json b/src/generated/resources/data/twilightforest/recipes/wood/mining_button.json new file mode 100644 index 0000000000..a08ab98274 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/mining_button.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "redstone", + "ingredients": [ + { + "item": "twilightforest:mining_planks" + } + ], + "result": { + "item": "twilightforest:mining_button" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/mining_chest.json b/src/generated/resources/data/twilightforest/recipes/wood/mining_chest.json new file mode 100644 index 0000000000..a0fb4e32d9 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/mining_chest.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "#": { + "item": "twilightforest:mining_planks" + }, + "C": { + "tag": "forge:chests/wooden" + } + }, + "pattern": [ + "###", + "#C#", + "###" + ], + "result": { + "count": 2, + "item": "twilightforest:mining_chest" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/mining_door.json b/src/generated/resources/data/twilightforest/recipes/wood/mining_door.json new file mode 100644 index 0000000000..7d7204ad59 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/mining_door.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "redstone", + "key": { + "#": { + "item": "twilightforest:mining_planks" + } + }, + "pattern": [ + "##", + "##", + "##" + ], + "result": { + "count": 3, + "item": "twilightforest:mining_door" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/mining_fence.json b/src/generated/resources/data/twilightforest/recipes/wood/mining_fence.json new file mode 100644 index 0000000000..c2686b82ca --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/mining_fence.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "#": { + "item": "twilightforest:mining_planks" + }, + "S": { + "tag": "forge:rods/wooden" + } + }, + "pattern": [ + "#S#", + "#S#" + ], + "result": { + "count": 3, + "item": "twilightforest:mining_fence" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/mining_from_stripped_planks.json b/src/generated/resources/data/twilightforest/recipes/wood/mining_from_stripped_planks.json new file mode 100644 index 0000000000..962fc713c4 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/mining_from_stripped_planks.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "item": "twilightforest:stripped_mining_log" + } + ], + "result": { + "count": 4, + "item": "twilightforest:mining_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/mining_from_stripped_wood_planks.json b/src/generated/resources/data/twilightforest/recipes/wood/mining_from_stripped_wood_planks.json new file mode 100644 index 0000000000..7151199dd3 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/mining_from_stripped_wood_planks.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "item": "twilightforest:stripped_mining_wood" + } + ], + "result": { + "count": 4, + "item": "twilightforest:mining_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/mining_from_wood_planks.json b/src/generated/resources/data/twilightforest/recipes/wood/mining_from_wood_planks.json new file mode 100644 index 0000000000..7cda552b4a --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/mining_from_wood_planks.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "item": "twilightforest:mining_wood" + } + ], + "result": { + "count": 4, + "item": "twilightforest:mining_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/mining_gate.json b/src/generated/resources/data/twilightforest/recipes/wood/mining_gate.json new file mode 100644 index 0000000000..b82e60fd2d --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/mining_gate.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "redstone", + "key": { + "#": { + "item": "twilightforest:mining_planks" + }, + "S": { + "tag": "forge:rods/wooden" + } + }, + "pattern": [ + "S#S", + "S#S" + ], + "result": { + "item": "twilightforest:mining_fence_gate" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/mining_planks.json b/src/generated/resources/data/twilightforest/recipes/wood/mining_planks.json new file mode 100644 index 0000000000..3bbd2111a8 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/mining_planks.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "item": "twilightforest:mining_log" + } + ], + "result": { + "count": 4, + "item": "twilightforest:mining_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/mining_plate.json b/src/generated/resources/data/twilightforest/recipes/wood/mining_plate.json new file mode 100644 index 0000000000..70e6892b9e --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/mining_plate.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "redstone", + "key": { + "#": { + "item": "twilightforest:mining_planks" + } + }, + "pattern": [ + "##" + ], + "result": { + "item": "twilightforest:mining_pressure_plate" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/mining_sign_wood.json b/src/generated/resources/data/twilightforest/recipes/wood/mining_sign_wood.json new file mode 100644 index 0000000000..8d6ea29b44 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/mining_sign_wood.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "#": { + "item": "twilightforest:mining_planks" + }, + "-": { + "tag": "forge:rods/wooden" + } + }, + "pattern": [ + "###", + "###", + " - " + ], + "result": { + "count": 3, + "item": "twilightforest:mining_sign" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/mining_slab.json b/src/generated/resources/data/twilightforest/recipes/wood/mining_slab.json new file mode 100644 index 0000000000..061ef54e44 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/mining_slab.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "#": { + "item": "twilightforest:mining_planks" + } + }, + "pattern": [ + "###" + ], + "result": { + "count": 6, + "item": "twilightforest:mining_slab" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/mining_stairs.json b/src/generated/resources/data/twilightforest/recipes/wood/mining_stairs.json new file mode 100644 index 0000000000..01112efca0 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/mining_stairs.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "#": { + "item": "twilightforest:mining_planks" + } + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "result": { + "count": 8, + "item": "twilightforest:mining_stairs" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/mining_stripped_wood.json b/src/generated/resources/data/twilightforest/recipes/wood/mining_stripped_wood.json new file mode 100644 index 0000000000..21dbdb6423 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/mining_stripped_wood.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "#": { + "item": "twilightforest:stripped_mining_log" + } + }, + "pattern": [ + "##", + "##" + ], + "result": { + "count": 3, + "item": "twilightforest:stripped_mining_wood" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/mining_trapdoor.json b/src/generated/resources/data/twilightforest/recipes/wood/mining_trapdoor.json new file mode 100644 index 0000000000..4c76fa58c1 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/mining_trapdoor.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "redstone", + "key": { + "#": { + "item": "twilightforest:mining_planks" + } + }, + "pattern": [ + "###", + "###" + ], + "result": { + "count": 2, + "item": "twilightforest:mining_trapdoor" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/mining_wood.json b/src/generated/resources/data/twilightforest/recipes/wood/mining_wood.json new file mode 100644 index 0000000000..c143c66f32 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/mining_wood.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "#": { + "item": "twilightforest:mining_log" + } + }, + "pattern": [ + "##", + "##" + ], + "result": { + "count": 3, + "item": "twilightforest:mining_wood" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/mossy_towerwood.json b/src/generated/resources/data/twilightforest/recipes/wood/mossy_towerwood.json new file mode 100644 index 0000000000..a0b0c758de --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/mossy_towerwood.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "item": "twilightforest:towerwood" + }, + [ + { + "item": "minecraft:vine" + }, + { + "item": "minecraft:moss_block" + } + ] + ], + "result": { + "item": "twilightforest:mossy_towerwood" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/oak_banister.json b/src/generated/resources/data/twilightforest/recipes/wood/oak_banister.json new file mode 100644 index 0000000000..93287cb61c --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/oak_banister.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "-": { + "item": "minecraft:oak_slab" + }, + "|": { + "tag": "forge:rods/wooden" + } + }, + "pattern": [ + "---", + "| |" + ], + "result": { + "count": 3, + "item": "twilightforest:oak_banister" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/smoked_cracked_towerwood.json b/src/generated/resources/data/twilightforest/recipes/wood/smoked_cracked_towerwood.json new file mode 100644 index 0000000000..7ee48a1316 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/smoked_cracked_towerwood.json @@ -0,0 +1,10 @@ +{ + "type": "minecraft:smoking", + "category": "food", + "cookingtime": 100, + "experience": 0.3, + "ingredient": { + "item": "twilightforest:towerwood" + }, + "result": "twilightforest:cracked_towerwood" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/sorting_banister.json b/src/generated/resources/data/twilightforest/recipes/wood/sorting_banister.json new file mode 100644 index 0000000000..61eb978828 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/sorting_banister.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "-": { + "item": "twilightforest:sorting_slab" + }, + "|": { + "tag": "forge:rods/wooden" + } + }, + "pattern": [ + "---", + "| |" + ], + "result": { + "count": 3, + "item": "twilightforest:sorting_banister" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/sorting_button.json b/src/generated/resources/data/twilightforest/recipes/wood/sorting_button.json new file mode 100644 index 0000000000..adad5d7252 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/sorting_button.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "redstone", + "ingredients": [ + { + "item": "twilightforest:sorting_planks" + } + ], + "result": { + "item": "twilightforest:sorting_button" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/sorting_chest.json b/src/generated/resources/data/twilightforest/recipes/wood/sorting_chest.json new file mode 100644 index 0000000000..149996263c --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/sorting_chest.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "#": { + "item": "twilightforest:sorting_planks" + }, + "C": { + "tag": "forge:chests/wooden" + } + }, + "pattern": [ + "###", + "#C#", + "###" + ], + "result": { + "count": 2, + "item": "twilightforest:sorting_chest" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/sorting_door.json b/src/generated/resources/data/twilightforest/recipes/wood/sorting_door.json new file mode 100644 index 0000000000..2cd8c2abb6 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/sorting_door.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "redstone", + "key": { + "#": { + "item": "twilightforest:sorting_planks" + } + }, + "pattern": [ + "##", + "##", + "##" + ], + "result": { + "count": 3, + "item": "twilightforest:sorting_door" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/sorting_fence.json b/src/generated/resources/data/twilightforest/recipes/wood/sorting_fence.json new file mode 100644 index 0000000000..7ae6df5b45 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/sorting_fence.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "#": { + "item": "twilightforest:sorting_planks" + }, + "S": { + "tag": "forge:rods/wooden" + } + }, + "pattern": [ + "#S#", + "#S#" + ], + "result": { + "count": 3, + "item": "twilightforest:sorting_fence" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/sorting_from_stripped_planks.json b/src/generated/resources/data/twilightforest/recipes/wood/sorting_from_stripped_planks.json new file mode 100644 index 0000000000..2710a7f7aa --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/sorting_from_stripped_planks.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "item": "twilightforest:stripped_sorting_log" + } + ], + "result": { + "count": 4, + "item": "twilightforest:sorting_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/sorting_from_stripped_wood_planks.json b/src/generated/resources/data/twilightforest/recipes/wood/sorting_from_stripped_wood_planks.json new file mode 100644 index 0000000000..1e9991b413 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/sorting_from_stripped_wood_planks.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "item": "twilightforest:stripped_sorting_wood" + } + ], + "result": { + "count": 4, + "item": "twilightforest:sorting_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/sorting_from_wood_planks.json b/src/generated/resources/data/twilightforest/recipes/wood/sorting_from_wood_planks.json new file mode 100644 index 0000000000..440d75f06b --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/sorting_from_wood_planks.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "item": "twilightforest:sorting_wood" + } + ], + "result": { + "count": 4, + "item": "twilightforest:sorting_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/sorting_gate.json b/src/generated/resources/data/twilightforest/recipes/wood/sorting_gate.json new file mode 100644 index 0000000000..f5b8a74f5f --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/sorting_gate.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "redstone", + "key": { + "#": { + "item": "twilightforest:sorting_planks" + }, + "S": { + "tag": "forge:rods/wooden" + } + }, + "pattern": [ + "S#S", + "S#S" + ], + "result": { + "item": "twilightforest:sorting_fence_gate" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/sorting_planks.json b/src/generated/resources/data/twilightforest/recipes/wood/sorting_planks.json new file mode 100644 index 0000000000..c691b2069f --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/sorting_planks.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "item": "twilightforest:sorting_log" + } + ], + "result": { + "count": 4, + "item": "twilightforest:sorting_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/sorting_plate.json b/src/generated/resources/data/twilightforest/recipes/wood/sorting_plate.json new file mode 100644 index 0000000000..21f46759ed --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/sorting_plate.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "redstone", + "key": { + "#": { + "item": "twilightforest:sorting_planks" + } + }, + "pattern": [ + "##" + ], + "result": { + "item": "twilightforest:sorting_pressure_plate" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/sorting_sign_wood.json b/src/generated/resources/data/twilightforest/recipes/wood/sorting_sign_wood.json new file mode 100644 index 0000000000..9302b25b5f --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/sorting_sign_wood.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "#": { + "item": "twilightforest:sorting_planks" + }, + "-": { + "tag": "forge:rods/wooden" + } + }, + "pattern": [ + "###", + "###", + " - " + ], + "result": { + "count": 3, + "item": "twilightforest:sorting_sign" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/sorting_slab.json b/src/generated/resources/data/twilightforest/recipes/wood/sorting_slab.json new file mode 100644 index 0000000000..aa108a0c09 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/sorting_slab.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "#": { + "item": "twilightforest:sorting_planks" + } + }, + "pattern": [ + "###" + ], + "result": { + "count": 6, + "item": "twilightforest:sorting_slab" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/sorting_stairs.json b/src/generated/resources/data/twilightforest/recipes/wood/sorting_stairs.json new file mode 100644 index 0000000000..c75b91aef0 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/sorting_stairs.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "#": { + "item": "twilightforest:sorting_planks" + } + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "result": { + "count": 8, + "item": "twilightforest:sorting_stairs" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/sorting_stripped_wood.json b/src/generated/resources/data/twilightforest/recipes/wood/sorting_stripped_wood.json new file mode 100644 index 0000000000..e201181824 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/sorting_stripped_wood.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "#": { + "item": "twilightforest:stripped_sorting_log" + } + }, + "pattern": [ + "##", + "##" + ], + "result": { + "count": 3, + "item": "twilightforest:stripped_sorting_wood" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/sorting_trapdoor.json b/src/generated/resources/data/twilightforest/recipes/wood/sorting_trapdoor.json new file mode 100644 index 0000000000..a6e1dd8817 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/sorting_trapdoor.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "redstone", + "key": { + "#": { + "item": "twilightforest:sorting_planks" + } + }, + "pattern": [ + "###", + "###" + ], + "result": { + "count": 2, + "item": "twilightforest:sorting_trapdoor" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/sorting_wood.json b/src/generated/resources/data/twilightforest/recipes/wood/sorting_wood.json new file mode 100644 index 0000000000..8da0c336aa --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/sorting_wood.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "#": { + "item": "twilightforest:sorting_log" + } + }, + "pattern": [ + "##", + "##" + ], + "result": { + "count": 3, + "item": "twilightforest:sorting_wood" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/spruce_banister.json b/src/generated/resources/data/twilightforest/recipes/wood/spruce_banister.json new file mode 100644 index 0000000000..28a3ea085a --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/spruce_banister.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "-": { + "item": "minecraft:spruce_slab" + }, + "|": { + "tag": "forge:rods/wooden" + } + }, + "pattern": [ + "---", + "| |" + ], + "result": { + "count": 3, + "item": "twilightforest:spruce_banister" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/time_banister.json b/src/generated/resources/data/twilightforest/recipes/wood/time_banister.json new file mode 100644 index 0000000000..7725a43ee2 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/time_banister.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "-": { + "item": "twilightforest:time_slab" + }, + "|": { + "tag": "forge:rods/wooden" + } + }, + "pattern": [ + "---", + "| |" + ], + "result": { + "count": 3, + "item": "twilightforest:time_banister" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/time_button.json b/src/generated/resources/data/twilightforest/recipes/wood/time_button.json new file mode 100644 index 0000000000..e298588b47 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/time_button.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "redstone", + "ingredients": [ + { + "item": "twilightforest:time_planks" + } + ], + "result": { + "item": "twilightforest:time_button" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/time_chest.json b/src/generated/resources/data/twilightforest/recipes/wood/time_chest.json new file mode 100644 index 0000000000..6274151541 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/time_chest.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "#": { + "item": "twilightforest:time_planks" + }, + "C": { + "tag": "forge:chests/wooden" + } + }, + "pattern": [ + "###", + "#C#", + "###" + ], + "result": { + "count": 2, + "item": "twilightforest:time_chest" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/time_door.json b/src/generated/resources/data/twilightforest/recipes/wood/time_door.json new file mode 100644 index 0000000000..6c7ef90e5e --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/time_door.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "redstone", + "key": { + "#": { + "item": "twilightforest:time_planks" + } + }, + "pattern": [ + "##", + "##", + "##" + ], + "result": { + "count": 3, + "item": "twilightforest:time_door" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/time_fence.json b/src/generated/resources/data/twilightforest/recipes/wood/time_fence.json new file mode 100644 index 0000000000..a549a6d625 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/time_fence.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "#": { + "item": "twilightforest:time_planks" + }, + "S": { + "tag": "forge:rods/wooden" + } + }, + "pattern": [ + "#S#", + "#S#" + ], + "result": { + "count": 3, + "item": "twilightforest:time_fence" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/time_from_stripped_planks.json b/src/generated/resources/data/twilightforest/recipes/wood/time_from_stripped_planks.json new file mode 100644 index 0000000000..c872b23d89 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/time_from_stripped_planks.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "item": "twilightforest:stripped_time_log" + } + ], + "result": { + "count": 4, + "item": "twilightforest:time_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/time_from_stripped_wood_planks.json b/src/generated/resources/data/twilightforest/recipes/wood/time_from_stripped_wood_planks.json new file mode 100644 index 0000000000..10fd30b6cb --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/time_from_stripped_wood_planks.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "item": "twilightforest:stripped_time_wood" + } + ], + "result": { + "count": 4, + "item": "twilightforest:time_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/time_from_wood_planks.json b/src/generated/resources/data/twilightforest/recipes/wood/time_from_wood_planks.json new file mode 100644 index 0000000000..3d4810869d --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/time_from_wood_planks.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "item": "twilightforest:time_wood" + } + ], + "result": { + "count": 4, + "item": "twilightforest:time_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/time_gate.json b/src/generated/resources/data/twilightforest/recipes/wood/time_gate.json new file mode 100644 index 0000000000..cf4ec99a2f --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/time_gate.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "redstone", + "key": { + "#": { + "item": "twilightforest:time_planks" + }, + "S": { + "tag": "forge:rods/wooden" + } + }, + "pattern": [ + "S#S", + "S#S" + ], + "result": { + "item": "twilightforest:time_fence_gate" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/time_planks.json b/src/generated/resources/data/twilightforest/recipes/wood/time_planks.json new file mode 100644 index 0000000000..d5015a09b9 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/time_planks.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "item": "twilightforest:time_log" + } + ], + "result": { + "count": 4, + "item": "twilightforest:time_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/time_plate.json b/src/generated/resources/data/twilightforest/recipes/wood/time_plate.json new file mode 100644 index 0000000000..a7018ac4d2 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/time_plate.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "redstone", + "key": { + "#": { + "item": "twilightforest:time_planks" + } + }, + "pattern": [ + "##" + ], + "result": { + "item": "twilightforest:time_pressure_plate" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/time_sign_wood.json b/src/generated/resources/data/twilightforest/recipes/wood/time_sign_wood.json new file mode 100644 index 0000000000..8f6a65f9c3 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/time_sign_wood.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "#": { + "item": "twilightforest:time_planks" + }, + "-": { + "tag": "forge:rods/wooden" + } + }, + "pattern": [ + "###", + "###", + " - " + ], + "result": { + "count": 3, + "item": "twilightforest:time_sign" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/time_slab.json b/src/generated/resources/data/twilightforest/recipes/wood/time_slab.json new file mode 100644 index 0000000000..4efd235da0 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/time_slab.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "#": { + "item": "twilightforest:time_planks" + } + }, + "pattern": [ + "###" + ], + "result": { + "count": 6, + "item": "twilightforest:time_slab" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/time_stairs.json b/src/generated/resources/data/twilightforest/recipes/wood/time_stairs.json new file mode 100644 index 0000000000..e9da601883 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/time_stairs.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "#": { + "item": "twilightforest:time_planks" + } + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "result": { + "count": 8, + "item": "twilightforest:time_stairs" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/time_stripped_wood.json b/src/generated/resources/data/twilightforest/recipes/wood/time_stripped_wood.json new file mode 100644 index 0000000000..070af55ce0 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/time_stripped_wood.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "#": { + "item": "twilightforest:stripped_time_log" + } + }, + "pattern": [ + "##", + "##" + ], + "result": { + "count": 3, + "item": "twilightforest:stripped_time_wood" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/time_trapdoor.json b/src/generated/resources/data/twilightforest/recipes/wood/time_trapdoor.json new file mode 100644 index 0000000000..1831b1f713 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/time_trapdoor.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "redstone", + "key": { + "#": { + "item": "twilightforest:time_planks" + } + }, + "pattern": [ + "###", + "###" + ], + "result": { + "count": 2, + "item": "twilightforest:time_trapdoor" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/time_wood.json b/src/generated/resources/data/twilightforest/recipes/wood/time_wood.json new file mode 100644 index 0000000000..ef2890283c --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/time_wood.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "#": { + "item": "twilightforest:time_log" + } + }, + "pattern": [ + "##", + "##" + ], + "result": { + "count": 3, + "item": "twilightforest:time_wood" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/transformation_banister.json b/src/generated/resources/data/twilightforest/recipes/wood/transformation_banister.json new file mode 100644 index 0000000000..fcc48ce293 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/transformation_banister.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "-": { + "item": "twilightforest:transformation_slab" + }, + "|": { + "tag": "forge:rods/wooden" + } + }, + "pattern": [ + "---", + "| |" + ], + "result": { + "count": 3, + "item": "twilightforest:transformation_banister" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/transformation_button.json b/src/generated/resources/data/twilightforest/recipes/wood/transformation_button.json new file mode 100644 index 0000000000..5a797b5f85 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/transformation_button.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "redstone", + "ingredients": [ + { + "item": "twilightforest:transformation_planks" + } + ], + "result": { + "item": "twilightforest:transformation_button" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/transformation_chest.json b/src/generated/resources/data/twilightforest/recipes/wood/transformation_chest.json new file mode 100644 index 0000000000..332dc4ff1e --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/transformation_chest.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "#": { + "item": "twilightforest:transformation_planks" + }, + "C": { + "tag": "forge:chests/wooden" + } + }, + "pattern": [ + "###", + "#C#", + "###" + ], + "result": { + "count": 2, + "item": "twilightforest:transformation_chest" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/transformation_door.json b/src/generated/resources/data/twilightforest/recipes/wood/transformation_door.json new file mode 100644 index 0000000000..d64280c50f --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/transformation_door.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "redstone", + "key": { + "#": { + "item": "twilightforest:transformation_planks" + } + }, + "pattern": [ + "##", + "##", + "##" + ], + "result": { + "count": 3, + "item": "twilightforest:transformation_door" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/transformation_fence.json b/src/generated/resources/data/twilightforest/recipes/wood/transformation_fence.json new file mode 100644 index 0000000000..b2a4c53475 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/transformation_fence.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "#": { + "item": "twilightforest:transformation_planks" + }, + "S": { + "tag": "forge:rods/wooden" + } + }, + "pattern": [ + "#S#", + "#S#" + ], + "result": { + "count": 3, + "item": "twilightforest:transformation_fence" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/transformation_from_stripped_planks.json b/src/generated/resources/data/twilightforest/recipes/wood/transformation_from_stripped_planks.json new file mode 100644 index 0000000000..cd6ac73ae5 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/transformation_from_stripped_planks.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "item": "twilightforest:stripped_transformation_log" + } + ], + "result": { + "count": 4, + "item": "twilightforest:transformation_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/transformation_from_stripped_wood_planks.json b/src/generated/resources/data/twilightforest/recipes/wood/transformation_from_stripped_wood_planks.json new file mode 100644 index 0000000000..3779cecf5f --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/transformation_from_stripped_wood_planks.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "item": "twilightforest:stripped_transformation_wood" + } + ], + "result": { + "count": 4, + "item": "twilightforest:transformation_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/transformation_from_wood_planks.json b/src/generated/resources/data/twilightforest/recipes/wood/transformation_from_wood_planks.json new file mode 100644 index 0000000000..bb5d5c1983 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/transformation_from_wood_planks.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "item": "twilightforest:transformation_wood" + } + ], + "result": { + "count": 4, + "item": "twilightforest:transformation_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/transformation_gate.json b/src/generated/resources/data/twilightforest/recipes/wood/transformation_gate.json new file mode 100644 index 0000000000..b247b64190 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/transformation_gate.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "redstone", + "key": { + "#": { + "item": "twilightforest:transformation_planks" + }, + "S": { + "tag": "forge:rods/wooden" + } + }, + "pattern": [ + "S#S", + "S#S" + ], + "result": { + "item": "twilightforest:transformation_fence_gate" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/transformation_planks.json b/src/generated/resources/data/twilightforest/recipes/wood/transformation_planks.json new file mode 100644 index 0000000000..156fa17c1c --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/transformation_planks.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "item": "twilightforest:transformation_log" + } + ], + "result": { + "count": 4, + "item": "twilightforest:transformation_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/transformation_plate.json b/src/generated/resources/data/twilightforest/recipes/wood/transformation_plate.json new file mode 100644 index 0000000000..0ea5a4db5f --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/transformation_plate.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "redstone", + "key": { + "#": { + "item": "twilightforest:transformation_planks" + } + }, + "pattern": [ + "##" + ], + "result": { + "item": "twilightforest:transformation_pressure_plate" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/transformation_sign_wood.json b/src/generated/resources/data/twilightforest/recipes/wood/transformation_sign_wood.json new file mode 100644 index 0000000000..bf8645714f --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/transformation_sign_wood.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "#": { + "item": "twilightforest:transformation_planks" + }, + "-": { + "tag": "forge:rods/wooden" + } + }, + "pattern": [ + "###", + "###", + " - " + ], + "result": { + "count": 3, + "item": "twilightforest:transformation_sign" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/transformation_slab.json b/src/generated/resources/data/twilightforest/recipes/wood/transformation_slab.json new file mode 100644 index 0000000000..d27932bec9 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/transformation_slab.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "#": { + "item": "twilightforest:transformation_planks" + } + }, + "pattern": [ + "###" + ], + "result": { + "count": 6, + "item": "twilightforest:transformation_slab" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/transformation_stairs.json b/src/generated/resources/data/twilightforest/recipes/wood/transformation_stairs.json new file mode 100644 index 0000000000..aab774d107 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/transformation_stairs.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "#": { + "item": "twilightforest:transformation_planks" + } + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "result": { + "count": 8, + "item": "twilightforest:transformation_stairs" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/transformation_stripped_wood.json b/src/generated/resources/data/twilightforest/recipes/wood/transformation_stripped_wood.json new file mode 100644 index 0000000000..7ff45386bc --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/transformation_stripped_wood.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "#": { + "item": "twilightforest:stripped_transformation_log" + } + }, + "pattern": [ + "##", + "##" + ], + "result": { + "count": 3, + "item": "twilightforest:stripped_transformation_wood" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/transformation_trapdoor.json b/src/generated/resources/data/twilightforest/recipes/wood/transformation_trapdoor.json new file mode 100644 index 0000000000..b6aa14ad13 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/transformation_trapdoor.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "redstone", + "key": { + "#": { + "item": "twilightforest:transformation_planks" + } + }, + "pattern": [ + "###", + "###" + ], + "result": { + "count": 2, + "item": "twilightforest:transformation_trapdoor" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/transformation_wood.json b/src/generated/resources/data/twilightforest/recipes/wood/transformation_wood.json new file mode 100644 index 0000000000..496b2d44fa --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/transformation_wood.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "#": { + "item": "twilightforest:transformation_log" + } + }, + "pattern": [ + "##", + "##" + ], + "result": { + "count": 3, + "item": "twilightforest:transformation_wood" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/twilight_oak_banister.json b/src/generated/resources/data/twilightforest/recipes/wood/twilight_oak_banister.json new file mode 100644 index 0000000000..70e1e6e431 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/twilight_oak_banister.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "-": { + "item": "twilightforest:twilight_oak_slab" + }, + "|": { + "tag": "forge:rods/wooden" + } + }, + "pattern": [ + "---", + "| |" + ], + "result": { + "count": 3, + "item": "twilightforest:twilight_oak_banister" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/twilight_oak_button.json b/src/generated/resources/data/twilightforest/recipes/wood/twilight_oak_button.json new file mode 100644 index 0000000000..065ec41125 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/twilight_oak_button.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "redstone", + "ingredients": [ + { + "item": "twilightforest:twilight_oak_planks" + } + ], + "result": { + "item": "twilightforest:twilight_oak_button" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/twilight_oak_chest.json b/src/generated/resources/data/twilightforest/recipes/wood/twilight_oak_chest.json new file mode 100644 index 0000000000..38bc584909 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/twilight_oak_chest.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "#": { + "item": "twilightforest:twilight_oak_planks" + }, + "C": { + "tag": "forge:chests/wooden" + } + }, + "pattern": [ + "###", + "#C#", + "###" + ], + "result": { + "count": 2, + "item": "twilightforest:twilight_oak_chest" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/twilight_oak_door.json b/src/generated/resources/data/twilightforest/recipes/wood/twilight_oak_door.json new file mode 100644 index 0000000000..4fbfc3f2b1 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/twilight_oak_door.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "redstone", + "key": { + "#": { + "item": "twilightforest:twilight_oak_planks" + } + }, + "pattern": [ + "##", + "##", + "##" + ], + "result": { + "count": 3, + "item": "twilightforest:twilight_oak_door" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/twilight_oak_fence.json b/src/generated/resources/data/twilightforest/recipes/wood/twilight_oak_fence.json new file mode 100644 index 0000000000..331e077db0 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/twilight_oak_fence.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "#": { + "item": "twilightforest:twilight_oak_planks" + }, + "S": { + "tag": "forge:rods/wooden" + } + }, + "pattern": [ + "#S#", + "#S#" + ], + "result": { + "count": 3, + "item": "twilightforest:twilight_oak_fence" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/twilight_oak_from_stripped_planks.json b/src/generated/resources/data/twilightforest/recipes/wood/twilight_oak_from_stripped_planks.json new file mode 100644 index 0000000000..a0195f07b7 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/twilight_oak_from_stripped_planks.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "item": "twilightforest:stripped_twilight_oak_log" + } + ], + "result": { + "count": 4, + "item": "twilightforest:twilight_oak_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/twilight_oak_from_stripped_wood_planks.json b/src/generated/resources/data/twilightforest/recipes/wood/twilight_oak_from_stripped_wood_planks.json new file mode 100644 index 0000000000..a603f7f0de --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/twilight_oak_from_stripped_wood_planks.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "item": "twilightforest:stripped_twilight_oak_wood" + } + ], + "result": { + "count": 4, + "item": "twilightforest:twilight_oak_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/twilight_oak_from_wood_planks.json b/src/generated/resources/data/twilightforest/recipes/wood/twilight_oak_from_wood_planks.json new file mode 100644 index 0000000000..c425a574b9 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/twilight_oak_from_wood_planks.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "item": "twilightforest:twilight_oak_wood" + } + ], + "result": { + "count": 4, + "item": "twilightforest:twilight_oak_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/twilight_oak_gate.json b/src/generated/resources/data/twilightforest/recipes/wood/twilight_oak_gate.json new file mode 100644 index 0000000000..cd707244c2 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/twilight_oak_gate.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "redstone", + "key": { + "#": { + "item": "twilightforest:twilight_oak_planks" + }, + "S": { + "tag": "forge:rods/wooden" + } + }, + "pattern": [ + "S#S", + "S#S" + ], + "result": { + "item": "twilightforest:twilight_oak_fence_gate" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/twilight_oak_planks.json b/src/generated/resources/data/twilightforest/recipes/wood/twilight_oak_planks.json new file mode 100644 index 0000000000..5dff12b8ce --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/twilight_oak_planks.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "ingredients": [ + { + "item": "twilightforest:twilight_oak_log" + } + ], + "result": { + "count": 4, + "item": "twilightforest:twilight_oak_planks" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/twilight_oak_plate.json b/src/generated/resources/data/twilightforest/recipes/wood/twilight_oak_plate.json new file mode 100644 index 0000000000..41ddf86356 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/twilight_oak_plate.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "redstone", + "key": { + "#": { + "item": "twilightforest:twilight_oak_planks" + } + }, + "pattern": [ + "##" + ], + "result": { + "item": "twilightforest:twilight_oak_pressure_plate" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/twilight_oak_sign_wood.json b/src/generated/resources/data/twilightforest/recipes/wood/twilight_oak_sign_wood.json new file mode 100644 index 0000000000..a187cb58b2 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/twilight_oak_sign_wood.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "#": { + "item": "twilightforest:twilight_oak_planks" + }, + "-": { + "tag": "forge:rods/wooden" + } + }, + "pattern": [ + "###", + "###", + " - " + ], + "result": { + "count": 3, + "item": "twilightforest:twilight_oak_sign" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/twilight_oak_slab.json b/src/generated/resources/data/twilightforest/recipes/wood/twilight_oak_slab.json new file mode 100644 index 0000000000..d243c24a8b --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/twilight_oak_slab.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "#": { + "item": "twilightforest:twilight_oak_planks" + } + }, + "pattern": [ + "###" + ], + "result": { + "count": 6, + "item": "twilightforest:twilight_oak_slab" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/twilight_oak_stairs.json b/src/generated/resources/data/twilightforest/recipes/wood/twilight_oak_stairs.json new file mode 100644 index 0000000000..70f9a0e50a --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/twilight_oak_stairs.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "#": { + "item": "twilightforest:twilight_oak_planks" + } + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "result": { + "count": 8, + "item": "twilightforest:twilight_oak_stairs" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/twilight_oak_stripped_wood.json b/src/generated/resources/data/twilightforest/recipes/wood/twilight_oak_stripped_wood.json new file mode 100644 index 0000000000..fda7c5d603 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/twilight_oak_stripped_wood.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "#": { + "item": "twilightforest:stripped_twilight_oak_log" + } + }, + "pattern": [ + "##", + "##" + ], + "result": { + "count": 3, + "item": "twilightforest:stripped_twilight_oak_wood" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/twilight_oak_trapdoor.json b/src/generated/resources/data/twilightforest/recipes/wood/twilight_oak_trapdoor.json new file mode 100644 index 0000000000..aa9fd6eb01 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/twilight_oak_trapdoor.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "redstone", + "key": { + "#": { + "item": "twilightforest:twilight_oak_planks" + } + }, + "pattern": [ + "###", + "###" + ], + "result": { + "count": 2, + "item": "twilightforest:twilight_oak_trapdoor" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/twilight_oak_wood.json b/src/generated/resources/data/twilightforest/recipes/wood/twilight_oak_wood.json new file mode 100644 index 0000000000..d5c3187e9d --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/twilight_oak_wood.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "#": { + "item": "twilightforest:twilight_oak_log" + } + }, + "pattern": [ + "##", + "##" + ], + "result": { + "count": 3, + "item": "twilightforest:twilight_oak_wood" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/vangrove_banister.json b/src/generated/resources/data/twilightforest/recipes/wood/vangrove_banister.json new file mode 100644 index 0000000000..b331e91909 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/vangrove_banister.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "-": { + "item": "minecraft:mangrove_slab" + }, + "|": { + "tag": "forge:rods/wooden" + } + }, + "pattern": [ + "---", + "| |" + ], + "result": { + "count": 3, + "item": "twilightforest:vangrove_banister" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/recipes/wood/warped_banister.json b/src/generated/resources/data/twilightforest/recipes/wood/warped_banister.json new file mode 100644 index 0000000000..3009124b24 --- /dev/null +++ b/src/generated/resources/data/twilightforest/recipes/wood/warped_banister.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "-": { + "item": "minecraft:warped_slab" + }, + "|": { + "tag": "forge:rods/wooden" + } + }, + "pattern": [ + "---", + "| |" + ], + "result": { + "count": 3, + "item": "twilightforest:warped_banister" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/stalactites/entries/coal_ore_stalactite.json b/src/generated/resources/data/twilightforest/stalactites/entries/coal_ore_stalactite.json new file mode 100644 index 0000000000..91e5bf7501 --- /dev/null +++ b/src/generated/resources/data/twilightforest/stalactites/entries/coal_ore_stalactite.json @@ -0,0 +1,11 @@ +{ + "blocks": [ + { + "block": "coal_ore", + "weight": 1 + } + ], + "max_length": 12, + "size_variation": 0.8, + "weight": 24 +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/stalactites/entries/copper_ore_raw_copper_block_stalactite.json b/src/generated/resources/data/twilightforest/stalactites/entries/copper_ore_raw_copper_block_stalactite.json new file mode 100644 index 0000000000..0eb837b097 --- /dev/null +++ b/src/generated/resources/data/twilightforest/stalactites/entries/copper_ore_raw_copper_block_stalactite.json @@ -0,0 +1,15 @@ +{ + "blocks": [ + { + "block": "copper_ore", + "weight": 20 + }, + { + "block": "raw_copper_block", + "weight": 1 + } + ], + "max_length": 12, + "size_variation": 0.6, + "weight": 12 +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/stalactites/entries/diamond_ore_stalactite.json b/src/generated/resources/data/twilightforest/stalactites/entries/diamond_ore_stalactite.json new file mode 100644 index 0000000000..3a2b6687c0 --- /dev/null +++ b/src/generated/resources/data/twilightforest/stalactites/entries/diamond_ore_stalactite.json @@ -0,0 +1,11 @@ +{ + "blocks": [ + { + "block": "diamond_ore", + "weight": 1 + } + ], + "max_length": 4, + "size_variation": 0.5, + "weight": 30 +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/stalactites/entries/emerald_ore_stalactite.json b/src/generated/resources/data/twilightforest/stalactites/entries/emerald_ore_stalactite.json new file mode 100644 index 0000000000..19bfcfc3d5 --- /dev/null +++ b/src/generated/resources/data/twilightforest/stalactites/entries/emerald_ore_stalactite.json @@ -0,0 +1,11 @@ +{ + "blocks": [ + { + "block": "emerald_ore", + "weight": 1 + } + ], + "max_length": 3, + "size_variation": 0.5, + "weight": 15 +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/stalactites/entries/glowstone_stalactite.json b/src/generated/resources/data/twilightforest/stalactites/entries/glowstone_stalactite.json new file mode 100644 index 0000000000..c8844b0b16 --- /dev/null +++ b/src/generated/resources/data/twilightforest/stalactites/entries/glowstone_stalactite.json @@ -0,0 +1,11 @@ +{ + "blocks": [ + { + "block": "glowstone", + "weight": 1 + } + ], + "max_length": 8, + "size_variation": 0.5, + "weight": 12 +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/stalactites/entries/gold_ore_raw_gold_block_stalactite.json b/src/generated/resources/data/twilightforest/stalactites/entries/gold_ore_raw_gold_block_stalactite.json new file mode 100644 index 0000000000..2f602c4422 --- /dev/null +++ b/src/generated/resources/data/twilightforest/stalactites/entries/gold_ore_raw_gold_block_stalactite.json @@ -0,0 +1,15 @@ +{ + "blocks": [ + { + "block": "gold_ore", + "weight": 10 + }, + { + "block": "raw_gold_block", + "weight": 1 + } + ], + "max_length": 6, + "size_variation": 0.6, + "weight": 20 +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/stalactites/entries/iron_ore_raw_iron_block_stalactite.json b/src/generated/resources/data/twilightforest/stalactites/entries/iron_ore_raw_iron_block_stalactite.json new file mode 100644 index 0000000000..8efbd2d4a1 --- /dev/null +++ b/src/generated/resources/data/twilightforest/stalactites/entries/iron_ore_raw_iron_block_stalactite.json @@ -0,0 +1,15 @@ +{ + "blocks": [ + { + "block": "iron_ore", + "weight": 20 + }, + { + "block": "raw_iron_block", + "weight": 1 + } + ], + "max_length": 8, + "size_variation": 0.7, + "weight": 24 +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/stalactites/entries/lapis_ore_stalactite.json b/src/generated/resources/data/twilightforest/stalactites/entries/lapis_ore_stalactite.json new file mode 100644 index 0000000000..d018bb64eb --- /dev/null +++ b/src/generated/resources/data/twilightforest/stalactites/entries/lapis_ore_stalactite.json @@ -0,0 +1,11 @@ +{ + "blocks": [ + { + "block": "lapis_ore", + "weight": 1 + } + ], + "max_length": 8, + "size_variation": 0.8, + "weight": 30 +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/stalactites/entries/redstone_ore_stalactite.json b/src/generated/resources/data/twilightforest/stalactites/entries/redstone_ore_stalactite.json new file mode 100644 index 0000000000..8d14553a21 --- /dev/null +++ b/src/generated/resources/data/twilightforest/stalactites/entries/redstone_ore_stalactite.json @@ -0,0 +1,11 @@ +{ + "blocks": [ + { + "block": "redstone_ore", + "weight": 1 + } + ], + "max_length": 8, + "size_variation": 0.8, + "weight": 40 +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/stalactites/large_hollow_hill.json b/src/generated/resources/data/twilightforest/stalactites/large_hollow_hill.json new file mode 100644 index 0000000000..12d8113cde --- /dev/null +++ b/src/generated/resources/data/twilightforest/stalactites/large_hollow_hill.json @@ -0,0 +1,8 @@ +{ + "replace": false, + "stalactites": [ + "twilightforest:diamond_ore_stalactite", + "twilightforest:emerald_ore_stalactite", + "twilightforest:lapis_ore_stalactite" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/stalactites/medium_hollow_hill.json b/src/generated/resources/data/twilightforest/stalactites/medium_hollow_hill.json new file mode 100644 index 0000000000..2875892d12 --- /dev/null +++ b/src/generated/resources/data/twilightforest/stalactites/medium_hollow_hill.json @@ -0,0 +1,7 @@ +{ + "replace": false, + "stalactites": [ + "twilightforest:gold_ore_raw_gold_block_stalactite", + "twilightforest:redstone_ore_stalactite" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/stalactites/small_hollow_hill.json b/src/generated/resources/data/twilightforest/stalactites/small_hollow_hill.json new file mode 100644 index 0000000000..4c982e8700 --- /dev/null +++ b/src/generated/resources/data/twilightforest/stalactites/small_hollow_hill.json @@ -0,0 +1,9 @@ +{ + "replace": false, + "stalactites": [ + "twilightforest:coal_ore_stalactite", + "twilightforest:copper_ore_raw_copper_block_stalactite", + "twilightforest:glowstone_stalactite", + "twilightforest:iron_ore_raw_iron_block_stalactite" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/banner_pattern/pattern_item/alpha_yeti.json b/src/generated/resources/data/twilightforest/tags/banner_pattern/pattern_item/alpha_yeti.json new file mode 100644 index 0000000000..57f914a51d --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/banner_pattern/pattern_item/alpha_yeti.json @@ -0,0 +1,5 @@ +{ + "values": [ + "twilightforest:alpha_yeti" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/banner_pattern/pattern_item/hydra.json b/src/generated/resources/data/twilightforest/tags/banner_pattern/pattern_item/hydra.json new file mode 100644 index 0000000000..7fa6708873 --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/banner_pattern/pattern_item/hydra.json @@ -0,0 +1,5 @@ +{ + "values": [ + "twilightforest:hydra" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/banner_pattern/pattern_item/knight_phantom.json b/src/generated/resources/data/twilightforest/tags/banner_pattern/pattern_item/knight_phantom.json new file mode 100644 index 0000000000..6365ba61dd --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/banner_pattern/pattern_item/knight_phantom.json @@ -0,0 +1,5 @@ +{ + "values": [ + "twilightforest:knight_phantom" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/banner_pattern/pattern_item/lich.json b/src/generated/resources/data/twilightforest/tags/banner_pattern/pattern_item/lich.json new file mode 100644 index 0000000000..3ce557cdaa --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/banner_pattern/pattern_item/lich.json @@ -0,0 +1,5 @@ +{ + "values": [ + "twilightforest:lich" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/banner_pattern/pattern_item/minoshroom.json b/src/generated/resources/data/twilightforest/tags/banner_pattern/pattern_item/minoshroom.json new file mode 100644 index 0000000000..6bc3ee320a --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/banner_pattern/pattern_item/minoshroom.json @@ -0,0 +1,5 @@ +{ + "values": [ + "twilightforest:minoshroom" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/banner_pattern/pattern_item/naga.json b/src/generated/resources/data/twilightforest/tags/banner_pattern/pattern_item/naga.json new file mode 100644 index 0000000000..8d6ae74af5 --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/banner_pattern/pattern_item/naga.json @@ -0,0 +1,5 @@ +{ + "values": [ + "twilightforest:naga" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/banner_pattern/pattern_item/quest_ram.json b/src/generated/resources/data/twilightforest/tags/banner_pattern/pattern_item/quest_ram.json new file mode 100644 index 0000000000..384f06831d --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/banner_pattern/pattern_item/quest_ram.json @@ -0,0 +1,5 @@ +{ + "values": [ + "twilightforest:quest_ram" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/banner_pattern/pattern_item/snow_queen.json b/src/generated/resources/data/twilightforest/tags/banner_pattern/pattern_item/snow_queen.json new file mode 100644 index 0000000000..51f4ef4bcc --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/banner_pattern/pattern_item/snow_queen.json @@ -0,0 +1,5 @@ +{ + "values": [ + "twilightforest:snow_queen" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/banner_pattern/pattern_item/ur_ghast.json b/src/generated/resources/data/twilightforest/tags/banner_pattern/pattern_item/ur_ghast.json new file mode 100644 index 0000000000..44ff2adee3 --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/banner_pattern/pattern_item/ur_ghast.json @@ -0,0 +1,5 @@ +{ + "values": [ + "twilightforest:ur_ghast" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/blocks/annihilation_inclusions.json b/src/generated/resources/data/twilightforest/tags/blocks/annihilation_inclusions.json new file mode 100644 index 0000000000..2951aaa50a --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/blocks/annihilation_inclusions.json @@ -0,0 +1,25 @@ +{ + "values": [ + "minecraft:nether_portal", + "twilightforest:deadrock", + "twilightforest:cracked_deadrock", + "twilightforest:weathered_deadrock", + "twilightforest:castle_brick", + "twilightforest:cracked_deadrock", + "twilightforest:thick_castle_brick", + "twilightforest:mossy_castle_brick", + "twilightforest:castle_roof_tile", + "twilightforest:worn_castle_brick", + "twilightforest:blue_castle_rune_brick", + "twilightforest:violet_castle_rune_brick", + "twilightforest:yellow_castle_rune_brick", + "twilightforest:pink_castle_rune_brick", + "twilightforest:pink_force_field", + "twilightforest:orange_force_field", + "twilightforest:green_force_field", + "twilightforest:blue_force_field", + "twilightforest:violet_force_field", + "twilightforest:brown_thorns", + "twilightforest:green_thorns" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/blocks/antibuilder_ignores.json b/src/generated/resources/data/twilightforest/tags/blocks/antibuilder_ignores.json new file mode 100644 index 0000000000..80f77656ac --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/blocks/antibuilder_ignores.json @@ -0,0 +1,21 @@ +{ + "values": [ + "minecraft:redstone_lamp", + "minecraft:tnt", + "minecraft:water", + "twilightforest:antibuilder", + "twilightforest:carminite_builder", + "twilightforest:built_block", + "twilightforest:reactor_debris", + "twilightforest:carminite_reactor", + "twilightforest:reappearing_block", + "twilightforest:ghast_trap", + "twilightforest:fake_diamond", + "twilightforest:fake_gold", + "#twilightforest:common_protections", + { + "id": "gravestone:gravestone", + "required": false + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/blocks/banisters.json b/src/generated/resources/data/twilightforest/tags/blocks/banisters.json new file mode 100644 index 0000000000..701a60922d --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/blocks/banisters.json @@ -0,0 +1,21 @@ +{ + "values": [ + "twilightforest:oak_banister", + "twilightforest:spruce_banister", + "twilightforest:birch_banister", + "twilightforest:jungle_banister", + "twilightforest:acacia_banister", + "twilightforest:dark_oak_banister", + "twilightforest:crimson_banister", + "twilightforest:warped_banister", + "twilightforest:vangrove_banister", + "twilightforest:twilight_oak_banister", + "twilightforest:canopy_banister", + "twilightforest:mangrove_banister", + "twilightforest:dark_banister", + "twilightforest:time_banister", + "twilightforest:transformation_banister", + "twilightforest:mining_banister", + "twilightforest:sorting_banister" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/blocks/canopy_logs.json b/src/generated/resources/data/twilightforest/tags/blocks/canopy_logs.json new file mode 100644 index 0000000000..9a2e434635 --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/blocks/canopy_logs.json @@ -0,0 +1,8 @@ +{ + "values": [ + "twilightforest:canopy_log", + "twilightforest:stripped_canopy_log", + "twilightforest:canopy_wood", + "twilightforest:stripped_canopy_wood" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/blocks/carminite_reactor_immune.json b/src/generated/resources/data/twilightforest/tags/blocks/carminite_reactor_immune.json new file mode 100644 index 0000000000..afe5df3cc1 --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/blocks/carminite_reactor_immune.json @@ -0,0 +1,5 @@ +{ + "values": [ + "#twilightforest:common_protections" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/blocks/carminite_reactor_ores.json b/src/generated/resources/data/twilightforest/tags/blocks/carminite_reactor_ores.json new file mode 100644 index 0000000000..843e94b1f0 --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/blocks/carminite_reactor_ores.json @@ -0,0 +1,6 @@ +{ + "values": [ + "minecraft:nether_quartz_ore", + "minecraft:nether_gold_ore" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/blocks/castle_blocks.json b/src/generated/resources/data/twilightforest/tags/blocks/castle_blocks.json new file mode 100644 index 0000000000..d33c9d3db3 --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/blocks/castle_blocks.json @@ -0,0 +1,28 @@ +{ + "values": [ + "twilightforest:castle_brick", + "twilightforest:worn_castle_brick", + "twilightforest:cracked_castle_brick", + "twilightforest:mossy_castle_brick", + "twilightforest:castle_roof_tile", + "twilightforest:thick_castle_brick", + "twilightforest:bold_castle_brick_tile", + "twilightforest:bold_castle_brick_pillar", + "twilightforest:encased_castle_brick_tile", + "twilightforest:encased_castle_brick_pillar", + "twilightforest:castle_brick_stairs", + "twilightforest:worn_castle_brick_stairs", + "twilightforest:cracked_castle_brick_stairs", + "twilightforest:mossy_castle_brick_stairs", + "twilightforest:encased_castle_brick_stairs", + "twilightforest:bold_castle_brick_stairs", + "twilightforest:pink_castle_rune_brick", + "twilightforest:yellow_castle_rune_brick", + "twilightforest:blue_castle_rune_brick", + "twilightforest:violet_castle_rune_brick", + "twilightforest:pink_castle_door", + "twilightforest:yellow_castle_door", + "twilightforest:blue_castle_door", + "twilightforest:violet_castle_door" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/blocks/common_protections.json b/src/generated/resources/data/twilightforest/tags/blocks/common_protections.json new file mode 100644 index 0000000000..5aee07e8a5 --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/blocks/common_protections.json @@ -0,0 +1,36 @@ +{ + "values": [ + "twilightforest:naga_boss_spawner", + "twilightforest:lich_boss_spawner", + "twilightforest:minoshroom_boss_spawner", + "twilightforest:hydra_boss_spawner", + "twilightforest:knight_phantom_boss_spawner", + "twilightforest:ur_ghast_boss_spawner", + "twilightforest:alpha_yeti_boss_spawner", + "twilightforest:snow_queen_boss_spawner", + "twilightforest:final_boss_boss_spawner", + "twilightforest:stronghold_shield", + "twilightforest:vanishing_block", + "twilightforest:locked_vanishing_block", + "twilightforest:pink_force_field", + "twilightforest:orange_force_field", + "twilightforest:green_force_field", + "twilightforest:blue_force_field", + "twilightforest:violet_force_field", + "twilightforest:keepsake_casket", + "twilightforest:trophy_pedestal", + "minecraft:barrier", + "minecraft:bedrock", + "minecraft:end_portal", + "minecraft:end_portal_frame", + "minecraft:end_gateway", + "minecraft:command_block", + "minecraft:repeating_command_block", + "minecraft:chain_command_block", + "minecraft:structure_block", + "minecraft:jigsaw", + "minecraft:moving_piston", + "minecraft:light", + "minecraft:reinforced_deepslate" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/blocks/dark_tower_allowed_pots.json b/src/generated/resources/data/twilightforest/tags/blocks/dark_tower_allowed_pots.json new file mode 100644 index 0000000000..7954a5c905 --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/blocks/dark_tower_allowed_pots.json @@ -0,0 +1,45 @@ +{ + "values": [ + "twilightforest:potted_twilight_oak_sapling", + "twilightforest:potted_canopy_sapling", + "twilightforest:potted_mangrove_sapling", + "twilightforest:potted_darkwood_sapling", + "twilightforest:potted_rainbow_oak_sapling", + "twilightforest:potted_mayapple", + "twilightforest:potted_fiddlehead", + "twilightforest:potted_mushgloom", + "minecraft:flower_pot", + "minecraft:potted_poppy", + "minecraft:potted_blue_orchid", + "minecraft:potted_allium", + "minecraft:potted_azure_bluet", + "minecraft:potted_red_tulip", + "minecraft:potted_orange_tulip", + "minecraft:potted_white_tulip", + "minecraft:potted_pink_tulip", + "minecraft:potted_oxeye_daisy", + "minecraft:potted_dandelion", + "minecraft:potted_oak_sapling", + "minecraft:potted_spruce_sapling", + "minecraft:potted_birch_sapling", + "minecraft:potted_jungle_sapling", + "minecraft:potted_acacia_sapling", + "minecraft:potted_dark_oak_sapling", + "minecraft:potted_red_mushroom", + "minecraft:potted_brown_mushroom", + "minecraft:potted_dead_bush", + "minecraft:potted_fern", + "minecraft:potted_cactus", + "minecraft:potted_cornflower", + "minecraft:potted_lily_of_the_valley", + "minecraft:potted_wither_rose", + "minecraft:potted_bamboo", + "minecraft:potted_crimson_fungus", + "minecraft:potted_warped_fungus", + "minecraft:potted_crimson_roots", + "minecraft:potted_warped_roots", + "minecraft:potted_azalea_bush", + "minecraft:potted_flowering_azalea_bush", + "minecraft:potted_mangrove_propagule" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/blocks/darkwood_logs.json b/src/generated/resources/data/twilightforest/tags/blocks/darkwood_logs.json new file mode 100644 index 0000000000..b68c597c15 --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/blocks/darkwood_logs.json @@ -0,0 +1,8 @@ +{ + "values": [ + "twilightforest:dark_log", + "twilightforest:stripped_dark_log", + "twilightforest:dark_wood", + "twilightforest:stripped_dark_wood" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/blocks/druid_projectile_replaceable.json b/src/generated/resources/data/twilightforest/tags/blocks/druid_projectile_replaceable.json new file mode 100644 index 0000000000..2c41a461a2 --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/blocks/druid_projectile_replaceable.json @@ -0,0 +1,13 @@ +{ + "values": [ + "#minecraft:leaves", + "#minecraft:logs", + "#minecraft:planks", + "#minecraft:overworld_carver_replaceables", + "#minecraft:nether_carver_replaceables", + "#minecraft:replaceable_plants", + "#minecraft:lush_ground_replaceable", + "#minecraft:sculk_replaceable", + "#forge:ores" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/blocks/fire_jet_fuel.json b/src/generated/resources/data/twilightforest/tags/blocks/fire_jet_fuel.json new file mode 100644 index 0000000000..2756283419 --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/blocks/fire_jet_fuel.json @@ -0,0 +1,5 @@ +{ + "values": [ + "minecraft:lava" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/blocks/giants_spawnable_on.json b/src/generated/resources/data/twilightforest/tags/blocks/giants_spawnable_on.json new file mode 100644 index 0000000000..f03e12708a --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/blocks/giants_spawnable_on.json @@ -0,0 +1,6 @@ +{ + "values": [ + "twilightforest:wispy_cloud", + "twilightforest:fluffy_cloud" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/blocks/hollow_logs.json b/src/generated/resources/data/twilightforest/tags/blocks/hollow_logs.json new file mode 100644 index 0000000000..c47e5f8e8b --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/blocks/hollow_logs.json @@ -0,0 +1,7 @@ +{ + "values": [ + "#twilightforest:hollow_logs_horizontal", + "#twilightforest:hollow_logs_vertical", + "#twilightforest:hollow_logs_climbable" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/blocks/hollow_logs_climbable.json b/src/generated/resources/data/twilightforest/tags/blocks/hollow_logs_climbable.json new file mode 100644 index 0000000000..091546f093 --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/blocks/hollow_logs_climbable.json @@ -0,0 +1,21 @@ +{ + "values": [ + "twilightforest:hollow_oak_log_climbable", + "twilightforest:hollow_spruce_log_climbable", + "twilightforest:hollow_birch_log_climbable", + "twilightforest:hollow_jungle_log_climbable", + "twilightforest:hollow_acacia_log_climbable", + "twilightforest:hollow_dark_oak_log_climbable", + "twilightforest:hollow_crimson_stem_climbable", + "twilightforest:hollow_warped_stem_climbable", + "twilightforest:hollow_vangrove_log_climbable", + "twilightforest:hollow_twilight_oak_log_climbable", + "twilightforest:hollow_canopy_log_climbable", + "twilightforest:hollow_mangrove_log_climbable", + "twilightforest:hollow_dark_log_climbable", + "twilightforest:hollow_time_log_climbable", + "twilightforest:hollow_transformation_log_climbable", + "twilightforest:hollow_mining_log_climbable", + "twilightforest:hollow_sorting_log_climbable" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/blocks/hollow_logs_horizontal.json b/src/generated/resources/data/twilightforest/tags/blocks/hollow_logs_horizontal.json new file mode 100644 index 0000000000..a9d0586e24 --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/blocks/hollow_logs_horizontal.json @@ -0,0 +1,21 @@ +{ + "values": [ + "twilightforest:hollow_oak_log_horizontal", + "twilightforest:hollow_spruce_log_horizontal", + "twilightforest:hollow_birch_log_horizontal", + "twilightforest:hollow_jungle_log_horizontal", + "twilightforest:hollow_acacia_log_horizontal", + "twilightforest:hollow_dark_oak_log_horizontal", + "twilightforest:hollow_crimson_stem_horizontal", + "twilightforest:hollow_warped_stem_horizontal", + "twilightforest:hollow_vangrove_log_horizontal", + "twilightforest:hollow_twilight_oak_log_horizontal", + "twilightforest:hollow_canopy_log_horizontal", + "twilightforest:hollow_mangrove_log_horizontal", + "twilightforest:hollow_dark_log_horizontal", + "twilightforest:hollow_time_log_horizontal", + "twilightforest:hollow_transformation_log_horizontal", + "twilightforest:hollow_mining_log_horizontal", + "twilightforest:hollow_sorting_log_horizontal" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/blocks/hollow_logs_vertical.json b/src/generated/resources/data/twilightforest/tags/blocks/hollow_logs_vertical.json new file mode 100644 index 0000000000..8b3f626d3c --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/blocks/hollow_logs_vertical.json @@ -0,0 +1,21 @@ +{ + "values": [ + "twilightforest:hollow_oak_log_vertical", + "twilightforest:hollow_spruce_log_vertical", + "twilightforest:hollow_birch_log_vertical", + "twilightforest:hollow_jungle_log_vertical", + "twilightforest:hollow_acacia_log_vertical", + "twilightforest:hollow_dark_oak_log_vertical", + "twilightforest:hollow_crimson_stem_vertical", + "twilightforest:hollow_warped_stem_vertical", + "twilightforest:hollow_vangrove_log_vertical", + "twilightforest:hollow_twilight_oak_log_vertical", + "twilightforest:hollow_canopy_log_vertical", + "twilightforest:hollow_mangrove_log_vertical", + "twilightforest:hollow_dark_log_vertical", + "twilightforest:hollow_time_log_vertical", + "twilightforest:hollow_transformation_log_vertical", + "twilightforest:hollow_mining_log_vertical", + "twilightforest:hollow_sorting_log_vertical" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/blocks/ice_bomb_replaceables.json b/src/generated/resources/data/twilightforest/tags/blocks/ice_bomb_replaceables.json new file mode 100644 index 0000000000..e4edca48eb --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/blocks/ice_bomb_replaceables.json @@ -0,0 +1,11 @@ +{ + "values": [ + "twilightforest:mayapple", + "twilightforest:fiddlehead", + "minecraft:grass", + "minecraft:tall_grass", + "minecraft:fern", + "minecraft:large_fern", + "#minecraft:flowers" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/blocks/logs.json b/src/generated/resources/data/twilightforest/tags/blocks/logs.json new file mode 100644 index 0000000000..f9c0aa9a4e --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/blocks/logs.json @@ -0,0 +1,12 @@ +{ + "values": [ + "#twilightforest:twilight_oak_logs", + "#twilightforest:canopy_logs", + "#twilightforest:mangrove_logs", + "#twilightforest:darkwood_logs", + "#twilightforest:timewood_logs", + "#twilightforest:transwood_logs", + "#twilightforest:mining_logs", + "#twilightforest:sortwood_logs" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/blocks/mangrove_logs.json b/src/generated/resources/data/twilightforest/tags/blocks/mangrove_logs.json new file mode 100644 index 0000000000..ab5277c581 --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/blocks/mangrove_logs.json @@ -0,0 +1,8 @@ +{ + "values": [ + "twilightforest:mangrove_log", + "twilightforest:stripped_mangrove_log", + "twilightforest:mangrove_wood", + "twilightforest:stripped_mangrove_wood" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/blocks/mazebreaker_accelerated_mining.json b/src/generated/resources/data/twilightforest/tags/blocks/mazebreaker_accelerated_mining.json new file mode 100644 index 0000000000..c3a247f685 --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/blocks/mazebreaker_accelerated_mining.json @@ -0,0 +1,6 @@ +{ + "values": [ + "#twilightforest:mazestone", + "#twilightforest:castle_blocks" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/blocks/mazestone.json b/src/generated/resources/data/twilightforest/tags/blocks/mazestone.json new file mode 100644 index 0000000000..7dad1b0000 --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/blocks/mazestone.json @@ -0,0 +1,12 @@ +{ + "values": [ + "twilightforest:mazestone", + "twilightforest:mazestone_brick", + "twilightforest:cracked_mazestone", + "twilightforest:mossy_mazestone", + "twilightforest:cut_mazestone", + "twilightforest:decorative_mazestone", + "twilightforest:mazestone_mosaic", + "twilightforest:mazestone_border" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/blocks/mining_logs.json b/src/generated/resources/data/twilightforest/tags/blocks/mining_logs.json new file mode 100644 index 0000000000..be1c2c17a2 --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/blocks/mining_logs.json @@ -0,0 +1,8 @@ +{ + "values": [ + "twilightforest:mining_log", + "twilightforest:stripped_mining_log", + "twilightforest:mining_wood", + "twilightforest:stripped_mining_wood" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/blocks/ore_magnet/ignored_ores.json b/src/generated/resources/data/twilightforest/tags/blocks/ore_magnet/ignored_ores.json new file mode 100644 index 0000000000..c1246af516 --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/blocks/ore_magnet/ignored_ores.json @@ -0,0 +1,5 @@ +{ + "values": [ + "#minecraft:coal_ores" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/blocks/ore_magnet/ore_safe_replace_block.json b/src/generated/resources/data/twilightforest/tags/blocks/ore_magnet/ore_safe_replace_block.json new file mode 100644 index 0000000000..89f1b363fa --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/blocks/ore_magnet/ore_safe_replace_block.json @@ -0,0 +1,14 @@ +{ + "values": [ + "#minecraft:dirt", + "#forge:gravel", + "#forge:sand", + "#minecraft:nylium", + "#minecraft:base_stone_overworld", + "#minecraft:base_stone_nether", + "#forge:end_stones", + "#minecraft:deepslate_ore_replaceables", + "#minecraft:stone_ore_replaceables", + "#forge:ore_bearing_ground/root" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/blocks/penguins_spawnable_on.json b/src/generated/resources/data/twilightforest/tags/blocks/penguins_spawnable_on.json new file mode 100644 index 0000000000..cb6b22a194 --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/blocks/penguins_spawnable_on.json @@ -0,0 +1,7 @@ +{ + "values": [ + "minecraft:ice", + "minecraft:packed_ice", + "minecraft:blue_ice" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/blocks/plants_hang_on.json b/src/generated/resources/data/twilightforest/tags/blocks/plants_hang_on.json new file mode 100644 index 0000000000..b8a69b2f05 --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/blocks/plants_hang_on.json @@ -0,0 +1,9 @@ +{ + "values": [ + "#minecraft:dirt", + "minecraft:moss_block", + "twilightforest:mangrove_root", + "twilightforest:root", + "twilightforest:liveroot_block" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/blocks/portal/decoration.json b/src/generated/resources/data/twilightforest/tags/blocks/portal/decoration.json new file mode 100644 index 0000000000..b75656e135 --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/blocks/portal/decoration.json @@ -0,0 +1,65 @@ +{ + "values": [ + "minecraft:bamboo", + "minecraft:cherry_sapling", + "minecraft:mangrove_propagule", + "minecraft:cherry_leaves", + "minecraft:mangrove_leaves", + "minecraft:grass", + "minecraft:fern", + "minecraft:dead_bush", + "minecraft:torchflower", + "minecraft:brown_mushroom", + "minecraft:red_mushroom", + "minecraft:sugar_cane", + "minecraft:attached_pumpkin_stem", + "minecraft:attached_melon_stem", + "minecraft:vine", + "minecraft:glow_lichen", + "minecraft:lily_pad", + "minecraft:nether_wart", + "minecraft:cocoa", + "minecraft:tall_grass", + "minecraft:large_fern", + "minecraft:chorus_plant", + "minecraft:chorus_flower", + "minecraft:torchflower_crop", + "minecraft:sweet_berry_bush", + "minecraft:warped_fungus", + "minecraft:crimson_fungus", + "minecraft:weeping_vines", + "minecraft:weeping_vines_plant", + "minecraft:twisting_vines", + "minecraft:twisting_vines_plant", + "minecraft:cave_vines", + "minecraft:cave_vines_plant", + "minecraft:spore_blossom", + "minecraft:moss_carpet", + "minecraft:pink_petals", + "minecraft:big_dripleaf", + "minecraft:big_dripleaf_stem", + "minecraft:small_dripleaf", + "minecraft:hanging_roots", + "twilightforest:moss_patch", + "twilightforest:mayapple", + "twilightforest:clover_patch", + "twilightforest:fiddlehead", + "twilightforest:mushgloom", + "twilightforest:torchberry_plant", + "twilightforest:root_strand", + "twilightforest:fallen_leaves", + "twilightforest:huge_lily_pad", + "twilightforest:huge_water_lily", + "twilightforest:thorn_rose", + "twilightforest:giant_leaves", + "twilightforest:trollvidr", + "twilightforest:unripe_trollber", + "twilightforest:trollber", + "twilightforest:steeleaf_block", + "twilightforest:hardened_dark_leaves", + "#minecraft:flowers", + "#minecraft:leaves", + "#minecraft:saplings", + "#minecraft:crops" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/blocks/portal/edge.json b/src/generated/resources/data/twilightforest/tags/blocks/portal/edge.json new file mode 100644 index 0000000000..acb8ce40ad --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/blocks/portal/edge.json @@ -0,0 +1,7 @@ +{ + "values": [ + "minecraft:farmland", + "minecraft:dirt_path", + "#minecraft:dirt" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/blocks/portal/fluid.json b/src/generated/resources/data/twilightforest/tags/blocks/portal/fluid.json new file mode 100644 index 0000000000..d1e7f7ca89 --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/blocks/portal/fluid.json @@ -0,0 +1,5 @@ +{ + "values": [ + "minecraft:water" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/blocks/portal/generated_decoration.json b/src/generated/resources/data/twilightforest/tags/blocks/portal/generated_decoration.json new file mode 100644 index 0000000000..434d8cf139 --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/blocks/portal/generated_decoration.json @@ -0,0 +1,21 @@ +{ + "values": [ + "minecraft:brown_mushroom", + "minecraft:red_mushroom", + "minecraft:grass", + "minecraft:fern", + "minecraft:blue_orchid", + "minecraft:azure_bluet", + "minecraft:lily_of_the_valley", + "minecraft:oxeye_daisy", + "minecraft:allium", + "minecraft:cornflower", + "minecraft:white_tulip", + "minecraft:pink_tulip", + "minecraft:orange_tulip", + "minecraft:red_tulip", + "twilightforest:mushgloom", + "twilightforest:mayapple", + "twilightforest:fiddlehead" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/blocks/progression_allow_breaking.json b/src/generated/resources/data/twilightforest/tags/blocks/progression_allow_breaking.json new file mode 100644 index 0000000000..b77a194704 --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/blocks/progression_allow_breaking.json @@ -0,0 +1,9 @@ +{ + "values": [ + "twilightforest:keepsake_casket", + { + "id": "gravestone:gravestone", + "required": false + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/blocks/sortwood_logs.json b/src/generated/resources/data/twilightforest/tags/blocks/sortwood_logs.json new file mode 100644 index 0000000000..1b56ac411a --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/blocks/sortwood_logs.json @@ -0,0 +1,8 @@ +{ + "values": [ + "twilightforest:sorting_log", + "twilightforest:stripped_sorting_log", + "twilightforest:sorting_wood", + "twilightforest:stripped_sorting_wood" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/blocks/storage_blocks/arctic_fur.json b/src/generated/resources/data/twilightforest/tags/blocks/storage_blocks/arctic_fur.json new file mode 100644 index 0000000000..fce3c65e35 --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/blocks/storage_blocks/arctic_fur.json @@ -0,0 +1,5 @@ +{ + "values": [ + "twilightforest:arctic_fur_block" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/blocks/storage_blocks/carminite.json b/src/generated/resources/data/twilightforest/tags/blocks/storage_blocks/carminite.json new file mode 100644 index 0000000000..cda29ab98b --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/blocks/storage_blocks/carminite.json @@ -0,0 +1,5 @@ +{ + "values": [ + "twilightforest:carminite_block" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/blocks/storage_blocks/fiery.json b/src/generated/resources/data/twilightforest/tags/blocks/storage_blocks/fiery.json new file mode 100644 index 0000000000..567fd67368 --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/blocks/storage_blocks/fiery.json @@ -0,0 +1,5 @@ +{ + "values": [ + "twilightforest:fiery_block" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/blocks/storage_blocks/ironwood.json b/src/generated/resources/data/twilightforest/tags/blocks/storage_blocks/ironwood.json new file mode 100644 index 0000000000..4a5c62ce86 --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/blocks/storage_blocks/ironwood.json @@ -0,0 +1,5 @@ +{ + "values": [ + "twilightforest:ironwood_block" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/blocks/storage_blocks/knightmetal.json b/src/generated/resources/data/twilightforest/tags/blocks/storage_blocks/knightmetal.json new file mode 100644 index 0000000000..0e3becb730 --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/blocks/storage_blocks/knightmetal.json @@ -0,0 +1,5 @@ +{ + "values": [ + "twilightforest:knightmetal_block" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/blocks/storage_blocks/steeleaf.json b/src/generated/resources/data/twilightforest/tags/blocks/storage_blocks/steeleaf.json new file mode 100644 index 0000000000..e3b48ca018 --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/blocks/storage_blocks/steeleaf.json @@ -0,0 +1,5 @@ +{ + "values": [ + "twilightforest:steeleaf_block" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/blocks/structure_banned_interactions.json b/src/generated/resources/data/twilightforest/tags/blocks/structure_banned_interactions.json new file mode 100644 index 0000000000..c2286de189 --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/blocks/structure_banned_interactions.json @@ -0,0 +1,8 @@ +{ + "values": [ + "minecraft:lever", + "twilightforest:antibuilder", + "#minecraft:buttons", + "#forge:chests" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/blocks/time_core_excluded.json b/src/generated/resources/data/twilightforest/tags/blocks/time_core_excluded.json new file mode 100644 index 0000000000..1ca49a6850 --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/blocks/time_core_excluded.json @@ -0,0 +1,5 @@ +{ + "values": [ + "minecraft:nether_portal" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/blocks/timewood_logs.json b/src/generated/resources/data/twilightforest/tags/blocks/timewood_logs.json new file mode 100644 index 0000000000..71508ac39d --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/blocks/timewood_logs.json @@ -0,0 +1,8 @@ +{ + "values": [ + "twilightforest:time_log", + "twilightforest:stripped_time_log", + "twilightforest:time_wood", + "twilightforest:stripped_time_wood" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/blocks/towerwood.json b/src/generated/resources/data/twilightforest/tags/blocks/towerwood.json new file mode 100644 index 0000000000..222c6de7c6 --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/blocks/towerwood.json @@ -0,0 +1,8 @@ +{ + "values": [ + "twilightforest:towerwood", + "twilightforest:mossy_towerwood", + "twilightforest:cracked_towerwood", + "twilightforest:infested_towerwood" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/blocks/transwood_logs.json b/src/generated/resources/data/twilightforest/tags/blocks/transwood_logs.json new file mode 100644 index 0000000000..bc75641e55 --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/blocks/transwood_logs.json @@ -0,0 +1,8 @@ +{ + "values": [ + "twilightforest:transformation_log", + "twilightforest:stripped_transformation_log", + "twilightforest:transformation_wood", + "twilightforest:stripped_transformation_wood" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/blocks/tree_roots_skip.json b/src/generated/resources/data/twilightforest/tags/blocks/tree_roots_skip.json new file mode 100644 index 0000000000..d55b2c8e86 --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/blocks/tree_roots_skip.json @@ -0,0 +1,9 @@ +{ + "values": [ + "twilightforest:root", + "twilightforest:liveroot_block", + "twilightforest:mangrove_root", + "twilightforest:time_wood", + "#minecraft:features_cannot_replace" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/blocks/trophies.json b/src/generated/resources/data/twilightforest/tags/blocks/trophies.json new file mode 100644 index 0000000000..3779940093 --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/blocks/trophies.json @@ -0,0 +1,22 @@ +{ + "values": [ + "twilightforest:naga_trophy", + "twilightforest:naga_wall_trophy", + "twilightforest:lich_trophy", + "twilightforest:lich_wall_trophy", + "twilightforest:minoshroom_trophy", + "twilightforest:minoshroom_wall_trophy", + "twilightforest:hydra_trophy", + "twilightforest:hydra_wall_trophy", + "twilightforest:knight_phantom_trophy", + "twilightforest:knight_phantom_wall_trophy", + "twilightforest:ur_ghast_trophy", + "twilightforest:ur_ghast_wall_trophy", + "twilightforest:alpha_yeti_trophy", + "twilightforest:alpha_yeti_wall_trophy", + "twilightforest:snow_queen_trophy", + "twilightforest:snow_queen_wall_trophy", + "twilightforest:quest_ram_trophy", + "twilightforest:quest_ram_wall_trophy" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/blocks/twilight_oak_logs.json b/src/generated/resources/data/twilightforest/tags/blocks/twilight_oak_logs.json new file mode 100644 index 0000000000..0f68c3c3e6 --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/blocks/twilight_oak_logs.json @@ -0,0 +1,8 @@ +{ + "values": [ + "twilightforest:twilight_oak_log", + "twilightforest:stripped_twilight_oak_log", + "twilightforest:twilight_oak_wood", + "twilightforest:stripped_twilight_oak_wood" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/blocks/worldgen_replaceables.json b/src/generated/resources/data/twilightforest/tags/blocks/worldgen_replaceables.json new file mode 100644 index 0000000000..e5ac5724a8 --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/blocks/worldgen_replaceables.json @@ -0,0 +1,6 @@ +{ + "values": [ + "#minecraft:lush_ground_replaceable", + "#minecraft:replaceable_plants" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/damage_type/breaks_lich_shields.json b/src/generated/resources/data/twilightforest/tags/damage_type/breaks_lich_shields.json new file mode 100644 index 0000000000..52937a0308 --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/damage_type/breaks_lich_shields.json @@ -0,0 +1,9 @@ +{ + "values": [ + "minecraft:magic", + "minecraft:indirect_magic", + "minecraft:sonic_boom", + "twilightforest:lich_bolt", + "twilightforest:twilight_scepter" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/enchantment/phantom_armor_banned_enchants.json b/src/generated/resources/data/twilightforest/tags/enchantment/phantom_armor_banned_enchants.json new file mode 100644 index 0000000000..b03319b4bd --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/enchantment/phantom_armor_banned_enchants.json @@ -0,0 +1,6 @@ +{ + "values": [ + "minecraft:vanishing_curse", + "minecraft:binding_curse" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/entity_types/bosses.json b/src/generated/resources/data/twilightforest/tags/entity_types/bosses.json new file mode 100644 index 0000000000..3d2a0ad0cd --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/entity_types/bosses.json @@ -0,0 +1,13 @@ +{ + "values": [ + "twilightforest:naga", + "twilightforest:lich", + "twilightforest:minoshroom", + "twilightforest:hydra", + "twilightforest:knight_phantom", + "twilightforest:ur_ghast", + "twilightforest:alpha_yeti", + "twilightforest:snow_queen", + "twilightforest:plateau_boss" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/entity_types/dont_kill_bugs.json b/src/generated/resources/data/twilightforest/tags/entity_types/dont_kill_bugs.json new file mode 100644 index 0000000000..0cf4bacba3 --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/entity_types/dont_kill_bugs.json @@ -0,0 +1,5 @@ +{ + "values": [ + "twilightforest:moonworm_shot" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/entity_types/lich_poppables.json b/src/generated/resources/data/twilightforest/tags/entity_types/lich_poppables.json new file mode 100644 index 0000000000..5133dbfdeb --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/entity_types/lich_poppables.json @@ -0,0 +1,10 @@ +{ + "values": [ + "#minecraft:skeletons", + "minecraft:zombie", + "minecraft:enderman", + "minecraft:spider", + "minecraft:creeper", + "twilightforest:swarm_spider" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/entity_types/lifedrain_drops_no_flesh.json b/src/generated/resources/data/twilightforest/tags/entity_types/lifedrain_drops_no_flesh.json new file mode 100644 index 0000000000..5cd0a68900 --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/entity_types/lifedrain_drops_no_flesh.json @@ -0,0 +1,24 @@ +{ + "values": [ + "#minecraft:skeletons", + "#minecraft:frog_food", + "minecraft:blaze", + "minecraft:iron_golem", + "minecraft:phantom", + "minecraft:shulker", + "minecraft:skeleton_horse", + "minecraft:snow_golem", + "minecraft:vex", + "minecraft:wither", + "twilightforest:carminite_golem", + "twilightforest:death_tome", + "twilightforest:ice_crystal", + "twilightforest:knight_phantom", + "twilightforest:lich", + "twilightforest:mosquito_swarm", + "twilightforest:snow_guardian", + "twilightforest:stable_ice_core", + "twilightforest:unstable_ice_core", + "twilightforest:wraith" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/entity_types/rides_obstruct_snatching.json b/src/generated/resources/data/twilightforest/tags/entity_types/rides_obstruct_snatching.json new file mode 100644 index 0000000000..71067ac92a --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/entity_types/rides_obstruct_snatching.json @@ -0,0 +1,7 @@ +{ + "values": [ + "twilightforest:pinch_beetle", + "twilightforest:yeti", + "twilightforest:alpha_yeti" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/entity_types/sortable_entities.json b/src/generated/resources/data/twilightforest/tags/entity_types/sortable_entities.json new file mode 100644 index 0000000000..376a6bc664 --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/entity_types/sortable_entities.json @@ -0,0 +1,10 @@ +{ + "values": [ + "minecraft:chest_minecart", + "minecraft:hopper_minecart", + "minecraft:llama", + "minecraft:trader_llama", + "minecraft:donkey", + "minecraft:mule" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/fluids/fire_jet_fuel.json b/src/generated/resources/data/twilightforest/tags/fluids/fire_jet_fuel.json new file mode 100644 index 0000000000..535a26e5df --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/fluids/fire_jet_fuel.json @@ -0,0 +1,5 @@ +{ + "values": [ + "#minecraft:lava" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/items/arctic_fur.json b/src/generated/resources/data/twilightforest/tags/items/arctic_fur.json new file mode 100644 index 0000000000..44e6b7cb21 --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/items/arctic_fur.json @@ -0,0 +1,5 @@ +{ + "values": [ + "twilightforest:arctic_fur" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/items/banned_uncraftables.json b/src/generated/resources/data/twilightforest/tags/items/banned_uncraftables.json new file mode 100644 index 0000000000..d29e55379f --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/items/banned_uncraftables.json @@ -0,0 +1,5 @@ +{ + "values": [ + "twilightforest:giant_log" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/items/banned_uncrafting_ingredients.json b/src/generated/resources/data/twilightforest/tags/items/banned_uncrafting_ingredients.json new file mode 100644 index 0000000000..4ed370557f --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/items/banned_uncrafting_ingredients.json @@ -0,0 +1,11 @@ +{ + "values": [ + "twilightforest:infested_towerwood", + "twilightforest:hollow_oak_sapling", + "twilightforest:time_sapling", + "twilightforest:transformation_sapling", + "twilightforest:mining_sapling", + "twilightforest:sorting_sapling", + "twilightforest:transformation_powder" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/items/canopy_logs.json b/src/generated/resources/data/twilightforest/tags/items/canopy_logs.json new file mode 100644 index 0000000000..9a2e434635 --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/items/canopy_logs.json @@ -0,0 +1,8 @@ +{ + "values": [ + "twilightforest:canopy_log", + "twilightforest:stripped_canopy_log", + "twilightforest:canopy_wood", + "twilightforest:stripped_canopy_wood" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/items/darkwood_logs.json b/src/generated/resources/data/twilightforest/tags/items/darkwood_logs.json new file mode 100644 index 0000000000..b68c597c15 --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/items/darkwood_logs.json @@ -0,0 +1,8 @@ +{ + "values": [ + "twilightforest:dark_log", + "twilightforest:stripped_dark_log", + "twilightforest:dark_wood", + "twilightforest:stripped_dark_wood" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/items/fiery_vial.json b/src/generated/resources/data/twilightforest/tags/items/fiery_vial.json new file mode 100644 index 0000000000..7944bbfaa3 --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/items/fiery_vial.json @@ -0,0 +1,6 @@ +{ + "values": [ + "twilightforest:fiery_blood", + "twilightforest:fiery_tears" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/items/kept_on_death.json b/src/generated/resources/data/twilightforest/tags/items/kept_on_death.json new file mode 100644 index 0000000000..9f7f493990 --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/items/kept_on_death.json @@ -0,0 +1,7 @@ +{ + "values": [ + "twilightforest:tower_key", + "twilightforest:phantom_helmet", + "twilightforest:phantom_chestplate" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/items/kobold_pacification_breads.json b/src/generated/resources/data/twilightforest/tags/items/kobold_pacification_breads.json new file mode 100644 index 0000000000..7873bb3c3f --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/items/kobold_pacification_breads.json @@ -0,0 +1,5 @@ +{ + "values": [ + "minecraft:bread" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/items/logs.json b/src/generated/resources/data/twilightforest/tags/items/logs.json new file mode 100644 index 0000000000..f9c0aa9a4e --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/items/logs.json @@ -0,0 +1,12 @@ +{ + "values": [ + "#twilightforest:twilight_oak_logs", + "#twilightforest:canopy_logs", + "#twilightforest:mangrove_logs", + "#twilightforest:darkwood_logs", + "#twilightforest:timewood_logs", + "#twilightforest:transwood_logs", + "#twilightforest:mining_logs", + "#twilightforest:sortwood_logs" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/items/mangrove_logs.json b/src/generated/resources/data/twilightforest/tags/items/mangrove_logs.json new file mode 100644 index 0000000000..ab5277c581 --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/items/mangrove_logs.json @@ -0,0 +1,8 @@ +{ + "values": [ + "twilightforest:mangrove_log", + "twilightforest:stripped_mangrove_log", + "twilightforest:mangrove_wood", + "twilightforest:stripped_mangrove_wood" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/items/mining_logs.json b/src/generated/resources/data/twilightforest/tags/items/mining_logs.json new file mode 100644 index 0000000000..be1c2c17a2 --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/items/mining_logs.json @@ -0,0 +1,8 @@ +{ + "values": [ + "twilightforest:mining_log", + "twilightforest:stripped_mining_log", + "twilightforest:mining_wood", + "twilightforest:stripped_mining_wood" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/items/nyi.json b/src/generated/resources/data/twilightforest/tags/items/nyi.json new file mode 100644 index 0000000000..ef2fbf7ad1 --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/items/nyi.json @@ -0,0 +1,15 @@ +{ + "values": [ + "twilightforest:cinder_furnace", + "twilightforest:cinder_log", + "twilightforest:cinder_wood", + "twilightforest:twilight_portal_miniature_structure", + "twilightforest:naga_courtyard_miniature_structure", + "twilightforest:lich_tower_miniature_structure", + "twilightforest:auroralized_glass", + "twilightforest:slider", + "twilightforest:twisted_stone", + "twilightforest:twisted_stone_pillar", + "twilightforest:ore_meter" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/items/portal/activator.json b/src/generated/resources/data/twilightforest/tags/items/portal/activator.json new file mode 100644 index 0000000000..0486e21f8c --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/items/portal/activator.json @@ -0,0 +1,5 @@ +{ + "values": [ + "#forge:gems/diamond" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/items/sortwood_logs.json b/src/generated/resources/data/twilightforest/tags/items/sortwood_logs.json new file mode 100644 index 0000000000..1b56ac411a --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/items/sortwood_logs.json @@ -0,0 +1,8 @@ +{ + "values": [ + "twilightforest:sorting_log", + "twilightforest:stripped_sorting_log", + "twilightforest:sorting_wood", + "twilightforest:stripped_sorting_wood" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/items/timewood_logs.json b/src/generated/resources/data/twilightforest/tags/items/timewood_logs.json new file mode 100644 index 0000000000..71508ac39d --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/items/timewood_logs.json @@ -0,0 +1,8 @@ +{ + "values": [ + "twilightforest:time_log", + "twilightforest:stripped_time_log", + "twilightforest:time_wood", + "twilightforest:stripped_time_wood" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/items/towerwood.json b/src/generated/resources/data/twilightforest/tags/items/towerwood.json new file mode 100644 index 0000000000..222c6de7c6 --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/items/towerwood.json @@ -0,0 +1,8 @@ +{ + "values": [ + "twilightforest:towerwood", + "twilightforest:mossy_towerwood", + "twilightforest:cracked_towerwood", + "twilightforest:infested_towerwood" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/items/transwood_logs.json b/src/generated/resources/data/twilightforest/tags/items/transwood_logs.json new file mode 100644 index 0000000000..bc75641e55 --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/items/transwood_logs.json @@ -0,0 +1,8 @@ +{ + "values": [ + "twilightforest:transformation_log", + "twilightforest:stripped_transformation_log", + "twilightforest:transformation_wood", + "twilightforest:stripped_transformation_wood" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/items/twilight_oak_logs.json b/src/generated/resources/data/twilightforest/tags/items/twilight_oak_logs.json new file mode 100644 index 0000000000..0f68c3c3e6 --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/items/twilight_oak_logs.json @@ -0,0 +1,8 @@ +{ + "values": [ + "twilightforest:twilight_oak_log", + "twilightforest:stripped_twilight_oak_log", + "twilightforest:twilight_oak_wood", + "twilightforest:stripped_twilight_oak_wood" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/items/uncrafting_ignores_cost.json b/src/generated/resources/data/twilightforest/tags/items/uncrafting_ignores_cost.json new file mode 100644 index 0000000000..85786de95f --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/items/uncrafting_ignores_cost.json @@ -0,0 +1,5 @@ +{ + "values": [ + "#forge:rods/wooden" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/items/wip.json b/src/generated/resources/data/twilightforest/tags/items/wip.json new file mode 100644 index 0000000000..f55bc2e66a --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/items/wip.json @@ -0,0 +1,9 @@ +{ + "values": [ + "twilightforest:keepsake_casket", + "twilightforest:candelabra", + "twilightforest:brittle_potion_flask", + "twilightforest:greater_potion_flask", + "twilightforest:cube_of_annihilation" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/twilight/wood_palettes/common.json b/src/generated/resources/data/twilightforest/tags/twilight/wood_palettes/common.json new file mode 100644 index 0000000000..b100fc541c --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/twilight/wood_palettes/common.json @@ -0,0 +1,6 @@ +{ + "values": [ + "minecraft:spruce", + "twilightforest:canopy" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/twilight/wood_palettes/druid_hut_swizzle_mask.json b/src/generated/resources/data/twilightforest/tags/twilight/wood_palettes/druid_hut_swizzle_mask.json new file mode 100644 index 0000000000..2ff72a5c44 --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/twilight/wood_palettes/druid_hut_swizzle_mask.json @@ -0,0 +1,7 @@ +{ + "values": [ + "minecraft:oak", + "minecraft:spruce", + "minecraft:birch" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/twilight/wood_palettes/rare.json b/src/generated/resources/data/twilightforest/tags/twilight/wood_palettes/rare.json new file mode 100644 index 0000000000..972894432a --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/twilight/wood_palettes/rare.json @@ -0,0 +1,7 @@ +{ + "values": [ + "minecraft:birch", + "minecraft:jungle", + "twilightforest:mangrove" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/twilight/wood_palettes/treasure.json b/src/generated/resources/data/twilightforest/tags/twilight/wood_palettes/treasure.json new file mode 100644 index 0000000000..b60c9c8f81 --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/twilight/wood_palettes/treasure.json @@ -0,0 +1,8 @@ +{ + "values": [ + "twilightforest:timewood", + "twilightforest:transwood", + "twilightforest:minewood", + "twilightforest:sortwood" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/twilight/wood_palettes/uncommon.json b/src/generated/resources/data/twilightforest/tags/twilight/wood_palettes/uncommon.json new file mode 100644 index 0000000000..df51cebcf3 --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/twilight/wood_palettes/uncommon.json @@ -0,0 +1,7 @@ +{ + "values": [ + "minecraft:oak", + "twilightforest:darkwood", + "twilightforest:twilight_oak" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/twilight/wood_palettes/well_swizzle_mask.json b/src/generated/resources/data/twilightforest/tags/twilight/wood_palettes/well_swizzle_mask.json new file mode 100644 index 0000000000..100b7c07c8 --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/twilight/wood_palettes/well_swizzle_mask.json @@ -0,0 +1,5 @@ +{ + "values": [ + "minecraft:oak" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/worldgen/biome/in_twilight_forest.json b/src/generated/resources/data/twilightforest/tags/worldgen/biome/in_twilight_forest.json new file mode 100644 index 0000000000..d547488349 --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/worldgen/biome/in_twilight_forest.json @@ -0,0 +1,26 @@ +{ + "values": [ + "twilightforest:clearing", + "twilightforest:dense_forest", + "twilightforest:dense_mushroom_forest", + "twilightforest:firefly_forest", + "twilightforest:forest", + "twilightforest:mushroom_forest", + "twilightforest:oak_savannah", + "twilightforest:spooky_forest", + "twilightforest:enchanted_forest", + "twilightforest:dense_mushroom_forest", + "twilightforest:lake", + "twilightforest:stream", + "twilightforest:underground", + "twilightforest:swamp", + "twilightforest:fire_swamp", + "twilightforest:dark_forest", + "twilightforest:dark_forest_center", + "twilightforest:snowy_forest", + "twilightforest:glacier", + "twilightforest:highlands", + "twilightforest:thornlands", + "twilightforest:final_plateau" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/worldgen/biome/valid_aurora_palace_biomes.json b/src/generated/resources/data/twilightforest/tags/worldgen/biome/valid_aurora_palace_biomes.json new file mode 100644 index 0000000000..89c59e9393 --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/worldgen/biome/valid_aurora_palace_biomes.json @@ -0,0 +1,5 @@ +{ + "values": [ + "twilightforest:glacier" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/worldgen/biome/valid_dark_tower_biomes.json b/src/generated/resources/data/twilightforest/tags/worldgen/biome/valid_dark_tower_biomes.json new file mode 100644 index 0000000000..c66faee359 --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/worldgen/biome/valid_dark_tower_biomes.json @@ -0,0 +1,5 @@ +{ + "values": [ + "twilightforest:dark_forest_center" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/worldgen/biome/valid_final_castle_biomes.json b/src/generated/resources/data/twilightforest/tags/worldgen/biome/valid_final_castle_biomes.json new file mode 100644 index 0000000000..d3ab8d9850 --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/worldgen/biome/valid_final_castle_biomes.json @@ -0,0 +1,5 @@ +{ + "values": [ + "twilightforest:final_plateau" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/worldgen/biome/valid_hedge_maze_biomes.json b/src/generated/resources/data/twilightforest/tags/worldgen/biome/valid_hedge_maze_biomes.json new file mode 100644 index 0000000000..e08fb6a545 --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/worldgen/biome/valid_hedge_maze_biomes.json @@ -0,0 +1,12 @@ +{ + "values": [ + "twilightforest:clearing", + "twilightforest:dense_forest", + "twilightforest:dense_mushroom_forest", + "twilightforest:firefly_forest", + "twilightforest:forest", + "twilightforest:mushroom_forest", + "twilightforest:oak_savannah", + "twilightforest:spooky_forest" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/worldgen/biome/valid_hollow_hill_biomes.json b/src/generated/resources/data/twilightforest/tags/worldgen/biome/valid_hollow_hill_biomes.json new file mode 100644 index 0000000000..e08fb6a545 --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/worldgen/biome/valid_hollow_hill_biomes.json @@ -0,0 +1,12 @@ +{ + "values": [ + "twilightforest:clearing", + "twilightforest:dense_forest", + "twilightforest:dense_mushroom_forest", + "twilightforest:firefly_forest", + "twilightforest:forest", + "twilightforest:mushroom_forest", + "twilightforest:oak_savannah", + "twilightforest:spooky_forest" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/worldgen/biome/valid_hydra_lair_biomes.json b/src/generated/resources/data/twilightforest/tags/worldgen/biome/valid_hydra_lair_biomes.json new file mode 100644 index 0000000000..dd411e9504 --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/worldgen/biome/valid_hydra_lair_biomes.json @@ -0,0 +1,5 @@ +{ + "values": [ + "twilightforest:fire_swamp" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/worldgen/biome/valid_knight_stronghold_biomes.json b/src/generated/resources/data/twilightforest/tags/worldgen/biome/valid_knight_stronghold_biomes.json new file mode 100644 index 0000000000..9ae4e84c58 --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/worldgen/biome/valid_knight_stronghold_biomes.json @@ -0,0 +1,5 @@ +{ + "values": [ + "twilightforest:dark_forest" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/worldgen/biome/valid_labyrinth_biomes.json b/src/generated/resources/data/twilightforest/tags/worldgen/biome/valid_labyrinth_biomes.json new file mode 100644 index 0000000000..7f90c778a9 --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/worldgen/biome/valid_labyrinth_biomes.json @@ -0,0 +1,5 @@ +{ + "values": [ + "twilightforest:swamp" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/worldgen/biome/valid_lich_tower_biomes.json b/src/generated/resources/data/twilightforest/tags/worldgen/biome/valid_lich_tower_biomes.json new file mode 100644 index 0000000000..e08fb6a545 --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/worldgen/biome/valid_lich_tower_biomes.json @@ -0,0 +1,12 @@ +{ + "values": [ + "twilightforest:clearing", + "twilightforest:dense_forest", + "twilightforest:dense_mushroom_forest", + "twilightforest:firefly_forest", + "twilightforest:forest", + "twilightforest:mushroom_forest", + "twilightforest:oak_savannah", + "twilightforest:spooky_forest" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/worldgen/biome/valid_mushroom_tower_biomes.json b/src/generated/resources/data/twilightforest/tags/worldgen/biome/valid_mushroom_tower_biomes.json new file mode 100644 index 0000000000..2fc2466c00 --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/worldgen/biome/valid_mushroom_tower_biomes.json @@ -0,0 +1,5 @@ +{ + "values": [ + "twilightforest:dense_mushroom_forest" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/worldgen/biome/valid_naga_courtyard_biomes.json b/src/generated/resources/data/twilightforest/tags/worldgen/biome/valid_naga_courtyard_biomes.json new file mode 100644 index 0000000000..e08fb6a545 --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/worldgen/biome/valid_naga_courtyard_biomes.json @@ -0,0 +1,12 @@ +{ + "values": [ + "twilightforest:clearing", + "twilightforest:dense_forest", + "twilightforest:dense_mushroom_forest", + "twilightforest:firefly_forest", + "twilightforest:forest", + "twilightforest:mushroom_forest", + "twilightforest:oak_savannah", + "twilightforest:spooky_forest" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/worldgen/biome/valid_quest_grove_biomes.json b/src/generated/resources/data/twilightforest/tags/worldgen/biome/valid_quest_grove_biomes.json new file mode 100644 index 0000000000..87988d433b --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/worldgen/biome/valid_quest_grove_biomes.json @@ -0,0 +1,5 @@ +{ + "values": [ + "twilightforest:enchanted_forest" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/worldgen/biome/valid_troll_cave_biomes.json b/src/generated/resources/data/twilightforest/tags/worldgen/biome/valid_troll_cave_biomes.json new file mode 100644 index 0000000000..ec3d389675 --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/worldgen/biome/valid_troll_cave_biomes.json @@ -0,0 +1,5 @@ +{ + "values": [ + "twilightforest:highlands" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/worldgen/biome/valid_yeti_cave_biomes.json b/src/generated/resources/data/twilightforest/tags/worldgen/biome/valid_yeti_cave_biomes.json new file mode 100644 index 0000000000..61a5d83b50 --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/worldgen/biome/valid_yeti_cave_biomes.json @@ -0,0 +1,5 @@ +{ + "values": [ + "twilightforest:snowy_forest" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/tags/worldgen/structure/landmark.json b/src/generated/resources/data/twilightforest/tags/worldgen/structure/landmark.json new file mode 100644 index 0000000000..f634454e42 --- /dev/null +++ b/src/generated/resources/data/twilightforest/tags/worldgen/structure/landmark.json @@ -0,0 +1,20 @@ +{ + "values": [ + "twilightforest:hedge_maze", + "twilightforest:quest_grove", + "twilightforest:mushroom_tower", + "twilightforest:small_hollow_hill", + "twilightforest:medium_hollow_hill", + "twilightforest:large_hollow_hill", + "twilightforest:naga_courtyard", + "twilightforest:lich_tower", + "twilightforest:labyrinth", + "twilightforest:hydra_lair", + "twilightforest:knight_stronghold", + "twilightforest:dark_tower", + "twilightforest:yeti_cave", + "twilightforest:aurora_palace", + "twilightforest:troll_cave", + "twilightforest:final_castle" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/twilight/biome_layer_stack/biomes_along_streams.json b/src/generated/resources/data/twilightforest/twilight/biome_layer_stack/biomes_along_streams.json new file mode 100644 index 0000000000..c20325f551 --- /dev/null +++ b/src/generated/resources/data/twilightforest/twilight/biome_layer_stack/biomes_along_streams.json @@ -0,0 +1,44 @@ +{ + "fallback_layer": "twilightforest:random_forest_biomes", + "filtered_layer": { + "parent": { + "parent": "twilightforest:random_forest_biomes", + "dividing_biome": "twilightforest:stream", + "excluded_biome_intersections": [ + [ + "twilightforest:snowy_forest", + "twilightforest:glacier" + ], + [ + "twilightforest:mushroom_forest", + "twilightforest:dense_mushroom_forest" + ], + [ + "twilightforest:swamp", + "twilightforest:fire_swamp" + ], + [ + "twilightforest:dark_forest", + "twilightforest:dark_forest_center" + ], + [ + "twilightforest:highlands", + "twilightforest:final_plateau" + ] + ], + "excluded_neighbor_biomes": [ + "twilightforest:lake", + "twilightforest:thornlands", + "twilightforest:clearing", + "twilightforest:oak_savannah" + ], + "layer_type": "twilightforest:seam", + "salt": 1 + }, + "layer_type": "twilightforest:smooth", + "salt": 7000 + }, + "keep_biome": "twilightforest:stream", + "layer_type": "twilightforest:filtered", + "salt": 100 +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/twilight/biome_layer_stack/random_forest_biomes.json b/src/generated/resources/data/twilightforest/twilight/biome_layer_stack/random_forest_biomes.json new file mode 100644 index 0000000000..cd4e2e7bc1 --- /dev/null +++ b/src/generated/resources/data/twilightforest/twilight/biome_layer_stack/random_forest_biomes.json @@ -0,0 +1,91 @@ +{ + "parent": { + "parent": { + "parent": { + "parent": { + "parent": { + "parent": { + "parent": { + "parent": { + "parent": { + "parent": { + "common_biomes": [ + "twilightforest:forest", + "twilightforest:dense_forest", + "twilightforest:mushroom_forest", + "twilightforest:oak_savannah", + "twilightforest:firefly_forest" + ], + "layer_type": "twilightforest:random_biomes", + "rare_biome_chance": 15, + "rare_biomes": [ + "twilightforest:lake", + "twilightforest:dense_mushroom_forest", + "twilightforest:enchanted_forest", + "twilightforest:clearing", + "twilightforest:spooky_forest" + ], + "salt": 1 + }, + "key_biomes": [ + "twilightforest:glacier", + "twilightforest:fire_swamp", + "twilightforest:dark_forest_center", + "twilightforest:final_plateau" + ], + "layer_type": "twilightforest:key_biomes", + "salt": 1000 + }, + "keys_to_companions": [ + { + "companion": "twilightforest:swamp", + "key": "twilightforest:fire_swamp" + }, + { + "companion": "twilightforest:snowy_forest", + "key": "twilightforest:glacier" + }, + { + "companion": "twilightforest:dark_forest", + "key": "twilightforest:dark_forest_center" + }, + { + "companion": "twilightforest:highlands", + "key": "twilightforest:final_plateau" + } + ], + "layer_type": "twilightforest:companion_biomes", + "salt": 1000 + }, + "fuzzy": false, + "layer_type": "twilightforest:zoom", + "salt": 1000 + }, + "fuzzy": false, + "layer_type": "twilightforest:zoom", + "salt": 1001 + }, + "layer_type": "twilightforest:stabilize", + "salt": 700 + }, + "bordering_biome": "twilightforest:thornlands", + "layer_type": "twilightforest:border", + "salt": 500, + "target_biome": "twilightforest:final_plateau" + }, + "fuzzy": false, + "layer_type": "twilightforest:zoom", + "salt": 1002 + }, + "fuzzy": false, + "layer_type": "twilightforest:zoom", + "salt": 1003 + }, + "fuzzy": false, + "layer_type": "twilightforest:zoom", + "salt": 1004 + }, + "fuzzy": false, + "layer_type": "twilightforest:zoom", + "salt": 1005 +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/twilight/wood_palettes/canopy.json b/src/generated/resources/data/twilightforest/twilight/wood_palettes/canopy.json new file mode 100644 index 0000000000..2474f8c2f5 --- /dev/null +++ b/src/generated/resources/data/twilightforest/twilight/wood_palettes/canopy.json @@ -0,0 +1,10 @@ +{ + "banister": "twilightforest:canopy_banister", + "button": "twilightforest:canopy_button", + "fence": "twilightforest:canopy_fence", + "gate": "twilightforest:canopy_fence_gate", + "planks": "twilightforest:canopy_planks", + "plate": "twilightforest:canopy_pressure_plate", + "slab": "twilightforest:canopy_slab", + "stairs": "twilightforest:canopy_stairs" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/twilight/wood_palettes/darkwood.json b/src/generated/resources/data/twilightforest/twilight/wood_palettes/darkwood.json new file mode 100644 index 0000000000..5105015fbf --- /dev/null +++ b/src/generated/resources/data/twilightforest/twilight/wood_palettes/darkwood.json @@ -0,0 +1,10 @@ +{ + "banister": "twilightforest:dark_banister", + "button": "twilightforest:dark_button", + "fence": "twilightforest:dark_fence", + "gate": "twilightforest:dark_fence_gate", + "planks": "twilightforest:dark_planks", + "plate": "twilightforest:dark_pressure_plate", + "slab": "twilightforest:dark_slab", + "stairs": "twilightforest:dark_stairs" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/twilight/wood_palettes/mangrove.json b/src/generated/resources/data/twilightforest/twilight/wood_palettes/mangrove.json new file mode 100644 index 0000000000..a2ca43fc75 --- /dev/null +++ b/src/generated/resources/data/twilightforest/twilight/wood_palettes/mangrove.json @@ -0,0 +1,10 @@ +{ + "banister": "twilightforest:mangrove_banister", + "button": "twilightforest:mangrove_button", + "fence": "twilightforest:mangrove_fence", + "gate": "twilightforest:mangrove_fence_gate", + "planks": "twilightforest:mangrove_planks", + "plate": "twilightforest:mangrove_pressure_plate", + "slab": "twilightforest:mangrove_slab", + "stairs": "twilightforest:mangrove_stairs" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/twilight/wood_palettes/minewood.json b/src/generated/resources/data/twilightforest/twilight/wood_palettes/minewood.json new file mode 100644 index 0000000000..5b5b9b379e --- /dev/null +++ b/src/generated/resources/data/twilightforest/twilight/wood_palettes/minewood.json @@ -0,0 +1,10 @@ +{ + "banister": "twilightforest:mining_banister", + "button": "twilightforest:mining_button", + "fence": "twilightforest:mining_fence", + "gate": "twilightforest:mining_fence_gate", + "planks": "twilightforest:mining_planks", + "plate": "twilightforest:mining_pressure_plate", + "slab": "twilightforest:mining_slab", + "stairs": "twilightforest:mining_stairs" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/twilight/wood_palettes/sortwood.json b/src/generated/resources/data/twilightforest/twilight/wood_palettes/sortwood.json new file mode 100644 index 0000000000..3c4bee472c --- /dev/null +++ b/src/generated/resources/data/twilightforest/twilight/wood_palettes/sortwood.json @@ -0,0 +1,10 @@ +{ + "banister": "twilightforest:sorting_banister", + "button": "twilightforest:sorting_button", + "fence": "twilightforest:sorting_fence", + "gate": "twilightforest:sorting_fence_gate", + "planks": "twilightforest:sorting_planks", + "plate": "twilightforest:sorting_pressure_plate", + "slab": "twilightforest:sorting_slab", + "stairs": "twilightforest:sorting_stairs" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/twilight/wood_palettes/timewood.json b/src/generated/resources/data/twilightforest/twilight/wood_palettes/timewood.json new file mode 100644 index 0000000000..396307f77f --- /dev/null +++ b/src/generated/resources/data/twilightforest/twilight/wood_palettes/timewood.json @@ -0,0 +1,10 @@ +{ + "banister": "twilightforest:time_banister", + "button": "twilightforest:time_button", + "fence": "twilightforest:time_fence", + "gate": "twilightforest:time_fence_gate", + "planks": "twilightforest:time_planks", + "plate": "twilightforest:time_pressure_plate", + "slab": "twilightforest:time_slab", + "stairs": "twilightforest:time_stairs" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/twilight/wood_palettes/transwood.json b/src/generated/resources/data/twilightforest/twilight/wood_palettes/transwood.json new file mode 100644 index 0000000000..6086fcce7e --- /dev/null +++ b/src/generated/resources/data/twilightforest/twilight/wood_palettes/transwood.json @@ -0,0 +1,10 @@ +{ + "banister": "twilightforest:transformation_banister", + "button": "twilightforest:transformation_button", + "fence": "twilightforest:transformation_fence", + "gate": "twilightforest:transformation_fence_gate", + "planks": "twilightforest:transformation_planks", + "plate": "twilightforest:transformation_pressure_plate", + "slab": "twilightforest:transformation_slab", + "stairs": "twilightforest:transformation_stairs" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/twilight/wood_palettes/twilight_oak.json b/src/generated/resources/data/twilightforest/twilight/wood_palettes/twilight_oak.json new file mode 100644 index 0000000000..9edcec278b --- /dev/null +++ b/src/generated/resources/data/twilightforest/twilight/wood_palettes/twilight_oak.json @@ -0,0 +1,10 @@ +{ + "banister": "twilightforest:twilight_oak_banister", + "button": "twilightforest:twilight_oak_button", + "fence": "twilightforest:twilight_oak_fence", + "gate": "twilightforest:twilight_oak_fence_gate", + "planks": "twilightforest:twilight_oak_planks", + "plate": "twilightforest:twilight_oak_pressure_plate", + "slab": "twilightforest:twilight_oak_slab", + "stairs": "twilightforest:twilight_oak_stairs" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/biome/clearing.json b/src/generated/resources/data/twilightforest/worldgen/biome/clearing.json new file mode 100644 index 0000000000..fc5720eae0 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/biome/clearing.json @@ -0,0 +1,146 @@ +{ + "carvers": { + "air": "twilightforest:tf_caves" + }, + "downfall": 0.4, + "effects": { + "fog_color": 12648408, + "mood_sound": { + "block_search_extent": 8, + "offset": 2.0, + "sound": "minecraft:ambient.cave", + "tick_delay": 6000 + }, + "music": { + "max_delay": 12000, + "min_delay": 1200, + "replace_current_music": true, + "sound": "twilightforest:music.twilightforest.twilight_forest" + }, + "sky_color": 2105930, + "water_color": 4159204, + "water_fog_color": 329011 + }, + "features": [ + [], + [], + [], + [], + [ + "twilightforest:druid_hut", + "twilightforest:well_placer" + ], + [], + [ + "minecraft:disk_sand", + "minecraft:disk_clay", + "minecraft:disk_gravel", + "twilightforest:wood_roots", + "twilightforest:legacy_coal_ore", + "twilightforest:legacy_iron_ore", + "twilightforest:legacy_gold_ore", + "twilightforest:legacy_redstone_ore", + "twilightforest:legacy_diamond_ore", + "twilightforest:legacy_lapis_ore", + "twilightforest:legacy_copper_ore", + "twilightforest:small_andesite", + "twilightforest:small_diorite", + "twilightforest:small_granite" + ], + [ + "twilightforest:plant_roots", + "twilightforest:torch_berries", + "twilightforest:vanilla_roots" + ], + [], + [ + "minecraft:patch_grass_forest", + "minecraft:patch_tall_grass", + "minecraft:patch_grass_badlands", + "minecraft:patch_grass_savanna", + "minecraft:patch_sugar_cane", + "twilightforest:mayapple", + "twilightforest:flower_placer", + "twilightforest:grove_ruins", + "twilightforest:foundation", + "twilightforest:stone_circle", + "twilightforest:outside_stalagmite", + "twilightforest:monolith", + "twilightforest:hollow_stump", + "twilightforest:hollow_log", + "minecraft:flower_forest_flowers", + "twilightforest:default_fallen_logs" + ], + [ + "minecraft:freeze_top_layer" + ] + ], + "has_precipitation": true, + "spawn_costs": {}, + "spawners": { + "ambient": [], + "axolotls": [], + "creature": [ + { + "type": "twilightforest:bighorn_sheep", + "maxCount": 4, + "minCount": 4, + "weight": 12 + }, + { + "type": "twilightforest:boar", + "maxCount": 4, + "minCount": 4, + "weight": 10 + }, + { + "type": "minecraft:chicken", + "maxCount": 4, + "minCount": 4, + "weight": 10 + }, + { + "type": "twilightforest:deer", + "maxCount": 5, + "minCount": 4, + "weight": 15 + }, + { + "type": "minecraft:wolf", + "maxCount": 4, + "minCount": 4, + "weight": 5 + }, + { + "type": "twilightforest:tiny_bird", + "maxCount": 8, + "minCount": 4, + "weight": 15 + }, + { + "type": "twilightforest:squirrel", + "maxCount": 4, + "minCount": 2, + "weight": 10 + }, + { + "type": "twilightforest:dwarf_rabbit", + "maxCount": 5, + "minCount": 4, + "weight": 10 + }, + { + "type": "twilightforest:raven", + "maxCount": 2, + "minCount": 1, + "weight": 10 + } + ], + "misc": [], + "monster": [], + "underground_water_creature": [], + "water_ambient": [], + "water_creature": [] + }, + "temperature": 0.8 +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/biome/dark_forest.json b/src/generated/resources/data/twilightforest/worldgen/biome/dark_forest.json new file mode 100644 index 0000000000..9d9ca72b66 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/biome/dark_forest.json @@ -0,0 +1,159 @@ +{ + "carvers": { + "air": "twilightforest:tf_caves" + }, + "creature_spawn_probability": 0.05, + "downfall": 0.8, + "effects": { + "fog_color": 0, + "foliage_color": 3890751, + "grass_color": 4941652, + "grass_color_modifier": "twilightforest:dark_forest", + "mood_sound": { + "block_search_extent": 8, + "offset": 2.0, + "sound": "minecraft:ambient.cave", + "tick_delay": 6000 + }, + "music": { + "max_delay": 12000, + "min_delay": 1200, + "replace_current_music": true, + "sound": "twilightforest:music.twilightforest.twilight_forest" + }, + "sky_color": 0, + "water_color": 4159204, + "water_fog_color": 329011 + }, + "features": [ + [], + [], + [], + [], + [], + [], + [ + "twilightforest:legacy_coal_ore", + "twilightforest:legacy_iron_ore", + "twilightforest:legacy_gold_ore", + "twilightforest:legacy_redstone_ore", + "twilightforest:legacy_diamond_ore", + "twilightforest:legacy_lapis_ore", + "twilightforest:legacy_copper_ore" + ], + [ + "twilightforest:plant_roots", + "twilightforest:torch_berries", + "twilightforest:vanilla_roots" + ], + [], + [ + "twilightforest:flower_placer", + "minecraft:patch_grass_normal", + "twilightforest:tree/selector/dark_forest_tree_mix", + "twilightforest:tree/selector/dark_forest_trees", + "twilightforest:tree/darkwood_tree", + "twilightforest:dark_grass", + "twilightforest:dark_ferns", + "twilightforest:dark_mushglooms", + "twilightforest:dark_dead_bushes", + "twilightforest:dark_pumpkins", + "twilightforest:dark_mushrooms" + ] + ], + "has_precipitation": true, + "spawn_costs": { + "minecraft:enderman": { + "charge": 0.75, + "energy_budget": 0.15 + }, + "minecraft:skeleton": { + "charge": 0.85, + "energy_budget": 0.15 + }, + "minecraft:witch": { + "charge": 0.75, + "energy_budget": 0.11 + }, + "minecraft:zombie": { + "charge": 0.75, + "energy_budget": 0.15 + }, + "twilightforest:king_spider": { + "charge": 1.0, + "energy_budget": 0.5 + }, + "twilightforest:kobold": { + "charge": 0.7, + "energy_budget": 0.11 + }, + "twilightforest:mist_wolf": { + "charge": 0.5, + "energy_budget": 0.35 + }, + "twilightforest:skeleton_druid": { + "charge": 0.85, + "energy_budget": 0.4 + } + }, + "spawners": { + "ambient": [], + "axolotls": [], + "creature": [], + "misc": [], + "monster": [ + { + "type": "minecraft:enderman", + "maxCount": 2, + "minCount": 1, + "weight": 2 + }, + { + "type": "minecraft:zombie", + "maxCount": 2, + "minCount": 1, + "weight": 5 + }, + { + "type": "minecraft:skeleton", + "maxCount": 2, + "minCount": 1, + "weight": 5 + }, + { + "type": "twilightforest:mist_wolf", + "maxCount": 1, + "minCount": 1, + "weight": 5 + }, + { + "type": "twilightforest:skeleton_druid", + "maxCount": 1, + "minCount": 1, + "weight": 5 + }, + { + "type": "twilightforest:king_spider", + "maxCount": 1, + "minCount": 1, + "weight": 1 + }, + { + "type": "twilightforest:kobold", + "maxCount": 3, + "minCount": 1, + "weight": 10 + }, + { + "type": "minecraft:witch", + "maxCount": 1, + "minCount": 1, + "weight": 2 + } + ], + "underground_water_creature": [], + "water_ambient": [], + "water_creature": [] + }, + "temperature": 0.7 +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/biome/dark_forest_center.json b/src/generated/resources/data/twilightforest/worldgen/biome/dark_forest_center.json new file mode 100644 index 0000000000..da07c75433 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/biome/dark_forest_center.json @@ -0,0 +1,75 @@ +{ + "carvers": { + "air": "twilightforest:tf_caves" + }, + "downfall": 0.5, + "effects": { + "fog_color": 4796416, + "foliage_color": 16351774, + "grass_color": 6714688, + "grass_color_modifier": "twilightforest:dark_forest_center", + "mood_sound": { + "block_search_extent": 8, + "offset": 2.0, + "sound": "minecraft:ambient.cave", + "tick_delay": 6000 + }, + "music": { + "max_delay": 12000, + "min_delay": 1200, + "replace_current_music": true, + "sound": "twilightforest:music.twilightforest.twilight_forest" + }, + "sky_color": 0, + "water_color": 4159204, + "water_fog_color": 329011 + }, + "features": [ + [], + [], + [], + [], + [], + [], + [ + "twilightforest:legacy_coal_ore", + "twilightforest:legacy_iron_ore", + "twilightforest:legacy_gold_ore", + "twilightforest:legacy_redstone_ore", + "twilightforest:legacy_diamond_ore", + "twilightforest:legacy_lapis_ore", + "twilightforest:legacy_copper_ore" + ], + [ + "twilightforest:plant_roots", + "twilightforest:torch_berries", + "twilightforest:vanilla_roots" + ], + [], + [ + "minecraft:patch_grass_normal", + "twilightforest:tree/selector/dark_forest_tree_mix", + "twilightforest:tree/selector/dark_forest_trees", + "twilightforest:tree/darkwood_tree", + "twilightforest:dark_grass", + "twilightforest:dark_ferns", + "twilightforest:dark_mushglooms", + "twilightforest:dark_dead_bushes", + "twilightforest:dark_pumpkins", + "twilightforest:dark_mushrooms" + ] + ], + "has_precipitation": true, + "spawn_costs": {}, + "spawners": { + "ambient": [], + "axolotls": [], + "creature": [], + "misc": [], + "monster": [], + "underground_water_creature": [], + "water_ambient": [], + "water_creature": [] + }, + "temperature": 0.5 +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/biome/dense_forest.json b/src/generated/resources/data/twilightforest/worldgen/biome/dense_forest.json new file mode 100644 index 0000000000..97602c7060 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/biome/dense_forest.json @@ -0,0 +1,156 @@ +{ + "carvers": { + "air": "twilightforest:tf_caves" + }, + "downfall": 0.8, + "effects": { + "fog_color": 12648408, + "mood_sound": { + "block_search_extent": 8, + "offset": 2.0, + "sound": "minecraft:ambient.cave", + "tick_delay": 6000 + }, + "music": { + "max_delay": 12000, + "min_delay": 1200, + "replace_current_music": true, + "sound": "twilightforest:music.twilightforest.twilight_forest" + }, + "particle": { + "options": { + "type": "twilightforest:wandering_firefly" + }, + "probability": 2.5E-4 + }, + "sky_color": 2105930, + "water_color": 21794, + "water_fog_color": 329011 + }, + "features": [ + [], + [], + [], + [], + [ + "twilightforest:druid_hut", + "twilightforest:well_placer" + ], + [], + [ + "minecraft:disk_sand", + "minecraft:disk_clay", + "minecraft:disk_gravel", + "twilightforest:wood_roots", + "twilightforest:legacy_coal_ore", + "twilightforest:legacy_iron_ore", + "twilightforest:legacy_gold_ore", + "twilightforest:legacy_redstone_ore", + "twilightforest:legacy_diamond_ore", + "twilightforest:legacy_lapis_ore", + "twilightforest:legacy_copper_ore", + "twilightforest:small_andesite", + "twilightforest:small_diorite", + "twilightforest:small_granite" + ], + [ + "twilightforest:plant_roots", + "twilightforest:torch_berries", + "twilightforest:vanilla_roots" + ], + [], + [ + "minecraft:patch_grass_forest", + "minecraft:patch_tall_grass", + "minecraft:patch_grass_badlands", + "minecraft:patch_grass_savanna", + "minecraft:patch_sugar_cane", + "twilightforest:tree/hollow_oak", + "twilightforest:mayapple", + "twilightforest:flower_placer_alt", + "twilightforest:grove_ruins", + "twilightforest:foundation", + "twilightforest:stone_circle", + "twilightforest:outside_stalagmite", + "twilightforest:monolith", + "twilightforest:hollow_stump", + "twilightforest:hollow_log", + "twilightforest:tree/selector/dense_canopy_trees", + "twilightforest:tree/selector/vanilla_trees", + "minecraft:jungle_bush", + "twilightforest:default_fallen_logs", + "twilightforest:tree/forest_canopy_oak_tree" + ], + [ + "minecraft:freeze_top_layer" + ] + ], + "has_precipitation": true, + "spawn_costs": {}, + "spawners": { + "ambient": [], + "axolotls": [], + "creature": [ + { + "type": "twilightforest:bighorn_sheep", + "maxCount": 4, + "minCount": 4, + "weight": 12 + }, + { + "type": "twilightforest:boar", + "maxCount": 4, + "minCount": 4, + "weight": 10 + }, + { + "type": "minecraft:chicken", + "maxCount": 4, + "minCount": 4, + "weight": 10 + }, + { + "type": "twilightforest:deer", + "maxCount": 5, + "minCount": 4, + "weight": 15 + }, + { + "type": "minecraft:wolf", + "maxCount": 4, + "minCount": 4, + "weight": 5 + }, + { + "type": "twilightforest:tiny_bird", + "maxCount": 8, + "minCount": 4, + "weight": 15 + }, + { + "type": "twilightforest:squirrel", + "maxCount": 4, + "minCount": 2, + "weight": 10 + }, + { + "type": "twilightforest:dwarf_rabbit", + "maxCount": 5, + "minCount": 4, + "weight": 10 + }, + { + "type": "twilightforest:raven", + "maxCount": 2, + "minCount": 1, + "weight": 10 + } + ], + "misc": [], + "monster": [], + "underground_water_creature": [], + "water_ambient": [], + "water_creature": [] + }, + "temperature": 0.7 +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/biome/dense_mushroom_forest.json b/src/generated/resources/data/twilightforest/worldgen/biome/dense_mushroom_forest.json new file mode 100644 index 0000000000..91544772a6 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/biome/dense_mushroom_forest.json @@ -0,0 +1,164 @@ +{ + "carvers": { + "air": "twilightforest:tf_caves" + }, + "downfall": 1.0, + "effects": { + "fog_color": 12648408, + "mood_sound": { + "block_search_extent": 8, + "offset": 2.0, + "sound": "minecraft:ambient.cave", + "tick_delay": 6000 + }, + "music": { + "max_delay": 12000, + "min_delay": 1200, + "replace_current_music": true, + "sound": "twilightforest:music.twilightforest.twilight_forest" + }, + "particle": { + "options": { + "type": "twilightforest:wandering_firefly" + }, + "probability": 2.5E-4 + }, + "sky_color": 2105930, + "water_color": 4159204, + "water_fog_color": 329011 + }, + "features": [ + [], + [], + [], + [], + [ + "twilightforest:druid_hut", + "twilightforest:well_placer" + ], + [], + [ + "minecraft:disk_sand", + "minecraft:disk_clay", + "minecraft:disk_gravel", + "twilightforest:wood_roots", + "twilightforest:legacy_coal_ore", + "twilightforest:legacy_iron_ore", + "twilightforest:legacy_gold_ore", + "twilightforest:legacy_redstone_ore", + "twilightforest:legacy_diamond_ore", + "twilightforest:legacy_lapis_ore", + "twilightforest:legacy_copper_ore", + "twilightforest:small_andesite", + "twilightforest:small_diorite", + "twilightforest:small_granite" + ], + [ + "twilightforest:plant_roots", + "twilightforest:torch_berries", + "twilightforest:vanilla_roots" + ], + [], + [ + "minecraft:patch_grass_forest", + "minecraft:patch_tall_grass", + "minecraft:patch_grass_badlands", + "minecraft:patch_grass_savanna", + "minecraft:patch_sugar_cane", + "twilightforest:tree/hollow_oak", + "twilightforest:mayapple", + "twilightforest:flower_placer_alt", + "twilightforest:grove_ruins", + "twilightforest:foundation", + "twilightforest:stone_circle", + "twilightforest:outside_stalagmite", + "twilightforest:monolith", + "twilightforest:hollow_stump", + "twilightforest:hollow_log", + "twilightforest:mycelium_blob", + "twilightforest:tree/selector/vanilla_trees", + "twilightforest:tree/twilight_oak_tree", + "twilightforest:tree/large_twilight_oak_tree", + "minecraft:brown_mushroom_normal", + "minecraft:red_mushroom_normal", + "minecraft:brown_mushroom_taiga", + "minecraft:red_mushroom_taiga", + "twilightforest:tree/selector/vanilla_mushrooms", + "twilightforest:mushroom/canopy_mushrooms_dense", + "twilightforest:mushgloom_cluster", + "twilightforest:tree/selector/canopy_trees", + "twilightforest:default_fallen_logs" + ], + [ + "minecraft:freeze_top_layer" + ] + ], + "has_precipitation": true, + "spawn_costs": {}, + "spawners": { + "ambient": [], + "axolotls": [], + "creature": [ + { + "type": "twilightforest:bighorn_sheep", + "maxCount": 4, + "minCount": 4, + "weight": 12 + }, + { + "type": "twilightforest:boar", + "maxCount": 4, + "minCount": 4, + "weight": 10 + }, + { + "type": "minecraft:chicken", + "maxCount": 4, + "minCount": 4, + "weight": 10 + }, + { + "type": "twilightforest:deer", + "maxCount": 5, + "minCount": 4, + "weight": 15 + }, + { + "type": "minecraft:wolf", + "maxCount": 4, + "minCount": 4, + "weight": 5 + }, + { + "type": "twilightforest:tiny_bird", + "maxCount": 8, + "minCount": 4, + "weight": 15 + }, + { + "type": "twilightforest:squirrel", + "maxCount": 4, + "minCount": 2, + "weight": 10 + }, + { + "type": "twilightforest:dwarf_rabbit", + "maxCount": 5, + "minCount": 4, + "weight": 10 + }, + { + "type": "twilightforest:raven", + "maxCount": 2, + "minCount": 1, + "weight": 10 + } + ], + "misc": [], + "monster": [], + "underground_water_creature": [], + "water_ambient": [], + "water_creature": [] + }, + "temperature": 0.8 +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/biome/enchanted_forest.json b/src/generated/resources/data/twilightforest/worldgen/biome/enchanted_forest.json new file mode 100644 index 0000000000..e9855c86b8 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/biome/enchanted_forest.json @@ -0,0 +1,159 @@ +{ + "carvers": { + "air": "twilightforest:tf_caves" + }, + "downfall": 0.5, + "effects": { + "fog_color": 12648408, + "foliage_color": 65535, + "grass_color": 65535, + "grass_color_modifier": "twilightforest:enchanted_forest", + "mood_sound": { + "block_search_extent": 8, + "offset": 2.0, + "sound": "minecraft:ambient.cave", + "tick_delay": 6000 + }, + "music": { + "max_delay": 12000, + "min_delay": 1200, + "replace_current_music": true, + "sound": "twilightforest:music.twilightforest.twilight_forest" + }, + "particle": { + "options": { + "type": "twilightforest:wandering_firefly" + }, + "probability": 2.5E-4 + }, + "sky_color": 2105930, + "water_color": 4159204, + "water_fog_color": 329011 + }, + "features": [ + [], + [], + [], + [], + [ + "twilightforest:druid_hut", + "twilightforest:well_placer" + ], + [], + [ + "minecraft:disk_sand", + "minecraft:disk_clay", + "minecraft:disk_gravel", + "twilightforest:wood_roots", + "twilightforest:legacy_coal_ore", + "twilightforest:legacy_iron_ore", + "twilightforest:legacy_gold_ore", + "twilightforest:legacy_redstone_ore", + "twilightforest:legacy_diamond_ore", + "twilightforest:legacy_lapis_ore", + "twilightforest:legacy_copper_ore", + "twilightforest:small_andesite", + "twilightforest:small_diorite", + "twilightforest:small_granite" + ], + [ + "twilightforest:plant_roots", + "twilightforest:torch_berries", + "twilightforest:vanilla_roots" + ], + [], + [ + "minecraft:patch_grass_forest", + "minecraft:patch_tall_grass", + "minecraft:patch_grass_badlands", + "minecraft:patch_grass_savanna", + "minecraft:patch_sugar_cane", + "twilightforest:tree/hollow_oak", + "twilightforest:mayapple", + "twilightforest:flower_placer", + "twilightforest:grove_ruins", + "twilightforest:foundation", + "twilightforest:stone_circle", + "twilightforest:outside_stalagmite", + "twilightforest:monolith", + "twilightforest:hollow_stump", + "twilightforest:hollow_log", + "twilightforest:tree/selector/enchanted_forest_trees", + "twilightforest:fiddlehead", + "minecraft:vines", + "twilightforest:tree/selector/canopy_trees", + "twilightforest:default_fallen_logs" + ], + [ + "minecraft:freeze_top_layer" + ] + ], + "has_precipitation": false, + "spawn_costs": {}, + "spawners": { + "ambient": [], + "axolotls": [], + "creature": [ + { + "type": "twilightforest:bighorn_sheep", + "maxCount": 4, + "minCount": 4, + "weight": 12 + }, + { + "type": "twilightforest:boar", + "maxCount": 4, + "minCount": 4, + "weight": 10 + }, + { + "type": "minecraft:chicken", + "maxCount": 4, + "minCount": 4, + "weight": 10 + }, + { + "type": "twilightforest:deer", + "maxCount": 5, + "minCount": 4, + "weight": 15 + }, + { + "type": "minecraft:wolf", + "maxCount": 4, + "minCount": 4, + "weight": 5 + }, + { + "type": "twilightforest:tiny_bird", + "maxCount": 8, + "minCount": 4, + "weight": 15 + }, + { + "type": "twilightforest:squirrel", + "maxCount": 4, + "minCount": 2, + "weight": 10 + }, + { + "type": "twilightforest:dwarf_rabbit", + "maxCount": 5, + "minCount": 4, + "weight": 10 + }, + { + "type": "twilightforest:raven", + "maxCount": 2, + "minCount": 1, + "weight": 10 + } + ], + "misc": [], + "monster": [], + "underground_water_creature": [], + "water_ambient": [], + "water_creature": [] + }, + "temperature": 0.5 +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/biome/final_plateau.json b/src/generated/resources/data/twilightforest/worldgen/biome/final_plateau.json new file mode 100644 index 0000000000..be22e435dc --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/biome/final_plateau.json @@ -0,0 +1,44 @@ +{ + "carvers": {}, + "creature_spawn_probability": 0.3, + "downfall": 0.2, + "effects": { + "fog_color": 12648408, + "mood_sound": { + "block_search_extent": 8, + "offset": 2.0, + "sound": "minecraft:ambient.cave", + "tick_delay": 6000 + }, + "music": { + "max_delay": 12000, + "min_delay": 1200, + "replace_current_music": true, + "sound": "twilightforest:music.twilightforest.twilight_forest" + }, + "sky_color": 2105930, + "water_color": 4159204, + "water_fog_color": 329011 + }, + "features": [], + "has_precipitation": true, + "spawn_costs": {}, + "spawners": { + "ambient": [], + "axolotls": [], + "creature": [ + { + "type": "twilightforest:raven", + "maxCount": 4, + "minCount": 4, + "weight": 10 + } + ], + "misc": [], + "monster": [], + "underground_water_creature": [], + "water_ambient": [], + "water_creature": [] + }, + "temperature": 1.0 +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/biome/fire_swamp.json b/src/generated/resources/data/twilightforest/worldgen/biome/fire_swamp.json new file mode 100644 index 0000000000..d4d82803c8 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/biome/fire_swamp.json @@ -0,0 +1,99 @@ +{ + "carvers": { + "air": "twilightforest:tf_caves" + }, + "downfall": 0.4, + "effects": { + "fog_color": 3672576, + "foliage_color": 6563343, + "grass_color": 5713443, + "mood_sound": { + "block_search_extent": 8, + "offset": 2.0, + "sound": "minecraft:ambient.cave", + "tick_delay": 6000 + }, + "music": { + "max_delay": 12000, + "min_delay": 1200, + "replace_current_music": true, + "sound": "twilightforest:music.twilightforest.twilight_forest" + }, + "particle": { + "options": { + "type": "minecraft:white_ash" + }, + "probability": 0.05 + }, + "sky_color": 2105930, + "water_color": 7089196, + "water_fog_color": 329011 + }, + "features": [ + [], + [ + "twilightforest:lava_lake" + ], + [], + [], + [], + [], + [ + "minecraft:disk_sand", + "minecraft:disk_clay", + "minecraft:disk_gravel", + "twilightforest:wood_roots", + "twilightforest:legacy_coal_ore", + "twilightforest:legacy_iron_ore", + "twilightforest:legacy_gold_ore", + "twilightforest:legacy_redstone_ore", + "twilightforest:legacy_diamond_ore", + "twilightforest:legacy_lapis_ore", + "twilightforest:legacy_copper_ore", + "twilightforest:small_andesite", + "twilightforest:small_diorite", + "twilightforest:small_granite" + ], + [ + "twilightforest:plant_roots", + "twilightforest:torch_berries", + "twilightforest:vanilla_roots" + ], + [], + [ + "minecraft:patch_grass_forest", + "minecraft:patch_tall_grass", + "minecraft:patch_grass_badlands", + "minecraft:patch_grass_savanna", + "minecraft:patch_sugar_cane", + "twilightforest:tree/hollow_oak", + "twilightforest:stone_circle", + "twilightforest:outside_stalagmite", + "twilightforest:monolith", + "twilightforest:hollow_stump", + "twilightforest:hollow_log", + "twilightforest:tree/swampy_oak_tree", + "twilightforest:fire_jet", + "twilightforest:smoker", + "minecraft:patch_sugar_cane_swamp", + "minecraft:vines", + "minecraft:brown_mushroom_swamp" + ], + [ + "minecraft:freeze_top_layer" + ] + ], + "has_precipitation": false, + "spawn_costs": {}, + "spawners": { + "ambient": [], + "axolotls": [], + "creature": [], + "misc": [], + "monster": [], + "underground_water_creature": [], + "water_ambient": [], + "water_creature": [] + }, + "temperature": 1.0 +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/biome/firefly_forest.json b/src/generated/resources/data/twilightforest/worldgen/biome/firefly_forest.json new file mode 100644 index 0000000000..e18dbd9be6 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/biome/firefly_forest.json @@ -0,0 +1,160 @@ +{ + "carvers": { + "air": "twilightforest:tf_caves" + }, + "downfall": 1.0, + "effects": { + "fog_color": 12648408, + "mood_sound": { + "block_search_extent": 8, + "offset": 2.0, + "sound": "minecraft:ambient.cave", + "tick_delay": 6000 + }, + "music": { + "max_delay": 12000, + "min_delay": 1200, + "replace_current_music": true, + "sound": "twilightforest:music.twilightforest.twilight_forest" + }, + "particle": { + "options": { + "type": "twilightforest:wandering_firefly" + }, + "probability": 0.001 + }, + "sky_color": 2105930, + "water_color": 4159204, + "water_fog_color": 329011 + }, + "features": [ + [], + [], + [], + [], + [ + "twilightforest:druid_hut", + "twilightforest:well_placer" + ], + [], + [ + "minecraft:disk_sand", + "minecraft:disk_clay", + "minecraft:disk_gravel", + "twilightforest:wood_roots", + "twilightforest:legacy_coal_ore", + "twilightforest:legacy_iron_ore", + "twilightforest:legacy_gold_ore", + "twilightforest:legacy_redstone_ore", + "twilightforest:legacy_diamond_ore", + "twilightforest:legacy_lapis_ore", + "twilightforest:legacy_copper_ore", + "twilightforest:small_andesite", + "twilightforest:small_diorite", + "twilightforest:small_granite" + ], + [ + "twilightforest:plant_roots", + "twilightforest:torch_berries", + "twilightforest:vanilla_roots" + ], + [], + [ + "minecraft:patch_grass_forest", + "minecraft:patch_tall_grass", + "minecraft:patch_grass_badlands", + "minecraft:patch_grass_savanna", + "minecraft:patch_sugar_cane", + "twilightforest:tree/hollow_oak", + "twilightforest:mayapple", + "twilightforest:flower_placer_alt", + "twilightforest:grove_ruins", + "twilightforest:foundation", + "twilightforest:stone_circle", + "twilightforest:outside_stalagmite", + "twilightforest:monolith", + "twilightforest:hollow_stump", + "twilightforest:hollow_log", + "twilightforest:tree/selector/firefly_forest_trees", + "twilightforest:tree/selector/vanilla_trees", + "twilightforest:tree/twilight_oak_tree", + "twilightforest:tree/large_twilight_oak_tree", + "twilightforest:lamppost_placer", + "twilightforest:mushgloom_cluster", + "minecraft:patch_pumpkin", + "minecraft:flower_forest_flowers", + "twilightforest:default_fallen_logs" + ], + [ + "minecraft:freeze_top_layer" + ] + ], + "has_precipitation": true, + "spawn_costs": {}, + "spawners": { + "ambient": [], + "axolotls": [], + "creature": [ + { + "type": "twilightforest:bighorn_sheep", + "maxCount": 4, + "minCount": 4, + "weight": 12 + }, + { + "type": "twilightforest:boar", + "maxCount": 4, + "minCount": 4, + "weight": 10 + }, + { + "type": "minecraft:chicken", + "maxCount": 4, + "minCount": 4, + "weight": 10 + }, + { + "type": "twilightforest:deer", + "maxCount": 5, + "minCount": 4, + "weight": 15 + }, + { + "type": "minecraft:wolf", + "maxCount": 4, + "minCount": 4, + "weight": 5 + }, + { + "type": "twilightforest:tiny_bird", + "maxCount": 8, + "minCount": 4, + "weight": 15 + }, + { + "type": "twilightforest:squirrel", + "maxCount": 4, + "minCount": 2, + "weight": 10 + }, + { + "type": "twilightforest:dwarf_rabbit", + "maxCount": 5, + "minCount": 4, + "weight": 10 + }, + { + "type": "twilightforest:raven", + "maxCount": 2, + "minCount": 1, + "weight": 10 + } + ], + "misc": [], + "monster": [], + "underground_water_creature": [], + "water_ambient": [], + "water_creature": [] + }, + "temperature": 0.5 +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/biome/forest.json b/src/generated/resources/data/twilightforest/worldgen/biome/forest.json new file mode 100644 index 0000000000..ee0f907851 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/biome/forest.json @@ -0,0 +1,156 @@ +{ + "carvers": { + "air": "twilightforest:tf_caves" + }, + "downfall": 0.5, + "effects": { + "fog_color": 12648408, + "mood_sound": { + "block_search_extent": 8, + "offset": 2.0, + "sound": "minecraft:ambient.cave", + "tick_delay": 6000 + }, + "music": { + "max_delay": 12000, + "min_delay": 1200, + "replace_current_music": true, + "sound": "twilightforest:music.twilightforest.twilight_forest" + }, + "particle": { + "options": { + "type": "twilightforest:wandering_firefly" + }, + "probability": 2.5E-4 + }, + "sky_color": 2105930, + "water_color": 4159204, + "water_fog_color": 329011 + }, + "features": [ + [], + [], + [], + [], + [ + "twilightforest:druid_hut", + "twilightforest:well_placer" + ], + [], + [ + "minecraft:disk_sand", + "minecraft:disk_clay", + "minecraft:disk_gravel", + "twilightforest:wood_roots", + "twilightforest:legacy_coal_ore", + "twilightforest:legacy_iron_ore", + "twilightforest:legacy_gold_ore", + "twilightforest:legacy_redstone_ore", + "twilightforest:legacy_diamond_ore", + "twilightforest:legacy_lapis_ore", + "twilightforest:legacy_copper_ore", + "twilightforest:small_andesite", + "twilightforest:small_diorite", + "twilightforest:small_granite" + ], + [ + "twilightforest:plant_roots", + "twilightforest:torch_berries", + "twilightforest:vanilla_roots" + ], + [], + [ + "minecraft:patch_grass_forest", + "minecraft:patch_tall_grass", + "minecraft:patch_grass_badlands", + "minecraft:patch_grass_savanna", + "minecraft:patch_sugar_cane", + "twilightforest:tree/hollow_oak", + "twilightforest:mayapple", + "twilightforest:flower_placer_alt", + "twilightforest:grove_ruins", + "twilightforest:foundation", + "twilightforest:stone_circle", + "twilightforest:outside_stalagmite", + "twilightforest:monolith", + "twilightforest:hollow_stump", + "twilightforest:hollow_log", + "twilightforest:tree/selector/vanilla_trees", + "twilightforest:tree/twilight_oak_tree", + "twilightforest:tree/large_twilight_oak_tree", + "twilightforest:tree/selector/canopy_trees", + "twilightforest:default_fallen_logs" + ], + [ + "minecraft:freeze_top_layer" + ] + ], + "has_precipitation": true, + "spawn_costs": {}, + "spawners": { + "ambient": [], + "axolotls": [], + "creature": [ + { + "type": "twilightforest:bighorn_sheep", + "maxCount": 4, + "minCount": 4, + "weight": 12 + }, + { + "type": "twilightforest:boar", + "maxCount": 4, + "minCount": 4, + "weight": 10 + }, + { + "type": "minecraft:chicken", + "maxCount": 4, + "minCount": 4, + "weight": 10 + }, + { + "type": "twilightforest:deer", + "maxCount": 5, + "minCount": 4, + "weight": 15 + }, + { + "type": "minecraft:wolf", + "maxCount": 4, + "minCount": 4, + "weight": 5 + }, + { + "type": "twilightforest:tiny_bird", + "maxCount": 8, + "minCount": 4, + "weight": 15 + }, + { + "type": "twilightforest:squirrel", + "maxCount": 4, + "minCount": 2, + "weight": 10 + }, + { + "type": "twilightforest:dwarf_rabbit", + "maxCount": 5, + "minCount": 4, + "weight": 10 + }, + { + "type": "twilightforest:raven", + "maxCount": 2, + "minCount": 1, + "weight": 10 + } + ], + "misc": [], + "monster": [], + "underground_water_creature": [], + "water_ambient": [], + "water_creature": [] + }, + "temperature": 0.5 +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/biome/glacier.json b/src/generated/resources/data/twilightforest/worldgen/biome/glacier.json new file mode 100644 index 0000000000..873c942158 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/biome/glacier.json @@ -0,0 +1,72 @@ +{ + "carvers": { + "air": "twilightforest:tf_caves" + }, + "creature_spawn_probability": 0.2, + "downfall": 0.1, + "effects": { + "fog_color": 3547016, + "mood_sound": { + "block_search_extent": 8, + "offset": 2.0, + "sound": "minecraft:ambient.cave", + "tick_delay": 6000 + }, + "music": { + "max_delay": 12000, + "min_delay": 1200, + "replace_current_music": true, + "sound": "twilightforest:music.twilightforest.twilight_forest" + }, + "sky_color": 1248552, + "water_color": 4159204, + "water_fog_color": 329011 + }, + "features": [ + [], + [], + [], + [], + [], + [], + [ + "twilightforest:legacy_coal_ore", + "twilightforest:legacy_iron_ore", + "twilightforest:legacy_gold_ore", + "twilightforest:legacy_redstone_ore", + "twilightforest:legacy_diamond_ore", + "twilightforest:legacy_lapis_ore", + "twilightforest:legacy_copper_ore" + ], + [ + "twilightforest:plant_roots", + "twilightforest:torch_berries", + "twilightforest:vanilla_roots" + ], + [], + [], + [ + "minecraft:freeze_top_layer" + ] + ], + "has_precipitation": true, + "spawn_costs": {}, + "spawners": { + "ambient": [], + "axolotls": [], + "creature": [ + { + "type": "twilightforest:penguin", + "maxCount": 4, + "minCount": 2, + "weight": 10 + } + ], + "misc": [], + "monster": [], + "underground_water_creature": [], + "water_ambient": [], + "water_creature": [] + }, + "temperature": 0.8 +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/biome/highlands.json b/src/generated/resources/data/twilightforest/worldgen/biome/highlands.json new file mode 100644 index 0000000000..fdd59d068b --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/biome/highlands.json @@ -0,0 +1,132 @@ +{ + "carvers": { + "air": "twilightforest:highland_caves" + }, + "downfall": 0.7, + "effects": { + "fog_color": 12648408, + "mood_sound": { + "block_search_extent": 8, + "offset": 2.0, + "sound": "minecraft:ambient.cave", + "tick_delay": 6000 + }, + "music": { + "max_delay": 12000, + "min_delay": 1200, + "replace_current_music": true, + "sound": "twilightforest:music.twilightforest.twilight_forest" + }, + "sky_color": 2105930, + "water_color": 4159204, + "water_fog_color": 329011 + }, + "features": [ + [], + [], + [], + [], + [ + "twilightforest:druid_hut", + "twilightforest:well_placer" + ], + [], + [ + "twilightforest:legacy_coal_ore", + "twilightforest:legacy_iron_ore", + "twilightforest:legacy_gold_ore", + "twilightforest:legacy_redstone_ore", + "twilightforest:legacy_diamond_ore", + "twilightforest:legacy_lapis_ore", + "twilightforest:legacy_copper_ore", + "twilightforest:small_andesite", + "twilightforest:small_diorite", + "twilightforest:small_granite" + ], + [ + "twilightforest:troll_roots" + ], + [], + [ + "twilightforest:grove_ruins", + "twilightforest:foundation", + "twilightforest:stone_circle", + "twilightforest:outside_stalagmite", + "twilightforest:monolith", + "twilightforest:hollow_stump", + "twilightforest:hollow_log", + "twilightforest:tree/selector/highlands_trees", + "minecraft:forest_rock", + "minecraft:patch_grass_taiga", + "twilightforest:spruce_fallen_log" + ] + ], + "has_precipitation": true, + "spawn_costs": {}, + "spawners": { + "ambient": [], + "axolotls": [], + "creature": [ + { + "type": "twilightforest:bighorn_sheep", + "maxCount": 4, + "minCount": 4, + "weight": 12 + }, + { + "type": "twilightforest:boar", + "maxCount": 4, + "minCount": 4, + "weight": 10 + }, + { + "type": "minecraft:chicken", + "maxCount": 4, + "minCount": 4, + "weight": 10 + }, + { + "type": "twilightforest:deer", + "maxCount": 5, + "minCount": 4, + "weight": 15 + }, + { + "type": "minecraft:wolf", + "maxCount": 4, + "minCount": 4, + "weight": 5 + }, + { + "type": "twilightforest:tiny_bird", + "maxCount": 8, + "minCount": 4, + "weight": 15 + }, + { + "type": "twilightforest:squirrel", + "maxCount": 4, + "minCount": 2, + "weight": 10 + }, + { + "type": "twilightforest:dwarf_rabbit", + "maxCount": 5, + "minCount": 4, + "weight": 10 + }, + { + "type": "twilightforest:raven", + "maxCount": 2, + "minCount": 1, + "weight": 10 + } + ], + "misc": [], + "monster": [], + "underground_water_creature": [], + "water_ambient": [], + "water_creature": [] + }, + "temperature": 0.4 +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/biome/lake.json b/src/generated/resources/data/twilightforest/worldgen/biome/lake.json new file mode 100644 index 0000000000..20b5f94cd1 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/biome/lake.json @@ -0,0 +1,119 @@ +{ + "carvers": {}, + "downfall": 1.0, + "effects": { + "fog_color": 12648408, + "mood_sound": { + "block_search_extent": 8, + "offset": 2.0, + "sound": "minecraft:ambient.cave", + "tick_delay": 6000 + }, + "music": { + "max_delay": 12000, + "min_delay": 1200, + "replace_current_music": true, + "sound": "twilightforest:music.twilightforest.twilight_forest" + }, + "sky_color": 2105930, + "water_color": 4159204, + "water_fog_color": 329011 + }, + "features": [ + [], + [], + [], + [], + [], + [], + [ + "twilightforest:legacy_coal_ore", + "twilightforest:legacy_iron_ore", + "twilightforest:legacy_gold_ore", + "twilightforest:legacy_redstone_ore", + "twilightforest:legacy_diamond_ore", + "twilightforest:legacy_lapis_ore", + "twilightforest:legacy_copper_ore", + "twilightforest:small_andesite", + "twilightforest:small_diorite", + "twilightforest:small_granite" + ], + [], + [], + [ + "minecraft:seagrass_deep", + "minecraft:seagrass_simple" + ], + [ + "minecraft:freeze_top_layer" + ] + ], + "has_precipitation": true, + "spawn_costs": {}, + "spawners": { + "ambient": [], + "axolotls": [], + "creature": [ + { + "type": "twilightforest:bighorn_sheep", + "maxCount": 4, + "minCount": 4, + "weight": 12 + }, + { + "type": "twilightforest:boar", + "maxCount": 4, + "minCount": 4, + "weight": 10 + }, + { + "type": "minecraft:chicken", + "maxCount": 4, + "minCount": 4, + "weight": 10 + }, + { + "type": "twilightforest:deer", + "maxCount": 5, + "minCount": 4, + "weight": 15 + }, + { + "type": "minecraft:wolf", + "maxCount": 4, + "minCount": 4, + "weight": 5 + }, + { + "type": "twilightforest:tiny_bird", + "maxCount": 8, + "minCount": 4, + "weight": 15 + }, + { + "type": "twilightforest:squirrel", + "maxCount": 4, + "minCount": 2, + "weight": 10 + }, + { + "type": "twilightforest:dwarf_rabbit", + "maxCount": 5, + "minCount": 4, + "weight": 10 + }, + { + "type": "twilightforest:raven", + "maxCount": 2, + "minCount": 1, + "weight": 10 + } + ], + "misc": [], + "monster": [], + "underground_water_creature": [], + "water_ambient": [], + "water_creature": [] + }, + "temperature": 0.66 +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/biome/mushroom_forest.json b/src/generated/resources/data/twilightforest/worldgen/biome/mushroom_forest.json new file mode 100644 index 0000000000..59935c2b58 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/biome/mushroom_forest.json @@ -0,0 +1,164 @@ +{ + "carvers": { + "air": "twilightforest:tf_caves" + }, + "downfall": 0.8, + "effects": { + "fog_color": 12648408, + "mood_sound": { + "block_search_extent": 8, + "offset": 2.0, + "sound": "minecraft:ambient.cave", + "tick_delay": 6000 + }, + "music": { + "max_delay": 12000, + "min_delay": 1200, + "replace_current_music": true, + "sound": "twilightforest:music.twilightforest.twilight_forest" + }, + "particle": { + "options": { + "type": "twilightforest:wandering_firefly" + }, + "probability": 2.5E-4 + }, + "sky_color": 2105930, + "water_color": 4159204, + "water_fog_color": 329011 + }, + "features": [ + [], + [], + [], + [], + [ + "twilightforest:druid_hut", + "twilightforest:well_placer" + ], + [], + [ + "minecraft:disk_sand", + "minecraft:disk_clay", + "minecraft:disk_gravel", + "twilightforest:wood_roots", + "twilightforest:legacy_coal_ore", + "twilightforest:legacy_iron_ore", + "twilightforest:legacy_gold_ore", + "twilightforest:legacy_redstone_ore", + "twilightforest:legacy_diamond_ore", + "twilightforest:legacy_lapis_ore", + "twilightforest:legacy_copper_ore", + "twilightforest:small_andesite", + "twilightforest:small_diorite", + "twilightforest:small_granite" + ], + [ + "twilightforest:plant_roots", + "twilightforest:torch_berries", + "twilightforest:vanilla_roots" + ], + [], + [ + "minecraft:patch_grass_forest", + "minecraft:patch_tall_grass", + "minecraft:patch_grass_badlands", + "minecraft:patch_grass_savanna", + "minecraft:patch_sugar_cane", + "twilightforest:tree/hollow_oak", + "twilightforest:mayapple", + "twilightforest:flower_placer_alt", + "twilightforest:grove_ruins", + "twilightforest:foundation", + "twilightforest:stone_circle", + "twilightforest:outside_stalagmite", + "twilightforest:monolith", + "twilightforest:hollow_stump", + "twilightforest:hollow_log", + "twilightforest:mycelium_blob", + "twilightforest:tree/selector/vanilla_trees", + "twilightforest:tree/twilight_oak_tree", + "twilightforest:tree/large_twilight_oak_tree", + "minecraft:brown_mushroom_normal", + "minecraft:red_mushroom_normal", + "minecraft:brown_mushroom_taiga", + "minecraft:red_mushroom_taiga", + "twilightforest:tree/selector/vanilla_mushrooms", + "twilightforest:mushroom/canopy_mushrooms_sparse", + "twilightforest:mushgloom_cluster", + "twilightforest:tree/selector/canopy_trees", + "twilightforest:default_fallen_logs" + ], + [ + "minecraft:freeze_top_layer" + ] + ], + "has_precipitation": true, + "spawn_costs": {}, + "spawners": { + "ambient": [], + "axolotls": [], + "creature": [ + { + "type": "twilightforest:bighorn_sheep", + "maxCount": 4, + "minCount": 4, + "weight": 12 + }, + { + "type": "twilightforest:boar", + "maxCount": 4, + "minCount": 4, + "weight": 10 + }, + { + "type": "minecraft:chicken", + "maxCount": 4, + "minCount": 4, + "weight": 10 + }, + { + "type": "twilightforest:deer", + "maxCount": 5, + "minCount": 4, + "weight": 15 + }, + { + "type": "minecraft:wolf", + "maxCount": 4, + "minCount": 4, + "weight": 5 + }, + { + "type": "twilightforest:tiny_bird", + "maxCount": 8, + "minCount": 4, + "weight": 15 + }, + { + "type": "twilightforest:squirrel", + "maxCount": 4, + "minCount": 2, + "weight": 10 + }, + { + "type": "twilightforest:dwarf_rabbit", + "maxCount": 5, + "minCount": 4, + "weight": 10 + }, + { + "type": "twilightforest:raven", + "maxCount": 2, + "minCount": 1, + "weight": 10 + } + ], + "misc": [], + "monster": [], + "underground_water_creature": [], + "water_ambient": [], + "water_creature": [] + }, + "temperature": 0.8 +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/biome/oak_savannah.json b/src/generated/resources/data/twilightforest/worldgen/biome/oak_savannah.json new file mode 100644 index 0000000000..40ec719126 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/biome/oak_savannah.json @@ -0,0 +1,149 @@ +{ + "carvers": { + "air": "twilightforest:tf_caves" + }, + "downfall": 0.0, + "effects": { + "fog_color": 12648408, + "mood_sound": { + "block_search_extent": 8, + "offset": 2.0, + "sound": "minecraft:ambient.cave", + "tick_delay": 6000 + }, + "music": { + "max_delay": 12000, + "min_delay": 1200, + "replace_current_music": true, + "sound": "twilightforest:music.twilightforest.twilight_forest" + }, + "sky_color": 2105930, + "water_color": 4159204, + "water_fog_color": 329011 + }, + "features": [ + [], + [], + [], + [], + [ + "twilightforest:druid_hut", + "twilightforest:well_placer" + ], + [], + [ + "minecraft:disk_sand", + "minecraft:disk_clay", + "minecraft:disk_gravel", + "twilightforest:wood_roots", + "twilightforest:legacy_coal_ore", + "twilightforest:legacy_iron_ore", + "twilightforest:legacy_gold_ore", + "twilightforest:legacy_redstone_ore", + "twilightforest:legacy_diamond_ore", + "twilightforest:legacy_lapis_ore", + "twilightforest:legacy_copper_ore", + "twilightforest:small_andesite", + "twilightforest:small_diorite", + "twilightforest:small_granite" + ], + [ + "twilightforest:plant_roots", + "twilightforest:torch_berries", + "twilightforest:vanilla_roots" + ], + [], + [ + "minecraft:patch_grass_forest", + "minecraft:patch_tall_grass", + "minecraft:patch_grass_badlands", + "minecraft:patch_grass_savanna", + "minecraft:patch_sugar_cane", + "twilightforest:tree/hollow_oak", + "twilightforest:mayapple", + "twilightforest:flower_placer", + "twilightforest:grove_ruins", + "twilightforest:foundation", + "twilightforest:stone_circle", + "twilightforest:outside_stalagmite", + "twilightforest:monolith", + "twilightforest:hollow_stump", + "twilightforest:hollow_log", + "twilightforest:tree/savannah_oak_tree", + "twilightforest:tree/large_twilight_oak_tree", + "twilightforest:default_fallen_logs", + "twilightforest:tree/savannah_canopy_oak_tree" + ], + [ + "minecraft:freeze_top_layer" + ] + ], + "has_precipitation": true, + "spawn_costs": {}, + "spawners": { + "ambient": [], + "axolotls": [], + "creature": [ + { + "type": "twilightforest:bighorn_sheep", + "maxCount": 4, + "minCount": 4, + "weight": 12 + }, + { + "type": "twilightforest:boar", + "maxCount": 4, + "minCount": 4, + "weight": 10 + }, + { + "type": "minecraft:chicken", + "maxCount": 4, + "minCount": 4, + "weight": 10 + }, + { + "type": "twilightforest:deer", + "maxCount": 5, + "minCount": 4, + "weight": 15 + }, + { + "type": "minecraft:wolf", + "maxCount": 4, + "minCount": 4, + "weight": 5 + }, + { + "type": "twilightforest:tiny_bird", + "maxCount": 8, + "minCount": 4, + "weight": 15 + }, + { + "type": "twilightforest:squirrel", + "maxCount": 4, + "minCount": 2, + "weight": 10 + }, + { + "type": "twilightforest:dwarf_rabbit", + "maxCount": 5, + "minCount": 4, + "weight": 10 + }, + { + "type": "twilightforest:raven", + "maxCount": 2, + "minCount": 1, + "weight": 10 + } + ], + "misc": [], + "monster": [], + "underground_water_creature": [], + "water_ambient": [], + "water_creature": [] + }, + "temperature": 0.9 +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/biome/snowy_forest.json b/src/generated/resources/data/twilightforest/worldgen/biome/snowy_forest.json new file mode 100644 index 0000000000..7b1d0f87d2 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/biome/snowy_forest.json @@ -0,0 +1,95 @@ +{ + "carvers": { + "air": "twilightforest:tf_caves" + }, + "creature_spawn_probability": 0.05, + "downfall": 0.9, + "effects": { + "fog_color": 16777215, + "foliage_color": 16777215, + "grass_color": 16777215, + "mood_sound": { + "block_search_extent": 8, + "offset": 2.0, + "sound": "minecraft:ambient.cave", + "tick_delay": 6000 + }, + "music": { + "max_delay": 12000, + "min_delay": 1200, + "replace_current_music": true, + "sound": "twilightforest:music.twilightforest.twilight_forest" + }, + "sky_color": 8421504, + "water_color": 4159204, + "water_fog_color": 329011 + }, + "features": [ + [], + [ + "twilightforest:water_lake" + ], + [], + [], + [], + [], + [ + "twilightforest:legacy_coal_ore", + "twilightforest:legacy_iron_ore", + "twilightforest:legacy_gold_ore", + "twilightforest:legacy_redstone_ore", + "twilightforest:legacy_diamond_ore", + "twilightforest:legacy_lapis_ore", + "twilightforest:legacy_copper_ore" + ], + [ + "twilightforest:plant_roots", + "twilightforest:torch_berries", + "twilightforest:vanilla_roots" + ], + [], + [ + "twilightforest:tree/selector/snowy_forest_trees", + "twilightforest:spruce_fallen_log" + ], + [ + "twilightforest:snow_under_trees", + "minecraft:freeze_top_layer" + ] + ], + "has_precipitation": true, + "spawn_costs": { + "twilightforest:winter_wolf": { + "charge": 0.8, + "energy_budget": 0.11 + }, + "twilightforest:yeti": { + "charge": 0.8, + "energy_budget": 0.11 + } + }, + "spawners": { + "ambient": [], + "axolotls": [], + "creature": [], + "misc": [], + "monster": [ + { + "type": "twilightforest:winter_wolf", + "maxCount": 1, + "minCount": 1, + "weight": 5 + }, + { + "type": "twilightforest:yeti", + "maxCount": 1, + "minCount": 1, + "weight": 5 + } + ], + "underground_water_creature": [], + "water_ambient": [], + "water_creature": [] + }, + "temperature": 0.09 +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/biome/spooky_forest.json b/src/generated/resources/data/twilightforest/worldgen/biome/spooky_forest.json new file mode 100644 index 0000000000..140aeb7dc6 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/biome/spooky_forest.json @@ -0,0 +1,133 @@ +{ + "carvers": { + "air": "twilightforest:tf_caves" + }, + "creature_spawn_probability": 0.2, + "downfall": 1.0, + "effects": { + "fog_color": 12648408, + "foliage_color": 16745729, + "grass_color": 12865827, + "grass_color_modifier": "twilightforest:spooky_forest", + "mood_sound": { + "block_search_extent": 8, + "offset": 2.0, + "sound": "minecraft:ambient.cave", + "tick_delay": 6000 + }, + "music": { + "max_delay": 12000, + "min_delay": 1200, + "replace_current_music": true, + "sound": "twilightforest:music.twilightforest.twilight_forest" + }, + "sky_color": 2105930, + "water_color": 12355671, + "water_fog_color": 329011 + }, + "features": [ + [], + [], + [], + [], + [ + "twilightforest:graveyard" + ], + [], + [ + "minecraft:disk_sand", + "minecraft:disk_clay", + "minecraft:disk_gravel", + "twilightforest:wood_roots", + "twilightforest:legacy_coal_ore", + "twilightforest:legacy_iron_ore", + "twilightforest:legacy_gold_ore", + "twilightforest:legacy_redstone_ore", + "twilightforest:legacy_diamond_ore", + "twilightforest:legacy_lapis_ore", + "twilightforest:legacy_copper_ore", + "twilightforest:small_andesite", + "twilightforest:small_diorite", + "twilightforest:small_granite" + ], + [ + "twilightforest:plant_roots", + "twilightforest:torch_berries", + "twilightforest:vanilla_roots" + ], + [], + [ + "minecraft:patch_grass_forest", + "minecraft:patch_tall_grass", + "minecraft:patch_grass_badlands", + "minecraft:patch_grass_savanna", + "minecraft:patch_sugar_cane", + "twilightforest:mayapple", + "twilightforest:tree/twilight_oak_tree", + "twilightforest:tree/large_twilight_oak_tree", + "twilightforest:tree/dead_canopy_tree", + "twilightforest:pumpkin_lamppost", + "twilightforest:tf_oak_fallen_log", + "twilightforest:canopy_fallen_log", + "twilightforest:webs", + "twilightforest:fallen_leaves", + "minecraft:patch_pumpkin", + "minecraft:patch_dead_bush" + ], + [ + "minecraft:freeze_top_layer" + ] + ], + "has_precipitation": true, + "spawn_costs": { + "minecraft:skeleton": { + "charge": 0.85, + "energy_budget": 0.25 + }, + "minecraft:spider": { + "charge": 0.75, + "energy_budget": 0.25 + }, + "twilightforest:skeleton_druid": { + "charge": 0.95, + "energy_budget": 0.25 + } + }, + "spawners": { + "ambient": [ + { + "type": "minecraft:bat", + "maxCount": 4, + "minCount": 2, + "weight": 20 + } + ], + "axolotls": [], + "creature": [], + "misc": [], + "monster": [ + { + "type": "minecraft:spider", + "maxCount": 2, + "minCount": 1, + "weight": 50 + }, + { + "type": "minecraft:skeleton", + "maxCount": 2, + "minCount": 1, + "weight": 20 + }, + { + "type": "twilightforest:skeleton_druid", + "maxCount": 1, + "minCount": 1, + "weight": 5 + } + ], + "underground_water_creature": [], + "water_ambient": [], + "water_creature": [] + }, + "temperature": 0.5 +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/biome/stream.json b/src/generated/resources/data/twilightforest/worldgen/biome/stream.json new file mode 100644 index 0000000000..8e873a9a3a --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/biome/stream.json @@ -0,0 +1,119 @@ +{ + "carvers": {}, + "downfall": 0.1, + "effects": { + "fog_color": 12648408, + "mood_sound": { + "block_search_extent": 8, + "offset": 2.0, + "sound": "minecraft:ambient.cave", + "tick_delay": 6000 + }, + "music": { + "max_delay": 12000, + "min_delay": 1200, + "replace_current_music": true, + "sound": "twilightforest:music.twilightforest.twilight_forest" + }, + "sky_color": 2105930, + "water_color": 4159204, + "water_fog_color": 329011 + }, + "features": [ + [], + [], + [], + [], + [], + [], + [ + "twilightforest:legacy_coal_ore", + "twilightforest:legacy_iron_ore", + "twilightforest:legacy_gold_ore", + "twilightforest:legacy_redstone_ore", + "twilightforest:legacy_diamond_ore", + "twilightforest:legacy_lapis_ore", + "twilightforest:legacy_copper_ore", + "twilightforest:small_andesite", + "twilightforest:small_diorite", + "twilightforest:small_granite" + ], + [], + [], + [ + "minecraft:seagrass_normal", + "minecraft:seagrass_simple" + ], + [ + "minecraft:freeze_top_layer" + ] + ], + "has_precipitation": true, + "spawn_costs": {}, + "spawners": { + "ambient": [], + "axolotls": [], + "creature": [ + { + "type": "twilightforest:bighorn_sheep", + "maxCount": 4, + "minCount": 4, + "weight": 12 + }, + { + "type": "twilightforest:boar", + "maxCount": 4, + "minCount": 4, + "weight": 10 + }, + { + "type": "minecraft:chicken", + "maxCount": 4, + "minCount": 4, + "weight": 10 + }, + { + "type": "twilightforest:deer", + "maxCount": 5, + "minCount": 4, + "weight": 15 + }, + { + "type": "minecraft:wolf", + "maxCount": 4, + "minCount": 4, + "weight": 5 + }, + { + "type": "twilightforest:tiny_bird", + "maxCount": 8, + "minCount": 4, + "weight": 15 + }, + { + "type": "twilightforest:squirrel", + "maxCount": 4, + "minCount": 2, + "weight": 10 + }, + { + "type": "twilightforest:dwarf_rabbit", + "maxCount": 5, + "minCount": 4, + "weight": 10 + }, + { + "type": "twilightforest:raven", + "maxCount": 2, + "minCount": 1, + "weight": 10 + } + ], + "misc": [], + "monster": [], + "underground_water_creature": [], + "water_ambient": [], + "water_creature": [] + }, + "temperature": 0.5 +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/biome/swamp.json b/src/generated/resources/data/twilightforest/worldgen/biome/swamp.json new file mode 100644 index 0000000000..ae84c5a066 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/biome/swamp.json @@ -0,0 +1,122 @@ +{ + "carvers": { + "air": "twilightforest:tf_caves" + }, + "downfall": 0.9, + "effects": { + "fog_color": 16161, + "foliage_color": 4809015, + "grass_color": 6056270, + "grass_color_modifier": "twilightforest:swamp", + "mood_sound": { + "block_search_extent": 8, + "offset": 2.0, + "sound": "minecraft:ambient.cave", + "tick_delay": 6000 + }, + "music": { + "max_delay": 12000, + "min_delay": 1200, + "replace_current_music": true, + "sound": "twilightforest:music.twilightforest.twilight_forest" + }, + "sky_color": 8466, + "water_color": 9811295, + "water_fog_color": 329011 + }, + "features": [ + [], + [], + [], + [], + [ + "twilightforest:druid_hut", + "twilightforest:well_placer" + ], + [], + [ + "minecraft:disk_sand", + "minecraft:disk_clay", + "minecraft:disk_gravel", + "twilightforest:wood_roots", + "twilightforest:legacy_coal_ore", + "twilightforest:legacy_iron_ore", + "twilightforest:legacy_gold_ore", + "twilightforest:legacy_redstone_ore", + "twilightforest:legacy_diamond_ore", + "twilightforest:legacy_lapis_ore", + "twilightforest:legacy_copper_ore", + "twilightforest:small_andesite", + "twilightforest:small_diorite", + "twilightforest:small_granite" + ], + [ + "twilightforest:plant_roots", + "twilightforest:torch_berries", + "twilightforest:vanilla_roots" + ], + [], + [ + "minecraft:patch_grass_forest", + "minecraft:patch_tall_grass", + "minecraft:patch_grass_badlands", + "minecraft:patch_grass_savanna", + "minecraft:patch_sugar_cane", + "twilightforest:tree/hollow_oak", + "twilightforest:grove_ruins", + "twilightforest:foundation", + "twilightforest:stone_circle", + "twilightforest:outside_stalagmite", + "twilightforest:monolith", + "twilightforest:hollow_stump", + "twilightforest:hollow_log", + "twilightforest:tree/mangrove_tree", + "twilightforest:tree/swampy_oak_tree", + "minecraft:patch_sugar_cane_swamp", + "minecraft:vines", + "minecraft:patch_dead_bush", + "twilightforest:mangrove_fallen_log", + "twilightforest:huge_lily_pad", + "twilightforest:huge_water_lily", + "minecraft:patch_waterlily" + ], + [ + "minecraft:freeze_top_layer" + ] + ], + "has_precipitation": true, + "spawn_costs": { + "minecraft:zombie": { + "charge": 0.75, + "energy_budget": 0.2 + }, + "twilightforest:mosquito_swarm": { + "charge": 0.75, + "energy_budget": 0.2 + } + }, + "spawners": { + "ambient": [], + "axolotls": [], + "creature": [], + "misc": [], + "monster": [ + { + "type": "minecraft:zombie", + "maxCount": 2, + "minCount": 1, + "weight": 10 + }, + { + "type": "twilightforest:mosquito_swarm", + "maxCount": 1, + "minCount": 1, + "weight": 10 + } + ], + "underground_water_creature": [], + "water_ambient": [], + "water_creature": [] + }, + "temperature": 0.8 +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/biome/thornlands.json b/src/generated/resources/data/twilightforest/worldgen/biome/thornlands.json new file mode 100644 index 0000000000..259645b861 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/biome/thornlands.json @@ -0,0 +1,54 @@ +{ + "carvers": {}, + "downfall": 0.2, + "effects": { + "fog_color": 12648408, + "mood_sound": { + "block_search_extent": 8, + "offset": 2.0, + "sound": "minecraft:ambient.cave", + "tick_delay": 6000 + }, + "music": { + "max_delay": 12000, + "min_delay": 1200, + "replace_current_music": true, + "sound": "twilightforest:music.twilightforest.twilight_forest" + }, + "sky_color": 2105930, + "water_color": 4159204, + "water_fog_color": 329011 + }, + "features": [ + [], + [], + [], + [], + [], + [], + [], + [], + [], + [ + "twilightforest:stone_circle", + "twilightforest:outside_stalagmite", + "twilightforest:monolith", + "twilightforest:hollow_stump", + "twilightforest:hollow_log", + "twilightforest:thorns" + ] + ], + "has_precipitation": true, + "spawn_costs": {}, + "spawners": { + "ambient": [], + "axolotls": [], + "creature": [], + "misc": [], + "monster": [], + "underground_water_creature": [], + "water_ambient": [], + "water_creature": [] + }, + "temperature": 0.3 +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/biome/underground.json b/src/generated/resources/data/twilightforest/worldgen/biome/underground.json new file mode 100644 index 0000000000..604f6ca261 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/biome/underground.json @@ -0,0 +1,150 @@ +{ + "carvers": { + "air": "twilightforest:tf_caves" + }, + "downfall": 0.0, + "effects": { + "fog_color": 12648408, + "mood_sound": { + "block_search_extent": 8, + "offset": 2.0, + "sound": "minecraft:ambient.cave", + "tick_delay": 6000 + }, + "music": { + "max_delay": 12000, + "min_delay": 1200, + "replace_current_music": true, + "sound": "twilightforest:music.twilightforest.twilight_forest" + }, + "sky_color": 2105930, + "water_color": 4159204, + "water_fog_color": 329011 + }, + "features": [ + [], + [], + [], + [], + [], + [], + [ + "minecraft:disk_sand", + "minecraft:disk_clay", + "minecraft:disk_gravel", + "twilightforest:wood_roots", + "twilightforest:legacy_coal_ore", + "twilightforest:legacy_iron_ore", + "twilightforest:legacy_gold_ore", + "twilightforest:legacy_redstone_ore", + "twilightforest:legacy_diamond_ore", + "twilightforest:legacy_lapis_ore", + "twilightforest:legacy_copper_ore", + "twilightforest:small_andesite", + "twilightforest:small_diorite", + "twilightforest:small_granite" + ], + [ + "twilightforest:plant_roots", + "twilightforest:torch_berries", + "twilightforest:vanilla_roots" + ], + [], + [], + [ + "minecraft:freeze_top_layer" + ] + ], + "has_precipitation": true, + "spawn_costs": { + "minecraft:creeper": { + "charge": 0.5, + "energy_budget": 0.1 + }, + "minecraft:enderman": { + "charge": 0.3, + "energy_budget": 0.1 + }, + "minecraft:skeleton": { + "charge": 0.7, + "energy_budget": 0.1 + }, + "minecraft:slime": { + "charge": 0.2, + "energy_budget": 0.1 + }, + "minecraft:spider": { + "charge": 0.6, + "energy_budget": 0.1 + }, + "minecraft:zombie": { + "charge": 0.7, + "energy_budget": 0.1 + }, + "twilightforest:kobold": { + "charge": 0.2, + "energy_budget": 0.1 + } + }, + "spawners": { + "ambient": [ + { + "type": "minecraft:bat", + "maxCount": 1, + "minCount": 1, + "weight": 10 + } + ], + "axolotls": [], + "creature": [], + "misc": [], + "monster": [ + { + "type": "minecraft:spider", + "maxCount": 3, + "minCount": 2, + "weight": 10 + }, + { + "type": "minecraft:zombie", + "maxCount": 2, + "minCount": 1, + "weight": 10 + }, + { + "type": "minecraft:skeleton", + "maxCount": 1, + "minCount": 1, + "weight": 10 + }, + { + "type": "minecraft:creeper", + "maxCount": 1, + "minCount": 1, + "weight": 1 + }, + { + "type": "minecraft:slime", + "maxCount": 4, + "minCount": 2, + "weight": 10 + }, + { + "type": "minecraft:enderman", + "maxCount": 2, + "minCount": 1, + "weight": 1 + }, + { + "type": "twilightforest:kobold", + "maxCount": 3, + "minCount": 1, + "weight": 10 + } + ], + "underground_water_creature": [], + "water_ambient": [], + "water_creature": [] + }, + "temperature": 0.7 +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_carver/highland_caves.json b/src/generated/resources/data/twilightforest/worldgen/configured_carver/highland_caves.json new file mode 100644 index 0000000000..ff5a4ac116 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_carver/highland_caves.json @@ -0,0 +1,24 @@ +{ + "type": "twilightforest:highland_caves", + "config": { + "floor_level": -0.7, + "horizontal_radius_multiplier": 1.0, + "lava_level": { + "above_bottom": 0 + }, + "probability": 0.1, + "replaceable": "#minecraft:overworld_carver_replaceables", + "vertical_radius_multiplier": 1.0, + "y": { + "type": "minecraft:biased_to_bottom", + "inner": 48, + "max_inclusive": { + "absolute": 65 + }, + "min_inclusive": { + "above_bottom": 5 + } + }, + "yScale": 0.75 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_carver/tf_caves.json b/src/generated/resources/data/twilightforest/worldgen/configured_carver/tf_caves.json new file mode 100644 index 0000000000..0c15fb5170 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_carver/tf_caves.json @@ -0,0 +1,23 @@ +{ + "type": "twilightforest:tf_caves", + "config": { + "floor_level": -0.7, + "horizontal_radius_multiplier": 1.0, + "lava_level": { + "above_bottom": 0 + }, + "probability": 0.1, + "replaceable": "#minecraft:overworld_carver_replaceables", + "vertical_radius_multiplier": 1.0, + "y": { + "type": "minecraft:uniform", + "max_inclusive": { + "absolute": -8 + }, + "min_inclusive": { + "above_bottom": 5 + } + }, + "yScale": 0.6 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/birch_fallen_log.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/birch_fallen_log.json new file mode 100644 index 0000000000..05958fe794 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/birch_fallen_log.json @@ -0,0 +1,18 @@ +{ + "type": "twilightforest:fallen_small_log", + "config": { + "hollow": { + "Name": "twilightforest:hollow_birch_log_horizontal", + "Properties": { + "axis": "x", + "variant": "empty" + } + }, + "normal": { + "Name": "minecraft:birch_log", + "Properties": { + "axis": "y" + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/canopy_fallen_log.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/canopy_fallen_log.json new file mode 100644 index 0000000000..5f77989a56 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/canopy_fallen_log.json @@ -0,0 +1,18 @@ +{ + "type": "twilightforest:fallen_small_log", + "config": { + "hollow": { + "Name": "twilightforest:hollow_canopy_log_horizontal", + "Properties": { + "axis": "x", + "variant": "empty" + } + }, + "normal": { + "Name": "twilightforest:canopy_log", + "Properties": { + "axis": "y" + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/cicada_lamppost.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/cicada_lamppost.json new file mode 100644 index 0000000000..8399864aaa --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/cicada_lamppost.json @@ -0,0 +1,11 @@ +{ + "type": "twilightforest:lampposts", + "config": { + "state": { + "Name": "twilightforest:cicada_jar", + "Properties": { + "waterlogged": "false" + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/dark_dead_bushes.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/dark_dead_bushes.json new file mode 100644 index 0000000000..827aa419cc --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/dark_dead_bushes.json @@ -0,0 +1,44 @@ +{ + "type": "twilightforest:dark_forest_placer", + "config": { + "feature": { + "feature": { + "type": "minecraft:simple_block", + "config": { + "to_place": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "minecraft:dead_bush" + } + } + } + }, + "placement": [ + { + "type": "minecraft:block_predicate_filter", + "predicate": { + "type": "minecraft:all_of", + "predicates": [ + { + "type": "minecraft:matching_blocks", + "blocks": "minecraft:air" + }, + { + "type": "minecraft:matching_blocks", + "blocks": "minecraft:grass_block", + "offset": [ + 0, + -1, + 0 + ] + } + ] + } + } + ] + }, + "tries": 50, + "xz_spread": 7, + "y_spread": 3 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/dark_ferns.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/dark_ferns.json new file mode 100644 index 0000000000..683637f686 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/dark_ferns.json @@ -0,0 +1,44 @@ +{ + "type": "twilightforest:dark_forest_placer", + "config": { + "feature": { + "feature": { + "type": "minecraft:simple_block", + "config": { + "to_place": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "minecraft:fern" + } + } + } + }, + "placement": [ + { + "type": "minecraft:block_predicate_filter", + "predicate": { + "type": "minecraft:all_of", + "predicates": [ + { + "type": "minecraft:matching_blocks", + "blocks": "minecraft:air" + }, + { + "type": "minecraft:matching_blocks", + "blocks": "minecraft:grass_block", + "offset": [ + 0, + -1, + 0 + ] + } + ] + } + } + ] + }, + "tries": 128, + "xz_spread": 7, + "y_spread": 3 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/dark_grass.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/dark_grass.json new file mode 100644 index 0000000000..daa3208b01 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/dark_grass.json @@ -0,0 +1,44 @@ +{ + "type": "twilightforest:dark_forest_placer", + "config": { + "feature": { + "feature": { + "type": "minecraft:simple_block", + "config": { + "to_place": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "minecraft:grass" + } + } + } + }, + "placement": [ + { + "type": "minecraft:block_predicate_filter", + "predicate": { + "type": "minecraft:all_of", + "predicates": [ + { + "type": "minecraft:matching_blocks", + "blocks": "minecraft:air" + }, + { + "type": "minecraft:matching_blocks", + "blocks": "minecraft:grass_block", + "offset": [ + 0, + -1, + 0 + ] + } + ] + } + } + ] + }, + "tries": 128, + "xz_spread": 7, + "y_spread": 3 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/dark_mushglooms.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/dark_mushglooms.json new file mode 100644 index 0000000000..002013a63a --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/dark_mushglooms.json @@ -0,0 +1,44 @@ +{ + "type": "twilightforest:dark_forest_placer", + "config": { + "feature": { + "feature": { + "type": "minecraft:simple_block", + "config": { + "to_place": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "twilightforest:mushgloom" + } + } + } + }, + "placement": [ + { + "type": "minecraft:block_predicate_filter", + "predicate": { + "type": "minecraft:all_of", + "predicates": [ + { + "type": "minecraft:matching_blocks", + "blocks": "minecraft:air" + }, + { + "type": "minecraft:matching_blocks", + "blocks": "minecraft:grass_block", + "offset": [ + 0, + -1, + 0 + ] + } + ] + } + } + ] + }, + "tries": 50, + "xz_spread": 7, + "y_spread": 3 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/dark_mushrooms.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/dark_mushrooms.json new file mode 100644 index 0000000000..201fd03ba5 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/dark_mushrooms.json @@ -0,0 +1,44 @@ +{ + "type": "twilightforest:dark_forest_placer", + "config": { + "feature": { + "feature": { + "type": "minecraft:simple_block", + "config": { + "to_place": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "minecraft:brown_mushroom" + } + } + } + }, + "placement": [ + { + "type": "minecraft:block_predicate_filter", + "predicate": { + "type": "minecraft:all_of", + "predicates": [ + { + "type": "minecraft:matching_blocks", + "blocks": "minecraft:air" + }, + { + "type": "minecraft:matching_blocks", + "blocks": "minecraft:grass_block", + "offset": [ + 0, + -1, + 0 + ] + } + ] + } + } + ] + }, + "tries": 50, + "xz_spread": 7, + "y_spread": 3 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/dark_pumpkins.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/dark_pumpkins.json new file mode 100644 index 0000000000..df0eaf197b --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/dark_pumpkins.json @@ -0,0 +1,44 @@ +{ + "type": "twilightforest:dark_forest_placer", + "config": { + "feature": { + "feature": { + "type": "minecraft:simple_block", + "config": { + "to_place": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "minecraft:pumpkin" + } + } + } + }, + "placement": [ + { + "type": "minecraft:block_predicate_filter", + "predicate": { + "type": "minecraft:all_of", + "predicates": [ + { + "type": "minecraft:matching_blocks", + "blocks": "minecraft:air" + }, + { + "type": "minecraft:matching_blocks", + "blocks": "minecraft:grass_block", + "offset": [ + 0, + -1, + 0 + ] + } + ] + } + } + ] + }, + "tries": 50, + "xz_spread": 7, + "y_spread": 3 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/default_fallen_logs.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/default_fallen_logs.json new file mode 100644 index 0000000000..8f01ecefc2 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/default_fallen_logs.json @@ -0,0 +1,32 @@ +{ + "type": "minecraft:random_selector", + "config": { + "default": { + "feature": "twilightforest:tf_oak_fallen_log", + "placement": [] + }, + "features": [ + { + "chance": 0.1, + "feature": { + "feature": "twilightforest:birch_fallen_log", + "placement": [] + } + }, + { + "chance": 0.2, + "feature": { + "feature": "twilightforest:oak_fallen_log", + "placement": [] + } + }, + { + "chance": 0.4, + "feature": { + "feature": "twilightforest:canopy_fallen_log", + "placement": [] + } + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/druid_hut.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/druid_hut.json new file mode 100644 index 0000000000..697180cb0f --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/druid_hut.json @@ -0,0 +1,166 @@ +{ + "type": "twilightforest:druid_hut", + "config": { + "palette_choices": [ + { + "data": "#twilightforest:common", + "weight": 8 + }, + { + "data": "#twilightforest:uncommon", + "weight": 4 + }, + { + "data": "#twilightforest:rare", + "weight": 3 + }, + { + "data": "#twilightforest:treasure", + "weight": 1 + } + ], + "preprocessing_rules": [ + { + "input_predicate": { + "block": "minecraft:cobblestone", + "predicate_type": "minecraft:random_block_match", + "probability": 0.5 + }, + "location_predicate": { + "predicate_type": "minecraft:always_true" + }, + "output_state": { + "Name": "minecraft:mossy_cobblestone" + } + }, + { + "input_predicate": { + "block": "minecraft:cobblestone_stairs", + "predicate_type": "minecraft:random_block_match", + "probability": 0.5 + }, + "location_predicate": { + "predicate_type": "minecraft:always_true" + }, + "output_state": { + "Name": "minecraft:mossy_cobblestone_stairs", + "Properties": { + "facing": "north", + "half": "bottom", + "shape": "straight", + "waterlogged": "false" + } + } + }, + { + "input_predicate": { + "block": "minecraft:cobblestone_slab", + "predicate_type": "minecraft:random_block_match", + "probability": 0.5 + }, + "location_predicate": { + "predicate_type": "minecraft:always_true" + }, + "output_state": { + "Name": "minecraft:mossy_cobblestone_slab", + "Properties": { + "type": "bottom", + "waterlogged": "false" + } + } + }, + { + "input_predicate": { + "block": "minecraft:cobblestone_wall", + "predicate_type": "minecraft:random_block_match", + "probability": 0.5 + }, + "location_predicate": { + "predicate_type": "minecraft:always_true" + }, + "output_state": { + "Name": "minecraft:mossy_cobblestone_wall", + "Properties": { + "east": "none", + "north": "none", + "south": "none", + "up": "true", + "waterlogged": "false", + "west": "none" + } + } + }, + { + "input_predicate": { + "block": "minecraft:stone_bricks", + "predicate_type": "minecraft:random_block_match", + "probability": 0.5 + }, + "location_predicate": { + "predicate_type": "minecraft:always_true" + }, + "output_state": { + "Name": "minecraft:mossy_stone_bricks" + } + }, + { + "input_predicate": { + "block": "minecraft:stone_brick_stairs", + "predicate_type": "minecraft:random_block_match", + "probability": 0.5 + }, + "location_predicate": { + "predicate_type": "minecraft:always_true" + }, + "output_state": { + "Name": "minecraft:mossy_stone_brick_stairs", + "Properties": { + "facing": "north", + "half": "bottom", + "shape": "straight", + "waterlogged": "false" + } + } + }, + { + "input_predicate": { + "block": "minecraft:stone_brick_slab", + "predicate_type": "minecraft:random_block_match", + "probability": 0.5 + }, + "location_predicate": { + "predicate_type": "minecraft:always_true" + }, + "output_state": { + "Name": "minecraft:mossy_stone_brick_slab", + "Properties": { + "type": "bottom", + "waterlogged": "false" + } + } + }, + { + "input_predicate": { + "block": "minecraft:stone_brick_wall", + "predicate_type": "minecraft:random_block_match", + "probability": 0.5 + }, + "location_predicate": { + "predicate_type": "minecraft:always_true" + }, + "output_state": { + "Name": "minecraft:mossy_stone_brick_wall", + "Properties": { + "east": "none", + "north": "none", + "south": "none", + "up": "true", + "waterlogged": "false", + "west": "none" + } + } + } + ], + "target_palettes": "#twilightforest:druid_hut_swizzle_mask" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/fallen_leaves.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/fallen_leaves.json new file mode 100644 index 0000000000..017f819c85 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/fallen_leaves.json @@ -0,0 +1,4 @@ +{ + "type": "twilightforest:fallen_leaves", + "config": {} +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/fancy_well.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/fancy_well.json new file mode 100644 index 0000000000..0b1e51e9a8 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/fancy_well.json @@ -0,0 +1,166 @@ +{ + "type": "twilightforest:fancy_well", + "config": { + "palette_choices": [ + { + "data": "#twilightforest:common", + "weight": 8 + }, + { + "data": "#twilightforest:uncommon", + "weight": 4 + }, + { + "data": "#twilightforest:rare", + "weight": 3 + }, + { + "data": "#twilightforest:treasure", + "weight": 1 + } + ], + "preprocessing_rules": [ + { + "input_predicate": { + "block": "minecraft:cobblestone", + "predicate_type": "minecraft:random_block_match", + "probability": 0.5 + }, + "location_predicate": { + "predicate_type": "minecraft:always_true" + }, + "output_state": { + "Name": "minecraft:mossy_cobblestone" + } + }, + { + "input_predicate": { + "block": "minecraft:cobblestone_stairs", + "predicate_type": "minecraft:random_block_match", + "probability": 0.5 + }, + "location_predicate": { + "predicate_type": "minecraft:always_true" + }, + "output_state": { + "Name": "minecraft:mossy_cobblestone_stairs", + "Properties": { + "facing": "north", + "half": "bottom", + "shape": "straight", + "waterlogged": "false" + } + } + }, + { + "input_predicate": { + "block": "minecraft:cobblestone_slab", + "predicate_type": "minecraft:random_block_match", + "probability": 0.5 + }, + "location_predicate": { + "predicate_type": "minecraft:always_true" + }, + "output_state": { + "Name": "minecraft:mossy_cobblestone_slab", + "Properties": { + "type": "bottom", + "waterlogged": "false" + } + } + }, + { + "input_predicate": { + "block": "minecraft:cobblestone_wall", + "predicate_type": "minecraft:random_block_match", + "probability": 0.5 + }, + "location_predicate": { + "predicate_type": "minecraft:always_true" + }, + "output_state": { + "Name": "minecraft:mossy_cobblestone_wall", + "Properties": { + "east": "none", + "north": "none", + "south": "none", + "up": "true", + "waterlogged": "false", + "west": "none" + } + } + }, + { + "input_predicate": { + "block": "minecraft:stone_bricks", + "predicate_type": "minecraft:random_block_match", + "probability": 0.5 + }, + "location_predicate": { + "predicate_type": "minecraft:always_true" + }, + "output_state": { + "Name": "minecraft:mossy_stone_bricks" + } + }, + { + "input_predicate": { + "block": "minecraft:stone_brick_stairs", + "predicate_type": "minecraft:random_block_match", + "probability": 0.5 + }, + "location_predicate": { + "predicate_type": "minecraft:always_true" + }, + "output_state": { + "Name": "minecraft:mossy_stone_brick_stairs", + "Properties": { + "facing": "north", + "half": "bottom", + "shape": "straight", + "waterlogged": "false" + } + } + }, + { + "input_predicate": { + "block": "minecraft:stone_brick_slab", + "predicate_type": "minecraft:random_block_match", + "probability": 0.5 + }, + "location_predicate": { + "predicate_type": "minecraft:always_true" + }, + "output_state": { + "Name": "minecraft:mossy_stone_brick_slab", + "Properties": { + "type": "bottom", + "waterlogged": "false" + } + } + }, + { + "input_predicate": { + "block": "minecraft:stone_brick_wall", + "predicate_type": "minecraft:random_block_match", + "probability": 0.5 + }, + "location_predicate": { + "predicate_type": "minecraft:always_true" + }, + "output_state": { + "Name": "minecraft:mossy_stone_brick_wall", + "Properties": { + "east": "none", + "north": "none", + "south": "none", + "up": "true", + "waterlogged": "false", + "west": "none" + } + } + } + ], + "target_palettes": "#twilightforest:well_swizzle_mask" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/fiddlehead.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/fiddlehead.json new file mode 100644 index 0000000000..47683aece2 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/fiddlehead.json @@ -0,0 +1,30 @@ +{ + "type": "minecraft:random_patch", + "config": { + "feature": { + "feature": { + "type": "minecraft:simple_block", + "config": { + "to_place": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "twilightforest:fiddlehead" + } + } + } + }, + "placement": [ + { + "type": "minecraft:block_predicate_filter", + "predicate": { + "type": "minecraft:matching_blocks", + "blocks": "minecraft:air" + } + } + ] + }, + "tries": 96, + "xz_spread": 7, + "y_spread": 3 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/fire_jet.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/fire_jet.json new file mode 100644 index 0000000000..666309d5b2 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/fire_jet.json @@ -0,0 +1,11 @@ +{ + "type": "twilightforest:fire_jet", + "config": { + "state": { + "Name": "twilightforest:fire_jet", + "Properties": { + "state": "idle" + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/firefly_lamppost.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/firefly_lamppost.json new file mode 100644 index 0000000000..801d4b7b11 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/firefly_lamppost.json @@ -0,0 +1,11 @@ +{ + "type": "twilightforest:lampposts", + "config": { + "state": { + "Name": "twilightforest:firefly_jar", + "Properties": { + "waterlogged": "false" + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/flower_placer.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/flower_placer.json new file mode 100644 index 0000000000..854d207338 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/flower_placer.json @@ -0,0 +1,73 @@ +{ + "type": "minecraft:flower", + "config": { + "feature": { + "feature": { + "type": "minecraft:simple_block", + "config": { + "to_place": { + "type": "minecraft:noise_provider", + "noise": { + "amplitudes": [ + 1.0 + ], + "firstOctave": 0 + }, + "scale": 0.020833334, + "seed": 2345, + "states": [ + { + "Name": "minecraft:poppy" + }, + { + "Name": "minecraft:dandelion" + }, + { + "Name": "minecraft:red_tulip" + }, + { + "Name": "minecraft:orange_tulip" + }, + { + "Name": "minecraft:pink_tulip" + }, + { + "Name": "minecraft:white_tulip" + }, + { + "Name": "minecraft:cornflower" + }, + { + "Name": "minecraft:lily_of_the_valley" + }, + { + "Name": "minecraft:blue_orchid" + }, + { + "Name": "minecraft:allium" + }, + { + "Name": "minecraft:azure_bluet" + }, + { + "Name": "minecraft:oxeye_daisy" + } + ] + } + } + }, + "placement": [ + { + "type": "minecraft:block_predicate_filter", + "predicate": { + "type": "minecraft:matching_blocks", + "blocks": "minecraft:air" + } + } + ] + }, + "tries": 32, + "xz_spread": 7, + "y_spread": 7 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/flower_placer_alt.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/flower_placer_alt.json new file mode 100644 index 0000000000..6bfc27347b --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/flower_placer_alt.json @@ -0,0 +1,73 @@ +{ + "type": "minecraft:flower", + "config": { + "feature": { + "feature": { + "type": "minecraft:simple_block", + "config": { + "to_place": { + "type": "minecraft:noise_provider", + "noise": { + "amplitudes": [ + 1.0 + ], + "firstOctave": 0 + }, + "scale": 0.020833334, + "seed": 2345, + "states": [ + { + "Name": "minecraft:white_tulip" + }, + { + "Name": "minecraft:pink_tulip" + }, + { + "Name": "minecraft:orange_tulip" + }, + { + "Name": "minecraft:red_tulip" + }, + { + "Name": "minecraft:dandelion" + }, + { + "Name": "minecraft:poppy" + }, + { + "Name": "minecraft:oxeye_daisy" + }, + { + "Name": "minecraft:azure_bluet" + }, + { + "Name": "minecraft:allium" + }, + { + "Name": "minecraft:blue_orchid" + }, + { + "Name": "minecraft:lily_of_the_valley" + }, + { + "Name": "minecraft:cornflower" + } + ] + } + } + }, + "placement": [ + { + "type": "minecraft:block_predicate_filter", + "predicate": { + "type": "minecraft:matching_blocks", + "blocks": "minecraft:air" + } + } + ] + }, + "tries": 32, + "xz_spread": 7, + "y_spread": 7 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/foundation.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/foundation.json new file mode 100644 index 0000000000..ba0569569c --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/foundation.json @@ -0,0 +1,4 @@ +{ + "type": "twilightforest:foundation", + "config": {} +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/graveyard.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/graveyard.json new file mode 100644 index 0000000000..4e9368fc59 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/graveyard.json @@ -0,0 +1,4 @@ +{ + "type": "twilightforest:graveyard", + "config": {} +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/grove_ruins.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/grove_ruins.json new file mode 100644 index 0000000000..0007068050 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/grove_ruins.json @@ -0,0 +1,4 @@ +{ + "type": "twilightforest:grove_ruins", + "config": {} +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/hollow_log.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/hollow_log.json new file mode 100644 index 0000000000..93c9b53f71 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/hollow_log.json @@ -0,0 +1,4 @@ +{ + "type": "twilightforest:fallen_hollow_log", + "config": {} +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/hollow_stump.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/hollow_stump.json new file mode 100644 index 0000000000..b5cbd54514 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/hollow_stump.json @@ -0,0 +1,46 @@ +{ + "type": "twilightforest:hollow_stump", + "config": { + "add_first_five_chance": 1, + "add_second_five_chance": 1, + "branch_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "twilightforest:twilight_oak_wood", + "Properties": { + "axis": "y" + } + } + }, + "check_water": false, + "decorators": [], + "has_leaves": false, + "leaves_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "twilightforest:twilight_oak_leaves", + "Properties": { + "distance": "7", + "persistent": "false", + "waterlogged": "false" + } + } + }, + "minimum_size": 0, + "roots_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "twilightforest:root" + } + }, + "trunk_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "twilightforest:twilight_oak_log", + "Properties": { + "axis": "y" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/huge_lily_pad.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/huge_lily_pad.json new file mode 100644 index 0000000000..0656004d44 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/huge_lily_pad.json @@ -0,0 +1,4 @@ +{ + "type": "twilightforest:huge_lily_pad", + "config": {} +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/huge_water_lily.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/huge_water_lily.json new file mode 100644 index 0000000000..baca759b57 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/huge_water_lily.json @@ -0,0 +1,4 @@ +{ + "type": "twilightforest:huge_water_lily", + "config": {} +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/lamppost_placer.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/lamppost_placer.json new file mode 100644 index 0000000000..35869c682b --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/lamppost_placer.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:random_selector", + "config": { + "default": { + "feature": "twilightforest:firefly_lamppost", + "placement": [] + }, + "features": [ + { + "chance": 0.1, + "feature": { + "feature": "twilightforest:cicada_lamppost", + "placement": [] + } + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/lava_lake.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/lava_lake.json new file mode 100644 index 0000000000..696af9c53c --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/lava_lake.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:lake", + "config": { + "barrier": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "minecraft:stone" + } + }, + "fluid": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "minecraft:lava", + "Properties": { + "level": "0" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/legacy_coal_ore.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/legacy_coal_ore.json new file mode 100644 index 0000000000..48edaf0f81 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/legacy_coal_ore.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:ore", + "config": { + "discard_chance_on_air_exposure": 0.0, + "size": 16, + "targets": [ + { + "state": { + "Name": "minecraft:coal_ore" + }, + "target": { + "predicate_type": "minecraft:tag_match", + "tag": "minecraft:stone_ore_replaceables" + } + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/legacy_copper_ore.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/legacy_copper_ore.json new file mode 100644 index 0000000000..7097cad12d --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/legacy_copper_ore.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:ore", + "config": { + "discard_chance_on_air_exposure": 0.0, + "size": 10, + "targets": [ + { + "state": { + "Name": "minecraft:copper_ore" + }, + "target": { + "predicate_type": "minecraft:tag_match", + "tag": "minecraft:stone_ore_replaceables" + } + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/legacy_diamond_ore.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/legacy_diamond_ore.json new file mode 100644 index 0000000000..ab643016ea --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/legacy_diamond_ore.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:ore", + "config": { + "discard_chance_on_air_exposure": 0.0, + "size": 8, + "targets": [ + { + "state": { + "Name": "minecraft:diamond_ore" + }, + "target": { + "predicate_type": "minecraft:tag_match", + "tag": "minecraft:stone_ore_replaceables" + } + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/legacy_gold_ore.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/legacy_gold_ore.json new file mode 100644 index 0000000000..251fd9e408 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/legacy_gold_ore.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:ore", + "config": { + "discard_chance_on_air_exposure": 0.0, + "size": 9, + "targets": [ + { + "state": { + "Name": "minecraft:gold_ore" + }, + "target": { + "predicate_type": "minecraft:tag_match", + "tag": "minecraft:stone_ore_replaceables" + } + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/legacy_iron_ore.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/legacy_iron_ore.json new file mode 100644 index 0000000000..385854788c --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/legacy_iron_ore.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:ore", + "config": { + "discard_chance_on_air_exposure": 0.0, + "size": 9, + "targets": [ + { + "state": { + "Name": "minecraft:iron_ore" + }, + "target": { + "predicate_type": "minecraft:tag_match", + "tag": "minecraft:stone_ore_replaceables" + } + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/legacy_lapis_ore.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/legacy_lapis_ore.json new file mode 100644 index 0000000000..5440ead5c4 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/legacy_lapis_ore.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:ore", + "config": { + "discard_chance_on_air_exposure": 0.0, + "size": 7, + "targets": [ + { + "state": { + "Name": "minecraft:lapis_ore" + }, + "target": { + "predicate_type": "minecraft:tag_match", + "tag": "minecraft:stone_ore_replaceables" + } + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/legacy_redstone_ore.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/legacy_redstone_ore.json new file mode 100644 index 0000000000..c37407c2d5 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/legacy_redstone_ore.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:ore", + "config": { + "discard_chance_on_air_exposure": 0.0, + "size": 8, + "targets": [ + { + "state": { + "Name": "minecraft:redstone_ore", + "Properties": { + "lit": "false" + } + }, + "target": { + "predicate_type": "minecraft:tag_match", + "tag": "minecraft:stone_ore_replaceables" + } + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/mangrove_fallen_log.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/mangrove_fallen_log.json new file mode 100644 index 0000000000..689df6752a --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/mangrove_fallen_log.json @@ -0,0 +1,18 @@ +{ + "type": "twilightforest:fallen_small_log", + "config": { + "hollow": { + "Name": "twilightforest:hollow_mangrove_log_horizontal", + "Properties": { + "axis": "x", + "variant": "empty" + } + }, + "normal": { + "Name": "twilightforest:mangrove_log", + "Properties": { + "axis": "y" + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/mayapple.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/mayapple.json new file mode 100644 index 0000000000..47ea5c330c --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/mayapple.json @@ -0,0 +1,30 @@ +{ + "type": "minecraft:random_patch", + "config": { + "feature": { + "feature": { + "type": "minecraft:simple_block", + "config": { + "to_place": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "twilightforest:mayapple" + } + } + } + }, + "placement": [ + { + "type": "minecraft:block_predicate_filter", + "predicate": { + "type": "minecraft:matching_blocks", + "blocks": "minecraft:air" + } + } + ] + }, + "tries": 96, + "xz_spread": 7, + "y_spread": 3 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/monolith.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/monolith.json new file mode 100644 index 0000000000..1f8269c573 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/monolith.json @@ -0,0 +1,4 @@ +{ + "type": "twilightforest:monolith", + "config": {} +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/mushgloom_cluster.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/mushgloom_cluster.json new file mode 100644 index 0000000000..7b0c744b43 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/mushgloom_cluster.json @@ -0,0 +1,30 @@ +{ + "type": "minecraft:random_patch", + "config": { + "feature": { + "feature": { + "type": "minecraft:simple_block", + "config": { + "to_place": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "twilightforest:mushgloom" + } + } + } + }, + "placement": [ + { + "type": "minecraft:block_predicate_filter", + "predicate": { + "type": "minecraft:matching_blocks", + "blocks": "minecraft:air" + } + } + ] + }, + "tries": 96, + "xz_spread": 7, + "y_spread": 3 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/mushroom/big_mushgloom.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/mushroom/big_mushgloom.json new file mode 100644 index 0000000000..1cbd4e6202 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/mushroom/big_mushgloom.json @@ -0,0 +1,34 @@ +{ + "type": "twilightforest:big_mushgloom", + "config": { + "cap_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "twilightforest:huge_mushgloom", + "Properties": { + "down": "false", + "east": "true", + "north": "true", + "south": "true", + "up": "true", + "west": "true" + } + } + }, + "foliage_radius": 1, + "stem_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "twilightforest:huge_mushgloom_stem", + "Properties": { + "down": "false", + "east": "true", + "north": "true", + "south": "true", + "up": "false", + "west": "true" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/mushroom/brown_canopy_mushroom.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/mushroom/brown_canopy_mushroom.json new file mode 100644 index 0000000000..1255c3b975 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/mushroom/brown_canopy_mushroom.json @@ -0,0 +1,34 @@ +{ + "type": "twilightforest:canopy_brown_mushroom", + "config": { + "cap_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "minecraft:brown_mushroom_block", + "Properties": { + "down": "false", + "east": "true", + "north": "true", + "south": "true", + "up": "true", + "west": "true" + } + } + }, + "foliage_radius": 3, + "stem_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "minecraft:mushroom_stem", + "Properties": { + "down": "false", + "east": "true", + "north": "true", + "south": "true", + "up": "false", + "west": "true" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/mushroom/canopy_mushrooms_dense.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/mushroom/canopy_mushrooms_dense.json new file mode 100644 index 0000000000..8b6c488db2 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/mushroom/canopy_mushrooms_dense.json @@ -0,0 +1,25 @@ +{ + "type": "minecraft:random_selector", + "config": { + "default": { + "feature": "twilightforest:tree/dummy", + "placement": [] + }, + "features": [ + { + "chance": 0.675, + "feature": { + "feature": "twilightforest:mushroom/brown_canopy_mushroom", + "placement": [] + } + }, + { + "chance": 0.225, + "feature": { + "feature": "twilightforest:mushroom/red_canopy_mushroom", + "placement": [] + } + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/mushroom/canopy_mushrooms_sparse.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/mushroom/canopy_mushrooms_sparse.json new file mode 100644 index 0000000000..f34d1ff398 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/mushroom/canopy_mushrooms_sparse.json @@ -0,0 +1,25 @@ +{ + "type": "minecraft:random_selector", + "config": { + "default": { + "feature": "twilightforest:tree/dummy", + "placement": [] + }, + "features": [ + { + "chance": 0.15, + "feature": { + "feature": "twilightforest:mushroom/brown_canopy_mushroom", + "placement": [] + } + }, + { + "chance": 0.05, + "feature": { + "feature": "twilightforest:mushroom/red_canopy_mushroom", + "placement": [] + } + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/mushroom/red_canopy_mushroom.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/mushroom/red_canopy_mushroom.json new file mode 100644 index 0000000000..bad4439522 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/mushroom/red_canopy_mushroom.json @@ -0,0 +1,34 @@ +{ + "type": "twilightforest:canopy_red_mushroom", + "config": { + "cap_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "minecraft:red_mushroom_block", + "Properties": { + "down": "false", + "east": "true", + "north": "true", + "south": "true", + "up": "true", + "west": "true" + } + } + }, + "foliage_radius": 3, + "stem_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "minecraft:mushroom_stem", + "Properties": { + "down": "false", + "east": "true", + "north": "true", + "south": "true", + "up": "false", + "west": "true" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/mycelium_blob.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/mycelium_blob.json new file mode 100644 index 0000000000..59a11ee912 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/mycelium_blob.json @@ -0,0 +1,29 @@ +{ + "type": "twilightforest:mycelium_blob", + "config": { + "half_height": 3, + "radius": { + "type": "minecraft:uniform", + "value": { + "max_inclusive": 6, + "min_inclusive": 4 + } + }, + "state_provider": { + "fallback": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "minecraft:mycelium", + "Properties": { + "snowy": "false" + } + } + }, + "rules": [] + }, + "target": { + "type": "minecraft:matching_blocks", + "blocks": "minecraft:grass_block" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/oak_fallen_log.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/oak_fallen_log.json new file mode 100644 index 0000000000..abe470fc06 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/oak_fallen_log.json @@ -0,0 +1,18 @@ +{ + "type": "twilightforest:fallen_small_log", + "config": { + "hollow": { + "Name": "twilightforest:hollow_oak_log_horizontal", + "Properties": { + "axis": "x", + "variant": "empty" + } + }, + "normal": { + "Name": "minecraft:oak_log", + "Properties": { + "axis": "y" + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/ore/wood_roots_spread.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/ore/wood_roots_spread.json new file mode 100644 index 0000000000..ee098c65ba --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/ore/wood_roots_spread.json @@ -0,0 +1,28 @@ +{ + "type": "twilightforest:wood_roots", + "config": { + "root_block": { + "type": "minecraft:weighted_state_provider", + "entries": [ + { + "data": { + "Name": "twilightforest:root" + }, + "weight": 6 + }, + { + "data": { + "Name": "twilightforest:liveroot_block" + }, + "weight": 1 + } + ] + }, + "root_ore": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "twilightforest:liveroot_block" + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/outside_stalagmite.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/outside_stalagmite.json new file mode 100644 index 0000000000..6888457279 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/outside_stalagmite.json @@ -0,0 +1,4 @@ +{ + "type": "twilightforest:block_spike", + "config": {} +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/plant_roots.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/plant_roots.json new file mode 100644 index 0000000000..c73ef8a9f1 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/plant_roots.json @@ -0,0 +1,8 @@ +{ + "type": "twilightforest:underground_plants", + "config": { + "state": { + "Name": "twilightforest:root_strand" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/pumpkin_lamppost.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/pumpkin_lamppost.json new file mode 100644 index 0000000000..e5302ac78c --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/pumpkin_lamppost.json @@ -0,0 +1,11 @@ +{ + "type": "twilightforest:lampposts", + "config": { + "state": { + "Name": "minecraft:jack_o_lantern", + "Properties": { + "facing": "north" + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/simple_well.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/simple_well.json new file mode 100644 index 0000000000..aec071e22d --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/simple_well.json @@ -0,0 +1,96 @@ +{ + "type": "twilightforest:simple_well", + "config": { + "palette_choices": [ + { + "data": "#twilightforest:common", + "weight": 8 + }, + { + "data": "#twilightforest:uncommon", + "weight": 4 + }, + { + "data": "#twilightforest:rare", + "weight": 3 + }, + { + "data": "#twilightforest:treasure", + "weight": 1 + } + ], + "preprocessing_rules": [ + { + "input_predicate": { + "block": "minecraft:cobblestone", + "predicate_type": "minecraft:random_block_match", + "probability": 0.5 + }, + "location_predicate": { + "predicate_type": "minecraft:always_true" + }, + "output_state": { + "Name": "minecraft:mossy_cobblestone" + } + }, + { + "input_predicate": { + "block": "minecraft:cobblestone_stairs", + "predicate_type": "minecraft:random_block_match", + "probability": 0.5 + }, + "location_predicate": { + "predicate_type": "minecraft:always_true" + }, + "output_state": { + "Name": "minecraft:mossy_cobblestone_stairs", + "Properties": { + "facing": "north", + "half": "bottom", + "shape": "straight", + "waterlogged": "false" + } + } + }, + { + "input_predicate": { + "block": "minecraft:cobblestone_slab", + "predicate_type": "minecraft:random_block_match", + "probability": 0.5 + }, + "location_predicate": { + "predicate_type": "minecraft:always_true" + }, + "output_state": { + "Name": "minecraft:mossy_cobblestone_slab", + "Properties": { + "type": "bottom", + "waterlogged": "false" + } + } + }, + { + "input_predicate": { + "block": "minecraft:cobblestone_wall", + "predicate_type": "minecraft:random_block_match", + "probability": 0.5 + }, + "location_predicate": { + "predicate_type": "minecraft:always_true" + }, + "output_state": { + "Name": "minecraft:mossy_cobblestone_wall", + "Properties": { + "east": "none", + "north": "none", + "south": "none", + "up": "true", + "waterlogged": "false", + "west": "none" + } + } + } + ], + "target_palettes": "#twilightforest:well_swizzle_mask" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/small_andesite.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/small_andesite.json new file mode 100644 index 0000000000..b4e59b7c24 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/small_andesite.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:ore", + "config": { + "discard_chance_on_air_exposure": 0.0, + "size": 16, + "targets": [ + { + "state": { + "Name": "minecraft:andesite" + }, + "target": { + "predicate_type": "minecraft:tag_match", + "tag": "minecraft:stone_ore_replaceables" + } + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/small_diorite.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/small_diorite.json new file mode 100644 index 0000000000..b882237d84 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/small_diorite.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:ore", + "config": { + "discard_chance_on_air_exposure": 0.0, + "size": 16, + "targets": [ + { + "state": { + "Name": "minecraft:diorite" + }, + "target": { + "predicate_type": "minecraft:tag_match", + "tag": "minecraft:stone_ore_replaceables" + } + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/small_granite.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/small_granite.json new file mode 100644 index 0000000000..059eedce0c --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/small_granite.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:ore", + "config": { + "discard_chance_on_air_exposure": 0.0, + "size": 16, + "targets": [ + { + "state": { + "Name": "minecraft:granite" + }, + "target": { + "predicate_type": "minecraft:tag_match", + "tag": "minecraft:stone_ore_replaceables" + } + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/smoker.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/smoker.json new file mode 100644 index 0000000000..daf47cafc8 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/smoker.json @@ -0,0 +1,8 @@ +{ + "type": "twilightforest:fire_jet", + "config": { + "state": { + "Name": "twilightforest:smoker" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/snow_under_trees.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/snow_under_trees.json new file mode 100644 index 0000000000..59b6e6a082 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/snow_under_trees.json @@ -0,0 +1,4 @@ +{ + "type": "twilightforest:snow_under_trees", + "config": {} +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/spruce_fallen_log.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/spruce_fallen_log.json new file mode 100644 index 0000000000..13cddd9e8f --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/spruce_fallen_log.json @@ -0,0 +1,18 @@ +{ + "type": "twilightforest:fallen_small_log", + "config": { + "hollow": { + "Name": "twilightforest:hollow_spruce_log_horizontal", + "Properties": { + "axis": "x", + "variant": "empty" + } + }, + "normal": { + "Name": "minecraft:spruce_log", + "Properties": { + "axis": "y" + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/stone_circle.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/stone_circle.json new file mode 100644 index 0000000000..5f563b5548 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/stone_circle.json @@ -0,0 +1,4 @@ +{ + "type": "twilightforest:stone_circle", + "config": {} +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/tf_oak_fallen_log.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/tf_oak_fallen_log.json new file mode 100644 index 0000000000..4421ed4419 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/tf_oak_fallen_log.json @@ -0,0 +1,18 @@ +{ + "type": "twilightforest:fallen_small_log", + "config": { + "hollow": { + "Name": "twilightforest:hollow_twilight_oak_log_horizontal", + "Properties": { + "axis": "x", + "variant": "empty" + } + }, + "normal": { + "Name": "twilightforest:twilight_oak_log", + "Properties": { + "axis": "y" + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/thorns.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/thorns.json new file mode 100644 index 0000000000..aefa49e85e --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/thorns.json @@ -0,0 +1,9 @@ +{ + "type": "twilightforest:thorns", + "config": { + "chance_leaf_is_rose": 50, + "chance_of_branch": 3, + "chance_of_leaf": 3, + "max_spread": 7 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/torch_berries.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/torch_berries.json new file mode 100644 index 0000000000..4eff7fd2cb --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/torch_berries.json @@ -0,0 +1,11 @@ +{ + "type": "twilightforest:underground_plants", + "config": { + "state": { + "Name": "twilightforest:torchberry_plant", + "Properties": { + "has_torchberries": "true" + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/canopy_tree.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/canopy_tree.json new file mode 100644 index 0000000000..bf4e0a35ff --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/canopy_tree.json @@ -0,0 +1,105 @@ +{ + "type": "minecraft:tree", + "config": { + "decorators": [ + { + "type": "twilightforest:trunkside_decorator", + "deco_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "twilightforest:firefly", + "Properties": { + "facing": "up", + "waterlogged": "false" + } + } + }, + "placement_count": 2, + "probability_of_placement": 1.0 + }, + { + "type": "twilightforest:tree_roots", + "additional_random_strands": 1, + "base_strand_count": 3, + "ground_roots_provider": { + "type": "minecraft:weighted_state_provider", + "entries": [ + { + "data": { + "Name": "twilightforest:root" + }, + "weight": 6 + }, + { + "data": { + "Name": "twilightforest:liveroot_block" + }, + "weight": 1 + } + ] + }, + "root_length": 5 + } + ], + "dirt_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "minecraft:dirt" + } + }, + "foliage_placer": { + "type": "twilightforest:spheroid_foliage_placer", + "horizontal_radius": 4.5, + "offset": 0, + "random_add_horizontal": 1, + "random_add_vertical": 0, + "shag_factor": 24, + "vertical_filler_bias": -0.25, + "vertical_radius": 1.5 + }, + "foliage_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "twilightforest:canopy_leaves", + "Properties": { + "distance": "7", + "persistent": "false", + "waterlogged": "false" + } + } + }, + "force_dirt": false, + "ignore_vines": true, + "minimum_size": { + "type": "minecraft:two_layers_feature_size", + "limit": 20, + "lower_size": 0, + "upper_size": 5 + }, + "trunk_placer": { + "type": "twilightforest:branching_trunk_placer", + "base_height": 20, + "branch_config": { + "count_minimum": 3, + "downwards_pitch": 0.2, + "length": 10.0, + "random_add_count": 1, + "random_add_length": 1.0, + "spacing_yaw": 0.3 + }, + "branch_start_offset_down": 7, + "height_rand_a": 5, + "height_rand_b": 5, + "perpendicular_branches": false + }, + "trunk_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "twilightforest:canopy_log", + "Properties": { + "axis": "y" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/dark_forest_birch_tree.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/dark_forest_birch_tree.json new file mode 100644 index 0000000000..61b622d6da --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/dark_forest_birch_tree.json @@ -0,0 +1,52 @@ +{ + "type": "twilightforest:dark_canopy_tree", + "config": { + "decorators": [], + "dirt_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "minecraft:dirt" + } + }, + "foliage_placer": { + "type": "minecraft:blob_foliage_placer", + "height": 3, + "offset": 0, + "radius": 2 + }, + "foliage_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "minecraft:birch_leaves", + "Properties": { + "distance": "7", + "persistent": "false", + "waterlogged": "false" + } + } + }, + "force_dirt": false, + "ignore_vines": true, + "minimum_size": { + "type": "minecraft:two_layers_feature_size", + "limit": 1, + "lower_size": 0, + "upper_size": 1 + }, + "trunk_placer": { + "type": "minecraft:straight_trunk_placer", + "base_height": 5, + "height_rand_a": 2, + "height_rand_b": 0 + }, + "trunk_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "minecraft:birch_log", + "Properties": { + "axis": "y" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/dark_forest_oak_tree.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/dark_forest_oak_tree.json new file mode 100644 index 0000000000..cd070d7277 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/dark_forest_oak_tree.json @@ -0,0 +1,52 @@ +{ + "type": "twilightforest:dark_canopy_tree", + "config": { + "decorators": [], + "dirt_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "minecraft:dirt" + } + }, + "foliage_placer": { + "type": "minecraft:blob_foliage_placer", + "height": 3, + "offset": 0, + "radius": 2 + }, + "foliage_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "minecraft:oak_leaves", + "Properties": { + "distance": "7", + "persistent": "false", + "waterlogged": "false" + } + } + }, + "force_dirt": false, + "ignore_vines": true, + "minimum_size": { + "type": "minecraft:two_layers_feature_size", + "limit": 1, + "lower_size": 0, + "upper_size": 1 + }, + "trunk_placer": { + "type": "minecraft:straight_trunk_placer", + "base_height": 4, + "height_rand_a": 2, + "height_rand_b": 0 + }, + "trunk_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "minecraft:oak_log", + "Properties": { + "axis": "y" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/darkwood_lantern_tree.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/darkwood_lantern_tree.json new file mode 100644 index 0000000000..48758750c0 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/darkwood_lantern_tree.json @@ -0,0 +1,126 @@ +{ + "type": "twilightforest:dark_canopy_tree", + "config": { + "decorators": [ + { + "type": "twilightforest:tree_roots", + "additional_random_strands": 1, + "base_strand_count": 3, + "ground_roots_provider": { + "type": "minecraft:weighted_state_provider", + "entries": [ + { + "data": { + "Name": "twilightforest:root" + }, + "weight": 6 + }, + { + "data": { + "Name": "twilightforest:liveroot_block" + }, + "weight": 1 + } + ] + }, + "root_length": 5 + }, + { + "type": "twilightforest:dangle_from_tree_decorator", + "attempts_minimum": 0, + "baggage_provider": { + "entries": [ + { + "data": { + "Name": "minecraft:lantern", + "Properties": { + "hanging": "true", + "waterlogged": "false" + } + }, + "weight": 1 + } + ] + }, + "base_length": 4, + "minimum_required_length": 2, + "random_add_attempts": 1, + "random_add_length": 2, + "rope_provider": { + "entries": [ + { + "data": { + "Name": "minecraft:chain", + "Properties": { + "axis": "y", + "waterlogged": "false" + } + }, + "weight": 1 + } + ] + } + } + ], + "dirt_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "minecraft:dirt" + } + }, + "foliage_placer": { + "type": "twilightforest:spheroid_foliage_placer", + "horizontal_radius": 4.5, + "offset": 0, + "random_add_horizontal": 1, + "random_add_vertical": 0, + "shag_factor": 36, + "vertical_filler_bias": 0.45, + "vertical_radius": 2.25 + }, + "foliage_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "twilightforest:dark_leaves", + "Properties": { + "distance": "7", + "persistent": "false", + "waterlogged": "false" + } + } + }, + "force_dirt": false, + "ignore_vines": true, + "minimum_size": { + "type": "minecraft:two_layers_feature_size", + "limit": 4, + "lower_size": 1, + "upper_size": 1 + }, + "trunk_placer": { + "type": "twilightforest:branching_trunk_placer", + "base_height": 9, + "branch_config": { + "count_minimum": 4, + "downwards_pitch": 0.23, + "length": 8.0, + "random_add_count": 0, + "random_add_length": 2.0, + "spacing_yaw": 0.23 + }, + "branch_start_offset_down": 3, + "height_rand_a": 1, + "height_rand_b": 1, + "perpendicular_branches": false + }, + "trunk_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "twilightforest:dark_log", + "Properties": { + "axis": "y" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/darkwood_tree.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/darkwood_tree.json new file mode 100644 index 0000000000..c8404de73c --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/darkwood_tree.json @@ -0,0 +1,85 @@ +{ + "type": "twilightforest:dark_canopy_tree", + "config": { + "decorators": [ + { + "type": "twilightforest:tree_roots", + "additional_random_strands": 1, + "base_strand_count": 3, + "ground_roots_provider": { + "type": "minecraft:weighted_state_provider", + "entries": [ + { + "data": { + "Name": "twilightforest:root" + }, + "weight": 6 + }, + { + "data": { + "Name": "twilightforest:liveroot_block" + }, + "weight": 1 + } + ] + }, + "root_length": 5 + } + ], + "dirt_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "minecraft:dirt" + } + }, + "foliage_placer": { + "type": "twilightforest:spheroid_foliage_placer", + "horizontal_radius": 4.5, + "offset": 0, + "random_add_horizontal": 1, + "random_add_vertical": 0, + "shag_factor": 36, + "vertical_filler_bias": 0.45, + "vertical_radius": 2.25 + }, + "foliage_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "twilightforest:hardened_dark_leaves" + } + }, + "force_dirt": false, + "ignore_vines": true, + "minimum_size": { + "type": "minecraft:two_layers_feature_size", + "limit": 4, + "lower_size": 1, + "upper_size": 1 + }, + "trunk_placer": { + "type": "twilightforest:branching_trunk_placer", + "base_height": 9, + "branch_config": { + "count_minimum": 4, + "downwards_pitch": 0.23, + "length": 8.0, + "random_add_count": 0, + "random_add_length": 2.0, + "spacing_yaw": 0.23 + }, + "branch_start_offset_down": 3, + "height_rand_a": 1, + "height_rand_b": 1, + "perpendicular_branches": false + }, + "trunk_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "twilightforest:dark_log", + "Properties": { + "axis": "y" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/dead_canopy_tree.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/dead_canopy_tree.json new file mode 100644 index 0000000000..08ba67d3f6 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/dead_canopy_tree.json @@ -0,0 +1,100 @@ +{ + "type": "minecraft:tree", + "config": { + "decorators": [ + { + "type": "twilightforest:trunkside_decorator", + "deco_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "twilightforest:firefly", + "Properties": { + "facing": "up", + "waterlogged": "false" + } + } + }, + "placement_count": 2, + "probability_of_placement": 1.0 + }, + { + "type": "twilightforest:tree_roots", + "additional_random_strands": 1, + "base_strand_count": 3, + "ground_roots_provider": { + "type": "minecraft:weighted_state_provider", + "entries": [ + { + "data": { + "Name": "twilightforest:root" + }, + "weight": 6 + }, + { + "data": { + "Name": "twilightforest:liveroot_block" + }, + "weight": 1 + } + ] + }, + "root_length": 5 + } + ], + "dirt_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "minecraft:dirt" + } + }, + "foliage_placer": { + "type": "twilightforest:spheroid_foliage_placer", + "horizontal_radius": 0.0, + "offset": 0, + "random_add_horizontal": 0, + "random_add_vertical": 0, + "shag_factor": 0, + "vertical_filler_bias": 0.0, + "vertical_radius": 0.0 + }, + "foliage_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "minecraft:air" + } + }, + "force_dirt": false, + "ignore_vines": true, + "minimum_size": { + "type": "minecraft:two_layers_feature_size", + "limit": 20, + "lower_size": 0, + "upper_size": 5 + }, + "trunk_placer": { + "type": "twilightforest:branching_trunk_placer", + "base_height": 20, + "branch_config": { + "count_minimum": 3, + "downwards_pitch": 0.2, + "length": 10.0, + "random_add_count": 1, + "random_add_length": 1.0, + "spacing_yaw": 0.3 + }, + "branch_start_offset_down": 7, + "height_rand_a": 5, + "height_rand_b": 5, + "perpendicular_branches": false + }, + "trunk_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "twilightforest:canopy_log", + "Properties": { + "axis": "y" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/dummy.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/dummy.json new file mode 100644 index 0000000000..b3f605f04e --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/dummy.json @@ -0,0 +1,4 @@ +{ + "type": "minecraft:no_op", + "config": {} +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/firefly_canopy_tree.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/firefly_canopy_tree.json new file mode 100644 index 0000000000..66d4cddf81 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/firefly_canopy_tree.json @@ -0,0 +1,177 @@ +{ + "type": "minecraft:tree", + "config": { + "decorators": [ + { + "type": "twilightforest:tree_roots", + "additional_random_strands": 1, + "base_strand_count": 3, + "ground_roots_provider": { + "type": "minecraft:weighted_state_provider", + "entries": [ + { + "data": { + "Name": "twilightforest:root" + }, + "weight": 6 + }, + { + "data": { + "Name": "twilightforest:liveroot_block" + }, + "weight": 1 + } + ] + }, + "root_length": 5 + }, + { + "type": "twilightforest:trunkside_decorator", + "deco_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "twilightforest:firefly", + "Properties": { + "facing": "up", + "waterlogged": "false" + } + } + }, + "placement_count": 2, + "probability_of_placement": 1.0 + }, + { + "type": "twilightforest:trunkside_decorator", + "deco_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "twilightforest:firefly", + "Properties": { + "facing": "north", + "waterlogged": "false" + } + } + }, + "placement_count": 4, + "probability_of_placement": 0.5 + }, + { + "type": "twilightforest:dangle_from_tree_decorator", + "attempts_minimum": 1, + "baggage_provider": { + "entries": [ + { + "data": { + "Name": "twilightforest:firefly_jar", + "Properties": { + "waterlogged": "false" + } + }, + "weight": 10 + }, + { + "data": { + "Name": "twilightforest:cicada_jar", + "Properties": { + "waterlogged": "false" + } + }, + "weight": 1 + } + ] + }, + "base_length": 5, + "minimum_required_length": 2, + "random_add_attempts": 1, + "random_add_length": 15, + "rope_provider": { + "entries": [ + { + "data": { + "Name": "twilightforest:canopy_fence", + "Properties": { + "east": "false", + "north": "false", + "south": "false", + "waterlogged": "false", + "west": "false" + } + }, + "weight": 3 + }, + { + "data": { + "Name": "minecraft:chain", + "Properties": { + "axis": "y", + "waterlogged": "false" + } + }, + "weight": 1 + } + ] + } + } + ], + "dirt_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "minecraft:dirt" + } + }, + "foliage_placer": { + "type": "twilightforest:spheroid_foliage_placer", + "horizontal_radius": 4.5, + "offset": 0, + "random_add_horizontal": 1, + "random_add_vertical": 0, + "shag_factor": 24, + "vertical_filler_bias": -0.25, + "vertical_radius": 1.5 + }, + "foliage_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "twilightforest:canopy_leaves", + "Properties": { + "distance": "7", + "persistent": "false", + "waterlogged": "false" + } + } + }, + "force_dirt": false, + "ignore_vines": true, + "minimum_size": { + "type": "minecraft:two_layers_feature_size", + "limit": 20, + "lower_size": 1, + "upper_size": 5 + }, + "trunk_placer": { + "type": "twilightforest:branching_trunk_placer", + "base_height": 20, + "branch_config": { + "count_minimum": 3, + "downwards_pitch": 0.2, + "length": 10.0, + "random_add_count": 1, + "random_add_length": 1.0, + "spacing_yaw": 0.3 + }, + "branch_start_offset_down": 7, + "height_rand_a": 5, + "height_rand_b": 5, + "perpendicular_branches": false + }, + "trunk_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "twilightforest:canopy_log", + "Properties": { + "axis": "y" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/forest_canopy_oak_tree.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/forest_canopy_oak_tree.json new file mode 100644 index 0000000000..135573b95d --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/forest_canopy_oak_tree.json @@ -0,0 +1,46 @@ +{ + "type": "twilightforest:canopy_oak", + "config": { + "add_first_five_chance": 1, + "add_second_five_chance": 1, + "branch_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "twilightforest:twilight_oak_wood", + "Properties": { + "axis": "y" + } + } + }, + "check_water": false, + "decorators": [], + "has_leaves": false, + "leaves_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "twilightforest:twilight_oak_leaves", + "Properties": { + "distance": "7", + "persistent": "false", + "waterlogged": "false" + } + } + }, + "minimum_size": 24, + "roots_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "twilightforest:root" + } + }, + "trunk_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "twilightforest:twilight_oak_log", + "Properties": { + "axis": "y" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/hollow_tree.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/hollow_tree.json new file mode 100644 index 0000000000..9d8977cf1f --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/hollow_tree.json @@ -0,0 +1,46 @@ +{ + "type": "twilightforest:hollow_tree", + "config": { + "add_first_five_chance": 1, + "add_second_five_chance": 1, + "branch_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "twilightforest:twilight_oak_wood", + "Properties": { + "axis": "y" + } + } + }, + "check_water": false, + "decorators": [], + "has_leaves": false, + "leaves_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "twilightforest:twilight_oak_leaves", + "Properties": { + "distance": "7", + "persistent": "false", + "waterlogged": "false" + } + } + }, + "minimum_size": 0, + "roots_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "twilightforest:root" + } + }, + "trunk_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "twilightforest:twilight_oak_log", + "Properties": { + "axis": "y" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/homegrown_darkwood_tree.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/homegrown_darkwood_tree.json new file mode 100644 index 0000000000..c83ebc0a5a --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/homegrown_darkwood_tree.json @@ -0,0 +1,90 @@ +{ + "type": "twilightforest:dark_canopy_tree", + "config": { + "decorators": [ + { + "type": "twilightforest:tree_roots", + "additional_random_strands": 1, + "base_strand_count": 3, + "ground_roots_provider": { + "type": "minecraft:weighted_state_provider", + "entries": [ + { + "data": { + "Name": "twilightforest:root" + }, + "weight": 6 + }, + { + "data": { + "Name": "twilightforest:liveroot_block" + }, + "weight": 1 + } + ] + }, + "root_length": 5 + } + ], + "dirt_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "minecraft:dirt" + } + }, + "foliage_placer": { + "type": "twilightforest:spheroid_foliage_placer", + "horizontal_radius": 4.5, + "offset": 0, + "random_add_horizontal": 1, + "random_add_vertical": 0, + "shag_factor": 36, + "vertical_filler_bias": 0.45, + "vertical_radius": 2.25 + }, + "foliage_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "twilightforest:dark_leaves", + "Properties": { + "distance": "7", + "persistent": "false", + "waterlogged": "false" + } + } + }, + "force_dirt": false, + "ignore_vines": true, + "minimum_size": { + "type": "minecraft:two_layers_feature_size", + "limit": 4, + "lower_size": 1, + "upper_size": 1 + }, + "trunk_placer": { + "type": "twilightforest:branching_trunk_placer", + "base_height": 9, + "branch_config": { + "count_minimum": 4, + "downwards_pitch": 0.23, + "length": 8.0, + "random_add_count": 0, + "random_add_length": 2.0, + "spacing_yaw": 0.23 + }, + "branch_start_offset_down": 3, + "height_rand_a": 1, + "height_rand_b": 1, + "perpendicular_branches": false + }, + "trunk_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "twilightforest:dark_log", + "Properties": { + "axis": "y" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/large_rainbow_oak.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/large_rainbow_oak.json new file mode 100644 index 0000000000..f57c01a1ed --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/large_rainbow_oak.json @@ -0,0 +1,77 @@ +{ + "type": "minecraft:tree", + "config": { + "decorators": [ + { + "type": "twilightforest:tree_roots", + "additional_random_strands": 1, + "base_strand_count": 3, + "ground_roots_provider": { + "type": "minecraft:weighted_state_provider", + "entries": [ + { + "data": { + "Name": "twilightforest:root" + }, + "weight": 6 + }, + { + "data": { + "Name": "twilightforest:liveroot_block" + }, + "weight": 1 + } + ] + }, + "root_length": 5 + } + ], + "dirt_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "minecraft:dirt" + } + }, + "foliage_placer": { + "type": "minecraft:fancy_foliage_placer", + "height": 4, + "offset": 4, + "radius": 2 + }, + "foliage_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "twilightforest:rainbow_oak_leaves", + "Properties": { + "distance": "7", + "persistent": "false", + "waterlogged": "false" + } + } + }, + "force_dirt": false, + "ignore_vines": false, + "minimum_size": { + "type": "minecraft:two_layers_feature_size", + "limit": 4, + "lower_size": 1, + "min_clipped_height": 4, + "upper_size": 0 + }, + "trunk_placer": { + "type": "minecraft:fancy_trunk_placer", + "base_height": 3, + "height_rand_a": 11, + "height_rand_b": 0 + }, + "trunk_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "twilightforest:twilight_oak_log", + "Properties": { + "axis": "y" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/large_twilight_oak_tree.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/large_twilight_oak_tree.json new file mode 100644 index 0000000000..bc0b8a2ba7 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/large_twilight_oak_tree.json @@ -0,0 +1,77 @@ +{ + "type": "minecraft:tree", + "config": { + "decorators": [ + { + "type": "twilightforest:tree_roots", + "additional_random_strands": 1, + "base_strand_count": 3, + "ground_roots_provider": { + "type": "minecraft:weighted_state_provider", + "entries": [ + { + "data": { + "Name": "twilightforest:root" + }, + "weight": 6 + }, + { + "data": { + "Name": "twilightforest:liveroot_block" + }, + "weight": 1 + } + ] + }, + "root_length": 5 + } + ], + "dirt_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "minecraft:dirt" + } + }, + "foliage_placer": { + "type": "minecraft:fancy_foliage_placer", + "height": 4, + "offset": 4, + "radius": 2 + }, + "foliage_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "twilightforest:twilight_oak_leaves", + "Properties": { + "distance": "7", + "persistent": "false", + "waterlogged": "false" + } + } + }, + "force_dirt": false, + "ignore_vines": false, + "minimum_size": { + "type": "minecraft:two_layers_feature_size", + "limit": 4, + "lower_size": 1, + "min_clipped_height": 4, + "upper_size": 0 + }, + "trunk_placer": { + "type": "minecraft:fancy_trunk_placer", + "base_height": 3, + "height_rand_a": 11, + "height_rand_b": 0 + }, + "trunk_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "twilightforest:twilight_oak_log", + "Properties": { + "axis": "y" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/large_winter_tree.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/large_winter_tree.json new file mode 100644 index 0000000000..3a95de3e4d --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/large_winter_tree.json @@ -0,0 +1,46 @@ +{ + "type": "twilightforest:large_winter_tree", + "config": { + "add_first_five_chance": 1, + "add_second_five_chance": 1, + "branch_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "minecraft:spruce_log", + "Properties": { + "axis": "y" + } + } + }, + "check_water": false, + "decorators": [], + "has_leaves": false, + "leaves_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "minecraft:spruce_leaves", + "Properties": { + "distance": "7", + "persistent": "false", + "waterlogged": "false" + } + } + }, + "minimum_size": 0, + "roots_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "twilightforest:root" + } + }, + "trunk_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "minecraft:spruce_log", + "Properties": { + "axis": "y" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/mangrove_tree.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/mangrove_tree.json new file mode 100644 index 0000000000..430d1a84bc --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/mangrove_tree.json @@ -0,0 +1,119 @@ +{ + "type": "minecraft:tree", + "config": { + "decorators": [ + { + "type": "twilightforest:trunkside_decorator", + "deco_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "twilightforest:firefly", + "Properties": { + "facing": "up", + "waterlogged": "false" + } + } + }, + "placement_count": 2, + "probability_of_placement": 1.0 + }, + { + "type": "twilightforest:tree_roots", + "additional_random_strands": 1, + "base_strand_count": 3, + "exposed_roots_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "twilightforest:mangrove_root" + } + }, + "ground_roots_provider": { + "type": "minecraft:weighted_state_provider", + "entries": [ + { + "data": { + "Name": "twilightforest:root" + }, + "weight": 4 + }, + { + "data": { + "Name": "twilightforest:liveroot_block" + }, + "weight": 1 + } + ] + }, + "root_length": 12 + }, + { + "type": "minecraft:leave_vine", + "probability": 0.125 + } + ], + "dirt_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "minecraft:dirt" + } + }, + "foliage_placer": { + "type": "twilightforest:spheroid_foliage_placer", + "horizontal_radius": 2.5, + "offset": 0, + "random_add_horizontal": 2, + "random_add_vertical": 0, + "shag_factor": 15, + "vertical_filler_bias": -0.25, + "vertical_radius": 1.5 + }, + "foliage_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "twilightforest:mangrove_leaves", + "Properties": { + "distance": "7", + "persistent": "false", + "waterlogged": "false" + } + } + }, + "force_dirt": false, + "ignore_vines": false, + "minimum_size": { + "type": "minecraft:two_layers_feature_size", + "limit": 4, + "lower_size": 1, + "upper_size": 1 + }, + "trunk_placer": { + "type": "twilightforest:trunk_mover_upper", + "offset_up": 5, + "trunk_placer": { + "type": "twilightforest:branching_trunk_placer", + "base_height": 6, + "branch_config": { + "count_minimum": 0, + "downwards_pitch": 0.25, + "length": 6.0, + "random_add_count": 3, + "random_add_length": 2.0, + "spacing_yaw": 0.3 + }, + "branch_start_offset_down": 1, + "height_rand_a": 4, + "height_rand_b": 0, + "perpendicular_branches": false + } + }, + "trunk_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "twilightforest:mangrove_log", + "Properties": { + "axis": "y" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/mega_spruce_tree.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/mega_spruce_tree.json new file mode 100644 index 0000000000..10d281ba48 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/mega_spruce_tree.json @@ -0,0 +1,58 @@ +{ + "type": "minecraft:tree", + "config": { + "decorators": [], + "dirt_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "minecraft:dirt" + } + }, + "foliage_placer": { + "type": "minecraft:mega_pine_foliage_placer", + "crown_height": { + "type": "minecraft:uniform", + "value": { + "max_inclusive": 17, + "min_inclusive": 13 + } + }, + "offset": 0, + "radius": 0 + }, + "foliage_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "minecraft:spruce_leaves", + "Properties": { + "distance": "7", + "persistent": "false", + "waterlogged": "false" + } + } + }, + "force_dirt": false, + "ignore_vines": false, + "minimum_size": { + "type": "minecraft:two_layers_feature_size", + "limit": 4, + "lower_size": 1, + "upper_size": 2 + }, + "trunk_placer": { + "type": "minecraft:giant_trunk_placer", + "base_height": 13, + "height_rand_a": 2, + "height_rand_b": 14 + }, + "trunk_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "minecraft:spruce_log", + "Properties": { + "axis": "y" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/mining_tree.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/mining_tree.json new file mode 100644 index 0000000000..1e1e959680 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/mining_tree.json @@ -0,0 +1,46 @@ +{ + "type": "twilightforest:miners_tree", + "config": { + "add_first_five_chance": 1, + "add_second_five_chance": 1, + "branch_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "twilightforest:mining_wood", + "Properties": { + "axis": "y" + } + } + }, + "check_water": false, + "decorators": [], + "has_leaves": false, + "leaves_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "twilightforest:mining_leaves", + "Properties": { + "distance": "7", + "persistent": "false", + "waterlogged": "false" + } + } + }, + "minimum_size": 0, + "roots_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "twilightforest:root" + } + }, + "trunk_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "twilightforest:mining_log", + "Properties": { + "axis": "y" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/rainbow_oak.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/rainbow_oak.json new file mode 100644 index 0000000000..8aa638d527 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/rainbow_oak.json @@ -0,0 +1,76 @@ +{ + "type": "minecraft:tree", + "config": { + "decorators": [ + { + "type": "twilightforest:tree_roots", + "additional_random_strands": 1, + "base_strand_count": 3, + "ground_roots_provider": { + "type": "minecraft:weighted_state_provider", + "entries": [ + { + "data": { + "Name": "twilightforest:root" + }, + "weight": 6 + }, + { + "data": { + "Name": "twilightforest:liveroot_block" + }, + "weight": 1 + } + ] + }, + "root_length": 5 + } + ], + "dirt_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "minecraft:dirt" + } + }, + "foliage_placer": { + "type": "minecraft:blob_foliage_placer", + "height": 3, + "offset": 0, + "radius": 2 + }, + "foliage_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "twilightforest:rainbow_oak_leaves", + "Properties": { + "distance": "7", + "persistent": "false", + "waterlogged": "false" + } + } + }, + "force_dirt": false, + "ignore_vines": false, + "minimum_size": { + "type": "minecraft:two_layers_feature_size", + "limit": 1, + "lower_size": 1, + "upper_size": 1 + }, + "trunk_placer": { + "type": "minecraft:straight_trunk_placer", + "base_height": 4, + "height_rand_a": 2, + "height_rand_b": 0 + }, + "trunk_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "twilightforest:twilight_oak_log", + "Properties": { + "axis": "y" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/savannah_canopy_oak_tree.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/savannah_canopy_oak_tree.json new file mode 100644 index 0000000000..81cb24130a --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/savannah_canopy_oak_tree.json @@ -0,0 +1,46 @@ +{ + "type": "twilightforest:canopy_oak", + "config": { + "add_first_five_chance": 1, + "add_second_five_chance": 1, + "branch_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "twilightforest:twilight_oak_wood", + "Properties": { + "axis": "y" + } + } + }, + "check_water": false, + "decorators": [], + "has_leaves": false, + "leaves_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "twilightforest:twilight_oak_leaves", + "Properties": { + "distance": "7", + "persistent": "false", + "waterlogged": "false" + } + } + }, + "minimum_size": 16, + "roots_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "twilightforest:root" + } + }, + "trunk_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "twilightforest:twilight_oak_log", + "Properties": { + "axis": "y" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/selector/canopy_trees.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/selector/canopy_trees.json new file mode 100644 index 0000000000..0b1d32d694 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/selector/canopy_trees.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:random_selector", + "config": { + "default": { + "feature": "twilightforest:tree/twilight_oak_tree", + "placement": [] + }, + "features": [ + { + "chance": 0.6, + "feature": { + "feature": "twilightforest:tree/canopy_tree", + "placement": [] + } + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/selector/dark_forest_trees.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/selector/dark_forest_trees.json new file mode 100644 index 0000000000..28075e3f73 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/selector/dark_forest_trees.json @@ -0,0 +1,25 @@ +{ + "type": "minecraft:random_selector", + "config": { + "default": { + "feature": "twilightforest:tree/darkwood_tree", + "placement": [] + }, + "features": [ + { + "chance": 0.2, + "feature": { + "feature": "twilightforest:tree/dark_forest_birch_tree", + "placement": [] + } + }, + { + "chance": 0.2, + "feature": { + "feature": "twilightforest:tree/dark_forest_oak_tree", + "placement": [] + } + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/selector/dense_canopy_trees.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/selector/dense_canopy_trees.json new file mode 100644 index 0000000000..273f5137a5 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/selector/dense_canopy_trees.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:random_selector", + "config": { + "default": { + "feature": "twilightforest:tree/twilight_oak_tree", + "placement": [] + }, + "features": [ + { + "chance": 0.7, + "feature": { + "feature": "twilightforest:tree/canopy_tree", + "placement": [] + } + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/selector/enchanted_forest_trees.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/selector/enchanted_forest_trees.json new file mode 100644 index 0000000000..ad3d97d430 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/selector/enchanted_forest_trees.json @@ -0,0 +1,32 @@ +{ + "type": "minecraft:random_selector", + "config": { + "default": { + "feature": "twilightforest:tree/rainbow_oak", + "placement": [] + }, + "features": [ + { + "chance": 0.15, + "feature": { + "feature": "twilightforest:tree/vanilla_oak_tree", + "placement": [] + } + }, + { + "chance": 0.15, + "feature": { + "feature": "twilightforest:tree/vanilla_birch_tree", + "placement": [] + } + }, + { + "chance": 0.1, + "feature": { + "feature": "twilightforest:tree/large_rainbow_oak", + "placement": [] + } + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/selector/firefly_forest_trees.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/selector/firefly_forest_trees.json new file mode 100644 index 0000000000..3bfc22198d --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/selector/firefly_forest_trees.json @@ -0,0 +1,25 @@ +{ + "type": "minecraft:random_selector", + "config": { + "default": { + "feature": "twilightforest:tree/twilight_oak_tree", + "placement": [] + }, + "features": [ + { + "chance": 0.33, + "feature": { + "feature": "twilightforest:tree/canopy_tree", + "placement": [] + } + }, + { + "chance": 0.45, + "feature": { + "feature": "twilightforest:tree/firefly_canopy_tree", + "placement": [] + } + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/selector/highlands_trees.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/selector/highlands_trees.json new file mode 100644 index 0000000000..f0bf148ae3 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/selector/highlands_trees.json @@ -0,0 +1,25 @@ +{ + "type": "minecraft:random_selector", + "config": { + "default": { + "feature": "twilightforest:tree/mega_spruce_tree", + "placement": [] + }, + "features": [ + { + "chance": 0.25, + "feature": { + "feature": "minecraft:spruce", + "placement": [] + } + }, + { + "chance": 0.1, + "feature": { + "feature": "minecraft:pine", + "placement": [] + } + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/selector/snowy_forest_trees.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/selector/snowy_forest_trees.json new file mode 100644 index 0000000000..73ede3aa36 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/selector/snowy_forest_trees.json @@ -0,0 +1,25 @@ +{ + "type": "minecraft:random_selector", + "config": { + "default": { + "feature": "twilightforest:tree/snowy_spruce_tree", + "placement": [] + }, + "features": [ + { + "chance": 0.1, + "feature": { + "feature": "twilightforest:tree/mega_spruce_tree", + "placement": [] + } + }, + { + "chance": 0.01, + "feature": { + "feature": "twilightforest:tree/large_winter_tree", + "placement": [] + } + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/selector/vanilla/vanilla_mushrooms.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/selector/vanilla/vanilla_mushrooms.json new file mode 100644 index 0000000000..a61a8d03eb --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/selector/vanilla/vanilla_mushrooms.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:random_boolean_selector", + "config": { + "feature_false": { + "feature": "minecraft:huge_brown_mushroom", + "placement": [] + }, + "feature_true": { + "feature": "minecraft:huge_red_mushroom", + "placement": [] + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/selector/vanilla_trees.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/selector/vanilla_trees.json new file mode 100644 index 0000000000..751d570c15 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/selector/vanilla_trees.json @@ -0,0 +1,25 @@ +{ + "type": "minecraft:random_selector", + "config": { + "default": { + "feature": "twilightforest:tree/twilight_oak_tree", + "placement": [] + }, + "features": [ + { + "chance": 0.25, + "feature": { + "feature": "twilightforest:tree/vanilla_birch_tree", + "placement": [] + } + }, + { + "chance": 0.25, + "feature": { + "feature": "twilightforest:tree/vanilla_oak_tree", + "placement": [] + } + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/smaller_jungle_tree.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/smaller_jungle_tree.json new file mode 100644 index 0000000000..c17f954dbd --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/smaller_jungle_tree.json @@ -0,0 +1,64 @@ +{ + "type": "minecraft:tree", + "config": { + "decorators": [ + { + "type": "minecraft:cocoa", + "probability": 0.7 + }, + { + "type": "minecraft:trunk_vine" + }, + { + "type": "minecraft:leave_vine", + "probability": 0.25 + } + ], + "dirt_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "minecraft:dirt" + } + }, + "foliage_placer": { + "type": "minecraft:blob_foliage_placer", + "height": 3, + "offset": 0, + "radius": 2 + }, + "foliage_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "minecraft:jungle_leaves", + "Properties": { + "distance": "7", + "persistent": "false", + "waterlogged": "false" + } + } + }, + "force_dirt": false, + "ignore_vines": true, + "minimum_size": { + "type": "minecraft:two_layers_feature_size", + "limit": 1, + "lower_size": 0, + "upper_size": 1 + }, + "trunk_placer": { + "type": "minecraft:straight_trunk_placer", + "base_height": 3, + "height_rand_a": 2, + "height_rand_b": 2 + }, + "trunk_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "minecraft:jungle_log", + "Properties": { + "axis": "y" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/snowy_spruce_tree.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/snowy_spruce_tree.json new file mode 100644 index 0000000000..eab3e5fdca --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/snowy_spruce_tree.json @@ -0,0 +1,70 @@ +{ + "type": "twilightforest:anywhere_tree", + "config": { + "decorators": [], + "dirt_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "minecraft:dirt" + } + }, + "foliage_placer": { + "type": "minecraft:spruce_foliage_placer", + "offset": { + "type": "minecraft:uniform", + "value": { + "max_inclusive": 2, + "min_inclusive": 0 + } + }, + "radius": { + "type": "minecraft:uniform", + "value": { + "max_inclusive": 3, + "min_inclusive": 2 + } + }, + "trunk_height": { + "type": "minecraft:uniform", + "value": { + "max_inclusive": 2, + "min_inclusive": 1 + } + } + }, + "foliage_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "minecraft:spruce_leaves", + "Properties": { + "distance": "7", + "persistent": "false", + "waterlogged": "false" + } + } + }, + "force_dirt": false, + "ignore_vines": true, + "minimum_size": { + "type": "minecraft:two_layers_feature_size", + "limit": 2, + "lower_size": 0, + "upper_size": 2 + }, + "trunk_placer": { + "type": "minecraft:straight_trunk_placer", + "base_height": 5, + "height_rand_a": 2, + "height_rand_b": 1 + }, + "trunk_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "minecraft:spruce_log", + "Properties": { + "axis": "y" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/sorting_tree.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/sorting_tree.json new file mode 100644 index 0000000000..6c55e9f117 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/sorting_tree.json @@ -0,0 +1,71 @@ +{ + "type": "minecraft:tree", + "config": { + "decorators": [ + { + "type": "twilightforest:core_placer", + "core_position": 2, + "deco_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "twilightforest:sorting_log_core", + "Properties": { + "active": "false", + "axis": "y" + } + } + } + } + ], + "dirt_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "minecraft:dirt" + } + }, + "foliage_placer": { + "type": "twilightforest:spheroid_foliage_placer", + "horizontal_radius": 1.5, + "offset": 0, + "random_add_horizontal": 1, + "random_add_vertical": 0, + "shag_factor": 0, + "vertical_filler_bias": 0.5, + "vertical_radius": 2.25 + }, + "foliage_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "twilightforest:sorting_leaves", + "Properties": { + "distance": "7", + "persistent": "false", + "waterlogged": "false" + } + } + }, + "force_dirt": true, + "ignore_vines": true, + "minimum_size": { + "type": "minecraft:two_layers_feature_size", + "limit": 1, + "lower_size": 1, + "upper_size": 1 + }, + "trunk_placer": { + "type": "minecraft:straight_trunk_placer", + "base_height": 3, + "height_rand_a": 0, + "height_rand_b": 0 + }, + "trunk_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "twilightforest:sorting_log", + "Properties": { + "axis": "y" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/swampy_oak_tree.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/swampy_oak_tree.json new file mode 100644 index 0000000000..63e5e83bfe --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/swampy_oak_tree.json @@ -0,0 +1,80 @@ +{ + "type": "minecraft:tree", + "config": { + "decorators": [ + { + "type": "twilightforest:tree_roots", + "additional_random_strands": 1, + "base_strand_count": 3, + "ground_roots_provider": { + "type": "minecraft:weighted_state_provider", + "entries": [ + { + "data": { + "Name": "twilightforest:root" + }, + "weight": 6 + }, + { + "data": { + "Name": "twilightforest:liveroot_block" + }, + "weight": 1 + } + ] + }, + "root_length": 5 + }, + { + "type": "minecraft:leave_vine", + "probability": 0.125 + } + ], + "dirt_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "minecraft:dirt" + } + }, + "foliage_placer": { + "type": "minecraft:blob_foliage_placer", + "height": 3, + "offset": 0, + "radius": 2 + }, + "foliage_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "twilightforest:twilight_oak_leaves", + "Properties": { + "distance": "7", + "persistent": "false", + "waterlogged": "false" + } + } + }, + "force_dirt": false, + "ignore_vines": false, + "minimum_size": { + "type": "minecraft:two_layers_feature_size", + "limit": 1, + "lower_size": 0, + "upper_size": 1 + }, + "trunk_placer": { + "type": "minecraft:straight_trunk_placer", + "base_height": 4, + "height_rand_a": 2, + "height_rand_b": 0 + }, + "trunk_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "twilightforest:twilight_oak_log", + "Properties": { + "axis": "y" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/time_tree.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/time_tree.json new file mode 100644 index 0000000000..3f82548c62 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/time_tree.json @@ -0,0 +1,46 @@ +{ + "type": "twilightforest:tree_of_time", + "config": { + "add_first_five_chance": 1, + "add_second_five_chance": 1, + "branch_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "twilightforest:time_wood", + "Properties": { + "axis": "y" + } + } + }, + "check_water": false, + "decorators": [], + "has_leaves": false, + "leaves_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "twilightforest:time_leaves", + "Properties": { + "distance": "7", + "persistent": "false", + "waterlogged": "false" + } + } + }, + "minimum_size": 0, + "roots_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "twilightforest:root" + } + }, + "trunk_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "twilightforest:time_log", + "Properties": { + "axis": "y" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/transformation_tree.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/transformation_tree.json new file mode 100644 index 0000000000..df8df29758 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/transformation_tree.json @@ -0,0 +1,81 @@ +{ + "type": "minecraft:tree", + "config": { + "decorators": [ + { + "type": "twilightforest:core_placer", + "core_position": 3, + "deco_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "twilightforest:transformation_log_core", + "Properties": { + "active": "false", + "axis": "y" + } + } + } + } + ], + "dirt_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "minecraft:dirt" + } + }, + "foliage_placer": { + "type": "twilightforest:spheroid_foliage_placer", + "horizontal_radius": 4.5, + "offset": 0, + "random_add_horizontal": 1, + "random_add_vertical": 0, + "shag_factor": 0, + "vertical_filler_bias": -0.25, + "vertical_radius": 1.5 + }, + "foliage_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "twilightforest:transformation_leaves", + "Properties": { + "distance": "7", + "persistent": "false", + "waterlogged": "false" + } + } + }, + "force_dirt": false, + "ignore_vines": true, + "minimum_size": { + "type": "minecraft:two_layers_feature_size", + "limit": 4, + "lower_size": 1, + "upper_size": 5 + }, + "trunk_placer": { + "type": "twilightforest:branching_trunk_placer", + "base_height": 6, + "branch_config": { + "count_minimum": 3, + "downwards_pitch": 0.2, + "length": 10.0, + "random_add_count": 1, + "random_add_length": 1.0, + "spacing_yaw": 0.3 + }, + "branch_start_offset_down": 7, + "height_rand_a": 5, + "height_rand_b": 5, + "perpendicular_branches": false + }, + "trunk_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "twilightforest:transformation_log", + "Properties": { + "axis": "y" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/twilight_oak_tree.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/twilight_oak_tree.json new file mode 100644 index 0000000000..22f57b9acb --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/twilight_oak_tree.json @@ -0,0 +1,76 @@ +{ + "type": "minecraft:tree", + "config": { + "decorators": [ + { + "type": "twilightforest:tree_roots", + "additional_random_strands": 1, + "base_strand_count": 3, + "ground_roots_provider": { + "type": "minecraft:weighted_state_provider", + "entries": [ + { + "data": { + "Name": "twilightforest:root" + }, + "weight": 6 + }, + { + "data": { + "Name": "twilightforest:liveroot_block" + }, + "weight": 1 + } + ] + }, + "root_length": 5 + } + ], + "dirt_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "minecraft:dirt" + } + }, + "foliage_placer": { + "type": "minecraft:blob_foliage_placer", + "height": 3, + "offset": 0, + "radius": 2 + }, + "foliage_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "twilightforest:twilight_oak_leaves", + "Properties": { + "distance": "7", + "persistent": "false", + "waterlogged": "false" + } + } + }, + "force_dirt": false, + "ignore_vines": false, + "minimum_size": { + "type": "minecraft:two_layers_feature_size", + "limit": 1, + "lower_size": 0, + "upper_size": 1 + }, + "trunk_placer": { + "type": "minecraft:straight_trunk_placer", + "base_height": 4, + "height_rand_a": 2, + "height_rand_b": 0 + }, + "trunk_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "twilightforest:twilight_oak_log", + "Properties": { + "axis": "y" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/vanilla_birch_tree.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/vanilla_birch_tree.json new file mode 100644 index 0000000000..6be310ef15 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/vanilla_birch_tree.json @@ -0,0 +1,52 @@ +{ + "type": "minecraft:tree", + "config": { + "decorators": [], + "dirt_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "minecraft:dirt" + } + }, + "foliage_placer": { + "type": "minecraft:blob_foliage_placer", + "height": 3, + "offset": 0, + "radius": 2 + }, + "foliage_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "minecraft:birch_leaves", + "Properties": { + "distance": "7", + "persistent": "false", + "waterlogged": "false" + } + } + }, + "force_dirt": false, + "ignore_vines": true, + "minimum_size": { + "type": "minecraft:two_layers_feature_size", + "limit": 1, + "lower_size": 0, + "upper_size": 1 + }, + "trunk_placer": { + "type": "minecraft:straight_trunk_placer", + "base_height": 5, + "height_rand_a": 2, + "height_rand_b": 0 + }, + "trunk_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "minecraft:birch_log", + "Properties": { + "axis": "y" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/vanilla_oak_tree.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/vanilla_oak_tree.json new file mode 100644 index 0000000000..4b1d6d34b6 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/tree/vanilla_oak_tree.json @@ -0,0 +1,52 @@ +{ + "type": "minecraft:tree", + "config": { + "decorators": [], + "dirt_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "minecraft:dirt" + } + }, + "foliage_placer": { + "type": "minecraft:blob_foliage_placer", + "height": 3, + "offset": 0, + "radius": 2 + }, + "foliage_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "minecraft:oak_leaves", + "Properties": { + "distance": "7", + "persistent": "false", + "waterlogged": "false" + } + } + }, + "force_dirt": false, + "ignore_vines": true, + "minimum_size": { + "type": "minecraft:two_layers_feature_size", + "limit": 1, + "lower_size": 0, + "upper_size": 1 + }, + "trunk_placer": { + "type": "minecraft:straight_trunk_placer", + "base_height": 4, + "height_rand_a": 2, + "height_rand_b": 0 + }, + "trunk_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "minecraft:oak_log", + "Properties": { + "axis": "y" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/troll_cave_dirt.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/troll_cave_dirt.json new file mode 100644 index 0000000000..323dc823b7 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/troll_cave_dirt.json @@ -0,0 +1,29 @@ +{ + "type": "twilightforest:mycelium_blob", + "config": { + "half_height": 0, + "radius": { + "type": "minecraft:uniform", + "value": { + "max_inclusive": 5, + "min_inclusive": 2 + } + }, + "state_provider": { + "fallback": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "minecraft:dirt" + } + }, + "rules": [] + }, + "target": { + "type": "minecraft:matching_blocks", + "blocks": [ + "minecraft:stone", + "twilightforest:deadrock" + ] + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/troll_cave_mycelium.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/troll_cave_mycelium.json new file mode 100644 index 0000000000..c308481db0 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/troll_cave_mycelium.json @@ -0,0 +1,32 @@ +{ + "type": "twilightforest:mycelium_blob", + "config": { + "half_height": 0, + "radius": { + "type": "minecraft:uniform", + "value": { + "max_inclusive": 5, + "min_inclusive": 3 + } + }, + "state_provider": { + "fallback": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "minecraft:mycelium", + "Properties": { + "snowy": "false" + } + } + }, + "rules": [] + }, + "target": { + "type": "minecraft:matching_blocks", + "blocks": [ + "minecraft:stone", + "twilightforest:deadrock" + ] + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/troll_roots.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/troll_roots.json new file mode 100644 index 0000000000..5c1964ac77 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/troll_roots.json @@ -0,0 +1,8 @@ +{ + "type": "twilightforest:troll_vines", + "config": { + "state": { + "Name": "twilightforest:trollvidr" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/uberous_soil_patch_big.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/uberous_soil_patch_big.json new file mode 100644 index 0000000000..3450f11baf --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/uberous_soil_patch_big.json @@ -0,0 +1,30 @@ +{ + "type": "twilightforest:mycelium_blob", + "config": { + "half_height": 1, + "radius": { + "type": "minecraft:uniform", + "value": { + "max_inclusive": 8, + "min_inclusive": 4 + } + }, + "state_provider": { + "fallback": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "twilightforest:uberous_soil" + } + }, + "rules": [] + }, + "target": { + "type": "minecraft:matching_blocks", + "blocks": [ + "minecraft:podzol", + "minecraft:coarse_dirt", + "minecraft:dirt" + ] + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/uberous_soil_patch_small.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/uberous_soil_patch_small.json new file mode 100644 index 0000000000..a8c0ae2024 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/uberous_soil_patch_small.json @@ -0,0 +1,30 @@ +{ + "type": "twilightforest:mycelium_blob", + "config": { + "half_height": 0, + "radius": { + "type": "minecraft:uniform", + "value": { + "max_inclusive": 3, + "min_inclusive": 2 + } + }, + "state_provider": { + "fallback": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "twilightforest:uberous_soil" + } + }, + "rules": [] + }, + "target": { + "type": "minecraft:matching_blocks", + "blocks": [ + "minecraft:podzol", + "minecraft:coarse_dirt", + "minecraft:dirt" + ] + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/vanilla_roots.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/vanilla_roots.json new file mode 100644 index 0000000000..1000b22c19 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/vanilla_roots.json @@ -0,0 +1,11 @@ +{ + "type": "twilightforest:underground_plants", + "config": { + "state": { + "Name": "minecraft:hanging_roots", + "Properties": { + "waterlogged": "false" + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/water_lake.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/water_lake.json new file mode 100644 index 0000000000..1117fa1e8d --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/water_lake.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:lake", + "config": { + "barrier": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "minecraft:stone" + } + }, + "fluid": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "minecraft:water", + "Properties": { + "level": "0" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/webs.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/webs.json new file mode 100644 index 0000000000..439bb9b2f5 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/webs.json @@ -0,0 +1,4 @@ +{ + "type": "twilightforest:webs", + "config": {} +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/configured_feature/well_placer.json b/src/generated/resources/data/twilightforest/worldgen/configured_feature/well_placer.json new file mode 100644 index 0000000000..4dbe78ba79 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/configured_feature/well_placer.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:random_selector", + "config": { + "default": { + "feature": "twilightforest:simple_well", + "placement": [] + }, + "features": [ + { + "chance": 0.05, + "feature": { + "feature": "twilightforest:fancy_well", + "placement": [] + } + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/noise_settings/skylight_noise_gen.json b/src/generated/resources/data/twilightforest/worldgen/noise_settings/skylight_noise_gen.json new file mode 100644 index 0000000000..0c2243905b --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/noise_settings/skylight_noise_gen.json @@ -0,0 +1,568 @@ +{ + "aquifers_enabled": false, + "default_block": { + "Name": "minecraft:stone" + }, + "default_fluid": { + "Name": "minecraft:water", + "Properties": { + "level": "0" + } + }, + "disable_mob_generation": false, + "legacy_random_source": false, + "noise": { + "height": 256, + "min_y": -32, + "size_horizontal": 2, + "size_vertical": 1 + }, + "noise_router": { + "barrier": 0.0, + "continents": 0.0, + "depth": 0.0, + "erosion": 0.0, + "final_density": 0.0, + "fluid_level_floodedness": 0.0, + "fluid_level_spread": 0.0, + "initial_density_without_jaggedness": 0.0, + "lava": 0.0, + "ridges": 0.0, + "temperature": 0.0, + "vegetation": 0.0, + "vein_gap": 0.0, + "vein_ridged": 0.0, + "vein_toggle": 0.0 + }, + "ore_veins_enabled": false, + "sea_level": 0, + "spawn_target": [], + "surface_rule": { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:vertical_gradient", + "false_at_and_above": { + "above_bottom": 5 + }, + "random_name": "minecraft:bedrock_floor", + "true_at_and_below": { + "above_bottom": 0 + } + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:bedrock" + } + } + }, + { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:biome", + "biome_is": [ + "twilightforest:highlands" + ] + }, + "then_run": { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:stone_depth", + "add_surface_depth": false, + "offset": 0, + "secondary_depth_range": 0, + "surface_type": "floor" + }, + "then_run": { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:podzol", + "Properties": { + "snowy": "false" + } + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:noise_threshold", + "max_threshold": 1.7976931348623157E308, + "min_threshold": 0.21212121212121213, + "noise": "minecraft:surface" + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:coarse_dirt" + } + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:noise_threshold", + "max_threshold": 1.7976931348623157E308, + "min_threshold": -0.11515151515151514, + "noise": "minecraft:surface" + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:podzol", + "Properties": { + "snowy": "false" + } + } + } + } + ] + } + } + } + ] + }, + { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:biome", + "biome_is": [ + "twilightforest:thornlands", + "twilightforest:final_plateau" + ] + }, + "then_run": { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:stone_depth", + "add_surface_depth": false, + "offset": 0, + "secondary_depth_range": 0, + "surface_type": "floor" + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "twilightforest:weathered_deadrock" + } + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:water", + "add_stone_depth": true, + "offset": -6, + "surface_depth_multiplier": -1 + }, + "then_run": { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:stone_depth", + "add_surface_depth": true, + "offset": 0, + "secondary_depth_range": 0, + "surface_type": "floor" + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "twilightforest:cracked_deadrock" + } + } + } + ] + } + }, + { + "type": "minecraft:block", + "result_state": { + "Name": "twilightforest:deadrock" + } + } + ] + } + } + ] + }, + { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:biome", + "biome_is": [ + "twilightforest:snowy_forest" + ] + }, + "then_run": { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:stone_depth", + "add_surface_depth": false, + "offset": 0, + "secondary_depth_range": 0, + "surface_type": "floor" + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:snow_block" + } + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:water", + "add_stone_depth": true, + "offset": -6, + "surface_depth_multiplier": -1 + }, + "then_run": { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:stone_depth", + "add_surface_depth": true, + "offset": 0, + "secondary_depth_range": 0, + "surface_type": "floor" + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:snow_block" + } + } + } + ] + } + } + ] + } + } + ] + }, + { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:biome", + "biome_is": [ + "twilightforest:glacier" + ] + }, + "then_run": { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:stone_depth", + "add_surface_depth": false, + "offset": 0, + "secondary_depth_range": 0, + "surface_type": "floor" + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:gravel" + } + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:water", + "add_stone_depth": true, + "offset": -6, + "surface_depth_multiplier": -1 + }, + "then_run": { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:stone_depth", + "add_surface_depth": true, + "offset": 0, + "secondary_depth_range": 0, + "surface_type": "floor" + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:gravel" + } + } + } + ] + } + } + ] + } + } + ] + }, + { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:stone_depth", + "add_surface_depth": false, + "offset": 0, + "secondary_depth_range": 0, + "surface_type": "floor" + }, + "then_run": { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:biome", + "biome_is": [ + "twilightforest:lake", + "twilightforest:stream" + ] + }, + "then_run": { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:stone_depth", + "add_surface_depth": false, + "offset": 0, + "secondary_depth_range": 0, + "surface_type": "ceiling" + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:sandstone" + } + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:water", + "add_stone_depth": false, + "offset": -1, + "surface_depth_multiplier": 0 + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:grass_block", + "Properties": { + "snowy": "false" + } + } + } + }, + { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:sand" + } + } + ] + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:biome", + "biome_is": [ + "twilightforest:swamp", + "twilightforest:fire_swamp" + ] + }, + "then_run": { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:water", + "add_stone_depth": false, + "offset": -1, + "surface_depth_multiplier": 0 + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:grass_block", + "Properties": { + "snowy": "false" + } + } + } + }, + { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:dirt" + } + } + ] + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:water", + "add_stone_depth": false, + "offset": -1, + "surface_depth_multiplier": 0 + }, + "then_run": { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:y_above", + "add_stone_depth": true, + "anchor": { + "absolute": -4 + }, + "surface_depth_multiplier": 1 + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:grass_block", + "Properties": { + "snowy": "false" + } + } + } + } + ] + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:not", + "invert": { + "type": "minecraft:y_above", + "add_stone_depth": true, + "anchor": { + "absolute": -4 + }, + "surface_depth_multiplier": 1 + } + }, + "then_run": { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:not", + "invert": { + "type": "minecraft:water", + "add_stone_depth": false, + "offset": -1, + "surface_depth_multiplier": 0 + } + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:dirt" + } + } + } + ] + } + } + ] + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:water", + "add_stone_depth": true, + "offset": -6, + "surface_depth_multiplier": -1 + }, + "then_run": { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:y_above", + "add_stone_depth": true, + "anchor": { + "absolute": -4 + }, + "surface_depth_multiplier": 1 + }, + "then_run": { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:stone_depth", + "add_surface_depth": true, + "offset": 0, + "secondary_depth_range": 0, + "surface_type": "floor" + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:dirt" + } + } + } + ] + } + } + ] + } + } + ] + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/noise_settings/twilight_noise_gen.json b/src/generated/resources/data/twilightforest/worldgen/noise_settings/twilight_noise_gen.json new file mode 100644 index 0000000000..3bd1070868 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/noise_settings/twilight_noise_gen.json @@ -0,0 +1,568 @@ +{ + "aquifers_enabled": false, + "default_block": { + "Name": "minecraft:stone" + }, + "default_fluid": { + "Name": "minecraft:water", + "Properties": { + "level": "0" + } + }, + "disable_mob_generation": false, + "legacy_random_source": false, + "noise": { + "height": 256, + "min_y": -32, + "size_horizontal": 1, + "size_vertical": 2 + }, + "noise_router": { + "barrier": 0.0, + "continents": 0.0, + "depth": 0.0, + "erosion": 0.0, + "final_density": 0.0, + "fluid_level_floodedness": 0.0, + "fluid_level_spread": 0.0, + "initial_density_without_jaggedness": 0.0, + "lava": 0.0, + "ridges": 0.0, + "temperature": 0.0, + "vegetation": 0.0, + "vein_gap": 0.0, + "vein_ridged": 0.0, + "vein_toggle": 0.0 + }, + "ore_veins_enabled": false, + "sea_level": 0, + "spawn_target": [], + "surface_rule": { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:vertical_gradient", + "false_at_and_above": { + "above_bottom": 5 + }, + "random_name": "minecraft:bedrock_floor", + "true_at_and_below": { + "above_bottom": 0 + } + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:bedrock" + } + } + }, + { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:biome", + "biome_is": [ + "twilightforest:highlands" + ] + }, + "then_run": { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:stone_depth", + "add_surface_depth": false, + "offset": 0, + "secondary_depth_range": 0, + "surface_type": "floor" + }, + "then_run": { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:podzol", + "Properties": { + "snowy": "false" + } + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:noise_threshold", + "max_threshold": 1.7976931348623157E308, + "min_threshold": 0.21212121212121213, + "noise": "minecraft:surface" + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:coarse_dirt" + } + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:noise_threshold", + "max_threshold": 1.7976931348623157E308, + "min_threshold": -0.11515151515151514, + "noise": "minecraft:surface" + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:podzol", + "Properties": { + "snowy": "false" + } + } + } + } + ] + } + } + } + ] + }, + { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:biome", + "biome_is": [ + "twilightforest:thornlands", + "twilightforest:final_plateau" + ] + }, + "then_run": { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:stone_depth", + "add_surface_depth": false, + "offset": 0, + "secondary_depth_range": 0, + "surface_type": "floor" + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "twilightforest:weathered_deadrock" + } + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:water", + "add_stone_depth": true, + "offset": -6, + "surface_depth_multiplier": -1 + }, + "then_run": { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:stone_depth", + "add_surface_depth": true, + "offset": 0, + "secondary_depth_range": 0, + "surface_type": "floor" + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "twilightforest:cracked_deadrock" + } + } + } + ] + } + }, + { + "type": "minecraft:block", + "result_state": { + "Name": "twilightforest:deadrock" + } + } + ] + } + } + ] + }, + { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:biome", + "biome_is": [ + "twilightforest:snowy_forest" + ] + }, + "then_run": { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:stone_depth", + "add_surface_depth": false, + "offset": 0, + "secondary_depth_range": 0, + "surface_type": "floor" + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:snow_block" + } + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:water", + "add_stone_depth": true, + "offset": -6, + "surface_depth_multiplier": -1 + }, + "then_run": { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:stone_depth", + "add_surface_depth": true, + "offset": 0, + "secondary_depth_range": 0, + "surface_type": "floor" + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:snow_block" + } + } + } + ] + } + } + ] + } + } + ] + }, + { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:biome", + "biome_is": [ + "twilightforest:glacier" + ] + }, + "then_run": { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:stone_depth", + "add_surface_depth": false, + "offset": 0, + "secondary_depth_range": 0, + "surface_type": "floor" + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:gravel" + } + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:water", + "add_stone_depth": true, + "offset": -6, + "surface_depth_multiplier": -1 + }, + "then_run": { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:stone_depth", + "add_surface_depth": true, + "offset": 0, + "secondary_depth_range": 0, + "surface_type": "floor" + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:gravel" + } + } + } + ] + } + } + ] + } + } + ] + }, + { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:stone_depth", + "add_surface_depth": false, + "offset": 0, + "secondary_depth_range": 0, + "surface_type": "floor" + }, + "then_run": { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:biome", + "biome_is": [ + "twilightforest:lake", + "twilightforest:stream" + ] + }, + "then_run": { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:stone_depth", + "add_surface_depth": false, + "offset": 0, + "secondary_depth_range": 0, + "surface_type": "ceiling" + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:sandstone" + } + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:water", + "add_stone_depth": false, + "offset": -1, + "surface_depth_multiplier": 0 + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:grass_block", + "Properties": { + "snowy": "false" + } + } + } + }, + { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:sand" + } + } + ] + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:biome", + "biome_is": [ + "twilightforest:swamp", + "twilightforest:fire_swamp" + ] + }, + "then_run": { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:water", + "add_stone_depth": false, + "offset": -1, + "surface_depth_multiplier": 0 + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:grass_block", + "Properties": { + "snowy": "false" + } + } + } + }, + { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:dirt" + } + } + ] + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:water", + "add_stone_depth": false, + "offset": -1, + "surface_depth_multiplier": 0 + }, + "then_run": { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:y_above", + "add_stone_depth": true, + "anchor": { + "absolute": -4 + }, + "surface_depth_multiplier": 1 + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:grass_block", + "Properties": { + "snowy": "false" + } + } + } + } + ] + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:not", + "invert": { + "type": "minecraft:y_above", + "add_stone_depth": true, + "anchor": { + "absolute": -4 + }, + "surface_depth_multiplier": 1 + } + }, + "then_run": { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:not", + "invert": { + "type": "minecraft:water", + "add_stone_depth": false, + "offset": -1, + "surface_depth_multiplier": 0 + } + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:dirt" + } + } + } + ] + } + } + ] + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:water", + "add_stone_depth": true, + "offset": -6, + "surface_depth_multiplier": -1 + }, + "then_run": { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:y_above", + "add_stone_depth": true, + "anchor": { + "absolute": -4 + }, + "surface_depth_multiplier": 1 + }, + "then_run": { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:stone_depth", + "add_surface_depth": true, + "offset": 0, + "secondary_depth_range": 0, + "surface_type": "floor" + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:dirt" + } + } + } + ] + } + } + ] + } + } + ] + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/placed_feature/big_mushgloom.json b/src/generated/resources/data/twilightforest/worldgen/placed_feature/big_mushgloom.json new file mode 100644 index 0000000000..388beda6d9 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/placed_feature/big_mushgloom.json @@ -0,0 +1,27 @@ +{ + "feature": "twilightforest:mushroom/big_mushgloom", + "placement": [ + { + "type": "minecraft:rarity_filter", + "chance": 1 + }, + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:heightmap", + "heightmap": "OCEAN_FLOOR" + }, + { + "type": "twilightforest:no_structure", + "value": { + "additional_clearance": 0, + "occupies_surface": true, + "occupies_underground": false + } + }, + { + "type": "minecraft:biome" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/placed_feature/canopy_fallen_log.json b/src/generated/resources/data/twilightforest/worldgen/placed_feature/canopy_fallen_log.json new file mode 100644 index 0000000000..eb7cda5827 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/placed_feature/canopy_fallen_log.json @@ -0,0 +1,24 @@ +{ + "feature": "twilightforest:canopy_fallen_log", + "placement": [ + { + "type": "minecraft:rarity_filter", + "chance": 40 + }, + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:heightmap", + "heightmap": "OCEAN_FLOOR" + }, + { + "type": "twilightforest:no_structure", + "value": { + "additional_clearance": 0, + "occupies_surface": true, + "occupies_underground": false + } + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/placed_feature/dark_dead_bushes.json b/src/generated/resources/data/twilightforest/worldgen/placed_feature/dark_dead_bushes.json new file mode 100644 index 0000000000..c4193c681a --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/placed_feature/dark_dead_bushes.json @@ -0,0 +1,16 @@ +{ + "feature": "twilightforest:dark_dead_bushes", + "placement": [ + { + "type": "minecraft:rarity_filter", + "chance": 15 + }, + { + "type": "minecraft:heightmap", + "heightmap": "WORLD_SURFACE_WG" + }, + { + "type": "minecraft:biome" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/placed_feature/dark_ferns.json b/src/generated/resources/data/twilightforest/worldgen/placed_feature/dark_ferns.json new file mode 100644 index 0000000000..46573d6792 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/placed_feature/dark_ferns.json @@ -0,0 +1,16 @@ +{ + "feature": "twilightforest:dark_ferns", + "placement": [ + { + "type": "minecraft:rarity_filter", + "chance": 4 + }, + { + "type": "minecraft:heightmap", + "heightmap": "WORLD_SURFACE_WG" + }, + { + "type": "minecraft:biome" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/placed_feature/dark_grass.json b/src/generated/resources/data/twilightforest/worldgen/placed_feature/dark_grass.json new file mode 100644 index 0000000000..01bf2c6a03 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/placed_feature/dark_grass.json @@ -0,0 +1,16 @@ +{ + "feature": "twilightforest:dark_grass", + "placement": [ + { + "type": "minecraft:rarity_filter", + "chance": 4 + }, + { + "type": "minecraft:heightmap", + "heightmap": "WORLD_SURFACE_WG" + }, + { + "type": "minecraft:biome" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/placed_feature/dark_mushglooms.json b/src/generated/resources/data/twilightforest/worldgen/placed_feature/dark_mushglooms.json new file mode 100644 index 0000000000..48ec51b20e --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/placed_feature/dark_mushglooms.json @@ -0,0 +1,16 @@ +{ + "feature": "twilightforest:dark_mushglooms", + "placement": [ + { + "type": "minecraft:rarity_filter", + "chance": 30 + }, + { + "type": "minecraft:heightmap", + "heightmap": "WORLD_SURFACE_WG" + }, + { + "type": "minecraft:biome" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/placed_feature/dark_mushrooms.json b/src/generated/resources/data/twilightforest/worldgen/placed_feature/dark_mushrooms.json new file mode 100644 index 0000000000..691a44d093 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/placed_feature/dark_mushrooms.json @@ -0,0 +1,12 @@ +{ + "feature": "twilightforest:dark_mushrooms", + "placement": [ + { + "type": "minecraft:heightmap", + "heightmap": "WORLD_SURFACE_WG" + }, + { + "type": "minecraft:biome" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/placed_feature/dark_pumpkins.json b/src/generated/resources/data/twilightforest/worldgen/placed_feature/dark_pumpkins.json new file mode 100644 index 0000000000..46d012ff3a --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/placed_feature/dark_pumpkins.json @@ -0,0 +1,16 @@ +{ + "feature": "twilightforest:dark_pumpkins", + "placement": [ + { + "type": "minecraft:rarity_filter", + "chance": 30 + }, + { + "type": "minecraft:heightmap", + "heightmap": "WORLD_SURFACE_WG" + }, + { + "type": "minecraft:biome" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/placed_feature/default_fallen_logs.json b/src/generated/resources/data/twilightforest/worldgen/placed_feature/default_fallen_logs.json new file mode 100644 index 0000000000..0ff5181cf6 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/placed_feature/default_fallen_logs.json @@ -0,0 +1,27 @@ +{ + "feature": "twilightforest:default_fallen_logs", + "placement": [ + { + "type": "minecraft:rarity_filter", + "chance": 40 + }, + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:heightmap", + "heightmap": "OCEAN_FLOOR" + }, + { + "type": "twilightforest:no_structure", + "value": { + "additional_clearance": 0, + "occupies_surface": true, + "occupies_underground": true + } + }, + { + "type": "minecraft:biome" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/placed_feature/druid_hut.json b/src/generated/resources/data/twilightforest/worldgen/placed_feature/druid_hut.json new file mode 100644 index 0000000000..f49370dd07 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/placed_feature/druid_hut.json @@ -0,0 +1,27 @@ +{ + "feature": "twilightforest:druid_hut", + "placement": [ + { + "type": "minecraft:rarity_filter", + "chance": 105 + }, + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:heightmap", + "heightmap": "OCEAN_FLOOR" + }, + { + "type": "twilightforest:no_structure", + "value": { + "additional_clearance": 0, + "occupies_surface": true, + "occupies_underground": true + } + }, + { + "type": "minecraft:biome" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/placed_feature/fallen_leaves.json b/src/generated/resources/data/twilightforest/worldgen/placed_feature/fallen_leaves.json new file mode 100644 index 0000000000..dd3d4a05eb --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/placed_feature/fallen_leaves.json @@ -0,0 +1,27 @@ +{ + "feature": "twilightforest:fallen_leaves", + "placement": [ + { + "type": "minecraft:rarity_filter", + "chance": 1 + }, + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:heightmap", + "heightmap": "OCEAN_FLOOR" + }, + { + "type": "twilightforest:no_structure", + "value": { + "additional_clearance": 0, + "occupies_surface": true, + "occupies_underground": false + } + }, + { + "type": "minecraft:biome" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/placed_feature/fiddlehead.json b/src/generated/resources/data/twilightforest/worldgen/placed_feature/fiddlehead.json new file mode 100644 index 0000000000..a3e7e76477 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/placed_feature/fiddlehead.json @@ -0,0 +1,12 @@ +{ + "feature": "twilightforest:fiddlehead", + "placement": [ + { + "type": "minecraft:heightmap", + "heightmap": "WORLD_SURFACE_WG" + }, + { + "type": "minecraft:biome" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/placed_feature/fire_jet.json b/src/generated/resources/data/twilightforest/worldgen/placed_feature/fire_jet.json new file mode 100644 index 0000000000..94cfca4080 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/placed_feature/fire_jet.json @@ -0,0 +1,15 @@ +{ + "feature": "twilightforest:fire_jet", + "placement": [ + { + "type": "minecraft:heightmap", + "heightmap": "WORLD_SURFACE_WG" + }, + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:biome" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/placed_feature/flower_placer.json b/src/generated/resources/data/twilightforest/worldgen/placed_feature/flower_placer.json new file mode 100644 index 0000000000..97d5ea4d0a --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/placed_feature/flower_placer.json @@ -0,0 +1,23 @@ +{ + "feature": "twilightforest:flower_placer", + "placement": [ + { + "type": "minecraft:heightmap", + "heightmap": "WORLD_SURFACE_WG" + }, + { + "type": "minecraft:count", + "count": 3 + }, + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:rarity_filter", + "chance": 2 + }, + { + "type": "minecraft:biome" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/placed_feature/flower_placer_alt.json b/src/generated/resources/data/twilightforest/worldgen/placed_feature/flower_placer_alt.json new file mode 100644 index 0000000000..6faa8cef7f --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/placed_feature/flower_placer_alt.json @@ -0,0 +1,23 @@ +{ + "feature": "twilightforest:flower_placer_alt", + "placement": [ + { + "type": "minecraft:heightmap", + "heightmap": "WORLD_SURFACE_WG" + }, + { + "type": "minecraft:count", + "count": 3 + }, + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:rarity_filter", + "chance": 2 + }, + { + "type": "minecraft:biome" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/placed_feature/foundation.json b/src/generated/resources/data/twilightforest/worldgen/placed_feature/foundation.json new file mode 100644 index 0000000000..b5fb872eeb --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/placed_feature/foundation.json @@ -0,0 +1,27 @@ +{ + "feature": "twilightforest:foundation", + "placement": [ + { + "type": "minecraft:rarity_filter", + "chance": 90 + }, + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:heightmap", + "heightmap": "OCEAN_FLOOR" + }, + { + "type": "twilightforest:no_structure", + "value": { + "additional_clearance": 0, + "occupies_surface": true, + "occupies_underground": false + } + }, + { + "type": "minecraft:biome" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/placed_feature/graveyard.json b/src/generated/resources/data/twilightforest/worldgen/placed_feature/graveyard.json new file mode 100644 index 0000000000..1106a53b88 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/placed_feature/graveyard.json @@ -0,0 +1,27 @@ +{ + "feature": "twilightforest:graveyard", + "placement": [ + { + "type": "minecraft:rarity_filter", + "chance": 70 + }, + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:heightmap", + "heightmap": "OCEAN_FLOOR" + }, + { + "type": "twilightforest:no_structure", + "value": { + "additional_clearance": 0, + "occupies_surface": true, + "occupies_underground": false + } + }, + { + "type": "minecraft:biome" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/placed_feature/grove_ruins.json b/src/generated/resources/data/twilightforest/worldgen/placed_feature/grove_ruins.json new file mode 100644 index 0000000000..64cc514530 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/placed_feature/grove_ruins.json @@ -0,0 +1,27 @@ +{ + "feature": "twilightforest:grove_ruins", + "placement": [ + { + "type": "minecraft:rarity_filter", + "chance": 110 + }, + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:heightmap", + "heightmap": "OCEAN_FLOOR" + }, + { + "type": "twilightforest:no_structure", + "value": { + "additional_clearance": 0, + "occupies_surface": true, + "occupies_underground": false + } + }, + { + "type": "minecraft:biome" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/placed_feature/hollow_log.json b/src/generated/resources/data/twilightforest/worldgen/placed_feature/hollow_log.json new file mode 100644 index 0000000000..60a54ce207 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/placed_feature/hollow_log.json @@ -0,0 +1,27 @@ +{ + "feature": "twilightforest:hollow_log", + "placement": [ + { + "type": "minecraft:rarity_filter", + "chance": 85 + }, + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:heightmap", + "heightmap": "OCEAN_FLOOR" + }, + { + "type": "twilightforest:no_structure", + "value": { + "additional_clearance": 0, + "occupies_surface": true, + "occupies_underground": false + } + }, + { + "type": "minecraft:biome" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/placed_feature/hollow_stump.json b/src/generated/resources/data/twilightforest/worldgen/placed_feature/hollow_stump.json new file mode 100644 index 0000000000..28cce5275d --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/placed_feature/hollow_stump.json @@ -0,0 +1,27 @@ +{ + "feature": "twilightforest:hollow_stump", + "placement": [ + { + "type": "minecraft:rarity_filter", + "chance": 80 + }, + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:heightmap", + "heightmap": "OCEAN_FLOOR" + }, + { + "type": "twilightforest:no_structure", + "value": { + "additional_clearance": 0, + "occupies_surface": true, + "occupies_underground": false + } + }, + { + "type": "minecraft:biome" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/placed_feature/huge_lily_pad.json b/src/generated/resources/data/twilightforest/worldgen/placed_feature/huge_lily_pad.json new file mode 100644 index 0000000000..fd49de515e --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/placed_feature/huge_lily_pad.json @@ -0,0 +1,23 @@ +{ + "feature": "twilightforest:huge_lily_pad", + "placement": [ + { + "type": "minecraft:heightmap", + "heightmap": "WORLD_SURFACE_WG" + }, + { + "type": "minecraft:rarity_filter", + "chance": 20 + }, + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:count", + "count": 10 + }, + { + "type": "minecraft:biome" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/placed_feature/huge_water_lily.json b/src/generated/resources/data/twilightforest/worldgen/placed_feature/huge_water_lily.json new file mode 100644 index 0000000000..ce18427dfe --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/placed_feature/huge_water_lily.json @@ -0,0 +1,23 @@ +{ + "feature": "twilightforest:huge_water_lily", + "placement": [ + { + "type": "minecraft:heightmap", + "heightmap": "WORLD_SURFACE_WG" + }, + { + "type": "minecraft:rarity_filter", + "chance": 25 + }, + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:count", + "count": 5 + }, + { + "type": "minecraft:biome" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/placed_feature/lamppost_placer.json b/src/generated/resources/data/twilightforest/worldgen/placed_feature/lamppost_placer.json new file mode 100644 index 0000000000..73970acd28 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/placed_feature/lamppost_placer.json @@ -0,0 +1,27 @@ +{ + "feature": "twilightforest:lamppost_placer", + "placement": [ + { + "type": "minecraft:rarity_filter", + "chance": 2 + }, + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:heightmap", + "heightmap": "OCEAN_FLOOR" + }, + { + "type": "twilightforest:no_structure", + "value": { + "additional_clearance": 0, + "occupies_surface": true, + "occupies_underground": true + } + }, + { + "type": "minecraft:biome" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/placed_feature/lava_lake.json b/src/generated/resources/data/twilightforest/worldgen/placed_feature/lava_lake.json new file mode 100644 index 0000000000..0d0c83c99d --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/placed_feature/lava_lake.json @@ -0,0 +1,27 @@ +{ + "feature": "twilightforest:lava_lake", + "placement": [ + { + "type": "minecraft:rarity_filter", + "chance": 10 + }, + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:heightmap", + "heightmap": "OCEAN_FLOOR" + }, + { + "type": "twilightforest:no_structure", + "value": { + "additional_clearance": 0, + "occupies_surface": true, + "occupies_underground": true + } + }, + { + "type": "minecraft:biome" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/placed_feature/legacy_coal_ore.json b/src/generated/resources/data/twilightforest/worldgen/placed_feature/legacy_coal_ore.json new file mode 100644 index 0000000000..127ac205dd --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/placed_feature/legacy_coal_ore.json @@ -0,0 +1,24 @@ +{ + "feature": "twilightforest:legacy_coal_ore", + "placement": [ + { + "type": "minecraft:height_range", + "height": { + "type": "minecraft:uniform", + "max_inclusive": { + "absolute": 127 + }, + "min_inclusive": { + "above_bottom": 0 + } + } + }, + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:count", + "count": 20 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/placed_feature/legacy_copper_ore.json b/src/generated/resources/data/twilightforest/worldgen/placed_feature/legacy_copper_ore.json new file mode 100644 index 0000000000..b062ce6dcd --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/placed_feature/legacy_copper_ore.json @@ -0,0 +1,24 @@ +{ + "feature": "twilightforest:legacy_copper_ore", + "placement": [ + { + "type": "minecraft:height_range", + "height": { + "type": "minecraft:uniform", + "max_inclusive": { + "absolute": 96 + }, + "min_inclusive": { + "above_bottom": 0 + } + } + }, + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:count", + "count": 6 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/placed_feature/legacy_diamond_ore.json b/src/generated/resources/data/twilightforest/worldgen/placed_feature/legacy_diamond_ore.json new file mode 100644 index 0000000000..d34622c1ff --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/placed_feature/legacy_diamond_ore.json @@ -0,0 +1,20 @@ +{ + "feature": "twilightforest:legacy_diamond_ore", + "placement": [ + { + "type": "minecraft:height_range", + "height": { + "type": "minecraft:uniform", + "max_inclusive": { + "absolute": 15 + }, + "min_inclusive": { + "above_bottom": 0 + } + } + }, + { + "type": "minecraft:in_square" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/placed_feature/legacy_gold_ore.json b/src/generated/resources/data/twilightforest/worldgen/placed_feature/legacy_gold_ore.json new file mode 100644 index 0000000000..6b05fb3a28 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/placed_feature/legacy_gold_ore.json @@ -0,0 +1,24 @@ +{ + "feature": "twilightforest:legacy_gold_ore", + "placement": [ + { + "type": "minecraft:height_range", + "height": { + "type": "minecraft:uniform", + "max_inclusive": { + "absolute": 31 + }, + "min_inclusive": { + "above_bottom": 0 + } + } + }, + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:count", + "count": 2 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/placed_feature/legacy_iron_ore.json b/src/generated/resources/data/twilightforest/worldgen/placed_feature/legacy_iron_ore.json new file mode 100644 index 0000000000..5b6f26ff24 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/placed_feature/legacy_iron_ore.json @@ -0,0 +1,24 @@ +{ + "feature": "twilightforest:legacy_iron_ore", + "placement": [ + { + "type": "minecraft:height_range", + "height": { + "type": "minecraft:uniform", + "max_inclusive": { + "absolute": 63 + }, + "min_inclusive": { + "above_bottom": 0 + } + } + }, + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:count", + "count": 20 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/placed_feature/legacy_lapis_ore.json b/src/generated/resources/data/twilightforest/worldgen/placed_feature/legacy_lapis_ore.json new file mode 100644 index 0000000000..ad11aca846 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/placed_feature/legacy_lapis_ore.json @@ -0,0 +1,24 @@ +{ + "feature": "twilightforest:legacy_lapis_ore", + "placement": [ + { + "type": "minecraft:height_range", + "height": { + "type": "minecraft:uniform", + "max_inclusive": { + "absolute": 30 + }, + "min_inclusive": { + "above_bottom": 0 + } + } + }, + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:count", + "count": 2 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/placed_feature/legacy_redstone_ore.json b/src/generated/resources/data/twilightforest/worldgen/placed_feature/legacy_redstone_ore.json new file mode 100644 index 0000000000..88975c6f96 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/placed_feature/legacy_redstone_ore.json @@ -0,0 +1,24 @@ +{ + "feature": "twilightforest:legacy_redstone_ore", + "placement": [ + { + "type": "minecraft:height_range", + "height": { + "type": "minecraft:uniform", + "max_inclusive": { + "absolute": 15 + }, + "min_inclusive": { + "above_bottom": 0 + } + } + }, + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:count", + "count": 8 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/placed_feature/mangrove_fallen_log.json b/src/generated/resources/data/twilightforest/worldgen/placed_feature/mangrove_fallen_log.json new file mode 100644 index 0000000000..5b05dfac46 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/placed_feature/mangrove_fallen_log.json @@ -0,0 +1,24 @@ +{ + "feature": "twilightforest:mangrove_fallen_log", + "placement": [ + { + "type": "minecraft:rarity_filter", + "chance": 40 + }, + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:heightmap", + "heightmap": "OCEAN_FLOOR" + }, + { + "type": "twilightforest:no_structure", + "value": { + "additional_clearance": 0, + "occupies_surface": true, + "occupies_underground": false + } + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/placed_feature/mayapple.json b/src/generated/resources/data/twilightforest/worldgen/placed_feature/mayapple.json new file mode 100644 index 0000000000..aec30a69dc --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/placed_feature/mayapple.json @@ -0,0 +1,12 @@ +{ + "feature": "twilightforest:mayapple", + "placement": [ + { + "type": "minecraft:heightmap", + "heightmap": "WORLD_SURFACE_WG" + }, + { + "type": "minecraft:biome" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/placed_feature/monolith.json b/src/generated/resources/data/twilightforest/worldgen/placed_feature/monolith.json new file mode 100644 index 0000000000..200bec3e7c --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/placed_feature/monolith.json @@ -0,0 +1,27 @@ +{ + "feature": "twilightforest:monolith", + "placement": [ + { + "type": "minecraft:rarity_filter", + "chance": 90 + }, + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:heightmap", + "heightmap": "OCEAN_FLOOR" + }, + { + "type": "twilightforest:no_structure", + "value": { + "additional_clearance": 0, + "occupies_surface": true, + "occupies_underground": false + } + }, + { + "type": "minecraft:biome" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/placed_feature/mushgloom_cluster.json b/src/generated/resources/data/twilightforest/worldgen/placed_feature/mushgloom_cluster.json new file mode 100644 index 0000000000..502d58aca7 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/placed_feature/mushgloom_cluster.json @@ -0,0 +1,19 @@ +{ + "feature": "twilightforest:mushgloom_cluster", + "placement": [ + { + "type": "minecraft:heightmap", + "heightmap": "WORLD_SURFACE_WG" + }, + { + "type": "minecraft:rarity_filter", + "chance": 5 + }, + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:biome" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/placed_feature/mushroom/canopy_mushrooms_dense.json b/src/generated/resources/data/twilightforest/worldgen/placed_feature/mushroom/canopy_mushrooms_dense.json new file mode 100644 index 0000000000..5f03c18810 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/placed_feature/mushroom/canopy_mushrooms_dense.json @@ -0,0 +1,55 @@ +{ + "feature": "twilightforest:mushroom/canopy_mushrooms_dense", + "placement": [ + { + "type": "minecraft:count", + "count": { + "type": "minecraft:weighted_list", + "distribution": [ + { + "data": 5, + "weight": 9 + }, + { + "data": 6, + "weight": 1 + } + ] + } + }, + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:surface_water_depth_filter", + "max_water_depth": 0 + }, + { + "type": "minecraft:heightmap", + "heightmap": "OCEAN_FLOOR" + }, + { + "type": "twilightforest:no_structure", + "value": { + "additional_clearance": 0, + "occupies_surface": true, + "occupies_underground": false + } + }, + { + "type": "minecraft:block_predicate_filter", + "predicate": { + "type": "minecraft:would_survive", + "state": { + "Name": "twilightforest:canopy_sapling", + "Properties": { + "stage": "0" + } + } + } + }, + { + "type": "minecraft:biome" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/placed_feature/mushroom/canopy_mushrooms_sparse.json b/src/generated/resources/data/twilightforest/worldgen/placed_feature/mushroom/canopy_mushrooms_sparse.json new file mode 100644 index 0000000000..2d0aac2fd9 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/placed_feature/mushroom/canopy_mushrooms_sparse.json @@ -0,0 +1,55 @@ +{ + "feature": "twilightforest:mushroom/canopy_mushrooms_sparse", + "placement": [ + { + "type": "minecraft:count", + "count": { + "type": "minecraft:weighted_list", + "distribution": [ + { + "data": 3, + "weight": 9 + }, + { + "data": 4, + "weight": 1 + } + ] + } + }, + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:surface_water_depth_filter", + "max_water_depth": 0 + }, + { + "type": "minecraft:heightmap", + "heightmap": "OCEAN_FLOOR" + }, + { + "type": "twilightforest:no_structure", + "value": { + "additional_clearance": 0, + "occupies_surface": true, + "occupies_underground": false + } + }, + { + "type": "minecraft:block_predicate_filter", + "predicate": { + "type": "minecraft:would_survive", + "state": { + "Name": "twilightforest:canopy_sapling", + "Properties": { + "stage": "0" + } + } + } + }, + { + "type": "minecraft:biome" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/placed_feature/mycelium_blob.json b/src/generated/resources/data/twilightforest/worldgen/placed_feature/mycelium_blob.json new file mode 100644 index 0000000000..4236c7edca --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/placed_feature/mycelium_blob.json @@ -0,0 +1,27 @@ +{ + "feature": "twilightforest:mycelium_blob", + "placement": [ + { + "type": "minecraft:rarity_filter", + "chance": 3 + }, + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:heightmap", + "heightmap": "OCEAN_FLOOR" + }, + { + "type": "twilightforest:no_structure", + "value": { + "additional_clearance": 0, + "occupies_surface": true, + "occupies_underground": false + } + }, + { + "type": "minecraft:biome" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/placed_feature/outside_stalagmite.json b/src/generated/resources/data/twilightforest/worldgen/placed_feature/outside_stalagmite.json new file mode 100644 index 0000000000..1866d0c64a --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/placed_feature/outside_stalagmite.json @@ -0,0 +1,27 @@ +{ + "feature": "twilightforest:outside_stalagmite", + "placement": [ + { + "type": "minecraft:rarity_filter", + "chance": 77 + }, + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:heightmap", + "heightmap": "OCEAN_FLOOR" + }, + { + "type": "twilightforest:no_structure", + "value": { + "additional_clearance": 0, + "occupies_surface": true, + "occupies_underground": false + } + }, + { + "type": "minecraft:biome" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/placed_feature/plant_roots.json b/src/generated/resources/data/twilightforest/worldgen/placed_feature/plant_roots.json new file mode 100644 index 0000000000..7c07b4ec69 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/placed_feature/plant_roots.json @@ -0,0 +1,43 @@ +{ + "feature": "twilightforest:plant_roots", + "placement": [ + { + "type": "minecraft:count", + "count": 4 + }, + { + "type": "minecraft:height_range", + "height": { + "type": "minecraft:uniform", + "max_inclusive": { + "absolute": 10 + }, + "min_inclusive": { + "above_bottom": 0 + } + } + }, + { + "type": "twilightforest:no_structure", + "value": { + "additional_clearance": 0, + "occupies_surface": false, + "occupies_underground": true + } + }, + { + "type": "minecraft:rarity_filter", + "chance": 1 + }, + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:heightmap", + "heightmap": "MOTION_BLOCKING" + }, + { + "type": "minecraft:biome" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/placed_feature/pumpkin_lamppost.json b/src/generated/resources/data/twilightforest/worldgen/placed_feature/pumpkin_lamppost.json new file mode 100644 index 0000000000..8518c78b2e --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/placed_feature/pumpkin_lamppost.json @@ -0,0 +1,27 @@ +{ + "feature": "twilightforest:pumpkin_lamppost", + "placement": [ + { + "type": "minecraft:rarity_filter", + "chance": 10 + }, + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:heightmap", + "heightmap": "OCEAN_FLOOR" + }, + { + "type": "twilightforest:no_structure", + "value": { + "additional_clearance": 0, + "occupies_surface": true, + "occupies_underground": false + } + }, + { + "type": "minecraft:biome" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/placed_feature/small_andesite.json b/src/generated/resources/data/twilightforest/worldgen/placed_feature/small_andesite.json new file mode 100644 index 0000000000..3bb8924721 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/placed_feature/small_andesite.json @@ -0,0 +1,28 @@ +{ + "feature": "twilightforest:small_andesite", + "placement": [ + { + "type": "minecraft:height_range", + "height": { + "type": "minecraft:trapezoid", + "max_inclusive": { + "absolute": 64 + }, + "min_inclusive": { + "absolute": -64 + } + } + }, + { + "type": "minecraft:rarity_filter", + "chance": 10 + }, + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:count", + "count": 5 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/placed_feature/small_diorite.json b/src/generated/resources/data/twilightforest/worldgen/placed_feature/small_diorite.json new file mode 100644 index 0000000000..1d2aa56b2a --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/placed_feature/small_diorite.json @@ -0,0 +1,28 @@ +{ + "feature": "twilightforest:small_diorite", + "placement": [ + { + "type": "minecraft:height_range", + "height": { + "type": "minecraft:trapezoid", + "max_inclusive": { + "absolute": 64 + }, + "min_inclusive": { + "absolute": -64 + } + } + }, + { + "type": "minecraft:rarity_filter", + "chance": 10 + }, + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:count", + "count": 5 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/placed_feature/small_granite.json b/src/generated/resources/data/twilightforest/worldgen/placed_feature/small_granite.json new file mode 100644 index 0000000000..dff900547d --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/placed_feature/small_granite.json @@ -0,0 +1,28 @@ +{ + "feature": "twilightforest:small_granite", + "placement": [ + { + "type": "minecraft:height_range", + "height": { + "type": "minecraft:trapezoid", + "max_inclusive": { + "absolute": 64 + }, + "min_inclusive": { + "absolute": -64 + } + } + }, + { + "type": "minecraft:rarity_filter", + "chance": 10 + }, + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:count", + "count": 5 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/placed_feature/smoker.json b/src/generated/resources/data/twilightforest/worldgen/placed_feature/smoker.json new file mode 100644 index 0000000000..d5f1554c3e --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/placed_feature/smoker.json @@ -0,0 +1,15 @@ +{ + "feature": "twilightforest:smoker", + "placement": [ + { + "type": "minecraft:heightmap", + "heightmap": "WORLD_SURFACE_WG" + }, + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:biome" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/placed_feature/snow_under_trees.json b/src/generated/resources/data/twilightforest/worldgen/placed_feature/snow_under_trees.json new file mode 100644 index 0000000000..75713120ea --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/placed_feature/snow_under_trees.json @@ -0,0 +1,8 @@ +{ + "feature": "twilightforest:snow_under_trees", + "placement": [ + { + "type": "minecraft:biome" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/placed_feature/spruce_fallen_log.json b/src/generated/resources/data/twilightforest/worldgen/placed_feature/spruce_fallen_log.json new file mode 100644 index 0000000000..f4532952ae --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/placed_feature/spruce_fallen_log.json @@ -0,0 +1,24 @@ +{ + "feature": "twilightforest:spruce_fallen_log", + "placement": [ + { + "type": "minecraft:rarity_filter", + "chance": 40 + }, + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:heightmap", + "heightmap": "OCEAN_FLOOR" + }, + { + "type": "twilightforest:no_structure", + "value": { + "additional_clearance": 0, + "occupies_surface": true, + "occupies_underground": false + } + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/placed_feature/stone_circle.json b/src/generated/resources/data/twilightforest/worldgen/placed_feature/stone_circle.json new file mode 100644 index 0000000000..58649582e3 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/placed_feature/stone_circle.json @@ -0,0 +1,27 @@ +{ + "feature": "twilightforest:stone_circle", + "placement": [ + { + "type": "minecraft:rarity_filter", + "chance": 105 + }, + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:heightmap", + "heightmap": "OCEAN_FLOOR" + }, + { + "type": "twilightforest:no_structure", + "value": { + "additional_clearance": 0, + "occupies_surface": true, + "occupies_underground": false + } + }, + { + "type": "minecraft:biome" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/placed_feature/tf_oak_fallen_log.json b/src/generated/resources/data/twilightforest/worldgen/placed_feature/tf_oak_fallen_log.json new file mode 100644 index 0000000000..86542ca0eb --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/placed_feature/tf_oak_fallen_log.json @@ -0,0 +1,24 @@ +{ + "feature": "twilightforest:tf_oak_fallen_log", + "placement": [ + { + "type": "minecraft:rarity_filter", + "chance": 40 + }, + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:heightmap", + "heightmap": "OCEAN_FLOOR" + }, + { + "type": "twilightforest:no_structure", + "value": { + "additional_clearance": 0, + "occupies_surface": true, + "occupies_underground": false + } + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/placed_feature/thorns.json b/src/generated/resources/data/twilightforest/worldgen/placed_feature/thorns.json new file mode 100644 index 0000000000..fa5a542f31 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/placed_feature/thorns.json @@ -0,0 +1,14 @@ +{ + "feature": "twilightforest:thorns", + "placement": [ + { + "type": "twilightforest:chunk_blanketing", + "biome_lock": "twilightforest:thornlands", + "heightmap": "OCEAN_FLOOR_WG", + "integrity": 0.7 + }, + { + "type": "minecraft:biome" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/placed_feature/torch_berries.json b/src/generated/resources/data/twilightforest/worldgen/placed_feature/torch_berries.json new file mode 100644 index 0000000000..bfc126eec8 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/placed_feature/torch_berries.json @@ -0,0 +1,36 @@ +{ + "feature": "twilightforest:torch_berries", + "placement": [ + { + "type": "minecraft:heightmap", + "heightmap": "WORLD_SURFACE_WG" + }, + { + "type": "minecraft:height_range", + "height": { + "type": "minecraft:uniform", + "max_inclusive": { + "absolute": 60 + }, + "min_inclusive": { + "above_bottom": 0 + } + } + }, + { + "type": "minecraft:count", + "count": 8 + }, + { + "type": "twilightforest:no_structure", + "value": { + "additional_clearance": 0, + "occupies_surface": false, + "occupies_underground": true + } + }, + { + "type": "minecraft:biome" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/placed_feature/tree/darkwood_tree.json b/src/generated/resources/data/twilightforest/worldgen/placed_feature/tree/darkwood_tree.json new file mode 100644 index 0000000000..86d1d315c2 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/placed_feature/tree/darkwood_tree.json @@ -0,0 +1,55 @@ +{ + "feature": "twilightforest:tree/darkwood_tree", + "placement": [ + { + "type": "minecraft:count", + "count": { + "type": "minecraft:weighted_list", + "distribution": [ + { + "data": 5, + "weight": 9 + }, + { + "data": 6, + "weight": 1 + } + ] + } + }, + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:surface_water_depth_filter", + "max_water_depth": 0 + }, + { + "type": "minecraft:heightmap", + "heightmap": "OCEAN_FLOOR" + }, + { + "type": "twilightforest:no_structure", + "value": { + "additional_clearance": 16, + "occupies_surface": true, + "occupies_underground": false + } + }, + { + "type": "minecraft:block_predicate_filter", + "predicate": { + "type": "minecraft:would_survive", + "state": { + "Name": "twilightforest:darkwood_sapling", + "Properties": { + "stage": "0" + } + } + } + }, + { + "type": "minecraft:biome" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/placed_feature/tree/dead_canopy_tree.json b/src/generated/resources/data/twilightforest/worldgen/placed_feature/tree/dead_canopy_tree.json new file mode 100644 index 0000000000..ca140b0f43 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/placed_feature/tree/dead_canopy_tree.json @@ -0,0 +1,55 @@ +{ + "feature": "twilightforest:tree/dead_canopy_tree", + "placement": [ + { + "type": "minecraft:count", + "count": { + "type": "minecraft:weighted_list", + "distribution": [ + { + "data": 2, + "weight": 9 + }, + { + "data": 3, + "weight": 1 + } + ] + } + }, + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:surface_water_depth_filter", + "max_water_depth": 0 + }, + { + "type": "minecraft:heightmap", + "heightmap": "OCEAN_FLOOR" + }, + { + "type": "twilightforest:no_structure", + "value": { + "additional_clearance": 0, + "occupies_surface": true, + "occupies_underground": false + } + }, + { + "type": "minecraft:block_predicate_filter", + "predicate": { + "type": "minecraft:would_survive", + "state": { + "Name": "twilightforest:canopy_sapling", + "Properties": { + "stage": "0" + } + } + } + }, + { + "type": "minecraft:biome" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/placed_feature/tree/forest_canopy_oak_tree.json b/src/generated/resources/data/twilightforest/worldgen/placed_feature/tree/forest_canopy_oak_tree.json new file mode 100644 index 0000000000..8e31745393 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/placed_feature/tree/forest_canopy_oak_tree.json @@ -0,0 +1,55 @@ +{ + "feature": "twilightforest:tree/forest_canopy_oak_tree", + "placement": [ + { + "type": "minecraft:count", + "count": { + "type": "minecraft:weighted_list", + "distribution": [ + { + "data": 7, + "weight": 9 + }, + { + "data": 8, + "weight": 1 + } + ] + } + }, + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:surface_water_depth_filter", + "max_water_depth": 0 + }, + { + "type": "minecraft:heightmap", + "heightmap": "OCEAN_FLOOR" + }, + { + "type": "twilightforest:no_structure", + "value": { + "additional_clearance": 0, + "occupies_surface": true, + "occupies_underground": false + } + }, + { + "type": "minecraft:block_predicate_filter", + "predicate": { + "type": "minecraft:would_survive", + "state": { + "Name": "twilightforest:twilight_oak_sapling", + "Properties": { + "stage": "0" + } + } + } + }, + { + "type": "minecraft:biome" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/placed_feature/tree/hollow_oak.json b/src/generated/resources/data/twilightforest/worldgen/placed_feature/tree/hollow_oak.json new file mode 100644 index 0000000000..b1401210b0 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/placed_feature/tree/hollow_oak.json @@ -0,0 +1,43 @@ +{ + "feature": "twilightforest:tree/hollow_tree", + "placement": [ + { + "type": "minecraft:surface_water_depth_filter", + "max_water_depth": 0 + }, + { + "type": "minecraft:rarity_filter", + "chance": 35 + }, + { + "type": "minecraft:heightmap", + "heightmap": "OCEAN_FLOOR" + }, + { + "type": "twilightforest:chunk_centerer" + }, + { + "type": "twilightforest:no_structure", + "value": { + "additional_clearance": 32, + "occupies_surface": true, + "occupies_underground": false + } + }, + { + "type": "minecraft:block_predicate_filter", + "predicate": { + "type": "minecraft:would_survive", + "state": { + "Name": "twilightforest:hollow_oak_sapling", + "Properties": { + "stage": "0" + } + } + } + }, + { + "type": "minecraft:biome" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/placed_feature/tree/large_twilight_oak_tree.json b/src/generated/resources/data/twilightforest/worldgen/placed_feature/tree/large_twilight_oak_tree.json new file mode 100644 index 0000000000..74f55162e6 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/placed_feature/tree/large_twilight_oak_tree.json @@ -0,0 +1,55 @@ +{ + "feature": "twilightforest:tree/large_twilight_oak_tree", + "placement": [ + { + "type": "minecraft:count", + "count": { + "type": "minecraft:weighted_list", + "distribution": [ + { + "data": 1, + "weight": 9 + }, + { + "data": 2, + "weight": 1 + } + ] + } + }, + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:surface_water_depth_filter", + "max_water_depth": 0 + }, + { + "type": "minecraft:heightmap", + "heightmap": "OCEAN_FLOOR" + }, + { + "type": "twilightforest:no_structure", + "value": { + "additional_clearance": 0, + "occupies_surface": true, + "occupies_underground": false + } + }, + { + "type": "minecraft:block_predicate_filter", + "predicate": { + "type": "minecraft:would_survive", + "state": { + "Name": "twilightforest:twilight_oak_sapling", + "Properties": { + "stage": "0" + } + } + } + }, + { + "type": "minecraft:biome" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/placed_feature/tree/mangrove_tree.json b/src/generated/resources/data/twilightforest/worldgen/placed_feature/tree/mangrove_tree.json new file mode 100644 index 0000000000..519d5572d2 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/placed_feature/tree/mangrove_tree.json @@ -0,0 +1,56 @@ +{ + "feature": "twilightforest:tree/mangrove_tree", + "placement": [ + { + "type": "minecraft:count", + "count": { + "type": "minecraft:weighted_list", + "distribution": [ + { + "data": 3, + "weight": 9 + }, + { + "data": 4, + "weight": 1 + } + ] + } + }, + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:surface_water_depth_filter", + "max_water_depth": 6 + }, + { + "type": "minecraft:heightmap", + "heightmap": "OCEAN_FLOOR" + }, + { + "type": "twilightforest:no_structure", + "value": { + "additional_clearance": 0, + "occupies_surface": true, + "occupies_underground": false + } + }, + { + "type": "minecraft:block_predicate_filter", + "predicate": { + "type": "minecraft:would_survive", + "state": { + "Name": "twilightforest:mangrove_sapling", + "Properties": { + "stage": "0", + "waterlogged": "false" + } + } + } + }, + { + "type": "minecraft:biome" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/placed_feature/tree/savannah_canopy_oak_tree.json b/src/generated/resources/data/twilightforest/worldgen/placed_feature/tree/savannah_canopy_oak_tree.json new file mode 100644 index 0000000000..13566cf69e --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/placed_feature/tree/savannah_canopy_oak_tree.json @@ -0,0 +1,55 @@ +{ + "feature": "twilightforest:tree/savannah_canopy_oak_tree", + "placement": [ + { + "type": "minecraft:count", + "count": { + "type": "minecraft:weighted_list", + "distribution": [ + { + "data": 0, + "weight": 9 + }, + { + "data": 1, + "weight": 1 + } + ] + } + }, + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:surface_water_depth_filter", + "max_water_depth": 0 + }, + { + "type": "minecraft:heightmap", + "heightmap": "OCEAN_FLOOR" + }, + { + "type": "twilightforest:no_structure", + "value": { + "additional_clearance": 0, + "occupies_surface": true, + "occupies_underground": false + } + }, + { + "type": "minecraft:block_predicate_filter", + "predicate": { + "type": "minecraft:would_survive", + "state": { + "Name": "twilightforest:twilight_oak_sapling", + "Properties": { + "stage": "0" + } + } + } + }, + { + "type": "minecraft:biome" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/placed_feature/tree/savannah_oak_tree.json b/src/generated/resources/data/twilightforest/worldgen/placed_feature/tree/savannah_oak_tree.json new file mode 100644 index 0000000000..5d07825c77 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/placed_feature/tree/savannah_oak_tree.json @@ -0,0 +1,55 @@ +{ + "feature": "twilightforest:tree/twilight_oak_tree", + "placement": [ + { + "type": "minecraft:count", + "count": { + "type": "minecraft:weighted_list", + "distribution": [ + { + "data": 1, + "weight": 9 + }, + { + "data": 2, + "weight": 1 + } + ] + } + }, + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:surface_water_depth_filter", + "max_water_depth": 0 + }, + { + "type": "minecraft:heightmap", + "heightmap": "OCEAN_FLOOR" + }, + { + "type": "twilightforest:no_structure", + "value": { + "additional_clearance": 0, + "occupies_surface": true, + "occupies_underground": false + } + }, + { + "type": "minecraft:block_predicate_filter", + "predicate": { + "type": "minecraft:would_survive", + "state": { + "Name": "twilightforest:twilight_oak_sapling", + "Properties": { + "stage": "0" + } + } + } + }, + { + "type": "minecraft:biome" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/placed_feature/tree/selector/canopy_trees.json b/src/generated/resources/data/twilightforest/worldgen/placed_feature/tree/selector/canopy_trees.json new file mode 100644 index 0000000000..4e94c12bad --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/placed_feature/tree/selector/canopy_trees.json @@ -0,0 +1,39 @@ +{ + "feature": "twilightforest:tree/selector/canopy_trees", + "placement": [ + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:surface_water_depth_filter", + "max_water_depth": 0 + }, + { + "type": "minecraft:heightmap", + "heightmap": "OCEAN_FLOOR" + }, + { + "type": "twilightforest:no_structure", + "value": { + "additional_clearance": 0, + "occupies_surface": true, + "occupies_underground": false + } + }, + { + "type": "minecraft:block_predicate_filter", + "predicate": { + "type": "minecraft:would_survive", + "state": { + "Name": "twilightforest:canopy_sapling", + "Properties": { + "stage": "0" + } + } + } + }, + { + "type": "minecraft:biome" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/placed_feature/tree/selector/dark_forest_tree_mix.json b/src/generated/resources/data/twilightforest/worldgen/placed_feature/tree/selector/dark_forest_tree_mix.json new file mode 100644 index 0000000000..1d8eddb5b0 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/placed_feature/tree/selector/dark_forest_tree_mix.json @@ -0,0 +1,43 @@ +{ + "feature": "twilightforest:tree/selector/dark_forest_trees", + "placement": [ + { + "type": "minecraft:count", + "count": { + "type": "minecraft:weighted_list", + "distribution": [ + { + "data": 3, + "weight": 9 + }, + { + "data": 4, + "weight": 1 + } + ] + } + }, + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:surface_water_depth_filter", + "max_water_depth": 0 + }, + { + "type": "minecraft:heightmap", + "heightmap": "OCEAN_FLOOR" + }, + { + "type": "twilightforest:no_structure", + "value": { + "additional_clearance": 10, + "occupies_surface": true, + "occupies_underground": false + } + }, + { + "type": "minecraft:biome" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/placed_feature/tree/selector/dark_forest_trees.json b/src/generated/resources/data/twilightforest/worldgen/placed_feature/tree/selector/dark_forest_trees.json new file mode 100644 index 0000000000..db0d200a08 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/placed_feature/tree/selector/dark_forest_trees.json @@ -0,0 +1,43 @@ +{ + "feature": "twilightforest:tree/darkwood_tree", + "placement": [ + { + "type": "minecraft:count", + "count": { + "type": "minecraft:weighted_list", + "distribution": [ + { + "data": 8, + "weight": 9 + }, + { + "data": 9, + "weight": 1 + } + ] + } + }, + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:surface_water_depth_filter", + "max_water_depth": 0 + }, + { + "type": "minecraft:heightmap", + "heightmap": "OCEAN_FLOOR" + }, + { + "type": "twilightforest:no_structure", + "value": { + "additional_clearance": 10, + "occupies_surface": true, + "occupies_underground": false + } + }, + { + "type": "minecraft:biome" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/placed_feature/tree/selector/dense_canopy_trees.json b/src/generated/resources/data/twilightforest/worldgen/placed_feature/tree/selector/dense_canopy_trees.json new file mode 100644 index 0000000000..68134c741c --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/placed_feature/tree/selector/dense_canopy_trees.json @@ -0,0 +1,55 @@ +{ + "feature": "twilightforest:tree/selector/dense_canopy_trees", + "placement": [ + { + "type": "minecraft:count", + "count": { + "type": "minecraft:weighted_list", + "distribution": [ + { + "data": 5, + "weight": 9 + }, + { + "data": 6, + "weight": 1 + } + ] + } + }, + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:surface_water_depth_filter", + "max_water_depth": 0 + }, + { + "type": "minecraft:heightmap", + "heightmap": "OCEAN_FLOOR" + }, + { + "type": "twilightforest:no_structure", + "value": { + "additional_clearance": 0, + "occupies_surface": true, + "occupies_underground": false + } + }, + { + "type": "minecraft:block_predicate_filter", + "predicate": { + "type": "minecraft:would_survive", + "state": { + "Name": "twilightforest:canopy_sapling", + "Properties": { + "stage": "0" + } + } + } + }, + { + "type": "minecraft:biome" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/placed_feature/tree/selector/enchanted_forest_trees.json b/src/generated/resources/data/twilightforest/worldgen/placed_feature/tree/selector/enchanted_forest_trees.json new file mode 100644 index 0000000000..380813639b --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/placed_feature/tree/selector/enchanted_forest_trees.json @@ -0,0 +1,55 @@ +{ + "feature": "twilightforest:tree/selector/enchanted_forest_trees", + "placement": [ + { + "type": "minecraft:count", + "count": { + "type": "minecraft:weighted_list", + "distribution": [ + { + "data": 5, + "weight": 9 + }, + { + "data": 6, + "weight": 1 + } + ] + } + }, + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:surface_water_depth_filter", + "max_water_depth": 0 + }, + { + "type": "minecraft:heightmap", + "heightmap": "OCEAN_FLOOR" + }, + { + "type": "twilightforest:no_structure", + "value": { + "additional_clearance": 0, + "occupies_surface": true, + "occupies_underground": false + } + }, + { + "type": "minecraft:block_predicate_filter", + "predicate": { + "type": "minecraft:would_survive", + "state": { + "Name": "twilightforest:rainbow_oak_sapling", + "Properties": { + "stage": "0" + } + } + } + }, + { + "type": "minecraft:biome" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/placed_feature/tree/selector/firefly_forest_trees.json b/src/generated/resources/data/twilightforest/worldgen/placed_feature/tree/selector/firefly_forest_trees.json new file mode 100644 index 0000000000..740e53b5e5 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/placed_feature/tree/selector/firefly_forest_trees.json @@ -0,0 +1,55 @@ +{ + "feature": "twilightforest:tree/selector/firefly_forest_trees", + "placement": [ + { + "type": "minecraft:count", + "count": { + "type": "minecraft:weighted_list", + "distribution": [ + { + "data": 3, + "weight": 9 + }, + { + "data": 4, + "weight": 1 + } + ] + } + }, + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:surface_water_depth_filter", + "max_water_depth": 0 + }, + { + "type": "minecraft:heightmap", + "heightmap": "OCEAN_FLOOR" + }, + { + "type": "twilightforest:no_structure", + "value": { + "additional_clearance": 0, + "occupies_surface": true, + "occupies_underground": false + } + }, + { + "type": "minecraft:block_predicate_filter", + "predicate": { + "type": "minecraft:would_survive", + "state": { + "Name": "twilightforest:canopy_sapling", + "Properties": { + "stage": "0" + } + } + } + }, + { + "type": "minecraft:biome" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/placed_feature/tree/selector/highlands_trees.json b/src/generated/resources/data/twilightforest/worldgen/placed_feature/tree/selector/highlands_trees.json new file mode 100644 index 0000000000..7e05b42f8c --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/placed_feature/tree/selector/highlands_trees.json @@ -0,0 +1,55 @@ +{ + "feature": "twilightforest:tree/selector/highlands_trees", + "placement": [ + { + "type": "minecraft:count", + "count": { + "type": "minecraft:weighted_list", + "distribution": [ + { + "data": 3, + "weight": 9 + }, + { + "data": 4, + "weight": 1 + } + ] + } + }, + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:surface_water_depth_filter", + "max_water_depth": 0 + }, + { + "type": "minecraft:heightmap", + "heightmap": "OCEAN_FLOOR" + }, + { + "type": "twilightforest:no_structure", + "value": { + "additional_clearance": 0, + "occupies_surface": true, + "occupies_underground": false + } + }, + { + "type": "minecraft:block_predicate_filter", + "predicate": { + "type": "minecraft:would_survive", + "state": { + "Name": "minecraft:spruce_sapling", + "Properties": { + "stage": "0" + } + } + } + }, + { + "type": "minecraft:biome" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/placed_feature/tree/selector/snowy_forest_trees.json b/src/generated/resources/data/twilightforest/worldgen/placed_feature/tree/selector/snowy_forest_trees.json new file mode 100644 index 0000000000..790338516b --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/placed_feature/tree/selector/snowy_forest_trees.json @@ -0,0 +1,70 @@ +{ + "feature": "twilightforest:tree/selector/snowy_forest_trees", + "placement": [ + { + "type": "minecraft:count", + "count": { + "type": "minecraft:weighted_list", + "distribution": [ + { + "data": 10, + "weight": 9 + }, + { + "data": 11, + "weight": 1 + } + ] + } + }, + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:surface_water_depth_filter", + "max_water_depth": 0 + }, + { + "type": "minecraft:heightmap", + "heightmap": "OCEAN_FLOOR" + }, + { + "type": "twilightforest:no_structure", + "value": { + "additional_clearance": 0, + "occupies_surface": true, + "occupies_underground": false + } + }, + { + "type": "minecraft:environment_scan", + "direction_of_search": "up", + "max_steps": 8, + "target_condition": { + "type": "minecraft:not", + "predicate": { + "type": "minecraft:matching_blocks", + "blocks": "minecraft:powder_snow" + } + } + }, + { + "type": "minecraft:block_predicate_filter", + "predicate": { + "type": "minecraft:matching_blocks", + "blocks": [ + "minecraft:snow_block", + "minecraft:powder_snow" + ], + "offset": [ + 0, + -1, + 0 + ] + } + }, + { + "type": "minecraft:biome" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/placed_feature/tree/selector/vanilla_mushrooms.json b/src/generated/resources/data/twilightforest/worldgen/placed_feature/tree/selector/vanilla_mushrooms.json new file mode 100644 index 0000000000..a4e9bcc466 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/placed_feature/tree/selector/vanilla_mushrooms.json @@ -0,0 +1,39 @@ +{ + "feature": "twilightforest:tree/selector/vanilla/vanilla_mushrooms", + "placement": [ + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:surface_water_depth_filter", + "max_water_depth": 0 + }, + { + "type": "minecraft:heightmap", + "heightmap": "OCEAN_FLOOR" + }, + { + "type": "twilightforest:no_structure", + "value": { + "additional_clearance": 0, + "occupies_surface": true, + "occupies_underground": false + } + }, + { + "type": "minecraft:block_predicate_filter", + "predicate": { + "type": "minecraft:would_survive", + "state": { + "Name": "twilightforest:canopy_sapling", + "Properties": { + "stage": "0" + } + } + } + }, + { + "type": "minecraft:biome" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/placed_feature/tree/selector/vanilla_trees.json b/src/generated/resources/data/twilightforest/worldgen/placed_feature/tree/selector/vanilla_trees.json new file mode 100644 index 0000000000..7cd0159ca4 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/placed_feature/tree/selector/vanilla_trees.json @@ -0,0 +1,39 @@ +{ + "feature": "twilightforest:tree/selector/vanilla_trees", + "placement": [ + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:surface_water_depth_filter", + "max_water_depth": 0 + }, + { + "type": "minecraft:heightmap", + "heightmap": "OCEAN_FLOOR" + }, + { + "type": "twilightforest:no_structure", + "value": { + "additional_clearance": 0, + "occupies_surface": true, + "occupies_underground": false + } + }, + { + "type": "minecraft:block_predicate_filter", + "predicate": { + "type": "minecraft:would_survive", + "state": { + "Name": "twilightforest:twilight_oak_sapling", + "Properties": { + "stage": "0" + } + } + } + }, + { + "type": "minecraft:biome" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/placed_feature/tree/swampy_oak_tree.json b/src/generated/resources/data/twilightforest/worldgen/placed_feature/tree/swampy_oak_tree.json new file mode 100644 index 0000000000..9624e11d16 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/placed_feature/tree/swampy_oak_tree.json @@ -0,0 +1,55 @@ +{ + "feature": "twilightforest:tree/swampy_oak_tree", + "placement": [ + { + "type": "minecraft:count", + "count": { + "type": "minecraft:weighted_list", + "distribution": [ + { + "data": 4, + "weight": 9 + }, + { + "data": 5, + "weight": 1 + } + ] + } + }, + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:surface_water_depth_filter", + "max_water_depth": 0 + }, + { + "type": "minecraft:heightmap", + "heightmap": "OCEAN_FLOOR" + }, + { + "type": "twilightforest:no_structure", + "value": { + "additional_clearance": 0, + "occupies_surface": true, + "occupies_underground": false + } + }, + { + "type": "minecraft:block_predicate_filter", + "predicate": { + "type": "minecraft:would_survive", + "state": { + "Name": "twilightforest:twilight_oak_sapling", + "Properties": { + "stage": "0" + } + } + } + }, + { + "type": "minecraft:biome" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/placed_feature/tree/twilight_oak_tree.json b/src/generated/resources/data/twilightforest/worldgen/placed_feature/tree/twilight_oak_tree.json new file mode 100644 index 0000000000..5d07825c77 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/placed_feature/tree/twilight_oak_tree.json @@ -0,0 +1,55 @@ +{ + "feature": "twilightforest:tree/twilight_oak_tree", + "placement": [ + { + "type": "minecraft:count", + "count": { + "type": "minecraft:weighted_list", + "distribution": [ + { + "data": 1, + "weight": 9 + }, + { + "data": 2, + "weight": 1 + } + ] + } + }, + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:surface_water_depth_filter", + "max_water_depth": 0 + }, + { + "type": "minecraft:heightmap", + "heightmap": "OCEAN_FLOOR" + }, + { + "type": "twilightforest:no_structure", + "value": { + "additional_clearance": 0, + "occupies_surface": true, + "occupies_underground": false + } + }, + { + "type": "minecraft:block_predicate_filter", + "predicate": { + "type": "minecraft:would_survive", + "state": { + "Name": "twilightforest:twilight_oak_sapling", + "Properties": { + "stage": "0" + } + } + } + }, + { + "type": "minecraft:biome" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/placed_feature/troll_roots.json b/src/generated/resources/data/twilightforest/worldgen/placed_feature/troll_roots.json new file mode 100644 index 0000000000..d48a48c68c --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/placed_feature/troll_roots.json @@ -0,0 +1,28 @@ +{ + "feature": "twilightforest:troll_roots", + "placement": [ + { + "type": "minecraft:heightmap", + "heightmap": "WORLD_SURFACE_WG" + }, + { + "type": "minecraft:height_range", + "height": { + "type": "minecraft:uniform", + "max_inclusive": { + "absolute": 60 + }, + "min_inclusive": { + "above_bottom": 0 + } + } + }, + { + "type": "minecraft:count", + "count": 8 + }, + { + "type": "minecraft:biome" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/placed_feature/vanilla_roots.json b/src/generated/resources/data/twilightforest/worldgen/placed_feature/vanilla_roots.json new file mode 100644 index 0000000000..b2cbe8437e --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/placed_feature/vanilla_roots.json @@ -0,0 +1,55 @@ +{ + "feature": "twilightforest:vanilla_roots", + "placement": [ + { + "type": "minecraft:count", + "count": 16 + }, + { + "type": "minecraft:height_range", + "height": { + "type": "minecraft:uniform", + "max_inclusive": { + "absolute": 0 + }, + "min_inclusive": { + "above_bottom": 0 + } + } + }, + { + "type": "minecraft:block_predicate_filter", + "predicate": { + "type": "minecraft:would_survive", + "state": { + "Name": "twilightforest:torchberry_plant", + "Properties": { + "has_torchberries": "false" + } + } + } + }, + { + "type": "twilightforest:no_structure", + "value": { + "additional_clearance": 0, + "occupies_surface": false, + "occupies_underground": true + } + }, + { + "type": "minecraft:rarity_filter", + "chance": 1 + }, + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:heightmap", + "heightmap": "MOTION_BLOCKING" + }, + { + "type": "minecraft:biome" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/placed_feature/water_lake.json b/src/generated/resources/data/twilightforest/worldgen/placed_feature/water_lake.json new file mode 100644 index 0000000000..e4b574baff --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/placed_feature/water_lake.json @@ -0,0 +1,27 @@ +{ + "feature": "twilightforest:water_lake", + "placement": [ + { + "type": "minecraft:rarity_filter", + "chance": 4 + }, + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:heightmap", + "heightmap": "OCEAN_FLOOR" + }, + { + "type": "twilightforest:no_structure", + "value": { + "additional_clearance": 0, + "occupies_surface": true, + "occupies_underground": true + } + }, + { + "type": "minecraft:biome" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/placed_feature/webs.json b/src/generated/resources/data/twilightforest/worldgen/placed_feature/webs.json new file mode 100644 index 0000000000..a2e1c0a3f1 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/placed_feature/webs.json @@ -0,0 +1,19 @@ +{ + "feature": "twilightforest:webs", + "placement": [ + { + "type": "minecraft:heightmap", + "heightmap": "WORLD_SURFACE_WG" + }, + { + "type": "minecraft:count", + "count": 60 + }, + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:biome" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/placed_feature/well_placer.json b/src/generated/resources/data/twilightforest/worldgen/placed_feature/well_placer.json new file mode 100644 index 0000000000..9fd423f28e --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/placed_feature/well_placer.json @@ -0,0 +1,27 @@ +{ + "feature": "twilightforest:well_placer", + "placement": [ + { + "type": "minecraft:rarity_filter", + "chance": 80 + }, + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:heightmap", + "heightmap": "OCEAN_FLOOR" + }, + { + "type": "twilightforest:no_structure", + "value": { + "additional_clearance": 0, + "occupies_surface": true, + "occupies_underground": true + } + }, + { + "type": "minecraft:biome" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/placed_feature/wood_roots.json b/src/generated/resources/data/twilightforest/worldgen/placed_feature/wood_roots.json new file mode 100644 index 0000000000..f3a2bce21c --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/placed_feature/wood_roots.json @@ -0,0 +1,39 @@ +{ + "feature": "twilightforest:ore/wood_roots_spread", + "placement": [ + { + "type": "minecraft:height_range", + "height": { + "type": "minecraft:uniform", + "max_inclusive": { + "absolute": 0 + }, + "min_inclusive": { + "above_bottom": 0 + } + } + }, + { + "type": "twilightforest:no_structure", + "value": { + "additional_clearance": 0, + "occupies_surface": false, + "occupies_underground": true + } + }, + { + "type": "minecraft:rarity_filter", + "chance": 40 + }, + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:heightmap", + "heightmap": "MOTION_BLOCKING" + }, + { + "type": "minecraft:biome" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/structure/aurora_palace.json b/src/generated/resources/data/twilightforest/worldgen/structure/aurora_palace.json new file mode 100644 index 0000000000..5e93b639a8 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/structure/aurora_palace.json @@ -0,0 +1,53 @@ +{ + "type": "twilightforest:aurora_palace", + "adjust_structure_elevation": false, + "advancements_required": [ + "twilightforest:progress_yeti" + ], + "allow_biome_surface_decorations": false, + "allow_biome_underground_decorations": true, + "ambient_spawns": [], + "biomes": "#twilightforest:valid_aurora_palace_biomes", + "chunk_clearance_radius": 2, + "hint_item": { + "Count": 1, + "id": "minecraft:written_book", + "tag": { + "author": "twilightforest.book.author", + "generation": 3, + "pages": [ + "{\"translate\":\"twilightforest.book.icetower.1\"}", + "{\"translate\":\"twilightforest.book.icetower.2\"}", + "{\"translate\":\"twilightforest.book.icetower.3\"}" + ], + "title": "twilightforest.book.icetower", + "twilightforest:book": 1 + } + }, + "hint_mob": "twilightforest:kobold", + "labelled_monster_spawns": { + "0": [ + { + "type": "twilightforest:snow_guardian", + "maxCount": 2, + "minCount": 1, + "weight": 10 + }, + { + "type": "twilightforest:stable_ice_core", + "maxCount": 2, + "minCount": 1, + "weight": 10 + }, + { + "type": "twilightforest:unstable_ice_core", + "maxCount": 2, + "minCount": 1, + "weight": 5 + } + ] + }, + "spawn_overrides": {}, + "step": "surface_structures", + "water_spawns": [] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/structure/dark_tower.json b/src/generated/resources/data/twilightforest/worldgen/structure/dark_tower.json new file mode 100644 index 0000000000..0ba6e9955a --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/structure/dark_tower.json @@ -0,0 +1,99 @@ +{ + "type": "twilightforest:dark_tower", + "adjust_structure_elevation": true, + "advancements_required": [ + "twilightforest:progress_knights" + ], + "allow_biome_surface_decorations": false, + "allow_biome_underground_decorations": true, + "ambient_spawns": [], + "biomes": "#twilightforest:valid_dark_tower_biomes", + "chunk_clearance_radius": 1, + "hint_item": { + "Count": 1, + "id": "minecraft:written_book", + "tag": { + "author": "twilightforest.book.author", + "generation": 3, + "pages": [ + "{\"translate\":\"twilightforest.book.darktower.1\"}", + "{\"translate\":\"twilightforest.book.darktower.2\"}", + "{\"translate\":\"twilightforest.book.darktower.3\"}" + ], + "title": "twilightforest.book.darktower", + "twilightforest:book": 1 + } + }, + "hint_mob": "twilightforest:kobold", + "labelled_monster_spawns": { + "0": [ + { + "type": "twilightforest:carminite_golem", + "maxCount": 2, + "minCount": 1, + "weight": 10 + }, + { + "type": "minecraft:skeleton", + "maxCount": 2, + "minCount": 1, + "weight": 10 + }, + { + "type": "minecraft:creeper", + "maxCount": 1, + "minCount": 1, + "weight": 5 + }, + { + "type": "minecraft:enderman", + "maxCount": 2, + "minCount": 1, + "weight": 2 + }, + { + "type": "minecraft:witch", + "maxCount": 1, + "minCount": 1, + "weight": 1 + }, + { + "type": "twilightforest:carminite_ghastling", + "maxCount": 2, + "minCount": 1, + "weight": 10 + }, + { + "type": "twilightforest:carminite_broodling", + "maxCount": 4, + "minCount": 4, + "weight": 10 + }, + { + "type": "twilightforest:pinch_beetle", + "maxCount": 1, + "minCount": 1, + "weight": 10 + } + ], + "1": [ + { + "type": "twilightforest:carminite_ghastguard", + "maxCount": 2, + "minCount": 1, + "weight": 10 + } + ] + }, + "spawn_overrides": {}, + "step": "surface_structures", + "terrain_adaptation": "beard_thin", + "water_spawns": [ + { + "type": "minecraft:squid", + "maxCount": 4, + "minCount": 4, + "weight": 10 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/structure/final_castle.json b/src/generated/resources/data/twilightforest/worldgen/structure/final_castle.json new file mode 100644 index 0000000000..bfc82420a8 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/structure/final_castle.json @@ -0,0 +1,37 @@ +{ + "type": "twilightforest:final_castle", + "adjust_structure_elevation": false, + "advancements_required": [ + "twilightforest:progress_troll" + ], + "allow_biome_surface_decorations": false, + "allow_biome_underground_decorations": true, + "ambient_spawns": [], + "biomes": "#twilightforest:valid_final_castle_biomes", + "chunk_clearance_radius": 4, + "hint_item": { + "Count": 1, + "id": "minecraft:written_book", + "tag": { + "author": "twilightforest.book.author", + "generation": 3, + "pages": [ + "{\"translate\":\"twilightforest.book.unknown.1\"}", + "{\"translate\":\"twilightforest.book.unknown.2\"}" + ], + "title": "twilightforest.book.unknown", + "twilightforest:book": 1 + } + }, + "hint_mob": "twilightforest:kobold", + "labelled_monster_spawns": { + "0": [], + "1": [], + "2": [], + "3": [] + }, + "spawn_overrides": {}, + "step": "surface_structures", + "terrain_adaptation": "beard_thin", + "water_spawns": [] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/structure/hedge_maze.json b/src/generated/resources/data/twilightforest/worldgen/structure/hedge_maze.json new file mode 100644 index 0000000000..b42bacd29d --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/structure/hedge_maze.json @@ -0,0 +1,11 @@ +{ + "type": "twilightforest:hedge_maze", + "adjust_structure_elevation": true, + "allow_biome_surface_decorations": false, + "allow_biome_underground_decorations": true, + "biomes": "#twilightforest:valid_hedge_maze_biomes", + "chunk_clearance_radius": 2, + "spawn_overrides": {}, + "step": "surface_structures", + "terrain_adaptation": "beard_thin" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/structure/hydra_lair.json b/src/generated/resources/data/twilightforest/worldgen/structure/hydra_lair.json new file mode 100644 index 0000000000..eecb01b66b --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/structure/hydra_lair.json @@ -0,0 +1,30 @@ +{ + "type": "twilightforest:hydra_lair", + "adjust_structure_elevation": false, + "advancements_required": [ + "twilightforest:progress_labyrinth" + ], + "allow_biome_surface_decorations": false, + "allow_biome_underground_decorations": false, + "biomes": "#twilightforest:valid_hydra_lair_biomes", + "chunk_clearance_radius": 2, + "hint_item": { + "Count": 1, + "id": "minecraft:written_book", + "tag": { + "author": "twilightforest.book.author", + "generation": 3, + "pages": [ + "{\"translate\":\"twilightforest.book.hydralair.1\"}", + "{\"translate\":\"twilightforest.book.hydralair.2\"}", + "{\"translate\":\"twilightforest.book.hydralair.3\"}", + "{\"translate\":\"twilightforest.book.hydralair.4\"}" + ], + "title": "twilightforest.book.hydralair", + "twilightforest:book": 1 + } + }, + "hint_mob": "twilightforest:kobold", + "spawn_overrides": {}, + "step": "surface_structures" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/structure/knight_stronghold.json b/src/generated/resources/data/twilightforest/worldgen/structure/knight_stronghold.json new file mode 100644 index 0000000000..eb21c4fba6 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/structure/knight_stronghold.json @@ -0,0 +1,85 @@ +{ + "type": "twilightforest:knight_stronghold", + "adjust_structure_elevation": false, + "advancements_required": [ + "twilightforest:progress_trophy_pedestal" + ], + "allow_biome_surface_decorations": true, + "allow_biome_underground_decorations": false, + "ambient_spawns": [], + "biomes": "#twilightforest:valid_knight_stronghold_biomes", + "chunk_clearance_radius": 3, + "hint_item": { + "Count": 1, + "id": "minecraft:written_book", + "tag": { + "author": "twilightforest.book.author", + "generation": 3, + "pages": [ + "{\"translate\":\"twilightforest.book.tfstronghold.1\"}", + "{\"translate\":\"twilightforest.book.tfstronghold.2\"}", + "{\"translate\":\"twilightforest.book.tfstronghold.3\"}", + "{\"translate\":\"twilightforest.book.tfstronghold.4\"}" + ], + "title": "twilightforest.book.tfstronghold", + "twilightforest:book": 1 + } + }, + "hint_mob": "twilightforest:kobold", + "labelled_monster_spawns": { + "0": [ + { + "type": "twilightforest:blockchain_goblin", + "maxCount": 2, + "minCount": 1, + "weight": 10 + }, + { + "type": "twilightforest:lower_goblin_knight", + "maxCount": 2, + "minCount": 1, + "weight": 5 + }, + { + "type": "twilightforest:helmet_crab", + "maxCount": 4, + "minCount": 2, + "weight": 10 + }, + { + "type": "twilightforest:slime_beetle", + "maxCount": 3, + "minCount": 2, + "weight": 10 + }, + { + "type": "twilightforest:redcap_sapper", + "maxCount": 2, + "minCount": 1, + "weight": 2 + }, + { + "type": "twilightforest:kobold", + "maxCount": 4, + "minCount": 2, + "weight": 10 + }, + { + "type": "minecraft:creeper", + "maxCount": 2, + "minCount": 1, + "weight": 5 + }, + { + "type": "minecraft:slime", + "maxCount": 4, + "minCount": 4, + "weight": 5 + } + ] + }, + "spawn_overrides": {}, + "step": "underground_structures", + "terrain_adaptation": "bury", + "water_spawns": [] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/structure/labyrinth.json b/src/generated/resources/data/twilightforest/worldgen/structure/labyrinth.json new file mode 100644 index 0000000000..7a41646a0f --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/structure/labyrinth.json @@ -0,0 +1,86 @@ +{ + "type": "twilightforest:labyrinth", + "adjust_structure_elevation": false, + "advancements_required": [ + "twilightforest:progress_lich" + ], + "allow_biome_surface_decorations": true, + "allow_biome_underground_decorations": false, + "ambient_spawns": [], + "biomes": "#twilightforest:valid_labyrinth_biomes", + "chunk_clearance_radius": 3, + "hint_item": { + "Count": 1, + "id": "minecraft:written_book", + "tag": { + "author": "twilightforest.book.author", + "generation": 3, + "pages": [ + "{\"translate\":\"twilightforest.book.labyrinth.1\"}", + "{\"translate\":\"twilightforest.book.labyrinth.2\"}", + "{\"translate\":\"twilightforest.book.labyrinth.3\"}", + "{\"translate\":\"twilightforest.book.labyrinth.4\"}", + "{\"translate\":\"twilightforest.book.labyrinth.5\"}" + ], + "title": "twilightforest.book.labyrinth", + "twilightforest:book": 1 + } + }, + "hint_mob": "twilightforest:kobold", + "labelled_monster_spawns": { + "0": [ + { + "type": "twilightforest:minotaur", + "maxCount": 3, + "minCount": 2, + "weight": 20 + }, + { + "type": "minecraft:cave_spider", + "maxCount": 2, + "minCount": 1, + "weight": 10 + }, + { + "type": "minecraft:creeper", + "maxCount": 2, + "minCount": 1, + "weight": 10 + }, + { + "type": "twilightforest:maze_slime", + "maxCount": 4, + "minCount": 2, + "weight": 10 + }, + { + "type": "minecraft:enderman", + "maxCount": 2, + "minCount": 1, + "weight": 1 + }, + { + "type": "twilightforest:fire_beetle", + "maxCount": 2, + "minCount": 1, + "weight": 10 + }, + { + "type": "twilightforest:slime_beetle", + "maxCount": 2, + "minCount": 1, + "weight": 10 + }, + { + "type": "twilightforest:pinch_beetle", + "maxCount": 1, + "minCount": 1, + "weight": 10 + } + ] + }, + "spawn_overrides": {}, + "step": "underground_structures", + "terrain_adaptation": "bury", + "water_spawns": [] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/structure/large_hollow_hill.json b/src/generated/resources/data/twilightforest/worldgen/structure/large_hollow_hill.json new file mode 100644 index 0000000000..f1b914d0a7 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/structure/large_hollow_hill.json @@ -0,0 +1,83 @@ +{ + "type": "twilightforest:hollow_hill", + "adjust_structure_elevation": false, + "allow_biome_surface_decorations": true, + "allow_biome_underground_decorations": false, + "ambient_spawns": [], + "biomes": "#twilightforest:valid_hollow_hill_biomes", + "chunk_clearance_radius": 3, + "hill_size": 3, + "labelled_monster_spawns": { + "0": [ + { + "type": "twilightforest:redcap", + "maxCount": 4, + "minCount": 2, + "weight": 10 + }, + { + "type": "twilightforest:redcap_sapper", + "maxCount": 2, + "minCount": 1, + "weight": 2 + }, + { + "type": "minecraft:skeleton", + "maxCount": 3, + "minCount": 2, + "weight": 10 + }, + { + "type": "minecraft:cave_spider", + "maxCount": 2, + "minCount": 1, + "weight": 10 + }, + { + "type": "minecraft:creeper", + "maxCount": 1, + "minCount": 1, + "weight": 10 + }, + { + "type": "minecraft:enderman", + "maxCount": 1, + "minCount": 1, + "weight": 1 + }, + { + "type": "twilightforest:wraith", + "maxCount": 2, + "minCount": 1, + "weight": 2 + }, + { + "type": "twilightforest:fire_beetle", + "maxCount": 2, + "minCount": 1, + "weight": 10 + }, + { + "type": "twilightforest:slime_beetle", + "maxCount": 2, + "minCount": 1, + "weight": 10 + }, + { + "type": "twilightforest:pinch_beetle", + "maxCount": 2, + "minCount": 1, + "weight": 10 + }, + { + "type": "minecraft:witch", + "maxCount": 1, + "minCount": 1, + "weight": 1 + } + ] + }, + "spawn_overrides": {}, + "step": "surface_structures", + "water_spawns": [] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/structure/lich_tower.json b/src/generated/resources/data/twilightforest/worldgen/structure/lich_tower.json new file mode 100644 index 0000000000..2a35a59c30 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/structure/lich_tower.json @@ -0,0 +1,73 @@ +{ + "type": "twilightforest:lich_tower", + "adjust_structure_elevation": true, + "advancements_required": [ + "twilightforest:progress_naga" + ], + "allow_biome_surface_decorations": false, + "allow_biome_underground_decorations": true, + "ambient_spawns": [], + "biomes": "#twilightforest:valid_lich_tower_biomes", + "chunk_clearance_radius": 1, + "hint_item": { + "Count": 1, + "id": "minecraft:written_book", + "tag": { + "author": "twilightforest.book.author", + "generation": 3, + "pages": [ + "{\"translate\":\"twilightforest.book.lichtower.1\"}", + "{\"translate\":\"twilightforest.book.lichtower.2\"}", + "{\"translate\":\"twilightforest.book.lichtower.3\"}", + "{\"translate\":\"twilightforest.book.lichtower.4\"}" + ], + "title": "twilightforest.book.lichtower", + "twilightforest:book": 1 + } + }, + "hint_mob": "twilightforest:kobold", + "labelled_monster_spawns": { + "0": [ + { + "type": "minecraft:zombie", + "maxCount": 2, + "minCount": 1, + "weight": 10 + }, + { + "type": "minecraft:skeleton", + "maxCount": 2, + "minCount": 1, + "weight": 10 + }, + { + "type": "minecraft:creeper", + "maxCount": 1, + "minCount": 1, + "weight": 1 + }, + { + "type": "minecraft:enderman", + "maxCount": 2, + "minCount": 1, + "weight": 1 + }, + { + "type": "twilightforest:death_tome", + "maxCount": 3, + "minCount": 2, + "weight": 10 + }, + { + "type": "minecraft:witch", + "maxCount": 1, + "minCount": 1, + "weight": 1 + } + ] + }, + "spawn_overrides": {}, + "step": "surface_structures", + "terrain_adaptation": "beard_thin", + "water_spawns": [] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/structure/medium_hollow_hill.json b/src/generated/resources/data/twilightforest/worldgen/structure/medium_hollow_hill.json new file mode 100644 index 0000000000..59e783db2a --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/structure/medium_hollow_hill.json @@ -0,0 +1,77 @@ +{ + "type": "twilightforest:hollow_hill", + "adjust_structure_elevation": false, + "allow_biome_surface_decorations": true, + "allow_biome_underground_decorations": false, + "ambient_spawns": [], + "biomes": "#twilightforest:valid_hollow_hill_biomes", + "chunk_clearance_radius": 2, + "hill_size": 2, + "labelled_monster_spawns": { + "0": [ + { + "type": "twilightforest:redcap", + "maxCount": 2, + "minCount": 1, + "weight": 10 + }, + { + "type": "twilightforest:redcap_sapper", + "maxCount": 2, + "minCount": 1, + "weight": 1 + }, + { + "type": "twilightforest:kobold", + "maxCount": 4, + "minCount": 2, + "weight": 10 + }, + { + "type": "minecraft:skeleton", + "maxCount": 3, + "minCount": 2, + "weight": 10 + }, + { + "type": "twilightforest:swarm_spider", + "maxCount": 4, + "minCount": 2, + "weight": 10 + }, + { + "type": "minecraft:spider", + "maxCount": 3, + "minCount": 1, + "weight": 10 + }, + { + "type": "minecraft:creeper", + "maxCount": 2, + "minCount": 1, + "weight": 10 + }, + { + "type": "twilightforest:fire_beetle", + "maxCount": 1, + "minCount": 1, + "weight": 5 + }, + { + "type": "twilightforest:slime_beetle", + "maxCount": 1, + "minCount": 1, + "weight": 5 + }, + { + "type": "minecraft:witch", + "maxCount": 1, + "minCount": 1, + "weight": 1 + } + ] + }, + "spawn_overrides": {}, + "step": "surface_structures", + "water_spawns": [] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/structure/mushroom_tower.json b/src/generated/resources/data/twilightforest/worldgen/structure/mushroom_tower.json new file mode 100644 index 0000000000..6cf85a15dc --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/structure/mushroom_tower.json @@ -0,0 +1,10 @@ +{ + "type": "twilightforest:mushroom_tower", + "adjust_structure_elevation": true, + "allow_biome_surface_decorations": true, + "allow_biome_underground_decorations": true, + "biomes": "#twilightforest:valid_mushroom_tower_biomes", + "chunk_clearance_radius": 2, + "spawn_overrides": {}, + "step": "surface_structures" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/structure/naga_courtyard.json b/src/generated/resources/data/twilightforest/worldgen/structure/naga_courtyard.json new file mode 100644 index 0000000000..bb31d178f3 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/structure/naga_courtyard.json @@ -0,0 +1,11 @@ +{ + "type": "twilightforest:naga_courtyard", + "adjust_structure_elevation": true, + "allow_biome_surface_decorations": false, + "allow_biome_underground_decorations": true, + "biomes": "#twilightforest:valid_naga_courtyard_biomes", + "chunk_clearance_radius": 3, + "spawn_overrides": {}, + "step": "surface_structures", + "terrain_adaptation": "beard_thin" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/structure/quest_grove.json b/src/generated/resources/data/twilightforest/worldgen/structure/quest_grove.json new file mode 100644 index 0000000000..67896eb767 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/structure/quest_grove.json @@ -0,0 +1,11 @@ +{ + "type": "twilightforest:quest_grove", + "adjust_structure_elevation": true, + "allow_biome_surface_decorations": false, + "allow_biome_underground_decorations": true, + "biomes": "#twilightforest:valid_quest_grove_biomes", + "chunk_clearance_radius": 1, + "spawn_overrides": {}, + "step": "surface_structures", + "terrain_adaptation": "beard_thin" +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/structure/small_hollow_hill.json b/src/generated/resources/data/twilightforest/worldgen/structure/small_hollow_hill.json new file mode 100644 index 0000000000..cefa4e19ef --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/structure/small_hollow_hill.json @@ -0,0 +1,47 @@ +{ + "type": "twilightforest:hollow_hill", + "adjust_structure_elevation": false, + "allow_biome_surface_decorations": true, + "allow_biome_underground_decorations": false, + "ambient_spawns": [], + "biomes": "#twilightforest:valid_hollow_hill_biomes", + "chunk_clearance_radius": 1, + "hill_size": 1, + "labelled_monster_spawns": { + "0": [ + { + "type": "minecraft:spider", + "maxCount": 4, + "minCount": 4, + "weight": 10 + }, + { + "type": "minecraft:zombie", + "maxCount": 4, + "minCount": 4, + "weight": 10 + }, + { + "type": "twilightforest:redcap", + "maxCount": 4, + "minCount": 4, + "weight": 10 + }, + { + "type": "twilightforest:swarm_spider", + "maxCount": 4, + "minCount": 4, + "weight": 10 + }, + { + "type": "twilightforest:kobold", + "maxCount": 8, + "minCount": 4, + "weight": 10 + } + ] + }, + "spawn_overrides": {}, + "step": "surface_structures", + "water_spawns": [] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/structure/troll_cave.json b/src/generated/resources/data/twilightforest/worldgen/structure/troll_cave.json new file mode 100644 index 0000000000..5b38e1f343 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/structure/troll_cave.json @@ -0,0 +1,74 @@ +{ + "type": "twilightforest:troll_cave", + "adjust_structure_elevation": false, + "advancements_required": [ + "twilightforest:progress_merge" + ], + "allow_biome_surface_decorations": true, + "allow_biome_underground_decorations": true, + "ambient_spawns": [], + "biomes": "#twilightforest:valid_troll_cave_biomes", + "chunk_clearance_radius": 4, + "hint_item": { + "Count": 1, + "id": "minecraft:written_book", + "tag": { + "author": "twilightforest.book.author", + "generation": 3, + "pages": [ + "{\"translate\":\"twilightforest.book.trollcave.1\"}", + "{\"translate\":\"twilightforest.book.trollcave.2\"}", + "{\"translate\":\"twilightforest.book.trollcave.3\"}" + ], + "title": "twilightforest.book.trollcave", + "twilightforest:book": 1 + } + }, + "hint_mob": "twilightforest:kobold", + "labelled_monster_spawns": { + "0": [ + { + "type": "minecraft:creeper", + "maxCount": 2, + "minCount": 1, + "weight": 5 + }, + { + "type": "minecraft:skeleton", + "maxCount": 2, + "minCount": 1, + "weight": 10 + }, + { + "type": "twilightforest:troll", + "maxCount": 2, + "minCount": 1, + "weight": 20 + }, + { + "type": "minecraft:witch", + "maxCount": 1, + "minCount": 1, + "weight": 5 + } + ], + "1": [ + { + "type": "twilightforest:giant_miner", + "maxCount": 1, + "minCount": 1, + "weight": 10 + }, + { + "type": "twilightforest:armored_giant", + "maxCount": 1, + "minCount": 1, + "weight": 10 + } + ] + }, + "spawn_overrides": {}, + "step": "underground_structures", + "terrain_adaptation": "bury", + "water_spawns": [] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/structure/yeti_cave.json b/src/generated/resources/data/twilightforest/worldgen/structure/yeti_cave.json new file mode 100644 index 0000000000..fed73b576a --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/structure/yeti_cave.json @@ -0,0 +1,42 @@ +{ + "type": "twilightforest:yeti_cave", + "adjust_structure_elevation": false, + "advancements_required": [ + "twilightforest:progress_lich" + ], + "allow_biome_surface_decorations": true, + "allow_biome_underground_decorations": false, + "ambient_spawns": [], + "biomes": "#twilightforest:valid_yeti_cave_biomes", + "chunk_clearance_radius": 2, + "hint_item": { + "Count": 1, + "id": "minecraft:written_book", + "tag": { + "author": "twilightforest.book.author", + "generation": 3, + "pages": [ + "{\"translate\":\"twilightforest.book.yeticave.1\"}", + "{\"translate\":\"twilightforest.book.yeticave.2\"}", + "{\"translate\":\"twilightforest.book.yeticave.3\"}" + ], + "title": "twilightforest.book.yeticave", + "twilightforest:book": 1 + } + }, + "hint_mob": "twilightforest:kobold", + "labelled_monster_spawns": { + "0": [ + { + "type": "twilightforest:yeti", + "maxCount": 2, + "minCount": 1, + "weight": 5 + } + ] + }, + "spawn_overrides": {}, + "step": "surface_structures", + "terrain_adaptation": "bury", + "water_spawns": [] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/structure_set/aurora_palace.json b/src/generated/resources/data/twilightforest/worldgen/structure_set/aurora_palace.json new file mode 100644 index 0000000000..1b415ecc00 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/structure_set/aurora_palace.json @@ -0,0 +1,13 @@ +{ + "placement": { + "type": "twilightforest:forced_landmark", + "landmark_set": "ice_tower", + "scan_elevation": 256 + }, + "structures": [ + { + "structure": "twilightforest:aurora_palace", + "weight": 1 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/structure_set/dark_tower.json b/src/generated/resources/data/twilightforest/worldgen/structure_set/dark_tower.json new file mode 100644 index 0000000000..be787a10d8 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/structure_set/dark_tower.json @@ -0,0 +1,13 @@ +{ + "placement": { + "type": "twilightforest:forced_landmark", + "landmark_set": "dark_tower", + "scan_elevation": 256 + }, + "structures": [ + { + "structure": "twilightforest:dark_tower", + "weight": 1 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/structure_set/final_castle.json b/src/generated/resources/data/twilightforest/worldgen/structure_set/final_castle.json new file mode 100644 index 0000000000..a04dc7a382 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/structure_set/final_castle.json @@ -0,0 +1,13 @@ +{ + "placement": { + "type": "twilightforest:forced_landmark", + "landmark_set": "final_castle", + "scan_elevation": 256 + }, + "structures": [ + { + "structure": "twilightforest:final_castle", + "weight": 1 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/structure_set/hedge_maze.json b/src/generated/resources/data/twilightforest/worldgen/structure_set/hedge_maze.json new file mode 100644 index 0000000000..21b0f44e5b --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/structure_set/hedge_maze.json @@ -0,0 +1,13 @@ +{ + "placement": { + "type": "twilightforest:forced_landmark", + "landmark_set": "hedge_maze", + "scan_elevation": 256 + }, + "structures": [ + { + "structure": "twilightforest:hedge_maze", + "weight": 1 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/structure_set/hydra_lair.json b/src/generated/resources/data/twilightforest/worldgen/structure_set/hydra_lair.json new file mode 100644 index 0000000000..1ecee4819f --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/structure_set/hydra_lair.json @@ -0,0 +1,13 @@ +{ + "placement": { + "type": "twilightforest:forced_landmark", + "landmark_set": "hydra_lair", + "scan_elevation": 256 + }, + "structures": [ + { + "structure": "twilightforest:hydra_lair", + "weight": 1 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/structure_set/knight_stronghold.json b/src/generated/resources/data/twilightforest/worldgen/structure_set/knight_stronghold.json new file mode 100644 index 0000000000..25bd5e1dd1 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/structure_set/knight_stronghold.json @@ -0,0 +1,13 @@ +{ + "placement": { + "type": "twilightforest:forced_landmark", + "landmark_set": "knight_stronghold", + "scan_elevation": 256 + }, + "structures": [ + { + "structure": "twilightforest:knight_stronghold", + "weight": 1 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/structure_set/labyrinth.json b/src/generated/resources/data/twilightforest/worldgen/structure_set/labyrinth.json new file mode 100644 index 0000000000..ab0dee3b3b --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/structure_set/labyrinth.json @@ -0,0 +1,13 @@ +{ + "placement": { + "type": "twilightforest:forced_landmark", + "landmark_set": "labyrinth", + "scan_elevation": 256 + }, + "structures": [ + { + "structure": "twilightforest:labyrinth", + "weight": 1 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/structure_set/large_hollow_hill.json b/src/generated/resources/data/twilightforest/worldgen/structure_set/large_hollow_hill.json new file mode 100644 index 0000000000..652cd5df5d --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/structure_set/large_hollow_hill.json @@ -0,0 +1,13 @@ +{ + "placement": { + "type": "twilightforest:forced_landmark", + "landmark_set": "large_hollow_hill", + "scan_elevation": 256 + }, + "structures": [ + { + "structure": "twilightforest:large_hollow_hill", + "weight": 1 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/structure_set/lich_tower.json b/src/generated/resources/data/twilightforest/worldgen/structure_set/lich_tower.json new file mode 100644 index 0000000000..fb7a49cce9 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/structure_set/lich_tower.json @@ -0,0 +1,13 @@ +{ + "placement": { + "type": "twilightforest:forced_landmark", + "landmark_set": "lich_tower", + "scan_elevation": 256 + }, + "structures": [ + { + "structure": "twilightforest:lich_tower", + "weight": 1 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/structure_set/medium_hollow_hill.json b/src/generated/resources/data/twilightforest/worldgen/structure_set/medium_hollow_hill.json new file mode 100644 index 0000000000..31813944a7 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/structure_set/medium_hollow_hill.json @@ -0,0 +1,13 @@ +{ + "placement": { + "type": "twilightforest:forced_landmark", + "landmark_set": "medium_hollow_hill", + "scan_elevation": 256 + }, + "structures": [ + { + "structure": "twilightforest:medium_hollow_hill", + "weight": 1 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/structure_set/mushroom_tower.json b/src/generated/resources/data/twilightforest/worldgen/structure_set/mushroom_tower.json new file mode 100644 index 0000000000..ff1743e93d --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/structure_set/mushroom_tower.json @@ -0,0 +1,13 @@ +{ + "placement": { + "type": "twilightforest:forced_landmark", + "landmark_set": "mushroom_tower", + "scan_elevation": 256 + }, + "structures": [ + { + "structure": "twilightforest:mushroom_tower", + "weight": 1 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/structure_set/naga_courtyard.json b/src/generated/resources/data/twilightforest/worldgen/structure_set/naga_courtyard.json new file mode 100644 index 0000000000..f687d4f1cb --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/structure_set/naga_courtyard.json @@ -0,0 +1,13 @@ +{ + "placement": { + "type": "twilightforest:forced_landmark", + "landmark_set": "naga_courtyard", + "scan_elevation": 256 + }, + "structures": [ + { + "structure": "twilightforest:naga_courtyard", + "weight": 1 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/structure_set/quest_grove.json b/src/generated/resources/data/twilightforest/worldgen/structure_set/quest_grove.json new file mode 100644 index 0000000000..9b452aef2e --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/structure_set/quest_grove.json @@ -0,0 +1,13 @@ +{ + "placement": { + "type": "twilightforest:forced_landmark", + "landmark_set": "quest_grove", + "scan_elevation": 256 + }, + "structures": [ + { + "structure": "twilightforest:quest_grove", + "weight": 1 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/structure_set/small_hollow_hill.json b/src/generated/resources/data/twilightforest/worldgen/structure_set/small_hollow_hill.json new file mode 100644 index 0000000000..23c8355a64 --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/structure_set/small_hollow_hill.json @@ -0,0 +1,13 @@ +{ + "placement": { + "type": "twilightforest:forced_landmark", + "landmark_set": "small_hollow_hill", + "scan_elevation": 256 + }, + "structures": [ + { + "structure": "twilightforest:small_hollow_hill", + "weight": 1 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/structure_set/troll_cave.json b/src/generated/resources/data/twilightforest/worldgen/structure_set/troll_cave.json new file mode 100644 index 0000000000..240ed6ba6e --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/structure_set/troll_cave.json @@ -0,0 +1,13 @@ +{ + "placement": { + "type": "twilightforest:forced_landmark", + "landmark_set": "troll_lairs", + "scan_elevation": 256 + }, + "structures": [ + { + "structure": "twilightforest:troll_cave", + "weight": 1 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/twilightforest/worldgen/structure_set/yeti_cave.json b/src/generated/resources/data/twilightforest/worldgen/structure_set/yeti_cave.json new file mode 100644 index 0000000000..24098ffd5c --- /dev/null +++ b/src/generated/resources/data/twilightforest/worldgen/structure_set/yeti_cave.json @@ -0,0 +1,13 @@ +{ + "placement": { + "type": "twilightforest:forced_landmark", + "landmark_set": "yeti_lairs", + "scan_elevation": 256 + }, + "structures": [ + { + "structure": "twilightforest:yeti_cave", + "weight": 1 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/pack.mcmeta b/src/generated/resources/pack.mcmeta new file mode 100644 index 0000000000..0d88701e95 --- /dev/null +++ b/src/generated/resources/pack.mcmeta @@ -0,0 +1,9 @@ +{ + "pack": { + "description": { + "text": "Resources for Twilight Forest" + }, + "forge:server_data_pack_format": 12, + "pack_format": 13 + } +} \ No newline at end of file diff --git a/src/main/disabled/client/LoadingScreen.java b/src/main/disabled/client/LoadingScreen.java new file mode 100644 index 0000000000..f3e9e15547 --- /dev/null +++ b/src/main/disabled/client/LoadingScreen.java @@ -0,0 +1,482 @@ +package twilightforest.client; + +import com.mojang.blaze3d.platform.Window; +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.BufferBuilder; +import com.mojang.blaze3d.vertex.DefaultVertexFormat; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.Tesselator; +import com.mojang.blaze3d.vertex.VertexFormat; +import org.joml.Vector3f; +import net.minecraft.client.gui.Font; +import net.minecraft.client.gui.chat.NarratorChatListener; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.client.resources.language.I18n; +import net.minecraft.core.BlockPos; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import twilightforest.TFConfig; +import twilightforest.TwilightForestMod; + +import java.util.Random; + +//retired loading screen, see https://twitter.com/Drullkus/status/928466334744064000 for a video example. +//1.16+ load times have gotten a lot better, and you cant really see this screen anymore. +//it also breaks in one way or another every update, so we're gonna retire it until we find another use for it. +@OnlyIn(Dist.CLIENT) +public class LoadingScreen extends Screen { + + private boolean isEntering; + private boolean contentNeedsAssignment = false; + private long ticks = 0L; + private long seed; + private BackgroundThemes backgroundTheme; + private ItemStack item; + + private static final Random random = new Random(); + private static final float backgroundScale = 32.0F; + private static final TFConfig.Client.LoadingScreen LOADING_SCREEN = TFConfig.CLIENT_CONFIG.LOADING_SCREEN; + + LoadingScreen() { + super(NarratorChatListener.NO_TITLE); + } + + void setEntering(boolean isEntering) { + this.isEntering = isEntering; + } + + @Override + protected void init() { + this.renderables.clear(); + this.assignContent(); + } + + @Override + public boolean isPauseScreen() { + return false; + } + + @Override + public void tick() { + if (minecraft != null && minecraft.level != null && LOADING_SCREEN.cycleLoadingScreenFrequency.get() != 0 && ++ticks % LOADING_SCREEN.cycleLoadingScreenFrequency.get() == 0) + assignContent(); + + if (this.minecraft != null && this.minecraft.player != null) { + BlockPos blockpos = this.minecraft.player.blockPosition(); + boolean flag1 = this.minecraft.level != null && this.minecraft.level.isOutsideBuildHeight(blockpos.getY()); + if (flag1 || this.minecraft.levelRenderer.isChunkCompiled(blockpos)) { + this.onClose(); + } + } + } + + @Override + public void render(PoseStack ms, int mouseX, int mouseY, float partialTicks) { + if (this.contentNeedsAssignment) { + this.assignContent(); + this.contentNeedsAssignment = false; + } + + Font fontRenderer = minecraft.font; + Window resolution = minecraft.getWindow(); + + + drawBackground(resolution.getGuiScaledWidth(), resolution.getGuiScaledHeight()); + + PoseStack stack = RenderSystem.getModelViewStack(); + RenderSystem.applyModelViewMatrix(); + drawBouncingWobblyItem(stack, partialTicks, resolution.getGuiScaledWidth(), resolution.getGuiScaledHeight()); + RenderSystem.applyModelViewMatrix(); + + String loadTitle = I18n.get(TwilightForestMod.ID + ".loading.title." + (isEntering ? "enter" : "leave")); + ms.pushPose(); + ms.translate( + (resolution.getGuiScaledWidth() / 2f) - (fontRenderer.width(loadTitle) / 4f), + (resolution.getGuiScaledHeight() / 3f), + 0f + ); + ms.translate(-(fontRenderer.width(loadTitle) / 4f), 0f, 0f); + fontRenderer.drawShadow(ms, loadTitle, 0, 0, 0xEEEEEE); //eeeeeeeeeeeeeeeeee + ms.popPose(); + RenderSystem.setShaderColor(1F, 1F, 1F, 1F); + } + + private void assignContent() { + backgroundTheme = BackgroundThemes.values()[random.nextInt(BackgroundThemes.values().length)]; + item = LOADING_SCREEN.getLoadingScreenIcons().get(random.nextInt(LOADING_SCREEN.getLoadingScreenIcons().size())); + seed = random.nextLong(); + } + + private void drawBackground(float width, float height) { + random.setSeed(seed); + + backgroundTheme.renderBackground(width, height); + backgroundTheme.postRenderBackground(width, height); + } + + private void drawBouncingWobblyItem(PoseStack stack, float partialTicks, float width, float height) { + float sineTicker = (TFClientEvents.sineTicker + partialTicks) * LOADING_SCREEN.frequency.get().floatValue(); + float sineTicker2 = (TFClientEvents.sineTicker + 314f + partialTicks) * LOADING_SCREEN.frequency.get().floatValue(); + + stack.pushPose(); + + // Shove it! + stack.translate(width - ((width / 30f) * LOADING_SCREEN.scale.get().floatValue()), height - (height / 10f), 0f); // Bottom right Corner + + if (LOADING_SCREEN.enable.get()) { + // Wobble it! + stack.mulPose(Vector3f.ZP.rotationDegrees(Mth.sin(sineTicker / LOADING_SCREEN.tiltRange.get().floatValue()) * LOADING_SCREEN.tiltConstant.get().floatValue())); + + // Bounce it! + stack.scale(((Mth.sin(((sineTicker2 + 180F) / LOADING_SCREEN.tiltRange.get().floatValue()) * 2F) / LOADING_SCREEN.scaleDeviation.get().floatValue()) + 2F) * (LOADING_SCREEN.scale.get().floatValue() / 2F), ((Mth.sin(((sineTicker + 180F) / LOADING_SCREEN.tiltRange.get().floatValue()) * 2F) / LOADING_SCREEN.scaleDeviation.get().floatValue()) + 2F) * (LOADING_SCREEN.scale.get().floatValue() / 2F), 1F); + } + + // Shift it! + stack.translate(-8f, -16.5f, 0f); + + // Draw it! + minecraft.getItemRenderer().renderAndDecorateItem(item, 0, 0); + + // Pop it! + stack.popPose(); + // Bop it! + } + + public enum BackgroundThemes { + LABYRINTH( + TwilightForestMod.prefix("textures/block/mazestone_brick.png"), + TwilightForestMod.prefix("textures/block/mazestone_brick.png"), + //TwilightForestMod.prefix("textures/block/mossy_mazestone.png" ), + TwilightForestMod.prefix("textures/block/cracked_mazestone.png") + ) { + private final ResourceLocation mazestoneDecor = TwilightForestMod.prefix("textures/block/decorative_mazestone.png"); + + @Override + void postRenderBackground(float width, float height) { + Tesselator tessellator = Tesselator.getInstance(); + BufferBuilder buffer = tessellator.getBuilder(); + RenderSystem.setShaderTexture(0, mazestoneDecor); + + buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX_COLOR); + buffer.vertex(0, 24F, 0F) + .uv(0F, 0.75F) + .color(0.5F, 0.5F, 0.5F, 1F) + .endVertex(); + buffer.vertex(width, 24F, 0F) + .uv(width / backgroundScale, 0.75F) + .color(0.5F, 0.5F, 0.5F, 1F) + .endVertex(); + buffer.vertex(width, 8F, 0F) + .uv(width / backgroundScale, 0.25F) + .color(0.5F, 0.5F, 0.5F, 1F) + .endVertex(); + buffer.vertex(0, 8F, 0) + .uv(0F, 0.25F) + .color(0.5F, 0.5F, 0.5F, 1F) + .endVertex(); + tessellator.end(); + + float halfScale = backgroundScale / 2F; + float bottomGrid = height - (height % halfScale); + + buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX_COLOR); + buffer.vertex(0, bottomGrid, 0F) + .uv(0F, 0.75F) + .color(0.5F, 0.5F, 0.5F, 1F) + .endVertex(); + buffer.vertex(width, bottomGrid, 0F) + .uv(width / backgroundScale, 0.75F) + .color(0.5F, 0.5F, 0.5F, 1F) + .endVertex(); + buffer.vertex(width, bottomGrid - halfScale, 0F) + .uv(width / backgroundScale, 0.25F) + .color(0.5F, 0.5F, 0.5F, 1F) + .endVertex(); + buffer.vertex(0, bottomGrid - halfScale, 0) + .uv(0F, 0.25F) + .color(0.5F, 0.5F, 0.5F, 1F) + .endVertex(); + tessellator.end(); + } + }, + STRONGHOLD( + TwilightForestMod.prefix("textures/block/underbrick.png"), + TwilightForestMod.prefix("textures/block/mossy_underbrick.png"), + TwilightForestMod.prefix("textures/block/cracked_underbrick.png") + ), + DARKTOWER( + TwilightForestMod.prefix("textures/block/towerwood.png"), + TwilightForestMod.prefix("textures/block/towerwood.png"), + TwilightForestMod.prefix("textures/block/mossy_towerwood.png"), + TwilightForestMod.prefix("textures/block/cracked_towerwood.png"), + TwilightForestMod.prefix("textures/block/cracked_towerwood_alt.png") + ) { + private final ResourceLocation towerwoodEncased = TwilightForestMod.prefix("textures/block/encased_towerwood.png"); + + private final float stretch = 0.985F; + private final float depth = 1.15F; + + @Override + void renderBackground(float width, float height) { + final float headerDepthHeight = (backgroundScale / stretch) * depth; + final float footerDepthHeight = height - headerDepthHeight; + + Tesselator tessellator = Tesselator.getInstance(); + BufferBuilder buffer = tessellator.getBuilder(); + RenderSystem.setShaderColor(0.9F, 0.9F, 0.9F, 1.0F); + + for (float x = backgroundScale; x < width + backgroundScale; x += backgroundScale) { + for (float y = backgroundScale + headerDepthHeight; y < footerDepthHeight + backgroundScale; y += backgroundScale) { + RenderSystem.setShaderTexture(0, this.getBackgroundMaterials()[random.nextInt(this.getBackgroundMaterials().length)]); + buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX_COLOR); + buffer.vertex(x - backgroundScale, y, 0) + .uv(0, 1) + .color(0.5f, 0.5f, 0.5f, 1f) + .endVertex(); + buffer.vertex(x, y, 0) + .uv(1, 1) + .color(0.5f, 0.5f, 0.5f, 1f) + .endVertex(); + buffer.vertex(x, y - backgroundScale, 0) + .uv(1, 0) + .color(0.5f, 0.5f, 0.5f, 1f) + .endVertex(); + buffer.vertex(x - backgroundScale, y - backgroundScale, 0) + .uv(0, 0) + .color(0.5f, 0.5f, 0.5f, 1f) + .endVertex(); + tessellator.end(); + } + } + } + + @Override + void postRenderBackground(float width, float height) { + Tesselator tessellator = Tesselator.getInstance(); + BufferBuilder buffer = tessellator.getBuilder(); + RenderSystem.setShaderTexture(0, towerwoodEncased); + + float offset = 0.4F; + final float textureHeaderXMin = stretch * offset; + final float textureHeaderXMax = ((width / backgroundScale) * stretch) + offset; + + final float headerBottom = backgroundScale / stretch; + final float headerDepthHeight = headerBottom * depth; + + final float footerTop = height - headerBottom; + final float footerDepthHeight = height - headerDepthHeight; + + buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX_COLOR); + // BOTTOM VERTEXES + buffer.vertex(0F, headerBottom, 0F) + .uv(textureHeaderXMin, 1F) + .color(0.5F, 0.5F, 0.5F, 1F) + .endVertex(); + buffer.vertex(width, headerBottom, 0F) + .uv(textureHeaderXMax, 1F) + .color(0.5F, 0.5F, 0.5F, 1F) + .endVertex(); + // TOP VERTEXES + buffer.vertex(width, 0F, 0F) + .uv(textureHeaderXMax, 0F) + .color(0.5F, 0.5F, 0.5F, 1F) + .endVertex(); + buffer.vertex(0F, 0F, 0F) + .uv(textureHeaderXMin, 0F) + .color(0.5F, 0.5F, 0.5F, 1F) + .endVertex(); + tessellator.end(); + + buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX_COLOR); + // BOTTOM VERTEXES + buffer.vertex(0F, headerDepthHeight, 0F) + .uv(0F, 1F) + .color(0.25F, 0.25F, 0.25F, 1F) + .endVertex(); + buffer.vertex(width, headerDepthHeight, 0F) + .uv((width / backgroundScale), 1F) + .color(0.25F, 0.25F, 0.25F, 1F) + .endVertex(); + // TOP VERTEXES + buffer.vertex(width, headerBottom, 0F) + .uv(textureHeaderXMax, 0F) + .color(0.25F, 0.25F, 0.25F, 1F) + .endVertex(); + buffer.vertex(0F, headerBottom, 0F) + .uv(textureHeaderXMin, 0F) + .color(0.25F, 0.25F, 0.25F, 1F) + .endVertex(); + tessellator.end(); + + buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX_COLOR); + // BOTTOM VERTEXES + buffer.vertex(0F, height, 0F) + .uv(textureHeaderXMin, 1F) + .color(0.5F, 0.5F, 0.5F, 1F) + .endVertex(); + buffer.vertex(width, height, 0F) + .uv(textureHeaderXMax, 1F) + .color(0.5F, 0.5F, 0.5F, 1F) + .endVertex(); + // TOP VERTEXES + buffer.vertex(width, footerTop, 0F) + .uv(textureHeaderXMax, 0F) + .color(0.5F, 0.5F, 0.5F, 1F) + .endVertex(); + buffer.vertex(0F, footerTop, 0F) + .uv(textureHeaderXMin, 0F) + .color(0.5F, 0.5F, 0.5F, 1F) + .endVertex(); + tessellator.end(); + + buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX_COLOR); + // BOTTOM VERTEXES + buffer.vertex(0F, footerTop, 0F) + .uv(textureHeaderXMin, 1F) + .color(0.75F, 0.75F, 0.75F, 1F) + .endVertex(); + buffer.vertex(width, footerTop, 0F) + .uv(textureHeaderXMax, 1F) + .color(0.75F, 0.75F, 0.75F, 1F) + .endVertex(); + // TOP VERTEXES + buffer.vertex(width, footerDepthHeight, 0F) + .uv(width / backgroundScale, 0F) + .color(0.75F, 0.75F, 0.75F, 1F) + .endVertex(); + buffer.vertex(0F, footerDepthHeight, 0F) + .uv(0F, 0F) + .color(0.75F, 0.75F, 0.75F, 1F) + .endVertex(); + tessellator.end(); + } + }, + FINALCASTLE( + TwilightForestMod.prefix("textures/block/castle_brick.png"), + TwilightForestMod.prefix("textures/block/castle_brick.png"), + TwilightForestMod.prefix("textures/block/castle_brick.png"), + TwilightForestMod.prefix("textures/block/castle_brick.png"), + TwilightForestMod.prefix("textures/block/castle_brick.png"), + //TwilightForestMod.prefix("textures/block/mossy_castle_brick.png" ), // Jeez this one does not fit at ALL. Out! + TwilightForestMod.prefix("textures/block/cracked_castle_brick.png"), + TwilightForestMod.prefix("textures/block/worn_castle_brick.png") + ) { + private final ResourceLocation[] magic = new ResourceLocation[]{ + TwilightForestMod.prefix("textures/block/castleblock_magic_0.png"), + TwilightForestMod.prefix("textures/block/castleblock_magic_1.png"), + TwilightForestMod.prefix("textures/block/castleblock_magic_2.png"), + TwilightForestMod.prefix("textures/block/castleblock_magic_3.png"), + TwilightForestMod.prefix("textures/block/castleblock_magic_4.png"), + TwilightForestMod.prefix("textures/block/castleblock_magic_5.png"), + TwilightForestMod.prefix("textures/block/castleblock_magic_6.png"), + TwilightForestMod.prefix("textures/block/castleblock_magic_7.png") + }; + + private final int[] colors = new int[]{0xFF00FF, 0x00FFFF, 0xFFFF00, 0x4B0082}; + + @Override + void postRenderBackground(float width, float height) { + Tesselator tessellator = Tesselator.getInstance(); + BufferBuilder buffer = tessellator.getBuilder(); + + int color = this.colors[random.nextInt(this.colors.length)]; + + int r = color >> 16 & 255; + int g = color >> 8 & 255; + int b = color & 255; + + for (float x = backgroundScale; x < width + backgroundScale; x += backgroundScale) { + RenderSystem.setShaderTexture(0, this.magic[random.nextInt(this.magic.length)]); + buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX_COLOR); + buffer.vertex(x - backgroundScale, backgroundScale + (backgroundScale / 2), 0) + .uv(0, 1) + .color(r, g, b, 255) + .endVertex(); + buffer.vertex(x, backgroundScale + (backgroundScale / 2), 0) + .uv(1, 1) + .color(r, g, b, 255) + .endVertex(); + buffer.vertex(x, backgroundScale / 2, 0) + .uv(1, 0) + .color(r, g, b, 255) + .endVertex(); + buffer.vertex(x - backgroundScale, backgroundScale / 2, 0) + .uv(0, 0) + .color(r, g, b, 255) + .endVertex(); + tessellator.end(); + } + + for (float x = backgroundScale; x < width + backgroundScale; x += backgroundScale) { + RenderSystem.setShaderTexture(0, this.magic[random.nextInt(this.magic.length)]); + buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX_COLOR); + buffer.vertex(x - backgroundScale, height - (backgroundScale / 2), 0) + .uv(0, 1) + .color(r, g, b, 255) + .endVertex(); + buffer.vertex(x, height - (backgroundScale / 2), 0) + .uv(1, 1) + .color(r, g, b, 255) + .endVertex(); + buffer.vertex(x, height - backgroundScale - (backgroundScale / 2), 0) + .uv(1, 0) + .color(r, g, b, 255) + .endVertex(); + buffer.vertex(x - backgroundScale, height - backgroundScale - (backgroundScale / 2), 0) + .uv(0, 0) + .color(r, g, b, 255) + .endVertex(); + tessellator.end(); + } + } + }; + + private final ResourceLocation[] backgroundMaterials; + + BackgroundThemes(ResourceLocation... backgroundMaterials) { + this.backgroundMaterials = backgroundMaterials; + } + + ResourceLocation[] getBackgroundMaterials() { + return backgroundMaterials; + } + + void renderBackground(float width, float height) { + RenderSystem.setShader(GameRenderer::getPositionTexShader); + Tesselator tessellator = Tesselator.getInstance(); + BufferBuilder buffer = tessellator.getBuilder(); + RenderSystem.setShaderColor(0.9F, 0.9F, 0.9F, 1.0F); + + for (float x = backgroundScale; x < width + backgroundScale; x += backgroundScale) { + for (float y = backgroundScale; y < height + backgroundScale; y += backgroundScale) { + RenderSystem.setShaderTexture(0, this.getBackgroundMaterials()[random.nextInt(this.getBackgroundMaterials().length)]); + buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX_COLOR); + buffer.vertex(x - backgroundScale, y, 0) + .uv(0, 1) + .color(0.5f, 0.5f, 0.5f, 1f) + .endVertex(); + buffer.vertex(x, y, 0) + .uv(1, 1) + .color(0.5f, 0.5f, 0.5f, 1f) + .endVertex(); + buffer.vertex(x, y - backgroundScale, 0) + .uv(1, 0) + .color(0.5f, 0.5f, 0.5f, 1f) + .endVertex(); + buffer.vertex(x - backgroundScale, y - backgroundScale, 0) + .uv(0, 0) + .color(0.5f, 0.5f, 0.5f, 1f) + .endVertex(); + tessellator.end(); + } + } + } + + void postRenderBackground(float width, float height) { + } + } +} diff --git a/src/main/disabled/client/model/entity/CastleGuardianModel.java b/src/main/disabled/client/model/entity/CastleGuardianModel.java new file mode 100644 index 0000000000..3708eb57cd --- /dev/null +++ b/src/main/disabled/client/model/entity/CastleGuardianModel.java @@ -0,0 +1,585 @@ +package twilightforest.client.model.entity.finalcastle; + +import com.google.common.collect.ImmutableList; +import net.minecraft.client.Minecraft; +import net.minecraft.client.model.ListModel; +import net.minecraft.client.model.geom.ModelPart; +import twilightforest.entity.finalcastle.CastleGuardianEntity; + +/** + * guardian - Drullkus + * Created using Tabula 7.0.0 + */ + +// TODO Optimize, holy fudge +@SuppressWarnings({"unused", "WeakerAccess"}) +public class CastleGuardianModel extends ListModel { + public ModelPart MainBody; + public ModelPart MidBody; + public ModelPart Head; + public ModelPart PlateGroup1; + public ModelPart PlateGroup2; + public ModelPart PlateGroup3; + public ModelPart PlateGroup4; + public ModelPart PlateGroup5; + public ModelPart PlateGroup6; + public ModelPart Plating; + public ModelPart SpikeWrapper; + public ModelPart InnerSupport; + public ModelPart Support; + public ModelPart Spike; + public ModelPart SpikeCap; + public ModelPart Plating_1; + public ModelPart SpikeWrapper_1; + public ModelPart InnerSupport_1; + public ModelPart Support_1; + public ModelPart Spike_1; + public ModelPart SpikeCap_1; + public ModelPart Plating_2; + public ModelPart SpikeWrapper_2; + public ModelPart InnerSupport_2; + public ModelPart Support_2; + public ModelPart Spike_2; + public ModelPart SpikeCap_2; + public ModelPart Plating_3; + public ModelPart SpikeWrapper_3; + public ModelPart InnerSupport_3; + public ModelPart Support_3; + public ModelPart Spike_3; + public ModelPart SpikeCap_3; + public ModelPart Plating_4; + public ModelPart SpikeWrapper_4; + public ModelPart InnerSupport_4; + public ModelPart Support_4; + public ModelPart Spike_4; + public ModelPart SpikeCap_4; + public ModelPart Plating_5; + public ModelPart SpikeWrapper_5; + public ModelPart InnerSupport_5; + public ModelPart Support_5; + public ModelPart Spike_5; + public ModelPart SpikeCap_5; + public ModelPart RunedSiding1; + public ModelPart Bridge1; + public ModelPart RunedSiding2; + public ModelPart Bridge2; + public ModelPart RunedSiding3; + public ModelPart Bridge3; + public ModelPart RunedSiding4; + public ModelPart Bridge4; + public ModelPart Cover; + public ModelPart HeadGroup2; + public ModelPart HeadGroup3; + public ModelPart HeadGroup4; + public ModelPart HeadGroup5; + public ModelPart HeadGroup6; + public ModelPart EyeBack; + public ModelPart HeadGroup1; + public ModelPart HeadPlate; + public ModelPart HeadSpikeWrapper; + public ModelPart HeadExtended; + public ModelPart HeadSpike; + public ModelPart HeadPlate_1; + public ModelPart HeadSpikeWrapper_1; + public ModelPart HeadExtended_1; + public ModelPart HeadSpike_1; + public ModelPart HeadPlate_2; + public ModelPart HeadSpikeWrapper_2; + public ModelPart HeadExtended_2; + public ModelPart HeadSpike_2; + public ModelPart HeadPlate_3; + public ModelPart HeadSpikeWrapper_3; + public ModelPart HeadExtended_3; + public ModelPart HeadSpike_3; + public ModelPart HeadPlate_4; + public ModelPart HeadSpikeWrapper_4; + public ModelPart HeadExtended_4; + public ModelPart HeadSpike_4; + public ModelPart Eye; + public ModelPart HeadPlate_5; + public ModelPart HeadSpikeWrapper_5; + public ModelPart HeadExtended_5; + public ModelPart EyeFrameR; + public ModelPart EyeFrameL; + public ModelPart EyeFrameLB; + public ModelPart EyeFrameRT; + public ModelPart EyeFrameLT; + public ModelPart EyeFrameRB; + public ModelPart HeadSpike_5; + + public CastleGuardianModel() { + this.texWidth = 128; + this.texHeight = 64; + this.SpikeWrapper_5 = new ModelPart(this, 0, 0); + this.SpikeWrapper_5.setPos(0.0F, 0.0F, 0.0F); + this.SpikeWrapper_5.addBox(0.0F, 0.0F, 0.0F, 0, 0, 0, 0.0F); + this.setRotateAngle(SpikeWrapper_5, 0.0F, 0.5235987755982988F, 0.0F); + this.EyeFrameL = new ModelPart(this, 0, 0); + this.EyeFrameL.setPos(-4.0F, 0.0F, -9.2F); + this.EyeFrameL.addBox(0.0F, -11.0F, 0.0F, 1, 5, 2, 0.0F); + this.Plating = new ModelPart(this, 0, 32); + this.Plating.setPos(0.0F, 0.0F, 0.0F); + this.Plating.addBox(29.0F, -8.0F, -8.0F, 1, 16, 16, 0.0F); + this.setRotateAngle(Plating, 0.7853981633974483F, 0.0F, -0.7853981633974483F); + this.SpikeCap = new ModelPart(this, 7, 25); + this.SpikeCap.setPos(8.0F, -1.0F, 8.0F); + this.SpikeCap.addBox(0.0F, 0.0F, 0.0F, 6, 11, 6, 0.0F); + this.Spike_1 = new ModelPart(this, 0, 0); + this.Spike_1.setPos(0.0F, -20.0F, 0.0F); + this.Spike_1.addBox(1.0F, 0.0F, 1.0F, 12, 12, 12, 0.0F); + this.setRotateAngle(Spike_1, 0.0F, 0.7853981633974483F, -0.6065019150680295F); + this.HeadExtended_2 = new ModelPart(this, 64, 33); + this.HeadExtended_2.mirror = true; + this.HeadExtended_2.setPos(0.0F, -18.0F, -5.0F); + this.HeadExtended_2.addBox(-5.0F, 1.0F, 0.0F, 10, 1, 9, 0.0F); + this.setRotateAngle(HeadExtended_2, -0.2181661564992912F, 0.0F, 0.0F); + this.SpikeWrapper_1 = new ModelPart(this, 0, 0); + this.SpikeWrapper_1.setPos(0.0F, 0.0F, 0.0F); + this.SpikeWrapper_1.addBox(0.0F, 0.0F, 0.0F, 0, 0, 0, 0.0F); + this.setRotateAngle(SpikeWrapper_1, 0.0F, 0.5235987755982988F, 0.0F); + this.Plating_1 = new ModelPart(this, 0, 32); + this.Plating_1.setPos(0.0F, 0.0F, 0.0F); + this.Plating_1.addBox(29.0F, -8.0F, -8.0F, 1, 16, 16, 0.0F); + this.setRotateAngle(Plating_1, 0.7853981633974483F, 0.0F, -0.7853981633974483F); + this.HeadPlate_5 = new ModelPart(this, 86, 0); + this.HeadPlate_5.setPos(0.0F, 0.0F, 0.0F); + this.HeadPlate_5.addBox(-5.0F, -17.0F, -9.2F, 10, 17, 4, 0.0F); + this.setRotateAngle(HeadPlate_5, 0.19634954084936207F, 0.0F, 0.0F); + this.HeadGroup1 = new ModelPart(this, 0, 0); + this.HeadGroup1.setPos(0.0F, -2.0F, 0.0F); + this.HeadGroup1.addBox(0.0F, 0.0F, 0.0F, 0, 0, 0, 0.0F); + this.Support = new ModelPart(this, 31, 24); + this.Support.setPos(0.0F, -7.0F, 0.0F); + this.Support.addBox(23.5F, 0.0F, 0.0F, 6, 7, 7, 0.0F); + this.Plating_5 = new ModelPart(this, 0, 32); + this.Plating_5.setPos(0.0F, 0.0F, 0.0F); + this.Plating_5.addBox(29.0F, -8.0F, -8.0F, 1, 16, 16, 0.0F); + this.setRotateAngle(Plating_5, 0.7853981633974483F, 0.0F, -0.7853981633974483F); + this.Spike_4 = new ModelPart(this, 0, 0); + this.Spike_4.setPos(0.0F, -20.0F, 0.0F); + this.Spike_4.addBox(1.0F, 0.0F, 1.0F, 12, 12, 12, 0.0F); + this.setRotateAngle(Spike_4, 0.0F, 0.7853981633974483F, -0.6065019150680295F); + this.MainBody = new ModelPart(this, 6, 49); + this.MainBody.setPos(0.0F, 0.0F, 0.0F); + this.MainBody.addBox(-7.0F, 18.8F, -7.5F, 14, 2, 14, 0.0F); + this.setRotateAngle(MainBody, 0.0F, 1.5707963267948966F, 0.0F); + this.HeadSpikeWrapper_3 = new ModelPart(this, 0, 0); + this.HeadSpikeWrapper_3.setPos(0.0F, 0.0F, 0.0F); + this.HeadSpikeWrapper_3.addBox(0.0F, 0.0F, 0.0F, 0, 0, 0, 0.0F); + this.setRotateAngle(HeadSpikeWrapper_3, 0.0F, 2.0943951023931953F, 0.0F); + this.SpikeCap_3 = new ModelPart(this, 7, 25); + this.SpikeCap_3.setPos(8.0F, -1.0F, 8.0F); + this.SpikeCap_3.addBox(0.0F, 0.0F, 0.0F, 6, 11, 6, 0.0F); + this.SpikeWrapper = new ModelPart(this, 0, 0); + this.SpikeWrapper.setPos(0.0F, 0.0F, 0.0F); + this.SpikeWrapper.addBox(0.0F, 0.0F, 0.0F, 0, 0, 0, 0.0F); + this.setRotateAngle(SpikeWrapper, 0.0F, 0.5235987755982988F, 0.0F); + this.Bridge3 = new ModelPart(this, 36, 0); + this.Bridge3.setPos(0.0F, 0.0F, 0.0F); + this.Bridge3.addBox(-4.0F, -3.0F, 6.0F, 8, 9, 3, 0.0F); + this.setRotateAngle(Bridge3, -0.28361600344907856F, -2.356194490192345F, 0.0F); + this.HeadSpikeWrapper_4 = new ModelPart(this, 0, 0); + this.HeadSpikeWrapper_4.setPos(0.0F, 0.0F, 0.0F); + this.HeadSpikeWrapper_4.addBox(0.0F, 0.0F, 0.0F, 0, 0, 0, 0.0F); + this.setRotateAngle(HeadSpikeWrapper_4, 0.0F, 2.0943951023931953F, 0.0F); + this.HeadSpikeWrapper_5 = new ModelPart(this, 0, 0); + this.HeadSpikeWrapper_5.setPos(0.0F, 0.0F, 0.0F); + this.HeadSpikeWrapper_5.addBox(0.0F, 0.0F, 0.0F, 0, 0, 0, 0.0F); + this.setRotateAngle(HeadSpikeWrapper_5, 0.0F, 2.0943951023931953F, 0.0F); + this.Support_3 = new ModelPart(this, 31, 24); + this.Support_3.setPos(0.0F, -7.0F, 0.0F); + this.Support_3.addBox(23.5F, 0.0F, 0.0F, 6, 7, 7, 0.0F); + this.InnerSupport_3 = new ModelPart(this, 23, 38); + this.InnerSupport_3.setPos(0.0F, -10.0F, 0.0F); + this.InnerSupport_3.addBox(7.0F, -1.4F, -4.0F, 11, 2, 8, 0.0F); + this.setRotateAngle(InnerSupport_3, 0.0F, 0.0F, -0.4553564018453205F); + this.SpikeWrapper_4 = new ModelPart(this, 0, 0); + this.SpikeWrapper_4.setPos(0.0F, 0.0F, 0.0F); + this.SpikeWrapper_4.addBox(0.0F, 0.0F, 0.0F, 0, 0, 0, 0.0F); + this.setRotateAngle(SpikeWrapper_4, 0.0F, 0.5235987755982988F, 0.0F); + this.HeadSpikeWrapper_2 = new ModelPart(this, 0, 0); + this.HeadSpikeWrapper_2.setPos(0.0F, 0.0F, 0.0F); + this.HeadSpikeWrapper_2.addBox(0.0F, 0.0F, 0.0F, 0, 0, 0, 0.0F); + this.setRotateAngle(HeadSpikeWrapper_2, 0.0F, 2.0943951023931953F, 0.0F); + this.HeadSpike_4 = new ModelPart(this, 57, 21); + this.HeadSpike_4.setPos(0.0F, 0.0F, 0.0F); + this.HeadSpike_4.addBox(3.7F, -17.9F, 3.7F, 4, 17, 4, 0.0F); + this.setRotateAngle(HeadSpike_4, 0.0F, 0.7853981633974483F, 0.26703537555513246F); + this.HeadPlate_2 = new ModelPart(this, 58, 0); + this.HeadPlate_2.setPos(0.0F, 0.0F, 0.0F); + this.HeadPlate_2.addBox(-5.0F, -17.0F, -9.2F, 10, 17, 4, 0.0F); + this.setRotateAngle(HeadPlate_2, 0.19634954084936207F, 0.0F, 0.0F); + this.EyeFrameR = new ModelPart(this, 4, 0); + this.EyeFrameR.setPos(3.0F, 0.0F, -9.2F); + this.EyeFrameR.addBox(0.0F, -11.0F, 0.0F, 1, 5, 2, 0.0F); + this.EyeFrameLT = new ModelPart(this, 0, 0); + this.EyeFrameLT.setPos(-4.0F, -10.0F, -9.2F); + this.EyeFrameLT.addBox(0.0F, -5.0F, 0.0F, 1, 5, 2, 0.0F); + this.setRotateAngle(EyeFrameLT, 0.0F, 0.0F, 0.7853981633974483F); + this.SpikeWrapper_3 = new ModelPart(this, 0, 0); + this.SpikeWrapper_3.setPos(0.0F, 0.0F, 0.0F); + this.SpikeWrapper_3.addBox(0.0F, 0.0F, 0.0F, 0, 0, 0, 0.0F); + this.setRotateAngle(SpikeWrapper_3, 0.0F, 0.5235987755982988F, 0.0F); + this.Eye = new ModelPart(this, 73, 21); + this.Eye.setPos(0.0F, 4.8F, 0.5F); + this.Eye.addBox(-2.0F, -2.0F, -2.0F, 4, 4, 4, 0.0F); + this.setRotateAngle(Eye, -0.7853981633974483F, -0.6981317007977318F, 1.5707963267948966F); + this.HeadSpike_5 = new ModelPart(this, 57, 21); + this.HeadSpike_5.setPos(0.0F, 0.0F, 0.0F); + this.HeadSpike_5.addBox(3.7F, -17.9F, 3.7F, 4, 17, 4, 0.0F); + this.setRotateAngle(HeadSpike_5, 0.0F, 0.7853981633974483F, 0.26703537555513246F); + this.Support_5 = new ModelPart(this, 31, 24); + this.Support_5.setPos(0.0F, -7.0F, 0.0F); + this.Support_5.addBox(23.5F, 0.0F, 0.0F, 6, 7, 7, 0.0F); + this.InnerSupport_2 = new ModelPart(this, 23, 38); + this.InnerSupport_2.setPos(0.0F, -10.0F, 0.0F); + this.InnerSupport_2.addBox(7.0F, -1.4F, -4.0F, 11, 2, 8, 0.0F); + this.setRotateAngle(InnerSupport_2, 0.0F, 0.0F, -0.4553564018453205F); + this.HeadGroup3 = new ModelPart(this, 0, 0); + this.HeadGroup3.setPos(0.0F, -2.0F, 0.0F); + this.HeadGroup3.addBox(0.0F, 0.0F, 0.0F, 0, 0, 0, 0.0F); + this.setRotateAngle(HeadGroup3, 0.0F, 2.0943951023931953F, 0.0F); + this.InnerSupport_5 = new ModelPart(this, 23, 38); + this.InnerSupport_5.setPos(0.0F, -10.0F, 0.0F); + this.InnerSupport_5.addBox(7.0F, -1.4F, -4.0F, 11, 2, 8, 0.0F); + this.setRotateAngle(InnerSupport_5, 0.0F, 0.0F, -0.4553564018453205F); + this.EyeBack = new ModelPart(this, 114, 0); + this.EyeBack.setPos(0.0F, -13.4F, -9.8F); + this.EyeBack.addBox(-3.0F, 0.0F, 0.0F, 6, 9, 1, 0.0F); + this.HeadExtended = new ModelPart(this, 64, 33); + this.HeadExtended.mirror = true; + this.HeadExtended.setPos(0.0F, -18.0F, -5.0F); + this.HeadExtended.addBox(-5.0F, 1.0F, 0.0F, 10, 1, 9, 0.0F); + this.setRotateAngle(HeadExtended, -0.2181661564992912F, 0.0F, 0.0F); + this.Support_1 = new ModelPart(this, 31, 24); + this.Support_1.setPos(0.0F, -7.0F, 0.0F); + this.Support_1.addBox(23.5F, 0.0F, 0.0F, 6, 7, 7, 0.0F); + this.Plating_2 = new ModelPart(this, 0, 32); + this.Plating_2.setPos(0.0F, 0.0F, 0.0F); + this.Plating_2.addBox(29.0F, -8.0F, -8.0F, 1, 16, 16, 0.0F); + this.setRotateAngle(Plating_2, 0.7853981633974483F, 0.0F, -0.7853981633974483F); + this.HeadPlate_3 = new ModelPart(this, 58, 0); + this.HeadPlate_3.setPos(0.0F, 0.0F, 0.0F); + this.HeadPlate_3.addBox(-5.0F, -17.0F, -9.2F, 10, 17, 4, 0.0F); + this.setRotateAngle(HeadPlate_3, 0.19634954084936207F, 0.0F, 0.0F); + this.HeadGroup6 = new ModelPart(this, 0, 0); + this.HeadGroup6.setPos(0.0F, -2.0F, 0.0F); + this.HeadGroup6.addBox(0.0F, 0.0F, 0.0F, 0, 0, 0, 0.0F); + this.setRotateAngle(HeadGroup6, 0.0F, 5.235987755982989F, 0.0F); + this.MidBody = new ModelPart(this, 0, 0); + this.MidBody.setPos(0.0F, 3.0F, 0.0F); + this.MidBody.addBox(0.0F, 0.0F, 0.0F, 0, 0, 0, 0.0F); + this.PlateGroup1 = new ModelPart(this, 0, 0); + this.PlateGroup1.setPos(0.0F, 35.0F, 0.0F); + this.PlateGroup1.addBox(0.0F, 0.0F, 0.0F, 0, 0, 0, 0.0F); + this.Bridge4 = new ModelPart(this, 36, 0); + this.Bridge4.setPos(0.0F, 0.0F, 0.0F); + this.Bridge4.addBox(-4.0F, -3.0F, 6.0F, 8, 9, 3, 0.0F); + this.setRotateAngle(Bridge4, -0.28361600344907856F, -0.7853981633974483F, 0.0F); + this.HeadSpikeWrapper_1 = new ModelPart(this, 0, 0); + this.HeadSpikeWrapper_1.setPos(0.0F, 0.0F, 0.0F); + this.HeadSpikeWrapper_1.addBox(0.0F, 0.0F, 0.0F, 0, 0, 0, 0.0F); + this.setRotateAngle(HeadSpikeWrapper_1, 0.0F, 2.0943951023931953F, 0.0F); + this.SpikeCap_2 = new ModelPart(this, 7, 25); + this.SpikeCap_2.setPos(8.0F, -1.0F, 8.0F); + this.SpikeCap_2.addBox(0.0F, 0.0F, 0.0F, 6, 11, 6, 0.0F); + this.HeadSpike_1 = new ModelPart(this, 57, 21); + this.HeadSpike_1.setPos(0.0F, 0.0F, 0.0F); + this.HeadSpike_1.addBox(3.7F, -17.9F, 3.7F, 4, 17, 4, 0.0F); + this.setRotateAngle(HeadSpike_1, 0.0F, 0.7853981633974483F, 0.26703537555513246F); + this.InnerSupport_4 = new ModelPart(this, 23, 38); + this.InnerSupport_4.setPos(0.0F, -10.0F, 0.0F); + this.InnerSupport_4.addBox(7.0F, -1.4F, -4.0F, 11, 2, 8, 0.0F); + this.setRotateAngle(InnerSupport_4, 0.0F, 0.0F, -0.4553564018453205F); + this.RunedSiding4 = new ModelPart(this, 48, 48); + this.RunedSiding4.setPos(0.0F, 0.0F, 0.0F); + this.RunedSiding4.addBox(-4.0F, -4.0F, 6.0F, 8, 10, 4, 0.0F); + this.setRotateAngle(RunedSiding4, -0.39269908169872414F, -1.5707963267948966F, 0.0F); + this.SpikeCap_1 = new ModelPart(this, 7, 25); + this.SpikeCap_1.setPos(8.0F, -1.0F, 8.0F); + this.SpikeCap_1.addBox(0.0F, 0.0F, 0.0F, 6, 11, 6, 0.0F); + this.Head = new ModelPart(this, 0, 0); + this.Head.setPos(0.0F, 2.5F, 0.0F); + this.Head.addBox(0.0F, 0.0F, 0.0F, 0, 0, 0, 0.0F); + this.EyeFrameRT = new ModelPart(this, 6, 7); + this.EyeFrameRT.setPos(4.0F, -10.0F, -9.2F); + this.EyeFrameRT.addBox(0.0F, 0.4F, 0.0F, 1, 5, 2, 0.0F); + this.setRotateAngle(EyeFrameRT, 0.0F, 0.0F, 2.356194490192345F); + this.RunedSiding1 = new ModelPart(this, 48, 48); + this.RunedSiding1.setPos(0.0F, 0.0F, 0.0F); + this.RunedSiding1.addBox(-4.0F, -4.0F, 6.0F, 8, 10, 4, 0.0F); + this.setRotateAngle(RunedSiding1, -0.39269908169872414F, 0.0F, 0.0F); + this.PlateGroup3 = new ModelPart(this, 0, 0); + this.PlateGroup3.setPos(0.0F, 35.0F, 0.0F); + this.PlateGroup3.addBox(0.0F, 0.0F, 0.0F, 0, 0, 0, 0.0F); + this.setRotateAngle(PlateGroup3, 0.0F, 2.0943951023931953F, 0.0F); + this.Plating_3 = new ModelPart(this, 0, 32); + this.Plating_3.setPos(0.0F, 0.0F, 0.0F); + this.Plating_3.addBox(29.0F, -8.0F, -8.0F, 1, 16, 16, 0.0F); + this.setRotateAngle(Plating_3, 0.7853981633974483F, 0.0F, -0.7853981633974483F); + this.Bridge1 = new ModelPart(this, 36, 0); + this.Bridge1.setPos(0.0F, 0.0F, 0.0F); + this.Bridge1.addBox(-4.0F, -3.0F, 6.0F, 8, 9, 3, 0.0F); + this.setRotateAngle(Bridge1, -0.28361600344907856F, 0.7853981633974483F, 0.0F); + this.EyeFrameRB = new ModelPart(this, 6, 0); + this.EyeFrameRB.setPos(4.0F, -7.0F, -9.2F); + this.EyeFrameRB.addBox(0.0F, -5.0F, 0.0F, 1, 5, 2, 0.0F); + this.setRotateAngle(EyeFrameRB, 0.0F, 0.0F, -2.356194490192345F); + this.PlateGroup4 = new ModelPart(this, 0, 0); + this.PlateGroup4.setPos(0.0F, 35.0F, 0.0F); + this.PlateGroup4.addBox(0.0F, 0.0F, 0.0F, 0, 0, 0, 0.0F); + this.setRotateAngle(PlateGroup4, 0.0F, 3.141592653589793F, 0.0F); + this.Cover = new ModelPart(this, 0, 0); + this.Cover.setPos(0.0F, 0.0F, 0.0F); + this.Cover.addBox(-6.0F, -0.6F, -6.0F, 12, 1, 12, 0.0F); + this.setRotateAngle(Cover, 0.0F, 0.7853981633974483F, 0.0F); + this.HeadExtended_1 = new ModelPart(this, 64, 33); + this.HeadExtended_1.setPos(0.0F, -18.0F, -5.0F); + this.HeadExtended_1.addBox(-5.0F, 1.0F, 0.0F, 10, 1, 9, 0.0F); + this.setRotateAngle(HeadExtended_1, -0.2181661564992912F, 0.0F, 0.0F); + this.Spike = new ModelPart(this, 0, 0); + this.Spike.setPos(0.0F, -20.0F, 0.0F); + this.Spike.addBox(1.0F, 0.0F, 1.0F, 12, 12, 12, 0.0F); + this.setRotateAngle(Spike, 0.0F, 0.7853981633974483F, -0.6065019150680295F); + this.HeadExtended_4 = new ModelPart(this, 64, 33); + this.HeadExtended_4.mirror = true; + this.HeadExtended_4.setPos(0.0F, -18.0F, -5.0F); + this.HeadExtended_4.addBox(-5.0F, 1.0F, 0.0F, 10, 1, 9, 0.0F); + this.setRotateAngle(HeadExtended_4, -0.2181661564992912F, 0.0F, 0.0F); + this.InnerSupport_1 = new ModelPart(this, 23, 38); + this.InnerSupport_1.setPos(0.0F, -10.0F, 0.0F); + this.InnerSupport_1.addBox(7.0F, -1.4F, -4.0F, 11, 2, 8, 0.0F); + this.setRotateAngle(InnerSupport_1, 0.0F, 0.0F, -0.4553564018453205F); + this.SpikeCap_5 = new ModelPart(this, 7, 25); + this.SpikeCap_5.setPos(8.0F, -1.0F, 8.0F); + this.SpikeCap_5.addBox(0.0F, 0.0F, 0.0F, 6, 11, 6, 0.0F); + this.HeadExtended_5 = new ModelPart(this, 64, 33); + this.HeadExtended_5.setPos(0.0F, -18.0F, -5.0F); + this.HeadExtended_5.addBox(-5.0F, 1.0F, 0.0F, 10, 1, 9, 0.0F); + this.setRotateAngle(HeadExtended_5, -0.2181661564992912F, 0.0F, 0.0F); + this.Support_4 = new ModelPart(this, 31, 24); + this.Support_4.setPos(0.0F, -7.0F, 0.0F); + this.Support_4.addBox(23.5F, 0.0F, 0.0F, 6, 7, 7, 0.0F); + this.HeadPlate_1 = new ModelPart(this, 58, 0); + this.HeadPlate_1.setPos(0.0F, 0.0F, 0.0F); + this.HeadPlate_1.addBox(-5.0F, -17.0F, -9.2F, 10, 17, 4, 0.0F); + this.setRotateAngle(HeadPlate_1, 0.19634954084936207F, 0.0F, 0.0F); + this.HeadGroup2 = new ModelPart(this, 0, 0); + this.HeadGroup2.setPos(0.0F, -2.0F, 0.0F); + this.HeadGroup2.addBox(0.0F, 0.0F, 0.0F, 0, 0, 0, 0.0F); + this.setRotateAngle(HeadGroup2, 0.0F, 1.0471975511965976F, 0.0F); + this.PlateGroup2 = new ModelPart(this, 0, 0); + this.PlateGroup2.setPos(0.0F, 35.0F, 0.0F); + this.PlateGroup2.addBox(0.0F, 0.0F, 0.0F, 0, 0, 0, 0.0F); + this.setRotateAngle(PlateGroup2, 0.0F, 1.0471975511965976F, 0.0F); + this.SpikeWrapper_2 = new ModelPart(this, 0, 0); + this.SpikeWrapper_2.setPos(0.0F, 0.0F, 0.0F); + this.SpikeWrapper_2.addBox(0.0F, 0.0F, 0.0F, 0, 0, 0, 0.0F); + this.setRotateAngle(SpikeWrapper_2, 0.0F, 0.5235987755982988F, 0.0F); + this.InnerSupport = new ModelPart(this, 23, 38); + this.InnerSupport.setPos(0.0F, -10.0F, 0.0F); + this.InnerSupport.addBox(7.0F, -1.4F, -4.0F, 11, 2, 8, 0.0F); + this.setRotateAngle(InnerSupport, 0.0F, 0.0F, -0.4553564018453205F); + this.Spike_2 = new ModelPart(this, 0, 0); + this.Spike_2.setPos(0.0F, -20.0F, 0.0F); + this.Spike_2.addBox(1.0F, 0.0F, 1.0F, 12, 12, 12, 0.0F); + this.setRotateAngle(Spike_2, 0.0F, 0.7853981633974483F, -0.6065019150680295F); + this.RunedSiding3 = new ModelPart(this, 48, 48); + this.RunedSiding3.setPos(0.0F, 0.0F, 0.0F); + this.RunedSiding3.addBox(-4.0F, -4.0F, 6.0F, 8, 10, 4, 0.0F); + this.setRotateAngle(RunedSiding3, -0.39269908169872414F, 3.141592653589793F, 0.0F); + this.HeadPlate = new ModelPart(this, 58, 0); + this.HeadPlate.setPos(0.0F, 0.0F, 0.0F); + this.HeadPlate.addBox(-5.0F, -17.0F, -9.2F, 10, 17, 4, 0.0F); + this.setRotateAngle(HeadPlate, 0.19634954084936207F, 0.0F, 0.0F); + this.PlateGroup6 = new ModelPart(this, 0, 0); + this.PlateGroup6.setPos(0.0F, 35.0F, 0.0F); + this.PlateGroup6.addBox(0.0F, 0.0F, 0.0F, 0, 0, 0, 0.0F); + this.setRotateAngle(PlateGroup6, 0.0F, 5.235987755982989F, 0.0F); + this.HeadGroup4 = new ModelPart(this, 0, 0); + this.HeadGroup4.setPos(0.0F, -2.0F, 0.0F); + this.HeadGroup4.addBox(0.0F, 0.0F, 0.0F, 0, 0, 0, 0.0F); + this.setRotateAngle(HeadGroup4, 0.0F, 3.141592653589793F, 0.0F); + this.RunedSiding2 = new ModelPart(this, 48, 48); + this.RunedSiding2.setPos(0.0F, 0.0F, 0.0F); + this.RunedSiding2.addBox(-4.0F, -4.0F, 6.0F, 8, 10, 4, 0.0F); + this.setRotateAngle(RunedSiding2, -0.39269908169872414F, 1.5707963267948966F, 0.0F); + this.Spike_5 = new ModelPart(this, 0, 0); + this.Spike_5.setPos(0.0F, -20.0F, 0.0F); + this.Spike_5.addBox(1.0F, 0.0F, 1.0F, 12, 12, 12, 0.0F); + this.setRotateAngle(Spike_5, 0.0F, 0.7853981633974483F, -0.6065019150680295F); + this.Bridge2 = new ModelPart(this, 36, 0); + this.Bridge2.setPos(0.0F, 0.0F, 0.0F); + this.Bridge2.addBox(-4.0F, -3.0F, 6.0F, 8, 9, 3, 0.0F); + this.setRotateAngle(Bridge2, -0.28361600344907856F, 2.356194490192345F, 0.0F); + this.Spike_3 = new ModelPart(this, 0, 0); + this.Spike_3.setPos(0.0F, -20.0F, 0.0F); + this.Spike_3.addBox(1.0F, 0.0F, 1.0F, 12, 12, 12, 0.0F); + this.setRotateAngle(Spike_3, 0.0F, 0.7853981633974483F, -0.6065019150680295F); + this.HeadGroup5 = new ModelPart(this, 0, 0); + this.HeadGroup5.setPos(0.0F, -2.0F, 0.0F); + this.HeadGroup5.addBox(0.0F, 0.0F, 0.0F, 0, 0, 0, 0.0F); + this.setRotateAngle(HeadGroup5, 0.0F, 4.1887902047863905F, 0.0F); + this.SpikeCap_4 = new ModelPart(this, 7, 25); + this.SpikeCap_4.setPos(8.0F, -1.0F, 8.0F); + this.SpikeCap_4.addBox(0.0F, 0.0F, 0.0F, 6, 11, 6, 0.0F); + this.HeadSpikeWrapper = new ModelPart(this, 0, 0); + this.HeadSpikeWrapper.setPos(0.0F, 0.0F, 0.0F); + this.HeadSpikeWrapper.addBox(0.0F, 0.0F, 0.0F, 0, 0, 0, 0.0F); + this.setRotateAngle(HeadSpikeWrapper, 0.0F, 2.0943951023931953F, 0.0F); + this.HeadExtended_3 = new ModelPart(this, 64, 33); + this.HeadExtended_3.setPos(0.0F, -18.0F, -5.0F); + this.HeadExtended_3.addBox(-5.0F, 1.0F, 0.0F, 10, 1, 9, 0.0F); + this.setRotateAngle(HeadExtended_3, -0.2181661564992912F, 0.0F, 0.0F); + this.HeadPlate_4 = new ModelPart(this, 58, 0); + this.HeadPlate_4.setPos(0.0F, 0.0F, 0.0F); + this.HeadPlate_4.addBox(-5.0F, -17.0F, -9.2F, 10, 17, 4, 0.0F); + this.setRotateAngle(HeadPlate_4, 0.19634954084936207F, 0.0F, 0.0F); + this.PlateGroup5 = new ModelPart(this, 0, 0); + this.PlateGroup5.setPos(0.0F, 35.0F, 0.0F); + this.PlateGroup5.addBox(0.0F, 0.0F, 0.0F, 0, 0, 0, 0.0F); + this.setRotateAngle(PlateGroup5, 0.0F, 4.1887902047863905F, 0.0F); + this.HeadSpike = new ModelPart(this, 57, 21); + this.HeadSpike.setPos(0.0F, 0.0F, 0.0F); + this.HeadSpike.addBox(3.7F, -17.9F, 3.7F, 4, 17, 4, 0.0F); + this.setRotateAngle(HeadSpike, 0.0F, 0.7853981633974483F, 0.26703537555513246F); + this.HeadSpike_2 = new ModelPart(this, 57, 21); + this.HeadSpike_2.setPos(0.0F, 0.0F, 0.0F); + this.HeadSpike_2.addBox(3.7F, -17.9F, 3.7F, 4, 17, 4, 0.0F); + this.setRotateAngle(HeadSpike_2, 0.0F, 0.7853981633974483F, 0.26703537555513246F); + this.HeadSpike_3 = new ModelPart(this, 57, 21); + this.HeadSpike_3.setPos(0.0F, 0.0F, 0.0F); + this.HeadSpike_3.addBox(3.7F, -17.9F, 3.7F, 4, 17, 4, 0.0F); + this.setRotateAngle(HeadSpike_3, 0.0F, 0.7853981633974483F, 0.26703537555513246F); + this.EyeFrameLB = new ModelPart(this, 0, 7); + this.EyeFrameLB.setPos(-4.0F, -7.0F, -9.2F); + this.EyeFrameLB.addBox(0.0F, 0.4F, 0.0F, 1, 5, 2, 0.0F); + this.setRotateAngle(EyeFrameLB, 0.0F, 0.0F, -0.7853981633974483F); + this.Support_2 = new ModelPart(this, 31, 24); + this.Support_2.setPos(0.0F, -7.0F, 0.0F); + this.Support_2.addBox(23.5F, 0.0F, 0.0F, 6, 7, 7, 0.0F); + this.Plating_4 = new ModelPart(this, 0, 32); + this.Plating_4.setPos(0.0F, 0.0F, 0.0F); + this.Plating_4.addBox(29.0F, -8.0F, -8.0F, 1, 16, 16, 0.0F); + this.setRotateAngle(Plating_4, 0.7853981633974483F, 0.0F, -0.7853981633974483F); + this.PlateGroup6.addChild(this.SpikeWrapper_5); + this.HeadPlate_5.addChild(this.EyeFrameL); + this.PlateGroup1.addChild(this.Plating); + this.Spike.addChild(this.SpikeCap); + this.SpikeWrapper_1.addChild(this.Spike_1); + this.HeadPlate_2.addChild(this.HeadExtended_2); + this.PlateGroup2.addChild(this.SpikeWrapper_1); + this.PlateGroup2.addChild(this.Plating_1); + this.HeadGroup1.addChild(this.HeadPlate_5); + this.Head.addChild(this.HeadGroup1); + this.Plating.addChild(this.Support); + this.PlateGroup6.addChild(this.Plating_5); + this.SpikeWrapper_4.addChild(this.Spike_4); + this.HeadGroup5.addChild(this.HeadSpikeWrapper_3); + this.Spike_3.addChild(this.SpikeCap_3); + this.PlateGroup1.addChild(this.SpikeWrapper); + this.MidBody.addChild(this.Bridge3); + this.HeadGroup6.addChild(this.HeadSpikeWrapper_4); + this.HeadGroup1.addChild(this.HeadSpikeWrapper_5); + this.Plating_3.addChild(this.Support_3); + this.PlateGroup4.addChild(this.InnerSupport_3); + this.PlateGroup5.addChild(this.SpikeWrapper_4); + this.HeadGroup4.addChild(this.HeadSpikeWrapper_2); + this.HeadSpikeWrapper_4.addChild(this.HeadSpike_4); + this.HeadGroup4.addChild(this.HeadPlate_2); + this.HeadPlate_5.addChild(this.EyeFrameR); + this.HeadPlate_5.addChild(this.EyeFrameLT); + this.PlateGroup4.addChild(this.SpikeWrapper_3); + this.EyeBack.addChild(this.Eye); + this.HeadSpikeWrapper_5.addChild(this.HeadSpike_5); + this.Plating_5.addChild(this.Support_5); + this.PlateGroup3.addChild(this.InnerSupport_2); + this.Head.addChild(this.HeadGroup3); + this.PlateGroup6.addChild(this.InnerSupport_5); + this.Head.addChild(this.EyeBack); + this.HeadPlate.addChild(this.HeadExtended); + this.Plating_1.addChild(this.Support_1); + this.PlateGroup3.addChild(this.Plating_2); + this.HeadGroup5.addChild(this.HeadPlate_3); + this.Head.addChild(this.HeadGroup6); + this.MainBody.addChild(this.PlateGroup1); + this.MidBody.addChild(this.Bridge4); + this.HeadGroup3.addChild(this.HeadSpikeWrapper_1); + this.Spike_2.addChild(this.SpikeCap_2); + this.HeadSpikeWrapper_1.addChild(this.HeadSpike_1); + this.PlateGroup5.addChild(this.InnerSupport_4); + this.MidBody.addChild(this.RunedSiding4); + this.Spike_1.addChild(this.SpikeCap_1); + this.HeadPlate_5.addChild(this.EyeFrameRT); + this.MidBody.addChild(this.RunedSiding1); + this.MainBody.addChild(this.PlateGroup3); + this.PlateGroup4.addChild(this.Plating_3); + this.MidBody.addChild(this.Bridge1); + this.HeadPlate_5.addChild(this.EyeFrameRB); + this.MainBody.addChild(this.PlateGroup4); + this.MidBody.addChild(this.Cover); + this.HeadPlate_1.addChild(this.HeadExtended_1); + this.SpikeWrapper.addChild(this.Spike); + this.HeadPlate_4.addChild(this.HeadExtended_4); + this.PlateGroup2.addChild(this.InnerSupport_1); + this.Spike_5.addChild(this.SpikeCap_5); + this.HeadPlate_5.addChild(this.HeadExtended_5); + this.Plating_4.addChild(this.Support_4); + this.HeadGroup3.addChild(this.HeadPlate_1); + this.Head.addChild(this.HeadGroup2); + this.MainBody.addChild(this.PlateGroup2); + this.PlateGroup3.addChild(this.SpikeWrapper_2); + this.PlateGroup1.addChild(this.InnerSupport); + this.SpikeWrapper_2.addChild(this.Spike_2); + this.MidBody.addChild(this.RunedSiding3); + this.HeadGroup2.addChild(this.HeadPlate); + this.MainBody.addChild(this.PlateGroup6); + this.Head.addChild(this.HeadGroup4); + this.MidBody.addChild(this.RunedSiding2); + this.SpikeWrapper_5.addChild(this.Spike_5); + this.MidBody.addChild(this.Bridge2); + this.SpikeWrapper_3.addChild(this.Spike_3); + this.Head.addChild(this.HeadGroup5); + this.Spike_4.addChild(this.SpikeCap_4); + this.HeadGroup2.addChild(this.HeadSpikeWrapper); + this.HeadPlate_3.addChild(this.HeadExtended_3); + this.HeadGroup6.addChild(this.HeadPlate_4); + this.MainBody.addChild(this.PlateGroup5); + this.HeadSpikeWrapper.addChild(this.HeadSpike); + this.HeadSpikeWrapper_2.addChild(this.HeadSpike_2); + this.HeadSpikeWrapper_3.addChild(this.HeadSpike_3); + this.HeadPlate_5.addChild(this.EyeFrameLB); + this.Plating_2.addChild(this.Support_2); + this.PlateGroup5.addChild(this.Plating_4); + } + + private static final Minecraft minecraft = Minecraft.getInstance(); + +// @Override +// public void render(T entityIn, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch, float scale) { +// //final float partialTicks = minecraft.getRenderPartialTicks(); +// } + + @Override + public Iterable parts() { + return ImmutableList.of( + this.MainBody, + this.MidBody, + this.Head + ); + } + + @Override + public void setupAnim(CastleGuardianEntity entityIn, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + this.Head.yRot = netHeadYaw / (180F / (float) Math.PI); + } + + /** + * This is a helper function from Tabula to set the rotation of model parts + */ + public void setRotateAngle(ModelPart modelRenderer, float x, float y, float z) { + modelRenderer.xRot = x; + modelRenderer.yRot = y; + modelRenderer.zRot = z; + } +} diff --git a/src/main/disabled/client/model/entity/KnightPhantomOldModel.java b/src/main/disabled/client/model/entity/KnightPhantomOldModel.java new file mode 100644 index 0000000000..b05da25b98 --- /dev/null +++ b/src/main/disabled/client/model/entity/KnightPhantomOldModel.java @@ -0,0 +1,164 @@ +package twilightforest.client.model.entity; + +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.util.Mth; +import twilightforest.entity.boss.KnightPhantomEntity; + +import net.minecraft.client.model.HumanoidModel.ArmPose; + +@Deprecated +public class KnightPhantomOldModel extends HumanoidModel { + + public ModelPart helmet; + public ModelPart righthorn1; + public ModelPart righthorn2; + public ModelPart lefthorn1; + public ModelPart lefthorn2; + + @Deprecated + public KnightPhantomOldModel() { + super(0.0F, 0.0F, 128, 64); + this.crouching = false; +// this.textureWidth = 128; +// this.textureHeight = 64; + +//FIXME: AtomicBlom: Replace with something like LayerCape +/* + this.bipedCloak = new ModelRenderer(this, 0, 0); + this.bipedCloak.addBox(-5.0F, 0.0F, -1.0F, 10, 16, 1); +*/ +//FIXME: AtomicBlom replace with some variant of LayerDeadmau5Head +/* + this.bipedEars = new ModelRenderer(this, 24, 0); + this.bipedEars.addBox(-3.0F, -6.0F, -1.0F, 6, 6, 1); +*/ + + this.head = new ModelPart(this, 0, 0); + this.head.addBox(0, 0, 0, 0, 0, 0); + this.head.setPos(0.0F, -10.0F, 0.0F); + + this.hat = new ModelPart(this, 0, 0); + this.hat.addBox(0, 0, 0, 0, 0, 0); + this.hat.setPos(0.0F, -10.0F, 0.0F); + + this.helmet = new ModelPart(this, 0, 0); + this.helmet.addBox(-4.0F, -11.0F, -4.0F, 8, 11, 8); + this.helmet.yRot = 45F / (180F / (float) Math.PI); + + this.righthorn1 = new ModelPart(this, 28, 0); + this.righthorn1.addBox(-6F, -1.5F, -1.5F, 7, 3, 3); + this.righthorn1.setPos(-3.5F, -9F, 0.0F); + this.righthorn1.yRot = 15F / (180F / (float) Math.PI); + this.righthorn1.zRot = 10F / (180F / (float) Math.PI); + + this.righthorn2 = new ModelPart(this, 28, 6); + this.righthorn2.addBox(-3.0F, -1.0F, -1.0F, 3, 2, 2); + this.righthorn2.setPos(-5.5F, 0.0F, 0.0F); + this.righthorn2.zRot = 10F / (180F / (float) Math.PI); + + this.righthorn1.addChild(righthorn2); + + this.lefthorn1 = new ModelPart(this, 28, 0); + this.lefthorn1.mirror = true; + this.lefthorn1.addBox(-1F, -1.5F, -1.5F, 7, 3, 3); + this.lefthorn1.setPos(3.5F, -9F, 0.0F); + this.lefthorn1.yRot = -15F / (180F / (float) Math.PI); + this.lefthorn1.zRot = -10F / (180F / (float) Math.PI); + + this.lefthorn2 = new ModelPart(this, 28, 6); + this.lefthorn2.addBox(0.0F, -1.0F, -1.0F, 3, 2, 2); + this.lefthorn2.setPos(5.5F, 0.0F, 0.0F); + this.lefthorn2.zRot = -10F / (180F / (float) Math.PI); + + this.lefthorn1.addChild(lefthorn2); + + this.hat.addChild(helmet); + this.hat.addChild(righthorn1); + this.hat.addChild(lefthorn1); + + this.body = new ModelPart(this, 0, 18); + this.body.setPos(0.0F, 2.0F, 0.0F); + this.body.addBox(-7.0F, -12.0F, -3.5F, 14, 12, 7); + this.body.texOffs(30, 24).addBox(-6.0F, 0F, -3F, 12, 8, 6); // torso + + this.rightArm = new ModelPart(this, 44, 16); + this.rightArm.addBox(-5.0F, -2.0F, -3.0F, 6, 7, 6); + this.rightArm.setPos(-8.0F, -8.0F, 0.0F); + + this.leftArm = new ModelPart(this, 44, 16); + this.leftArm.mirror = true; + this.leftArm.addBox(-1.0F, -2.0F, -3.0F, 6, 7, 6); + this.leftArm.setPos(8.0F, -8.0F, 0.0F); + + this.rightLeg = new ModelPart(this, 0, 0); + this.rightLeg.addBox(0, 0, 0, 0, 0, 0); + this.rightLeg.setPos(0.0F, 12.0F, 0.0F); + + this.leftLeg = new ModelPart(this, 0, 0); + this.leftLeg.addBox(0, 0, 0, 0, 0, 0); + this.leftLeg.setPos(0.0F, 12.0F, 0.0F); + } + + + /** + * Sets the model's various rotation angles. For bipeds, limbSwing and limbSwingAmount are used for animating the movement of arms + * and legs, where limbSwing represents the time(so that arms and legs swing back and forth) and limbSwingAmount represents how + * "far" arms and legs can swing at most. + */ + @Override + public void setupAnim(T entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + this.head.yRot = netHeadYaw / (180F / (float) Math.PI); + this.head.xRot = headPitch / (180F / (float) Math.PI); + this.head.zRot = 0; + this.hat.yRot = this.head.yRot; + this.hat.xRot = this.head.xRot; + this.hat.zRot = this.head.zRot; + + this.rightArm.xRot = Mth.cos(limbSwing * 0.6662F + (float) Math.PI) * 2.0F * limbSwingAmount * 0.5F; + this.leftArm.xRot = Mth.cos(limbSwing * 0.6662F) * 2.0F * limbSwingAmount * 0.5F; + this.rightArm.zRot = 0.0F; + this.leftArm.zRot = 0.0F; + +// this.bipedRightLeg.rotateAngleX = MathHelper.cos(limbSwing * 0.6662F) * 1.4F * limbSwingAmount; +// this.bipedLeftLeg.rotateAngleX = MathHelper.cos(limbSwing * 0.6662F + (float)Math.PI) * 1.4F * limbSwingAmount; +// this.bipedRightLeg.rotateAngleY = 0.0F; +// this.bipedLeftLeg.rotateAngleY = 0.0F; +// +// if (this.isRiding) +// { +// this.bipedRightArm.rotateAngleX += -((float)Math.PI / 5F); +// this.bipedLeftArm.rotateAngleX += -((float)Math.PI / 5F); +// this.bipedRightLeg.rotateAngleX = 0; +// this.bipedLeftLeg.rotateAngleX = 0; +//// this.bipedRightLeg.rotateAngleY = ((float)Math.PI / 10F); +//// this.bipedLeftLeg.rotateAngleY = -((float)Math.PI / 10F); +// } + + if (this.leftArmPose != ArmPose.EMPTY) { + this.leftArm.xRot = this.leftArm.xRot * 0.5F - ((float) Math.PI / 10F); + } + + this.rightArmPose = ArmPose.ITEM; + + if (this.rightArmPose != ArmPose.EMPTY) { + this.rightArm.xRot = this.rightArm.xRot * 0.5F - ((float) Math.PI / 10F); + } +// +// bipedRightArm.rotateAngleX -= (Math.PI * 0.66); +// +// // during swing move arm forward +// if (upperKnight.heavySpearTimer > 0) +// { +// bipedRightArm.rotateAngleX -= this.getArmRotationDuringSwing(60 - upperKnight.heavySpearTimer + scaleFactor) / (180F / (float)Math.PI); +// } + +// this.bipedRightArm.rotateAngleY = 0.0F; +// this.bipedLeftArm.rotateAngleY = 0.0F; + + this.rightArm.zRot += Mth.cos(ageInTicks * 0.09F) * 0.05F + 0.05F; + this.leftArm.zRot -= Mth.cos(ageInTicks * 0.09F) * 0.05F + 0.05F; + this.rightArm.xRot += Mth.sin(ageInTicks * 0.067F) * 0.05F; + this.leftArm.xRot -= Mth.sin(ageInTicks * 0.067F) * 0.05F; + } +} diff --git a/src/main/disabled/client/renderer/entity/CastleGuardianRenderer.java b/src/main/disabled/client/renderer/entity/CastleGuardianRenderer.java new file mode 100644 index 0000000000..cf43d421b6 --- /dev/null +++ b/src/main/disabled/client/renderer/entity/CastleGuardianRenderer.java @@ -0,0 +1,28 @@ +package twilightforest.client.renderer.entity; + +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.entity.LivingEntityRenderer; +import net.minecraft.client.renderer.entity.EntityRendererProvider.Context; +import net.minecraft.resources.ResourceLocation; +import twilightforest.TwilightForestMod; +import twilightforest.client.model.entity.finalcastle.CastleGuardianModel; +import twilightforest.entity.finalcastle.CastleGuardianEntity; + +public class CastleGuardianRenderer extends LivingEntityRenderer { + + private final ResourceLocation textureLoc; + + public CastleGuardianRenderer(EntityRendererProvider.Context manager, CastleGuardianModel model, float shadowSize, String textureName) { + super(manager, model, shadowSize); + + if (textureName.startsWith("textures")) + textureLoc = new ResourceLocation(textureName); + else + textureLoc = TwilightForestMod.getModelTexture(textureName); + } + + @Override + public ResourceLocation getTextureLocation(CastleGuardianEntity entity) { + return textureLoc; + } +} diff --git a/src/main/java/twilightforest/ASMHooks.java b/src/main/java/twilightforest/ASMHooks.java new file mode 100644 index 0000000000..85aad3bf9b --- /dev/null +++ b/src/main/java/twilightforest/ASMHooks.java @@ -0,0 +1,303 @@ +package twilightforest; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.datafixers.DataFixer; +import com.mojang.serialization.Dynamic; +import net.minecraft.client.Camera; +import net.minecraft.client.Minecraft; +import net.minecraft.client.player.AbstractClientPlayer; +import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.client.renderer.LightTexture; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.entity.EntityRenderer; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.server.packs.resources.ResourceManager; +import net.minecraft.sounds.Music; +import net.minecraft.sounds.Musics; +import net.minecraft.util.Mth; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.ai.attributes.AttributeInstance; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.entity.decoration.ItemFrame; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.MapItem; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.ClipContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.structure.Structure; +import net.minecraft.world.level.levelgen.structure.StructureStart; +import net.minecraft.world.level.levelgen.structure.pieces.PiecesContainer; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import net.minecraft.world.level.saveddata.maps.MapItemSavedData; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.common.ForgeMod; +import net.minecraftforge.entity.PartEntity; +import net.minecraftforge.network.PacketDistributor; +import org.joml.Matrix4f; +import twilightforest.client.TFClientSetup; +import twilightforest.events.ToolEvents; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFDimensionSettings; +import twilightforest.entity.TFPart; +import twilightforest.init.TFItems; +import twilightforest.item.GiantItem; +import twilightforest.network.TFPacketHandler; +import twilightforest.network.UpdateTFMultipartPacket; +import twilightforest.world.components.structures.util.CustomStructureData; +import twilightforest.world.registration.TFGenerationSettings; + +import org.jetbrains.annotations.Nullable; + +import java.util.*; + +@SuppressWarnings({"JavadocReference", "unused", "RedundantSuppression", "deprecation"}) +public class ASMHooks { + + /** + * Injection Point:
+ * {@link net.minecraft.world.level.levelgen.WorldOptions#WorldOptions(long, boolean, boolean, Optional)}
+ * [BEFORE FIRST PUTFIELD] + */ + public static long seed(long seed) { + TFDimensionSettings.seed = seed; + return seed; + } + + /** + * Injection Point:
+ * {@link net.minecraft.client.gui.MapRenderer.MapInstance#draw(PoseStack, MultiBufferSource, boolean, int)}
+ * [BEFORE FIRST ISTORE] + */ + public static void mapRenderContext(PoseStack stack, MultiBufferSource buffer, int light) { + TFMagicMapData.TFMapDecoration.RenderContext.stack = stack; + TFMagicMapData.TFMapDecoration.RenderContext.buffer = buffer; + TFMagicMapData.TFMapDecoration.RenderContext.light = light; + } + + private static boolean isOurMap(ItemStack stack) { + return stack.is(TFItems.FILLED_MAGIC_MAP.get()) || stack.is(TFItems.FILLED_MAZE_MAP.get()) || stack.is(TFItems.FILLED_ORE_MAP.get()); + } + + /** + * Injection Point:
+ * {@link net.minecraft.client.renderer.ItemInHandRenderer#renderArmWithItem(AbstractClientPlayer, float, float, InteractionHand, float, ItemStack, float, PoseStack, MultiBufferSource, int)}
+ * [AFTER INST AFTER FIRST GETSTATIC {@link net.minecraft.world.item.Items#FILLED_MAP}] + *

+ * Injection Point:
+ * {@link ItemFrame#getFramedMapId()}
+ * [BEFORE FIRST IFEQ] + */ + public static boolean shouldMapRender(boolean o, ItemStack stack) { + return o || isOurMap(stack); + } + + /** + * Injection Point:
+ * {@link net.minecraft.client.renderer.ItemInHandRenderer#renderMap(PoseStack, MultiBufferSource, int, ItemStack)}
+ * [BEFORE FIRST ASTORE 6] + *

+ * Injection Point:
+ * {@link net.minecraft.world.item.MapItem#appendHoverText(ItemStack, Level, List, TooltipFlag)}
+ * [AFTER INVOKESTATIC {@link net.minecraft.world.item.MapItem#getSavedData(Integer, Level)}] + */ + @Nullable + public static MapItemSavedData renderMapData(@Nullable MapItemSavedData o, ItemStack stack, @Nullable Level level) { + return isOurMap(stack) && level != null ? MapItem.getSavedData(stack, level) : o; + } + + /** + * Injection Point:
+ * {@link net.minecraft.client.sounds.MusicManager#tick()}
+ * [AFTER FIRST INVOKEVIRTUAL] + */ + @OnlyIn(Dist.CLIENT) + public static Music music(Music music) { + if (Minecraft.getInstance().level != null && Minecraft.getInstance().player != null && (music == Musics.CREATIVE || music == Musics.UNDER_WATER) && TFGenerationSettings.isTwilightWorldOnClient(Minecraft.getInstance().level)) + return Minecraft.getInstance().level.getBiomeManager().getNoiseBiomeAtPosition(Minecraft.getInstance().player.blockPosition()).value().getBackgroundMusic().orElse(Musics.GAME); + return music; + } + + + /** + * Injection Point:
+ * {@link net.minecraft.server.level.ServerEntity#sendDirtyEntityData}
+ * [AFTER GETFIELD] + */ + public static Entity updateMultiparts(Entity entity) { + if (entity.isMultipartEntity()) + TFPacketHandler.CHANNEL.send(PacketDistributor.TRACKING_ENTITY.with(() -> entity), new UpdateTFMultipartPacket(entity)); + return entity; + } + + /** + * Injection Point:
+ * {@link net.minecraft.client.renderer.entity.EntityRenderDispatcher#getRenderer(Entity)}
+ * [BEFORE LAST ARETURN] + */ + @Nullable + @OnlyIn(Dist.CLIENT) + public static EntityRenderer getMultipartRenderer(@Nullable EntityRenderer renderer, Entity entity) { + if(entity instanceof TFPart) + return TFClientSetup.BakedMultiPartRenderers.lookup(((TFPart) entity).renderer()); + return renderer; + } + + /** + * Injection Point:
+ * {@link net.minecraft.client.renderer.entity.EntityRenderDispatcher#onResourceManagerReload(ResourceManager)}
+ * [AFTER FIRST INVOKESPECIAL] + */ + @OnlyIn(Dist.CLIENT) + public static EntityRendererProvider.Context bakeMultipartRenders(EntityRendererProvider.Context context) { + TFClientSetup.BakedMultiPartRenderers.bakeMultiPartRenderers(context); + return context; + } + + /** + * Injection Point:
+ * {@link net.minecraft.client.renderer.LevelRenderer#renderLevel(PoseStack, float, long, boolean, Camera, GameRenderer, LightTexture, Matrix4f)}
+ * [AFTER {@link net.minecraft.client.multiplayer.ClientLevel#entitiesForRendering}] + */ + public static Iterable renderMutiparts(Iterable iter) { + List list = new ArrayList<>(); + iter.forEach(entity -> { + list.add(entity); + if(entity.isMultipartEntity() && entity.getParts() != null) { + for (PartEntity part : entity.getParts()) { + if(part instanceof TFPart) + list.add(part); + } + } + }); + return list; + } + + /** + * Injection Point:
+ * {@link net.minecraft.client.renderer.BiomeColors#FOLIAGE_COLOR_RESOLVER}
+ * [BEFORE IRETURN] + */ + @OnlyIn(Dist.CLIENT) + public static int foliage(int o, Biome biome, double x, double z) { + return FoliageColorHandler.get(o, biome, x, z); + } + + /** + * Injection Point:
+ * {@link net.minecraft.world.level.levelgen.structure.StructureStart#loadStaticStart(StructurePieceSerializationContext, CompoundTag, long)}
+ * [AFTER INVOKESPECIAL {@link net.minecraft.world.level.levelgen.structure.StructureStart#StructureStart(Structure, ChunkPos, int, PiecesContainer)}] + */ + public static StructureStart conquered(StructureStart start, PiecesContainer piecesContainer, CompoundTag nbt) { + if (start.getStructure() instanceof CustomStructureData s) + return s.forDeserialization(start.getStructure(), start.getChunkPos(), start.getReferences(), piecesContainer, nbt); + return start; + } + + /** + * Injection Point:
+ * {@link net.minecraft.client.player.LocalPlayer#rideTick()}
+ * [AFTER FIRST INVOKESPECIAL] + */ + public static boolean mountFix(boolean o, boolean wantsToStopRiding, boolean isPassenger) { + if (wantsToStopRiding && isPassenger) + return false; + return o; + } + + /** + * Injection Point:
+ * {@link net.minecraft.world.item.WrittenBookItem#getName(net.minecraft.world.item.ItemStack)}
+ * [BEFORE ARETURN] + */ + public static Component book(Component component, CompoundTag tag) { + if (tag.contains(TwilightForestMod.ID + ":book")) { + return Component.translatable(component.getString()); + } else return component; + } + + /** + * Injection Point:
+ * {@link net.minecraft.world.item.Item#getPlayerPOVHitResult(Level, Player, ClipContext.Fluid)}
+ * [BEFORE ARETURN] + */ + public static BlockHitResult reach(BlockHitResult o, Level level, Player player, ClipContext.Fluid fluidMode) { + InteractionHand hand = ToolEvents.INTERACTION_HAND; + if (hand != null) { + BlockHitResult hitResult = interactionTooFar(level, player, hand, fluidMode); + if (hitResult != null) { + return hitResult; + } + } + return o; + } + + @Nullable + private static BlockHitResult interactionTooFar(Level level, Player player, InteractionHand hand, ClipContext.Fluid fluidMode) { + ItemStack heldStack = player.getItemInHand(hand); + if (ToolEvents.hasGiantItemInOneHand(player) && !(heldStack.getItem() instanceof GiantItem) && hand == InteractionHand.OFF_HAND) { + UUID uuidForOppositeHand = GiantItem.GIANT_REACH_MODIFIER; + AttributeInstance reachDistance = player.getAttribute(ForgeMod.BLOCK_REACH.get()); + if (reachDistance != null) { + AttributeModifier giantModifier = reachDistance.getModifier(uuidForOppositeHand); + if (giantModifier != null) { + reachDistance.removeModifier(giantModifier); + double reach = player.getAttributeValue(ForgeMod.BLOCK_REACH.get()); + double trueReach = reach == 0 ? 0 : reach + (player.isCreative() ? 0.5 : 0); // Copied from IForgePlayer#getReachDistance(). + BlockHitResult result = getPlayerPOVHitResultForReach(level, player, trueReach, fluidMode); + reachDistance.addTransientModifier(giantModifier); + return result; + } + } + } + return null; + } + + /* + [VANILLA COPY] + Copied from Item#getPlayerPOVHitResult(Level, Player, ClipContext.Fluid). + Uses a parameter for reach in assigning vec31 instead of using IForgePlayer#getReachDistance(). + */ + private static BlockHitResult getPlayerPOVHitResultForReach(Level level, Player player, double reach, ClipContext.Fluid fluidClip) { + float f = player.getXRot(); + float f1 = player.getYRot(); + Vec3 vec3 = player.getEyePosition(); + float f2 = Mth.cos(-f1 * ((float) Math.PI / 180.0F) - (float) Math.PI); + float f3 = Mth.sin(-f1 * ((float) Math.PI / 180.0F) - (float) Math.PI); + float f4 = -Mth.cos(-f * ((float) Math.PI / 180.0F)); + float f5 = Mth.sin(-f * ((float) Math.PI / 180.0F)); + float f6 = f3 * f4; + float f7 = f2 * f4; + Vec3 vec31 = vec3.add((double) f6 * reach, (double) f5 * reach, (double) f7 * reach); + return level.clip(new ClipContext(vec3, vec31, ClipContext.Block.OUTLINE, fluidClip, player)); + } + + /** + * Injection Point:
+ * {@link net.minecraft.world.level.block.MushroomBlock#canSurvive(BlockState, LevelReader, BlockPos)} }
+ * [AFTER INVOKEINTERFACE {@link LevelReader#getRawBrightness(BlockPos, int)}] + */ + public static int shroom(int o, LevelReader level, BlockPos pos) { + for (int x = -1; x <= 1; x++) { + for (int z = -1; z <= 1; z++) { + if (x == 0 && z == 0) + continue; + if (level.getBlockState(pos.offset(x, -1, z)).is(TFBlocks.TWILIGHT_PORTAL.get())) + return 0; + } + } + return o; + } + +} diff --git a/src/main/java/twilightforest/CommandTFFeature.java b/src/main/java/twilightforest/CommandTFFeature.java deleted file mode 100644 index d3ffb053d8..0000000000 --- a/src/main/java/twilightforest/CommandTFFeature.java +++ /dev/null @@ -1,119 +0,0 @@ -package twilightforest; - -import net.minecraft.command.CommandBase; -import net.minecraft.command.ICommandSender; -import net.minecraft.command.WrongUsageException; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.util.ChatComponentTranslation; -import net.minecraft.util.ChunkCoordinates; -import net.minecraft.util.MathHelper; -import twilightforest.world.ChunkProviderTwilightForest; -import twilightforest.world.TFWorldChunkManager; -import twilightforest.world.WorldProviderTwilightForest; - -public class CommandTFFeature extends CommandBase { - - @Override - public String getCommandName() { - return "tffeature"; - } - - @Override - public String getCommandUsage(ICommandSender sender) { - return "tffeature accepts the following arguments: info"; - } - - @Override - public void processCommand(ICommandSender sender, String[] args) { - if (args.length > 0) { - if (args[0].equalsIgnoreCase("info")) { - // info on current feature - - EntityPlayerMP player = getCommandSenderAsPlayer(sender); - - int dx = MathHelper.floor_double(player.posX); - int dy = MathHelper.floor_double(player.posY); - int dz = MathHelper.floor_double(player.posZ); - - if (!(player.worldObj.provider instanceof WorldProviderTwilightForest)) { - throw new WrongUsageException("commands.tffeature.not_in_twilight_forest", new Object[0]); - } else { - // nearest feature - TFFeature nearbyFeature = ((TFWorldChunkManager)player.worldObj.provider.worldChunkMgr).getFeatureAt(dx, dz, player.worldObj); - - sender.addChatMessage(new ChatComponentTranslation("The nearest feature is %s", new Object[] {nearbyFeature.name})); - - // are you in a structure? - ChunkProviderTwilightForest chunkProvider = ((WorldProviderTwilightForest)player.worldObj.provider).getChunkProvider(); - - if (chunkProvider.isBlockInStructureBB(dx, dy, dz)) { - sender.addChatMessage(new ChatComponentTranslation("You are in the structure for that feature.")); - - sender.addChatMessage(new ChatComponentTranslation("Structure conquer flag = %s.", new Object[] {chunkProvider.isStructureConquered(dx, dy, dz)})); - - // are you in a room? - - // what is the spawn list -// List spawnList = chunkProvider.getPossibleCreatures(EnumCreatureType.monster, dx, dy, dz); -// sender.addChatMessage(new ChatComponentTranslation("Spawn list for the area is:")); -// for (SpawnListEntry entry : spawnList) { -// sender.addChatMessage(new ChatComponentTranslation(entry.toString())); -// } - - - } else { - sender.addChatMessage(new ChatComponentTranslation("You are not in the structure for that feature.")); - } - } - } else if (args[0].equalsIgnoreCase("reactivate")) { - changeStructureActivity(sender, false); - } else if (args[0].equalsIgnoreCase("conquer")) { - changeStructureActivity(sender, true); - } else if (args[0].equalsIgnoreCase("center")) { - EntityPlayerMP player = getCommandSenderAsPlayer(sender); - - int dx = MathHelper.floor_double(player.posX); - //int dy = MathHelper.floor_double(player.posY); - int dz = MathHelper.floor_double(player.posZ); - - ChunkCoordinates cc = TFFeature.getNearestCenterXYZ(dx >> 4, dz >> 4, player.worldObj); - - TFWorldChunkManager wcm = (TFWorldChunkManager)player.worldObj.provider.worldChunkMgr; - - boolean fc = wcm.isInFeatureChunk(player.worldObj, dx, dz); - sender.addChatMessage(new ChatComponentTranslation("Center of feature = %s.", new Object[] {cc})); - sender.addChatMessage(new ChatComponentTranslation("Are in feature chunk = %s.", new Object[] {fc})); - } else { - throw new WrongUsageException("commands.tffeature.usage", new Object[0]); - } - - } else { - throw new WrongUsageException("commands.tffeature.usage", new Object[0]); - } - } - - private void changeStructureActivity(ICommandSender sender, boolean flag) throws WrongUsageException { - // activate current feature - EntityPlayerMP player = getCommandSenderAsPlayer(sender); - - int dx = MathHelper.floor_double(player.posX); - int dy = MathHelper.floor_double(player.posY); - int dz = MathHelper.floor_double(player.posZ); - - if (!(player.worldObj.provider instanceof WorldProviderTwilightForest)) { - throw new WrongUsageException("commands.tffeature.not_in_twilight_forest", new Object[0]); - } else { - // are you in a structure? - ChunkProviderTwilightForest chunkProvider = ((WorldProviderTwilightForest)player.worldObj.provider).getChunkProvider(); - - if (chunkProvider.isBlockInStructureBB(dx, dy, dz)) { - sender.addChatMessage(new ChatComponentTranslation("Structure conquer flag was %s. Changing to %s.", new Object[] {chunkProvider.isStructureConquered(dx, dy, dz), flag})); - - chunkProvider.setStructureConquered(dx, dy, dz, flag); - } else { - sender.addChatMessage(new ChatComponentTranslation("You are not in a structure.")); - } - } - } - -} diff --git a/src/main/java/twilightforest/CommandTFProgress.java b/src/main/java/twilightforest/CommandTFProgress.java deleted file mode 100644 index 49ab077cb4..0000000000 --- a/src/main/java/twilightforest/CommandTFProgress.java +++ /dev/null @@ -1,140 +0,0 @@ -package twilightforest; - -import java.util.List; - -import net.minecraft.command.CommandBase; -import net.minecraft.command.ICommand; -import net.minecraft.command.ICommandSender; -import net.minecraft.command.WrongUsageException; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.server.MinecraftServer; -import net.minecraft.util.ChatComponentTranslation; - -public class CommandTFProgress extends CommandBase { - - String[] bosses = new String[] {"none", "naga", "lich", "mooshroom", "hydra", "knights", "urghast", "yeti", "snowqueen", "giants", "final"}; - - @Override - public String getCommandName() { - return "tfprogress"; - } - - @Override - public String getCommandUsage(ICommandSender sender) { - return "tfprogress "; - } - - /** - * Return the required permission level for this command. - */ - public int getRequiredPermissionLevel() - { - return 2; - } - - @Override - public void processCommand(ICommandSender sender, String[] args) { - if (args.length < 2) { - throw new WrongUsageException("tfprogress ", new Object[0]); - } else { - EntityPlayerMP player = getPlayer(sender, args[0]); - int bossIndex = getBossIndex(args[1]); - - func_152373_a(sender, this, "Setting player %s progress to past boss %s.", new Object[] {player.getCommandSenderName(), bosses[bossIndex]}); - - - setProgress (player, bossIndex); - } - } - - - - private void setProgress(EntityPlayerMP player, int bossIndex) { - - // give previous achievements, if necessary - if (bossIndex > 0) { - for (int i = 0; i < bossIndex; i++) { - setProgress(player, i); - } - } - - // give achievements - switch (bossIndex) { - case 0: - default : - break; - case 1: - player.triggerAchievement(TFAchievementPage.twilightPortal); - player.triggerAchievement(TFAchievementPage.twilightArrival); - player.triggerAchievement(TFAchievementPage.twilightHunter); - player.triggerAchievement(TFAchievementPage.twilightKillNaga); - player.triggerAchievement(TFAchievementPage.twilightProgressNaga); - break; - case 2: - player.triggerAchievement(TFAchievementPage.twilightKillLich); - player.triggerAchievement(TFAchievementPage.twilightProgressLich); - break; - case 3: - player.triggerAchievement(TFAchievementPage.twilightProgressLabyrinth); - break; - case 4: - player.triggerAchievement(TFAchievementPage.twilightKillHydra); - player.triggerAchievement(TFAchievementPage.twilightProgressHydra); - break; - case 5: - player.triggerAchievement(TFAchievementPage.twilightProgressTrophyPedestal); - player.triggerAchievement(TFAchievementPage.twilightProgressKnights); - break; - case 6: - player.triggerAchievement(TFAchievementPage.twilightProgressUrghast); - break; - case 7: - player.triggerAchievement(TFAchievementPage.twilightProgressYeti); - break; - case 8: - player.triggerAchievement(TFAchievementPage.twilightProgressGlacier); - break; - case 9: - player.triggerAchievement(TFAchievementPage.twilightProgressTroll); - break; - case 10: - player.triggerAchievement(TFAchievementPage.twilightProgressThorns); - player.triggerAchievement(TFAchievementPage.twilightProgressCastle); - break; - } - - - } - - private int getBossIndex(String string) { - for (int i = 0; i < bosses.length; i++) { - if (bosses[i].equalsIgnoreCase(string)) { - return i; - } - } - - - return 0; - } - - /** - * Adds the strings available in this command to the given list of tab completion options. - */ - public List addTabCompletionOptions(ICommandSender p_71516_1_, String[] args) - { - return args.length == 1 ? getListOfStringsMatchingLastWord(args, this.getListOfPlayers()) : (args.length == 2 ? getListOfStringsMatchingLastWord(args, bosses) : null); - } - - protected String[] getListOfPlayers() - { - return MinecraftServer.getServer().getAllUsernames(); - } - - /** - * Return whether the specified command parameter index is a username parameter. - */ - public boolean isUsernameIndex(String[] p_82358_1_, int p_82358_2_) - { - return p_82358_2_ == 0; - } -} diff --git a/src/main/java/twilightforest/FoliageColorHandler.java b/src/main/java/twilightforest/FoliageColorHandler.java new file mode 100644 index 0000000000..f4d26efafe --- /dev/null +++ b/src/main/java/twilightforest/FoliageColorHandler.java @@ -0,0 +1,55 @@ +package twilightforest; + +import net.minecraft.client.Minecraft; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.FoliageColor; +import net.minecraft.world.level.biome.Biome; +import twilightforest.world.components.BiomeGrassColors; +import twilightforest.init.TFBiomes; + +import java.util.HashMap; +import java.util.Map; +import java.util.WeakHashMap; + +public final class FoliageColorHandler { + + private static final Map HANDLES = new WeakHashMap<>(); + + public static int get(int o, Biome biome, double x, double z) { + Handler handler = HANDLES.get(biome); + if (handler == null) { + handler = Handler.REGISTRY.getOrDefault( + Minecraft.getInstance().level == null ? null : + Minecraft.getInstance().level.registryAccess().registryOrThrow(Registries.BIOME).getResourceKey(biome).orElse(null), + Handler.DEFAULT); + HANDLES.put(biome, handler); + } + return handler.apply(o, x, z); + } + + @FunctionalInterface + private interface Handler { + + Map, Handler> REGISTRY = new HashMap<>() {{ + put(TFBiomes.SPOOKY_FOREST, (o, x, z) -> { + double noise = (Biome.TEMPERATURE_NOISE.getValue(x * 0.0225D, z * 0.0225D, false) + 1D) / 2D; + return BiomeGrassColors.blendColors(0xFF0101, 0x49FF01, noise > 0.6D ? noise * 0.2D : noise); + }); + put(TFBiomes.ENCHANTED_FOREST, (o, x, z) -> (o & 0xFFFF00) + BiomeGrassColors.getEnchantedColor((int) x, (int) z)); + put(TFBiomes.DARK_FOREST_CENTER, (o, x, z) -> { + double noise = (Biome.TEMPERATURE_NOISE.getValue(x * 0.0225D, z * 0.0225D, false) + 1D) / 2D; + return noise < -0.1D ? 0xF9821E : 0xE94E14; + }); + put(TFBiomes.DARK_FOREST, (o, x, z) -> ((FoliageColor.get(0.7F, 0.8F) & 0xFEFEFE) + 0x1E0E4E) / 2); + put(TFBiomes.SWAMP, (o, x, z) -> ((FoliageColor.get(0.8F, 0.9F) & 0xFEFEFE) + 0x4E0E4E) / 2); + }}; + + Handler DEFAULT = (o, x, z) -> o; + + int apply(int o, double x, double z); + + + } + +} diff --git a/src/main/java/twilightforest/TFAchievementPage.java b/src/main/java/twilightforest/TFAchievementPage.java deleted file mode 100644 index 3338b32966..0000000000 --- a/src/main/java/twilightforest/TFAchievementPage.java +++ /dev/null @@ -1,61 +0,0 @@ -package twilightforest; - -import net.minecraft.init.Blocks; -import net.minecraft.init.Items; -import net.minecraft.item.ItemStack; -import net.minecraft.stats.Achievement; -import twilightforest.block.TFBlocks; -import twilightforest.item.TFItems; - -public class TFAchievementPage extends net.minecraftforge.common.AchievementPage { - - - public static Achievement twilightPortal = (new Achievement(TwilightForestMod.ID + 1, "twilightPortal", -2, 1, TFBlocks.portal, (Achievement)null)).setSpecial().registerStat(); - public static Achievement twilightArrival = (new Achievement(TwilightForestMod.ID + 2, "twilightArrival", 0, 0, new ItemStack(TFBlocks.log, 1, 9), twilightPortal)).registerStat(); - public static Achievement twilightHunter = (new Achievement(TwilightForestMod.ID + 3, "twilightHunter", 2, 2, TFItems.feather, twilightArrival)).registerStat(); - public static Achievement twilightMagicMapFocus = (new Achievement(TwilightForestMod.ID + 5, "twilightMagicMapFocus", 2, 0, TFItems.magicMapFocus, twilightHunter)).registerStat(); - public static Achievement twilightHill1 = (new Achievement(TwilightForestMod.ID + 10, "twilightHill1", -2, -1, Blocks.iron_ore, twilightArrival)).registerStat(); - public static Achievement twilightHill2 = (new Achievement(TwilightForestMod.ID + 11, "twilightHill2", -3, -2, Blocks.gold_ore, twilightArrival)).registerStat(); - public static Achievement twilightHill3 = (new Achievement(TwilightForestMod.ID + 12, "twilightHill3", -1, -3, Blocks.diamond_ore, twilightArrival)).registerStat(); - public static Achievement twilightHedge = (new Achievement(TwilightForestMod.ID + 13, "twilightHedge", 2, -3, TFBlocks.hedge, twilightArrival)).registerStat(); - public static Achievement twilightMagicMap = (new Achievement(TwilightForestMod.ID + 14, "twilightMagicMap", 4, -1, TFItems.magicMap, twilightMagicMapFocus)).registerStat(); - - public static Achievement twilightKillNaga = (new Achievement(TwilightForestMod.ID + 6, "twilightKillNaga", 4, 3, new ItemStack(TFItems.trophy, 1, 1), twilightHunter)).registerStat(); - public static Achievement twilightProgressNaga = (new Achievement(TwilightForestMod.ID + 17, "twilightProgressNaga", 4, 5, TFItems.nagaScale, twilightKillNaga)).registerStat(); - public static Achievement twilightKillLich = (new Achievement(TwilightForestMod.ID + 8, "twilightKillLich", 2, 5, new ItemStack(TFItems.trophy, 1, 2), twilightProgressNaga)).registerStat(); - public static Achievement twilightProgressLich = (new Achievement(TwilightForestMod.ID + 18, "twilightProgressLich", -1, 4, TFItems.scepterLifeDrain, twilightKillLich)).registerStat(); - public static Achievement twilightProgressLabyrinth = (new Achievement(TwilightForestMod.ID + 28, "twilightProgressLabyrinth", -4, 6, TFItems.meefStroganoff, twilightProgressLich)).registerStat(); - public static Achievement twilightKillHydra = (new Achievement(TwilightForestMod.ID + 30, "twilightKillHydra", -6, 4, new ItemStack(TFItems.trophy, 1, 0), twilightProgressLabyrinth)).registerStat(); - public static Achievement twilightProgressHydra = (new Achievement(TwilightForestMod.ID + 20, "twilightProgressHydra", -8, 4, TFItems.fieryBlood, twilightKillHydra)).registerStat(); - public static Achievement twilightProgressTrophyPedestal = (new Achievement(TwilightForestMod.ID + 29, "twilightProgressTrophyPedestal", -5, 2, TFBlocks.trophyPedestal, twilightProgressHydra)).registerStat(); - public static Achievement twilightProgressKnights = (new Achievement(TwilightForestMod.ID + 21, "twilightProgressKnights", -5, -1, TFItems.phantomHelm, twilightProgressTrophyPedestal)).registerStat(); - public static Achievement twilightProgressUrghast = (new Achievement(TwilightForestMod.ID + 22, "twilightProgressUrghast", -7, -1, new ItemStack(TFItems.trophy, 1, 3), twilightProgressKnights)).registerStat(); - public static Achievement twilightProgressYeti = (new Achievement(TwilightForestMod.ID + 23, "twilightProgressYeti", -7, -3, TFItems.alphaFur, twilightProgressUrghast)).registerStat(); - public static Achievement twilightProgressGlacier = (new Achievement(TwilightForestMod.ID + 24, "twilightProgressGlacier", -5, -5, new ItemStack(TFItems.trophy, 1, 4), twilightProgressYeti)).registerStat(); - public static Achievement twilightProgressTroll = (new Achievement(TwilightForestMod.ID + 25, "twilightProgressTroll", -5, -7, TFItems.lampOfCinders, twilightProgressGlacier)).registerStat(); - public static Achievement twilightProgressThorns = (new Achievement(TwilightForestMod.ID + 26, "twilightProgressThorns", -3, -7, TFBlocks.thorns, twilightProgressTroll)).registerStat(); - public static Achievement twilightProgressCastle = (new Achievement(TwilightForestMod.ID + 27, "twilightProgressCastle", -1, -7, Blocks.stonebrick, twilightProgressThorns)).registerStat(); - - public static Achievement twilightNagaArmors = (new Achievement(TwilightForestMod.ID + 7, "twilightNagaArmors", 5, 1, TFItems.plateNaga, twilightKillNaga)).setSpecial().registerStat(); - public static Achievement twilightLichScepters = (new Achievement(TwilightForestMod.ID + 9, "twilightLichScepters", 3, 7, TFItems.scepterZombie, twilightKillLich)).setSpecial().registerStat(); - - public static Achievement twilightMazeMap = (new Achievement(TwilightForestMod.ID + 15, "twilightMazeMap", 1, 7, TFItems.mazeMap, twilightProgressLich)).registerStat(); - public static Achievement twilightOreMap = (new Achievement(TwilightForestMod.ID + 16, "twilightOreMap", 1, 9, TFItems.oreMap, twilightMazeMap)).setSpecial().registerStat(); - - public static Achievement twilightHydraChop = (new Achievement(TwilightForestMod.ID + 31, "twilightHydraChop", -6, 6, TFItems.hydraChop, twilightKillHydra)).registerStat(); - public static Achievement twilightMazebreaker = (new Achievement(TwilightForestMod.ID + 32, "twilightMazebreaker", -3, 4, TFItems.mazebreakerPick, twilightProgressLich)).setSpecial().registerStat(); - public static Achievement twilightFierySet = (new Achievement(TwilightForestMod.ID + 33, "twilightFierySet", -8, 7, TFItems.fierySword, twilightProgressHydra)).setSpecial().registerStat(); - public static Achievement twilightQuestRam = (new Achievement(TwilightForestMod.ID + 34, "twilightQuestRam", 1, -5, TFItems.crumbleHorn, twilightArrival)).setSpecial().registerStat(); - - - - public TFAchievementPage() { - super("Twilight Forest", twilightPortal, twilightArrival, twilightHunter, twilightMagicMapFocus, twilightKillNaga, twilightNagaArmors, twilightKillLich, - twilightLichScepters, twilightHill1, twilightHill2, twilightHill3, twilightHedge, twilightMagicMap, twilightMazeMap, twilightOreMap, - twilightProgressNaga, twilightProgressLich, twilightProgressLabyrinth, twilightHydraChop, twilightProgressKnights, twilightProgressUrghast, - twilightProgressYeti, twilightProgressGlacier, twilightProgressTroll, twilightProgressThorns, twilightProgressCastle, - twilightKillHydra, twilightHydraChop, twilightProgressTrophyPedestal, twilightProgressHydra, twilightMazebreaker, - twilightFierySet, twilightQuestRam); - } - -} diff --git a/src/main/java/twilightforest/TFCommonProxy.java b/src/main/java/twilightforest/TFCommonProxy.java deleted file mode 100644 index a45b2ea7c9..0000000000 --- a/src/main/java/twilightforest/TFCommonProxy.java +++ /dev/null @@ -1,130 +0,0 @@ -package twilightforest; - -import net.minecraft.client.model.ModelBiped; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.world.World; -import twilightforest.client.GuiTFCinderFurnace; -import twilightforest.inventory.ContainerTFCinderFurnace; -import twilightforest.inventory.ContainerTFUncrafting; -import cpw.mods.fml.common.network.IGuiHandler; - -public class TFCommonProxy implements IGuiHandler { - - /** - * Called during the pre-load step. Register stuff here. - * Obviously most stuff in the common category will be just registered in the mod file - */ - public void doPreLoadRegistration() { - ; - } - - /** - * Called during the load step. Register stuff here. - * Obviously most stuff in the common category will be just registered in the mod file - */ - public void doOnLoadRegistration() { - ; - } - - public int getCritterBlockRenderID() { - return 0; - } - - public int getPlantBlockRenderID() { - return 0; - } - - public int getComplexBlockRenderID() { - return 0; - } - - public int getNagastoneBlockRenderID() { - return 0; - } - - public int getMagicLeavesBlockRenderID() { - return 0; - } - - public int getPedestalBlockRenderID() { - return 0; - } - - public int getThornsBlockRenderID() { - return 0; - } - - public int getKnightmetalBlockRenderID() { - return 0; - } - - public int getHugeLilyPadBlockRenderID() { - return 0; - } - - public int getCastleMagicBlockRenderID() { - return 0; - } - - public int registerArmorRenderID(String prefix) { - return 0; - } - - public World getClientWorld() { - return null; - } - - /** - * Spawns a particle. This is my copy of RenderGlobal.spawnParticle where I implement custom particles. - * Null op except on the client. - */ - public void spawnParticle(World world, String particleType, double x, double y, double z, double velX, double velY, double velZ) - { - ; - } - - @Override - public Object getServerGuiElement(int id, EntityPlayer player, World world, int x, int y, int z) { - if (id == TwilightForestMod.GUI_ID_UNCRAFTING) { - return new ContainerTFUncrafting(player.inventory, world, x, y, z); - } else if (id == TwilightForestMod.GUI_ID_FURNACE) { - return new ContainerTFCinderFurnace(player.inventory, world, x, y, z); - } else { - return null; - } - } - - @Override - public Object getClientGuiElement(int id, EntityPlayer player, World world, int x, int y, int z) { - if (id == TwilightForestMod.GUI_ID_UNCRAFTING) { - return new twilightforest.client.GuiTFGoblinCrafting(player.inventory, world, x, y, z); - } else if (id == TwilightForestMod.GUI_ID_FURNACE) { - return new GuiTFCinderFurnace(player.inventory, world, x, y, z); - } else { - return null; - } - } - - public ModelBiped getKnightlyArmorModel(int armorSlot) { - return null; - } - - public ModelBiped getPhantomArmorModel(int armorSlot) { - return null; - } - - public ModelBiped getYetiArmorModel(int armorSlot) { - return null; - } - - public ModelBiped getArcticArmorModel(int armorSlot) { - return null; - } - - public ModelBiped getFieryArmorModel(int armorSlot) { - return null; - } - - public void doBlockAnnihilateEffect(World worldObj, int blockX, int blockY, int blockZ) { } - -} diff --git a/src/main/java/twilightforest/TFConfig.java b/src/main/java/twilightforest/TFConfig.java new file mode 100644 index 0000000000..646d971c9f --- /dev/null +++ b/src/main/java/twilightforest/TFConfig.java @@ -0,0 +1,393 @@ +package twilightforest; + +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.player.Player; +import net.minecraftforge.common.ForgeConfigSpec; +import net.minecraftforge.event.entity.player.PlayerEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.event.config.ModConfigEvent; +import net.minecraftforge.network.PacketDistributor; +import net.minecraftforge.server.ServerLifecycleHooks; +import org.jetbrains.annotations.Nullable; +import twilightforest.network.SyncUncraftingTableConfigPacket; +import twilightforest.network.TFPacketHandler; +import twilightforest.util.PlayerHelper; + +import java.util.ArrayList; +import java.util.List; + +@Mod.EventBusSubscriber(modid = TwilightForestMod.ID, bus = Mod.EventBusSubscriber.Bus.MOD) +public class TFConfig { + + public static Common COMMON_CONFIG; + public static Client CLIENT_CONFIG; + + public static class Common { + + public Common(ForgeConfigSpec.Builder builder) { + builder. + comment("Settings that are not reversible without consequences."). + push("Dimension Settings"); + { + DIMENSION.newPlayersSpawnInTF = builder. + translation(config + "spawn_in_tf"). + comment("If true, players spawning for the first time will spawn in the Twilight Forest."). + define("newPlayersSpawnInTF", false); + DIMENSION.portalForNewPlayerSpawn = builder. + translation(config + "portal_for_new_player"). + comment("If true, the return portal will spawn for new players that were sent to the TF if `spawn_in_tf` is true."). + define("portalForNewPlayer", false); + } + builder.pop(); + originDimension = builder. + translation(config + "origin_dimension"). + comment("The dimension you can always travel to the Twilight Forest from, as well as the dimension you will return to. Defaults to the overworld. (domain:regname)."). + define("originDimension", "minecraft:overworld"); + allowPortalsInOtherDimensions = builder. + translation(config + "portals_in_other_dimensions"). + comment("Allow portals to the Twilight Forest to be made outside of the 'origin' dimension. May be considered an exploit."). + define("allowPortalsInOtherDimensions", false); + adminOnlyPortals = builder. + translation(config + "admin_portals"). + comment("Allow portals only for admins (Operators). This severely reduces the range in which the mod usually scans for valid portal conditions, and it scans near ops only."). + define("adminOnlyPortals", false); + disablePortalCreation = builder. + translation(config + "portals"). + comment("Disable Twilight Forest portal creation entirely. Provided for server operators looking to restrict action to the dimension."). + define("disablePortalCreation", false); + checkPortalDestination = builder. + translation(config + "check_portal_destination"). + comment("Determines if new portals should be pre-checked for safety. If enabled, portals will fail to form rather than redirect to a safe alternate destination." + + + "\nNote that enabling this also reduces the rate at which portal formation checks are performed."). + define("checkPortalDestination", false); + portalLightning = builder. + translation(config + "portal_lighting"). + comment("Set this true if you want the lightning that zaps the portal to not set things on fire. For those who don't like fun."). + define("portalLightning", false); + shouldReturnPortalBeUsable = builder. + translation(config + "portal_return"). + comment("If false, the return portal will require the activation item."). + define("shouldReturnPortalBeUsable", true); + portalAdvancementLock = builder. + translation(config + "portal_unlocked_by_advancement"). + comment("Use a valid advancement resource location as a string. For example, using the string \"minecraft:story/mine_diamond\" will lock the portal behind the \"Diamonds!\" advancement. Invalid/Empty Advancement resource IDs will leave the portal entirely unlocked."). + define("portalUnlockedByAdvancement", ""); + maxPortalSize = builder. + translation(config + "max_portal_size"). + comment("The max amount of water spaces the mod will check for when creating a portal. Very high numbers may cause issues."). + defineInRange("maxPortalSize", 64, 4, Integer.MAX_VALUE); + casketUUIDLocking = builder. + worldRestart(). + translation(config + "casket_uuid_locking"). + comment("If true, Keepsake Caskets that are spawned when a player dies will not be accessible by other players. Use this if you dont want people taking from other people's death caskets. NOTE: server operators will still be able to open locked caskets.") + .define("uuid_locking", false); + disableSkullCandles = builder. + translation(config + "disable_skull_candles"). + comment("If true, disables the ability to make Skull Candles by right clicking a vanilla skull with a candle. Turn this on if you're having mod conflict issues for some reason."). + define("skull_candles", false); + defaultItemEnchants = builder. + translation(config + "default_item_enchantments"). + worldRestart(). + comment(""" + If false, items that come enchanted when you craft them (such as ironwood or steeleaf gear) will not show this way in the creative inventory. + Please note that this doesnt affect the crafting recipes themselves, you will need a datapack to change those. + """). + define("default_item_enchantments", true); + + builder. + comment("Settings for all things related to the uncrafting table."). + push("Uncrafting Table"); + { + UNCRAFTING_STUFFS.uncraftingXpCostMultiplier = builder. + worldRestart(). + translation(config + "uncrafting_xp_cost"). + comment(""" + Multiplies the total XP cost of uncrafting an item and rounds up. + Higher values means the recipe will cost more to uncraft, lower means less. Set to 0 to disable the cost altogether. + Note that this only affects reversed crafting recipes, uncrafting recipes will still use the same cost as they normally would."""). + defineInRange("uncraftingXpCostMultiplier", 1.0D, 0.0D, Double.MAX_VALUE); + UNCRAFTING_STUFFS.repairingXpCostMultiplier = builder. + worldRestart(). + translation(config + "repairing_xp_cost"). + comment(""" + Multiplies the total XP cost of repairing an item and rounds up. + Higher values means the recipe will cost more to repair, lower means less. Set to 0 to disable the cost altogether."""). + defineInRange("repairingXpCostMultiplier", 1.0D, 0.0D, Double.MAX_VALUE); + UNCRAFTING_STUFFS.disableUncraftingRecipes = builder. + worldRestart(). + translation(config + "uncrafting_recipes"). + comment(""" + If you don't want to disable uncrafting altogether, and would rather disable certain recipes, this is for you. + To add a recipe, add the mod id followed by the name of the recipe. You can check this in things like JEI. + Example: "twilightforest:firefly_particle_spawner" will disable uncrafting the particle spawner into a firefly jar, firefly, and poppy. + If an item has multiple crafting recipes and you wish to disable them all, add the item to the "twilightforest:banned_uncraftables" item tag. + If you have a problematic ingredient, like infested towerwood for example, add the item to the "twilightforest:banned_uncrafting_ingredients" item tag."""). + defineList("disableUncraftingRecipes", List.of("twilightforest:giant_log_to_oak_planks"), s -> s instanceof String); + UNCRAFTING_STUFFS.reverseRecipeBlacklist = builder. + worldRestart(). + translation(config + "uncrafting_recipes_flip"). + comment("If true, this will invert the above uncrafting recipe list from a blacklist to a whitelist."). + define("flipRecipeList", false); + UNCRAFTING_STUFFS.blacklistedUncraftingModIds = builder. + worldRestart(). + translation(config + "uncrafting_mod_ids"). + comment(""" + Here, you can disable all items from certain mods from being uncrafted. + Input a valid mod id to disable all uncrafting recipes from that mod. + Example: "twilightforest" will disable all uncrafting recipes from this mod."""). + defineList("blacklistedUncraftingModIds", new ArrayList<>(), s -> s instanceof String); + UNCRAFTING_STUFFS.flipUncraftingModIdList = builder. + worldRestart(). + translation(config + "uncrafting_mod_id_flip"). + comment("If true, this will invert the above option from a blacklist to a whitelist."). + define("flipIdList", false); + UNCRAFTING_STUFFS.allowShapelessUncrafting = builder. + worldRestart(). + translation(config + "shapeless_uncrafting"). + comment(""" + If true, the uncrafting table will also be allowed to uncraft shapeless recipes. + The table was originally intended to only take shaped recipes, but this option remains for people who wish to keep the functionality."""). + define("enableShapelessCrafting", false); + UNCRAFTING_STUFFS.disableUncrafting = builder. + worldRestart(). + translation(config + "uncrafting"). + comment("Disable the uncrafting function of the uncrafting table. Recommended as a last resort if there's too many things to change about its behavior."). + define("disableUncrafting", false); + } + builder.pop(); + + builder. + comment("Settings for all things related to the magic trees."). + push("Magic Trees"); + { + MAGIC_TREES.disableTime = builder. + worldRestart(). + translation(config + "disable_time"). + comment("If true, prevents the Timewood Core from functioning."). + define("disableTimeCore", false); + + MAGIC_TREES.timeRange = builder. + worldRestart(). + translation(config + "time_range"). + comment("Defines the radius at which the Timewood Core works. Can be a number anywhere between 1 and 128.") + .defineInRange("timeCoreRange", 16, 1, 128); + + MAGIC_TREES.disableTransformation = builder. + worldRestart(). + translation(config + "disable_transformation"). + comment("If true, prevents the Transformation Core from functioning."). + define("disableTransformationCore", false); + + MAGIC_TREES.transformationRange = builder. + worldRestart(). + translation(config + "transformation_range"). + comment("Defines the radius at which the Transformation Core works. Can be a number anywhere between 1 and 128.") + .defineInRange("transformationCoreRange", 16, 1, 128); + + MAGIC_TREES.disableMining = builder. + worldRestart(). + translation(config + "disable_mining"). + comment("If true, prevents the Minewood Core from functioning."). + define("disableMiningCore", false); + + MAGIC_TREES.miningRange = builder. + worldRestart(). + translation(config + "mining_range"). + comment("Defines the radius at which the Minewood Core works. Can be a number anywhere between 1 and 128.") + .defineInRange("miningCoreRange", 16, 1, 128); + + MAGIC_TREES.disableSorting = builder. + worldRestart(). + translation(config + "disable_sorting"). + comment("If true, prevents the Sortingwood Core from functioning."). + define("disableSortingCore", false); + + MAGIC_TREES.sortingRange = builder. + worldRestart(). + translation(config + "sorting_range"). + comment("Defines the radius at which the Sortingwood Core works. Can be a number anywhere between 1 and 128.") + .defineInRange("sortingCoreRange", 16, 1, 128); + } + builder.pop(); + + builder. + comment("We recommend downloading the Shield Parry mod for parrying, but these controls remain for without."). + push("Shield Parrying"); + { + SHIELD_INTERACTIONS.parryNonTwilightAttacks = builder. + translation(config + "parry_non_twilight"). + comment("Set to true to parry non-Twilight projectiles."). + define("parryNonTwilightAttacks", false); + SHIELD_INTERACTIONS.shieldParryTicks = builder. + translation(config + "parry_window"). + comment("The amount of ticks after raising a shield that makes it OK to parry a projectile."). + defineInRange("shieldParryTicksArrow", 40, 0, Integer.MAX_VALUE); + } + builder.pop(); + } + + public Dimension DIMENSION = new Dimension(); + + public static class Dimension { + + public ForgeConfigSpec.BooleanValue newPlayersSpawnInTF; + public ForgeConfigSpec.BooleanValue portalForNewPlayerSpawn; + + } + + public ForgeConfigSpec.ConfigValue originDimension; + public ForgeConfigSpec.BooleanValue allowPortalsInOtherDimensions; + public ForgeConfigSpec.BooleanValue adminOnlyPortals; + public ForgeConfigSpec.BooleanValue disablePortalCreation; + public ForgeConfigSpec.BooleanValue checkPortalDestination; + public ForgeConfigSpec.BooleanValue portalLightning; + public ForgeConfigSpec.BooleanValue shouldReturnPortalBeUsable; + public ForgeConfigSpec.ConfigValue portalAdvancementLock; + public ForgeConfigSpec.IntValue maxPortalSize; + public ForgeConfigSpec.BooleanValue casketUUIDLocking; + public ForgeConfigSpec.BooleanValue disableSkullCandles; + public ForgeConfigSpec.BooleanValue defaultItemEnchants; + + public MagicTrees MAGIC_TREES = new MagicTrees(); + + public static class MagicTrees { + public ForgeConfigSpec.BooleanValue disableTime; + public ForgeConfigSpec.IntValue timeRange; + public ForgeConfigSpec.BooleanValue disableTransformation; + public ForgeConfigSpec.IntValue transformationRange; + public ForgeConfigSpec.BooleanValue disableMining; + public ForgeConfigSpec.IntValue miningRange; + public ForgeConfigSpec.BooleanValue disableSorting; + public ForgeConfigSpec.IntValue sortingRange; + } + + public UncraftingStuff UNCRAFTING_STUFFS = new UncraftingStuff(); + + public static class UncraftingStuff { + public ForgeConfigSpec.DoubleValue uncraftingXpCostMultiplier; + public ForgeConfigSpec.DoubleValue repairingXpCostMultiplier; + public ForgeConfigSpec.BooleanValue allowShapelessUncrafting; + public ForgeConfigSpec.BooleanValue disableUncrafting; + public ForgeConfigSpec.ConfigValue> disableUncraftingRecipes; + public ForgeConfigSpec.BooleanValue reverseRecipeBlacklist; + public ForgeConfigSpec.ConfigValue> blacklistedUncraftingModIds; + public ForgeConfigSpec.BooleanValue flipUncraftingModIdList; + } + + public ShieldInteractions SHIELD_INTERACTIONS = new ShieldInteractions(); + @Nullable + public ResourceLocation portalLockingAdvancement; + + public static class ShieldInteractions { + public ForgeConfigSpec.BooleanValue parryNonTwilightAttacks; + public ForgeConfigSpec.IntValue shieldParryTicks; + } + + } + + public static class Client { + + public Client(ForgeConfigSpec.Builder builder) { + silentCicadas = builder. + translation(config + "silent_cicadas"). + comment("Make cicadas silent for those having sound library problems, or otherwise finding them annoying."). + define("silentCicadas", false); + silentCicadasOnHead = builder. + translation(config + "silent_cicadas_on_head"). + comment("Make cicadas silent when sitting on your head. If the above option is already true, this won't have any effect."). + define("silentCicadasOnHead", false); + firstPersonEffects = builder. + translation(config + "first_person_effects"). + comment("Controls whether various effects from the mod are rendered while in first-person view. Turn this off if you find them distracting."). + define("firstPersonEffects", true); + rotateTrophyHeadsGui = builder. + translation(config + "animate_trophyitem"). + comment("Rotate trophy heads on item model. Has no performance impact at all. For those who don't like fun."). + define("rotateTrophyHeadsGui", true); + disableOptifineNagScreen = builder. + translation(config + "optifine"). + comment("Disable the nag screen when Optifine is installed."). + define("disableOptifineNagScreen", false); + disableLockedBiomeToasts = builder. + translation(config + "locked_toasts"). + comment("Disables the toasts that appear when a biome is locked. Not recommended if you're not familiar with progression."). + define("disableLockedBiomeToasts", false); + showQuestRamCrosshairIndicator = builder. + translation(config + "ram_indicator"). + comment("Renders a little check mark or x above your crosshair depending on if fed the Quest Ram that color of wool. Turn this off if you find it intrusive."). + define("questRamWoolIndicator", true); + } + + public ForgeConfigSpec.BooleanValue silentCicadas; + public ForgeConfigSpec.BooleanValue silentCicadasOnHead; + public ForgeConfigSpec.BooleanValue firstPersonEffects; + public ForgeConfigSpec.BooleanValue rotateTrophyHeadsGui; + public ForgeConfigSpec.BooleanValue disableOptifineNagScreen; + public ForgeConfigSpec.BooleanValue disableLockedBiomeToasts; + public ForgeConfigSpec.BooleanValue showQuestRamCrosshairIndicator; + } + + private static final String config = "config." + TwilightForestMod.ID; + + @Nullable + public static ResourceLocation getPortalLockingAdvancement(Player player) { + //only run assigning logic if the config has an advancement set and the RL is null + if (!COMMON_CONFIG.portalAdvancementLock.get().isEmpty() && COMMON_CONFIG.portalLockingAdvancement == null) { + + if (!ResourceLocation.isValidResourceLocation(COMMON_CONFIG.portalAdvancementLock.get()) || PlayerHelper.getAdvancement(player, ResourceLocation.tryParse(COMMON_CONFIG.portalAdvancementLock.get())) == null) { + //if the RL is not a valid advancement fail us + TwilightForestMod.LOGGER.fatal("The portal locking advancement is not a valid advancement! Setting to null!"); + COMMON_CONFIG.portalAdvancementLock.set(""); + } else { + COMMON_CONFIG.portalLockingAdvancement = ResourceLocation.tryParse(COMMON_CONFIG.portalAdvancementLock.get()); + TwilightForestMod.LOGGER.debug("Portal Locking Advancement reloaded."); + } + } + //always return the RL, even if its null. We can use this to run logic less often + return COMMON_CONFIG.portalLockingAdvancement; + } + + @SubscribeEvent + public static void onConfigReload(final ModConfigEvent.Reloading event) { + //resends uncrafting settings to all players when the config is reloaded. This ensures all players have matching configs so things dont desync. + MinecraftServer server = ServerLifecycleHooks.getCurrentServer(); + if (server != null && server.isDedicatedServer()) { + TFPacketHandler.CHANNEL.send(PacketDistributor.ALL.noArg(), new SyncUncraftingTableConfigPacket( + COMMON_CONFIG.UNCRAFTING_STUFFS.uncraftingXpCostMultiplier.get(), + COMMON_CONFIG.UNCRAFTING_STUFFS.repairingXpCostMultiplier.get(), + COMMON_CONFIG.UNCRAFTING_STUFFS.allowShapelessUncrafting.get(), + COMMON_CONFIG.UNCRAFTING_STUFFS.disableUncrafting.get(), + COMMON_CONFIG.UNCRAFTING_STUFFS.disableUncraftingRecipes.get(), + COMMON_CONFIG.UNCRAFTING_STUFFS.reverseRecipeBlacklist.get(), + COMMON_CONFIG.UNCRAFTING_STUFFS.blacklistedUncraftingModIds.get(), + COMMON_CONFIG.UNCRAFTING_STUFFS.flipUncraftingModIdList.get())); + } + //sets cached portal locking advancement to null just in case it changed + COMMON_CONFIG.portalLockingAdvancement = null; + } + + //damn forge events + @Mod.EventBusSubscriber(modid = TwilightForestMod.ID) + public static class ConfigSync { + //sends uncrafting settings to a player on a server when they log in. This prevents desyncs when the configs dont match up between the player and the server. + @SubscribeEvent + public static void syncConfigOnLogin(PlayerEvent.PlayerLoggedInEvent event) { + MinecraftServer server = ServerLifecycleHooks.getCurrentServer(); + if (server != null && server.isDedicatedServer() && event.getEntity() instanceof ServerPlayer player) { + TFPacketHandler.CHANNEL.send(PacketDistributor.PLAYER.with(() -> player), new SyncUncraftingTableConfigPacket( + COMMON_CONFIG.UNCRAFTING_STUFFS.uncraftingXpCostMultiplier.get(), + COMMON_CONFIG.UNCRAFTING_STUFFS.repairingXpCostMultiplier.get(), + COMMON_CONFIG.UNCRAFTING_STUFFS.allowShapelessUncrafting.get(), + COMMON_CONFIG.UNCRAFTING_STUFFS.disableUncrafting.get(), + COMMON_CONFIG.UNCRAFTING_STUFFS.disableUncraftingRecipes.get(), + COMMON_CONFIG.UNCRAFTING_STUFFS.reverseRecipeBlacklist.get(), + COMMON_CONFIG.UNCRAFTING_STUFFS.blacklistedUncraftingModIds.get(), + COMMON_CONFIG.UNCRAFTING_STUFFS.flipUncraftingModIdList.get())); + } + } + } +} diff --git a/src/main/java/twilightforest/TFEventListener.java b/src/main/java/twilightforest/TFEventListener.java deleted file mode 100644 index 7272edcf84..0000000000 --- a/src/main/java/twilightforest/TFEventListener.java +++ /dev/null @@ -1,1000 +0,0 @@ -package twilightforest; - -import java.util.ArrayList; -import java.util.HashMap; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockSapling; -import net.minecraft.client.Minecraft; -import net.minecraft.command.CommandGameRule; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.item.EntityXPOrb; -import net.minecraft.entity.monster.EntitySkeleton; -import net.minecraft.entity.monster.IMob; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.entity.player.InventoryPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.init.Items; -import net.minecraft.inventory.IInventory; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.FurnaceRecipes; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.nbt.NBTTagList; -import net.minecraft.nbt.NBTTagString; -import net.minecraft.potion.Potion; -import net.minecraft.potion.PotionEffect; -import net.minecraft.util.ChatComponentText; -import net.minecraft.util.DamageSource; -import net.minecraft.util.MathHelper; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import net.minecraftforge.client.event.RenderGameOverlayEvent; -import net.minecraftforge.common.ISpecialArmor.ArmorProperties; -import net.minecraftforge.event.CommandEvent; -import net.minecraftforge.event.entity.living.LivingAttackEvent; -import net.minecraftforge.event.entity.living.LivingDeathEvent; -import net.minecraftforge.event.entity.living.LivingEvent.LivingUpdateEvent; -import net.minecraftforge.event.entity.living.LivingHurtEvent; -import net.minecraftforge.event.entity.player.BonemealEvent; -import net.minecraftforge.event.entity.player.EntityItemPickupEvent; -import net.minecraftforge.event.entity.player.PlayerInteractEvent; -import net.minecraftforge.event.entity.player.PlayerInteractEvent.Action; -import net.minecraftforge.event.world.BlockEvent.BreakEvent; -import net.minecraftforge.event.world.BlockEvent.HarvestDropsEvent; -import net.minecraftforge.event.world.WorldEvent; -import twilightforest.biomes.TFBiomeBase; -import twilightforest.block.TFBlocks; -import twilightforest.enchantment.TFEnchantment; -import twilightforest.entity.EntityTFCharmEffect; -import twilightforest.entity.EntityTFKobold; -import twilightforest.entity.EntityTFPinchBeetle; -import twilightforest.entity.EntityTFYeti; -import twilightforest.item.TFItems; -import twilightforest.world.ChunkProviderTwilightForest; -import twilightforest.world.TFWorldChunkManager; -import twilightforest.world.WorldProviderTwilightForest; -import cpw.mods.fml.common.FMLLog; -import cpw.mods.fml.common.eventhandler.Event.Result; -import cpw.mods.fml.common.eventhandler.SubscribeEvent; -import cpw.mods.fml.common.gameevent.PlayerEvent.ItemCraftedEvent; -import cpw.mods.fml.common.gameevent.PlayerEvent.PlayerChangedDimensionEvent; -import cpw.mods.fml.common.gameevent.PlayerEvent.PlayerLoggedInEvent; -import cpw.mods.fml.common.gameevent.PlayerEvent.PlayerLoggedOutEvent; -import cpw.mods.fml.common.gameevent.PlayerEvent.PlayerRespawnEvent; -import cpw.mods.fml.common.network.NetworkRegistry; -import cpw.mods.fml.common.network.internal.FMLProxyPacket; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -/** - * So much of the mod logic in this one class - */ -public class TFEventListener { - - protected HashMap playerKeepsMap = new HashMap(); - private boolean isBreakingWithGiantPick = false; - private boolean shouldMakeGiantCobble = false; - private int amountOfCobbleToReplace = 0; - private long lastSpawnedHintMonsterTime; - - /** - * Check if the player picks up a lich scepter, and if so, check for the scepter mastery achievement - */ - @SubscribeEvent - public void pickupItem(EntityItemPickupEvent event) { - Item item = event.item.getEntityItem().getItem(); - if (item == TFItems.scepterTwilight || item == TFItems.scepterLifeDrain - || item == TFItems.scepterZombie) { - // the player has picked up a scepter. Check if they have them all in their inventory, and if so, achievement - //System.out.println("Player picked up a scepter"); - checkPlayerForScepterMastery(event.entityPlayer); - event.entityPlayer.triggerAchievement(TFAchievementPage.twilightProgressLich); - } - - // naga scale gives naga progress achievement - if (item == TFItems.nagaScale) { - event.entityPlayer.triggerAchievement(TFAchievementPage.twilightProgressNaga); - } - // trophy gives kill achievement - if (item == TFItems.trophy && event.item.getEntityItem().getItemDamage() == 0) { - event.entityPlayer.triggerAchievement(TFAchievementPage.twilightKillHydra); - } - if (item == TFItems.trophy && event.item.getEntityItem().getItemDamage() == 1) { - event.entityPlayer.triggerAchievement(TFAchievementPage.twilightKillNaga); - } - if (item == TFItems.trophy && event.item.getEntityItem().getItemDamage() == 2) { - event.entityPlayer.triggerAchievement(TFAchievementPage.twilightKillLich); - } - if (item == TFItems.trophy && event.item.getEntityItem().getItemDamage() == 3) { - event.entityPlayer.triggerAchievement(TFAchievementPage.twilightProgressUrghast); - } - if (item == TFItems.trophy && event.item.getEntityItem().getItemDamage() == 4) { - event.entityPlayer.triggerAchievement(TFAchievementPage.twilightProgressGlacier); - } - // mazebreaker - if (item == TFItems.mazebreakerPick) { - event.entityPlayer.triggerAchievement(TFAchievementPage.twilightMazebreaker); - } - // meef stroganoff (or axe) - if (item == TFItems.meefStroganoff || item == TFItems.minotaurAxe) { - event.entityPlayer.triggerAchievement(TFAchievementPage.twilightProgressLabyrinth); - } - // fiery blood - if (item == TFItems.fieryBlood) { - event.entityPlayer.triggerAchievement(TFAchievementPage.twilightProgressHydra); - } - // phantom helm/plate - if (item == TFItems.phantomHelm || item == TFItems.phantomPlate) { - event.entityPlayer.triggerAchievement(TFAchievementPage.twilightProgressKnights); - } - // fiery tears - if (item == TFItems.fieryTears) { - event.entityPlayer.triggerAchievement(TFAchievementPage.twilightProgressUrghast); - } - // yeti items - if (item == TFItems.alphaFur || item == TFItems.yetiBoots || item == TFItems.yetiHelm - || item == TFItems.yetiPlate || item == TFItems.yetiLegs) { - event.entityPlayer.triggerAchievement(TFAchievementPage.twilightProgressYeti); - } - // lamp of cinders - if (item == TFItems.lampOfCinders) { - event.entityPlayer.triggerAchievement(TFAchievementPage.twilightProgressTroll); - } - } - - /** - * Does the player have all three scepters somewhere in the inventory? - * @param player - */ - private void checkPlayerForScepterMastery(EntityPlayer player) - { - boolean scepterTwilight = false; - boolean scepterLifeDrain = false; - boolean scepterZombie = false; - - IInventory inv = player.inventory; - - for (int i = 0; i < inv.getSizeInventory(); i++) - { - ItemStack stack = inv.getStackInSlot(i); - - if (stack != null && stack.getItem() == TFItems.scepterTwilight) - { - scepterTwilight = true; - } - if (stack != null && stack.getItem() == TFItems.scepterLifeDrain) - { - scepterLifeDrain = true; - } - if (stack != null && stack.getItem() == TFItems.scepterZombie) - { - scepterZombie = true; - } - } - - if (scepterTwilight && scepterLifeDrain && scepterZombie) - { - player.triggerAchievement(TFAchievementPage.twilightLichScepters); - } - } - - /** - * Check if we've crafted something that there's an achievement for - */ - @SubscribeEvent - public void onCrafting(ItemCraftedEvent event) { - - //System.out.println("Getting item crafted event"); - - ItemStack itemStack = event.crafting; - EntityPlayer player = event.player; - - // if the item is naga armor - if ((itemStack.getItem() == TFItems.plateNaga || itemStack.getItem() == TFItems.legsNaga)) { - // check if the player has made both armors - checkPlayerForNagaArmorer(player); - } - - // trigger achievements - if (itemStack.getItem() == TFItems.magicMapFocus) { - player.triggerAchievement(TFAchievementPage.twilightMagicMapFocus); - } - if (itemStack.getItem() == TFItems.emptyMagicMap) { - player.triggerAchievement(TFAchievementPage.twilightMagicMap); - } - if (itemStack.getItem() == TFItems.emptyMazeMap) { - player.triggerAchievement(TFAchievementPage.twilightMazeMap); - } - if (itemStack.getItem() == TFItems.emptyOreMap) { - player.triggerAchievement(TFAchievementPage.twilightOreMap); - } - - // if we've crafted 64 planks from a giant log, sneak 192 more planks into the player's inventory or drop them nearby - if (itemStack.getItem() == Item.getItemFromBlock(Blocks.planks) && itemStack.stackSize == 64 && this.doesCraftMatrixHaveGiantLog(event.craftMatrix)) { - addToPlayerInventoryOrDrop(player, new ItemStack(Blocks.planks, 64)); - addToPlayerInventoryOrDrop(player, new ItemStack(Blocks.planks, 64)); - addToPlayerInventoryOrDrop(player, new ItemStack(Blocks.planks, 64)); - - } - } - - private void addToPlayerInventoryOrDrop(EntityPlayer player, ItemStack planks) { - if (!player.inventory.addItemStackToInventory(planks)) { - player.dropPlayerItemWithRandomChoice(planks, false); - } - } - - private boolean doesCraftMatrixHaveGiantLog(IInventory inv) { - for (int i = 0; i < inv.getSizeInventory(); i++) { - ItemStack stack = inv.getStackInSlot(i); - - if (stack != null && stack.getItem() == Item.getItemFromBlock(TFBlocks.giantLog)) { - return true; - } - } - - - return false; - } - - /** - * Does the player have two naga armors? - */ - private void checkPlayerForNagaArmorer(EntityPlayer player) - { - boolean nagaScale = false; - boolean legsNaga = false; - - IInventory inv = player.inventory; - - for (int i = 0; i < inv.getSizeInventory(); i++) - { - ItemStack stack = inv.getStackInSlot(i); - - if (stack != null && stack.getItem() == TFItems.nagaScale) - { - nagaScale = true; - } - if (stack != null && stack.getItem() == TFItems.legsNaga) - { - legsNaga = true; - } - } - - if (nagaScale && legsNaga) - { - player.triggerAchievement(TFAchievementPage.twilightNagaArmors); - } - } - - /** - * Check to see if a smeltable block has dropped with a fiery tool, and if so, smelt it - * Also check if we need to transform 64 cobbles into a giant cobble - */ - @SubscribeEvent - public void harvestDrops(HarvestDropsEvent event) { - if (event.harvester != null && event.harvester.inventory.getCurrentItem() != null && event.harvester.inventory.getCurrentItem().getItem().func_150897_b(event.block)) { - if (event.harvester.inventory.getCurrentItem().getItem() == TFItems.fieryPick) { - ArrayList removeThese = new ArrayList(1); - ArrayList addThese = new ArrayList(1); - - for (ItemStack input : event.drops) - { - // does it smelt? - ItemStack result = FurnaceRecipes.smelting().getSmeltingResult(input); - if (result != null) - { - addThese.add(new ItemStack(result.getItem(), input.stackSize)); - removeThese.add(input); - - // spawn XP - spawnSpeltXP(result, event.world, event.x, event.y, event.z); - } - } - - // remove things we've decided to remove - event.drops.removeAll(removeThese); - - // add things we add - event.drops.addAll(addThese); - } - } - - // this flag is set in reaction to the breakBlock event, but we need to remove the drops in this event - if (this.shouldMakeGiantCobble && event.drops.size() > 0) { - // turn the next 64 cobblestone drops into one giant cobble - if (event.drops.get(0).getItem() == Item.getItemFromBlock(Blocks.cobblestone)) { - event.drops.remove(0); - if (this.amountOfCobbleToReplace == 64) { - event.drops.add(new ItemStack(TFBlocks.giantCobble)); - } - - this.amountOfCobbleToReplace--; - - if (this.amountOfCobbleToReplace <= 0) { - this.shouldMakeGiantCobble = false; - } - } - } - } - - /** - * Spawn XP for smelting the specified item at the specified location - */ - private void spawnSpeltXP(ItemStack smelted, World world, int x, int y, int z) { - float floatXP = FurnaceRecipes.smelting().func_151398_b(smelted); - int smeltXP = (int)floatXP; - // random chance of +1 XP to handle fractions - if (floatXP > smeltXP && world.rand.nextFloat() < (floatXP - smeltXP)) - { - smeltXP++; - } - - while (smeltXP > 0) - { - int splitXP = EntityXPOrb.getXPSplit(smeltXP); - smeltXP -= splitXP; - world.spawnEntityInWorld(new EntityXPOrb(world, x + 0.5D, y + 0.5D, z + 0.5D, splitXP)); - } - } - - /** - * We wait for a player wearing armor with the fire react enchantment to get hurt, and if that happens, we react - */ - @SubscribeEvent - public void entityHurts(LivingHurtEvent event) - { - // fire aura - if (event.entityLiving instanceof EntityPlayer && event.source.damageType.equals("mob") && event.source.getEntity() != null) - { - EntityPlayer player = (EntityPlayer)event.entityLiving; - int fireLevel = TFEnchantment.getFieryAuraLevel(player.inventory, event.source); - - //System.out.println("Detecting a fire reaction event. Reaction level is " + fireLevel); - - if (fireLevel > 0 && player.getRNG().nextInt(25) < fireLevel) - { - //System.out.println("Executing fire reaction."); - event.source.getEntity().setFire(fireLevel / 2); - } - } - - // chill aura - if (event.entityLiving instanceof EntityPlayer && event.source.damageType.equals("mob") - && event.source.getEntity() != null && event.source.getEntity() instanceof EntityLivingBase) { - EntityPlayer player = (EntityPlayer)event.entityLiving; - int chillLevel = TFEnchantment.getChillAuraLevel(player.inventory, event.source); - - //System.out.println("Detecting a chill aura event. Reaction level is " + chillLevel); - - if (chillLevel > 0) { - //System.out.println("Executing chill reaction."); - ((EntityLivingBase)event.source.getEntity()).addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, chillLevel * 5 + 5, chillLevel)); - - } - } - - // triple bow strips hurtResistantTime - if (event.source.damageType.equals("arrow") && event.source.getEntity() != null && event.source.getEntity() instanceof EntityPlayer) { - EntityPlayer player = (EntityPlayer)event.source.getEntity(); - - if (player.getCurrentEquippedItem() != null && player.getCurrentEquippedItem().getItem() == TFItems.tripleBow) { - //System.out.println("Triplebow Arrows!"); - event.entityLiving.hurtResistantTime = 0; - } - } - - // ice bow freezes - if (event.source.damageType.equals("arrow") && event.source.getEntity() != null && event.source.getEntity() instanceof EntityPlayer) { - EntityPlayer player = (EntityPlayer)event.source.getEntity(); - - if (player.getCurrentEquippedItem() != null && player.getCurrentEquippedItem().getItem() == TFItems.iceBow) { - - int chillLevel = 2; - event.entityLiving.addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 20 * 10, chillLevel, true)); - } - } - - // enderbow teleports - if (event.source.damageType.equals("arrow") && event.source.getEntity() != null && event.source.getEntity() instanceof EntityPlayer) { - EntityPlayer player = (EntityPlayer)event.source.getEntity(); - - if (player.getCurrentEquippedItem() != null && player.getCurrentEquippedItem().getItem() == TFItems.enderBow) { - - double sourceX = player.posX; - double sourceY = player.posY; - double sourceZ = player.posZ; - float sourceYaw = player.rotationYaw; - float sourcePitch = player.rotationPitch; - - // this is the only method that will move the player properly - player.rotationYaw = event.entityLiving.rotationYaw; - player.rotationPitch = event.entityLiving.rotationPitch; - player.setPositionAndUpdate(event.entityLiving.posX, event.entityLiving.posY, event.entityLiving.posZ); - player.playSound("mob.endermen.portal", 1.0F, 1.0F); - - - // monsters are easy to move - event.entityLiving.setPositionAndRotation(sourceX, sourceY, sourceZ, sourceYaw, sourcePitch); - event.entityLiving.playSound("mob.endermen.portal", 1.0F, 1.0F); - - - //System.out.println("Enderbow Arrow!"); - } - } - - // charm of life? - if (event.entityLiving instanceof EntityPlayer && willEntityDie(event)) - { - EntityPlayer player = (EntityPlayer)event.entityLiving; - - boolean charm1 = false; - boolean charm2 = player.inventory.consumeInventoryItem(TFItems.charmOfLife2); - if (!charm2) - { - charm1 = player.inventory.consumeInventoryItem(TFItems.charmOfLife1); - } - - // do they have a charm of life? OM NOM NOM! - if (charm2 || charm1) - { - //player.addChatMessage("Charm of Life saves you!!!"); - - // cancel damage - event.setResult(Result.DENY); - event.setCanceled(true); - event.ammount = 0; - - if (charm1) - { - player.setHealth(8); - player.addPotionEffect(new PotionEffect(Potion.regeneration.id, 100, 0)); - } - - if (charm2) - { - player.setHealth((float) player.getEntityAttribute(SharedMonsterAttributes.maxHealth).getBaseValue()); - - player.addPotionEffect(new PotionEffect(Potion.regeneration.id, 600, 3)); - player.addPotionEffect(new PotionEffect(Potion.resistance.id, 600, 0)); - player.addPotionEffect(new PotionEffect(Potion.fireResistance.id, 600, 0)); - } - - // spawn effect thingers - EntityTFCharmEffect effect = new EntityTFCharmEffect(player.worldObj, player, charm1 ? TFItems.charmOfLife1 : TFItems.charmOfLife2); - player.worldObj.spawnEntityInWorld(effect); - - EntityTFCharmEffect effect2 = new EntityTFCharmEffect(player.worldObj, player, charm1 ? TFItems.charmOfLife1 : TFItems.charmOfLife2); - effect2.offset = (float) Math.PI; - player.worldObj.spawnEntityInWorld(effect2); - - // sound - player.worldObj.playSoundEffect(player.posX + 0.5D, player.posY + 0.5D, player.posZ + 0.5D, "mob.zombie.unfect", 1.5F, 1.0F); - - } - } - } - - /** - * Is this damage likely to kill the target? - */ - public boolean willEntityDie(LivingHurtEvent event) - { - float amount = event.ammount; - DamageSource source = event.source; - EntityLivingBase living = event.entityLiving; - // reduce damage by armor - if (!source.isUnblockable()){ - int armor = 25 - living.getTotalArmorValue(); - //System.out.println("Initial amount = " + amount + ", armor = " + armor + " so damage after armor is " + ((amount * armor) / 25F)); - amount = (amount * armor) / 25F; - } - - // maybe also potions? - if (living.isPotionActive(Potion.resistance)) { - int resistance = 25 - (living.getActivePotionEffect(Potion.resistance).getAmplifier() + 1) * 5; - amount = amount * resistance / 25F; - } - //System.out.printf("I think the player is going to take %f damage and they have %f health.\n", Math.ceil(amount), living.getHealth()); - - return Math.ceil(amount) >= Math.floor(living.getHealth()); - } - - /** - * Catch bonemeal use - */ - @SubscribeEvent - public void bonemealUsed(BonemealEvent event) - { - if (event.block == TFBlocks.sapling) - { - if (!event.world.isRemote) - { - ((BlockSapling)TFBlocks.sapling).func_149878_d(event.world, event.x, event.y, event.z, event.world.rand); - - event.setResult(Result.ALLOW); - } - } - } - - - /** - * If a player dies with a charm of keeping, consume the charm and then keep track of what items we need to keep - * - * Also keep tower keys - */ - @SubscribeEvent - public void livingDies(LivingDeathEvent event) - { - if (event.entityLiving instanceof EntityPlayer && !event.entityLiving.worldObj.getGameRules().getGameRuleBooleanValue("keepInventory")) - { - EntityPlayer player = (EntityPlayer)event.entityLiving; - - if (player.inventory.consumeInventoryItem(TFItems.charmOfKeeping3)) - { - FMLLog.info("[TwilightForest] Player died with charm of keeping III! Keep it all!"); - InventoryPlayer keepInventory = new InventoryPlayer(null); - - // armor and full inventory - keepAllArmor(player, keepInventory); - for (int i = 0; i < player.inventory.mainInventory.length; i++) - { - keepInventory.mainInventory[i] = ItemStack.copyItemStack(player.inventory.mainInventory[i]); - player.inventory.mainInventory[i] = null; - } - keepInventory.setItemStack(new ItemStack(TFItems.charmOfKeeping3)); - - playerKeepsMap.put(player.getCommandSenderName(), keepInventory); - } - else if (player.inventory.consumeInventoryItem(TFItems.charmOfKeeping2)) - { - FMLLog.info("[TwilightForest] Player died with charm of keeping II! Keep armor and hotbar!"); - InventoryPlayer keepInventory = new InventoryPlayer(null); - - keepAllArmor(player, keepInventory); - for (int i = 0; i < 9; i++) - { - keepInventory.mainInventory[i] = ItemStack.copyItemStack(player.inventory.mainInventory[i]); - player.inventory.mainInventory[i] = null; - } - keepInventory.setItemStack(new ItemStack(TFItems.charmOfKeeping2)); - - playerKeepsMap.put(player.getCommandSenderName(), keepInventory); - } - else if (player.inventory.consumeInventoryItem(TFItems.charmOfKeeping1)) - { - FMLLog.info("[TwilightForest] Player died with charm of keeping I! Keep armor and current item!"); - InventoryPlayer keepInventory = new InventoryPlayer(null); - - keepAllArmor(player, keepInventory); - if (player.inventory.getCurrentItem() != null) - { - keepInventory.mainInventory[player.inventory.currentItem] = ItemStack.copyItemStack(player.inventory.mainInventory[player.inventory.currentItem]); - player.inventory.mainInventory[player.inventory.currentItem] = null; - } - keepInventory.setItemStack(new ItemStack(TFItems.charmOfKeeping1)); - - playerKeepsMap.put(player.getCommandSenderName(), keepInventory); - } - - // check for tower keys - if (player.inventory.hasItem(TFItems.towerKey)) - { - InventoryPlayer keepInventory = retrieveOrMakeKeepInventory(player); - // keep them all - for (int i = 0; i < player.inventory.mainInventory.length; i++) - { - if (player.inventory.mainInventory[i] != null && player.inventory.mainInventory[i].getItem() == TFItems.towerKey) - { - keepInventory.mainInventory[i] = ItemStack.copyItemStack(player.inventory.mainInventory[i]); - player.inventory.mainInventory[i] = null; - } - } - playerKeepsMap.put(player.getCommandSenderName(), keepInventory); - } - } - - if (playerKeepsMap.size() > 1) - { - FMLLog.warning("[TwilightForest] Twilight Forest mod is keeping track of a lot of dead player inventories. Has there been an apocalypse?"); - } - } - - /** - * If we have a stored inventory already, return that, if not, make a new one. - */ - private InventoryPlayer retrieveOrMakeKeepInventory(EntityPlayer player) - { - if (playerKeepsMap.containsKey(player.getCommandSenderName())) - { - return playerKeepsMap.get(player.getCommandSenderName()); - } - else - { - return new InventoryPlayer(null); - } - } - - /** - * Move the full armor inventory to the keep pile - */ - private void keepAllArmor(EntityPlayer player, InventoryPlayer keepInventory) { - for (int i = 0; i < player.inventory.armorInventory.length; i++) - { - keepInventory.armorInventory[i] = ItemStack.copyItemStack(player.inventory.armorInventory[i]); - player.inventory.armorInventory[i] = null; - } - } - /** - * Maybe we kept some stuff for the player! - */ - @SubscribeEvent - public void onPlayerRespawn(PlayerRespawnEvent event) { - EntityPlayer player = event.player; - if (playerKeepsMap.containsKey(player.getCommandSenderName())) - { - FMLLog.info("[TwilightForest] Player %s respawned and recieved items held in storage", player.getCommandSenderName()); - - InventoryPlayer keepInventory = playerKeepsMap.get(player.getCommandSenderName()); - - for (int i = 0; i < player.inventory.armorInventory.length; i++) - { - if (keepInventory.armorInventory[i] != null) - { - player.inventory.armorInventory[i] = keepInventory.armorInventory[i]; - } - } - for (int i = 0; i < player.inventory.mainInventory.length; i++) - { - if (keepInventory.mainInventory[i] != null) - { - player.inventory.mainInventory[i] = keepInventory.mainInventory[i]; - } - } - - // spawn effect thingers - if (keepInventory.getItemStack() != null) - { - EntityTFCharmEffect effect = new EntityTFCharmEffect(player.worldObj, player, keepInventory.getItemStack().getItem()); - player.worldObj.spawnEntityInWorld(effect); - - EntityTFCharmEffect effect2 = new EntityTFCharmEffect(player.worldObj, player, keepInventory.getItemStack().getItem()); - effect2.offset = (float) Math.PI; - player.worldObj.spawnEntityInWorld(effect2); - - player.worldObj.playSoundEffect(player.posX + 0.5D, player.posY + 0.5D, player.posZ + 0.5D, "mob.zombie.unfect", 1.5F, 1.0F); - } - - playerKeepsMap.remove(player.getCommandSenderName()); - } - } - - /** - * Dump stored items if player logs out - */ - @SubscribeEvent - public void onPlayerLogout(PlayerLoggedOutEvent event) { - EntityPlayer player = event.player; - if (playerKeepsMap.containsKey(player.getCommandSenderName())) - { - FMLLog.warning("[TwilightForest] Mod was keeping inventory items in reserve for player %s but they logged out! Items are being dropped.", player.getCommandSenderName()); - InventoryPlayer keepInventory = playerKeepsMap.get(player.getCommandSenderName()); - - // set player to the player logging out - keepInventory.player = player; - keepInventory.dropAllItems(); - - playerKeepsMap.remove(player.getCommandSenderName()); - } - } - - /** - * Stop the game from rendering the mount health for unfriendly creatures - */ - @SubscribeEvent - @SideOnly(Side.CLIENT) - public boolean preOverlay(RenderGameOverlayEvent.Pre event) - { - if (event.type == RenderGameOverlayEvent.ElementType.HEALTHMOUNT) - { - if (isRidingUnfriendly(Minecraft.getMinecraft().thePlayer)) - { - event.setCanceled(true); - return false; - - } - } - return true; - } - - - /** - * Stop the player from sneaking while riding an unfriendly creature - */ - @SubscribeEvent - public boolean livingUpdate(LivingUpdateEvent event) - { - if (event.entity instanceof EntityPlayer && event.entity.isSneaking() && isRidingUnfriendly(event.entityLiving)) - { - event.entity.setSneaking(false); - } - return true; - } - - /** - * Is the specified entity riding an unfriendly creature (pinch beetle?) - */ - private boolean isRidingUnfriendly(EntityLivingBase entity) { - return entity.isRiding() && (entity.ridingEntity instanceof EntityTFPinchBeetle || entity.ridingEntity instanceof EntityTFYeti); - } - - /** - * Check if the player is trying to break a block in a structure that's considered unbreakable for progression reasons - * Also check for breaking blocks with the giant's pickaxe and maybe break nearby blocks - */ - @SubscribeEvent - public void breakBlock(BreakEvent event) { - if (!event.getPlayer().capabilities.isCreativeMode && isAreaProtected(event.world, event.getPlayer(), event.x, event.y, event.z) && isBlockProtectedFromBreaking(event.world, event.x, event.y, event.z)) { - event.setCanceled(true); - } else if (!this.isBreakingWithGiantPick && event.getPlayer().getCurrentEquippedItem() != null && event.getPlayer().getCurrentEquippedItem().getItem() == TFItems.giantPick && event.getPlayer().getCurrentEquippedItem().getItem().func_150897_b(event.block)) { - //System.out.println("Breaking with giant pick!"); - - this.isBreakingWithGiantPick = true; - - - // check nearby blocks for same block or same drop - int bx = (event.x >> 2) << 2; - int by = (event.y >> 2) << 2; - int bz = (event.z >> 2) << 2; - - // pre-check for cobble! - boolean allCobble = event.block.getItemDropped(event.blockMetadata, event.world.rand, 0) == Item.getItemFromBlock(Blocks.cobblestone); - for (int dx = 0; dx < 4; dx++) { - for (int dy = 0; dy < 4; dy++) { - for (int dz = 0; dz < 4; dz++) { - Block blockThere = event.world.getBlock(bx + dx, by + dy, bz + dz); - int metaThere = event.world.getBlockMetadata(bx + dx, by + dy, bz + dz); - allCobble &= blockThere.getItemDropped(metaThere, event.world.rand, 0) == Item.getItemFromBlock(Blocks.cobblestone); - } - } - } - - if (allCobble && !event.getPlayer().capabilities.isCreativeMode) { - //System.out.println("It's all cobble!"); - this.shouldMakeGiantCobble = true; - this.amountOfCobbleToReplace = 64; - } else { - this.shouldMakeGiantCobble = false; - this.amountOfCobbleToReplace = 0; - } - - // break all nearby blocks - for (int dx = 0; dx < 4; dx++) { - for (int dy = 0; dy < 4; dy++) { - for (int dz = 0; dz < 4; dz++) { - Block blockThere = event.world.getBlock(bx + dx, by + dy, bz + dz); - int metaThere = event.world.getBlockMetadata(bx + dx, by + dy, bz + dz); - - if (!(event.x == bx + dx && event.y == by + dy && event.z == bz + dz) && blockThere == event.block && metaThere == event.blockMetadata) { - // try to break that block too! - if (event.getPlayer() instanceof EntityPlayerMP) { - EntityPlayerMP playerMP = (EntityPlayerMP)event.getPlayer(); - - playerMP.theItemInWorldManager.tryHarvestBlock(bx + dx, by + dy, bz + dz); - } - } - } - } - } - - this.isBreakingWithGiantPick = false; - - } - } - - /** - * Check if the player is trying to right block a block in a structure that's considered protected - * Also check for fiery set achievement - */ - @SubscribeEvent - public void rightClickBlock(PlayerInteractEvent event) { - if (event.action == Action.RIGHT_CLICK_BLOCK && event.entityPlayer.worldObj.provider instanceof WorldProviderTwilightForest && !event.entityPlayer.capabilities.isCreativeMode) { - - World world = event.entityPlayer.worldObj; - EntityPlayer player = event.entityPlayer; - int x = event.x; - int y = event.y; - int z = event.z; - - if (!world.isRemote && isBlockProtectedFromInteraction(world, x, y, z) && isAreaProtected(world, player, x, y, z)) { - event.useBlock = Result.DENY; - } - } - - ItemStack currentItem = event.entityPlayer.inventory.getCurrentItem(); - if (currentItem != null && (currentItem.getItem() == TFItems.fierySword || currentItem.getItem() == TFItems.fieryPick)) { - // are they also wearing the armor - if (checkPlayerForFieryArmor(event.entityPlayer)) { - event.entityPlayer.triggerAchievement(TFAchievementPage.twilightFierySet); - } - } - } - - /** - * Stop the player from interacting with blocks that could produce treasure or open doors in a protected area - */ - private boolean isBlockProtectedFromInteraction(World world, int x, int y, int z) { - Block block = world.getBlock(x, y, z); - - if (block == TFBlocks.towerDevice || block == Blocks.chest || block == Blocks.trapped_chest - || block == Blocks.stone_button || block == Blocks.wooden_button || block == Blocks.lever) { - return true; - } else { - return false; - } - } - - /** - * Stop the player from breaking blocks. We protect all blocks except openblocks graves - */ - private boolean isBlockProtectedFromBreaking(World world, int x, int y, int z) { - Block block = world.getBlock(x, y, z); - - // graves are okay! - if (block.getUnlocalizedName().equals("tile.openblocks.grave")) { - return false; - } - - return true; - } - - /** - * Return true if the player is wearing at least one piece of fiery armor - */ - private boolean checkPlayerForFieryArmor(EntityPlayer entityPlayer) { - ItemStack[] armor = entityPlayer.inventory.armorInventory; - if (armor[0] != null && armor[0].getItem() == TFItems.fieryBoots) { - return true; - } else if (armor[1] != null && armor[1].getItem() == TFItems.fieryLegs) { - return true; - } else if (armor[2] != null && armor[2].getItem() == TFItems.fieryPlate) { - return true; - } else if (armor[3] != null && armor[3].getItem() == TFItems.fieryHelm) { - return true; - } else { - return false; - } - } - - /** - * Return if the area at the coordinates is considered protected for that player. - * Currently, if we return true, we also send the area protection packet here. - */ - private boolean isAreaProtected(World world, EntityPlayer player, int x, int y, int z) { - if (world.getGameRules().getGameRuleBooleanValue(TwilightForestMod.ENFORCED_PROGRESSION_RULE) && world.provider instanceof WorldProviderTwilightForest) { - - ChunkProviderTwilightForest chunkProvider = ((WorldProviderTwilightForest)world.provider).getChunkProvider(); - - if (chunkProvider != null && chunkProvider.isBlockInStructureBB(x, y, z)) { - // what feature is nearby? is it one the player has not unlocked? - TFFeature nearbyFeature = ((TFWorldChunkManager)world.provider.worldChunkMgr).getFeatureAt(x, z, world); - - if (!nearbyFeature.doesPlayerHaveRequiredAchievement(player) && chunkProvider.isBlockProtected(x, y, z)) { - - // send protection packet - StructureBoundingBox sbb = chunkProvider.getSBBAt(x, y, z); - sendAreaProtectionPacket(world, x, y, z, sbb); - - // send a hint monster? - nearbyFeature.trySpawnHintMonster(world, player, x, y, z); - - return true; - } - } - } - return false; - } - - private void sendAreaProtectionPacket(World world, int x, int y, int z, StructureBoundingBox sbb) { - // send packet - FMLProxyPacket message = TFGenericPacketHandler.makeAreaProtectionPacket(sbb, x, y, z); - - NetworkRegistry.TargetPoint targetPoint = new NetworkRegistry.TargetPoint(world.provider.dimensionId, x, y, z, 64); - - TwilightForestMod.genericChannel.sendToAllAround(message, targetPoint); - } - - /** - * Cancel attacks in protected areas - */ - @SubscribeEvent - public void livingAttack(LivingAttackEvent event) { - - // area protection check - if (event.entityLiving instanceof IMob && event.source.getEntity() instanceof EntityPlayer && !((EntityPlayer)event.source.getEntity()).capabilities.isCreativeMode && event.entityLiving.worldObj.provider instanceof WorldProviderTwilightForest && event.entityLiving.worldObj.getGameRules().getGameRuleBooleanValue(TwilightForestMod.ENFORCED_PROGRESSION_RULE)) { - - ChunkProviderTwilightForest chunkProvider = ((WorldProviderTwilightForest)event.entityLiving.worldObj.provider).getChunkProvider(); - - int mx = MathHelper.floor_double(event.entityLiving.posX); - int my = MathHelper.floor_double(event.entityLiving.posY); - int mz = MathHelper.floor_double(event.entityLiving.posZ); - - if (chunkProvider != null && chunkProvider.isBlockInStructureBB(mx, my, mz) && chunkProvider.isBlockProtected(mx, my, mz)) { - // what feature is nearby? is it one the player has not unlocked? - TFFeature nearbyFeature = ((TFWorldChunkManager)event.entityLiving.worldObj.provider.worldChunkMgr).getFeatureAt(mx, mz, event.entityLiving.worldObj); - - if (!nearbyFeature.doesPlayerHaveRequiredAchievement((EntityPlayer) event.source.getEntity())) { - event.setResult(Result.DENY); - event.setCanceled(true); - - - // particle effect - for (int i = 0; i < 20; i++) { - //worldObj.spawnParticle("mobSpell", blockX + 0.5F, blockY + 0.5F, blockZ + 0.5F, red, grn, blu); - TwilightForestMod.proxy.spawnParticle(event.entityLiving.worldObj, "protection", event.entityLiving.posX, event.entityLiving.posY, event.entityLiving.posZ, 0, 0, 0); - - } - } - } - } - } - - /** - * When player logs in, report conflict status, set enforced_progression rule - */ - @SubscribeEvent - public void playerLogsIn(PlayerLoggedInEvent event) { - TwilightForestMod.hasBiomeIdConflicts = TFBiomeBase.areThereBiomeIdConflicts(); - if (TwilightForestMod.hasBiomeIdConflicts) { - event.player.addChatMessage(new ChatComponentText("[TwilightForest] Biome ID conflict detected. Fix by editing the config file.")); - } - - // check enforced progression - if (!event.player.worldObj.isRemote && event.player instanceof EntityPlayerMP) { - this.sendEnforcedProgressionStatus((EntityPlayerMP)event.player, event.player.worldObj.getGameRules().getGameRuleBooleanValue(TwilightForestMod.ENFORCED_PROGRESSION_RULE)); - } - } - - /** - * When player changes dimensions, send the rule status if they're moving to the Twilight Forest - */ - @SubscribeEvent - public void playerPortals(PlayerChangedDimensionEvent event) { - // check enforced progression - if (!event.player.worldObj.isRemote && event.player instanceof EntityPlayerMP && event.toDim == TwilightForestMod.dimensionID) { - this.sendEnforcedProgressionStatus((EntityPlayerMP)event.player, event.player.worldObj.getGameRules().getGameRuleBooleanValue(TwilightForestMod.ENFORCED_PROGRESSION_RULE)); - } - } - - private void sendEnforcedProgressionStatus(EntityPlayerMP player, boolean isEnforced) { - TwilightForestMod.genericChannel.sendTo(TFGenericPacketHandler.makeEnforcedProgressionStatusPacket(isEnforced), player); - } - - /** - * When world is loaded, check if the game rule is defined - */ - @SubscribeEvent - public void worldLoaded(WorldEvent.Load event) { - // check rule - if (!event.world.isRemote && !event.world.getGameRules().hasRule(TwilightForestMod.ENFORCED_PROGRESSION_RULE)) { - FMLLog.info("[TwilightForest] Loaded a world with the tfEnforcedProgression game rule not defined. Defining it."); - - event.world.getGameRules().addGameRule(TwilightForestMod.ENFORCED_PROGRESSION_RULE, "true"); - } - } - - /** - * When a command is used, check if someone's changing the progression game rule - */ - @SubscribeEvent - public void commandSent(CommandEvent event) { - if (event.command instanceof CommandGameRule && event.parameters.length > 1 && TwilightForestMod.ENFORCED_PROGRESSION_RULE.equals(event.parameters[0])) { - boolean isEnforced = Boolean.valueOf(event.parameters[1]); - TwilightForestMod.genericChannel.sendToAll(TFGenericPacketHandler.makeEnforcedProgressionStatusPacket(isEnforced)); - } - } - -} diff --git a/src/main/java/twilightforest/TFFeature.java b/src/main/java/twilightforest/TFFeature.java deleted file mode 100644 index c71cedd9f8..0000000000 --- a/src/main/java/twilightforest/TFFeature.java +++ /dev/null @@ -1,987 +0,0 @@ -package twilightforest; - -import java.util.ArrayList; -import java.util.List; -import java.util.Random; - -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.EnumCreatureType; -import net.minecraft.entity.monster.EntityBlaze; -import net.minecraft.entity.monster.EntityCaveSpider; -import net.minecraft.entity.monster.EntityCreeper; -import net.minecraft.entity.monster.EntityEnderman; -import net.minecraft.entity.monster.EntitySkeleton; -import net.minecraft.entity.monster.EntitySlime; -import net.minecraft.entity.monster.EntitySpider; -import net.minecraft.entity.monster.EntityWitch; -import net.minecraft.entity.monster.EntityZombie; -import net.minecraft.entity.passive.EntityBat; -import net.minecraft.entity.passive.EntitySquid; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.init.Items; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagList; -import net.minecraft.nbt.NBTTagString; -import net.minecraft.stats.Achievement; -import net.minecraft.stats.StatisticsFile; -import net.minecraft.util.ChunkCoordinates; -import net.minecraft.util.MathHelper; -import net.minecraft.world.World; -import net.minecraft.world.biome.BiomeGenBase; -import net.minecraft.world.biome.BiomeGenBase.SpawnListEntry; -import twilightforest.biomes.TFBiomeBase; -import twilightforest.entity.EntityTFAdherent; -import twilightforest.entity.EntityTFArmoredGiant; -import twilightforest.entity.EntityTFBlockGoblin; -import twilightforest.entity.EntityTFDeathTome; -import twilightforest.entity.EntityTFFireBeetle; -import twilightforest.entity.EntityTFGiantMiner; -import twilightforest.entity.EntityTFGoblinKnightLower; -import twilightforest.entity.EntityTFHarbingerCube; -import twilightforest.entity.EntityTFHelmetCrab; -import twilightforest.entity.EntityTFIceExploder; -import twilightforest.entity.EntityTFIceShooter; -import twilightforest.entity.EntityTFKobold; -import twilightforest.entity.EntityTFMazeSlime; -import twilightforest.entity.EntityTFMiniGhast; -import twilightforest.entity.EntityTFMinotaur; -import twilightforest.entity.EntityTFPinchBeetle; -import twilightforest.entity.EntityTFRedcap; -import twilightforest.entity.EntityTFRedcapSapper; -import twilightforest.entity.EntityTFSlimeBeetle; -import twilightforest.entity.EntityTFSnowGuardian; -import twilightforest.entity.EntityTFSwarmSpider; -import twilightforest.entity.EntityTFTowerBroodling; -import twilightforest.entity.EntityTFTowerGhast; -import twilightforest.entity.EntityTFTowerGolem; -import twilightforest.entity.EntityTFTroll; -import twilightforest.entity.EntityTFWraith; -import twilightforest.entity.EntityTFYeti; -import twilightforest.world.TFWorld; -import twilightforest.world.TFWorldChunkManager; - - - -public class TFFeature { - - public static final TFFeature[] featureList = new TFFeature[256]; - - public static final TFFeature nothing = new TFFeature(0, 0, "No Feature").enableDecorations().disableStructure(); - public static final TFFeature hill1 = new TFFeature(1, 1, "Small Hollow Hill").enableDecorations().enableTerrainAlterations(); - public static final TFFeature hill2 = new TFFeature(2, 2, "Medium Hollow Hill").enableDecorations().enableTerrainAlterations(); - public static final TFFeature hill3 = new TFFeature(3, 3, "Large Hollow Hill").enableDecorations().enableTerrainAlterations(); - public static final TFFeature hedgeMaze = new TFFeature(4, 2, "Hedge Maze").enableTerrainAlterations(); - public static final TFFeature nagaCourtyard = new TFFeature(5, 3, "Naga Courtyard").enableTerrainAlterations(); - public static final TFFeature lichTower = new TFFeature(6, 1, "Lich Tower").setRequiredAchievement(TFAchievementPage.twilightKillNaga); - public static final TFFeature iceTower = new TFFeature(7, 2, "Ice Tower").setRequiredAchievement(TFAchievementPage.twilightProgressYeti); - public static final TFFeature questIsland = new TFFeature(8, 1, "Quest Island").disableStructure(); - public static final TFFeature questGrove = new TFFeature(9, 1, "Quest Grove").enableTerrainAlterations(); - public static final TFFeature druidGrove = new TFFeature(10, 1, "Druid Grove").disableStructure(); - public static final TFFeature floatRuins = new TFFeature(11, 3, "Floating Ruins").disableStructure(); - public static final TFFeature hydraLair = new TFFeature(12, 2, "Hydra Lair").setRequiredAchievement(TFAchievementPage.twilightProgressLabyrinth).enableTerrainAlterations(); - public static final TFFeature labyrinth = new TFFeature(13, 3, "Labyrinth").enableDecorations().setRequiredAchievement(TFAchievementPage.twilightKillLich); - public static final TFFeature darkTower = new TFFeature(14, 1, "Dark Tower").setRequiredAchievement(TFAchievementPage.twilightProgressKnights); - public static final TFFeature tfStronghold = new TFFeature(15, 3, "Knight Stronghold").enableDecorations().setRequiredAchievement(TFAchievementPage.twilightProgressTrophyPedestal).disableProtectionAura(); - public static final TFFeature worldTree = new TFFeature(16, 3, "World Tree").disableStructure(); - public static final TFFeature yetiCave = new TFFeature(17, 2, "Yeti Lairs").enableDecorations().enableTerrainAlterations().setRequiredAchievement(TFAchievementPage.twilightProgressUrghast); - public static final TFFeature trollCave = new TFFeature(18, 3, "Troll Lairs").enableDecorations().enableTerrainAlterations().setRequiredAchievement(TFAchievementPage.twilightProgressGlacier).disableProtectionAura(); - public static final TFFeature finalCastle = new TFFeature(19, 3, "Final Castle"); - public static final TFFeature mushroomTower = new TFFeature(20, 2, "Mushroom Tower"); - - ArrayList emptyList = new ArrayList(); - - static { - // spawn lists! - lichTower.addMonster(EntityZombie.class, 10, 4, 4); - lichTower.addMonster(EntitySkeleton.class, 10, 4, 4); - lichTower.addMonster(EntityCreeper.class, 1, 4, 4); - lichTower.addMonster(EntityEnderman.class, 1, 1, 4); - lichTower.addMonster(EntityTFDeathTome.class, 10, 4, 4); - lichTower.addMonster(EntityWitch.class, 1, 1, 1); - - hill1.addMonster(EntitySpider.class, 10, 4, 4); - hill1.addMonster(EntityZombie.class, 10, 4, 4); - hill1.addMonster(EntityTFRedcap.class, 10, 4, 4); - hill1.addMonster(EntityTFSwarmSpider.class, 10, 4, 4); - hill1.addMonster(EntityTFKobold.class, 10, 4, 8); - - hill2.addMonster(EntityTFRedcap.class, 10, 4, 4); - hill2.addMonster(EntityTFRedcapSapper.class, 1, 1, 4); - hill2.addMonster(EntityTFKobold.class, 10, 4, 8); - hill2.addMonster(EntitySkeleton.class, 10, 4, 4); - hill2.addMonster(EntityTFSwarmSpider.class, 10, 4, 4); - hill2.addMonster(EntitySpider.class, 10, 4, 4); - hill2.addMonster(EntityCreeper.class, 10, 4, 4); - hill2.addMonster(EntityTFFireBeetle.class, 5, 4, 4); - hill2.addMonster(EntityTFSlimeBeetle.class, 5, 4, 4); - hill2.addMonster(EntityWitch.class, 1, 1, 1); - - hill3.addMonster(EntityTFRedcap.class, 10, 4, 4); - hill3.addMonster(EntityTFRedcapSapper.class, 2, 1, 4); - hill3.addMonster(EntitySkeleton.class, 10, 4, 4); - hill3.addMonster(EntityCaveSpider.class, 10, 4, 4); - hill3.addMonster(EntityCreeper.class, 10, 4, 4); - hill3.addMonster(EntityEnderman.class, 1, 1, 4); - hill3.addMonster(EntityTFWraith.class, 2, 1, 4); - hill3.addMonster(EntityTFFireBeetle.class, 10, 4, 4); - hill3.addMonster(EntityTFSlimeBeetle.class, 10, 4, 4); - hill3.addMonster(EntityTFPinchBeetle.class, 10, 2, 4); - hill3.addMonster(EntityWitch.class, 1, 1, 1); - - labyrinth.addMonster(EntityTFMinotaur.class, 20, 2, 4); - labyrinth.addMonster(EntityCaveSpider.class, 10, 4, 4); - labyrinth.addMonster(EntityCreeper.class, 10, 4, 4); - labyrinth.addMonster(EntityTFMazeSlime.class, 10, 4, 4); - labyrinth.addMonster(EntityEnderman.class, 1, 1, 4); - labyrinth.addMonster(EntityTFFireBeetle.class, 10, 4, 4); - labyrinth.addMonster(EntityTFSlimeBeetle.class, 10, 4, 4); - labyrinth.addMonster(EntityTFPinchBeetle.class, 10, 2, 4); - - darkTower.addMonster(EntityTFTowerGolem.class, 10, 4, 4); - darkTower.addMonster(EntitySkeleton.class, 10, 4, 4); - darkTower.addMonster(EntityCreeper.class, 10, 4, 4); - darkTower.addMonster(EntityEnderman.class, 2, 1, 4); - darkTower.addMonster(EntityWitch.class, 1, 1, 1); - darkTower.addMonster(EntityTFMiniGhast.class, 10, 1, 4); - darkTower.addMonster(EntityTFTowerBroodling.class, 10, 8, 8); - darkTower.addMonster(EntityTFPinchBeetle.class, 10, 2, 4); - // roof ghasts - darkTower.addMonster(1, EntityTFTowerGhast.class, 10, 1, 4); - // aquarium squids (only in aquariums between y = 35 and y = 64. :/ - darkTower.addWaterCreature(EntitySquid.class, 10, 4, 4); - - tfStronghold.addMonster(EntityTFBlockGoblin.class, 10, 4, 4); - tfStronghold.addMonster(EntityTFGoblinKnightLower.class, 5, 1, 2); - tfStronghold.addMonster(EntityTFHelmetCrab.class, 10, 4, 4); - tfStronghold.addMonster(EntityTFSlimeBeetle.class, 10, 4, 4); - tfStronghold.addMonster(EntityTFRedcapSapper.class, 2, 1, 4); - tfStronghold.addMonster(EntityTFKobold.class, 10, 4, 8); - tfStronghold.addMonster(EntityCreeper.class, 10, 4, 4); - tfStronghold.addMonster(EntitySlime.class, 5, 4, 4); - - yetiCave.addMonster(EntityTFYeti.class, 10, 4, 4); - - iceTower.addMonster(EntityTFSnowGuardian.class, 10, 4, 4); - iceTower.addMonster(EntityTFIceShooter.class, 10, 4, 4); - iceTower.addMonster(EntityTFIceExploder.class, 5, 4, 4); - - trollCave.addMonster(EntityCreeper.class, 5, 4, 4); - trollCave.addMonster(EntitySkeleton.class, 10, 4, 4); - trollCave.addMonster(EntityTFTroll.class, 20, 4, 4); - trollCave.addMonster(EntityWitch.class, 5, 1, 1); - // cloud monsters - trollCave.addMonster(1, EntityTFGiantMiner.class, 10, 1, 4); - trollCave.addMonster(1, EntityTFArmoredGiant.class, 10, 1, 4); - - // plain parts of the castle, like the tower maze - finalCastle.addMonster(EntityTFKobold.class, 10, 4, 4); - finalCastle.addMonster(EntityTFAdherent.class, 10, 1, 1); - finalCastle.addMonster(EntityTFHarbingerCube.class, 10, 1, 1); - finalCastle.addMonster(EntityEnderman.class, 10, 1, 1); - - // internal castle - finalCastle.addMonster(1, EntityTFKobold.class, 10, 4, 4); - finalCastle.addMonster(1, EntityTFAdherent.class, 10, 1, 1); - finalCastle.addMonster(1, EntityTFHarbingerCube.class, 10, 1, 1); - finalCastle.addMonster(1, EntityTFArmoredGiant.class, 10, 1, 1); - - // dungeons - finalCastle.addMonster(2, EntityTFAdherent.class, 10, 1, 1); - - // forge - finalCastle.addMonster(3, EntityBlaze.class, 10, 1, 1); - - } - - public int featureID; - public int size; - public String name; - public boolean areChunkDecorationsEnabled; - public boolean isStructureEnabled; - public boolean isTerrainAltered; - protected List> spawnableMonsterLists; - protected List ambientCreatureList; - protected List waterCreatureList; - protected Achievement requiredAchievement = null; - public boolean hasProtectionAura; - - private long lastSpawnedHintMonsterTime; - - - - public TFFeature(int parID, int parSize, String parName) { - this.featureID = parID; - TFFeature.featureList[parID] = this; - this.size = parSize; - this.name = parName; - this.areChunkDecorationsEnabled = false; - this.isStructureEnabled = true; - this.isTerrainAltered = false; - this.spawnableMonsterLists = new ArrayList>(); - this.ambientCreatureList = new ArrayList(); - this.waterCreatureList = new ArrayList(); - this.hasProtectionAura = true; - - ambientCreatureList.add(new SpawnListEntry(EntityBat.class, 10, 8, 8)); - } - - /** - * Turns on biome-specific decorations like grass and trees near this feature. - */ - public TFFeature enableDecorations() { - this.areChunkDecorationsEnabled = true; - return this; - } - - /** - * Tell the chunkgenerator that we don't have an associated structure. - */ - public TFFeature disableStructure() { - this.isStructureEnabled = false; - return this; - } - - /** - * Tell the chunkgenerator that we want the terrain changed nearby. - */ - public TFFeature enableTerrainAlterations() { - this.isTerrainAltered = true; - return this; - } - - public TFFeature disableProtectionAura() { - this.hasProtectionAura = false; - return this; - } - - /** - * Add a monster to spawn list 0 - */ - public TFFeature addMonster(Class monsterClass, int weight, int minGroup, int maxGroup) { - this.addMonster(0, monsterClass, weight, minGroup, maxGroup); - return this; - } - - /** - * Add a monster to a specific spawn list - */ - public TFFeature addMonster(int listIndex, Class monsterClass, int weight, int minGroup, int maxGroup) - { - List monsterList; - if (this.spawnableMonsterLists.size() > listIndex) - { - monsterList = this.spawnableMonsterLists.get(listIndex); - } - else - { - monsterList = new ArrayList(); - this.spawnableMonsterLists.add(listIndex, monsterList); - } - - monsterList.add(new SpawnListEntry(monsterClass, weight, minGroup, maxGroup)); - return this; - } - - /** - * Add a water creature - */ - public TFFeature addWaterCreature(Class monsterClass, int weight, int minGroup, int maxGroup) { - this.waterCreatureList.add(new SpawnListEntry(monsterClass, weight, minGroup, maxGroup)); - return this; - } - - /** - * @return The type of feature directly at the specified Chunk coordinates - */ - public static TFFeature getFeatureDirectlyAt(int chunkX, int chunkZ, World world) { - - if (world != null && world.getWorldChunkManager() instanceof TFWorldChunkManager) - { - TFWorldChunkManager tfManager = (TFWorldChunkManager) world.getWorldChunkManager(); - - if (tfManager.isInFeatureChunk(world, chunkX << 4, chunkZ << 4)) - { - return tfManager.getFeatureAt(chunkX << 4, chunkZ << 4, world); - } - else - { - return nothing; - } - } - else - { - return nothing; - } - } - - /** - * What feature would go in this chunk. Called when we know there is a feature, but there is no cache data, - * either generating this chunk for the first time, or using the magic map to forecast beyond the edge of the world. - */ - public static TFFeature generateFeatureForOldMapGen(int chunkX, int chunkZ, World world) - { -// if (false) -// { -// //return generateFeaturePreset5x5(chunkX, chunkZ, world); -// return generateFeaturePreset6x6(chunkX, chunkZ, world); -// } - - // what biome is at the center of the chunk? - BiomeGenBase biomeAt = world.getBiomeGenForCoords((chunkX << 4) + 8, (chunkZ << 4) + 8); - - // get random value - Random hillRNG = new Random(world.getSeed() + chunkX * 25117 + chunkZ * 151121); - int randnum = hillRNG.nextInt(16); - - // glaciers have ice towers - if (biomeAt == TFBiomeBase.glacier) { - return iceTower; - } - - // lakes have quest islands - if (biomeAt == TFBiomeBase.tfLake) { - return questIsland; - } - - // enchanted forests have groves - if (biomeAt == TFBiomeBase.enchantedForest) { - return questGrove; - } - - // fire swamp has hydra lair - if (biomeAt == TFBiomeBase.fireSwamp) { - return hydraLair; - } - - // temporary, clearing has maze ruins - if (biomeAt == TFBiomeBase.clearing || biomeAt == TFBiomeBase.oakSavanna) { - return labyrinth; - } - - // dark forests have their own things - if (biomeAt == TFBiomeBase.darkForest) - { - switch (randnum % 3) - { - case 0: - //return druidGrove; - break; - case 1: - return darkTower; - case 2: - return tfStronghold; - } - } - - - // highlands center has castle - if (biomeAt == TFBiomeBase.highlandsCenter) { - return finalCastle; - } - // highlands has trolls - if (biomeAt == TFBiomeBase.highlands) { - return trollCave; - } - - // deep mushrooms has mushroom tower - if (biomeAt == TFBiomeBase.deepMushrooms) { - return mushroomTower; - } - - // okay, well that takes care of most special cases - switch (randnum) - { - default: - case 0: // oops, I forgot about zero for a long time, now there are too many hill 1s - case 1: - case 2: - case 3: - case 4: - case 5: - case 6: - return hill1; - case 7: - case 8: - case 9: - return hill2; - case 10: - return hill3; - case 11: - case 12: - return hedgeMaze; - case 13: - return (biomeAt != TFBiomeBase.tfSwamp) ? nagaCourtyard : hydraLair; // hydra in the swamp, naga everywhere else - case 14: - case 15: - return lichTower; - } - } - - public static TFFeature generateFeatureFor1Point7(int chunkX, int chunkZ, World world) { - if (TwilightForestMod.oldMapGen) - { - return generateFeatureForOldMapGen(chunkX, chunkZ, world); - } - - // set the chunkX and chunkZ to the center of the biome - chunkX = Math.round(chunkX / 16F) * 16; - chunkZ = Math.round(chunkZ / 16F) * 16; - - // what biome is at the center of the chunk? - BiomeGenBase biomeAt = world.getBiomeGenForCoords((chunkX << 4) + 8, (chunkZ << 4) + 8); - - // get random value - Random hillRNG = new Random(world.getSeed() + chunkX * 25117 + chunkZ * 151121); - int randnum = hillRNG.nextInt(16); - - // glaciers have ice towers - if (biomeAt == TFBiomeBase.glacier) { - return iceTower; - } - // snow has yeti lair - if (biomeAt == TFBiomeBase.tfSnow) { - return yetiCave; - } - - // lakes have quest islands - if (biomeAt == TFBiomeBase.tfLake) { - return questIsland; - } - - // enchanted forests have groves - if (biomeAt == TFBiomeBase.enchantedForest) { - return questGrove; - } - - // fire swamp has hydra lair - if (biomeAt == TFBiomeBase.fireSwamp) { - return hydraLair; - } - // swamp has labyrinth - if (biomeAt == TFBiomeBase.tfSwamp) { - return labyrinth; - } - - // dark forests have their own things - if (biomeAt == TFBiomeBase.darkForest) - { - return tfStronghold; - } - if (biomeAt == TFBiomeBase.darkForestCenter) { - return darkTower; - } - - // highlands center has castle - if (biomeAt == TFBiomeBase.highlandsCenter) { - return finalCastle; - } - // highlands has trolls - if (biomeAt == TFBiomeBase.highlands) { - return trollCave; - } - - // deep mushrooms has mushroom tower - if (biomeAt == TFBiomeBase.deepMushrooms) { - return mushroomTower; - } - - int regionOffsetX = Math.abs((chunkX + 64 >> 4) % 8); - int regionOffsetZ = Math.abs((chunkZ + 64 >> 4) % 8); - - // plant two lich towers near the center of each 2048x2048 map area - if ((regionOffsetX == 4 && regionOffsetZ == 5) || (regionOffsetX == 4 && regionOffsetZ == 3)) { - return lichTower; - } - - // also two nagas - if ((regionOffsetX == 5 && regionOffsetZ == 4) || (regionOffsetX == 3 && regionOffsetZ == 4)) { - return nagaCourtyard; - } - - // okay, well that takes care of most special cases - switch (randnum) - { - default: - case 0: - case 1: - case 2: - case 3: - case 4: - case 5: - return hill1; - case 6: - case 7: - case 8: - return hill2; - case 9: - return hill3; - case 10: - case 11: - return hedgeMaze; - case 12: - case 13: - return nagaCourtyard; - case 14: - case 15: - return lichTower; - } - } - - /** - * What feature would go in this chunk. Called when we know there is a feature, but there is no cache data, - * either generating this chunk for the first time, or using the magic map to forecast beyond the edge of the world. - */ - public static TFFeature generateFeaturePreset5x5(int chunkX, int chunkZ, World world) - { - int cf = 16; - - if (chunkX % cf != 0 || chunkZ % cf != 0) - { - return TFFeature.nothing; - } - - int mx = (chunkX / cf) + 4; - int mz = (chunkZ / cf) + 4; - - - int[][] map = { - { 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 19, 18, 8, 15, 14, 0 }, - { 0, 0, 18, 18, 2, 3, 15, 0 }, - { 0, 0, 4, 4, 5, 16, 9, 0 }, - { 0, 0, 13, 6, 1, 2, 17, 0 }, - { 0, 0, 12, 13, 3, 17, 7, 0 }, - { 0, 0, 0, 0, 0, 0, 0, 0 } }; - - if (mx >= 0 && mx < 8 && mz >= 0 && mz < 8) - { - return TFFeature.featureList[map[mz][mx]]; - } - else - { - return TFFeature.nothing; - } - } - - /** - * What feature would go in this chunk. Called when we know there is a feature, but there is no cache data, - * either generating this chunk for the first time, or using the magic map to forecast beyond the edge of the world. - */ - public static TFFeature generateFeaturePreset6x6(int chunkX, int chunkZ, World world) - { - int cf = 16; - - if (chunkX % cf != 0 || chunkZ % cf != 0) - { - return TFFeature.nothing; - } - - int mx = (chunkX / cf) + 3; - int mz = (chunkZ / cf) + 3; - - - int[][] map = { - { 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 19, 19, 18, 15, 0, 0, 0 }, - { 0, 18, 18, 18, 0, 14, 0, 0 }, - { 0, 0, 4, 1, 2, 3, 15, 0 }, - { 0, 4, 1, 5, 16, 9, 17, 0 }, - { 0, 0, 13, 2, 3, 17, 17, 0 }, - { 0, 0, 12, 13, 6, 17, 7, 0 }, - { 0, 0, 0, 0, 0, 0, 0, 0 } }; - - if (mx >= 0 && mx < 8 && mz >= 0 && mz < 8) - { - return TFFeature.featureList[map[mz][mx]]; - } - else - { - return TFFeature.nothing; - } - } - - /** - * @return The feature nearest to the specified chunk coordinates - */ - public static TFFeature getNearestFeature(int cx, int cz, World world) - { - for (int rad = 1; rad <= 3; rad++) - { - for (int x = -rad; x <= rad; x++) - { - for (int z = -rad; z <= rad; z++) - { - TFFeature directlyAt = getFeatureDirectlyAt(x + cx, z + cz, world); - if (directlyAt.size == rad) - { - return directlyAt; - } - } - } - } - - return nothing; - } - - /** - * @return The feature in the chunk "region" - */ - public static TFFeature getFeatureForRegion(int chunkX, int chunkZ, World world) - { - //just round to the nearest multiple of 16 chunks? - int featureX = Math.round(chunkX / 16F) * 16; - int featureZ = Math.round(chunkZ / 16F) * 16; - - return TFFeature.generateFeatureFor1Point7(featureX, featureZ, world); - - /* old version - for (int rad = 1; rad <= 3; rad++) - { - for (int x = -rad; x <= rad; x++) - { - for (int z = -rad; z <= rad; z++) - { - TFFeature directlyAt = getFeatureDirectlyAt(x + chunkX, z + chunkZ, world); - if (directlyAt != TFFeature.nothing) - { - return directlyAt; - } - } - } - } - - return nothing; - */ - } - - /** - * If we're near a hollow hill, this returns relative block coordinates indicating the center of that hill relative to the current chunk block coordinate system. - * - * @param cx - * @param cz - * @param seed - * @return - */ - public static int[] getNearestCenter(int cx, int cz, World world) - { - for (int rad = 1; rad <= 3; rad++) - { - for (int x = -rad; x <= rad; x++) - { - for (int z = -rad; z <= rad; z++) - { - if (getFeatureDirectlyAt(x + cx, z + cz, world).size == rad) - { - int[] center = {x * 16 + 8, z * 16 + 8}; - return center; - } - } - } - } - int[] no = {0, 0}; - return no; - } - - /** - * Given some coordinates, return the center of the nearest feature. - * - * At the moment, with how features are distributed, just get the closest multiple of 256 and add +8 in both directions. - * - * Maybe in the future we'll have to actually search for a feature chunk nearby, but for now this will work. - * - */ - public static ChunkCoordinates getNearestCenterXYZ(int cx, int cz, World world) { - // legacy support - if (TwilightForestMod.oldMapGen) - { - return getNearestCenterXYZOld(cx, cz, world); - } - - int chunkX = cx; - int chunkZ = cz; - - // generate random number for the whole biome area - int regionX = (chunkX + 8) >> 4; - int regionZ = (chunkZ + 8) >> 4; - - long seed = (long)(regionX * 3129871) ^ (long)regionZ * 116129781L; - seed = seed * seed * 42317861L + seed * 7L; - - int num0 = (int) (seed >> 12 & 3L); - int num1 = (int) (seed >> 15 & 3L); - int num2 = (int) (seed >> 18 & 3L); - int num3 = (int) (seed >> 21 & 3L); - - // slightly randomize center of biome (+/- 3) - int centerX = 8 + num0 - num1; - int centerZ = 8 + num2 - num3; - - // centers are offset strangely depending on +/- - int ccz; - if (regionZ >= 0) { - ccz = (regionZ * 16 + centerZ - 8) * 16 + 8; - } else { - ccz = (regionZ * 16 + (16 - centerZ) - 8) * 16 + 9; - } - - int ccx; - if (regionX >= 0) { - ccx = (regionX * 16 + centerX - 8) * 16 + 8; - } else { - ccx = (regionX * 16 + (16 - centerX) - 8) * 16 + 9; - } - - return new ChunkCoordinates(ccx, TFWorld.SEALEVEL, ccz);// Math.abs(chunkX % 16) == centerX && Math.abs(chunkZ % 16) == centerZ; - - - - } - - private static ChunkCoordinates getNearestCenterXYZOld(int cx, int cz, World world) { - int fx = (int) (Math.round(cx / 256.0) * 256 + 8); - int fz = (int) (Math.round(cz / 256.0) * 256 + 8); - - return new ChunkCoordinates(fx, TFWorld.SEALEVEL, fz); - - } - - /** - * Returns a list of hostile monsters. Are we ever going to need passive or water creatures? - */ - public List getSpawnableList(EnumCreatureType par1EnumCreatureType) - { - if (par1EnumCreatureType == EnumCreatureType.monster) - { - return this.getSpawnableList(EnumCreatureType.monster, 0); - } - else if (par1EnumCreatureType == EnumCreatureType.ambient) - { - return this.ambientCreatureList; - } - else if (par1EnumCreatureType == EnumCreatureType.waterCreature) - { - return this.waterCreatureList; - } - else - { - return emptyList; - } - } - - /** - * Returns a list of hostile monsters in the specified indexed category - */ - public List getSpawnableList(EnumCreatureType par1EnumCreatureType, int index) - { - if (par1EnumCreatureType == EnumCreatureType.monster) - { - if (index >= 0 && index < this.spawnableMonsterLists.size()) - { - return this.spawnableMonsterLists.get(index); - } - else - { - return emptyList; - } - } - else - { - return getSpawnableList(par1EnumCreatureType); - } - } - - private TFFeature setRequiredAchievement(Achievement required) { - this.requiredAchievement = required; - - return this; - } - - public boolean doesPlayerHaveRequiredAchievement(EntityPlayer player) { - if (this.requiredAchievement != null) { - // can we get the player's stats here at all? - if (player instanceof EntityPlayerMP && ((EntityPlayerMP)player).func_147099_x() != null) { - StatisticsFile stats = ((EntityPlayerMP)player).func_147099_x(); - - return stats.hasAchievementUnlocked(this.requiredAchievement); - } else { - return false; // cannot get stats - } - } else { - return true; // no required achievement - } - } - - - /** - * Try to spawn a hint monster near the specified player - */ - public void trySpawnHintMonster(World world, EntityPlayer player) { - this.trySpawnHintMonster(world, player, MathHelper.floor_double(player.posX), MathHelper.floor_double(player.posY), MathHelper.floor_double(player.posZ)); - } - - /** - * Try several times to spawn a hint monster - */ - public void trySpawnHintMonster(World world, EntityPlayer player, int x, int y, int z) { - // check if the timer is valid - long currentTime = world.getTotalWorldTime(); - - // if someone set the time backwards, fix the spawn timer - if (currentTime < this.lastSpawnedHintMonsterTime) { - this.lastSpawnedHintMonsterTime = 0; - } - - if (currentTime - this.lastSpawnedHintMonsterTime > 1200) { - // okay, time is good, try several times to spawn one - for (int i = 0; i < 20; i++) { - if (didSpawnHintMonster(world, player, x, y, z)) { - this.lastSpawnedHintMonsterTime = currentTime; - break; - } - } - } else { - //System.out.println("Can't spawn hint monster because of timer"); - } - - } - - /** - * Try once to spawn a hint monster near the player. Return true if we did. - * - * We could change up the monster depending on what feature this is, but we currently are not doing that - */ - private boolean didSpawnHintMonster(World world, EntityPlayer player, int x, int y, int z) { - // find a target point - int dx = x + world.rand.nextInt(16) - world.rand.nextInt(16); - int dy = y + world.rand.nextInt(4) - world.rand.nextInt(4); - int dz = z + world.rand.nextInt(16) - world.rand.nextInt(16); - - // make our hint monster - EntityTFKobold hinty = new EntityTFKobold(world); - hinty.setPosition(dx, dy, dz); - - // check if the bounding box is clear - boolean isClearSpawn = world.checkNoEntityCollision(hinty.boundingBox) && world.getCollidingBoundingBoxes(hinty, hinty.boundingBox).isEmpty() && !world.isAnyLiquid(hinty.boundingBox); - - if (isClearSpawn && hinty.canEntityBeSeen(player)) { - - // add items and hint book - ItemStack book = this.createHintBook(); - - hinty.setCurrentItemOrArmor(0, book); - hinty.setEquipmentDropChance(0, 1.0F); - - world.spawnEntityInWorld(hinty); - return true; - } else { - //System.out.println("Spawn point no go"); - //System.out.println("Spawn point clear? " + isClearSpawn); - //System.out.println("Spawn point can see player? " + skel.canEntityBeSeen(player)); - return false; - } - } - - - /** - * Create a hint book for the specified feature. Only features with block protection will need this. - */ - public ItemStack createHintBook() { - ItemStack book = new ItemStack(Items.written_book); - - NBTTagList bookPages = new NBTTagList(); - - if (this == TFFeature.lichTower) { - - bookPages.appendTag(new NBTTagString("\u00A78[[An explorer's notebook, gnawed on by monsters]]\u00A70\n\nI have begun examining the strange aura surrounding this tower. The bricks of the tower are protected by a curse, stronger than any I've seen before. The magic from the curse")); - bookPages.appendTag(new NBTTagString("is boiling off into the surrounding area.\n\nIn my homeland I would have many options for dealing with this magic, but here my supplies are limited. I shall have to research...")); - bookPages.appendTag(new NBTTagString("\u00A78[[Many entries later]]\u00A70\n\nA breakthrough! In my journeys I sighted a huge snake-like monster in a decorated courtyard. Nearby, I picked up a worn down, discarded green scale.\n\nThe magic in the scale seems to have the")); - bookPages.appendTag(new NBTTagString("curse-breaking properties I need, but the magic is too dim. I may need to acquire a fresher specimen, directly from the creature.")); - - book.setTagInfo("pages", bookPages); - book.setTagInfo("author", new NBTTagString("A Forgotten Explorer")); - book.setTagInfo("title", new NBTTagString("Notes on a Pointy Tower")); - } else if (this == TFFeature.labyrinth) { - bookPages.appendTag(new NBTTagString("\u00A78[[An explorer's notebook, written on waterproof paper]]\u00A70\n\nThe mosquitoes in this swamp are vexing, but strange. The vast majority of them seem to have no natural source, nor do they seem to have a role in the local ecology. I have begun to")); - bookPages.appendTag(new NBTTagString("suspect that they are some kind of magical curse.\n\n\u00A78[[Next entry]]\u00A70\n\nNow that I have encountered a protection spell on the ruined labyrinth here, I consider my suspicions confirmed. Both the protection")); - bookPages.appendTag(new NBTTagString("spell and the mosquitoes are a curse. This curse seems to have a different source from the others I have encountered. I will have to research further...\n\n\u00A78[[Next entry]]\u00A70\n\nThe curse seems to")); - bookPages.appendTag(new NBTTagString("be of a type too powerful for one being alone to produce. Several wizards working in combination would be necessary.\n\nIf one of the wizards stopped contributing, the whole of the curse over the entire swamp would fall. Strangely, ")); - bookPages.appendTag(new NBTTagString("my divinations do not show signs of any nearby living wizards. I did see something interesting in one of the nearby pointy-roofed towers though...")); - - book.setTagInfo("pages", bookPages); - book.setTagInfo("author", new NBTTagString("A Forgotten Explorer")); - book.setTagInfo("title", new NBTTagString("Notes on a Swampy Labyrinth")); - - } else if (this == TFFeature.hydraLair) { - bookPages.appendTag(new NBTTagString("\u00A78[[An explorer's notebook, written on fireproof paper]]\u00A70\n\nFire is a trivial obstacle for a master explorer such as myself. I have traversed seas of fire, and swam through oceans of lava. The burning air here is an interesting variation,")); - bookPages.appendTag(new NBTTagString("but ultimately no hinderance.\n\nWhat does stop me though is that I have encountered another protection spell, this time surrounding a mighty creature that must be king of this fire swamp. This is not the first protection spell I have")); - bookPages.appendTag(new NBTTagString("encountered, and I am beginning to unravel the mysteries of how they work.\n\nIf this spell is like the others, it will be sustained by a powerful creature nearby. Surrounding the fire swamp are several wet swamps, and under those")); - bookPages.appendTag(new NBTTagString("swamps are labyrinths full of minotaurs. The logical choice to bind such a spell to would be some sort of powerful minotaur, different in some way from the others that surround it...")); - - book.setTagInfo("pages", bookPages); - book.setTagInfo("author", new NBTTagString("A Forgotten Explorer")); - book.setTagInfo("title", new NBTTagString("Notes on the Fire Swamp")); - - } else if (this == TFFeature.tfStronghold) { - bookPages.appendTag(new NBTTagString("\u00A78[[An explorer's notebook, written on faintly glowing paper]]\u00A70\n\nThe tendrils of darkness surrounding this area are just a manifestation of a protective spell over the entire dark forest. The spell causes blindness, which is quite vexing. I have")); - bookPages.appendTag(new NBTTagString("seen several interesting things in the area and would like to keep exploring.\n\n\u00A78[[Next entry]]\u00A70\n\nI have found ruins in the dark forest. They belong to a stronghold, of a type usually inhabited by knights. Rather than")); - bookPages.appendTag(new NBTTagString("knights though, this stronghold is full of goblins. They wear knightly armor, but their behavior is most un-knightly.\n\n\u00A78[[Next entry]]\u00A70\n\nDeep in the ruins, I have found a pedestal. The pedestal seems to be of a type that")); - bookPages.appendTag(new NBTTagString("knights would place trophies on to prove their strength.\n\nKilling a powerful creature would seem to weaken the curse on the dark forest, and placing a trophy associated with the creature on the pedestal would likely grant access into the")); - bookPages.appendTag(new NBTTagString("main part of the stronghold.\n\nThe only creature I have seen so far seen so far of sufficient power is the many-headed beast in the fire swamp. How vexing...")); - - book.setTagInfo("pages", bookPages); - book.setTagInfo("author", new NBTTagString("A Forgotten Explorer")); - book.setTagInfo("title", new NBTTagString("Notes on a Stronghold")); - - } else if (this == TFFeature.darkTower) { - bookPages.appendTag(new NBTTagString("\u00A78[[An explorer's notebook that seems to have survived an explosion]]\u00A70\n\nThis tower clearly has mechanisms that are not responding to me. Their magic almost yearns to acknowledge my touch, but it cannot. It is if the devices of the tower are being")); - bookPages.appendTag(new NBTTagString("suppressed by a powerful group of beings nearby.\n\n\u00A78[[Next entry]]\u00A70\n\nThe magic seems to emanate from deep within the strongholds nearby. It can't come from the goblins, as their magic is charming, but unfocused. There")); - bookPages.appendTag(new NBTTagString("must still be some force still active in the strongholds.\n\n\u00A78[[Next entry]]\u00A70\n\nMy analysis indicates that it comes from several sources, operating as a group. I will head back to the stronghold after I resupply...")); - - book.setTagInfo("pages", bookPages); - book.setTagInfo("author", new NBTTagString("A Forgotten Explorer")); - book.setTagInfo("title", new NBTTagString("Notes on a Wooden Tower")); - - } else if (this == TFFeature.yetiCave) { - bookPages.appendTag(new NBTTagString("\u00A78[[An explorer's notebook, covered in frost]]\u00A70\n\nThe blizzard surrounding these snowy lands is unceasing. This is no ordinary snowfall--this is a magical phenomenon. I will have to conduct experiments to find")); - bookPages.appendTag(new NBTTagString("what is capable of causing such an effect.\n\n\u00A78[[Next entry]]\u00A70\n\nAt the center of the dark forest, where the leaves turn red and the grass dies, there is a wooden tower. The tops of the tower are affixed with")); - bookPages.appendTag(new NBTTagString("structures acting as antennae. The antennae are not the source of the snowfall, but serve merely to boost the power of the curse causing it.\n\nA blizzard this intense must be caused by a powerful creature, most likely found")); - bookPages.appendTag(new NBTTagString("near the top of the dark forest tower. Stop the creature, and the blizzard will fade.")); - - book.setTagInfo("pages", bookPages); - book.setTagInfo("author", new NBTTagString("A Forgotten Explorer")); - book.setTagInfo("title", new NBTTagString("Notes on an Icy Cave")); - - } else if (this == TFFeature.iceTower) { - bookPages.appendTag(new NBTTagString("\u00A78[[An explorer's notebook, caked in ice]]\u00A70\n\nI overcame one blizzard, only to run into this terrible ice storm atop the glacier. My explorations have shown me the splendor of an ice palace, shining with the colors of the polar aurora. It")); - bookPages.appendTag(new NBTTagString("all seems protected by some sort of curse.\n\n\u00A78[[Next entry]]\u00A70\n\nI am no novice. This curse is fed by the power of a creature nearby. The cause of the curse surrounding the fire swamp was built off the power of the leader of the ")); - bookPages.appendTag(new NBTTagString("minotaurs nearby.\n\nSurrounding this glacier, there are masses of yetis. Perhaps the yetis have some sort of leader...")); - - book.setTagInfo("pages", bookPages); - book.setTagInfo("author", new NBTTagString("A Forgotten Explorer")); - book.setTagInfo("title", new NBTTagString("Notes on an Auroral Fortification")); - - } else if (this == TFFeature.trollCave) { - bookPages.appendTag(new NBTTagString("\u00A78[[An explorer's notebook, damaged by acid]]\u00A70\n\nThere seems to be no way to protect myself from the toxic rainstorm surrounding this area. In my brief excursions, I have also encountered another protection spell, similar to the")); - bookPages.appendTag(new NBTTagString("others I have witnessed. The spell must be connected to the toxic storm in some way. Further research to follow...\n\n\u00A78[[Next entry]]\u00A70\n\nSuch supreme weather magic must be the result of an unequaled weather")); - bookPages.appendTag(new NBTTagString("magician. Such a person would likely hide themselves in an extreme environment, far away.\n\nBased on my logic, I would expect to find such a person somewhere on the glacier, perhaps in some sort of fortress there...")); - - book.setTagInfo("pages", bookPages); - book.setTagInfo("author", new NBTTagString("A Forgotten Explorer")); - book.setTagInfo("title", new NBTTagString("Notes on an the Highlands")); - - } else { - bookPages.appendTag(new NBTTagString("\u00A78[[This book shows signs of having been copied many times]]\u00A70\n\nI cannot explain the field surrounding this structure, but the magic is powerful. If this curse is like the others, than the answer to unlocking it lies elsewhere. Perhaps there is ")); - bookPages.appendTag(new NBTTagString("something I have left undone, or some monster I have yet to defeat. I will have to turn back. I will return to this place later, to see if anything has changed.")); - - book.setTagInfo("pages", bookPages); - book.setTagInfo("author", new NBTTagString("A Forgotten Explorer")); - book.setTagInfo("title", new NBTTagString("Notes on the Unexplained")); - } - - - return book; - } - -} diff --git a/src/main/java/twilightforest/TFGenericPacketHandler.java b/src/main/java/twilightforest/TFGenericPacketHandler.java deleted file mode 100644 index 782af248a6..0000000000 --- a/src/main/java/twilightforest/TFGenericPacketHandler.java +++ /dev/null @@ -1,343 +0,0 @@ -package twilightforest; - -import io.netty.buffer.ByteBuf; -import io.netty.buffer.Unpooled; -import net.minecraft.client.Minecraft; -import net.minecraft.client.particle.EntityDiggingFX; -import net.minecraft.network.PacketBuffer; -import net.minecraft.world.World; -import net.minecraft.world.chunk.Chunk; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import twilightforest.client.renderer.TFWeatherRenderer; -import twilightforest.entity.EntityTFProtectionBox; -import twilightforest.world.WorldProviderTwilightForest; -import cpw.mods.fml.common.eventhandler.SubscribeEvent; -import cpw.mods.fml.common.network.FMLNetworkEvent.ClientCustomPacketEvent; -import cpw.mods.fml.common.network.internal.FMLProxyPacket; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public class TFGenericPacketHandler { - - public static final byte CHANGE_DIM_ID = 1; - public static final byte TRANSFORM_BIOME = 2; - public static final byte THROW_PLAYER = 3; - public static final byte AREA_PROTECTION = 4; - public static final byte STRUCTURE_PROTECTION = 5; - public static final byte STRUCTURE_PROTECTION_CLEAR = 6; - public static final byte ENFORCED_PROGRESSION_STATUS = 7; - public static final byte ANNIHILATE_BLOCK = 8; - - /** - * Packet! - */ - @SideOnly(Side.CLIENT) - @SubscribeEvent - public void incomingPacket(ClientCustomPacketEvent event) - { - ByteBuf buf = event.packet.payload(); - - // read first byte to see what kind of packet - int discriminatorByte = buf.readByte(); - - if (discriminatorByte == TRANSFORM_BIOME) { - processTransformBiomeData(buf); - } - if (discriminatorByte == THROW_PLAYER) { - processThrowPlayerData(buf); - } - if (discriminatorByte == AREA_PROTECTION) { - processAreaProtectionData(buf); - } - if (discriminatorByte == STRUCTURE_PROTECTION) { - processStructureProtectionData(buf); - } - if (discriminatorByte == STRUCTURE_PROTECTION_CLEAR) { - processStructureProtectionClearData(buf); - } - if (discriminatorByte == ENFORCED_PROGRESSION_STATUS) { - processEnforcedProgressionStatusData(buf); - } - if (discriminatorByte == ANNIHILATE_BLOCK) { - processAnnihilateBlock(buf); - } - } - - - @SideOnly(Side.CLIENT) - private void processTransformBiomeData(ByteBuf buf) { - // get coords - int x = buf.readInt(); - int z = buf.readInt(); - // biome? - byte biomeID = buf.readByte(); - - //FMLLog.info("Got tree of transformation effect packet for %d, %d, biomeid = %d", x, z, biomeID); - - - // change it! - // we're making the assumption here that we're only getting this packet if the player attached to this client is in the same world as the tree - // thus, we don't need to send a dimension or anything - World worldObj = Minecraft.getMinecraft().theWorld; - - Chunk chunkAt = worldObj.getChunkFromBlockCoords(x, z); - - chunkAt.getBiomeArray()[(z & 15) << 4 | (x & 15)] = biomeID; - - worldObj.markBlockRangeForRenderUpdate(x, 0, z, x, 255, z); - } - - @SideOnly(Side.CLIENT) - private void processThrowPlayerData(ByteBuf buf) { - // get vector - float motionX = buf.readFloat(); - float motionY = buf.readFloat(); - float motionZ = buf.readFloat(); - - // add it to the player - Minecraft.getMinecraft().thePlayer.addVelocity(motionX, motionY, motionZ); - } - - @SideOnly(Side.CLIENT) - private void processAreaProtectionData(ByteBuf buf) { - - int minX = buf.readInt(); - int minY = buf.readInt(); - int minZ = buf.readInt(); - int maxX = buf.readInt(); - int maxY = buf.readInt(); - int maxZ = buf.readInt(); - - int blockX = buf.readInt(); - int blockY = buf.readInt(); - int blockZ = buf.readInt(); - - // make a box entity - World worldObj = Minecraft.getMinecraft().theWorld; - EntityTFProtectionBox box = new EntityTFProtectionBox(worldObj, minX, minY, minZ, maxX, maxY, maxZ); - - worldObj.addWeatherEffect(box); - - // particles from the block? - for (int i = 0; i < 20; i++) { - - double d0 = worldObj.rand.nextGaussian() * 0.02D; - double d1 = worldObj.rand.nextGaussian() * 0.02D; - double d2 = worldObj.rand.nextGaussian() * 0.02D; - - float dx = blockX + 0.5F + worldObj.rand.nextFloat() - worldObj.rand.nextFloat(); - float dy = blockY + 0.5F + worldObj.rand.nextFloat() - worldObj.rand.nextFloat(); - float dz = blockZ + 0.5F + worldObj.rand.nextFloat() - worldObj.rand.nextFloat(); - - //worldObj.spawnParticle("mobSpell", blockX + 0.5F, blockY + 0.5F, blockZ + 0.5F, red, grn, blu); - TwilightForestMod.proxy.spawnParticle(worldObj, "protection", dx, dy, dz, d0, d1, d2); - - } - } - - /** - * Incoming structure protection box - */ - @SideOnly(Side.CLIENT) - private void processStructureProtectionData(ByteBuf buf) { - - int minX = buf.readInt(); - int minY = buf.readInt(); - int minZ = buf.readInt(); - int maxX = buf.readInt(); - int maxY = buf.readInt(); - int maxZ = buf.readInt(); - - StructureBoundingBox sbb = new StructureBoundingBox(minX, minY, minZ, maxX, maxY, maxZ); - - World worldObj = Minecraft.getMinecraft().theWorld; - - //System.out.println("Getting a new structure box " + sbb); - - // add weather box if needed - if (worldObj.provider instanceof WorldProviderTwilightForest) { - TFWeatherRenderer weatherRenderer = (TFWeatherRenderer) worldObj.provider.getWeatherRenderer(); - - weatherRenderer.setProtectedBox(sbb); - } - - } - - /** - * Incoming structure all clear - */ - @SideOnly(Side.CLIENT) - private void processStructureProtectionClearData(ByteBuf buf) { - - World worldObj = Minecraft.getMinecraft().theWorld; - - //System.out.println("Getting structure all clear"); - - // add weather box if needed - if (worldObj.provider instanceof WorldProviderTwilightForest) { - TFWeatherRenderer weatherRenderer = (TFWeatherRenderer) worldObj.provider.getWeatherRenderer(); - - weatherRenderer.setProtectedBox(null); - } - - } - - @SideOnly(Side.CLIENT) - private void processEnforcedProgressionStatusData(ByteBuf buf) { - - World worldObj = Minecraft.getMinecraft().theWorld; - - boolean isEnforced = buf.readBoolean(); - - worldObj.getGameRules().setOrCreateGameRule(TwilightForestMod.ENFORCED_PROGRESSION_RULE, Boolean.valueOf(isEnforced).toString()); - } - - - @SideOnly(Side.CLIENT) - private void processAnnihilateBlock(ByteBuf buf) { - int blockX = buf.readInt(); - int blockY = buf.readInt(); - int blockZ = buf.readInt(); - - World worldObj = Minecraft.getMinecraft().theWorld; - - TwilightForestMod.proxy.doBlockAnnihilateEffect(worldObj, blockX, blockY, blockZ); - - } - - - - - - - /** - * Make a FMLProxyPacket that contains the data we need to change a biome in the world. - */ - public static FMLProxyPacket makeBiomeChangePacket(int x, int z, byte biomeID) { - - PacketBuffer payload = new PacketBuffer(Unpooled.buffer()); - - payload.writeByte(TRANSFORM_BIOME); // discriminator byte - payload.writeInt(x); - payload.writeInt(z); - payload.writeByte(biomeID); - - FMLProxyPacket pkt = new FMLProxyPacket(payload, TwilightForestMod.ID); - - return pkt; - } - - - /** - * Make a FMLProxyPacket that contains the data we need to add a velocity to the player - */ - public static FMLProxyPacket makeThrowPlayerPacket(float motionX, float motionY, float motionZ) { - - PacketBuffer payload = new PacketBuffer(Unpooled.buffer()); - - payload.writeByte(THROW_PLAYER); // discriminator byte - payload.writeFloat(motionX); - payload.writeFloat(motionY); - payload.writeFloat(motionZ); - - FMLProxyPacket pkt = new FMLProxyPacket(payload, TwilightForestMod.ID); - - return pkt; - } - - /** - * Make a FMLProxyPacket that contains the data we need to display area protection data - */ - public static FMLProxyPacket makeAreaProtectionPacket(StructureBoundingBox sbb, int blockX, int blockY, int blockZ) { - - PacketBuffer payload = new PacketBuffer(Unpooled.buffer()); - - payload.writeByte(AREA_PROTECTION); // discriminator byte - - payload.writeInt(sbb.minX); - payload.writeInt(sbb.minY); - payload.writeInt(sbb.minZ); - payload.writeInt(sbb.maxX); - payload.writeInt(sbb.maxY); - payload.writeInt(sbb.maxZ); - - payload.writeInt(blockX); - payload.writeInt(blockY); - payload.writeInt(blockZ); - - FMLProxyPacket pkt = new FMLProxyPacket(payload, TwilightForestMod.ID); - - return pkt; - } - - /** - * Make a FMLProxyPacket that contains the data we need to display structure protection data - */ - public static FMLProxyPacket makeStructureProtectionPacket(StructureBoundingBox sbb) { - - PacketBuffer payload = new PacketBuffer(Unpooled.buffer()); - - payload.writeByte(STRUCTURE_PROTECTION); // discriminator byte - - payload.writeInt(sbb.minX); - payload.writeInt(sbb.minY); - payload.writeInt(sbb.minZ); - payload.writeInt(sbb.maxX); - payload.writeInt(sbb.maxY); - payload.writeInt(sbb.maxZ); - - FMLProxyPacket pkt = new FMLProxyPacket(payload, TwilightForestMod.ID); - - return pkt; - } - - /** - * Make a FMLProxyPacket that clears structure protection data on the client - */ - public static FMLProxyPacket makeStructureProtectionClearPacket() { - - PacketBuffer payload = new PacketBuffer(Unpooled.buffer()); - - payload.writeByte(STRUCTURE_PROTECTION_CLEAR); // discriminator byte - - FMLProxyPacket pkt = new FMLProxyPacket(payload, TwilightForestMod.ID); - - return pkt; - } - - /** - * Make a FMLProxyPacket that sets progression enforcement on the client - */ - public static FMLProxyPacket makeEnforcedProgressionStatusPacket(boolean isEnforced) { - - PacketBuffer payload = new PacketBuffer(Unpooled.buffer()); - - payload.writeByte(ENFORCED_PROGRESSION_STATUS); // discriminator byte - - payload.writeBoolean(isEnforced); - - FMLProxyPacket pkt = new FMLProxyPacket(payload, TwilightForestMod.ID); - - return pkt; - } - - - - /** - * Make a FMLProxyPacket that contains a block to display annihilation effects for - */ - public static FMLProxyPacket makeAnnihilateBlockPacket(int blockX, int blockY, int blockZ) { - - PacketBuffer payload = new PacketBuffer(Unpooled.buffer()); - - payload.writeByte(ANNIHILATE_BLOCK); // discriminator byte - - payload.writeInt(blockX); - payload.writeInt(blockY); - payload.writeInt(blockZ); - - FMLProxyPacket pkt = new FMLProxyPacket(payload, TwilightForestMod.ID); - - return pkt; - } -} diff --git a/src/main/java/twilightforest/TFMagicMapData.java b/src/main/java/twilightforest/TFMagicMapData.java index 276e248ebd..8edd6d05f6 100644 --- a/src/main/java/twilightforest/TFMagicMapData.java +++ b/src/main/java/twilightforest/TFMagicMapData.java @@ -1,171 +1,231 @@ package twilightforest; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.math.Axis; +import org.joml.Matrix4f; +import org.joml.Vector3f; +import it.unimi.dsi.fastutil.ints.Int2ObjectArrayMap; +import it.unimi.dsi.fastutil.objects.Object2IntArrayMap; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.game.ClientboundMapItemDataPacket; +import net.minecraft.resources.ResourceKey; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.saveddata.maps.MapDecoration; +import net.minecraft.world.level.saveddata.maps.MapItemSavedData; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.network.NetworkDirection; +import twilightforest.init.TFLandmark; + +import org.jetbrains.annotations.Nullable; +import twilightforest.network.MagicMapPacket; +import twilightforest.network.TFPacketHandler; +import twilightforest.util.LegacyLandmarkPlacements; + import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; import java.util.List; +import java.util.Map; +import java.util.Set; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.world.World; -import net.minecraft.world.storage.MapData; -import twilightforest.world.TFWorldChunkManager; - - -public class TFMagicMapData extends MapData -{ - - private static final int FEATURE_DATA_BYTE = 18; - public List featuresVisibleOnMap = new ArrayList(); - - public TFMagicMapData(String par1Str) - { - super(par1Str); - } - - /** - * reads in data from the NBTTagCompound into this MapDataBase - */ - @Override - public void readFromNBT(NBTTagCompound par1NBTTagCompound) { - super.readFromNBT(par1NBTTagCompound); - - byte[] featureStorage = par1NBTTagCompound.getByteArray("features"); +public class TFMagicMapData extends MapItemSavedData { + private static final Map CLIENT_DATA = new HashMap<>(); + + public final Set tfDecorations = new HashSet<>(); + + public TFMagicMapData(int x, int z, byte scale, boolean trackpos, boolean unlimited, boolean locked, ResourceKey dim) { + super(x, z, scale, trackpos, unlimited, locked, dim); + } + + public static TFMagicMapData load(CompoundTag nbt) { + MapItemSavedData data = MapItemSavedData.load(nbt); + final boolean trackingPosition = !nbt.contains("trackingPosition", 1) || nbt.getBoolean("trackingPosition"); + final boolean unlimitedTracking = nbt.getBoolean("unlimitedTracking"); + final boolean locked = nbt.getBoolean("locked"); + TFMagicMapData tfdata = new TFMagicMapData(data.centerX, data.centerZ, data.scale, trackingPosition, unlimitedTracking, locked, data.dimension); + + tfdata.colors = data.colors; + tfdata.bannerMarkers.putAll(data.bannerMarkers); + tfdata.decorations.putAll(data.decorations); + tfdata.frameMarkers.putAll(data.frameMarkers); + tfdata.trackedDecorationCount = data.trackedDecorationCount; + + byte[] featureStorage = nbt.getByteArray("features"); if (featureStorage.length > 0) { - this.updateMPMapData(featureStorage); + tfdata.deserializeFeatures(featureStorage); } -// else { -// System.out.println("Can't find feature storage for " + this.mapName); -// } + + return tfdata; } - /** - * write data to NBTTagCompound from this MapDataBase, similar to Entities and TileEntities - */ @Override - public void writeToNBT(NBTTagCompound par1NBTTagCompound) { - super.writeToNBT(par1NBTTagCompound); - - if (this.featuresVisibleOnMap.size() > 0) { - byte[] featureStorage = makeFeatureStorageArray(); - par1NBTTagCompound.setByteArray("features", featureStorage); + public CompoundTag save(CompoundTag cmp) { + cmp = super.save(cmp); + + if (this.tfDecorations.size() > 0) { + cmp.putByteArray("features", serializeFeatures()); } + return cmp; } - /** - * Adds a twilight forest feature to the map. - */ - public void addFeatureToMap(TFFeature feature, int x, int z) { - byte relativeX = (byte) ((x - this.xCenter) >> this.scale); - byte relativeZ = (byte) ((z - this.zCenter) >> this.scale); - byte rangeX = 64; - byte rangeY = 64; - - if (relativeX >= (-rangeX) && relativeZ >= (-rangeY) && relativeX <= rangeX && relativeZ <= rangeY) - { - byte markerIcon = (byte) feature.featureID; - byte mapX = (byte)(relativeX << 1); - byte mapZ = (byte)(relativeZ << 1); - byte mapRotation = 8; - - boolean featureFound = false; - - // look for a feature already at those coordinates - for (MapCoord existingCoord : featuresVisibleOnMap) { - if (existingCoord.centerX == mapX && existingCoord.centerZ == mapZ) { - featureFound = true; - } - } - - // if we didn't find it, add it - if (!featureFound) - { - this.featuresVisibleOnMap.add(new MapCoord(markerIcon, mapX, mapZ, mapRotation)); - } - } - } - - /** - * Checks existing features against the feature cache and removes/changes wrong ones. Does not add features. - */ - public void checkExistingFeatures(World world) - { - ArrayList toRemove = null; - - for (MapCoord coord : featuresVisibleOnMap) - { - - //System.out.printf("Existing feature at %d, %d.\n", coord.centerX, coord.centerZ); - - int worldX = (coord.centerX << this.scale - 1) + this.xCenter; - int worldZ = (coord.centerZ << this.scale - 1) + this.zCenter; - - if (world != null && world.getWorldChunkManager() instanceof TFWorldChunkManager) - { - TFWorldChunkManager tfManager = (TFWorldChunkManager) world.getWorldChunkManager(); - coord.iconSize = (byte) tfManager.getFeatureID(worldX, worldZ, world); - - if (coord.iconSize == 0) - { - if (toRemove == null) - { - toRemove = new ArrayList(); - } - toRemove.add(coord); - - //System.out.println("Removing bad mapcoord " + coord + " from " + worldX + ", " + worldZ); - } - } - } - - if (toRemove != null) - { - featuresVisibleOnMap.removeAll(toRemove); - } - } - - /** - * Updates the client's map with information from other players in MP - */ - @Override - public void updateMPMapData(byte[] par1ArrayOfByte) - { - if (par1ArrayOfByte[0] == FEATURE_DATA_BYTE) - { - // this is feature data, we can handle that directly - this.featuresVisibleOnMap.clear(); - - for (int i = 0; i < (par1ArrayOfByte.length - 1) / 3; ++i) - { - byte markerIcon = par1ArrayOfByte[i * 3 + 1]; - byte mapX = par1ArrayOfByte[i * 3 + 2]; - byte mapZ = par1ArrayOfByte[i * 3 + 3]; - byte mapRotation = 8; - this.featuresVisibleOnMap.add(new MapCoord(markerIcon, mapX, mapZ, mapRotation)); - } - } - else - { - super.updateMPMapData(par1ArrayOfByte); - } - } - - /** - * This makes a byte array that we store our feature data in to send with map update packets - */ - public byte[] makeFeatureStorageArray() - { - byte[] storage = new byte[this.featuresVisibleOnMap.size() * 3 + 1]; - storage[0] = FEATURE_DATA_BYTE; - - for (int i = 0; i < featuresVisibleOnMap.size(); ++i) - { - MapCoord featureCoord = this.featuresVisibleOnMap.get(i); - storage[i * 3 + 1] = (featureCoord.iconSize); - storage[i * 3 + 2] = featureCoord.centerX; - storage[i * 3 + 3] = featureCoord.centerZ; - } - - return storage; - } + * Checks existing features against the feature cache changes wrong ones + */ + public void checkExistingFeatures(Level world) { + List toRemove = new ArrayList<>(); + List toAdd = new ArrayList<>(); + + for (TFMapDecoration coord : tfDecorations) { + int worldX = (coord.getX() << this.scale - 1) + this.centerX; + int worldZ = (coord.getY() << this.scale - 1) + this.centerZ; + + int trueId = TFMapDecoration.ICONS_FLIPPED.getInt(LegacyLandmarkPlacements.pickLandmarkAtBlock(worldX, worldZ, (ServerLevel) world)); + if (coord.featureId != trueId) { + toRemove.add(coord); + toAdd.add(new TFMapDecoration(trueId, coord.getX(), coord.getY(), coord.getRot())); + } + } + + toRemove.forEach(tfDecorations::remove); + tfDecorations.addAll(toAdd); + } + + public void deserializeFeatures(byte[] arr) { + this.tfDecorations.clear(); + + for (int i = 0; i < arr.length / 3; ++i) { + byte featureId = arr[i * 3]; + byte mapX = arr[i * 3 + 1]; + byte mapZ = arr[i * 3 + 2]; + byte mapRotation = 8; + this.tfDecorations.add(new TFMapDecoration(featureId, mapX, mapZ, mapRotation)); + } + } + + public byte[] serializeFeatures() { + byte[] storage = new byte[this.tfDecorations.size() * 3]; + + int i = 0; + for (TFMapDecoration featureCoord : tfDecorations) { + storage[i * 3] = (byte) featureCoord.featureId; + storage[i * 3 + 1] = featureCoord.getX(); + storage[i * 3 + 2] = featureCoord.getY(); + i++; + } + + return storage; + } + + // [VanillaCopy] Adapted from World.getMapData + @Nullable + public static TFMagicMapData getMagicMapData(Level world, String name) { + if (world.isClientSide) return CLIENT_DATA.get(name); + else return ((ServerLevel)world).getServer().overworld().getDataStorage().get(TFMagicMapData::load, name); + } + + // [VanillaCopy] Adapted from World.registerMapData + public static void registerMagicMapData(Level world, TFMagicMapData data, String id) { + if (world.isClientSide) CLIENT_DATA.put(id, data); + else ((ServerLevel)world).getServer().overworld().getDataStorage().set(id, data); + } + + @Nullable + @Override + public Packet getUpdatePacket(int mapId, Player player) { + Packet packet = super.getUpdatePacket(mapId, player); + return packet instanceof ClientboundMapItemDataPacket mapItemDataPacket ? TFPacketHandler.CHANNEL.toVanillaPacket(new MagicMapPacket(this, mapItemDataPacket), NetworkDirection.PLAY_TO_CLIENT) : packet; + } + + public static class TFMapDecoration extends MapDecoration { + + private static final Int2ObjectArrayMap ICONS = new Int2ObjectArrayMap<>(){{ + defaultReturnValue(TFLandmark.NOTHING); + put(0, TFLandmark.NOTHING); + put(1, TFLandmark.SMALL_HILL); + put(2, TFLandmark.MEDIUM_HILL); + put(3, TFLandmark.LARGE_HILL); + put(4, TFLandmark.HEDGE_MAZE); + put(5, TFLandmark.NAGA_COURTYARD); + put(6, TFLandmark.LICH_TOWER); + put(7, TFLandmark.ICE_TOWER); + put(9, TFLandmark.QUEST_GROVE); + put(12, TFLandmark.HYDRA_LAIR); + put(13, TFLandmark.LABYRINTH); + put(14, TFLandmark.DARK_TOWER); + put(15, TFLandmark.KNIGHT_STRONGHOLD); + put(17, TFLandmark.YETI_CAVE); + put(18, TFLandmark.TROLL_CAVE); + put(19, TFLandmark.FINAL_CASTLE); + }}; + private static final Object2IntArrayMap ICONS_FLIPPED = new Object2IntArrayMap<>(){{ + ICONS.forEach((k, v) -> put(v, k.intValue())); + }}; + + @OnlyIn(Dist.CLIENT) + public static class RenderContext { + private static final RenderType MAP_ICONS = RenderType.text(TwilightForestMod.prefix("textures/gui/mapicons.png")); + public static PoseStack stack; + public static MultiBufferSource buffer; + public static int light; + } + + final int featureId; + public TFMapDecoration(TFLandmark featureId, byte xIn, byte yIn, byte rotationIn) { + this(ICONS_FLIPPED.getInt(featureId), xIn, yIn, rotationIn); + } + + public TFMapDecoration(int featureId, byte xIn, byte yIn, byte rotationIn) { + super(Type.TARGET_X, xIn, yIn, rotationIn, Component.translatable("map.magic.text")); + this.featureId = featureId; + } + + @Override + @OnlyIn(Dist.CLIENT) + public boolean render(int idx) { + // TODO: Forge needs to pass in the ms and buffers, but for now this works + if (ICONS.get(featureId).isStructureEnabled) { + RenderContext.stack.pushPose(); + RenderContext.stack.translate(0.0F + getX() / 2.0F + 64.0F, 0.0F + getY() / 2.0F + 64.0F, -0.02F); + RenderContext.stack.mulPose(Axis.ZP.rotationDegrees(getRot() * 360 / 16.0F)); + RenderContext.stack.scale(4.0F, 4.0F, 3.0F); + RenderContext.stack.translate(-0.125D, 0.125D, 0.0D); + float f1 = featureId % 8 / 8.0F; + float f2 = featureId / 8 / 8.0F; + float f3 = (featureId % 8 + 1) / 8.0F; + float f4 = (featureId / 8 + 1) / 8.0F; + Matrix4f matrix4f1 = RenderContext.stack.last().pose(); + VertexConsumer ivertexbuilder1 = RenderContext.buffer.getBuffer(RenderContext.MAP_ICONS); + ivertexbuilder1.vertex(matrix4f1, -1.0F, 1.0F, idx * -0.001F).color(255, 255, 255, 255).uv(f1, f2).uv2(RenderContext.light).endVertex(); + ivertexbuilder1.vertex(matrix4f1, 1.0F, 1.0F, idx * -0.001F).color(255, 255, 255, 255).uv(f3, f2).uv2(RenderContext.light).endVertex(); + ivertexbuilder1.vertex(matrix4f1, 1.0F, -1.0F, idx * -0.001F).color(255, 255, 255, 255).uv(f3, f4).uv2(RenderContext.light).endVertex(); + ivertexbuilder1.vertex(matrix4f1, -1.0F, -1.0F, idx * -0.001F).color(255, 255, 255, 255).uv(f1, f4).uv2(RenderContext.light).endVertex(); + RenderContext.stack.popPose(); + } + return true; + } + + @Override + public boolean equals(Object o) { + if (super.equals(o) && o instanceof TFMapDecoration tfMapDecoration) { + return this.featureId == tfMapDecoration.featureId; + } + + return false; + } + + @Override + public int hashCode() { + return super.hashCode() * 31 + featureId; + } + } } diff --git a/src/main/java/twilightforest/TFMapPacketHandler.java b/src/main/java/twilightforest/TFMapPacketHandler.java deleted file mode 100644 index d4eadff167..0000000000 --- a/src/main/java/twilightforest/TFMapPacketHandler.java +++ /dev/null @@ -1,197 +0,0 @@ -package twilightforest; - - -import io.netty.buffer.ByteBuf; -import io.netty.buffer.Unpooled; -import io.netty.channel.ChannelHandler.Sharable; - -import java.io.IOException; - -import net.minecraft.client.Minecraft; -import net.minecraft.network.Packet; -import net.minecraft.network.PacketBuffer; -import net.minecraft.network.play.server.S34PacketMaps; -import twilightforest.item.ItemTFMagicMap; -import twilightforest.item.ItemTFMazeMap; -import cpw.mods.fml.common.eventhandler.SubscribeEvent; -import cpw.mods.fml.common.network.FMLNetworkEvent.ClientCustomPacketEvent; -import cpw.mods.fml.common.network.internal.FMLProxyPacket; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -@Sharable -public class TFMapPacketHandler -{ - - - /** - * Extract a Packet131MapData packet from a Packet250CustomPayload. This is a little silly, huh? - */ - public S34PacketMaps readMapPacket(ByteBuf byteBuf) { - - S34PacketMaps mapPacket = new S34PacketMaps(); - try { - mapPacket.readPacketData(new PacketBuffer(byteBuf)); - } catch (IOException e) { - e.printStackTrace(); - } - - return mapPacket; - } - - /** - * Make a Packet250CustomPayload that wraps around a MapData packet, and sends on a specific channel - */ - public static Packet makeMagicMapPacket(String mapChannel, short mapID, byte[] datas) { - - S34PacketMaps mapPacket = new S34PacketMaps(mapID, datas); - PacketBuffer payload = new PacketBuffer(Unpooled.buffer()); - - try { - mapPacket.writePacketData(payload); - } catch (IOException e) { - e.printStackTrace(); - } - -// Packet pkt = new S3FPacketCustomPayload(mapChannel, payload); - - FMLProxyPacket pkt = new FMLProxyPacket(payload, mapChannel); - - return pkt; - } - - - /** - * Packet! - */ - @SideOnly(Side.CLIENT) - @SubscribeEvent - public void incomingPacket(ClientCustomPacketEvent event) - { -// System.out.println("Incoming packet detected!"); - - if (event.packet.channel().equals(ItemTFMagicMap.STR_ID)) - { - //System.out.println("Incoming magic map packet detected!"); - S34PacketMaps mapPacket = readMapPacket(event.packet.payload()); - ItemTFMagicMap.getMPMapData(mapPacket.func_149188_c(), TwilightForestMod.proxy.getClientWorld()).updateMPMapData(mapPacket.func_149187_d()); - } - else if (event.packet.channel().equals(ItemTFMazeMap.STR_ID)) - { - //System.out.println("Incoming maze map packet detected!"); - - S34PacketMaps mapPacket = readMapPacket(event.packet.payload()); - TFMazeMapData data = ItemTFMazeMap.getMPMapData(mapPacket.func_149188_c(), TwilightForestMod.proxy.getClientWorld()); - data.updateMPMapData(mapPacket.func_149187_d()); - Minecraft.getMinecraft().entityRenderer.getMapItemRenderer().func_148246_a(data); - } - } - -// @Override -// public void onPacketData(INetworkManager manager, Packet250CustomPayload packet, EntityPlayer player) { -// // read magic map packets -// if (packet.channel.equals("tfmagicmap")) { -// Packet131MapData mapPacket = readMapPacket(packet.data); -// ItemTFMagicMap.getMPMapData(mapPacket.uniqueID, TwilightForestMod.proxy.getClientWorld()).updateMPMapData(mapPacket.itemData); -// } -// -// // read maze map packets -// if (packet.channel.equals("tfmazemap")) { -// Packet131MapData mapPacket = readMapPacket(packet.data); -// ItemTFMazeMap.getMPMapData(mapPacket.uniqueID, TwilightForestMod.proxy.getClientWorld()).updateMPMapData(mapPacket.itemData); -// } -// -// // these packets are probably sent when we first connect -// if (packet.channel.equals(TwilightForestMod.ID) && packet.data[0] == CHANGE_DIM_ID) -// { -// ByteBuffer bBuffer = ByteBuffer.wrap(packet.data); -// -// // discard first byte; -// bBuffer.get(); -// -// // get dimension ID -// int dim = bBuffer.getInt(); -// //System.out.println("The connection packet said that the dim = " + dim); -// TwilightForestMod.setDimensionID(dim); -// } -// -// // these packets are sent by the tree of transformation effect -// if (packet.channel.equals(TwilightForestMod.ID) && packet.data[0] == TRANSFORM_BIOME) -// { -// ByteBuffer bBuffer = ByteBuffer.wrap(packet.data); -// -// // discard first byte; -// bBuffer.get(); -// -// // get coords -// int x = bBuffer.getInt(); -// int z = bBuffer.getInt(); -// // biome? -// byte biomeID = bBuffer.get(); -// -// // change it -// //FMLLog.info("Got tree of transformation effect packet for %d, %d, biomeid = %d", x, z, biomeID); -// -// EntityPlayer playerEntity = (EntityPlayer)player; -// -// Chunk chunkAt = playerEntity.worldObj.getChunkFromBlockCoords(x, z); -// -// chunkAt.getBiomeArray()[(z & 15) << 4 | (x & 15)] = biomeID; -// -// playerEntity.worldObj.markBlockRangeForRenderUpdate(x, 0, z, x, 255, z); -// -// -// } -// -// -// // packets are fun! -// // what other packets do we need?! :D -// } - - -// /** -// * Called when a player logs into the server -// * SERVER SIDE -// */ -// @Override -// public void playerLoggedIn(Player player, NetHandler netHandler, INetworkManager manager) -// { -// } -// -// @Override -// public String connectionReceived(NetLoginHandler netHandler, INetworkManager manager) -// { -// //System.out.println("A player is logging in to the server. We should send them which tf dimension we are using"); -// -// ByteBuffer bBuffer = ByteBuffer.allocate(5); -// bBuffer.put(CHANGE_DIM_ID); -// bBuffer.putInt(TwilightForestMod.dimensionID); -// -// Packet250CustomPayload packet = new Packet250CustomPayload(TwilightForestMod.ID, bBuffer.array()); -// -// manager.addToSendQueue(packet); -// -// return null; -// } -// -// @Override -// public void connectionOpened(NetHandler netClientHandler, String server, int port, INetworkManager manager) { -// ; -// } -// -// @Override -// public void connectionOpened(NetHandler netClientHandler, MinecraftServer server, INetworkManager manager) { -// ; -// } -// -// @Override -// public void connectionClosed(INetworkManager manager) { -// ; -// } -// -// @Override -// public void clientLoggedIn(NetHandler clientHandler, INetworkManager manager, Packet1Login login) { -// ; -// } - -} diff --git a/src/main/java/twilightforest/TFMazeMapData.java b/src/main/java/twilightforest/TFMazeMapData.java index d501b3fc76..820ec5c579 100644 --- a/src/main/java/twilightforest/TFMazeMapData.java +++ b/src/main/java/twilightforest/TFMazeMapData.java @@ -1,39 +1,89 @@ package twilightforest; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.world.storage.MapData; +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.game.ClientboundMapItemDataPacket; +import net.minecraft.resources.ResourceKey; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.saveddata.maps.MapItemSavedData; +import net.minecraftforge.network.NetworkDirection; +import org.jetbrains.annotations.Nullable; +import twilightforest.init.TFLandmark; +import twilightforest.network.MazeMapPacket; +import twilightforest.network.TFPacketHandler; +import twilightforest.util.LegacyLandmarkPlacements; +import twilightforest.world.registration.TFGenerationSettings; +import java.util.HashMap; +import java.util.Map; -public class TFMazeMapData extends MapData -{ - - public int yCenter; +public class TFMazeMapData extends MapItemSavedData { + private static final Map CLIENT_DATA = new HashMap<>(); + public int yCenter; - public TFMazeMapData(String par1Str) - { - super(par1Str); - } + public TFMazeMapData(int x, int z, byte scale, boolean trackpos, boolean unlimited, boolean locked, ResourceKey dim) { + super(x, z, scale, trackpos, unlimited, locked, dim); + } - /** - * reads in data from the NBTTagCompound into this MapDataBase - */ - @Override - public void readFromNBT(NBTTagCompound par1NBTTagCompound) { - super.readFromNBT(par1NBTTagCompound); - - this.yCenter = par1NBTTagCompound.getInteger("yCenter"); + public static TFMazeMapData load(CompoundTag nbt) { + MapItemSavedData data = MapItemSavedData.load(nbt); + final boolean trackingPosition = !nbt.contains("trackingPosition", 1) || nbt.getBoolean("trackingPosition"); + final boolean unlimitedTracking = nbt.getBoolean("unlimitedTracking"); + final boolean locked = nbt.getBoolean("locked"); + TFMazeMapData tfdata = new TFMazeMapData(data.centerX, data.centerZ, data.scale, trackingPosition, unlimitedTracking, locked, data.dimension); + + tfdata.colors = data.colors; + tfdata.bannerMarkers.putAll(data.bannerMarkers); + tfdata.decorations.putAll(data.decorations); + tfdata.frameMarkers.putAll(data.frameMarkers); + tfdata.trackedDecorationCount = data.trackedDecorationCount; + + tfdata.yCenter = nbt.getInt("yCenter"); + + return tfdata; } - /** - * write data to NBTTagCompound from this MapDataBase, similar to Entities and TileEntities - */ @Override - public void writeToNBT(NBTTagCompound par1NBTTagCompound) { - super.writeToNBT(par1NBTTagCompound); - - par1NBTTagCompound.setInteger("yCenter", this.yCenter); + public CompoundTag save(CompoundTag nbt) { + CompoundTag ret = super.save(nbt); + ret.putInt("yCenter", this.yCenter); + return ret; + } + + public void calculateMapCenter(Level world, int x, int y, int z) { + this.yCenter = y; - } + // when we are in a labyrinth, snap to the LABYRINTH + if (world instanceof ServerLevel && TFGenerationSettings.usesTwilightChunkGenerator((ServerLevel) world)) { + if (LegacyLandmarkPlacements.getFeatureForRegion(x >> 4, z >> 4, (ServerLevel) world) == TFLandmark.LABYRINTH) { + BlockPos mc = LegacyLandmarkPlacements.getNearestCenterXZ(x >> 4, z >> 4); + this.centerX = mc.getX(); + this.centerZ = mc.getZ(); + } + } + } + + // [VanillaCopy] Adapted from World.getMapData + @Nullable + public static TFMazeMapData getMazeMapData(Level world, String name) { + if (world.isClientSide) return CLIENT_DATA.get(name); + else return ((ServerLevel)world).getServer().overworld().getDataStorage().get(TFMazeMapData::load, name); + } + // [VanillaCopy] Adapted from World.registerMapData + public static void registerMazeMapData(Level world, TFMazeMapData data, String id) { + if (world.isClientSide) CLIENT_DATA.put(id, data); + else ((ServerLevel) world).getServer().overworld().getDataStorage().set(id, data); + } + + @Nullable + @Override + public Packet getUpdatePacket(int mapId, Player player) { + Packet packet = super.getUpdatePacket(mapId, player); + return packet instanceof ClientboundMapItemDataPacket mapItemDataPacket ? TFPacketHandler.CHANNEL.toVanillaPacket(new MazeMapPacket(mapItemDataPacket), NetworkDirection.PLAY_TO_CLIENT) : packet; + } } diff --git a/src/main/java/twilightforest/TFTeleporter.java b/src/main/java/twilightforest/TFTeleporter.java deleted file mode 100644 index 41f7ca77ed..0000000000 --- a/src/main/java/twilightforest/TFTeleporter.java +++ /dev/null @@ -1,409 +0,0 @@ -package twilightforest; - -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.entity.Entity; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.init.Blocks; -import net.minecraft.util.ChunkCoordinates; -import net.minecraft.util.MathHelper; -import net.minecraft.world.Teleporter; -import net.minecraft.world.World; -import net.minecraft.world.WorldServer; -import net.minecraft.world.biome.BiomeGenBase; -import twilightforest.biomes.TFBiomeBase; -import twilightforest.block.TFBlocks; -import twilightforest.world.TFWorld; -import cpw.mods.fml.common.FMLLog; - - -public class TFTeleporter extends Teleporter -{ - protected WorldServer myWorld; - protected Random rand; - - public TFTeleporter(WorldServer par1WorldServer) { - super(par1WorldServer); - myWorld = par1WorldServer; - if (this.rand == null) - { - this.rand = new Random(); - } - - } - - /** - * Place an entity in a nearby portal, creating one if necessary. - */ - public void placeInPortal(Entity par1Entity, double x, double y, double z, float facing) - { - if (!this.placeInExistingPortal(par1Entity, x, y, z, facing)) - { - // if we're in enforced progression mode, check the biomes for safety - if (par1Entity.worldObj.getGameRules().getGameRuleBooleanValue(TwilightForestMod.ENFORCED_PROGRESSION_RULE)) { - int px = MathHelper.floor_double(par1Entity.posX); - int pz = MathHelper.floor_double(par1Entity.posZ); - if (!isSafeBiomeAt(px, pz, par1Entity)) { - System.out.println("[TwilightForest] Portal destination looks unsafe, rerouting!"); - - ChunkCoordinates safeCoords = findSafeCoords(200, px, pz, par1Entity); - - if (safeCoords != null) { - par1Entity.setLocationAndAngles(safeCoords.posX, par1Entity.posY, safeCoords.posZ, 90.0F, 0.0F); - x = safeCoords.posX; - z = safeCoords.posZ; - - System.out.println("[TwilightForest] Safely rerouted!"); - } else { - System.out.println("[TwilightForest] Did not find a safe spot at first try, trying again with longer range."); - safeCoords = findSafeCoords(400, px, pz, par1Entity); - if (safeCoords != null) { - par1Entity.setLocationAndAngles(safeCoords.posX, par1Entity.posY, safeCoords.posZ, 90.0F, 0.0F); - x = safeCoords.posX; - z = safeCoords.posZ; - - System.out.println("[TwilightForest] Safely rerouted to long range portal. Return trip not guaranteed."); - } else { - System.out.println("[TwilightForest] Did not find a safe spot."); - } - } - } - - } - - - this.makePortal(par1Entity); - this.placeInExistingPortal(par1Entity, x, y, z, facing); - } - } - - /** - * Find some safe coords within range of the destination coords, or return null. - * - * This could sure be a more methodic algorithm - */ - private ChunkCoordinates findSafeCoords(int range, int x, int z, Entity par1Entity) { - for (int i = 0; i < 25; i++) { - int dx = x + (rand.nextInt(range) - rand.nextInt(range)); - int dz = z + (rand.nextInt(range) - rand.nextInt(range)); - if (isSafeBiomeAt(dx, dz, par1Entity)) { - return new ChunkCoordinates(dx, 100, dz); - } - } - return null; - } - - /** - * Check if the destination is safe - */ - boolean isSafeBiomeAt(int x, int z, Entity par1Entity) { - BiomeGenBase biomeAt = myWorld.getBiomeGenForCoords(x, z); - - if (biomeAt instanceof TFBiomeBase && par1Entity instanceof EntityPlayerMP) { - TFBiomeBase tfBiome = (TFBiomeBase)biomeAt; - EntityPlayerMP player = (EntityPlayerMP)par1Entity; - - return tfBiome.doesPlayerHaveRequiredAchievement(player); - - } else { - // I guess it's safe, or maybe I just have no way to be sure! - return true; - } - } - - - @Override - public boolean placeInExistingPortal(Entity entity, double par3, double par5, double par7, float par9) { - - int c = 200; - double d = -1D; - int i = 0; - int j = 0; - int k = 0; - int l = MathHelper.floor_double(entity.posX); - int i1 = MathHelper.floor_double(entity.posZ); - for(int j1 = l - c; j1 <= l + c; j1++) - { - double d1 = (j1 + 0.5D) - entity.posX; - for(int j2 = i1 - c; j2 <= i1 + c; j2++) - { - double d3 = (j2 + 0.5D) - entity.posZ; - for (int k2 = TFWorld.MAXHEIGHT - 1; k2 >= 0; k2--) - { - if(!isBlockPortal(myWorld, j1, k2, j2)) - { - continue; - } - for(; isBlockPortal(myWorld, j1, k2 - 1, j2); k2--) { } - double d5 = (k2 + 0.5D) - entity.posY; - double d7 = d1 * d1 + d5 * d5 + d3 * d3; - if(d < 0.0D || d7 < d) - { - d = d7; - i = j1; - j = k2; - k = j2; - } - } - - } - - } - - if(d >= 0.0D) - { - int k1 = i; - int l1 = j; - int i2 = k; - double portalX = k1 + 0.5D; - double portalY = l1 + 0.5D; - double portalZ = i2 + 0.5D; - if(isBlockPortal(myWorld, k1 - 1, l1, i2)) - { - portalX -= 0.5D; - } - if(isBlockPortal(myWorld, k1 + 1, l1, i2)) - { - portalX += 0.5D; - } - if(isBlockPortal(myWorld, k1, l1, i2 - 1)) - { - portalZ -= 0.5D; - } - if(isBlockPortal(myWorld, k1, l1, i2 + 1)) - { - portalZ += 0.5D; - } - int xOffset = 0; - int zOffset = 0; - while(xOffset == zOffset && xOffset == 0) - { - xOffset = rand.nextInt(3) - rand.nextInt(3); - zOffset = rand.nextInt(3) - rand.nextInt(3); - } - entity.setLocationAndAngles(portalX + xOffset, portalY + 1, portalZ + zOffset, entity.rotationYaw, 0.0F); - entity.motionX = entity.motionY = entity.motionZ = 0.0D; - return true; - } else - { - return false; - } - } - - /** - * Is this block either our portal or an existing nether portal? - */ - public boolean isBlockPortal(World world, int x, int y, int z) - { - return world.getBlock(x, y, z) == TFBlocks.portal; - } - - @Override - public boolean makePortal(Entity entity) { - ChunkCoordinates spot = findPortalCoords(entity, true); - - if (spot != null) - { - FMLLog.info("[TwilightForest] Found ideal portal spot"); - makePortalAt(myWorld, spot.posX, spot.posY, spot.posZ); - return true; - } - else - { - FMLLog.info("[TwilightForest] Did not find ideal portal spot, shooting for okay one"); - spot = findPortalCoords(entity, false); - if (spot != null) - { - FMLLog.info("[TwilightForest] Found okay portal spot"); - makePortalAt(myWorld, spot.posX, spot.posY, spot.posZ); - return true; - } - } - - // well I don't think we can actally just return false and fail here - FMLLog.info("[TwilightForest] Did not even find an okay portal spot, just making a random one"); - - // adjust the portal height based on what world we're traveling to - double yFactor = myWorld.provider.dimensionId == 0 ? 2 : 0.5; - // modified copy of base Teleporter method: - int entityX = MathHelper.floor_double(entity.posX); - int entityY = MathHelper.floor_double(entity.posY * yFactor); - int entityZ = MathHelper.floor_double(entity.posZ); - - makePortalAt(myWorld, entityX, entityY, entityZ); - - return false; - } - - public ChunkCoordinates findPortalCoords(Entity entity, boolean ideal) { - // adjust the portal height based on what world we're traveling to - double yFactor = myWorld.provider.dimensionId == 0 ? 2 : 0.5; - // modified copy of base Teleporter method: - int entityX = MathHelper.floor_double(entity.posX); - int entityZ = MathHelper.floor_double(entity.posZ); - - double spotWeight = -1D; - - ChunkCoordinates spot = null; - - byte range = 16; - for(int rx = entityX - range; rx <= entityX + range; rx++) - { - double xWeight = (rx + 0.5D) - entity.posX; - for(int rz = entityZ - range; rz <= entityZ + range; rz++) - { - double zWeight = (rz + 0.5D) - entity.posZ; - - for(int ry = 128 - 1; ry >= 0; ry--) - { - if(!myWorld.isAirBlock(rx, ry, rz)) - { - continue; - } - for(; ry > 0 && myWorld.isAirBlock(rx, ry - 1, rz); ry--) { } - - if (ideal ? isIdealPortal(rx, rz, ry) : isOkayPortal(rx, rz, ry)) - { - double yWeight = (ry + 0.5D) - entity.posY * yFactor; - double rPosWeight = xWeight * xWeight + yWeight * yWeight + zWeight * zWeight; - - - if(spotWeight < 0.0D || rPosWeight < spotWeight) - { - spotWeight = rPosWeight; - spot = new ChunkCoordinates(rx, ry, rz); - } - } - } - } - } - - return spot; - } - - public boolean isIdealPortal(int rx, int rz, int ry) { - for(int potentialZ = 0; potentialZ < 4; potentialZ++) - { - for(int potentialX = 0; potentialX < 4; potentialX++) - { - for(int potentialY = -1; potentialY < 3; potentialY++) - { - int tx = rx + (potentialX - 1); - int ty = ry + potentialY; - int tz = rz + (potentialZ - 1); - if (potentialY == -1 && myWorld.getBlock(tx, ty, tz).getMaterial() != Material.grass || potentialY >= 0 && !myWorld.getBlock(tx, ty, tz).getMaterial().isReplaceable()) - { - return false; - } - } - - } - - } - return true; - } - - public boolean isOkayPortal(int rx, int rz, int ry) { - for(int potentialZ = 0; potentialZ < 4; potentialZ++) - { - for(int potentialX = 0; potentialX < 4; potentialX++) - { - for(int potentialY = -1; potentialY < 3; potentialY++) - { - int tx = rx + (potentialX - 1); - int ty = ry + potentialY; - int tz = rz + (potentialZ - 1); - if (potentialY == -1 && !myWorld.getBlock(tx, ty, tz).getMaterial().isSolid() || potentialY >= 0 && !myWorld.getBlock(tx, ty, tz).getMaterial().isReplaceable()) - { - return false; - } - } - - } - - } - return true; - } - - private void makePortalAt(World world, int px, int py, int pz) { - - if(py < 30) - { - py = 30; - } - world.getClass(); - if(py > 128 - 10) - { - world.getClass(); - py = 128 - 10; - } - - // sink the portal 1 into the ground - py--; - - - // grass all around it - world.setBlock(px - 1, py + 0, pz - 1, Blocks.grass); - world.setBlock(px + 0, py + 0, pz - 1, Blocks.grass); - world.setBlock(px + 1, py + 0, pz - 1, Blocks.grass); - world.setBlock(px + 2, py + 0, pz - 1, Blocks.grass); - - world.setBlock(px - 1, py + 0, pz + 0, Blocks.grass); - world.setBlock(px + 2, py + 0, pz + 0, Blocks.grass); - - world.setBlock(px - 1, py + 0, pz + 1, Blocks.grass); - world.setBlock(px + 2, py + 0, pz + 1, Blocks.grass); - - world.setBlock(px - 1, py + 0, pz + 2, Blocks.grass); - world.setBlock(px + 0, py + 0, pz + 2, Blocks.grass); - world.setBlock(px + 1, py + 0, pz + 2, Blocks.grass); - world.setBlock(px + 2, py + 0, pz + 2, Blocks.grass); - - // dirt under it - world.setBlock(px + 0, py - 1, pz + 0, Blocks.dirt); - world.setBlock(px + 1, py - 1, pz + 0, Blocks.dirt); - world.setBlock(px + 0, py - 1, pz + 1, Blocks.dirt); - world.setBlock(px + 1, py - 1, pz + 1, Blocks.dirt); - - // portal in it - world.setBlock(px + 0, py + 0, pz + 0, TFBlocks.portal, 0, 2); - world.setBlock(px + 1, py + 0, pz + 0, TFBlocks.portal, 0, 2); - world.setBlock(px + 0, py + 0, pz + 1, TFBlocks.portal, 0, 2); - world.setBlock(px + 1, py + 0, pz + 1, TFBlocks.portal, 0, 2); - - // meh, let's just make a bunch of air over it for 4 squares - for (int dx = -1; dx <= 2; dx++) { - for (int dz = -1; dz <= 2; dz++) { - for (int dy = 1; dy <=5; dy++) { - world.setBlock(px + dx, py + dy, pz + dz, Blocks.air); - } - } - } - - // finally, "nature decorations"! - world.setBlock(px - 1, py + 1, pz - 1, randNatureBlock(world.rand), 0, 2); - world.setBlock(px + 0, py + 1, pz - 1, randNatureBlock(world.rand), 0, 2); - world.setBlock(px + 1, py + 1, pz - 1, randNatureBlock(world.rand), 0, 2); - world.setBlock(px + 2, py + 1, pz - 1, randNatureBlock(world.rand), 0, 2); - - world.setBlock(px - 1, py + 1, pz + 0, randNatureBlock(world.rand), 0, 2); - world.setBlock(px + 2, py + 1, pz + 0, randNatureBlock(world.rand), 0, 2); - - world.setBlock(px - 1, py + 1, pz + 1, randNatureBlock(world.rand), 0, 2); - world.setBlock(px + 2, py + 1, pz + 1, randNatureBlock(world.rand), 0, 2); - - world.setBlock(px - 1, py + 1, pz + 2, randNatureBlock(world.rand), 0, 2); - world.setBlock(px + 0, py + 1, pz + 2, randNatureBlock(world.rand), 0, 2); - world.setBlock(px + 1, py + 1, pz + 2, randNatureBlock(world.rand), 0, 2); - world.setBlock(px + 2, py + 1, pz + 2, randNatureBlock(world.rand), 0, 2); - } - - public Block randNatureBlock(Random random) { - Block[] block = {Blocks.brown_mushroom, Blocks.red_mushroom, Blocks.tallgrass, Blocks.red_flower, Blocks.yellow_flower}; - - return block[random.nextInt(block.length)]; - } - -} diff --git a/src/main/java/twilightforest/TFTickHandler.java b/src/main/java/twilightforest/TFTickHandler.java index ec985f5091..f6bd6dc1ff 100644 --- a/src/main/java/twilightforest/TFTickHandler.java +++ b/src/main/java/twilightforest/TFTickHandler.java @@ -1,213 +1,168 @@ package twilightforest; +import net.minecraft.advancements.Advancement; +import net.minecraft.advancements.DisplayInfo; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraftforge.event.TickEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.network.PacketDistributor; +import twilightforest.advancements.TFAdvancements; +import twilightforest.block.TFPortalBlock; +import twilightforest.data.tags.ItemTagGenerator; +import twilightforest.init.TFBlocks; +import twilightforest.item.BrittleFlaskItem; +import twilightforest.network.MissingAdvancementToastPacket; +import twilightforest.network.StructureProtectionClearPacket; +import twilightforest.network.StructureProtectionPacket; +import twilightforest.network.TFPacketHandler; +import twilightforest.util.LandmarkUtil; +import twilightforest.util.PlayerHelper; +import twilightforest.util.WorldUtil; +import twilightforest.world.components.chunkgenerators.ChunkGeneratorTwilight; +import twilightforest.world.components.structures.util.AdvancementLockedStructure; +import twilightforest.world.registration.TFGenerationSettings; + import java.util.List; +import java.util.Objects; import java.util.Random; -import net.minecraft.block.material.Material; -import net.minecraft.entity.item.EntityItem; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.init.Items; -import net.minecraft.item.Item; -import net.minecraft.server.MinecraftServer; -import net.minecraft.util.MathHelper; -import net.minecraft.world.World; -import net.minecraft.world.biome.BiomeGenBase; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import net.minecraftforge.event.entity.item.ItemTossEvent; -import twilightforest.biomes.TFBiomeBase; -import twilightforest.block.BlockTFPortal; -import twilightforest.block.TFBlocks; -import twilightforest.world.ChunkProviderTwilightForest; -import twilightforest.world.WorldProviderTwilightForest; -import cpw.mods.fml.common.FMLLog; -import cpw.mods.fml.common.eventhandler.SubscribeEvent; -import cpw.mods.fml.common.gameevent.TickEvent; -import cpw.mods.fml.common.gameevent.TickEvent.PlayerTickEvent; -import cpw.mods.fml.common.network.NetworkRegistry; -import cpw.mods.fml.common.network.internal.FMLProxyPacket; - -/** - * This class listens for ticks in the world. If the player is near a diamond in the water, this class attempts to open a portal. - * - * @author Ben - * - */ -public class TFTickHandler -{ - - public Item portalItem = null; - - - /** - * On the tick, we check for eligible portals - */ - @SubscribeEvent - public void playerTick(PlayerTickEvent event) { +@Mod.EventBusSubscriber(modid = TwilightForestMod.ID) +public class TFTickHandler { + @SubscribeEvent + public static void playerTick(TickEvent.PlayerTickEvent event) { + Player eventPlayer = event.player; - EntityPlayer player = event.player; - World world = player.worldObj; + if (!(eventPlayer instanceof ServerPlayer player)) return; + if (!(player.level instanceof ServerLevel world)) return; // check for portal creation, at least if it's not disabled - if (!TwilightForestMod.disablePortalCreation && event.phase == TickEvent.Phase.END && !world.isRemote && world.getWorldTime() % 20 == 0) { + if (!TFConfig.COMMON_CONFIG.disablePortalCreation.get() && event.phase == TickEvent.Phase.END && player.tickCount % (TFConfig.COMMON_CONFIG.checkPortalDestination.get() ? 100 : 20) == 0) { // skip non admin players when the option is on - if (TwilightForestMod.adminOnlyPortals) { - try { - //if (MinecraftServer.getServer().getConfigurationManager().isPlayerOpped(player.getCommandSenderName().toString())) { - if (MinecraftServer.getServer().getConfigurationManager().func_152596_g(player.getGameProfile())) { - // reduce range to 4.0 when the option is on - checkForPortalCreation(player, world, 4.0F); - - } - } catch (NoSuchMethodError ex) { - // stop checking admin - FMLLog.warning("[TwilightForest] Could not determine op status for adminOnlyPortals option, ignoring option."); - TwilightForestMod.adminOnlyPortals = false; + if (TFConfig.COMMON_CONFIG.adminOnlyPortals.get()) { + if (world.getServer().getProfilePermissions(player.getGameProfile()) != 0) { + // reduce range to 4.0 when the option is on + checkForPortalCreation(player, world, 4.0F); } } else { // normal check, no special options checkForPortalCreation(player, world, 32.0F); - } } + //tick every second for the advancement trigger bit of the flask + if(event.phase == TickEvent.Phase.END && player.tickCount % 20 == 0) { + BrittleFlaskItem.ticker(); + } + // check the player for being in a forbidden progression area, only every 20 ticks - if (!world.isRemote && event.phase == TickEvent.Phase.END && world.getWorldTime() % 20 == 0 && world.getGameRules().getGameRuleBooleanValue(TwilightForestMod.ENFORCED_PROGRESSION_RULE)) { - if (world.provider instanceof WorldProviderTwilightForest && !player.capabilities.isCreativeMode) { - checkBiomeForProgression(player, world); - } + if (event.phase == TickEvent.Phase.END && player.tickCount % 20 == 0 && LandmarkUtil.isProgressionEnforced(world) && TFGenerationSettings.usesTwilightChunkGenerator(world) && !player.isCreative() && !player.isSpectator()) { + TFGenerationSettings.enforceBiomeProgression(player, world); } - + // check and send nearby forbidden structures, every 100 ticks or so - if (!world.isRemote && event.phase == TickEvent.Phase.END && world.getWorldTime() % 100 == 0 && world.getGameRules().getGameRuleBooleanValue(TwilightForestMod.ENFORCED_PROGRESSION_RULE)) { - if (world.provider instanceof WorldProviderTwilightForest) { - if (!player.capabilities.isCreativeMode) { - checkForLockedStructuresSendPacket(player, world); - } else { + if (event.phase == TickEvent.Phase.END && player.tickCount % 100 == 0 && LandmarkUtil.isProgressionEnforced(world)) { + if (TFGenerationSettings.usesTwilightChunkGenerator(world)) { + if (player.isCreative() || player.isSpectator()) { sendAllClearPacket(world, player); + } else { + checkForLockedStructuresSendPacket(player, world); } } } } - - private void sendStructureProtectionPacket(World world, EntityPlayer player, StructureBoundingBox sbb) { - // send packet - FMLProxyPacket message = TFGenericPacketHandler.makeStructureProtectionPacket(sbb); - if (player instanceof EntityPlayerMP) { - TwilightForestMod.genericChannel.sendTo(message, (EntityPlayerMP) player); - //System.out.println("Sent structure protection"); - } else { - //System.err.println("Can't sent packet to player, not an EntityPlayerMP"); + + private static void sendStructureProtectionPacket(Level world, Player player, BoundingBox sbb) { + if (player instanceof ServerPlayer) { + TFPacketHandler.CHANNEL.send(PacketDistributor.PLAYER.with(() -> (ServerPlayer) player), new StructureProtectionPacket(sbb)); } } - - private void sendAllClearPacket(World world, EntityPlayer player) { - FMLProxyPacket message = TFGenericPacketHandler.makeStructureProtectionClearPacket(); - if (player instanceof EntityPlayerMP) { - TwilightForestMod.genericChannel.sendTo(message, (EntityPlayerMP) player); - //System.out.println("Sent structure all clear"); - } else { - //System.err.println("Can't sent packet to player, not an EntityPlayerMP"); + + private static void sendAllClearPacket(Level world, Player player) { + if (player instanceof ServerPlayer) { + TFPacketHandler.CHANNEL.send(PacketDistributor.PLAYER.with(() -> (ServerPlayer) player), new StructureProtectionClearPacket()); } } - private boolean checkForLockedStructuresSendPacket(EntityPlayer player, World world) { - ChunkProviderTwilightForest chunkProvider = ((WorldProviderTwilightForest)world.provider).getChunkProvider(); - - int px = MathHelper.floor_double(player.posX); - int py = MathHelper.floor_double(player.posY); - int pz = MathHelper.floor_double(player.posZ); - - if (chunkProvider != null && chunkProvider.isBlockNearFullStructure(px, pz, 100)) { - - StructureBoundingBox fullSBB = chunkProvider.getFullSBBNear(px, pz, 100); - - TFFeature nearFeature = TFFeature.getFeatureForRegion(fullSBB.getCenterX() >> 4, fullSBB.getCenterZ() >> 4, world); - - if (!nearFeature.hasProtectionAura || nearFeature.doesPlayerHaveRequiredAchievement(player)) { - sendAllClearPacket(world, player); - return false; - } else { - sendStructureProtectionPacket(world, player, fullSBB); + @SuppressWarnings("UnusedReturnValue") + private static boolean checkForLockedStructuresSendPacket(Player player, Level world) { + ChunkGeneratorTwilight chunkGenerator = WorldUtil.getChunkGenerator(world); + if (chunkGenerator == null) + return false; + + ChunkPos chunkPlayer = player.chunkPosition(); + return LandmarkUtil.locateNearestLandmarkStart(world, chunkPlayer.x, chunkPlayer.z).map(structureStart -> { + if (structureStart.getStructure() instanceof AdvancementLockedStructure advancementLockedStructure && !advancementLockedStructure.doesPlayerHaveRequiredAdvancements(player)) { + sendStructureProtectionPacket(world, player, structureStart.getBoundingBox()); return true; } - - } else { + sendAllClearPacket(world, player); return false; - } + }).orElse(false); } - @SubscribeEvent - public void tickStart(ItemTossEvent event) { - System.out.println("ItemTossEvent Tick"); - } + private static void checkForPortalCreation(ServerPlayer player, Level world, float rangeToCheck) { + if (world.dimension().location().equals(new ResourceLocation(TFConfig.COMMON_CONFIG.originDimension.get())) + || TFGenerationSettings.isTwilightPortalDestination(world) + || TFConfig.COMMON_CONFIG.allowPortalsInOtherDimensions.get()) { + List itemList = world.getEntitiesOfClass(ItemEntity.class, player.getBoundingBox().inflate(rangeToCheck)); + ItemEntity qualified = null; + for (ItemEntity entityItem : itemList) { + if (entityItem.getItem().is(ItemTagGenerator.PORTAL_ACTIVATOR) && + TFBlocks.TWILIGHT_PORTAL.get().canFormPortal(world.getBlockState(entityItem.blockPosition())) && + Objects.equals(entityItem.getOwner(), player)) { - private void checkForPortalCreation(EntityPlayer player, World world, float rangeToCheck) { - // make sure we are allowed to make a portal in this dimension - if (world != null && player != null - && (world.provider.dimensionId == 0 || world.provider.dimensionId == TwilightForestMod.dimensionID - || TwilightForestMod.allowPortalsInOtherDimensions)) - { - @SuppressWarnings("unchecked") - List itemList = world.getEntitiesWithinAABB(EntityItem.class, player.boundingBox.expand(rangeToCheck, rangeToCheck, rangeToCheck)); - - // do we have the item set? if not, can we set it? - if (this.portalItem == null) { - - - + qualified = entityItem; + break; + } } - - // check to see if someone's thrown the portal item into the water - for (EntityItem entityItem : itemList) - { - if (entityItem.getEntityItem().getItem() == portalItem && world.isMaterialInBB(entityItem.boundingBox, Material.water)) - { - //System.out.println("There is a diamond in the water"); - - // make sparkles in the area - Random rand = new Random(); - for (int k = 0; k < 2; k++) - { - double d = rand.nextGaussian() * 0.02D; - double d1 = rand.nextGaussian() * 0.02D; - double d2 = rand.nextGaussian() * 0.02D; - - world.spawnParticle("spell", entityItem.posX, entityItem.posY + 0.2, entityItem.posZ, d, d1, d2); - } - - // try to make a portal - int dx = MathHelper.floor_double(entityItem.posX); - int dy = MathHelper.floor_double(entityItem.posY); - int dz = MathHelper.floor_double(entityItem.posZ); - - if (((BlockTFPortal)TFBlocks.portal).tryToCreatePortal(world, dx, dy, dz)) { - player.triggerAchievement(TFAchievementPage.twilightPortal); + + if (qualified == null) return; + + if (!player.isCreative() && !player.isSpectator() && TFConfig.getPortalLockingAdvancement(player) != null) { + Advancement requirement = PlayerHelper.getAdvancement(player, Objects.requireNonNull(TFConfig.getPortalLockingAdvancement(player))); + if (requirement != null && !PlayerHelper.doesPlayerHaveRequiredAdvancement(player, requirement)) { + player.displayClientMessage(TFPortalBlock.PORTAL_UNWORTHY, true); + + if (!TFPortalBlock.isPlayerNotifiedOfRequirement(player)) { + // .doesPlayerHaveRequiredAdvancement null-checks already, so we can skip null-checking the `requirement` + DisplayInfo info = requirement.getDisplay(); + TFPacketHandler.CHANNEL.send(PacketDistributor.PLAYER.with(() -> player), info == null ? new MissingAdvancementToastPacket(Component.translatable(".ui.advancement.no_title"), new ItemStack(TFBlocks.TWILIGHT_PORTAL_MINIATURE_STRUCTURE.get())) : new MissingAdvancementToastPacket(info.getTitle(), info.getIcon())); + + TFPortalBlock.playerNotifiedOfRequirement(player); } + + return; // Item qualifies, but the player doesn't } } - } - } - /** - * Check what biome the player is in, and see if current progression allows that biome. If not, take appropriate action - */ - private void checkBiomeForProgression(EntityPlayer player, World world) { - BiomeGenBase currentBiome = world.getBiomeGenForCoords(MathHelper.floor_double(player.posX), MathHelper.floor_double(player.posZ)); - - if (currentBiome instanceof TFBiomeBase) { - TFBiomeBase tfBiome = (TFBiomeBase)currentBiome; - - boolean dangerousBiome = !tfBiome.doesPlayerHaveRequiredAchievement(player); - if (dangerousBiome) { - tfBiome.enforceProgession(player, world); + Random rand = new Random(); + for (int i = 0; i < 2; i++) { + double vx = rand.nextGaussian() * 0.02D; + double vy = rand.nextGaussian() * 0.02D; + double vz = rand.nextGaussian() * 0.02D; + + world.addParticle(ParticleTypes.EFFECT, qualified.getX(), qualified.getY() + 0.2, qualified.getZ(), vx, vy, vz); } + + if (TFBlocks.TWILIGHT_PORTAL.get().tryToCreatePortal(world, qualified.blockPosition(), qualified, player)) + TFAdvancements.MADE_TF_PORTAL.trigger(player); + } } - } diff --git a/src/main/java/twilightforest/TFTreasure.java b/src/main/java/twilightforest/TFTreasure.java deleted file mode 100644 index 781a6c3322..0000000000 --- a/src/main/java/twilightforest/TFTreasure.java +++ /dev/null @@ -1,742 +0,0 @@ -package twilightforest; - -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.enchantment.Enchantment; -import net.minecraft.init.Blocks; -import net.minecraft.init.Items; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntityChest; -import net.minecraft.world.World; -import twilightforest.block.TFBlocks; -import twilightforest.item.TFItems; - - -public class TFTreasure { - - int type; - - Random treasureRNG; - - protected TFTreasureTable useless; // one quarter of common treasures are - // one of these useless items - protected TFTreasureTable common; - protected TFTreasureTable uncommon; - protected TFTreasureTable rare; - protected TFTreasureTable ultrarare; // one quarter of rare treasures are - // one of these ultrarare items. The - // list must be at least as large as - // the large list for this to make - // sense. - - public static TFTreasure hill1 = new TFTreasure(1); - public static TFTreasure hill2 = new TFTreasure(2); - public static TFTreasure hill3 = new TFTreasure(3); - public static TFTreasure hedgemaze = new TFTreasure(4); - public static TFTreasure labyrinth_room = new TFTreasure(5); - public static TFTreasure labyrinth_deadend = new TFTreasure(6); - public static TFTreasure tower_room = new TFTreasure(7); - public static TFTreasure tower_library = new TFTreasure(8); - public static TFTreasure basement = new TFTreasure(9); - public static TFTreasure labyrinth_vault = new TFTreasure(10); - public static TFTreasure darktower_cache = new TFTreasure(11); - public static TFTreasure darktower_key = new TFTreasure(12); - public static TFTreasure darktower_boss = new TFTreasure(13); - public static TFTreasure tree_cache = new TFTreasure(14); - public static TFTreasure stronghold_cache = new TFTreasure(15); - public static TFTreasure stronghold_room = new TFTreasure(16); - public static TFTreasure stronghold_boss = new TFTreasure(17); - public static TFTreasure aurora_cache = new TFTreasure(18); - public static TFTreasure aurora_room = new TFTreasure(19); - public static TFTreasure aurora_boss = new TFTreasure(20); - public static TFTreasure troll_garden = new TFTreasure(21); - public static TFTreasure troll_vault = new TFTreasure(22); - - - /** - * Construct a new treasure of type i - * - * @param i - */ - public TFTreasure(int i) { - this.type = i; - - useless = new TFTreasureTable(); - common = new TFTreasureTable(); - uncommon = new TFTreasureTable(); - rare = new TFTreasureTable(); - ultrarare = new TFTreasureTable(); - - treasureRNG = new Random(); - - // TODO: separate these into plain ol' different classes - fill(i); - } - - /** - * Generates a treasure chest in the world at the specified coordinates. - */ - public boolean generate(World world, Random rand, int cx, int cy, int cz) { - - return this.generate(world, rand, cx, cy, cz, Blocks.chest); - } - - /** - * Generates a treasure chest in the world at the specified coordinates. - */ - public boolean generate(World world, Random rand, int cx, int cy, int cz, Block chestBlock) { - boolean flag = true; - - treasureRNG.setSeed(world.getSeed() * cx + cy ^ cz); - - // make a chest - world.setBlock(cx, cy, cz, chestBlock, 0, 2); - - // add 4 common items - for (int i = 0; i < 4; i++) { - flag &= addItemToChest(world, treasureRNG, cx, cy, cz, getCommonItem(treasureRNG)); - } - - // add 2 uncommon items - for (int i = 0; i < 2; i++) { - flag &= addItemToChest(world, treasureRNG, cx, cy, cz, - getUncommonItem(treasureRNG)); - } - - // add 1 rare item - for (int i = 0; i < 1; i++) { - flag &= addItemToChest(world, treasureRNG, cx, cy, cz, getRareItem(treasureRNG)); - } - - return flag; - } - - /** - * Gets a common item. If the useless list is not empty, - * there is a 1/4 chance we get a useless item instead. - */ - public ItemStack getCommonItem(Random rand) { - if (!useless.isEmpty() && rand.nextInt(4) == 0) { - return useless.getRandomItem(rand); - } else { - return common.getRandomItem(rand); - } - } - - /** - * Gets an uncommon item. - */ - public ItemStack getUncommonItem(Random rand) { - return uncommon.getRandomItem(rand); - } - - /** - * Gets a rare item. If there are items on the ultrarare list, - * there is a 1/4 chance we get a ultrarare item instead. - */ - public ItemStack getRareItem(Random rand) - { - if (!ultrarare.isEmpty() && rand.nextInt(4) == 0) - { - return ultrarare.getRandomItem(rand); - } - else - { - return rare.getRandomItem(rand); - } - } - - /** - * Used internally to add items into chests - */ - protected boolean addItemToChest(World world, Random rand, int cx, int cy, - int cz, ItemStack itemStack) { - - TileEntityChest chest = (TileEntityChest) world.getTileEntity(cx, cy, cz); - - // make sure the chest is not full - if (chest != null) { - int slot = findRandomInventorySlot(chest, rand); - - if (slot != -1) { - chest.setInventorySlotContents(slot, itemStack); - return true; - } - - } - return false; - } - - /** - * Finds an open slot in the chest, or returns -1 if the chest is full. - */ - protected int findRandomInventorySlot(TileEntityChest chest, Random rand) { - // TODO: this is lazy - - // try 100 times to find an empty slot - for (int i = 0; i < 100; i++) { - int slot = rand.nextInt(chest.getSizeInventory()); - if (chest.getStackInSlot(slot) == null) { - return slot; - } - } - - // didn't find one - return -1; - } - - /** - * Fills the table with items for the specified type. This should be - * refactored into seperate functions someday. - */ - protected void fill(int i) { - useless.add(Blocks.red_flower, 4); - useless.add(Blocks.yellow_flower, 4); - useless.add(Items.feather, 3); - useless.add(Items.wheat_seeds, 2); - useless.add(Items.flint, 2); - useless.add(Blocks.cactus, 2); - useless.add(Items.reeds, 4); - useless.add(Blocks.sand, 4); - useless.add(Items.flower_pot, 1); - useless.add(new ItemStack(Items.dye, 1, 0)); - - if (i == 1) { - // hill type 1 chest - common.add(Items.iron_ingot, 4); - common.add(Items.wheat, 4); - common.add(Items.string, 4); - common.add(Items.bucket, 1); - - uncommon.add(Items.bread, 1); - uncommon.add(TFItems.oreMagnet, 1); - uncommon.add(Items.gunpowder, 4); - uncommon.add(Items.arrow, 12); - uncommon.add(Blocks.torch, 12); - - rare.add(Items.gold_ingot, 3); - rare.add(Items.iron_pickaxe, 1); - rare.add(TFItems.liveRoot, 3); - - ultrarare.add(TFItems.transformPowder, 12); - ultrarare.add(Items.diamond, 1); - ultrarare.add(TFItems.steeleafIngot, 3); - } - - if (i == 2) { - // hill type 2 chest - common.add(Items.iron_ingot, 4); - common.add(Items.carrot, 4); - common.add(Blocks.ladder, 6); - common.add(Items.bucket, 1); - - uncommon.add(Items.baked_potato, 2); - uncommon.add(TFItems.oreMagnet, 1); - uncommon.add(TFItems.ironwoodIngot, 4); - uncommon.add(Items.arrow, 12); - uncommon.add(Blocks.torch, 12); - - rare.add(TFItems.nagaScale, 1); - rare.add(TFBlocks.uncraftingTable, 1); - rare.add(TFItems.transformPowder, 12); - - ultrarare.add(TFItems.peacockFan, 1); - ultrarare.add(Items.emerald, 6); - ultrarare.add(Items.diamond, 1); - ultrarare.add(TFItems.charmOfLife1, 1); - } - - if (i == 3) { - // hill type 3 chest - common.add(Items.gold_nugget, 9); - common.add(Items.potato, 4); - common.add(Items.fish, 4); - common.add(TFItems.torchberries, 5); - - uncommon.add(Items.pumpkin_pie, 1); - uncommon.add(TFItems.oreMagnet, 1); - uncommon.add(Items.gunpowder, 4); - uncommon.add(Items.arrow, 12); - uncommon.add(Blocks.torch, 12); - uncommon.add(TFItems.steeleafIngot, 4); - - rare.add(TFItems.nagaScale, 1); - rare.addEnchanted(new ItemStack(TFItems.ironwoodPick, 1), Enchantment.efficiency, 1, Enchantment.fortune, 1); - rare.add(TFItems.transformPowder, 12); - - ultrarare.add(TFItems.moonwormQueen, 1); - ultrarare.add(TFBlocks.sapling, 1, 4); - ultrarare.add(Items.diamond, 2); - ultrarare.add(TFItems.charmOfLife1, 1); - ultrarare.add(TFItems.charmOfKeeping1, 1); - } - - if (i == 4) { - // hedge maze chest - common.add(Blocks.planks, 4); - common.add(Blocks.brown_mushroom, 4); - common.add(Blocks.red_mushroom, 4); - common.add(Items.wheat, 4); - common.add(Items.string, 4); - common.add(Items.stick, 6); - - uncommon.add(Items.melon, 4); - uncommon.add(Items.melon_seeds, 4); - uncommon.add(Items.pumpkin_seeds, 4); - uncommon.add(Items.arrow, 12); - uncommon.add(TFBlocks.firefly, 4); - - rare.add(Blocks.web, 3); - rare.add(Items.shears, 1); - rare.add(Items.saddle, 1); - rare.add(Items.bow, 1); - rare.add(Items.apple, 2); - - ultrarare.add(Items.diamond_hoe, 1); - ultrarare.add(Items.diamond, 1); - ultrarare.add(Items.mushroom_stew, 1); - ultrarare.add(Items.golden_apple, 1); - } - - if (i == 5) { - // labyrinth room chest - useless.clear(); - - common.add(Items.iron_ingot, 4); - common.add(TFItems.mazeWafer, 12); - common.add(Items.gunpowder, 4); - common.add(TFItems.ironwoodIngot, 4); - common.add(TFBlocks.firefly, 5); - common.add(Items.milk_bucket, 1); - - uncommon.add(TFItems.steeleafIngot, 6); - uncommon.add(TFItems.steeleafLegs, 1); - uncommon.add(TFItems.steeleafPlate, 1); - uncommon.add(TFItems.steeleafHelm, 1); - uncommon.add(TFItems.steeleafBoots, 1); - uncommon.add(TFItems.steeleafPick, 1); - uncommon.add(TFItems.ironwoodPlate, 1); - uncommon.add(TFItems.ironwoodSword, 1); - uncommon.add(TFItems.charmOfKeeping1, 1); - - rare.add(TFItems.mazeMapFocus, 1); - rare.add(Blocks.tnt, 3); - rare.add(new ItemStack(Items.potionitem, 1, 16373)); // health ii - } - - if (i == 6) { - // labyrinth dead end chest - common.add(Items.stick, 12); - common.add(Items.coal, 12); - common.add(Items.arrow, 12); - common.add(TFItems.mazeWafer, 9); - common.add(Items.paper, 12); - common.add(Items.leather, 4); - common.add(Items.mushroom_stew, 1); - - uncommon.add(Items.milk_bucket, 1); - uncommon.add(Items.paper, 5); - uncommon.add(Items.iron_ingot, 6); - uncommon.add(TFItems.ironwoodIngot, 8); - uncommon.add(TFBlocks.firefly, 5); - uncommon.add(TFItems.charmOfKeeping1, 1); - - rare.add(TFItems.steeleafIngot, 8); - rare.add(Items.golden_apple, 1); - rare.add(Items.blaze_rod, 2); - } - - if (i == 10) { - // labyrinth vault chest - useless.clear(); - - common.add(Items.iron_ingot, 9); - common.add(Items.emerald, 5); - common.add(TFItems.mazeWafer, 12); - common.add(TFItems.ironwoodIngot, 9); - common.add(new ItemStack(Items.potionitem, 1, 16369)); // regen ii - common.add(new ItemStack(Items.potionitem, 1, 16373)); // health ii - common.add(new ItemStack(Items.potionitem, 1, 16370)); // extended swiftness ii - - uncommon.addEnchanted(new ItemStack(Items.bow), Enchantment.infinity, 1, Enchantment.punch, 2); - uncommon.addEnchanted(new ItemStack(Items.bow), Enchantment.power, 3, Enchantment.flame, 1); - uncommon.addEnchanted(new ItemStack(TFItems.steeleafShovel), Enchantment.efficiency, 4, Enchantment.unbreaking, 2); - uncommon.addEnchanted(new ItemStack(TFItems.steeleafAxe), Enchantment.efficiency, 5); - uncommon.add(TFItems.steeleafIngot, 12); - uncommon.addEnchanted(new ItemStack(TFItems.steeleafPlate), Enchantment.protection, 3); - uncommon.addEnchanted(new ItemStack(TFItems.steeleafLegs), Enchantment.fireProtection, 4); - uncommon.addEnchanted(new ItemStack(TFItems.steeleafBoots), Enchantment.protection, 2); - uncommon.addEnchanted(new ItemStack(TFItems.steeleafHelm), Enchantment.respiration, 3); - - rare.add(Blocks.emerald_block, 1); - rare.add(Blocks.ender_chest, 1); - rare.addEnchanted(new ItemStack(TFItems.steeleafPick), Enchantment.efficiency, 4, Enchantment.silkTouch, 1); - rare.addEnchanted(new ItemStack(TFItems.steeleafSword), Enchantment.sharpness, 4, Enchantment.knockback, 2); - rare.addEnchanted(new ItemStack(TFItems.steeleafSword), Enchantment.baneOfArthropods, 5, Enchantment.fireAspect, 2); - rare.addEnchanted(new ItemStack(TFItems.mazebreakerPick), Enchantment.efficiency, 4, Enchantment.unbreaking, 3, Enchantment.fortune, 2); - } - - if (i == 7) { - // wizards tower treasure room chest - common.add(Items.glass_bottle, 6); - common.add(new ItemStack(Items.potionitem, 1, 0)); - common.add(Items.sugar, 5); - common.add(Items.spider_eye, 3); - common.add(Items.ghast_tear, 1); - common.add(Items.magma_cream, 2); - common.add(Items.fermented_spider_eye, 1); - common.add(Items.speckled_melon, 2); - common.add(Items.blaze_powder, 3); - common.add(Items.paper, 6); - - uncommon.addRandomEnchanted(Items.golden_sword, 10); - uncommon.addRandomEnchanted(Items.golden_boots, 7); - uncommon.add(new ItemStack(Items.potionitem, 1, 16274)); // swiftness - uncommon.add(new ItemStack(Items.potionitem, 1, 16341)); // healing - uncommon.add(new ItemStack(Items.potionitem, 1, 16307)); // fire resist - uncommon.add(new ItemStack(Items.potionitem, 1, 16348)); // harm - - rare.addRandomEnchanted(Items.golden_helmet, 18); - rare.add(new ItemStack(Items.potionitem, 1, 16306)); // swiftness ii - rare.add(new ItemStack(Items.potionitem, 1, 16305)); // regen ii - rare.add(new ItemStack(Items.potionitem, 1, 32725)); // splash health - rare.add(new ItemStack(Items.potionitem, 1, 32764)); // harming ii splash - rare.add(TFItems.transformPowder, 12); - rare.add(TFItems.charmOfLife1, 1); - rare.add(TFItems.charmOfKeeping1, 1); - - ultrarare.addRandomEnchanted(Items.golden_axe, 20); - ultrarare.add(Items.ender_pearl, 1); - ultrarare.add(Blocks.obsidian, 4); - ultrarare.add(Items.diamond, 1); - ultrarare.add(TFItems.moonwormQueen, 1); - ultrarare.add(TFItems.peacockFan, 1); - } - - if (i == 8) { - // wizards tower library chest - common.add(Items.glass_bottle, 6); - common.add(new ItemStack(Items.potionitem, 1, 0)); - common.add(Blocks.ladder, 6); - common.add(Items.paper, 6); - common.add(Items.bone, 6); - common.add(Items.gold_nugget, 6); - common.add(Items.clay_ball, 12); - - uncommon.addRandomEnchanted(Items.iron_leggings, 5); - uncommon.add(Items.fire_charge, 3); - uncommon.add(Items.book, 5); - uncommon.add(Items.map, 1); - uncommon.add(new ItemStack(Items.potionitem, 1, 16)); - uncommon.add(new ItemStack(Items.potionitem, 1, 16276)); // poison - uncommon.add(new ItemStack(Items.potionitem, 1, 16312)); // weakness - - rare.addRandomEnchanted(Items.bow, 5); - rare.addRandomEnchanted(Items.stone_sword, 10); - rare.addRandomEnchanted(Items.wooden_sword, 15); - rare.add(new ItemStack(Items.potionitem, 1, 32696)); // splash weakness - rare.add(new ItemStack(Items.potionitem, 1, 16369)); // regen ii - rare.add(new ItemStack(Items.potionitem, 1, 16373)); // health ii - rare.add(new ItemStack(Items.potionitem, 1, 16370)); // extended swiftness ii - rare.add(TFItems.transformPowder, 12); - rare.add(TFItems.charmOfKeeping1, 1); - - ultrarare.addRandomEnchanted(Items.golden_pickaxe, 10); - ultrarare.addRandomEnchanted(Items.iron_sword, 20); - ultrarare.addRandomEnchanted(Items.bow, 30); - ultrarare.add(Blocks.bookshelf, 5); - ultrarare.add(Items.ender_pearl, 2); - ultrarare.add(Items.experience_bottle, 6); - } - - if (i == 9) { - // basement treasure cache, mostly full of food! - common.add(new ItemStack(Items.potionitem, 1, 0)); - common.add(Items.rotten_flesh, 6); - common.add(Items.poisonous_potato, 2); - common.add(Items.wheat, 6); - common.add(Items.potato, 6); - common.add(Items.carrot, 6); - common.add(Items.melon, 6); - common.add(Items.water_bucket, 1); - common.add(Blocks.torch, 12); - common.add(Items.mushroom_stew, 1); - common.add(Items.milk_bucket, 1); - common.add(Items.melon_seeds, 5); - - uncommon.add(Items.bread, 8); - uncommon.add(Items.cooked_beef, 6); - uncommon.add(Items.cooked_porkchop, 8); - uncommon.add(Items.baked_potato, 8); - uncommon.add(Items.cooked_chicken, 10); - uncommon.add(Items.cooked_fished, 8); - - rare.add(Items.speckled_melon, 12); - rare.add(Items.apple, 12); - rare.add(Items.map, 1); - rare.add(TFItems.charmOfKeeping1, 1); - - ultrarare.add(Items.golden_apple, 2); - ultrarare.add(Items.golden_carrot, 2); - ultrarare.add(Items.cake, 1); - ultrarare.add(Items.boat, 1); - ultrarare.add(new ItemStack(TFBlocks.sapling, 1, 4)); - } - - if (i == 11) { - // dark tower regular treasure cache, contains supplies - common.add(Items.stick, 12); - common.add(new ItemStack(Items.coal, 12, 1)); - common.add(Items.arrow, 12); - common.add(TFItems.experiment115, 9); - common.add(new ItemStack(Blocks.wool, 1, 14)); - common.add(Items.redstone, 6); - - uncommon.add(Blocks.redstone_lamp, 3); - uncommon.add(Items.iron_ingot, 6); - uncommon.add(TFItems.ironwoodIngot, 8); - uncommon.add(TFBlocks.firefly, 5); - uncommon.add(TFItems.charmOfKeeping1, 1); - - rare.add(TFItems.steeleafIngot, 8); - rare.add(Items.diamond, 2); - - } - - if (i == 12) { - // dark tower key treasure chest, contains higher quality treasure - // key will be added seperately - useless.clear(); - - common.add(Items.iron_ingot, 4); - common.add(TFItems.experiment115, 12); - common.add(Items.gunpowder, 4); - common.add(TFItems.ironwoodIngot, 4); - common.add(TFBlocks.firefly, 5); - common.add(Items.redstone, 12); - common.add(Items.glowstone_dust, 12); - - uncommon.add(TFItems.steeleafIngot, 6); - uncommon.add(TFItems.steeleafLegs, 1); - uncommon.add(TFItems.steeleafPlate, 1); - uncommon.add(TFItems.steeleafHelm, 1); - uncommon.add(TFItems.steeleafBoots, 1); - uncommon.add(TFItems.steeleafPick, 1); - uncommon.add(TFItems.ironwoodPlate, 1); - uncommon.add(TFItems.ironwoodSword, 1); - uncommon.add(TFItems.charmOfKeeping1, 1); - - rare.add(TFItems.charmOfLife1, 1); - rare.addEnchantedBook(Enchantment.featherFalling, 3); - rare.addEnchantedBook(Enchantment.knockback, 2); - rare.addEnchantedBook(Enchantment.efficiency, 3); - } - - if (i == 13) { - // dark tower boss treasure - useless.clear(); - - common.add(TFItems.carminite, 3); - uncommon.add(TFItems.fieryTears, 5); - rare.add(new ItemStack(TFItems.trophy, 1, 3)); - } - - if (i == 14) { - // tree branch treasure cache, food and saplings - common.add(Items.poisonous_potato, 2); - common.add(Items.wheat, 6); - common.add(Items.potato, 6); - common.add(Items.carrot, 6); - common.add(Items.melon, 6); - common.add(Items.water_bucket, 1); - common.add(Items.milk_bucket, 1); - common.add(Items.melon_seeds, 5); - - uncommon.add(new ItemStack(TFBlocks.firefly, 12)); - uncommon.add(new ItemStack(TFBlocks.sapling, 4, 0)); - uncommon.add(new ItemStack(TFBlocks.sapling, 4, 1)); - uncommon.add(new ItemStack(TFBlocks.sapling, 4, 2)); - uncommon.add(new ItemStack(TFBlocks.sapling, 4, 3)); - - rare.add(Items.pumpkin_pie, 12); - rare.add(Items.apple, 12); - rare.add(TFItems.charmOfLife1, 1); - rare.add(TFItems.charmOfKeeping1, 1); - - ultrarare.add(new ItemStack(TFBlocks.sapling, 1, 4)); - ultrarare.add(new ItemStack(TFBlocks.sapling, 1, 5)); - ultrarare.add(new ItemStack(TFBlocks.sapling, 1, 6)); - ultrarare.add(new ItemStack(TFBlocks.sapling, 1, 7)); - ultrarare.add(new ItemStack(TFBlocks.sapling, 1, 8)); - } - - if (i == 15) { - // stronghold regular treasure cache, contains supplies - common.add(Items.stick, 12); - common.add(new ItemStack(Items.coal, 12)); - common.add(Items.arrow, 12); - common.add(TFItems.mazeWafer, 9); - common.add(new ItemStack(Blocks.wool, 1, 11)); - common.add(Items.iron_ingot, 2); - - uncommon.add(Items.bucket, 1); - uncommon.add(Items.iron_ingot, 6); - uncommon.add(TFItems.ironwoodIngot, 6); - uncommon.add(TFBlocks.firefly, 5); - uncommon.add(TFItems.charmOfKeeping1, 1); - uncommon.add(TFItems.armorShard, 3); - - rare.add(TFItems.knightMetal, 8); - rare.addRandomEnchanted(Items.bow, 20); - rare.addRandomEnchanted(Items.iron_sword, 20); - rare.addRandomEnchanted(TFItems.ironwoodSword, 15); - rare.addRandomEnchanted(TFItems.steeleafSword, 10); - - ultrarare.addEnchantedBook(Enchantment.baneOfArthropods, 4); - ultrarare.addEnchantedBook(Enchantment.sharpness, 4); - ultrarare.addEnchantedBook(Enchantment.smite, 4); - ultrarare.addEnchantedBook(Enchantment.unbreaking, 2); - ultrarare.addEnchantedBook(Enchantment.unbreaking, 2); - ultrarare.addEnchantedBook(Enchantment.protection, 3); - ultrarare.addEnchantedBook(Enchantment.projectileProtection, 3); - ultrarare.addEnchantedBook(Enchantment.featherFalling, 3); - - } - - if (i == 16) { - // stronghold treasure room chest - kinda rare - useless.clear(); - - common.add(Items.iron_ingot, 4); - common.add(TFItems.mazeWafer, 12); - common.add(Items.gunpowder, 4); - common.add(TFItems.ironwoodIngot, 4); - common.add(TFBlocks.firefly, 5); - common.add(Items.milk_bucket, 1); - - uncommon.add(TFItems.steeleafIngot, 6); - uncommon.add(TFItems.steeleafLegs, 1); - uncommon.add(TFItems.steeleafPlate, 1); - uncommon.add(TFItems.steeleafHelm, 1); - uncommon.add(TFItems.steeleafBoots, 1); - uncommon.add(TFItems.steeleafPick, 1); - uncommon.add(TFItems.ironwoodPlate, 1); - uncommon.add(TFItems.ironwoodSword, 1); - uncommon.add(TFItems.charmOfLife1, 1); - - rare.add(TFItems.mazeMapFocus, 1); - rare.addRandomEnchanted(Items.bow, 30); - rare.addRandomEnchanted(Items.iron_sword, 30); - rare.addRandomEnchanted(TFItems.ironwoodSword, 25); - rare.addRandomEnchanted(TFItems.steeleafSword, 20); - rare.addRandomEnchanted(Items.diamond_sword, 15); - - } - - if (i == 17) { - // stronghold boss treasure - useless.clear(); - - common.addRandomEnchanted(TFItems.knightlySword, 20); - common.addRandomEnchanted(TFItems.knightlyPick, 20); - common.addRandomEnchanted(TFItems.knightlyAxe, 20); - uncommon.addRandomEnchanted(TFItems.phantomHelm, 20); - uncommon.addRandomEnchanted(TFItems.phantomPlate, 20); - rare.addRandomEnchanted(TFItems.phantomHelm, 30); - rare.addRandomEnchanted(TFItems.phantomPlate, 30); - } - - if (i == 18) { - // aurora cache - common.add(Items.stick, 12); - common.add(new ItemStack(Items.coal, 12)); - common.add(Items.arrow, 12); - common.add(TFItems.mazeWafer, 9); - common.add(Blocks.ice, 4); - common.add(Blocks.packed_ice, 4); - common.add(TFItems.ironwoodIngot, 2); - - uncommon.add(TFBlocks.auroraBlock, 12); - uncommon.add(TFItems.ironwoodIngot, 6); - uncommon.add(TFBlocks.firefly, 5); - uncommon.add(TFItems.charmOfKeeping1, 1); - uncommon.add(TFItems.arcticFur, 3); - - rare.add(TFItems.arcticFur, 8); - rare.add(TFItems.iceBow, 1); - rare.add(TFItems.enderBow, 1); - rare.add(TFItems.iceSword, 1); - - ultrarare.addEnchantedBook(Enchantment.sharpness, 4); - ultrarare.addEnchantedBook(Enchantment.power, 4); - ultrarare.addEnchantedBook(Enchantment.punch, 2); - ultrarare.addEnchantedBook(Enchantment.unbreaking, 2); - ultrarare.addEnchantedBook(Enchantment.unbreaking, 2); - ultrarare.addEnchantedBook(Enchantment.infinity, 1); - - } - - if (i == 19) { - // aurora treasure - useless.clear(); - - common.add(Blocks.ice, 4); - common.add(Blocks.packed_ice, 4); - common.add(TFItems.mazeWafer, 12); - common.add(TFItems.iceBomb, 4); - common.add(TFBlocks.firefly, 5); - - uncommon.add(TFItems.arcticFur, 6); - uncommon.add(TFItems.arcticLegs, 1); - uncommon.add(TFItems.arcticPlate, 1); - uncommon.add(TFItems.arcticHelm, 1); - uncommon.add(TFItems.arcticBoots, 1); - uncommon.add(TFItems.knightlyPlate, 1); - uncommon.add(TFItems.knightlySword, 1); - uncommon.add(TFItems.charmOfLife1, 1); - - rare.addRandomEnchanted(TFItems.iceBow, 30); - rare.addRandomEnchanted(TFItems.enderBow, 5); - rare.addRandomEnchanted(TFItems.iceSword, 25); - rare.addRandomEnchanted(TFItems.glassSword, 20); - - } - - if (i == 21) { - // troll garden - useless.clear(); - - common.add(Blocks.red_mushroom, 4); - common.add(Blocks.brown_mushroom, 4); - common.add(Items.wheat_seeds, 6); - common.add(Items.carrot, 6); - common.add(Items.potato, 6); - common.add(Items.melon_seeds, 6); - common.add(new ItemStack(Items.dye, 12, 15)); - - uncommon.add(TFBlocks.uberousSoil, 6); - - rare.add(TFItems.magicBeans, 1); - - } - - if (i == 22) { - // troll vault - useless.clear(); - - useless.clear(); - - common.add(Items.coal, 32); - common.add(TFItems.torchberries, 16); - common.add(Items.emerald, 6); - - uncommon.add(TFBlocks.trollSteinn, 6); - uncommon.add(Blocks.obsidian, 6); - - rare.add(TFItems.lampOfCinders, 1); - - } - - } -} diff --git a/src/main/java/twilightforest/TFTreasureItem.java b/src/main/java/twilightforest/TFTreasureItem.java deleted file mode 100644 index d4b9ba2562..0000000000 --- a/src/main/java/twilightforest/TFTreasureItem.java +++ /dev/null @@ -1,80 +0,0 @@ -package twilightforest; - -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; - - -public class TFTreasureItem { - - ItemStack itemStack; - int rarity; - - int randomEnchantmentLevel = 0; - - public TFTreasureItem(Item item) { - this(item, 1, 10); - } - - public TFTreasureItem(Item item, int quantity) { - this(item, quantity, 10); - } - - public TFTreasureItem(Item item, int quantity, int rarity) { - this.itemStack = new ItemStack(item, quantity); - this.rarity = rarity; - } - - public TFTreasureItem(Block block, int quantity, int rarity) { - this.itemStack = new ItemStack(block, quantity); - this.rarity = rarity; - } - - public TFTreasureItem(ItemStack itemStack, int rarity) { - this.itemStack = itemStack.copy(); - this.rarity = rarity; - } - - - /** - * Get a new ItemStack ready for use! - * - * @param rand - * @return - */ - public ItemStack getItemStack(Random rand) { - ItemStack result = this.itemStack.copy(); - result.stackSize = rand.nextInt(result.stackSize) + 1; - - // randomly enchant this item if needed - if (result.isItemEnchantable() && randomEnchantmentLevel > 0) - { - EnchantmentHelper.addRandomEnchantment(rand, result, randomEnchantmentLevel); - } - - return result; - } - - /** - * Returns this items rarity value - * - * @param total - * @return - */ - public int getRarity() { - return rarity; - } - - public int getRandomEnchantmentLevel() { - return randomEnchantmentLevel; - } - - public void setRandomEnchantmentLevel(int randomEnchantmentLevel) { - this.randomEnchantmentLevel = randomEnchantmentLevel; - } -} - - diff --git a/src/main/java/twilightforest/TFTreasureTable.java b/src/main/java/twilightforest/TFTreasureTable.java deleted file mode 100644 index 7e12954bb9..0000000000 --- a/src/main/java/twilightforest/TFTreasureTable.java +++ /dev/null @@ -1,187 +0,0 @@ -package twilightforest; - -import java.util.ArrayList; -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.enchantment.Enchantment; -import net.minecraft.enchantment.EnchantmentData; -import net.minecraft.init.Items; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; - - -/** - * This is not much more than a list of TFTreasureEntries. - * - * @author Ben - * - */ -public class TFTreasureTable { - - private static final int DEFAULT_RARITY = 10; - protected ArrayList list; - - public TFTreasureTable() { - this.list = new ArrayList(); - } - - - /** - * Adds the item onto this list to be generated at normal rarity (10), in the specified quantity - * - * @param item - * @param quantity - */ - public void add(Item item, int quantity) { - this.add(item, quantity, DEFAULT_RARITY); - } - - /** - * Adds the item onto the list, with the values specified - * - * @param item - * @param quantity - * @param rarity - */ - public void add(Item item, int quantity, int rarity) { - list.add(new TFTreasureItem(item, quantity, rarity)); - } - - - /** - * Adds the ItemStack onto this list to be generated at normal rarity (10), in the quantity the itemstack contains - * - * @param itemstack - */ - public void add(ItemStack itemstack) { - list.add(new TFTreasureItem(itemstack, DEFAULT_RARITY)); - } - - /** - * Adds the item at the specified enchantment level - */ - public void addEnchanted(ItemStack itemstack, Enchantment ench1, int enchLevel1) { - itemstack.addEnchantment(ench1, enchLevel1); - list.add(new TFTreasureItem(itemstack, DEFAULT_RARITY)); - } - - /** - * Adds an enchanted book at the specified enchantment level - */ - public void addEnchantedBook(Enchantment ench1, int enchLevel1) { - ItemStack itemstack = Items.enchanted_book.getEnchantedItemStack(new EnchantmentData(ench1, enchLevel1)); - list.add(new TFTreasureItem(itemstack, DEFAULT_RARITY)); - } - - /** - * Adds the item at the specified enchantment level, 2 enchantments - */ - public void addEnchanted(ItemStack itemstack, Enchantment ench1, int enchLevel1, Enchantment ench2, int enchLevel2) { - itemstack.addEnchantment(ench1, enchLevel1); - itemstack.addEnchantment(ench2, enchLevel2); - list.add(new TFTreasureItem(itemstack, DEFAULT_RARITY)); - } - - /** - * Adds the item at the specified enchantment level, 3 enchantments - */ - public void addEnchanted(ItemStack itemstack, Enchantment ench1, int enchLevel1, Enchantment ench2, int enchLevel2, Enchantment ench3, int enchLevel3) { - itemstack.addEnchantment(ench1, enchLevel1); - itemstack.addEnchantment(ench2, enchLevel2); - itemstack.addEnchantment(ench3, enchLevel3); - list.add(new TFTreasureItem(itemstack, DEFAULT_RARITY)); - } - - /** - * Adds the item with a random enchantment level - */ - public void addRandomEnchanted(ItemStack itemstack, int randomLevel) - { - TFTreasureItem treasure = new TFTreasureItem(itemstack, DEFAULT_RARITY); - treasure.setRandomEnchantmentLevel(randomLevel); - list.add(treasure); - } - - /** - * Adds the item with a random enchantment level - */ - public void addRandomEnchanted(Item item, int randomLevel) - { - TFTreasureItem treasure = new TFTreasureItem(item, 1, DEFAULT_RARITY); - treasure.setRandomEnchantmentLevel(randomLevel); - list.add(treasure); - } - - /** - * Adds the block onto this list to be generated at normal rarity (10), in the specified quantity - * - * @param block - * @param quantity - */ - public void add(Block block, int quantity) { - this.add(block, quantity, DEFAULT_RARITY); - } - - - /** - * Adds the block onto the list, with the values specified - * - * @param block - * @param quantity - * @param rarity - */ - public void add(Block block, int quantity, int rarity) { - list.add(new TFTreasureItem(block, quantity, rarity)); - } - - - /** - * What is the total of all the rarity entries in our table? - * - * @return - */ - protected int total() { - int value = 0; - - for (TFTreasureItem item : list) { - value += item.getRarity(); - } - - return value; - } - - public ItemStack getRandomItem(Random rand) { - - int value = rand.nextInt(total()); - - for (TFTreasureItem item : list) { - if (item.getRarity() > value) { - return item.getItemStack(rand); - } - else - { - value -= item.getRarity(); - } - } - - // we should not actually get here - return null; - } - - /** - * Is this table empty - */ - public boolean isEmpty() - { - return list.isEmpty(); - } - - /** - * Clear this list - */ - public void clear() - { - list.clear(); - } -} diff --git a/src/main/java/twilightforest/TwilightForestMod.java b/src/main/java/twilightforest/TwilightForestMod.java index dd13d71241..e41f2ab0c9 100644 --- a/src/main/java/twilightforest/TwilightForestMod.java +++ b/src/main/java/twilightforest/TwilightForestMod.java @@ -1,823 +1,243 @@ package twilightforest; -import com.google.common.base.Function; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockDispenser; -import net.minecraft.block.BlockSlab; -import net.minecraft.entity.Entity; -import net.minecraft.init.Items; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.server.MinecraftServer; -import net.minecraftforge.common.AchievementPage; -import net.minecraftforge.common.DimensionManager; +import com.google.common.collect.Maps; +import net.minecraft.ChatFormatting; +import net.minecraft.core.Registry; +import net.minecraft.core.cauldron.CauldronInteraction; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.packs.PackType; +import net.minecraft.server.packs.PathPackResources; +import net.minecraft.server.packs.repository.Pack; +import net.minecraft.server.packs.repository.PackSource; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.item.AxeItem; +import net.minecraft.world.item.Rarity; +import net.minecraft.world.level.GameRules; +import net.minecraft.world.level.Level; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.common.ForgeConfigSpec; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.common.config.Configuration; -import net.minecraftforge.oredict.OreDictionary; -import twilightforest.biomes.TFBiomeBase; -import twilightforest.block.BlockTFAuroraBrick; -import twilightforest.block.BlockTFAuroraPillar; -import twilightforest.block.BlockTFAuroraSlab; -import twilightforest.block.BlockTFBurntThorns; -import twilightforest.block.BlockTFCastleBlock; -import twilightforest.block.BlockTFCastleMagic; -import twilightforest.block.BlockTFDarkLeaves; -import twilightforest.block.BlockTFDeadrock; -import twilightforest.block.BlockTFFluffyCloud; -import twilightforest.block.BlockTFForceField; -import twilightforest.block.BlockTFGiantCobble; -import twilightforest.block.BlockTFGiantLeaves; -import twilightforest.block.BlockTFGiantLog; -import twilightforest.block.BlockTFGiantObsidian; -import twilightforest.block.BlockTFHugeGloomBlock; -import twilightforest.block.BlockTFHugeLilyPad; -import twilightforest.block.BlockTFHugeStalk; -import twilightforest.block.BlockTFHugeWaterLily; -import twilightforest.block.BlockTFKnightmetalBlock; -import twilightforest.block.BlockTFLeaves3; -import twilightforest.block.BlockTFRipeTorchCluster; -import twilightforest.block.BlockTFShield; -import twilightforest.block.BlockTFSlider; -import twilightforest.block.BlockTFThornRose; -import twilightforest.block.BlockTFThorns; -import twilightforest.block.BlockTFTrollRoot; -import twilightforest.block.BlockTFTrollSteinn; -import twilightforest.block.BlockTFTrophy; -import twilightforest.block.BlockTFTrophyPedestal; -import twilightforest.block.BlockTFUberousSoil; -import twilightforest.block.BlockTFUnderBrick; -import twilightforest.block.BlockTFUnripeTorchCluster; -import twilightforest.block.BlockTFWispyCloud; -import twilightforest.block.TFBlocks; -import twilightforest.entity.TFCreatures; -import twilightforest.item.BehaviorTFMobEggDispense; -import twilightforest.item.ItemTFMagicMap; -import twilightforest.item.ItemTFMazeMap; -import twilightforest.item.TFItems; -import twilightforest.item.TFRecipes; -import twilightforest.structures.StructureTFMajorFeatureStart; -import twilightforest.tileentity.TileEntityTFCReactorActive; -import twilightforest.tileentity.TileEntityTFCicada; -import twilightforest.tileentity.TileEntityTFCinderFurnace; -import twilightforest.tileentity.TileEntityTFFirefly; -import twilightforest.tileentity.TileEntityTFFlameJet; -import twilightforest.tileentity.TileEntityTFGhastTrapActive; -import twilightforest.tileentity.TileEntityTFGhastTrapInactive; -import twilightforest.tileentity.TileEntityTFHydraSpawner; -import twilightforest.tileentity.TileEntityTFKnightPhantomsSpawner; -import twilightforest.tileentity.TileEntityTFLichSpawner; -import twilightforest.tileentity.TileEntityTFMoonworm; -import twilightforest.tileentity.TileEntityTFNagaSpawner; -import twilightforest.tileentity.TileEntityTFPoppingJet; -import twilightforest.tileentity.TileEntityTFReverter; -import twilightforest.tileentity.TileEntityTFSmoker; -import twilightforest.tileentity.TileEntityTFSnowQueenSpawner; -import twilightforest.tileentity.TileEntityTFTowerBossSpawner; -import twilightforest.tileentity.TileEntityTFTowerBuilder; -import twilightforest.tileentity.TileEntityTFTrophy; -import twilightforest.world.WorldProviderTwilightForest; -import cpw.mods.fml.common.FMLCommonHandler; -import cpw.mods.fml.common.FMLLog; -import cpw.mods.fml.common.Loader; -import cpw.mods.fml.common.Mod; -import cpw.mods.fml.common.ModContainer; -import cpw.mods.fml.common.Mod.EventHandler; -import cpw.mods.fml.common.Mod.Instance; -import cpw.mods.fml.common.SidedProxy; -import cpw.mods.fml.common.event.FMLInitializationEvent; -import cpw.mods.fml.common.event.FMLPostInitializationEvent; -import cpw.mods.fml.common.event.FMLPreInitializationEvent; -import cpw.mods.fml.common.event.FMLServerStartingEvent; -import cpw.mods.fml.common.network.FMLEventChannel; -import cpw.mods.fml.common.network.NetworkRegistry; -import cpw.mods.fml.common.network.internal.FMLMessage.EntitySpawnMessage; -import cpw.mods.fml.common.registry.EntityRegistry; -import cpw.mods.fml.common.registry.GameRegistry; -import cpw.mods.fml.common.registry.EntityRegistry.EntityRegistration; -import thaumcraft.api.*; -import thaumcraft.api.aspects.Aspect; -import thaumcraft.api.aspects.AspectList; - -@Mod(modid = TwilightForestMod.ID, name = "The Twilight Forest", version = TwilightForestMod.VERSION) +import net.minecraftforge.event.AddPackFindersEvent; +import net.minecraftforge.event.RegisterCommandsEvent; +import net.minecraftforge.eventbus.api.IEventBus; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.*; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.config.ModConfig; +import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; +import net.minecraftforge.fml.event.lifecycle.InterModEnqueueEvent; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.registries.DataPackRegistryEvent; +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.registries.RegisterEvent; +import org.apache.commons.lang3.tuple.Pair; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import twilightforest.advancements.TFAdvancements; +import twilightforest.capabilities.CapabilityList; +import twilightforest.client.ClientInitiator; +import twilightforest.command.TFCommand; +import twilightforest.compat.curios.CuriosCompat; +import twilightforest.compat.top.TopCompat; +import twilightforest.data.custom.stalactites.entry.Stalactite; +import twilightforest.dispenser.TFDispenserBehaviors; +import twilightforest.init.*; +import twilightforest.init.custom.*; +import twilightforest.network.TFPacketHandler; +import twilightforest.util.WoodPalette; +import twilightforest.world.components.BiomeGrassColors; +import twilightforest.world.components.biomesources.LandmarkBiomeSource; +import twilightforest.world.components.biomesources.TFBiomeProvider; +import twilightforest.world.components.chunkgenerators.ChunkGeneratorTwilight; +import twilightforest.init.TFStructureProcessors; + +import java.util.Locale; +import java.util.Objects; + +@Mod(TwilightForestMod.ID) +@Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD) public class TwilightForestMod { - - public static final String ID = "TwilightForest"; - public static final String VERSION = "2.3.8dev"; - - public static final String MODEL_DIR = "twilightforest:textures/model/"; - public static final String GUI_DIR = "twilightforest:textures/gui/"; - public static final String ENVRIO_DIR = "twilightforest:textures/environment/"; - public static final String ARMOR_DIR = "twilightforest:textures/armor/"; - public static final String ENFORCED_PROGRESSION_RULE = "tfEnforcedProgression"; - - public static final int GUI_ID_UNCRAFTING = 1; - public static final int GUI_ID_FURNACE = 2; - - - public static int dimensionID; - public static int backupdimensionID = -777; - public static int dimensionProviderID; - - // misc options - public static boolean creatureCompatibility; - public static boolean silentCicadas; - public static boolean allowPortalsInOtherDimensions; - public static boolean adminOnlyPortals; - public static String twilightForestSeed; - public static boolean disablePortalCreation; - public static boolean disableUncrafting; - public static boolean oldMapGen; - public static String portalCreationItemString; - - // performance - public static float canopyCoverage; - public static int twilightOakChance; - - public static int idMobWildBoar; - public static int idMobBighornSheep; - public static int idMobWildDeer; - public static int idMobRedcap; - public static int idMobSwarmSpider; - public static int idMobNaga; - public static int idMobNagaSegment; - public static int idMobSkeletonDruid; - public static int idMobHostileWolf; - public static int idMobTwilightWraith; - public static int idMobHedgeSpider; - public static int idMobHydra; - public static int idMobLich; - public static int idMobPenguin; - public static int idMobLichMinion; - public static int idMobLoyalZombie; - public static int idMobTinyBird; - public static int idMobSquirrel; - public static int idMobBunny; - public static int idMobRaven; - public static int idMobQuestRam; - public static int idMobKobold; - public static int idMobBoggard; - public static int idMobMosquitoSwarm; - public static int idMobDeathTome; - public static int idMobMinotaur; - public static int idMobMinoshroom; - public static int idMobFireBeetle; - public static int idMobSlimeBeetle; - public static int idMobPinchBeetle; - public static int idMobMazeSlime; - public static int idMobRedcapSapper; - public static int idMobMistWolf; - public static int idMobKingSpider; - public static int idMobFirefly; - public static int idMobMiniGhast; - public static int idMobTowerGhast; - public static int idMobTowerGolem; - public static int idMobTowerTermite; - public static int idMobTowerBroodling; - public static int idMobTowerBoss; - public static int idMobBlockGoblin; - public static int idMobGoblinKnightUpper; - public static int idMobGoblinKnightLower; - public static int idMobHelmetCrab; - public static int idMobKnightPhantom; - public static int idMobYeti; - public static int idMobYetiBoss; - public static int idMobWinterWolf; - public static int idMobSnowGuardian; - public static int idMobStableIceCore; - public static int idMobUnstableIceCore; - public static int idMobSnowQueen; - public static int idMobTroll; - public static int idMobGiantMiner; - public static int idMobArmoredGiant; - public static int idMobIceCrystal; - public static int idMobHarbingerCube; - public static int idMobAdherent; - public static int idMobRovingCube; - - public static int idVehicleSpawnNatureBolt = 1; // non-configurable, since there's no way for them to conflict with anything - public static int idVehicleSpawnLichBolt = 2; - public static int idVehicleSpawnTwilightWandBolt = 3; - public static int idVehicleSpawnTomeBolt = 4; - public static int idVehicleSpawnHydraMortar = 5; - public static int idVehicleSpawnLichBomb = 6; - public static int idVehicleSpawnMoonwormShot = 7; - public static int idVehicleSpawnSlimeBlob = 8; - public static int idVehicleSpawnCharmEffect = 9; - public static int idVehicleSpawnThrownAxe = 10; - public static int idVehicleSpawnThrownPick = 13; - public static int idVehicleSpawnFallingIce = 14; - public static int idVehicleSpawnThrownIce = 15; - public static int idVehicleSpawnSeekerArrow = 16; - public static int idVehicleSpawnIceSnowball = 17; - public static int idVehicleSpawnChainBlock = 18; - public static int idVehicleSpawnCubeOfAnnihilation = 19; - public static int idVehicleSpawnSlideBlock = 20; - - public static int idBiomeLake; - public static int idBiomeTwilightForest; - public static int idBiomeTwilightForestVariant; - public static int idBiomeHighlands; - public static int idBiomeMushrooms; - public static int idBiomeSwamp; - public static int idBiomeStream; - public static int idBiomeSnowfield; - public static int idBiomeGlacier; - public static int idBiomeClearing; - public static int idBiomeOakSavanna; - public static int idBiomeFireflyForest; - public static int idBiomeDeepMushrooms; - public static int idBiomeDarkForestCenter; - public static int idBiomeHighlandsCenter; - public static int idBiomeDarkForest; - public static int idBiomeEnchantedForest; - public static int idBiomeFireSwamp; - public static int idBiomeThornlands; - - // used to report conflicts - public static boolean hasBiomeIdConflicts = false; - public static boolean hasAssignedBiomeID = false; - - public static final TFEventListener eventListener = new TFEventListener(); - public static final TFTickHandler tickHandler = new TFTickHandler(); - public static FMLEventChannel genericChannel; - - - @Instance(ID) - public static TwilightForestMod instance; - - @SidedProxy(clientSide = "twilightforest.client.TFClientProxy", serverSide = "twilightforest.TFCommonProxy") - public static TFCommonProxy proxy; - - public TwilightForestMod() - { - TwilightForestMod.instance = this; - } - - @EventHandler - public void preInit(FMLPreInitializationEvent event) { - // load config - Configuration config = new Configuration(event.getSuggestedConfigurationFile()); - loadConfiguration(config); - // sounds on client, and whatever else needs to be registered pre-load - proxy.doPreLoadRegistration(); - - // initialize & register blocks - TFBlocks.registerBlocks(); - - // items - TFItems.registerItems(); - - // cheevos! - AchievementPage.registerAchievementPage(new TFAchievementPage()); - - // just call this so that we register structure IDs correctly - new StructureTFMajorFeatureStart(); - - - // check for biome conflicts, load biomes - TFBiomeBase.assignBlankBiomeIds(); - if (TwilightForestMod.hasAssignedBiomeID) { - FMLLog.info("[TwilightForest] Twilight Forest mod has auto-assigned some biome IDs. This will break any existing Twilight Forest saves."); - saveBiomeIds(config); - } - TwilightForestMod.hasBiomeIdConflicts = TFBiomeBase.areThereBiomeIdConflicts(); - } - @EventHandler - public void load(FMLInitializationEvent evt) { - - // creatures - registerCreatures(); - - // recipes - TFRecipes.registerRecipes(); - - // tile entities - registerTileEntities(); - // GUI - NetworkRegistry.INSTANCE.registerGuiHandler(instance, proxy); - - // event listener, for those events that seem worth listening to - MinecraftForge.EVENT_BUS.register(eventListener); - FMLCommonHandler.instance().bus().register(eventListener); // we're getting events off this bus too - - // tick listener - FMLCommonHandler.instance().bus().register(tickHandler); - - // set up portal item - Item portalItem; - if (Item.itemRegistry.containsKey(portalCreationItemString)) { - portalItem = (Item) Item.itemRegistry.getObject(portalCreationItemString); - if (portalItem != Items.diamond) { - FMLLog.info("Set Twilight Forest portal item to %s", portalItem.getUnlocalizedName()); - } - } else if (Block.blockRegistry.containsKey(portalCreationItemString)) { - portalItem = Item.getItemFromBlock((Block) Block.blockRegistry.getObject(portalCreationItemString)); - FMLLog.info("Set Twilight Forest portal item to %s", portalItem.getUnlocalizedName()); - } else { - FMLLog.info("Twilight Forest config lists portal item as '%s'. Not found, defaulting to diamond.", portalCreationItemString); - portalItem = Items.diamond; - } - tickHandler.portalItem = portalItem; - - // make some channels for our maps - TFMapPacketHandler mapPacketHandler = new TFMapPacketHandler(); - NetworkRegistry.INSTANCE.newEventDrivenChannel(ItemTFMagicMap.STR_ID).register(mapPacketHandler); - NetworkRegistry.INSTANCE.newEventDrivenChannel(ItemTFMazeMap.STR_ID).register(mapPacketHandler); - - // generic channel that handles biome change packets, but could handle some other stuff in the future - TwilightForestMod.genericChannel = NetworkRegistry.INSTANCE.newEventDrivenChannel(TwilightForestMod.ID); - - // render and other client stuff - proxy.doOnLoadRegistration(); - - // dimension provider - DimensionManager.registerProviderType(TwilightForestMod.dimensionProviderID, WorldProviderTwilightForest.class, false); - - // enter biomes into dictionary - TFBiomeBase.registerWithBiomeDictionary(); - } - - /** - * Post init - */ - @EventHandler - public void postInit(FMLPostInitializationEvent evt) - { - // register dimension with Forge - if (!DimensionManager.isDimensionRegistered(TwilightForestMod.dimensionID)) - { - DimensionManager.registerDimension(TwilightForestMod.dimensionID, TwilightForestMod.dimensionProviderID); - } - else + public static final String ID = "twilightforest"; + public static final String REGISTRY_NAMESPACE = "twilight"; + + private static final String MODEL_DIR = "textures/model/"; + private static final String GUI_DIR = "textures/gui/"; + private static final String ENVIRO_DIR = "textures/environment/"; + // odd one out, as armor textures are a stringy mess at present + public static final String ARMOR_DIR = ID + ":textures/armor/"; + + public static final GameRules.Key ENFORCED_PROGRESSION_RULE = GameRules.register("tfEnforcedProgression", GameRules.Category.UPDATES, GameRules.BooleanValue.create(true)); //Putting it in UPDATES since other world stuff is here + + public static final Logger LOGGER = LogManager.getLogger(ID); + + private static final Rarity rarity = Rarity.create("TWILIGHT", ChatFormatting.DARK_GREEN); + + public TwilightForestMod() { { - FMLLog.warning("[TwilightForest] Twilight Forest detected that the configured dimension id '%d' is being used. Using backup ID. It is recommended that you configure this mod to use a unique dimension ID.", dimensionID); - DimensionManager.registerDimension(TwilightForestMod.backupdimensionID, TwilightForestMod.dimensionProviderID); - TwilightForestMod.dimensionID = TwilightForestMod.backupdimensionID; + final Pair specPair = new ForgeConfigSpec.Builder().configure(TFConfig.Common::new); + ModLoadingContext.get().registerConfig(ModConfig.Type.COMMON, specPair.getRight()); + TFConfig.COMMON_CONFIG = specPair.getLeft(); } - - // thaumcraft integration - if (Loader.isModLoaded("Thaumcraft")) { - registerThaumcraftIntegration(); + final Pair specPair = new ForgeConfigSpec.Builder().configure(TFConfig.Client::new); + ModLoadingContext.get().registerConfig(ModConfig.Type.CLIENT, specPair.getRight()); + TFConfig.CLIENT_CONFIG = specPair.getLeft(); } - else - { - FMLLog.info("[TwilightForest] Did not find Thaumcraft, did not load ThaumcraftApi integration."); + + DistExecutor.safeRunWhenOn(Dist.CLIENT, () -> ClientInitiator::call); + MinecraftForge.EVENT_BUS.addListener(this::registerCommands); + MinecraftForge.EVENT_BUS.addGenericListener(Level.class, CapabilityList::attachLevelCapability); + MinecraftForge.EVENT_BUS.addGenericListener(Entity.class, CapabilityList::attachEntityCapability); + MinecraftForge.EVENT_BUS.addListener(Stalactite::reloadStalactites); + + IEventBus modbus = FMLJavaModLoadingContext.get().getModEventBus(); + + TFBannerPatterns.BANNER_PATTERNS.register(modbus); + TFBlockEntities.BLOCK_ENTITIES.register(modbus); + TFBlocks.BLOCKS.register(modbus); + TFLoot.CONDITIONS.register(modbus); + TFMenuTypes.CONTAINERS.register(modbus); + TFEnchantments.ENCHANTMENTS.register(modbus); + TFEntities.ENTITIES.register(modbus); + BiomeLayerTypes.BIOME_LAYER_TYPES.register(modbus); + BiomeLayerStack.BIOME_LAYER_STACKS.register(modbus); + TFFeatures.FEATURES.register(modbus); + TFFeatureModifiers.FOLIAGE_PLACERS.register(modbus); + TFLoot.FUNCTIONS.register(modbus); + TFItems.ITEMS.register(modbus); + TFLootModifiers.LOOT_MODIFIERS.register(modbus); + TFMobEffects.MOB_EFFECTS.register(modbus); + TFParticleType.PARTICLE_TYPES.register(modbus); + TFPOITypes.POIS.register(modbus); + TFFeatureModifiers.PLACEMENT_MODIFIERS.register(modbus); + TFRecipes.RECIPE_SERIALIZERS.register(modbus); + TFRecipes.RECIPE_TYPES.register(modbus); + TFSounds.SOUNDS.register(modbus); + TFEntities.SPAWN_EGGS.register(modbus); + TFStats.STATS.register(modbus); + TFStructurePieceTypes.STRUCTURE_PIECE_TYPES.register(modbus); + TFStructureProcessors.STRUCTURE_PROCESSORS.register(modbus); + TFStructurePlacementTypes.STRUCTURE_PLACEMENT_TYPES.register(modbus); + TFStructureTypes.STRUCTURE_TYPES.register(modbus); + TFFeatureModifiers.TREE_DECORATORS.register(modbus); + TFFeatureModifiers.TRUNK_PLACERS.register(modbus); + + DwarfRabbitVariant.DWARF_RABBITS.register(modbus); + TinyBirdVariant.TINY_BIRDS.register(modbus); + WoodPalettes.WOOD_PALETTES.register(modbus); + + modbus.addListener(this::sendIMCs); + modbus.addListener(CapabilityList::registerCapabilities); + + if (ModList.get().isLoaded("curios")) { + Bindings.getForgeBus().get().addListener(CuriosCompat::keepCurios); } - - // final check for biome ID conflicts - TwilightForestMod.hasBiomeIdConflicts = TFBiomeBase.areThereBiomeIdConflicts(); - } - - @EventHandler - public void startServer(FMLServerStartingEvent event) - { - // dispenser behaviors - registerDispenseBehaviors(event.getServer()); - - //event.registerServerCommand(new CommandTFFeature()); - event.registerServerCommand(new CommandTFProgress()); - } - private void registerCreatures() { - TFCreatures.registerTFCreature(twilightforest.entity.passive.EntityTFBoar.class, "Wild Boar", idMobWildBoar, 0x83653b, 0xffefca); - TFCreatures.registerTFCreature(twilightforest.entity.passive.EntityTFBighorn.class, "Bighorn Sheep", idMobBighornSheep, 0xdbceaf, 0xd7c771); - TFCreatures.registerTFCreature(twilightforest.entity.passive.EntityTFDeer.class, "Wild Deer", idMobWildDeer, 0x7b4d2e, 0x4b241d); - - TFCreatures.registerTFCreature(twilightforest.entity.EntityTFRedcap.class, "Redcap", idMobRedcap, 0x3b3a6c, 0xab1e14); - TFCreatures.registerTFCreature(twilightforest.entity.EntityTFSwarmSpider.class, "Swarm Spider", idMobSwarmSpider, 0x32022e, 0x17251e); - TFCreatures.registerTFCreature(twilightforest.entity.boss.EntityTFNaga.class, "Naga", idMobNaga, 0xa4d316, 0x1b380b); - //TFCreatures.registerTFCreature(twilightforest.entity.EntityTFNagaSegmentOld.class, "Naga Segment", idMobNagaSegment); // no longer needed, regenerated instantly as required - TFCreatures.registerTFCreature(twilightforest.entity.EntityTFSkeletonDruid.class, "Skeleton Druid", idMobSkeletonDruid, 0xa3a3a3, 0x2a3b17); - TFCreatures.registerTFCreature(twilightforest.entity.EntityTFHostileWolf.class, "Hostile Wolf", idMobHostileWolf, 0xd7d3d3, 0xab1e14); - TFCreatures.registerTFCreature(twilightforest.entity.EntityTFWraith.class, "Twilight Wraith", idMobTwilightWraith, 0x505050, 0x838383); - TFCreatures.registerTFCreature(twilightforest.entity.EntityTFHedgeSpider.class, "Hedge Spider", idMobHedgeSpider, 0x235f13, 0x562653); - TFCreatures.registerTFCreature(twilightforest.entity.boss.EntityTFHydra.class, "Hydra", idMobHydra, 0x142940, 0x29806b); - TFCreatures.registerTFCreature(twilightforest.entity.boss.EntityTFLich.class, "Twilight Lich", idMobLich, 0xaca489, 0x360472); - TFCreatures.registerTFCreature(twilightforest.entity.passive.EntityTFPenguin.class, "Glacier Penguin", idMobPenguin, 0x12151b, 0xf9edd2); - TFCreatures.registerTFCreature(twilightforest.entity.boss.EntityTFLichMinion.class, "Lich Minion", idMobLichMinion); - TFCreatures.registerTFCreature(twilightforest.entity.EntityTFLoyalZombie.class, "Loyal Zombie", idMobLoyalZombie); - TFCreatures.registerTFCreature(twilightforest.entity.passive.EntityTFTinyBird.class, "Tiny Bird", idMobTinyBird, 0x33aadd, 0x1188ee); - TFCreatures.registerTFCreature(twilightforest.entity.passive.EntityTFSquirrel.class, "Forest Squirrel", idMobSquirrel, 0x904f12, 0xeeeeee); - TFCreatures.registerTFCreature(twilightforest.entity.passive.EntityTFBunny.class, "Forest Bunny", idMobBunny, 0xfefeee, 0xccaa99); - TFCreatures.registerTFCreature(twilightforest.entity.passive.EntityTFRaven.class, "Forest Raven", idMobRaven, 0x000011, 0x222233); - TFCreatures.registerTFCreature(twilightforest.entity.passive.EntityTFQuestRam.class, "Questing Ram", idMobQuestRam); - TFCreatures.registerTFCreature(twilightforest.entity.EntityTFKobold.class, "Twilight Kobold", idMobKobold, 0x372096, 0x895d1b); - //TFCreatures.registerTFCreature(twilightforest.entity.EntityTFBoggard.class, "Boggard", idMobBoggard); - TFCreatures.registerTFCreature(twilightforest.entity.EntityTFMosquitoSwarm.class, "Mosquito Swarm", idMobMosquitoSwarm, 0x080904, 0x2d2f21); - TFCreatures.registerTFCreature(twilightforest.entity.EntityTFDeathTome.class, "Death Tome", idMobDeathTome, 0x774e22, 0xdbcdbe); - TFCreatures.registerTFCreature(twilightforest.entity.EntityTFMinotaur.class, "Minotaur", idMobMinotaur, 0x3f3024, 0xaa7d66); - TFCreatures.registerTFCreature(twilightforest.entity.boss.EntityTFMinoshroom.class, "Minoshroom", idMobMinoshroom, 0xa81012, 0xaa7d66); - TFCreatures.registerTFCreature(twilightforest.entity.EntityTFFireBeetle.class, "Fire Beetle", idMobFireBeetle, 0x1d0b00, 0xcb6f25); - TFCreatures.registerTFCreature(twilightforest.entity.EntityTFSlimeBeetle.class, "Slime Beetle", idMobSlimeBeetle, 0x0c1606, 0x60a74c); - TFCreatures.registerTFCreature(twilightforest.entity.EntityTFPinchBeetle.class, "Pinch Beetle", idMobPinchBeetle, 0xbc9327, 0x241609); - TFCreatures.registerTFCreature(twilightforest.entity.EntityTFMazeSlime.class, "Maze Slime", idMobMazeSlime, 0xa3a3a3, 0x2a3b17); - TFCreatures.registerTFCreature(twilightforest.entity.EntityTFRedcapSapper.class, "Redcap Sapper", idMobRedcapSapper, 0x575d21, 0xab1e14); - TFCreatures.registerTFCreature(twilightforest.entity.EntityTFMistWolf.class, "Mist Wolf", idMobMistWolf, 0x3a1411, 0xe2c88a); - TFCreatures.registerTFCreature(twilightforest.entity.EntityTFKingSpider.class, "King Spider", idMobKingSpider, 0x2c1a0e, 0xffc017); - TFCreatures.registerTFCreature(twilightforest.entity.passive.EntityTFMobileFirefly.class, "Firefly", idMobFirefly, 0xa4d316, 0xbaee02); - TFCreatures.registerTFCreature(twilightforest.entity.EntityTFMiniGhast.class, "Mini Ghast", idMobMiniGhast, 0xbcbcbc, 0xa74343); - TFCreatures.registerTFCreature(twilightforest.entity.EntityTFTowerGhast.class, "Tower Ghast", idMobTowerGhast, 0xbcbcbc, 0xb77878); - TFCreatures.registerTFCreature(twilightforest.entity.EntityTFTowerGolem.class, "Tower Golem", idMobTowerGolem, 0x6b3d20, 0xe2ddda); - TFCreatures.registerTFCreature(twilightforest.entity.EntityTFTowerTermite.class, "Tower Termite", idMobTowerTermite, 0x5d2b21, 0xaca03a); - TFCreatures.registerTFCreature(twilightforest.entity.EntityTFTowerBroodling.class, "Redscale Broodling", idMobTowerBroodling, 0x343c14, 0xbaee02); - TFCreatures.registerTFCreature(twilightforest.entity.boss.EntityTFUrGhast.class, "Tower Boss", idMobTowerBoss, 0xbcbcbc, 0xb77878); - TFCreatures.registerTFCreature(twilightforest.entity.EntityTFBlockGoblin.class, "Block&Chain Goblin", idMobBlockGoblin, 0xd3e7bc, 0x1f3fff); - TFCreatures.registerTFCreature(twilightforest.entity.EntityTFGoblinKnightUpper.class, "Upper Goblin Knight", idMobGoblinKnightUpper); - TFCreatures.registerTFCreature(twilightforest.entity.EntityTFGoblinKnightLower.class, "Lower Goblin Knight", idMobGoblinKnightLower, 0x566055, 0xd3e7bc); - TFCreatures.registerTFCreature(twilightforest.entity.EntityTFHelmetCrab.class, "Helmet Crab", idMobHelmetCrab, 0xfb904b, 0xd3e7bc); - TFCreatures.registerTFCreature(twilightforest.entity.boss.EntityTFKnightPhantom.class, "Knight Phantom", idMobKnightPhantom, 0xa6673b, 0xd3e7bc); - TFCreatures.registerTFCreature(twilightforest.entity.EntityTFYeti.class, "Yeti", idMobYeti, 0xdedede, 0x4675bb); - TFCreatures.registerTFCreature(twilightforest.entity.boss.EntityTFYetiAlpha.class, "Yeti Boss", idMobYetiBoss, 0xcdcdcd, 0x29486e); - TFCreatures.registerTFCreature(twilightforest.entity.EntityTFWinterWolf.class, "WinterWolf", idMobWinterWolf, 0xdfe3e5, 0xb2bcca); - TFCreatures.registerTFCreature(twilightforest.entity.EntityTFSnowGuardian.class, "SnowGuardian", idMobSnowGuardian, 0xd3e7bc, 0xfefefe); - TFCreatures.registerTFCreature(twilightforest.entity.EntityTFIceShooter.class, "Stable Ice Core", idMobStableIceCore, 0xa1bff3, 0x7000f8); - TFCreatures.registerTFCreature(twilightforest.entity.EntityTFIceExploder.class, "Unstable Ice Core", idMobUnstableIceCore, 0x9aacf5, 0x9b0fa5); - TFCreatures.registerTFCreature(twilightforest.entity.boss.EntityTFSnowQueen.class, "Snow Queen", idMobSnowQueen, 0xb1b2d4, 0x87006e); - TFCreatures.registerTFCreature(twilightforest.entity.EntityTFTroll.class, "Troll", idMobTroll, 0x9ea98f, 0xb0948e); - TFCreatures.registerTFCreature(twilightforest.entity.EntityTFGiantMiner.class, "Giant Miner", idMobGiantMiner, 0x211b52, 0x9a9a9a); - TFCreatures.registerTFCreature(twilightforest.entity.EntityTFArmoredGiant.class, "Armored Giant", idMobArmoredGiant, 0x239391, 0x9a9a9a); - TFCreatures.registerTFCreature(twilightforest.entity.boss.EntityTFIceCrystal.class, "Ice Crystal", idMobIceCrystal, 0xdce9fe, 0xadcafb); - TFCreatures.registerTFCreature(twilightforest.entity.EntityTFHarbingerCube.class, "Harbinger Cube", idMobHarbingerCube, 0x00000a, 0x8b0000); - TFCreatures.registerTFCreature(twilightforest.entity.EntityTFAdherent.class, "Adherent", idMobAdherent, 0x0a0000, 0x00008b); - TFCreatures.registerTFCreature(twilightforest.entity.EntityTFRovingCube.class, "RovingCube", idMobRovingCube, 0x0a0000, 0x00009b); - - EntityRegistry.registerModEntity(twilightforest.entity.boss.EntityTFHydraHead.class, "HydraHead", 11, this, 150, 3, false); - - EntityRegistry.registerModEntity(twilightforest.entity.EntityTFNatureBolt.class, "tfnaturebolt", idVehicleSpawnNatureBolt, this, 150, 5, true); - EntityRegistry.registerModEntity(twilightforest.entity.boss.EntityTFLichBolt.class, "tflichbolt", idVehicleSpawnLichBolt, this, 150, 2, true); - EntityRegistry.registerModEntity(twilightforest.entity.EntityTFTwilightWandBolt.class, "tftwilightwandbolt", idVehicleSpawnTwilightWandBolt, this, 150, 5, true); - EntityRegistry.registerModEntity(twilightforest.entity.EntityTFTomeBolt.class, "tftomebolt", idVehicleSpawnTomeBolt, this, 150, 5, true); - EntityRegistry.registerModEntity(twilightforest.entity.boss.EntityTFHydraMortar.class, "tfhydramortar", idVehicleSpawnHydraMortar, this, 150, 3, true); - EntityRegistry.registerModEntity(twilightforest.entity.boss.EntityTFLichBomb.class, "tflichbomb", idVehicleSpawnLichBomb, this, 150, 3, true); - EntityRegistry.registerModEntity(twilightforest.entity.EntityTFMoonwormShot.class, "tfmoonwormshot", idVehicleSpawnMoonwormShot, this, 150, 3, true); - EntityRegistry.registerModEntity(twilightforest.entity.EntityTFSlimeProjectile.class, "tfslimeblob", idVehicleSpawnSlimeBlob, this, 150, 3, true); - EntityRegistry.registerModEntity(twilightforest.entity.EntityTFCharmEffect.class, "tfcharmeffect", idVehicleSpawnCharmEffect, this, 80, 3, true); - EntityRegistry.registerModEntity(twilightforest.entity.boss.EntityTFThrownAxe.class, "tfthrownaxe", idVehicleSpawnThrownAxe, this, 80, 3, true); - EntityRegistry.registerModEntity(twilightforest.entity.boss.EntityTFThrownPick.class, "tfthrownpick", idVehicleSpawnThrownPick, this, 80, 3, true); - EntityRegistry.registerModEntity(twilightforest.entity.boss.EntityTFFallingIce.class, "tffallingice", idVehicleSpawnFallingIce, this, 80, 3, true); - EntityRegistry.registerModEntity(twilightforest.entity.boss.EntityTFIceBomb.class, "tfthrownice", idVehicleSpawnThrownIce, this, 80, 2, true); - EntityRegistry.registerModEntity(twilightforest.entity.EntitySeekerArrow.class, "tfSeekerArrow", idVehicleSpawnSeekerArrow, this, 150, 1, true); - EntityRegistry.registerModEntity(twilightforest.entity.EntityTFIceSnowball.class, "tficesnowball", idVehicleSpawnIceSnowball, this, 150, 3, true); - EntityRegistry.registerModEntity(twilightforest.entity.EntityTFChainBlock.class, "tfchainBlock", idVehicleSpawnChainBlock, this, 80, 1, true); - EntityRegistry.registerModEntity(twilightforest.entity.EntityTFCubeOfAnnihilation.class, "tfcubeannihilation", this.idVehicleSpawnCubeOfAnnihilation, this, 80, 1, true); - EntityRegistry.registerModEntity(twilightforest.entity.EntityTFSlideBlock.class, "tfslideblock", this.idVehicleSpawnSlideBlock, this, 80, 1, true); + BiomeGrassColors.init(); + } + @SubscribeEvent + public static void setRegistriesForDatapack(DataPackRegistryEvent.NewRegistry event) { + event.dataPackRegistry(WoodPalettes.WOOD_PALETTE_TYPE_KEY, WoodPalette.CODEC); + event.dataPackRegistry(BiomeLayerStack.BIOME_STACK_KEY, BiomeLayerStack.DISPATCH_CODEC); } - - - private void registerTileEntities() { - GameRegistry.registerTileEntity(TileEntityTFFirefly.class, "Firefly"); - GameRegistry.registerTileEntity(TileEntityTFCicada.class, "Cicada"); - GameRegistry.registerTileEntity(TileEntityTFNagaSpawner.class, "Naga Spawner"); - GameRegistry.registerTileEntity(TileEntityTFLichSpawner.class, "Lich Spawner"); - GameRegistry.registerTileEntity(TileEntityTFHydraSpawner.class, "Hydra Spawner"); - GameRegistry.registerTileEntity(TileEntityTFSmoker.class, "Swamp Smoker"); - GameRegistry.registerTileEntity(TileEntityTFPoppingJet.class, "Popping Flame Jet"); - GameRegistry.registerTileEntity(TileEntityTFFlameJet.class, "Lit Flame Jet"); - GameRegistry.registerTileEntity(TileEntityTFMoonworm.class, "Moonworm"); - GameRegistry.registerTileEntity(TileEntityTFTowerBuilder.class, "Tower Builder"); - GameRegistry.registerTileEntity(TileEntityTFReverter.class, "Tower Reverter"); - GameRegistry.registerTileEntity(TileEntityTFTrophy.class, "TF Trophy"); - GameRegistry.registerTileEntity(TileEntityTFTowerBossSpawner.class, "Tower Boss Spawner"); - GameRegistry.registerTileEntity(TileEntityTFGhastTrapInactive.class, "Inactive Ghast Trap"); - GameRegistry.registerTileEntity(TileEntityTFGhastTrapActive.class, "Active Ghast Trap"); - GameRegistry.registerTileEntity(TileEntityTFCReactorActive.class, "Active Carminite Reactor"); - GameRegistry.registerTileEntity(TileEntityTFKnightPhantomsSpawner.class, "Knight Phantom Spawner"); - GameRegistry.registerTileEntity(TileEntityTFSnowQueenSpawner.class, "Snow Queen Spawner"); - GameRegistry.registerTileEntity(TileEntityTFCinderFurnace.class, "Cinder Furnace"); + + @SubscribeEvent + public static void addClassicPack(AddPackFindersEvent event) { + if (event.getPackType() == PackType.CLIENT_RESOURCES) { + var resourcePath = ModList.get().getModFileById(TwilightForestMod.ID).getFile().findResource("classic"); + var pack = Pack.readMetaAndCreate("builtin/twilight_forest_classic_resources", Component.literal("Twilight Classic"), false, + path -> new PathPackResources(path, resourcePath, true), PackType.CLIENT_RESOURCES, Pack.Position.TOP, PackSource.BUILT_IN); + event.addRepositorySource(consumer -> consumer.accept(pack)); + } } - /** - * Use the thaumcraft API to register our things with aspects and biomes with values - */ - private void registerThaumcraftIntegration() - { - try { - - // items - registerTCObjectTag(TFItems.nagaScale, -1, (new AspectList()).add(Aspect.MOTION, 2).add(Aspect.ARMOR, 3)); - registerTCObjectTag(TFItems.scepterTwilight, -1, (new AspectList()).add(Aspect.MAGIC, 8).add(Aspect.ELDRITCH, 8).add(Aspect.WEAPON, 8)); - registerTCObjectTag(TFItems.scepterLifeDrain, -1, (new AspectList()).add(Aspect.MAGIC, 8).add(Aspect.LIFE, 8).add(Aspect.HUNGER, 8)); - registerTCObjectTag(TFItems.scepterZombie, -1, (new AspectList()).add(Aspect.MAGIC, 8).add(Aspect.UNDEAD, 8).add(Aspect.ENTROPY, 8)); - registerTCObjectTag(TFItems.magicMapFocus, -1, (new AspectList()).add(Aspect.MAGIC, 4).add(Aspect.SENSES, 8)); - registerTCObjectTag(TFItems.mazeMapFocus, -1, (new AspectList()).add(Aspect.MAGIC, 4).add(Aspect.SENSES, 8).add(Aspect.ORDER, 4)); - registerTCObjectTag(TFItems.feather, -1, (new AspectList()).add(Aspect.FLIGHT, 2).add(Aspect.AIR, 1).add(Aspect.DARKNESS, 1)); - registerTCObjectTag(TFItems.liveRoot, -1, (new AspectList()).add(Aspect.MAGIC, 1).add(Aspect.TREE, 2).add(Aspect.LIFE, 2)); - registerTCObjectTag(TFItems.ironwoodIngot, -1, (new AspectList()).add(Aspect.MAGIC, 2).add(Aspect.TREE, 1).add(Aspect.METAL, 4).add(Aspect.CRAFT, 2)); - registerTCObjectTag(TFItems.torchberries, -1, (new AspectList()).add(Aspect.PLANT, 2).add(Aspect.LIGHT, 2)); - registerTCObjectTag(TFItems.fieryBlood, -1, (new AspectList()).add(Aspect.FIRE, 8).add(Aspect.LIFE, 8).add(Aspect.MAGIC, 4)); - registerTCObjectTag(TFItems.trophy, -1, (new AspectList()).add(Aspect.LIFE, 6).add(Aspect.BEAST, 6).add(Aspect.SOUL, 6)); - registerTCObjectTag(TFItems.steeleafIngot, -1, (new AspectList()).add(Aspect.PLANT, 4).add(Aspect.METAL, 2)); - registerTCObjectTag(TFItems.minotaurAxe, -1, (new AspectList()).add(Aspect.TOOL, 2).add(Aspect.WEAPON, 4).add(Aspect.CRYSTAL, 6).add(Aspect.GREED, 8)); - registerTCObjectTag(TFItems.mazebreakerPick, -1, (new AspectList()).add(Aspect.CRYSTAL, 6).add(Aspect.TOOL, 8).add(Aspect.MINE, 8)); - registerTCObjectTag(TFItems.oreMagnet, -1, (new AspectList()).add(Aspect.GREED, 10).add(Aspect.TOOL, 6).add(Aspect.METAL, 8).add(Aspect.MOTION, 6)); - registerTCObjectTag(TFItems.crumbleHorn, -1, (new AspectList()).add(Aspect.ENTROPY, 12).add(Aspect.BEAST, 2)); - registerTCObjectTag(TFItems.peacockFan, -1, (new AspectList()).add(Aspect.AIR, 8).add(Aspect.MOTION, 6).add(Aspect.FLIGHT, 10)); - registerTCObjectTag(TFItems.moonwormQueen, -1, (new AspectList()).add(Aspect.LIGHT, 12).add(Aspect.MAGIC, 1)); - registerTCObjectTag(TFItems.charmOfLife1, -1, (new AspectList()).add(Aspect.LIFE, 2).add(Aspect.HEAL, 2).add(Aspect.GREED, 4)); - registerTCObjectTag(TFItems.charmOfKeeping1, -1, (new AspectList()).add(Aspect.DEATH, 1).add(Aspect.TRAVEL, 2).add(Aspect.GREED, 4)); - registerTCObjectTag(TFItems.towerKey, -1, (new AspectList()).add(Aspect.MECHANISM, 4).add(Aspect.MAGIC, 4)); - registerTCObjectTag(TFItems.transformPowder, -1, (new AspectList()).add(Aspect.MAGIC, 8).add(Aspect.EXCHANGE, 4)); - registerTCObjectTag(TFItems.borerEssence, -1, (new AspectList()).add(Aspect.BEAST, 2).add(Aspect.TREE, 2).add(Aspect.SOUL, 4).add(Aspect.MAGIC, 2)); - registerTCObjectTag(TFItems.armorShard, -1, (new AspectList()).add(Aspect.METAL, 1)); - registerTCObjectTag(TFItems.knightMetal, -1, (new AspectList()).add(Aspect.METAL, 8).add(Aspect.ORDER, 1)); - registerTCObjectTag(TFItems.phantomHelm, -1, (new AspectList()).add(Aspect.METAL, 6).add(Aspect.ARMOR, 6).add(Aspect.UNDEAD, 6)); - registerTCObjectTag(TFItems.phantomPlate, -1, (new AspectList()).add(Aspect.METAL, 8).add(Aspect.ARMOR, 8).add(Aspect.UNDEAD, 8)); - registerTCObjectTag(TFItems.armorShard, -1, (new AspectList()).add(Aspect.METAL, 1)); - registerTCObjectTag(TFItems.lampOfCinders, -1, (new AspectList()).add(Aspect.FIRE, 4).add(Aspect.MAGIC, 4).add(Aspect.TOOL, 4)); - registerTCObjectTag(TFItems.fieryTears, -1, (new AspectList()).add(Aspect.FIRE, 8).add(Aspect.LIFE, 8).add(Aspect.MAGIC, 4)); - registerTCObjectTag(TFItems.alphaFur, -1, (new AspectList()).add(Aspect.COLD, 3).add(Aspect.BEAST, 3).add(Aspect.MAGIC, 4).add(Aspect.ARMOR, 1)); - registerTCObjectTag(TFItems.iceBomb, -1, (new AspectList()).add(Aspect.COLD, 3).add(Aspect.AIR, 1)); - registerTCObjectTag(TFItems.arcticFur, -1, (new AspectList()).add(Aspect.COLD, 3).add(Aspect.BEAST, 3)); - registerTCObjectTag(TFItems.tripleBow, -1, (new AspectList()).add(Aspect.TREE, 6).add(Aspect.BEAST, 6).add(Aspect.CLOTH, 6).add(Aspect.WEAPON, 9).add(Aspect.AIR, 3)); - registerTCObjectTag(TFItems.seekerBow, -1, (new AspectList()).add(Aspect.MIND, 3).add(Aspect.BEAST, 2).add(Aspect.CLOTH, 2).add(Aspect.WEAPON, 3).add(Aspect.AIR, 1)); - registerTCObjectTag(TFItems.iceBow, -1, (new AspectList()).add(Aspect.COLD, 2).add(Aspect.BEAST, 2).add(Aspect.CLOTH, 2).add(Aspect.WEAPON, 3).add(Aspect.AIR, 1)); - registerTCObjectTag(TFItems.enderBow, -1, (new AspectList()).add(Aspect.TRAVEL, 2).add(Aspect.BEAST, 2).add(Aspect.CLOTH, 2).add(Aspect.WEAPON, 3).add(Aspect.AIR, 1)); - registerTCObjectTag(TFItems.iceSword, -1, (new AspectList()).add(Aspect.WEAPON, 4).add(Aspect.CRYSTAL, 4).add(Aspect.COLD, 4)); - registerTCObjectTag(TFItems.glassSword, -1, (new AspectList()).add(Aspect.WEAPON, 5).add(Aspect.CRYSTAL, 4)); - registerTCObjectTag(TFItems.cubeTalisman, -1, (new AspectList()).add(Aspect.VOID, 4).add(Aspect.MAGIC, 4).add(Aspect.ENTROPY, 4)); - registerTCObjectTag(TFItems.cubeOfAnnihilation, -1, (new AspectList()).add(Aspect.VOID, 7).add(Aspect.MAGIC, 7).add(Aspect.ENTROPY, 7)); - - // food - registerTCObjectTag(TFItems.venisonRaw, -1, (new AspectList()).add(Aspect.HUNGER, 2).add(Aspect.FLESH, 4).add(Aspect.BEAST, 2)); - registerTCObjectTag(TFItems.venisonCooked, -1, (new AspectList()).add(Aspect.HUNGER, 4).add(Aspect.FLESH, 4).add(Aspect.CRAFT, 1)); - registerTCObjectTag(TFItems.hydraChop, -1, (new AspectList()).add(Aspect.HUNGER, 6).add(Aspect.FLESH, 6).add(Aspect.LIFE, 4)); - registerTCObjectTag(TFItems.meefRaw, -1, (new AspectList()).add(Aspect.BEAST, 2).add(Aspect.FLESH, 4).add(Aspect.LIFE, 2)); - registerTCObjectTag(TFItems.meefSteak, -1, (new AspectList()).add(Aspect.FIRE, 1).add(Aspect.BEAST, 1).add(Aspect.FLESH, 4).add(Aspect.LIFE, 2)); - registerTCObjectTag(TFItems.meefStroganoff, -1, (new AspectList()).add(Aspect.HUNGER, 4).add(Aspect.BEAST, 2).add(Aspect.FLESH, 4)); - registerTCObjectTag(TFItems.mazeWafer, -1, (new AspectList()).add(Aspect.HUNGER, 2)); - registerTCObjectTag(TFItems.experiment115, -1, (new AspectList()).add(Aspect.HUNGER, 3).add(Aspect.MECHANISM, 1)); - - // blocks - registerTCObjectTag(TFBlocks.firefly, -1, (new AspectList()).add(Aspect.FLIGHT, 1).add(Aspect.LIGHT, 2)); - registerTCObjectTag(TFBlocks.leaves, -1, (new AspectList()).add(Aspect.PLANT, 2)); - registerTCObjectTag(TFBlocks.mazestone, -1, (new AspectList()).add(Aspect.ORDER, 2).add(Aspect.TRAP, 1).add(Aspect.ARMOR, 1)); - registerTCObjectTag(TFBlocks.hedge, 0, (new AspectList()).add(Aspect.PLANT, 1).add(Aspect.WEAPON, 1)); - registerTCObjectTag(TFBlocks.hedge, 1, (new AspectList()).add(Aspect.PLANT, 3).add(Aspect.DARKNESS, 1)); - registerTCObjectTag(TFBlocks.root, -1, (new AspectList()).add(Aspect.TREE, 2)); - registerTCObjectTag(TFBlocks.cicada, -1, (new AspectList()).add(Aspect.SENSES, 2)); - registerTCObjectTag(TFBlocks.uncraftingTable, -1, (new AspectList()).add(Aspect.TREE, 4).add(Aspect.ENTROPY, 8).add(Aspect.EXCHANGE, 12).add(Aspect.CRAFT, 16)); - registerTCObjectTag(TFBlocks.fireJet, -1, (new AspectList()).add(Aspect.FIRE, 4).add(Aspect.AIR, 2).add(Aspect.MOTION, 2)); - registerTCObjectTag(TFBlocks.nagastone, -1, (new AspectList()).add(Aspect.ORDER, 2).add(Aspect.MOTION, 2)); - registerTCObjectTag(TFBlocks.magicLeaves, -1, (new AspectList()).add(Aspect.PLANT, 2)); - registerTCObjectTag(TFBlocks.towerWood, -1, (new AspectList()).add(Aspect.TREE, 2).add(Aspect.MECHANISM, 2)); - registerTCObjectTag(TFBlocks.towerDevice, -1, (new AspectList()).add(Aspect.TREE, 4).add(Aspect.MECHANISM, 4).add(Aspect.MAGIC, 4)); - registerTCObjectTag(TFBlocks.towerTranslucent, -1, (new AspectList()).add(Aspect.TREE, 4).add(Aspect.MECHANISM, 4).add(Aspect.MAGIC, 4).add(Aspect.VOID, 2)); - registerTCObjectTag(TFBlocks.trophy, -1, (new AspectList()).add(Aspect.LIFE, 6).add(Aspect.BEAST, 6).add(Aspect.SOUL, 6)); - registerTCObjectTag(TFBlocks.plant, 3, (new AspectList()).add(Aspect.PLANT, 1)); - registerTCObjectTag(TFBlocks.plant, 4, (new AspectList()).add(Aspect.PLANT, 1)); - registerTCObjectTag(TFBlocks.plant, 5, (new AspectList()).add(Aspect.PLANT, 2)); - registerTCObjectTag(TFBlocks.plant, 8, (new AspectList()).add(Aspect.PLANT, 2).add(Aspect.MAGIC, 1)); - registerTCObjectTag(TFBlocks.plant, 9, (new AspectList()).add(Aspect.PLANT, 2).add(Aspect.DARKNESS, 1).add(Aspect.LIGHT, 1)); - registerTCObjectTag(TFBlocks.plant, 10, (new AspectList()).add(Aspect.PLANT, 2).add(Aspect.DARKNESS, 1)); - registerTCObjectTag(TFBlocks.plant, 11, (new AspectList()).add(Aspect.PLANT, 2).add(Aspect.DARKNESS, 1)); - registerTCObjectTag(TFBlocks.plant, 13, (new AspectList()).add(Aspect.PLANT, 2).add(Aspect.LIGHT, 2)); - registerTCObjectTag(TFBlocks.plant, 14, (new AspectList()).add(Aspect.PLANT, 2)); - registerTCObjectTag(TFBlocks.sapling, -1, (new AspectList()).add(Aspect.PLANT, 4).add(Aspect.TREE, 2)); - registerTCObjectTag(TFBlocks.moonworm, -1, (new AspectList()).add(Aspect.DARKNESS, 2).add(Aspect.LIGHT, 2)); - registerTCObjectTag(TFBlocks.shield, -1, (new AspectList()).add(Aspect.TRAP, 1).add(Aspect.MAGIC, 1).add(Aspect.ARMOR, 1)); - registerTCObjectTag(TFBlocks.trophyPedestal, -1, (new AspectList()).add(Aspect.GREED, 6).add(Aspect.BEAST, 5)); - registerTCObjectTag(TFBlocks.auroraBlock, -1, (new AspectList()).add(Aspect.COLD, 2).add(Aspect.CRYSTAL, 2)); - registerTCObjectTag(TFBlocks.underBrick, -1, (new AspectList()).add(Aspect.DARKNESS, 2).add(Aspect.EARTH, 2)); - registerTCObjectTag(TFBlocks.portal, -1, (new AspectList()).add(Aspect.MAGIC, 1).add(Aspect.MOTION, 2)); - registerTCObjectTag(TFBlocks.trophy, -1, (new AspectList()).add(Aspect.PLANT, 2).add(Aspect.LIGHT, 10)); - registerTCObjectTag(TFBlocks.shield, -1, (new AspectList()).add(Aspect.EARTH, 1).add(Aspect.ORDER, 2).add(Aspect.ARMOR, 2)); - registerTCObjectTag(TFBlocks.thorns, -1, (new AspectList()).add(Aspect.PLANT, 3).add(Aspect.ENTROPY, 2).add(Aspect.TRAP, 2)); - registerTCObjectTag(TFBlocks.thornRose, -1, (new AspectList()).add(Aspect.PLANT, 1).add(Aspect.TRAP, 1).add(Aspect.SENSES, 2)); - registerTCObjectTag(TFBlocks.burntThorns, -1, (new AspectList()).add(Aspect.ENTROPY, 2).add(Aspect.FIRE, 1)); - registerTCObjectTag(TFBlocks.leaves3, -1, (new AspectList()).add(Aspect.PLANT, 2)); - registerTCObjectTag(TFBlocks.deadrock, -1, (new AspectList()).add(Aspect.EARTH, 1).add(Aspect.ENTROPY, 1).add(Aspect.DEATH, 1)); - registerTCObjectTag(TFBlocks.darkleaves, -1, (new AspectList()).add(Aspect.PLANT, 2).add(Aspect.DARKNESS, 2)); - registerTCObjectTag(TFBlocks.auroraPillar, -1, (new AspectList()).add(Aspect.COLD, 2).add(Aspect.ORDER, 2)); - registerTCObjectTag(TFBlocks.auroraSlab, -1, (new AspectList()).add(Aspect.COLD, 2).add(Aspect.ORDER, 2)); - registerTCObjectTag(TFBlocks.auroraDoubleSlab, -1, (new AspectList()).add(Aspect.COLD, 2).add(Aspect.ORDER, 2)); - registerTCObjectTag(TFBlocks.trollSteinn, -1, (new AspectList()).add(Aspect.EARTH, 1).add(Aspect.ORDER, 1).add(Aspect.CRYSTAL, 1)); - registerTCObjectTag(TFBlocks.wispyCloud, -1, (new AspectList()).add(Aspect.WEATHER, 1).add(Aspect.AIR, 1).add(Aspect.FLIGHT, 1)); - registerTCObjectTag(TFBlocks.fluffyCloud, -1, (new AspectList()).add(Aspect.WEATHER, 2).add(Aspect.AIR, 2)); - registerTCObjectTag(TFBlocks.giantCobble, -1, (new AspectList()).add(Aspect.EARTH, 8).add(Aspect.ENTROPY, 8)); - registerTCObjectTag(TFBlocks.giantLog, -1, (new AspectList()).add(Aspect.TREE, 32)); - registerTCObjectTag(TFBlocks.giantLeaves, -1, (new AspectList()).add(Aspect.PLANT, 32)); - registerTCObjectTag(TFBlocks.giantObsidian, -1, (new AspectList()).add(Aspect.FIRE, 16).add(Aspect.DARKNESS, 8).add(Aspect.EARTH, 16)); - registerTCObjectTag(TFBlocks.uberousSoil, -1, (new AspectList()).add(Aspect.EARTH, 4).add(Aspect.SENSES, 2).add(Aspect.PLANT, 2)); - registerTCObjectTag(TFBlocks.hugeStalk, -1, (new AspectList()).add(Aspect.PLANT, 2).add(Aspect.TREE, 2)); - registerTCObjectTag(TFBlocks.hugeGloomBlock, -1, (new AspectList()).add(Aspect.PLANT, 2).add(Aspect.DARKNESS, 1).add(Aspect.LIGHT, 1)); - registerTCObjectTag(TFBlocks.trollVidr, -1, (new AspectList()).add(Aspect.PLANT, 2)); - registerTCObjectTag(TFBlocks.unripeTrollBer, -1, (new AspectList()).add(Aspect.PLANT, 2).add(Aspect.DARKNESS, 1)); - registerTCObjectTag(TFBlocks.trollBer, -1, (new AspectList()).add(Aspect.PLANT, 2).add(Aspect.LIGHT, 4)); - registerTCObjectTag(TFBlocks.knightmetalStorage, -1, (new AspectList()).add(Aspect.METAL, 12).add(Aspect.ORDER, 12)); - registerTCObjectTag(TFBlocks.hugeLilyPad, -1, (new AspectList()).add(Aspect.WATER, 3).add(Aspect.PLANT, 6)); - registerTCObjectTag(TFBlocks.hugeWaterLily, -1, (new AspectList()).add(Aspect.WATER, 2).add(Aspect.PLANT, 2).add(Aspect.SENSES, 2)); - registerTCObjectTag(TFBlocks.slider, -1, (new AspectList()).add(Aspect.MOTION, 4).add(Aspect.TRAP, 6)); - registerTCObjectTag(TFBlocks.castleBlock, -1, (new AspectList()).add(Aspect.ORDER, 2)); - registerTCObjectTag(TFBlocks.castleMagic, -1, (new AspectList()).add(Aspect.ORDER, 2).add(Aspect.MAGIC, 3).add(Aspect.ENERGY, 2)); - registerTCObjectTag(TFBlocks.forceField, -1, (new AspectList()).add(Aspect.MAGIC, 3).add(Aspect.ARMOR, 4)); - - FMLLog.info("[TwilightForest] Loaded ThaumcraftApi integration."); - - - } - catch (Exception e) - { - FMLLog.warning("[TwilightForest] Had an %s error while trying to register with ThaumcraftApi.", e.getLocalizedMessage()); - // whatever. + @SubscribeEvent + public static void registerSerializers(RegisterEvent evt) { + if (Objects.equals(evt.getForgeRegistry(), ForgeRegistries.RECIPE_SERIALIZERS)) { + Registry.register(BuiltInRegistries.BIOME_SOURCE, TwilightForestMod.prefix("twilight_biomes"), TFBiomeProvider.TF_CODEC); + Registry.register(BuiltInRegistries.BIOME_SOURCE, TwilightForestMod.prefix("landmarks"), LandmarkBiomeSource.CODEC); + + Registry.register(BuiltInRegistries.CHUNK_GENERATOR, TwilightForestMod.prefix("structure_locating_wrapper"), ChunkGeneratorTwilight.CODEC); } + } + public void sendIMCs(InterModEnqueueEvent evt) { + if (ModList.get().isLoaded("curios")) { + CuriosCompat.handleCuriosIMCs(); + } + if (ModList.get().isLoaded("theoneprobe")) { + InterModComms.sendTo("theoneprobe", "getTheOneProbe", TopCompat::new); + } } - - /** - * Register a block with Thaumcraft aspects - */ - private void registerTCObjectTag(Block block, int meta, AspectList list) { - if (meta == -1) { - meta = OreDictionary.WILDCARD_VALUE; - } - ThaumcraftApi.registerObjectTag(new ItemStack(block, 1, meta), list); + + @SubscribeEvent + public static void init(FMLCommonSetupEvent evt) { + TFPacketHandler.init(); + TFAdvancements.init(); + + evt.enqueueWork(() -> { + TFBlocks.tfCompostables(); + TFBlocks.tfBurnables(); + TFBlocks.tfPots(); + TFSounds.registerParrotSounds(); + TFDispenserBehaviors.init(); + TFStats.init(); + + CauldronInteraction.WATER.put(TFItems.ARCTIC_HELMET.get(), CauldronInteraction.DYED_ITEM); + CauldronInteraction.WATER.put(TFItems.ARCTIC_CHESTPLATE.get(), CauldronInteraction.DYED_ITEM); + CauldronInteraction.WATER.put(TFItems.ARCTIC_LEGGINGS.get(), CauldronInteraction.DYED_ITEM); + CauldronInteraction.WATER.put(TFItems.ARCTIC_BOOTS.get(), CauldronInteraction.DYED_ITEM); + + AxeItem.STRIPPABLES = Maps.newHashMap(AxeItem.STRIPPABLES); + AxeItem.STRIPPABLES.put(TFBlocks.TWILIGHT_OAK_LOG.get(), TFBlocks.STRIPPED_TWILIGHT_OAK_LOG.get()); + AxeItem.STRIPPABLES.put(TFBlocks.CANOPY_LOG.get(), TFBlocks.STRIPPED_CANOPY_LOG.get()); + AxeItem.STRIPPABLES.put(TFBlocks.MANGROVE_LOG.get(), TFBlocks.STRIPPED_MANGROVE_LOG.get()); + AxeItem.STRIPPABLES.put(TFBlocks.DARK_LOG.get(), TFBlocks.STRIPPED_DARK_LOG.get()); + AxeItem.STRIPPABLES.put(TFBlocks.TIME_LOG.get(), TFBlocks.STRIPPED_TIME_LOG.get()); + AxeItem.STRIPPABLES.put(TFBlocks.TRANSFORMATION_LOG.get(), TFBlocks.STRIPPED_TRANSFORMATION_LOG.get()); + AxeItem.STRIPPABLES.put(TFBlocks.MINING_LOG.get(), TFBlocks.STRIPPED_MINING_LOG.get()); + AxeItem.STRIPPABLES.put(TFBlocks.SORTING_LOG.get(), TFBlocks.STRIPPED_SORTING_LOG.get()); + + AxeItem.STRIPPABLES.put(TFBlocks.TWILIGHT_OAK_WOOD.get(), TFBlocks.STRIPPED_TWILIGHT_OAK_WOOD.get()); + AxeItem.STRIPPABLES.put(TFBlocks.CANOPY_WOOD.get(), TFBlocks.STRIPPED_CANOPY_WOOD.get()); + AxeItem.STRIPPABLES.put(TFBlocks.MANGROVE_WOOD.get(), TFBlocks.STRIPPED_MANGROVE_WOOD.get()); + AxeItem.STRIPPABLES.put(TFBlocks.DARK_WOOD.get(), TFBlocks.STRIPPED_DARK_WOOD.get()); + AxeItem.STRIPPABLES.put(TFBlocks.TIME_WOOD.get(), TFBlocks.STRIPPED_TIME_WOOD.get()); + AxeItem.STRIPPABLES.put(TFBlocks.TRANSFORMATION_WOOD.get(), TFBlocks.STRIPPED_TRANSFORMATION_WOOD.get()); + AxeItem.STRIPPABLES.put(TFBlocks.MINING_WOOD.get(), TFBlocks.STRIPPED_MINING_WOOD.get()); + AxeItem.STRIPPABLES.put(TFBlocks.SORTING_WOOD.get(), TFBlocks.STRIPPED_SORTING_WOOD.get()); + }); } - - /** - * Register an item with Thaumcraft aspects - */ - private void registerTCObjectTag(Item item, int meta, AspectList list) { - if (meta == -1) { - meta = OreDictionary.WILDCARD_VALUE; - } - ThaumcraftApi.registerObjectTag(new ItemStack(item, 1, meta), list); + + public void registerCommands(RegisterCommandsEvent event) { + TFCommand.register(event.getDispatcher()); } + public static ResourceLocation prefix(String name) { + return new ResourceLocation(ID, name.toLowerCase(Locale.ROOT)); + } - /** - * Register all dispenser behaviors. - */ - private void registerDispenseBehaviors(MinecraftServer minecraftServer) - { - BlockDispenser.dispenseBehaviorRegistry.putObject(TFItems.spawnEgg, new BehaviorTFMobEggDispense(minecraftServer)); + public static ResourceLocation namedRegistry(String name) { + return new ResourceLocation(REGISTRY_NAMESPACE, name.toLowerCase(Locale.ROOT)); } - - /** - * Load our config file and set default values - */ - private void loadConfiguration(Configuration configFile) { - configFile.load(); - - dimensionID = configFile.get("dimension", "dimensionID", 7).getInt(); - configFile.get("dimension", "dimensionID", 7).comment = "What ID number to assign to the Twilight Forest dimension. Change if you are having conflicts with another mod."; - - dimensionProviderID = configFile.get("dimension", "dimensionProviderID", -777).getInt(); - configFile.get("dimension", "dimensionProviderID", 7).comment = "Dimension provider ID. Does not normally need to be changed, but the option is provided to work around a bug in MCPC+"; - - // other misc otions - silentCicadas = configFile.get(Configuration.CATEGORY_GENERAL, "SilentCicadas", false).getBoolean(false); - configFile.get(Configuration.CATEGORY_GENERAL, "SilentCicadas", false).comment = "Make cicadas silent for those having sound library problems, or otherwise finding them annoying"; - allowPortalsInOtherDimensions = configFile.get(Configuration.CATEGORY_GENERAL, "AllowPortalsInOtherDimensions", false).getBoolean(false); - configFile.get(Configuration.CATEGORY_GENERAL, "AllowPortalsInOtherDimensions", false).comment = "Allow portals to the Twilight Forest to be made outside of dimension 0. May be considered an exploit."; - adminOnlyPortals = configFile.get(Configuration.CATEGORY_GENERAL, "AdminOnlyPortals", false).getBoolean(false); - configFile.get(Configuration.CATEGORY_GENERAL, "AdminOnlyPortals", false).comment = "Allow portals only for admins (ops). This severly reduces the range in which the mod usually scans for valid portal conditions, and it scans near ops only."; - twilightForestSeed = configFile.get(Configuration.CATEGORY_GENERAL, "TwilightForestSeed", "").getString(); - configFile.get(Configuration.CATEGORY_GENERAL, "TwilightForestSeed", "").comment = "If set, this will override the normal world seed when generating parts of the Twilight Forest Dimension."; - disablePortalCreation = configFile.get(Configuration.CATEGORY_GENERAL, "DisablePortalCreation", false).getBoolean(false); - configFile.get(Configuration.CATEGORY_GENERAL, "DisablePortalCreation", false).comment = "Disable Twilight Forest portal creation entirely. Provided for server operators looking to restrict action to the dimension."; - disableUncrafting = configFile.get(Configuration.CATEGORY_GENERAL, "DisableUncrafting", false).getBoolean(false); - configFile.get(Configuration.CATEGORY_GENERAL, "DisableUncrafting", false).comment = "Disable the uncrafting function of the uncrafting table. Provided as an option when interaction with other mods produces exploitable recipes."; - oldMapGen = configFile.get(Configuration.CATEGORY_GENERAL, "OldMapGen", false).getBoolean(false); - configFile.get(Configuration.CATEGORY_GENERAL, "OldMapGen", false).comment = "Use old (pre Minecraft 1.7) map gen. May not be fully supported."; - portalCreationItemString = configFile.get(Configuration.CATEGORY_GENERAL, "PortalCreationItem", "diamond").getString(); - configFile.get(Configuration.CATEGORY_GENERAL, "PortalCreationItem", "diamond").comment = "Item to create the Twilight Forest Portal. Defaults to 'diamond'"; - - canopyCoverage = (float) (configFile.get("Performance", "CanopyCoverage", 1.7).getDouble(1.7)); - configFile.get("performance", "CanopyCoverage", 1.7).comment = "Amount of canopy coverage, from 0.0 on up. Lower numbers improve chunk generation speed at the cost of a thinner forest."; - twilightOakChance = configFile.get("Performance", "TwilightOakChance", 48).getInt(48); - configFile.get("Performance", "TwilightOakChance", 48).comment = "Chance that a chunk in the Twilight Forest will contain a twilight oak tree. Higher numbers reduce the number of trees, increasing performance."; - - // fixed values, don't even read the config - idMobWildBoar = 177; - idMobBighornSheep = 178; - idMobWildDeer = 179; - idMobRedcap = 180; - idMobSwarmSpider = 181; - idMobNaga = 182; - idMobNagaSegment = 183; - idMobSkeletonDruid = 184; - idMobHostileWolf = 185; - idMobTwilightWraith = 186; - idMobHedgeSpider = 187; - idMobHydra = 189; - idMobLich = 190; - idMobPenguin = 191; - idMobLichMinion = 192; - idMobLoyalZombie = 193; - idMobTinyBird = 194; - idMobSquirrel = 195; - idMobBunny = 196; - idMobRaven = 197; - idMobQuestRam = 198; - idMobKobold = 199; - idMobBoggard = 201; - idMobMosquitoSwarm = 202; - idMobDeathTome = 203; - idMobMinotaur = 204; - idMobMinoshroom = 205; - idMobFireBeetle = 206; - idMobSlimeBeetle = 207; - idMobPinchBeetle = 208; - idMobMazeSlime = 209; - idMobRedcapSapper = 210; - idMobMistWolf = 211; - idMobKingSpider = 212; - idMobFirefly = 213; - idMobMiniGhast = 214; - idMobTowerGhast = 215; - idMobTowerGolem = 216; - idMobTowerTermite = 218; - idMobTowerBroodling = 219; - idMobTowerBoss = 217; - idMobBlockGoblin = 220; - idMobGoblinKnightUpper = 221; - idMobGoblinKnightLower = 222; - idMobHelmetCrab = 223; - idMobKnightPhantom = 224; - idMobYeti = 225; - idMobYetiBoss = 226; - idMobWinterWolf = 227; - idMobSnowGuardian = 228; - idMobStableIceCore = 229; - idMobUnstableIceCore = 230; - idMobSnowQueen = 231; - idMobTroll = 232; - idMobGiantMiner = 233; - idMobArmoredGiant = 234; - idMobIceCrystal = 235; - idMobHarbingerCube = 236; - idMobAdherent = 237; - - // biomes - idBiomeLake = configFile.get("biome", "biome.id.Lake", -1).getInt(); - idBiomeTwilightForest = configFile.get("biome", "biome.id.TwilightForest", -1).getInt(); - idBiomeTwilightForestVariant = configFile.get("biome", "biome.id.TwilightForestVariant", -1).getInt(); - idBiomeHighlands = configFile.get("biome", "biome.id.Highlands", -1).getInt(); - idBiomeMushrooms = configFile.get("biome", "biome.id.Mushrooms", -1).getInt(); - idBiomeSwamp = configFile.get("biome", "biome.id.Swamp", -1).getInt(); - idBiomeStream = configFile.get("biome", "biome.id.Stream", -1).getInt(); - idBiomeSnowfield = configFile.get("biome", "biome.id.Snowfield", -1).getInt(); - idBiomeGlacier = configFile.get("biome", "biome.id.Glacier", -1).getInt(); - idBiomeClearing = configFile.get("biome", "biome.id.Clearing", -1).getInt(); - idBiomeOakSavanna = configFile.get("biome", "biome.id.OakSavanna", -1).getInt(); - idBiomeFireflyForest = configFile.get("biome", "biome.id.LightedForest", -1).getInt(); - idBiomeDeepMushrooms = configFile.get("biome", "biome.id.DeepMushrooms", -1).getInt(); - idBiomeDarkForestCenter = configFile.get("biome", "biome.id.DarkForestCenter", -1).getInt(); - idBiomeHighlandsCenter = configFile.get("biome", "biome.id.HighlandsCenter", -1).getInt(); - idBiomeDarkForest = configFile.get("biome", "biome.id.DarkForest", -1).getInt(); - idBiomeEnchantedForest = configFile.get("biome", "biome.id.EnchantedForest", -1).getInt(); - idBiomeFireSwamp = configFile.get("biome", "biome.id.FireSwamp", -1).getInt(); - idBiomeThornlands = configFile.get("biome", "biome.id.Thornlands", -1).getInt(); - - if (configFile.hasChanged()) { - configFile.save(); - } + + public static ResourceLocation getModelTexture(String name) { + return new ResourceLocation(ID, MODEL_DIR + name); } - /** - * Write changed biome IDs back to the config file - */ - private void saveBiomeIds(Configuration config) { - config.get("biome", "biome.id.Lake", -1).set(idBiomeLake); - config.get("biome", "biome.id.TwilightForest", -1).set(idBiomeTwilightForest); - config.get("biome", "biome.id.TwilightForestVariant", -1).set(idBiomeTwilightForestVariant); - config.get("biome", "biome.id.Highlands", -1).set(idBiomeHighlands); - config.get("biome", "biome.id.Mushrooms", -1).set(idBiomeMushrooms); - config.get("biome", "biome.id.Swamp", -1).set(idBiomeSwamp); - config.get("biome", "biome.id.Stream", -1).set(idBiomeStream); - config.get("biome", "biome.id.Snowfield", -1).set(idBiomeSnowfield); - config.get("biome", "biome.id.Glacier", -1).set(idBiomeGlacier); - config.get("biome", "biome.id.Clearing", -1).set(idBiomeClearing); - config.get("biome", "biome.id.OakSavanna", -1).set(idBiomeOakSavanna); - config.get("biome", "biome.id.LightedForest", -1).set(idBiomeFireflyForest); - config.get("biome", "biome.id.DeepMushrooms", -1).set(idBiomeDeepMushrooms); - config.get("biome", "biome.id.DarkForestCenter", -1).set(idBiomeDarkForestCenter); - config.get("biome", "biome.id.HighlandsCenter", -1).set(idBiomeHighlandsCenter); - config.get("biome", "biome.id.DarkForest", -1).set(idBiomeDarkForest); - config.get("biome", "biome.id.EnchantedForest", -1).set(idBiomeEnchantedForest); - config.get("biome", "biome.id.FireSwamp", -1).set(idBiomeFireSwamp); - config.get("biome", "biome.id.Thornlands", -1).set(idBiomeThornlands); - - config.save(); + public static ResourceLocation getGuiTexture(String name) { + return new ResourceLocation(ID, GUI_DIR + name); } - /** - * Change what dimension ID the Twilight Forest is. - * This is called when we connect to a server that has a different dimensionID set. - */ - public static void setDimensionID(int dim) - { - if (TwilightForestMod.dimensionID != dim) - { - FMLLog.info("[TwilightForest] Server has a different dimension ID (%d) for the Twilight Forest. Changing this on the client. This change will not be saved.", dim); + public static ResourceLocation getEnvTexture(String name) { + return new ResourceLocation(ID, ENVIRO_DIR + name); + } - DimensionManager.unregisterDimension(TwilightForestMod.dimensionID); - TwilightForestMod.dimensionID = dim; - DimensionManager.registerDimension(TwilightForestMod.dimensionID, TwilightForestMod.dimensionProviderID); - } + public static Rarity getRarity() { + return rarity; } } diff --git a/src/main/java/twilightforest/advancements/ActivateGhastTrapTrigger.java b/src/main/java/twilightforest/advancements/ActivateGhastTrapTrigger.java new file mode 100644 index 0000000000..3661815290 --- /dev/null +++ b/src/main/java/twilightforest/advancements/ActivateGhastTrapTrigger.java @@ -0,0 +1,40 @@ +package twilightforest.advancements; + +import com.google.gson.JsonObject; +import net.minecraft.advancements.critereon.AbstractCriterionTriggerInstance; +import net.minecraft.advancements.critereon.DeserializationContext; +import net.minecraft.advancements.critereon.EntityPredicate; +import net.minecraft.advancements.critereon.SimpleCriterionTrigger; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerPlayer; +import twilightforest.TwilightForestMod; + +public class ActivateGhastTrapTrigger extends SimpleCriterionTrigger { + + public static final ResourceLocation ID = TwilightForestMod.prefix("activate_ghast_trap"); + + @Override + public ResourceLocation getId() { + return ID; + } + + @Override + protected ActivateGhastTrapTrigger.Instance createInstance(JsonObject json, EntityPredicate.Composite player, DeserializationContext ctx) { + return new ActivateGhastTrapTrigger.Instance(player); + } + + public void trigger(ServerPlayer player) { + this.trigger(player, (instance) -> true); + } + + + public static class Instance extends AbstractCriterionTriggerInstance { + public Instance(EntityPredicate.Composite player) { + super(ActivateGhastTrapTrigger.ID, player); + } + + public static Instance activateTrap() { + return new Instance(EntityPredicate.Composite.ANY); + } + } +} diff --git a/src/main/java/twilightforest/advancements/ArmorInventoryChangedTrigger.java b/src/main/java/twilightforest/advancements/ArmorInventoryChangedTrigger.java new file mode 100644 index 0000000000..2161f072bf --- /dev/null +++ b/src/main/java/twilightforest/advancements/ArmorInventoryChangedTrigger.java @@ -0,0 +1,50 @@ +package twilightforest.advancements; + +import com.google.gson.JsonObject; +import net.minecraft.advancements.critereon.*; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.item.ItemStack; +import twilightforest.TwilightForestMod; + +public class ArmorInventoryChangedTrigger extends SimpleCriterionTrigger { + + public static final ResourceLocation ID = TwilightForestMod.prefix("armor_changed"); + + @Override + public ResourceLocation getId() { + return ID; + } + + @Override + public Instance createInstance(JsonObject json, EntityPredicate.Composite player, DeserializationContext condition) { + ItemPredicate from = ItemPredicate.fromJson(json.get("from")); + ItemPredicate to = ItemPredicate.fromJson(json.get("to")); + return new Instance(player, from, to); + } + + public void trigger(ServerPlayer player, ItemStack from, ItemStack to) { + this.trigger(player, (instance) -> instance.test(from, to)); + } + + + public static class Instance extends AbstractCriterionTriggerInstance { + + private final ItemPredicate from; + private final ItemPredicate to; + + public Instance(EntityPredicate.Composite player, ItemPredicate from, ItemPredicate to) { + super(ArmorInventoryChangedTrigger.ID, player); + this.from = from; + this.to = to; + } + + public static Instance equipArmor(ItemPredicate.Builder from, ItemPredicate.Builder to) { + return new Instance(EntityPredicate.Composite.ANY, from.build(), to.build()); + } + + public boolean test(ItemStack from, ItemStack to) { + return this.from.matches(from) && this.to.matches(to); + } + } +} diff --git a/src/main/java/twilightforest/advancements/CountRequirementsStrategy.java b/src/main/java/twilightforest/advancements/CountRequirementsStrategy.java new file mode 100644 index 0000000000..aabce1a5a4 --- /dev/null +++ b/src/main/java/twilightforest/advancements/CountRequirementsStrategy.java @@ -0,0 +1,26 @@ +package twilightforest.advancements; + +import net.minecraft.advancements.RequirementsStrategy; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +//Borrowed from TCon to allow us to have multiple requirement groupings +public record CountRequirementsStrategy(int... sizes) implements RequirementsStrategy { + + @Override + public String[][] createRequirements(Collection strings) { + String[][] requirements = new String[sizes.length][]; + List list = new ArrayList<>(strings); + int nextIndex = 0; + for (int i = 0; i < sizes.length; i++) { + requirements[i] = new String[sizes[i]]; + for (int j = 0; j < sizes[i]; j++) { + requirements[i][j] = list.get(nextIndex); + nextIndex++; + } + } + return requirements; + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/advancements/DrinkFromFlaskTrigger.java b/src/main/java/twilightforest/advancements/DrinkFromFlaskTrigger.java new file mode 100644 index 0000000000..ae3584f700 --- /dev/null +++ b/src/main/java/twilightforest/advancements/DrinkFromFlaskTrigger.java @@ -0,0 +1,72 @@ +package twilightforest.advancements; + +import com.google.gson.JsonObject; +import com.google.gson.JsonSyntaxException; +import net.minecraft.advancements.critereon.*; +import net.minecraft.core.Registry; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.util.GsonHelper; +import net.minecraft.world.item.alchemy.Potion; +import net.minecraftforge.registries.ForgeRegistries; +import twilightforest.TwilightForestMod; + +import org.jetbrains.annotations.Nullable; + +public class DrinkFromFlaskTrigger extends SimpleCriterionTrigger { + + public static final ResourceLocation ID = TwilightForestMod.prefix("drink_from_flask"); + + @Override + public ResourceLocation getId() { + return ID; + } + + @Override + protected Instance createInstance(JsonObject json, EntityPredicate.Composite player, DeserializationContext ctx) { + Potion potion = null; + if (json.has("potion")) { + ResourceLocation resourcelocation = new ResourceLocation(GsonHelper.getAsString(json, "potion")); + potion = ForgeRegistries.POTIONS.getValue(resourcelocation); + } + if(json.has("doses") && GsonHelper.getAsInt(json, "doses") > 4) throw new JsonSyntaxException("DrinkFromFlaskTrigger: can't have more than 4 doses."); + MinMaxBounds.Ints doses = MinMaxBounds.Ints.fromJson(json.get("doses")); + return new Instance(player, doses, potion); + } + + public void trigger(ServerPlayer player, int doses, Potion potion) { + this.trigger(player, (instance) -> instance.matches(doses, potion)); + } + + public static class Instance extends AbstractCriterionTriggerInstance { + + private final MinMaxBounds.Ints doses; + @Nullable + private final Potion potion; + + public Instance(EntityPredicate.Composite player, MinMaxBounds.Ints doses, @Nullable Potion potion) { + super(ID, player); + this.doses = doses; + this.potion = potion; + } + + public static Instance drankPotion(int doses, Potion potion) { + return new Instance(EntityPredicate.Composite.ANY, MinMaxBounds.Ints.exactly(doses), potion); + } + + public boolean matches(int doses, Potion potion) { + return this.doses.matches(doses) && this.potion != null && this.potion == potion; + } + + @Override + public JsonObject serializeToJson(SerializationContext ctx) { + JsonObject object = super.serializeToJson(ctx); + object.add("doses", this.doses.serializeToJson()); + if (this.potion != null) { + object.addProperty("potion", ForgeRegistries.POTIONS.getKey(this.potion).toString()); + } + return object; + } + } +} diff --git a/src/main/java/twilightforest/advancements/HurtBossTrigger.java b/src/main/java/twilightforest/advancements/HurtBossTrigger.java new file mode 100644 index 0000000000..97ac482897 --- /dev/null +++ b/src/main/java/twilightforest/advancements/HurtBossTrigger.java @@ -0,0 +1,54 @@ +package twilightforest.advancements; + +import com.google.gson.JsonObject; +import net.minecraft.advancements.critereon.*; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.level.storage.loot.LootContext; +import twilightforest.TwilightForestMod; + +public class HurtBossTrigger extends SimpleCriterionTrigger { + + public static final ResourceLocation ID = TwilightForestMod.prefix("hurt_boss"); + + @Override + protected Instance createInstance(JsonObject json, EntityPredicate.Composite player, DeserializationContext ctx) { + EntityPredicate.Composite composite = EntityPredicate.Composite.fromJson(json, "hurt_entity", ctx); + return new Instance(player, composite); + } + + @Override + public ResourceLocation getId() { + return ID; + } + + public void trigger(ServerPlayer player, Entity hurt) { + LootContext entity = EntityPredicate.createContext(player, hurt); + this.trigger(player, (instance) -> instance.matches(entity)); + } + + public static class Instance extends AbstractCriterionTriggerInstance { + private final EntityPredicate.Composite hurt; + + public Instance(EntityPredicate.Composite player, EntityPredicate.Composite hurt) { + super(ID, player); + this.hurt = hurt; + } + + public boolean matches(LootContext hurt) { + return this.hurt.matches(hurt); + } + + public static Instance hurtBoss(EntityPredicate.Builder hurt) { + return new Instance(EntityPredicate.Composite.ANY, EntityPredicate.Composite.wrap(hurt.build())); + } + + @Override + public JsonObject serializeToJson(SerializationContext ctx) { + JsonObject json = super.serializeToJson(ctx); + json.add("hurt_entity", this.hurt.toJson(ctx)); + return json; + } + } +} diff --git a/src/main/java/twilightforest/advancements/HydraChopTrigger.java b/src/main/java/twilightforest/advancements/HydraChopTrigger.java new file mode 100644 index 0000000000..be10bb9009 --- /dev/null +++ b/src/main/java/twilightforest/advancements/HydraChopTrigger.java @@ -0,0 +1,39 @@ +package twilightforest.advancements; + +import com.google.gson.JsonObject; +import net.minecraft.advancements.critereon.AbstractCriterionTriggerInstance; +import net.minecraft.advancements.critereon.DeserializationContext; +import net.minecraft.advancements.critereon.EntityPredicate; +import net.minecraft.advancements.critereon.SimpleCriterionTrigger; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerPlayer; +import twilightforest.TwilightForestMod; + +public class HydraChopTrigger extends SimpleCriterionTrigger { + + public static final ResourceLocation ID = TwilightForestMod.prefix("consume_hydra_chop_on_low_hunger"); + + @Override + public ResourceLocation getId() { + return ID; + } + + @Override + protected Instance createInstance(JsonObject json, EntityPredicate.Composite player, DeserializationContext ctx) { + return new HydraChopTrigger.Instance(player); + } + + public void trigger(ServerPlayer player) { + this.trigger(player, (instance) -> true); + } + + public static class Instance extends AbstractCriterionTriggerInstance { + public Instance(EntityPredicate.Composite player) { + super(HydraChopTrigger.ID, player); + } + + public static Instance eatChop() { + return new Instance(EntityPredicate.Composite.ANY); + } + } +} diff --git a/src/main/java/twilightforest/advancements/KillAllPhantomsTrigger.java b/src/main/java/twilightforest/advancements/KillAllPhantomsTrigger.java new file mode 100644 index 0000000000..0bac90ad52 --- /dev/null +++ b/src/main/java/twilightforest/advancements/KillAllPhantomsTrigger.java @@ -0,0 +1,39 @@ +package twilightforest.advancements; + +import com.google.gson.JsonObject; +import net.minecraft.advancements.critereon.AbstractCriterionTriggerInstance; +import net.minecraft.advancements.critereon.DeserializationContext; +import net.minecraft.advancements.critereon.EntityPredicate; +import net.minecraft.advancements.critereon.SimpleCriterionTrigger; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerPlayer; +import twilightforest.TwilightForestMod; + +public class KillAllPhantomsTrigger extends SimpleCriterionTrigger { + + public static final ResourceLocation ID = TwilightForestMod.prefix("kill_all_phantoms"); + + @Override + public ResourceLocation getId() { + return ID; + } + + @Override + protected Instance createInstance(JsonObject json, EntityPredicate.Composite player, DeserializationContext ctx) { + return new Instance(player); + } + + public void trigger(ServerPlayer player) { + this.trigger(player, (instance) -> true); + } + + public static class Instance extends AbstractCriterionTriggerInstance { + public Instance(EntityPredicate.Composite player) { + super(KillAllPhantomsTrigger.ID, player); + } + + public static Instance killThemAll() { + return new Instance(EntityPredicate.Composite.ANY); + } + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/advancements/KillBugTrigger.java b/src/main/java/twilightforest/advancements/KillBugTrigger.java new file mode 100644 index 0000000000..c8726d0ee4 --- /dev/null +++ b/src/main/java/twilightforest/advancements/KillBugTrigger.java @@ -0,0 +1,70 @@ +package twilightforest.advancements; + +import com.google.gson.JsonObject; +import net.minecraft.advancements.critereon.*; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.util.GsonHelper; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.registries.ForgeRegistries; +import org.jetbrains.annotations.Nullable; +import twilightforest.TwilightForestMod; + +public class KillBugTrigger extends SimpleCriterionTrigger { + public static final ResourceLocation ID = TwilightForestMod.prefix("kill_bug"); + + @Override + public ResourceLocation getId() { + return ID; + } + + @Override + protected Instance createInstance(JsonObject json, EntityPredicate.Composite player, DeserializationContext ctx) { + Block bug = deserializeBug(json); + return new Instance(player, bug); + } + + @Nullable + private static Block deserializeBug(JsonObject object) { + if (object.has("bug")) { + ResourceLocation resourcelocation = new ResourceLocation(GsonHelper.getAsString(object, "bug")); + return ForgeRegistries.BLOCKS.getValue(resourcelocation); + } else { + return null; + } + } + + public void trigger(ServerPlayer player, BlockState bug) { + this.trigger(player, (instance) -> instance.matches(bug)); + } + + public static class Instance extends AbstractCriterionTriggerInstance { + + @Nullable + private final Block bugType; + + public Instance(EntityPredicate.Composite player, @Nullable Block bugType) { + super(ID, player); + this.bugType = bugType; + } + + public static Instance killBug(Block bug) { + return new Instance(EntityPredicate.Composite.ANY, bug); + } + + public boolean matches(BlockState bug) { + return this.bugType == null || bug.is(this.bugType); + } + + @Override + @SuppressWarnings("deprecation") + public JsonObject serializeToJson(SerializationContext ctx) { + JsonObject object = super.serializeToJson(ctx); + if (bugType != null) { + object.addProperty("bug", ForgeRegistries.BLOCKS.getKey(this.bugType).toString()); + } + return object; + } + } +} diff --git a/src/main/java/twilightforest/advancements/MakePortalTrigger.java b/src/main/java/twilightforest/advancements/MakePortalTrigger.java new file mode 100644 index 0000000000..bb9172200e --- /dev/null +++ b/src/main/java/twilightforest/advancements/MakePortalTrigger.java @@ -0,0 +1,40 @@ +package twilightforest.advancements; + +import com.google.gson.JsonObject; +import net.minecraft.advancements.critereon.AbstractCriterionTriggerInstance; +import net.minecraft.advancements.critereon.DeserializationContext; +import net.minecraft.advancements.critereon.EntityPredicate; +import net.minecraft.advancements.critereon.SimpleCriterionTrigger; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerPlayer; +import twilightforest.TwilightForestMod; + +public class MakePortalTrigger extends SimpleCriterionTrigger { + + public static final ResourceLocation ID = TwilightForestMod.prefix("make_tf_portal"); + + @Override + public ResourceLocation getId() { + return ID; + } + + @Override + public Instance createInstance(JsonObject json, EntityPredicate.Composite player, DeserializationContext condition) { + return new MakePortalTrigger.Instance(player); + } + + public void trigger(ServerPlayer player) { + this.trigger(player, (instance) -> true); + } + + public static class Instance extends AbstractCriterionTriggerInstance { + + public Instance(EntityPredicate.Composite player) { + super(MakePortalTrigger.ID, player); + } + + public static Instance makePortal() { + return new Instance(EntityPredicate.Composite.ANY); + } + } +} diff --git a/src/main/java/twilightforest/advancements/QuestRamCompletionTrigger.java b/src/main/java/twilightforest/advancements/QuestRamCompletionTrigger.java new file mode 100644 index 0000000000..c39bf66612 --- /dev/null +++ b/src/main/java/twilightforest/advancements/QuestRamCompletionTrigger.java @@ -0,0 +1,39 @@ +package twilightforest.advancements; + +import com.google.gson.JsonObject; +import net.minecraft.advancements.critereon.AbstractCriterionTriggerInstance; +import net.minecraft.advancements.critereon.DeserializationContext; +import net.minecraft.advancements.critereon.EntityPredicate; +import net.minecraft.advancements.critereon.SimpleCriterionTrigger; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerPlayer; +import twilightforest.TwilightForestMod; + +public class QuestRamCompletionTrigger extends SimpleCriterionTrigger { + + public static final ResourceLocation ID = TwilightForestMod.prefix("complete_quest_ram"); + + @Override + public ResourceLocation getId() { + return ID; + } + + @Override + public Instance createInstance(JsonObject json, EntityPredicate.Composite player, DeserializationContext condition) { + return new QuestRamCompletionTrigger.Instance(player); + } + + public void trigger(ServerPlayer player) { + this.trigger(player, (instance) -> true); + } + + public static class Instance extends AbstractCriterionTriggerInstance { + public Instance(EntityPredicate.Composite player) { + super(QuestRamCompletionTrigger.ID, player); + } + + public static Instance completeRam() { + return new Instance(EntityPredicate.Composite.ANY); + } + } +} diff --git a/src/main/java/twilightforest/advancements/StructureClearedTrigger.java b/src/main/java/twilightforest/advancements/StructureClearedTrigger.java new file mode 100644 index 0000000000..316e2a44a9 --- /dev/null +++ b/src/main/java/twilightforest/advancements/StructureClearedTrigger.java @@ -0,0 +1,49 @@ +package twilightforest.advancements; + +import com.google.gson.JsonObject; +import net.minecraft.advancements.critereon.AbstractCriterionTriggerInstance; +import net.minecraft.advancements.critereon.DeserializationContext; +import net.minecraft.advancements.critereon.EntityPredicate; +import net.minecraft.advancements.critereon.SimpleCriterionTrigger; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.util.GsonHelper; +import twilightforest.TwilightForestMod; + +public class StructureClearedTrigger extends SimpleCriterionTrigger { + + public static final ResourceLocation ID = TwilightForestMod.prefix("structure_cleared"); + + @Override + public ResourceLocation getId() { + return ID; + } + + @Override + public Instance createInstance(JsonObject json, EntityPredicate.Composite player, DeserializationContext condition) { + String structureName = GsonHelper.getAsString(json, "structure"); + return new StructureClearedTrigger.Instance(player, structureName); + } + + public void trigger(ServerPlayer player, String structureName) { + this.trigger(player, (instance) -> instance.test(structureName)); + } + + public static class Instance extends AbstractCriterionTriggerInstance { + + private final String structureName; + + public Instance(EntityPredicate.Composite player, String structureName) { + super(StructureClearedTrigger.ID, player); + this.structureName = structureName; + } + + public static Instance clearedStructure(String name) { + return new Instance(EntityPredicate.Composite.ANY, name); + } + + boolean test(String structureName) { + return this.structureName.equals(structureName); + } + } +} diff --git a/src/main/java/twilightforest/advancements/TFAdvancements.java b/src/main/java/twilightforest/advancements/TFAdvancements.java new file mode 100644 index 0000000000..542b5f598c --- /dev/null +++ b/src/main/java/twilightforest/advancements/TFAdvancements.java @@ -0,0 +1,19 @@ +package twilightforest.advancements; + +import net.minecraft.advancements.CriteriaTriggers; + +public class TFAdvancements { + public static final MakePortalTrigger MADE_TF_PORTAL = CriteriaTriggers.register(new MakePortalTrigger()); + public static final HydraChopTrigger CONSUME_HYDRA_CHOP = CriteriaTriggers.register(new HydraChopTrigger()); + public static final QuestRamCompletionTrigger QUEST_RAM_COMPLETED = CriteriaTriggers.register(new QuestRamCompletionTrigger()); + public static final TrophyPedestalTrigger PLACED_TROPHY_ON_PEDESTAL = CriteriaTriggers.register(new TrophyPedestalTrigger()); + public static final ActivateGhastTrapTrigger ACTIVATED_GHAST_TRAP = CriteriaTriggers.register(new ActivateGhastTrapTrigger()); + public static final StructureClearedTrigger STRUCTURE_CLEARED = CriteriaTriggers.register(new StructureClearedTrigger()); + public static final ArmorInventoryChangedTrigger ARMOR_CHANGED = CriteriaTriggers.register(new ArmorInventoryChangedTrigger()); + public static final DrinkFromFlaskTrigger DRINK_FROM_FLASK = CriteriaTriggers.register(new DrinkFromFlaskTrigger()); + public static final KillBugTrigger KILL_BUG = CriteriaTriggers.register(new KillBugTrigger()); + public static final HurtBossTrigger HURT_BOSS = CriteriaTriggers.register(new HurtBossTrigger()); + public static final KillAllPhantomsTrigger KILL_ALL_PHANTOMS = CriteriaTriggers.register(new KillAllPhantomsTrigger()); + + public static void init() {} +} diff --git a/src/main/java/twilightforest/advancements/TrophyPedestalTrigger.java b/src/main/java/twilightforest/advancements/TrophyPedestalTrigger.java new file mode 100644 index 0000000000..2c222da2fb --- /dev/null +++ b/src/main/java/twilightforest/advancements/TrophyPedestalTrigger.java @@ -0,0 +1,40 @@ +package twilightforest.advancements; + +import com.google.gson.JsonObject; +import net.minecraft.advancements.critereon.AbstractCriterionTriggerInstance; +import net.minecraft.advancements.critereon.DeserializationContext; +import net.minecraft.advancements.critereon.EntityPredicate; +import net.minecraft.advancements.critereon.SimpleCriterionTrigger; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerPlayer; +import twilightforest.TwilightForestMod; + +public class TrophyPedestalTrigger extends SimpleCriterionTrigger { + + public static final ResourceLocation ID = TwilightForestMod.prefix("placed_on_trophy_pedestal"); + + @Override + public ResourceLocation getId() { + return ID; + } + + @Override + public TrophyPedestalTrigger.Instance createInstance(JsonObject json, EntityPredicate.Composite player, DeserializationContext condition) { + return new TrophyPedestalTrigger.Instance(player); + } + + public void trigger(ServerPlayer player) { + this.trigger(player, (instance) -> true); + } + + public static class Instance extends AbstractCriterionTriggerInstance { + + public Instance(EntityPredicate.Composite player) { + super(TrophyPedestalTrigger.ID, player); + } + + public static Instance activatePedestal() { + return new Instance(EntityPredicate.Composite.ANY); + } + } +} diff --git a/src/main/java/twilightforest/advancements/package-info.java b/src/main/java/twilightforest/advancements/package-info.java new file mode 100644 index 0000000000..eee7fcce48 --- /dev/null +++ b/src/main/java/twilightforest/advancements/package-info.java @@ -0,0 +1,6 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.advancements; + +import net.minecraft.MethodsReturnNonnullByDefault; +import javax.annotation.ParametersAreNonnullByDefault; diff --git a/src/main/java/twilightforest/biomes/TFBiomeBase.java b/src/main/java/twilightforest/biomes/TFBiomeBase.java deleted file mode 100644 index 5cc2f3922d..0000000000 --- a/src/main/java/twilightforest/biomes/TFBiomeBase.java +++ /dev/null @@ -1,549 +0,0 @@ -package twilightforest.biomes; - -import java.util.ArrayList; -import java.util.List; -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.client.entity.EntityClientPlayerMP; -import net.minecraft.entity.monster.EntityCreeper; -import net.minecraft.entity.monster.EntityEnderman; -import net.minecraft.entity.monster.EntitySkeleton; -import net.minecraft.entity.monster.EntitySlime; -import net.minecraft.entity.monster.EntitySpider; -import net.minecraft.entity.monster.EntityZombie; -import net.minecraft.entity.passive.EntityBat; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.init.Blocks; -import net.minecraft.stats.Achievement; -import net.minecraft.stats.StatFileWriter; -import net.minecraft.stats.StatisticsFile; -import net.minecraft.util.MathHelper; -import net.minecraft.world.ColorizerFoliage; -import net.minecraft.world.ColorizerGrass; -import net.minecraft.world.World; -import net.minecraft.world.biome.BiomeDecorator; -import net.minecraft.world.biome.BiomeGenBase; -import net.minecraft.world.gen.feature.WorldGenAbstractTree; -import net.minecraft.world.gen.feature.WorldGenBigMushroom; -import net.minecraft.world.gen.feature.WorldGenBigTree; -import net.minecraft.world.gen.feature.WorldGenForest; -import net.minecraft.world.gen.feature.WorldGenTallGrass; -import net.minecraft.world.gen.feature.WorldGenerator; -import net.minecraftforge.common.BiomeDictionary; -import net.minecraftforge.common.BiomeDictionary.Type; -import twilightforest.TwilightForestMod; -import twilightforest.entity.EntityTFKobold; -import twilightforest.entity.passive.EntityTFMobileFirefly; -import cpw.mods.fml.common.FMLLog; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - - -public abstract class TFBiomeBase extends BiomeGenBase { - - static - { - assignBlankBiomeIds(); - areThereBiomeIdConflicts(); - } - - public static final BiomeGenBase tfLake = (new TFBiomeTwilightLake(TwilightForestMod.idBiomeLake)).setColor(0x0000ff).setBiomeName("Twilight Lake").setHeight(height_DeepOceans); - public static final BiomeGenBase twilightForest = (new TFBiomeTwilightForest(TwilightForestMod.idBiomeTwilightForest)).setColor(0x005500).setBiomeName("Twilight Forest"); - public static final BiomeGenBase twilightForest2 = (new TFBiomeTwilightForestVariant(TwilightForestMod.idBiomeTwilightForestVariant)).setColor(0x005522).setBiomeName("Dense Twilight Forest").setHeight(height_MidPlains); - public static final BiomeGenBase highlands = (new TFBiomeHighlands(TwilightForestMod.idBiomeHighlands)).setColor(0x556644).setBiomeName("Twilight Highlands").setHeight(new Height(3.5F, 0.05F)); - public static final BiomeGenBase mushrooms = (new TFBiomeMushrooms(TwilightForestMod.idBiomeMushrooms)).setColor(0x226622).setBiomeName("Mushroom Forest"); - public static final BiomeGenBase tfSwamp = (new TFBiomeSwamp(TwilightForestMod.idBiomeSwamp)).setColor(0x334422).setBiomeName("Twilight Swamp").setHeight(new Height(-0.125F, 0.125F)); - public static final BiomeGenBase stream = (new TFBiomeStream(TwilightForestMod.idBiomeStream)).setColor(0x3253b7).setBiomeName("Twilight Stream").setHeight(height_ShallowWaters); - public static final BiomeGenBase tfSnow = (new TFBiomeSnow(TwilightForestMod.idBiomeSnowfield)).setColor(0xccffff).setBiomeName("Snowy Forest").setHeight(height_MidPlains); - public static final BiomeGenBase glacier = (new TFBiomeGlacier(TwilightForestMod.idBiomeGlacier)).setColor(0x7777bb).setBiomeName("Twilight Glacier"); - public static final BiomeGenBase clearing = (new TFBiomeClearing(TwilightForestMod.idBiomeClearing)).setColor(0x349b34).setBiomeName("Twilight Clearing").setHeight(height_LowPlains); - public static final BiomeGenBase oakSavanna = (new TFBiomeOakSavanna(TwilightForestMod.idBiomeOakSavanna)).setColor(0x446622).setBiomeName("Oak Savanna").setHeight(height_MidPlains); - public static final BiomeGenBase fireflyForest = (new TFBiomeFireflyForest(TwilightForestMod.idBiomeFireflyForest)).setColor(0x006633).setBiomeName("Firefly Forest").setHeight(height_LowPlains); - public static final BiomeGenBase deepMushrooms = (new TFBiomeDeepMushrooms(TwilightForestMod.idBiomeDeepMushrooms)).setColor(0x663322).setBiomeName("Deep Mushroom Forest").setHeight(height_LowPlains); - public static final BiomeGenBase darkForest = (new TFBiomeDarkForest(TwilightForestMod.idBiomeDarkForest)).setColor(0x003311).setBiomeName("Dark Forest").setHeight(height_LowPlains); - public static final BiomeGenBase enchantedForest = (new TFBiomeEnchantedForest(TwilightForestMod.idBiomeEnchantedForest)).setColor(0x115566).setBiomeName("Enchanted Forest"); - public static final BiomeGenBase fireSwamp = (new TFBiomeFireSwamp(TwilightForestMod.idBiomeFireSwamp)).setColor(0x42231a).setBiomeName("Fire Swamp").setHeight(height_Default); - public static final BiomeGenBase darkForestCenter = (new TFBiomeDarkForestCenter(TwilightForestMod.idBiomeDarkForestCenter)).setColor(0x002200).setBiomeName("Dark Forest Center").setHeight(height_LowPlains); - public static final BiomeGenBase highlandsCenter = (new TFBiomeFinalPlateau(TwilightForestMod.idBiomeHighlandsCenter)).setColor(0x334422).setBiomeName("Highlands Center").setHeight(new Height(10.5F, 0.025F)); - public static final BiomeGenBase thornlands = (new TFBiomeThornlands(TwilightForestMod.idBiomeThornlands)).setColor(0x223322).setBiomeName("Thornlands").setHeight(new Height(6F, 0.1F)); - - protected WorldGenBigMushroom bigMushroomGen; - protected WorldGenForest birchGen; - - /** - * Holds the classes of IMobs (hostile mobs) that can be spawned in the biome. - */ - protected List undergroundMonsterList; - - @SuppressWarnings("unchecked") - public TFBiomeBase(int i) - { - super(i); - - bigMushroomGen = new WorldGenBigMushroom(); - birchGen = new WorldGenForest(false, false); - - // try to stop world leaks - this.worldGeneratorBigTree = null; - - // remove normal monster spawns - spawnableMonsterList.clear(); - // remove squids - spawnableWaterCreatureList.clear(); - // custom creature list. - spawnableCreatureList.clear(); - spawnableCreatureList.add(new SpawnListEntry(twilightforest.entity.passive.EntityTFBighorn.class, 12, 4, 4)); - spawnableCreatureList.add(new SpawnListEntry(twilightforest.entity.passive.EntityTFBoar.class, 10, 4, 4)); - spawnableCreatureList.add(new SpawnListEntry(net.minecraft.entity.passive.EntityChicken.class, 10, 4, 4)); - spawnableCreatureList.add(new SpawnListEntry(twilightforest.entity.passive.EntityTFDeer.class, 15, 4, 5)); - spawnableCreatureList.add(new SpawnListEntry(net.minecraft.entity.passive.EntityWolf.class, 5, 4, 4)); - - spawnableCreatureList.add(new SpawnListEntry(twilightforest.entity.passive.EntityTFTinyBird.class, 15, 4, 8)); - spawnableCreatureList.add(new SpawnListEntry(twilightforest.entity.passive.EntityTFSquirrel.class, 10, 2, 4)); - spawnableCreatureList.add(new SpawnListEntry(twilightforest.entity.passive.EntityTFBunny.class, 10, 4, 5)); - spawnableCreatureList.add(new SpawnListEntry(twilightforest.entity.passive.EntityTFRaven.class, 10, 1, 2)); - - undergroundMonsterList = new ArrayList(); - - undergroundMonsterList.add(new SpawnListEntry(EntitySpider.class, 10, 4, 4)); - undergroundMonsterList.add(new SpawnListEntry(EntityZombie.class, 10, 4, 4)); - undergroundMonsterList.add(new SpawnListEntry(EntitySkeleton.class, 10, 4, 4)); - undergroundMonsterList.add(new SpawnListEntry(EntityCreeper.class, 1, 4, 4)); - undergroundMonsterList.add(new SpawnListEntry(EntitySlime.class, 10, 4, 4)); - undergroundMonsterList.add(new SpawnListEntry(EntityEnderman.class, 1, 1, 4)); - undergroundMonsterList.add(new SpawnListEntry(EntityTFKobold.class, 10, 4, 8)); - - this.spawnableCaveCreatureList.clear(); - this.spawnableCaveCreatureList.add(new BiomeGenBase.SpawnListEntry(EntityBat.class, 10, 8, 8)); - this.spawnableCaveCreatureList.add(new SpawnListEntry(EntityTFMobileFirefly.class, 10, 8, 8)); - - getTFBiomeDecorator().setTreesPerChunk(10); - getTFBiomeDecorator().setGrassPerChunk(2); - } - - @Override - public TFBiomeBase setColor(int par1) { - return (TFBiomeBase) super.setColor(par1); - } - - - /** - * returns the chance a creature has to spawn. - */ - @Override - public float getSpawningChance() - { - // okay, 20% more animals - return 0.12F; - } - - /** - * Allocate a new BiomeDecorator for this BiomeGenBase - */ - @Override - public BiomeDecorator createBiomeDecorator() - { - return new TFBiomeDecorator(); - } - - protected TFBiomeDecorator getTFBiomeDecorator() { - return (TFBiomeDecorator)this.theBiomeDecorator; - } - - /** - * Forest trees all over - * - * used to be getRandomWorldGenForTrees() - */ - public WorldGenAbstractTree func_150567_a(Random random) - { - if(random.nextInt(5) == 0) - { - return birchGen; - } - if(random.nextInt(10) == 0) - { - return new WorldGenBigTree(false); - } else - { - return worldGeneratorTrees; - } - } - - /** - * Ferns! - */ - public WorldGenerator getRandomWorldGenForGrass(Random par1Random) - { - if (par1Random.nextInt(4) == 0) - { - return new WorldGenTallGrass(Blocks.tallgrass, 2); - } - else - { - return new WorldGenTallGrass(Blocks.tallgrass, 1); - } - } - - /** - * If any biome IDs are -1, find an open ID for them. - */ - public static boolean assignBlankBiomeIds() { - boolean assigned = false; - - boolean[] usedIDs = new boolean[BiomeGenBase.getBiomeGenArray().length]; - - checkUsedIDs(usedIDs); - - TwilightForestMod.idBiomeLake = assignIdIfNeeded(usedIDs, TwilightForestMod.idBiomeLake); - TwilightForestMod.idBiomeTwilightForest = assignIdIfNeeded(usedIDs, TwilightForestMod.idBiomeTwilightForest); - TwilightForestMod.idBiomeTwilightForestVariant = assignIdIfNeeded(usedIDs, TwilightForestMod.idBiomeTwilightForestVariant); - TwilightForestMod.idBiomeHighlands = assignIdIfNeeded(usedIDs, TwilightForestMod.idBiomeHighlands); - TwilightForestMod.idBiomeMushrooms = assignIdIfNeeded(usedIDs, TwilightForestMod.idBiomeMushrooms); - TwilightForestMod.idBiomeSwamp = assignIdIfNeeded(usedIDs, TwilightForestMod.idBiomeSwamp); - TwilightForestMod.idBiomeStream = assignIdIfNeeded(usedIDs, TwilightForestMod.idBiomeStream); - TwilightForestMod.idBiomeSnowfield = assignIdIfNeeded(usedIDs, TwilightForestMod.idBiomeSnowfield); - TwilightForestMod.idBiomeGlacier = assignIdIfNeeded(usedIDs, TwilightForestMod.idBiomeGlacier); - TwilightForestMod.idBiomeClearing = assignIdIfNeeded(usedIDs, TwilightForestMod.idBiomeClearing); - TwilightForestMod.idBiomeOakSavanna = assignIdIfNeeded(usedIDs, TwilightForestMod.idBiomeOakSavanna); - TwilightForestMod.idBiomeFireflyForest = assignIdIfNeeded(usedIDs, TwilightForestMod.idBiomeFireflyForest); - TwilightForestMod.idBiomeDeepMushrooms = assignIdIfNeeded(usedIDs, TwilightForestMod.idBiomeDeepMushrooms); - TwilightForestMod.idBiomeDarkForestCenter = assignIdIfNeeded(usedIDs, TwilightForestMod.idBiomeDarkForestCenter); - TwilightForestMod.idBiomeHighlandsCenter = assignIdIfNeeded(usedIDs, TwilightForestMod.idBiomeHighlandsCenter); - TwilightForestMod.idBiomeDarkForest = assignIdIfNeeded(usedIDs, TwilightForestMod.idBiomeDarkForest); - TwilightForestMod.idBiomeEnchantedForest = assignIdIfNeeded(usedIDs, TwilightForestMod.idBiomeEnchantedForest); - TwilightForestMod.idBiomeFireSwamp = assignIdIfNeeded(usedIDs, TwilightForestMod.idBiomeFireSwamp); - TwilightForestMod.idBiomeThornlands = assignIdIfNeeded(usedIDs, TwilightForestMod.idBiomeThornlands); - - return assigned; - } - - /** - * Populate the array with whether there is a biome using that ID - */ - private static void checkUsedIDs(boolean[] usedIDs) { - for (int i = 0; i < usedIDs.length; i++) { - usedIDs[i] = (BiomeGenBase.getBiomeGenArray()[i] != null); - } - } - - /** - * Return a new biome ID if the given id is -1 - */ - private static int assignIdIfNeeded(boolean[] usedIDs, int biomeID) { - if (biomeID == -1) { - biomeID = findNextOpenBiomeId(usedIDs); - TwilightForestMod.hasAssignedBiomeID = true; - } - - return biomeID; - } - - /** - * Find an open biome ID - */ - private static int findNextOpenBiomeId(boolean[] usedIDs) { - for (int i = 0; i < 256; i++) { - if (!usedIDs[i]) { - usedIDs[i] = true; - return i; - } - } - - // Uh oh... - FMLLog.warning("[TwilightForest] Could not find open biome ID. Edit the Twilight Forest config to give all biomes unique IDs."); - return -1; - } - - /** - * Check all of our biome IDs. If there is a biome in them that is not null and does not inherit from TFBiomeBase, make a warning. - */ - public static boolean areThereBiomeIdConflicts() - { - boolean conflict = TwilightForestMod.hasBiomeIdConflicts; - - //FMLLog.info("[TwilightForest] Starting biome conflict detection. Conflict = " + conflict); - - conflict |= isConflictAtBiomeID(TwilightForestMod.idBiomeLake); - conflict |= isConflictAtBiomeID(TwilightForestMod.idBiomeTwilightForest); - conflict |= isConflictAtBiomeID(TwilightForestMod.idBiomeTwilightForestVariant); - conflict |= isConflictAtBiomeID(TwilightForestMod.idBiomeHighlands); - conflict |= isConflictAtBiomeID(TwilightForestMod.idBiomeMushrooms); - conflict |= isConflictAtBiomeID(TwilightForestMod.idBiomeSwamp); - conflict |= isConflictAtBiomeID(TwilightForestMod.idBiomeStream); - conflict |= isConflictAtBiomeID(TwilightForestMod.idBiomeSnowfield); - conflict |= isConflictAtBiomeID(TwilightForestMod.idBiomeGlacier); - conflict |= isConflictAtBiomeID(TwilightForestMod.idBiomeClearing); - conflict |= isConflictAtBiomeID(TwilightForestMod.idBiomeOakSavanna); - conflict |= isConflictAtBiomeID(TwilightForestMod.idBiomeFireflyForest); - conflict |= isConflictAtBiomeID(TwilightForestMod.idBiomeDeepMushrooms); - conflict |= isConflictAtBiomeID(TwilightForestMod.idBiomeDarkForestCenter); - conflict |= isConflictAtBiomeID(TwilightForestMod.idBiomeHighlandsCenter); - conflict |= isConflictAtBiomeID(TwilightForestMod.idBiomeDarkForest); - conflict |= isConflictAtBiomeID(TwilightForestMod.idBiomeEnchantedForest); - conflict |= isConflictAtBiomeID(TwilightForestMod.idBiomeFireSwamp); - conflict |= isConflictAtBiomeID(TwilightForestMod.idBiomeThornlands); - - if (conflict) { - FMLLog.warning("[TwilightForest] Biome ID conflict detected. Edit the Twilight Forest config to give all biomes unique IDs."); - } else { - //FMLLog.info("[TwilightForest] No biome ID conflicts detected! You're safe!"); - } - - TwilightForestMod.hasBiomeIdConflicts |= conflict; - - return conflict; - } - - /** - * Check the ID for conflicts - */ - public static boolean isConflictAtBiomeID(int id) { - BiomeGenBase biomeAt = BiomeGenBase.getBiome(id); - - if (biomeAt == null || biomeAt instanceof TFBiomeBase) { - //FMLLog.warning("[TwilightForest] Biome ID %d contains a biome named %s.", id, biomeAt); - return false; - } else { - FMLLog.warning("[TwilightForest] Biome ID conflict. Biome ID %d contains a biome named %s, but Twilight Forest is set to use that ID.", id, biomeAt.biomeName); - return true; - } - } - - /** - * Register our biomes with the Forge biome dictionary - */ - public static void registerWithBiomeDictionary() - { - BiomeDictionary.registerBiomeType(tfLake, Type.OCEAN); - BiomeDictionary.registerBiomeType(twilightForest, Type.FOREST); - BiomeDictionary.registerBiomeType(twilightForest2, Type.FOREST, Type.DENSE); - BiomeDictionary.registerBiomeType(highlands, Type.FOREST, Type.MOUNTAIN, Type.CONIFEROUS); - BiomeDictionary.registerBiomeType(mushrooms, Type.FOREST, Type.MUSHROOM); - BiomeDictionary.registerBiomeType(tfSwamp, Type.SWAMP, Type.WET); - BiomeDictionary.registerBiomeType(stream, Type.RIVER); - BiomeDictionary.registerBiomeType(tfSnow, Type.FOREST, Type.SNOWY, Type.COLD, Type.CONIFEROUS); - BiomeDictionary.registerBiomeType(glacier, Type.COLD, Type.SNOWY, Type.WASTELAND); - BiomeDictionary.registerBiomeType(clearing, Type.PLAINS, Type.SPARSE); - BiomeDictionary.registerBiomeType(oakSavanna, Type.FOREST, Type.SPARSE); - BiomeDictionary.registerBiomeType(fireflyForest, Type.FOREST, Type.LUSH); - BiomeDictionary.registerBiomeType(deepMushrooms, Type.FOREST, Type.MUSHROOM); - BiomeDictionary.registerBiomeType(darkForest, Type.FOREST, Type.DENSE, Type.SPOOKY); - BiomeDictionary.registerBiomeType(enchantedForest, Type.FOREST, Type.MAGICAL); - BiomeDictionary.registerBiomeType(fireSwamp, Type.SWAMP, Type.WASTELAND, Type.HOT); - BiomeDictionary.registerBiomeType(darkForestCenter, Type.FOREST, Type.DENSE, Type.SPOOKY, Type.MAGICAL); - BiomeDictionary.registerBiomeType(highlandsCenter, Type.MESA, Type.DEAD, Type.DRY, Type.WASTELAND); - BiomeDictionary.registerBiomeType(thornlands, Type.HILLS, Type.DEAD, Type.DRY, Type.WASTELAND); - } - - -// /** -// * Provides the basic grass color based on the biome temperature and rainfall -// */ -// @SideOnly(Side.CLIENT) -// @Override -// public int getBiomeGrassColor(int x, int y, int z) -// { -// // I hate to be grumpy, but using events for this is a waste of memory and GC resources -// double d0 = (double)MathHelper.clamp_float(this.getFloatTemperature(x, y, z), 0.0F, 1.0F); -// double d1 = (double)MathHelper.clamp_float(this.getFloatRainfall(), 0.0F, 1.0F); -// return ColorizerGrass.getGrassColor(d0, d1); -// } - -// /** -// * Provides the basic foliage color based on the biome temperature and rainfall -// */ -// @SideOnly(Side.CLIENT) -// @Override -// public int getBiomeFoliageColor(int x, int y, int z) -// { -// // I hate to be grumpy, but using events for this is a waste of memory and GC resources -// double d0 = (double)MathHelper.clamp_float(this.getFloatTemperature(x, y, z), 0.0F, 1.0F); -// double d1 = (double)MathHelper.clamp_float(this.getFloatRainfall(), 0.0F, 1.0F); -// return ColorizerFoliage.getFoliageColor(d0, d1); -// } - - -// @SideOnly(Side.CLIENT) -// public int getWaterColorMultiplier() -// { -// // I hate to be grumpy, but using events for this is a waste of memory and GC resources -// return this.waterColorMultiplier; -// } - - public void genTerrainBlocks(World world, Random rand, Block[] blockStorage, byte[] metaStorage, int x, int z, double stoneNoise) - { - this.genTwilightBiomeTerrain(world, rand, blockStorage, metaStorage, x, z, stoneNoise); - } - - /** - * This is just the biome terrain gen function modified to have sea level at 32 instead of 64 - */ - public void genTwilightBiomeTerrain(World world, Random rand, Block[] blockStorage, byte[] metaStorage, int x, int z, double stoneNoise) - { - Block topBlock = this.topBlock; - byte topMeta = (byte)(this.field_150604_aj & 255); - Block fillerBlock = this.fillerBlock; - byte fillerMeta = (byte)(this.field_76754_C & 255); - int currentFillerDepth = -1; - int maxFillerDepth = (int)(stoneNoise / 3.0D + 3.0D + rand.nextDouble() * 0.25D); - int maskX = x & 15; - int maskZ = z & 15; - int worldHeight = blockStorage.length / 256; - - int seaLevel = 32; - - for (int y = 255; y >= 0; --y) - { - int index = (maskZ * 16 + maskX) * worldHeight + y; - - if (y <= 0 + rand.nextInt(5)) - { - blockStorage[index] = Blocks.bedrock; - } - else - { - Block currentBlock = blockStorage[index]; - - if (currentBlock != null && currentBlock.getMaterial() != Material.air) - { - if (currentBlock == Blocks.stone) - { - // ADDED STONE REPLACEMENT - if (this.getStoneReplacementBlock() != null) { - blockStorage[index] = this.getStoneReplacementBlock(); - metaStorage[index] = this.getStoneReplacementMeta(); - } - - if (currentFillerDepth == -1) - { - if (maxFillerDepth <= 0) - { - topBlock = null; - topMeta = 0; - fillerBlock = Blocks.stone; - fillerMeta = 0; - } - else if (y >= (seaLevel - 5) && y <= seaLevel) - { - topBlock = this.topBlock; - topMeta = (byte)(this.field_150604_aj & 255); - fillerBlock = this.fillerBlock; - fillerMeta = (byte)(this.field_76754_C & 255); - } - - if (y < (seaLevel - 1) && (topBlock == null || topBlock.getMaterial() == Material.air)) - { - if (this.getFloatTemperature(x, y, z) < 0.15F) - { - topBlock = Blocks.ice; - topMeta = 0; - } - else - { - topBlock = Blocks.water; - topMeta = 0; - } - } - - currentFillerDepth = maxFillerDepth; - - if (y >= (seaLevel - 2)) - { - blockStorage[index] = topBlock; - metaStorage[index] = topMeta; - } - else if (y < (seaLevel - 8) - maxFillerDepth) - { - topBlock = null; - fillerBlock = Blocks.stone; - fillerMeta = 0; - blockStorage[index] = Blocks.gravel; - } - else - { - blockStorage[index] = fillerBlock; - metaStorage[index] = fillerMeta; - } - } - else if (currentFillerDepth > 0) - { - --currentFillerDepth; - blockStorage[index] = fillerBlock; - metaStorage[index] = fillerMeta; - - if (currentFillerDepth == 0 && fillerBlock == Blocks.sand) - { - currentFillerDepth = rand.nextInt(4) + Math.max(0, y - (seaLevel - 1)); - fillerBlock = Blocks.sandstone; - fillerMeta = 0; - } - } - } - } - else - { - //currentFillerDepth = -1; - } - } - } - } - - /** - * Return a block if you want it to replace stone in the terrain generation - */ - public Block getStoneReplacementBlock() { - return null; - } - - /** - * Metadata for the stone replacement block - */ - public byte getStoneReplacementMeta() { - return 0; - } - - /** - * Does the player have the achievement needed to be in this biome? - * Defaults to true for no achievement required biomes. - */ - public boolean doesPlayerHaveRequiredAchievement(EntityPlayer player) { - - if (getRequiredAchievement() != null && player instanceof EntityPlayerMP && ((EntityPlayerMP)player).func_147099_x() != null) { - StatisticsFile stats = ((EntityPlayerMP)player).func_147099_x(); - - return stats.hasAchievementUnlocked(this.getRequiredAchievement()); - } else if (getRequiredAchievement() != null && player instanceof EntityClientPlayerMP && ((EntityClientPlayerMP)player).getStatFileWriter() != null) { - StatFileWriter stats = ((EntityClientPlayerMP)player).getStatFileWriter(); - - return stats.hasAchievementUnlocked(this.getRequiredAchievement()); - } else { - return true; - } - } - - /** - * If there is a required achievement to be here, return it, otherwise return null - */ - protected Achievement getRequiredAchievement() { - return null; - } - - /** - * Do something bad to a player in the wrong biome. - */ - public void enforceProgession(EntityPlayer player, World world) { - ; - } - - /** - * Returns the list of underground creatures. - */ - public List getUndergroundSpawnableList() { - return this.undergroundMonsterList; - } -} - diff --git a/src/main/java/twilightforest/biomes/TFBiomeCenter.java b/src/main/java/twilightforest/biomes/TFBiomeCenter.java deleted file mode 100644 index 944e608276..0000000000 --- a/src/main/java/twilightforest/biomes/TFBiomeCenter.java +++ /dev/null @@ -1,14 +0,0 @@ -package twilightforest.biomes; - - - -public class TFBiomeCenter extends TFBiomeBase { - - public TFBiomeCenter(int i) { - super(i); - -// this.topBlock = (byte) Blocks.stone; -// this.fillerBlock = (byte) Blocks.stone; - } - -} diff --git a/src/main/java/twilightforest/biomes/TFBiomeCenter2.java b/src/main/java/twilightforest/biomes/TFBiomeCenter2.java deleted file mode 100644 index b903f2abfa..0000000000 --- a/src/main/java/twilightforest/biomes/TFBiomeCenter2.java +++ /dev/null @@ -1,14 +0,0 @@ -package twilightforest.biomes; - - - -public class TFBiomeCenter2 extends TFBiomeBase { - - public TFBiomeCenter2(int i) { - super(i); - -// this.topBlock = (byte) Blocks.stone; -// this.fillerBlock = (byte) Blocks.stone; - } - -} diff --git a/src/main/java/twilightforest/biomes/TFBiomeClearing.java b/src/main/java/twilightforest/biomes/TFBiomeClearing.java deleted file mode 100644 index 7f14fccf3c..0000000000 --- a/src/main/java/twilightforest/biomes/TFBiomeClearing.java +++ /dev/null @@ -1,36 +0,0 @@ -package twilightforest.biomes; - -import java.util.Random; - -import net.minecraft.init.Blocks; -import net.minecraft.world.gen.feature.WorldGenTallGrass; -import net.minecraft.world.gen.feature.WorldGenerator; - - -public class TFBiomeClearing extends TFBiomeBase { - - public TFBiomeClearing(int i) { - super(i); - - this.temperature = 0.8F; - this.rainfall = 0.4F; - -// this.rootHeight = 0.01F; -// this.heightVariation = 0F; - - getTFBiomeDecorator().canopyPerChunk = -999; - getTFBiomeDecorator().setTreesPerChunk(-999); - - getTFBiomeDecorator().setFlowersPerChunk(4); - getTFBiomeDecorator().setGrassPerChunk(10); - } - - /** - * No ferns - */ - public WorldGenerator getRandomWorldGenForGrass(Random par1Random) - { - return new WorldGenTallGrass(Blocks.tallgrass, 1); - } - -} diff --git a/src/main/java/twilightforest/biomes/TFBiomeDarkForest.java b/src/main/java/twilightforest/biomes/TFBiomeDarkForest.java deleted file mode 100644 index 0a025f274b..0000000000 --- a/src/main/java/twilightforest/biomes/TFBiomeDarkForest.java +++ /dev/null @@ -1,167 +0,0 @@ -package twilightforest.biomes; - -import java.util.ArrayList; -import java.util.List; -import java.util.Random; - -import net.minecraft.entity.EnumCreatureType; -import net.minecraft.entity.monster.EntityEnderman; -import net.minecraft.entity.monster.EntitySkeleton; -import net.minecraft.entity.monster.EntityWitch; -import net.minecraft.entity.monster.EntityZombie; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.potion.Potion; -import net.minecraft.potion.PotionEffect; -import net.minecraft.stats.Achievement; -import net.minecraft.util.MathHelper; -import net.minecraft.world.ColorizerFoliage; -import net.minecraft.world.ColorizerGrass; -import net.minecraft.world.World; -import net.minecraft.world.biome.BiomeDecorator; -import net.minecraft.world.gen.feature.WorldGenAbstractTree; -import net.minecraft.world.gen.feature.WorldGenShrub; -import twilightforest.TFAchievementPage; -import twilightforest.TFFeature; -import twilightforest.entity.EntityTFKingSpider; -import twilightforest.entity.EntityTFKobold; -import twilightforest.entity.EntityTFMistWolf; -import twilightforest.entity.EntityTFSkeletonDruid; - - - -public class TFBiomeDarkForest extends TFBiomeBase { - - private static final int MONSTER_SPAWN_RATE = 20; - Random monsterRNG; - ArrayList emptyList = new ArrayList(); - - @SuppressWarnings("unchecked") - public TFBiomeDarkForest(int i) { - super(i); - - this.temperature = 0.7F; - this.rainfall = 0.8F; - - getTFBiomeDecorator().canopyPerChunk = 5.5F; - - getTFBiomeDecorator().setTreesPerChunk(10); - getTFBiomeDecorator().setGrassPerChunk(-99); - getTFBiomeDecorator().setFlowersPerChunk(-99); - getTFBiomeDecorator().setMushroomsPerChunk(2); - getTFBiomeDecorator().setDeadBushPerChunk(10); - - - this.rootHeight = 0.05F; - this.heightVariation = 0.05F; - - this.monsterRNG = new Random(); - - this.spawnableMonsterList.add(new SpawnListEntry(EntityEnderman.class, 1, 1, 4)); - this.spawnableMonsterList.add(new SpawnListEntry(EntityZombie.class, 5, 1, 4)); - this.spawnableMonsterList.add(new SpawnListEntry(EntitySkeleton.class, 5, 1, 4)); - this.spawnableMonsterList.add(new SpawnListEntry(EntityTFMistWolf.class, 10, 1, 4)); - this.spawnableMonsterList.add(new SpawnListEntry(EntityTFSkeletonDruid.class, 10, 1, 4)); - this.spawnableMonsterList.add(new SpawnListEntry(EntityTFKingSpider.class, 10, 1, 4)); - this.spawnableMonsterList.add(new SpawnListEntry(EntityTFKobold.class, 10, 4, 8)); - this.spawnableMonsterList.add(new SpawnListEntry(EntityWitch.class, 1, 1, 1)); - - this.theBiomeDecorator.generateLakes = false; - } - - /** - * We have our own decorator since we have strange generation - */ - public BiomeDecorator createBiomeDecorator() - { - return new TFDarkForestBiomeDecorator(); - } - - /** - * Occasional shrub, no big trees - */ - public WorldGenAbstractTree func_150567_a(Random random) - { - if(random.nextInt(5) == 0) - { - return new WorldGenShrub(3, 0); - } - if(random.nextInt(8) == 0) - { - return this.birchGen; - } - else { - return worldGeneratorTrees; - } - } - - /** - * Provides the basic grass color based on the biome temperature and rainfall - */ - @Override - public int getBiomeGrassColor(int x, int y, int z) - { - double var1 = (double)MathHelper.clamp_float(this.getFloatTemperature(x, y, z), 0.0F, 1.0F); - double var3 = (double)MathHelper.clamp_float(this.getFloatRainfall(), 0.0F, 1.0F); - return ((ColorizerGrass.getGrassColor(var1, var3) & 0xFEFEFE) + 0x1E0E4E) / 2; - -// return 0x554114; - } - - /** - * Provides the basic foliage color based on the biome temperature and rainfall - */ - @Override - public int getBiomeFoliageColor(int x, int y, int z) - { - double var1 = (double)MathHelper.clamp_float(this.getFloatTemperature(x, y, z), 0.0F, 1.0F); - double var3 = (double)MathHelper.clamp_float(this.getFloatRainfall(), 0.0F, 1.0F); - return ((ColorizerFoliage.getFoliageColor(var1, var3) & 0xFEFEFE) + 0x1E0E4E) / 2; - } - - - /** - * Returns the correspondent list of the EnumCreatureType informed. - */ - @SuppressWarnings("rawtypes") - @Override - public List getSpawnableList(EnumCreatureType par1EnumCreatureType) - { - // if is is monster, then only give it the real list 1/MONSTER_SPAWN_RATE of the time - if (par1EnumCreatureType == EnumCreatureType.monster) { - return monsterRNG.nextInt(MONSTER_SPAWN_RATE) == 0 ? this.spawnableMonsterList : emptyList; - } - else { - return par1EnumCreatureType == EnumCreatureType.creature ? this.spawnableCreatureList : (par1EnumCreatureType == EnumCreatureType.waterCreature ? this.spawnableWaterCreatureList : (par1EnumCreatureType == EnumCreatureType.ambient ? this.spawnableCaveCreatureList : null)); - } - } - - /** - * This just seems to act as a fire discouragement - */ - @Override - public boolean isHighHumidity() { - return true; - } - - - /** - * If there is a required achievement to be here, return it, otherwise return null - */ - protected Achievement getRequiredAchievement() { - return TFAchievementPage.twilightProgressHydra; - } - - /** - * Do something bad to a player in the wrong biome. - */ - public void enforceProgession(EntityPlayer player, World world) { - if (!world.isRemote && world.getWorldTime() % 60 == 0) { - player.addPotionEffect(new PotionEffect(Potion.blindness.id, 100, 0)); - - // hint monster? - if (world.rand.nextInt(4) == 0) { - TFFeature.tfStronghold.trySpawnHintMonster(world, player); - } - } - } -} diff --git a/src/main/java/twilightforest/biomes/TFBiomeDarkForestCenter.java b/src/main/java/twilightforest/biomes/TFBiomeDarkForestCenter.java deleted file mode 100644 index 25df5dfa03..0000000000 --- a/src/main/java/twilightforest/biomes/TFBiomeDarkForestCenter.java +++ /dev/null @@ -1,29 +0,0 @@ -package twilightforest.biomes; - -public class TFBiomeDarkForestCenter extends TFBiomeDarkForest { - - public TFBiomeDarkForestCenter(int i) { - super(i); - } - - - /** - * Provides the basic grass color based on the biome temperature and rainfall - */ - @Override - public int getBiomeGrassColor(int x, int y, int z) - { - double d0 = plantNoise.func_151601_a((double)x * 0.0225D, (double)z * 0.0225D); - return d0 < -0.2D ? 0x667540 : 0x554114; - } - - /** - * Provides the basic foliage color based on the biome temperature and rainfall - */ - @Override - public int getBiomeFoliageColor(int x, int y, int z) - { - double d0 = plantNoise.func_151601_a((double)x * 0.0225D, (double)z * 0.0225D); - return d0 < -0.1D ? 0xf9821e : 0xe94e14; - } -} diff --git a/src/main/java/twilightforest/biomes/TFBiomeDecorator.java b/src/main/java/twilightforest/biomes/TFBiomeDecorator.java deleted file mode 100644 index 52bbf69ab5..0000000000 --- a/src/main/java/twilightforest/biomes/TFBiomeDecorator.java +++ /dev/null @@ -1,316 +0,0 @@ -package twilightforest.biomes; - -import java.util.ArrayList; -import java.util.List; -import java.util.Random; - -import net.minecraft.init.Blocks; -import net.minecraft.util.WeightedRandom; -import net.minecraft.world.World; -import net.minecraft.world.biome.BiomeDecorator; -import net.minecraft.world.biome.BiomeGenBase; -import net.minecraft.world.gen.feature.WorldGenLakes; -import net.minecraft.world.gen.feature.WorldGenLiquids; -import twilightforest.TFFeature; -import twilightforest.TwilightForestMod; -import twilightforest.world.TFGenCanopyMushroom; -import twilightforest.world.TFGenCanopyTree; -import twilightforest.world.TFGenFallenHollowLog; -import twilightforest.world.TFGenFallenSmallLog; -import twilightforest.world.TFGenFoundation; -import twilightforest.world.TFGenGroveRuins; -import twilightforest.world.TFGenTorchBerries; -import twilightforest.world.TFGenHollowStump; -import twilightforest.world.TFGenHollowTree; -import twilightforest.world.TFGenMangroveTree; -import twilightforest.world.TFGenMonolith; -import twilightforest.world.TFGenMyceliumBlob; -import twilightforest.world.TFGenOutsideStalagmite; -import twilightforest.world.TFGenPlantRoots; -import twilightforest.world.TFGenStoneCircle; -import twilightforest.world.TFGenWell; -import twilightforest.world.TFGenWitchHut; -import twilightforest.world.TFGenWoodRoots; -import twilightforest.world.TFGenerator; -import twilightforest.world.TFTreeGenerator; - - - -public class TFBiomeDecorator extends BiomeDecorator { - - TFGenCanopyTree canopyTreeGen; - TFTreeGenerator alternateCanopyGen; - TFGenHollowTree hollowTreeGen; - TFGenMyceliumBlob myceliumBlobGen; - WorldGenLakes extraLakeGen; - WorldGenLakes extraLavaPoolGen; - TFGenMangroveTree mangroveTreeGen; - - TFGenPlantRoots plantRootGen; - TFGenWoodRoots woodRootGen; - WorldGenLiquids caveWaterGen; - TFGenTorchBerries torchBerryGen; - - public float canopyPerChunk; - public float alternateCanopyChance; - public int myceliumPerChunk; - public int mangrovesPerChunk; - public int lakesPerChunk; - public float lavaPoolChance; - - static final List ruinList = new ArrayList(); - static { - // make list of ruins - ruinList.add(new RuinEntry(new TFGenStoneCircle(), 10)); - ruinList.add(new RuinEntry(new TFGenWell(), 10)); - ruinList.add(new RuinEntry(new TFGenWitchHut(), 5)); - ruinList.add(new RuinEntry(new TFGenOutsideStalagmite(), 12)); - ruinList.add(new RuinEntry(new TFGenFoundation(), 10)); - ruinList.add(new RuinEntry(new TFGenMonolith(), 10)); - ruinList.add(new RuinEntry(new TFGenGroveRuins(), 5)); - ruinList.add(new RuinEntry(new TFGenHollowStump(), 12)); - ruinList.add(new RuinEntry(new TFGenFallenHollowLog(), 10)); - ruinList.add(new RuinEntry(new TFGenFallenSmallLog(), 10)); - } - - /** - * WeightedRandomItem for making the minor features - */ - static class RuinEntry extends WeightedRandom.Item - { - public final TFGenerator generator; - public RuinEntry(TFGenerator generator, int weight) - { - super(weight); - this.generator = generator; - } - } - - - public TFBiomeDecorator() { - super(); - - canopyTreeGen = new TFGenCanopyTree(); - alternateCanopyGen = new TFGenCanopyMushroom(); - mangroveTreeGen = new TFGenMangroveTree(); - myceliumBlobGen = new TFGenMyceliumBlob(5); - hollowTreeGen = new TFGenHollowTree(); - extraLakeGen = new WorldGenLakes(Blocks.water); - extraLavaPoolGen = new WorldGenLakes(Blocks.lava); - - plantRootGen = new TFGenPlantRoots(); - woodRootGen = new TFGenWoodRoots(); - caveWaterGen = new WorldGenLiquids(Blocks.flowing_water); - torchBerryGen = new TFGenTorchBerries(); - - canopyPerChunk = TwilightForestMod.canopyCoverage; - alternateCanopyChance = 0; - myceliumPerChunk = 0; - lakesPerChunk = 0; - lavaPoolChance = 0; - mangrovesPerChunk = 0; - } - - /** - * Decorates the world. Calls code that was formerly (pre-1.8) in ChunkProviderGenerate.populate - */ - @Override - public void decorateChunk(World world, Random rand, BiomeGenBase biome, int mapX, int mapZ) - { - - // check for features - TFFeature nearFeature = TFFeature.getNearestFeature(mapX >> 4, mapZ >> 4, world); - - if (!nearFeature.areChunkDecorationsEnabled) { - // no normal decorations here, these parts supply their own decorations. - decorateUnderground(world, rand, mapX, mapZ); - decorateOnlyOres(world, rand, mapX, mapZ); - } else { -// // hollow trees! -// if (rand.nextInt(24) == 0) { -// int rx = mapX + rand.nextInt(16) + 8; -// int rz = mapZ + rand.nextInt(16) + 8; -// int ry = world.getHeightValue(rx, rz); -// hollowTreeGen.generate(world, rand, rx, ry, rz); -// } - - // regular decorations - this.currentWorld = null; // suppress "Already decorating" error. I'm fairly sure that this mod does not cause this on its own, but cross-mod interactions seem to. - super.decorateChunk(world, rand, biome, mapX, mapZ); - - } - - } - - /** - * The method that does the work of actually decorating chunks - */ - protected void genDecorations(BiomeGenBase biome) - { - - // random features! - if(randomGenerator.nextInt(6) == 0) - { - int rx = chunk_X + randomGenerator.nextInt(16) + 8; - int rz = chunk_Z + randomGenerator.nextInt(16) + 8; - int ry = currentWorld.getHeightValue(rx, rz); - TFGenerator rf = randomFeature(randomGenerator); - if (rf.generate(currentWorld, randomGenerator, rx, ry, rz)) - { -// System.out.println(rf + " success at " + rx + ", " + ry + ", " + rz); - } - } - - // add canopy trees - int nc = (int)canopyPerChunk + ((randomGenerator.nextFloat() < (canopyPerChunk - (int)canopyPerChunk)) ? 1 : 0); - for (int i = 0; i < nc; i++) { - int rx = chunk_X + randomGenerator.nextInt(16) + 8; - int rz = chunk_Z + randomGenerator.nextInt(16) + 8; - int ry = currentWorld.getHeightValue(rx, rz); - if (this.alternateCanopyChance > 0 && randomGenerator.nextFloat() <= alternateCanopyChance) { - alternateCanopyGen.generate(currentWorld, randomGenerator, rx, ry, rz); - } else { - canopyTreeGen.generate(currentWorld, randomGenerator, rx, ry, rz); - } - } - - // mangrove trees - for (int i = 0; i < mangrovesPerChunk; i++) { - int rx = chunk_X + randomGenerator.nextInt(16) + 8; - int rz = chunk_Z + randomGenerator.nextInt(16) + 8; - int ry = currentWorld.getHeightValue(rx, rz); - mangroveTreeGen.generate(currentWorld, randomGenerator, rx, ry, rz); - } - // add extra lakes for swamps - for (int i = 0; i < lakesPerChunk; i++) { - int rx = chunk_X + randomGenerator.nextInt(16) + 8; - int rz = chunk_Z + randomGenerator.nextInt(16) + 8; - int ry = currentWorld.getHeightValue(rx, rz); - extraLakeGen.generate(currentWorld, randomGenerator, rx, ry, rz); - } - - // add extra lava for fire swamps - if (randomGenerator.nextFloat() <= lavaPoolChance) { - int rx = chunk_X + randomGenerator.nextInt(16) + 8; - int rz = chunk_Z + randomGenerator.nextInt(16) + 8; - int ry = currentWorld.getHeightValue(rx, rz); - extraLavaPoolGen.generate(currentWorld, randomGenerator, rx, ry, rz); - } - - // mycelium blobs - for (int i = 0; i < myceliumPerChunk; i++) { - int rx = chunk_X + randomGenerator.nextInt(16) + 8; - int rz = chunk_Z + randomGenerator.nextInt(16) + 8; - int ry = currentWorld.getHeightValue(rx, rz); - myceliumBlobGen.generate(currentWorld, randomGenerator, rx, ry, rz); - } - - super.genDecorations(biome); - - decorateUnderground(currentWorld, randomGenerator, chunk_X, chunk_Z); - - - } - - /** - * Generate the Twilight Forest underground decorations - */ - protected void decorateUnderground(World world, Random rand, int mapX, int mapZ) { - // generate roots - for (int i = 0; i < 12; ++i) - { - int rx = mapX + rand.nextInt(16) + 8; - byte ry = 64; - int rz = mapZ + rand.nextInt(16) + 8; - plantRootGen.generate(world, rand, rx, ry, rz); - } - - // generate roots - for (int i = 0; i < 20; ++i) - { - int rx = mapX + rand.nextInt(16) + 8; - int ry = rand.nextInt(64); - int rz = mapZ + rand.nextInt(16) + 8; - woodRootGen.generate(world, rand, rx, ry, rz); - } - - // extra underground water sources - if (this.generateLakes) { - for (int i = 0; i < 50; ++i) - { - int rx = mapX + rand.nextInt(16) + 8; - int ry = rand.nextInt(24) + 4; - int rz = mapZ + rand.nextInt(16) + 8; - caveWaterGen.generate(world, rand, rx, ry, rz); - } - } - - // torch berries are almost guaranteed to spawn so we don't need many - for (int i = 0; i < 3; ++i) - { - int rx = mapX + rand.nextInt(16) + 8; - int ry = 64; - int rz = mapZ + rand.nextInt(16) + 8; - torchBerryGen.generate(world, rand, rx, ry, rz); - } - } - - /** - * Generates ores only - */ - public void decorateOnlyOres(World world, Random rand, int mapX, int mapZ) { - this.currentWorld = world; - this.randomGenerator = rand; - this.chunk_X = mapX; - this.chunk_Z = mapZ; - this.generateOres(); - this.currentWorld = null; - this.randomGenerator = null; - } - - /** - * Gets a random feature suitible to the current biome. - */ - public TFGenerator randomFeature(Random rand) - { - return ((RuinEntry)WeightedRandom.getRandomItem(rand, ruinList)).generator; - } - - public void setTreesPerChunk(int treesPerChunk) { - this.treesPerChunk = treesPerChunk; - } - - public void setBigMushroomsPerChunk(int bigMushroomsPerChunk) { - this.bigMushroomsPerChunk = bigMushroomsPerChunk; - } - - public void setClayPerChunk(int clayPerChunk) { - this.clayPerChunk = clayPerChunk; - } - - public void setDeadBushPerChunk(int deadBushPerChunk) { - this.deadBushPerChunk = deadBushPerChunk; - } - - public void setMushroomsPerChunk(int mushroomsPerChunk) { - this.mushroomsPerChunk = mushroomsPerChunk; - } - - public void setFlowersPerChunk(int flowersPerChunk) { - this.flowersPerChunk = flowersPerChunk; - } - - public void setReedsPerChunk(int reedsPerChunk) { - this.reedsPerChunk = reedsPerChunk; - } - - public void setWaterlilyPerChunk(int waterlilyPerChunk) { - this.waterlilyPerChunk = waterlilyPerChunk; - } - - public void setGrassPerChunk(int grassPerChunk) { - this.grassPerChunk = grassPerChunk; - } - - -} diff --git a/src/main/java/twilightforest/biomes/TFBiomeDeepMushrooms.java b/src/main/java/twilightforest/biomes/TFBiomeDeepMushrooms.java deleted file mode 100644 index 71525b61a9..0000000000 --- a/src/main/java/twilightforest/biomes/TFBiomeDeepMushrooms.java +++ /dev/null @@ -1,26 +0,0 @@ -package twilightforest.biomes; - - -public class TFBiomeDeepMushrooms extends TFBiomeBase { - - public TFBiomeDeepMushrooms(int i) { - super(i); - - - this.temperature = 0.8F; - this.rainfall = 1.0F; - - this.rootHeight = 0.15F; - this.heightVariation = 0.4F; - - getTFBiomeDecorator().setTreesPerChunk(1); - - getTFBiomeDecorator().setMushroomsPerChunk(12); - getTFBiomeDecorator().setBigMushroomsPerChunk(8); - - getTFBiomeDecorator().myceliumPerChunk = 3; - getTFBiomeDecorator().alternateCanopyChance = 0.9F; - - } - -} diff --git a/src/main/java/twilightforest/biomes/TFBiomeEnchantedForest.java b/src/main/java/twilightforest/biomes/TFBiomeEnchantedForest.java deleted file mode 100644 index 04e0e73694..0000000000 --- a/src/main/java/twilightforest/biomes/TFBiomeEnchantedForest.java +++ /dev/null @@ -1,161 +0,0 @@ -package twilightforest.biomes; - -import java.util.Random; - -import net.minecraft.block.BlockFlower; -import net.minecraft.init.Blocks; -import net.minecraft.util.MathHelper; -import net.minecraft.world.World; -import net.minecraft.world.gen.feature.WorldGenAbstractTree; -import net.minecraft.world.gen.feature.WorldGenBigTree; -import net.minecraft.world.gen.feature.WorldGenTallGrass; -import net.minecraft.world.gen.feature.WorldGenVines; -import net.minecraft.world.gen.feature.WorldGenerator; -import twilightforest.block.BlockTFPlant; -import twilightforest.block.TFBlocks; -import twilightforest.world.TFGenLargeRainboak; -import twilightforest.world.TFGenSmallRainboak; -import twilightforest.world.TFWorld; - - - -public class TFBiomeEnchantedForest extends TFBiomeBase { - - Random colorRNG; - - public TFBiomeEnchantedForest(int i) { - super(i); - colorRNG = new Random(); - - - getTFBiomeDecorator().setGrassPerChunk(12); - getTFBiomeDecorator().setFlowersPerChunk(8); - } - - /** - * Provides the basic grass color based on the biome temperature and rainfall - */ - @Override - public int getBiomeGrassColor(int x, int y, int z) - { - return (super.getBiomeGrassColor(x, y, z) & 0xFFFF00) + getEnchantedColor(x, z); - } - - /** - * Provides the basic foliage color based on the biome temperature and rainfall - */ - @Override - public int getBiomeFoliageColor(int x, int y, int z) - { - return (super.getBiomeFoliageColor(x, y, z) & 0xFFFF00) + getEnchantedColor(x, z); - - //return (ColorizerGrass.getGrassColor(colorRNG.nextFloat(), colorRNG.nextFloat()) & 0xFFFF00) + colorRNG.nextInt(256); - } - - /** - * Find a number between 0 and 255. currently returns concentric circles from the biome center - */ - private int getEnchantedColor(int x, int z) { - // center of the biome is at % 256 - 8 - int cx = 256 * Math.round((x - 8) / 256F) + 8; - int cz = 256 * Math.round((z - 8) / 256F) + 8; - - int dist = (int) MathHelper.sqrt_float((cx - x) * (cx - x) + (cz - z) * (cz - z)); - int color = dist * 64; - color %= 512; - - if (color > 255) { - color = 511 - color; - } - - color = 255 - color; - - int randomFlicker = colorRNG.nextInt(32) - 16; - - if (0 < color + randomFlicker && color + randomFlicker > 255) { - color += randomFlicker; - } - - return color; - } - - /** - * Occasional shrub, no big trees - */ - public WorldGenAbstractTree func_150567_a(Random random) - { - if (random.nextInt(15) == 0) - { - return new TFGenSmallRainboak(); - } - else if (random.nextInt(50) == 0) - { - return new TFGenLargeRainboak(); - } - else if (random.nextInt(5) == 0) - { - return birchGen; - } - else if (random.nextInt(10) == 0) - { - return new WorldGenBigTree(false); - } - else - { - return worldGeneratorTrees; - } - } - - /** - * EVEN MOAR FERNZ! - */ - public WorldGenerator getRandomWorldGenForGrass(Random par1Random) - { - if (par1Random.nextInt(3) > 0) { - return new WorldGenTallGrass(Blocks.tallgrass, 2); - } - else if (par1Random.nextInt(3) == 0) { - return new WorldGenTallGrass(TFBlocks.plant, BlockTFPlant.META_FIDDLEHEAD); - } - else { - return new WorldGenTallGrass(Blocks.tallgrass, 1); - } - } - - /** - * Decorate this biome with extra decorations! - */ - @Override - public void decorate(World par1World, Random par2Random, int par3, int par4) - { - WorldGenVines worldgenvines = new WorldGenVines(); - - for (int i = 0; i < 20; i++) - { - int j = par3 + par2Random.nextInt(16) + 8; - byte byte0 = (byte) TFWorld.SEALEVEL; - int k = par4 + par2Random.nextInt(16) + 8; - worldgenvines.generate(par1World, par2Random, j, byte0, k); - } - - // tall ferns - genTallFlowers.func_150548_a(3); - - for (int i = 0; i < 20; ++i) { - int rx = par3 + par2Random.nextInt(16) + 8; - int rz = par4 + par2Random.nextInt(16) + 8; - int ry = par2Random.nextInt(par1World.getHeightValue(rx, rz) + 32); - genTallFlowers.generate(par1World, par2Random, rx, ry, rz); - } - - super.decorate(par1World, par2Random, par3, par4); - } - - /** - * Customize flower colors - */ - public String func_150572_a(Random p_150572_1_, int p_150572_2_, int p_150572_3_, int p_150572_4_) - { - return p_150572_1_.nextInt(3) > 0 ? BlockFlower.field_149859_a[1] : p_150572_1_.nextBoolean() ? BlockFlower.field_149859_a[2] : BlockFlower.field_149859_a[3]; - } -} diff --git a/src/main/java/twilightforest/biomes/TFBiomeFinalPlateau.java b/src/main/java/twilightforest/biomes/TFBiomeFinalPlateau.java deleted file mode 100644 index 6f0ae3b30f..0000000000 --- a/src/main/java/twilightforest/biomes/TFBiomeFinalPlateau.java +++ /dev/null @@ -1,58 +0,0 @@ -package twilightforest.biomes; - -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.stats.Achievement; -import net.minecraft.world.biome.BiomeGenBase.SpawnListEntry; -import net.minecraft.world.gen.feature.WorldGenAbstractTree; -import net.minecraft.world.gen.feature.WorldGenBigTree; -import net.minecraft.world.gen.feature.WorldGenTaiga2; -import twilightforest.TFAchievementPage; -import twilightforest.block.TFBlocks; - - -public class TFBiomeFinalPlateau extends TFBiomeBase { - - public TFBiomeFinalPlateau(int i) { - super(i); - - this.topBlock = TFBlocks.deadrock; - this.field_150604_aj = 0; - this.fillerBlock = TFBlocks.deadrock; - this.field_76754_C = 1; - -// this.rootHeight = 7F; -// this.heightVariation = 0.4F; - - this.temperature = 0.3F; - this.rainfall = 0.2F; - - getTFBiomeDecorator().canopyPerChunk = -999; - getTFBiomeDecorator().setTreesPerChunk(-999); - - this.theBiomeDecorator.generateLakes = false; - - // custom creature list. - spawnableCreatureList.clear(); - spawnableCreatureList.add(new SpawnListEntry(twilightforest.entity.passive.EntityTFRaven.class, 10, 4, 4)); - } - - /** - * Return a block if you want it to replace stone in the terrain generation - */ - public Block getStoneReplacementBlock() { - return TFBlocks.deadrock; - } - - /** - * Metadata for the stone replacement block - */ - public byte getStoneReplacementMeta() { - return 2; - } - - protected Achievement getRequiredAchievement() { - return TFAchievementPage.twilightProgressGlacier; - } -} diff --git a/src/main/java/twilightforest/biomes/TFBiomeFireSwamp.java b/src/main/java/twilightforest/biomes/TFBiomeFireSwamp.java deleted file mode 100644 index 2201d4dc74..0000000000 --- a/src/main/java/twilightforest/biomes/TFBiomeFireSwamp.java +++ /dev/null @@ -1,136 +0,0 @@ -package twilightforest.biomes; - -import java.util.Random; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.stats.Achievement; -import net.minecraft.world.World; -import net.minecraft.world.gen.feature.WorldGenAbstractTree; -import net.minecraft.world.gen.feature.WorldGenShrub; -import net.minecraft.world.gen.feature.WorldGenVines; -import twilightforest.TFAchievementPage; -import twilightforest.TFFeature; -import twilightforest.block.BlockTFFireJet; -import twilightforest.block.TFBlocks; -import twilightforest.world.TFGenFireJet; -import twilightforest.world.TFWorld; - -public class TFBiomeFireSwamp extends TFBiomeBase { - - protected TFBiomeFireSwamp(int i) { - super(i); - -// this.rootHeight = -0.25F; -// this.heightVariation = 0.0F; - - this.temperature = 1.0F; - this.rainfall = 0.4F; - - getTFBiomeDecorator().setDeadBushPerChunk(2); - getTFBiomeDecorator().setMushroomsPerChunk(8); - getTFBiomeDecorator().setReedsPerChunk(4); - getTFBiomeDecorator().setClayPerChunk(1); - getTFBiomeDecorator().setTreesPerChunk(3); - getTFBiomeDecorator().setWaterlilyPerChunk(6); - waterColorMultiplier = 0x6C2C2C; - - - getTFBiomeDecorator().canopyPerChunk = -999; - getTFBiomeDecorator().lavaPoolChance = 0.125F; - getTFBiomeDecorator().mangrovesPerChunk = 3; - } - - - /** - * Gets a WorldGen appropriate for this biome. - */ - public WorldGenAbstractTree func_150567_a(Random random) - { - if (random.nextInt(3) == 0) - { - return new WorldGenShrub(3, 0); - } - - return worldGeneratorSwamp; - } - - /** - * Decorate this biome. This is stolen from the jungle code - */ - @Override - public void decorate(World par1World, Random par2Random, int mapX, int mapZ) - { - super.decorate(par1World, par2Random, mapX, mapZ); - - TFFeature nearFeature = TFFeature.getNearestFeature(mapX >> 4, mapZ >> 4, par1World); - if (nearFeature.areChunkDecorationsEnabled) { - WorldGenVines worldgenvines = new WorldGenVines(); - - for (int i = 0; i < 50; i++) - { - int j = mapX + par2Random.nextInt(16) + 8; - byte byte0 = (byte) TFWorld.SEALEVEL; - int k = mapZ + par2Random.nextInt(16) + 8; - worldgenvines.generate(par1World, par2Random, j, byte0, k); - } - - TFGenFireJet genSmoker = new TFGenFireJet(TFBlocks.fireJet, BlockTFFireJet.META_SMOKER); - - if (par2Random.nextInt(4) == 0) - { - int j = mapX + par2Random.nextInt(16) + 8; - byte byte0 = (byte) TFWorld.SEALEVEL; - int k = mapZ + par2Random.nextInt(16) + 8; - genSmoker.generate(par1World, par2Random, j, byte0, k); - } - - TFGenFireJet genFireJet = new TFGenFireJet(TFBlocks.fireJet, BlockTFFireJet.META_JET_IDLE); - - for (int i = 0; i < 1; i++) - { - int j = mapX + par2Random.nextInt(16) + 8; - byte byte0 = (byte) TFWorld.SEALEVEL; - int k = mapZ + par2Random.nextInt(16) + 8; - genFireJet.generate(par1World, par2Random, j, byte0, k); - } - } - } - - /** - * Provides the basic grass color based on the biome temperature and rainfall - */ - @Override - public int getBiomeGrassColor(int x, int y, int z) - { - return 0x572e23;//0x8c4c35;//0x3f3555;// 0x8C0C0C;//0xd79e2f;// - } - - /** - * Provides the basic foliage color based on the biome temperature and rainfall - */ - @Override - public int getBiomeFoliageColor(int x, int y, int z) - { - return 0x64260f;//0x6C2020;//0x8f2839;//0x6c464d;// - } - - /** - * If there is a required achievement to be here, return it, otherwise return null - */ - protected Achievement getRequiredAchievement() { - return TFAchievementPage.twilightProgressLabyrinth; - } - - /** - * Do something bad to a player in the wrong biome. - */ - public void enforceProgession(EntityPlayer player, World world) { - if (!world.isRemote && world.getWorldTime() % 60 == 0) { - player.setFire(8); - } - // hint monster? - if (world.rand.nextInt(4) == 0) { - TFFeature.hydraLair.trySpawnHintMonster(world, player); - } - } -} diff --git a/src/main/java/twilightforest/biomes/TFBiomeFireflyForest.java b/src/main/java/twilightforest/biomes/TFBiomeFireflyForest.java deleted file mode 100644 index 5cbc48c32b..0000000000 --- a/src/main/java/twilightforest/biomes/TFBiomeFireflyForest.java +++ /dev/null @@ -1,163 +0,0 @@ -package twilightforest.biomes; - -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockFlower; -import net.minecraft.init.Blocks; -import net.minecraft.util.MathHelper; -import net.minecraft.world.World; -import net.minecraft.world.chunk.Chunk; -import net.minecraft.world.gen.feature.WorldGenPumpkin; -import net.minecraft.world.gen.feature.WorldGenTallGrass; -import twilightforest.block.BlockTFPlant; -import twilightforest.block.TFBlocks; -import twilightforest.world.TFGenHangingLamps; -import twilightforest.world.TFGenLampposts; -import twilightforest.world.TFWorld; - -public class TFBiomeFireflyForest extends TFBiomeTwilightForest { - - private static final int LAMPPOST_CHANCE = 4; - TFGenHangingLamps tfGenHangingLamps; - TFGenLampposts tfGenLampposts; - WorldGenTallGrass worldGenMushgloom; - - public TFBiomeFireflyForest(int i) { - super(i); - - this.worldGenMushgloom = new WorldGenTallGrass(TFBlocks.plant, BlockTFPlant.META_MUSHGLOOM); - this.tfGenHangingLamps = new TFGenHangingLamps(); - this.tfGenLampposts = new TFGenLampposts(); - - this.temperature = 0.5F; - this.rainfall = 1.0F; - - this.theBiomeDecorator.flowersPerChunk = 4; - this.theBiomeDecorator.grassPerChunk = 1; - - this.getTFBiomeDecorator().setTreesPerChunk(2); - - } - - - /** - * Decorate this biome. This is stolen from the flower forest code - */ - @Override - public void decorate(World world, Random rand, int mapX, int mapZ) - { - int flowerCycles = rand.nextInt(3) - 1; - - int successfulFlowers = 0; - - while (successfulFlowers < flowerCycles) - { - int flowerType = rand.nextInt(3); - - if (flowerType == 0) - { - genTallFlowers.func_150548_a(1); - } - else if (flowerType == 1) - { - genTallFlowers.func_150548_a(4); - } - else if (flowerType == 2) - { - genTallFlowers.func_150548_a(5); - } - - int tallFlowerTries = 0; - - while (true) - { - if (tallFlowerTries < 1) - { - int k1 = mapX + rand.nextInt(16) + 8; - int i2 = mapZ + rand.nextInt(16) + 8; - int l1 = rand.nextInt(world.getHeightValue(k1, i2) + 32); - - if (!genTallFlowers.generate(world, rand, k1, l1, i2)) - { - ++tallFlowerTries; - continue; - } - } - - ++successfulFlowers; - break; - } - } - - super.decorate(world, rand, mapX, mapZ); - - if (rand.nextInt(24) == 0) { - int rx = mapX + rand.nextInt(16) + 8; - int rz = mapZ + rand.nextInt(16) + 8; - int ry = getGroundLevel(world, rx, rz); - // mushglooms - this.worldGenMushgloom.generate(world, rand, rx, ry, rz); - } - - // hanging lamps - for (int i = 0; i < 30; i++) { - int rx = mapX + rand.nextInt(16) + 8; - int rz = mapZ + rand.nextInt(16) + 8; - int ry = TFWorld.SEALEVEL + rand.nextInt(TFWorld.CHUNKHEIGHT - TFWorld.SEALEVEL); - - this.tfGenHangingLamps.generate(world, rand, rx, ry, rz); - } - - if (rand.nextInt(LAMPPOST_CHANCE) == 0) { - int rx = mapX + rand.nextInt(16) + 8; - int rz = mapZ + rand.nextInt(16) + 8; - int ry = getGroundLevel(world, rx, rz); - - this.tfGenLampposts.generate(world, rand, rx, ry, rz); - } - - // extra pumpkins (should they be lit?) - if (rand.nextInt(32) == 0) { - int rx = mapX + rand.nextInt(16) + 8; - int rz = mapZ + rand.nextInt(16) + 8; - int ry = getGroundLevel(world, rx, rz); - (new WorldGenPumpkin()).generate(world, rand, rx, ry, rz); - } - - } - - public int getGroundLevel(World world, int x, int z) { - // go from sea level up. If we get grass, return that, otherwise return the last dirt, stone or gravel we got - Chunk chunk = world.getChunkFromBlockCoords(x, z); - int lastDirt = TFWorld.SEALEVEL; - for (int y = TFWorld.SEALEVEL; y < TFWorld.CHUNKHEIGHT - 1; y++) { - Block blockID = chunk.getBlock(x & 15, y, z & 15); - // grass = return immediately - if (blockID == Blocks.grass) { - return y + 1; - } - else if (blockID == Blocks.dirt || blockID == Blocks.stone || blockID == Blocks.gravel) { - lastDirt = y + 1; - } - } - - return lastDirt; - } - - /** - * Every color flower! - */ - public String func_150572_a(Random p_150572_1_, int p_150572_2_, int p_150572_3_, int p_150572_4_) - { - double flowerVar = MathHelper.clamp_double((1.0D + plantNoise.func_151601_a((double)p_150572_2_ / 48.0D, (double)p_150572_4_ / 48.0D)) / 2.0D, 0.0D, 0.9999D); - int flowerIndex = (int)(flowerVar * (double)BlockFlower.field_149859_a.length); - - if (flowerIndex == 1) - { - flowerIndex = 0; - } - - return BlockFlower.field_149859_a[flowerIndex]; - } -} diff --git a/src/main/java/twilightforest/biomes/TFBiomeGlacier.java b/src/main/java/twilightforest/biomes/TFBiomeGlacier.java deleted file mode 100644 index 1edd50252e..0000000000 --- a/src/main/java/twilightforest/biomes/TFBiomeGlacier.java +++ /dev/null @@ -1,114 +0,0 @@ -/** - * - */ -package twilightforest.biomes; - -import java.util.Random; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.potion.Potion; -import net.minecraft.potion.PotionEffect; -import net.minecraft.stats.Achievement; -import net.minecraft.world.World; -import net.minecraft.world.gen.feature.WorldGenAbstractTree; -import net.minecraft.world.gen.feature.WorldGenTaiga1; -import net.minecraft.world.gen.feature.WorldGenTaiga2; -import twilightforest.TFAchievementPage; -import twilightforest.TFFeature; -import twilightforest.world.TFGenPenguins; -import twilightforest.world.TFWorld; - - - -/** - * @author Ben - * - */ -public class TFBiomeGlacier extends TFBiomeBase { - - /** - * @param i - */ - @SuppressWarnings("unchecked") - public TFBiomeGlacier(int i) { - super(i); - - getTFBiomeDecorator().setTreesPerChunk(1); - getTFBiomeDecorator().setGrassPerChunk(0); - - this.temperature = 0.0F; - this.rainfall = 0.1F; - getTFBiomeDecorator().canopyPerChunk = -999; - - spawnableCreatureList.add(new SpawnListEntry(twilightforest.entity.passive.EntityTFPenguin.class, 10, 4, 4)); - - } - - - public WorldGenAbstractTree func_150567_a(Random random) - { - if(random.nextInt(3) == 0) - { - return new WorldGenTaiga1(); - } else - { - return new WorldGenTaiga2(true); - } - } - - /** - * Let it snow! - */ - @Override - public boolean getEnableSnow() - { - return true; - } - - /** - * Required for actual snow? - */ - @Override - public boolean canSpawnLightningBolt() - { - return false; - } - - /** - * Decorate this biome. Weeeee should generate penguins - */ - @Override - public void decorate(World par1World, Random par2Random, int par3, int par4) - { - super.decorate(par1World, par2Random, par3, par4); - TFGenPenguins penguins = new TFGenPenguins(); - - if (par2Random.nextInt(4) == 0) - { - int j = par3 + par2Random.nextInt(16) + 8; - byte byte0 = (byte) TFWorld.SEALEVEL; - int k = par4 + par2Random.nextInt(16) + 8; - penguins.generate(par1World, par2Random, j, byte0, k); - } - } - - /** - * If there is a required achievement to be here, return it, otherwise return null - */ - protected Achievement getRequiredAchievement() { - return TFAchievementPage.twilightProgressUrghast; - } - - /** - * Do something bad to a player in the wrong biome. - */ - public void enforceProgession(EntityPlayer player, World world) { - if (!world.isRemote && world.getWorldTime() % 60 == 0) { - player.addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 100, 3)); - } - // hint monster? - if (world.rand.nextInt(4) == 0) { - TFFeature.iceTower.trySpawnHintMonster(world, player); - } - } -} diff --git a/src/main/java/twilightforest/biomes/TFBiomeHighlands.java b/src/main/java/twilightforest/biomes/TFBiomeHighlands.java deleted file mode 100644 index 0d39620cd2..0000000000 --- a/src/main/java/twilightforest/biomes/TFBiomeHighlands.java +++ /dev/null @@ -1,199 +0,0 @@ -package twilightforest.biomes; - -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockFlower; -import net.minecraft.entity.monster.EntityCreeper; -import net.minecraft.entity.monster.EntitySkeleton; -import net.minecraft.entity.monster.EntitySlime; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.potion.Potion; -import net.minecraft.potion.PotionEffect; -import net.minecraft.stats.Achievement; -import net.minecraft.util.DamageSource; -import net.minecraft.world.World; -import net.minecraft.world.gen.feature.WorldGenAbstractTree; -import net.minecraft.world.gen.feature.WorldGenBlockBlob; -import net.minecraft.world.gen.feature.WorldGenMegaPineTree; -import net.minecraft.world.gen.feature.WorldGenTaiga1; -import net.minecraft.world.gen.feature.WorldGenTaiga2; -import net.minecraft.world.gen.feature.WorldGenTallGrass; -import net.minecraft.world.gen.feature.WorldGenerator; -import twilightforest.TFAchievementPage; -import twilightforest.TFFeature; -import twilightforest.block.BlockTFPlant; -import twilightforest.block.TFBlocks; -import twilightforest.entity.EntityTFTroll; -import twilightforest.world.TFGenTrollRoots; - - -public class TFBiomeHighlands extends TFBiomeBase { - - - private static final WorldGenTaiga1 taigaGen1 = new WorldGenTaiga1(); - private static final WorldGenTaiga2 taigaGen2 = new WorldGenTaiga2(false); - private static final WorldGenMegaPineTree megaPineGen1 = new WorldGenMegaPineTree(false, false); - private static final WorldGenMegaPineTree megaPineGen2 = new WorldGenMegaPineTree(false, true); - private static final WorldGenBlockBlob genBoulder = new WorldGenBlockBlob(Blocks.mossy_cobblestone, 0); - private static final TFGenTrollRoots genTrollRoots = new TFGenTrollRoots(); - private static final WorldGenTallGrass worldGenMushgloom = new WorldGenTallGrass(TFBlocks.plant, BlockTFPlant.META_MUSHGLOOM); - - - public TFBiomeHighlands(int i) { - super(i); - - this.temperature = 0.4F; - this.rainfall = 0.7F; - - ((TFBiomeDecorator)theBiomeDecorator).canopyPerChunk = -999; - - this.theBiomeDecorator.grassPerChunk = 7; - this.theBiomeDecorator.deadBushPerChunk = 1; - this.theBiomeDecorator.generateLakes = false; // actually underground water sources - - - //this.spawnableMonsterList.add(new SpawnListEntry(EntityTFTroll.class, 10, 4, 4)); - - - undergroundMonsterList.clear(); - undergroundMonsterList.add(new SpawnListEntry(EntitySkeleton.class, 10, 4, 4)); - undergroundMonsterList.add(new SpawnListEntry(EntityCreeper.class, 1, 4, 4)); - undergroundMonsterList.add(new SpawnListEntry(EntitySlime.class, 10, 4, 4)); - - undergroundMonsterList.add(new SpawnListEntry(EntityTFTroll.class, 10, 4, 4)); - } - - /** - * Birches and large trees only - */ - public WorldGenAbstractTree func_150567_a(Random random) - { - if(random.nextInt(4) == 0){ - return taigaGen1; - } else if(random.nextInt(10) == 0){ - return taigaGen2; - } else if(random.nextInt(3) == 0){ - return megaPineGen1; - } else if(random.nextInt(13) == 0){ - return megaPineGen2; - } else { - return birchGen; - } - } - - /** - * Gets a WorldGen appropriate for this biome. - */ - public WorldGenerator getRandomWorldGenForGrass(Random par1Random) - { - return par1Random.nextInt(5) > 0 ? new WorldGenTallGrass(Blocks.tallgrass, 2) : new WorldGenTallGrass(Blocks.tallgrass, 1); - } - - public void genTerrainBlocks(World world, Random rand, Block[] blockStorage, byte[] metaStorage, int x, int z, double noiseVal) - { - if (true) - { - this.topBlock = Blocks.grass; - this.field_150604_aj = 0; - this.fillerBlock = Blocks.dirt; - - if (noiseVal > 1.75D) - { - this.topBlock = Blocks.dirt; - this.field_150604_aj = 1; - } - else if (noiseVal > -0.95D) - { - this.topBlock = Blocks.dirt; - this.field_150604_aj = 2; - } - } - - this.genTwilightBiomeTerrain(world, rand, blockStorage, metaStorage, x, z, noiseVal); - } - - /** - * Add extra decorations - */ - public void decorate(World par1World, Random par2Random, int mapX, int mapZ) - { - int dx, dy, dz; - - // boulders - int maxBoulders = par2Random.nextInt(2); - for (int i = 0; i < maxBoulders; ++i) - { - dx = mapX + par2Random.nextInt(16) + 8; - dz = mapZ + par2Random.nextInt(16) + 8; - dy = par1World.getHeightValue(dx, dz); - genBoulder.generate(par1World, par2Random, dx, dy, dz); - } - - // giant ferns - genTallFlowers.func_150548_a(3); - for (int i = 0; i < 7; ++i) - { - dx = mapX + par2Random.nextInt(16) + 8; - dz = mapZ + par2Random.nextInt(16) + 8; - dy = par2Random.nextInt(par1World.getHeightValue(dx, dz) + 32); - genTallFlowers.generate(par1World, par2Random, dx, dy, dz); - } - - // mushglooms - for (int i = 0; i < 1; ++i) - { - int rx = mapX + par2Random.nextInt(16) + 8; - int rz = mapZ + par2Random.nextInt(16) + 8; - int ry = par2Random.nextInt(64); - // mushglooms - worldGenMushgloom.generate(par1World, par2Random, rx, ry, rz); - } - - // generate roots - for (int i = 0; i < 24; ++i) - { - int rx = mapX + par2Random.nextInt(16) + 8; - byte ry = 64; - int rz = mapZ + par2Random.nextInt(16) + 8; - genTrollRoots.generate(par1World, par2Random, rx, ry, rz); - } - - super.decorate(par1World, par2Random, mapX, mapZ); - } - - /** - * Flowers - */ - public String func_150572_a(Random rand, int x, int y, int z) - { - return rand.nextBoolean() ? BlockFlower.field_149858_b[0] : BlockFlower.field_149859_a[8]; - } - - - - /** - * If there is a required achievement to be here, return it, otherwise return null - */ - protected Achievement getRequiredAchievement() { - return TFAchievementPage.twilightProgressGlacier; - } - - /** - * Do something bad to a player in the wrong biome. - */ - public void enforceProgession(EntityPlayer player, World world) { - if (!world.isRemote && world.getWorldTime() % 5 == 0) { - player.attackEntityFrom(DamageSource.magic, 0.5F); - world.playSoundAtEntity(player, "random.fizz", 1.0F, 1.0F); - //player.playSound("random.fizz", 1.0F, 1.0F); - - // hint monster? - if (world.rand.nextInt(4) == 0) { - TFFeature.trollCave.trySpawnHintMonster(world, player); - } - } - } - -} diff --git a/src/main/java/twilightforest/biomes/TFBiomeMushrooms.java b/src/main/java/twilightforest/biomes/TFBiomeMushrooms.java deleted file mode 100644 index 49e944c7ce..0000000000 --- a/src/main/java/twilightforest/biomes/TFBiomeMushrooms.java +++ /dev/null @@ -1,21 +0,0 @@ -package twilightforest.biomes; - - -public class TFBiomeMushrooms extends TFBiomeBase { - - public TFBiomeMushrooms(int i) { - super(i); - - this.rainfall = 0.8F; - this.temperature = 0.8F; - - getTFBiomeDecorator().setTreesPerChunk(8); - - getTFBiomeDecorator().setMushroomsPerChunk(8); - getTFBiomeDecorator().setBigMushroomsPerChunk(2); - - getTFBiomeDecorator().alternateCanopyChance = 0.2F; - - } - -} diff --git a/src/main/java/twilightforest/biomes/TFBiomeOakSavanna.java b/src/main/java/twilightforest/biomes/TFBiomeOakSavanna.java deleted file mode 100644 index f506bef84e..0000000000 --- a/src/main/java/twilightforest/biomes/TFBiomeOakSavanna.java +++ /dev/null @@ -1,109 +0,0 @@ -package twilightforest.biomes; - -import java.util.Random; - -import net.minecraft.block.BlockFlower; -import net.minecraft.init.Blocks; -import net.minecraft.world.World; -import net.minecraft.world.gen.feature.WorldGenAbstractTree; -import net.minecraft.world.gen.feature.WorldGenBigTree; -import net.minecraft.world.gen.feature.WorldGenTallGrass; -import net.minecraft.world.gen.feature.WorldGenerator; -import twilightforest.block.BlockTFPlant; -import twilightforest.block.TFBlocks; -import twilightforest.world.TFGenCanopyOak; -import twilightforest.world.TFGenNoTree; - -public class TFBiomeOakSavanna extends TFBiomeTwilightForest { - - public TFBiomeOakSavanna(int i) { - super(i); - - getTFBiomeDecorator().canopyTreeGen = new TFGenCanopyOak(); - - getTFBiomeDecorator().alternateCanopyChance = 0.8F; - getTFBiomeDecorator().alternateCanopyGen = new TFGenNoTree(); - - this.temperature = 0.9F; - this.rainfall = 0.0F; - - - this.theBiomeDecorator.treesPerChunk = 1; - this.theBiomeDecorator.flowersPerChunk = 4; - this.theBiomeDecorator.grassPerChunk = 20; - } - - - /** - * Oak trees all over - */ - public WorldGenAbstractTree func_150567_a(Random random) - { - if(random.nextInt(10) == 0) - { - return new WorldGenBigTree(false); - } else - { - return worldGeneratorTrees; - } - } - - /** - * Oak savanna fern mix - */ - public WorldGenerator getRandomWorldGenForGrass(Random par1Random) - { - if (par1Random.nextInt(10) == 0) - { - return new WorldGenTallGrass(Blocks.tallgrass, 2); - } - else if (par1Random.nextInt(10) == 0) - { - return new WorldGenTallGrass(TFBlocks.plant, BlockTFPlant.META_MAYAPPLE); - } - else - { - return new WorldGenTallGrass(Blocks.tallgrass, 1); - } - } - - /** - * Multi-color flowers! - */ - public String func_150572_a(Random p_150572_1_, int p_150572_2_, int p_150572_3_, int p_150572_4_) - { - double d0 = plantNoise.func_151601_a((double)p_150572_2_ / 200.0D, (double)p_150572_4_ / 200.0D); - int l; - - if (d0 < -0.8D) - { - l = p_150572_1_.nextInt(4); - return BlockFlower.field_149859_a[4 + l]; - } - else if (p_150572_1_.nextInt(3) > 0) - { - l = p_150572_1_.nextInt(3); - return l == 0 ? BlockFlower.field_149859_a[0] : (l == 1 ? BlockFlower.field_149859_a[3] : BlockFlower.field_149859_a[8]); - } - else - { - return BlockFlower.field_149858_b[0]; - } - } - - public void decorate(World par1World, Random par2Random, int par3, int par4) - { - // 2-tall grass! - genTallFlowers.func_150548_a(2); - - for (int k = 0; k < 7; ++k) - { - int l = par3 + par2Random.nextInt(16) + 8; - int i1 = par4 + par2Random.nextInt(16) + 8; - int j1 = par2Random.nextInt(par1World.getHeightValue(l, i1) + 32); - genTallFlowers.generate(par1World, par2Random, l, j1, i1); - } - - super.decorate(par1World, par2Random, par3, par4); - } -} diff --git a/src/main/java/twilightforest/biomes/TFBiomeSnow.java b/src/main/java/twilightforest/biomes/TFBiomeSnow.java deleted file mode 100644 index e5f0d26ac2..0000000000 --- a/src/main/java/twilightforest/biomes/TFBiomeSnow.java +++ /dev/null @@ -1,127 +0,0 @@ -/** - * - */ -package twilightforest.biomes; - -import java.util.ArrayList; -import java.util.List; -import java.util.Random; - -import net.minecraft.entity.EnumCreatureType; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.potion.Potion; -import net.minecraft.potion.PotionEffect; -import net.minecraft.stats.Achievement; -import net.minecraft.world.World; -import net.minecraft.world.gen.feature.WorldGenAbstractTree; -import net.minecraft.world.gen.feature.WorldGenTaiga1; -import net.minecraft.world.gen.feature.WorldGenTaiga2; -import twilightforest.TFAchievementPage; -import twilightforest.TFFeature; -import twilightforest.entity.EntityTFWinterWolf; -import twilightforest.entity.EntityTFYeti; -import twilightforest.world.TFGenLargeWinter; - - -/** - * @author Ben - * - */ -public class TFBiomeSnow extends TFBiomeBase { - - - private static final int MONSTER_SPAWN_RATE = 10; - Random monsterRNG = new Random(53439L); - ArrayList emptyList = new ArrayList(); - - /** - * @param i - */ - @SuppressWarnings("unchecked") - public TFBiomeSnow(int i) { - super(i); - - getTFBiomeDecorator().setTreesPerChunk(7); - getTFBiomeDecorator().setGrassPerChunk(1); - - this.temperature = 0.125F; - this.rainfall = 0.9F; - - getTFBiomeDecorator().canopyPerChunk = -999; - getTFBiomeDecorator().generateLakes = false; - - this.spawnableMonsterList.add(new SpawnListEntry(EntityTFYeti.class, 20, 4, 4)); - this.spawnableMonsterList.add(new SpawnListEntry(EntityTFWinterWolf.class, 5, 1, 4)); - - } - - public WorldGenAbstractTree func_150567_a(Random random) - { - if (random.nextInt(3) == 0) { - return new WorldGenTaiga1(); - } - else if (random.nextInt(8) == 0) { - return new TFGenLargeWinter(); - } - else { - return new WorldGenTaiga2(true); - } - } - - /** - * Let it snow! - */ - @Override - public boolean getEnableSnow() - { - return true; - } - - /** - * Required for actual snow? - */ - @Override - public boolean canSpawnLightningBolt() - { - return false; - } - - /** - * Returns the correspondent list of the EnumCreatureType informed. - */ - @SuppressWarnings("rawtypes") - @Override - public List getSpawnableList(EnumCreatureType par1EnumCreatureType) - { - // if is is monster, then only give it the real list 1/MONSTER_SPAWN_RATE of the time - if (par1EnumCreatureType == EnumCreatureType.monster) { - return monsterRNG.nextInt(MONSTER_SPAWN_RATE) == 0 ? this.spawnableMonsterList : emptyList; - } - else { - return par1EnumCreatureType == EnumCreatureType.creature ? this.spawnableCreatureList : (par1EnumCreatureType == EnumCreatureType.waterCreature ? this.spawnableWaterCreatureList : (par1EnumCreatureType == EnumCreatureType.ambient ? this.spawnableCaveCreatureList : null)); - } - } - - /** - * If there is a required achievement to be here, return it, otherwise return null - */ - protected Achievement getRequiredAchievement() { - return TFAchievementPage.twilightProgressUrghast; - } - - /** - * Do something bad to a player in the wrong biome. - */ - public void enforceProgession(EntityPlayer player, World world) { - if (!world.isRemote && world.getWorldTime() % 60 == 0) { - player.addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 100, 2)); - - // hint monster? - if (world.rand.nextInt(4) == 0) { - TFFeature.yetiCave.trySpawnHintMonster(world, player); - } - } - } - - -} diff --git a/src/main/java/twilightforest/biomes/TFBiomeStream.java b/src/main/java/twilightforest/biomes/TFBiomeStream.java deleted file mode 100644 index 1f991f541d..0000000000 --- a/src/main/java/twilightforest/biomes/TFBiomeStream.java +++ /dev/null @@ -1,20 +0,0 @@ -package twilightforest.biomes; - -public class TFBiomeStream extends TFBiomeBase { - - public TFBiomeStream(int i) { - super(i); - -// this.rootHeight = -0.75F; -// this.heightVariation = -0.10F; - - this.temperature = 0.5F; - this.rainfall = 1F; - - getTFBiomeDecorator().setWaterlilyPerChunk(2); - - spawnableCreatureList.clear(); - - } - -} diff --git a/src/main/java/twilightforest/biomes/TFBiomeSwamp.java b/src/main/java/twilightforest/biomes/TFBiomeSwamp.java deleted file mode 100644 index 0e73433b67..0000000000 --- a/src/main/java/twilightforest/biomes/TFBiomeSwamp.java +++ /dev/null @@ -1,200 +0,0 @@ -package twilightforest.biomes; - -import java.util.ArrayList; -import java.util.List; -import java.util.Random; - -import net.minecraft.entity.EnumCreatureType; -import net.minecraft.entity.monster.EntityCreeper; -import net.minecraft.entity.monster.EntityZombie; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.potion.Potion; -import net.minecraft.potion.PotionEffect; -import net.minecraft.stats.Achievement; -import net.minecraft.util.MathHelper; -import net.minecraft.world.ColorizerFoliage; -import net.minecraft.world.ColorizerGrass; -import net.minecraft.world.World; -import net.minecraft.world.gen.feature.WorldGenAbstractTree; -import net.minecraft.world.gen.feature.WorldGenShrub; -import net.minecraft.world.gen.feature.WorldGenTallGrass; -import net.minecraft.world.gen.feature.WorldGenVines; -import net.minecraft.world.gen.feature.WorldGenerator; -import twilightforest.TFAchievementPage; -import twilightforest.TFFeature; -import twilightforest.block.BlockTFPlant; -import twilightforest.block.TFBlocks; -import twilightforest.entity.EntityTFMosquitoSwarm; -import twilightforest.world.TFGenHugeLilyPad; -import twilightforest.world.TFWorld; - - - -public class TFBiomeSwamp extends TFBiomeBase { - - private static final int MONSTER_SPAWN_RATE = 20; - Random monsterRNG = new Random(53439L); - ArrayList emptyList = new ArrayList(); - - WorldGenVines worldgenvines = new WorldGenVines(); - WorldGenerator hugeLilyPadGen = new TFGenHugeLilyPad(); - WorldGenerator hugeWaterLilyGen = new TFGenHugeWaterLily(); - - - - @SuppressWarnings("unchecked") - public TFBiomeSwamp(int i) { - super(i); - -// this.rootHeight = -0.25F; -// this.heightVariation = 0.0F; - - this.temperature = 0.8F; - this.rainfall = 0.9F; - - getTFBiomeDecorator().setDeadBushPerChunk(1); - getTFBiomeDecorator().setMushroomsPerChunk(8); - getTFBiomeDecorator().setReedsPerChunk(10); - getTFBiomeDecorator().setClayPerChunk(1); - getTFBiomeDecorator().setTreesPerChunk(2); - getTFBiomeDecorator().setWaterlilyPerChunk(20); - waterColorMultiplier = 0xE0FFAE; - - - getTFBiomeDecorator().canopyPerChunk = -999; - getTFBiomeDecorator().lakesPerChunk = 2; - getTFBiomeDecorator().mangrovesPerChunk = 3; - - this.spawnableMonsterList.add(new SpawnListEntry(EntityTFMosquitoSwarm.class, 10, 1, 1)); - this.spawnableMonsterList.add(new SpawnListEntry(EntityCreeper.class, 10, 4, 4)); - this.spawnableMonsterList.add(new SpawnListEntry(EntityZombie.class, 10, 4, 4)); - } - - public WorldGenAbstractTree func_150567_a(Random random) - { - if (random.nextInt(3) == 0) - { - return new WorldGenShrub(3, 0); - } - - return worldGeneratorSwamp; - } - - /** - * Ferns! - */ - public WorldGenerator getRandomWorldGenForGrass(Random par1Random) - { - if (par1Random.nextInt(4) == 0) - { - return new WorldGenTallGrass(Blocks.tallgrass, 2); - } - else if (par1Random.nextInt(4) == 0) - { - return new WorldGenTallGrass(TFBlocks.plant, BlockTFPlant.META_MAYAPPLE); - } - else - { - return new WorldGenTallGrass(Blocks.tallgrass, 1); - } - } - - /** - * Decorate this biome. This is stolen from the jungle code - */ - @Override - public void decorate(World par1World, Random par2Random, int par3, int par4) - { - super.decorate(par1World, par2Random, par3, par4); - - for (int i = 0; i < 50; i++) - { - int j = par3 + par2Random.nextInt(16) + 8; - byte byte0 = (byte) TFWorld.SEALEVEL; - int k = par4 + par2Random.nextInt(16) + 8; - worldgenvines.generate(par1World, par2Random, j, byte0, k); - } - for (int i = 0; i < 25; i++) - { - int x = par3 + par2Random.nextInt(16) + 8; - int y = TFWorld.SEALEVEL; - int z = par4 + par2Random.nextInt(16) + 8; - hugeLilyPadGen.generate(par1World, par2Random, x, y, z); - } - for (int i = 0; i < 2; i++) - { - int x = par3 + par2Random.nextInt(16) + 8; - int y = TFWorld.SEALEVEL; - int z = par4 + par2Random.nextInt(16) + 8; - hugeWaterLilyGen.generate(par1World, par2Random, x, y, z); - } - } - - /** - * Provides the basic grass color based on the biome temperature and rainfall - */ - @Override - public int getBiomeGrassColor(int x, int y, int z) - { - double var1 = (double)MathHelper.clamp_float(this.getFloatTemperature(x, y, z), 0.0F, 1.0F); - double var3 = (double)MathHelper.clamp_float(this.getFloatRainfall(), 0.0F, 1.0F); - return ((ColorizerGrass.getGrassColor(var1, var3) & 0xFEFEFE) + 0x4E0E4E) / 2; - } - - /** - * Provides the basic foliage color based on the biome temperature and rainfall - */ - @Override - public int getBiomeFoliageColor(int x, int y, int z) - { - double var1 = (double)MathHelper.clamp_float(this.getFloatTemperature(x, y, z), 0.0F, 1.0F); - double var3 = (double)MathHelper.clamp_float(this.getFloatRainfall(), 0.0F, 1.0F); - return ((ColorizerFoliage.getFoliageColor(var1, var3) & 0xFEFEFE) + 0x4E0E4E) / 2; - } - - - /** - * Returns the correspondent list of the EnumCreatureType informed. - */ - @SuppressWarnings("rawtypes") - @Override - public List getSpawnableList(EnumCreatureType par1EnumCreatureType) - { - // if is is monster, then only give it the real list 1/MONSTER_SPAWN_RATE of the time - if (par1EnumCreatureType == EnumCreatureType.monster) { - return monsterRNG.nextInt(MONSTER_SPAWN_RATE) == 0 ? this.spawnableMonsterList : emptyList; - } - else { - return par1EnumCreatureType == EnumCreatureType.creature ? this.spawnableCreatureList : (par1EnumCreatureType == EnumCreatureType.waterCreature ? this.spawnableWaterCreatureList : (par1EnumCreatureType == EnumCreatureType.ambient ? this.spawnableCaveCreatureList : null)); - } - } - - /** - * If there is a required achievement to be here, return it, otherwise return null - */ - protected Achievement getRequiredAchievement() { - return TFAchievementPage.twilightProgressLich; - } - - /** - * Do something bad to a player in the wrong biome. - */ - public void enforceProgession(EntityPlayer player, World world) { - if (!world.isRemote && world.getWorldTime() % 60 == 0) { - //System.out.println("Player " + player.getDisplayName() + " is in the swamp without the achievement"); - - PotionEffect currentHunger = player.getActivePotionEffect(Potion.hunger); - - int hungerLevel = currentHunger != null ? currentHunger.getAmplifier() + 1 : 1; - - player.addPotionEffect(new PotionEffect(Potion.hunger.id, 100, hungerLevel)); - //((EntityLivingBase)par1Entity).addPotionEffect(new PotionEffect(Potion.hunger.id, duration * 20, 0)); - - // hint monster? - if (world.rand.nextInt(4) == 0) { - TFFeature.labyrinth.trySpawnHintMonster(world, player); - } - } - } -} diff --git a/src/main/java/twilightforest/biomes/TFBiomeThornlands.java b/src/main/java/twilightforest/biomes/TFBiomeThornlands.java deleted file mode 100644 index a87ffb18a6..0000000000 --- a/src/main/java/twilightforest/biomes/TFBiomeThornlands.java +++ /dev/null @@ -1,93 +0,0 @@ -package twilightforest.biomes; - -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.init.Blocks; -import net.minecraft.stats.Achievement; -import net.minecraft.world.World; -import net.minecraft.world.chunk.Chunk; -import twilightforest.TFAchievementPage; -import twilightforest.block.TFBlocks; -import twilightforest.world.TFGenThorns; -import twilightforest.world.TFWorld; - -public class TFBiomeThornlands extends TFBiomeBase { - - private TFGenThorns tfGenThorns; - - - public TFBiomeThornlands(int i) { - super(i); - - this.topBlock = TFBlocks.deadrock; - this.field_150604_aj = 0; - this.fillerBlock = TFBlocks.deadrock; - this.field_76754_C = 1; - - this.temperature = 0.3F; - this.rainfall = 0.2F; - - getTFBiomeDecorator().canopyPerChunk = -999; - getTFBiomeDecorator().setTreesPerChunk(-999); - this.theBiomeDecorator.deadBushPerChunk = 2; - this.theBiomeDecorator.cactiPerChunk = -9999; - this.spawnableCreatureList.clear(); - - this.tfGenThorns = new TFGenThorns(); - - this.theBiomeDecorator.generateLakes = false; - } - - - public void decorate(World world, Random rand, int mapX, int mapZ) - { - super.decorate(world, rand, mapX, mapZ); - - // add thorns! - for (int i = 0; i < 128; i++) - { - int rx = mapX + rand.nextInt(16) + 8; - int rz = mapZ + rand.nextInt(16) + 8; - int ry = getGroundLevel(world, rx, rz); - - this.tfGenThorns.generate(world, rand, rx, ry, rz); - } - } - - public int getGroundLevel(World world, int x, int z) { - // go from sea level up. If we get grass, return that, otherwise return the last dirt, stone or gravel we got - Chunk chunk = world.getChunkFromBlockCoords(x, z); - int lastDirt = TFWorld.SEALEVEL; - for (int y = TFWorld.SEALEVEL; y < TFWorld.CHUNKHEIGHT - 1; y++) { - Block blockID = chunk.getBlock(x & 15, y, z & 15); - // grass = return immediately - if (blockID == Blocks.grass) { - return y + 1; - } - else if (blockID == Blocks.dirt || blockID == Blocks.stone || blockID == Blocks.gravel || blockID == Blocks.sandstone || blockID == Blocks.sand || blockID == Blocks.clay || blockID == TFBlocks.deadrock) { - lastDirt = y + 1; - } - } - - return lastDirt; - } - - /** - * Return a block if you want it to replace stone in the terrain generation - */ - public Block getStoneReplacementBlock() { - return TFBlocks.deadrock; - } - - /** - * Metadata for the stone replacement block - */ - public byte getStoneReplacementMeta() { - return 2; - } - - protected Achievement getRequiredAchievement() { - return TFAchievementPage.twilightProgressGlacier; - } -} diff --git a/src/main/java/twilightforest/biomes/TFBiomeTwilightForest.java b/src/main/java/twilightforest/biomes/TFBiomeTwilightForest.java deleted file mode 100644 index 43a96f8890..0000000000 --- a/src/main/java/twilightforest/biomes/TFBiomeTwilightForest.java +++ /dev/null @@ -1,12 +0,0 @@ -package twilightforest.biomes; - - -public class TFBiomeTwilightForest extends TFBiomeBase { - - public TFBiomeTwilightForest(int i) - { - super(i); - - } - -} diff --git a/src/main/java/twilightforest/biomes/TFBiomeTwilightForestVariant.java b/src/main/java/twilightforest/biomes/TFBiomeTwilightForestVariant.java deleted file mode 100644 index 1074fe07e1..0000000000 --- a/src/main/java/twilightforest/biomes/TFBiomeTwilightForestVariant.java +++ /dev/null @@ -1,90 +0,0 @@ -package twilightforest.biomes; - -import java.util.Random; - -import net.minecraft.init.Blocks; -import net.minecraft.world.World; -import net.minecraft.world.gen.feature.WorldGenAbstractTree; -import net.minecraft.world.gen.feature.WorldGenBigTree; -import net.minecraft.world.gen.feature.WorldGenShrub; -import net.minecraft.world.gen.feature.WorldGenTallGrass; -import net.minecraft.world.gen.feature.WorldGenerator; -import twilightforest.block.BlockTFPlant; -import twilightforest.block.TFBlocks; - - -public class TFBiomeTwilightForestVariant extends TFBiomeBase { - - public TFBiomeTwilightForestVariant(int i) { - super(i); - - this.temperature = 0.7F; - this.rainfall = 0.8F; - -// this.rootHeight = 0.15F; -// this.heightVariation = 0.4F; - - getTFBiomeDecorator().setTreesPerChunk(25); - getTFBiomeDecorator().setGrassPerChunk(15); - getTFBiomeDecorator().setFlowersPerChunk(8); - } - - - /** - * Occasional shrub, no birches - */ - public WorldGenAbstractTree func_150567_a(Random random) - { - if(random.nextInt(5) == 0) - { - return new WorldGenShrub(3, 0); - } - else if(random.nextInt(10) == 0) - { - return new WorldGenBigTree(false); - } - else - { - return worldGeneratorTrees; - } - } - - /** - * EVEN MOAR FERNZ! - */ - public WorldGenerator getRandomWorldGenForGrass(Random par1Random) - { - if (par1Random.nextInt(4) != 0) - { - return new WorldGenTallGrass(Blocks.tallgrass, 2); - } - else if (par1Random.nextBoolean()) - { - return new WorldGenTallGrass(TFBlocks.plant, BlockTFPlant.META_MAYAPPLE); - } - else - { - return new WorldGenTallGrass(Blocks.tallgrass, 1); - } - } - - /** - * Add tall ferns - */ - public void decorate(World par1World, Random par2Random, int par3, int par4) - { - genTallFlowers.func_150548_a(3); - - for (int i = 0; i < 7; ++i) - { - int rx = par3 + par2Random.nextInt(16) + 8; - int rz = par4 + par2Random.nextInt(16) + 8; - int ry = par2Random.nextInt(par1World.getHeightValue(rx, rz) + 32); - genTallFlowers.generate(par1World, par2Random, rx, ry, rz); - } - - super.decorate(par1World, par2Random, par3, par4); - } - - -} diff --git a/src/main/java/twilightforest/biomes/TFBiomeTwilightLake.java b/src/main/java/twilightforest/biomes/TFBiomeTwilightLake.java deleted file mode 100644 index d28692088f..0000000000 --- a/src/main/java/twilightforest/biomes/TFBiomeTwilightLake.java +++ /dev/null @@ -1,23 +0,0 @@ -package twilightforest.biomes; - -import net.minecraft.entity.passive.EntitySquid; - -public class TFBiomeTwilightLake extends TFBiomeBase { - - @SuppressWarnings("unchecked") - public TFBiomeTwilightLake(int i) { - super(i); - - -// this.rootHeight = -1.9F; -// this.heightVariation = 0.5F; - - this.temperature = 0.66F; - this.rainfall = 1F; - - //spawnableCreatureList.clear(); - this.spawnableWaterCreatureList.add(new SpawnListEntry(EntitySquid.class, 10, 4, 4)); - - } - -} diff --git a/src/main/java/twilightforest/biomes/TFDarkForestBiomeDecorator.java b/src/main/java/twilightforest/biomes/TFDarkForestBiomeDecorator.java deleted file mode 100644 index 0b57d6c009..0000000000 --- a/src/main/java/twilightforest/biomes/TFDarkForestBiomeDecorator.java +++ /dev/null @@ -1,155 +0,0 @@ -package twilightforest.biomes; - -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.init.Blocks; -import net.minecraft.world.World; -import net.minecraft.world.biome.BiomeGenBase; -import net.minecraft.world.chunk.Chunk; -import net.minecraft.world.gen.feature.WorldGenPumpkin; -import net.minecraft.world.gen.feature.WorldGenTallGrass; -import net.minecraft.world.gen.feature.WorldGenerator; -import twilightforest.TFFeature; -import twilightforest.block.BlockTFPlant; -import twilightforest.block.TFBlocks; -import twilightforest.world.TFGenDarkCanopyTree; -import twilightforest.world.TFGenTallGrass; -import twilightforest.world.TFTreeGenerator; -import twilightforest.world.TFWorld; - -public class TFDarkForestBiomeDecorator extends TFBiomeDecorator { - - TFTreeGenerator darkCanopyTreeGen; - TFGenTallGrass worldGenDeadBush; - WorldGenTallGrass worldGenForestGrass; - WorldGenTallGrass worldGenMushgloom; - - - public TFDarkForestBiomeDecorator() { - super(); - - darkCanopyTreeGen = new TFGenDarkCanopyTree(); - worldGenDeadBush = new TFGenTallGrass(TFBlocks.plant, BlockTFPlant.META_DEADBUSH, 8); - worldGenForestGrass = new WorldGenTallGrass(TFBlocks.plant, BlockTFPlant.META_FORESTGRASS); - worldGenMushgloom = new WorldGenTallGrass(TFBlocks.plant, BlockTFPlant.META_MUSHGLOOM); - } - - /** - * Decorates the world. Calls code that was formerly (pre-1.8) in ChunkProviderGenerate.populate - */ - @Override - public void decorateChunk(World world, Random rand, BiomeGenBase biome, int mapX, int mapZ) { - // just decorate with what we need here - TFFeature nearFeature = TFFeature.getNearestFeature(mapX >> 4, mapZ >> 4, world); - if (nearFeature.areChunkDecorationsEnabled) { - // add dark canopy trees - int nc = (int)canopyPerChunk + ((rand.nextFloat() < (canopyPerChunk - (int)canopyPerChunk)) ? 1 : 0); - for (int i = 0; i < nc; i++) { - int rx = mapX + rand.nextInt(16) + 8; - int rz = mapZ + rand.nextInt(16) + 8; - int ry = world.getHeightValue(rx, rz); - darkCanopyTreeGen.generate(world, rand, rx, ry, rz); - } - - // regular trees - for (int i = 0; i < this.treesPerChunk; ++i) - { - int rx = mapX + rand.nextInt(16) + 8; - int rz = mapZ + rand.nextInt(16) + 8; - int ry = getGroundLevel(world, rx, rz); - WorldGenerator var5 = biome.func_150567_a(rand); - var5.setScale(1.0D, 1.0D, 1.0D); - var5.generate(world, rand, rx, ry, rz); - } - - // dead bushes - for (int i = 0; i < this.deadBushPerChunk; ++i) - { - int rx = mapX + rand.nextInt(16) + 8; - int rz = mapZ + rand.nextInt(16) + 8; - int ry = rand.nextInt(128); - worldGenDeadBush.generate(world, rand, rx, ry, rz); - } - - // forest grass bushes - for (int i = 0; i < this.deadBushPerChunk; ++i) - { - int rx = mapX + rand.nextInt(16) + 8; - int rz = mapZ + rand.nextInt(16) + 8; - int ry = rand.nextInt(128); - worldGenForestGrass.generate(world, rand, rx, ry, rz); - } - - // mushrooms - for (int i = 0; i < this.mushroomsPerChunk; ++i) - { - if (rand.nextInt(8) == 0) { - int rx = mapX + rand.nextInt(16) + 8; - int rz = mapZ + rand.nextInt(16) + 8; - int ry = getGroundLevel(world, rx, rz); - this.mushroomBrownGen.generate(world, rand, rx, ry, rz); - } - if (rand.nextInt(16) == 0) { - int rx = mapX + rand.nextInt(16) + 8; - int rz = mapZ + rand.nextInt(16) + 8; - int ry = getGroundLevel(world, rx, rz); - this.mushroomRedGen.generate(world, rand, rx, ry, rz); - } - if (rand.nextInt(24) == 0) { - int rx = mapX + rand.nextInt(16) + 8; - int rz = mapZ + rand.nextInt(16) + 8; - int ry = getGroundLevel(world, rx, rz); - // mushglooms - worldGenMushgloom.generate(world, rand, rx, ry, rz); - } - } - if (rand.nextInt(4) == 0) { - int rx = mapX + rand.nextInt(16) + 8; - int rz = mapZ + rand.nextInt(16) + 8; - int ry = rand.nextInt(128); - this.mushroomBrownGen.generate(world, rand, rx, ry, rz); - } - if (rand.nextInt(8) == 0) { - int rx = mapX + rand.nextInt(16) + 8; - int rz = mapZ + rand.nextInt(16) + 8; - int ry = rand.nextInt(128); - this.mushroomRedGen.generate(world, rand, rx, ry, rz); - } - - // pumpkins - if (rand.nextInt(32) == 0) { - int rx = mapX + rand.nextInt(16) + 8; - int rz = mapZ + rand.nextInt(16) + 8; - int ry = getGroundLevel(world, rx, rz); - (new WorldGenPumpkin()).generate(world, rand, rx, ry, rz); - } - - } - - // do underground decorations - decorateUnderground(world, rand, mapX, mapZ); - decorateOnlyOres(world, rand, mapX, mapZ); - - } - - - public int getGroundLevel(World world, int x, int z) { - // go from sea level up. If we get grass, return that, otherwise return the last dirt, stone or gravel we got - Chunk chunk = world.getChunkFromBlockCoords(x, z); - int lastDirt = TFWorld.SEALEVEL; - for (int y = TFWorld.SEALEVEL; y < TFWorld.CHUNKHEIGHT - 1; y++) { - Block blockID = chunk.getBlock(x & 15, y, z & 15); - // grass = return immediately - if (blockID == Blocks.grass) { - return y + 1; - } - else if (blockID == Blocks.dirt || blockID == Blocks.stone || blockID == Blocks.gravel) { - lastDirt = y + 1; - } - } - - return lastDirt; - } - -} diff --git a/src/main/java/twilightforest/biomes/TFGenHugeWaterLily.java b/src/main/java/twilightforest/biomes/TFGenHugeWaterLily.java deleted file mode 100644 index fc965cf2d6..0000000000 --- a/src/main/java/twilightforest/biomes/TFGenHugeWaterLily.java +++ /dev/null @@ -1,44 +0,0 @@ -package twilightforest.biomes; - -import java.util.Random; - -import twilightforest.block.TFBlocks; -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.init.Blocks; -import net.minecraft.world.World; -import net.minecraft.world.gen.feature.WorldGenerator; - - -/** - * Generate huge lily pads - * - * @author Ben - * - */ -public class TFGenHugeWaterLily extends WorldGenerator -{ - - private Random rand = new Random(); - - - public boolean generate(World world, Random random, int x, int y, int z) - { - for (int i = 0; i < 4; i++) { - int dx = x + random.nextInt(8) - random.nextInt(8); - int dy = y + random.nextInt(4) - random.nextInt(4); - int dz = z + random.nextInt(8) - random.nextInt(8); - - if (shouldPlacePadAt(world, dx, dy, dz)) { - world.setBlock(dx, dy, dz, TFBlocks.hugeWaterLily); - } - } - - return true; - } - - - private boolean shouldPlacePadAt(World world, int dx, int dy, int dz) { - return world.isAirBlock(dx, dy, dz) && world.getBlock(dx, dy - 1, dz).getMaterial() == Material.water; - } -} diff --git a/src/main/java/twilightforest/block/AbstractLightableBlock.java b/src/main/java/twilightforest/block/AbstractLightableBlock.java new file mode 100644 index 0000000000..7214245dcf --- /dev/null +++ b/src/main/java/twilightforest/block/AbstractLightableBlock.java @@ -0,0 +1,138 @@ +package twilightforest.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.util.RandomSource; +import net.minecraft.util.StringRepresentable; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.entity.projectile.Projectile; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.BaseEntityBlock; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.EnumProperty; +import net.minecraft.world.level.gameevent.GameEvent; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.Vec3; +import twilightforest.init.TFParticleType; + +import org.jetbrains.annotations.Nullable; +import java.util.Locale; + +//all the common lighting/extinguishing methods for the candelabra and skull candles are here to reduce clutter +//it may also be handy if we decide to add more candle-based blocks in the future +public abstract class AbstractLightableBlock extends BaseEntityBlock { + + public static final EnumProperty LIGHTING = EnumProperty.create("lighting", Lighting.class); + + public AbstractLightableBlock(Properties properties) { + super(properties); + this.registerDefaultState(this.getStateDefinition().any().setValue(LIGHTING, Lighting.NONE)); + } + + @Override + public InteractionResult use(BlockState state, Level level, BlockPos pos, Player player, InteractionHand hand, BlockHitResult result) { + if (player.getAbilities().mayBuild && player.getItemInHand(hand).isEmpty() && state.getValue(LIGHTING) != Lighting.NONE) { + extinguish(player, state, level, pos); + return InteractionResult.sidedSuccess(level.isClientSide()); + + } else if (this.canBeLit(state)) { + if (player.getItemInHand(hand).is(Items.FLINT_AND_STEEL)) { + setLit(level, state, pos, true); + level.playSound(null, pos, SoundEvents.FLINTANDSTEEL_USE, SoundSource.BLOCKS, 1.0F, 1.0F); + if (!player.getAbilities().instabuild) player.getItemInHand(hand).hurtAndBreak(1, player, (res) -> { + res.broadcastBreakEvent(hand); + }); + return InteractionResult.sidedSuccess(level.isClientSide()); + } else if (player.getItemInHand(hand).is(Items.FIRE_CHARGE)) { + setLit(level, state, pos, true); + level.playSound(null, pos, SoundEvents.FIRECHARGE_USE, SoundSource.BLOCKS, 1.0F, 1.0F); + if (!player.getAbilities().instabuild) player.getItemInHand(hand).shrink(1); + return InteractionResult.sidedSuccess(level.isClientSide()); + } + } + return InteractionResult.PASS; + } + + @Override + public void onProjectileHit(Level level, BlockState state, BlockHitResult result, Projectile projectile) { + if (!level.isClientSide() && projectile.isOnFire() && this.canBeLit(state)) { + setLit(level, state, result.getBlockPos(), true); + } + } + + protected boolean canBeLit(BlockState state) { + return state.getValue(LIGHTING) == Lighting.NONE; + } + + protected abstract Iterable getParticleOffsets(BlockState state, LevelAccessor level, BlockPos pos); + + // Original methods used Vec3 but here we can avoid creation of extraneous vectors + protected static void addParticlesAndSound(Level level, BlockPos pos, double xFraction, double yFraction, double zFraction, RandomSource rand, boolean ominous) { + addParticlesAndSound(level, pos.getX() + xFraction, pos.getY() + yFraction, pos.getZ() + zFraction, rand, ominous); + } + + protected static void addParticlesAndSound(Level level, double x, double y, double z, RandomSource rand, boolean ominous) { + float var3 = rand.nextFloat(); + if (var3 < 0.3F) { + if (!ominous) level.addParticle(ParticleTypes.SMOKE, x, y, z, 0.0D, 0.0D, 0.0D); + if (var3 < 0.17F) { + level.playLocalSound(x + 0.5D, y + 0.5D, z + 0.5D, SoundEvents.CANDLE_AMBIENT, SoundSource.BLOCKS, 1.0F + rand.nextFloat(), rand.nextFloat() * 0.7F + 0.3F, false); + } + } + + level.addParticle(ominous ? TFParticleType.OMINOUS_FLAME.get() : ParticleTypes.SMALL_FLAME, x, y, z, 0.0D, 0.0D, 0.0D); + } + + //still, we should include the vector method because im too lazy to convert :P + protected static void addParticlesAndSound(Level level, Vec3 vec, RandomSource rand, boolean ominous) { + float var3 = rand.nextFloat(); + if (var3 < 0.3F) { + if (!ominous) level.addParticle(ParticleTypes.SMOKE, vec.x(), vec.y(), vec.z(), 0.0D, 0.0D, 0.0D); + if (var3 < 0.17F) { + level.playLocalSound(vec.x() + 0.5D, vec.y() + 0.5D, vec.z() + 0.5D, SoundEvents.CANDLE_AMBIENT, SoundSource.BLOCKS, 1.0F + rand.nextFloat(), rand.nextFloat() * 0.7F + 0.3F, false); + } + } + + level.addParticle(ominous ? TFParticleType.OMINOUS_FLAME.get() : ParticleTypes.SMALL_FLAME, vec.x, vec.y, vec.z, 0.0D, 0.0D, 0.0D); + } + + public static void extinguish(@Nullable Player player, BlockState state, LevelAccessor accessor, BlockPos pos) { + setLit(accessor, state, pos, false); + + if (state.getBlock() instanceof AbstractLightableBlock abstractLightableBlock) { + abstractLightableBlock.getParticleOffsets(state, accessor, pos).forEach((vec3) -> + accessor.addParticle(ParticleTypes.SMOKE, (double) pos.getX() + vec3.x, (double) pos.getY() + vec3.y, (double) pos.getZ() + vec3.z, 0.0D, 0.025D, 0.0D)); + } + + accessor.playSound(null, pos, SoundEvents.CANDLE_EXTINGUISH, SoundSource.BLOCKS, 1.0F, 1.0F); + accessor.gameEvent(player, GameEvent.BLOCK_CHANGE, pos); + } + + private static void setLit(LevelAccessor accessor, BlockState state, BlockPos pos, boolean lit) { + accessor.setBlock(pos, state.setValue(LIGHTING, lit ? Lighting.NORMAL : Lighting.NONE), 11); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder pBuilder) { + pBuilder.add(LIGHTING); + } + + public enum Lighting implements StringRepresentable { + NONE, + NORMAL, + OMINOUS; + + @Override + public String getSerializedName() { + return name().toLowerCase(Locale.ROOT); + } + } +} diff --git a/src/main/java/twilightforest/block/AbstractParticleSpawnerBlock.java b/src/main/java/twilightforest/block/AbstractParticleSpawnerBlock.java new file mode 100644 index 0000000000..b8f6555957 --- /dev/null +++ b/src/main/java/twilightforest/block/AbstractParticleSpawnerBlock.java @@ -0,0 +1,48 @@ +package twilightforest.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.particles.ParticleOptions; +import net.minecraft.core.particles.ParticleType; +import net.minecraft.util.Mth; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.IntegerProperty; + +public abstract class AbstractParticleSpawnerBlock extends Block { + + public static final IntegerProperty RADIUS = IntegerProperty.create("particle_radius", 1, 10); + + public AbstractParticleSpawnerBlock(Properties properties) { + super(properties); + this.registerDefaultState(this.getStateDefinition().any().setValue(RADIUS, 1)); + } + + @Override + public void animateTick(BlockState state, Level level, BlockPos pos, RandomSource random) { + int x = pos.getX(); + int y = pos.getY(); + int z = pos.getZ(); + int radius = state.getValue(RADIUS); + BlockPos.MutableBlockPos mutablePos = new BlockPos.MutableBlockPos(); + + for (int partCount = 0; partCount < getParticleCountPerSpawn(state); ++partCount) { + mutablePos.set(x + Mth.nextInt(random, -radius, radius), y + Mth.nextInt(random, -radius, radius), z + Mth.nextInt(random, -radius, radius)); + BlockState offState = level.getBlockState(mutablePos); + if (!offState.isCollisionShapeFullBlock(level, mutablePos)) { + level.addParticle((ParticleOptions) getParticlesToSpawn(), (double) mutablePos.getX() + random.nextDouble(), (double) mutablePos.getY() + random.nextDouble(), (double) mutablePos.getZ() + random.nextDouble(), 0.0D, 0.0D, 0.0D); + } + } + } + + public abstract ParticleType getParticlesToSpawn(); + + public abstract int getParticleCountPerSpawn(BlockState state); + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + builder.add(RADIUS); + } +} diff --git a/src/main/java/twilightforest/block/AbstractSkullCandleBlock.java b/src/main/java/twilightforest/block/AbstractSkullCandleBlock.java new file mode 100644 index 0000000000..e8dbeba43d --- /dev/null +++ b/src/main/java/twilightforest/block/AbstractSkullCandleBlock.java @@ -0,0 +1,223 @@ +package twilightforest.block; + +import com.mojang.authlib.GameProfile; +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtUtils; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.tags.ItemTags; +import net.minecraft.util.RandomSource; +import net.minecraft.util.StringRepresentable; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.RenderShape; +import net.minecraft.world.level.block.SkullBlock; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.HitResult; +import net.minecraftforge.common.Tags; +import net.minecraftforge.registries.ForgeRegistries; +import org.apache.commons.lang3.StringUtils; +import org.jetbrains.annotations.Nullable; +import twilightforest.block.entity.SkullCandleBlockEntity; + +import java.util.*; + +public abstract class AbstractSkullCandleBlock extends AbstractLightableBlock { + + private final SkullBlock.Type type; + + public AbstractSkullCandleBlock(SkullBlock.Type type, Properties properties) { + super(properties); + this.type = type; + } + + public SkullBlock.Type getType() { + return this.type; + } + + @Override + public int getLightEmission(BlockState state, BlockGetter getter, BlockPos pos) { + if (getter.getBlockEntity(pos) instanceof SkullCandleBlockEntity sc) { + switch (state.getValue(LIGHTING)) { + case NONE -> { + return 0; + } + case NORMAL -> { + return 3 * sc.candleAmount; + } + case OMINOUS -> { + return 2 * sc.candleAmount; + } + } + } + return 0; + } + + @Nullable + @Override + public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { + return new SkullCandleBlockEntity(pos, state, 0, 0); + } + + //input one of the enum names to convert it into a candle block + public static Block candleColorToCandle(String candleName) { + if (!candleName.equals(CandleColors.PLAIN.getSerializedName())) { + return Objects.requireNonNull(ForgeRegistries.BLOCKS.getValue(new ResourceLocation(candleName + "_candle"))); + } + return Blocks.CANDLE; + } + + //inverse of above + public static CandleColors candleToCandleColor(Item candle) { + if (!(candle == Blocks.CANDLE.asItem())) { + return CandleColors.valueOf(ForgeRegistries.ITEMS.getKey(candle).getPath().replace("_candle", "").replace("\"", "").toUpperCase(Locale.ROOT)); + } + return CandleColors.PLAIN; + } + + public RenderShape getRenderShape(BlockState state) { + return RenderShape.INVISIBLE; + } + + @Override + public void setPlacedBy(Level level, BlockPos pos, BlockState state, @Nullable LivingEntity placer, ItemStack stack) { + super.setPlacedBy(level, pos, state, placer, stack); + BlockEntity blockentity = level.getBlockEntity(pos); + if (blockentity instanceof SkullCandleBlockEntity sc) { + if (stack.hasTag() && stack.getTag() != null) { + CompoundTag tag = stack.getTagElement("BlockEntityTag"); + if (tag != null) { + if (tag.contains("CandleAmount")) sc.candleAmount = tag.getInt("CandleAmount"); + if (tag.contains("CandleColor")) sc.candleColor = tag.getInt("CandleColor"); + } + if (this.type == SkullBlock.Types.PLAYER) { + GameProfile gameprofile = null; + CompoundTag compoundtag = stack.getTag(); + if (compoundtag.contains("SkullOwner", 10)) { + gameprofile = NbtUtils.readGameProfile(compoundtag.getCompound("SkullOwner")); + } else if (compoundtag.contains("SkullOwner", 8) && !StringUtils.isBlank(compoundtag.getString("SkullOwner"))) { + gameprofile = new GameProfile(null, compoundtag.getString("SkullOwner")); + } + sc.setOwner(gameprofile); + } + } + } + } + + @Override + @SuppressWarnings("deprecation") + public List getDrops(BlockState state, LootContext.Builder builder) { + List drops = super.getDrops(state, builder); + Optional skullStack = drops.stream().filter(item -> item.is(Tags.Items.HEADS) && !item.is(this.asItem())).findFirst(); + if (skullStack.isPresent()) { + BlockEntity blockEntity = builder.getOptionalParameter(LootContextParams.BLOCK_ENTITY); + if (blockEntity instanceof SkullCandleBlockEntity sc) { + if (!builder.getParameter(LootContextParams.TOOL).isEmpty() && builder.getParameter(LootContextParams.TOOL).getEnchantmentLevel(Enchantments.SILK_TOUCH) > 0) { + ItemStack newStack = new ItemStack(this); + CompoundTag tag = new CompoundTag(); + tag.putInt("CandleColor", sc.candleColor); + tag.putInt("CandleAmount", sc.candleAmount); + newStack.addTagElement("BlockEntityTag", tag); + if (sc.getOwnerProfile() != null) newStack.getOrCreateTag().put("SkullOwner", NbtUtils.writeGameProfile(new CompoundTag(), sc.getOwnerProfile())); + drops.remove(skullStack.get()); + drops.add(newStack); + } else { + drops.add(new ItemStack(candleColorToCandle(CandleColors.colorFromInt(sc.candleColor).getSerializedName()), sc.candleAmount)); + } + } + } + + return drops; + } + + @Override + public ItemStack getCloneItemStack(BlockState state, HitResult result, BlockGetter getter, BlockPos pos, Player player) { + ItemStack newStack = new ItemStack(this); + CompoundTag tag = new CompoundTag(); + if (getter.getBlockEntity(pos) instanceof SkullCandleBlockEntity sc) { + if (sc.getOwnerProfile() != null) + newStack.getOrCreateTag().put("SkullOwner", NbtUtils.writeGameProfile(new CompoundTag(), sc.getOwnerProfile())); + tag.putInt("CandleColor", sc.candleColor); + tag.putInt("CandleAmount", sc.candleAmount); + newStack.addTagElement("BlockEntityTag", tag); + } + return newStack; + } + + @Override + public InteractionResult use(BlockState state, Level level, BlockPos pos, Player player, InteractionHand hand, BlockHitResult result) { + if (level.getBlockEntity(pos) instanceof SkullCandleBlockEntity sc) { + if (player.getItemInHand(hand).is(ItemTags.CANDLES) + && player.getItemInHand(hand).is(candleColorToCandle(CandleColors.colorFromInt(sc.candleColor).getSerializedName()).asItem()) + && !player.isShiftKeyDown()) { + if (sc.candleAmount < 4) { + sc.candleAmount++; + level.playSound(null, pos, SoundEvents.CANDLE_PLACE, SoundSource.BLOCKS, 1.0F, 1.0F); + if (!player.getAbilities().instabuild) player.getItemInHand(hand).shrink(1); + level.getLightEngine().checkBlock(pos); + return InteractionResult.sidedSuccess(level.isClientSide()); + } + + } + } + return super.use(state, level, pos, player, hand, result); + } + + @Override + public void animateTick(BlockState state, Level level, BlockPos pos, RandomSource rand) { + if (state.getValue(LIGHTING) != Lighting.NONE) { + this.getParticleOffsets(state, level, pos).forEach((offset) -> + addParticlesAndSound(level, offset.add(pos.getX(), pos.getY(), pos.getZ()), rand, state.getValue(LIGHTING) == Lighting.OMINOUS)); + } + } + + public enum CandleColors implements StringRepresentable { + + PLAIN(0), + WHITE(1), LIGHT_GRAY(2), GRAY(3), BLACK(4), + RED(5), ORANGE(6), YELLOW(7), GREEN(8), + LIME(9), BLUE(10), CYAN(11), LIGHT_BLUE(12), + PURPLE(13), MAGENTA(14), PINK(15), BROWN(16); + + private final int value; + private static final Map map = new HashMap<>(); + + CandleColors(int value) { + this.value = value; + } + + static { + for (CandleColors color : CandleColors.values()) { + map.put(color.value, color); + } + } + + public static CandleColors colorFromInt(int value) { + return map.get(value); + } + + public int getValue() { + return this.value; + } + + @Override + public String getSerializedName() { + return name().toLowerCase(Locale.ROOT); + } + } +} diff --git a/src/main/java/twilightforest/block/AbstractTrophyBlock.java b/src/main/java/twilightforest/block/AbstractTrophyBlock.java new file mode 100644 index 0000000000..d231fb0aca --- /dev/null +++ b/src/main/java/twilightforest/block/AbstractTrophyBlock.java @@ -0,0 +1,241 @@ +package twilightforest.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.particles.BlockParticleOption; +import net.minecraft.core.particles.DustParticleOptions; +import net.minecraft.core.particles.ItemParticleOption; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundSource; +import net.minecraft.util.RandomSource; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.BaseEntityBlock; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityTicker; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.pathfinder.PathComputationType; +import net.minecraft.world.phys.BlockHitResult; +import twilightforest.block.entity.TrophyBlockEntity; +import twilightforest.enums.BossVariant; +import twilightforest.init.TFBlockEntities; +import twilightforest.init.TFItems; +import twilightforest.init.TFParticleType; +import twilightforest.init.TFSounds; + +import org.jetbrains.annotations.Nullable; + +//[VanillaCopy] of AbstractSkullBlock except uses Variants instead of ISkullType and adds Sounds when clicked or powered +public abstract class AbstractTrophyBlock extends BaseEntityBlock { + + private final BossVariant variant; + private final int comparatorValue; + public static final BooleanProperty POWERED = BlockStateProperties.POWERED; + + protected AbstractTrophyBlock(BossVariant variant, int value, BlockBehaviour.Properties builder) { + super(builder); + this.variant = variant; + this.comparatorValue = value; + this.registerDefaultState(this.getStateDefinition().any().setValue(POWERED, false)); + } + + public int getComparatorValue() { + return this.comparatorValue; + } + + @Override + public void neighborChanged(BlockState state, Level level, BlockPos pos, Block block, BlockPos fromPos, boolean isMoving) { + if (!level.isClientSide()) { + boolean flag = level.hasNeighborSignal(pos); + if (flag != state.getValue(POWERED)) { + if (flag) { + this.playSound(level, pos); + } + level.setBlockAndUpdate(pos, state.setValue(POWERED, flag)); + } + } + } + + @Override + public InteractionResult use(BlockState state, Level level, BlockPos pos, Player playerIn, InteractionHand handIn, BlockHitResult hit) { + this.playSound(level, pos); + this.createParticle(level, pos); + return InteractionResult.sidedSuccess(level.isClientSide()); + } + + @Nullable + @Override + public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { + return new TrophyBlockEntity(pos, state); + } + + @Nullable + @Override + public BlockEntityTicker getTicker(Level level, BlockState state, BlockEntityType type) { + return createTickerHelper(type, TFBlockEntities.TROPHY.get(), TrophyBlockEntity::tick); + } + + public BossVariant getVariant() { + return this.variant; + } + + @Override + public boolean isPathfindable(BlockState state, BlockGetter getter, BlockPos pos, PathComputationType type) { + return false; + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + builder.add(POWERED); + } + + public void playSound(Level world, BlockPos pos) { + BlockEntity te = world.getBlockEntity(pos); + if (!world.isClientSide() && te instanceof TrophyBlockEntity) { + SoundEvent sound = null; + float volume = 1.0F; + float pitch = 0.9F; + switch (this.variant) { + case NAGA -> { + sound = TFSounds.NAGA_RATTLE.get(); + volume = 1.25F; + pitch = 1.2F; + } + case LICH -> { + sound = TFSounds.LICH_AMBIENT.get(); + volume = 0.35F; + pitch = 1.1F; + } + case HYDRA -> { + sound = TFSounds.HYDRA_GROWL.get(); + pitch = 1.2F; + } + case UR_GHAST -> { + sound = TFSounds.UR_GHAST_AMBIENT.get(); + pitch = 0.6F; + } + case SNOW_QUEEN -> sound = TFSounds.SNOW_QUEEN_AMBIENT.get(); + case KNIGHT_PHANTOM -> { + sound = TFSounds.KNIGHT_PHANTOM_AMBIENT.get(); + pitch = 1.1F; + } + case MINOSHROOM -> { + sound = TFSounds.MINOSHROOM_AMBIENT.get(); + volume = 0.75F; + pitch = 0.7F; + } + case ALPHA_YETI -> { + sound = world.getRandom().nextInt(50) == 0 ? TFSounds.ALPHA_YETI_ROAR.get() : TFSounds.ALPHA_YETI_GROWL.get(); + volume = 0.75F; + pitch = 0.75F; + } + case QUEST_RAM -> { + sound = TFSounds.QUEST_RAM_AMBIENT.get(); + pitch = 0.7F; + } + default -> { + } + } + if (sound != null) { + world.playSound(null, pos, sound, SoundSource.BLOCKS, volume, world.getRandom().nextFloat() * 0.1F + pitch); + } + } + } + + public void createParticle(Level level, BlockPos pos) { + BlockEntity te = level.getBlockEntity(pos); + if (te instanceof TrophyBlockEntity) { + RandomSource rand = level.getRandom(); + if (level instanceof ServerLevel server) { + switch (this.variant) { + case NAGA: + for (int daze = 0; daze < 10; daze++) { + server.sendParticles(ParticleTypes.CRIT, + ((double) pos.getX() + rand.nextFloat() * 0.5 * 2.0F), + (double) pos.getY() + 0.25, + ((double) pos.getZ() + rand.nextFloat() * 0.5 * 2.0F), + 1, 0, 0, 0, rand.nextGaussian() * 0.02D); + } + break; + case LICH: + for (int a = 0; a < 5; a++) { + server.sendParticles(ParticleTypes.ANGRY_VILLAGER, + (double) pos.getX() + rand.nextFloat() * 0.5 * 2.0F, + (double) pos.getY() + 0.5 + rand.nextFloat() * 0.25, + (double) pos.getZ() + rand.nextFloat() * 0.5 * 2.0F, 1, + rand.nextGaussian() * 0.02D, rand.nextGaussian() * 0.02D, rand.nextGaussian() * 0.02D, 0); + } + break; + case MINOSHROOM: + for (int g = 0; g < 10; g++) { + server.sendParticles(new BlockParticleOption(ParticleTypes.BLOCK, level.getBlockState(pos.below())), + (double) pos.getX() + rand.nextFloat() * 10F - 5F, + (double) pos.getY() + 0.1F + rand.nextFloat() * 0.3F, + (double) pos.getZ() + rand.nextFloat() * 10F - 5F, + 1, 0, 0, 0, 0); + } + break; + case KNIGHT_PHANTOM: + for (int brek = 0; brek < 10; brek++) { + server.sendParticles(new ItemParticleOption(ParticleTypes.ITEM, new ItemStack(TFItems.KNIGHTMETAL_SWORD.get())), + pos.getX() + 0.5 + (rand.nextFloat() - 0.5), + pos.getY() + rand.nextFloat() + 0.5, + pos.getZ() + 0.5 + (rand.nextFloat() - 0.5), + 1, 0, .25, 0, 0); + + } + break; + case UR_GHAST: + for (int red = 0; red < 10; red++) { + server.sendParticles(DustParticleOptions.REDSTONE, + (double) pos.getX() + (rand.nextDouble() * 1) - 0.25, + (double) pos.getY() + rand.nextDouble() * 0.5 + 0.5, + (double) pos.getZ() + (rand.nextDouble() * 1), + 1, 0, 0, 0, 0); + } + break; + case ALPHA_YETI: + for (int sweat = 0; sweat < 10; sweat++) { + server.sendParticles(ParticleTypes.SPLASH, + (double) pos.getX() + (rand.nextDouble() * 1) - 0.25, + (double) pos.getY() + rand.nextDouble() * 0.5 + 0.5, + (double) pos.getZ() + (rand.nextDouble() * 1), + 1, 0, 0, 0, 0); + } + break; + case SNOW_QUEEN: + for (int b = 0; b < 20; b++) { + server.sendParticles(TFParticleType.SNOW_WARNING.get(), + (double) pos.getX() - 1 + (rand.nextDouble() * 3.25), + (double) pos.getY() + 5, + (double) pos.getZ() - 1 + (rand.nextDouble() * 3.25), 1, + 0, 1, 0, 0); + } + break; + case QUEST_RAM: + for (int p = 0; p < 10; p++) { + server.sendParticles(ParticleTypes.ENTITY_EFFECT, + (double) pos.getX() + 0.5 + (rand.nextDouble() - 0.5), + (double) pos.getY() + (rand.nextDouble() - 0.5), + (double) pos.getZ() + 0.5 + (rand.nextDouble() - 0.5), 1, + rand.nextFloat(), rand.nextFloat(), rand.nextFloat(), 1); + } + break; + default: + break; + } + } + } + } +} diff --git a/src/main/java/twilightforest/block/AntibuilderBlock.java b/src/main/java/twilightforest/block/AntibuilderBlock.java new file mode 100644 index 0000000000..781d0671f9 --- /dev/null +++ b/src/main/java/twilightforest/block/AntibuilderBlock.java @@ -0,0 +1,38 @@ +package twilightforest.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.BaseEntityBlock; +import net.minecraft.world.level.block.RenderShape; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityTicker; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import twilightforest.block.entity.AntibuilderBlockEntity; +import twilightforest.init.TFBlockEntities; + +import org.jetbrains.annotations.Nullable; + +public class AntibuilderBlock extends BaseEntityBlock { + + public AntibuilderBlock(Properties props) { + super(props); + } + + @Override + public RenderShape getRenderShape(BlockState state) { + return RenderShape.MODEL; + } + + @Nullable + @Override + public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { + return new AntibuilderBlockEntity(pos, state); + } + + @Nullable + @Override + public BlockEntityTicker getTicker(Level level, BlockState state, BlockEntityType type) { + return createTickerHelper(type, TFBlockEntities.ANTIBUILDER.get(), AntibuilderBlockEntity::tick); + } +} diff --git a/src/main/java/twilightforest/block/ArcticFurBlock.java b/src/main/java/twilightforest/block/ArcticFurBlock.java new file mode 100644 index 0000000000..a8c4fc582a --- /dev/null +++ b/src/main/java/twilightforest/block/ArcticFurBlock.java @@ -0,0 +1,44 @@ +package twilightforest.block; + +import net.minecraft.ChatFormatting; +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.damagesource.DamageTypes; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.ShearsItem; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; + +import org.jetbrains.annotations.Nullable; +import java.util.List; + +public class ArcticFurBlock extends Block { + private static final MutableComponent TOOLTIP = Component.translatable("block.twilightforest.arctic_fur_block.desc").withStyle(ChatFormatting.GRAY); + + public ArcticFurBlock(Properties properties) { + super(properties); + } + + @Override + public float getDestroyProgress(BlockState state, Player player, BlockGetter getter, BlockPos pos) { + // ItemShears#getDestroySpeed is really dumb and doesn't check IShearable so we have to do it this way to try to match the wool break speed with shears + return player.getMainHandItem().getItem() instanceof ShearsItem ? 0.2F : super.getDestroyProgress(state, player, getter, pos); + } + + @Override + public void fallOn(Level level, BlockState state, BlockPos pos, Entity entity, float fallDistance) { + entity.causeFallDamage(fallDistance, 0.1F, level.damageSources().fall()); + } + + @Override + public void appendHoverText(ItemStack stack, @Nullable BlockGetter getter, List tooltip, TooltipFlag flag) { + tooltip.add(TOOLTIP); + } +} diff --git a/src/main/java/twilightforest/block/AuroraBrickBlock.java b/src/main/java/twilightforest/block/AuroraBrickBlock.java new file mode 100644 index 0000000000..b01cf9ee81 --- /dev/null +++ b/src/main/java/twilightforest/block/AuroraBrickBlock.java @@ -0,0 +1,261 @@ +package twilightforest.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.IntegerProperty; +import twilightforest.TwilightForestMod; +import twilightforest.util.PlayerHelper; + +public class AuroraBrickBlock extends Block { + + public static final IntegerProperty VARIANT = IntegerProperty.create("variant", 0, 15); + + public AuroraBrickBlock(Properties props) { + super(props); + } + + @Override + public float getDestroyProgress(BlockState state, Player player, BlockGetter getter, BlockPos pos) { + return PlayerHelper.doesPlayerHaveRequiredAdvancements(player, TwilightForestMod.prefix("progress_glacier")) ? 0.1F : super.getDestroyProgress(state, player, getter, pos); + } + + private static float getFractalNoise(int iteration, float size, BlockPos pos) { + return iteration == 0 ? 0 : ((SimplexNoise.noise( + (pos.getX() + (iteration * size)) / size, + (pos.getY() + (iteration * size)) / size, + (pos.getZ() + (iteration * size)) / size) + + 1.0f) * 0.5f) + getFractalNoise(iteration - 1, size, pos); + } + + public static float fractalNoise(int iterations, float size, BlockPos pos) { + return getFractalNoise(iterations, size, pos) / iterations; + } + + private static int calcVariant(BlockPos pos) { + return ((int) ((fractalNoise(3, 48.0f, pos) * 120.0f) % 16.0f)) % 16; + } + + public static float rippleFractialNoise(int iterations, float size, BlockPos pos, float minimum, float maximum, float frequency) { + float i = maximum - minimum; + return Math.abs(((getFractalNoise(iterations, size, pos) * frequency) % (2 * i)) - i) + minimum; + } + + @Override + public BlockState getStateForPlacement(BlockPlaceContext ctx) { + return defaultBlockState().setValue(VARIANT, calcVariant(ctx.getClickedPos())); + } + + @Override + @Deprecated + public BlockState updateShape(BlockState state, Direction facing, BlockState facingState, LevelAccessor accessor, BlockPos currentPos, BlockPos facingPos) { + return this.defaultBlockState().setValue(VARIANT, calcVariant(currentPos)); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + super.createBlockStateDefinition(builder); + builder.add(VARIANT); + } + + /* + * A speed-improved simplex noise algorithm for 2D, 3D and 4D in Java. + * + * Based on example code by Stefan Gustavson (stegu@itn.liu.se). + * Optimisations by Peter Eastman (peastman@drizzle.stanford.edu). + * Better rank ordering method for 4D by Stefan Gustavson in 2012. + * + * This could be speeded up even further, but it's useful as it is. + * + * Version 2012-03-09 + * + * This code was placed in the public domain by its original author, + * Stefan Gustavson. You may use it as you see fit, but + * attribution is appreciated. + * + */ + + private static class SimplexNoise { // Simplex noise in 2D, 3D and 4D + private static final Grad[] grad3 = {new Grad(1, 1, 0), new Grad(-1, 1, 0), new Grad(1, -1, 0), new Grad(-1, -1, 0), + new Grad(1, 0, 1), new Grad(-1, 0, 1), new Grad(1, 0, -1), new Grad(-1, 0, -1), + new Grad(0, 1, 1), new Grad(0, -1, 1), new Grad(0, 1, -1), new Grad(0, -1, -1)}; + + private static final short[] p = {151, 160, 137, 91, 90, 15, + 131, 13, 201, 95, 96, 53, 194, 233, 7, 225, 140, 36, 103, 30, 69, 142, 8, 99, 37, 240, 21, 10, 23, + 190, 6, 148, 247, 120, 234, 75, 0, 26, 197, 62, 94, 252, 219, 203, 117, 35, 11, 32, 57, 177, 33, + 88, 237, 149, 56, 87, 174, 20, 125, 136, 171, 168, 68, 175, 74, 165, 71, 134, 139, 48, 27, 166, + 77, 146, 158, 231, 83, 111, 229, 122, 60, 211, 133, 230, 220, 105, 92, 41, 55, 46, 245, 40, 244, + 102, 143, 54, 65, 25, 63, 161, 1, 216, 80, 73, 209, 76, 132, 187, 208, 89, 18, 169, 200, 196, + 135, 130, 116, 188, 159, 86, 164, 100, 109, 198, 173, 186, 3, 64, 52, 217, 226, 250, 124, 123, + 5, 202, 38, 147, 118, 126, 255, 82, 85, 212, 207, 206, 59, 227, 47, 16, 58, 17, 182, 189, 28, 42, + 223, 183, 170, 213, 119, 248, 152, 2, 44, 154, 163, 70, 221, 153, 101, 155, 167, 43, 172, 9, + 129, 22, 39, 253, 19, 98, 108, 110, 79, 113, 224, 232, 178, 185, 112, 104, 218, 246, 97, 228, + 251, 34, 242, 193, 238, 210, 144, 12, 191, 179, 162, 241, 81, 51, 145, 235, 249, 14, 239, 107, + 49, 192, 214, 31, 181, 199, 106, 157, 184, 84, 204, 176, 115, 121, 50, 45, 127, 4, 150, 254, + 138, 236, 205, 93, 222, 114, 67, 29, 24, 72, 243, 141, 128, 195, 78, 66, 215, 61, 156, 180}; + + // To remove the need for index wrapping, double the permutation table length + private static final short[] perm = new short[512]; + private static final short[] permMod12 = new short[512]; + + static { + for (int i = 0; i < 512; i++) { + perm[i] = p[i & 255]; + permMod12[i] = (short) (perm[i] % 12); + } + } + + // Skewing and unskewing factors for 2, 3, and 4 dimensions + private static final float F3 = 1.0f / 3.0f; + private static final float G3 = 1.0f / 6.0f; + + // This method is a *lot* faster than using (int)Math.floor(x) + private static int fastfloor(float x) { + int xi = (int) x; + return x < xi ? xi - 1 : xi; + } + + private static float dot(Grad g, float x, float y, float z) { + return g.x * x + g.y * y + g.z * z; + } + + // 3D simplex noise + static float noise(float xin, float yin, float zin) { + float n0, n1, n2, n3; // Noise contributions from the four corners + // Skew the input space to determine which simplex cell we're in + float s = (xin + yin + zin) * F3; // Very nice and simple skew factor for 3D + int i = fastfloor(xin + s); + int j = fastfloor(yin + s); + int k = fastfloor(zin + s); + float t = (i + j + k) * G3; + float X0 = i - t; // Unskew the cell origin back to (x,y,z) space + float Y0 = j - t; + float Z0 = k - t; + float x0 = xin - X0; // The x,y,z distances from the cell origin + float y0 = yin - Y0; + float z0 = zin - Z0; + // For the 3D case, the simplex shape is a slightly irregular tetrahedron. + // Determine which simplex we are in. + int i1, j1, k1; // Offsets for second corner of simplex in (i,j,k) coords + int i2, j2, k2; // Offsets for third corner of simplex in (i,j,k) coords + if (x0 >= y0) { + if (y0 >= z0) { + i1 = 1; + j1 = 0; + k1 = 0; + i2 = 1; + j2 = 1; + k2 = 0; + } // X Y Z order + else if (x0 >= z0) { + i1 = 1; + j1 = 0; + k1 = 0; + i2 = 1; + j2 = 0; + k2 = 1; + } // X Z Y order + else { + i1 = 0; + j1 = 0; + k1 = 1; + i2 = 1; + j2 = 0; + k2 = 1; + } // Z X Y order + } else { // x0> 16; + int green = (color & '\uff00') >> 8; + int blue = (color & 255); + return new float[] {red / 255.0F, green / 255.0F, blue / 255.0F}; + } +} diff --git a/src/main/java/twilightforest/block/BanisterBlock.java b/src/main/java/twilightforest/block/BanisterBlock.java new file mode 100644 index 0000000000..038e752edc --- /dev/null +++ b/src/main/java/twilightforest/block/BanisterBlock.java @@ -0,0 +1,241 @@ +package twilightforest.block; + +import net.minecraft.ChatFormatting; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.network.chat.Component; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.HorizontalDirectionalBlock; +import net.minecraft.world.level.block.SimpleWaterloggedBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.block.state.properties.EnumProperty; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.level.material.Fluids; +import net.minecraft.world.level.pathfinder.BlockPathTypes; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; +import net.minecraftforge.common.ToolActions; +import twilightforest.data.tags.BlockTagGenerator; +import twilightforest.enums.BanisterShape; + +import org.jetbrains.annotations.Nullable; +import java.util.List; + +public class BanisterBlock extends HorizontalDirectionalBlock implements SimpleWaterloggedBlock { + public static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED; + public static final EnumProperty SHAPE = EnumProperty.create("shape", BanisterShape.class); + public static final BooleanProperty EXTENDED = BooleanProperty.create("extended"); + + public BanisterBlock(Properties properties) { + super(properties); + + this.registerDefaultState(this.getStateDefinition().any().setValue(SHAPE, BanisterShape.TALL).setValue(EXTENDED, false).setValue(FACING, Direction.NORTH).setValue(WATERLOGGED, false)); + } + + @Override + public BlockState getStateForPlacement(BlockPlaceContext context) { + BlockPos pos = context.getClickedPos(); + + return this.defaultBlockState() + .setValue(FACING, context.getHorizontalDirection()) + .setValue(SHAPE, context.getLevel().getBlockState(pos.above()).is(BlockTagGenerator.BANISTERS) ? BanisterShape.CONNECTED : BanisterShape.TALL) + .setValue(WATERLOGGED, context.getLevel().getFluidState(pos).getType() == Fluids.WATER); + } + + @Override + public VoxelShape getShape(BlockState state, BlockGetter getter, BlockPos pos, CollisionContext context) { + boolean extended = state.getValue(EXTENDED); + + return switch (state.getValue(SHAPE)) { + case SHORT -> { + switch (state.getValue(BanisterBlock.FACING)) { + case NORTH -> { + yield extended ? NORTH_SHORT_EXTENDED : NORTH_SHORT; + } + case WEST -> { + yield extended ? WEST_SHORT_EXTENDED : WEST_SHORT; + } + case EAST -> { + yield extended ? EAST_SHORT_EXTENDED : EAST_SHORT; + } + default -> { + yield extended ? SOUTH_SHORT_EXTENDED : SOUTH_SHORT; + } + } + } + case CONNECTED -> { + switch (state.getValue(BanisterBlock.FACING)) { + case NORTH -> { + yield extended ? NORTH_CONNECTED_EXTENDED : NORTH_SUPPORTS_TALL; + } + case WEST -> { + yield extended ? WEST_CONNECTED_EXTENDED : WEST_SUPPORTS_TALL; + } + case EAST -> { + yield extended ? EAST_CONNECTED_EXTENDED : EAST_SUPPORTS_TALL; + } + default -> { + yield extended ? SOUTH_CONNECTED_EXTENDED : SOUTH_SUPPORTS_TALL; + } + } + } + case TALL -> { + switch (state.getValue(BanisterBlock.FACING)) { + case NORTH -> { + yield extended ? NORTH_TALL_EXTENDED : NORTH_TALL; + } + case WEST -> { + yield extended ? WEST_TALL_EXTENDED : WEST_TALL; + } + case EAST -> { + yield extended ? EAST_TALL_EXTENDED : EAST_TALL; + } + default -> { + yield extended ? SOUTH_TALL_EXTENDED : SOUTH_TALL; + } + } + } + }; + } + + @Override + public void appendHoverText(ItemStack stack, @Nullable BlockGetter getter, List tooltip, TooltipFlag flag) { + tooltip.add(Component.translatable("block.twilightforest.banister.cycle").withStyle(ChatFormatting.GRAY)); + } + + @Nullable + @Override + public BlockPathTypes getBlockPathType(BlockState state, BlockGetter getter, BlockPos pos, @Nullable Mob mob) { + return BlockPathTypes.BLOCKED; + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder blockStateBuilder) { + blockStateBuilder.add(SHAPE, EXTENDED, FACING, WATERLOGGED); + } + + @Override + public FluidState getFluidState(BlockState state) { + return state.getValue(WATERLOGGED) ? Fluids.WATER.getSource(false) : super.getFluidState(state); + } + + @Override + public InteractionResult use(BlockState state, Level level, BlockPos pos, Player player, InteractionHand hand, BlockHitResult result) { + ItemStack held = player.getItemInHand(hand); + + if (held.canPerformAction(ToolActions.AXE_WAX_OFF)) { + BlockState newState = state.cycle(SHAPE); + + // If we reach BanisterShape.TALL it means we went a full cycle, so we'll also cycle the extension + level.playSound(null, pos, SoundEvents.AXE_STRIP, SoundSource.BLOCKS, 1.0F, 1.0F); + level.setBlock(pos, newState.getValue(SHAPE) == BanisterShape.TALL ? newState.cycle(EXTENDED) : newState, 3); + + return InteractionResult.SUCCESS; + } + + return super.use(state, level, pos, player, hand, result); + } + + @Override + public int getFireSpreadSpeed(BlockState state, BlockGetter level, BlockPos pos, Direction direction) { + return 5; + } + + @Override + public int getFlammability(BlockState state, BlockGetter level, BlockPos pos, Direction direction) { + return 20; + } + + // These extend upwards to 16 instead of 12 because they're used on both the Tall and Connected shapes + private static final VoxelShape NORTH_SUPPORTS_TALL = Shapes.or( + Block.box(2.5D, 0.0D, 0.0D, 5.5D, 16.0D, 3.0D), + Block.box(10.5D, 0.0D, 0.0D, 13.5D, 16.0D, 3.0D) + ); + private static final VoxelShape EAST_SUPPORTS_TALL = Shapes.or( + Block.box(13.0D, 0.0D, 2.5D, 16.0D, 16.0D, 5.5D), + Block.box(13.0D, 0.0D, 10.5D, 16.0D, 16.0D, 13.5D) + ); + private static final VoxelShape SOUTH_SUPPORTS_TALL = Shapes.or( + Block.box(2.5D, 0.0D, 13.0D, 5.5D, 16.0D, 16.0D), + Block.box(10.5D, 0.0D, 13.0D, 13.5D, 16.0D, 16.0D) + ); + private static final VoxelShape WEST_SUPPORTS_TALL = Shapes.or( + Block.box(0.0D, 0.0D, 2.5D, 3.0D, 16.0D, 5.5D), + Block.box(0.0D, 0.0D, 10.5D, 3.0D, 16.0D, 13.5D) + ); + + private static final VoxelShape NORTH_SUPPORTS_SHORT = Shapes.or( + Block.box(2.5D, 0.0D, 0.0D, 5.5D, 4.0D, 3.0D), + Block.box(10.5D, 0.0D, 0.0D, 13.5D, 4.0D, 3.0D) + ); + private static final VoxelShape EAST_SUPPORTS_SHORT = Shapes.or( + Block.box(13.0D, 0.0D, 2.5D, 16.0D, 4.0D, 5.5D), + Block.box(13.0D, 0.0D, 10.5D, 16.0D, 4.0D, 13.5D) + ); + private static final VoxelShape SOUTH_SUPPORTS_SHORT = Shapes.or( + Block.box(2.5D, 0.0D, 13.0D, 5.5D, 4.0D, 16.0D), + Block.box(10.5D, 0.0D, 13.0D, 13.5D, 4.0D, 16.0D) + ); + private static final VoxelShape WEST_SUPPORTS_SHORT = Shapes.or( + Block.box(0.0D, 0.0D, 2.5D, 3.0D, 4.0D, 5.5D), + Block.box(0.0D, 0.0D, 10.5D, 3.0D, 4.0D, 13.5D) + ); + + private static final VoxelShape NORTH_EXTENSION = Shapes.or( + Block.box(2.5D, -8.0D, 0.0D, 5.5D, 0.0D, 3.0D), + Block.box(10.5D, -8.0D, 0.0D, 13.5D, 0.0D, 3.0D) + ); + private static final VoxelShape EAST_EXTENSION = Shapes.or( + Block.box(13.0D, -8.0D, 2.5D, 16.0D, 0.0D, 5.5D), + Block.box(13.0D, -8.0D, 10.5D, 16.0D, 0.0D, 13.5D) + ); + private static final VoxelShape SOUTH_EXTENSION = Shapes.or( + Block.box(2.5D, -8.0D, 13.0D, 5.5D, 0.0D, 16.0D), + Block.box(10.5D, -8.0D, 13.0D, 13.5D, 0.0D, 16.0D) + ); + private static final VoxelShape WEST_EXTENSION = Shapes.or( + Block.box(0.0D, -8.0D, 2.5D, 3.0D, 0.0D, 5.5D), + Block.box(0.0D, -8.0D, 10.5D, 3.0D, 0.0D, 13.5D) + ); + + private static final VoxelShape NORTH_TALL = Shapes.or(Block.box(0.0D, 12.0D, 0.0D, 16.0D, 16.0D, 4.0D), NORTH_SUPPORTS_TALL); + private static final VoxelShape EAST_TALL = Shapes.or(Block.box(12.0D, 12.0D, 0.0D, 16.0D, 16.0D, 16.0D), EAST_SUPPORTS_TALL); + private static final VoxelShape SOUTH_TALL = Shapes.or(Block.box(0.0D, 12.0D, 12.0D, 16.0D, 16.0D, 16.0D), SOUTH_SUPPORTS_TALL); + private static final VoxelShape WEST_TALL = Shapes.or(Block.box(0.0D, 12.0D, 0.0D, 4.0D, 16.0D, 16.0D), WEST_SUPPORTS_TALL); + + private static final VoxelShape NORTH_SHORT = Shapes.or(Block.box(0.0D, 4.0D, 0.0D, 16.0D, 8.0D, 4.0D), NORTH_SUPPORTS_SHORT); + private static final VoxelShape EAST_SHORT = Shapes.or(Block.box(12.0D, 4.0D, 0.0D, 16.0D, 8.0D, 16.0D), EAST_SUPPORTS_SHORT); + private static final VoxelShape SOUTH_SHORT = Shapes.or(Block.box(0.0D, 4.0D, 12.0D, 16.0D, 8.0D, 16.0D), SOUTH_SUPPORTS_SHORT); + private static final VoxelShape WEST_SHORT = Shapes.or(Block.box(0.0D, 4.0D, 0.0D, 4.0D, 8.0D, 16.0D), WEST_SUPPORTS_SHORT); + + private static final VoxelShape NORTH_TALL_EXTENDED = Shapes.or(NORTH_TALL, NORTH_EXTENSION); + private static final VoxelShape EAST_TALL_EXTENDED = Shapes.or(EAST_TALL, EAST_EXTENSION); + private static final VoxelShape SOUTH_TALL_EXTENDED = Shapes.or(SOUTH_TALL, SOUTH_EXTENSION); + private static final VoxelShape WEST_TALL_EXTENDED = Shapes.or(WEST_TALL, WEST_EXTENSION); + + private static final VoxelShape NORTH_SHORT_EXTENDED = Shapes.or(NORTH_SHORT, NORTH_EXTENSION); + private static final VoxelShape EAST_SHORT_EXTENDED = Shapes.or(EAST_SHORT, EAST_EXTENSION); + private static final VoxelShape SOUTH_SHORT_EXTENDED = Shapes.or(SOUTH_SHORT, SOUTH_EXTENSION); + private static final VoxelShape WEST_SHORT_EXTENDED = Shapes.or(WEST_SHORT, WEST_EXTENSION); + + private static final VoxelShape NORTH_CONNECTED_EXTENDED = Shapes.or(NORTH_SUPPORTS_TALL, NORTH_EXTENSION); + private static final VoxelShape EAST_CONNECTED_EXTENDED = Shapes.or(EAST_SUPPORTS_TALL, EAST_EXTENSION); + private static final VoxelShape SOUTH_CONNECTED_EXTENDED = Shapes.or(SOUTH_SUPPORTS_TALL, SOUTH_EXTENSION); + private static final VoxelShape WEST_CONNECTED_EXTENDED = Shapes.or(WEST_SUPPORTS_TALL, WEST_EXTENSION); +} diff --git a/src/main/java/twilightforest/block/BeanstalkLeavesBlock.java b/src/main/java/twilightforest/block/BeanstalkLeavesBlock.java new file mode 100644 index 0000000000..ac572bed3a --- /dev/null +++ b/src/main/java/twilightforest/block/BeanstalkLeavesBlock.java @@ -0,0 +1,15 @@ +package twilightforest.block; + +import net.minecraft.world.level.block.state.BlockState; +import twilightforest.init.TFBlocks; + +public class BeanstalkLeavesBlock extends TFAlternativeStemLeavesBlock { + public BeanstalkLeavesBlock(Properties properties) { + super(properties); + } + + @Override + protected boolean isStem(BlockState state) { + return state.is(TFBlocks.HUGE_STALK.get()); + } +} diff --git a/src/main/java/twilightforest/block/BlockTFAuroraBrick.java b/src/main/java/twilightforest/block/BlockTFAuroraBrick.java deleted file mode 100644 index 66def7d507..0000000000 --- a/src/main/java/twilightforest/block/BlockTFAuroraBrick.java +++ /dev/null @@ -1,165 +0,0 @@ -package twilightforest.block; - -import java.util.List; - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.IIcon; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; -import twilightforest.TwilightForestMod; -import twilightforest.item.TFItems; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public class BlockTFAuroraBrick extends Block { - - private static IIcon[] icons; - - - public BlockTFAuroraBrick() { - super(Material.packedIce); - - this.setCreativeTab(TFItems.creativeTab); - this.setHardness(2.0F); - this.setResistance(10.0F); - - } - - - @Override - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister par1IconRegister) - { - BlockTFAuroraBrick.icons = new IIcon[8]; - BlockTFAuroraBrick.icons[0] = par1IconRegister.registerIcon(TwilightForestMod.ID + ":aurorabrick0"); - BlockTFAuroraBrick.icons[1] = par1IconRegister.registerIcon(TwilightForestMod.ID + ":aurorabrick1"); - BlockTFAuroraBrick.icons[2] = par1IconRegister.registerIcon(TwilightForestMod.ID + ":aurorabrick2"); - BlockTFAuroraBrick.icons[3] = par1IconRegister.registerIcon(TwilightForestMod.ID + ":aurorabrick3"); - BlockTFAuroraBrick.icons[4] = par1IconRegister.registerIcon(TwilightForestMod.ID + ":aurorabrick4"); - BlockTFAuroraBrick.icons[5] = par1IconRegister.registerIcon(TwilightForestMod.ID + ":aurorabrick5"); - BlockTFAuroraBrick.icons[6] = par1IconRegister.registerIcon(TwilightForestMod.ID + ":aurorabrick6"); - BlockTFAuroraBrick.icons[7] = par1IconRegister.registerIcon(TwilightForestMod.ID + ":aurorabrick7"); - -// BlockTFAuroraBrick.icons[0] = par1IconRegister.registerIcon(TwilightForestMod.ID + ":aurorabrick0"); -// BlockTFAuroraBrick.icons[1] = par1IconRegister.registerIcon(TwilightForestMod.ID + ":aurorabrick2"); -// BlockTFAuroraBrick.icons[2] = par1IconRegister.registerIcon(TwilightForestMod.ID + ":aurorabrick4"); -// BlockTFAuroraBrick.icons[3] = par1IconRegister.registerIcon(TwilightForestMod.ID + ":aurorabrick6"); - - } - - - /** - * From the specified side and block metadata retrieves the blocks texture. Args: side, metadata - */ - @Override - public IIcon getIcon(int side, int meta) { - if (meta < 8) { - return icons[meta]; - } else { - return icons[15 - meta]; - } - -// switch (meta % 8) { -// default: -// return icons[(meta % 8) * 2]; -// case 4: -// case 5: -// case 6: -// case 7: -// return icons[(7 - (meta % 8)) * 2]; -// } - - } - - /** - * Returns a integer with hex for 0xrrggbb with this color multiplied against the blocks color. Note only called - * when first determining what to render. - */ - @Override - public int colorMultiplier(IBlockAccess par1IBlockAccess, int x, int y, int z) - { - int red = 0; - int green = 0; - int blue = 0; - - - // aurora fade - red = 16; - - blue = x * 12 + z * 6; - if ((blue & 256) != 0){ - blue = 255 - (blue & 255); - } - blue ^= 255; - blue &= 255; - - - green = x * 4 + z * 8; - if ((green & 256) != 0){ - green = 255 - (green & 255); - } - green &= 255; - - // don't let things get black - if (green + blue < 128){ - green = 128 - blue; - } - - return red << 16 | blue << 8 | green; - } - - - @SideOnly(Side.CLIENT) - public int getBlockColor() { - return this.colorMultiplier(null, 16, 0, 16); - } - - /** - * Returns the color this block should be rendered. Used by leaves. - */ - @SideOnly(Side.CLIENT) - public int getRenderColor(int meta) { - return this.getBlockColor(); - } - - /** - * returns a list of blocks with the same ID, but different meta (eg: wood returns 4 blocks) - */ - @SuppressWarnings({ "rawtypes", "unchecked" }) - @Override - @SideOnly(Side.CLIENT) - public void getSubBlocks(Item par1, CreativeTabs par2CreativeTabs, List par3List) - { - par3List.add(new ItemStack(par1, 1, 0)); - } - - /** - * Determines the damage on the item the block drops. Used in cloth and wood. - */ - @Override - public int damageDropped(int meta) { - return 0; - } - - /** - * Called when a block is placed using its ItemBlock. Args: World, X, Y, Z, side, hitX, hitY, hitZ, block metadata - */ - public int onBlockPlaced(World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ, int meta) - { - return Math.abs(x + z) % 16; - } - - /** - * Called whenever the block is added into the world. Args: world, x, y, z - */ - @Override - public void onBlockAdded(World world, int x, int y, int z) - { - world.setBlockMetadataWithNotify(x, y, z, Math.abs(x + z) % 16, 2); - } -} diff --git a/src/main/java/twilightforest/block/BlockTFAuroraPillar.java b/src/main/java/twilightforest/block/BlockTFAuroraPillar.java deleted file mode 100644 index 5295d4092b..0000000000 --- a/src/main/java/twilightforest/block/BlockTFAuroraPillar.java +++ /dev/null @@ -1,85 +0,0 @@ -package twilightforest.block; - -import java.awt.Color; - -import net.minecraft.block.BlockRotatedPillar; -import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.util.IIcon; -import net.minecraft.world.IBlockAccess; -import twilightforest.TwilightForestMod; -import twilightforest.item.TFItems; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public class BlockTFAuroraPillar extends BlockRotatedPillar { - - private IIcon sideIcon; - private IIcon topIcon; - - protected BlockTFAuroraPillar() { - super(Material.packedIce); - this.setCreativeTab(TFItems.creativeTab); - this.setHardness(2.0F); - this.setResistance(10.0F); - } - - - /** - * Returns a integer with hex for 0xrrggbb with this color multiplied against the blocks color. Note only called - * when first determining what to render. - */ - @Override - public int colorMultiplier(IBlockAccess world, int x, int y, int z) { - int red = 0; - int green = 0; - int blue = 0; - - int normalColor = TFBlocks.auroraBlock.colorMultiplier(world, x, y, z); - - red = (normalColor >> 16) & 255; - blue = normalColor & 255; - green = (normalColor >> 8) & 255; - - float[] hsb = Color.RGBtoHSB(red, blue, green, null); - - return Color.HSBtoRGB(hsb[0], hsb[1] * 0.5F, Math.min(hsb[2] + 0.4F, 0.9F)); - } - - @SideOnly(Side.CLIENT) - public int getBlockColor() { - return this.colorMultiplier(null, 16, 0, 16); - } - - /** - * Returns the color this block should be rendered. Used by leaves. - */ - @SideOnly(Side.CLIENT) - public int getRenderColor(int meta) { - return this.getBlockColor(); - } - - - @SideOnly(Side.CLIENT) - @Override - protected IIcon getSideIcon(int meta) - { - return this.sideIcon; - } - - @SideOnly(Side.CLIENT) - @Override - protected IIcon getTopIcon(int p_150161_1_) - { - return this.topIcon; - } - - @Override - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister par1IconRegister) - { - this.sideIcon = par1IconRegister.registerIcon(TwilightForestMod.ID + ":aurora_pillar_side"); - this.topIcon = par1IconRegister.registerIcon(TwilightForestMod.ID + ":aurora_pillar_top"); - } - -} diff --git a/src/main/java/twilightforest/block/BlockTFAuroraSlab.java b/src/main/java/twilightforest/block/BlockTFAuroraSlab.java deleted file mode 100644 index c37daa24f3..0000000000 --- a/src/main/java/twilightforest/block/BlockTFAuroraSlab.java +++ /dev/null @@ -1,127 +0,0 @@ -package twilightforest.block; - -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockSlab; -import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.Facing; -import net.minecraft.util.IIcon; -import net.minecraft.world.IBlockAccess; -import twilightforest.TwilightForestMod; -import twilightforest.item.TFItems; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - - -public class BlockTFAuroraSlab extends BlockSlab { - - private IIcon sideIcon; - - public BlockTFAuroraSlab(boolean isDouble) { - super(isDouble, Material.packedIce); - this.setCreativeTab(TFItems.creativeTab); - this.setHardness(2.0F); - this.setResistance(10.0F); - - this.setLightOpacity(isDouble ? 255 : 0); - - } - - /** - * Returns a integer with hex for 0xrrggbb with this color multiplied against the blocks color. Note only called - * when first determining what to render. - */ - @Override - public int colorMultiplier(IBlockAccess par1IBlockAccess, int x, int y, int z) { - return TFBlocks.auroraPillar.colorMultiplier(par1IBlockAccess, -x, y, -z); - } - - - @SideOnly(Side.CLIENT) - public int getBlockColor() { - return this.colorMultiplier(null, 0, 0, 16); - } - - /** - * Returns the color this block should be rendered. Used by leaves. - */ - @SideOnly(Side.CLIENT) - public int getRenderColor(int meta) { - return this.getBlockColor(); - } - - @Override - public String func_150002_b(int var1) { - return super.getUnlocalizedName(); - } - - - /** - * Gets the block's texture. Args: side, meta - */ - @SideOnly(Side.CLIENT) - public IIcon getIcon(int side, int meta){ - if (side == 0 || side == 1) { - return this.blockIcon; - } else { - return this.sideIcon; - } - } - - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister iconRegister) - { - this.blockIcon = TFBlocks.auroraPillar.getIcon(0, 0); - this.sideIcon = iconRegister.registerIcon(TwilightForestMod.ID + ":aurora_slab_side"); - } - - public Item getItemDropped(int p_149650_1_, Random p_149650_2_, int p_149650_3_) - { - return Item.getItemFromBlock(TFBlocks.auroraSlab); - } - - /** - * Returns an item stack containing a single instance of the current block type. 'i' is the block's subtype/damage - * and is ignored for blocks which do not support subtypes. Blocks which cannot be harvested should return null. - */ - protected ItemStack createStackedBlock(int meta) - { - return new ItemStack(Item.getItemFromBlock(TFBlocks.auroraSlab), 2, 0); - } - - - /** - * Returns true if the given side of this block type should be rendered, if the adjacent block is at the given - * coordinates. Args: blockAccess, x, y, z, side - */ - @SideOnly(Side.CLIENT) - public boolean shouldSideBeRendered(IBlockAccess world, int x, int y, int z, int side) - { - if (this.field_150004_a) - { - return super.shouldSideBeRendered(world, x, y, z, side); - } - else if (side != 1 && side != 0 && !super.shouldSideBeRendered(world, x, y, z, side)) - { - return false; - } - else - { - int i1 = x + Facing.offsetsXForSide[Facing.oppositeSide[side]]; - int j1 = y + Facing.offsetsYForSide[Facing.oppositeSide[side]]; - int k1 = z + Facing.offsetsZForSide[Facing.oppositeSide[side]]; - boolean flag = (world.getBlockMetadata(i1, j1, k1) & 8) != 0; - return flag ? (side == 0 ? true : (side == 1 && super.shouldSideBeRendered(world, x, y, z, side) ? true : !isSingleSlab(world.getBlock(x, y, z)) || (world.getBlockMetadata(x, y, z) & 8) == 0)) : (side == 1 ? true : (side == 0 && super.shouldSideBeRendered(world, x, y, z, side) ? true : !isSingleSlab(world.getBlock(x, y, z)) || (world.getBlockMetadata(x, y, z) & 8) != 0)); - } - } - - @SideOnly(Side.CLIENT) - private static boolean isSingleSlab(Block p_150003_0_) - { - return p_150003_0_ == TFBlocks.auroraSlab; - } -} diff --git a/src/main/java/twilightforest/block/BlockTFBossSpawner.java b/src/main/java/twilightforest/block/BlockTFBossSpawner.java deleted file mode 100644 index 182fc4666c..0000000000 --- a/src/main/java/twilightforest/block/BlockTFBossSpawner.java +++ /dev/null @@ -1,148 +0,0 @@ -package twilightforest.block; - -import java.util.List; -import java.util.Random; - -import net.minecraft.block.BlockContainer; -import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.init.Blocks; -import net.minecraft.item.Item; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.IIcon; -import net.minecraft.world.World; -import twilightforest.item.TFItems; -import twilightforest.tileentity.TileEntityTFHydraSpawner; -import twilightforest.tileentity.TileEntityTFKnightPhantomsSpawner; -import twilightforest.tileentity.TileEntityTFLichSpawner; -import twilightforest.tileentity.TileEntityTFNagaSpawner; -import twilightforest.tileentity.TileEntityTFSnowQueenSpawner; -import twilightforest.tileentity.TileEntityTFTowerBossSpawner; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - - - -public class BlockTFBossSpawner extends BlockContainer { - - protected BlockTFBossSpawner() - { - super(Material.rock); - this.setHardness(20F); - //this.setResistance(10F); - this.setCreativeTab(TFItems.creativeTab); - } - - - /** - * Called throughout the code as a replacement for block instanceof BlockContainer - * Moving this to the Block base class allows for mods that wish to extend vinella - * blocks, and also want to have a tile entity on that block, may. - * - * Return true from this function to specify this block has a tile entity. - * - * @param metadata Metadata of the current block - * @return True if block has a tile entity, false otherwise - */ - @Override - public boolean hasTileEntity(int metadata) - { - return true; - } - - - /** - * This is where we actually give out our tile entity - */ - @Override - public TileEntity createTileEntity(World world, int metadata) - { - if (metadata == 0) - { - return new TileEntityTFNagaSpawner(); - } - else if (metadata == 1) - { - return new TileEntityTFLichSpawner(); - } - else if (metadata == 2) - { - return new TileEntityTFHydraSpawner(); - } - else if (metadata == 3) - { - return new TileEntityTFTowerBossSpawner(); - } - else if (metadata == 4) - { - return new TileEntityTFKnightPhantomsSpawner(); - } - else if (metadata == 5) - { - return new TileEntityTFSnowQueenSpawner(); - } - else - { - return null; - } - } - - @Override - public TileEntity createNewTileEntity(World var1, int var2) { - return createTileEntity(var1, var2); - } - - - @Override - public Item getItemDropped(int par1, Random par2Random, int par3) - { - return null; - } - - /** - * quantity dropped - */ - @Override - public int quantityDropped(Random random) - { - return 0; - } - - @Override - public boolean isOpaqueCube() - { - return false; - } - - - /** - * returns a list of blocks with the same ID, but different meta (eg: wood returns 4 blocks) - */ - @Override - public void getSubBlocks(Item par1, CreativeTabs par2CreativeTabs, List par3List) - { - //par3List.add(new ItemStack(par1, 1, 0)); - //par3List.add(new ItemStack(par1, 1, 1)); - //par3List.add(new ItemStack(par1, 1, 2)); - //par3List.add(new ItemStack(par1, 1, 3)); - //par3List.add(new ItemStack(par1, 1, 4)); - } - - - /** - * From the specified side and block metadata retrieves the blocks texture. Args: side, metadata - */ - @Override - public IIcon getIcon(int side, int metadata) - { - return Blocks.mob_spawner.getIcon(side, metadata); - } - - @Override - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister par1IconRegister) - { - ; // don't load anything - } -} diff --git a/src/main/java/twilightforest/block/BlockTFBurntThorns.java b/src/main/java/twilightforest/block/BlockTFBurntThorns.java deleted file mode 100644 index a27ea918bf..0000000000 --- a/src/main/java/twilightforest/block/BlockTFBurntThorns.java +++ /dev/null @@ -1,59 +0,0 @@ -package twilightforest.block; - -import net.minecraft.block.Block; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; -import twilightforest.item.TFItems; - -public class BlockTFBurntThorns extends BlockTFThorns { - - protected BlockTFBurntThorns() { - super(); - this.setHardness(0.01F); - this.setResistance(0.0F); - this.setStepSound(soundTypeSand); - this.setCreativeTab(TFItems.creativeTab); - - this.setNames(new String[] {"burnt"}); - - } - - - /** - * Triggered whenever an entity collides with this block (enters into the block). Args: world, x, y, z, entity - */ - public void onEntityCollidedWithBlock(World world, int x, int y, int z, Entity entity) - { - // dissolve - if (!world.isRemote && entity instanceof EntityLivingBase) { - int metadata = world.getBlockMetadata(x, y, z); - world.playAuxSFX(2001, x, y, z, Block.getIdFromBlock(this) + (metadata << 12)); - world.setBlockToAir(x, y, z); - } - } - - /** - * Break normally - */ - public boolean removedByPlayer(World world, EntityPlayer player, int x, int y, int z) { - world.setBlockToAir(x, y, z); - return true; - } - - @Override - public boolean canSustainLeaves(IBlockAccess world, int x, int y, int z) - { - return false; - } - - /** - * no need for leaf decay, I think - */ - public void breakBlock(World world, int x, int y, int z, Block logBlock, int metadata) - { - ; - } -} diff --git a/src/main/java/twilightforest/block/BlockTFCastleBlock.java b/src/main/java/twilightforest/block/BlockTFCastleBlock.java deleted file mode 100644 index 04c694960b..0000000000 --- a/src/main/java/twilightforest/block/BlockTFCastleBlock.java +++ /dev/null @@ -1,117 +0,0 @@ -package twilightforest.block; - -import java.util.List; - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.item.ItemTool; -import net.minecraft.util.IIcon; -import net.minecraft.world.World; -import twilightforest.TwilightForestMod; -import twilightforest.item.ItemTFMazebreakerPick; -import twilightforest.item.TFItems; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - - - -/** - * - * Castle block makes a castle - * - * @author Ben - * - */ -public class BlockTFCastleBlock extends Block { - - private static IIcon brickIcon; - private static IIcon crackIcon; - private static IIcon fadedIcon; - private static IIcon roofIcon; - - /** - * Note that the texture called for here will only be used when the meta value is not a good block to mimic - * - * @param id - * @param texture - */ - public BlockTFCastleBlock() - { - super(Material.rock); - this.setHardness(100F); - this.setResistance(15F); - this.setStepSound(Block.soundTypeStone); - this.setCreativeTab(TFItems.creativeTab); - - } - - /** - * From the specified side and block metadata retrieves the blocks texture. Args: side, metadata - */ - @Override - public IIcon getIcon(int side, int meta) { - switch (meta) - { - case 0: - default: - return brickIcon; - case 1: - return fadedIcon; - case 2: - return crackIcon; - case 3: - return roofIcon; - } - } - - @Override - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister par1IconRegister) - { - BlockTFCastleBlock.brickIcon = par1IconRegister.registerIcon(TwilightForestMod.ID + ":castleblock_brick"); - BlockTFCastleBlock.fadedIcon = par1IconRegister.registerIcon(TwilightForestMod.ID + ":castleblock_faded"); - BlockTFCastleBlock.crackIcon = par1IconRegister.registerIcon(TwilightForestMod.ID + ":castleblock_cracked"); - BlockTFCastleBlock.roofIcon = par1IconRegister.registerIcon(TwilightForestMod.ID + ":castleblock_roof"); - } - - @Override - public void harvestBlock(World world, EntityPlayer entityplayer, int x, int y, int z, int meta) - { - // damage the player's pickaxe - ItemStack cei = entityplayer.getCurrentEquippedItem(); - if(cei != null && cei.getItem() instanceof ItemTool && !(cei.getItem() instanceof ItemTFMazebreakerPick)) - { - cei.damageItem(16, entityplayer); - } - - super.harvestBlock(world, entityplayer, x, y, z, meta); - } - - - /** - * returns a list of blocks with the same ID, but different meta (eg: wood returns 4 blocks) - */ - @SuppressWarnings({ "rawtypes", "unchecked" }) - @Override - public void getSubBlocks(Item par1, CreativeTabs par2CreativeTabs, List par3List) - { - par3List.add(new ItemStack(par1, 1, 0)); - par3List.add(new ItemStack(par1, 1, 1)); - par3List.add(new ItemStack(par1, 1, 2)); - par3List.add(new ItemStack(par1, 1, 3)); - } - - /** - * Determines the damage on the item the block drops. Used in cloth and wood. - */ - @Override - public int damageDropped(int meta) { - return meta; - } - -} diff --git a/src/main/java/twilightforest/block/BlockTFCastleDoor.java b/src/main/java/twilightforest/block/BlockTFCastleDoor.java deleted file mode 100644 index c44c444e13..0000000000 --- a/src/main/java/twilightforest/block/BlockTFCastleDoor.java +++ /dev/null @@ -1,367 +0,0 @@ -package twilightforest.block; - -import cpw.mods.fml.common.network.NetworkRegistry; -import cpw.mods.fml.common.network.internal.FMLProxyPacket; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -import java.util.List; -import java.util.Random; - -import twilightforest.TFGenericPacketHandler; -import twilightforest.TwilightForestMod; -import twilightforest.item.TFItems; -import twilightforest.world.ChunkProviderTwilightForest; -import twilightforest.world.WorldProviderTwilightForest; -import net.minecraft.block.Block; -import net.minecraft.block.BlockPane; -import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.entity.Entity; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.IIcon; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; -import static net.minecraftforge.common.util.ForgeDirection.*; - -public class BlockTFCastleDoor extends Block -{ - - private IIcon activeIcon; - private boolean isVanished; - - public BlockTFCastleDoor(boolean isVanished) - { - super(isVanished ? Material.glass : Material.rock); - - this.isVanished = isVanished; - this.lightOpacity = isVanished ? 0 : 255; - - this.setCreativeTab(TFItems.creativeTab); - } - - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister register) - { - //TODO: this is the opposite of object oriented. - - if (this.isVanished) { - this.blockIcon = register.registerIcon(TwilightForestMod.ID + ":castle_door_vanished"); - this.activeIcon = register.registerIcon(TwilightForestMod.ID + ":castle_door_vanished_active"); - } else { - this.blockIcon = register.registerIcon(TwilightForestMod.ID + ":castle_door"); - this.activeIcon = register.registerIcon(TwilightForestMod.ID + ":castle_door_active"); - } - } - - - @SideOnly(Side.CLIENT) - public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side) { - int meta = world.getBlockMetadata(x, y, z); - - if (isMetaActive(meta)) { - return this.activeIcon; - } else { - return this.blockIcon; - } - } - - - /** - * Is this block (a) opaque and (b) a full 1m cube? This determines whether or not to render the shared face of two - * adjacent blocks and also whether the player can attach torches, redstone wire, etc to this block. - */ - @Override - public boolean isOpaqueCube() - { - return !this.isVanished; - } - - /** - * Returns a bounding box from the pool of bounding boxes (this means this box can change after the pool has been - * cleared to be reused) - */ - @Override - public AxisAlignedBB getCollisionBoundingBoxFromPool(World par1World, int x, int y, int z) - { - if (this.isVanished) - { - return null; - } - else - { - this.setBlockBoundsBasedOnState(par1World, x, y, z); - return super.getCollisionBoundingBoxFromPool(par1World, x, y, z); - } - } - - @Override - public boolean getBlocksMovement(IBlockAccess par1IBlockAccess, int par2, int par3, int par4) - { - return !this.isVanished; - } - - - /** - * Called upon block activation (right click on the block.) - */ - @Override - public boolean onBlockActivated(World par1World, int x, int y, int z, EntityPlayer par5EntityPlayer, int par6, float par7, float par8, float par9) - { - int meta = par1World.getBlockMetadata(x, y, z); - - if (!isMetaActive(meta)) - { - if (isBlockLocked(par1World, x, y, z)) - { - par1World.playSoundEffect(x + 0.5D, y + 0.5D, z + 0.5D, "random.click", 1.0F, 0.3F); - } - else - { - changeToActiveBlock(par1World, x, y, z, meta); - } - return true; - } - else - { - return false; - } - } - - - /** - * Change this block to be active - */ - public static void changeToActiveBlock(World par1World, int x, int y, int z, int meta) - { - changeToBlockMeta(par1World, x, y, z, meta | 8); - playVanishSound(par1World, x, y, z); - - Block blockAt = par1World.getBlock(x, y, z); - par1World.scheduleBlockUpdate(x, y, z, blockAt, 2 + par1World.rand.nextInt(5)); - } - - - /** - * Change this block into an different device block - */ - private static void changeToBlockMeta(World par1World, int x, int y, int z, int meta) - { - Block blockAt = par1World.getBlock(x, y, z); - - if (blockAt == TFBlocks.castleDoor || blockAt == TFBlocks.castleDoorVanished) - { - par1World.setBlock(x, y, z, blockAt, meta, 3); - par1World.markBlockRangeForRenderUpdate(x, y, z, x, y, z); - par1World.notifyBlocksOfNeighborChange(x, y, z, blockAt); - } - } - - - public static boolean isBlockLocked(World par1World, int x, int y, int z) { - // check if we are in a structure, and if that structure says that we are locked - - int meta = par1World.getBlockMetadata(x, y, z); - - if (!par1World.isRemote && par1World.provider instanceof WorldProviderTwilightForest) { - ChunkProviderTwilightForest chunkProvider = ((WorldProviderTwilightForest)par1World.provider).getChunkProvider(); - - return chunkProvider.isStructureLocked(x, y, z, meta); - } else { - return false; - } - } - - public static boolean isMetaActive(int meta) { - return (meta & 8) != 0; - } - - - /** - * How many world ticks before ticking - */ - public int tickRate() - { - return 5; - } - - - /** - * The type of render function that is called for this block - */ - @Override - public int getRenderType() - { - return TwilightForestMod.proxy.getCastleMagicBlockRenderID(); - } - - /** - * Ticks the block if it's been scheduled - */ - @Override - public void updateTick(World par1World, int x, int y, int z, Random par5Random) - { - if (!par1World.isRemote) - { - //System.out.println("Update castle door"); - - int meta = par1World.getBlockMetadata(x, y, z); - - if (this.isVanished) { - if (isMetaActive(meta)) { - par1World.setBlock(x, y, z, TFBlocks.castleDoor, meta & 7, 3); - par1World.notifyBlocksOfNeighborChange(x, y, z, this); - playVanishSound(par1World, x, y, z); - - //par1World.markBlockRangeForRenderUpdate(x, y, z, x, y, z); - } else { - changeToActiveBlock(par1World, x, y, z, meta); - } - } else { - - // if we have an active castle door, turn it into a vanished door block - if (isMetaActive(meta)) - { - par1World.setBlock(x, y, z, getOtherBlock(this), meta & 7, 3); - par1World.scheduleBlockUpdate(x, y, z, getOtherBlock(this), 80); - - par1World.notifyBlocksOfNeighborChange(x, y, z, this); - playReappearSound(par1World, x, y, z); - par1World.markBlockRangeForRenderUpdate(x, y, z, x, y, z); - - this.sendAnnihilateBlockPacket(par1World, x, y, z); - - - // activate all adjacent inactive doors - checkAndActivateCastleDoor(par1World, x - 1, y, z); - checkAndActivateCastleDoor(par1World, x + 1, y, z); - checkAndActivateCastleDoor(par1World, x, y + 1, z); - checkAndActivateCastleDoor(par1World, x, y - 1, z); - checkAndActivateCastleDoor(par1World, x, y, z + 1); - checkAndActivateCastleDoor(par1World, x, y, z - 1); - - } - - // inactive solid door blocks we don't care about updates - } - - } - } - - private void sendAnnihilateBlockPacket(World world, int x, int y, int z) { - // send packet - FMLProxyPacket message = TFGenericPacketHandler.makeAnnihilateBlockPacket(x, y, z); - - NetworkRegistry.TargetPoint targetPoint = new NetworkRegistry.TargetPoint(world.provider.dimensionId, x, y, z, 64); - - TwilightForestMod.genericChannel.sendToAllAround(message, targetPoint); - } - - private static void playVanishSound(World par1World, int x, int y, int z) { - par1World.playSoundEffect(x + 0.5D, y + 0.5D, z + 0.5D, "random.fizz", 0.125f, par1World.rand.nextFloat() * 0.25F + 1.75F); -// par1World.playSoundEffect(x + 0.5D, y + 0.5D, z + 0.5D, "note.harp", 0.2F, par1World.rand.nextFloat() * 2F); - } - - private static void playReappearSound(World par1World, int x, int y, int z) { - par1World.playSoundEffect(x + 0.5D, y + 0.5D, z + 0.5D, "random.fizz", 0.125f, par1World.rand.nextFloat() * 0.25F + 1.25F); -// par1World.playSoundEffect(x + 0.5D, y + 0.5D, z + 0.5D, "note.harp", 0.2F, par1World.rand.nextFloat() * 2F); - } - - private static Block getOtherBlock(Block block) { - return block == TFBlocks.castleDoor ? TFBlocks.castleDoorVanished : TFBlocks.castleDoor; - } - - /** - * If the targeted block is a vanishing block, activate it - */ - public static void checkAndActivateCastleDoor(World world, int x, int y, int z) { - Block block = world.getBlock(x, y, z); - int meta = world.getBlockMetadata(x, y, z); - - if (block == TFBlocks.castleDoor && !isMetaActive(meta) && !isBlockLocked(world, x, y, z)) - { - changeToActiveBlock(world, x, y, z, meta); - } -// if (block == TFBlocks.castleDoorVanished && !isMetaActive(meta) && !isBlockLocked(world, x, y, z)) -// { -// changeToActiveBlock(world, x, y, z, meta); -// } - } - - - @Override - @SideOnly(Side.CLIENT) - - /** - * A randomly called display update to be able to add particles or other items for display - */ - public void randomDisplayTick(World par1World, int x, int y, int z, Random par5Random) - { - int meta = par1World.getBlockMetadata(x, y, z); - - if (isMetaActive(meta)); - { - for (int i = 0; i < 1; ++i) { - //this.sparkle(par1World, x, y, z, par5Random); - } - } - } - - - /** - * Shine bright like a DIAMOND! (or actually, sparkle like redstone ore) - */ - public void sparkle(World world, int x, int y, int z, Random rand) - { - double offset = 0.0625D; - - for (int side = 0; side < 6; ++side) - { - double rx = x + rand.nextFloat(); - double ry = y + rand.nextFloat(); - double rz = z + rand.nextFloat(); - - if (side == 0 && !world.getBlock(x, y + 1, z).isOpaqueCube()) - { - ry = y + 1 + offset; - } - - if (side == 1 && !world.getBlock(x, y - 1, z).isOpaqueCube()) - { - ry = y + 0 - offset; - } - - if (side == 2 && !world.getBlock(x, y, z + 1).isOpaqueCube()) - { - rz = z + 1 + offset; - } - - if (side == 3 && !world.getBlock(x, y, z - 1).isOpaqueCube()) - { - rz = z + 0 - offset; - } - - if (side == 4 && !world.getBlock(x + 1, y, z).isOpaqueCube()) - { - rx = x + 1 + offset; - } - - if (side == 5 && !world.getBlock(x - 1, y, z).isOpaqueCube()) - { - rx = x + 0 - offset; - } - - if (rx < x || rx > x + 1 || ry < 0.0D || ry > y + 1 || rz < z || rz > z + 1) - { - world.spawnParticle("reddust", rx, ry, rz, 0.0D, 0.0D, 0.0D); - } - } - } - -} \ No newline at end of file diff --git a/src/main/java/twilightforest/block/BlockTFCastleMagic.java b/src/main/java/twilightforest/block/BlockTFCastleMagic.java deleted file mode 100644 index 27d086b9de..0000000000 --- a/src/main/java/twilightforest/block/BlockTFCastleMagic.java +++ /dev/null @@ -1,106 +0,0 @@ -package twilightforest.block; - -import java.util.List; - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.item.ItemTool; -import net.minecraft.util.IIcon; -import net.minecraft.world.World; -import twilightforest.TwilightForestMod; -import twilightforest.item.ItemTFMazebreakerPick; -import twilightforest.item.TFItems; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - - - -/** - * - * Castle block makes a castle - * - * @author Ben - * - */ -public class BlockTFCastleMagic extends Block { - - public static IIcon[] magicIcons = new IIcon[8]; - public static int[] magicColors = new int[] { 0x00FFFF, 0xFFFF00, 0xFF00FF, 0x4B0082 }; - - public BlockTFCastleMagic() - { - super(Material.rock); - this.setHardness(100F); - this.setResistance(15F); - this.setStepSound(Block.soundTypeStone); - this.setCreativeTab(TFItems.creativeTab); - - } - - - @Override - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister par1IconRegister) - { - this.blockIcon = par1IconRegister.registerIcon(TwilightForestMod.ID + ":castleblock_brick"); - for (int i = 0; i < 8; i++) { - this.magicIcons[i] = par1IconRegister.registerIcon(TwilightForestMod.ID + ":castleblock_magic_" + i); - } - } - - public static IIcon getMagicIconFor(int x, int y, int z) { - - long seed = x * 3129871 ^ y * 116129781L ^ z; - seed = seed * seed * 42317861L + seed * 11L; - - int index = (int) (seed >> 12 & 7L); - - return magicIcons[index]; - } - - public static int getMagicColorFor(int meta) { - int color = magicColors[meta & 3]; - - if ((meta & 8) != 0) { - color = 0xFFFFFF ^ color; - } - - return color; - } - - /** - * The type of render function that is called for this block - */ - @Override - public int getRenderType() - { - return TwilightForestMod.proxy.getCastleMagicBlockRenderID(); - } - - /** - * returns a list of blocks with the same ID, but different meta (eg: wood returns 4 blocks) - */ - @SuppressWarnings({ "rawtypes", "unchecked" }) - @Override - public void getSubBlocks(Item par1, CreativeTabs par2CreativeTabs, List par3List) - { - par3List.add(new ItemStack(par1, 1, 0)); - par3List.add(new ItemStack(par1, 1, 1)); - par3List.add(new ItemStack(par1, 1, 2)); - par3List.add(new ItemStack(par1, 1, 3)); - } - - /** - * Determines the damage on the item the block drops. Used in cloth and wood. - */ - @Override - public int damageDropped(int meta) { - return meta; - } - -} diff --git a/src/main/java/twilightforest/block/BlockTFCastleUnlock.java b/src/main/java/twilightforest/block/BlockTFCastleUnlock.java deleted file mode 100644 index 1f602da2f5..0000000000 --- a/src/main/java/twilightforest/block/BlockTFCastleUnlock.java +++ /dev/null @@ -1,14 +0,0 @@ -package twilightforest.block; - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; - - -public class BlockTFCastleUnlock extends Block { - - protected BlockTFCastleUnlock() { - super(Material.rock); - // TODO Auto-generated constructor stub - } - -} diff --git a/src/main/java/twilightforest/block/BlockTFCicada.java b/src/main/java/twilightforest/block/BlockTFCicada.java deleted file mode 100644 index 6a2b73615c..0000000000 --- a/src/main/java/twilightforest/block/BlockTFCicada.java +++ /dev/null @@ -1,20 +0,0 @@ -package twilightforest.block; - -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.World; -import twilightforest.tileentity.TileEntityTFCicada; - -public class BlockTFCicada extends BlockTFCritter { - - public static int sprCicada = 5; - - - protected BlockTFCicada() { - super(); - } - - @Override - public TileEntity createTileEntity(World world, int metadata) { - return new TileEntityTFCicada(); - } -} diff --git a/src/main/java/twilightforest/block/BlockTFCinderFurnace.java b/src/main/java/twilightforest/block/BlockTFCinderFurnace.java deleted file mode 100644 index b0fcc2620b..0000000000 --- a/src/main/java/twilightforest/block/BlockTFCinderFurnace.java +++ /dev/null @@ -1,242 +0,0 @@ -package twilightforest.block; - -import java.util.Random; - -import twilightforest.TwilightForestMod; -import twilightforest.item.TFItems; -import twilightforest.tileentity.TileEntityTFCinderFurnace; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import net.minecraft.block.Block; -import net.minecraft.block.BlockContainer; -import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.item.EntityItem; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.tileentity.TileEntityFurnace; -import net.minecraft.util.IIcon; -import net.minecraft.util.MathHelper; -import net.minecraft.world.World; - -public class BlockTFCinderFurnace extends BlockContainer{ - - private static boolean isUpdating; - private Boolean isLit; - private IIcon topIcon; - private Random furnaceRandom = new Random(); - - protected BlockTFCinderFurnace(Boolean isLit) { - super(Material.wood); - - this.isLit = isLit; - - this.setHardness(7.0F); - - this.setLightLevel(isLit ? 1F : 0); - - if (!isLit) { - this.setCreativeTab(TFItems.creativeTab); - } - - } - - @Override - public TileEntity createNewTileEntity(World p_149915_1_, int p_149915_2_) { - return new TileEntityTFCinderFurnace(); - } - - - /** - * Gets the block's texture. Args: side, meta - */ - @SideOnly(Side.CLIENT) - public IIcon getIcon(int side, int meta) - { - return side == 1 ? this.topIcon : (side == 0 ? this.topIcon : this.blockIcon); - } - - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister p_149651_1_) - { - this.blockIcon = p_149651_1_.registerIcon(this.isLit ? "furnace_front_on" : "furnace_front_off"); - this.topIcon = p_149651_1_.registerIcon("furnace_top"); - } - - - /** - * Called upon block activation (right click on the block.) - */ - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int p_149727_6_, float p_149727_7_, float p_149727_8_, float p_149727_9_) - { - if (world.isRemote) - { - return true; - } - else - { - TileEntityTFCinderFurnace tileentityfurnace = (TileEntityTFCinderFurnace)world.getTileEntity(x, y, z); - - if (tileentityfurnace != null) - { - player.openGui(TwilightForestMod.instance, TwilightForestMod.GUI_ID_FURNACE, world, x, y, z); - return true; - } - - return true; - } - } - - /** - * Called when the block is placed in the world. - */ - public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase p_149689_5_, ItemStack itemStack) - { - - if (itemStack.hasDisplayName()) - { - ((TileEntityFurnace)world.getTileEntity(x, y, z)).func_145951_a(itemStack.getDisplayName()); - } - } - - - /** - * Update which block the furnace is using depending on whether or not it is burning - */ - public static void updateFurnaceBlockState(boolean isBurning, World world, int x, int y, int z) - { - TileEntity tileentity = world.getTileEntity(x, y, z); - isUpdating = true; - - if (isBurning) - { - world.setBlock(x, y, z, TFBlocks.cinderFurnaceLit); - } - else - { - world.setBlock(x, y, z, TFBlocks.cinderFurnace); - } - - isUpdating = false; - - if (tileentity != null) - { - tileentity.validate(); - world.setTileEntity(x, y, z, tileentity); - } - } - - /** - * A randomly called display update to be able to add particles or other items for display - */ - @SideOnly(Side.CLIENT) - public void randomDisplayTick(World world, int x, int y, int z, Random random) - { - - if (this.isLit) - { - float f = (float)x + 0.5F; - float f1 = (float)y + 0.0F + random.nextFloat() * 6.0F / 16.0F; - float f2 = (float)z + 0.5F; - float f3 = 0.52F; - float f4 = random.nextFloat() * 0.6F - 0.3F; - - int l = random.nextInt(4) + 2; - - if (l == 4) - { - world.spawnParticle("smoke", (double)(f - f3), (double)f1, (double)(f2 + f4), 0.0D, 0.0D, 0.0D); - world.spawnParticle("flame", (double)(f - f3), (double)f1, (double)(f2 + f4), 0.0D, 0.0D, 0.0D); - } - else if (l == 5) - { - world.spawnParticle("smoke", (double)(f + f3), (double)f1, (double)(f2 + f4), 0.0D, 0.0D, 0.0D); - world.spawnParticle("flame", (double)(f + f3), (double)f1, (double)(f2 + f4), 0.0D, 0.0D, 0.0D); - } - else if (l == 2) - { - world.spawnParticle("smoke", (double)(f + f4), (double)f1, (double)(f2 - f3), 0.0D, 0.0D, 0.0D); - world.spawnParticle("flame", (double)(f + f4), (double)f1, (double)(f2 - f3), 0.0D, 0.0D, 0.0D); - } - else if (l == 3) - { - world.spawnParticle("smoke", (double)(f + f4), (double)f1, (double)(f2 + f3), 0.0D, 0.0D, 0.0D); - world.spawnParticle("flame", (double)(f + f4), (double)f1, (double)(f2 + f3), 0.0D, 0.0D, 0.0D); - } - } - } - - - /** - * Dump things all over if broken - */ - public void breakBlock(World world, int x, int y, int z, Block block, int p_149749_6_) - { - if (!isUpdating) - { - TileEntityTFCinderFurnace tileEntity = (TileEntityTFCinderFurnace)world.getTileEntity(x, y, z); - - if (tileEntity != null) - { - for (int i = 0; i < tileEntity.getSizeInventory(); ++i) - { - ItemStack itemstack = tileEntity.getStackInSlot(i); - - if (itemstack != null) - { - float dx = this.furnaceRandom.nextFloat() * 0.8F + 0.1F; - float dy = this.furnaceRandom.nextFloat() * 0.8F + 0.1F; - float dz = this.furnaceRandom.nextFloat() * 0.8F + 0.1F; - - while (itemstack.stackSize > 0) - { - int j1 = this.furnaceRandom.nextInt(21) + 10; - - if (j1 > itemstack.stackSize) - { - j1 = itemstack.stackSize; - } - - itemstack.stackSize -= j1; - EntityItem entityitem = new EntityItem(world, (double)((float)x + dx), (double)((float)y + dy), (double)((float)z + dz), new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); - - if (itemstack.hasTagCompound()) - { - entityitem.getEntityItem().setTagCompound((NBTTagCompound)itemstack.getTagCompound().copy()); - } - - float pointFive = 0.05F; - entityitem.motionX = (double)((float)this.furnaceRandom.nextGaussian() * pointFive); - entityitem.motionY = (double)((float)this.furnaceRandom.nextGaussian() * pointFive + 0.2F); - entityitem.motionZ = (double)((float)this.furnaceRandom.nextGaussian() * pointFive); - world.spawnEntityInWorld(entityitem); - } - } - } - - world.func_147453_f(x, y, z, block); - } - } - - super.breakBlock(world, x, y, z, block, p_149749_6_); - } - - public Item getItemDropped(int meta, Random rand, int fortune) - { - return Item.getItemFromBlock(TFBlocks.cinderFurnace); - } - - /** - * Gets an item for the block being called on. Args: world, x, y, z - */ - @SideOnly(Side.CLIENT) - public Item getItem(World world, int x, int y, int z) - { - return Item.getItemFromBlock(TFBlocks.cinderFurnace); - } -} diff --git a/src/main/java/twilightforest/block/BlockTFCinderLog.java b/src/main/java/twilightforest/block/BlockTFCinderLog.java deleted file mode 100644 index 37b8ec7a3d..0000000000 --- a/src/main/java/twilightforest/block/BlockTFCinderLog.java +++ /dev/null @@ -1,64 +0,0 @@ -package twilightforest.block; - -import java.util.List; -import java.util.Random; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import net.minecraft.block.Block; -import net.minecraft.block.BlockLog; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.IIcon; -import twilightforest.TwilightForestMod; -import twilightforest.item.TFItems; - -public class BlockTFCinderLog extends BlockLog { - - private IIcon topIcon; - private IIcon cornerIcon; - - - protected BlockTFCinderLog() { - super(); - this.setHardness(1.0F); - this.setStepSound(Block.soundTypeWood); - this.setCreativeTab(TFItems.creativeTab); - } - - - /** - * From the specified side and block metadata retrieves the blocks texture. Args: side, metadata - */ - @Override - public IIcon getIcon(int side, int meta) - { - int orient = meta & 12; - - return orient == 12 ? this.cornerIcon : (orient == 0 && (side == 1 || side == 0) ? this.topIcon : (orient == 4 && (side == 5 || side == 4) ? this.topIcon : (orient == 8 && (side == 2 || side == 3) ? this.topIcon : blockIcon))); - } - - - @Override - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister par1IconRegister) - { - this.blockIcon = par1IconRegister.registerIcon(TwilightForestMod.ID + ":cinder_side"); - this.topIcon = par1IconRegister.registerIcon(TwilightForestMod.ID + ":cinder_top"); - this.cornerIcon = par1IconRegister.registerIcon(TwilightForestMod.ID + ":cinder_corner"); - } - - - /** - * Returns the ID of the items to drop on destruction. - */ - @Override - public Item getItemDropped(int par1, Random par2Random, int par3) - { - return Item.getItemFromBlock(TFBlocks.cinderLog); // hey that's my block ID! - } - - -} diff --git a/src/main/java/twilightforest/block/BlockTFCritter.java b/src/main/java/twilightforest/block/BlockTFCritter.java deleted file mode 100644 index d55ce3ef7e..0000000000 --- a/src/main/java/twilightforest/block/BlockTFCritter.java +++ /dev/null @@ -1,307 +0,0 @@ -package twilightforest.block; - -import static net.minecraftforge.common.util.ForgeDirection.EAST; -import static net.minecraftforge.common.util.ForgeDirection.NORTH; -import static net.minecraftforge.common.util.ForgeDirection.SOUTH; -import static net.minecraftforge.common.util.ForgeDirection.WEST; - -import java.util.List; - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; -import twilightforest.TwilightForestMod; -import twilightforest.item.TFItems; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - - - -public abstract class BlockTFCritter extends Block { - - - - protected BlockTFCritter() - { - super(Material.circuits); - this.setHardness(0.0F); - this.setCreativeTab(TFItems.creativeTab); - - this.stepSound = new StepSoundTFInsect("squish", 0.25F, 0.6F); - } - - /** - * Updates the blocks bounds based on its current state. Args: world, x, y, z - */ - @Override - public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) - { - int facing = world.getBlockMetadata(x, y, z) & 7; - float wide = 0.15F; - if (facing == 1) - { - setBlockBounds(0.0F, 0.2F, 0.5F - wide, wide * 2.0F, 0.8F, 0.5F + wide); - } - else if(facing == 2) - { - setBlockBounds(1.0F - wide * 2.0F, 0.2F, 0.5F - wide, 1.0F, 0.8F, 0.5F + wide); - } - else if(facing == 3) - { - setBlockBounds(0.5F - wide, 0.2F, 0.0F, 0.5F + wide, 0.8F, wide * 2.0F); - } - else if(facing == 4) - { - setBlockBounds(0.5F - wide, 0.2F, 1.0F - wide * 2.0F, 0.5F + wide, 0.8F, 1.0F); - } - else if(facing == 5) - { - setBlockBounds(0.5F - wide, 0.0F, 0.2F, 0.5F + wide, wide * 2.0F, 0.8F); - } - else if(facing == 6) - { - setBlockBounds(0.5F - wide, 1.0F - wide * 2.0F, 0.2F, 0.5F + wide, 1.0F, 0.8F); - } - else - { - float f1 = 0.1F; - setBlockBounds(0.5F - f1, 0.0F, 0.5F - f1, 0.5F + f1, 0.6F, 0.5F + f1); - } - } - - @Override - public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int i, int j, int k) - { - return null; - } - - @Override - public boolean isOpaqueCube() - { - return false; - } - - @Override - public boolean renderAsNormalBlock() - { - return false; - } - - /** - * The type of render function that is called for this block - */ - @Override - public int getRenderType() - { - return TwilightForestMod.proxy.getCritterBlockRenderID(); - } - - - @Override - public boolean canPlaceBlockAt(World world, int x, int y, int z) { - if (canPlaceAt(world, x - 1, y, z)) { - return true; - } else if (canPlaceAt(world, x + 1, y, z)) { - return true; - } else if (canPlaceAt(world, x, y, z - 1)) { - return true; - } else if (canPlaceAt(world, x, y, z + 1)) { - return true; - } else if (canPlaceAt(world, x, y - 1, z)) { - return true; - } else if (canPlaceAt(world, x, y + 1, z)) { - return true; - } else { - return false; - } - } - - - @Override - public int onBlockPlaced(World par1World, int x, int y, int z, int placementFacing, float par6, float par7, float par8, int meta) - { - if (placementFacing == 1 && this.canPlaceAt(par1World, x, y - 1, z)) - { - meta = 5; - } - - if (placementFacing == 0 && this.canPlaceAt(par1World, x, y + 1, z)) - { - meta = 6; - } - - if (placementFacing == 2 && par1World.isSideSolid(x, y, z + 1, NORTH, true)) - { - meta = 4; - } - - if (placementFacing == 3 && par1World.isSideSolid(x, y, z - 1, SOUTH, true)) - { - meta = 3; - } - - if (placementFacing == 4 && par1World.isSideSolid(x + 1, y, z, WEST, true)) - { - meta = 2; - } - - if (placementFacing == 5 && par1World.isSideSolid(x - 1, y, z, EAST, true)) - { - meta = 1; - } - - return meta; - } - - - /** - * Called whenever the block is added into the world. Args: world, x, y, z - */ - @Override - public void onBlockAdded(World world, int x, int y, int z) - { - if (world.getBlockMetadata(x, y, z) == 0) - { - if (canPlaceAt(world, x - 1, y, z)) { - world.setBlockMetadataWithNotify(x, y, z, 1, 2); - } - else if (canPlaceAt(world, x + 1, y, z)) { - world.setBlockMetadataWithNotify(x, y, z, 2, 2); - } - else if (canPlaceAt(world, x, y, z - 1)) { - world.setBlockMetadataWithNotify(x, y, z, 3, 2); - } - else if (canPlaceAt(world, x, y, z + 1)) { - world.setBlockMetadataWithNotify(x, y, z, 4, 2); - } - else if (canPlaceAt(world, x, y - 1, z)) { - world.setBlockMetadataWithNotify(x, y, z, 5, 2); - } - else if (canPlaceAt(world, x, y + 1, z)) { - world.setBlockMetadataWithNotify(x, y, z, 6, 2); - } - } - - dropCritterIfCantStay(world, x, y, z); - - // for fireflies, schedule a lighting update - int meta = world.getBlockMetadata(x, y, z); - if (meta == 0) { - world.scheduleBlockUpdate(x, y, z, this, tickRate(world)); - } - } - - public boolean dropCritterIfCantStay(World world, int x, int y, int z) - { - if(!canPlaceBlockAt(world, x, y, z)) - { - dropBlockAsItem(world, x, y, z, world.getBlockMetadata(x, y, z), 0); - world.setBlockToAir(x, y, z); - return false; - } else - { - return true; - } - } - - /** - * Lets the block know when one of its neighbor changes. Doesn't know which neighbor changed (coordinates passed are - * their own) Args: x, y, z, neighbor blockID - */ - @Override - public void onNeighborBlockChange(World world, int x, int y, int z, Block blockID) - { - if(dropCritterIfCantStay(world, x, y, z)) - { - int facing = world.getBlockMetadata(x, y, z) & 7; - - boolean flag = false; - if (!canPlaceAt(world, x - 1, y, z) && facing == 1) { - flag = true; - } - if (!canPlaceAt(world, x + 1, y, z) && facing == 2) { - flag = true; - } - if (!canPlaceAt(world, x, y, z - 1) && facing == 3) { - flag = true; - } - if (!canPlaceAt(world, x, y, z + 1) && facing == 4) { - flag = true; - } - if (!canPlaceAt(world, x, y - 1, z) && facing == 5) { - flag = true; - } - if (!canPlaceAt(world, x, y + 1, z) && facing == 6) { - flag = true; - } - if (flag) { - dropBlockAsItem(world, x, y, z, 0, 0); - world.setBlockToAir(x, y, z); - } - } - } - - - /** - * We can place fireflies on any normal block or on leaves. - */ - public boolean canPlaceAt(World world, int x, int y, int z) - { - return world.isBlockNormalCubeDefault(x, y, z, true) || world.getBlock(x, y, z).getMaterial() == Material.leaves || world.getBlock(x, y, z).getMaterial() == Material.cactus; - } - - /** - * Called throughout the code as a replacement for block instanceof BlockContainer - * Moving this to the Block base class allows for mods that wish to extend vinella - * blocks, and also want to have a tile entity on that block, may. - * - * Return true from this function to specify this block has a tile entity. - * - * @param metadata Metadata of the current block - * @return True if block has a tile entity, false otherwise - */ - @Override - public boolean hasTileEntity(int metadata) { - return true; - } - - /** - * Called throughout the code as a replacement for BlockContainer.getBlockEntity - * Return the same thing you would from that function. - * This will fall back to BlockContainer.getBlockEntity if this block is a BlockContainer. - * - * @param metadata The Metadata of the current block - * @return A instance of a class extending TileEntity - */ - @Override - public abstract TileEntity createTileEntity(World world, int metadata); - - /** - * returns a list of blocks with the same ID, but different meta (eg: wood returns 4 blocks) - */ - @SuppressWarnings({ "rawtypes", "unchecked" }) - @Override - public void getSubBlocks(Item par1, CreativeTabs par2CreativeTabs, List par3List) - { - par3List.add(new ItemStack(par1, 1, 0)); - } - - /** - * Properly register icon source - */ - @Override - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister par1IconRegister) - { - this.blockIcon = par1IconRegister.registerIcon(TwilightForestMod.ID + ":" + this.getUnlocalizedName().substring(5)); - } -} - - diff --git a/src/main/java/twilightforest/block/BlockTFDarkLeaves.java b/src/main/java/twilightforest/block/BlockTFDarkLeaves.java deleted file mode 100644 index 9d3f9089f4..0000000000 --- a/src/main/java/twilightforest/block/BlockTFDarkLeaves.java +++ /dev/null @@ -1,151 +0,0 @@ -package twilightforest.block; - -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.world.ColorizerFoliage; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; -import twilightforest.TwilightForestMod; -import twilightforest.item.TFItems; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public class BlockTFDarkLeaves extends Block { - - protected BlockTFDarkLeaves() { - super(Material.leaves); - this.setHardness(2F); - this.setResistance(10F); - this.setStepSound(Block.soundTypeGrass); - this.setCreativeTab(TFItems.creativeTab); - - this.textureName = TwilightForestMod.ID + ":darkwood_leaves2"; - } - - - @SideOnly(Side.CLIENT) - public int getBlockColor() - { - double d0 = 0.5D; - double d1 = 1.0D; - return ColorizerFoliage.getFoliageColor(d0, d1); - } - - /** - * Returns the color this block should be rendered. Used by leaves. - */ - @SideOnly(Side.CLIENT) - public int getRenderColor(int p_149741_1_) - { - return ColorizerFoliage.getFoliageColorBasic(); - } - - /** - * Returns a integer with hex for 0xrrggbb with this color multiplied against the blocks color. Note only called - * when first determining what to render. - */ - @SideOnly(Side.CLIENT) - public int colorMultiplier(IBlockAccess world, int x, int y, int z) - { - int red = 0; - int grn = 0; - int blu = 0; - - for (int dz = -1; dz <= 1; ++dz) - { - for (int dx = -1; dx <= 1; ++dx) - { - int i2 = world.getBiomeGenForCoords(x + dx, z + dz).getBiomeFoliageColor(x + dx, y, z + dz); - red += (i2 & 16711680) >> 16; - grn += (i2 & 65280) >> 8; - blu += i2 & 255; - } - } - - return (red / 9 & 255) << 16 | (grn / 9 & 255) << 8 | blu / 9 & 255; - } - - /** - * Determines the damage on the item the block drops. Used in cloth and wood. - */ - @Override - public int damageDropped(int meta) { - return 3; - } - - - /** - * Chance that fire will spread and consume this block. - * 300 being a 100% chance, 0, being a 0% chance. - * - * @param world The current world - * @param x The blocks X position - * @param y The blocks Y position - * @param z The blocks Z position - * @param metadata The blocks current metadata - * @param face The face that the fire is coming from - * @return A number ranging from 0 to 300 relating used to determine if the block will be consumed by fire - */ - @Override - public int getFlammability(IBlockAccess world, int x, int y, int z, ForgeDirection face) { - return 1; - } - - /** - * Called when fire is updating on a neighbor block. - * The higher the number returned, the faster fire will spread around this block. - * - * @param world The current world - * @param x The blocks X position - * @param y The blocks Y position - * @param z The blocks Z position - * @param metadata The blocks current metadata - * @param face The face that the fire is coming from - * @return A number that is used to determine the speed of fire growth around the block - */ - @Override - public int getFireSpreadSpeed(IBlockAccess world, int x, int y, int z, ForgeDirection face) { - return 0; - } - - /** - * Returns the quantity of items to drop on block destruction. - */ - @Override - public int quantityDropped(Random par1Random) - { - return par1Random.nextInt(40) == 0 ? 1 : 0; - } - - /** - * Returns the ID of the items to drop on destruction. - */ - @Override - public Item getItemDropped(int meta, Random par2Random, int par3) - { - return Item.getItemFromBlock(TFBlocks.sapling); - } - - /** - * Drops the block items with a specified chance of dropping the specified items - */ - @Override - public void dropBlockAsItemWithChance(World par1World, int par2, int par3, int par4, int meta, float par6, int fortune) - { - if (!par1World.isRemote) - { - if (par1World.rand.nextInt(40) == 0) - { - Item var9 = this.getItemDropped(meta, par1World.rand, fortune); - this.dropBlockAsItem(par1World, par2, par3, par4, new ItemStack(var9, 1, this.damageDropped(meta))); - } - } - } - -} - diff --git a/src/main/java/twilightforest/block/BlockTFDeadrock.java b/src/main/java/twilightforest/block/BlockTFDeadrock.java deleted file mode 100644 index b048c0d076..0000000000 --- a/src/main/java/twilightforest/block/BlockTFDeadrock.java +++ /dev/null @@ -1,72 +0,0 @@ -package twilightforest.block; - -import java.util.List; - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.IIcon; -import twilightforest.TwilightForestMod; -import twilightforest.item.TFItems; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public class BlockTFDeadrock extends Block { - - public static final String[] names = new String[] {"surface", "cracked", "solid"}; - private IIcon[] icons; - - protected BlockTFDeadrock() { - super(Material.rock); - this.setHardness(100F); - this.setResistance(6000000.0F); - this.setStepSound(soundTypePiston); - this.disableStats(); - this.setCreativeTab(TFItems.creativeTab); - } - - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister iconRegister) - { - this.icons = new IIcon[names.length]; - - for (int i = 0; i < names.length; i++) { - this.icons[i] = iconRegister.registerIcon(TwilightForestMod.ID + ":deadrock_" + names[i]); - } - } - - /** - * From the specified side and block metadata retrieves the blocks texture. Args: side, metadata - */ - @Override - public IIcon getIcon(int side, int meta) - { - if (meta > this.names.length) { - meta = 0; - } - - return this.icons[meta]; - } - - /** - * returns a list of blocks with the same ID, but different meta (eg: wood returns 4 blocks) - */ - @Override - public void getSubBlocks(Item par1, CreativeTabs par2CreativeTabs, List par3List) - { - for (int i = 0; i < names.length; i++) { - par3List.add(new ItemStack(par1, 1, i)); - } - } - - /** - * Determines the damage on the item the block drops. Used in cloth and wood. - */ - public int damageDropped(int meta) - { - return meta; - } -} diff --git a/src/main/java/twilightforest/block/BlockTFFireJet.java b/src/main/java/twilightforest/block/BlockTFFireJet.java deleted file mode 100644 index fca068bed4..0000000000 --- a/src/main/java/twilightforest/block/BlockTFFireJet.java +++ /dev/null @@ -1,407 +0,0 @@ -package twilightforest.block; - -import java.util.List; -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.init.Blocks; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.ChunkCoordinates; -import net.minecraft.util.IIcon; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; -import twilightforest.TwilightForestMod; -import twilightforest.item.TFItems; -import twilightforest.tileentity.TileEntityTFFlameJet; -import twilightforest.tileentity.TileEntityTFPoppingJet; -import twilightforest.tileentity.TileEntityTFSmoker; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public class BlockTFFireJet extends Block { - - public static final int META_SMOKER = 0; - public static final int META_ENCASED_SMOKER_OFF = 1; - public static final int META_ENCASED_SMOKER_ON = 2; - public static final int META_JET_IDLE = 8; - public static final int META_JET_POPPING = 9; - public static final int META_JET_FLAME = 10; - public static final int META_ENCASED_JET_IDLE = 11; - public static final int META_ENCASED_JET_POPPING = 12; - public static final int META_ENCASED_JET_FLAME = 13; - - private IIcon iconJet; - private IIcon iconSide; - private IIcon iconSmokerInactive; - private IIcon iconSmokerActive; - private IIcon iconJetInactive; - private IIcon iconJetActive; - - protected BlockTFFireJet() { - super(Material.rock); - this.setHardness(1.5F); - //this.setResistance(10.0F); - this.setStepSound(Block.soundTypeWood); - this.setCreativeTab(TFItems.creativeTab); - this.setTickRandomly(true); - } - - - - /** - * Determines the damage on the item the block drops. Used in cloth and wood. - */ - @Override - public int damageDropped(int meta) { - switch (meta) - { - default : - return meta; - case META_ENCASED_SMOKER_ON : - return META_ENCASED_SMOKER_OFF; - case META_ENCASED_JET_POPPING : - case META_ENCASED_JET_FLAME : - return META_ENCASED_JET_IDLE; - case META_JET_POPPING : - case META_JET_FLAME : - return META_JET_IDLE; - } - - } - - - /** - * From the specified side and block metadata retrieves the blocks texture. Args: side, metadata - */ - @Override - public IIcon getIcon(int side, int meta) - { - if (meta == META_ENCASED_SMOKER_OFF) - { - if (side >= 2) - { - return iconSmokerInactive; - } - else if (side == 1) - { - return TFBlocks.towerDevice.getIcon(side, BlockTFTowerDevice.META_GHASTTRAP_INACTIVE); - } - else - { - return TFBlocks.towerWood.getIcon(side, 1); - } - } - else if (meta == META_ENCASED_SMOKER_ON) - { - if (side >= 2) - { - return iconSmokerActive; - } - else if (side == 1) - { - return TFBlocks.towerDevice.getIcon(side, BlockTFTowerDevice.META_GHASTTRAP_ACTIVE); - } - else - { - return TFBlocks.towerWood.getIcon(side, 1); - } - } - if (meta == META_ENCASED_JET_IDLE) - { - if (side >= 2) - { - return iconJetInactive; - } - else if (side == 1) - { - return TFBlocks.towerDevice.getIcon(side, BlockTFTowerDevice.META_GHASTTRAP_INACTIVE); - } - else - { - return TFBlocks.towerWood.getIcon(side, 1); - } - } - else if (meta == META_ENCASED_JET_POPPING || meta == META_ENCASED_JET_FLAME) - { - if (side >= 2) - { - return iconJetActive; - } - else if (side == 1) - { - return TFBlocks.towerDevice.getIcon(side, BlockTFTowerDevice.META_GHASTTRAP_ACTIVE); - } - else - { - return TFBlocks.towerWood.getIcon(side, 1); - } - } - else - { - // normal fire jet - if (side == 1) - { - return iconJet; - } - else - { - return iconSide; - } - } - } - - - @Override - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister par1IconRegister) - { - this.iconSide = par1IconRegister.registerIcon(TwilightForestMod.ID + ":firejet_side"); - this.iconJet = par1IconRegister.registerIcon(TwilightForestMod.ID + ":firejet_top"); - this.iconSmokerInactive = par1IconRegister.registerIcon(TwilightForestMod.ID + ":towerdev_smoker_off"); - this.iconSmokerActive = par1IconRegister.registerIcon(TwilightForestMod.ID + ":towerdev_smoker_on"); - this.iconJetInactive = par1IconRegister.registerIcon(TwilightForestMod.ID + ":towerdev_firejet_off"); - this.iconJetActive = par1IconRegister.registerIcon(TwilightForestMod.ID + ":towerdev_firejet_on"); } - - /** - * Returns a integer with hex for 0xrrggbb with this color multiplied against the blocks color. Note only called - * when first determining what to render. - */ - @Override - @SideOnly(Side.CLIENT) - public int colorMultiplier(IBlockAccess par1IBlockAccess, int x, int y, int z) - { - int meta = par1IBlockAccess.getBlockMetadata(x, y, z); - - if (meta == META_ENCASED_SMOKER_OFF || meta == META_ENCASED_SMOKER_ON - || meta == META_ENCASED_JET_IDLE || meta == META_ENCASED_JET_POPPING || meta == META_ENCASED_JET_FLAME) - { - return super.colorMultiplier(par1IBlockAccess, x, y, z); - } - else - { - int red = 0; - int grn = 0; - int blu = 0; - - for (int var8 = -1; var8 <= 1; ++var8) - { - for (int var9 = -1; var9 <= 1; ++var9) - { - int biomeColor = par1IBlockAccess.getBiomeGenForCoords(x + var9, z + var8).getBiomeGrassColor(x + var9, y, z + var8); - red += (biomeColor & 16711680) >> 16; - grn += (biomeColor & 65280) >> 8; - blu += biomeColor & 255; - } - } - - return (red / 9 & 255) << 16 | (grn / 9 & 255) << 8 | blu / 9 & 255; - } - } - - - /** - * Get a light value for this block, normal ranges are between 0 and 15 - * - * @param world The current world - * @param x X Position - * @param y Y position - * @param z Z position - * @return The light value - */ - @Override - public int getLightValue(IBlockAccess world, int x, int y, int z) - { - if (world.getBlock(x, y, z) == this) - { - int meta = world.getBlockMetadata(x, y, z); - - switch (meta) { - case META_SMOKER: - default : - return 0; - case META_JET_FLAME : - case META_ENCASED_JET_FLAME : - return 15; - } - } - else - { - return 0; - } - } - - /** - * Ticks the block if it's been scheduled - */ - @Override - public void updateTick(World world, int x, int y, int z, Random random) - { - // idle jets may turn active - if (!world.isRemote && world.getBlockMetadata(x, y, z) == META_JET_IDLE) { - ChunkCoordinates lavaPos = findLavaAround(world, x, y - 1, z); - - if (isLava(world, lavaPos.posX, lavaPos.posY, lavaPos.posZ)) - { - // deplete lava reservoir - world.setBlock(lavaPos.posX, lavaPos.posY, lavaPos.posZ, Blocks.air, 0, 2); - // change jet state - world.setBlock(x, y, z, this, META_JET_POPPING, 0); - } - else - { - //System.out.println("Can't fire jet because reservoir is empty. Block meta is " + world.getBlockMetadata(lavaPos.posX, lavaPos.posY, lavaPos.posZ)); - } - } - } - - /** - * Lets the block know when one of its neighbor changes. Doesn't know which neighbor changed (coordinates passed are - * their own) Args: x, y, z, neighbor blockID - */ - @Override - public void onNeighborBlockChange(World par1World, int x, int y, int z, Block myBlockID) - { - int meta = par1World.getBlockMetadata(x, y, z); - - if (!par1World.isRemote) - { - if (meta == META_ENCASED_SMOKER_OFF && par1World.isBlockIndirectlyGettingPowered(x, y, z)) - { - par1World.setBlock(x, y, z, this, META_ENCASED_SMOKER_ON, 3); - par1World.playSoundEffect(x + 0.5D, y + 0.5D, z + 0.5D, "random.click", 0.3F, 0.6F); - } - - if (meta == META_ENCASED_SMOKER_ON && !par1World.isBlockIndirectlyGettingPowered(x, y, z)) - { - par1World.setBlock(x, y, z, this, META_ENCASED_SMOKER_OFF, 3); - par1World.playSoundEffect(x + 0.5D, y + 0.5D, z + 0.5D, "random.click", 0.3F, 0.6F); - } - - if (meta == META_ENCASED_JET_IDLE && par1World.isBlockIndirectlyGettingPowered(x, y, z)) - { - par1World.setBlock(x, y, z, this, META_ENCASED_JET_POPPING, 3); - par1World.playSoundEffect(x + 0.5D, y + 0.5D, z + 0.5D, "random.click", 0.3F, 0.6F); - } - - } - } - - /** - * Find a full block of lava near the designated block. This is intentionally not really that reliable. - * - * - */ - private ChunkCoordinates findLavaAround(World world, int x, int y, int z) { - if (isLava(world, x, y, z)) { - return new ChunkCoordinates(x, y, z); - } - // try three random spots nearby - int rx = x + world.rand.nextInt(3) - 1; - int rz = z + world.rand.nextInt(3) - 1; - if (isLava(world, rx, y, rz)) { - return new ChunkCoordinates(rx, y, rz); - } - - rx = x + world.rand.nextInt(3) - 1; - rz = z + world.rand.nextInt(3) - 1; - if (isLava(world, rx, y, rz)) { - return new ChunkCoordinates(rx, y, rz); - } - - rx = x + world.rand.nextInt(3) - 1; - rz = z + world.rand.nextInt(3) - 1; - if (isLava(world, rx, y, rz)) { - return new ChunkCoordinates(rx, y, rz); - } - - - // finally, give up - return new ChunkCoordinates(x, y, z); - } - - private boolean isLava(World world, int x, int y, int z) - { - return world.getBlock(x, y, z).getMaterial() == Material.lava && world.getBlockMetadata(x, y, z) == 0; - } - - - - /** - * Called throughout the code as a replacement for block instanceof BlockContainer - * Moving this to the Block base class allows for mods that wish to extend vinella - * blocks, and also want to have a tile entity on that block, may. - * - * Return true from this function to specify this block has a tile entity. - * - * @param metadata Metadata of the current block - * @return True if block has a tile entity, false otherwise - */ - @Override - public boolean hasTileEntity(int metadata) { - if (metadata == META_SMOKER || metadata == META_JET_POPPING || metadata == META_JET_FLAME - || metadata == META_ENCASED_SMOKER_ON || metadata == META_ENCASED_JET_POPPING || metadata == META_ENCASED_JET_FLAME) - { - return true; - } - else - { - return false; - } - } - - /** - * Called throughout the code as a replacement for BlockContainer.getBlockEntity - * Return the same thing you would from that function. - * This will fall back to BlockContainer.getBlockEntity if this block is a BlockContainer. - * - * @param metadata The Metadata of the current block - * @return A instance of a class extending TileEntity - */ - @Override - public TileEntity createTileEntity(World world, int metadata) { - if (metadata == META_SMOKER || metadata == META_ENCASED_SMOKER_ON) - { - return new TileEntityTFSmoker(); - } - else if (metadata == META_JET_POPPING) - { - return new TileEntityTFPoppingJet(META_JET_FLAME); - } - else if (metadata == META_JET_FLAME) - { - return new TileEntityTFFlameJet(META_JET_IDLE); - } - else if (metadata == META_ENCASED_JET_POPPING) - { - return new TileEntityTFPoppingJet(META_ENCASED_JET_FLAME); - } - else if (metadata == META_ENCASED_JET_FLAME) - { - return new TileEntityTFFlameJet(META_ENCASED_JET_IDLE); - } - else - { - return null; - } - } - - - /** - * returns a list of blocks with the same ID, but different meta (eg: wood returns 4 blocks) - */ - @Override - public void getSubBlocks(Item par1, CreativeTabs par2CreativeTabs, List par3List) - { - par3List.add(new ItemStack(par1, 1, META_SMOKER)); - par3List.add(new ItemStack(par1, 1, META_JET_IDLE)); - par3List.add(new ItemStack(par1, 1, META_ENCASED_SMOKER_OFF)); - par3List.add(new ItemStack(par1, 1, META_ENCASED_JET_IDLE)); - } - - -} diff --git a/src/main/java/twilightforest/block/BlockTFFirefly.java b/src/main/java/twilightforest/block/BlockTFFirefly.java deleted file mode 100644 index 43c0d03e3e..0000000000 --- a/src/main/java/twilightforest/block/BlockTFFirefly.java +++ /dev/null @@ -1,80 +0,0 @@ -package twilightforest.block; - -import java.util.Random; - -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.EnumSkyBlock; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; -import twilightforest.tileentity.TileEntityTFFirefly; - -public class BlockTFFirefly extends BlockTFCritter { - - - public static int sprFirefly = 4; - - public static Random rand = new Random(); - - protected BlockTFFirefly() { - super(); - this.setLightLevel(0.9375F); - } - - /** - * How often do we check for incorrect lighting on fireflies, etc. - */ - public int tickRate() - { - return 50 + rand.nextInt(50); - } - - /** - * Get a light value for this block, normal ranges are between 0 and 15 - * - * @param world The current world - * @param x X Position - * @param y Y position - * @param z Z position - * @return The light value - */ - @Override - public int getLightValue(IBlockAccess world, int x, int y, int z) { - return 15; - } - - - @Override - public TileEntity createTileEntity(World world, int metadata) { - return new TileEntityTFFirefly(); - } - - - /** - * Called whenever the block is added into the world. Args: world, x, y, z - */ - @Override - public void onBlockAdded(World world, int x, int y, int z) - { - super.onBlockAdded(world, x, y, z); -// if (!world.isRemote) -// { -// world.scheduleBlockUpdate(x, y, z, blockID, tickRate()); -// } - } - - /** - * Ticks the block if it's been scheduled - * Check the lighting and make the world relight it if it's incorrect. - */ - @Override - public void updateTick(World world, int x, int y, int z, Random random) - { - if (!world.isRemote && world.getBlockLightValue(x, y, z) < 12) { - //world.updateLightByType(EnumSkyBlock.Block, x, y, z); - world.markBlockForUpdate(x, y, z); // do we need this now? - //System.out.println("Updating firefly light value"); - // do another update to check that we got it right - world.scheduleBlockUpdate(x, y, z, this, tickRate()); - } - } -} diff --git a/src/main/java/twilightforest/block/BlockTFFireflyJar.java b/src/main/java/twilightforest/block/BlockTFFireflyJar.java deleted file mode 100644 index 2398db6baa..0000000000 --- a/src/main/java/twilightforest/block/BlockTFFireflyJar.java +++ /dev/null @@ -1,170 +0,0 @@ -package twilightforest.block; - -import java.util.List; -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.IIcon; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; -import twilightforest.TwilightForestMod; -import twilightforest.entity.passive.EntityTFTinyFirefly; -import twilightforest.item.TFItems; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public class BlockTFFireflyJar extends Block { - - public static IIcon jarTop; - public static IIcon jarSide; - public static IIcon jarCork; - - protected BlockTFFireflyJar() { - super(Material.glass); - this.setBlockBounds(0.1875F, 0.0F, 0.1875F, 0.8125F, 1.0F, 0.8125F); - this.setHardness(0.3F); - this.setStepSound(Block.soundTypeWood); - this.setCreativeTab(TFItems.creativeTab); - this.setLightLevel(1.0F); - } - - - /** - * If this block doesn't render as an ordinary block it will return False (examples: signs, buttons, stairs, etc) - */ - @Override - public boolean renderAsNormalBlock() - { - return false; - } - - - /** - * Is this block (a) opaque and (b) a full 1m cube? This determines whether or not to render the shared face of two - * adjacent blocks and also whether the player can attach torches, redstone wire, etc to this block. - */ - @Override - public boolean isOpaqueCube() - { - return false; - } - - /** - * The type of render function that is called for this block - */ - @Override - public int getRenderType() - { - return TwilightForestMod.proxy.getComplexBlockRenderID(); - } - - /** - * From the specified side and block metadata retrieves the blocks texture. Args: side, metadata - */ - @Override - public IIcon getIcon(int side, int meta) - { - return (side == 1 || side == 0) ? jarTop : jarSide; - } - - /** - * Get a light value for this block, normal ranges are between 0 and 15 - * - * @param world The current world - * @param x X Position - * @param y Y position - * @param z Z position - * @return The light value - */ - @Override - public int getLightValue(IBlockAccess world, int x, int y, int z) - { - return 15; - } - - /** - * Return true if the block is a normal, solid cube. This - * determines indirect power state, entity ejection from blocks, and a few - * others. - * - * @param world The current world - * @param x X Position - * @param y Y position - * @param z Z position - * @return True if the block is a full cube - */ - public boolean isBlockNormalCube(World world, int x, int y, int z) - { - return false; - } - - /** - * Updates the blocks bounds based on its current state. Args: world, x, y, z - */ - @Override - public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) { - this.setBlockBounds(0.1875F, 0.0F, 0.1875F, 0.8125F, 1.0F, 0.8125F); - } - - - /** - * Sets the block's bounds for rendering it as an item - */ - @Override - public void setBlockBoundsForItemRender() - { - this.setBlockBounds(0.1875F, 0.0F, 0.1875F, 0.8125F, 1.0F, 0.8125F); - } - - - /** - * A randomly called display update to be able to add particles or other items for display - */ - @Override - @SideOnly(Side.CLIENT) - public void randomDisplayTick(World world, int x, int y, int z, Random rand) - { - - - double dx = x + ((rand.nextFloat() - rand.nextFloat()) * 0.3F + 0.5F); - double dy = y - 0.1F + ((rand.nextFloat() - rand.nextFloat()) * 0.4F); - double dz = z + ((rand.nextFloat() - rand.nextFloat()) * 0.3F + 0.5F); - - EntityTFTinyFirefly tinyfly = new EntityTFTinyFirefly(world, dx, dy, dz); - world.addWeatherEffect(tinyfly); - - dx = x + ((rand.nextFloat() - rand.nextFloat()) * 0.3F + 0.5F); - dy = y - 0.1F + ((rand.nextFloat() - rand.nextFloat()) * 0.4F); - dz = z + ((rand.nextFloat() - rand.nextFloat()) * 0.3F + 0.5F); - - tinyfly = new EntityTFTinyFirefly(world, dx, dy, dz); - world.addWeatherEffect(tinyfly); - } - - - /** - * returns a list of blocks with the same ID, but different meta (eg: wood returns 4 blocks) - */ - @Override - public void getSubBlocks(Item par1, CreativeTabs par2CreativeTabs, List par3List) - { - par3List.add(new ItemStack(par1, 1, 0)); - } - - - @Override - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister par1IconRegister) - { - BlockTFFireflyJar.jarTop = par1IconRegister.registerIcon(TwilightForestMod.ID + ":fireflyjar_top"); - BlockTFFireflyJar.jarSide = par1IconRegister.registerIcon(TwilightForestMod.ID + ":fireflyjar_side"); - BlockTFFireflyJar.jarCork = par1IconRegister.registerIcon(TwilightForestMod.ID + ":fireflyjar_cork"); - } - - -} diff --git a/src/main/java/twilightforest/block/BlockTFFluffyCloud.java b/src/main/java/twilightforest/block/BlockTFFluffyCloud.java deleted file mode 100644 index 159ed71576..0000000000 --- a/src/main/java/twilightforest/block/BlockTFFluffyCloud.java +++ /dev/null @@ -1,20 +0,0 @@ -package twilightforest.block; - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import twilightforest.TwilightForestMod; -import twilightforest.item.TFItems; - -public class BlockTFFluffyCloud extends Block { - - protected BlockTFFluffyCloud() { - super(Material.packedIce); - this.setStepSound(soundTypeCloth); - this.setCreativeTab(TFItems.creativeTab); - this.setHardness(0.8F); - - this.setBlockTextureName(TwilightForestMod.ID + ":fluffy_cloud"); - } - - -} diff --git a/src/main/java/twilightforest/block/BlockTFForceField.java b/src/main/java/twilightforest/block/BlockTFForceField.java deleted file mode 100644 index 0fca8b70f3..0000000000 --- a/src/main/java/twilightforest/block/BlockTFForceField.java +++ /dev/null @@ -1,140 +0,0 @@ -package twilightforest.block; - -import static net.minecraftforge.common.util.ForgeDirection.EAST; -import static net.minecraftforge.common.util.ForgeDirection.NORTH; -import static net.minecraftforge.common.util.ForgeDirection.SOUTH; -import static net.minecraftforge.common.util.ForgeDirection.WEST; - -import java.util.List; - -import twilightforest.TwilightForestMod; -import twilightforest.item.TFItems; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import net.minecraft.block.Block; -import net.minecraft.block.BlockPane; -import net.minecraft.block.BlockSlab; -import net.minecraft.block.BlockStainedGlassPane; -import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.entity.Entity; -import net.minecraft.init.Blocks; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.IIcon; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; - -public class BlockTFForceField extends BlockPane { - - public static String[] names = new String[] {"purple", "pink", "orange", "green", "blue"}; - - public static IIcon[] sides; - public static IIcon top; - - protected BlockTFForceField() { - super("glass", "glass_pane_top", Material.grass, false); - this.setLightLevel(2F / 15F); - this.setCreativeTab(TFItems.creativeTab); - } - - /** - * Gets the block's texture. Args: side, meta - */ - @SideOnly(Side.CLIENT) - public IIcon getIcon(int side, int meta) - { - return this.sides[meta % names.length]; - } - - @SideOnly(Side.CLIENT) - public IIcon func_150097_e() - { - return this.top; - } - - - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister register) - { - super.registerBlockIcons(register); - - this.sides = new IIcon[names.length]; - - for (int i = 0; i < names.length; i++) { - this.sides[i] = register.registerIcon(TwilightForestMod.ID + ":forcefield_" + names[i]); - } - - this.top = register.registerIcon(TwilightForestMod.ID + ":forcefield_top"); - - } - - /** - * How bright to render this block based on the light its receiving. Args: iBlockAccess, x, y, z - */ - @SideOnly(Side.CLIENT) - public int getMixedBrightnessForBlock(IBlockAccess world, int x, int y, int z) - { - return 15 << 20 | 15 << 4; - } - - /** - * Determines the damage on the item the block drops. Used in cloth and wood. - */ - public int damageDropped(int meta) - { - return meta % names.length; - } - - /** - * returns a list of blocks with the same ID, but different meta (eg: wood returns 4 blocks) - */ - @SuppressWarnings({ "rawtypes", "unchecked" }) - @Override - public void getSubBlocks(Item par1, CreativeTabs par2CreativeTabs, List par3List) - { - for (int i = 0; i < names.length; i++) { - par3List.add(new ItemStack(par1, 1, i)); - } - } - - /** - * Returns which pass should this block be rendered on. 0 for solids and 1 for alpha - */ - @SideOnly(Side.CLIENT) - public int getRenderBlockPass() - { - return 1; - } - - /** - * Adds all intersecting collision boxes to a list. (Be sure to only add boxes to the list if they intersect the - * mask.) Parameters: World, X, Y, Z, mask, list, colliding entity - */ - public void addCollisionBoxesToList(World world, int x, int y, int z, AxisAlignedBB aabb, List list, Entity entity) - { - super.addCollisionBoxesToList(world, x, y, z, aabb, list, entity); - - // just fill in the whole bounding box when we connect on all sides - boolean north = this.canPaneConnectTo(world, x, y, z - 1, NORTH); - boolean south = this.canPaneConnectTo(world, x, y, z + 1, SOUTH); - boolean east = this.canPaneConnectTo(world, x - 1, y, z, WEST ); - boolean west = this.canPaneConnectTo(world, x + 1, y, z, EAST ); - - if (north && south && east && west) { - this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); - } - - // manually add to the list, since super.method is overwritten - AxisAlignedBB myAABB = this.getCollisionBoundingBoxFromPool(world, x, y, z); - - if (myAABB != null && aabb.intersectsWith(myAABB)) - { - list.add(myAABB); - } - - } - -} diff --git a/src/main/java/twilightforest/block/BlockTFGiantBlock.java b/src/main/java/twilightforest/block/BlockTFGiantBlock.java deleted file mode 100644 index ca96e5afc4..0000000000 --- a/src/main/java/twilightforest/block/BlockTFGiantBlock.java +++ /dev/null @@ -1,268 +0,0 @@ -package twilightforest.block; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import net.minecraft.block.Block; -import net.minecraft.client.particle.EffectRenderer; -import net.minecraft.client.particle.EntityDiggingFX; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.IIcon; -import net.minecraft.world.Explosion; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; - -public abstract class BlockTFGiantBlock extends Block { - - private IIcon[][][] giantIcon; - private Block baseBlock; - private boolean isSelfDestructing; - - public BlockTFGiantBlock(Block baseBlock) { - super(baseBlock.getMaterial()); - this.setStepSound(baseBlock.stepSound); - - this.baseBlock = baseBlock; - } - - - @Override - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister par1IconRegister) { - this.giantIcon = new GiantBlockIcon[4][4][6]; - - for (int x = 0; x < 4; x++) { - for (int y = 0; y < 4; y++) { - for (int side = 0; side < 6; side++) { - this.giantIcon[x][y][side] = new GiantBlockIcon(this.baseBlock.getBlockTextureFromSide(side), x, y); - } - } - } - } - - - - @SideOnly(Side.CLIENT) - public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side) { - // return an icon from the icon matrix! - switch (side) { - case 0: - default: - return this.giantIcon[x & 3][z & 3][side]; - case 1: - return this.giantIcon[x & 3][z & 3][side]; - case 2: - return this.giantIcon[3 - (x & 3)][3 - (y & 3)][side]; - case 3: - return this.giantIcon[x & 3][3 - (y & 3)][side]; - case 4: - return this.giantIcon[z & 3][3 - (y & 3)][side]; - case 5: - return this.giantIcon[3 - (z & 3)][3 - (y & 3)][side]; - } - - } - - /** - * Gets the block's texture. Args: side, meta - */ - @SideOnly(Side.CLIENT) - public IIcon getIcon(int side, int meta) - { - return this.giantIcon[0][0][side]; - } - - /** - * Checks to see if its valid to put this block at the specified coordinates. Args: world, x, y, z - */ - public boolean canPlaceBlockAt(World world, int x, int y, int z) { - - int bx = (x >> 2) << 2; - int by = (y >> 2) << 2; - int bz = (z >> 2) << 2; - - boolean allReplaceable = true; - - for (int dx = 0; dx < 4; dx++) { - for (int dy = 0; dy < 4; dy++) { - for (int dz = 0; dz < 4; dz++) { - allReplaceable &= world.getBlock(bx + dx, by + dy, bz + dz).isReplaceable(world, bx + dx, by + dy, bz + dz); - } - } - } - - return super.canPlaceBlockAt(world, x, y, z) && allReplaceable; - } - - /** - * Returns a bounding box from the pool of bounding boxes (this means this box can change after the pool has been - * cleared to be reused) - */ - public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) { - int bx = (x >> 2) << 2; - int by = (y >> 2) << 2; - int bz = (z >> 2) << 2; - - return AxisAlignedBB.getBoundingBox((double)bx + this.minX, (double)by + this.minY, (double)bz + this.minZ, (double)bx + this.maxX * 4F, (double)by + this.maxY * 4F, (double)bz + this.maxZ * 4F); - } - - /** - * Called when the block is placed in the world. - */ - public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack itemStack) { - if (!world.isRemote) { - int bx = (x >> 2) << 2; - int by = (y >> 2) << 2; - int bz = (z >> 2) << 2; - - for (int dx = 0; dx < 4; dx++) { - for (int dy = 0; dy < 4; dy++) { - for (int dz = 0; dz < 4; dz++) { - world.setBlock(bx + dx, by + dy, bz + dz, this, 0, 2); - } - } - } - } - } - - /** - * Spawn particles for when the block is destroyed. Due to the nature - * of how this is invoked, the x/y/z locations are not always guaranteed - * to host your block. So be sure to do proper sanity checks before assuming - * that the location is this block. - * - * @param world The current world - * @param x X position to spawn the particle - * @param y Y position to spawn the particle - * @param z Z position to spawn the particle - * @param meta The metadata for the block before it was destroyed. - * @param effectRenderer A reference to the current effect renderer. - * @return True to prevent vanilla break particles from spawning. - */ - @Override - @SideOnly(Side.CLIENT) - public boolean addDestroyEffects(World world, int x, int y, int z, int meta, EffectRenderer effectRenderer) { - - int bx = (x >> 2) << 2; - int by = (y >> 2) << 2; - int bz = (z >> 2) << 2; - - Block blockThere = world.getBlock(x, y, z); - int metaThere = world.getBlockMetadata(x, y, z); - - byte b0 = 16; - - for (int i1 = 0; i1 < b0; ++i1) - { - for (int j1 = 0; j1 < b0; ++j1) - { - for (int k1 = 0; k1 < b0; ++k1) - { - double d0 = (double)bx + ((double)i1 + 0.5D) / 4F; - double d1 = (double)by + ((double)j1 + 0.5D) / 4F; - double d2 = (double)bz + ((double)k1 + 0.5D) / 4F; - effectRenderer.addEffect((new EntityDiggingFX(world, d0, d1, d2, d0 - (double)x - 0.5D, d1 - (double)y - 0.5D, d2 - (double)z - 0.5D, blockThere, metaThere)).applyColourMultiplier(x, y, z)); - } - } - } - - - return true; - } - - - /** - * Called when the block is attempted to be harvested - */ - public void onBlockHarvested(World world, int x, int y, int z, int meta, EntityPlayer player) { - this.setGiantBlockToAir(world, x, y, z); - } - - /** - * Called when the block is destroyed by an explosion. - * Useful for allowing the block to take into account tile entities, - * metadata, etc. when exploded, before it is removed. - * - * @param world The current world - * @param x X Position - * @param y Y Position - * @param z Z Position - * @param Explosion The explosion instance affecting the block - */ - public void onBlockExploded(World world, int x, int y, int z, Explosion explosion) - { - world.setBlockToAir(x, y, z); - this.setGiantBlockToAir(world, x, y, z); - } - - - /** - * Called on server worlds only when the block is about to be replaced by a different block or the same block with a - * different metadata value. Args: world, x, y, z, old metadata - */ - public void onBlockPreDestroy(World world, int x, int y, int z, int meta) { - if (!this.isSelfDestructing && !canBlockStay(world, x, y, z)) { - this.setGiantBlockToAir(world, x, y, z); - } - } - - /** - * Set the whole giant block area to air - */ - private void setGiantBlockToAir(World world, int x, int y, int z) { - // this flag is maybe not totally perfect - this.isSelfDestructing = true; - - int bx = (x >> 2) << 2; - int by = (y >> 2) << 2; - int bz = (z >> 2) << 2; - - for (int dx = 0; dx < 4; dx++) { - for (int dy = 0; dy < 4; dy++) { - for (int dz = 0; dz < 4; dz++) { - if (!(x == bx + dx && y == by + dy && z == bz + dz)) { - if (world.getBlock(bx + dx, by + dy, bz + dz) == this) { - world.setBlockToAir(bx + dx, by + dy, bz + dz); - } - } - } - } - } - - this.isSelfDestructing = false; - } - - - /** - * Can this block stay at this position. Similar to canPlaceBlockAt except gets checked often with plants. - */ - public boolean canBlockStay(World world, int x, int y, int z) { - boolean allThisBlock = true; - - int bx = (x >> 2) << 2; - int by = (y >> 2) << 2; - int bz = (z >> 2) << 2; - - for (int dx = 0; dx < 4; dx++) { - for (int dy = 0; dy < 4; dy++) { - for (int dz = 0; dz < 4; dz++) { - allThisBlock &= world.getBlock(bx + dx, by + dy, bz + dz) == this; - } - } - } - - return allThisBlock; - } - - /** - * Returns the mobility information of the block, 0 = free, 1 = can't push but can move over, 2 = total immobility - * and stop pistons - */ - public int getMobilityFlag() - { - return 2; - } -} diff --git a/src/main/java/twilightforest/block/BlockTFGiantCobble.java b/src/main/java/twilightforest/block/BlockTFGiantCobble.java deleted file mode 100644 index 7a7e597d75..0000000000 --- a/src/main/java/twilightforest/block/BlockTFGiantCobble.java +++ /dev/null @@ -1,17 +0,0 @@ -package twilightforest.block; - -import twilightforest.item.TFItems; -import net.minecraft.init.Blocks; - -public class BlockTFGiantCobble extends BlockTFGiantBlock { - - - protected BlockTFGiantCobble() { - super(Blocks.cobblestone); - this.setHardness(2.0F * 64F); - this.setResistance(10.0F); - - this.setCreativeTab(TFItems.creativeTab); - } - -} diff --git a/src/main/java/twilightforest/block/BlockTFGiantLeaves.java b/src/main/java/twilightforest/block/BlockTFGiantLeaves.java deleted file mode 100644 index b4d056f3d9..0000000000 --- a/src/main/java/twilightforest/block/BlockTFGiantLeaves.java +++ /dev/null @@ -1,97 +0,0 @@ -package twilightforest.block; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import twilightforest.item.TFItems; -import net.minecraft.init.Blocks; -import net.minecraft.world.ColorizerFoliage; -import net.minecraft.world.IBlockAccess; - -public class BlockTFGiantLeaves extends BlockTFGiantBlock { - - public BlockTFGiantLeaves() { - super(Blocks.leaves); - - this.setHardness(0.2F * 64F); - this.setLightOpacity(1); - - this.setCreativeTab(TFItems.creativeTab); - } - - /** - * Is this block (a) opaque and (b) a full 1m cube? This determines whether or not to render the shared face of two - * adjacent blocks and also whether the player can attach torches, redstone wire, etc to this block. - */ - public boolean isOpaqueCube() - { - return false; - } - - - @SideOnly(Side.CLIENT) - public int getBlockColor() - { - double d0 = 0.5D; - double d1 = 1.0D; - return ColorizerFoliage.getFoliageColor(d0, d1); - } - - /** - * Returns the color this block should be rendered. Used by leaves. - */ - @SideOnly(Side.CLIENT) - public int getRenderColor(int p_149741_1_) - { - return ColorizerFoliage.getFoliageColorBasic(); - } - - /** - * Returns a integer with hex for 0xrrggbb with this color multiplied against the blocks color. Note only called - * when first determining what to render. - */ - @SideOnly(Side.CLIENT) - public int colorMultiplier(IBlockAccess world, int x, int y, int z) - { - int red = 0; - int grn = 0; - int blu = 0; - - for (int dz = -1; dz <= 1; ++dz) - { - for (int dx = -1; dx <= 1; ++dx) - { - int nearbyColor = world.getBiomeGenForCoords(x + dx, z + dz).getBiomeFoliageColor(x + dx, y, z + dz); - red += (nearbyColor & 16711680) >> 16; - grn += (nearbyColor & 65280) >> 8; - blu += nearbyColor & 255; - } - } - - return (red / 9 & 255) << 16 | (grn / 9 & 255) << 8 | blu / 9 & 255; - } - - - /** - * Returns true if the given side of this block type should be rendered, if the adjacent block is at the given - * coordinates. Args: blockAccess, x, y, z, side - */ - @SideOnly(Side.CLIENT) - public boolean shouldSideBeRendered(IBlockAccess world, int x, int y, int z, int side) { - switch (side) { - case 0: - return (y & 3) == 3; - case 1: - return (y & 3) == 0; - case 2: - return (z & 3) == 3; - case 3: - return (z & 3) == 0; - case 4: - return (x & 3) == 3; - case 5: - return (x & 3) == 0; - } - - return super.shouldSideBeRendered(world, x, y, z, side); - } -} diff --git a/src/main/java/twilightforest/block/BlockTFGiantLog.java b/src/main/java/twilightforest/block/BlockTFGiantLog.java deleted file mode 100644 index 04c2c754f2..0000000000 --- a/src/main/java/twilightforest/block/BlockTFGiantLog.java +++ /dev/null @@ -1,17 +0,0 @@ -package twilightforest.block; - -import twilightforest.item.TFItems; -import net.minecraft.init.Blocks; - -public class BlockTFGiantLog extends BlockTFGiantBlock { - - - - protected BlockTFGiantLog() { - super(Blocks.log); - this.setHardness(2.0F * 64F); - - this.setCreativeTab(TFItems.creativeTab); - } - -} diff --git a/src/main/java/twilightforest/block/BlockTFGiantObsidian.java b/src/main/java/twilightforest/block/BlockTFGiantObsidian.java deleted file mode 100644 index 6a680f5d34..0000000000 --- a/src/main/java/twilightforest/block/BlockTFGiantObsidian.java +++ /dev/null @@ -1,18 +0,0 @@ -package twilightforest.block; - -import twilightforest.item.TFItems; -import net.minecraft.init.Blocks; - -public class BlockTFGiantObsidian extends BlockTFGiantBlock { - - - - protected BlockTFGiantObsidian() { - super(Blocks.obsidian); - this.setHardness(50.0F * 64F * 64F); - this.setResistance(2000.0F * 64F * 64F); - - this.setCreativeTab(TFItems.creativeTab); - } - -} diff --git a/src/main/java/twilightforest/block/BlockTFHedge.java b/src/main/java/twilightforest/block/BlockTFHedge.java deleted file mode 100644 index 09b1cf6b60..0000000000 --- a/src/main/java/twilightforest/block/BlockTFHedge.java +++ /dev/null @@ -1,351 +0,0 @@ -package twilightforest.block; - -import java.util.List; -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockLeavesBase; -import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.entity.Entity; -import net.minecraft.entity.item.EntityItem; -import net.minecraft.entity.monster.EntitySpider; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.DamageSource; -import net.minecraft.util.IIcon; -import net.minecraft.util.MovingObjectPosition; -import net.minecraft.util.Vec3; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; -import twilightforest.TwilightForestMod; -import twilightforest.item.TFItems; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public class BlockTFHedge extends BlockLeavesBase { - - public int damageDone; - - public static IIcon sprHedge; - public static IIcon sprDarkwoodLeaves; - - protected BlockTFHedge() { - super(Material.cactus, false); - this.damageDone = 3; - this.setHardness(2F); - this.setResistance(10F); - this.setStepSound(Block.soundTypeGrass); - this.setCreativeTab(TFItems.creativeTab); - } - - /** - * Returns a bounding box from the pool of bounding boxes (this means this box can change after the pool has been - * cleared to be reused) - */ - @Override - public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) - { - int meta = world.getBlockMetadata(x, y, z); - switch (meta) { - case 0: - float f = 0.0625F; - return AxisAlignedBB.getBoundingBox(x, y, z, x + 1, y + 1 - f, z + 1); - default : - case 1 : - return AxisAlignedBB.getBoundingBox(x, y, z, x + 1, y + 1, z + 1); - } - - } - - /** - * Is this block (a) opaque and (b) a full 1m cube? This determines whether or not to render the shared face of two - * adjacent blocks and also whether the player can attach torches, redstone wire, etc to this block. - */ - @Override - public boolean isOpaqueCube() - { - return true; - } - - @SideOnly(Side.CLIENT) - - /** - * Returns true if the given side of this block type should be rendered, if the adjacent block is at the given - * coordinates. Args: blockAccess, x, y, z, side - */ - @Override - public boolean shouldSideBeRendered(IBlockAccess par1IBlockAccess, int par2, int par3, int par4, int par5) - { - Block i1 = par1IBlockAccess.getBlock(par2, par3, par4); - return !this.field_150121_P && i1 == this ? false : super.shouldSideBeRendered(par1IBlockAccess, par2, par3, par4, par5); - } - - /** - * Determines the damage on the item the block drops. Used in cloth and wood. - */ - @Override - public int damageDropped(int meta) { - if (meta == 2) { - // temporary workaround - meta = 0; - } - - if (meta == 1) { - // darkwood sapling for darkwood leaves - return 3; - } - - return meta; - } - - /** - * From the specified side and block metadata retrieves the blocks texture. Args: side, metadata - */ - @Override - public IIcon getIcon(int side, int meta) - { - switch (meta) { - case 1: - return BlockTFHedge.sprDarkwoodLeaves; - default : - case 0 : - return BlockTFHedge.sprHedge; - } - } - - @Override - public void onEntityCollidedWithBlock(World world, int x, int y, int z, Entity entity) - { - int meta = world.getBlockMetadata(x, y, z); - - if (meta == 2) { - // temporary workaround - meta = 0; - } - - if (meta == 0 && shouldDamage(entity)) { - entity.attackEntityFrom(DamageSource.cactus, damageDone); - } - } - - @Override - public void onEntityWalking(World world, int x, int y, int z, Entity entity) - { - int meta = world.getBlockMetadata(x, y, z); - if (meta == 2) { - // temporary workaround - meta = 0; - } - - if (meta == 0 && shouldDamage(entity)) { - entity.attackEntityFrom(DamageSource.cactus, damageDone); - } - } - - @Override - public void onBlockClicked(World world, int x, int y, int z, EntityPlayer entityplayer) - { - int meta = world.getBlockMetadata(x, y, z); - if (meta == 2) { - // temporary workaround - meta = 0; - } - - if (meta == 0 && !world.isRemote) { - world.scheduleBlockUpdate(x, y, z, this, 10); - } - } - - /** - * Called when the player destroys a block with an item that can harvest it. (i, j, k) are the coordinates of the - * block and l is the block's subtype/damage. - */ - @Override - public void harvestBlock(World world, EntityPlayer entityplayer, int i, int j, int k, int meta) - { - super.harvestBlock(world, entityplayer, i, j, k, meta); - if (meta == 2) { - // temporary workaround - meta = 0; - } - if (meta == 0) { - entityplayer.attackEntityFrom(DamageSource.cactus, damageDone); - } - } - - - /** - * This should be called 5 ticks after we've received a click event from a player. - * If we see player nearby swinging at a hedge block, prick them - */ - @SuppressWarnings("unchecked") - @Override - public void updateTick(World world, int x, int y, int z, Random random) - { - double range = 4.0; // do we need to get this with a better method than hardcoding it? - - // find players within harvest range - List nearbyPlayers = world.getEntitiesWithinAABB(EntityPlayer.class, AxisAlignedBB.getBoundingBox(x, y, z, x + 1, y + 1, z + 1).expand(range, range, range)); - - // are they swinging? - for (EntityPlayer player : nearbyPlayers) { - if (player.isSwingInProgress) { - // are they pointing at this block? - MovingObjectPosition mop = getPlayerPointVec(world, player, range); - - if (mop != null && world.getBlock(mop.blockX, mop.blockY, mop.blockZ) == this) { - // prick them! prick them hard! - player.attackEntityFrom(DamageSource.cactus, damageDone); - - // trigger this again! - world.scheduleBlockUpdate(x, y, z, this, 10); - } - } - } - } - - - /** - * What block is the player pointing the wand at? - * - * This very similar to player.rayTrace, but that method is not available on the server. - * - * @return - */ - private MovingObjectPosition getPlayerPointVec(World worldObj, EntityPlayer player, double range) { - Vec3 position = Vec3.createVectorHelper(player.posX, player.posY + player.getEyeHeight(), player.posZ); - Vec3 look = player.getLook(1.0F); - Vec3 dest = position.addVector(look.xCoord * range, look.yCoord * range, look.zCoord * range); - return worldObj.rayTraceBlocks(position, dest); - } - -// /** -// * Is the player swinging, server version. Ugggh. Okay, this sucks and we don't really need it -// */ -// private boolean isPlayerSwinging(EntityPlayer player) { -// if (player instanceof EntityPlayerMP) { -// ItemInWorldManager iiwm = ((EntityPlayerMP)player).itemInWorldManager; -// // curblockDamage > initialDamage -// return ((Integer)ModLoader.getPrivateValue(ItemInWorldManager.class, iiwm, 9)).intValue() > ((Integer)ModLoader.getPrivateValue(ItemInWorldManager.class, iiwm, 5)).intValue(); -// -//// for (int i = 0; i < ItemInWorldManager.class.getDeclaredFields().length; i++) { -//// // if we find a boolean in here, just assume that's it for the time being -//// if (ModLoader.getPrivateValue(ItemInWorldManager.class, iiwm, i) instanceof Boolean) { -//// return ((Boolean)ModLoader.getPrivateValue(ItemInWorldManager.class, iiwm, i)).booleanValue(); -//// } -//// } -// } -// // we didn't find it -// return false; -// } - - - private boolean shouldDamage(Entity entity) { - return !(entity instanceof EntitySpider) && !(entity instanceof EntityItem) && !entity.doesEntityNotTriggerPressurePlate(); - } - - /** - * Chance that fire will spread and consume this block. - * 300 being a 100% chance, 0, being a 0% chance. - * - * @param world The current world - * @param x The blocks X position - * @param y The blocks Y position - * @param z The blocks Z position - * @param metadata The blocks current metadata - * @param face The face that the fire is coming from - * @return A number ranging from 0 to 300 relating used to determine if the block will be consumed by fire - */ - @Override - public int getFlammability(IBlockAccess world, int x, int y, int z, ForgeDirection face) { - int metadata = world.getBlockMetadata(x, y, z); - return metadata == 1 ? 1 : 0; - } - - /** - * Called when fire is updating on a neighbor block. - * The higher the number returned, the faster fire will spread around this block. - * - * @param world The current world - * @param x The blocks X position - * @param y The blocks Y position - * @param z The blocks Z position - * @param metadata The blocks current metadata - * @param face The face that the fire is coming from - * @return A number that is used to determine the speed of fire growth around the block - */ - @Override - public int getFireSpreadSpeed(IBlockAccess world, int x, int y, int z, ForgeDirection face) { - return 0; - } - - /** - * Returns the quantity of items to drop on block destruction. - */ - @Override - public int quantityDropped(Random par1Random) - { - return par1Random.nextInt(40) == 0 ? 1 : 0; - } - - /** - * Returns the ID of the items to drop on destruction. - */ - @Override - public Item getItemDropped(int meta, Random par2Random, int par3) - { - if (meta == 1) - { - return Item.getItemFromBlock(TFBlocks.sapling); - } - else - { - return null; - } - } - - /** - * Called when a user uses the creative pick block button on this block - * - * @param target The full target the player is looking at - * @return A ItemStack to add to the player's inventory, Null if nothing should be added. - */ - @Override - public ItemStack getPickBlock(MovingObjectPosition target, World world, int x, int y, int z) - { - return new ItemStack(this, 1, world.getBlockMetadata(x, y, z)); - } - - /** - * Drops the block items with a specified chance of dropping the specified items - */ - @Override - public void dropBlockAsItemWithChance(World par1World, int par2, int par3, int par4, int meta, float par6, int fortune) - { - if (!par1World.isRemote && meta == 1) - { - if (par1World.rand.nextInt(40) == 0) - { - Item var9 = this.getItemDropped(meta, par1World.rand, fortune); - this.dropBlockAsItem(par1World, par2, par3, par4, new ItemStack(var9, 1, this.damageDropped(meta))); - } - } - } - - /** - * Properly register icon source - */ - @Override - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister par1IconRegister) - { - BlockTFHedge.sprHedge = par1IconRegister.registerIcon(TwilightForestMod.ID + ":hedge"); - BlockTFHedge.sprDarkwoodLeaves = par1IconRegister.registerIcon(TwilightForestMod.ID + ":darkwood_leaves"); - } - -} - diff --git a/src/main/java/twilightforest/block/BlockTFHugeGloomBlock.java b/src/main/java/twilightforest/block/BlockTFHugeGloomBlock.java deleted file mode 100644 index 506bbd6fca..0000000000 --- a/src/main/java/twilightforest/block/BlockTFHugeGloomBlock.java +++ /dev/null @@ -1,74 +0,0 @@ -package twilightforest.block; - -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.item.Item; -import net.minecraft.util.IIcon; -import net.minecraft.world.World; -import twilightforest.TwilightForestMod; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public class BlockTFHugeGloomBlock extends Block { - - @SideOnly(Side.CLIENT) - private IIcon capTex; - @SideOnly(Side.CLIENT) - private IIcon stemTex; - @SideOnly(Side.CLIENT) - private IIcon insideTex; - - public BlockTFHugeGloomBlock() - { - super(Material.wood); - this.setHardness(0.2F); - this.setStepSound(soundTypeWood); - this.setBlockTextureName(TwilightForestMod.ID + ":huge_gloom"); - this.setLightLevel(5F / 16F); - } - - /** - * Gets the block's texture. Args: side, meta - */ - @SideOnly(Side.CLIENT) - public IIcon getIcon(int side, int meta) { - return meta == 10 && side > 1 ? this.stemTex : (meta >= 1 && meta <= 9 && side == 1 ? this.capTex : (meta >= 1 && meta <= 3 && side == 2 ? this.capTex : (meta >= 7 && meta <= 9 && side == 3 ? this.capTex : ((meta == 1 || meta == 4 || meta == 7) && side == 4 ? this.capTex : ((meta == 3 || meta == 6 || meta == 9) && side == 5 ? this.capTex : (meta == 14 ? this.capTex : (meta == 15 ? this.stemTex : this.insideTex))))))); - } - - /** - * Returns the quantity of items to drop on block destruction. - */ - public int quantityDropped(Random rand) - { - int i = rand.nextInt(10) - 7; - - if (i < 0) - { - i = 0; - } - - return i; - } - - public Item getItemDropped(int p_149650_1_, Random p_149650_2_, int p_149650_3_) { - return Item.getItemById(Block.getIdFromBlock(TFBlocks.plant)); - } - - /** - * Gets an item for the block being called on. Args: world, x, y, z - */ - @SideOnly(Side.CLIENT) - public Item getItem(World p_149694_1_, int p_149694_2_, int p_149694_3_, int p_149694_4_) { - return Item.getItemById(Block.getIdFromBlock(TFBlocks.plant)); - } - - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister iconRegister) { - this.capTex = iconRegister.registerIcon(this.getTextureName() + "_cap"); - this.insideTex = iconRegister.registerIcon(this.getTextureName() + "_inside"); - this.stemTex = iconRegister.registerIcon(this.getTextureName() + "_stem"); - } -} \ No newline at end of file diff --git a/src/main/java/twilightforest/block/BlockTFHugeLilyPad.java b/src/main/java/twilightforest/block/BlockTFHugeLilyPad.java deleted file mode 100644 index ccd2e5ac68..0000000000 --- a/src/main/java/twilightforest/block/BlockTFHugeLilyPad.java +++ /dev/null @@ -1,263 +0,0 @@ -package twilightforest.block; - -import java.util.List; - -import twilightforest.TwilightForestMod; -import twilightforest.item.TFItems; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import net.minecraft.block.Block; -import net.minecraft.block.BlockBush; -import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.IIcon; -import net.minecraft.world.Explosion; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; - -public class BlockTFHugeLilyPad extends BlockBush { - - private IIcon pad1; - private IIcon pad2; - private IIcon pad3; - private IIcon blank; - private boolean isSelfDestructing = false; - - - protected BlockTFHugeLilyPad() { - super(Material.plants); - - float f = 0.5F; - float f1 = 0.015625F; - this.setBlockBounds(0.5F - f, 0.0F, 0.5F - f, 0.5F + f, f1, 0.5F + f); - this.setStepSound(soundTypeGrass); - - this.setCreativeTab(TFItems.creativeTab); - - Item lily; - - } - - /** - * The type of render function that is called for this block - */ - public int getRenderType() - { - return TwilightForestMod.proxy.getHugeLilyPadBlockRenderID(); - } - - - /** - * Returns a bounding box from the pool of bounding boxes (this means this box can change after the pool has been - * cleared to be reused) - */ - public AxisAlignedBB getCollisionBoundingBoxFromPool(World p_149668_1_, int p_149668_2_, int p_149668_3_, int p_149668_4_) - { - return AxisAlignedBB.getBoundingBox((double)p_149668_2_ + this.minX, (double)p_149668_3_ + this.minY, (double)p_149668_4_ + this.minZ, (double)p_149668_2_ + this.maxX, (double)p_149668_3_ + this.maxY, (double)p_149668_4_ + this.maxZ); - } - - /** - * returns a list of blocks with the same ID, but different meta (eg: wood returns 4 blocks) - */ - @SuppressWarnings({ "rawtypes", "unchecked" }) - @Override - public void getSubBlocks(Item par1, CreativeTabs par2CreativeTabs, List par3List) - { - par3List.add(new ItemStack(par1, 1, 0)); - } - - - /** - * From the specified side and block metadata retrieves the blocks texture. Args: side, metadata - */ - @Override - public IIcon getIcon(int side, int meta) { - // sides blank - if (side > 1) { - return this.blank; - } - - int orient = meta >> 2; - int piece = meta & 3; - - // why can't this just be simple? - if (orient == 1) { - orient = 3; - } else if (orient == 3) { - orient = 1; - } - - - int display = (piece + orient) % 4; - - - switch (display) { - case 0: - default: - return this.blockIcon; - case 1: - return this.pad1; - case 2: - return this.pad2; - case 3: - return this.pad3; - } - } - - @Override - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister par1IconRegister) - { - this.blockIcon = par1IconRegister.registerIcon(TwilightForestMod.ID + ":huge_lilypad_0"); - this.pad1 = par1IconRegister.registerIcon(TwilightForestMod.ID + ":huge_lilypad_1"); - this.pad2 = par1IconRegister.registerIcon(TwilightForestMod.ID + ":huge_lilypad_2"); - this.pad3 = par1IconRegister.registerIcon(TwilightForestMod.ID + ":huge_lilypad_3"); - this.blank = par1IconRegister.registerIcon(TwilightForestMod.ID + ":blank"); - } - - /** - * is the block grass, dirt or farmland - */ - protected boolean canPlaceBlockOn(Block block) - { - return block == Blocks.water; - } - - /** - * Called when the block is attempted to be harvested - */ - public void onBlockHarvested(World world, int x, int y, int z, int meta, EntityPlayer player) { - this.setGiantBlockToAir(world, x, y, z); - } - - /** - * Called when the block is destroyed by an explosion. - * Useful for allowing the block to take into account tile entities, - * metadata, etc. when exploded, before it is removed. - * - * @param world The current world - * @param x X Position - * @param y Y Position - * @param z Z Position - * @param Explosion The explosion instance affecting the block - */ - public void onBlockExploded(World world, int x, int y, int z, Explosion explosion) - { - world.setBlockToAir(x, y, z); - this.setGiantBlockToAir(world, x, y, z); - } - - - /** - * Called on server worlds only when the block is about to be replaced by a different block or the same block with a - * different metadata value. Args: world, x, y, z, old metadata - */ - public void onBlockPreDestroy(World world, int x, int y, int z, int meta) { - - int orient = meta >> 2; - int piece = meta & 3; - - int display = (piece + orient) % 4; - - if (!this.isSelfDestructing && !canBlockStay(world, x, y, z)) { - this.setGiantBlockToAir(world, x, y, z); - } - } - - /** - * Set the whole giant block area to air - */ - private void setGiantBlockToAir(World world, int x, int y, int z) { - // this flag is maybe not totally perfect - this.isSelfDestructing = true; - - int bx = (x >> 1) << 1; - int bz = (z >> 1) << 1; - - // this is the best loop over 3 items that I've ever programmed! - for (int dx = 0; dx < 2; dx++) { - for (int dz = 0; dz < 2; dz++) { - if (!(x == bx + dx && z == bz + dz)) { - if (world.getBlock(bx + dx, y, bz + dz) == this) { - world.setBlock(bx + dx, y, bz + dz, Blocks.air, 0, 2); - } - } - } - } - - this.isSelfDestructing = false; - } - - - /** - * Can this block stay at this position. Similar to canPlaceBlockAt except gets checked often with plants. - */ - public boolean canBlockStay(World world, int x, int y, int z) { - boolean allThisBlock = true; - boolean allWater = true; - - int bx = (x >> 1) << 1; - int bz = (z >> 1) << 1; - - for (int dx = 0; dx < 2; dx++) { - for (int dz = 0; dz < 2; dz++) { - allThisBlock &= world.getBlock(bx + dx, y, bz + dz) == this; - allWater &= (world.getBlock(bx + dx, y - 1, bz + dz).getMaterial() == Material.water && world.getBlockMetadata(bx + dx, y - 1, bz + dz) == 0); - } - } - - return allThisBlock && allWater; - } - - /** - * checks if the block can stay, if not drop as item - */ - protected void checkAndDropBlock(World p_149855_1_, int p_149855_2_, int p_149855_3_, int p_149855_4_) - { - if (!this.canBlockStay(p_149855_1_, p_149855_2_, p_149855_3_, p_149855_4_)) - { - //this.dropBlockAsItem(p_149855_1_, p_149855_2_, p_149855_3_, p_149855_4_, p_149855_1_.getBlockMetadata(p_149855_2_, p_149855_3_, p_149855_4_), 0); - p_149855_1_.setBlock(p_149855_2_, p_149855_3_, p_149855_4_, getBlockById(0), 0, 2); - } - } - - /** - * Returns the mobility information of the block, 0 = free, 1 = can't push but can move over, 2 = total immobility - * and stop pistons - */ - public int getMobilityFlag() - { - return 2; - } - - @SideOnly(Side.CLIENT) - public int getBlockColor() - { - return 2129968; - } - - /** - * Returns the color this block should be rendered. Used by leaves. - */ - @SideOnly(Side.CLIENT) - public int getRenderColor(int p_149741_1_) - { - return 2129968; - } - - /** - * Returns a integer with hex for 0xrrggbb with this color multiplied against the blocks color. Note only called - * when first determining what to render. - */ - @SideOnly(Side.CLIENT) - public int colorMultiplier(IBlockAccess p_149720_1_, int p_149720_2_, int p_149720_3_, int p_149720_4_) - { - return 2129968; - } -} diff --git a/src/main/java/twilightforest/block/BlockTFHugeStalk.java b/src/main/java/twilightforest/block/BlockTFHugeStalk.java deleted file mode 100644 index c09ab68d60..0000000000 --- a/src/main/java/twilightforest/block/BlockTFHugeStalk.java +++ /dev/null @@ -1,86 +0,0 @@ -package twilightforest.block; - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.util.IIcon; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; -import twilightforest.TwilightForestMod; -import twilightforest.item.TFItems; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public class BlockTFHugeStalk extends Block { - - private IIcon topIcon; - - protected BlockTFHugeStalk() { - super(Material.wood); - - this.setHardness(1.25F); - this.setResistance(7.0F); - - this.setBlockTextureName(TwilightForestMod.ID + ":huge_stalk"); - - this.setStepSound(soundTypeGrass); - this.setCreativeTab(TFItems.creativeTab); - } - - @Override - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister par1IconRegister) { - super.registerBlockIcons(par1IconRegister); - - this.topIcon = par1IconRegister.registerIcon(this.getTextureName() + "_top"); - - } - - /** - * Gets the block's texture. Args: side, meta - */ - @SideOnly(Side.CLIENT) - public IIcon getIcon(int side, int meta) { - if (side == 0 || side == 1) { - return this.topIcon; - } else { - return this.blockIcon; - } - } - - /** - * Determines if this block can prevent leaves connected to it from decaying. - * - * @param world The current world - * @param x X Position - * @param y Y Position - * @param z Z Position - * @return true if the presence this block can prevent leaves from decaying. - */ - @Override - public boolean canSustainLeaves(IBlockAccess world, int x, int y, int z) { - return true; - } - - /** - * Begin leaf decay when this block is broken - */ - public void breakBlock(World world, int x, int y, int z, Block myBlock, int meta) { - byte radius = 4; - int rad1 = radius + 1; - - if (world.checkChunksExist(x - rad1, y - rad1, z - rad1, x + rad1, y + rad1, z + rad1)) { - for (int dx = -radius; dx <= radius; ++dx) { - for (int dy = -radius; dy <= radius; ++dy) { - for (int dz = -radius; dz <= radius; ++dz) { - Block block = world.getBlock(x + dx, y + dy, z + dz); - if (block.isLeaves(world, x + dx, y + dy, z + dz)) { - block.beginLeavesDecay(world, x + dx, y + dy, z + dz); - } - } - } - } - } - } - -} diff --git a/src/main/java/twilightforest/block/BlockTFHugeWaterLily.java b/src/main/java/twilightforest/block/BlockTFHugeWaterLily.java deleted file mode 100644 index 78c3b23275..0000000000 --- a/src/main/java/twilightforest/block/BlockTFHugeWaterLily.java +++ /dev/null @@ -1,48 +0,0 @@ -package twilightforest.block; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockBush; -import net.minecraft.block.material.Material; -import net.minecraft.init.Blocks; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; -import twilightforest.item.TFItems; - -public class BlockTFHugeWaterLily extends BlockBush { - - protected BlockTFHugeWaterLily() { - super(Material.plants); - - this.setStepSound(soundTypeGrass); - this.setCreativeTab(TFItems.creativeTab); - - float radius = 0.4F; - this.setBlockBounds(0.5F - radius, 0.5F - radius, 0.5F - radius, 0.5F + radius, .5F + radius, 0.5F + radius); - } - - /** - * Returns a bounding box from the pool of bounding boxes (this means this box can change after the pool has been - * cleared to be reused) - */ - public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) - { - return null; - } - - /** - * Can this block stay at this position. Similar to canPlaceBlockAt except gets checked often with plants. - */ - public boolean canBlockStay(World world, int x, int y, int z) { - return world.getBlock(x, y - 1, z).getMaterial() == Material.water && world.getBlockMetadata(x, y - 1, z) == 0; - } - - - /** - * is the block grass, dirt or farmland - */ - protected boolean canPlaceBlockOn(Block p_149854_1_) - { - return p_149854_1_ == Blocks.water; - } -} diff --git a/src/main/java/twilightforest/block/BlockTFKnightmetalBlock.java b/src/main/java/twilightforest/block/BlockTFKnightmetalBlock.java deleted file mode 100644 index 97ba4d80c6..0000000000 --- a/src/main/java/twilightforest/block/BlockTFKnightmetalBlock.java +++ /dev/null @@ -1,90 +0,0 @@ -package twilightforest.block; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import net.minecraft.block.Block; -import net.minecraft.block.BlockCompressed; -import net.minecraft.block.material.MapColor; -import net.minecraft.entity.Entity; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.DamageSource; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; -import twilightforest.TwilightForestMod; -import twilightforest.item.TFItems; - -public class BlockTFKnightmetalBlock extends BlockCompressed { - - private static final float BLOCK_DAMAGE = 4; - - public BlockTFKnightmetalBlock() { - super(MapColor.ironColor); - this.setHardness(5.0F); - this.setResistance(41.0F); - this.setStepSound(Block.soundTypeMetal); - this.setBlockTextureName(TwilightForestMod.ID + ":knightmetal_block"); - this.setCreativeTab(TFItems.creativeTab); - - } - - /** - * Returns a bounding box from the pool of bounding boxes (this means this box can change after the pool has been - * cleared to be reused) - */ - @Override - public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) - { - float f = 1F / 16F; - return AxisAlignedBB.getBoundingBox(x + f, y + f, z + f, x + 1 - f, y + 1 - f, z + 1 - f); - - } - - /** - * Triggered whenever an entity collides with this block (enters into the block). Args: world, x, y, z, entity - */ - public void onEntityCollidedWithBlock(World world, int x, int y, int z, Entity entity) - { - entity.attackEntityFrom(DamageSource.cactus, BLOCK_DAMAGE); - } - - /** - * If this block doesn't render as an ordinary block it will return False (examples: signs, buttons, stairs, etc) - */ - @Override - public boolean renderAsNormalBlock() - { - return false; - } - - - /** - * Is this block (a) opaque and (b) a full 1m cube? This determines whether or not to render the shared face of two - * adjacent blocks and also whether the player can attach torches, redstone wire, etc to this block. - */ - @Override - public boolean isOpaqueCube() - { - return false; - } - - - /** - * The type of render function that is called for this block - */ - @Override - public int getRenderType() - { - return TwilightForestMod.proxy.getKnightmetalBlockRenderID(); - } - - /** - * Returns true if the given side of this block type should be rendered, if the adjacent block is at the given - * coordinates. Args: blockAccess, x, y, z, side - */ - @Override - @SideOnly(Side.CLIENT) - public boolean shouldSideBeRendered(IBlockAccess par1IBlockAccess, int par2, int par3, int par4, int par5) - { - return true; - } -} diff --git a/src/main/java/twilightforest/block/BlockTFLeaves.java b/src/main/java/twilightforest/block/BlockTFLeaves.java deleted file mode 100644 index 3bd6ecf115..0000000000 --- a/src/main/java/twilightforest/block/BlockTFLeaves.java +++ /dev/null @@ -1,223 +0,0 @@ -package twilightforest.block; - -import java.util.List; -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockLeaves; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.init.Blocks; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.IIcon; -import net.minecraft.world.ColorizerFoliage; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; -import twilightforest.item.TFItems; - - - - -public class BlockTFLeaves extends BlockLeaves { - - int oakColor = 0x48B518; - int canopyColor = 0x609860; - int mangroveColor = 0x80A755; - - public static final String[] unlocalizedNameArray = new String[] {"twilightoak", "canopy", "mangrove", "rainboak"}; - - - protected BlockTFLeaves() { - super(); - this.setHardness(0.2F); - this.setLightOpacity(2); - this.setStepSound(Block.soundTypeGrass); - this.setCreativeTab(TFItems.creativeTab); - } - - @Override - public int getBlockColor() - { - double var1 = 0.5D; - double var3 = 1.0D; - return ColorizerFoliage.getFoliageColor(var1, var3); - } - - /** - * Returns the color this block should be rendered. Used by leaves. - */ - @Override - public int getRenderColor(int par1) - { - return (par1 & 3) == 1 ? canopyColor : ((par1 & 3) == 2 ? mangroveColor : oakColor); - } - - /** - * Returns a integer with hex for 0xrrggbb with this color multiplied against the blocks color. Note only called - * when first determining what to render. - */ - @Override - public int colorMultiplier(IBlockAccess par1IBlockAccess, int x, int y, int z) - { - int meta = par1IBlockAccess.getBlockMetadata(x, y, z); - - int red = 0; - int green = 0; - int blue = 0; - - for (int var9 = -1; var9 <= 1; ++var9) - { - for (int var10 = -1; var10 <= 1; ++var10) - { - int var11 = par1IBlockAccess.getBiomeGenForCoords(x + var10, z + var9).getBiomeFoliageColor(x, y, z); - red += (var11 & 16711680) >> 16; - green += (var11 & 65280) >> 8; - blue += var11 & 255; - } - } - - int normalColor = (red / 9 & 0xFF) << 16 | (green / 9 & 0xFF) << 8 | blue / 9 & 0xFF; - - if ((meta & 3) == 1) - { - // canopy colorizer - return ((normalColor & 0xFEFEFE) + 0x469A66) / 2; - //return ((normalColor & 0xFEFEFE) + 0x009822) / 2; - } - else if ((meta & 3) == 2) - { - // mangrove colors - return ((normalColor & 0xFEFEFE) + 0xC0E694) / 2; - } - else if ((meta & 3) == 3) - { - // RAINBOW! - red = x * 32 + y * 16; - if ((red & 256) != 0) - { - red = 255 - (red & 255); - } - red &= 255; - - blue = y * 32 + z * 16; - if ((blue & 256) != 0) - { - blue = 255 - (blue & 255); - } - blue ^= 255; - - green = x * 16 + z * 32; - if ((green & 256) != 0) - { - green = 255 - (green & 255); - } - green &= 255; - - - return red << 16 | blue << 8 | green; - } - else - { - return normalColor; - } - } - - /** - * Is this block (a) opaque and (b) a full 1m cube? This determines whether or not to render the shared face of two - * adjacent blocks and also whether the player can attach torches, redstone wire, etc to this block. - */ - @Override - public boolean isOpaqueCube() - { - return Blocks.leaves.isOpaqueCube(); - } - - @Override - public IIcon getIcon(int i, int j) - { - return Blocks.leaves.getIcon(i, (j & 3) == 3 ? 0 : j); - } - - @Override - public boolean shouldSideBeRendered(IBlockAccess iblockaccess, int i, int j, int k, int l) - { - return Blocks.leaves.shouldSideBeRendered(iblockaccess, i, j, k, l); - } - - /** - * returns a list of blocks with the same ID, but different meta (eg: wood returns 4 blocks) - */ - @SuppressWarnings({ "rawtypes", "unchecked" }) - @Override - public void getSubBlocks(Item par1, CreativeTabs par2CreativeTabs, List par3List) - { - par3List.add(new ItemStack(par1, 1, 0)); - par3List.add(new ItemStack(par1, 1, 1)); - par3List.add(new ItemStack(this, 1, 2)); - par3List.add(new ItemStack(this, 1, 3)); - - } - - /** - * Returns the quantity of items to drop on block destruction. - */ - @Override - public int quantityDropped(Random par1Random) - { - return par1Random.nextInt(40) == 0 ? 1 : 0; - } - - /** - * Returns the ID of the items to drop on destruction. - */ - @Override - public Item getItemDropped(int par1, Random par2Random, int par3) - { - return Item.getItemFromBlock(TFBlocks.sapling); - } - - /** - * Determines the damage on the item the block drops. Used in cloth and wood. - */ - @Override - public int damageDropped(int par1) - { - int leafType = par1 & 3; - - return leafType; - } - - /** - * Drops the block items with a specified chance of dropping the specified items - */ - @Override - public void dropBlockAsItemWithChance(World par1World, int par2, int par3, int par4, int meta, float par6, int par7) - { - if (!par1World.isRemote) - { - byte chance = 40; - - if ((meta & 3) == 2) - { - chance = 20; - } - - if (par1World.rand.nextInt(chance) == 0) - { - Item item = this.getItemDropped(meta, par1World.rand, par7); - this.dropBlockAsItem(par1World, par2, par3, par4, new ItemStack(item, 1, this.getSaplingMeta(meta))); - } - } - } - - public int getSaplingMeta(int leafMeta) { - int leafType = leafMeta & 3; - - return leafType == 3 ? 9 : leafType; - } - - @Override - public String[] func_150125_e() { - return unlocalizedNameArray; - } -} diff --git a/src/main/java/twilightforest/block/BlockTFLeaves3.java b/src/main/java/twilightforest/block/BlockTFLeaves3.java deleted file mode 100644 index 7469652d39..0000000000 --- a/src/main/java/twilightforest/block/BlockTFLeaves3.java +++ /dev/null @@ -1,129 +0,0 @@ -package twilightforest.block; - -import java.util.List; -import java.util.Random; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import net.minecraft.block.Block; -import net.minecraft.block.BlockLeaves; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.init.Blocks; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.IIcon; -import net.minecraft.world.ColorizerFoliage; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; -import twilightforest.item.TFItems; - -public class BlockTFLeaves3 extends BlockLeaves { - - public static final String[] names = new String[] {"thorn", "beanstalk"}; - - protected BlockTFLeaves3() { - super(); - this.setStepSound(Block.soundTypeGrass); - this.setCreativeTab(TFItems.creativeTab); - } - - public String[] func_150125_e() - { - return names; - } - - /** - * Returns the color this block should be rendered. Used by leaves. - */ - @SideOnly(Side.CLIENT) - public int getRenderColor(int meta) - { - return (meta & 3) == 1 ? ColorizerFoliage.getFoliageColorPine() : ((meta & 3) == 2 ? ColorizerFoliage.getFoliageColorBirch() : super.getRenderColor(meta)); - } - - /** - * Returns a integer with hex for 0xrrggbb with this color multiplied against the blocks color. Note only called - * when first determining what to render. - */ - @SideOnly(Side.CLIENT) - public int colorMultiplier(IBlockAccess world, int x, int y, int z) - { - int meta = world.getBlockMetadata(x, y, z); - return (meta & 3) == 1 ? ColorizerFoliage.getFoliageColorPine() : ((meta & 3) == 2 ? ColorizerFoliage.getFoliageColorBirch() : super.colorMultiplier(world, x, y, z)); - } - - - /** - * Determines the damage on the item the block drops. Used in cloth and wood. - */ - public int damageDropped(int p_149692_1_) - { - return super.damageDropped(p_149692_1_) + 4; - } - - @Override - public boolean isOpaqueCube() - { - return Blocks.leaves.isOpaqueCube(); - } - - /** - * Get the block's damage value (for use with pick block). - */ - public int getDamageValue(World world, int x, int y, int z) - { - return world.getBlockMetadata(x, y, z) & 3; - } - - /** - * Returns the quantity of items to drop on block destruction. - */ - public int quantityDropped(Random rand) - { - return 0; - } - - /** - * Returns true if the given side of this block type should be rendered, if the adjacent block is at the given - * coordinates. Args: blockAccess, x, y, z, side - */ - @Override - public boolean shouldSideBeRendered(IBlockAccess iblockaccess, int i, int j, int k, int side) - { - return Blocks.leaves.shouldSideBeRendered(iblockaccess, i, j, k, side); - } - - /** - * Returns the ID of the items to drop on destruction. - */ - @Override - public Item getItemDropped(int par1, Random par2Random, int par3) - { - return TFItems.magicBeans; - } - - @Override - public IIcon getIcon(int i, int j) - { - return Blocks.leaves.getIcon(i, 0 & 3); - } - - /** - * returns a list of blocks with the same ID, but different meta (eg: wood returns 4 blocks) - */ - @SuppressWarnings({ "unchecked", "rawtypes" }) - @Override - public void getSubBlocks(Item par1, CreativeTabs par2CreativeTabs, List par3List) - { - for (int i = 0; i < names.length; i++) { - par3List.add(new ItemStack(par1, 1, i)); - } - } - - @Override - public boolean canBeReplacedByLeaves(IBlockAccess world, int x, int y, int z) { - return true; - } - - -} diff --git a/src/main/java/twilightforest/block/BlockTFLog.java b/src/main/java/twilightforest/block/BlockTFLog.java deleted file mode 100644 index 69959ab59f..0000000000 --- a/src/main/java/twilightforest/block/BlockTFLog.java +++ /dev/null @@ -1,99 +0,0 @@ -package twilightforest.block; - -import java.util.List; -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockLog; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.IIcon; -import twilightforest.TwilightForestMod; -import twilightforest.item.TFItems; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public class BlockTFLog extends BlockLog { - - - public static IIcon sprOakSide; - public static IIcon sprOakTop; - public static IIcon sprCanopySide; - public static IIcon sprCanopyTop; - public static IIcon sprMangroveSide; - public static IIcon sprMangroveTop; - public static IIcon sprDarkwoodSide; - public static IIcon sprDarkwoodTop; - - //public static int sprRottenSide = 15; - - protected BlockTFLog() { - super(); - this.setHardness(2.0F); - this.setStepSound(Block.soundTypeWood); - this.setCreativeTab(TFItems.creativeTab); - } - - /** - * From the specified side and block metadata retrieves the blocks texture. Args: side, metadata - */ - @Override - public IIcon getIcon(int side, int meta) - { - int orient = meta & 12; - int woodType = meta & 3; - - switch (woodType) - { - default: - case 0 : - return orient == 0 && (side == 1 || side == 0) ? sprOakTop : (orient == 4 && (side == 5 || side == 4) ? sprOakTop : (orient == 8 && (side == 2 || side == 3) ? sprOakTop : sprOakSide)); - case 1 : - return orient == 0 && (side == 1 || side == 0) ? sprCanopyTop : (orient == 4 && (side == 5 || side == 4) ? sprCanopyTop : (orient == 8 && (side == 2 || side == 3) ? sprCanopyTop : sprCanopySide)); - case 2 : - return orient == 0 && (side == 1 || side == 0) ? sprMangroveTop : (orient == 4 && (side == 5 || side == 4) ? sprMangroveTop : (orient == 8 && (side == 2 || side == 3) ? sprMangroveTop : sprMangroveSide)); - case 3 : - return orient == 0 && (side == 1 || side == 0) ? sprDarkwoodTop : (orient == 4 && (side == 5 || side == 4) ? sprDarkwoodTop : (orient == 8 && (side == 2 || side == 3) ? sprDarkwoodTop : sprDarkwoodSide)); - } - } - - - @Override - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister par1IconRegister) - { - BlockTFLog.sprOakSide = par1IconRegister.registerIcon(TwilightForestMod.ID + ":oak_side"); - BlockTFLog.sprOakTop = par1IconRegister.registerIcon(TwilightForestMod.ID + ":oak_top"); - BlockTFLog.sprCanopySide = par1IconRegister.registerIcon(TwilightForestMod.ID + ":canopy_side"); - BlockTFLog.sprCanopyTop = par1IconRegister.registerIcon(TwilightForestMod.ID + ":canopy_top"); - BlockTFLog.sprMangroveSide = par1IconRegister.registerIcon(TwilightForestMod.ID + ":mangrove_side"); - BlockTFLog.sprMangroveTop = par1IconRegister.registerIcon(TwilightForestMod.ID + ":mangrove_top"); - BlockTFLog.sprDarkwoodSide = par1IconRegister.registerIcon(TwilightForestMod.ID + ":darkwood_side"); - BlockTFLog.sprDarkwoodTop = par1IconRegister.registerIcon(TwilightForestMod.ID + ":darkwood_top"); - } - - - /** - * Returns the ID of the items to drop on destruction. - */ - @Override - public Item getItemDropped(int par1, Random par2Random, int par3) - { - return Item.getItemFromBlock(TFBlocks.log); // hey that's my block ID! - } - - /** - * returns a list of blocks with the same ID, but different meta (eg: wood returns 4 blocks) - */ - @Override - public void getSubBlocks(Item par1, CreativeTabs par2CreativeTabs, List par3List) - { - par3List.add(new ItemStack(par1, 1, 0)); - par3List.add(new ItemStack(par1, 1, 1)); - par3List.add(new ItemStack(par1, 1, 2)); - par3List.add(new ItemStack(par1, 1, 3)); - } - -} diff --git a/src/main/java/twilightforest/block/BlockTFMagicLeaves.java b/src/main/java/twilightforest/block/BlockTFMagicLeaves.java deleted file mode 100644 index 1fa2554fb3..0000000000 --- a/src/main/java/twilightforest/block/BlockTFMagicLeaves.java +++ /dev/null @@ -1,306 +0,0 @@ -package twilightforest.block; - -import java.util.List; -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockLeaves; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.init.Blocks; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.IIcon; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; -import twilightforest.TwilightForestMod; -import twilightforest.item.TFItems; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - - - - -public class BlockTFMagicLeaves extends BlockLeaves { - - int oakColor = 0x48B518; - int canopyColor = 0x609860; - int mangroveColor = 0x80A755; - - public static final int META_TIME = 0; - public static final int META_TRANS = 1; - public static final int META_MINE = 2; - public static final int META_SORT = 3; - - public static IIcon SPR_TIMELEAVES; - public static IIcon SPR_TIMEFX; - public static IIcon SPR_TRANSLEAVES; - public static IIcon SPR_TRANSFX; - public static IIcon SPR_SORTLEAVES; - public static IIcon SPR_SORTFX; - - - protected BlockTFMagicLeaves() { - super(); - this.setHardness(0.2F); - this.setLightOpacity(2); - this.setStepSound(Block.soundTypeGrass); - this.setCreativeTab(TFItems.creativeTab); - } - - - /** - * Returns the color this block should be rendered. Used by leaves. - */ - @Override - public int getRenderColor(int par1) - { - switch (par1 & 3) - { - case META_TIME : - return 106 << 16 | 156 << 8 | 23; - case META_TRANS : - return 108 << 16 | 204 << 8 | 234; - case META_MINE : - return 252 << 16 | 241 << 8 | 68; - case META_SORT : - return 54 << 16 | 76 << 8 | 3; - } - - return 16777215; - } - - /** - * Returns a integer with hex for 0xrrggbb with this color multiplied against the blocks color. Note only called - * when first determining what to render. - */ - @Override - public int colorMultiplier(IBlockAccess world, int x, int y, int z) - { - int leafType = world.getBlockMetadata(x, y, z) & 0x03; - - int red = 0; - int green = 0; - int blue = 0; - - if (leafType == META_TIME) - { - int fade = x * 16 + y * 16 + z * 16; - if ((fade & 256) != 0) - { - fade = 255 - (fade & 255); - } - fade &= 255; - - float spring = (255 - fade) / 255F; - float fall = fade / 255F; - - red = (int) (spring * 106 + fall * 251); - green = (int) (spring * 156 + fall * 108); - blue = (int) (spring * 23 + fall * 27); - } - else if (leafType == META_MINE) - { - int fade = x * 31 + y * 33 + z * 32; - if ((fade & 256) != 0) - { - fade = 255 - (fade & 255); - } - fade &= 255; - - float spring = (255 - fade) / 255F; - float fall = fade / 255F; - - red = (int) (spring * 252 + fall * 237); - green = (int) (spring * 241 + fall * 172); - blue = (int) (spring * 68 + fall * 9); - } - else if (leafType == META_TRANS) - { - int fade = x * 27 + y * 63 + z * 39; - if ((fade & 256) != 0) - { - fade = 255 - (fade & 255); - } - fade &= 255; - - float spring = (255 - fade) / 255F; - float fall = fade / 255F; - - red = (int) (spring * 108 + fall * 96); - green = (int) (spring * 204 + fall * 107); - blue = (int) (spring * 234 + fall * 121); - } - else if (leafType == META_SORT) - { - int fade = x * 63 + y * 63 + z * 63; - if ((fade & 256) != 0) - { - fade = 255 - (fade & 255); - } - fade &= 255; - - float spring = (255 - fade) / 255F; - float fall = fade / 255F; - - red = (int) (spring * 54 + fall * 168); - green = (int) (spring * 76 + fall * 199); - blue = (int) (spring * 3 + fall * 43); - } - - return red << 16 | green << 8 | blue; - - } - - /** - * The type of render function that is called for this block - */ - @Override - public int getRenderType() { - return TwilightForestMod.proxy.getMagicLeavesBlockRenderID(); - } - - /** - * Returns which pass should this block be rendered on. 0 for solids and 1 for alpha - */ - @Override - public int getRenderBlockPass() - { - return 0; - } - - - /** - * Is this block (a) opaque and (b) a full 1m cube? This determines whether or not to render the shared face of two - * adjacent blocks and also whether the player can attach torches, redstone wire, etc to this block. - */ - @Override - public boolean isOpaqueCube() - { - return false; - } - - /** - * From the specified side and block metadata retrieves the blocks texture. Args: side, metadata - */ - @Override - public IIcon getIcon(int side, int meta) - { - switch (meta & 0x03) - { - default: - return SPR_TIMELEAVES; - case 1: - return SPR_TRANSLEAVES; - case 3: - return SPR_SORTLEAVES; - - } - } - - @Override - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister par1IconRegister) - { - BlockTFMagicLeaves.SPR_TIMELEAVES = par1IconRegister.registerIcon(TwilightForestMod.ID + ":time_leaves"); - BlockTFMagicLeaves.SPR_TRANSLEAVES = par1IconRegister.registerIcon(TwilightForestMod.ID + ":trans_leaves"); - BlockTFMagicLeaves.SPR_SORTLEAVES = par1IconRegister.registerIcon(TwilightForestMod.ID + ":sort_leaves"); - } - - - /** - * Returns true if the given side of this block type should be rendered, if the adjacent block is at the given - * coordinates. Args: blockAccess, x, y, z, side - */ - @Override - public boolean shouldSideBeRendered(IBlockAccess iblockaccess, int i, int j, int k, int side) - { - return Blocks.leaves.shouldSideBeRendered(iblockaccess, i, j, k, side); - } - - /** - * returns a list of blocks with the same ID, but different meta (eg: wood returns 4 blocks) - */ - @SuppressWarnings({ "unchecked", "rawtypes" }) - @Override - public void getSubBlocks(Item par1, CreativeTabs par2CreativeTabs, List par3List) - { - par3List.add(new ItemStack(par1, 1, 0)); - par3List.add(new ItemStack(par1, 1, 1)); - par3List.add(new ItemStack(par1, 1, 2)); - par3List.add(new ItemStack(par1, 1, 3)); - - } - - /** - * A randomly called display update to be able to add particles or other items for display - */ - @Override - public void randomDisplayTick(World par1World, int x, int y, int z, Random par5Random) - { - int meta = par1World.getBlockMetadata(x, y, z); - - if ((meta & 3) == META_TRANS) - { - for (int i = 0; i < 1; ++i) { - this.sparkleRunes(par1World, x, y, z, par5Random); - } - } - } - - /** - * The leaf sparkles. - */ - private void sparkleRunes(World world, int x, int y, int z, Random rand) - { - double offset = 0.0625D; - - int side = rand.nextInt(5) + 1; - double rx = x + rand.nextFloat(); - double ry = y + rand.nextFloat(); - double rz = z + rand.nextFloat(); - - if (side == 0 && world.isAirBlock(x, y + 1, z)) - { - ry = y + 1 + offset; - } - - if (side == 1 && world.isAirBlock(x, y - 1, z)) - { - ry = y + 0 - offset; - } - - if (side == 2 && world.isAirBlock(x, y, z + 1)) - { - rz = z + 1 + offset; - } - - if (side == 3 && world.isAirBlock(x, y, z - 1)) - { - rz = z + 0 - offset; - } - - if (side == 4 && world.isAirBlock(x + 1, y, z)) - { - rx = x + 1 + offset; - } - - if (side == 5 && world.isAirBlock(x - 1, y, z)) - { - rx = x + 0 - offset; - } - - if (rx < x || rx > x + 1 || ry < y|| ry > y + 1 || rz < z || rz > z + 1) - { - TwilightForestMod.proxy.spawnParticle(world, "leafrune", rx, ry, rz, 0.0D, 0.0D, 0.0D); - } - } - - - @Override - public String[] func_150125_e() { - // TODO Auto-generated method stub - return null; - } - -} diff --git a/src/main/java/twilightforest/block/BlockTFMagicLog.java b/src/main/java/twilightforest/block/BlockTFMagicLog.java deleted file mode 100644 index 1efdfd2020..0000000000 --- a/src/main/java/twilightforest/block/BlockTFMagicLog.java +++ /dev/null @@ -1,131 +0,0 @@ -package twilightforest.block; - -import java.util.List; -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockLog; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.IIcon; -import net.minecraft.world.World; -import twilightforest.TwilightForestMod; -import twilightforest.item.TFItems; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public class BlockTFMagicLog extends BlockLog { - - public static final int META_TIME = 0; - public static final int META_TRANS = 1; - public static final int META_MINE = 2; - public static final int META_SORT = 3; - - public static IIcon SPR_TIMESIDE; - public static IIcon SPR_TIMETOP; - public static IIcon SPR_TIMECLOCK; - public static IIcon SPR_TIMECLOCKOFF; - public static IIcon SPR_TRANSSIDE; - public static IIcon SPR_TRANSTOP; - public static IIcon SPR_TRANSHEART; - public static IIcon SPR_TRANSHEARTOFF; - public static IIcon SPR_MINESIDE; - public static IIcon SPR_MINETOP; - public static IIcon SPR_MINEGEM; - public static IIcon SPR_MINEGEMOFF; - public static IIcon SPR_SORTSIDE; - public static IIcon SPR_SORTTOP; - public static IIcon SPR_SORTEYE; - public static IIcon SPR_SORTEYEOFF; - - - protected BlockTFMagicLog() { - super(); - this.setHardness(2.0F); - this.setStepSound(Block.soundTypeWood); - this.setCreativeTab(TFItems.creativeTab); - } - - /** - * From the specified side and block metadata retrieves the blocks texture. Args: side, metadata - */ - @Override - public IIcon getIcon(int side, int meta) - { - int orient = meta & 12; - int woodType = meta & 3; - - switch (woodType) - { - default: - case META_TIME : - return orient == 0 && (side == 1 || side == 0) ? SPR_TIMETOP : (orient == 4 && (side == 5 || side == 4) ? SPR_TIMETOP : (orient == 8 && (side == 2 || side == 3) ? SPR_TIMETOP : SPR_TIMESIDE)); - case META_TRANS : - return orient == 0 && (side == 1 || side == 0) ? SPR_TRANSTOP : (orient == 4 && (side == 5 || side == 4) ? SPR_TRANSTOP : (orient == 8 && (side == 2 || side == 3) ? SPR_TRANSTOP : SPR_TRANSSIDE)); - case META_MINE : - return orient == 0 && (side == 1 || side == 0) ? SPR_MINETOP : (orient == 4 && (side == 5 || side == 4) ? SPR_MINETOP : (orient == 8 && (side == 2 || side == 3) ? SPR_MINETOP : SPR_MINESIDE)); - case META_SORT : - return orient == 0 && (side == 1 || side == 0) ? SPR_SORTTOP : (orient == 4 && (side == 5 || side == 4) ? SPR_SORTTOP : (orient == 8 && (side == 2 || side == 3) ? SPR_SORTTOP : SPR_SORTSIDE)); - } - - } - - @Override - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister par1IconRegister) - { - BlockTFMagicLog.SPR_TIMESIDE = par1IconRegister.registerIcon(TwilightForestMod.ID + ":time_side"); - BlockTFMagicLog.SPR_TIMETOP = par1IconRegister.registerIcon(TwilightForestMod.ID + ":time_section"); - BlockTFMagicLog.SPR_TIMECLOCK = par1IconRegister.registerIcon(TwilightForestMod.ID + ":time_clock"); - BlockTFMagicLog.SPR_TIMECLOCKOFF = par1IconRegister.registerIcon(TwilightForestMod.ID + ":time_clock_off"); - BlockTFMagicLog.SPR_TRANSSIDE = par1IconRegister.registerIcon(TwilightForestMod.ID + ":trans_side"); - BlockTFMagicLog.SPR_TRANSTOP = par1IconRegister.registerIcon(TwilightForestMod.ID + ":trans_section"); - BlockTFMagicLog.SPR_TRANSHEART = par1IconRegister.registerIcon(TwilightForestMod.ID + ":trans_heart"); - BlockTFMagicLog.SPR_TRANSHEARTOFF = par1IconRegister.registerIcon(TwilightForestMod.ID + ":trans_heart_off"); - BlockTFMagicLog.SPR_MINESIDE = par1IconRegister.registerIcon(TwilightForestMod.ID + ":mine_side"); - BlockTFMagicLog.SPR_MINETOP = par1IconRegister.registerIcon(TwilightForestMod.ID + ":mine_section"); - BlockTFMagicLog.SPR_MINEGEM = par1IconRegister.registerIcon(TwilightForestMod.ID + ":mine_gem"); - BlockTFMagicLog.SPR_MINEGEMOFF = par1IconRegister.registerIcon(TwilightForestMod.ID + ":mine_gem_off"); - BlockTFMagicLog.SPR_SORTSIDE = par1IconRegister.registerIcon(TwilightForestMod.ID + ":sort_side"); - BlockTFMagicLog.SPR_SORTTOP = par1IconRegister.registerIcon(TwilightForestMod.ID + ":sort_section"); - BlockTFMagicLog.SPR_SORTEYE = par1IconRegister.registerIcon(TwilightForestMod.ID + ":sort_eye"); - BlockTFMagicLog.SPR_SORTEYEOFF = par1IconRegister.registerIcon(TwilightForestMod.ID + ":sort_eye_off"); - } - - /** - * Returns the ID of the items to drop on destruction. - */ - @Override - public Item getItemDropped(int par1, Random par2Random, int par3) - { - return Item.getItemFromBlock(this); // hey that's my block ID! - } - - @Override - @SideOnly(Side.CLIENT) - /** - * A randomly called display update to be able to add particles or other items for display - */ - public void randomDisplayTick(World world, int x, int y, int z, Random rand) - { - - } - - /** - * returns a list of blocks with the same ID, but different meta (eg: wood returns 4 blocks) - */ - @SuppressWarnings({ "unchecked", "rawtypes" }) - @Override - public void getSubBlocks(Item par1, CreativeTabs par2CreativeTabs, List par3List) - { - par3List.add(new ItemStack(par1, 1, 0)); - par3List.add(new ItemStack(par1, 1, 1)); - par3List.add(new ItemStack(par1, 1, 2)); - par3List.add(new ItemStack(par1, 1, 3)); - - } - - -} diff --git a/src/main/java/twilightforest/block/BlockTFMagicLogSpecial.java b/src/main/java/twilightforest/block/BlockTFMagicLogSpecial.java deleted file mode 100644 index 52c99e7836..0000000000 --- a/src/main/java/twilightforest/block/BlockTFMagicLogSpecial.java +++ /dev/null @@ -1,536 +0,0 @@ -package twilightforest.block; - -import java.util.ArrayList; -import java.util.List; -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.inventory.IInventory; -import net.minecraft.inventory.InventoryLargeChest; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.IIcon; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; -import net.minecraft.world.WorldServer; -import net.minecraft.world.biome.BiomeGenBase; -import net.minecraft.world.chunk.Chunk; -import twilightforest.TFGenericPacketHandler; -import twilightforest.TwilightForestMod; -import twilightforest.biomes.TFBiomeBase; -import twilightforest.item.ItemTFOreMagnet; -import twilightforest.item.TFItems; -import cpw.mods.fml.common.ObfuscationReflectionHelper; -import cpw.mods.fml.common.network.NetworkRegistry; -import cpw.mods.fml.common.network.internal.FMLProxyPacket; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public class BlockTFMagicLogSpecial extends BlockTFMagicLog -{ - protected BlockTFMagicLogSpecial() { - super(); - this.setCreativeTab(TFItems.creativeTab); - } - - /** - * How many world ticks before ticking - */ - @Override - public int tickRate(World par1World) - { - return 20; - } - - - /** - * Called whenever the block is added into the world. Args: world, x, y, z - */ - @Override - public void onBlockAdded(World par1World, int par2, int par3, int par4) - { - par1World.scheduleBlockUpdate(par2, par3, par4, this, this.tickRate(par1World)); - } - - - /** - * Returns the ID of the items to drop on destruction. - */ - @Override - public Item getItemDropped(int par1, Random par2Random, int par3) - { - return Item.getItemFromBlock(TFBlocks.magicLog); // change into normal magic log - } - - /** - * From the specified side and block metadata retrieves the blocks texture. Args: side, metadata - */ - @Override - public IIcon getIcon(int side, int meta) - { - int orient = meta & 12; - int woodType = meta & 3; - - if (orient == 12) - { - //off blocks - switch (woodType) - { - default: - case META_TIME : - return (side == 1 || side == 0) ? SPR_TIMETOP : SPR_TIMECLOCKOFF; - case META_TRANS : - return (side == 1 || side == 0) ? SPR_TRANSTOP : SPR_TRANSHEARTOFF; - case META_MINE : - return (side == 1 || side == 0) ? SPR_MINETOP : SPR_MINEGEMOFF; - case META_SORT : - return (side == 1 || side == 0) ? SPR_SORTTOP : SPR_SORTEYEOFF; - } - } - else - { - switch (woodType) - { - default: - case META_TIME : - return orient == 0 && (side == 1 || side == 0) ? SPR_TIMETOP : (orient == 4 && (side == 5 || side == 4) ? SPR_TIMETOP : (orient == 8 && (side == 2 || side == 3) ? SPR_TIMETOP : SPR_TIMECLOCK)); - case META_TRANS : - return orient == 0 && (side == 1 || side == 0) ? SPR_TRANSTOP : (orient == 4 && (side == 5 || side == 4) ? SPR_TRANSTOP : (orient == 8 && (side == 2 || side == 3) ? SPR_TRANSTOP : SPR_TRANSHEART)); - case META_MINE : - return orient == 0 && (side == 1 || side == 0) ? SPR_MINETOP : (orient == 4 && (side == 5 || side == 4) ? SPR_MINETOP : (orient == 8 && (side == 2 || side == 3) ? SPR_MINETOP : SPR_MINEGEM)); - case META_SORT : - return orient == 0 && (side == 1 || side == 0) ? SPR_SORTTOP : (orient == 4 && (side == 5 || side == 4) ? SPR_SORTTOP : (orient == 8 && (side == 2 || side == 3) ? SPR_SORTTOP : SPR_SORTEYE)); - } - } - } - - /** - * Ticks the block if it's been scheduled - */ - @Override - public void updateTick(World world, int x, int y, int z, Random rand) - { - int meta = world.getBlockMetadata(x, y, z); - - if ((meta & 12) == 12) - { - // block is off, do not tick - return; - } - - if ((meta & 3) == 0 && !world.isRemote) - { - // tree of time effect - world.playSoundEffect(x + 0.5D, y + 0.5D, z + 0.5D, "random.click", 0.1F, 0.5F); - - doTreeOfTimeEffect(world, x, y, z, rand); - } - else if ((meta & 3) == 1 && !world.isRemote) - { - // tree of transformation effect - doTreeOfTransformationEffect(world, x, y, z, rand); - } - else if ((meta & 3) == 2 && !world.isRemote) - { - // miner's tree effect - doMinersTreeEffect(world, x, y, z, rand); - } - else if ((meta & 3) == 3 && !world.isRemote) - { - // sorting tree effect - doSortingTreeEffect(world, x, y, z, rand); - } - - - world.scheduleBlockUpdate(x, y, z, this, this.tickRate(world)); - - } - - /** - * Called upon block activation (right click on the block.) - */ - @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer par5EntityPlayer, int par6, float par7, float par8, float par9) - { - int meta = world.getBlockMetadata(x, y, z); - - int orient = meta & 12; - int woodType = meta & 3; - - if (orient == 0) - { - // turn off - world.setBlockMetadataWithNotify(x, y, z, woodType | 12, 3); - return true; - } - if (orient == 12) - { - // turn on - world.setBlockMetadataWithNotify(x, y, z, woodType | 0, 3); - world.scheduleBlockUpdate(x, y, z, this, this.tickRate(world)); - return true; - } - - return false; - } - - /** - * The tree of time adds extra ticks to blocks, so that they have twice the normal chance to get a random tick - */ - private void doTreeOfTimeEffect(World world, int x, int y, int z, Random rand) { - int numticks = 8 * 3 * this.tickRate(world); - - int successes = 0; - - for (int i = 0; i < numticks; i++) - { - // find a nearby block - int dx = rand.nextInt(32) - 16; - int dy = rand.nextInt(32) - 16; - int dz = rand.nextInt(32) - 16; - - Block thereID = world.getBlock(x + dx, y + dy, z + dz); - - if (thereID != Blocks.air && thereID.getTickRandomly()) - { - thereID.updateTick(world, x + dx, y + dy, z + dz, rand); - - //System.out.println("tree of time ticked a block at " + (x + dx) + ", " + (y + dy) + ", " + (z + dz) + " and the block was " + Blocks.blocksList[thereID] ); - - successes++; - } - } - - //System.out.println("Tree of time had " + successes + " successes out of " + numticks + " attempts"); - } - - /** - * The tree of transformation transforms the biome in the area near it into the enchanted forest biome. - * - * TODO: also change entities - */ - private void doTreeOfTransformationEffect(World world, int x, int y, int z, Random rand) { - for (int i = 0; i < 1; i++) - { - int dx = rand.nextInt(32) - 16; - int dz = rand.nextInt(32) - 16; - - world.playSoundEffect(x + 0.5D, y + 0.5D, z + 0.5D, "note.harp", 0.1F, rand.nextFloat() * 2F); - - - if (Math.sqrt(dx * dx + dz * dz) < 16) - { - BiomeGenBase biomeAt = world.getBiomeGenForCoords(x + dx, z + dz); - - if (biomeAt != TFBiomeBase.enchantedForest) - { - // I wonder how possible it is to change this - - Chunk chunkAt = world.getChunkFromBlockCoords(x + dx, z + dz); - - chunkAt.getBiomeArray()[((z + dz) & 15) << 4 | ((x + dx) & 15)] = (byte)TFBiomeBase.enchantedForest.biomeID; - - world.markBlockForUpdate((x + dx), y, (z + dz)); - - //System.out.println("Set biome at " + (x + dx) + ", " + (z + dz) + " to enchanted forest."); - - // send chunk?! - - if (world instanceof WorldServer) - { - sendChangedBiome(world, x + dx, z + dz, chunkAt); - } - - } - - } - } - } - - /** - * Send a tiny update packet to the client to inform it of the changed biome - */ - private void sendChangedBiome(World world, int x, int z, Chunk chunkAt) { - FMLProxyPacket message = TFGenericPacketHandler.makeBiomeChangePacket(x, z, (byte)TFBiomeBase.enchantedForest.biomeID); - - NetworkRegistry.TargetPoint targetPoint = new NetworkRegistry.TargetPoint(world.provider.dimensionId, x, 128, z, 128); - - TwilightForestMod.genericChannel.sendToAllAround(message, targetPoint); - //FMLLog.info("Sent chunk update packet from tree."); - - } - - /** - * The miner's tree generates the ore magnet effect randomly every second - */ - private void doMinersTreeEffect(World world, int x, int y, int z, Random rand) { - int dx = rand.nextInt(64) - 32; - int dy = rand.nextInt(64) - 32; - int dz = rand.nextInt(64) - 32; - - //world.playSoundEffect(x + 0.5D, y + 0.5D, z + 0.5D, "random.click", 0.1F, 0.5F); - - - int moved = ItemTFOreMagnet.doMagnet(world, x, y, z, x + dx, y + dy, z + dz); - - if (moved > 0) - { - world.playSoundEffect(x + 0.5D, y + 0.5D, z + 0.5D, "mob.endermen.portal", 0.1F, 1.0F); - } - else - { - //System.out.println("Miner block did not find ore at " + (x + dx) + ", " + (y + dy) + ", " + (z + dz) + ", nope."); - } - } - - /** - * The sorting tree finds two chests nearby and then attempts to sort a random item. - */ - private void doSortingTreeEffect(World world, int x, int y, int z, Random rand) { - // find all the chests nearby - int XSEARCH = 16; - int YSEARCH = 16; - int ZSEARCH = 16; - - ArrayList chests = new ArrayList(); - int itemCount = 0; - - for (int sx = x - XSEARCH; sx < x + XSEARCH; sx++) - { - for (int sy = y - YSEARCH; sy < y + YSEARCH; sy++) - { - for (int sz = z - ZSEARCH; sz < z + ZSEARCH; sz++) - { - if (world.getBlock(sx, sy, sz) == Blocks.chest) - { - IInventory thisChest = Blocks.chest.func_149951_m(world, sx, sy, sz); - - // make sure we haven't counted this chest - if (thisChest != null && !checkIfChestsContains(chests, (IInventory)world.getTileEntity(sx, sy, sz))) - { - int itemsInChest = 0; - - // count items - for (int i = 0; i < thisChest.getSizeInventory(); i++) - { - if (thisChest.getStackInSlot(i) != null) - { - itemsInChest++; - itemCount++; - } - } - - // only add non-empty chests - if (itemsInChest > 0) - { - chests.add(thisChest); - } - } - } - } - } - } - - //FMLLog.info("Found " + chests.size() + " non-empty chests, containing " + itemCount + " items"); - - // find a random item in one of the chests - ItemStack beingSorted = null; - int sortedChestNum = -1; - int sortedSlotNum = -1; - - if (itemCount > 0) - { - int itemNumber = rand.nextInt(itemCount); - int currentNumber = 0; - - for (int i = 0; i < chests.size(); i++) - { - IInventory chest = chests.get(i); - for (int slotNum = 0; slotNum < chest.getSizeInventory(); slotNum++) - { - ItemStack currentItem = chest.getStackInSlot(slotNum); - - if (currentItem != null) - { - if (currentNumber++ == itemNumber) - { - beingSorted = currentItem; - sortedChestNum = i; - sortedSlotNum = slotNum; - } - } - } - } - } - - //FMLLog.info("Decided to sort item " + beingSorted); - - if (beingSorted != null) - { - int matchChestNum = -1; - int matchCount = 0; - - // decide where to put it, if anywhere - for (int chestNum = 0; chestNum < chests.size(); chestNum++) - { - IInventory chest = chests.get(chestNum); - int currentChestMatches = 0; - - for (int slotNum = 0; slotNum < chest.getSizeInventory(); slotNum++) - { - - ItemStack currentItem = chest.getStackInSlot(slotNum); - if (currentItem != null && isSortingMatch(beingSorted, currentItem)) - { - currentChestMatches += currentItem.stackSize; - } - } - - if (currentChestMatches > matchCount) - { - matchCount = currentChestMatches; - matchChestNum = chestNum; - } - } - - // soooo, did we find a better match? - if (matchChestNum >= 0 && matchChestNum != sortedChestNum) - { - IInventory moveChest = chests.get(matchChestNum); - IInventory oldChest = chests.get(sortedChestNum); - - // is there an empty inventory slot in the new chest? - int moveSlot = getEmptySlotIn(moveChest); - - if (moveSlot >= 0) - { - // remove old item - oldChest.setInventorySlotContents(sortedSlotNum, null); - - // add new item - moveChest.setInventorySlotContents(moveSlot, beingSorted); - - //FMLLog.info("Moved sorted item " + beingSorted + " to chest " + matchChestNum + ", slot " + moveSlot); - } - } - - // if the stack is not full, combine items from other stacks - if (beingSorted.stackSize < beingSorted.getMaxStackSize()) - { - for (IInventory chest : chests) - { - for (int slotNum = 0; slotNum < chest.getSizeInventory(); slotNum++) - { - ItemStack currentItem = chest.getStackInSlot(slotNum); - - if (currentItem!= null && currentItem != beingSorted && beingSorted.isItemEqual(currentItem)) - { - if (currentItem.stackSize <= (beingSorted.getMaxStackSize() - beingSorted.stackSize)) - { - chest.setInventorySlotContents(slotNum, null); - beingSorted.stackSize += currentItem.stackSize; - currentItem.stackSize = 0; - } - } - } - } - } - - } - } - - private boolean isSortingMatch(ItemStack beingSorted, ItemStack currentItem) - { - return getCreativeTab(currentItem.getItem()) == getCreativeTab(beingSorted.getItem()); - } - - private Object getCreativeTab(Item item) - { - try { - return ObfuscationReflectionHelper.getPrivateValue(Item.class, item, 0); - } catch (IllegalArgumentException e) { - e.printStackTrace(); - } catch (SecurityException e) { - e.printStackTrace(); - } - return null; - } - - /** - * Is the chest we're testing part of our chest list already? - */ - private boolean checkIfChestsContains(ArrayList chests, IInventory testChest) { - for (IInventory chest : chests) - { - if (chest == testChest) - { - return true; - } - - if (chest instanceof InventoryLargeChest && ((InventoryLargeChest)chest).isPartOfLargeChest(testChest)) - { - return true; - } - } - return false; - } - - /** - * @return an empty slot number in the chest, or -1 if the chest is full - */ - private int getEmptySlotIn(IInventory chest) { - for (int i = 0; i < chest.getSizeInventory(); i++) - { - if (chest.getStackInSlot(i) == null) - { - return i; - } - } - - return -1; - } - - @Override - @SideOnly(Side.CLIENT) - /** - * A randomly called display update to be able to add particles or other items for display - */ - public void randomDisplayTick(World world, int x, int y, int z, Random rand) - { - - } - - /** - * Get a light value for this block, normal ranges are between 0 and 15 - * - * @param world The current world - * @param x X Position - * @param y Y position - * @param z Z position - * @return The light value - */ - @Override - public int getLightValue(IBlockAccess world, int x, int y, int z) - { - return 15; - } - - /** - * returns a list of blocks with the same ID, but different meta (eg: wood returns 4 blocks) - */ - @SuppressWarnings({ "rawtypes", "unchecked" }) - @Override - public void getSubBlocks(Item par1, CreativeTabs par2CreativeTabs, List par3List) - { - par3List.add(new ItemStack(par1, 1, 0)); - par3List.add(new ItemStack(par1, 1, 1)); - par3List.add(new ItemStack(par1, 1, 2)); - par3List.add(new ItemStack(par1, 1, 3)); - - } - - - } diff --git a/src/main/java/twilightforest/block/BlockTFMazestone.java b/src/main/java/twilightforest/block/BlockTFMazestone.java deleted file mode 100644 index 4cae304519..0000000000 --- a/src/main/java/twilightforest/block/BlockTFMazestone.java +++ /dev/null @@ -1,137 +0,0 @@ -package twilightforest.block; - -import java.util.List; - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.item.ItemTool; -import net.minecraft.util.IIcon; -import net.minecraft.world.World; -import twilightforest.TwilightForestMod; -import twilightforest.item.ItemTFMazebreakerPick; -import twilightforest.item.TFItems; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - - - -/** - * - * Mazestone mimics other types of stone in appearance, but is much harder to mine - * - * @author Ben - * - */ -public class BlockTFMazestone extends Block { - - private static IIcon TEX_PLAIN; - private static IIcon TEX_BRICK; - private static IIcon TEX_PILLAR; - private static IIcon TEX_DECO; - private static IIcon TEX_CRACKED; - private static IIcon TEX_MOSSY; - private static IIcon TEX_MOSAIC; - private static IIcon TEX_BORDER; - - /** - * Note that the texture called for here will only be used when the meta value is not a good block to mimic - * - * @param id - * @param texture - */ - public BlockTFMazestone() - { - super(Material.rock); - this.setHardness(100F); - this.setResistance(5F); - this.setStepSound(Block.soundTypeStone); - this.setCreativeTab(TFItems.creativeTab); - - } - - /** - * From the specified side and block metadata retrieves the blocks texture. Args: side, metadata - */ - @Override - public IIcon getIcon(int side, int meta) { - switch (meta) - { - case 0: - default: - return TEX_PLAIN; - case 1: - return TEX_BRICK; - case 2: - return side > 1 ? TEX_PILLAR : TEX_PLAIN; - case 3: - return side > 1 ? TEX_DECO : TEX_BRICK; - case 4: - return TEX_CRACKED; - case 5: - return TEX_MOSSY; - case 6: - return side > 1 ? TEX_BRICK : TEX_MOSAIC; - case 7: - return side > 1 ? TEX_BRICK : TEX_BORDER; - } - } - - @Override - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister par1IconRegister) - { - BlockTFMazestone.TEX_PLAIN = par1IconRegister.registerIcon(TwilightForestMod.ID + ":mazestone_plain"); - BlockTFMazestone.TEX_BRICK = par1IconRegister.registerIcon(TwilightForestMod.ID + ":mazestone_brick"); - BlockTFMazestone.TEX_PILLAR = par1IconRegister.registerIcon(TwilightForestMod.ID + ":mazestone_pillar"); - BlockTFMazestone.TEX_DECO = par1IconRegister.registerIcon(TwilightForestMod.ID + ":mazestone_decorative"); - BlockTFMazestone.TEX_CRACKED = par1IconRegister.registerIcon(TwilightForestMod.ID + ":mazestone_cracked"); - BlockTFMazestone.TEX_MOSSY = par1IconRegister.registerIcon(TwilightForestMod.ID + ":mazestone_mossy"); - BlockTFMazestone.TEX_MOSAIC = par1IconRegister.registerIcon(TwilightForestMod.ID + ":mazestone_mosaic"); - BlockTFMazestone.TEX_BORDER = par1IconRegister.registerIcon(TwilightForestMod.ID + ":mazestone_border"); - } - - @Override - public void harvestBlock(World world, EntityPlayer entityplayer, int x, int y, int z, int meta) - { - // damage the player's pickaxe - ItemStack cei = entityplayer.getCurrentEquippedItem(); - if(cei != null && cei.getItem() instanceof ItemTool && !(cei.getItem() instanceof ItemTFMazebreakerPick)) - { - cei.damageItem(16, entityplayer); - } - - super.harvestBlock(world, entityplayer, x, y, z, meta); - } - - - /** - * returns a list of blocks with the same ID, but different meta (eg: wood returns 4 blocks) - */ - @SuppressWarnings({ "rawtypes", "unchecked" }) - @Override - public void getSubBlocks(Item par1, CreativeTabs par2CreativeTabs, List par3List) - { - par3List.add(new ItemStack(par1, 1, 0)); - par3List.add(new ItemStack(par1, 1, 1)); - par3List.add(new ItemStack(par1, 1, 2)); - par3List.add(new ItemStack(par1, 1, 3)); - par3List.add(new ItemStack(par1, 1, 4)); - par3List.add(new ItemStack(par1, 1, 5)); - par3List.add(new ItemStack(par1, 1, 6)); - par3List.add(new ItemStack(par1, 1, 7)); - } - - /** - * Determines the damage on the item the block drops. Used in cloth and wood. - */ - @Override - public int damageDropped(int meta) { - return meta; - } - -} diff --git a/src/main/java/twilightforest/block/BlockTFMoonworm.java b/src/main/java/twilightforest/block/BlockTFMoonworm.java deleted file mode 100644 index e0d0275703..0000000000 --- a/src/main/java/twilightforest/block/BlockTFMoonworm.java +++ /dev/null @@ -1,147 +0,0 @@ -package twilightforest.block; - -import java.util.Random; - -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.EnumSkyBlock; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; -import twilightforest.tileentity.TileEntityTFMoonworm; - -public class BlockTFMoonworm extends BlockTFCritter { - - - public static int sprMoonworm = 52; - - protected BlockTFMoonworm() { - super(); - } - - /** - * How often do we check for incorrect lighting on fireflies, etc. - */ - public int tickRate() - { - return 50; - } - - /** - * Updates the blocks bounds based on its current state. Args: world, x, y, z - */ - @Override - public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) - { - int facing = world.getBlockMetadata(x, y, z) & 7; - float wide = 0.25F; - if (facing == 1) - { - setBlockBounds(0.0F, 0.25F, 0.5F - wide, wide, 0.75F, 0.5F + wide); - } - else if(facing == 2) - { - setBlockBounds(1.0F - wide, 0.25F, 0.5F - wide, 1.0F, 0.75F, 0.5F + wide); - } - else if(facing == 3) - { - setBlockBounds(0.5F - wide, 0.25F, 0.0F, 0.5F + wide, 0.75F, wide); - } - else if(facing == 4) - { - setBlockBounds(0.5F - wide, 0.25F, 1.0F - wide, 0.5F + wide, 0.75F, 1.0F); - } - else if(facing == 5) - { - setBlockBounds(0.5F - wide, 0.0F, 0.25F, 0.5F + wide, wide, 0.75F); - } - else if(facing == 6) - { - setBlockBounds(0.5F - wide, 1.0F - wide, 0.25F, 0.5F + wide, 1.0F, 0.75F); - } - else - { - float f1 = 0.1F; - setBlockBounds(0.5F - f1, 0.0F, 0.5F - f1, 0.5F + f1, 0.6F, 0.5F + f1); - } - } - - /** - * Get a light value for this block, normal ranges are between 0 and 15 - * - * @param world The current world - * @param x X Position - * @param y Y position - * @param z Z position - * @return The light value - */ - @Override - public int getLightValue(IBlockAccess world, int x, int y, int z) { - return 14; - } - - - @Override - public TileEntity createTileEntity(World world, int metadata) { - return new TileEntityTFMoonworm(); - - } - - - /** - * Called whenever the block is added into the world. Args: world, x, y, z - */ - @Override - public void onBlockAdded(World world, int x, int y, int z) - { - super.onBlockAdded(world, x, y, z); - world.scheduleBlockUpdate(x, y, z, this, tickRate()); - } - - /** - * Ticks the block if it's been scheduled - * Check the lighting and make the world relight it if it's incorrect. - */ - @Override - public void updateTick(World world, int x, int y, int z, Random random) - { - if (world.getBlockLightValue(x, y, z) < 12) { - //world.updateLightByType(EnumSkyBlock.Block, x, y, z); - //world.markBlockForUpdate(x, y, z); // do we need this now? - //System.out.println("Updating moonworm light value"); - // do another update to check that we got it right - world.scheduleBlockUpdate(x, y, z, this, tickRate()); - } - } - - /** - * Don't drop anything - */ - @Override - public boolean dropCritterIfCantStay(World world, int x, int y, int z) - { - if(!canPlaceBlockAt(world, x, y, z)) - { - world.setBlockToAir(x, y, z); - return false; - } else - { - return true; - } - } - - /** - * Metadata and fortune sensitive version, this replaces the old (int meta, Random rand) - * version in 1.1. - * - * @param meta Blocks Metadata - * @param fortune Current item fortune level - * @param random Random number generator - * @return The number of items to drop - */ - @Override - public int quantityDropped(int meta, int fortune, Random random) - { - return 0; - } - - -} diff --git a/src/main/java/twilightforest/block/BlockTFNagastone.java b/src/main/java/twilightforest/block/BlockTFNagastone.java deleted file mode 100644 index f9c6dac1cf..0000000000 --- a/src/main/java/twilightforest/block/BlockTFNagastone.java +++ /dev/null @@ -1,811 +0,0 @@ -package twilightforest.block; - -import java.util.List; - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.IIcon; -import net.minecraft.util.MathHelper; -import net.minecraft.world.World; -import twilightforest.TwilightForestMod; -import twilightforest.item.TFItems; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public class BlockTFNagastone extends Block { - - private static IIcon FACE_LEFT; - private static IIcon FACE_RIGHT; - private static IIcon CROSS_SECTION; - private static IIcon FACE_FRONT; - private static IIcon TOP_TIP; - private static IIcon TOP_LONG; - private static IIcon BOTTOM_TIP; - private static IIcon BOTTOM_LONG; - private static IIcon LEFT_DOWN; - private static IIcon RIGHT_DOWN; - private static IIcon LEFT_UP; - private static IIcon RIGHT_UP; - private static IIcon TIP_LEFT; - private static IIcon LONG_SIDE; - private static IIcon TIP_RIGHT; - private static IIcon TURN_TOP; - - - public BlockTFNagastone() { - super(Material.rock); - this.setHardness(1.5F); - this.setResistance(10.0F); - this.setStepSound(Block.soundTypeStone); - this.setCreativeTab(TFItems.creativeTab); - - } - - /** - * The type of render function that is called for this block - */ - @Override - public int getRenderType() - { - return TwilightForestMod.proxy.getNagastoneBlockRenderID(); - } - -// /** -// * Called when the block is placed in the world. -// */ -// @Override -// public void onBlockPlacedBy(World par1World, int x, int y, int z, EntityLivingBase par5EntityLiving, ItemStack par6ItemStack) -// { -// int metadata = par1World.getBlockMetadata(x, y, z) & 12; -// int direction = 0; -// -// // first: are there two blocks, one up/down and one to the side? -// if (metadata > 0 && placePerfectFitBody(par1World, x, y, z)) -// { -// // we placed it, we're done -// //System.out.println("Found a perfect fit and placed it"); -// return; -// } -// else if (metadata == 0 && placePerfectFitHead(par1World, x, y, z)) -// { -// // we placed it, we're done -// return; -// } -// -// // get preliminary orientation as if we were placing a straight block -// int pistonOrient = BlockPistonBase.determineOrientation(par1World, x, y, z, par5EntityLiving); -// -// switch (pistonOrient) -// { -// case 0: -// case 1: -// direction = 2; -// break; -// case 2: -// case 3: -// direction = 1; -// break; -// case 4: -// case 5: -// direction = 0; -// } -// -// // if there is a block up or down and we are placing a straight block (that's not up and down), modify so we connect -// if (metadata > 0 && (direction == 0 || direction == 1) && par1World.getBlock(x, y - 1, z) == this) { -// metadata = 4; -// } -// if (metadata > 0 && (direction == 0 || direction == 1) && par1World.getBlock(x, y + 1, z) == this) { -// metadata = 8; -// } -// // if we have decided not to place a straight block, face the block in question towards the player -// if (metadata == 0 || metadata == 4 || metadata == 8) -// { -// direction = BlockTFNagastone.determineOrientation(par1World, x, y, z, (EntityPlayer)par5EntityLiving); -// } -// -// // if we are placing a block up and down, see if there is block to the side, and if so, modify to connect -// if (metadata > 0 && direction == 2) -// { -// int connect = getOnlyNSEWConnection(par1World, x, y, z); -// -// if (connect != -1) -// { -// // recall that pistonOrient variable to determine if we're connecting up or down -// metadata = pistonOrient == 0 ? 4 : 8; -// direction = connect; -// } -// } -// -// // if, after all this, we've decided to place a straight block, and there is only one place to connect it, connect it -// if (metadata == 12) -// { -// int connect = getOnlyConnection(par1World, x, y, z); -// //System.out.println("Trying to orient straight block. Connection = " + connect); -// -// -// if (connect != -1) -// { -// switch (connect) -// { -// case 0: -// case 1: -// direction = 1; -// break; -// case 2: -// case 3: -// direction = 0; -// break; -// case 4: -// case 5: -// direction = 2; -// } -// } -// } -// -// // I think we've covered it -// par1World.setBlockMetadataWithNotify(x, y, z, metadata | direction, 3); -// } - - /** - * Called when a block is placed using its ItemBlock. Args: World, X, Y, Z, side, hitX, hitY, hitZ, block metadata - * - * 0 - 3 head directions - * 4 - 7 bend down - * 8 - 11 bend up - * 12 straight n/s - * 13 straight e/w - * 14 straight u/d - * 15 weird middle piece - */ - @Override - public int onBlockPlaced(World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ, int metadata) - { - int type = metadata & 12; - int orient = 0; - if (type == 0) - { - // head! - switch (side) { - case 0: - case 1: - default: - // don't know - orient = 1; - break; - case 2: - orient = 0; - break; - case 3: - orient = 1; - break; - case 4: - orient = 2; - break; - case 5: - orient = 3; - break; - } - } - if (type == 12) - { - // straight - switch (side) { - case 0: - case 1: - orient = 2; // u/d - break; - case 2: - case 3: - orient = 1; // e/w - break; - case 4: - case 5: - orient = 0; // n/s - break; - } - } - - return type | orient; - } - - /** - * Lets the block know when one of its neighbor changes. Doesn't know which neighbor changed (coordinates passed are - * their own) Args: x, y, z, neighbor blockID - */ - @Override - public void onNeighborBlockChange(World par1World, int x, int y, int z, Block neighborID) - { -// // is the block that changed nagastone? -// if (true || neighborID == this) { // this seems to be lies - int type = par1World.getBlockMetadata(x, y, z) & 12; - - if (type == 0) - { - placePerfectFitHead(par1World, x, y, z); - } - else - { - placePerfectFitBody(par1World, x, y, z); - } - } - - /** - * Check if there is a perfect fit naga body block at the specified position, and if so, place it. - * - * A perfect fit is when there are two nagastone blocks in exactly two directions. - * - * TODO: and possibly the two other blocks should be "facing" this one? - */ - public boolean placePerfectFitBody(World world, int x, int y, int z) - { - int firstConnection = getPosibleConnection(world, x, y, z, -1, -1); - int secondConnection = getPosibleConnection(world, x, y, z, firstConnection, -1); - - // if we aren't connecting twice, fail - if (firstConnection == -1 || secondConnection == -1) - { - //System.out.println("Perfect fit failed because we did not find two connections"); - return false; - } - - // third connection == fail - if (getPosibleConnection(world, x, y, z, firstConnection, secondConnection) != -1) { - //System.out.println("Perfect fit failed because of 3 connections"); - return false; - } - - // place the perfect block - if ((firstConnection == 2 && secondConnection == 3) || (firstConnection == 3 && secondConnection == 2)){ - // e/w straight piece - world.setBlockMetadataWithNotify(x, y, z, 12, 3); - return true; - } - else if (firstConnection + secondConnection == 1){ - // n/s straight piece - world.setBlockMetadataWithNotify(x, y, z, 13, 3); - return true; - } - else if (firstConnection + secondConnection == 9){ - // up/down straight piece - world.setBlockMetadataWithNotify(x, y, z, 14, 3); - return true; - } - else if (firstConnection == 4) { - // curve up towards second connection - world.setBlockMetadataWithNotify(x, y, z, 4 | secondConnection, 3); - return true; - } - else if (firstConnection == 5) { - // curve down towards second connection - world.setBlockMetadataWithNotify(x, y, z, 8 | secondConnection, 3); - return true; - } - else if (secondConnection == 4) { - // curve up towards first connection - world.setBlockMetadataWithNotify(x, y, z, 4 | firstConnection, 3); - return true; - } - else if (secondConnection == 5) { - // curve down towards first connection - world.setBlockMetadataWithNotify(x, y, z, 8 | firstConnection, 3); - return true; - } - else - { - // block 15! - world.setBlockMetadataWithNotify(x, y, z, 15, 3); - return true; - } - } - - /** - * If we can place the perfect head bit, do it, otherwise do nothing. - */ - public boolean placePerfectFitHead(World world, int x, int y, int z) - { - int connect = getOnlyNSEWConnection(world, x, y, z); - - if (connect != -1) - { - // if the first connection is n/s/e/w, and the second connection is not, we win! - //System.out.println("Got a perfect head fit : " + connect); - switch (connect) - { - case 0 : - world.setBlock(x, y, z, this, 1, 3); - return true; - case 1 : - world.setBlock(x, y, z, this, 0, 3); - return true; - case 2 : - world.setBlock(x, y, z, this, 3, 3); - return true; - case 3 : - world.setBlock(x, y, z, this, 2, 3); - return true; - } - return false; // this is impossible - } - else - { - return false; - } - } - - /** - * Return a direction only if it is the only possible connection, otherwise return -1. This only returns n/s/e/w - */ - public int getOnlyNSEWConnection(World world, int x, int y, int z) - { - int firstConnection = getPosibleConnection(world, x, y, z, -1, -1); - int secondConnection = getPosibleConnection(world, x, y, z, firstConnection, -1); - - if (firstConnection > 0 && firstConnection < 4 && (secondConnection < 0 || secondConnection > 3)) - { - return firstConnection; - } - else - { - return -1; - } - - } - - /** - * Return a direction only if it is the only possible connection, otherwise return -1. - */ - public int getOnlyConnection(World world, int x, int y, int z) - { - int firstConnection = getPosibleConnection(world, x, y, z, -1, -1); - int secondConnection = getPosibleConnection(world, x, y, z, firstConnection, -1); - - if (firstConnection > 0 && firstConnection < 6 && secondConnection == -1) - { - return firstConnection; - } - else - { - return -1; - } - - } - - /** - * Return a direction we have found nagastone in, excluding the two exclude directions. - */ - public int getPosibleConnection(World world, int x, int y, int z, int exclude1, int exclude2) - { - for (int i = 0; i < 6; i++) - { - if (i != exclude1 && i != exclude2 && isNagaStoneInDirection(world, x, y, z, i)) - { - return i; - } - } - // none found - return -1; - } - - /** - * Is there nagastone in the following direction? 0 = n, 1 = s, 2 = w, 3 = e, 4 = u, 5 = d; - */ - public boolean isNagaStoneInDirection(World par1World, int x, int y, int z, int direction) - { - switch (direction) - { - case 0 : - return par1World.getBlock(x, y, z - 1) == this; - case 1 : - return par1World.getBlock(x, y, z + 1) == this; - case 2 : - return par1World.getBlock(x - 1, y, z) == this; - case 3 : - return par1World.getBlock(x + 1, y, z) == this; - case 4 : - return par1World.getBlock(x, y - 1, z) == this; - case 5 : - return par1World.getBlock(x, y + 1, z) == this; - } - // welp, - return false; - } - - /** - * Returns only 0-4. 0 = n, 1 = s, 2 = w, 3 = e. - */ - public static int determineOrientation(World par0World, int par1, int par2, int par3, EntityPlayer par4EntityPlayer) - { - int rot = MathHelper.floor_double(par4EntityPlayer.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; - return rot == 0 ? 0 : (rot == 1 ? 3 : (rot == 2 ? 1 : (rot == 3 ? 2 : 0))); - } - - /** - * From the specified side and block metadata retrieves the blocks texture. Args: side, metadata - * - * 0 - 3 head directions - * 4 - 7 bend down - * 8 - 11 bend up - * 12 straight n/s - * 13 straight e/w - * 14 straight u/d - * 15 weird middle piece - * - * TODO: Surely there is a way to do this that's not just specifying all 6 * 16 values. - */ - @Override - public IIcon getIcon(int side, int meta) - { - int type = meta & 12; - int orient = meta & 3; - - if (type == 0) - { - if (orient == 0) - { - // north - switch (side) - { - case 0: - return BOTTOM_TIP; - case 1: - return TOP_TIP; - case 2: - return FACE_FRONT; - case 3: - return CROSS_SECTION; - case 4: - return FACE_LEFT; - case 5: - return FACE_RIGHT; - } - } - else if (orient == 1) - { - switch (side) - { - case 0: - return BOTTOM_TIP; - case 1: - return TOP_TIP; - case 2: - return CROSS_SECTION; - case 3: - return FACE_FRONT; - case 4: - return FACE_RIGHT; - case 5: - return FACE_LEFT; - } - } - else if (orient == 2) - { - switch (side) - { - case 0: - return BOTTOM_TIP; - case 1: - return TOP_TIP; - case 2: - return FACE_RIGHT; - case 3: - return FACE_LEFT; - case 4: - return FACE_FRONT; - case 5: - return CROSS_SECTION; - } - } - else if (orient == 3) - { - switch (side) - { - case 0: - return BOTTOM_TIP; - case 1: - return TOP_TIP; - case 2: - return FACE_LEFT; - case 3: - return FACE_RIGHT; - case 4: - return CROSS_SECTION; - case 5: - return FACE_FRONT; - } - } - } - - // TURN DOWN - if (type == 4) - { - if (orient == 0) - { - // north - switch (side) - { - case 0: - return CROSS_SECTION; - case 1: - return TOP_TIP; - case 2: - return CROSS_SECTION; - case 3: - return TIP_RIGHT; - case 4: - return LEFT_DOWN; - case 5: - return RIGHT_DOWN; - } - } - else if (orient == 1) - { - switch (side) - { - case 0: - return CROSS_SECTION; - case 1: - return TOP_TIP; - case 2: - return TIP_LEFT; - case 3: - return CROSS_SECTION; - case 4: - return RIGHT_DOWN; - case 5: - return LEFT_DOWN; - } - } - else if (orient == 2) - { - switch (side) - { - case 0: - return CROSS_SECTION; - case 1: - return TOP_TIP; - case 2: - return RIGHT_DOWN; - case 3: - return LEFT_DOWN; - case 4: - return CROSS_SECTION; - case 5: - return TIP_LEFT; - } - } - else if (orient == 3) - { - switch (side) - { - case 0: - return CROSS_SECTION; - case 1: - return TOP_TIP; - case 2: - return LEFT_DOWN; - case 3: - return RIGHT_DOWN; - case 4: - return TIP_RIGHT; - case 5: - return CROSS_SECTION; - } - } - - } - - if (type == 8) - { - // TURN UP - if (orient == 0) - { - // north - switch (side) - { - case 0: - return BOTTOM_TIP; - case 1: - return CROSS_SECTION; - case 2: - return CROSS_SECTION; - case 3: - return TIP_LEFT; - case 4: - return LEFT_UP; - case 5: - return RIGHT_UP; - } - } - else if (orient == 1) - { - switch (side) - { - case 0: - return BOTTOM_TIP; - case 1: - return CROSS_SECTION; - case 2: - return TIP_RIGHT; - case 3: - return CROSS_SECTION; - case 4: - return RIGHT_UP; - case 5: - return LEFT_UP; - } - } - else if (orient == 2) - { - switch (side) - { - case 0: - return BOTTOM_TIP; - case 1: - return CROSS_SECTION; - case 2: - return RIGHT_UP; - case 3: - return LEFT_UP; - case 4: - return CROSS_SECTION; - case 5: - return TIP_RIGHT; - } - } - else if (orient == 3) - { - switch (side) - { - case 0: - return BOTTOM_TIP; - case 1: - return CROSS_SECTION; - case 2: - return LEFT_UP; - case 3: - return RIGHT_UP; - case 4: - return TIP_LEFT; - case 5: - return CROSS_SECTION; - } - } - - } - - if (type == 12) - { - if (orient == 0) - { - // north - switch (side) - { - case 0: - return BOTTOM_LONG; - case 1: - return TOP_LONG; - case 2: - return LONG_SIDE; - case 3: - return LONG_SIDE; - case 4: - return CROSS_SECTION; - case 5: - return CROSS_SECTION; - } - } - else if (orient == 1) - { - switch (side) - { - case 0: - return BOTTOM_LONG; - case 1: - return TOP_LONG; - case 2: - return CROSS_SECTION; - case 3: - return CROSS_SECTION; - case 4: - return LONG_SIDE; - case 5: - return LONG_SIDE; - } - } - else if (orient == 2) - { - switch (side) - { - case 0: - return CROSS_SECTION; - case 1: - return CROSS_SECTION; - case 2: - return LONG_SIDE; - case 3: - return LONG_SIDE; - case 4: - return LONG_SIDE; - case 5: - return LONG_SIDE; - } - } - else if (orient == 3) - { - switch (side) - { - case 0: - return CROSS_SECTION; - case 1: - return TURN_TOP; - case 2: - return LONG_SIDE; - case 3: - return LONG_SIDE; - case 4: - return LONG_SIDE; - case 5: - return LONG_SIDE; - } - } - - } - - return null; - } - - /** - * returns a list of blocks with the same ID, but different meta (eg: wood returns 4 blocks) - */ - @Override - public void getSubBlocks(Item par1, CreativeTabs par2CreativeTabs, List par3List) - { - par3List.add(new ItemStack(par1, 1, 1)); - par3List.add(new ItemStack(par1, 1, 13)); - } - - /** - * Determines the damage on the item the block drops. Used in cloth and wood. - */ - @Override - public int damageDropped(int meta) { - return meta; -// // only drop meta 1 for head or 13 for body -// if (meta < 4) -// { -// return 1; -// } -// else -// { -// return 13; -// } - } - - @Override - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister par1IconRegister) - { - BlockTFNagastone.FACE_LEFT = par1IconRegister.registerIcon(TwilightForestMod.ID + ":nagastone_face_left"); - BlockTFNagastone.FACE_RIGHT = par1IconRegister.registerIcon(TwilightForestMod.ID + ":nagastone_face_right"); - BlockTFNagastone.CROSS_SECTION = par1IconRegister.registerIcon(TwilightForestMod.ID + ":nagastone_cross_section"); - BlockTFNagastone.FACE_FRONT = par1IconRegister.registerIcon(TwilightForestMod.ID + ":nagastone_face_front"); - BlockTFNagastone.TOP_TIP = par1IconRegister.registerIcon(TwilightForestMod.ID + ":nagastone_top_tip"); - BlockTFNagastone.TOP_LONG = par1IconRegister.registerIcon(TwilightForestMod.ID + ":nagastone_tip_long"); - BlockTFNagastone.BOTTOM_TIP = par1IconRegister.registerIcon(TwilightForestMod.ID + ":nagastone_bottom_tip"); - BlockTFNagastone.BOTTOM_LONG = par1IconRegister.registerIcon(TwilightForestMod.ID + ":nagastone_bottom_long"); - BlockTFNagastone.LEFT_DOWN = par1IconRegister.registerIcon(TwilightForestMod.ID + ":nagastone_left_down"); - BlockTFNagastone.RIGHT_DOWN = par1IconRegister.registerIcon(TwilightForestMod.ID + ":nagastone_right_down"); - BlockTFNagastone.LEFT_UP = par1IconRegister.registerIcon(TwilightForestMod.ID + ":nagastone_left_up"); - BlockTFNagastone.RIGHT_UP = par1IconRegister.registerIcon(TwilightForestMod.ID + ":nagastone_right_up"); - BlockTFNagastone.TIP_LEFT = par1IconRegister.registerIcon(TwilightForestMod.ID + ":nagastone_tip_left"); - BlockTFNagastone.LONG_SIDE = par1IconRegister.registerIcon(TwilightForestMod.ID + ":nagastone_long_side"); - BlockTFNagastone.TIP_RIGHT = par1IconRegister.registerIcon(TwilightForestMod.ID + ":nagastone_tip_right"); - BlockTFNagastone.TURN_TOP = par1IconRegister.registerIcon(TwilightForestMod.ID + ":nagastone_turn_top"); - } - -} diff --git a/src/main/java/twilightforest/block/BlockTFPlant.java b/src/main/java/twilightforest/block/BlockTFPlant.java deleted file mode 100644 index f6ee5a0da0..0000000000 --- a/src/main/java/twilightforest/block/BlockTFPlant.java +++ /dev/null @@ -1,523 +0,0 @@ -package twilightforest.block; - -import java.util.ArrayList; -import java.util.List; -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockBush; -import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.init.Items; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.IIcon; -import net.minecraft.world.ColorizerFoliage; -import net.minecraft.world.ColorizerGrass; -import net.minecraft.world.EnumSkyBlock; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; -import net.minecraftforge.common.EnumPlantType; -import net.minecraftforge.common.IShearable; -import net.minecraftforge.common.util.ForgeDirection; -import twilightforest.TwilightForestMod; -import twilightforest.item.TFItems; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public class BlockTFPlant extends BlockBush implements IShearable { - - boolean[] isGrassColor = {false, false, false, false, true, true, false, false, true, false, true, false, false, false, false, false}; - int[] lightValue = {0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 8, 0, 0}; - - private IIcon[] icons; - private String[] iconNames = new String[] {null, null, null, "mosspatch", "mayapple", "cloverpatch", null, null, "fiddlehead", "mushgloom", null, null, null, "torchberry", "rootstrand", null}; - public static IIcon mayappleSide; - - public static final int META_MOSSPATCH = 3; - public static final int META_MAYAPPLE = 4; - public static final int META_CLOVERPATCH = 5; - public static final int META_FIDDLEHEAD = 8; - public static final int META_MUSHGLOOM = 9; - public static final int META_FORESTGRASS = 10; - public static final int META_DEADBUSH = 11; - public static final int META_TORCHBERRY = 13; - public static final int META_ROOT_STRAND = 14; - - - protected BlockTFPlant() { - super(Material.plants); - this.setTickRandomly(true); - float var3 = 0.4F; - this.setBlockBounds(0.5F - var3, 0.0F, 0.5F - var3, 0.5F + var3, 0.8F, 0.5F + var3); - this.setHardness(0.0F); - this.setStepSound(Block.soundTypeGrass); - this.setCreativeTab(TFItems.creativeTab); - } - - /** - * From the specified side and block metadata retrieves the blocks texture. Args: side, metadata - */ - @Override - public IIcon getIcon(int side, int metadata) - { - return this.icons[metadata]; - } - - @Override - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister par1IconRegister) - { - this.icons = new IIcon[iconNames.length]; - - for (int i = 0; i < this.icons.length; ++i) - { - if (this.iconNames[i] != null) - { - this.icons[i] = par1IconRegister.registerIcon(TwilightForestMod.ID + ":" + iconNames[i]); - } - } - - this.icons[META_FORESTGRASS] = Blocks.tallgrass.getIcon(2, 1); - this.icons[META_DEADBUSH] = Blocks.deadbush.getBlockTextureFromSide(2); - - BlockTFPlant.mayappleSide = par1IconRegister.registerIcon(TwilightForestMod.ID + ":mayapple_side"); - } - @Override - public int getBlockColor() - { - double var1 = 0.5D; - double var3 = 1.0D; - return ColorizerGrass.getGrassColor(var1, var3); - } - - /** - * Schedule an update to try to get lighting right - */ - @Override - public void onBlockAdded(World world, int i, int j, int k) { - world.scheduleBlockUpdate(i, j, k, this, world.rand.nextInt(50) + 20); - } - - @Override - public boolean canReplace(World par1World, int x, int y, int z, int par5, ItemStack par6ItemStack) - { - // we need to get the metadata - Block blockAt = par1World.getBlock(x, y, z); - - return (blockAt == Blocks.air || blockAt.getMaterial().isReplaceable()) && canBlockStay(par1World, x, y, z, par6ItemStack.getItemDamage()); - } - - /** - * Can this block stay at this position. Similar to canPlaceBlockAt except gets checked often with plants. - */ - @Override - public boolean canBlockStay(World world, int x, int y, int z) { - int meta = world.getBlockMetadata(x, y, z); - - return canBlockStay(world, x, y, z, meta); - } - - /** - * Can this block stay at this position? with metadata - */ - public boolean canBlockStay(World world, int x, int y, int z, int meta) { - - //System.out.println("Can block stay? meta is " + meta); - Block soil = world.getBlock(x, y - 1, z); - - switch (meta) { - case META_TORCHBERRY : - case META_ROOT_STRAND : - return BlockTFPlant.canPlaceRootBelow(world, x, y + 1, z); - case 0: // let's make this happen - case META_FORESTGRASS: - case META_DEADBUSH: - return (soil != null && soil.canSustainPlant(world, x, y - 1, z, ForgeDirection.UP, this)); - case META_MUSHGLOOM: - case META_MOSSPATCH: - return soil != null && soil.isSideSolid(world, x, y, z, ForgeDirection.UP); - default : - return (world.getFullBlockLightValue(x, y, z) >= 3 || world.canBlockSeeTheSky(x, y, z)) && - (soil != null && soil.canSustainPlant(world, x, y - 1, z, ForgeDirection.UP, this)); - } - } - - - /** - * Updates the blocks bounds based on its current state. Args: world, x, y, z - */ - @Override - public void setBlockBoundsBasedOnState(IBlockAccess par1IBlockAccess, int x, int y, int z) - { - int meta = par1IBlockAccess.getBlockMetadata(x, y, z); - - if (meta == META_MOSSPATCH) - { - long seed = x * 3129871 ^ y * 116129781L ^ z; - seed = seed * seed * 42317861L + seed * 11L; - - int xOff0 = (int) (seed >> 12 & 3L); - int xOff1 = (int) (seed >> 15 & 3L); - int zOff0 = (int) (seed >> 18 & 3L); - int zOff1 = (int) (seed >> 21 & 3L); - - boolean xConnect0 = par1IBlockAccess.getBlock(x + 1, y, z) == this && par1IBlockAccess.getBlockMetadata(x + 1, y, z) == META_MOSSPATCH; - boolean xConnect1 = par1IBlockAccess.getBlock(x - 1, y, z) == this && par1IBlockAccess.getBlockMetadata(x - 1, y, z) == META_MOSSPATCH; - boolean zConnect0 = par1IBlockAccess.getBlock(x, y, z + 1) == this && par1IBlockAccess.getBlockMetadata(x, y, z + 1) == META_MOSSPATCH; - boolean zConnect1 = par1IBlockAccess.getBlock(x, y, z - 1) == this && par1IBlockAccess.getBlockMetadata(x, y, z - 1) == META_MOSSPATCH; - - this.setBlockBounds(xConnect1 ? 0F : (1F + xOff1) / 16F, 0.0F, zConnect1 ? 0F : (1F + zOff1) / 16F, - xConnect0 ? 1F : (15F - xOff0) / 16F, 1F / 16F, zConnect0 ? 1F : (15F - zOff0) / 16F); - - } - else if (meta == META_CLOVERPATCH) - { - long seed = x * 3129871 ^ y * 116129781L ^ z; - seed = seed * seed * 42317861L + seed * 11L; - - int xOff0 = (int) (seed >> 12 & 3L); - int xOff1 = (int) (seed >> 15 & 3L); - int zOff0 = (int) (seed >> 18 & 3L); - int zOff1 = (int) (seed >> 21 & 3L); - - int yOff0 = (int) (seed >> 24 & 1L); - int yOff1 = (int) (seed >> 27 & 1L); - - - boolean xConnect0 = par1IBlockAccess.getBlock(x + 1, y, z) == this && par1IBlockAccess.getBlockMetadata(x + 1, y, z) == META_CLOVERPATCH; - boolean xConnect1 = par1IBlockAccess.getBlock(x - 1, y, z) == this && par1IBlockAccess.getBlockMetadata(x - 1, y, z) == META_CLOVERPATCH; - boolean zConnect0 = par1IBlockAccess.getBlock(x, y, z + 1) == this && par1IBlockAccess.getBlockMetadata(x, y, z + 1) == META_CLOVERPATCH; - boolean zConnect1 = par1IBlockAccess.getBlock(x, y, z - 1) == this && par1IBlockAccess.getBlockMetadata(x, y, z - 1) == META_CLOVERPATCH; - - this.setBlockBounds(xConnect1 ? 0F : (1F + xOff1) / 16F, 0.0F, zConnect1 ? 0F : (1F + zOff1) / 16F, - xConnect0 ? 1F : (15F - xOff0) / 16F, (1F + yOff0 + yOff1) / 16F, zConnect0 ? 1F : (15F - zOff0) / 16F); - - //this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 2F / 16F, 1.0F); - } - else if (meta == META_MAYAPPLE) - { - this.setBlockBounds(4F / 16F, 0, 4F / 16F, 13F / 16F, 6F / 16F, 13F / 16F); - } - else - { - this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); - } - } - - - /** - * Returns the color this block should be rendered. Used by leaves. - */ - @Override - public int getRenderColor(int par1) - { - return isGrassColor[par1] ? ColorizerFoliage.getFoliageColorBasic() : 0xFFFFFF; - } - - /** - * Returns a integer with hex for 0xrrggbb with this color multiplied against the blocks color. Note only called - * when first determining what to render. - */ - @Override - public int colorMultiplier(IBlockAccess par1IBlockAccess, int x, int y, int z) - { - int meta = par1IBlockAccess.getBlockMetadata(x, y, z); - return isGrassColor[meta] ? par1IBlockAccess.getBiomeGenForCoords(x, z).getBiomeGrassColor(x, y, z) : 0xFFFFFF; - } - - - - /** - * Returns a bounding box from the pool of bounding boxes (this means this box can change after the pool has been - * cleared to be reused) - */ - @Override - public AxisAlignedBB getCollisionBoundingBoxFromPool(World par1World, int x, int y, int z) - { - par1World.getBlockMetadata(x, y, z); - - return null; - } - - /** - * Is this block (a) opaque and (b) a full 1m cube? This determines whether or not to render the shared face of two - * adjacent blocks and also whether the player can attach torches, redstone wire, etc to this block. - */ - @Override - public boolean isOpaqueCube() - { - return false; - } - - /** - * If this block doesn't render as an ordinary block it will return False (examples: signs, buttons, stairs, etc) - */ - @Override - public boolean renderAsNormalBlock() - { - return false; - } - - /** - * The type of render function that is called for this block - */ - @Override - public int getRenderType() { - return TwilightForestMod.proxy.getPlantBlockRenderID(); - } - - /** - * Ticks the block if it's been scheduled - */ - @Override - public void updateTick(World par1World, int x, int y, int z, Random par5Random) - { - int meta = par1World.getBlockMetadata(x, y, z); - if (par1World.getBlockLightValue(x, y, z) < lightValue[meta]) { - //par1World.updateLightByType(EnumSkyBlock.Block, x, y, z); - //par1World.markBlockForUpdate(x, y, z); // do we need this now? - } - - } - - /** - * Get a light value for this block, normal ranges are between 0 and 15 - * - * @param world The current world - * @param x X Position - * @param y Y position - * @param z Z position - * @return The light value - */ - @Override - public int getLightValue(IBlockAccess world, int x, int y, int z) { - int meta = world.getBlockMetadata(x, y, z); - return lightValue[meta]; - } - - - /** - * Root-specific method. - * @return true if the root can be placed in the block immediately below this one - */ - public static boolean canPlaceRootBelow(World world, int x, int y, int z) { - Block blockID = world.getBlock(x, y, z); - if (blockID != null && (blockID.getMaterial() == Material.ground || blockID.getMaterial() == Material.grass)) { - // can always hang below dirt blocks - return true; - } - else { - int blockMeta = world.getBlockMetadata(x, y, z); - return (blockID == TFBlocks.plant && blockMeta == META_ROOT_STRAND) || (blockID == TFBlocks.root && blockMeta == BlockTFRoots.ROOT_META); - } - - } - - -// /** -// * Drops the block items with a specified chance of dropping the specified items -// */ -// public void dropBlockAsItemWithChance(World var1, int var2, int var3, int var4, int var5, float var6, int var7) -// { -// super.dropBlockAsItemWithChance(var1, var2, var3, var4, var5, var6, var7); -// -// if (!var1.isRemote && var5 == 1) -// { -// this.dropBlockAsItem_do(var1, var2, var3, var4, new ItemStack(mod_ThaumCraft.itemComponents, 1, 2)); -// } -// -// if (!var1.isRemote && var5 == 3) -// { -// this.dropBlockAsItem_do(var1, var2, var3, var4, new ItemStack(mod_ThaumCraft.itemPlants, 1, 3)); -// } -// -// if (!var1.isRemote && (var5 == 2 || var5 == 4) && var1.rand.nextInt(10) == 0) -// { -// this.dropBlockAsItem_do(var1, var2, var3, var4, new ItemStack(mod_ThaumCraft.itemArtifactTainted, 1, 0)); -// } -// } -// - - /** - * This returns a complete list of items dropped from this block. - * - * @param world The current world - * @param x X Position - * @param Y Y Position - * @param Z Z Position - * @param metadata Current metadata - * @param fortune Breakers fortune level - * @return A ArrayList containing all items this block drops - */ - @Override - public ArrayList getDrops(World world, int x, int y, int z, int meta, int fortune) - { - ArrayList ret = new ArrayList(); - - //TODO: this needs to not drop if the player is shearing! Grrr! - - // blah - switch (meta) { - case META_TORCHBERRY : - ret.add(new ItemStack(TFItems.torchberries)); - break; - case META_MOSSPATCH : - case META_MAYAPPLE : - case META_CLOVERPATCH : - case META_ROOT_STRAND : - case META_FORESTGRASS : - case META_DEADBUSH : - // Just don't drop anythin - break; - default : - ret.add(new ItemStack(this, 1, meta)); - break; - } - - return ret; - } - - /** - * Determines the damage on the item the block drops. Used in cloth and wood. - */ - @Override - public int damageDropped(int par1) - { - return par1; - } - - /** - * Checks if the object is currently shearable - * Example: Sheep return false when they have no wool - * - * @param item The itemstack that is being used, Possible to be null - * @param world The current world - * @param x The X Position - * @param y The Y Position - * @param z The Z Position - * @return If this is shearable, and onSheared should be called. - */ - @Override - public boolean isShearable(ItemStack item, IBlockAccess world, int x, int y, int z) { - // TODO Auto-generated method stub - return true; - } - - /** - * Performs the shear function on this object. - * This is called for both client, and server. - * The object should perform all actions related to being sheared, - * except for dropping of the items. - * - * Returns a list of items that resulted from the shearing process. - * - * For entities, they should trust there internal location information - * over the values passed into this function. - * - * @param item The itemstack that is being used, Possible to be null - * @param world The current world - * @param x The X Position - * @param y The Y Position - * @param z The Z Position - * @param fortune The fortune level of the shears being used - * @return A ArrayList containing all items from this shearing. Possible to be null. - */ - @Override - public ArrayList onSheared(ItemStack item, IBlockAccess world, int x, int y, int z, int fortune) { - ArrayList ret = new ArrayList(); - ret.add(new ItemStack(this, 1, world.getBlockMetadata(x, y, z))); - //world.setBlockToAir(x, y, z); - return ret; - } - - /** - * Called when the player destroys a block with an item that can harvest it. (i, j, k) are the coordinates of the - * block and l is the block's subtype/damage. - */ - public void harvestBlock(World world, EntityPlayer player, int x, int y, int z, int meta) - { - // do not call normal harvest if the player is shearing - if (world.isRemote || player.getCurrentEquippedItem() == null || player.getCurrentEquippedItem().getItem() != Items.shears) - { - super.harvestBlock(world, player, x, y, z, meta); - } - } - - /** - * returns a list of blocks with the same ID, but different meta (eg: wood returns 4 blocks) - */ - @SuppressWarnings({ "unchecked", "rawtypes" }) - @Override - public void getSubBlocks(Item par1, CreativeTabs par2CreativeTabs, List par3List) - { - par3List.add(new ItemStack(this, 1, META_MOSSPATCH)); - par3List.add(new ItemStack(this, 1, META_MAYAPPLE)); - //par3List.add(new ItemStack(this, 1, META_CLOVERPATCH)); - par3List.add(new ItemStack(this, 1, 8)); - par3List.add(new ItemStack(this, 1, 9)); - par3List.add(new ItemStack(this, 1, META_FORESTGRASS)); - par3List.add(new ItemStack(this, 1, META_DEADBUSH)); - par3List.add(new ItemStack(this, 1, 13)); - par3List.add(new ItemStack(this, 1, 14)); - - } - - /** - * - */ - @Override - public void setBlockBoundsForItemRender() { - this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); - } - - @Override - public EnumPlantType getPlantType(IBlockAccess world, int x, int y, int z) - { - int meta = world.getBlockMetadata(x, y, z); - - switch (meta) - { - case META_MOSSPATCH : - case META_MUSHGLOOM : - return EnumPlantType.Cave; - default : - return EnumPlantType.Plains; - } - } - - @Override - public Block getPlant(IBlockAccess world, int x, int y, int z) - { - return this; - } - - @Override - public int getPlantMetadata(IBlockAccess world, int x, int y, int z) - { - return world.getBlockMetadata(x, y, z); - } - - - /** - * A randomly called display update to be able to add particles or other items for display - */ - @Override - @SideOnly(Side.CLIENT) - public void randomDisplayTick(World par1World, int x, int y, int z, Random par5Random) - { - super.randomDisplayTick(par1World, x, y, z, par5Random); - - int meta = par1World.getBlockMetadata(x, y, z); - - if (meta == META_MOSSPATCH && par5Random.nextInt(10) == 0) - { - par1World.spawnParticle("townaura", x + par5Random.nextFloat(), y + 0.1F, z + par5Random.nextFloat(), 0.0D, 0.0D, 0.0D); - } - - } -} diff --git a/src/main/java/twilightforest/block/BlockTFPortal.java b/src/main/java/twilightforest/block/BlockTFPortal.java deleted file mode 100644 index 8954ff9204..0000000000 --- a/src/main/java/twilightforest/block/BlockTFPortal.java +++ /dev/null @@ -1,439 +0,0 @@ -package twilightforest.block; - -import java.util.List; -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockBreakable; -import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityList; -import net.minecraft.entity.effect.EntityLightningBolt; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.init.Blocks; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.server.MinecraftServer; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.ChunkCoordinates; -import net.minecraft.util.IIcon; -import net.minecraft.util.MathHelper; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; -import net.minecraft.world.WorldServer; -import twilightforest.TFAchievementPage; -import twilightforest.TFTeleporter; -import twilightforest.TwilightForestMod; -import cpw.mods.fml.common.FMLLog; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public class BlockTFPortal extends BlockBreakable -{ - - public BlockTFPortal() - { - super("TFPortal", Material.portal, false); - this.setHardness(-1F); - this.setStepSound(Block.soundTypeGlass); - this.setLightLevel(0.75F); - //this.setCreativeTab(TFItems.creativeTab); - } - - @Override - public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int i, int j, int k) - { - return null; - } - - @Override - public void setBlockBoundsBasedOnState(IBlockAccess iblockaccess, int i, int j, int k) - { - setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.75F, 1.0F); - } - - @Override - public boolean isOpaqueCube() - { - return false; - } - - @Override - public boolean renderAsNormalBlock() - { - return false; - } - - /** - * From the specified side and block metadata retrieves the blocks texture. Args: side, metadata - */ - @Override - public IIcon getIcon(int side, int meta) - { - return Blocks.portal.getIcon(side, meta); - } - - @Override - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister par1IconRegister) - { - ; // don't load anything - } - - /** - * The function name says it all. Tries to create a portal at the specified location. - * In this case, the location is the location of a pool with very specific parameters. - */ - public boolean tryToCreatePortal(World world, int dx, int dy, int dz) - { - if (isGoodPortalPool(world, dx, dy, dz)) - { - world.addWeatherEffect(new EntityLightningBolt(world, dx, dy, dz)); - - transmuteWaterToPortal(world, dx, dy, dz); - - return true; - } - else - { - return false; - } - } - - /** - * Changes the pool it's been given to all portal. No checks done, only does 4 squares. - */ - public void transmuteWaterToPortal(World world, int dx, int dy, int dz) - { - int px = dx; - int pz = dz; - - // adjust so that the other 3 water squares are in the +x, +z directions. - if (world.getBlock(px - 1, dy, pz).getMaterial() == Material.water) - { - px--; - } - if (world.getBlock(px, dy, pz - 1).getMaterial() == Material.water) - { - pz--; - } - - world.setBlock(px + 0, dy, pz + 0, TFBlocks.portal, 0, 2); - world.setBlock(px + 1, dy, pz + 0, TFBlocks.portal, 0, 2); - world.setBlock(px + 1, dy, pz + 1, TFBlocks.portal, 0, 2); - world.setBlock(px + 0, dy, pz + 1, TFBlocks.portal, 0, 2); - - //System.out.println("Transmuting water to portal"); - } - - /** - * If this spot, or a spot in any one of the 8 directions around me is good, we're good. - */ - public boolean isGoodPortalPool(World world, int dx, int dy, int dz) - { - boolean flag = false; - - flag |= isGoodPortalPoolStrict(world, dx + 0, dy, dz + 0); - - flag |= isGoodPortalPoolStrict(world, dx - 1, dy, dz - 1); - flag |= isGoodPortalPoolStrict(world, dx + 0, dy, dz - 1); - flag |= isGoodPortalPoolStrict(world, dx + 1, dy, dz - 1); - - flag |= isGoodPortalPoolStrict(world, dx - 1, dy, dz + 0); - flag |= isGoodPortalPoolStrict(world, dx + 1, dy, dz + 0); - - flag |= isGoodPortalPoolStrict(world, dx - 1, dy, dz + 1); - flag |= isGoodPortalPoolStrict(world, dx + 0, dy, dz + 1); - flag |= isGoodPortalPoolStrict(world, dx + 1, dy, dz + 1); - - - return flag; - } - - /** - * Returns true only if there is water here, and at dx + 1, dy + 1, grass surrounding it, and solid beneath. - * - * - * GGGG - * G+wG - * GwwG - * GGGG - * - * - */ - public boolean isGoodPortalPoolStrict(World world, int dx, int dy, int dz) - { - boolean flag = true; - - // 4 squares of water - flag &= world.getBlock(dx + 0, dy, dz + 0).getMaterial() == Material.water; - flag &= world.getBlock(dx + 1, dy, dz + 0).getMaterial() == Material.water; - flag &= world.getBlock(dx + 1, dy, dz + 1).getMaterial() == Material.water; - flag &= world.getBlock(dx + 0, dy, dz + 1).getMaterial() == Material.water; - - //System.out.println("water in 4 squares = " + flag); - - // grass in the 12 squares surrounding - flag &= isGrassOrDirt(world, dx - 1, dy, dz - 1); - flag &= isGrassOrDirt(world, dx - 1, dy, dz + 0); - flag &= isGrassOrDirt(world, dx - 1, dy, dz + 1); - flag &= isGrassOrDirt(world, dx - 1, dy, dz + 2); - - flag &= isGrassOrDirt(world, dx + 0, dy, dz - 1); - flag &= isGrassOrDirt(world, dx + 1, dy, dz - 1); - - flag &= isGrassOrDirt(world, dx + 0, dy, dz + 2); - flag &= isGrassOrDirt(world, dx + 1, dy, dz + 2); - - flag &= isGrassOrDirt(world, dx + 2, dy, dz - 1); - flag &= isGrassOrDirt(world, dx + 2, dy, dz + 0); - flag &= isGrassOrDirt(world, dx + 2, dy, dz + 1); - flag &= isGrassOrDirt(world, dx + 2, dy, dz + 2); - - //System.out.println("grass surrounding = " + flag); - - - - // solid underneath - flag &= world.getBlock(dx + 0, dy - 1, dz + 0).getMaterial().isSolid(); - flag &= world.getBlock(dx + 1, dy - 1, dz + 0).getMaterial().isSolid(); - flag &= world.getBlock(dx + 1, dy - 1, dz + 1).getMaterial().isSolid(); - flag &= world.getBlock(dx + 0, dy - 1, dz + 1).getMaterial().isSolid(); - - //System.out.println("solid under = " + flag); - - - // 12 nature blocks above the grass? - flag &= isNatureBlock(world, dx - 1, dy + 1, dz - 1); - flag &= isNatureBlock(world, dx - 1, dy + 1, dz + 0); - flag &= isNatureBlock(world, dx - 1, dy + 1, dz + 1); - flag &= isNatureBlock(world, dx - 1, dy + 1, dz + 2); - - flag &= isNatureBlock(world, dx + 0, dy + 1, dz - 1); - flag &= isNatureBlock(world, dx + 1, dy + 1, dz - 1); - - flag &= isNatureBlock(world, dx + 0, dy + 1, dz + 2); - flag &= isNatureBlock(world, dx + 1, dy + 1, dz + 2); - - flag &= isNatureBlock(world, dx + 2, dy + 1, dz - 1); - flag &= isNatureBlock(world, dx + 2, dy + 1, dz + 0); - flag &= isNatureBlock(world, dx + 2, dy + 1, dz + 1); - flag &= isNatureBlock(world, dx + 2, dy + 1, dz + 2); - - //System.out.println("nature blocks = " + flag); - - - return flag; - } - - /** - * Does the block at this location count as a "nature" block for portal purposes? - */ - public boolean isNatureBlock(World world, int dx, int dy, int dz) - { - Material mat = world.getBlock(dx, dy, dz).getMaterial(); - - if (mat == Material.plants || mat == Material.vine || mat == Material.leaves) { - return true; - } - - // plants = tallgrass - // vine = flower - - - return false; - } - - - /** - * Each twilight portal pool block should have grass or dirt on one side and a portal on the other. If this is not true, delete this block, presumably causing a chain reaction. - */ - @Override - public void onNeighborBlockChange(World world, int x, int y, int z, Block notUsed) - { - boolean good = true; - - if (world.getBlock(x - 1, y, z) == this) { - good &= isGrassOrDirt(world, x + 1, y, z); - } - else if (world.getBlock(x + 1, y, z) == this) { - good &= isGrassOrDirt(world, x - 1, y, z); - } - else - { - good = false; - } - - if (world.getBlock(x, y, z - 1) == this) { - good &= isGrassOrDirt(world, x, y, z + 1); - } - else if (world.getBlock(x, y, z + 1) == this) { - good &= isGrassOrDirt(world, x, y, z - 1); - } - else - { - good = false; - } - - // if we're not good, remove this block - if (!good) - { - world.setBlock(x, y, z, Blocks.water, 0, 3); - } - } - - protected boolean isGrassOrDirt(World world, int dx, int dy, int dz) - { - return world.getBlock(dx, dy, dz).getMaterial() == Material.grass || world.getBlock(dx, dy, dz).getMaterial() == Material.ground; - // grass = grass - // ground = dirt - } - - @Override - public int quantityDropped(Random random) - { - return 0; - } - - @Override - public int getRenderBlockPass() - { - return 1; - } - - @Override - public void onEntityCollidedWithBlock(World world, int i, int j, int k, Entity entity) - { - if(entity.ridingEntity == null && entity.riddenByEntity == null && entity.timeUntilPortal <= 0) - { - if (entity instanceof EntityPlayerMP) - { - EntityPlayerMP playerMP = (EntityPlayerMP) entity; - - if (playerMP.timeUntilPortal > 0) - { - // do not switch dimensions if the player has any time on this thinger - playerMP.timeUntilPortal = 10; - } - else { - - // send to twilight - if (playerMP.dimension != TwilightForestMod.dimensionID) { - playerMP.triggerAchievement(TFAchievementPage.twilightPortal); - playerMP.triggerAchievement(TFAchievementPage.twilightArrival); - FMLLog.info("[TwilightForest] Player touched the portal block. Sending the player to dimension " + TwilightForestMod.dimensionID); - - playerMP.mcServer.getConfigurationManager().transferPlayerToDimension(playerMP, TwilightForestMod.dimensionID, new TFTeleporter(playerMP.mcServer.worldServerForDimension(TwilightForestMod.dimensionID))); - playerMP.addExperienceLevel(0); - playerMP.triggerAchievement(TFAchievementPage.twilightPortal); - playerMP.triggerAchievement(TFAchievementPage.twilightArrival); - - // set respawn point for TF dimension to near the arrival portal - int spawnX = MathHelper.floor_double(playerMP.posX); - int spawnY = MathHelper.floor_double(playerMP.posY); - int spawnZ = MathHelper.floor_double(playerMP.posZ); - - playerMP.setSpawnChunk(new ChunkCoordinates(spawnX, spawnY, spawnZ), true, TwilightForestMod.dimensionID); - } - else { - //System.out.println("Player touched the portal block. Sending the player to dimension 0"); - //playerMP.travelToDimension(0); - playerMP.mcServer.getConfigurationManager().transferPlayerToDimension(playerMP, 0, new TFTeleporter(playerMP.mcServer.worldServerForDimension(0))); - playerMP.addExperienceLevel(0); - } - } - } - else - { - if (entity.dimension != TwilightForestMod.dimensionID) - { - //sendEntityToDimension(entity, TwilightForestMod.dimensionID); - } - else - { - sendEntityToDimension(entity, 0); - } - } - } - - } - - /** - * This copy of the entity.travelToDimension method exists so that we can use our own teleporter - */ - public void sendEntityToDimension(Entity entity, int par1) { - // transfer a random entity? - if (!entity.worldObj.isRemote && !entity.isDead) - { - entity.worldObj.theProfiler.startSection("changeDimension"); - MinecraftServer minecraftserver = MinecraftServer.getServer(); - int dim = entity.dimension; - WorldServer worldserver = minecraftserver.worldServerForDimension(dim); - WorldServer worldserver1 = minecraftserver.worldServerForDimension(par1); - entity.dimension = par1; - entity.worldObj.removeEntity(entity); - entity.isDead = false; - entity.worldObj.theProfiler.startSection("reposition"); - minecraftserver.getConfigurationManager().transferEntityToWorld(entity, dim, worldserver, worldserver1, new TFTeleporter(worldserver1)); - entity.worldObj.theProfiler.endStartSection("reloading"); - Entity transferEntity = EntityList.createEntityByName(EntityList.getEntityString(entity), worldserver1); - - if (transferEntity != null) - { - transferEntity.copyDataFrom(entity, true); - worldserver1.spawnEntityInWorld(transferEntity); - } - - entity.isDead = true; - entity.worldObj.theProfiler.endSection(); - worldserver.resetUpdateEntityTick(); - worldserver1.resetUpdateEntityTick(); - entity.worldObj.theProfiler.endSection(); - } - } - - @Override - public void randomDisplayTick(World world, int i, int j, int k, Random random) - { - if(random.nextInt(100) == 0) - { - world.playSoundEffect(i + 0.5D, j + 0.5D, k + 0.5D, "portal.portal", 1.0F, random.nextFloat() * 0.4F + 0.8F); - } - for(int l = 0; l < 4; l++) - { - double d = i + random.nextFloat(); - double d1 = j + random.nextFloat(); - double d2 = k + random.nextFloat(); - double d3 = 0.0D; - double d4 = 0.0D; - double d5 = 0.0D; - int i1 = random.nextInt(2) * 2 - 1; - d3 = (random.nextFloat() - 0.5D) * 0.5D; - d4 = (random.nextFloat() - 0.5D) * 0.5D; - d5 = (random.nextFloat() - 0.5D) * 0.5D; - if(world.getBlock(i - 1, j, k) == this || world.getBlock(i + 1, j, k) == this) - { - d2 = k + 0.5D + 0.25D * i1; - d5 = random.nextFloat() * 2.0F * i1; - } else - { - d = i + 0.5D + 0.25D * i1; - d3 = random.nextFloat() * 2.0F * i1; - } - world.spawnParticle("portal", d, d1, d2, d3, d4, d5); - } - - } - - /** - * returns a list of blocks with the same ID, but different meta (eg: wood returns 4 blocks) - */ - @SuppressWarnings({ "rawtypes", "unchecked" }) - @Override - public void getSubBlocks(Item par1, CreativeTabs par2CreativeTabs, List par3List) - { - par3List.add(new ItemStack(par1, 1, 0)); - } -} diff --git a/src/main/java/twilightforest/block/BlockTFRipeTorchCluster.java b/src/main/java/twilightforest/block/BlockTFRipeTorchCluster.java deleted file mode 100644 index d4a7f2f505..0000000000 --- a/src/main/java/twilightforest/block/BlockTFRipeTorchCluster.java +++ /dev/null @@ -1,83 +0,0 @@ -package twilightforest.block; - -import java.util.Random; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.init.Items; -import net.minecraft.item.Item; -import net.minecraft.world.World; -import twilightforest.TwilightForestMod; -import twilightforest.item.TFItems; - -public class BlockTFRipeTorchCluster extends BlockTFTrollRoot { - - protected BlockTFRipeTorchCluster() { - super(); - - this.setBlockTextureName(TwilightForestMod.ID + ":ripe_torch_cluster"); - this.setLightLevel(1.0F); - - } - - public Item getItemDropped(int meta, Random rand, int fortune) - { - return TFItems.torchberries; - } - - /** - * Metadata and fortune sensitive version, this replaces the old (int meta, Random rand) - * version in 1.1. - * - * @param meta Blocks Metadata - * @param fortune Current item fortune level - * @param random Random number generator - * @return The number of items to drop - */ - public int quantityDropped(int meta, int fortune, Random random) { - return quantityDroppedWithBonus(fortune, random); - } - - /** - * Returns the quantity of items to drop on block destruction. - */ - public int quantityDropped(Random rand) - { - return 4 + rand.nextInt(5); - } - - /** - * Returns the usual quantity dropped by the block plus a bonus of 1 to 'i' (inclusive). - */ - public int quantityDroppedWithBonus(int bonus, Random rand) - { - if (bonus > 0 && Item.getItemFromBlock(this) != this.getItemDropped(0, rand, bonus)) - { - int j = rand.nextInt(bonus + 2) - 1; - - if (j < 0) - { - j = 0; - } - - return this.quantityDropped(rand) * (j + 1); - } - else - { - return this.quantityDropped(rand); - } - } - - /** - * Called when the player destroys a block with an item that can harvest it. (i, j, k) are the coordinates of the - * block and l is the block's subtype/damage. - */ - public void harvestBlock(World world, EntityPlayer player, int x, int y, int z, int meta) - { - // do not call normal harvest if the player is shearing - if (world.isRemote || player.getCurrentEquippedItem() == null || player.getCurrentEquippedItem().getItem() != Items.shears) - { - super.harvestBlock(world, player, x, y, z, meta); - } - } -} diff --git a/src/main/java/twilightforest/block/BlockTFRoots.java b/src/main/java/twilightforest/block/BlockTFRoots.java deleted file mode 100644 index 470662771a..0000000000 --- a/src/main/java/twilightforest/block/BlockTFRoots.java +++ /dev/null @@ -1,128 +0,0 @@ -package twilightforest.block; - -import java.util.List; -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.init.Items; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.IIcon; -import twilightforest.TwilightForestMod; -import twilightforest.item.TFItems; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public class BlockTFRoots extends Block { - - public static IIcon spRootSide; - public static IIcon spOreRootSide; - - - public static final int ROOT_META = 0; - public static final int OREROOT_META = 1; - - public BlockTFRoots() { - super(Material.wood); - this.setCreativeTab(TFItems.creativeTab); - this.setHardness(2.0F); - this.setStepSound(Block.soundTypeWood); - } - - - /** - * From the specified side and block metadata retrieves the blocks texture. Args: side, metadata - */ - @Override - public IIcon getIcon(int side, int meta) - { - if (meta == 1) { - return spOreRootSide; - } - else { - return spRootSide; - } - } - - @Override - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister par1IconRegister) - { - BlockTFRoots.spRootSide = par1IconRegister.registerIcon(TwilightForestMod.ID + ":rootblock"); - BlockTFRoots.spOreRootSide = par1IconRegister.registerIcon(TwilightForestMod.ID + ":oreroots"); - } - - /** - * Returns the ID of the items to drop on destruction. - */ - @Override - public Item getItemDropped(int meta, Random random, int j) - { - switch (meta) { - case ROOT_META : - // roots drop sticks - return Items.stick; - case OREROOT_META : - // oreroots drop liveroot - return TFItems.liveRoot; - default: - return Item.getItemFromBlock(this); - } - } - - - /** - * Determines the damage on the item the block drops. Used in cloth and wood. - */ - @Override - public int damageDropped(int meta) - { - switch (meta) { - case ROOT_META : - // roots drop sticks, no meta - return 0; - case OREROOT_META : - // oreroots drop liveroot, no meta - return 0; - default: - // set log flag on wood blocks - return meta | 8; - } - } - - /** - * Metadata and fortune sensitive version, this replaces the old (int meta, Random rand) - * version in 1.1. - * - * @param meta Blocks Metadata - * @param fortune Current item fortune level - * @param random Random number generator - * @return The number of items to drop - */ - @Override - public int quantityDropped(int meta, int fortune, Random random) { - switch (meta) { - case ROOT_META : - // roots drop several sticks - return 3 + random.nextInt(2); - default: - return super.quantityDropped(meta, fortune, random); - } - } - - - /** - * returns a list of blocks with the same ID, but different meta (eg: wood returns 4 blocks) - */ - @Override - @SideOnly(Side.CLIENT) - public void getSubBlocks(Item par1, CreativeTabs par2CreativeTabs, List par3List) - { - par3List.add(new ItemStack(par1, 1, 0)); - par3List.add(new ItemStack(par1, 1, 1)); - } - -} diff --git a/src/main/java/twilightforest/block/BlockTFSapling.java b/src/main/java/twilightforest/block/BlockTFSapling.java deleted file mode 100644 index 2a8b3c31a4..0000000000 --- a/src/main/java/twilightforest/block/BlockTFSapling.java +++ /dev/null @@ -1,200 +0,0 @@ -package twilightforest.block; - -import java.util.List; -import java.util.Random; - -import net.minecraft.block.BlockSapling; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.init.Blocks; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.IIcon; -import net.minecraft.world.World; -import net.minecraft.world.gen.feature.WorldGenerator; -import twilightforest.TwilightForestMod; -import twilightforest.item.TFItems; -import twilightforest.world.TFGenCanopyTree; -import twilightforest.world.TFGenDarkCanopyTree; -import twilightforest.world.TFGenHollowTree; -import twilightforest.world.TFGenLargeRainboak; -import twilightforest.world.TFGenMangroveTree; -import twilightforest.world.TFGenMinersTree; -import twilightforest.world.TFGenSmallRainboak; -import twilightforest.world.TFGenSmallTwilightOak; -import twilightforest.world.TFGenSortingTree; -import twilightforest.world.TFGenTreeOfTime; -import twilightforest.world.TFGenTreeOfTransformation; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public class BlockTFSapling extends BlockSapling -{ - - private IIcon[] icons; - private String[] iconNames = new String[] {"sapling_oak", "sapling_canopy", "sapling_mangrove", "sapling_darkwood", "sapling_hollow_oak", "sapling_time", "sapling_transformation", "sapling_mining", "sapling_sorting", "sapling_rainboak"}; - - protected BlockTFSapling() { - super(); - float var3 = 0.4F; - this.setBlockBounds(0.5F - var3, 0.0F, 0.5F - var3, 0.5F + var3, var3 * 2.0F, 0.5F + var3); - this.setCreativeTab(TFItems.creativeTab); - } - - /** - * Ticks the block if it's been scheduled - */ - @Override - public void updateTick(World par1World, int x, int y, int z, Random par5Random) - { - if (!par1World.isRemote) - { - //this.checkFlowerChange(par1World, x, y, z); - - if (par1World.getBlockLightValue(x, y + 1, z) >= 9 && par5Random.nextInt(7) == 0) - { - this.func_149878_d(par1World, x, y, z, par5Random); - } - } - } - - - /** - * Attempts to grow a sapling into a tree - */ - @Override - public void func_149878_d(World world, int x, int y, int z, Random rand) { - int meta = world.getBlockMetadata(x, y, z); - WorldGenerator treeGenerator = null; - int var8 = 0; - int var9 = 0; - boolean largeTree = false; - - if (meta == 1) - { - treeGenerator = new TFGenCanopyTree(true); - } - else if (meta == 2) - { - treeGenerator = new TFGenMangroveTree(true); - } - else if (meta == 3) - { - treeGenerator = new TFGenDarkCanopyTree(true); - } - else if (meta == 4) - { - treeGenerator = new TFGenHollowTree(true); - } - else if (meta == 5) - { - treeGenerator = new TFGenTreeOfTime(true); - } - else if (meta == 6) - { - treeGenerator = new TFGenTreeOfTransformation(true); - } - else if (meta == 7) - { - treeGenerator = new TFGenMinersTree(true); - } - else if (meta == 8) - { - treeGenerator = new TFGenSortingTree(true); - } - else if (meta == 9) - { - treeGenerator = rand.nextInt(7) == 0 ? new TFGenLargeRainboak(true) : new TFGenSmallRainboak(true); - } - else - { - treeGenerator = new TFGenSmallTwilightOak(true); - } - - if (largeTree) - { - world.setBlock(x + var8, y, z + var9, Blocks.air, 0, 4); - world.setBlock(x + var8 + 1, y, z + var9, Blocks.air, 0, 4); - world.setBlock(x + var8, y, z + var9 + 1, Blocks.air, 0, 4); - world.setBlock(x + var8 + 1, y, z + var9 + 1, Blocks.air, 0, 4); - } - else - { - world.setBlock(x, y, z, Blocks.air, 0, 4); - } - - if (!treeGenerator.generate(world, rand, x + var8, y, z + var9)) - { - if (largeTree) - { - world.setBlock(x + var8, y, z + var9, this, meta, 4); - world.setBlock(x + var8 + 1, y, z + var9, this, meta, 4); - world.setBlock(x + var8, y, z + var9 + 1, this, meta, 4); - world.setBlock(x + var8 + 1, y, z + var9 + 1, this, meta, 4); - } - else - { - world.setBlock(x, y, z, this, meta, 4); - } - } - } - - /** - * From the specified side and block metadata retrieves the blocks texture. Args: side, metadata - */ - @Override - public IIcon getIcon(int side, int metadata) - { - if (metadata < this.icons.length) - { - return this.icons[metadata]; - } - else - { - return null; - } - } - - @Override - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister par1IconRegister) - { - this.icons = new IIcon[iconNames.length]; - - for (int i = 0; i < this.icons.length; ++i) - { - this.icons[i] = par1IconRegister.registerIcon(TwilightForestMod.ID + ":" + iconNames[i]); - } - } - - /** - * Determines the damage on the item the block drops. Used in cloth and wood. - */ - @Override - public int damageDropped(int par1) - { - return par1; - } - - @SuppressWarnings({ "unchecked", "rawtypes" }) - @Override - @SideOnly(Side.CLIENT) - - /** - * returns a list of blocks with the same ID, but different meta (eg: wood returns 4 blocks) - */ - public void getSubBlocks(Item par1, CreativeTabs par2CreativeTabs, List par3List) - { - par3List.add(new ItemStack(par1, 1, 0)); - par3List.add(new ItemStack(par1, 1, 1)); - par3List.add(new ItemStack(par1, 1, 2)); - par3List.add(new ItemStack(par1, 1, 3)); - par3List.add(new ItemStack(par1, 1, 4)); - par3List.add(new ItemStack(par1, 1, 5)); - par3List.add(new ItemStack(par1, 1, 6)); - par3List.add(new ItemStack(par1, 1, 7)); - par3List.add(new ItemStack(par1, 1, 8)); - par3List.add(new ItemStack(par1, 1, 9)); - } - -} diff --git a/src/main/java/twilightforest/block/BlockTFShield.java b/src/main/java/twilightforest/block/BlockTFShield.java deleted file mode 100644 index 8c7bba1b89..0000000000 --- a/src/main/java/twilightforest/block/BlockTFShield.java +++ /dev/null @@ -1,173 +0,0 @@ -package twilightforest.block; - -import java.util.List; -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockPistonBase; -import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.IIcon; -import net.minecraft.util.MovingObjectPosition; -import net.minecraft.util.Vec3; -import net.minecraft.world.World; -import twilightforest.TwilightForestMod; -import twilightforest.item.TFItems; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public class BlockTFShield extends Block -{ - - public static IIcon sprSide; - private IIcon sprInside; - private IIcon sprOutside; - - public BlockTFShield() - { - super(Material.rock); - this.setBlockUnbreakable(); - //this.setResistance(2000.0F); - this.setResistance(6000000.0F); - this.setStepSound(Block.soundTypeMetal); - this.setCreativeTab(TFItems.creativeTab); - } - - /** - * From the specified side and block metadata retrieves the blocks texture. Args: side, metadata - */ - @Override - public IIcon getIcon(int side, int meta) - { - if (side == meta) - { - return sprInside; - } - else - { - return sprOutside; - } - } - - /** - * Properly register icon source - */ - @Override - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister par1IconRegister) - { - this.sprInside = par1IconRegister.registerIcon(TwilightForestMod.ID + ":shield_inside"); - this.sprOutside = par1IconRegister.registerIcon(TwilightForestMod.ID + ":shield_outside"); - } - - /** - * returns a list of blocks with the same ID, but different meta (eg: wood returns 4 blocks) - */ - @SuppressWarnings({ "unchecked", "rawtypes" }) - @Override - public void getSubBlocks(Item par1, CreativeTabs par2CreativeTabs, List par3List) - { - par3List.add(new ItemStack(par1, 1, 0)); - } - - - /** - * Returns which pass should this block be rendered on. 0 for solids and 1 for alpha - */ - @Override - public int getRenderBlockPass() - { - return 0; - } - - /** - * Is this block (a) opaque and (b) a full 1m cube? This determines whether or not to render the shared face of two - * adjacent blocks and also whether the player can attach torches, redstone wire, etc to this block. - */ - @Override - public boolean isOpaqueCube() - { - return true; - } - - /** - * If this block doesn't render as an ordinary block it will return False (examples: signs, buttons, stairs, etc) - */ - @Override - public boolean renderAsNormalBlock() - { - return true; - } - - /** - * Determines the damage on the item the block drops. Used in cloth and wood. - */ - @Override - public int damageDropped(int meta) { - return 0; - } - - /** - * Returns the quantity of items to drop on block destruction. - */ - @Override - public int quantityDropped(Random par1Random) - { - return 0; - } - - /** - * Called when the block is placed in the world. - */ - @Override - public void onBlockPlacedBy(World par1World, int par2, int par3, int par4, EntityLivingBase par5EntityLiving, ItemStack par6ItemStack) - { - int l = BlockPistonBase.determineOrientation(par1World, par2, par3, par4, par5EntityLiving); - par1World.setBlockMetadataWithNotify(par2, par3, par4, l, 2); - } - - /** - * Gets the hardness of block at the given coordinates in the given world, relative to the ability of the given - * EntityPlayer. - */ - @Override - public float getPlayerRelativeBlockHardness(EntityPlayer player, World world, int x, int y, int z) - { - // why can't we just pass the side to this method? This is annoying and failure-prone - MovingObjectPosition mop = getPlayerPointVec(world, player, 6.0); - - int facing = mop != null ? mop.sideHit : -1; - int meta = world.getBlockMetadata(x, y, z); - - //System.out.printf("Determining relative hardness; facing = %d, meta = %d\n", facing, meta); - - if (facing == meta) - { - return player.getBreakSpeed(Blocks.stone, false, 0, x, y, z) / 1.5F / 100F; - } - else - { - return super.getPlayerRelativeBlockHardness(player, world, x, y, z); - } - } - - /** - * What block is the player pointing at? - * - * This very similar to player.rayTrace, but that method is not available on the server. - * - * @return - */ - private MovingObjectPosition getPlayerPointVec(World worldObj, EntityPlayer player, double range) { - Vec3 position = Vec3.createVectorHelper(player.posX, player.posY + player.getEyeHeight(), player.posZ); - Vec3 look = player.getLook(1.0F); - Vec3 dest = position.addVector(look.xCoord * range, look.yCoord * range, look.zCoord * range); - return worldObj.rayTraceBlocks(position, dest); - } -} diff --git a/src/main/java/twilightforest/block/BlockTFSlider.java b/src/main/java/twilightforest/block/BlockTFSlider.java deleted file mode 100644 index 3536c94862..0000000000 --- a/src/main/java/twilightforest/block/BlockTFSlider.java +++ /dev/null @@ -1,319 +0,0 @@ -package twilightforest.block; - -import java.util.List; -import java.util.Random; - -import org.lwjgl.opengl.GL11; - -import twilightforest.TwilightForestMod; -import twilightforest.entity.EntityTFSlideBlock; -import twilightforest.item.TFItems; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import net.minecraft.block.Block; -import net.minecraft.block.BlockRotatedPillar; -import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.item.EntityFallingBlock; -import net.minecraft.init.Blocks; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.DamageSource; -import net.minecraft.util.IIcon; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; - -public class BlockTFSlider extends BlockRotatedPillar { - - private static final int TICK_TIME = 80; - private static final int OFFSET_TIME = 20; - private static final int PLAYER_RANGE = 32; - private static final float BLOCK_DAMAGE = 5; - private IIcon horiIcon; - private IIcon vertIcon; - private IIcon topIcon; - - protected BlockTFSlider() { - super(Material.iron); - this.setCreativeTab(TFItems.creativeTab); - this.setHardness(2.0F); - this.setResistance(10.0F); - } - - /** - * Returns a bounding box from the pool of bounding boxes (this means this box can change after the pool has been - * cleared to be reused) - */ - @Override - public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) - { - int meta = world.getBlockMetadata(x, y, z); - - int rotation = meta & 12; - float pixel = 0.0625F; - float inset = 5F; - - switch (rotation) { - case 0: - default: - return AxisAlignedBB.getBoundingBox(x + pixel * inset, y, z + pixel * inset, x + 1F - pixel * inset, y + 1F, z + 1F - pixel * inset); - case 4: - return AxisAlignedBB.getBoundingBox(x, y + pixel * inset, z + pixel * inset, x + 1F, y + 1F - pixel * inset, z + 1F - pixel * inset); - case 8: - return AxisAlignedBB.getBoundingBox(x + pixel * inset, y + pixel * inset, z, x + 1F - pixel * inset, y + 1F - pixel * inset, z + 1F); - } - - } - - - /** - * Returns the bounding box of the wired rectangular prism to render. - */ - @SideOnly(Side.CLIENT) - public AxisAlignedBB getSelectedBoundingBoxFromPool(World world, int x, int y, int z) - { - return this.getCollisionBoundingBoxFromPool(world, x, y, z); - } - - /** - * Updates the blocks bounds based on its current state. Args: world, x, y, z - */ - public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) - { - int meta = world.getBlockMetadata(x, y, z); - - setBlockBoundsBasedOnMeta(meta); - } - - public void setBlockBoundsBasedOnMeta(int meta) { - int rotation = meta & 12; - float pixel = 0.0625F; - float inset = 5F; - - switch (rotation) { - case 0: - default: - this.setBlockBounds(pixel * inset, 0, pixel * inset, 1F - pixel * inset, 1F, 1F - pixel * inset); - break; - case 4: - this.setBlockBounds(0, pixel * inset, pixel * inset, 1F, 1F - pixel * inset, 1F - pixel * inset); - break; - case 8: - this.setBlockBounds(pixel * inset, pixel * inset, 0, 1F - pixel * inset, 1F - pixel * inset, 1F); - break; - } - } - - /** - * If this block doesn't render as an ordinary block it will return False (examples: signs, buttons, stairs, etc) - */ - public boolean renderAsNormalBlock() - { - return false; - } - - /** - * Is this block (a) opaque and (b) a full 1m cube? This determines whether or not to render the shared face of two - * adjacent blocks and also whether the player can attach torches, redstone wire, etc to this block. - */ - public boolean isOpaqueCube() - { - return false; - } - - /** - * The type of render function that is called for this block - */ - public int getRenderType() - { - return 0; - } - - /** - * Gets the block's texture. Args: side, meta - */ - @SideOnly(Side.CLIENT) - public IIcon getIcon(int side, int meta) - { - int rotation = meta & 12; - - if (rotation == 0) { - switch (side) { - case 0: - case 1: - return this.topIcon; - default: - return this.vertIcon; - } - } else if (rotation == 4) { - switch (side) { - case 4: - case 5: - return this.topIcon; - default: - return this.horiIcon; - } - } else { // rotation == 8 - switch (side) { - case 2: - case 3: - return this.topIcon; - case 0: - case 1: - return this.vertIcon; - default: - return this.horiIcon; - } - } - - -// int type = 0; -// return rotation == 0 && (side == 1 || side == 0) ? this.getTopIcon(type) : (rotation == 4 && (side == 5 || side == 4) ? this.getTopIcon(type) : (rotation == 8 && (side == 2 || side == 3) ? this.getTopIcon(type) : this.getSideIcon(type))); - } - - @SideOnly(Side.CLIENT) - @Override - protected IIcon getSideIcon(int meta) - { - if ((meta & 12) == 0) { - return this.horiIcon; - } else if ((meta & 12) == 8) { - return this.horiIcon; - } - return this.vertIcon; - } - - @SideOnly(Side.CLIENT) - @Override - protected IIcon getTopIcon(int p_150161_1_) - { - return this.topIcon; - } - - - @Override - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister par1IconRegister) - { - this.horiIcon = par1IconRegister.registerIcon(TwilightForestMod.ID + ":slider_h"); - this.vertIcon = par1IconRegister.registerIcon(TwilightForestMod.ID + ":slider_v"); - this.topIcon = par1IconRegister.registerIcon(TwilightForestMod.ID + ":slider_top"); - } - - /** - * Ticks the block if it's been scheduled - */ - @Override - public void updateTick(World world, int x, int y, int z, Random par5Random) - { - if (!world.isRemote && this.isConnectedInRange(world, x, y, z)) - { - //world.playSoundEffect(x + 0.5D, y + 0.5D, z + 0.5D, TwilightForestMod.ID + ":random.creakstart", 0.75F, 1.5F); - - EntityTFSlideBlock slideBlock = new EntityTFSlideBlock(world, x + 0.5, y, z + 0.5, this, world.getBlockMetadata(x, y, z)); - world.spawnEntityInWorld(slideBlock); - - } - - scheduleBlockUpdate(world, x, y, z); - - } - - /** - * Check if there is any players in range, and also recursively check connected blocks - */ - public boolean isConnectedInRange(World world, int x, int y, int z) { - int meta = world.getBlockMetadata(x, y, z); - - if ((meta & 12) == 0) { - return this.anyPlayerInRange(world, x, y, z) || this.isConnectedInRangeRecursive(world, x, y, z, ForgeDirection.UP) || this.isConnectedInRangeRecursive(world, x, y, z, ForgeDirection.DOWN); - } else if ((meta & 12) == 4) { - return this.anyPlayerInRange(world, x, y, z) || this.isConnectedInRangeRecursive(world, x, y, z, ForgeDirection.WEST) || this.isConnectedInRangeRecursive(world, x, y, z, ForgeDirection.EAST); - } else if ((meta & 12) == 8) { - return this.anyPlayerInRange(world, x, y, z) || this.isConnectedInRangeRecursive(world, x, y, z, ForgeDirection.NORTH) || this.isConnectedInRangeRecursive(world, x, y, z, ForgeDirection.SOUTH); - } else { - // why are we here? - return this.anyPlayerInRange(world, x, y, z); - } - } - - private boolean isConnectedInRangeRecursive(World world, int x, int y, int z, ForgeDirection dir) { - // where is the coords we're talking about - int dx = x + dir.offsetX; - int dy = y + dir.offsetY; - int dz = z + dir.offsetZ; - - // are the blocks connected? (block and meta are the same - if (world.getBlock(x, y, z) == world.getBlock(dx, dy, dz) && world.getBlockMetadata(x, y, z) == world.getBlockMetadata(dx, dy, dz)) { - return this.anyPlayerInRange(world, dx, dy, dz) || this.isConnectedInRangeRecursive(world, dx, dy, dz, dir); - } else { - return false; - } - } - - /** - * Returns true if there is a player in range (using World.getClosestPlayer) - * @param world - * @param z - * @param y - * @param x - */ - public boolean anyPlayerInRange(World world, int x, int y, int z) { - return world.getClosestPlayer((double)x + 0.5D, (double)y + 0.5D, (double)z + 0.5D, PLAYER_RANGE) != null; - } - - public void scheduleBlockUpdate(World world, int x, int y, int z) { - int offset = world.getBlockMetadata(x, y, z) & 3; - int update = TICK_TIME - ((int)(world.getWorldTime() - (offset * OFFSET_TIME)) % TICK_TIME); - world.scheduleBlockUpdate(x, y, z, this, update); - - //System.out.println("The current world time is " + world.getWorldTime() + " so update scheduled for " + update + " ticks."); - } - - /** - * Schedule an update to try to get lighting right - */ - @Override - public void onBlockAdded(World world, int x, int y, int z) { - scheduleBlockUpdate(world, x, y, z); - } - - /** - * returns a list of blocks with the same ID, but different meta (eg: wood returns 4 blocks) - */ - @Override - public void getSubBlocks(Item par1, CreativeTabs par2CreativeTabs, List par3List) - { - par3List.add(new ItemStack(par1, 1, 0)); - par3List.add(new ItemStack(par1, 1, 1)); - par3List.add(new ItemStack(par1, 1, 2)); - par3List.add(new ItemStack(par1, 1, 3)); - } - - /** - * Sets the block's bounds for rendering it as an item - */ - public void setBlockBoundsForItemRender() - { - this.setBlockBoundsBasedOnMeta(0); - } - - /** - * Triggered whenever an entity collides with this block (enters into the block). Args: world, x, y, z, entity - */ - public void onEntityCollidedWithBlock(World world, int x, int y, int z, Entity entity) - { - entity.attackEntityFrom(DamageSource.generic, BLOCK_DAMAGE); - if (entity instanceof EntityLivingBase) { - double kx = (x + 0.5 - entity.posX) * 2.0; - double kz = (z + 0.5 - entity.posZ) * 2.0; - - ((EntityLivingBase) entity).knockBack(null, 5, kx, kz); - } - } -} diff --git a/src/main/java/twilightforest/block/BlockTFThornRose.java b/src/main/java/twilightforest/block/BlockTFThornRose.java deleted file mode 100644 index ed4386bb3e..0000000000 --- a/src/main/java/twilightforest/block/BlockTFThornRose.java +++ /dev/null @@ -1,96 +0,0 @@ -package twilightforest.block; - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; -import twilightforest.item.TFItems; - -public class BlockTFThornRose extends Block { - - protected BlockTFThornRose() { - super(Material.plants); - - this.setHardness(10.0F); - this.setStepSound(soundTypeGrass); - this.setCreativeTab(TFItems.creativeTab); - - float radius = 0.4F; - this.setBlockBounds(0.5F - radius, 0.5F - radius, 0.5F - radius, 0.5F + radius, .5F + radius, 0.5F + radius); - } - - /** - * The type of render function that is called for this block - */ - @Override - public int getRenderType() - { - return 1; - } - - /** - * If this block doesn't render as an ordinary block it will return False (examples: signs, buttons, stairs, etc) - */ - public boolean renderAsNormalBlock() - { - return false; - } - - /** - * Is this block (a) opaque and (b) a full 1m cube? This determines whether or not to render the shared face of two - * adjacent blocks and also whether the player can attach torches, redstone wire, etc to this block. - */ - public boolean isOpaqueCube() - { - return false; - } - - /** - * Checks to see if its valid to put this block at the specified coordinates. Args: world, x, y, z - */ - public boolean canPlaceBlockAt(World world, int x, int y, int z) - { - return canBlockStay(world, x, y, z); - } - - /** - * Returns a bounding box from the pool of bounding boxes (this means this box can change after the pool has been - * cleared to be reused) - */ - public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) - { - return null; - } - - /** - * Lets the block know when one of its neighbor changes. Doesn't know which neighbor changed (coordinates passed are - * their own) Args: x, y, z, neighbor Block - */ - public void onNeighborBlockChange(World world, int x, int y, int z, Block block) - { - if (!canBlockStay(world, x, y, z)) { - this.dropBlockAsItem(world, x, y, z, world.getBlockMetadata(x, y, z), 0); - world.setBlockToAir(x, y, z); - } - } - - /** - * Can this block stay at this position. Similar to canPlaceBlockAt except gets checked often with plants. - */ - public boolean canBlockStay(World world, int x, int y, int z) { - boolean supported = false; - - for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { - int dx = x + dir.offsetX; - int dy = y + dir.offsetY; - int dz = z + dir.offsetZ; - - if (world.getBlock(dx, dy, dz).canSustainLeaves(world, dx, dy, dz)) { - supported = true; - } - } - return supported; - } - -} diff --git a/src/main/java/twilightforest/block/BlockTFThorns.java b/src/main/java/twilightforest/block/BlockTFThorns.java deleted file mode 100644 index c3cc96771c..0000000000 --- a/src/main/java/twilightforest/block/BlockTFThorns.java +++ /dev/null @@ -1,293 +0,0 @@ -package twilightforest.block; - -import java.util.List; -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockRotatedPillar; -import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.entity.Entity; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.DamageSource; -import net.minecraft.util.IIcon; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; -import twilightforest.TwilightForestMod; -import twilightforest.item.TFItems; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public class BlockTFThorns extends BlockRotatedPillar { - - private static final float THORN_DAMAGE = 4.0F; - - private String[] names; - private IIcon sideIcons[]; - private IIcon topIcons[]; - - protected BlockTFThorns() { - super(Material.wood); - - this.setNames(new String[] {"brown", "green"}); - - this.setHardness(50.0F); - this.setResistance(2000.0F); - this.setStepSound(soundTypeWood); - this.setCreativeTab(TFItems.creativeTab); - } - - /** - * The type of render function that is called for this block - */ - @Override - public int getRenderType() - { - return TwilightForestMod.proxy.getThornsBlockRenderID(); - } - - /** - * If this block doesn't render as an ordinary block it will return False (examples: signs, buttons, stairs, etc) - */ - public boolean renderAsNormalBlock() - { - return false; - } - - /** - * Is this block (a) opaque and (b) a full 1m cube? This determines whether or not to render the shared face of two - * adjacent blocks and also whether the player can attach torches, redstone wire, etc to this block. - */ - public boolean isOpaqueCube() - { - return false; - } - - /** - * Returns a bounding box from the pool of bounding boxes (this means this box can change after the pool has been - * cleared to be reused) - */ - @Override - public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) - { - int meta = world.getBlockMetadata(x, y, z); - - int rotation = meta & 12; - float pixel = 0.0625F; - - switch (rotation) { - case 0: - default: - return AxisAlignedBB.getBoundingBox(x + pixel * 3F, y, z + pixel * 3F, x + 1F - pixel * 3F, y + 1F, z + 1F - pixel * 3F); - case 4: - return AxisAlignedBB.getBoundingBox(x, y + pixel * 3F, z + pixel * 3F, x + 1F, y + 1F - pixel * 3F, z + 1F - pixel * 3F); - case 8: - return AxisAlignedBB.getBoundingBox(x + pixel * 3F, y + pixel * 3F, z, x + 1F - pixel * 3F, y + 1F - pixel * 3F, z + 1F); - } - - } - - /** - * Returns the bounding box of the wired rectangular prism to render. - */ - @SideOnly(Side.CLIENT) - public AxisAlignedBB getSelectedBoundingBoxFromPool(World world, int x, int y, int z) - { - return this.getCollisionBoundingBoxFromPool(world, x, y, z); - } - - - /** - * Triggered whenever an entity collides with this block (enters into the block). Args: world, x, y, z, entity - */ - public void onEntityCollidedWithBlock(World world, int x, int y, int z, Entity entity) - { - entity.attackEntityFrom(DamageSource.cactus, THORN_DAMAGE); - } - - /** - * When we are chopped, things get bad - */ - public boolean removedByPlayer(World world, EntityPlayer player, int x, int y, int z) { - int meta = world.getBlockMetadata(x, y, z); - if (!player.capabilities.isCreativeMode) { - if (!world.isRemote) { - // grow back - world.setBlock(x, y, z, this, (meta & 12) | 1, 2); - // grow more - this.doThornBurst(world, x, y, z, meta); - } - } else { - world.setBlockToAir(x, y, z); - } - - return true; - } - - /** - * Returns the mobility information of the block, 0 = free, 1 = can't push but can move over, 2 = total immobility - * and stop pistons - */ - public int getMobilityFlag() - { - return 2; - } - - /** - * Grow thorns out of both the ends, then maybe in another direction too - */ - private void doThornBurst(World world, int x, int y, int z, int meta) { - int rotation = meta & 12; - - switch (rotation) { - case 0: - growThorns(world, x, y, z, ForgeDirection.UP); - growThorns(world, x, y, z, ForgeDirection.DOWN); - break; - case 4: - growThorns(world, x, y, z, ForgeDirection.EAST); - growThorns(world, x, y, z, ForgeDirection.WEST); - break; - case 8: - growThorns(world, x, y, z, ForgeDirection.NORTH); - growThorns(world, x, y, z, ForgeDirection.SOUTH); - break; - } - - // also try three random directions - growThorns(world, x, y, z, ForgeDirection.VALID_DIRECTIONS[world.rand.nextInt(ForgeDirection.VALID_DIRECTIONS.length)]); - growThorns(world, x, y, z, ForgeDirection.VALID_DIRECTIONS[world.rand.nextInt(ForgeDirection.VALID_DIRECTIONS.length)]); - growThorns(world, x, y, z, ForgeDirection.VALID_DIRECTIONS[world.rand.nextInt(ForgeDirection.VALID_DIRECTIONS.length)]); - - } - - /** - * grow several green thorns in the specified direction - */ - private void growThorns(World world, int x, int y, int z, ForgeDirection dir) { - int length = 1 + world.rand.nextInt(3); - - for (int i = 1; i < length; i++) { - int dx = x + (dir.offsetX * i); - int dy = y + (dir.offsetY * i); - int dz = z + (dir.offsetZ * i); - - if (world.isAirBlock(dx, dy, dz)) { - world.setBlock(dx, dy, dz, this, getMetaFor(dir) | 1, 2); - } else { - break; - } - } - } - - /** - * Get the meta we need to place a new block in the specified direction - * @param dir - * @return - */ - public static int getMetaFor(ForgeDirection dir) { - switch (dir) { - case UNKNOWN: - default: - case UP: - case DOWN: - return 0; - case EAST: - case WEST: - return 4; - case NORTH: - case SOUTH: - return 8; - } - } - - /** - * Like logs, we start leaf decay when broken - */ - public void breakBlock(World world, int x, int y, int z, Block logBlock, int metadata) - { - byte range = 4; - int exRange = range + 1; - - if (world.checkChunksExist(x - exRange, y - exRange, z - exRange, x + exRange, y + exRange, z + exRange)) - { - for (int dx = -range; dx <= range; ++dx) - { - for (int dy = -range; dy <= range; ++dy) - { - for (int dz = -range; dz <= range; ++dz) - { - Block block = world.getBlock(x + dx, y + dy, z + dz); - if (block.isLeaves(world, x + dx, y + dy, z + dz)) - { - block.beginLeavesDecay(world, x + dx, y + dy, z + dz); - } - } - } - } - } - } - - /** - * Returns the quantity of items to drop on block destruction. - */ - public int quantityDropped(Random p_149745_1_) - { - return 0; - } - - @SideOnly(Side.CLIENT) - @Override - protected IIcon getSideIcon(int meta) { - return this.sideIcons[meta & 3]; - } - - @SideOnly(Side.CLIENT) - protected IIcon getTopIcon(int meta) - { - return this.topIcons[meta & 3]; - } - - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister iconRegister) - { - this.sideIcons = new IIcon[getNames().length]; - this.topIcons = new IIcon[getNames().length]; - - for (int i = 0; i < getNames().length; i++) { - this.sideIcons[i] = iconRegister.registerIcon(TwilightForestMod.ID + ":" + getNames()[i] + "_thorns_side"); - this.topIcons[i] = iconRegister.registerIcon(TwilightForestMod.ID + ":" + getNames()[i] + "_thorns_top"); - } - } - - @Override - public boolean canSustainLeaves(IBlockAccess world, int x, int y, int z) - { - return true; - } - - /** - * returns a list of blocks with the same ID, but different meta (eg: wood returns 4 blocks) - */ - @SuppressWarnings({ "rawtypes", "unchecked" }) - @Override - public void getSubBlocks(Item par1, CreativeTabs par2CreativeTabs, List par3List) - { - for (int i = 0; i < getNames().length; i++) { - par3List.add(new ItemStack(par1, 1, i)); - } - } - - public String[] getNames() { - return names; - } - - public void setNames(String[] names) { - this.names = names; - } -} diff --git a/src/main/java/twilightforest/block/BlockTFTowerDevice.java b/src/main/java/twilightforest/block/BlockTFTowerDevice.java deleted file mode 100644 index 11997dc59d..0000000000 --- a/src/main/java/twilightforest/block/BlockTFTowerDevice.java +++ /dev/null @@ -1,789 +0,0 @@ -package twilightforest.block; - -import java.util.List; -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockSourceImpl; -import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.entity.Entity; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.IIcon; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; -import twilightforest.TwilightForestMod; -import twilightforest.item.TFItems; -import twilightforest.tileentity.TileEntityTFCReactorActive; -import twilightforest.tileentity.TileEntityTFGhastTrapActive; -import twilightforest.tileentity.TileEntityTFGhastTrapInactive; -import twilightforest.tileentity.TileEntityTFReverter; -import twilightforest.tileentity.TileEntityTFTowerBuilder; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - - - -/** - * - * Tower wood is a type of plank block that forms the walls of Dark Towers - * - * @author Ben - * - */ -public class BlockTFTowerDevice extends Block { - - private static IIcon TEX_REAPPEARING_INACTIVE; - private static IIcon TEX_REAPPEARING_ACTIVE; - private static IIcon TEX_VANISH_INACTIVE; - private static IIcon TEX_VANISH_ACTIVE; - private static IIcon TEX_VANISH_LOCKED; - private static IIcon TEX_VANISH_UNLOCKED; - private static IIcon TEX_BUILDER_INACTIVE; - private static IIcon TEX_BUILDER_ACTIVE; - private static IIcon TEX_ANTIBUILDER; - private static IIcon TEX_BUILDER_TIMEOUT; - private static IIcon TEX_GHASTTRAP_INACTIVE; - private static IIcon TEX_GHASTTRAP_ACTIVE; - private static IIcon TEX_REACTOR_INACTIVE; - private static IIcon TEX_REACTOR_ACTIVE; - private static IIcon TEX_GHASTTRAP_LID_INACTIVE; - private static IIcon TEX_GHASTTRAP_LID_ACTIVE; - private static IIcon TEX_SMOKER_ACTIVE; - private static IIcon TEX_SMOKER_INACTIVE; - private static IIcon TEX_FIREJET_ACTIVE; - private static IIcon TEX_FIREJET_INACTIVE; - - public static final int META_REAPPEARING_INACTIVE = 0; - public static final int META_REAPPEARING_ACTIVE = 1; - public static final int META_VANISH_INACTIVE = 2; - public static final int META_VANISH_ACTIVE = 3; - public static final int META_VANISH_LOCKED = 4; - public static final int META_VANISH_UNLOCKED = 5; - public static final int META_BUILDER_INACTIVE = 6; - public static final int META_BUILDER_ACTIVE = 7; - public static final int META_BUILDER_TIMEOUT = 8; - public static final int META_ANTIBUILDER = 9; - public static final int META_GHASTTRAP_INACTIVE = 10; - public static final int META_GHASTTRAP_ACTIVE = 11; - public static final int META_REACTOR_INACTIVE = 12; - public static final int META_REACTOR_ACTIVE = 13; - - public BlockTFTowerDevice() - { - super(Material.wood); - this.setHardness(10F); - this.setResistance(35F); - this.setStepSound(Block.soundTypeWood); - this.setCreativeTab(TFItems.creativeTab); - } - - /** - * How many world ticks before ticking - */ - public int tickRate() - { - return 15; - } - - /** - * From the specified side and block metadata retrieves the blocks texture. Args: side, metadata - */ - @Override - public IIcon getIcon(int side, int meta) { - switch (meta) - { - case META_REAPPEARING_INACTIVE: - default: - return TEX_REAPPEARING_INACTIVE; - case META_REAPPEARING_ACTIVE: - return TEX_REAPPEARING_ACTIVE; - case META_VANISH_INACTIVE: - return TEX_VANISH_INACTIVE; - case META_VANISH_ACTIVE: - return TEX_VANISH_ACTIVE; - case META_VANISH_LOCKED: - return TEX_VANISH_LOCKED; - case META_VANISH_UNLOCKED: - return TEX_VANISH_UNLOCKED; - case META_BUILDER_INACTIVE: - return TEX_BUILDER_INACTIVE; - case META_BUILDER_TIMEOUT: - return TEX_BUILDER_TIMEOUT; - case META_BUILDER_ACTIVE: - return TEX_BUILDER_ACTIVE; - case META_ANTIBUILDER: - return TEX_ANTIBUILDER; - case META_GHASTTRAP_INACTIVE: - if (side >= 2) - { - return TEX_GHASTTRAP_INACTIVE; - } - else if (side == 1) - { - return TEX_GHASTTRAP_LID_INACTIVE; - } - else - { - return TFBlocks.towerWood.getIcon(side, 1); - } - case META_GHASTTRAP_ACTIVE: - if (side >= 2) - { - return TEX_GHASTTRAP_ACTIVE; - } - else if (side == 1) - { - return TEX_GHASTTRAP_LID_ACTIVE; - } - else - { - return TFBlocks.towerWood.getIcon(side, 1); - } - case META_REACTOR_INACTIVE: - return TEX_REACTOR_INACTIVE; - case META_REACTOR_ACTIVE: - return TEX_REACTOR_ACTIVE; - } - } - - @Override - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister par1IconRegister) - { - BlockTFTowerDevice.TEX_REAPPEARING_INACTIVE = par1IconRegister.registerIcon(TwilightForestMod.ID + ":towerdev_reappearing_off"); - BlockTFTowerDevice.TEX_REAPPEARING_ACTIVE = par1IconRegister.registerIcon(TwilightForestMod.ID + ":towerdev_reappearing_on"); - BlockTFTowerDevice.TEX_VANISH_INACTIVE = par1IconRegister.registerIcon(TwilightForestMod.ID + ":towerdev_vanish_off"); - BlockTFTowerDevice.TEX_VANISH_ACTIVE = par1IconRegister.registerIcon(TwilightForestMod.ID + ":towerdev_vanish_on"); - BlockTFTowerDevice.TEX_VANISH_LOCKED = par1IconRegister.registerIcon(TwilightForestMod.ID + ":towerdev_lock_on"); - BlockTFTowerDevice.TEX_VANISH_UNLOCKED = par1IconRegister.registerIcon(TwilightForestMod.ID + ":towerdev_lock_off"); - BlockTFTowerDevice.TEX_BUILDER_INACTIVE = par1IconRegister.registerIcon(TwilightForestMod.ID + ":towerdev_builder_off"); - BlockTFTowerDevice.TEX_BUILDER_ACTIVE = par1IconRegister.registerIcon(TwilightForestMod.ID + ":towerdev_builder_on"); - BlockTFTowerDevice.TEX_ANTIBUILDER = par1IconRegister.registerIcon(TwilightForestMod.ID + ":towerdev_antibuilder"); - BlockTFTowerDevice.TEX_BUILDER_TIMEOUT = par1IconRegister.registerIcon(TwilightForestMod.ID + ":towerdev_builder_timeout"); - BlockTFTowerDevice.TEX_GHASTTRAP_INACTIVE = par1IconRegister.registerIcon(TwilightForestMod.ID + ":towerdev_ghasttrap_off"); - BlockTFTowerDevice.TEX_GHASTTRAP_ACTIVE = par1IconRegister.registerIcon(TwilightForestMod.ID + ":towerdev_ghasttrap_on"); - BlockTFTowerDevice.TEX_REACTOR_INACTIVE = par1IconRegister.registerIcon(TwilightForestMod.ID + ":towerdev_reactor_off"); - BlockTFTowerDevice.TEX_REACTOR_ACTIVE = par1IconRegister.registerIcon(TwilightForestMod.ID + ":towerdev_reactor_on"); - BlockTFTowerDevice.TEX_GHASTTRAP_LID_INACTIVE = par1IconRegister.registerIcon(TwilightForestMod.ID + ":towerdev_ghasttraplid_off"); - BlockTFTowerDevice.TEX_GHASTTRAP_LID_ACTIVE = par1IconRegister.registerIcon(TwilightForestMod.ID + ":towerdev_ghasttraplid_on"); - BlockTFTowerDevice.TEX_SMOKER_INACTIVE = par1IconRegister.registerIcon(TwilightForestMod.ID + ":towerdev_smoker_off"); - BlockTFTowerDevice.TEX_SMOKER_ACTIVE = par1IconRegister.registerIcon(TwilightForestMod.ID + ":towerdev_smoker_on"); - BlockTFTowerDevice.TEX_FIREJET_INACTIVE = par1IconRegister.registerIcon(TwilightForestMod.ID + ":towerdev_firejet_off"); - BlockTFTowerDevice.TEX_FIREJET_ACTIVE = par1IconRegister.registerIcon(TwilightForestMod.ID + ":towerdev_firejet_on"); - } - - /** - * returns a list of blocks with the same ID, but different meta (eg: wood returns 4 blocks) - */ - @Override - public void getSubBlocks(Item par1, CreativeTabs par2CreativeTabs, List par3List) - { - par3List.add(new ItemStack(par1, 1, META_REAPPEARING_INACTIVE)); - par3List.add(new ItemStack(par1, 1, META_VANISH_INACTIVE)); - par3List.add(new ItemStack(par1, 1, META_VANISH_LOCKED)); - par3List.add(new ItemStack(par1, 1, META_VANISH_UNLOCKED)); - par3List.add(new ItemStack(par1, 1, META_BUILDER_INACTIVE)); - par3List.add(new ItemStack(par1, 1, META_ANTIBUILDER)); - par3List.add(new ItemStack(par1, 1, META_GHASTTRAP_INACTIVE)); - par3List.add(new ItemStack(par1, 1, META_REACTOR_INACTIVE)); - } - - /** - * Called upon block activation (right click on the block.) - */ - @Override - public boolean onBlockActivated(World par1World, int x, int y, int z, EntityPlayer par5EntityPlayer, int par6, float par7, float par8, float par9) - { - int meta = par1World.getBlockMetadata(x, y, z); - - if (meta == META_VANISH_INACTIVE) - { - if (areNearbyLockBlocks(par1World, x, y, z)) - { - par1World.playSoundEffect(x + 0.5D, y + 0.5D, z + 0.5D, "random.click", 1.0F, 0.3F); - } - else - { - changeToActiveVanishBlock(par1World, x, y, z, META_VANISH_ACTIVE); - } - return true; - } - if (meta == META_REAPPEARING_INACTIVE) - { - if (areNearbyLockBlocks(par1World, x, y, z)) - { - par1World.playSoundEffect(x + 0.5D, y + 0.5D, z + 0.5D, "random.click", 1.0F, 0.3F); - } - else - { - changeToActiveVanishBlock(par1World, x, y, z, META_REAPPEARING_ACTIVE); - } - return true; - } - else - { - return false; - } - } - - /** - * Location sensitive version of getExplosionRestance - * - * @param par1Entity The entity that caused the explosion - * @param world The current world - * @param x X Position - * @param y Y Position - * @param z Z Position - * @param explosionX Explosion source X Position - * @param explosionY Explosion source X Position - * @param explosionZ Explosion source X Position - * @return The amount of the explosion absorbed. - */ - @Override - public float getExplosionResistance(Entity par1Entity, World world, int x, int y, int z, double explosionX, double explosionY, double explosionZ) - { - int meta = world.getBlockMetadata(x, y, z); - - if (meta == META_VANISH_INACTIVE) - { - return 6000F; - } - else if (meta == META_VANISH_LOCKED) - { - return 6000000.0F; - } - else - { - return super.getExplosionResistance(par1Entity, world, x, y, z, explosionX, explosionY, explosionZ); - } - } - - /** - * Returns the block hardness at a location. Args: world, x, y, z - */ - @Override - public float getBlockHardness(World world, int x, int y, int z) - { - // most vanish blocks can't be broken - int meta = world.getBlockMetadata(x, y, z); - - switch (meta) - { - case META_REAPPEARING_ACTIVE : - case META_VANISH_INACTIVE : - case META_VANISH_ACTIVE : - case META_VANISH_LOCKED : - case META_VANISH_UNLOCKED : - return -1; - default : - return super.getBlockHardness(world, x, y, z); - } - } - - /** - * Are any of the 26 adjacent blocks a locked vanishing block? - */ - public static boolean areNearbyLockBlocks(World world, int x, int y, int z) - { - boolean locked = false; - - //TODO: this is hacky. We really need to determine the exact blocks of the door and check those for locks. - for (int dx = x - 2; dx <= x + 2; dx++) - { - for (int dy = y - 2; dy <= y + 2; dy++) - { - for (int dz = z - 2; dz <= z + 2; dz++) - { - if (world.getBlock(dx, dy, dz) == TFBlocks.towerDevice && world.getBlockMetadata(dx, dy, dz) == META_VANISH_LOCKED) - { - locked = true; - } - } - } - } - - return locked; - } - - /** - * Change this block into an different device block - */ - public static void unlockBlock(World par1World, int x, int y, int z) - { - Block thereBlockID = par1World.getBlock(x, y, z); - int thereBlockMeta = par1World.getBlockMetadata(x, y, z); - - if (thereBlockID == TFBlocks.towerDevice || thereBlockMeta == META_VANISH_LOCKED) - { - changeToBlockMeta(par1World, x, y, z, META_VANISH_UNLOCKED); - par1World.playSoundEffect(x + 0.5D, y + 0.5D, z + 0.5D, "random.click", 0.3F, 0.6F); - } - } - - - /** - * Change this block into an different device block - */ - private static void changeToBlockMeta(World par1World, int x, int y, int z, int meta) - { - Block thereBlockID = par1World.getBlock(x, y, z); - - if (thereBlockID == TFBlocks.towerDevice || thereBlockID == TFBlocks.towerTranslucent) - { - par1World.setBlock(x, y, z, thereBlockID, meta, 3); - par1World.markBlockRangeForRenderUpdate(x, y, z, x, y, z); - par1World.notifyBlocksOfNeighborChange(x, y, z, thereBlockID); - } - } - - /** - * Called whenever the block is added into the world. Args: world, x, y, z - */ - @Override - public void onBlockAdded(World par1World, int x, int y, int z) - { - int meta = par1World.getBlockMetadata(x, y, z); - - if (!par1World.isRemote) - { - if (meta == META_BUILDER_INACTIVE && par1World.isBlockIndirectlyGettingPowered(x, y, z)) - { - changeToBlockMeta(par1World, x, y, z, META_BUILDER_ACTIVE); - par1World.playSoundEffect(x + 0.5D, y + 0.5D, z + 0.5D, "random.click", 0.3F, 0.6F); - } - - } - - } - - /** - * Lets the block know when one of its neighbor changes. Doesn't know which neighbor changed (coordinates passed are - * their own) Args: x, y, z, neighbor blockID - */ - @Override - public void onNeighborBlockChange(World par1World, int x, int y, int z, Block myBlockID) - { - int meta = par1World.getBlockMetadata(x, y, z); - - if (!par1World.isRemote) - { - if (meta == META_VANISH_INACTIVE && par1World.isBlockIndirectlyGettingPowered(x, y, z) && !areNearbyLockBlocks(par1World, x, y, z)) - { - changeToActiveVanishBlock(par1World, x, y, z, META_VANISH_ACTIVE); - } - - if (meta == META_REAPPEARING_INACTIVE && par1World.isBlockIndirectlyGettingPowered(x, y, z) && !areNearbyLockBlocks(par1World, x, y, z)) - { - changeToActiveVanishBlock(par1World, x, y, z, META_REAPPEARING_ACTIVE); - } - - if (meta == META_BUILDER_INACTIVE && par1World.isBlockIndirectlyGettingPowered(x, y, z)) - { - changeToBlockMeta(par1World, x, y, z, META_BUILDER_ACTIVE); - par1World.playSoundEffect(x + 0.5D, y + 0.5D, z + 0.5D, "random.click", 0.3F, 0.6F); - - par1World.scheduleBlockUpdate(x, y, z, this, 4); - } - - if (meta == META_BUILDER_ACTIVE && !par1World.isBlockIndirectlyGettingPowered(x, y, z)) - { - changeToBlockMeta(par1World, x, y, z, META_BUILDER_INACTIVE); - par1World.playSoundEffect(x + 0.5D, y + 0.5D, z + 0.5D, "random.click", 0.3F, 0.6F); - - par1World.scheduleBlockUpdate(x, y, z, this, 4); - } - - if (meta == META_BUILDER_TIMEOUT && !par1World.isBlockIndirectlyGettingPowered(x, y, z)) - { - changeToBlockMeta(par1World, x, y, z, META_BUILDER_INACTIVE); - } - - if (meta == META_GHASTTRAP_INACTIVE && isInactiveTrapCharged(par1World, x, y, z) && par1World.isBlockIndirectlyGettingPowered(x, y, z)) - { - changeToBlockMeta(par1World, x, y, z, META_GHASTTRAP_ACTIVE); - par1World.playSoundEffect(x + 0.5D, y + 0.5D, z + 0.5D, "random.click", 0.3F, 0.6F); - - par1World.scheduleBlockUpdate(x, y, z, this, 4); - } - - if (meta == META_REACTOR_INACTIVE && isReactorReady(par1World, x, y, z)) - { - // check if we should fire up the reactor - changeToBlockMeta(par1World, x, y, z, META_REACTOR_ACTIVE); - } - } - } - - /** - * Ticks the block if it's been scheduled - */ - @Override - public void updateTick(World par1World, int x, int y, int z, Random par5Random) - { - if (!par1World.isRemote) - { - int meta = par1World.getBlockMetadata(x, y, z); - - if (meta == META_VANISH_ACTIVE || meta == META_REAPPEARING_ACTIVE) - { - if (meta == META_VANISH_ACTIVE) - { - par1World.setBlock(x, y, z, Blocks.air, 0, 3); - } - else - { - par1World.setBlock(x, y, z, TFBlocks.towerTranslucent, BlockTFTowerTranslucent.META_REAPPEARING_INACTIVE, 3); - par1World.scheduleBlockUpdate(x, y, z, TFBlocks.towerTranslucent, 80); - } - par1World.notifyBlocksOfNeighborChange(x, y, z, this); - par1World.playSoundEffect(x + 0.5D, y + 0.5D, z + 0.5D, "random.pop", 0.3F, 0.5F); - //par1World.markBlockRangeForRenderUpdate(x, y, z, x, y, z); - - // activate all adjacent inactive vanish blocks - checkAndActivateVanishBlock(par1World, x - 1, y, z); - checkAndActivateVanishBlock(par1World, x + 1, y, z); - checkAndActivateVanishBlock(par1World, x, y + 1, z); - checkAndActivateVanishBlock(par1World, x, y - 1, z); - checkAndActivateVanishBlock(par1World, x, y, z + 1); - checkAndActivateVanishBlock(par1World, x, y, z - 1); - - } - - if (meta == META_BUILDER_ACTIVE && par1World.isBlockIndirectlyGettingPowered(x, y, z)) - { - this.letsBuild(par1World, x, y, z); - } - - if (meta == META_BUILDER_INACTIVE || meta == META_BUILDER_TIMEOUT) - { - // activate all adjacent inactive vanish blocks - checkAndActivateVanishBlock(par1World, x - 1, y, z); - checkAndActivateVanishBlock(par1World, x + 1, y, z); - checkAndActivateVanishBlock(par1World, x, y + 1, z); - checkAndActivateVanishBlock(par1World, x, y - 1, z); - checkAndActivateVanishBlock(par1World, x, y, z + 1); - checkAndActivateVanishBlock(par1World, x, y, z - 1); - } - } - } - - /** - * Start the builder block tileentity building! - */ - private void letsBuild(World par1World, int x, int y, int z) { - BlockSourceImpl blockSource = new BlockSourceImpl(par1World, x, y, z); - TileEntityTFTowerBuilder tileEntity = (TileEntityTFTowerBuilder)blockSource.getBlockTileEntity(); - - if (tileEntity != null && !tileEntity.makingBlocks) - { - tileEntity.startBuilding(); - } - - } - - /** - * Check if the inactive trap block is fully charged - */ - private boolean isInactiveTrapCharged(World par1World, int x, int y, int z) - { - BlockSourceImpl blockSource = new BlockSourceImpl(par1World, x, y, z); - TileEntityTFGhastTrapInactive tileEntity = (TileEntityTFGhastTrapInactive)blockSource.getBlockTileEntity(); - - if (tileEntity != null && tileEntity.isCharged()) - { - return true; - } - else - { - return false; - } - } - - - /** - * Check if the reactor has all the specified things around it - */ - private boolean isReactorReady(World world, int x, int y, int z) - { - if (world.getBlock(x, y + 1, z) != Blocks.redstone_block - || world.getBlock(x, y - 1, z) != Blocks.redstone_block - || world.getBlock(x + 1, y, z) != Blocks.redstone_block - || world.getBlock(x - 1, y, z) != Blocks.redstone_block - || world.getBlock(x, y, z + 1) != Blocks.redstone_block - || world.getBlock(x, y, z - 1) != Blocks.redstone_block) - { - return false; - } - - return true; - } - - @Override - @SideOnly(Side.CLIENT) - - /** - * A randomly called display update to be able to add particles or other items for display - */ - public void randomDisplayTick(World par1World, int x, int y, int z, Random par5Random) - { - int meta = par1World.getBlockMetadata(x, y, z); - - if (meta == META_VANISH_ACTIVE || meta == META_REAPPEARING_ACTIVE || meta == BlockTFTowerDevice.META_BUILDER_ACTIVE) - { - for (int i = 0; i < 1; ++i) { - this.sparkle(par1World, x, y, z, par5Random); - } - } - } - - /** - * Shine bright like a DIAMOND! (or actually, sparkle like redstone ore) - */ - public void sparkle(World world, int x, int y, int z, Random rand) - { - double offset = 0.0625D; - - for (int side = 0; side < 6; ++side) - { - double rx = x + rand.nextFloat(); - double ry = y + rand.nextFloat(); - double rz = z + rand.nextFloat(); - - if (side == 0 && !world.getBlock(x, y + 1, z).isOpaqueCube()) - { - ry = y + 1 + offset; - } - - if (side == 1 && !world.getBlock(x, y - 1, z).isOpaqueCube()) - { - ry = y + 0 - offset; - } - - if (side == 2 && !world.getBlock(x, y, z + 1).isOpaqueCube()) - { - rz = z + 1 + offset; - } - - if (side == 3 && !world.getBlock(x, y, z - 1).isOpaqueCube()) - { - rz = z + 0 - offset; - } - - if (side == 4 && !world.getBlock(x + 1, y, z).isOpaqueCube()) - { - rx = x + 1 + offset; - } - - if (side == 5 && !world.getBlock(x - 1, y, z).isOpaqueCube()) - { - rx = x + 0 - offset; - } - - if (rx < x || rx > x + 1 || ry < 0.0D || ry > y + 1 || rz < z || rz > z + 1) - { - world.spawnParticle("reddust", rx, ry, rz, 0.0D, 0.0D, 0.0D); - } - } - } - - /** - * If the targeted block is a vanishing block, activate it - */ - public static void checkAndActivateVanishBlock(World world, int x, int y, int z) { - Block thereID = world.getBlock(x, y, z); - int thereMeta = world.getBlockMetadata(x, y, z); - - if (thereID == TFBlocks.towerDevice && (thereMeta == META_VANISH_INACTIVE || thereMeta == META_VANISH_UNLOCKED) && !areNearbyLockBlocks(world, x, y, z)) - { - changeToActiveVanishBlock(world, x, y, z, META_VANISH_ACTIVE); - } - else if (thereID == TFBlocks.towerDevice && thereMeta == META_REAPPEARING_INACTIVE && !areNearbyLockBlocks(world, x, y, z)) - { - changeToActiveVanishBlock(world, x, y, z, META_REAPPEARING_ACTIVE); - } - else if (thereID == TFBlocks.towerTranslucent && thereMeta == BlockTFTowerTranslucent.META_BUILT_INACTIVE) - { - changeToActiveVanishBlock(world, x, y, z, BlockTFTowerTranslucent.META_BUILT_ACTIVE); - } - } - - /** - * Change this block into an active vanishing block - */ - public static void changeToActiveVanishBlock(World par1World, int x, int y, int z, int meta) - { - changeToBlockMeta(par1World, x, y, z, meta); - par1World.playSoundEffect(x + 0.5D, y + 0.5D, z + 0.5D, "random.pop", 0.3F, 0.6F); - - Block thereBlockID = par1World.getBlock(x, y, z); - par1World.scheduleBlockUpdate(x, y, z, thereBlockID, getTickRateFor(thereBlockID, meta, par1World.rand)); - } - - /** - * We need variable, metadata-based tick rates - */ - private static int getTickRateFor(Block thereBlockID, int meta, Random rand) - { - if (thereBlockID == TFBlocks.towerDevice && (meta == META_VANISH_ACTIVE || meta == META_REAPPEARING_ACTIVE)) - { - return 2 + rand.nextInt(5); - } - else if (thereBlockID == TFBlocks.towerTranslucent && meta == BlockTFTowerTranslucent.META_BUILT_ACTIVE) - { - return 10; - } - - return 15; - } - - /** - * Get a light value for this block, normal ranges are between 0 and 15 - * - * @param world The current world - * @param x X Position - * @param y Y position - * @param z Z position - * @return The light value - */ - @Override - public int getLightValue(IBlockAccess world, int x, int y, int z) - { - Block blockID = world.getBlock(x, y, z); - int meta = world.getBlockMetadata(x, y, z); - - if (blockID != this) - { - // why are you asking me? - return 0; - } - - switch (meta) - { - case META_BUILDER_ACTIVE : - case META_VANISH_ACTIVE : - case META_REAPPEARING_ACTIVE : - return 4; - case META_ANTIBUILDER : - return 10; - case META_GHASTTRAP_ACTIVE : - case META_REACTOR_ACTIVE : - return 15; - default : - return 0; - } - } - - - /** - * Called throughout the code as a replacement for block instanceof BlockContainer - * Moving this to the Block base class allows for mods that wish to extend vinella - * blocks, and also want to have a tile entity on that block, may. - * - * Return true from this function to specify this block has a tile entity. - * - * @param metadata Metadata of the current block - * @return True if block has a tile entity, false otherwise - */ - @Override - public boolean hasTileEntity(int metadata) - { - return metadata == META_BUILDER_ACTIVE || metadata == META_ANTIBUILDER || metadata == META_REACTOR_ACTIVE - || metadata == META_GHASTTRAP_INACTIVE || metadata == META_GHASTTRAP_ACTIVE; - } - - @Override - public TileEntity createTileEntity(World world, int metadata) - { - if (metadata == META_BUILDER_ACTIVE) - { - return new TileEntityTFTowerBuilder(); - } - else if (metadata == META_ANTIBUILDER) - { - return new TileEntityTFReverter(); - } - else if (metadata == META_GHASTTRAP_INACTIVE) - { - return new TileEntityTFGhastTrapInactive(); - } - else if (metadata == META_GHASTTRAP_ACTIVE) - { - return new TileEntityTFGhastTrapActive(); - } - else if (metadata == META_REACTOR_ACTIVE) - { - return new TileEntityTFCReactorActive(); - } - else - { - return null; - } - } - - - /** - * Returns the ID of the items to drop on destruction. - */ - @Override - public Item getItemDropped(int meta, Random par2Random, int par3) - { - switch (meta) - { - case META_ANTIBUILDER : - return null; - default : - return Item.getItemFromBlock(this); - } - } - - /** - * Determines the damage on the item the block drops. Used in cloth and wood. - */ - @Override - public int damageDropped(int meta) - { - switch (meta) - { - case META_REAPPEARING_ACTIVE : - return META_REAPPEARING_INACTIVE; - case META_BUILDER_ACTIVE : - case META_BUILDER_TIMEOUT : - return META_BUILDER_INACTIVE; - case META_VANISH_ACTIVE : - return META_VANISH_INACTIVE; - case META_GHASTTRAP_ACTIVE : - return META_GHASTTRAP_INACTIVE; - case META_REACTOR_ACTIVE : - return META_REACTOR_INACTIVE; - default : - return meta; - } - } - -// @Override -// public void breakBlock(World par1World, int x, int y, int z, int par5, int meta) { -// super.breakBlock(par1World, x, y, z, par5, meta); -// -// //System.out.println("broke block, meta = " + meta); -// -// if (meta == META_BUILDER_ACTIVE) -// { -// // activate all adjacent inactive vanish blocks -// checkAndActivateVanishBlock(par1World, x - 1, y, z); -// checkAndActivateVanishBlock(par1World, x + 1, y, z); -// checkAndActivateVanishBlock(par1World, x, y + 1, z); -// checkAndActivateVanishBlock(par1World, x, y - 1, z); -// checkAndActivateVanishBlock(par1World, x, y, z + 1); -// checkAndActivateVanishBlock(par1World, x, y, z - 1); -// } -// } - - - -} diff --git a/src/main/java/twilightforest/block/BlockTFTowerTranslucent.java b/src/main/java/twilightforest/block/BlockTFTowerTranslucent.java deleted file mode 100644 index 51ffba403f..0000000000 --- a/src/main/java/twilightforest/block/BlockTFTowerTranslucent.java +++ /dev/null @@ -1,264 +0,0 @@ -package twilightforest.block; - -import java.util.List; -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.init.Blocks; -import net.minecraft.item.Item; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.IIcon; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; -import twilightforest.TwilightForestMod; -import twilightforest.item.TFItems; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - - -public class BlockTFTowerTranslucent extends Block -{ - - public static final int META_REAPPEARING_INACTIVE = 0; - public static final int META_REAPPEARING_ACTIVE = 1; - public static final int META_BUILT_INACTIVE = 2; - public static final int META_BUILT_ACTIVE = 3; - public static final int META_REVERTER_REPLACEMENT = 4; - public static final int META_REACTOR_DEBRIS = 5; - public static final int META_FAKE_GOLD = 6; - public static final int META_FAKE_DIAMOND = 7; - - public static IIcon TEX_REAPPEARING_INACTIVE; - public static IIcon TEX_REAPPEARING_ACTIVE; - public static IIcon TEX_BUILT_INACTIVE; - public static IIcon TEX_BUILT_ACTIVE; - public static IIcon TEX_REVERTER_REPLACEMENT; - - private static Random sideRNG = new Random(); - - public BlockTFTowerTranslucent() - { - super(Material.glass); - this.setHardness(50.0F); - this.setResistance(2000.0F); - this.setStepSound(Block.soundTypeMetal); - this.setCreativeTab(TFItems.creativeTab); - - } - - /** - * Is this block (a) opaque and (b) a full 1m cube? This determines whether or not to render the shared face of two - * adjacent blocks and also whether the player can attach torches, redstone wire, etc to this block. - */ - @Override - public boolean isOpaqueCube() - { - return false; - } - - /** - * How many world ticks before ticking - */ - public int tickRate() - { - return 15; - } - - /** - * Returns the ID of the items to drop on destruction. - */ - @Override - public Item getItemDropped(int par1, Random par2Random, int par3) { - return null; - } - - /** - * Return true if a player with Silk Touch can harvest this block directly, and not its normal drops. - */ - @Override - protected boolean canSilkHarvest() - { - return false; - } - - /** - * Returns a bounding box from the pool of bounding boxes (this means this box can change after the pool has been - * cleared to be reused) - */ - @Override - public AxisAlignedBB getCollisionBoundingBoxFromPool(World par1World, int par2, int par3, int par4) - { - int meta = par1World.getBlockMetadata(par2, par3, par4) & 7; - - if (meta == META_REAPPEARING_INACTIVE || meta == META_REAPPEARING_ACTIVE) - { - return null; - } - else - { - this.setBlockBoundsBasedOnState(par1World, par2, par3, par4); - return super.getCollisionBoundingBoxFromPool(par1World, par2, par3, par4); - } - } - - - /** - * Updates the blocks bounds based on its current state. Args: world, x, y, z - */ - @Override - public void setBlockBoundsBasedOnState(IBlockAccess par1IBlockAccess, int par2, int par3, int par4) - { - int meta = par1IBlockAccess.getBlockMetadata(par2, par3, par4); - - if (meta == META_REAPPEARING_INACTIVE || meta == META_REAPPEARING_ACTIVE) - { - this.setBlockBounds(0.375F, 0.375F, 0.375F, 0.625F, 0.625F, 0.625F); - } - if (meta == META_REACTOR_DEBRIS) - { - this.setBlockBounds(sideRNG.nextFloat() * 0.4F, sideRNG.nextFloat() * 0.4F, sideRNG.nextFloat() * 0.4F, - 1.0F - sideRNG.nextFloat() * 0.4F, 1.0F - sideRNG.nextFloat() * 0.4F, 1.0F - sideRNG.nextFloat() * 0.4F); - } - else - { - this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); - } - } - - /** - * Returns the block hardness at a location. Args: world, x, y, z - */ - @Override - public float getBlockHardness(World world, int x, int y, int z) - { - // reverter replacement is like glass - int meta = world.getBlockMetadata(x, y, z); - - if (meta == META_REVERTER_REPLACEMENT || meta == META_REACTOR_DEBRIS) - { - return 0.3F; - } - else - { - return super.getBlockHardness(world, x, y, z); - } - } - - - - - @Override - public boolean getBlocksMovement(IBlockAccess par1IBlockAccess, int par2, int par3, int par4) - { - int meta = par1IBlockAccess.getBlockMetadata(par2, par3, par4); - - switch (meta) - { - case META_REAPPEARING_INACTIVE: - case META_REAPPEARING_ACTIVE: - default: - return false; - case META_BUILT_INACTIVE: - case META_BUILT_ACTIVE: - case META_REVERTER_REPLACEMENT: - case META_REACTOR_DEBRIS: - return true; - } - } - - - /** - * From the specified side and block metadata retrieves the blocks texture. Args: side, metadata - */ - @Override - public IIcon getIcon(int side, int meta) { - switch (meta) - { - case META_REAPPEARING_INACTIVE: - default: - return TEX_REAPPEARING_INACTIVE; - case META_REAPPEARING_ACTIVE: - return TEX_REAPPEARING_ACTIVE; - case META_BUILT_INACTIVE: - return TEX_BUILT_INACTIVE; - case META_BUILT_ACTIVE: - return TEX_BUILT_ACTIVE; - case META_REVERTER_REPLACEMENT: - return TEX_REVERTER_REPLACEMENT; - case META_REACTOR_DEBRIS: - Block toMimic = sideRNG.nextBoolean() ? (sideRNG.nextBoolean() ? Blocks.portal : Blocks.netherrack) : (sideRNG.nextBoolean() ? Blocks.bedrock : Blocks.obsidian); - return toMimic.getIcon(side, meta); - case META_FAKE_GOLD: - return Blocks.gold_block.getIcon(side, meta); - case META_FAKE_DIAMOND: - return Blocks.diamond_block.getIcon(side, meta); - } - } - - - @Override - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister par1IconRegister) - { - BlockTFTowerTranslucent.TEX_REAPPEARING_INACTIVE = par1IconRegister.registerIcon(TwilightForestMod.ID + ":towerdev_reappearing_trace_off"); - BlockTFTowerTranslucent.TEX_REAPPEARING_ACTIVE = par1IconRegister.registerIcon(TwilightForestMod.ID + ":towerdev_reappearing_trace_on"); - BlockTFTowerTranslucent.TEX_BUILT_INACTIVE = par1IconRegister.registerIcon(TwilightForestMod.ID + ":towerdev_built_off"); - BlockTFTowerTranslucent.TEX_BUILT_ACTIVE = par1IconRegister.registerIcon(TwilightForestMod.ID + ":towerdev_built_on"); - BlockTFTowerTranslucent.TEX_REVERTER_REPLACEMENT = par1IconRegister.registerIcon(TwilightForestMod.ID + ":towerdev_antibuilt"); - } - - /** - * Ticks the block if it's been scheduled - */ - @Override - public void updateTick(World par1World, int x, int y, int z, Random par5Random) - { - if (!par1World.isRemote) - { - int meta = par1World.getBlockMetadata(x, y, z); - - if (meta == META_BUILT_ACTIVE) - { - par1World.setBlock(x, y, z, Blocks.air, 0, 3); - par1World.notifyBlocksOfNeighborChange(x, y, z, this); - par1World.playSoundEffect(x + 0.5D, y + 0.5D, z + 0.5D, "random.pop", 0.3F, 0.5F); - //par1World.markBlockRangeForRenderUpdate(x, y, z, x, y, z); - - // activate all adjacent inactive vanish blocks - BlockTFTowerDevice.checkAndActivateVanishBlock(par1World, x - 1, y, z); - BlockTFTowerDevice.checkAndActivateVanishBlock(par1World, x + 1, y, z); - BlockTFTowerDevice.checkAndActivateVanishBlock(par1World, x, y + 1, z); - BlockTFTowerDevice.checkAndActivateVanishBlock(par1World, x, y - 1, z); - BlockTFTowerDevice.checkAndActivateVanishBlock(par1World, x, y, z + 1); - BlockTFTowerDevice.checkAndActivateVanishBlock(par1World, x, y, z - 1); - - } - if (meta == META_REAPPEARING_ACTIVE) - { - par1World.setBlock(x, y, z, TFBlocks.towerDevice, BlockTFTowerDevice.META_REAPPEARING_INACTIVE, 3); - par1World.notifyBlocksOfNeighborChange(x, y, z, this); - par1World.playSoundEffect(x + 0.5D, y + 0.5D, z + 0.5D, "random.click", 0.3F, 0.5F); - //par1World.markBlockRangeForRenderUpdate(x, y, z, x, y, z); - } - else if (meta == META_REAPPEARING_INACTIVE) - { - BlockTFTowerDevice.changeToActiveVanishBlock(par1World, x, y, z, META_REAPPEARING_ACTIVE); - } - - } - } - - - /** - * returns a list of blocks with the same ID, but different meta (eg: wood returns 4 blocks) - */ - @Override - public void getSubBlocks(Item par1, CreativeTabs par2CreativeTabs, List par3List) - { - // none! - } - -} diff --git a/src/main/java/twilightforest/block/BlockTFTowerWood.java b/src/main/java/twilightforest/block/BlockTFTowerWood.java deleted file mode 100644 index de6b188234..0000000000 --- a/src/main/java/twilightforest/block/BlockTFTowerWood.java +++ /dev/null @@ -1,226 +0,0 @@ -package twilightforest.block; - -import java.util.List; -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.IIcon; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; -import twilightforest.TwilightForestMod; -import twilightforest.entity.EntityTFTowerTermite; -import twilightforest.item.TFItems; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - - - -/** - * - * Tower wood is a type of plank block that forms the walls of Dark Towers - * - * @author Ben - * - */ -public class BlockTFTowerWood extends Block { - - private static IIcon TEX_PLAIN; - private static IIcon TEX_ENCASED; - private static IIcon TEX_CRACKED; - private static IIcon TEX_MOSSY; - private static IIcon TEX_INFESTED; - - public static final int META_INFESTED = 4; - - - public BlockTFTowerWood() - { - super(Material.wood); - this.setHardness(40F); - this.setResistance(10F); - this.setStepSound(Block.soundTypeWood); - this.setCreativeTab(TFItems.creativeTab); - - } - - /** - * Returns a integer with hex for 0xrrggbb with this color multiplied against the blocks color. Note only called - * when first determining what to render. - */ - @Override - public int colorMultiplier(IBlockAccess par1IBlockAccess, int x, int y, int z) - { - int meta = par1IBlockAccess.getBlockMetadata(x, y, z); - - if (meta == 0 || meta == 2 || meta == 3 || meta == META_INFESTED) - { - // stripes! - int value = x * 31 + y * 15 + z * 33; - if ((value & 256) != 0) - { - value = 255 - (value & 255); - } - value &= 255; - value = value >> 1; - value |= 128; - - return value << 16 | value << 8 | value; - } - else - { - return 16777215; - } - } - - /** - * From the specified side and block metadata retrieves the blocks texture. Args: side, metadata - */ - @Override - public IIcon getIcon(int side, int meta) { - switch (meta) - { - case 0: - default: - return TEX_PLAIN; - case 1: - return TEX_ENCASED; - case 2: - return TEX_CRACKED; - case 3: - return TEX_MOSSY; - case META_INFESTED: - return TEX_INFESTED; - } - } - - @Override - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister par1IconRegister) - { - BlockTFTowerWood.TEX_PLAIN = par1IconRegister.registerIcon(TwilightForestMod.ID + ":towerwood_planks"); - BlockTFTowerWood.TEX_ENCASED = par1IconRegister.registerIcon(TwilightForestMod.ID + ":towerwood_encased"); - BlockTFTowerWood.TEX_CRACKED = par1IconRegister.registerIcon(TwilightForestMod.ID + ":towerwood_cracked"); - BlockTFTowerWood.TEX_MOSSY = par1IconRegister.registerIcon(TwilightForestMod.ID + ":towerwood_mossy"); - BlockTFTowerWood.TEX_INFESTED = par1IconRegister.registerIcon(TwilightForestMod.ID + ":towerwood_infested"); - } - - /** - * returns a list of blocks with the same ID, but different meta (eg: wood returns 4 blocks) - */ - @Override - public void getSubBlocks(Item par1, CreativeTabs par2CreativeTabs, List par3List) - { - par3List.add(new ItemStack(par1, 1, 0)); - par3List.add(new ItemStack(par1, 1, 1)); - par3List.add(new ItemStack(par1, 1, 2)); - par3List.add(new ItemStack(par1, 1, 3)); - par3List.add(new ItemStack(par1, 1, META_INFESTED)); - } - - /** - * Determines the damage on the item the block drops. Used in cloth and wood. - */ - @Override - public int damageDropped(int meta) { - return meta; - } - - /** - * Metadata and fortune sensitive version, this replaces the old (int meta, Random rand) - * version in 1.1. - * - * @param meta Blocks Metadata - * @param fortune Current item fortune level - * @param random Random number generator - * @return The number of items to drop - */ - @Override - public int quantityDropped(int meta, int fortune, Random random) - { - if (meta == META_INFESTED) - { - return 0; - } - else - { - return super.quantityDropped(meta, fortune, random); - } - } - - /** - * Returns the block hardness at a location. Args: world, x, y, z - */ - @Override - public float getBlockHardness(World world, int x, int y, int z) - { - // infested block is not very hard - int meta = world.getBlockMetadata(x, y, z); - - if (meta == META_INFESTED) - { - return 0.75F; - } - else - { - return super.getBlockHardness(world, x, y, z); - } - } - - /** - * Called right before the block is destroyed by a player. Args: world, x, y, z, metaData - */ - @Override - public void dropBlockAsItemWithChance(World par1World, int x, int y, int z, int meta, float chance, int something) - { - if (!par1World.isRemote && meta == META_INFESTED) - { - EntityTFTowerTermite termite = new EntityTFTowerTermite(par1World); - termite.setLocationAndAngles(x + 0.5D, y, z + 0.5D, 0.0F, 0.0F); - par1World.spawnEntityInWorld(termite); - termite.spawnExplosionParticle(); - } - - super.dropBlockAsItemWithChance(par1World, x, y, z, meta, chance, something); - } - - /** - * Chance that fire will spread and consume this block. - * 300 being a 100% chance, 0, being a 0% chance. - * - * @param world The current world - * @param x The blocks X position - * @param y The blocks Y position - * @param z The blocks Z position - * @param metadata The blocks current metadata - * @param face The face that the fire is coming from - * @return A number ranging from 0 to 300 relating used to determine if the block will be consumed by fire - */ - @Override - public int getFlammability(IBlockAccess world, int x, int y, int z, ForgeDirection face) { - return 1; - } - - /** - * Called when fire is updating on a neighbor block. - * The higher the number returned, the faster fire will spread around this block. - * - * @param world The current world - * @param x The blocks X position - * @param y The blocks Y position - * @param z The blocks Z position - * @param metadata The blocks current metadata - * @param face The face that the fire is coming from - * @return A number that is used to determine the speed of fire growth around the block - */ - @Override - public int getFireSpreadSpeed(IBlockAccess world, int x, int y, int z, ForgeDirection face) { - return 0; - } - -} diff --git a/src/main/java/twilightforest/block/BlockTFTrollLjos.java b/src/main/java/twilightforest/block/BlockTFTrollLjos.java deleted file mode 100644 index 39dc5572d0..0000000000 --- a/src/main/java/twilightforest/block/BlockTFTrollLjos.java +++ /dev/null @@ -1,31 +0,0 @@ -package twilightforest.block; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import twilightforest.item.TFItems; -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.init.Blocks; - -public class BlockTFTrollLjos extends Block { - - protected BlockTFTrollLjos() { - super(Material.rock); - - this.setHardness(2F); - this.setResistance(15F); - this.setStepSound(Block.soundTypeStone); - this.setCreativeTab(TFItems.creativeTab); - - this.setLightLevel(1.0F); - - } - - @Override - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister par1IconRegister) - { - this.blockIcon = Blocks.lit_redstone_lamp.getIcon(0, 0); - } -} diff --git a/src/main/java/twilightforest/block/BlockTFTrollRoot.java b/src/main/java/twilightforest/block/BlockTFTrollRoot.java deleted file mode 100644 index ea4e2a9130..0000000000 --- a/src/main/java/twilightforest/block/BlockTFTrollRoot.java +++ /dev/null @@ -1,142 +0,0 @@ -package twilightforest.block; - -import java.util.ArrayList; -import java.util.Random; - -import twilightforest.TwilightForestMod; -import twilightforest.item.TFItems; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.init.Blocks; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.IIcon; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; -import net.minecraftforge.common.IShearable; - -public class BlockTFTrollRoot extends Block implements IShearable { - - protected BlockTFTrollRoot() { - super(Material.plants); - this.setTickRandomly(true); - this.setCreativeTab(TFItems.creativeTab); - this.setStepSound(soundTypeGrass); - - this.setBlockTextureName(TwilightForestMod.ID + ":troll_root"); - - } - - @Override - public boolean isShearable(ItemStack item, IBlockAccess world, int x, int y, int z) { - return true; - } - - @Override - public ArrayList onSheared(ItemStack item, IBlockAccess world, int x, int y, int z, int fortune) { - ArrayList ret = new ArrayList(); - ret.add(new ItemStack(this)); - return ret; - } - - - - /** - * Can this block stay at this position. Similar to canPlaceBlockAt except gets checked often with plants. - */ - @Override - public boolean canBlockStay(World world, int x, int y, int z) { - return canPlaceRootBelow(world, x, y + 1, z); - } - - public static boolean canPlaceRootBelow(World world, int x, int y, int z) { - Block blockAbove = world.getBlock(x, y, z); - - return blockAbove.getMaterial() == Material.rock || blockAbove == TFBlocks.trollVidr || blockAbove == TFBlocks.trollBer || blockAbove == TFBlocks.unripeTrollBer; - } - - /** - * Checks to see if its valid to put this block at the specified coordinates. Args: world, x, y, z - */ - public boolean canPlaceBlockAt(World world, int x, int y, int z) { - return super.canPlaceBlockAt(world, x, y, z) && this.canBlockStay(world, x, y, z); - } - - - /** - * Returns a bounding box from the pool of bounding boxes (this means this box can change after the pool has been - * cleared to be reused) - */ - @Override - public AxisAlignedBB getCollisionBoundingBoxFromPool(World par1World, int x, int y, int z) { - return null; - } - - /** - * Is this block (a) opaque and (b) a full 1m cube? This determines whether or not to render the shared face of two - * adjacent blocks and also whether the player can attach torches, redstone wire, etc to this block. - */ - @Override - public boolean isOpaqueCube() { - return false; - } - - /** - * If this block doesn't render as an ordinary block it will return False (examples: signs, buttons, stairs, etc) - */ - @Override - public boolean renderAsNormalBlock() { - return false; - } - - /** - * The type of render function that is called for this block - */ - @Override - public int getRenderType() { - return 1; - } - - /** - * Ticks the block if it's been scheduled - */ - @Override - public void updateTick(World world, int x, int y, int z, Random rand) { - this.checkAndDropBlock(world, x, y, z); - } - - /** - * Lets the block know when one of its neighbor changes. Doesn't know which neighbor changed (coordinates passed are - * their own) Args: x, y, z, neighbor Block - */ - public void onNeighborBlockChange(World world, int x, int y, int z, Block block) { - this.checkAndDropBlock(world, x, y, z); - } - - /** - * checks if the block can stay, if not drop as item - */ - protected void checkAndDropBlock(World world, int x, int y, int z) { - if (!this.canBlockStay(world, x, y, z)) { - this.dropBlockAsItem(world, x, y, z, world.getBlockMetadata(x, y, z), 0); - world.setBlockToAir(x, y, z); - } - } - - /** - * Metadata and fortune sensitive version, this replaces the old (int meta, Random rand) - * version in 1.1. - * - * @param meta Blocks Metadata - * @param fortune Current item fortune level - * @param random Random number generator - * @return The number of items to drop - */ - public int quantityDropped(int meta, int fortune, Random random) { - return 0; - } -} diff --git a/src/main/java/twilightforest/block/BlockTFTrollSteinn.java b/src/main/java/twilightforest/block/BlockTFTrollSteinn.java deleted file mode 100644 index 54e04f2086..0000000000 --- a/src/main/java/twilightforest/block/BlockTFTrollSteinn.java +++ /dev/null @@ -1,143 +0,0 @@ -package twilightforest.block; - -import java.util.Random; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import twilightforest.TwilightForestMod; -import twilightforest.item.TFItems; -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.init.Blocks; -import net.minecraft.util.IIcon; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; - -public class BlockTFTrollSteinn extends Block { - - private static final int LIGHT_THRESHHOLD = 7; - private IIcon blockIconLight; - - protected BlockTFTrollSteinn() { - super(Material.rock); - - this.setHardness(2F); - this.setResistance(15F); - this.setStepSound(Block.soundTypeStone); - this.setCreativeTab(TFItems.creativeTab); - this.setBlockTextureName(TwilightForestMod.ID + ":trollsteinn"); - } - - - /** - * A randomly called display update to be able to add particles or other items for display - */ - @SideOnly(Side.CLIENT) - public void randomDisplayTick(World world, int x, int y, int z, Random rand) { - if (rand.nextInt(2) == 0) { - this.sparkle(world, x, y, z, rand); - } - } - - private void sparkle(World world, int x, int y, int z, Random rand) { - Random random = rand; - double pixel = 0.0625D; - int threshhold = LIGHT_THRESHHOLD; - - for (int side = 0; side < 6; ++side) - { - double rx = (double)((float)x + random.nextFloat()); - double ry = (double)((float)y + random.nextFloat()); - double rz = (double)((float)z + random.nextFloat()); - - if (side == 0 && !world.getBlock(x, y - 1, z).isOpaqueCube() && world.getBlockLightValue(x, y - 1, z) <= threshhold) - { - ry = (double)(y + 0) - pixel; - } - - if (side == 1 && !world.getBlock(x, y + 1, z).isOpaqueCube() && world.getBlockLightValue(x, y + 1, z) <= threshhold) - { - ry = (double)(y + 1) + pixel; - } - - if (side == 2 && !world.getBlock(x, y, z + 1).isOpaqueCube() && world.getBlockLightValue(x, y, z + 1) <= threshhold) - { - rz = (double)(z + 1) + pixel; - } - - if (side == 3 && !world.getBlock(x, y, z - 1).isOpaqueCube() && world.getBlockLightValue(x, y, z - 1) <= threshhold) - { - rz = (double)(z + 0) - pixel; - } - - if (side == 4 && !world.getBlock(x + 1, y, z).isOpaqueCube() && world.getBlockLightValue(x + 1, y, z) <= threshhold) - { - rx = (double)(x + 1) + pixel; - } - - if (side == 5 && !world.getBlock(x - 1, y, z).isOpaqueCube() && world.getBlockLightValue(x - 1, y, z) <= threshhold) - { - rx = (double)(x + 0) - pixel; - } - - if (rx < (double)x || rx > (double)(x + 1) || ry < 0.0D || ry > (double)(y + 1) || rz < (double)z || rz > (double)(z + 1)) - { - world.spawnParticle("reddust", rx, ry, rz, 0.25D, -1.0D, 0.5D); - } - } - } - - @SideOnly(Side.CLIENT) - public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side) { - - // check brightness for the side - if (side == 0 && isBlockLit(world, x, y - 1, z)) { - return this.blockIconLight; - } - - if (side == 1 && isBlockLit(world, x, y + 1, z)) { - return this.blockIconLight; - } - - if (side == 2 && isBlockLit(world, x, y, z - 1)) { - return this.blockIconLight; - } - - if (side == 3 && isBlockLit(world, x, y, z + 1)) { - return this.blockIconLight; - } - - if (side == 4 && isBlockLit(world, x - 1, y, z)) { - return this.blockIconLight; - } - - if (side == 5 && isBlockLit(world, x + 1, y, z)) { - return this.blockIconLight; - } - - return this.getIcon(side, world.getBlockMetadata(x, y, z)); - } - - private boolean isBlockLit(IBlockAccess world, int x, int y, int z) { - int threshhold = LIGHT_THRESHHOLD << 4; - - if (world.getBlock(x, y, z).isOpaqueCube()) { - return false; - } else { - int light = world.getLightBrightnessForSkyBlocks(x, y, z, 0); - int sky = light % 65536; - int block = light / 65536; - - return sky > threshhold || block > threshhold; - } - } - - - @Override - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister par1IconRegister) { - this.blockIcon = par1IconRegister.registerIcon(this.getTextureName()); - this.blockIconLight = par1IconRegister.registerIcon(this.getTextureName() + "_light"); - } -} diff --git a/src/main/java/twilightforest/block/BlockTFTrophy.java b/src/main/java/twilightforest/block/BlockTFTrophy.java deleted file mode 100644 index 00517da5c6..0000000000 --- a/src/main/java/twilightforest/block/BlockTFTrophy.java +++ /dev/null @@ -1,259 +0,0 @@ -package twilightforest.block; - -import java.util.ArrayList; -import java.util.Random; - -import net.minecraft.block.BlockContainer; -import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.tileentity.TileEntitySkull; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.IIcon; -import net.minecraft.util.MathHelper; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; -import twilightforest.item.TFItems; -import twilightforest.tileentity.TileEntityTFTrophy; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -/** - * Head trophy similar to (and based partially on) BlockSkull - * - */ -public class BlockTFTrophy extends BlockContainer -{ - - public BlockTFTrophy() - { - super(Material.circuits); - this.setBlockBounds(0.25F, 0.0F, 0.25F, 0.75F, 0.5F, 0.75F); - } - - /** - * The type of render function that is called for this block - */ - @Override - public int getRenderType() - { - return -1; - } - - /** - * Is this block (a) opaque and (b) a full 1m cube? This determines whether or not to render the shared face of two - * adjacent blocks and also whether the player can attach torches, redstone wire, etc to this block. - */ - @Override - public boolean isOpaqueCube() - { - return false; - } - - /** - * If this block doesn't render as an ordinary block it will return False (examples: signs, buttons, stairs, etc) - */ - @Override - public boolean renderAsNormalBlock() - { - return false; - } - - /** - * Returns a bounding box from the pool of bounding boxes (this means this box can change after the pool has been - * cleared to be reused) - */ - @Override - public AxisAlignedBB getCollisionBoundingBoxFromPool(World par1World, int par2, int par3, int par4) - { - this.setBlockBoundsBasedOnState(par1World, par2, par3, par4); - return super.getCollisionBoundingBoxFromPool(par1World, par2, par3, par4); - } - - - /** - * Updates the blocks bounds based on its current state. Args: world, x, y, z - */ - @Override - public void setBlockBoundsBasedOnState(IBlockAccess par1IBlockAccess, int x, int y, int z) - { - int meta = par1IBlockAccess.getBlockMetadata(x, y, z) & 7; - TileEntityTFTrophy trophy = (TileEntityTFTrophy)par1IBlockAccess.getTileEntity(x, y, z); - - if (trophy != null && trophy.func_145904_a() == 0) - { - // hydra bounds - switch (meta) - { - case 1: - default: - this.setBlockBounds(0.25F, 0.0F, 0.25F, 0.75F, 0.5F, 0.75F); - break; - case 2: - case 3: - this.setBlockBounds(0.25F, 0.25F, 0.0F, 0.75F, 0.75F, 1.0F); - break; - case 4: - case 5: - this.setBlockBounds(0.0F, 0.25F, 0.25F, 1.0F, 0.75F, 0.75F); - break; - } - } - else if (trophy != null && trophy.func_145904_a() == 3) - { - // urghast bounds - this.setBlockBounds(0.25F, 0.5F, 0.25F, 0.75F, 1F, 0.75F); - } - else - { - // normal skull bounds - switch (meta) - { - case 1: - default: - this.setBlockBounds(0.25F, 0.0F, 0.25F, 0.75F, 0.5F, 0.75F); - break; - case 2: - this.setBlockBounds(0.25F, 0.25F, 0.5F, 0.75F, 0.75F, 1.0F); - break; - case 3: - this.setBlockBounds(0.25F, 0.25F, 0.0F, 0.75F, 0.75F, 0.5F); - break; - case 4: - this.setBlockBounds(0.5F, 0.25F, 0.25F, 1.0F, 0.75F, 0.75F); - break; - case 5: - this.setBlockBounds(0.0F, 0.25F, 0.25F, 0.5F, 0.75F, 0.75F); - } - } - } - - /** - * Called when the block is placed in the world. - */ - @Override - public void onBlockPlacedBy(World par1World, int par2, int par3, int par4, EntityLivingBase par5EntityLiving, ItemStack itemStack) - { - int rotation = MathHelper.floor_double(par5EntityLiving.rotationYaw * 4.0F / 360.0F + 2.5D) & 3; - par1World.setBlockMetadataWithNotify(par2, par3, par4, rotation, 2); - } - - - /** - * Returns a new instance of a block's tile entity class. Called on placing the block. - */ - @Override - public TileEntity createNewTileEntity(World var1, int var2) { - return new TileEntityTFTrophy(); - } - - @SideOnly(Side.CLIENT) - - /** - * only called by clickMiddleMouseButton , and passed to inventory.setCurrentItem (along with isCreative) - */ - public Item idPicked(World par1World, int par2, int par3, int par4) - { - return TFItems.trophy; - } - - /** - * Get the block's damage value (for use with pick block). - */ - @Override - public int getDamageValue(World par1World, int par2, int par3, int par4) - { - TileEntity var5 = par1World.getTileEntity(par2, par3, par4); - return var5 != null && var5 instanceof TileEntitySkull ? ((TileEntitySkull)var5).func_145904_a() : super.getDamageValue(par1World, par2, par3, par4); - } - - /** - * Determines the damage on the item the block drops. Used in cloth and wood. - */ - @Override - public int damageDropped(int par1) - { - return par1; - } - - /** - * Called when the block is attempted to be harvested - */ - @Override - public void onBlockHarvested(World par1World, int par2, int par3, int par4, int par5, EntityPlayer par6EntityPlayer) - { - if (par6EntityPlayer.capabilities.isCreativeMode) - { - par5 |= 8; - par1World.setBlockMetadataWithNotify(par2, par3, par4, par5, 2); - } - - dropBlockAsItem(par1World, par2, par3, par4, par5, 0); - - super.onBlockHarvested(par1World, par2, par3, par4, par5, par6EntityPlayer); - } - -// /** -// * ejects contained items into the world, and notifies neighbours of an update, as appropriate -// */ -// public void breakBlock(World par1World, int par2, int par3, int par4, int par5, int par6) -// { -// super.breakBlock(par1World, par2, par3, par4, par5, par6); -// } - - @Override - public ArrayList getDrops(World world, int x, int y, int z, int metadata, int fortune) - { - ArrayList drops = new ArrayList(); - if ((metadata & 8) == 0) - { - ItemStack var7 = new ItemStack(TFItems.trophy, 1, this.getDamageValue(world, x, y, z)); - TileEntityTFTrophy var8 = (TileEntityTFTrophy)world.getTileEntity(x, y, z); - - if (var8 == null) - { - return drops; - } -// if (var8.func_145904_a() == 3 && var8.func_145907_c() != null && var8.func_145907_c().length() > 0) -// { -// var7.setTagCompound(new NBTTagCompound()); -// var7.getTagCompound().setString("SkullOwner", var8.func_145907_c()); -// } - drops.add(var7); - } - return drops; - } - - /** - * Returns the ID of the items to drop on destruction. - */ - @Override - public Item getItemDropped(int par1, Random par2Random, int par3) - { - return TFItems.trophy; - } - - /** - * From the specified side and block metadata retrieves the blocks texture. Args: side, metadata - */ - @Override - @SideOnly(Side.CLIENT) - public IIcon getIcon(int side, int meta) - { - return Blocks.soul_sand.getIcon(side, meta); - } - - @Override - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister par1IconRegister) - { - ; // don't load anything - } - - -} diff --git a/src/main/java/twilightforest/block/BlockTFTrophyPedestal.java b/src/main/java/twilightforest/block/BlockTFTrophyPedestal.java deleted file mode 100644 index d618bc8625..0000000000 --- a/src/main/java/twilightforest/block/BlockTFTrophyPedestal.java +++ /dev/null @@ -1,387 +0,0 @@ -package twilightforest.block; - -import java.util.List; -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.client.entity.EntityClientPlayerMP; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.init.Blocks; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.stats.StatFileWriter; -import net.minecraft.stats.StatisticsFile; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.ChatComponentText; -import net.minecraft.util.IIcon; -import net.minecraft.util.MathHelper; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; -import twilightforest.TFAchievementPage; -import twilightforest.TwilightForestMod; -import twilightforest.item.TFItems; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public class BlockTFTrophyPedestal extends Block { - - private IIcon sprTopActive; - private IIcon sprTop; - private IIcon sprBottom; - private IIcon sprNagaActive; - private IIcon sprNaga; - private IIcon sprLichActive; - private IIcon sprLich; - private IIcon sprHydraActive; - private IIcon sprHydra; - private IIcon sprUrghastActive; - private IIcon sprUrghast; - - public BlockTFTrophyPedestal() { - super(Material.rock); - this.setHardness(2.0F); - this.setResistance(2000.0F); - this.setStepSound(Block.soundTypeStone); - - this.setCreativeTab(TFItems.creativeTab); - } - - /** - * From the specified side and block metadata retrieves the blocks texture. Args: side, metadata - */ - @Override - public IIcon getIcon(int side, int meta) - { - - if (side == 1) - { - return meta > 7 ? sprTopActive : sprTop; - } - else if (side >= 2 && side <= 5) - { - // determine rotated side to show - int rotate = meta & 3; - int rotatedSide = ((side - 2) + rotate) % 4; - - switch (rotatedSide) - { - case 0: - return meta > 7 ? sprNagaActive : sprNaga; - case 1: - return meta > 7 ? sprLichActive : sprLich; - case 2: - return meta > 7 ? sprHydraActive : sprHydra; - case 3: - return meta > 7 ? sprUrghastActive : sprUrghast; - } - - } -// if (side == 2) -// { -// return meta > 7 ? sprNagaActive : sprNaga; -// } -// if (side == 3) -// { -// return meta > 7 ? sprLichActive : sprLich; -// } -// if (side == 4) -// { -// return meta > 7 ? sprHydraActive : sprHydra; -// } -// if (side == 5) -// { -// return meta > 7 ? sprUrghastActive : sprUrghast; -// } - - return sprTop; - } - - /** - * Properly register icon source - */ - @Override - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister par1IconRegister) - { - this.sprTopActive = par1IconRegister.registerIcon(TwilightForestMod.ID + ":pedestal_top_active"); - this.sprTop = par1IconRegister.registerIcon(TwilightForestMod.ID + ":pedestal_top"); - this.sprBottom = par1IconRegister.registerIcon(TwilightForestMod.ID + ":pedestal_top"); - this.sprNagaActive = par1IconRegister.registerIcon(TwilightForestMod.ID + ":pedestal_naga_active"); - this.sprNaga = par1IconRegister.registerIcon(TwilightForestMod.ID + ":pedestal_naga"); - this.sprLichActive = par1IconRegister.registerIcon(TwilightForestMod.ID + ":pedestal_lich_active"); - this.sprLich = par1IconRegister.registerIcon(TwilightForestMod.ID + ":pedestal_lich"); - this.sprHydraActive = par1IconRegister.registerIcon(TwilightForestMod.ID + ":pedestal_hydra_active"); - this.sprHydra = par1IconRegister.registerIcon(TwilightForestMod.ID + ":pedestal_hydra"); - this.sprUrghastActive = par1IconRegister.registerIcon(TwilightForestMod.ID + ":pedestal_urghast_active"); - this.sprUrghast = par1IconRegister.registerIcon(TwilightForestMod.ID + ":pedestal_urghast"); - } - - /** - * returns a list of blocks with the same ID, but different meta (eg: wood returns 4 blocks) - */ - @Override - public void getSubBlocks(Item par1, CreativeTabs par2CreativeTabs, List par3List) - { - par3List.add(new ItemStack(par1, 1, 0)); - par3List.add(new ItemStack(par1, 1, 15)); - } - - - /** - * Updates the blocks bounds based on its current state. Args: world, x, y, z - */ - @Override - public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) { - this.setBlockBounds(0.0625F, 0.0F, 0.0625F, 0.9375F, 1.0F, 0.9375F); - } - - /** - * If this block doesn't render as an ordinary block it will return False (examples: signs, buttons, stairs, etc) - */ - @Override - public boolean renderAsNormalBlock() - { - return false; - } - - - /** - * Is this block (a) opaque and (b) a full 1m cube? This determines whether or not to render the shared face of two - * adjacent blocks and also whether the player can attach torches, redstone wire, etc to this block. - */ - @Override - public boolean isOpaqueCube() - { - return false; - } - - - /** - * The type of render function that is called for this block - */ - @Override - public int getRenderType() - { - return TwilightForestMod.proxy.getPedestalBlockRenderID(); - } - - /** - * Returns true if the given side of this block type should be rendered, if the adjacent block is at the given - * coordinates. Args: blockAccess, x, y, z, side - */ - @Override - @SideOnly(Side.CLIENT) - public boolean shouldSideBeRendered(IBlockAccess par1IBlockAccess, int par2, int par3, int par4, int par5) - { - return true; - } - - /** - * Lets the block know when one of its neighbor changes. Doesn't know which neighbor changed (coordinates passed are - * their own) Args: x, y, z, neighbor blockID - */ - @Override - public void onNeighborBlockChange(World par1World, int x, int y, int z, Block myBlockID) - { - int meta = par1World.getBlockMetadata(x, y, z); - - if (!par1World.isRemote && meta > 0) - { - // something has changed, is there a trophy on top of us? - if (isTrophyOnTop(par1World, x, y, z)) - { - par1World.scheduleBlockUpdate(x, y, z, this, 1); - } - } - - } - - /** - * Called when the block is placed in the world. - */ - @Override - public void onBlockPlacedBy(World par1World, int par2, int par3, int par4, EntityLivingBase par5EntityLivingBase, ItemStack par6ItemStack) - { - int facing = MathHelper.floor_double(par5EntityLivingBase.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; - - int latent = par6ItemStack.getItemDamage() & 8; - - if (facing == 0) - { - par1World.setBlockMetadataWithNotify(par2, par3, par4, 0 | latent, 2); - } - - if (facing == 1) - { - par1World.setBlockMetadataWithNotify(par2, par3, par4, 1 | latent, 2); - } - - if (facing == 2) - { - par1World.setBlockMetadataWithNotify(par2, par3, par4, 3 | latent, 2); - } - - if (facing == 3) - { - par1World.setBlockMetadataWithNotify(par2, par3, par4, 2 | latent, 2); - } - } - - /** - * Just checks if there is a trophy above the position indicated. Perhaps in the future we can accept different kinds of trophies. - */ - private boolean isTrophyOnTop(World world, int x, int y, int z) { - return world.getBlock(x, y + 1, z) == TFBlocks.trophy; - } - - /** - * Ticks the block if it's been scheduled - */ - @Override - public void updateTick(World world, int x, int y, int z, Random par5Random) - { - if (!world.isRemote) { - int meta = world.getBlockMetadata(x, y, z); - - if (this.isTrophyOnTop(world, x, y, z)) { - // is the pedestal still "latent"? - if (meta > 7) { - // check enforced progression - if (world.getGameRules().getGameRuleBooleanValue(TwilightForestMod.ENFORCED_PROGRESSION_RULE)) { - if (this.areNearbyPlayersEligible(world, x, y, z)) { - doPedestalEffect(world, x, y, z, meta); - } - // warn players whether it works or not - warnIneligiblePlayers(world, x, y, z); - } else { - // just do it if enforced progression is turned off - doPedestalEffect(world, x, y, z, meta); - } - } - - rewardNearbyPlayers(world, x, y, z); - } - } - } - - private void warnIneligiblePlayers(World world, int x, int y, int z) { - // scan for players nearby to give the achievement - List nearbyPlayers = world.getEntitiesWithinAABB(EntityPlayer.class, AxisAlignedBB.getBoundingBox(x, y, z, x + 1, y + 1, z + 1).expand(16.0D, 16.0D, 16.0D)); - - for (EntityPlayer player : nearbyPlayers) { - if (!isPlayerEligible(player)) { - player.addChatMessage(new ChatComponentText("You are unworthy.")); - } - } - } - - private boolean areNearbyPlayersEligible(World world, int x, int y, int z) { - boolean isEligible = false; - // scan for players nearby to give the achievement - List nearbyPlayers = world.getEntitiesWithinAABB(EntityPlayer.class, AxisAlignedBB.getBoundingBox(x, y, z, x + 1, y + 1, z + 1).expand(16.0D, 16.0D, 16.0D)); - - for (EntityPlayer player : nearbyPlayers) { - isEligible |= isPlayerEligible(player); - } - - return isEligible; - } - - private boolean isPlayerEligible(EntityPlayer player) { - if (player instanceof EntityPlayerMP && ((EntityPlayerMP)player).func_147099_x() != null) { - StatisticsFile stats = ((EntityPlayerMP)player).func_147099_x(); - - return stats.hasAchievementUnlocked(TFAchievementPage.twilightProgressTrophyPedestal.parentAchievement); - } else if (player instanceof EntityClientPlayerMP && ((EntityClientPlayerMP)player).getStatFileWriter() != null) { - StatFileWriter stats = ((EntityClientPlayerMP)player).getStatFileWriter(); - - return stats.hasAchievementUnlocked(TFAchievementPage.twilightProgressTrophyPedestal.parentAchievement); - } - // uh, not a player? - return false; - } - - private void doPedestalEffect(World world, int x, int y, int z, int meta) { - // if we're a latent pedestal, change to a non-latent! - // remove shield blocks - removeNearbyShields(world, x, y, z); - - // change this block meta to be non-latent - world.setBlockMetadataWithNotify(x, y, z, meta & 7, 2); - - // sound - world.playSoundEffect(x + 0.5D, y + 0.5D, z + 0.5D, "mob.zombie.infect", 4.0F, 0.1F); - } - - @SuppressWarnings("unchecked") - private void rewardNearbyPlayers(World world, int x, int y, int z) { - // scan for players nearby to give the achievement - List nearbyPlayers = world.getEntitiesWithinAABB(EntityPlayer.class, AxisAlignedBB.getBoundingBox(x, y, z, x + 1, y + 1, z + 1).expand(16.0D, 16.0D, 16.0D)); - - for (EntityPlayer player : nearbyPlayers) { - player.triggerAchievement(TFAchievementPage.twilightProgressTrophyPedestal); - } - } - - /** - * Remove shield blocks near the specified coordinates - */ - protected void removeNearbyShields(World world, int x, int y, int z) { - for (int sx = -5; sx <= 5; sx++) - { - for (int sy = -5; sy <= 5; sy++) - { - for (int sz = -5; sz <= 5; sz++) - { - Block blockAt = world.getBlock(x + sx, y + sy, z + sz); - int metaAt = world.getBlockMetadata(x + sx, y + sy, z + sz); - - if (blockAt == TFBlocks.shield && metaAt == 15) - { - world.setBlock(x + sx, y + sy, z + sz, Blocks.air, 0, 2); - - // effect - world.playAuxSFX(2001, x + sx, y + sy, z + sz, Block.getIdFromBlock(blockAt) + (metaAt << 12)); - } - } - } - } - } - - - /** - * How many world ticks before ticking - */ - @Override - public int tickRate(World world) - { - return 10; - } - - /** - * Gets the hardness of block at the given coordinates in the given world, relative to the ability of the given - * EntityPlayer. - */ - @Override - public float getPlayerRelativeBlockHardness(EntityPlayer par1EntityPlayer, World world, int x, int y, int z) - { - // not breakable if meta > 0 - int meta = world.getBlockMetadata(x, y, z); - - if (meta > 0) - { - return -1; - } - else - { - return super.getPlayerRelativeBlockHardness(par1EntityPlayer, world, x, y, z); - } - } - - -} diff --git a/src/main/java/twilightforest/block/BlockTFUberousSoil.java b/src/main/java/twilightforest/block/BlockTFUberousSoil.java deleted file mode 100644 index 4dfd5624cb..0000000000 --- a/src/main/java/twilightforest/block/BlockTFUberousSoil.java +++ /dev/null @@ -1,166 +0,0 @@ -package twilightforest.block; - -import java.util.Random; - -import twilightforest.TwilightForestMod; -import twilightforest.item.TFItems; -import net.minecraft.block.Block; -import net.minecraft.block.IGrowable; -import net.minecraft.block.material.Material; -import net.minecraft.init.Blocks; -import net.minecraft.init.Items; -import net.minecraft.item.Item; -import net.minecraft.item.ItemDye; -import net.minecraft.item.ItemStack; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; -import net.minecraftforge.common.EnumPlantType; -import net.minecraftforge.common.IPlantable; -import net.minecraftforge.common.util.ForgeDirection; - -public class BlockTFUberousSoil extends Block implements IGrowable { - - protected BlockTFUberousSoil() { - super(Material.ground); - this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.9375F, 1.0F); - this.setLightOpacity(255); - this.setHardness(0.6F); - this.setStepSound(soundTypeGravel); - this.setTickRandomly(true); - - this.setBlockTextureName(TwilightForestMod.ID + ":uberous_soil"); - - this.setCreativeTab(TFItems.creativeTab); - } - - /** - * Is this block (a) opaque and (b) a full 1m cube? This determines whether or not to render the shared face of two - * adjacent blocks and also whether the player can attach torches, redstone wire, etc to this block. - */ - public boolean isOpaqueCube() - { - return false; - } - - /** - * If this block doesn't render as an ordinary block it will return False (examples: signs, buttons, stairs, etc) - */ - public boolean renderAsNormalBlock() - { - return false; - } - - public Item getItemDropped(int p_149650_1_, Random p_149650_2_, int p_149650_3_) - { - return Blocks.dirt.getItemDropped(0, p_149650_2_, p_149650_3_); - } - - /** - * Ticks the block if it's been scheduled - */ - public void updateTick(World world, int x, int y, int z, Random rand) { - Material aboveMaterial = world.getBlock(x, y + 1, z).getMaterial(); - if (aboveMaterial.isSolid()) { - world.setBlock(x, y, z, Blocks.dirt); - } - } - - /** - * Determines if this block can support the passed in plant, allowing it to be planted and grow. - * Some examples: - * Reeds check if its a reed, or if its sand/dirt/grass and adjacent to water - * Cacti checks if its a cacti, or if its sand - * Nether types check for soul sand - * Crops check for tilled soil - * Caves check if it's a solid surface - * Plains check if its grass or dirt - * Water check if its still water - * - * @param world The current world - * @param x X Position - * @param y Y Position - * @param z Z position - * @param direction The direction relative to the given position the plant wants to be, typically its UP - * @param plantable The plant that wants to check - * @return True to allow the plant to be planted/stay. - */ - public boolean canSustainPlant(IBlockAccess world, int x, int y, int z, ForgeDirection direction, IPlantable plantable) - { - //Block plant = plantable.getPlant(world, x, y + 1, z); - EnumPlantType plantType = plantable.getPlantType(world, x, y + 1, z); - - return plantType == EnumPlantType.Crop || plantType == EnumPlantType.Plains || plantType == EnumPlantType.Cave; - } - - /** - * Lets the block know when one of its neighbor changes. Doesn't know which neighbor changed (coordinates passed are - * their own) Args: x, y, z, neighbor Block - */ - public void onNeighborBlockChange(World world, int x, int y, int z, Block neighbor) { - Block above = world.getBlock(x, y + 1, z); - Material aboveMaterial = above.getMaterial(); - - if (aboveMaterial.isSolid()) - { - world.setBlock(x, y, z, Blocks.dirt); - } - - if (above instanceof IPlantable) { - IPlantable plant = (IPlantable)above; - // revert to farmland or grass - if (plant.getPlantType(world, x, y + 1, z) == EnumPlantType.Crop) { - world.setBlock(x, y, z, Blocks.farmland, 2, 2); - } else if (plant.getPlantType(world, x, y + 1, z) == EnumPlantType.Plains) { - world.setBlock(x, y, z, Blocks.grass); - } else { - world.setBlock(x, y, z, Blocks.dirt); - } - // apply bonemeal - ItemDye.applyBonemeal(new ItemStack(Items.dye), world, x, y + 1, z, null); - ItemDye.applyBonemeal(new ItemStack(Items.dye), world, x, y + 1, z, null); - ItemDye.applyBonemeal(new ItemStack(Items.dye), world, x, y + 1, z, null); - ItemDye.applyBonemeal(new ItemStack(Items.dye), world, x, y + 1, z, null); - // green sparkles - if (!world.isRemote) { - world.playAuxSFX(2005, x, y + 1, z, 0); - } - } - } - - /** - * Is is possible for us to grow? - */ - @Override - public boolean func_149851_a(World world, int x, int y, int z, boolean var5) { - return true; - } - - /** - * Have we randomly decided it's okay to grow? - */ - @Override - public boolean func_149852_a(World world, Random rand, int x, int y, int z) { - return true; - } - - /** - * Do the growth! - */ - @Override - public void func_149853_b(World world, Random rand, int x, int y, int z) { - int gx = x; - int gy = y; - int gz = z; - - if (rand.nextBoolean()) { - gx += (rand.nextBoolean() ? 1 : -1); - } else { - gz += (rand.nextBoolean() ? 1 : -1); - } - - Block blockAt = world.getBlock(gx, gy, gz); - if (world.isAirBlock(gx, gy + 1, gz) && (blockAt == Blocks.dirt || blockAt == Blocks.grass || blockAt == Blocks.farmland)) { - world.setBlock(gx, gy, gz, this); - } - } -} diff --git a/src/main/java/twilightforest/block/BlockTFUncraftingTable.java b/src/main/java/twilightforest/block/BlockTFUncraftingTable.java deleted file mode 100644 index 686c4e8a5e..0000000000 --- a/src/main/java/twilightforest/block/BlockTFUncraftingTable.java +++ /dev/null @@ -1,68 +0,0 @@ -package twilightforest.block; - -import java.util.List; - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.IIcon; -import net.minecraft.world.World; -import twilightforest.TwilightForestMod; -import twilightforest.item.TFItems; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public class BlockTFUncraftingTable extends Block { - - public static IIcon tinkerTop; - public static IIcon tinkerSide; - - protected BlockTFUncraftingTable() { - super(Material.wood); - this.setHardness(2.5F); - this.setStepSound(Block.soundTypeWood); - this.setCreativeTab(TFItems.creativeTab); - } - - - /** - * From the specified side and block metadata retrieves the blocks texture. Args: side, metadata - */ - @Override - public IIcon getIcon(int side, int meta) - { - return side == 1 ? tinkerTop : tinkerSide; - } - - @Override - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister par1IconRegister) - { - tinkerTop = par1IconRegister.registerIcon(TwilightForestMod.ID + ":uncrafting_top"); - tinkerSide = par1IconRegister.registerIcon(TwilightForestMod.ID + ":uncrafting_side"); - } - - /** - * Called when the block is clicked by a player. Args: x, y, z, entityPlayer - */ - @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int par6, float par7, float par8, float par9) { - player.openGui(TwilightForestMod.instance, 1, world, x, y, z); - return true; - } - - /** - * returns a list of blocks with the same ID, but different meta (eg: wood returns 4 blocks) - */ - @Override - public void getSubBlocks(Item par1, CreativeTabs par2CreativeTabs, List par3List) - { - par3List.add(new ItemStack(par1, 1, 0)); - } - - -} diff --git a/src/main/java/twilightforest/block/BlockTFUnderBrick.java b/src/main/java/twilightforest/block/BlockTFUnderBrick.java deleted file mode 100644 index 8566c63366..0000000000 --- a/src/main/java/twilightforest/block/BlockTFUnderBrick.java +++ /dev/null @@ -1,114 +0,0 @@ -package twilightforest.block; - -import java.util.List; - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.IIcon; -import net.minecraft.world.IBlockAccess; -import twilightforest.TwilightForestMod; -import twilightforest.item.TFItems; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public class BlockTFUnderBrick extends Block { - - private static IIcon[] iconSide = new IIcon[4]; -// private static IIcon[] iconFloor = new IIcon[4]; - - - public BlockTFUnderBrick() { - super(Material.rock); - this.setHardness(1.5F); - this.setResistance(10.0F); - this.setStepSound(Block.soundTypeStone); - - this.setCreativeTab(TFItems.creativeTab); - - } - - - @Override - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister par1IconRegister) - { -// for (int i = 0; i < this.iconSide.length; i++) -// { -// this.iconFloor[i] = Blocks.stonebrick.getIcon(0, i); -// } - - BlockTFUnderBrick.iconSide[0] = par1IconRegister.registerIcon(TwilightForestMod.ID + ":knightbrick"); - BlockTFUnderBrick.iconSide[1] = par1IconRegister.registerIcon(TwilightForestMod.ID + ":knightbrick_mossy"); - BlockTFUnderBrick.iconSide[2] = par1IconRegister.registerIcon(TwilightForestMod.ID + ":knightbrick_cracked"); - -// this.iconFloor[0] = par1IconRegister.registerIcon(TwilightForestMod.ID + ":knightbrick_floor"); -// this.iconFloor[1] = par1IconRegister.registerIcon(TwilightForestMod.ID + ":knightbrick_floor"); -// this.iconFloor[2] = par1IconRegister.registerIcon(TwilightForestMod.ID + ":knightbrick_floor"); - } - - - /** - * From the specified side and block metadata retrieves the blocks texture. Args: side, metadata - */ - @Override - public IIcon getIcon(int side, int meta) { - if (meta < BlockTFUnderBrick.iconSide.length) - { - if (side == 0 || side == 1) - { - return BlockTFUnderBrick.iconSide[meta]; - } - else - { - return BlockTFUnderBrick.iconSide[meta]; - } - } - else - { - if (side == 0 || side == 1) - { - return BlockTFUnderBrick.iconSide[0]; - } - else - { - return BlockTFUnderBrick.iconSide[0]; - } - } - } - - /** - * Returns a integer with hex for 0xrrggbb with this color multiplied against the blocks color. Note only called - * when first determining what to render. - */ - @Override - public int colorMultiplier(IBlockAccess par1IBlockAccess, int x, int y, int z) - { - int meta = par1IBlockAccess.getBlockMetadata(x, y, z); - - return 0xFFFFFF; - } - - - /** - * returns a list of blocks with the same ID, but different meta (eg: wood returns 4 blocks) - */ - @Override - public void getSubBlocks(Item par1, CreativeTabs par2CreativeTabs, List par3List) - { - par3List.add(new ItemStack(par1, 1, 0)); - par3List.add(new ItemStack(par1, 1, 1)); - par3List.add(new ItemStack(par1, 1, 2)); - } - - /** - * Determines the damage on the item the block drops. Used in cloth and wood. - */ - @Override - public int damageDropped(int meta) { - return meta; - } -} diff --git a/src/main/java/twilightforest/block/BlockTFUnripeTorchCluster.java b/src/main/java/twilightforest/block/BlockTFUnripeTorchCluster.java deleted file mode 100644 index 550c366b60..0000000000 --- a/src/main/java/twilightforest/block/BlockTFUnripeTorchCluster.java +++ /dev/null @@ -1,35 +0,0 @@ -package twilightforest.block; - -import java.util.Random; - -import net.minecraft.block.material.Material; -import net.minecraft.world.World; -import twilightforest.TwilightForestMod; -import twilightforest.item.TFItems; - -public class BlockTFUnripeTorchCluster extends BlockTFTrollRoot { - - private static final int RIPEN_THRESHHOLD = 6; - - - protected BlockTFUnripeTorchCluster() { - super(); - - this.setBlockTextureName(TwilightForestMod.ID + ":unripe_torch_cluster"); - - } - - - /** - * Ticks the block if it's been scheduled - */ - @Override - public void updateTick(World world, int x, int y, int z, Random rand) { - super.updateTick(world, x, y, z, rand); - - if (world.getBlockLightValue(x, y, z) >= RIPEN_THRESHHOLD) { - // ripen! - world.setBlock(x, y, z, TFBlocks.trollBer); - } - } -} diff --git a/src/main/java/twilightforest/block/BlockTFWispyCloud.java b/src/main/java/twilightforest/block/BlockTFWispyCloud.java deleted file mode 100644 index 2516357aea..0000000000 --- a/src/main/java/twilightforest/block/BlockTFWispyCloud.java +++ /dev/null @@ -1,65 +0,0 @@ -package twilightforest.block; - -import java.util.Random; - -import twilightforest.TwilightForestMod; -import twilightforest.item.TFItems; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import net.minecraft.block.BlockBreakable; -import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IIconRegister; - -public class BlockTFWispyCloud extends BlockBreakable { - - protected BlockTFWispyCloud() { - super("", Material.craftedSnow, false); - this.setStepSound(soundTypeCloth); - this.setCreativeTab(TFItems.creativeTab); - - this.setHardness(0.3F); - this.setBlockTextureName(TwilightForestMod.ID + ":wispy_cloud"); - - } - - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister p_149651_1_) - { - this.blockIcon = p_149651_1_.registerIcon(this.getTextureName()); - } - - /** - * Returns which pass should this block be rendered on. 0 for solids and 1 for alpha - */ - @SideOnly(Side.CLIENT) - public int getRenderBlockPass() - { - return 1; - } - - - /** - * Return true if a player with Silk Touch can harvest this block directly, and not its normal drops. - */ - protected boolean canSilkHarvest() - { - return true; - } - - /** - * Returns the quantity of items to drop on block destruction. - */ - public int quantityDropped(Random p_149745_1_) - { - return 0; - } - - - /** - * If this block doesn't render as an ordinary block it will return False (examples: signs, buttons, stairs, etc) - */ - public boolean renderAsNormalBlock() - { - return false; - } -} diff --git a/src/main/java/twilightforest/block/BookshelfBlock.java b/src/main/java/twilightforest/block/BookshelfBlock.java new file mode 100644 index 0000000000..cb5dcd28f2 --- /dev/null +++ b/src/main/java/twilightforest/block/BookshelfBlock.java @@ -0,0 +1,30 @@ +package twilightforest.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; + +public class BookshelfBlock extends Block { + + public BookshelfBlock(Properties properties) { + super(properties); + } + + @Override + public float getEnchantPowerBonus(BlockState state, LevelReader reader, BlockPos pos) { + return 1.0F; + } + + @Override + public int getFlammability(BlockState state, BlockGetter getter, BlockPos pos, Direction face) { + return 20; + } + + @Override + public int getFireSpreadSpeed(BlockState state, BlockGetter getter, BlockPos pos, Direction face) { + return 30; + } +} diff --git a/src/main/java/twilightforest/block/BossSpawnerBlock.java b/src/main/java/twilightforest/block/BossSpawnerBlock.java new file mode 100644 index 0000000000..ec411740a9 --- /dev/null +++ b/src/main/java/twilightforest/block/BossSpawnerBlock.java @@ -0,0 +1,47 @@ +package twilightforest.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.BaseEntityBlock; +import net.minecraft.world.level.block.RenderShape; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityTicker; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; +import org.jetbrains.annotations.Nullable; +import twilightforest.block.entity.spawner.BossSpawnerBlockEntity; +import twilightforest.enums.BossVariant; + +public class BossSpawnerBlock extends BaseEntityBlock { + private final BossVariant boss; + + public BossSpawnerBlock(BlockBehaviour.Properties props, BossVariant variant) { + super(props); + this.boss = variant; + } + + @Override + public RenderShape getRenderShape(BlockState state) { + return RenderShape.MODEL; + } + + @Nullable + @Override + public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { + return boss.getType().create(pos, state); + } + + @Nullable + @Override + public BlockEntityTicker getTicker(Level level, BlockState state, BlockEntityType type) { + return createTickerHelper(type, boss.getType(), BossSpawnerBlockEntity::tick); + } + + @Override + public boolean canEntityDestroy(BlockState state, BlockGetter getter, BlockPos pos, Entity entity) { + return state.getDestroySpeed(getter, pos) >= 0f; + } +} diff --git a/src/main/java/twilightforest/block/BuilderBlock.java b/src/main/java/twilightforest/block/BuilderBlock.java new file mode 100644 index 0000000000..609939ae8f --- /dev/null +++ b/src/main/java/twilightforest/block/BuilderBlock.java @@ -0,0 +1,185 @@ +package twilightforest.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.particles.DustParticleOptions; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundSource; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.BaseEntityBlock; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.RenderShape; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityTicker; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.EnumProperty; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import org.joml.Vector3f; +import twilightforest.block.entity.CarminiteBuilderBlockEntity; +import twilightforest.enums.TowerDeviceVariant; +import twilightforest.init.TFBlockEntities; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFSounds; + +import org.jetbrains.annotations.Nullable; +import java.util.Objects; + +public class BuilderBlock extends BaseEntityBlock { + + public static final EnumProperty STATE = EnumProperty.create("state", TowerDeviceVariant.class); + + public BuilderBlock(Properties properties) { + super(properties); + this.registerDefaultState(this.getStateDefinition().any().setValue(STATE, TowerDeviceVariant.BUILDER_INACTIVE)); + } + + @Override + public RenderShape getRenderShape(BlockState state) { + return RenderShape.MODEL; + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + super.createBlockStateDefinition(builder); + builder.add(STATE); + } + + @Override + @Deprecated + public void onPlace(BlockState state, Level level, BlockPos pos, BlockState oldState, boolean isMoving) { + if (!level.isClientSide() && state.getValue(STATE) == TowerDeviceVariant.BUILDER_INACTIVE && level.hasNeighborSignal(pos)) { + level.setBlockAndUpdate(pos, state.setValue(STATE, TowerDeviceVariant.BUILDER_ACTIVE)); + level.playSound(null, pos, TFSounds.BUILDER_ON.get(), SoundSource.BLOCKS, 0.3F, 0.6F); + } + } + + @Override + @Deprecated + public void neighborChanged(BlockState state, Level level, BlockPos pos, Block block, BlockPos fromPos, boolean isMoving) { + if (level.isClientSide()) { + return; + } + + TowerDeviceVariant variant = state.getValue(STATE); + + if (variant == TowerDeviceVariant.BUILDER_INACTIVE && level.hasNeighborSignal(pos)) { + level.setBlockAndUpdate(pos, state.setValue(STATE, TowerDeviceVariant.BUILDER_ACTIVE)); + level.playSound(null, pos, TFSounds.BUILDER_ON.get(), SoundSource.BLOCKS, 0.3F, 0.6F); + level.scheduleTick(pos, this, 4); + } + + if (variant == TowerDeviceVariant.BUILDER_ACTIVE && !level.hasNeighborSignal(pos)) { + level.setBlockAndUpdate(pos, state.setValue(STATE, TowerDeviceVariant.BUILDER_INACTIVE)); + level.playSound(null, pos, TFSounds.BUILDER_OFF.get(), SoundSource.BLOCKS, 0.3F, 0.6F); + level.scheduleTick(pos, this, 4); + } + + if (variant == TowerDeviceVariant.BUILDER_TIMEOUT && !level.hasNeighborSignal(pos)) { + level.setBlockAndUpdate(pos, state.setValue(STATE, TowerDeviceVariant.BUILDER_INACTIVE)); + } + } + + @Override + public void tick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) { + TowerDeviceVariant variant = state.getValue(STATE); + + if (variant == TowerDeviceVariant.BUILDER_ACTIVE && level.hasNeighborSignal(pos)) { + this.letsBuild(level, pos); + } + + if (variant == TowerDeviceVariant.BUILDER_INACTIVE || variant == TowerDeviceVariant.BUILDER_TIMEOUT) { + ((CarminiteBuilderBlockEntity) Objects.requireNonNull(level.getBlockEntity(pos))).resetStats(); + for (Direction e : Direction.values()) { + activateBuiltBlocks(level, pos.relative(e)); + } + } + } + + private void letsBuild(Level level, BlockPos pos) { + CarminiteBuilderBlockEntity tileEntity = (CarminiteBuilderBlockEntity) level.getBlockEntity(pos); + + if (tileEntity != null && !tileEntity.makingBlocks) { + tileEntity.startBuilding(); + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void animateTick(BlockState state, Level level, BlockPos pos, RandomSource random) { + if (state.getValue(STATE) == TowerDeviceVariant.BUILDER_ACTIVE) { + this.sparkle(level, pos); + } + } + + // [VanillaCopy] BlockRedstoneOre.spawnParticles. Unchanged. + public void sparkle(Level level, BlockPos pos) { + RandomSource random = level.getRandom(); + double d0 = 0.0625D; + + for (int i = 0; i < 6; ++i) { + double d1 = pos.getX() + random.nextFloat(); + double d2 = pos.getY() + random.nextFloat(); + double d3 = pos.getZ() + random.nextFloat(); + + if (i == 0 && !level.getBlockState(pos.above()).isSolidRender(level, pos)) { + d2 = pos.getY() + d0 + 1.0D; + } + + if (i == 1 && !level.getBlockState(pos.below()).isSolidRender(level, pos)) { + d2 = pos.getY() - d0; + } + + if (i == 2 && !level.getBlockState(pos.south()).isSolidRender(level, pos)) { + d3 = pos.getZ() + d0 + 1.0D; + } + + if (i == 3 && !level.getBlockState(pos.north()).isSolidRender(level, pos)) { + d3 = pos.getZ() - d0; + } + + if (i == 4 && !level.getBlockState(pos.east()).isSolidRender(level, pos)) { + d1 = pos.getX() + d0 + 1.0D; + } + + if (i == 5 && !level.getBlockState(pos.west()).isSolidRender(level, pos)) { + d1 = pos.getX() - d0; + } + + float f1 = 0.6F + 0.4F; + float f2 = Math.max(0.0F, 1.0F * 1.0F * 0.7F - 0.5F); + float f3 = Math.max(0.0F, 1.0F * 1.0F * 0.6F - 0.7F); + if (d1 < pos.getX() || d1 > pos.getX() + 1 || d2 < 0.0D || d2 > pos.getY() + 1 || d3 < pos.getZ() || d3 > pos.getZ() + 1) { + level.addParticle(new DustParticleOptions(new Vector3f(f1, f2, f3), 1.0F), d1, d2, d3, 0.0D, 0.0D, 0.0D); + } + } + } + + /** + * If the targeted block is a vanishing block, activate it + */ + public static void activateBuiltBlocks(Level level, BlockPos pos) { + BlockState state = level.getBlockState(pos); + + if (state.getBlock() == TFBlocks.BUILT_BLOCK.get() && !state.getValue(TranslucentBuiltBlock.ACTIVE)) { + level.setBlockAndUpdate(pos, state.setValue(TranslucentBuiltBlock.ACTIVE, true)); + level.playSound(null, pos, TFSounds.BUILDER_REPLACE.get(), SoundSource.BLOCKS, 0.3F, 0.6F); + level.scheduleTick(pos, state.getBlock(), 10); + } + } + + @Nullable + @Override + public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { + return new CarminiteBuilderBlockEntity(pos, state); + } + + @Nullable + @Override + public BlockEntityTicker getTicker(Level level, BlockState state, BlockEntityType type) { + return state.getValue(STATE) == TowerDeviceVariant.BUILDER_ACTIVE ? createTickerHelper(type, TFBlockEntities.TOWER_BUILDER.get(), CarminiteBuilderBlockEntity::tick) : null; + } +} diff --git a/src/main/java/twilightforest/block/BurntThornsBlock.java b/src/main/java/twilightforest/block/BurntThornsBlock.java new file mode 100644 index 0000000000..430480a08a --- /dev/null +++ b/src/main/java/twilightforest/block/BurntThornsBlock.java @@ -0,0 +1,43 @@ +package twilightforest.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.entity.projectile.Projectile; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.level.pathfinder.BlockPathTypes; + +import org.jetbrains.annotations.Nullable; + +public class BurntThornsBlock extends ThornsBlock { + + public BurntThornsBlock(Properties properties) { + super(properties); + } + + @Nullable + @Override + public BlockPathTypes getBlockPathType(BlockState state, BlockGetter getter, BlockPos pos, @Nullable Mob entity) { + return null; + } + + @Override + @Deprecated + public void entityInside(BlockState state, Level level, BlockPos pos, Entity entity) { + // dissolve + if (!level.isClientSide() && (entity instanceof LivingEntity || entity instanceof Projectile)) { + level.destroyBlock(pos, false); + } + } + + @Override + public boolean onDestroyedByPlayer(BlockState state, Level level, BlockPos pos, Player player, boolean willHarvest, FluidState fluid) { + state.getBlock().playerWillDestroy(level, pos, state, player); + return level.setBlock(pos, fluid.createLegacyBlock(), level.isClientSide ? 11 : 3); + } +} diff --git a/src/main/java/twilightforest/block/CandelabraBlock.java b/src/main/java/twilightforest/block/CandelabraBlock.java new file mode 100644 index 0000000000..8f28a9a7d8 --- /dev/null +++ b/src/main/java/twilightforest/block/CandelabraBlock.java @@ -0,0 +1,193 @@ +package twilightforest.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.util.RandomSource; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.*; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.block.state.properties.DirectionProperty; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.level.material.Fluids; +import net.minecraft.world.phys.Vec3; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; + +import org.jetbrains.annotations.Nullable; +import java.util.List; + +// The code is flexible to allow colors but I'm not sure if they'd look good on Candelabra +public class CandelabraBlock extends AbstractLightableBlock implements SimpleWaterloggedBlock { + public static final BooleanProperty ON_WALL = BooleanProperty.create("on_wall"); + public static final DirectionProperty FACING = BlockStateProperties.HORIZONTAL_FACING; + private static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED; + + public static final VoxelShape CANDLES_NORTH = Shapes.or(Block.box(1, 7, 2, 15, 15, 6), Block.box(1, 1, 3.5, 15, 7, 4.5), Block.box(7.5, 1, 1, 8.5, 7, 7), Block.box(6, 2, 0, 10, 6, 1)); + public static final VoxelShape CANDLES_SOUTH = Shapes.or(Block.box(1, 7, 10, 15, 15, 14), Block.box(1, 1, 11.5, 15, 7, 12.5), Block.box(7.5, 1, 9, 8.5, 7, 15), Block.box(6, 2, 15, 10, 6, 16)); + + public static final VoxelShape CANDLES_WEST = Shapes.or(Block.box(2, 7, 1, 6, 15, 15), Block.box(3.5, 1, 1, 4.5, 7, 15), Block.box(1, 1, 7.5, 7, 7, 8.5), Block.box(0, 2, 6, 1, 6, 10)); + public static final VoxelShape CANDLES_EAST = Shapes.or(Block.box(10, 7, 1, 14, 15, 15), Block.box(11.5, 1, 1, 12.5, 7, 15), Block.box(9, 1, 7.5, 15, 7, 8.5), Block.box(15, 2, 6, 16, 6, 10)); + + public static final VoxelShape CANDLES_X = Shapes.or(Block.box(6, 7, 1, 10, 15, 15), Block.box(7.5, 1, 1, 8.5, 7, 15), Block.box(5, 1, 7.5, 11, 7, 8.5), Block.box(6, 0, 6, 10, 1, 10)); + public static final VoxelShape CANDLES_Z = Shapes.or(Block.box(1, 7, 6, 15, 15, 10), Block.box(1, 1, 7.5, 15, 7, 8.5), Block.box(7.5, 1, 5, 8.5, 7, 11), Block.box(6, 0, 6, 10, 1, 10)); + + public static final List NORTH_OFFSETS = List.of(new Vec3(0.1875D, 0.875D, 0.25D), new Vec3(0.5D, 0.875D, 0.25D), new Vec3(0.8125D, 0.875D, 0.25D)); + public static final List SOUTH_OFFSETS = List.of(new Vec3(0.1875D, 0.875D, 0.75D), new Vec3(0.5D, 0.875D, 0.75D), new Vec3(0.8125D, 0.875D, 0.75D)); + + public static final List WEST_OFFSETS = List.of(new Vec3(0.25D, 0.875D, 0.1875D), new Vec3(0.25D, 0.875D, 0.5D), new Vec3(0.25D, 0.875D, 0.8125D)); + public static final List EAST_OFFSETS = List.of(new Vec3(0.75D, 0.875D, 0.1875D), new Vec3(0.75D, 0.875D, 0.5D), new Vec3(0.75D, 0.875D, 0.8125D)); + + public static final List X_OFFSETS = List.of(new Vec3(0.5D, 0.875D, 0.1875D), new Vec3(0.5D, 0.875D, 0.5D), new Vec3(0.5D, 0.875D, 0.8125D)); + public static final List Z_OFFSETS = List.of(new Vec3(0.1875D, 0.875D, 0.5D), new Vec3(0.5D, 0.875D, 0.5D), new Vec3(0.8125D, 0.875D, 0.5D)); + + public CandelabraBlock(Properties properties) { + super(properties); + this.registerDefaultState(this.getStateDefinition().any().setValue(FACING, Direction.NORTH).setValue(ON_WALL, false).setValue(LIGHTING, Lighting.NONE).setValue(WATERLOGGED, false)); + } + + @Override + protected Iterable getParticleOffsets(BlockState state, LevelAccessor accessor, BlockPos pos) { + if (state.getValue(ON_WALL)) { + return switch (state.getValue(FACING)) { + case SOUTH -> SOUTH_OFFSETS; + case WEST -> WEST_OFFSETS; + case EAST -> EAST_OFFSETS; + default -> NORTH_OFFSETS; + }; + } else { + return state.getValue(FACING).getAxis() == Direction.Axis.X ? X_OFFSETS : Z_OFFSETS; + } + } + + @Override + public VoxelShape getShape(BlockState state, BlockGetter getter, BlockPos pos, CollisionContext context) { + if (state.getValue(ON_WALL)) { + return switch (state.getValue(FACING)) { + case SOUTH -> CANDLES_SOUTH; + case WEST -> CANDLES_WEST; + case EAST -> CANDLES_EAST; + default -> CANDLES_NORTH; + }; + } else { + return state.getValue(FACING).getAxis() == Direction.Axis.X ? CANDLES_X : CANDLES_Z; + } + } + + @Override + public FluidState getFluidState(BlockState state) { + return state.getValue(WATERLOGGED) ? Fluids.WATER.getSource(false) : super.getFluidState(state); + } + + @Override + public BlockState getStateForPlacement(BlockPlaceContext context) { + Direction clickDirection = context.getClickedFace(); + boolean onBottomBlock = clickDirection == Direction.UP; + Direction[] placements = context.getNearestLookingDirections(); + BlockPos placePos = context.getClickedPos(); + Level level = context.getLevel(); + FluidState fluidstate = context.getLevel().getFluidState(context.getClickedPos()); + boolean flag = fluidstate.is(Fluids.WATER); + + // If placer is clicking the bottom block, then we want to test for the bottom block first + // before we cycle the walls for possible placements + // Otherwise we test wall placements before testing the bottom block + if (onBottomBlock) { + if (canSurvive(level, placePos, false, context.getHorizontalDirection())) + return this.defaultBlockState().setValue(FACING, context.getHorizontalDirection()).setValue(ON_WALL, false).setValue(WATERLOGGED, flag); + + for (Direction nextSide : placements) + if (nextSide.getAxis().isHorizontal() && canSurvive(level, placePos, true, nextSide)) + return this.defaultBlockState().setValue(FACING, context.getHorizontalDirection()).setValue(ON_WALL, true).setValue(WATERLOGGED, flag); + } else { + for (Direction nextSide : placements) + if (nextSide.getAxis().isHorizontal() && canSurvive(level, placePos, true, nextSide)) + return this.defaultBlockState().setValue(FACING, context.getHorizontalDirection()).setValue(ON_WALL, true).setValue(WATERLOGGED, flag); + + if (canSurvive(level, placePos, false, context.getHorizontalDirection())) + return this.defaultBlockState().setValue(FACING, context.getHorizontalDirection()).setValue(ON_WALL, false).setValue(WATERLOGGED, flag); + } + + // Fail + return null; + } + + @Override + protected boolean canBeLit(BlockState state) { + return super.canBeLit(state) && !state.getValue(WATERLOGGED); + } + + @Override + public boolean placeLiquid(LevelAccessor accessor, BlockPos pos, BlockState state, FluidState fluid) { + if (!state.getValue(BlockStateProperties.WATERLOGGED) && fluid.is(Fluids.WATER)) { + boolean flag = state.getValue(LIGHTING) != Lighting.NONE; + if (flag) extinguish(null, state, accessor, pos); + + accessor.setBlock(pos, state.setValue(WATERLOGGED, true).setValue(LIGHTING, Lighting.NONE), 3); + accessor.scheduleTick(pos, fluid.getType(), fluid.getType().getTickDelay(accessor)); + return true; + } else { + return false; + } + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + builder.add(FACING, ON_WALL, LIGHTING, WATERLOGGED); + } + + @Override + public boolean canSurvive(BlockState state, LevelReader reader, BlockPos pos) { + return canSurvive(reader, pos, state.getValue(ON_WALL), state.getValue(FACING)); + } + + public static boolean canSurvive(LevelReader reader, BlockPos pos, boolean onWall, Direction facing) { + return canSupportCenter(reader, onWall ? pos.relative(facing) : pos.below(), Direction.UP); + } + + @Override + public RenderShape getRenderShape(BlockState state) { + return RenderShape.MODEL; + } + + @Override + public BlockState rotate(BlockState state, Rotation rotation) { + return state.setValue(FACING, rotation.rotate(state.getValue(FACING))); + } + + @Override + public BlockState mirror(BlockState state, Mirror mirror) { + return state.rotate(mirror.getRotation(state.getValue(FACING))); + } + + @Override + public void animateTick(BlockState state, Level level, BlockPos pos, RandomSource rand) { + boolean ominous = state.getValue(LIGHTING) == Lighting.OMINOUS; + if (state.getValue(LIGHTING) != Lighting.NONE) { + this.getParticleOffsets(state, level, pos).forEach(vec3 -> addParticlesAndSound(level, pos, vec3.x, vec3.y, vec3.z, rand, ominous)); + } + } + + @Nullable + @Override + public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { + return null; + } + + @Override + public BlockState updateShape(BlockState state, Direction facing, BlockState facingState, LevelAccessor accessor, BlockPos currentPos, BlockPos facingPos) { + if (state.getValue(WATERLOGGED)) { + accessor.scheduleTick(currentPos, Fluids.WATER, Fluids.WATER.getTickDelay(accessor)); + } + + return super.updateShape(state, facing, facingState, accessor, currentPos, facingPos); + } +} diff --git a/src/main/java/twilightforest/block/CarminiteBlock.java b/src/main/java/twilightforest/block/CarminiteBlock.java new file mode 100644 index 0000000000..c61fe3ac97 --- /dev/null +++ b/src/main/java/twilightforest/block/CarminiteBlock.java @@ -0,0 +1,15 @@ +package twilightforest.block; + +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; + +public class CarminiteBlock extends Block { + public CarminiteBlock(Properties properties) { + super(properties); + } + + @Override + public boolean isStickyBlock(BlockState state) { + return true; + } +} diff --git a/src/main/java/twilightforest/block/CarminiteReactorBlock.java b/src/main/java/twilightforest/block/CarminiteReactorBlock.java new file mode 100644 index 0000000000..8ff1f6b645 --- /dev/null +++ b/src/main/java/twilightforest/block/CarminiteReactorBlock.java @@ -0,0 +1,72 @@ +package twilightforest.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.BaseEntityBlock; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.RenderShape; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityTicker; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import twilightforest.block.entity.CarminiteReactorBlockEntity; +import twilightforest.init.TFBlockEntities; + +import org.jetbrains.annotations.Nullable; +import java.util.Arrays; + +public class CarminiteReactorBlock extends BaseEntityBlock { + + public static final BooleanProperty ACTIVE = BooleanProperty.create("active"); + + public CarminiteReactorBlock(Properties props) { + super(props); + this.registerDefaultState(this.getStateDefinition().any().setValue(ACTIVE, false)); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + super.createBlockStateDefinition(builder); + builder.add(ACTIVE); + } + + @Override + public RenderShape getRenderShape(BlockState state) { + return RenderShape.MODEL; + } + + @Override + @Deprecated + public void neighborChanged(BlockState state, Level level, BlockPos pos, Block blockIn, BlockPos fromPos, boolean isMoving) { + if (level.isClientSide()) return; + + if (!state.getValue(ACTIVE) && this.isReactorReady(level, pos)) { + // check if we should fire up the reactor + level.setBlockAndUpdate(pos, state.setValue(ACTIVE, true)); + } + } + + /** + * Check if the reactor has all the specified things around it + */ + private boolean isReactorReady(Level level, BlockPos pos) { + return Arrays.stream(Direction.values()) + .allMatch(e -> level.getBlockState(pos.relative(e)).getBlock() == Blocks.REDSTONE_BLOCK); + } + + @Nullable + @Override + public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { + return new CarminiteReactorBlockEntity(pos, state); + } + + @Nullable + @Override + public BlockEntityTicker getTicker(Level level, BlockState state, BlockEntityType type) { + return createTickerHelper(type, TFBlockEntities.CARMINITE_REACTOR.get(), CarminiteReactorBlockEntity::tick); + } +} diff --git a/src/main/java/twilightforest/block/CastleDoorBlock.java b/src/main/java/twilightforest/block/CastleDoorBlock.java new file mode 100644 index 0000000000..78d8aae139 --- /dev/null +++ b/src/main/java/twilightforest/block/CastleDoorBlock.java @@ -0,0 +1,176 @@ +package twilightforest.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundSource; +import net.minecraft.util.RandomSource; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.material.PushReaction; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; +import twilightforest.init.TFParticleType; +import twilightforest.init.TFSounds; +import twilightforest.util.WorldUtil; +import twilightforest.world.components.chunkgenerators.ChunkGeneratorTwilight; + +public class CastleDoorBlock extends Block { + + public static final BooleanProperty ACTIVE = BooleanProperty.create("active"); + public static final BooleanProperty VANISHED = BooleanProperty.create("vanish"); + + private static final VoxelShape REAPPEARING_BB = Shapes.create(new AABB(0.375F, 0.375F, 0.375F, 0.625F, 0.625F, 0.625F)); + + public CastleDoorBlock(Properties properties) { + super(properties); + this.registerDefaultState(this.getStateDefinition().any().setValue(ACTIVE, false).setValue(VANISHED, false)); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + super.createBlockStateDefinition(builder); + builder.add(ACTIVE, VANISHED); + } + + @Override + public boolean skipRendering(BlockState state, BlockState otherState, Direction direction) { + return otherState.getBlock() instanceof CastleDoorBlock && otherState.getValue(VANISHED) == state.getValue(VANISHED); + } + + @Override + public VoxelShape getOcclusionShape(BlockState state, BlockGetter getter, BlockPos pos) { + return state.getValue(VANISHED) || !state.getValue(ACTIVE) ? Shapes.empty() : super.getOcclusionShape(state, getter, pos); + } + + @Override + public VoxelShape getCollisionShape(BlockState state, BlockGetter getter, BlockPos pos, CollisionContext context) { + return state.getValue(VANISHED) ? Shapes.empty() : super.getCollisionShape(state, getter, pos, context); + } + + @Override + public VoxelShape getShape(BlockState state, BlockGetter getter, BlockPos pos, CollisionContext context) { + return state.getValue(VANISHED) ? REAPPEARING_BB : super.getShape(state, getter, pos, context); + } + + @Override + public InteractionResult use(BlockState state, Level level, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { + return this.onActivation(level, pos, state); + } + + @Override + public void neighborChanged(BlockState state, Level level, BlockPos pos, Block block, BlockPos fromPos, boolean isMoving) { + if (!(block instanceof CastleDoorBlock) && level.hasNeighborSignal(pos)) { + this.onActivation(level, pos, state); + } + } + + @Override + public PushReaction getPistonPushReaction(BlockState state) { + return PushReaction.BLOCK; + } + + private InteractionResult onActivation(Level level, BlockPos pos, BlockState state) { + + if (state.getValue(VANISHED) || state.getValue(ACTIVE)) return InteractionResult.FAIL; + + if (isBlockLocked(level, pos)) { + level.playSound(null, pos, TFSounds.DOOR_ACTIVATED.get(), SoundSource.BLOCKS, 1.0F, 0.3F); + return InteractionResult.PASS; + } else { + changeToActiveBlock(level, pos, state); + return InteractionResult.SUCCESS; + } + } + + private void changeToActiveBlock(Level level, BlockPos pos, BlockState originState) { + if (originState.getBlock() instanceof CastleDoorBlock) { + level.setBlockAndUpdate(pos, originState.setValue(ACTIVE, true)); + } + level.scheduleTick(pos, originState.getBlock(), 2 + level.getRandom().nextInt(5)); + } + + private static boolean isBlockLocked(Level level, BlockPos pos) { + // check if we are in a structure, and if that structure says that we are locked + if (!level.isClientSide()) { + ChunkGeneratorTwilight generator = WorldUtil.getChunkGenerator(level); + //return generator != null && generator.isStructureLocked(pos, lockIndex); + } + return false; + } + + @Override + public void tick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) { + if (state.getValue(VANISHED)) { + if (state.getValue(ACTIVE)) { + level.setBlockAndUpdate(pos, state.setValue(VANISHED, false).setValue(ACTIVE, false)); + } else { + this.changeToActiveBlock(level, pos, state); + } + playReappearSound(level, pos); + } else { + if (state.getValue(ACTIVE)) { + level.setBlockAndUpdate(pos, state.setValue(VANISHED, true).setValue(ACTIVE, false)); + level.scheduleTick(pos, this, 80); + + this.playVanishSound(level, pos); + + this.vanishParticles(level, pos); + + // activate all adjacent inactive doors + for (Direction e : Direction.values()) { + this.checkAndActivateCastleDoor(level, pos.relative(e)); + } + } + } + } + + private void playVanishSound(Level level, BlockPos pos) { + level.playSound(null, pos, TFSounds.DOOR_VANISH.get(), SoundSource.BLOCKS, 0.125f, level.getRandom().nextFloat() * 0.25F + 1.75F); + } + + private void playReappearSound(Level level, BlockPos pos) { + level.playSound(null, pos, TFSounds.DOOR_REAPPEAR.get(), SoundSource.BLOCKS, 0.125f, level.getRandom().nextFloat() * 0.25F + 1.25F); + } + + /** + * If the targeted block is a vanishing block, activate it + */ + public void checkAndActivateCastleDoor(Level level, BlockPos pos) { + BlockState state = level.getBlockState(pos); + + if (state.getBlock() instanceof CastleDoorBlock && !state.getValue(VANISHED) && !state.getValue(ACTIVE) && !isBlockLocked(level, pos)) { + this.changeToActiveBlock(level, pos, state); + } + } + + private void vanishParticles(Level level, BlockPos pos) { + RandomSource rand = level.getRandom(); + if (level instanceof ServerLevel) { + for (int dx = 0; dx < 4; ++dx) { + for (int dy = 0; dy < 4; ++dy) { + for (int dz = 0; dz < 4; ++dz) { + + double x = pos.getX() + (dx + 0.5D) / 4; + double y = pos.getY() + (dy + 0.5D) / 4; + double z = pos.getZ() + (dz + 0.5D) / 4; + + double speed = rand.nextGaussian() * 0.2D; + + ((ServerLevel) level).sendParticles(TFParticleType.ANNIHILATE.get(), x, y, z, 1, 0, 0, 0, speed); + } + } + } + } + } +} diff --git a/src/main/java/twilightforest/block/CicadaBlock.java b/src/main/java/twilightforest/block/CicadaBlock.java new file mode 100644 index 0000000000..e46353cd98 --- /dev/null +++ b/src/main/java/twilightforest/block/CicadaBlock.java @@ -0,0 +1,47 @@ +package twilightforest.block; + +import net.minecraft.client.Minecraft; +import net.minecraft.core.BlockPos; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityTicker; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import org.jetbrains.annotations.Nullable; +import twilightforest.block.entity.CicadaBlockEntity; +import twilightforest.init.TFBlockEntities; +import twilightforest.init.TFSounds; +import twilightforest.loot.TFLootTables; + +public class CicadaBlock extends CritterBlock { + public CicadaBlock(Properties properties) { + super(properties); + } + + @Nullable + @Override + public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { + return new CicadaBlockEntity(pos, state); + } + + @Nullable + @Override + public BlockEntityTicker getTicker(Level level, BlockState state, BlockEntityType type) { + return createTickerHelper(type, TFBlockEntities.CICADA.get(), CicadaBlockEntity::tick); + } + + @Override + public @Nullable ResourceLocation getSquishLootTable() { + return TFLootTables.CICADA_SQUISH_DROPS; + } + + @Override + public void destroy(LevelAccessor accessor, BlockPos pos, BlockState state) { + super.destroy(accessor, pos, state); + if (accessor.isClientSide()) + Minecraft.getInstance().getSoundManager().stop(TFSounds.CICADA.get().getLocation(), SoundSource.NEUTRAL); + } +} diff --git a/src/main/java/twilightforest/block/CinderFurnaceBlock.java b/src/main/java/twilightforest/block/CinderFurnaceBlock.java new file mode 100644 index 0000000000..5b0814ffb9 --- /dev/null +++ b/src/main/java/twilightforest/block/CinderFurnaceBlock.java @@ -0,0 +1,118 @@ +package twilightforest.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.util.RandomSource; +import net.minecraft.world.Containers; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.BaseEntityBlock; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.RenderShape; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityTicker; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.block.state.properties.DirectionProperty; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import twilightforest.block.entity.CinderFurnaceBlockEntity; +import twilightforest.init.TFBlockEntities; + +import org.jetbrains.annotations.Nullable; + +public class CinderFurnaceBlock extends BaseEntityBlock { + + public static final BooleanProperty LIT = BooleanProperty.create("lit"); + private static final DirectionProperty FACING = TFHorizontalBlock.FACING; + + public CinderFurnaceBlock() { + super(Properties.of(Material.WOOD).requiresCorrectToolForDrops().strength(7.0F).lightLevel((state) -> 15)); + this.registerDefaultState(this.getStateDefinition().any().setValue(FACING, Direction.NORTH).setValue(LIT, false)); + } + + @Override + public RenderShape getRenderShape(BlockState state) { + return RenderShape.MODEL; + } + + @Override + public int getLightEmission(BlockState state, BlockGetter getter, BlockPos pos) { + return state.getValue(LIT) ? 15 : 0; + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + super.createBlockStateDefinition(builder); + builder.add(LIT, FACING); + } + + @Nullable + @Override + public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { + return new CinderFurnaceBlockEntity(pos, state); + } + + @Nullable + @Override + public BlockEntityTicker getTicker(Level level, BlockState state, BlockEntityType type) { + return createTickerHelper(type, TFBlockEntities.CINDER_FURNACE.get(), CinderFurnaceBlockEntity::tick); + } + + @Override + @Deprecated + public boolean triggerEvent(BlockState state, Level level, BlockPos pos, int id, int param) { + super.triggerEvent(state, level, pos, id, param); + BlockEntity tileentity = level.getBlockEntity(pos); + return tileentity != null && tileentity.triggerEvent(id, param); + } + + @Override + @Deprecated + public InteractionResult use(BlockState state, Level level, BlockPos pos, Player player, InteractionHand handIn, BlockHitResult hit) { + if (!level.isClientSide() && level.getBlockEntity(pos) instanceof CinderFurnaceBlockEntity cinder) { + player.openMenu(cinder); + } + + return InteractionResult.PASS; + } + + @Override + public void setPlacedBy(Level level, BlockPos pos, BlockState state, @Nullable LivingEntity placer, ItemStack stack) { + if (stack.hasCustomHoverName()) { + ((CinderFurnaceBlockEntity) level.getBlockEntity(pos)).setCustomName(stack.getHoverName()); + } + } + + @OnlyIn(Dist.CLIENT) + @Override + public void animateTick(BlockState state, Level level, BlockPos pos, RandomSource random) { + if (state.getValue(LIT)) { + Blocks.FURNACE.animateTick(state, level, pos, random); + } + } + + @Override + @Deprecated + public void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean isMoving) { + if (state.getBlock() != newState.getBlock()) { + BlockEntity tileentity = level.getBlockEntity(pos); + if (tileentity instanceof CinderFurnaceBlockEntity) { + Containers.dropContents(level, pos, (CinderFurnaceBlockEntity) tileentity); + level.updateNeighbourForOutputSignal(pos, this); + } + + super.onRemove(state, level, pos, newState, isMoving); + } + } +} diff --git a/src/main/java/twilightforest/block/ConnectableRotatedPillarBlock.java b/src/main/java/twilightforest/block/ConnectableRotatedPillarBlock.java new file mode 100644 index 0000000000..63ff1f0976 --- /dev/null +++ b/src/main/java/twilightforest/block/ConnectableRotatedPillarBlock.java @@ -0,0 +1,115 @@ +package twilightforest.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.PipeBlock; +import net.minecraft.world.level.block.RotatedPillarBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; + +public abstract class ConnectableRotatedPillarBlock extends RotatedPillarBlock { + protected static final BooleanProperty NORTH = PipeBlock.NORTH; + protected static final BooleanProperty SOUTH = PipeBlock.SOUTH; + protected static final BooleanProperty WEST = PipeBlock.WEST; + protected static final BooleanProperty EAST = PipeBlock.EAST; + protected static final BooleanProperty UP = PipeBlock.UP; + protected static final BooleanProperty DOWN = PipeBlock.DOWN; + + final double boundingBoxWidthLower; + final double boundingBoxWidthUpper; + + ConnectableRotatedPillarBlock(Properties props, double size) { + this(props, size, size); + } + + ConnectableRotatedPillarBlock(Properties props, double width, double height) { + super(props.noOcclusion()); + + if (width >= 16d) { + this.boundingBoxWidthLower = 0d; + this.boundingBoxWidthUpper = 16d; + } else { + this.boundingBoxWidthLower = 8d - (width / 2d); + this.boundingBoxWidthUpper = 16d - this.boundingBoxWidthLower; + } + + this.registerDefaultState(this.getStateDefinition().any().setValue(AXIS, Direction.Axis.Y) + .setValue(NORTH, false).setValue(WEST, false) + .setValue(SOUTH, false).setValue(EAST, false) + .setValue(DOWN, false).setValue(UP, false)); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + super.createBlockStateDefinition(builder); + builder.add(NORTH, EAST, SOUTH, WEST, DOWN, UP); + } + + @Override + public BlockState updateShape(BlockState state, Direction facing, BlockState facingState, LevelAccessor accessor, BlockPos pos, BlockPos facingPos) { + return state.setValue(PipeBlock.PROPERTY_BY_DIRECTION.get(facing), this.canConnectTo(facingState, facingState.isFaceSturdy(accessor, facingPos, facing.getOpposite()))); + } + + public boolean canConnectTo(BlockState state, boolean solidSide) { + return !isExceptionForConnection(state) && solidSide; + } + + @Override + public BlockState getStateForPlacement(BlockPlaceContext context) { + BlockGetter iblockreader = context.getLevel(); + BlockPos blockpos = context.getClickedPos(); + BlockPos blockpos1 = blockpos.north(); + BlockPos blockpos2 = blockpos.south(); + BlockPos blockpos3 = blockpos.west(); + BlockPos blockpos4 = blockpos.east(); + BlockState blockstate = iblockreader.getBlockState(blockpos1); + BlockState blockstate1 = iblockreader.getBlockState(blockpos2); + BlockState blockstate2 = iblockreader.getBlockState(blockpos3); + BlockState blockstate3 = iblockreader.getBlockState(blockpos4); + return this.defaultBlockState().setValue(AXIS, context.getClickedFace().getAxis()) + .setValue(NORTH, this.canConnectTo(blockstate, blockstate.isFaceSturdy(iblockreader, blockpos1, Direction.SOUTH))) + .setValue(SOUTH, this.canConnectTo(blockstate1, blockstate1.isFaceSturdy(iblockreader, blockpos2, Direction.NORTH))) + .setValue(WEST, this.canConnectTo(blockstate2, blockstate2.isFaceSturdy(iblockreader, blockpos3, Direction.EAST))) + .setValue(EAST, this.canConnectTo(blockstate3, blockstate3.isFaceSturdy(iblockreader, blockpos4, Direction.WEST))); + } + + @Override + @Deprecated + public VoxelShape getShape(BlockState state, BlockGetter getter, BlockPos pos, CollisionContext context) { + return switch (state.getValue(AXIS)) { + case X -> box( + 0d, + state.getValue(NORTH) ? 0d : this.boundingBoxWidthLower, + state.getValue(WEST) ? 0d : this.boundingBoxWidthLower, + 16d, + state.getValue(SOUTH) ? 16d : this.boundingBoxWidthUpper, + state.getValue(EAST) ? 16d : this.boundingBoxWidthUpper + ); + case Z -> box( + state.getValue(EAST) ? 0d : this.boundingBoxWidthLower, + state.getValue(SOUTH) ? 0d : this.boundingBoxWidthLower, + 0d, + state.getValue(WEST) ? 16d : this.boundingBoxWidthUpper, + state.getValue(NORTH) ? 16d : this.boundingBoxWidthUpper, + 16d + ); + default -> box( + state.getValue(WEST) ? 0d : this.boundingBoxWidthLower, + 0d, + state.getValue(NORTH) ? 0d : this.boundingBoxWidthLower, + state.getValue(EAST) ? 16d : this.boundingBoxWidthUpper, + 16d, + state.getValue(SOUTH) ? 16d : this.boundingBoxWidthUpper + ); + }; + } +} diff --git a/src/main/java/twilightforest/block/CritterBlock.java b/src/main/java/twilightforest/block/CritterBlock.java new file mode 100644 index 0000000000..d39106642c --- /dev/null +++ b/src/main/java/twilightforest/block/CritterBlock.java @@ -0,0 +1,196 @@ +package twilightforest.block; + +import net.minecraft.client.Minecraft; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.particles.BlockParticleOption; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundSource; +import net.minecraft.util.Mth; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.item.FallingBlockEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.entity.projectile.Projectile; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.*; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.block.state.properties.DirectionProperty; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.level.material.Fluids; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.Vec3; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; +import twilightforest.advancements.TFAdvancements; +import twilightforest.data.tags.EntityTagGenerator; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFSounds; +import twilightforest.init.TFStats; + +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public abstract class CritterBlock extends BaseEntityBlock implements SimpleWaterloggedBlock { + public static final DirectionProperty FACING = DirectionalBlock.FACING; + public static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED; + private final VoxelShape DOWN_BB = Shapes.create(new AABB(0.2F, 0.85F, 0.2F, 0.8F, 1.0F, 0.8F)); + private final VoxelShape UP_BB = Shapes.create(new AABB(0.2F, 0.0F, 0.2F, 0.8F, 0.15F, 0.8F)); + private final VoxelShape NORTH_BB = Shapes.create(new AABB(0.2F, 0.2F, 0.85F, 0.8F, 0.8F, 1.0F)); + private final VoxelShape SOUTH_BB = Shapes.create(new AABB(0.2F, 0.2F, 0.0F, 0.8F, 0.8F, 0.15F)); + private final VoxelShape WEST_BB = Shapes.create(new AABB(0.85F, 0.2F, 0.2F, 1.0F, 0.8F, 0.8F)); + private final VoxelShape EAST_BB = Shapes.create(new AABB(0.0F, 0.2F, 0.2F, 0.15F, 0.8F, 0.8F)); + + protected CritterBlock(Properties properties) { + super(properties); + this.registerDefaultState(this.getStateDefinition().any().setValue(FACING, Direction.UP).setValue(WATERLOGGED, Boolean.FALSE)); + } + + @Override + @Deprecated + public VoxelShape getShape(BlockState state, BlockGetter getter, BlockPos pos, CollisionContext context) { + return switch (state.getValue(FACING)) { + case DOWN -> DOWN_BB; + default -> UP_BB; + case NORTH -> NORTH_BB; + case SOUTH -> SOUTH_BB; + case WEST -> WEST_BB; + case EAST -> EAST_BB; + }; + } + + @Override + public FluidState getFluidState(BlockState state) { + return state.getValue(WATERLOGGED) ? Fluids.WATER.getSource(false) : super.getFluidState(state); + } + + @Nullable + @Override + public BlockState getStateForPlacement(BlockPlaceContext context) { + Direction clicked = context.getClickedFace(); + FluidState fluidstate = context.getLevel().getFluidState(context.getClickedPos()); + BlockState state = defaultBlockState().setValue(FACING, clicked).setValue(WATERLOGGED, fluidstate.getType() == Fluids.WATER); + + if (canSurvive(state, context.getLevel(), context.getClickedPos())) { + return state; + } + + for (Direction dir : context.getNearestLookingDirections()) { + state = defaultBlockState().setValue(FACING, dir.getOpposite()); + if (canSurvive(state, context.getLevel(), context.getClickedPos())) { + return state; + } + } + return null; + } + + @Override + @Deprecated + public BlockState updateShape(BlockState state, Direction direction, BlockState neighborState, LevelAccessor accessor, BlockPos pos, BlockPos neighborPos) { + if (state.getValue(WATERLOGGED)) { + accessor.scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickDelay(accessor)); + } + if (state.getValue(FACING).getOpposite() == direction && !state.canSurvive(accessor, pos)) { + return Blocks.AIR.defaultBlockState(); + } else { + return super.updateShape(state, direction, neighborState, accessor, pos, neighborPos); + } + } + + @Override + @Deprecated + public boolean canSurvive(BlockState state, LevelReader reader, BlockPos pos) { + Direction facing = state.getValue(DirectionalBlock.FACING); + BlockPos restingPos = pos.relative(facing.getOpposite()); + return canSupportCenter(reader, restingPos, facing); + } + + @Override + public BlockState rotate(BlockState state, Rotation rotation) { + return state.setValue(FACING, rotation.rotate(state.getValue(FACING))); + } + + @Override + public InteractionResult use(BlockState state, Level level, BlockPos pos, Player player, InteractionHand hand, BlockHitResult result) { + ItemStack stack = player.getItemInHand(hand); + if (stack.getItem() == Items.GLASS_BOTTLE) { + if (this == TFBlocks.FIREFLY.get()) { + if (!player.isCreative()) stack.shrink(1); + player.getInventory().add(new ItemStack(TFBlocks.FIREFLY_JAR.get())); + level.setBlockAndUpdate(pos, state.getValue(WATERLOGGED) ? Blocks.WATER.defaultBlockState() : Blocks.AIR.defaultBlockState()); + return InteractionResult.sidedSuccess(level.isClientSide()); + } else if (this == TFBlocks.CICADA.get()) { + if (!player.isCreative()) stack.shrink(1); + player.getInventory().add(new ItemStack(TFBlocks.CICADA_JAR.get())); + if (level.isClientSide()) + Minecraft.getInstance().getSoundManager().stop(TFSounds.CICADA.get().getLocation(), SoundSource.NEUTRAL); + level.setBlockAndUpdate(pos, state.getValue(WATERLOGGED) ? Blocks.WATER.defaultBlockState() : Blocks.AIR.defaultBlockState()); + return InteractionResult.sidedSuccess(level.isClientSide()); + } + } + return InteractionResult.PASS; + } + + @Override + public void entityInside(BlockState state, Level level, BlockPos pos, Entity entity) { + if ((entity instanceof Projectile && !entity.getType().is(EntityTagGenerator.DONT_KILL_BUGS)) || entity instanceof FallingBlockEntity) { + level.setBlockAndUpdate(pos, state.getValue(WATERLOGGED) ? Blocks.WATER.defaultBlockState() : Blocks.AIR.defaultBlockState()); + if (level.isClientSide()) + Minecraft.getInstance().getSoundManager().stop(TFSounds.CICADA.get().getLocation(), SoundSource.NEUTRAL); + + level.playSound(null, pos, TFSounds.BUG_SQUISH.get(), SoundSource.BLOCKS, 1.0F, 1.0F); + + if (level instanceof ServerLevel serverLevel && this.getSquishLootTable() != null) { + LootContext ctx = new LootContext.Builder(serverLevel).withParameter(LootContextParams.BLOCK_STATE, state).withParameter(LootContextParams.ORIGIN, Vec3.atCenterOf(pos)).withParameter(LootContextParams.TOOL, ItemStack.EMPTY).create(LootContextParamSets.BLOCK); + serverLevel.getServer().getLootTables().get(this.getSquishLootTable()).getRandomItems(ctx).forEach((stack) -> popResource(serverLevel, pos, stack)); + } + + for (int i = 0; i < 50; i++) { + boolean wallBug = state.getValue(FACING) != Direction.UP; + level.addParticle(new BlockParticleOption(ParticleTypes.BLOCK, Blocks.SLIME_BLOCK.defaultBlockState()), true, + pos.getX() + Mth.nextFloat(level.getRandom(), 0.25F, 0.75F), + pos.getY() + (wallBug ? 0.5F : 0.0F), + pos.getZ() + Mth.nextFloat(level.getRandom(), 0.25F, 0.75F), + 0.0D, 0.0D, 0.0D); + } + if (entity instanceof Projectile projectile && projectile.getOwner() instanceof ServerPlayer player) { + player.awardStat(TFStats.BUGS_SQUISHED.get()); + TFAdvancements.KILL_BUG.trigger(player, state); + } + } + } + + public abstract @Nullable ResourceLocation getSquishLootTable(); // Oh, no! + + @Nullable + @Override + public abstract BlockEntity newBlockEntity(BlockPos pos, BlockState state); + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + super.createBlockStateDefinition(builder); + builder.add(FACING, WATERLOGGED); + } +} diff --git a/src/main/java/twilightforest/block/DarkLeavesBlock.java b/src/main/java/twilightforest/block/DarkLeavesBlock.java new file mode 100644 index 0000000000..e20598e583 --- /dev/null +++ b/src/main/java/twilightforest/block/DarkLeavesBlock.java @@ -0,0 +1,36 @@ +package twilightforest.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.block.LeavesBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; + +public class DarkLeavesBlock extends LeavesBlock { + + public DarkLeavesBlock(Properties properties) { + super(properties); + } + + @Override + public int getFlammability(BlockState state, BlockGetter getter, BlockPos pos, Direction face) { + return 1; + } + + @Override + public int getFireSpreadSpeed(BlockState state, BlockGetter getter, BlockPos pos, Direction face) { + return 0; + } + + @Override + public VoxelShape getBlockSupportShape(BlockState state, BlockGetter getter, BlockPos pos) { + return Shapes.block(); + } + + @Override + public int getLightBlock(BlockState state, BlockGetter getter, BlockPos pos) { + return 15; + } +} diff --git a/src/main/java/twilightforest/block/DiagonalBlock.java b/src/main/java/twilightforest/block/DiagonalBlock.java new file mode 100644 index 0000000000..d3a61c9309 --- /dev/null +++ b/src/main/java/twilightforest/block/DiagonalBlock.java @@ -0,0 +1,47 @@ +package twilightforest.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Mirror; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BooleanProperty; + +import org.jetbrains.annotations.Nullable; + +public class DiagonalBlock extends Block { + + public static final BooleanProperty IS_ROTATED = BooleanProperty.create("is_rotated"); + + public DiagonalBlock(Properties props) { + super(props); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + super.createBlockStateDefinition(builder); + builder.add(IS_ROTATED); + } + + @Override + public BlockState rotate(BlockState state, LevelAccessor accessor, BlockPos pos, Rotation rot) { + return rot == Rotation.NONE || rot == Rotation.CLOCKWISE_180 ? state : state.setValue(IS_ROTATED, !state.getValue(IS_ROTATED)); + } + + @Override + @Deprecated + public BlockState mirror(BlockState state, Mirror mirror) { + return mirror == Mirror.NONE ? state : state.setValue(IS_ROTATED, !state.getValue(IS_ROTATED)); + } + + @Nullable + @Override + public BlockState getStateForPlacement(BlockPlaceContext context) { + boolean rot = context.getHorizontalDirection().getOpposite() == Direction.WEST; + return this.defaultBlockState().setValue(IS_ROTATED, rot); + } +} diff --git a/src/main/java/twilightforest/block/DirectionalRotatedPillarBlock.java b/src/main/java/twilightforest/block/DirectionalRotatedPillarBlock.java new file mode 100644 index 0000000000..772537cc92 --- /dev/null +++ b/src/main/java/twilightforest/block/DirectionalRotatedPillarBlock.java @@ -0,0 +1,45 @@ +package twilightforest.block; + +import net.minecraft.core.Direction; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Mirror; +import net.minecraft.world.level.block.RotatedPillarBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BooleanProperty; + +public abstract class DirectionalRotatedPillarBlock extends RotatedPillarBlock { + + public static final BooleanProperty REVERSED = BooleanProperty.create("reversed"); + + public DirectionalRotatedPillarBlock(Properties properties) { + super(properties); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + super.createBlockStateDefinition(builder); + builder.add(REVERSED); + } + + @Override + public BlockState getStateForPlacement(BlockPlaceContext context) { + return super.getStateForPlacement(context).setValue(REVERSED, context.getClickedFace().getAxisDirection() == Direction.AxisDirection.NEGATIVE); + } + + @Override + @Deprecated + public BlockState mirror(BlockState state, Mirror mirror) { + if (mirror != Mirror.NONE) { + Direction.Axis axis = state.getValue(AXIS); + if (axis == Direction.Axis.Y + || mirror == Mirror.LEFT_RIGHT && axis == Direction.Axis.Z + || mirror == Mirror.FRONT_BACK && axis == Direction.Axis.X) { + + return state.cycle(REVERSED); + } + } + return super.mirror(state, mirror); + } +} diff --git a/src/main/java/twilightforest/block/EncasedFireJetBlock.java b/src/main/java/twilightforest/block/EncasedFireJetBlock.java new file mode 100644 index 0000000000..6b67ff2b24 --- /dev/null +++ b/src/main/java/twilightforest/block/EncasedFireJetBlock.java @@ -0,0 +1,33 @@ +package twilightforest.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.EnumProperty; +import twilightforest.init.TFSounds; +import twilightforest.enums.FireJetVariant; + +public class EncasedFireJetBlock extends FireJetBlock { + + public static final EnumProperty STATE = EnumProperty.create("state", FireJetVariant.class); + + public EncasedFireJetBlock(Properties properties) { + super(properties); + } + + @Override + public void neighborChanged(BlockState state, Level level, BlockPos pos, Block block, BlockPos fromPos, boolean isMoving) { + FireJetVariant variant = state.getValue(STATE); + boolean powered = level.hasNeighborSignal(pos); + + if (variant == FireJetVariant.IDLE && powered) { + level.setBlockAndUpdate(pos, state.setValue(STATE, FireJetVariant.POPPING)); + level.playSound(null, pos, TFSounds.JET_START.get(), SoundSource.BLOCKS, 0.3F, 0.6F); + + } else if (variant == FireJetVariant.TIMEOUT && !powered) { + level.setBlockAndUpdate(pos, state.setValue(STATE, FireJetVariant.IDLE)); + } + } +} diff --git a/src/main/java/twilightforest/block/EncasedSmokerBlock.java b/src/main/java/twilightforest/block/EncasedSmokerBlock.java new file mode 100644 index 0000000000..4a41cb41b6 --- /dev/null +++ b/src/main/java/twilightforest/block/EncasedSmokerBlock.java @@ -0,0 +1,44 @@ +package twilightforest.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import twilightforest.init.TFSounds; + +public class EncasedSmokerBlock extends TFSmokerBlock { + + public static final BooleanProperty ACTIVE = BooleanProperty.create("active"); + + public EncasedSmokerBlock(Properties properties) { + super(properties); + this.registerDefaultState(this.getStateDefinition().any().setValue(ACTIVE, false)); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + super.createBlockStateDefinition(builder); + builder.add(ACTIVE); + } + + @Override + @Deprecated + public void neighborChanged(BlockState state, Level level, BlockPos pos, Block block, BlockPos fromPos, boolean isMoving) { + if (level.isClientSide()) return; + + boolean powered = level.hasNeighborSignal(pos); + + if (!state.getValue(ACTIVE) && powered) { + level.setBlock(pos, state.setValue(ACTIVE, true), 3); + level.playSound(null, pos, TFSounds.SMOKER_START.get(), SoundSource.BLOCKS, 0.3F, 0.6F); + } + + if (state.getValue(ACTIVE) && !powered) { + level.setBlock(pos, state.setValue(ACTIVE, false), 3); + level.playSound(null, pos, TFSounds.SMOKER_START.get(), SoundSource.BLOCKS, 0.3F, 0.6F); + } + } +} diff --git a/src/main/java/twilightforest/block/EtchedNagastoneBlock.java b/src/main/java/twilightforest/block/EtchedNagastoneBlock.java new file mode 100644 index 0000000000..9739394aff --- /dev/null +++ b/src/main/java/twilightforest/block/EtchedNagastoneBlock.java @@ -0,0 +1,43 @@ +package twilightforest.block; + +import net.minecraft.core.Direction; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.DirectionalBlock; +import net.minecraft.world.level.block.Mirror; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; + +import org.jetbrains.annotations.Nullable; + +public class EtchedNagastoneBlock extends DirectionalBlock { + public EtchedNagastoneBlock(Properties properties) { + super(properties); + this.registerDefaultState(this.getStateDefinition().any().setValue(FACING, Direction.DOWN)); + } + + @Nullable + @Override + public BlockState getStateForPlacement(BlockPlaceContext context) { + return this.defaultBlockState().setValue(FACING, context.getPlayer() != null && context.getPlayer().isShiftKeyDown() + ? context.getNearestLookingDirection().getOpposite() + : context.getNearestLookingDirection()); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + super.createBlockStateDefinition(builder); + builder.add(FACING); + } + + @Override + public BlockState rotate(BlockState state, Rotation rotation) { + return state.setValue(FACING, rotation.rotate(state.getValue(FACING))); + } + + @Override + public BlockState mirror(BlockState state, Mirror mirror) { + return state.setValue(FACING, mirror.mirror(state.getValue(FACING))); + } +} diff --git a/src/main/java/twilightforest/block/Experiment115Block.java b/src/main/java/twilightforest/block/Experiment115Block.java new file mode 100644 index 0000000000..11e60bf897 --- /dev/null +++ b/src/main/java/twilightforest/block/Experiment115Block.java @@ -0,0 +1,167 @@ +package twilightforest.block; + +import net.minecraft.advancements.CriteriaTriggers; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.stats.Stats; +import net.minecraft.util.RandomSource; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.block.state.properties.IntegerProperty; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.material.MaterialColor; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.shapes.BooleanOp; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; +import net.minecraftforge.items.ItemHandlerHelper; +import twilightforest.init.TFItems; +import twilightforest.init.TFStats; + +public class Experiment115Block extends Block { + + public static final IntegerProperty BITES_TAKEN = IntegerProperty.create("omnomnom", 0, 7); + public static final BooleanProperty REGENERATE = BooleanProperty.create("regenerate"); + + private static final VoxelShape QUARTER_SHAPE = box(1, 0, 1, 8, 8, 8); + private static final VoxelShape HALF_SHAPE = box(1, 0, 1, 8, 8, 15); + private static final VoxelShape THREE_QUARTER_SHAPE = Shapes.join(HALF_SHAPE, box(8, 0, 8, 15, 8, 15), BooleanOp.OR); + private static final VoxelShape FULL_SHAPE = box(1, 0, 1, 15, 8, 15); + + public Experiment115Block() { + super(Properties.of(Material.CAKE, MaterialColor.METAL).strength(0.5F).sound(SoundType.WOOL).randomTicks()); + this.registerDefaultState(this.getStateDefinition().any().setValue(BITES_TAKEN, 7).setValue(REGENERATE, false)); + } + + @Override + public VoxelShape getShape(BlockState state, BlockGetter getter, BlockPos pos, CollisionContext context) { + return switch (state.getValue(BITES_TAKEN)) { + default -> FULL_SHAPE; + case 2, 3 -> THREE_QUARTER_SHAPE; + case 4, 5 -> HALF_SHAPE; + case 6, 7 -> QUARTER_SHAPE; + }; + } + + @Override + public InteractionResult use(BlockState state, Level level, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { + int bitesTaken = state.getValue(BITES_TAKEN); + ItemStack stack = player.getItemInHand(hand); + + if (!player.isShiftKeyDown()) { + if (bitesTaken > 0 && stack.getItem() == TFItems.EXPERIMENT_115.get()) { + level.setBlockAndUpdate(pos, state.setValue(BITES_TAKEN, bitesTaken - 1)); + level.playSound(null, pos, state.getSoundType().getPlaceSound(), SoundSource.BLOCKS, 1.0F, 1.0F); + if (!player.isCreative()) stack.shrink(1); + if (player instanceof ServerPlayer) + CriteriaTriggers.PLACED_BLOCK.trigger((ServerPlayer) player, pos, stack); + return InteractionResult.sidedSuccess(level.isClientSide()); + } else if (((!state.getValue(REGENERATE)) && stack.getItem() == Items.REDSTONE)) { + level.setBlockAndUpdate(pos, state.setValue(REGENERATE, true)); + level.playSound(null, pos, state.getSoundType().getPlaceSound(), SoundSource.BLOCKS, 1.0F, 1.0F); + if (!player.isCreative()) stack.shrink(1); + if (player instanceof ServerPlayer) { + player.awardStat(Stats.ITEM_USED.get(Items.REDSTONE)); + } + return InteractionResult.sidedSuccess(level.isClientSide()); + } + } else { + if (!state.getValue(REGENERATE) && player.getUseItem().isEmpty()) { + if (bitesTaken < 7) { + level.setBlockAndUpdate(pos, state.setValue(BITES_TAKEN, bitesTaken + 1)); + } else { + level.removeBlock(pos, false); + } + player.playSound(SoundEvents.ITEM_PICKUP, 0.5F, 1.0F); + if (!player.isCreative()) + ItemHandlerHelper.giveItemToPlayer(player, new ItemStack(TFItems.EXPERIMENT_115.get())); + return InteractionResult.sidedSuccess(level.isClientSide()); + } + } + return this.eatCake(level, pos, state, player); + } + + private InteractionResult eatCake(Level level, BlockPos pos, BlockState state, Player player) { + if (!player.canEat(false)) return InteractionResult.PASS; + else { + player.awardStat(TFStats.E115_SLICES_EATEN.get()); + player.getFoodData().eat(4, 0.3F); + level.playSound(null, pos, SoundEvents.GENERIC_EAT, SoundSource.PLAYERS, 0.5F, level.random.nextFloat() * 0.1F + 0.9F); + int i = state.getValue(BITES_TAKEN); + + if (i < 7) { + level.setBlock(pos, state.setValue(BITES_TAKEN, i + 1), 3); + } else { + level.removeBlock(pos, false); + } + + if (player instanceof ServerPlayer) { + CriteriaTriggers.CONSUME_ITEM.trigger((ServerPlayer) player, new ItemStack(TFItems.EXPERIMENT_115.get(), 8 - i)); + player.awardStat(Stats.ITEM_USED.get(TFItems.EXPERIMENT_115.get())); + } + + return InteractionResult.sidedSuccess(level.isClientSide()); + } + } + + @Override + public void randomTick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) { + if (state.getValue(REGENERATE) && state.getValue(BITES_TAKEN) != 0) { + level.setBlockAndUpdate(pos, state.setValue(BITES_TAKEN, state.getValue(BITES_TAKEN) - 1)); + } + } + + @Override + public boolean canSurvive(BlockState state, LevelReader reader, BlockPos pos) { + return reader.getBlockState(pos.below()).getMaterial().isSolid(); + } + + @Override + public BlockState updateShape(BlockState state, Direction facing, BlockState facingState, LevelAccessor level, BlockPos currentPos, BlockPos facingPos) { + return facing == Direction.DOWN && !state.canSurvive(level, currentPos) ? Blocks.AIR.defaultBlockState() : super.updateShape(state, facing, facingState, level, currentPos, facingPos); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + super.createBlockStateDefinition(builder); + builder.add(BITES_TAKEN, REGENERATE); + } + + @Override + public int getAnalogOutputSignal(BlockState state, Level level, BlockPos pos) { + return (8 - state.getValue(BITES_TAKEN)) + (state.getValue(REGENERATE) ? 7 : 0); + } + + @Override + public boolean hasAnalogOutputSignal(BlockState state) { + return true; + } + + @Override + public boolean isSignalSource(BlockState state) { + return state.getValue(REGENERATE); + } + + @Override + public int getSignal(BlockState state, BlockGetter blockAccess, BlockPos pos, Direction side) { + return state.getValue(REGENERATE) ? 15 - (state.getValue(BITES_TAKEN) * 2) : 0; + } +} diff --git a/src/main/java/twilightforest/block/FallenLeavesBlock.java b/src/main/java/twilightforest/block/FallenLeavesBlock.java new file mode 100644 index 0000000000..25c4e5055d --- /dev/null +++ b/src/main/java/twilightforest/block/FallenLeavesBlock.java @@ -0,0 +1,159 @@ +package twilightforest.block; + +import net.minecraft.client.Minecraft; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.Mth; +import net.minecraft.util.RandomSource; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.IntegerProperty; +import net.minecraft.world.level.material.Fluids; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.pathfinder.PathComputationType; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.network.PacketDistributor; +import twilightforest.client.particle.data.LeafParticleData; +import twilightforest.network.SpawnFallenLeafFromPacket; +import twilightforest.network.TFPacketHandler; + +import javax.annotation.Nullable; + +public class FallenLeavesBlock extends TFPlantBlock { + + public static final int MAX_HEIGHT = 8; + public static final IntegerProperty LAYERS = BlockStateProperties.LAYERS; + protected static final VoxelShape[] SHAPE_BY_LAYER = new VoxelShape[]{Block.box(0.0D, 0.0D, 0.0D, 16.0D, 0.2D, 16.0D), Block.box(0.0D, 0.0D, 0.0D, 16.0D, 2.0D, 16.0D), Block.box(0.0D, 0.0D, 0.0D, 16.0D, 4.0D, 16.0D), Block.box(0.0D, 0.0D, 0.0D, 16.0D, 6.0D, 16.0D), Block.box(0.0D, 0.0D, 0.0D, 16.0D, 8.0D, 16.0D), Block.box(0.0D, 0.0D, 0.0D, 16.0D, 10.0D, 16.0D), Block.box(0.0D, 0.0D, 0.0D, 16.0D, 12.0D, 16.0D), Block.box(0.0D, 0.0D, 0.0D, 16.0D, 14.0D, 16.0D), Block.box(0.0D, 0.0D, 0.0D, 16.0D, 16.0D, 16.0D)}; + public static final int HEIGHT_IMPASSABLE = 5; + + public FallenLeavesBlock(Properties properties) { + super(properties); + this.registerDefaultState(this.stateDefinition.any().setValue(LAYERS, 1)); + } + + @Override + public boolean canSurvive(BlockState state, LevelReader reader, BlockPos pos) { + return reader.getBlockState(pos.below()).isFaceSturdy(reader, pos, Direction.UP) || reader.getFluidState(pos.below()).getType() == Fluids.WATER; + } + + @Override + public boolean useShapeForLightOcclusion(BlockState pState) { + return true; + } + + @Override + public VoxelShape getShape(BlockState pState, BlockGetter pLevel, BlockPos pPos, CollisionContext pContext) { + return SHAPE_BY_LAYER[pState.getValue(LAYERS) - 1]; + } + + @Override + public VoxelShape getCollisionShape(BlockState pState, BlockGetter pLevel, BlockPos pPos, CollisionContext pContext) { + return SHAPE_BY_LAYER[0]; + } + + @Override + public VoxelShape getBlockSupportShape(BlockState pState, BlockGetter pReader, BlockPos pPos) { + return SHAPE_BY_LAYER[pState.getValue(LAYERS) - 1]; + } + + @Override + public VoxelShape getVisualShape(BlockState pState, BlockGetter pReader, BlockPos pPos, CollisionContext pContext) { + return SHAPE_BY_LAYER[pState.getValue(LAYERS) - 1]; + } + + @Override + protected boolean mayPlaceOn(BlockState state, BlockGetter getter, BlockPos pos) { + return super.mayPlaceOn(state, getter, pos) || ((getter.getFluidState(pos).getType() == Fluids.WATER || state.getMaterial() == Material.ICE) && getter.getFluidState(pos.above()).getType() == Fluids.EMPTY); + } + + @Override + public boolean canBeReplaced(BlockState pState, BlockPlaceContext pUseContext) { + int i = pState.getValue(LAYERS); + if (pUseContext.getItemInHand().is(this.asItem()) && i < MAX_HEIGHT) { + if (pUseContext.replacingClickedOnBlock()) { + return pUseContext.getClickedFace() == Direction.UP; + } else { + return true; + } + } else { + return i == 1; + } + } + + @Nullable + public BlockState getStateForPlacement(BlockPlaceContext pContext) { + BlockState blockstate = pContext.getLevel().getBlockState(pContext.getClickedPos()); + if (blockstate.is(this)) { + int i = blockstate.getValue(LAYERS); + return blockstate.setValue(LAYERS, Math.min(MAX_HEIGHT, i + 1)); + } else { + return super.getStateForPlacement(pContext); + } + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder pBuilder) { + pBuilder.add(LAYERS); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void animateTick(BlockState state, Level level, BlockPos pos, RandomSource random) { + super.animateTick(state, level, pos, random); + if (random.nextInt(50) == 0) { + float dist = 10F; + if (!level.canSeeSkyFromBelowWater(pos)) { + for (int y = 0; y <= dist; y++) + if (level.getBlockState(pos.above(y)).getMaterial() == Material.LEAVES) { + dist = y; + break; + } + if (dist > 10F) + return; + } + + int color = Minecraft.getInstance().getBlockColors().getColor(Blocks.OAK_LEAVES.defaultBlockState(), level, pos, 0); + int r = Mth.clamp(((color >> 16) & 0xFF) + random.nextInt(0x22) - 0x11, 0x00, 0xFF); + int g = Mth.clamp(((color >> 8) & 0xFF) + random.nextInt(0x22) - 0x11, 0x00, 0xFF); + int b = Mth.clamp((color & 0xFF) + random.nextInt(0x22) - 0x11, 0x00, 0xFF); + level.addParticle(new LeafParticleData(r, g, b), pos.getX() + random.nextFloat(), pos.getY() + dist - 0.25F, pos.getZ() + random.nextFloat(), 0.0D, 0.0D, 0.0D); + } + } + + @Override + public void entityInside(BlockState state, Level level, BlockPos pos, Entity entity) { + super.entityInside(state, level, pos, entity); + if (entity instanceof LivingEntity && (entity.getDeltaMovement().x() != 0 || entity.getDeltaMovement().z() != 0) && level.getRandom().nextBoolean()) { + if(level.isClientSide()) { + int color = Minecraft.getInstance().getBlockColors().getColor(Blocks.OAK_LEAVES.defaultBlockState(), level, pos, 0); + int r = Mth.clamp(((color >> 16) & 0xFF) + level.getRandom().nextInt(0x22) - 0x11, 0x00, 0xFF); + int g = Mth.clamp(((color >> 8) & 0xFF) + level.getRandom().nextInt(0x22) - 0x11, 0x00, 0xFF); + int b = Mth.clamp((color & 0xFF) + level.getRandom().nextInt(0x22) - 0x11, 0x00, 0xFF); + level.addParticle(new LeafParticleData(r, g, b), + pos.getX() + level.getRandom().nextFloat(), + pos.getY() + ((2F / 16F) * (state.getValue(LAYERS) - 1)), + pos.getZ() + level.getRandom().nextFloat(), + + (level.getRandom().nextFloat() * -0.5F) * entity.getDeltaMovement().x(), + level.getRandom().nextFloat() * 0.5F + 0.25F, + (level.getRandom().nextFloat() * -0.5F) * entity.getDeltaMovement().z() + ); + } else if (level instanceof ServerLevel) + TFPacketHandler.CHANNEL.send(PacketDistributor.TRACKING_ENTITY.with(() -> entity), new SpawnFallenLeafFromPacket(pos, entity.getDeltaMovement())); + } + } +} diff --git a/src/main/java/twilightforest/block/FiddleheadBlock.java b/src/main/java/twilightforest/block/FiddleheadBlock.java new file mode 100644 index 0000000000..245d44e500 --- /dev/null +++ b/src/main/java/twilightforest/block/FiddleheadBlock.java @@ -0,0 +1,22 @@ +package twilightforest.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; + +public class FiddleheadBlock extends TFPlantBlock { + + private static final VoxelShape FIDDLEHEAD_SHAPE = Block.box(3, 0, 3, 13, 14, 13); + + public FiddleheadBlock(Properties properties) { + super(properties); + } + + @Override + public VoxelShape getShape(BlockState state, BlockGetter getter, BlockPos pos, CollisionContext context) { + return FIDDLEHEAD_SHAPE; + } +} diff --git a/src/main/java/twilightforest/block/FieryBlock.java b/src/main/java/twilightforest/block/FieryBlock.java new file mode 100644 index 0000000000..d67275219b --- /dev/null +++ b/src/main/java/twilightforest/block/FieryBlock.java @@ -0,0 +1,56 @@ +package twilightforest.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; +import net.minecraftforge.fml.ModList; +import twilightforest.init.TFItems; +import twilightforest.init.TFDamageTypes; + +public class FieryBlock extends Block { + public FieryBlock(Properties properties) { + super(properties); + } + + @Override + public float getShadeBrightness(BlockState state, BlockGetter getter, BlockPos pos) { + return 1.0F; + } + + @Override + public boolean skipRendering(BlockState state, BlockState otherState, Direction direction) { + return ModList.get().isLoaded("ctm") && otherState.getBlock() instanceof FieryBlock; + } + + @Override + public VoxelShape getOcclusionShape(BlockState state, BlockGetter getter, BlockPos pos) { + return Shapes.empty(); + } + + @Override + public void stepOn(Level level, BlockPos pos, BlockState state, Entity entity) { + if ((!entity.fireImmune()) + && entity instanceof LivingEntity living + && (!EnchantmentHelper.hasFrostWalker(living)) + && !living.getItemBySlot(EquipmentSlot.FEET).is(TFItems.FIERY_BOOTS.get())) { + entity.hurt(TFDamageTypes.getDamageSource(level, TFDamageTypes.FIERY), 1.0F); + } + + super.stepOn(level, pos, state, entity); + } + + @Override + public boolean isFireSource(BlockState state, LevelReader level, BlockPos pos, Direction direction) { + return true; + } +} diff --git a/src/main/java/twilightforest/block/FireJetBlock.java b/src/main/java/twilightforest/block/FireJetBlock.java new file mode 100644 index 0000000000..3a23f4cf20 --- /dev/null +++ b/src/main/java/twilightforest/block/FireJetBlock.java @@ -0,0 +1,101 @@ +package twilightforest.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.RandomSource; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.BaseEntityBlock; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.RenderShape; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityTicker; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.EnumProperty; +import net.minecraft.world.level.pathfinder.BlockPathTypes; +import twilightforest.block.entity.FireJetBlockEntity; +import twilightforest.data.tags.BlockTagGenerator; +import twilightforest.data.tags.FluidTagGenerator; +import twilightforest.enums.FireJetVariant; +import twilightforest.init.TFBlockEntities; + +import org.jetbrains.annotations.Nullable; + +public class FireJetBlock extends BaseEntityBlock { + + public static final EnumProperty STATE = EnumProperty.create("state", FireJetVariant.class); + + public FireJetBlock(Properties properties) { + super(properties); + this.registerDefaultState(this.getStateDefinition().any().setValue(STATE, FireJetVariant.IDLE)); + } + + @Override + public RenderShape getRenderShape(BlockState state) { + return RenderShape.MODEL; + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + super.createBlockStateDefinition(builder); + builder.add(STATE); + } + + @Nullable + @Override + public BlockPathTypes getBlockPathType(BlockState state, BlockGetter getter, BlockPos pos, @Nullable Mob entity) { + return state.getValue(STATE) == FireJetVariant.IDLE ? null : BlockPathTypes.DAMAGE_FIRE; + } + + @Override + @Deprecated + public void randomTick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) { + if (!level.isClientSide() && state.getValue(STATE) == FireJetVariant.IDLE) { + BlockPos lavaPos = findLavaAround(level, pos.below()); + + if (this.isLava(level, lavaPos)) { + level.setBlockAndUpdate(lavaPos, Blocks.AIR.defaultBlockState()); + level.setBlockAndUpdate(pos, state.setValue(STATE, FireJetVariant.POPPING)); + } + } + } + + /** + * Find a full block of lava near the designated block. This is intentionally not really that reliable. + */ + private BlockPos findLavaAround(Level level, BlockPos pos) { + if (this.isLava(level, pos)) { + return pos; + } + + for (int i = 0; i < 3; i++) { + BlockPos randPos = pos.offset(level.getRandom().nextInt(3) - 1, 0, level.getRandom().nextInt(3) - 1); + if (this.isLava(level, randPos)) { + return randPos; + } + } + + return pos; + } + + private boolean isLava(Level level, BlockPos pos) { + BlockState state = level.getBlockState(pos); + return state.is(BlockTagGenerator.FIRE_JET_FUEL) || state.getBlock().getFluidState(state).is(FluidTagGenerator.FIRE_JET_FUEL); + } + + @Nullable + @Override + public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { + return new FireJetBlockEntity(pos, state); + } + + @Nullable + @Override + public BlockEntityTicker getTicker(Level level, BlockState state, BlockEntityType type) { + return createTickerHelper(type, TFBlockEntities.FLAME_JET.get(), FireJetBlockEntity::tick); + } +} diff --git a/src/main/java/twilightforest/block/FireflyBlock.java b/src/main/java/twilightforest/block/FireflyBlock.java new file mode 100644 index 0000000000..61d666ffd1 --- /dev/null +++ b/src/main/java/twilightforest/block/FireflyBlock.java @@ -0,0 +1,39 @@ +package twilightforest.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityTicker; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; +import twilightforest.block.entity.FireflyBlockEntity; +import twilightforest.init.TFBlockEntities; + +import org.jetbrains.annotations.Nullable; +import twilightforest.loot.TFLootTables; + +public class FireflyBlock extends CritterBlock { + + public FireflyBlock(BlockBehaviour.Properties properties) { + super(properties); + } + + @Nullable + @Override + public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { + return new FireflyBlockEntity(pos, state); + } + + @Nullable + @Override + public BlockEntityTicker getTicker(Level level, BlockState state, BlockEntityType type) { + return createTickerHelper(type, TFBlockEntities.FIREFLY.get(), FireflyBlockEntity::tick); + } + + @Override + public @Nullable ResourceLocation getSquishLootTable() { + return TFLootTables.FIREFLY_SQUISH_DROPS; + } +} diff --git a/src/main/java/twilightforest/block/FireflySpawnerBlock.java b/src/main/java/twilightforest/block/FireflySpawnerBlock.java new file mode 100644 index 0000000000..f77a835113 --- /dev/null +++ b/src/main/java/twilightforest/block/FireflySpawnerBlock.java @@ -0,0 +1,112 @@ +package twilightforest.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.particles.ParticleType; +import net.minecraft.network.chat.Component; +import net.minecraft.util.RandomSource; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.SimpleWaterloggedBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.level.material.Fluids; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFParticleType; + +public class FireflySpawnerBlock extends AbstractParticleSpawnerBlock implements SimpleWaterloggedBlock { + + private static final VoxelShape SHAPE = Block.box(3.0D, 0.0D, 3.0D, 13.0D, 14.0D, 13.0D); + private static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED; + + public FireflySpawnerBlock(Properties properties) { + super(properties); + this.registerDefaultState(this.getStateDefinition().any().setValue(WATERLOGGED, false)); + } + + @Override + public VoxelShape getShape(BlockState state, BlockGetter getter, BlockPos pos, CollisionContext ctx) { + return SHAPE; + } + + @Override + public void animateTick(BlockState state, Level level, BlockPos pos, RandomSource rand) { + super.animateTick(state, level, pos, rand); + + if (rand.nextInt(5) == 0) { + double dx = pos.getX() + ((rand.nextFloat() - rand.nextFloat()) * 0.2F + 0.5F); + double dy = pos.getY() + 0.4F + ((rand.nextFloat() - rand.nextFloat()) * 0.3F); + double dz = pos.getZ() + ((rand.nextFloat() - rand.nextFloat()) * 0.2F + 0.5F); + level.addParticle(TFParticleType.FIREFLY.get(), dx, dy, dz, 0, 0, 0); + } + } + + @Override + public InteractionResult use(BlockState state, Level level, BlockPos pos, Player player, InteractionHand hand, BlockHitResult result) { + ItemStack stack = player.getItemInHand(hand); + if (stack.getItem() == TFBlocks.FIREFLY.get().asItem() && !player.isShiftKeyDown() && state.getValue(RADIUS) < 10) { + level.setBlockAndUpdate(pos, state.setValue(RADIUS, state.getValue(RADIUS) + 1)); + if (!player.isCreative()) stack.shrink(1); + player.displayClientMessage(Component.translatable("misc.twilightforest.firefly_spawner_radius", state.getValue(RADIUS) + 1), true); + return InteractionResult.sidedSuccess(level.isClientSide()); + } else if (player.isShiftKeyDown() && state.getValue(RADIUS) > 1) { + level.setBlockAndUpdate(pos, state.setValue(RADIUS, state.getValue(RADIUS) - 1)); + ItemEntity bug = new ItemEntity(level, pos.getX() + 0.5D, pos.getY() + 1, pos.getZ() + 0.5D, new ItemStack(TFBlocks.FIREFLY.get())); + level.addFreshEntity(bug); + player.displayClientMessage(Component.translatable("misc.twilightforest.firefly_spawner_radius", state.getValue(RADIUS) - 1), true); + return InteractionResult.sidedSuccess(level.isClientSide()); + } + return super.use(state, level, pos, player, hand, result); + } + + @Override + public ParticleType getParticlesToSpawn() { + return TFParticleType.JAR_WANDERING_FIREFLY.get(); + } + + @Override + public int getParticleCountPerSpawn(BlockState state) { + return (int) Math.ceil((double) state.getValue(RADIUS) / 2); + } + + @Override + public FluidState getFluidState(BlockState state) { + return state.getValue(WATERLOGGED) ? Fluids.WATER.getSource(false) : super.getFluidState(state); + } + + @Override + public BlockState getStateForPlacement(BlockPlaceContext context) { + FluidState fluidstate = context.getLevel().getFluidState(context.getClickedPos()); + boolean flag = fluidstate.is(Fluids.WATER); + return super.getStateForPlacement(context).setValue(WATERLOGGED, flag); + } + + @Override + public BlockState updateShape(BlockState state, Direction facing, BlockState facingState, LevelAccessor accessor, BlockPos currentPos, BlockPos facingPos) { + if (state.getValue(WATERLOGGED)) { + accessor.scheduleTick(currentPos, Fluids.WATER, Fluids.WATER.getTickDelay(accessor)); + } + + return super.updateShape(state, facing, facingState, accessor, currentPos, facingPos); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + super.createBlockStateDefinition(builder); + builder.add(WATERLOGGED); + } +} diff --git a/src/main/java/twilightforest/block/FlammableBlock.java b/src/main/java/twilightforest/block/FlammableBlock.java new file mode 100644 index 0000000000..f805813fa6 --- /dev/null +++ b/src/main/java/twilightforest/block/FlammableBlock.java @@ -0,0 +1,29 @@ +package twilightforest.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; + +public class FlammableBlock extends Block { + private final int flammability; + private final int spreadSpeed; + + public FlammableBlock(int flammability, int spreadSpeed, BlockBehaviour.Properties properties) { + super(properties); + this.flammability = flammability; + this.spreadSpeed = spreadSpeed; + } + + @Override + public int getFlammability(BlockState state, BlockGetter getter, BlockPos pos, Direction face) { + return flammability; + } + + @Override + public int getFireSpreadSpeed(BlockState state, BlockGetter getter, BlockPos pos, Direction face) { + return spreadSpeed; + } +} diff --git a/src/main/java/twilightforest/block/ForceFieldBlock.java b/src/main/java/twilightforest/block/ForceFieldBlock.java new file mode 100644 index 0000000000..c4522d876e --- /dev/null +++ b/src/main/java/twilightforest/block/ForceFieldBlock.java @@ -0,0 +1,216 @@ +package twilightforest.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.tags.BlockTags; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.IronBarsBlock; +import net.minecraft.world.level.block.PipeBlock; +import net.minecraft.world.level.block.SimpleWaterloggedBlock; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.block.state.properties.EnumProperty; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.level.material.Fluids; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +import org.jetbrains.annotations.Nullable; + +public class ForceFieldBlock extends Block implements SimpleWaterloggedBlock { + private static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED; + public static final EnumProperty AXIS = BlockStateProperties.AXIS; + public static final BooleanProperty DOWN = PipeBlock.DOWN; + public static final BooleanProperty UP = PipeBlock.UP; + public static final BooleanProperty NORTH = PipeBlock.NORTH; + public static final BooleanProperty SOUTH = PipeBlock.SOUTH; + public static final BooleanProperty WEST = PipeBlock.WEST; + public static final BooleanProperty EAST = PipeBlock.EAST; + + protected static final VoxelShape BASE_SHAPE = Block.box(7.0D, 7.0D, 7.0D, 9.0D, 9.0D, 9.0D); + + protected static final VoxelShape WEST_SHAPE = Block.box(0.0D, 7.0D, 7.0D, 7.0D, 9.0D, 9.0D); + protected static final VoxelShape EAST_SHAPE = Block.box(9.0D, 7.0D, 7.0D, 16.0D, 9.0D, 9.0D); + protected static final VoxelShape DOWN_SHAPE = Block.box(7.0D, 0.0D, 7.0D, 9.0D, 7.0D, 9.0D); + protected static final VoxelShape UP_SHAPE = Block.box(7.0D, 9.0D, 7.0D, 9.0D, 16.0D, 9.0D); + protected static final VoxelShape NORTH_SHAPE = Block.box(7.0D, 7.0D, 0.0D, 9.0D, 9.0D, 7.0D); + protected static final VoxelShape SOUTH_SHAPE = Block.box(7.0D, 7.0D, 9.0D, 9.0D, 9.0D, 16.0D); + + protected static final VoxelShape DOWN_WEST_SHAPE = Block.box(0.0D, 0.0D, 7.0D, 7.0D, 7.0D, 9.0D); + protected static final VoxelShape DOWN_EAST_SHAPE = Block.box(9.0D, 0.0D, 7.0D, 16.0D, 7.0D, 9.0D); + protected static final VoxelShape DOWN_NORTH_SHAPE = Block.box(7.0D, 0.0D, 0.0D, 9.0D, 7.0D, 7.0D); + protected static final VoxelShape DOWN_SOUTH_SHAPE = Block.box(7.0D, 0.0D, 9.0D, 9.0D, 7.0D, 16.0D); + + protected static final VoxelShape UP_WEST_SHAPE = Block.box(0.0D, 9.0D, 7.0D, 7.0D, 16.0D, 9.0D); + protected static final VoxelShape UP_EAST_SHAPE = Block.box(9.0D, 9.0D, 7.0D, 16.0D, 16.0D, 9.0D); + protected static final VoxelShape UP_NORTH_SHAPE = Block.box(7.0D, 9.0D, 0.0D, 9.0D, 16.0D, 7.0D); + protected static final VoxelShape UP_SOUTH_SHAPE = Block.box(7.0D, 9.0D, 9.0D, 9.0D, 16.0D, 16.0D); + + protected static final VoxelShape NORTH_WEST_SHAPE = Block.box(0.0D, 7.0D, 0.0D, 7.0D, 9.0D, 7.0D); + protected static final VoxelShape NORTH_EAST_SHAPE = Block.box(9.0D, 7.0D, 0.0D, 16.0D, 9.0D, 7.0D); + protected static final VoxelShape SOUTH_WEST_SHAPE = Block.box(0.0D, 7.0D, 9.0D, 7.0D, 9.0D, 16.0D); + protected static final VoxelShape SOUTH_EAST_SHAPE = Block.box(9.0D, 7.0D, 9.0D, 16.0D, 9.0D, 16.0D); + + public ForceFieldBlock(BlockBehaviour.Properties properties) { + super(properties); + this.registerDefaultState(this.getStateDefinition().any().setValue(WATERLOGGED, false).setValue(AXIS, Direction.Axis.Y) + .setValue(DOWN, false).setValue(UP, false) + .setValue(NORTH, false).setValue(SOUTH, false) + .setValue(WEST, false).setValue(EAST, false)); + } + + @Override + public boolean canEntityDestroy(BlockState state, BlockGetter getter, BlockPos pos, Entity entity) { + return false; + } + + @Override + public VoxelShape getShape(BlockState state, BlockGetter getter, BlockPos pos, CollisionContext context) { + return this.getVoxelShape(state); + } + + private VoxelShape getVoxelShape(BlockState state) { + VoxelShape shape = BASE_SHAPE; + + Direction.Axis axis = state.getValue(AXIS); + + boolean down = state.getValue(DOWN); + boolean up = state.getValue(UP); + boolean north = state.getValue(NORTH); + boolean south = state.getValue(SOUTH); + boolean west = state.getValue(WEST); + boolean east = state.getValue(EAST); + + boolean x = west && east; + boolean y = down && up; + boolean z = north && south; + + if (down) { + shape = Shapes.or(shape, DOWN_SHAPE); + if (north && (!x || axis != Direction.Axis.X)) shape = Shapes.or(shape, DOWN_NORTH_SHAPE); + if (south && (!x || axis != Direction.Axis.X)) shape = Shapes.or(shape, DOWN_SOUTH_SHAPE); + if (west && (!z || axis != Direction.Axis.Z)) shape = Shapes.or(shape, DOWN_WEST_SHAPE); + if (east && (!z || axis != Direction.Axis.Z)) shape = Shapes.or(shape, DOWN_EAST_SHAPE); + } + if (up) { + shape = Shapes.or(shape, UP_SHAPE); + if (north && (!x || axis != Direction.Axis.X)) shape = Shapes.or(shape, UP_NORTH_SHAPE); + if (south && (!x || axis != Direction.Axis.X)) shape = Shapes.or(shape, UP_SOUTH_SHAPE); + if (west && (!z || axis != Direction.Axis.Z)) shape = Shapes.or(shape, UP_WEST_SHAPE); + if (east && (!z || axis != Direction.Axis.Z)) shape = Shapes.or(shape, UP_EAST_SHAPE); + } + if (north) { + shape = Shapes.or(shape, NORTH_SHAPE); + if (west && (!y || axis != Direction.Axis.Y)) shape = Shapes.or(shape, NORTH_WEST_SHAPE); + if (east && (!y || axis != Direction.Axis.Y)) shape = Shapes.or(shape, NORTH_EAST_SHAPE); + } + if (south) { + shape = Shapes.or(shape, SOUTH_SHAPE); + if (west && (!y || axis != Direction.Axis.Y)) shape = Shapes.or(shape, SOUTH_WEST_SHAPE); + if (east && (!y || axis != Direction.Axis.Y)) shape = Shapes.or(shape, SOUTH_EAST_SHAPE); + } + if (west) shape = Shapes.or(shape, WEST_SHAPE); + if (east) shape = Shapes.or(shape, EAST_SHAPE); + + return shape; + } + + @OnlyIn(Dist.CLIENT) + public boolean skipRendering(BlockState state, BlockState adjacentState, Direction direction) { + if (adjacentState.is(this)) { + BooleanProperty opposite = PipeBlock.PROPERTY_BY_DIRECTION.get(direction.getOpposite()); + if (adjacentState.getValue(opposite)) { + BooleanProperty property = PipeBlock.PROPERTY_BY_DIRECTION.get(direction); + + if (countSides(state.setValue(opposite, false).setValue(property, false)) > countSides(adjacentState.setValue(opposite, false).setValue(property, false)) + && state.getValue(AXIS) == direction.getAxis()) return false; + + + VoxelShape a = this.getVoxelShape(state).getFaceShape(direction); + VoxelShape b = this.getVoxelShape(adjacentState).getFaceShape(direction.getOpposite()); + + return a.toAabbs().stream().anyMatch(aabb -> b.toAabbs().stream().anyMatch(aabb::equals));//Am I dumb or is this the only way of doing this without checking for every possible scenario? + } + } + return false; + } + + private static int countSides(BlockState state) { + int count = 0; + for (Direction direction : Direction.values()) + if (state.getValue(PipeBlock.PROPERTY_BY_DIRECTION.get(direction))) count++; + return count; + } + + @Override + public float getShadeBrightness(BlockState state, BlockGetter getter, BlockPos pos) { + return 1.0F; + } + + @Override + public boolean propagatesSkylightDown(BlockState state, BlockGetter getter, BlockPos pos) { + return true; + } + + public boolean canConnectTo(BlockGetter getter, BlockPos pos, Direction direction) { + BlockState state = getter.getBlockState(pos.relative(direction)); + boolean solidSide = state.isFaceSturdy(getter, pos.relative(direction), direction.getOpposite()); + Block block = state.getBlock(); + + int betterConnections = 0; + if (!state.is(this)) { + for (Direction face : Direction.values()) { + if (getter.getBlockState(pos.relative(face)).is(this)) betterConnections++; + } + if (betterConnections > 3) + return false; //Might need to alter this a bit, without this the forcefields in the final castles like to attach to every block, still does a bit in the main room :/ + } + + return !isExceptionForConnection(state) && solidSide || block instanceof ForceFieldBlock || block instanceof IronBarsBlock || state.is(BlockTags.WALLS); + } + + @Override + public FluidState getFluidState(BlockState state) { + return state.getValue(WATERLOGGED) ? Fluids.WATER.getSource(false) : super.getFluidState(state); + } + + @Nullable + @Override + public BlockState getStateForPlacement(BlockPlaceContext context) { + BlockPos pos = context.getClickedPos(); + Level level = context.getLevel(); + Direction clicked = context.getClickedFace(); + + return this.defaultBlockState() + .setValue(AXIS, context.getClickedFace().getAxis()) + .setValue(DOWN, clicked != Direction.DOWN ? this.canConnectTo(level, pos, Direction.DOWN) : !context.isSecondaryUseActive()) + .setValue(UP, clicked != Direction.UP ? this.canConnectTo(level, pos, Direction.UP) : !context.isSecondaryUseActive()) + .setValue(NORTH, clicked != Direction.NORTH ? this.canConnectTo(level, pos, Direction.NORTH) : !context.isSecondaryUseActive()) + .setValue(EAST, clicked != Direction.EAST ? this.canConnectTo(level, pos, Direction.EAST) : !context.isSecondaryUseActive()) + .setValue(SOUTH, clicked != Direction.SOUTH ? this.canConnectTo(level, pos, Direction.SOUTH) : !context.isSecondaryUseActive()) + .setValue(WEST, clicked != Direction.WEST ? this.canConnectTo(level, pos, Direction.WEST) : !context.isSecondaryUseActive()); + } + + @Override + public BlockState updateShape(BlockState state, Direction direction, BlockState facingState, LevelAccessor accessor, BlockPos pos, BlockPos facingPos) { + if (state.getValue(WATERLOGGED)) accessor.scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickDelay(accessor)); + return state.setValue(PipeBlock.PROPERTY_BY_DIRECTION.get(direction), this.canConnectTo(accessor, pos, direction)); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + super.createBlockStateDefinition(builder); + builder.add(WATERLOGGED, AXIS, NORTH, EAST, SOUTH, WEST, UP, DOWN); + } +} diff --git a/src/main/java/twilightforest/block/GhastTrapBlock.java b/src/main/java/twilightforest/block/GhastTrapBlock.java new file mode 100644 index 0000000000..05abc81544 --- /dev/null +++ b/src/main/java/twilightforest/block/GhastTrapBlock.java @@ -0,0 +1,129 @@ +package twilightforest.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.particles.DustParticleOptions; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundSource; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.BaseEntityBlock; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.RenderShape; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityTicker; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.phys.AABB; +import twilightforest.advancements.TFAdvancements; +import twilightforest.block.entity.GhastTrapBlockEntity; +import twilightforest.init.TFBlockEntities; +import twilightforest.init.TFSounds; + +import org.jetbrains.annotations.Nullable; + +public class GhastTrapBlock extends BaseEntityBlock { + public static final int ACTIVATE_EVENT = 0; + public static final int DEACTIVATE_EVENT = 1; + public static final BooleanProperty ACTIVE = BooleanProperty.create("active"); + + public GhastTrapBlock(Properties properties) { + super(properties); + this.registerDefaultState(this.getStateDefinition().any().setValue(ACTIVE, false)); + } + + @Override + public RenderShape getRenderShape(BlockState state) { + return RenderShape.MODEL; + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + super.createBlockStateDefinition(builder); + builder.add(ACTIVE); + } + + @Override + public void neighborChanged(BlockState state, Level level, BlockPos pos, Block blockIn, BlockPos fromPos, boolean isMoving) { + if (level.isClientSide()) { + return; + } + + if (!state.getValue(ACTIVE) && isInactiveTrapCharged(level, pos) && level.hasNeighborSignal(pos)) { + for (ServerPlayer player : level.getEntitiesOfClass(ServerPlayer.class, new AABB(pos).inflate(6.0D))) { + TFAdvancements.ACTIVATED_GHAST_TRAP.trigger(player); + } + + level.setBlockAndUpdate(pos, state.setValue(ACTIVE, true)); + level.playSound(null, pos, TFSounds.JET_START.get(), SoundSource.BLOCKS, 0.3F, 0.6F); + level.blockEvent(pos, this, ACTIVATE_EVENT, 0); + } + } + + @Override + public boolean triggerEvent(BlockState state, Level level, BlockPos pos, int event, int payload) { + BlockEntity te = level.getBlockEntity(pos); + return te != null && te.triggerEvent(event, payload); + } + + /** + * Check if the inactive trap block is fully charged + */ + private boolean isInactiveTrapCharged(Level level, BlockPos pos) { + BlockEntity tileEntity = level.getBlockEntity(pos); + return tileEntity instanceof GhastTrapBlockEntity && ((GhastTrapBlockEntity) tileEntity).isCharged(); + } + + // [VanillaCopy] BlockRedstoneOre.spawnParticles. Unchanged. + public void sparkle(Level level, BlockPos pos) { + RandomSource random = level.getRandom(); + double d0 = 0.0625D; + + for (int i = 0; i < 6; ++i) { + double d1 = pos.getX() + random.nextFloat(); + double d2 = pos.getY() + random.nextFloat(); + double d3 = pos.getZ() + random.nextFloat(); + + if (i == 0 && !level.getBlockState(pos.above()).isSolidRender(level, pos)) { + d2 = pos.getY() + d0 + 1.0D; + } + + if (i == 1 && !level.getBlockState(pos.below()).isSolidRender(level, pos)) { + d2 = pos.getY() - d0; + } + + if (i == 2 && !level.getBlockState(pos.south()).isSolidRender(level, pos)) { + d3 = pos.getZ() + d0 + 1.0D; + } + + if (i == 3 && !level.getBlockState(pos.north()).isSolidRender(level, pos)) { + d3 = pos.getZ() - d0; + } + + if (i == 4 && !level.getBlockState(pos.east()).isSolidRender(level, pos)) { + d1 = pos.getX() + d0 + 1.0D; + } + + if (i == 5 && !level.getBlockState(pos.west()).isSolidRender(level, pos)) { + d1 = pos.getX() - d0; + } + + if (d1 < pos.getX() || d1 > pos.getX() + 1 || d2 < 0.0D || d2 > pos.getY() + 1 || d3 < pos.getZ() || d3 > pos.getZ() + 1) { + level.addParticle(DustParticleOptions.REDSTONE, d1, d2, d3, 0.0D, 0.0D, 0.0D); + } + } + } + + @Nullable + @Override + public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { + return new GhastTrapBlockEntity(pos, state); + } + + @Nullable + @Override + public BlockEntityTicker getTicker(Level level, BlockState state, BlockEntityType type) { + return createTickerHelper(type, TFBlockEntities.GHAST_TRAP.get(), GhastTrapBlockEntity::tick); + } +} diff --git a/src/main/java/twilightforest/block/GiantBlock.java b/src/main/java/twilightforest/block/GiantBlock.java new file mode 100644 index 0000000000..a20b1300a3 --- /dev/null +++ b/src/main/java/twilightforest/block/GiantBlock.java @@ -0,0 +1,85 @@ +package twilightforest.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.PushReaction; + +import org.jetbrains.annotations.Nullable; + +public class GiantBlock extends Block { + + private boolean isSelfDestructing; + + public GiantBlock(Properties properties) { + super(properties); + } + + @Nullable + @Override + public BlockState getStateForPlacement(BlockPlaceContext context) { + for (BlockPos dPos : getVolume(context.getClickedPos())) { + if (!context.getLevel().getBlockState(dPos).canBeReplaced(context)) { + return null; + } + } + return defaultBlockState(); + } + + @Override + public void setPlacedBy(Level level, BlockPos pos, BlockState state, @Nullable LivingEntity placer, ItemStack stack) { + if (!level.isClientSide()) { + for (BlockPos dPos : getVolume(pos)) { + level.setBlockAndUpdate(dPos, defaultBlockState()); + } + } + } + + @Override + @Deprecated + public void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean isMoving) { + super.onRemove(state, level, pos, newState, isMoving); + if (!this.isSelfDestructing && !isVolumeFilled(level, pos)) { + this.setGiantBlockToAir(level, pos); + } + } + + private void setGiantBlockToAir(Level level, BlockPos pos) { + // prevent mutual infinite recursion + this.isSelfDestructing = true; + + for (BlockPos iterPos : getVolume(pos)) { + if (!pos.equals(iterPos) && level.getBlockState(iterPos).getBlock() == this) { + level.destroyBlock(iterPos, false); + } + } + + this.isSelfDestructing = false; + } + + private boolean isVolumeFilled(Level level, BlockPos pos) { + for (BlockPos dPos : getVolume(pos)) { + if (level.getBlockState(dPos).getBlock() != this) { + return false; + } + } + return true; + } + + @Override + @Deprecated + public PushReaction getPistonPushReaction(BlockState state) { + return PushReaction.BLOCK; + } + + public static Iterable getVolume(BlockPos pos) { + return BlockPos.betweenClosed( + pos.getX() & ~0b11, pos.getY() & ~0b11, pos.getZ() & ~0b11, + pos.getX() | 0b11, pos.getY() | 0b11, pos.getZ() | 0b11 + ); + } +} diff --git a/src/main/java/twilightforest/block/GiantBlockIcon.java b/src/main/java/twilightforest/block/GiantBlockIcon.java deleted file mode 100644 index 8e1eda04d1..0000000000 --- a/src/main/java/twilightforest/block/GiantBlockIcon.java +++ /dev/null @@ -1,67 +0,0 @@ -package twilightforest.block; - -import net.minecraft.util.IIcon; - -public class GiantBlockIcon implements IIcon { - - private IIcon baseIcon; - private int myX; - private int myY; - - public GiantBlockIcon(IIcon blockIcon, int x, int y) { - this.baseIcon = blockIcon; - this.myX = x; - this.myY = y; - } - - @Override - public int getIconWidth() { - return this.baseIcon.getIconWidth() / 4; - } - - @Override - public int getIconHeight() { - return this.baseIcon.getIconHeight() / 4; - } - - @Override - public float getMinU() { - float f = this.baseIcon.getMaxU() - this.baseIcon.getMinU(); - return this.baseIcon.getMinU() + (f * 0.25F * myX); - } - - @Override - public float getMaxU() { - float f = this.baseIcon.getMaxU() - this.baseIcon.getMinU(); - return this.baseIcon.getMaxU() - (f * 0.25F * (3 - myX)); - } - - @Override - public float getInterpolatedU(double par1) { - float f = this.getMaxU() - this.getMinU(); - return this.getMinU() + f * (float)par1 / 16.0F; - } - - @Override - public float getMinV() { - float f = this.baseIcon.getMaxV() - this.baseIcon.getMinV(); - return this.baseIcon.getMinV() + (f * 0.25F * myY); - } - - @Override - public float getMaxV() { - float f = this.baseIcon.getMaxV() - this.baseIcon.getMinV(); - return this.baseIcon.getMaxV() - (f * 0.25F * (3 - myY)); - } - - @Override - public float getInterpolatedV(double par1) { - float f = this.getMaxV() - this.getMinV(); - return this.getMinV() + f * ((float)par1 / 16.0F); - } - - @Override - public String getIconName() { - return this.baseIcon.getIconName(); - } -} diff --git a/src/main/java/twilightforest/block/GiantLeavesBlock.java b/src/main/java/twilightforest/block/GiantLeavesBlock.java new file mode 100644 index 0000000000..50b544106a --- /dev/null +++ b/src/main/java/twilightforest/block/GiantLeavesBlock.java @@ -0,0 +1,26 @@ +package twilightforest.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.SpawnPlacements; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; + +public class GiantLeavesBlock extends GiantBlock { + + public GiantLeavesBlock(Properties properties) { + super(properties); + } + + @Override + public VoxelShape getBlockSupportShape(BlockState state, BlockGetter getter, BlockPos pos) { + return Shapes.empty(); + } + + @Override + public boolean isValidSpawn(BlockState state, BlockGetter getter, BlockPos pos, SpawnPlacements.Type type, EntityType entityType) { + return false; + } +} diff --git a/src/main/java/twilightforest/block/GrowingBeanstalkBlock.java b/src/main/java/twilightforest/block/GrowingBeanstalkBlock.java new file mode 100644 index 0000000000..8393b5f870 --- /dev/null +++ b/src/main/java/twilightforest/block/GrowingBeanstalkBlock.java @@ -0,0 +1,51 @@ +package twilightforest.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.BaseEntityBlock; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityTicker; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; +import twilightforest.block.entity.GrowingBeanstalkBlockEntity; +import twilightforest.init.TFBlockEntities; + +import javax.annotation.Nullable; + +public class GrowingBeanstalkBlock extends BaseEntityBlock { + public GrowingBeanstalkBlock(Properties properties) { + super(properties); + } + + //dont touch me + @Override + public VoxelShape getShape(BlockState state, BlockGetter getter, BlockPos pos, CollisionContext ctx) { + return Shapes.empty(); + } + + @Override + public VoxelShape getCollisionShape(BlockState state, BlockGetter getter, BlockPos pos, CollisionContext ctx) { + return Shapes.empty(); + } + + @Override + public boolean isCollisionShapeFullBlock(BlockState state, BlockGetter getter, BlockPos pos) { + return false; + } + + @Nullable + @Override + public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { + return new GrowingBeanstalkBlockEntity(pos, state); + } + + @Nullable + @Override + public BlockEntityTicker getTicker(Level level, BlockState state, BlockEntityType type) { + return createTickerHelper(type, TFBlockEntities.BEANSTALK_GROWER.get(), GrowingBeanstalkBlockEntity::tick); + } +} diff --git a/src/main/java/twilightforest/block/HardenedDarkLeavesBlock.java b/src/main/java/twilightforest/block/HardenedDarkLeavesBlock.java new file mode 100644 index 0000000000..a8452c7336 --- /dev/null +++ b/src/main/java/twilightforest/block/HardenedDarkLeavesBlock.java @@ -0,0 +1,40 @@ +package twilightforest.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.SpawnPlacements; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.HitResult; +import twilightforest.init.TFBlocks; + +public class HardenedDarkLeavesBlock extends Block { + + public HardenedDarkLeavesBlock(Properties properties) { + super(properties); + } + + @Override + public int getFlammability(BlockState state, BlockGetter getter, BlockPos pos, Direction face) { + return 1; + } + + @Override + public int getFireSpreadSpeed(BlockState state, BlockGetter getter, BlockPos pos, Direction face) { + return 0; + } + + @Override + public boolean isValidSpawn(BlockState state, BlockGetter level, BlockPos pos, SpawnPlacements.Type type, EntityType entityType) { + return false; + } + + @Override + public ItemStack getCloneItemStack(BlockState state, HitResult result, BlockGetter getter, BlockPos pos, Player player) { + return new ItemStack(TFBlocks.DARK_LEAVES.get()); + } +} diff --git a/src/main/java/twilightforest/block/HedgeBlock.java b/src/main/java/twilightforest/block/HedgeBlock.java new file mode 100644 index 0000000000..527c9fb0cb --- /dev/null +++ b/src/main/java/twilightforest/block/HedgeBlock.java @@ -0,0 +1,117 @@ +package twilightforest.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.RandomSource; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.entity.monster.Spider; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.pathfinder.BlockPathTypes; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.HitResult; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; +import twilightforest.util.EntityUtil; + +import org.jetbrains.annotations.Nullable; +import java.util.List; + +public class HedgeBlock extends Block { + + private static final VoxelShape HEDGE_BB = Shapes.create(new AABB(0, 0, 0, 1, 0.9375, 1)); + + private static final int DAMAGE = 3; + + public HedgeBlock(BlockBehaviour.Properties properties) { + super(properties); + } + + @Override + @Deprecated + public VoxelShape getCollisionShape(BlockState state, BlockGetter getter, BlockPos pos, CollisionContext context) { + return HEDGE_BB; + } + + @Nullable + @Override + public BlockPathTypes getBlockPathType(BlockState state, BlockGetter getter, BlockPos pos, @Nullable Mob mob) { + return mob != null && this.shouldDamage(mob) ? BlockPathTypes.DANGER_OTHER : null; + } + + @Override + @Deprecated + public void entityInside(BlockState state, Level level, BlockPos pos, Entity entity) { + if (this.shouldDamage(entity)) { + entity.hurt(level.damageSources().cactus(), DAMAGE); + } + } + + @Override + public void stepOn(Level level, BlockPos pos, BlockState state, Entity entity) { + if (this.shouldDamage(entity)) { + entity.hurt(level.damageSources().cactus(), DAMAGE); + } + } + + @Override + public void attack(BlockState state, Level level, BlockPos pos, Player player) { + if (!level.isClientSide) { + level.scheduleTick(pos, this, 10); + } + } + + @Override + public void playerDestroy(Level level, Player player, BlockPos pos, BlockState state, @Nullable BlockEntity te, ItemStack stack) { + super.playerDestroy(level, player, pos, state, te, stack); + player.hurt(level.damageSources().cactus(), DAMAGE); + } + + @Override + @Deprecated + public void tick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) { + // find players within range + List nearbyPlayers = level.getEntitiesOfClass(Player.class, new AABB(pos).inflate(8.0)); + + for (Player player : nearbyPlayers) { + // are they swinging? + if (player.swinging) { + BlockHitResult ray = EntityUtil.rayTrace(player); + // are they pointing at this block? + if (ray.getType() == HitResult.Type.BLOCK && pos.equals(ray.getBlockPos())) { + // prick them! prick them hard! + player.hurt(level.damageSources().cactus(), DAMAGE); + + // trigger this again! + level.scheduleTick(pos, this, 10); + } + } + } + } + + private boolean shouldDamage(Entity entity) { + return !(entity instanceof Spider || entity instanceof ItemEntity || entity.isIgnoringBlockTriggers()); + } + + @Override + public int getFlammability(BlockState state, BlockGetter getter, BlockPos pos, Direction face) { + return 0; + } + + @Override + public int getFireSpreadSpeed(BlockState state, BlockGetter getter, BlockPos pos, Direction face) { + return 0; + } +} diff --git a/src/main/java/twilightforest/block/HollowLogClimbable.java b/src/main/java/twilightforest/block/HollowLogClimbable.java new file mode 100644 index 0000000000..4433ce4a12 --- /dev/null +++ b/src/main/java/twilightforest/block/HollowLogClimbable.java @@ -0,0 +1,152 @@ +package twilightforest.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.HorizontalDirectionalBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.EnumProperty; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.level.material.Fluids; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.HitResult; +import net.minecraft.world.phys.Vec3; +import net.minecraft.world.phys.shapes.BooleanOp; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; +import net.minecraftforge.common.ToolActions; +import net.minecraftforge.registries.RegistryObject; +import twilightforest.enums.HollowLogVariants; + +public class HollowLogClimbable extends HorizontalDirectionalBlock implements WaterloggedBlock { + public static final EnumProperty VARIANT = EnumProperty.create("variant", HollowLogVariants.Climbable.class); + + private static final VoxelShape LADDER_EAST = Block.box(0, 0, 0, 3, 16, 16); + private static final VoxelShape LADDER_WEST = Block.box(13, 0, 0, 16, 16, 16); + private static final VoxelShape LADDER_SOUTH = Block.box(0, 0, 0, 16, 16, 3); + private static final VoxelShape LADDER_NORTH = Block.box(0, 0, 13, 16, 16, 16); + + private static final VoxelShape HOLLOW_SHAPE = Shapes.join(Shapes.block(), Block.box(2, 0, 2, 14, 16, 14), BooleanOp.ONLY_FIRST); + private static final VoxelShape HOLLOW_SHAPE_SOUTH = Shapes.or(HOLLOW_SHAPE, LADDER_SOUTH); + private static final VoxelShape HOLLOW_SHAPE_NORTH = Shapes.or(HOLLOW_SHAPE, LADDER_NORTH); + private static final VoxelShape HOLLOW_SHAPE_EAST = Shapes.or(HOLLOW_SHAPE, LADDER_EAST); + private static final VoxelShape HOLLOW_SHAPE_WEST = Shapes.or(HOLLOW_SHAPE, LADDER_WEST); + + private static final VoxelShape COLLISION_SHAPE = Shapes.join(Shapes.block(), Block.box(1, 0, 1, 15, 16, 15), BooleanOp.ONLY_FIRST); + private static final VoxelShape COLLISION_SHAPE_SOUTH = Shapes.or(COLLISION_SHAPE, LADDER_SOUTH); + private static final VoxelShape COLLISION_SHAPE_NORTH = Shapes.or(COLLISION_SHAPE, LADDER_NORTH); + private static final VoxelShape COLLISION_SHAPE_EAST = Shapes.or(COLLISION_SHAPE, LADDER_EAST); + private static final VoxelShape COLLISION_SHAPE_WEST = Shapes.or(COLLISION_SHAPE, LADDER_WEST); + + private final RegistryObject vertical; + + public HollowLogClimbable(Properties properties, RegistryObject vertical) { + super(properties); + this.vertical = vertical; + + this.registerDefaultState(this.getStateDefinition().any().setValue(VARIANT, HollowLogVariants.Climbable.VINE).setValue(FACING, Direction.NORTH)); + } + + @Override + public VoxelShape getShape(BlockState state, BlockGetter getter, BlockPos pos, CollisionContext context) { + return state.getValue(VARIANT) == HollowLogVariants.Climbable.VINE ? HOLLOW_SHAPE : switch (state.getValue(FACING)) { + case SOUTH -> HOLLOW_SHAPE_SOUTH; + case WEST -> HOLLOW_SHAPE_WEST; + case EAST -> HOLLOW_SHAPE_EAST; + default -> HOLLOW_SHAPE_NORTH; + }; + } + + @Override + public VoxelShape getCollisionShape(BlockState state, BlockGetter getter, BlockPos pos, CollisionContext context) { + return state.getValue(VARIANT) == HollowLogVariants.Climbable.VINE ? COLLISION_SHAPE : switch (state.getValue(FACING)) { + case SOUTH -> COLLISION_SHAPE_SOUTH; + case WEST -> COLLISION_SHAPE_WEST; + case EAST -> COLLISION_SHAPE_EAST; + default -> COLLISION_SHAPE_NORTH; + }; + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + super.createBlockStateDefinition(builder.add(VARIANT, FACING)); + } + + @Override + public boolean isStateWaterlogged(BlockState state) { + return state.getValue(VARIANT) == HollowLogVariants.Climbable.LADDER_WATERLOGGED; + } + + @Override + public BlockState setWaterlog(BlockState prior, boolean doWater) { + return switch (prior.getValue(VARIANT)) { + case VINE -> doWater ? this.vertical.get().defaultBlockState().setValue(HollowLogVertical.WATERLOGGED, true) : prior; + case LADDER -> prior.setValue(VARIANT, HollowLogVariants.Climbable.LADDER_WATERLOGGED); + case LADDER_WATERLOGGED -> prior.setValue(VARIANT, HollowLogVariants.Climbable.LADDER); + }; + } + + @Override + public FluidState getFluidState(BlockState state) { + return state.getValue(VARIANT) == HollowLogVariants.Climbable.LADDER_WATERLOGGED ? Fluids.WATER.getSource(false) : super.getFluidState(state); + } + + @Override + public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor accessor, BlockPos pos, BlockPos neighborPos) { + if (this.isStateWaterlogged(state)) { + accessor.scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickDelay(accessor)); + } + + return super.updateShape(state, facing, neighborState, accessor, pos, neighborPos); + } + + @Override + public InteractionResult use(BlockState state, Level level, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { + if (!isInside(hit, pos)) return super.use(state, level, pos, player, hand, hit); + + ItemStack stack = player.getItemInHand(hand); + + if (stack.canPerformAction(ToolActions.SHEARS_HARVEST)) { + HollowLogVariants.Climbable variant = state.getValue(VARIANT); + level.setBlock(pos, this.vertical.get().defaultBlockState().setValue(HollowLogVertical.WATERLOGGED, variant == HollowLogVariants.Climbable.LADDER_WATERLOGGED), 3); + level.playSound(null, pos, SoundEvents.SHEEP_SHEAR, SoundSource.BLOCKS, 1.0F, 1.0F); + if (!player.isCreative()) { + stack.hurtAndBreak(1, player, p -> p.broadcastBreakEvent(hand)); + level.addFreshEntity(new ItemEntity(level, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, new ItemStack(variant == HollowLogVariants.Climbable.VINE ? Blocks.VINE : Blocks.LADDER))); + } + + return InteractionResult.sidedSuccess(level.isClientSide()); + } + + return super.use(state, level, pos, player, hand, hit); + } + + private static boolean isInside(HitResult result, BlockPos pos) { + Vec3 vec = result.getLocation().subtract(pos.getX(), pos.getY(), pos.getZ()); + + return (0.124 <= vec.x() && vec.x() <= 0.876) && (0.124 <= vec.z() && vec.z() <= 0.876); + } + + @Override + public int getFlammability(BlockState state, BlockGetter getter, BlockPos pos, Direction face) { + return 5; + } + + @Override + public int getFireSpreadSpeed(BlockState state, BlockGetter getter, BlockPos pos, Direction face) { + return 5; + } +} diff --git a/src/main/java/twilightforest/block/HollowLogHorizontal.java b/src/main/java/twilightforest/block/HollowLogHorizontal.java new file mode 100644 index 0000000000..beffdf239c --- /dev/null +++ b/src/main/java/twilightforest/block/HollowLogHorizontal.java @@ -0,0 +1,207 @@ +package twilightforest.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.EnumProperty; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.level.material.Fluids; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.HitResult; +import net.minecraft.world.phys.Vec3; +import net.minecraft.world.phys.shapes.BooleanOp; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; +import net.minecraftforge.common.ToolActions; +import twilightforest.enums.HollowLogVariants; +import twilightforest.init.TFBlocks; +import twilightforest.util.AxisUtil; + +import org.jetbrains.annotations.Nullable; + +public class HollowLogHorizontal extends Block implements WaterloggedBlock { + public static final EnumProperty HORIZONTAL_AXIS = BlockStateProperties.HORIZONTAL_AXIS; + public static final EnumProperty VARIANT = EnumProperty.create("variant", HollowLogVariants.Horizontal.class); + + private static final VoxelShape HOLLOW_SHAPE_X = Shapes.join(Shapes.block(), Block.box(0, 2, 2, 16, 14, 14), BooleanOp.ONLY_FIRST); + private static final VoxelShape HOLLOW_SHAPE_Z = Shapes.join(Shapes.block(), Block.box(2, 2, 0, 14, 14, 16), BooleanOp.ONLY_FIRST); + private static final VoxelShape CARPET_SHAPE_X = Shapes.join(Shapes.block(), Block.box(0, 3, 2, 16, 14, 14), BooleanOp.ONLY_FIRST); + private static final VoxelShape CARPET_SHAPE_Z = Shapes.join(Shapes.block(), Block.box(2, 3, 0, 14, 14, 16), BooleanOp.ONLY_FIRST); + private static final VoxelShape COLLISION_SHAPE_X = Shapes.join(Shapes.block(), Block.box(0, 1, 1, 16, 15, 15), BooleanOp.ONLY_FIRST); + private static final VoxelShape COLLISION_SHAPE_Z = Shapes.join(Shapes.block(), Block.box(1, 1, 0, 15, 15, 16), BooleanOp.ONLY_FIRST); + + public HollowLogHorizontal(Properties properties) { + super(properties); + + this.registerDefaultState(this.getStateDefinition().any().setValue(HORIZONTAL_AXIS, Direction.Axis.X).setValue(VARIANT, HollowLogVariants.Horizontal.EMPTY)); + } + + @Override + public VoxelShape getShape(BlockState state, BlockGetter getter, BlockPos pos, CollisionContext context) { + return switch (state.getValue(VARIANT)) { + case EMPTY, WATERLOGGED -> switch (state.getValue(HORIZONTAL_AXIS)) { + case X -> HOLLOW_SHAPE_X; + case Z -> HOLLOW_SHAPE_Z; + default -> Shapes.block(); // Should never be reached + }; + case MOSS, MOSS_AND_GRASS, SNOW -> switch (state.getValue(HORIZONTAL_AXIS)) { + case X -> CARPET_SHAPE_X; + case Z -> CARPET_SHAPE_Z; + default -> Shapes.block(); // Should never be reached + }; + }; + } + + @Override + public VoxelShape getCollisionShape(BlockState state, BlockGetter getter, BlockPos pos, CollisionContext context) { + // The player is intentionally allowed to clip through the moss inside the log + return switch (state.getValue(HORIZONTAL_AXIS)) { + case X -> COLLISION_SHAPE_X; + case Z -> COLLISION_SHAPE_Z; + default -> Shapes.empty(); // Should never be reached + }; + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + super.createBlockStateDefinition(builder.add(HORIZONTAL_AXIS, VARIANT)); + } + + @Override + public boolean isStateWaterlogged(BlockState state) { + return state.getValue(VARIANT) == HollowLogVariants.Horizontal.WATERLOGGED; + } + + @Override + public BlockState setWaterlog(BlockState prior, boolean doWater) { + return prior.setValue(VARIANT, doWater ? HollowLogVariants.Horizontal.WATERLOGGED : HollowLogVariants.Horizontal.EMPTY); + } + + @Nullable + @Override + public BlockState getStateForPlacement(BlockPlaceContext context) { + return super.getStateForPlacement(context).setValue(HORIZONTAL_AXIS, context.getClickedFace().getAxis()).setValue(VARIANT, context.getLevel().getBlockState(context.getClickedPos()).getFluidState().getType() == Fluids.WATER ? HollowLogVariants.Horizontal.WATERLOGGED : HollowLogVariants.Horizontal.EMPTY); + } + + @Override + public FluidState getFluidState(BlockState state) { + return state.getValue(VARIANT) == HollowLogVariants.Horizontal.WATERLOGGED ? Fluids.WATER.getSource(false) : super.getFluidState(state); + } + + @Override + public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor accessor, BlockPos pos, BlockPos neighborPos) { + if (this.isStateWaterlogged(state)) { + accessor.scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickDelay(accessor)); + } + + return super.updateShape(state, facing, neighborState, accessor, pos, neighborPos); + } + + @Override + public InteractionResult use(BlockState state, Level level, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { + Direction.Axis stateAxis = state.getValue(HORIZONTAL_AXIS); + if (!isInside(hit, stateAxis, pos)) return super.use(state, level, pos, player, hand, hit); + + ItemStack stack = player.getItemInHand(hand); + + HollowLogVariants.Horizontal variant = state.getValue(VARIANT); + + if (stack.is(TFBlocks.MOSS_PATCH.get().asItem())) { + if (canChangeVariant(variant, level, pos, stateAxis)) { + level.setBlock(pos, state.setValue(VARIANT, HollowLogVariants.Horizontal.MOSS), 3); + level.playSound(null, pos, SoundEvents.MOSS_PLACE, SoundSource.BLOCKS, 1.0F, 1.0F); + if (!player.isCreative()) stack.shrink(1); + + return InteractionResult.sidedSuccess(level.isClientSide()); + } + } else if (stack.is(Blocks.GRASS.asItem())) { + if (variant == HollowLogVariants.Horizontal.MOSS) { + level.setBlock(pos, state.setValue(VARIANT, HollowLogVariants.Horizontal.MOSS_AND_GRASS), 3); + level.playSound(null, pos, SoundEvents.GRASS_PLACE, SoundSource.BLOCKS, 1.0F, 1.0F); + if (!player.isCreative()) stack.shrink(1); + + return InteractionResult.sidedSuccess(level.isClientSide()); + } + } else if (stack.is(Items.SNOWBALL)) { + if (canChangeVariant(variant, level, pos, stateAxis)) { + level.setBlock(pos, state.setValue(VARIANT, HollowLogVariants.Horizontal.SNOW), 3); + level.playSound(null, pos, SoundEvents.SNOW_PLACE, SoundSource.BLOCKS, 1.0F, 1.0F); + if (!player.isCreative()) stack.shrink(1); + + return InteractionResult.sidedSuccess(level.isClientSide()); + } + } else if (stack.canPerformAction(ToolActions.SHOVEL_DIG)) { + if (variant == HollowLogVariants.Horizontal.SNOW) { + level.setBlock(pos, state.setValue(VARIANT, HollowLogVariants.Horizontal.EMPTY), 3); + level.playSound(null, pos, SoundEvents.SNOW_BREAK, SoundSource.BLOCKS, 1.0F, 1.0F); + if (!player.isCreative()) { + stack.hurtAndBreak(1, player, p -> p.broadcastBreakEvent(hand)); + level.addFreshEntity(new ItemEntity(level, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, new ItemStack(Items.SNOWBALL))); + } + + return InteractionResult.sidedSuccess(level.isClientSide()); + } + } else if (stack.canPerformAction(ToolActions.SHEARS_HARVEST)) { + if (variant == HollowLogVariants.Horizontal.MOSS || variant == HollowLogVariants.Horizontal.MOSS_AND_GRASS) { + level.setBlock(pos, state.setValue(VARIANT, HollowLogVariants.Horizontal.EMPTY), 3); + level.playSound(null, pos, SoundEvents.SHEEP_SHEAR, SoundSource.BLOCKS, 1.0F, 1.0F); + + if (!player.isCreative()) { + stack.hurtAndBreak(1, player, p -> p.broadcastBreakEvent(hand)); + level.addFreshEntity(new ItemEntity(level, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, new ItemStack(TFBlocks.MOSS_PATCH.get()))); + if (variant == HollowLogVariants.Horizontal.MOSS_AND_GRASS) + level.addFreshEntity(new ItemEntity(level, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, new ItemStack(Blocks.GRASS))); + } + + return InteractionResult.sidedSuccess(level.isClientSide()); + } + } + + return super.use(state, level, pos, player, hand, hit); + } + + private static boolean canChangeVariant(HollowLogVariants.Horizontal variant, Level level, BlockPos pos, Direction.Axis axis) { + // Empty Log, or the Log has water, and will be filled by water + return variant == HollowLogVariants.Horizontal.EMPTY || (variant == HollowLogVariants.Horizontal.WATERLOGGED && level.getFluidState(pos.relative(AxisUtil.getAxisDirectionNegative(axis))).getType() != Fluids.WATER && level.getFluidState(pos.relative(AxisUtil.getAxisDirectionPositive(axis))).getType() != Fluids.WATER); + } + + private static boolean isInside(HitResult result, Direction.Axis axis, BlockPos pos) { + Vec3 vec = result.getLocation().subtract(pos.getX(), pos.getY(), pos.getZ()); + + if (0.124 > vec.y || vec.y > 0.876) return false; + // 2vox/16vox < y < 14vox/16vox + + return switch (axis) { + case X -> (0.124 <= vec.z && vec.z <= 0.876); + case Z -> (0.124 <= vec.x && vec.x <= 0.876); + default -> false; + }; + } + + @Override + public int getFlammability(BlockState state, BlockGetter world, BlockPos pos, Direction face) { + return 5; + } + + @Override + public int getFireSpreadSpeed(BlockState state, BlockGetter world, BlockPos pos, Direction face) { + return 5; + } +} diff --git a/src/main/java/twilightforest/block/HollowLogVertical.java b/src/main/java/twilightforest/block/HollowLogVertical.java new file mode 100644 index 0000000000..6d47d74d62 --- /dev/null +++ b/src/main/java/twilightforest/block/HollowLogVertical.java @@ -0,0 +1,126 @@ +package twilightforest.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.SimpleWaterloggedBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.level.material.Fluids; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.HitResult; +import net.minecraft.world.phys.Vec3; +import net.minecraft.world.phys.shapes.BooleanOp; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; +import net.minecraftforge.registries.RegistryObject; +import twilightforest.enums.HollowLogVariants; +import twilightforest.util.DirectionUtil; + +import org.jetbrains.annotations.Nullable; + +public class HollowLogVertical extends Block implements SimpleWaterloggedBlock { + public static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED; + + private static final VoxelShape HOLLOW_SHAPE = Shapes.join(Shapes.block(), Block.box(2, 0, 2, 14, 16, 14), BooleanOp.ONLY_FIRST); + private static final VoxelShape COLLISION_SHAPE = Shapes.join(Shapes.block(), Block.box(1, 0, 1, 15, 16, 15), BooleanOp.ONLY_FIRST); + + private final RegistryObject climbable; + + public HollowLogVertical(Properties properties, RegistryObject climbable) { + super(properties); + this.climbable = climbable; + + this.registerDefaultState(this.getStateDefinition().any().setValue(WATERLOGGED, false)); + } + + @Override + public VoxelShape getShape(BlockState state, BlockGetter getter, BlockPos pos, CollisionContext context) { + return HOLLOW_SHAPE; + } + + @Override + public VoxelShape getCollisionShape(BlockState state, BlockGetter getter, BlockPos pos, CollisionContext context) { + return COLLISION_SHAPE; + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + super.createBlockStateDefinition(builder.add(WATERLOGGED)); + } + + @Override + public InteractionResult use(BlockState state, Level level, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { + if (!isInside(hit, pos)) return super.use(state, level, pos, player, hand, hit); + + ItemStack stack = player.getItemInHand(hand); + + if (stack.is(Blocks.VINE.asItem())) { + level.setBlock(pos, this.climbable.get().defaultBlockState().setValue(HollowLogClimbable.VARIANT, HollowLogVariants.Climbable.VINE).setValue(HollowLogClimbable.FACING, DirectionUtil.horizontalOrElse(hit.getDirection(), player.getDirection().getOpposite())), 3); + level.playSound(null, pos, SoundEvents.VINE_PLACE, SoundSource.BLOCKS, 1.0F, 1.0F); + if (!player.isCreative()) stack.shrink(1); + + return InteractionResult.sidedSuccess(level.isClientSide()); + + } else if (stack.is(Blocks.LADDER.asItem())) { + level.setBlock(pos, this.climbable.get().defaultBlockState().setValue(HollowLogClimbable.VARIANT, state.getValue(WATERLOGGED) ? HollowLogVariants.Climbable.LADDER_WATERLOGGED : HollowLogVariants.Climbable.LADDER).setValue(HollowLogClimbable.FACING, DirectionUtil.horizontalOrElse(hit.getDirection(), player.getDirection().getOpposite())), 3); + level.playSound(null, pos, SoundEvents.LADDER_PLACE, SoundSource.BLOCKS, 1.0F, 1.0F); + if (!player.isCreative()) stack.shrink(1); + + return InteractionResult.sidedSuccess(level.isClientSide()); + } + + return super.use(state, level, pos, player, hand, hit); + } + + @Nullable + @Override + public BlockState getStateForPlacement(BlockPlaceContext context) { + return super.getStateForPlacement(context).setValue(WATERLOGGED, context.getLevel().getBlockState(context.getClickedPos()).getFluidState().getType() == Fluids.WATER); + } + + @Override + public FluidState getFluidState(BlockState state) { + return state.getValue(WATERLOGGED) ? Fluids.WATER.getSource(false) : super.getFluidState(state); + } + + @Override + public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor accessor, BlockPos pos, BlockPos neighborPos) { + if (state.getValue(WATERLOGGED)) { + accessor.scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickDelay(accessor)); + } + + return super.updateShape(state, facing, neighborState, accessor, pos, neighborPos); + } + + private static boolean isInside(HitResult result, BlockPos pos) { + Vec3 vec = result.getLocation().subtract(pos.getX(), pos.getY(), pos.getZ()); + + return (0.124 <= vec.x() && vec.x() <= 0.876) && (0.124 <= vec.z() && vec.z() <= 0.876); + } + + @Override + public int getFlammability(BlockState state, BlockGetter getter, BlockPos pos, Direction face) { + return 5; + } + + @Override + public int getFireSpreadSpeed(BlockState state, BlockGetter getter, BlockPos pos, Direction face) { + return 5; + } +} diff --git a/src/main/java/twilightforest/block/HugeLilyPadBlock.java b/src/main/java/twilightforest/block/HugeLilyPadBlock.java new file mode 100644 index 0000000000..55b3a39b71 --- /dev/null +++ b/src/main/java/twilightforest/block/HugeLilyPadBlock.java @@ -0,0 +1,98 @@ +package twilightforest.block; + +import com.google.common.collect.Lists; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.WaterlilyBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.DirectionProperty; +import net.minecraft.world.level.block.state.properties.EnumProperty; +import net.minecraft.world.level.material.PushReaction; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; +import twilightforest.enums.HugeLilypadPiece; + +import java.util.List; + +public class HugeLilyPadBlock extends WaterlilyBlock { + public static final DirectionProperty FACING = TFHorizontalBlock.FACING; + public static final EnumProperty PIECE = EnumProperty.create("piece", HugeLilypadPiece.class); + private static final VoxelShape SHAPE = Block.box(0, 0, 0, 16, 1, 16); + + private boolean isSelfDestructing = false; + + public HugeLilyPadBlock(Properties properties) { + super(properties); + this.registerDefaultState(this.getStateDefinition().any().setValue(FACING, Direction.NORTH).setValue(PIECE, HugeLilypadPiece.NW)); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + super.createBlockStateDefinition(builder.add(FACING, PIECE)); + } + + @Override + public VoxelShape getShape(BlockState state, BlockGetter getter, BlockPos pos, CollisionContext context) { + return SHAPE; + } + + @Override + public VoxelShape getOcclusionShape(BlockState state, BlockGetter getter, BlockPos pos) { + return Shapes.empty(); + } + + @Override + public void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean isMoving) { + if (!this.isSelfDestructing) { + this.setGiantBlockToAir(level, pos, state); + } + } + + private void setGiantBlockToAir(Level level, BlockPos pos, BlockState state) { + // this flag is not threadsafe + this.isSelfDestructing = true; + + for (BlockPos check : this.getAllMyBlocks(pos, state)) { + BlockState stateThere = level.getBlockState(check); + if (stateThere.getBlock() == this) { + level.destroyBlock(check, false); + } + } + + this.isSelfDestructing = false; + } + + /** + * Get all 4 coordinates for all parts of this lily pad. + */ + public List getAllMyBlocks(BlockPos pos, BlockState state) { + List pieces = Lists.newArrayListWithCapacity(4); + if (state.getBlock() == this) { + // find NW corner + BlockPos nwPos = switch (state.getValue(PIECE)) { + case NE -> pos.west(); + case SE -> pos.north().west(); + case SW -> pos.north(); + default -> pos; + }; + + pieces.add(nwPos); + pieces.add(nwPos.south()); + pieces.add(nwPos.east()); + pieces.add(nwPos.south().east()); + } + + return pieces; + } + + @Override + @Deprecated + public PushReaction getPistonPushReaction(BlockState state) { + return PushReaction.BLOCK; + } +} diff --git a/src/main/java/twilightforest/block/HugeWaterLilyBlock.java b/src/main/java/twilightforest/block/HugeWaterLilyBlock.java new file mode 100644 index 0000000000..d9b70488bc --- /dev/null +++ b/src/main/java/twilightforest/block/HugeWaterLilyBlock.java @@ -0,0 +1,23 @@ +package twilightforest.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.WaterlilyBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; + +public class HugeWaterLilyBlock extends WaterlilyBlock { + + private static final VoxelShape AABB = Block.box(1.6, 1.6, 1.6, 14.4, 14.4, 14.4); + + public HugeWaterLilyBlock(Properties properties) { + super(properties); + } + + @Override + public VoxelShape getShape(BlockState state, BlockGetter getter, BlockPos pos, CollisionContext context) { + return AABB; + } +} diff --git a/src/main/java/twilightforest/block/InfestedTowerwoodBlock.java b/src/main/java/twilightforest/block/InfestedTowerwoodBlock.java new file mode 100644 index 0000000000..3a5f2986a0 --- /dev/null +++ b/src/main/java/twilightforest/block/InfestedTowerwoodBlock.java @@ -0,0 +1,29 @@ +package twilightforest.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.level.GameRules; +import net.minecraft.world.level.block.state.BlockState; +import twilightforest.entity.monster.TowerwoodBorer; +import twilightforest.init.TFEntities; + +public class InfestedTowerwoodBlock extends FlammableBlock { + + public InfestedTowerwoodBlock(int flammability, int spreadSpeed, Properties props) { + super(flammability, spreadSpeed, props); + } + + @Override + public void spawnAfterBreak(BlockState state, ServerLevel level, BlockPos pos, ItemStack stack, boolean sourceIsPlayer) { + super.spawnAfterBreak(state, level, pos, stack, sourceIsPlayer); + if (!level.isClientSide() && level.getGameRules().getBoolean(GameRules.RULE_DOBLOCKDROPS) && EnchantmentHelper.getTagEnchantmentLevel(Enchantments.SILK_TOUCH, stack) == 0) { + TowerwoodBorer termite = TFEntities.TOWERWOOD_BORER.get().create(level); + termite.moveTo(pos.getX() + 0.5D, pos.getY(), pos.getZ() + 0.5D, 0.0F, 0.0F); + level.addFreshEntity(termite); + termite.spawnAnim(); + } + } +} diff --git a/src/main/java/twilightforest/block/IronLadderBlock.java b/src/main/java/twilightforest/block/IronLadderBlock.java new file mode 100644 index 0000000000..ddb9c9e0f7 --- /dev/null +++ b/src/main/java/twilightforest/block/IronLadderBlock.java @@ -0,0 +1,41 @@ +package twilightforest.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.LadderBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BooleanProperty; + +public class IronLadderBlock extends LadderBlock { + public static final BooleanProperty LEFT = BooleanProperty.create("left"); + public static final BooleanProperty RIGHT = BooleanProperty.create("right"); + + public IronLadderBlock(Properties properties) { + super(properties); + this.registerDefaultState(this.getStateDefinition().any().setValue(LEFT, false).setValue(RIGHT, false)); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + super.createBlockStateDefinition(builder); + builder.add(LEFT, RIGHT); + } + + @Override + public BlockState updateShape(BlockState state, Direction direction, BlockState facingState, LevelAccessor accessor, BlockPos currentPos, BlockPos facingPos) { + Direction facing = state.getValue(LadderBlock.FACING); + BlockState superUpdated = super.updateShape(state, direction, facingState, accessor, currentPos, facingPos); + if (superUpdated.getBlock() != this) { + return superUpdated; + } + + BlockState leftState = accessor.getBlockState(currentPos.relative(facing.getCounterClockWise())); + BlockState rightState = accessor.getBlockState(currentPos.relative(facing.getClockWise())); + + return superUpdated.setValue(LEFT, leftState.getBlock() instanceof IronLadderBlock && leftState.getValue(LadderBlock.FACING) == facing) + .setValue(RIGHT, rightState.getBlock() instanceof IronLadderBlock && rightState.getValue(LadderBlock.FACING) == facing); + } +} diff --git a/src/main/java/twilightforest/block/JarBlock.java b/src/main/java/twilightforest/block/JarBlock.java new file mode 100644 index 0000000000..78e7dd9364 --- /dev/null +++ b/src/main/java/twilightforest/block/JarBlock.java @@ -0,0 +1,130 @@ +package twilightforest.block; + +import net.minecraft.client.Minecraft; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.sounds.SoundSource; +import net.minecraft.util.RandomSource; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.SimpleWaterloggedBlock; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.level.material.Fluids; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import twilightforest.TFConfig; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFParticleType; +import twilightforest.init.TFSounds; + +public class JarBlock extends Block implements SimpleWaterloggedBlock { + + private static final VoxelShape JAR = Block.box(3.0D, 0.0D, 3.0D, 13.0D, 14.0D, 13.0D); + private static final VoxelShape LID = Block.box(4.0D, 14.0D, 4.0D, 12.0D, 16.0D, 12.0D); + private static final VoxelShape AABB = Shapes.or(JAR, LID); + private static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED; + + public JarBlock(BlockBehaviour.Properties properties) { + super(properties); + this.registerDefaultState(this.getStateDefinition().any().setValue(WATERLOGGED, false)); + } + + @Override + @Deprecated + public VoxelShape getShape(BlockState state, BlockGetter getter, BlockPos pos, CollisionContext context) { + return AABB; + } + + @Override + public InteractionResult use(BlockState state, Level level, BlockPos pos, Player player, InteractionHand hand, BlockHitResult result) { + ItemEntity jarStuff = new ItemEntity(level, pos.getX(), pos.getY(), pos.getZ(), this == TFBlocks.FIREFLY_JAR.get() ? TFBlocks.FIREFLY.get().asItem().getDefaultInstance() : TFBlocks.CICADA.get().asItem().getDefaultInstance()); + if (player.isShiftKeyDown()) { + level.setBlockAndUpdate(pos, Blocks.AIR.defaultBlockState()); + jarStuff.spawnAtLocation(jarStuff.getItem()); + jarStuff.spawnAtLocation(Items.GLASS_BOTTLE); + return InteractionResult.sidedSuccess(level.isClientSide()); + } else { + if (player.getItemInHand(hand).is(Items.POPPY) && this == TFBlocks.FIREFLY_JAR.get()) { + level.setBlockAndUpdate(pos, TFBlocks.FIREFLY_SPAWNER.get().defaultBlockState().setValue(AbstractParticleSpawnerBlock.RADIUS, 1)); + return InteractionResult.sidedSuccess(level.isClientSide()); + } + } + return InteractionResult.PASS; + } + + @Override + public void destroy(LevelAccessor accessor, BlockPos pos, BlockState state) { + super.destroy(accessor, pos, state); + if (accessor.isClientSide()) + Minecraft.getInstance().getSoundManager().stop(TFSounds.CICADA.get().getLocation(), SoundSource.BLOCKS); + } + + @Override + public FluidState getFluidState(BlockState state) { + return state.getValue(WATERLOGGED) ? Fluids.WATER.getSource(false) : super.getFluidState(state); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void animateTick(BlockState state, Level level, BlockPos pos, RandomSource rand) { + if (this == TFBlocks.FIREFLY_JAR.get()) { + for (int i = 0; i < 2; i++) { + double dx = pos.getX() + ((rand.nextFloat() - rand.nextFloat()) * 0.2F + 0.5F); + double dy = pos.getY() + 0.4F + ((rand.nextFloat() - rand.nextFloat()) * 0.3F); + double dz = pos.getZ() + ((rand.nextFloat() - rand.nextFloat()) * 0.2F + 0.5F); + + level.addParticle(TFParticleType.FIREFLY.get(), dx, dy, dz, 0, 0, 0); + } + } else { + double dx = pos.getX() + ((rand.nextFloat() - rand.nextFloat()) * 0.2F + 0.5F); + double dy = pos.getY() + 0.4F + ((rand.nextFloat() - rand.nextFloat()) * 0.2F); + double dz = pos.getZ() + ((rand.nextFloat() - rand.nextFloat()) * 0.2F + 0.5F); + + level.addParticle(ParticleTypes.NOTE, dx, dy, dz, 0, 0, 0); + + if (!TFConfig.CLIENT_CONFIG.silentCicadas.get() && level.getRandom().nextInt(75) == 0) { + level.playLocalSound(pos.getX() + 0.5F, pos.getY() + 0.5F, pos.getZ() + 0.5F, TFSounds.CICADA.get(), SoundSource.BLOCKS, 1.0F, 1.0F, false); + } + } + } + + @Override + public BlockState getStateForPlacement(BlockPlaceContext context) { + FluidState fluidstate = context.getLevel().getFluidState(context.getClickedPos()); + boolean flag = fluidstate.is(Fluids.WATER); + return super.getStateForPlacement(context).setValue(WATERLOGGED, flag); + } + + @Override + public BlockState updateShape(BlockState state, Direction facing, BlockState facingState, LevelAccessor accessor, BlockPos currentPos, BlockPos facingPos) { + if (state.getValue(WATERLOGGED)) { + accessor.scheduleTick(currentPos, Fluids.WATER, Fluids.WATER.getTickDelay(accessor)); + } + + return super.updateShape(state, facing, facingState, accessor, currentPos, facingPos); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + builder.add(WATERLOGGED); + } +} diff --git a/src/main/java/twilightforest/block/KeepsakeCasketBlock.java b/src/main/java/twilightforest/block/KeepsakeCasketBlock.java new file mode 100644 index 0000000000..234e92475d --- /dev/null +++ b/src/main/java/twilightforest/block/KeepsakeCasketBlock.java @@ -0,0 +1,291 @@ +package twilightforest.block; + +import it.unimi.dsi.fastutil.floats.Float2FloatFunction; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundSource; +import net.minecraft.tags.FluidTags; +import net.minecraft.world.*; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Explosion; +import net.minecraft.world.level.GameRules; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.*; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityTicker; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.entity.LidBlockEntity; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.DirectionProperty; +import net.minecraft.world.level.block.state.properties.IntegerProperty; +import net.minecraft.world.level.material.*; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import twilightforest.block.entity.KeepsakeCasketBlockEntity; +import twilightforest.enums.BlockLoggingEnum; +import twilightforest.init.TFBlockEntities; +import twilightforest.init.TFItems; +import twilightforest.init.TFSounds; + +import org.jetbrains.annotations.Nullable; +import java.util.Optional; + +public class KeepsakeCasketBlock extends BaseEntityBlock implements BlockLoggingEnum.IMultiLoggable { + + public static final DirectionProperty FACING = TFHorizontalBlock.FACING; + public static final IntegerProperty BREAKAGE = IntegerProperty.create("damage", 0, 2); + + private static final VoxelShape BOTTOM_X = Block.box(2.0D, 0.0D, 1.0D, 14.0D, 6.0D, 15.0D); + private static final VoxelShape TOP_X = Block.box(1.0D, 6.0D, 0.0D, 15.0D, 14.0D, 16.0D); + private static final VoxelShape BOTTOM_Z = Block.box(1.0D, 0.0D, 2.0D, 15.0D, 6.0D, 14.0D); + private static final VoxelShape TOP_Z = Block.box(0.0D, 6.0D, 1.0D, 16.0D, 14.0D, 15.0D); + private static final VoxelShape CASKET_X = Shapes.or(BOTTOM_X, TOP_X); + private static final VoxelShape CASKET_Z = Shapes.or(BOTTOM_Z, TOP_Z); + + private static final VoxelShape SOLID = Block.box(0.0D, 0.0D, 0.0D, 16.0D, 12.0D, 16.0D); + private static final VoxelShape TOPPER_X = Block.box(1.0D, 12.0D, 0.0D, 15.0D, 14.0D, 16.0D); + private static final VoxelShape TOPPER_Z = Block.box(0.0D, 12.0D, 1.0D, 16.0D, 14.0D, 15.0D); + private static final VoxelShape SOLID_X = Shapes.or(SOLID, TOPPER_X); + private static final VoxelShape SOLID_Z = Shapes.or(SOLID, TOPPER_Z); + + public KeepsakeCasketBlock() { + super(BlockBehaviour.Properties.of(Material.METAL, MaterialColor.COLOR_BLACK).noOcclusion().requiresCorrectToolForDrops().strength(50.0F, 1200.0F).sound(SoundType.NETHERITE_BLOCK).lightLevel(state -> state.getValue(BlockLoggingEnum.MULTILOGGED) == BlockLoggingEnum.LAVA ? 15 : 0)); + this.registerDefaultState(this.getStateDefinition().any().setValue(FACING, Direction.NORTH).setValue(BREAKAGE, 0)); + } + + @Override + public RenderShape getRenderShape(BlockState state) { + // ENTITYBLOCK_ANIMATED uses only the BlockEntityRender while MODEL uses both the BER and baked model + return state.getValue(BlockLoggingEnum.MULTILOGGED).getBlock() == Blocks.AIR ? RenderShape.ENTITYBLOCK_ANIMATED : RenderShape.MODEL; + } + + @Override + public VoxelShape getShape(BlockState state, BlockGetter getter, BlockPos pos, CollisionContext context) { + Direction direction = state.getValue(BlockStateProperties.HORIZONTAL_FACING); + if (state.getValue(BlockLoggingEnum.MULTILOGGED).getBlock() != Blocks.AIR && state.getValue(BlockLoggingEnum.MULTILOGGED).getFluid() == Fluids.EMPTY) { + return direction.getAxis() == Direction.Axis.X ? SOLID_X : SOLID_Z; + } else { + return direction.getAxis() == Direction.Axis.X ? CASKET_X : CASKET_Z; + } + } + + @Nullable + @Override + public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { + return new KeepsakeCasketBlockEntity(pos, state); + } + + @Nullable + @Override + public BlockEntityTicker getTicker(Level level, BlockState state, BlockEntityType type) { + return createTickerHelper(type, TFBlockEntities.KEEPSAKE_CASKET.get(), KeepsakeCasketBlockEntity::tick); + } + + @Override + public void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean isMoving) { + if (!state.is(newState.getBlock())) { + BlockEntity tileentity = level.getBlockEntity(pos); + if (tileentity instanceof Container) { + Containers.dropContents(level, pos, (Container) tileentity); + level.updateNeighbourForOutputSignal(pos, this); + } + + super.onRemove(state, level, pos, newState, isMoving); + } + } + + @Override + public float getExplosionResistance(BlockState state, BlockGetter getter, BlockPos pos, Explosion explosion) { + return Float.MAX_VALUE; + } + + @Override + public InteractionResult use(BlockState state, Level level, BlockPos pos, Player player, InteractionHand hand, BlockHitResult result) { + boolean flag = false; + if (state.getValue(BlockLoggingEnum.MULTILOGGED).getBlock() == Blocks.AIR || state.getValue(BlockLoggingEnum.MULTILOGGED).getFluid() != Fluids.EMPTY) { + ItemStack stack = player.getItemInHand(hand); + if (!(stack.getItem() == TFItems.CHARM_OF_KEEPING_3.get())) { + if (level.isClientSide()) { + return InteractionResult.SUCCESS; + } else { + MenuProvider inamedcontainerprovider = this.getMenuProvider(state, level, pos); + + if (inamedcontainerprovider != null) { + player.openMenu(inamedcontainerprovider); + } + flag = true; + } + } else { + if (stack.getItem() == TFItems.CHARM_OF_KEEPING_3.get() && state.getValue(BREAKAGE) > 0) { + if (!player.isCreative()) stack.shrink(1); + level.setBlockAndUpdate(pos, state.setValue(BREAKAGE, state.getValue(BREAKAGE) - 1)); + level.playSound(null, pos, TFSounds.CASKET_REPAIR.get(), SoundSource.BLOCKS, 0.5F, level.getRandom().nextFloat() * 0.1F + 0.9F); + flag = true; + } + } + } + return flag ? InteractionResult.sidedSuccess(level.isClientSide()) : InteractionResult.PASS; + } + + @Override + public void playerWillDestroy(Level level, BlockPos pos, BlockState state, Player player) { + if (!level.isClientSide() && !player.isCreative() && level.getGameRules().getBoolean(GameRules.RULE_DOBLOCKDROPS)) { + BlockEntity tile = level.getBlockEntity(pos); + if (tile instanceof KeepsakeCasketBlockEntity casket) { + ItemStack stack = new ItemStack(this); + String nameCheck = Component.literal(casket.name + "'s " + casket.getDisplayName()).getString(); + ItemEntity itementity = new ItemEntity(level, pos.getX(), pos.getY(), pos.getZ(), stack); + CompoundTag nbt = new CompoundTag(); + nbt.putInt("damage", state.getValue(BREAKAGE)); + stack.addTagElement("BlockStateTag", nbt); + if (casket.hasCustomName()) { + if (nameCheck.equals(casket.getCustomName().getString())) + itementity.setCustomName(casket.getDisplayName()); + else itementity.setCustomName(casket.getCustomName()); + } + if (state.getValue(BlockLoggingEnum.MULTILOGGED).getFluid() == Fluids.EMPTY) { + Block block = state.getValue(BlockLoggingEnum.MULTILOGGED).getBlock(); + if (block != Blocks.AIR) { + ItemStack blockstack = new ItemStack(block); + ItemEntity item = new ItemEntity(level, pos.getX(), pos.getY(), pos.getZ(), blockstack); + item.setDefaultPickUpDelay(); + level.addFreshEntity(item); + } + } + itementity.setDefaultPickUpDelay(); + level.addFreshEntity(itementity); + } + } + super.playerWillDestroy(level, pos, state, player); + } + + @Override + public void setPlacedBy(Level level, BlockPos pos, BlockState state, LivingEntity placer, ItemStack stack) { + CompoundTag nbt = stack.getOrCreateTag(); + if (nbt.contains("BlockStateTag")) { + CompoundTag damageNbt = nbt.getCompound("BlockStateTag"); + if (damageNbt.contains("damage")) { + level.setBlock(pos, state.setValue(BREAKAGE, damageNbt.getInt("damage")), 2); + } + } + if (stack.hasCustomHoverName()) { + BlockEntity tileentity = level.getBlockEntity(pos); + if (tileentity instanceof KeepsakeCasketBlockEntity) { + ((KeepsakeCasketBlockEntity) tileentity).setCustomName(stack.getHoverName()); + } + } + } + + @Override + public void neighborChanged(BlockState state, Level level, BlockPos pos, Block block, BlockPos fromPos, boolean isMoving) { + this.reactWithNeighbors(level, pos, state); + super.neighborChanged(state, level, pos, block, fromPos, isMoving); + } + + //[VanillaCopy] of FlowingFluidBlock.reactWithNeighbors, adapted for blockstates + private void reactWithNeighbors(Level level, BlockPos pos, BlockState state) { + if (state.getValue(BlockLoggingEnum.MULTILOGGED) == BlockLoggingEnum.LAVA) { + boolean flag = level.getBlockState(pos.below()).is(Blocks.SOUL_SOIL); + + for (Direction direction : Direction.values()) { + if (direction != Direction.DOWN) { + BlockPos blockpos = pos.relative(direction); + if (level.getFluidState(blockpos).is(FluidTags.WATER)) { + level.setBlockAndUpdate(pos, state.setValue(BlockLoggingEnum.MULTILOGGED, BlockLoggingEnum.OBSIDIAN)); + level.levelEvent(1501, pos, 0); + } + + if (flag && level.getBlockState(blockpos).is(Blocks.BLUE_ICE)) { + level.setBlockAndUpdate(pos, state.setValue(BlockLoggingEnum.MULTILOGGED, BlockLoggingEnum.BASALT)); + level.levelEvent(1501, pos, 0); + } + } + } + } else if (state.getValue(BlockLoggingEnum.MULTILOGGED) == BlockLoggingEnum.WATER) { + for (Direction direction : Direction.values()) { + if (direction != Direction.DOWN) { + BlockPos blockpos = pos.relative(direction); + if (level.getFluidState(blockpos).is(FluidTags.LAVA)) { + level.setBlockAndUpdate(pos, state.setValue(BlockLoggingEnum.MULTILOGGED, BlockLoggingEnum.STONE)); + level.levelEvent(1501, pos, 0); + } + } + } + } + } + + @Override + public PushReaction getPistonPushReaction(BlockState state) { + return PushReaction.BLOCK; + } + + @Override + public boolean hasAnalogOutputSignal(BlockState state) { + return true; + } + + @Override + public int getAnalogOutputSignal(BlockState state, Level level, BlockPos pos) { + return AbstractContainerMenu.getRedstoneSignalFromBlockEntity(level.getBlockEntity(pos)); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + builder.add(BlockLoggingEnum.MULTILOGGED, FACING, BREAKAGE); + } + + @Nullable + @Override + public BlockState getStateForPlacement(BlockPlaceContext context) { + return super.getStateForPlacement(context).setValue(FACING, context.getHorizontalDirection().getOpposite()).setValue(BlockLoggingEnum.MULTILOGGED, BlockLoggingEnum.getFromFluid(context.getLevel().getFluidState(context.getClickedPos()).getType())); + } + + @Override + public FluidState getFluidState(BlockState state) { + return state.getValue(BlockLoggingEnum.MULTILOGGED).getFluid().defaultFluidState(); + } + + @Override + public boolean canEntityDestroy(BlockState state, BlockGetter getter, BlockPos pos, Entity entity) { + return false; + } + + @OnlyIn(Dist.CLIENT) + public static DoubleBlockCombiner.Combiner getLidRotationCallback(final LidBlockEntity lid) { + return new DoubleBlockCombiner.Combiner<>() { + public Float2FloatFunction acceptDouble(KeepsakeCasketBlockEntity casket, KeepsakeCasketBlockEntity oldCasket) { + return (angle) -> Math.max(casket.getOpenNess(angle), oldCasket.getOpenNess(angle)); + } + + public Float2FloatFunction acceptSingle(KeepsakeCasketBlockEntity casket) { + return casket::getOpenNess; + } + + public Float2FloatFunction acceptNone() { + return lid::getOpenNess; + } + }; + } + + @Override + public Optional getPickupSound() { + return Optional.empty(); + } +} diff --git a/src/main/java/twilightforest/block/KnightmetalBlock.java b/src/main/java/twilightforest/block/KnightmetalBlock.java new file mode 100644 index 0000000000..899116aa9a --- /dev/null +++ b/src/main/java/twilightforest/block/KnightmetalBlock.java @@ -0,0 +1,99 @@ +package twilightforest.block; + +import net.minecraft.ChatFormatting; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.tags.FluidTags; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.SimpleWaterloggedBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.level.material.Fluids; +import net.minecraft.world.level.pathfinder.BlockPathTypes; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import twilightforest.init.TFDamageTypes; + +import org.jetbrains.annotations.Nullable; +import java.util.List; + +public class KnightmetalBlock extends Block implements SimpleWaterloggedBlock { + private static final MutableComponent TOOLTIP = Component.translatable("block.twilightforest.knightmetal_block.desc").withStyle(ChatFormatting.GRAY); + + private static final VoxelShape SHAPE = Shapes.create(new AABB(1 / 16F, 1 / 16F, 1 / 16F, 15 / 16F, 15 / 16F, 15 / 16F)); + public static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED; + private static final float BLOCK_DAMAGE = 4; + + public KnightmetalBlock(Properties properties) { + super(properties); + this.registerDefaultState(this.getStateDefinition().any().setValue(WATERLOGGED, false)); + } + + @Override + @Deprecated + public VoxelShape getShape(BlockState state, BlockGetter getter, BlockPos pos, CollisionContext context) { + return SHAPE; + } + + @Override + public FluidState getFluidState(BlockState state) { + return state.getValue(WATERLOGGED) ? Fluids.WATER.getSource(false) : super.getFluidState(state); + } + + @Override + @Nullable + public BlockState getStateForPlacement(BlockPlaceContext context) { + FluidState fluidstate = context.getLevel().getFluidState(context.getClickedPos()); + return defaultBlockState().setValue(WATERLOGGED, fluidstate.is(FluidTags.WATER) && fluidstate.getAmount() == 8); + } + + @Override + public BlockState updateShape(BlockState state, Direction facing, BlockState facingState, LevelAccessor accessor, BlockPos currentPos, BlockPos facingPos) { + if (state.getValue(WATERLOGGED)) { + accessor.scheduleTick(currentPos, Fluids.WATER, Fluids.WATER.getTickDelay(accessor)); + } + + return super.updateShape(state, facing, facingState, accessor, currentPos, facingPos); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + super.createBlockStateDefinition(builder); + builder.add(WATERLOGGED); + } + + @Nullable + @Override + public BlockPathTypes getBlockPathType(BlockState state, BlockGetter getter, BlockPos pos, @Nullable Mob entity) { + return BlockPathTypes.DAMAGE_OTHER; + } + + @Override + @Deprecated + public void entityInside(BlockState state, Level level, BlockPos pos, Entity entity) { + entity.hurt(TFDamageTypes.getDamageSource(level, TFDamageTypes.KNIGHTMETAL), BLOCK_DAMAGE); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void appendHoverText(ItemStack stack, @Nullable BlockGetter getter, List tooltip, TooltipFlag flagIn) { + tooltip.add(TOOLTIP); + } +} diff --git a/src/main/java/twilightforest/block/LiverootBlock.java b/src/main/java/twilightforest/block/LiverootBlock.java new file mode 100644 index 0000000000..458114ab25 --- /dev/null +++ b/src/main/java/twilightforest/block/LiverootBlock.java @@ -0,0 +1,37 @@ +package twilightforest.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraftforge.common.ToolActions; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFItems; + +public class LiverootBlock extends Block { + + public LiverootBlock(Properties properties) { + super(properties); + } + + @Override + public InteractionResult use(BlockState state, Level level, BlockPos pos, Player player, InteractionHand hand, BlockHitResult result) { + if (player.getItemInHand(hand).getItem().canPerformAction(player.getItemInHand(hand), ToolActions.AXE_STRIP)) { + level.setBlockAndUpdate(pos, TFBlocks.ROOT_BLOCK.get().defaultBlockState()); + ItemEntity liveroot = new ItemEntity(level, pos.getX(), pos.getY(), pos.getZ(), new ItemStack(TFItems.LIVEROOT.get())); + level.addFreshEntity(liveroot); + level.playSound(null, pos, SoundEvents.AXE_STRIP, SoundSource.BLOCKS, 1.0F, 1.0F); + player.getItemInHand(hand).hurtAndBreak(1, player, evt -> evt.broadcastBreakEvent(hand)); + return InteractionResult.sidedSuccess(level.isClientSide()); + } + return super.use(state, level, pos, player, hand, result); + } +} diff --git a/src/main/java/twilightforest/block/LockedVanishingBlock.java b/src/main/java/twilightforest/block/LockedVanishingBlock.java new file mode 100644 index 0000000000..e451950964 --- /dev/null +++ b/src/main/java/twilightforest/block/LockedVanishingBlock.java @@ -0,0 +1,59 @@ +package twilightforest.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Explosion; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.phys.BlockHitResult; +import twilightforest.init.TFItems; +import twilightforest.init.TFSounds; + +public class LockedVanishingBlock extends VanishingBlock { + + public static final BooleanProperty LOCKED = BooleanProperty.create("locked"); + + public LockedVanishingBlock(Properties properties) { + super(properties); + this.registerDefaultState(this.defaultBlockState().setValue(LOCKED, true)); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + super.createBlockStateDefinition(builder); + builder.add(LOCKED); + } + + @Override + public float getExplosionResistance(BlockState state, BlockGetter getter, BlockPos pos, Explosion explosion) { + return state.getValue(LOCKED) ? 6000000.0F : super.getExplosionResistance(state, getter, pos, explosion); + } + + @Override + public boolean canEntityDestroy(BlockState state, BlockGetter getter, BlockPos pos, Entity entity) { + return !state.getValue(LOCKED) && super.canEntityDestroy(state, getter, pos, entity); + } + + @Override + public InteractionResult use(BlockState state, Level level, BlockPos pos, Player player, InteractionHand hand, BlockHitResult result) { + ItemStack stack = player.getItemInHand(hand); + if (!stack.isEmpty() && stack.getItem() == TFItems.TOWER_KEY.get() && state.getValue(LOCKED)) { + if (!level.isClientSide()) { + stack.shrink(1); + level.setBlockAndUpdate(pos, state.setValue(LOCKED, false)); + level.playSound(null, pos, TFSounds.UNLOCK_VANISHING_BLOCK.get(), SoundSource.BLOCKS, 0.3F, 0.6F); + } + return InteractionResult.sidedSuccess(level.isClientSide()); + } + return super.use(state, level, pos, player, hand, result); + } +} diff --git a/src/main/java/twilightforest/block/MagicLeavesBlock.java b/src/main/java/twilightforest/block/MagicLeavesBlock.java new file mode 100644 index 0000000000..4e95f55188 --- /dev/null +++ b/src/main/java/twilightforest/block/MagicLeavesBlock.java @@ -0,0 +1,63 @@ +package twilightforest.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFParticleType; + +public class MagicLeavesBlock extends TFLeavesBlock { + + public MagicLeavesBlock(BlockBehaviour.Properties props) { + super(props); + } + + @Override + public void animateTick(BlockState state, Level level, BlockPos pos, RandomSource random) { + if (state.getBlock() == TFBlocks.TRANSFORMATION_LEAVES.get()) { + for (int i = 0; i < 1; ++i) { + this.sparkleRunes(level, pos, random); + } + } + } + + private void sparkleRunes(Level level, BlockPos pos, RandomSource rand) { + double offset = 0.0625D; + + Direction side = Direction.getRandom(rand); //random? + double rx = pos.getX() + rand.nextFloat(); + double ry = pos.getY() + rand.nextFloat(); + double rz = pos.getZ() + rand.nextFloat(); + + if (side == Direction.DOWN && level.isEmptyBlock(pos.above())) { + ry = pos.getY() + 1 + offset; + } + + if (side == Direction.UP && level.isEmptyBlock(pos.below())) { + ry = pos.getY() - offset; + } + + if (side == Direction.NORTH && level.isEmptyBlock(pos.south())) { + rz = pos.getZ() + 1 + offset; + } + + if (side == Direction.SOUTH && level.isEmptyBlock(pos.north())) { + rz = pos.getZ() - offset; + } + + if (side == Direction.WEST && level.isEmptyBlock(pos.east())) { + rx = pos.getX() + 1 + offset; + } + + if (side == Direction.EAST && level.isEmptyBlock(pos.west())) { + rx = pos.getX() - offset; + } + + if (rx < pos.getX() || rx > pos.getX() + 1 || ry < pos.getY() || ry > pos.getY() + 1 || rz < pos.getZ() || rz > pos.getZ() + 1) { + level.addParticle(TFParticleType.LEAF_RUNE.get(), rx, ry, rz, 0.0D, 0.0D, 0.0D); + } + } +} diff --git a/src/main/java/twilightforest/block/MangroveSaplingBlock.java b/src/main/java/twilightforest/block/MangroveSaplingBlock.java new file mode 100644 index 0000000000..b77318bacb --- /dev/null +++ b/src/main/java/twilightforest/block/MangroveSaplingBlock.java @@ -0,0 +1,84 @@ +package twilightforest.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.tags.FluidTags; +import net.minecraft.util.RandomSource; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.SaplingBlock; +import net.minecraft.world.level.block.SimpleWaterloggedBlock; +import net.minecraft.world.level.block.grower.AbstractTreeGrower; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.level.material.Fluids; + +import org.jetbrains.annotations.Nullable; + +public class MangroveSaplingBlock extends SaplingBlock implements SimpleWaterloggedBlock { + + public static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED; + + public MangroveSaplingBlock(AbstractTreeGrower tree, BlockBehaviour.Properties properties) { + super(tree, properties); + this.registerDefaultState(this.getStateDefinition().any().setValue(WATERLOGGED, false)); + } + + @Override + @Deprecated + public FluidState getFluidState(BlockState state) { + return state.getValue(WATERLOGGED) ? Fluids.WATER.getSource(false) : super.getFluidState(state); + } + + @Override + @Deprecated + public void tick(BlockState state, ServerLevel level, BlockPos pos, RandomSource rand) { + if (!isInWater(state, level, pos)) { + level.setBlock(pos, this.defaultBlockState().setValue(WATERLOGGED, false), 2); + } + } + + //VanillaCopy of AbstractCoralPlantBlock.isInWater + protected static boolean isInWater(BlockState state, BlockGetter getter, BlockPos pos) { + if (state.getValue(WATERLOGGED)) { + return true; + } else { + for (Direction direction : Direction.values()) { + if (getter.getFluidState(pos.relative(direction)).is(FluidTags.WATER)) { + return true; + } + } + + return false; + } + } + + @Override + @Nullable + public BlockState getStateForPlacement(BlockPlaceContext context) { + FluidState fluidstate = context.getLevel().getFluidState(context.getClickedPos()); + return this.defaultBlockState().setValue(WATERLOGGED, fluidstate.is(FluidTags.WATER) && fluidstate.getAmount() == 8); + } + + @Override + public BlockState updateShape(BlockState stateIn, Direction facing, BlockState facingState, LevelAccessor accessor, BlockPos currentPos, BlockPos facingPos) { + if (stateIn.getValue(WATERLOGGED)) { + accessor.scheduleTick(currentPos, Fluids.WATER, Fluids.WATER.getTickDelay(accessor)); + } + + return facing == Direction.DOWN && !this.canSurvive(stateIn, accessor, currentPos) ? Blocks.AIR.defaultBlockState() : super.updateShape(stateIn, facing, facingState, accessor, currentPos, facingPos); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + builder.add(WATERLOGGED, STAGE); + } +} diff --git a/src/main/java/twilightforest/block/MayappleBlock.java b/src/main/java/twilightforest/block/MayappleBlock.java new file mode 100644 index 0000000000..d5d1d54021 --- /dev/null +++ b/src/main/java/twilightforest/block/MayappleBlock.java @@ -0,0 +1,21 @@ +package twilightforest.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; + +public class MayappleBlock extends TFPlantBlock { + + private static final VoxelShape MAYAPPLE_SHAPE = box(4, 0, 4, 13, 6, 13); + + public MayappleBlock(Properties properties) { + super(properties); + } + + @Override + public VoxelShape getShape(BlockState state, BlockGetter getter, BlockPos pos, CollisionContext context) { + return MAYAPPLE_SHAPE; + } +} diff --git a/src/main/java/twilightforest/block/MineLogCoreBlock.java b/src/main/java/twilightforest/block/MineLogCoreBlock.java new file mode 100644 index 0000000000..03deaf1ca3 --- /dev/null +++ b/src/main/java/twilightforest/block/MineLogCoreBlock.java @@ -0,0 +1,35 @@ +package twilightforest.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.sounds.SoundSource; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.Level; +import twilightforest.TFConfig; +import twilightforest.init.TFSounds; +import twilightforest.item.OreMagnetItem; +import twilightforest.util.WorldUtil; + +public class MineLogCoreBlock extends SpecialMagicLogBlock { + + public MineLogCoreBlock(Properties props) { + super(props); + } + + @Override + public boolean doesCoreFunction() { + return !TFConfig.COMMON_CONFIG.MAGIC_TREES.disableMining.get(); + } + + /** + * The miner's tree generates the ore magnet effect randomly every second + */ + @Override + void performTreeEffect(Level level, BlockPos pos, RandomSource rand) { + BlockPos dPos = WorldUtil.randomOffset(rand, pos, TFConfig.COMMON_CONFIG.MAGIC_TREES.miningRange.get()); + int moved = OreMagnetItem.doMagnet(level, pos, dPos); + + if (moved > 0) { + level.playSound(null, pos, TFSounds.MAGNET_GRAB.get(), SoundSource.BLOCKS, 0.1F, 1.0F); + } + } +} diff --git a/src/main/java/twilightforest/block/MoonwormBlock.java b/src/main/java/twilightforest/block/MoonwormBlock.java new file mode 100644 index 0000000000..a984070253 --- /dev/null +++ b/src/main/java/twilightforest/block/MoonwormBlock.java @@ -0,0 +1,39 @@ +package twilightforest.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityTicker; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; +import twilightforest.block.entity.MoonwormBlockEntity; +import twilightforest.init.TFBlockEntities; + +import org.jetbrains.annotations.Nullable; +import twilightforest.loot.TFLootTables; + +public class MoonwormBlock extends CritterBlock { + + public MoonwormBlock(BlockBehaviour.Properties properties) { + super(properties); + } + + @Nullable + @Override + public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { + return new MoonwormBlockEntity(pos, state); + } + + @Nullable + @Override + public BlockEntityTicker getTicker(Level level, BlockState state, BlockEntityType type) { + return createTickerHelper(type, TFBlockEntities.MOONWORM.get(), MoonwormBlockEntity::tick); + } + + @Override + public @Nullable ResourceLocation getSquishLootTable() { + return TFLootTables.MOONWORM_SQUISH_DROPS; + } +} diff --git a/src/main/java/twilightforest/block/MossPatchBlock.java b/src/main/java/twilightforest/block/MossPatchBlock.java new file mode 100644 index 0000000000..f47c3edaa8 --- /dev/null +++ b/src/main/java/twilightforest/block/MossPatchBlock.java @@ -0,0 +1,35 @@ +package twilightforest.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.common.PlantType; + +public class MossPatchBlock extends PatchBlock { + + public MossPatchBlock(Properties props) { + super(props); + } + + @Override + public boolean canSurvive(BlockState state, LevelReader reader, BlockPos pos) { + return reader.getBlockState(pos.below()).isFaceSturdy(reader, pos, Direction.UP); + } + + @Override + public PlantType getPlantType(BlockGetter getter, BlockPos pos) { + return PlantType.CAVE; + } + + @Override + public void animateTick(BlockState state, Level level, BlockPos pos, RandomSource random) { + if (random.nextInt(10) == 0) { + level.addParticle(ParticleTypes.MYCELIUM, pos.getX() + random.nextFloat(), pos.getY() + 0.1F, pos.getZ() + random.nextFloat(), 0.0D, 0.0D, 0.0D); + } + } +} diff --git a/src/main/java/twilightforest/block/MushgloomBlock.java b/src/main/java/twilightforest/block/MushgloomBlock.java new file mode 100644 index 0000000000..47302a52c3 --- /dev/null +++ b/src/main/java/twilightforest/block/MushgloomBlock.java @@ -0,0 +1,46 @@ +package twilightforest.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.MushroomBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; +import net.minecraftforge.common.PlantType; +import twilightforest.TwilightForestMod; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFConfiguredFeatures; + +public class MushgloomBlock extends MushroomBlock { + + private static final VoxelShape MUSHGLOOM_SHAPE = box(2, 0, 2, 14, 8, 14); + + public MushgloomBlock(Properties properties) { + super(properties, TFConfiguredFeatures.BIG_MUSHGLOOM); + } + + @Override + public boolean canSurvive(BlockState state, LevelReader reader, BlockPos pos) { + return reader.getBlockState(pos.below()).isFaceSturdy(reader, pos, Direction.UP) || reader.getBlockState(pos.below()).is(TFBlocks.UBEROUS_SOIL.get()); + } + + @Override + @Deprecated + public VoxelShape getShape(BlockState state, BlockGetter getter, BlockPos pos, CollisionContext context) { + return MUSHGLOOM_SHAPE; + } + + @Override + public boolean isValidBonemealTarget(LevelReader getter, BlockPos pos, BlockState state, boolean isClientSide) { + return false; + } + + @Override + public PlantType getPlantType(BlockGetter world, BlockPos pos) { + return PlantType.CAVE; + } +} diff --git a/src/main/java/twilightforest/block/NagastoneBlock.java b/src/main/java/twilightforest/block/NagastoneBlock.java new file mode 100644 index 0000000000..8567823e8a --- /dev/null +++ b/src/main/java/twilightforest/block/NagastoneBlock.java @@ -0,0 +1,71 @@ +package twilightforest.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.EnumProperty; +import twilightforest.enums.NagastoneVariant; +import twilightforest.init.TFBlocks; + +public class NagastoneBlock extends Block { + + public static final EnumProperty VARIANT = EnumProperty.create("variant", NagastoneVariant.class); + + public NagastoneBlock(Properties properties) { + super(properties); + this.registerDefaultState(this.getStateDefinition().any().setValue(VARIANT, NagastoneVariant.SOLID)); + } + + @Override + public BlockState updateShape(BlockState state, Direction directionToNeighbor, BlockState neighborState, LevelAccessor accessor, BlockPos pos, BlockPos neighborPos) { + return this.getVariant(accessor, pos); + } + + @Override + public BlockState getStateForPlacement(BlockPlaceContext context) { + return this.getVariant(context.getLevel(), context.getClickedPos()); + } + + @SuppressWarnings("fallthrough") + private BlockState getVariant(LevelAccessor accessor, BlockPos pos) { + int connectionCount = 0; + BlockState stateOut; + Direction[] facings = new Direction[2]; + + for (Direction side : Direction.values()) { + BlockState neighborState = accessor.getBlockState(pos.relative(side)); + if (neighborState.getBlock() == this || (neighborState.getBlock() == TFBlocks.NAGASTONE_HEAD.get() && side == neighborState.getValue(TFHorizontalBlock.FACING))) { + facings[connectionCount++] = side; + if (connectionCount >= 2) { + break; + } + } + } + + // if there are 2 sides that don't line on same axis, use an elbow part, else use axis part + // if there is 1 side, then use an axis part + // if there are 0 or greater than 2 sides, use solid + // use default if there are more than 3 connections or 0 + switch (connectionCount) { + case 1: + facings[1] = facings[0]; // No null, for next statement + case 2: + stateOut = defaultBlockState().setValue(VARIANT, NagastoneVariant.getVariantFromDoubleFacing(facings[0], facings[1])); + break; + default: + stateOut = this.defaultBlockState(); + break; + } + return stateOut; + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + super.createBlockStateDefinition(builder); + builder.add(VARIANT); + } +} diff --git a/src/main/java/twilightforest/block/NagastonePillarBlock.java b/src/main/java/twilightforest/block/NagastonePillarBlock.java new file mode 100644 index 0000000000..e9a11629b9 --- /dev/null +++ b/src/main/java/twilightforest/block/NagastonePillarBlock.java @@ -0,0 +1,18 @@ +package twilightforest.block; + +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.material.Material; +import net.minecraft.core.Direction; + +import net.minecraft.world.level.block.state.BlockBehaviour.Properties; + +/** + * Created by Drullkus on 12/12/17. + */ +public class NagastonePillarBlock extends DirectionalRotatedPillarBlock { + + public NagastonePillarBlock() { + super(Properties.of(Material.STONE).requiresCorrectToolForDrops().strength(1.5F, 10.0F).sound(SoundType.STONE)); + this.registerDefaultState(this.getStateDefinition().any().setValue(AXIS, Direction.Axis.Y).setValue(REVERSED, false)); + } +} diff --git a/src/main/java/twilightforest/block/PatchBlock.java b/src/main/java/twilightforest/block/PatchBlock.java new file mode 100644 index 0000000000..24df29ee7e --- /dev/null +++ b/src/main/java/twilightforest/block/PatchBlock.java @@ -0,0 +1,99 @@ +package twilightforest.block; + +import net.minecraft.Util; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.PipeBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; + +import java.util.Map; +import java.util.Random; + +public class PatchBlock extends TFPlantBlock { + public static final BooleanProperty NORTH = BlockStateProperties.NORTH; + public static final BooleanProperty EAST = BlockStateProperties.EAST; + public static final BooleanProperty SOUTH = BlockStateProperties.SOUTH; + public static final BooleanProperty WEST = BlockStateProperties.WEST; + private static final Map PROPERTY_BY_DIRECTION = PipeBlock.PROPERTY_BY_DIRECTION.entrySet().stream().filter(directionPropertyPair -> directionPropertyPair.getKey().getAxis().isHorizontal()).collect(Util.toMap()); + + public PatchBlock(Properties properties) { + super(properties); + + this.registerDefaultState(this.getStateDefinition().any().setValue(NORTH, false).setValue(EAST, false).setValue(SOUTH, false).setValue(WEST, false)); + } + + @Override + public BlockState updateShape(BlockState state, Direction dir, BlockState neighborUpdated, LevelAccessor accessor, BlockPos pos, BlockPos posNeighbor) { + return dir.getAxis().isHorizontal() ? state.setValue(PROPERTY_BY_DIRECTION.get(dir), neighborUpdated.getBlock() == this) : super.updateShape(state, dir, neighborUpdated, accessor, pos, posNeighbor); + } + + @Override + @Deprecated + public VoxelShape getShape(BlockState state, BlockGetter getter, BlockPos pos, CollisionContext context) { + return shapeFromPos(state, pos); + } + + public static VoxelShape shapeFromLong(BlockState state, long seed) { + boolean xConnect0 = state.getValue(EAST); + boolean xConnect1 = state.getValue(WEST); + boolean zConnect0 = state.getValue(SOUTH); + boolean zConnect1 = state.getValue(NORTH); + + int xOff0 = (int) (seed >> 12 & 3L); + int xOff1 = (int) (seed >> 15 & 3L); + int zOff0 = (int) (seed >> 18 & 3L); + int zOff1 = (int) (seed >> 21 & 3L); + + return Block.box( + xConnect1 ? 0F : (1F + xOff1), + 0.0F, + zConnect1 ? 0F : (1F + zOff1), + xConnect0 ? 16F : (15F - xOff0), + 1F, + zConnect0 ? 16F : (15F - zOff0) + ); + } + + public static VoxelShape shapeFromRandom(BlockState state, Random random) { + return shapeFromLong(state, random.nextLong()); + } + + public static VoxelShape shapeFromPos(BlockState state, BlockPos pos) { + return shapeFromRandom(state, new Random(state.getSeed(pos))); + } + + public static AABB AABBFromLong(long seed) { + int xOff0 = (int) (seed >> 12 & 3L); + int xOff1 = (int) (seed >> 15 & 3L); + int zOff0 = (int) (seed >> 18 & 3L); + int zOff1 = (int) (seed >> 21 & 3L); + + return new AABB( + 1F + xOff1, + 0.0F, + 1F + zOff1, + 15F - xOff0, + 1F, + 15F - zOff0 + ); + } + + public static AABB AABBFromRandom(RandomSource random) { + return AABBFromLong(random.nextLong()); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + builder.add(NORTH, EAST, SOUTH, WEST); + } +} diff --git a/src/main/java/twilightforest/block/ReappearingBlock.java b/src/main/java/twilightforest/block/ReappearingBlock.java new file mode 100644 index 0000000000..f87be32b8c --- /dev/null +++ b/src/main/java/twilightforest/block/ReappearingBlock.java @@ -0,0 +1,31 @@ +package twilightforest.block; + +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; + +import net.minecraft.world.level.block.state.BlockBehaviour.Properties; +import net.minecraft.world.level.material.PushReaction; + +/** + * Just a dummy subclass to register the extra blockstate property. + * See the comments on the superclass. + */ +public class ReappearingBlock extends VanishingBlock { + + public ReappearingBlock(Properties properties) { + super(properties); + this.registerDefaultState(this.getStateDefinition().any().setValue(ACTIVE, false).setValue(VANISHED, false)); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + super.createBlockStateDefinition(builder); + builder.add(VANISHED); + } + + @Override + public PushReaction getPistonPushReaction(BlockState state) { + return PushReaction.BLOCK; + } +} diff --git a/src/main/java/twilightforest/block/RedThreadBlock.java b/src/main/java/twilightforest/block/RedThreadBlock.java new file mode 100644 index 0000000000..5f88d0a627 --- /dev/null +++ b/src/main/java/twilightforest/block/RedThreadBlock.java @@ -0,0 +1,42 @@ +package twilightforest.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.SpawnPlacements; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.block.EntityBlock; +import net.minecraft.world.level.block.MultifaceBlock; +import net.minecraft.world.level.block.MultifaceSpreader; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import twilightforest.block.entity.RedThreadBlockEntity; +import twilightforest.init.TFBlocks; + +import org.jetbrains.annotations.Nullable; + +public class RedThreadBlock extends MultifaceBlock implements EntityBlock { + public RedThreadBlock(Properties properties) { + super(properties); + } + + public boolean canBeReplaced(BlockState state, BlockPlaceContext ctx) { + return ctx.getItemInHand().is(TFBlocks.RED_THREAD.get().asItem()); + } + + @Override + public MultifaceSpreader getSpreader() { + return new MultifaceSpreader(this); + } + + @Override + public boolean isValidSpawn(BlockState state, BlockGetter getter, BlockPos pos, SpawnPlacements.Type type, EntityType entityType) { + return false; + } + + @Nullable + @Override + public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { + return new RedThreadBlockEntity(pos, state); + } +} diff --git a/src/main/java/twilightforest/block/RootStrandBlock.java b/src/main/java/twilightforest/block/RootStrandBlock.java new file mode 100644 index 0000000000..b39857151f --- /dev/null +++ b/src/main/java/twilightforest/block/RootStrandBlock.java @@ -0,0 +1,70 @@ +package twilightforest.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; +import net.minecraftforge.common.PlantType; + +public class RootStrandBlock extends TFPlantBlock { + + private static final VoxelShape ROOT_SHAPE = box(2, 0, 2, 14, 16, 14); + + public RootStrandBlock(Properties props) { + super(props); + } + + @Override + public boolean canSurvive(BlockState state, LevelReader reader, BlockPos pos) { + return TFPlantBlock.canPlaceRootAt(reader, pos) || reader.getBlockState(pos.above()).is(this); + } + + @Override + public PlantType getPlantType(BlockGetter getter, BlockPos pos) { + return PlantType.CAVE; + } + + @Override + @Deprecated + public VoxelShape getShape(BlockState state, BlockGetter getter, BlockPos pos, CollisionContext context) { + return ROOT_SHAPE; + } + + @Override + public boolean isValidBonemealTarget(LevelReader getter, BlockPos pos, BlockState state, boolean isClient) { + return this.isBottomOpen(getter, pos); + } + + @Override + public boolean isBonemealSuccess(Level level, RandomSource random, BlockPos pos, BlockState state) { + return this.isBottomOpen(level, pos); + } + + private boolean isBottomOpen(BlockGetter getter, BlockPos pos) { + BlockPos.MutableBlockPos mutable = pos.mutable(); + do { + mutable.move(Direction.DOWN); + } while (getter.getBlockState(mutable).is(this)); + + return getter.getBlockState(mutable).isAir() || getter.getBlockState(mutable).getMaterial().isReplaceable(); + } + + @Override + public void performBonemeal(ServerLevel level, RandomSource random, BlockPos pos, BlockState state) { + BlockPos.MutableBlockPos mutable = pos.mutable(); + + do { + mutable.move(Direction.DOWN); + } while (level.getBlockState(mutable).is(this)); + + if (level.getBlockState(mutable).isAir() || level.getBlockState(mutable).getMaterial().isReplaceable()) { + level.setBlockAndUpdate(mutable, this.defaultBlockState()); + } + } +} diff --git a/src/main/java/twilightforest/block/SkullCandleBlock.java b/src/main/java/twilightforest/block/SkullCandleBlock.java new file mode 100644 index 0000000000..dd5aef2a9b --- /dev/null +++ b/src/main/java/twilightforest/block/SkullCandleBlock.java @@ -0,0 +1,93 @@ +package twilightforest.block; + +import com.google.common.collect.ImmutableList; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; +import it.unimi.dsi.fastutil.ints.Int2ObjectMaps; +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; +import net.minecraft.Util; +import net.minecraft.core.BlockPos; +import net.minecraft.util.Mth; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Mirror; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.SkullBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.IntegerProperty; +import net.minecraft.world.phys.Vec3; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; +import twilightforest.block.entity.SkullCandleBlockEntity; + +import java.util.List; + +public class SkullCandleBlock extends AbstractSkullCandleBlock { + + public static final IntegerProperty ROTATION = BlockStateProperties.ROTATION_16; + + protected static final VoxelShape SHAPE = Block.box(4.0D, 0.0D, 4.0D, 12.0D, 8.0D, 12.0D); + protected static final VoxelShape ONE_CANDLE = Block.box(7.0D, 8.0D, 7.0D, 9.0D, 14.0D, 9.0D); + protected static final VoxelShape TWO_CANDLE = Block.box(5.0D, 8.0D, 6.0D, 11.0D, 14.0D, 9.0D); + protected static final VoxelShape THREE_CANDLE = Block.box(5.0D, 8.0D, 6.0D, 10.0D, 14.0D, 11.0D); + protected static final VoxelShape FOUR_CANDLE = Block.box(5.0D, 8.0D, 5.0D, 11.0D, 14.0D, 10.0D); + protected static final VoxelShape SKULL_WITH_ONE = Shapes.or(SHAPE, ONE_CANDLE); + protected static final VoxelShape SKULL_WITH_TWO = Shapes.or(SHAPE, TWO_CANDLE); + protected static final VoxelShape SKULL_WITH_THREE = Shapes.or(SHAPE, THREE_CANDLE); + protected static final VoxelShape SKULL_WITH_FOUR = Shapes.or(SHAPE, FOUR_CANDLE); + + private static final Int2ObjectMap> PARTICLE_OFFSETS = Util.make(() -> { + Int2ObjectMap> var0 = new Int2ObjectOpenHashMap<>(); + var0.defaultReturnValue(ImmutableList.of()); + var0.put(1, ImmutableList.of(new Vec3(0.5D, 1.0D, 0.5D))); + var0.put(2, ImmutableList.of(new Vec3(0.375D, 0.94D, 0.5D), new Vec3(0.625D, 1.0D, 0.44D))); + var0.put(3, ImmutableList.of(new Vec3(0.5D, 0.813D, 0.625D), new Vec3(0.375D, 0.94D, 0.5D), new Vec3(0.56D, 1.0D, 0.44D))); + var0.put(4, ImmutableList.of(new Vec3(0.44D, 0.813D, 0.56D), new Vec3(0.625D, 0.94D, 0.56D), new Vec3(0.375D, 0.94D, 0.375D), new Vec3(0.56D, 1.0D, 0.375D))); + return Int2ObjectMaps.unmodifiable(var0); + }); + + public SkullCandleBlock(SkullBlock.Type type, Properties properties) { + super(type, properties); + this.registerDefaultState(this.getStateDefinition().any().setValue(ROTATION, 0)); + } + + @Override + public VoxelShape getShape(BlockState state, BlockGetter getter, BlockPos pos, CollisionContext ctx) { + return switch (getter.getBlockEntity(pos) instanceof SkullCandleBlockEntity sc ? sc.candleAmount : 1) { + default -> SKULL_WITH_ONE; + case 2 -> SKULL_WITH_TWO; + case 3 -> SKULL_WITH_THREE; + case 4 -> SKULL_WITH_FOUR; + }; + } + + @Override + protected Iterable getParticleOffsets(BlockState state, LevelAccessor accessor, BlockPos pos) { + return PARTICLE_OFFSETS.get(accessor.getBlockEntity(pos) instanceof SkullCandleBlockEntity sc ? sc.candleAmount : 1); + } + + @Override + public BlockState getStateForPlacement(BlockPlaceContext ctx) { + return this.defaultBlockState().setValue(ROTATION, Mth.floor((double) (ctx.getRotation() * 16.0F / 360.0F) + 0.5D) & 15).setValue(LIGHTING, Lighting.NONE); + } + + @Override + public BlockState rotate(BlockState state, Rotation rot) { + return state.setValue(ROTATION, rot.rotate(state.getValue(ROTATION), 16)); + } + + @Override + public BlockState mirror(BlockState state, Mirror mirror) { + return state.setValue(ROTATION, mirror.mirror(state.getValue(ROTATION), 16)); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + super.createBlockStateDefinition(builder); + builder.add(ROTATION); + } +} diff --git a/src/main/java/twilightforest/block/SliderBlock.java b/src/main/java/twilightforest/block/SliderBlock.java new file mode 100644 index 0000000000..cad993c42f --- /dev/null +++ b/src/main/java/twilightforest/block/SliderBlock.java @@ -0,0 +1,155 @@ +package twilightforest.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.RandomSource; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.RotatedPillarBlock; +import net.minecraft.world.level.block.SimpleWaterloggedBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.block.state.properties.IntegerProperty; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.level.material.Fluids; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.material.MaterialColor; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; +import twilightforest.entity.SlideBlock; +import twilightforest.init.TFDamageTypes; +import twilightforest.init.TFEntities; + +import org.jetbrains.annotations.Nullable; + +public class SliderBlock extends RotatedPillarBlock implements SimpleWaterloggedBlock { + + public static final IntegerProperty DELAY = IntegerProperty.create("delay", 0, 3); + public static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED; + + private static final int TICK_TIME = 80; + private static final int OFFSET_TIME = 20; + private static final int PLAYER_RANGE = 32; + private static final float BLOCK_DAMAGE = 5; + private static final VoxelShape Y_BB = Shapes.create(new AABB(0.3125, 0, 0.3125, 0.6875, 1F, 0.6875)); + private static final VoxelShape Z_BB = Shapes.create(new AABB(0.3125, 0.3125, 0, 0.6875, 0.6875, 1F)); + private static final VoxelShape X_BB = Shapes.create(new AABB(0, 0.3125, 0.3125, 1F, 0.6875, 0.6875)); + + public SliderBlock() { + super(Properties.of(Material.METAL, MaterialColor.DIRT).strength(2.0F, 10.0F).randomTicks().noOcclusion()); + this.registerDefaultState(this.getStateDefinition().any().setValue(AXIS, Direction.Axis.Y).setValue(DELAY, 0).setValue(WATERLOGGED, false)); + } + + @Override + public FluidState getFluidState(BlockState state) { + return state.getValue(WATERLOGGED) ? Fluids.WATER.getSource(false) : super.getFluidState(state); + } + + @Nullable + @Override + public BlockState getStateForPlacement(BlockPlaceContext context) { + FluidState fluidstate = context.getLevel().getFluidState(context.getClickedPos()); + boolean flag = fluidstate.getType() == Fluids.WATER; + return super.getStateForPlacement(context).setValue(WATERLOGGED, flag); + } + + @Override + public BlockState updateShape(BlockState state, Direction facing, BlockState facingState, LevelAccessor accessor, BlockPos currentPos, BlockPos facingPos) { + if (state.getValue(WATERLOGGED)) { + accessor.scheduleTick(currentPos, Fluids.WATER, Fluids.WATER.getTickDelay(accessor)); + } + + return super.updateShape(state, facing, facingState, accessor, currentPos, facingPos); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + super.createBlockStateDefinition(builder); + builder.add(DELAY, WATERLOGGED); + } + + @Override + @Deprecated + public VoxelShape getShape(BlockState state, BlockGetter getter, BlockPos pos, CollisionContext context) { + return switch (state.getValue(AXIS)) { + case X -> X_BB; + case Z -> Z_BB; + default -> Y_BB; + }; + } + + @Override + @Deprecated + public void tick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) { + if (!level.isClientSide() && this.isConnectedInRange(level, pos)) { + //TODO calls for a creakstart sound effect, but it doesnt exist in the game files + //world.playSound(null, pos.getX() + 0.5D, pos.getY() + 0.5D, pos.getZ() + 0.5D, TFSounds.SLIDER, SoundCategory.BLOCKS, 0.75F, 1.5F); + + SlideBlock slideBlock = new SlideBlock(TFEntities.SLIDER.get(), level, pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5, state); + level.addFreshEntity(slideBlock); + } + + this.scheduleBlockUpdate(level, pos); + } + + /** + * Check if there is any players in range, and also recursively check connected blocks + */ + public boolean isConnectedInRange(Level level, BlockPos pos) { + Direction.Axis axis = level.getBlockState(pos).getValue(AXIS); + + return switch (axis) { + case Y -> this.anyPlayerInRange(level, pos) || this.isConnectedInRangeRecursive(level, pos, Direction.UP) || this.isConnectedInRangeRecursive(level, pos, Direction.DOWN); + case X -> this.anyPlayerInRange(level, pos) || this.isConnectedInRangeRecursive(level, pos, Direction.WEST) || this.isConnectedInRangeRecursive(level, pos, Direction.EAST); + case Z -> this.anyPlayerInRange(level, pos) || this.isConnectedInRangeRecursive(level, pos, Direction.NORTH) || this.isConnectedInRangeRecursive(level, pos, Direction.SOUTH); + }; + } + + private boolean isConnectedInRangeRecursive(Level level, BlockPos pos, Direction dir) { + BlockPos dPos = pos.relative(dir); + + if (level.getBlockState(pos) == level.getBlockState(dPos)) { + return this.anyPlayerInRange(level, dPos) || this.isConnectedInRangeRecursive(level, dPos, dir); + } else { + return false; + } + } + + private boolean anyPlayerInRange(Level level, BlockPos pos) { + return level.getNearestPlayer(pos.getX() + 0.5D, pos.getY() + 0.5D, pos.getZ() + 0.5D, PLAYER_RANGE, false) != null; + } + + public void scheduleBlockUpdate(Level level, BlockPos pos) { + int offset = level.getBlockState(pos).getValue(DELAY); + int update = TICK_TIME - ((int) (level.getGameTime() - (offset * OFFSET_TIME)) % TICK_TIME); + level.scheduleTick(pos, this, update); + } + + @Override + @Deprecated + public void onPlace(BlockState state, Level level, BlockPos pos, BlockState oldState, boolean isMoving) { + this.scheduleBlockUpdate(level, pos); + } + + @Override + @Deprecated + public void entityInside(BlockState state, Level level, BlockPos pos, Entity entity) { + entity.hurt(TFDamageTypes.getDamageSource(level, TFDamageTypes.SLIDER), BLOCK_DAMAGE); + if (entity instanceof LivingEntity living) { + double kx = (pos.getX() + 0.5 - entity.getX()) * 2.0; + double kz = (pos.getZ() + 0.5 - entity.getZ()) * 2.0; + + living.knockback(2, kx, kz); + } + } +} diff --git a/src/main/java/twilightforest/block/SortLogCoreBlock.java b/src/main/java/twilightforest/block/SortLogCoreBlock.java new file mode 100644 index 0000000000..9d87f1a067 --- /dev/null +++ b/src/main/java/twilightforest/block/SortLogCoreBlock.java @@ -0,0 +1,133 @@ +package twilightforest.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.util.RandomSource; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.common.capabilities.ForgeCapabilities; +import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.network.PacketDistributor; +import twilightforest.TFConfig; +import twilightforest.data.tags.EntityTagGenerator; +import twilightforest.init.TFParticleType; +import twilightforest.network.ParticlePacket; +import twilightforest.network.TFPacketHandler; +import twilightforest.util.WorldUtil; + +import java.util.Comparator; +import java.util.HashMap; +import java.util.Map; + +public class SortLogCoreBlock extends SpecialMagicLogBlock { + + public SortLogCoreBlock(Properties properties) { + super(properties); + } + + @Override + public boolean doesCoreFunction() { + return !TFConfig.COMMON_CONFIG.MAGIC_TREES.disableSorting.get(); + } + + @Override + void performTreeEffect(Level level, BlockPos pos, RandomSource rand) { + Map inputHandlers = new HashMap<>(); + Map outputHandlers = new HashMap<>(); + + for (BlockPos blockPos : WorldUtil.getAllAround(pos, TFConfig.COMMON_CONFIG.MAGIC_TREES.sortingRange.get())) { + if (!blockPos.equals(pos)) { + BlockEntity blockEntity = level.getBlockEntity(blockPos); + + if (blockEntity != null) { + blockEntity.getCapability(ForgeCapabilities.ITEM_HANDLER).ifPresent(iItemHandler -> { + if (Math.abs(blockPos.getX() - pos.getX()) <= 2 && Math.abs(blockPos.getY() - pos.getY()) <= 2 && Math.abs(blockPos.getZ() - pos.getZ()) <= 2) { + inputHandlers.put(iItemHandler, Vec3.upFromBottomCenterOf(blockPos, 1.9D)); + } else outputHandlers.put(iItemHandler, Vec3.upFromBottomCenterOf(blockPos, 1.9D)); + }); + } + } + } + + level.getEntities((Entity) null, new AABB(pos).inflate(2), entity -> entity.isAlive() && entity.getType().is(EntityTagGenerator.SORTABLE_ENTITIES)).forEach(entity -> + entity.getCapability(ForgeCapabilities.ITEM_HANDLER, null).ifPresent(iItemHandler -> + inputHandlers.put(iItemHandler, entity.position().add(0D, entity.getBbHeight() + 0.9D, 0D)))); + + if (inputHandlers.isEmpty()) return; + + level.getEntities((Entity) null, new AABB(pos).inflate(16), entity -> entity.isAlive() && entity.getType().is(EntityTagGenerator.SORTABLE_ENTITIES)).forEach(entity -> + entity.getCapability(ForgeCapabilities.ITEM_HANDLER, null).ifPresent(iItemHandler -> { + if (!inputHandlers.containsKey(iItemHandler)) + outputHandlers.put(iItemHandler, entity.position().add(0D, entity.getBbHeight() + 0.9D, 0D)); + })); + + if (outputHandlers.isEmpty()) return; + + for (IItemHandler inputIItemHandler : inputHandlers.keySet()) { + for (int i = 0; i < inputIItemHandler.getSlots(); i++) { + ItemStack inputStack = inputIItemHandler.extractItem(i, 1, true); + if (!inputStack.isEmpty()) { + boolean transferred = false; + + Map outputsByCount = new HashMap<>(); + + for (IItemHandler outputIItemHandler : outputHandlers.keySet()) { + int count = 0; + for (int j = 0; j < outputIItemHandler.getSlots(); j++) { + ItemStack stack = outputIItemHandler.getStackInSlot(j); + if (stack.is(inputStack.getItem())) count += stack.getCount(); + } + if (count > 0) outputsByCount.put(count, outputIItemHandler); + } + + for (Integer count : outputsByCount.keySet().stream().sorted(Comparator.comparingInt(Integer::intValue).reversed()).toList()) { + IItemHandler outputIItemHandler = outputsByCount.get(count); + int firstProperStack = -1; + for (int j = 0; j < outputIItemHandler.getSlots(); j++) { + if (outputIItemHandler.isItemValid(j, inputStack)) { + ItemStack outputStack = outputIItemHandler.getStackInSlot(j); + + if (firstProperStack == -1 && outputStack.isEmpty()) { + firstProperStack = j; //We reference the index of the first empty slot, in case there is no stacks that aren't at max size + } else if (ItemStack.isSameItemSameTags(inputStack, outputStack) + && outputStack.getCount() < outputStack.getMaxStackSize() + && outputStack.getCount() < outputIItemHandler.getSlotLimit(j)) { + firstProperStack = j; + break; + } + } + } + if (firstProperStack != -1) { //If there weren't any non-full stacks, we transfer to an empty space instead + ItemStack newStack = inputIItemHandler.extractItem(i, 1, false); + if (!newStack.isEmpty() && outputIItemHandler.insertItem(firstProperStack, newStack, true).isEmpty()) { + outputIItemHandler.insertItem(firstProperStack, newStack, false); + transferred = true; + + Vec3 xyz = outputHandlers.get(outputIItemHandler); + Vec3 diff = inputHandlers.get(inputIItemHandler).subtract(xyz); + + for (ServerPlayer serverplayer : ((ServerLevel) level).players()) {//This is just particle math, we send a particle packet to every player in range + if (serverplayer.distanceToSqr(xyz) < 4096.0D) { + ParticlePacket particlePacket = new ParticlePacket(); + double x = diff.x - 0.25D + rand.nextDouble() * 0.5D; + double y = diff.y - 1.75D + rand.nextDouble() * 0.5D; + double z = diff.z - 0.25D + rand.nextDouble() * 0.5D; + particlePacket.queueParticle(TFParticleType.SORTING_PARTICLE.get(), false, xyz, new Vec3(x, y, z).scale(1D / diff.length())); + TFPacketHandler.CHANNEL.send(PacketDistributor.PLAYER.with(() -> serverplayer), particlePacket); + } + } + break; + } + } + } + if (transferred) break; + } + } + } + } +} diff --git a/src/main/java/twilightforest/block/SpecialFlowerPotBlock.java b/src/main/java/twilightforest/block/SpecialFlowerPotBlock.java new file mode 100644 index 0000000000..fbc6b64d2e --- /dev/null +++ b/src/main/java/twilightforest/block/SpecialFlowerPotBlock.java @@ -0,0 +1,33 @@ +package twilightforest.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.FlowerPotBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.gameevent.GameEvent; +import net.minecraft.world.phys.BlockHitResult; + +import org.jetbrains.annotations.Nullable; +import java.util.function.Supplier; + +public class SpecialFlowerPotBlock extends FlowerPotBlock { + + public SpecialFlowerPotBlock(@Nullable Supplier emptyPot, Supplier flower, Properties properties) { + super(emptyPot, flower, properties); + } + + @Override + public InteractionResult use(BlockState state, Level level, BlockPos pos, Player player, InteractionHand hand, BlockHitResult result) { + if(!this.isEmpty()) { + level.setBlock(pos, getEmptyPot().defaultBlockState(), 3); + level.gameEvent(player, GameEvent.BLOCK_CHANGE, pos); + return InteractionResult.sidedSuccess(level.isClientSide()); + } else { + return super.use(state, level, pos, player, hand, result); + } + } +} diff --git a/src/main/java/twilightforest/block/SpecialMagicLogBlock.java b/src/main/java/twilightforest/block/SpecialMagicLogBlock.java new file mode 100644 index 0000000000..cee71bcb75 --- /dev/null +++ b/src/main/java/twilightforest/block/SpecialMagicLogBlock.java @@ -0,0 +1,86 @@ +package twilightforest.block; + +import net.minecraft.ChatFormatting; +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.RandomSource; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.RotatedPillarBlock; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.phys.BlockHitResult; + +public abstract class SpecialMagicLogBlock extends RotatedPillarBlock { + + public static final BooleanProperty ACTIVE = BooleanProperty.create("active"); + + protected SpecialMagicLogBlock(BlockBehaviour.Properties properties) { + super(properties.strength(2.0F).sound(SoundType.WOOD).lightLevel((state) -> state.getValue(ACTIVE) ? 15 : 0)); + + this.registerDefaultState(this.getStateDefinition().any().setValue(ACTIVE, false)); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + super.createBlockStateDefinition(builder); + builder.add(ACTIVE); + } + + //No longer an override, but keep here for sanity + public int tickRate() { + return 20; + } + + @Override + @Deprecated + public void onPlace(BlockState state, Level level, BlockPos pos, BlockState oldState, boolean isMoving) { + level.scheduleTick(pos, this, this.tickRate()); + } + + @Override + @Deprecated + public void tick(BlockState state, ServerLevel level, BlockPos pos, RandomSource rand) { + if (level.isClientSide() || !state.getValue(ACTIVE) || !this.doesCoreFunction()) return; + + this.playSound(level, pos, rand); + this.performTreeEffect(level, pos, rand); + + level.scheduleTick(pos, this, this.tickRate()); + } + + @Override + @Deprecated + public InteractionResult use(BlockState state, Level level, BlockPos pos, Player player, InteractionHand hand, BlockHitResult result) { + if (!this.doesCoreFunction()) { + state.setValue(ACTIVE, false); + player.displayClientMessage(Component.translatable("misc.twilightforest.core_disabled", this.getName()).withStyle(ChatFormatting.RED), true); + return InteractionResult.SUCCESS; + } + + if (!state.getValue(ACTIVE)) { + level.setBlockAndUpdate(pos, state.setValue(ACTIVE, true)); + level.scheduleTick(pos, this, this.tickRate()); + return InteractionResult.SUCCESS; + } else if (state.getValue(ACTIVE)) { + level.setBlockAndUpdate(pos, state.setValue(ACTIVE, false)); + return InteractionResult.SUCCESS; + } + + return InteractionResult.PASS; + } + + abstract void performTreeEffect(Level level, BlockPos pos, RandomSource rand); + + public abstract boolean doesCoreFunction(); + + protected void playSound(Level level, BlockPos pos, RandomSource rand) { + } +} diff --git a/src/main/java/twilightforest/block/SpiralBrickBlock.java b/src/main/java/twilightforest/block/SpiralBrickBlock.java new file mode 100644 index 0000000000..6971a48989 --- /dev/null +++ b/src/main/java/twilightforest/block/SpiralBrickBlock.java @@ -0,0 +1,91 @@ +package twilightforest.block; + +import net.minecraft.core.Direction; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Mirror; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.EnumProperty; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.material.MaterialColor; +import twilightforest.enums.Diagonals; + +import org.jetbrains.annotations.Nullable; + +public class SpiralBrickBlock extends Block { + + public static final EnumProperty DIAGONAL = EnumProperty.create("diagonal", Diagonals.class); + public static final EnumProperty AXIS_FACING = EnumProperty.create("axis", Direction.Axis.class); + + public SpiralBrickBlock() { + super(Properties.of(Material.STONE, MaterialColor.STONE).requiresCorrectToolForDrops().strength(1.5F, 10.0F).sound(SoundType.STONE).noOcclusion()); + this.registerDefaultState(this.getStateDefinition().any().setValue(DIAGONAL, Diagonals.BOTTOM_RIGHT).setValue(AXIS_FACING, Direction.Axis.X)); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + super.createBlockStateDefinition(builder); + builder.add(AXIS_FACING, DIAGONAL); + } + + @Nullable + @Override + public BlockState getStateForPlacement(BlockPlaceContext context) { + if (context.isSecondaryUseActive()) { + //if sneaking, place on the y axis with glazed terracotta logic + return this.defaultBlockState() + .setValue(AXIS_FACING, Direction.Axis.Y) + .setValue(DIAGONAL, convertVerticalDirectionToDiagonal(context.getHorizontalDirection())); + } else { + //otherwise, place on the x and z with stair logic + return this.defaultBlockState() + .setValue(AXIS_FACING, context.getHorizontalDirection().getAxis() == Direction.Axis.X ? Direction.Axis.Z : Direction.Axis.X) //this is insanely jank but for some reason it rotates the wrong way normally. Might be a model issue but im too lazy to fix it, so this works + .setValue(DIAGONAL, getHorizontalDiagonalFromPlayerPlacement(context.getPlayer(), context.getHorizontalDirection(), context.getClickLocation().y - (double) context.getClickedPos().getY() > 0.5D)); + } + } + + private static Diagonals convertVerticalDirectionToDiagonal(Direction facing) { + return switch (facing) { + default -> Diagonals.TOP_RIGHT; + case SOUTH -> Diagonals.BOTTOM_LEFT; + case EAST -> Diagonals.TOP_LEFT; + case WEST -> Diagonals.BOTTOM_RIGHT; + }; + } + + private static Diagonals getHorizontalDiagonalFromPlayerPlacement(LivingEntity placer, Direction facing, boolean upper) { + return switch (facing) { + case NORTH, EAST -> Diagonals.getDiagonalFromUpDownLeftRight(placer.getDirection() != facing, upper); + case SOUTH, WEST -> Diagonals.getDiagonalFromUpDownLeftRight(placer.getDirection() == facing, upper); + default -> Diagonals.BOTTOM_RIGHT; + }; + + } + + @Override + public BlockState rotate(BlockState state, Rotation rot) { + if (rot == Rotation.NONE) return state; + + Direction.Axis axis = state.getValue(AXIS_FACING); + + if (axis == Direction.Axis.Y) { + return state.setValue(DIAGONAL, Diagonals.rotate(state.getValue(DIAGONAL), rot)); + } else { + if (rot == Rotation.CLOCKWISE_180 || (axis == Direction.Axis.X && rot == Rotation.COUNTERCLOCKWISE_90) || (axis == Direction.Axis.Z && rot == Rotation.CLOCKWISE_90)) + state = state.setValue(DIAGONAL, Diagonals.mirror(state.getValue(DIAGONAL), Mirror.LEFT_RIGHT)); + + return rot.ordinal() % 2 == 0 ? state : state.setValue(AXIS_FACING, axis == Direction.Axis.X ? Direction.Axis.Z : Direction.Axis.X); + } + } + + @Override + @Deprecated + public BlockState mirror(BlockState state, Mirror mirror) { + return state.setValue(DIAGONAL, Diagonals.mirrorOn(state.getValue(AXIS_FACING), state.getValue(DIAGONAL), mirror)); + } + +} diff --git a/src/main/java/twilightforest/block/StepSoundTFInsect.java b/src/main/java/twilightforest/block/StepSoundTFInsect.java deleted file mode 100644 index 2f79bab25a..0000000000 --- a/src/main/java/twilightforest/block/StepSoundTFInsect.java +++ /dev/null @@ -1,37 +0,0 @@ -package twilightforest.block; - -import net.minecraft.block.Block; - - -public class StepSoundTFInsect extends Block.SoundType { - - public StepSoundTFInsect(String par1Str, float par2, float par3) { - super(par1Str, par2, par3); - } - - /** - * Used when a block breaks, EXA: Player break, Shep eating grass, etc.. - */ - @Override - public String getBreakSound() - { - return "mob.slime.big"; - } - - /** - * Used when a entity walks over, or otherwise interacts with the block. - */ - public String getStepSound() - { - return "mob.slime.big"; - } - - /** - * Used when a player places a block. - */ - public String getPlaceSound() - { - return "mob.slime.big"; - } - -} diff --git a/src/main/java/twilightforest/block/StrongholdShieldBlock.java b/src/main/java/twilightforest/block/StrongholdShieldBlock.java new file mode 100644 index 0000000000..49e8f2d3ca --- /dev/null +++ b/src/main/java/twilightforest/block/StrongholdShieldBlock.java @@ -0,0 +1,60 @@ +package twilightforest.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.DirectionalBlock; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.phys.BlockHitResult; +import twilightforest.util.EntityUtil; + +import org.jetbrains.annotations.Nullable; + +public class StrongholdShieldBlock extends DirectionalBlock { + + public StrongholdShieldBlock(BlockBehaviour.Properties props) { + super(props); + this.registerDefaultState(this.getStateDefinition().any().setValue(FACING, Direction.DOWN)); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + super.createBlockStateDefinition(builder); + builder.add(FACING); + } + + @Nullable + @Override + public BlockState getStateForPlacement(BlockPlaceContext context) { + return defaultBlockState().setValue(FACING, context.getNearestLookingDirection().getOpposite()); + } + + @Override + @Deprecated + public float getDestroyProgress(BlockState state, Player player, BlockGetter getter, BlockPos pos) { + BlockHitResult ray = EntityUtil.rayTrace(player, range -> range + 1.0); + + Direction hitFace = ray.getDirection(); + boolean upOrDown = state.getValue(DirectionalBlock.FACING) == Direction.UP || state.getValue(DirectionalBlock.FACING) == Direction.DOWN; + Direction sideFace = state.getValue(DirectionalBlock.FACING).getOpposite(); + Direction upFace = state.getValue(DirectionalBlock.FACING); + + if (hitFace == (upOrDown ? upFace : sideFace)) { + return player.getDigSpeed(Blocks.STONE.defaultBlockState(), pos) / 1.5F / 100F; + } else { + return super.getDestroyProgress(state, player, getter, pos); + } + } + + @Override + public boolean canEntityDestroy(BlockState state, BlockGetter getter, BlockPos pos, Entity entity) { + return false; + } +} diff --git a/src/main/java/twilightforest/block/TFAlternativeStemLeavesBlock.java b/src/main/java/twilightforest/block/TFAlternativeStemLeavesBlock.java new file mode 100644 index 0000000000..1a74231cf3 --- /dev/null +++ b/src/main/java/twilightforest/block/TFAlternativeStemLeavesBlock.java @@ -0,0 +1,40 @@ +package twilightforest.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.LeavesBlock; +import net.minecraft.world.level.block.state.BlockState; + +public abstract class TFAlternativeStemLeavesBlock extends TFLeavesBlock { + public TFAlternativeStemLeavesBlock(Properties properties) { + super(properties); + } + + @Override + public void tick(BlockState state, ServerLevel serverLevel, BlockPos pos, RandomSource randomSource) { + serverLevel.setBlock(pos, updateDistance(state, serverLevel, pos), 3); + } + + //Vanilla copy from LeavesBlock class, due to getDistanceAt being a private static method, we need to copy and slightly alter both + protected BlockState updateDistance(BlockState state, LevelAccessor levelAccessor, BlockPos pos) { + int i = 7; + BlockPos.MutableBlockPos mutableBlockPos = new BlockPos.MutableBlockPos(); + + for(Direction direction : Direction.values()) { + mutableBlockPos.setWithOffset(pos, direction); + i = Math.min(i, getDistanceAt(levelAccessor.getBlockState(mutableBlockPos)) + 1); + if (i == 1) break; + } + + return state.setValue(DISTANCE, i); + } + + protected int getDistanceAt(BlockState state) { + return this.isStem(state) ? 0 : state.getBlock() instanceof LeavesBlock ? state.getValue(DISTANCE) : 7; + } + + protected abstract boolean isStem(BlockState state); +} diff --git a/src/main/java/twilightforest/block/TFBlocks.java b/src/main/java/twilightforest/block/TFBlocks.java deleted file mode 100644 index 565068cbf8..0000000000 --- a/src/main/java/twilightforest/block/TFBlocks.java +++ /dev/null @@ -1,232 +0,0 @@ -package twilightforest.block; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockCompressed; -import net.minecraft.block.BlockSlab; -import net.minecraft.block.material.MapColor; -import net.minecraft.init.Blocks; -import net.minecraft.item.ItemBlock; -import twilightforest.TwilightForestMod; -import twilightforest.item.ItemBlockTFMeta; -import cpw.mods.fml.common.registry.GameRegistry; - -public class TFBlocks { - - public static Block log; - public static Block leaves; - public static Block firefly; - public static Block portal; - public static Block mazestone; - public static Block hedge; - public static Block bossSpawner; - public static Block fireflyJar; - public static Block plant; - public static Block cicada; - public static Block root; - public static Block uncraftingTable; - public static Block fireJet; - public static Block nagastone; - public static Block sapling; - public static Block magicLog; - public static Block magicLogSpecial; - public static Block magicLeaves; - public static Block moonworm; - public static Block towerWood; - public static Block towerDevice; - //public static Block towerAntenna; - public static Block towerTranslucent; - public static Block trophy; - public static Block shield; - public static Block trophyPedestal; - public static Block auroraBlock; - public static Block underBrick; - public static Block thorns; - public static Block burntThorns; - public static Block thornRose; - public static Block leaves3; - public static Block deadrock; - public static Block darkleaves; - public static Block auroraPillar; - public static BlockSlab auroraSlab; - public static BlockSlab auroraDoubleSlab; - public static Block trollSteinn; - public static Block wispyCloud; - public static Block fluffyCloud; - public static Block giantCobble; - public static Block giantLog; - public static Block giantLeaves; - public static Block giantObsidian; - public static Block uberousSoil; - public static Block hugeStalk; - public static Block hugeGloomBlock; - public static Block trollVidr; - public static Block unripeTrollBer; - public static Block trollBer; - public static Block knightmetalStorage; - public static Block hugeLilyPad; - public static Block hugeWaterLily; - public static Block slider; - public static Block castleBlock; - public static Block castleMagic; - public static Block forceField; - public static Block cinderFurnace; - public static Block cinderFurnaceLit; - public static Block cinderLog; - public static Block castleDoor; - public static Block castleDoorVanished; - public static Block castleUnlock; - - public static void registerBlocks() { - - log = (new BlockTFLog()).setBlockName("TFLog"); - leaves = (new BlockTFLeaves()).setBlockName("TFLeaves").setBlockTextureName("leaves_oak"); - firefly = (new BlockTFFirefly()).setBlockName("TFFirefly"); - cicada = (new BlockTFCicada()).setBlockName("TFCicada"); - portal = (new BlockTFPortal()).setBlockName("TFPortal"); - mazestone = (new BlockTFMazestone()).setBlockName("TFMazestone"); - hedge = (new BlockTFHedge()).setBlockName("TFHedge"); - bossSpawner = (new BlockTFBossSpawner()).setBlockName("TFBossSpawner"); - fireflyJar = (new BlockTFFireflyJar()).setBlockName("TFFireflyJar"); - plant = (new BlockTFPlant()).setBlockName("TFPlant"); - root = (new BlockTFRoots()).setBlockName("TFRoots"); - uncraftingTable = (new BlockTFUncraftingTable()).setBlockName("TFUncraftingTable"); - fireJet = (new BlockTFFireJet()).setBlockName("TFFireJet"); - nagastone = (new BlockTFNagastone()).setBlockName("TFNagastone"); - sapling = (new BlockTFSapling()).setBlockName("TFSapling"); - magicLog = (new BlockTFMagicLog()).setBlockName("TFMagicLog"); - magicLogSpecial = (new BlockTFMagicLogSpecial()).setBlockName("TFMagicLogSpecial"); - magicLeaves = (new BlockTFMagicLeaves()).setBlockName("TFMagicLeaves"); - moonworm = (new BlockTFMoonworm()).setBlockName("TFMoonworm"); - towerWood = (new BlockTFTowerWood()).setBlockName("TFTowerStone"); - towerDevice = (new BlockTFTowerDevice()).setBlockName("TFTowerDevice"); - towerTranslucent = (new BlockTFTowerTranslucent()).setBlockName("TFTowerTranslucent"); - trophy = (new BlockTFTrophy()).setBlockName("TFTrophy"); - shield = (new BlockTFShield()).setBlockName("TFShield"); - trophyPedestal = (new BlockTFTrophyPedestal()).setBlockName("TFTrophyPedestal"); - auroraBlock = (new BlockTFAuroraBrick()).setBlockName("TFAuroraBrick"); - underBrick = (new BlockTFUnderBrick()).setBlockName("TFUnderBrick"); - thorns = (new BlockTFThorns()).setBlockName("TFThorns"); - burntThorns = (new BlockTFBurntThorns()).setBlockName("TFBurntThorns"); - thornRose = (new BlockTFThornRose()).setBlockName("TFThornRose").setBlockTextureName(TwilightForestMod.ID + ":thornRose"); - leaves3 = (new BlockTFLeaves3()).setBlockName("TFLeaves3").setBlockTextureName("leaves_oak"); - deadrock = (new BlockTFDeadrock()).setBlockName("TFDeadrock"); - darkleaves = (new BlockTFDarkLeaves()).setBlockName("DarkLeaves"); - auroraPillar = (new BlockTFAuroraPillar()).setBlockName("AuroraPillar"); - auroraSlab = (BlockSlab) (new BlockTFAuroraSlab(false)).setBlockName("AuroraSlab"); - auroraDoubleSlab = (BlockSlab) (new BlockTFAuroraSlab(true)).setBlockName("AuroraDoubleSlab"); - trollSteinn = (new BlockTFTrollSteinn()).setBlockName("TrollSteinn"); - wispyCloud = (new BlockTFWispyCloud()).setBlockName("WispyCloud"); - fluffyCloud = (new BlockTFFluffyCloud()).setBlockName("FluffyCloud"); - giantCobble = (new BlockTFGiantCobble()).setBlockName("GiantCobble"); - giantLog = (new BlockTFGiantLog()).setBlockName("GiantLog"); - giantLeaves = (new BlockTFGiantLeaves()).setBlockName("GiantLeaves"); - giantObsidian = (new BlockTFGiantObsidian()).setBlockName("GiantObsidian"); - uberousSoil = (new BlockTFUberousSoil()).setBlockName("UberousSoil"); - hugeStalk = (new BlockTFHugeStalk()).setBlockName("HugeStalk"); - hugeGloomBlock = (new BlockTFHugeGloomBlock()).setBlockName("HugeGloomBlock"); - trollVidr = (new BlockTFTrollRoot()).setBlockName("TrollVidr"); - unripeTrollBer = (new BlockTFUnripeTorchCluster()).setBlockName("UnripeTrollBer"); - trollBer = (new BlockTFRipeTorchCluster()).setBlockName("TrollBer"); - knightmetalStorage = (new BlockTFKnightmetalBlock()).setBlockName("KnightmetalBlock"); - hugeLilyPad = (new BlockTFHugeLilyPad()).setBlockName("HugeLilyPad"); - hugeWaterLily = (new BlockTFHugeWaterLily()).setBlockName("HugeWaterLily").setBlockTextureName(TwilightForestMod.ID + ":huge_waterlily"); - slider = (new BlockTFSlider()).setBlockName("Slider"); - castleBlock = (new BlockTFCastleBlock()).setBlockName("CastleBrick"); - castleMagic = (new BlockTFCastleMagic()).setBlockName("CastleMagic"); - forceField = (new BlockTFForceField()).setBlockName("ForceField"); - cinderFurnace = (new BlockTFCinderFurnace(false)).setBlockName("CinderFurnaceIdle"); - cinderFurnaceLit = (new BlockTFCinderFurnace(true)).setBlockName("CinderFurnaceLit"); - cinderLog = (new BlockTFCinderLog()).setBlockName("CinderLog"); - castleDoor = (new BlockTFCastleDoor(false)).setBlockName("CastleDoor"); - castleDoorVanished = (new BlockTFCastleDoor(true)).setBlockName("CastleDoorVanished"); - castleUnlock = (new BlockTFCastleUnlock()).setBlockName("CastleUnlock"); - - // register blocks with their pickup values - registerMyBlock(log); - registerMyBlock(root); - registerMyBlock(leaves); - registerMyBlock(firefly, ItemBlock.class); - registerMyBlock(cicada, ItemBlock.class); - registerMyBlock(portal, ItemBlock.class); - registerMyBlock(mazestone); - registerMyBlock(hedge); - registerMyBlock(bossSpawner); - registerMyBlock(fireflyJar, ItemBlock.class); - registerMyBlock(plant, twilightforest.item.ItemBlockTFPlant.class); - registerMyBlock(uncraftingTable, ItemBlock.class); - registerMyBlock(fireJet); - registerMyBlock(nagastone); - registerMyBlock(sapling); - registerMyBlock(moonworm, ItemBlock.class); - registerMyBlock(magicLog); - registerMyBlock(magicLeaves); - registerMyBlock(magicLogSpecial); - registerMyBlock(towerWood); - registerMyBlock(towerDevice); - registerMyBlock(towerTranslucent); - registerMyBlock(trophy); - registerMyBlock(shield); - registerMyBlock(trophyPedestal); - registerMyBlock(auroraBlock, ItemBlock.class); - registerMyBlock(underBrick); - registerMyBlock(thorns, twilightforest.item.ItemBlockTFThorns.class, thorns, ((BlockTFThorns) thorns).getNames()); - registerMyBlock(burntThorns, ItemBlock.class); - registerMyBlock(thornRose, ItemBlock.class); - registerMyBlock(leaves3); - registerMyBlock(deadrock, twilightforest.item.ItemBlockTFDeadrock.class, deadrock, BlockTFDeadrock.names); - registerMyBlock(darkleaves, ItemBlock.class); - registerMyBlock(auroraPillar, ItemBlock.class); - registerMyBlock(auroraSlab, twilightforest.item.ItemBlockTFAuroraSlab.class, ((BlockSlab) auroraSlab), ((BlockSlab) auroraDoubleSlab), false); - registerMyBlock(auroraDoubleSlab, twilightforest.item.ItemBlockTFAuroraSlab.class, ((BlockSlab) auroraSlab), ((BlockSlab) auroraDoubleSlab), true); - registerMyBlock(trollSteinn, ItemBlock.class); - registerMyBlock(wispyCloud, ItemBlock.class); - registerMyBlock(fluffyCloud, ItemBlock.class); - registerMyBlock(giantCobble, ItemBlock.class); - registerMyBlock(giantLog, ItemBlock.class); - registerMyBlock(giantLeaves, ItemBlock.class); - registerMyBlock(giantObsidian, ItemBlock.class); - registerMyBlock(uberousSoil, ItemBlock.class); - registerMyBlock(hugeStalk, ItemBlock.class); - registerMyBlock(hugeGloomBlock, ItemBlock.class); - registerMyBlock(trollVidr, ItemBlock.class); - registerMyBlock(unripeTrollBer, ItemBlock.class); - registerMyBlock(trollBer, ItemBlock.class); - registerMyBlock(knightmetalStorage, ItemBlock.class); - registerMyBlock(hugeLilyPad, twilightforest.item.ItemBlockTFHugeLilyPad.class); - registerMyBlock(hugeWaterLily, twilightforest.item.ItemBlockTFHugeWaterLily.class); - registerMyBlock(slider); - registerMyBlock(castleBlock); - registerMyBlock(castleMagic); - registerMyBlock(forceField); - registerMyBlock(cinderFurnace, ItemBlock.class); - registerMyBlock(cinderFurnaceLit, ItemBlock.class); - registerMyBlock(cinderLog); - registerMyBlock(castleDoor); - registerMyBlock(castleDoorVanished); - - // fire info - Blocks.fire.setFireInfo(log, 5, 5); - Blocks.fire.setFireInfo(leaves, 30, 60); - Blocks.fire.setFireInfo(leaves3, 30, 60); - } - - private static void registerMyBlock(Block block, Class pickup, BlockSlab singleSlab, BlockSlab doubleSlab, boolean isDouble) { - GameRegistry.registerBlock(block, pickup, block.getUnlocalizedName(), singleSlab, doubleSlab, isDouble); - - } - - private static void registerMyBlock(Block block, Class pickup, Block blockAgain, String[] names) { - GameRegistry.registerBlock(block, pickup, block.getUnlocalizedName(), blockAgain, names); - } - - private static void registerMyBlock(Block block, Class pickup) - { - GameRegistry.registerBlock(block, pickup, block.getUnlocalizedName()); - } - - private static void registerMyBlock(Block block) - { - GameRegistry.registerBlock(block, ItemBlockTFMeta.class, block.getUnlocalizedName()); - } - -} diff --git a/src/main/java/twilightforest/block/TFChestBlock.java b/src/main/java/twilightforest/block/TFChestBlock.java new file mode 100644 index 0000000000..277ec53f81 --- /dev/null +++ b/src/main/java/twilightforest/block/TFChestBlock.java @@ -0,0 +1,19 @@ +package twilightforest.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.ChestBlock; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import twilightforest.block.entity.TwilightChestEntity; +import twilightforest.init.TFBlockEntities; + +public class TFChestBlock extends ChestBlock { + public TFChestBlock(Properties properties) { + super(properties, TFBlockEntities.TF_CHEST::get); + } + + @Override + public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { + return new TwilightChestEntity(pos, state); + } +} diff --git a/src/main/java/twilightforest/block/TFHorizontalBlock.java b/src/main/java/twilightforest/block/TFHorizontalBlock.java new file mode 100644 index 0000000000..31a2038209 --- /dev/null +++ b/src/main/java/twilightforest/block/TFHorizontalBlock.java @@ -0,0 +1,30 @@ +package twilightforest.block; + +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.HorizontalDirectionalBlock; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.block.state.StateDefinition; + +import org.jetbrains.annotations.Nullable; + +import net.minecraft.world.level.block.state.BlockBehaviour.Properties; + +public class TFHorizontalBlock extends HorizontalDirectionalBlock { + + public TFHorizontalBlock(Properties properties) { + super(properties); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + super.createBlockStateDefinition(builder); + builder.add(FACING); + } + + @Nullable + @Override + public BlockState getStateForPlacement(BlockPlaceContext context) { + return this.defaultBlockState().setValue(FACING, context.getHorizontalDirection().getOpposite()); + } +} diff --git a/src/main/java/twilightforest/block/TFLeavesBlock.java b/src/main/java/twilightforest/block/TFLeavesBlock.java new file mode 100644 index 0000000000..a6724eabbf --- /dev/null +++ b/src/main/java/twilightforest/block/TFLeavesBlock.java @@ -0,0 +1,24 @@ +package twilightforest.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.block.LeavesBlock; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; + +public class TFLeavesBlock extends LeavesBlock { + public TFLeavesBlock(BlockBehaviour.Properties properties) { + super(properties); + } + + @Override + public int getFlammability(BlockState state, BlockGetter getter, BlockPos pos, Direction face) { + return 60; + } + + @Override + public int getFireSpreadSpeed(BlockState state, BlockGetter getter, BlockPos pos, Direction face) { + return 30; + } +} diff --git a/src/main/java/twilightforest/block/TFLogBlock.java b/src/main/java/twilightforest/block/TFLogBlock.java new file mode 100644 index 0000000000..de4af62ce0 --- /dev/null +++ b/src/main/java/twilightforest/block/TFLogBlock.java @@ -0,0 +1,25 @@ +package twilightforest.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.block.RotatedPillarBlock; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; + +public class TFLogBlock extends RotatedPillarBlock { + + public TFLogBlock(BlockBehaviour.Properties properties) { + super(properties); + } + + @Override + public int getFlammability(BlockState state, BlockGetter getter, BlockPos pos, Direction face) { + return 5; + } + + @Override + public int getFireSpreadSpeed(BlockState state, BlockGetter getter, BlockPos pos, Direction face) { + return 5; + } +} diff --git a/src/main/java/twilightforest/block/TFPlantBlock.java b/src/main/java/twilightforest/block/TFPlantBlock.java new file mode 100644 index 0000000000..2b2a5df886 --- /dev/null +++ b/src/main/java/twilightforest/block/TFPlantBlock.java @@ -0,0 +1,57 @@ +package twilightforest.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.BonemealableBlock; +import net.minecraft.world.level.block.BushBlock; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Material; +import net.minecraftforge.common.PlantType; +import twilightforest.data.tags.BlockTagGenerator; +import twilightforest.init.TFBlocks; + +public abstract class TFPlantBlock extends BushBlock implements BonemealableBlock { + + protected TFPlantBlock(BlockBehaviour.Properties properties) { + super(properties); + } + + public static boolean canPlaceRootAt(LevelReader reader, BlockPos pos) { + return reader.getBlockState(pos.above()).is(BlockTagGenerator.PLANTS_HANG_ON); + } + + @Override + public PlantType getPlantType(BlockGetter getter, BlockPos pos) { + return PlantType.PLAINS; + } + + @Override + public boolean isValidBonemealTarget(LevelReader reader, BlockPos pos, BlockState state, boolean client) { + return false; + } + + @Override + public boolean isBonemealSuccess(Level level, RandomSource random, BlockPos pos, BlockState state) { + return false; + } + + @Override + public void performBonemeal(ServerLevel level, RandomSource randomSource, BlockPos pos, BlockState state) { + } + + @Override + public int getFlammability(BlockState state, BlockGetter getter, BlockPos pos, Direction face) { + return 100; + } + + @Override + public int getFireSpreadSpeed(BlockState state, BlockGetter getter, BlockPos pos, Direction face) { + return 60; + } +} diff --git a/src/main/java/twilightforest/block/TFPortalBlock.java b/src/main/java/twilightforest/block/TFPortalBlock.java new file mode 100644 index 0000000000..0bc8a07337 --- /dev/null +++ b/src/main/java/twilightforest/block/TFPortalBlock.java @@ -0,0 +1,312 @@ +package twilightforest.block; + +import net.minecraft.advancements.Advancement; +import net.minecraft.advancements.DisplayInfo; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.core.registries.Registries; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundSource; +import net.minecraft.util.RandomSource; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LightningBolt; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.HalfTransparentBlock; +import net.minecraft.world.level.block.LiquidBlockContainer; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.material.Fluid; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.level.material.Fluids; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.event.ForgeEventFactory; +import net.minecraftforge.network.PacketDistributor; +import org.apache.commons.lang3.mutable.MutableInt; +import twilightforest.TFConfig; +import twilightforest.client.MissingAdvancementToast; +import twilightforest.data.tags.BlockTagGenerator; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFSounds; +import twilightforest.network.MissingAdvancementToastPacket; +import twilightforest.network.TFPacketHandler; +import twilightforest.util.LandmarkUtil; +import twilightforest.util.PlayerHelper; +import twilightforest.world.NoReturnTeleporter; +import twilightforest.world.TFTeleporter; +import twilightforest.world.registration.TFGenerationSettings; + +import org.jetbrains.annotations.Nullable; + +import java.util.*; + +// KelpBlock seems to use ILiquidContainer as it's a block that permanently has water, so I suppose in best practices we also use this interface as well? +public class TFPortalBlock extends HalfTransparentBlock implements LiquidBlockContainer { + + public static final BooleanProperty DISALLOW_RETURN = BooleanProperty.create("is_one_way"); + + private static final VoxelShape AABB = Shapes.create(new AABB(0.0F, 0.0F, 0.0F, 1.0F, 0.8125F, 1.0F)); + private static ResourceKey cachedOriginDimension; + + public static final Component PORTAL_UNWORTHY = Component.translatable("misc.twilightforest.portal_unworthy"); + private static final int MIN_PORTAL_SIZE = 4; + private static final HashSet playersNotified = new HashSet<>(); + + public TFPortalBlock(BlockBehaviour.Properties properties) { + super(properties); + this.registerDefaultState(this.getStateDefinition().any().setValue(DISALLOW_RETURN, false)); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + super.createBlockStateDefinition(builder); + builder.add(DISALLOW_RETURN); + } + + @Override + @Deprecated + public VoxelShape getShape(BlockState state, BlockGetter getter, BlockPos pos, CollisionContext context) { + return AABB; + } + + @Override + @Deprecated + public VoxelShape getCollisionShape(BlockState state, BlockGetter getter, BlockPos pos, CollisionContext context) { + return state.getValue(DISALLOW_RETURN) ? AABB : Shapes.empty(); + } + + @Override + public FluidState getFluidState(BlockState state) { + // The portal itself is kind of technically water, and this checks the checkbox in Sugar Cane logic to not destroy itself when portal is made. + return Fluids.WATER.getFlowing(1, false); // 1 is minimum value. Minecraft wiki at time of this writing has the values backwards. + } + + public boolean tryToCreatePortal(Level level, BlockPos pos, ItemEntity catalyst, @Nullable Player player) { + + BlockState state = level.getBlockState(pos); + + if (this.canFormPortal(state) && level.getBlockState(pos.below()).isFaceSturdy(level, pos, Direction.UP)) { + Map blocksChecked = new HashMap<>(); + blocksChecked.put(pos, true); + + MutableInt size = new MutableInt(0); + + if (recursivelyValidatePortal(level, pos, blocksChecked, size, state) && size.intValue() >= MIN_PORTAL_SIZE) { + + if (TFConfig.COMMON_CONFIG.checkPortalDestination.get()) { + boolean checkProgression = LandmarkUtil.isProgressionEnforced(catalyst.level); + if (!TFTeleporter.isSafeAround(level, pos, catalyst, checkProgression)) { + // TODO: "failure" effect - particles? + if (player != null) { + player.displayClientMessage(Component.translatable("misc.twilightforest.portal_unsafe"), true); + } + return false; + } + } + + catalyst.getItem().shrink(1); + causeLightning(level, pos, TFConfig.COMMON_CONFIG.portalLightning.get()); + + for (Map.Entry checkedPos : blocksChecked.entrySet()) { + if (checkedPos.getValue()) { + level.setBlock(checkedPos.getKey(), TFBlocks.TWILIGHT_PORTAL.get().defaultBlockState(), 2); + } + } + + return true; + } + } + + return false; + } + + public boolean canFormPortal(BlockState state) { + return state.is(BlockTagGenerator.PORTAL_POOL) || state.getBlock() == this && state.getValue(DISALLOW_RETURN); + } + + private static void causeLightning(Level level, BlockPos pos, boolean fake) { + LightningBolt bolt = new LightningBolt(EntityType.LIGHTNING_BOLT, level); + bolt.setPos(pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5); + bolt.setVisualOnly(fake); + level.addFreshEntity(bolt); + + if (fake && level instanceof ServerLevel) { + double range = 3.0D; + List list = level.getEntitiesOfClass(Entity.class, new AABB(pos).inflate(range)); + + for (Entity victim : list) { + if (!ForgeEventFactory.onEntityStruckByLightning(victim, bolt)) { + victim.thunderHit((ServerLevel) level, bolt); + } + } + } + } + + public static boolean recursivelyValidatePortal(Level level, BlockPos pos, Map blocksChecked, MutableInt portalSize, BlockState poolBlock) { + if (portalSize.incrementAndGet() > TFConfig.COMMON_CONFIG.maxPortalSize.get()) return false; + + boolean isPoolProbablyEnclosed = true; + + for (int i = 0; i < 4 && portalSize.intValue() <= TFConfig.COMMON_CONFIG.maxPortalSize.get(); i++) { + BlockPos positionCheck = pos.relative(Direction.from2DDataValue(i)); + + if (!blocksChecked.containsKey(positionCheck)) { + BlockState state = level.getBlockState(positionCheck); + + if (state == poolBlock && level.getBlockState(positionCheck.below()).isFaceSturdy(level, pos, Direction.UP)) { + blocksChecked.put(positionCheck, true); + if (isPoolProbablyEnclosed) { + isPoolProbablyEnclosed = recursivelyValidatePortal(level, positionCheck, blocksChecked, portalSize, poolBlock); + } + + } else if (isGrassOrDirt(state) && isNatureBlock(level.getBlockState(positionCheck.above()))) { + blocksChecked.put(positionCheck, false); + + } else return false; + } + } + + return isPoolProbablyEnclosed; + } + + private static boolean isNatureBlock(BlockState state) { + return state.is(BlockTagGenerator.PORTAL_DECO); + } + + private static boolean isGrassOrDirt(BlockState state) { + return state.is(BlockTagGenerator.PORTAL_EDGE); + } + + @Override + @Deprecated + public void neighborChanged(BlockState state, Level level, BlockPos pos, Block block, BlockPos fromPos, boolean isMoving) { + boolean good = level.getBlockState(pos.below()).isFaceSturdy(level, pos, Direction.UP); + + for (Direction facing : Direction.Plane.HORIZONTAL) { + if (!good) break; + + BlockState neighboringState = level.getBlockState(pos.relative(facing)); + + good = isGrassOrDirt(neighboringState) || neighboringState == state; + } + + if (!good) { + level.levelEvent(2001, pos, Block.getId(state)); + level.setBlock(pos, Blocks.WATER.defaultBlockState(), 0b11); + } + } + + @Override + public void entityInside(BlockState state, Level level, BlockPos pos, Entity entity) { + if (state == this.defaultBlockState()) { + if (entity instanceof ServerPlayer player && !player.isCreative() && !player.isSpectator() && TFConfig.getPortalLockingAdvancement(player) != null) { + Advancement requirement = PlayerHelper.getAdvancement(player, Objects.requireNonNull(TFConfig.getPortalLockingAdvancement(player))); + + if (requirement != null && !PlayerHelper.doesPlayerHaveRequiredAdvancement(player, requirement)) { + player.displayClientMessage(PORTAL_UNWORTHY, true); + + if (!TFPortalBlock.isPlayerNotifiedOfRequirement(player)) { + // .doesPlayerHaveRequiredAdvancement null-checks already, so we can skip null-checking the `requirement` + DisplayInfo info = requirement.getDisplay(); + TFPacketHandler.CHANNEL.send(PacketDistributor.PLAYER.with(() -> player), info == null ? MissingAdvancementToast.FALLBACK : new MissingAdvancementToastPacket(info.getTitle(), info.getIcon())); + + TFPortalBlock.playerNotifiedOfRequirement(player); + } + + return; + } + } + + attemptSendEntity(entity, false, true); + } + } + + public static boolean isPlayerNotifiedOfRequirement(ServerPlayer player) { + return playersNotified.contains(player); + } + + public static void playerNotifiedOfRequirement(ServerPlayer player) { + playersNotified.add(player); + } + + private static ResourceKey getDestination(Entity entity) { + if (cachedOriginDimension == null) cachedOriginDimension = ResourceKey.create(Registries.DIMENSION, new ResourceLocation(TFConfig.COMMON_CONFIG.originDimension.get())); + return !entity.getCommandSenderWorld().dimension().location().equals(TFGenerationSettings.DIMENSION) + ? TFGenerationSettings.DIMENSION_KEY : cachedOriginDimension; + } + + public static void attemptSendEntity(Entity entity, boolean forcedEntry, boolean makeReturnPortal) { + if (!entity.isAlive() || entity.getLevel().isClientSide()) { + return; + } + + if (entity.isPassenger() || entity.isVehicle() || !entity.canChangeDimensions()) { + return; + } + + ResourceKey destination = getDestination(entity); + ServerLevel serverWorld = entity.getCommandSenderWorld().getServer().getLevel(destination); + + if (serverWorld == null) + return; + + entity.changeDimension(serverWorld, makeReturnPortal ? new TFTeleporter(forcedEntry) : new NoReturnTeleporter()); + + if (destination == TFGenerationSettings.DIMENSION_KEY && entity instanceof ServerPlayer playerMP && forcedEntry) { + // set respawn point for TF dimension to near the arrival portal, only if we spawn here on world creation + playerMP.setRespawnPosition(destination, playerMP.blockPosition(), playerMP.getYRot(), true, false); + } + + } + + // Full [VanillaCopy] of BlockPortal.randomDisplayTick + @Override + @OnlyIn(Dist.CLIENT) + public void animateTick(BlockState state, Level level, BlockPos pos, RandomSource rand) { + int random = rand.nextInt(100); + if (state.getValue(DISALLOW_RETURN) && random < 80) return; + + if (random == 0) { + level.playLocalSound(pos.getX() + 0.5D, pos.getY() + 0.5D, pos.getZ() + 0.5D, TFSounds.PORTAL_WHOOSH.get(), SoundSource.BLOCKS, 0.5F, rand.nextFloat() * 0.4F + 0.8F, false); + } + + for (int i = 0; i < 4; ++i) { + double xPos = pos.getX() + rand.nextFloat(); + double yPos = pos.getY() + 1D; + double zPos = pos.getZ() + rand.nextFloat(); + double xSpeed = (rand.nextFloat() - 0.5D) * 0.5D; + double ySpeed = rand.nextFloat(); + double zSpeed = (rand.nextFloat() - 0.5D) * 0.5D; + + level.addParticle(ParticleTypes.PORTAL, xPos, yPos, zPos, xSpeed, ySpeed, zSpeed); + } + } + + @Override + public boolean canPlaceLiquid(BlockGetter getter, BlockPos pos, BlockState state, Fluid fluid) { + return false; + } + + @Override + public boolean placeLiquid(LevelAccessor accessor, BlockPos pos, BlockState state, FluidState fluidState) { + return false; + } +} diff --git a/src/main/java/twilightforest/block/TFSignBlock.java b/src/main/java/twilightforest/block/TFSignBlock.java new file mode 100644 index 0000000000..653936289d --- /dev/null +++ b/src/main/java/twilightforest/block/TFSignBlock.java @@ -0,0 +1,22 @@ +package twilightforest.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.StandingSignBlock; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.WoodType; +import twilightforest.block.entity.TFSignBlockEntity; + +import org.jetbrains.annotations.Nullable; + +public class TFSignBlock extends StandingSignBlock { + public TFSignBlock(Properties properties, WoodType type) { + super(properties, type); + } + + @Nullable + @Override + public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { + return new TFSignBlockEntity(pos, state); + } +} diff --git a/src/main/java/twilightforest/block/TFSmokerBlock.java b/src/main/java/twilightforest/block/TFSmokerBlock.java new file mode 100644 index 0000000000..5b16038239 --- /dev/null +++ b/src/main/java/twilightforest/block/TFSmokerBlock.java @@ -0,0 +1,38 @@ +package twilightforest.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.BaseEntityBlock; +import net.minecraft.world.level.block.RenderShape; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityTicker; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import twilightforest.block.entity.TFSmokerBlockEntity; +import twilightforest.init.TFBlockEntities; + +import org.jetbrains.annotations.Nullable; + +public class TFSmokerBlock extends BaseEntityBlock { + + public TFSmokerBlock(Properties properties) { + super(properties); + } + + @Override + public RenderShape getRenderShape(BlockState state) { + return RenderShape.MODEL; + } + + @Nullable + @Override + public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { + return new TFSmokerBlockEntity(pos, state); + } + + @Nullable + @Override + public BlockEntityTicker getTicker(Level level, BlockState state, BlockEntityType type) { + return createTickerHelper(type, TFBlockEntities.SMOKER.get(), TFSmokerBlockEntity::tick); + } +} diff --git a/src/main/java/twilightforest/block/TFWallSignBlock.java b/src/main/java/twilightforest/block/TFWallSignBlock.java new file mode 100644 index 0000000000..57c9495e07 --- /dev/null +++ b/src/main/java/twilightforest/block/TFWallSignBlock.java @@ -0,0 +1,22 @@ +package twilightforest.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.WallSignBlock; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.WoodType; +import twilightforest.block.entity.TFSignBlockEntity; + +import org.jetbrains.annotations.Nullable; + +public class TFWallSignBlock extends WallSignBlock { + public TFWallSignBlock(Properties properties, WoodType type) { + super(properties, type); + } + + @Nullable + @Override + public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { + return new TFSignBlockEntity(pos, state); + } +} diff --git a/src/main/java/twilightforest/block/ThornLeavesBlock.java b/src/main/java/twilightforest/block/ThornLeavesBlock.java new file mode 100644 index 0000000000..be3c7ee800 --- /dev/null +++ b/src/main/java/twilightforest/block/ThornLeavesBlock.java @@ -0,0 +1,15 @@ +package twilightforest.block; + +import net.minecraft.world.level.block.state.BlockState; +import twilightforest.init.TFBlocks; + +public class ThornLeavesBlock extends TFAlternativeStemLeavesBlock { + public ThornLeavesBlock(Properties properties) { + super(properties); + } + + @Override + protected boolean isStem(BlockState state) { + return state.is(TFBlocks.BROWN_THORNS.get()) || state.is(TFBlocks.GREEN_THORNS.get()); + } +} diff --git a/src/main/java/twilightforest/block/ThornRoseBlock.java b/src/main/java/twilightforest/block/ThornRoseBlock.java new file mode 100644 index 0000000000..e464aa2d32 --- /dev/null +++ b/src/main/java/twilightforest/block/ThornRoseBlock.java @@ -0,0 +1,64 @@ +package twilightforest.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.*; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; +import twilightforest.init.TFBlocks; + +public class ThornRoseBlock extends BushBlock { + private static final float RADIUS = 0.4F; + private static final VoxelShape AABB = Shapes.create(new AABB(0.5F - RADIUS, 0.5F - RADIUS, 0.5F - RADIUS, 0.5F + RADIUS, .5F + RADIUS, 0.5F + RADIUS)); + + public ThornRoseBlock(Properties properties) { + super(properties); + this.registerDefaultState(this.stateDefinition.any().setValue(DirectionalBlock.FACING, Direction.UP)); + } + + @Override + protected boolean mayPlaceOn(BlockState state, BlockGetter level, BlockPos pos) { + return true; + } + + @Override + public boolean canSurvive(BlockState state, LevelReader level, BlockPos pos) { + BlockState blockstate = level.getBlockState(pos.relative(state.getValue(DirectionalBlock.FACING).getOpposite())); + return blockstate.is(TFBlocks.BROWN_THORNS.get()) || blockstate.is(TFBlocks.GREEN_THORNS.get()) || blockstate.isFaceSturdy(level, pos, state.getValue(DirectionalBlock.FACING)); + } + + @Override + @SuppressWarnings("deprecation") + public VoxelShape getShape(BlockState state, BlockGetter getter, BlockPos pos, CollisionContext context) { + return AABB; + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + builder.add(DirectionalBlock.FACING); + } + + @Override + public BlockState getStateForPlacement(BlockPlaceContext context) { + return this.defaultBlockState().setValue(DirectionalBlock.FACING, context.getClickedFace()); + } + + @Override + @SuppressWarnings("deprecation") + public BlockState rotate(BlockState state, Rotation rotation) { + return state.setValue(DirectionalBlock.FACING, rotation.rotate(state.getValue(DirectionalBlock.FACING))); + } + + @Override + @SuppressWarnings("deprecation") + public BlockState mirror(BlockState state, Mirror mirror) { + return state.rotate(mirror.getRotation(state.getValue(DirectionalBlock.FACING))); + } +} diff --git a/src/main/java/twilightforest/block/ThornsBlock.java b/src/main/java/twilightforest/block/ThornsBlock.java new file mode 100644 index 0000000000..61857d54b4 --- /dev/null +++ b/src/main/java/twilightforest/block/ThornsBlock.java @@ -0,0 +1,194 @@ +package twilightforest.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.PipeBlock; +import net.minecraft.world.level.block.SimpleWaterloggedBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.level.material.Fluids; +import net.minecraft.world.level.material.PushReaction; +import net.minecraft.world.level.pathfinder.BlockPathTypes; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFDamageTypes; + +import org.jetbrains.annotations.Nullable; + +public class ThornsBlock extends ConnectableRotatedPillarBlock implements SimpleWaterloggedBlock { + + protected static final VoxelShape BASE_SHAPE = Block.box(3.0D, 3.0D, 3.0D, 13.0D, 13.0D, 13.0D); + + protected static final VoxelShape WEST_SHAPE = Block.box(0.0D, 3.0D, 3.0D, 3.0D, 13.0D, 13.0D); + protected static final VoxelShape EAST_SHAPE = Block.box(13.0D, 3.0D, 3.0D, 16.0D, 13.0D, 13.0D); + protected static final VoxelShape DOWN_SHAPE = Block.box(3.0D, 0.0D, 3.0D, 13.0D, 3.0D, 13.0D); + protected static final VoxelShape UP_SHAPE = Block.box(3.0D, 13.0D, 3.0D, 13.0D, 16.0D, 13.0D); + protected static final VoxelShape NORTH_SHAPE = Block.box(3.0D, 3.0D, 0.0D, 13.0D, 13.0D, 3.0D); + protected static final VoxelShape SOUTH_SHAPE = Block.box(3.0D, 3.0D, 13.0D, 13.0D, 13.0D, 16.0D); + + private static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED; + + private static final float THORN_DAMAGE = 4.0F; + + public ThornsBlock(Properties props) { + super(props, 10); + this.registerDefaultState(this.getStateDefinition().any().setValue(WATERLOGGED, false).setValue(AXIS, Direction.Axis.Y) + .setValue(DOWN, false).setValue(UP, false) + .setValue(NORTH, false).setValue(SOUTH, false) + .setValue(WEST, false).setValue(EAST, false)); + } + + @Override + public boolean canConnectTo(BlockState state, boolean solidSide) { + return (state.getBlock() instanceof ThornsBlock + || state.getBlock().equals(TFBlocks.THORN_ROSE.get()) + || state.getBlock().equals(TFBlocks.THORN_LEAVES.get()) + || state.getBlock().equals(TFBlocks.WEATHERED_DEADROCK.get())); + } + + @Override + @SuppressWarnings("deprecation") + public VoxelShape getShape(BlockState state, BlockGetter getter, BlockPos pos, CollisionContext context) { + VoxelShape shape = BASE_SHAPE; + + if (state.getValue(DOWN)) shape = Shapes.or(shape, DOWN_SHAPE); + if (state.getValue(UP)) shape = Shapes.or(shape, UP_SHAPE); + if (state.getValue(NORTH)) shape = Shapes.or(shape, NORTH_SHAPE); + if (state.getValue(SOUTH)) shape = Shapes.or(shape, SOUTH_SHAPE); + if (state.getValue(WEST)) shape = Shapes.or(shape, WEST_SHAPE); + if (state.getValue(EAST)) shape = Shapes.or(shape, EAST_SHAPE); + + return shape; + } + + @Nullable + @Override + public BlockPathTypes getBlockPathType(BlockState state, BlockGetter getter, BlockPos pos, @Nullable Mob entity) { + return BlockPathTypes.DAMAGE_OTHER; + } + + @Override + @SuppressWarnings("deprecation") + public void entityInside(BlockState state, Level level, BlockPos pos, Entity entity) { + entity.hurt(TFDamageTypes.getDamageSource(level, TFDamageTypes.THORNS), THORN_DAMAGE); + } + + @Override + public void stepOn(Level level, BlockPos pos, BlockState state, Entity entity) { + + if (state.getBlock() instanceof ThornsBlock && state.getValue(AXIS) == Direction.Axis.Y) { + entityInside(state, level, pos, entity); + } + + super.stepOn(level, pos, state, entity); + } + + @Override + public boolean onDestroyedByPlayer(BlockState state, Level level, BlockPos pos, Player player, boolean willHarvest, FluidState fluid) { + if (!player.getAbilities().instabuild) { + if (!level.isClientSide()) { + // grow more + this.doThornBurst(level, pos, state); + } + return false; + } else { + return super.onDestroyedByPlayer(state, level, pos, player, willHarvest, fluid); + } + } + + @Override + @SuppressWarnings("deprecation") + public PushReaction getPistonPushReaction(BlockState state) { + return PushReaction.BLOCK; + } + + /** + * Grow thorns out of both the ends, then maybe in another direction too + */ + private void doThornBurst(Level level, BlockPos pos, BlockState state) { + switch (state.getValue(AXIS)) { + case Y -> { + this.growThorns(level, pos, Direction.UP); + this.growThorns(level, pos, Direction.DOWN); + } + case X -> { + this.growThorns(level, pos, Direction.EAST); + this.growThorns(level, pos, Direction.WEST); + } + case Z -> { + this.growThorns(level, pos, Direction.NORTH); + this.growThorns(level, pos, Direction.SOUTH); + } + } + + // also try three random directions + this.growThorns(level, pos, Direction.getRandom(level.getRandom())); + this.growThorns(level, pos, Direction.getRandom(level.getRandom())); + this.growThorns(level, pos, Direction.getRandom(level.getRandom())); + } + + /** + * grow several green thorns in the specified direction + */ + private void growThorns(Level level, BlockPos pos, Direction dir) { + int length = 1 + level.getRandom().nextInt(3); + + for (int i = 1; i < length; i++) { + BlockPos dPos = pos.relative(dir, i); + + if (level.isEmptyBlock(dPos)) { + level.setBlock(dPos, TFBlocks.GREEN_THORNS.get().defaultBlockState().setValue(AXIS, dir.getAxis()), 2); + } else { + break; + } + } + } + + @Override + @SuppressWarnings("deprecation") + public FluidState getFluidState(BlockState state) { + return state.getValue(WATERLOGGED) ? Fluids.WATER.getSource(false) : super.getFluidState(state); + } + + @Override + public BlockState getStateForPlacement(BlockPlaceContext context) { + BlockState state = this.defaultBlockState().setValue(AXIS, context.getClickedFace().getAxis()); + BlockPos pos = context.getClickedPos(); + + for (Direction direction : Direction.values()) { + BlockPos relativePos = pos.relative(direction); + BlockState relativeState = context.getLevel().getBlockState(relativePos); + state = state.setValue(PipeBlock.PROPERTY_BY_DIRECTION.get(direction), this.canConnectTo(relativeState, true)); + } + + return state.setValue(WATERLOGGED, context.getLevel().getFluidState(context.getClickedPos()).getType() == Fluids.WATER); + } + + @Override + public BlockState updateShape(BlockState state, Direction facing, BlockState facingState, LevelAccessor accessor, BlockPos currentPos, BlockPos facingPos) { + if (state.getValue(WATERLOGGED)) accessor.scheduleTick(currentPos, Fluids.WATER, Fluids.WATER.getTickDelay(accessor)); + if (facingState.is(Blocks.AIR)) return state; + + return super.updateShape(state, facing, facingState, accessor, currentPos, facingPos); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + super.createBlockStateDefinition(builder); + builder.add(WATERLOGGED); + } +} diff --git a/src/main/java/twilightforest/block/TimeLogCoreBlock.java b/src/main/java/twilightforest/block/TimeLogCoreBlock.java new file mode 100644 index 0000000000..74f48b0ba0 --- /dev/null +++ b/src/main/java/twilightforest/block/TimeLogCoreBlock.java @@ -0,0 +1,62 @@ +package twilightforest.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundSource; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityTicker; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import twilightforest.TFConfig; +import twilightforest.data.tags.BlockTagGenerator; +import twilightforest.init.TFSounds; +import twilightforest.util.WorldUtil; + +public class TimeLogCoreBlock extends SpecialMagicLogBlock { + + public TimeLogCoreBlock(Properties properties) { + super(properties); + } + + @Override + public boolean doesCoreFunction() { + return !TFConfig.COMMON_CONFIG.MAGIC_TREES.disableTime.get(); + } + + /** + * The tree of time adds extra ticks to blocks, so that they have twice the normal chance to get a random tick + */ + @Override + @SuppressWarnings("unchecked") + // Vanilla also makes this dirty cast on block entity tickers, poor mojank design. + void performTreeEffect(Level level, BlockPos pos, RandomSource rand) { + int numticks = 8 * 3 * this.tickRate(); + + for (int i = 0; i < numticks; i++) { + + BlockPos dPos = WorldUtil.randomOffset(rand, pos, TFConfig.COMMON_CONFIG.MAGIC_TREES.miningRange.get()); + + BlockState state = level.getBlockState(dPos); + + if (!state.is(BlockTagGenerator.TIME_CORE_EXCLUDED)) { + if (state.isRandomlyTicking()) { + state.randomTick((ServerLevel) level, dPos, rand); + } + + BlockEntity entity = level.getBlockEntity(dPos); + if (entity != null) { + BlockEntityTicker ticker = state.getTicker(level, (BlockEntityType) entity.getType()); + if (ticker != null) + ticker.tick(level, dPos, state, entity); + } + } + } + } + + @Override + protected void playSound(Level level, BlockPos pos, RandomSource rand) { + level.playSound(null, pos, TFSounds.TIME_CORE.get(), SoundSource.BLOCKS, 0.35F, 0.5F); + } +} diff --git a/src/main/java/twilightforest/block/TomeSpawnerBlock.java b/src/main/java/twilightforest/block/TomeSpawnerBlock.java new file mode 100644 index 0000000000..058d56ece2 --- /dev/null +++ b/src/main/java/twilightforest/block/TomeSpawnerBlock.java @@ -0,0 +1,113 @@ +package twilightforest.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundSource; +import net.minecraft.tags.BlockTags; +import net.minecraft.world.Difficulty; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.BaseEntityBlock; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.RenderShape; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityTicker; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.block.state.properties.IntegerProperty; +import twilightforest.init.TFSounds; +import twilightforest.init.TFBlockEntities; +import twilightforest.block.entity.TomeSpawnerBlockEntity; + +import org.jetbrains.annotations.Nullable; + +public class TomeSpawnerBlock extends BaseEntityBlock { + + public static IntegerProperty BOOK_STAGES = IntegerProperty.create("book_stages", 1, 10); + public static BooleanProperty SPAWNER = BooleanProperty.create("spawner"); + + public TomeSpawnerBlock(Properties properties) { + super(properties); + this.registerDefaultState(this.getStateDefinition().any().setValue(BOOK_STAGES, 10).setValue(SPAWNER, true)); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + builder.add(BOOK_STAGES, SPAWNER); + } + + @Override + public void onCaughtFire(BlockState state, Level level, BlockPos pos, @Nullable Direction face, @Nullable LivingEntity igniter) { + if(level.getDifficulty() != Difficulty.PEACEFUL && level.getBlockState(pos).getValue(SPAWNER) && level.getBlockEntity(pos) instanceof TomeSpawnerBlockEntity ts && level instanceof ServerLevel serverLevel) { + for(int i = 0; i < state.getValue(BOOK_STAGES); i++) { + ts.attemptSpawnTome(serverLevel, pos, true); + } + level.destroyBlock(pos, false); + } + super.onCaughtFire(state, level, pos, face, igniter); + } + + @Override + public void neighborChanged(BlockState state, Level level, BlockPos pos, Block block, BlockPos fromPos, boolean isMoving) { + for(Direction direction : Direction.values()) { + if(level.getBlockState(pos.relative(direction)).is(BlockTags.FIRE)) { + this.onCaughtFire(state, level, pos, direction, null); + break; + } + } + } + + @Override + public void playerDestroy(Level level, Player player, BlockPos pos, BlockState state, @Nullable BlockEntity entity, ItemStack stack) { + if(!level.isClientSide && state.getValue(SPAWNER)) { + level.playSound(null, pos, TFSounds.DEATH_TOME_DEATH.get(), SoundSource.BLOCKS, 1.0F, 1.0F); + for (int i = 0; i < 20; ++i) { + double d3 = level.random.nextGaussian() * 0.02D; + double d1 = level.random.nextGaussian() * 0.02D; + double d2 = level.random.nextGaussian() * 0.02D; + ((ServerLevel) level).sendParticles(ParticleTypes.POOF, (double) pos.getX() + 0.5D, pos.getY(), (double) pos.getZ() + 0.5D, 1, d3, d1, d2, 0.15F); + } + } + super.playerDestroy(level, player, pos, state, entity, stack); + } + + @Override + public RenderShape getRenderShape(BlockState state) { + return RenderShape.MODEL; + } + + @Override + public float getEnchantPowerBonus(BlockState state, LevelReader reader, BlockPos pos) { + return state.getValue(BOOK_STAGES) * 0.1F; + } + + @Nullable + @Override + public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { + return state.getValue(SPAWNER) ? new TomeSpawnerBlockEntity(pos, state) : null; + } + + @Nullable + @Override + public BlockEntityTicker getTicker(Level level, BlockState state, BlockEntityType type) { + return state.getValue(SPAWNER) ? createTickerHelper(type, TFBlockEntities.TOME_SPAWNER.get(), TomeSpawnerBlockEntity::tick) : null; + } + + @Override + public int getFlammability(BlockState state, BlockGetter getter, BlockPos pos, Direction face) { + return 20; + } + + @Override + public int getFireSpreadSpeed(BlockState state, BlockGetter getter, BlockPos pos, Direction face) { + return 30; + } +} diff --git a/src/main/java/twilightforest/block/TorchberryPlantBlock.java b/src/main/java/twilightforest/block/TorchberryPlantBlock.java new file mode 100644 index 0000000000..1e43052a26 --- /dev/null +++ b/src/main/java/twilightforest/block/TorchberryPlantBlock.java @@ -0,0 +1,87 @@ +package twilightforest.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundSource; +import net.minecraft.util.RandomSource; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.BonemealableBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; +import net.minecraftforge.common.PlantType; +import twilightforest.init.TFSounds; +import twilightforest.init.TFItems; +import twilightforest.init.TFStats; + +public class TorchberryPlantBlock extends TFPlantBlock implements BonemealableBlock { + + public static final BooleanProperty HAS_BERRIES = BooleanProperty.create("has_torchberries"); + private static final VoxelShape TORCHBERRY_SHAPE = Block.box(1, 2, 1, 15, 16, 15); + + public TorchberryPlantBlock(Properties properties) { + super(properties); + this.registerDefaultState(this.getStateDefinition().any().setValue(HAS_BERRIES, false)); + } + + @Override + public boolean canSurvive(BlockState state, LevelReader reader, BlockPos pos) { + return TFPlantBlock.canPlaceRootAt(reader, pos); + } + + @Override + public VoxelShape getShape(BlockState state, BlockGetter getter, BlockPos pos, CollisionContext context) { + return TORCHBERRY_SHAPE; + } + + @Override + public PlantType getPlantType(BlockGetter getter, BlockPos pos) { + return PlantType.CAVE; + } + + @Override + public InteractionResult use(BlockState state, Level level, BlockPos pos, Player player, InteractionHand hand, BlockHitResult result) { + if (state.getValue(HAS_BERRIES)) { + level.setBlockAndUpdate(pos, state.setValue(HAS_BERRIES, false)); + level.playSound(null, pos, TFSounds.PICKED_TORCHBERRIES.get(), SoundSource.BLOCKS, 1.0F, 1.0F); + ItemEntity torchberries = new ItemEntity(level, pos.getX() + 0.5F, pos.getY(), pos.getZ() + 0.5F, new ItemStack(TFItems.TORCHBERRIES.get())); + level.addFreshEntity(torchberries); + if (player instanceof ServerPlayer) player.awardStat(TFStats.TORCHBERRIES_HARVESTED.get()); + return InteractionResult.sidedSuccess(level.isClientSide()); + } + return super.use(state, level, pos, player, hand, result); + } + + @Override + public boolean isValidBonemealTarget(LevelReader getter, BlockPos pos, BlockState state, boolean isClient) { + return !state.getValue(HAS_BERRIES); + } + + @Override + public boolean isBonemealSuccess(Level level, RandomSource rand, BlockPos pos, BlockState state) { + return true; + } + + @Override + public void performBonemeal(ServerLevel level, RandomSource rand, BlockPos pos, BlockState state) { + level.setBlock(pos, state.setValue(HAS_BERRIES, true), 2); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + builder.add(HAS_BERRIES); + } + +} diff --git a/src/main/java/twilightforest/block/TransLogCoreBlock.java b/src/main/java/twilightforest/block/TransLogCoreBlock.java new file mode 100644 index 0000000000..f871ec2476 --- /dev/null +++ b/src/main/java/twilightforest/block/TransLogCoreBlock.java @@ -0,0 +1,91 @@ +package twilightforest.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Holder; +import net.minecraft.core.QuartPos; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceKey; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundSource; +import net.minecraft.util.Mth; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.chunk.LevelChunk; +import net.minecraft.world.level.chunk.LevelChunkSection; +import net.minecraft.world.level.chunk.PalettedContainer; +import net.minecraftforge.network.PacketDistributor; +import twilightforest.TFConfig; +import twilightforest.init.TFSounds; +import twilightforest.network.ChangeBiomePacket; +import twilightforest.network.TFPacketHandler; +import twilightforest.util.WorldUtil; +import twilightforest.init.TFBiomes; + +import java.util.List; + +public class TransLogCoreBlock extends SpecialMagicLogBlock { + + public TransLogCoreBlock(Properties props) { + super(props); + } + + @Override + public boolean doesCoreFunction() { + return !TFConfig.COMMON_CONFIG.MAGIC_TREES.disableTransformation.get(); + } + + /** + * The tree of transformation transforms the biome in the area near it into the enchanted forest biome. + */ + @Override + void performTreeEffect(Level level, BlockPos pos, RandomSource rand) { + ResourceKey target = TFBiomes.ENCHANTED_FOREST; + Holder biome = level.registryAccess().registryOrThrow(Registries.BIOME).getHolderOrThrow(target); + int range = TFConfig.COMMON_CONFIG.MAGIC_TREES.transformationRange.get(); + for (int i = 0; i < 16; i++) { + BlockPos dPos = WorldUtil.randomOffset(rand, pos, range, 0, range); + if (dPos.distSqr(pos) > 256.0) + continue; + + if (level.getBiome(dPos).is(target)) + continue; + + int minY = QuartPos.fromBlock(level.getMinBuildHeight()); + int maxY = minY + QuartPos.fromBlock(level.getHeight()) - 1; + + int x = QuartPos.fromBlock(dPos.getX()); + int z = QuartPos.fromBlock(dPos.getZ()); + + LevelChunk chunkAt = level.getChunk(dPos.getX() >> 4, dPos.getZ() >> 4); + for (LevelChunkSection section : chunkAt.getSections()) { + for (int sy = 0; sy < 16; sy += 4) { + int y = Mth.clamp(QuartPos.fromBlock(section.bottomBlockY() + sy), minY, maxY); + if (section.getBiomes().get(x & 3, y & 3, z & 3).is(target)) + continue; + if (section.getBiomes() instanceof PalettedContainer> container) + container.set(x & 3, y & 3, z & 3, biome); + } + } + + if (level instanceof ServerLevel server) { + if (!chunkAt.isUnsaved()) chunkAt.setUnsaved(true); + server.getChunkSource().chunkMap.resendBiomesForChunks(List.of(chunkAt)); + } + break; + } + } + + /** + * Send a tiny update packet to the client to inform it of the changed biome + */ + private void sendChangedBiome(LevelChunk chunk, BlockPos pos, ResourceKey biome) { + ChangeBiomePacket message = new ChangeBiomePacket(pos, biome); + TFPacketHandler.CHANNEL.send(PacketDistributor.TRACKING_CHUNK.with(() -> chunk), message); + } + + @Override + protected void playSound(Level level, BlockPos pos, RandomSource rand) { + level.playSound(null, pos, TFSounds.TRANSFORMATION_CORE.get(), SoundSource.BLOCKS, 0.1F, rand.nextFloat() * 2F); + } +} diff --git a/src/main/java/twilightforest/block/TranslucentBuiltBlock.java b/src/main/java/twilightforest/block/TranslucentBuiltBlock.java new file mode 100644 index 0000000000..2c9cac7122 --- /dev/null +++ b/src/main/java/twilightforest/block/TranslucentBuiltBlock.java @@ -0,0 +1,47 @@ +package twilightforest.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundSource; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.material.PushReaction; +import twilightforest.init.TFSounds; + +public class TranslucentBuiltBlock extends Block { + + public static final BooleanProperty ACTIVE = BooleanProperty.create("active"); + + public TranslucentBuiltBlock(Properties properties) { + super(properties); + this.registerDefaultState(this.getStateDefinition().any().setValue(ACTIVE, false)); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + super.createBlockStateDefinition(builder); + builder.add(ACTIVE); + } + + @Override + @Deprecated + public void tick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) { + if (state.getValue(ACTIVE)) { + level.removeBlock(pos, false); + level.playSound(null, pos, TFSounds.BUILDER_REPLACE.get(), SoundSource.BLOCKS, 0.3F, 0.5F); + + for (Direction e : Direction.values()) { + BuilderBlock.activateBuiltBlocks(level, pos.relative(e)); + } + } + } + + @Override + public PushReaction getPistonPushReaction(BlockState state) { + return PushReaction.BLOCK; + } +} diff --git a/src/main/java/twilightforest/block/TrollRootBlock.java b/src/main/java/twilightforest/block/TrollRootBlock.java new file mode 100644 index 0000000000..de296c8d5b --- /dev/null +++ b/src/main/java/twilightforest/block/TrollRootBlock.java @@ -0,0 +1,77 @@ +package twilightforest.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundSource; +import net.minecraft.tags.BlockTags; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFItems; +import twilightforest.init.TFSounds; +import twilightforest.init.TFStats; + +public class TrollRootBlock extends Block { + + protected static final VoxelShape AABB = Shapes.create(new AABB(0.1, 0.0, 0.1, 0.9, 1.0, 0.9)); + + public TrollRootBlock(Properties properties) { + super(properties); + } + + public static boolean canPlaceRootBelow(LevelReader reader, BlockPos pos) { + BlockState state = reader.getBlockState(pos); + + return state.is(BlockTags.BASE_STONE_OVERWORLD) || state.is(TFBlocks.TROLLVIDR.get()) || state.is(TFBlocks.TROLLBER.get()) || state.is(TFBlocks.UNRIPE_TROLLBER.get()); + } + + @Override + public InteractionResult use(BlockState state, Level level, BlockPos pos, Player player, InteractionHand hand, BlockHitResult result) { + if (state.is(TFBlocks.TROLLBER.get())) { + level.setBlock(pos, TFBlocks.TROLLVIDR.get().defaultBlockState(), 2); + level.playSound(null, pos, TFSounds.PICKED_TORCHBERRIES.get(), SoundSource.BLOCKS, 1.0F, 1.0F); + ItemEntity torchberries = new ItemEntity(level, pos.getX() + 0.5F, pos.getY(), pos.getZ() + 0.5F, new ItemStack(TFItems.TORCHBERRIES.get())); + level.addFreshEntity(torchberries); + if (player instanceof ServerPlayer) player.awardStat(TFStats.TORCHBERRIES_HARVESTED.get()); + return InteractionResult.sidedSuccess(level.isClientSide()); + } + return super.use(state, level, pos, player, hand, result); + } + + @Override + @Deprecated + public boolean canSurvive(BlockState state, LevelReader reader, BlockPos pos) { + return canPlaceRootBelow(reader, pos.above()); + } + + @Override + @Deprecated + public VoxelShape getShape(BlockState state, BlockGetter getter, BlockPos pos, CollisionContext context) { + return AABB; + } + + @Override + @Deprecated + public BlockState updateShape(BlockState state, Direction dirToNeighbor, BlockState neighborState, LevelAccessor accessor, BlockPos pos, BlockPos neighborPos) { + if (dirToNeighbor == Direction.UP) { + return canSurvive(state, accessor, pos) ? state : Blocks.AIR.defaultBlockState(); + } + return state; + } +} diff --git a/src/main/java/twilightforest/block/TrollsteinnBlock.java b/src/main/java/twilightforest/block/TrollsteinnBlock.java new file mode 100644 index 0000000000..dcaa100cd5 --- /dev/null +++ b/src/main/java/twilightforest/block/TrollsteinnBlock.java @@ -0,0 +1,129 @@ +package twilightforest.block; + +import com.google.common.collect.ImmutableMap; +import org.joml.Vector3f; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.particles.DustParticleOptions; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.RandomSource; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +import java.util.Map; + +public class TrollsteinnBlock extends Block { + private static final BooleanProperty DOWN_LIT = BooleanProperty.create("down"); + private static final BooleanProperty UP_LIT = BooleanProperty.create("up"); + private static final BooleanProperty NORTH_LIT = BooleanProperty.create("north"); + private static final BooleanProperty SOUTH_LIT = BooleanProperty.create("south"); + private static final BooleanProperty WEST_LIT = BooleanProperty.create("west"); + private static final BooleanProperty EAST_LIT = BooleanProperty.create("east"); + private static final Map PROPERTY_MAP = ImmutableMap.builder() + .put(Direction.DOWN, DOWN_LIT) + .put(Direction.UP, UP_LIT) + .put(Direction.NORTH, NORTH_LIT) + .put(Direction.SOUTH, SOUTH_LIT) + .put(Direction.WEST, WEST_LIT) + .put(Direction.EAST, EAST_LIT).build(); + + private static final int LIGHT_THRESHOLD = 7; + + public TrollsteinnBlock(Properties properties) { + super(properties); + + this.registerDefaultState(this.getStateDefinition().any() + .setValue(DOWN_LIT, false).setValue(UP_LIT, false) + .setValue(NORTH_LIT, false).setValue(SOUTH_LIT, false) + .setValue(WEST_LIT, false).setValue(EAST_LIT, false)); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + super.createBlockStateDefinition(builder); + builder.add(DOWN_LIT, UP_LIT, NORTH_LIT, SOUTH_LIT, WEST_LIT, EAST_LIT); + } + + @Override + public void randomTick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) { + BlockState newState = state; + for (Direction direction : Direction.values()) + newState = newState.setValue(PROPERTY_MAP.get(direction), level.getMaxLocalRawBrightness(pos.relative(direction)) > LIGHT_THRESHOLD); + if (!newState.equals(state)) level.setBlockAndUpdate(pos, newState); + } + + @Override + public boolean hasAnalogOutputSignal(BlockState state) { + return true; + } + + @Override + public int getAnalogOutputSignal(BlockState state, Level level, BlockPos pos) { + int peak = 0; + for (Direction direction : Direction.values()) + peak = Math.max(level.getMaxLocalRawBrightness(pos.relative(direction)), peak); + return peak; + } + + @Override + public BlockState getStateForPlacement(BlockPlaceContext ctx) { + BlockState ret = defaultBlockState(); + for (Map.Entry e : PROPERTY_MAP.entrySet()) { + int light = ctx.getLevel().getMaxLocalRawBrightness(ctx.getClickedPos().relative(e.getKey())); + ret = ret.setValue(e.getValue(), light > LIGHT_THRESHOLD); + } + return ret; + } + + @OnlyIn(Dist.CLIENT) + @Override + public void animateTick(BlockState state, Level level, BlockPos pos, RandomSource rand) { + if (rand.nextInt(2) == 0) this.sparkle(level, pos); + } + + // [VanillaCopy] Based on BlockRedstoneOre.spawnParticles + private void sparkle(Level level, BlockPos pos) { + RandomSource random = level.getRandom(); + int threshold = LIGHT_THRESHOLD; + + for (Direction side : Direction.values()) { + double rx = pos.getX() + random.nextFloat(); + double ry = pos.getY() + random.nextFloat(); + double rz = pos.getZ() + random.nextFloat(); + + if (side == Direction.DOWN && !level.getBlockState(pos.below()).isSolidRender(level, pos) && level.getMaxLocalRawBrightness(pos.below()) <= threshold) { + ry = pos.getY() - 0.0625D; + } + + if (side == Direction.UP && !level.getBlockState(pos.above()).isSolidRender(level, pos) && level.getMaxLocalRawBrightness(pos.above()) <= threshold) { + ry = pos.getY() + 0.0625D + 1.0D; + } + + if (side == Direction.NORTH && !level.getBlockState(pos.north()).isSolidRender(level, pos) && level.getMaxLocalRawBrightness(pos.north()) <= threshold) { + rz = pos.getZ() - 0.0625D; + } + + if (side == Direction.SOUTH && !level.getBlockState(pos.south()).isSolidRender(level, pos) && level.getMaxLocalRawBrightness(pos.south()) <= threshold) { + rz = pos.getZ() + 0.0625D + 1.0D; + } + + if (side == Direction.WEST && !level.getBlockState(pos.west()).isSolidRender(level, pos) && level.getMaxLocalRawBrightness(pos.west()) <= threshold) { + rx = pos.getX() - 0.0625D; + } + + if (side == Direction.EAST && !level.getBlockState(pos.east()).isSolidRender(level, pos) && level.getMaxLocalRawBrightness(pos.east()) <= threshold) { + rx = pos.getX() + 0.0625D + 1.0D; + } + + if (rx < pos.getX() || rx > pos.getX() + 1 || ry < 0.0D || ry > pos.getY() + 1 || rz < pos.getZ() || rz > pos.getZ() + 1) { + level.addParticle(new DustParticleOptions(new Vector3f(0.5F, 0.0F, 0.5F), 1.0F), rx, ry, rz, 0.25D, -1.0D, 0.5D); + } + } + } +} diff --git a/src/main/java/twilightforest/block/TrophyBlock.java b/src/main/java/twilightforest/block/TrophyBlock.java new file mode 100644 index 0000000000..fcab05e477 --- /dev/null +++ b/src/main/java/twilightforest/block/TrophyBlock.java @@ -0,0 +1,75 @@ +package twilightforest.block; + +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.block.state.properties.IntegerProperty; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.Mirror; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.core.BlockPos; +import net.minecraft.util.Mth; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.level.BlockGetter; +import twilightforest.enums.BossVariant; + +//[VanillaCopy] of SkullBlock but we add a shape for the ur-ghast and we use BossVariant instead of ISkullType +import net.minecraft.world.level.block.state.BlockBehaviour.Properties; + +public class TrophyBlock extends AbstractTrophyBlock { + + public static final IntegerProperty ROTATION = BlockStateProperties.ROTATION_16; + protected static final VoxelShape SHAPE = Block.box(4.0D, 0.0D, 4.0D, 12.0D, 8.0D, 12.0D); + public static final VoxelShape GHAST_SHAPE = Block.box(4.0D, 8.0D, 4.0D, 12.0D, 16.0D, 12.0D); + protected static final VoxelShape YETI_X_SHAPE = Block.box(3.25D, 0.0D, 4.5D, 12.75D, 10.0D, 11.5D); + protected static final VoxelShape YETI_Z_SHAPE = Block.box(4.5D, 0.0D, 3.25D, 11.5D, 10.0D, 12.75D); + protected static final VoxelShape YETI_CORNER_SHAPE = Block.box(4.5D, 0.0D, 4.5D, 11.5D, 10.0D, 11.5D); + + public TrophyBlock(BossVariant variant, int value) { + super(variant, value, Properties.of(Material.DECORATION).instabreak()); + this.registerDefaultState(this.getStateDefinition().any().setValue(TrophyBlock.ROTATION, 0)); + } + + @Override + public VoxelShape getShape(BlockState state, BlockGetter getter, BlockPos pos, CollisionContext context) { + if (((AbstractTrophyBlock) state.getBlock()).getVariant() == BossVariant.UR_GHAST) { + return GHAST_SHAPE; + } else if (((AbstractTrophyBlock) state.getBlock()).getVariant() == BossVariant.ALPHA_YETI) { + return switch (state.getValue(ROTATION)) { + case 3, 4, 5, 11, 12, 13 -> YETI_Z_SHAPE; + case 2, 6, 10, 14 -> YETI_CORNER_SHAPE; + default -> YETI_X_SHAPE; + }; + } + return SHAPE; + } + + @Override + public VoxelShape getOcclusionShape(BlockState state, BlockGetter getter, BlockPos pos) { + return Shapes.empty(); + } + + @Override + public BlockState getStateForPlacement(BlockPlaceContext context) { + return this.defaultBlockState().setValue(ROTATION, Mth.floor(context.getRotation() * 16.0F / 360.0F + 0.5D) & 15); + } + + @Override + public BlockState rotate(BlockState state, Rotation rot) { + return state.setValue(ROTATION, rot.rotate(state.getValue(ROTATION), 16)); + } + + @Override + public BlockState mirror(BlockState state, Mirror mirror) { + return state.setValue(ROTATION, mirror.mirror(state.getValue(ROTATION), 16)); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + builder.add(ROTATION, POWERED); + } +} diff --git a/src/main/java/twilightforest/block/TrophyPedestalBlock.java b/src/main/java/twilightforest/block/TrophyPedestalBlock.java new file mode 100644 index 0000000000..9bfc9f4736 --- /dev/null +++ b/src/main/java/twilightforest/block/TrophyPedestalBlock.java @@ -0,0 +1,177 @@ +package twilightforest.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.SimpleWaterloggedBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.level.material.Fluids; +import net.minecraft.world.level.material.PushReaction; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; +import twilightforest.TwilightForestMod; +import twilightforest.advancements.TFAdvancements; +import twilightforest.data.tags.BlockTagGenerator; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFSounds; +import twilightforest.init.TFStats; +import twilightforest.util.LandmarkUtil; +import twilightforest.util.PlayerHelper; + +import org.jetbrains.annotations.Nullable; + +public class TrophyPedestalBlock extends Block implements SimpleWaterloggedBlock { + + public static final BooleanProperty ACTIVE = BooleanProperty.create("active"); + public static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED; + + private static final VoxelShape BOTTOM = Block.box(1, 0, 1, 15, 3, 15); + private static final VoxelShape MID = Block.box(2, 3, 2, 14, 13, 14); + private static final VoxelShape TOP = Block.box(1, 13, 1, 15, 16, 15); + private static final VoxelShape CORNER1 = Block.box(1, 12, 1, 4, 13, 4); + private static final VoxelShape CORNER2 = Block.box(12, 12, 1, 15, 13, 4); + private static final VoxelShape CORNER3 = Block.box(1, 12, 12, 4, 13, 15); + private static final VoxelShape CORNER4 = Block.box(12, 12, 12, 15, 13, 15); + + private static final VoxelShape FINAL = Shapes.or(BOTTOM, MID, TOP, CORNER1, CORNER2, CORNER3, CORNER4); + + public TrophyPedestalBlock(Properties properties) { + super(properties); + this.registerDefaultState(this.getStateDefinition().any().setValue(ACTIVE, false).setValue(WATERLOGGED, false)); + } + + @Override + public FluidState getFluidState(BlockState state) { + return state.getValue(WATERLOGGED) ? Fluids.WATER.getSource(false) : super.getFluidState(state); + } + + @Nullable + @Override + public BlockState getStateForPlacement(BlockPlaceContext context) { + FluidState fluidstate = context.getLevel().getFluidState(context.getClickedPos()); + boolean flag = fluidstate.getType() == Fluids.WATER; + return super.getStateForPlacement(context).setValue(WATERLOGGED, flag); + } + + @Override + public BlockState updateShape(BlockState state, Direction facing, BlockState facingState, LevelAccessor accessor, BlockPos currentPos, BlockPos facingPos) { + if (state.getValue(WATERLOGGED)) { + accessor.scheduleTick(currentPos, Fluids.WATER, Fluids.WATER.getTickDelay(accessor)); + } + + return super.updateShape(state, facing, facingState, accessor, currentPos, facingPos); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + super.createBlockStateDefinition(builder); + builder.add(ACTIVE, WATERLOGGED); + } + + @Override + @Deprecated + public VoxelShape getShape(BlockState state, BlockGetter getter, BlockPos pos, CollisionContext context) { + return FINAL; + } + + @Override + @Deprecated + public void neighborChanged(BlockState state, Level level, BlockPos pos, Block blockIn, BlockPos fromPos, boolean isMoving) { + level.updateNeighbourForOutputSignal(pos, this); + if (level.isClientSide() || state.getValue(ACTIVE) || !isTrophyOnTop(level, pos)) return; + + if (LandmarkUtil.isProgressionEnforced(level)) { + if (this.areNearbyPlayersEligible(level, pos)) { + this.doPedestalEffect(level, pos, state); + } + this.warnIneligiblePlayers(level, pos); + } else { + this.doPedestalEffect(level, pos, state); + } + + this.rewardNearbyPlayers(level, pos); + } + + private boolean isTrophyOnTop(Level level, BlockPos pos) { + return level.getBlockState(pos.above()).is(BlockTagGenerator.TROPHIES); + } + + private void warnIneligiblePlayers(Level level, BlockPos pos) { + for (Player player : level.getEntitiesOfClass(Player.class, new AABB(pos).inflate(16.0D))) { + if (!this.isPlayerEligible(player)) { + player.displayClientMessage(Component.translatable("misc.twilightforest.pedestal_ineligible"), true); + } + } + } + + private boolean areNearbyPlayersEligible(Level level, BlockPos pos) { + for (Player player : level.getEntitiesOfClass(Player.class, new AABB(pos).inflate(16.0D))) { + if (this.isPlayerEligible(player)) return true; + } + return false; + } + + private boolean isPlayerEligible(Player player) { + return PlayerHelper.doesPlayerHaveRequiredAdvancements(player, TwilightForestMod.prefix("progress_lich")); + } + + private void doPedestalEffect(Level level, BlockPos pos, BlockState state) { + level.setBlockAndUpdate(pos, state.setValue(ACTIVE, true)); + removeNearbyShields(level, pos); + level.playSound(null, pos, TFSounds.PEDESTAL_ACTIVATE.get(), SoundSource.BLOCKS, 4.0F, 0.1F); + } + + private void rewardNearbyPlayers(Level level, BlockPos pos) { + for (ServerPlayer player : level.getEntitiesOfClass(ServerPlayer.class, new AABB(pos).inflate(16.0D))) { + TFAdvancements.PLACED_TROPHY_ON_PEDESTAL.trigger(player); + player.awardStat(TFStats.TROPHY_PEDESTALS_ACTIVATED.get()); + } + } + + private void removeNearbyShields(Level level, BlockPos pos) { + for (int sx = -5; sx <= 5; sx++) + for (int sy = -5; sy <= 5; sy++) + for (int sz = -5; sz <= 5; sz++) + if (level.getBlockState(pos.offset(sx, sy, sz)).getBlock() == TFBlocks.STRONGHOLD_SHIELD.get()) { + level.destroyBlock(pos.offset(sx, sy, sz), false); + } + } + + @Override + public float getDestroyProgress(BlockState state, Player player, BlockGetter getter, BlockPos pos) { + return state.getValue(ACTIVE) ? super.getDestroyProgress(state, player, getter, pos) : -1; + } + + @Override + public boolean hasAnalogOutputSignal(BlockState state) { + return true; + } + + @Override + public int getAnalogOutputSignal(BlockState blockState, Level level, BlockPos pos) { + Block trophy = level.getBlockState(pos.above()).getBlock(); + if (trophy instanceof TrophyBlock value) { + return value.getComparatorValue(); + } + return 0; + } + + @Override + public PushReaction getPistonPushReaction(BlockState state) { + return state.getValue(ACTIVE) ? PushReaction.NORMAL : PushReaction.BLOCK; + } +} diff --git a/src/main/java/twilightforest/block/TrophyWallBlock.java b/src/main/java/twilightforest/block/TrophyWallBlock.java new file mode 100644 index 0000000000..553fad3cba --- /dev/null +++ b/src/main/java/twilightforest/block/TrophyWallBlock.java @@ -0,0 +1,84 @@ +package twilightforest.block; + +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Maps; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.HorizontalDirectionalBlock; +import net.minecraft.world.level.block.Mirror; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.DirectionProperty; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; +import twilightforest.enums.BossVariant; + +import java.util.Map; + +public class TrophyWallBlock extends AbstractTrophyBlock { + public static final DirectionProperty FACING = HorizontalDirectionalBlock.FACING; + private static final Map SHAPES = Maps + .newEnumMap(ImmutableMap.of(Direction.NORTH, Block.box(4.0D, 4.0D, 8.0D, 12.0D, 12.0D, 16.0D), Direction.SOUTH, Block.box(4.0D, 4.0D, 0.0D, 12.0D, 12.0D, 8.0D), Direction.EAST, Block.box(0.0D, 4.0D, 4.0D, 8.0D, 12.0D, 12.0D), Direction.WEST, Block.box(8.0D, 4.0D, 4.0D, 16.0D, 12.0D, 12.0D))); + private static final Map YETI_SHAPES = Maps + .newEnumMap(ImmutableMap.of(Direction.NORTH, Block.box(3.25D, 4.0D, 8.5D, 12.75D, 14.5D, 16.0D), Direction.SOUTH, Block.box(3.25D, 4.0D, 0.0D, 12.75D, 14.5D, 7.5D), Direction.EAST, Block.box(0.0D, 4.0D, 3.25D, 7.5D, 14.5D, 12.75D), Direction.WEST, Block.box(8.5D, 4.0D, 3.25D, 16.0D, 14.5D, 12.75D))); + + public TrophyWallBlock(BossVariant variant) { + super(variant, 0, Properties.of(Material.DECORATION).instabreak()); + this.registerDefaultState(this.getStateDefinition().any().setValue(FACING, Direction.NORTH)); + } + + @Override + public String getDescriptionId() { + return this.asItem().getDescriptionId(); + } + + @Override + public VoxelShape getShape(BlockState state, BlockGetter getter, BlockPos pos, CollisionContext context) { + if (((AbstractTrophyBlock) state.getBlock()).getVariant() == BossVariant.UR_GHAST) { + return TrophyBlock.GHAST_SHAPE; + } else if (((AbstractTrophyBlock) state.getBlock()).getVariant() == BossVariant.ALPHA_YETI) { + return YETI_SHAPES.get(state.getValue(FACING)); + } + return SHAPES.get(state.getValue(FACING)); + } + + @Override + public BlockState getStateForPlacement(BlockPlaceContext context) { + BlockState blockstate = this.defaultBlockState(); + BlockGetter iblockreader = context.getLevel(); + BlockPos blockpos = context.getClickedPos(); + Direction[] adirection = context.getNearestLookingDirections(); + + for (Direction direction : adirection) { + if (direction.getAxis().isHorizontal()) { + Direction direction1 = direction.getOpposite(); + blockstate = blockstate.setValue(FACING, direction1); + if (!iblockreader.getBlockState(blockpos.relative(direction)).canBeReplaced(context)) { + return blockstate; + } + } + } + + return null; + } + + @Override + public BlockState rotate(BlockState state, Rotation rot) { + return state.setValue(FACING, rot.rotate(state.getValue(FACING))); + } + + @Override + public BlockState mirror(BlockState state, Mirror mirror) { + return state.rotate(mirror.getRotation(state.getValue(FACING))); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + builder.add(FACING, POWERED); + } +} diff --git a/src/main/java/twilightforest/block/UberousSoilBlock.java b/src/main/java/twilightforest/block/UberousSoilBlock.java new file mode 100644 index 0000000000..864f96fc4b --- /dev/null +++ b/src/main/java/twilightforest/block/UberousSoilBlock.java @@ -0,0 +1,195 @@ +package twilightforest.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.TickTask; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.tags.BlockTags; +import net.minecraft.util.RandomSource; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.BoneMealItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.*; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; +import net.minecraftforge.common.IPlantable; +import net.minecraftforge.common.PlantType; +import net.minecraftforge.common.util.FakePlayer; +import net.minecraftforge.common.util.FakePlayerFactory; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFItems; + +import org.jetbrains.annotations.Nullable; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +public class UberousSoilBlock extends Block implements BonemealableBlock { + + protected static final VoxelShape SHAPE = Block.box(0.0D, 0.0D, 0.0D, 16.0D, 15.0D, 16.0D); + + public UberousSoilBlock(Properties properties) { + super(properties); + } + + public VoxelShape getShape(BlockState state, BlockGetter getter, BlockPos pos, CollisionContext context) { + return SHAPE; + } + + @Nullable + @Override + public BlockState getStateForPlacement(BlockPlaceContext ctx) { + return ctx.getLevel().getBlockState(ctx.getClickedPos().above()).getMaterial().isSolid() ? Blocks.DIRT.defaultBlockState() : super.getStateForPlacement(ctx); + } + + @Override + public boolean canSustainPlant(BlockState state, BlockGetter getter, BlockPos pos, Direction direction, IPlantable plantable) { + if (direction != Direction.UP) + return false; + PlantType plantType = plantable.getPlantType(getter, pos.relative(direction)); + return plantType == PlantType.CROP || plantType == PlantType.PLAINS || plantType == PlantType.CAVE; + } + + @Override + public void neighborChanged(BlockState state, Level level, BlockPos pos, Block blockIn, BlockPos fromPos, boolean isMoving) { + if (fromPos.getY() == pos.getY() + 1) { + BlockState above = level.getBlockState(fromPos); + if (!(above.getBlock() instanceof BonemealableBlock bonemealableBlock && !above.is(TFBlocks.UBEROUS_SOIL.get()))) { + if (above.getMaterial().isSolid()) + level.setBlockAndUpdate(pos, pushEntitiesUp(state, Blocks.DIRT.defaultBlockState(), level, pos)); + return; + } + + BlockState newState = Blocks.DIRT.defaultBlockState(); + + if (bonemealableBlock instanceof IPlantable iPlantable && iPlantable.getPlantType(level, fromPos) == PlantType.CROP) + newState = Blocks.FARMLAND.defaultBlockState().setValue(FarmBlock.MOISTURE, 7); + else if (bonemealableBlock instanceof MushroomBlock) + newState = Blocks.MYCELIUM.defaultBlockState(); + else if (bonemealableBlock instanceof BushBlock) + newState = Blocks.GRASS_BLOCK.defaultBlockState(); + else if (bonemealableBlock instanceof MossBlock mossBlock) + newState = mossBlock.defaultBlockState(); + + if (level instanceof ServerLevel serverLevel && bonemealableBlock instanceof MushgloomBlock mushgloomBlock) { + /* + This seems a bit hacky, but it's the easiest way of letting the mushgloom only be grown by uberous soil + If we make it growable by bonemeal as well, just delete this if statement and update the appropriate method inside the mushgloom class + */ + level.setBlockAndUpdate(pos, pushEntitiesUp(state, newState, level, pos)); + mushgloomBlock.growMushroom(serverLevel, fromPos, above, serverLevel.random); + level.levelEvent(2005, fromPos, 0); + return; + } + + /* + The block must be set to a new one before we attempt to bonemeal the plant, otherwise, we can end up with an infinite block update loop + For example, if we try to grow a mushroom but there isn't enough room for it to grow. (For some reason mushroom code does a block update when failing to grow) + */ + level.setBlockAndUpdate(pos, pushEntitiesUp(state, newState, level, pos)); + + if (level instanceof ServerLevel serverLevel) { + MinecraftServer server = serverLevel.getServer(); + FakePlayer fakePlayer = FakePlayerFactory.getMinecraft(serverLevel); + server.tell(new TickTask(server.getTickCount(), () -> { + //We need to use a tick task so that plants that grow into tall variants don't just break upon growth + for (int i = 0; i < 15; i++) + BoneMealItem.applyBonemeal(new ItemStack(Items.BONE_MEAL), serverLevel, fromPos, fakePlayer); + })); + } + + level.levelEvent(2005, fromPos, 0); + } + } + + @Override + public void animateTick(BlockState state, Level level, BlockPos pos, RandomSource rand) { + if (level.isClientSide() && rand.nextInt(5) == 0) { + for (Player player : level.players()) { + if (player.getMainHandItem().getItem().equals(TFItems.MAGIC_BEANS.get()) || player.getOffhandItem().getItem().equals(TFItems.MAGIC_BEANS.get())) { + for (int i = 0; i < 2; i++) { + level.addParticle(ParticleTypes.HAPPY_VILLAGER, pos.getX() + rand.nextDouble(), pos.getY() + 1.25D, pos.getZ() + rand.nextDouble(), 0.0D, 0.0D, 0.0D); + } + break; + } + } + } + } + + @Override + //check each side of the block, as well as above and below each of those positions for valid spots + public boolean isValidBonemealTarget(LevelReader getter, BlockPos pos, BlockState state, boolean isClient) { + for (Direction dir : Direction.values()) { + if (dir != Direction.UP && dir != Direction.DOWN) { + BlockState blockAt = getter.getBlockState(pos.relative(dir)); + if ( + !getter.getBlockState(pos.relative(dir).above()).getMaterial().isSolid() && + (blockAt.is(BlockTags.DIRT) || blockAt.is(Blocks.FARMLAND)) && + !blockAt.is(TFBlocks.UBEROUS_SOIL.get())) { + return true; + + } else if ( + !getter.getBlockState(pos.relative(dir).above().above()).getMaterial().isSolid() && + (getter.getBlockState(pos.relative(dir).above()).is(BlockTags.DIRT) || getter.getBlockState(pos.relative(dir).above()).is(Blocks.FARMLAND)) && + !getter.getBlockState(pos.relative(dir).above()).is(TFBlocks.UBEROUS_SOIL.get())) { + return true; + + } else if ( + !getter.getBlockState(pos.relative(dir)).getMaterial().isSolid() && + (getter.getBlockState(pos.relative(dir).below()).is(BlockTags.DIRT) || getter.getBlockState(pos.relative(dir).below()).is(Blocks.FARMLAND)) && + !getter.getBlockState(pos.relative(dir).below()).is(TFBlocks.UBEROUS_SOIL.get())) { + return true; + } + } + } + return false; + } + + @Override + public boolean isBonemealSuccess(Level level, RandomSource rand, BlockPos pos, BlockState state) { + return true; + } + + @Override + //check each side of the block, as well as above and below each of those positions to check for a place to put a block + //the above and below checks allow the patch to jump to a new y level, makes spreading easier + public void performBonemeal(ServerLevel level, RandomSource rand, BlockPos pos, BlockState state) { + List directions = Arrays.asList(Direction.values()); + Collections.shuffle(directions); + for (Direction dir : directions) { + if (dir != Direction.UP && dir != Direction.DOWN) { + BlockState blockAt = level.getBlockState(pos.relative(dir)); + if ( + !level.getBlockState(pos.relative(dir).above()).getMaterial().isSolid() && + (blockAt.is(BlockTags.DIRT) || blockAt.is(Blocks.FARMLAND)) && + !blockAt.is(TFBlocks.UBEROUS_SOIL.get())) { + + level.setBlockAndUpdate(pos.relative(dir), this.defaultBlockState()); + break; + } else if ( + !level.getBlockState(pos.relative(dir).above().above()).getMaterial().isSolid() && + (level.getBlockState(pos.relative(dir).above()).is(BlockTags.DIRT) || level.getBlockState(pos.relative(dir).above()).is(Blocks.FARMLAND)) && + !level.getBlockState(pos.relative(dir).above()).is(TFBlocks.UBEROUS_SOIL.get())) { + + level.setBlockAndUpdate(pos.relative(dir).above(), this.defaultBlockState()); + break; + } else if ( + !level.getBlockState(pos.relative(dir)).getMaterial().isSolid() && + (level.getBlockState(pos.relative(dir).below()).is(BlockTags.DIRT) || level.getBlockState(pos.relative(dir).below()).is(Blocks.FARMLAND)) && + !level.getBlockState(pos.relative(dir).below()).is(TFBlocks.UBEROUS_SOIL.get())) { + + level.setBlockAndUpdate(pos.relative(dir).below(), this.defaultBlockState()); + break; + } + } + } + } +} diff --git a/src/main/java/twilightforest/block/UncraftingTableBlock.java b/src/main/java/twilightforest/block/UncraftingTableBlock.java new file mode 100644 index 0000000000..a7992c417c --- /dev/null +++ b/src/main/java/twilightforest/block/UncraftingTableBlock.java @@ -0,0 +1,79 @@ +package twilightforest.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.MenuProvider; +import net.minecraft.world.SimpleMenuProvider; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.ContainerLevelAccess; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.phys.BlockHitResult; +import twilightforest.init.TFSounds; +import twilightforest.init.TFStats; +import twilightforest.inventory.UncraftingMenu; + +import org.jetbrains.annotations.Nullable; + +public class UncraftingTableBlock extends Block { + + public static final BooleanProperty POWERED = BlockStateProperties.POWERED; + + public UncraftingTableBlock() { + super(Properties.of(Material.WOOD).strength(2.5F).sound(SoundType.WOOD)); + this.registerDefaultState(this.getStateDefinition().any().setValue(POWERED, false)); + } + + @Override + @Deprecated + public InteractionResult use(BlockState state, Level level, BlockPos pos, Player player, InteractionHand hand, BlockHitResult result) { + if (!level.isClientSide()) { + player.openMenu(state.getMenuProvider(level, pos)); + player.awardStat(TFStats.UNCRAFTING_TABLE_INTERACTIONS.get()); + } + return InteractionResult.SUCCESS; + } + + @Override + public void neighborChanged(BlockState state, Level level, BlockPos pos, Block block, BlockPos fromPos, boolean isMoving) { + if (!level.isClientSide()) { + boolean flag = level.hasNeighborSignal(pos); + if (flag != state.getValue(POWERED)) { + if (flag && level.getBlockState(pos.below()).is(Blocks.AMETHYST_BLOCK)) { + level.playSound(null, pos, TFSounds.UNCRAFTING_TABLE_ACTIVATE.get(), SoundSource.BLOCKS, 0.5F, 1.0F); + } + level.setBlockAndUpdate(pos, state.setValue(POWERED, flag)); + } + } + } + + @Override + public void onPlace(BlockState state, Level level, BlockPos pos, BlockState newState, boolean moving) { + if (!newState.is(state.getBlock())) { + this.neighborChanged(state, level, pos, this, pos, moving); + } + } + + @Nullable + @Override + public MenuProvider getMenuProvider(BlockState state, Level level, BlockPos pos) { + return new SimpleMenuProvider((id, inv, player) -> new UncraftingMenu(id, inv, player.getLevel(), ContainerLevelAccess.create(level, pos)), + Component.translatable("container.twilightforest.uncrafting_table")); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + builder.add(POWERED); + } + +} diff --git a/src/main/java/twilightforest/block/UnripeTorchClusterBlock.java b/src/main/java/twilightforest/block/UnripeTorchClusterBlock.java new file mode 100644 index 0000000000..88b4684587 --- /dev/null +++ b/src/main/java/twilightforest/block/UnripeTorchClusterBlock.java @@ -0,0 +1,23 @@ +package twilightforest.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.block.state.BlockState; +import twilightforest.init.TFBlocks; + +public class UnripeTorchClusterBlock extends TrollRootBlock { + private static final int RIPEN_THRESHOLD = 6; + + public UnripeTorchClusterBlock(Properties props) { + super(props); + } + + @Override + public void randomTick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) { + if (level.getMaxLocalRawBrightness(pos) >= RIPEN_THRESHOLD) { + // ripen! + level.setBlockAndUpdate(pos, TFBlocks.TROLLBER.get().defaultBlockState()); + } + } +} diff --git a/src/main/java/twilightforest/block/VanishingBlock.java b/src/main/java/twilightforest/block/VanishingBlock.java new file mode 100644 index 0000000000..a5c9fd6880 --- /dev/null +++ b/src/main/java/twilightforest/block/VanishingBlock.java @@ -0,0 +1,232 @@ +package twilightforest.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.particles.DustParticleOptions; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundSource; +import net.minecraft.util.RandomSource; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Explosion; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import org.joml.Vector3f; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFSounds; + +import java.util.ArrayDeque; +import java.util.Deque; +import java.util.HashSet; +import java.util.Set; + +/** + * Block that disappears then reappears after a short delay. + * Blockstate lifecycle: [active=false, vanished=false] -> right click or redstone + * -> [active=true, vanished=false] -> delay -> [active=false, vanished=true] + * -> delay -> [active=true, vanished=true] -> delay -> initial state + *

+ * If the block has no "vanished" state property registered, it simply deletes itself after the first delay. + * + * @see ReappearingBlock, It is only separated from this class because vanilla does + * not like having blockstate properties be conditionally registered. + */ +public class VanishingBlock extends Block { + public static final BooleanProperty ACTIVE = BooleanProperty.create("active"); + public static final BooleanProperty VANISHED = BooleanProperty.create("vanished"); + private static final VoxelShape VANISHED_SHAPE = box(6, 6, 6, 10, 10, 10); + + public VanishingBlock(Properties properties) { + super(properties); + this.registerDefaultState(this.getStateDefinition().any().setValue(ACTIVE, false)); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + super.createBlockStateDefinition(builder); + builder.add(ACTIVE); + } + + private boolean isVanished(BlockState state) { + return state.hasProperty(VANISHED) && state.getValue(VANISHED); + } + + @Override + public VoxelShape getShape(BlockState state, BlockGetter getter, BlockPos pos, CollisionContext ctx) { + return isVanished(state) ? VANISHED_SHAPE : super.getShape(state, getter, pos, ctx); + } + + @Override + public VoxelShape getCollisionShape(BlockState state, BlockGetter getter, BlockPos pos, CollisionContext ctx) { + return isVanished(state) ? Shapes.empty() : super.getCollisionShape(state, getter, pos, ctx); + } + + @Override + @Deprecated + public InteractionResult use(BlockState state, Level level, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { + if (!this.isVanished(state) && !state.getValue(ACTIVE)) { + if (areBlocksLocked(level, pos)) { + level.playSound(null, pos, TFSounds.LOCKED_VANISHING_BLOCK.get(), SoundSource.BLOCKS, 1.0F, 0.3F); + } else { + this.activate(level, pos); + } + return InteractionResult.sidedSuccess(level.isClientSide()); + } + + return InteractionResult.PASS; + } + + @Override + public float getExplosionResistance(BlockState state, BlockGetter getter, BlockPos pos, Explosion explosion) { + return !state.getValue(ACTIVE) ? 6000F : super.getExplosionResistance(state, getter, pos, explosion); + } + + @Override + public boolean canEntityDestroy(BlockState state, BlockGetter getter, BlockPos pos, Entity entity) { + return !state.getValue(ACTIVE) ? !areBlocksLocked(getter, pos) : super.canEntityDestroy(state, getter, pos, entity); + } + + private static boolean areBlocksLocked(BlockGetter getter, BlockPos start) { + int limit = 512; + Deque queue = new ArrayDeque<>(); + Set checked = new HashSet<>(); + queue.offer(start); + + for (int iter = 0; !queue.isEmpty() && iter < limit; iter++) { + BlockPos cur = queue.pop(); + BlockState state = getter.getBlockState(cur); + if (state.getBlock() == TFBlocks.LOCKED_VANISHING_BLOCK.get() && state.getValue(LockedVanishingBlock.LOCKED)) { + return true; + } + + checked.add(cur); + + if (state.getBlock() instanceof VanishingBlock) { + for (Direction facing : Direction.values()) { + BlockPos neighbor = cur.relative(facing); + if (!checked.contains(neighbor)) { + queue.offer(neighbor); + } + } + } + } + + return false; + } + + @Override + @Deprecated + public void neighborChanged(BlockState state, Level level, BlockPos pos, Block blockIn, BlockPos fromPos, boolean isMoving) { + if (level.isClientSide()) { + return; + } + + if (!this.isVanished(state) && !state.getValue(ACTIVE) && level.hasNeighborSignal(pos) && !areBlocksLocked(level, pos)) { + this.activate(level, pos); + } + } + + @Override + @Deprecated + public void tick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) { + if (level.isClientSide()) { + return; + } + + if (isVanished(state)) { + if (state.getValue(ACTIVE)) { + level.setBlockAndUpdate(pos, state.setValue(VANISHED, false).setValue(ACTIVE, false)); + } else { + level.setBlockAndUpdate(pos, state.setValue(ACTIVE, true)); + level.scheduleTick(pos, this, 15); + } + level.playSound(null, pos, TFSounds.REAPPEAR_BLOCK.get(), SoundSource.BLOCKS, 0.3F, 0.6F); + } else { + if (state.getValue(ACTIVE)) { + if (state.hasProperty(VANISHED)) { + level.setBlockAndUpdate(pos, state.setValue(ACTIVE, false).setValue(VANISHED, true)); + level.scheduleTick(pos, this, 80); + } else { + level.removeBlock(pos, false); + } + + level.playSound(null, pos, state.getBlock() == TFBlocks.REAPPEARING_BLOCK.get() ? TFSounds.REAPPEAR_POOF.get() : TFSounds.VANISHING_BLOCK.get(), SoundSource.BLOCKS, 0.3F, 0.5F); + + for (Direction e : Direction.values()) { + this.activate(level, pos.relative(e)); + } + } + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void animateTick(BlockState state, Level level, BlockPos pos, RandomSource random) { + if (state.getValue(ACTIVE)) { + this.sparkle(level, pos); + } + } + + // [VanillaCopy] BlockRedstoneOre.spawnParticles. Unchanged. + public void sparkle(Level level, BlockPos pos) { + RandomSource random = level.getRandom(); + double d0 = 0.0625D; + + for (int i = 0; i < 6; ++i) { + double d1 = (float) pos.getX() + random.nextFloat(); + double d2 = (float) pos.getY() + random.nextFloat(); + double d3 = (float) pos.getZ() + random.nextFloat(); + + if (i == 0 && !level.getBlockState(pos.above()).isSolidRender(level, pos)) { + d2 = (double) pos.getY() + d0 + 1.0D; + } + + if (i == 1 && !level.getBlockState(pos.below()).isSolidRender(level, pos)) { + d2 = (double) pos.getY() - d0; + } + + if (i == 2 && !level.getBlockState(pos.south()).isSolidRender(level, pos)) { + d3 = (double) pos.getZ() + d0 + 1.0D; + } + + if (i == 3 && !level.getBlockState(pos.north()).isSolidRender(level, pos)) { + d3 = (double) pos.getZ() - d0; + } + + if (i == 4 && !level.getBlockState(pos.east()).isSolidRender(level, pos)) { + d1 = (double) pos.getX() + d0 + 1.0D; + } + + if (i == 5 && !level.getBlockState(pos.west()).isSolidRender(level, pos)) { + d1 = (double) pos.getX() - d0; + } + + float f1 = 0.6F + 0.4F; + float f2 = Math.max(0.0F, 1.0F * 1.0F * 0.7F - 0.5F); + float f3 = Math.max(0.0F, 1.0F * 1.0F * 0.6F - 0.7F); + if (d1 < (double) pos.getX() || d1 > (double) (pos.getX() + 1) || d2 < 0.0D || d2 > (double) (pos.getY() + 1) || d3 < (double) pos.getZ() || d3 > (double) (pos.getZ() + 1)) { + level.addParticle(new DustParticleOptions(new Vector3f(f1, f2, f3), 1.0F), d1, d2, d3, 0.0D, 0.0D, 0.0D); + } + } + } + + private void activate(Level level, BlockPos pos) { + BlockState state = level.getBlockState(pos); + if (state.getBlock() instanceof VanishingBlock && !isVanished(state) && !state.getValue(ACTIVE)) { + level.setBlockAndUpdate(pos, state.setValue(ACTIVE, true)); + level.scheduleTick(pos, state.getBlock(), 2 + level.getRandom().nextInt(5)); + } + } +} diff --git a/src/main/java/twilightforest/block/WallPillarBlock.java b/src/main/java/twilightforest/block/WallPillarBlock.java new file mode 100644 index 0000000000..7e72c354a1 --- /dev/null +++ b/src/main/java/twilightforest/block/WallPillarBlock.java @@ -0,0 +1,97 @@ +package twilightforest.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.PipeBlock; +import net.minecraft.world.level.block.SimpleWaterloggedBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.level.material.Fluids; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; +import org.jetbrains.annotations.Nullable; + +public class WallPillarBlock extends ConnectableRotatedPillarBlock implements SimpleWaterloggedBlock { + + private static final VoxelShape TOP_X = Block.box(0.0D, 0.0D, 0.0D, 3.0D, 16.0D, 16.0D); + private static final VoxelShape BOTTOM_X = Block.box(13.0D, 0.0D, 0.0D, 16.0D, 16.0D, 16.0D); + private static final VoxelShape PILLAR_X = Block.box(0.0D, 2.0D, 2.0D, 16.0D, 14.0D, 14.0D); + private static final VoxelShape NO_TOP_X = Shapes.or(PILLAR_X, BOTTOM_X); + private static final VoxelShape NO_BOTTOM_X = Shapes.or(PILLAR_X, TOP_X); + private static final VoxelShape FULL_X = Shapes.or(PILLAR_X, BOTTOM_X, TOP_X); + + private static final VoxelShape TOP_Y = Block.box(0.0D, 13.0D, 0.0D, 16.0D, 16.0D, 16.0D); + private static final VoxelShape BOTTOM_Y = Block.box(0.0D, 0.0D, 0.0D, 16.0D, 3.0D, 16.0D); + private static final VoxelShape PILLAR_Y = Block.box(2.0D, 0.0D, 2.0D, 14.0D, 16.0D, 14.0D); + private static final VoxelShape NO_TOP_Y = Shapes.or(PILLAR_Y, BOTTOM_Y); + private static final VoxelShape NO_BOTTOM_Y = Shapes.or(PILLAR_Y, TOP_Y); + private static final VoxelShape FULL_Y = Shapes.or(PILLAR_Y, BOTTOM_Y, TOP_Y); + + private static final VoxelShape TOP_Z = Block.box(0.0D, 0.0D, 0.0D, 16.0D, 16.0D, 3.0D); + private static final VoxelShape BOTTOM_Z = Block.box(0.0D, 0.0D, 13.0D, 16.0D, 16.0D, 16.0D); + private static final VoxelShape PILLAR_Z = Block.box(2.0D, 2.0D, 0.0D, 14.0D, 14.0D, 16.0D); + private static final VoxelShape NO_TOP_Z = Shapes.or(PILLAR_Z, BOTTOM_Z); + private static final VoxelShape NO_BOTTOM_Z = Shapes.or(PILLAR_Z, TOP_Z); + private static final VoxelShape FULL_Z = Shapes.or(PILLAR_Z, BOTTOM_Z, TOP_Z); + + public static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED; + + public WallPillarBlock(Material material, double width, double height) { + super(Properties.of(material).strength(1.5F, 6.0F).requiresCorrectToolForDrops().noOcclusion(), width, height); + this.registerDefaultState(this.defaultBlockState().setValue(WATERLOGGED, false)); + } + + @Override + public VoxelShape getShape(BlockState state, BlockGetter getter, BlockPos pos, CollisionContext context) { + return switch (state.getValue(WallPillarBlock.AXIS)) { + case X -> state.getValue(PipeBlock.WEST) && state.getValue(PipeBlock.EAST) ? PILLAR_X : + state.getValue(PipeBlock.WEST) ? NO_TOP_X : state.getValue(PipeBlock.EAST) ? NO_BOTTOM_X : FULL_X; + case Z -> state.getValue(PipeBlock.NORTH) && state.getValue(PipeBlock.SOUTH) ? PILLAR_Z : + state.getValue(PipeBlock.NORTH) ? NO_TOP_Z : state.getValue(PipeBlock.SOUTH) ? NO_BOTTOM_Z : FULL_Z; + default -> state.getValue(PipeBlock.UP) && state.getValue(PipeBlock.DOWN) ? PILLAR_Y : + state.getValue(PipeBlock.UP) ? NO_TOP_Y : state.getValue(PipeBlock.DOWN) ? NO_BOTTOM_Y : FULL_Y; + }; + } + + @Override + public boolean canConnectTo(BlockState state, boolean solidSide) { + return state.getBlock() instanceof WallPillarBlock; + } + + @Override + public FluidState getFluidState(BlockState state) { + return state.getValue(WATERLOGGED) ? Fluids.WATER.getSource(false) : super.getFluidState(state); + } + + @Nullable + @Override + public BlockState getStateForPlacement(BlockPlaceContext context) { + FluidState fluidstate = context.getLevel().getFluidState(context.getClickedPos()); + boolean flag = fluidstate.getType() == Fluids.WATER; + return super.getStateForPlacement(context).setValue(WATERLOGGED, flag); + } + + @Override + public BlockState updateShape(BlockState state, Direction facing, BlockState facingState, LevelAccessor accessor, BlockPos currentPos, BlockPos facingPos) { + if (state.getValue(WATERLOGGED)) { + accessor.scheduleTick(currentPos, Fluids.WATER, Fluids.WATER.getTickDelay(accessor)); + } + + return super.updateShape(state, facing, facingState, accessor, currentPos, facingPos); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + super.createBlockStateDefinition(builder); + builder.add(WATERLOGGED); + } +} diff --git a/src/main/java/twilightforest/block/WallSkullCandleBlock.java b/src/main/java/twilightforest/block/WallSkullCandleBlock.java new file mode 100644 index 0000000000..7164e9829b --- /dev/null +++ b/src/main/java/twilightforest/block/WallSkullCandleBlock.java @@ -0,0 +1,110 @@ +package twilightforest.block; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Maps; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; +import it.unimi.dsi.fastutil.ints.Int2ObjectMaps; +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; +import net.minecraft.Util; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.util.RandomSource; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.*; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.DirectionProperty; +import net.minecraft.world.phys.Vec3; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; +import twilightforest.block.entity.SkullCandleBlockEntity; + +import java.util.List; +import java.util.Map; + +public class WallSkullCandleBlock extends AbstractSkullCandleBlock { + + public static final DirectionProperty FACING = HorizontalDirectionalBlock.FACING; + //im not doing individual boxes for each candle per facing, the boxes get cut off since the heads are halfway up the wall, and that would be 16!! boxes to make. No thanks. + private static final Map AABBS = Maps.newEnumMap(ImmutableMap.of( + Direction.NORTH, Block.box(4.0D, 4.0D, 8.0D, 12.0D, 12.0D, 16.0D), + Direction.SOUTH, Block.box(4.0D, 4.0D, 0.0D, 12.0D, 12.0D, 8.0D), + Direction.EAST, Block.box(0.0D, 4.0D, 4.0D, 8.0D, 12.0D, 12.0D), + Direction.WEST, Block.box(8.0D, 4.0D, 4.0D, 16.0D, 12.0D, 12.0D))); + + private static final Int2ObjectMap> PARTICLE_OFFSETS = Util.make(() -> { + Int2ObjectMap> var0 = new Int2ObjectOpenHashMap<>(); + var0.defaultReturnValue(ImmutableList.of()); + var0.put(1, ImmutableList.of(new Vec3(0.5D, 1.25D, 0.5D))); + var0.put(2, ImmutableList.of(new Vec3(0.375D, 1.19D, 0.5D), new Vec3(0.625D, 1.25D, 0.44D))); + var0.put(3, ImmutableList.of(new Vec3(0.5D, 1.063D, 0.625D), new Vec3(0.375D, 1.19D, 0.5D), new Vec3(0.56D, 1.25D, 0.44D))); + var0.put(4, ImmutableList.of(new Vec3(0.44D, 1.063D, 0.56D), new Vec3(0.625D, 1.19D, 0.56D), new Vec3(0.375D, 1.19D, 0.375D), new Vec3(0.56D, 1.25D, 0.375D))); + return Int2ObjectMaps.unmodifiable(var0); + }); + + public WallSkullCandleBlock(SkullBlock.Type type, Properties properties) { + super(type, properties); + this.registerDefaultState(this.getStateDefinition().any().setValue(FACING, Direction.NORTH)); + } + + public VoxelShape getShape(BlockState state, BlockGetter getter, BlockPos pos, CollisionContext context) { + return AABBS.get(state.getValue(FACING)); + } + + @Override + protected Iterable getParticleOffsets(BlockState state, LevelAccessor accessor, BlockPos pos) { + if (accessor.getBlockEntity(pos) instanceof SkullCandleBlockEntity sc) { + return PARTICLE_OFFSETS.get(sc.candleAmount); + } + return PARTICLE_OFFSETS.get(1); + } + + @Override + public BlockState getStateForPlacement(BlockPlaceContext ctx) { + BlockState state = this.defaultBlockState(); + BlockGetter getter = ctx.getLevel(); + BlockPos pos = ctx.getClickedPos(); + Direction[] directions = ctx.getNearestLookingDirections(); + + for (Direction dir : directions) { + if (dir.getAxis().isHorizontal()) { + Direction var10 = dir.getOpposite(); + state = state.setValue(FACING, var10); + if (!getter.getBlockState(pos.relative(dir)).canBeReplaced(ctx)) { + return state.setValue(LIGHTING, Lighting.NONE); + } + } + } + return null; + } + + //we want the candle flames to offset based on which way the skull is facing, so apply it here + @Override + public void animateTick(BlockState state, Level level, BlockPos pos, RandomSource rand) { + Direction dir = state.getValue(FACING); + if (state.getValue(LIGHTING) != Lighting.NONE) { + this.getParticleOffsets(state, level, pos).forEach((offset) -> + addParticlesAndSound(level, offset.add(pos.getX() - (float) dir.getStepX() * 0.25F, pos.getY(), pos.getZ() - (float) dir.getStepZ() * 0.25F), rand, state.getValue(LIGHTING) == Lighting.OMINOUS)); + } + } + + @Override + public BlockState rotate(BlockState state, Rotation rot) { + return state.setValue(FACING, rot.rotate(state.getValue(FACING))); + } + + @Override + public BlockState mirror(BlockState state, Mirror mirror) { + return state.rotate(mirror.getRotation(state.getValue(FACING))); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + super.createBlockStateDefinition(builder); + builder.add(FACING); + } +} diff --git a/src/main/java/twilightforest/block/WaterloggedBlock.java b/src/main/java/twilightforest/block/WaterloggedBlock.java new file mode 100644 index 0000000000..662c4d0a3a --- /dev/null +++ b/src/main/java/twilightforest/block/WaterloggedBlock.java @@ -0,0 +1,59 @@ +package twilightforest.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.BucketPickup; +import net.minecraft.world.level.block.LiquidBlockContainer; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Fluid; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.level.material.Fluids; + +import java.util.Optional; + +/** + * [VanillaCopy] Replaced all BlockState Checking/Setting with stateIsWaterlogged and setWaterlogging + */ +public interface WaterloggedBlock extends BucketPickup, LiquidBlockContainer { + boolean isStateWaterlogged(BlockState state); + + BlockState setWaterlog(BlockState prior, boolean doWater); + + default boolean canPlaceLiquid(BlockGetter getter, BlockPos pos, BlockState state, Fluid fluid) { + return !this.isStateWaterlogged(state) && fluid == Fluids.WATER; + } + + default boolean placeLiquid(LevelAccessor accessor, BlockPos pos, BlockState state, FluidState fluidState) { + if (!this.isStateWaterlogged(state) && fluidState.getType() == Fluids.WATER) { + if (!accessor.isClientSide()) { + accessor.setBlock(pos, this.setWaterlog(state, true), 3); + accessor.scheduleTick(pos, fluidState.getType(), fluidState.getType().getTickDelay(accessor)); + } + + return true; + } else { + return false; + } + } + + default ItemStack pickupBlock(LevelAccessor accessor, BlockPos pos, BlockState state) { + if (this.isStateWaterlogged(state)) { + accessor.setBlock(pos, this.setWaterlog(state, false), 3); + if (!state.canSurvive(accessor, pos)) { + accessor.destroyBlock(pos, true); + } + + return new ItemStack(Items.WATER_BUCKET); + } else { + return ItemStack.EMPTY; + } + } + + default Optional getPickupSound() { + return Fluids.WATER.getPickupSound(); + } +} diff --git a/src/main/java/twilightforest/block/entity/AntibuilderBlockEntity.java b/src/main/java/twilightforest/block/entity/AntibuilderBlockEntity.java new file mode 100644 index 0000000000..d981209246 --- /dev/null +++ b/src/main/java/twilightforest/block/entity/AntibuilderBlockEntity.java @@ -0,0 +1,253 @@ +package twilightforest.block.entity; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.particles.DustParticleOptions; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import twilightforest.data.tags.BlockTagGenerator; +import twilightforest.init.TFBlockEntities; +import twilightforest.init.TFBlocks; + +public class AntibuilderBlockEntity extends BlockEntity { + private static final int REVERT_CHANCE = 10; + + private static final int RADIUS = 4; + private static final int DIAMETER = 2 * RADIUS + 1; + private static final double PLAYER_RANGE = 16.0; + + private final RandomSource rand = RandomSource.create(); + + private int tickCount; + private boolean slowScan; + private int ticksSinceChange; + + private BlockState[] blockData; + + public AntibuilderBlockEntity(BlockPos pos, BlockState state) { + super(TFBlockEntities.ANTIBUILDER.get(), pos, state); + } + + public static void tick(Level level, BlockPos pos, BlockState state, AntibuilderBlockEntity te) { + if (te.anyPlayerInRange()) { + te.tickCount++; + + if (level.isClientSide()) { + double x = pos.getX() + level.getRandom().nextFloat(); + double y = pos.getY() + level.getRandom().nextFloat(); + double z = pos.getZ() + level.getRandom().nextFloat(); + level.addParticle(DustParticleOptions.REDSTONE, x, y, z, 0.0D, 0.0D, 0.0D); + + // occasionally make a little red dust line to outline our radius + if (te.rand.nextInt(10) == 0) { + te.makeRandomOutline(); + te.makeRandomOutline(); + te.makeRandomOutline(); + } + } else { + + // new plan, take a snapshot of the world when we are first activated, and then rapidly revert changes + if (te.blockData == null && level.isAreaLoaded(pos, AntibuilderBlockEntity.RADIUS)) { + te.captureBlockData(); + te.slowScan = true; + } + + if (te.blockData != null && (!te.slowScan || te.tickCount % 20 == 0)) { + if (te.scanAndRevertChanges()) { + te.slowScan = false; + te.ticksSinceChange = 0; + } else { + te.ticksSinceChange++; + + if (te.ticksSinceChange > 20) { + te.slowScan = true; + } + } + } + } + } else { + // remove data + te.blockData = null; + te.tickCount = 0; + } + } + + + /** + * Display a random one of the 12 possible outlines + */ + private void makeRandomOutline() { + makeOutline(this.rand.nextInt(12)); + } + + /** + * Display a specific outline + */ + private void makeOutline(int outline) { + // src + double sx = this.getBlockPos().getX(); + double sy = this.getBlockPos().getY(); + double sz = this.getBlockPos().getZ(); + // dest + double dx = this.getBlockPos().getX(); + double dy = this.getBlockPos().getY(); + double dz = this.getBlockPos().getZ(); + + switch (outline) { + case 0, 8 -> { + sx -= RADIUS; + dx += RADIUS + 1; + sz -= RADIUS; + dz -= RADIUS; + } + case 1, 9 -> { + sx -= RADIUS; + dx -= RADIUS; + sz -= RADIUS; + dz += RADIUS + 1; + } + case 2, 10 -> { + sx -= RADIUS; + dx += RADIUS + 1; + sz += RADIUS + 1; + dz += RADIUS + 1; + } + case 3, 11 -> { + sx += RADIUS + 1; + dx += RADIUS + 1; + sz -= RADIUS; + dz += RADIUS + 1; + } + case 4 -> { + sx -= RADIUS; + dx -= RADIUS; + sz -= RADIUS; + dz -= RADIUS; + } + case 5 -> { + sx += RADIUS + 1; + dx += RADIUS + 1; + sz -= RADIUS; + dz -= RADIUS; + } + case 6 -> { + sx += RADIUS + 1; + dx += RADIUS + 1; + sz += RADIUS + 1; + dz += RADIUS + 1; + } + case 7 -> { + sx -= RADIUS; + dx -= RADIUS; + sz += RADIUS + 1; + dz += RADIUS + 1; + } + } + + switch (outline) { + case 0, 1, 2, 3 -> { + sy += RADIUS + 1; + dy += RADIUS + 1; + } + case 4, 5, 6, 7 -> { + sy -= RADIUS; + dy += RADIUS + 1; + } + case 8, 9, 10, 11 -> { + sy -= RADIUS; + dy -= RADIUS; + } + } + + if (this.rand.nextBoolean()) { + this.drawParticleLine(this.getBlockPos().getX() + 0.5, this.getBlockPos().getY() + 0.5, this.getBlockPos().getZ() + 0.5, dx, dy, dz); + } else { + this.drawParticleLine(sx, sy, sz, this.getBlockPos().getX() + 0.5, this.getBlockPos().getY() + 0.5, this.getBlockPos().getZ() + 0.5); + } + this.drawParticleLine(sx, sy, sz, dx, dy, dz); + } + + private void drawParticleLine(double srcX, double srcY, double srcZ, double destX, double destY, double destZ) { + // make particle trail + int particles = 16; + for (int i = 0; i < particles; i++) { + double trailFactor = i / (particles - 1.0D); + + double tx = srcX + (destX - srcX) * trailFactor + this.rand.nextFloat() * 0.005; + double ty = srcY + (destY - srcY) * trailFactor + this.rand.nextFloat() * 0.005; + double tz = srcZ + (destZ - srcZ) * trailFactor + this.rand.nextFloat() * 0.005; + this.getLevel().addParticle(DustParticleOptions.REDSTONE, tx, ty, tz, 0, 0, 0); + } + } + + private boolean scanAndRevertChanges() { + int index = 0; + boolean reverted = false; + + for (int x = -RADIUS; x <= RADIUS; x++) { + for (int y = -RADIUS; y <= RADIUS; y++) { + for (int z = -RADIUS; z <= RADIUS; z++) { + BlockState stateThere = this.getLevel().getBlockState(this.getBlockPos().offset(x, y, z)); + + if (this.blockData[index].getBlock() != stateThere.getBlock()) { + if (revertBlock(this.getBlockPos().offset(x, y, z), stateThere, this.blockData[index])) { + reverted = true; + } else { + this.blockData[index] = stateThere; + } + } + + index++; + } + } + } + + return reverted; + } + + private boolean revertBlock(BlockPos pos, BlockState stateThere, BlockState replaceWith) { + if (stateThere.isAir() && !replaceWith.getMaterial().blocksMotion()) { + return false; + } + if (stateThere.getDestroySpeed(this.getLevel(), pos) < 0 || this.isUnrevertable(stateThere, replaceWith)) { + return false; + } else if (this.rand.nextInt(REVERT_CHANCE) == 0) { + // don't revert everything instantly + if (!replaceWith.isAir()) { + replaceWith = TFBlocks.ANTIBUILT_BLOCK.get().defaultBlockState(); + } + + if (stateThere.isAir()) { + this.getLevel().levelEvent(2001, pos, Block.getId(replaceWith)); + } + Block.updateOrDestroy(stateThere, replaceWith, this.getLevel(), pos, 2); + } + + return true; + } + + private boolean isUnrevertable(BlockState stateThere, BlockState replaceWith) { + return stateThere.is(BlockTagGenerator.ANTIBUILDER_IGNORES) || replaceWith.is(BlockTagGenerator.ANTIBUILDER_IGNORES); + } + + private void captureBlockData() { + this.blockData = new BlockState[DIAMETER * DIAMETER * DIAMETER]; + + int index = 0; + + for (int x = -RADIUS; x <= RADIUS; x++) { + for (int y = -RADIUS; y <= RADIUS; y++) { + for (int z = -RADIUS; z <= RADIUS; z++) { + this.blockData[index] = this.getLevel().getBlockState(this.getBlockPos().offset(x, y, z)); + index++; + } + } + } + } + + private boolean anyPlayerInRange() { + return this.getLevel().hasNearbyAlivePlayer(this.getBlockPos().getX() + 0.5D, this.getBlockPos().getY() + 0.5D, this.getBlockPos().getZ() + 0.5D, AntibuilderBlockEntity.PLAYER_RANGE); + } +} diff --git a/src/main/java/twilightforest/block/entity/CarminiteBuilderBlockEntity.java b/src/main/java/twilightforest/block/entity/CarminiteBuilderBlockEntity.java new file mode 100644 index 0000000000..de6433aaf6 --- /dev/null +++ b/src/main/java/twilightforest/block/entity/CarminiteBuilderBlockEntity.java @@ -0,0 +1,127 @@ +package twilightforest.block.entity; + +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.core.Direction; +import net.minecraft.core.BlockPos; +import net.minecraft.util.Mth; +import org.jetbrains.annotations.Nullable; +import twilightforest.init.TFBlockEntities; +import twilightforest.init.TFSounds; +import twilightforest.block.BuilderBlock; +import twilightforest.block.TranslucentBuiltBlock; +import twilightforest.init.TFBlocks; +import twilightforest.enums.TowerDeviceVariant; + +public class CarminiteBuilderBlockEntity extends BlockEntity { + private static final int RANGE = 16; + + private int ticksRunning = 0; + private int blockedCounter = 0; + private int ticksStopped = 0; + + public boolean makingBlocks = false; + + private int blocksMade = 0; + + private BlockPos lastBlockCoords; + + private Player trackedPlayer; + + private final BlockState blockBuiltState = TFBlocks.BUILT_BLOCK.get().defaultBlockState().setValue(TranslucentBuiltBlock.ACTIVE, false); + + public CarminiteBuilderBlockEntity(BlockPos pos, BlockState state) { + super(TFBlockEntities.TOWER_BUILDER.get(), pos, state); + } + + /** + * Start building stuffs + */ + public void startBuilding() { + this.makingBlocks = true; + resetStats(); + } + + public void resetStats() { + this.blocksMade = 0; + this.lastBlockCoords = getBlockPos(); + this.ticksStopped = 0; + this.blockedCounter = 0; + } + + public static void tick(Level level, BlockPos pos, BlockState state, CarminiteBuilderBlockEntity te) { + if (!level.isClientSide() && te.makingBlocks) { + // if we are not tracking the nearest player, start tracking them + if (te.trackedPlayer == null) { + te.trackedPlayer = te.findClosestValidPlayer(); + } + + // find player facing + Direction nextFacing = te.findNextFacing(); + + ++te.ticksRunning; + + // if we are at the half second marker, make a block and advance the block cursor + if (te.ticksRunning % 10 == 0 && te.lastBlockCoords != null && nextFacing != null) { + BlockPos nextPos = te.lastBlockCoords.relative(nextFacing); + + // make a block + if (te.blocksMade <= RANGE && level.isEmptyBlock(nextPos)) { + level.setBlock(nextPos, te.blockBuiltState, 3); + + level.playSound(null, pos, TFSounds.BUILDER_CREATE.get(), SoundSource.BLOCKS, 0.75F, 1.2F); + + te.lastBlockCoords = nextPos; + + te.blockedCounter = 0; + te.blocksMade++; + } else { + te.blockedCounter++; + } + } + + // if we're blocked for more than a second, shut down block making + if (te.blockedCounter > 0) { + te.makingBlocks = false; + te.trackedPlayer = null; + te.ticksStopped = 0; + } + } else if (!level.isClientSide() && !te.makingBlocks) { + te.trackedPlayer = null; + if (++te.ticksStopped == 60) { + // force the builder back into an inactive state + level.setBlockAndUpdate(pos, state.setValue(BuilderBlock.STATE, TowerDeviceVariant.BUILDER_TIMEOUT)); + level.scheduleTick(pos, state.getBlock(), 4); + } + } + } + + @Nullable + private Direction findNextFacing() { + if (this.trackedPlayer != null) { + // check up and down + int pitch = Mth.floor(trackedPlayer.getXRot() * 4.0F / 360.0F + 1.5D) & 3; + + if (pitch == 0) { + return Direction.UP; + } else if (pitch == 2) { + return Direction.DOWN; + } else { + return trackedPlayer.getDirection(); + } + } + + return null; + } + + /** + * Who is the closest player? Used to find which player we should track when building + */ + @Nullable + private Player findClosestValidPlayer() { + return this.getLevel().getNearestPlayer(this.getBlockPos().getX() + 0.5, this.getBlockPos().getY() + 0.5, this.getBlockPos().getZ() + 0.5, 16, false); + } +} diff --git a/src/main/java/twilightforest/block/entity/CarminiteReactorBlockEntity.java b/src/main/java/twilightforest/block/entity/CarminiteReactorBlockEntity.java new file mode 100644 index 0000000000..09597c8dfb --- /dev/null +++ b/src/main/java/twilightforest/block/entity/CarminiteReactorBlockEntity.java @@ -0,0 +1,236 @@ +package twilightforest.block.entity; + +import net.minecraft.core.BlockPos; +import net.minecraft.sounds.SoundSource; +import net.minecraft.util.RandomSource; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.registries.ForgeRegistries; +import twilightforest.block.CarminiteReactorBlock; +import twilightforest.data.tags.BlockTagGenerator; +import twilightforest.entity.monster.CarminiteGhastling; +import twilightforest.init.*; + +public class CarminiteReactorBlockEntity extends BlockEntity { + + private int counter = 0; + + private final int secX; + private final int secY; + private final int secZ; + private int terX, terY, terZ; + + + public CarminiteReactorBlockEntity(BlockPos pos, BlockState state) { + super(TFBlockEntities.CARMINITE_REACTOR.get(), pos, state); + RandomSource rand = RandomSource.create(); + + // determine the two smaller bursts + this.secX = 3 * (rand.nextBoolean() ? 1 : -1); + this.secY = 3 * (rand.nextBoolean() ? 1 : -1); + this.secZ = 3 * (rand.nextBoolean() ? 1 : -1); + + this.terX = 3 * (rand.nextBoolean() ? 1 : -1); + this.terY = 3 * (rand.nextBoolean() ? 1 : -1); + this.terZ = 3 * (rand.nextBoolean() ? 1 : -1); + + if (secX == terX && secY == terY && secZ == terZ) { + terX = -terX; + terY = -terY; + terZ = -terZ; + } + } + + public static void tick(Level level, BlockPos pos, BlockState state, CarminiteReactorBlockEntity te) { + + if (state.getValue(CarminiteReactorBlock.ACTIVE)) { + te.counter++; + + if (!level.isClientSide()) { + + // every 2 seconds for 10 seconds, destroy a new radius + int offset = 10; + + if (te.counter % 5 == 0) { + if (te.counter == 5) { + BlockState fakeGold = TFBlocks.FAKE_GOLD.get().defaultBlockState(); + BlockState fakeDiamond = TFBlocks.FAKE_DIAMOND.get().defaultBlockState(); + + // transformation! + te.createFakeBlock(pos.offset(1, 1, 1), fakeDiamond); + te.createFakeBlock(pos.offset(1, 1, -1), fakeDiamond); + te.createFakeBlock(pos.offset(-1, 1, 1), fakeDiamond); + te.createFakeBlock(pos.offset(-1, 1, -1), fakeDiamond); + te.createFakeBlock(pos.offset(0, 1, 0), fakeDiamond); + + te.createFakeBlock(pos.offset(0, 1, 1), fakeGold); + te.createFakeBlock(pos.offset(0, 1, -1), fakeGold); + te.createFakeBlock(pos.offset(1, 1, 0), fakeGold); + te.createFakeBlock(pos.offset(-1, 1, 0), fakeGold); + + te.createFakeBlock(pos.offset(1, 0, 1), fakeGold); + te.createFakeBlock(pos.offset(1, 0, -1), fakeGold); + te.createFakeBlock(pos.offset(-1, 0, 1), fakeGold); + te.createFakeBlock(pos.offset(-1, 0, -1), fakeGold); + + te.createFakeBlock(pos.offset(0, 0, 1), fakeDiamond); + te.createFakeBlock(pos.offset(0, 0, -1), fakeDiamond); + te.createFakeBlock(pos.offset(1, 0, 0), fakeDiamond); + te.createFakeBlock(pos.offset(-1, 0, 0), fakeDiamond); + te.createFakeBlock(pos.offset(0, -1, 0), fakeDiamond); + + te.createFakeBlock(pos.offset(1, -1, 1), fakeDiamond); + te.createFakeBlock(pos.offset(1, -1, -1), fakeDiamond); + te.createFakeBlock(pos.offset(-1, -1, 1), fakeDiamond); + te.createFakeBlock(pos.offset(-1, -1, -1), fakeDiamond); + + te.createFakeBlock(pos.offset(0, -1, 1), fakeGold); + te.createFakeBlock(pos.offset(0, -1, -1), fakeGold); + te.createFakeBlock(pos.offset(1, -1, 0), fakeGold); + te.createFakeBlock(pos.offset(-1, -1, 0), fakeGold); + + } + + + // primary burst + int primary = te.counter - 80; + + if (primary >= offset && primary <= 249) { + te.drawBlob(pos, (primary - offset) / 40, Blocks.AIR.defaultBlockState(), primary - offset, false); + } + if (primary <= 200) { + te.drawBlob(pos, primary / 40, TFBlocks.REACTOR_DEBRIS.get().defaultBlockState(), te.counter, false); + } + + // secondary burst + int secondary = te.counter - 120; + + if (secondary >= offset && secondary <= 129) { + te.drawBlob(pos.offset(te.secX, te.secY, te.secZ), (secondary - offset) / 40, Blocks.AIR.defaultBlockState(), secondary - offset, false); + } + if (secondary >= 0 && secondary <= 160) { + te.drawBlob(pos.offset(te.secX, te.secY, te.secZ), secondary / 40, Blocks.AIR.defaultBlockState(), secondary, true); + } + + // tertiary burst + int tertiary = te.counter - 160; + + if (tertiary >= offset && tertiary <= 129) { + te.drawBlob(pos.offset(te.terX, te.terY, te.terZ), (tertiary - offset) / 40, Blocks.AIR.defaultBlockState(), tertiary - offset, false); + } + if (tertiary >= 0 && tertiary <= 160) { + te.drawBlob(pos.offset(te.terX, te.terY, te.terZ), tertiary / 40, Blocks.AIR.defaultBlockState(), tertiary, true); + } + + } + + + if (te.counter >= 350) { + // deactivate & explode + level.explode(null, TFDamageTypes.getDamageSource(level, TFDamageTypes.REACTOR), null, pos.getX(), pos.getY(), pos.getZ(), 4.0F, true, Level.ExplosionInteraction.BLOCK); + level.removeBlock(pos, false); + + // spawn mini ghasts near the secondary & tertiary points + for (int i = 0; i < 3; i++) { + te.spawnGhastNear(pos.getX() + te.secX, pos.getY() + te.secY, pos.getZ() + te.secZ); + te.spawnGhastNear(pos.getX() + te.terX, pos.getY() + te.terY, pos.getZ() + te.terZ); + } + } + + } else { + if (te.counter % 5 == 0 && te.counter <= 250) { + level.playLocalSound(pos.getX() + 0.5D, pos.getY() + 0.5D, pos.getZ() + 0.5D, TFSounds.REACTOR_AMBIENT.get(), SoundSource.BLOCKS, te.counter / 100F, te.counter / 100F, false); + } + } + } + } + + + private void spawnGhastNear(int x, int y, int z) { + CarminiteGhastling ghast = TFEntities.CARMINITE_GHASTLING.get().create(this.getLevel()); + ghast.moveTo(x - 1.5 + this.getLevel().getRandom().nextFloat() * 3.0, y - 1.5 + this.getLevel().getRandom().nextFloat() * 3.0, z - 1.5 + this.getLevel().getRandom().nextFloat() * 3.0, this.getLevel().getRandom().nextFloat() * 360F, 0.0F); + ghast.addEffect(new MobEffectInstance(MobEffects.FIRE_RESISTANCE, 200)); + this.getLevel().addFreshEntity(ghast); + } + + private void drawBlob(BlockPos pos, int rad, BlockState state, int fuzz, boolean netherTransform) { + // then trace out a quadrant + for (byte dx = 0; dx <= rad; dx++) { + // transform fuzz + int fuzzX = (fuzz + dx) % 8; + + for (byte dy = 0; dy <= rad; dy++) { + int fuzzY = (fuzz + dy) % 8; + + for (byte dz = 0; dz <= rad; dz++) { + // determine how far we are from the center. + byte dist; + if (dx >= dy && dx >= dz) { + dist = (byte) (dx + (byte) ((Math.max(dy, dz) * 0.5) + (Math.min(dy, dz) * 0.25))); + } else if (dy >= dx && dy >= dz) { + dist = (byte) (dy + (byte) ((Math.max(dx, dz) * 0.5) + (Math.min(dx, dz) * 0.25))); + } else { + dist = (byte) (dz + (byte) ((Math.max(dx, dy) * 0.5) + (Math.min(dx, dy) * 0.25))); + } + + // if we're inside the blob, fill it + if (dist == rad && !(dx == 0 && dy == 0 && dz == 0)) { + // do eight at a time for easiness! + switch (fuzzX) { + case 0 -> this.transformBlock(pos.offset(dx, dy, dz), state, fuzzY, netherTransform); + case 1 -> this.transformBlock(pos.offset(dx, dy, -dz), state, fuzzY, netherTransform); + case 2 -> this.transformBlock(pos.offset(-dx, dy, dz), state, fuzzY, netherTransform); + case 3 -> this.transformBlock(pos.offset(-dx, dy, -dz), state, fuzzY, netherTransform); + case 4 -> this.transformBlock(pos.offset(dx, -dy, dz), state, fuzzY, netherTransform); + case 5 -> this.transformBlock(pos.offset(dx, -dy, -dz), state, fuzzY, netherTransform); + case 6 -> this.transformBlock(pos.offset(-dx, -dy, dz), state, fuzzY, netherTransform); + case 7 -> this.transformBlock(pos.offset(-dx, -dy, -dz), state, fuzzY, netherTransform); + } + } + } + } + } + } + + private void transformBlock(BlockPos pos, BlockState state, int fuzz, boolean netherTransform) { + BlockState stateThere = this.getLevel().getBlockState(pos); + + if (stateThere.getBlock() != Blocks.AIR && (stateThere.is(BlockTagGenerator.CARMINITE_REACTOR_IMMUNE) || stateThere.getDestroySpeed(level, pos) == -1)) { + // don't destroy unbreakable stuff + return; + } + + if (fuzz == 0 && stateThere.getBlock() != Blocks.AIR) { + // make pop thing for original block + this.getLevel().levelEvent(2001, pos, Block.getId(stateThere)); + } + + if (netherTransform && stateThere.getBlock() != Blocks.AIR) { + BlockState ore = ForgeRegistries.BLOCKS.tags().getTag(BlockTagGenerator.CARMINITE_REACTOR_ORES).getRandomElement(this.getLevel().getRandom()).get().defaultBlockState(); + + this.getLevel().setBlock(pos, (this.getLevel().getRandom().nextInt(8) == 0 ? ore : Blocks.NETHERRACK.defaultBlockState()), 3); + // fire on top? + if (this.getLevel().isEmptyBlock(pos.above()) && fuzz % 3 == 0) { + this.getLevel().setBlock(pos.above(), Blocks.FIRE.defaultBlockState(), 3); + } + } else { + this.getLevel().setBlock(pos, state, 3); + } + } + + private void createFakeBlock(BlockPos pos, BlockState state) { + BlockState stateThere = this.getLevel().getBlockState(pos); + + // don't destroy unbreakable stuff + if (stateThere.getBlock() != Blocks.AIR && + !(stateThere.is(BlockTagGenerator.CARMINITE_REACTOR_IMMUNE) || + (stateThere.getDestroySpeed(this.getLevel(), pos) == -1))) { + this.getLevel().setBlock(pos, state, 2); + } + } +} diff --git a/src/main/java/twilightforest/block/entity/CicadaBlockEntity.java b/src/main/java/twilightforest/block/entity/CicadaBlockEntity.java new file mode 100644 index 0000000000..05faced010 --- /dev/null +++ b/src/main/java/twilightforest/block/entity/CicadaBlockEntity.java @@ -0,0 +1,86 @@ +package twilightforest.block.entity; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.sounds.SoundSource; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import twilightforest.TFConfig; +import twilightforest.init.TFBlockEntities; +import twilightforest.init.TFSounds; + +public class CicadaBlockEntity extends BlockEntity { + private int yawDelay; + public int currentYaw; + private int desiredYaw; + + private int singDuration; + private boolean singing; + private int singDelay; + public float randRot = RandomSource.create().nextInt(4) * 90.0F; + + public CicadaBlockEntity(BlockPos pos, BlockState state) { + super(TFBlockEntities.CICADA.get(), pos, state); + } + + public static void tick(Level level, BlockPos pos, BlockState state, CicadaBlockEntity te) { + if (level.isClientSide()) { + if (te.yawDelay > 0) { + te.yawDelay--; + } else { + if (te.currentYaw == 0 && te.desiredYaw == 0) { + // make it rotate! + te.yawDelay = 200 + level.getRandom().nextInt(200); + te.desiredYaw = level.getRandom().nextInt(15) - level.getRandom().nextInt(15); + } + + if (te.currentYaw < te.desiredYaw) { + te.currentYaw++; + } + if (te.currentYaw > te.desiredYaw) { + te.currentYaw--; + } + if (te.currentYaw == te.desiredYaw) { + te.desiredYaw = 0; + } + } + + if (te.singDelay > 0) { + te.singDelay--; + } else { + if (te.singing && te.singDuration == 0) { + te.playSong(); + } + if (te.singing && te.singDuration >= 100) { + te.singing = false; + te.singDuration = 0; + } + if (te.singing && te.singDuration < 100) { + te.singDuration++; + te.doSingAnimation(); + } + if (!te.singing && te.singDuration <= 0) { + te.singing = true; + te.singDelay = 100 + level.getRandom().nextInt(100); + } + } + } + } + + private void doSingAnimation() { + if (this.getLevel().getRandom().nextInt(5) == 0) { + double rx = this.getBlockPos().getX() + this.getLevel().getRandom().nextFloat(); + double ry = this.getBlockPos().getY() + this.getLevel().getRandom().nextFloat(); + double rz = this.getBlockPos().getZ() + this.getLevel().getRandom().nextFloat(); + this.getLevel().addParticle(ParticleTypes.NOTE, rx, ry, rz, 0.0D, 0.0D, 0.0D); + } + } + + private void playSong() { + if (!TFConfig.CLIENT_CONFIG.silentCicadas.get()) { + this.getLevel().playLocalSound(this.getBlockPos().getX(), this.getBlockPos().getY(), this.getBlockPos().getZ(), TFSounds.CICADA.get(), SoundSource.NEUTRAL, 1.0f, (this.getLevel().getRandom().nextFloat() - this.getLevel().getRandom().nextFloat()) * 0.2F + 1.0F, false); + } + } +} diff --git a/src/main/java/twilightforest/block/entity/CinderFurnaceBlockEntity.java b/src/main/java/twilightforest/block/entity/CinderFurnaceBlockEntity.java new file mode 100644 index 0000000000..4efb312282 --- /dev/null +++ b/src/main/java/twilightforest/block/entity/CinderFurnaceBlockEntity.java @@ -0,0 +1,257 @@ +package twilightforest.block.entity; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.tags.BlockTags; +import net.minecraft.tags.ItemTags; +import net.minecraft.util.Mth; +import net.minecraft.util.RandomSource; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.crafting.AbstractCookingRecipe; +import net.minecraft.world.item.crafting.Recipe; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.RotatedPillarBlock; +import net.minecraft.world.level.block.entity.FurnaceBlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.common.Tags; +import twilightforest.block.CinderFurnaceBlock; +import twilightforest.init.TFBlocks; + +import org.jetbrains.annotations.Nullable; + +public class CinderFurnaceBlockEntity extends FurnaceBlockEntity { + private static final int SMELT_LOG_FACTOR = 10; + + public CinderFurnaceBlockEntity(BlockPos pos, BlockState state) { + super(pos, state); + } + + // [VanillaCopy] of superclass, edits noted + public static void tick(Level level, BlockPos pos, BlockState state, CinderFurnaceBlockEntity te) { + boolean flag = te.isBurning(); + boolean flag1 = false; + + if (te.isBurning()) { + --te.litTime; + } + + if (!level.isClientSide()) { + ItemStack itemstack = te.items.get(1); + + if (te.isBurning() || !itemstack.isEmpty() && !te.items.get(0).isEmpty()) { + Recipe irecipe = level.getRecipeManager().getRecipeFor(RecipeType.SMELTING, te, level).orElse(null); + if (!te.isBurning() && te.canBurn(irecipe)) { + te.litTime = te.getBurnDuration(itemstack); + te.litDuration = te.litTime; + + if (te.isBurning()) { + flag1 = true; + + if (!itemstack.isEmpty()) { + Item item = itemstack.getItem(); + itemstack.shrink(1); + + if (itemstack.isEmpty()) { + ItemStack item1 = item.getCraftingRemainingItem(itemstack); + te.items.set(1, item1); + } + } + } + } + + if (te.isBurning() && te.canBurn(irecipe)) { + // TF - cook faster + te.cookingProgress += te.getCurrentSpeedMultiplier(); + + if (te.cookingProgress >= te.cookingTotalTime) { // TF - change to geq since we can increment by >1 + te.cookingProgress = 0; + te.cookingTotalTime = te.getRecipeBurnTime(); + te.smeltItem(irecipe); + flag1 = true; + } + } else { + te.cookingProgress = 0; + } + } else if (!te.isBurning() && te.cookingProgress > 0) { + te.cookingProgress = Mth.clamp(te.cookingProgress - 2, 0, te.cookingTotalTime); + } + + if (flag != te.isBurning()) { + flag1 = true; + level.setBlock(pos, level.getBlockState(pos).setValue(CinderFurnaceBlock.LIT, te.isBurning()), 3); // TF - use our furnace + } + + // TF - occasionally cinderize nearby logs + if (te.isBurning() && te.litTime % 5 == 0) { + te.cinderizeNearbyLog(); + } + } + + if (flag1) { + te.setChanged(); + } + } + + // [VanillaCopy] of super + private boolean isBurning() { + return this.litTime > 0; + } + + // [VanillaCopy] of super, only using SMELTING IRecipeType + protected int getRecipeBurnTime() { + return this.getLevel().getRecipeManager().getRecipeFor(RecipeType.SMELTING, this, this.getLevel()).map(AbstractCookingRecipe::getCookingTime).orElse(200); + } + + private void cinderizeNearbyLog() { + RandomSource rand = this.getLevel().getRandom(); + + int dx = rand.nextInt(2) - rand.nextInt(2); + int dy = rand.nextInt(2) - rand.nextInt(2); + int dz = rand.nextInt(2) - rand.nextInt(2); + BlockPos pos = this.getBlockPos().offset(dx, dy, dz); + + if (this.getLevel().hasChunkAt(pos)) { + BlockState nearbyBlock = this.getLevel().getBlockState(pos); + + if (!nearbyBlock.is(TFBlocks.CINDER_LOG.get()) && nearbyBlock.is(BlockTags.LOGS)) { + this.getLevel().setBlock(pos, this.getCinderLog(dx, dy, dz), 2); + this.getLevel().levelEvent(2004, pos, 0); + this.getLevel().levelEvent(2004, pos, 0); + this.getLevel().playSound(null, pos, SoundEvents.FIRE_AMBIENT, SoundSource.BLOCKS, 1.0F, 1.0F); + } + } + } + + /** + * What meta should we set the log block with the specified offset to? + */ + private BlockState getCinderLog(int dx, int dy, int dz) { + @Nullable Direction.Axis direction; + if (dz == 0 && dx != 0) { + direction = dy == 0 ? Direction.Axis.X : Direction.Axis.Z; + } else if (dx == 0 && dz != 0) { + direction = dy == 0 ? Direction.Axis.Z : Direction.Axis.X; + } else if (dx == 0) { + direction = Direction.Axis.Y; + } else { + direction = dy == 0 ? Direction.Axis.Y : null; //We return null so we can get Cinder Wood. + } + + return direction != null ? TFBlocks.CINDER_LOG.get().defaultBlockState().setValue(RotatedPillarBlock.AXIS, direction) + : TFBlocks.CINDER_WOOD.get().defaultBlockState(); + } + + /** + * What is the current speed multiplier, as an int. + */ + private int getCurrentSpeedMultiplier() { + return this.getCurrentMultiplier(2); + } + + /** + * Returns a number that is based on the number of nearby logs divided by the factor given. + */ + private int getCurrentMultiplier(int factor) { + int logs = this.countNearbyLogs(); + + if (logs < factor) { + return 1; + } else { + return (logs / factor) + (this.getLevel().getRandom().nextInt(factor) >= (logs % factor) ? 0 : 1); + } + } + + private int countNearbyLogs() { + int count = 0; + + for (int dx = -1; dx <= 1; dx++) { + for (int dy = -1; dy <= 1; dy++) { + for (int dz = -1; dz <= 1; dz++) { + BlockPos pos = getBlockPos().offset(dx, dy, dz); + if (this.getLevel().hasChunkAt(pos) && this.getLevel().getBlockState(pos).getBlock() == TFBlocks.CINDER_LOG.get()) { + count++; + } + } + } + } + + return count; + } + + // [VanillaCopy] of superclass ver, changes noted + //@Override + protected boolean canBurn(Recipe recipe) { + if (this.items.get(0).isEmpty()) { + return false; + } else { + ItemStack itemstack = recipe.getResultItem(this.getLevel().registryAccess()); + + if (itemstack.isEmpty()) { + return false; + } else { + ItemStack itemstack1 = this.items.get(2); + if (itemstack1.isEmpty()) return true; + if (!itemstack1.sameItem(itemstack)) return false; + int result = itemstack1.getCount() + getMaxOutputStacks(items.get(0), itemstack); // TF - account for multiplying + return result <= this.getMaxStackSize() && result <= itemstack1.getMaxStackSize(); // Forge fix: make furnace respect stack sizes in furnace recipes + } + } + } + + /** + * Return the max number of items in the output stack, given our current multiplier + */ + public int getMaxOutputStacks(ItemStack input, ItemStack output) { + if (this.canMultiply(input, output)) { + return output.getCount() * this.getCurrentMaxSmeltMultiplier(); + } else { + return output.getCount(); + } + } + + // [VanillaCopy] superclass, using our own canSmelt and multiplying output + public void smeltItem(Recipe recipe) { + if (this.canBurn(recipe)) { + ItemStack itemstack = this.items.get(0); + ItemStack itemstack1 = recipe.getResultItem(this.getLevel().registryAccess()); + itemstack1.setCount(itemstack1.getCount() * this.getCurrentSmeltMultiplier()); + ItemStack itemstack2 = this.items.get(2); + + if (itemstack2.isEmpty()) { + this.items.set(2, itemstack1.copy()); + } else if (itemstack2.getItem() == itemstack1.getItem()) { + itemstack2.grow(itemstack1.getCount()); + } + + if (itemstack.getItem() == Blocks.WET_SPONGE.asItem() && !this.items.get(1).isEmpty() && this.items.get(1).getItem() == Items.BUCKET) { + this.items.set(1, new ItemStack(Items.WATER_BUCKET)); + } + + itemstack.shrink(1); + } + } + + private boolean canMultiply(ItemStack input, ItemStack output) { + return input.is(ItemTags.LOGS) || input.is(Tags.Items.ORES); + } + + /** + * What is the current speed multiplier, as an int. + */ + private int getCurrentSmeltMultiplier() { + return this.getCurrentMultiplier(SMELT_LOG_FACTOR); + } + + /** + * What is the current speed multiplier, as an int. + */ + private int getCurrentMaxSmeltMultiplier() { + return (int) Math.ceil((float) this.countNearbyLogs() / (float) SMELT_LOG_FACTOR); + } +} diff --git a/src/main/java/twilightforest/block/entity/FireJetBlockEntity.java b/src/main/java/twilightforest/block/entity/FireJetBlockEntity.java new file mode 100644 index 0000000000..6abedbcd75 --- /dev/null +++ b/src/main/java/twilightforest/block/entity/FireJetBlockEntity.java @@ -0,0 +1,112 @@ +package twilightforest.block.entity; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.AABB; +import twilightforest.init.TFBlockEntities; +import twilightforest.init.TFSounds; +import twilightforest.block.FireJetBlock; +import twilightforest.init.TFBlocks; +import twilightforest.enums.FireJetVariant; +import twilightforest.init.TFParticleType; +import twilightforest.init.TFDamageTypes; + +import java.util.List; + +public class FireJetBlockEntity extends BlockEntity { + + private int counter = 0; + + public FireJetBlockEntity(BlockPos pos, BlockState state) { + super(TFBlockEntities.FLAME_JET.get(), pos, state); + } + + public static void tick(Level level, BlockPos pos, BlockState state, FireJetBlockEntity te) { + if (state.getBlock() == TFBlocks.FIRE_JET.get() || state.getBlock() == TFBlocks.ENCASED_FIRE_JET.get()) { + switch (state.getValue(FireJetBlock.STATE)) { + case POPPING -> te.tickPopping(level, pos, state, te); + case FLAME -> te.tickFlame(level, pos, state, te); + } + } + } + + private void tickPopping(Level level, BlockPos pos, BlockState state, FireJetBlockEntity te) { + if (++te.counter >= 80) { + te.counter = 0; + // turn to flame + if (!level.isClientSide()) { + if (state.getBlock() == TFBlocks.FIRE_JET.get() || state.getBlock() == TFBlocks.ENCASED_FIRE_JET.get()) { + level.setBlockAndUpdate(pos, state.setValue(FireJetBlock.STATE, FireJetVariant.FLAME)); + } else { + level.removeBlock(pos, false); + } + } + } else { + if (te.counter % 20 == 0) { + for (int i = 0; i < 8; i++) + { + level.addParticle(ParticleTypes.LAVA, pos.getX() + 0.5, pos.getY() + 1.5, pos.getZ() + 0.5, 0.0D, 0.0D, 0.0D); + } + level.playSound(null, pos, TFSounds.JET_POP.get(), SoundSource.BLOCKS, 0.2F + level.random.nextFloat() * 0.2F, 0.9F + level.random.nextFloat() * 0.15F); + } + } + } + + private void tickFlame(Level level, BlockPos pos, BlockState state, FireJetBlockEntity te) { + double x = pos.getX(); + double y = pos.above().getY(); + double z = pos.getZ(); + + if (++te.counter > 60) { + te.counter = 0; + // idle again + if (!level.isClientSide()) { + if (state.getBlock() == TFBlocks.FIRE_JET.get() || state.getBlock() == TFBlocks.ENCASED_FIRE_JET.get()) { + level.setBlockAndUpdate(pos, state.setValue(FireJetBlock.STATE, state.getBlock() == TFBlocks.FIRE_JET.get() ? FireJetVariant.IDLE : FireJetVariant.TIMEOUT)); + } else { + level.removeBlock(pos, false); + } + } + } + + if (level.isClientSide()) { + if (te.counter % 2 == 0) { + level.addParticle(ParticleTypes.LARGE_SMOKE, x + 0.5, y + 1.0, z + 0.5, 0.0D, 0.0D, 0.0D); + level.addParticle(TFParticleType.LARGE_FLAME.get(), x + 0.5, y + 1.0, z + 0.5, 0.0D, 0.5D, 0.0D); + level.addParticle(TFParticleType.LARGE_FLAME.get(), x - 0.5, y + 1.0, z + 0.5, 0.05D, 0.5D, 0.0D); + level.addParticle(TFParticleType.LARGE_FLAME.get(), x + 0.5, y + 1.0, z - 0.5, 0.0D, 0.5D, 0.05D); + level.addParticle(TFParticleType.LARGE_FLAME.get(), x + 1.5, y + 1.0, z + 0.5, -0.05D, 0.5D, 0.0D); + level.addParticle(TFParticleType.LARGE_FLAME.get(), x + 0.5, y + 1.0, z + 1.5, 0.0D, 0.5D, -0.05D); + } + + // sounds + if (te.counter % 4 == 0) { + level.playLocalSound(x + 0.5, y + 0.5, z + 0.5, TFSounds.JET_ACTIVE.get(), SoundSource.BLOCKS, 1.0F + level.random.nextFloat(), level.random.nextFloat() * 0.7F + 0.3F, false); + + } else if (te.counter == 1) { + level.playLocalSound(x + 0.5, y + 0.5, z + 0.5, TFSounds.JET_START.get(), SoundSource.BLOCKS, 1.0F + level.random.nextFloat(), level.random.nextFloat() * 0.7F + 0.3F, false); + } + } + + // actual fire effects + if (!level.isClientSide()) { + if (te.counter % 5 == 0) { + // find entities in the area of effect + List entitiesInRange = level.getEntitiesOfClass(Entity.class, + new AABB(pos.offset(-2, 0, -2), pos.offset(2, 4, 2))); + // fire! + for (Entity entity : entitiesInRange) { + if (!entity.fireImmune()) { + entity.hurt(TFDamageTypes.getDamageSource(level, TFDamageTypes.FIRE_JET), 2); + entity.setSecondsOnFire(15); + } + } + } + } + } +} diff --git a/src/main/java/twilightforest/block/entity/FireflyBlockEntity.java b/src/main/java/twilightforest/block/entity/FireflyBlockEntity.java new file mode 100644 index 0000000000..030a17f540 --- /dev/null +++ b/src/main/java/twilightforest/block/entity/FireflyBlockEntity.java @@ -0,0 +1,84 @@ +package twilightforest.block.entity; + +import net.minecraft.core.BlockPos; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import twilightforest.init.TFBlockEntities; +import twilightforest.init.TFParticleType; + +public class FireflyBlockEntity extends BlockEntity { + + private int yawDelay; + public int currentYaw; + private int desiredYaw; + + public float glowIntensity; + private boolean glowing; + private int glowDelay; + public float randRot = RandomSource.create().nextInt(4) * 90.0F; + + public FireflyBlockEntity(BlockPos pos, BlockState state) { + super(TFBlockEntities.FIREFLY.get(), pos, state); + } + + public static void tick(Level level, BlockPos pos, BlockState state, FireflyBlockEntity te) { + if (level.isClientSide()) { + if (te.anyPlayerInRange() && level.getRandom().nextInt(20) == 0) { + te.spawnParticles(); + } + + if (te.yawDelay > 0) { + te.yawDelay--; + } else { + if (te.currentYaw == 0 && te.desiredYaw == 0) { + // make it rotate! + te.yawDelay = 200 + level.getRandom().nextInt(200); + te.desiredYaw = level.getRandom().nextInt(15) - level.getRandom().nextInt(15); + } + + if (te.currentYaw < te.desiredYaw) { + te.currentYaw++; + } + if (te.currentYaw > te.desiredYaw) { + te.currentYaw--; + } + if (te.currentYaw == te.desiredYaw) { + te.desiredYaw = 0; + } + } + + if (te.glowDelay > 0) { + te.glowDelay--; + } else { + if (te.glowing && te.glowIntensity >= 1.0) { + te.glowing = false; + } + if (te.glowing && te.glowIntensity < 1.0) { + te.glowIntensity += 0.05; + } + if (!te.glowing && te.glowIntensity > 0) { + te.glowIntensity -= 0.05; + } + if (!te.glowing && te.glowIntensity <= 0) { + te.glowing = true; + te.glowDelay = level.getRandom().nextInt(50); + } + } + } + } + + private boolean anyPlayerInRange() { + return this.getLevel().getNearestPlayer(this.getBlockPos().getX() + 0.5D, this.getBlockPos().getY() + 0.5D, this.getBlockPos().getZ() + 0.5D, 16D, false) != null; + } + + private void spawnParticles() { + double rx = this.getBlockPos().getX() + this.getLevel().getRandom().nextFloat(); + double ry = this.getBlockPos().getY() + this.getLevel().getRandom().nextFloat(); + double rz = this.getBlockPos().getZ() + this.getLevel().getRandom().nextFloat(); +// ModLoader.getMinecraftInstance().effectRenderer.addEffect(fireflyfx); + // ^ keeping here only for pure lolz + this.getLevel().addParticle(TFParticleType.FIREFLY.get(), rx, ry, rz, 0, 0, 0); + } +} diff --git a/src/main/java/twilightforest/block/entity/GhastTrapBlockEntity.java b/src/main/java/twilightforest/block/entity/GhastTrapBlockEntity.java new file mode 100644 index 0000000000..be8c09e192 --- /dev/null +++ b/src/main/java/twilightforest/block/entity/GhastTrapBlockEntity.java @@ -0,0 +1,208 @@ +package twilightforest.block.entity; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.sounds.SoundSource; +import net.minecraft.util.RandomSource; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.damagesource.DamageTypes; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.monster.Ghast; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.AABB; +import twilightforest.init.TFBlockEntities; +import twilightforest.init.TFSounds; +import twilightforest.block.GhastTrapBlock; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFParticleType; +import twilightforest.entity.boss.UrGhast; +import twilightforest.entity.monster.CarminiteGhastguard; +import twilightforest.entity.monster.CarminiteGhastling; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +public class GhastTrapBlockEntity extends BlockEntity { + + private int counter = 0; + private final List dyingGhasts = new ArrayList<>(); + private final RandomSource rand = RandomSource.create(); + + public GhastTrapBlockEntity(BlockPos pos, BlockState state) { + super(TFBlockEntities.GHAST_TRAP.get(), pos, state); + } + + private void tickInactive(Level level, BlockPos pos, BlockState state, GhastTrapBlockEntity te) { + // check to see if there are any dying mini ghasts within our scan range + AABB aabb = new AABB(pos).inflate(10D, 16D, 10D); + + List nearbyGhasts = level.getEntitiesOfClass(CarminiteGhastling.class, aabb); + + for (CarminiteGhastling ghast : nearbyGhasts) { + if (ghast.deathTime > 0) { + te.makeParticlesTo(ghast); + + if (!te.dyingGhasts.contains(ghast)) { + te.dyingGhasts.add(ghast); + } + } + } + + // display charge level, up to 3 + int chargeLevel = Math.min(3, te.dyingGhasts.size()); + + te.counter++; + + if (level.isClientSide()) { + // occasionally make a redstone line to a mini ghast + if (te.counter % 20 == 0 && nearbyGhasts.size() > 0) { + CarminiteGhastling highlight = nearbyGhasts.get(te.rand.nextInt(nearbyGhasts.size())); + te.makeParticlesTo(highlight); + } + + if (chargeLevel >= 1 && te.counter % 10 == 0) { + TFBlocks.GHAST_TRAP.get().sparkle(level, pos); + level.playLocalSound(pos.getX() + 0.5D, pos.getY() + 1.5D, pos.getZ() + 0.5D, TFSounds.GHAST_TRAP_AMBIENT.get(), SoundSource.BLOCKS, 1.0F, 1.0F, false); + } + if (chargeLevel >= 2) { + level.addParticle(ParticleTypes.SMOKE, pos.getX() + 0.1 + te.rand.nextFloat() * 0.8, pos.getY() + 1.05, pos.getZ() + 0.1 + te.rand.nextFloat() * 0.8, (te.rand.nextFloat() - te.rand.nextFloat()) * 0.05, 0.00, (te.rand.nextFloat() - te.rand.nextFloat()) * 0.05); + if (te.counter % 10 == 0) { + level.playLocalSound(pos.getX() + 0.5D, pos.getY() + 1.5D, pos.getZ() + 0.5D, TFSounds.GHAST_TRAP_AMBIENT.get(), SoundSource.BLOCKS, 1.2F, 0.8F, false); + } + } + if (chargeLevel >= 3) { + level.addParticle(ParticleTypes.LARGE_SMOKE, pos.getX() + 0.1 + te.rand.nextFloat() * 0.8, pos.getY() + 1.05, pos.getZ() + 0.1 + te.rand.nextFloat() * 0.8, (te.rand.nextFloat() - te.rand.nextFloat()) * 0.05, 0.05, (te.rand.nextFloat() - te.rand.nextFloat()) * 0.05); + TFBlocks.GHAST_TRAP.get().sparkle(level, pos); + if (te.counter % 5 == 0) { + level.playLocalSound(pos.getX() + 0.5D, pos.getY() + 1.5D, pos.getZ() + 0.5D, TFSounds.GHAST_TRAP_AMBIENT.get(), SoundSource.BLOCKS, 1.5F, 2F, false); + } + } + } + } + + private void makeParticlesTo(Entity highlight) { + + double sx = this.getBlockPos().getX() + 0.5D; + double sy = this.getBlockPos().getY() + 1.0D; + double sz = this.getBlockPos().getZ() + 0.5D; + + double dx = sx - highlight.getX(); + double dy = sy - highlight.getY() - highlight.getEyeHeight(); + double dz = sz - highlight.getZ(); + + for (int i = 0; i < 5; i++) { + this.getLevel().addParticle(TFParticleType.GHAST_TRAP.get(), sx, sy, sz, -dx, -dy, -dz); + } + } + + public boolean isCharged() { + return this.dyingGhasts.size() >= 3; + } + + public static void tick(Level level, BlockPos pos, BlockState state, GhastTrapBlockEntity te) { + if (state.getValue(GhastTrapBlock.ACTIVE)) { + te.tickActive(level, pos, state, te); + } else { + te.tickInactive(level, pos, state, te); + } + } + + @Override + public boolean triggerEvent(int event, int payload) { + if (event == GhastTrapBlock.ACTIVATE_EVENT) { + this.counter = 0; + this.dyingGhasts.clear(); + return true; + } + if (event == GhastTrapBlock.DEACTIVATE_EVENT) { + this.counter = 0; + return true; + } + return false; + } + + private void tickActive(Level level, BlockPos pos, BlockState state, GhastTrapBlockEntity te) { + ++te.counter; + + if (level.isClientSide()) { + // smoke when done + if (te.counter > 100 && te.counter % 4 == 0) { + level.addParticle(TFParticleType.HUGE_SMOKE.get(), pos.getX() + 0.5, pos.getY() + 0.95, pos.getZ() + 0.5, Math.cos(te.counter / 10.0) * 0.05, 0.25D, Math.sin(te.counter / 10.0) * 0.05); + + } else if (te.counter < 100) { + + double x = pos.getX() + 0.5D; + double y = pos.getY() + 1.0D; + double z = pos.getZ() + 0.5D; + + double dx = Math.cos(te.counter / 10.0) * 2.5; + double dy = 20D; + double dz = Math.sin(te.counter / 10.0) * 2.5; + + level.addParticle(TFParticleType.GHAST_TRAP.get(), x, y, z, dx, dy, dz); + level.addParticle(TFParticleType.GHAST_TRAP.get(), x, y, z, -dx, dy, -dz); + level.addParticle(TFParticleType.GHAST_TRAP.get(), x, y, z, -dx, dy / 2, dz); + level.addParticle(TFParticleType.GHAST_TRAP.get(), x, y, z, dx, dy / 2, -dz); + level.addParticle(TFParticleType.GHAST_TRAP.get(), x, y, z, dx / 2, dy / 4, dz / 2); + level.addParticle(TFParticleType.GHAST_TRAP.get(), x, y, z, -dx / 2, dy / 4, -dz / 2); + } + + // appropriate sound + if (te.counter < 30) { + level.playLocalSound(pos.getX() + 0.5D, pos.getY() + 1.5D, pos.getZ() + 0.5D, TFSounds.GHAST_TRAP_WARMUP.get(), SoundSource.BLOCKS, 1.0F, 4.0F, false); + } else if (te.counter < 80) { + level.playLocalSound(pos.getX() + 0.5D, pos.getY() + 1.5D, pos.getZ() + 0.5D, TFSounds.GHAST_TRAP_ON.get(), SoundSource.BLOCKS, 1.0F, 4.0F, false); + } else { + level.playLocalSound(pos.getX() + 0.5D, pos.getY() + 1.5D, pos.getZ() + 0.5D, TFSounds.GHAST_TRAP_SPINDOWN.get(), SoundSource.BLOCKS, 1.0F, 4.0F, false); + } + } else { + // trap nearby ghasts + AABB aabb = new AABB(pos.above(16), pos.above(16).offset(1, 1, 1)).inflate(6D, 16D, 6D); + + List nearbyGhasts = level.getEntitiesOfClass(Ghast.class, aabb); + + for (Ghast ghast : nearbyGhasts) { + //stop boss tantrum + if (ghast instanceof UrGhast urghast) { + urghast.setInTantrum(false); + ghast.noPhysics = true; // turn this on so we can pull it in close + + // move boss to this point + double mx = (ghast.getX() - pos.getX() - 0.5) * -0.1; + double my = (ghast.getY() - pos.getY() - 2.5) * -0.1; + double mz = (ghast.getZ() - pos.getZ() - 0.5) * -0.1; + ghast.setDeltaMovement(mx, my, mz); + + if (te.rand.nextInt(10) == 0) { + ghast.hurt(level.damageSources().generic(), 7); + urghast.resetDamageUntilNextPhase(); + } + + } else { + // move ghasts to this point + double mx = (ghast.getX() - pos.getX() - 0.5) * -0.1; + double my = (ghast.getY() - pos.getY() - 1.5) * -0.1; + double mz = (ghast.getZ() - pos.getZ() - 0.5) * -0.1; + ghast.setDeltaMovement(mx, my, mz); + + if (te.rand.nextInt(10) == 0) { + ghast.hurt(level.damageSources().generic(), 10); + } + } + + if (ghast instanceof CarminiteGhastguard) { + ((CarminiteGhastguard) ghast).setInTrap(); + } + + } + + if (te.counter >= 120) { + level.setBlockAndUpdate(pos, state.setValue(GhastTrapBlock.ACTIVE, false)); + level.blockEvent(pos, state.getBlock(), GhastTrapBlock.DEACTIVATE_EVENT, 0); + } + } + } +} diff --git a/src/main/java/twilightforest/block/entity/GrowingBeanstalkBlockEntity.java b/src/main/java/twilightforest/block/entity/GrowingBeanstalkBlockEntity.java new file mode 100644 index 0000000000..0c7472432b --- /dev/null +++ b/src/main/java/twilightforest/block/entity/GrowingBeanstalkBlockEntity.java @@ -0,0 +1,222 @@ +package twilightforest.block.entity; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.particles.BlockParticleOption; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.tags.BlockTags; +import net.minecraft.util.Mth; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.LeavesBlock; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import twilightforest.init.TFBlockEntities; +import twilightforest.init.TFBlocks; + +public class GrowingBeanstalkBlockEntity extends BlockEntity { + + private int ticker; + private int layer; + private boolean isAreaClearEnough = true; + + private int nextLeafY; + private int yOffset; + private float cScale; + private float rScale; + private int maxY; + private int blocksSkipped; + + public GrowingBeanstalkBlockEntity(BlockPos pos, BlockState state) { + super(TFBlockEntities.BEANSTALK_GROWER.get(), pos, state); + } + + public static void tick(Level level, BlockPos pos, BlockState state, GrowingBeanstalkBlockEntity te) { + te.ticker++; + if (te.ticker == 1) { + //initialize shit. We can't do this in the ctor because there is no level yet + te.nextLeafY = pos.getY() + 10 + level.getRandom().nextInt(10); + te.yOffset = level.getRandom().nextInt(100); + te.cScale = level.getRandom().nextFloat() * 0.25F + 0.125F; // spiral tightness scaling //make this number negative to reverse the spiral + te.rScale = level.getRandom().nextFloat() * 0.25F + 0.125F; // radius change scaling + te.maxY = Math.max(pos.getY() + 100, 175); + } + if (level.isClientSide()) { + if (te.ticker < 100) { + for (int i = 0; i < 20; i++) { + float x = (pos.getX() + level.getRandom().nextFloat()) + level.getRandom().nextInt(5) * (level.getRandom().nextBoolean() ? -1 : 1); + float z = (pos.getZ() + level.getRandom().nextFloat()) + level.getRandom().nextInt(5) * (level.getRandom().nextBoolean() ? -1 : 1); + + BlockState underState = level.getBlockState(BlockPos.containing(x, pos.below().getY(), z)); + if (underState.getMaterial().isSolid()) { + level.addAlwaysVisibleParticle( + new BlockParticleOption(ParticleTypes.BLOCK, underState), + x, + pos.getY(), + z, + 0.0F, 0.0F, 0.0F); + } + } + } + } else { + if (te.ticker > 100 && te.ticker % 2 == 0) { + int layerYPos = pos.getY() + te.layer; + if (te.isAreaClearEnough && layerYPos < te.maxY) { + + float x = pos.getX(); + float z = pos.getZ(); + + float radius = 4F + Mth.sin((pos.getY() + te.yOffset) * te.rScale) * 3F; // make radius a little wavy + x -= Mth.sin((pos.getY() + te.yOffset) * te.cScale) * radius; + z -= Mth.cos((pos.getY() + te.yOffset) * te.cScale) * radius; + + // make radius a little wavy + radius = 5F + Mth.sin((layerYPos + te.yOffset) * te.rScale) * 2.5F; + + // find center of stalk + float cx = x + Mth.sin((layerYPos + te.yOffset) * te.cScale) * radius; + float cz = z + Mth.cos((layerYPos + te.yOffset) * te.cScale) * radius; + + + float stalkThickness = 2.5F; + + // reduce thickness near top + if (te.maxY - layerYPos < 5) { + stalkThickness *= (te.maxY - layerYPos) / 5F; + } + + int minX = Mth.floor(x - radius - stalkThickness); + int maxX = Mth.ceil(x + radius + stalkThickness); + int minZ = Mth.floor(z - radius - stalkThickness); + int maxZ = Mth.ceil(z + radius + stalkThickness); + + // generate stalk + for (int dx = minX; dx < maxX && te.isAreaClearEnough; dx++) { + for (int dz = minZ; dz < maxZ && te.isAreaClearEnough; dz++) { + float circle = (dx - cx) * (dx - cx) + (dz - cz) * (dz - cz); + if (circle < stalkThickness * stalkThickness) { + te.isAreaClearEnough = te.tryToPlaceStalk(level, new BlockPos(dx, layerYPos, dz), true); + if (circle < stalkThickness) { + te.tryToPlaceStalk(level, new BlockPos(dx, layerYPos + 1, dz), false); + if (circle < stalkThickness / 2) { + te.tryToPlaceStalk(level, new BlockPos(dx, layerYPos + 2, dz), false); + } + } + } + } + } + + //reset skipped blocks as we're moving on to a new layer + te.blocksSkipped = 0; + + // leaves? + if (layerYPos == te.nextLeafY) { + // make leaf blob + + boolean wasAnEvenNumber = te.nextLeafY % 2 == 0; + + float v = radius + (wasAnEvenNumber ? stalkThickness : -stalkThickness); + int lx = (int) (x + Mth.sin((layerYPos + te.yOffset) * te.cScale) * v); + int lz = (int) (z + Mth.cos((layerYPos + te.yOffset) * te.cScale) * v); + + te.placeLeaves(level, new BlockPos(lx, layerYPos, lz)); + + te.nextLeafY = layerYPos + 5 + level.getRandom().nextInt(10); + if ((te.nextLeafY % 2 == 0) == wasAnEvenNumber) te.nextLeafY++; + } + te.layer++; + } else { + level.setBlockAndUpdate(pos, TFBlocks.HUGE_STALK.get().defaultBlockState()); + level.removeBlockEntity(pos); + } + } + } + } + + private void placeLeaves(Level world, BlockPos pos) { + // stalk at center + world.setBlockAndUpdate(pos, TFBlocks.HUGE_STALK.get().defaultBlockState()); + + // small squares + for (int dx = -1; dx <= 1; dx++) { + for (int dz = -1; dz <= 1; dz++) { + int distance = Math.abs(dx) + Math.abs(dz) + 1; + this.tryToPlaceLeaves(world, pos.offset(dx, -1, dz), distance); + this.tryToPlaceLeaves(world, pos.offset(dx, 1, dz), distance); + } + } + // larger square + for (int dx = -2; dx <= 2; dx++) { + for (int dz = -2; dz <= 2; dz++) { + if (!((dx == 2 || dx == -2) && (dz == 2 || dz == -2))) { + this.tryToPlaceLeaves(world, pos.offset(dx, 0, dz), Math.max(Math.abs(dx) + Math.abs(dz), 1)); + } + } + } + } + + /** + * Place the stalk block only if the destination is clear. Return false if a layer is blocked by 15 or more blocks. + */ + private boolean tryToPlaceStalk(Level level, BlockPos pos, boolean checkBlocked) { + BlockState state = level.getBlockState(pos); + if (state.isAir() || (state.getMaterial().isReplaceable() && !state.is(TFBlocks.BEANSTALK_GROWER.get())) || (state.isAir() || state.is(BlockTags.LEAVES)) || state.getBlock().equals(TFBlocks.FLUFFY_CLOUD.get())) { + level.setBlockAndUpdate(pos, TFBlocks.HUGE_STALK.get().defaultBlockState()); + if (pos.getY() > 150) { + for (int i = 0; i < 7; i++) { + if (level.getBlockState(pos.relative(Direction.UP, i)).is(TFBlocks.WISPY_CLOUD.get()) || level.getBlockState(pos.relative(Direction.UP, i)).is(TFBlocks.FLUFFY_CLOUD.get())) { + level.setBlockAndUpdate(pos.relative(Direction.UP, i), Blocks.AIR.defaultBlockState()); + } + } + } + return true; + } else { + if (!state.is(TFBlocks.HUGE_STALK.get()) && checkBlocked) { + blocksSkipped++; + } + return blocksSkipped < 15; + } + } + + private void tryToPlaceLeaves(Level world, BlockPos pos, int distance) { + BlockState state = world.getBlockState(pos); + if (state.isAir() || state.is(BlockTags.LEAVES)) { + world.setBlock(pos, TFBlocks.BEANSTALK_LEAVES.get().defaultBlockState().setValue(LeavesBlock.DISTANCE, distance), 2); + } + } + + @Override + protected void saveAdditional(CompoundTag compoundTag) { + super.saveAdditional(compoundTag); + compoundTag.putInt("ticker", this.ticker); + compoundTag.putInt("layer", this.layer); + compoundTag.putBoolean("isAreaClearEnough", this.isAreaClearEnough); + + compoundTag.putInt("nextLeafY", this.nextLeafY); + compoundTag.putInt("yOffset", this.yOffset); + compoundTag.putFloat("cScale", this.cScale); + compoundTag.putFloat("rScale", this.rScale); + compoundTag.putInt("maxY", this.maxY); + compoundTag.putInt("blocksSkipped", this.blocksSkipped); + } + + @Override + public void load(CompoundTag compoundTag) { + super.load(compoundTag); + this.ticker = compoundTag.getInt("ticker"); + this.layer = compoundTag.getInt("layer"); + this.isAreaClearEnough = compoundTag.getBoolean("isAreaClearEnough"); + + this.nextLeafY = compoundTag.getInt("nextLeafY"); + this.yOffset = compoundTag.getInt("yOffset"); + this.cScale = compoundTag.getFloat("cScale"); + this.rScale = compoundTag.getFloat("rScale"); + this.maxY = compoundTag.getInt("maxY"); + this.blocksSkipped = compoundTag.getInt("blocksSkipped"); + } + + public boolean isBeanstalkRumbling() { + return this.ticker < 110; + } +} diff --git a/src/main/java/twilightforest/block/entity/KeepsakeCasketBlockEntity.java b/src/main/java/twilightforest/block/entity/KeepsakeCasketBlockEntity.java new file mode 100644 index 0000000000..0de7d05d09 --- /dev/null +++ b/src/main/java/twilightforest/block/entity/KeepsakeCasketBlockEntity.java @@ -0,0 +1,222 @@ +package twilightforest.block.entity; + +import net.minecraft.ChatFormatting; +import net.minecraft.core.BlockPos; +import net.minecraft.core.NonNullList; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.sounds.SoundSource; +import net.minecraft.util.Mth; +import net.minecraft.world.ContainerHelper; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.inventory.ChestMenu; +import net.minecraft.world.inventory.MenuType; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.LidBlockEntity; +import net.minecraft.world.level.block.entity.RandomizableContainerBlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.items.wrapper.EmptyHandler; +import twilightforest.init.TFBlockEntities; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFSounds; + +import org.jetbrains.annotations.Nullable; +import java.util.UUID; + +//used a fair bit of chest logic in this for the lid +@OnlyIn(value = Dist.CLIENT, _interface = LidBlockEntity.class) +public class KeepsakeCasketBlockEntity extends RandomizableContainerBlockEntity implements LidBlockEntity { + private static final int limit = 9 * 5; + public NonNullList contents = NonNullList.withSize(limit, ItemStack.EMPTY); + @Nullable + public String name; + @Nullable + public String casketname; + @Nullable + public UUID playeruuid; + protected float lidAngle; + protected float prevLidAngle; + protected int numPlayersUsing; + private int ticksSinceSync; + + public KeepsakeCasketBlockEntity(BlockPos pos, BlockState state) { + super(TFBlockEntities.KEEPSAKE_CASKET.get(), pos, state); + } + + @Override + public boolean isEmpty() { + for (ItemStack itemstack : this.contents) { + if (!itemstack.isEmpty()) { + return false; + } + } + return true; + } + + @Override + public NonNullList getItems() { + return this.contents; + } + + @Override + public void setItems(NonNullList items) { + // Because NonNullList is a very incomplete List as a whole, not even proxying half of the conveniences of List to its delegate. + // We hereby curse it to merge stacks instead. + + // Due to some outside usages we will be doing a pull-overwrite operation here instead. + int limit = Math.min(contents.size(), items.size()); + + for (int i = 0; i < limit; i++) { + ItemStack stack = items.get(i); + //noinspection ConstantConditions + if (stack != null) { // No, it is very easily possible for NonNullList to have null. + this.contents.set(i, items.get(i)); + items.set(i, ItemStack.EMPTY); + } + } + } + + @Override + protected Component getDefaultName() { + return Component.translatable("block.twilightforest.keepsake_casket"); + } + + @Override + protected AbstractContainerMenu createMenu(int id, Inventory player) { + return new ChestMenu(MenuType.GENERIC_9x5, id, player, this, 5); + } + + @Override + public int getContainerSize() { + return limit; + } + + @Override + public void saveAdditional(CompoundTag compound) { + super.saveAdditional(compound); + if (!this.trySaveLootTable(compound)) { + ContainerHelper.saveAllItems(compound, this.contents); + } + if (this.playeruuid != null) compound.putUUID("deadPlayer", this.playeruuid); + if (this.casketname != null) compound.putString("playerName", this.casketname); + } + + @Override + public void load(CompoundTag nbt) { + super.load(nbt); + this.contents = NonNullList.withSize(this.getContainerSize(), ItemStack.EMPTY); + if (!this.tryLoadLootTable(nbt)) { + ContainerHelper.loadAllItems(nbt, this.contents); + } + if (nbt.hasUUID("deadPlayer")) this.playeruuid = nbt.getUUID("deadPlayer"); + if (nbt.hasUUID("playerName")) this.casketname = nbt.getString("playerName"); + } + + //[VanillaCopy] of EnderChestBlockEntity, with some small adaptations + public static void tick(Level level, BlockPos pos, BlockState state, KeepsakeCasketBlockEntity te) { + if (++te.ticksSinceSync % 20 * 4 == 0) { + level.blockEvent(pos, TFBlocks.KEEPSAKE_CASKET.get(), 1, te.numPlayersUsing); + } + te.prevLidAngle = te.lidAngle; + if (te.numPlayersUsing > 0 && te.lidAngle == 0.0F) { + level.playSound(null, pos, TFSounds.CASKET_OPEN.get(), SoundSource.BLOCKS, 0.5F, level.getRandom().nextFloat() * 0.1F + 0.9F); + } + if (te.numPlayersUsing == 0 && te.lidAngle > 0.0F || te.numPlayersUsing > 0 && te.lidAngle < 1.0F) { + float f2 = te.lidAngle; + + if (te.numPlayersUsing > 0) te.lidAngle += 0.025F; + else te.lidAngle -= 0.075F; + + if (te.lidAngle > 1.0F) te.lidAngle = 1.0F; + + if (te.lidAngle < 0.4F && f2 >= 0.4F) { + level.playSound(null, pos, TFSounds.CASKET_CLOSE.get(), SoundSource.BLOCKS, 0.75F, level.getRandom().nextFloat() * 0.1F + 0.9F); + } + if (te.lidAngle < 0.0F) te.lidAngle = 0.0F; + } + + } + + @Override + public boolean triggerEvent(int id, int type) { + if (id == 1) { + this.numPlayersUsing = type; + return true; + } else { + return super.triggerEvent(id, type); + } + } + + //if we have a dead player UUID set, then only that player can open the casket + @Override + public boolean stillValid(Player user) { + if (this.playeruuid != null) { + if (user.hasPermissions(3) || user.getGameProfile().getId().equals(this.playeruuid)) { + return super.stillValid(user); + } else { + return false; + } + } else { + return super.stillValid(user); + } + } + + @Override + public boolean canOpen(Player user) { + if (this.playeruuid != null) { + if (user.hasPermissions(3) || user.getGameProfile().getId().equals(this.playeruuid)) { + return super.canOpen(user); + } else { + user.playNotifySound(TFSounds.CASKET_LOCKED.get(), SoundSource.BLOCKS, 0.5F, 0.5F); + user.displayClientMessage(Component.translatable("block.twilightforest.casket.locked", name).withStyle(ChatFormatting.RED), true); + return false; + } + } else { + return super.canOpen(user); + } + } + + @Override + protected IItemHandler createUnSidedHandler() { + return new EmptyHandler(); + } + + //remove stored player when chest is broken + @Override + public void setRemoved() { + this.playeruuid = null; + this.invalidateCaps(); + super.setRemoved(); + } + + public void startOpen(Player player) { + if (!player.isSpectator()) { + if (this.numPlayersUsing < 0) { + this.numPlayersUsing = 0; + } + ++this.numPlayersUsing; + this.getLevel().blockEvent(this.getBlockPos(), TFBlocks.KEEPSAKE_CASKET.get(), 1, this.numPlayersUsing); + } + + } + + public void stopOpen(Player player) { + if (!player.isSpectator()) { + --this.numPlayersUsing; + this.getLevel().blockEvent(this.getBlockPos(), TFBlocks.KEEPSAKE_CASKET.get(), 1, this.numPlayersUsing); + } + + } + + @OnlyIn(Dist.CLIENT) + @Override + public float getOpenNess(float partialTicks) { + return Mth.lerp(partialTicks, this.prevLidAngle, this.lidAngle); + } +} diff --git a/src/main/java/twilightforest/block/entity/MoonwormBlockEntity.java b/src/main/java/twilightforest/block/entity/MoonwormBlockEntity.java new file mode 100644 index 0000000000..b21a1ba8b0 --- /dev/null +++ b/src/main/java/twilightforest/block/entity/MoonwormBlockEntity.java @@ -0,0 +1,50 @@ +package twilightforest.block.entity; + +import net.minecraft.core.BlockPos; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import twilightforest.init.TFBlockEntities; + +public class MoonwormBlockEntity extends BlockEntity { + public int yawDelay; + public int currentYaw; + public int desiredYaw; + public float randRot = RandomSource.create().nextInt(4) * 90.0F; + + public MoonwormBlockEntity(BlockPos pos, BlockState state) { + super(TFBlockEntities.MOONWORM.get(), pos, state); + currentYaw = -1; + yawDelay = 0; + desiredYaw = 0; + } + + public static void tick(Level level, BlockPos pos, BlockState state, MoonwormBlockEntity te) { + if (level.isClientSide()) { + if (te.currentYaw == -1) { + te.currentYaw = level.getRandom().nextInt(4) * 90; + } + + if (te.yawDelay > 0) { + te.yawDelay--; + } else { + if (te.desiredYaw == 0) { + // make it rotate! + te.yawDelay = 200 + level.getRandom().nextInt(200); + te.desiredYaw = level.getRandom().nextInt(4) * 90; + } + + te.currentYaw++; + + if (te.currentYaw > 360) { + te.currentYaw = 0; + } + + if (te.currentYaw == te.desiredYaw) { + te.desiredYaw = 0; + } + } + } + } +} diff --git a/src/main/java/twilightforest/block/entity/RedThreadBlockEntity.java b/src/main/java/twilightforest/block/entity/RedThreadBlockEntity.java new file mode 100644 index 0000000000..6b112ba37f --- /dev/null +++ b/src/main/java/twilightforest/block/entity/RedThreadBlockEntity.java @@ -0,0 +1,12 @@ +package twilightforest.block.entity; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import twilightforest.init.TFBlockEntities; + +public class RedThreadBlockEntity extends BlockEntity { + public RedThreadBlockEntity(BlockPos pos, BlockState state) { + super(TFBlockEntities.RED_THREAD.get(), pos, state); + } +} diff --git a/src/main/java/twilightforest/block/entity/SkullCandleBlockEntity.java b/src/main/java/twilightforest/block/entity/SkullCandleBlockEntity.java new file mode 100644 index 0000000000..881dc22a58 --- /dev/null +++ b/src/main/java/twilightforest/block/entity/SkullCandleBlockEntity.java @@ -0,0 +1,43 @@ +package twilightforest.block.entity; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.entity.SkullBlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import twilightforest.init.TFBlockEntities; + +public class SkullCandleBlockEntity extends SkullBlockEntity { + + public int candleColor; + public int candleAmount; + + public SkullCandleBlockEntity(BlockPos pos, BlockState state) { + super(pos, state); + } + + public SkullCandleBlockEntity(BlockPos pos, BlockState state, int color, int amount) { + super(pos, state); + this.candleColor = color; + this.candleAmount = amount; + } + + @Override + public BlockEntityType getType() { + return TFBlockEntities.SKULL_CANDLE.get(); + } + + @Override + public void saveAdditional(CompoundTag tag) { + super.saveAdditional(tag); + tag.putInt("CandleColor", this.candleColor); + if (this.candleAmount != 0) tag.putInt("CandleAmount", this.candleAmount); + } + + @Override + public void load(CompoundTag tag) { + super.load(tag); + this.candleColor = tag.getInt("CandleColor"); + this.candleAmount = tag.getInt("CandleAmount"); + } +} diff --git a/src/main/java/twilightforest/block/entity/TFSignBlockEntity.java b/src/main/java/twilightforest/block/entity/TFSignBlockEntity.java new file mode 100644 index 0000000000..829306a361 --- /dev/null +++ b/src/main/java/twilightforest/block/entity/TFSignBlockEntity.java @@ -0,0 +1,19 @@ +package twilightforest.block.entity; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.entity.SignBlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import twilightforest.init.TFBlockEntities; + +public class TFSignBlockEntity extends SignBlockEntity { + + public TFSignBlockEntity(BlockPos pos, BlockState state) { + super(pos, state); + } + + @Override + public BlockEntityType getType() { + return TFBlockEntities.TF_SIGN.get(); + } +} diff --git a/src/main/java/twilightforest/block/entity/TFSmokerBlockEntity.java b/src/main/java/twilightforest/block/entity/TFSmokerBlockEntity.java new file mode 100644 index 0000000000..3dc7afa0f0 --- /dev/null +++ b/src/main/java/twilightforest/block/entity/TFSmokerBlockEntity.java @@ -0,0 +1,35 @@ +package twilightforest.block.entity; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import twilightforest.block.EncasedSmokerBlock; +import twilightforest.init.TFBlockEntities; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFParticleType; + +public class TFSmokerBlockEntity extends BlockEntity { + + private long counter = 0; + + public TFSmokerBlockEntity(BlockPos pos, BlockState state) { + super(TFBlockEntities.SMOKER.get(), pos, state); + } + + public static void tick(Level level, BlockPos pos, BlockState state, TFSmokerBlockEntity te) { + if (level.isClientSide() && ++te.counter % 4 == 0) { + if (state.getBlock() == TFBlocks.ENCASED_SMOKER.get() && state.getValue(EncasedSmokerBlock.ACTIVE)) { + te.particles(level, pos, te); + } else if (state.getBlock() == TFBlocks.SMOKER.get()) { + te.particles(level, pos, te); + } + } + } + + public void particles(Level level, BlockPos pos, TFSmokerBlockEntity te) { + level.addParticle(TFParticleType.HUGE_SMOKE.get(), pos.getX() + 0.5, pos.getY() + 0.95, pos.getZ() + 0.5, + Math.cos(te.counter / 10.0) * 0.05, 0.25D, Math.sin(te.counter / 10.0) * 0.05 + ); + } +} diff --git a/src/main/java/twilightforest/block/entity/TomeSpawnerBlockEntity.java b/src/main/java/twilightforest/block/entity/TomeSpawnerBlockEntity.java new file mode 100644 index 0000000000..6da22ca5d1 --- /dev/null +++ b/src/main/java/twilightforest/block/entity/TomeSpawnerBlockEntity.java @@ -0,0 +1,109 @@ +package twilightforest.block.entity; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.Difficulty; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import twilightforest.block.TomeSpawnerBlock; +import twilightforest.init.TFBlockEntities; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFEntities; + +import java.util.Optional; + +public class TomeSpawnerBlockEntity extends BlockEntity { + + private int elapsedTime; + + //controlled variables via nbt + private String entityType; + private int tomesLeft; + private int spawnTime; + private int playerDistance; + + public TomeSpawnerBlockEntity(BlockPos pos, BlockState state) { + super(TFBlockEntities.TOME_SPAWNER.get(), pos, state); + if (state.getValue(TomeSpawnerBlock.SPAWNER)) { + this.entityType = "twilightforest:death_tome"; + this.tomesLeft = 5; + this.spawnTime = 400; + this.playerDistance = 8; + } + } + + public static void tick(Level level, BlockPos pos, BlockState state, TomeSpawnerBlockEntity te) { + if (!level.isClientSide() && !(level.getDifficulty() == Difficulty.PEACEFUL)) { + if (te.tomesLeft > 10) te.tomesLeft = 10; + + if (te.isNearPlayer(level, pos)) { + if (te.elapsedTime < te.spawnTime) { + te.elapsedTime++; + } else { + te.elapsedTime = 0; + te.attemptSpawnTome((ServerLevel) level, pos, false); + } + } + + if (te.tomesLeft <= 0) { + te.invalidateCaps(); + level.setBlockAndUpdate(pos, TFBlocks.EMPTY_CANOPY_BOOKSHELF.get().defaultBlockState()); + } else { + level.setBlockAndUpdate(pos, state.setValue(TomeSpawnerBlock.BOOK_STAGES, te.tomesLeft)); + } + } + + } + + public void attemptSpawnTome(ServerLevel level, BlockPos pos, boolean fire) { + Optional> mob = EntityType.byString(this.entityType); + boolean spawnedOne = false; + for (Direction dir : Direction.Plane.HORIZONTAL) { + if (level.isEmptyBlock(pos.relative(dir))) { + for (int i = 0; i < 5; i++) { + double x = pos.relative(dir).getX() + (level.getRandom().nextDouble() - level.getRandom().nextDouble()) * 2.0D; + double y = (double) pos.getY() + (level.getRandom().nextDouble() - level.getRandom().nextDouble()); + double z = pos.relative(dir).getZ() + (level.getRandom().nextDouble() - level.getRandom().nextDouble()) * 2.0D; + + if (level.noCollision(mob.orElse(TFEntities.DEATH_TOME.get()).getAABB(x, y, z)) && mob.isPresent()) { + Entity entity = mob.orElse(TFEntities.DEATH_TOME.get()).create(level); + entity.moveTo(BlockPos.containing(x, y, z), entity.getYRot(), entity.getXRot()); + if (fire) entity.setSecondsOnFire(10); + level.addFreshEntity(entity); + this.tomesLeft--; + spawnedOne = true; + break; + } + } + } + if (spawnedOne) break; + } + } + + private boolean isNearPlayer(Level level, BlockPos pos) { + return level.hasNearbyAlivePlayer((double) pos.getX() + 0.5D, (double) pos.getY() + 0.5D, (double) pos.getZ() + 0.5D, this.playerDistance); + } + + @Override + public void saveAdditional(CompoundTag tag) { + super.saveAdditional(tag); + tag.putString("EntityType", this.entityType); + tag.putInt("MobSpawnsLeft", this.tomesLeft); + tag.putInt("SpawnDelay", this.spawnTime); + tag.putInt("MaxPlayerDistance", this.playerDistance); + } + + @Override + public void load(CompoundTag tag) { + super.load(tag); + this.entityType = tag.getString("EntityType"); + this.tomesLeft = tag.getInt("MobSpawnsLeft"); + this.spawnTime = tag.getInt("SpawnDelay"); + this.playerDistance = tag.getInt("MaxPlayerDistance"); + } +} diff --git a/src/main/java/twilightforest/block/entity/TrophyBlockEntity.java b/src/main/java/twilightforest/block/entity/TrophyBlockEntity.java new file mode 100644 index 0000000000..2e40a62324 --- /dev/null +++ b/src/main/java/twilightforest/block/entity/TrophyBlockEntity.java @@ -0,0 +1,32 @@ +package twilightforest.block.entity; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import twilightforest.init.TFBlockEntities; +import twilightforest.init.TFBlocks; + +public class TrophyBlockEntity extends BlockEntity { + + private int animatedTicks; + private boolean animated; + + public TrophyBlockEntity(BlockPos pos, BlockState state) { + super(TFBlockEntities.TROPHY.get(), pos, state); + } + + public static void tick(Level level, BlockPos pos, BlockState state, TrophyBlockEntity te) { + if (state.is(TFBlocks.UR_GHAST_TROPHY.get()) || state.is(TFBlocks.UR_GHAST_WALL_TROPHY.get())) { + te.animated = true; + ++te.animatedTicks; + } + } + + @OnlyIn(Dist.CLIENT) + public float getAnimationProgress(float time) { + return this.animated ? this.animatedTicks + time : (float) this.animatedTicks; + } +} diff --git a/src/main/java/twilightforest/block/entity/TwilightChestEntity.java b/src/main/java/twilightforest/block/entity/TwilightChestEntity.java new file mode 100644 index 0000000000..9b901ec78b --- /dev/null +++ b/src/main/java/twilightforest/block/entity/TwilightChestEntity.java @@ -0,0 +1,12 @@ +package twilightforest.block.entity; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.entity.ChestBlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import twilightforest.init.TFBlockEntities; + +public class TwilightChestEntity extends ChestBlockEntity { + public TwilightChestEntity(BlockPos pos, BlockState state) { + super(TFBlockEntities.TF_CHEST.get(), pos, state); + } +} diff --git a/src/main/java/twilightforest/block/entity/package-info.java b/src/main/java/twilightforest/block/entity/package-info.java new file mode 100644 index 0000000000..376e0be6c3 --- /dev/null +++ b/src/main/java/twilightforest/block/entity/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.block.entity; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/block/entity/spawner/AlphaYetiSpawnerBlockEntity.java b/src/main/java/twilightforest/block/entity/spawner/AlphaYetiSpawnerBlockEntity.java new file mode 100644 index 0000000000..523ef39e56 --- /dev/null +++ b/src/main/java/twilightforest/block/entity/spawner/AlphaYetiSpawnerBlockEntity.java @@ -0,0 +1,28 @@ +package twilightforest.block.entity.spawner; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.particles.ParticleOptions; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.block.state.BlockState; +import twilightforest.entity.boss.AlphaYeti; +import twilightforest.init.TFBlockEntities; +import twilightforest.init.TFEntities; + +public class AlphaYetiSpawnerBlockEntity extends BossSpawnerBlockEntity { + + public AlphaYetiSpawnerBlockEntity(BlockPos pos, BlockState state) { + super(TFBlockEntities.ALPHA_YETI_SPAWNER.get(), TFEntities.ALPHA_YETI.get(), pos, state); + } + + @Override + public boolean anyPlayerInRange() { + Player closestPlayer = this.getLevel().getNearestPlayer(this.getBlockPos().getX() + 0.5D, this.getBlockPos().getY() + 0.5D, this.getBlockPos().getZ() + 0.5D, this.getRange(), false); + return closestPlayer != null && closestPlayer.getY() > this.getBlockPos().getY() - 4; + } + + @Override + public ParticleOptions getSpawnerParticle() { + return ParticleTypes.FALLING_WATER; + } +} diff --git a/src/main/java/twilightforest/block/entity/spawner/BossSpawnerBlockEntity.java b/src/main/java/twilightforest/block/entity/spawner/BossSpawnerBlockEntity.java new file mode 100644 index 0000000000..3a033daca0 --- /dev/null +++ b/src/main/java/twilightforest/block/entity/spawner/BossSpawnerBlockEntity.java @@ -0,0 +1,80 @@ +package twilightforest.block.entity.spawner; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.particles.ParticleOptions; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.Difficulty; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.MobSpawnType; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.ServerLevelAccessor; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.event.ForgeEventFactory; + +public abstract class BossSpawnerBlockEntity extends BlockEntity { + + protected static final int SHORT_RANGE = 9, LONG_RANGE = 50; + + protected final EntityType entityType; + protected boolean spawnedBoss = false; + + protected BossSpawnerBlockEntity(BlockEntityType type, EntityType entityType, BlockPos pos, BlockState state) { + super(type, pos, state); + this.entityType = entityType; + } + + public boolean anyPlayerInRange() { + return this.getLevel().hasNearbyAlivePlayer(this.getBlockPos().getX() + 0.5D, this.getBlockPos().getY() + 0.5D, this.getBlockPos().getZ() + 0.5D, this.getRange()); + } + + public static void tick(Level level, BlockPos pos, BlockState state, BossSpawnerBlockEntity te) { + if (te.spawnedBoss || !te.anyPlayerInRange()) { + return; + } + if (level.isClientSide()) { + // particles + double rx = pos.getX() + level.getRandom().nextFloat(); + double ry = pos.getY() + level.getRandom().nextFloat(); + double rz = pos.getZ() + level.getRandom().nextFloat(); + level.addParticle(te.getSpawnerParticle(), rx, ry, rz, 0.0D, 0.0D, 0.0D); + } else { + if (level.getDifficulty() != Difficulty.PEACEFUL) { + if (te.spawnMyBoss((ServerLevel) level)) { + level.destroyBlock(pos, false); + te.spawnedBoss = true; + } + } + } + } + + protected boolean spawnMyBoss(ServerLevelAccessor accessor) { + // create creature + T myCreature = makeMyCreature(); + + myCreature.moveTo(this.getBlockPos().below(), accessor.getLevel().getRandom().nextFloat() * 360F, 0.0F); + ForgeEventFactory.onFinalizeSpawn(myCreature, accessor, accessor.getCurrentDifficultyAt(this.getBlockPos()), MobSpawnType.SPAWNER, null, null); + + // set creature's home to this + initializeCreature(myCreature); + + // spawn it + return accessor.addFreshEntity(myCreature); + } + + public abstract ParticleOptions getSpawnerParticle(); + + protected void initializeCreature(T myCreature) { + myCreature.restrictTo(this.getBlockPos(), 40); + } + + protected int getRange() { + return SHORT_RANGE; + } + + protected T makeMyCreature() { + return entityType.create(this.getLevel()); + } +} diff --git a/src/main/java/twilightforest/block/entity/spawner/FinalBossSpawnerBlockEntity.java b/src/main/java/twilightforest/block/entity/spawner/FinalBossSpawnerBlockEntity.java new file mode 100644 index 0000000000..3d00c2236e --- /dev/null +++ b/src/main/java/twilightforest/block/entity/spawner/FinalBossSpawnerBlockEntity.java @@ -0,0 +1,28 @@ +package twilightforest.block.entity.spawner; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.particles.ParticleOptions; +import net.minecraft.world.level.ServerLevelAccessor; +import net.minecraft.world.level.block.state.BlockState; +import twilightforest.entity.boss.PlateauBoss; +import twilightforest.init.TFBlockEntities; +import twilightforest.init.TFEntities; +import twilightforest.init.TFParticleType; + +public class FinalBossSpawnerBlockEntity extends BossSpawnerBlockEntity { + + public FinalBossSpawnerBlockEntity(BlockPos pos, BlockState state) { + super(TFBlockEntities.FINAL_BOSS_SPAWNER.get(), TFEntities.PLATEAU_BOSS.get(), pos, state); + } + + //no spawning for you + @Override + protected boolean spawnMyBoss(ServerLevelAccessor world) { + return false; + } + + @Override + public ParticleOptions getSpawnerParticle() { + return TFParticleType.ANNIHILATE.get(); + } +} diff --git a/src/main/java/twilightforest/block/entity/spawner/HydraSpawnerBlockEntity.java b/src/main/java/twilightforest/block/entity/spawner/HydraSpawnerBlockEntity.java new file mode 100644 index 0000000000..a86294bc74 --- /dev/null +++ b/src/main/java/twilightforest/block/entity/spawner/HydraSpawnerBlockEntity.java @@ -0,0 +1,26 @@ +package twilightforest.block.entity.spawner; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.particles.ParticleOptions; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.world.level.block.state.BlockState; +import twilightforest.entity.boss.Hydra; +import twilightforest.init.TFBlockEntities; +import twilightforest.init.TFEntities; + +public class HydraSpawnerBlockEntity extends BossSpawnerBlockEntity { + + public HydraSpawnerBlockEntity(BlockPos pos, BlockState state) { + super(TFBlockEntities.HYDRA_SPAWNER.get(), TFEntities.HYDRA.get(), pos, state); + } + + @Override + protected int getRange() { + return LONG_RANGE; + } + + @Override + public ParticleOptions getSpawnerParticle() { + return ParticleTypes.FLAME; + } +} diff --git a/src/main/java/twilightforest/block/entity/spawner/KnightPhantomSpawnerBlockEntity.java b/src/main/java/twilightforest/block/entity/spawner/KnightPhantomSpawnerBlockEntity.java new file mode 100644 index 0000000000..fd82dda2ea --- /dev/null +++ b/src/main/java/twilightforest/block/entity/spawner/KnightPhantomSpawnerBlockEntity.java @@ -0,0 +1,72 @@ +package twilightforest.block.entity.spawner; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.particles.ParticleOptions; +import net.minecraft.world.Difficulty; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.MobSpawnType; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.ServerLevelAccessor; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.event.ForgeEventFactory; +import twilightforest.init.TFBlockEntities; +import twilightforest.init.TFParticleType; +import twilightforest.init.TFEntities; +import twilightforest.entity.boss.KnightPhantom; +import twilightforest.init.TFItems; + +public class KnightPhantomSpawnerBlockEntity extends BossSpawnerBlockEntity { + + private static final int COUNT = 6; + + private int spawned = 0; + + public KnightPhantomSpawnerBlockEntity(BlockPos pos, BlockState state) { + super(TFBlockEntities.KNIGHT_PHANTOM_SPAWNER.get(), TFEntities.KNIGHT_PHANTOM.get(), pos, state); + } + + @Override + public boolean anyPlayerInRange() { + Player closestPlayer = this.getLevel().getNearestPlayer(this.getBlockPos().getX() + 0.5D, this.getBlockPos().getY() + 0.5D, this.getBlockPos().getZ() + 0.5D, this.getRange(), false); + return closestPlayer != null && closestPlayer.getY() > this.getBlockPos().getY() - 2; + } + + @Override + protected boolean spawnMyBoss(ServerLevelAccessor accessor) { + for (int i = spawned; i < COUNT; i++) { + // create creature + KnightPhantom myCreature = this.makeMyCreature(); + + float angle = (360F / COUNT) * i; + final float distance = 4F; + + double rx = this.getBlockPos().getX() + 0.5D + Math.cos(angle * Math.PI / 180.0D) * distance; + double ry = this.getBlockPos().getY(); + double rz = this.getBlockPos().getZ() + 0.5D + Math.sin(angle * Math.PI / 180.0D) * distance; + + myCreature.moveTo(rx, ry, rz, accessor.getLevel().getRandom().nextFloat() * 360F, 0.0F); + ForgeEventFactory.onFinalizeSpawn(myCreature, accessor, accessor.getCurrentDifficultyAt(new BlockPos(myCreature.blockPosition())), MobSpawnType.SPAWNER, null, null); + + if(i == 5 && accessor.getDifficulty() == Difficulty.HARD){ + myCreature.setItemSlot(EquipmentSlot.OFFHAND, new ItemStack(TFItems.KNIGHTMETAL_SHIELD.get())); + } + + // set creature's home to this + this.initializeCreature(myCreature); + + myCreature.setNumber(i); + + // spawn it + if (accessor.addFreshEntity(myCreature)) { + spawned++; + } + } + return spawned == COUNT; + } + + @Override + public ParticleOptions getSpawnerParticle() { + return TFParticleType.OMINOUS_FLAME.get(); + } +} diff --git a/src/main/java/twilightforest/block/entity/spawner/LichSpawnerBlockEntity.java b/src/main/java/twilightforest/block/entity/spawner/LichSpawnerBlockEntity.java new file mode 100644 index 0000000000..8b29d3a69f --- /dev/null +++ b/src/main/java/twilightforest/block/entity/spawner/LichSpawnerBlockEntity.java @@ -0,0 +1,48 @@ +package twilightforest.block.entity.spawner; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.particles.ParticleOptions; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.world.entity.MobSpawnType; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.ServerLevelAccessor; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.event.ForgeEventFactory; +import twilightforest.entity.boss.Lich; +import twilightforest.init.TFBlockEntities; +import twilightforest.init.TFEntities; + +public class LichSpawnerBlockEntity extends BossSpawnerBlockEntity { + + public LichSpawnerBlockEntity(BlockPos pos, BlockState state) { + super(TFBlockEntities.LICH_SPAWNER.get(), TFEntities.LICH.get(), pos, state); + } + + @Override + public boolean anyPlayerInRange() { + Player closestPlayer = this.getLevel().getNearestPlayer(this.getBlockPos().getX() + 0.5D, this.getBlockPos().getY() + 0.5D, this.getBlockPos().getZ() + 0.5D, this.getRange(), false); + return closestPlayer != null && closestPlayer.getY() > this.getBlockPos().getY() - 4; + } + + @Override + protected boolean spawnMyBoss(ServerLevelAccessor accessor) { + + Lich myCreature = this.makeMyCreature(); + + myCreature.moveTo(this.getBlockPos(), accessor.getLevel().random.nextFloat() * 360F, 0.0F); + ForgeEventFactory.onFinalizeSpawn(myCreature, accessor, accessor.getCurrentDifficultyAt(this.getBlockPos()), MobSpawnType.SPAWNER, null, null); + myCreature.setAttackCooldown(40); + myCreature.setExtinguishTimer(); + + // set creature's home to this + this.initializeCreature(myCreature); + + // spawn it + return accessor.addFreshEntity(myCreature); + } + + @Override + public ParticleOptions getSpawnerParticle() { + return ParticleTypes.ANGRY_VILLAGER; + } +} diff --git a/src/main/java/twilightforest/block/entity/spawner/MinoshroomSpawnerBlockEntity.java b/src/main/java/twilightforest/block/entity/spawner/MinoshroomSpawnerBlockEntity.java new file mode 100644 index 0000000000..e20337f8b8 --- /dev/null +++ b/src/main/java/twilightforest/block/entity/spawner/MinoshroomSpawnerBlockEntity.java @@ -0,0 +1,28 @@ +package twilightforest.block.entity.spawner; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.particles.ParticleOptions; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.block.state.BlockState; +import twilightforest.entity.boss.Minoshroom; +import twilightforest.init.TFBlockEntities; +import twilightforest.init.TFEntities; + +public class MinoshroomSpawnerBlockEntity extends BossSpawnerBlockEntity { + + public MinoshroomSpawnerBlockEntity(BlockPos pos, BlockState state) { + super(TFBlockEntities.MINOSHROOM_SPAWNER.get(), TFEntities.MINOSHROOM.get(), pos, state); + } + + @Override + public boolean anyPlayerInRange() { + Player closestPlayer = this.getLevel().getNearestPlayer(this.getBlockPos().getX() + 0.5D, this.getBlockPos().getY() + 0.5D, this.getBlockPos().getZ() + 0.5D, getRange(), false); + return closestPlayer != null && closestPlayer.getY() < this.getBlockPos().getY() + 4; + } + + @Override + public ParticleOptions getSpawnerParticle() { + return ParticleTypes.CRIMSON_SPORE; + } +} diff --git a/src/main/java/twilightforest/block/entity/spawner/NagaSpawnerBlockEntity.java b/src/main/java/twilightforest/block/entity/spawner/NagaSpawnerBlockEntity.java new file mode 100644 index 0000000000..c0838b51fd --- /dev/null +++ b/src/main/java/twilightforest/block/entity/spawner/NagaSpawnerBlockEntity.java @@ -0,0 +1,26 @@ +package twilightforest.block.entity.spawner; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.particles.ParticleOptions; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.world.level.block.state.BlockState; +import twilightforest.entity.boss.Naga; +import twilightforest.init.TFBlockEntities; +import twilightforest.init.TFEntities; + +public class NagaSpawnerBlockEntity extends BossSpawnerBlockEntity { + + public NagaSpawnerBlockEntity(BlockPos pos, BlockState state) { + super(TFBlockEntities.NAGA_SPAWNER.get(), TFEntities.NAGA.get(), pos, state); + } + + @Override + protected int getRange() { + return LONG_RANGE; + } + + @Override + public ParticleOptions getSpawnerParticle() { + return ParticleTypes.CRIT; + } +} diff --git a/src/main/java/twilightforest/block/entity/spawner/SnowQueenSpawnerBlockEntity.java b/src/main/java/twilightforest/block/entity/spawner/SnowQueenSpawnerBlockEntity.java new file mode 100644 index 0000000000..9d5656befb --- /dev/null +++ b/src/main/java/twilightforest/block/entity/spawner/SnowQueenSpawnerBlockEntity.java @@ -0,0 +1,28 @@ +package twilightforest.block.entity.spawner; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.particles.ParticleOptions; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.block.state.BlockState; +import twilightforest.entity.boss.SnowQueen; +import twilightforest.init.TFBlockEntities; +import twilightforest.init.TFEntities; +import twilightforest.init.TFParticleType; + +public class SnowQueenSpawnerBlockEntity extends BossSpawnerBlockEntity { + + public SnowQueenSpawnerBlockEntity(BlockPos pos, BlockState state) { + super(TFBlockEntities.SNOW_QUEEN_SPAWNER.get(), TFEntities.SNOW_QUEEN.get(), pos, state); + } + + @Override + public boolean anyPlayerInRange() { + Player closestPlayer = this.getLevel().getNearestPlayer(this.getBlockPos().getX() + 0.5D, this.getBlockPos().getY() + 0.5D, this.getBlockPos().getZ() + 0.5D, this.getRange(), false); + return closestPlayer != null && closestPlayer.getY() > this.getBlockPos().getY() - 4; + } + + @Override + public ParticleOptions getSpawnerParticle() { + return TFParticleType.SNOW.get(); + } +} diff --git a/src/main/java/twilightforest/block/entity/spawner/UrGhastSpawnerBlockEntity.java b/src/main/java/twilightforest/block/entity/spawner/UrGhastSpawnerBlockEntity.java new file mode 100644 index 0000000000..1954608d19 --- /dev/null +++ b/src/main/java/twilightforest/block/entity/spawner/UrGhastSpawnerBlockEntity.java @@ -0,0 +1,28 @@ +package twilightforest.block.entity.spawner; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.particles.DustParticleOptions; +import net.minecraft.core.particles.ParticleOptions; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.block.state.BlockState; +import twilightforest.init.TFBlockEntities; +import twilightforest.init.TFEntities; +import twilightforest.entity.boss.UrGhast; + +public class UrGhastSpawnerBlockEntity extends BossSpawnerBlockEntity { + + public UrGhastSpawnerBlockEntity(BlockPos pos, BlockState state) { + super(TFBlockEntities.UR_GHAST_SPAWNER.get(), TFEntities.UR_GHAST.get(), pos, state); + } + + @Override + public boolean anyPlayerInRange() { + Player closestPlayer = this.getLevel().getNearestPlayer(this.getBlockPos().getX() + 0.5D, this.getBlockPos().getY() + 0.5D, this.getBlockPos().getZ() + 0.5D, getRange(), false); + return closestPlayer != null && closestPlayer.getY() > this.getBlockPos().getY() - 4; + } + + @Override + public ParticleOptions getSpawnerParticle() { + return DustParticleOptions.REDSTONE; + } +} diff --git a/src/main/java/twilightforest/block/entity/spawner/package-info.java b/src/main/java/twilightforest/block/entity/spawner/package-info.java new file mode 100644 index 0000000000..ed15c8443d --- /dev/null +++ b/src/main/java/twilightforest/block/entity/spawner/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.block.entity.spawner; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/block/package-info.java b/src/main/java/twilightforest/block/package-info.java new file mode 100644 index 0000000000..41bb553415 --- /dev/null +++ b/src/main/java/twilightforest/block/package-info.java @@ -0,0 +1,6 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.block; + +import net.minecraft.MethodsReturnNonnullByDefault; +import javax.annotation.ParametersAreNonnullByDefault; diff --git a/src/main/java/twilightforest/capabilities/CapabilityList.java b/src/main/java/twilightforest/capabilities/CapabilityList.java new file mode 100644 index 0000000000..952cd2404d --- /dev/null +++ b/src/main/java/twilightforest/capabilities/CapabilityList.java @@ -0,0 +1,166 @@ +package twilightforest.capabilities; + +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraftforge.common.capabilities.*; +import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.event.AttachCapabilitiesEvent; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import twilightforest.capabilities.fan.FeatherFanCapabilityHandler; +import twilightforest.capabilities.fan.FeatherFanFallCapability; +import twilightforest.capabilities.giant_pick.GiantPickMineCapability; +import twilightforest.capabilities.giant_pick.GiantPickMineCapabilityHandler; +import twilightforest.capabilities.shield.IShieldCapability; +import twilightforest.capabilities.shield.ShieldCapabilityHandler; +import twilightforest.capabilities.teleporter_cache.TeleporterCacheCapability; +import twilightforest.capabilities.teleporter_cache.TeleporterCacheCapabilityHandler; +import twilightforest.capabilities.thrown.YetiThrowCapability; +import twilightforest.capabilities.thrown.YetiThrowCapabilityHandler; + +import javax.annotation.Nonnull; + +public class CapabilityList { + + public static final Capability TELEPORTER_CACHE = CapabilityManager.get(new CapabilityToken<>() {}); + public static final Capability SHIELDS = CapabilityManager.get(new CapabilityToken<>() {}); + public static final Capability FEATHER_FAN_FALLING = CapabilityManager.get(new CapabilityToken<>() {}); + public static final Capability YETI_THROWN = CapabilityManager.get(new CapabilityToken<>() {}); + public static final Capability GIANT_PICK_MINE = CapabilityManager.get(new CapabilityToken<>() {}); + + public static void registerCapabilities(RegisterCapabilitiesEvent event) { + event.register(TeleporterCacheCapability.class); + event.register(IShieldCapability.class); + event.register(FeatherFanFallCapability.class); + event.register(YetiThrowCapability.class); + event.register(GiantPickMineCapability.class); + } + + public static void attachLevelCapability(AttachCapabilitiesEvent e) { + if (e.getObject().dimension().equals(Level.OVERWORLD)) { + e.addCapability(TeleporterCacheCapability.ID, new ICapabilitySerializable() { + + final LazyOptional inst = LazyOptional.of(TeleporterCacheCapabilityHandler::new); + + @Nonnull + @Override + public LazyOptional getCapability(@Nonnull Capability capability, Direction facing) { + return TELEPORTER_CACHE.orEmpty(capability, inst.cast()); + } + + @Override + public CompoundTag serializeNBT() { + return inst.orElseThrow(NullPointerException::new).serializeNBT(); + } + + @Override + public void deserializeNBT(CompoundTag nbt) { + inst.orElseThrow(NullPointerException::new).deserializeNBT(nbt); + } + }); + } + } + + public static void attachEntityCapability(AttachCapabilitiesEvent e) { + if (e.getObject() instanceof LivingEntity living) { + e.addCapability(IShieldCapability.ID, new ICapabilitySerializable() { + + final LazyOptional inst = LazyOptional.of(() -> { + ShieldCapabilityHandler i = new ShieldCapabilityHandler(); + i.setEntity(living); + return i; + }); + + @Nonnull + @Override + public LazyOptional getCapability(@Nonnull Capability capability, Direction facing) { + return SHIELDS.orEmpty(capability, inst.cast()); + } + + @Override + public CompoundTag serializeNBT() { + return inst.orElseThrow(NullPointerException::new).serializeNBT(); + } + + @Override + public void deserializeNBT(CompoundTag nbt) { + inst.orElseThrow(NullPointerException::new).deserializeNBT(nbt); + } + }); + + if (e.getObject() instanceof Player player) { + e.addCapability(FeatherFanFallCapability.ID, new ICapabilitySerializable() { + + private final LazyOptional inst = LazyOptional.of(() -> { + FeatherFanCapabilityHandler cap = new FeatherFanCapabilityHandler(); + cap.setEntity(player); + return cap; + }); + + @Override + public CompoundTag serializeNBT() { + return inst.orElseThrow(NullPointerException::new).serializeNBT(); + } + + @Override + public void deserializeNBT(CompoundTag nbt) { + inst.orElseThrow(NullPointerException::new).deserializeNBT(nbt); + } + + @Override + public @NotNull LazyOptional getCapability(@NotNull Capability cap, @Nullable Direction side) { + return FEATHER_FAN_FALLING.orEmpty(cap, inst.cast()); + } + }); + } + + e.addCapability(YetiThrowCapability.ID, new ICapabilitySerializable() { + + private final LazyOptional inst = LazyOptional.of(() -> { + YetiThrowCapabilityHandler cap = new YetiThrowCapabilityHandler(); + cap.setEntity(living); + return cap; + }); + + @Override + public CompoundTag serializeNBT() { + return inst.orElseThrow(NullPointerException::new).serializeNBT(); + } + + @Override + public void deserializeNBT(CompoundTag nbt) { + inst.orElseThrow(NullPointerException::new).deserializeNBT(nbt); + } + + @Override + public @NotNull LazyOptional getCapability(@NotNull Capability cap, @Nullable Direction side) { + return YETI_THROWN.orEmpty(cap, inst.cast()); + } + }); + + e.addCapability(GiantPickMineCapability.ID, new ICapabilitySerializable() { + + private final LazyOptional inst = LazyOptional.of(GiantPickMineCapabilityHandler::new); + + @Override + public CompoundTag serializeNBT() { + return inst.orElseThrow(NullPointerException::new).serializeNBT(); + } + + @Override + public void deserializeNBT(CompoundTag nbt) { + inst.orElseThrow(NullPointerException::new).deserializeNBT(nbt); + } + + @Override + public @NotNull LazyOptional getCapability(@NotNull Capability cap, @Nullable Direction side) { + return GIANT_PICK_MINE.orEmpty(cap, inst.cast()); + } + }); + } + } +} diff --git a/src/main/java/twilightforest/capabilities/fan/FeatherFanCapabilityHandler.java b/src/main/java/twilightforest/capabilities/fan/FeatherFanCapabilityHandler.java new file mode 100644 index 0000000000..5a10a0a9ef --- /dev/null +++ b/src/main/java/twilightforest/capabilities/fan/FeatherFanCapabilityHandler.java @@ -0,0 +1,57 @@ +package twilightforest.capabilities.fan; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraftforge.network.PacketDistributor; +import twilightforest.network.TFPacketHandler; +import twilightforest.network.UpdateFeatherFanFallPacket; + +public class FeatherFanCapabilityHandler implements FeatherFanFallCapability { + + private Player host; + private boolean falling; + + @Override + public void setEntity(Player entity) { + this.host = entity; + } + + @Override + public void update() { + if (this.getFalling()) { + if (!this.host.isOnGround()) { + this.host.resetFallDistance(); + } + + if (this.host.isOnGround() || this.host.isSwimming()) { + this.setFalling(false); + } + } + } + + @Override + public void setFalling(boolean falling) { + this.falling = falling; + if (!this.host.getLevel().isClientSide()) { + TFPacketHandler.CHANNEL.send(PacketDistributor.TRACKING_ENTITY_AND_SELF.with(() -> this.host), new UpdateFeatherFanFallPacket(this.host.getId(), this)); + } + } + + @Override + public boolean getFalling() { + return this.falling; + } + + @Override + public CompoundTag serializeNBT() { + CompoundTag tag = new CompoundTag(); + tag.putBoolean("featherFanFalling", this.getFalling()); + return tag; + } + + @Override + public void deserializeNBT(CompoundTag nbt) { + this.setFalling(nbt.getBoolean("featherFanFalling")); + } +} diff --git a/src/main/java/twilightforest/capabilities/fan/FeatherFanFallCapability.java b/src/main/java/twilightforest/capabilities/fan/FeatherFanFallCapability.java new file mode 100644 index 0000000000..2c9fa7300e --- /dev/null +++ b/src/main/java/twilightforest/capabilities/fan/FeatherFanFallCapability.java @@ -0,0 +1,21 @@ +package twilightforest.capabilities.fan; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraftforge.common.util.INBTSerializable; +import twilightforest.TwilightForestMod; + +public interface FeatherFanFallCapability extends INBTSerializable { + + ResourceLocation ID = TwilightForestMod.prefix("cap_feather_fan_fall"); + + void setEntity(Player entity); + + void update(); + + void setFalling(boolean falling); + + boolean getFalling(); +} diff --git a/src/main/java/twilightforest/capabilities/fan/package-info.java b/src/main/java/twilightforest/capabilities/fan/package-info.java new file mode 100644 index 0000000000..5e9bba768f --- /dev/null +++ b/src/main/java/twilightforest/capabilities/fan/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.capabilities.fan; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/capabilities/giant_pick/GiantPickMineCapability.java b/src/main/java/twilightforest/capabilities/giant_pick/GiantPickMineCapability.java new file mode 100644 index 0000000000..e27f4b0a7b --- /dev/null +++ b/src/main/java/twilightforest/capabilities/giant_pick/GiantPickMineCapability.java @@ -0,0 +1,15 @@ +package twilightforest.capabilities.giant_pick; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.common.util.INBTSerializable; +import twilightforest.TwilightForestMod; + +public interface GiantPickMineCapability extends INBTSerializable { + + ResourceLocation ID = TwilightForestMod.prefix("giant_pick_mine"); + + void setMining(long mining); + + long getMining(); +} diff --git a/src/main/java/twilightforest/capabilities/giant_pick/GiantPickMineCapabilityHandler.java b/src/main/java/twilightforest/capabilities/giant_pick/GiantPickMineCapabilityHandler.java new file mode 100644 index 0000000000..37386684c3 --- /dev/null +++ b/src/main/java/twilightforest/capabilities/giant_pick/GiantPickMineCapabilityHandler.java @@ -0,0 +1,30 @@ +package twilightforest.capabilities.giant_pick; + +import net.minecraft.nbt.CompoundTag; + +public class GiantPickMineCapabilityHandler implements GiantPickMineCapability { + + private long mining; + + @Override + public void setMining(long mining) { + this.mining = mining; + } + + @Override + public long getMining() { + return this.mining; + } + + @Override + public CompoundTag serializeNBT() { + CompoundTag tag = new CompoundTag(); + tag.putLong("giantPickMining", this.getMining()); + return tag; + } + + @Override + public void deserializeNBT(CompoundTag nbt) { + this.setMining(nbt.getLong("giantPickMining")); + } +} diff --git a/src/main/java/twilightforest/capabilities/giant_pick/package-info.java b/src/main/java/twilightforest/capabilities/giant_pick/package-info.java new file mode 100644 index 0000000000..377bda5e45 --- /dev/null +++ b/src/main/java/twilightforest/capabilities/giant_pick/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.capabilities.giant_pick; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/capabilities/package-info.java b/src/main/java/twilightforest/capabilities/package-info.java new file mode 100644 index 0000000000..abb87d1319 --- /dev/null +++ b/src/main/java/twilightforest/capabilities/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.capabilities; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/capabilities/shield/IShieldCapability.java b/src/main/java/twilightforest/capabilities/shield/IShieldCapability.java new file mode 100644 index 0000000000..6b1993db2b --- /dev/null +++ b/src/main/java/twilightforest/capabilities/shield/IShieldCapability.java @@ -0,0 +1,30 @@ +package twilightforest.capabilities.shield; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.common.util.INBTSerializable; +import twilightforest.TwilightForestMod; + +public interface IShieldCapability extends INBTSerializable { + + ResourceLocation ID = TwilightForestMod.prefix("cap_shield"); + + void setEntity(LivingEntity entity); + + void update(); + + int shieldsLeft(); + + int temporaryShieldsLeft(); + + int permanentShieldsLeft(); + + void breakShield(); + + void replenishShields(); + + void setShields(int amount, boolean temp); + + void addShields(int amount, boolean temp); +} diff --git a/src/main/java/twilightforest/capabilities/shield/ShieldCapabilityHandler.java b/src/main/java/twilightforest/capabilities/shield/ShieldCapabilityHandler.java new file mode 100644 index 0000000000..2c89a370d1 --- /dev/null +++ b/src/main/java/twilightforest/capabilities/shield/ShieldCapabilityHandler.java @@ -0,0 +1,126 @@ +package twilightforest.capabilities.shield; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraftforge.network.PacketDistributor; +import twilightforest.init.TFSounds; +import twilightforest.network.TFPacketHandler; +import twilightforest.network.UpdateShieldPacket; +import twilightforest.init.TFStats; + +public class ShieldCapabilityHandler implements IShieldCapability { + private int temporaryShields; + private int permanentShields; + private LivingEntity host; + private int timer; + private int breakTimer; + + @Override + public void setEntity(LivingEntity entity) { + host = entity; + } + + @Override + public void update() { + if (!host.level.isClientSide && temporaryShieldsLeft() > 0 && timer-- <= 0 && breakTimer <= 0 && (!(host instanceof Player) || !((Player) host).isCreative())) + breakShield(); + if (breakTimer > 0) + breakTimer--; + } + + @Override + public int shieldsLeft() { + return temporaryShields + permanentShields; + } + + @Override + public int temporaryShieldsLeft() { + return temporaryShields; + } + + @Override + public int permanentShieldsLeft() { + return permanentShields; + } + + @Override + public void breakShield() { + if (breakTimer <= 0) { + // Temp shields should break first before permanent ones. Reset time each time a temp shield is busted. + if (temporaryShields > 0) { + temporaryShields--; + resetTimer(); + } else if (permanentShields > 0) { + permanentShields--; + } + + if (host instanceof ServerPlayer player) + player.awardStat(TFStats.TF_SHIELDS_BROKEN.get()); + sendUpdatePacket(); + host.level.playSound(null, host.blockPosition(), TFSounds.SHIELD_BREAK.get(), SoundSource.PLAYERS, 1.0F, ((host.getRandom().nextFloat() - host.getRandom().nextFloat()) * 0.7F + 1.0F) * 2.0F); + breakTimer = 20; + } + } + + @Override + public void replenishShields() { + setShields(5, true); + host.level.playSound(null, host.blockPosition(), TFSounds.SHIELD_ADD.get(), SoundSource.PLAYERS, 1.0F, (host.getRandom().nextFloat() - host.getRandom().nextFloat()) * 0.2F + 1.0F); + } + + @Override + public void setShields(int amount, boolean temp) { + if (temp) { + temporaryShields = Math.max(amount, 0); + resetTimer(); + } else { + permanentShields = Math.max(amount, 0); + } + + sendUpdatePacket(); + } + + @Override + public void addShields(int amount, boolean temp) { + if (temp) { + if (temporaryShields <= 0) + resetTimer(); // Since we add new shields to the stack instead of setting them, no timer reset is needed, unless they start from 0 shields. + temporaryShields = Math.max(temporaryShields + amount, 0); + } else { + permanentShields = Math.max(permanentShields + amount, 0); + } + + sendUpdatePacket(); + } + + void initShields(int temporary, int permanent) { + temporaryShields = Math.max(temporary, 0); + permanentShields = Math.max(permanent, 0); + resetTimer(); + } + + private void resetTimer() { + timer = 240; + } + + private void sendUpdatePacket() { + if (host instanceof ServerPlayer) + TFPacketHandler.CHANNEL.send(PacketDistributor.TRACKING_ENTITY_AND_SELF.with(() -> host), new UpdateShieldPacket(host, this)); + } + + @Override + public CompoundTag serializeNBT() { + CompoundTag tag = new CompoundTag(); + tag.putInt("tempshields", this.temporaryShieldsLeft()); + tag.putInt("permshields", this.permanentShieldsLeft()); + return tag; + } + + @Override + public void deserializeNBT(CompoundTag tag) { + this.initShields(tag.getInt("tempshields"), tag.getInt("permshields")); + } +} diff --git a/src/main/java/twilightforest/capabilities/shield/package-info.java b/src/main/java/twilightforest/capabilities/shield/package-info.java new file mode 100644 index 0000000000..3f70400e8c --- /dev/null +++ b/src/main/java/twilightforest/capabilities/shield/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.capabilities.shield; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/capabilities/teleporter_cache/TeleporterCacheCapability.java b/src/main/java/twilightforest/capabilities/teleporter_cache/TeleporterCacheCapability.java new file mode 100644 index 0000000000..2f29edfb92 --- /dev/null +++ b/src/main/java/twilightforest/capabilities/teleporter_cache/TeleporterCacheCapability.java @@ -0,0 +1,12 @@ +package twilightforest.capabilities.teleporter_cache; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.common.util.INBTSerializable; +import twilightforest.TwilightForestMod; + +public interface TeleporterCacheCapability extends INBTSerializable { + + ResourceLocation ID = TwilightForestMod.prefix("teleporter_cache"); + +} diff --git a/src/main/java/twilightforest/capabilities/teleporter_cache/TeleporterCacheCapabilityHandler.java b/src/main/java/twilightforest/capabilities/teleporter_cache/TeleporterCacheCapabilityHandler.java new file mode 100644 index 0000000000..00e93f62d6 --- /dev/null +++ b/src/main/java/twilightforest/capabilities/teleporter_cache/TeleporterCacheCapabilityHandler.java @@ -0,0 +1,17 @@ +package twilightforest.capabilities.teleporter_cache; + +import net.minecraft.nbt.CompoundTag; +import twilightforest.world.TFTeleporter; + +public class TeleporterCacheCapabilityHandler implements TeleporterCacheCapability { + + @Override + public CompoundTag serializeNBT() { + return TFTeleporter.saveLinks(); + } + + @Override + public void deserializeNBT(CompoundTag nbt) { + TFTeleporter.loadLinks(nbt); + } +} diff --git a/src/main/java/twilightforest/capabilities/teleporter_cache/package-info.java b/src/main/java/twilightforest/capabilities/teleporter_cache/package-info.java new file mode 100644 index 0000000000..5cec1f48aa --- /dev/null +++ b/src/main/java/twilightforest/capabilities/teleporter_cache/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.capabilities.teleporter_cache; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/capabilities/thrown/YetiThrowCapability.java b/src/main/java/twilightforest/capabilities/thrown/YetiThrowCapability.java new file mode 100644 index 0000000000..d2f4e6a8ae --- /dev/null +++ b/src/main/java/twilightforest/capabilities/thrown/YetiThrowCapability.java @@ -0,0 +1,28 @@ +package twilightforest.capabilities.thrown; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.LivingEntity; +import net.minecraftforge.common.util.INBTSerializable; +import org.jetbrains.annotations.Nullable; +import twilightforest.TwilightForestMod; + +public interface YetiThrowCapability extends INBTSerializable { + + ResourceLocation ID = TwilightForestMod.prefix("cap_thrown"); + + void setEntity(LivingEntity entity); + + void update(); + + boolean getThrown(); + + void setThrown(boolean thrown, @Nullable LivingEntity thrower); + + @Nullable + LivingEntity getThrower(); + + int getThrowCooldown(); + + void setThrowCooldown(int cooldown); +} diff --git a/src/main/java/twilightforest/capabilities/thrown/YetiThrowCapabilityHandler.java b/src/main/java/twilightforest/capabilities/thrown/YetiThrowCapabilityHandler.java new file mode 100644 index 0000000000..2159cccd47 --- /dev/null +++ b/src/main/java/twilightforest/capabilities/thrown/YetiThrowCapabilityHandler.java @@ -0,0 +1,85 @@ +package twilightforest.capabilities.thrown; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraftforge.network.PacketDistributor; +import org.jetbrains.annotations.Nullable; +import twilightforest.network.TFPacketHandler; +import twilightforest.network.UpdateThrownPacket; + +public class YetiThrowCapabilityHandler implements YetiThrowCapability { + + private boolean thrown; + private LivingEntity host; + @Nullable + private LivingEntity thrower; + private int throwCooldown; + + @Override + public void setEntity(LivingEntity entity) { + this.host = entity; + } + + @Override + public void update() { + if (this.host instanceof Player player && this.getThrown()) { + if (player.isOnGround() || player.isSwimming() || player.isInWater()) { + this.setThrown(false, null); + } + } else { + if (this.throwCooldown > 0) { + this.throwCooldown--; + } + } + } + + @Override + public boolean getThrown() { + return this.thrown; + } + + @Override + public void setThrown(boolean thrown, @Nullable LivingEntity thrower) { + this.thrown = thrown; + this.thrower = thrower; + this.sendUpdatePacket(); + } + + @Override + public @Nullable LivingEntity getThrower() { + return this.thrower; + } + + @Override + public int getThrowCooldown() { + return this.throwCooldown; + } + + @Override + public void setThrowCooldown(int cooldown) { + this.throwCooldown = cooldown; + this.sendUpdatePacket(); + } + + private void sendUpdatePacket() { + if (!this.host.getLevel().isClientSide()) { + TFPacketHandler.CHANNEL.send(PacketDistributor.TRACKING_ENTITY_AND_SELF.with(() -> this.host), new UpdateThrownPacket(this.host, this)); + } + } + + @Override + public CompoundTag serializeNBT() { + CompoundTag tag = new CompoundTag(); + tag.putBoolean("yetiThrown", this.getThrown()); + tag.putInt("throwCooldown", this.getThrowCooldown()); + return tag; + } + + @Override + public void deserializeNBT(CompoundTag nbt) { + this.setThrown(nbt.getBoolean("yetiThrown"), null); + this.setThrowCooldown(nbt.getInt("throwCooldown")); + } +} diff --git a/src/main/java/twilightforest/capabilities/thrown/package-info.java b/src/main/java/twilightforest/capabilities/thrown/package-info.java new file mode 100644 index 0000000000..4933ea7c62 --- /dev/null +++ b/src/main/java/twilightforest/capabilities/thrown/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.capabilities.thrown; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/client/BugModelAnimationHelper.java b/src/main/java/twilightforest/client/BugModelAnimationHelper.java new file mode 100644 index 0000000000..ab432e32b9 --- /dev/null +++ b/src/main/java/twilightforest/client/BugModelAnimationHelper.java @@ -0,0 +1,97 @@ +package twilightforest.client; + +import net.minecraft.util.RandomSource; + +import java.util.Random; + +public class BugModelAnimationHelper { + + private static final RandomSource rand = RandomSource.create(); + + private static int yawDelay; + public static int currentYaw; + private static int desiredYaw; + + public static int yawWriggleDelay; + public static int currentRotation = -1; + public static int desiredRotation; + + public static float glowIntensity; + private static boolean glowing; + private static int glowDelay; + + static void animate() { + tickYaw(); + tickGlow(); + tickRotation(); + } + + private static void tickYaw() { + if (yawDelay > 0) { + yawDelay--; + return; + } + + if (currentYaw == 0 && desiredYaw == 0) { + // make it rotate! + yawDelay = 200 + rand.nextInt(200); + desiredYaw = rand.nextInt(15) - rand.nextInt(15); + } + + if (currentYaw < desiredYaw) { + currentYaw++; + } else if (currentYaw > desiredYaw) { + currentYaw--; + } else if (currentYaw == desiredYaw) { + desiredYaw = 0; + } + } + + private static void tickGlow() { + if (glowDelay > 0) { + glowDelay--; + return; + } + + if (glowing && glowIntensity >= 1f) { + glowing = false; + } + if (glowing && glowIntensity < 1f) { + glowIntensity += 0.05f; + } + if (!glowing && glowIntensity > 0f) { + glowIntensity -= 0.05f; + } + if (!glowing && glowIntensity <= 0f) { + glowing = true; + glowDelay = rand.nextInt(50); + } + } + + private static void tickRotation() { + if (yawWriggleDelay > 0) { + yawWriggleDelay--; + return; + } + + if (currentRotation == -1) { + currentRotation = rand.nextInt(4) * 90; + } + + if (desiredRotation == 0) { + // make it rotate! + yawWriggleDelay = 200 + rand.nextInt(200); + desiredRotation = rand.nextInt(4) * 90; + } + + currentRotation++; + + if (currentRotation > 360) { + currentRotation = 0; + } + + if (currentRotation == desiredRotation) { + desiredRotation = 0; + } + } +} diff --git a/src/main/java/twilightforest/client/ClientInitiator.java b/src/main/java/twilightforest/client/ClientInitiator.java new file mode 100644 index 0000000000..f374c755cf --- /dev/null +++ b/src/main/java/twilightforest/client/ClientInitiator.java @@ -0,0 +1,19 @@ +package twilightforest.client; + +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.fml.DistExecutor; + +import java.util.function.Supplier; + +import twilightforest.TwilightForestMod; + +/** + * Avoid adding to this class, this is strictly for {@link TFClientSetup} initiliazation from {@link TwilightForestMod#TwilightForestMod()} via {@link DistExecutor#safeRunWhenOn(Dist, Supplier)} + */ +public class ClientInitiator { + + public static void call() { + TFClientSetup.init(); + } + +} diff --git a/src/main/java/twilightforest/client/ColorHandler.java b/src/main/java/twilightforest/client/ColorHandler.java new file mode 100644 index 0000000000..88a804b84a --- /dev/null +++ b/src/main/java/twilightforest/client/ColorHandler.java @@ -0,0 +1,411 @@ +package twilightforest.client; + +import net.minecraft.client.color.block.BlockColors; +import net.minecraft.client.renderer.BiomeColors; +import net.minecraft.core.BlockPos; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.alchemy.PotionUtils; +import net.minecraft.world.level.FoliageColor; +import net.minecraft.world.level.GrassColor; +import net.minecraft.world.level.block.Blocks; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.client.event.RegisterColorHandlersEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; +import twilightforest.TwilightForestMod; +import twilightforest.block.AuroraBrickBlock; +import twilightforest.block.CastleDoorBlock; +import twilightforest.block.HollowLogClimbable; +import twilightforest.enums.HollowLogVariants; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFItems; +import twilightforest.item.ArcticArmorItem; +import twilightforest.util.ColorUtil; + +@Mod.EventBusSubscriber(modid = TwilightForestMod.ID, value = Dist.CLIENT, bus = Mod.EventBusSubscriber.Bus.MOD) +public final class ColorHandler { + + @SubscribeEvent + public static void registerBlockColors(RegisterColorHandlersEvent.Block event) { + + BlockColors blockColors = event.getBlockColors(); + + event.register((state, getter, pos, tintIndex) -> tintIndex > 15 ? 0xFFFFFF : ColorUtil.hsvToRGB(getter == null ? 0.45F : AuroraBrickBlock.rippleFractialNoise(2, 128.0f, pos != null ? pos.above(128) : new BlockPos(0, 0, 0), 0.37f, 0.67f, 1.5f), 1.0f, 1.0f), TFBlocks.AURORA_BLOCK.get()); + event.register((state, getter, pos, tintIndex) -> { + if (tintIndex > 15) return 0xFFFFFF; + + int normalColor = blockColors.getColor(TFBlocks.AURORA_BLOCK.get().defaultBlockState(), getter, pos, tintIndex); + + int red = (normalColor >> 16) & 255; + int blue = normalColor & 255; + int green = (normalColor >> 8) & 255; + + float[] hsb = ColorUtil.rgbToHSV(red, green, blue); + + return ColorUtil.hsvToRGB(hsb[0], hsb[1] * 0.5F, Math.min(hsb[2] + 0.4F, 0.9F)); + }, TFBlocks.AURORA_PILLAR.get(), TFBlocks.AURORA_SLAB.get(), TFBlocks.AURORALIZED_GLASS.get()); + event.register((state, getter, pos, tintIndex) -> { + if (tintIndex > 15) return 0xFFFFFF; + + if (getter == null || pos == null) { + return FoliageColor.getDefaultColor(); + } + + int red = 0; + int grn = 0; + int blu = 0; + + for (int dz = -1; dz <= 1; ++dz) { + for (int dx = -1; dx <= 1; ++dx) { + int i2 = BiomeColors.getAverageFoliageColor(getter, pos.offset(dx, 0, dz)); + red += (i2 & 16711680) >> 16; + grn += (i2 & 65280) >> 8; + blu += i2 & 255; + } + } + + return (red / 9 & 255) << 16 | (grn / 9 & 255) << 8 | blu / 9 & 255; + }, TFBlocks.DARK_LEAVES.get(), TFBlocks.HARDENED_DARK_LEAVES.get(), TFBlocks.GIANT_LEAVES.get()); + event.register((state, getter, pos, tintIndex) -> tintIndex > 15 ? 0xFFFFFF : blockColors.getColor(Blocks.GRASS.defaultBlockState(), getter, pos, tintIndex), TFBlocks.SMOKER.get(), TFBlocks.FIRE_JET.get()); + event.register((state, getter, pos, tintIndex) -> getter != null && pos != null ? 2129968 : 7455580, TFBlocks.HUGE_LILY_PAD.get()); + event.register((state, getter, pos, tintIndex) -> { + if (tintIndex > 15) return 0xFFFFFF; + + if (getter == null || pos == null) { + return 106 << 16 | 156 << 8 | 23; + } else { + int red, green, blue; + + int fade = pos.getX() * 16 + pos.getY() * 16 + pos.getZ() * 16; + if ((fade & 256) != 0) { + fade = 255 - (fade & 255); + } + fade &= 255; + + float spring = (255 - fade) / 255F; + float fall = fade / 255F; + + red = (int) (spring * 106 + fall * 251); + green = (int) (spring * 156 + fall * 108); + blue = (int) (spring * 23 + fall * 27); + + return red << 16 | green << 8 | blue; + } + }, TFBlocks.TIME_LEAVES.get()); + event.register((state, getter, pos, tintIndex) -> { + if (tintIndex > 15) return 0xFFFFFF; + + if (getter == null || pos == null) { + return 108 << 16 | 204 << 8 | 234; + } else { + int red, green, blue; + + int fade = pos.getX() * 27 + pos.getY() * 63 + pos.getZ() * 39; + if ((fade & 256) != 0) { + fade = 255 - (fade & 255); + } + fade &= 255; + + float spring = (255 - fade) / 255F; + float fall = fade / 255F; + + red = (int) (spring * 108 + fall * 96); + green = (int) (spring * 204 + fall * 107); + blue = (int) (spring * 234 + fall * 121); + + return red << 16 | green << 8 | blue; + } + }, TFBlocks.TRANSFORMATION_LEAVES.get()); + event.register((state, getter, pos, tintIndex) -> { + if (tintIndex > 15) return 0xFFFFFF; + + if (getter == null || pos == null) { + return 252 << 16 | 241 << 8 | 68; + } else { + int red, green, blue; + + int fade = pos.getX() * 31 + pos.getY() * 33 + pos.getZ() * 32; + if ((fade & 256) != 0) { + fade = 255 - (fade & 255); + } + fade &= 255; + + float spring = (255 - fade) / 255F; + float fall = fade / 255F; + + red = (int) (spring * 252 + fall * 237); + green = (int) (spring * 241 + fall * 172); + blue = (int) (spring * 68 + fall * 9); + + return red << 16 | green << 8 | blue; + } + }, TFBlocks.MINING_LEAVES.get()); + event.register((state, getter, pos, tintIndex) -> { + if (tintIndex > 15) return 0xFFFFFF; + + if (getter == null || pos == null) { + return 54 << 16 | 76 << 8 | 3; + } else { + int red, green, blue; + + int fade = pos.getX() * 63 + pos.getY() * 63 + pos.getZ() * 63; + if ((fade & 256) != 0) { + fade = 255 - (fade & 255); + } + fade &= 255; + + float spring = (255 - fade) / 255F; + float fall = fade / 255F; + + red = (int) (spring * 54 + fall * 168); + green = (int) (spring * 76 + fall * 199); + blue = (int) (spring * 3 + fall * 43); + + return red << 16 | green << 8 | blue; + } + }, TFBlocks.SORTING_LEAVES.get()); + event.register((state, getter, pos, tintIndex) -> { + if (tintIndex > 15) return 0xFFFFFF; + + if (getter == null || pos == null) { + return -1; + } else { + float f = AuroraBrickBlock.rippleFractialNoise(2, 32.0f, pos, 0.4f, 1.0f, 2f); + return ColorUtil.hsvToRGB(0.1f, 1f - f, (f + 2f) / 3f); + } + }, TFBlocks.TOWERWOOD.get(), TFBlocks.CRACKED_TOWERWOOD.get(), TFBlocks.INFESTED_TOWERWOOD.get(), TFBlocks.MOSSY_TOWERWOOD.get()); + event.register((state, world, pos, tintIndex) -> { + if (tintIndex > 15) return 0xFFFFFF; + + if (world == null || pos == null) { + return 0x48B518; + } else { + int red = 0; + int green = 0; + int blue = 0; + + for (int dz = -1; dz <= 1; ++dz) { + for (int dx = -1; dx <= 1; ++dx) { + int color = BiomeColors.getAverageFoliageColor(world, pos); + red += (color & 16711680) >> 16; + green += (color & 65280) >> 8; + blue += color & 255; + } + } + + return (red / 9 & 0xFF) << 16 | (green / 9 & 0xFF) << 8 | blue / 9 & 0xFF; + } + }, TFBlocks.TWILIGHT_OAK_LEAVES.get()); + event.register((state, world, pos, tintIndex) -> { + if (tintIndex > 15) return 0xFFFFFF; + + if (world == null || pos == null) { + return 0x609860; + } else { + int red = 0; + int green = 0; + int blue = 0; + + for (int dz = -1; dz <= 1; ++dz) { + for (int dx = -1; dx <= 1; ++dx) { + int color = BiomeColors.getAverageFoliageColor(world, pos); + red += (color & 16711680) >> 16; + green += (color & 65280) >> 8; + blue += color & 255; + } + } + + int normalColor = (red / 9 & 0xFF) << 16 | (green / 9 & 0xFF) << 8 | blue / 9 & 0xFF; + // canopy colorizer + return ((normalColor & 0xFEFEFE) + 0x469A66) / 2; + } + }, TFBlocks.CANOPY_LEAVES.get()); + event.register((state, world, pos, tintIndex) -> { + if (tintIndex > 15) return 0xFFFFFF; + + if (world == null || pos == null) { + return 0x80A755; + } else { + int red = 0; + int green = 0; + int blue = 0; + + for (int dz = -1; dz <= 1; ++dz) { + for (int dx = -1; dx <= 1; ++dx) { + int color = BiomeColors.getAverageFoliageColor(world, pos); + red += (color & 16711680) >> 16; + green += (color & 65280) >> 8; + blue += color & 255; + } + } + + int normalColor = (red / 9 & 0xFF) << 16 | (green / 9 & 0xFF) << 8 | blue / 9 & 0xFF; + // mangrove colors + return ((normalColor & 0xFEFEFE) + 0xC0E694) / 2; + } + }, TFBlocks.MANGROVE_LEAVES.get()); + event.register((state, getter, pos, tintIndex) -> { + if (tintIndex > 15) return 0xFFFFFF; + + if (getter == null || pos == null) { + return 0x48B518; + } else { + int red = 0; + int green = 0; + int blue = 0; + + for (int dz = -1; dz <= 1; ++dz) { + for (int dx = -1; dx <= 1; ++dx) { + int color = BiomeColors.getAverageFoliageColor(getter, pos); + red += (color & 0xFF0000) >> 16; + green += (color & 0xFF00) >> 8; + blue += color & 0xFF; + } + } + + // RAINBOW! + red = pos.getX() * 32 + pos.getY() * 16; + if ((red & 256) != 0) { + red = 255 - (red & 255); + } + red &= 255; + + green = pos.getY() * 32 + pos.getZ() * 16; + if ((green & 256) != 0) { + green = 255 - (green & 255); + } + green ^= 255; + + blue = pos.getX() * 16 + pos.getZ() * 32; + if ((blue & 256) != 0) { + blue = 255 - (blue & 255); + } + blue &= 255; + + return red << 16 | green << 8 | blue; + } + }, TFBlocks.RAINBOW_OAK_LEAVES.get()); + event.register((state, getter, pos, tintIndex) -> FoliageColor.getEvergreenColor(), TFBlocks.BEANSTALK_LEAVES.get(), TFBlocks.THORN_LEAVES.get()); + event.register((state, getter, pos, tintIndex) -> { + if (tintIndex != 0) { + return 0xFFFFFF; + } else { + if (getter != null && pos != null) { + return BiomeColors.getAverageFoliageColor(getter, pos); + } else { + return FoliageColor.getDefaultColor(); + } + } + }, TFBlocks.FALLEN_LEAVES.get()); + event.register((state, getter, pos, tintIndex) -> { + if ((tintIndex & 1) == 1) { + return 0xFFFFFF; + } else { + if (getter != null && pos != null) { + return BiomeColors.getAverageGrassColor(getter, pos); + } else { + return GrassColor.get(0.5D, 1.0D); + } + } + }, TFBlocks.FIDDLEHEAD.get(), TFBlocks.POTTED_FIDDLEHEAD.get()); + event.register((state, getter, pos, tintIndex) -> { + if ((tintIndex & 1) == 0) { + return 0xFFFFFF; + } else { + return GrassColor.get(0.5D, 1.0D); + + } + }, TFBlocks.HOLLOW_OAK_LOG_HORIZONTAL.get(), TFBlocks.HOLLOW_SPRUCE_LOG_HORIZONTAL.get(), TFBlocks.HOLLOW_BIRCH_LOG_HORIZONTAL.get(), TFBlocks.HOLLOW_JUNGLE_LOG_HORIZONTAL.get(), + TFBlocks.HOLLOW_ACACIA_LOG_HORIZONTAL.get(), TFBlocks.HOLLOW_DARK_OAK_LOG_HORIZONTAL.get(), TFBlocks.HOLLOW_CRIMSON_STEM_HORIZONTAL.get(), TFBlocks.HOLLOW_WARPED_STEM_HORIZONTAL.get(), TFBlocks.HOLLOW_VANGROVE_LOG_HORIZONTAL.get(), + TFBlocks.HOLLOW_TWILIGHT_OAK_LOG_HORIZONTAL.get(), TFBlocks.HOLLOW_CANOPY_LOG_HORIZONTAL.get(), TFBlocks.HOLLOW_MANGROVE_LOG_HORIZONTAL.get(), TFBlocks.HOLLOW_DARK_LOG_HORIZONTAL.get(), + TFBlocks.HOLLOW_TIME_LOG_HORIZONTAL.get(), TFBlocks.HOLLOW_TRANSFORMATION_LOG_HORIZONTAL.get(), TFBlocks.HOLLOW_MINING_LOG_HORIZONTAL.get(), TFBlocks.HOLLOW_SORTING_LOG_HORIZONTAL.get()); + event.register((state, getter, pos, tintIndex) -> { + if (state.getValue(HollowLogClimbable.VARIANT) != HollowLogVariants.Climbable.VINE || (tintIndex & 1) == 0) { + return 0xFFFFFF; + } else { + if (getter != null && pos != null) { + return BiomeColors.getAverageFoliageColor(getter, pos); + } else { + return FoliageColor.getDefaultColor(); + } + } + }, TFBlocks.HOLLOW_OAK_LOG_CLIMBABLE.get(), TFBlocks.HOLLOW_SPRUCE_LOG_CLIMBABLE.get(), TFBlocks.HOLLOW_BIRCH_LOG_CLIMBABLE.get(), TFBlocks.HOLLOW_JUNGLE_LOG_CLIMBABLE.get(), + TFBlocks.HOLLOW_ACACIA_LOG_CLIMBABLE.get(), TFBlocks.HOLLOW_DARK_OAK_LOG_CLIMBABLE.get(), TFBlocks.HOLLOW_CRIMSON_STEM_CLIMBABLE.get(), TFBlocks.HOLLOW_WARPED_STEM_CLIMBABLE.get(), TFBlocks.HOLLOW_VANGROVE_LOG_CLIMBABLE.get(), + TFBlocks.HOLLOW_TWILIGHT_OAK_LOG_CLIMBABLE.get(), TFBlocks.HOLLOW_CANOPY_LOG_CLIMBABLE.get(), TFBlocks.HOLLOW_MANGROVE_LOG_CLIMBABLE.get(), TFBlocks.HOLLOW_DARK_LOG_CLIMBABLE.get(), + TFBlocks.HOLLOW_TIME_LOG_CLIMBABLE.get(), TFBlocks.HOLLOW_TRANSFORMATION_LOG_CLIMBABLE.get(), TFBlocks.HOLLOW_MINING_LOG_CLIMBABLE.get(), TFBlocks.HOLLOW_SORTING_LOG_CLIMBABLE.get()); + event.register((state, getter, pos, tintIndex) -> GrassColor.get(0.5D, 1.0D), + TFBlocks.TWILIGHT_PORTAL_MINIATURE_STRUCTURE.get(), /*TFBlocks.HEDGE_MAZE_MINIATURE_STRUCTURE.get(), TFBlocks.HOLLOW_HILL_MINIATURE_STRUCTURE.get(), TFBlocks.QUEST_GROVE_MINIATURE_STRUCTURE.get(), TFBlocks.MUSHROOM_TOWER_MINIATURE_STRUCTURE.get(),*/ TFBlocks.NAGA_COURTYARD_MINIATURE_STRUCTURE.get(), TFBlocks.LICH_TOWER_MINIATURE_STRUCTURE.get() //TFBlocks.MINOTAUR_LABYRINTH_MINIATURE_STRUCTURE.get(), + /*TFBlocks.HYDRA_LAIR_MINIATURE_STRUCTURE.get(), TFBlocks.GOBLIN_STRONGHOLD_MINIATURE_STRUCTURE.get(), TFBlocks.DARK_TOWER_MINIATURE_STRUCTURE.get(), TFBlocks.YETI_CAVE_MINIATURE_STRUCTURE.get(), TFBlocks.AURORA_PALACE_MINIATURE_STRUCTURE.get(), TFBlocks.TROLL_CAVE_COTTAGE_MINIATURE_STRUCTURE.get(), TFBlocks.FINAL_CASTLE_MINIATURE_STRUCTURE.get()*/); + event.register((state, getter, pos, tintIndex) -> { + if (tintIndex > 15) return 0xFFFFFF; + int color = 0xFF00FF; + if (state.getBlock() instanceof CastleDoorBlock && state.getValue(CastleDoorBlock.ACTIVE) && !state.getValue(CastleDoorBlock.VANISHED)) return color ^ 0xFFFFFF; + return color; + }, TFBlocks.PINK_CASTLE_RUNE_BRICK.get(), TFBlocks.PINK_CASTLE_DOOR.get()); + event.register((state, getter, pos, tintIndex) -> { + if (tintIndex > 15) return 0xFFFFFF; + int color = 0x00FFFF; + if (state.getBlock() instanceof CastleDoorBlock && state.getValue(CastleDoorBlock.ACTIVE) && !state.getValue(CastleDoorBlock.VANISHED)) return color ^ 0xFFFFFF; + return color; + }, TFBlocks.BLUE_CASTLE_RUNE_BRICK.get(), TFBlocks.BLUE_CASTLE_DOOR.get()); + event.register((state, getter, pos, tintIndex) -> { + if (tintIndex > 15) return 0xFFFFFF; + int color = 0xFFFF00; + if (state.getBlock() instanceof CastleDoorBlock && state.getValue(CastleDoorBlock.ACTIVE) && !state.getValue(CastleDoorBlock.VANISHED)) return color ^ 0xFFFFFF; + return color; + }, TFBlocks.YELLOW_CASTLE_RUNE_BRICK.get(), TFBlocks.YELLOW_CASTLE_DOOR.get()); + event.register((state, getter, pos, tintIndex) -> { + if (tintIndex > 15) return 0xFFFFFF; + int color = 0x4B0082; + if (state.getBlock() instanceof CastleDoorBlock && state.getValue(CastleDoorBlock.ACTIVE) && !state.getValue(CastleDoorBlock.VANISHED)) return color ^ 0xFFFFFF; + return color; + }, TFBlocks.VIOLET_CASTLE_RUNE_BRICK.get(), TFBlocks.VIOLET_CASTLE_DOOR.get()); + event.register((state, getter, pos, tintIndex) -> { + if (tintIndex > 15) return 0xFFFFFF; + return 0x5C1074; + }, TFBlocks.VIOLET_FORCE_FIELD.get()); + event.register((state, getter, pos, tintIndex) -> { + if (tintIndex > 15) return 0xFFFFFF; + return 0xFA057E; + }, TFBlocks.PINK_FORCE_FIELD.get()); + event.register((state, getter, pos, tintIndex) -> { + if (tintIndex > 15) return 0xFFFFFF; + return 0xFF5B02; + }, TFBlocks.ORANGE_FORCE_FIELD.get()); + event.register((state, getter, pos, tintIndex) -> { + if (tintIndex > 15) return 0xFFFFFF; + return 0x89E701; + }, TFBlocks.GREEN_FORCE_FIELD.get()); + event.register((state, getter, pos, tintIndex) -> { + if (tintIndex > 15) return 0xFFFFFF; + return 0x0DDEFF; + }, TFBlocks.BLUE_FORCE_FIELD.get()); + } + + @SubscribeEvent + public static void registerItemColors(RegisterColorHandlersEvent.Item event) { + BlockColors blockColors = event.getBlockColors(); + + event.register((stack, tintIndex) -> { + if (stack.getItem() instanceof BlockItem blocc) + return blockColors.getColor(blocc.getBlock().defaultBlockState(), null, null, tintIndex); + return 0xFFFFFF; + }, + TFBlocks.AURORA_BLOCK.get(), TFBlocks.AURORA_PILLAR.get(), TFBlocks.AURORA_SLAB.get(), TFBlocks.AURORALIZED_GLASS.get(), TFBlocks.DARK_LEAVES.get(), TFBlocks.GIANT_LEAVES.get(), TFBlocks.SMOKER.get(), TFBlocks.FIRE_JET.get(), + TFBlocks.TIME_LEAVES.get(), TFBlocks.TRANSFORMATION_LEAVES.get(), TFBlocks.MINING_LEAVES.get(), TFBlocks.SORTING_LEAVES.get(), TFBlocks.TWILIGHT_OAK_LEAVES.get(), TFBlocks.CANOPY_LEAVES.get(), TFBlocks.MANGROVE_LEAVES.get(), TFBlocks.RAINBOW_OAK_LEAVES.get(), TFBlocks.THORN_LEAVES.get(), TFBlocks.BEANSTALK_LEAVES.get(), + TFBlocks.FALLEN_LEAVES.get(), TFBlocks.FIDDLEHEAD.get(), TFBlocks.POTTED_FIDDLEHEAD.get(), TFBlocks.PINK_CASTLE_RUNE_BRICK.get(), TFBlocks.BLUE_CASTLE_RUNE_BRICK.get(), TFBlocks.YELLOW_CASTLE_RUNE_BRICK.get(), TFBlocks.VIOLET_CASTLE_RUNE_BRICK.get(), + TFBlocks.YELLOW_CASTLE_DOOR.get(), TFBlocks.BLUE_CASTLE_DOOR.get(), TFBlocks.PINK_CASTLE_DOOR.get(), TFBlocks.VIOLET_CASTLE_DOOR.get(), TFBlocks.PINK_FORCE_FIELD.get(), TFBlocks.BLUE_FORCE_FIELD.get(), TFBlocks.GREEN_FORCE_FIELD.get(), TFBlocks.ORANGE_FORCE_FIELD.get(), TFBlocks.VIOLET_FORCE_FIELD.get(), TFBlocks.HUGE_LILY_PAD.get(), + TFBlocks.TWILIGHT_PORTAL_MINIATURE_STRUCTURE.get(), /*TFBlocks.HEDGE_MAZE_MINIATURE_STRUCTURE.get(), TFBlocks.HOLLOW_HILL_MINIATURE_STRUCTURE.get(), TFBlocks.QUEST_GROVE_MINIATURE_STRUCTURE.get(), TFBlocks.MUSHROOM_TOWER_MINIATURE_STRUCTURE.get(),*/ TFBlocks.NAGA_COURTYARD_MINIATURE_STRUCTURE.get(), TFBlocks.LICH_TOWER_MINIATURE_STRUCTURE.get()//, TFBlocks.MINOTAUR_LABYRINTH_MINIATURE_STRUCTURE.get(), + /*TFBlocks.HYDRA_LAIR_MINIATURE_STRUCTURE.get(), TFBlocks.GOBLIN_STRONGHOLD_MINIATURE_STRUCTURE.get(), TFBlocks.DARK_TOWER_MINIATURE_STRUCTURE.get(), TFBlocks.YETI_CAVE_MINIATURE_STRUCTURE.get(), TFBlocks.AURORA_PALACE_MINIATURE_STRUCTURE.get(), TFBlocks.TROLL_CAVE_COTTAGE_MINIATURE_STRUCTURE.get(), TFBlocks.FINAL_CASTLE_MINIATURE_STRUCTURE.get()*/); + + event.register((stack, tintIndex) -> + stack.getItem() instanceof ArcticArmorItem arctic + ? (arctic).getColor(stack, tintIndex) + : 0xFFFFFF, + TFItems.ARCTIC_HELMET.get(), TFItems.ARCTIC_CHESTPLATE.get(), TFItems.ARCTIC_LEGGINGS.get(), TFItems.ARCTIC_BOOTS.get()); + + event.register((stack, tintIndex) -> + tintIndex > 0 ? -1 : PotionUtils.getColor(stack), + TFItems.BRITTLE_FLASK.get(), TFItems.GREATER_FLASK.get()); + } +} diff --git a/src/main/java/twilightforest/client/EffectRenders.java b/src/main/java/twilightforest/client/EffectRenders.java new file mode 100644 index 0000000000..6564b4208d --- /dev/null +++ b/src/main/java/twilightforest/client/EffectRenders.java @@ -0,0 +1,48 @@ +package twilightforest.client; + +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.model.EntityModel; +import net.minecraft.world.entity.LivingEntity; +import org.lwjgl.opengl.GL11; +import twilightforest.capabilities.CapabilityList; +import twilightforest.entity.boss.Lich; + +public enum EffectRenders { + + SHIELDS { + + @Override + public boolean shouldRender(LivingEntity entity, boolean firstPerson) { + if (entity instanceof Lich) return false; + return entity.getCapability(CapabilityList.SHIELDS).map(c -> c.shieldsLeft() > 0).orElse(false); + } + + @Override + public void render(LivingEntity entity, EntityModel renderer, + double x, double y, double z, float partialTicks, boolean firstPerson) { + + PoseStack ms = RenderSystem.getModelViewStack(); + ms.pushPose(); + ms.translate(x, y, z); + ms.translate(0, 0.5F - entity.getEyeHeight(), 0); + RenderSystem.enableBlend(); + RenderSystem.disableCull(); + RenderSystem.blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + RenderSystem.enableCull(); + RenderSystem.disableBlend(); + ms.popPose(); + } + }; + + static final EffectRenders[] VALUES = values(); + + public boolean shouldRender(LivingEntity entity, boolean firstPerson) { + return false; + } + + public void render(LivingEntity entity, EntityModel renderer, + double x, double y, double z, float partialTicks, boolean firstPerson) { + + } +} diff --git a/src/main/java/twilightforest/client/FogHandler.java b/src/main/java/twilightforest/client/FogHandler.java new file mode 100644 index 0000000000..b73b8507e7 --- /dev/null +++ b/src/main/java/twilightforest/client/FogHandler.java @@ -0,0 +1,112 @@ +package twilightforest.client; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.client.renderer.FogRenderer; +import net.minecraft.util.Mth; +import net.minecraft.world.level.material.FogType; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.client.event.ViewportEvent; +import net.minecraftforge.event.level.LevelEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; +import twilightforest.TwilightForestMod; +import twilightforest.init.TFBiomes; + +import javax.annotation.Nullable; + +@Mod.EventBusSubscriber(modid = TwilightForestMod.ID, value = Dist.CLIENT) +public class FogHandler { + + private static final float[] spoopColors = new float[3]; + private static float spoopColor = 0F; + + @SubscribeEvent + public static void fogColors(ViewportEvent.ComputeFogColor event) { + boolean flag = isSpooky(Minecraft.getInstance().level, Minecraft.getInstance().player); + if (flag || spoopColor > 0F) { + final float[] realColors = {event.getRed(), event.getGreen(), event.getBlue()}; + final float[] lerpColors = {130F / 255F, 115F / 255F, 145F / 255F}; + for (int i = 0; i < 3; i++) { + final float real = realColors[i]; + final float spoop = lerpColors[i]; + final boolean inverse = real > spoop; + spoopColors[i] = real == spoop ? spoop : Mth.clampedLerp(inverse ? spoop : real, inverse ? real : spoop, spoopColor); + } + float shift = (float) (0.01F * event.getPartialTick()); + if (flag) + spoopColor += shift; + else + spoopColor -= shift; + spoopColor = Mth.clamp(spoopColor, 0F, 1F); + event.setRed(spoopColors[0]); + event.setGreen(spoopColors[1]); + event.setBlue(spoopColors[2]); + } + } + + private static boolean SKY_CHUNK_LOADED = false; + + private static float SKY_FAR = 0.0F; + private static float SKY_NEAR = 0.0F; + + private static boolean TERRAIN_CHUNK_LOADED = false; + + private static float TERRAIN_FAR = 0.0F; + private static float TERRAIN_NEAR = 0.0F; + + + @SubscribeEvent + public static void renderFog(ViewportEvent.RenderFog event) { + if (event.getType().equals(FogType.NONE) && Minecraft.getInstance().cameraEntity instanceof LocalPlayer player && player.level instanceof ClientLevel clientLevel && clientLevel.effects() instanceof TwilightForestRenderInfo) { + if (event.getMode().equals(FogRenderer.FogMode.FOG_SKY)) { + if (SKY_CHUNK_LOADED) { + event.setCanceled(true); + boolean spooky = isSpooky(clientLevel, player); + + float far = spooky ? event.getFarPlaneDistance() * 0.5F : event.getFarPlaneDistance(); + float near = spooky ? 0.0F : event.getNearPlaneDistance(); + + SKY_FAR = Mth.lerp(0.003F, SKY_FAR, far); + SKY_NEAR = Mth.lerp(0.003F * (SKY_NEAR < near ? 0.5F : 2.0F), SKY_NEAR, near); + + event.setFarPlaneDistance(SKY_FAR); + event.setNearPlaneDistance(SKY_NEAR); + } else if (clientLevel.isLoaded(player.blockPosition())) { //We do a first-time set up after the chunk the player is in is loaded + SKY_CHUNK_LOADED = true; + SKY_FAR = isSpooky(clientLevel, player) ? event.getFarPlaneDistance() * 0.5F : event.getFarPlaneDistance(); + SKY_NEAR = isSpooky(clientLevel, player) ? 0.0F : event.getNearPlaneDistance(); + } + } else { + if (TERRAIN_CHUNK_LOADED) { + event.setCanceled(true); + boolean spooky = isSpooky(clientLevel, player); + + float far = spooky ? event.getFarPlaneDistance() * 0.5F : event.getFarPlaneDistance(); + float near = spooky ? far * 0.75F : event.getNearPlaneDistance(); + + TERRAIN_FAR = Mth.lerp(0.003F, TERRAIN_FAR, far); + TERRAIN_NEAR = Mth.lerp(0.003F * (TERRAIN_NEAR < near ? 0.5F : 2.0F), TERRAIN_NEAR, near); + + event.setFarPlaneDistance(TERRAIN_FAR); + event.setNearPlaneDistance(TERRAIN_NEAR); + } else if (SKY_CHUNK_LOADED || clientLevel.isLoaded(player.blockPosition())) { //SKY is always called first in vanilla, so we only need to check if the SKY flag is true, but just in case + TERRAIN_CHUNK_LOADED = true; + TERRAIN_FAR = isSpooky(clientLevel, player) ? event.getFarPlaneDistance() * 0.5F : event.getFarPlaneDistance(); + TERRAIN_NEAR = isSpooky(clientLevel, player) ? TERRAIN_FAR * 0.75F : event.getNearPlaneDistance(); + } + } + } + } + + @SubscribeEvent + public static void onUnload(LevelEvent.Unload event) { //As supernatural as the fog is, it shouldn't follow the player between worlds + SKY_CHUNK_LOADED = false; + TERRAIN_CHUNK_LOADED = false; + } + + private static boolean isSpooky(@Nullable ClientLevel level, @Nullable LocalPlayer player) { + return level != null && player != null && level.getBiome(player.blockPosition()).is(TFBiomes.SPOOKY_FOREST); + } +} diff --git a/src/main/java/twilightforest/client/GuiTFCinderFurnace.java b/src/main/java/twilightforest/client/GuiTFCinderFurnace.java deleted file mode 100644 index 7a297d6068..0000000000 --- a/src/main/java/twilightforest/client/GuiTFCinderFurnace.java +++ /dev/null @@ -1,61 +0,0 @@ -package twilightforest.client; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import net.minecraft.client.gui.inventory.GuiContainer; -import net.minecraft.client.resources.I18n; -import net.minecraft.entity.player.InventoryPlayer; -import net.minecraft.inventory.ContainerFurnace; -import net.minecraft.tileentity.TileEntityFurnace; -import net.minecraft.util.ResourceLocation; -import net.minecraft.world.World; - -import org.lwjgl.opengl.GL11; - -import twilightforest.inventory.ContainerTFCinderFurnace; -import twilightforest.tileentity.TileEntityTFCinderFurnace; - -@SideOnly(Side.CLIENT) -public class GuiTFCinderFurnace extends GuiContainer -{ - private static final ResourceLocation furnaceGuiTextures = new ResourceLocation("textures/gui/container/furnace.png"); - private TileEntityTFCinderFurnace tileFurnace; - - public GuiTFCinderFurnace(InventoryPlayer inventory, TileEntityTFCinderFurnace furnace) - { - super(new ContainerTFCinderFurnace(inventory, furnace)); - this.tileFurnace = furnace; - } - - public GuiTFCinderFurnace(InventoryPlayer inventory, World world, int x, - int y, int z) { - this(inventory, (TileEntityTFCinderFurnace)world.getTileEntity(x, y, z)); - } - - /** - * Draw the foreground layer for the GuiContainer (everything in front of the items) - */ - protected void drawGuiContainerForegroundLayer(int p_146979_1_, int p_146979_2_) - { - String s = this.tileFurnace.hasCustomInventoryName() ? this.tileFurnace.getInventoryName() : I18n.format(this.tileFurnace.getInventoryName(), new Object[0]); - this.fontRendererObj.drawString(s, this.xSize / 2 - this.fontRendererObj.getStringWidth(s) / 2, 6, 4210752); - this.fontRendererObj.drawString(I18n.format("container.inventory", new Object[0]), 8, this.ySize - 96 + 2, 4210752); - } - - protected void drawGuiContainerBackgroundLayer(float p_146976_1_, int p_146976_2_, int p_146976_3_) - { - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - this.mc.getTextureManager().bindTexture(furnaceGuiTextures); - int k = (this.width - this.xSize) / 2; - int l = (this.height - this.ySize) / 2; - this.drawTexturedModalRect(k, l, 0, 0, this.xSize, this.ySize); - - if (this.tileFurnace.isBurning()) - { - int i1 = this.tileFurnace.getBurnTimeRemainingScaled(13); - this.drawTexturedModalRect(k + 56, l + 36 + 12 - i1, 176, 12 - i1, 14, i1 + 1); - i1 = this.tileFurnace.getCookProgressScaled(24); - this.drawTexturedModalRect(k + 79, l + 34, 176, 14, i1 + 1, 16); - } - } -} \ No newline at end of file diff --git a/src/main/java/twilightforest/client/GuiTFGoblinCrafting.java b/src/main/java/twilightforest/client/GuiTFGoblinCrafting.java deleted file mode 100644 index add8f1443d..0000000000 --- a/src/main/java/twilightforest/client/GuiTFGoblinCrafting.java +++ /dev/null @@ -1,137 +0,0 @@ -package twilightforest.client; - - -import net.minecraft.client.gui.FontRenderer; -import net.minecraft.client.gui.Gui; -import net.minecraft.client.gui.inventory.GuiContainer; -import net.minecraft.client.renderer.RenderHelper; -import net.minecraft.entity.player.InventoryPlayer; -import net.minecraft.inventory.Slot; -import net.minecraft.item.ItemStack; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.StatCollector; -import net.minecraft.world.World; - -import org.lwjgl.opengl.GL11; - -import twilightforest.TwilightForestMod; -import twilightforest.inventory.ContainerTFUncrafting; - -public class GuiTFGoblinCrafting extends GuiContainer { - - private static final ResourceLocation textureLoc = new ResourceLocation(TwilightForestMod.GUI_DIR + "guigoblintinkering.png"); - - - public GuiTFGoblinCrafting(InventoryPlayer inventory, World world, int x, int y, int z) { - super(new ContainerTFUncrafting(inventory, world, x, y, z)); - } - - /** - * Draw the foreground layer for the GuiContainer (everythin in front of the items) - */ - @Override - protected void drawGuiContainerForegroundLayer(int var1, int var2) - { - this.fontRendererObj.drawString("Uncrafting Table", 8, 6, 4210752); - this.fontRendererObj.drawString(StatCollector.translateToLocal("container.inventory"), 8, this.ySize - 96 + 2, 4210752); - } - - - /** - * Draw the background layer for the GuiContainer (everything behind the items) - */ - @Override - protected void drawGuiContainerBackgroundLayer(float var1, int var2, int var3) { - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - this.mc.getTextureManager().bindTexture(textureLoc); - int frameX = (this.width - this.xSize) / 2; - int frameY = (this.height - this.ySize) / 2; - this.drawTexturedModalRect(frameX, frameY, 0, 0, this.xSize, this.ySize); - - ContainerTFUncrafting tfContainer = (ContainerTFUncrafting)this.inventorySlots; - - // show uncrafting ingredients as background - RenderHelper.enableGUIStandardItemLighting(); - GL11.glPushMatrix(); - GL11.glTranslatef((float)this.guiLeft, (float)this.guiTop, 0.0F); - - for (int i = 0; i < 9; i++) { - Slot uncrafting = tfContainer.getSlot(2 + i); - Slot assembly = tfContainer.getSlot(11 + i); - - if (uncrafting.getStack() != null) - { - drawSlotAsBackground(uncrafting, assembly); - } - } - GL11.glPopMatrix(); - - // show the costs if there are any - FontRenderer fontRendererObj = this.mc.fontRenderer; - RenderHelper.disableStandardItemLighting(); - - int costVal = tfContainer.getUncraftingCost(); - if (costVal > 0) { - if (this.mc.thePlayer.experienceLevel < costVal && !this.mc.thePlayer.capabilities.isCreativeMode) { - int color = 0xA00000; - String cost = "" + costVal; - fontRendererObj.drawStringWithShadow(cost, frameX + 48 - fontRendererObj.getStringWidth(cost), frameY + 38, color); - } - else { - int color = 0x80FF20; - String cost = "" + costVal; - fontRendererObj.drawStringWithShadow(cost, frameX + 48 - fontRendererObj.getStringWidth(cost), frameY + 38, color); - } - } - - costVal = tfContainer.getRecraftingCost(); - if (costVal > 0) { - if (this.mc.thePlayer.experienceLevel < costVal && !this.mc.thePlayer.capabilities.isCreativeMode) { - int color = 0xA00000; - String cost = "" + costVal; - fontRendererObj.drawStringWithShadow(cost, frameX + 130 - fontRendererObj.getStringWidth(cost), frameY + 38, color); - } - else { - int color = 0x80FF20; - String cost = "" + costVal; - fontRendererObj.drawStringWithShadow(cost, frameX + 130 - fontRendererObj.getStringWidth(cost), frameY + 38, color); - } - } - - } - - - - /** - * Draws an inventory slot - */ - private void drawSlotAsBackground(Slot backgroundSlot, Slot appearSlot) - { - int screenX = appearSlot.xDisplayPosition; - int screenY = appearSlot.yDisplayPosition; - ItemStack itemStackToRender = backgroundSlot.getStack(); - this.zLevel = 50.0F; - itemRender.zLevel = 50.0F; - - itemRender.renderItemIntoGUI(this.fontRendererObj, this.mc.renderEngine, itemStackToRender, screenX, screenY); - itemRender.renderItemOverlayIntoGUI(this.fontRendererObj, this.mc.renderEngine, itemStackToRender, screenX, screenY); - - boolean itemBroken = false; - - if (backgroundSlot.getHasStack() && backgroundSlot.getStack().stackSize == 0) { - itemBroken = true; - } - - - // draw 50% gray rectangle over the item - GL11.glDisable(GL11.GL_LIGHTING); - GL11.glDisable(GL11.GL_DEPTH_TEST); - Gui.drawRect(screenX, screenY, screenX + 16, screenY + 16, itemBroken ? 0x80FF8b8b : 0x9f8b8b8b); - GL11.glEnable(GL11.GL_LIGHTING); - GL11.glEnable(GL11.GL_DEPTH_TEST); - - - itemRender.zLevel = 0.0F; - this.zLevel = 0.0F; - } -} diff --git a/src/main/java/twilightforest/client/ISTER.java b/src/main/java/twilightforest/client/ISTER.java new file mode 100644 index 0000000000..c298afbda6 --- /dev/null +++ b/src/main/java/twilightforest/client/ISTER.java @@ -0,0 +1,173 @@ +package twilightforest.client; + +import com.mojang.authlib.GameProfile; +import com.mojang.blaze3d.platform.Lighting; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.math.Axis; +import net.minecraft.Util; +import net.minecraft.client.Minecraft; +import net.minecraft.client.model.SkullModelBase; +import net.minecraft.client.model.geom.ModelLayers; +import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.Sheets; +import net.minecraft.client.renderer.block.model.ItemTransforms; +import net.minecraft.client.renderer.entity.ItemRenderer; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.client.resources.model.BakedModel; +import net.minecraft.client.resources.model.Material; +import net.minecraft.client.resources.model.ModelResourceLocation; +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtUtils; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.packs.resources.ResourceManager; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.*; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.SkullBlockEntity; +import net.minecraftforge.client.model.data.ModelData; +import net.minecraftforge.registries.RegistryObject; +import org.apache.commons.lang3.StringUtils; +import twilightforest.TFConfig; +import twilightforest.TwilightForestMod; +import twilightforest.block.AbstractSkullCandleBlock; +import twilightforest.block.AbstractTrophyBlock; +import twilightforest.block.KeepsakeCasketBlock; +import twilightforest.block.TFChestBlock; +import twilightforest.block.entity.KeepsakeCasketBlockEntity; +import twilightforest.block.entity.TwilightChestEntity; +import twilightforest.client.model.TFModelLayers; +import twilightforest.client.model.entity.KnightmetalShieldModel; +import twilightforest.client.model.tileentity.GenericTrophyModel; +import twilightforest.client.renderer.tileentity.SkullCandleTileEntityRenderer; +import twilightforest.client.renderer.tileentity.TrophyTileEntityRenderer; +import twilightforest.enums.BossVariant; +import twilightforest.init.TFBlocks; +import twilightforest.item.KnightmetalShieldItem; + +import java.util.HashMap; +import java.util.Map; + +public class ISTER extends BlockEntityWithoutLevelRenderer { + private final KeepsakeCasketBlockEntity casket = new KeepsakeCasketBlockEntity(BlockPos.ZERO, TFBlocks.KEEPSAKE_CASKET.get().defaultBlockState()); + private final Map chestEntities = Util.make(new HashMap<>(), map -> { + makeInstance(map, TFBlocks.TWILIGHT_OAK_CHEST); + makeInstance(map, TFBlocks.CANOPY_CHEST); + makeInstance(map, TFBlocks.MANGROVE_CHEST); + makeInstance(map, TFBlocks.DARK_CHEST); + makeInstance(map, TFBlocks.TIME_CHEST); + makeInstance(map, TFBlocks.TRANSFORMATION_CHEST); + makeInstance(map, TFBlocks.MINING_CHEST); + makeInstance(map, TFBlocks.SORTING_CHEST); + }); + private KnightmetalShieldModel shield = new KnightmetalShieldModel(Minecraft.getInstance().getEntityModels().bakeLayer(TFModelLayers.KNIGHTMETAL_SHIELD)); + + public ISTER() { + super(Minecraft.getInstance().getBlockEntityRenderDispatcher(), Minecraft.getInstance().getEntityModels()); + } + + @Override + public void onResourceManagerReload(ResourceManager manager) { + this.shield = new KnightmetalShieldModel(Minecraft.getInstance().getEntityModels().bakeLayer(TFModelLayers.KNIGHTMETAL_SHIELD)); + } + + @Override + public void renderByItem(ItemStack stack, ItemDisplayContext camera, PoseStack ms, MultiBufferSource buffers, int light, int overlay) { + Item item = stack.getItem(); + if (item instanceof BlockItem blockItem) { + Block block = blockItem.getBlock(); + if (block instanceof AbstractTrophyBlock trophyBlock) { + BossVariant variant = trophyBlock.getVariant(); + GenericTrophyModel trophy = TrophyTileEntityRenderer.createTrophyRenderers(Minecraft.getInstance().getEntityModels()).get(variant); + + if (camera == ItemDisplayContext.GUI) { + ModelResourceLocation back = new ModelResourceLocation(TwilightForestMod.prefix(((AbstractTrophyBlock) block).getVariant().getTrophyType().getModelName()), "inventory"); + BakedModel modelBack = Minecraft.getInstance().getItemRenderer().getItemModelShaper().getModelManager().getModel(back); + + Lighting.setupForFlatItems(); + MultiBufferSource.BufferSource bufferSource = Minecraft.getInstance().renderBuffers().bufferSource(); + ms.pushPose(); + Lighting.setupForFlatItems(); + ms.translate(0.5F, 0.5F, -1.5F); + Minecraft.getInstance().getItemRenderer().render(TrophyTileEntityRenderer.stack, ItemDisplayContext.GUI, false, ms, bufferSource, 15728880, OverlayTexture.NO_OVERLAY, modelBack.applyTransform(camera, ms, false)); + ms.popPose(); + bufferSource.endBatch(); + Lighting.setupFor3DItems(); + + ms.pushPose(); + ms.translate(0.5F, 0.5F, 0.5F); + if (trophyBlock.getVariant() == BossVariant.HYDRA || trophyBlock.getVariant() == BossVariant.QUEST_RAM) + ms.scale(0.9F, 0.9F, 0.9F); + ms.mulPose(Axis.XP.rotationDegrees(30)); + ms.mulPose(Axis.YN.rotationDegrees(TFConfig.CLIENT_CONFIG.rotateTrophyHeadsGui.get() && !Minecraft.getInstance().isPaused() ? TFClientEvents.rotationTicker : -45)); + ms.translate(-0.5F, -0.5F, -0.5F); + ms.translate(0.0F, 0.25F, 0.0F); + if (trophyBlock.getVariant() == BossVariant.UR_GHAST) ms.translate(0.0F, 0.5F, 0.0F); + if (trophyBlock.getVariant() == BossVariant.ALPHA_YETI) ms.translate(0.0F, -0.15F, 0.0F); + TrophyTileEntityRenderer.render(null, 180.0F, trophy, variant, !Minecraft.getInstance().isPaused() ? TFClientEvents.time + Minecraft.getInstance().getDeltaFrameTime() : 0, ms, buffers, light, camera); + ms.popPose(); + + } else { + TrophyTileEntityRenderer.render(null, 180.0F, trophy, variant, !Minecraft.getInstance().isPaused() ? TFClientEvents.time + Minecraft.getInstance().getDeltaFrameTime() : 0, ms, buffers, light, camera); + } + } else if (block instanceof KeepsakeCasketBlock) { + Minecraft.getInstance().getBlockEntityRenderDispatcher().renderItem(this.casket, ms, buffers, light, overlay); + } else if (block instanceof TFChestBlock) { + Minecraft.getInstance().getBlockEntityRenderDispatcher().renderItem(this.chestEntities.get(block), ms, buffers, light, overlay); + } else if (block instanceof AbstractSkullCandleBlock candleBlock) { + GameProfile gameprofile = null; + if (stack.hasTag()) { + CompoundTag compoundtag = stack.getTag(); + if (compoundtag.contains("SkullOwner", 10)) { + gameprofile = NbtUtils.readGameProfile(compoundtag.getCompound("SkullOwner")); + } else if (compoundtag.contains("SkullOwner", 8) && !StringUtils.isBlank(compoundtag.getString("SkullOwner"))) { + gameprofile = new GameProfile(null, compoundtag.getString("SkullOwner")); + compoundtag.remove("SkullOwner"); + SkullBlockEntity.updateGameprofile(gameprofile, (p_172560_) -> + compoundtag.put("SkullOwner", NbtUtils.writeGameProfile(new CompoundTag(), p_172560_))); + } + } + + SkullBlock.Type type = candleBlock.getType(); + SkullModelBase base = SkullCandleTileEntityRenderer.createSkullRenderers(Minecraft.getInstance().getEntityModels()).get(type); + RenderType renderType = SkullCandleTileEntityRenderer.getRenderType(type, gameprofile); + SkullCandleTileEntityRenderer.renderSkull(null, 180.0F, 0.0F, ms, buffers, light, base, renderType); + + //we put the candle + ms.translate(0.0F, 0.5F, 0.0F); + CompoundTag tag = stack.getTagElement("BlockEntityTag"); + if (tag != null && tag.contains("CandleColor") && tag.contains("CandleAmount")) { + if (tag.getInt("CandleAmount") <= 0) tag.putInt("CandleAmount", 1); + Minecraft.getInstance().getBlockRenderer().renderSingleBlock( + AbstractSkullCandleBlock.candleColorToCandle(AbstractSkullCandleBlock.CandleColors.colorFromInt(tag.getInt("CandleColor")).getSerializedName()) + .defaultBlockState().setValue(CandleBlock.CANDLES, tag.getInt("CandleAmount")), ms, buffers, light, overlay, ModelData.EMPTY, RenderType.cutout()); + } + } else { + if (block instanceof EntityBlock be) { + BlockEntity blockEntity = be.newBlockEntity(BlockPos.ZERO, block.defaultBlockState()); + if (blockEntity != null) { + Minecraft.getInstance().getBlockEntityRenderDispatcher().getRenderer(blockEntity).render(null, 0, ms, buffers, light, overlay); + } + } + } + } else if (item instanceof KnightmetalShieldItem) { + ms.pushPose(); + ms.scale(1.0F, -1.0F, -1.0F); + Material material = new Material(Sheets.SHIELD_SHEET, new ResourceLocation(TwilightForestMod.ID, "model/knightmetal_shield")); + VertexConsumer vertexconsumer = material.sprite().wrap(ItemRenderer.getFoilBufferDirect(buffers, this.shield.renderType(material.atlasLocation()), true, stack.hasFoil())); + this.shield.renderToBuffer(ms, vertexconsumer, light, overlay, 1.0F, 1.0F, 1.0F, 1.0F); + ms.popPose(); + } + } + + public static void makeInstance(Map map, RegistryObject registryObject) { + ChestBlock block = registryObject.get(); + map.put(block, new TwilightChestEntity(BlockPos.ZERO, block.defaultBlockState())); + } +} diff --git a/src/main/java/twilightforest/client/LockedBiomeListener.java b/src/main/java/twilightforest/client/LockedBiomeListener.java new file mode 100644 index 0000000000..f76978b6e9 --- /dev/null +++ b/src/main/java/twilightforest/client/LockedBiomeListener.java @@ -0,0 +1,72 @@ +package twilightforest.client; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.core.registries.Registries; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.event.TickEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; +import twilightforest.TFConfig; +import twilightforest.TwilightForestMod; +import twilightforest.init.TFBiomes; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFItems; +import twilightforest.util.LandmarkUtil; +import twilightforest.world.registration.TFGenerationSettings; + +@Mod.EventBusSubscriber(value = Dist.CLIENT, bus = Mod.EventBusSubscriber.Bus.FORGE, modid = TwilightForestMod.ID) +public class LockedBiomeListener { + + private static boolean shownToast = false; + private static int timeUntilToast = 60; + + @SubscribeEvent + public static void clientTick(TickEvent.ClientTickEvent event) { + Player player = Minecraft.getInstance().player; + if (player == null || !(player.level instanceof ClientLevel world)) + return; + + //attempt to send a biome locked toast if our player is in a locked biome, only every 5 ticks + if(world.isClientSide && event.phase == TickEvent.Phase.END && player.tickCount % 5 == 0 + && LandmarkUtil.isProgressionEnforced(world) + && !player.isCreative() && !player.isSpectator() && !TFConfig.CLIENT_CONFIG.disableLockedBiomeToasts.get()) { + if (!TFGenerationSettings.isBiomeSafeFor(world.getBiome(player.blockPosition()).value(), player)) { + timeUntilToast--; + ItemStack item; + if (world.getBiome(player.blockPosition()).value().equals(world.registryAccess().registryOrThrow(Registries.BIOME).get(TFBiomes.DARK_FOREST))) { + item = new ItemStack(TFBlocks.LICH_TOWER_MINIATURE_STRUCTURE.get()); + } else if (world.getBiome(player.blockPosition()).value().equals(world.registryAccess().registryOrThrow(Registries.BIOME).get(TFBiomes.DARK_FOREST_CENTER))) { + item = new ItemStack(TFBlocks.KNIGHT_PHANTOM_TROPHY.get().asItem()); + } else if (world.getBiome(player.blockPosition()).value().equals(world.registryAccess().registryOrThrow(Registries.BIOME).get(TFBiomes.SNOWY_FOREST))) { + item = new ItemStack(TFBlocks.LICH_TOWER_MINIATURE_STRUCTURE.get()); + } else if (world.getBiome(player.blockPosition()).value().equals(world.registryAccess().registryOrThrow(Registries.BIOME).get(TFBiomes.GLACIER))) { + item = new ItemStack(TFItems.ALPHA_YETI_FUR.get()); + } else if (world.getBiome(player.blockPosition()).value().equals(world.registryAccess().registryOrThrow(Registries.BIOME).get(TFBiomes.SWAMP))) { + item = new ItemStack(TFBlocks.LICH_TOWER_MINIATURE_STRUCTURE.get()); + } else if (world.getBiome(player.blockPosition()).value().equals(world.registryAccess().registryOrThrow(Registries.BIOME).get(TFBiomes.FIRE_SWAMP))) { + item = new ItemStack(TFItems.MEEF_STROGANOFF.get()); + } else if (world.getBiome(player.blockPosition()).value().equals(world.registryAccess().registryOrThrow(Registries.BIOME).get(TFBiomes.HIGHLANDS))) { + item = new ItemStack(TFBlocks.UBEROUS_SOIL.get()); + } else if (world.getBiome(player.blockPosition()).value().equals(world.registryAccess().registryOrThrow(Registries.BIOME).get(TFBiomes.THORNLANDS))) { + item = new ItemStack(TFItems.LAMP_OF_CINDERS.get()); + } else if (world.getBiome(player.blockPosition()).value().equals(world.registryAccess().registryOrThrow(Registries.BIOME).get(TFBiomes.FINAL_PLATEAU))) { + item = new ItemStack(TFItems.LAMP_OF_CINDERS.get()); + } else { + item = new ItemStack(TFBlocks.TWILIGHT_PORTAL_MINIATURE_STRUCTURE.get()); + } + if(!shownToast && timeUntilToast <= 0) { + Minecraft.getInstance().getToasts().addToast(new LockedBiomeToast(item)); + shownToast = true; + } + } else { + if(shownToast) { + timeUntilToast = 60; + shownToast = false; + } + } + } + } +} diff --git a/src/main/java/twilightforest/client/LockedBiomeToast.java b/src/main/java/twilightforest/client/LockedBiomeToast.java new file mode 100644 index 0000000000..60d3863e04 --- /dev/null +++ b/src/main/java/twilightforest/client/LockedBiomeToast.java @@ -0,0 +1,24 @@ +package twilightforest.client; + +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.gui.GuiComponent; +import net.minecraft.client.gui.components.toasts.Toast; +import net.minecraft.client.gui.components.toasts.ToastComponent; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.ItemStack; + +public record LockedBiomeToast(ItemStack item) implements Toast { + + @Override + public Visibility render(PoseStack stack, ToastComponent component, long timer) { + RenderSystem.setShaderTexture(0, TEXTURE); + RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); + GuiComponent.blit(stack, 0, 0, 0, 0, this.width(), this.height()); + component.getMinecraft().getItemRenderer().renderGuiItem(stack, this.item(), 6, 8); + component.getMinecraft().font.draw(stack, Component.translatable("misc.twilightforest.biome_locked"), 25.0F, 7.0F, -256); + component.getMinecraft().font.draw(stack, Component.translatable("misc.twilightforest.biome_locked_2"), 25.0F, 18.0F, 16777215); + + return timer >= 10000L ? Toast.Visibility.HIDE : Toast.Visibility.SHOW; + } +} diff --git a/src/main/java/twilightforest/client/MissingAdvancementToast.java b/src/main/java/twilightforest/client/MissingAdvancementToast.java new file mode 100644 index 0000000000..878111ab98 --- /dev/null +++ b/src/main/java/twilightforest/client/MissingAdvancementToast.java @@ -0,0 +1,28 @@ +package twilightforest.client; + +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.gui.GuiComponent; +import net.minecraft.client.gui.components.toasts.Toast; +import net.minecraft.client.gui.components.toasts.ToastComponent; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.ItemStack; +import twilightforest.init.TFBlocks; + +public record MissingAdvancementToast(Component title, ItemStack icon) implements Toast { + public static final MissingAdvancementToast FALLBACK = new MissingAdvancementToast(Component.translatable("misc.twilightforest.advancement_hidden"), new ItemStack(TFBlocks.TWILIGHT_PORTAL_MINIATURE_STRUCTURE.get())); + private static final Component UPPER_TEXT = Component.translatable("misc.twilightforest.advancement_required"); + + @Override + public Toast.Visibility render(PoseStack stack, ToastComponent component, long timer) { + RenderSystem.setShaderTexture(0, TEXTURE); + RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); + GuiComponent.blit(stack, 0, 0, 0, 0, this.width(), this.height()); + component.getMinecraft().getItemRenderer().renderGuiItem(stack, this.icon(), 6, 8); + component.getMinecraft().font.draw(stack, UPPER_TEXT, 25.0F, 7.0F, 0xffffffff); + component.getMinecraft().font.draw(stack, this.title(), 25.0F, 18.0F, 0xffffff); + + // 10 seconds as millis + return timer >= 10000L ? Toast.Visibility.HIDE : Toast.Visibility.SHOW; + } +} diff --git a/src/main/java/twilightforest/client/MovingCicadaSoundInstance.java b/src/main/java/twilightforest/client/MovingCicadaSoundInstance.java new file mode 100644 index 0000000000..f73cf5c1e6 --- /dev/null +++ b/src/main/java/twilightforest/client/MovingCicadaSoundInstance.java @@ -0,0 +1,50 @@ +package twilightforest.client; + +import net.minecraft.client.resources.sounds.AbstractTickableSoundInstance; +import net.minecraft.client.resources.sounds.SoundInstance; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraftforge.fml.ModList; +import twilightforest.TFConfig; +import twilightforest.compat.curios.CuriosCompat; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFSounds; + +public class MovingCicadaSoundInstance extends AbstractTickableSoundInstance { + + protected final LivingEntity wearer; + + public MovingCicadaSoundInstance(LivingEntity entity) { + super(TFSounds.CICADA.get(), SoundSource.NEUTRAL, SoundInstance.createUnseededRandom()); + this.wearer = entity; + this.x = entity.getX(); + this.y = entity.getY(); + this.z = entity.getZ(); + this.looping = true; + this.delay = entity.getRandom().nextInt(100) + 100; + } + + @Override + public void tick() { + if (!this.wearer.isRemoved() && (this.wearer.getItemBySlot(EquipmentSlot.HEAD).is(TFBlocks.CICADA.get().asItem()) || this.isWearingCicadaCurio())) { + this.x = (float)this.wearer.getX(); + this.y = (float)this.wearer.getY(); + this.z = (float)this.wearer.getZ(); + } else { + this.stop(); + } + } + + private boolean isWearingCicadaCurio() { + if (ModList.get().isLoaded("curios")) { + return CuriosCompat.isCicadaEquipped(this.wearer); + } + return false; + } + + @Override + public boolean canPlaySound() { + return !TFConfig.CLIENT_CONFIG.silentCicadas.get() && !TFConfig.CLIENT_CONFIG.silentCicadasOnHead.get(); + } +} diff --git a/src/main/java/twilightforest/client/OptifineWarningScreen.java b/src/main/java/twilightforest/client/OptifineWarningScreen.java new file mode 100644 index 0000000000..e62806bbd1 --- /dev/null +++ b/src/main/java/twilightforest/client/OptifineWarningScreen.java @@ -0,0 +1,92 @@ +package twilightforest.client; + +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.ChatFormatting; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.components.Button; +import net.minecraft.client.gui.components.MultiLineLabel; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.network.chat.*; +import org.jetbrains.annotations.Nullable; +import twilightforest.TwilightForestMod; + +public class OptifineWarningScreen extends Screen { + + private final Screen lastScreen; + private int ticksUntilEnable = 20 * 10; + private MultiLineLabel message = MultiLineLabel.EMPTY; + private MultiLineLabel suggestions = MultiLineLabel.EMPTY; + private static final Component text = Component.translatable("gui.twilightforest.optifine.message"); + private static final MutableComponent url = Component.translatable("gui.twilightforest.optifine.suggestions").withStyle(style -> style.withColor(ChatFormatting.GREEN).applyFormat(ChatFormatting.UNDERLINE).withClickEvent(new ClickEvent(ClickEvent.Action.OPEN_URL, "https://github.com/NordicGamerFE/usefulmods"))); + private Button exitButton; + + protected OptifineWarningScreen(Screen screen) { + super(Component.translatable("gui.twilightforest.optifine.title")); + this.lastScreen = screen; + } + + @Override + public Component getNarrationMessage() { + return CommonComponents.joinForNarration(super.getNarrationMessage(), text); + } + + @Override + protected void init() { + super.init(); + this.exitButton = this.addRenderableWidget(Button.builder(CommonComponents.GUI_PROCEED, (pressed) -> Minecraft.getInstance().setScreen(this.lastScreen)).bounds(this.width / 2 - 75, this.height * 3 / 4, 150, 20).build()); + this.exitButton.active = false; + + this.message = MultiLineLabel.create(this.font, text, this.width - 50); + this.suggestions = MultiLineLabel.create(this.font, url, this.width - 50); + } + + @Override + public void render(PoseStack matrixStack, int mouseX, int mouseY, float partialTicks) { + this.renderBackground(matrixStack); + drawCenteredString(matrixStack, this.font, this.title, this.width / 2, 30, 16777215); + this.message.renderCentered(matrixStack, this.width / 2, 70); + this.suggestions.renderCentered(matrixStack, this.width / 2, 160); + super.render(matrixStack, mouseX, mouseY, partialTicks); + + this.exitButton.render(matrixStack, mouseX, mouseY, partialTicks); + } + + @Override + public void tick() { + super.tick(); + if (--this.ticksUntilEnable <= 0) { + this.exitButton.active = true; + } + } + + @Override + public boolean shouldCloseOnEsc() { + return this.ticksUntilEnable <= 0; + } + + @Override + public void onClose() { + Minecraft.getInstance().setScreen(this.lastScreen); + } + + @Override + public boolean mouseClicked(double pMouseX, double pMouseY, int pButton) { + if (pMouseY > 160 && pMouseY < 170) { + Style style = this.getClickedComponentStyleAt((int) pMouseX); + if (style != null && style.getClickEvent() != null && style.getClickEvent().getAction() == ClickEvent.Action.OPEN_URL) { + this.handleComponentClicked(style); + return false; + } + } + + return super.mouseClicked(pMouseX, pMouseY, pButton); + } + + @Nullable + private Style getClickedComponentStyleAt(int xPos) { + int wid = Minecraft.getInstance().font.width(url); + int left = this.width / 2 - wid / 2; + int right = this.width / 2 + wid / 2; + return xPos >= left && xPos <= right ? Minecraft.getInstance().font.getSplitter().componentStyleAtWidth(url, xPos - left) : null; + } +} diff --git a/src/main/java/twilightforest/client/TFClientEvents.java b/src/main/java/twilightforest/client/TFClientEvents.java index 747bb64760..70a6d8b17b 100644 --- a/src/main/java/twilightforest/client/TFClientEvents.java +++ b/src/main/java/twilightforest/client/TFClientEvents.java @@ -1,107 +1,311 @@ package twilightforest.client; -import java.util.Random; - +import net.minecraft.ChatFormatting; +import net.minecraft.client.CameraType; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.OpenGlHelper; -import net.minecraft.client.renderer.RenderBlocks; -import net.minecraft.client.renderer.Tessellator; -import net.minecraft.client.renderer.entity.RenderManager; -import net.minecraft.client.renderer.entity.RendererLivingEntity; -import net.minecraft.client.renderer.texture.TextureMap; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.init.Blocks; -import net.minecraft.potion.Potion; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.client.event.FOVUpdateEvent; -import net.minecraftforge.client.event.RenderGameOverlayEvent; -import net.minecraftforge.client.event.RenderGameOverlayEvent.ElementType; -import net.minecraftforge.client.event.RenderLivingEvent; - -import org.lwjgl.opengl.GL11; - +import net.minecraft.client.Options; +import net.minecraft.client.gui.screens.advancements.AdvancementsScreen; +import net.minecraft.client.model.HeadedModel; +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.renderer.DimensionSpecialEffects; +import net.minecraft.client.renderer.entity.EntityRenderer; +import net.minecraft.client.renderer.entity.LivingEntityRenderer; +import net.minecraft.client.resources.model.BakedModel; +import net.minecraft.client.resources.model.ModelResourceLocation; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.network.chat.Style; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.WrittenBookItem; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.chunk.ChunkStatus; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.client.DimensionSpecialEffectsManager; +import net.minecraftforge.client.event.*; +import net.minecraftforge.client.gui.overlay.VanillaGuiOverlay; +import net.minecraftforge.event.TickEvent; +import net.minecraftforge.event.entity.player.ItemTooltipEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.ModList; +import net.minecraftforge.fml.common.Mod; +import twilightforest.TFConfig; import twilightforest.TwilightForestMod; -import twilightforest.item.ItemTFBowBase; -import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import twilightforest.block.entity.GrowingBeanstalkBlockEntity; +import twilightforest.client.model.block.doors.CastleDoorModelLoader; +import twilightforest.client.model.block.giantblock.GiantBlockModelLoader; +import twilightforest.client.model.block.leaves.BakedLeavesModel; +import twilightforest.client.model.block.patch.PatchModelLoader; +import twilightforest.client.renderer.TFSkyRenderer; +import twilightforest.client.renderer.TFWeatherRenderer; +import twilightforest.client.renderer.entity.ShieldLayer; +import twilightforest.compat.curios.CuriosCompat; +import twilightforest.data.tags.ItemTagGenerator; +import twilightforest.events.HostileMountEvents; +import twilightforest.init.TFItems; +import twilightforest.item.*; +import twilightforest.world.registration.TFGenerationSettings; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@OnlyIn(Dist.CLIENT) +@Mod.EventBusSubscriber(modid = TwilightForestMod.ID, value = Dist.CLIENT) public class TFClientEvents { - private Random random; - - public TFClientEvents() { - this.random = new Random(); - } + @Mod.EventBusSubscriber(modid = TwilightForestMod.ID, value = Dist.CLIENT, bus = Mod.EventBusSubscriber.Bus.MOD) + public static class ModBusEvents { + @SubscribeEvent + public static void registerLoaders(ModelEvent.RegisterGeometryLoaders event) { + event.register("patch", PatchModelLoader.INSTANCE); + event.register("giant_block", GiantBlockModelLoader.INSTANCE); + event.register("castle_door", CastleDoorModelLoader.INSTANCE); + } + + @SubscribeEvent + public static void modelBake(ModelEvent.ModifyBakingResult event) { + TFItems.addItemModelProperties(); + + List> models = event.getModels().entrySet().stream() + .filter(entry -> entry.getKey().getNamespace().equals(TwilightForestMod.ID) && entry.getKey().getPath().contains("leaves") && !entry.getKey().getPath().contains("dark")).collect(Collectors.toList()); + + models.forEach(entry -> event.getModels().put(entry.getKey(), new BakedLeavesModel(entry.getValue()))); + } + + @SubscribeEvent + public static void registerModels(ModelEvent.RegisterAdditional event) { + event.register(ShieldLayer.LOC); + event.register(new ModelResourceLocation(TwilightForestMod.prefix("trophy"), "inventory")); + event.register(new ModelResourceLocation(TwilightForestMod.prefix("trophy_minor"), "inventory")); + event.register(new ModelResourceLocation(TwilightForestMod.prefix("trophy_quest"), "inventory")); + + event.register(TwilightForestMod.prefix("block/casket_obsidian")); + event.register(TwilightForestMod.prefix("block/casket_stone")); + event.register(TwilightForestMod.prefix("block/casket_basalt")); + } + @SubscribeEvent + public static void registerDimEffects(RegisterDimensionSpecialEffectsEvent event) { + new TFSkyRenderer(); + new TFWeatherRenderer(); + event.register(TwilightForestMod.prefix("renderer"), new TwilightForestRenderInfo(128.0F, false, DimensionSpecialEffects.SkyType.NONE, false, false)); + } + } - /** - * Do ice effect on slowed monsters + /** + * Stop the game from rendering the mount health for unfriendly creatures */ @SubscribeEvent - public void renderLivingPost(RenderLivingEvent.Post event) { - if (event.entity.getDataWatcher().getWatchableObjectInt(7) == Potion.potionTypes[Potion.moveSlowdown.getId()].getLiquidColor() && event.entity.getDataWatcher().getWatchableObjectByte(8) > 0) { - - - //System.out.println("Rendering slowed entity"); - this.renderIcedEntity(event.entity, event.renderer, event.x, event.y, event.z); + public static void preOverlay(RenderGuiOverlayEvent.Pre event) { + if (event.getOverlay().id() == VanillaGuiOverlay.MOUNT_HEALTH.id()) { + if (HostileMountEvents.isRidingUnfriendly(Minecraft.getInstance().player)) { + event.setCanceled(true); + } } + } + /** + * Render effects in first-person perspective + */ + @SubscribeEvent + public static void renderWorldLast(RenderLevelStageEvent event) { + if (event.getStage() == RenderLevelStageEvent.Stage.AFTER_PARTICLES) { // after particles says its best for special rendering effects, and thats what I consider this + if (!TFConfig.CLIENT_CONFIG.firstPersonEffects.get()) return; + + Options settings = Minecraft.getInstance().options; + if (settings.getCameraType() != CameraType.FIRST_PERSON || settings.hideGui) return; + + Entity entity = Minecraft.getInstance().getCameraEntity(); + if (entity instanceof LivingEntity) { + EntityRenderer renderer = Minecraft.getInstance().getEntityRenderDispatcher().getRenderer(entity); + if (renderer instanceof LivingEntityRenderer) { + for (EffectRenders effect : EffectRenders.VALUES) { + if (effect.shouldRender((LivingEntity) entity, true)) { + effect.render((LivingEntity) entity, ((LivingEntityRenderer) renderer).getModel(), 0.0, 0.0, 0.0, event.getPartialTick(), true); + } + } + } + } + } } - /** - * Alter FOV for our bows + /** + * On the tick, we kill the vignette */ @SubscribeEvent - public void fovUpdate(FOVUpdateEvent event) { - if (event.entity.isUsingItem() && (event.entity.getItemInUse().getItem() instanceof ItemTFBowBase)) - { - int i = event.entity.getItemInUseDuration(); - float f1 = (float)i / 20.0F; - - if (f1 > 1.0F) - { - f1 = 1.0F; - } - else - { - f1 *= f1; - } - - event.newfov *= 1.0F - f1 * 0.15F; - } + public static void renderTick(TickEvent.RenderTickEvent event) { + if (event.phase == TickEvent.Phase.START) { + Minecraft minecraft = Minecraft.getInstance(); + + // only fire if we're in the twilight forest + if (minecraft.level != null && TFGenerationSettings.DIMENSION_KEY.equals(minecraft.level.dimension())) { + // vignette + if (minecraft.gui != null) { + minecraft.gui.vignetteBrightness = 0.0F; + } + } + + if (minecraft.player != null && HostileMountEvents.isRidingUnfriendly(minecraft.player)) { + if (minecraft.gui != null) { + minecraft.gui.setOverlayMessage(Component.empty(), false); + } + } + } + } + + public static int time = 0; + private static int rotationTickerI = 0; + private static int sineTickerI = 0; + public static float rotationTicker = 0; + public static float sineTicker = 0; + public static final float PI = (float) Math.PI; + private static final int SINE_TICKER_BOUND = (int) ((PI * 200.0F) - 1.0F); + private static float intensity = 0.0F; + + @SubscribeEvent + public static void clientTick(TickEvent.ClientTickEvent event) { + if (event.phase != TickEvent.Phase.END) return; + Minecraft mc = Minecraft.getInstance(); + float partial = mc.getFrameTime(); + + if (!mc.isPaused()) { + time++; + + rotationTickerI = (rotationTickerI >= 359 ? 0 : rotationTickerI + 1); + sineTickerI = (sineTickerI >= SINE_TICKER_BOUND ? 0 : sineTickerI + 1); + + rotationTicker = rotationTickerI + partial; + sineTicker = sineTicker + partial; + } + + if (!mc.isPaused()) { + BugModelAnimationHelper.animate(); + DimensionSpecialEffects info = DimensionSpecialEffectsManager.getForType(TwilightForestMod.prefix("renderer")); + + // add weather box if needed + if (mc.level != null && info instanceof TwilightForestRenderInfo) { + TFWeatherRenderer.tick(); + } + + if (TFConfig.CLIENT_CONFIG.firstPersonEffects.get() && mc.level != null && mc.player != null) { + HashSet chunksInRange = new HashSet<>(); + for (int x = -16; x <= 16; x += 16) { + for (int z = -16; z <= 16; z += 16) { + chunksInRange.add(new ChunkPos((int) (mc.player.getX() + x) >> 4, (int) (mc.player.getZ() + z) >> 4)); + } + } + for (ChunkPos pos : chunksInRange) { + if (mc.level.getChunk(pos.x, pos.z, ChunkStatus.FULL, false) != null) { + List beanstalksInChunk = mc.level.getChunk(pos.x, pos.z).getBlockEntities().values().stream() + .filter(blockEntity -> blockEntity instanceof GrowingBeanstalkBlockEntity beanstalkBlock && beanstalkBlock.isBeanstalkRumbling()) + .collect(Collectors.toList()); + if (!beanstalksInChunk.isEmpty()) { + BlockEntity beanstalk = beanstalksInChunk.get(0); + Player player = mc.player; + intensity = (float) (1.0F - mc.player.distanceToSqr(Vec3.atCenterOf(beanstalk.getBlockPos())) / Math.pow(16, 2)); + if (intensity > 0) { + player.moveTo(player.getX(), player.getY(), player.getZ(), + player.getYRot() + (player.getRandom().nextFloat() * 2.0F - 1.0F) * intensity, + player.getXRot() + (player.getRandom().nextFloat() * 2.0F - 1.0F) * intensity); + intensity = 0.0F; + break; + } + } + } + } + } + } + } + + @SubscribeEvent + public static void camera(ViewportEvent.ComputeCameraAngles event) { + if (TFConfig.CLIENT_CONFIG.firstPersonEffects.get() && !Minecraft.getInstance().isPaused() && intensity > 0 && Minecraft.getInstance().player != null) { + event.setYaw((float) Mth.lerp(event.getPartialTick(), event.getYaw(), event.getYaw() + (Minecraft.getInstance().player.getRandom().nextFloat() * 2F - 1F) * intensity)); + event.setPitch((float) Mth.lerp(event.getPartialTick(), event.getPitch(), event.getPitch() + (Minecraft.getInstance().player.getRandom().nextFloat() * 2F - 1F) * intensity)); + event.setRoll((float) Mth.lerp(event.getPartialTick(), event.getRoll(), event.getRoll() + (Minecraft.getInstance().player.getRandom().nextFloat() * 2F - 1F) * intensity)); + intensity = 0F; + } + } + + private static final MutableComponent WIP_TEXT_0 = Component.translatable("misc.twilightforest.wip0").setStyle(Style.EMPTY.withColor(ChatFormatting.RED)); + private static final MutableComponent WIP_TEXT_1 = Component.translatable("misc.twilightforest.wip1").setStyle(Style.EMPTY.withColor(ChatFormatting.RED)); + private static final MutableComponent NYI_TEXT = Component.translatable("misc.twilightforest.nyi").setStyle(Style.EMPTY.withColor(ChatFormatting.RED)); + + @SubscribeEvent + public static void tooltipEvent(ItemTooltipEvent event) { + ItemStack item = event.getItemStack(); + + if (!item.is(ItemTagGenerator.WIP) && !item.is(ItemTagGenerator.NYI)) return; + + if (item.is(ItemTagGenerator.WIP)) { + event.getToolTip().add(WIP_TEXT_0); + event.getToolTip().add(WIP_TEXT_1); + } else { + event.getToolTip().add(NYI_TEXT); + } } /** - * Render an entity with the ice effect. - * This just displays a bunch of ice cubes around on their model + * Zooms in the FOV while using a bow, just like vanilla does in the AbstractClientPlayer's getFieldOfViewModifier() method (1.18.2) */ - private void renderIcedEntity(EntityLivingBase entity, RendererLivingEntity renderer, double x, double y, double z) { - GL11.glEnable(GL11.GL_BLEND); - GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - - RenderManager.instance.renderEngine.bindTexture(TextureMap.locationBlocksTexture); - - this.random.setSeed(entity.getEntityId() * entity.getEntityId() * 3121 + entity.getEntityId() * 45238971); - - // number of cubes - int numCubes = (int) (entity.height / 0.4F); - - // make cubes - for (int i = 0; i < numCubes; i++) { - GL11.glPushMatrix(); - float dx = (float)(x + random.nextGaussian() * 0.2F * entity.width); - float dy = (float)(y + random.nextGaussian() * 0.2F * entity.height) + entity.height / 2F; - float dz = (float)(z + random.nextGaussian() * 0.2F * entity.width); - GL11.glTranslatef(dx, dy, dz); - GL11.glScalef(0.5F, 0.5F, 0.5F); - GL11.glRotatef(random.nextFloat() * 360F, 1.0F, 0.0F, 0.0F); - GL11.glRotatef(random.nextFloat() * 360F, 0.0F, 1.0F, 0.0F); - GL11.glRotatef(random.nextFloat() * 360F, 0.0F, 0.0F, 1.0F); - - RenderBlocks.getInstance().renderBlockAsItem(Blocks.ice, 0, 1.0F); - GL11.glPopMatrix(); + @SubscribeEvent + public static void FOVUpdate(ComputeFovModifierEvent event) { + Player player = event.getPlayer(); + if (player.isUsingItem()) { + Item useItem = player.getUseItem().getItem(); + if (useItem instanceof TripleBowItem || useItem instanceof EnderBowItem || useItem instanceof IceBowItem || useItem instanceof SeekerBowItem) { + float f = player.getTicksUsingItem() / 20.0F; + f = f > 1.0F ? 1.0F : f * f; + event.setNewFovModifier(event.getFovModifier() * (1.0F - f * 0.15F)); + } } + } + + @SubscribeEvent + public static void unrenderHeadWithTrophies(RenderLivingEvent event) { + ItemStack stack = event.getEntity().getItemBySlot(EquipmentSlot.HEAD); + boolean visible = !(stack.getItem() instanceof TrophyItem) && !(stack.getItem() instanceof SkullCandleItem) && !areCuriosEquipped(event.getEntity()); - GL11.glDisable(GL11.GL_BLEND); + if (!visible && event.getRenderer().getModel() instanceof HeadedModel headedModel) { + headedModel.getHead().visible = false; + if (event.getRenderer().getModel() instanceof HumanoidModel humanoidModel) { + humanoidModel.hat.visible = false; + } + } + } + + private static boolean areCuriosEquipped(LivingEntity entity) { + if (ModList.get().isLoaded("curios")) { + return CuriosCompat.isTrophyCurioEquipped(entity) || CuriosCompat.isSkullCurioEquipped(entity); + } + return false; + } + + @SubscribeEvent + public static void translateBookAuthor(ItemTooltipEvent event) { + ItemStack stack = event.getItemStack(); + if (stack.getItem() instanceof WrittenBookItem && stack.hasTag()) { + CompoundTag tag = stack.getOrCreateTag(); + if (tag.contains(TwilightForestMod.ID + ":book")) { + List components = event.getToolTip(); + for (Component component : components) { + if (component.toString().contains("book.byAuthor")) { + components.set(components.indexOf(component), (Component.translatable("book.byAuthor", Component.translatable(TwilightForestMod.ID + ".book.author"))).withStyle(component.getStyle())); + } + } + } + } } - } diff --git a/src/main/java/twilightforest/client/TFClientProxy.java b/src/main/java/twilightforest/client/TFClientProxy.java deleted file mode 100644 index 8b13ea5b7a..0000000000 --- a/src/main/java/twilightforest/client/TFClientProxy.java +++ /dev/null @@ -1,625 +0,0 @@ -package twilightforest.client; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.model.ModelBiped; -import net.minecraft.client.model.ModelPig; -import net.minecraft.client.model.ModelSilverfish; -import net.minecraft.client.model.ModelSlime; -import net.minecraft.client.model.ModelWolf; -import net.minecraft.client.particle.EntityFX; -import net.minecraft.client.particle.EntitySmokeFX; -import net.minecraft.client.renderer.entity.RenderSnowball; -import net.minecraft.init.Items; -import net.minecraft.item.Item; -import net.minecraft.world.World; -import net.minecraftforge.client.MinecraftForgeClient; -import net.minecraftforge.common.MinecraftForge; -import twilightforest.TFCommonProxy; -import twilightforest.TFGenericPacketHandler; -import twilightforest.TwilightForestMod; -import twilightforest.block.TFBlocks; -import twilightforest.client.model.ModelTFAdherent; -import twilightforest.client.model.ModelTFArcticArmor; -import twilightforest.client.model.ModelTFBighorn; -import twilightforest.client.model.ModelTFBighornFur; -import twilightforest.client.model.ModelTFBlockGoblin; -import twilightforest.client.model.ModelTFBoar; -import twilightforest.client.model.ModelTFBunny; -import twilightforest.client.model.ModelTFDeathTome; -import twilightforest.client.model.ModelTFDeer; -import twilightforest.client.model.ModelTFFieryArmor; -import twilightforest.client.model.ModelTFFireBeetle; -import twilightforest.client.model.ModelTFGhast; -import twilightforest.client.model.ModelTFGoblinChain; -import twilightforest.client.model.ModelTFGoblinKnightLower; -import twilightforest.client.model.ModelTFGoblinKnightUpper; -import twilightforest.client.model.ModelTFHelmetCrab; -import twilightforest.client.model.ModelTFHydra; -import twilightforest.client.model.ModelTFHydraHead; -import twilightforest.client.model.ModelTFHydraNeck; -import twilightforest.client.model.ModelTFKnightPhantom2; -import twilightforest.client.model.ModelTFKnightlyArmor; -import twilightforest.client.model.ModelTFKobold; -import twilightforest.client.model.ModelTFLich; -import twilightforest.client.model.ModelTFLichMinion; -import twilightforest.client.model.ModelTFLoyalZombie; -import twilightforest.client.model.ModelTFMinoshroom; -import twilightforest.client.model.ModelTFMinotaur; -import twilightforest.client.model.ModelTFMosquitoSwarm; -import twilightforest.client.model.ModelTFNaga; -import twilightforest.client.model.ModelTFPenguin; -import twilightforest.client.model.ModelTFPhantomArmor; -import twilightforest.client.model.ModelTFPinchBeetle; -import twilightforest.client.model.ModelTFRaven; -import twilightforest.client.model.ModelTFRedcap; -import twilightforest.client.model.ModelTFSkeletonDruid; -import twilightforest.client.model.ModelTFSlimeBeetle; -import twilightforest.client.model.ModelTFSpikeBlock; -import twilightforest.client.model.ModelTFSquirrel; -import twilightforest.client.model.ModelTFTinyBird; -import twilightforest.client.model.ModelTFTowerBoss; -import twilightforest.client.model.ModelTFTowerGolem; -import twilightforest.client.model.ModelTFTroll; -import twilightforest.client.model.ModelTFWraith; -import twilightforest.client.model.ModelTFYeti; -import twilightforest.client.model.ModelTFYetiAlpha; -import twilightforest.client.model.ModelTFYetiArmor; -import twilightforest.client.particle.EntityTFAnnihilateFX; -import twilightforest.client.particle.EntityTFBossTearFX; -import twilightforest.client.particle.EntityTFGhastTrapFX; -import twilightforest.client.particle.EntityTFIceBeamFX; -import twilightforest.client.particle.EntityTFLargeFlameFX; -import twilightforest.client.particle.EntityTFLeafRuneFX; -import twilightforest.client.particle.EntityTFProtectionFX; -import twilightforest.client.particle.EntityTFSnowFX; -import twilightforest.client.particle.EntityTFSnowGuardianFX; -import twilightforest.client.particle.EntityTFSnowWarningFX; -import twilightforest.client.renderer.TFFieryItemRenderer; -import twilightforest.client.renderer.TFGiantBlockRenderer; -import twilightforest.client.renderer.TFGiantItemRenderer; -import twilightforest.client.renderer.TFIceItemRenderer; -import twilightforest.client.renderer.TFMagicMapRenderer; -import twilightforest.client.renderer.TFMazeMapRenderer; -import twilightforest.client.renderer.TileEntityTFCicadaRenderer; -import twilightforest.client.renderer.TileEntityTFFireflyRenderer; -import twilightforest.client.renderer.TileEntityTFMoonwormRenderer; -import twilightforest.client.renderer.TileEntityTFTrophyRenderer; -import twilightforest.client.renderer.blocks.RenderBlockTFCastleMagic; -import twilightforest.client.renderer.blocks.RenderBlockTFCritters; -import twilightforest.client.renderer.blocks.RenderBlockTFFireflyJar; -import twilightforest.client.renderer.blocks.RenderBlockTFHugeLilyPad; -import twilightforest.client.renderer.blocks.RenderBlockTFKnightMetal; -import twilightforest.client.renderer.blocks.RenderBlockTFMagicLeaves; -import twilightforest.client.renderer.blocks.RenderBlockTFNagastone; -import twilightforest.client.renderer.blocks.RenderBlockTFPedestal; -import twilightforest.client.renderer.blocks.RenderBlockTFPlants; -import twilightforest.client.renderer.blocks.RenderBlockTFThorns; -import twilightforest.client.renderer.entity.RenderTFAdherent; -import twilightforest.client.renderer.entity.RenderTFHarbingerCube; -import twilightforest.client.renderer.entity.RenderTFBighorn; -import twilightforest.client.renderer.entity.RenderTFBiped; -import twilightforest.client.renderer.entity.RenderTFBird; -import twilightforest.client.renderer.entity.RenderTFBlockGoblin; -import twilightforest.client.renderer.entity.RenderTFBoar; -import twilightforest.client.renderer.entity.RenderTFBunny; -import twilightforest.client.renderer.entity.RenderTFChainBlock; -import twilightforest.client.renderer.entity.RenderTFCharm; -import twilightforest.client.renderer.entity.RenderTFCubeOfAnnihilation; -import twilightforest.client.renderer.entity.RenderTFDeer; -import twilightforest.client.renderer.entity.RenderTFFallingIce; -import twilightforest.client.renderer.entity.RenderTFGenericLiving; -import twilightforest.client.renderer.entity.RenderTFGiant; -import twilightforest.client.renderer.entity.RenderTFGoblinKnightUpper; -import twilightforest.client.renderer.entity.RenderTFHedgeSpider; -import twilightforest.client.renderer.entity.RenderTFHydra; -import twilightforest.client.renderer.entity.RenderTFHydraHead; -import twilightforest.client.renderer.entity.RenderTFHydraMortar; -import twilightforest.client.renderer.entity.RenderTFIceExploder; -import twilightforest.client.renderer.entity.RenderTFIceShooter; -import twilightforest.client.renderer.entity.RenderTFIceCrystal; -import twilightforest.client.renderer.entity.RenderTFKingSpider; -import twilightforest.client.renderer.entity.RenderTFKnightPhantom; -import twilightforest.client.renderer.entity.RenderTFKobold; -import twilightforest.client.renderer.entity.RenderTFLich; -import twilightforest.client.renderer.entity.RenderTFMazeSlime; -import twilightforest.client.renderer.entity.RenderTFMiniGhast; -import twilightforest.client.renderer.entity.RenderTFMinoshroom; -import twilightforest.client.renderer.entity.RenderTFMistWolf; -import twilightforest.client.renderer.entity.RenderTFMoonwormShot; -import twilightforest.client.renderer.entity.RenderTFNaga; -import twilightforest.client.renderer.entity.RenderTFNagaSegment; -import twilightforest.client.renderer.entity.RenderTFProtectionBox; -import twilightforest.client.renderer.entity.RenderTFQuestRam; -import twilightforest.client.renderer.entity.RenderTFRovingCube; -import twilightforest.client.renderer.entity.RenderTFSlideBlock; -import twilightforest.client.renderer.entity.RenderTFSlimeBeetle; -import twilightforest.client.renderer.entity.RenderTFSnowGuardian; -import twilightforest.client.renderer.entity.RenderTFSnowQueen; -import twilightforest.client.renderer.entity.RenderTFSnowQueenIceShield; -import twilightforest.client.renderer.entity.RenderTFSpikeBlock; -import twilightforest.client.renderer.entity.RenderTFSwarmSpider; -import twilightforest.client.renderer.entity.RenderTFThrownAxe; -import twilightforest.client.renderer.entity.RenderTFThrownIce; -import twilightforest.client.renderer.entity.RenderTFTinyBird; -import twilightforest.client.renderer.entity.RenderTFTinyFirefly; -import twilightforest.client.renderer.entity.RenderTFTowerBroodling; -import twilightforest.client.renderer.entity.RenderTFTowerGhast; -import twilightforest.client.renderer.entity.RenderTFTowerGolem; -import twilightforest.client.renderer.entity.RenderTFUrGhast; -import twilightforest.client.renderer.entity.RenderTFWinterWolf; -import twilightforest.client.renderer.entity.RenderTFWraith; -import twilightforest.client.renderer.entity.RenderTFYeti; -import twilightforest.entity.EntityTFCubeOfAnnihilation; -import twilightforest.item.TFItems; -import twilightforest.tileentity.TileEntityTFCicada; -import twilightforest.tileentity.TileEntityTFFirefly; -import twilightforest.tileentity.TileEntityTFMoonworm; -import twilightforest.tileentity.TileEntityTFTrophy; -import cpw.mods.fml.client.FMLClientHandler; -import cpw.mods.fml.client.registry.ClientRegistry; -import cpw.mods.fml.client.registry.RenderingRegistry; -import cpw.mods.fml.common.FMLCommonHandler; - -public class TFClientProxy extends TFCommonProxy { - - int critterRenderID; - int plantRenderID; - int blockComplexRenderID; - int nagastoneRenderID; - int magicLeavesRenderID; - int pedestalRenderID; - int thornsRenderID; - int knightmetalBlockRenderID; - int hugeLilyPadBlockRenderID; - int castleMagicBlockRenderID; - - ModelBiped[] knightlyArmorModel; - ModelBiped[] phantomArmorModel; - ModelBiped[] yetiArmorModel; - ModelBiped[] arcticArmorModel; - ModelBiped[] fieryArmorModel; - - TFClientTicker clientTicker; - TFClientEvents clientEvents; - - boolean isDangerOverlayShown; - /** - * Called during mod pre-load. We need to register our sound thing here so that it can catch the SoundLoadEvent during loading. - */ - @Override - public void doPreLoadRegistration() { - // sounds - //MinecraftForge.EVENT_BUS.register(new TFSounds()); - - } - - /** - * Called during mod loading. Registers renderers and stuff - */ - @Override - public void doOnLoadRegistration() { - Minecraft mc = FMLClientHandler.instance().getClient(); - - // client tick listener - clientTicker = new TFClientTicker(); - FMLCommonHandler.instance().bus().register(clientTicker); - - // client events - clientEvents = new TFClientEvents(); - MinecraftForge.EVENT_BUS.register(clientEvents); - - // packet listener - TFGenericPacketHandler genericPacketHandler = new TFGenericPacketHandler(); - TwilightForestMod.genericChannel.register(genericPacketHandler); - - // entity renderers - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.passive.EntityTFBoar.class, new RenderTFBoar(new ModelTFBoar(), new ModelPig(0.5F), 0.7F)); - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.passive.EntityTFBighorn.class, new RenderTFBighorn(new ModelTFBighorn(), new ModelTFBighornFur(), 0.7F)); - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.passive.EntityTFDeer.class, new RenderTFDeer(new ModelTFDeer(), 0.7F)); - - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.EntityTFRedcap.class, new RenderTFBiped(new ModelTFRedcap(), 0.625F, "redcap.png")); -// RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.EntityTFNagaOld.class, new RenderTFNaga(new ModelTFNaga(), 0.625F)); -// RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.EntityTFNagaSegmentOld.class, new RenderTFNaga(new ModelTFNaga(), 0.625F)); - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.passive.EntityTFTinyFirefly.class, new RenderTFTinyFirefly()); - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.EntityTFSkeletonDruid.class, new RenderTFBiped(new ModelTFSkeletonDruid(), 0.5F, "skeletondruid.png")); - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.EntityTFWraith.class, new RenderTFWraith(new ModelTFWraith(), 0.5F)); - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.boss.EntityTFHydra.class, new RenderTFHydra(new ModelTFHydra(), 1.0F)); - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.boss.EntityTFLich.class, new RenderTFLich(new ModelTFLich(), 1.0F)); - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.passive.EntityTFPenguin.class, new RenderTFBird(new ModelTFPenguin(), 1.0F, "penguin.png")); - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.boss.EntityTFLichMinion.class, new RenderTFBiped(new ModelTFLichMinion(), 1.0F, "textures/entity/zombie/zombie.png")); - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.EntityTFLoyalZombie.class, new RenderTFBiped(new ModelTFLoyalZombie(), 1.0F, "textures/entity/zombie/zombie.png")); - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.passive.EntityTFTinyBird.class, new RenderTFTinyBird(new ModelTFTinyBird(), 1.0F)); - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.passive.EntityTFSquirrel.class, new RenderTFGenericLiving(new ModelTFSquirrel(), 1.0F, "squirrel2.png")); - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.passive.EntityTFBunny.class, new RenderTFBunny(new ModelTFBunny(), 1.0F)); - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.passive.EntityTFRaven.class, new RenderTFBird(new ModelTFRaven(), 1.0F, "raven.png")); - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.passive.EntityTFQuestRam.class, new RenderTFQuestRam()); - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.EntityTFKobold.class, new RenderTFKobold(new ModelTFKobold(), 0.625F, "kobold.png")); - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.EntityTFBoggard.class, new RenderTFBiped(new ModelTFLoyalZombie(), 0.625F, "kobold.png")); - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.EntityTFMosquitoSwarm.class, new RenderTFGenericLiving(new ModelTFMosquitoSwarm(), 0.625F, "mosquitoswarm.png")); - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.EntityTFDeathTome.class, new RenderTFGenericLiving(new ModelTFDeathTome(), 0.625F, "textures/entity/enchanting_table_book.png")); - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.EntityTFMinotaur.class, new RenderTFBiped(new ModelTFMinotaur(), 0.625F, "minotaur.png")); - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.boss.EntityTFMinoshroom.class, new RenderTFMinoshroom(new ModelTFMinoshroom(), 0.625F)); - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.EntityTFFireBeetle.class, new RenderTFGenericLiving(new ModelTFFireBeetle(), 0.625F, "firebeetle.png")); - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.EntityTFSlimeBeetle.class, new RenderTFSlimeBeetle(new ModelTFSlimeBeetle(), 0.625F)); - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.EntityTFPinchBeetle.class, new RenderTFGenericLiving(new ModelTFPinchBeetle(), 0.625F, "pinchbeetle.png")); - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.EntityTFMistWolf.class, new RenderTFMistWolf(new ModelWolf(), new ModelWolf(), 0.625F)); - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.passive.EntityTFMobileFirefly.class, new RenderTFTinyFirefly()); - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.EntityTFMiniGhast.class, new RenderTFMiniGhast(new ModelTFGhast(), 0.625F)); - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.EntityTFTowerGolem.class, new RenderTFTowerGolem(new ModelTFTowerGolem(), 0.5F)); - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.EntityTFTowerTermite.class, new RenderTFGenericLiving(new ModelSilverfish(), 0.3F, "towertermite.png")); - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.EntityTFTowerGhast.class, new RenderTFTowerGhast(new ModelTFGhast(), 0.625F)); - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.boss.EntityTFUrGhast.class, new RenderTFUrGhast(new ModelTFTowerBoss(), 0.625F, 24F)); - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.EntityTFBlockGoblin.class, new RenderTFBlockGoblin(new ModelTFBlockGoblin(), 0.625F)); - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.EntityTFGoblinChain.class, new RenderTFSpikeBlock(new ModelTFGoblinChain(), 0.625F)); - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.EntityTFSpikeBlock.class, new RenderTFSpikeBlock(new ModelTFSpikeBlock(), 0.625F)); - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.EntityTFGoblinKnightUpper.class, new RenderTFGoblinKnightUpper(new ModelTFGoblinKnightUpper(), 0.625F)); - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.EntityTFGoblinKnightLower.class, new RenderTFBiped(new ModelTFGoblinKnightLower(), 0.625F, "doublegoblin.png")); - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.EntityTFHelmetCrab.class, new RenderTFGenericLiving(new ModelTFHelmetCrab(), 0.625F, "helmetcrab.png")); - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.boss.EntityTFKnightPhantom.class, new RenderTFKnightPhantom(new ModelTFKnightPhantom2(), 0.625F)); - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.boss.EntityTFNaga.class, new RenderTFNaga(new ModelTFNaga(), 0.625F)); - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.boss.EntityTFNagaSegment.class, new RenderTFNagaSegment(new ModelTFNaga(), 0.625F)); - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.EntityTFSwarmSpider.class, new RenderTFSwarmSpider()); - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.EntityTFKingSpider.class, new RenderTFKingSpider()); - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.EntityTFTowerBroodling.class, new RenderTFTowerBroodling()); - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.EntityTFHedgeSpider.class, new RenderTFHedgeSpider()); - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.EntityTFRedcapSapper.class, new RenderTFBiped(new ModelTFRedcap(), 0.625F, "redcapsapper.png")); - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.EntityTFMazeSlime.class, new RenderTFMazeSlime(new ModelSlime(16), new ModelSlime(0), 0.625F)); - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.EntityTFYeti.class, new RenderTFYeti(new ModelTFYeti(), 0.625F, "yeti2.png")); - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.EntityTFProtectionBox.class, new RenderTFProtectionBox()); - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.boss.EntityTFYetiAlpha.class, new RenderTFYeti(new ModelTFYetiAlpha(), 0.625F, "yetialpha.png")); - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.EntityTFWinterWolf.class, new RenderTFWinterWolf(new ModelWolf(), new ModelWolf(), 0.625F)); - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.EntityTFSnowGuardian.class, new RenderTFSnowGuardian()); - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.EntityTFIceShooter.class, new RenderTFIceShooter()); - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.EntityTFIceExploder.class, new RenderTFIceExploder()); - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.boss.EntityTFSnowQueen.class, new RenderTFSnowQueen()); - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.boss.EntityTFSnowQueenIceShield.class, new RenderTFSnowQueenIceShield()); - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.EntityTFTroll.class, new RenderTFBiped(new ModelTFTroll(), 0.625F, "troll.png")); - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.EntityTFGiantMiner.class, new RenderTFGiant()); - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.boss.EntityTFIceCrystal.class, new RenderTFIceCrystal()); - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.EntityTFChainBlock.class, new RenderTFChainBlock(new ModelTFSpikeBlock(), 0.625F)); - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.EntityTFCubeOfAnnihilation.class, new RenderTFCubeOfAnnihilation()); - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.EntityTFHarbingerCube.class, new RenderTFHarbingerCube()); - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.EntityTFAdherent.class, new RenderTFAdherent(new ModelTFAdherent(), 0.625F, "adherent.png")); - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.EntityTFRovingCube.class, new RenderTFRovingCube()); - - // projectiles - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.EntityTFNatureBolt.class, new RenderSnowball(Items.wheat_seeds)); - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.boss.EntityTFLichBolt.class, new RenderSnowball(Items.ender_pearl)); - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.EntityTFTwilightWandBolt.class, new RenderSnowball(Items.ender_pearl)); - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.EntityTFTomeBolt.class, new RenderSnowball(Items.paper)); - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.boss.EntityTFHydraMortar.class, new RenderTFHydraMortar()); - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.EntityTFSlimeProjectile.class, new RenderSnowball(Items.slime_ball)); - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.EntityTFMoonwormShot.class, new RenderTFMoonwormShot()); - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.EntityTFCharmEffect.class, new RenderTFCharm(TFItems.charmOfLife1.getIconFromDamage(0))); - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.boss.EntityTFLichBomb.class, new RenderSnowball(Items.magma_cream)); - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.boss.EntityTFThrownAxe.class, new RenderTFThrownAxe(TFItems.knightlyAxe)); - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.boss.EntityTFThrownPick.class, new RenderTFThrownAxe(TFItems.knightlyPick)); - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.boss.EntityTFFallingIce.class, new RenderTFFallingIce()); - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.boss.EntityTFIceBomb.class, new RenderTFThrownIce()); - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.EntityTFIceSnowball.class, new RenderSnowball(Items.snowball)); - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.EntityTFSlideBlock.class, new RenderTFSlideBlock()); - - // I guess the hydra gets its own section - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.boss.EntityTFHydraHead.class, new RenderTFHydraHead(new ModelTFHydraHead(), 1.0F)); - RenderingRegistry.registerEntityRenderingHandler(twilightforest.entity.boss.EntityTFHydraNeck.class, new RenderTFGenericLiving(new ModelTFHydraNeck(), 1.0F, "hydra4.png")); - - // animated textures -// TextureFXManager.instance().addAnimation(new TextureTFMagicLeavesFX(mc, BlockTFMagicLeaves.SPR_TIMELEAVES, BlockTFMagicLeaves.SPR_TIMEFX)); -// TextureFXManager.instance().addAnimation(new TextureTFMagicLeavesFX(mc, BlockTFMagicLeaves.SPR_TRANSLEAVES, BlockTFMagicLeaves.SPR_TRANSFX)); -// TextureFXManager.instance().addAnimation(new TextureTFMagicLeavesFX(mc, BlockTFMagicLeaves.SPR_SORTLEAVES, BlockTFMagicLeaves.SPR_SORTFX)); - - // tile entities - ClientRegistry.bindTileEntitySpecialRenderer(TileEntityTFFirefly.class, new TileEntityTFFireflyRenderer()); - ClientRegistry.bindTileEntitySpecialRenderer(TileEntityTFCicada.class, new TileEntityTFCicadaRenderer()); -// ClientRegistry.bindTileEntitySpecialRenderer(TileEntityTFNagaSpawner.class, new TileEntityMobSpawnerRenderer()); -// ClientRegistry.bindTileEntitySpecialRenderer(TileEntityTFLichSpawner.class, new TileEntityMobSpawnerRenderer()); -// ClientRegistry.bindTileEntitySpecialRenderer(TileEntityTFHydraSpawner.class, new TileEntityMobSpawnerRenderer()); - ClientRegistry.bindTileEntitySpecialRenderer(TileEntityTFMoonworm.class, new TileEntityTFMoonwormRenderer()); - ClientRegistry.bindTileEntitySpecialRenderer(TileEntityTFTrophy.class, new TileEntityTFTrophyRenderer()); - - // map item renderer - MinecraftForgeClient.registerItemRenderer(TFItems.magicMap, new TFMagicMapRenderer(mc.gameSettings, mc.getTextureManager())); - TFMazeMapRenderer mazeRenderer = new TFMazeMapRenderer(mc.gameSettings, mc.getTextureManager()); - MinecraftForgeClient.registerItemRenderer(TFItems.mazeMap, mazeRenderer); - MinecraftForgeClient.registerItemRenderer(TFItems.oreMap, mazeRenderer); - - // giant item renderers - TFGiantItemRenderer giantRenderer = new TFGiantItemRenderer(mc.gameSettings, mc.getTextureManager()); - MinecraftForgeClient.registerItemRenderer(TFItems.giantPick, giantRenderer); - MinecraftForgeClient.registerItemRenderer(TFItems.giantSword, giantRenderer); - - TFGiantBlockRenderer giantBlockRenderer = new TFGiantBlockRenderer(mc.gameSettings, mc.getTextureManager()); - MinecraftForgeClient.registerItemRenderer(Item.getItemFromBlock(TFBlocks.giantLeaves), giantBlockRenderer); - MinecraftForgeClient.registerItemRenderer(Item.getItemFromBlock(TFBlocks.giantCobble), giantBlockRenderer); - MinecraftForgeClient.registerItemRenderer(Item.getItemFromBlock(TFBlocks.giantLog), giantBlockRenderer); - MinecraftForgeClient.registerItemRenderer(Item.getItemFromBlock(TFBlocks.giantObsidian), giantBlockRenderer); - - // fiery item render - TFFieryItemRenderer fieryRenderer = new TFFieryItemRenderer(mc.gameSettings, mc.getTextureManager()); - MinecraftForgeClient.registerItemRenderer(TFItems.fieryPick, fieryRenderer); - MinecraftForgeClient.registerItemRenderer(TFItems.fierySword, fieryRenderer); - MinecraftForgeClient.registerItemRenderer(TFItems.fieryIngot, fieryRenderer); - MinecraftForgeClient.registerItemRenderer(TFItems.fieryHelm, fieryRenderer); - MinecraftForgeClient.registerItemRenderer(TFItems.fieryPlate, fieryRenderer); - MinecraftForgeClient.registerItemRenderer(TFItems.fieryLegs, fieryRenderer); - MinecraftForgeClient.registerItemRenderer(TFItems.fieryBoots, fieryRenderer); - - // ice item renderers - TFIceItemRenderer iceRenderer = new TFIceItemRenderer(mc.gameSettings, mc.getTextureManager()); - MinecraftForgeClient.registerItemRenderer(TFItems.iceSword, iceRenderer); - MinecraftForgeClient.registerItemRenderer(TFItems.glassSword, iceRenderer); - MinecraftForgeClient.registerItemRenderer(TFItems.iceBow, iceRenderer); - - - // block render ids - blockComplexRenderID = RenderingRegistry.getNextAvailableRenderId(); - RenderingRegistry.registerBlockHandler(new RenderBlockTFFireflyJar(blockComplexRenderID)); - - plantRenderID = RenderingRegistry.getNextAvailableRenderId(); - RenderingRegistry.registerBlockHandler(new RenderBlockTFPlants(plantRenderID)); - - critterRenderID = RenderingRegistry.getNextAvailableRenderId(); - RenderingRegistry.registerBlockHandler(new RenderBlockTFCritters(critterRenderID)); - - nagastoneRenderID = RenderingRegistry.getNextAvailableRenderId(); - RenderingRegistry.registerBlockHandler(new RenderBlockTFNagastone(nagastoneRenderID)); - - magicLeavesRenderID = RenderingRegistry.getNextAvailableRenderId(); - RenderingRegistry.registerBlockHandler(new RenderBlockTFMagicLeaves(magicLeavesRenderID)); - - pedestalRenderID = RenderingRegistry.getNextAvailableRenderId(); - RenderingRegistry.registerBlockHandler(new RenderBlockTFPedestal(pedestalRenderID)); - - thornsRenderID = RenderingRegistry.getNextAvailableRenderId(); - RenderingRegistry.registerBlockHandler(new RenderBlockTFThorns(thornsRenderID)); - - knightmetalBlockRenderID = RenderingRegistry.getNextAvailableRenderId(); - RenderingRegistry.registerBlockHandler(new RenderBlockTFKnightMetal(knightmetalBlockRenderID)); - - hugeLilyPadBlockRenderID = RenderingRegistry.getNextAvailableRenderId(); - RenderingRegistry.registerBlockHandler(new RenderBlockTFHugeLilyPad(hugeLilyPadBlockRenderID)); - - castleMagicBlockRenderID = RenderingRegistry.getNextAvailableRenderId(); - RenderingRegistry.registerBlockHandler(new RenderBlockTFCastleMagic(castleMagicBlockRenderID)); - - // armor model - knightlyArmorModel = new ModelBiped[4]; - knightlyArmorModel[0] = new ModelTFKnightlyArmor(0, 0.5F); - knightlyArmorModel[1] = new ModelTFKnightlyArmor(1, 1.0F); - knightlyArmorModel[2] = new ModelTFKnightlyArmor(2, 0.5F); - knightlyArmorModel[3] = new ModelTFKnightlyArmor(3, 0.5F); - - phantomArmorModel = new ModelBiped[2]; - phantomArmorModel[0] = new ModelTFPhantomArmor(0, 0.5F); - phantomArmorModel[1] = new ModelTFPhantomArmor(1, 1.0F); - - yetiArmorModel = new ModelBiped[4]; - yetiArmorModel[0] = new ModelTFYetiArmor(0, 0.6F); - yetiArmorModel[1] = new ModelTFYetiArmor(1, 1.0F); - yetiArmorModel[2] = new ModelTFYetiArmor(2, 0.4F); - yetiArmorModel[3] = new ModelTFYetiArmor(3, 0.55F); - - arcticArmorModel = new ModelBiped[4]; - arcticArmorModel[0] = new ModelTFArcticArmor(0, 0.6F); - arcticArmorModel[1] = new ModelTFArcticArmor(1, 1.0F); - arcticArmorModel[2] = new ModelTFArcticArmor(2, 0.4F); - arcticArmorModel[3] = new ModelTFArcticArmor(3, 0.55F); - - fieryArmorModel = new ModelBiped[4]; - fieryArmorModel[0] = new ModelTFFieryArmor(0, 0.5F); - fieryArmorModel[1] = new ModelTFFieryArmor(1, 1.0F); - fieryArmorModel[2] = new ModelTFFieryArmor(2, 0.5F); - fieryArmorModel[3] = new ModelTFFieryArmor(3, 0.5F); - - - - } - - public int getCritterBlockRenderID() { - return critterRenderID; - } - - public int getPlantBlockRenderID() { - return plantRenderID; - } - - public int getComplexBlockRenderID() { - return blockComplexRenderID; - } - - public int getNagastoneBlockRenderID() { - return nagastoneRenderID; - } - - public int getMagicLeavesBlockRenderID() { - return magicLeavesRenderID; - } - - public int getPedestalBlockRenderID() { - return pedestalRenderID; - } - - public int getThornsBlockRenderID() { - return thornsRenderID; - } - - public int getKnightmetalBlockRenderID() { - return knightmetalBlockRenderID; - } - - public int getHugeLilyPadBlockRenderID() { - return hugeLilyPadBlockRenderID; - } - - public int getCastleMagicBlockRenderID() { - return castleMagicBlockRenderID; - } - - /** - * The prefix is not actually used, but we do need a render ID - */ - public int registerArmorRenderID(String prefix) { - return RenderingRegistry.addNewArmourRendererPrefix(prefix); - } - - @Override - public World getClientWorld() { - return FMLClientHandler.instance().getClient().theWorld; - } - - - /** - * Spawns a particle. This is my copy of RenderGlobal.spawnParticle where I implement custom particles. - */ - public void spawnParticle(World world, String particleType, double x, double y, double z, double velX, double velY, double velZ) - { - Minecraft mc = FMLClientHandler.instance().getClient(); - if (mc != null && mc.renderViewEntity != null && mc.effectRenderer != null && mc.theWorld == world) - { - // TODO: check render settings? - double distX = mc.renderViewEntity.posX - x; - double distY = mc.renderViewEntity.posY - y; - double distZ = mc.renderViewEntity.posZ - z; - - EntityFX particle = null; - - double maxDist = 64.0D; // normally 16.0D - - // check for particle max distance - if (distX * distX + distY * distY + distZ * distZ < maxDist * maxDist) - { - - if (particleType.equals("largeflame")) - { - particle = new EntityTFLargeFlameFX(world, x, y, z, velX, velY, velZ); - } - else if (particleType.equals("hugesmoke")) - { - particle = new EntitySmokeFX(world, x, y, z, velX, velY, velZ, 8.0f); - } - else if (particleType.equals("leafrune")) - { - particle = new EntityTFLeafRuneFX(world, x, y, z, velX, velY, velZ); - } - else if (particleType.equals("bosstear")) - { - particle = new EntityTFBossTearFX(world, x, y, z, velX, velY, velZ, Items.ghast_tear); - } - else if (particleType.equals("ghasttrap")) - { - particle = new EntityTFGhastTrapFX(world, x, y, z, velX, velY, velZ); - } - else if (particleType.equals("protection")) - { - particle = new EntityTFProtectionFX(world, x, y, z, velX, velY, velZ); - } - else if (particleType.equals("snowstuff")) - { - particle = new EntityTFSnowFX(world, x, y, z, velX, velY, velZ); - } - else if (particleType.equals("snowwarning")) - { - particle = new EntityTFSnowWarningFX(world, x, y, z, velX, velY, velZ, 1F); - } - else if (particleType.equals("snowguardian")) - { - particle = new EntityTFSnowGuardianFX(world, x, y, z, velX, velY, velZ, 0.75F); - } - else if (particleType.equals("icebeam")) - { - particle = new EntityTFIceBeamFX(world, x, y, z, velX, velY, velZ, 0.75F); - } - else if (particleType.equals("annihilate")) - { - particle = new EntityTFAnnihilateFX(world, x, y, z, velX, velY, velZ, 0.75F); - } - - // if we made a partcle, go ahead and add it - if (particle != null) - { - particle.prevPosX = particle.posX; - particle.prevPosY = particle.posY; - particle.prevPosZ = particle.posZ; - - // we keep having a non-threadsafe crash adding particles directly here, so let's pass them to a buffer - //clientTicker.addParticle(particle); - mc.effectRenderer.addEffect(particle); // maybe it's fixed? - } - } - } - } - - - public ModelBiped getKnightlyArmorModel(int armorSlot) { - return knightlyArmorModel[armorSlot]; - } - - public ModelBiped getPhantomArmorModel(int armorSlot) { - return phantomArmorModel[armorSlot]; - } - - public ModelBiped getYetiArmorModel(int armorSlot) { - return yetiArmorModel[armorSlot]; - } - - public ModelBiped getArcticArmorModel(int armorSlot) { - return arcticArmorModel[armorSlot]; - } - - - public ModelBiped getFieryArmorModel(int armorSlot) { - return this.fieryArmorModel[armorSlot]; - } - - public boolean isDangerOverlayShown() { - return isDangerOverlayShown; - } - - public void setDangerOverlayShown(boolean isDangerOverlayShown) { - this.isDangerOverlayShown = isDangerOverlayShown; - - } - - public void doBlockAnnihilateEffect(World worldObj, int blockX, int blockY, int blockZ) { - // particles from the block? -// for (int i = 0; i < 10; i++) { -// -// double d0 = worldObj.rand.nextGaussian() * 0.02D; -// double d1 = worldObj.rand.nextGaussian() * 0.02D; -// double d2 = worldObj.rand.nextGaussian() * 0.02D; -// -// float dx = blockX + 0.5F + (worldObj.rand.nextFloat() - worldObj.rand.nextFloat()) * 0.4F; -// float dy = blockY + 0.5F + (worldObj.rand.nextFloat() - worldObj.rand.nextFloat()) * 0.4F; -// float dz = blockZ + 0.5F + (worldObj.rand.nextFloat() - worldObj.rand.nextFloat()) * 0.4F; -// -// TwilightForestMod.proxy.spawnParticle(worldObj, "annihilate", dx, dy, dz, d0, d1, d2); -// -// } - - - byte four = 4; - - for (int dx = 0; dx < four; ++dx) - { - for (int dy = 0; dy < four; ++dy) - { - for (int dz = 0; dz < four; ++dz) - { - double d0 = (double)blockX + ((double)dx + 0.5D) / (double)four; - double d1 = (double)blockY + ((double)dy + 0.5D) / (double)four; - double d2 = (double)blockZ + ((double)dz + 0.5D) / (double)four; - - double gx = worldObj.rand.nextGaussian() * 0.2D; - double gy = worldObj.rand.nextGaussian() * 0.2D; - double gz = worldObj.rand.nextGaussian() * 0.2D; - - TwilightForestMod.proxy.spawnParticle(worldObj, "annihilate", d0, d1, d2, gx, gy, gz); - - - //this.addEffect((new EntityDiggingFX(this.worldObj, d0, d1, d2, d0 - (double)p_147215_1_ - 0.5D, d1 - (double)p_147215_2_ - 0.5D, d2 - (double)p_147215_3_ - 0.5D, p_147215_4_, p_147215_5_)).applyColourMultiplier(p_147215_1_, p_147215_2_, p_147215_3_)); - } - } - } - } - -} diff --git a/src/main/java/twilightforest/client/TFClientSetup.java b/src/main/java/twilightforest/client/TFClientSetup.java new file mode 100644 index 0000000000..1dfacda8ed --- /dev/null +++ b/src/main/java/twilightforest/client/TFClientSetup.java @@ -0,0 +1,247 @@ +package twilightforest.client; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screens.TitleScreen; +import net.minecraft.client.model.EntityModel; +import net.minecraft.client.model.SilverfishModel; +import net.minecraft.client.model.geom.ModelLayers; +import net.minecraft.client.renderer.Sheets; +import net.minecraft.client.renderer.entity.EntityRenderer; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.entity.LivingEntityRenderer; +import net.minecraft.client.renderer.entity.ThrownItemRenderer; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.LazyLoadedValue; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.client.event.EntityRenderersEvent; +import net.minecraftforge.client.event.ScreenEvent; +import net.minecraftforge.eventbus.api.IEventBus; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.ModList; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import twilightforest.TFConfig; +import twilightforest.TwilightForestMod; +import twilightforest.client.model.TFModelLayers; +import twilightforest.client.model.entity.*; +import twilightforest.client.model.entity.legacy.*; +import twilightforest.client.renderer.entity.*; +import twilightforest.client.renderer.entity.legacy.*; +import twilightforest.compat.curios.CuriosCompat; +import twilightforest.entity.TFPart; +import twilightforest.entity.boss.HydraHead; +import twilightforest.entity.boss.HydraNeck; +import twilightforest.entity.boss.NagaSegment; +import twilightforest.entity.boss.SnowQueenIceShield; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFBlockEntities; +import twilightforest.init.TFEntities; +import twilightforest.init.TFMenuTypes; +import twilightforest.util.TFWoodTypes; + +import java.lang.reflect.Field; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.function.BooleanSupplier; + +@Mod.EventBusSubscriber(value = Dist.CLIENT, bus = Mod.EventBusSubscriber.Bus.MOD, modid = TwilightForestMod.ID) +public class TFClientSetup { + + public static boolean optifinePresent = false; + + public static void init() { + IEventBus busMod = FMLJavaModLoadingContext.get().getModEventBus(); + TFShaders.init(busMod); + } + + @Mod.EventBusSubscriber(value = Dist.CLIENT, bus = Mod.EventBusSubscriber.Bus.FORGE, modid = TwilightForestMod.ID) + public static class ForgeEvents { + + private static boolean optifineWarningShown = false; + + @SubscribeEvent + public static void showOptifineWarning(ScreenEvent.Init.Post event) { + if (optifinePresent && !optifineWarningShown && !TFConfig.CLIENT_CONFIG.disableOptifineNagScreen.get() && event.getScreen() instanceof TitleScreen) { + optifineWarningShown = true; + Minecraft.getInstance().setScreen(new OptifineWarningScreen(event.getScreen())); + } + } + + } + + @SubscribeEvent + public static void clientSetup(FMLClientSetupEvent evt) { + try { + Class.forName("net.optifine.Config"); + optifinePresent = true; + } catch (ClassNotFoundException e) { + optifinePresent = false; + } + + TFBlockEntities.registerTileEntityRenders(); + TFMenuTypes.renderScreens(); + + evt.enqueueWork(() -> { + Sheets.addWoodType(TFWoodTypes.TWILIGHT_OAK_WOOD_TYPE); + Sheets.addWoodType(TFWoodTypes.CANOPY_WOOD_TYPE); + Sheets.addWoodType(TFWoodTypes.MANGROVE_WOOD_TYPE); + Sheets.addWoodType(TFWoodTypes.DARKWOOD_WOOD_TYPE); + Sheets.addWoodType(TFWoodTypes.TIMEWOOD_WOOD_TYPE); + Sheets.addWoodType(TFWoodTypes.TRANSFORMATION_WOOD_TYPE); + Sheets.addWoodType(TFWoodTypes.MINING_WOOD_TYPE); + Sheets.addWoodType(TFWoodTypes.SORTING_WOOD_TYPE); + + if (ModList.get().isLoaded("curios")) { + CuriosCompat.registerCurioRenderers(); + } + }); + + } + + @SubscribeEvent + public static void registerEntityRenderers(EntityRenderersEvent.RegisterRenderers event) { + BooleanSupplier legacy = () -> Minecraft.getInstance().getResourcePackRepository().getSelectedIds().contains("builtin/twilight_forest_classic_resources"); + event.registerEntityRenderer(TFEntities.BOAT.get(), m -> new TwilightBoatRenderer(m, false)); + event.registerEntityRenderer(TFEntities.CHEST_BOAT.get(), m -> new TwilightBoatRenderer(m, true)); + event.registerEntityRenderer(TFEntities.BOAR.get(), m -> legacy.getAsBoolean() ? new LegacyBoarRenderer(m, new BoarLegacyModel<>(m.bakeLayer(TFModelLayers.LEGACY_BOAR))) : new BoarRenderer(m, new BoarModel<>(m.bakeLayer(TFModelLayers.BOAR)))); + event.registerEntityRenderer(TFEntities.BIGHORN_SHEEP.get(), m -> new BighornRenderer(m, new BighornModel<>(m.bakeLayer(legacy.getAsBoolean() ? TFModelLayers.LEGACY_BIGHORN_SHEEP : TFModelLayers.BIGHORN_SHEEP)), new BighornFurLayer(m.bakeLayer(TFModelLayers.BIGHORN_SHEEP_FUR)), 0.7F)); + event.registerEntityRenderer(TFEntities.DEER.get(), m -> new TFGenericMobRenderer<>(m, legacy.getAsBoolean() ? new DeerLegacyModel(m.bakeLayer(TFModelLayers.LEGACY_DEER)) : new DeerModel(m.bakeLayer(TFModelLayers.DEER)), 0.7F, "wilddeer.png")); + event.registerEntityRenderer(TFEntities.REDCAP.get(), m -> new TFBipedRenderer<>(m, legacy.getAsBoolean() ? new RedcapLegacyModel<>(m.bakeLayer(TFModelLayers.LEGACY_REDCAP)) : new RedcapModel<>(m.bakeLayer(TFModelLayers.REDCAP)), new RedcapModel<>(m.bakeLayer(TFModelLayers.REDCAP_ARMOR_INNER)), new RedcapModel<>(m.bakeLayer(TFModelLayers.REDCAP_ARMOR_OUTER)), 0.4F, "redcap.png")); + event.registerEntityRenderer(TFEntities.SKELETON_DRUID.get(), m -> new TFBipedRenderer<>(m, new SkeletonDruidModel(m.bakeLayer(TFModelLayers.SKELETON_DRUID)), 0.5F, "skeletondruid.png")); + event.registerEntityRenderer(TFEntities.HOSTILE_WOLF.get(), HostileWolfRenderer::new); + event.registerEntityRenderer(TFEntities.WRAITH.get(), m -> new WraithRenderer(m, new WraithModel(m.bakeLayer(TFModelLayers.WRAITH)), 0.5F)); + event.registerEntityRenderer(TFEntities.HYDRA.get(), m -> legacy.getAsBoolean() ? new LegacyHydraRenderer(m, new HydraLegacyModel(m.bakeLayer(TFModelLayers.LEGACY_HYDRA)), 4.0F) : new HydraRenderer(m, new HydraModel(m.bakeLayer(TFModelLayers.HYDRA)), 4.0F)); + event.registerEntityRenderer(TFEntities.LICH.get(), m -> new LichRenderer(m, new LichModel(m.bakeLayer(TFModelLayers.LICH)), 0.6F)); + event.registerEntityRenderer(TFEntities.PENGUIN.get(), m -> new BirdRenderer<>(m, new PenguinModel(m.bakeLayer(TFModelLayers.PENGUIN)), 0.375F, "penguin.png")); + event.registerEntityRenderer(TFEntities.LICH_MINION.get(), m -> new TFBipedRenderer<>(m, new LichMinionModel(m.bakeLayer(TFModelLayers.LICH_MINION)), new LichMinionModel(m.bakeLayer(ModelLayers.ZOMBIE_INNER_ARMOR)), new LichMinionModel(m.bakeLayer(ModelLayers.ZOMBIE_OUTER_ARMOR)), 0.5F, "textures/entity/zombie/zombie.png")); + event.registerEntityRenderer(TFEntities.LOYAL_ZOMBIE.get(), m -> new TFBipedRenderer<>(m, new LoyalZombieModel(m.bakeLayer(TFModelLayers.LOYAL_ZOMBIE)), new LoyalZombieModel(m.bakeLayer(ModelLayers.ZOMBIE_INNER_ARMOR)), new LoyalZombieModel(m.bakeLayer(ModelLayers.ZOMBIE_OUTER_ARMOR)), 0.5F, "textures/entity/zombie/zombie.png")); + event.registerEntityRenderer(TFEntities.TINY_BIRD.get(), m -> legacy.getAsBoolean() ? new LegacyTinyBirdRenderer(m, new TinyBirdLegacyModel(m.bakeLayer(TFModelLayers.LEGACY_TINY_BIRD)), 0.3F) : new TinyBirdRenderer(m, new TinyBirdModel(m.bakeLayer(TFModelLayers.TINY_BIRD)), 0.3F)); + event.registerEntityRenderer(TFEntities.SQUIRREL.get(), m -> new TFGenericMobRenderer<>(m, legacy.getAsBoolean() ? new SquirrelLegacyModel(m.bakeLayer(TFModelLayers.LEGACY_SQUIRREL)) : new SquirrelModel(m.bakeLayer(TFModelLayers.SQUIRREL)), 0.3F, "squirrel2.png")); + event.registerEntityRenderer(TFEntities.DWARF_RABBIT.get(), m -> new BunnyRenderer(m, new BunnyModel(m.bakeLayer(TFModelLayers.BUNNY)), 0.3F)); + event.registerEntityRenderer(TFEntities.RAVEN.get(), m -> new BirdRenderer<>(m, legacy.getAsBoolean() ? new RavenLegacyModel(m.bakeLayer(TFModelLayers.LEGACY_RAVEN)) : new RavenModel(m.bakeLayer(TFModelLayers.RAVEN)), 0.3F, "raven.png")); + event.registerEntityRenderer(TFEntities.QUEST_RAM.get(), m -> legacy.getAsBoolean() ? new LegacyQuestRamRenderer(m, new QuestRamLegacyModel(m.bakeLayer(TFModelLayers.LEGACY_QUEST_RAM))) : new QuestRamRenderer(m, new QuestRamModel(m.bakeLayer(TFModelLayers.QUEST_RAM)))); + event.registerEntityRenderer(TFEntities.KOBOLD.get(), m -> legacy.getAsBoolean() ? new LegacyKoboldRenderer(m, new KoboldLegacyModel(m.bakeLayer(TFModelLayers.LEGACY_KOBOLD)), 0.4F, "kobold.png") : new KoboldRenderer(m, new KoboldModel(m.bakeLayer(TFModelLayers.KOBOLD)), 0.4F, "kobold.png")); + //event.registerEntityRenderer(TFEntities.BOGGARD.get(), m -> new RenderTFBiped<>(m, new BipedModel<>(0), 0.625F, "kobold.png")); + event.registerEntityRenderer(TFEntities.MOSQUITO_SWARM.get(), MosquitoSwarmRenderer::new); + event.registerEntityRenderer(TFEntities.DEATH_TOME.get(), m -> new TFGenericMobRenderer<>(m, new DeathTomeModel(m.bakeLayer(TFModelLayers.DEATH_TOME)), 0.3F, "textures/entity/enchanting_table_book.png")); + event.registerEntityRenderer(TFEntities.MINOTAUR.get(), m -> new TFBipedRenderer<>(m, legacy.getAsBoolean() ? new MinotaurLegacyModel(m.bakeLayer(TFModelLayers.LEGACY_MINOTAUR)) : new MinotaurModel(m.bakeLayer(TFModelLayers.MINOTAUR)), 0.625F, "minotaur.png")); + event.registerEntityRenderer(TFEntities.MINOSHROOM.get(), m -> legacy.getAsBoolean() ? new LegacyMinoshroomRenderer(m, new MinoshroomLegacyModel(m.bakeLayer(TFModelLayers.LEGACY_MINOSHROOM)), 0.625F) : new MinoshroomRenderer(m, new MinoshroomModel(m.bakeLayer(TFModelLayers.MINOSHROOM)), 0.625F)); + event.registerEntityRenderer(TFEntities.FIRE_BEETLE.get(), m -> new TFGenericMobRenderer<>(m, legacy.getAsBoolean() ? new FireBeetleLegacyModel(m.bakeLayer(TFModelLayers.LEGACY_FIRE_BEETLE)) : new FireBeetleModel(m.bakeLayer(TFModelLayers.FIRE_BEETLE)), 0.8F, "firebeetle.png")); + event.registerEntityRenderer(TFEntities.SLIME_BEETLE.get(), m -> legacy.getAsBoolean() ? new LegacySlimeBeetleRenderer(m, new SlimeBeetleLegacyModel(m.bakeLayer(TFModelLayers.LEGACY_SLIME_BEETLE)), 0.6F) : new SlimeBeetleRenderer(m, new SlimeBeetleModel(m.bakeLayer(TFModelLayers.SLIME_BEETLE)), 0.6F)); + event.registerEntityRenderer(TFEntities.PINCH_BEETLE.get(), m -> new TFGenericMobRenderer<>(m, legacy.getAsBoolean() ? new PinchBeetleLegacyModel(m.bakeLayer(TFModelLayers.LEGACY_PINCH_BEETLE)) : new PinchBeetleModel(m.bakeLayer(TFModelLayers.PINCH_BEETLE)), 0.6F, "pinchbeetle.png")); + event.registerEntityRenderer(TFEntities.MIST_WOLF.get(), MistWolfRenderer::new); + event.registerEntityRenderer(TFEntities.CARMINITE_GHASTLING.get(), m -> new TFGhastRenderer<>(m, new TFGhastModel<>(m.bakeLayer(TFModelLayers.CARMINITE_GHASTLING)), 0.625F)); + event.registerEntityRenderer(TFEntities.CARMINITE_GOLEM.get(), m -> new CarminiteGolemRenderer<>(m, new CarminiteGolemModel<>(m.bakeLayer(TFModelLayers.CARMINITE_GOLEM)), 0.75F)); + event.registerEntityRenderer(TFEntities.TOWERWOOD_BORER.get(), m -> new TFGenericMobRenderer<>(m, new SilverfishModel<>(m.bakeLayer(ModelLayers.SILVERFISH)), 0.3F, "towertermite.png")); + event.registerEntityRenderer(TFEntities.CARMINITE_GHASTGUARD.get(), m -> new CarminiteGhastRenderer<>(m, new TFGhastModel<>(m.bakeLayer(TFModelLayers.CARMINITE_GHASTGUARD)), 3.0F)); + event.registerEntityRenderer(TFEntities.UR_GHAST.get(), m -> legacy.getAsBoolean() ? new LegacyUrGhastRenderer(m, new UrGhastLegacyModel(m.bakeLayer(TFModelLayers.LEGACY_UR_GHAST)), 8.0F, 24F) : new UrGhastRenderer(m, new UrGhastModel(m.bakeLayer(TFModelLayers.UR_GHAST)), 8.0F, 24F)); + event.registerEntityRenderer(TFEntities.BLOCKCHAIN_GOBLIN.get(), m -> legacy.getAsBoolean() ? new LegacyBlockChainGoblinRenderer<>(m, new BlockChainGoblinLegacyModel<>(m.bakeLayer(TFModelLayers.LEGACY_BLOCKCHAIN_GOBLIN)), 0.4F) : new BlockChainGoblinRenderer<>(m, new BlockChainGoblinModel<>(m.bakeLayer(TFModelLayers.BLOCKCHAIN_GOBLIN)), 0.4F)); + event.registerEntityRenderer(TFEntities.UPPER_GOBLIN_KNIGHT.get(), m -> legacy.getAsBoolean() ? new LegacyUpperGoblinKnightRenderer(m, new UpperGoblinKnightLegacyModel(m.bakeLayer(TFModelLayers.LEGACY_UPPER_GOBLIN_KNIGHT)), 0.625F) : new UpperGoblinKnightRenderer(m, new UpperGoblinKnightModel(m.bakeLayer(TFModelLayers.UPPER_GOBLIN_KNIGHT)), 0.625F)); + event.registerEntityRenderer(TFEntities.LOWER_GOBLIN_KNIGHT.get(), m -> new TFBipedRenderer<>(m, legacy.getAsBoolean() ? new LowerGoblinKnightLegacyModel(m.bakeLayer(TFModelLayers.LEGACY_LOWER_GOBLIN_KNIGHT)) : new LowerGoblinKnightModel(m.bakeLayer(TFModelLayers.LOWER_GOBLIN_KNIGHT)), 0.625F, "doublegoblin.png")); + event.registerEntityRenderer(TFEntities.HELMET_CRAB.get(), m -> new TFGenericMobRenderer<>(m, legacy.getAsBoolean() ? new HelmetCrabLegacyModel(m.bakeLayer(TFModelLayers.LEGACY_HELMET_CRAB)) : new HelmetCrabModel(m.bakeLayer(TFModelLayers.HELMET_CRAB)), 0.625F, "helmetcrab.png")); + event.registerEntityRenderer(TFEntities.KNIGHT_PHANTOM.get(), m -> new KnightPhantomRenderer(m, new KnightPhantomModel(m.bakeLayer(TFModelLayers.KNIGHT_PHANTOM)), 0.625F)); + event.registerEntityRenderer(TFEntities.NAGA.get(), m -> legacy.getAsBoolean() ? new LegacyNagaRenderer<>(m, new NagaLegacyModel<>(m.bakeLayer(TFModelLayers.LEGACY_NAGA)), 1.45F) : new NagaRenderer<>(m, new NagaModel<>(m.bakeLayer(TFModelLayers.NAGA)), 1.45F)); + event.registerEntityRenderer(TFEntities.SWARM_SPIDER.get(), SwarmSpiderRenderer::new); + event.registerEntityRenderer(TFEntities.KING_SPIDER.get(), KingSpiderRenderer::new); + event.registerEntityRenderer(TFEntities.CARMINITE_BROODLING.get(), CarminiteBroodlingRenderer::new); + event.registerEntityRenderer(TFEntities.HEDGE_SPIDER.get(), HedgeSpiderRenderer::new); + event.registerEntityRenderer(TFEntities.REDCAP_SAPPER.get(), m -> new TFBipedRenderer<>(m, legacy.getAsBoolean() ? new RedcapLegacyModel<>(m.bakeLayer(TFModelLayers.LEGACY_REDCAP)) : new RedcapModel<>(m.bakeLayer(TFModelLayers.REDCAP)), new RedcapModel<>(m.bakeLayer(TFModelLayers.REDCAP_ARMOR_INNER)), new RedcapModel<>(m.bakeLayer(TFModelLayers.REDCAP_ARMOR_OUTER)), 0.4F, "redcapsapper.png")); + event.registerEntityRenderer(TFEntities.MAZE_SLIME.get(), m -> new MazeSlimeRenderer(m, 0.625F)); + event.registerEntityRenderer(TFEntities.YETI.get(), m -> new TFBipedRenderer<>(m, new YetiModel<>(m.bakeLayer(TFModelLayers.YETI)), 0.625F, "yeti2.png")); + event.registerEntityRenderer(TFEntities.PROTECTION_BOX.get(), ProtectionBoxRenderer::new); + event.registerEntityRenderer(TFEntities.ALPHA_YETI.get(), m -> new TFBipedRenderer<>(m, new AlphaYetiModel(m.bakeLayer(TFModelLayers.ALPHA_YETI)), 1.75F, "yetialpha.png")); + event.registerEntityRenderer(TFEntities.WINTER_WOLF.get(), WinterWolfRenderer::new); + event.registerEntityRenderer(TFEntities.SNOW_GUARDIAN.get(), m -> new SnowGuardianRenderer(m, new NoopModel<>(m.bakeLayer(TFModelLayers.NOOP)))); + event.registerEntityRenderer(TFEntities.STABLE_ICE_CORE.get(), m -> new StableIceCoreRenderer(m, new StableIceCoreModel(m.bakeLayer(TFModelLayers.STABLE_ICE_CORE)))); + event.registerEntityRenderer(TFEntities.UNSTABLE_ICE_CORE.get(), m -> new UnstableIceCoreRenderer<>(m, new UnstableIceCoreModel<>(m.bakeLayer(TFModelLayers.UNSTABLE_ICE_CORE)))); + event.registerEntityRenderer(TFEntities.SNOW_QUEEN.get(), m -> legacy.getAsBoolean() ? new LegacySnowQueenRenderer(m, new SnowQueenLegacyModel(m.bakeLayer(TFModelLayers.LEGACY_SNOW_QUEEN))) : new SnowQueenRenderer(m, new SnowQueenModel(m.bakeLayer(TFModelLayers.SNOW_QUEEN)))); + event.registerEntityRenderer(TFEntities.TROLL.get(), m -> new TFBipedRenderer<>(m, legacy.getAsBoolean() ? new TrollLegacyModel(m.bakeLayer(TFModelLayers.LEGACY_TROLL)) : new TrollModel(m.bakeLayer(TFModelLayers.TROLL)), 0.625F, "troll.png")); + event.registerEntityRenderer(TFEntities.GIANT_MINER.get(), TFGiantRenderer::new); + event.registerEntityRenderer(TFEntities.ARMORED_GIANT.get(), TFGiantRenderer::new); + event.registerEntityRenderer(TFEntities.ICE_CRYSTAL.get(), IceCrystalRenderer::new); + event.registerEntityRenderer(TFEntities.CHAIN_BLOCK.get(), BlockChainRenderer::new); + event.registerEntityRenderer(TFEntities.CUBE_OF_ANNIHILATION.get(), CubeOfAnnihilationRenderer::new); + event.registerEntityRenderer(TFEntities.HARBINGER_CUBE.get(), HarbingerCubeRenderer::new); + event.registerEntityRenderer(TFEntities.ADHERENT.get(), AdherentRenderer::new); + event.registerEntityRenderer(TFEntities.ROVING_CUBE.get(), RovingCubeRenderer::new); + event.registerEntityRenderer(TFEntities.RISING_ZOMBIE.get(), m -> new TFBipedRenderer<>(m, new RisingZombieModel(m.bakeLayer(TFModelLayers.RISING_ZOMBIE)), new RisingZombieModel(m.bakeLayer(ModelLayers.ZOMBIE_INNER_ARMOR)), new RisingZombieModel(m.bakeLayer(ModelLayers.ZOMBIE_OUTER_ARMOR)), 0.5F, "textures/entity/zombie/zombie.png")); + event.registerEntityRenderer(TFEntities.PLATEAU_BOSS.get(), NoopRenderer::new); + + // projectiles + event.registerEntityRenderer(TFEntities.NATURE_BOLT.get(), ThrownItemRenderer::new); + event.registerEntityRenderer(TFEntities.LICH_BOLT.get(), c -> new CustomProjectileTextureRenderer(c, TwilightForestMod.prefix("textures/item/twilight_orb.png"))); + event.registerEntityRenderer(TFEntities.WAND_BOLT.get(), c -> new CustomProjectileTextureRenderer(c, TwilightForestMod.prefix("textures/item/twilight_orb.png"))); + event.registerEntityRenderer(TFEntities.TOME_BOLT.get(), ThrownItemRenderer::new); + event.registerEntityRenderer(TFEntities.HYDRA_MORTAR.get(), HydraMortarRenderer::new); + event.registerEntityRenderer(TFEntities.SLIME_BLOB.get(), ThrownItemRenderer::new); + event.registerEntityRenderer(TFEntities.MOONWORM_SHOT.get(), MoonwormShotRenderer::new); + event.registerEntityRenderer(TFEntities.CHARM_EFFECT.get(), ThrownItemRenderer::new); + event.registerEntityRenderer(TFEntities.LICH_BOMB.get(), ThrownItemRenderer::new); + event.registerEntityRenderer(TFEntities.THROWN_WEP.get(), ThrownWepRenderer::new); + event.registerEntityRenderer(TFEntities.FALLING_ICE.get(), FallingIceRenderer::new); + event.registerEntityRenderer(TFEntities.THROWN_ICE.get(), ThrownIceRenderer::new); + event.registerEntityRenderer(TFEntities.THROWN_BLOCK.get(), ThrownBlockRenderer::new); + event.registerEntityRenderer(TFEntities.ICE_SNOWBALL.get(), ThrownItemRenderer::new); + event.registerEntityRenderer(TFEntities.SLIDER.get(), SlideBlockRenderer::new); + event.registerEntityRenderer(TFEntities.SEEKER_ARROW.get(), DefaultArrowRenderer::new); + event.registerEntityRenderer(TFEntities.ICE_ARROW.get(), DefaultArrowRenderer::new); + } + + @OnlyIn(Dist.CLIENT) + @SuppressWarnings("deprecation") + public static class BakedMultiPartRenderers { + + private static final Map>> renderers = new HashMap<>(); + + public static void bakeMultiPartRenderers(EntityRendererProvider.Context context) { + boolean legacy = Minecraft.getInstance().getResourcePackRepository().getSelectedIds().contains("builtin/twilight_forest_classic_resources"); + renderers.put(TFPart.RENDERER, new LazyLoadedValue<>(() -> new NoopRenderer<>(context))); + renderers.put(HydraHead.RENDERER, new LazyLoadedValue<>(() -> legacy ? new LegacyHydraHeadRenderer(context) : new HydraHeadRenderer(context))); + renderers.put(HydraNeck.RENDERER, new LazyLoadedValue<>(() -> legacy ? new LegacyHydraNeckRenderer(context) : new HydraNeckRenderer(context))); + renderers.put(SnowQueenIceShield.RENDERER, new LazyLoadedValue<>(() -> new SnowQueenIceShieldLayer<>(context))); + renderers.put(NagaSegment.RENDERER, new LazyLoadedValue<>(() -> legacy ? new LegacyNagaSegmentRenderer<>(context) : new NagaSegmentRenderer<>(context))); + } + + public static EntityRenderer lookup(ResourceLocation location) { + return renderers.get(location).get(); + } + } + + private static Field field_EntityRenderersEvent$AddLayers_renderers; + + @SubscribeEvent + @SuppressWarnings("unchecked") + public static void attachRenderLayers(EntityRenderersEvent.AddLayers event) { + if (field_EntityRenderersEvent$AddLayers_renderers == null) { + try { + field_EntityRenderersEvent$AddLayers_renderers = EntityRenderersEvent.AddLayers.class.getDeclaredField("renderers"); + field_EntityRenderersEvent$AddLayers_renderers.setAccessible(true); + } catch (NoSuchFieldException e) { + e.printStackTrace(); + } + } + if (field_EntityRenderersEvent$AddLayers_renderers != null) { + event.getSkins().forEach(renderer -> { + LivingEntityRenderer> skin = event.getSkin(renderer); + attachRenderLayers(Objects.requireNonNull(skin)); + }); + try { + ((Map, EntityRenderer>) field_EntityRenderersEvent$AddLayers_renderers.get(event)).values().stream(). + filter(LivingEntityRenderer.class::isInstance).map(LivingEntityRenderer.class::cast).forEach(TFClientSetup::attachRenderLayers); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + } + } + + private static > void attachRenderLayers(LivingEntityRenderer renderer) { + renderer.addLayer(new ShieldLayer<>(renderer)); + renderer.addLayer(new IceLayer<>(renderer)); + } +} diff --git a/src/main/java/twilightforest/client/TFClientTicker.java b/src/main/java/twilightforest/client/TFClientTicker.java deleted file mode 100644 index c9ccf814d7..0000000000 --- a/src/main/java/twilightforest/client/TFClientTicker.java +++ /dev/null @@ -1,32 +0,0 @@ -package twilightforest.client; - -import net.minecraft.client.Minecraft; -import net.minecraft.world.World; -import twilightforest.world.WorldProviderTwilightForest; -import cpw.mods.fml.common.eventhandler.SubscribeEvent; -import cpw.mods.fml.common.gameevent.TickEvent.ClientTickEvent; - -public class TFClientTicker { - - - /** - * On the tick, we kill the vignette - */ - @SubscribeEvent - public void clientTick(ClientTickEvent event) { - Minecraft mc = Minecraft.getMinecraft(); - World world = mc.theWorld; - - - // only fire if we're in the twilight forest - if (world != null && (world.provider instanceof WorldProviderTwilightForest)) - { - // vignette - if (mc.ingameGUI != null) - { - mc.ingameGUI.prevVignetteBrightness = 0.0F; - } - - } - } -} \ No newline at end of file diff --git a/src/main/java/twilightforest/client/TFShaders.java b/src/main/java/twilightforest/client/TFShaders.java new file mode 100644 index 0000000000..adf09c4c2e --- /dev/null +++ b/src/main/java/twilightforest/client/TFShaders.java @@ -0,0 +1,28 @@ +package twilightforest.client; + +import com.mojang.blaze3d.vertex.DefaultVertexFormat; +import net.minecraft.client.renderer.ShaderInstance; +import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.client.event.RegisterShadersEvent; +import net.minecraftforge.eventbus.api.IEventBus; +import twilightforest.TwilightForestMod; + +import java.io.IOException; +import java.util.function.Consumer; + +public class TFShaders { + + public static ShaderInstance RED_THREAD; + + public static void init(IEventBus bus) { + bus.addListener((Consumer) event -> { + try { + event.registerShader(new ShaderInstance(event.getResourceProvider(), new ResourceLocation(TwilightForestMod.ID, "red_thread/red_thread"), DefaultVertexFormat. + BLOCK), shader -> RED_THREAD = shader); + } catch (IOException e) { + e.printStackTrace(); + } + }); + } + +} diff --git a/src/main/java/twilightforest/client/TwilightForestRenderInfo.java b/src/main/java/twilightforest/client/TwilightForestRenderInfo.java new file mode 100644 index 0000000000..3124220dda --- /dev/null +++ b/src/main/java/twilightforest/client/TwilightForestRenderInfo.java @@ -0,0 +1,75 @@ +package twilightforest.client; + +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.Camera; +import net.minecraft.client.Minecraft; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.renderer.DimensionSpecialEffects; +import net.minecraft.client.renderer.LightTexture; +import net.minecraft.core.BlockPos; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.phys.Vec3; +import org.jetbrains.annotations.Nullable; +import org.joml.Matrix4f; +import twilightforest.client.renderer.TFSkyRenderer; +import twilightforest.client.renderer.TFWeatherRenderer; +import twilightforest.init.TFBiomes; + +import java.util.Optional; + +public class TwilightForestRenderInfo extends DimensionSpecialEffects { + + public TwilightForestRenderInfo(float cloudHeight, boolean placebo, SkyType fogType, boolean brightenLightMap, boolean entityLightingBottomsLit) { + super(cloudHeight, placebo, fogType, brightenLightMap, entityLightingBottomsLit); + } + + @Nullable + @Override + public float[] getSunriseColor(float daycycle, float partialTicks) { // Fog color + return null; + } + + @Override + public Vec3 getBrightnessDependentFogColor(Vec3 biomeFogColor, float daylight) { // For modifying biome fog color with daycycle + return biomeFogColor.multiply(daylight * 0.94F + 0.06F, (daylight * 0.94F + 0.06F), (daylight * 0.91F + 0.09F)); + } + + @Override + public boolean isFoggyAt(int x, int y) { // true = nearFog + Player player = Minecraft.getInstance().player; + + if (player != null) { + Optional> biome = player.level.getBiome(player.blockPosition()).unwrapKey(); + if (biome.isPresent()) { + boolean spooky = biome.get() == TFBiomes.SPOOKY_FOREST; + + if (player.position().y > 20 && !spooky) { + return false; // If player is above the dark forest then no need to make it so spooky. The darkwood leaves cover everything as low as y42. + } + + return spooky || biome.get() == TFBiomes.DARK_FOREST || biome.get() == TFBiomes.DARK_FOREST_CENTER; + } + } + + return false; + + //Make the fog on these biomes much much darker, maybe pitch black even. Do we keep this harsher fog underground too? + } + + @Override + public boolean renderSky(ClientLevel level, int ticks, float partialTick, PoseStack poseStack, Camera camera, Matrix4f projectionMatrix, boolean isFoggy, Runnable setupFog) { + return TFSkyRenderer.renderSky(level, partialTick, poseStack, camera, projectionMatrix, setupFog); + } + + @Override + public boolean renderSnowAndRain(ClientLevel level, int ticks, float partialTick, LightTexture lightTexture, double camX, double camY, double camZ) { + return TFWeatherRenderer.renderSnowAndRain(level, ticks, partialTick, lightTexture, camX, camY, camZ); + } + + @Override + public boolean tickRain(ClientLevel level, int ticks, Camera camera) { + return TFWeatherRenderer.tickRain(level, ticks, camera.getBlockPosition()); + } +} diff --git a/src/main/java/twilightforest/client/UncraftingScreen.java b/src/main/java/twilightforest/client/UncraftingScreen.java new file mode 100644 index 0000000000..bfdaafa2db --- /dev/null +++ b/src/main/java/twilightforest/client/UncraftingScreen.java @@ -0,0 +1,275 @@ +package twilightforest.client; + +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.ChatFormatting; +import net.minecraft.client.gui.Font; +import net.minecraft.client.gui.GuiComponent; +import net.minecraft.client.gui.components.Button; +import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; +import net.minecraft.client.resources.language.I18n; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.inventory.Slot; +import net.minecraft.world.item.ItemStack; +import twilightforest.TFConfig; +import twilightforest.TwilightForestMod; +import twilightforest.data.tags.ItemTagGenerator; +import twilightforest.inventory.UncraftingMenu; +import twilightforest.network.TFPacketHandler; +import twilightforest.network.UncraftingGuiPacket; + +public class UncraftingScreen extends AbstractContainerScreen { + + private static final ResourceLocation TEXTURE = TwilightForestMod.getGuiTexture("guigoblintinkering.png"); + + public UncraftingScreen(UncraftingMenu container, Inventory player, Component name) { + super(container, player, name); + } + + @Override + protected void init() { + super.init(); + + this.addRenderableWidget(new CycleButton(this.leftPos + 40, this.topPos + 22, true, button -> { + TFPacketHandler.CHANNEL.sendToServer(new UncraftingGuiPacket(0)); + this.menu.unrecipeInCycle++; + this.menu.slotsChanged(this.menu.tinkerInput); + })); + this.addRenderableWidget(new CycleButton(this.leftPos + 40, this.topPos + 55, false, button -> { + TFPacketHandler.CHANNEL.sendToServer(new UncraftingGuiPacket(1)); + this.menu.unrecipeInCycle--; + this.menu.slotsChanged(this.menu.tinkerInput); + })); + + //this.buttonList.add(new ModeButton(uiLeft + 7, guiTop + 57)); + + this.addRenderableWidget(new CycleButtonMini(this.leftPos + 27, this.topPos + 56, true, button -> { + TFPacketHandler.CHANNEL.sendToServer(new UncraftingGuiPacket(2)); + this.menu.ingredientsInCycle++; + this.menu.slotsChanged(this.menu.tinkerInput); + })); + this.addRenderableWidget(new CycleButtonMini(this.leftPos + 27, this.topPos + 63, false, button -> { + TFPacketHandler.CHANNEL.sendToServer(new UncraftingGuiPacket(3)); + this.menu.ingredientsInCycle--; + this.menu.slotsChanged(this.menu.tinkerInput); + })); + + //this.buttonList.add(new RefreshButton(uiLeft + 26, guiTop + 57)); + + this.addRenderableWidget(new CycleButton(this.leftPos + 121, this.topPos + 22, true, button -> { + TFPacketHandler.CHANNEL.sendToServer(new UncraftingGuiPacket(4)); + this.menu.recipeInCycle++; + this.menu.slotsChanged(this.menu.assemblyMatrix); + })); + this.addRenderableWidget(new CycleButton(this.leftPos + 121, this.topPos + 55, false, button -> { + TFPacketHandler.CHANNEL.sendToServer(new UncraftingGuiPacket(5)); + this.menu.recipeInCycle--; + this.menu.slotsChanged(this.menu.assemblyMatrix); + })); + } + + @Override + public boolean mouseScrolled(double x, double y, double direction) { + boolean scrolled = super.mouseScrolled(x, y, direction); + + //ingredient buttons + if (x > this.leftPos + 27 && x < this.leftPos + 33 && y > this.topPos + 56 && y < this.topPos + 69) { + if (direction > 0) { + TFPacketHandler.CHANNEL.sendToServer(new UncraftingGuiPacket(2)); + this.menu.ingredientsInCycle++; + } else { + TFPacketHandler.CHANNEL.sendToServer(new UncraftingGuiPacket(3)); + this.menu.ingredientsInCycle--; + } + this.menu.slotsChanged(this.menu.tinkerInput); + } + + //uncrafting recipe buttons + if (x > this.leftPos + 40 && x < this.leftPos + 54 && y > this.topPos + 22 && y < this.topPos + 64) { + if (direction > 0) { + TFPacketHandler.CHANNEL.sendToServer(new UncraftingGuiPacket(0)); + this.menu.unrecipeInCycle++; + } else { + TFPacketHandler.CHANNEL.sendToServer(new UncraftingGuiPacket(1)); + this.menu.unrecipeInCycle--; + } + this.menu.slotsChanged(this.menu.tinkerInput); + } + + //recrafting recipe buttons + if (x > this.leftPos + 121 && x < this.leftPos + 135 && y > this.topPos + 22 && y < this.topPos + 64) { + if (direction > 0) { + TFPacketHandler.CHANNEL.sendToServer(new UncraftingGuiPacket(4)); + this.menu.recipeInCycle++; + } else { + TFPacketHandler.CHANNEL.sendToServer(new UncraftingGuiPacket(5)); + this.menu.recipeInCycle--; + } + this.menu.slotsChanged(this.menu.assemblyMatrix); + } + + return scrolled; + } + + @Override + public void render(PoseStack ms, int mouseX, int mouseY, float partialTicks) { + this.renderBackground(ms); + super.render(ms, mouseX, mouseY, partialTicks); + this.renderTooltip(ms, mouseX, mouseY); //renderHoveredToolTip + } + + @Override + protected void renderLabels(PoseStack ms, int mouseX, int mouseY) { + this.font.draw(ms, this.title, 6, 6, 4210752); + if (TFConfig.COMMON_CONFIG.UNCRAFTING_STUFFS.disableUncrafting.get()) { + this.font.draw(ms, Component.translatable("container.twilightforest.uncrafting_table.disabled").withStyle(ChatFormatting.DARK_RED), 6, this.imageHeight - 96 + 2, 4210752); + } else { + this.font.draw(ms, I18n.get("container.inventory"), 7, this.imageHeight - 96 + 2, 4210752); + } + } + + @Override + protected void renderBg(PoseStack ms, float partialTicks, int mouseX, int mouseY) { + RenderSystem.setShaderColor(1, 1, 1, 1); + RenderSystem._setShaderTexture(0, TEXTURE); + int frameX = (this.width - this.imageWidth) / 2; + int frameY = (this.height - this.imageHeight) / 2; + blit(ms, frameX, frameY, 0, 0, this.imageWidth, this.imageHeight); + + UncraftingMenu tfContainer = this.menu; + + // show uncrafting ingredients as background + ms.pushPose(); + ms.translate(this.leftPos, this.topPos, 0); + + for (int i = 0; i < 9; i++) { + Slot uncrafting = tfContainer.getSlot(2 + i); + Slot assembly = tfContainer.getSlot(11 + i); + + if (uncrafting.hasItem()) { + this.drawSlotAsBackground(ms, uncrafting, assembly); + } + } + ms.popPose(); + + // show the costs if there are any + Font fontRendererObj = this.minecraft.font; + + int costVal = tfContainer.getUncraftingCost(); + if (costVal > 0) { + int color; + String cost = "" + costVal; + if (this.minecraft.player.experienceLevel < costVal && !this.minecraft.player.getAbilities().instabuild) { + color = 0xA00000; + } else { + color = 0x80FF20; + } + fontRendererObj.drawShadow(ms, cost, frameX + 48 - fontRendererObj.width(cost), frameY + 38, color); + } + + costVal = tfContainer.getRecraftingCost(); + if (costVal > 0) { + int color; + String cost = "" + costVal; + if (this.minecraft.player.experienceLevel < costVal && !this.minecraft.player.getAbilities().instabuild) { + color = 0xA00000; + } else { + color = 0x80FF20; + } + fontRendererObj.drawShadow(ms, cost, frameX + 130 - fontRendererObj.width(cost), frameY + 38, color); + } + } + + private void drawSlotAsBackground(PoseStack ms, Slot backgroundSlot, Slot appearSlot) { + + int screenX = appearSlot.x; + int screenY = appearSlot.y; + ItemStack itemStackToRender = backgroundSlot.getItem(); + + this.itemRenderer.renderGuiItem(ms, itemStackToRender, screenX, screenY); + this.itemRenderer.renderGuiItemDecorations(ms, this.font, itemStackToRender, screenX, screenY, ""); + + boolean itemBroken = UncraftingMenu.isMarked(itemStackToRender); + + // draw 50% gray rectangle over the item + RenderSystem.disableDepthTest(); + GuiComponent.fill(ms, appearSlot.x, appearSlot.y, appearSlot.x + 16, appearSlot.y + 16, itemBroken ? 0x80FF8b8b : 0x9f8b8b8b); + RenderSystem.enableDepthTest(); + } + + @Override + protected void renderTooltip(PoseStack pPoseStack, int pX, int pY) { + UncraftingMenu container = this.menu; + + for (int i = 0; i < 9; i++) { + if (container.getCarried().isEmpty() && container.slots.get(2 + i).hasItem() && this.hoveredSlot == container.slots.get(11 + i) && !container.slots.get(11 + i).hasItem()) { + this.renderTooltip(pPoseStack, container.slots.get(2 + i).getItem(), pX, pY); + } + } + + //check if we're hovering over a banned uncraftable item + if (container.slots.get(0).hasItem() && container.slots.get(0).getItem().is(ItemTagGenerator.BANNED_UNCRAFTABLES) && container.slots.get(0).equals(hoveredSlot)) { + this.renderTooltip(pPoseStack, Component.translatable("container.twilightforest.uncrafting_table.disabled_item").withStyle(ChatFormatting.RED), pX, pY); + } else { + super.renderTooltip(pPoseStack, pX, pY); + } + } + + private static class CycleButton extends Button { + private final boolean up; + + CycleButton(int x, int y, boolean up, OnPress onClick) { + super(x, y, 14, 9, Component.empty(), onClick, message -> Component.empty()); + this.up = up; + } + + @Override + public void renderWidget(PoseStack ms, int mouseX, int mouseY, float partialTicks) { + if (this.visible) { + RenderSystem._setShaderTexture(0, UncraftingScreen.TEXTURE); + RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); + this.isHovered = mouseX >= this.getX() && mouseY >= this.getY() && mouseX < this.getX() + this.width && mouseY < this.getY() + this.height; + + int textureX = 176; + int textureY = 0; + + if (this.isHovered) textureX += this.width; + + // what's up + if (!this.up) textureY += this.height; + + blit(ms, this.getX(), this.getY(), textureX, textureY, this.width, this.height); + } + } + } + + private static class CycleButtonMini extends Button { + private final boolean up; + + CycleButtonMini(int x, int y, boolean up, OnPress onClick) { + super(x, y, 8, 6, Component.empty(), onClick, message -> Component.empty()); + this.up = up; + } + + @Override + public void renderWidget(PoseStack ms, int mouseX, int mouseY, float partialTicks) { + if (this.visible) { + RenderSystem._setShaderTexture(0, UncraftingScreen.TEXTURE); + RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); + this.isHovered = mouseX >= this.getX() && mouseY >= this.getY() && mouseX < this.getX() + this.width && mouseY < this.getY() + this.height; + + int textureX = 176; + int textureY = 41; + + if (this.isHovered) textureX += this.width; + + // what's up + if (!this.up) textureY += this.height; + + blit(ms, this.getX(), this.getY(), textureX, textureY, this.width, this.height); + } + } + } +} diff --git a/src/main/java/twilightforest/client/model/ModelTFAdherent.java b/src/main/java/twilightforest/client/model/ModelTFAdherent.java deleted file mode 100644 index a2472c2b38..0000000000 --- a/src/main/java/twilightforest/client/model/ModelTFAdherent.java +++ /dev/null @@ -1,91 +0,0 @@ -package twilightforest.client.model; - -import org.lwjgl.opengl.GL11; - -import net.minecraft.client.model.ModelBiped; -import net.minecraft.client.model.ModelRenderer; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.util.MathHelper; - -public class ModelTFAdherent extends ModelBiped { - - ModelRenderer leftSleeve; - ModelRenderer rightSleeve; - - public ModelTFAdherent() { - - this.bipedHeadwear = new ModelRenderer(this, 0, 0); - this.bipedLeftLeg = new ModelRenderer(this, 0, 0); - this.bipedRightLeg = new ModelRenderer(this, 0, 0); - - this.bipedHead = new ModelRenderer(this, 0, 0); - this.bipedHead.addBox(-4F, -8F, -4F, 8, 8, 8); - this.bipedHead.setRotationPoint(0F, 0F, 0F); - - this.bipedBody = new ModelRenderer(this, 32, 0); - this.bipedBody.addBox(-4F, 0F, -2F, 8, 24, 4); - this.bipedBody.setRotationPoint(0F, 0F, 0F); - - this.bipedRightArm = new ModelRenderer(this, 0, 16); - this.bipedRightArm.addBox(-3F, -2F, -2F, 4, 12, 4); - this.bipedRightArm.setRotationPoint(-5F, 2F, 0F); - - this.bipedLeftArm = new ModelRenderer(this, 0, 16); - this.bipedLeftArm.addBox(-1F, -2F, -2F, 4, 12, 4); - this.bipedLeftArm.setRotationPoint(5F, 2F, 0F); - - this.leftSleeve = new ModelRenderer(this, 16, 16); - this.leftSleeve.addBox(-1F, -2F, 2F, 4, 12, 4); - this.leftSleeve.setRotationPoint(0F, 0F, 0F); - - this.bipedLeftArm.addChild(this.leftSleeve); - - this.rightSleeve = new ModelRenderer(this, 16, 16); - this.rightSleeve.addBox(-3F, -2F, 2F, 4, 12, 4); - this.rightSleeve.setRotationPoint(0F, 0F, 0F); - - this.bipedRightArm.addChild(this.rightSleeve); - - } - - /** - * Sets the model's various rotation angles. For bipeds, par1 and par2 are used for animating the movement of arms - * and legs, where par1 represents the time(so that arms and legs swing back and forth) and par2 represents how - * "far" arms and legs can swing at most. - */ - - @Override - public void setRotationAngles(float f, float f1, float f2, float yaw, float pitch, float time, Entity entity) - { - //super.setRotationAngles(f, f1, f2, yaw, pitch, time, entity); - - // rotate head normally - this.bipedHead.rotateAngleY = yaw / (180F / (float)Math.PI); - this.bipedHead.rotateAngleX = pitch / (180F / (float)Math.PI); - - // wave arms more - this.bipedRightArm.rotateAngleX = 0.0F;//MathHelper.cos(f * 0.6662F + (float)Math.PI) * 2.0F * f1 * 0.5F; - this.bipedLeftArm.rotateAngleX = 0.0F;//MathHelper.cos(f * 0.6662F) * 2.0F * f1 * 0.5F; - this.bipedRightArm.rotateAngleZ = 0.0F; - this.bipedLeftArm.rotateAngleZ = 0.0F; - - - this.bipedRightArm.rotateAngleZ += MathHelper.cos((f2 + 10F) * 0.133F) * 0.3F + 0.3F; - this.bipedLeftArm.rotateAngleZ -= MathHelper.cos((f2 + 10F) * 0.133F) * 0.3F + 0.3F; - this.bipedRightArm.rotateAngleX += MathHelper.sin(f2 * 0.067F) * 0.05F; - this.bipedLeftArm.rotateAngleX -= MathHelper.sin(f2 * 0.067F) * 0.05F; - } - - /** - * Used for easily adding entity-dependent animations. The second and third float params here are the same second - * and third as in the setRotationAngles method. - */ - @Override - public void setLivingAnimations(EntityLivingBase par1EntityLiving, float par2, float par3, float partialTick) { - float bounce = par1EntityLiving.ticksExisted + partialTick; - - // this is where we add the floating - GL11.glTranslatef(0F, -0.125F - MathHelper.sin((bounce) * 0.133F) * 0.1F, 0F); - } -} diff --git a/src/main/java/twilightforest/client/model/ModelTFArcticArmor.java b/src/main/java/twilightforest/client/model/ModelTFArcticArmor.java deleted file mode 100644 index db107ac571..0000000000 --- a/src/main/java/twilightforest/client/model/ModelTFArcticArmor.java +++ /dev/null @@ -1,92 +0,0 @@ -package twilightforest.client.model; - -import net.minecraft.client.model.ModelBiped; -import net.minecraft.client.model.ModelRenderer; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; - -public class ModelTFArcticArmor extends ModelBiped { - - public ModelTFArcticArmor(int part, float expand) { - super(expand); - - ModelRenderer rightHood = new ModelRenderer(this, 0, 0); - rightHood.addBox(-1.0F, -2.0F, -1.0F, 1, 4, 1, expand); - rightHood.setRotationPoint(-2.5F, -3.0F, -5.0F); - this.bipedHead.addChild(rightHood); - - ModelRenderer leftHood = new ModelRenderer(this, 0, 0); - leftHood.addBox(0.0F, -2.0F, -1.0F, 1, 4, 1, expand); - leftHood.setRotationPoint(2.5F, -3.0F, -5.0F); - this.bipedHead.addChild(leftHood); - - ModelRenderer topHood = new ModelRenderer(this, 24, 0); - topHood.addBox(-2.0F, -1.0F, -1.0F, 4, 1, 1, expand); - topHood.setRotationPoint(0.0F, -5.5F, -5.0F); - this.bipedHead.addChild(topHood); - - ModelRenderer bottomHood = new ModelRenderer(this, 24, 0); - bottomHood.addBox(-2.0F, -1.0F, -1.0F, 4, 1, 1, expand); - bottomHood.setRotationPoint(0.0F, 0.5F, -5.0F); - this.bipedHead.addChild(bottomHood); - - - switch (part) { - case 0: // helmet - this.bipedHead.showModel = true; - this.bipedHeadwear.showModel = false; - this.bipedBody.showModel = false; - this.bipedRightArm.showModel = false; - this.bipedLeftArm.showModel = false; - this.bipedRightLeg.showModel = false; - this.bipedLeftLeg.showModel = false; - break; - case 1: // chest - this.bipedHead.showModel = false; - this.bipedHeadwear.showModel = false; - this.bipedBody.showModel = true; - this.bipedRightArm.showModel = true; - this.bipedLeftArm.showModel = true; - this.bipedRightLeg.showModel = false; - this.bipedLeftLeg.showModel = false; - break; - case 2: // pants - this.bipedHead.showModel = false; - this.bipedHeadwear.showModel = false; - this.bipedBody.showModel = true; - this.bipedRightArm.showModel = false; - this.bipedLeftArm.showModel = false; - this.bipedRightLeg.showModel = true; - this.bipedLeftLeg.showModel = true; - break; - case 3: // boots - this.bipedHead.showModel = false; - this.bipedHeadwear.showModel = false; - this.bipedBody.showModel = false; - this.bipedRightArm.showModel = false; - this.bipedLeftArm.showModel = false; - this.bipedRightLeg.showModel = true; - this.bipedLeftLeg.showModel = true; - break; - } - - } - - /** - * Sets the models various rotation angles then renders the model. - */ - @Override - public void render(Entity par1Entity, float par2, float par3, float par4, float par5, float par6, float par7) { - - if (par1Entity != null) { - this.isSneak = par1Entity.isSneaking(); - } - - if (par1Entity != null && par1Entity instanceof EntityLivingBase) { - this.heldItemRight = ((EntityLivingBase)par1Entity).getHeldItem() != null ? 1 : 0; - } - - super.render(par1Entity, par2, par3, par4, par5, par6, par7); - } - -} diff --git a/src/main/java/twilightforest/client/model/ModelTFBighorn.java b/src/main/java/twilightforest/client/model/ModelTFBighorn.java deleted file mode 100644 index eb8df5509c..0000000000 --- a/src/main/java/twilightforest/client/model/ModelTFBighorn.java +++ /dev/null @@ -1,52 +0,0 @@ -package twilightforest.client.model; - -import net.minecraft.client.model.ModelRenderer; -import net.minecraft.client.model.ModelSheep1; - - -public class ModelTFBighorn extends ModelSheep1 -{ - - public ModelTFBighorn() - { - super(); - head = new ModelRenderer(this, 0, 0); - head.addBox(-3F, -4F, -6F, 6, 6, 7, 0F); - head.setRotationPoint(0F, 6F, -8F); - - body = new ModelRenderer(this, 36, 10); - body.addBox(-4F, -9F, -7F, 8, 15, 6, 0F); - body.setRotationPoint(0F, 5F, 2F); - - leg1 = new ModelRenderer(this, 0, 16); - leg1.addBox(-2F, 0.0F, -2F, 4, 12, 4, 0F); - leg1.setRotationPoint(-3F, 12F, 7F); - - leg2 = new ModelRenderer(this, 0, 16); - leg2.addBox(-2F, 0.0F, -2F, 4, 12, 4, 0F); - leg2.setRotationPoint(3F, 12F, 7F); - - leg3 = new ModelRenderer(this, 0, 16); - leg3.addBox(-2F, 0.0F, -2F, 4, 12, 4, 0F); - leg3.setRotationPoint(-3F, 12F, -5F); - - leg4 = new ModelRenderer(this, 0, 16); - leg4.addBox(-2F, 0.0F, -2F, 4, 12, 4, 0F); - leg4.setRotationPoint(3F, 12F, -5F); - - // curly horn 1 - head.setTextureOffset(28, 16).addBox(-5F, -4F, -4F, 2, 2, 2, 0F); - head.setTextureOffset(16, 13).addBox(-6F, -5F, -3F, 2, 2, 4, 0F); - head.setTextureOffset(16, 19).addBox(-7F, -4F, 0F, 2, 5, 2, 0F); - head.setTextureOffset(18, 27).addBox(-8F, 0F, -2F, 2, 2, 3, 0F); - head.setTextureOffset(28, 27).addBox(-9F, -1F, -3F, 2, 2, 1, 0F); - - // curly horn 2 - head.setTextureOffset(28, 16).addBox(3F, -4F, -4F, 2, 2, 2, 0F); - head.setTextureOffset(16, 13).addBox(4F, -5F, -3F, 2, 2, 4, 0F); - head.setTextureOffset(16, 19).addBox(5F, -4F, 0F, 2, 5, 2, 0F); - head.setTextureOffset(18, 27).addBox(6F, 0F, -2F, 2, 2, 3, 0F); - head.setTextureOffset(28, 27).addBox(7F, -1F, -3F, 2, 2, 1, 0F); - } - -} diff --git a/src/main/java/twilightforest/client/model/ModelTFBighornFur.java b/src/main/java/twilightforest/client/model/ModelTFBighornFur.java deleted file mode 100644 index b5e3134e51..0000000000 --- a/src/main/java/twilightforest/client/model/ModelTFBighornFur.java +++ /dev/null @@ -1,33 +0,0 @@ -package twilightforest.client.model; - -import net.minecraft.client.model.ModelRenderer; -import net.minecraft.client.model.ModelSheep2; - - -public class ModelTFBighornFur extends ModelSheep2 -{ - - public ModelTFBighornFur() - { - super(); - head = new ModelRenderer(this, 0, 0); - head.addBox(-3F, -4F, -4F, 6, 6, 6, 0.6F); - head.setRotationPoint(0.0F, 6F, -8F); - body = new ModelRenderer(this, 28, 8); - body.addBox(-4F, -9F, -7F, 8, 15, 6, 0.5F); - body.setRotationPoint(0.0F, 5F, 2.0F); - float f = 0.4F; - leg1 = new ModelRenderer(this, 0, 16); - leg1.addBox(-2F, 0.0F, -2F, 4, 6, 4, f); - leg1.setRotationPoint(-3F, 12F, 7F); - leg2 = new ModelRenderer(this, 0, 16); - leg2.addBox(-2F, 0.0F, -2F, 4, 6, 4, f); - leg2.setRotationPoint(3F, 12F, 7F); - leg3 = new ModelRenderer(this, 0, 16); - leg3.addBox(-2F, 0.0F, -2F, 4, 6, 4, f); - leg3.setRotationPoint(-3F, 12F, -5F); - leg4 = new ModelRenderer(this, 0, 16); - leg4.addBox(-2F, 0.0F, -2F, 4, 6, 4, f); - leg4.setRotationPoint(3F, 12F, -5F); - } -} diff --git a/src/main/java/twilightforest/client/model/ModelTFBlockGoblin.java b/src/main/java/twilightforest/client/model/ModelTFBlockGoblin.java deleted file mode 100644 index 9ccc95c91d..0000000000 --- a/src/main/java/twilightforest/client/model/ModelTFBlockGoblin.java +++ /dev/null @@ -1,206 +0,0 @@ -package twilightforest.client.model; - -import net.minecraft.client.model.ModelBiped; -import net.minecraft.client.model.ModelRenderer; -import net.minecraft.entity.Entity; - - -public class ModelTFBlockGoblin extends ModelBiped -{ - public ModelRenderer helmet; - - ModelRenderer block; - ModelRenderer[] spikes = new ModelRenderer[27]; - - public ModelTFBlockGoblin() - { - bipedHead = new ModelRenderer(this, 0, 0); - bipedHead.addBox(0F, 0F, 0F, 0, 0, 0, 0F); - bipedHead.setRotationPoint(0F, 11F, 0F); - - bipedHeadwear = new ModelRenderer(this, 0, 0); - bipedHeadwear.addBox(0F, 0F, 0F, 0, 0, 0, 0.5F); - bipedHeadwear.setRotationPoint(0F, 11F, 0F); - - this.helmet = new ModelRenderer(this, 24, 0); - this.helmet.addBox(-2.5F, -9.0F, -2.5F, 5, 9, 5); - this.helmet.rotateAngleY = 45F / (180F / (float)Math.PI); - - this.bipedHeadwear.addChild(helmet); - - bipedBody = new ModelRenderer(this, 0, 21); - bipedBody.addBox(-3.5F, 0F, -2F, 7, 7, 4, 0F); - bipedBody.setRotationPoint(0F, 11F, 0F); - - bipedRightArm = new ModelRenderer(this, 52, 0); - bipedRightArm.addBox(-3F, -1F, -2F, 3, 12, 3, 0F); - bipedRightArm.setRotationPoint(-3.5F, 12F, 0F); - - bipedLeftArm = new ModelRenderer(this, 52, 0); - bipedLeftArm.addBox(0F, -1F, -1.5F, 3, 12, 3, 0F); - bipedLeftArm.setRotationPoint(3.5F, 12F, 0F); - - bipedRightLeg = new ModelRenderer(this, 0, 12); - bipedRightLeg.addBox(-1.5F, 0F, -1.5F, 3, 6, 3, 0F); - bipedRightLeg.setRotationPoint(-2F, 18F, 0F); - - bipedLeftLeg = new ModelRenderer(this, 0, 12); - bipedLeftLeg.addBox(-1.5F, 0F, -1.5F, 3, 6, 3, 0F); - bipedLeftLeg.setRotationPoint(2F, 18F, 0F); - - block = new ModelRenderer(this, 32, 16); - block.addBox(-4F, -8F, -4F, 8, 8, 8, 0F); - block.setRotationPoint(6F, 0F, 0F); - - for (int i = 0; i < spikes.length; i++) - { - spikes[i] = new ModelRenderer(this, 56, 16); - spikes[i].addBox(-1F, -1F, -1F, 2, 2, 2, 0F); - block.addChild(spikes[i]); - } - - // X - spikes[2].rotationPointX = 4; - spikes[3].rotationPointX = 4; - spikes[4].rotationPointX = 4; - spikes[11].rotationPointX = 4; - spikes[12].rotationPointX = 5; - spikes[13].rotationPointX = 4; - spikes[20].rotationPointX = 4; - spikes[21].rotationPointX = 4; - spikes[22].rotationPointX = 4; - - spikes[6].rotationPointX = -4; - spikes[7].rotationPointX = -4; - spikes[8].rotationPointX = -4; - spikes[15].rotationPointX = -4; - spikes[16].rotationPointX = -5; - spikes[17].rotationPointX = -4; - spikes[24].rotationPointX = -4; - spikes[25].rotationPointX = -4; - spikes[26].rotationPointX = -4; - - // Y - spikes[0].rotationPointY = -9; - spikes[1].rotationPointY = -8; - spikes[2].rotationPointY = -8; - spikes[3].rotationPointY = -8; - spikes[4].rotationPointY = -8; - spikes[5].rotationPointY = -8; - spikes[6].rotationPointY = -8; - spikes[7].rotationPointY = -8; - spikes[8].rotationPointY = -8; - - spikes[9].rotationPointY = -4; // this spike is not really there - spikes[10].rotationPointY = -4; - spikes[11].rotationPointY = -4; - spikes[12].rotationPointY = -4; - spikes[13].rotationPointY = -4; - spikes[14].rotationPointY = -4; - spikes[15].rotationPointY = -4; - spikes[16].rotationPointY = -4; - spikes[17].rotationPointY = -4; - - spikes[18].rotationPointY = 1; - - // Z - spikes[1].rotationPointZ = 4; - spikes[2].rotationPointZ = 4; - spikes[8].rotationPointZ = 4; - spikes[10].rotationPointZ = 4; - spikes[11].rotationPointZ = 5; - spikes[17].rotationPointZ = 4; - spikes[19].rotationPointZ = 4; - spikes[20].rotationPointZ = 4; - spikes[26].rotationPointZ = 4; - - spikes[4].rotationPointZ = -4; - spikes[5].rotationPointZ = -4; - spikes[6].rotationPointZ = -4; - spikes[13].rotationPointZ = -4; - spikes[14].rotationPointZ = -5; - spikes[15].rotationPointZ = -4; - spikes[22].rotationPointZ = -4; - spikes[23].rotationPointZ = -4; - spikes[24].rotationPointZ = -4; - - // rotation - float fourtyFive = (float) (Math.PI / 4F); - - spikes[1].rotateAngleX = fourtyFive; - spikes[5].rotateAngleX = fourtyFive; - spikes[19].rotateAngleX = fourtyFive; - spikes[23].rotateAngleX = fourtyFive; - - spikes[11].rotateAngleY = fourtyFive; - spikes[13].rotateAngleY = fourtyFive; - spikes[15].rotateAngleY = fourtyFive; - spikes[17].rotateAngleY = fourtyFive; - - spikes[3].rotateAngleZ = fourtyFive; - spikes[7].rotateAngleZ = fourtyFive; - spikes[21].rotateAngleZ = fourtyFive; - spikes[25].rotateAngleZ = fourtyFive; - - spikes[2].rotateAngleX = -55F / (180F / (float)Math.PI); - spikes[2].rotateAngleY = fourtyFive; - spikes[24].rotateAngleX = -55F / (180F / (float)Math.PI); - spikes[24].rotateAngleY = fourtyFive; - - spikes[4].rotateAngleX = -35F / (180F / (float)Math.PI); - spikes[4].rotateAngleY = -fourtyFive; - spikes[26].rotateAngleX = -35F / (180F / (float)Math.PI); - spikes[26].rotateAngleY = -fourtyFive; - - spikes[6].rotateAngleY = fourtyFive; - spikes[6].rotateAngleX = -35F / (180F / (float)Math.PI); - spikes[20].rotateAngleY = fourtyFive; - spikes[20].rotateAngleX = -35F / (180F / (float)Math.PI); - - spikes[8].rotateAngleX = -55F / (180F / (float)Math.PI); - spikes[8].rotateAngleY = -fourtyFive; - spikes[22].rotateAngleX = -55F / (180F / (float)Math.PI); - spikes[22].rotateAngleY = -fourtyFive; - - } - - @Override - public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { - super.render(entity, f, f1, f2, f3, f4, f5); - - //block.render(f5); - } - - @Override - public void setRotationAngles(float f, float f1, float f2, float yaw, float pitch, float time, Entity entity) - { - aimedBow = false; - super.setRotationAngles(f, f1, f2, yaw, pitch, time, entity); - - bipedHead.rotationPointY = 11.0F; - bipedHeadwear.rotationPointY = 11.0F; - bipedBody.rotationPointY = 11F; - - bipedRightLeg.rotationPointY = 18F; - bipedLeftLeg.rotationPointY = 18F; - - bipedRightArm.setRotationPoint(-3.5F, 12F, 0F); - - bipedRightArm.rotateAngleX += Math.PI; - - bipedLeftArm.setRotationPoint(3.5F, 12F, 0F); - - - bipedLeftArm.rotateAngleX += Math.PI; - - float angle = f2 / 4F; - float length = 0;//16F; - - block.rotationPointX = (float) Math.sin(angle) * length; - block.rotationPointZ = (float) -Math.cos(angle) * length; - - - block.rotateAngleY = -angle; - - } -} diff --git a/src/main/java/twilightforest/client/model/ModelTFBoar.java b/src/main/java/twilightforest/client/model/ModelTFBoar.java deleted file mode 100644 index 150f7d80f1..0000000000 --- a/src/main/java/twilightforest/client/model/ModelTFBoar.java +++ /dev/null @@ -1,48 +0,0 @@ -package twilightforest.client.model; - -import net.minecraft.client.model.ModelQuadruped; -import net.minecraft.client.model.ModelRenderer; - - -public class ModelTFBoar extends ModelQuadruped -{ - public ModelTFBoar() - { - super(6, 0.0F); - - // head height for baby - field_78145_g = 4F; - - head = new ModelRenderer(this, 0, 0); - head.addBox(-4F, -2F, -6F, 8, 7, 6, 0F); - head.setRotationPoint(0F, 12F, -6F); - - body = new ModelRenderer(this, 28, 10); - body.addBox(-5F, -8F, -7F, 10, 14, 8, 0F); - body.setRotationPoint(0F, 11F, 2F); - - body.rotateAngleX = 1.570796F; - - leg1 = new ModelRenderer(this, 0, 16); - leg1.addBox(-2F, 0F, -2F, 4, 6, 4, 0F); - leg1.setRotationPoint(-3F, 18F, 7F); - - leg2 = new ModelRenderer(this, 0, 16); - leg2.addBox(-2F, 0F, -2F, 4, 6, 4, 0F); - leg2.setRotationPoint(3F, 18F, 7F); - - leg3 = new ModelRenderer(this, 0, 16); - leg3.addBox(-2F, 0F, -2F, 4, 6, 4, 0F); - leg3.setRotationPoint(-3F, 18F, -5F); - - leg4 = new ModelRenderer(this, 0, 16); - leg4.addBox(-2F, 0F, -2F, 4, 6, 4, 0F); - leg4.setRotationPoint(3F, 18F, -5F); - - head.setTextureOffset(28, 0).addBox(-3F, 1F, -9F, 6, 4, 3, 0F); // snout - - head.setTextureOffset(17, 17).addBox(3F, 2F, -9F, 1, 2, 1, 0F); // tusk1 - head.setTextureOffset(17, 17).addBox(-4F, 2F, -9F, 1, 2, 1, 0F); // tusk2 - } - -} diff --git a/src/main/java/twilightforest/client/model/ModelTFBunny.java b/src/main/java/twilightforest/client/model/ModelTFBunny.java deleted file mode 100644 index 7a08a2951b..0000000000 --- a/src/main/java/twilightforest/client/model/ModelTFBunny.java +++ /dev/null @@ -1,113 +0,0 @@ -// Date: 4/28/2012 9:36:32 AM -// Template version 1.1 -// Java generated by Techne -// Keep in mind that you still need to fill in some blanks -// - ZeuX - -package twilightforest.client.model; - -import net.minecraft.client.model.ModelBase; -import net.minecraft.client.model.ModelRenderer; -import net.minecraft.entity.Entity; -import net.minecraft.util.MathHelper; - - -public class ModelTFBunny extends ModelBase -{ - //fields - ModelRenderer tail; - ModelRenderer body; - ModelRenderer leg1; - ModelRenderer leg2; - ModelRenderer leg3; - ModelRenderer leg4; - ModelRenderer head; - - public ModelTFBunny() - { - textureWidth = 32; - textureHeight = 32; - setTextureOffset("head.head", 0, 0); - setTextureOffset("head.ear2", 16, 0); - setTextureOffset("head.ear1", 16, 0); - - tail = new ModelRenderer(this, 0, 18); - tail.addBox(-1F, -1F, 0F, 2, 2, 2); - tail.setRotationPoint(0F, 20F, 3F); - tail.setTextureSize(32, 32); - tail.mirror = true; - setRotation(tail, 0F, 0F, 0F); - body = new ModelRenderer(this, 0, 8); - body.addBox(-2F, -1F, -2F, 4, 3, 5); - body.setRotationPoint(0F, 21F, 0F); - body.setTextureSize(32, 32); - body.mirror = true; - setRotation(body, 0F, 0F, 0F); - leg1 = new ModelRenderer(this, 0, 16); - leg1.addBox(0F, 0F, 0F, 1, 1, 1); - leg1.setRotationPoint(-2F, 23F, 2F); - leg1.setTextureSize(32, 32); - leg1.mirror = true; - setRotation(leg1, 0F, 0F, 0F); - leg2 = new ModelRenderer(this, 0, 16); - leg2.addBox(0F, 0F, 0F, 1, 1, 1); - leg2.setRotationPoint(1F, 23F, 2F); - leg2.setTextureSize(32, 32); - leg2.mirror = true; - setRotation(leg2, 0F, 0F, 0F); - leg3 = new ModelRenderer(this, 0, 16); - leg3.addBox(0F, 0F, 0F, 1, 1, 1); - leg3.setRotationPoint(-2F, 23F, -2F); - leg3.setTextureSize(32, 32); - leg3.mirror = true; - setRotation(leg3, 0F, 0F, 0F); - leg4 = new ModelRenderer(this, 0, 16); - leg4.addBox(0F, 0F, 0F, 1, 1, 1); - leg4.setRotationPoint(1F, 23F, -2F); - leg4.setTextureSize(32, 32); - leg4.mirror = true; - setRotation(leg4, 0F, 0F, 0F); - head = new ModelRenderer(this, "head"); - head.setRotationPoint(0F, 22F, -1F); - setRotation(head, 0F, 0F, 0F); - head.mirror = true; - head.addBox("head", -2F, -4F, -3F, 4, 4, 4); - head.addBox("ear2", -2.5F, -8F, -0.5F, 2, 4, 1); - head.addBox("ear1", 0.5F, -8F, -0.5F, 2, 4, 1); - } - - public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) - { - super.render(entity, f, f1, f2, f3, f4, f5); - setRotationAngles(f, f1, f2, f3, f4, f5); - tail.render(f5); - body.render(f5); - leg1.render(f5); - leg2.render(f5); - leg3.render(f5); - leg4.render(f5); - head.render(f5); - } - - private void setRotation(ModelRenderer model, float x, float y, float z) - { - model.rotateAngleX = x; - model.rotateAngleY = y; - model.rotateAngleZ = z; - } - - /** - * Sets the models various rotation angles. - */ - public void setRotationAngles(float par1, float par2, float par3, float par4, float par5, float par6) - { - this.head.rotateAngleX = par5 / (180F / (float)Math.PI); - this.head.rotateAngleY = par4 / (180F / (float)Math.PI); - this.leg1.rotateAngleX = MathHelper.cos(par1 * 0.6662F) * 1.4F * par2; - this.leg2.rotateAngleX = MathHelper.cos(par1 * 0.6662F + (float)Math.PI) * 1.4F * par2; - this.leg3.rotateAngleX = MathHelper.cos(par1 * 0.6662F + (float)Math.PI) * 1.4F * par2; - this.leg4.rotateAngleX = MathHelper.cos(par1 * 0.6662F) * 1.4F * par2; - - } - -} diff --git a/src/main/java/twilightforest/client/model/ModelTFCicada.java b/src/main/java/twilightforest/client/model/ModelTFCicada.java deleted file mode 100644 index d2fc2f640b..0000000000 --- a/src/main/java/twilightforest/client/model/ModelTFCicada.java +++ /dev/null @@ -1,63 +0,0 @@ -package twilightforest.client.model; - -import net.minecraft.client.model.ModelBase; -import net.minecraft.client.model.ModelRenderer; - - -public class ModelTFCicada extends ModelBase -{ - public ModelTFCicada() - { - legs = new ModelRenderer(this, 0, 21); - legs.addBox(-4F, 7.9F, -5F, 8, 1, 9, 0F); - //legs.setRotationPoint(0F, 16F, 0F); - - fatbody = new ModelRenderer(this, 0, 11); - fatbody.addBox(-2F, 6F, -4F, 4, 2, 6, 0F); - //fatbody.setRotationPoint(0F, 16F, 0F); - - skinnybody = new ModelRenderer(this, 0, 0); - skinnybody.addBox(-1F, 7F, -5F, 2, 1, 8, 0F); - //skinnybody.setRotationPoint(0F, 16F, 0F); - - - eye1 = new ModelRenderer(this, 20, 15); - eye1.addBox(1F, 5F, 2F, 2, 2, 2, 0F); - //eye1.setRotationPoint(0F, 16F, 0F); - - eye2 = new ModelRenderer(this, 20, 15); - eye2.addBox(-3F, 5F, 2F, 2, 2, 2, 0F); - //eye2.setRotationPoint(0F, 16F, 0F); - - wings = new ModelRenderer(this, 20, 0); - wings.addBox(-4F, 5F, -7F, 8, 1, 8, 0F); - //wings.setRotationPoint(0F, 16F, 0F); - } - - public void render(float f5) - { -// super.render(f, f1, f2, f3, f4, f5); -// setRotationAngles(f, f1, f2, f3, f4, f5); - legs.render(f5); - fatbody.render(f5); - skinnybody.render(f5); - eye1.render(f5); - eye2.render(f5); - wings.render(f5); - - } - - public void setRotationAngles(float f, float f1, float f2, float f3, float f4, float f5) - { -// super.setRotationAngles(f, f1, f2, f3, f4, f5); - } - - //fields - public ModelRenderer legs; - public ModelRenderer fatbody; - public ModelRenderer skinnybody; - public ModelRenderer eye1; - public ModelRenderer eye2; - public ModelRenderer wings; - -} diff --git a/src/main/java/twilightforest/client/model/ModelTFCubeOfAnnihilation.java b/src/main/java/twilightforest/client/model/ModelTFCubeOfAnnihilation.java deleted file mode 100644 index 5a2fb5197b..0000000000 --- a/src/main/java/twilightforest/client/model/ModelTFCubeOfAnnihilation.java +++ /dev/null @@ -1,56 +0,0 @@ -package twilightforest.client.model; - -import net.minecraft.client.model.ModelBase; -import net.minecraft.client.model.ModelRenderer; -import net.minecraft.entity.Entity; - -public class ModelTFCubeOfAnnihilation extends ModelBase -{ - - public ModelRenderer box; - public ModelRenderer boxX; - public ModelRenderer boxY; - public ModelRenderer boxZ; - - public ModelTFCubeOfAnnihilation() - { - textureWidth = 64; - textureHeight = 64; - box = new ModelRenderer(this, 0, 0); - box.addBox(-8F, -8F, -8F, 16, 16, 16, 0F); - box.setRotationPoint(0F, 0F, 0F); - - boxX = new ModelRenderer(this, 0, 32); - boxX.addBox(-8F, -8F, -8F, 16, 16, 16, 0F); - boxX.setRotationPoint(0F, 0F, 0F); - - boxY = new ModelRenderer(this, 0, 32); - boxY.addBox(-8F, -8F, -8F, 16, 16, 16, 0F); - boxY.setRotationPoint(0F, 0F, 0F); - - boxZ = new ModelRenderer(this, 0, 32); - boxZ.addBox(-8F, -8F, -8F, 16, 16, 16, 0F); - boxZ.setRotationPoint(0F, 0F, 0F); - } - - - public void render(Entity p_78088_1_, float p_78088_2_, float p_78088_3_, float p_78088_4_, float p_78088_5_, float p_78088_6_, float p_78088_7_) { - - this.setRotationAngles(p_78088_2_, p_78088_3_, p_78088_4_, p_78088_5_, p_78088_6_, p_78088_7_, p_78088_1_); - - box.render(p_78088_7_); - boxX.render(p_78088_7_); - boxY.render(p_78088_7_); - boxZ.render(p_78088_7_); - } - - @Override - public void setRotationAngles(float f, float f1, float f2, float f3, float time, float f5, Entity entity) { - - boxX.rotateAngleX = (float) Math.sin((entity.ticksExisted + time)) / 5F; - boxY.rotateAngleY = (float) Math.sin((entity.ticksExisted + time)) / 5F; - boxZ.rotateAngleZ = (float) Math.sin((entity.ticksExisted + time)) / 5F; - - } - -} diff --git a/src/main/java/twilightforest/client/model/ModelTFDeathTome.java b/src/main/java/twilightforest/client/model/ModelTFDeathTome.java deleted file mode 100644 index eec3367d99..0000000000 --- a/src/main/java/twilightforest/client/model/ModelTFDeathTome.java +++ /dev/null @@ -1,121 +0,0 @@ -package twilightforest.client.model; - -import net.minecraft.client.model.ModelBook; -import net.minecraft.client.model.ModelRenderer; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.util.MathHelper; - -import org.lwjgl.opengl.GL11; - -public class ModelTFDeathTome extends ModelBook { - - ModelRenderer everything; - ModelRenderer book; - - ModelRenderer loosePage1; - ModelRenderer loosePage2; - ModelRenderer loosePage3; - ModelRenderer loosePage4; - - - public ModelTFDeathTome() - { - super(); - - everything = (new ModelRenderer(this)).setTextureOffset(0, 0).addBox(0.0F, 0.0F, 0.0F, 0, 0, 0); - - book = (new ModelRenderer(this)).setTextureOffset(0, 0).addBox(0.0F, 0.0F, 0.0F, 0, 0, 0); - - book.addChild(coverRight); - book.addChild(coverLeft); - book.addChild(bookSpine); - book.addChild(pagesRight); - book.addChild(pagesLeft); - book.addChild(flippingPageRight); - book.addChild(flippingPageLeft); - - loosePage1 = (new ModelRenderer(this)).setTextureOffset(24, 10).addBox(0F, -4F, -8F, 5, 8, 0); - loosePage2 = (new ModelRenderer(this)).setTextureOffset(24, 10).addBox(0F, -4F, 9F, 5, 8, 0); - loosePage3 = (new ModelRenderer(this)).setTextureOffset(24, 10).addBox(0F, -4F, 11F, 5, 8, 0); - loosePage4 = (new ModelRenderer(this)).setTextureOffset(24, 10).addBox(0F, -4F, 7F, 5, 8, 0); - - everything.addChild(book); - everything.addChild(loosePage1); - everything.addChild(loosePage2); - everything.addChild(loosePage3); - everything.addChild(loosePage4); - - } - - /** - * Sets the models various rotation angles then renders the model. - */ - public void render(Entity par1Entity, float par2, float par3, float par4, float par5, float par6, float scale) - { - //this.everything.rotateAngleX = par6 / (180F / (float)Math.PI); - GL11.glEnable(GL11.GL_CULL_FACE); - this.setRotationAngles(par1Entity.ticksExisted, 0.4F, 0.6F, 0.9F, par6, 0.0625F); - this.everything.render(scale); - GL11.glDisable(GL11.GL_CULL_FACE); - - } - - /** - * Sets the models various rotation angles. - */ - public void setRotationAngles(float bounce, float flipRight, float flipLeft, float open, float rotate, float scale) - { - book.rotateAngleZ = -0.8726646259971647F; - this.everything.rotateAngleY = rotate / (180F / (float)Math.PI) + (float)Math.PI / 2.0F; - - } - - /** - * Used for easily adding entity-dependent animations. The second and third float params here are the same second - * and third as in the setRotationAngles method. - */ - @Override - public void setLivingAnimations(EntityLivingBase par1EntityLiving, float par2, float par3, float partialTick) { - float bounce = par1EntityLiving.ticksExisted + partialTick; - float open = 0.9f; - float flipRight = 0.4f; - float flipLeft = 0.6f; - - // hoveriness - book.setRotationPoint(0, 4 + MathHelper.sin((bounce) * 0.3F) * 2.0F, 0); - - // book openness - float openAngle = (MathHelper.sin(bounce * 0.4F) * 0.3F + 1.25F) * open; - this.coverRight.rotateAngleY = (float)Math.PI + openAngle; - this.coverLeft.rotateAngleY = -openAngle; - this.pagesRight.rotateAngleY = openAngle; - this.pagesLeft.rotateAngleY = -openAngle; - this.flippingPageRight.rotateAngleY = openAngle - openAngle * 2.0F * flipRight; - this.flippingPageLeft.rotateAngleY = openAngle - openAngle * 2.0F * flipLeft; - this.pagesRight.rotationPointX = MathHelper.sin(openAngle); - this.pagesLeft.rotationPointX = MathHelper.sin(openAngle); - this.flippingPageRight.rotationPointX = MathHelper.sin(openAngle); - this.flippingPageLeft.rotationPointX = MathHelper.sin(openAngle); - - - // page rotations - loosePage1.rotateAngleY = (bounce) / 4.0F; - loosePage1.rotateAngleX = MathHelper.sin((bounce) / 5.0F) / 3.0F; - loosePage1.rotateAngleZ = MathHelper.cos((bounce) / 5.0F) / 5.0F; - - loosePage2.rotateAngleY = (bounce) / 3.0F; - loosePage2.rotateAngleX = MathHelper.sin((bounce) / 5.0F) / 3.0F; - loosePage2.rotateAngleZ = MathHelper.cos((bounce) / 5.0F) / 4.0F + 2; - - loosePage3.rotateAngleY = (bounce) / 4.0F; - loosePage3.rotateAngleX = -MathHelper.sin((bounce) / 5.0F) / 3.0F; - loosePage3.rotateAngleZ = MathHelper.cos((bounce) / 5.0F) / 5.0F - 1.0F; - - loosePage4.rotateAngleY = (bounce) / 4.0F; - loosePage4.rotateAngleX = -MathHelper.sin((bounce) / 2.0F) / 4.0F; - loosePage4.rotateAngleZ = MathHelper.cos((bounce) / 7.0F) / 5.0F; - } - - -} diff --git a/src/main/java/twilightforest/client/model/ModelTFDeer.java b/src/main/java/twilightforest/client/model/ModelTFDeer.java deleted file mode 100644 index 4502962762..0000000000 --- a/src/main/java/twilightforest/client/model/ModelTFDeer.java +++ /dev/null @@ -1,85 +0,0 @@ -package twilightforest.client.model; - -import net.minecraft.client.model.ModelQuadruped; -import net.minecraft.client.model.ModelRenderer; - - -public class ModelTFDeer extends ModelQuadruped -{ - public ModelTFDeer() - { - super(12, 0.0F); - - // head height for baby - field_78145_g = 10F; - - head = new ModelRenderer(this, 0, 5); - head.addBox(-2F, -8F, -6F, 4, 6, 6, 0F); - head.setRotationPoint(0F, 4F, -7F); - - body = new ModelRenderer(this, 36, 6); - body.addBox(-4F, -10F, -7F, 6, 18, 8, 0F); - body.setRotationPoint(1F, 5F, 2F); - - body.rotateAngleX = 1.570796F; - leg1 = new ModelRenderer(this, 0, 17); - leg1.addBox(-3F, 0F, -2F, 2, 12, 3, 0F); - leg1.setRotationPoint(0F, 12F, 9F); - - leg2 = new ModelRenderer(this, 0, 17); - leg2.addBox(-1F, 0F, -2F, 2, 12, 3, 0F); - leg2.setRotationPoint(2F, 12F, 9F); - - leg3 = new ModelRenderer(this, 0, 17); - leg3.addBox(-3F, 0F, -3F, 2, 12, 3, 0F); - leg3.setRotationPoint(0F, 12F, -5F); - - leg4 = new ModelRenderer(this, 0, 17); - leg4.addBox(-1F, 0F, -3F, 2, 12, 3, 0F); - leg4.setRotationPoint(2F, 12F, -5F); - - // neck - neck = new ModelRenderer(this, 10, 19); - neck.addBox(-2.5F, -8, -11F, 3, 9, 4, 0F); -// neck.setRotationPoint(1F, 5F, 2F); - - neck.rotateAngleX = 4.974188f; - - body.addChild(neck); - - // nose - head.setTextureOffset(52, 0).addBox(-1.5F, -5F, -9F, 3, 3, 3, 0F); - - // antler 1 - head.setTextureOffset(20, 0); - head.addBox(-3F, -10F, -2F, 2, 2, 2, 0F); - head.addBox(-3F, -10F, -2F, 2, 2, 2, 0F); - head.addBox(-4F, -10F, -1F, 1, 1, 3, 0F); - head.addBox(-5F, -11F, 1F, 1, 1, 5, 0F); - head.addBox(-5F, -14F, 2F, 1, 4, 1, 0F); - head.addBox(-6F, -17F, 3F, 1, 4, 1, 0F); - head.addBox(-6F, -13F, 0F, 1, 1, 3, 0F); - head.addBox(-6F, -14F, -3F, 1, 1, 4, 0F); - head.addBox(-7F, -15F, -6F, 1, 1, 4, 0F); - head.addBox(-6F, -16F, -9F, 1, 1, 4, 0F); - head.addBox(-7F, -18F, -1F, 1, 5, 1, 0F); - head.addBox(-6F, -19F, -6F, 1, 5, 1, 0F); - - // antler 2 - head.addBox(1F, -10F, -2F, 2, 2, 2, 0F); - head.addBox(3F, -10F, -1F, 1, 1, 3, 0F); - head.addBox(4F, -11F, 1F, 1, 1, 5, 0F); - head.addBox(4F, -14F, 2F, 1, 4, 1, 0F); - head.addBox(5F, -17F, 3F, 1, 4, 1, 0F); - head.addBox(5F, -13F, 0F, 1, 1, 3, 0F); - head.addBox(5F, -14F, -3F, 1, 1, 4, 0F); - head.addBox(6F, -15F, -6F, 1, 1, 4, 0F); - head.addBox(5F, -16F, -9F, 1, 1, 4, 0F); - head.addBox(6F, -18F, -1F, 1, 5, 1, 0F); - head.addBox(5F, -19F, -6F, 1, 5, 1, 0F); - } - - //fields - public ModelRenderer neck; - -} diff --git a/src/main/java/twilightforest/client/model/ModelTFFieryArmor.java b/src/main/java/twilightforest/client/model/ModelTFFieryArmor.java deleted file mode 100644 index 7d000ba672..0000000000 --- a/src/main/java/twilightforest/client/model/ModelTFFieryArmor.java +++ /dev/null @@ -1,83 +0,0 @@ -package twilightforest.client.model; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.model.ModelBiped; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; - -public class ModelTFFieryArmor extends ModelBiped { - - public ModelTFFieryArmor(int part, float expand) - { - super(expand); - - - switch (part) - { - case 0: // helmet - this.bipedHead.showModel = true; - this.bipedHeadwear.showModel = false; - this.bipedBody.showModel = false; - this.bipedRightArm.showModel = false; - this.bipedLeftArm.showModel = false; - this.bipedRightLeg.showModel = false; - this.bipedLeftLeg.showModel = false; - break; - case 1: // chest - this.bipedHead.showModel = false; - this.bipedHeadwear.showModel = false; - this.bipedBody.showModel = true; - this.bipedRightArm.showModel = true; - this.bipedLeftArm.showModel = true; - this.bipedRightLeg.showModel = false; - this.bipedLeftLeg.showModel = false; - break; - case 2: // pants - this.bipedHead.showModel = false; - this.bipedHeadwear.showModel = false; - this.bipedBody.showModel = true; - this.bipedRightArm.showModel = false; - this.bipedLeftArm.showModel = false; - this.bipedRightLeg.showModel = true; - this.bipedLeftLeg.showModel = true; - break; - case 3: // boots - this.bipedHead.showModel = false; - this.bipedHeadwear.showModel = false; - this.bipedBody.showModel = false; - this.bipedRightArm.showModel = false; - this.bipedLeftArm.showModel = false; - this.bipedRightLeg.showModel = true; - this.bipedLeftLeg.showModel = true; - break; - - } - } - - - /** - * Sets the models various rotation angles then renders the model. - */ - @Override - public void render(Entity par1Entity, float par2, float par3, float par4, float par5, float par6, float par7) { - - if (par1Entity != null) { - this.isSneak = par1Entity.isSneaking(); - } - - if (par1Entity != null && par1Entity instanceof EntityLivingBase) { - this.heldItemRight = ((EntityLivingBase)par1Entity).getHeldItem() != null ? 1 : 0; - } - - // FULL BRIGHT - Minecraft.getMinecraft().entityRenderer.disableLightmap(0); - - - super.render(par1Entity, par2, par3, par4, par5, par6, par7); - - - Minecraft.getMinecraft().entityRenderer.enableLightmap(0); - } - - -} diff --git a/src/main/java/twilightforest/client/model/ModelTFFireBeetle.java b/src/main/java/twilightforest/client/model/ModelTFFireBeetle.java deleted file mode 100644 index 5f127945b0..0000000000 --- a/src/main/java/twilightforest/client/model/ModelTFFireBeetle.java +++ /dev/null @@ -1,226 +0,0 @@ -// Date: 11/5/2012 7:35:56 PM -// Template version 1.1 -// Java generated by Techne -// Keep in mind that you still need to fill in some blanks -// - ZeuX -package twilightforest.client.model; - -import net.minecraft.client.model.ModelBase; -import net.minecraft.client.model.ModelRenderer; -import net.minecraft.entity.Entity; -import net.minecraft.util.MathHelper; - -public class ModelTFFireBeetle extends ModelBase -{ - //fields - ModelRenderer thorax; - ModelRenderer head; - ModelRenderer connector2; - ModelRenderer RearEnd; - ModelRenderer Leg6; - ModelRenderer Leg4; - ModelRenderer Leg2; - ModelRenderer Leg5; - ModelRenderer Leg3; - ModelRenderer Leg1; - ModelRenderer connector1; - ModelRenderer jaw1a; - ModelRenderer jaw1b; - ModelRenderer jaw2a; - ModelRenderer jaw2b; - ModelRenderer antenna1; - ModelRenderer antenna2; - ModelRenderer eye1; - ModelRenderer eye2; - - public ModelTFFireBeetle() - { - textureWidth = 64; - textureHeight = 32; - - thorax = new ModelRenderer(this, 0, 22); - thorax.addBox(-4.5F, -4F, 0F, 9, 8, 2); - thorax.setRotationPoint(0F, 18F, -4.5F); - - connector1 = new ModelRenderer(this, 0, 12); - connector1.addBox(-3F, -3F, 0F, 6, 6, 1); - connector1.setRotationPoint(0F, 18F, -3F); - - connector2 = new ModelRenderer(this, 0, 12); - connector2.addBox(-3F, -3F, -1F, 6, 6, 1); - connector2.setRotationPoint(0F, 18F, -4F); - - RearEnd = new ModelRenderer(this, 22, 9); - RearEnd.addBox(-6F, -9F, -4F, 12, 14, 9); - RearEnd.setRotationPoint(0F, 18F, 7F); - setRotation(RearEnd, 1.570796F, 0F, 0F); - - Leg6 = new ModelRenderer(this, 40, 0); - Leg6.addBox(-1F, -1F, -1F, 10, 2, 2); - Leg6.setRotationPoint(4F, 21F, -4F); - setRotation(Leg6, 0F, 0.2792527F, 0.3490659F); - - Leg5 = new ModelRenderer(this, 40, 0); - Leg5.mirror = true; - Leg5.addBox(-9F, -1F, -1F, 10, 2, 2); - Leg5.setRotationPoint(-4F, 21F, -4F); - setRotation(Leg5, 0F, -0.2792527F, -0.3490659F); - - Leg4 = new ModelRenderer(this, 40, 0); - Leg4.addBox(-1F, -1F, -1F, 10, 2, 2); - Leg4.setRotationPoint(4F, 21F, -1F); - setRotation(Leg4, 0F, -0.2792527F, 0.3490659F); - - Leg2 = new ModelRenderer(this, 40, 0); - Leg2.addBox(-1F, -1F, -1F, 10, 2, 2); - Leg2.setRotationPoint(4F, 21F, 4F); - setRotation(Leg2, 0F, -0.6981317F, 0.3490659F); - - Leg3 = new ModelRenderer(this, 40, 0); - Leg3.mirror = true; - Leg3.addBox(-9F, -1F, -1F, 10, 2, 2); - Leg3.setRotationPoint(-4F, 21F, -1F); - setRotation(Leg3, 0F, 0.2792527F, -0.3490659F); - - Leg1 = new ModelRenderer(this, 40, 0); - Leg1.mirror = true; - Leg1.addBox(-9F, -1F, -1F, 10, 2, 2); - Leg1.setRotationPoint(-4F, 21F, 4F); - Leg1.setTextureSize(64, 32); - setRotation(Leg1, 0F, 0.6981317F, -0.3490659F); - - head = new ModelRenderer(this, 0, 0); - head.addBox(-4F, -4F, -6F, 8, 6, 6); - head.setRotationPoint(0F, 19F, -5F); - - jaw1a = new ModelRenderer(this, 0, 0); - jaw1a.addBox(0F, 0F, -2F, 1, 1, 2); - jaw1a.setRotationPoint(-3F, 0F, -6F); - setRotation(jaw1a, 0.3490659F, 0F, 0F); - - jaw1b = new ModelRenderer(this, 0, 0); - jaw1b.addBox(0F, 0F, 0F, 1, 1, 2); - jaw1b.setRotationPoint(0F, 0F, -2F); - setRotation(jaw1b, 0F, 1.570796F, 0F); - - jaw2a = new ModelRenderer(this, 0, 0); - jaw2a.addBox(-1F, 0F, -2F, 1, 1, 2); - jaw2a.setRotationPoint(3F, 0F, -6F); - setRotation(jaw2a, 0.3490659F, 0F, 0F); - - jaw2b = new ModelRenderer(this, 0, 0); - jaw2b.addBox(0F, 0F, -2F, 1, 1, 2); - jaw2b.setRotationPoint(0F, 0F, -2F); - setRotation(jaw2b, 0F, 1.570796F, 0F); - - antenna1 = new ModelRenderer(this, 42, 4); - antenna1.addBox(0F, -0.5F, -0.5F, 10, 1, 1); - antenna1.setRotationPoint(1F, -3F, -5F); - setRotation(antenna1, 0F, 1.047198F, -0.296706F); - - antenna2 = new ModelRenderer(this, 42, 4); - antenna2.addBox(0F, -0.5F, -0.5F, 10, 1, 1); - antenna2.setRotationPoint(-1F, -3F, -5F); - setRotation(antenna2, 0F, 2.094395F, 0.296706F); - - eye1 = new ModelRenderer(this, 15, 12); - eye1.addBox(-1.5F, -1.5F, -1.5F, 3, 3, 3); - eye1.setRotationPoint(-3F, -2F, -5F); - - eye2 = new ModelRenderer(this, 15, 12); - eye2.addBox(-1.5F, -1.5F, -1.5F, 3, 3, 3); - eye2.setRotationPoint(3F, -2F, -5F); - - - - head.addChild(jaw1a); - jaw1a.addChild(jaw1b); - head.addChild(jaw2a); - jaw2a.addChild(jaw2b); - head.addChild(antenna1); - head.addChild(antenna2); - head.addChild(eye1); - head.addChild(eye2); - - } - - public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) - { - super.render(entity, f, f1, f2, f3, f4, f5); - setRotationAngles(f, f1, f2, f3, f4, f5, entity); - thorax.render(f5); - head.render(f5); - connector2.render(f5); - RearEnd.render(f5); - Leg6.render(f5); - Leg4.render(f5); - Leg2.render(f5); - Leg5.render(f5); - Leg3.render(f5); - Leg1.render(f5); - connector1.render(f5); - } - - private void setRotation(ModelRenderer model, float x, float y, float z) - { - model.rotateAngleX = x; - model.rotateAngleY = y; - model.rotateAngleZ = z; - } - - /** - * Sets the model's various rotation angles. For bipeds, par1 and par2 are used for animating the movement of arms - * and legs, where par1 represents the time(so that arms and legs swing back and forth) and par2 represents how - * "far" arms and legs can swing at most. - */ - public void setRotationAngles(float par1, float par2, float par3, float par4, float par5, float par6, Entity par7Entity) - { - this.head.rotateAngleY = par4 / (180F / (float)Math.PI); - this.head.rotateAngleX = par5 / (180F / (float)Math.PI); - - float legZ = ((float)Math.PI / 11F); - this.Leg1.rotateAngleZ = -legZ; - this.Leg2.rotateAngleZ = legZ; - this.Leg3.rotateAngleZ = -legZ * 0.74F; - this.Leg4.rotateAngleZ = legZ * 0.74F; - this.Leg5.rotateAngleZ = -legZ; - this.Leg6.rotateAngleZ = legZ; - - float var9 = -0.0F; - float var10 = 0.3926991F; - this.Leg1.rotateAngleY = var10 * 2.0F + var9; - this.Leg2.rotateAngleY = -var10 * 2.0F - var9; - this.Leg3.rotateAngleY = var10 * 1.0F + var9; - this.Leg4.rotateAngleY = -var10 * 1.0F - var9; - this.Leg5.rotateAngleY = -var10 * 2.0F + var9; - this.Leg6.rotateAngleY = var10 * 2.0F - var9; - - float var11 = -(MathHelper.cos(par1 * 0.6662F * 2.0F + 0.0F) * 0.4F) * par2; - float var12 = -(MathHelper.cos(par1 * 0.6662F * 2.0F + (float)Math.PI) * 0.4F) * par2; - float var14 = -(MathHelper.cos(par1 * 0.6662F * 2.0F + ((float)Math.PI * 3F / 2F)) * 0.4F) * par2; - - float var15 = Math.abs(MathHelper.sin(par1 * 0.6662F + 0.0F) * 0.4F) * par2; - float var16 = Math.abs(MathHelper.sin(par1 * 0.6662F + (float)Math.PI) * 0.4F) * par2; - float var18 = Math.abs(MathHelper.sin(par1 * 0.6662F + ((float)Math.PI * 3F / 2F)) * 0.4F) * par2; - - this.Leg1.rotateAngleY += var11; - this.Leg2.rotateAngleY += -var11; - this.Leg3.rotateAngleY += var12; - this.Leg4.rotateAngleY += -var12; - this.Leg5.rotateAngleY += var14; - this.Leg6.rotateAngleY += -var14; - - this.Leg1.rotateAngleZ += var15; - this.Leg2.rotateAngleZ += -var15; - - this.Leg3.rotateAngleZ += var16; - this.Leg4.rotateAngleZ += -var16; - - this.Leg5.rotateAngleZ += var18; - this.Leg6.rotateAngleZ += -var18; - - - } - - -} diff --git a/src/main/java/twilightforest/client/model/ModelTFFirefly.java b/src/main/java/twilightforest/client/model/ModelTFFirefly.java deleted file mode 100644 index a3c6f697fb..0000000000 --- a/src/main/java/twilightforest/client/model/ModelTFFirefly.java +++ /dev/null @@ -1,51 +0,0 @@ -package twilightforest.client.model; - -import net.minecraft.client.model.ModelBase; -import net.minecraft.client.model.ModelRenderer; - - -public class ModelTFFirefly extends ModelBase -{ - public ModelTFFirefly() - { - legs = new ModelRenderer(this, 0, 21); - legs.addBox(-4F, 7.9F, -5F, 8, 1, 10, 0F); - //legs.setRotationPoint(0F, 16F, 0F); - - fatbody = new ModelRenderer(this, 0, 11); - fatbody.addBox(-2F, 6F, -4F, 4, 2, 6, 0F); - //fatbody.setRotationPoint(0F, 16F, 0F); - - skinnybody = new ModelRenderer(this, 0, 0); - skinnybody.addBox(-1F, 7F, -5F, 2, 1, 8, 0F); - //skinnybody.setRotationPoint(0F, 16F, 0F); - - glow = new ModelRenderer(this, 20, 0); - glow.addBox(-5F, 5.9F, -9F, 10, 0, 10, 0F); - //glow.setRotationPoint(0F, 16F, 0F); - - } - - public void render(float f5) - { - //super.render(f, f1, f2, f3, f4, f5); - //setRotationAngles(f, f1, f2, f3, f4, f5); - legs.render(f5); - fatbody.render(f5); - skinnybody.render(f5); -// glow.render(f5); - - } - - public void setRotationAngles(float f, float f1, float f2, float f3, float f4, float f5) - { - //super.setRotationAngles(f, f1, f2, f3, f4, f5); - } - - //fields - public ModelRenderer legs; - public ModelRenderer fatbody; - public ModelRenderer skinnybody; - public ModelRenderer glow; - -} diff --git a/src/main/java/twilightforest/client/model/ModelTFGhast.java b/src/main/java/twilightforest/client/model/ModelTFGhast.java deleted file mode 100644 index 39379ef3eb..0000000000 --- a/src/main/java/twilightforest/client/model/ModelTFGhast.java +++ /dev/null @@ -1,73 +0,0 @@ -package twilightforest.client.model; - -import java.util.Random; - -import net.minecraft.client.model.ModelBase; -import net.minecraft.client.model.ModelRenderer; -import net.minecraft.entity.Entity; -import net.minecraft.util.MathHelper; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -@SideOnly(Side.CLIENT) -public class ModelTFGhast extends ModelBase -{ - ModelRenderer body; - protected ModelRenderer[] tentacles = new ModelRenderer[9]; - - - public ModelTFGhast() - { - byte yOffset = -16; - this.body = new ModelRenderer(this, 0, 0); - this.body.addBox(-8.0F, -8.0F, -8.0F, 16, 16, 16); - this.body.rotationPointY += (float)(24 + yOffset); - Random rand = new Random(1660L); - - for (int i = 0; i < this.tentacles.length; ++i) - { - makeTentacle(yOffset, rand, i); - } - } - - protected void makeTentacle(byte yOffset, Random random, int i) { - this.tentacles[i] = new ModelRenderer(this, 0, 0); - float xPoint = (((float)(i % 3) - (float)(i / 3 % 2) * 0.5F + 0.25F) / 2.0F * 2.0F - 1.0F) * 5.0F; - float zPoint = ((float)(i / 3) / 2.0F * 2.0F - 1.0F) * 5.0F; - int length = random.nextInt(7) + 8; - this.tentacles[i].addBox(-1.0F, 0.0F, -1.0F, 2, length, 2); - this.tentacles[i].rotationPointX = xPoint; - this.tentacles[i].rotationPointZ = zPoint; - this.tentacles[i].rotationPointY = (float)(23 + yOffset); - - this.body.addChild(this.tentacles[i]); - } - - /** - * Sets the model's various rotation angles. For bipeds, par1 and par2 are used for animating the movement of arms - * and legs, where par1 represents the time(so that arms and legs swing back and forth) and par2 represents how - * "far" arms and legs can swing at most. - */ - public void setRotationAngles(float par1, float par2, float par3, float yaw, float pitch, float par6, Entity par7Entity) - { - // wave tentacles - for (int i = 0; i < this.tentacles.length; ++i) - { - this.tentacles[i].rotateAngleX = 0.2F * MathHelper.sin(par3 * 0.3F + (float)i) + 0.4F; - } - - // make body face what we're looking at - this.body.rotateAngleX = pitch / (180F / (float)Math.PI); - this.body.rotateAngleY = yaw / (180F / (float)Math.PI); - } - - /** - * Sets the models various rotation angles then renders the model. - */ - public void render(Entity par1Entity, float par2, float par3, float par4, float yaw, float pitch, float time) - { - this.setRotationAngles(par2, par3, par4, yaw, pitch, time, par1Entity); - - this.body.render(time); - } -} diff --git a/src/main/java/twilightforest/client/model/ModelTFGoblinChain.java b/src/main/java/twilightforest/client/model/ModelTFGoblinChain.java deleted file mode 100644 index ad6f0f4d9b..0000000000 --- a/src/main/java/twilightforest/client/model/ModelTFGoblinChain.java +++ /dev/null @@ -1,26 +0,0 @@ -package twilightforest.client.model; - -import net.minecraft.client.model.ModelBase; -import net.minecraft.client.model.ModelRenderer; -import net.minecraft.entity.Entity; - - -public class ModelTFGoblinChain extends ModelBase -{ - ModelRenderer chain; - - public ModelTFGoblinChain() - { - - chain = new ModelRenderer(this, 56, 16); - chain.addBox(-1F, -1F, -1F, 2, 2, 2, 0F); - chain.setRotationPoint(0F, 0F, 0F); - - } - - @Override - public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { - chain.render(f5); - } - -} diff --git a/src/main/java/twilightforest/client/model/ModelTFGoblinKnightLower.java b/src/main/java/twilightforest/client/model/ModelTFGoblinKnightLower.java deleted file mode 100644 index 4e187195af..0000000000 --- a/src/main/java/twilightforest/client/model/ModelTFGoblinKnightLower.java +++ /dev/null @@ -1,130 +0,0 @@ -package twilightforest.client.model; - -import net.minecraft.client.model.ModelBiped; -import net.minecraft.client.model.ModelRenderer; -import net.minecraft.entity.Entity; -import net.minecraft.util.MathHelper; -import twilightforest.entity.EntityTFGoblinKnightLower; - -public class ModelTFGoblinKnightLower extends ModelBiped { - - public ModelRenderer tunic; - - public ModelTFGoblinKnightLower() - { - this.heldItemLeft = 0; - this.heldItemRight = 0; - this.isSneak = false; - this.aimedBow = false; - this.textureWidth = 128; - this.textureHeight = 64; - - this.bipedCloak = new ModelRenderer(this, 0, 0); - this.bipedCloak.addBox(-5.0F, 0.0F, -1.0F, 10, 16, 1); - this.bipedEars = new ModelRenderer(this, 24, 0); - this.bipedEars.addBox(-3.0F, -6.0F, -1.0F, 6, 6, 1); - - this.bipedHead = new ModelRenderer(this, 0, 32); - this.bipedHead.addBox(-2.5F, -5.0F, -3.5F, 5, 5, 5); - this.bipedHead.setRotationPoint(0.0F, 10.0F, 1.0F); - - this.bipedHeadwear = new ModelRenderer(this, 0, 0); - this.bipedHeadwear.addBox(0, 0, 0, 0, 0, 0); - - this.bipedBody = new ModelRenderer(this, 16, 48); - this.bipedBody.addBox(-3.5F, 0.0F, -2.0F, 7, 8, 4); - this.bipedBody.setRotationPoint(0.0F, 8.0F, 0.0F); - - this.bipedRightArm = new ModelRenderer(this, 40, 48); - this.bipedRightArm.addBox(-2.0F, -2.0F, -1.5F, 2, 8, 3); - this.bipedRightArm.setRotationPoint(-3.5F, 10.0F, 0.0F); - - this.bipedLeftArm = new ModelRenderer(this, 40, 48); - this.bipedLeftArm.mirror = true; - this.bipedLeftArm.addBox(0.0F, -2.0F, -1.5F, 2, 8, 3); - this.bipedLeftArm.setRotationPoint(3.5F, 10.0F, 0.0F); - - this.bipedRightLeg = new ModelRenderer(this, 0, 48); - this.bipedRightLeg.addBox(-3.0F, 0.0F, -2.0F, 4, 8, 4); - this.bipedRightLeg.setRotationPoint(-2.5F, 16.0F, 0.0F); - - this.bipedLeftLeg = new ModelRenderer(this, 0, 48); - this.bipedLeftLeg.mirror = true; - this.bipedLeftLeg.addBox(-1.0F, 0.0F, -2.0F, 4, 8, 4); - this.bipedLeftLeg.setRotationPoint(2.5F, 16.0F, 0.0F); - - this.tunic = new ModelRenderer(this, 64, 19); - this.tunic.addBox(-6.0F, 0.0F, -3.0F, 12, 9, 6); - this.tunic.setRotationPoint(0F, 7.5F, 0.0F); - } - - /** - * Sets the models various rotation angles then renders the model. - */ - public void render(Entity par1Entity, float par2, float par3, float par4, float par5, float par6, float par7) - { - super.render(par1Entity, par2, par3, par4, par5, par6, par7); - - if (((EntityTFGoblinKnightLower)par1Entity).hasArmor()) - { - this.renderTunic(par7); - } - } - - /** - * Renders the tunic, if we're wearing armor - */ - public void renderTunic(float par1) - { - this.tunic.render(par1); - } - - /** - * Sets the model's various rotation angles. For bipeds, par1 and par2 are used for animating the movement of arms - * and legs, where par1 represents the time(so that arms and legs swing back and forth) and par2 represents how - * "far" arms and legs can swing at most. - */ - public void setRotationAngles(float par1, float par2, float par3, float par4, float par5, float par6, Entity par7Entity) - { - this.bipedHead.rotateAngleY = par4 / (180F / (float)Math.PI); - this.bipedHead.rotateAngleX = par5 / (180F / (float)Math.PI); - this.bipedHeadwear.rotateAngleY = this.bipedHead.rotateAngleY; - this.bipedHeadwear.rotateAngleX = this.bipedHead.rotateAngleX; - this.bipedRightArm.rotateAngleX = MathHelper.cos(par1 * 0.6662F + (float)Math.PI) * 2.0F * par2 * 0.5F; - this.bipedLeftArm.rotateAngleX = MathHelper.cos(par1 * 0.6662F) * 2.0F * par2 * 0.5F; - this.bipedRightArm.rotateAngleZ = 0.0F; - this.bipedLeftArm.rotateAngleZ = 0.0F; - this.bipedRightLeg.rotateAngleX = MathHelper.cos(par1 * 0.6662F) * 1.4F * par2; - this.bipedLeftLeg.rotateAngleX = MathHelper.cos(par1 * 0.6662F + (float)Math.PI) * 1.4F * par2; - this.bipedRightLeg.rotateAngleY = 0.0F; - this.bipedLeftLeg.rotateAngleY = 0.0F; - - if (par7Entity.riddenByEntity != null) - { - this.bipedHead.rotateAngleY = 0; - this.bipedHead.rotateAngleX = 0; - this.bipedHeadwear.rotateAngleY = this.bipedHead.rotateAngleY; - this.bipedHeadwear.rotateAngleX = this.bipedHead.rotateAngleX; - } - - if (this.heldItemLeft != 0) - { - this.bipedLeftArm.rotateAngleX = this.bipedLeftArm.rotateAngleX * 0.5F - ((float)Math.PI / 10F) * (float)this.heldItemLeft; - } - - if (this.heldItemRight != 0) - { - this.bipedRightArm.rotateAngleX = this.bipedRightArm.rotateAngleX * 0.5F - ((float)Math.PI / 10F) * (float)this.heldItemRight; - } - - this.bipedRightArm.rotateAngleY = 0.0F; - this.bipedLeftArm.rotateAngleY = 0.0F; - - - this.bipedRightArm.rotateAngleZ += MathHelper.cos(par3 * 0.09F) * 0.05F + 0.05F; - this.bipedLeftArm.rotateAngleZ -= MathHelper.cos(par3 * 0.09F) * 0.05F + 0.05F; - this.bipedRightArm.rotateAngleX += MathHelper.sin(par3 * 0.067F) * 0.05F; - this.bipedLeftArm.rotateAngleX -= MathHelper.sin(par3 * 0.067F) * 0.05F; - } - -} diff --git a/src/main/java/twilightforest/client/model/ModelTFGoblinKnightUpper.java b/src/main/java/twilightforest/client/model/ModelTFGoblinKnightUpper.java deleted file mode 100644 index 31edf6e181..0000000000 --- a/src/main/java/twilightforest/client/model/ModelTFGoblinKnightUpper.java +++ /dev/null @@ -1,263 +0,0 @@ -package twilightforest.client.model; - -import net.minecraft.client.model.ModelBiped; -import net.minecraft.client.model.ModelRenderer; -import net.minecraft.entity.Entity; -import net.minecraft.util.MathHelper; -import twilightforest.entity.EntityTFGoblinKnightUpper; - -public class ModelTFGoblinKnightUpper extends ModelBiped { - - public ModelRenderer breastplate; - public ModelRenderer helmet; - public ModelRenderer righthorn1; - public ModelRenderer righthorn2; - public ModelRenderer lefthorn1; - public ModelRenderer lefthorn2; - - public ModelRenderer shield; - public ModelRenderer spear; - - - public ModelTFGoblinKnightUpper() - { - this.heldItemLeft = 0; - this.heldItemRight = 0; - this.isSneak = false; - this.aimedBow = false; - this.textureWidth = 128; - this.textureHeight = 64; - - this.bipedCloak = new ModelRenderer(this, 0, 0); - this.bipedCloak.addBox(-5.0F, 0.0F, -1.0F, 10, 16, 1); - this.bipedEars = new ModelRenderer(this, 24, 0); - this.bipedEars.addBox(-3.0F, -6.0F, -1.0F, 6, 6, 1); - - this.bipedHead = new ModelRenderer(this, 0, 0); - this.bipedHead.addBox(0, 0, 0, 0, 0, 0); - this.bipedHead.setRotationPoint(0.0F, 12.0F, 0.0F); - - this.bipedHeadwear = new ModelRenderer(this, 0, 0); - this.bipedHeadwear.addBox(0, 0, 0, 0, 0, 0); - this.bipedHeadwear.setRotationPoint(0.0F, 12.0F, 0.0F); - - this.helmet = new ModelRenderer(this, 0, 0); - this.helmet.addBox(-3.5F, -11.0F, -3.5F, 7, 11, 7); - this.helmet.rotateAngleY = 45F / (180F / (float)Math.PI); - - this.righthorn1 = new ModelRenderer(this, 28, 0); - this.righthorn1.addBox(-6F, -1.5F, -1.5F, 7, 3, 3); - this.righthorn1.setRotationPoint(-3.5F, -9F, 0.0F); - this.righthorn1.rotateAngleY = 15F / (180F / (float)Math.PI); - this.righthorn1.rotateAngleZ = 10F / (180F / (float)Math.PI); - - this.righthorn2 = new ModelRenderer(this, 28, 6); - this.righthorn2.addBox(-3.0F, -1.0F, -1.0F, 3, 2, 2); - this.righthorn2.setRotationPoint(-5.5F, 0.0F, 0.0F); - this.righthorn2.rotateAngleZ = 10F / (180F / (float)Math.PI); - - this.righthorn1.addChild(righthorn2); - - this.lefthorn1 = new ModelRenderer(this, 28, 0); - this.lefthorn1.mirror = true; - this.lefthorn1.addBox(-1F, -1.5F, -1.5F, 7, 3, 3); - this.lefthorn1.setRotationPoint(3.5F, -9F, 0.0F); - this.lefthorn1.rotateAngleY = -15F / (180F / (float)Math.PI); - this.lefthorn1.rotateAngleZ = -10F / (180F / (float)Math.PI); - - this.lefthorn2 = new ModelRenderer(this, 28, 6); - this.lefthorn2.addBox(0.0F, -1.0F, -1.0F, 3, 2, 2); - this.lefthorn2.setRotationPoint(5.5F, 0.0F, 0.0F); - this.lefthorn2.rotateAngleZ = -10F / (180F / (float)Math.PI); - - this.lefthorn1.addChild(lefthorn2); - - this.bipedHeadwear.addChild(helmet); - this.bipedHeadwear.addChild(righthorn1); - this.bipedHeadwear.addChild(lefthorn1); - - this.bipedBody = new ModelRenderer(this, 0, 18); - this.bipedBody.setRotationPoint(0.0F, 12.0F, 0.0F); - this.bipedBody.addBox(-5.5F, 0.0F, -2.0F, 11, 8, 4); - this.bipedBody.setTextureOffset(30, 24).addBox(-6.5F, 0F, -2F, 1, 4, 4); // right shoulder - this.bipedBody.setTextureOffset(30, 24).addBox(5.5F, 0F, -2F, 1, 4, 4); // left shoulder - - this.bipedRightArm = new ModelRenderer(this, 44, 16); - this.bipedRightArm.addBox(-4.0F, -2.0F, -2.0F, 4, 12, 4); - this.bipedRightArm.setRotationPoint(-6.5F, 14.0F, 0.0F); - - this.bipedLeftArm = new ModelRenderer(this, 44, 16); - this.bipedLeftArm.mirror = true; - this.bipedLeftArm.addBox(0.0F, -2.0F, -2.0F, 4, 12, 4); - this.bipedLeftArm.setRotationPoint(6.5F, 14.0F, 0.0F); - - this.bipedRightLeg = new ModelRenderer(this, 30, 16); - this.bipedRightLeg.addBox(-1.5F, 0.0F, -2.0F, 3, 4, 4); - this.bipedRightLeg.setRotationPoint(-4F, 20.0F, 0.0F); - - this.bipedLeftLeg = new ModelRenderer(this, 30, 16); - this.bipedLeftLeg.mirror = true; - this.bipedLeftLeg.addBox(-1.5F, 0.0F, -2.0F, 3, 4, 4); - this.bipedLeftLeg.setRotationPoint(4F, 20.0F, 0.0F); - - this.shield = new ModelRenderer(this, 63, 36); - this.shield.addBox(-6.0F, -6.0F, -2.0F, 12, 20, 2); - this.shield.setRotationPoint(0F, 12F, 0.0F); - this.shield.rotateAngleX = 90F / (180F / (float)Math.PI); - - this.bipedLeftArm.addChild(shield); - - this.spear = new ModelRenderer(this, 108, 0); - this.spear.addBox(-1.0F, -19.0F, -1.0F, 2, 40, 2); - this.spear.setRotationPoint(-2F, 8.5F, 0.0F); - this.spear.rotateAngleX = 90F / (180F / (float)Math.PI); - - this.bipedRightArm.addChild(spear); - - - this.breastplate = new ModelRenderer(this, 64, 0); - this.breastplate.addBox(-6.5F, 0.0F, -3.0F, 13, 12, 6); - this.breastplate.setRotationPoint(0F, 11.5F, 0.0F); - - - - } - - /** - * Sets the models various rotation angles then renders the model. - */ - public void render(Entity par1Entity, float par2, float par3, float par4, float par5, float par6, float par7) - { - this.shield.isHidden = !((EntityTFGoblinKnightUpper)par1Entity).hasShield(); - - super.render(par1Entity, par2, par3, par4, par5, par6, par7); - - if (((EntityTFGoblinKnightUpper)par1Entity).hasArmor()) - { - this.renderBreastplate(par7); - } - - } - - /** - * Renders the breastplate, if we're wearing armor - */ - public void renderBreastplate(float par1) - { - this.breastplate.render(par1); - } - - - - /** - * Sets the model's various rotation angles. For bipeds, par1 and par2 are used for animating the movement of arms - * and legs, where par1 represents the time(so that arms and legs swing back and forth) and par2 represents how - * "far" arms and legs can swing at most. - */ - public void setRotationAngles(float par1, float par2, float par3, float par4, float par5, float par6, Entity par7Entity) - { - EntityTFGoblinKnightUpper upperKnight = ((EntityTFGoblinKnightUpper)par7Entity); - - boolean hasShield = upperKnight.hasShield(); - - this.bipedHead.rotateAngleY = par4 / (180F / (float)Math.PI); - this.bipedHead.rotateAngleX = par5 / (180F / (float)Math.PI); - this.bipedHead.rotateAngleZ = 0; - this.bipedHeadwear.rotateAngleY = this.bipedHead.rotateAngleY; - this.bipedHeadwear.rotateAngleX = this.bipedHead.rotateAngleX; - this.bipedHeadwear.rotateAngleZ = this.bipedHead.rotateAngleZ; - - - this.bipedRightArm.rotateAngleX = MathHelper.cos(par1 * 0.6662F + (float)Math.PI) * 2.0F * par2 * 0.5F; - - float leftConstraint = hasShield ? 0.2F : par2; - - this.bipedLeftArm.rotateAngleX = MathHelper.cos(par1 * 0.6662F) * 2.0F * leftConstraint * 0.5F; - this.bipedRightArm.rotateAngleZ = 0.0F; - this.bipedLeftArm.rotateAngleZ = 0.0F; - - - this.bipedRightLeg.rotateAngleX = MathHelper.cos(par1 * 0.6662F) * 1.4F * par2; - this.bipedLeftLeg.rotateAngleX = MathHelper.cos(par1 * 0.6662F + (float)Math.PI) * 1.4F * par2; - this.bipedRightLeg.rotateAngleY = 0.0F; - this.bipedLeftLeg.rotateAngleY = 0.0F; - - if (this.isRiding) - { - this.bipedRightArm.rotateAngleX += -((float)Math.PI / 5F); - this.bipedLeftArm.rotateAngleX += -((float)Math.PI / 5F); - this.bipedRightLeg.rotateAngleX = 0; - this.bipedLeftLeg.rotateAngleX = 0; -// this.bipedRightLeg.rotateAngleY = ((float)Math.PI / 10F); -// this.bipedLeftLeg.rotateAngleY = -((float)Math.PI / 10F); - } - - if (this.heldItemLeft != 0) - { - this.bipedLeftArm.rotateAngleX = this.bipedLeftArm.rotateAngleX * 0.5F - ((float)Math.PI / 10F) * (float)this.heldItemLeft; - } - - this.heldItemRight = 1; - - if (this.heldItemRight != 0) - { - this.bipedRightArm.rotateAngleX = this.bipedRightArm.rotateAngleX * 0.5F - ((float)Math.PI / 10F) * (float)this.heldItemRight; - } - - bipedRightArm.rotateAngleX -= (Math.PI * 0.66); - - // during swing move arm forward - if (upperKnight.heavySpearTimer > 0) - { - bipedRightArm.rotateAngleX -= this.getArmRotationDuringSwing(60 - upperKnight.heavySpearTimer + par6) / (180F / (float)Math.PI); - } - - this.bipedRightArm.rotateAngleY = 0.0F; - this.bipedLeftArm.rotateAngleY = 0.0F; - - this.bipedRightArm.rotateAngleZ += MathHelper.cos(par3 * 0.09F) * 0.05F + 0.05F; - this.bipedLeftArm.rotateAngleZ -= MathHelper.cos(par3 * 0.09F) * 0.05F + 0.05F; - this.bipedRightArm.rotateAngleX += MathHelper.sin(par3 * 0.067F) * 0.05F; - this.bipedLeftArm.rotateAngleX -= MathHelper.sin(par3 * 0.067F) * 0.05F; - - // shield arm points somewhat inward - this.bipedLeftArm.rotateAngleZ = -this.bipedLeftArm.rotateAngleZ; - - // fix shield so that it's always perpendicular to the floor - this.shield.rotateAngleX = (float) ( Math.PI * 2 - this.bipedLeftArm.rotateAngleX); - } - - /** - * - */ - private float getArmRotationDuringSwing(float attackTime) - { - if (attackTime <= 10) - { - // rock back - return attackTime * 1.0F; - } - if (attackTime > 10 && attackTime <= 30) - { - // hang back - return 10F; - } - if (attackTime > 30 && attackTime <= 33) - { - // slam forward - return (attackTime - 30) * -8F + 10F; - } - if (attackTime > 33 && attackTime <= 50) - { - // stay forward - return -15F; - } - if (attackTime > 50 && attackTime <= 60) - { - // back to normal - return (10 - (attackTime - 50)) * -1.5F; - } - - return 0; - } -} diff --git a/src/main/java/twilightforest/client/model/ModelTFHelmetCrab.java b/src/main/java/twilightforest/client/model/ModelTFHelmetCrab.java deleted file mode 100644 index 836dcf2f02..0000000000 --- a/src/main/java/twilightforest/client/model/ModelTFHelmetCrab.java +++ /dev/null @@ -1,245 +0,0 @@ -// Date: 4/14/2013 12:59:03 PM -// Template version 1.1 -// Java generated by Techne -// Keep in mind that you still need to fill in some blanks -// - ZeuX - -package twilightforest.client.model; - -import net.minecraft.client.model.ModelBase; -import net.minecraft.client.model.ModelRenderer; -import net.minecraft.entity.Entity; -import net.minecraft.util.MathHelper; - -/** - * Helmet crab model, based partially on some of the spider code - */ -public class ModelTFHelmetCrab extends ModelBase -{ - //fields - ModelRenderer body; - ModelRenderer helmetBase; - ModelRenderer Leg8; - ModelRenderer Leg6; - ModelRenderer Leg4; - ModelRenderer rightArm; - ModelRenderer Leg5; - ModelRenderer Leg3; - ModelRenderer clawbase; - ModelRenderer clawtop; - ModelRenderer clawbottom; - ModelRenderer righteye; - ModelRenderer lefteye; - - public ModelRenderer helmet; - public ModelRenderer righthorn1; - public ModelRenderer righthorn2; - public ModelRenderer lefthorn1; - public ModelRenderer lefthorn2; - - - public ModelTFHelmetCrab() - { - textureWidth = 64; - textureHeight = 32; - - body = new ModelRenderer(this, 32, 4); - body.addBox(-2.5F, -2.5F, -5F, 5, 5, 5); - body.setRotationPoint(0F, 19F, 0F); - - helmetBase = new ModelRenderer(this, 0, 0); - helmetBase.addBox(0, 0, 0, 0, 0, 0); - helmetBase.setRotationPoint(0F, 18F, 0F); - this.helmetBase.rotateAngleX = -100F / (180F / (float)Math.PI); - this.helmetBase.rotateAngleY = -30F / (180F / (float)Math.PI); - - this.helmet = new ModelRenderer(this, 0, 14); - this.helmet.addBox(-3.5F, -11.0F, -3.5F, 7, 11, 7); - this.helmet.rotateAngleY = 45F / (180F / (float)Math.PI); - - this.righthorn1 = new ModelRenderer(this, 28, 14); - this.righthorn1.addBox(-6F, -1.5F, -1.5F, 7, 3, 3); - this.righthorn1.setRotationPoint(-3.5F, -9F, 0.0F); - this.righthorn1.rotateAngleY = -15F / (180F / (float)Math.PI); - this.righthorn1.rotateAngleZ = 10F / (180F / (float)Math.PI); - - this.righthorn2 = new ModelRenderer(this, 28, 20); - this.righthorn2.addBox(-3.0F, -1.0F, -1.0F, 3, 2, 2); - this.righthorn2.setRotationPoint(-5.5F, 0.0F, 0.0F); - this.righthorn2.rotateAngleY = -15F / (180F / (float)Math.PI); - this.righthorn2.rotateAngleZ = 10F / (180F / (float)Math.PI); - - this.righthorn1.addChild(righthorn2); - - this.lefthorn1 = new ModelRenderer(this, 28, 14); - this.lefthorn1.mirror = true; - this.lefthorn1.addBox(-1F, -1.5F, -1.5F, 7, 3, 3); - this.lefthorn1.setRotationPoint(3.5F, -9F, 0.0F); - this.lefthorn1.rotateAngleY = 15F / (180F / (float)Math.PI); - this.lefthorn1.rotateAngleZ = -10F / (180F / (float)Math.PI); - - this.lefthorn2 = new ModelRenderer(this, 28, 20); - this.lefthorn2.addBox(0.0F, -1.0F, -1.0F, 3, 2, 2); - this.lefthorn2.setRotationPoint(5.5F, 0.0F, 0.0F); - this.lefthorn2.rotateAngleY = 15F / (180F / (float)Math.PI); - this.lefthorn2.rotateAngleZ = -10F / (180F / (float)Math.PI); - - this.lefthorn1.addChild(lefthorn2); - - this.helmetBase.addChild(helmet); - this.helmetBase.addChild(righthorn1); - this.helmetBase.addChild(lefthorn1); - - Leg8 = new ModelRenderer(this, 18, 0); - Leg8.addBox(-1F, -1F, -1F, 8, 2, 2); - Leg8.setRotationPoint(3F, 20F, -3F); - setRotation(Leg8, 0F, 0.5759587F, 0.1919862F); - - Leg6 = new ModelRenderer(this, 18, 0); - Leg6.addBox(-1F, -1F, -1F, 8, 2, 2); - Leg6.setRotationPoint(3F, 20F, -2F); - setRotation(Leg6, 0F, 0.2792527F, 0.1919862F); - - Leg4 = new ModelRenderer(this, 18, 0); - Leg4.addBox(-1F, -1F, -1F, 8, 2, 2); - Leg4.setRotationPoint(3F, 20F, -1F); - setRotation(Leg4, 0F, -0.2792527F, 0.1919862F); - - rightArm = new ModelRenderer(this, 38, 0); - rightArm.addBox(-7F, -1F, -1F, 8, 2, 2); - rightArm.setRotationPoint(-3F, 20F, -3F); - setRotation(rightArm, 0F, -1.319531F, -0.1919862F); - - Leg5 = new ModelRenderer(this, 18, 0); - Leg5.addBox(-7F, -1F, -1F, 8, 2, 2); - Leg5.setRotationPoint(-3F, 20F, -2F); - setRotation(Leg5, 0F, -0.2792527F, -0.1919862F); - - Leg3 = new ModelRenderer(this, 18, 0); - Leg3.addBox(-7F, -1F, -1F, 8, 2, 2); - Leg3.setRotationPoint(-3F, 20F, -1F); - setRotation(Leg3, 0F, 0.2792527F, -0.1919862F); - - clawbase = new ModelRenderer(this, 0, 0); - clawbase.addBox(0F, -1.5F, -1F, 3, 3, 2); - clawbase.setRotationPoint(-6F, 0F, -0.5F); - setRotation(clawbase, 0.0F, (float)(Math.PI / 2.0F), 0); - - clawtop = new ModelRenderer(this, 0, 5); - clawtop.addBox(0F, -0.5F, -1F, 3, 1, 2); - clawtop.setRotationPoint(3F, -1F, 0F); - setRotation(clawtop, 0F, 0F, -0.1858931F); - - clawbottom = new ModelRenderer(this, 0, 8); - clawbottom.addBox(0F, -0.5F, -1F, 3, 2, 2); - clawbottom.setRotationPoint(3F, 0F, 0F); - setRotation(clawbottom, 0F, 0F, 0.2602503F); - - this.clawbase.addChild(clawtop); - this.clawbase.addChild(clawbottom); - - this.rightArm.addChild(clawbase); - - righteye = new ModelRenderer(this, 10, 0); - righteye.addBox(-1F, -3F, -1F, 2, 3, 2); - righteye.setRotationPoint(-1F, -1F, -4F); - setRotation(righteye, (float)(Math.PI / 4.0F), 0.0F, -(float)(Math.PI / 4.0F)); - - lefteye = new ModelRenderer(this, 10, 0); - lefteye.addBox(-1F, -3F, -1F, 2, 3, 2); - lefteye.setRotationPoint(1F, -1F, -4F); - setRotation(lefteye, (float)(Math.PI / 4.0F), 0.0F, (float)(Math.PI / 4.0F)); - - this.body.addChild(righteye); - this.body.addChild(lefteye); - } - - /** - * Sets the models various rotation angles then renders the model. - */ - public void render(Entity par1Entity, float par2, float par3, float par4, float par5, float par6, float par7) - { - this.setRotationAngles(par2, par3, par4, par5, par6, par7, par1Entity); - body.render(par7); - helmetBase.render(par7); - Leg8.render(par7); - Leg6.render(par7); - Leg4.render(par7); - rightArm.render(par7); - Leg5.render(par7); - Leg3.render(par7); -// clawbase.render(par7); -// clawtop.render(par7); -// clawbottom.render(par7); -// righteye.render(par7); -// lefteye.render(par7); - } - - private void setRotation(ModelRenderer model, float x, float y, float z) - { - model.rotateAngleX = x; - model.rotateAngleY = y; - model.rotateAngleZ = z; - } - - /** - * Sets the model's various rotation angles. For bipeds, par1 and par2 are used for animating the movement of arms - * and legs, where par1 represents the time(so that arms and legs swing back and forth) and par2 represents how - * "far" arms and legs can swing at most. - */ - public void setRotationAngles(float par1, float par2, float par3, float par4, float par5, float par6, Entity par7Entity) - { - super.setRotationAngles(par1, par2, par3, par4, par5, par6, par7Entity); - - this.body.rotateAngleY = par4 / (180F / (float)Math.PI); - this.body.rotateAngleX = par5 / (180F / (float)Math.PI); - float f6 = ((float)Math.PI / 4F); - //this.Leg1.rotateAngleZ = -f6; - //this.Leg2.rotateAngleZ = f6; - this.Leg3.rotateAngleZ = -f6 * 0.74F; - this.Leg4.rotateAngleZ = f6 * 0.74F; - this.Leg5.rotateAngleZ = -f6 * 0.74F; - this.Leg6.rotateAngleZ = f6 * 0.74F; - //this.Leg7.rotateAngleZ = -f6; - this.Leg8.rotateAngleZ = f6; - float f7 = -0.0F; - float f8 = 0.3926991F; - //this.Leg1.rotateAngleY = f8 * 2.0F + f7; - //this.Leg2.rotateAngleY = -f8 * 2.0F - f7; - this.Leg3.rotateAngleY = f8 * 1.0F + f7; - this.Leg4.rotateAngleY = -f8 * 1.0F - f7; - this.Leg5.rotateAngleY = -f8 * 1.0F + f7; - this.Leg6.rotateAngleY = f8 * 1.0F - f7; - //this.Leg7.rotateAngleY = -f8 * 2.0F + f7; - this.Leg8.rotateAngleY = f8 * 2.0F - f7; - float f10 = -(MathHelper.cos(par1 * 0.6662F * 2.0F + (float)Math.PI) * 0.4F) * par2; - float f11 = -(MathHelper.cos(par1 * 0.6662F * 2.0F + ((float)Math.PI / 2F)) * 0.4F) * par2; - float f12 = -(MathHelper.cos(par1 * 0.6662F * 2.0F + ((float)Math.PI * 3F / 2F)) * 0.4F) * par2; - float f14 = Math.abs(MathHelper.sin(par1 * 0.6662F + (float)Math.PI) * 0.4F) * par2; - float f15 = Math.abs(MathHelper.sin(par1 * 0.6662F + ((float)Math.PI / 2F)) * 0.4F) * par2; - float f16 = Math.abs(MathHelper.sin(par1 * 0.6662F + ((float)Math.PI * 3F / 2F)) * 0.4F) * par2; - //this.Leg1.rotateAngleY += f9; - //this.Leg2.rotateAngleY += -f9; - this.Leg3.rotateAngleY += f10; - this.Leg4.rotateAngleY += -f10; - this.Leg5.rotateAngleY += f11; - this.Leg6.rotateAngleY += -f11; - //this.Leg7.rotateAngleY += f12; - this.Leg8.rotateAngleY += -f12; - //this.Leg1.rotateAngleZ += f13; - //this.Leg2.rotateAngleZ += -f13; - this.Leg3.rotateAngleZ += f14; - this.Leg4.rotateAngleZ += -f14; - this.Leg5.rotateAngleZ += f15; - this.Leg6.rotateAngleZ += -f15; - //this.Leg7.rotateAngleZ += f16; - this.Leg8.rotateAngleZ += -f16; - - // swing right arm as if it were an arm, not a leg - this.rightArm.rotateAngleY = -1.319531F; - this.rightArm.rotateAngleY += MathHelper.cos(par1 * 0.6662F + (float)Math.PI) * 2.0F * par2 * 0.5F; - - - } - -} diff --git a/src/main/java/twilightforest/client/model/ModelTFHydra.java b/src/main/java/twilightforest/client/model/ModelTFHydra.java deleted file mode 100644 index 70aea681e0..0000000000 --- a/src/main/java/twilightforest/client/model/ModelTFHydra.java +++ /dev/null @@ -1,326 +0,0 @@ -// Date: 2/5/2012 10:11:18 AM -// Template version 1.1 -// Java generated by Techne -// Keep in mind that you still need to fill in some blanks -// - ZeuX -package twilightforest.client.model; - -import net.minecraft.client.model.ModelBase; -import net.minecraft.client.model.ModelRenderer; -import net.minecraft.entity.Entity; -import net.minecraft.util.MathHelper; -import twilightforest.entity.boss.EntityTFHydra; -import twilightforest.entity.boss.EntityTFHydraPart; - - -public class ModelTFHydra extends ModelBase -{ - //fields - ModelRenderer body; - ModelRenderer leg1; - ModelRenderer leg2; - ModelRenderer tail1; - ModelRenderer tail2; - ModelRenderer tail3; - ModelRenderer tail4; - ModelRenderer neck1a; - ModelRenderer neck1b; - ModelRenderer neck1c; - ModelRenderer neck1d; - ModelRenderer head1; - ModelRenderer jaw1; - ModelRenderer frill1; - ModelRenderer neck2a; - ModelRenderer neck2b; - ModelRenderer neck2c; - ModelRenderer neck2d; - ModelRenderer head2; - ModelRenderer jaw2; - ModelRenderer frill2; - ModelRenderer neck3a; - ModelRenderer neck3b; - ModelRenderer neck3c; - ModelRenderer neck3d; - ModelRenderer head3; - ModelRenderer jaw3; - ModelRenderer frill3; - - public ModelTFHydra() - { - textureWidth = 512; - textureHeight = 256; - - setTextureOffset("body.body", 0, 0); - setTextureOffset("leg.main", 0, 136); - setTextureOffset("leg.toe", 184, 200); - setTextureOffset("tail.box", 128, 136); - setTextureOffset("tail.fin", 128, 200); - setTextureOffset("neck.box", 128, 136); - setTextureOffset("neck.fin", 128, 200); - setTextureOffset("head.box", 272, 0); - setTextureOffset("head.upperlip", 272, 56); - setTextureOffset("head.fin", 128, 200); - setTextureOffset("jaw.jaw", 272, 92); - setTextureOffset("frill.frill", 272, 200); - - body = new ModelRenderer(this, "body"); - body.setRotationPoint(0F, -12F, 0F); - body.addBox("body", -48F, 0F, 0F, 96, 96, 40); - setRotation(body, 1.22173F, 0F, 0F); - - leg1 = new ModelRenderer(this, "leg"); - leg1.setRotationPoint(48F, -24F, 0F); - leg1.addBox("main", -16F, 0F, -16F, 32, 48, 32); - leg1.addBox("toe", -20F, 40F, -20F, 8, 8, 8); - leg1.addBox("toe", -4F, 40F, -22F, 8, 8, 8); - leg1.addBox("toe", 12F, 40F, -20F, 8, 8, 8); - - leg2 = new ModelRenderer(this, "leg"); - leg2.setRotationPoint(-48F, -24F, 0F); - leg2.mirror = true; - leg2.addBox("main", -16F, 0F, -16F, 32, 48, 32); - leg2.addBox("toe", -20F, 40F, -20F, 8, 8, 8); - leg2.addBox("toe", -4F, 40F, -22F, 8, 8, 8); - leg2.addBox("toe", 12F, 40F, -20F, 8, 8, 8); - - - tail1 = new ModelRenderer(this, "tail"); - tail1.setRotationPoint(0F, 6F, 108F); - tail1.addBox("box", -16F, -16F, -16F, 32, 32, 32); - tail1.addBox("fin", -2F, -28F, -11F, 4, 24, 24); - - tail2 = new ModelRenderer(this, "tail"); - tail2.addBox("box", -16F, -16F, -16F, 32, 32, 32); - tail2.addBox("fin", -2F, -28F, -11F, 4, 24, 24); - tail2.setRotationPoint(0F, 7F, 142F); - - tail3 = new ModelRenderer(this, "tail"); - tail3.addBox("box", -16F, -16F, -16F, 32, 32, 32); - tail3.addBox("fin", -2F, -28F, -11F, 4, 24, 24); - tail3.setRotationPoint(0F, 8F, 176F); - - tail4 = new ModelRenderer(this, "tail"); - tail4.addBox("box", -16F, -16F, -16F, 32, 32, 32); - tail4.addBox("fin", -2F, -28F, -11F, 4, 24, 24); - tail4.setRotationPoint(0F, 8F, 210F); - - neck1a = new ModelRenderer(this, "neck"); - neck1a.addBox("box", -16F, -16F, -16F, 32, 32, 32); - neck1a.addBox("fin", -2F, -23F, 0F, 4, 24, 24); - neck1a.setRotationPoint(0F, -48F, 16F); - - neck1b = new ModelRenderer(this, "neck"); - neck1b.addBox("box", -16F, -16F, -16F, 32, 32, 32); - neck1b.addBox("fin", -2F, -23F, 0F, 4, 24, 24); - neck1b.setRotationPoint(0F, -68F, 0F); - - neck1c = new ModelRenderer(this, "neck"); - neck1c.addBox("box", -16F, -16F, -16F, 32, 32, 32); - neck1c.addBox("fin", -2F, -23F, 0F, 4, 24, 24); - neck1c.setRotationPoint(0F, -93F, -14F); - - neck1d = new ModelRenderer(this, "neck"); - neck1d.addBox("box", -16F, -16F, -16F, 32, 32, 32); - neck1d.addBox("fin", -2F, -23F, 0F, 4, 24, 24); - neck1d.setRotationPoint(0F, -116F, -37F); - - - head1 = new ModelRenderer(this, "head"); - head1.addBox("box", -16F, -14F, -32F, 32, 24, 32); - head1.addBox("upperlip", -15F, -2F, -56F, 30, 12, 24); - head1.addBox("fin", -2F, -30F, -12F, 4, 24, 24); - head1.setRotationPoint(0F, -128F, -53F); - - jaw1 = new ModelRenderer(this, "jaw"); - jaw1.setRotationPoint(0F, 10F, -4F); - jaw1.addBox("jaw", -15F, 0F, -48F, 30, 8, 48); - setRotation(jaw1, 0F, 0F, 0F); - head1.addChild(jaw1); - - frill1 = new ModelRenderer(this, "frill"); - frill1.setRotationPoint(0F, 0F, -10F); - frill1.addBox("frill", -24F, -40.0F, 0F, 48, 48, 4); - setRotation(frill1, -0.5235988F, 0F, 0F); - head1.addChild(frill1); - - neck2a = new ModelRenderer(this, "neck"); - neck2a.addBox("box", -16F, -16F, -16F, 32, 32, 32); - neck2a.addBox("fin", -2F, -23F, 0F, 4, 24, 24); - neck2a.setRotationPoint(48F, -48F, 16F); - - neck2b = new ModelRenderer(this, "neck"); - neck2b.addBox("box", -16F, -16F, -16F, 32, 32, 32); - neck2b.addBox("fin", -2F, -23F, 0F, 4, 24, 24); - neck2b.setRotationPoint(71F, -68F, 0F); - - neck2c = new ModelRenderer(this, "neck"); - neck2c.addBox("box", -16F, -16F, -16F, 32, 32, 32); - neck2c.addBox("fin", -2F, -23F, 0F, 4, 24, 24); - neck2c.setRotationPoint(96F, -93F, -14F); - - neck2d = new ModelRenderer(this, "neck"); - neck2d.addBox("box", -16F, -16F, -16F, 32, 32, 32); - neck2d.addBox("fin", -2F, -23F, 0F, 4, 24, 24); - neck2d.setRotationPoint(108F, -116F, -37F); - - head2 = new ModelRenderer(this, "head"); - head2.addBox("box", -16F, -14F, -32F, 32, 24, 32); - head2.addBox("upperlip", -15F, -2F, -56F, 30, 12, 24); - head2.addBox("fin", -2F, -30F, -12F, 4, 24, 24); - head2.setRotationPoint(108F, -128F, -53F); - - jaw2 = new ModelRenderer(this, "jaw"); - jaw2.setRotationPoint(0F, 10F, -4F); - jaw2.addBox("jaw", -15F, 0F, -48F, 30, 8, 48); - setRotation(jaw2, 0F, 0F, 0F); - head2.addChild(jaw2); - - frill2 = new ModelRenderer(this, "frill"); - frill2.setRotationPoint(0F, 0F, -10F); - frill2.addBox("frill", -24F, -40.0F, 0F, 48, 48, 4); - setRotation(frill2, -0.5235988F, 0F, 0F); - head2.addChild(frill2); - - - neck3a = new ModelRenderer(this, "neck"); - neck3a.addBox("box", -16F, -16F, -16F, 32, 32, 31); - neck3a.addBox("fin", -2F, -23F, 0F, 4, 24, 24); - neck3a.setRotationPoint(-48F, -48F, 16F); - - neck3b = new ModelRenderer(this, "neck"); - neck3b.addBox("box", -16F, -16F, -16F, 32, 32, 32); - neck3b.addBox("fin", -2F, -23F, 0F, 4, 24, 24); - neck3b.setRotationPoint(-71F, -43F, 0F); - - neck3c = new ModelRenderer(this, "neck"); - neck3c.addBox("box", -16F, -16F, -16F, 32, 32, 32); - neck3c.addBox("fin", -2F, -23F, 0F, 4, 24, 24); - neck3c.setRotationPoint(-96F, -33F, -14F); - - neck3d = new ModelRenderer(this, "neck"); - neck3d.addBox("box", -16F, -16F, -16F, 32, 32, 32); - neck3d.addBox("fin", -2F, -23F, 0F, 4, 24, 24); - neck3d.setRotationPoint(-108F, -24F, -37F); - - - head3 = new ModelRenderer(this, "head"); - head3.addBox("box", -16F, -14F, -32F, 32, 24, 32); - head3.addBox("upperlip", -15F, -2F, -56F, 30, 12, 24); - head3.addBox("fin", -2F, -30F, -12F, 4, 24, 24); - head3.setRotationPoint(-108F, -24F, -53F); - - jaw3 = new ModelRenderer(this, "jaw"); - jaw3.setRotationPoint(0F, 10F, -4F); - jaw3.addBox("jaw", -15F, 0F, -48F, 30, 8, 48); - setRotation(jaw3, 0.125F, 0F, 0F); - head3.addChild(jaw3); - - frill3 = new ModelRenderer(this, "frill"); - frill3.setRotationPoint(0F, 0F, -10F); - frill3.addBox("frill", -24F, -40.0F, 0F, 48, 48, 4); - setRotation(frill3, -0.5235988F, 0F, 0F); - head3.addChild(frill3); - - } - - @Override - public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) - { - super.render(entity, f, f1, f2, f3, f4, f5); - setRotationAngles(f, f1, f2, f3, f4, f5, entity); - body.render(f5); - leg1.render(f5); - leg2.render(f5); - tail1.render(f5); - tail2.render(f5); - tail3.render(f5); - tail4.render(f5); -// neck1a.render(f5); -// neck1b.render(f5); -// neck1c.render(f5); -// neck1d.render(f5); -// head1.render(f5); -// neck2a.render(f5); -// neck2b.render(f5); -// neck2c.render(f5); -// neck2d.render(f5); -// head2.render(f5); -// neck3a.render(f5); -// neck3b.render(f5); -// neck3c.render(f5); -// neck3d.render(f5); -// head3.render(f5); - } - - private void setRotation(ModelRenderer model, float x, float y, float z) - { - model.rotateAngleX = x; - model.rotateAngleY = y; - model.rotateAngleZ = z; - } - - public void setRotationAngles(float f, float f1, float f2, float f3, float f4, float f5, Entity entity) - { - super.setRotationAngles(f, f1, f2, f3, f4, f5, entity); - - leg1.rotateAngleX = MathHelper.cos(f * 0.6662F) * 1.4F * f1; - leg2.rotateAngleX = MathHelper.cos(f * 0.6662F + 3.141593F) * 1.4F * f1; - - leg1.rotateAngleY = 0.0F; - leg2.rotateAngleY = 0.0F; - - } - - - -// @Override -// public void setLivingAnimations(EntityLiving entityliving, float f, float f1, float time) { -// EntityTFHydra hydra = (EntityTFHydra)entityliving; -// -// // position the heads -// Vec3 vec; -// -// vec = Vec3.getVec3Pool().getVecFromPool(0, 0, 7*-16); -// vec.rotateAroundX((60 * 3.141593F) / 180F); -// vec.rotateAroundY((0 * 3.141593F) / 180F); -// head1.setRotationPoint((float)vec.xCoord, (float)vec.yCoord - 48, (float)vec.zCoord); -// -// vec = Vec3.getVec3Pool().getVecFromPool(0, 0, 9*-16); -// vec.rotateAroundX((45 * 3.141593F) / 180F); -// vec.rotateAroundY((-60 * 3.141593F) / 180F); -// head2.setRotationPoint((float)vec.xCoord, (float)vec.yCoord - 48, (float)vec.zCoord); -// -// vec = Vec3.getVec3Pool().getVecFromPool(0, 0, 9*-16); -// vec.rotateAroundX((-10 * 3.141593F) / 180F); -// vec.rotateAroundY((60 * 3.141593F) / 180F); -// head3.setRotationPoint((float)vec.xCoord, (float)vec.yCoord - 48, (float)vec.zCoord); -// -// // rotate the heads -// if (hydra.head1 != null) -// { -// head1.rotateAngleY = getRotationY(hydra, hydra.head1, time); -// head1.rotateAngleX = getRotationX(hydra, hydra.head1, time); -// -// head2.rotateAngleY = getRotationY(hydra, hydra.head3, time); -// head2.rotateAngleX = getRotationX(hydra, hydra.head3, time); -// -// head3.rotateAngleY = getRotationY(hydra, hydra.head2, time); -// head3.rotateAngleX = getRotationX(hydra, hydra.head2, time) - 0.015F; -// } -// } - - public float getRotationY(EntityTFHydra hydra, EntityTFHydraPart whichHead, float time) { - - float yawOffset = hydra.prevRenderYawOffset + (hydra.renderYawOffset - hydra.prevRenderYawOffset) * time; - float yaw = whichHead.prevRotationYaw + (whichHead.rotationYaw - whichHead.prevRotationYaw) * time; - - return (yaw - yawOffset) / 57.29578F; - } - - public float getRotationX(EntityTFHydra hydra, EntityTFHydraPart whichHead, float time) { - - return (whichHead.prevRotationPitch + (whichHead.rotationPitch - whichHead.prevRotationPitch) * time) / 57.29578F; - } - - -} diff --git a/src/main/java/twilightforest/client/model/ModelTFHydraHead.java b/src/main/java/twilightforest/client/model/ModelTFHydraHead.java deleted file mode 100644 index 6c2d6039a9..0000000000 --- a/src/main/java/twilightforest/client/model/ModelTFHydraHead.java +++ /dev/null @@ -1,133 +0,0 @@ -package twilightforest.client.model; - -import net.minecraft.client.model.ModelBase; -import net.minecraft.client.model.ModelRenderer; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import twilightforest.entity.boss.EntityTFHydraHead; -import twilightforest.entity.boss.EntityTFHydraPart; - - -public class ModelTFHydraHead extends ModelBase { - - ModelRenderer head; - ModelRenderer jaw; - ModelRenderer frill; - - public ModelTFHydraHead() - { - textureWidth = 512; - textureHeight = 256; - - setTextureOffset("head.box", 272, 0); - setTextureOffset("head.upperlip", 272, 56); - setTextureOffset("head.rearjaw", 272, 132); - setTextureOffset("head.fin", 128, 200); - setTextureOffset("head.fang1", 272, 156); - setTextureOffset("head.fang2", 272, 156); - setTextureOffset("head.teeth", 280, 156); - setTextureOffset("head.teeth2", 280, 160); - setTextureOffset("head.teeth3", 280, 160); - setTextureOffset("jaw.jaw", 272, 92); - setTextureOffset("jaw.fang1", 272, 156); - setTextureOffset("jaw.fang2", 272, 156); - setTextureOffset("jaw.teeth", 280, 156); - setTextureOffset("jaw.teeth2", 280, 160); - setTextureOffset("jaw.teeth3", 280, 160); - setTextureOffset("frill.frill", 272, 200); - - - head = new ModelRenderer(this, "head"); - head.addBox("box", -16F, -14F, -32F, 32, 24, 32); - head.addBox("upperlip", -15F, -2F, -56F, 30, 12, 24); - head.addBox("rearjaw", -15F, 10F, -20F, 30, 8, 16); - head.addBox("fin", -2F, -30F, -12F, 4, 24, 24); - head.addBox("fang1", -12F, 10, -49F, 2, 5, 2); - head.addBox("fang2", 10F, 10, -49F, 2, 5, 2); - head.addBox("teeth", -8F, 9, -49F, 16, 2, 2); - head.addBox("teeth2", -10F, 9, -45F, 2, 2, 16); - head.addBox("teeth3", 8F, 9, -45F, 2, 2, 16); - head.setRotationPoint(0F, 0F, 0F); - - jaw = new ModelRenderer(this, "jaw"); - jaw.setRotationPoint(0F, 10F, -20F); - jaw.addBox("jaw", -15F, 0F, -32F, 30, 8, 32); - jaw.addBox("fang1", -10F, -5, -29F, 2, 5, 2); - jaw.addBox("fang2", 8F, -5, -29F, 2, 5, 2); - jaw.addBox("teeth", -8F, -1, -29F, 16, 2, 2); - jaw.addBox("teeth2", -10F, -1, -25F, 2, 2, 16); - jaw.addBox("teeth3", 8F, -1, -25F, 2, 2, 16); - setRotation(jaw, 0F, 0F, 0F); - head.addChild(jaw); - - frill = new ModelRenderer(this, "frill"); - frill.setRotationPoint(0F, 0F, -14F); - frill.addBox("frill", -24F, -40.0F, 0F, 48, 48, 4); - setRotation(frill, -0.5235988F, 0F, 0F); - head.addChild(frill); - } - - private void setRotation(ModelRenderer model, float x, float y, float z) - { - model.rotateAngleX = x; - model.rotateAngleY = y; - model.rotateAngleZ = z; - } - - @Override - public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) - { - super.render(entity, f, f1, f2, f3, f4, f5); - setRotationAngles(f, f1, f2, f3, f4, f5, entity); - head.render(f5); - } - - public void render(float f5) - { - head.render(f5); - } - - @Override - public void setRotationAngles(float f, float f1, float f2, float f3, float f4, float f5, Entity par7Entity) - { - //System.out.println("Setting head rotation to " + f3 + ", " + f4); - -// head.rotateAngleY = f3 / (180F / (float)Math.PI); -// head.rotateAngleX = f4 / (180F / (float)Math.PI); - } - - @Override - public void setLivingAnimations(EntityLivingBase entityliving, float f, float f1, float time) { - EntityTFHydraHead whichHead = (EntityTFHydraHead)entityliving; - - head.rotateAngleY = getRotationY(whichHead, time); - head.rotateAngleX = getRotationX(whichHead, time); - - float mouthOpen = whichHead.getMouthOpen(); - head.rotateAngleX -= (float) (mouthOpen * (Math.PI / 12.0)); - jaw.rotateAngleX = (float) (mouthOpen * (Math.PI / 3.0)); - } - - public void openMouthForTrophy(float mouthOpen) { - head.rotateAngleY = 0; - head.rotateAngleX = 0; - - head.rotateAngleX -= (float) (mouthOpen * (Math.PI / 12.0)); - jaw.rotateAngleX = (float) (mouthOpen * (Math.PI / 3.0)); - - } - - public float getRotationY(EntityTFHydraPart whichHead, float time) { - - //float yawOffset = hydra.prevRenderYawOffset + (hydra.renderYawOffset - hydra.prevRenderYawOffset) * time; - float yaw = whichHead.prevRotationYaw + (whichHead.rotationYaw - whichHead.prevRotationYaw) * time; - - return yaw / 57.29578F; - } - - public float getRotationX(EntityTFHydraPart whichHead, float time) { - - return (whichHead.prevRotationPitch + (whichHead.rotationPitch - whichHead.prevRotationPitch) * time) / 57.29578F; - } - -} diff --git a/src/main/java/twilightforest/client/model/ModelTFHydraMortar.java b/src/main/java/twilightforest/client/model/ModelTFHydraMortar.java deleted file mode 100644 index 0426c72f96..0000000000 --- a/src/main/java/twilightforest/client/model/ModelTFHydraMortar.java +++ /dev/null @@ -1,24 +0,0 @@ -package twilightforest.client.model; - -import net.minecraft.client.model.ModelBase; -import net.minecraft.client.model.ModelRenderer; - -public class ModelTFHydraMortar extends ModelBase -{ - - public ModelRenderer box; - - public ModelTFHydraMortar() - { - textureWidth = 32; - textureHeight = 32; - box = new ModelRenderer(this, 0, 0); - box.addBox(-4F, 0F, -4F, 8, 8, 8, 0F); - box.setRotationPoint(0F, 0F, 0F); - } - - public void render(float f5) - { - box.render(f5); - } -} diff --git a/src/main/java/twilightforest/client/model/ModelTFHydraNeck.java b/src/main/java/twilightforest/client/model/ModelTFHydraNeck.java deleted file mode 100644 index d80a7f8253..0000000000 --- a/src/main/java/twilightforest/client/model/ModelTFHydraNeck.java +++ /dev/null @@ -1,42 +0,0 @@ -package twilightforest.client.model; - -import net.minecraft.client.model.ModelBase; -import net.minecraft.client.model.ModelRenderer; -import net.minecraft.entity.Entity; - - -public class ModelTFHydraNeck extends ModelBase { - - ModelRenderer neck; - - public ModelTFHydraNeck() - { - textureWidth = 512; - textureHeight = 256; - - setTextureOffset("neck.box", 128, 136); - setTextureOffset("neck.fin", 128, 200); - neck = new ModelRenderer(this, "neck"); - neck.addBox("box", -16F, -16F, -16F, 32, 32, 32); - neck.addBox("fin", -2F, -23F, 0F, 4, 24, 24); - neck.setRotationPoint(0F, 0F, 0F); - - } - - @Override - public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) - { - super.render(entity, f, f1, f2, f3, f4, f5); - setRotationAngles(f, f1, f2, f3, f4, f5, entity); - neck.render(f5); - } - - @Override - public void setRotationAngles(float f, float f1, float f2, float f3, float f4, float f5, Entity entity) - { - neck.rotateAngleY = f3 / 57.29578F; - neck.rotateAngleX = f4 / 57.29578F; - } - - -} diff --git a/src/main/java/twilightforest/client/model/ModelTFIceCrystal.java b/src/main/java/twilightforest/client/model/ModelTFIceCrystal.java deleted file mode 100644 index ae4d2fd0ad..0000000000 --- a/src/main/java/twilightforest/client/model/ModelTFIceCrystal.java +++ /dev/null @@ -1,96 +0,0 @@ -package twilightforest.client.model; - -import net.minecraft.client.model.ModelBase; -import net.minecraft.client.model.ModelRenderer; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.util.MathHelper; - -import org.lwjgl.opengl.GL11; - -public class ModelTFIceCrystal extends ModelBase { - - public ModelRenderer[] spikes = new ModelRenderer[16]; - - - public ModelTFIceCrystal() { - this.textureWidth = 32; - this.textureHeight = 32; - - float par1 = 0F; - float par2 = 0F; - - // spikes - for (int i = 0; i < spikes.length; i++) { - this.spikes[i] = new ModelRenderer(this, 0, 16); - - int spikeLength = i % 2 == 0 ? 6 : 8; - - this.spikes[i].addBox(-1.0F, -1.0F, -1.0F, 2, spikeLength, 2, par1); - this.spikes[i].setRotationPoint(0.0F, 0.0F + par2, 0.0F); - - ModelRenderer cube = new ModelRenderer(this, 8, 16); - cube.addBox(-1.5F, -1.5F, -1.5F, 3, 3, 3); - cube.setRotationPoint(0.0F, spikeLength, 0.0F); - - cube.rotateAngleZ = (float) (Math.PI / 4F); - - this.spikes[i].addChild(cube); - - } - } - - public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) - { - setRotationAngles(f, f1, f2, f3, f4, f5, entity); - //this.bipedHead.render(f5); - - for (int i = 0; i < spikes.length; i++) { - - if (entity.isEntityAlive()) { - GL11.glEnable(GL11.GL_BLEND); - GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - - GL11.glColor4f(1F, 1F, 1F, 0.6F); - } - - this.spikes[i].render(f5); - - GL11.glDisable(GL11.GL_BLEND); - - } - } - - /** - * Used for easily adding entity-dependent animations. The second and third float params here are the same second - * and third as in the setRotationAngles method. - */ - public void setLivingAnimations(EntityLivingBase par1EntityLiving, float par2, float par3, float time) - { - for (int i = 0; i < spikes.length; i++) { - // rotate the spikes - this.spikes[i].rotateAngleX = MathHelper.sin((par1EntityLiving.ticksExisted + time) / 5.0F) / 4.0F; - this.spikes[i].rotateAngleY = (par1EntityLiving.ticksExisted + time) / 5.0F; - this.spikes[i].rotateAngleZ = MathHelper.cos((par1EntityLiving.ticksExisted + time) / 5.0F) / 4.0F; - - this.spikes[i].rotateAngleX += i * (Math.PI / 8F); - - if (i % 4 == 0) { - this.spikes[i].rotateAngleY += 1; - } else if (i % 4 == 2) { - this.spikes[i].rotateAngleY -= 1; - } - - //this.spikes[i].rotateAngleY += i * (Math.PI / 8F); - //this.spikes[i].rotateAngleZ += i * (Math.PI / 8F); - - -// this.spikes[i].rotationPointX = MathHelper.cos((par1EntityLiving.ticksExisted + time) / (float)i) * 3F; -// this.spikes[i].rotationPointY = 5F + MathHelper.sin((par1EntityLiving.ticksExisted + time) / (float)i) * 3F; -// this.spikes[i].rotationPointZ = MathHelper.sin((par1EntityLiving.ticksExisted + time) / (float)i) * 3F; - - //((ModelRenderer)this.spikes[i].childModels.get(0)).rotationPointY = 10 + MathHelper.sin((i + par1EntityLiving.ticksExisted + time) / i) * 3F; - - } - } -} diff --git a/src/main/java/twilightforest/client/model/ModelTFIceExploder.java b/src/main/java/twilightforest/client/model/ModelTFIceExploder.java deleted file mode 100644 index 175a565d36..0000000000 --- a/src/main/java/twilightforest/client/model/ModelTFIceExploder.java +++ /dev/null @@ -1,100 +0,0 @@ -package twilightforest.client.model; - -import org.lwjgl.opengl.GL11; - -import net.minecraft.client.model.ModelBiped; -import net.minecraft.client.model.ModelRenderer; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.util.MathHelper; - -public class ModelTFIceExploder extends ModelBiped { - - public ModelRenderer[] spikes = new ModelRenderer[16]; - - - public ModelTFIceExploder() { - this.textureWidth = 32; - this.textureHeight = 32; - - float par1 = 0F; - float par2 = 0F; - this.bipedHead = new ModelRenderer(this, 0, 0); - this.bipedHead.addBox(-4.0F, 0.0F, -4.0F, 8, 8, 8, par1); - this.bipedHead.setRotationPoint(0.0F, 0.0F + par2, 0.0F); - - // delete all other body parts - this.bipedHeadwear = new ModelRenderer(this, 0, 0); - this.bipedBody = new ModelRenderer(this, 0, 0); - this.bipedRightArm = new ModelRenderer(this, 0, 0); - this.bipedLeftArm = new ModelRenderer(this, 0, 0); - this.bipedRightLeg = new ModelRenderer(this, 0, 0); - this.bipedLeftLeg = new ModelRenderer(this, 0, 0); - - // spikes - - for (int i = 0; i < spikes.length; i++) { - this.spikes[i] = new ModelRenderer(this, 0, 16); - - int spikeLength = i % 2 == 0 ? 6 : 8; - - this.spikes[i].addBox(-1.0F, 6.0F, -1.0F, 2, spikeLength, 2, par1); - this.spikes[i].setRotationPoint(0.0F, 4.0F + par2, 0.0F); - - ModelRenderer cube = new ModelRenderer(this, 8, 16); - cube.addBox(-1.5F, -1.5F, -1.5F, 3, 3, 3); - cube.setRotationPoint(0.0F, 8F, 0.0F); - - cube.rotateAngleZ = (float) (Math.PI / 4F); - - this.spikes[i].addChild(cube); - - } - } - - public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) - { - setRotationAngles(f, f1, f2, f3, f4, f5, entity); - this.bipedHead.render(f5); - - for (int i = 0; i < spikes.length; i++) { - - if (entity.isEntityAlive()) { - GL11.glEnable(GL11.GL_BLEND); - GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - - GL11.glColor4f(1F, 1F, 1F, 0.6F); - } - - this.spikes[i].render(f5); - - GL11.glDisable(GL11.GL_BLEND); - - } - } - - /** - * Used for easily adding entity-dependent animations. The second and third float params here are the same second - * and third as in the setRotationAngles method. - */ - public void setLivingAnimations(EntityLivingBase par1EntityLiving, float par2, float par3, float time) - { - for (int i = 0; i < spikes.length; i++) { - // rotate the spikes - this.spikes[i].rotateAngleY = (par1EntityLiving.ticksExisted + time) / 5.0F; - this.spikes[i].rotateAngleX = MathHelper.sin((par1EntityLiving.ticksExisted + time) / 5.0F) / 4.0F; - this.spikes[i].rotateAngleZ = MathHelper.cos((par1EntityLiving.ticksExisted + time) / 5.0F) / 4.0F; - - this.spikes[i].rotateAngleX += i * 5; - this.spikes[i].rotateAngleY += i * 2.5f; - this.spikes[i].rotateAngleZ += i * 3; - - this.spikes[i].rotationPointX = MathHelper.cos((par1EntityLiving.ticksExisted + time) / (float)i) * 3F; - this.spikes[i].rotationPointY = 5F + MathHelper.sin((par1EntityLiving.ticksExisted + time) / (float)i) * 3F; - this.spikes[i].rotationPointZ = MathHelper.sin((par1EntityLiving.ticksExisted + time) / (float)i) * 3F; - - ((ModelRenderer)this.spikes[i].childModels.get(0)).rotationPointY = 10 + MathHelper.sin((i + par1EntityLiving.ticksExisted + time) / i) * 3F; - - } - } -} diff --git a/src/main/java/twilightforest/client/model/ModelTFIceShooter.java b/src/main/java/twilightforest/client/model/ModelTFIceShooter.java deleted file mode 100644 index 4687773526..0000000000 --- a/src/main/java/twilightforest/client/model/ModelTFIceShooter.java +++ /dev/null @@ -1,33 +0,0 @@ -package twilightforest.client.model; - -import net.minecraft.client.model.ModelRenderer; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.util.MathHelper; - -public class ModelTFIceShooter extends ModelTFIceExploder { - - - /** - * Used for easily adding entity-dependent animations. The second and third float params here are the same second - * and third as in the setRotationAngles method. - */ - public void setLivingAnimations(EntityLivingBase par1EntityLiving, float par2, float par3, float time) - { - for (int i = 0; i < spikes.length; i++) { - // rotate the spikes - this.spikes[i].rotateAngleY = (3.14159F / 2F) + (MathHelper.sin((par1EntityLiving.ticksExisted + time) / 5.0F) * 0.5F); - this.spikes[i].rotateAngleX = (par1EntityLiving.ticksExisted + time) / 5.0F; - this.spikes[i].rotateAngleZ = MathHelper.cos(i / 5.0F) / 4.0F; - - this.spikes[i].rotateAngleX += i * (Math.PI / 8F); - //this.spikes[i].rotateAngleY += i * 2.5f; - //this.spikes[i].rotateAngleZ += i * 3; - - ((ModelRenderer)this.spikes[i].childModels.get(0)).rotationPointY = 9.5F + MathHelper.sin((i + par1EntityLiving.ticksExisted + time) / 3F) * 3F; - - - //((ModelBox)this.spikes[i].cubeList.get(0)). = 6 + MathHelper.sin((par1EntityLiving.ticksExisted + time) / (float)i) * 3F; - - } - } -} diff --git a/src/main/java/twilightforest/client/model/ModelTFKnightPhantom.java b/src/main/java/twilightforest/client/model/ModelTFKnightPhantom.java deleted file mode 100644 index ac46259be0..0000000000 --- a/src/main/java/twilightforest/client/model/ModelTFKnightPhantom.java +++ /dev/null @@ -1,168 +0,0 @@ -package twilightforest.client.model; - -import net.minecraft.client.model.ModelBiped; -import net.minecraft.client.model.ModelRenderer; -import net.minecraft.entity.Entity; -import net.minecraft.util.MathHelper; - -public class ModelTFKnightPhantom extends ModelBiped { - - public ModelRenderer helmet; - public ModelRenderer righthorn1; - public ModelRenderer righthorn2; - public ModelRenderer lefthorn1; - public ModelRenderer lefthorn2; - - - public ModelTFKnightPhantom() - { - this.heldItemLeft = 0; - this.heldItemRight = 0; - this.isSneak = false; - this.aimedBow = false; - this.textureWidth = 128; - this.textureHeight = 64; - - this.bipedCloak = new ModelRenderer(this, 0, 0); - this.bipedCloak.addBox(-5.0F, 0.0F, -1.0F, 10, 16, 1); - this.bipedEars = new ModelRenderer(this, 24, 0); - this.bipedEars.addBox(-3.0F, -6.0F, -1.0F, 6, 6, 1); - - this.bipedHead = new ModelRenderer(this, 0, 0); - this.bipedHead.addBox(0, 0, 0, 0, 0, 0); - this.bipedHead.setRotationPoint(0.0F, -10.0F, 0.0F); - - this.bipedHeadwear = new ModelRenderer(this, 0, 0); - this.bipedHeadwear.addBox(0, 0, 0, 0, 0, 0); - this.bipedHeadwear.setRotationPoint(0.0F, -10.0F, 0.0F); - - this.helmet = new ModelRenderer(this, 0, 0); - this.helmet.addBox(-4.0F, -11.0F, -4.0F, 8, 11, 8); - this.helmet.rotateAngleY = 45F / (180F / (float)Math.PI); - - this.righthorn1 = new ModelRenderer(this, 28, 0); - this.righthorn1.addBox(-6F, -1.5F, -1.5F, 7, 3, 3); - this.righthorn1.setRotationPoint(-3.5F, -9F, 0.0F); - this.righthorn1.rotateAngleY = 15F / (180F / (float)Math.PI); - this.righthorn1.rotateAngleZ = 10F / (180F / (float)Math.PI); - - this.righthorn2 = new ModelRenderer(this, 28, 6); - this.righthorn2.addBox(-3.0F, -1.0F, -1.0F, 3, 2, 2); - this.righthorn2.setRotationPoint(-5.5F, 0.0F, 0.0F); - this.righthorn2.rotateAngleZ = 10F / (180F / (float)Math.PI); - - this.righthorn1.addChild(righthorn2); - - this.lefthorn1 = new ModelRenderer(this, 28, 0); - this.lefthorn1.mirror = true; - this.lefthorn1.addBox(-1F, -1.5F, -1.5F, 7, 3, 3); - this.lefthorn1.setRotationPoint(3.5F, -9F, 0.0F); - this.lefthorn1.rotateAngleY = -15F / (180F / (float)Math.PI); - this.lefthorn1.rotateAngleZ = -10F / (180F / (float)Math.PI); - - this.lefthorn2 = new ModelRenderer(this, 28, 6); - this.lefthorn2.addBox(0.0F, -1.0F, -1.0F, 3, 2, 2); - this.lefthorn2.setRotationPoint(5.5F, 0.0F, 0.0F); - this.lefthorn2.rotateAngleZ = -10F / (180F / (float)Math.PI); - - this.lefthorn1.addChild(lefthorn2); - - this.bipedHeadwear.addChild(helmet); - this.bipedHeadwear.addChild(righthorn1); - this.bipedHeadwear.addChild(lefthorn1); - - this.bipedBody = new ModelRenderer(this, 0, 18); - this.bipedBody.setRotationPoint(0.0F, 2.0F, 0.0F); - this.bipedBody.addBox(-7.0F, -12.0F, -3.5F, 14, 12, 7); - this.bipedBody.setTextureOffset(30, 24).addBox(-6.0F, 0F, -3F, 12, 8, 6); // torso - - this.bipedRightArm = new ModelRenderer(this, 44, 16); - this.bipedRightArm.addBox(-5.0F, -2.0F, -3.0F, 6, 7, 6); - this.bipedRightArm.setRotationPoint(-8.0F, -8.0F, 0.0F); - - this.bipedLeftArm = new ModelRenderer(this, 44, 16); - this.bipedLeftArm.mirror = true; - this.bipedLeftArm.addBox(-1.0F, -2.0F, -3.0F, 6, 7, 6); - this.bipedLeftArm.setRotationPoint(8.0F, -8.0F, 0.0F); - - this.bipedRightLeg = new ModelRenderer(this, 0, 0); - this.bipedRightLeg.addBox(0, 0, 0, 0, 0, 0); - this.bipedRightLeg.setRotationPoint(0.0F, 12.0F, 0.0F); - - this.bipedLeftLeg = new ModelRenderer(this, 0, 0); - this.bipedLeftLeg.addBox(0, 0, 0, 0, 0, 0); - this.bipedLeftLeg.setRotationPoint(0.0F, 12.0F, 0.0F); - - - - } - - - /** - * Sets the model's various rotation angles. For bipeds, par1 and par2 are used for animating the movement of arms - * and legs, where par1 represents the time(so that arms and legs swing back and forth) and par2 represents how - * "far" arms and legs can swing at most. - */ - public void setRotationAngles(float par1, float par2, float par3, float par4, float par5, float par6, Entity par7Entity) - { - this.bipedHead.rotateAngleY = par4 / (180F / (float)Math.PI); - this.bipedHead.rotateAngleX = par5 / (180F / (float)Math.PI); - this.bipedHead.rotateAngleZ = 0; - this.bipedHeadwear.rotateAngleY = this.bipedHead.rotateAngleY; - this.bipedHeadwear.rotateAngleX = this.bipedHead.rotateAngleX; - this.bipedHeadwear.rotateAngleZ = this.bipedHead.rotateAngleZ; - - - this.bipedRightArm.rotateAngleX = MathHelper.cos(par1 * 0.6662F + (float)Math.PI) * 2.0F * par2 * 0.5F; - this.bipedLeftArm.rotateAngleX = MathHelper.cos(par1 * 0.6662F) * 2.0F * par2 * 0.5F; - this.bipedRightArm.rotateAngleZ = 0.0F; - this.bipedLeftArm.rotateAngleZ = 0.0F; - - -// this.bipedRightLeg.rotateAngleX = MathHelper.cos(par1 * 0.6662F) * 1.4F * par2; -// this.bipedLeftLeg.rotateAngleX = MathHelper.cos(par1 * 0.6662F + (float)Math.PI) * 1.4F * par2; -// this.bipedRightLeg.rotateAngleY = 0.0F; -// this.bipedLeftLeg.rotateAngleY = 0.0F; -// -// if (this.isRiding) -// { -// this.bipedRightArm.rotateAngleX += -((float)Math.PI / 5F); -// this.bipedLeftArm.rotateAngleX += -((float)Math.PI / 5F); -// this.bipedRightLeg.rotateAngleX = 0; -// this.bipedLeftLeg.rotateAngleX = 0; -//// this.bipedRightLeg.rotateAngleY = ((float)Math.PI / 10F); -//// this.bipedLeftLeg.rotateAngleY = -((float)Math.PI / 10F); -// } - - if (this.heldItemLeft != 0) - { - this.bipedLeftArm.rotateAngleX = this.bipedLeftArm.rotateAngleX * 0.5F - ((float)Math.PI / 10F) * (float)this.heldItemLeft; - } - - this.heldItemRight = 1; - - if (this.heldItemRight != 0) - { - this.bipedRightArm.rotateAngleX = this.bipedRightArm.rotateAngleX * 0.5F - ((float)Math.PI / 10F) * (float)this.heldItemRight; - } -// -// bipedRightArm.rotateAngleX -= (Math.PI * 0.66); -// -// // during swing move arm forward -// if (upperKnight.heavySpearTimer > 0) -// { -// bipedRightArm.rotateAngleX -= this.getArmRotationDuringSwing(60 - upperKnight.heavySpearTimer + par6) / (180F / (float)Math.PI); -// } - -// this.bipedRightArm.rotateAngleY = 0.0F; -// this.bipedLeftArm.rotateAngleY = 0.0F; - - this.bipedRightArm.rotateAngleZ += MathHelper.cos(par3 * 0.09F) * 0.05F + 0.05F; - this.bipedLeftArm.rotateAngleZ -= MathHelper.cos(par3 * 0.09F) * 0.05F + 0.05F; - this.bipedRightArm.rotateAngleX += MathHelper.sin(par3 * 0.067F) * 0.05F; - this.bipedLeftArm.rotateAngleX -= MathHelper.sin(par3 * 0.067F) * 0.05F; - - } - - -} diff --git a/src/main/java/twilightforest/client/model/ModelTFKnightPhantom2.java b/src/main/java/twilightforest/client/model/ModelTFKnightPhantom2.java deleted file mode 100644 index f721c7273c..0000000000 --- a/src/main/java/twilightforest/client/model/ModelTFKnightPhantom2.java +++ /dev/null @@ -1,72 +0,0 @@ -package twilightforest.client.model; - -import net.minecraft.client.model.ModelBiped; -import net.minecraft.client.model.ModelRenderer; -import net.minecraft.entity.Entity; -import net.minecraft.util.MathHelper; -import twilightforest.entity.boss.EntityTFKnightPhantom; - -public class ModelTFKnightPhantom2 extends ModelBiped { - - public ModelTFKnightPhantom2() - { - this(0.0F); - } - - public ModelTFKnightPhantom2(float par1) - { - super(par1, 0.0F, 64, 32); - this.bipedRightArm = new ModelRenderer(this, 40, 16); - this.bipedRightArm.addBox(-1.0F, -2.0F, -1.0F, 2, 12, 2, par1); - this.bipedRightArm.setRotationPoint(-5.0F, 2.0F, 0.0F); - this.bipedLeftArm = new ModelRenderer(this, 40, 16); - this.bipedLeftArm.mirror = true; - this.bipedLeftArm.addBox(-1.0F, -2.0F, -1.0F, 2, 12, 2, par1); - this.bipedLeftArm.setRotationPoint(5.0F, 2.0F, 0.0F); - this.bipedRightLeg = new ModelRenderer(this, 0, 16); - this.bipedRightLeg.addBox(-1.0F, 0.0F, -1.0F, 2, 12, 2, par1); - this.bipedRightLeg.setRotationPoint(-2.0F, 12.0F, 0.0F); - this.bipedLeftLeg = new ModelRenderer(this, 0, 16); - this.bipedLeftLeg.mirror = true; - this.bipedLeftLeg.addBox(-1.0F, 0.0F, -1.0F, 2, 12, 2, par1); - this.bipedLeftLeg.setRotationPoint(2.0F, 12.0F, 0.0F); - } - - /** - * Sets the models various rotation angles then renders the model. - */ - public void render(Entity par1Entity, float par2, float par3, float par4, float par5, float par6, float par7) - { - this.setRotationAngles(par2, par3, par4, par5, par6, par7, par1Entity); - - if (((EntityTFKnightPhantom)par1Entity).isChargingAtPlayer()) - { - // render full skeleton - super.render(par1Entity, par2, par3, par4, par5, par6, par7); - } - } - - - /** - * Sets the model's various rotation angles. For bipeds, par1 and par2 are used for animating the movement of arms - * and legs, where par1 represents the time(so that arms and legs swing back and forth) and par2 represents how - * "far" arms and legs can swing at most. - */ - public void setRotationAngles(float par1, float par2, float par3, float par4, float par5, float par6, Entity par7Entity) - { - super.setRotationAngles(par1, par2, par3, par4, par5, par6, par7Entity); - this.bipedLeftLeg.rotateAngleX = 0; - this.bipedLeftLeg.rotateAngleY = 0; - this.bipedLeftLeg.rotateAngleZ = 0; - - this.bipedRightLeg.rotateAngleX = 0; - this.bipedRightLeg.rotateAngleY = 0; - this.bipedRightLeg.rotateAngleZ = 0; - - this.bipedRightLeg.rotateAngleX = 0.2F * MathHelper.sin(par3 * 0.3F) + 0.4F; - this.bipedLeftLeg.rotateAngleX = 0.2F * MathHelper.sin(par3 * 0.3F) + 0.4F; - - - } - -} diff --git a/src/main/java/twilightforest/client/model/ModelTFKnightlyArmor.java b/src/main/java/twilightforest/client/model/ModelTFKnightlyArmor.java deleted file mode 100644 index 568b0c7cba..0000000000 --- a/src/main/java/twilightforest/client/model/ModelTFKnightlyArmor.java +++ /dev/null @@ -1,152 +0,0 @@ -package twilightforest.client.model; - -import net.minecraft.client.model.ModelBiped; -import net.minecraft.client.model.ModelRenderer; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; - -public class ModelTFKnightlyArmor extends ModelBiped { - - public ModelRenderer righthorn1; - public ModelRenderer righthorn2; - public ModelRenderer lefthorn1; - public ModelRenderer lefthorn2; - - public ModelRenderer shoulderSpike1; - public ModelRenderer shoulderSpike2; - - public ModelRenderer shoeSpike1; - public ModelRenderer shoeSpike2; - - - public ModelTFKnightlyArmor(int part, float expand) - { - super(expand); - - this.righthorn1 = new ModelRenderer(this, 32, 0); - this.righthorn1.addBox(-5.5F, -1.5F, -1.5F, 5, 3, 3); - this.righthorn1.setRotationPoint(-4.0F, -6.5F, 0.0F); - this.righthorn1.rotateAngleY = -15F / (180F / (float)Math.PI); - this.righthorn1.rotateAngleZ = 10F / (180F / (float)Math.PI); - - this.righthorn2 = new ModelRenderer(this, 32, 6); - this.righthorn2.addBox(-3.5F, -1.0F, -1.0F, 3, 2, 2); - this.righthorn2.setRotationPoint(-4.5F, 0.0F, 0.0F); - this.righthorn2.rotateAngleZ = 10F / (180F / (float)Math.PI); - - this.righthorn1.addChild(righthorn2); - - this.lefthorn1 = new ModelRenderer(this, 32, 0); - this.lefthorn1.mirror = true; - this.lefthorn1.addBox(0.5F, -1.5F, -1.5F, 5, 3, 3); - this.lefthorn1.setRotationPoint(4.0F, -6.5F, 0.0F); - this.lefthorn1.rotateAngleY = 15F / (180F / (float)Math.PI); - this.lefthorn1.rotateAngleZ = -10F / (180F / (float)Math.PI); - - this.lefthorn2 = new ModelRenderer(this, 32, 6); - this.lefthorn2.addBox(0.5F, -1.0F, -1.0F, 3, 2, 2); - this.lefthorn2.setRotationPoint(4.5F, 0.0F, 0.0F); - this.lefthorn2.rotateAngleZ = -10F / (180F / (float)Math.PI); - - this.lefthorn1.addChild(lefthorn2); - - this.bipedHead.addChild(righthorn1); - this.bipedHead.addChild(lefthorn1); - - - this.shoulderSpike1 = new ModelRenderer(this, 32, 10); - this.shoulderSpike1.addBox(-1.0F, -1.0F, -1.0F, 2, 2, 2, 0.5F); - this.shoulderSpike1.setRotationPoint(-3.75F, -2.5F, 0.0F); - this.shoulderSpike1.rotateAngleX = 45F / (180F / (float)Math.PI); - this.shoulderSpike1.rotateAngleY = 10F / (180F / (float)Math.PI); - this.shoulderSpike1.rotateAngleZ = 35F / (180F / (float)Math.PI); - - this.bipedRightArm.addChild(shoulderSpike1); - - this.shoulderSpike2 = new ModelRenderer(this, 32, 10); - this.shoulderSpike2.addBox(-1.0F, -1.0F, -1.0F, 2, 2, 2, 0.5F); - this.shoulderSpike2.setRotationPoint(3.75F, -2.5F, 0.0F); - this.shoulderSpike2.rotateAngleX = -45F / (180F / (float)Math.PI); - this.shoulderSpike2.rotateAngleY = -10F / (180F / (float)Math.PI); - this.shoulderSpike2.rotateAngleZ = 55F / (180F / (float)Math.PI); - - this.bipedLeftArm.addChild(shoulderSpike2); - - this.shoeSpike1 = new ModelRenderer(this, 32, 10); - this.shoeSpike1.addBox(-1.0F, -1.0F, -1.0F, 2, 2, 2, 0.5F); - this.shoeSpike1.setRotationPoint(-2.5F, 11F, 2.0F); - this.shoeSpike1.rotateAngleY = -45F / (180F / (float)Math.PI); - - this.bipedRightLeg.addChild(shoeSpike1); - - this.shoeSpike2 = new ModelRenderer(this, 32, 10); - this.shoeSpike2.addBox(-1.0F, -1.0F, -1.0F, 2, 2, 2, 0.5F); - this.shoeSpike2.setRotationPoint(2.5F, 11F, 2.0F); - this.shoeSpike2.rotateAngleY = 45F / (180F / (float)Math.PI); - - this.bipedLeftLeg.addChild(shoeSpike2); - - - - switch (part) - { - case 0: // helmet - this.bipedHead.showModel = true; - this.bipedHeadwear.showModel = false; - this.bipedBody.showModel = false; - this.bipedRightArm.showModel = false; - this.bipedLeftArm.showModel = false; - this.bipedRightLeg.showModel = false; - this.bipedLeftLeg.showModel = false; - break; - case 1: // chest - this.bipedHead.showModel = false; - this.bipedHeadwear.showModel = false; - this.bipedBody.showModel = true; - this.bipedRightArm.showModel = true; - this.bipedLeftArm.showModel = true; - this.bipedRightLeg.showModel = false; - this.bipedLeftLeg.showModel = false; - break; - case 2: // pants - this.bipedHead.showModel = false; - this.bipedHeadwear.showModel = false; - this.bipedBody.showModel = true; - this.bipedRightArm.showModel = false; - this.bipedLeftArm.showModel = false; - this.bipedRightLeg.showModel = true; - this.bipedLeftLeg.showModel = true; - break; - case 3: // boots - this.bipedHead.showModel = false; - this.bipedHeadwear.showModel = false; - this.bipedBody.showModel = false; - this.bipedRightArm.showModel = false; - this.bipedLeftArm.showModel = false; - this.bipedRightLeg.showModel = true; - this.bipedLeftLeg.showModel = true; - break; - - } - } - - - /** - * Sets the models various rotation angles then renders the model. - */ - @Override - public void render(Entity par1Entity, float par2, float par3, float par4, float par5, float par6, float par7) { - - if (par1Entity != null) { - this.isSneak = par1Entity.isSneaking(); - } - - if (par1Entity != null && par1Entity instanceof EntityLivingBase) { - this.heldItemRight = ((EntityLivingBase)par1Entity).getHeldItem() != null ? 1 : 0; - } - - super.render(par1Entity, par2, par3, par4, par5, par6, par7); - } - - -} diff --git a/src/main/java/twilightforest/client/model/ModelTFKobold.java b/src/main/java/twilightforest/client/model/ModelTFKobold.java deleted file mode 100644 index 7716ba651c..0000000000 --- a/src/main/java/twilightforest/client/model/ModelTFKobold.java +++ /dev/null @@ -1,150 +0,0 @@ -// Date: 6/11/2012 3:12:45 PM -// Template version 1.1 -// Java generated by Techne -// Keep in mind that you still need to fill in some blanks -// - ZeuX - -package twilightforest.client.model; - -import net.minecraft.client.model.ModelBiped; -import net.minecraft.client.model.ModelRenderer; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.util.MathHelper; - -public class ModelTFKobold extends ModelBiped -{ - //fields - - ModelRenderer rightear; - ModelRenderer leftear; - ModelRenderer snout; - ModelRenderer jaw; - - boolean isJumping; - - public ModelTFKobold() - { - isJumping = false; - - textureWidth = 64; - textureHeight = 32; - - bipedHead = new ModelRenderer(this, 0, 0); - bipedHead.addBox(-3.5F, -7F, -3F, 7, 6, 6); - bipedHead.setRotationPoint(0F, 13F, 0F); - - bipedBody = new ModelRenderer(this, 12, 19); - bipedBody.addBox(0F, 0F, 0F, 7, 7, 4); - bipedBody.setRotationPoint(-3.5F, 12F, -2F); - - bipedRightArm = new ModelRenderer(this, 36, 17); - bipedRightArm.addBox(-3F, -1F, -1.5F, 3, 7, 3); - bipedRightArm.setRotationPoint(-3.5F, 12F, 0F); - - bipedLeftArm.mirror = true; - bipedLeftArm = new ModelRenderer(this, 36, 17); - bipedLeftArm.addBox(0F, -1F, -1.5F, 3, 7, 3); - bipedLeftArm.setRotationPoint(3.5F, 12F, 0F); - - bipedLeftArm.mirror = false; - bipedRightLeg = new ModelRenderer(this, 0, 20); - bipedRightLeg.addBox(-1.5F, 0F, -1.5F, 3, 5, 3); - bipedRightLeg.setRotationPoint(-2F, 19F, 0F); - - bipedLeftLeg = new ModelRenderer(this, 0, 20); - bipedLeftLeg.addBox(-1.5F, 0F, -1.5F, 3, 5, 3); - bipedLeftLeg.setRotationPoint(2F, 19F, 0F); - - rightear = new ModelRenderer(this, 48, 20); - rightear.addBox(0F, -4F, 0F, 4, 4, 1); - rightear.setRotationPoint(3.5F, -3F, -1F); - rightear.rotateAngleY = 0.2617994F; - rightear.rotateAngleZ = -0.3490659F; - - bipedHead.addChild(rightear); - - leftear = new ModelRenderer(this, 48, 25); - leftear.addBox(-4F, -4F, 0F, 4, 4, 1); - leftear.setRotationPoint(-3.5F, -3F, -1F); - leftear.rotateAngleY = -0.2617994F; - leftear.rotateAngleZ = 0.3490659F; - - bipedHead.addChild(leftear); - - - snout = new ModelRenderer(this, 28, 0); - snout.addBox(-1.5F, -2F, -2F, 3, 2, 3); - snout.setRotationPoint(0F, -2F, -3F); - - bipedHead.addChild(snout); - - jaw = new ModelRenderer(this, 28, 5); - jaw.addBox(-1.5F, 0F, -2F, 3, 1, 3); - jaw.setRotationPoint(0F, -2F, -3F); - jaw.rotateAngleX = 0.20944F; - - bipedHead.addChild(jaw); -} - - - /** - * Sets the models various rotation angles. - */ - public void setRotationAngles(float par1, float par2, float par3, float par4, float par5, float par6) - { - this.bipedHead.rotateAngleY = par4 / (180F / (float)Math.PI); - this.bipedHead.rotateAngleX = par5 / (180F / (float)Math.PI); - - this.bipedRightArm.rotateAngleX = MathHelper.cos(par1 * 0.6662F + (float)Math.PI) * 2.0F * par2 * 0.5F; - this.bipedLeftArm.rotateAngleX = MathHelper.cos(par1 * 0.6662F) * 2.0F * par2 * 0.5F; - this.bipedRightArm.rotateAngleZ = 0.0F; - this.bipedLeftArm.rotateAngleZ = 0.0F; - - this.bipedRightArm.rotateAngleX = -((float)Math.PI * .15F); - this.bipedLeftArm.rotateAngleX = -((float)Math.PI * .15F); - - - this.bipedRightLeg.rotateAngleX = MathHelper.cos(par1 * 0.6662F) * 1.4F * par2; - this.bipedLeftLeg.rotateAngleX = MathHelper.cos(par1 * 0.6662F + (float)Math.PI) * 1.4F * par2; - this.bipedRightLeg.rotateAngleY = 0.0F; - this.bipedLeftLeg.rotateAngleY = 0.0F; - - this.bipedRightArm.rotateAngleZ += MathHelper.cos(par3 * 0.19F) * 0.15F + 0.05F; - this.bipedLeftArm.rotateAngleZ -= MathHelper.cos(par3 * 0.19F) * 0.15F + 0.05F; - this.bipedRightArm.rotateAngleX += MathHelper.sin(par3 * 0.267F) * 0.25F; - this.bipedLeftArm.rotateAngleX -= MathHelper.sin(par3 * 0.267F) * 0.25F; - - if (this.isJumping) { - // open jaw - this.jaw.rotateAngleX = 1.44F; - } - else { - this.jaw.rotateAngleX = 0.20944F; - } - } - - /** - * Used for easily adding entity-dependent animations. The second and third float params here are the same second - * and third as in the setRotationAngles method. - */ - @Override - public void setLivingAnimations(EntityLivingBase par1EntityLiving, float par2, float par3, float partialTick) { - // check if entity is jumping - this.isJumping = par1EntityLiving.motionY > 0; - } - - - public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) - { - setRotationAngles(f, f1, f2, f3, f4, f5); - bipedHead.render(f5); - bipedBody.render(f5); - bipedRightArm.render(f5); - bipedLeftArm.render(f5); - bipedRightLeg.render(f5); - bipedLeftLeg.render(f5); - } - - -} diff --git a/src/main/java/twilightforest/client/model/ModelTFLich.java b/src/main/java/twilightforest/client/model/ModelTFLich.java deleted file mode 100644 index f551ff2a97..0000000000 --- a/src/main/java/twilightforest/client/model/ModelTFLich.java +++ /dev/null @@ -1,191 +0,0 @@ -package twilightforest.client.model; - - -import net.minecraft.client.model.ModelBiped; -import net.minecraft.client.model.ModelRenderer; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.util.MathHelper; -import net.minecraft.util.Vec3; -import twilightforest.entity.boss.EntityTFLich; - - - -public class ModelTFLich extends ModelBiped { - - - ModelRenderer collar; - ModelRenderer cloak; - ModelRenderer shieldBelt; - - boolean renderPass = false; - - public ModelTFLich() { - this.renderPass = false; - - textureWidth = 64; - textureHeight = 64; - - - bipedBody = new ModelRenderer(this, 8, 16); - bipedBody.addBox(-4F, 0.0F, -2F, 8, 24, 4); - bipedBody.setRotationPoint(0.0F, -4.0F, 0.0F); - bipedBody.setTextureSize(64, 64); - - bipedRightArm = new ModelRenderer(this, 0, 16); - bipedRightArm.addBox(-2F, -2F, -1F, 2, 12, 2); - bipedRightArm.setTextureSize(64, 64); - bipedRightArm.setRotationPoint(-5F, -2.0F, 0.0F); - - bipedLeftArm = new ModelRenderer(this, 0, 16); - bipedLeftArm.mirror = true; - bipedLeftArm.addBox(-2F, -2F, -1F, 2, 12, 2); - bipedLeftArm.setRotationPoint(5F, -2.0F, 0.0F); - bipedLeftArm.setTextureSize(64, 64); - - bipedHeadwear = new ModelRenderer(this, 32, 0); - bipedHeadwear.addBox(-4F, -12F, -4F, 8, 8, 8, 0.5F); - bipedHeadwear.setRotationPoint(0.0F, -4.0F, 0.0F); - bipedHeadwear.setTextureSize(64, 64); - - bipedHead = new ModelRenderer(this, 0, 0); - bipedHead.addBox(-4F, -8F, -4F, 8, 8, 8); - bipedHead.setRotationPoint(0F, -4F, 0F); - bipedHead.setTextureSize(64, 64); - - bipedRightLeg = new ModelRenderer(this, 0, 16); - bipedRightLeg.addBox(-1F, 0F, -1F, 2, 12, 2); - bipedRightLeg.setRotationPoint(-2F, 9.5F, 0F); - bipedRightLeg.setTextureSize(64, 64); - - bipedLeftLeg = new ModelRenderer(this, 0, 16); - bipedLeftLeg.addBox(-1F, 0F, -1F, 2, 12, 2); - bipedLeftLeg.setRotationPoint(2F, 9.5F, 0F); - bipedLeftLeg.setTextureSize(64, 64); - bipedLeftLeg.mirror = true; - - collar = new ModelRenderer(this, 32, 16); - collar.addBox(-6F, 0F, 0F, 12, 12, 1); - collar.setRotationPoint(0F, -3F, -1F); - collar.setTextureSize(64, 64); - setRotation(collar, 2.164208F, 0F, 0F); - - - cloak = new ModelRenderer(this, 0, 44); - cloak.addBox(-6F, 0F, 0F, 12, 19, 1); - cloak.setRotationPoint(0F, -4F, 2.5F); - cloak.setTextureSize(64, 64); - setRotation(cloak, 0F, 0F, 0F); - - shieldBelt = new ModelRenderer(this); - shieldBelt.setRotationPoint(0F, 0F, 0F); - - } - - public ModelTFLich(boolean specialRenderModel) { - this(); - this.renderPass = specialRenderModel; - } - - @Override - public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) - { - EntityTFLich lich = (EntityTFLich)entity; - - // on regular pass, render everything about the master lich except the shield - if (!renderPass) { - if (!lich.isShadowClone()) { - super.render(entity, f, f1, f2, f3, f4, f5 * 1.125F); - collar.render(f5 * 1.125F); - cloak.render(f5 * 1.125F); - } - } - else { - // on the special render pass, render the shadow clone and the shield - if (lich.isShadowClone()) { -// GL11.glDisable(GL11.GL_DEPTH_TEST); - - super.render(entity, f, f1, f2, f3, f4, f5 * 1.125F); -// GL11.glEnable(GL11.GL_DEPTH_TEST); - - } else { - if (lich.getShieldStrength() > 0) { - shieldBelt.render(f5 * 1.125F); - } - } - } - - } - - /** - * Used for easily adding entity-dependent animations. The second and third float params here are the same second - * and third as in the setRotationAngles method. - */ - public void setLivingAnimations(EntityLivingBase par1EntityLiving, float par2, float par3, float time) - { - EntityTFLich lich = (EntityTFLich)par1EntityLiving; - // make the shield belt - int shields = lich.getShieldStrength(); - if (!lich.isShadowClone() && shields > 0) { - if (shieldBelt.childModels == null || shieldBelt.childModels.size() != shields) { - // clear shields if we have the wrong number - if (shieldBelt.childModels != null) { - shieldBelt.childModels.clear(); - } - // make or remake a belt of shields around the lich - Vec3 vec; - for (int i = 0; i < shields; i++) { - vec = Vec3.createVectorHelper(11, 0, 0); - float rotateY = ((i * (360F / shields)) * 3.141593F) / 180F; - vec.rotateAroundY(rotateY); - ModelRenderer shield = new ModelRenderer(this, 26, 40); - shield.addBox(0.5F, -6F, -6F, 1, 12, 12); - shield.setRotationPoint((float)vec.xCoord, (float)vec.yCoord, (float)vec.zCoord); - shield.setTextureSize(64, 64); - shield.rotateAngleY = rotateY; - shieldBelt.addChild(shield); - } - } - - // rotate the belt - shieldBelt.rotateAngleY = (lich.ticksExisted + time) / 5.0F; - shieldBelt.rotateAngleX = MathHelper.sin((lich.ticksExisted + time) / 5.0F) / 4.0F; - shieldBelt.rotateAngleZ = MathHelper.cos((lich.ticksExisted + time) / 5.0F) / 4.0F; - } - } - - @Override - public void setRotationAngles(float f, float f1, float f2, float f3, float f4, float f5, Entity entity) - { - aimedBow = false; - super.setRotationAngles(f, f1, f2, f3, f4, f5, entity); - float ogSin = MathHelper.sin(onGround * 3.141593F); - float otherSin = MathHelper.sin((1.0F - (1.0F - onGround) * (1.0F - onGround)) * 3.141593F); - bipedRightArm.rotateAngleZ = 0.0F; - bipedLeftArm.rotateAngleZ = 0.5F; - bipedRightArm.rotateAngleY = -(0.1F - ogSin * 0.6F); - bipedLeftArm.rotateAngleY = 0.1F - ogSin * 0.6F; - bipedRightArm.rotateAngleX = -1.570796F; - bipedLeftArm.rotateAngleX = -3.141593F; - bipedRightArm.rotateAngleX -= ogSin * 1.2F - otherSin * 0.4F; - bipedLeftArm.rotateAngleX -= ogSin * 1.2F - otherSin * 0.4F; - bipedRightArm.rotateAngleZ += MathHelper.cos(f2 * 0.26F) * 0.15F + 0.05F; - bipedLeftArm.rotateAngleZ -= MathHelper.cos(f2 * 0.26F) * 0.15F + 0.05F; - bipedRightArm.rotateAngleX += MathHelper.sin(f2 * 0.167F) * 0.15F; - bipedLeftArm.rotateAngleX -= MathHelper.sin(f2 * 0.167F) * 0.15F; - - bipedHead.rotationPointY = -4.0F; - bipedHeadwear.rotationPointY = -4.0F; - bipedRightLeg.rotationPointY = 9.5F; - bipedLeftLeg.rotationPointY = 9.5F; - } - - private void setRotation(ModelRenderer model, float x, float y, float z) - { - model.rotateAngleX = x; - model.rotateAngleY = y; - model.rotateAngleZ = z; - } - - -} diff --git a/src/main/java/twilightforest/client/model/ModelTFLichMinion.java b/src/main/java/twilightforest/client/model/ModelTFLichMinion.java deleted file mode 100644 index a125b1a833..0000000000 --- a/src/main/java/twilightforest/client/model/ModelTFLichMinion.java +++ /dev/null @@ -1,46 +0,0 @@ -package twilightforest.client.model; - - -import net.minecraft.client.model.ModelZombie; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.potion.Potion; - -import org.lwjgl.opengl.GL11; - -import twilightforest.entity.boss.EntityTFLichMinion; - - - - -public class ModelTFLichMinion extends ModelZombie { - - /** - * Used for easily adding entity-dependent animations. The second and third float params here are the same second - * and third as in the setRotationAngles method. - */ - public void setLivingAnimations(EntityLivingBase par1EntityLiving, float par2, float par3, float time) - { - EntityTFLichMinion minion = (EntityTFLichMinion)par1EntityLiving; - // make minions greener - if (minion.getActivePotionEffect(Potion.damageBoost) != null) { - GL11.glColor3f(0.25F, 2.0F, 0.25F); - } - else { - GL11.glColor3f(0.5F, 1.0F, 0.5F); - } - } - - public void render(Entity par1Entity, float par2, float par3, float par4, float par5, float par6, float par7) - { - EntityTFLichMinion minion = (EntityTFLichMinion)par1Entity; - // make strong minions bigger - if (minion.getActivePotionEffect(Potion.damageBoost) != null) { - super.render(par1Entity, par2, par3, par4, par5, par6, par7); - } - else { - super.render(par1Entity, par2, par3, par4, par5, par6, par7); - } - } - -} diff --git a/src/main/java/twilightforest/client/model/ModelTFLoyalZombie.java b/src/main/java/twilightforest/client/model/ModelTFLoyalZombie.java deleted file mode 100644 index e5b9c918a7..0000000000 --- a/src/main/java/twilightforest/client/model/ModelTFLoyalZombie.java +++ /dev/null @@ -1,21 +0,0 @@ -package twilightforest.client.model; - - -import net.minecraft.client.model.ModelZombie; -import net.minecraft.entity.EntityLivingBase; - -import org.lwjgl.opengl.GL11; - -public class ModelTFLoyalZombie extends ModelZombie { - - /** - * Used for easily adding entity-dependent animations. The second and third float params here are the same second - * and third as in the setRotationAngles method. - */ - public void setLivingAnimations(EntityLivingBase par1EntityLiving, float par2, float par3, float time) - { - // GREEEEN - GL11.glColor3f(0.25F, 2.0F, 0.25F); - } - -} diff --git a/src/main/java/twilightforest/client/model/ModelTFMinoshroom.java b/src/main/java/twilightforest/client/model/ModelTFMinoshroom.java deleted file mode 100644 index dd01d0f14e..0000000000 --- a/src/main/java/twilightforest/client/model/ModelTFMinoshroom.java +++ /dev/null @@ -1,207 +0,0 @@ -package twilightforest.client.model; - -import net.minecraft.client.model.ModelBiped; -import net.minecraft.client.model.ModelRenderer; -import net.minecraft.entity.Entity; -import net.minecraft.util.MathHelper; - -public class ModelTFMinoshroom extends ModelBiped { - - ModelRenderer body; - ModelRenderer leg1; - ModelRenderer leg2; - ModelRenderer leg3; - ModelRenderer leg4; - ModelRenderer udders; - - ModelRenderer snout; - - public ModelRenderer righthorn1; - public ModelRenderer righthorn2; - public ModelRenderer lefthorn1; - public ModelRenderer lefthorn2; - - public ModelTFMinoshroom() - { - textureWidth = 128; - textureHeight = 32; - - bipedHead = new ModelRenderer(this, 96, 16); - bipedHead.addBox(-4F, -8F, -4F, 8, 8, 8); - bipedHead.setRotationPoint(0F, -6F, -9F); - - body = new ModelRenderer(this, 18, 4); - body.addBox(-6F, -10F, -7F, 12, 18, 10); - body.setRotationPoint(0F, 5F, 2F); - setRotation(body, 1.570796F, 0F, 0F); - - leg1 = new ModelRenderer(this, 0, 16); - leg1.addBox(-3F, 0F, -2F, 4, 12, 4); - leg1.setRotationPoint(-3F, 12F, 7F); - - leg2 = new ModelRenderer(this, 0, 16); - leg2.addBox(-1F, 0F, -2F, 4, 12, 4); - leg2.setRotationPoint(3F, 12F, 7F); - - leg3 = new ModelRenderer(this, 0, 16); - leg3.addBox(-3F, 0F, -3F, 4, 12, 4); - leg3.setRotationPoint(-3F, 12F, -5F); - - leg4 = new ModelRenderer(this, 0, 16); - leg4.addBox(-1F, 0F, -3F, 4, 12, 4); - leg4.setRotationPoint(3F, 12F, -5F); - - udders = new ModelRenderer(this, 52, 0); - udders.addBox(-2F, -3F, 0F, 4, 6, 2); - udders.setRotationPoint(0F, 14F, 6F); - setRotation(udders, 1.570796F, 0F, 0F); - - bipedBody = new ModelRenderer(this, 64, 0); - bipedBody.addBox(-4F, 0F, -2.5F, 8, 12, 5); - bipedBody.setRotationPoint(0F, -6F, -9F); - - this.bipedLeftArm = new ModelRenderer(this, 90, 0); - this.bipedLeftArm.addBox(-1.0F, -2.0F, -2.0F, 4, 12, 4); - this.bipedLeftArm.setRotationPoint(5F, -4F, -9F); - this.bipedLeftArm.mirror = true; - - this.bipedRightArm = new ModelRenderer(this, 90, 0); - this.bipedRightArm.addBox(-3.0F, -2.0F, -2.0F, 4, 12, 4); - this.bipedRightArm.setRotationPoint(-5F, -4F, -9F); - - // horns - this.righthorn1 = new ModelRenderer(this, 0, 0); - this.righthorn1.addBox(-5.5F, -1.5F, -1.5F, 5, 3, 3); - this.righthorn1.setRotationPoint(-2.5F, -6.5F, 0.0F); - this.righthorn1.rotateAngleY = -25F / (180F / (float)Math.PI); - this.righthorn1.rotateAngleZ = 10F / (180F / (float)Math.PI); - - this.righthorn2 = new ModelRenderer(this, 16, 0); - this.righthorn2.addBox(-3.5F, -1.0F, -1.0F, 3, 2, 2); - this.righthorn2.setRotationPoint(-4.5F, 0.0F, 0.0F); - this.righthorn2.rotateAngleY = -15F / (180F / (float)Math.PI); - this.righthorn2.rotateAngleZ = 45F / (180F / (float)Math.PI); - - this.righthorn1.addChild(righthorn2); - - this.lefthorn1 = new ModelRenderer(this, 0, 0); - this.lefthorn1.mirror = true; - this.lefthorn1.addBox(0.5F, -1.5F, -1.5F, 5, 3, 3); - this.lefthorn1.setRotationPoint(2.5F, -6.5F, 0.0F); - this.lefthorn1.rotateAngleY = 25F / (180F / (float)Math.PI); - this.lefthorn1.rotateAngleZ = -10F / (180F / (float)Math.PI); - - this.lefthorn2 = new ModelRenderer(this, 16, 0); - this.lefthorn2.addBox(0.5F, -1.0F, -1.0F, 3, 2, 2); - this.lefthorn2.setRotationPoint(4.5F, 0.0F, 0.0F); - this.lefthorn2.rotateAngleY = 15F / (180F / (float)Math.PI); - this.lefthorn2.rotateAngleZ = -45F / (180F / (float)Math.PI); - - this.lefthorn1.addChild(lefthorn2); - - this.bipedHead.addChild(righthorn1); - this.bipedHead.addChild(lefthorn1); - - snout = new ModelRenderer(this, 105, 28); - snout.addBox(-2, -1, -1, 4, 3, 1); - snout.setRotationPoint(0F, -2.0F, -4F); - - this.bipedHead.addChild(snout); - - // kill off headwear box - this.bipedHeadwear = new ModelRenderer(this, 0, 0); - - } - - public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) - { - //super.render(entity, f, f1, f2, f3, f4, f5); - setRotationAngles(f, f1, f2, f3, f4, f5, entity); - bipedHead.render(f5); - body.render(f5); - leg1.render(f5); - leg2.render(f5); - leg3.render(f5); - leg4.render(f5); - udders.render(f5); - - bipedBody.render(f5); - bipedLeftArm.render(f5); - bipedRightArm.render(f5); - } - - private void setRotation(ModelRenderer model, float x, float y, float z) - { - model.rotateAngleX = x; - model.rotateAngleY = y; - model.rotateAngleZ = z; - } - - /** - * Sets the model's various rotation angles. For bipeds, par1 and par2 are used for animating the movement of arms - * and legs, where par1 represents the time(so that arms and legs swing back and forth) and par2 represents how - * "far" arms and legs can swing at most. - */ - @Override - public void setRotationAngles(float par1, float par2, float par3, float par4, float par5, float par6, Entity entity) - { - // copied from ModelBiped - this.bipedHead.rotateAngleY = par4 / (180F / (float)Math.PI); - this.bipedHead.rotateAngleX = par5 / (180F / (float)Math.PI); - this.bipedHeadwear.rotateAngleY = this.bipedHead.rotateAngleY; - this.bipedHeadwear.rotateAngleX = this.bipedHead.rotateAngleX; - - this.bipedRightArm.rotateAngleX = MathHelper.cos(par1 * 0.6662F + (float)Math.PI) * 2.0F * par2 * 0.5F; - this.bipedLeftArm.rotateAngleX = MathHelper.cos(par1 * 0.6662F) * 2.0F * par2 * 0.5F; - this.bipedRightArm.rotateAngleZ = 0.0F; - this.bipedLeftArm.rotateAngleZ = 0.0F; - - this.bipedRightLeg.rotateAngleX = MathHelper.cos(par1 * 0.6662F) * 1.4F * par2; - this.bipedLeftLeg.rotateAngleX = MathHelper.cos(par1 * 0.6662F + (float)Math.PI) * 1.4F * par2; - this.bipedRightLeg.rotateAngleY = 0.0F; - this.bipedLeftLeg.rotateAngleY = 0.0F; - - if (this.heldItemLeft != 0) - { - this.bipedLeftArm.rotateAngleX = this.bipedLeftArm.rotateAngleX * 0.5F - ((float)Math.PI / 10F) * (float)this.heldItemLeft; - } - - if (this.heldItemRight != 0) - { - this.bipedRightArm.rotateAngleX = this.bipedRightArm.rotateAngleX * 0.5F - ((float)Math.PI / 10F) * (float)this.heldItemRight; - } - - - - this.bipedRightArm.rotateAngleZ += MathHelper.cos(par3 * 0.09F) * 0.05F + 0.05F; - this.bipedLeftArm.rotateAngleZ -= MathHelper.cos(par3 * 0.09F) * 0.05F + 0.05F; - this.bipedRightArm.rotateAngleX += MathHelper.sin(par3 * 0.067F) * 0.05F; - this.bipedLeftArm.rotateAngleX -= MathHelper.sin(par3 * 0.067F) * 0.05F; - - if (this.aimedBow) - { - float var7 = 0.0F; - float var8 = 0.0F; - this.bipedRightArm.rotateAngleZ = 0.0F; - this.bipedLeftArm.rotateAngleZ = 0.0F; - this.bipedRightArm.rotateAngleY = -(0.1F - var7 * 0.6F) + this.bipedHead.rotateAngleY; - this.bipedLeftArm.rotateAngleY = 0.1F - var7 * 0.6F + this.bipedHead.rotateAngleY + 0.4F; - this.bipedRightArm.rotateAngleX = -((float)Math.PI / 2F) + this.bipedHead.rotateAngleX; - this.bipedLeftArm.rotateAngleX = -((float)Math.PI / 2F) + this.bipedHead.rotateAngleX; - this.bipedRightArm.rotateAngleX -= var7 * 1.2F - var8 * 0.4F; - this.bipedLeftArm.rotateAngleX -= var7 * 1.2F - var8 * 0.4F; - this.bipedRightArm.rotateAngleZ += MathHelper.cos(par3 * 0.09F) * 0.05F + 0.05F; - this.bipedLeftArm.rotateAngleZ -= MathHelper.cos(par3 * 0.09F) * 0.05F + 0.05F; - this.bipedRightArm.rotateAngleX += MathHelper.sin(par3 * 0.067F) * 0.05F; - this.bipedLeftArm.rotateAngleX -= MathHelper.sin(par3 * 0.067F) * 0.05F; - } - - // copied from ModelQuadruped - this.body.rotateAngleX = ((float)Math.PI / 2F); - this.leg1.rotateAngleX = MathHelper.cos(par1 * 0.6662F) * 1.4F * par2; - this.leg2.rotateAngleX = MathHelper.cos(par1 * 0.6662F + (float)Math.PI) * 1.4F * par2; - this.leg3.rotateAngleX = MathHelper.cos(par1 * 0.6662F + (float)Math.PI) * 1.4F * par2; - this.leg4.rotateAngleX = MathHelper.cos(par1 * 0.6662F) * 1.4F * par2; - - } -} diff --git a/src/main/java/twilightforest/client/model/ModelTFMinotaur.java b/src/main/java/twilightforest/client/model/ModelTFMinotaur.java deleted file mode 100644 index 20ed93fa67..0000000000 --- a/src/main/java/twilightforest/client/model/ModelTFMinotaur.java +++ /dev/null @@ -1,61 +0,0 @@ -package twilightforest.client.model; - -import net.minecraft.client.model.ModelBiped; -import net.minecraft.client.model.ModelRenderer; - -public class ModelTFMinotaur extends ModelBiped { - - public ModelRenderer righthorn1; - public ModelRenderer righthorn2; - public ModelRenderer lefthorn1; - public ModelRenderer lefthorn2; - - ModelRenderer snout; - - public ModelTFMinotaur() - { - - this.righthorn1 = new ModelRenderer(this, 24, 0); - this.righthorn1.addBox(-5.5F, -1.5F, -1.5F, 5, 3, 3); - this.righthorn1.setRotationPoint(-2.5F, -6.5F, 0.0F); - this.righthorn1.rotateAngleY = -25F / (180F / (float)Math.PI); - this.righthorn1.rotateAngleZ = 10F / (180F / (float)Math.PI); - - this.righthorn2 = new ModelRenderer(this, 40, 0); - this.righthorn2.addBox(-3.5F, -1.0F, -1.0F, 3, 2, 2); - this.righthorn2.setRotationPoint(-4.5F, 0.0F, 0.0F); - this.righthorn2.rotateAngleY = -15F / (180F / (float)Math.PI); - this.righthorn2.rotateAngleZ = 45F / (180F / (float)Math.PI); - - this.righthorn1.addChild(righthorn2); - - this.lefthorn1 = new ModelRenderer(this, 24, 0); - this.lefthorn1.mirror = true; - this.lefthorn1.addBox(0.5F, -1.5F, -1.5F, 5, 3, 3); - this.lefthorn1.setRotationPoint(2.5F, -6.5F, 0.0F); - this.lefthorn1.rotateAngleY = 25F / (180F / (float)Math.PI); - this.lefthorn1.rotateAngleZ = -10F / (180F / (float)Math.PI); - - this.lefthorn2 = new ModelRenderer(this, 40, 0); - this.lefthorn2.addBox(0.5F, -1.0F, -1.0F, 3, 2, 2); - this.lefthorn2.setRotationPoint(4.5F, 0.0F, 0.0F); - this.lefthorn2.rotateAngleY = 15F / (180F / (float)Math.PI); - this.lefthorn2.rotateAngleZ = -45F / (180F / (float)Math.PI); - - this.lefthorn1.addChild(lefthorn2); - - this.bipedHead.addChild(righthorn1); - this.bipedHead.addChild(lefthorn1); - - snout = new ModelRenderer(this, 9, 12); - snout.addBox(-2, -1, -1, 4, 3, 1); - snout.setRotationPoint(0F, -2.0F, -4F); - - this.bipedHead.addChild(snout); - - // kill off headwear box - this.bipedHeadwear = new ModelRenderer(this, 0, 0); - - } - -} diff --git a/src/main/java/twilightforest/client/model/ModelTFMoonworm.java b/src/main/java/twilightforest/client/model/ModelTFMoonworm.java deleted file mode 100644 index d2c3fead5c..0000000000 --- a/src/main/java/twilightforest/client/model/ModelTFMoonworm.java +++ /dev/null @@ -1,94 +0,0 @@ -// Date: 11/8/2012 9:54:59 AM -// Template version 1.1 -// Java generated by Techne -// Keep in mind that you still need to fill in some blanks -// - ZeuX - - - - - - -package twilightforest.client.model; - -import net.minecraft.client.model.ModelBase; -import net.minecraft.client.model.ModelRenderer; -import net.minecraft.entity.Entity; -import net.minecraft.util.MathHelper; -import twilightforest.tileentity.TileEntityTFMoonworm; - -public class ModelTFMoonworm extends ModelBase -{ - //fields - ModelRenderer Shape1; - ModelRenderer Shape2; - ModelRenderer Shape3; - ModelRenderer head; - - public ModelTFMoonworm() - { - textureWidth = 32; - textureHeight = 32; - - Shape1 = new ModelRenderer(this, 0, 4); - Shape1.addBox(-1F, -1F, -1F, 4, 2, 2); - Shape1.setRotationPoint(-1F, 7F, 3F); - - Shape2 = new ModelRenderer(this, 0, 8); - Shape2.addBox(-1F, -1F, -1F, 2, 2, 4); - Shape2.setRotationPoint(3F, 7F, 0F); - - Shape3 = new ModelRenderer(this, 0, 14); - Shape3.addBox(-1F, -1F, -1F, 2, 2, 2); - Shape3.setRotationPoint(2F, 7F, -2F); - - head = new ModelRenderer(this, 0, 0); - head.addBox(-1F, -1F, -1F, 2, 2, 2); - head.setRotationPoint(-3F, 7F, 2F); - } - - public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) - { - super.render(entity, f, f1, f2, f3, f4, f5); - setRotationAngles(f, f1, f2, f3, f4, f5, entity); - Shape1.render(f5); - Shape2.render(f5); - Shape3.render(f5); - head.render(f5); - } - - public void render(float f5) - { - Shape1.render(f5); - Shape2.render(f5); - Shape3.render(f5); - head.render(f5); - } - - public void setRotationAngles(float f, float f1, float f2, float f3, float f4, float f5, Entity entity) - { - super.setRotationAngles(f, f1, f2, f3, f4, f5, entity); - } - - public void setLivingAnimations(TileEntityTFMoonworm moonworm, float partialTime) { - - head.rotationPointY = 7F; - Shape1.rotationPointY = 7F; - Shape2.rotationPointY = 7F; - Shape3.rotationPointY = 7F; - - if (moonworm.yawDelay == 0) - { - float time = (moonworm.desiredYaw - moonworm.currentYaw) - partialTime; - - // moving - head.rotationPointY += Math.min(0, MathHelper.sin(time / 2)); - Shape1.rotationPointY += Math.min(0, MathHelper.sin(time / 2 + 1)); - Shape2.rotationPointY += Math.min(0, MathHelper.sin(time / 2 + 2)); - Shape3.rotationPointY += Math.min(0, MathHelper.sin(time / 2 + 3)); - - } - - } - -} diff --git a/src/main/java/twilightforest/client/model/ModelTFMosquitoSwarm.java b/src/main/java/twilightforest/client/model/ModelTFMosquitoSwarm.java deleted file mode 100644 index bbf9adb08f..0000000000 --- a/src/main/java/twilightforest/client/model/ModelTFMosquitoSwarm.java +++ /dev/null @@ -1,135 +0,0 @@ -package twilightforest.client.model; - -import java.util.Random; - -import net.minecraft.client.model.ModelBase; -import net.minecraft.client.model.ModelRenderer; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.util.MathHelper; -import net.minecraft.util.Vec3; - -public class ModelTFMosquitoSwarm extends ModelBase -{ - - ModelRenderer core; - ModelRenderer node1; - ModelRenderer node2; - ModelRenderer node3; - ModelRenderer node4; - ModelRenderer node5; - ModelRenderer node6; - - Random rand = new Random(); - - public ModelTFMosquitoSwarm() - { - core = new ModelRenderer(this, rand.nextInt(28), rand.nextInt(28)); - core.addBox(-4F, 0.0F, -2F, 1, 1, 1); - core.setRotationPoint(0.0F, -4.0F, 0.0F); - - node1 = new ModelRenderer(this, rand.nextInt(28), rand.nextInt(28)); - node1.addBox(-5.5F, -5F, -13F, 1, 1, 1); - node1.setRotationPoint(2F, -1F, -6F); - core.addChild(node1); - - node2 = new ModelRenderer(this, rand.nextInt(28), rand.nextInt(28)); - node2.addBox(-5.5F, -13F, -5F, 1, 1, 1); - node2.setRotationPoint(0F, -7F, -1F); - core.addChild(node2); - - node3 = new ModelRenderer(this, rand.nextInt(28), rand.nextInt(28)); - node3.addBox(-13F, -5F, -5F, 1, 1, 1); - node3.setRotationPoint(5F, -2F, -1F); - core.addChild(node3); - - node4 = new ModelRenderer(this, rand.nextInt(28), rand.nextInt(28)); - node4.addBox(-5.5F, -5F, -13F, 1, 1, 1); - node4.setRotationPoint(2F, -1F, -6F); - core.addChild(node4); - - node5 = new ModelRenderer(this, rand.nextInt(28), rand.nextInt(28)); - node5.addBox(-5.5F, -13F, -5F, 1, 1, 1); - node5.setRotationPoint(0F, -7F, -1F); - core.addChild(node5); - - node6 = new ModelRenderer(this, rand.nextInt(28), rand.nextInt(28)); - node6.addBox(-13F, -5F, -5F, 1, 1, 1); - node6.setRotationPoint(5F, -2F, -1F); - core.addChild(node6); - - addBugsToNodes(node1); - addBugsToNodes(node2); - addBugsToNodes(node3); - addBugsToNodes(node4); - addBugsToNodes(node5); - addBugsToNodes(node6); - } - - @Override - public void render(Entity par1Entity, float par2, float par3, float par4, float par5, float par6, float par7) { - core.render(par7 / 2.0F); -// node1.render(par7); -// node2.render(par7); -// node3.render(par7); - } - - /** - * Add the proper number of mosquitoes to the nodes - */ - public void addBugsToNodes(ModelRenderer node) - { - int bugs = 16; - - for (int i = 0; i < bugs; i++) { - Vec3 vec = Vec3.createVectorHelper(11, 0, 0); - float rotateY = ((i * (360F / bugs)) * 3.141593F) / 180F; - vec.rotateAroundY(rotateY); - ModelRenderer bug = new ModelRenderer(this, rand.nextInt(28), rand.nextInt(28)); - - float bugX = (rand.nextFloat() - rand.nextFloat()) * 4.0f; - float bugY = (rand.nextFloat() - rand.nextFloat()) * 4.0f; - float bugZ = (rand.nextFloat() - rand.nextFloat()) * 4.0f; - - bug.addBox(bugX, bugY, bugZ, 1, 1, 1); - - bug.setRotationPoint((float)vec.xCoord, (float)vec.yCoord, (float)vec.zCoord); - bug.rotateAngleY = rotateY; - node.addChild(bug); - } - } - - @Override - public void setLivingAnimations(EntityLivingBase par1EntityLiving, float par2, float par3, float time) { - core.rotateAngleY = (par1EntityLiving.ticksExisted + time) / 5.0F; - core.rotateAngleX = MathHelper.sin((par1EntityLiving.ticksExisted + time) / 5.0F) / 4.0F; - core.rotateAngleZ = MathHelper.cos((par1EntityLiving.ticksExisted + time) / 5.0F) / 4.0F; - - node1.rotateAngleY = (par1EntityLiving.ticksExisted + time) / 2.0F; - node1.rotateAngleX = MathHelper.sin((par1EntityLiving.ticksExisted + time) / 6.0F) / 2.0F; - node1.rotateAngleZ = MathHelper.cos((par1EntityLiving.ticksExisted + time) / 5.0F) / 4.0F; - - node2.rotateAngleY = MathHelper.sin((par1EntityLiving.ticksExisted + time) / 2.0F) / 3.0F; - node2.rotateAngleX = (par1EntityLiving.ticksExisted + time) / 5.0F; - node2.rotateAngleZ = MathHelper.cos((par1EntityLiving.ticksExisted + time) / 5.0F) / 4.0F; - - node3.rotateAngleY = MathHelper.sin((par1EntityLiving.ticksExisted + time) / 7.0F) / 3.0F; - node3.rotateAngleX = MathHelper.cos((par1EntityLiving.ticksExisted + time) / 4.0F) / 2.0F; - node3.rotateAngleZ = (par1EntityLiving.ticksExisted + time) / 5.0F; - - node4.rotateAngleX = (par1EntityLiving.ticksExisted + time) / 2.0F; - node4.rotateAngleZ = MathHelper.sin((par1EntityLiving.ticksExisted + time) / 6.0F) / 2.0F; - node4.rotateAngleY = MathHelper.sin((par1EntityLiving.ticksExisted + time) / 5.0F) / 4.0F; - - node5.rotateAngleZ = MathHelper.sin((par1EntityLiving.ticksExisted + time) / 2.0F) / 3.0F; - node5.rotateAngleY = MathHelper.cos((par1EntityLiving.ticksExisted + time) / 5.0F) / 4.0F; - node5.rotateAngleX = MathHelper.cos((par1EntityLiving.ticksExisted + time) / 5.0F) / 4.0F; - - node6.rotateAngleZ = MathHelper.cos((par1EntityLiving.ticksExisted + time) / 7.0F) / 3.0F; - node6.rotateAngleX = MathHelper.cos((par1EntityLiving.ticksExisted + time) / 4.0F) / 2.0F; - node6.rotateAngleY = (par1EntityLiving.ticksExisted + time) / 5.0F; - - } - - -} diff --git a/src/main/java/twilightforest/client/model/ModelTFNaga.java b/src/main/java/twilightforest/client/model/ModelTFNaga.java deleted file mode 100644 index b169cdca32..0000000000 --- a/src/main/java/twilightforest/client/model/ModelTFNaga.java +++ /dev/null @@ -1,43 +0,0 @@ -package twilightforest.client.model; - -import net.minecraft.client.model.ModelBase; -import net.minecraft.client.model.ModelRenderer; -import net.minecraft.entity.Entity; -import twilightforest.entity.boss.EntityTFNaga; -import twilightforest.entity.boss.EntityTFNagaSegment; - - -public class ModelTFNaga extends ModelBase -{ - public ModelTFNaga() - { - head = new ModelRenderer(this, 0, 0); - head.addBox(-8F, -12F, -8F, 16, 16, 16, 0F); - head.setRotationPoint(0F, 0F, 0F); - - body = new ModelRenderer(this, 0, 0); - body.addBox(-8F, -16F, -8F, 16, 16, 16, 0F); - body.setRotationPoint(0F, 0F, 0F); - } - - public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) - { - super.render(entity, f, f1, f2, f3, f4, f5); - setRotationAngles(f, f1, f2, f3, f4, f5, entity); - - if (entity instanceof EntityTFNaga) { - head.render(f5 * 2); - } - else if (entity instanceof EntityTFNagaSegment) { - body.render(f5 * 2); - } - else { - head.render(f5 * 2); - } - - } - - //fields - public ModelRenderer head; - public ModelRenderer body; -} diff --git a/src/main/java/twilightforest/client/model/ModelTFPenguin.java b/src/main/java/twilightforest/client/model/ModelTFPenguin.java deleted file mode 100644 index 8e4b256b35..0000000000 --- a/src/main/java/twilightforest/client/model/ModelTFPenguin.java +++ /dev/null @@ -1,126 +0,0 @@ -// Date: 3/3/2012 11:56:45 PM -// Template version 1.1 -// Java generated by Techne -// Keep in mind that you still need to fill in some blanks -// - ZeuX - - - - - - -package twilightforest.client.model; - - -import net.minecraft.client.model.ModelBase; -import net.minecraft.client.model.ModelRenderer; -import net.minecraft.entity.Entity; -import net.minecraft.util.MathHelper; - -import org.lwjgl.opengl.GL11; - -public class ModelTFPenguin extends ModelBase -{ - //fields - ModelRenderer body; - ModelRenderer rightarm; - ModelRenderer leftarm; - ModelRenderer rightleg; - ModelRenderer leftleg; - ModelRenderer head; - ModelRenderer beak; - - public ModelTFPenguin() - { - textureWidth = 64; - textureHeight = 32; - - body = new ModelRenderer(this, 32, 0); - body.addBox(-4F, 0F, -4F, 8, 9, 8); - body.setRotationPoint(0F, 14F, 0F); - - rightarm = new ModelRenderer(this, 34, 18); - rightarm.addBox(-1F, -1F, -2F, 1, 8, 4); - rightarm.setRotationPoint(-4F, 15F, 0F); - - leftarm = new ModelRenderer(this, 24, 18); - leftarm.addBox(0F, -1F, -2F, 1, 8, 4); - leftarm.setRotationPoint(4F, 15F, 0F); - - leftarm.mirror = true; - - - rightleg = new ModelRenderer(this, 0, 16); - rightleg.addBox(-2F, 0F, -5F, 4, 1, 8); - rightleg.setRotationPoint(-2F, 23F, 0F); - rightleg.setTextureSize(64, 32); - - leftleg = new ModelRenderer(this, 0, 16); - leftleg.addBox(-2F, 0F, -5F, 4, 1, 8); - leftleg.setRotationPoint(2F, 23F, 0F); - - - head = new ModelRenderer(this, 0, 0); - head.addBox(-3.5F, -4F, -3.5F, 7, 5, 7); - head.setRotationPoint(0F, 13F, 0F); - - beak = new ModelRenderer(this, 0, 13); - beak.addBox(-1F, 0F, -1F, 2, 1, 2); - beak.setRotationPoint(0F, -1F, -4F); - - head.addChild(beak); - - } - - /** - * Sets the models various rotation angles then renders the model. - */ - public void render(Entity par1Entity, float par2, float par3, float par4, float par5, float par6, float par7) - { - setRotationAngles(par2, par3, par4, par5, par6, par7); - - if (isChild) - { - float f = 2.0F; - GL11.glPushMatrix(); - GL11.glTranslatef(0.0F, 5F * par7, 0.75F * par7); - head.render(par7); - GL11.glPopMatrix(); - GL11.glPushMatrix(); - GL11.glScalef(1.0F / f, 1.0F / f, 1.0F / f); - GL11.glTranslatef(0.0F, 24F * par7, 0.0F); - body.render(par7); - rightleg.render(par7); - leftleg.render(par7); - rightarm.render(par7); - leftarm.render(par7); - GL11.glPopMatrix(); - } - else - { - head.render(par7); - body.render(par7); - rightleg.render(par7); - leftleg.render(par7); - rightarm.render(par7); - leftarm.render(par7); - } - } - - /** - * Sets the models various rotation angles. - */ - public void setRotationAngles(float par1, float par2, float par3, float par4, float par5, float par6) - { - head.rotateAngleX = par5 / (180F / (float)Math.PI); - head.rotateAngleY = par4 / (180F / (float)Math.PI); - - rightleg.rotateAngleX = MathHelper.cos(par1) * 0.7F * par2; - leftleg.rotateAngleX = MathHelper.cos(par1 + (float)Math.PI) * 0.7F * par2; - - rightarm.rotateAngleZ = par3; - leftarm.rotateAngleZ = -par3; - } - - -} diff --git a/src/main/java/twilightforest/client/model/ModelTFPhantomArmor.java b/src/main/java/twilightforest/client/model/ModelTFPhantomArmor.java deleted file mode 100644 index 9873726229..0000000000 --- a/src/main/java/twilightforest/client/model/ModelTFPhantomArmor.java +++ /dev/null @@ -1,23 +0,0 @@ -package twilightforest.client.model; - - -public class ModelTFPhantomArmor extends ModelTFKnightlyArmor { - - public ModelTFPhantomArmor(int part, float expand) - { - super(part, expand); - - this.righthorn1.rotateAngleY = -25F / (180F / (float)Math.PI); - this.righthorn1.rotateAngleZ = 45F / (180F / (float)Math.PI); - - this.righthorn2.rotateAngleY = -15F / (180F / (float)Math.PI); - this.righthorn2.rotateAngleZ = 45F / (180F / (float)Math.PI); - - this.lefthorn1.rotateAngleY = 25F / (180F / (float)Math.PI); - this.lefthorn1.rotateAngleZ = -45F / (180F / (float)Math.PI); - - this.lefthorn2.rotateAngleY = 15F / (180F / (float)Math.PI); - this.lefthorn2.rotateAngleZ = -45F / (180F / (float)Math.PI); - } - -} diff --git a/src/main/java/twilightforest/client/model/ModelTFPinchBeetle.java b/src/main/java/twilightforest/client/model/ModelTFPinchBeetle.java deleted file mode 100644 index abde43a095..0000000000 --- a/src/main/java/twilightforest/client/model/ModelTFPinchBeetle.java +++ /dev/null @@ -1,288 +0,0 @@ -// Date: 11/5/2012 7:35:56 PM -// Template version 1.1 -// Java generated by Techne -// Keep in mind that you still need to fill in some blanks -// - ZeuX -package twilightforest.client.model; - -import net.minecraft.client.model.ModelBase; -import net.minecraft.client.model.ModelRenderer; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.util.MathHelper; -import twilightforest.entity.EntityTFPinchBeetle; - -public class ModelTFPinchBeetle extends ModelBase -{ - //fields - ModelRenderer thorax; - ModelRenderer head; - ModelRenderer connector2; - ModelRenderer RearEnd; - ModelRenderer Leg6; - ModelRenderer Leg4; - ModelRenderer Leg2; - ModelRenderer Leg5; - ModelRenderer Leg3; - ModelRenderer Leg1; - ModelRenderer connector1; - ModelRenderer jaw1a; - ModelRenderer jaw1b; - ModelRenderer jaw2a; - ModelRenderer jaw2b; - ModelRenderer antenna1; - ModelRenderer antenna2; - ModelRenderer eye1; - ModelRenderer eye2; - ModelRenderer tooth1a; - ModelRenderer tooth1b; - ModelRenderer tooth1c; - ModelRenderer tooth2a; - ModelRenderer tooth2b; - ModelRenderer tooth2c; - - public ModelTFPinchBeetle() - { - textureWidth = 64; - textureHeight = 32; - - thorax = new ModelRenderer(this, 0, 22); - thorax.addBox(-4.5F, -4F, 0F, 9, 8, 2); - thorax.setRotationPoint(0F, 18F, -4.5F); - - connector1 = new ModelRenderer(this, 0, 12); - connector1.addBox(-3F, -3F, 0F, 6, 6, 1); - connector1.setRotationPoint(0F, 18F, -3F); - - connector2 = new ModelRenderer(this, 0, 12); - connector2.addBox(-3F, -3F, -1F, 6, 6, 1); - connector2.setRotationPoint(0F, 18F, -4F); - - RearEnd = new ModelRenderer(this, 28, 14); - RearEnd.addBox(-5F, -9F, -4F, 10, 10, 8); - RearEnd.setRotationPoint(0F, 18F, 7F); - setRotation(RearEnd, 1.570796F, 0F, 0F); - - Leg6 = new ModelRenderer(this, 40, 0); - Leg6.addBox(-1F, -1F, -1F, 10, 2, 2); - Leg6.setRotationPoint(4F, 21F, -4F); - setRotation(Leg6, 0F, 0.2792527F, 0.3490659F); - - Leg5 = new ModelRenderer(this, 40, 0); - Leg5.mirror = true; - Leg5.addBox(-9F, -1F, -1F, 10, 2, 2); - Leg5.setRotationPoint(-4F, 21F, -4F); - setRotation(Leg5, 0F, -0.2792527F, -0.3490659F); - - Leg4 = new ModelRenderer(this, 40, 0); - Leg4.addBox(-1F, -1F, -1F, 10, 2, 2); - Leg4.setRotationPoint(4F, 21F, -1F); - setRotation(Leg4, 0F, -0.2792527F, 0.3490659F); - - Leg2 = new ModelRenderer(this, 40, 0); - Leg2.addBox(-1F, -1F, -1F, 10, 2, 2); - Leg2.setRotationPoint(4F, 21F, 4F); - setRotation(Leg2, 0F, -0.6981317F, 0.3490659F); - - Leg3 = new ModelRenderer(this, 40, 0); - Leg3.mirror = true; - Leg3.addBox(-9F, -1F, -1F, 10, 2, 2); - Leg3.setRotationPoint(-4F, 21F, -1F); - setRotation(Leg3, 0F, 0.2792527F, -0.3490659F); - - Leg1 = new ModelRenderer(this, 40, 0); - Leg1.mirror = true; - Leg1.addBox(-9F, -1F, -1F, 10, 2, 2); - Leg1.setRotationPoint(-4F, 21F, 4F); - Leg1.setTextureSize(64, 32); - setRotation(Leg1, 0F, 0.6981317F, -0.3490659F); - - head = new ModelRenderer(this, 0, 0); - head.addBox(-4F, -4F, -6F, 8, 6, 6); - head.setRotationPoint(0F, 19F, -5F); - - jaw1a = new ModelRenderer(this, 40, 6); - jaw1a.addBox(-1F, -1F, -1.5F, 8, 2, 3); - jaw1a.setRotationPoint(-3F, 1F, -6F); - setRotation(jaw1a, 0F, 2.6354471F, 0F); - - jaw1b = new ModelRenderer(this, 40, 10); - jaw1b.addBox(-1F, -1F, -1F, 10, 2, 2); - jaw1b.setRotationPoint(7F, 0F, 0F); - setRotation(jaw1b, 0F, -1.047197F, 0F); - - jaw2a = new ModelRenderer(this, 40, 6); - jaw2a.addBox(-1F, -1F, -1.5F, 8, 2, 3); - jaw2a.setRotationPoint(3F, 1F, -6F); - setRotation(jaw2a, 0F, 0.5410520F, 0F); - - jaw2b = new ModelRenderer(this, 40, 10); - jaw2b.addBox(-1F, -1F, -1F, 10, 2, 2); - jaw2b.setRotationPoint(7F, 0F, 0F); - setRotation(jaw2b, 0F, 1.047197F, 0F); - - antenna1 = new ModelRenderer(this, 42, 4); - antenna1.addBox(0F, -0.5F, -0.5F, 10, 1, 1); - antenna1.setRotationPoint(1F, -3F, -5F); - setRotation(antenna1, 0F, 1.047198F, -0.296706F); - - antenna2 = new ModelRenderer(this, 42, 4); - antenna2.addBox(0F, -0.5F, -0.5F, 10, 1, 1); - antenna2.setRotationPoint(-1F, -3F, -5F); - setRotation(antenna2, 0F, 2.094395F, 0.296706F); - - eye1 = new ModelRenderer(this, 15, 12); - eye1.addBox(-1.5F, -1.5F, -1.5F, 3, 3, 3); - eye1.setRotationPoint(-3F, -2F, -5F); - - eye2 = new ModelRenderer(this, 15, 12); - eye2.addBox(-1.5F, -1.5F, -1.5F, 3, 3, 3); - eye2.setRotationPoint(3F, -2F, -5F); - - tooth1a = new ModelRenderer(this, 0, 0); - tooth1a.addBox(0F, -0.5F, -0F, 2, 1, 1); - tooth1a.setRotationPoint(9F, 0F, 0F); - setRotation(tooth1a, 0F, -0.5235987F, 0); - - tooth1b = new ModelRenderer(this, 0, 0); - tooth1b.addBox(-2.5F, -0.5F, -0F, 2, 1, 1); - tooth1b.setRotationPoint(6F, 0F, 0F); - setRotation(tooth1b, 0F, 1.5707963F, 0); - - tooth1c = new ModelRenderer(this, 0, 0); - tooth1c.addBox(-2.5F, -0.5F, -0F, 2, 1, 1); - tooth1c.setRotationPoint(3F, 0F, 0F); - setRotation(tooth1c, 0F, 1.5707963F, 0); - - tooth2a = new ModelRenderer(this, 0, 0); - tooth2a.addBox(0F, -0.5F, -1F, 2, 1, 1); - tooth2a.setRotationPoint(9F, 0F, 0F); - setRotation(tooth2a, 0F, 0.5235987F, 0); - - tooth2b = new ModelRenderer(this, 0, 0); - tooth2b.addBox(-2.5F, -0.5F, -1F, 2, 1, 1); - tooth2b.setRotationPoint(6F, 0F, 0F); - setRotation(tooth2b, 0F, -1.5707963F, 0); - - tooth2c = new ModelRenderer(this, 0, 0); - tooth2c.addBox(-2.5F, -0.5F, -1F, 2, 1, 1); - tooth2c.setRotationPoint(3F, 0F, 0F); - setRotation(tooth2c, 0F, -1.5707963F, 0); - - head.addChild(jaw1a); - jaw1a.addChild(jaw1b); - jaw1b.addChild(tooth1a); - jaw1b.addChild(tooth1b); - jaw1b.addChild(tooth1c); - jaw2b.addChild(tooth2a); - jaw2b.addChild(tooth2b); - jaw2b.addChild(tooth2c); - head.addChild(jaw2a); - jaw2a.addChild(jaw2b); - head.addChild(antenna1); - head.addChild(antenna2); - head.addChild(eye1); - head.addChild(eye2); - - } - - public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) - { - super.render(entity, f, f1, f2, f3, f4, f5); - setRotationAngles(f, f1, f2, f3, f4, f5, entity); - thorax.render(f5); - head.render(f5); - connector2.render(f5); - RearEnd.render(f5); - Leg6.render(f5); - Leg4.render(f5); - Leg2.render(f5); - Leg5.render(f5); - Leg3.render(f5); - Leg1.render(f5); - connector1.render(f5); - } - - private void setRotation(ModelRenderer model, float x, float y, float z) - { - model.rotateAngleX = x; - model.rotateAngleY = y; - model.rotateAngleZ = z; - } - - /** - * Sets the model's various rotation angles. For bipeds, par1 and par2 are used for animating the movement of arms - * and legs, where par1 represents the time(so that arms and legs swing back and forth) and par2 represents how - * "far" arms and legs can swing at most. - */ - public void setRotationAngles(float par1, float par2, float par3, float par4, float par5, float par6, Entity par7Entity) - { - this.head.rotateAngleY = par4 / (180F / (float)Math.PI); - this.head.rotateAngleX = par5 / (180F / (float)Math.PI); - - float legZ = ((float)Math.PI / 11F); - this.Leg1.rotateAngleZ = -legZ; - this.Leg2.rotateAngleZ = legZ; - this.Leg3.rotateAngleZ = -legZ * 0.74F; - this.Leg4.rotateAngleZ = legZ * 0.74F; - this.Leg5.rotateAngleZ = -legZ; - this.Leg6.rotateAngleZ = legZ; - - float var9 = -0.0F; - float var10 = 0.3926991F; - this.Leg1.rotateAngleY = var10 * 2.0F + var9; - this.Leg2.rotateAngleY = -var10 * 2.0F - var9; - this.Leg3.rotateAngleY = var10 * 1.0F + var9; - this.Leg4.rotateAngleY = -var10 * 1.0F - var9; - this.Leg5.rotateAngleY = -var10 * 2.0F + var9; - this.Leg6.rotateAngleY = var10 * 2.0F - var9; - - float var11 = -(MathHelper.cos(par1 * 0.6662F * 2.0F + 0.0F) * 0.4F) * par2; - float var12 = -(MathHelper.cos(par1 * 0.6662F * 2.0F + (float)Math.PI) * 0.4F) * par2; - float var14 = -(MathHelper.cos(par1 * 0.6662F * 2.0F + ((float)Math.PI * 3F / 2F)) * 0.4F) * par2; - - float var15 = Math.abs(MathHelper.sin(par1 * 0.6662F + 0.0F) * 0.4F) * par2; - float var16 = Math.abs(MathHelper.sin(par1 * 0.6662F + (float)Math.PI) * 0.4F) * par2; - float var18 = Math.abs(MathHelper.sin(par1 * 0.6662F + ((float)Math.PI * 3F / 2F)) * 0.4F) * par2; - - this.Leg1.rotateAngleY += var11; - this.Leg2.rotateAngleY += -var11; - this.Leg3.rotateAngleY += var12; - this.Leg4.rotateAngleY += -var12; - this.Leg5.rotateAngleY += var14; - this.Leg6.rotateAngleY += -var14; - - this.Leg1.rotateAngleZ += var15; - this.Leg2.rotateAngleZ += -var15; - - this.Leg3.rotateAngleZ += var16; - this.Leg4.rotateAngleZ += -var16; - - this.Leg5.rotateAngleZ += var18; - this.Leg6.rotateAngleZ += -var18; - - - } - - @Override - public void setLivingAnimations(EntityLivingBase par1EntityLiving, float par2, float par3, float partialTick) - { - EntityTFPinchBeetle beetle = (EntityTFPinchBeetle)par1EntityLiving; - - if (beetle.riddenByEntity == null) - { - // open jaws - this.jaw1a.rotateAngleY = 2.96705972839036F; - this.jaw2a.rotateAngleY = 0.3490658503988659F; - } - else - { - // close jaws - this.jaw1a.rotateAngleY = 2.356194490192345F; - this.jaw2a.rotateAngleY = 0.7853981633974483F; - } - } - - - -} diff --git a/src/main/java/twilightforest/client/model/ModelTFProtectionBox.java b/src/main/java/twilightforest/client/model/ModelTFProtectionBox.java deleted file mode 100644 index 692014c228..0000000000 --- a/src/main/java/twilightforest/client/model/ModelTFProtectionBox.java +++ /dev/null @@ -1,57 +0,0 @@ -package twilightforest.client.model; - -import net.minecraft.client.model.ModelBase; -import net.minecraft.client.model.ModelRenderer; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import twilightforest.entity.EntityTFProtectionBox; - -public class ModelTFProtectionBox extends ModelBase -{ - - @Override - public void setLivingAnimations(EntityLivingBase par1EntityLivingBase, float par2, float par3, float par4) { - } - - public ModelRenderer box; - private int lastPixelsX; - private int lastPixelsY; - private int lastPixelsZ; - - public ModelTFProtectionBox() - { - textureWidth = 16; - textureHeight = 16; - box = new ModelRenderer(this, 0, 0); - box.addBox(0F, 0F, 0F, 16, 16, 16, 0F); - box.setRotationPoint(0F, 0F, 0F); - } - - @Override - public void render(Entity par1Entity, float par2, float par3, float par4, float par5, float par6, float par7) { - - EntityTFProtectionBox boxEntity = (EntityTFProtectionBox) par1Entity; - - int pixelsX = boxEntity.sizeX * 16 + 2; - int pixelsY = boxEntity.sizeY * 16 + 2; - int pixelsZ = boxEntity.sizeZ * 16 + 2; - - if (pixelsX != this.lastPixelsX || pixelsY != this.lastPixelsY || pixelsZ != this.lastPixelsZ) { - resizeBoxElement(pixelsX, pixelsY, pixelsZ); - } - - box.render(par7); - } - - private void resizeBoxElement(int pixelsX, int pixelsY, int pixelsZ) { - box = new ModelRenderer(this, 0, 0); - box.addBox(-1F, -1F, -1F, pixelsX, pixelsY, pixelsZ, 0F); - box.setRotationPoint(0F, 0F, 0F); - - this.lastPixelsX = pixelsX; - this.lastPixelsY = pixelsY; - this.lastPixelsZ = pixelsZ; - } - - -} diff --git a/src/main/java/twilightforest/client/model/ModelTFQuestRam.java b/src/main/java/twilightforest/client/model/ModelTFQuestRam.java deleted file mode 100644 index 08220a7c15..0000000000 --- a/src/main/java/twilightforest/client/model/ModelTFQuestRam.java +++ /dev/null @@ -1,239 +0,0 @@ -// Date: 5/18/2012 11:45:03 PM -// Template version 1.1 -// Java generated by Techne -// Keep in mind that you still need to fill in some blanks -// - ZeuX - -package twilightforest.client.model; - - -import net.minecraft.client.model.ModelBase; -import net.minecraft.client.model.ModelRenderer; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.passive.EntitySheep; -import net.minecraft.util.MathHelper; - -import org.lwjgl.opengl.GL11; - -import twilightforest.entity.passive.EntityTFQuestRam; - - - -public class ModelTFQuestRam extends ModelBase -{ - //fields - ModelRenderer frontbody; - ModelRenderer rearbody; - ModelRenderer leg1; - ModelRenderer haunch1; - ModelRenderer leg2; - ModelRenderer haunch2; - ModelRenderer leg3; - ModelRenderer haunch3; - ModelRenderer leg4; - ModelRenderer haunch4; - ModelRenderer neck; - ModelRenderer nose; - ModelRenderer head; - - ModelRenderer[] segments; - boolean[] segmentEnabled; - - int[] colorOrder = new int[] {0, 8, 7, 15, 14, 1, 4, 5, 13, 3, 9, 11, 10, 2, 6, 12}; - - public ModelTFQuestRam() - { - textureWidth = 128; - textureHeight = 128; - setTextureOffset("head.head", 0, 70); - setTextureOffset("head.horn1a", 0, 94); - setTextureOffset("head.horn1b", 20, 96); - setTextureOffset("head.horn1c", 34, 95); - setTextureOffset("head.horn1d", 46, 98); - setTextureOffset("head.horn1e", 58, 95); - setTextureOffset("head.horn1f", 76, 95); - setTextureOffset("head.horn1g", 88, 97); - setTextureOffset("head.horn1a", 0, 94); - setTextureOffset("head.horn1b", 20, 96); - setTextureOffset("head.horn1c", 34, 95); - setTextureOffset("head.horn1d", 46, 98); - setTextureOffset("head.horn1e", 58, 95); - setTextureOffset("head.horn1f", 76, 95); - setTextureOffset("head.horn1g", 88, 97); - - frontbody = new ModelRenderer(this, 0, 0); - frontbody.addBox(-9F, -7.5F, -15F, 18, 15, 15); - frontbody.setRotationPoint(0F, -1F, 2F); - - rearbody = new ModelRenderer(this, 0, 30); - rearbody.addBox(-9F, -7.5F, 0F, 18, 15, 15); - rearbody.setRotationPoint(0F, -1F, 4F); - - - leg1 = new ModelRenderer(this, 66, 0); - leg1.addBox(-3F, 10F, -3F, 6, 12, 6); - leg1.setRotationPoint(-6F, 2F, 13F); - - haunch1 = new ModelRenderer(this, 90, 0); - haunch1.addBox(-3.5F, 0F, -6F, 7, 10, 10); - haunch1.setRotationPoint(-6F, 2F, 13F); - - leg2 = new ModelRenderer(this, 66, 0); - leg2.addBox(-3F, 10F, -3F, 6, 12, 6); - leg2.setRotationPoint(6F, 2F, 13F); - - haunch2 = new ModelRenderer(this, 90, 0); - haunch2.addBox(-3.5F, 0F, -6F, 7, 10, 10); - haunch2.setRotationPoint(6F, 2F, 13F); - - leg3 = new ModelRenderer(this, 66, 18); - leg3.addBox(-3F, 10F, -3F, 6, 13, 6); - leg3.setRotationPoint(-6F, 1F, -8F); - - haunch3 = new ModelRenderer(this, 90, 20); - haunch3.addBox(-3.5F, 0F, -4F, 7, 10, 7); - haunch3.setRotationPoint(-6F, 1F, -8F); - - leg4 = new ModelRenderer(this, 66, 18); - leg4.addBox(-3F, 10F, -3F, 6, 13, 6); - leg4.setRotationPoint(6F, 1F, -8F); - - haunch4 = new ModelRenderer(this, 90, 20); - haunch4.addBox(-3.5F, 0F, -4F, 7, 10, 7); - haunch4.setRotationPoint(6F, 1F, -8F); - - neck = new ModelRenderer(this, 66, 37); - neck.addBox(-5.5F, -8F, -8F, 11, 14, 12); - neck.setRotationPoint(0F, -8F, -7F); - - setRotation(neck, 0.2617994F, 0F, 0F); - - head = new ModelRenderer(this, "head"); - head.setRotationPoint(0F, -13F, -5F); - - head.addBox("head", -6F, -4.5F, -15F, 12, 9, 15); - head.addBox("horn1a", 5F, -9F, -7F, 4, 4, 6); - head.addBox("horn1b", 7F, -8F, -2F, 3, 4, 4); - head.addBox("horn1c", 8F, -6F, 0F, 3, 6, 3); - head.addBox("horn1d", 9.5F, -2F, -2F, 3, 3, 3); - head.addBox("horn1e", 11F, 0F, -7F, 3, 3, 6); - head.addBox("horn1f", 12F, -4F, -9F, 3, 6, 3); - head.addBox("horn1g", 13F, -6F, -7F, 3, 3, 4); - head.addBox("horn1a", -9F, -9F, -7F, 4, 4, 6); - head.addBox("horn1b", -10F, -8F, -2F, 3, 4, 4); - head.addBox("horn1c", -11F, -6F, 0F, 3, 6, 3); - head.addBox("horn1d", -12.5F, -2F, -2F, 3, 3, 3); - head.addBox("horn1e", -14F, 0F, -7F, 3, 3, 6); - head.addBox("horn1f", -15F, -4F, -9F, 3, 6, 3); - head.addBox("horn1g", -16F, -6F, -7F, 3, 3, 4); - - nose = new ModelRenderer(this, 54, 73); - nose.addBox(-5.5F, -5F, -13F, 11, 9, 12); - nose.setRotationPoint(0F, -7F, -1F); - nose.setTextureSize(128, 128); - setRotation(nose, 0.5235988F, 0F, 0F); - head.addChild(nose); - - segments = new ModelRenderer[16]; - segmentEnabled = new boolean[16]; - for (int i = 0; i < 16; i++) { - segments[i] = new ModelRenderer(this, 0, 104); - segments[i].addBox(-9F, -7.5F, 0F, 18, 15, 2); - segments[i].setRotationPoint(0F, -1F, 2F); - - segmentEnabled[i] = false; - } - } - - public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) - { - super.render(entity, f, f1, f2, f3, f4, f5); - setRotationAngles(f, f1, f2, f3, f4, f5); - frontbody.render(f5); - rearbody.render(f5); - leg1.render(f5); - haunch1.render(f5); - leg2.render(f5); - haunch2.render(f5); - leg3.render(f5); - haunch3.render(f5); - leg4.render(f5); - haunch4.render(f5); - neck.render(f5); - //nose.render(f5); - head.render(f5); - - for (int i = 0; i < 16; i++) { - if (segmentEnabled[i]) { - float var4 = 1.0F; - GL11.glColor3f(var4 * EntitySheep.fleeceColorTable[i][0], var4 * EntitySheep.fleeceColorTable[i][1], var4 * EntitySheep.fleeceColorTable[i][2]); - segments[i].render(f5); - - } - } - GL11.glColor3f(1.0F, 1.0F, 1.0F); - } - - private void setRotation(ModelRenderer model, float x, float y, float z) - { - model.rotateAngleX = x; - model.rotateAngleY = y; - model.rotateAngleZ = z; - } - - /** - * Sets the models various rotation angles. - */ - public void setRotationAngles(float par1, float par2, float par3, float par4, float par5, float par6) - { - this.head.rotateAngleX = par5 / (180F / (float)Math.PI); - this.head.rotateAngleY = par4 / (180F / (float)Math.PI); - - this.neck.rotateAngleY = this.head.rotateAngleY; - - this.leg1.rotateAngleX = MathHelper.cos(par1 * 0.6662F) * 1.4F * par2 * 0.5F; - this.leg2.rotateAngleX = MathHelper.cos(par1 * 0.6662F + (float)Math.PI) * 1.4F * par2 * 0.5F; - this.leg3.rotateAngleX = MathHelper.cos(par1 * 0.6662F + (float)Math.PI) * 1.4F * par2 * 0.5F; - this.leg4.rotateAngleX = MathHelper.cos(par1 * 0.6662F) * 1.4F * par2 * 0.5F; - this.haunch1.rotateAngleX = this.leg1.rotateAngleX; - this.haunch2.rotateAngleX = this.leg2.rotateAngleX; - this.haunch3.rotateAngleX = this.leg3.rotateAngleX; - this.haunch4.rotateAngleX = this.leg4.rotateAngleX; - } - - /** - * Used for easily adding entity-dependent animations. The second and third float params here are the same second - * and third as in the setRotationAngles method. - */ - @Override - public void setLivingAnimations(EntityLivingBase par1EntityLiving, float par2, float par3, float partialTick) { - EntityTFQuestRam ram = (EntityTFQuestRam)par1EntityLiving; - - // how many colors should we display? - int count = ram.countColorsSet(); - - this.rearbody.rotationPointZ = 2 + 2 * count; - this.leg1.rotationPointZ = 11 + 2 * count; - this.leg2.rotationPointZ = 11 + 2 * count; - this.haunch1.rotationPointZ = 11 + 2 * count; - this.haunch2.rotationPointZ = 11 + 2 * count; - - // set up the colors displayed in color order - int segmentOffset = 2; - for (int color : colorOrder) { - if (ram.isColorPresent(color)) { - segmentEnabled[color] = true; - segments[color].rotationPointZ = segmentOffset; - - segmentOffset += 2; - } - else { - segmentEnabled[color] = false; - } - } - } - - - -} diff --git a/src/main/java/twilightforest/client/model/ModelTFRaven.java b/src/main/java/twilightforest/client/model/ModelTFRaven.java deleted file mode 100644 index 8c9e1d66cf..0000000000 --- a/src/main/java/twilightforest/client/model/ModelTFRaven.java +++ /dev/null @@ -1,153 +0,0 @@ -// Date: 4/28/2012 9:46:20 PM -// Template version 1.1 -// Java generated by Techne -// Keep in mind that you still need to fill in some blanks -// - ZeuX - -package twilightforest.client.model; - -import net.minecraft.client.model.ModelBase; -import net.minecraft.client.model.ModelRenderer; -import net.minecraft.entity.Entity; -import net.minecraft.util.MathHelper; -import twilightforest.entity.passive.EntityTFBird; - - -public class ModelTFRaven extends ModelBase -{ - //fields - ModelRenderer head; - ModelRenderer beak1; - ModelRenderer beak2; - ModelRenderer body; - ModelRenderer rightarm; - ModelRenderer leftarm; - ModelRenderer rightleg; - ModelRenderer leftleg; - ModelRenderer rightfoot; - ModelRenderer leftfoot; - ModelRenderer tail; - - public ModelTFRaven() - { - textureWidth = 32; - textureHeight = 32; - - head = new ModelRenderer(this, 0, 0); - head.addBox(-1.5F, -1.5F, -3F, 3, 3, 3); - head.setRotationPoint(0F, 18F, 0F); - head.setTextureSize(32, 32); - head.mirror = true; - setRotation(head, 0F, 0F, 0F); - - beak1 = new ModelRenderer(this, 12, 0); - beak1.addBox(-0.5F, -1F, -2F, 1, 1, 2); - beak1.setRotationPoint(0F, 0F, -2.5F); - beak1.rotateAngleX = 0.2617994F; - head.addChild(beak1); - - beak2 = new ModelRenderer(this, 12, 0); - beak2.addBox(-0.5F, 0F, -2F, 1, 1, 2); - beak2.setRotationPoint(0F, 0F, -2.5F); - beak2.rotateAngleX = -0.2617994F; - head.addChild(beak2); - - body = new ModelRenderer(this, 0, 6); - body.addBox(-1.5F, 0F, -1F, 3, 4, 6); - body.setRotationPoint(0F, 17F, 1F); - body.setTextureSize(32, 32); - setRotation(body, -0.5235988F, 0F, 0F); - - rightarm = new ModelRenderer(this, 0, 16); - rightarm.addBox(-1F, 0F, -1.5F, 1, 3, 6); - rightarm.setRotationPoint(-1.5F, 18F, 1F); - rightarm.setTextureSize(32, 32); - - leftarm = new ModelRenderer(this, 0, 16); - leftarm.addBox(0F, 0F, -1.5F, 1, 3, 6); - leftarm.setRotationPoint(1.5F, 18F, 1F); - leftarm.setTextureSize(32, 32); - - rightleg = new ModelRenderer(this, 14, 16); - rightleg.addBox(0F, 0F, 0F, 1, 2, 1); - rightleg.setRotationPoint(-1.5F, 21F, 1F); - rightleg.setTextureSize(32, 32); - - rightfoot = new ModelRenderer(this, 14, 20); - rightfoot.addBox(0F, -1F, -2F, 1, 1, 2); - rightfoot.setRotationPoint(0F, 2F, 1F); - rightfoot.setTextureSize(32, 32); - setRotation(rightfoot, 0.5235988F, 0F, 0F); - rightleg.addChild(rightfoot); - - leftleg = new ModelRenderer(this, 14, 16); - leftleg.addBox(0F, 0F, 0F, 1, 2, 1); - leftleg.setRotationPoint(0.5F, 21F, 1F); - leftleg.setTextureSize(32, 32); - - leftfoot = new ModelRenderer(this, 14, 20); - leftfoot.addBox(0F, -1F, -2F, 1, 1, 2); - leftfoot.setRotationPoint(0F, 2F, 1F); - leftfoot.setTextureSize(32, 32); - setRotation(leftfoot, 0.5235988F, 0F, 0F); - leftleg.addChild(leftfoot); - - tail = new ModelRenderer(this, 0, 25); - tail.addBox(-1.5F, -0.5F, 0F, 3, 1, 3); - tail.setRotationPoint(0F, 21F, 4F); - tail.setTextureSize(32, 32); - setRotation(tail, -0.5235988F, 0F, 0F); - } - - public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) - { - super.render(entity, f, f1, f2, f3, f4, f5); - setRotationAngles(f, f1, f2, f3, f4, f5, entity); - head.render(f5); - body.render(f5); - rightarm.render(f5); - leftarm.render(f5); - rightleg.render(f5); - leftleg.render(f5); - - tail.render(f5); - } - - private void setRotation(ModelRenderer model, float x, float y, float z) - { - model.rotateAngleX = x; - model.rotateAngleY = y; - model.rotateAngleZ = z; - } - - - /** - * Sets the models various rotation angles. - */ - public void setRotationAngles(float par1, float par2, float par3, float par4, float par5, float par6, Entity par7Entity) - { - head.rotateAngleX = par5 / (180F / (float)Math.PI); - head.rotateAngleY = par4 / (180F / (float)Math.PI); - head.rotateAngleZ = par4 > 5 ? -0.2617994F : 0; - - rightleg.rotateAngleX = MathHelper.cos(par1 * 0.6662F) * 1.4F * par2; - leftleg.rotateAngleX = MathHelper.cos(par1 * 0.6662F + (float)Math.PI) * 1.4F * par2; - - rightarm.rotateAngleZ = par3; - leftarm.rotateAngleZ = -par3; - - if (((EntityTFBird)par7Entity).isBirdLanded()) - { - rightleg.rotationPointY = 21; - leftleg.rotationPointY = 21; - } - else - { - rightleg.rotationPointY = 20F; - leftleg.rotationPointY = 20F; - } - } - - - -} diff --git a/src/main/java/twilightforest/client/model/ModelTFRedcap.java b/src/main/java/twilightforest/client/model/ModelTFRedcap.java deleted file mode 100644 index ef9ec28754..0000000000 --- a/src/main/java/twilightforest/client/model/ModelTFRedcap.java +++ /dev/null @@ -1,78 +0,0 @@ -package twilightforest.client.model; - -import net.minecraft.client.model.ModelBiped; -import net.minecraft.client.model.ModelRenderer; -import net.minecraft.entity.Entity; - - -public class ModelTFRedcap extends ModelBiped -{ - public ModelTFRedcap() - { - bipedHead = new ModelRenderer(this, 0, 0); - bipedHead.addBox(-3.4F, 1F, -4F, 7, 7, 7, 0F); - bipedHead.setRotationPoint(0F, 0F, 0F); - - bipedHeadwear = new ModelRenderer(this, 32, 0); - bipedHeadwear.addBox(-2F, 0F, -3F, 4, 5, 7, 0F); - bipedHeadwear.setRotationPoint(0F, 0F, 0F); - - bipedBody = new ModelRenderer(this, 12, 19); - bipedBody.addBox(-4F, 6F, -2F, 8, 9, 4, 0F); - bipedBody.setRotationPoint(0F, 0F, 0F); - - bipedRightArm = new ModelRenderer(this, 36, 17); - bipedRightArm.addBox(-2F, -2F, -2F, 3, 12, 3, 0F); - bipedRightArm.setRotationPoint(-5F, 8F, 0F); - - bipedLeftArm = new ModelRenderer(this, 36, 17); - bipedLeftArm.addBox(-1F, -2F, -2F, 3, 12, 3, 0F); - bipedLeftArm.setRotationPoint(5F, 8F, 0F); - - bipedRightLeg = new ModelRenderer(this, 0, 20); - bipedRightLeg.addBox(-2F, 2F, -1F, 3, 9, 3, 0F); - bipedRightLeg.setRotationPoint(-2F, 12F, 0F); - - bipedLeftLeg = new ModelRenderer(this, 0, 20); - bipedLeftLeg.addBox(-1F, 3F, -1F, 3, 9, 3, 0F); - bipedLeftLeg.setRotationPoint(2F, 12F, 0F); - - goblinRightEar = new ModelRenderer(this, 48, 20); - goblinRightEar.addBox(3F, -2F, -1F, 2, 3, 1, 0F); - goblinRightEar.setRotationPoint(0F, 3F, 0F); - - goblinLeftEar = new ModelRenderer(this, 48, 24); - goblinLeftEar.addBox(-5F, -2F, -1F, 2, 3, 1, 0F); - goblinLeftEar.setRotationPoint(0F, 3F, 0F); - - goblinLeftEar.mirror = true; -} - - public void setRotationAngles(float f, float f1, float f2, float f3, float f4, float f5, Entity entity) - { - super.setRotationAngles(f, f1, f2, f3, f4, f5, entity); - - goblinRightEar.rotateAngleX = bipedHead.rotateAngleX; - goblinRightEar.rotateAngleY = bipedHead.rotateAngleY; - goblinRightEar.rotateAngleZ = bipedHead.rotateAngleZ; - - goblinLeftEar.rotateAngleX = bipedHead.rotateAngleX; - goblinLeftEar.rotateAngleY = bipedHead.rotateAngleY; - goblinLeftEar.rotateAngleZ = bipedHead.rotateAngleZ; - } - - - - @Override - public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { - super.render(entity, f, f1, f2, f3, f4, f5); - - goblinRightEar.render(f5); - goblinLeftEar.render(f5); - } - - - - ModelRenderer goblinRightEar; - ModelRenderer goblinLeftEar; -} diff --git a/src/main/java/twilightforest/client/model/ModelTFSkeletonDruid.java b/src/main/java/twilightforest/client/model/ModelTFSkeletonDruid.java deleted file mode 100644 index fb9e19f452..0000000000 --- a/src/main/java/twilightforest/client/model/ModelTFSkeletonDruid.java +++ /dev/null @@ -1,48 +0,0 @@ -package twilightforest.client.model; - -import net.minecraft.client.model.ModelBiped; -import net.minecraft.client.model.ModelRenderer; -import net.minecraft.entity.Entity; - - -public class ModelTFSkeletonDruid extends ModelBiped { - - public ModelTFSkeletonDruid() { - float f = 0.0F; - - bipedBody = new ModelRenderer(this, 8, 16); - bipedBody.addBox(-4F, 0.0F, -2F, 8, 12, 4, f); - bipedBody.setRotationPoint(0.0F, 0.0F + f, 0.0F); - - bipedRightArm = new ModelRenderer(this, 0, 16); - bipedRightArm.addBox(-1F, -2F, -1F, 2, 12, 2, f); - bipedRightArm.setRotationPoint(-5F, 2.0F, 0.0F); - bipedLeftArm = new ModelRenderer(this, 0, 16); - bipedLeftArm.mirror = true; - bipedLeftArm.addBox(-1F, -2F, -1F, 2, 12, 2, f); - bipedLeftArm.setRotationPoint(5F, 2.0F, 0.0F); - - this.bipedRightLeg = new ModelRenderer(this, 0, 16); - this.bipedRightLeg.addBox(-1.0F, 0.0F, -1.0F, 2, 12, 2); - this.bipedRightLeg.setRotationPoint(-2.0F, 12.0F, 0.0F); - this.bipedLeftLeg = new ModelRenderer(this, 0, 16); - this.bipedLeftLeg.mirror = true; - this.bipedLeftLeg.addBox(-1.0F, 0.0F, -1.0F, 2, 12, 2); - this.bipedLeftLeg.setRotationPoint(2.0F, 12.0F, 0.0F); - - - dress = new ModelRenderer(this, 32, 16); - dress.addBox(-4F, 12.0F, -2F, 8, 12, 4, f); - dress.setRotationPoint(0.0F, 0.0F, 0.0F); - } - - public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) - { - super.render(entity, f, f1, f2, f3, f4, f5); - - dress.render(f5); - } - - public ModelRenderer dress; - -} diff --git a/src/main/java/twilightforest/client/model/ModelTFSlimeBeetle.java b/src/main/java/twilightforest/client/model/ModelTFSlimeBeetle.java deleted file mode 100644 index 81005388b3..0000000000 --- a/src/main/java/twilightforest/client/model/ModelTFSlimeBeetle.java +++ /dev/null @@ -1,253 +0,0 @@ -// Date: 11/5/2012 7:35:56 PM -// Template version 1.1 -// Java generated by Techne -// Keep in mind that you still need to fill in some blanks -// - ZeuX -package twilightforest.client.model; - -import net.minecraft.client.model.ModelBase; -import net.minecraft.client.model.ModelRenderer; -import net.minecraft.entity.Entity; -import net.minecraft.util.MathHelper; - -public class ModelTFSlimeBeetle extends ModelBase -{ - //fields - ModelRenderer head; - ModelRenderer RearEnd; - ModelRenderer Leg6; - ModelRenderer Leg4; - ModelRenderer Leg2; - ModelRenderer Leg5; - ModelRenderer Leg3; - ModelRenderer Leg1; - ModelRenderer connector1; - ModelRenderer antenna1; - ModelRenderer antenna2; - ModelRenderer eye1; - ModelRenderer eye2; - - ModelRenderer slimeCube; - ModelRenderer tail1; - ModelRenderer tail2; - ModelRenderer mouth; - ModelRenderer slimeCenter; - - boolean renderPassModel = false; - - - public ModelTFSlimeBeetle() - { - this(false); - } - - public ModelTFSlimeBeetle(boolean renderpass) - { - this.renderPassModel = renderpass; - - textureWidth = 64; - textureHeight = 64; - - connector1 = new ModelRenderer(this, 0, 12); - connector1.addBox(-3F, -3F, -1F, 6, 6, 1); - connector1.setRotationPoint(0F, 19F, -4F); - - RearEnd = new ModelRenderer(this, 31, 6); - RearEnd.addBox(-4F, -11F, -4F, 8, 10, 8); - RearEnd.setRotationPoint(0F, 18F, 7F); - setRotation(RearEnd, 1.570796F, 0F, 0F); - - Leg6 = new ModelRenderer(this, 40, 0); - Leg6.addBox(-1F, -1F, -1F, 10, 2, 2); - Leg6.setRotationPoint(2F, 21F, -4F); - setRotation(Leg6, 0F, 0.2792527F, 0.3490659F); - - Leg5 = new ModelRenderer(this, 40, 0); - Leg5.mirror = true; - Leg5.addBox(-9F, -1F, -1F, 10, 2, 2); - Leg5.setRotationPoint(-2F, 21F, -4F); - setRotation(Leg5, 0F, -0.2792527F, -0.3490659F); - - Leg4 = new ModelRenderer(this, 40, 0); - Leg4.addBox(-1F, -1F, -1F, 10, 2, 2); - Leg4.setRotationPoint(2F, 21F, -1F); - setRotation(Leg4, 0F, -0.2792527F, 0.3490659F); - - Leg2 = new ModelRenderer(this, 40, 0); - Leg2.addBox(-1F, -1F, -1F, 10, 2, 2); - Leg2.setRotationPoint(2F, 21F, 4F); - setRotation(Leg2, 0F, -0.6981317F, 0.3490659F); - - Leg3 = new ModelRenderer(this, 40, 0); - Leg3.mirror = true; - Leg3.addBox(-9F, -1F, -1F, 10, 2, 2); - Leg3.setRotationPoint(-2F, 21F, -1F); - setRotation(Leg3, 0F, 0.2792527F, -0.3490659F); - - Leg1 = new ModelRenderer(this, 40, 0); - Leg1.mirror = true; - Leg1.addBox(-9F, -1F, -1F, 10, 2, 2); - Leg1.setRotationPoint(-2F, 21F, 4F); - Leg1.setTextureSize(64, 32); - setRotation(Leg1, 0F, 0.6981317F, -0.3490659F); - - head = new ModelRenderer(this, 0, 0); - head.addBox(-4F, -4F, -6F, 8, 6, 6); - head.setRotationPoint(0F, 19F, -5F); - - antenna1 = new ModelRenderer(this, 38, 4); - antenna1.addBox(0F, -0.5F, -0.5F, 12, 1, 1); - antenna1.setRotationPoint(1F, -3F, -5F); - setRotation(antenna1, 0F, 1.047198F, -0.296706F); - - antenna2 = new ModelRenderer(this, 38, 4); - antenna2.addBox(0F, -0.5F, -0.5F, 12, 1, 1); - antenna2.setRotationPoint(-1F, -3F, -5F); - setRotation(antenna2, 0F, 2.094395F, 0.296706F); - - eye1 = new ModelRenderer(this, 15, 12); - eye1.addBox(-1.5F, -1.5F, -1.5F, 3, 3, 3); - eye1.setRotationPoint(-3F, -2F, -5F); - - eye2 = new ModelRenderer(this, 15, 12); - eye2.addBox(-1.5F, -1.5F, -1.5F, 3, 3, 3); - eye2.setRotationPoint(3F, -2F, -5F); - - - mouth = new ModelRenderer(this, 17, 12); - mouth.addBox(-1F, -1F, -1F, 2, 2, 1); - mouth.setRotationPoint(0F, 1, -6F); - - - head.addChild(antenna1); - head.addChild(antenna2); - head.addChild(eye1); - head.addChild(eye2); - head.addChild(mouth); - - - tail1 = new ModelRenderer(this, 0, 20); - tail1.addBox(-3F, -3F, -3F, 6, 6, 6); - tail1.setRotationPoint(0F, 19F, 9F); - - tail2 = new ModelRenderer(this, 0, 20); - tail2.addBox(-3F, -6F, -3F, 6, 6, 6); - tail2.setRotationPoint(0F, -3F, 2F); - - slimeCube = new ModelRenderer(this, 0, 40); - slimeCube.addBox(-6F, -12F, -9F, 12, 12, 12); - slimeCube.setRotationPoint(0F, -6, 0); - - slimeCenter = new ModelRenderer(this, 32, 24); - slimeCenter.addBox(-4F, -10F, -7F, 8, 8, 8); - slimeCenter.setRotationPoint(0F, -6, 0); - - tail1.addChild(tail2); - - if (renderPassModel) - { - tail2.addChild(slimeCube); - } - else - { - tail2.addChild(slimeCenter); - } - } - - public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) - { - setRotationAngles(f, f1, f2, f3, f4, f5, entity); - - tail1.render(f5); - - if (renderPassModel) - { - } - else - { - head.render(f5); - RearEnd.render(f5); - Leg6.render(f5); - Leg4.render(f5); - Leg2.render(f5); - Leg5.render(f5); - Leg3.render(f5); - Leg1.render(f5); - connector1.render(f5); - //tail1.render(f5); -// tail2.render(f5); -// slimeCenter.render(f5); - } - } - - private void setRotation(ModelRenderer model, float x, float y, float z) - { - model.rotateAngleX = x; - model.rotateAngleY = y; - model.rotateAngleZ = z; - } - - /** - * Sets the model's various rotation angles. For bipeds, par1 and par2 are used for animating the movement of arms - * and legs, where par1 represents the time(so that arms and legs swing back and forth) and par2 represents how - * "far" arms and legs can swing at most. - */ - public void setRotationAngles(float par1, float par2, float par3, float par4, float par5, float par6, Entity par7Entity) - { - this.head.rotateAngleY = par4 / (180F / (float)Math.PI); - this.head.rotateAngleX = par5 / (180F / (float)Math.PI); - - // legs! - float legZ = ((float)Math.PI / 11F); - this.Leg1.rotateAngleZ = -legZ; - this.Leg2.rotateAngleZ = legZ; - this.Leg3.rotateAngleZ = -legZ * 0.74F; - this.Leg4.rotateAngleZ = legZ * 0.74F; - this.Leg5.rotateAngleZ = -legZ; - this.Leg6.rotateAngleZ = legZ; - - float var9 = -0.0F; - float var10 = 0.3926991F; - this.Leg1.rotateAngleY = var10 * 2.0F + var9; - this.Leg2.rotateAngleY = -var10 * 2.0F - var9; - this.Leg3.rotateAngleY = var10 * 1.0F + var9; - this.Leg4.rotateAngleY = -var10 * 1.0F - var9; - this.Leg5.rotateAngleY = -var10 * 2.0F + var9; - this.Leg6.rotateAngleY = var10 * 2.0F - var9; - - float var11 = -(MathHelper.cos(par1 * 0.6662F * 2.0F + 0.0F) * 0.4F) * par2; - float var12 = -(MathHelper.cos(par1 * 0.6662F * 2.0F + (float)Math.PI) * 0.4F) * par2; - float var14 = -(MathHelper.cos(par1 * 0.6662F * 2.0F + ((float)Math.PI * 3F / 2F)) * 0.4F) * par2; - - float var15 = Math.abs(MathHelper.sin(par1 * 0.6662F + 0.0F) * 0.4F) * par2; - float var16 = Math.abs(MathHelper.sin(par1 * 0.6662F + (float)Math.PI) * 0.4F) * par2; - float var18 = Math.abs(MathHelper.sin(par1 * 0.6662F + ((float)Math.PI * 3F / 2F)) * 0.4F) * par2; - - this.Leg1.rotateAngleY += var11; - this.Leg2.rotateAngleY += -var11; - this.Leg3.rotateAngleY += var12; - this.Leg4.rotateAngleY += -var12; - this.Leg5.rotateAngleY += var14; - this.Leg6.rotateAngleY += -var14; - - this.Leg1.rotateAngleZ += var15; - this.Leg2.rotateAngleZ += -var15; - - this.Leg3.rotateAngleZ += var16; - this.Leg4.rotateAngleZ += -var16; - - this.Leg5.rotateAngleZ += var18; - this.Leg6.rotateAngleZ += -var18; - - - - // tail wiggle - this.tail1.rotateAngleX = MathHelper.cos(par3 * 0.3335F) * 0.15F; - this.tail2.rotateAngleX = MathHelper.cos(par3 * 0.4445F) * 0.20F; - this.slimeCube.rotateAngleX = MathHelper.cos(par3 * 0.5555F) * 0.25F; - this.slimeCenter.rotateAngleX = MathHelper.cos(par3 * 0.5555F + 0.25F) * 0.25F; - - } - - -} diff --git a/src/main/java/twilightforest/client/model/ModelTFSnowGuardian.java b/src/main/java/twilightforest/client/model/ModelTFSnowGuardian.java deleted file mode 100644 index 3a79528c72..0000000000 --- a/src/main/java/twilightforest/client/model/ModelTFSnowGuardian.java +++ /dev/null @@ -1,28 +0,0 @@ -package twilightforest.client.model; - -import net.minecraft.client.model.ModelBiped; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; - -public class ModelTFSnowGuardian extends ModelBiped { - - - /** - * Sets the models various rotation angles then renders the model. - */ - public void render(Entity par1Entity, float par2, float par3, float par4, float par5, float par6, float par7) - { - this.setRotationAngles(par2, par3, par4, par5, par6, par7, par1Entity); - - } - - /** - * Used for easily adding entity-dependent animations. The second and third float params here are the same second - * and third as in the setRotationAngles method. - */ - @Override - public void setLivingAnimations(EntityLivingBase par1EntityLiving, float par2, float par3, float partialTick) { - //float bounce = par1EntityLiving.ticksExisted + partialTick; - //par1EntityLiving.yOffset = 0.5F + MathHelper.sin((bounce) * 0.3F) * 0.5F; - } -} diff --git a/src/main/java/twilightforest/client/model/ModelTFSnowQueen.java b/src/main/java/twilightforest/client/model/ModelTFSnowQueen.java deleted file mode 100644 index 3bb6c4aeea..0000000000 --- a/src/main/java/twilightforest/client/model/ModelTFSnowQueen.java +++ /dev/null @@ -1,145 +0,0 @@ -package twilightforest.client.model; - -import twilightforest.entity.boss.EntityTFSnowQueen; -import twilightforest.entity.boss.EntityTFSnowQueen.Phase; -import net.minecraft.client.model.ModelBiped; -import net.minecraft.client.model.ModelRenderer; -import net.minecraft.entity.Entity; -import net.minecraft.util.MathHelper; - -public class ModelTFSnowQueen extends ModelBiped { - - public ModelTFSnowQueen() { - - float par1 = 0; - float par2 = 0; - - - // crown - this.bipedHeadwear = new ModelRenderer(this, 0, 0); - - this.bipedHeadwear.addChild(makeFrontCrown(-1, -4, 10F)); - this.bipedHeadwear.addChild(makeFrontCrown(0, 4, -10F)); - this.bipedHeadwear.addChild(makeSideCrown(-1, -4, 10F)); - this.bipedHeadwear.addChild(makeSideCrown(0, 4, -10F)); - - // copy to back - - - - // dress - this.bipedBody = new ModelRenderer(this, 32, 0); - this.bipedBody.addBox(-4.0F, 0.0F, -2.0F, 8, 23, 4, par1); - this.bipedBody.setRotationPoint(0.0F, 0.0F + par2, 0.0F); - - // shrink - this.bipedRightArm = new ModelRenderer(this, 16, 16); - this.bipedRightArm.addBox(-2.0F, -2.0F, -1.5F, 3, 12, 3, par1); - this.bipedRightArm.setRotationPoint(-5.0F, 2.0F + par2, 0.0F); - this.bipedLeftArm = new ModelRenderer(this, 16, 16); - this.bipedLeftArm.mirror = true; - this.bipedLeftArm.addBox(-1.0F, -2.0F, -1.3F, 3, 12, 3, par1); - this.bipedLeftArm.setRotationPoint(5.0F, 2.0F + par2, 0.0F); - this.bipedRightLeg = new ModelRenderer(this, 0, 16); - this.bipedRightLeg.addBox(-1.5F, 0.0F, -1.5F, 3, 12, 3, par1); - this.bipedRightLeg.setRotationPoint(-1.9F, 12.0F + par2, 0.0F); - this.bipedLeftLeg = new ModelRenderer(this, 0, 16); - this.bipedLeftLeg.mirror = true; - this.bipedLeftLeg.addBox(-1.5F, 0.0F, -1.5F, 3, 12, 3, par1); - this.bipedLeftLeg.setRotationPoint(1.9F, 12.0F + par2, 0.0F); - - } - - private ModelRenderer makeSideCrown(float spikeDepth, float crownX, float angle) { - ModelRenderer crownSide = new ModelRenderer(this, 28, 28); - crownSide.addBox(-3.5F, -0.5F, -0.5F, 7, 1, 1); - crownSide.setRotationPoint(crownX, -6.0F, 0.0F); - crownSide.rotateAngleY = 3.14159F / 2.0F; - - ModelRenderer spike4 = new ModelRenderer(this, 48, 27); - spike4.addBox(-0.5F, -3.5F, spikeDepth, 1, 4, 1); - spike4.rotateAngleX = angle * 1.5F / 180F * 3.14159F; - - ModelRenderer spike3l = new ModelRenderer(this, 52, 28); - spike3l.addBox(-0.5F, -2.5F, spikeDepth, 1, 3, 1); - spike3l.setRotationPoint(-2.5F, 0.0F, 0.0F); - spike3l.rotateAngleX = angle / 180F * 3.14159F; - spike3l.rotateAngleZ = -10F / 180F * 3.14159F; - - ModelRenderer spike3r = new ModelRenderer(this, 52, 28); - spike3r.addBox(-0.5F, -2.5F, spikeDepth, 1, 3, 1); - spike3r.setRotationPoint(2.5F, 0.0F, 0.0F); - spike3r.rotateAngleX = angle / 180F * 3.14159F; - spike3r.rotateAngleZ = 10F / 180F * 3.14159F; - - - crownSide.addChild(spike4); - crownSide.addChild(spike3l); - crownSide.addChild(spike3r); - return crownSide; - } - - private ModelRenderer makeFrontCrown(float spikeDepth, float crownZ, float angle) { - ModelRenderer crownFront = new ModelRenderer(this, 28, 30); - crownFront.addBox(-4.5F, -0.5F, -0.5F, 9, 1, 1); - crownFront.setRotationPoint(0.0F, -6.0F, crownZ); - - ModelRenderer spike4 = new ModelRenderer(this, 48, 27); - spike4.addBox(-0.5F, -3.5F, spikeDepth, 1, 4, 1); - spike4.rotateAngleX = angle * 1.5F / 180F * 3.14159F; - - ModelRenderer spike3l = new ModelRenderer(this, 52, 28); - spike3l.addBox(-0.5F, -2.5F, spikeDepth, 1, 3, 1); - spike3l.setRotationPoint(-2.5F, 0.0F, 0.0F); - spike3l.rotateAngleX = angle / 180F * 3.14159F; - spike3l.rotateAngleZ = -10F / 180F * 3.14159F; - - ModelRenderer spike3r = new ModelRenderer(this, 52, 28); - spike3r.addBox(-0.5F, -2.5F, spikeDepth, 1, 3, 1); - spike3r.setRotationPoint(2.5F, 0.0F, 0.0F); - spike3r.rotateAngleX = angle / 180F * 3.14159F; - spike3r.rotateAngleZ = 10F / 180F * 3.14159F; - - crownFront.addChild(spike4); - crownFront.addChild(spike3l); - crownFront.addChild(spike3r); - return crownFront; - } - - /** - * Sets the model's various rotation angles. For bipeds, par1 and par2 are used for animating the movement of arms - * and legs, where par1 represents the time(so that arms and legs swing back and forth) and par2 represents how - * "far" arms and legs can swing at most. - */ - public void setRotationAngles(float par1, float par2, float par3, float par4, float par5, float par6, Entity par7Entity) - { - super.setRotationAngles(par1, par2, par3, par4, par5, par6, par7Entity); - - EntityTFSnowQueen queen = (EntityTFSnowQueen)par7Entity; - - // in beam phase, arms forwards - if (queen.getCurrentPhase() == Phase.BEAM) { - if (queen.isBreathing()) { - float f6 = MathHelper.sin(this.onGround * (float)Math.PI); - float f7 = MathHelper.sin((1.0F - (1.0F - this.onGround) * (1.0F - this.onGround)) * (float)Math.PI); - this.bipedRightArm.rotateAngleZ = 0.0F; - this.bipedLeftArm.rotateAngleZ = 0.0F; - this.bipedRightArm.rotateAngleY = -(0.1F - f6 * 0.6F); - this.bipedLeftArm.rotateAngleY = 0.1F - f6 * 0.6F; - this.bipedRightArm.rotateAngleX = -((float)Math.PI / 2F); - this.bipedLeftArm.rotateAngleX = -((float)Math.PI / 2F); - this.bipedRightArm.rotateAngleX -= f6 * 1.2F - f7 * 0.4F; - this.bipedLeftArm.rotateAngleX -= f6 * 1.2F - f7 * 0.4F; - this.bipedRightArm.rotateAngleZ += MathHelper.cos(par3 * 0.09F) * 0.05F + 0.05F; - this.bipedLeftArm.rotateAngleZ -= MathHelper.cos(par3 * 0.09F) * 0.05F + 0.05F; - this.bipedRightArm.rotateAngleX += MathHelper.sin(par3 * 0.067F) * 0.05F; - this.bipedLeftArm.rotateAngleX -= MathHelper.sin(par3 * 0.067F) * 0.05F; - } else { - // arms up - this.bipedRightArm.rotateAngleX += Math.PI; - this.bipedLeftArm.rotateAngleX += Math.PI; - } - } - } - -} diff --git a/src/main/java/twilightforest/client/model/ModelTFSpikeBlock.java b/src/main/java/twilightforest/client/model/ModelTFSpikeBlock.java deleted file mode 100644 index d904ce3447..0000000000 --- a/src/main/java/twilightforest/client/model/ModelTFSpikeBlock.java +++ /dev/null @@ -1,137 +0,0 @@ -package twilightforest.client.model; - -import net.minecraft.client.model.ModelBase; -import net.minecraft.client.model.ModelRenderer; -import net.minecraft.entity.Entity; - - -public class ModelTFSpikeBlock extends ModelBase -{ - ModelRenderer block; - ModelRenderer[] spikes = new ModelRenderer[27]; - - public ModelTFSpikeBlock() - { - - block = new ModelRenderer(this, 32, 16); - block.addBox(-4F, -8F, -4F, 8, 8, 8, 0F); - block.setRotationPoint(0F, 0F, 0F); - - for (int i = 0; i < spikes.length; i++) - { - spikes[i] = new ModelRenderer(this, 56, 16); - spikes[i].addBox(-1F, -1F, -1F, 2, 2, 2, 0F); - block.addChild(spikes[i]); - } - - // X - spikes[2].rotationPointX = 4; - spikes[3].rotationPointX = 4; - spikes[4].rotationPointX = 4; - spikes[11].rotationPointX = 4; - spikes[12].rotationPointX = 5; - spikes[13].rotationPointX = 4; - spikes[20].rotationPointX = 4; - spikes[21].rotationPointX = 4; - spikes[22].rotationPointX = 4; - - spikes[6].rotationPointX = -4; - spikes[7].rotationPointX = -4; - spikes[8].rotationPointX = -4; - spikes[15].rotationPointX = -4; - spikes[16].rotationPointX = -5; - spikes[17].rotationPointX = -4; - spikes[24].rotationPointX = -4; - spikes[25].rotationPointX = -4; - spikes[26].rotationPointX = -4; - - // Y - spikes[0].rotationPointY = -9; - spikes[1].rotationPointY = -8; - spikes[2].rotationPointY = -8; - spikes[3].rotationPointY = -8; - spikes[4].rotationPointY = -8; - spikes[5].rotationPointY = -8; - spikes[6].rotationPointY = -8; - spikes[7].rotationPointY = -8; - spikes[8].rotationPointY = -8; - - spikes[9].rotationPointY = -4; // this spike is not really there - spikes[10].rotationPointY = -4; - spikes[11].rotationPointY = -4; - spikes[12].rotationPointY = -4; - spikes[13].rotationPointY = -4; - spikes[14].rotationPointY = -4; - spikes[15].rotationPointY = -4; - spikes[16].rotationPointY = -4; - spikes[17].rotationPointY = -4; - - spikes[18].rotationPointY = 1; - - // Z - spikes[1].rotationPointZ = 4; - spikes[2].rotationPointZ = 4; - spikes[8].rotationPointZ = 4; - spikes[10].rotationPointZ = 4; - spikes[11].rotationPointZ = 5; - spikes[17].rotationPointZ = 4; - spikes[19].rotationPointZ = 4; - spikes[20].rotationPointZ = 4; - spikes[26].rotationPointZ = 4; - - spikes[4].rotationPointZ = -4; - spikes[5].rotationPointZ = -4; - spikes[6].rotationPointZ = -4; - spikes[13].rotationPointZ = -4; - spikes[14].rotationPointZ = -5; - spikes[15].rotationPointZ = -4; - spikes[22].rotationPointZ = -4; - spikes[23].rotationPointZ = -4; - spikes[24].rotationPointZ = -4; - - // rotation - float fourtyFive = (float) (Math.PI / 4F); - - spikes[1].rotateAngleX = fourtyFive; - spikes[5].rotateAngleX = fourtyFive; - spikes[19].rotateAngleX = fourtyFive; - spikes[23].rotateAngleX = fourtyFive; - - spikes[11].rotateAngleY = fourtyFive; - spikes[13].rotateAngleY = fourtyFive; - spikes[15].rotateAngleY = fourtyFive; - spikes[17].rotateAngleY = fourtyFive; - - spikes[3].rotateAngleZ = fourtyFive; - spikes[7].rotateAngleZ = fourtyFive; - spikes[21].rotateAngleZ = fourtyFive; - spikes[25].rotateAngleZ = fourtyFive; - - spikes[2].rotateAngleX = -55F / (180F / (float)Math.PI); - spikes[2].rotateAngleY = fourtyFive; - spikes[24].rotateAngleX = -55F / (180F / (float)Math.PI); - spikes[24].rotateAngleY = fourtyFive; - - spikes[4].rotateAngleX = -35F / (180F / (float)Math.PI); - spikes[4].rotateAngleY = -fourtyFive; - spikes[26].rotateAngleX = -35F / (180F / (float)Math.PI); - spikes[26].rotateAngleY = -fourtyFive; - - spikes[6].rotateAngleY = fourtyFive; - spikes[6].rotateAngleX = -35F / (180F / (float)Math.PI); - spikes[20].rotateAngleY = fourtyFive; - spikes[20].rotateAngleX = -35F / (180F / (float)Math.PI); - - spikes[8].rotateAngleX = -55F / (180F / (float)Math.PI); - spikes[8].rotateAngleY = -fourtyFive; - spikes[22].rotateAngleX = -55F / (180F / (float)Math.PI); - spikes[22].rotateAngleY = -fourtyFive; - - } - - @Override - public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { - block.render(f5); - } - -} diff --git a/src/main/java/twilightforest/client/model/ModelTFSquirrel.java b/src/main/java/twilightforest/client/model/ModelTFSquirrel.java deleted file mode 100644 index dcd1da5280..0000000000 --- a/src/main/java/twilightforest/client/model/ModelTFSquirrel.java +++ /dev/null @@ -1,159 +0,0 @@ -// Date: 4/27/2012 9:49:06 PM -// Template version 1.1 -// Java generated by Techne -// Keep in mind that you still need to fill in some blanks -// - ZeuX - - -package twilightforest.client.model; - -import net.minecraft.client.model.ModelBase; -import net.minecraft.client.model.ModelRenderer; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.util.MathHelper; - - -public class ModelTFSquirrel extends ModelBase -{ - //fields - ModelRenderer body; - ModelRenderer leg1; - ModelRenderer leg2; - ModelRenderer leg3; - ModelRenderer leg4; - ModelRenderer head; - ModelRenderer tail; - ModelRenderer fluff1; - ModelRenderer fluff2; - ModelRenderer fluff3; - - public ModelTFSquirrel() - { - textureWidth = 32; - textureHeight = 32; - setTextureOffset("head.head", 0, 0); - setTextureOffset("head.ear2", 16, 0); - setTextureOffset("head.ear1", 16, 0); - setTextureOffset("tail.fluff1", 0, 20); - setTextureOffset("tail.base", 0, 18); - setTextureOffset("tail.fluff2", 0, 20); - setTextureOffset("tail.fluff3", 0, 26); - - body = new ModelRenderer(this, 0, 8); - body.addBox(-2F, -1F, -2F, 4, 3, 5); - body.setRotationPoint(0F, 21F, 0F); - body.setTextureSize(32, 32); - body.mirror = true; - setRotation(body, 0F, 0F, 0F); - leg1 = new ModelRenderer(this, 0, 16); - leg1.addBox(0F, 0F, 0F, 1, 1, 1); - leg1.setRotationPoint(-2F, 23F, 2F); - leg1.setTextureSize(32, 32); - leg1.mirror = true; - setRotation(leg1, 0F, 0F, 0F); - leg2 = new ModelRenderer(this, 0, 16); - leg2.addBox(0F, 0F, 0F, 1, 1, 1); - leg2.setRotationPoint(1F, 23F, 2F); - leg2.setTextureSize(32, 32); - leg2.mirror = true; - setRotation(leg2, 0F, 0F, 0F); - leg3 = new ModelRenderer(this, 0, 16); - leg3.addBox(0F, 0F, 0F, 1, 1, 1); - leg3.setRotationPoint(-2F, 23F, -2F); - leg3.setTextureSize(32, 32); - - setRotation(leg3, 0F, 0F, 0F); - leg4 = new ModelRenderer(this, 0, 16); - leg4.addBox(0F, 0F, 0F, 1, 1, 1); - leg4.setRotationPoint(1F, 23F, -2F); - leg4.setTextureSize(32, 32); - - setRotation(leg4, 0F, 0F, 0F); - head = new ModelRenderer(this, "head"); - head.setRotationPoint(0F, 22F, -2F); - setRotation(head, 0F, 0F, 0F); - - head.addBox("head", -2F, -5F, -3F, 4, 4, 4); - head.addBox("ear2", -2F, -6F, -0.5F, 1, 1, 1); - head.addBox("ear1", 1F, -6F, -0.5F, 1, 1, 1); - - tail = new ModelRenderer(this, "tail"); - tail.setRotationPoint(0F, 21F, 2F); - - tail.addBox("base", -0.5F, -1.5F, 0.5F, 1, 1, 1); - - fluff1 = new ModelRenderer(this, 0, 20); - fluff1.addBox(-1.5F, -4F, 1F, 3, 3, 3); - tail.addChild(fluff1); - - fluff2 = new ModelRenderer(this, 0, 20); - fluff2.addBox(0F, -3F, -1.5F, 3, 3, 3); - fluff2.setRotationPoint(-1.5F, -4F, 2.5F); - fluff1.addChild(fluff2); - - fluff3 = new ModelRenderer(this, 0, 26); - fluff3.addBox(1.5F, -3F, -1.5F, 3, 3, 3); - fluff3.setRotationPoint(-1.5F, -3F, 0F); - fluff2.addChild(fluff3); - } - - public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) - { - super.render(entity, f, f1, f2, f3, f4, f5); - setRotationAngles(f, f1, f2, f3, f4, f5); - body.render(f5); - leg1.render(f5); - leg2.render(f5); - leg3.render(f5); - leg4.render(f5); - head.render(f5); - tail.render(f5); - } - - private void setRotation(ModelRenderer model, float x, float y, float z) - { - model.rotateAngleX = x; - model.rotateAngleY = y; - model.rotateAngleZ = z; - } - - - /** - * Used for easily adding entity-dependent animations. The second and third float params here are the same second - * and third as in the setRotationAngles method. - */ - public void setLivingAnimations(EntityLivingBase par1EntityLiving, float par2, float par3, float par4) - { - //EntityTFSquirrel squirrel = (EntityTFSquirrel)par1EntityLiving; - - - } - - /** - * Sets the models various rotation angles. - */ - public void setRotationAngles(float par1, float par2, float par3, float par4, float par5, float par6) - { - this.head.rotateAngleX = par5 / (180F / (float)Math.PI); - this.head.rotateAngleY = par4 / (180F / (float)Math.PI); - this.leg1.rotateAngleX = MathHelper.cos(par1 * 0.6662F) * 1.4F * par2; - this.leg2.rotateAngleX = MathHelper.cos(par1 * 0.6662F + (float)Math.PI) * 1.4F * par2; - this.leg3.rotateAngleX = MathHelper.cos(par1 * 0.6662F + (float)Math.PI) * 1.4F * par2; - this.leg4.rotateAngleX = MathHelper.cos(par1 * 0.6662F) * 1.4F * par2; - - if (par2 > 0.2) { - float wiggle = Math.min(par2, 0.6F); - this.tail.rotateAngleX = (MathHelper.cos(par3 * 0.6662F) * 1.0F - (float)Math.PI / 3) * wiggle; - this.fluff2.rotateAngleX = MathHelper.cos(par3 * 0.7774F) * 1.2F * wiggle; - this.fluff3.rotateAngleX = MathHelper.cos(par3 * 0.8886F + (float)Math.PI / 2) * 1.4F * wiggle; - } - else { - this.tail.rotateAngleX = 0.2F + MathHelper.cos(par3 * 0.3335F) * 0.15F; - this.fluff2.rotateAngleX = 0.1F + MathHelper.cos(par3 * 0.4445F) * 0.20F; - this.fluff3.rotateAngleX = 0.1F + MathHelper.cos(par3 * 0.5555F) * 0.25F; - } - - } - -} diff --git a/src/main/java/twilightforest/client/model/ModelTFSwarmSpider.java b/src/main/java/twilightforest/client/model/ModelTFSwarmSpider.java deleted file mode 100644 index 373f8294fc..0000000000 --- a/src/main/java/twilightforest/client/model/ModelTFSwarmSpider.java +++ /dev/null @@ -1,13 +0,0 @@ -package twilightforest.client.model; - -import net.minecraft.client.model.ModelSpider; -import net.minecraft.entity.Entity; - - -public class ModelTFSwarmSpider extends ModelSpider { - - public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) - { - super.render(entity, f, f1, f2, f3, f4, f5 * 0.5f); - } -} diff --git a/src/main/java/twilightforest/client/model/ModelTFTinyBird.java b/src/main/java/twilightforest/client/model/ModelTFTinyBird.java deleted file mode 100644 index bd9a0cc388..0000000000 --- a/src/main/java/twilightforest/client/model/ModelTFTinyBird.java +++ /dev/null @@ -1,159 +0,0 @@ -// Date: 4/25/2012 10:28:13 PM -// Template version 1.1 -// Java generated by Techne -// Keep in mind that you still need to fill in some blanks -// - ZeuX - -package twilightforest.client.model; - - -import net.minecraft.client.model.ModelBase; -import net.minecraft.client.model.ModelRenderer; -import net.minecraft.entity.Entity; -import net.minecraft.util.MathHelper; - -import org.lwjgl.opengl.GL11; - -import twilightforest.entity.passive.EntityTFBird; - -public class ModelTFTinyBird extends ModelBase -{ - //fields - ModelRenderer beak; - ModelRenderer head; - ModelRenderer body; - ModelRenderer rightarm; - ModelRenderer leftarm; - ModelRenderer rightleg; - ModelRenderer leftleg; - ModelRenderer tail; - - public ModelTFTinyBird() - { - textureWidth = 32; - textureHeight = 32; - - head = new ModelRenderer(this, 0, 0); - head.addBox(-1.5F, -1.5F, -1.5F, 3, 3, 3); - head.setRotationPoint(0F, 20.5F, -0.5F); - head.setTextureSize(32, 32); - head.mirror = true; - setRotation(head, 0F, 0F, 0F); - - beak = new ModelRenderer(this, 12, 0); - beak.addBox(-0.5F, -0.5F, -0.5F, 1, 1, 1); - beak.setRotationPoint(0F, 0.5F, -2F); - - head.addChild(beak); - - - body = new ModelRenderer(this, 0, 6); - body.addBox(-1.5F, 0F, -1F, 3, 3, 3); - body.setRotationPoint(0F, 20F, 0F); - body.setTextureSize(32, 32); - body.mirror = true; - setRotation(body, 0F, 0F, 0F); - rightarm = new ModelRenderer(this, 12, 2); - rightarm.addBox(-1F, 0F, -1.5F, 1, 2, 3); - rightarm.setRotationPoint(-1.5F, 20.5F, 1F); - rightarm.setTextureSize(32, 32); - rightarm.mirror = true; - setRotation(rightarm, 0F, 0F, 0F); - leftarm = new ModelRenderer(this, 12, 2); - leftarm.addBox(0F, 0F, -1.5F, 1, 2, 3); - leftarm.setRotationPoint(1.5F, 20.5F, 1F); - leftarm.setTextureSize(32, 32); - leftarm.mirror = true; - setRotation(leftarm, 0F, 0F, 0F); - rightleg = new ModelRenderer(this, 0, 12); - rightleg.addBox(0F, 0F, 0F, 1, 1, 1); - rightleg.setRotationPoint(-1.5F, 23F, 0F); - rightleg.setTextureSize(32, 32); - rightleg.mirror = true; - setRotation(rightleg, 0F, 0F, 0F); - leftleg = new ModelRenderer(this, 0, 12); - leftleg.addBox(0.5F, 0F, 0F, 1, 1, 1); - leftleg.setRotationPoint(0F, 23F, 0F); - leftleg.setTextureSize(32, 32); - leftleg.mirror = true; - setRotation(leftleg, 0F, 0F, 0F); - tail = new ModelRenderer(this, 0, 14); - tail.addBox(-1.5F, -0.5F, 0F, 3, 1, 2); - tail.setRotationPoint(0F, 22F, 2F); - tail.setTextureSize(32, 32); - tail.mirror = true; - setRotation(tail, 0F, 0F, 0F); - } - - /** - * Sets the models various rotation angles then renders the model. - */ - public void render(Entity par1Entity, float par2, float par3, float par4, float par5, float par6, float par7) - { - setRotationAngles(par2, par3, par4, par5, par6, par7, par1Entity); - - if (isChild) - { - float f = 2.0F; - GL11.glPushMatrix(); - GL11.glTranslatef(0.0F, 5F * par7, 0.75F * par7); - head.render(par7); - GL11.glPopMatrix(); - GL11.glPushMatrix(); - GL11.glScalef(1.0F / f, 1.0F / f, 1.0F / f); - GL11.glTranslatef(0.0F, 24F * par7, 0.0F); - body.render(par7); - rightleg.render(par7); - leftleg.render(par7); - rightarm.render(par7); - leftarm.render(par7); - GL11.glPopMatrix(); - } - else - { - head.render(par7); - body.render(par7); - rightleg.render(par7); - leftleg.render(par7); - rightarm.render(par7); - leftarm.render(par7); - tail.render(par7); -// beak.render(par7); - } - } - - private void setRotation(ModelRenderer model, float x, float y, float z) - { - model.rotateAngleX = x; - model.rotateAngleY = y; - model.rotateAngleZ = z; - } - - - /** - * Sets the models various rotation angles. - */ - public void setRotationAngles(float par1, float par2, float par3, float par4, float par5, float par6, Entity par7Entity) - { - head.rotateAngleX = par5 / (180F / (float)Math.PI); - head.rotateAngleY = par4 / (180F / (float)Math.PI); - - rightleg.rotateAngleX = MathHelper.cos(par1 * 0.6662F) * 1.4F * par2; - leftleg.rotateAngleX = MathHelper.cos(par1 * 0.6662F + (float)Math.PI) * 1.4F * par2; - - rightarm.rotateAngleZ = par3; - leftarm.rotateAngleZ = -par3; - - if (((EntityTFBird)par7Entity).isBirdLanded()) - { - rightleg.rotationPointY = 23; - leftleg.rotationPointY = 23; - } - else - { - rightleg.rotationPointY = 22.5F; - leftleg.rotationPointY = 22.5F; - } - - } -} diff --git a/src/main/java/twilightforest/client/model/ModelTFTinyFirefly.java b/src/main/java/twilightforest/client/model/ModelTFTinyFirefly.java deleted file mode 100644 index b73a37512f..0000000000 --- a/src/main/java/twilightforest/client/model/ModelTFTinyFirefly.java +++ /dev/null @@ -1,29 +0,0 @@ -package twilightforest.client.model; - -import net.minecraft.client.model.ModelBase; -import net.minecraft.client.model.ModelRenderer; - - -public class ModelTFTinyFirefly extends ModelBase -{ - public ModelTFTinyFirefly() - { - glow1 = new ModelRenderer(this, 20, 0); - glow1.addBox(-5F, -5F, 0F, 10, 10, 0, 0F); - - } - - public void render(float f, float f1, float f2, float f3, float f4, float f5) - { - glow1.render(f5); - } - - public void setRotationAngles(float f, float f1, float f2, float f3, float f4, float f5) - { - //super.setRotationAngles(f, f1, f2, f3, f4, f5); - } - - //fields - public ModelRenderer glow1; - -} diff --git a/src/main/java/twilightforest/client/model/ModelTFTowerBoss.java b/src/main/java/twilightforest/client/model/ModelTFTowerBoss.java deleted file mode 100644 index 76c7182123..0000000000 --- a/src/main/java/twilightforest/client/model/ModelTFTowerBoss.java +++ /dev/null @@ -1,176 +0,0 @@ -package twilightforest.client.model; - -import java.util.Random; - -import net.minecraft.client.model.ModelRenderer; -import net.minecraft.entity.Entity; -import net.minecraft.util.MathHelper; - -public class ModelTFTowerBoss extends ModelTFGhast { - - protected ModelRenderer[][] subTentacles; - protected ModelRenderer[][] smallTentacles; - - public ModelTFTowerBoss() - { - super(); - - this.smallTentacles = new ModelRenderer[2][3]; - for (int i = 0; i < this.smallTentacles.length; ++i) - { - makeSmallTentacle(i); - } - } - - protected void makeTentacle(byte yOffset, Random random, int num) { - this.tentacles[num] = new ModelRenderer(this, num % 3, 0); - - int length = 5; - - this.tentacles[num].addBox(-1.5F, 0.0F, -1.5F, 3, length, 3); - - - if (num == 0) - { - this.tentacles[num].rotationPointX = 4.5F; - this.tentacles[num].rotationPointZ = 4.5F; - this.tentacles[num].rotationPointY = (float)(23 + yOffset); - } - if (num == 1) - { - this.tentacles[num].rotationPointX = -4.5F; - this.tentacles[num].rotationPointZ = 4.5F; - this.tentacles[num].rotationPointY = (float)(23 + yOffset); - } - if (num == 2) - { - this.tentacles[num].rotationPointX = 0F; - this.tentacles[num].rotationPointZ = 0F; - this.tentacles[num].rotationPointY = (float)(23 + yOffset); - } - if (num == 3) - { - this.tentacles[num].rotationPointX = 5.5F; - this.tentacles[num].rotationPointZ = -4.5F; - this.tentacles[num].rotationPointY = (float)(23 + yOffset); - } - if (num == 4) - { - this.tentacles[num].rotationPointX = -5.5F; - this.tentacles[num].rotationPointZ = -4.5F; - this.tentacles[num].rotationPointY = (float)(23 + yOffset); - } - else if (num == 5) - { - this.tentacles[num].rotationPointX = -7.5F; - this.tentacles[num].rotationPointY = 3.5F; - this.tentacles[num].rotationPointZ = -1F; - - this.tentacles[num].rotateAngleZ = (float)Math.PI / 4.0F; - } - else if (num == 6) - { - this.tentacles[num].rotationPointX = -7.5F; - this.tentacles[num].rotationPointY = -1.5F; - this.tentacles[num].rotationPointZ = 3.5F; - - this.tentacles[num].rotateAngleZ = (float)Math.PI / 3.0F; - } - else if (num == 7) - { - this.tentacles[num].rotationPointX = 7.5F; - this.tentacles[num].rotationPointY = 3.5F; - this.tentacles[num].rotationPointZ = -1F; - - this.tentacles[num].rotateAngleZ = -(float)Math.PI / 4.0F; - } - else if (num == 8) - { - this.tentacles[num].rotationPointX = 7.5F; - this.tentacles[num].rotationPointY = -1.5F; - this.tentacles[num].rotationPointZ = 3.5F; - - this.tentacles[num].rotateAngleZ = -(float)Math.PI / 3.0F; - } - - // goofy mid-method initializer - if (this.subTentacles == null) - { - this.subTentacles = new ModelRenderer[tentacles.length][3]; - } - - for (int i = 0; i < 3; i++) - { - length = 4; - - this.subTentacles[num][i] = new ModelRenderer(this, num % 4, (i * 5) - 1); - - this.subTentacles[num][i].addBox(-1.5F, -0.5F, -1.5F, 3, length, 3); - this.subTentacles[num][i].rotationPointX = 0; - this.subTentacles[num][i].rotationPointZ = 0; - this.subTentacles[num][i].rotationPointY = length; - - if (i == 0) - { - this.tentacles[num].addChild(this.subTentacles[num][i]); - } - else - { - this.subTentacles[num][i - 1].addChild(this.subTentacles[num][i]); - } - } - - this.body.addChild(this.tentacles[num]); - - } - - - /** - * Make one of the small tentacles - * @param i - */ - protected void makeSmallTentacle(int num) - { - ; - } - - /** - * Sets the model's various rotation angles. For bipeds, par1 and par2 are used for animating the movement of arms - * and legs, where par1 represents the time(so that arms and legs swing back and forth) and par2 represents how - * "far" arms and legs can swing at most. - */ - public void setRotationAngles(float par1, float par2, float timeAlive, float yaw, float pitch, float par6, Entity par7Entity) - { - super.setRotationAngles(par1, par2, timeAlive, yaw, pitch, par6, par7Entity); - - // wave tentacles - for (int i = 0; i < this.subTentacles.length; ++i) - { -// for (int j = 0; j < this.subTentacles[i].length; ++j) -// { -// this.subTentacles[i][j].rotateAngleX = 0.8F * MathHelper.sin(i * 2.3F) + 0.3F * MathHelper.sin(j) + 0.2F; -// -// } - - float wiggle = Math.min(par2, 0.6F); - - float time = (timeAlive + (i * 9)) / 2.0F; - - this.subTentacles[i][0].rotateAngleX = (MathHelper.cos(time * 0.6662F) * 1.0F - (float)Math.PI / 3.0F) * wiggle; - this.subTentacles[i][1].rotateAngleX = MathHelper.cos(time * 0.7774F) * 1.2F * wiggle; - this.subTentacles[i][2].rotateAngleX = MathHelper.cos(time * 0.8886F + (float)Math.PI / 2.0F) * 1.4F * wiggle; - - this.subTentacles[i][0].rotateAngleX = 0.2F + MathHelper.cos(time * 0.3335F) * 0.15F; - this.subTentacles[i][1].rotateAngleX = 0.1F + MathHelper.cos(time * 0.4445F) * 0.20F; - this.subTentacles[i][2].rotateAngleX = 0.1F + MathHelper.cos(time * 0.5555F) * 0.25F; - - - - float yTwist = 0.4F; - - this.tentacles[i].rotateAngleY = yTwist * MathHelper.sin(time * 0.3F); - - } - } - -} diff --git a/src/main/java/twilightforest/client/model/ModelTFTowerGolem.java b/src/main/java/twilightforest/client/model/ModelTFTowerGolem.java deleted file mode 100644 index 7a5c2f6fd0..0000000000 --- a/src/main/java/twilightforest/client/model/ModelTFTowerGolem.java +++ /dev/null @@ -1,158 +0,0 @@ -package twilightforest.client.model; - -import net.minecraft.client.model.ModelBase; -import net.minecraft.client.model.ModelRenderer; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.util.MathHelper; -import twilightforest.entity.EntityTFTowerGolem; - -//Date: 3/9/2013 10:55:38 AM -//Template version 1.1 -//Java generated by Techne -//Keep in mind that you still need to fill in some blanks -//- ZeuX - - -public class ModelTFTowerGolem extends ModelBase -{ - //fields - ModelRenderer head; - ModelRenderer jaw; - ModelRenderer body; - ModelRenderer rightarm; - ModelRenderer leftarm; - ModelRenderer leftleg; - ModelRenderer leftfoot; - ModelRenderer ribs; - ModelRenderer hips; - ModelRenderer rightfoot; - ModelRenderer rightleg; - ModelRenderer spine; - - public ModelTFTowerGolem() - { - textureWidth = 128; - textureHeight = 64; - - head = new ModelRenderer(this, 0, 0); - head.setRotationPoint(0F, -11F, -2F); - head.setTextureOffset(0, 0).addBox(-3.5F, -10F, -3F, 7, 8, 6); // head - head.setTextureOffset(0, 14).addBox(-4F, -6F, -3.5F, 8, 4, 6); // jaw - - body = new ModelRenderer(this, 0, 26); - body.addBox(-8F, 0F, -5F, 16, 10, 10); - body.setRotationPoint(0F, -13F, 0F); - - ribs = new ModelRenderer(this, 0, 46); - ribs.addBox(-5F, 0F, -3F, 10, 6, 6); - ribs.setRotationPoint(0F, -3F, 0F); - - rightarm = new ModelRenderer(this, 52, 0); - rightarm.setRotationPoint(-8F, -12F, 0F); - rightarm.setTextureOffset(52, 0).addBox(-5F, -2F, -1.5F, 3, 14, 3); // arm - rightarm.setTextureOffset(52, 17).addBox(-7F, 12F, -3F, 6, 12, 6); // fist - rightarm.setTextureOffset(52, 36).addBox(-7F, -3F, -3.5F, 7, 2, 7); // shoulder top - rightarm.setTextureOffset(52, 45).addBox(-7F, -1F, -3.5F, 7, 5, 2); // shoulder front - rightarm.setTextureOffset(52, 45).addBox(-7F, -1F, 1.5F, 7, 5, 2); // shoulder back - rightarm.setTextureOffset(52, 54).addBox(-2F, -1F, -2F, 2, 5, 3); // shoulder inner - - leftarm = new ModelRenderer(this, 52, 0); - leftarm.mirror = true; - leftarm.setRotationPoint(8F, -12F, 0F); - leftarm.setTextureOffset(52, 0).addBox(2F, -2F, -1.5F, 3, 14, 3); // arm - leftarm.setTextureOffset(52, 17).addBox(1F, 12F, -3F, 6, 12, 6); // fist - leftarm.setTextureOffset(52, 36).addBox(0F, -3F, -3.5F, 7, 2, 7); // shoulder top - leftarm.setTextureOffset(52, 45).addBox(0F, -1F, -3.5F, 7, 5, 2); // shoulder front - leftarm.setTextureOffset(52, 45).addBox(0F, -1F, 1.5F, 7, 5, 2); // shoulder back - leftarm.setTextureOffset(52, 54).addBox(0F, -1F, -2F, 2, 5, 3); // shoulder inner - - hips = new ModelRenderer(this, 84, 25); - hips.addBox(-5F, 0F, -2F, 10, 3, 4); - hips.setRotationPoint(0F, 1F, 0F); - - spine = new ModelRenderer(this, 84, 18); - spine.addBox(-1.5F, 0F, -1.5F, 3, 4, 3); - spine.setRotationPoint(0F, -3F, 0F); - - leftleg = new ModelRenderer(this, 84, 32); - leftleg.mirror = true; - leftleg.setRotationPoint(1F, 2F, 0F); - leftleg.setTextureOffset(84, 32).addBox(0F, 0F, -1.5F, 3, 8, 3); - leftleg.setTextureOffset(84, 43).addBox(-0.5F, 8F, -4F, 6, 14, 7); - - rightleg = new ModelRenderer(this, 84, 32); - rightleg.setRotationPoint(-1F, 2F, 0F); - rightleg.setTextureOffset(84, 32).addBox(-3F, 0F, -1.5F, 3, 8, 3); - rightleg.setTextureOffset(84, 43).addBox(-5.5F, 8F, -4F, 6, 14, 7); - - } - - - public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) - { - //super.render(entity, f, f1, f2, f3, f4, f5); - setRotationAngles(f, f1, f2, f3, f4, f5, entity); - head.render(f5); - body.render(f5); - rightarm.render(f5); - leftarm.render(f5); - rightleg.render(f5); - leftleg.render(f5); - ribs.render(f5); - hips.render(f5); - spine.render(f5); - } - - /** - * Sets the model's various rotation angles. For bipeds, par1 and par2 are used for animating the movement of arms - * and legs, where par1 represents the time(so that arms and legs swing back and forth) and par2 represents how - * "far" arms and legs can swing at most. - */ - public void setRotationAngles(float par1, float par2, float par3, float par4, float par5, float par6, Entity par7Entity) - { - this.head.rotateAngleY = par4 / (180F / (float)Math.PI); - this.head.rotateAngleX = par5 / (180F / (float)Math.PI); - this.leftleg.rotateAngleX = -1.5F * this.func_78172_a(par1, 13.0F) * par2; - this.rightleg.rotateAngleX = 1.5F * this.func_78172_a(par1, 13.0F) * par2; - this.leftleg.rotateAngleY = 0.0F; - this.rightleg.rotateAngleY = 0.0F; - -// this.leftleg.rotateAngleX = MathHelper.cos(par1 * 0.6662F) * 1.4F * par2; // biped leg movement -// this.rightleg.rotateAngleX = MathHelper.cos(par1 * 0.6662F + (float)Math.PI) * 1.4F * par2; - - - this.rightarm.rotateAngleZ = MathHelper.cos(par3 * 0.09F) * 0.05F + 0.05F; - this.leftarm.rotateAngleZ = -MathHelper.cos(par3 * 0.09F) * 0.05F - 0.05F; - - } - - - - - /** - * Used for easily adding entity-dependent animations. The second and third float params here are the same second - * and third as in the setRotationAngles method. - */ - public void setLivingAnimations(EntityLivingBase par1EntityLiving, float par2, float par3, float par4) - { - EntityTFTowerGolem var5 = (EntityTFTowerGolem)par1EntityLiving; - int var6 = var5.getAttackTimer(); - - if (var6 > 0) - { - this.rightarm.rotateAngleX = -2.0F + 1.5F * this.func_78172_a((float)var6 - par4, 10.0F); - this.leftarm.rotateAngleX = -2.0F + 1.5F * this.func_78172_a((float)var6 - par4, 10.0F); - } - else - { - this.rightarm.rotateAngleX = (-0.2F + 1.5F * this.func_78172_a(par2, 25.0F)) * par3; - this.leftarm.rotateAngleX = (-0.2F - 1.5F * this.func_78172_a(par2, 25.0F)) * par3; - } - } - - private float func_78172_a(float par1, float par2) - { - return (Math.abs(par1 % par2 - par2 * 0.5F) - par2 * 0.25F) / (par2 * 0.25F); - } -} diff --git a/src/main/java/twilightforest/client/model/ModelTFTroll.java b/src/main/java/twilightforest/client/model/ModelTFTroll.java deleted file mode 100644 index 7738d53392..0000000000 --- a/src/main/java/twilightforest/client/model/ModelTFTroll.java +++ /dev/null @@ -1,129 +0,0 @@ -package twilightforest.client.model; - -import twilightforest.entity.EntityTFTroll; -import net.minecraft.client.model.ModelBiped; -import net.minecraft.client.model.ModelRenderer; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.util.MathHelper; - -public class ModelTFTroll extends ModelBiped { - - public ModelRenderer nose; - - - public ModelTFTroll() - { - super(); - - this.textureWidth = 128; - this.textureHeight = 64; - - this.bipedHead = new ModelRenderer(this, 0, 0); - this.bipedHead.addBox(-5.0F, -8.0F, -3.0F, 10, 10, 10); - this.bipedHead.setRotationPoint(0.0F, -9.0F, -6.0F); - - this.bipedHeadwear = new ModelRenderer(this, 32, 0); - this.bipedHeadwear.addBox(-4.0F, -8.0F, -4.0F, 0, 0, 0); - - this.bipedBody = new ModelRenderer(this, 40, 0); - this.bipedBody.addBox(-8.0F, 0.0F, -5.0F, 16, 26, 10); - this.bipedBody.setRotationPoint(0.0F, -14.0F, 0.0F); - - - this.nose = new ModelRenderer(this, 0, 21); - this.nose.addBox(-2.0F, -2.0F, -2.0F, 4, 8, 4); - this.nose.setRotationPoint(0.0F, -2.0F, -4.0F); - this.bipedHead.addChild(nose); - - this.bipedRightArm = new ModelRenderer(this, 32, 36); - this.bipedRightArm.addBox(-5.0F, -2.0F, -3.0F, 6, 22, 6); - this.bipedRightArm.setRotationPoint(-9.0F, -9.0F, 0.0F); - - this.bipedLeftArm = new ModelRenderer(this, 32, 36); - this.bipedLeftArm.mirror = true; - this.bipedLeftArm.addBox(-1.0F, -2.0F, -3.0F, 6, 22, 6); - this.bipedLeftArm.setRotationPoint(9.0F, -9.0F, 0.0F); - - - this.bipedRightLeg = new ModelRenderer(this, 0, 44); - this.bipedRightLeg.addBox(-3.0F, 0.0F, -4.0F, 6, 12, 8); - this.bipedRightLeg.setRotationPoint(-5.0F, 12.0F, 0.0F); - - this.bipedLeftLeg = new ModelRenderer(this, 0, 44); - this.bipedLeftLeg.mirror = true; - this.bipedLeftLeg.addBox(-3.0F, 0.0F, -4.0F, 6, 12, 8); - this.bipedLeftLeg.setRotationPoint(5.0F, 12.0F, 0.0F); - } - - - /** - * Sets the model's various rotation angles. For bipeds, par1 and par2 are used for animating the movement of arms - * and legs, where par1 represents the time(so that arms and legs swing back and forth) and par2 represents how - * "far" arms and legs can swing at most. - */ - public void setRotationAngles(float par1, float par2, float par3, float par4, float par5, float par6, Entity par7Entity) - { - EntityTFTroll troll = (EntityTFTroll)par7Entity; - - this.bipedHead.rotateAngleY = par4 / (180F / (float)Math.PI); - this.bipedHead.rotateAngleX = par5 / (180F / (float)Math.PI); - this.bipedHeadwear.rotateAngleY = this.bipedHead.rotateAngleY; - this.bipedHeadwear.rotateAngleX = this.bipedHead.rotateAngleX; - this.bipedRightArm.rotateAngleX = MathHelper.cos(par1 * 0.6662F + (float)Math.PI) * 2.0F * par2 * 0.5F; - this.bipedLeftArm.rotateAngleX = MathHelper.cos(par1 * 0.6662F) * 2.0F * par2 * 0.5F; - this.bipedRightArm.rotateAngleZ = 0.0F; - this.bipedLeftArm.rotateAngleZ = 0.0F; - this.bipedRightLeg.rotateAngleX = MathHelper.cos(par1 * 0.6662F) * 1.4F * par2; - this.bipedLeftLeg.rotateAngleX = MathHelper.cos(par1 * 0.6662F + (float)Math.PI) * 1.4F * par2; - this.bipedRightLeg.rotateAngleY = 0.0F; - this.bipedLeftLeg.rotateAngleY = 0.0F; - - if (par7Entity.riddenByEntity != null) - { - // arms up! - this.bipedRightArm.rotateAngleX += Math.PI; - this.bipedLeftArm.rotateAngleX += Math.PI; - - } - - if (this.heldItemLeft != 0 || this.heldItemRight != 0) { - this.bipedRightArm.rotateAngleX += Math.PI; - this.bipedLeftArm.rotateAngleX += Math.PI; - } - - if (this.onGround > 0F) { - float swing = 1.0F - this.onGround; - - this.bipedRightArm.rotateAngleX -= (Math.PI * swing); - this.bipedLeftArm.rotateAngleX -= (Math.PI * swing); - } - - this.bipedRightArm.rotateAngleY = 0.0F; - this.bipedLeftArm.rotateAngleY = 0.0F; - - - this.bipedRightArm.rotateAngleZ += MathHelper.cos(par3 * 0.09F) * 0.05F + 0.05F; - this.bipedLeftArm.rotateAngleZ -= MathHelper.cos(par3 * 0.09F) * 0.05F + 0.05F; - this.bipedRightArm.rotateAngleX += MathHelper.sin(par3 * 0.067F) * 0.05F; - this.bipedLeftArm.rotateAngleX -= MathHelper.sin(par3 * 0.067F) * 0.05F; - - } - - /** - * Change eye color if yeti is angry - */ - @Override - public void setLivingAnimations(EntityLivingBase par1EntityLivingBase, float par2, float par3, float par4) { - EntityTFTroll troll = (EntityTFTroll)par1EntityLivingBase; - - if (troll.getAttackTarget() != null) { - this.bipedRightArm.rotateAngleX += Math.PI; - this.bipedLeftArm.rotateAngleX += Math.PI; - } - - } - - - -} diff --git a/src/main/java/twilightforest/client/model/ModelTFWraith.java b/src/main/java/twilightforest/client/model/ModelTFWraith.java deleted file mode 100644 index a3563168b1..0000000000 --- a/src/main/java/twilightforest/client/model/ModelTFWraith.java +++ /dev/null @@ -1,61 +0,0 @@ -package twilightforest.client.model; - -import net.minecraft.client.model.ModelBiped; -import net.minecraft.client.model.ModelRenderer; -import net.minecraft.entity.Entity; -import net.minecraft.util.MathHelper; - - -public class ModelTFWraith extends ModelBiped { - - public ModelRenderer dress; - - public ModelTFWraith() { - float f = 0.0F; - dress = new ModelRenderer(this, 40, 16); - dress.addBox(-4F, 12.0F, -2F, 8, 12, 4, f); - dress.setRotationPoint(0.0F, 0.0F, 0.0F); - - } - - public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) - { - setRotationAngles(f, f1, f2, f3, f4, f5, entity); - bipedHead.render(f5); - bipedBody.render(f5); - bipedRightArm.render(f5); - bipedLeftArm.render(f5); - - dress.render(f5); - - //bipedRightLeg.render(f5); - //bipedLeftLeg.render(f5); - bipedHeadwear.render(f5); - } - - /** - * Sets the model's various rotation angles. For bipeds, par1 and par2 are used for animating the movement of arms - * and legs, where par1 represents the time(so that arms and legs swing back and forth) and par2 represents how - * "far" arms and legs can swing at most. - */ - public void setRotationAngles(float par1, float par2, float par3, float par4, float par5, float par6, Entity par7Entity) - { - super.setRotationAngles(par1, par2, par3, par4, par5, par6, par7Entity); - float var8 = MathHelper.sin(this.onGround * (float)Math.PI); - float var9 = MathHelper.sin((1.0F - (1.0F - this.onGround) * (1.0F - this.onGround)) * (float)Math.PI); - this.bipedRightArm.rotateAngleZ = 0.0F; - this.bipedLeftArm.rotateAngleZ = 0.0F; - this.bipedRightArm.rotateAngleY = -(0.1F - var8 * 0.6F); - this.bipedLeftArm.rotateAngleY = 0.1F - var8 * 0.6F; - this.bipedRightArm.rotateAngleX = -((float)Math.PI / 2F); - this.bipedLeftArm.rotateAngleX = -((float)Math.PI / 2F); - this.bipedRightArm.rotateAngleX -= var8 * 1.2F - var9 * 0.4F; - this.bipedLeftArm.rotateAngleX -= var8 * 1.2F - var9 * 0.4F; - this.bipedRightArm.rotateAngleZ += MathHelper.cos(par3 * 0.09F) * 0.05F + 0.05F; - this.bipedLeftArm.rotateAngleZ -= MathHelper.cos(par3 * 0.09F) * 0.05F + 0.05F; - this.bipedRightArm.rotateAngleX += MathHelper.sin(par3 * 0.067F) * 0.05F; - this.bipedLeftArm.rotateAngleX -= MathHelper.sin(par3 * 0.067F) * 0.05F; - } - - -} diff --git a/src/main/java/twilightforest/client/model/ModelTFYeti.java b/src/main/java/twilightforest/client/model/ModelTFYeti.java deleted file mode 100644 index 6fe806a4fb..0000000000 --- a/src/main/java/twilightforest/client/model/ModelTFYeti.java +++ /dev/null @@ -1,171 +0,0 @@ -package twilightforest.client.model; - -import net.minecraft.client.model.ModelBiped; -import net.minecraft.client.model.ModelRenderer; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.util.MathHelper; -import twilightforest.entity.EntityTFYeti; - -public class ModelTFYeti extends ModelBiped { - - public ModelRenderer mouth; - public ModelRenderer leftEye; - public ModelRenderer rightEye; - public ModelRenderer angryLeftEye; - public ModelRenderer angryRightEye; - - - public ModelTFYeti() - { - super(); - - this.textureWidth = 128; - this.textureHeight = 64; - - this.bipedHead = new ModelRenderer(this, 0, 0); - this.bipedHead.addBox(-4.0F, -8.0F, -4.0F, 0, 0, 0); - this.bipedHeadwear = new ModelRenderer(this, 32, 0); - this.bipedHeadwear.addBox(-4.0F, -8.0F, -4.0F, 0, 0, 0); - - this.bipedBody = new ModelRenderer(this, 32, 0); - this.bipedBody.addBox(-10.0F, 0.0F, -6.0F, 20, 26, 12); - this.bipedBody.setRotationPoint(0.0F, -14.0F, 0.0F); - - - this.mouth = new ModelRenderer(this, 96, 6); - this.mouth.addBox(-7.0F, -5.0F, -0.5F, 14, 10, 1); - this.mouth.setRotationPoint(0.0F, 12.0F, -6.0F); - this.bipedBody.addChild(mouth); - - this.rightEye = new ModelRenderer(this, 96, 0); - this.rightEye.addBox(-2.5F, -2.5F, -0.5F, 5, 5, 1); - this.rightEye.setRotationPoint(-5.5F, 4.5F, -6.0F); - this.bipedBody.addChild(rightEye); - - this.leftEye = new ModelRenderer(this, 96, 0); - this.leftEye.addBox(-2.5F, -2.5F, -0.5F, 5, 5, 1); - this.leftEye.setRotationPoint(5.5F, 4.5F, -6.0F); - this.bipedBody.addChild(leftEye); - - this.angryRightEye = new ModelRenderer(this, 109, 0); - this.angryRightEye.addBox(-2.5F, -2.5F, -0.5F, 5, 5, 1); - this.angryRightEye.setRotationPoint(5.5F, 4.5F, -6.0F); - this.bipedBody.addChild(angryRightEye); - - this.angryLeftEye = new ModelRenderer(this, 109, 0); - this.angryLeftEye.addBox(-2.5F, -2.5F, -0.5F, 5, 5, 1); - this.angryLeftEye.setRotationPoint(-5.5F, 4.5F, -6.0F); - this.bipedBody.addChild(angryLeftEye); - - this.bipedRightArm = new ModelRenderer(this, 0, 0); - this.bipedRightArm.addBox(-5.0F, -2.0F, -3.0F, 6, 16, 6); - this.bipedRightArm.setRotationPoint(-11.0F, -4.0F, 0.0F); - this.bipedLeftArm = new ModelRenderer(this, 0, 0); - this.bipedLeftArm.mirror = true; - this.bipedLeftArm.addBox(-1.0F, -2.0F, -3.0F, 6, 16, 6); - this.bipedLeftArm.setRotationPoint(11.0F, -4.0F, 0.0F); - this.bipedRightLeg = new ModelRenderer(this, 0, 22); - this.bipedRightLeg.addBox(-4.0F, 0.0F, -4.0F, 8, 12, 8); - this.bipedRightLeg.setRotationPoint(-6.0F, 12.0F, 0.0F); - this.bipedLeftLeg = new ModelRenderer(this, 0, 22); - this.bipedLeftLeg.mirror = true; - this.bipedLeftLeg.addBox(-4.0F, 0.0F, -4.0F, 8, 12, 8); - this.bipedLeftLeg.setRotationPoint(6.0F, 12.0F, 0.0F); - } - - - /** - * Sets the model's various rotation angles. For bipeds, par1 and par2 are used for animating the movement of arms - * and legs, where par1 represents the time(so that arms and legs swing back and forth) and par2 represents how - * "far" arms and legs can swing at most. - */ - public void setRotationAngles(float par1, float par2, float par3, float par4, float par5, float par6, Entity par7Entity) - { - EntityTFYeti yeti = (EntityTFYeti)par7Entity; - - - this.bipedHead.rotateAngleY = par4 / (180F / (float)Math.PI); - this.bipedHead.rotateAngleX = par5 / (180F / (float)Math.PI); - this.bipedHeadwear.rotateAngleY = this.bipedHead.rotateAngleY; - this.bipedHeadwear.rotateAngleX = this.bipedHead.rotateAngleX; - this.bipedRightArm.rotateAngleX = MathHelper.cos(par1 * 0.6662F + (float)Math.PI) * 2.0F * par2 * 0.5F; - this.bipedLeftArm.rotateAngleX = MathHelper.cos(par1 * 0.6662F) * 2.0F * par2 * 0.5F; - this.bipedRightArm.rotateAngleZ = 0.0F; - this.bipedLeftArm.rotateAngleZ = 0.0F; - this.bipedRightLeg.rotateAngleX = MathHelper.cos(par1 * 0.6662F) * 1.4F * par2; - this.bipedLeftLeg.rotateAngleX = MathHelper.cos(par1 * 0.6662F + (float)Math.PI) * 1.4F * par2; - this.bipedRightLeg.rotateAngleY = 0.0F; - this.bipedLeftLeg.rotateAngleY = 0.0F; - - if (par7Entity.riddenByEntity != null) - { - // arms up! - this.bipedRightArm.rotateAngleX += Math.PI; - this.bipedLeftArm.rotateAngleX += Math.PI; - - } - - if (this.heldItemLeft != 0) - { - this.bipedLeftArm.rotateAngleX = this.bipedLeftArm.rotateAngleX * 0.5F - ((float)Math.PI / 10F) * (float)this.heldItemLeft; - } - - if (this.heldItemRight != 0) - { - this.bipedRightArm.rotateAngleX = this.bipedRightArm.rotateAngleX * 0.5F - ((float)Math.PI / 10F) * (float)this.heldItemRight; - } - - this.bipedRightArm.rotateAngleY = 0.0F; - this.bipedLeftArm.rotateAngleY = 0.0F; - - - this.bipedRightArm.rotateAngleZ += MathHelper.cos(par3 * 0.09F) * 0.05F + 0.05F; - this.bipedLeftArm.rotateAngleZ -= MathHelper.cos(par3 * 0.09F) * 0.05F + 0.05F; - this.bipedRightArm.rotateAngleX += MathHelper.sin(par3 * 0.067F) * 0.05F; - this.bipedLeftArm.rotateAngleX -= MathHelper.sin(par3 * 0.067F) * 0.05F; - - - // if yeti is angry, hold arms forwards like a zombie - if (yeti.isAngry()) - { - float f6 = MathHelper.sin(this.onGround * (float)Math.PI); - float f7 = MathHelper.sin((1.0F - (1.0F - this.onGround) * (1.0F - this.onGround)) * (float)Math.PI); - this.bipedRightArm.rotateAngleZ = 0.0F; - this.bipedLeftArm.rotateAngleZ = 0.0F; - this.bipedRightArm.rotateAngleY = -(0.1F - f6 * 0.6F); - this.bipedLeftArm.rotateAngleY = 0.1F - f6 * 0.6F; - this.bipedRightArm.rotateAngleX = -((float)Math.PI / 2F); - this.bipedLeftArm.rotateAngleX = -((float)Math.PI / 2F); - this.bipedRightArm.rotateAngleX -= f6 * 1.2F - f7 * 0.4F; - this.bipedLeftArm.rotateAngleX -= f6 * 1.2F - f7 * 0.4F; - this.bipedRightArm.rotateAngleZ += MathHelper.cos(par3 * 0.09F) * 0.05F + 0.05F; - this.bipedLeftArm.rotateAngleZ -= MathHelper.cos(par3 * 0.09F) * 0.05F + 0.05F; - this.bipedRightArm.rotateAngleX += MathHelper.sin(par3 * 0.067F) * 0.05F; - this.bipedLeftArm.rotateAngleX -= MathHelper.sin(par3 * 0.067F) * 0.05F; - } - } - - /** - * Change eye color if yeti is angry - */ - @Override - public void setLivingAnimations(EntityLivingBase par1EntityLivingBase, float par2, float par3, float par4) { - EntityTFYeti yeti = (EntityTFYeti)par1EntityLivingBase; - - if (yeti.isAngry()) { - this.rightEye.isHidden = true; - this.leftEye.isHidden = true; - this.angryRightEye.isHidden = false; - this.angryLeftEye.isHidden = false; - } else { - this.rightEye.isHidden = false; - this.leftEye.isHidden = false; - this.angryRightEye.isHidden = true; - this.angryLeftEye.isHidden = true; - } - } - - - -} diff --git a/src/main/java/twilightforest/client/model/ModelTFYetiAlpha.java b/src/main/java/twilightforest/client/model/ModelTFYetiAlpha.java deleted file mode 100644 index cad170e6d2..0000000000 --- a/src/main/java/twilightforest/client/model/ModelTFYetiAlpha.java +++ /dev/null @@ -1,223 +0,0 @@ -package twilightforest.client.model; - -import net.minecraft.client.model.ModelBiped; -import net.minecraft.client.model.ModelRenderer; -import net.minecraft.entity.Entity; -import net.minecraft.util.MathHelper; -import twilightforest.entity.boss.EntityTFYetiAlpha; - -public class ModelTFYetiAlpha extends ModelBiped { - - public ModelRenderer mouth; - public ModelRenderer leftEye; - public ModelRenderer rightEye; - - - - public ModelTFYetiAlpha() - { - super(); - - this.textureWidth = 256; - this.textureHeight = 128; - - this.bipedHead = new ModelRenderer(this, 0, 0); - this.bipedHead.addBox(-4.0F, -8.0F, -4.0F, 0, 0, 0); - - this.bipedHeadwear = new ModelRenderer(this, 32, 0); - this.bipedHeadwear.addBox(-4.0F, -8.0F, -4.0F, 0, 0, 0); - - this.bipedBody = new ModelRenderer(this, 80, 0); - this.bipedBody.addBox(-24.0F, -60.0F, -18.0F, 48, 72, 36); - this.bipedBody.setRotationPoint(0.0F, -6.0F, 0.0F); - - this.mouth = new ModelRenderer(this, 121, 50); - this.mouth.addBox(-17.0F, -7.0F, -1.5F, 34, 29, 2); - this.mouth.setRotationPoint(0.0F, -37.0F, -18.0F); - this.bipedBody.addChild(mouth); - - this.rightEye = new ModelRenderer(this, 64, 0); - this.rightEye.addBox(-6.0F, -6.0F, -1.5F, 12, 12, 2); - this.rightEye.setRotationPoint(-14.0F, -50.0F, -18.0F); - this.bipedBody.addChild(rightEye); - - this.leftEye = new ModelRenderer(this, 64, 0); - this.leftEye.addBox(-6.0F, -6.0F, -1.5F, 12, 12, 2); - this.leftEye.setRotationPoint(14.0F, -50.0F, -18.0F); - this.bipedBody.addChild(leftEye); - - this.bipedRightArm = new ModelRenderer(this, 0, 0); - this.bipedRightArm.addBox(-15.0F, -6.0F, -8.0F, 16, 48, 16); - this.bipedRightArm.setRotationPoint(-25.0F, -26.0F, 0.0F); - - this.bipedBody.addChild(this.bipedRightArm); - - this.bipedLeftArm = new ModelRenderer(this, 0, 0); - this.bipedLeftArm.mirror = true; - this.bipedLeftArm.addBox(-1.0F, -6.0F, -8.0F, 16, 48, 16); - this.bipedLeftArm.setRotationPoint(25.0F, -26.0F, 0.0F); - - this.bipedBody.addChild(this.bipedLeftArm); - - - this.bipedRightLeg = new ModelRenderer(this, 0, 66); - this.bipedRightLeg.addBox(-10.0F, 0.0F, -10.0F, 20, 20, 20); - this.bipedRightLeg.setRotationPoint(-13.5F, 4.0F, 0.0F); - - this.bipedLeftLeg = new ModelRenderer(this, 0, 66); - this.bipedLeftLeg.mirror = true; - this.bipedLeftLeg.addBox(-10.0F, 0.0F, -10.0F, 20, 20, 20); - this.bipedLeftLeg.setRotationPoint(13.5F, 4.0F, 0.0F); - - addPairHorns(-58.0F, 35F); - addPairHorns(-46.0F, 15F); - addPairHorns(-36.0F, -5F); - - - } - - - /** - * Add a pair of horns - */ - private void addPairHorns(float height, float zangle) { - ModelRenderer horn1a; - ModelRenderer horn1b; - - horn1a = new ModelRenderer(this, 0, 108); - horn1a.addBox(-9.0F, -5.0F, -5.0F, 10, 10, 10); - horn1a.setRotationPoint(-24.0F, height, -8.0F); - horn1a.rotateAngleY = -30F / (180F / (float)Math.PI); - horn1a.rotateAngleZ = zangle / (180F / (float)Math.PI); - this.bipedBody.addChild(horn1a); - - horn1b = new ModelRenderer(this, 40, 108); - horn1b.addBox(-14.0F, -4.0F, -4.0F, 18, 8, 8); - horn1b.setRotationPoint(-8.0F, 0.0F, 0.0F); - horn1b.rotateAngleY = -20F / (180F / (float)Math.PI); - horn1b.rotateAngleZ = zangle / (180F / (float)Math.PI); - horn1a.addChild(horn1b); - - ModelRenderer horn2a; - ModelRenderer horn2b; - - horn2a = new ModelRenderer(this, 0, 108); - horn2a.addBox(-1.0F, -5.0F, -5.0F, 10, 10, 10); - horn2a.setRotationPoint(24.0F, height, 0.0F); - horn2a.rotateAngleY = 30F / (180F / (float)Math.PI); - horn2a.rotateAngleZ = -zangle / (180F / (float)Math.PI); - this.bipedBody.addChild(horn2a); - - horn2b = new ModelRenderer(this, 40, 108); - horn2b.addBox(-2.0F, -4.0F, -4.0F, 18, 8, 8); - horn2b.setRotationPoint(8.0F, 0.0F, 0.0F); - horn2b.rotateAngleY = 20F / (180F / (float)Math.PI); - horn2b.rotateAngleZ = -zangle / (180F / (float)Math.PI); - horn2a.addChild(horn2b); - } - - - /** - * Sets the models various rotation angles then renders the model. - */ - public void render(Entity par1Entity, float par2, float par3, float par4, float par5, float par6, float par7) - { - this.setRotationAngles(par2, par3, par4, par5, par6, par7, par1Entity); - - this.bipedBody.render(par7); - this.bipedRightLeg.render(par7); - this.bipedLeftLeg.render(par7); - } - - /** - * Sets the model's various rotation angles. For bipeds, par1 and par2 are used for animating the movement of arms - * and legs, where par1 represents the time(so that arms and legs swing back and forth) and par2 represents how - * "far" arms and legs can swing at most. - */ - public void setRotationAngles(float par1, float par2, float par3, float par4, float par5, float par6, Entity par7Entity) - { - EntityTFYetiAlpha yeti = (EntityTFYetiAlpha)par7Entity; - - - this.bipedHead.rotateAngleY = par4 / (180F / (float)Math.PI); - this.bipedHead.rotateAngleX = par5 / (180F / (float)Math.PI); - - this.bipedBody.rotateAngleX = par5 / (180F / (float)Math.PI); - - - this.bipedRightLeg.rotateAngleX = MathHelper.cos(par1 * 0.6662F) * 1.4F * par2; - this.bipedLeftLeg.rotateAngleX = MathHelper.cos(par1 * 0.6662F + (float)Math.PI) * 1.4F * par2; - this.bipedRightLeg.rotateAngleY = 0.0F; - this.bipedLeftLeg.rotateAngleY = 0.0F; - - float f6 = MathHelper.sin(this.onGround * (float)Math.PI); - float f7 = MathHelper.sin((1.0F - (1.0F - this.onGround) * (1.0F - this.onGround)) * (float)Math.PI); - this.bipedRightArm.rotateAngleZ = 0.0F; - this.bipedLeftArm.rotateAngleZ = 0.0F; - this.bipedRightArm.rotateAngleY = -(0.1F - f6 * 0.6F); - this.bipedLeftArm.rotateAngleY = 0.1F - f6 * 0.6F; - this.bipedRightArm.rotateAngleX = -((float)Math.PI / 2F); - this.bipedLeftArm.rotateAngleX = -((float)Math.PI / 2F); - this.bipedRightArm.rotateAngleX -= f6 * 1.2F - f7 * 0.4F; - this.bipedLeftArm.rotateAngleX -= f6 * 1.2F - f7 * 0.4F; - this.bipedRightArm.rotateAngleZ += MathHelper.cos(par3 * 0.09F) * 0.05F + 0.05F; - this.bipedLeftArm.rotateAngleZ -= MathHelper.cos(par3 * 0.09F) * 0.05F + 0.05F; - this.bipedRightArm.rotateAngleX += MathHelper.sin(par3 * 0.067F) * 0.05F; - this.bipedLeftArm.rotateAngleX -= MathHelper.sin(par3 * 0.067F) * 0.05F; - - this.bipedBody.rotationPointY = -6F; - this.bipedRightLeg.rotationPointY = 4F; - this.bipedLeftLeg.rotationPointY = 4F; - - - if (yeti.isTired()) { - // arms down - this.bipedRightArm.rotateAngleX = MathHelper.cos(par1 * 0.6662F + (float)Math.PI) * 2.0F * par2 * 0.5F; - this.bipedLeftArm.rotateAngleX = MathHelper.cos(par1 * 0.6662F) * 2.0F * par2 * 0.5F; - this.bipedRightArm.rotateAngleZ = 0.0F; - this.bipedLeftArm.rotateAngleZ = 0.0F; - - // legs out - this.bipedRightArm.rotateAngleX += -((float)Math.PI / 5F); - this.bipedLeftArm.rotateAngleX += -((float)Math.PI / 5F); - this.bipedRightLeg.rotateAngleX = -((float)Math.PI * 2F / 5F); - this.bipedLeftLeg.rotateAngleX = -((float)Math.PI * 2F / 5F); - this.bipedRightLeg.rotateAngleY = ((float)Math.PI / 10F); - this.bipedLeftLeg.rotateAngleY = -((float)Math.PI / 10F); - - //body down - this.bipedBody.rotationPointY = 6F; - this.bipedRightLeg.rotationPointY = 12F; - this.bipedLeftLeg.rotationPointY = 12F; - } - - if (yeti.isRampaging()) { - // arms up - this.bipedRightArm.rotateAngleX = MathHelper.cos(par1 * 0.66F + (float)Math.PI) * 2.0F * par2 * 0.5F; - this.bipedLeftArm.rotateAngleX = MathHelper.cos(par1 * 0.66F) * 2.0F * par2 * 0.5F; - -// this.bipedRightArm.rotateAngleX = MathHelper.cos(par1 * 0.6662F) * 1.4F * par2; -// this.bipedLeftArm.rotateAngleX = MathHelper.cos(par1 * 0.6662F + (float)Math.PI) * 1.4F * par2; - - this.bipedRightArm.rotateAngleY += MathHelper.cos(par1 * 0.25F) * 0.5F + 0.5F; - this.bipedLeftArm.rotateAngleY -= MathHelper.cos(par1 * 0.25F) * 0.5F + 0.5F; - - this.bipedRightArm.rotateAngleX += Math.PI * 1.25; - this.bipedLeftArm.rotateAngleX += Math.PI * 1.25; - this.bipedRightArm.rotateAngleZ = 0.0F; - this.bipedLeftArm.rotateAngleZ = 0.0F; - } - - if (par7Entity.riddenByEntity != null) - { - // arms up! - this.bipedRightArm.rotateAngleX += Math.PI; - this.bipedLeftArm.rotateAngleX += Math.PI; - - } - - - } - - -} diff --git a/src/main/java/twilightforest/client/model/ModelTFYetiArmor.java b/src/main/java/twilightforest/client/model/ModelTFYetiArmor.java deleted file mode 100644 index 0d4b3e6591..0000000000 --- a/src/main/java/twilightforest/client/model/ModelTFYetiArmor.java +++ /dev/null @@ -1,202 +0,0 @@ -package twilightforest.client.model; - -import net.minecraft.client.model.ModelBiped; -import net.minecraft.client.model.ModelRenderer; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; - -public class ModelTFYetiArmor extends ModelBiped { - - private ModelRenderer bipedLegBody; - private ModelRenderer rightRuff; - private ModelRenderer leftRuff; - private ModelRenderer rightToe; - private ModelRenderer leftToe; - - - - public ModelTFYetiArmor(int part, float expand) - { - super(expand); - - //bigger head - this.bipedHead = new ModelRenderer(this, 0, 0); - this.bipedHead.addBox(-4.5F, -7.5F, -4.0F, 9, 8, 8, expand); - this.bipedHead.setRotationPoint(0.0F, 0.0F + expand, 0.0F); - - // add horns - addPairHorns(-8.0F, 35F); - addPairHorns(-6.0F, 15F); - addPairHorns(-4.0F, -5F); - - - // change leg texture - this.bipedRightLeg = new ModelRenderer(this, 40, 0); - this.bipedRightLeg.addBox(-2.0F, 0.0F, -2.0F, 4, 12, 4, expand); - this.bipedRightLeg.setRotationPoint(-1.9F, 12.0F + 0.0F, 0.0F); - - this.bipedLeftLeg = new ModelRenderer(this, 40, 0); - this.bipedLeftLeg.mirror = true; - this.bipedLeftLeg.addBox(-2.0F, 0.0F, -2.0F, 4, 12, 4, expand); - this.bipedLeftLeg.setRotationPoint(1.9F, 12.0F + 0.0F, 0.0F); - - rightRuff = new ModelRenderer(this, 40, 22); - rightRuff.addBox(-2.5F, 0.0F, -2.5F, 5, 2, 5, expand); - rightRuff.setRotationPoint(0.0F, 6.0F, 0.0F); - this.bipedRightLeg.addChild(rightRuff); - - leftRuff = new ModelRenderer(this, 40, 22); - leftRuff.addBox(-2.5F, 0.0F, -2.5F, 5, 2, 5, expand); - leftRuff.setRotationPoint(0.0F, 6.0F, 0.0F); - this.bipedLeftLeg.addChild(leftRuff); - - rightToe = new ModelRenderer(this, 40, 17); - rightToe.addBox(-2.0F, 0.0F, -1.0F, 4, 2, 1, expand); - rightToe.setRotationPoint(0.0F, 10.0F, -2.0F); - this.bipedRightLeg.addChild(rightToe); - - leftToe = new ModelRenderer(this, 40, 17); - leftToe.addBox(-2.0F, 0.0F, -1.0F, 4, 2, 1, expand); - leftToe.setRotationPoint(0.0F, 10.0F, -2.0F); - this.bipedLeftLeg.addChild(leftToe); - - // stuff for chest and legs - this.bipedBody = new ModelRenderer(this, 0, 0); - this.bipedBody.addBox(-4.0F, 0.0F, -2.0F, 8, 11, 4, expand); - this.bipedBody.setRotationPoint(0.0F, 0.0F + 0.0f, 0.0F); - - this.bipedLegBody = new ModelRenderer(this, 40, 16); - this.bipedLegBody.addBox(-4.0F, 0.0F, -2.0F, 8, 12, 4, expand); - this.bipedLegBody.setRotationPoint(0.0F, 0.0F + 0.0f, 0.0F); - - this.bipedRightArm = new ModelRenderer(this, 0, 16); - this.bipedRightArm.addBox(-3.0F, -2.0F, -2.0F, 4, 10, 4, expand); - this.bipedRightArm.setRotationPoint(-5.0F, 2.0F + 0.0f, 0.0F); - - this.bipedLeftArm = new ModelRenderer(this, 0, 16); - this.bipedLeftArm.mirror = true; - this.bipedLeftArm.addBox(-1.0F, -2.0F, -2.0F, 4, 10, 4, expand); - this.bipedLeftArm.setRotationPoint(5.0F, 2.0F + 0.0f, 0.0F); - - - switch (part) - { - case 0: // helmet - this.bipedHead.showModel = true; - this.bipedHeadwear.showModel = false; - this.bipedBody.showModel = false; - this.bipedRightArm.showModel = false; - this.bipedLeftArm.showModel = false; - this.bipedLegBody.showModel = false; - this.bipedRightLeg.showModel = false; - this.bipedLeftLeg.showModel = false; - break; - case 1: // chest - this.bipedHead.showModel = false; - this.bipedHeadwear.showModel = false; - this.bipedBody.showModel = true; - this.bipedRightArm.showModel = true; - this.bipedLeftArm.showModel = true; - this.bipedLegBody.showModel = false; - this.bipedRightLeg.showModel = false; - this.bipedLeftLeg.showModel = false; - break; - case 2: // pants - this.bipedHead.showModel = false; - this.bipedHeadwear.showModel = false; - this.bipedBody.showModel = false; - this.bipedRightArm.showModel = false; - this.bipedLeftArm.showModel = false; - this.bipedLegBody.showModel = true; - this.bipedRightLeg.showModel = true; - this.bipedLeftLeg.showModel = true; - this.leftRuff.showModel = false; - this.leftToe.showModel = false; - this.rightRuff.showModel = false; - this.rightToe.showModel = false; - break; - case 3: // boots - this.bipedHead.showModel = false; - this.bipedHeadwear.showModel = false; - this.bipedBody.showModel = false; - this.bipedRightArm.showModel = false; - this.bipedLeftArm.showModel = false; - this.bipedLegBody.showModel = false; - this.bipedRightLeg.showModel = true; - this.bipedLeftLeg.showModel = true; - this.leftRuff.showModel = true; - this.leftToe.showModel = true; - this.rightRuff.showModel = true; - this.rightToe.showModel = true; - break; - - } - } - - /** - * Add a pair of horns - */ - private void addPairHorns(float height, float zangle) { - ModelRenderer horn1a; - ModelRenderer horn1b; - - horn1a = new ModelRenderer(this, 0, 19); - horn1a.addBox(-3.0F, -1.5F, -1.5F, 3, 3, 3); - horn1a.setRotationPoint(-4.5F, height, -1.0F); - horn1a.rotateAngleY = -30F / (180F / (float)Math.PI); - horn1a.rotateAngleZ = zangle / (180F / (float)Math.PI); - this.bipedHead.addChild(horn1a); - - horn1b = new ModelRenderer(this, 0, 26); - horn1b.addBox(-4.0F, -1.0F, -1.0F, 5, 2, 2); - horn1b.setRotationPoint(-3.0F, 0.0F, 0.0F); - horn1b.rotateAngleY = -20F / (180F / (float)Math.PI); - horn1b.rotateAngleZ = zangle / (180F / (float)Math.PI); - horn1a.addChild(horn1b); - - ModelRenderer horn2a; - ModelRenderer horn2b; - - horn2a = new ModelRenderer(this, 0, 19); - horn2a.addBox(0.0F, -1.5F, -1.5F, 3, 3, 3); - horn2a.setRotationPoint(4.5F, height, -1.0F); - horn2a.rotateAngleY = 30F / (180F / (float)Math.PI); - horn2a.rotateAngleZ = -zangle / (180F / (float)Math.PI); - this.bipedHead.addChild(horn2a); - - horn2b = new ModelRenderer(this, 0, 26); - horn2b.addBox(-1.0F, -1.0F, -1.0F, 5, 2, 2); - horn2b.setRotationPoint(3.0F, 0.0F, 0.0F); - horn2b.rotateAngleY = 20F / (180F / (float)Math.PI); - horn2b.rotateAngleZ = -zangle / (180F / (float)Math.PI); - horn2a.addChild(horn2b); - } - - - /** - * Sets the models various rotation angles then renders the model. - */ - @Override - public void render(Entity par1Entity, float par2, float par3, float par4, float par5, float par6, float par7) { - - if (par1Entity != null) - { - this.isSneak = par1Entity.isSneaking(); - } - - if (par1Entity != null && par1Entity instanceof EntityLivingBase) - { - this.heldItemRight = ((EntityLivingBase)par1Entity).getHeldItem() != null ? 1 : 0; - - //System.out.println("Held right = " + ((EntityLivingBase)par1Entity).getHeldItem()); - } else { - //System.out.println("Entity = " + par1Entity); - } - - super.render(par1Entity, par2, par3, par4, par5, par6, par7); - - this.bipedLegBody.render(par7); - } - - -} diff --git a/src/main/java/twilightforest/client/model/TFLayerDefinitions.java b/src/main/java/twilightforest/client/model/TFLayerDefinitions.java new file mode 100644 index 0000000000..11774ea5a7 --- /dev/null +++ b/src/main/java/twilightforest/client/model/TFLayerDefinitions.java @@ -0,0 +1,175 @@ +package twilightforest.client.model; + +import net.minecraft.client.model.*; +import net.minecraft.client.model.geom.LayerDefinitions; +import net.minecraft.client.model.geom.builders.CubeDeformation; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.client.event.EntityRenderersEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.ModList; +import net.minecraftforge.fml.common.Mod; +import twilightforest.TwilightForestMod; +import twilightforest.client.model.armor.*; +import twilightforest.client.model.entity.*; +import twilightforest.client.model.entity.legacy.*; +import twilightforest.client.model.tileentity.*; +import twilightforest.client.model.tileentity.legacy.*; +import twilightforest.client.renderer.entity.TwilightBoatRenderer; +import twilightforest.client.renderer.tileentity.CasketTileEntityRenderer; +import twilightforest.compat.curios.model.CharmOfLife1NecklaceModel; +import twilightforest.compat.curios.model.CharmOfLife2NecklaceModel; +import twilightforest.entity.TwilightBoat; + +@Mod.EventBusSubscriber(modid = TwilightForestMod.ID, value = Dist.CLIENT, bus = Mod.EventBusSubscriber.Bus.MOD) +public class TFLayerDefinitions { + + @SubscribeEvent + public static void registerLayers(EntityRenderersEvent.RegisterLayerDefinitions event) { + + for(TwilightBoat.Type boatType : TwilightBoat.Type.values()) { + event.registerLayerDefinition(TwilightBoatRenderer.createBoatModelName(boatType), BoatModel::createBodyModel); + event.registerLayerDefinition(TwilightBoatRenderer.createChestBoatModelName(boatType), ChestBoatModel::createBodyModel); + } + + event.registerLayerDefinition(TFModelLayers.ARCTIC_ARMOR_INNER, () -> LayerDefinition.create(ArcticArmorModel.addPieces(LayerDefinitions.INNER_ARMOR_DEFORMATION), 64, 32)); + event.registerLayerDefinition(TFModelLayers.ARCTIC_ARMOR_OUTER, () -> LayerDefinition.create(ArcticArmorModel.addPieces(LayerDefinitions.OUTER_ARMOR_DEFORMATION), 64, 32)); + event.registerLayerDefinition(TFModelLayers.FIERY_ARMOR_INNER, () -> LayerDefinition.create(FieryArmorModel.createMesh(LayerDefinitions.INNER_ARMOR_DEFORMATION, 0.0F), 64, 32)); + event.registerLayerDefinition(TFModelLayers.FIERY_ARMOR_OUTER, () -> LayerDefinition.create(FieryArmorModel.createMesh(LayerDefinitions.OUTER_ARMOR_DEFORMATION, 0.0F), 64, 32)); + event.registerLayerDefinition(TFModelLayers.KNIGHTMETAL_ARMOR_INNER, () -> LayerDefinition.create(KnightmetalArmorModel.setup(LayerDefinitions.INNER_ARMOR_DEFORMATION), 64, 32)); + event.registerLayerDefinition(TFModelLayers.KNIGHTMETAL_ARMOR_OUTER, () -> LayerDefinition.create(KnightmetalArmorModel.setup(LayerDefinitions.OUTER_ARMOR_DEFORMATION), 64, 32)); + event.registerLayerDefinition(TFModelLayers.PHANTOM_ARMOR_INNER, () -> LayerDefinition.create(PhantomArmorModel.addPieces(LayerDefinitions.INNER_ARMOR_DEFORMATION), 64, 32)); + event.registerLayerDefinition(TFModelLayers.PHANTOM_ARMOR_OUTER, () -> LayerDefinition.create(PhantomArmorModel.addPieces(LayerDefinitions.OUTER_ARMOR_DEFORMATION), 64, 32)); + event.registerLayerDefinition(TFModelLayers.YETI_ARMOR_INNER, () -> LayerDefinition.create(YetiArmorModel.addPieces(LayerDefinitions.INNER_ARMOR_DEFORMATION), 64, 32)); + event.registerLayerDefinition(TFModelLayers.YETI_ARMOR_OUTER, () -> LayerDefinition.create(YetiArmorModel.addPieces(LayerDefinitions.OUTER_ARMOR_DEFORMATION), 64, 32)); + + event.registerLayerDefinition(TFModelLayers.ALPHA_YETI_TROPHY, AlphaYetiTrophyModel::createHead); + event.registerLayerDefinition(TFModelLayers.HYDRA_TROPHY, HydraTrophyModel::createHead); + event.registerLayerDefinition(TFModelLayers.KNIGHT_PHANTOM_TROPHY, KnightPhantomTrophyModel::createHead); + event.registerLayerDefinition(TFModelLayers.LICH_TROPHY, LichTrophyModel::createHead); + event.registerLayerDefinition(TFModelLayers.MINOSHROOM_TROPHY, MinoshroomTrophyModel::createHead); + event.registerLayerDefinition(TFModelLayers.NAGA_TROPHY, NagaTrophyModel::createHead); + event.registerLayerDefinition(TFModelLayers.QUEST_RAM_TROPHY, QuestRamTrophyModel::createHead); + event.registerLayerDefinition(TFModelLayers.SNOW_QUEEN_TROPHY, SnowQueenTrophyModel::createHead); + event.registerLayerDefinition(TFModelLayers.UR_GHAST_TROPHY, UrGhastTrophyModel::createHead); + + event.registerLayerDefinition(TFModelLayers.LEGACY_HYDRA_TROPHY, HydraTrophyLegacyModel::create); + event.registerLayerDefinition(TFModelLayers.LEGACY_MINOSHROOM_TROPHY, MinoshroomTrophyLegacyModel::create); + event.registerLayerDefinition(TFModelLayers.LEGACY_QUEST_RAM_TROPHY, QuestRamTrophyLegacyModel::create); + event.registerLayerDefinition(TFModelLayers.LEGACY_SNOW_QUEEN_TROPHY, SnowQueenTrophyLegacyModel::create); + event.registerLayerDefinition(TFModelLayers.LEGACY_UR_GHAST_TROPHY, UrGhastTrophyLegacyModel::create); + + event.registerLayerDefinition(TFModelLayers.ADHERENT, AdherentModel::create); + event.registerLayerDefinition(TFModelLayers.ALPHA_YETI, AlphaYetiModel::create); + event.registerLayerDefinition(TFModelLayers.ARMORED_GIANT, () -> LayerDefinition.create(HumanoidModel.createMesh(CubeDeformation.NONE, 0.0F), 64, 32)); + event.registerLayerDefinition(TFModelLayers.BIGHORN_SHEEP, BighornModel::create); + event.registerLayerDefinition(TFModelLayers.BIGHORN_SHEEP_FUR, BighornFurLayer::create); + event.registerLayerDefinition(TFModelLayers.BLOCKCHAIN_GOBLIN, BlockChainGoblinModel::create); + event.registerLayerDefinition(TFModelLayers.BOAR, BoarModel::create); + event.registerLayerDefinition(TFModelLayers.BUNNY, BunnyModel::create); + event.registerLayerDefinition(TFModelLayers.CARMINITE_BROODLING, SpiderModel::createSpiderBodyLayer); + event.registerLayerDefinition(TFModelLayers.CARMINITE_GOLEM, CarminiteGolemModel::create); + event.registerLayerDefinition(TFModelLayers.CARMINITE_GHASTGUARD, TFGhastModel::create); + event.registerLayerDefinition(TFModelLayers.CARMINITE_GHASTLING, TFGhastModel::create); + event.registerLayerDefinition(TFModelLayers.CHAIN, ChainModel::create); + event.registerLayerDefinition(TFModelLayers.CUBE_OF_ANNIHILATION, CubeOfAnnihilationModel::create); + event.registerLayerDefinition(TFModelLayers.DEATH_TOME, DeathTomeModel::create); + event.registerLayerDefinition(TFModelLayers.DEER, DeerModel::create); + event.registerLayerDefinition(TFModelLayers.FIRE_BEETLE, FireBeetleModel::create); + event.registerLayerDefinition(TFModelLayers.GIANT_MINER, () -> LayerDefinition.create(HumanoidModel.createMesh(CubeDeformation.NONE, 0.0F), 64, 32)); + event.registerLayerDefinition(TFModelLayers.HARBINGER_CUBE, HarbingerCubeModel::create); + event.registerLayerDefinition(TFModelLayers.HEDGE_SPIDER, SpiderModel::createSpiderBodyLayer); + event.registerLayerDefinition(TFModelLayers.HELMET_CRAB, HelmetCrabModel::create); + event.registerLayerDefinition(TFModelLayers.HOSTILE_WOLF, HostileWolfModel::create); + event.registerLayerDefinition(TFModelLayers.HYDRA_HEAD, HydraHeadModel::create); + event.registerLayerDefinition(TFModelLayers.HYDRA, HydraModel::create); + event.registerLayerDefinition(TFModelLayers.HYDRA_MORTAR, HydraMortarModel::create); + event.registerLayerDefinition(TFModelLayers.HYDRA_NECK, HydraNeckModel::create); + event.registerLayerDefinition(TFModelLayers.ICE_CRYSTAL, IceCrystalModel::create); + event.registerLayerDefinition(TFModelLayers.KING_SPIDER, SpiderModel::createSpiderBodyLayer); + event.registerLayerDefinition(TFModelLayers.KNIGHT_PHANTOM, KnightPhantomModel::create); + event.registerLayerDefinition(TFModelLayers.KOBOLD, KoboldModel::create); + event.registerLayerDefinition(TFModelLayers.LICH_MINION, () -> LayerDefinition.create(HumanoidModel.createMesh(CubeDeformation.NONE, 0.0F), 64, 64)); + event.registerLayerDefinition(TFModelLayers.LICH, LichModel::create); + event.registerLayerDefinition(TFModelLayers.LOWER_GOBLIN_KNIGHT, LowerGoblinKnightModel::create); + event.registerLayerDefinition(TFModelLayers.LOYAL_ZOMBIE, () -> LayerDefinition.create(HumanoidModel.createMesh(CubeDeformation.NONE, 0.0F), 64, 64)); + event.registerLayerDefinition(TFModelLayers.MAZE_SLIME, SlimeModel::createInnerBodyLayer); + event.registerLayerDefinition(TFModelLayers.MAZE_SLIME_OUTER, SlimeModel::createOuterBodyLayer); + event.registerLayerDefinition(TFModelLayers.MINOSHROOM, MinoshroomModel::create); + event.registerLayerDefinition(TFModelLayers.MINOTAUR, MinotaurModel::create); + event.registerLayerDefinition(TFModelLayers.MIST_WOLF, WolfModel::createBodyLayer); + event.registerLayerDefinition(TFModelLayers.MOSQUITO_SWARM, MosquitoSwarmModel::create); + event.registerLayerDefinition(TFModelLayers.NAGA, NagaModel::create); + event.registerLayerDefinition(TFModelLayers.NAGA_BODY, NagaModel::create); + event.registerLayerDefinition(TFModelLayers.NOOP, () -> LayerDefinition.create(HumanoidModel.createMesh(CubeDeformation.NONE, 0.0F), 0, 0)); + event.registerLayerDefinition(TFModelLayers.PENGUIN, PenguinModel::create); + event.registerLayerDefinition(TFModelLayers.PINCH_BEETLE, PinchBeetleModel::create); + event.registerLayerDefinition(TFModelLayers.PROTECTION_BOX, () -> LayerDefinition.create(ProtectionBoxModel.createMesh(), 16, 16)); + event.registerLayerDefinition(TFModelLayers.QUEST_RAM, QuestRamModel::create); + event.registerLayerDefinition(TFModelLayers.RAVEN, RavenModel::create); + event.registerLayerDefinition(TFModelLayers.REDCAP, RedcapModel::create); + event.registerLayerDefinition(TFModelLayers.REDCAP_ARMOR_INNER, () -> LayerDefinition.create(HumanoidModel.createMesh(new CubeDeformation(0.25F), 0.7F), 64, 32)); + event.registerLayerDefinition(TFModelLayers.REDCAP_ARMOR_OUTER, () -> LayerDefinition.create(HumanoidModel.createMesh(new CubeDeformation(0.65F), 0.7F), 64, 32)); + event.registerLayerDefinition(TFModelLayers.RISING_ZOMBIE, () -> LayerDefinition.create(HumanoidModel.createMesh(CubeDeformation.NONE, 0.0F), 64, 64)); + event.registerLayerDefinition(TFModelLayers.ROVING_CUBE, CubeOfAnnihilationModel::create); + event.registerLayerDefinition(TFModelLayers.SKELETON_DRUID, SkeletonDruidModel::create); + event.registerLayerDefinition(TFModelLayers.SLIME_BEETLE, SlimeBeetleModel::create); + event.registerLayerDefinition(TFModelLayers.SLIME_BEETLE_TAIL, SlimeBeetleModel::create); + event.registerLayerDefinition(TFModelLayers.SNOW_QUEEN, SnowQueenModel::create); + event.registerLayerDefinition(TFModelLayers.CHAIN_BLOCK, SpikeBlockModel::create); + event.registerLayerDefinition(TFModelLayers.SQUIRREL, SquirrelModel::create); + event.registerLayerDefinition(TFModelLayers.STABLE_ICE_CORE, StableIceCoreModel::create); + event.registerLayerDefinition(TFModelLayers.SWARM_SPIDER, SpiderModel::createSpiderBodyLayer); + event.registerLayerDefinition(TFModelLayers.TINY_BIRD, TinyBirdModel::create); + event.registerLayerDefinition(TFModelLayers.TOWERWOOD_BORER, SilverfishModel::createBodyLayer); + event.registerLayerDefinition(TFModelLayers.TROLL, TrollModel::create); + event.registerLayerDefinition(TFModelLayers.UNSTABLE_ICE_CORE, UnstableIceCoreModel::create); + event.registerLayerDefinition(TFModelLayers.UPPER_GOBLIN_KNIGHT, UpperGoblinKnightModel::create); + event.registerLayerDefinition(TFModelLayers.UR_GHAST, UrGhastModel::create); + event.registerLayerDefinition(TFModelLayers.WINTER_WOLF, WolfModel::createBodyLayer); + event.registerLayerDefinition(TFModelLayers.WRAITH, WraithModel::create); + event.registerLayerDefinition(TFModelLayers.YETI, YetiModel::create); + + event.registerLayerDefinition(TFModelLayers.LEGACY_BIGHORN_SHEEP, BighornLegacyModel::create); + event.registerLayerDefinition(TFModelLayers.LEGACY_BLOCKCHAIN_GOBLIN, BlockChainGoblinLegacyModel::create); + event.registerLayerDefinition(TFModelLayers.LEGACY_BOAR, BoarLegacyModel::create); + event.registerLayerDefinition(TFModelLayers.LEGACY_DEER, DeerLegacyModel::create); + event.registerLayerDefinition(TFModelLayers.LEGACY_FIRE_BEETLE, FireBeetleLegacyModel::create); + event.registerLayerDefinition(TFModelLayers.LEGACY_HELMET_CRAB, HelmetCrabLegacyModel::create); + event.registerLayerDefinition(TFModelLayers.LEGACY_HYDRA, HydraLegacyModel::create); + event.registerLayerDefinition(TFModelLayers.LEGACY_HYDRA_HEAD, HydraHeadLegacyModel::create); + event.registerLayerDefinition(TFModelLayers.LEGACY_HYDRA_NECK, HydraNeckLegacyModel::create); + event.registerLayerDefinition(TFModelLayers.LEGACY_KOBOLD, KoboldLegacyModel::create); + event.registerLayerDefinition(TFModelLayers.LEGACY_LOWER_GOBLIN_KNIGHT, LowerGoblinKnightLegacyModel::create); + event.registerLayerDefinition(TFModelLayers.LEGACY_MINOSHROOM, MinoshroomLegacyModel::create); + event.registerLayerDefinition(TFModelLayers.LEGACY_MINOTAUR, MinotaurLegacyModel::create); + event.registerLayerDefinition(TFModelLayers.LEGACY_NAGA, NagaLegacyModel::create); + event.registerLayerDefinition(TFModelLayers.LEGACY_NAGA_BODY, NagaLegacyModel::create); + event.registerLayerDefinition(TFModelLayers.LEGACY_PINCH_BEETLE, PinchBeetleLegacyModel::create); + event.registerLayerDefinition(TFModelLayers.LEGACY_QUEST_RAM, QuestRamLegacyModel::create); + event.registerLayerDefinition(TFModelLayers.LEGACY_RAVEN, RavenLegacyModel::create); + event.registerLayerDefinition(TFModelLayers.LEGACY_REDCAP, RedcapLegacyModel::create); + event.registerLayerDefinition(TFModelLayers.LEGACY_SLIME_BEETLE, SlimeBeetleLegacyModel::create); + event.registerLayerDefinition(TFModelLayers.LEGACY_SLIME_BEETLE_TAIL, SlimeBeetleLegacyModel::create); + event.registerLayerDefinition(TFModelLayers.LEGACY_SNOW_QUEEN, SnowQueenLegacyModel::create); + event.registerLayerDefinition(TFModelLayers.LEGACY_SQUIRREL, SquirrelLegacyModel::create); + event.registerLayerDefinition(TFModelLayers.LEGACY_TINY_BIRD, TinyBirdLegacyModel::create); + event.registerLayerDefinition(TFModelLayers.LEGACY_TROLL, TrollLegacyModel::create); + event.registerLayerDefinition(TFModelLayers.LEGACY_UPPER_GOBLIN_KNIGHT, UpperGoblinKnightLegacyModel::create); + event.registerLayerDefinition(TFModelLayers.LEGACY_UR_GHAST, UrGhastLegacyModel::create); + + event.registerLayerDefinition(TFModelLayers.CICADA, CicadaModel::create); + event.registerLayerDefinition(TFModelLayers.FIREFLY, FireflyModel::create); + event.registerLayerDefinition(TFModelLayers.KEEPSAKE_CASKET, CasketTileEntityRenderer::create); + event.registerLayerDefinition(TFModelLayers.MOONWORM, MoonwormModel::create); + + event.registerLayerDefinition(TFModelLayers.RED_THREAD, RedThreadModel::create); + + event.registerLayerDefinition(TFModelLayers.KNIGHTMETAL_SHIELD, KnightmetalShieldModel::create); + + if (ModList.get().isLoaded("curios")) { + event.registerLayerDefinition(TFModelLayers.CHARM_OF_LIFE_1, CharmOfLife1NecklaceModel::create); + event.registerLayerDefinition(TFModelLayers.CHARM_OF_LIFE_2, CharmOfLife2NecklaceModel::create); + } + } +} diff --git a/src/main/java/twilightforest/client/model/TFModelLayers.java b/src/main/java/twilightforest/client/model/TFModelLayers.java new file mode 100644 index 0000000000..f682889a75 --- /dev/null +++ b/src/main/java/twilightforest/client/model/TFModelLayers.java @@ -0,0 +1,156 @@ +package twilightforest.client.model; + +import net.minecraft.client.model.geom.ModelLayerLocation; +import net.minecraft.resources.ResourceLocation; +import twilightforest.TwilightForestMod; + +public class TFModelLayers { + + public static final ModelLayerLocation ARCTIC_ARMOR_INNER = register("arctic_armor", "inner"); + public static final ModelLayerLocation ARCTIC_ARMOR_OUTER = register("arctic_armor", "outer"); + public static final ModelLayerLocation FIERY_ARMOR_INNER = register("fiery_armor", "inner"); + public static final ModelLayerLocation FIERY_ARMOR_OUTER = register("fiery_armor", "outer"); + public static final ModelLayerLocation KNIGHTMETAL_ARMOR_INNER = register("knightmetal_armor", "inner"); + public static final ModelLayerLocation KNIGHTMETAL_ARMOR_OUTER = register("knightmetal_armor", "outer"); + public static final ModelLayerLocation PHANTOM_ARMOR_INNER = register("phantom_armor", "inner"); + public static final ModelLayerLocation PHANTOM_ARMOR_OUTER = register("phantom_armor", "outer"); + public static final ModelLayerLocation YETI_ARMOR_INNER = register("yeti_armor", "inner"); + public static final ModelLayerLocation YETI_ARMOR_OUTER = register("yeti_armor", "outer"); + + public static final ModelLayerLocation ALPHA_YETI_TROPHY = register("alpha_yeti_trophy"); + public static final ModelLayerLocation HYDRA_TROPHY = register("hydra_trophy"); + public static final ModelLayerLocation KNIGHT_PHANTOM_TROPHY = register("knight_phantom_trophy"); + public static final ModelLayerLocation LICH_TROPHY = register("lich_trophy"); + public static final ModelLayerLocation MINOSHROOM_TROPHY = register("minoshroom_trophy"); + public static final ModelLayerLocation NAGA_TROPHY = register("naga_trophy"); + public static final ModelLayerLocation QUEST_RAM_TROPHY = register("quest_ram_trophy"); + public static final ModelLayerLocation SNOW_QUEEN_TROPHY = register("snow_queen_trophy"); + public static final ModelLayerLocation UR_GHAST_TROPHY = register("ur_ghast_trophy"); + + public static final ModelLayerLocation LEGACY_HYDRA_TROPHY = register("legacy_hydra_trophy"); + public static final ModelLayerLocation LEGACY_MINOSHROOM_TROPHY = register("legacy_minoshroom_trophy"); + public static final ModelLayerLocation LEGACY_QUEST_RAM_TROPHY = register("legacy_quest_ram_trophy"); + public static final ModelLayerLocation LEGACY_SNOW_QUEEN_TROPHY = register("legacy_snow_queen_trophy"); + public static final ModelLayerLocation LEGACY_UR_GHAST_TROPHY = register("legacy_ur_ghast_trophy"); + + public static final ModelLayerLocation ADHERENT = register("adherent"); + public static final ModelLayerLocation ALPHA_YETI = register("alpha_yeti"); + public static final ModelLayerLocation ARMORED_GIANT = register("armored_giant"); + public static final ModelLayerLocation BIGHORN_SHEEP = register("bighorn_sheep"); + public static final ModelLayerLocation BIGHORN_SHEEP_FUR = register("bighorn_sheep", "fur"); + public static final ModelLayerLocation BLOCKCHAIN_GOBLIN = register("blockchain_goblin"); + public static final ModelLayerLocation BOAR = register("boar"); + public static final ModelLayerLocation BUNNY = register("bunny"); + public static final ModelLayerLocation CARMINITE_BROODLING = register("carminite_broodling"); + public static final ModelLayerLocation CARMINITE_GHASTGUARD = register("carminite_ghastguard"); + public static final ModelLayerLocation CARMINITE_GHASTLING = register("carminite_ghastling"); + public static final ModelLayerLocation CARMINITE_GOLEM = register("carminite_golem"); + public static final ModelLayerLocation CHAIN = register("chain"); + public static final ModelLayerLocation DEATH_TOME = register("death_tome"); + public static final ModelLayerLocation DEER = register("deer"); + public static final ModelLayerLocation FIRE_BEETLE = register("fire_beetle"); + public static final ModelLayerLocation GIANT_MINER = register("giant_miner"); + public static final ModelLayerLocation HARBINGER_CUBE = register("harbinger_cube"); + public static final ModelLayerLocation HEDGE_SPIDER = register("hedge_spider"); + public static final ModelLayerLocation HELMET_CRAB = register("helmet_crab"); + public static final ModelLayerLocation HOSTILE_WOLF = register("hostile_wolf"); + public static final ModelLayerLocation HYDRA = register("hydra"); + public static final ModelLayerLocation HYDRA_HEAD = register("hydra_head"); + public static final ModelLayerLocation HYDRA_NECK = register("hydra_neck"); + public static final ModelLayerLocation ICE_CRYSTAL = register("ice_crystal"); + public static final ModelLayerLocation KING_SPIDER = register("king_spider"); + public static final ModelLayerLocation KNIGHT_PHANTOM = register("knight_phantom"); + public static final ModelLayerLocation KOBOLD = register("kobold"); + public static final ModelLayerLocation LICH = register("lich"); + public static final ModelLayerLocation LICH_MINION = register("lich_minion"); + public static final ModelLayerLocation LOWER_GOBLIN_KNIGHT = register("lower_goblin_knight"); + public static final ModelLayerLocation LOYAL_ZOMBIE = register("loyal_zombie"); + public static final ModelLayerLocation MAZE_SLIME = register("maze_slime"); + public static final ModelLayerLocation MAZE_SLIME_OUTER = register("maze_slime", "outer"); + public static final ModelLayerLocation MINOSHROOM = register("minoshroom"); + public static final ModelLayerLocation MINOTAUR = register("minotaur"); + public static final ModelLayerLocation MIST_WOLF = register("mist_wolf"); + public static final ModelLayerLocation MOSQUITO_SWARM = register("mosquito_swarm"); + public static final ModelLayerLocation NAGA = register("naga"); + public static final ModelLayerLocation NAGA_BODY = register("naga_body"); + public static final ModelLayerLocation NOOP = register("noop"); + public static final ModelLayerLocation PENGUIN = register("penguin"); + public static final ModelLayerLocation PINCH_BEETLE = register("pinch_beetle"); + public static final ModelLayerLocation QUEST_RAM = register("quest_ram"); + public static final ModelLayerLocation RAVEN = register("raven"); + public static final ModelLayerLocation REDCAP = register("redcap"); + public static final ModelLayerLocation REDCAP_ARMOR_OUTER = register("redcap", "outer"); + public static final ModelLayerLocation REDCAP_ARMOR_INNER = register("redcap", "inner"); + public static final ModelLayerLocation RISING_ZOMBIE = register("rising_zombie"); + public static final ModelLayerLocation ROVING_CUBE = register("roving_cube"); + public static final ModelLayerLocation SKELETON_DRUID = register("skeleton_druid"); + public static final ModelLayerLocation SLIME_BEETLE = register("slime_beetle"); + public static final ModelLayerLocation SLIME_BEETLE_TAIL = register("slime_beetle", "tail"); + public static final ModelLayerLocation SNOW_QUEEN = register("snow_queen"); + public static final ModelLayerLocation SQUIRREL = register("squirrel"); + public static final ModelLayerLocation STABLE_ICE_CORE = register("stable_ice_core"); + public static final ModelLayerLocation SWARM_SPIDER = register("swarm_spider"); + public static final ModelLayerLocation TINY_BIRD = register("tiny_bird"); + public static final ModelLayerLocation TOWERWOOD_BORER = register("towerwood_borer"); + public static final ModelLayerLocation TROLL = register("troll"); + public static final ModelLayerLocation UNSTABLE_ICE_CORE = register("unstable_ice_core"); + public static final ModelLayerLocation UPPER_GOBLIN_KNIGHT = register("upper_goblin_knight"); + public static final ModelLayerLocation UR_GHAST = register("ur_ghast"); + public static final ModelLayerLocation WINTER_WOLF = register("winter_wolf"); + public static final ModelLayerLocation WRAITH = register("wraith"); + public static final ModelLayerLocation YETI = register("yeti"); + + public static final ModelLayerLocation LEGACY_BIGHORN_SHEEP = register("legacy_bighorn_sheep"); + public static final ModelLayerLocation LEGACY_BLOCKCHAIN_GOBLIN = register("legacy_blockchain_goblin"); + public static final ModelLayerLocation LEGACY_BOAR = register("legacy_boar"); + public static final ModelLayerLocation LEGACY_DEER = register("legacy_deer"); + public static final ModelLayerLocation LEGACY_FIRE_BEETLE = register("legacy_fire_beetle"); + public static final ModelLayerLocation LEGACY_HELMET_CRAB = register("legacy_helmet_crab"); + public static final ModelLayerLocation LEGACY_HYDRA = register("legacy_hydra"); + public static final ModelLayerLocation LEGACY_HYDRA_HEAD = register("legacy_hydra_head"); + public static final ModelLayerLocation LEGACY_HYDRA_NECK = register("legacy_hydra_neck"); + public static final ModelLayerLocation LEGACY_KOBOLD = register("legacy_kobold"); + public static final ModelLayerLocation LEGACY_LOWER_GOBLIN_KNIGHT = register("legacy_lower_goblin_knight"); + public static final ModelLayerLocation LEGACY_MINOSHROOM = register("legacy_minoshroom"); + public static final ModelLayerLocation LEGACY_MINOTAUR = register("legacy_minotaur"); + public static final ModelLayerLocation LEGACY_NAGA = register("legacy_naga"); + public static final ModelLayerLocation LEGACY_NAGA_BODY = register("legacy_naga_body"); + public static final ModelLayerLocation LEGACY_PINCH_BEETLE = register("legacy_pinch_beetle"); + public static final ModelLayerLocation LEGACY_QUEST_RAM = register("legacy_quest_ram"); + public static final ModelLayerLocation LEGACY_RAVEN = register("legacy_raven"); + public static final ModelLayerLocation LEGACY_REDCAP = register("legacy_redcap"); + public static final ModelLayerLocation LEGACY_SLIME_BEETLE = register("legacy_slime_beetle"); + public static final ModelLayerLocation LEGACY_SLIME_BEETLE_TAIL = register("legacy_slime_beetle", "tail"); + public static final ModelLayerLocation LEGACY_SNOW_QUEEN = register("legacy_snow_queen"); + public static final ModelLayerLocation LEGACY_SQUIRREL = register("legacy_squirrel"); + public static final ModelLayerLocation LEGACY_TINY_BIRD = register("legacy_tiny_bird"); + public static final ModelLayerLocation LEGACY_TROLL = register("legacy_troll"); + public static final ModelLayerLocation LEGACY_UPPER_GOBLIN_KNIGHT = register("legacy_upper_goblin_knight"); + public static final ModelLayerLocation LEGACY_UR_GHAST = register("legacy_ur_ghast"); + + public static final ModelLayerLocation CHAIN_BLOCK = register("chain_block"); + public static final ModelLayerLocation CUBE_OF_ANNIHILATION = register("cube_of_annihilation"); + public static final ModelLayerLocation PROTECTION_BOX = register("protection_box"); + + public static final ModelLayerLocation HYDRA_MORTAR = register("hydra_mortar"); + + public static final ModelLayerLocation CICADA = register("cicada"); + public static final ModelLayerLocation FIREFLY = register("firefly"); + public static final ModelLayerLocation KEEPSAKE_CASKET = register("keepsake_casket"); + public static final ModelLayerLocation MOONWORM = register("moonworm"); + + public static final ModelLayerLocation RED_THREAD = register("red_thread"); + + public static final ModelLayerLocation KNIGHTMETAL_SHIELD = register("knightmetal_shield"); + + public static final ModelLayerLocation CHARM_OF_LIFE_1 = register("charm_of_life_1"); + public static final ModelLayerLocation CHARM_OF_LIFE_2 = register("charm_of_life_2"); + + private static ModelLayerLocation register(String p_171294_) { + return register(p_171294_, "main"); + } + + private static ModelLayerLocation register(String p_171301_, String p_171302_) { + return new ModelLayerLocation(new ResourceLocation(TwilightForestMod.ID, p_171301_), p_171302_); + } +} diff --git a/src/main/java/twilightforest/client/model/armor/ArcticArmorModel.java b/src/main/java/twilightforest/client/model/armor/ArcticArmorModel.java new file mode 100644 index 0000000000..3dda5cc6c9 --- /dev/null +++ b/src/main/java/twilightforest/client/model/armor/ArcticArmorModel.java @@ -0,0 +1,44 @@ +package twilightforest.client.model.armor; + +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.*; + +public class ArcticArmorModel { + + public static MeshDefinition addPieces(CubeDeformation deformation) { + MeshDefinition meshdefinition = HumanoidModel.createMesh(deformation, 0); + PartDefinition partdefinition = meshdefinition.getRoot(); + + var head = partdefinition.addOrReplaceChild("head", CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-4.0F, -8.0F, -4.0F, 8.0F, 8.0F, 8.0F, deformation), + PartPose.offset(0.0F, 0.0F, 0.0F)); + + head.addOrReplaceChild("right_hood", + CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-1.0F, -2.0F, -1.0F, 1, 4, 1, new CubeDeformation(0.5F)), + PartPose.offset(-2.5F, -3.0F, -5.0F)); + + head.addOrReplaceChild("left_hood", + CubeListBuilder.create() + .texOffs(0, 0) + .addBox(0.0F, -2.0F, -1.0F, 1, 4, 1, new CubeDeformation(0.5F)), + PartPose.offset(2.5F, -3.0F, -5.0F)); + + head.addOrReplaceChild("top_hood", + CubeListBuilder.create() + .texOffs(24, 0) + .addBox(-2.0F, -1.0F, -1.0F, 4, 1, 1, new CubeDeformation(0.5F)), + PartPose.offset(0.0F, -5.5F, -5.0F)); + + head.addOrReplaceChild("bottom_hood", + CubeListBuilder.create() + .texOffs(24, 0) + .addBox(-2.0F, -1.0F, -1.0F, 4, 1, 1, new CubeDeformation(0.5F)), + PartPose.offset(0.0F, 0.5F, -5.0F)); + + return meshdefinition; + } +} diff --git a/src/main/java/twilightforest/client/model/armor/FieryArmorModel.java b/src/main/java/twilightforest/client/model/armor/FieryArmorModel.java new file mode 100644 index 0000000000..2c0a4d7a02 --- /dev/null +++ b/src/main/java/twilightforest/client/model/armor/FieryArmorModel.java @@ -0,0 +1,18 @@ +package twilightforest.client.model.armor; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.model.geom.ModelPart; + +public class FieryArmorModel extends TFArmorModel { + + public FieryArmorModel(ModelPart part) { + super(part); + } + + @Override + public void renderToBuffer(PoseStack stack, VertexConsumer builder, int light, int overlay, float red, float green, float blue, float scale) { + super.renderToBuffer(stack, builder, 0xF000F0, overlay, red, green, blue, scale); + } + +} diff --git a/src/main/java/twilightforest/client/model/armor/KnightmetalArmorModel.java b/src/main/java/twilightforest/client/model/armor/KnightmetalArmorModel.java new file mode 100644 index 0000000000..62a8667e2e --- /dev/null +++ b/src/main/java/twilightforest/client/model/armor/KnightmetalArmorModel.java @@ -0,0 +1,96 @@ +package twilightforest.client.model.armor; + +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.*; + +public class KnightmetalArmorModel { + + public static MeshDefinition setup(CubeDeformation deformation) { + MeshDefinition meshdefinition = HumanoidModel.createMesh(deformation, 0); + PartDefinition partdefinition = meshdefinition.getRoot(); + + var head = partdefinition.addOrReplaceChild("head", CubeListBuilder.create().texOffs(0, 0) + .addBox(-4.0F, -8.0F, -4.0F, 8.0F, 8.0F, 8.0F, deformation), + PartPose.offset(0.0F, 0.0F, 0.0F)); + + var rightHorn = head.addOrReplaceChild("right_horn_1", + CubeListBuilder.create() + .texOffs(24, 0) + .addBox(-5.5F, -1.5F, -1.5F, 5, 3, 3, new CubeDeformation(0.25F)), + PartPose.offsetAndRotation(-4.0F, -6.5F, 0.0F, + 0.0F, -15F / (180F / (float) Math.PI), 10F / (180F / (float) Math.PI))); + + rightHorn.addOrReplaceChild("right_horn_2", + CubeListBuilder.create() + .texOffs(54, 16) + .addBox(-3.5F, -1.0F, -1.0F, 3, 2, 2, new CubeDeformation(0.25F)), + PartPose.offsetAndRotation(-4.5F, 0.0F, 0.0F, + 0.0F, 0.0F, 10F / (180F / (float) Math.PI))); + + var leftHorn = head.addOrReplaceChild("left_horn_1", + CubeListBuilder.create() + .texOffs(24, 0).mirror() + .addBox(0.5F, -1.5F, -1.5F, 5, 3, 3, new CubeDeformation(0.25F)), + PartPose.offsetAndRotation(4.0F, -6.5F, 0.0F, + 0.0F, 15F / (180F / (float) Math.PI), -10F / (180F / (float) Math.PI))); + + leftHorn.addOrReplaceChild("left_horn_2", + CubeListBuilder.create() + .texOffs(54, 16) + .addBox(0.5F, -1.0F, -1.0F, 3, 2, 2, new CubeDeformation(0.25F)), + PartPose.offsetAndRotation(4.5F, 0.0F, 0.0F, + 0.0F, 0.0F, -10F / (180F / (float) Math.PI))); + + var rightArm = partdefinition.addOrReplaceChild("right_arm", CubeListBuilder.create() + .texOffs(40, 16) + .addBox(-3.0F, -2.0F, -2.0F, 4.0F, 12.0F, 4.0F, deformation), + PartPose.offset(-5.0F, 2.0F, 0.0F)); + + var leftArm = partdefinition.addOrReplaceChild("left_arm", CubeListBuilder.create() + .texOffs(40, 16).mirror() + .addBox(-1.0F, -2.0F, -2.0F, 4.0F, 12.0F, 4.0F, deformation), + PartPose.offset(5.0F, 2.0F, 0.0F)); + + rightArm.addOrReplaceChild("shoulder_spike_1", + CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-1.0F, -1.0F, -1.0F, 2, 2, 2, new CubeDeformation(0.25F)), + PartPose.offsetAndRotation(-3.75F, -2.5F, 3.0F, + 45F / (180F / (float) Math.PI), 10F / (180F / (float) Math.PI), 35F / (180F / (float) Math.PI))); + + leftArm.addOrReplaceChild("shoulder_spike_2", + CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-1.0F, -1.0F, -1.0F, 2, 2, 2, new CubeDeformation(0.25F)), + PartPose.offsetAndRotation(3.75F, -2.5F, 3.0F, + -45F / (180F / (float) Math.PI), -10F / (180F / (float) Math.PI), 55F / (180F / (float) Math.PI))); + + var rightLeg = partdefinition.addOrReplaceChild("right_leg", CubeListBuilder.create() + .texOffs(0, 16) + .addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, deformation), + PartPose.offset(-1.9F, 12.0F, 0.0F)); + + var leftLeg = partdefinition.addOrReplaceChild("left_leg", CubeListBuilder.create() + .texOffs(0, 16).mirror() + .addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, deformation), + PartPose.offset(1.9F, 12.0F, 0.0F)); + + + rightLeg.addOrReplaceChild("shoe_spike_1", + CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-1.0F, -1.0F, -1.0F, 2, 2, 2, new CubeDeformation(0.25F)), + PartPose.offsetAndRotation(-2.5F, 11F, 3.0F, + 0.0F, -45F / (180F / (float) Math.PI), 0.0F)); + + leftLeg.addOrReplaceChild("shoe_spike_2", + CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-1.0F, -1.0F, -1.0F, 2, 2, 2, new CubeDeformation(0.25F)), + PartPose.offsetAndRotation(2.5F, 11F, 3.0F, + 0.0F, 45F / (180F / (float) Math.PI), 0.0F)); + + return meshdefinition; + } +} diff --git a/src/main/java/twilightforest/client/model/armor/PhantomArmorModel.java b/src/main/java/twilightforest/client/model/armor/PhantomArmorModel.java new file mode 100644 index 0000000000..242bc33c52 --- /dev/null +++ b/src/main/java/twilightforest/client/model/armor/PhantomArmorModel.java @@ -0,0 +1,47 @@ +package twilightforest.client.model.armor; + +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.*; +import net.minecraft.util.Mth; + +public class PhantomArmorModel { + + public static MeshDefinition addPieces(CubeDeformation deformation) { + MeshDefinition mesh = KnightmetalArmorModel.setup(deformation); + PartDefinition part = mesh.getRoot(); + + var head = part.addOrReplaceChild("head", CubeListBuilder.create().texOffs(0, 0) + .addBox(-4.0F, -8.0F, -4.0F, 8.0F, 8.0F, 8.0F, deformation), + PartPose.offset(0.0F, 0.0F, 0.0F)); + + var rightHorn = head.addOrReplaceChild("right_horn_1", + CubeListBuilder.create() + .texOffs(24, 0) + .addBox(-5.5F, -1.5F, -1.5F, 5, 3, 3, new CubeDeformation(0.25F)), + PartPose.offsetAndRotation(-4.0F, -6.5F, 0.0F, + 0.0F, -25F / (180F / Mth.PI), 45F / (180F / Mth.PI))); + + rightHorn.addOrReplaceChild("right_horn_2", + CubeListBuilder.create() + .texOffs(54, 16) + .addBox(-3.5F, -1.0F, -1.0F, 3, 2, 2, new CubeDeformation(0.25F)), + PartPose.offsetAndRotation(-4.5F, 0.0F, 0.0F, + 0.0F, -15F / (180F / Mth.PI), 45F / (180F / Mth.PI))); + + var leftHorn = head.addOrReplaceChild("left_horn_1", + CubeListBuilder.create() + .texOffs(24, 0).mirror() + .addBox(0.5F, -1.5F, -1.5F, 5, 3, 3, new CubeDeformation(0.25F)), + PartPose.offsetAndRotation(4.0F, -6.5F, 0.0F, + 0.0F, 25F / (180F / Mth.PI), -45F / (180F / Mth.PI))); + + leftHorn.addOrReplaceChild("left_horn_2", + CubeListBuilder.create() + .texOffs(54, 16) + .addBox(0.5F, -1.0F, -1.0F, 3, 2, 2, new CubeDeformation(0.25F)), + PartPose.offsetAndRotation(4.5F, 0.0F, 0.0F, + 0.0F, 15F / (180F / Mth.PI), -45F / (180F / Mth.PI))); + + return mesh; + } +} diff --git a/src/main/java/twilightforest/client/model/armor/TFArmorModel.java b/src/main/java/twilightforest/client/model/armor/TFArmorModel.java new file mode 100644 index 0000000000..131aa38d26 --- /dev/null +++ b/src/main/java/twilightforest/client/model/armor/TFArmorModel.java @@ -0,0 +1,46 @@ +package twilightforest.client.model.armor; + +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.decoration.ArmorStand; + +public class TFArmorModel extends HumanoidModel { + + public TFArmorModel(ModelPart root) { + super(root); + } + + @Override + public void setupAnim(LivingEntity entityIn, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + // [VanillaCopy] ModelArmorStandArmor + // this prevents helmets from always facing south, and the armor "breathing" on the stand + if (entityIn instanceof ArmorStand) { + ArmorStand entityarmorstand = (ArmorStand) entityIn; + this.head.xRot = 0.017453292F * entityarmorstand.getHeadPose().getX(); + this.head.yRot = 0.017453292F * entityarmorstand.getHeadPose().getY(); + this.head.zRot = 0.017453292F * entityarmorstand.getHeadPose().getZ(); + this.head.setPos(0.0F, 1.0F, 0.0F); + this.body.xRot = 0.017453292F * entityarmorstand.getBodyPose().getX(); + this.body.yRot = 0.017453292F * entityarmorstand.getBodyPose().getY(); + this.body.zRot = 0.017453292F * entityarmorstand.getBodyPose().getZ(); + this.leftArm.xRot = 0.017453292F * entityarmorstand.getLeftArmPose().getX(); + this.leftArm.yRot = 0.017453292F * entityarmorstand.getLeftArmPose().getY(); + this.leftArm.zRot = 0.017453292F * entityarmorstand.getLeftArmPose().getZ(); + this.rightArm.xRot = 0.017453292F * entityarmorstand.getRightArmPose().getX(); + this.rightArm.yRot = 0.017453292F * entityarmorstand.getRightArmPose().getY(); + this.rightArm.zRot = 0.017453292F * entityarmorstand.getRightArmPose().getZ(); + this.leftLeg.xRot = 0.017453292F * entityarmorstand.getLeftLegPose().getX(); + this.leftLeg.yRot = 0.017453292F * entityarmorstand.getLeftLegPose().getY(); + this.leftLeg.zRot = 0.017453292F * entityarmorstand.getLeftLegPose().getZ(); + this.leftLeg.setPos(1.9F, 11.0F, 0.0F); + this.rightLeg.xRot = 0.017453292F * entityarmorstand.getRightLegPose().getX(); + this.rightLeg.yRot = 0.017453292F * entityarmorstand.getRightLegPose().getY(); + this.rightLeg.zRot = 0.017453292F * entityarmorstand.getRightLegPose().getZ(); + this.rightLeg.setPos(-1.9F, 11.0F, 0.0F); + this.hat.copyFrom(this.head); + } else + super.setupAnim(entityIn, limbSwing, limbSwingAmount, ageInTicks, netHeadYaw, headPitch); + // TF - Defer to super otherwise + } +} diff --git a/src/main/java/twilightforest/client/model/armor/YetiArmorModel.java b/src/main/java/twilightforest/client/model/armor/YetiArmorModel.java new file mode 100644 index 0000000000..c2b5450bd3 --- /dev/null +++ b/src/main/java/twilightforest/client/model/armor/YetiArmorModel.java @@ -0,0 +1,217 @@ +package twilightforest.client.model.armor; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.Iterables; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.*; +import net.minecraft.world.entity.EquipmentSlot; + +public class YetiArmorModel extends TFArmorModel { + + private final EquipmentSlot slot; + + private final ModelPart bipedLegBody; + private final ModelPart rightRuff; + private final ModelPart leftRuff; + private final ModelPart rightToe; + private final ModelPart leftToe; + + public YetiArmorModel(EquipmentSlot slot, ModelPart part) { + super(part); + this.slot = slot; + this.bipedLegBody = part.getChild("biped_leg_body"); + this.rightRuff = this.rightLeg.getChild("right_ruff"); + this.leftRuff = this.leftLeg.getChild("left_ruff"); + this.rightToe = this.rightLeg.getChild("right_toe"); + this.leftToe = this.leftLeg.getChild("left_toe"); + } + + public static MeshDefinition addPieces(CubeDeformation deformation) { + MeshDefinition meshdefinition = HumanoidModel.createMesh(deformation, 0.0F); + PartDefinition partdefinition = meshdefinition.getRoot(); + + //bigger head + var head= partdefinition.addOrReplaceChild("head", + CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-4.5F, -7.5F, -4.0F, 9, 8, 8, deformation), + PartPose.offset(0.0F, 0.0F, 0.0F)); + + // add horns + addPairHorns(head, 1, -8.0F, 35F); + addPairHorns(head, 2, -6.0F, 15F); + addPairHorns(head, 3, -4.0F, -5F); + + + // change leg texture + var rightLeg = partdefinition.addOrReplaceChild("right_leg", + CubeListBuilder.create() + .texOffs(40, 0) + .addBox(-2.0F, 0.0F, -2.0F, 4, 12, 4, deformation), + PartPose.offset(-1.9F, 12.0F + 0.0F, 0.0F)); + + var leftLeg = partdefinition.addOrReplaceChild("left_leg", + CubeListBuilder.create() + .texOffs(40, 0).mirror() + .addBox(-2.0F, 0.0F, -2.0F, 4, 12, 4, deformation), + PartPose.offset(1.9F, 12.0F + 0.0F, 0.0F)); + + rightLeg.addOrReplaceChild("right_ruff", + CubeListBuilder.create() + .texOffs(40, 22) + .addBox(-2.5F, 0.0F, -2.5F, 5, 2, 5, deformation), + PartPose.offset(0.0F, 6.0F, 0.0F)); + + + leftLeg.addOrReplaceChild("left_ruff", + CubeListBuilder.create() + .texOffs(40, 22) + .addBox(-2.5F, 0.0F, -2.5F, 5, 2, 5, deformation), + PartPose.offset(0.0F, 6.0F, 0.0F)); + + + rightLeg.addOrReplaceChild("right_toe", + CubeListBuilder.create() + .texOffs(40, 17) + .addBox(-2.0F, 0.0F, -1.0F, 4, 2, 1, deformation), + PartPose.offset(0.0F, 10.0F, -2.0F)); + + + leftLeg.addOrReplaceChild("left_toe", + CubeListBuilder.create() + .texOffs(40, 17) + .addBox(-2.0F, 0.0F, -1.0F, 4, 2, 1, deformation), + PartPose.offset(0.0F, 10.0F, -2.0F)); + + + // stuff for chest and legs + partdefinition.addOrReplaceChild("body", + CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-4.0F, 0.0F, -2.0F, 8, 11, 4, deformation), + PartPose.offset(0.0F, 0.0F + 0.0f, 0.0F)); + + partdefinition.addOrReplaceChild("biped_leg_body", + CubeListBuilder.create() + .texOffs(40, 16) + .addBox(-4.0F, 0.0F, -2.0F, 8, 12, 4, deformation), + PartPose.offset(0.0F, 0.0F + 0.0f, 0.0F)); + + partdefinition.addOrReplaceChild("right_arm", + CubeListBuilder.create() + .texOffs(0, 16) + .addBox(-3.0F, -2.0F, -2.0F, 4, 10, 4, deformation), + PartPose.offset(-5.0F, 2.0F + 0.0f, 0.0F)); + + partdefinition.addOrReplaceChild("left_arm", + CubeListBuilder.create() + .texOffs(0, 16).mirror() + .addBox(-1.0F, -2.0F, -2.0F, 4, 10, 4, deformation), + PartPose.offset(5.0F, 2.0F + 0.0f, 0.0F)); + + return meshdefinition; + } + + @Override + protected Iterable bodyParts() { + return Iterables.concat(super.bodyParts(), ImmutableList.of(bipedLegBody)); + } + + private static void addPairHorns(PartDefinition partdefinition, int iter, float height, float zangle) { + + var leftBottom = partdefinition.addOrReplaceChild("horn_" + iter +"_left_bottom", + CubeListBuilder.create() + .texOffs(0, 19) + .addBox(-3.0F, -1.5F, -1.5F, 3, 3, 3), + PartPose.offsetAndRotation(-4.5F, height, -1.0F, + 0.0F, -30F / (180F / (float) Math.PI), zangle / (180F / (float) Math.PI))); + + leftBottom.addOrReplaceChild("horn_" + iter + "_left_top", + CubeListBuilder.create() + .texOffs(0, 26) + .addBox(-4.0F, -1.0F, -1.0F, 5, 2, 2), + PartPose.offsetAndRotation(-3.0F, 0.0F, 0.0F, + 0.0F, -20F / (180F / (float) Math.PI), zangle / (180F / (float) Math.PI))); + + var rightBottom = partdefinition.addOrReplaceChild("horn_" + iter + "_right_bottom", + CubeListBuilder.create() + .texOffs(0, 19) + .addBox(0.0F, -1.5F, -1.5F, 3, 3, 3), + PartPose.offsetAndRotation(4.5F, height, -1.0F, + 0.0F, 30F / (180F / (float) Math.PI), -zangle / (180F / (float) Math.PI))); + + rightBottom.addOrReplaceChild("horn_" + iter + "_right_top", + CubeListBuilder.create() + .texOffs(0, 26) + .addBox(-1.0F, -1.0F, -1.0F, 5, 2, 2), + PartPose.offsetAndRotation(3.0F, 0.0F, 0.0F, + 0.0F, 20F / (180F / (float) Math.PI), -zangle / (180F / (float) Math.PI))); + } + + @Override + public void setAllVisible(boolean visible) { + super.setAllVisible(visible); + bipedLegBody.visible = visible; + } + + @Override + public void renderToBuffer(PoseStack stack, VertexConsumer builder, int light, int overlay, float red, float green, float blue, float scale) { + switch (slot) { + case HEAD -> { + this.head.visible = true; + this.hat.visible = false; + this.body.visible = false; + this.rightArm.visible = false; + this.leftArm.visible = false; + this.bipedLegBody.visible = false; + this.rightLeg.visible = false; + this.leftLeg.visible = false; + } + case CHEST -> { + this.head.visible = false; + this.hat.visible = false; + this.body.visible = true; + this.rightArm.visible = true; + this.leftArm.visible = true; + this.bipedLegBody.visible = false; + this.rightLeg.visible = false; + this.leftLeg.visible = false; + } + case LEGS -> { + this.head.visible = false; + this.hat.visible = false; + this.body.visible = false; + this.rightArm.visible = false; + this.leftArm.visible = false; + this.bipedLegBody.visible = true; + this.rightLeg.visible = true; + this.leftLeg.visible = true; + this.leftRuff.visible = false; + this.leftToe.visible = false; + this.rightRuff.visible = false; + this.rightToe.visible = false; + } + case FEET -> { + this.head.visible = false; + this.hat.visible = false; + this.body.visible = false; + this.rightArm.visible = false; + this.leftArm.visible = false; + this.bipedLegBody.visible = false; + this.rightLeg.visible = true; + this.leftLeg.visible = true; + this.leftRuff.visible = true; + this.leftToe.visible = true; + this.rightRuff.visible = true; + this.rightToe.visible = true; + } + default -> { } + } + super.renderToBuffer(stack, builder, light, overlay, red, green, blue, scale); + //this.bipedLegBody.render(scale); + } +} diff --git a/src/main/java/twilightforest/client/model/armor/package-info.java b/src/main/java/twilightforest/client/model/armor/package-info.java new file mode 100644 index 0000000000..ab7291244d --- /dev/null +++ b/src/main/java/twilightforest/client/model/armor/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.client.model.armor; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/client/model/block/doors/CastleDoorBuilder.java b/src/main/java/twilightforest/client/model/block/doors/CastleDoorBuilder.java new file mode 100644 index 0000000000..113280073a --- /dev/null +++ b/src/main/java/twilightforest/client/model/block/doors/CastleDoorBuilder.java @@ -0,0 +1,17 @@ +package twilightforest.client.model.block.doors; + +import net.minecraftforge.client.model.generators.CustomLoaderBuilder; +import net.minecraftforge.client.model.generators.ModelBuilder; +import net.minecraftforge.common.data.ExistingFileHelper; +import twilightforest.TwilightForestMod; + +public class CastleDoorBuilder> extends CustomLoaderBuilder { + + protected CastleDoorBuilder(T parent, ExistingFileHelper existingFileHelper) { + super(TwilightForestMod.prefix("castle_door"), parent, existingFileHelper); + } + + public static > CastleDoorBuilder begin(T parent, ExistingFileHelper helper) { + return new CastleDoorBuilder<>(parent, helper); + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/client/model/block/doors/CastleDoorModel.java b/src/main/java/twilightforest/client/model/block/doors/CastleDoorModel.java new file mode 100644 index 0000000000..87348ae536 --- /dev/null +++ b/src/main/java/twilightforest/client/model/block/doors/CastleDoorModel.java @@ -0,0 +1,180 @@ +package twilightforest.client.model.block.doors; + +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.block.model.BakedQuad; +import net.minecraft.client.renderer.block.model.ItemOverrides; +import net.minecraft.client.renderer.block.model.ItemTransforms; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.util.RandomSource; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.BlockAndTintGetter; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.client.ChunkRenderTypeSet; +import net.minecraftforge.client.RenderTypeGroup; +import net.minecraftforge.client.model.IDynamicBakedModel; +import net.minecraftforge.client.model.data.ModelData; +import net.minecraftforge.client.model.data.ModelProperty; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import twilightforest.init.TFBlocks; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +@SuppressWarnings("deprecation") +public class CastleDoorModel implements IDynamicBakedModel { + @Nullable + private final List[] baseQuads; + private final BakedQuad[][][] quads; + private final TextureAtlasSprite particle; + private final ItemOverrides overrides; + private final ItemTransforms transforms; + private final ChunkRenderTypeSet blockRenderTypes; + private final List itemRenderTypes; + private final List fabulousItemRenderTypes; + //if we ever expand this model to be more flexible, I think we'll need a list of blocks that can connect together defined in the json instead of hardcoding this (tags may be nice for this) + private final Block[] validConnectors = {TFBlocks.PINK_CASTLE_DOOR.get(), TFBlocks.YELLOW_CASTLE_DOOR.get(), TFBlocks.BLUE_CASTLE_DOOR.get(), TFBlocks.VIOLET_CASTLE_DOOR.get()}; + private static final ModelProperty DATA = new ModelProperty<>(); + + public CastleDoorModel(@Nullable List[] baseQuads, BakedQuad[][][] quads, TextureAtlasSprite particle, ItemOverrides overrides, ItemTransforms transforms, RenderTypeGroup group) { + this.baseQuads = baseQuads; + this.quads = quads; + this.particle = particle; + this.overrides = overrides; + this.transforms = transforms; + this.blockRenderTypes = !group.isEmpty() ? ChunkRenderTypeSet.of(group.block()) : null; + this.itemRenderTypes = !group.isEmpty() ? List.of(group.entity()) : null; + this.fabulousItemRenderTypes = !group.isEmpty() ? List.of(group.entityFabulous()) : null; + } + + @NotNull + @Override + public List getQuads(@Nullable BlockState state, @Nullable Direction side, @NotNull RandomSource random, @NotNull ModelData extraData, @Nullable RenderType type) { + if (side != null) { + int faceIndex = side.get3DDataValue(); + CastleDoorData data = extraData.get(DATA); + ArrayList quads = new ArrayList<>(4 + (this.baseQuads != null ? 4 : 0)); + if (this.baseQuads != null) { + quads.addAll(this.baseQuads[faceIndex]); + } + + for (int quad = 0; quad < 4; ++quad) { + //if our model data is null (I really hope it isn't) we can skip connected textures since we dont have the info we need + //i'd rather do this than crash the game or skip rendering the block entirely + ConnectionLogic connectionType = data != null ? data.logic[faceIndex][quad] : ConnectionLogic.NONE; + quads.add(this.quads[faceIndex][quad][connectionType.ordinal()]); + } + + return quads; + } else { + return List.of(); + } + } + + @NotNull + @Override + public ModelData getModelData(@NotNull BlockAndTintGetter getter, @NotNull BlockPos pos, @NotNull BlockState state, @NotNull ModelData modelData) { + CastleDoorData data = new CastleDoorData(); + + for (Direction face : Direction.values()) { + Direction[] directions = ConnectionLogic.AXIS_PLANE_DIRECTIONS[face.getAxis().ordinal()]; + boolean[] sideStates = new boolean[4]; + + int faceIndex; + for (faceIndex = 0; faceIndex < directions.length; faceIndex++) { + sideStates[faceIndex] = this.shouldConnectSide(getter, pos, face, directions[faceIndex]); + } + + faceIndex = face.get3DDataValue(); + + for (int dir = 0; dir < directions.length; dir++) { + int cornerOffset = (dir + 1) % directions.length; + boolean side1 = sideStates[dir]; + boolean side2 = sideStates[cornerOffset]; + boolean corner = side1 && side2 && this.isCornerBlockPresent(getter, pos, face, directions[dir], directions[cornerOffset]); + data.logic[faceIndex][dir] = dir % 2 == 0 ? ConnectionLogic.of(side1, side2, corner) : ConnectionLogic.of(side2, side1, corner); + } + } + + return modelData.derive().with(DATA, data).build(); + } + + private boolean shouldConnectSide(BlockAndTintGetter getter, BlockPos pos, Direction face, Direction side) { + BlockState neighborState = getter.getBlockState(pos.relative(side)); + return Arrays.stream(this.validConnectors).anyMatch(neighborState::is) && Block.shouldRenderFace(neighborState, getter, pos, face, pos.relative(face)); + } + + private boolean isCornerBlockPresent(BlockAndTintGetter getter, BlockPos pos, Direction face, Direction side1, Direction side2) { + BlockState neighborState = getter.getBlockState(pos.relative(side1).relative(side2)); + return Arrays.stream(this.validConnectors).anyMatch(neighborState::is) && Block.shouldRenderFace(neighborState, getter, pos, face, pos.relative(face)); + } + + @Override + public boolean useAmbientOcclusion() { + return true; + } + + @Override + public boolean isGui3d() { + return true; + } + + @Override + public boolean usesBlockLight() { + return true; + } + + @Override + public boolean isCustomRenderer() { + return false; + } + + @NotNull + @Override + public TextureAtlasSprite getParticleIcon() { + return this.particle; + } + + @NotNull + @Override + public ItemOverrides getOverrides() { + return this.overrides; + } + + @NotNull + @Override + public ItemTransforms getTransforms() { + return this.transforms; + } + + @NotNull + @Override + public ChunkRenderTypeSet getRenderTypes(@NotNull BlockState state, @NotNull RandomSource rand, @NotNull ModelData data) { + return this.blockRenderTypes != null ? this.blockRenderTypes : IDynamicBakedModel.super.getRenderTypes(state, rand, data); + } + + @NotNull + @Override + public List getRenderTypes(@NotNull ItemStack stack, boolean fabulous) { + if (!fabulous) { + if (this.itemRenderTypes != null) { + return this.itemRenderTypes; + } + } else if (this.fabulousItemRenderTypes != null) { + return this.fabulousItemRenderTypes; + } + + return IDynamicBakedModel.super.getRenderTypes(stack, fabulous); + } + + //we need a class to make model data. Fine, here you go + private static final class CastleDoorData { + private final ConnectionLogic[][] logic = new ConnectionLogic[6][4]; + + private CastleDoorData() {} + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/client/model/block/doors/CastleDoorModelLoader.java b/src/main/java/twilightforest/client/model/block/doors/CastleDoorModelLoader.java new file mode 100644 index 0000000000..dc25bb26b1 --- /dev/null +++ b/src/main/java/twilightforest/client/model/block/doors/CastleDoorModelLoader.java @@ -0,0 +1,17 @@ +package twilightforest.client.model.block.doors; + +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonObject; +import com.google.gson.JsonParseException; +import net.minecraftforge.client.model.geometry.IGeometryLoader; + +public class CastleDoorModelLoader implements IGeometryLoader { + public static final CastleDoorModelLoader INSTANCE = new CastleDoorModelLoader(); + + public CastleDoorModelLoader() { + } + + public UnbakedCastleDoorModel read(JsonObject jsonObject, JsonDeserializationContext deserializationContext) throws JsonParseException { + return new UnbakedCastleDoorModel(); + } +} diff --git a/src/main/java/twilightforest/client/model/block/doors/ConnectionLogic.java b/src/main/java/twilightforest/client/model/block/doors/ConnectionLogic.java new file mode 100644 index 0000000000..01cc736e32 --- /dev/null +++ b/src/main/java/twilightforest/client/model/block/doors/ConnectionLogic.java @@ -0,0 +1,72 @@ +package twilightforest.client.model.block.doors; + +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.core.Direction; + +//let the magic begin. +//as far as I understand, CTM texture sheets are laid out in 4 pieces: +// - cornerless connections in the top left +// - vertical connections in the top right +// - horizontal connections in the bottom left +// - corner connection in the bottom right +//each quadrant is composed of a 4x4 piece for each rotation that the model can pick based on where on the block the connection is happening. +//to avoid confusion: cornerless means that no corner piece renders. This happens when you have a block horizontally, vertically, and filling that corner space between the 2. +// ** +// ** +//while a corner means that a corner piece will render. This happens when you have a block horizontally and vertically, but theres no block in the corner. +// * +// ** +public enum ConnectionLogic { + + NONE(0, 0, 0, 16, 16), + CORNERLESS(1, 0, 0, 8, 8), + VERTICAL(1, 0, 8, 8, 16), + HORIZONTAL(1, 8, 0, 16, 8), + CORNER(1, 8, 8, 16, 16); + + private final int texture; + private final int u0; + private final int v0; + private final int u1; + private final int v1; + + public static final Direction[][] AXIS_PLANE_DIRECTIONS = new Direction[][]{ + {Direction.UP, Direction.NORTH, Direction.DOWN, Direction.SOUTH}, + {Direction.NORTH, Direction.EAST, Direction.SOUTH, Direction.WEST}, + {Direction.UP, Direction.EAST, Direction.DOWN, Direction.WEST} + }; + + ConnectionLogic(int texture, int u0, int v0, int u1, int v1) { + this.texture = texture; + this.u0 = u0; + this.v0 = v0; + this.u1 = u1; + this.v1 = v1; + } + + public static ConnectionLogic of(boolean horizontal, boolean vertical, boolean corner) { + if (corner) { + return CORNERLESS; + } else if (horizontal) { + return vertical ? CORNER : HORIZONTAL; + } else { + return vertical ? VERTICAL : NONE; + } + } + + public TextureAtlasSprite chooseTexture(TextureAtlasSprite[] sprites) { + return sprites[this.texture]; + } + + public float[] remapUVs(float[] uvs) { + return new float[]{this.getU(uvs[0]), this.getV(uvs[1]), this.getU(uvs[2]), this.getV(uvs[3])}; + } + + public float getU(float delta) { + return (float) this.u0 + (float) (this.u1 - this.u0) * (delta / 16.0F); + } + + public float getV(float delta) { + return (float) this.v0 + (float) (this.v1 - this.v0) * (delta / 16.0F); + } +} diff --git a/src/main/java/twilightforest/client/model/block/doors/UnbakedCastleDoorModel.java b/src/main/java/twilightforest/client/model/block/doors/UnbakedCastleDoorModel.java new file mode 100644 index 0000000000..d367fa7665 --- /dev/null +++ b/src/main/java/twilightforest/client/model/block/doors/UnbakedCastleDoorModel.java @@ -0,0 +1,96 @@ +package twilightforest.client.model.block.doors; + +import com.mojang.datafixers.util.Pair; +import com.mojang.math.Transformation; +import net.minecraftforge.client.model.ForgeFaceData; +import org.joml.Vector3f; +import net.minecraft.client.renderer.block.model.*; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.client.resources.model.*; +import net.minecraft.core.Direction; +import net.minecraft.core.Vec3i; +import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.client.RenderTypeGroup; +import net.minecraftforge.client.model.SimpleModelState; +import net.minecraftforge.client.model.geometry.IGeometryBakingContext; +import net.minecraftforge.client.model.geometry.IUnbakedGeometry; +import net.minecraftforge.client.model.geometry.UnbakedGeometryHelper; + +import java.lang.reflect.Array; +import java.util.*; +import java.util.function.Function; + +//for now, im keeping this hardcoded to a 2 layer block, with the overlay layer being fullbright and tinted. +//It might be worth expanding this in the future to be more flexible for other kinds of blocks (1 layer blocks, determining emissivity and tinting per layer, maybe >2 layer blocks?) but for now, I see no point. +//I only wanted this system for castle doors after all! +public class UnbakedCastleDoorModel implements IUnbakedGeometry { + + private final BlockElement[][] baseElements; + private final BlockElement[][][] faceElements; + + public UnbakedCastleDoorModel() { + //base elements - the base block. No Connected Textures on this bit. + //the array is made of the directions and quads + this.baseElements = new BlockElement[6][4]; + + //face elements - the connected bit of the model. + //the array is made of the directions, quads, and each logic value in the ConnectionLogic class + //645 shows up quite a few times, I call it the magic number + this.faceElements = new BlockElement[6][4][5]; + Vec3i center = new Vec3i(8, 8, 8); + + for (Direction face : Direction.values()) { + Direction[] planeDirections = ConnectionLogic.AXIS_PLANE_DIRECTIONS[face.getAxis().ordinal()]; + + for (int quad = 0; quad < 4; quad++) { + Vec3i corner = face.getNormal().offset(planeDirections[quad].getNormal()).offset(planeDirections[(quad + 1) % 4].getNormal()).offset(1, 1, 1).multiply(8); + BlockElement element = new BlockElement(new Vector3f((float) Math.min(center.getX(), corner.getX()), (float) Math.min(center.getY(), corner.getY()), (float) Math.min(center.getZ(), corner.getZ())), new Vector3f((float) Math.max(center.getX(), corner.getX()), (float) Math.max(center.getY(), corner.getY()), (float) Math.max(center.getZ(), corner.getZ())), Map.of(), null, true); + this.baseElements[face.get3DDataValue()][quad] = new BlockElement(element.from, element.to, Map.of(face, new BlockElementFace(face, -1, "", new BlockFaceUV(ConnectionLogic.NONE.remapUVs(element.uvsByFace(face)), 0), null)), null, true); + + for (ConnectionLogic connectionType : ConnectionLogic.values()) { + this.faceElements[face.get3DDataValue()][quad][connectionType.ordinal()] = new BlockElement(element.from, element.to, Map.of(face, new BlockElementFace(face, 0, "", new BlockFaceUV(connectionType.remapUVs(element.uvsByFace(face)), 0), new ForgeFaceData(0xFFFFFFFF, 15, 15, true))), null, true); + } + } + } + } + + @Override + public BakedModel bake(IGeometryBakingContext context, ModelBaker baker, Function spriteGetter, ModelState modelState, ItemOverrides overrides, ResourceLocation modelLocation) { + Transformation transformation = context.getRootTransform(); + if (!transformation.isIdentity()) { + modelState = new SimpleModelState(modelState.getRotation().compose(transformation), modelState.isUvLocked()); + } + + //making an array list like this is cursed, would not recommend + @SuppressWarnings("unchecked") //this is fine, I hope + List[] baseQuads = (List[]) Array.newInstance(List.class, 6); + TextureAtlasSprite baseTexture = spriteGetter.apply(context.getMaterial("base")); + + for (int dir = 0; dir < 6; dir++) { + baseQuads[dir] = new ArrayList<>(); + + for (BlockElement element : this.baseElements[dir]) { + baseQuads[dir].add(UnbakedGeometryHelper.bakeElementFace(element, element.faces.values().iterator().next(), baseTexture, Direction.values()[dir], modelState, modelLocation)); + } + } + + //we'll use this to figure out which texture to use with the Connected Texture logic + //NONE uses the first one, everything else uses the 2nd one + TextureAtlasSprite[] sprites = new TextureAtlasSprite[]{spriteGetter.apply(context.getMaterial("overlay")), spriteGetter.apply(context.getMaterial("overlay_connected"))}; + + BakedQuad[][][] quads = new BakedQuad[6][4][5]; + + for (int dir = 0; dir < 6; dir++) { + for (int quad = 0; quad < 4; quad++) { + for (int type = 0; type < 5; type++) { + BlockElement element = this.faceElements[dir][quad][type]; + quads[dir][quad][type] = UnbakedGeometryHelper.bakeElementFace(element, element.faces.values().iterator().next(), ConnectionLogic.values()[type].chooseTexture(sprites), Direction.values()[dir], modelState, modelLocation); + } + } + } + + ResourceLocation renderTypeHint = context.getRenderTypeHint(); + RenderTypeGroup renderTypes = renderTypeHint != null ? context.getRenderType(renderTypeHint) : RenderTypeGroup.EMPTY; + return new CastleDoorModel(baseQuads, quads, spriteGetter.apply(context.getMaterial("particle")), overrides, context.getTransforms(), renderTypes); + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/client/model/block/doors/package-info.java b/src/main/java/twilightforest/client/model/block/doors/package-info.java new file mode 100644 index 0000000000..ff35db16cf --- /dev/null +++ b/src/main/java/twilightforest/client/model/block/doors/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.client.model.block.doors; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/client/model/block/giantblock/GiantBlockBuilder.java b/src/main/java/twilightforest/client/model/block/giantblock/GiantBlockBuilder.java new file mode 100644 index 0000000000..4de21974a1 --- /dev/null +++ b/src/main/java/twilightforest/client/model/block/giantblock/GiantBlockBuilder.java @@ -0,0 +1,43 @@ +package twilightforest.client.model.block.giantblock; + +import com.google.common.base.Preconditions; +import com.google.gson.JsonObject; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.Block; +import net.minecraftforge.client.model.generators.CustomLoaderBuilder; +import net.minecraftforge.client.model.generators.ModelBuilder; +import net.minecraftforge.common.data.ExistingFileHelper; +import net.minecraftforge.registries.ForgeRegistries; +import twilightforest.TwilightForestMod; + +public class GiantBlockBuilder> extends CustomLoaderBuilder { + + public static > GiantBlockBuilder begin(T parent, ExistingFileHelper helper) { + return new GiantBlockBuilder<>(parent, helper); + } + + private ResourceLocation parentBlock; + + protected GiantBlockBuilder(T parent, ExistingFileHelper helper) { + super(TwilightForestMod.prefix("giant_block"), parent, helper); + } + + public GiantBlockBuilder parentBlock(Block block) { + Preconditions.checkNotNull(block, "parent block must not be null"); + this.parentBlock = ForgeRegistries.BLOCKS.getKey(block); + return this; + } + + @Override + public T end() { + Preconditions.checkNotNull(this.parentBlock, "giant block must have a parent block"); + return super.end(); + } + + @Override + public JsonObject toJson(JsonObject json) { + json = super.toJson(json); + json.addProperty("parent_block", this.parentBlock.toString()); + return json; + } +} diff --git a/src/main/java/twilightforest/client/model/block/giantblock/GiantBlockModel.java b/src/main/java/twilightforest/client/model/block/giantblock/GiantBlockModel.java new file mode 100644 index 0000000000..94ea8a1dd6 --- /dev/null +++ b/src/main/java/twilightforest/client/model/block/giantblock/GiantBlockModel.java @@ -0,0 +1,181 @@ +package twilightforest.client.model.block.giantblock; + +import com.google.common.collect.Iterables; +import org.joml.Vector3f; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.block.model.*; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.client.resources.model.BlockModelRotation; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.RandomSource; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.BlockAndTintGetter; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.client.ChunkRenderTypeSet; +import net.minecraftforge.client.RenderTypeGroup; +import net.minecraftforge.client.model.IDynamicBakedModel; +import net.minecraftforge.client.model.data.ModelData; +import net.minecraftforge.client.model.data.ModelProperty; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import twilightforest.block.GiantBlock; +import twilightforest.util.Vec2i; + +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; + +public class GiantBlockModel implements IDynamicBakedModel { + + private static final ModelProperty DATA = new ModelProperty<>(); + private static final FaceBakery FACE_BAKERY = new FaceBakery(); + + private final TextureAtlasSprite[] textures; + private final TextureAtlasSprite particle; + private final ItemOverrides overrides; + private final ItemTransforms transforms; + private final ChunkRenderTypeSet blockRenderTypes; + private final List itemRenderTypes; + private final List fabulousItemRenderTypes; + + public GiantBlockModel(TextureAtlasSprite[] texture, TextureAtlasSprite particle, ItemOverrides overrides, ItemTransforms transforms, RenderTypeGroup group) { + this.textures = texture; + this.particle = particle; + this.overrides = overrides; + this.transforms = transforms; + this.blockRenderTypes = !group.isEmpty() ? ChunkRenderTypeSet.of(group.block()) : null; + this.itemRenderTypes = !group.isEmpty() ? List.of(group.entity()) : null; + this.fabulousItemRenderTypes = !group.isEmpty() ? List.of(group.entityFabulous()) : null; + } + + @Override + public @NotNull List getQuads(@Nullable BlockState state, @Nullable Direction side, @NotNull RandomSource rand, @NotNull ModelData extraData, @Nullable RenderType renderType) { + List quads = new ArrayList<>(); + + if (extraData.has(DATA) && side != null) { + BlockPos pos = extraData.get(DATA).pos(); + Vec2i coords = this.calculateOffset(side, pos.offset(this.magicOffsetFromDir(side))); + + TextureAtlasSprite sprite = this.textures[this.textures.length > 1 ? side.ordinal() : 0]; + + if (!Iterables.contains(GiantBlock.getVolume(pos), pos.offset(side.getNormal()))) { + quads.add(FACE_BAKERY.bakeQuad(new Vector3f(0.0F, 0.0F, 0.0F), new Vector3f(16.0F, 16.0F, 16.0F), new BlockElementFace(side, side.ordinal(), side.name(), new BlockFaceUV(new float[]{0.0F + coords.x, 0.0F + coords.z, 4.0F + coords.x, 4.0F + coords.z}, 0)), sprite, side, BlockModelRotation.X0_Y0, null, false, new ResourceLocation(sprite.atlasLocation().getNamespace(), sprite.atlasLocation().getPath() + "_" + side.name().toLowerCase(Locale.ROOT)))); + } + } + + return quads; + } + + //based on the offsets written in the original giant block json + private BlockPos magicOffsetFromDir(Direction side) { + return switch (side) { + default -> new BlockPos(0, 0, -1); + case DOWN -> new BlockPos(0, 0, 2); + case NORTH, SOUTH -> new BlockPos(0, 1, 0); + case WEST, EAST -> new BlockPos(0, 1, -1); + }; + } + + //an offset is calculated between 0 and 15 based on which side its on. + //it then grabs the remainder after dividing by 4 and then multiply by 4 to scale correctly + private Vec2i calculateOffset(Direction side, BlockPos pos) { + int x = pos.getX(); + int y = pos.getY(); + int z = pos.getZ(); + + int offsetX, offsetY; + + if (side.getAxis().isVertical()) { + offsetX = x % 4; + offsetY = (side.getStepY() * z + 1) % 4; + } else if (side.getAxis() == Direction.Axis.Z) { + offsetX = x % 4; + offsetY = -y % 4; + } else { + offsetX = (z + 1) % 4; + offsetY = -y % 4; + } + + if (side == Direction.NORTH || side == Direction.EAST) { + offsetX = (4 - offsetX - 1) % 4; + } + + if (offsetX < 0) { + offsetX += 16; + } + if (offsetY < 0) { + offsetY += 16; + } + + return new Vec2i((offsetX % 4) * 4, (offsetY % 4) * 4); + } + + @Override + public @NotNull ModelData getModelData(@NotNull BlockAndTintGetter level, @NotNull BlockPos pos, @NotNull BlockState state, @NotNull ModelData modelData) { + if (modelData == ModelData.EMPTY) { + modelData = ModelData.builder().with(DATA, new GiantBlockData(level, pos)).build(); + } + return modelData; + } + + @Override + public boolean useAmbientOcclusion() { + return false; + } + + @Override + public boolean isGui3d() { + return true; + } + + @Override + public boolean usesBlockLight() { + return true; + } + + @Override + public boolean isCustomRenderer() { + return false; + } + + @Override + public TextureAtlasSprite getParticleIcon() { + return this.particle; + } + + @Override + public ItemOverrides getOverrides() { + return this.overrides; + } + + @NotNull + @Override + public ItemTransforms getTransforms() { + return this.transforms; + } + + @NotNull + @Override + public ChunkRenderTypeSet getRenderTypes(@NotNull BlockState state, @NotNull RandomSource rand, @NotNull ModelData data) { + return this.blockRenderTypes != null ? this.blockRenderTypes : IDynamicBakedModel.super.getRenderTypes(state, rand, data); + } + + @NotNull + @Override + public List getRenderTypes(@NotNull ItemStack stack, boolean fabulous) { + if (!fabulous) { + if (this.itemRenderTypes != null) { + return this.itemRenderTypes; + } + } else if (this.fabulousItemRenderTypes != null) { + return this.fabulousItemRenderTypes; + } + + return IDynamicBakedModel.super.getRenderTypes(stack, fabulous); + } + + //modeldata holder + public record GiantBlockData(BlockAndTintGetter getter, BlockPos pos) {} +} diff --git a/src/main/java/twilightforest/client/model/block/giantblock/GiantBlockModelLoader.java b/src/main/java/twilightforest/client/model/block/giantblock/GiantBlockModelLoader.java new file mode 100644 index 0000000000..a00d853982 --- /dev/null +++ b/src/main/java/twilightforest/client/model/block/giantblock/GiantBlockModelLoader.java @@ -0,0 +1,20 @@ +package twilightforest.client.model.block.giantblock; + +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonObject; +import com.google.gson.JsonParseException; +import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.client.model.geometry.IGeometryLoader; + +public class GiantBlockModelLoader implements IGeometryLoader { + + public static final GiantBlockModelLoader INSTANCE = new GiantBlockModelLoader(); + + @Override + public UnbakedGiantBlockModel read(JsonObject object, JsonDeserializationContext deserializationContext) throws JsonParseException { + ResourceLocation parent = ResourceLocation.tryParse(object.get("parent_block").getAsString()); + + assert parent != null; + return new UnbakedGiantBlockModel(parent); + } +} diff --git a/src/main/java/twilightforest/client/model/block/giantblock/UnbakedGiantBlockModel.java b/src/main/java/twilightforest/client/model/block/giantblock/UnbakedGiantBlockModel.java new file mode 100644 index 0000000000..ccc4574edb --- /dev/null +++ b/src/main/java/twilightforest/client/model/block/giantblock/UnbakedGiantBlockModel.java @@ -0,0 +1,35 @@ +package twilightforest.client.model.block.giantblock; + +import com.mojang.datafixers.util.Pair; +import net.minecraft.client.renderer.block.model.ItemOverrides; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.client.resources.model.*; +import net.minecraft.core.Direction; +import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.client.RenderTypeGroup; +import net.minecraftforge.client.model.geometry.IGeometryBakingContext; +import net.minecraftforge.client.model.geometry.IUnbakedGeometry; + +import java.util.*; +import java.util.function.Function; + +public record UnbakedGiantBlockModel(ResourceLocation parent) implements IUnbakedGeometry { + + @Override + public BakedModel bake(IGeometryBakingContext context, ModelBaker baker, Function spriteGetter, ModelState modelState, ItemOverrides overrides, ResourceLocation modelLocation) { + TextureAtlasSprite[] sprites; + if (context.hasMaterial("all")) { + sprites = new TextureAtlasSprite[]{spriteGetter.apply(context.getMaterial("all"))}; + } else { + ArrayList materials = new ArrayList<>(); + for (Direction dir : Direction.values()) { + materials.add(spriteGetter.apply(context.getMaterial(dir.getName().toLowerCase(Locale.ROOT)))); + } + sprites = materials.toArray(new TextureAtlasSprite[]{}); + } + + ResourceLocation renderTypeHint = context.getRenderTypeHint(); + RenderTypeGroup renderTypes = renderTypeHint != null ? context.getRenderType(renderTypeHint) : RenderTypeGroup.EMPTY; + return new GiantBlockModel(sprites, spriteGetter.apply(context.getMaterial("particle")), overrides, context.getTransforms(), renderTypes); + } +} diff --git a/src/main/java/twilightforest/client/model/block/giantblock/package-info.java b/src/main/java/twilightforest/client/model/block/giantblock/package-info.java new file mode 100644 index 0000000000..3d483cd4be --- /dev/null +++ b/src/main/java/twilightforest/client/model/block/giantblock/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.client.model.block.giantblock; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/client/model/block/leaves/BakedLeavesModel.java b/src/main/java/twilightforest/client/model/block/leaves/BakedLeavesModel.java new file mode 100644 index 0000000000..0dc5b2f488 --- /dev/null +++ b/src/main/java/twilightforest/client/model/block/leaves/BakedLeavesModel.java @@ -0,0 +1,34 @@ +package twilightforest.client.model.block.leaves; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.block.model.BakedQuad; +import net.minecraft.client.renderer.block.model.BlockModel; +import net.minecraft.client.resources.model.BakedModel; +import net.minecraft.core.Direction; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.client.ChunkRenderTypeSet; +import net.minecraftforge.client.model.BakedModelWrapper; +import net.minecraftforge.client.model.data.ModelData; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public class BakedLeavesModel extends BakedModelWrapper { + + public BakedLeavesModel(BakedModel originalModel) { + super(originalModel); + } + + @Override + public @NotNull List getQuads(@Nullable BlockState state, @Nullable Direction side, @NotNull RandomSource rand, @NotNull ModelData extraData, @Nullable RenderType renderType) { + return super.getQuads(state, side, rand, extraData, null); + } + + @Override + public ChunkRenderTypeSet getRenderTypes(@NotNull BlockState state, @NotNull RandomSource rand, @NotNull ModelData data) { + return ChunkRenderTypeSet.of(Minecraft.useFancyGraphics() ? RenderType.cutoutMipped() : RenderType.solid()); + } +} diff --git a/src/main/java/twilightforest/client/model/block/leaves/package-info.java b/src/main/java/twilightforest/client/model/block/leaves/package-info.java new file mode 100644 index 0000000000..6f781f7631 --- /dev/null +++ b/src/main/java/twilightforest/client/model/block/leaves/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.client.model.block.leaves; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/client/model/block/patch/PatchModel.java b/src/main/java/twilightforest/client/model/block/patch/PatchModel.java new file mode 100644 index 0000000000..0ebbdc9227 --- /dev/null +++ b/src/main/java/twilightforest/client/model/block/patch/PatchModel.java @@ -0,0 +1,232 @@ +package twilightforest.client.model.block.patch; + +import com.mojang.math.Transformation; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.block.model.*; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.client.resources.model.BakedModel; +import net.minecraft.core.Direction; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.AABB; +import net.minecraftforge.client.ChunkRenderTypeSet; +import net.minecraftforge.client.model.SimpleModelState; +import net.minecraftforge.client.model.data.ModelData; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.joml.Vector3f; +import twilightforest.block.PatchBlock; +import twilightforest.init.TFBlocks; + +import java.util.ArrayList; +import java.util.List; + +/* Unlike the usual way models are done, this takes more of a state-oriented approach. + * It is suboptimal but please, be my guest if you wish to see it improved */ +public record PatchModel(ResourceLocation location, TextureAtlasSprite texture, boolean shaggify) implements BakedModel { + private static final FaceBakery BAKERY = new FaceBakery(); + + // POOLED - not threadsafe + private static final Vector3f MIN = new Vector3f(0, 0, 0); + private static final Vector3f MAX = new Vector3f(0, 0, 0); + + private void setVectors(AABB bb) { + MIN.set((float) bb.minX, (float) bb.minY, (float) bb.minZ); + MAX.set((float) bb.maxX, (float) bb.maxY, (float) bb.maxZ); + } + + private void setVectors(AABB bb, boolean north, boolean east, boolean south, boolean west) { + MIN.set(west ? 0 : (float) bb.minX, (float) bb.minY, north ? 0 : (float) bb.minZ); + MAX.set(east ? 16 : (float) bb.maxX, (float) bb.maxY, south ? 16 : (float) bb.maxZ); + } + + @Override + public List getQuads(@Nullable BlockState state, @Nullable Direction side, RandomSource random) { + if (state == null) + return this.getQuads(false, false, false, false, PatchBlock.AABBFromRandom(random), random); + else + return this.getQuads(state.getValue(PatchBlock.NORTH), state.getValue(PatchBlock.EAST), state.getValue(PatchBlock.SOUTH), state.getValue(PatchBlock.WEST), PatchBlock.AABBFromRandom(random), random); + } + + private List getQuads(boolean north, boolean east, boolean south, boolean west, AABB bb, RandomSource random) { + List list = new ArrayList<>(); + + this.setVectors(bb, north, east, south, west); + + this.quadsFromAABB(list); + + if (!this.shaggify()) + return list; + + // This has to be set without connections or else there will be inconsistency problems + this.setVectors(bb); + + // add on shaggy edges + if (MIN.x() > 0) { + float originalMaxZ = MAX.z(); + + long seed = random.nextLong(); + seed = seed * seed * 42317861L + seed * 7L; + + int num0 = (int) (seed >> 12 & 3L) + 1; + int num1 = (int) (seed >> 15 & 3L) + 1; + int num2 = (int) (seed >> 18 & 3L) + 1; + int num3 = (int) (seed >> 21 & 3L) + 1; + + MAX.x = MIN.x(); + MIN.add(-1, 0, num0); + if (MAX.z() - ((num1 + num2 + num3)) > MIN.z()) { + // draw two blobs + MAX.z = MIN.z() + num1; + this.quadsFromAABB(list); + MAX.z = originalMaxZ - num2; + MIN.z = MAX.z() - num3; + this.quadsFromAABB(list); + } else { + //draw one blob + MAX.add(0, 0, -num2); + this.quadsFromAABB(list); + } + + // reset render bounds + this.setVectors(bb); + } + if (MAX.x() < 16F) { + float originalMaxZ = MAX.z(); + + long seed = random.nextLong(); + seed = seed * seed * 42317861L + seed * 17L; + + int num0 = (int) (seed >> 12 & 3L) + 1; + int num1 = (int) (seed >> 15 & 3L) + 1; + int num2 = (int) (seed >> 18 & 3L) + 1; + int num3 = (int) (seed >> 21 & 3L) + 1; + + MIN.x = MAX.x(); + MAX.add(1, 0, 0); + MIN.add(0, 0, num0); + if (MAX.z() - ((num1 +num2 + num3)) > MIN.z()) { + // draw two blobs + MAX.z = MIN.z() + num1; + this.quadsFromAABB(list); + MAX.z = originalMaxZ - num2; + MIN.z = MAX.z() - num3; + this.quadsFromAABB(list); + } else { + //draw one blob + MAX.add(0, 0, -num2); + this.quadsFromAABB(list); + } + // reset render bounds + this.setVectors(bb); + } + if (MIN.z() > 0) { + float originalMaxX = MAX.x(); + + long seed = random.nextLong(); + seed = seed * seed * 42317861L + seed * 23L; + + int num0 = (int) (seed >> 12 & 3L) + 1; + int num1 = (int) (seed >> 15 & 3L) + 1; + int num2 = (int) (seed >> 18 & 3L) + 1; + int num3 = (int) (seed >> 21 & 3L) + 1; + + MAX.z = MIN.z(); + MIN.add(num0, 0, -1F); + MAX.x = MIN.x() + num1; + this.quadsFromAABB(list); + MAX.x = originalMaxX - num2; + MIN.x = MAX.x() - num3; + this.quadsFromAABB(list); + // reset render bounds + this.setVectors(bb); + } + if (MAX.z() < 16F) { + float originalMaxX = MAX.x(); + + long seed = random.nextLong(); + seed = seed * seed * 42317861L + seed * 11L; + + int num0 = (int) (seed >> 12 & 3L) + 1; + int num1 = (int) (seed >> 15 & 3L) + 1; + int num2 = (int) (seed >> 18 & 3L) + 1; + int num3 = (int) (seed >> 21 & 3L) + 1; + + MIN.z = MAX.z(); + MAX.add(0, 0, 1F); + MIN.add(num0, 0, 0); + MAX.x = MIN.x() + num1; + this.quadsFromAABB(list); + MAX.x = originalMaxX - num2; + MIN.x = MAX.x() - num3; + this.quadsFromAABB(list); + // reset render bounds + this.setVectors(bb); + } + + return list; + } + + // FIXME I'm open for a efficient way of putting quads but this is good enough without reading through a bunch of method chains to duplicate behavior + // For now this works, especially when the blocks won't generate frequently on worldgen + private void quadsFromAABB(List quads) { + quads.add(this.quadFromVectors(MIN, MAX, Direction.UP)); + quads.add(this.quadFromVectors(MIN, MAX, Direction.NORTH)); + quads.add(this.quadFromVectors(MIN, MAX, Direction.EAST)); + quads.add(this.quadFromVectors(MIN, MAX, Direction.SOUTH)); + quads.add(this.quadFromVectors(MIN, MAX, Direction.WEST)); + } + + private BakedQuad quadFromVectors(Vector3f min, Vector3f max, Direction direction) { + BlockElementFace face = new BlockElementFace(null, 0, this.texture().atlasLocation().toString(), switch (direction) { + case NORTH -> new BlockFaceUV(new float[] { max.x(), min.z() + 1f, min.x(), min.z() }, 0); + case EAST -> new BlockFaceUV(new float[] { max.x(), min.z(), max.x() - 1f, max.z() }, 90); + case SOUTH -> new BlockFaceUV(new float[] { min.x(), max.z(), max.x(), max.z() - 1f }, 0); + case WEST -> new BlockFaceUV(new float[] { min.x(), max.z(), min.x() + 1f, min.z() }, 90); + default -> new BlockFaceUV(new float[] { min.x(), min.z(), max.x(), max.z() }, 0); + }); + + return BAKERY.bakeQuad(min, max, face, this.texture(), direction, new SimpleModelState(Transformation.identity()), null, true, this.location); + } + + // --- Boilerplating --------------------------------------------------- + + @Override + public boolean useAmbientOcclusion() { + return false; + } + + @Override + public boolean isGui3d() { + return false; + } + + @Override + public boolean usesBlockLight() { + return false; + } + + @Override + public boolean isCustomRenderer() { + return false; + } + + @Override + public TextureAtlasSprite getParticleIcon() { + return this.texture; + } + + @Override + public ItemOverrides getOverrides() { + return ItemOverrides.EMPTY; //I doubt we need to do anything here + } + + @Override + public ChunkRenderTypeSet getRenderTypes(@NotNull BlockState state, @NotNull RandomSource rand, @NotNull ModelData data) { + if (state.is(TFBlocks.CLOVER_PATCH.get())) { + return ChunkRenderTypeSet.of(RenderType.cutout()); + } + return BakedModel.super.getRenderTypes(state, rand, data); + } +} diff --git a/src/main/java/twilightforest/client/model/block/patch/PatchModelLoader.java b/src/main/java/twilightforest/client/model/block/patch/PatchModelLoader.java new file mode 100644 index 0000000000..c0ed4ecbb9 --- /dev/null +++ b/src/main/java/twilightforest/client/model/block/patch/PatchModelLoader.java @@ -0,0 +1,23 @@ +package twilightforest.client.model.block.patch; + +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonObject; +import com.google.gson.JsonParseException; +import com.mojang.realmsclient.util.JsonUtils; +import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.client.model.geometry.IGeometryLoader; + +public final class PatchModelLoader implements IGeometryLoader { + public static final PatchModelLoader INSTANCE = new PatchModelLoader(); + + private PatchModelLoader() { + } + + @Override + public UnbakedPatchModel read(JsonObject object, JsonDeserializationContext deserializationContext) throws JsonParseException { + if (!object.has("texture")) + throw new JsonParseException("Patch model missing value for 'texture'."); + + return new UnbakedPatchModel(new ResourceLocation(object.get("texture").getAsString()), JsonUtils.getBooleanOr("shaggify", object, false)); + } +} diff --git a/src/main/java/twilightforest/client/model/block/patch/UnbakedPatchModel.java b/src/main/java/twilightforest/client/model/block/patch/UnbakedPatchModel.java new file mode 100644 index 0000000000..49e487d179 --- /dev/null +++ b/src/main/java/twilightforest/client/model/block/patch/UnbakedPatchModel.java @@ -0,0 +1,26 @@ +package twilightforest.client.model.block.patch; + +import com.mojang.datafixers.util.Pair; +import net.minecraft.client.renderer.block.model.ItemOverrides; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.client.resources.model.*; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.inventory.InventoryMenu; +import net.minecraftforge.client.model.geometry.IGeometryBakingContext; +import net.minecraftforge.client.model.geometry.IUnbakedGeometry; + +import java.util.Collection; +import java.util.Collections; +import java.util.Set; +import java.util.function.Function; + +public record UnbakedPatchModel(Material material, boolean shaggify) implements IUnbakedGeometry { + public UnbakedPatchModel(ResourceLocation texture, boolean shaggify) { + this(new Material(InventoryMenu.BLOCK_ATLAS, texture), shaggify); + } + + @Override + public BakedModel bake(IGeometryBakingContext owner, ModelBaker baker, Function spriteGetter, ModelState modelTransform, ItemOverrides overrides, ResourceLocation modelLocation) { + return new PatchModel(modelLocation, spriteGetter.apply(this.material()), this.shaggify()); + } +} diff --git a/src/main/java/twilightforest/client/model/block/patch/package-info.java b/src/main/java/twilightforest/client/model/block/patch/package-info.java new file mode 100644 index 0000000000..bac4960fae --- /dev/null +++ b/src/main/java/twilightforest/client/model/block/patch/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.client.model.block.patch; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/client/model/entity/AdherentModel.java b/src/main/java/twilightforest/client/model/entity/AdherentModel.java new file mode 100644 index 0000000000..dc0aaaedd3 --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/AdherentModel.java @@ -0,0 +1,91 @@ +package twilightforest.client.model.entity; + +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.*; +import net.minecraft.util.Mth; +import twilightforest.entity.monster.Adherent; + +public class AdherentModel extends HumanoidModel { + public AdherentModel(ModelPart root) { + super(root); + } + + public static LayerDefinition create() { + MeshDefinition mesh = HumanoidModel.createMesh(CubeDeformation.NONE, 0.0F); + PartDefinition partRoot = mesh.getRoot(); + + partRoot.addOrReplaceChild("head", + CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-4.0F, -8.0F, -4.0F, 8.0F, 8.0F, 8.0F), + PartPose.ZERO); + + partRoot.addOrReplaceChild("hat", + CubeListBuilder.create() + .texOffs(0, 0) + .addBox(0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F), + PartPose.ZERO); + + partRoot.addOrReplaceChild("body", + CubeListBuilder.create() + .texOffs(32, 0) + .addBox(-4.0F, 0.0F, -2.0F, 8.0F, 24.0F, 4.0F), + PartPose.ZERO); + + var leftArm = partRoot.addOrReplaceChild("left_arm", + CubeListBuilder.create() + .texOffs(0, 16) + .addBox(-1.0F, -2.0F, -2.0F, 4.0F, 12.0F, 4.0F), + PartPose.offset(5.0F, 2.0F, 0.0F)); + + leftArm.addOrReplaceChild("left_sleeve", + CubeListBuilder.create() + .texOffs(16, 16) + .addBox(-1.0F, -2.0F, 2.0F, 4.0F, 12.0F, 4.0F), + PartPose.ZERO); + + var rightArm = partRoot.addOrReplaceChild("right_arm", + CubeListBuilder.create() + .texOffs(0, 16) + .addBox(-3.0F, -2.0F, -2.0F, 4.0F, 12.0F, 4.0F), + PartPose.offset(-5.0F, 2.0F, 0.0F)); + + rightArm.addOrReplaceChild("right_sleeve", + CubeListBuilder.create() + .texOffs(16, 16) + .addBox(-3.0F, -2.0F, 2.0F, 4.0F, 12.0F, 4.0F), + PartPose.ZERO); + + partRoot.addOrReplaceChild("left_leg", + CubeListBuilder.create() + .texOffs(0, 0) + .addBox(0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F), + PartPose.ZERO); + + partRoot.addOrReplaceChild("right_leg", + CubeListBuilder.create() + .texOffs(0, 0) + .addBox(0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F), + PartPose.ZERO); + return LayerDefinition.create(mesh, 64, 32); + } + + @Override + public void setupAnim(Adherent entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + // rotate head normally + this.head.yRot = netHeadYaw * Mth.DEG_TO_RAD; + this.head.xRot = headPitch * Mth.DEG_TO_RAD; + + this.rightArm.xRot = 0.0F; + this.leftArm.xRot = 0.0F; + this.rightArm.zRot = 0.0F; + this.leftArm.zRot = 0.0F; + + this.rightArm.zRot += Mth.cos((ageInTicks + 10F) * 0.133F) * 0.3F + 0.3F; + this.leftArm.zRot -= Mth.cos((ageInTicks + 10F) * 0.133F) * 0.3F + 0.3F; + this.rightArm.xRot += Mth.sin(ageInTicks * 0.067F) * 0.05F; + this.leftArm.xRot -= Mth.sin(ageInTicks * 0.067F) * 0.05F; + } +} diff --git a/src/main/java/twilightforest/client/model/entity/AlphaYetiModel.java b/src/main/java/twilightforest/client/model/entity/AlphaYetiModel.java new file mode 100644 index 0000000000..01d978efed --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/AlphaYetiModel.java @@ -0,0 +1,190 @@ +package twilightforest.client.model.entity; + +import com.google.common.collect.ImmutableList; +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.*; +import net.minecraft.util.Mth; +import twilightforest.entity.boss.AlphaYeti; + +public class AlphaYetiModel extends HumanoidModel { + public AlphaYetiModel(ModelPart root) { + super(root); + } + + public static LayerDefinition create() { + MeshDefinition mesh = HumanoidModel.createMesh(CubeDeformation.NONE, 0.0F); + PartDefinition partRoot = mesh.getRoot(); + + partRoot.addOrReplaceChild("head", + CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-4.0F, -8.0F, -4.0F, 0.0F, 0.0F, 0.0F), + PartPose.ZERO); + partRoot.addOrReplaceChild("hat", + CubeListBuilder.create() + .texOffs(32, 0) + .addBox(-4.0F, -8.0F, -4.0F, 0.0F, 0.0F, 0.0F), + PartPose.ZERO); + var body = partRoot.addOrReplaceChild("body", + CubeListBuilder.create() + .texOffs(80, 0) + .addBox(-24.0F, -60.0F, -18.0F, 48.0F, 72.0F, 36.0F), + PartPose.offset(0.0F, -6.0F, 0.0F)); + body.addOrReplaceChild("mouth", + CubeListBuilder.create() + .texOffs(121, 50) + .addBox(-17.0F, -7.0F, -1.5F, 34.0F, 29.0F, 2.0F), + PartPose.offset(0.0F, -37.0F, -18.0F)); + body.addOrReplaceChild("right_eye", + CubeListBuilder.create() + .texOffs(64, 0) + .addBox(-6.0F, -6.0F, -1.5F, 12.0F, 12.0F, 2.0F), + PartPose.offset(-14.0F, -50.0F, -18.0F)); + body.addOrReplaceChild("left_eye", + CubeListBuilder.create() + .texOffs(64, 0) + .addBox(-6.0F, -6.0F, -1.5F, 12.0F, 12.0F, 2.0F), + PartPose.offset(14.0F, -50.0F, -18.0F)); + partRoot.addOrReplaceChild("right_arm", + CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-15.0F, -6.0F, -8.0F, 16.0F, 48.0F, 16.0F), + PartPose.offset(-25.0F, -26.0F, 0.0F)); + partRoot.addOrReplaceChild("left_arm", + CubeListBuilder.create().mirror() + .texOffs(0, 0) + .addBox(-1.0F, -6.0F, -8.0F, 16.0F, 48.0F, 16.0F), + PartPose.offset(25.0F, -26.0F, 0.0F)); + partRoot.addOrReplaceChild("right_leg", + CubeListBuilder.create() + .texOffs(0, 66) + .addBox(-10.0F, 0.0F, -10.0F, 20.0F, 20.0F, 20.0F), + PartPose.offset(-13.5F, 4.0F, 0.0F)); + partRoot.addOrReplaceChild("left_leg", + CubeListBuilder.create().mirror() + .texOffs(0, 66) + .addBox(-10.0F, 0.0F, -10.0F, 20.0F, 20.0F, 20.0F), + PartPose.offset(13.5F, 4.0F, 0.0F)); + + addPairHorns(body, -58.0F, 35F, 1); + addPairHorns(body, -46.0F, 15F, 2); + addPairHorns(body, -36.0F, -5F, 3); + + return LayerDefinition.create(mesh, 256, 128); + } + + /** + * Add a pair of horns + */ + private static void addPairHorns(PartDefinition partdefinition, float height, float zangle, int set) { + + var leftHorn = partdefinition.addOrReplaceChild("left_horn_" + set, + CubeListBuilder.create() + .texOffs(0, 108) + .addBox(-9.0F, -5.0F, -5.0F, 10.0F, 10.0F, 10.0F), + PartPose.offsetAndRotation(-24.0F, height, -8.0F, + 0.0F, -30F / (180F / (float) Math.PI), zangle / (180F / (float) Math.PI))); + + leftHorn.addOrReplaceChild("left_horn_" + set + "_top", + CubeListBuilder.create() + .texOffs(40, 108) + .addBox(-14.0F, -4.0F, -4.0F, 18.0F, 8.0F, 8.0F), + PartPose.offsetAndRotation(-8.0F, 0.0F, 0.0F, + 0.0F, -20F / (180F / (float) Math.PI), zangle / (180F / (float) Math.PI))); + + var rightHorn = partdefinition.addOrReplaceChild("right_horn_" + set, + CubeListBuilder.create() + .texOffs(0, 108) + .addBox(-1.0F, -5.0F, -5.0F, 10, 10, 10), + PartPose.offsetAndRotation(24.0F, height, 0.0F, + 0.0F, 30F / (180F / (float) Math.PI), -zangle / (180F / (float) Math.PI))); + + rightHorn.addOrReplaceChild("right_horn_" + set + "_top", + CubeListBuilder.create() + .texOffs(40, 108) + .addBox(-2.0F, -4.0F, -4.0F, 18, 8, 8), + PartPose.offsetAndRotation(8.0F, 0.0F, 0.0F, + 0.0F, 20F / (180F / (float) Math.PI), -zangle / (180F / (float) Math.PI))); + } + + + @Override + protected Iterable bodyParts() { + return ImmutableList.of(this.body, this.rightArm, this.leftArm, this.rightLeg, this.leftLeg); + } + + @Override + public void setupAnim(AlphaYeti entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + this.head.yRot = netHeadYaw / (180F / (float) Math.PI); + this.head.xRot = headPitch / (180F / (float) Math.PI); + + this.body.xRot = headPitch / (180F / (float) Math.PI); + + this.rightLeg.xRot = Mth.cos(limbSwing * 0.6662F) * 1.4F * limbSwingAmount; + this.leftLeg.xRot = Mth.cos(limbSwing * 0.6662F + (float) Math.PI) * 1.4F * limbSwingAmount; + this.rightLeg.yRot = 0.0F; + this.leftLeg.yRot = 0.0F; + + float f6 = Mth.sin(this.attackTime * (float) Math.PI); + float f7 = Mth.sin((1.0F - (1.0F - this.attackTime) * (1.0F - this.attackTime)) * (float) Math.PI); + this.rightArm.zRot = 0.0F; + this.leftArm.zRot = 0.0F; + this.rightArm.yRot = -(0.1F - f6 * 0.6F); + this.leftArm.yRot = 0.1F - f6 * 0.6F; + this.rightArm.xRot = -((float) Math.PI / 2F); + this.leftArm.xRot = -((float) Math.PI / 2F); + this.rightArm.xRot -= f6 * 1.2F - f7 * 0.4F; + this.leftArm.xRot -= f6 * 1.2F - f7 * 0.4F; + this.rightArm.zRot += Mth.cos(ageInTicks * 0.09F) * 0.05F + 0.05F; + this.leftArm.zRot -= Mth.cos(ageInTicks * 0.09F) * 0.05F + 0.05F; + this.rightArm.xRot += Mth.sin(ageInTicks * 0.067F) * 0.05F; + this.leftArm.xRot -= Mth.sin(ageInTicks * 0.067F) * 0.05F; + + this.body.y = -6F; + this.rightLeg.y = 4F; + this.leftLeg.y = 4F; + + if (entity.isTired()) { + // arms down + this.rightArm.xRot = Mth.cos(limbSwing * 0.6662F + (float) Math.PI) * 2.0F * limbSwingAmount * 0.5F; + this.leftArm.xRot = Mth.cos(limbSwing * 0.6662F) * 2.0F * limbSwingAmount * 0.5F; + this.rightArm.zRot = 0.0F; + this.leftArm.zRot = 0.0F; + + // legs out + this.rightArm.xRot += -((float) Math.PI / 5F); + this.leftArm.xRot += -((float) Math.PI / 5F); + this.rightLeg.xRot = -((float) Math.PI * 2F / 5F); + this.leftLeg.xRot = -((float) Math.PI * 2F / 5F); + this.rightLeg.yRot = ((float) Math.PI / 10F); + this.leftLeg.yRot = -((float) Math.PI / 10F); + + //body down + this.body.y = 6F; + this.rightLeg.y = 12F; + this.leftLeg.y = 12F; + } + + if (entity.isRampaging()) { + // arms up + this.rightArm.xRot = Mth.cos(limbSwing * 0.66F + (float) Math.PI) * 2.0F * limbSwingAmount * 0.5F; + this.leftArm.xRot = Mth.cos(limbSwing * 0.66F) * 2.0F * limbSwingAmount * 0.5F; + + this.rightArm.yRot += Mth.cos(limbSwing * 0.25F) * 0.5F + 0.5F; + this.leftArm.yRot -= Mth.cos(limbSwing * 0.25F) * 0.5F + 0.5F; + + this.rightArm.xRot += Math.PI * 1.25; + this.leftArm.xRot += Math.PI * 1.25; + this.rightArm.zRot = 0.0F; + this.leftArm.zRot = 0.0F; + } + + if (entity.isVehicle()) { + // arms up! + this.rightArm.xRot += Math.PI; + this.leftArm.xRot += Math.PI; + } + } +} diff --git a/src/main/java/twilightforest/client/model/entity/BighornFurLayer.java b/src/main/java/twilightforest/client/model/entity/BighornFurLayer.java new file mode 100644 index 0000000000..0e1b2a7eb4 --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/BighornFurLayer.java @@ -0,0 +1,40 @@ +package twilightforest.client.model.entity; + +import net.minecraft.client.model.SheepFurModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.*; +import twilightforest.entity.passive.Bighorn; + +public class BighornFurLayer extends SheepFurModel { + public BighornFurLayer(ModelPart root) { + super(root); + } + + public static LayerDefinition create() { + MeshDefinition mesh = new MeshDefinition(); + PartDefinition partRoot = mesh.getRoot(); + + partRoot.addOrReplaceChild("head", + CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-3.0F, -4.0F, -4.0F, 6.0F, 6.0F, 6.0F, new CubeDeformation(0.6F)), + PartPose.offset(0.0F, 6.0F, -8.0F)); + partRoot.addOrReplaceChild("body", + CubeListBuilder.create() + .texOffs(28, 8) + .addBox(-4.0F, -9.0F, -7.0F, 8.0F, 15.0F, 6.0F, new CubeDeformation(0.5F)), + PartPose.offset(0.0F, 5F, 2.0F)); + + CubeListBuilder legOffset = CubeListBuilder.create() + .texOffs(0, 16) + .addBox(-2.0F, 0.0F, -2.0F, 4.0F, 6.0F, 4.0F, new CubeDeformation(0.4F)); + + partRoot.addOrReplaceChild("right_hind_leg", legOffset, PartPose.offset(-3.0F, 12.0F, 7.0F)); + partRoot.addOrReplaceChild("left_hind_leg", legOffset, PartPose.offset(3.0F, 12.0F, 7.0F)); + partRoot.addOrReplaceChild("right_front_leg", legOffset, PartPose.offset(-3.0F, 12.0F, -5.0F)); + partRoot.addOrReplaceChild("left_front_leg", legOffset, PartPose.offset(3.0F, 12.0F, -5.0F)); + + return LayerDefinition.create(mesh, 64, 32); + } +} diff --git a/src/main/java/twilightforest/client/model/entity/BighornModel.java b/src/main/java/twilightforest/client/model/entity/BighornModel.java new file mode 100644 index 0000000000..f87123e395 --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/BighornModel.java @@ -0,0 +1,106 @@ +package twilightforest.client.model.entity; + +import com.google.common.collect.ImmutableList; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.model.SheepModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.*; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import twilightforest.entity.passive.Bighorn; + +/** + * BighornModel - MCVinnyq + * Created using Tabula 8.0.0 + */ +@OnlyIn(Dist.CLIENT) +public class BighornModel extends SheepModel { + public BighornModel(ModelPart part) { + super(part); + } + + public static LayerDefinition create() { + MeshDefinition mesh = SheepModel.createBodyMesh(0, CubeDeformation.NONE); + PartDefinition partRoot = mesh.getRoot(); + + var head = partRoot.addOrReplaceChild("head", + CubeListBuilder.create() + .texOffs(38, 0) + .addBox(-3.0F, -4.0F, -6.0F, 6.0F, 6.0F, 7.0F), + PartPose.offset(0.0F, 5.0F, -8.0F)); + head.addOrReplaceChild("right_horn", + CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-3.0F, -1.0F, -7.0F, 3.0F, 3.0F, 5.0F) + .texOffs(0, 8) + .addBox(-4.0F, 2.0F, -9.0F, 3.0F, 2.0F, 5.0F) + .texOffs(4, 15) + .addBox(-4.0F, 0.0F, -11.0F, 2.0F, 3.0F, 2.0F), + PartPose.offsetAndRotation(-2.0F, -3.0F, -1.0F, + 0.0F, 0.39269908169872414F, 0.2181661564992912F)); + head.addOrReplaceChild("left_horn", + CubeListBuilder.create() + .texOffs(16, 0) + .addBox(0.0F, -1.0F, -7.0F, 3.0F, 3.0F, 5.0F) + .texOffs(16, 8) + .addBox(1.0F, 2.0F, -9.0F, 3.0F, 2.0F, 5.0F) + .texOffs(20, 15) + .addBox(2.0F, 0.0F, -11.0F, 2.0F, 3.0F, 2.0F), + PartPose.offsetAndRotation(2.0F, -3.0F, -1.0F, + 0.0F, -0.39269908169872414F, -0.2181661564992912F)); + partRoot.addOrReplaceChild("body", + CubeListBuilder.create() + .texOffs(34, 13) + .addBox(-4.5F, -14.0F, -3.0F, 9.0F, 16.0F, 6.0F), + PartPose.offsetAndRotation(0.0F, 10.0F, 6.0F, + 1.5707963267948966F, 0.0F, 0.0F)); + partRoot.addOrReplaceChild("right_hind_leg", + CubeListBuilder.create() + .texOffs(0, 48).addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F), + PartPose.offset(-3.0F, 12.0F, 7.0F)); + partRoot.addOrReplaceChild("left_hind_leg", + CubeListBuilder.create() + .texOffs(16, 48).addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F), + PartPose.offset(3.0F, 12.0F, 7.0F)); + partRoot.addOrReplaceChild("right_front_leg", + CubeListBuilder.create() + .texOffs(0, 32).addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F), + PartPose.offset(-3.0F, 12.0F, -5.0F)); + partRoot.addOrReplaceChild("left_front_leg", + CubeListBuilder.create() + .texOffs(16, 32).addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F), + PartPose.offset(3.0F, 12.0F, -5.0F)); + + return LayerDefinition.create(mesh, 64, 64); + } + + @Override + public void renderToBuffer(PoseStack stack, VertexConsumer consumer, int light, int overlay, float red, float green, float blue, float alpha) { + if (this.young) { + stack.pushPose(); + stack.translate(0.0D, 0.5D, 0.25D); + ImmutableList.of(this.head).forEach((modelRenderer) -> + modelRenderer.render(stack, consumer, light, overlay, red, green, blue, alpha)); + stack.popPose(); + + stack.pushPose(); + stack.scale(0.5F, 0.5F, 0.5F); + stack.translate(0.0D, 1.5D, 0.0D); + ImmutableList.of(this.leftHindLeg, this.rightHindLeg, this.body, this.leftFrontLeg, this.rightFrontLeg).forEach((modelRenderer) -> + modelRenderer.render(stack, consumer, light, overlay, red, green, blue, alpha)); + stack.popPose(); + } else { + ImmutableList.of(this.leftHindLeg, this.rightHindLeg, this.body, this.leftFrontLeg, this.rightFrontLeg, this.head).forEach((modelRenderer) -> + modelRenderer.render(stack, consumer, light, overlay, red, green, blue, alpha)); + } + } + + @Override + public void setupAnim(T entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + this.head.getChild("left_horn").visible = !entity.isBaby(); + this.head.getChild("right_horn").visible = !entity.isBaby(); + super.setupAnim(entity, limbSwing, limbSwingAmount, ageInTicks, netHeadYaw, headPitch); + } +} diff --git a/src/main/java/twilightforest/client/model/entity/BlockChainGoblinModel.java b/src/main/java/twilightforest/client/model/entity/BlockChainGoblinModel.java new file mode 100644 index 0000000000..2facb88b19 --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/BlockChainGoblinModel.java @@ -0,0 +1,241 @@ +package twilightforest.client.model.entity; + +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.*; +import net.minecraft.util.Mth; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import twilightforest.entity.monster.BlockChainGoblin; + +/** + * ModelMaceGoblin - MCVinnyq + * Created using Tabula 8.0.0 + */ +@OnlyIn(Dist.CLIENT) +public class BlockChainGoblinModel extends HumanoidModel { + private final ModelPart block; + + public BlockChainGoblinModel(ModelPart root) { + super(root); + + this.block = root.getChild("block"); + } + + public static LayerDefinition create() { + MeshDefinition mesh = HumanoidModel.createMesh(CubeDeformation.NONE, 0.0F); + PartDefinition partRoot = mesh.getRoot(); + + partRoot.addOrReplaceChild("right_arm", CubeListBuilder.create() + .texOffs(52, 2) + .addBox(-1.5F, -2.0F, -1.5F, 3.0F, 12.0F, 3.0F), + PartPose.offsetAndRotation(-5.0F, 12.0F, 0.0F, 0.0F, 0.0F, 3.0543261909900767F)); + + partRoot.addOrReplaceChild("left_arm", CubeListBuilder.create() + .texOffs(52, 17) + .addBox(-1.5F, -2.0F, -1.5F, 3.0F, 12.0F, 3.0F), + PartPose.offsetAndRotation(5.0F, 12.0F, 0.0F, 0.0F, 0.0F, -3.0543261909900767F)); + + partRoot.addOrReplaceChild("right_leg", CubeListBuilder.create() + .texOffs(0, 33) + .addBox(-1.4F, 0.0F, -1.5F, 3.0F, 6.0F, 3.0F), + PartPose.offset(-2.0F, 18.0F, 0.0F)); + + partRoot.addOrReplaceChild("left_leg", CubeListBuilder.create() + .texOffs(12, 33) + .addBox(-1.6F, 0.0F, -1.5F, 3.0F, 6.0F, 3.0F), + PartPose.offset(2.0F, 18.0F, 0.0F)); + + partRoot.addOrReplaceChild("body", CubeListBuilder.create() + .texOffs(28, 6) + .addBox(-3.5F, 1.0F, -2.0F, 7.0F, 6.0F, 4.0F), + PartPose.offset(0.0F, 12.0F, 0.0F)); + + var head = partRoot.addOrReplaceChild("head", CubeListBuilder.create() + .texOffs(0, 18) + .addBox(-7.5F, -9.0F, -2.03F, 15.0F, 10.0F, 2.0F), + PartPose.rotation(0.0F, -0.7853981633974483F, 0.0F)); + + + partRoot.addOrReplaceChild("hat", CubeListBuilder.create(), PartPose.ZERO); + + head.addOrReplaceChild("helm", CubeListBuilder.create() + .texOffs(0, 5) + .addBox(-2.5F, -7.0F, -2.5F, 5.0F, 8.0F, 5.0F), + PartPose.rotation(0.0F, 0.7853981633974483F, 0.0F)); + + var block = partRoot.addOrReplaceChild("block", CubeListBuilder.create() + .texOffs(32, 32) + .addBox(-4F, -8F, -4F, 8, 8, 8), + PartPose.ZERO); + + // Rotation constants + final float QUARTER_PI = 0.25F * Mth.PI; + final float ANGLE_MINOR = -35F * Mth.DEG_TO_RAD; + final float ANGLE_MAJOR = -55F * Mth.DEG_TO_RAD; + + block.addOrReplaceChild("spikes_0", CubeListBuilder.create() + .texOffs(56, 36) + .addBox(-1F, -1F, -1F, 2, 2, 2), + PartPose.offsetAndRotation(0, -9, 0, 0, 0, 0)); + + block.addOrReplaceChild("spikes_1", CubeListBuilder.create() + .texOffs(56, 36) + .addBox(-1F, -1F, -1F, 2, 2, 2), + PartPose.offsetAndRotation(0, -8, 4, QUARTER_PI, 0, 0)); + + block.addOrReplaceChild("spikes_2", CubeListBuilder.create() + .texOffs(56, 36) + .addBox(-1F, -1F, -1F, 2, 2, 2), + PartPose.offsetAndRotation(4, -8, 4, ANGLE_MAJOR, QUARTER_PI, 0)); + + block.addOrReplaceChild("spikes_3", CubeListBuilder.create() + .texOffs(56, 36) + .addBox(-1F, -1F, -1F, 2, 2, 2), + PartPose.offsetAndRotation(4, -8, 0, 0, 0, QUARTER_PI)); + + block.addOrReplaceChild("spikes_4", CubeListBuilder.create() + .texOffs(56, 36) + .addBox(-1F, -1F, -1F, 2, 2, 2), + PartPose.offsetAndRotation(4, -8, -4, ANGLE_MINOR, -QUARTER_PI, 0)); + + block.addOrReplaceChild("spikes_5", CubeListBuilder.create() + .texOffs(56, 36) + .addBox(-1F, -1F, -1F, 2, 2, 2), + PartPose.offsetAndRotation(0, -8, -4, QUARTER_PI, 0, 0)); + + block.addOrReplaceChild("spikes_6", CubeListBuilder.create() + .texOffs(56, 36) + .addBox(-1F, -1F, -1F, 2, 2, 2), + PartPose.offsetAndRotation(-4, -8, -4, ANGLE_MINOR, QUARTER_PI, 0)); + + block.addOrReplaceChild("spikes_7", CubeListBuilder.create() + .texOffs(56, 36) + .addBox(-1F, -1F, -1F, 2, 2, 2), + PartPose.offsetAndRotation(-4, -8, 0, 0, 0, QUARTER_PI)); + + block.addOrReplaceChild("spikes_8", CubeListBuilder.create() + .texOffs(56, 36) + .addBox(-1F, -1F, -1F, 2, 2, 2), + PartPose.offsetAndRotation(-4, -8, 4, ANGLE_MAJOR, -QUARTER_PI, 0)); + + block.addOrReplaceChild("spikes_9", CubeListBuilder.create() // this spike is not really there + .texOffs(56, 36) + .addBox(-1F, -1F, -1F, 2, 2, 2), + PartPose.offsetAndRotation(0, -4, 0, 0, 0, 0)); + + block.addOrReplaceChild("spikes_10", CubeListBuilder.create() + .texOffs(56, 36) + .addBox(-1F, -1F, -1F, 2, 2, 2), + PartPose.offsetAndRotation(0, -4, 4, 0, 0, 0)); + + block.addOrReplaceChild("spikes_11", CubeListBuilder.create() + .texOffs(56, 36) + .addBox(-1F, -1F, -1F, 2, 2, 2), + PartPose.offsetAndRotation(4, -4, 5, 0, QUARTER_PI, 0)); + + block.addOrReplaceChild("spikes_12", CubeListBuilder.create() + .texOffs(56, 36) + .addBox(-1F, -1F, -1F, 2, 2, 2), + PartPose.offsetAndRotation(5, -4, 0, 0, 0, 0)); + + block.addOrReplaceChild("spikes_13", CubeListBuilder.create() + .texOffs(56, 36) + .addBox(-1F, -1F, -1F, 2, 2, 2), + PartPose.offsetAndRotation(4, -4, -4, 0, QUARTER_PI, 0)); + + block.addOrReplaceChild("spikes_14", CubeListBuilder.create() + .texOffs(56, 36) + .addBox(-1F, -1F, -1F, 2, 2, 2), + PartPose.offsetAndRotation(0, -4, -5, 0, 0, 0)); + + block.addOrReplaceChild("spikes_15", CubeListBuilder.create() + .texOffs(56, 36) + .addBox(-1F, -1F, -1F, 2, 2, 2), + PartPose.offsetAndRotation(-4, -4, -4, 0, QUARTER_PI, 0)); + + block.addOrReplaceChild("spikes_16", CubeListBuilder.create() + .texOffs(56, 36) + .addBox(-1F, -1F, -1F, 2, 2, 2), + PartPose.offsetAndRotation(-5, -4, 0, 0, 0, 0)); + + block.addOrReplaceChild("spikes_17", CubeListBuilder.create() + .texOffs(56, 36) + .addBox(-1F, -1F, -1F, 2, 2, 2), + PartPose.offsetAndRotation(-4, -4, 4, 0, QUARTER_PI, 0)); + + block.addOrReplaceChild("spikes_18", CubeListBuilder.create() + .texOffs(56, 36) + .addBox(-1F, -1F, -1F, 2, 2, 2), + PartPose.offsetAndRotation(0, 1, 0, 0, 0, 0)); + + block.addOrReplaceChild("spikes_19", CubeListBuilder.create() + .texOffs(56, 36) + .addBox(-1F, -1F, -1F, 2, 2, 2), + PartPose.offsetAndRotation(0, 0, 4, QUARTER_PI, 0, 0)); + + block.addOrReplaceChild("spikes_20", CubeListBuilder.create() + .texOffs(56, 36) + .addBox(-1F, -1F, -1F, 2, 2, 2), + PartPose.offsetAndRotation(4, 0, 4, ANGLE_MINOR, QUARTER_PI, 0)); + + block.addOrReplaceChild("spikes_21", CubeListBuilder.create() + .texOffs(56, 36) + .addBox(-1F, -1F, -1F, 2, 2, 2), + PartPose.offsetAndRotation(4, 0, 0, 0, 0, QUARTER_PI)); + + block.addOrReplaceChild("spikes_22", CubeListBuilder.create() + .texOffs(56, 36) + .addBox(-1F, -1F, -1F, 2, 2, 2), + PartPose.offsetAndRotation(4, 0, -4, ANGLE_MAJOR, -QUARTER_PI, 0)); + + block.addOrReplaceChild("spikes_23", CubeListBuilder.create() + .texOffs(56, 36) + .addBox(-1F, -1F, -1F, 2, 2, 2), + PartPose.offsetAndRotation(0, 0, -4, QUARTER_PI, 0, 0)); + + block.addOrReplaceChild("spikes_24", CubeListBuilder.create() + .texOffs(56, 36) + .addBox(-1F, -1F, -1F, 2, 2, 2), + PartPose.offsetAndRotation(-4, 0, -4, ANGLE_MAJOR, QUARTER_PI, 0)); + + block.addOrReplaceChild("spikes_25", CubeListBuilder.create() + .texOffs(56, 36) + .addBox(-1F, -1F, -1F, 2, 2, 2), + PartPose.offsetAndRotation(-4, 0, 0, 0, 0, QUARTER_PI)); + + block.addOrReplaceChild("spikes_26", CubeListBuilder.create() + .texOffs(56, 36) + .addBox(-1F, -1F, -1F, 2, 2, 2), + PartPose.offsetAndRotation(-4, 0, 4, ANGLE_MINOR, -QUARTER_PI, 0)); + + return LayerDefinition.create(mesh, 64, 48); + } + + @Override + public void setupAnim(T entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + super.setupAnim(entity, limbSwing, limbSwingAmount, ageInTicks, netHeadYaw, headPitch); + + this.head.y = 11.0F; + this.hat.y = 11.0F; + this.body.y = 11F; + + this.rightLeg.y = 18F; + this.leftLeg.y = 18F; + + this.rightArm.setPos(-3.5F, 12F, 0F); + this.rightArm.xRot += Mth.PI; + + this.leftArm.setPos(3.5F, 12F, 0F); + this.leftArm.xRot += Mth.PI; + + float angle = ageInTicks / 4F; + float length = 0;//16F; + + this.block.x = Mth.sin(angle) * length; + this.block.z = -Mth.cos(angle) * length; + + this.block.yRot = -angle; + } +} diff --git a/src/main/java/twilightforest/client/model/entity/BoarModel.java b/src/main/java/twilightforest/client/model/entity/BoarModel.java new file mode 100644 index 0000000000..de1e8af18d --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/BoarModel.java @@ -0,0 +1,75 @@ +package twilightforest.client.model.entity; + +import net.minecraft.client.model.PigModel; +import net.minecraft.client.model.QuadrupedModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.*; +import net.minecraft.util.Mth; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import twilightforest.entity.passive.Boar; + +/** + * ModelWildBoar - MCVinnyq + * Created using Tabula 8.0.0 + */ +@OnlyIn(Dist.CLIENT) +public class BoarModel extends PigModel { + public BoarModel(ModelPart root) { + super(root); + } + + public static LayerDefinition create() { + MeshDefinition mesh = QuadrupedModel.createBodyMesh(6, CubeDeformation.NONE); + PartDefinition partRoot = mesh.getRoot(); + + partRoot.addOrReplaceChild("right_front_leg", CubeListBuilder.create() + .texOffs(0, 13) + .addBox(-2.0F, 0.0F, -1.9F, 4.0F, 6.0F, 4.0F), + PartPose.offset(-2.9F, 18.0F, -2.0F)); + + partRoot.addOrReplaceChild("left_front_leg", CubeListBuilder.create() + .texOffs(0, 23) + .addBox(-2.0F, 0.0F, -1.9F, 4.0F, 6.0F, 4.0F), + PartPose.offset(2.9F, 18.0F, -2.0F)); + + partRoot.addOrReplaceChild("right_hind_leg", CubeListBuilder.create() + .texOffs(0, 33) + .addBox(-2.0F, 0.0F, -2.0F, 4.0F, 6.0F, 4.0F), + PartPose.offset(-3.1F, 18.0F, 9.0F)); + + partRoot.addOrReplaceChild("left_hind_leg", CubeListBuilder.create() + .texOffs(0, 43) + .addBox(-2.0F, 0.0F, -2.0F, 4.0F, 6.0F, 4.0F), + PartPose.offset(3.1F, 18.0F, 9.0F)); + + // Snout and tusks included + partRoot.addOrReplaceChild("head", CubeListBuilder.create() + .addBox(-4.0F, -4.0F, -5.0F, 8.0F, 7.0F, 6.0F) + .texOffs(46, 22) + .addBox(-3.0F, -1.0F, -8.0F, 6.0F, 4.0F, 3.0F) + .texOffs(28, 0) + .addBox(-4.0F, 0.0F, -8.0F, 1.0F, 2.0F, 1.0F) + .texOffs(28, 3) + .addBox(3.0F, 0.0F, -8.0F, 1.0F, 2.0F, 1.0F), + PartPose.offset(0.0F, 15.5F, -5.0F)); + + partRoot.addOrReplaceChild("body", CubeListBuilder.create() + .texOffs(28, 0) + .addBox(-5.0F, -6.0F, 0.0F, 10.0F, 14.0F, 8.0F), + PartPose.offsetAndRotation(0.0F, 19.0F, 2.0F, 1.6580627893946132F, 0.0F, 0.0F)); + + return LayerDefinition.create(mesh, 64, 64); + } + + public void setupAnim(T entityIn, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + this.head.xRot = headPitch * ((float)Math.PI / 180F); + this.head.yRot = netHeadYaw * ((float)Math.PI / 180F); + this.body.xRot = ((float)Math.PI / 2F); + this.rightHindLeg.xRot = Mth.cos(limbSwing * 0.6662F) * 1.4F * limbSwingAmount; + this.leftHindLeg.xRot = Mth.cos(limbSwing * 0.6662F + (float)Math.PI) * 1.4F * limbSwingAmount; + this.rightFrontLeg.xRot = Mth.cos(limbSwing * 0.6662F + (float)Math.PI) * 1.4F * limbSwingAmount; + this.leftFrontLeg.xRot = Mth.cos(limbSwing * 0.6662F) * 1.4F * limbSwingAmount; + } +} diff --git a/src/main/java/twilightforest/client/model/entity/BunnyModel.java b/src/main/java/twilightforest/client/model/entity/BunnyModel.java new file mode 100644 index 0000000000..940a8f034b --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/BunnyModel.java @@ -0,0 +1,105 @@ +// Date: 4/28/2012 9:36:32 AM +// Template version 1.1 +// Java generated by Techne +// Keep in mind that you still need to fill in some blanks +// - ZeuX + +package twilightforest.client.model.entity; + +import com.google.common.collect.ImmutableList; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.model.QuadrupedModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.*; +import net.minecraft.util.Mth; +import twilightforest.entity.passive.DwarfRabbit; + +public class BunnyModel extends QuadrupedModel { + public BunnyModel(ModelPart root) { + super(root, false, 4.0F, 4.0F, 2.0F, 2.0F, 24); + } + + public static LayerDefinition create() { + MeshDefinition mesh = QuadrupedModel.createBodyMesh(1, CubeDeformation.NONE); + PartDefinition partRoot = mesh.getRoot(); + + partRoot.addOrReplaceChild("body", CubeListBuilder.create() + .texOffs(0, 8) + .addBox(-2F, -1F, -2F, 4, 3, 5) + .texOffs(0, 18) // Tail + .addBox(-1F, -2F, 3F, 2, 2, 2) + .mirror(), + PartPose.offset(0F, 21F, 0F)); + + partRoot.addOrReplaceChild("left_hind_leg", CubeListBuilder.create() + .texOffs(0, 16) + .addBox(0F, 0F, 0F, 1, 1, 1) + .mirror(), + PartPose.offset(-2F, 23F, 2F)); + + partRoot.addOrReplaceChild("right_hind_leg", CubeListBuilder.create() + .texOffs(0, 16) + .addBox(0F, 0F, 0F, 1, 1, 1) + .mirror(), + PartPose.offset(1F, 23F, 2F)); + + partRoot.addOrReplaceChild("left_front_leg", CubeListBuilder.create() + .texOffs(0, 16) + .addBox(0F, 0F, 0F, 1, 1, 1) + .mirror(), + PartPose.offset(-2F, 23F, -2F)); + + partRoot.addOrReplaceChild("right_front_leg", CubeListBuilder.create() + .texOffs(0, 16) + .addBox(0F, 0F, 0F, 1, 1, 1) + .mirror(), + PartPose.offset(1F, 23F, -2F)); + + partRoot.addOrReplaceChild("head", CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-2F, -4F, -3F, 4, 4, 4, new CubeDeformation(0.1F)) + .texOffs(16, 0) + .addBox(-2.5F, -8F, -0.5F, 2, 4, 1) + .texOffs(16, 0) + .addBox(0.5F, -8F, -0.5F, 2, 4, 1) + .mirror(), + PartPose.offset(0F, 22F, -1F)); + + return LayerDefinition.create(mesh, 32, 32); + } + + + @Override + public void renderToBuffer(PoseStack ms, VertexConsumer buffer, int light, int overlay, float red, float green, float blue, float alpha) { + if (this.young) { + ms.pushPose(); + ms.scale(0.85F, 0.85F, 0.85F); + ms.translate(0.0F, 0.25F, 0.0F); + ImmutableList.of(this.head).forEach((p_103597_) -> { + p_103597_.render(ms, buffer, light, overlay, red, green, blue, alpha); + }); + ms.popPose(); + ms.pushPose(); + ms.scale(0.8F, 0.8F, 0.8F); + ms.translate(0.0F, 0.37F, 0.0F); + ImmutableList.of(this.body, this.leftFrontLeg, this.rightFrontLeg, this.leftHindLeg, this.rightHindLeg).forEach((p_103587_) -> { + p_103587_.render(ms, buffer, light, overlay, red, green, blue, alpha); + }); + ms.popPose(); + } else { + super.renderToBuffer(ms, buffer, light, overlay, red, green, blue, alpha); + } + } + + @Override + public void setupAnim(DwarfRabbit entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + this.head.xRot = headPitch * Mth.DEG_TO_RAD; + this.head.yRot = netHeadYaw * Mth.DEG_TO_RAD; + this.leftHindLeg.xRot = Mth.cos(limbSwing * 0.6662F) * 1.4F * limbSwingAmount; + this.rightHindLeg.xRot = Mth.cos(limbSwing * 0.6662F + Mth.PI) * 1.4F * limbSwingAmount; + this.leftFrontLeg.xRot = Mth.cos(limbSwing * 0.6662F + Mth.PI) * 1.4F * limbSwingAmount; + this.rightFrontLeg.xRot = Mth.cos(limbSwing * 0.6662F) * 1.4F * limbSwingAmount; + } +} diff --git a/src/main/java/twilightforest/client/model/entity/CarminiteGolemModel.java b/src/main/java/twilightforest/client/model/entity/CarminiteGolemModel.java new file mode 100644 index 0000000000..9f6753b881 --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/CarminiteGolemModel.java @@ -0,0 +1,149 @@ +package twilightforest.client.model.entity; + +import net.minecraft.client.model.HierarchicalModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; +import net.minecraft.util.Mth; +import twilightforest.entity.monster.CarminiteGolem; + +public class CarminiteGolemModel extends HierarchicalModel { + private final ModelPart root, head, rightArm, leftArm, leftLeg, rightLeg; + + public CarminiteGolemModel(ModelPart root) { + this.root = root; + this.head = this.root.getChild("head"); + this.rightArm = this.root.getChild("right_arm"); + this.leftArm = this.root.getChild("left_arm"); + this.rightLeg = this.root.getChild("right_leg"); + this.leftLeg = this.root.getChild("left_leg"); + } + + public static LayerDefinition create() { + MeshDefinition mesh = new MeshDefinition(); + PartDefinition partRoot = mesh.getRoot(); + + partRoot.addOrReplaceChild("head", CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-3.5F, -10F, -3F, 7, 8, 6) + .texOffs(0, 14) + .addBox(-4F, -6F, -3.5F, 8, 4, 6), + PartPose.offset(0F, -11F, -2F)); + + var body = partRoot.addOrReplaceChild("body", CubeListBuilder.create() + .texOffs(0, 26) + .addBox(-8F, 0F, -5F, 16, 10, 10), + PartPose.offset(0F, -13F, 0F)); + + partRoot.addOrReplaceChild("ribs", CubeListBuilder.create() + .texOffs(0, 46) + .addBox(-5F, 0F, -3F, 10, 6, 6), + PartPose.offset(0F, -3F, 0F)); + + partRoot.addOrReplaceChild("right_arm", CubeListBuilder.create() + .texOffs(52, 0) // arm + .addBox(-5F, -2F, -1.5F, 3, 14, 3) + .texOffs(52, 17) // fist + .addBox(-7F, 12F, -3F, 6, 12, 6) + .texOffs(52, 36) // shoulder top + .addBox(-7F, -3F, -3.5F, 7, 2, 7) + .texOffs(52, 45) // shoulder front + .addBox(-7F, -1F, -3.5F, 7, 5, 2) + .texOffs(52, 45) // shoulder back + .addBox(-7F, -1F, 1.5F, 7, 5, 2) + .texOffs(52, 54) // shoulder inner + .addBox(-2F, -1F, -2F, 2, 5, 3), + PartPose.offset(-8F, -12F, 0F)); + + partRoot.addOrReplaceChild("left_arm", CubeListBuilder.create() + .mirror() + .texOffs(52, 0) // arm + .addBox(2F, -2F, -1.5F, 3, 14, 3) + .texOffs(52, 17) // fist + .addBox(1F, 12F, -3F, 6, 12, 6) + .texOffs(52, 36) // shoulder top + .addBox(0F, -3F, -3.5F, 7, 2, 7) + .texOffs(52, 45) // shoulder front + .addBox(0F, -1F, -3.5F, 7, 5, 2) + .texOffs(52, 45) // shoulder back + .addBox(0F, -1F, 1.5F, 7, 5, 2) + .texOffs(52, 54) // shoulder inner + .addBox(0F, -1F, -2F, 2, 5, 3), + PartPose.offset(8F, -12F, 0F)); + + partRoot.addOrReplaceChild("hips", CubeListBuilder.create() + .texOffs(84, 25) + .addBox(-5F, 0F, -2F, 10, 3, 4), + PartPose.offset(0F, 1F, 0F)); + + partRoot.addOrReplaceChild("spine", CubeListBuilder.create() + .texOffs(84, 18) + .addBox(-1.5F, 0F, -1.5F, 3, 4, 3), + PartPose.offset(0F, -3F, 0F)); + + partRoot.addOrReplaceChild("right_leg", CubeListBuilder.create() + .texOffs(84, 32) + .addBox(-3F, 0F, -1.5F, 3, 8, 3) + .texOffs(84, 43) + .addBox(-5.5F, 8F, -4F, 6, 14, 7), + PartPose.offset(-1F, 2F, 0F)); + + partRoot.addOrReplaceChild("left_leg", CubeListBuilder.create() + .mirror() + .texOffs(84, 32) + .addBox(0F, 0F, -1.5F, 3, 8, 3) + .texOffs(84, 43) + .addBox(-0.5F, 8F, -4F, 6, 14, 7), + PartPose.offset(1F, 2F, 0F)); + + return LayerDefinition.create(mesh, 128, 64); + } + + @Override + public ModelPart root() { + return this.root; + } + + /** + * Sets the model's various rotation angles. For bipeds, limbSwing and limbSwingAmount are used for animating the movement of arms + * and legs, where limbSwing represents the time(so that arms and legs swing back and forth) and limbSwingAmount represents how + * "far" arms and legs can swing at most. + */ + @Override + public void setupAnim(T entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + this.head.yRot = netHeadYaw * Mth.DEG_TO_RAD; + this.head.xRot = headPitch * Mth.DEG_TO_RAD; + this.leftLeg.xRot = -1.5F * this.func_78172_a(limbSwing, 13.0F) * limbSwingAmount; + this.rightLeg.xRot = 1.5F * this.func_78172_a(limbSwing, 13.0F) * limbSwingAmount; + this.leftLeg.yRot = 0.0F; + this.rightLeg.yRot = 0.0F; + + + this.rightArm.zRot = Mth.cos(ageInTicks * 0.09F) * 0.05F + 0.05F; + this.leftArm.zRot = -Mth.cos(ageInTicks * 0.09F) * 0.05F - 0.05F; + } + + /** + * Used for easily adding entity-dependent animations. The second and third float params here are the same second + * and third as in the setRotationAngles method. + */ + @Override + public void prepareMobModel(T entity, float limbSwing, float limbSwingAmount, float partialTicks) { + int var6 = entity.getAttackTimer(); + + if (var6 > 0) { + this.rightArm.xRot = -2.0F + 1.5F * this.func_78172_a(var6 - partialTicks, 10.0F); + this.leftArm.xRot = -2.0F + 1.5F * this.func_78172_a(var6 - partialTicks, 10.0F); + } else { + this.rightArm.xRot = (-0.2F + 1.5F * this.func_78172_a(limbSwing, 25.0F)) * limbSwingAmount; + this.leftArm.xRot = (-0.2F - 1.5F * this.func_78172_a(limbSwing, 25.0F)) * limbSwingAmount; + } + } + + private float func_78172_a(float par1, float par2) { + return (Math.abs((par1 % par2) - (par2 * 0.5F)) - par2 * 0.25F) / (par2 * 0.25F); + } +} diff --git a/src/main/java/twilightforest/client/model/entity/ChainModel.java b/src/main/java/twilightforest/client/model/entity/ChainModel.java new file mode 100644 index 0000000000..8ffdb70ca8 --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/ChainModel.java @@ -0,0 +1,41 @@ +package twilightforest.client.model.entity; + +import com.google.common.collect.ImmutableList; +import net.minecraft.client.model.ListModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; +import net.minecraft.world.entity.Entity; + +public class ChainModel extends ListModel { + private final ModelPart chain; + + public ChainModel(ModelPart root) { + this.chain = root.getChild("chain"); + } + + public static LayerDefinition create() { + MeshDefinition mesh = new MeshDefinition(); + PartDefinition partRoot = mesh.getRoot(); + + partRoot.addOrReplaceChild("chain", CubeListBuilder.create() + .texOffs(56, 36) + .addBox(-1F, -1F, -1F, 2, 2, 2), + PartPose.ZERO); + + return LayerDefinition.create(mesh, 64, 64); + } + + @Override + public Iterable parts() { + return ImmutableList.of(chain); + } + + @Override + public void setupAnim(Entity entity, float v, float v1, float v2, float v3, float v4) { + + } +} diff --git a/src/main/java/twilightforest/client/model/entity/CicadaModel.java b/src/main/java/twilightforest/client/model/entity/CicadaModel.java new file mode 100644 index 0000000000..39a87c0a2a --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/CicadaModel.java @@ -0,0 +1,81 @@ +package twilightforest.client.model.entity; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.model.Model; +import net.minecraft.client.model.geom.ModelPart; + +public class CicadaModel extends Model { + + public final ModelPart legs; + public ModelPart fatbody; + public ModelPart skinnybody; + public ModelPart eye1; + public ModelPart eye2; + public ModelPart wings; + + public CicadaModel(ModelPart root) { + super(RenderType::entityCutoutNoCull); + + this.legs = root.getChild("legs"); + this.fatbody = root.getChild("fat_body"); + this.skinnybody = root.getChild("skinny_body"); + this.eye1 = root.getChild("eye_1"); + this.eye2 = root.getChild("eye_2"); + this.wings = root.getChild("wings"); + } + + public static LayerDefinition create() { + MeshDefinition meshdefinition = new MeshDefinition(); + PartDefinition partdefinition = meshdefinition.getRoot(); + + partdefinition.addOrReplaceChild("legs", + CubeListBuilder.create() + .texOffs(0, 21) + .addBox(-4.0F, 7.9F, -5.0F, 8.0F, 1.0F, 9.0F), + PartPose.ZERO); + partdefinition.addOrReplaceChild("fat_body", + CubeListBuilder.create() + .texOffs(0, 11) + .addBox(-2F, 6F, -4F, 4, 2, 6), + PartPose.ZERO); + partdefinition.addOrReplaceChild("skinny_body", + CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-1F, 7F, -5F, 2, 1, 8), + PartPose.ZERO); + partdefinition.addOrReplaceChild("eye_1", + CubeListBuilder.create() + .texOffs(20, 15) + .addBox(1F, 5F, 2F, 2, 2, 2), + PartPose.ZERO); + partdefinition.addOrReplaceChild("eye_2", + CubeListBuilder.create() + .texOffs(20, 15) + .addBox(-3F, 5F, 2F, 2, 2, 2), + PartPose.ZERO); + partdefinition.addOrReplaceChild("wings", + CubeListBuilder.create() + .texOffs(20, 0) + .addBox(-4F, 5F, -7F, 8, 1, 8), + PartPose.ZERO); + + return LayerDefinition.create(meshdefinition, 64, 32); + } + + @Override + public void renderToBuffer(PoseStack ms, VertexConsumer buffer, int light, int overlay, float r, float g, float b, float a) { + this.legs.render(ms, buffer, light, overlay, r, g, b, a); + this.fatbody.render(ms, buffer, light, overlay, r, g, b, a); + this.skinnybody.render(ms, buffer, light, overlay, r, g, b, a); + this.eye1.render(ms, buffer, light, overlay, r, g, b, a); + this.eye2.render(ms, buffer, light, overlay, r, g, b, a); + this.wings.render(ms, buffer, light, overlay, r, g, b, a); + } +} diff --git a/src/main/java/twilightforest/client/model/entity/CubeOfAnnihilationModel.java b/src/main/java/twilightforest/client/model/entity/CubeOfAnnihilationModel.java new file mode 100644 index 0000000000..1f73613d21 --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/CubeOfAnnihilationModel.java @@ -0,0 +1,68 @@ +package twilightforest.client.model.entity; + +import com.google.common.collect.ImmutableList; +import net.minecraft.client.model.ListModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; +import net.minecraft.util.Mth; +import twilightforest.entity.CubeOfAnnihilation; + +public class CubeOfAnnihilationModel extends ListModel { + private final ModelPart box, boxX, boxY, boxZ; + + public CubeOfAnnihilationModel(ModelPart root) { + this.box = root.getChild("box"); + this.boxX = root.getChild("box_x"); + this.boxY = root.getChild("box_y"); + this.boxZ = root.getChild("box_z"); + } + + public static LayerDefinition create() { + MeshDefinition mesh = new MeshDefinition(); + PartDefinition partRoot = mesh.getRoot(); + + partRoot.addOrReplaceChild("box", CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-8F, -8F, -8F, 16, 16, 16), + PartPose.ZERO); + + partRoot.addOrReplaceChild("box_x", CubeListBuilder.create() + .texOffs(0, 32) + .addBox(-8F, -8F, -8F, 16, 16, 16), + PartPose.ZERO); + + partRoot.addOrReplaceChild("box_y", CubeListBuilder.create() + .texOffs(0, 32) + .addBox(-8F, -8F, -8F, 16, 16, 16), + PartPose.ZERO); + + partRoot.addOrReplaceChild("box_z", CubeListBuilder.create() + .texOffs(0, 32) + .addBox(-8F, -8F, -8F, 16, 16, 16), + PartPose.ZERO); + + + return LayerDefinition.create(mesh, 64, 64); + } + + @Override + public Iterable parts() { + return ImmutableList.of( + this.box, + this.boxX, + this.boxY, + this.boxZ + ); + } + + @Override + public void setupAnim(CubeOfAnnihilation entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + this.boxX.xRot = Mth.sin((entity.tickCount + headPitch)) / 5F; + this.boxY.yRot = Mth.sin((entity.tickCount + headPitch)) / 5F; + this.boxZ.zRot = Mth.sin((entity.tickCount + headPitch)) / 5F; + } +} diff --git a/src/main/java/twilightforest/client/model/entity/DeathTomeModel.java b/src/main/java/twilightforest/client/model/entity/DeathTomeModel.java new file mode 100644 index 0000000000..f1cbcc4ffc --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/DeathTomeModel.java @@ -0,0 +1,162 @@ +package twilightforest.client.model.entity; + +import net.minecraft.client.model.HierarchicalModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; +import net.minecraft.util.Mth; +import twilightforest.entity.monster.DeathTome; + +public class DeathTomeModel extends HierarchicalModel { + private final ModelPart root, book, paperStorm; + private final ModelPart pagesRight, pagesLeft; + private final ModelPart flippingPageRight, flippingPageLeft; + private final ModelPart coverRight, coverLeft; + private final ModelPart loosePage0, loosePage1, loosePage2, loosePage3; + + public DeathTomeModel(ModelPart root) { + this.root = root; + + this.book = root.getChild("book"); + + this.pagesRight = this.book.getChild("pages_right"); + this.pagesLeft = this.book.getChild("pages_left"); + + this.flippingPageRight = this.book.getChild("flipping_page_right"); + this.flippingPageLeft = this.book.getChild("flipping_page_left"); + + this.coverRight = this.book.getChild("cover_right"); + this.coverLeft = this.book.getChild("cover_left"); + + this.paperStorm = this.root.getChild("paper_storm"); + + this.loosePage0 = paperStorm.getChild("loose_page_0"); + this.loosePage1 = paperStorm.getChild("loose_page_1"); + this.loosePage2 = paperStorm.getChild("loose_page_2"); + this.loosePage3 = paperStorm.getChild("loose_page_3"); + } + + public static LayerDefinition create() { + MeshDefinition mesh = new MeshDefinition(); + PartDefinition partRoot = mesh.getRoot(); + + var book = partRoot.addOrReplaceChild("book", CubeListBuilder.create(), PartPose.ZERO); + + book.addOrReplaceChild("pages_right", CubeListBuilder.create() + .texOffs(0, 10) + .addBox(0.0F, -4.0F, -0.99F, 5.0F, 8.0F, 1.0F), + PartPose.ZERO); + + book.addOrReplaceChild("pages_left", CubeListBuilder.create() + .texOffs(12, 10) + .addBox(0.0F, -4.0F, -0.01F, 5.0F, 8.0F, 1.0F), + PartPose.ZERO); + + book.addOrReplaceChild("flipping_page_right", CubeListBuilder.create() + .texOffs(24, 10) + .addBox(0.0F, -4.0F, 0.0F, 5.0F, 8.0F, 0.005F), + PartPose.ZERO); + + book.addOrReplaceChild("flipping_page_left", CubeListBuilder.create() + .texOffs(24, 10) + .addBox(0.0F, -4.0F, 0.0F, 5.0F, 8.0F, 0.005F), + PartPose.ZERO); + + book.addOrReplaceChild("cover_right", CubeListBuilder.create() + .addBox(-6.0F, -5.0F, -0.005F, 6.0F, 10.0F, 0.005F), + PartPose.offset(0.0F, 0.0F, -1.0F)); + + book.addOrReplaceChild("cover_left", CubeListBuilder.create() + .texOffs(16, 0) + .addBox(0.0F, -5.0F, -0.005F, 6.0F, 10.0F, 0.005F), + PartPose.offset(0.0F, 0.0F, 1.0F)); + + book.addOrReplaceChild("book_spine", CubeListBuilder.create() + .texOffs(12, 0) + .addBox(-1.0F, -5.0F, 0.0F, 2.0F, 10.0F, 0.005F), + PartPose.rotation(0, Mth.HALF_PI, 0)); + + var paperStorm = partRoot.addOrReplaceChild("paper_storm", CubeListBuilder.create(), PartPose.ZERO); + + paperStorm.addOrReplaceChild("loose_page_0", CubeListBuilder.create() + .texOffs(24, 10) + .addBox(0F, -4F, -8F, 5, 8, 0.005F), + PartPose.ZERO); + + paperStorm.addOrReplaceChild("loose_page_1", CubeListBuilder.create() + .texOffs(24, 10) + .addBox(0F, -4F, 9F, 5, 8, 0.005F), + PartPose.ZERO); + + paperStorm.addOrReplaceChild("loose_page_2", CubeListBuilder.create() + .texOffs(24, 10) + .addBox(0F, -4F, 11F, 5, 8, 0.005F), + PartPose.ZERO); + + paperStorm.addOrReplaceChild("loose_page_3", CubeListBuilder.create() + .texOffs(24, 10) + .addBox(0F, -4F, 7F, 5, 8, 0.005F), + PartPose.ZERO); + + return LayerDefinition.create(mesh, 64, 32); + } + + @Override + public ModelPart root() { + return this.root; + } + + @Override + public void setupAnim(DeathTome entity, float limbAngle, float limbDistance, float customAngle, float headYaw, float headPitch) { + this.root.yRot = Mth.HALF_PI; + + this.book.zRot = -0.8726646259971647F; + + this.paperStorm.yRot = customAngle * Mth.DEG_TO_RAD + Mth.HALF_PI; + this.paperStorm.zRot = 0.8726646259971647F; + } + + @Override + public void prepareMobModel(DeathTome entity, float limbSwing, float limbSwingAmount, float partialTicks) { + float bounce = entity.tickCount + partialTicks; + float open = 0.9f; + float flipRight = 0.4f; + float flipLeft = 0.6f; + + // hoveriness + this.book.setPos(0, 8 + Mth.sin((bounce) * 0.3F) * 2.0F, 0); + + // book openness + float openAngle = (Mth.sin(bounce * 0.4F) * 0.3F + 1.25F) * open; + this.coverRight.yRot = Mth.PI + openAngle; + this.coverLeft.yRot = -openAngle; + this.pagesRight.yRot = openAngle; + this.pagesLeft.yRot = -openAngle; + this.flippingPageRight.yRot = openAngle - openAngle * 2.0F * flipRight; + this.flippingPageLeft.yRot = openAngle - openAngle * 2.0F * flipLeft; + this.pagesRight.x = Mth.sin(openAngle); + this.pagesLeft.x = Mth.sin(openAngle); + this.flippingPageRight.x = Mth.sin(openAngle); + this.flippingPageLeft.x = Mth.sin(openAngle); + + // page rotations + this.loosePage0.yRot = (bounce) / 4.0F; + this.loosePage0.xRot = Mth.sin((bounce) / 5.0F) / 3.0F; + this.loosePage0.zRot = Mth.cos((bounce) / 5.0F) / 5.0F; + + this.loosePage1.yRot = (bounce) / 3.0F; + this.loosePage1.xRot = Mth.sin((bounce) / 5.0F) / 3.0F; + this.loosePage1.zRot = Mth.cos((bounce) / 5.0F) / 4.0F + 2; + + this.loosePage2.yRot = (bounce) / 4.0F; + this.loosePage2.xRot = -Mth.sin((bounce) / 5.0F) / 3.0F; + this.loosePage2.zRot = Mth.cos((bounce) / 5.0F) / 5.0F - 1.0F; + + this.loosePage3.yRot = (bounce) / 4.0F; + this.loosePage3.xRot = -Mth.sin((bounce) / 2.0F) / 4.0F; + this.loosePage3.zRot = Mth.cos((bounce) / 7.0F) / 5.0F; + } +} diff --git a/src/main/java/twilightforest/client/model/entity/DeerModel.java b/src/main/java/twilightforest/client/model/entity/DeerModel.java new file mode 100644 index 0000000000..b8591f92c9 --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/DeerModel.java @@ -0,0 +1,116 @@ +package twilightforest.client.model.entity; + +import com.google.common.collect.ImmutableList; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.model.QuadrupedModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.*; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import twilightforest.entity.passive.Deer; + +/** + * ModelWildDeer - MCVinnyq + * Created using Tabula 8.0.0 + */ +@OnlyIn(Dist.CLIENT) +public class DeerModel extends QuadrupedModel { + private final ModelPart neck; + private final ModelPart realHead; + + public DeerModel(ModelPart root) { + super(root, false, 4.0F, 4.0F, 2.0F, 2.0F, 10); + + this.neck = root.getChild("neck"); + //cant assign a value to the head since its final so lets make a workaround + this.realHead = neck.getChild("head"); + } + + public static LayerDefinition create() { + MeshDefinition mesh = QuadrupedModel.createBodyMesh(12, CubeDeformation.NONE); + PartDefinition partRoot = mesh.getRoot(); + + var neck = partRoot.addOrReplaceChild("neck", CubeListBuilder.create() + .texOffs(22, 14) + .addBox(-1.5F, -8.0F, -2.0F, 3.0F, 9.0F, 4.0F), + PartPose.offsetAndRotation(0.0F, 8.0F, -5.0F, 0.4363323129985824F, 0.0F, 0.0F)); + + var head = neck.addOrReplaceChild("head", CubeListBuilder.create() + .texOffs(24, 2) + .addBox(-2.0F, -4.0F, -4.0F, 4.0F, 6.0F, 6.0F) + .texOffs(52, 0) + .addBox(-1.5F, -1.0F, -7.0F, 3.0F, 3.0F, 3.0F), + PartPose.offsetAndRotation(0.0F, -9.0F, 0.0F, -0.4363323129985824F, 0.0F, 0.0F)); + + head.addOrReplaceChild("right_antler", CubeListBuilder.create() + .texOffs(0, 16) + .addBox(0.0F, -16.0F, -8.0F, 0.0F, 16.0F, 16.0F), + PartPose.offsetAndRotation(-1.0F, -4.0F, 0.0F, 0.0F, -0.39269908169872414F, -0.39269908169872414F)); + + head.addOrReplaceChild("left_antler", CubeListBuilder.create() + .texOffs(32, 16) + .addBox(0.0F, -16.0F, -8.0F, 0.0F, 16.0F, 16.0F), + PartPose.offsetAndRotation(1.0F, -4.0F, 0.0F, 0.0F, 0.39269908169872414F, 0.39269908169872414F)); + + partRoot.addOrReplaceChild("body", CubeListBuilder.create() + .texOffs(36, 6) + .addBox(-3.0F, -14.0F, -2.0F, 6.0F, 18.0F, 8.0F), + PartPose.offsetAndRotation(0.0F, 10.0F, 7.0F, 1.5707963267948966F, 0.0F, 0.0F)); + + partRoot.addOrReplaceChild("left_hind_leg", CubeListBuilder.create() + .texOffs(0, 15) + .addBox(-1.0F, 0.0F, -1.5F, 2.0F, 12.0F, 3.0F), + PartPose.offset(-2.0F, 12.0F, 9.5F)); + + partRoot.addOrReplaceChild("right_hind_leg", CubeListBuilder.create() + .texOffs(10, 15) + .addBox(-1.0F, 0.0F, -1.5F, 2.0F, 12.0F, 3.0F), + PartPose.offset(2.0F, 12.0F, 9.5F)); + + partRoot.addOrReplaceChild("left_front_leg", CubeListBuilder.create() + .addBox(-1.0F, 0.0F, -1.5F, 2.0F, 12.0F, 3.0F), + PartPose.offset(-2.0F, 12.0F, -4.5F)); + + partRoot.addOrReplaceChild("right_front_leg", CubeListBuilder.create() + .texOffs(10, 0) + .addBox(-1.0F, 0.0F, -1.5F, 2.0F, 12.0F, 3.0F), + PartPose.offset(2.0F, 12.0F, -4.5F)); + + return LayerDefinition.create(mesh, 64, 48); + } + + @Override + protected Iterable headParts() { + return ImmutableList.of(this.neck); + } + + @Override + public void renderToBuffer(PoseStack stack, VertexConsumer builder, int light, int overlay, float red, float green, float blue, float scale) { + if (this.young) { + stack.pushPose(); + stack.scale(0.75F, 0.75F, 0.75F); + stack.translate(0.0F, 0.95F, 0.15F); + this.headParts().forEach((modelRenderer) -> modelRenderer.render(stack, builder, light, overlay, red, green, blue, scale)); + stack.popPose(); + + stack.pushPose(); + stack.scale(0.5F, 0.5F, 0.5F); + stack.translate(0.0F, 1.5F, 0.0F); + this.bodyParts().forEach((modelRenderer) -> modelRenderer.render(stack, builder, light, overlay, red, green, blue, scale)); + stack.popPose(); + } else { + this.headParts().forEach((renderer) -> renderer.render(stack, builder, light, overlay, red, green, blue, scale)); + this.bodyParts().forEach((renderer) -> renderer.render(stack, builder, light, overlay, red, green, blue, scale)); + } + } + + public void setupAnim(Deer entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + this.realHead.getChild("right_antler").visible = !entity.isBaby(); + this.realHead.getChild("left_antler").visible = !entity.isBaby(); + super.setupAnim(entity, limbSwing, limbSwingAmount, ageInTicks, netHeadYaw, headPitch); + this.realHead.xRot = head.xRot; + this.realHead.yRot = head.yRot; + } +} diff --git a/src/main/java/twilightforest/client/model/entity/FireBeetleModel.java b/src/main/java/twilightforest/client/model/entity/FireBeetleModel.java new file mode 100644 index 0000000000..bba3a53642 --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/FireBeetleModel.java @@ -0,0 +1,162 @@ +package twilightforest.client.model.entity; + +import net.minecraft.client.model.HierarchicalModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; +import net.minecraft.util.Mth; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import twilightforest.entity.monster.FireBeetle; + +/** + * ModelFireBeetle - MCVinnyq + * Created using Tabula 8.0.0 + */ +@OnlyIn(Dist.CLIENT) +public class FireBeetleModel extends HierarchicalModel { + private final ModelPart root, head, rightLeg1, rightLeg2, rightLeg3, leftLeg1, leftLeg2, leftLeg3; + + public FireBeetleModel(ModelPart root) { + this.root = root; + + this.head = this.root.getChild("head"); + + this.rightLeg1 = this.root.getChild("right_leg_1"); + this.rightLeg2 = this.root.getChild("right_leg_2"); + this.rightLeg3 = this.root.getChild("right_leg_3"); + + this.leftLeg1 = this.root.getChild("left_leg_1"); + this.leftLeg2 = this.root.getChild("left_leg_2"); + this.leftLeg3 = this.root.getChild("left_leg_3"); + } + + public static LayerDefinition create() { + MeshDefinition mesh = new MeshDefinition(); + PartDefinition partRoot = mesh.getRoot(); + + var head = partRoot.addOrReplaceChild("head", CubeListBuilder.create() + .addBox(-4.0F, -3.0F, -6.0F, 8.0F, 6.0F, 6.0F), + PartPose.offset(0.0F, 18.0F, -4.0F)); + + head.addOrReplaceChild("jaws", CubeListBuilder.create() + .texOffs(-6, 18) + .addBox(-3.0F, 0.0F, -6.0F, 6.0F, 0.0F, 6.0F), + PartPose.offsetAndRotation(0.0F, 2.0F, -6.0F, 0.39269908169872414F, 0.0F, 0.0F)); + + head.addOrReplaceChild("right_eye", CubeListBuilder.create() + .texOffs(0, 12) + .addBox(-2.0F, -1.0F, -2.0F, 3.0F, 3.0F, 3.0F), + PartPose.offset(-2.5F, -1.0F, -4.5F)); + + head.addOrReplaceChild("left_eye", CubeListBuilder.create() + .texOffs(16, 12) + .addBox(-1.0F, -1.0F, -2.0F, 3.0F, 3.0F, 3.0F), + PartPose.offset(2.5F, -1.0F, -4.5F)); + + head.addOrReplaceChild("right_antenna", CubeListBuilder.create() + .texOffs(38, 4) + .addBox(-12.0F, -0.5F, -0.5F, 12.0F, 1.0F, 1.0F), + PartPose.offsetAndRotation(-0.5F, -1.5F, -5.0F, 0.0F, -0.7853981633974483F, 0.2181661564992912F)); + + head.addOrReplaceChild("left_antenna", CubeListBuilder.create() + .texOffs(38, 6) + .addBox(0.0F, -0.5F, -0.5F, 12.0F, 1.0F, 1.0F), + PartPose.offsetAndRotation(0.5F, -1.5F, -5.0F, 0.0F, 0.7853981633974483F, -0.2181661564992912F)); + + partRoot.addOrReplaceChild("body", CubeListBuilder.create() + .texOffs(22, 9) + .addBox(-6.0F, 0.0F, -4.0F, 12.0F, 14.0F, 9.0F), + PartPose.offsetAndRotation(0.0F, 18.0F, -4.0F, 1.5707963267948966F, 0.0F, 0.0F)); + + partRoot.addOrReplaceChild("right_leg_1", CubeListBuilder.create() + .texOffs(40, 0) + .addBox(-10.0F, -1.0F, -1.0F, 10.0F, 2.0F, 2.0F), + PartPose.offsetAndRotation(-3.0F, 21.0F, -3.0F, 0.0F, -0.39269908169872414F, -0.2181661564992912F)); + + partRoot.addOrReplaceChild("right_leg_2", CubeListBuilder.create() + .texOffs(40, 0) + .addBox(-10.0F, -1.0F, -1.0F, 10.0F, 2.0F, 2.0F), + PartPose.offsetAndRotation(-3.0F, 21.0F, 0.0F, 0.0F, 0.2181661564992912F, -0.2181661564992912F)); + + partRoot.addOrReplaceChild("right_leg_3", CubeListBuilder.create() + .texOffs(40, 0) + .addBox(-10.0F, -1.0F, -1.0F, 10.0F, 2.0F, 2.0F), + PartPose.offsetAndRotation(-3.0F, 21.0F, 4.0F, 0.0F, 0.39269908169872414F, -0.2181661564992912F)); + + partRoot.addOrReplaceChild("left_leg_1", CubeListBuilder.create() + .mirror() + .texOffs(40, 0) + .addBox(0.0F, -1.0F, -1.0F, 10.0F, 2.0F, 2.0F), + PartPose.offsetAndRotation(3.0F, 21.0F, -3.0F, 0.0F, 0.39269908169872414F, 0.2181661564992912F)); + + partRoot.addOrReplaceChild("left_leg_2", CubeListBuilder.create() + .mirror() + .texOffs(40, 0) + .addBox(0.0F, -1.0F, -1.0F, 10.0F, 2.0F, 2.0F), + PartPose.offsetAndRotation(3.0F, 21.0F, 0.0F, 0.0F, -0.2181661564992912F, 0.2181661564992912F)); + + partRoot.addOrReplaceChild("left_leg_3", CubeListBuilder.create() + .mirror() + .texOffs(40, 0) + .addBox(0.0F, -1.0F, -1.0F, 10.0F, 2.0F, 2.0F), + PartPose.offsetAndRotation(3.0F, 21.0F, 4.0F, 0.0F, -0.39269908169872414F, 0.2181661564992912F)); + + return LayerDefinition.create(mesh, 64, 32); + } + + @Override + public ModelPart root() { + return this.root; + } + + @Override + public void setupAnim(FireBeetle entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + this.head.yRot = netHeadYaw * Mth.DEG_TO_RAD; + this.head.xRot = headPitch * Mth.DEG_TO_RAD; + + float legZ = Mth.PI / 11F; + this.leftLeg1.zRot = legZ; + this.rightLeg1.zRot = -legZ; + this.leftLeg2.zRot = legZ * 0.74F; + this.rightLeg2.zRot = -legZ * 0.74F; + this.leftLeg3.zRot = legZ; + this.rightLeg3.zRot = -legZ; + + float var9 = -0.0F; + float var10 = 0.3926991F; + this.leftLeg1.yRot = var10 * 2.0F + var9; + this.rightLeg1.yRot = -var10 * 2.0F - var9; + this.leftLeg2.yRot = var10 + var9; + this.rightLeg2.yRot = -var10 - var9; + this.leftLeg3.yRot = -var10 * 2.0F + var9; + this.rightLeg3.yRot = var10 * 2.0F - var9; + + float var11 = -(Mth.cos(limbSwing * 0.6662F * 2.0F + 0.0F) * 0.4F) * limbSwingAmount; + float var12 = -(Mth.cos(limbSwing * 0.6662F * 2.0F + Mth.PI) * 0.4F) * limbSwingAmount; + float var14 = -(Mth.cos(limbSwing * 0.6662F * 2.0F + (Mth.PI * 1.5F)) * 0.4F) * limbSwingAmount; + + float var15 = Math.abs(Mth.sin(limbSwing * 0.6662F + 0.0F) * 0.4F) * limbSwingAmount; + float var16 = Math.abs(Mth.sin(limbSwing * 0.6662F + Mth.PI) * 0.4F) * limbSwingAmount; + float var18 = Math.abs(Mth.sin(limbSwing * 0.6662F + (Mth.PI * 1.5F)) * 0.4F) * limbSwingAmount; + + this.leftLeg1.yRot += var11; + this.rightLeg1.yRot += -var11; + this.leftLeg2.yRot += var12; + this.rightLeg2.yRot += -var12; + this.leftLeg3.yRot += var14; + this.rightLeg3.yRot += -var14; + + this.leftLeg1.zRot += var15; + this.rightLeg1.zRot += -var15; + + this.leftLeg2.zRot += var16; + this.rightLeg2.zRot += -var16; + + this.leftLeg3.zRot += var18; + this.rightLeg3.zRot += -var18; + } +} diff --git a/src/main/java/twilightforest/client/model/entity/FireflyModel.java b/src/main/java/twilightforest/client/model/entity/FireflyModel.java new file mode 100644 index 0000000000..fc6e008465 --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/FireflyModel.java @@ -0,0 +1,63 @@ +package twilightforest.client.model.entity; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.model.Model; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; +import net.minecraft.client.renderer.RenderType; + +public class FireflyModel extends Model { + //fields + public final ModelPart legs; + public ModelPart fatbody; + public ModelPart skinnybody; + public ModelPart glow; + + public FireflyModel(ModelPart root) { + super(RenderType::entityCutoutNoCull); + + this.legs = root.getChild("legs"); + this.fatbody = root.getChild("fat_body"); + this.skinnybody = root.getChild("skinny_body"); + this.glow = root.getChild("glow"); + } + + public static LayerDefinition create() { + MeshDefinition meshdefinition = new MeshDefinition(); + PartDefinition partdefinition = meshdefinition.getRoot(); + partdefinition.addOrReplaceChild("legs", + CubeListBuilder.create() + .texOffs(0, 21) + .addBox(-4.0F, 7.9F, -5.0F, 8.0F, 1.0F, 10.0F), + PartPose.ZERO); + partdefinition.addOrReplaceChild("fat_body", + CubeListBuilder.create() + .texOffs(0, 11) + .addBox(-2.0F, 6.0F, -4.0F, 4.0F, 2.0F, 6.0F), + PartPose.ZERO); + partdefinition.addOrReplaceChild("skinny_body", + CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-1.0F, 6.9F, -5.0F, 2.0F, 1.0F, 8.0F), + PartPose.ZERO); + partdefinition.addOrReplaceChild("glow", + CubeListBuilder.create() + .texOffs(20, 0) + .addBox(-5.0F, 5.9F, -9.0F, 10.0F, 0.0F, 10.0F), + PartPose.ZERO); + + return LayerDefinition.create(meshdefinition, 64, 32); + } + + @Override + public void renderToBuffer(PoseStack stack, VertexConsumer consumer, int light, int overlay, float red, float green, float blue, float alpha) { + this.legs.render(stack, consumer, light, overlay, red, green, blue, alpha); + this.fatbody.render(stack, consumer, light, overlay, red, green, blue, alpha); + this.skinnybody.render(stack, consumer, light, overlay, red, green, blue, alpha); + } +} diff --git a/src/main/java/twilightforest/client/model/entity/FixedHumanoidModel.java b/src/main/java/twilightforest/client/model/entity/FixedHumanoidModel.java new file mode 100644 index 0000000000..b4d86389df --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/FixedHumanoidModel.java @@ -0,0 +1,153 @@ +package twilightforest.client.model.entity; + +import net.minecraft.client.model.AnimationUtils; +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.util.Mth; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.HumanoidArm; +import net.minecraft.world.entity.LivingEntity; + +//fixes probably my biggest issue with HumanoidModel: the hardcoded positions of limbs. +//this is most noticeable in the body (which is offset by 24 voxels), but it also fixes mobs that have smaller or bigger arms. +//this also cleans up some movement logic that doesnt apply to mobs (swimming and elytra flying) +public class FixedHumanoidModel extends HumanoidModel { + private final float armWidth; + + public FixedHumanoidModel(ModelPart part, float armWidth) { + super(part); + this.armWidth = armWidth; + } + + @Override + public void setupAnim(T entity, float limbSwing, float limbSwingAmount, float ageInTicks, float headYaw, float headPitch) { + this.head.yRot = headYaw * Mth.DEG_TO_RAD; + this.head.xRot = headPitch * Mth.DEG_TO_RAD; + + this.body.yRot = 0.0F; + + this.rightArm.xRot = Mth.cos(limbSwing * 0.6662F + (float)Math.PI) * 2.0F * limbSwingAmount * 0.5F; + this.leftArm.xRot = Mth.cos(limbSwing * 0.6662F) * 2.0F * limbSwingAmount * 0.5F; + this.rightArm.zRot = 0.0F; + this.leftArm.zRot = 0.0F; + this.rightLeg.xRot = Mth.cos(limbSwing * 0.6662F) * 1.4F * limbSwingAmount; + this.leftLeg.xRot = Mth.cos(limbSwing * 0.6662F + (float)Math.PI) * 1.4F * limbSwingAmount; + this.rightLeg.yRot = 0.0F; + this.leftLeg.yRot = 0.0F; + this.rightLeg.zRot = 0.0F; + this.leftLeg.zRot = 0.0F; + if (this.riding) { + this.rightArm.xRot += (-(float)Math.PI / 5F); + this.leftArm.xRot += (-(float)Math.PI / 5F); + this.rightLeg.xRot = -1.4137167F; + this.rightLeg.yRot = ((float)Math.PI / 10F); + this.rightLeg.zRot = 0.07853982F; + this.leftLeg.xRot = -1.4137167F; + this.leftLeg.yRot = (-(float)Math.PI / 10F); + this.leftLeg.zRot = -0.07853982F; + } + + this.rightArm.yRot = 0.0F; + this.leftArm.yRot = 0.0F; + boolean flag2 = entity.getMainArm() == HumanoidArm.RIGHT; + if (entity.isUsingItem()) { + boolean flag3 = entity.getUsedItemHand() == InteractionHand.MAIN_HAND; + if (flag3 == flag2) { + this.poseRightArm(entity); + } else { + this.poseLeftArm(entity); + } + } else { + boolean flag4 = flag2 ? this.leftArmPose.isTwoHanded() : this.rightArmPose.isTwoHanded(); + if (flag2 != flag4) { + this.poseLeftArm(entity); + this.poseRightArm(entity); + } else { + this.poseRightArm(entity); + this.poseLeftArm(entity); + } + } + + this.setupAttackAnimation(entity, ageInTicks); + + if (this.rightArmPose != HumanoidModel.ArmPose.SPYGLASS) { + AnimationUtils.bobModelPart(this.rightArm, ageInTicks, 1.0F); + } + + if (this.leftArmPose != HumanoidModel.ArmPose.SPYGLASS) { + AnimationUtils.bobModelPart(this.leftArm, ageInTicks, -1.0F); + } + + if (this.swimAmount > 0.0F) { + float f5 = limbSwing % 26.0F; + HumanoidArm humanoidarm = this.getAttackArm(entity); + float f1 = humanoidarm == HumanoidArm.RIGHT && this.attackTime > 0.0F ? 0.0F : this.swimAmount; + float f2 = humanoidarm == HumanoidArm.LEFT && this.attackTime > 0.0F ? 0.0F : this.swimAmount; + if (!entity.isUsingItem()) { + if (f5 < 14.0F) { + this.leftArm.xRot = this.rotlerpRad(f2, this.leftArm.xRot, 0.0F); + this.rightArm.xRot = Mth.lerp(f1, this.rightArm.xRot, 0.0F); + this.leftArm.yRot = this.rotlerpRad(f2, this.leftArm.yRot, (float)Math.PI); + this.rightArm.yRot = Mth.lerp(f1, this.rightArm.yRot, (float)Math.PI); + this.leftArm.zRot = this.rotlerpRad(f2, this.leftArm.zRot, (float)Math.PI + 1.8707964F * this.quadraticArmUpdate(f5) / this.quadraticArmUpdate(14.0F)); + this.rightArm.zRot = Mth.lerp(f1, this.rightArm.zRot, (float)Math.PI - 1.8707964F * this.quadraticArmUpdate(f5) / this.quadraticArmUpdate(14.0F)); + } else if (f5 >= 14.0F && f5 < 22.0F) { + float f6 = (f5 - 14.0F) / 8.0F; + this.leftArm.xRot = this.rotlerpRad(f2, this.leftArm.xRot, ((float)Math.PI / 2F) * f6); + this.rightArm.xRot = Mth.lerp(f1, this.rightArm.xRot, ((float)Math.PI / 2F) * f6); + this.leftArm.yRot = this.rotlerpRad(f2, this.leftArm.yRot, (float)Math.PI); + this.rightArm.yRot = Mth.lerp(f1, this.rightArm.yRot, (float)Math.PI); + this.leftArm.zRot = this.rotlerpRad(f2, this.leftArm.zRot, 5.012389F - 1.8707964F * f6); + this.rightArm.zRot = Mth.lerp(f1, this.rightArm.zRot, 1.2707963F + 1.8707964F * f6); + } else if (f5 >= 22.0F && f5 < 26.0F) { + float f3 = (f5 - 22.0F) / 4.0F; + this.leftArm.xRot = this.rotlerpRad(f2, this.leftArm.xRot, ((float)Math.PI / 2F) - ((float)Math.PI / 2F) * f3); + this.rightArm.xRot = Mth.lerp(f1, this.rightArm.xRot, ((float)Math.PI / 2F) - ((float)Math.PI / 2F) * f3); + this.leftArm.yRot = this.rotlerpRad(f2, this.leftArm.yRot, (float)Math.PI); + this.rightArm.yRot = Mth.lerp(f1, this.rightArm.yRot, (float)Math.PI); + this.leftArm.zRot = this.rotlerpRad(f2, this.leftArm.zRot, (float)Math.PI); + this.rightArm.zRot = Mth.lerp(f1, this.rightArm.zRot, (float)Math.PI); + } + } + + this.leftLeg.xRot = Mth.lerp(this.swimAmount, this.leftLeg.xRot, 0.3F * Mth.cos(limbSwing * 0.33333334F + (float)Math.PI)); + this.rightLeg.xRot = Mth.lerp(this.swimAmount, this.rightLeg.xRot, 0.3F * Mth.cos(limbSwing * 0.33333334F)); + } + + this.hat.copyFrom(this.head); + } + + @Override + protected void setupAttackAnimation(T pLivingEntity, float pAgeInTicks) { + if (!(this.attackTime <= 0.0F)) { + HumanoidArm humanoidarm = this.getAttackArm(pLivingEntity); + ModelPart modelpart = this.getArm(humanoidarm); + float f = this.attackTime; + this.body.yRot = Mth.sin(Mth.sqrt(f) * ((float)Math.PI * 2F)) * 0.2F; + if (humanoidarm == HumanoidArm.LEFT) { + this.body.yRot *= -1.0F; + } + + this.rightArm.z = Mth.sin(this.body.yRot) * (this.armWidth + 1.0F); + this.rightArm.x = -Mth.cos(this.body.yRot) * (this.armWidth + 1.0F); + this.leftArm.z = -Mth.sin(this.body.yRot) * (this.armWidth + 1.0F); + this.leftArm.x = Mth.cos(this.body.yRot) * (this.armWidth + 1.0F); + this.rightArm.yRot += this.body.yRot; + this.leftArm.yRot += this.body.yRot; + this.leftArm.xRot += this.body.yRot; + f = 1.0F - this.attackTime; + f *= f; + f *= f; + f = 1.0F - f; + float f1 = Mth.sin(f * (float)Math.PI); + float f2 = Mth.sin(this.attackTime * (float)Math.PI) * -(this.head.xRot - 0.7F) * 0.75F; + modelpart.xRot -= f1 * 1.2F + f2; + modelpart.yRot += this.body.yRot * 2.0F; + modelpart.zRot += Mth.sin(this.attackTime * (float)Math.PI) * -0.4F; + } + } + + private float quadraticArmUpdate(float pLimbSwing) { + return -65.0F * pLimbSwing + pLimbSwing * pLimbSwing; + } +} diff --git a/src/main/java/twilightforest/client/model/entity/HarbingerCubeModel.java b/src/main/java/twilightforest/client/model/entity/HarbingerCubeModel.java new file mode 100644 index 0000000000..036ee59724 --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/HarbingerCubeModel.java @@ -0,0 +1,56 @@ +package twilightforest.client.model.entity; + +import net.minecraft.client.model.QuadrupedModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.*; +import twilightforest.entity.monster.HarbingerCube; + +public class HarbingerCubeModel extends QuadrupedModel { + + public HarbingerCubeModel(ModelPart part) { + super(part, false, 0.0F, 0.0F, 0.0F, 0.0F, 4); //All this is from AgeableModel. Do we scale? + } + + public static LayerDefinition create() { + MeshDefinition mesh = QuadrupedModel.createBodyMesh(0, CubeDeformation.NONE); + PartDefinition partRoot = mesh.getRoot(); + + partRoot.addOrReplaceChild("head", CubeListBuilder.create(), + PartPose.ZERO); + partRoot.addOrReplaceChild("body", CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-16.0F, -16.0F, -16.0F, 32.0F, 32.0F, 32.0F), + PartPose.offset(0.0F, 0.0F, -2.0F)); + partRoot.addOrReplaceChild("right_hind_leg", CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-4.0F, 0.0F, -4.0F, 8.0F, 8.0F, 8.0F), + PartPose.offset(-6F, 16F, 9F)); + partRoot.addOrReplaceChild("left_hind_leg", CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-4.0F, 0.0F, -4.0F, 8.0F, 8.0F, 8.0F), + PartPose.offset(6F, 16F, 9F)); + partRoot.addOrReplaceChild("right_front_leg", CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-4.0F, 0.0F, -4.0F, 8.0F, 8.0F, 8.0F), + PartPose.offset(-9F, 16F, -14F)); + partRoot.addOrReplaceChild("left_front_leg", CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-4.0F, 0.0F, -4.0F, 8.0F, 8.0F, 8.0F), + PartPose.offset(9F, 16F, -14F)); + + return LayerDefinition.create(mesh, 128, 64); + } + + /** + * Sets the model's various rotation angles. For bipeds, par1 and par2 are used for animating the movement of arms + * and legs, where par1 represents the time(so that arms and legs swing back and forth) and par2 represents how + * "far" arms and legs can swing at most. + */ + @Override + public void setupAnim(T entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + super.setupAnim(entity, limbSwing, limbSwingAmount, ageInTicks, netHeadYaw, headPitch); + + this.body.xRot = 0F; + } +} diff --git a/src/main/java/twilightforest/client/model/entity/HelmetCrabModel.java b/src/main/java/twilightforest/client/model/entity/HelmetCrabModel.java new file mode 100644 index 0000000000..1b3fa6d982 --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/HelmetCrabModel.java @@ -0,0 +1,141 @@ +package twilightforest.client.model.entity; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.model.HierarchicalModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.*; +import net.minecraft.util.Mth; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import twilightforest.entity.monster.HelmetCrab; + +/** + * ModelHelmetCrab - MCVinnyq + * Created using Tabula 8.0.0 + */ +@OnlyIn(Dist.CLIENT) +public class HelmetCrabModel extends HierarchicalModel { + public final ModelPart root; + public final ModelPart body; + public ModelPart leftClaw; + public ModelPart rightClaw; + public ModelPart rightLeg1, rightLeg2, leftLeg1, leftLeg2; + + public HelmetCrabModel(ModelPart root) { + this.root = root; + + this.body = root.getChild("body"); + + this.rightClaw = body.getChild("right_claw"); + this.leftClaw = body.getChild("left_claw"); + + this.rightLeg1 = root.getChild("right_leg_1"); + this.rightLeg2 = root.getChild("right_leg_2"); + this.leftLeg1 = root.getChild("left_leg_1"); + this.leftLeg2 = root.getChild("left_leg_2"); + + } + + public static LayerDefinition create() { + MeshDefinition mesh = new MeshDefinition(); + PartDefinition partRoot = mesh.getRoot(); + + var body = partRoot.addOrReplaceChild("body", CubeListBuilder.create() + .texOffs(0, 9) + .addBox(-2.5F, -4.0F, -2.5F, 5.0F, 4.0F, 5.0F) + .texOffs(58, 0) + .addBox(-1.5F, -5.0F, -3.5F, 1.0F, 2.0F, 1.0F) + .texOffs(58, 3) + .addBox(0.5F, -5.0F, -3.5F, 1.0F, 2.0F, 1.0F), + PartPose.offset(0.0F, 21.0F, 0.0F)); + + var helmet = body.addOrReplaceChild("helmet", CubeListBuilder.create() + .texOffs(40, 0) + .addBox(-4.0F, -8.0F, -4.0F, 6.0F, 8.0F, 6.0F) + .texOffs(16, 0) + .addBox(-4.0F, -8.0F, -4.0F, 6.0F, 8.0F, 6.0F, new CubeDeformation(-0.25F)), + PartPose.offsetAndRotation(0.0F, -1.0F, 0.5F, -1.3089969389957472F, -0.2617993877991494F, 0.7463027588580033F)); + + helmet.addOrReplaceChild("horns", CubeListBuilder.create() + .texOffs(18, 23) + .addBox(-11.5F, -12.0F, -0.67F, 23.0F, 9.0F, 0.0F), + PartPose.offsetAndRotation(0.0F, 0.0F, 0.0F, 0.0F, 0.7853981633974483F, 0.0F)); + + body.addOrReplaceChild("right_claw", CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-1.0F, -3.0F, -5.0F, 2.0F, 4.0F, 5.0F), + PartPose.offsetAndRotation(-3.0F, 0.0F, -3.0F, 0.0F, 0.39269908169872414F, 0.0F)); + + body.addOrReplaceChild("left_claw", CubeListBuilder.create() + .texOffs(0, 23) + .addBox(-1.0F, -3.0F, -5.0F, 2.0F, 4.0F, 5.0F), + PartPose.offsetAndRotation(3.0F, 0.0F, -3.0F, 0.0F, -0.39269908169872414F, 0.0F)); + + partRoot.addOrReplaceChild("right_leg_1", CubeListBuilder.create() + .texOffs(32, 15) + .addBox(-6.0F, -1.0F, -1.0F, 6.0F, 2.0F, 2.0F), + PartPose.offsetAndRotation(-2.0F, 21.0F, 0.0F, 0.2181661564992912F, 0.4363323129985824F, -0.4363323129985824F)); + + partRoot.addOrReplaceChild("left_leg_1", CubeListBuilder.create() + .texOffs(48, 19) + .addBox(0.0F, -1.0F, -1.0F, 6.0F, 2.0F, 2.0F), + PartPose.offsetAndRotation(2.0F, 21.0F, 0.0F, 0.2181661564992912F, -0.4363323129985824F, 0.4363323129985824F)); + + partRoot.addOrReplaceChild("right_leg_2", CubeListBuilder.create() + .texOffs(32, 19) + .addBox(-6.0F, -1.0F, -1.0F, 6.0F, 2.0F, 2.0F), + PartPose.offsetAndRotation(-2.0F, 21.0F, -1.5F, 0.2181661564992912F, 0.0F, -0.4363323129985824F)); + + partRoot.addOrReplaceChild("left_leg_2", CubeListBuilder.create() + .texOffs(48, 15) + .addBox(0.0F, -1.0F, -1.0F, 6.0F, 2.0F, 2.0F), + PartPose.offsetAndRotation(2.0F, 21.0F, -1.5F, 0.2181661564992912F, 0.0F, 0.4363323129985824F)); + + + return LayerDefinition.create(mesh, 64, 32); + } + + @Override + public ModelPart root() { + return this.root; + } + + @Override + public void setupAnim(HelmetCrab entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + + this.body.yRot = netHeadYaw / (180F / (float) Math.PI); + this.body.xRot = headPitch / (180F / (float) Math.PI); + float f6 = ((float) Math.PI / 4F); + this.rightLeg1.zRot = -f6 * 0.74F; + this.leftLeg1.zRot = f6 * 0.74F; + this.rightLeg2.zRot = -f6 * 0.74F; + this.leftLeg2.zRot = f6 * 0.74F; + float f7 = -0.0F; + float f8 = 0.3926991F; + this.rightLeg1.yRot = f8 + f7; + this.leftLeg1.yRot = -f8 - f7; + this.rightLeg2.yRot = -f8 + f7; + this.leftLeg2.yRot = f8 - f7; + float f10 = -(Mth.cos(limbSwing * 0.6662F * 2.0F + (float) Math.PI) * 0.4F) * limbSwingAmount; + float f11 = -(Mth.cos(limbSwing * 0.6662F * 2.0F + ((float) Math.PI / 2F)) * 0.4F) * limbSwingAmount; + float f14 = Math.abs(Mth.sin(limbSwing * 0.6662F + (float) Math.PI) * 0.4F) * limbSwingAmount; + float f15 = Math.abs(Mth.sin(limbSwing * 0.6662F + ((float) Math.PI / 2F)) * 0.4F) * limbSwingAmount; + this.rightLeg1.yRot += f10; + this.leftLeg1.yRot += -f10; + this.rightLeg2.yRot += f11; + this.leftLeg2.yRot += -f11; + this.rightLeg1.zRot += f14; + this.leftLeg1.zRot += -f14; + this.rightLeg2.zRot += f15; + this.leftLeg2.zRot += -f15; + + // swing right arm as if it were an arm, not a leg + this.leftClaw.yRot = -0.319531F; + this.leftClaw.yRot += -(Mth.cos(limbSwing * 0.6662F + (float) Math.PI) * 2.0F * limbSwingAmount * 0.5F) / 2; + this.rightClaw.yRot = 0.319531F; + this.rightClaw.yRot += (Mth.cos(limbSwing * 0.6662F + (float) Math.PI) * 2.0F * limbSwingAmount * 0.5F) / 2; + + } +} diff --git a/src/main/java/twilightforest/client/model/entity/HostileWolfModel.java b/src/main/java/twilightforest/client/model/entity/HostileWolfModel.java new file mode 100644 index 0000000000..354e4cf91f --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/HostileWolfModel.java @@ -0,0 +1,88 @@ +package twilightforest.client.model.entity; + +import com.google.common.collect.ImmutableList; +import net.minecraft.client.model.AgeableListModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; +import net.minecraft.util.Mth; +import twilightforest.entity.monster.HostileWolf; + +public class HostileWolfModel extends AgeableListModel { + private final ModelPart head; + private final ModelPart body; + private final ModelPart rightHindLeg; + private final ModelPart leftHindLeg; + private final ModelPart rightFrontLeg; + private final ModelPart leftFrontLeg; + private final ModelPart tail; + private final ModelPart upperBody; + + public HostileWolfModel(ModelPart p_171087_) { + this.head = p_171087_.getChild("head"); + this.body = p_171087_.getChild("body"); + this.upperBody = p_171087_.getChild("upper_body"); + this.rightHindLeg = p_171087_.getChild("right_hind_leg"); + this.leftHindLeg = p_171087_.getChild("left_hind_leg"); + this.rightFrontLeg = p_171087_.getChild("right_front_leg"); + this.leftFrontLeg = p_171087_.getChild("left_front_leg"); + this.tail = p_171087_.getChild("tail"); + } + + public static LayerDefinition create() { + MeshDefinition meshdefinition = new MeshDefinition(); + PartDefinition partdefinition = meshdefinition.getRoot(); + float f = 13.5F; + PartDefinition partdefinition1 = partdefinition.addOrReplaceChild("head", CubeListBuilder.create(), PartPose.offset(-1.0F, 13.5F, -7.0F)); + partdefinition1.addOrReplaceChild("real_head", CubeListBuilder.create().texOffs(0, 0).addBox(-2.0F, -3.0F, -2.0F, 6.0F, 6.0F, 4.0F).texOffs(16, 14).addBox(-2.0F, -5.0F, 0.0F, 2.0F, 2.0F, 1.0F).texOffs(16, 14).addBox(2.0F, -5.0F, 0.0F, 2.0F, 2.0F, 1.0F).texOffs(0, 10).addBox(-0.5F, 0.0F, -5.0F, 3.0F, 3.0F, 4.0F), PartPose.ZERO); + partdefinition.addOrReplaceChild("body", CubeListBuilder.create().texOffs(18, 14).addBox(-3.0F, -2.0F, -3.0F, 6.0F, 9.0F, 6.0F), PartPose.offsetAndRotation(0.0F, 14.0F, 2.0F, ((float)Math.PI / 2F), 0.0F, 0.0F)); + partdefinition.addOrReplaceChild("upper_body", CubeListBuilder.create().texOffs(21, 0).addBox(-3.0F, -3.0F, -3.0F, 8.0F, 6.0F, 7.0F), PartPose.offsetAndRotation(-1.0F, 14.0F, -3.0F, ((float)Math.PI / 2F), 0.0F, 0.0F)); + CubeListBuilder cubelistbuilder = CubeListBuilder.create().texOffs(0, 18).addBox(0.0F, 0.0F, -1.0F, 2.0F, 8.0F, 2.0F); + partdefinition.addOrReplaceChild("right_hind_leg", cubelistbuilder, PartPose.offset(-2.5F, 16.0F, 7.0F)); + partdefinition.addOrReplaceChild("left_hind_leg", cubelistbuilder, PartPose.offset(0.5F, 16.0F, 7.0F)); + partdefinition.addOrReplaceChild("right_front_leg", cubelistbuilder, PartPose.offset(-2.5F, 16.0F, -4.0F)); + partdefinition.addOrReplaceChild("left_front_leg", cubelistbuilder, PartPose.offset(0.5F, 16.0F, -4.0F)); + PartDefinition partdefinition2 = partdefinition.addOrReplaceChild("tail", CubeListBuilder.create(), PartPose.offsetAndRotation(-1.0F, 12.0F, 8.0F, ((float)Math.PI / 5F), 0.0F, 0.0F)); + partdefinition2.addOrReplaceChild("real_tail", CubeListBuilder.create().texOffs(9, 18).addBox(0.0F, 0.0F, -1.0F, 2.0F, 8.0F, 2.0F), PartPose.ZERO); + return LayerDefinition.create(meshdefinition, 64, 32); + } + + protected Iterable headParts() { + return ImmutableList.of(this.head); + } + + protected Iterable bodyParts() { + return ImmutableList.of(this.body, this.rightHindLeg, this.leftHindLeg, this.rightFrontLeg, this.leftFrontLeg, this.tail, this.upperBody); + } + + public void prepareMobModel(T p_104132_, float p_104133_, float p_104134_, float p_104135_) { + if (p_104132_.isAggressive()) { + this.tail.yRot = 0.0F; + } else { + this.tail.yRot = Mth.cos(p_104133_ * 0.6662F) * 1.4F * p_104134_; + } + + this.body.setPos(0.0F, 14.0F, 2.0F); + this.body.xRot = ((float)Math.PI / 2F); + this.upperBody.setPos(-1.0F, 14.0F, -3.0F); + this.upperBody.xRot = this.body.xRot; + this.tail.setPos(-1.0F, 12.0F, 8.0F); + this.rightHindLeg.setPos(-2.5F, 16.0F, 7.0F); + this.leftHindLeg.setPos(0.5F, 16.0F, 7.0F); + this.rightFrontLeg.setPos(-2.5F, 16.0F, -4.0F); + this.leftFrontLeg.setPos(0.5F, 16.0F, -4.0F); + this.rightHindLeg.xRot = Mth.cos(p_104133_ * 0.6662F) * 1.4F * p_104134_; + this.leftHindLeg.xRot = Mth.cos(p_104133_ * 0.6662F + (float)Math.PI) * 1.4F * p_104134_; + this.rightFrontLeg.xRot = Mth.cos(p_104133_ * 0.6662F + (float)Math.PI) * 1.4F * p_104134_; + this.leftFrontLeg.xRot = Mth.cos(p_104133_ * 0.6662F) * 1.4F * p_104134_; + } + + public void setupAnim(T p_104137_, float p_104138_, float p_104139_, float p_104140_, float p_104141_, float p_104142_) { + this.head.xRot = p_104142_ * ((float)Math.PI / 180F); + this.head.yRot = p_104141_ * ((float)Math.PI / 180F); + this.tail.xRot = p_104140_; + } +} diff --git a/src/main/java/twilightforest/client/model/entity/HydraHeadModel.java b/src/main/java/twilightforest/client/model/entity/HydraHeadModel.java new file mode 100644 index 0000000000..3a199bd65e --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/HydraHeadModel.java @@ -0,0 +1,82 @@ +package twilightforest.client.model.entity; + +import com.google.common.collect.ImmutableList; +import net.minecraft.client.model.ListModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; +import net.minecraft.util.Mth; +import twilightforest.entity.boss.HydraHead; +import twilightforest.entity.boss.HydraPart; + +public class HydraHeadModel extends ListModel { + + public final ModelPart head; + public ModelPart mouth; + + public HydraHeadModel(ModelPart root) { + this.head = root.getChild("head"); + this.mouth = head.getChild("mouth"); + } + + public static LayerDefinition create() { + MeshDefinition mesh = new MeshDefinition(); + PartDefinition partRoot = mesh.getRoot(); + + var head = partRoot.addOrReplaceChild("head", CubeListBuilder.create() + .texOffs(260, 64) + .addBox(-16.0F, -16.0F, -16.0F, 32.0F, 32.0F, 32.0F) + .texOffs(236, 128) + .addBox(-16.0F, -2.0F, -40.0F, 32.0F, 10.0F, 24.0F) + .texOffs(356, 70) + .addBox(-12.0F, 8.0F, -36.0F, 24.0F, 6.0F, 20.0F), + PartPose.ZERO); + + head.addOrReplaceChild("mouth", CubeListBuilder.create() + .texOffs(240, 162) + .addBox(-15.0F, 0.0F, -24.0F, 30.0F, 8.0F, 24.0F), + PartPose.offset(0.0F, 10.0F, -14.0F)); + + head.addOrReplaceChild("plate", CubeListBuilder.create() + .texOffs(388, 0) + .addBox(-24.0F, -48.0F, 0.0F, 48.0F, 48.0F, 6.0F) + .texOffs(220, 0) + .addBox(-4.0F, -32.0F, -8.0F, 8.0F, 32.0F, 8.0F), + PartPose.offsetAndRotation(0.0F, 0.0F, 0.0F, -0.7853981633974483F, 0.0F, 0.0F)); + + return LayerDefinition.create(mesh, 512, 256); + } + + @Override + public void setupAnim(HydraHead entity, float v, float v1, float v2, float v3, float v4) { } + + @Override + public void prepareMobModel(HydraHead entity, float limbSwing, float limbSwingAmount, float partialTicks) { + head.yRot = getRotationY(entity, partialTicks); + head.xRot = getRotationX(entity, partialTicks); + + float mouthOpenLast = entity.getMouthOpenLast(); + float mouthOpenReal = entity.getMouthOpen(); + float mouthOpen = Mth.lerp(partialTicks, mouthOpenLast, mouthOpenReal); + head.xRot -= (float) (mouthOpen * (Math.PI / 12.0)); + mouth.xRot = (float) (mouthOpen * (Math.PI / 3.0)); + } + + public float getRotationY(HydraPart whichHead, float time) { + float yaw = whichHead.yRotO + (whichHead.getYRot() - whichHead.yRotO) * time; + + return yaw / 57.29578F; + } + + public float getRotationX(HydraPart whichHead, float time) { + return (whichHead.xRotO + (whichHead.getXRot() - whichHead.xRotO) * time) / 57.29578F; + } + + @Override + public Iterable parts() { + return ImmutableList.of(head); + } +} diff --git a/src/main/java/twilightforest/client/model/entity/HydraModel.java b/src/main/java/twilightforest/client/model/entity/HydraModel.java new file mode 100644 index 0000000000..b7e0154e4e --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/HydraModel.java @@ -0,0 +1,236 @@ +package twilightforest.client.model.entity; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.model.HierarchicalModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; +import net.minecraft.util.Mth; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import org.jetbrains.annotations.Nullable; +import twilightforest.entity.boss.Hydra; + +/** + * ModelHydra - MCVinnyq + * Created using Tabula 8.0.0 + */ +@OnlyIn(Dist.CLIENT) +public class HydraModel extends HierarchicalModel { + + public final ModelPart root; + public final ModelPart body; + public ModelPart tail; + public ModelPart rightLeg; + public ModelPart leftLeg; + + @Nullable + private Hydra hydra; + + public HydraModel(ModelPart root) { + this.root = root; + this.body = root.getChild("torso"); + this.tail = root.getChild("tail_1"); + this.rightLeg = root.getChild("right_leg"); + this.leftLeg = root.getChild("left_leg"); + } + + public static LayerDefinition create() { + MeshDefinition mesh = new MeshDefinition(); + PartDefinition partRoot = mesh.getRoot(); + + var head1 = partRoot.addOrReplaceChild("head_1", CubeListBuilder.create() + .texOffs(260, 64) + .addBox(-16.0F, -16.0F, -16.0F, 32.0F, 32.0F, 32.0F) + .texOffs(236, 128) + .addBox(-16.0F, -2.0F, -40.0F, 32.0F, 10.0F, 24.0F) + .texOffs(356, 70) + .addBox(-12.0F, 8.0F, -36.0F, 24.0F, 6.0F, 20.0F), + PartPose.offset(-74.0F, -100.0F, -56.0F)); + + var head2 = partRoot.addOrReplaceChild("head_2", CubeListBuilder.create() + .texOffs(260, 64) + .addBox(-16.0F, -16.0F, -16.0F, 32.0F, 32.0F, 32.0F) + .texOffs(236, 128) + .addBox(-16.0F, -2.0F, -40.0F, 32.0F, 10.0F, 24.0F) + .texOffs(356, 70) + .addBox(-12.0F, 8.0F, -36.0F, 24.0F, 6.0F, 20.0F), + PartPose.offset(0.0F, -116.0F, -56.0F)); + + var head3 = partRoot.addOrReplaceChild("head_3", CubeListBuilder.create() + .texOffs(260, 64) + .addBox(-16.0F, -16.0F, -16.0F, 32.0F, 32.0F, 32.0F) + .texOffs(236, 128) + .addBox(-16.0F, -2.0F, -40.0F, 32.0F, 10.0F, 24.0F) + .texOffs(356, 70) + .addBox(-12.0F, 8.0F, -36.0F, 24.0F, 6.0F, 20.0F), + PartPose.offset(74.0F, -100.0F, -56.0F)); + + head1.addOrReplaceChild("mouth_1", CubeListBuilder.create() + .texOffs(240, 162) + .addBox(-15.0F, 0.0F, -24.0F, 30.0F, 8.0F, 24.0F), + PartPose.offset(0.0F, 8.0F, -16.0F)); + + head2.addOrReplaceChild("mouth_2", CubeListBuilder.create() + .texOffs(240, 162) + .addBox(-15.0F, 0.0F, -24.0F, 30.0F, 8.0F, 24.0F), + PartPose.offset(0.0F, 8.0F, -16.0F)); + + head3.addOrReplaceChild("mouth_3", CubeListBuilder.create() + .texOffs(240, 162) + .addBox(-15.0F, 0.0F, -24.0F, 30.0F, 8.0F, 24.0F), + PartPose.offset(0.0F, 8.0F, -16.0F)); + + head1.addOrReplaceChild("plate_1", CubeListBuilder.create() + .texOffs(388, 0) + .addBox(-24.0F, -48.0F, 0.0F, 48.0F, 48.0F, 6.0F) + .texOffs(220, 0) + .addBox(-4.0F, -32.0F, -8.0F, 8.0F, 32.0F, 8.0F), + PartPose.offsetAndRotation(0.0F, 0.0F, -1.0F, -0.7853981633974483F, 0.0F, 0.0F)); + + head2.addOrReplaceChild("plate_2", CubeListBuilder.create() + .texOffs(388, 0) + .addBox(-24.0F, -48.0F, 0.0F, 48.0F, 48.0F, 6.0F) + .texOffs(220, 0) + .addBox(-4.0F, -32.0F, -8.0F, 8.0F, 32.0F, 8.0F), + PartPose.offsetAndRotation(0.0F, 0.0F, -1.0F, -0.7853981633974483F, 0.0F, 0.0F)); + + head3.addOrReplaceChild("plate_3", CubeListBuilder.create() + .texOffs(388, 0) + .addBox(-24.0F, -48.0F, 0.0F, 48.0F, 48.0F, 6.0F) + .texOffs(220, 0) + .addBox(-4.0F, -32.0F, -8.0F, 8.0F, 32.0F, 8.0F), + PartPose.offsetAndRotation(0.0F, 0.0F, -1.0F, -0.7853981633974483F, 0.0F, 0.0F)); + + var neck1 = partRoot.addOrReplaceChild("neck_1", CubeListBuilder.create() + .texOffs(260, 0).addBox(-16.0F, -16.0F, -16.0F, 32.0F, 32.0F, 32.0F) + .texOffs(0, 0).addBox(-2.0F, -24.0F, 0.0F, 4.0F, 8.0F, 16.0F), + PartPose.offset(-42.0F, -48.0F, 0.0F)); + + var neck2 = partRoot.addOrReplaceChild("neck_2", CubeListBuilder.create() + .texOffs(260, 0).addBox(-16.0F, -16.0F, -16.0F, 32.0F, 32.0F, 32.0F) + .texOffs(0, 0).addBox(-2.0F, -24.0F, 0.0F, 4.0F, 8.0F, 16.0F), + PartPose.offset(0.0F, -48.0F, 0.0F)); + + var neck3 = partRoot.addOrReplaceChild("neck_3", CubeListBuilder.create() + .texOffs(260, 0).addBox(-16.0F, -16.0F, -16.0F, 32.0F, 32.0F, 32.0F) + .texOffs(0, 0).addBox(-2.0F, -24.0F, 0.0F, 4.0F, 8.0F, 16.0F), + PartPose.offset(42.0F, -48.0F, 0.0F)); + + var neck4 = neck1.addOrReplaceChild("neck_4", CubeListBuilder.create() + .texOffs(260, 0).addBox(-16.0F, -16.0F, -16.0F, 32.0F, 32.0F, 32.0F) + .texOffs(0, 0).addBox(-2.0F, -24.0F, 0.0F, 4.0F, 8.0F, 16.0F), + PartPose.offset(-16.0F, -16.0F, -16.0F)); + + var neck5 = neck2.addOrReplaceChild("neck_5", CubeListBuilder.create() + .texOffs(260, 0).addBox(-16.0F, -16.0F, -16.0F, 32.0F, 32.0F, 32.0F) + .texOffs(0, 0).addBox(-2.0F, -24.0F, 0.0F, 4.0F, 8.0F, 16.0F), + PartPose.offset(0.0F, -24.0F, -16.0F)); + + var neck6 = neck3.addOrReplaceChild("neck_6", CubeListBuilder.create() + .texOffs(260, 0).addBox(-16.0F, -16.0F, -16.0F, 32.0F, 32.0F, 32.0F) + .texOffs(0, 0).addBox(-2.0F, -24.0F, 0.0F, 4.0F, 8.0F, 16.0F), + PartPose.offset(16.0F, -16.0F, -16.0F)); + + neck4.addOrReplaceChild("neck_7", CubeListBuilder.create() + .texOffs(260, 0).addBox(-16.0F, -16.0F, -16.0F, 32.0F, 32.0F, 32.0F) + .texOffs(0, 0).addBox(-2.0F, -24.0F, 0.0F, 4.0F, 8.0F, 16.0F), + PartPose.offset(-16.0F, -16.0F, -16.0F)); + + neck5.addOrReplaceChild("neck_8", CubeListBuilder.create() + .texOffs(260, 0).addBox(-16.0F, -16.0F, -16.0F, 32.0F, 32.0F, 32.0F) + .texOffs(0, 0).addBox(-2.0F, -24.0F, 0.0F, 4.0F, 8.0F, 16.0F), + PartPose.offset(0.0F, -24.0F, -16.0F)); + + neck6.addOrReplaceChild("neck_9", CubeListBuilder.create() + .texOffs(260, 0).addBox(-16.0F, -16.0F, -16.0F, 32.0F, 32.0F, 32.0F) + .texOffs(0, 0).addBox(-2.0F, -24.0F, 0.0F, 4.0F, 8.0F, 16.0F), + PartPose.offset(16.0F, -16.0F, -16.0F)); + + partRoot.addOrReplaceChild("torso", CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-45.0F, -12.0F, -20.0F, 90.0F, 96.0F, 40.0F) + .texOffs(88, 136) + .addBox(-2.0F, 20.0F, 20.0F, 4.0F, 16.0F, 12.0F) + .texOffs(120, 136) + .addBox(-2.0F, 48.0F, 20.0F, 4.0F, 16.0F, 12.0F), + PartPose.offsetAndRotation(0.0F, -32.0F, 0.0F, 1.117010721276371F, 0.0F, 0.0F)); + + partRoot.addOrReplaceChild("right_leg", CubeListBuilder.create() + .texOffs(0, 136) + .addBox(-14.0F, -8.0F, -16.0F, 28.0F, 52.0F, 32.0F) + .texOffs(0, 220) + .addBox(-14.0F, 36.0F, -22.0F, 28.0F, 8.0F, 6.0F), + PartPose.offset(-40.0F, -20.0F, -12.0F)); + + partRoot.addOrReplaceChild("left_leg", CubeListBuilder.create() + .texOffs(120, 136) + .addBox(-14.0F, -8.0F, -16.0F, 28.0F, 52.0F, 32.0F) + .texOffs(68, 220) + .addBox(-14.0F, 36.0F, -22.0F, 28.0F, 8.0F, 6.0F), + PartPose.offset(40.0F, -20.0F, -12.0F)); + + var tail1 = partRoot.addOrReplaceChild("tail_1", CubeListBuilder.create() + .texOffs(260, 0) + .addBox(-16.0F, -16.0F, -16.0F, 32.0F, 32.0F, 32.0F) + .texOffs(0, 0) + .addBox(-2.0F, -24.0F, 0.0F, 4.0F, 8.0F, 16.0F), + PartPose.offset(0.0F, 8.0F, 80.0F)); + + var tail2 = tail1.addOrReplaceChild("tail_2", CubeListBuilder.create() + .texOffs(260, 0) + .addBox(-16.0F, -16.0F, -16.0F, 32.0F, 32.0F, 32.0F) + .texOffs(0, 0) + .addBox(-2.0F, -24.0F, 0.0F, 4.0F, 8.0F, 16.0F), + PartPose.offset(0.0F, 0.0F, 32.0F)); + + var tail3 = tail2.addOrReplaceChild("tail_3", CubeListBuilder.create() + .texOffs(260, 0) + .addBox(-16.0F, -16.0F, -16.0F, 32.0F, 32.0F, 32.0F) + .texOffs(0, 0) + .addBox(-2.0F, -24.0F, 0.0F, 4.0F, 8.0F, 16.0F), + PartPose.offset(0.0F, 0.0F, 32.0F)); + + tail3.addOrReplaceChild("tail_4", CubeListBuilder.create() + .texOffs(260, 0) + .addBox(-16.0F, -16.0F, -16.0F, 32.0F, 32.0F, 32.0F) + .texOffs(0, 0) + .addBox(-2.0F, -24.0F, 0.0F, 4.0F, 8.0F, 16.0F), + PartPose.offset(0.0F, 0.0F, 32.0F)); + + return LayerDefinition.create(mesh, 512, 256); + } + + @Override + public ModelPart root() { + return this.root; + } + + @Override + public void renderToBuffer(PoseStack stack, VertexConsumer consumer, int light, int overlay, float red, float green, float blue, float alpha) { + if (this.hydra != null && this.hydra.renderFakeHeads) { + super.renderToBuffer(stack, consumer, light, overlay, red, green, blue, alpha); + } else { + this.leftLeg.render(stack, consumer, light, overlay, red, green, blue, alpha); + this.rightLeg.render(stack, consumer, light, overlay, red, green, blue, alpha); + this.body.render(stack, consumer, light, overlay, red, green, blue, alpha); + this.tail.render(stack, consumer, light, overlay, red, green, blue, alpha); + } + this.hydra = null; + } + + @Override + public void setupAnim(Hydra entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + + this.hydra = entity; + this.leftLeg.xRot = Mth.cos(limbSwing * 0.6662F) * 1.4F * limbSwingAmount; + this.rightLeg.xRot = Mth.cos(limbSwing * 0.6662F + 3.141593F) * 1.4F * limbSwingAmount; + + this.leftLeg.yRot = 0.0F; + this.rightLeg.yRot = 0.0F; + } +} diff --git a/src/main/java/twilightforest/client/model/entity/HydraMortarModel.java b/src/main/java/twilightforest/client/model/entity/HydraMortarModel.java new file mode 100644 index 0000000000..02788cd43b --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/HydraMortarModel.java @@ -0,0 +1,39 @@ +package twilightforest.client.model.entity; + +import net.minecraft.client.model.HierarchicalModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; +import twilightforest.entity.boss.HydraMortar; + +public class HydraMortarModel extends HierarchicalModel { + + public final ModelPart root; + + public HydraMortarModel(ModelPart root) { + this.root = root; + } + + public static LayerDefinition create() { + MeshDefinition mesh = new MeshDefinition(); + PartDefinition partRoot = mesh.getRoot(); + + partRoot.addOrReplaceChild("mortar", CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-4.0F, 0.0F, -4.0F, 8.0F, 8.0F, 8.0F), + PartPose.ZERO); + + return LayerDefinition.create(mesh, 32, 32); + } + + @Override + public ModelPart root() { + return this.root; + } + + @Override + public void setupAnim(HydraMortar entity, float v, float v1, float v2, float v3, float v4) { } +} diff --git a/src/main/java/twilightforest/client/model/entity/HydraNeckModel.java b/src/main/java/twilightforest/client/model/entity/HydraNeckModel.java new file mode 100644 index 0000000000..b769d5d6ca --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/HydraNeckModel.java @@ -0,0 +1,45 @@ +package twilightforest.client.model.entity; + +import com.google.common.collect.ImmutableList; +import net.minecraft.client.model.ListModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; +import twilightforest.entity.boss.HydraNeck; + +public class HydraNeckModel extends ListModel { + + final ModelPart neck; + + public HydraNeckModel(ModelPart root) { + this.neck = root.getChild("neck"); + } + + public static LayerDefinition create() { + MeshDefinition mesh = new MeshDefinition(); + PartDefinition partRoot = mesh.getRoot(); + + partRoot.addOrReplaceChild("neck", CubeListBuilder.create() + .texOffs(260, 0) + .addBox(-16.0F, -16.0F, -16.0F, 32.0F, 32.0F, 32.0F) + .texOffs(0, 0) + .addBox(-2.0F, -24.0F, 0.0F, 4.0F, 8.0F, 16.0F), + PartPose.ZERO); + + return LayerDefinition.create(mesh, 512, 256); + } + + @Override + public void setupAnim(HydraNeck entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + neck.yRot = netHeadYaw / 57.29578F; + neck.xRot = headPitch / 57.29578F; + } + + @Override + public Iterable parts() { + return ImmutableList.of(neck); + } +} diff --git a/src/main/java/twilightforest/client/model/entity/IceCrystalModel.java b/src/main/java/twilightforest/client/model/entity/IceCrystalModel.java new file mode 100644 index 0000000000..a7b3b3e0c1 --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/IceCrystalModel.java @@ -0,0 +1,89 @@ +package twilightforest.client.model.entity; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.model.HierarchicalModel; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.util.Mth; +import twilightforest.entity.monster.IceCrystal; + +public class IceCrystalModel extends HierarchicalModel { + + private final ModelPart root; + private final ModelPart[] spikes = new ModelPart[16]; + + private boolean alive; + + public IceCrystalModel(ModelPart root) { + super(RenderType::entityTranslucent); + this.root = root; + + for (int i = 0; i < spikes.length; i++) { + this.spikes[i] = root.getChild("spike_" + i); + } + + } + + public static LayerDefinition create() { + MeshDefinition mesh = new MeshDefinition(); + PartDefinition partRoot = mesh.getRoot(); + + for (int i = 0; i < 16; i++) { + + int spikeLength = i % 2 == 0 ? 6 : 8; + + var spike = partRoot.addOrReplaceChild("spike_" + i, CubeListBuilder.create() + .texOffs(0, 16) + .addBox(-1.0F, -1.0F, -1.0F, 2.0F, spikeLength, 2.0F), + PartPose.ZERO); + + spike.addOrReplaceChild("cube_" + i, CubeListBuilder.create() + .texOffs(8, 16) + .addBox(-1.5F, -1.5F, -1.5F, 3.0F, 3.0F, 3.0F), + PartPose.offsetAndRotation(0.0F, spikeLength, 0.0F, 0.0F, 0.0F, (Mth.PI / 4F))); + } + + return LayerDefinition.create(mesh, 32, 32); + } + + @Override + public ModelPart root() { + return this.root; + } + + @Override + public void renderToBuffer(PoseStack stack, VertexConsumer builder, int light, int overlay, float red, float green, float blue, float alpha) { + for (ModelPart spike : spikes) { + spike.render(stack, builder, light, overlay, red, green, blue, alive ? 0.6F : alpha); + } + } + + @Override + public void setupAnim(IceCrystal entity, float v, float v1, float v2, float v3, float v4) { + } + + @Override + public void prepareMobModel(IceCrystal entity, float limbSwing, float limbSwingAmount, float partialTicks) { + this.alive = entity.isAlive(); + for (int i = 0; i < spikes.length; i++) { + // rotate the spikes + this.spikes[i].xRot = Mth.sin((entity.tickCount + partialTicks) / 5.0F) / 4.0F; + this.spikes[i].yRot = (entity.tickCount + partialTicks) / 5.0F; + this.spikes[i].zRot = Mth.cos((entity.tickCount + partialTicks) / 5.0F) / 4.0F; + + this.spikes[i].xRot += i * (Math.PI / 8F); + + if (i % 4 == 0) { + this.spikes[i].yRot += 1; + } else if (i % 4 == 2) { + this.spikes[i].yRot -= 1; + } + } + } +} diff --git a/src/main/java/twilightforest/client/model/entity/KnightPhantomModel.java b/src/main/java/twilightforest/client/model/entity/KnightPhantomModel.java new file mode 100644 index 0000000000..fb703429ba --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/KnightPhantomModel.java @@ -0,0 +1,73 @@ +package twilightforest.client.model.entity; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.*; +import net.minecraft.util.Mth; +import twilightforest.entity.boss.KnightPhantom; + +import javax.annotation.Nullable; + +public class KnightPhantomModel extends HumanoidModel { + + @Nullable + private KnightPhantom knight; + + public KnightPhantomModel(ModelPart root) { + super(root); + } + + public static LayerDefinition create() { + MeshDefinition mesh = HumanoidModel.createMesh(CubeDeformation.NONE, 0.0F); + PartDefinition partRoot = mesh.getRoot(); + + partRoot.addOrReplaceChild("right_arm", CubeListBuilder.create() + .texOffs(40, 16) + .addBox(-1.0F, -2.0F, -1.0F, 2.0F, 12.0F, 2.0F), + PartPose.offset(-5.0F, 2.0F, 0.0F)); + + partRoot.addOrReplaceChild("left_arm", CubeListBuilder.create().mirror() + .texOffs(40, 16) + .addBox(-1.0F, -2.0F, -1.0F, 2.0F, 12.0F, 2.0F), + PartPose.offset(5.0F, 2.0F, 0.0F)); + + partRoot.addOrReplaceChild("right_leg", CubeListBuilder.create().mirror() + .texOffs(0, 16) + .addBox(-1.0F, 0.0F, -1.0F, 2.0F, 12.0F, 2.0F), + PartPose.offset(-2.0F, 12.0F, 0.0F)); + + partRoot.addOrReplaceChild("left_leg", CubeListBuilder.create().mirror() + .texOffs(0, 16) + .addBox(-1.0F, 0.0F, -1.0F, 2.0F, 12.0F, 2.0F), + PartPose.offset(2.0F, 12.0F, 0.0F)); + + return LayerDefinition.create(mesh, 64, 32); + } + + @Override + public void renderToBuffer(PoseStack stack, VertexConsumer builder, int light, int overlay, float red, float green, float blue, float scale) { + if (this.knight != null && this.knight.isChargingAtPlayer()) { + // render full skeleton + super.renderToBuffer(stack, builder, light, overlay, red, green, blue, scale); + } + this.knight = null; + } + + @Override + public void setupAnim(KnightPhantom entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + this.knight = entity; + + super.setupAnim(entity, limbSwing, limbSwingAmount, ageInTicks, netHeadYaw, headPitch); + this.leftLeg.yRot = 0; + this.leftLeg.zRot = 0; + + this.rightLeg.yRot = 0; + this.rightLeg.zRot = 0; + + this.rightLeg.xRot = 0.2F * Mth.sin(ageInTicks * 0.3F) + 0.4F; + this.leftLeg.xRot = 0.2F * Mth.sin(ageInTicks * 0.3F) + 0.4F; + } +} diff --git a/src/main/java/twilightforest/client/model/entity/KnightmetalShieldModel.java b/src/main/java/twilightforest/client/model/entity/KnightmetalShieldModel.java new file mode 100644 index 0000000000..20e43bc2e1 --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/KnightmetalShieldModel.java @@ -0,0 +1,33 @@ +package twilightforest.client.model.entity; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.model.Model; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; +import net.minecraft.client.renderer.RenderType; + +public class KnightmetalShieldModel extends Model { + private final ModelPart root; + + public KnightmetalShieldModel(ModelPart root) { + super(RenderType::entitySolid); + this.root = root; + } + + public static LayerDefinition create() { + MeshDefinition meshdefinition = new MeshDefinition(); + PartDefinition partdefinition = meshdefinition.getRoot(); + partdefinition.addOrReplaceChild("plate", CubeListBuilder.create().texOffs(0, 0).addBox(-6.0F, -11.0F, -2.5F, 12.0F, 20.0F, 2.0F), PartPose.ZERO); + partdefinition.addOrReplaceChild("handle", CubeListBuilder.create().texOffs(28, 0).addBox(-1.0F, -3.0F, -0.5F, 2.0F, 6.0F, 6.0F), PartPose.ZERO); + return LayerDefinition.create(meshdefinition, 64, 32); + } + + public void renderToBuffer(PoseStack stack, VertexConsumer consumer, int light, int overlay, float red, float green, float blue, float alpha) { + this.root.render(stack, consumer, light, overlay, red, green, blue, alpha); + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/client/model/entity/KoboldModel.java b/src/main/java/twilightforest/client/model/entity/KoboldModel.java new file mode 100644 index 0000000000..5601d82bc8 --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/KoboldModel.java @@ -0,0 +1,121 @@ +package twilightforest.client.model.entity; + +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.*; +import net.minecraft.util.Mth; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import twilightforest.entity.monster.Kobold; + +/** + * ModelKobold - MCVinnyq + * Created using Tabula 8.0.0 + */ +@OnlyIn(Dist.CLIENT) +public class KoboldModel extends HumanoidModel { + + public final ModelPart mouth; + + boolean isJumping; + + public KoboldModel(ModelPart root) { + super(root); + this.mouth = getHead().getChild("mouth"); + } + + public static LayerDefinition create() { + MeshDefinition mesh = HumanoidModel.createMesh(CubeDeformation.NONE, 0.0F); + PartDefinition partRoot = mesh.getRoot(); + + var head = partRoot.addOrReplaceChild("head", CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-3.5F, -6.0F, -3.0F, 7.0F, 6.0F, 6.0F) + .texOffs(20, 0) + .addBox(-1.5F, -3.0F, -6.0F, 3.0F, 2.0F, 3.0F), + PartPose.offset(0.0F, 12.0F, 0.0F)); + + partRoot.addOrReplaceChild("hat", CubeListBuilder.create(), + PartPose.ZERO); + + head.addOrReplaceChild("mouth", CubeListBuilder.create() + .texOffs(26, 5) + .addBox(-1.5F, 0.0F, -3.0F, 3.0F, 1.0F, 3.0F), + PartPose.offsetAndRotation(0.0F, -1.0F, -3.0F, 0.2181661564992912F, 0.0F, 0.0F)); + + head.addOrReplaceChild("right_ear", CubeListBuilder.create() + .texOffs(32, 0) + .addBox(-2.0F, -4.0F, 0.0F, 4.0F, 4.0F, 1.0F), + PartPose.offsetAndRotation(-3.0F, -4.0F, 0.0F, 0.0F, 0.0F, -1.3089969389957472F)); + + head.addOrReplaceChild("left_ear", CubeListBuilder.create() + .texOffs(42, 0) + .addBox(-2.0F, -4.0F, 0.0F, 4.0F, 4.0F, 1.0F), + PartPose.offsetAndRotation(3.0F, -4.0F, 0.0F, 0.0F, 0.0F, 1.3089969389957472F)); + + partRoot.addOrReplaceChild("body", CubeListBuilder.create() + .texOffs(12, 12) + .addBox(-3.5F, 0.0F, -2.0F, 7.0F, 7.0F, 4.0F), + PartPose.offset(0.0F, 12.0F, 0.0F)); + + partRoot.addOrReplaceChild("right_arm", CubeListBuilder.create() + .texOffs(34, 12) + .addBox(-2.0F, -1.0F, -1.5F, 3.0F, 7.0F, 3.0F), + PartPose.offset(-4.5F, 13.0F, 0.0F)); + + partRoot.addOrReplaceChild("left_arm", CubeListBuilder.create() + .texOffs(34, 22) + .addBox(-1.0F, -1.0F, -1.5F, 3.0F, 7.0F, 3.0F), + PartPose.offset(4.5F, 13.0F, 0.0F)); + + partRoot.addOrReplaceChild("right_leg", CubeListBuilder.create() + .texOffs(0, 12) + .addBox(-1.5F, 0.0F, -1.5F, 3.0F, 5.0F, 3.0F), + PartPose.offset(-1.9F, 19.0F, 0.0F)); + + partRoot.addOrReplaceChild("left_leg", CubeListBuilder.create() + .texOffs(0, 20) + .addBox(-1.5F, 0.0F, -1.5F, 3.0F, 5.0F, 3.0F), + PartPose.offset(1.9F, 19.0F, 0.0F)); + + return LayerDefinition.create(mesh, 64, 32); + } + + @Override + public void prepareMobModel(Kobold entity, float limbSwing, float limbSwingAmount, float partialTicks) { + // check if entity is jumping + this.isJumping = entity.getDeltaMovement().y() > 0; + } + + @Override + public void setupAnim(Kobold entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + this.head.yRot = netHeadYaw / (180F / (float) Math.PI); + this.head.xRot = headPitch / (180F / (float) Math.PI); + + this.rightArm.xRot = Mth.cos(limbSwing * 0.6662F + (float) Math.PI) * 2.0F * limbSwingAmount * 0.5F; + this.leftArm.xRot = Mth.cos(limbSwing * 0.6662F) * 2.0F * limbSwingAmount * 0.5F; + this.rightArm.zRot = 0.0F; + this.leftArm.zRot = 0.0F; + + this.rightArm.xRot = -((float) Math.PI * .15F); + this.leftArm.xRot = -((float) Math.PI * .15F); + + this.rightLeg.xRot = Mth.cos(limbSwing * 0.6662F) * 1.4F * limbSwingAmount; + this.leftLeg.xRot = Mth.cos(limbSwing * 0.6662F + (float) Math.PI) * 1.4F * limbSwingAmount; + this.rightLeg.yRot = 0.0F; + this.leftLeg.yRot = 0.0F; + + this.rightArm.zRot += Mth.cos(ageInTicks * 0.19F) * 0.15F + 0.05F; + this.leftArm.zRot -= Mth.cos(ageInTicks * 0.19F) * 0.15F + 0.05F; + this.rightArm.xRot += Mth.sin(ageInTicks * 0.267F) * 0.25F; + this.leftArm.xRot -= Mth.sin(ageInTicks * 0.267F) * 0.25F; + + if (this.isJumping) { + // open jaw + this.mouth.xRot = 0.6F; + } else { + this.mouth.xRot = 0.20944F; + } + } +} diff --git a/src/main/java/twilightforest/client/model/entity/LichMinionModel.java b/src/main/java/twilightforest/client/model/entity/LichMinionModel.java new file mode 100644 index 0000000000..0c8d9b20d6 --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/LichMinionModel.java @@ -0,0 +1,31 @@ +package twilightforest.client.model.entity; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.model.ZombieModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.world.effect.MobEffects; +import twilightforest.entity.monster.LichMinion; + +public class LichMinionModel extends ZombieModel { + + private boolean hasStrength; + + public LichMinionModel(ModelPart root) { + super(root); + } + + @Override + public void prepareMobModel(LichMinion entity, float limbSwing, float limbSwingAmount, float partialTicks) { + this.hasStrength = entity.getEffect(MobEffects.DAMAGE_BOOST) != null; + } + + @Override + public void renderToBuffer(PoseStack stack, VertexConsumer builder, int light, int overlay, float red, float green, float blue, float scale) { + if (hasStrength) { + super.renderToBuffer(stack, builder, light, overlay, red * 0.25F, green, blue * 0.25F, scale); + } else { + super.renderToBuffer(stack, builder, light, overlay, red * 0.5F, green, blue * 0.5F, scale); + } + } +} diff --git a/src/main/java/twilightforest/client/model/entity/LichModel.java b/src/main/java/twilightforest/client/model/entity/LichModel.java new file mode 100644 index 0000000000..daa1ca4b98 --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/LichModel.java @@ -0,0 +1,131 @@ +package twilightforest.client.model.entity; + +import com.google.common.collect.Iterables; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.*; +import net.minecraft.util.Mth; +import twilightforest.entity.boss.Lich; + +import java.util.Arrays; + +public class LichModel extends HumanoidModel { + + private boolean shadowClone; + private final ModelPart collar; + private final ModelPart cloak; + + public LichModel(ModelPart root) { + super(root); + this.collar = root.getChild("collar"); + this.cloak = root.getChild("cloak"); + } + + public static LayerDefinition create() { + MeshDefinition mesh = HumanoidModel.createMesh(CubeDeformation.NONE, 0.0F); + PartDefinition partRoot = mesh.getRoot(); + + partRoot.addOrReplaceChild("head", CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-4.0F, -4.0F, -4.0F, 8.0F, 8.0F, 8.0F), + PartPose.offset(0.0F, -4.0F, 0.0F)); + + partRoot.addOrReplaceChild("hat", CubeListBuilder.create() + .texOffs(32, 0) + .addBox(-4.0F, -8.0F, -4.0F, 8.0F, 8.0F, 8.0F, new CubeDeformation(0.5F)), + PartPose.offset(0.0F, -4.0F, 0.0F)); + + partRoot.addOrReplaceChild("collar", CubeListBuilder.create() + .texOffs(32, 16) + .addBox(-6.0F, -2.0F, -4.0F, 12.0F, 12.0F, 1.0F), + PartPose.offsetAndRotation(0.0F, -3.0F, -1.0F, 2.164208F, 0F, 0F)); + + partRoot.addOrReplaceChild("cloak", CubeListBuilder.create() + .texOffs(0, 44) + .addBox(-6.0F, 2.0F, 0.0F, 12.0F, 19.0F, 1.0F), + PartPose.offset(0.0F, -4.0F, 2.5F)); + + partRoot.addOrReplaceChild("body", CubeListBuilder.create() + .texOffs(8, 16) + .addBox(-4.0F, 0.0F, -2.0F, 8.0F, 24.0F, 4.0F), + PartPose.offset(0.0F, -4.0F, 0.0F)); + + partRoot.addOrReplaceChild("right_arm", CubeListBuilder.create() + .texOffs(0, 16) + .addBox(-2.0F, -2.0F, -2.0F, 2.0F, 12.0F, 2.0F), + PartPose.offset(-5.0F, -2.0F, 0.0F)); + + partRoot.addOrReplaceChild("left_arm", CubeListBuilder.create().mirror() + .texOffs(0, 16) + .addBox(-1.0F, -2.0F, -2.0F, 2.0F, 12.0F, 2.0F), + PartPose.offset(5.0F, 2.0F, 0.0F)); + + partRoot.addOrReplaceChild("right_leg", CubeListBuilder.create() + .texOffs(0, 16) + .addBox(-1.0F, 0.0F, -1.0F, 2.0F, 12.0F, 2.0F), + PartPose.offset(-2.0F, 12.0F, 0.0F)); + + partRoot.addOrReplaceChild("left_leg", CubeListBuilder.create().mirror() + .texOffs(0, 16) + .addBox(-1.0F, 0.0F, -1.0F, 2.0F, 12.0F, 2.0F), + PartPose.offset(2.0F, 12.0F, 0.0F)); + + return LayerDefinition.create(mesh, 64, 64); + } + + @Override + public void renderToBuffer(PoseStack stack, VertexConsumer builder, int light, int overlay, float red, float green, float blue, float alpha) { + if (!shadowClone) { + super.renderToBuffer(stack, builder, light, overlay, red, green, blue, alpha); + } else { + float shadow = 0.33f; + super.renderToBuffer(stack, builder, light, overlay, red * shadow, green * shadow, blue * shadow, 0.8F); + } + } + + @Override + protected Iterable bodyParts() { + if (shadowClone) { + return super.bodyParts(); + } else { + return Iterables.concat(Arrays.asList(cloak, collar), super.bodyParts()); + } + } + + @Override + public void setupAnim(Lich entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + this.shadowClone = entity.isShadowClone(); + super.setupAnim(entity, limbSwing, limbSwingAmount, ageInTicks, netHeadYaw, headPitch); + + float ogSin = Mth.sin(attackTime * 3.141593F); + float otherSin = Mth.sin((1.0F - (1.0F - attackTime) * (1.0F - attackTime)) * 3.141593F); + rightArm.zRot = 0.0F; + leftArm.zRot = 0.5F; + rightArm.yRot = -(0.1F - ogSin * 0.6F); + leftArm.yRot = 0.1F - ogSin * 0.6F; + rightArm.xRot = -1.570796F; + leftArm.xRot = -3.141593F; + rightArm.xRot -= ogSin * 1.2F - otherSin * 0.4F; + leftArm.xRot -= ogSin * 1.2F - otherSin * 0.4F; + rightArm.zRot += Mth.cos(ageInTicks * 0.26F) * 0.15F + 0.05F; + leftArm.zRot -= Mth.cos(ageInTicks * 0.26F) * 0.15F + 0.05F; + rightArm.xRot += Mth.sin(ageInTicks * 0.167F) * 0.15F; + leftArm.xRot -= Mth.sin(ageInTicks * 0.167F) * 0.15F; + + head.y = -4.0F; + hat.y = -4.0F; + + boolean flag = entity.deathTime > 50; + this.body.skipDraw = flag; + this.leftArm.skipDraw = flag; + this.rightArm.skipDraw = flag; + this.leftLeg.skipDraw = flag; + this.rightLeg.skipDraw = flag; + this.cloak.skipDraw = flag; + this.collar.skipDraw = flag; + this.head.skipDraw = flag; + } +} diff --git a/src/main/java/twilightforest/client/model/entity/LowerGoblinKnightModel.java b/src/main/java/twilightforest/client/model/entity/LowerGoblinKnightModel.java new file mode 100644 index 0000000000..19136c306d --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/LowerGoblinKnightModel.java @@ -0,0 +1,139 @@ +package twilightforest.client.model.entity; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.*; +import net.minecraft.util.Mth; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import twilightforest.entity.monster.LowerGoblinKnight; + +/** + * ModelTFGoblinKnightLower - MCVinnyq + * Created using Tabula 8.0.0 + */ +@OnlyIn(Dist.CLIENT) +public class LowerGoblinKnightModel extends HumanoidModel { + public final ModelPart tunic; + + public LowerGoblinKnightModel(ModelPart root) { + super(root); + this.tunic = root.getChild("tunic"); + } + + public static LayerDefinition create() { + MeshDefinition mesh = HumanoidModel.createMesh(CubeDeformation.NONE, 0.0F); + PartDefinition partRoot = mesh.getRoot(); + + partRoot.addOrReplaceChild("head", CubeListBuilder.create() + .texOffs(0, 30) + .addBox(-2.5F, -5.0F, -3.5F, 5.0F, 5.0F, 5.0F), + PartPose.offset(0.0F, 8.0F, 1.0F)); + + partRoot.addOrReplaceChild("hat", CubeListBuilder.create(), + PartPose.ZERO); + + partRoot.addOrReplaceChild("body", CubeListBuilder.create() + .texOffs(16, 48) + .addBox(-3.5F, 0.0F, -2.0F, 7.0F, 8.0F, 4.0F), + PartPose.offset(0.0F, 8.0F, 0.0F)); + + partRoot.addOrReplaceChild("tunic", CubeListBuilder.create() + .texOffs(64, 19) + .addBox(-6.0F, 0.0F, -3.0F, 12.0F, 9.0F, 6.0F), + PartPose.offset(0.0F, 7.5F, 0.0F)); + + partRoot.addOrReplaceChild("right_arm", CubeListBuilder.create() + .texOffs(48, 48) + .addBox(-2.0F, -2.0F, -1.5F, 2.0F, 8.0F, 3.0F), + PartPose.offsetAndRotation(-3.5F, 10.0F, 0.0F, 0.0F, 0.0F, 0.10000000116728046F)); + + partRoot.addOrReplaceChild("left_arm", CubeListBuilder.create() + .texOffs(38, 48) + .addBox(0.0F, -2.0F, -1.5F, 2.0F, 8.0F, 3.0F), + PartPose.offsetAndRotation(3.5F, 10.0F, 0.0F, 0.0F, 0.0F, -0.10000736647217022F)); + + partRoot.addOrReplaceChild("right_leg", CubeListBuilder.create() + .texOffs(0, 40) + .addBox(-3.0F, 0.0F, -2.0F, 4.0F, 8.0F, 4.0F), + PartPose.offset(-2.5F, 16.0F, 0.0F)); + + partRoot.addOrReplaceChild("left_leg", CubeListBuilder.create() + .texOffs(0, 52) + .addBox(-1.0F, 0.0F, -2.0F, 4.0F, 8.0F, 4.0F), + PartPose.offset(2.5F, 16.0F, 0.0F)); + + return LayerDefinition.create(mesh, 128, 64); + } + + @Override + public void renderToBuffer(PoseStack stack, VertexConsumer builder, int light, int overlay, float red, float green, float blue, float scale) { + super.renderToBuffer(stack, builder, light, overlay, red, green, blue, scale); + this.tunic.render(stack, builder, light, overlay, red, green, blue, scale); + } + + @Override + public void setupAnim(LowerGoblinKnight entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + this.head.yRot = netHeadYaw / (180F / (float) Math.PI); + this.head.xRot = headPitch / (180F / (float) Math.PI); + this.hat.yRot = this.head.yRot; + this.hat.xRot = this.head.xRot; + this.rightArm.xRot = Mth.cos(limbSwing * 0.6662F + (float) Math.PI) * 2.0F * limbSwingAmount * 0.5F; + this.leftArm.xRot = Mth.cos(limbSwing * 0.6662F) * 2.0F * limbSwingAmount * 0.5F; + this.rightArm.zRot = 0.0F; + this.leftArm.zRot = 0.0F; + this.rightLeg.xRot = Mth.cos(limbSwing * 0.6662F) * 1.4F * limbSwingAmount; + this.leftLeg.xRot = Mth.cos(limbSwing * 0.6662F + (float) Math.PI) * 1.4F * limbSwingAmount; + this.rightLeg.yRot = 0.0F; + this.leftLeg.yRot = 0.0F; + this.rightLeg.zRot = 0.0F; + this.leftLeg.zRot = 0.0F; + + if (this.riding) { + this.rightArm.xRot += (-(float)Math.PI / 5F); + this.leftArm.xRot += (-(float)Math.PI / 5F); + this.rightLeg.xRot = -1.4137167F; + this.rightLeg.yRot = ((float)Math.PI / 10F); + this.rightLeg.zRot = 0.07853982F; + this.leftLeg.xRot = -1.4137167F; + this.leftLeg.yRot = (-(float)Math.PI / 10F); + this.leftLeg.zRot = -0.07853982F; + } + + if (entity.isVehicle()) { + this.head.yRot = 0; + this.head.xRot = 0; + this.hat.yRot = this.head.yRot; + this.hat.xRot = this.head.xRot; + } + + if (this.leftArmPose != ArmPose.EMPTY) { + this.leftArm.xRot = this.leftArm.xRot * 0.5F - ((float) Math.PI / 10F); + } + + if (this.rightArmPose != ArmPose.EMPTY) { + this.rightArm.xRot = this.rightArm.xRot * 0.5F - ((float) Math.PI / 10F); + } + + this.rightArm.yRot = 0.0F; + this.leftArm.yRot = 0.0F; + + this.rightArm.zRot += Mth.cos(ageInTicks * 0.09F) * 0.05F + 0.05F; + this.leftArm.zRot -= Mth.cos(ageInTicks * 0.09F) * 0.05F + 0.05F; + this.rightArm.xRot += Mth.sin(ageInTicks * 0.067F) * 0.05F; + this.leftArm.xRot -= Mth.sin(ageInTicks * 0.067F) * 0.05F; + + this.tunic.visible = entity.hasArmor(); + + //dont swing the arms if its still wearing its armor + if(entity.hasArmor()) { + this.leftArm.xRot = 0; + this.rightArm.xRot = 0; + this.leftArm.zRot = 0; + this.rightArm.zRot = 0; + } + } +} diff --git a/src/main/java/twilightforest/client/model/entity/LoyalZombieModel.java b/src/main/java/twilightforest/client/model/entity/LoyalZombieModel.java new file mode 100644 index 0000000000..77eee413f1 --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/LoyalZombieModel.java @@ -0,0 +1,45 @@ +package twilightforest.client.model.entity; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.util.Mth; +import twilightforest.entity.monster.LoyalZombie; + +/** + * [VanillaCopy] {@link net.minecraft.client.model.AbstractZombieModel} due to generic restrictions + */ +public class LoyalZombieModel extends HumanoidModel { + + public LoyalZombieModel(ModelPart part) { + super(part); + } + + @Override + public void setupAnim(LoyalZombie e, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + super.setupAnim(e, limbSwing, limbSwingAmount, ageInTicks, netHeadYaw, headPitch); + boolean flag = e.isAggressive(); + float f = Mth.sin(this.attackTime * (float)Math.PI); + float f1 = Mth.sin((1.0F - (1.0F - this.attackTime) * (1.0F - this.attackTime)) * (float)Math.PI); + this.rightArm.zRot = 0.0F; + this.leftArm.zRot = 0.0F; + this.rightArm.yRot = -(0.1F - f * 0.6F); + this.leftArm.yRot = 0.1F - f * 0.6F; + float f2 = -(float)Math.PI / (flag ? 1.5F : 2.25F); + this.rightArm.xRot = f2; + this.leftArm.xRot = f2; + this.rightArm.xRot += f * 1.2F - f1 * 0.4F; + this.leftArm.xRot += f * 1.2F - f1 * 0.4F; + this.rightArm.zRot += Mth.cos(ageInTicks * 0.09F) * 0.05F + 0.05F; + this.leftArm.zRot -= Mth.cos(ageInTicks * 0.09F) * 0.05F + 0.05F; + this.rightArm.xRot += Mth.sin(ageInTicks * 0.067F) * 0.05F; + this.leftArm.xRot -= Mth.sin(ageInTicks * 0.067F) * 0.05F; + } + + @Override + public void renderToBuffer(PoseStack stack, VertexConsumer builder, int light, int overlay, float red, float green, float blue, float scale) { + // GREEEEN + super.renderToBuffer(stack, builder, light, overlay, red * 0.25F, green, blue * 0.25F, scale); + } +} diff --git a/src/main/java/twilightforest/client/model/entity/MinoshroomModel.java b/src/main/java/twilightforest/client/model/entity/MinoshroomModel.java new file mode 100644 index 0000000000..5727cee956 --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/MinoshroomModel.java @@ -0,0 +1,191 @@ +package twilightforest.client.model.entity; + +import com.google.common.collect.ImmutableList; +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.model.AnimationUtils; +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.*; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.HumanoidArm; +import net.minecraft.util.Mth; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import twilightforest.entity.boss.Minoshroom; + +/** + * ModelMinoshroom - MCVinnyq + * Created using Tabula 8.0.0 + */ +@OnlyIn(Dist.CLIENT) +public class MinoshroomModel extends HumanoidModel { + public final ModelPart cowTorso; + public ModelPart rightFrontLeg; + public ModelPart leftFrontLeg; + public ModelPart rightBackLeg; + public ModelPart leftBackLeg; + + public MinoshroomModel(ModelPart root) { + super(root); + this.cowTorso = root.getChild("cow_torso"); + this.rightFrontLeg = root.getChild("right_front_leg"); + this.leftFrontLeg = root.getChild("left_front_leg"); + this.rightBackLeg = root.getChild("right_back_leg"); + this.leftBackLeg = root.getChild("left_back_leg"); + } + + public static LayerDefinition create() { + MeshDefinition mesh = HumanoidModel.createMesh(CubeDeformation.NONE, 0.0F); + PartDefinition partRoot = mesh.getRoot(); + + partRoot.addOrReplaceChild("head", CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-4.0F, -11.0F, -4.0F, 8.0F, 8.0F, 8.0F) + .texOffs(0, 16) + .addBox(-3.0F, -6.0F, -5.0F, 6.0F, 3.0F, 1.0F) + .texOffs(32, 0) + .addBox(-8.0F, -10.0F, -1.0F, 4.0F, 2.0F, 3.0F) + .texOffs(32, 5) + .addBox(-8.0F, -13.0F, -1.0F, 2.0F, 3.0F, 3.0F) + .texOffs(46, 0) + .addBox(4.0F, -10.0F, -1.0F, 4.0F, 2.0F, 3.0F) + .texOffs(46, 5) + .addBox(6.0F, -13.0F, -1.0F, 2.0F, 3.0F, 3.0F), + PartPose.offset(0.0F, -6.0F, -7.0F)); + + partRoot.addOrReplaceChild("body", CubeListBuilder.create() + .texOffs(0, 29) + .addBox(-5.0F, -3.0F, 0.0F, 10.0F, 12.0F, 5.0F), + PartPose.offset(0.0F, -6.0F, -9.0F)); + + partRoot.addOrReplaceChild("left_arm", CubeListBuilder.create() + .texOffs(46, 15) + .addBox(0.0F, -1.0F, -2.0F, 4.0F, 14.0F, 5.0F), + PartPose.offset(5.0F, -8.0F, -7.0F)); + + partRoot.addOrReplaceChild("right_arm", CubeListBuilder.create() + .texOffs(28, 15) + .addBox(-4.0F, -1.0F, -2.0F, 4.0F, 14.0F, 5.0F), + PartPose.offset(-5.0F, -8.0F, -7.0F)); + + partRoot.addOrReplaceChild("cow_torso", CubeListBuilder.create() + .texOffs(20, 36) + .addBox(-6.0F, -14.0F, -2.0F, 12.0F, 18.0F, 10.0F) + .texOffs(0, 20) + .addBox(-2.0F, -2.0F, -3.0F, 4.0F, 6.0F, 1.0F), + PartPose.offsetAndRotation(0.0F, 10.0F, 6.0F, 1.5707963267948966F, 0.0F, 0.0F)); + + partRoot.addOrReplaceChild("right_front_leg", CubeListBuilder.create() + .texOffs(0, 48) + .addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F), + PartPose.offset(-4.0F, 12.0F, -6.0F)); + + partRoot.addOrReplaceChild("left_front_leg", CubeListBuilder.create() + .texOffs(0, 48) + .addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F), + PartPose.offset(4.0F, 12.0F, -6.0F)); + + partRoot.addOrReplaceChild("right_back_leg", CubeListBuilder.create() + .texOffs(0, 48) + .addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F), + PartPose.offset(-4.0F, 12.0F, 7.0F)); + + partRoot.addOrReplaceChild("left_back_leg", CubeListBuilder.create() + .texOffs(0, 48) + .addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F), + PartPose.offset(4.0F, 12.0F, 7.0F)); + + return LayerDefinition.create(mesh, 64, 64); + } + + @Override + protected Iterable bodyParts() { + return ImmutableList.of(this.body, this.rightArm, this.leftArm, this.cowTorso, this.leftBackLeg, this.rightBackLeg, this.leftFrontLeg, this.rightFrontLeg); + } + + @Override + public void setupAnim(Minoshroom entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + // copied from HumanoidModel + this.head.yRot = netHeadYaw / (180F / (float) Math.PI); + this.head.xRot = headPitch / (180F / (float) Math.PI); + this.hat.copyFrom(this.head); + + this.rightArm.xRot = Mth.cos(limbSwing * 0.6662F + (float)Math.PI) * 2.0F * limbSwingAmount * 0.5F; + this.leftArm.xRot = Mth.cos(limbSwing * 0.6662F) * 2.0F * limbSwingAmount * 0.5F; + this.rightArm.zRot = 0.0F; + this.leftArm.zRot = 0.0F; + + this.rightArm.yRot = 0.0F; + this.leftArm.yRot = 0.0F; + boolean rightHanded = entity.getMainArm() == HumanoidArm.RIGHT; + if (entity.isUsingItem()) { + boolean useHand = entity.getUsedItemHand() == InteractionHand.MAIN_HAND; + if (useHand == rightHanded) { + this.poseRightArm(entity); + } else { + this.poseLeftArm(entity); + } + } else { + boolean bothHands = rightHanded ? this.leftArmPose.isTwoHanded() : this.rightArmPose.isTwoHanded(); + if (rightHanded != bothHands) { + this.poseLeftArm(entity); + this.poseRightArm(entity); + } else { + this.poseRightArm(entity); + this.poseLeftArm(entity); + } + } + + this.setupAttackAnimation(entity, ageInTicks); + AnimationUtils.bobArms(this.rightArm, this.leftArm, ageInTicks); + + // copied from QuadrepedModel + this.leftFrontLeg.xRot = Mth.cos(limbSwing * 0.6662F) * 1.4F * limbSwingAmount; + this.rightFrontLeg.xRot = Mth.cos(limbSwing * 0.6662F + (float) Math.PI) * 1.4F * limbSwingAmount; + this.leftBackLeg.xRot = Mth.cos(limbSwing * 0.6662F + (float) Math.PI) * 1.4F * limbSwingAmount; + this.rightBackLeg.xRot = Mth.cos(limbSwing * 0.6662F) * 1.4F * limbSwingAmount; + + float f = ageInTicks - entity.tickCount; + float f1 = entity.getChargeAnimationScale(f); + f1 = f1 * f1; + + this.leftFrontLeg.y = 12.0F + (-7F * f1); + this.leftFrontLeg.z = -4.0F + (-1F * f1); + this.rightFrontLeg.y = this.leftFrontLeg.y; + this.rightFrontLeg.z = this.leftFrontLeg.z; + this.body.y = -6F - f1; + this.body.z = -9F + f1; + this.rightArm.y = -8F - f1; + this.rightArm.z = -7F + f1; + this.leftArm.y = rightArm.y; + this.leftArm.z = rightArm.z; + + if (f1 > 0) { + if (entity.getMainArm() == HumanoidArm.RIGHT) { + this.rightArm.xRot = f1 * -1.8F; + this.leftArm.xRot = 0.0F; + this.rightArm.zRot = -0.2F; + } else { + this.rightArm.xRot = 0.0F; + this.leftArm.xRot = f1 * -1.8F; + this.leftArm.zRot = 0.2F; + } + this.cowTorso.xRot = ((float) Math.PI / 2F) - f1 * (float) Math.PI * 0.2F; + this.leftFrontLeg.xRot -= f1 * (float) Math.PI * 0.3F; + this.rightFrontLeg.xRot -= f1 * (float) Math.PI * 0.3F; + } + } + + @Override + public void translateToHand(HumanoidArm arm, PoseStack stack) { + float f = arm == HumanoidArm.RIGHT ? -0.5F : 0.5F; + ModelPart modelpart = this.getArm(arm); + modelpart.x += f; + modelpart.y += 2F; + modelpart.translateAndRotate(stack); + modelpart.x -= f; + modelpart.y -= 2F; + stack.scale(1.15F, 1.15F, 1.15F); + } +} diff --git a/src/main/java/twilightforest/client/model/entity/MinotaurModel.java b/src/main/java/twilightforest/client/model/entity/MinotaurModel.java new file mode 100644 index 0000000000..42a6972a16 --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/MinotaurModel.java @@ -0,0 +1,72 @@ +package twilightforest.client.model.entity; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.*; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import twilightforest.entity.monster.Minotaur; + +/** + * ModelMinotaur - MCVinnyq + * Created using Tabula 8.0.0 + */ +@OnlyIn(Dist.CLIENT) +public class MinotaurModel extends HumanoidModel { + + public MinotaurModel(ModelPart root) { + super(root); + } + + public static LayerDefinition create() { + MeshDefinition mesh = HumanoidModel.createMesh(CubeDeformation.NONE, 0.0F); + PartDefinition partRoot = mesh.getRoot(); + + partRoot.addOrReplaceChild("head", CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-4.0F, -10.0F, -4.0F, 8.0F, 8.0F, 8.0F) + .texOffs(25, 1) + .addBox(-3.0F, -5.0F, -5.0F, 6.0F, 3.0F, 1.0F) + .texOffs(0, 16) + .addBox(-8.0F, -9.0F, -1.0F, 4.0F, 2.0F, 2.0F) + .texOffs(0, 20) + .addBox(-8.0F, -11.0F, -1.0F, 2.0F, 2.0F, 2.0F) + .texOffs(12, 16) + .addBox(4.0F, -9.0F, -1.0F, 4.0F, 2.0F, 2.0F) + .texOffs(12, 20) + .addBox(6.0F, -11.0F, -1.0F, 2.0F, 2.0F, 2.0F), + PartPose.offset(0.0F, -2.0F, 0.0F)); + + partRoot.addOrReplaceChild("hat", CubeListBuilder.create(), + PartPose.ZERO); + + partRoot.addOrReplaceChild("body", CubeListBuilder.create() + .texOffs(34, 0) + .addBox(-5.0F, -2.0F, -2.5F, 10.0F, 14.0F, 5.0F), + PartPose.offset(0.0F, -2.0F, 0.0F)); + + partRoot.addOrReplaceChild("right_arm", CubeListBuilder.create() + .texOffs(20, 26) + .addBox(-4.0F, -4.0F, -2.5F, 4.0F, 14.0F, 5.0F), + PartPose.offset(-7.5F, -4.0F, 0.0F)); + + partRoot.addOrReplaceChild("left_arm", CubeListBuilder.create() + .texOffs(20, 45) + .addBox(0.0F, -4.0F, -2.5F, 4.0F, 14.0F, 5.0F), + PartPose.offset(7.5F, -4.0F, 0.0F)); + + partRoot.addOrReplaceChild("right_leg", CubeListBuilder.create() + .texOffs(0, 26).addBox(-2.5F, 0.0F, -2.5F, 5.0F, 12.0F, 5.0F), + PartPose.offset(-2.5F, 12.0F, 0.0F)); + + partRoot.addOrReplaceChild("left_leg", CubeListBuilder.create() + .texOffs(0, 43) + .addBox(-2.5F, 0.0F, -2.5F, 5.0F, 12.0F, 5.0F), + PartPose.offset(2.5F, 12.0F, 0.0F)); + + return LayerDefinition.create(mesh, 64, 64); + } +} diff --git a/src/main/java/twilightforest/client/model/entity/MoonwormModel.java b/src/main/java/twilightforest/client/model/entity/MoonwormModel.java new file mode 100644 index 0000000000..0d6a36ced3 --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/MoonwormModel.java @@ -0,0 +1,96 @@ +// Date: 11/8/2012 9:54:59 AM +// Template version 1.1 +// Java generated by Techne +// Keep in mind that you still need to fill in some blanks +// - ZeuX + +package twilightforest.client.model.entity; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.model.Model; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.util.Mth; +import twilightforest.client.BugModelAnimationHelper; +import twilightforest.block.entity.MoonwormBlockEntity; + +import org.jetbrains.annotations.Nullable; + +public class MoonwormModel extends Model { + private final ModelPart shape1, shape2, shape3, head; + + public MoonwormModel(ModelPart root) { + super(RenderType::entityCutoutNoCull); + + this.head = root.getChild("head"); + this.shape1 = root.getChild("shape1"); + this.shape2 = root.getChild("shape2"); + this.shape3 = root.getChild("shape3"); + } + + public static LayerDefinition create() { + MeshDefinition meshdefinition = new MeshDefinition(); + PartDefinition partdefinition = meshdefinition.getRoot(); + partdefinition.addOrReplaceChild("shape1", + CubeListBuilder.create() + .texOffs(0, 4) + .addBox(-1.0F, -1.0F, -1.0F, 4.0F, 2.0F, 2.0F), + PartPose.offset(-1.0F, 7.0F, 3.0F)); + partdefinition.addOrReplaceChild("shape2", + CubeListBuilder.create() + .texOffs(0, 8) + .addBox(-1.0F, -1.0F, -1.0F, 2.0F, 2.0F, 4.0F), + PartPose.offset(3.0F, 7.0F, 0.0F)); + partdefinition.addOrReplaceChild("shape3", + CubeListBuilder.create() + .texOffs(0, 14) + .addBox(-1.0F, -1.0F, -1.0F, 2.0F, 2.0F, 2.0F), + PartPose.offset(2.0F, 7.0F, -2.0F)); + partdefinition.addOrReplaceChild("head", + CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-1.0F, -1.0F, -1.0F, 2.0F, 2.0F, 2.0F), + PartPose.offset(-3.0F, 7.0F, 2.0F)); + + return LayerDefinition.create(meshdefinition, 32, 32); + } + + public void setRotationAngles(@Nullable MoonwormBlockEntity moonworm, float partialTime) { + this.head.y = 7F; + this.shape1.y = 7F; + this.shape2.y = 7F; + this.shape3.y = 7F; + + if (moonworm != null && moonworm.yawDelay == 0) { + float time = (moonworm.desiredYaw - moonworm.currentYaw) - partialTime; + + // moving + this.head.y += Math.min(0, Mth.sin(time / 2)); + this.shape1.y += Math.min(0, Mth.sin(time / 2 + 1)); + this.shape2.y += Math.min(0, Mth.sin(time / 2 + 2)); + this.shape3.y += Math.min(0, Mth.sin(time / 2 + 3)); + } else if (moonworm == null && BugModelAnimationHelper.yawWriggleDelay == 0) { + float time = (BugModelAnimationHelper.desiredRotation - BugModelAnimationHelper.currentRotation) - partialTime; + + // moving + this.head.y += Math.min(0, Mth.sin(time / 2)); + this.shape1.y += Math.min(0, Mth.sin(time / 2 + 1)); + this.shape2.y += Math.min(0, Mth.sin(time / 2 + 2)); + this.shape3.y += Math.min(0, Mth.sin(time / 2 + 3)); + } + } + + @Override + public void renderToBuffer(PoseStack ms, VertexConsumer buffer, int light, int overlay, float r, float g, float b, float a) { + this.shape1.render(ms, buffer, light, overlay, r, g, b, a); + this.shape2.render(ms, buffer, light, overlay, r, g, b, a); + this.shape3.render(ms, buffer, light, overlay, r, g, b, a); + this.head.render(ms, buffer, light, overlay, r, g, b, a); + } +} diff --git a/src/main/java/twilightforest/client/model/entity/MosquitoSwarmModel.java b/src/main/java/twilightforest/client/model/entity/MosquitoSwarmModel.java new file mode 100644 index 0000000000..a51a45eb7e --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/MosquitoSwarmModel.java @@ -0,0 +1,117 @@ +package twilightforest.client.model.entity; + +import net.minecraft.client.model.HierarchicalModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; +import net.minecraft.core.Direction; +import net.minecraft.util.Mth; +import net.minecraft.util.RandomSource; +import net.minecraft.world.phys.Vec3; +import twilightforest.entity.monster.MosquitoSwarm; + +public class MosquitoSwarmModel extends HierarchicalModel { + private final ModelPart root, core, group1, group2, group3, group4, group5, group6; + + private static final RandomSource rand = RandomSource.create(); + + public MosquitoSwarmModel(ModelPart root) { + this.root = root; + + this.core = this.root.getChild("core"); + + this.group1 = this.core.getChild("group_1"); + this.group2 = this.core.getChild("group_2"); + this.group3 = this.core.getChild("group_3"); + this.group4 = this.core.getChild("group_4"); + this.group5 = this.core.getChild("group_5"); + this.group6 = this.core.getChild("group_6"); + } + + public static LayerDefinition create() { + MeshDefinition mesh = new MeshDefinition(); + PartDefinition partRoot = mesh.getRoot(); + + var core = partRoot.addOrReplaceChild("core", CubeListBuilder.create() + .texOffs(rand.nextInt(28), rand.nextInt(28)) + .addBox(-0.5F, 2F, -0.5F, 1, 1, 1), + PartPose.offset(0.0F, -4.0F, 0.0F)); + + PartPose offset = PartPose.offset(-0.5F, -2F, -0.5F); + + for (Direction dir : Direction.values()) { + addBugsToGroup(dir.ordinal(), core.addOrReplaceChild("group_" + (dir.ordinal() + 1), CubeListBuilder.create() + .texOffs(rand.nextInt(28), rand.nextInt(28)) + .addBox(dir.getStepX() * 11, dir.getStepY() * 11, dir.getStepZ() * 11, 1, 1, 1), + offset)); + } + + return LayerDefinition.create(mesh, 64, 64); + } + + /** + * Add the proper number of mosquitoes to the groups + */ + public static void addBugsToGroup(int iteration, PartDefinition parent) { + final int bugs = 16; + + for (int i = 0; i < bugs; i++) { + Vec3 vec = new Vec3(0, 0, 0); + float rotateY = ((i * (360F / bugs)) * Mth.PI) / 180F; + vec.xRot(rotateY); + + float bugX = (rand.nextFloat() - rand.nextFloat()) * 16.0f; + float bugY = (rand.nextFloat() - rand.nextFloat()) * 16.0f; + float bugZ = (rand.nextFloat() - rand.nextFloat()) * 16.0f; + + parent.addOrReplaceChild("bug_" + (iteration * bugs + i), CubeListBuilder.create() + .texOffs(rand.nextInt(28), rand.nextInt(28)) + .addBox(bugX, bugY, bugZ, 1, 1, 1), + PartPose.offsetAndRotation((float) vec.x, (float) vec.y, (float) vec.z, 0, rotateY, 0)); + } + } + + @Override + public ModelPart root() { + return this.root; + } + + @Override + public void setupAnim(MosquitoSwarm entity, float v, float v1, float v2, float v3, float v4) { + + } + + @Override + public void prepareMobModel(MosquitoSwarm entity, float limbSwing, float limbSwingAmount, float partialTicks) { + this.core.yRot = (entity.tickCount + partialTicks) / 5.0F; + this.core.xRot = Mth.sin((entity.tickCount + partialTicks) / 5.0F) / 4.0F; + this.core.zRot = Mth.cos((entity.tickCount + partialTicks) / 5.0F) / 4.0F; + + this.group1.yRot = (entity.tickCount + partialTicks) / 2.0F; + this.group1.xRot = Mth.sin((entity.tickCount + partialTicks) / 6.0F) / 2.0F; + this.group1.zRot = Mth.cos((entity.tickCount + partialTicks) / 5.0F) / 4.0F; + + this.group2.yRot = Mth.sin((entity.tickCount + partialTicks) / 2.0F) / 3.0F; + this.group2.xRot = (entity.tickCount + partialTicks) / 5.0F; + this.group2.zRot = Mth.cos((entity.tickCount + partialTicks) / 5.0F) / 4.0F; + + this.group3.yRot = Mth.sin((entity.tickCount + partialTicks) / 7.0F) / 3.0F; + this.group3.xRot = Mth.cos((entity.tickCount + partialTicks) / 4.0F) / 2.0F; + this.group3.zRot = (entity.tickCount + partialTicks) / 5.0F; + + this.group4.xRot = (entity.tickCount + partialTicks) / 2.0F; + this.group4.zRot = Mth.sin((entity.tickCount + partialTicks) / 6.0F) / 2.0F; + this.group4.yRot = Mth.sin((entity.tickCount + partialTicks) / 5.0F) / 4.0F; + + this.group5.zRot = (entity.tickCount + partialTicks) / 2.0F; + this.group5.yRot = Mth.cos((entity.tickCount + partialTicks) / 5.0F) / 4.0F; + this.group5.xRot = Mth.cos((entity.tickCount + partialTicks) / 5.0F) / 4.0F; + + this.group6.zRot = Mth.cos((entity.tickCount + partialTicks) / 7.0F) / 3.0F; + this.group6.xRot = Mth.cos((entity.tickCount + partialTicks) / 4.0F) / 2.0F; + this.group6.yRot = (entity.tickCount + partialTicks) / 5.0F; + } +} diff --git a/src/main/java/twilightforest/client/model/entity/NagaModel.java b/src/main/java/twilightforest/client/model/entity/NagaModel.java new file mode 100644 index 0000000000..43cc450122 --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/NagaModel.java @@ -0,0 +1,79 @@ +package twilightforest.client.model.entity; + +import com.google.common.collect.ImmutableList; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.model.ListModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; +import net.minecraft.world.entity.Entity; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import twilightforest.entity.boss.Naga; +import twilightforest.entity.boss.NagaSegment; + +/** + * ModelNagaHead - Undefined + * Created using Tabula 8.0.0 + */ +@OnlyIn(Dist.CLIENT) +public class NagaModel extends ListModel { + + public final ModelPart root; + public final ModelPart head; + public ModelPart body; + private T entity; + + public NagaModel(ModelPart root) { + this.root = root; + + this.head = root.getChild("head"); + this.body = root.getChild("body"); + } + + public static LayerDefinition create() { + MeshDefinition mesh = new MeshDefinition(); + PartDefinition partRoot = mesh.getRoot(); + + var head = partRoot.addOrReplaceChild("head", CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-16.0F, -16.0F, -16.0F, 32.0F, 32.0F, 32.0F), + PartPose.offset(0.0F, 8.0F, 0.0F)); + + head.addOrReplaceChild("tongue", CubeListBuilder.create() + .texOffs(84, 0) + .addBox(-6.0F, 0.0F, -12.0F, 12.0F, 0.0F, 12.0F), + PartPose.offsetAndRotation(0.0F, 10.0F, -16.0F, 0.4363323129985824F, 0.0F, 0.0F)); + + partRoot.addOrReplaceChild("body", CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-16.0F, -16.0F, -16.0F, 32.0F, 32.0F, 32.0F), + PartPose.offset(0.0F, 8.0F, 0.0F)); + + return LayerDefinition.create(mesh, 128, 64); + } + + @Override + public void renderToBuffer(PoseStack stack, VertexConsumer builder, int light, int overlay, float red, float green, float blue, float alpha) { + if (entity instanceof Naga) { + head.render(stack, builder, light, overlay, red, green, blue, alpha * 2); + } else if (entity instanceof NagaSegment) { + body.render(stack, builder, light, overlay, red, green, blue, alpha * 2); + } else { + head.render(stack, builder, light, overlay, red, green, blue, alpha * 2); + } + } + + @Override + public Iterable parts() { + return ImmutableList.of(head, body); + } + + @Override + public void setupAnim(T entityIn, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + } +} diff --git a/src/main/java/twilightforest/client/model/entity/NoopModel.java b/src/main/java/twilightforest/client/model/entity/NoopModel.java new file mode 100644 index 0000000000..88b67f000f --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/NoopModel.java @@ -0,0 +1,18 @@ +package twilightforest.client.model.entity; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.world.entity.LivingEntity; + +public class NoopModel extends HumanoidModel { + + public NoopModel(ModelPart part) { + super(part); + } + + @Override + public void renderToBuffer(PoseStack ms, VertexConsumer buffers, int light, int overlay, float r, float g, float b, float a) { + } +} diff --git a/src/main/java/twilightforest/client/model/entity/PenguinModel.java b/src/main/java/twilightforest/client/model/entity/PenguinModel.java new file mode 100644 index 0000000000..2b08a91b8d --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/PenguinModel.java @@ -0,0 +1,103 @@ +// Date: 3/3/2012 11:56:45 PM +// Template version 1.1 +// Java generated by Techne +// Keep in mind that you still need to fill in some blanks +// - ZeuX + +package twilightforest.client.model.entity; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.*; +import net.minecraft.util.Mth; +import twilightforest.entity.passive.Penguin; + +public class PenguinModel extends HumanoidModel { + + public PenguinModel(ModelPart root) { + super(root); + } + + public static LayerDefinition create() { + MeshDefinition mesh = HumanoidModel.createMesh(CubeDeformation.NONE, 0.0F); + PartDefinition partRoot = mesh.getRoot(); + + partRoot.addOrReplaceChild("body", CubeListBuilder.create() + .texOffs(32, 0) + .addBox(-4.0F, 0.0F, -4.0F, 8.0F, 9.0F, 8.0F), + PartPose.offset(0.0F, 14.0F, 0.0F)); + + var head = partRoot.addOrReplaceChild("head", CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-3.5F, -4.0F, -3.5F, 7.0F, 5.0F, 7.0F), + PartPose.offset(0.0F, 13.0F, 0.0F)); + + partRoot.addOrReplaceChild("hat", CubeListBuilder.create(), PartPose.ZERO); + + head.addOrReplaceChild("beak", CubeListBuilder.create() + .texOffs(0, 13) + .addBox(-1.0F, 0.0F, -1.0F, 2.0F, 1.0F, 2.0F), + PartPose.offset(0.0F, -1.0F, -4.0F)); + + partRoot.addOrReplaceChild("right_arm", CubeListBuilder.create() + .texOffs(34, 18) + .addBox(-1.0F, -1.0F, -2.0F, 1.0F, 8.0F, 4.0F), + PartPose.offset(-4.0F, 15.0F, 0.0F)); + + partRoot.addOrReplaceChild("left_arm", CubeListBuilder.create() + .texOffs(24, 18) + .addBox(0.0F, -1.0F, -2.0F, 1.0F, 8.0F, 4.0F), + PartPose.offset(4.0F, 15.0F, 0.0F)); + + partRoot.addOrReplaceChild("right_leg", CubeListBuilder.create() + .texOffs(0, 16) + .addBox(-2.0F, 0.0F, -5.0F, 4.0F, 1.0F, 8.0F), + PartPose.offset(-2.0F, 23.0F, 0.0F)); + + partRoot.addOrReplaceChild("left_leg", CubeListBuilder.create() + .texOffs(0, 16) + .addBox(-2.0F, 0.0F, -5.0F, 4.0F, 1.0F, 8.0F), + PartPose.offset(2.0F, 23.0F, 0.0F)); + + return LayerDefinition.create(mesh, 64, 32); + } + + /** + * Sets the models various rotation angles then renders the model. + */ + @Override + public void renderToBuffer(PoseStack stack, VertexConsumer builder, int light, int overlay, float red, float green, float blue, float scale) { + if (this.young) { + float f = 2.0F; + stack.pushPose(); + stack.scale(1.0F / f, 1.0F / f, 1.0F / f); + stack.translate(0.0F, 1.5F * scale, 0.0F); + this.headParts().forEach((renderer) -> renderer.render(stack, builder, light, overlay, red, green, blue, scale)); + stack.popPose(); + + stack.pushPose(); + stack.scale(1.0F / f, 1.0F / f, 1.0F / f); + stack.translate(0.0F, 1.5F * scale, 0.0F); + this.bodyParts().forEach((renderer) -> renderer.render(stack, builder, light, overlay, red, green, blue, scale)); + stack.popPose(); + } else { + this.headParts().forEach((renderer) -> renderer.render(stack, builder, light, overlay, red, green, blue, scale)); + this.bodyParts().forEach((renderer) -> renderer.render(stack, builder, light, overlay, red, green, blue, scale)); + } + } + + @Override + public void setupAnim(Penguin entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + this.head.xRot = headPitch / (180F / (float) Math.PI); + this.head.yRot = netHeadYaw / (180F / (float) Math.PI); + + this.rightLeg.xRot = Mth.cos(limbSwing) * 0.7F * limbSwingAmount; + this.leftLeg.xRot = Mth.cos(limbSwing + (float) Math.PI) * 0.7F * limbSwingAmount; + + this.rightArm.zRot = ageInTicks; + this.leftArm.zRot = -ageInTicks; + } +} diff --git a/src/main/java/twilightforest/client/model/entity/PinchBeetleModel.java b/src/main/java/twilightforest/client/model/entity/PinchBeetleModel.java new file mode 100644 index 0000000000..e5b37fb76f --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/PinchBeetleModel.java @@ -0,0 +1,176 @@ +package twilightforest.client.model.entity; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.model.HierarchicalModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; +import net.minecraft.util.Mth; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import twilightforest.entity.monster.PinchBeetle; + +/** + * ModelPinchBeetle - MCVinnyq + * Created using Tabula 8.0.0 + */ +@OnlyIn(Dist.CLIENT) +public class PinchBeetleModel extends HierarchicalModel { + public final ModelPart root; + public final ModelPart head; + public ModelPart rightLeg1, rightLeg2, rightLeg3; + public ModelPart leftLeg1, leftLeg2, leftLeg3; + public ModelPart rightPincer, leftPincer; + + public PinchBeetleModel(ModelPart root) { + this.root = root; + + this.head = root.getChild("head"); + + this.leftPincer = head.getChild("left_pincher"); + this.rightPincer = head.getChild("right_pincher"); + + this.rightLeg1 = root.getChild("right_leg_1"); + this.rightLeg2 = root.getChild("right_leg_2"); + this.rightLeg3 = root.getChild("right_leg_3"); + + this.leftLeg1 = root.getChild("left_leg_1"); + this.leftLeg2 = root.getChild("left_leg_2"); + this.leftLeg3 = root.getChild("left_leg_3"); + } + + public static LayerDefinition create() { + MeshDefinition mesh = new MeshDefinition(); + PartDefinition partRoot = mesh.getRoot(); + + var head = partRoot.addOrReplaceChild("head", CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-4.0F, -3.0F, -6.0F, 8.0F, 6.0F, 6.0F), + PartPose.offset(0.0F, 19.0F, 0.0F)); + + head.addOrReplaceChild("left_antenna", CubeListBuilder.create() + .texOffs(52, 0) + .addBox(0.0F, 0.0F, -10.0F, 1.0F, 0.0F, 10.0F), + PartPose.offsetAndRotation(1.0F, -3.0F, -6.0F, -0.4363323129985824F, -0.4363323129985824F, 0.0F)); + + head.addOrReplaceChild("right_antenna", CubeListBuilder.create() + .texOffs(48, 0).addBox(-1.0F, 0.0F, -10.0F, 1.0F, 0.0F, 10.0F), + PartPose.offsetAndRotation(-1.0F, -3.0F, -6.0F, -0.4363323129985824F, 0.4363323129985824F, 0.0F)); + + head.addOrReplaceChild("left_pincher", CubeListBuilder.create() + .texOffs(16, 14) + .addBox(0.0F, 0.0F, -12.0F, 12.0F, 2.0F, 12.0F), + PartPose.offsetAndRotation(4.0F, 2.0F, -4.0F, 0.08726646259971647F, 0.6108652381980153F, 0.0F)); + + head.addOrReplaceChild("right_pincher", CubeListBuilder.create() + .texOffs(16, 0) + .addBox(-12.0F, 0.0F, -12.0F, 12.0F, 2.0F, 12.0F), + PartPose.offsetAndRotation(-4.0F, 2.0F, -4.0F, 0.08726646259971647F, -0.6108652381980153F, 0.0F)); + + partRoot.addOrReplaceChild("body", CubeListBuilder.create() + .texOffs(0, 28) + .addBox(-5.0F, -8.0F, -3.0F, 10.0F, 10.0F, 7.0F), + PartPose.offsetAndRotation(0.0F, 19.0F, 8.0F, 1.5707963267948966F, 0.0F, 0.0F)); + + partRoot.addOrReplaceChild("right_leg_1", CubeListBuilder.create() + .texOffs(40, 28) + .addBox(-10.0F, 0.0F, -1.0F, 10.0F, 2.0F, 2.0F), + PartPose.offsetAndRotation(-2.0F, 21.0F, 6.0F, 0.0F, 0.6108652381980153F, -0.17453292519943295F)); + + partRoot.addOrReplaceChild("right_leg_2", CubeListBuilder.create() + .texOffs(40, 32) + .addBox(-10.0F, 0.0F, -1.0F, 10.0F, 2.0F, 2.0F), + PartPose.offsetAndRotation(-2.0F, 21.0F, 4.0F, 0.0F, 0.20943951023931953F, -0.17453292519943295F)); + + partRoot.addOrReplaceChild("right_leg_3", CubeListBuilder.create() + .texOffs(40, 36) + .addBox(-10.0F, 0.0F, -1.0F, 10.0F, 2.0F, 2.0F), + PartPose.offsetAndRotation(-2.0F, 21.0F, 2.0F, 0.0F, -0.20943951023931953F, -0.17453292519943295F)); + + partRoot.addOrReplaceChild("left_leg_1", CubeListBuilder.create() + .texOffs(40, 42) + .addBox(0.0F, 0.0F, -1.0F, 10.0F, 2.0F, 2.0F), + PartPose.offsetAndRotation(2.0F, 21.0F, 6.0F, 0.0F, -0.6108652381980153F, 0.17453292519943295F)); + + partRoot.addOrReplaceChild("left_leg_2", CubeListBuilder.create() + .texOffs(40, 46) + .addBox(0.0F, 0.0F, -1.0F, 10.0F, 2.0F, 2.0F), + PartPose.offsetAndRotation(2.0F, 21.0F, 4.0F, 0.0F, -0.20943951023931953F, 0.17453292519943295F)); + + partRoot.addOrReplaceChild("left_leg_3", CubeListBuilder.create() + .texOffs(40, 50) + .addBox(0.0F, 0.0F, -1.0F, 10.0F, 2.0F, 2.0F), + PartPose.offsetAndRotation(2.0F, 21.0F, 2.0F, 0.0F, 0.20943951023931953F, 0.17453292519943295F)); + + return LayerDefinition.create(mesh, 64, 64); + } + + @Override + public ModelPart root() { + return this.root; + } + + @Override + public void setupAnim(PinchBeetle entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + this.head.yRot = netHeadYaw / (180F / (float) Math.PI); + this.head.xRot = headPitch / (180F / (float) Math.PI); + + float legZ = ((float) Math.PI / 11F); + this.leftLeg1.zRot = legZ; + this.rightLeg1.zRot = -legZ; + this.leftLeg2.zRot = legZ * 0.74F; + this.rightLeg2.zRot = -legZ * 0.74F; + this.leftLeg3.zRot = legZ; + this.rightLeg3.zRot = -legZ; + + float var9 = -0.0F; + float var10 = 0.3926991F; + this.leftLeg1.yRot = -var10 * 2.0F + var9; + this.rightLeg1.yRot = var10 * 2.0F - var9; + this.leftLeg2.yRot = var10 + var9; + this.rightLeg2.yRot = -var10 - var9; + this.leftLeg3.yRot = var10 * 2.0F + var9; + this.rightLeg3.yRot = -var10 * 2.0F - var9; + + float var11 = -(Mth.cos(limbSwing * 0.6662F * 2.0F + 0.0F) * 0.4F) * limbSwingAmount; + float var12 = -(Mth.cos(limbSwing * 0.6662F * 2.0F + (float) Math.PI) * 0.4F) * limbSwingAmount; + float var14 = -(Mth.cos(limbSwing * 0.6662F * 2.0F + ((float) Math.PI * 3F / 2F)) * 0.4F) * limbSwingAmount; + + float var15 = Math.abs(Mth.sin(limbSwing * 0.6662F + 0.0F) * 0.4F) * limbSwingAmount; + float var16 = Math.abs(Mth.sin(limbSwing * 0.6662F + (float) Math.PI) * 0.4F) * limbSwingAmount; + float var18 = Math.abs(Mth.sin(limbSwing * 0.6662F + ((float) Math.PI * 3F / 2F)) * 0.4F) * limbSwingAmount; + + this.leftLeg1.yRot += var11; + this.rightLeg1.yRot += -var11; + this.leftLeg2.yRot += var12; + this.rightLeg2.yRot += -var12; + this.leftLeg3.yRot += var14; + this.rightLeg3.yRot += -var14; + + this.leftLeg1.zRot += var15; + this.rightLeg1.zRot += -var15; + + this.leftLeg2.zRot += var16; + this.rightLeg2.zRot += -var16; + + this.leftLeg3.zRot += var18; + this.rightLeg3.zRot += -var18; + } + + @Override + public void prepareMobModel(PinchBeetle entity, float limbSwing, float limbSwingAmount, float partialTicks) { + if (entity.isVehicle()) { + // open jaws + this.rightPincer.yRot = -0.3490658503988659F; + this.leftPincer.yRot = 0.3490658503988659F; + } else { + // close jaws + this.rightPincer.yRot = -0.7853981633974483F; + this.leftPincer.yRot = 0.7853981633974483F; + } + } +} diff --git a/src/main/java/twilightforest/client/model/entity/ProtectionBoxModel.java b/src/main/java/twilightforest/client/model/entity/ProtectionBoxModel.java new file mode 100644 index 0000000000..8672ef94ab --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/ProtectionBoxModel.java @@ -0,0 +1,84 @@ +package twilightforest.client.model.entity; + +import com.google.common.collect.ImmutableList; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.model.ListModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; +import twilightforest.entity.ProtectionBox; + +public class ProtectionBoxModel extends ListModel { + + private T entity; + + public ModelPart box; + private int lastPixelsX; + private int lastPixelsY; + private int lastPixelsZ; + + public ProtectionBoxModel(ModelPart root) { + this.box = root.getChild("box"); + } + + public static MeshDefinition createMesh() { + MeshDefinition mesh = new MeshDefinition(); + PartDefinition partRoot = mesh.getRoot(); + + partRoot.addOrReplaceChild("box", CubeListBuilder.create() + .texOffs(0, 0) + .addBox(0.0F, 0.0F, 0.0F, 16.0F, 16.0F, 16.0F), + PartPose.ZERO); + + return mesh; + } + + @Override + public Iterable parts() { + return ImmutableList.of(this.box); + } + + @Override + public void renderToBuffer(PoseStack stack, VertexConsumer builder, int light, int overlay, float red, float green, float blue, float alpha) { + ProtectionBox boxEntity = entity; + + int pixelsX = boxEntity.sizeX * 16 + 2; + int pixelsY = boxEntity.sizeY * 16 + 2; + int pixelsZ = boxEntity.sizeZ * 16 + 2; + + if (pixelsX != this.lastPixelsX || pixelsY != this.lastPixelsY || pixelsZ != this.lastPixelsZ) { + resizeBoxElement(pixelsX, pixelsY, pixelsZ); + } + + super.renderToBuffer(stack, builder, light, overlay, red, green, blue, alpha); + } + + @Override + public void setupAnim(T entity, float v, float v1, float v2, float v3, float v4) { + + } + + @Override + public void prepareMobModel(T entity, float limbSwing, float limbSwingAmount, float partialTicks) { + this.entity = entity; + } + + private void resizeBoxElement(int pixelsX, int pixelsY, int pixelsZ) { + + MeshDefinition mesh = createMesh(); + PartDefinition partRoot = mesh.getRoot(); + + partRoot.addOrReplaceChild("box", CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-1.0F, -1.0F, -1.0F, pixelsX, pixelsY, pixelsZ), + PartPose.ZERO); + box = partRoot.getChild("box").bake(16, 16); + + this.lastPixelsX = pixelsX; + this.lastPixelsY = pixelsY; + this.lastPixelsZ = pixelsZ; + } +} diff --git a/src/main/java/twilightforest/client/model/entity/QuestRamModel.java b/src/main/java/twilightforest/client/model/entity/QuestRamModel.java new file mode 100644 index 0000000000..d32c5b37d6 --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/QuestRamModel.java @@ -0,0 +1,172 @@ +package twilightforest.client.model.entity; + +import com.google.common.collect.ImmutableList; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.model.QuadrupedModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.*; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.animal.Sheep; +import net.minecraft.world.item.DyeColor; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import twilightforest.entity.passive.QuestRam; + +/** + * ModelQuestingRam - MCVinnyq + * Created using Tabula 8.0.0 + */ +@OnlyIn(Dist.CLIENT) +public class QuestRamModel extends QuadrupedModel { + public final ModelPart horns; + public ModelPart backtorso, frontTorso; + + public ModelPart[] segments = new ModelPart[16]; + int[] colorOrder = new int[]{0, 8, 7, 15, 14, 1, 4, 5, 13, 3, 9, 11, 10, 2, 6, 12}; + + public QuestRamModel(ModelPart root) { + super(root, false, 4.0F, 4.0F, 2.0F, 2.0F, 24); + + this.horns = root.getChild("horns"); + this.backtorso = root.getChild("back_torso"); + + this.frontTorso = root.getChild("front_torso"); + + for(int i = 0; i < 16; i++) { + this.segments[i] = frontTorso.getChild("segment_" + i); + } + } + + public static LayerDefinition create() { + MeshDefinition mesh = QuadrupedModel.createBodyMesh(16, CubeDeformation.NONE); + PartDefinition partRoot = mesh.getRoot(); + + var horns = partRoot.addOrReplaceChild("horns", CubeListBuilder.create() + .texOffs(64, 0) + .addBox(-9.0F, -11.0F, -1.0F, 4.0F, 10.0F, 10.0F) + .texOffs(48, 0) + .addBox(-13.0F, -11.0F, 5.0F, 4.0F, 4.0F, 4.0F) + .texOffs(92, 0) + .addBox(5.0F, -11.0F, -1.0F, 4.0F, 10.0F, 10.0F) + .texOffs(110, 0) + .addBox(9.0F, -11.0F, 5.0F, 4.0F, 4.0F, 4.0F), + PartPose.offset(0.0F, -10.0F, -8.0F)); + + horns.addOrReplaceChild("head", CubeListBuilder.create() + .texOffs(74, 70) + .addBox(-6.0F, -2.0F, -13.0F, 12.0F, 8.0F, 15.0F) + .texOffs(42, 71) + .addBox(-6.0F, -5.0F, -9.0F, 12.0F, 3.0F, 11.0F), + PartPose.offsetAndRotation(0.0F, -4.0F, 3.0F, 0.4363323129985824F, 0.0F, 0.0F)); + + var frontTorso = partRoot.addOrReplaceChild("front_torso", CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-8.0F, -7.0F, -6.0F, 16.0F, 14.0F, 16.0F), + PartPose.offset(0.0F, 0.0F, 0.0F)); + + frontTorso.addOrReplaceChild("neck", CubeListBuilder.create() + .texOffs(84, 93) + .addBox(-5.0F, -11.0F, -2.0F, 10.0F, 12.0F, 12.0F), + PartPose.offsetAndRotation(0.0F, 2.0F, -3.0F, 0.6108652381980153F, 0.0F, 0.0F)); + + partRoot.addOrReplaceChild("back_torso", CubeListBuilder.create() + .texOffs(0, 30) + .addBox(-8.0F, -7.0F, 8.0F, 16.0F, 14.0F, 16.0F), + PartPose.offset(0.0F, 0.0F, 6.0F)); + + partRoot.addOrReplaceChild("right_front_leg", CubeListBuilder.create() + .texOffs(0, 60) + .addBox(-3.0F, 2.0F, -3.0F, 6.0F, 16.0F, 6.0F) + .texOffs(54, 20) + .addBox(-4.0F, -4.0F, -5.0F, 8.0F, 10.0F, 10.0F), + PartPose.offset(-5.0F, 6.0F, 0.0F)); + + partRoot.addOrReplaceChild("left_front_leg", CubeListBuilder.create() + .texOffs(24, 60) + .addBox(-3.0F, 2.0F, -3.0F, 6.0F, 16.0F, 6.0F) + .texOffs(90, 20) + .addBox(-4.0F, -4.0F, -5.0F, 8.0F, 10.0F, 10.0F), + PartPose.offset(5.0F, 6.0F, 0.0F)); + + partRoot.addOrReplaceChild("right_hind_leg", CubeListBuilder.create() + .texOffs(0, 82) + .addBox(7.0F, 2.0F, -5.0F, 6.0F, 16.0F, 6.0F) + .texOffs(54, 50) + .addBox(6.0F, -4.0F, -7.0F, 8.0F, 10.0F, 10.0F), + PartPose.offset(-16.0F, 6.0F, 0.0F)); + + partRoot.addOrReplaceChild("left_hind_leg", CubeListBuilder.create() + .texOffs(24, 82) + .addBox(-13.0F, 2.0F, -5.0F, 6.0F, 16.0F, 6.0F) + .texOffs(90, 50) + .addBox(-14.0F, -4.0F, -7.0F, 8.0F, 10.0F, 10.0F), + PartPose.offset(16.0F, 6.0F, 0.0F)); + + for (int i = 0; i < 16; i++) { + + frontTorso.addOrReplaceChild("segment_" + i, CubeListBuilder.create() + .texOffs(0, 112) + .addBox(-8.0F, -7.0F, 8.0F, 16.0F, 14.0F, 2.0F), + PartPose.offset(0.0F, 0.0F, 10.0F)); + } + + return LayerDefinition.create(mesh, 128, 128); + } + + @Override + protected Iterable headParts() { + return ImmutableList.of(horns); + } + + @Override + protected Iterable bodyParts() { + return ImmutableList.of(horns, frontTorso, backtorso, rightFrontLeg, leftFrontLeg, rightHindLeg, leftHindLeg); + } + + @Override + public void renderToBuffer(PoseStack stack, VertexConsumer builder, int light, int overlay, float red, float green, float blue, float alpha) { + super.renderToBuffer(stack, builder, light, overlay, red, green, blue, alpha); + + for (int i = 0; i < 16; i++) { + final float[] dyeRgb = Sheep.getColorArray(DyeColor.byId(i)); + segments[i].render(stack, builder, light, overlay, dyeRgb[0], dyeRgb[1], dyeRgb[2], alpha); + } + } + + @Override + public void setupAnim(QuestRam entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + this.horns.xRot = headPitch / (180F / (float) Math.PI); + this.horns.yRot = netHeadYaw / (180F / (float) Math.PI); + + this.leftHindLeg.xRot = Mth.cos(limbSwing * 0.6662F) * 1.4F * limbSwingAmount * 0.5F; + this.rightHindLeg.xRot = Mth.cos(limbSwing * 0.6662F + (float) Math.PI) * 1.4F * limbSwingAmount * 0.5F; + this.leftFrontLeg.xRot = Mth.cos(limbSwing * 0.6662F + (float) Math.PI) * 1.4F * limbSwingAmount * 0.5F; + this.rightFrontLeg.xRot = Mth.cos(limbSwing * 0.6662F) * 1.4F * limbSwingAmount * 0.5F; + } + + @Override + public void prepareMobModel(QuestRam entity, float limbSwing, float limbSwingAmount, float partialTicks) { + + // how many colors should we display? + int count = entity.countColorsSet(); + + this.backtorso.z = 2 + 2 * count; + this.leftHindLeg.z = 25 + 2 * count; + this.rightHindLeg.z = 25 + 2 * count; + + // set up the colors displayed in color order + int segmentOffset = 2; + for (int color : colorOrder) { + if (entity.isColorPresent(DyeColor.byId(color))) { + segments[color].visible = true; + segments[color].z = segmentOffset; + + segmentOffset += 2; + } else { + segments[color].visible = false; + } + } + } +} diff --git a/src/main/java/twilightforest/client/model/entity/RavenModel.java b/src/main/java/twilightforest/client/model/entity/RavenModel.java new file mode 100644 index 0000000000..68ca34ac8f --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/RavenModel.java @@ -0,0 +1,111 @@ +package twilightforest.client.model.entity; + +import net.minecraft.client.model.HierarchicalModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; +import net.minecraft.util.Mth; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import twilightforest.entity.passive.Raven; + +/** + * ModelForestRaven - MCVinnyq + * Created using Tabula 8.0.0 + */ +@OnlyIn(Dist.CLIENT) +public class RavenModel extends HierarchicalModel { + public final ModelPart root; + public final ModelPart head; + public ModelPart rightWing; + public ModelPart leftWing; + public ModelPart rightLeg; + public ModelPart leftLeg; + public ModelPart tail; + + public RavenModel(ModelPart root) { + this.root = root; + + this.head = root.getChild("head"); + + var body = root.getChild("torso"); + this.rightWing = body.getChild("right_wing"); + this.leftWing = body.getChild("left_wing"); + this.rightLeg = root.getChild("right_leg"); + this.leftLeg = root.getChild("left_leg"); + this.tail = body.getChild("tail"); + } + + public static LayerDefinition create() { + MeshDefinition mesh = new MeshDefinition(); + PartDefinition partRoot = mesh.getRoot(); + + partRoot.addOrReplaceChild("head", CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-1.5F, -1.0F, -2.0F, 3.0F, 3.0F, 3.0F) + .texOffs(9, 0) + .addBox(-0.5F, 0.0F, -3.0F, 1.0F, 2.0F, 1.0F), + PartPose.offset(0.0F, 18.5F, -2.0F)); + + var body = partRoot.addOrReplaceChild("torso", CubeListBuilder.create() + .texOffs(0, 6) + .addBox(-2.0F, -1.5F, 0.0F, 4.0F, 3.0F, 6.0F), + PartPose.offsetAndRotation(0.0F, 18.5F, -2.0F, -0.4363323129985824F, 0.0F, 0.0F)); + + body.addOrReplaceChild("right_wing", CubeListBuilder.create() + .texOffs(0, 15) + .addBox(-1.0F, 0.0F, -1.0F, 1.0F, 3.0F, 6.0F), + PartPose.offsetAndRotation(-2.0F, -1.0F, 2.0F, 0.2617993877991494F, 0.0F, 0.0F)); + + body.addOrReplaceChild("left_wing", CubeListBuilder.create() + .texOffs(14, 15) + .addBox(0.0F, 0.0F, -1.0F, 1.0F, 3.0F, 6.0F), + PartPose.offsetAndRotation(2.0F, -1.0F, 2.0F, 0.2617993877991494F, 0.0F, 0.0F)); + + partRoot.addOrReplaceChild("right_leg", CubeListBuilder.create() + .texOffs(8, 15) + .addBox(0.0F, 0.0F, -1.0F, 1.0F, 2.0F, 2.0F), + PartPose.offsetAndRotation(-1.0F, 0.0F, 0.0F, 0.7853981633974483F, 0.0F, 0.0F)); + + partRoot.addOrReplaceChild("left_leg", CubeListBuilder.create() + .texOffs(14, 15) + .addBox(0.0F, 0.0F, -1.0F, 1.0F, 2.0F, 2.0F), + PartPose.offsetAndRotation(1.0F, 0.0F, 0.0F, 0.7853981633974483F, 0.0F, 0.0F)); + + body.addOrReplaceChild("tail", CubeListBuilder.create() + .texOffs(8, 0) + .addBox(-2.5F, 0.0F, 0.0F, 5.0F, 0.0F, 5.0F), + PartPose.offsetAndRotation(0.0F, -1.5F, 6.0F, -0.4363323129985824F, 0.0F, 0.0F)); + + return LayerDefinition.create(mesh, 32, 32); + } + + @Override + public ModelPart root() { + return this.root; + } + + @Override + public void setupAnim(Raven entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + head.xRot = headPitch / (180F / (float) Math.PI); + head.yRot = netHeadYaw / (180F / (float) Math.PI); + head.zRot = netHeadYaw > 5 ? -0.2617994F : 0; + + leftLeg.xRot = Mth.cos (limbSwing * 0.6662F) * 1.4F * limbSwingAmount; + rightLeg.xRot = Mth.cos(limbSwing * 0.6662F + (float) Math.PI) * 1.4F * limbSwingAmount; + + rightWing.zRot = ageInTicks; + leftWing.zRot = -ageInTicks; + + if (entity.isBirdLanded()) { + rightLeg.y = 21; + leftLeg.y = 21; + } else { + rightLeg.y = 20F; + leftLeg.y = 20F; + } + } +} diff --git a/src/main/java/twilightforest/client/model/entity/RedThreadModel.java b/src/main/java/twilightforest/client/model/entity/RedThreadModel.java new file mode 100644 index 0000000000..3e6cf7378b --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/RedThreadModel.java @@ -0,0 +1,116 @@ +package twilightforest.client.model.entity; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.model.Model; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.core.Direction; + +public class RedThreadModel extends Model { + public final ModelPart center; + public final ModelPart up; + public final ModelPart down; + public final ModelPart left; + public final ModelPart right; + + public RedThreadModel(ModelPart root) { + super(RenderType::entityCutoutNoCull); + this.center = root.getChild("center"); + this.up = root.getChild("up"); + this.down = root.getChild("down"); + this.left = root.getChild("left"); + this.right = root.getChild("right"); + } + + public static LayerDefinition create() { + MeshDefinition meshdefinition = new MeshDefinition(); + PartDefinition partdefinition = meshdefinition.getRoot(); + partdefinition.addOrReplaceChild("center", + CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-1.0F, 0.2F, -1.0F, 2.0F, 0.0F, 2.0F), + PartPose.ZERO); + partdefinition.addOrReplaceChild("up", + CubeListBuilder.create() + .texOffs(0, 2) + .addBox(-1.0F, 0.2F, -8.0F, 2.0F, 0.0F, 7.0F), + PartPose.ZERO); + partdefinition.addOrReplaceChild("down", + CubeListBuilder.create() + .texOffs(4, 2) + .addBox(-1.0F, 0.2F, 1.0F, 2.0F, 0.0F, 7.0F), + PartPose.ZERO); + partdefinition.addOrReplaceChild("left", + CubeListBuilder.create() + .texOffs(0, 10) + .addBox(-8.0F, 0.2F, -1.0F, 7.0F, 0.0F, 2.0F), + PartPose.ZERO); + partdefinition.addOrReplaceChild("right", + CubeListBuilder.create() + .texOffs(0, 14) + .addBox(1.0F, 0.2F, -1.0F, 7.0F, 0.0F, 2.0F), + PartPose.ZERO); + + return LayerDefinition.create(meshdefinition, 16, 16); + } + + @Override + public void renderToBuffer(PoseStack stack, VertexConsumer consumer, int light, int overlay, float red, float green, float blue, float alpha) { + this.center.render(stack, consumer, light, overlay, red, green, blue, alpha); + this.up.render(stack, consumer, light, overlay, red, green, blue, alpha); + this.down.render(stack, consumer, light, overlay, red, green, blue, alpha); + this.left.render(stack, consumer, light, overlay, red, green, blue, alpha); + this.right.render(stack, consumer, light, overlay, red, green, blue, alpha); + } + + /** + * Helper method for getting the part of the model that needs to be rendered, + * based on what face the part is sitting on and what direction it's pointing towards. + */ + public ModelPart getPart(Direction face, Direction direction) { + return switch (face) { + case DOWN -> switch (direction) { + case NORTH -> this.up; + case EAST -> this.right; + case SOUTH -> this.down; + default -> this.left; + }; + case UP -> switch (direction) { + case NORTH -> this.up; + case WEST -> this.right; + case SOUTH -> this.down; + default -> this.left; + }; + case NORTH -> switch (direction) { + case UP -> this.up; + case EAST -> this.right; + case DOWN -> this.down; + default -> this.left; + }; + case SOUTH -> switch (direction) { + case UP -> this.down; + case WEST -> this.left; + case DOWN -> this.up; + default -> this.right; + }; + case WEST -> switch (direction) { + case UP -> this.left; + case NORTH -> this.up; + case DOWN -> this.right; + default -> this.down; + }; + case EAST -> switch (direction) { + case UP -> this.right; + case SOUTH -> this.down; + case DOWN -> this.left; + default -> this.up; + }; + }; + } +} diff --git a/src/main/java/twilightforest/client/model/entity/RedcapModel.java b/src/main/java/twilightforest/client/model/entity/RedcapModel.java new file mode 100644 index 0000000000..0dcbd0a942 --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/RedcapModel.java @@ -0,0 +1,65 @@ +package twilightforest.client.model.entity; + +import net.minecraft.client.model.AnimationUtils; +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.*; +import net.minecraft.util.Mth; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.HumanoidArm; +import twilightforest.entity.monster.Redcap; + +public class RedcapModel extends FixedHumanoidModel { + + public RedcapModel(ModelPart root) { + super(root, 3.0F); + } + + public static LayerDefinition create() { + MeshDefinition mesh = new MeshDefinition(); + PartDefinition partRoot = mesh.getRoot(); + + partRoot.addOrReplaceChild("head", CubeListBuilder.create() + .texOffs(0, 1) + .addBox(-5.5F, -6.0F, -0.5F, 2.0F, 3.0F, 0.0F) + .texOffs(0, 1).mirror() + .addBox(3.5F, -6.0F, -0.5F, 2.0F, 3.0F, 0.0F).mirror(false) + .texOffs(0, 0) + .addBox(-3.5F, -8.0F, -3.5F, 7.0F, 7.0F, 7.0F), + PartPose.offset(0.0F, 8.0F, 0.0F)); + + partRoot.addOrReplaceChild("hat", CubeListBuilder.create() + .texOffs(28, 0) + .addBox(-3.5F, -8.0F, -3.5F, 7.0F, 8.0F, 7.0F, new CubeDeformation(0.25F)), + PartPose.offset(0.0F, 6.0F, 0.0F)); + + partRoot.addOrReplaceChild("body", CubeListBuilder.create() + .texOffs(15, 19) + .addBox(-4.0F, 1.0F, -2.0F, 8.0F, 9.0F, 4.0F), + PartPose.offset(0.0F, 5.0F, 0.0F)); + + partRoot.addOrReplaceChild("right_arm", CubeListBuilder.create() + .texOffs(39, 17).mirror() + .addBox(-3.0F, -1.0F, -1.5F, 3.0F, 12.0F, 3.0F).mirror(false), + PartPose.offset(-4.0F, 7.0F, 0.0F)); + + partRoot.addOrReplaceChild("left_arm", CubeListBuilder.create() + .texOffs(39, 17) + .addBox(0.0F, -1.0F, -1.5F, 3.0F, 12.0F, 3.0F), + PartPose.offset(4.0F, 7.0F, 0.0F)); + + partRoot.addOrReplaceChild("right_leg", CubeListBuilder.create() + .texOffs(0, 19).mirror() + .addBox(-1.5F, 0.0F, -2.0F, 3.0F, 9.0F, 4.0F).mirror(false), + PartPose.offset(-2.5F, 15.0F, 0.0F)); + + partRoot.addOrReplaceChild("left_leg", CubeListBuilder.create() + .texOffs(0, 19) + .addBox(-1.5F, 0.0F, -2.0F, 3.0F, 9.0F, 4.0F), + PartPose.offset(2.5F, 15.0F, 0.0F)); + + + return LayerDefinition.create(mesh, 64, 32); + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/client/model/entity/RisingZombieModel.java b/src/main/java/twilightforest/client/model/entity/RisingZombieModel.java new file mode 100644 index 0000000000..1a56972463 --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/RisingZombieModel.java @@ -0,0 +1,76 @@ +package twilightforest.client.model.entity; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.math.Axis; +import org.joml.Vector3f; +import net.minecraft.client.Minecraft; +import net.minecraft.client.model.ZombieModel; +import net.minecraft.client.model.geom.ModelPart; +import twilightforest.entity.monster.RisingZombie; + +public class RisingZombieModel extends ZombieModel { + + private float tick; + + public RisingZombieModel(ModelPart part) { + super(part); + } + + @Override + public void renderToBuffer(PoseStack stack, VertexConsumer builder, int light, int overlay, float red, float green, float blue, float scale) { + stack.pushPose(); + + if (this.young) { + stack.pushPose();{ + stack.scale(0.75F, 0.75F, 0.75F); + stack.translate(0.0F, 16.0F * scale, 0.0F); + this.headParts().forEach((renderer) -> renderer.render(stack, builder, light, overlay, red, green, blue, scale)); + stack.popPose(); + stack.pushPose(); + stack.scale(0.5F, 0.5F, 0.5F); + stack.translate(0.0F, 24.0F * scale, 0.0F); + this.body.render(stack, builder, light, overlay, red, green, blue, scale); + this.rightArm.render(stack, builder, light, overlay, red, green, blue, scale); + this.leftArm.render(stack, builder, light, overlay, red, green, blue, scale); + this.hat.render(stack, builder, light, overlay, red, green, blue, scale); + } + stack.popPose(); + this.rightLeg.render(stack, builder, light, overlay, red, green, blue, scale); + this.leftLeg.render(stack, builder, light, overlay, red, green, blue, scale); + } else { + if (this.crouching) { + stack.translate(0.0F, 0.2F, 0.0F); + } + + // todo 1.15 ageInTicks/the entity only provided to setRotationAngles now, rework this entire render and move this transform there + stack.translate(0F, (80F - Math.min(80F, tick)) / 80F, 0F); + stack.translate(0F, (40F - Math.min(40F, Math.max(0F, tick - 80F))) / 40F, 0F); + stack.pushPose(); + { + final float yOff = 1F; + stack.translate(0, yOff, 0); + // todo 1.15 ageInTicks/the entity only provided to setRotationAngles now, rework this entire render and move this transform there + stack.mulPose(Axis.XP.rotationDegrees(-120F * (80F - Math.min(80F, tick)) / 80F)); + stack.mulPose(Axis.XP.rotationDegrees(30F * (40F - Math.min(40F, Math.max(0F, tick - 80F))) / 40F)); + stack.translate(0, -yOff, 0); + this.headParts().forEach((renderer) -> renderer.render(stack, builder, light, overlay, red, green, blue, scale)); + this.body.render(stack, builder, light, overlay, red, green, blue, scale); + this.rightArm.render(stack, builder, light, overlay, red, green, blue, scale); + this.leftArm.render(stack, builder, light, overlay, red, green, blue, scale); + this.hat.render(stack, builder, light, overlay, red, green, blue, scale); + } + stack.popPose(); + this.rightLeg.render(stack, builder, light, overlay, red, green, blue, scale); + this.leftLeg.render(stack, builder, light, overlay, red, green, blue, scale); + } + + stack.popPose(); + } + + @Override + protected void setupAttackAnimation(RisingZombie p_102858_, float p_102859_) { + super.setupAttackAnimation(p_102858_, p_102859_); + tick = p_102859_ + Minecraft.getInstance().getDeltaFrameTime(); + } +} diff --git a/src/main/java/twilightforest/client/model/entity/SkeletonDruidModel.java b/src/main/java/twilightforest/client/model/entity/SkeletonDruidModel.java new file mode 100644 index 0000000000..e1d7a0863c --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/SkeletonDruidModel.java @@ -0,0 +1,68 @@ +package twilightforest.client.model.entity; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.Iterables; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.model.SkeletonModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.*; +import twilightforest.entity.monster.SkeletonDruid; + +public class SkeletonDruidModel extends SkeletonModel { + private final ModelPart dress; + + public SkeletonDruidModel(ModelPart root) { + super(root); + + this.dress = root.getChild("dress"); + } + + public static LayerDefinition create(CubeDeformation deformation) { + MeshDefinition mesh = SkeletonModel.createMesh(deformation, 0); + PartDefinition partRoot = mesh.getRoot(); + + partRoot.addOrReplaceChild("body", CubeListBuilder.create() + .texOffs(8, 16) + .addBox(-4.0F, 0.0F, -2.0F, 8.0F, 12.0F, 4.0F, deformation), + PartPose.ZERO); + + partRoot.addOrReplaceChild("left_arm", CubeListBuilder.create().mirror() + .texOffs(0, 16) + .addBox(-1.0F, -2.0F, -1.0F, 2.0F, 12.0F, 2.0F, deformation), + PartPose.offset(5.0F, 2.0F, 0.0F)); + + partRoot.addOrReplaceChild("right_arm", CubeListBuilder.create() + .texOffs(0, 16) + .addBox(-1.0F, -2.0F, -1.0F, 2.0F, 12.0F, 2.0F, deformation), + PartPose.offset(-5.0F, 2.0F, 0.0F)); + + partRoot.addOrReplaceChild("left_leg", CubeListBuilder.create().mirror() + .texOffs(0, 16) + .addBox(-2.0F, 0.0F, -2.0F, 2.0F, 12.0F, 2.0F, deformation), + PartPose.offset(3.0F, 12.0F, 0.0F)); + + partRoot.addOrReplaceChild("right_leg", CubeListBuilder.create() + .texOffs(0, 16) + .addBox(-2.0F, 0.0F, -2.0F, 2.0F, 12.0F, 2.0F, deformation), + PartPose.offset(-1.0F, 12.0F, 0.0F)); + + partRoot.addOrReplaceChild("dress", CubeListBuilder.create() + .texOffs(32, 16) + .addBox(-4.0F, 12.0F, -2.0F, 8.0F, 12.0F, 4.0F, deformation), + PartPose.ZERO); + + return LayerDefinition.create(mesh, 64, 32); + } + + + public static LayerDefinition create() { + return create(CubeDeformation.NONE); + } + + @Override + protected Iterable bodyParts() { + return Iterables.concat(super.bodyParts(), ImmutableList.of(this.dress)); + } +} diff --git a/src/main/java/twilightforest/client/model/entity/SlimeBeetleModel.java b/src/main/java/twilightforest/client/model/entity/SlimeBeetleModel.java new file mode 100644 index 0000000000..837c7813db --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/SlimeBeetleModel.java @@ -0,0 +1,209 @@ +package twilightforest.client.model.entity; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.model.HierarchicalModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; +import net.minecraft.util.Mth; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import twilightforest.entity.monster.SlimeBeetle; + +/** + * ModelSlimeBeetle - MCVinnyq + * Created using Tabula 8.0.0 + */ +@OnlyIn(Dist.CLIENT) +public class SlimeBeetleModel extends HierarchicalModel { + public final ModelPart root; + public final ModelPart head; + public ModelPart rightLeg1, rightLeg2, rightLeg3; + public ModelPart leftLeg1, leftLeg2, leftLeg3; + public ModelPart rightAntenna, leftAntenna; + public ModelPart rightEye, leftEye; + public ModelPart tailBottom, tailTop, slime, slimeCenter; + + public SlimeBeetleModel(ModelPart root) { + this.root = root; + this.head = root.getChild("head"); + + this.rightLeg1 = root.getChild("right_leg_1"); + this.rightLeg2 = root.getChild("right_leg_2"); + this.rightLeg3 = root.getChild("right_leg_3"); + + this.leftLeg1 = root.getChild("left_leg_1"); + this.leftLeg2 = root.getChild("left_leg_2"); + this.leftLeg3 = root.getChild("left_leg_3"); + + this.rightAntenna = this.head.getChild("right_antenna"); + this.leftAntenna = this.head.getChild("left_antenna"); + this.rightEye = this.head.getChild("right_eye"); + this.leftEye = this.head.getChild("left_eye"); + + this.tailBottom = root.getChild("tail_bottom"); + this.tailTop = this.tailBottom.getChild("tail_top"); + + this.slimeCenter = this.tailTop.getChild("slime_center"); + this.slime = this.slimeCenter.getChild("slime"); + } + + public static LayerDefinition create() { + MeshDefinition mesh = new MeshDefinition(); + PartDefinition partRoot = mesh.getRoot(); + + var head = partRoot.addOrReplaceChild("head", CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-4.0F, -3.0F, -6.0F, 8.0F, 6.0F, 6.0F), + PartPose.offset(0.0F, 17.0F, -8.0F)); + + head.addOrReplaceChild("right_antenna", CubeListBuilder.create() + .texOffs(38, 4) + .addBox(-12.0F, -0.5F, -0.5F, 12.0F, 1.0F, 1.0F), + PartPose.offsetAndRotation(-0.5F, -1.5F, -5.0F, 0.0F, -0.7853981633974483F, 0.7853981633974483F)); + + head.addOrReplaceChild("left_antenna", CubeListBuilder.create() + .texOffs(38, 6) + .addBox(0.0F, -0.5F, -0.5F, 12.0F, 1.0F, 1.0F), + PartPose.offsetAndRotation(0.5F, -1.5F, -5.0F, 0.0F, 0.7853981633974483F, -0.7853981633974483F)); + + head.addOrReplaceChild("right_eye", CubeListBuilder.create() + .texOffs(0, 12) + .addBox(-2.0F, -1.0F, -2.0F, 3.0F, 3.0F, 3.0F), + PartPose.offset(-2.5F, -1.0F, -4.5F)); + + head.addOrReplaceChild("left_eye", CubeListBuilder.create() + .texOffs(16, 12) + .addBox(-1.0F, -1.0F, -2.0F, 3.0F, 3.0F, 3.0F), + PartPose.offset(2.5F, -1.0F, -4.5F)); + + partRoot.addOrReplaceChild("body", CubeListBuilder.create() + .texOffs(32, 8) + .addBox(-4.0F, 0.0F, -4.0F, 8.0F, 10.0F, 8.0F), + PartPose.offsetAndRotation(0.0F, 17.0F, -8.0F, 1.5707963267948966F, 0.0F, 0.0F)); + + partRoot.addOrReplaceChild("right_leg_1", CubeListBuilder.create() + .texOffs(40, 0) + .addBox(-10.0F, -1.0F, -1.0F, 10.0F, 2.0F, 2.0F), + PartPose.offsetAndRotation(-2.0F, 20.0F, -6.0F, 0.0F, -0.4363323129985824F, -0.4363323129985824F)); + + partRoot.addOrReplaceChild("right_leg_2", CubeListBuilder.create() + .texOffs(40, 0) + .addBox(-10.0F, -1.0F, -1.0F, 10.0F, 2.0F, 2.0F), + PartPose.offsetAndRotation(-2.0F, 20.0F, -4.0F, 0.0F, 0.2181661564992912F, -0.4363323129985824F)); + + partRoot.addOrReplaceChild("right_leg_3", CubeListBuilder.create() + .texOffs(40, 0) + .addBox(-10.0F, -1.0F, -1.0F, 10.0F, 2.0F, 2.0F), + PartPose.offsetAndRotation(-2.0F, 20.0F, -2.0F, 0.0F, 0.7853981633974483F, -0.4363323129985824F)); + + partRoot.addOrReplaceChild("left_leg_1", CubeListBuilder.create().mirror() + .texOffs(40, 0) + .addBox(0.0F, -1.0F, -1.0F, 10.0F, 2.0F, 2.0F), + PartPose.offsetAndRotation(2.0F, 20.0F, -6.0F, 0.0F, 0.4363323129985824F, 0.4363323129985824F)); + + partRoot.addOrReplaceChild("left_leg_2", CubeListBuilder.create().mirror() + .texOffs(40, 0) + .addBox(0.0F, -1.0F, -1.0F, 10.0F, 2.0F, 2.0F), + PartPose.offsetAndRotation(2.0F, 20.0F, -4.0F, 0.0F, -0.2181661564992912F, 0.4363323129985824F)); + + partRoot.addOrReplaceChild("left_leg_3", CubeListBuilder.create().mirror() + .texOffs(40, 0) + .addBox(0.0F, -1.0F, -1.0F, 10.0F, 2.0F, 2.0F), + PartPose.offsetAndRotation(2.0F, 20.0F, -2.0F, 0.0F, -0.7853981633974483F, 0.4363323129985824F)); + + var tailBottom = partRoot.addOrReplaceChild("tail_bottom", CubeListBuilder.create() + .texOffs(0, 34) + .addBox(-3.0F, -3.0F, 0.0F, 6.0F, 6.0F, 6.0F), + PartPose.offset(0.0F, 18.0F, 2.0F)); + + var tailTop = tailBottom.addOrReplaceChild("tail_top", CubeListBuilder.create() + .texOffs(32, 28) + .addBox(-3.0F, -9.0F, -1.0F, 6.0F, 6.0F, 6.0F), + PartPose.offset(0.0F, 0.0F, 3.0F)); + + var center = tailTop.addOrReplaceChild("slime_center", CubeListBuilder.create() + .texOffs(0, 18) + .addBox(-4.0F, -10.0F, -5.0F, 8.0F, 8.0F, 8.0F), + PartPose.offset(0.0F, -9.0F, 2.0F)); + + center.addOrReplaceChild("slime", CubeListBuilder.create() + .texOffs(16, 40) + .addBox(-6.0F, -12.0F, -7.0F, 12.0F, 12.0F, 12.0F), + PartPose.offset(0.0F, 0.0F, 0.0F)); + + return LayerDefinition.create(mesh, 64, 64); + } + + @Override + public ModelPart root() { + return this.root; + } + + @Override + public void renderToBuffer(PoseStack stack, VertexConsumer builder, int light, int overlay, float red, float green, float blue, float alpha) { + slime.visible = false; + root().render(stack, builder, light, overlay, red, green, blue, alpha); + } + + public void renderTail(PoseStack stack, VertexConsumer builder, int light, int overlay, float red, float green, float blue, float alpha) { + this.tailBottom.render(stack, builder, light, overlay, red, green, blue, alpha); + } + + @Override + public void setupAnim(SlimeBeetle entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + this.head.yRot = netHeadYaw / (180F / (float) Math.PI); + this.head.xRot = headPitch / (180F / (float) Math.PI); + + // legs! + float legZ = ((float) Math.PI / 11F); + this.leftLeg1.zRot = legZ; + this.rightLeg1.zRot = -legZ; + this.leftLeg2.zRot = legZ * 0.74F; + this.rightLeg2.zRot = -legZ * 0.74F; + this.leftLeg3.zRot = legZ; + this.rightLeg3.zRot = -legZ; + + float var9 = -0.0F; + float var10 = 0.3926991F; + this.leftLeg1.yRot = var10 * 2.0F + var9; + this.rightLeg1.yRot = -var10 * 2.0F - var9; + this.leftLeg2.yRot = var10 + var9; + this.rightLeg2.yRot = -var10 - var9; + this.leftLeg3.yRot = -var10 * 2.0F + var9; + this.rightLeg3.yRot = var10 * 2.0F - var9; + + float var11 = -(Mth.cos(limbSwing * 0.6662F * 2.0F + 0.0F) * 0.4F) * limbSwingAmount; + float var12 = -(Mth.cos(limbSwing * 0.6662F * 2.0F + (float) Math.PI) * 0.4F) * limbSwingAmount; + float var14 = -(Mth.cos(limbSwing * 0.6662F * 2.0F + ((float) Math.PI * 3F / 2F)) * 0.4F) * limbSwingAmount; + + float var15 = Math.abs(Mth.sin(limbSwing * 0.6662F + 0.0F) * 0.4F) * limbSwingAmount; + float var16 = Math.abs(Mth.sin(limbSwing * 0.6662F + (float) Math.PI) * 0.4F) * limbSwingAmount; + float var18 = Math.abs(Mth.sin(limbSwing * 0.6662F + ((float) Math.PI * 3F / 2F)) * 0.4F) * limbSwingAmount; + + this.leftLeg1.yRot += var11; + this.rightLeg1.yRot += -var11; + this.leftLeg2.yRot += var12; + this.rightLeg2.yRot += -var12; + this.leftLeg3.yRot += var14; + this.rightLeg3.yRot += -var14; + + this.leftLeg1.zRot += var15; + this.rightLeg1.zRot += -var15; + + this.leftLeg2.zRot += var16; + this.rightLeg2.zRot += -var16; + + this.leftLeg3.zRot += var18; + this.rightLeg3.zRot += -var18; + + // tail wiggle + this.tailBottom.xRot = Mth.cos(ageInTicks * 0.3335F) * 0.15F; + this.tailTop.xRot = Mth.cos(ageInTicks * 0.4445F) * 0.20F; + this.slimeCenter.xRot = Mth.cos(ageInTicks * 0.5555F + 0.25F) * 0.25F; + } +} diff --git a/src/main/java/twilightforest/client/model/entity/SnowQueenModel.java b/src/main/java/twilightforest/client/model/entity/SnowQueenModel.java new file mode 100644 index 0000000000..c471f28fa5 --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/SnowQueenModel.java @@ -0,0 +1,115 @@ +package twilightforest.client.model.entity; + +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; +import net.minecraft.util.Mth; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import twilightforest.entity.boss.SnowQueen; + +/** + * ModelSnowQueen - MCVinnyq + * Created using Tabula 8.0.0 + */ +@OnlyIn(Dist.CLIENT) +public class SnowQueenModel extends HumanoidModel { + public SnowQueenModel(ModelPart root) { + super(root); + } + + public static LayerDefinition create() { + MeshDefinition mesh = new MeshDefinition(); + PartDefinition partRoot = mesh.getRoot(); + + partRoot.addOrReplaceChild("body", CubeListBuilder.create() + .texOffs(0, 16) + .addBox(-4.0F, 0.0F, -2.0F, 8.0F, 12.0F, 4.0F) + .texOffs(32, 45) + .addBox(-4.5F, 10.0F, -2.5F, 9.0F, 14.0F, 5.0F), + PartPose.ZERO); + + partRoot.addOrReplaceChild("head", CubeListBuilder.create() + .addBox(-4.0F, -8.0F, -4.0F, 8.0F, 8.0F, 8.0F), + PartPose.ZERO); + + partRoot.addOrReplaceChild("left_arm", CubeListBuilder.create() + .texOffs(14, 32) + .addBox(-1.0F, -2.0F, -2.0F, 3.0F, 12.0F, 4.0F), + PartPose.offset(5.0F, 2.0F, 0.0F)); + + partRoot.addOrReplaceChild("left_leg", CubeListBuilder.create() + .texOffs(16, 48) + .addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F), + PartPose.offset(1.9F, 12.0F, 0.0F)); + + partRoot.addOrReplaceChild("right_leg", CubeListBuilder.create() + .texOffs(0, 48) + .addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F), + PartPose.offset(-1.9F, 12.0F, 0.0F)); + + partRoot.addOrReplaceChild("right_arm", CubeListBuilder.create() + .texOffs(0, 32) + .addBox(-2.0F, -2.0F, -2.0F, 3.0F, 12.0F, 4.0F), + PartPose.offset(-5.0F, 2.0F, 0.0F)); + + var hat = partRoot.addOrReplaceChild("hat", CubeListBuilder.create() + .addBox(0, 0, 0, 0, 0, 0), + PartPose.ZERO); + + hat.addOrReplaceChild("crown_front", CubeListBuilder.create() + .texOffs(24, 0) + .addBox(-5.0F, -4.0F, 0.0F, 10.0F, 4.0F, 0.0F), + PartPose.offsetAndRotation(0.0F, -6.0F, -4.0F, 0.39269908169872414F, 0.0F, 0.0F)); + + hat.addOrReplaceChild("crown_right", CubeListBuilder.create() + .texOffs(24, 4) + .addBox(-5.0F, -4.0F, 0.0F, 10.0F, 4.0F, 0.0F), + PartPose.offsetAndRotation(-4.0F, -6.0F, 0.0F, 0.39269908169872414F, 1.5707963267948966F, 0.0F)); + + hat.addOrReplaceChild("crown_left", CubeListBuilder.create() + .texOffs(44, 4) + .addBox(-5.0F, -4.0F, 0.0F, 10.0F, 4.0F, 0.0F), + PartPose.offsetAndRotation(4.0F, -6.0F, 0.0F, -0.39269908169872414F, 1.5707963267948966F, 0.0F)); + + hat.addOrReplaceChild("crown_back", CubeListBuilder.create() + .texOffs(44, 0) + .addBox(-5.0F, -4.0F, 0.0F, 10.0F, 4.0F, 0.0F), + PartPose.offsetAndRotation(0.0F, -6.0F, 4.0F, -0.39269908169872414F, 0.0F, 0.0F)); + + return LayerDefinition.create(mesh, 64, 64); + } + + @Override + public void setupAnim(SnowQueen entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + super.setupAnim(entity, limbSwing, limbSwingAmount, ageInTicks, netHeadYaw, headPitch); + + // in beam phase, arms forwards + if (entity.getCurrentPhase() == SnowQueen.Phase.BEAM) { + if (entity.isBreathing()) { + float f6 = Mth.sin(this.attackTime * Mth.PI); + float f7 = Mth.sin((1.0F - (1.0F - this.attackTime) * (1.0F - this.attackTime)) * Mth.PI); + this.rightArm.zRot = 0.0F; + this.leftArm.zRot = 0.0F; + this.rightArm.yRot = -(0.1F - f6 * 0.6F); + this.leftArm.yRot = 0.1F - f6 * 0.6F; + this.rightArm.xRot = -Mth.HALF_PI; + this.leftArm.xRot = -Mth.HALF_PI; + this.rightArm.xRot -= f6 * 1.2F - f7 * 0.4F; + this.leftArm.xRot -= f6 * 1.2F - f7 * 0.4F; + this.rightArm.zRot += Mth.cos(ageInTicks * 0.09F) * 0.05F + 0.05F; + this.leftArm.zRot -= Mth.cos(ageInTicks * 0.09F) * 0.05F + 0.05F; + this.rightArm.xRot += Mth.sin(ageInTicks * 0.067F) * 0.05F; + this.leftArm.xRot -= Mth.sin(ageInTicks * 0.067F) * 0.05F; + } else { + // arms up + this.rightArm.xRot += Mth.PI; + this.leftArm.xRot += Mth.PI; + } + } + } +} diff --git a/src/main/java/twilightforest/client/model/entity/SpikeBlockModel.java b/src/main/java/twilightforest/client/model/entity/SpikeBlockModel.java new file mode 100644 index 0000000000..a128903fc3 --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/SpikeBlockModel.java @@ -0,0 +1,182 @@ +package twilightforest.client.model.entity; + +import com.google.common.collect.ImmutableList; +import net.minecraft.client.model.ListModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; +import net.minecraft.util.Mth; +import twilightforest.entity.SpikeBlock; + +public class SpikeBlockModel extends ListModel { + final ModelPart block; + + public SpikeBlockModel(ModelPart root) { + this.block = root.getChild("block"); + } + + public static LayerDefinition create() { + MeshDefinition mesh = new MeshDefinition(); + PartDefinition partRoot = mesh.getRoot(); + + var block = partRoot.addOrReplaceChild("block", CubeListBuilder.create() + .texOffs(32, 32) + .addBox(-4F, -8F, -4F, 8, 8, 8), + PartPose.ZERO); + + // Rotation constants + final float QUARTER_PI = 0.25F * Mth.PI; + final float ANGLE_MINOR = -35F * Mth.DEG_TO_RAD; + final float ANGLE_MAJOR = -55F * Mth.DEG_TO_RAD; + + block.addOrReplaceChild("spikes_0", CubeListBuilder.create() + .texOffs(56, 36) + .addBox(-1F, -1F, -1F, 2, 2, 2), + PartPose.offsetAndRotation(0, -9, 0, 0, 0, 0)); + + block.addOrReplaceChild("spikes_1", CubeListBuilder.create() + .texOffs(56, 36) + .addBox(-1F, -1F, -1F, 2, 2, 2), + PartPose.offsetAndRotation(0, -8, 4, QUARTER_PI, 0, 0)); + + block.addOrReplaceChild("spikes_2", CubeListBuilder.create() + .texOffs(56, 36) + .addBox(-1F, -1F, -1F, 2, 2, 2), + PartPose.offsetAndRotation(4, -8, 4, ANGLE_MAJOR, QUARTER_PI, 0)); + + block.addOrReplaceChild("spikes_3", CubeListBuilder.create() + .texOffs(56, 36) + .addBox(-1F, -1F, -1F, 2, 2, 2), + PartPose.offsetAndRotation(4, -8, 0, 0, 0, QUARTER_PI)); + + block.addOrReplaceChild("spikes_4", CubeListBuilder.create() + .texOffs(56, 36) + .addBox(-1F, -1F, -1F, 2, 2, 2), + PartPose.offsetAndRotation(4, -8, -4, ANGLE_MINOR, -QUARTER_PI, 0)); + + block.addOrReplaceChild("spikes_5", CubeListBuilder.create() + .texOffs(56, 36) + .addBox(-1F, -1F, -1F, 2, 2, 2), + PartPose.offsetAndRotation(0, -8, -4, QUARTER_PI, 0, 0)); + + block.addOrReplaceChild("spikes_6", CubeListBuilder.create() + .texOffs(56, 36) + .addBox(-1F, -1F, -1F, 2, 2, 2), + PartPose.offsetAndRotation(-4, -8, -4, ANGLE_MINOR, QUARTER_PI, 0)); + + block.addOrReplaceChild("spikes_7", CubeListBuilder.create() + .texOffs(56, 36) + .addBox(-1F, -1F, -1F, 2, 2, 2), + PartPose.offsetAndRotation(-4, -8, 0, 0, 0, QUARTER_PI)); + + block.addOrReplaceChild("spikes_8", CubeListBuilder.create() + .texOffs(56, 36) + .addBox(-1F, -1F, -1F, 2, 2, 2), + PartPose.offsetAndRotation(-4, -8, 4, ANGLE_MAJOR, -QUARTER_PI, 0)); + + block.addOrReplaceChild("spikes_9", CubeListBuilder.create() // this spike is not really there + .texOffs(56, 36) + .addBox(-1F, -1F, -1F, 2, 2, 2), + PartPose.offsetAndRotation(0, -4, 0, 0, 0, 0)); + + block.addOrReplaceChild("spikes_10", CubeListBuilder.create() + .texOffs(56, 36) + .addBox(-1F, -1F, -1F, 2, 2, 2), + PartPose.offsetAndRotation(0, -4, 4, 0, 0, 0)); + + block.addOrReplaceChild("spikes_11", CubeListBuilder.create() + .texOffs(56, 36) + .addBox(-1F, -1F, -1F, 2, 2, 2), + PartPose.offsetAndRotation(4, -4, 5, 0, QUARTER_PI, 0)); + + block.addOrReplaceChild("spikes_12", CubeListBuilder.create() + .texOffs(56, 36) + .addBox(-1F, -1F, -1F, 2, 2, 2), + PartPose.offsetAndRotation(5, -4, 0, 0, 0, 0)); + + block.addOrReplaceChild("spikes_13", CubeListBuilder.create() + .texOffs(56, 36) + .addBox(-1F, -1F, -1F, 2, 2, 2), + PartPose.offsetAndRotation(4, -4, -4, 0, QUARTER_PI, 0)); + + block.addOrReplaceChild("spikes_14", CubeListBuilder.create() + .texOffs(56, 36) + .addBox(-1F, -1F, -1F, 2, 2, 2), + PartPose.offsetAndRotation(0, -4, -5, 0, 0, 0)); + + block.addOrReplaceChild("spikes_15", CubeListBuilder.create() + .texOffs(56, 36) + .addBox(-1F, -1F, -1F, 2, 2, 2), + PartPose.offsetAndRotation(-4, -4, -4, 0, QUARTER_PI, 0)); + + block.addOrReplaceChild("spikes_16", CubeListBuilder.create() + .texOffs(56, 36) + .addBox(-1F, -1F, -1F, 2, 2, 2), + PartPose.offsetAndRotation(-5, -4, 0, 0, 0, 0)); + + block.addOrReplaceChild("spikes_17", CubeListBuilder.create() + .texOffs(56, 36) + .addBox(-1F, -1F, -1F, 2, 2, 2), + PartPose.offsetAndRotation(-4, -4, 4, 0, QUARTER_PI, 0)); + + block.addOrReplaceChild("spikes_18", CubeListBuilder.create() + .texOffs(56, 36) + .addBox(-1F, -1F, -1F, 2, 2, 2), + PartPose.offsetAndRotation(0, 1, 0, 0, 0, 0)); + + block.addOrReplaceChild("spikes_19", CubeListBuilder.create() + .texOffs(56, 36) + .addBox(-1F, -1F, -1F, 2, 2, 2), + PartPose.offsetAndRotation(0, 0, 4, QUARTER_PI, 0, 0)); + + block.addOrReplaceChild("spikes_20", CubeListBuilder.create() + .texOffs(56, 36) + .addBox(-1F, -1F, -1F, 2, 2, 2), + PartPose.offsetAndRotation(4, 0, 4, ANGLE_MINOR, QUARTER_PI, 0)); + + block.addOrReplaceChild("spikes_21", CubeListBuilder.create() + .texOffs(56, 36) + .addBox(-1F, -1F, -1F, 2, 2, 2), + PartPose.offsetAndRotation(4, 0, 0, 0, 0, QUARTER_PI)); + + block.addOrReplaceChild("spikes_22", CubeListBuilder.create() + .texOffs(56, 36) + .addBox(-1F, -1F, -1F, 2, 2, 2), + PartPose.offsetAndRotation(4, 0, -4, ANGLE_MAJOR, -QUARTER_PI, 0)); + + block.addOrReplaceChild("spikes_23", CubeListBuilder.create() + .texOffs(56, 36) + .addBox(-1F, -1F, -1F, 2, 2, 2), + PartPose.offsetAndRotation(0, 0, -4, QUARTER_PI, 0, 0)); + + block.addOrReplaceChild("spikes_24", CubeListBuilder.create() + .texOffs(56, 36) + .addBox(-1F, -1F, -1F, 2, 2, 2), + PartPose.offsetAndRotation(-4, 0, -4, ANGLE_MAJOR, QUARTER_PI, 0)); + + block.addOrReplaceChild("spikes_25", CubeListBuilder.create() + .texOffs(56, 36) + .addBox(-1F, -1F, -1F, 2, 2, 2), + PartPose.offsetAndRotation(-4, 0, 0, 0, 0, QUARTER_PI)); + + block.addOrReplaceChild("spikes_26", CubeListBuilder.create() + .texOffs(56, 36) + .addBox(-1F, -1F, -1F, 2, 2, 2), + PartPose.offsetAndRotation(-4, 0, 4, ANGLE_MINOR, -QUARTER_PI, 0)); + + return LayerDefinition.create(mesh, 64, 48); + } + + @Override + public void setupAnim(SpikeBlock entity, float v, float v1, float v2, float v3, float v4) { + + } + + @Override + public Iterable parts() { + return ImmutableList.of(block); + } +} diff --git a/src/main/java/twilightforest/client/model/entity/SquirrelModel.java b/src/main/java/twilightforest/client/model/entity/SquirrelModel.java new file mode 100644 index 0000000000..4411cd2585 --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/SquirrelModel.java @@ -0,0 +1,97 @@ +package twilightforest.client.model.entity; + +import net.minecraft.client.model.QuadrupedModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.*; +import net.minecraft.util.Mth; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import twilightforest.entity.passive.Squirrel; + +/** + * ModelForestSquirrel - MCVinnyq + * Created using Tabula 8.0.0 + */ +@OnlyIn(Dist.CLIENT) +public class SquirrelModel extends QuadrupedModel { + + public final ModelPart tail1; + public ModelPart tail2; + + public SquirrelModel(ModelPart root) { + super(root, false, 4.0F, 4.0F, 2.0F, 2.0F, 24); + + this.tail1 = body.getChild("tail_1"); + this.tail2 = tail1.getChild("tail_2"); + } + + public static LayerDefinition create() { + MeshDefinition mesh = QuadrupedModel.createBodyMesh(1, CubeDeformation.NONE); + PartDefinition partRoot = mesh.getRoot(); + + partRoot.addOrReplaceChild("head", CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-2.0F, -2.0F, -3.0F, 4.0F, 4.0F, 4.0F) + .addBox(-2.0F, -3.0F, -1.0F, 1.0F, 1.0F, 1.0F) + .texOffs(0, 2) + .addBox(1.0F, -3.0F, -1.0F, 1.0F, 1.0F, 1.0F), + PartPose.offset(0.0F, 20.0F, -3.0F)); + + var body = partRoot.addOrReplaceChild("body", CubeListBuilder.create() + .texOffs(0, 8) + .addBox(-2.0F, -3.0F, -3.0F, 4.0F, 3.0F, 5.0F), + PartPose.offset(0.0F, 23.0F, 0.0F)); + + partRoot.addOrReplaceChild("right_front_leg", CubeListBuilder.create() + .texOffs(0, 16) + .addBox(-0.5F, 0.0F, -0.5F, 1.0F, 1.0F, 1.0F), + PartPose.offset(-1.5F, 23.0F, -2.5F)); + + partRoot.addOrReplaceChild("left_front_leg", CubeListBuilder.create() + .texOffs(4, 16) + .addBox(-0.5F, 0.0F, -0.5F, 1.0F, 1.0F, 1.0F), + PartPose.offset(1.5F, 23.0F, -2.5F)); + + partRoot.addOrReplaceChild("right_hind_leg", CubeListBuilder.create() + .texOffs(0, 18) + .addBox(-0.5F, 0.0F, -0.5F, 1.0F, 1.0F, 1.0F), + PartPose.offset(-1.5F, 23.0F, 1.5F)); + + partRoot.addOrReplaceChild("left_hind_leg", CubeListBuilder.create() + .texOffs(4, 18) + .addBox(-0.5F, 0.0F, -0.5F, 1.0F, 1.0F, 1.0F), + PartPose.offset(1.5F, 23.0F, 1.5F)); + + var tail1 = body.addOrReplaceChild("tail_1", CubeListBuilder.create() + .texOffs(18, 0) + .addBox(-1.5F, 0.0F, -1.5F, 3.0F, 4.0F, 3.0F), + PartPose.offsetAndRotation(0.0F, -3.0F, 2.0F, 2.530727415391778F, 0.0F, 0.0F)); + + tail1.addOrReplaceChild("tail_2", CubeListBuilder.create() + .texOffs(13, 11) + .addBox(-1.5F, -1.0F, 0.0F, 3.0F, 3.0F, 5.0F), + PartPose.offset(0.0F, 4.0F, 0.5F)); + + return LayerDefinition.create(mesh, 32, 32); + } + + @Override + public void setupAnim(Squirrel entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + this.head.xRot = headPitch / (180F / (float) Math.PI); + this.head.yRot = netHeadYaw / (180F / (float) Math.PI); + this.leftFrontLeg.xRot = Mth.cos(limbSwing * 0.6662F) * 1.4F * limbSwingAmount; + this.rightFrontLeg.xRot = Mth.cos(limbSwing * 0.6662F + (float) Math.PI) * 1.4F * limbSwingAmount; + this.leftHindLeg.xRot = Mth.cos(limbSwing * 0.6662F + (float) Math.PI) * 1.4F * limbSwingAmount; + this.rightHindLeg.xRot = Mth.cos(limbSwing * 0.6662F) * 1.4F * limbSwingAmount; + + if (limbSwingAmount > 0.2) { + float wiggle = Math.min(limbSwingAmount, 0.6F); + this.tail2.xRot = (Mth.cos(ageInTicks * 0.6662F) - (float) Math.PI / 3) * wiggle; + this.tail1.xRot = 2.5F + Mth.cos(ageInTicks * 0.7774F) * 1.2F * wiggle; + } else { + this.tail2.xRot = 0.2F + Mth.cos(ageInTicks * 0.3335F) * 0.25F; + this.tail1.xRot = 2.5F + Mth.cos(ageInTicks * 0.4445F) * 0.20F; + } + } +} diff --git a/src/main/java/twilightforest/client/model/entity/StableIceCoreModel.java b/src/main/java/twilightforest/client/model/entity/StableIceCoreModel.java new file mode 100644 index 0000000000..72b6337464 --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/StableIceCoreModel.java @@ -0,0 +1,28 @@ +package twilightforest.client.model.entity; + +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.util.Mth; +import twilightforest.entity.monster.StableIceCore; + +public class StableIceCoreModel extends UnstableIceCoreModel { + + public StableIceCoreModel(ModelPart root) { + super(root); + } + + @Override + public void prepareMobModel(StableIceCore entity, float limbSwing, float limbSwingAmount, float partialTicks) { + this.alive = entity.isAlive(); + + for (int i = 0; i < spikes.length; i++) { + // rotate the spikes + this.spikes[i].yRot = (3.14159F / 2F) + (Mth.sin((entity.tickCount + partialTicks) / 5.0F) * 0.5F); + this.spikes[i].xRot = (entity.tickCount + partialTicks) / 5.0F; + this.spikes[i].zRot = Mth.cos(i / 5.0F) / 4.0F; + + this.spikes[i].xRot += i * (Math.PI / 8F); + + this.cubes[i].y = 9.5F + Mth.sin((i + entity.tickCount + partialTicks) / 3F) * 3F; + } + } +} diff --git a/src/main/java/twilightforest/client/model/entity/TFGhastModel.java b/src/main/java/twilightforest/client/model/entity/TFGhastModel.java new file mode 100644 index 0000000000..4537aecccf --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/TFGhastModel.java @@ -0,0 +1,83 @@ +package twilightforest.client.model.entity; + +import net.minecraft.client.model.HierarchicalModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; +import net.minecraft.util.Mth; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import twilightforest.entity.monster.CarminiteGhastguard; + +import java.util.Random; + +@OnlyIn(Dist.CLIENT) +public class TFGhastModel extends HierarchicalModel { + protected final static int tentacleCount = 9; + private final ModelPart root, body; + private final ModelPart[] tentacles = new ModelPart[tentacleCount]; + + public TFGhastModel(ModelPart root) { + this.root = root; + this.body = this.root.getChild("body"); + + for (int i = 0; i < this.tentacles.length; i++) { + this.tentacles[i] = this.body.getChild("tentacle_" + i); + } + } + + public static LayerDefinition create() { + MeshDefinition mesh = new MeshDefinition(); + PartDefinition partRoot = mesh.getRoot(); + + var body = partRoot.addOrReplaceChild("body", CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-8.0F, -8.0F, -8.0F, 16, 16, 16), + PartPose.offset(0, 8, 0)); + + Random rand = new Random(1660L); + + for (int i = 0; i < TFGhastModel.tentacleCount; ++i) { + makeTentacle(body, "tentacle_" + i, rand, i); + } + + return LayerDefinition.create(mesh, 64, 32); + } + + @Override + public ModelPart root() { + return this.root; + } + + private static PartDefinition makeTentacle(PartDefinition parent, String name, Random random, int i) { + final int length = random.nextInt(7) + 8; + + // Please ensure the model is working accurately before we port + float xPoint = ((i % 3 - i / 3 % 2 * 0.5F + 0.25F) / 2.0F * 2.0F - 1.0F) * 5.0F; + float zPoint = (i / 3 / 2.0F * 2.0F - 1.0F) * 5.0F; + + return parent.addOrReplaceChild(name, CubeListBuilder.create() + .addBox(-1.0F, 0.0F, -1.0F, 2, length, 2), + PartPose.offset(xPoint, 7, zPoint)); + } + + /** + * Sets the model's various rotation angles. For bipeds, par1 and par2 are used for animating the movement of arms + * and legs, where par1 represents the time(so that arms and legs swing back and forth) and par2 represents how + * "far" arms and legs can swing at most. + */ + @Override + public void setupAnim(T entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + // wave tentacles + for (int i = 0; i < this.tentacles.length; ++i) { + this.tentacles[i].xRot = 0.2F * Mth.sin(ageInTicks * 0.3F + i) + 0.4F; + } + + // make body face what we're looking at + this.body.xRot = headPitch / (180F / (float) Math.PI); + this.body.yRot = netHeadYaw / (180F / (float) Math.PI); + } +} diff --git a/src/main/java/twilightforest/client/model/entity/TinyBirdModel.java b/src/main/java/twilightforest/client/model/entity/TinyBirdModel.java new file mode 100644 index 0000000000..e38501dc0b --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/TinyBirdModel.java @@ -0,0 +1,141 @@ +package twilightforest.client.model.entity; + +import com.google.common.collect.ImmutableList; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.model.AgeableListModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; +import net.minecraft.util.Mth; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import twilightforest.entity.passive.TinyBird; + +/** + * ModelTinyBird - MCVinnyq + * Created using Tabula 8.0.0 + */ +@OnlyIn(Dist.CLIENT) +public class TinyBirdModel extends AgeableListModel { + public ModelPart head; + public final ModelPart body; + public ModelPart rightFoot; + public ModelPart leftFoot; + public ModelPart rightWing; + public ModelPart leftWing; + public ModelPart tail; + + public TinyBirdModel(ModelPart root) { + this.body = root.getChild("body"); + this.head = root.getChild("head"); + this.rightFoot = root.getChild("right_foot"); + this.leftFoot = root.getChild("left_foot"); + this.rightWing = body.getChild("right_wing"); + this.leftWing = body.getChild("left_wing"); + this.tail = body.getChild("tail"); + } + + public static LayerDefinition create() { + MeshDefinition mesh = new MeshDefinition(); + PartDefinition partRoot = mesh.getRoot(); + + partRoot.addOrReplaceChild("head", CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-1.5F, -2.0F, -2.0F, 3.0F, 3.0F, 3.0F) + .texOffs(9, 0) + .addBox(-0.5F, 0.0F, -3.0F, 1.0F, 1.0F, 1.0F) + .texOffs(0, 6) + .addBox(-1.5F, -5.0F, 1.0F, 3.0F, 3.0F, 0.0F), + PartPose.offset(0.0F, 21.0F, 0.0F)); + + var body = partRoot.addOrReplaceChild("body", CubeListBuilder.create() + .texOffs(12, 0) + .addBox(-1.5F, 0.0F, 0.0F, 3.0F, 3.0F, 3.0F), + PartPose.offset(0.0F, 20.0F, 0.0F)); + + partRoot.addOrReplaceChild("right_foot", CubeListBuilder.create() + .texOffs(0, 9) + .addBox(-0.5F, 0.0F, -1.0F, 1.0F, 1.0F, 1.0F), + PartPose.offset(-1.0F, 23.0F, 2.0F)); + + partRoot.addOrReplaceChild("left_foot", CubeListBuilder.create() + .texOffs(0, 11) + .addBox(-0.5F, 0.0F, -1.0F, 1.0F, 1.0F, 1.0F), + PartPose.offset(1.0F, 23.0F, 2.0F)); + + body.addOrReplaceChild("right_wing", CubeListBuilder.create() + .texOffs(24, 0) + .addBox(-0.5F, 0.0F, -1.0F, 1.0F, 2.0F, 3.0F), + PartPose.offset(-2.0F, 0.0F, 1.0F)); + + body.addOrReplaceChild("left_wing", CubeListBuilder.create() + .texOffs(24, 5) + .addBox(-0.5F, 0.0F, -1.0F, 1.0F, 2.0F, 3.0F), + PartPose.offset(2.0F, 0.0F, 1.0F)); + + body.addOrReplaceChild("tail", CubeListBuilder.create() + .texOffs(1, 6) + .addBox(-2.5F, 0.0F, 0.0F, 5.0F, 0.0F, 5.0F), + PartPose.offsetAndRotation(0.0F, 1.0F, 3.0F, 0.4363323129985824F, 0.0F, 0.0F)); + + return LayerDefinition.create(mesh, 32, 32); + } + + @Override + protected Iterable headParts() { + return ImmutableList.of(this.head); + } + + @Override + protected Iterable bodyParts() { + return ImmutableList.of( + head, + body, + rightFoot, + leftFoot + ); + } + + @Override + public void renderToBuffer(PoseStack stack, VertexConsumer builder, int light, int overlay, float red, float green, float blue, float scale) { + if (young) { + float f = 2.0F; + stack.pushPose(); + stack.translate(0.0F, 5F * scale, 0.75F * scale); + this.headParts().forEach((renderer) -> renderer.render(stack, builder, light, overlay, red, green, blue, scale)); + stack.popPose(); + stack.pushPose(); + stack.scale(1.0F / f, 1.0F / f, 1.0F / f); + stack.translate(0.0F, 24F * scale, 0.0F); + this.bodyParts().forEach((renderer) -> renderer.render(stack, builder, light, overlay, red, green, blue, scale)); + stack.popPose(); + } else { + this.headParts().forEach((renderer) -> renderer.render(stack, builder, light, overlay, red, green, blue, scale)); + this.bodyParts().forEach((renderer) -> renderer.render(stack, builder, light, overlay, red, green, blue, scale)); + } + } + + @Override + public void setupAnim(TinyBird entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + head.xRot = headPitch / (180F / (float) Math.PI); + head.yRot = netHeadYaw / (180F / (float) Math.PI); + + rightFoot.xRot = Mth.cos(limbSwing * 0.6662F) * 1.4F * limbSwingAmount; + leftFoot.xRot = Mth.cos(limbSwing * 0.6662F + (float) Math.PI) * 1.4F * limbSwingAmount; + + rightWing.zRot = ageInTicks; + leftWing.zRot = -ageInTicks; + + if (entity.isBirdLanded()) { + rightFoot.y = 23; + leftFoot.y = 23; + } else { + rightFoot.y = 22.5F; + leftFoot.y = 22.5F; + } + } +} diff --git a/src/main/java/twilightforest/client/model/entity/TrollModel.java b/src/main/java/twilightforest/client/model/entity/TrollModel.java new file mode 100644 index 0000000000..75ba4037e2 --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/TrollModel.java @@ -0,0 +1,109 @@ +package twilightforest.client.model.entity; + +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.*; +import net.minecraft.util.Mth; +import twilightforest.entity.monster.Troll; + +public class TrollModel extends HumanoidModel { + + public TrollModel(ModelPart root) { + super(root); + } + + public static LayerDefinition create() { + MeshDefinition mesh = HumanoidModel.createMesh(CubeDeformation.NONE, 0.0F); + PartDefinition partRoot = mesh.getRoot(); + + partRoot.addOrReplaceChild("head", CubeListBuilder.create() + .texOffs(52, 31) + .addBox(-5.0F, -8.0F, -8.0F, 10.0F, 10.0F, 10.0F) + .texOffs(36, 41) + .addBox(-2.0F, -4.0F, -11.0F, 4.0F, 8.0F, 4.0F), + PartPose.offset(0.0F, -11.0F, -1.0F)); + + partRoot.addOrReplaceChild("hat", CubeListBuilder.create(), + PartPose.ZERO); + + partRoot.addOrReplaceChild("body", CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-8.0F, -37.0F, -6.0F, 16.0F, 26.0F, 15.0F), + PartPose.offset(0.0F, 24.0F, 0.0F)); + + partRoot.addOrReplaceChild("right_arm", CubeListBuilder.create() + .texOffs(0, 41) + .addBox(-6.0F, -1.0F, -4.0F, 6.0F, 25.0F, 8.0F), + PartPose.offset(-8.0F, -9.0F, 0.0F)); + + partRoot.addOrReplaceChild("left_arm", CubeListBuilder.create().mirror() + .texOffs(0, 41) + .addBox(0.0F, -1.0F, -4.0F, 6.0F, 25.0F, 8.0F), + PartPose.offset(8.0F, -9.0F, 0.0F)); + + partRoot.addOrReplaceChild("right_leg", CubeListBuilder.create() + .texOffs(28, 54) + .addBox(-3.0F, -1.0F, -4.0F, 6.0F, 12.0F, 8.0F), + PartPose.offset(-4.0F, 13.0F, 0.0F)); + + partRoot.addOrReplaceChild("left_leg", CubeListBuilder.create().mirror() + .texOffs(28, 54) + .addBox(-3.0F, -1.0F, -4.0F, 6.0F, 12.0F, 8.0F), + PartPose.offset(4.0F, 13.0F, 0.0F)); + + return LayerDefinition.create(mesh, 128, 128); + } + + @Override + public void setupAnim(Troll entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + this.head.yRot = netHeadYaw / (180F / (float) Math.PI); + this.head.xRot = headPitch / (180F / (float) Math.PI); + this.hat.yRot = this.head.yRot; + this.hat.xRot = this.head.xRot; + this.rightArm.xRot = Mth.cos(limbSwing * 0.6662F + (float) Math.PI) * 2.0F * limbSwingAmount * 0.5F; + this.leftArm.xRot = Mth.cos(limbSwing * 0.6662F) * 2.0F * limbSwingAmount * 0.5F; + this.rightArm.zRot = 0.0F; + this.leftArm.zRot = 0.0F; + this.rightLeg.xRot = Mth.cos(limbSwing * 0.6662F) * 1.4F * limbSwingAmount; + this.leftLeg.xRot = Mth.cos(limbSwing * 0.6662F + (float) Math.PI) * 1.4F * limbSwingAmount; + this.rightLeg.yRot = 0.0F; + this.leftLeg.yRot = 0.0F; + + if (entity.isVehicle()) { + // arms up! + this.rightArm.xRot += Math.PI; + this.leftArm.xRot += Math.PI; + } + + if (this.leftArmPose != ArmPose.EMPTY) { + this.rightArm.xRot += Math.PI; + } + if (this.rightArmPose != ArmPose.EMPTY) { + this.leftArm.xRot += Math.PI; + } + + if (this.attackTime > 0F) { + float swing = 1.0F - this.attackTime; + + this.rightArm.xRot -= (Math.PI * swing); + this.leftArm.xRot -= (Math.PI * swing); + } + + this.rightArm.yRot = 0.0F; + this.leftArm.yRot = 0.0F; + + this.rightArm.zRot += Mth.cos(ageInTicks * 0.09F) * 0.05F + 0.05F; + this.leftArm.zRot -= Mth.cos(ageInTicks * 0.09F) * 0.05F + 0.05F; + this.rightArm.xRot += Mth.sin(ageInTicks * 0.067F) * 0.05F; + this.leftArm.xRot -= Mth.sin(ageInTicks * 0.067F) * 0.05F; + } + + @Override + public void prepareMobModel(Troll entity, float limbSwing, float limbSwingAmount, float partialTicks) { + if (entity.getTarget() != null) { + this.rightArm.xRot += Math.PI; + this.leftArm.xRot += Math.PI; + } + } +} diff --git a/src/main/java/twilightforest/client/model/entity/UnstableIceCoreModel.java b/src/main/java/twilightforest/client/model/entity/UnstableIceCoreModel.java new file mode 100644 index 0000000000..ba957041b7 --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/UnstableIceCoreModel.java @@ -0,0 +1,99 @@ +package twilightforest.client.model.entity; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.model.HierarchicalModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.util.Mth; +import twilightforest.entity.monster.BaseIceMob; + +public class UnstableIceCoreModel extends HierarchicalModel { + + public final ModelPart[] spikes = new ModelPart[16]; + public final ModelPart[] cubes = new ModelPart[16]; + + private final ModelPart root; + protected boolean alive; + + public UnstableIceCoreModel(ModelPart root) { + super(RenderType::entityTranslucent); + this.root = root; + + for (int i = 0; i < spikes.length; i++) { + this.spikes[i] = root.getChild("spike_" + i); + } + + for (int i = 0; i < cubes.length; i++) { + this.cubes[i] = spikes[i].getChild("cube_" + i); + } + } + + public static LayerDefinition create() { + MeshDefinition mesh = new MeshDefinition(); + PartDefinition partRoot = mesh.getRoot(); + + partRoot.addOrReplaceChild("head", CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-4.0F, 0.0F, -4.0F, 8.0F, 8.0F, 8.0F), + PartPose.ZERO); + + for (int i = 0; i < 16; i++) { + int spikeLength = i % 2 == 0 ? 6 : 8; + + var spike = partRoot.addOrReplaceChild("spike_" + i, CubeListBuilder.create() + .texOffs(0, 16) + .addBox(-1.0F, 6.0F, -1.0F, 2, spikeLength, 2), + PartPose.offset(0.0F, 4.0F, 0.0F)); + + spike.addOrReplaceChild("cube_" + i, CubeListBuilder.create() + .texOffs(8, 16) + .addBox(-1.5F, -1.5F, -1.5F, 3, 3, 3), + PartPose.offsetAndRotation(0.0F, 8.0F, 0.0F, 0.0F, 0.0F, (Mth.PI / 4F))); + } + + return LayerDefinition.create(mesh, 32, 32); + } + + @Override + public ModelPart root() { + return this.root; + } + + @Override + public void renderToBuffer(PoseStack stack, VertexConsumer builder, int light, int overlay, float red, float green, float blue, float alpha) { + this.root().render(stack, builder, light, overlay, red, green, blue, alive ? 0.6F : alpha); + } + + @Override + public void setupAnim(T t, float v, float v1, float v2, float v3, float v4) { + + } + + @Override + public void prepareMobModel(T entity, float limbSwing, float limbSwingAmount, float partialTicks) { + this.alive = entity.isAlive(); + + for (int i = 0; i < spikes.length; i++) { + // rotate the spikes + this.spikes[i].yRot = (entity.tickCount + partialTicks) / 5.0F; + this.spikes[i].xRot = Mth.sin((entity.tickCount + partialTicks) / 5.0F) / 4.0F; + this.spikes[i].zRot = Mth.cos((entity.tickCount + partialTicks) / 5.0F) / 4.0F; + + this.spikes[i].xRot += i * 5; + this.spikes[i].yRot += i * 2.5f; + this.spikes[i].zRot += i * 3; + + this.spikes[i].x = Mth.cos((entity.tickCount + partialTicks) / i) * 3F; + this.spikes[i].y = 5F + Mth.sin((entity.tickCount + partialTicks) / i) * 3F; + this.spikes[i].z = Mth.sin((entity.tickCount + partialTicks) / i) * 3F; + + this.cubes[i].y = 10 + Mth.sin((i + entity.tickCount + partialTicks) / i) * 3F; + } + } +} diff --git a/src/main/java/twilightforest/client/model/entity/UpperGoblinKnightModel.java b/src/main/java/twilightforest/client/model/entity/UpperGoblinKnightModel.java new file mode 100644 index 0000000000..39e20fcfee --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/UpperGoblinKnightModel.java @@ -0,0 +1,191 @@ +package twilightforest.client.model.entity; + +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.vehicle.Boat; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import twilightforest.entity.monster.UpperGoblinKnight; + +/** + * ModelTFGoblinKnightUpper - MCVinnyq + * Created using Tabula 8.0.0 + */ +@OnlyIn(Dist.CLIENT) +public class UpperGoblinKnightModel extends HumanoidModel { + public final ModelPart breastplate; + public ModelPart spear; + public ModelPart shield; + + public UpperGoblinKnightModel(ModelPart root) { + super(root); + + this.breastplate = this.body.getChild("breastplate"); + this.spear = this.rightArm.getChild("spear"); + this.shield = this.leftArm.getChild("shield"); + } + + public static LayerDefinition create() { + MeshDefinition mesh = new MeshDefinition(); + PartDefinition partRoot = mesh.getRoot(); + + var head = partRoot.addOrReplaceChild("head", CubeListBuilder.create() + .texOffs(28, 0) + .addBox(-8.0F, -14.0F, -1.9F, 16.0F, 14.0F, 2.0F) + .texOffs(116, 0) + .addBox(-6.0F, -12.0F, -0.9F, 4.0F, 2.0F, 2.0F) + .texOffs(116, 4) + .addBox(2.0F, -12.0F, -1.0F, 4.0F, 2.0F, 2.0F), + PartPose.offsetAndRotation(0.0F, 12.0F, 0.0F, 0.0F, -0.7853981633974483F, 0.0F)); + + partRoot.addOrReplaceChild("hat", CubeListBuilder.create(), PartPose.ZERO); + + //turns out, putting this as the hat doesnt allow us to rotate it at a 45 degree angle, so we have to make it its own piece + head.addOrReplaceChild("helm", CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-3.5F, 0.0F, -3.5F, 7.0F, 11.0F, 7.0F), + PartPose.offsetAndRotation(0.0F, -11.0F, 0.0F, 0.0F, 0.7853981633974483F, 0.0F)); + + var body = partRoot.addOrReplaceChild("body", CubeListBuilder.create() + .texOffs(0, 18) + .addBox(-5.5F, 0.0F, -2.0F, 11.0F, 8.0F, 4.0F), + PartPose.offset(0.0F, 12.0F, 0.0F)); + + body.addOrReplaceChild("breastplate", CubeListBuilder.create() + .texOffs(64, 0) + .addBox(-6.5F, 0.0F, -3.0F, 13.0F, 12.0F, 6.0F), + PartPose.offset(0.0F, -0.5F, 0.0F)); + + var rightArm = partRoot.addOrReplaceChild("right_arm", CubeListBuilder.create() + .texOffs(44, 16) + .addBox(-4.0F, -2.0F, -2.0F, 4.0F, 12.0F, 4.0F), + PartPose.offsetAndRotation(-5.5F, 14.0F, 0.0F, -2.3876104699914644F, 0.0F, 0.10000736647217022F)); + + var leftArm = partRoot.addOrReplaceChild("left_arm", CubeListBuilder.create() + .texOffs(44, 32) + .addBox(0.0F, -2.0F, -2.0F, 4.0F, 12.0F, 4.0F), + PartPose.offsetAndRotation(5.5F, 14.0F, 0.0F, 0.20001473294434044F, 0.0F, 0.10000736647217022F)); + + rightArm.addOrReplaceChild("spear", CubeListBuilder.create() + .texOffs(108, 0) + .addBox(-1.0F, -19.0F, -1.0F, 2.0F, 40.0F, 2.0F), + PartPose.offsetAndRotation(-2.0F, 8.5F, 0.0F, 1.5707963267948966F, 0.0F, 0.0F)); + + leftArm.addOrReplaceChild("shield", CubeListBuilder.create() + .texOffs(63, 36) + .addBox(-6.0F, -6.0F, -2.0F, 12.0F, 20.0F, 2.0F), + PartPose.offsetAndRotation(0.0F, 12.0F, 0.0F, 6.083185105107944F, 0.0F, 0.0F)); + + partRoot.addOrReplaceChild("right_leg", CubeListBuilder.create() + .texOffs(30, 24) + .addBox(-1.5F, 0.0F, -2.0F, 3.0F, 4.0F, 4.0F), + PartPose.offset(-4.0F, 20.0F, 0.0F)); + + partRoot.addOrReplaceChild("left_leg", CubeListBuilder.create() + .texOffs(30, 16) + .addBox(-1.5F, 0.0F, -2.0F, 3.0F, 4.0F, 4.0F), + PartPose.offset(4.0F, 20.0F, 0.0F)); + + + return LayerDefinition.create(mesh, 128, 64); + } + + @Override + public void setupAnim(UpperGoblinKnight entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + boolean hasShield = entity.hasShield(); + boolean boat = entity.getVehicle() instanceof Boat; + + this.head.yRot = netHeadYaw / (180F / (float) Math.PI); + this.head.xRot = headPitch / (180F / (float) Math.PI); + this.head.zRot = 0; + this.hat.yRot = this.head.yRot; + this.hat.xRot = this.head.xRot; + this.hat.zRot = this.head.zRot; + + this.rightArm.xRot = Mth.cos(limbSwing * 0.6662F + (float) Math.PI) * 2.0F * limbSwingAmount * 0.5F; + + float leftConstraint = hasShield ? -0.2F : limbSwingAmount; + + if (entity.isShieldDisabled()) { + this.leftArm.zRot = ((float)(Math.cos((double)entity.tickCount * 3.25D) * Math.PI * (double)0.4F) * Mth.DEG_TO_RAD) - 0.4F; + } else { + this.leftArm.zRot = 0.0F; + } + + this.leftArm.xRot = Mth.cos(limbSwing * 0.6662F) * 2.0F * leftConstraint * 0.5F; + this.rightArm.zRot = 0.0F; + + this.rightLeg.xRot = Mth.cos(limbSwing * 0.6662F) * 1.4F * limbSwingAmount; + this.leftLeg.xRot = Mth.cos(limbSwing * 0.6662F + (float) Math.PI) * 1.4F * limbSwingAmount; + this.rightLeg.yRot = 0.0F; + this.leftLeg.yRot = 0.0F; + + if (this.riding && boat) { + this.rightArm.xRot += (-(float)Math.PI / 5F); + this.leftArm.xRot += (-(float)Math.PI / 5F); + this.rightLeg.xRot = -1.4137167F; + this.rightLeg.yRot = ((float)Math.PI / 10F); + this.rightLeg.zRot = 0.07853982F; + this.leftLeg.xRot = -1.4137167F; + this.leftLeg.yRot = (-(float)Math.PI / 10F); + this.leftLeg.zRot = -0.07853982F; + } + + this.rightArm.xRot = this.rightArm.xRot * 0.5F - ((float) Math.PI / 10F); + + this.rightArm.xRot -= (Math.PI * 0.66); + + // during swing move arm forward + if (entity.heavySpearTimer > 0) { + this.rightArm.xRot -= this.getArmRotationDuringSwing(60 - entity.heavySpearTimer) / (180F / (float) Math.PI); + } + + this.rightArm.yRot = 0.0F; + this.leftArm.yRot = 0.0F; + + this.rightArm.zRot += Mth.cos(ageInTicks * 0.09F) * 0.05F + 0.05F; + this.leftArm.zRot -= Mth.cos(ageInTicks * 0.09F) * 0.05F + 0.05F; + this.rightArm.xRot += Mth.sin(ageInTicks * 0.067F) * 0.05F; + this.leftArm.xRot -= Mth.sin(ageInTicks * 0.067F) * 0.05F; + + // fix shield so that it's always perpendicular to the floor + this.shield.xRot = (float) (Math.PI * 2 - this.leftArm.xRot); + + this.breastplate.visible = entity.hasArmor(); + this.shield.visible = entity.hasShield(); + } + + /** + * + */ + private float getArmRotationDuringSwing(float attackTime) { + if (attackTime <= 10) { + // rock back + return attackTime; + } + if (attackTime > 10 && attackTime <= 30) { + // hang back + return 10F; + } + if (attackTime > 30 && attackTime <= 33) { + // slam forward + return (attackTime - 30) * -8F + 10F; + } + if (attackTime > 33 && attackTime <= 50) { + // stay forward + return -15F; + } + if (attackTime > 50 && attackTime <= 60) { + // back to normal + return (10 - (attackTime - 50)) * -1.5F; + } + + return 0; + } +} diff --git a/src/main/java/twilightforest/client/model/entity/UrGhastModel.java b/src/main/java/twilightforest/client/model/entity/UrGhastModel.java new file mode 100644 index 0000000000..9f4d3d83bd --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/UrGhastModel.java @@ -0,0 +1,97 @@ +package twilightforest.client.model.entity; + +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; +import net.minecraft.util.Mth; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import twilightforest.TwilightForestMod; +import twilightforest.entity.boss.UrGhast; + +@OnlyIn(Dist.CLIENT) +public class UrGhastModel extends TFGhastModel { + private final ModelPart[][] tentacles = new ModelPart[tentacleCount][3]; + + public UrGhastModel(ModelPart root) { + super(root); + + ModelPart body = root.getChild("body"); + + for (int i = 0; i < this.tentacles.length; i++) { + this.tentacles[i][0] = body.getChild("tentacle_" + i + ""); + this.tentacles[i][1] = this.tentacles[i][0].getChild("tentacle_" + i + "_extension"); + this.tentacles[i][2] = this.tentacles[i][1].getChild("tentacle_" + i + "_tip"); + } + } + + public static LayerDefinition create() { + MeshDefinition mesh = new MeshDefinition(); + PartDefinition partRoot = mesh.getRoot(); + + var body = partRoot.addOrReplaceChild("body", CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-8.0F, -8.0F, -8.0F, 16, 16, 16), + PartPose.offset(0, 8, 0)); + + for (int i = 0; i < tentacleCount; ++i) makeTentacle(body, "tentacle_" + i, i); + + return LayerDefinition.create(mesh, 64, 32); + } + + private static void makeTentacle(PartDefinition parent, String name, int iteration) { + var tentacleBase = parent.addOrReplaceChild(name, CubeListBuilder.create() + .addBox(-1.5F, 0.0F, -1.5F, 3.333F, 5.333F, 3.333F), + switch (iteration) { + case 0 -> PartPose.offset(4.5F, 7, 4.5F); + case 1 -> PartPose.offset(-4.5F, 7, 4.5F); + case 2 -> PartPose.offset(0F, 7, 0F); + case 3 -> PartPose.offset(5.5F, 7, -4.5F); + case 4 -> PartPose.offset(-5.5F, 7, -4.5F); + case 5 -> PartPose.offsetAndRotation(-7.5F, 3.5F, -1F, 0F, 0F, Mth.PI / 4.0F); + case 6 -> PartPose.offsetAndRotation(-7.5F, -1.5F, 3.5F, 0F, 0F, Mth.PI / 3.0F); + case 7 -> PartPose.offsetAndRotation(7.5F, 3.5F, -1F, 0F, 0F, -Mth.PI / 4.0F); + case 8 -> PartPose.offsetAndRotation(7.5F, -1.5F, 3.5F, 0F, 0F, -Mth.PI / 3.0F); + default -> { + TwilightForestMod.LOGGER.warn("Out of bounds with Ur-Ghast limb creation: Iteration " + iteration); + yield PartPose.ZERO; + } + }); + + var tentacleExtension = tentacleBase.addOrReplaceChild(name + "_extension", CubeListBuilder.create() + .texOffs(0, 3) + .addBox(-1.5F, -1.35F, -1.5F, 3.333F, 6.66F, 3.333F), + PartPose.offset(0, 6.66F, 0)); + + tentacleExtension.addOrReplaceChild(name + "_tip", CubeListBuilder.create() + .texOffs(0, 9) + .addBox(-1.5F, 1.3F, -1.5F, 3.333F, 4, 3.333F), + PartPose.offset(0, 4, 0)); + + } + + @Override + public void setupAnim(UrGhast entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + super.setupAnim(entity, limbSwing, limbSwingAmount, ageInTicks, netHeadYaw, headPitch); + + // wave tentacles + for (int i = 0; i < this.tentacles.length; ++i) { + float wiggle = Math.min(limbSwingAmount, 0.6F); + + float time = (ageInTicks + (i * 9)) / 2.0F; + + this.tentacles[i][1].xRot = (Mth.cos(time * 0.6662F) - Mth.PI / 3.0F) * wiggle; + this.tentacles[i][2].xRot = Mth.cos(time * 0.7774F) * 1.2F * wiggle; + + this.tentacles[i][1].xRot = 0.1F + Mth.cos(time * 0.3335F) * 0.15F; + this.tentacles[i][2].xRot = 0.1F + Mth.cos(time * 0.4445F) * 0.20F; + + float yTwist = 0.4F; + + this.tentacles[i][0].yRot = yTwist * Mth.sin(time * 0.3F); + } + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/client/model/entity/WraithModel.java b/src/main/java/twilightforest/client/model/entity/WraithModel.java new file mode 100644 index 0000000000..3a39fc0fae --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/WraithModel.java @@ -0,0 +1,74 @@ +package twilightforest.client.model.entity; + +import com.google.common.collect.ImmutableList; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.*; +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.util.Mth; +import twilightforest.entity.monster.Wraith; + +public class WraithModel extends HumanoidModel { + private final ModelPart dress; + + public WraithModel(ModelPart root) { + super(root, RenderType::entityTranslucent); + + this.dress = root.getChild("dress"); + } + + public static LayerDefinition create() { + MeshDefinition mesh = HumanoidModel.createMesh(CubeDeformation.NONE, 0); + PartDefinition partRoot = mesh.getRoot(); + + partRoot.addOrReplaceChild("dress", CubeListBuilder.create() + .texOffs(40, 16) + .addBox(-4F, 12.0F, -2F, 8, 12, 4), + PartPose.ZERO); + + return LayerDefinition.create(mesh, 64, 32); + } + + @Override + protected Iterable headParts() { + return ImmutableList.of(this.head, this.hat); + } + + @Override + protected Iterable bodyParts() { + return ImmutableList.of( + this.body, + this.rightArm, + this.leftArm, + this.dress + ); + } + + @Override + public void renderToBuffer(PoseStack p_102034_, VertexConsumer p_102035_, int p_102036_, int p_102037_, float p_102038_, float p_102039_, float p_102040_, float p_102041_) { + super.renderToBuffer(p_102034_, p_102035_, p_102036_, p_102037_, p_102038_, p_102039_, p_102040_, 0.6F); + } + + @Override + public void setupAnim(Wraith entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + super.setupAnim(entity, limbSwing, limbSwingAmount, ageInTicks, netHeadYaw, headPitch); + + float var8 = Mth.sin(this.attackTime * Mth.PI); + float var9 = Mth.sin((1.0F - (1.0F - this.attackTime) * (1.0F - this.attackTime)) * Mth.PI); + this.rightArm.zRot = 0.0F; + this.leftArm.zRot = 0.0F; + this.rightArm.yRot = -(0.1F - var8 * 0.6F); + this.leftArm.yRot = 0.1F - var8 * 0.6F; + this.rightArm.xRot = -Mth.HALF_PI; + this.leftArm.xRot = -Mth.HALF_PI; + this.rightArm.xRot -= var8 * 1.2F - var9 * 0.4F; + this.leftArm.xRot -= var8 * 1.2F - var9 * 0.4F; + this.rightArm.zRot += Mth.cos(ageInTicks * 0.09F) * 0.05F + 0.05F; + this.leftArm.zRot -= Mth.cos(ageInTicks * 0.09F) * 0.05F + 0.05F; + this.rightArm.xRot += Mth.sin(ageInTicks * 0.067F) * 0.05F; + this.leftArm.xRot -= Mth.sin(ageInTicks * 0.067F) * 0.05F; + } +} diff --git a/src/main/java/twilightforest/client/model/entity/YetiModel.java b/src/main/java/twilightforest/client/model/entity/YetiModel.java new file mode 100644 index 0000000000..1a2d66be9c --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/YetiModel.java @@ -0,0 +1,173 @@ +package twilightforest.client.model.entity; + +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; +import net.minecraft.util.Mth; +import twilightforest.entity.monster.Yeti; + +public class YetiModel extends HumanoidModel { + private final ModelPart leftEye, rightEye, angryLeftEye, angryRightEye; + + public YetiModel(ModelPart root) { + super(root); + + var body = root.getChild("body"); + this.rightEye = body.getChild("right_eye"); + this.leftEye = body.getChild("left_eye"); + this.angryRightEye = body.getChild("angry_right_eye"); + this.angryLeftEye = body.getChild("angry_left_eye"); + } + + public static LayerDefinition create() { + MeshDefinition mesh = new MeshDefinition(); + PartDefinition partRoot = mesh.getRoot(); + + partRoot.addOrReplaceChild("head", CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-4.0F, -8.0F, -4.0F, 0, 0, 0), + PartPose.ZERO); + + partRoot.addOrReplaceChild("hat", CubeListBuilder.create() + .texOffs(32, 0) + .addBox(-4.0F, -8.0F, -4.0F, 0, 0, 0), + PartPose.ZERO); + + var body = partRoot.addOrReplaceChild("body", CubeListBuilder.create() + .texOffs(32, 0) + .addBox(-10.0F, 0.0F, -6.0F, 20, 26, 12), + PartPose.offset(0.0F, -14.0F, 0.0F)); + + body.addOrReplaceChild("mouth", CubeListBuilder.create() + .texOffs(96, 6) + .addBox(-7.0F, -5.0F, -0.5F, 14, 10, 1), + PartPose.offset(0.0F, 12.0F, -6.0F)); + + body.addOrReplaceChild("right_eye", CubeListBuilder.create() + .texOffs(96, 0) + .addBox(-2.5F, -2.5F, -0.5F, 5, 5, 1), + PartPose.offset(-5.5F, 4.5F, -6.0F)); + + body.addOrReplaceChild("left_eye", CubeListBuilder.create() + .texOffs(96, 0) + .addBox(-2.5F, -2.5F, -0.5F, 5, 5, 1), + PartPose.offset(5.5F, 4.5F, -6.0F)); + + body.addOrReplaceChild("angry_right_eye", CubeListBuilder.create() + .texOffs(109, 0) + .addBox(-2.5F, -2.5F, -0.5F, 5, 5, 1), + PartPose.offset(5.5F, 4.5F, -6.0F)); + + body.addOrReplaceChild("angry_left_eye", CubeListBuilder.create() + .texOffs(109, 0) + .addBox(-2.5F, -2.5F, -0.5F, 5, 5, 1), + PartPose.offset(-5.5F, 4.5F, -6.0F)); + + partRoot.addOrReplaceChild("right_arm", CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-5.0F, -2.0F, -3.0F, 6, 16, 6), + PartPose.offset(-11.0F, -4.0F, 0.0F)); + + partRoot.addOrReplaceChild("left_arm", CubeListBuilder.create() + .mirror() + .texOffs(0, 0) + .addBox(-1.0F, -2.0F, -3.0F, 6, 16, 6), + PartPose.offset(11.0F, -4.0F, 0.0F)); + + partRoot.addOrReplaceChild("right_leg", CubeListBuilder.create() + .texOffs(0, 22) + .addBox(-4.0F, 0.0F, -4.0F, 8, 12, 8), + PartPose.offset(-6.0F, 12.0F, 0.0F)); + + partRoot.addOrReplaceChild("left_leg", CubeListBuilder.create() + .mirror() + .texOffs(0, 22) + .addBox(-4.0F, 0.0F, -4.0F, 8, 12, 8), + PartPose.offset(6.0F, 12.0F, 0.0F)); + + return LayerDefinition.create(mesh, 128, 64); + } + + /** + * Sets the model's various rotation angles. For bipeds, limbSwing and limbSwingAmount are used for animating the movement of arms + * and legs, where limbSwing represents the time(so that arms and legs swing back and forth) and limbSwingAmount represents how + * "far" arms and legs can swing at most. + */ + @Override + public void setupAnim(T entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + this.head.yRot = netHeadYaw * Mth.DEG_TO_RAD; + this.head.xRot = headPitch * Mth.DEG_TO_RAD; + this.hat.yRot = this.head.yRot; + this.hat.xRot = this.head.xRot; + this.rightArm.xRot = Mth.cos(limbSwing * 0.6662F + Mth.PI) * 2.0F * limbSwingAmount * 0.5F; + this.leftArm.xRot = Mth.cos(limbSwing * 0.6662F) * 2.0F * limbSwingAmount * 0.5F; + this.rightArm.zRot = 0.0F; + this.leftArm.zRot = 0.0F; + this.rightLeg.xRot = Mth.cos(limbSwing * 0.6662F) * 1.4F * limbSwingAmount; + this.leftLeg.xRot = Mth.cos(limbSwing * 0.6662F + Mth.PI) * 1.4F * limbSwingAmount; + this.rightLeg.yRot = 0.0F; + this.leftLeg.yRot = 0.0F; + + if (entity.isVehicle()) { + // arms up! + this.rightArm.xRot += Mth.PI; + this.leftArm.xRot += Mth.PI; + } + + if (this.leftArmPose != ArmPose.EMPTY) { + this.leftArm.xRot = this.leftArm.xRot * 0.5F - (Mth.PI / 10F); + } + + if (this.rightArmPose != ArmPose.EMPTY) { + this.rightArm.xRot = this.rightArm.xRot * 0.5F - (Mth.PI / 10F); + } + + this.rightArm.yRot = 0.0F; + this.leftArm.yRot = 0.0F; + + this.rightArm.zRot += Mth.cos(ageInTicks * 0.09F) * 0.05F + 0.05F; + this.leftArm.zRot -= Mth.cos(ageInTicks * 0.09F) * 0.05F + 0.05F; + this.rightArm.xRot += Mth.sin(ageInTicks * 0.067F) * 0.05F; + this.leftArm.xRot -= Mth.sin(ageInTicks * 0.067F) * 0.05F; + + // if yeti is angry, hold arms forwards like a zombie + if (entity.isAngry()) { + float f6 = Mth.sin(this.attackTime * Mth.PI); + float f7 = Mth.sin((1.0F - (1.0F - this.attackTime) * (1.0F - this.attackTime)) * Mth.PI); + this.rightArm.zRot = 0.0F; + this.leftArm.zRot = 0.0F; + this.rightArm.yRot = -(0.1F - f6 * 0.6F); + this.leftArm.yRot = 0.1F - f6 * 0.6F; + this.rightArm.xRot = -(Mth.HALF_PI); + this.leftArm.xRot = -(Mth.HALF_PI); + this.rightArm.xRot -= f6 * 1.2F - f7 * 0.4F; + this.leftArm.xRot -= f6 * 1.2F - f7 * 0.4F; + this.rightArm.zRot += Mth.cos(ageInTicks * 0.09F) * 0.05F + 0.05F; + this.leftArm.zRot -= Mth.cos(ageInTicks * 0.09F) * 0.05F + 0.05F; + this.rightArm.xRot += Mth.sin(ageInTicks * 0.067F) * 0.05F; + this.leftArm.xRot -= Mth.sin(ageInTicks * 0.067F) * 0.05F; + } + } + + /** + * Change eye color if yeti is angry + */ + @Override + public void prepareMobModel(T entity, float limbSwing, float limbSwingAmount, float partialTicks) { + if (entity.isAngry()) { + this.rightEye.visible = false; + this.leftEye.visible = false; + this.angryRightEye.visible = true; + this.angryLeftEye.visible = true; + } else { + this.rightEye.visible = true; + this.leftEye.visible = true; + this.angryRightEye.visible = false; + this.angryLeftEye.visible = false; + } + } +} diff --git a/src/main/java/twilightforest/client/model/entity/legacy/BighornLegacyModel.java b/src/main/java/twilightforest/client/model/entity/legacy/BighornLegacyModel.java new file mode 100644 index 0000000000..90a42b418a --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/legacy/BighornLegacyModel.java @@ -0,0 +1,85 @@ +package twilightforest.client.model.entity.legacy; + +import net.minecraft.client.model.SheepModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.*; +import twilightforest.entity.passive.Bighorn; + +public class BighornLegacyModel extends SheepModel { + + public BighornLegacyModel(ModelPart root) { + super(root); + } + + public static LayerDefinition create() { + MeshDefinition mesh = SheepModel.createBodyMesh(0, CubeDeformation.NONE); + PartDefinition partRoot = mesh.getRoot(); + + var head = partRoot.addOrReplaceChild("head", CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-3.0F, -4.0F, -6.0F, 6.0F, 6.0F, 7.0F), + PartPose.offset(0.0F, 6.0F, -8.0F)); + + //register horns as separate parts, prevents a crash with the legacy pack + head.addOrReplaceChild("left_horn", CubeListBuilder.create() + .texOffs(28, 16) + .addBox(-5.0F, -4.0F, -4.0F, 2.0F, 2.0F, 2.0F) + .texOffs(16, 13) + .addBox(-6.0F, -5.0F, -3.0F, 2.0F, 2.0F, 4.0F) + .texOffs(16, 19) + .addBox(-7.0F, -4.0F, 0.0F, 2.0F, 5.0F, 2.0F) + .texOffs(18, 27) + .addBox(-8.0F, 0.0F, -2.0F, 2.0F, 2.0F, 3.0F) + .texOffs(28, 27) + .addBox(-9.0F, -1.0F, -3.0F, 2.0F, 2.0F, 1.0F), + PartPose.ZERO); + + head.addOrReplaceChild("right_horn", CubeListBuilder.create() + .texOffs(28, 16) + .addBox(3.0F, -4.0F, -4.0F, 2.0F, 2.0F, 2.0F) + .texOffs(16, 13) + .addBox(4.0F, -5.0F, -3.0F, 2.0F, 2.0F, 4.0F) + .texOffs(16, 19) + .addBox(5.0F, -4.0F, 0.0F, 2.0F, 5.0F, 2.0F) + .texOffs(18, 27) + .addBox(6.0F, 0.0F, -2.0F, 2.0F, 2.0F, 3.0F) + .texOffs(28, 27) + .addBox(7.0F, -1.0F, -3.0F, 2.0F, 2.0F, 1.0F), + PartPose.ZERO); + + partRoot.addOrReplaceChild("body", CubeListBuilder.create() + .texOffs(36, 10) + .addBox(-4.0F, -9.0F, -7.0F, 8.0F, 15.0F, 6.0F), + PartPose.offsetAndRotation(0.0F, 5.0F, 2.0F, 1.5707963267948966F, 0.0F, 0.0F)); + + partRoot.addOrReplaceChild("left_front_leg", CubeListBuilder.create() + .texOffs(0, 16) + .addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F), + PartPose.offset(-3.0F, 12.0F, 7.0F)); + + partRoot.addOrReplaceChild("right_front_leg", CubeListBuilder.create() + .texOffs(0, 16) + .addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F), + PartPose.offset(3.0F, 12.0F, 7.0F)); + + partRoot.addOrReplaceChild("left_hind_leg", CubeListBuilder.create() + .texOffs(0, 16) + .addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F), + PartPose.offset(-3.0F, 12.0F, -5.0F)); + + partRoot.addOrReplaceChild("right_hind_leg", CubeListBuilder.create() + .texOffs(0, 16) + .addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F), + PartPose.offset(3.0F, 12.0F, -5.0F)); + + return LayerDefinition.create(mesh, 64, 32); + } + + @Override + public void setupAnim(T entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + this.head.getChild("left_horn").visible = !entity.isBaby(); + this.head.getChild("right_horn").visible = !entity.isBaby(); + super.setupAnim(entity, limbSwing, limbSwingAmount, ageInTicks, netHeadYaw, headPitch); + } +} diff --git a/src/main/java/twilightforest/client/model/entity/legacy/BlockChainGoblinLegacyModel.java b/src/main/java/twilightforest/client/model/entity/legacy/BlockChainGoblinLegacyModel.java new file mode 100644 index 0000000000..c122146365 --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/legacy/BlockChainGoblinLegacyModel.java @@ -0,0 +1,232 @@ +package twilightforest.client.model.entity.legacy; + +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.*; +import net.minecraft.util.Mth; +import twilightforest.entity.monster.BlockChainGoblin; + +public class BlockChainGoblinLegacyModel extends HumanoidModel { + + final ModelPart block; + + public BlockChainGoblinLegacyModel(ModelPart root) { + super(root); + this.block = root.getChild("block"); + } + + public static LayerDefinition create() { + MeshDefinition mesh = HumanoidModel.createMesh(CubeDeformation.NONE, 0); + PartDefinition partRoot = mesh.getRoot(); + + partRoot.addOrReplaceChild("head", CubeListBuilder.create(), + PartPose.ZERO); + + var hat = partRoot.addOrReplaceChild("hat", CubeListBuilder.create(), + PartPose.ZERO); + + hat.addOrReplaceChild("helmet", CubeListBuilder.create() + .texOffs(24, 0) + .addBox(-2.5F, -9.0F, -2.5F, 5.0F, 9.0F, 5.0F), + PartPose.offsetAndRotation(0.0F, 0.0F, 0.0F, 0.0F, 45F / (180F / Mth.PI), 0.0F)); + + partRoot.addOrReplaceChild("body", CubeListBuilder.create() + .texOffs(0, 21) + .addBox(-3.5F, 0.0F, -2.0F, 7.0F, 7.0F, 4.0F), + PartPose.offset(0.0F, 11.0F, 0.0F)); + + partRoot.addOrReplaceChild("right_arm", CubeListBuilder.create() + .texOffs(52, 0) + .addBox(-3.0F, -1.0F, -2.0F, 3.0F, 12.0F, 3.0F), + PartPose.offset(-3.5F, 12.0F, 0.0F)); + + partRoot.addOrReplaceChild("left_arm", CubeListBuilder.create() + .texOffs(52, 0) + .addBox(0.0F, -1.0F, -1.5F, 3.0F, 12.0F, 3.0F), + PartPose.offset(3.5F, 12.0F, 0.0F)); + + partRoot.addOrReplaceChild("right_leg", CubeListBuilder.create() + .texOffs(0, 12) + .addBox(-1.5F, 0.0F, -1.5F, 3.0F, 6.0F, 3.0F), + PartPose.offset(-2.0F, 18.0F, 0.0F)); + + partRoot.addOrReplaceChild("left_leg", CubeListBuilder.create() + .texOffs(0, 12) + .addBox(-1.5F, 0.0F, -1.5F, 3.0F, 6.0F, 3.0F), + PartPose.offset(2.0F, 18.0F, 0.0F)); + + var block = partRoot.addOrReplaceChild("block", CubeListBuilder.create() + .texOffs(32, 32) + .addBox(-4.0F, -8.0F, -4.0F, 8.0F, 8.0F, 8.0F), + PartPose.ZERO); + + // Rotation constants + final float QUARTER_PI = 0.25F * Mth.PI; + final float ANGLE_MINOR = -35F * Mth.DEG_TO_RAD; + final float ANGLE_MAJOR = -55F * Mth.DEG_TO_RAD; + + block.addOrReplaceChild("spikes_0", CubeListBuilder.create() + .texOffs(56, 36) + .addBox(-1.0F, -1.0F, -1.0F, 2.0F, 2.0F, 2.0F), + PartPose.offsetAndRotation(0, -9, 0, 0, 0, 0)); + + block.addOrReplaceChild("spikes_1", CubeListBuilder.create() + .texOffs(56, 36) + .addBox(-1.0F, -1.0F, -1.0F, 2.0F, 2.0F, 2.0F), + PartPose.offsetAndRotation(0, -8, 4, QUARTER_PI, 0, 0)); + + block.addOrReplaceChild("spikes_2", CubeListBuilder.create() + .texOffs(56, 36) + .addBox(-1.0F, -1.0F, -1.0F, 2.0F, 2.0F, 2.0F), + PartPose.offsetAndRotation(4, -8, 4, ANGLE_MAJOR, QUARTER_PI, 0)); + + block.addOrReplaceChild("spikes_3", CubeListBuilder.create() + .texOffs(56, 36) + .addBox(-1.0F, -1.0F, -1.0F, 2.0F, 2.0F, 2.0F), + PartPose.offsetAndRotation(4, -8, 0, 0, 0, QUARTER_PI)); + + block.addOrReplaceChild("spikes_4", CubeListBuilder.create() + .texOffs(56, 36) + .addBox(-1.0F, -1.0F, -1.0F, 2.0F, 2.0F, 2.0F), + PartPose.offsetAndRotation(4, -8, -4, ANGLE_MINOR, -QUARTER_PI, 0)); + + block.addOrReplaceChild("spikes_5", CubeListBuilder.create() + .texOffs(56, 36) + .addBox(-1.0F, -1.0F, -1.0F, 2.0F, 2.0F, 2.0F), + PartPose.offsetAndRotation(0, -8, -4, QUARTER_PI, 0, 0)); + + block.addOrReplaceChild("spikes_6", CubeListBuilder.create() + .texOffs(56, 36) + .addBox(-1.0F, -1.0F, -1.0F, 2.0F, 2.0F, 2.0F), + PartPose.offsetAndRotation(-4, -8, -4, ANGLE_MINOR, QUARTER_PI, 0)); + + block.addOrReplaceChild("spikes_7", CubeListBuilder.create() + .texOffs(56, 36) + .addBox(-1.0F, -1.0F, -1.0F, 2.0F, 2.0F, 2.0F), + PartPose.offsetAndRotation(-4, -8, 0, 0, 0, QUARTER_PI)); + + block.addOrReplaceChild("spikes_8", CubeListBuilder.create() + .texOffs(56, 36) + .addBox(-1.0F, -1.0F, -1.0F, 2.0F, 2.0F, 2.0F), + PartPose.offsetAndRotation(-4, -8, 4, ANGLE_MAJOR, -QUARTER_PI, 0)); + + block.addOrReplaceChild("spikes_9", CubeListBuilder.create() // this spike is not really there + .texOffs(56, 36) + .addBox(-1.0F, -1.0F, -1.0F, 2.0F, 2.0F, 2.0F), + PartPose.offsetAndRotation(0, -4, 0, 0, 0, 0)); + + block.addOrReplaceChild("spikes_10", CubeListBuilder.create() + .texOffs(56, 36) + .addBox(-1.0F, -1.0F, -1.0F, 2.0F, 2.0F, 2.0F), + PartPose.offsetAndRotation(0, -4, 4, 0, 0, 0)); + + block.addOrReplaceChild("spikes_11", CubeListBuilder.create() + .texOffs(56, 36) + .addBox(-1.0F, -1.0F, -1.0F, 2.0F, 2.0F, 2.0F), + PartPose.offsetAndRotation(4, -4, 5, 0, QUARTER_PI, 0)); + + block.addOrReplaceChild("spikes_12", CubeListBuilder.create() + .texOffs(56, 36) + .addBox(-1.0F, -1.0F, -1.0F, 2.0F, 2.0F, 2.0F), + PartPose.offsetAndRotation(5, -4, 0, 0, 0, 0)); + + block.addOrReplaceChild("spikes_13", CubeListBuilder.create() + .texOffs(56, 36) + .addBox(-1.0F, -1.0F, -1.0F, 2.0F, 2.0F, 2.0F), + PartPose.offsetAndRotation(4, -4, -4, 0, QUARTER_PI, 0)); + + block.addOrReplaceChild("spikes_14", CubeListBuilder.create() + .texOffs(56, 36) + .addBox(-1.0F, -1.0F, -1.0F, 2.0F, 2.0F, 2.0F), + PartPose.offsetAndRotation(0, -4, -5, 0, 0, 0)); + + block.addOrReplaceChild("spikes_15", CubeListBuilder.create() + .texOffs(56, 36) + .addBox(-1.0F, -1.0F, -1.0F, 2.0F, 2.0F, 2.0F), + PartPose.offsetAndRotation(-4, -4, -4, 0, QUARTER_PI, 0)); + + block.addOrReplaceChild("spikes_16", CubeListBuilder.create() + .texOffs(56, 36) + .addBox(-1.0F, -1.0F, -1.0F, 2.0F, 2.0F, 2.0F), + PartPose.offsetAndRotation(-5, -4, 0, 0, 0, 0)); + + block.addOrReplaceChild("spikes_17", CubeListBuilder.create() + .texOffs(56, 36) + .addBox(-1.0F, -1.0F, -1.0F, 2.0F, 2.0F, 2.0F), + PartPose.offsetAndRotation(-4, -4, 4, 0, QUARTER_PI, 0)); + + block.addOrReplaceChild("spikes_18", CubeListBuilder.create() + .texOffs(56, 36) + .addBox(-1.0F, -1.0F, -1.0F, 2.0F, 2.0F, 2.0F), + PartPose.offsetAndRotation(0, 1, 0, 0, 0, 0)); + + block.addOrReplaceChild("spikes_19", CubeListBuilder.create() + .texOffs(56, 36) + .addBox(-1.0F, -1.0F, -1.0F, 2.0F, 2.0F, 2.0F), + PartPose.offsetAndRotation(0, 0, 4, QUARTER_PI, 0, 0)); + + block.addOrReplaceChild("spikes_20", CubeListBuilder.create() + .texOffs(56, 36) + .addBox(-1.0F, -1.0F, -1.0F, 2.0F, 2.0F, 2.0F), + PartPose.offsetAndRotation(4, 0, 4, ANGLE_MINOR, QUARTER_PI, 0)); + + block.addOrReplaceChild("spikes_21", CubeListBuilder.create() + .texOffs(56, 36) + .addBox(-1.0F, -1.0F, -1.0F, 2.0F, 2.0F, 2.0F), + PartPose.offsetAndRotation(4, 0, 0, 0, 0, QUARTER_PI)); + + block.addOrReplaceChild("spikes_22", CubeListBuilder.create() + .texOffs(56, 36) + .addBox(-1.0F, -1.0F, -1.0F, 2.0F, 2.0F, 2.0F), + PartPose.offsetAndRotation(4, 0, -4, ANGLE_MAJOR, -QUARTER_PI, 0)); + + block.addOrReplaceChild("spikes_23", CubeListBuilder.create() + .texOffs(56, 36) + .addBox(-1.0F, -1.0F, -1.0F, 2.0F, 2.0F, 2.0F), + PartPose.offsetAndRotation(4, 0, -4, QUARTER_PI, 0, 0)); + + block.addOrReplaceChild("spikes_24", CubeListBuilder.create() + .texOffs(56, 36) + .addBox(-1.0F, -1.0F, -1.0F, 2.0F, 2.0F, 2.0F), + PartPose.offsetAndRotation(-4, 0, -4, ANGLE_MAJOR, QUARTER_PI, 0)); + + block.addOrReplaceChild("spikes_25", CubeListBuilder.create() + .texOffs(56, 36) + .addBox(-1.0F, -1.0F, -1.0F, 2.0F, 2.0F, 2.0F), + PartPose.offsetAndRotation(-4, 0, 0, 0, 0, QUARTER_PI)); + + block.addOrReplaceChild("spikes_26", CubeListBuilder.create() + .texOffs(56, 36) + .addBox(-1.0F, -1.0F, -1.0F, 2.0F, 2.0F, 2.0F), + PartPose.offsetAndRotation(-4, 0, 4, ANGLE_MINOR, -QUARTER_PI, 0)); + + return LayerDefinition.create(mesh, 64, 32); + } + + @Override + public void setupAnim(T entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + super.setupAnim(entity, limbSwing, limbSwingAmount, ageInTicks, netHeadYaw, headPitch); + + head.y = 11.0F; + hat.y = 11.0F; + body.y = 11F; + + rightLeg.y = 18F; + leftLeg.y = 18F; + + rightArm.setPos(-3.5F, 12F, 0F); + rightArm.xRot += Math.PI; + + leftArm.setPos(3.5F, 12F, 0F); + leftArm.xRot += Math.PI; + + float angle = ageInTicks / 4F; + float length = 0;//16F; + + block.x = (float) Math.sin(angle) * length; + block.z = (float) -Math.cos(angle) * length; + + block.yRot = -angle; + } +} diff --git a/src/main/java/twilightforest/client/model/entity/legacy/BoarLegacyModel.java b/src/main/java/twilightforest/client/model/entity/legacy/BoarLegacyModel.java new file mode 100644 index 0000000000..f5e3c74532 --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/legacy/BoarLegacyModel.java @@ -0,0 +1,57 @@ +package twilightforest.client.model.entity.legacy; + +import net.minecraft.client.model.PigModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.*; +import twilightforest.entity.passive.Boar; + +public class BoarLegacyModel extends PigModel { + + public BoarLegacyModel(ModelPart root) { + super(root); + } + + public static LayerDefinition create() { + MeshDefinition mesh = PigModel.createBodyMesh(0, CubeDeformation.NONE); + PartDefinition partRoot = mesh.getRoot(); + + partRoot.addOrReplaceChild("head", CubeListBuilder.create() + .texOffs(0,0) + .addBox(-4.0F, -2.0F, -6.0F, 8.0F, 7.0F, 6.0F) + .texOffs(28, 0) + .addBox(-3.0F, 1.0F, -9.0F, 6.0F, 4.0F, 3.0F) + .texOffs(17, 17) + .addBox(3.0F, 2.0F, -9.0F, 1.0F, 2.0F, 1.0F) + .texOffs(17, 17) + .addBox(-4.0F, 2.0F, -9.0F, 1.0F, 2.0F, 1.0F), + PartPose.offset(0.0F, 12.0F, -6.0F)); + + partRoot.addOrReplaceChild("body", CubeListBuilder.create() + .texOffs(28, 10) + .addBox(-5.0F, -8.0F, -7.0F, 10.0F, 14.0F, 8.0F), + PartPose.offsetAndRotation(0.0F, 11.0F, 2.0F, 1.5707963267948966F, 0.0F, 0.0F)); + + partRoot.addOrReplaceChild("right_front_leg", CubeListBuilder.create() + .texOffs(0, 16) + .addBox(-2.0F, 0.0F, -2.0F, 4.0F, 6.0F, 4.0F), + PartPose.offset(-3.0F, 18.0F, 7.0F)); + + partRoot.addOrReplaceChild("left_front_leg", CubeListBuilder.create() + .texOffs(0, 16) + .addBox(-2.0F, 0.0F, -2.0F, 4.0F, 6.0F, 4.0F), + PartPose.offset(3.0F, 18.0F, 7.0F)); + + partRoot.addOrReplaceChild("right_hind_leg", CubeListBuilder.create() + .texOffs(0, 16) + .addBox(-2.0F, 0.0F, -2.0F, 4.0F, 6.0F, 4.0F), + PartPose.offset(-3.0F, 18.0F, -5.0F)); + + partRoot.addOrReplaceChild("left_hind_leg", CubeListBuilder.create() + .texOffs(0, 16) + .addBox(-2.0F, 0.0F, -2.0F, 4.0F, 6.0F, 4.0F), + PartPose.offset(3.0F, 18.0F, -5.0F)); + + return LayerDefinition.create(mesh, 64, 32); + } +} diff --git a/src/main/java/twilightforest/client/model/entity/legacy/DeerLegacyModel.java b/src/main/java/twilightforest/client/model/entity/legacy/DeerLegacyModel.java new file mode 100644 index 0000000000..ea75d9c71f --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/legacy/DeerLegacyModel.java @@ -0,0 +1,104 @@ +package twilightforest.client.model.entity.legacy; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.model.QuadrupedModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.*; +import twilightforest.entity.passive.Deer; + +public class DeerLegacyModel extends QuadrupedModel { + + public DeerLegacyModel(ModelPart root) { + super(root, false, 4.0F, 4.0F, 2.0F, 2.0F, 10); + } + + public static LayerDefinition create() { + MeshDefinition mesh = QuadrupedModel.createBodyMesh(0, CubeDeformation.NONE); + PartDefinition partRoot = mesh.getRoot(); + + partRoot.addOrReplaceChild("head", CubeListBuilder.create() + .texOffs(0, 5) + .addBox(-2.0F, -8.0F, -6.0F, 4.0F, 6.0F, 6.0F) + .texOffs(52, 0) + .addBox(-1.5F, -5.0F, -9.0F, 3.0F, 3.0F, 3.0F) + .texOffs(20, 0) + .addBox(-3.0F, -10.0F, -2.0F, 2.0F, 2.0F, 2.0F) + .addBox(-3.0F, -10.0F, -2.0F, 2.0F, 2.0F, 2.0F) + .addBox(-4.0F, -10.0F, -1.0F, 1.0F, 1.0F, 3.0F) + .addBox(-5.0F, -11.0F, 1.0F, 1.0F, 1.0F, 5.0F) + .addBox(-5.0F, -14.0F, 2.0F, 1.0F, 4.0F, 1.0F) + .addBox(-6.0F, -17.0F, 3.0F, 1.0F, 4.0F, 1.0F) + .addBox(-6.0F, -13.0F, 0.0F, 1.0F, 1.0F, 3.0F) + .addBox(-6.0F, -14.0F, -3.0F, 1.0F, 1.0F, 4.0F) + .addBox(-7.0F, -15.0F, -6.0F, 1.0F, 1.0F, 4.0F) + .addBox(-6.0F, -16.0F, -9.0F, 1.0F, 1.0F, 4.0F) + .addBox(-7.0F, -18.0F, -1.0F, 1.0F, 5.0F, 1.0F) + .addBox(-6.0F, -19.0F, -6.0F, 1.0F, 5.0F, 1.0F) + .addBox(1.0F, -10.0F, -2.0F, 2.0F, 2.0F, 2.0F) + .addBox(3.0F, -10.0F, -1.0F, 1.0F, 1.0F, 3.0F) + .addBox(4.0F, -11.0F, 1.0F, 1.0F, 1.0F, 5.0F) + .addBox(4.0F, -14.0F, 2.0F, 1.0F, 4.0F, 1.0F) + .addBox(5.0F, -17.0F, 3.0F, 1.0F, 4.0F, 1.0F) + .addBox(5.0F, -13.0F, 0.0F, 1.0F, 1.0F, 3.0F) + .addBox(5.0F, -14.0F, -3.0F, 1.0F, 1.0F, 4.0F) + .addBox(6.0F, -15.0F, -6.0F, 1.0F, 1.0F, 4.0F) + .addBox(5.0F, -16.0F, -9.0F, 1.0F, 1.0F, 4.0F) + .addBox(6.0F, -18.0F, -1.0F, 1.0F, 5.0F, 1.0F) + .addBox(5.0F, -19.0F, -6.0F, 1.0F, 5.0F, 1.0F), + PartPose.offset(0.0F, 4.0F, -7.0F)); + + var body = partRoot.addOrReplaceChild("body", CubeListBuilder.create() + .texOffs(36, 6) + .addBox(-4F, -10F, -7F, 6, 18, 8), + PartPose.offsetAndRotation(1F, 5F, 2F, 1.570796F, 0.0F, 0.0F)); + + body.addOrReplaceChild("neck", CubeListBuilder.create() + .texOffs(10, 19) + .addBox(-2.5F, -8, -11F, 3, 9, 4), + PartPose.offsetAndRotation(0.0F, 0.0F, 0.0F, 4.974188f, 0.0F, 0.0F)); + + partRoot.addOrReplaceChild("right_front_leg", CubeListBuilder.create() + .texOffs(0, 17) + .addBox(-3F, 0F, -2F, 2, 12, 3), + PartPose.offset(0F, 12F, 9F)); + + partRoot.addOrReplaceChild("left_front_leg", CubeListBuilder.create() + .texOffs(0, 17) + .addBox(-1F, 0F, -2F, 2, 12, 3), + PartPose.offset(2F, 12F, 9F)); + + partRoot.addOrReplaceChild("right_hind_leg", CubeListBuilder.create() + .texOffs(0, 17) + .addBox(-3F, 0F, -2F, 2, 12, 3), + PartPose.offset(0F, 12F, -5F)); + + partRoot.addOrReplaceChild("left_hind_leg", CubeListBuilder.create() + .texOffs(0, 17) + .addBox(-1F, 0F, -2F, 2, 12, 3), + PartPose.offset(2F, 12F, -5F)); + + return LayerDefinition.create(mesh, 64, 32); + } + + @Override + public void renderToBuffer(PoseStack stack, VertexConsumer builder, int light, int overlay, float red, float green, float blue, float scale) { + if (young) { + stack.pushPose(); + stack.scale(0.75F, 0.75F, 0.75F); + stack.translate(0F, 0.95F, 0.15F); + this.headParts().forEach((modelRenderer) -> modelRenderer.render(stack, builder, light, overlay, red, green, blue, scale)); + stack.popPose(); + + stack.pushPose(); + stack.scale(0.5F, 0.5F, 0.5F); + stack.translate(0F, 1.5F, 0.0F); + this.bodyParts().forEach((modelRenderer) -> modelRenderer.render(stack, builder, light, overlay, red, green, blue, scale)); + stack.popPose(); + } else { + this.headParts().forEach((renderer) -> renderer.render(stack, builder, light, overlay, red, green, blue, scale)); + this.bodyParts().forEach((renderer) -> renderer.render(stack, builder, light, overlay, red, green, blue, scale)); + } + } +} diff --git a/src/main/java/twilightforest/client/model/entity/legacy/FireBeetleLegacyModel.java b/src/main/java/twilightforest/client/model/entity/legacy/FireBeetleLegacyModel.java new file mode 100644 index 0000000000..a20ec36552 --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/legacy/FireBeetleLegacyModel.java @@ -0,0 +1,194 @@ +// Date: 11/5/2012 7:35:56 PM +// Template version 1.1 +// Java generated by Techne +// Keep in mind that you still need to fill in some blanks +// - ZeuX +package twilightforest.client.model.entity.legacy; + +import net.minecraft.client.model.HierarchicalModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; +import net.minecraft.util.Mth; +import twilightforest.entity.monster.FireBeetle; + +public class FireBeetleLegacyModel extends HierarchicalModel { + final ModelPart root; + final ModelPart head; + ModelPart leg6; + ModelPart leg4; + ModelPart leg2; + ModelPart leg5; + ModelPart leg3; + ModelPart leg1; + + public FireBeetleLegacyModel(ModelPart root) { + this.root = root; + + this.head = root.getChild("head"); + + this.leg1 = root.getChild("leg_1"); + this.leg2 = root.getChild("leg_2"); + this.leg3 = root.getChild("leg_3"); + this.leg4 = root.getChild("leg_4"); + this.leg5 = root.getChild("leg_5"); + this.leg6 = root.getChild("leg_6"); + } + + public static LayerDefinition create() { + MeshDefinition mesh = new MeshDefinition(); + PartDefinition partRoot = mesh.getRoot(); + + var head = partRoot.addOrReplaceChild("head", CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-4F, -4F, -6F, 8, 6, 6), + PartPose.offset(0F, 19F, -5F)); + + head.addOrReplaceChild("right_antenna", CubeListBuilder.create() + .texOffs(42, 4) + .addBox(0F, -0.5F, -0.5F, 10, 1, 1), + PartPose.offsetAndRotation(1F, -3F, -5F, 0F, 1.047198F, -0.296706F)); + + head.addOrReplaceChild("left_antenna", CubeListBuilder.create() + .texOffs(42, 4) + .addBox(0F, -0.5F, -0.5F, 10, 1, 1), + PartPose.offsetAndRotation(-1F, -3F, -5F, 0F, 2.094395F, 0.296706F)); + + head.addOrReplaceChild("right_eye", CubeListBuilder.create() + .texOffs(15, 12) + .addBox(-1.5F, -1.5F, -1.5F, 3, 3, 3), + PartPose.offset(-3F, -2F, -5F)); + + head.addOrReplaceChild("left_eye", CubeListBuilder.create() + .texOffs(15, 12) + .addBox(-1.5F, -1.5F, -1.5F, 3, 3, 3), + PartPose.offset(3F, -2F, -5F)); + + var jaw1a = head.addOrReplaceChild("jaw_1a", CubeListBuilder.create() + .texOffs(0, 0) + .addBox(0F, 0F, -2F, 1, 1, 2), + PartPose.offsetAndRotation(-3F, 0F, -6F, 0.3490659F, 0F, 0F)); + + jaw1a.addOrReplaceChild("jaw_1b", CubeListBuilder.create() + .texOffs(0, 0) + .addBox(0F, 0F, 0F, 1, 1, 2), + PartPose.offsetAndRotation(0F, 0F, -2F, 0F, 1.570796F, 0F)); + + var jaw1b = head.addOrReplaceChild("jaw_2a", CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-1F, 0F, -2F, 1, 1, 2), + PartPose.offsetAndRotation(3F, 0F, -6F, 0.3490659F, 0F, 0F)); + + jaw1b.addOrReplaceChild("jaw_2b", CubeListBuilder.create() + .texOffs(0, 0) + .addBox(0F, 0F, -2F, 1, 1, 2), + PartPose.offsetAndRotation(0F, 0F, -2F, 0.3490659F, 0F, 0F)); + + partRoot.addOrReplaceChild("thorax", CubeListBuilder.create() + .texOffs(0, 22) + .addBox(-4.5F, -4F, 0F, 9, 8, 2), + PartPose.offset(0F, 18F, -4.5F)); + + partRoot.addOrReplaceChild("connector_1", CubeListBuilder.create() + .texOffs(0, 12) + .addBox(-3F, -3F, 0F, 6, 6, 1), + PartPose.offset(0F, 18F, -3F)); + + partRoot.addOrReplaceChild("connector_2", CubeListBuilder.create() + .texOffs(0, 12) + .addBox(-3F, -3F, -1F, 6, 6, 1), + PartPose.offset(0F, 18F, -4F)); + + partRoot.addOrReplaceChild("rear", CubeListBuilder.create() + .texOffs(22, 9) + .addBox(-6F, -9F, -4F, 12, 14, 9), + PartPose.offsetAndRotation(0F, 18F, 7F, 1.570796F, 0F, 0F)); + + partRoot.addOrReplaceChild("leg_1", CubeListBuilder.create().mirror() + .texOffs(40, 0) + .addBox(-9F, -1F, -1F, 10, 2, 2), + PartPose.offsetAndRotation(-4F, 21F, 4F, 0F, 0.6981317F, -0.3490659F)); + + partRoot.addOrReplaceChild("leg_2", CubeListBuilder.create() + .texOffs(40, 0) + .addBox(-1F, -1F, -1F, 10, 2, 2), + PartPose.offsetAndRotation(4F, 21F, 4F, 0F, -0.6981317F, 0.3490659F)); + + partRoot.addOrReplaceChild("leg_3", CubeListBuilder.create().mirror() + .texOffs(40, 0) + .addBox(-9F, -1F, -1F, 10, 2, 2), + PartPose.offsetAndRotation(-4F, 21F, -1F, 0F, 0.2792527F, -0.3490659F)); + + partRoot.addOrReplaceChild("leg_4", CubeListBuilder.create() + .texOffs(40, 0) + .addBox(-1F, -1F, -1F, 10, 2, 2), + PartPose.offsetAndRotation(4F, 21F, -1F, 0F, -0.2792527F, 0.3490659F)); + + partRoot.addOrReplaceChild("leg_5", CubeListBuilder.create().mirror() + .texOffs(40, 0) + .addBox(-9F, -1F, -1F, 10, 2, 2), + PartPose.offsetAndRotation(-4F, 21F, -4F, 0F, -0.2792527F, -0.3490659F)); + + partRoot.addOrReplaceChild("leg_6", CubeListBuilder.create() + .texOffs(40, 0) + .addBox(-1F, -1F, -1F, 10, 2, 2), + PartPose.offsetAndRotation(4F, 21F, -4F, 0F, 0.2792527F, 0.3490659F)); + + return LayerDefinition.create(mesh, 64, 32); + } + + @Override + public ModelPart root() { + return this.root; + } + + @Override + public void setupAnim(FireBeetle entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + this.head.yRot = netHeadYaw / (180F / (float) Math.PI); + this.head.xRot = headPitch / (180F / (float) Math.PI); + + float legZ = ((float) Math.PI / 11F); + this.leg1.zRot = -legZ; + this.leg2.zRot = legZ; + this.leg3.zRot = -legZ * 0.74F; + this.leg4.zRot = legZ * 0.74F; + this.leg5.zRot = -legZ; + this.leg6.zRot = legZ; + + float var9 = -0.0F; + float var10 = 0.3926991F; + this.leg1.yRot = var10 * 2.0F + var9; + this.leg2.yRot = -var10 * 2.0F - var9; + this.leg3.yRot = var10 + var9; + this.leg4.yRot = -var10 - var9; + this.leg5.yRot = -var10 * 2.0F + var9; + this.leg6.yRot = var10 * 2.0F - var9; + + float var11 = -(Mth.cos(limbSwing * 0.6662F * 2.0F + 0.0F) * 0.4F) * limbSwingAmount; + float var12 = -(Mth.cos(limbSwing * 0.6662F * 2.0F + (float) Math.PI) * 0.4F) * limbSwingAmount; + float var14 = -(Mth.cos(limbSwing * 0.6662F * 2.0F + ((float) Math.PI * 3F / 2F)) * 0.4F) * limbSwingAmount; + + float var15 = Math.abs(Mth.sin(limbSwing * 0.6662F + 0.0F) * 0.4F) * limbSwingAmount; + float var16 = Math.abs(Mth.sin(limbSwing * 0.6662F + (float) Math.PI) * 0.4F) * limbSwingAmount; + float var18 = Math.abs(Mth.sin(limbSwing * 0.6662F + ((float) Math.PI * 3F / 2F)) * 0.4F) * limbSwingAmount; + + this.leg1.yRot += var11; + this.leg2.yRot += -var11; + this.leg3.yRot += var12; + this.leg4.yRot += -var12; + this.leg5.yRot += var14; + this.leg6.yRot += -var14; + + this.leg1.zRot += var15; + this.leg2.zRot += -var15; + + this.leg3.zRot += var16; + this.leg4.zRot += -var16; + + this.leg5.zRot += var18; + this.leg6.zRot += -var18; + } +} diff --git a/src/main/java/twilightforest/client/model/entity/legacy/HelmetCrabLegacyModel.java b/src/main/java/twilightforest/client/model/entity/legacy/HelmetCrabLegacyModel.java new file mode 100644 index 0000000000..deb036be17 --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/legacy/HelmetCrabLegacyModel.java @@ -0,0 +1,186 @@ +// Date: 4/14/2013 12:59:03 PM +// Template version 1.1 +// Java generated by Techne +// Keep in mind that you still need to fill in some blanks +// - ZeuX + +package twilightforest.client.model.entity.legacy; + +import net.minecraft.client.model.HierarchicalModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; +import net.minecraft.util.Mth; +import twilightforest.entity.monster.HelmetCrab; + +/** + * Helmet crab model, based partially on some of the spider code + */ +public class HelmetCrabLegacyModel extends HierarchicalModel { + //fields + final ModelPart root; + final ModelPart body; + ModelPart rightArm; + ModelPart leg1, leg2, leg3, leg4, leg5; + + public HelmetCrabLegacyModel(ModelPart root) { + this.root = root; + + this.body = root.getChild("body"); + this.rightArm = root.getChild("right_arm"); + + this.leg1 = root.getChild("leg_1"); + this.leg2 = root.getChild("leg_2"); + this.leg3 = root.getChild("leg_3"); + this.leg4 = root.getChild("leg_4"); + this.leg5 = root.getChild("leg_5"); + } + + public static LayerDefinition create() { + MeshDefinition mesh = new MeshDefinition(); + PartDefinition partRoot = mesh.getRoot(); + + var body = partRoot.addOrReplaceChild("body", CubeListBuilder.create() + .texOffs(32, 4) + .addBox(-2.5F, -2.5F, -5F, 5, 5, 5), + PartPose.offset(0F, 19F, 0F)); + + body.addOrReplaceChild("right_eye", CubeListBuilder.create() + .texOffs(10, 0) + .addBox(-1F, -3F, -1F, 2, 3, 2), + PartPose.offsetAndRotation(-1F, -1F, -4F, (Mth.PI / 4.0F), 0.0F, -(Mth.PI / 4.0F))); + + body.addOrReplaceChild("left_eye", CubeListBuilder.create() + .texOffs(10, 0) + .addBox(-1F, -3F, -1F, 2, 3, 2), + PartPose.offsetAndRotation(1F, -1F, -4F, (Mth.PI / 4.0F), 0.0F, (Mth.PI / 4.0F))); + + var helmetBase = partRoot.addOrReplaceChild("helmet_base", CubeListBuilder.create(), + PartPose.offsetAndRotation(0F, 18F, 0F, -100F / (180F / Mth.PI), -30F / (180F / Mth.PI), 0.0F)); + + helmetBase.addOrReplaceChild("helmet", CubeListBuilder.create() + .texOffs(0, 14) + .addBox(-3.5F, -11.0F, -3.5F, 7, 11, 7), + PartPose.offsetAndRotation(0.0F, 0.0F, 0.0F, 0.0F, 45F / (180F / Mth.PI), 0.0F)); + + var rightHorn = helmetBase.addOrReplaceChild("right_horn_1", CubeListBuilder.create() + .texOffs(28, 14) + .addBox(-6F, -1.5F, -1.5F, 7, 3, 3), + PartPose.offsetAndRotation(-3.5F, -9F, 0.0F, 0.0F, -15F / (180F / Mth.PI), 10F / (180F / Mth.PI))); + + rightHorn.addOrReplaceChild("right_horn_2", CubeListBuilder.create() + .texOffs(28, 20) + .addBox(-3.0F, -1.0F, -1.0F, 3, 2, 2), + PartPose.offsetAndRotation(-5.5F, 0.0F, 0.0F, 0.0F, -15F / (180F / Mth.PI), 10F / (180F / Mth.PI))); + + var leftHorn = helmetBase.addOrReplaceChild("left_horn_1", CubeListBuilder.create() + .texOffs(28, 14) + .addBox(-6F, -1.5F, -1.5F, 7, 3, 3), + PartPose.offsetAndRotation(3.5F, -9F, 0.0F, 0.0F, 15F / (180F / Mth.PI), -10F / (180F / Mth.PI))); + + leftHorn.addOrReplaceChild("left_horn_2", CubeListBuilder.create() + .texOffs(28, 20) + .addBox(-3.0F, -1.0F, -1.0F, 3, 2, 2), + PartPose.offsetAndRotation(5.5F, 0.0F, 0.0F, 0.0F, 15F / (180F / Mth.PI), -10F / (180F / Mth.PI))); + + var rightArm = partRoot.addOrReplaceChild("right_arm", CubeListBuilder.create() + .texOffs(38, 0) + .addBox(-7F, -1F, -1F, 8, 2, 2), + PartPose.offsetAndRotation(-3F, 20F, -3F, 0F, -1.319531F, -0.1919862F)); + + var clawBase = rightArm.addOrReplaceChild("claw_base", CubeListBuilder.create() + .texOffs(0, 0) + .addBox(0F, -1.5F, -1F, 3, 3, 2), + PartPose.offsetAndRotation(-6F, 0F, -0.5F, 0.0F, (Mth.PI / 2.0F), 0)); + + clawBase.addOrReplaceChild("claw_bottom", CubeListBuilder.create() + .texOffs(0, 8) + .addBox(0F, -0.5F, -1F, 3, 2, 2), + PartPose.offsetAndRotation(3F, 0F, 0F, 0F, 0F, 0.2602503F)); + + clawBase.addOrReplaceChild("claw_top", CubeListBuilder.create() + .texOffs(0, 5) + .addBox(0F, -0.5F, -1F, 3, 1, 2), + PartPose.offsetAndRotation(3F, -1F, 0F, 0F, 0F, -0.1858931F)); + + partRoot.addOrReplaceChild("leg_1", CubeListBuilder.create() + .texOffs(18, 0) + .addBox(-7F, -1F, -1F, 8, 2, 2), + PartPose.offsetAndRotation(-3F, 20F, -1F, 0F, 0.2792527F, -0.1919862F)); + + partRoot.addOrReplaceChild("leg_2", CubeListBuilder.create() + .texOffs(18, 0) + .addBox(-1F, -1F, -1F, 8, 2, 2), + PartPose.offsetAndRotation(3F, 20F, -1F, 0F, -0.2792527F, 0.1919862F)); + + partRoot.addOrReplaceChild("leg_3", CubeListBuilder.create() + .texOffs(18, 0) + .addBox(-7F, -1F, -1F, 8, 2, 2), + PartPose.offsetAndRotation(-3F, 20F, -2F, 0F, -0.2792527F, -0.1919862F)); + + partRoot.addOrReplaceChild("leg_4", CubeListBuilder.create() + .texOffs(18, 0) + .addBox(-1F, -1F, -1F, 8, 2, 2), + PartPose.offsetAndRotation(3F, 20F, -2F, 0F, 0.2792527F, 0.1919862F)); + + partRoot.addOrReplaceChild("leg_5", CubeListBuilder.create() + .texOffs(18, 0) + .addBox(-1F, -1F, -1F, 8, 2, 2), + PartPose.offsetAndRotation(3F, 20F, -3F, 0F, 0.5759587F, 0.1919862F)); + + return LayerDefinition.create(mesh, 64, 32); + } + + @Override + public ModelPart root() { + return this.root; + } + + @Override + public void setupAnim(HelmetCrab entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + + //leg3 -> leg1, leg4 -> leg2, leg5 -> leg3, leg6 -> leg4, leg8 -> leg5 + this.body.yRot = netHeadYaw / (180F / (float) Math.PI); + this.body.xRot = headPitch / (180F / (float) Math.PI); + + float f6 = ((float) Math.PI / 4F); + this.leg1.zRot = -f6 * 0.74F; + this.leg2.zRot = f6 * 0.74F; + this.leg3.zRot = -f6 * 0.74F; + this.leg4.zRot = f6 * 0.74F; + this.leg5.zRot = f6; + + float f7 = -0.0F; + float f8 = 0.3926991F; + this.leg1.yRot = f8 + f7; + this.leg2.yRot = -f8 - f7; + this.leg3.yRot = -f8 + f7; + this.leg4.yRot = f8 - f7; + this.leg5.yRot = f8 * 2.0F - f7; + + float f10 = -(Mth.cos(limbSwing * 0.6662F * 2.0F + (float) Math.PI) * 0.4F) * limbSwingAmount; + float f11 = -(Mth.cos(limbSwing * 0.6662F * 2.0F + ((float) Math.PI / 2F)) * 0.4F) * limbSwingAmount; + float f12 = -(Mth.cos(limbSwing * 0.6662F * 2.0F + ((float) Math.PI * 3F / 2F)) * 0.4F) * limbSwingAmount; + float f14 = Math.abs(Mth.sin(limbSwing * 0.6662F + (float) Math.PI) * 0.4F) * limbSwingAmount; + float f15 = Math.abs(Mth.sin(limbSwing * 0.6662F + ((float) Math.PI / 2F)) * 0.4F) * limbSwingAmount; + float f16 = Math.abs(Mth.sin(limbSwing * 0.6662F + ((float) Math.PI * 3F / 2F)) * 0.4F) * limbSwingAmount; + this.leg1.yRot += f10; + this.leg2.yRot += -f10; + this.leg3.yRot += f11; + this.leg4.yRot += -f11; + this.leg5.yRot += -f12; + + this.leg1.zRot += f14; + this.leg2.zRot += -f14; + this.leg3.zRot += f15; + this.leg4.zRot += -f15; + this.leg5.zRot += -f16; + + // swing right arm as if it were an arm, not a leg + this.rightArm.yRot = -1.319531F; + this.rightArm.yRot += Mth.cos(limbSwing * 0.6662F + (float) Math.PI) * 2.0F * limbSwingAmount * 0.5F; + } +} diff --git a/src/main/java/twilightforest/client/model/entity/legacy/HydraHeadLegacyModel.java b/src/main/java/twilightforest/client/model/entity/legacy/HydraHeadLegacyModel.java new file mode 100644 index 0000000000..b7dea847d6 --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/legacy/HydraHeadLegacyModel.java @@ -0,0 +1,111 @@ +package twilightforest.client.model.entity.legacy; + +import com.google.common.collect.ImmutableList; +import net.minecraft.client.model.ListModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; +import net.minecraft.util.Mth; +import twilightforest.entity.boss.HydraHead; +import twilightforest.entity.boss.HydraPart; + +public class HydraHeadLegacyModel extends ListModel { + + final ModelPart head; + ModelPart jaw; + + public HydraHeadLegacyModel(ModelPart root) { + this.head = root.getChild("head"); + this.jaw = head.getChild("jaw"); + } + + public static LayerDefinition create() { + MeshDefinition mesh = new MeshDefinition(); + PartDefinition partRoot = mesh.getRoot(); + + var head = partRoot.addOrReplaceChild("head", CubeListBuilder.create() + .texOffs(272, 0) + .addBox(-16F, -14F, -32F, 32, 24, 32) + .texOffs(272, 56) + .addBox(-15F, -2F, -56F, 30, 12, 24) + .texOffs(272, 132) + .addBox(-15F, 10F, -20F, 30, 8, 16) + .texOffs(128, 200) + .addBox(-2F, -30F, -12F, 4, 24, 24) + .texOffs(272, 156) + .addBox(-12F, 10, -49F, 2, 5, 2) + .texOffs(272, 156) + .addBox(10F, 10, -49F, 2, 5, 2) + .texOffs(280, 156) + .addBox(-8F, 9, -49F, 16, 2, 2) + .texOffs(280, 160) + .addBox(-10F, 9, -45F, 2, 2, 16) + .texOffs(280, 160) + .addBox(8F, 9, -45F, 2, 2, 16), + PartPose.ZERO); + + head.addOrReplaceChild("jaw", CubeListBuilder.create() + .texOffs(272, 92) + .addBox(-15F, 0F, -32F, 30, 8, 32) + .texOffs(272, 156) + .addBox(-10F, -5, -29F, 2, 5, 2) + .texOffs(272, 156) + .addBox(8F, -5, -29F, 2, 5, 2) + .texOffs(280, 156) + .addBox(-8F, -1, -29F, 16, 2, 2) + .texOffs(280, 160) + .addBox(-10F, -1, -25F, 2, 2, 16) + .texOffs(280, 160) + .addBox(8F, -1, -25F, 2, 2, 16), + PartPose.offset(0F, 10F, -20F)); + + head.addOrReplaceChild("frill", CubeListBuilder.create() + .texOffs(272, 200) + .addBox(-24F, -40.0F, 0F, 48, 48, 4), + PartPose.offsetAndRotation(0F, 0F, -14F, -0.5235988F, 0F, 0F)); + + return LayerDefinition.create(mesh, 512, 256); + } + + @Override + public Iterable parts() { + return ImmutableList.of(head); + } + + @Override + public void setupAnim(HydraHead entity, float v, float v1, float v2, float v3, float v4) { } + + @Override + public void prepareMobModel(HydraHead entity, float limbSwing, float limbSwingAmount, float partialTicks) { + head.yRot = getRotationY(entity, partialTicks); + head.xRot = getRotationX(entity, partialTicks); + + float mouthOpenLast = entity.getMouthOpenLast(); + float mouthOpenReal = entity.getMouthOpen(); + float mouthOpen = Mth.lerp(partialTicks, mouthOpenLast, mouthOpenReal); + head.xRot -= (float) (mouthOpen * (Math.PI / 12.0)); + jaw.xRot = (float) (mouthOpen * (Math.PI / 3.0)); + } + + public void openMouthForTrophy(float mouthOpen) { + head.yRot = 0; + head.xRot = 0; + + head.xRot -= (float) (mouthOpen * (Math.PI / 12.0)); + jaw.xRot = (float) (mouthOpen * (Math.PI / 3.0)); + } + + public float getRotationY(HydraPart whichHead, float time) { + //float yawOffset = hydra.prevRenderYawOffset + (hydra.renderYawOffset - hydra.prevRenderYawOffset) * time; + float yaw = whichHead.yRotO + (whichHead.getYRot() - whichHead.yRotO) * time; + + return yaw / 57.29578F; + } + + public float getRotationX(HydraPart whichHead, float time) { + return (whichHead.xRotO + (whichHead.getXRot() - whichHead.xRotO) * time) / 57.29578F; + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/client/model/entity/legacy/HydraLegacyModel.java b/src/main/java/twilightforest/client/model/entity/legacy/HydraLegacyModel.java new file mode 100644 index 0000000000..9a80db7841 --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/legacy/HydraLegacyModel.java @@ -0,0 +1,231 @@ +// Date: 2/5/2012 10:11:18 AM +// Template version 1.1 +// Java generated by Techne +// Keep in mind that you still need to fill in some blanks +// - ZeuX +package twilightforest.client.model.entity.legacy; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.model.HierarchicalModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; +import net.minecraft.util.Mth; +import org.jetbrains.annotations.Nullable; +import twilightforest.entity.boss.Hydra; + +public class HydraLegacyModel extends HierarchicalModel { + //fields + private final ModelPart root; + private final ModelPart body; + private final ModelPart tail; + private final ModelPart leg1; + private final ModelPart leg2; + + @Nullable + private Hydra hydra; + + public HydraLegacyModel(ModelPart root) { + this.root = root; + this.body = root.getChild("body"); + this.tail = root.getChild("tail_1"); + this.leg1 = root.getChild("leg_1"); + this.leg2 = root.getChild("leg_2"); + } + + public static LayerDefinition create() { + MeshDefinition mesh = new MeshDefinition(); + PartDefinition partRoot = mesh.getRoot(); + + partRoot.addOrReplaceChild("body", CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-48F, 0F, 0F, 96, 96, 40), + PartPose.offsetAndRotation(0F, -12F, 0F, 1.22173F, 0F, 0F)); + + partRoot.addOrReplaceChild("leg_1", CubeListBuilder.create() + .texOffs(0, 136) + .addBox(-16F, 0F, -16F, 32, 48, 32) + .texOffs(184, 200) + .addBox(-20F, 40F, -20F, 8, 8, 8) + .texOffs(184, 200) + .addBox(-4F, 40F, -22F, 8, 8, 8) + .texOffs(184, 200) + .addBox(12F, 40F, -20F, 8, 8, 8), + PartPose.offset(48F, -24F, 0F)); + + partRoot.addOrReplaceChild("leg_2", CubeListBuilder.create().mirror() + .texOffs(0, 136) + .addBox(-16F, 0F, -16F, 32, 48, 32) + .texOffs(184, 200) + .addBox(-20F, 40F, -20F, 8, 8, 8) + .texOffs(184, 200) + .addBox(-4F, 40F, -22F, 8, 8, 8) + .texOffs(184, 200) + .addBox(12F, 40F, -20F, 8, 8, 8), + PartPose.offset(-48F, -24F, 0F)); + + var tail1 = partRoot.addOrReplaceChild("tail_1", CubeListBuilder.create() + .texOffs(128, 136) + .addBox(-16F, -16F, -16F, 32, 32, 32) + .texOffs(128, 200) + .addBox(-2F, -28F, -11F, 4, 24, 24), + PartPose.offset(0F, 6F, 108F)); + + var tail2 = tail1.addOrReplaceChild("tail_2", CubeListBuilder.create() + .texOffs(128, 136) + .addBox(-16F, -16F, -16F, 32, 32, 32) + .texOffs(128, 200) + .addBox(-2F, -28F, -11F, 4, 24, 24), + PartPose.offset(0F, 0F, 32F)); + + var tail3 = tail2.addOrReplaceChild("tail_3", CubeListBuilder.create() + .texOffs(128, 136) + .addBox(-16F, -16F, -16F, 32, 32, 32) + .texOffs(128, 200) + .addBox(-2F, -28F, -11F, 4, 24, 24), + PartPose.offset(0F, 0F, 32F)); + + tail3.addOrReplaceChild("tail_4", CubeListBuilder.create() + .texOffs(128, 136) + .addBox(-16F, -16F, -16F, 32, 32, 32) + .texOffs(128, 200) + .addBox(-2F, -28F, -11F, 4, 24, 24), + PartPose.offset(0F, 0F, 32F)); + + var head1 = partRoot.addOrReplaceChild("head_1", CubeListBuilder.create() + .texOffs(272, 0) + .addBox(-16F, -14F, -32F, 32, 24, 32) + .texOffs(272, 56) + .addBox(-15F, -2F, -56F, 30, 12, 24) + .texOffs(128, 200) + .addBox(-2F, -30F, -12F, 4, 24, 24), + PartPose.offset(-74F, -100F, -32F)); + + head1.addOrReplaceChild("jaw_1", CubeListBuilder.create() + .texOffs(272, 92) + .addBox(-15F, 0F, -48F, 30, 8, 48), + PartPose.offset(0F, 10F, -4F)); + + head1.addOrReplaceChild("frill_1", CubeListBuilder.create() + .texOffs(272, 200) + .addBox(-24F, -40.0F, 0F, 48, 48, 4), + PartPose.offsetAndRotation(0F, 0F, -10F, -0.5235988F, 0F, 0F)); + + var neck1a = partRoot.addOrReplaceChild("neck_1a", CubeListBuilder.create() + .texOffs(128, 136).addBox(-16F, -16F, -16F, 32, 32, 32) + .texOffs(128, 200).addBox(-2F, -24F, 0F, 4, 24, 24), + PartPose.offset(-42F, -48F, 0F)); + + var neck1b = neck1a.addOrReplaceChild("neck_1b", CubeListBuilder.create() + .texOffs(128, 136).addBox(-16F, -16F, -16F, 32, 32, 32) + .texOffs(128, 200).addBox(-2F, -24F, 0F, 4, 24, 24), + PartPose.offset(-16F, -16F, -16F)); + + neck1b.addOrReplaceChild("neck_1c", CubeListBuilder.create() + .texOffs(128, 136).addBox(-16F, -16F, -16F, 32, 32, 32) + .texOffs(128, 200).addBox(-2F, -24F, 0F, 4, 24, 24), + PartPose.offset(-16F, -16F, -16F)); + + var head2 = partRoot.addOrReplaceChild("head_2", CubeListBuilder.create() + .texOffs(272, 0) + .addBox(-16F, -14F, -32F, 32, 24, 32) + .texOffs(272, 56) + .addBox(-15F, -2F, -56F, 30, 12, 24) + .texOffs(128, 200) + .addBox(-2F, -30F, -12F, 4, 24, 24), + PartPose.offset(0F, -116F, -32F)); + + head2.addOrReplaceChild("jaw_2", CubeListBuilder.create() + .texOffs(272, 92) + .addBox(-15F, 0F, -48F, 30, 8, 48), + PartPose.offset(0F, 10F, -4F)); + + head2.addOrReplaceChild("frill_2", CubeListBuilder.create() + .texOffs(272, 200) + .addBox(-24F, -40.0F, 0F, 48, 48, 4), + PartPose.offsetAndRotation(0F, 0F, -10F, -0.5235988F, 0F, 0F)); + + var neck2a = partRoot.addOrReplaceChild("neck_2a", CubeListBuilder.create() + .texOffs(128, 136).addBox(-16F, -16F, -16F, 32, 32, 32) + .texOffs(128, 200).addBox(-2F, -24F, 0F, 4, 24, 24), + PartPose.offset(0F, -48F, 0F)); + + var neck2b = neck2a.addOrReplaceChild("neck_2b", CubeListBuilder.create() + .texOffs(128, 136).addBox(-16F, -16F, -16F, 32, 32, 32) + .texOffs(128, 200).addBox(-2F, -24F, 0F, 4, 24, 24), + PartPose.offset(-0F, -24F, -16F)); + + neck2b.addOrReplaceChild("neck_2c", CubeListBuilder.create() + .texOffs(128, 136).addBox(-16F, -16F, -16F, 32, 32, 32) + .texOffs(128, 200).addBox(-2F, -24F, 0F, 4, 24, 24), + PartPose.offset(0F, -24F, -16F)); + + var head3 = partRoot.addOrReplaceChild("head_3", CubeListBuilder.create() + .texOffs(272, 0) + .addBox(-16F, -14F, -32F, 32, 24, 32) + .texOffs(272, 56) + .addBox(-15F, -2F, -56F, 30, 12, 24) + .texOffs(128, 200) + .addBox(-2F, -30F, -12F, 4, 24, 24), + PartPose.offset(74F, -100F, -32F)); + + head3.addOrReplaceChild("jaw_3", CubeListBuilder.create() + .texOffs(272, 92) + .addBox(-15F, 0F, -48F, 30, 8, 48), + PartPose.offset(0F, 10F, -4F)); + + head3.addOrReplaceChild("frill_3", CubeListBuilder.create() + .texOffs(272, 200) + .addBox(-24F, -40.0F, 0F, 48, 48, 4), + PartPose.offsetAndRotation(0F, 0F, -10F, -0.5235988F, 0F, 0F)); + + var neck3a = partRoot.addOrReplaceChild("neck_3a", CubeListBuilder.create() + .texOffs(128, 136).addBox(-16F, -16F, -16F, 32, 32, 32) + .texOffs(128, 200).addBox(-2F, -24F, 0F, 4, 24, 24), + PartPose.offset(42F, -48F, 0F)); + + var neck3b = neck3a.addOrReplaceChild("neck_3b", CubeListBuilder.create() + .texOffs(128, 136).addBox(-16F, -16F, -16F, 32, 32, 32) + .texOffs(128, 200).addBox(-2F, -24F, 0F, 4, 24, 24), + PartPose.offset(16F, -16F, -16F)); + + neck3b.addOrReplaceChild("neck_3c", CubeListBuilder.create() + .texOffs(128, 136).addBox(-16F, -16F, -16F, 32, 32, 32) + .texOffs(128, 200).addBox(-2F, -24F, 0F, 4, 24, 24), + PartPose.offset(16F, -16F, -16F)); + + return LayerDefinition.create(mesh, 512, 256); + } + + @Override + public ModelPart root() { + return this.root; + } + + @Override + public void renderToBuffer(PoseStack stack, VertexConsumer consumer, int light, int overlay, float red, float green, float blue, float alpha) { + if (this.hydra != null && this.hydra.renderFakeHeads) { + super.renderToBuffer(stack, consumer, light, overlay, red, green, blue, alpha); + } else { + this.leg1.render(stack, consumer, light, overlay, red, green, blue, alpha); + this.leg2.render(stack, consumer, light, overlay, red, green, blue, alpha); + this.body.render(stack, consumer, light, overlay, red, green, blue, alpha); + this.tail.render(stack, consumer, light, overlay, red, green, blue, alpha); + } + } + + @Override + public void setupAnim(Hydra entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + this.hydra = entity; + + this.leg1.xRot = Mth.cos(limbSwing * 0.6662F) * 1.4F * limbSwingAmount; + this.leg2.xRot = Mth.cos(limbSwing * 0.6662F + 3.141593F) * 1.4F * limbSwingAmount; + + this.leg1.yRot = 0.0F; + this.leg2.yRot = 0.0F; + } +} diff --git a/src/main/java/twilightforest/client/model/entity/legacy/HydraNeckLegacyModel.java b/src/main/java/twilightforest/client/model/entity/legacy/HydraNeckLegacyModel.java new file mode 100644 index 0000000000..f5bbadb86a --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/legacy/HydraNeckLegacyModel.java @@ -0,0 +1,45 @@ +package twilightforest.client.model.entity.legacy; + +import com.google.common.collect.ImmutableList; +import net.minecraft.client.model.ListModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; +import twilightforest.entity.boss.HydraNeck; + +public class HydraNeckLegacyModel extends ListModel { + + final ModelPart neck; + + public HydraNeckLegacyModel(ModelPart root) { + this.neck = root.getChild("neck"); + } + + public static LayerDefinition create() { + MeshDefinition mesh = new MeshDefinition(); + PartDefinition partRoot = mesh.getRoot(); + + partRoot.addOrReplaceChild("neck", CubeListBuilder.create() + .texOffs(128, 136) + .addBox(-16F, -16F, -16F, 32, 32, 32) + .texOffs(128, 200) + .addBox(-2F, -23F, 0F, 4, 24, 24), + PartPose.ZERO); + + return LayerDefinition.create(mesh, 512, 256); + } + + @Override + public Iterable parts() { + return ImmutableList.of(neck); + } + + @Override + public void setupAnim(HydraNeck entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + neck.yRot = netHeadYaw / 57.29578F; + neck.xRot = headPitch / 57.29578F; + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/client/model/entity/legacy/KoboldLegacyModel.java b/src/main/java/twilightforest/client/model/entity/legacy/KoboldLegacyModel.java new file mode 100644 index 0000000000..cb37d31246 --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/legacy/KoboldLegacyModel.java @@ -0,0 +1,122 @@ +// Date: 6/11/2012 3:12:45 PM +// Template version 1.1 +// Java generated by Techne +// Keep in mind that you still need to fill in some blanks +// - ZeuX + +package twilightforest.client.model.entity.legacy; + +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.*; +import net.minecraft.util.Mth; +import twilightforest.entity.monster.Kobold; + +public class KoboldLegacyModel extends HumanoidModel { + + final ModelPart jaw; + boolean isJumping; + + public KoboldLegacyModel(ModelPart root) { + super(root); + this.isJumping = false; + this.jaw = getHead().getChild("jaw"); + } + + public static LayerDefinition create() { + MeshDefinition mesh = HumanoidModel.createMesh(CubeDeformation.NONE, 0); + PartDefinition partRoot = mesh.getRoot(); + + var head = partRoot.addOrReplaceChild("head", CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-3.5F, -7F, -3F, 7, 6, 6), + PartPose.offset(0F, 13F, 0F)); + + partRoot.addOrReplaceChild("hat", CubeListBuilder.create(), PartPose.ZERO); + + head.addOrReplaceChild("right_ear", CubeListBuilder.create() + .texOffs(48, 20) + .addBox(0F, -4F, 0F, 4, 4, 1), + PartPose.offsetAndRotation(3.5F, -3F, -1F, 0.0F, 0.2617994F, -0.3490659F)); + + head.addOrReplaceChild("left_ear", CubeListBuilder.create() + .texOffs(48, 25) + .addBox(-4F, -4F, 0F, 4, 4, 1), + PartPose.offsetAndRotation(-3.5F, -3F, -1F, 0.0F, -0.2617994F, 0.3490659F)); + + head.addOrReplaceChild("snout", CubeListBuilder.create() + .texOffs(28, 0) + .addBox(-1.5F, -2F, -2F, 3, 2, 3), + PartPose.offset(0F, -2F, -3F)); + + head.addOrReplaceChild("jaw", CubeListBuilder.create() + .texOffs(28, 5) + .addBox(-1.5F, 0F, -2F, 3, 1, 3), + PartPose.offsetAndRotation(0F, -2F, -3F, 0.20944F, 0.0F, 0.0F)); + + partRoot.addOrReplaceChild("body", CubeListBuilder.create() + .texOffs(12, 19) + .addBox(0F, 0F, 0F, 7, 7, 4), + PartPose.offset(-3.5F, 12F, -2F)); + + partRoot.addOrReplaceChild("right_arm", CubeListBuilder.create() + .texOffs(36, 17) + .addBox(-3F, -1F, -1.5F, 3, 7, 3), + PartPose.offset(-3.5F, 12F, 0F)); + + partRoot.addOrReplaceChild("left_arm", CubeListBuilder.create().mirror() + .texOffs(36, 17) + .addBox(0F, -1F, -1.5F, 3, 7, 3), + PartPose.offset(3.5F, 12F, 0F)); + + partRoot.addOrReplaceChild("right_leg", CubeListBuilder.create() + .texOffs(0, 20) + .addBox(-1.5F, 0F, -1.5F, 3, 5, 3), + PartPose.offset(-2F, 19F, 0F)); + + partRoot.addOrReplaceChild("left_leg", CubeListBuilder.create().mirror() + .texOffs(0, 20) + .addBox(-1.5F, 0F, -1.5F, 3, 5, 3), + PartPose.offset(2F, 19F, 0F)); + + return LayerDefinition.create(mesh, 64, 32); + } + + @Override + public void setupAnim(Kobold entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + this.head.yRot = netHeadYaw / (180F / (float) Math.PI); + this.head.xRot = headPitch / (180F / (float) Math.PI); + + this.rightArm.xRot = Mth.cos(limbSwing * 0.6662F + (float) Math.PI) * 2.0F * limbSwingAmount * 0.5F; + this.leftArm.xRot = Mth.cos(limbSwing * 0.6662F) * 2.0F * limbSwingAmount * 0.5F; + this.rightArm.zRot = 0.0F; + this.leftArm.zRot = 0.0F; + + this.rightArm.xRot = -((float) Math.PI * .15F); + this.leftArm.xRot = -((float) Math.PI * .15F); + + this.rightLeg.xRot = Mth.cos(limbSwing * 0.6662F) * 1.4F * limbSwingAmount; + this.leftLeg.xRot = Mth.cos(limbSwing * 0.6662F + (float) Math.PI) * 1.4F * limbSwingAmount; + this.rightLeg.yRot = 0.0F; + this.leftLeg.yRot = 0.0F; + + this.rightArm.zRot += Mth.cos(ageInTicks * 0.19F) * 0.15F + 0.05F; + this.leftArm.zRot -= Mth.cos(ageInTicks * 0.19F) * 0.15F + 0.05F; + this.rightArm.xRot += Mth.sin(ageInTicks * 0.267F) * 0.25F; + this.leftArm.xRot -= Mth.sin(ageInTicks * 0.267F) * 0.25F; + + if (this.isJumping) { + // open jaw + this.jaw.xRot = 1.44F; + } else { + this.jaw.xRot = 0.20944F; + } + } + + @Override + public void prepareMobModel(Kobold entity, float limbSwing, float limbSwingAmount, float partialTicks) { + // check if entity is jumping + this.isJumping = entity.getDeltaMovement().y() > 0; + } +} diff --git a/src/main/java/twilightforest/client/model/entity/legacy/LowerGoblinKnightLegacyModel.java b/src/main/java/twilightforest/client/model/entity/legacy/LowerGoblinKnightLegacyModel.java new file mode 100644 index 0000000000..826661b003 --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/legacy/LowerGoblinKnightLegacyModel.java @@ -0,0 +1,116 @@ +package twilightforest.client.model.entity.legacy; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.*; +import net.minecraft.util.Mth; +import twilightforest.entity.monster.LowerGoblinKnight; + +public class LowerGoblinKnightLegacyModel extends HumanoidModel { + + final ModelPart tunic; + + public LowerGoblinKnightLegacyModel(ModelPart root) { + super(root); + this.tunic = root.getChild("tunic"); + } + + public static LayerDefinition create() { + MeshDefinition mesh = HumanoidModel.createMesh(CubeDeformation.NONE, 0); + PartDefinition partRoot = mesh.getRoot(); + + partRoot.addOrReplaceChild("head", CubeListBuilder.create() + .texOffs(0, 32) + .addBox(-2.5F, -5.0F, -3.5F, 5, 5, 5), + PartPose.offset(0.0F, 10.0F, 1.0F)); + + partRoot.addOrReplaceChild("hat", CubeListBuilder.create(), + PartPose.ZERO); + + partRoot.addOrReplaceChild("body", CubeListBuilder.create() + .texOffs(16, 48) + .addBox(-3.5F, 0.0F, -2.0F, 7, 8, 4), + PartPose.offset(0.0F, 8.0F, 0.0F)); + + partRoot.addOrReplaceChild("tunic", CubeListBuilder.create() + .texOffs(64, 19) + .addBox(-6.0F, 0.0F, -3.0F, 12, 9, 6), + PartPose.offset(0F, 7.5F, 0.0F)); + + partRoot.addOrReplaceChild("right_arm", CubeListBuilder.create() + .texOffs(40, 48) + .addBox(-2.0F, -2.0F, -1.5F, 2, 8, 3), + PartPose.offset(-3.5F, 10.0F, 0.0F)); + + partRoot.addOrReplaceChild("left_arm", CubeListBuilder.create().mirror() + .texOffs(40, 48) + .addBox(0.0F, -2.0F, -1.5F, 2, 8, 3), + PartPose.offset(3.5F, 10.0F, 0.0F)); + + partRoot.addOrReplaceChild("right_leg", CubeListBuilder.create() + .texOffs(0, 48) + .addBox(-3.0F, 0.0F, -2.0F, 4, 8, 4), + PartPose.offset(-2.5F, 16.0F, 0.0F)); + + partRoot.addOrReplaceChild("left_leg", CubeListBuilder.create().mirror() + .texOffs(0, 48) + .addBox(-1.0F, 0.0F, -2.0F, 4, 8, 4), + PartPose.offset(2.5F, 16.0F, 0.0F)); + + return LayerDefinition.create(mesh, 128, 64); + } + + /** + * Sets the models various rotation angles then renders the model. + */ + @Override + public void renderToBuffer(PoseStack stack, VertexConsumer builder, int light, int overlay, float red, float green, float blue, float scale) { + super.renderToBuffer(stack, builder, light, overlay, red, green, blue, scale); + this.tunic.render(stack, builder, light, overlay, red, green, blue, scale); + } + + @Override + public void setupAnim(LowerGoblinKnight entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + this.head.yRot = netHeadYaw / (180F / (float) Math.PI); + this.head.xRot = headPitch / (180F / (float) Math.PI); + this.hat.yRot = this.head.yRot; + this.hat.xRot = this.head.xRot; + this.rightArm.xRot = Mth.cos(limbSwing * 0.6662F + (float) Math.PI) * 2.0F * limbSwingAmount * 0.5F; + this.leftArm.xRot = Mth.cos(limbSwing * 0.6662F) * 2.0F * limbSwingAmount * 0.5F; + this.rightArm.zRot = 0.0F; + this.leftArm.zRot = 0.0F; + this.rightLeg.xRot = Mth.cos(limbSwing * 0.6662F) * 1.4F * limbSwingAmount; + this.leftLeg.xRot = Mth.cos(limbSwing * 0.6662F + (float) Math.PI) * 1.4F * limbSwingAmount; + this.rightLeg.yRot = 0.0F; + this.leftLeg.yRot = 0.0F; + + if (entity.isVehicle()) { + this.head.yRot = 0; + this.head.xRot = 0; + this.hat.yRot = this.head.yRot; + this.hat.xRot = this.head.xRot; + } + + if (this.leftArmPose != ArmPose.EMPTY) { + this.leftArm.xRot = this.leftArm.xRot * 0.5F - ((float) Math.PI / 10F); + } + + if (this.rightArmPose != ArmPose.EMPTY) { + this.rightArm.xRot = this.rightArm.xRot * 0.5F - ((float) Math.PI / 10F); + } + + this.rightArm.yRot = 0.0F; + this.leftArm.yRot = 0.0F; + + + this.rightArm.zRot += Mth.cos(ageInTicks * 0.09F) * 0.05F + 0.05F; + this.leftArm.zRot -= Mth.cos(ageInTicks * 0.09F) * 0.05F + 0.05F; + this.rightArm.xRot += Mth.sin(ageInTicks * 0.067F) * 0.05F; + this.leftArm.xRot -= Mth.sin(ageInTicks * 0.067F) * 0.05F; + + this.tunic.visible = entity.hasArmor(); + } +} diff --git a/src/main/java/twilightforest/client/model/entity/legacy/MinoshroomLegacyModel.java b/src/main/java/twilightforest/client/model/entity/legacy/MinoshroomLegacyModel.java new file mode 100644 index 0000000000..72c521d191 --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/legacy/MinoshroomLegacyModel.java @@ -0,0 +1,216 @@ +package twilightforest.client.model.entity.legacy; + +import com.google.common.collect.ImmutableList; +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.*; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.HumanoidArm; +import twilightforest.entity.boss.Minoshroom; + +public class MinoshroomLegacyModel extends HumanoidModel { + + final ModelPart leg1; + ModelPart leg2; + ModelPart leg3; + ModelPart leg4; + ModelPart cowbody, udders; + + public MinoshroomLegacyModel(ModelPart root) { + super(root); + this.leg1 = root.getChild("leg_1"); + this.leg2 = root.getChild("leg_2"); + this.leg3 = root.getChild("leg_3"); + this.leg4 = root.getChild("leg_4"); + this.cowbody = root.getChild("cow_body"); + this.udders = root.getChild("udders"); + } + + public static LayerDefinition create() { + MeshDefinition mesh = HumanoidModel.createMesh(CubeDeformation.NONE, 0); + PartDefinition partRoot = mesh.getRoot(); + + var head = partRoot.addOrReplaceChild("head", CubeListBuilder.create() + .texOffs(96, 16) + .addBox(-4F, -8F, -4F, 8, 8, 8), + PartPose.offset(0F, -6F, -9F)); + + partRoot.addOrReplaceChild("hat", CubeListBuilder.create(), + PartPose.ZERO); + + head.addOrReplaceChild("snout", CubeListBuilder.create() + .texOffs(105, 28) + .addBox(-2, -1, -1, 4, 3, 1), + PartPose.offset(0F, -2.0F, -4F)); + + var rightHorn = head.addOrReplaceChild("right_horn_1", CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-5.5F, -1.5F, -1.5F, 5, 3, 3), + PartPose.offsetAndRotation(-2.5F, -6.5F, 0.0F, 0.0F, -25F / (180F / Mth.PI), 10F / (180F / Mth.PI) )); + + rightHorn.addOrReplaceChild("right_horn_2", CubeListBuilder.create() + .texOffs(16, 0) + .addBox(-3.5F, -1.0F, -1.0F, 3, 2, 2), + PartPose.offsetAndRotation(-4.5F, 0.0F, 0.0F, 0.0F, -15F / (180F / Mth.PI), 45F / (180F / Mth.PI))); + + var leftHorn = head.addOrReplaceChild("left_horn_1", CubeListBuilder.create().mirror() + .texOffs(0, 0) + .addBox(0.5F, -1.5F, -1.5F, 5, 3, 3), + PartPose.offsetAndRotation(2.5F, -6.5F, 0.0F, 0.0F, 25F / (180F / Mth.PI), -10F / (180F / Mth.PI) )); + + leftHorn.addOrReplaceChild("left_horn_2", CubeListBuilder.create() + .texOffs(16, 0) + .addBox(0.5F, -1.0F, -1.0F, 3, 2, 2), + PartPose.offsetAndRotation(4.5F, 0.0F, 0.0F, 0.0F, 15F / (180F / Mth.PI), -45F / (180F / Mth.PI))); + + partRoot.addOrReplaceChild("body", CubeListBuilder.create() + .texOffs(64, 0) + .addBox(-4F, 0F, -2.5F, 8, 12, 5), + PartPose.offset(0F, -6F, -9F)); + + partRoot.addOrReplaceChild("right_arm", CubeListBuilder.create() + .texOffs(90, 0) + .addBox(-3.0F, -2.0F, -2.0F, 4, 12, 4), + PartPose.offset(-5F, -4F, -9F)); + + partRoot.addOrReplaceChild("left_arm", CubeListBuilder.create().mirror() + .texOffs(90, 0) + .addBox(-1.0F, -2.0F, -2.0F, 4, 12, 4), + PartPose.offset(5F, -4F, -9F)); + + partRoot.addOrReplaceChild("cow_body", CubeListBuilder.create() + .texOffs(18, 4) + .addBox(-6F, -10F, -7F, 12, 18, 10), + PartPose.offsetAndRotation(0F, 5F, 2F, 1.570796F, 0F, 0F)); + + partRoot.addOrReplaceChild("udders", CubeListBuilder.create() + .texOffs(52, 0) + .addBox(-2F, -3F, 0F, 4, 6, 2), + PartPose.offsetAndRotation(0F, 14F, 6F, 1.570796F, 0F, 0F)); + + partRoot.addOrReplaceChild("leg_1", CubeListBuilder.create() + .texOffs(0, 16) + .addBox(-3F, 0F, -2F, 4, 12, 4), + PartPose.offset(-3F, 12F, 7F)); + + partRoot.addOrReplaceChild("leg_2", CubeListBuilder.create() + .texOffs(0, 16) + .addBox(-1F, 0F, -2F, 4, 12, 4), + PartPose.offset(3F, 12F, 7F)); + + partRoot.addOrReplaceChild("leg_3", CubeListBuilder.create() + .texOffs(0, 16) + .addBox(-3F, 0F, -2F, 4, 12, 4), + PartPose.offset(-3F, 12F, -5F)); + + partRoot.addOrReplaceChild("leg_4", CubeListBuilder.create() + .texOffs(0, 16) + .addBox(-1F, 0F, -2F, 4, 12, 4), + PartPose.offset(3F, 12F, -5F)); + + return LayerDefinition.create(mesh, 128, 32); + } + + @Override + protected Iterable bodyParts() { + return ImmutableList.of(this.head, this.body, this.leftArm, this.rightArm, this.cowbody, this.udders, this.leg1, this.leg2, this.leg3, this.leg4); + } + + /** + * Sets the model's various rotation angles. For bipeds, limbSwing and limbSwingAmount are used for animating the movement of arms + * and legs, where limbSwing represents the time(so that arms and legs swing back and forth) and limbSwingAmount represents how + * "far" arms and legs can swing at most. + */ + @Override + public void setupAnim(Minoshroom entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + // copied from ModelBiped + + this.head.yRot = netHeadYaw / (180F / (float) Math.PI); + this.head.xRot = headPitch / (180F / (float) Math.PI); + this.hat.yRot = this.head.yRot; + this.hat.xRot = this.head.xRot; + + this.rightArm.xRot = Mth.cos(limbSwing * 0.6662F + (float) Math.PI) * 2.0F * limbSwingAmount * 0.5F; + this.leftArm.xRot = Mth.cos(limbSwing * 0.6662F) * 2.0F * limbSwingAmount * 0.5F; + this.rightArm.zRot = 0.0F; + this.leftArm.zRot = 0.0F; + + this.rightLeg.xRot = Mth.cos(limbSwing * 0.6662F) * 1.4F * limbSwingAmount; + this.leftLeg.xRot = Mth.cos(limbSwing * 0.6662F + (float) Math.PI) * 1.4F * limbSwingAmount; + this.rightLeg.yRot = 0.0F; + this.leftLeg.yRot = 0.0F; + + if (this.leftArmPose != ArmPose.EMPTY) { + this.leftArm.xRot = this.leftArm.xRot * 0.5F - ((float) Math.PI / 10F); + } + + if (this.rightArmPose != ArmPose.EMPTY) { + this.rightArm.xRot = this.rightArm.xRot * 0.5F - ((float) Math.PI / 10F); + } + + + this.rightArm.zRot += Mth.cos(ageInTicks * 0.09F) * 0.05F + 0.05F; + this.leftArm.zRot -= Mth.cos(ageInTicks * 0.09F) * 0.05F + 0.05F; + this.rightArm.xRot += Mth.sin(ageInTicks * 0.067F) * 0.05F; + this.leftArm.xRot -= Mth.sin(ageInTicks * 0.067F) * 0.05F; + + float var7 = 0.0F; + float var8 = 0.0F; + + if (this.leftArmPose == ArmPose.BOW_AND_ARROW) { + this.leftArm.zRot = 0.0F; + this.leftArm.yRot = 0.1F - var7 * 0.6F + this.head.yRot + 0.4F; + this.leftArm.xRot = -((float) Math.PI / 2F) + this.head.xRot; + this.leftArm.xRot -= var7 * 1.2F - var8 * 0.4F; + this.leftArm.zRot -= Mth.cos(ageInTicks * 0.09F) * 0.05F + 0.05F; + this.leftArm.xRot -= Mth.sin(ageInTicks * 0.067F) * 0.05F; + } + + if (this.rightArmPose == ArmPose.BOW_AND_ARROW) { + this.rightArm.zRot = 0.0F; + this.rightArm.yRot = -(0.1F - var7 * 0.6F) + this.head.yRot; + this.rightArm.xRot = -((float) Math.PI / 2F) + this.head.xRot; + this.rightArm.xRot -= var7 * 1.2F - var8 * 0.4F; + this.rightArm.zRot += Mth.cos(ageInTicks * 0.09F) * 0.05F + 0.05F; + this.rightArm.xRot += Mth.sin(ageInTicks * 0.067F) * 0.05F; + } + + // copied from ModelQuadruped + this.cowbody.xRot = ((float) Math.PI / 2F); + this.leg1.xRot = Mth.cos(limbSwing * 0.6662F) * 1.4F * limbSwingAmount; + this.leg2.xRot = Mth.cos(limbSwing * 0.6662F + (float) Math.PI) * 1.4F * limbSwingAmount; + this.leg3.xRot = Mth.cos(limbSwing * 0.6662F + (float) Math.PI) * 1.4F * limbSwingAmount; + this.leg4.xRot = Mth.cos(limbSwing * 0.6662F) * 1.4F * limbSwingAmount; + + float f = ageInTicks - entity.tickCount; + float f1 = entity.getChargeAnimationScale(f); + f1 = f1 * f1; + float f2 = 1.0F - f1; + + this.leg3.y = 12.0F + (-7F * f1); + this.leg3.z = -4.0F + (-5.8F * f1); + this.leg4.y = this.leg3.y; + this.leg4.z = this.leg3.z; + this.body.y = -6F + -3.0F * f1; + this.rightArm.y = -4F - f1; + this.rightArm.z = -9F + f1; + this.leftArm.y = rightArm.y; + this.leftArm.z = rightArm.z; + + if (f1 > 0) { + if (entity.getMainArm() == HumanoidArm.RIGHT) { + this.rightArm.xRot = f1 * -1.8F; + this.leftArm.xRot = 0.0F; + this.rightArm.zRot = -0.2F; + } else { + this.rightArm.xRot = 0.0F; + this.leftArm.xRot = f1 * -1.8F; + this.leftArm.zRot = 0.2F; + } + this.cowbody.xRot = ((float) Math.PI / 2F) - f1 * (float) Math.PI * 0.2F; + this.leg3.xRot -= f1 * (float) Math.PI * 0.3F; + this.leg4.xRot -= f1 * (float) Math.PI * 0.3F; + } + } +} diff --git a/src/main/java/twilightforest/client/model/entity/legacy/MinotaurLegacyModel.java b/src/main/java/twilightforest/client/model/entity/legacy/MinotaurLegacyModel.java new file mode 100644 index 0000000000..e9c455e846 --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/legacy/MinotaurLegacyModel.java @@ -0,0 +1,55 @@ +package twilightforest.client.model.entity.legacy; + +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.*; +import net.minecraft.util.Mth; +import twilightforest.entity.monster.Minotaur; + +public class MinotaurLegacyModel extends HumanoidModel { + + public MinotaurLegacyModel(ModelPart root) { + super(root); + } + + public static LayerDefinition create() { + MeshDefinition mesh = HumanoidModel.createMesh(CubeDeformation.NONE, 0); + PartDefinition partRoot = mesh.getRoot(); + + var head = partRoot.addOrReplaceChild("head", CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-4.0F, -8.0F, -4.0F, 8.0F, 8.0F, 8.0F), + PartPose.offset(0.0F, 0.0F, 0.0F)); + + partRoot.addOrReplaceChild("hat", CubeListBuilder.create(), + PartPose.ZERO); + + head.addOrReplaceChild("snout", CubeListBuilder.create() + .texOffs(9, 12) + .addBox(-2.0F, -1.0F, -1.0F, 4, 3, 1), + PartPose.offset(0F, -2.0F, -4F)); + + var rightHorn = head.addOrReplaceChild("right_horn_1", CubeListBuilder.create() + .texOffs(24, 0) + .addBox(-5.5F, -1.5F, -1.5F, 5, 3, 3), + PartPose.offsetAndRotation(-2.5F, -6.5F, 0.0F, 0.0F, -25F / (180F / Mth.PI), 10F / (180F / Mth.PI))); + + rightHorn.addOrReplaceChild("right_horn_2", CubeListBuilder.create() + .texOffs(40, 0) + .addBox(-3.5F, -1.0F, -1.0F, 3, 2, 2), + PartPose.offsetAndRotation(-4.5F, 0.0F, 0.0F, 0.0F, -15F / (180F / Mth.PI), 45F / (180F / Mth.PI))); + + var leftHorn = head.addOrReplaceChild("left_horn_1", CubeListBuilder.create() + .texOffs(24, 0) + .addBox(0.5F, -1.5F, -1.5F, 5, 3, 3), + PartPose.offsetAndRotation(2.5F, -6.5F, 0.0F, 0.0F, 25F / (180F / Mth.PI), -10F / (180F / Mth.PI))); + + leftHorn.addOrReplaceChild("left_horn_2", CubeListBuilder.create() + .texOffs(40, 0) + .addBox(0.5F, -1.0F, -1.0F, 3, 2, 2), + PartPose.offsetAndRotation(4.5F, 0.0F, 0.0F, 0.0F, 15F / (180F / Mth.PI), -45F / (180F / Mth.PI))); + + return LayerDefinition.create(mesh, 64, 32); + } +} diff --git a/src/main/java/twilightforest/client/model/entity/legacy/NagaLegacyModel.java b/src/main/java/twilightforest/client/model/entity/legacy/NagaLegacyModel.java new file mode 100644 index 0000000000..3a45c75938 --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/legacy/NagaLegacyModel.java @@ -0,0 +1,68 @@ +package twilightforest.client.model.entity.legacy; + +import com.google.common.collect.ImmutableList; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.model.ListModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; +import net.minecraft.world.entity.Entity; +import twilightforest.entity.boss.Naga; +import twilightforest.entity.boss.NagaSegment; + +public class NagaLegacyModel extends ListModel { + + public final ModelPart head; + public ModelPart body; + private T entity; + + public NagaLegacyModel(ModelPart root) { + this.head = root.getChild("head"); + this.body = root.getChild("body"); + } + + public static LayerDefinition create() { + MeshDefinition mesh = new MeshDefinition(); + PartDefinition partRoot = mesh.getRoot(); + + partRoot.addOrReplaceChild("head", CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-8F, -12F, -8F, 16, 16, 16), + PartPose.ZERO); + + partRoot.addOrReplaceChild("body", CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-8F, -12F, -8F, 16, 16, 16), + PartPose.ZERO); + + return LayerDefinition.create(mesh, 64, 32); + } + + @Override + public Iterable parts() { + return ImmutableList.of(head, body); + } + + @Override + public void renderToBuffer(PoseStack stack, VertexConsumer builder, int light, int overlay, float red, float green, float blue, float scale) { + + //setRotationAngles(entity, limbSwing, limbSwingAmount, ageInTicks, netHeadYaw, headPitch, scale); + + if (entity instanceof Naga) { + head.render(stack, builder, light, overlay, red, green, blue, scale * 2); + } else if (entity instanceof NagaSegment) { + body.render(stack, builder, light, overlay, red, green, blue, scale * 2); + } else { + head.render(stack, builder, light, overlay, red, green, blue, scale * 2); + } + } + + @Override + public void setupAnim(T entity, float v, float v1, float v2, float v3, float v4) { + this.entity = entity; + } +} diff --git a/src/main/java/twilightforest/client/model/entity/legacy/PinchBeetleLegacyModel.java b/src/main/java/twilightforest/client/model/entity/legacy/PinchBeetleLegacyModel.java new file mode 100644 index 0000000000..4ba0fccc6f --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/legacy/PinchBeetleLegacyModel.java @@ -0,0 +1,244 @@ +// Date: 11/5/2012 7:35:56 PM +// Template version 1.1 +// Java generated by Techne +// Keep in mind that you still need to fill in some blanks +// - ZeuX +package twilightforest.client.model.entity.legacy; + +import net.minecraft.client.model.HierarchicalModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; +import net.minecraft.util.Mth; +import twilightforest.entity.monster.PinchBeetle; + +public class PinchBeetleLegacyModel extends HierarchicalModel { + + final ModelPart root; + final ModelPart head; + ModelPart leg6; + ModelPart leg4; + ModelPart leg2; + ModelPart leg5; + ModelPart leg3; + ModelPart leg1; + + ModelPart jaw1a; + ModelPart jaw2a; + + + public PinchBeetleLegacyModel(ModelPart root) { + this.root = root; + this.head = root.getChild("head"); + + this.leg1 = root.getChild("leg_1"); + this.leg2 = root.getChild("leg_2"); + this.leg3 = root.getChild("leg_3"); + this.leg4 = root.getChild("leg_4"); + this.leg5 = root.getChild("leg_5"); + this.leg6 = root.getChild("leg_6"); + + this.jaw1a = head.getChild("right_jaw_bottom"); + this.jaw2a = head.getChild("left_jaw_bottom"); + } + + public static LayerDefinition create() { + MeshDefinition mesh = new MeshDefinition(); + PartDefinition partRoot = mesh.getRoot(); + + var head = partRoot.addOrReplaceChild("head", CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-4F, -4F, -6F, 8, 6, 6), + PartPose.offset(0F, 19F, -5F)); + + head.addOrReplaceChild("right_antenna", CubeListBuilder.create() + .texOffs(42, 4) + .addBox(0F, -0.5F, -0.5F, 10, 1, 1), + PartPose.offsetAndRotation(1F, -3F, -5F, 0F, 1.047198F, -0.296706F)); + + head.addOrReplaceChild("left_antenna", CubeListBuilder.create() + .texOffs(42, 4) + .addBox(0F, -0.5F, -0.5F, 10, 1, 1), + PartPose.offsetAndRotation(-1F, -3F, -5F, 0F, 2.094395F, 0.296706F)); + + head.addOrReplaceChild("right_eye", CubeListBuilder.create() + .texOffs(15, 12) + .addBox(-1.5F, -1.5F, -1.5F, 3, 3, 3), + PartPose.offset(-3F, -2F, -5F)); + + head.addOrReplaceChild("left_eye", CubeListBuilder.create() + .texOffs(15, 12) + .addBox(-1.5F, -1.5F, -1.5F, 3, 3, 3), + PartPose.offset(3F, -2F, -5F)); + + var rightJaw = head.addOrReplaceChild("right_jaw_bottom", CubeListBuilder.create() + .texOffs(40, 6) + .addBox(-1F, -1F, -1.5F, 8, 2, 3), + PartPose.offsetAndRotation(-3F, 1F, -6F, 0F, 2.6354471F, 0F)); + + var rightJawTooth = rightJaw.addOrReplaceChild("right_jaw_top", CubeListBuilder.create() + .texOffs(40, 10) + .addBox(-1F, -1F, -1F, 10, 2, 2), + PartPose.offsetAndRotation(7F, 0F, 0F, 0F, -1.047197F, 0F)); + + rightJawTooth.addOrReplaceChild("right_tooth_1", CubeListBuilder.create() + .texOffs(0, 0) + .addBox(0F, -0.5F, -0F, 2, 1, 1), + PartPose.offsetAndRotation(9F, 0F, 0F, 0F, -0.5235987F, 0)); + + rightJawTooth.addOrReplaceChild("right_tooth_2", CubeListBuilder.create() + .texOffs(0, 0) + .addBox(0F, -0.5F, -0F, 2, 1, 1), + PartPose.offsetAndRotation(6F, 0F, 0F, 0F, 1.5707963F, 0)); + + rightJawTooth.addOrReplaceChild("right_tooth_3", CubeListBuilder.create() + .texOffs(0, 0) + .addBox(0F, -0.5F, -0F, 2, 1, 1), + PartPose.offsetAndRotation(3F, 0F, 0F, 0F, 1.5707963F, 0)); + + var leftJaw = head.addOrReplaceChild("left_jaw_bottom", CubeListBuilder.create() + .texOffs(40, 6) + .addBox(-1F, -1F, -1.5F, 8, 2, 3), + PartPose.offsetAndRotation(3F, 1F, -6F, 0F, 0.5410520F, 0F)); + + var leftJawTooth = leftJaw.addOrReplaceChild("left_jaw_top", CubeListBuilder.create() + .texOffs(40, 10) + .addBox(-1F, -1F, -1F, 10, 2, 2), + PartPose.offsetAndRotation(7F, 0F, 0F, 0F, 1.047197F, 0F)); + + leftJawTooth.addOrReplaceChild("left_tooth_1", CubeListBuilder.create() + .texOffs(0, 0) + .addBox(0F, -0.5F, -0F, 2, 1, 1), + PartPose.offsetAndRotation(9F, 0F, 0F, 0F, 0.5235987F, 0)); + + leftJawTooth.addOrReplaceChild("left_tooth_2", CubeListBuilder.create() + .texOffs(0, 0) + .addBox(0F, -0.5F, -0F, 2, 1, 1), + PartPose.offsetAndRotation(6F, 0F, 0F, 0F, -1.5707963F, 0)); + + leftJawTooth.addOrReplaceChild("left_tooth_3", CubeListBuilder.create() + .texOffs(0, 0) + .addBox(0F, -0.5F, -0F, 2, 1, 1), + PartPose.offsetAndRotation(3F, 0F, 0F, 0F, -1.5707963F, 0)); + + partRoot.addOrReplaceChild("thorax", CubeListBuilder.create() + .texOffs(0, 22) + .addBox(-4.5F, -4F, 0F, 9, 8, 2), + PartPose.offset(0F, 18F, -4.5F)); + + partRoot.addOrReplaceChild("connector_1", CubeListBuilder.create() + .texOffs(0, 12) + .addBox(-3F, -3F, 0F, 6, 6, 1), + PartPose.offset(0F, 18F, -3F)); + + partRoot.addOrReplaceChild("connector_2", CubeListBuilder.create() + .texOffs(0, 12) + .addBox(-3F, -3F, -1F, 6, 6, 1), + PartPose.offset(0F, 18F, -4F)); + + partRoot.addOrReplaceChild("rear", CubeListBuilder.create() + .texOffs(28, 14) + .addBox(-5F, -9F, -4F, 10, 10, 8), + PartPose.offsetAndRotation(0F, 18F, 7F, 1.570796F, 0F, 0F)); + + partRoot.addOrReplaceChild("leg_1", CubeListBuilder.create().mirror() + .texOffs(40, 0) + .addBox(-9F, -1F, -1F, 10, 2, 2), + PartPose.offsetAndRotation(-4F, 21F, 4F, 0F, 0.6981317F, -0.3490659F)); + + partRoot.addOrReplaceChild("leg_2", CubeListBuilder.create() + .texOffs(40, 0) + .addBox(-1F, -1F, -1F, 10, 2, 2), + PartPose.offsetAndRotation(4F, 21F, 4F, 0F, -0.6981317F, 0.3490659F)); + + partRoot.addOrReplaceChild("leg_3", CubeListBuilder.create().mirror() + .texOffs(40, 0) + .addBox(-9F, -1F, -1F, 10, 2, 2), + PartPose.offsetAndRotation(-4F, 21F, -1F, 0F, 0.2792527F, -0.3490659F)); + + partRoot.addOrReplaceChild("leg_4", CubeListBuilder.create() + .texOffs(40, 0) + .addBox(-1F, -1F, -1F, 10, 2, 2), + PartPose.offsetAndRotation(4F, 21F, -1F, 0F, -0.2792527F, 0.3490659F)); + + partRoot.addOrReplaceChild("leg_5", CubeListBuilder.create().mirror() + .texOffs(40, 0) + .addBox(-9F, -1F, -1F, 10, 2, 2), + PartPose.offsetAndRotation(-4F, 21F, -4F, 0F, -0.2792527F, -0.3490659F)); + + partRoot.addOrReplaceChild("leg_6", CubeListBuilder.create() + .texOffs(40, 0) + .addBox(-1F, -1F, -1F, 10, 2, 2), + PartPose.offsetAndRotation(4F, 21F, -4F, 0F, 0.2792527F, 0.3490659F)); + + return LayerDefinition.create(mesh, 64, 32); + } + + @Override + public ModelPart root() { + return this.root; + } + + @Override + public void setupAnim(PinchBeetle entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + this.head.yRot = netHeadYaw / (180F / (float) Math.PI); + this.head.xRot = headPitch / (180F / (float) Math.PI); + + float legZ = ((float) Math.PI / 11F); + this.leg1.zRot = -legZ; + this.leg2.zRot = legZ; + this.leg3.zRot = -legZ * 0.74F; + this.leg4.zRot = legZ * 0.74F; + this.leg5.zRot = -legZ; + this.leg6.zRot = legZ; + + float var9 = -0.0F; + float var10 = 0.3926991F; + this.leg1.yRot = var10 * 2.0F + var9; + this.leg2.yRot = -var10 * 2.0F - var9; + this.leg3.yRot = var10 + var9; + this.leg4.yRot = -var10 - var9; + this.leg5.yRot = -var10 * 2.0F + var9; + this.leg6.yRot = var10 * 2.0F - var9; + + float var11 = -(Mth.cos(limbSwing * 0.6662F * 2.0F + 0.0F) * 0.4F) * limbSwingAmount; + float var12 = -(Mth.cos(limbSwing * 0.6662F * 2.0F + (float) Math.PI) * 0.4F) * limbSwingAmount; + float var14 = -(Mth.cos(limbSwing * 0.6662F * 2.0F + ((float) Math.PI * 3F / 2F)) * 0.4F) * limbSwingAmount; + + float var15 = Math.abs(Mth.sin(limbSwing * 0.6662F + 0.0F) * 0.4F) * limbSwingAmount; + float var16 = Math.abs(Mth.sin(limbSwing * 0.6662F + (float) Math.PI) * 0.4F) * limbSwingAmount; + float var18 = Math.abs(Mth.sin(limbSwing * 0.6662F + ((float) Math.PI * 3F / 2F)) * 0.4F) * limbSwingAmount; + + this.leg1.yRot += var11; + this.leg2.yRot += -var11; + this.leg3.yRot += var12; + this.leg4.yRot += -var12; + this.leg5.yRot += var14; + this.leg6.yRot += -var14; + + this.leg1.zRot += var15; + this.leg2.zRot += -var15; + + this.leg3.zRot += var16; + this.leg4.zRot += -var16; + + this.leg5.zRot += var18; + this.leg6.zRot += -var18; + } + + @Override + public void prepareMobModel(PinchBeetle entity, float limbSwing, float limbSwingAmount, float partialTicks) { + if (entity.isVehicle()) { + // open jaws + this.jaw1a.yRot = 2.96705972839036F; + this.jaw2a.yRot = 0.3490658503988659F; + } else { + // close jaws + this.jaw1a.yRot = 2.356194490192345F; + this.jaw2a.yRot = 0.7853981633974483F; + } + } +} diff --git a/src/main/java/twilightforest/client/model/entity/legacy/QuestRamLegacyModel.java b/src/main/java/twilightforest/client/model/entity/legacy/QuestRamLegacyModel.java new file mode 100644 index 0000000000..8d819d64d5 --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/legacy/QuestRamLegacyModel.java @@ -0,0 +1,205 @@ +// Date: 5/18/2012 11:45:03 PM +// Template version 1.1 +// Java generated by Techne +// Keep in mind that you still need to fill in some blanks +// - ZeuX + +package twilightforest.client.model.entity.legacy; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.model.HierarchicalModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; +import net.minecraft.world.entity.animal.Sheep; +import net.minecraft.world.item.DyeColor; +import net.minecraft.util.Mth; +import twilightforest.entity.passive.QuestRam; + +import java.util.Arrays; + +public class QuestRamLegacyModel extends HierarchicalModel { + //root + public final ModelPart root; + //fields + ModelPart rearbody; + public ModelPart leg1; + public ModelPart haunch1; + public ModelPart leg2; + public ModelPart haunch2; + public ModelPart leg3; + public ModelPart haunch3; + public ModelPart leg4; + public ModelPart haunch4; + public ModelPart neck; + public final ModelPart head; + public ModelPart[] segments = new ModelPart[16]; + + int[] colorOrder = new int[]{0, 8, 7, 15, 14, 1, 4, 5, 13, 3, 9, 11, 10, 2, 6, 12}; + + public QuestRamLegacyModel(ModelPart root) { + this.root = root; + + this.head = root.getChild("head"); + this.neck = root.getChild("neck"); + this.rearbody = root.getChild("rear_body"); + this.haunch1 = root.getChild("right_front_haunch"); + this.leg1 = root.getChild("right_front_leg"); + this.haunch2 = root.getChild("left_front_haunch"); + this.leg2 = root.getChild("left_front_leg"); + this.haunch3 = root.getChild("right_back_haunch"); + this.leg3 = root.getChild("right_back_leg"); + this.haunch4 = root.getChild("left_back_haunch"); + this.leg4 = root.getChild("left_back_leg"); + Arrays.setAll(this.segments, (num) -> root.getChild(getSegmentName(num))); + for (int i = 0; i < 16; i++) { + segments[i].visible = false; + } + } + + public static LayerDefinition create() { + MeshDefinition mesh = new MeshDefinition(); + PartDefinition base = mesh.getRoot(); + + PartDefinition headpart = base.addOrReplaceChild("head", CubeListBuilder.create() + .texOffs(0, 70).addBox(-6F, -4.5F, -15F, 12, 9, 15) + .texOffs(0, 94).addBox(5F, -9F, -7F, 4, 4, 6) + .texOffs(20, 96).addBox(7F, -8F, -2F, 3, 4, 4) + .texOffs(34, 95).addBox(8F, -6F, 0F, 3, 6, 3) + .texOffs(46, 98).addBox(9.5F, -2F, -2F, 3, 3, 3) + .texOffs(58, 95).addBox(11F, 0F, -7F, 3, 3, 6) + .texOffs(76, 95).addBox(12F, -4F, -9F, 3, 6, 3) + .texOffs(88, 97).addBox(13F, -6F, -7F, 3, 3, 4) + .texOffs(0, 94).addBox(-9F, -9F, -7F, 4, 4, 6) + .texOffs(20, 96).addBox(-10F, -8F, -2F, 3, 4, 4) + .texOffs(34, 95).addBox(-11F, -6F, 0F, 3, 6, 3) + .texOffs(46, 98).addBox(-12.5F, -2F, -2F, 3, 3, 3) + .texOffs(58, 95).addBox(-14F, 0F, -7F, 3, 3, 6) + .texOffs(76, 95).addBox(-15F, -4F, -9F, 3, 6, 3) + .texOffs(88, 97).addBox(-16F, -6F, -7F, 3, 3, 4), + PartPose.offset(0F, -13F, -5F)); + headpart.addOrReplaceChild("nose", CubeListBuilder.create() + .texOffs(54, 73) + .addBox(-5.5F, -5F, -13F, 11, 9, 12), + PartPose.offsetAndRotation(0F, -7F, -1F, 0.5235988F, 0F, 0F)); + base.addOrReplaceChild("neck", CubeListBuilder.create() + .texOffs(66, 37) + .addBox(-5.5F, -8F, -8F, 11, 14, 12), + PartPose.offsetAndRotation(0F, -8F, -7F, 0.2617994F, 0F, 0F)); + base.addOrReplaceChild("front_body", CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-9F, -7.5F, -15F, 18, 15, 15), + PartPose.offset(0F, -1F, 2F)); + base.addOrReplaceChild("rear_body", CubeListBuilder.create() + .texOffs(0, 30) + .addBox(-9F, -7.5F, 0F, 18, 15, 15), + PartPose.offset(0F, -1F, 4F)); + base.addOrReplaceChild("right_front_haunch", CubeListBuilder.create() + .texOffs(90, 0) + .addBox(-3.5F, 0F, -6F, 7, 10, 10), + PartPose.offset(-6F, 2F, 13F)); + base.addOrReplaceChild("right_front_leg", CubeListBuilder.create() + .texOffs(66, 0) + .addBox(-3F, 10F, -3F, 6, 12, 6), + PartPose.offset(-6F, 2F, 13F)); + base.addOrReplaceChild("left_front_haunch", CubeListBuilder.create() + .texOffs(90, 0) + .addBox(-3.5F, 0F, -6F, 7, 10, 10), + PartPose.offset(6F, 2F, 13F)); + base.addOrReplaceChild("left_front_leg", CubeListBuilder.create() + .texOffs(66, 0) + .addBox(-3F, 10F, -3F, 6, 12, 6), + PartPose.offset(6F, 2F, 13F)); + base.addOrReplaceChild("right_back_haunch", CubeListBuilder.create() + .texOffs(90, 20) + .addBox(-3.5F, 0F, -4F, 7, 10, 7), + PartPose.offset(-6F, 1F, -8F)); + base.addOrReplaceChild("right_back_leg", CubeListBuilder.create() + .texOffs(66, 18) + .addBox(-3F, 10F, -3F, 6, 13, 6), + PartPose.offset(-6F, 1F, -8F)); + base.addOrReplaceChild("left_back_haunch", CubeListBuilder.create() + .texOffs(90, 20) + .addBox(-3.5F, 0F, -4F, 7, 10, 7), + PartPose.offset(6F, 1F, -8F)); + base.addOrReplaceChild("left_back_leg", CubeListBuilder.create() + .texOffs(66, 18) + .addBox(-3F, 10F, -3F, 6, 13, 6), + PartPose.offset(6F, 1F, -8F)); + + CubeListBuilder bodycube = CubeListBuilder.create() + .texOffs(0, 104) + .addBox(-9F, -7.5F, 0F, 18, 15, 2); + for (int i = 0; i < 16; i++) { + base.addOrReplaceChild(getSegmentName(i), bodycube, PartPose.offset(0F, -1F, 2F)); + } + + return LayerDefinition.create(mesh, 128, 128); + } + + private static String getSegmentName(int num) { + return "segment" + num; + } + + @Override + public ModelPart root() { + return this.root; + } + + @Override + public void renderToBuffer(PoseStack stack, VertexConsumer builder, int light, int overlay, float red, float green, float blue, float alpha) { + super.renderToBuffer(stack, builder, light, overlay, red, green, blue, alpha); + + for (int i = 0; i < 16; i++) { + final float[] dyeRgb = Sheep.getColorArray(DyeColor.byId(i)); + segments[i].render(stack, builder, light, overlay, dyeRgb[0], dyeRgb[1], dyeRgb[2], alpha); + } + } + + @Override + public void setupAnim(QuestRam entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + this.head.xRot = headPitch / (180F / (float) Math.PI); + this.head.yRot = netHeadYaw / (180F / (float) Math.PI); + + this.neck.yRot = this.head.yRot; + + this.leg1.xRot = Mth.cos(limbSwing * 0.6662F) * 1.4F * limbSwingAmount * 0.5F; + this.leg2.xRot = Mth.cos(limbSwing * 0.6662F + (float) Math.PI) * 1.4F * limbSwingAmount * 0.5F; + this.leg3.xRot = Mth.cos(limbSwing * 0.6662F + (float) Math.PI) * 1.4F * limbSwingAmount * 0.5F; + this.leg4.xRot = Mth.cos(limbSwing * 0.6662F) * 1.4F * limbSwingAmount * 0.5F; + this.haunch1.xRot = this.leg1.xRot; + this.haunch2.xRot = this.leg2.xRot; + this.haunch3.xRot = this.leg3.xRot; + this.haunch4.xRot = this.leg4.xRot; + } + + @Override + public void prepareMobModel(QuestRam entity, float limbSwing, float limbSwingAmount, float partialTicks) { + + // how many colors should we display? + int count = entity.countColorsSet(); + + this.rearbody.z = 2 + 2 * count; + this.leg1.z = 11 + 2 * count; + this.leg2.z = 11 + 2 * count; + this.haunch1.z = 11 + 2 * count; + this.haunch2.z = 11 + 2 * count; + + // set up the colors displayed in color order + int segmentOffset = 2; + for (int color : colorOrder) { + if (entity.isColorPresent(DyeColor.byId(color))) { + segments[color].visible = true; + segments[color].z = segmentOffset; + + segmentOffset += 2; + } else { + segments[color].visible = false; + } + } + } +} diff --git a/src/main/java/twilightforest/client/model/entity/legacy/RavenLegacyModel.java b/src/main/java/twilightforest/client/model/entity/legacy/RavenLegacyModel.java new file mode 100644 index 0000000000..a7151a535c --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/legacy/RavenLegacyModel.java @@ -0,0 +1,116 @@ +// Date: 4/28/2012 9:46:20 PM +// Template version 1.1 +// Java generated by Techne +// Keep in mind that you still need to fill in some blanks +// - ZeuX + +package twilightforest.client.model.entity.legacy; + +import net.minecraft.client.model.HierarchicalModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; +import net.minecraft.util.Mth; +import twilightforest.entity.passive.Raven; + +public class RavenLegacyModel extends HierarchicalModel { + final ModelPart root; + //fields + final ModelPart head; + ModelPart rightarm; + ModelPart leftarm; + ModelPart rightleg; + ModelPart leftleg; + + public RavenLegacyModel(ModelPart root) { + this.root = root; + + this.head = root.getChild("head"); + this.rightarm = root.getChild("right_wing"); + this.leftarm = root.getChild("left_wing"); + this.rightleg = root.getChild("right_leg"); + this.leftleg = root.getChild("left_leg"); + } + + public static LayerDefinition create() { + MeshDefinition mesh = new MeshDefinition(); + PartDefinition base = mesh.getRoot(); + + PartDefinition headpart = base.addOrReplaceChild("head", CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-1.5F, -1.5F, -3F, 3, 3, 3) + .mirror(), + PartPose.offset(0F, 18F, 0F)); + headpart.addOrReplaceChild("beak1", CubeListBuilder.create() + .texOffs(12, 0) + .addBox(-0.5F, -1F, -2F, 1, 1, 2), + PartPose.offsetAndRotation(0F, 0F, -2.5F, 0.2617994F, 0.0F, 0.0F)); + headpart.addOrReplaceChild("beak2", CubeListBuilder.create() + .texOffs(12, 0) + .addBox(-0.5F, 0F, -2F, 1, 1, 2), + PartPose.offsetAndRotation(0F, 0F, -2.5F, -0.2617994F, 0.0F, 0.0F)); + base.addOrReplaceChild("body", CubeListBuilder.create() + .texOffs(0, 6) + .addBox(-1.5F, 0F, -1F, 3, 4, 6), + PartPose.offsetAndRotation(0F, 17F, 1F, -0.5235988F, 0F, 0F)); + base.addOrReplaceChild("right_wing", CubeListBuilder.create() + .texOffs(0, 16) + .addBox(-1F, 0F, -1.5F, 1, 3, 6), + PartPose.offset(-1.5F, 18F, 1F)); + base.addOrReplaceChild("left_wing", CubeListBuilder.create() + .texOffs(0, 16) + .addBox(0F, 0F, -1.5F, 1, 3, 6), + PartPose.offset(1.5F, 18F, 1F)); + PartDefinition rightlegpart = base.addOrReplaceChild("right_leg", CubeListBuilder.create() + .texOffs(14, 16) + .addBox(0F, 0F, 0F, 1, 2, 1), + PartPose.offset(-1.5F, 21F, 1F)); + rightlegpart.addOrReplaceChild("right_foot", CubeListBuilder.create() + .texOffs(14, 20) + .addBox(0F, -1F, -2F, 1, 1, 2), + PartPose.offsetAndRotation(0F, 2F, 1F, 0.5235988F, 0F, 0F)); + PartDefinition leftlegpart = base.addOrReplaceChild("left_leg", CubeListBuilder.create() + .texOffs(14, 16) + .addBox(0F, 0F, 0F, 1, 2, 1), + PartPose.offset(0.5F, 21F, 1F)); + leftlegpart.addOrReplaceChild("left_foot", CubeListBuilder.create() + .texOffs(14, 20) + .addBox(0F, -1F, -2F, 1, 1, 2), + PartPose.offsetAndRotation(0F, 2F, 1F, 0.5235988F, 0F, 0F)); + base.addOrReplaceChild("tail", CubeListBuilder.create() + .texOffs(0, 25) + .addBox(-1.5F, -0.5F, 0F, 3, 1, 3), + PartPose.offsetAndRotation(0F, 21F, 4F, -0.5235988F, 0F, 0F)); + + return LayerDefinition.create(mesh, 32, 32); + } + + @Override + public ModelPart root() { + return this.root; + } + + @Override + public void setupAnim(Raven entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + head.xRot = headPitch / (180F / (float) Math.PI); + head.yRot = netHeadYaw / (180F / (float) Math.PI); + head.zRot = netHeadYaw > 5 ? -0.2617994F : 0; + + rightleg.xRot = Mth.cos(limbSwing * 0.6662F) * 1.4F * limbSwingAmount; + leftleg.xRot = Mth.cos(limbSwing * 0.6662F + (float) Math.PI) * 1.4F * limbSwingAmount; + + rightarm.zRot = ageInTicks; + leftarm.zRot = -ageInTicks; + + if (entity.isBirdLanded()) { + rightleg.y = 21; + leftleg.y = 21; + } else { + rightleg.y = 20F; + leftleg.y = 20F; + } + } +} diff --git a/src/main/java/twilightforest/client/model/entity/legacy/RedcapLegacyModel.java b/src/main/java/twilightforest/client/model/entity/legacy/RedcapLegacyModel.java new file mode 100644 index 0000000000..5b88037ca2 --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/legacy/RedcapLegacyModel.java @@ -0,0 +1,69 @@ +package twilightforest.client.model.entity.legacy; + +import net.minecraft.client.model.AnimationUtils; +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.*; +import net.minecraft.util.Mth; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.HumanoidArm; +import twilightforest.client.model.entity.FixedHumanoidModel; +import twilightforest.entity.monster.Redcap; + +public class RedcapLegacyModel extends FixedHumanoidModel { + + public RedcapLegacyModel(ModelPart root) { + super(root, 3.0F); + } + + public static LayerDefinition create() { + MeshDefinition mesh = HumanoidModel.createMesh(CubeDeformation.NONE, 0.0F); + PartDefinition partRoot = mesh.getRoot(); + + partRoot.addOrReplaceChild("head", CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-3.5F, -8.0F, -3.5F, 7.0F, 7.0F, 7.0F) + .texOffs(0, 0) + .addBox(-4.5F, -5.0F, -0.5F, 1.0F, 2.0F, 1.0F) + .texOffs(0, 0).mirror() + .addBox(-5.5F, -6.0F, -0.5F, 1.0F, 2.0F, 1.0F).mirror(false) + .texOffs(0, 0).mirror() + .addBox(3.5F, -5.0F, -0.5F, 1.0F, 2.0F, 1.0F).mirror(false) + .texOffs(0, 0) + .addBox(4.5F, -6.0F, -0.5F, 1.0F, 2.0F, 1.0F), + PartPose.offset(0.0F, 8.0F, 0.0F)); + + partRoot.addOrReplaceChild("hat", CubeListBuilder.create() + .texOffs(32, 0) + .addBox(-2.0F, -8.5F, -3.0F, 4.0F, 5.0F, 7.0F), + PartPose.offset(0.0F, 6.0F, 0.0F)); + + partRoot.addOrReplaceChild("body", CubeListBuilder.create() + .texOffs(12, 19) + .addBox(-4.0F, 1.0F, -2.0F, 8.0F, 9.0F, 4.0F), + PartPose.offset(0.0F, 5.0F, 0.0F)); + + partRoot.addOrReplaceChild("right_arm", CubeListBuilder.create() + .texOffs(36, 17).mirror() + .addBox(-3.0F, -1.0F, -1.5F, 3.0F, 12.0F, 3.0F).mirror(false), + PartPose.offset(-4.0F, 7.0F, 0.0F)); + + partRoot.addOrReplaceChild("left_arm", CubeListBuilder.create() + .texOffs(36, 17) + .addBox(0.0F, -1.0F, -1.5F, 3.0F, 12.0F, 3.0F), + PartPose.offset(4.0F, 7.0F, 0.0F)); + + partRoot.addOrReplaceChild("right_leg", CubeListBuilder.create() + .texOffs(0, 20).mirror() + .addBox(-1.5F, 0.0F, -1.5F, 3.0F, 9.0F, 3.0F).mirror(false), + PartPose.offset(-2.5F, 15.0F, 0.0F)); + + partRoot.addOrReplaceChild("left_leg", CubeListBuilder.create() + .texOffs(0, 20) + .addBox(-1.5F, 0.0F, -1.5F, 3.0F, 9.0F, 3.0F), + PartPose.offset(2.5F, 15.0F, 0.0F)); + + return LayerDefinition.create(mesh, 64, 32); + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/client/model/entity/legacy/SlimeBeetleLegacyModel.java b/src/main/java/twilightforest/client/model/entity/legacy/SlimeBeetleLegacyModel.java new file mode 100644 index 0000000000..51d82abe05 --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/legacy/SlimeBeetleLegacyModel.java @@ -0,0 +1,203 @@ +// Date: 11/5/2012 7:35:56 PM +// Template version 1.1 +// Java generated by Techne +// Keep in mind that you still need to fill in some blanks +// - ZeuX +package twilightforest.client.model.entity.legacy; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.model.HierarchicalModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; +import net.minecraft.util.Mth; +import twilightforest.entity.monster.SlimeBeetle; + +public class SlimeBeetleLegacyModel extends HierarchicalModel { + public final ModelPart root; + public final ModelPart head; + public ModelPart legFL; + public ModelPart legML; + public ModelPart legBL; + public ModelPart legFR; + public ModelPart legMR; + public ModelPart legBR; + public ModelPart slimeCube; + public ModelPart tail1; + public ModelPart tail2; + public ModelPart slimeCenter; + + public SlimeBeetleLegacyModel(ModelPart root) { + this.root = root; + + this.head = root.getChild("head"); + this.legFL = root.getChild("front_left_leg"); + this.legFR = root.getChild("front_right_leg"); + this.legML = root.getChild("middle_left_leg"); + this.legMR = root.getChild("middle_right_leg"); + this.legBL = root.getChild("back_left_leg"); + this.legBR = root.getChild("back_right_leg"); + this.tail1 = root.getChild("tail1"); + this.tail2 = tail1.getChild("tail2"); + + this.slimeCenter = tail2.getChild("slime_center"); + this.slimeCube = slimeCenter.getChild("slime_cube"); + } + + public static LayerDefinition create() { + MeshDefinition mesh = new MeshDefinition(); + PartDefinition base = mesh.getRoot(); + + PartDefinition headpart = base.addOrReplaceChild("head", CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-4F, -4F, -6F, 8, 6, 6), + PartPose.offset(0F, 19F, -5F)); + headpart.addOrReplaceChild("left_antenna", CubeListBuilder.create() + .texOffs(38, 4) + .addBox(0F, -0.5F, -0.5F, 12, 1, 1), + PartPose.offsetAndRotation(1F, -3F, -5F, 0F, 1.047198F, -0.296706F)); + headpart.addOrReplaceChild("right_antenna", CubeListBuilder.create() + .texOffs(38, 4) + .addBox(0F, -0.5F, -0.5F, 12, 1, 1), + PartPose.offsetAndRotation(-1F, -3F, -5F, 0F, 2.094395F, 0.296706F)); + headpart.addOrReplaceChild("left_eye", CubeListBuilder.create() + .texOffs(15, 12) + .addBox(-1.5F, -1.5F, -1.5F, 3, 3, 3), + PartPose.offset(3F, -2F, -5F)); + headpart.addOrReplaceChild("right_eye", CubeListBuilder.create() + .texOffs(15, 12) + .addBox(-1.5F, -1.5F, -1.5F, 3, 3, 3), + PartPose.offset(-3F, -2F, -5F)); + headpart.addOrReplaceChild("mouth", CubeListBuilder.create() + .texOffs(17, 12) + .addBox(-1F, -1F, -1F, 2, 2, 1), + PartPose.offset(0F, 1, -6F)); + base.addOrReplaceChild("body", CubeListBuilder.create() + .texOffs(31, 6) + .addBox(-4F, -11F, -4F, 8, 10, 8), + PartPose.offsetAndRotation(0F, 18F, 7F, 1.570796F, 0F, 0F)); + base.addOrReplaceChild("front_left_leg", CubeListBuilder.create() + .texOffs(40, 0) + .addBox(-1F, -1F, -1F, 10, 2, 2), + PartPose.offsetAndRotation(2F, 21F, -4F, 0F, 0.2792527F, 0.3490659F)); + base.addOrReplaceChild("front_right_leg", CubeListBuilder.create() + .texOffs(40, 0) + .addBox(-9F, -1F, -1F, 10, 2, 2) + .mirror(), + PartPose.offsetAndRotation(-2F, 21F, -4F, 0F, -0.2792527F, -0.3490659F)); + base.addOrReplaceChild("middle_left_leg", CubeListBuilder.create() + .texOffs(40, 0) + .addBox(-1F, -1F, -1F, 10, 2, 2), + PartPose.offsetAndRotation(2F, 21F, -1F, 0F, -0.2792527F, 0.3490659F)); + base.addOrReplaceChild("middle_right_leg", CubeListBuilder.create() + .texOffs(40, 0) + .addBox(-9F, -1F, -1F, 10, 2, 2) + .mirror(), + PartPose.offsetAndRotation(-2F, 21F, -1F, 0F, 0.2792527F, -0.3490659F)); + base.addOrReplaceChild("back_left_leg", CubeListBuilder.create() + .texOffs(40, 0) + .addBox(-1F, -1F, -1F, 10, 2, 2), + PartPose.offsetAndRotation(2F, 21F, 4F, 0F, -0.6981317F, 0.3490659F)); + base.addOrReplaceChild("back_right_leg", CubeListBuilder.create() + .texOffs(40, 0) + .addBox(-9F, -1F, -1F, 10, 2, 2) + .mirror(), + PartPose.offsetAndRotation(-2F, 21F, 4F, 0F, 0.6981317F, -0.3490659F)); + base.addOrReplaceChild("connector", CubeListBuilder.create() + .texOffs(0, 12) + .addBox(-3F, -3F, -1F, 6, 6, 1), + PartPose.offset(0F, 19F, -4F)); + PartDefinition tail1part = base.addOrReplaceChild("tail1", CubeListBuilder.create() + .texOffs(0, 20) + .addBox(-3F, -3F, -3F, 6, 6, 6), + PartPose.offset(0F, 19F, 9F)); + PartDefinition tail2part = tail1part.addOrReplaceChild("tail2", CubeListBuilder.create() + .texOffs(0, 20) + .addBox(-3F, -6F, -3F, 6, 6, 6), + PartPose.offset(0F, -3F, 2F)); + + var center = tail2part.addOrReplaceChild("slime_center", CubeListBuilder.create() + .texOffs(32, 24) + .addBox(-4F, -10F, -7F, 8, 8, 8), + PartPose.offset(0F, -6, 0)); + + center.addOrReplaceChild("slime_cube", CubeListBuilder.create() + .texOffs(0, 40) + .addBox(-6F, -12F, -9F, 12, 12, 12), + PartPose.offset(0F, 0, 0)); + + return LayerDefinition.create(mesh, 64, 64); + } + + @Override + public ModelPart root() { + return this.root; + } + + @Override + public void renderToBuffer(PoseStack stack, VertexConsumer builder, int light, int overlay, float red, float green, float blue, float alpha) { + this.slimeCube.visible = false; + root().render(stack, builder, light, overlay, red, green, blue, alpha); + } + + public void renderTail(PoseStack stack, VertexConsumer builder, int light, int overlay, float red, float green, float blue, float alpha) { + this.tail1.render(stack, builder, light, overlay, red, green, blue, alpha); + } + + @Override + public void setupAnim(SlimeBeetle entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + this.head.yRot = netHeadYaw / (180F / (float) Math.PI); + this.head.xRot = headPitch / (180F / (float) Math.PI); + + // legs! + float legZ = ((float) Math.PI / 11F); + this.legBR.zRot = -legZ; + this.legBL.zRot = legZ; + this.legMR.zRot = -legZ * 0.74F; + this.legML.zRot = legZ * 0.74F; + this.legFR.zRot = -legZ; + this.legFL.zRot = legZ; + + float var9 = -0.0F; + float var10 = 0.3926991F; + this.legBR.yRot = var10 * 2.0F + var9; + this.legBL.yRot = -var10 * 2.0F - var9; + this.legMR.yRot = var10 + var9; + this.legML.yRot = -var10 - var9; + this.legFR.yRot = -var10 * 2.0F + var9; + this.legFL.yRot = var10 * 2.0F - var9; + + float var11 = -(Mth.cos(limbSwing * 0.6662F * 2.0F + 0.0F) * 0.4F) * limbSwingAmount; + float var12 = -(Mth.cos(limbSwing * 0.6662F * 2.0F + (float) Math.PI) * 0.4F) * limbSwingAmount; + float var14 = -(Mth.cos(limbSwing * 0.6662F * 2.0F + ((float) Math.PI * 3F / 2F)) * 0.4F) * limbSwingAmount; + + float var15 = Math.abs(Mth.sin(limbSwing * 0.6662F + 0.0F) * 0.4F) * limbSwingAmount; + float var16 = Math.abs(Mth.sin(limbSwing * 0.6662F + (float) Math.PI) * 0.4F) * limbSwingAmount; + float var18 = Math.abs(Mth.sin(limbSwing * 0.6662F + ((float) Math.PI * 3F / 2F)) * 0.4F) * limbSwingAmount; + + this.legBR.yRot += var11; + this.legBL.yRot += -var11; + this.legMR.yRot += var12; + this.legML.yRot += -var12; + this.legFR.yRot += var14; + this.legFL.yRot += -var14; + + this.legBR.zRot += var15; + this.legBL.zRot += -var15; + + this.legMR.zRot += var16; + this.legML.zRot += -var16; + + this.legFR.zRot += var18; + this.legFL.zRot += -var18; + + // tail wiggle + this.tail1.xRot = Mth.cos(ageInTicks * 0.3335F) * 0.15F; + this.tail2.xRot = Mth.cos(ageInTicks * 0.4445F) * 0.20F; + this.slimeCenter.xRot = Mth.cos(ageInTicks * 0.5555F + 0.25F) * 0.25F; + } +} diff --git a/src/main/java/twilightforest/client/model/entity/legacy/SnowQueenLegacyModel.java b/src/main/java/twilightforest/client/model/entity/legacy/SnowQueenLegacyModel.java new file mode 100644 index 0000000000..7c4ff81b8d --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/legacy/SnowQueenLegacyModel.java @@ -0,0 +1,141 @@ +package twilightforest.client.model.entity.legacy; + +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.*; +import net.minecraft.util.Mth; +import twilightforest.entity.boss.SnowQueen; +import twilightforest.entity.boss.SnowQueen.Phase; + +public class SnowQueenLegacyModel extends HumanoidModel { + + public SnowQueenLegacyModel(ModelPart root) { + super(root); + } + + public static LayerDefinition create() { + MeshDefinition mesh = HumanoidModel.createMesh(CubeDeformation.NONE, 0); + PartDefinition partRoot = mesh.getRoot(); + + var head = partRoot.addOrReplaceChild("head", CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-4.0F, -8.0F, -4.0F, 8.0F, 8.0F, 8.0F), + PartPose.offset(0.0F, -4.0F, 0.0F)); + + partRoot.addOrReplaceChild("hat", CubeListBuilder.create(), + PartPose.ZERO); + + var crown = head.addOrReplaceChild("crown", CubeListBuilder.create(), + PartPose.ZERO); + + makeFrontCrown(crown, -1, -4, 10F, 0); + makeFrontCrown(crown, 0, 4, -10F, 1); + makeSideCrown(crown, -1, -4, 10F, 0); + makeSideCrown(crown, 0, 4, -10F, 1); + + partRoot.addOrReplaceChild("body", CubeListBuilder.create() + .texOffs(32, 0) + .addBox(-4.0F, 0.0F, -2.0F, 8, 23, 4), + PartPose.ZERO); + + partRoot.addOrReplaceChild("right_arm", CubeListBuilder.create() + .texOffs(16, 16) + .addBox(-2.0F, -2.0F, -1.5F, 3, 12, 3), + PartPose.offset(-5.0F, 2.0F, 0.0F)); + + partRoot.addOrReplaceChild("left_arm", CubeListBuilder.create() + .texOffs(16, 16) + .addBox(-1.0F, -2.0F, -1.3F, 3, 12, 3), + PartPose.offset(5.0F, 2.0F, 0.0F)); + + partRoot.addOrReplaceChild("right_leg", CubeListBuilder.create() + .texOffs(0, 16) + .addBox(-1.5F, 0.0F, -1.5F, 3, 12, 3), + PartPose.offset(-1.9F, 12.0F, 0.0F)); + + partRoot.addOrReplaceChild("left_leg", CubeListBuilder.create() + .texOffs(0, 16) + .addBox(-1.5F, 0.0F, -1.5F, 3, 12, 3), + PartPose.offset(1.9F, 12.0F, 0.0F)); + + return LayerDefinition.create(mesh, 64, 32); + } + + private static void makeSideCrown(PartDefinition parent, float spikeDepth, float crownX, float angle, int iteration) { + + var crownSide = parent.addOrReplaceChild("crown_side_" + iteration, CubeListBuilder.create() + .texOffs(28, 28) + .addBox(-3.5F, -0.5F, -0.5F, 7, 1, 1), + PartPose.offsetAndRotation(crownX, -6.0F, 0.0F, 0.0F, Mth.PI / 2.0F, 0.0F)); + + crownSide.addOrReplaceChild("spike_4", CubeListBuilder.create() + .texOffs(48, 27) + .addBox(-0.5F, -3.5F, spikeDepth, 1, 4, 1), + PartPose.offsetAndRotation(0.0F, 0.0F, 0.0F, angle * 1.5F / 180F * Mth.PI, 0.0F, 0.0F)); + + crownSide.addOrReplaceChild("spike_3l", CubeListBuilder.create() + .texOffs(52, 28) + .addBox(-0.5F, -2.5F, spikeDepth, 1, 3, 1), + PartPose.offsetAndRotation(-2.5F, 0.0F, 0.0F, angle / 180F * Mth.PI, 0.0F, -10F / 180F * Mth.PI)); + + crownSide.addOrReplaceChild("spike_3r", CubeListBuilder.create() + .texOffs(52, 28) + .addBox(-0.5F, -2.5F, spikeDepth, 1, 3, 1), + PartPose.offsetAndRotation(2.5F, 0.0F, 0.0F, angle / 180F * Mth.PI, 0.0F, 10F / 180F * Mth.PI)); + + } + + private static void makeFrontCrown(PartDefinition parent, float spikeDepth, float crownZ, float angle, int iteration) { + + var crownFront = parent.addOrReplaceChild("crown_front_" + iteration, CubeListBuilder.create() + .texOffs(28, 30) + .addBox(-4.5F, -0.5F, -0.5F, 9, 1, 1), + PartPose.offset(0.0F, -6.0F, crownZ)); + + crownFront.addOrReplaceChild("spike_4", CubeListBuilder.create() + .texOffs(48, 27) + .addBox(-0.5F, -3.5F, spikeDepth, 1, 4, 1), + PartPose.offsetAndRotation(0.0F, 0.0F, 0.0F, angle * 1.5F / 180F * Mth.PI, 0.0F, 0.0F)); + + crownFront.addOrReplaceChild("spike_3l", CubeListBuilder.create() + .texOffs(52, 28) + .addBox(-0.5F, -2.5F, spikeDepth, 1, 3, 1), + PartPose.offsetAndRotation(-2.5F, 0.0F, 0.0F, angle / 180F * Mth.PI, 0.0F, -10F / 180F * 3.14159F)); + + crownFront.addOrReplaceChild("spike_3r", CubeListBuilder.create() + .texOffs(52, 28) + .addBox(-0.5F, -2.5F, spikeDepth, 1, 3, 1), + PartPose.offsetAndRotation(2.5F, 0.0F, 0.0F, angle / 180F * Mth.PI, 0.0F, 10F / 180F * 3.14159F)); + + } + + @Override + public void setupAnim(SnowQueen entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + super.setupAnim(entity, limbSwing, limbSwingAmount, ageInTicks, netHeadYaw, headPitch); + + // in beam phase, arms forwards + if (entity.getCurrentPhase() == Phase.BEAM) { + if (entity.isBreathing()) { + float f6 = Mth.sin(this.attackTime * (float) Math.PI); + float f7 = Mth.sin((1.0F - (1.0F - this.attackTime) * (1.0F - this.attackTime)) * (float) Math.PI); + this.rightArm.zRot = 0.0F; + this.leftArm.zRot = 0.0F; + this.rightArm.yRot = -(0.1F - f6 * 0.6F); + this.leftArm.yRot = 0.1F - f6 * 0.6F; + this.rightArm.xRot = -((float) Math.PI / 2F); + this.leftArm.xRot = -((float) Math.PI / 2F); + this.rightArm.xRot -= f6 * 1.2F - f7 * 0.4F; + this.leftArm.xRot -= f6 * 1.2F - f7 * 0.4F; + this.rightArm.zRot += Mth.cos(ageInTicks * 0.09F) * 0.05F + 0.05F; + this.leftArm.zRot -= Mth.cos(ageInTicks * 0.09F) * 0.05F + 0.05F; + this.rightArm.xRot += Mth.sin(ageInTicks * 0.067F) * 0.05F; + this.leftArm.xRot -= Mth.sin(ageInTicks * 0.067F) * 0.05F; + } else { + // arms up + this.rightArm.xRot += Math.PI; + this.leftArm.xRot += Math.PI; + } + } + } +} diff --git a/src/main/java/twilightforest/client/model/entity/legacy/SquirrelLegacyModel.java b/src/main/java/twilightforest/client/model/entity/legacy/SquirrelLegacyModel.java new file mode 100644 index 0000000000..c41851f130 --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/legacy/SquirrelLegacyModel.java @@ -0,0 +1,119 @@ +// Date: 4/27/2012 9:49:06 PM +// Template version 1.1 +// Java generated by Techne +// Keep in mind that you still need to fill in some blanks +// - ZeuX + +package twilightforest.client.model.entity.legacy; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.Iterables; +import net.minecraft.client.model.QuadrupedModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.*; +import net.minecraft.util.Mth; +import twilightforest.entity.passive.Squirrel; + +public class SquirrelLegacyModel extends QuadrupedModel { + //fields + final ModelPart tail; + ModelPart fluff1; + ModelPart fluff2; + ModelPart fluff3; + + public SquirrelLegacyModel(ModelPart root) { + super(root, false, 4.0F, 4.0F, 2.0F, 2.0F, 24); + this.tail = root.getChild("tail"); + this.fluff1 = tail.getChild("fluff_1"); + this.fluff2 = fluff1.getChild("fluff_2"); + this.fluff3 = fluff2.getChild("fluff_3"); + } + + public static LayerDefinition create() { + MeshDefinition mesh = QuadrupedModel.createBodyMesh(0, CubeDeformation.NONE); + PartDefinition partRoot = mesh.getRoot(); + + partRoot.addOrReplaceChild("head", CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-2F, -5F, -3F, 4, 4, 4) + .texOffs(16, 0) + .addBox(-2F, -6F, -0.5F, 1, 1, 1) + .texOffs(16, 0) + .addBox(1F, -6F, -0.5F, 1, 1, 1), + PartPose.offset(0F, 22F, -2F)); + + var body = partRoot.addOrReplaceChild("body", CubeListBuilder.create().mirror() + .texOffs(0, 8) + .addBox(-2F, -1F, -2F, 4, 3, 5), + PartPose.offset(0F, 21F, 0F)); + + partRoot.addOrReplaceChild("right_hind_leg", CubeListBuilder.create().mirror() + .texOffs(0, 16) + .addBox(0F, 0F, 0F, 1, 1, 1), + PartPose.offset(-2F, 23F, 2F)); + + partRoot.addOrReplaceChild("left_hind_leg", CubeListBuilder.create().mirror() + .texOffs(0, 16) + .addBox(0F, 0F, 0F, 1, 1, 1), + PartPose.offset(1F, 23F, 2F)); + + partRoot.addOrReplaceChild("right_front_leg", CubeListBuilder.create() + .texOffs(0, 16) + .addBox(0F, 0F, 0F, 1, 1, 1), + PartPose.offset(-2F, 23F, -2F)); + + partRoot.addOrReplaceChild("left_front_leg", CubeListBuilder.create() + .texOffs(0, 16) + .addBox(0F, 0F, 0F, 1, 1, 1), + PartPose.offset(1F, 23F, -2F)); + + var tail = partRoot.addOrReplaceChild("tail", CubeListBuilder.create() + .texOffs(0, 18) + .addBox(-0.5F, -1.5F, 0.5F, 1, 1, 1), + PartPose.offset(0F, 21F, 2F)); + + var fluff1 = tail.addOrReplaceChild("fluff_1", CubeListBuilder.create() + .texOffs(0, 20) + .addBox(-1.5F, -4F, 1F, 3, 3, 3), + PartPose.ZERO); + + var fluff2 = fluff1.addOrReplaceChild("fluff_2", CubeListBuilder.create() + .texOffs(0, 20) + .addBox(0F, -3F, -1.5F, 3, 3, 3), + PartPose.offset(-1.5F, -4F, 2.5F)); + + fluff2.addOrReplaceChild("fluff_3", CubeListBuilder.create() + .texOffs(0, 26) + .addBox(1.5F, -3F, -1.5F, 3, 3, 3), + PartPose.offset(-1.5F, -3F, 0F)); + + return LayerDefinition.create(mesh, 32, 32); + } + + @Override + protected Iterable bodyParts() { + return Iterables.concat(super.bodyParts(), ImmutableList.of(tail)); + } + + @Override + public void setupAnim(Squirrel entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + this.head.xRot = headPitch / (180F / (float) Math.PI); + this.head.yRot = netHeadYaw / (180F / (float) Math.PI); + this.rightHindLeg.xRot = Mth.cos(limbSwing * 0.6662F) * 1.4F * limbSwingAmount; + this.leftHindLeg.xRot = Mth.cos(limbSwing * 0.6662F + (float) Math.PI) * 1.4F * limbSwingAmount; + this.rightFrontLeg.xRot = Mth.cos(limbSwing * 0.6662F + (float) Math.PI) * 1.4F * limbSwingAmount; + this.leftFrontLeg.xRot = Mth.cos(limbSwing * 0.6662F) * 1.4F * limbSwingAmount; + + if (limbSwingAmount > 0.2) { + float wiggle = Math.min(limbSwingAmount, 0.6F); + this.tail.xRot = (Mth.cos(ageInTicks * 0.6662F) - (float) Math.PI / 3) * wiggle; + this.fluff2.xRot = Mth.cos(ageInTicks * 0.7774F) * 1.2F * wiggle; + this.fluff3.xRot = Mth.cos(ageInTicks * 0.8886F + (float) Math.PI / 2) * 1.4F * wiggle; + } else { + this.tail.xRot = 0.2F + Mth.cos(ageInTicks * 0.3335F) * 0.15F; + this.fluff2.xRot = 0.1F + Mth.cos(ageInTicks * 0.4445F) * 0.20F; + this.fluff3.xRot = 0.1F + Mth.cos(ageInTicks * 0.5555F) * 0.25F; + } + } +} diff --git a/src/main/java/twilightforest/client/model/entity/legacy/TinyBirdLegacyModel.java b/src/main/java/twilightforest/client/model/entity/legacy/TinyBirdLegacyModel.java new file mode 100644 index 0000000000..21264e2ebe --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/legacy/TinyBirdLegacyModel.java @@ -0,0 +1,148 @@ +// Date: 4/25/2012 10:28:13 PM +// Template version 1.1 +// Java generated by Techne +// Keep in mind that you still need to fill in some blanks +// - ZeuX + +package twilightforest.client.model.entity.legacy; + +import com.google.common.collect.ImmutableList; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.model.AgeableListModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; +import net.minecraft.util.Mth; +import twilightforest.entity.passive.TinyBird; + +public class TinyBirdLegacyModel extends AgeableListModel { + //fields + final ModelPart head; + ModelPart body; + ModelPart rightarm; + ModelPart leftarm; + ModelPart rightleg; + ModelPart leftleg; + ModelPart tail; + + public TinyBirdLegacyModel(ModelPart root) { + this.head = root.getChild("head"); + this.body = root.getChild("body"); + this.rightarm = root.getChild("right_arm"); + this.leftarm = root.getChild("left_arm"); + this.rightleg = root.getChild("right_leg"); + this.leftleg = root.getChild("left_leg"); + this.tail = root.getChild("tail"); + } + + public static LayerDefinition create() { + MeshDefinition mesh = new MeshDefinition(); + PartDefinition partRoot = mesh.getRoot(); + + var head = partRoot.addOrReplaceChild("head", CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-1.5F, -1.5F, -1.5F, 3, 3, 3), + PartPose.offset(0F, 20.5F, -0.5F)); + + head.addOrReplaceChild("beak", CubeListBuilder.create() + .texOffs(12, 0) + .addBox(-0.5F, -0.5F, -0.5F, 1, 1, 1), + PartPose.offset(0F, 0.5F, -2F)); + + partRoot.addOrReplaceChild("body", CubeListBuilder.create() + .texOffs(0, 6) + .addBox(-1.5F, 0F, -1F, 3, 3, 3), + PartPose.offset(0F, 20F, 0F)); + + partRoot.addOrReplaceChild("right_arm", CubeListBuilder.create() + .texOffs(12, 2) + .addBox(-1F, 0F, -1.5F, 1, 2, 3), + PartPose.offset(-1.5F, 20.5F, 1F)); + + partRoot.addOrReplaceChild("left_arm", CubeListBuilder.create().mirror() + .texOffs(12, 2) + .addBox(0F, 0F, -1.5F, 1, 2, 3), + PartPose.offset(1.5F, 20.5F, 1F)); + + partRoot.addOrReplaceChild("right_leg", CubeListBuilder.create() + .texOffs(0, 12) + .addBox(0F, 0F, 0F, 1, 1, 1), + PartPose.offset(-1.5F, 23F, 0F)); + + partRoot.addOrReplaceChild("left_leg", CubeListBuilder.create().mirror() + .texOffs(0, 12) + .addBox(0F, 0F, 0F, 1, 1, 1), + PartPose.offset(0F, 23F, 0F)); + + partRoot.addOrReplaceChild("tail", CubeListBuilder.create() + .texOffs(0, 14) + .addBox(-1.5F, -0.5F, 0F, 3, 1, 2), + PartPose.offset(0F, 22F, 2F)); + + return LayerDefinition.create(mesh, 32, 32); + } + + @Override + protected Iterable headParts() { + return ImmutableList.of(this.head); + } + + @Override + protected Iterable bodyParts() { + return ImmutableList.of( + head, + body, + rightleg, + leftleg, + rightarm, + leftarm, + tail + ); + } + + @Override + public void renderToBuffer(PoseStack stack, VertexConsumer builder, int light, int overlay, float red, float green, float blue, float scale) { + if (young) { + float f = 2.0F; + stack.pushPose(); + stack.translate(0.0F, 5F * scale, 0.75F * scale); + this.headParts().forEach((renderer) -> renderer.render(stack, builder, light, overlay, red, green, blue, scale)); + stack.popPose(); + stack.pushPose(); + stack.scale(1.0F / f, 1.0F / f, 1.0F / f); + stack.translate(0.0F, 24F * scale, 0.0F); + this.bodyParts().forEach((renderer) -> renderer.render(stack, builder, light, overlay, red, green, blue, scale)); + stack.popPose(); + } else { + this.headParts().forEach((renderer) -> renderer.render(stack, builder, light, overlay, red, green, blue, scale)); + this.bodyParts().forEach((renderer) -> renderer.render(stack, builder, light, overlay, red, green, blue, scale)); + } + } + + /** + * Sets the models various rotation angles. + */ + @Override + public void setupAnim(TinyBird entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + head.xRot = headPitch / (180F / (float) Math.PI); + head.yRot = netHeadYaw / (180F / (float) Math.PI); + + rightleg.xRot = Mth.cos(limbSwing * 0.6662F) * 1.4F * limbSwingAmount; + leftleg.xRot = Mth.cos(limbSwing * 0.6662F + (float) Math.PI) * 1.4F * limbSwingAmount; + + rightarm.zRot = ageInTicks; + leftarm.zRot = -ageInTicks; + + if (entity.isBirdLanded()) { + rightleg.y = 23; + leftleg.y = 23; + } else { + rightleg.y = 22.5F; + leftleg.y = 22.5F; + } + } +} diff --git a/src/main/java/twilightforest/client/model/entity/legacy/TrollLegacyModel.java b/src/main/java/twilightforest/client/model/entity/legacy/TrollLegacyModel.java new file mode 100644 index 0000000000..a53b88cc7a --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/legacy/TrollLegacyModel.java @@ -0,0 +1,113 @@ +package twilightforest.client.model.entity.legacy; + +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.*; +import net.minecraft.util.Mth; +import twilightforest.entity.monster.Troll; + +public class TrollLegacyModel extends HumanoidModel { + + public TrollLegacyModel(ModelPart root) { + super(root); + } + + public static LayerDefinition create() { + MeshDefinition mesh = HumanoidModel.createMesh(CubeDeformation.NONE, 0.0F); + PartDefinition partRoot = mesh.getRoot(); + + var head = partRoot.addOrReplaceChild("head", CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-5.0F, -8.0F, -3.0F, 10.0F, 10.0F, 10.0F), + PartPose.offset(0.0F, -9.0F, -6.0F)); + + partRoot.addOrReplaceChild("hat", CubeListBuilder.create(), + PartPose.ZERO); + + head.addOrReplaceChild("nose", CubeListBuilder.create() + .texOffs(0, 21) + .addBox(-2.0F, -2.0F, -2.0F, 4.0F, 8.0F, 4.0F), + PartPose.offset(0.0F, -2.0F, -4.0F)); + + partRoot.addOrReplaceChild("body", CubeListBuilder.create() + .texOffs(40, 0) + .addBox(-8.0F, 0.0F, -5.0F, 16.0F, 26.0F, 10.0F), + PartPose.offset(0.0F, -14.0F, 0.0F)); + + partRoot.addOrReplaceChild("right_arm", CubeListBuilder.create() + .texOffs(32, 36) + .addBox(-5.0F, -2.0F, -3.0F, 6.0F, 22.0F, 6.0F), + PartPose.offset(-9.0F, -9.0F, 0.0F)); + + partRoot.addOrReplaceChild("left_arm", CubeListBuilder.create().mirror() + .texOffs(32, 36) + .addBox(-1.0F, -2.0F, -3.0F, 6.0F, 22.0F, 6.0F), + PartPose.offset(9.0F, -9.0F, 0.0F)); + + partRoot.addOrReplaceChild("right_leg", CubeListBuilder.create() + .texOffs(0, 44) + .addBox(-3.0F, 0.0F, -4.0F, 6.0F, 12.0F, 8.0F), + PartPose.offset(-5.0F, 12.0F, 0.0F)); + + partRoot.addOrReplaceChild("left_leg", CubeListBuilder.create().mirror() + .texOffs(0, 44) + .addBox(-3.0F, 0.0F, -4.0F, 6.0F, 12.0F, 8.0F), + PartPose.offset(5.0F, 12.0F, 0.0F)); + + return LayerDefinition.create(mesh, 128, 64); + } + + @Override + public void setupAnim(Troll entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + this.head.yRot = netHeadYaw / (180F / (float) Math.PI); + this.head.xRot = headPitch / (180F / (float) Math.PI); + this.hat.yRot = this.head.yRot; + this.hat.xRot = this.head.xRot; + this.rightArm.xRot = Mth.cos(limbSwing * 0.6662F + (float) Math.PI) * 2.0F * limbSwingAmount * 0.5F; + this.leftArm.xRot = Mth.cos(limbSwing * 0.6662F) * 2.0F * limbSwingAmount * 0.5F; + this.rightArm.zRot = 0.0F; + this.leftArm.zRot = 0.0F; + this.rightLeg.xRot = Mth.cos(limbSwing * 0.6662F) * 1.4F * limbSwingAmount; + this.leftLeg.xRot = Mth.cos(limbSwing * 0.6662F + (float) Math.PI) * 1.4F * limbSwingAmount; + this.rightLeg.yRot = 0.0F; + this.leftLeg.yRot = 0.0F; + + if (entity.isVehicle()) { + // arms up! + this.rightArm.xRot += Math.PI; + this.leftArm.xRot += Math.PI; + + } + + if (this.leftArmPose != ArmPose.EMPTY) { + this.rightArm.xRot += Math.PI; + } + if (this.rightArmPose != ArmPose.EMPTY) { + this.leftArm.xRot += Math.PI; + } + + if (this.attackTime > 0F) { + float swing = 1.0F - this.attackTime; + + this.rightArm.xRot -= (Math.PI * swing); + this.leftArm.xRot -= (Math.PI * swing); + } + + this.rightArm.yRot = 0.0F; + this.leftArm.yRot = 0.0F; + + this.rightArm.zRot += Mth.cos(ageInTicks * 0.09F) * 0.05F + 0.05F; + this.leftArm.zRot -= Mth.cos(ageInTicks * 0.09F) * 0.05F + 0.05F; + this.rightArm.xRot += Mth.sin(ageInTicks * 0.067F) * 0.05F; + this.leftArm.xRot -= Mth.sin(ageInTicks * 0.067F) * 0.05F; + } + + @Override + public void prepareMobModel(Troll entity, float limbSwing, float limbSwingAmount, float partialTicks) { + if (entity.getTarget() != null) { + this.rightArm.xRot += Math.PI; + this.leftArm.xRot += Math.PI; + } + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/client/model/entity/legacy/UpperGoblinKnightLegacyModel.java b/src/main/java/twilightforest/client/model/entity/legacy/UpperGoblinKnightLegacyModel.java new file mode 100644 index 0000000000..e30d22908e --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/legacy/UpperGoblinKnightLegacyModel.java @@ -0,0 +1,217 @@ +package twilightforest.client.model.entity.legacy; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; +import net.minecraft.util.Mth; +import twilightforest.entity.monster.UpperGoblinKnight; + +public class UpperGoblinKnightLegacyModel extends HumanoidModel { + + public final ModelPart breastplate; + + public ModelPart shield; + public ModelPart spear; + + public UpperGoblinKnightLegacyModel(ModelPart root) { + super(root); + this.breastplate = root.getChild("breastplate"); + this.shield = leftArm.getChild("shield"); + this.spear = rightArm.getChild("spear"); + } + + public static LayerDefinition create() { + MeshDefinition mesh = new MeshDefinition(); + PartDefinition partRoot = mesh.getRoot(); + + partRoot.addOrReplaceChild("head", CubeListBuilder.create(), + PartPose.offset(0.0F, 12.0F, 0.0F)); + + var hat = partRoot.addOrReplaceChild("hat", CubeListBuilder.create(), + PartPose.offset(0.0F, 12.0F, 0.0F)); + + var helm = hat.addOrReplaceChild("helmet", CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-3.5F, -11.0F, -3.5F, 7, 11, 7), + PartPose.offsetAndRotation(0.0F, 0.0F, 0.0F, 0.0F, 45F / (180F / Mth.PI), 0.0F)); + + var rightHorn = hat.addOrReplaceChild("right_horn_1", CubeListBuilder.create() + .texOffs(28, 0) + .addBox(-6F, -1.5F, -1.5F, 7, 3, 3), + PartPose.offsetAndRotation(-3.5F, -9F, 0.0F, 0.0F, 15F / (180F / Mth.PI), 10F / (180F / Mth.PI))); + + rightHorn.addOrReplaceChild("right_horn_2", CubeListBuilder.create() + .texOffs(28, 6) + .addBox(-3.0F, -1.0F, -1.0F, 3, 2, 2), + PartPose.offsetAndRotation(-5.5F, 0.0F, 0.0F, 0.0F, 0.0F, 10F / (180F / Mth.PI))); + + var leftHorn = hat.addOrReplaceChild("left_horn_1", CubeListBuilder.create().mirror() + .texOffs(28, 0) + .addBox(-1F, -1.5F, -1.5F, 7, 3, 3), + PartPose.offsetAndRotation(3.5F, -9F, 0.0F, 0.0F, -15F / (180F / Mth.PI), -10F / (180F / Mth.PI))); + + leftHorn.addOrReplaceChild("left_horn_2", CubeListBuilder.create().mirror() + .texOffs(28, 6) + .addBox(0.0F, -1.0F, -1.0F, 3, 2, 2), + PartPose.offsetAndRotation(5.5F, 0.0F, 0.0F, 0.0F, 0.0F, -10F / (180F / Mth.PI))); + + partRoot.addOrReplaceChild("body", CubeListBuilder.create() + .texOffs(0, 18) + .addBox(-5.5F, 0.0F, -2.0F, 11, 8, 4) + .texOffs(30, 24) + .addBox(-6.5F, 0F, -2F, 1, 4, 4) + .texOffs(30, 24) + .addBox(5.5F, 0F, -2F, 1, 4, 4), + PartPose.offset(0.0F, 12.0F, 0.0F)); + + partRoot.addOrReplaceChild("breastplate", CubeListBuilder.create() + .texOffs(64, 0) + .addBox(-6.5F, 0.0F, -3.0F, 13, 12, 6), + PartPose.offset(0F, 11.5F, 0.0F)); + + var rightArm = partRoot.addOrReplaceChild("right_arm", CubeListBuilder.create() + .texOffs(44, 16) + .addBox(-4.0F, -2.0F, -2.0F, 4, 12, 4), + PartPose.offset(-6.5F, 14.0F, 0.0F)); + + rightArm.addOrReplaceChild("spear", CubeListBuilder.create() + .texOffs(108, 0) + .addBox(-1.0F, -19.0F, -1.0F, 2, 40, 2), + PartPose.offsetAndRotation(-2F, 8.5F, 0.0F, 90F / (180F / Mth.PI), 0.0F, 0.0F)); + + var leftArm = partRoot.addOrReplaceChild("left_arm", CubeListBuilder.create() + .texOffs(44, 16) + .addBox(0.0F, -2.0F, -2.0F, 4, 12, 4), + PartPose.offset(6.5F, 14.0F, 0.0F)); + + leftArm.addOrReplaceChild("shield", CubeListBuilder.create() + .texOffs(63, 36) + .addBox(-6.0F, -6.0F, -2.0F, 12, 20, 2), + PartPose.offsetAndRotation(0F, 12F, 0.0F, 90F / (180F / Mth.PI), 0.0F, 0.0F)); + + partRoot.addOrReplaceChild("right_leg", CubeListBuilder.create() + .texOffs(30, 16) + .addBox(-1.5F, 0.0F, -2.0F, 3, 4, 4), + PartPose.offset(-4F, 20.0F, 0.0F)); + + partRoot.addOrReplaceChild("left_leg", CubeListBuilder.create() + .texOffs(30, 16) + .addBox(-1.5F, 0.0F, -2.0F, 3, 4, 4), + PartPose.offset(4F, 20.0F, 0.0F)); + + return LayerDefinition.create(mesh, 128, 64); + } + + /** + * Sets the models various rotation angles then renders the model. + */ + @Override + public void renderToBuffer(PoseStack stack, VertexConsumer builder, int light, int overlay, float red, float green, float blue, float scale) { + super.renderToBuffer(stack, builder, light, overlay, red, green, blue, scale); + + this.breastplate.render(stack, builder, light, overlay, red, green, blue, scale); + } + + @Override + public void setupAnim(UpperGoblinKnight entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + boolean hasShield = entity.hasShield(); + + this.head.yRot = netHeadYaw / (180F / (float) Math.PI); + this.head.xRot = headPitch / (180F / (float) Math.PI); + this.head.zRot = 0; + this.hat.yRot = this.head.yRot; + this.hat.xRot = this.head.xRot; + this.hat.zRot = this.head.zRot; + + this.rightArm.xRot = Mth.cos(limbSwing * 0.6662F + (float) Math.PI) * 2.0F * limbSwingAmount * 0.5F; + + float leftConstraint = hasShield ? 0.2F : limbSwingAmount; + + if (entity.isShieldDisabled()) { + this.leftArm.zRot = ((float)(Math.cos((double)entity.tickCount * 3.25D) * Math.PI * (double)0.4F) * Mth.DEG_TO_RAD) - 0.4F; + } else { + this.leftArm.zRot = 0.0F; + } + + this.leftArm.xRot = Mth.cos(limbSwing * 0.6662F) * 2.0F * leftConstraint * 0.5F; + this.rightArm.zRot = 0.0F; + + this.rightLeg.xRot = Mth.cos(limbSwing * 0.6662F) * 1.4F * limbSwingAmount; + this.leftLeg.xRot = Mth.cos(limbSwing * 0.6662F + (float) Math.PI) * 1.4F * limbSwingAmount; + this.rightLeg.yRot = 0.0F; + this.leftLeg.yRot = 0.0F; + + if (this.riding) { + this.rightArm.xRot += -((float) Math.PI / 5F); + this.leftArm.xRot += -((float) Math.PI / 5F); + this.rightLeg.xRot = 0; + this.leftLeg.xRot = 0; +// this.bipedRightLeg.rotateAngleY = ((float)Math.PI / 10F); +// this.bipedLeftLeg.rotateAngleY = -((float)Math.PI / 10F); + } + + if (this.leftArmPose != ArmPose.EMPTY) { + this.leftArm.xRot = this.leftArm.xRot * 0.5F - ((float) Math.PI / 10F); + } + + this.rightArm.xRot = this.rightArm.xRot * 0.5F - ((float) Math.PI / 10F); + + rightArm.xRot -= (Math.PI * 0.66); + + // during swing move arm forward + if (entity.heavySpearTimer > 0) { + rightArm.xRot -= this.getArmRotationDuringSwing(60 - entity.heavySpearTimer) / (180F / (float) Math.PI); + } + + this.rightArm.yRot = 0.0F; + this.leftArm.yRot = 0.0F; + + this.rightArm.zRot += Mth.cos(ageInTicks * 0.09F) * 0.05F + 0.05F; + this.leftArm.zRot -= Mth.cos(ageInTicks * 0.09F) * 0.05F + 0.05F; + this.rightArm.xRot += Mth.sin(ageInTicks * 0.067F) * 0.05F; + this.leftArm.xRot -= Mth.sin(ageInTicks * 0.067F) * 0.05F; + + // shield arm points somewhat inward + this.leftArm.zRot = -this.leftArm.zRot; + + // fix shield so that it's always perpendicular to the floor + this.shield.xRot = (float) (Math.PI * 2 - this.leftArm.xRot); + + this.breastplate.visible = entity.hasArmor(); + this.shield.visible = entity.hasShield(); + } + + /** + * + */ + private float getArmRotationDuringSwing(float attackTime) { + if (attackTime <= 10) { + // rock back + return attackTime; + } + if (attackTime > 10 && attackTime <= 30) { + // hang back + return 10F; + } + if (attackTime > 30 && attackTime <= 33) { + // slam forward + return (attackTime - 30) * -8F + 10F; + } + if (attackTime > 33 && attackTime <= 50) { + // stay forward + return -15F; + } + if (attackTime > 50 && attackTime <= 60) { + // back to normal + return (10 - (attackTime - 50)) * -1.5F; + } + + return 0; + } +} diff --git a/src/main/java/twilightforest/client/model/entity/legacy/UrGhastLegacyModel.java b/src/main/java/twilightforest/client/model/entity/legacy/UrGhastLegacyModel.java new file mode 100644 index 0000000000..2674232190 --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/legacy/UrGhastLegacyModel.java @@ -0,0 +1,109 @@ +package twilightforest.client.model.entity.legacy; + +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; +import net.minecraft.util.Mth; +import twilightforest.TwilightForestMod; +import twilightforest.client.model.entity.TFGhastModel; +import twilightforest.entity.boss.UrGhast; + +public class UrGhastLegacyModel extends TFGhastModel { + + private final ModelPart[][] tentacles = new ModelPart[9][4]; + + public UrGhastLegacyModel(ModelPart root) { + super(root); + ModelPart body = root.getChild("body"); + + for (int i = 0; i < this.tentacles.length; i++) { + this.tentacles[i][0] = body.getChild("tentacle_" + i + ""); + this.tentacles[i][1] = this.tentacles[i][0].getChild("tentacle_" + i + "_extension"); + this.tentacles[i][2] = this.tentacles[i][1].getChild("tentacle_" + i + "_extension_2"); + this.tentacles[i][3] = this.tentacles[i][2].getChild("tentacle_" + i + "_tip"); + } + } + + public static LayerDefinition create() { + MeshDefinition mesh = new MeshDefinition(); + PartDefinition partRoot = mesh.getRoot(); + + var body = partRoot.addOrReplaceChild("body", CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-8.0F, -8.0F, -8.0F, 16, 16, 16), + PartPose.offset(0.0F, 8.0F, 0.0F)); + + for (int i = 0; i < 9; ++i) { + makeTentacle(body, "tentacle_" + i, i); + } + + return LayerDefinition.create(mesh, 64, 32); + } + + protected static void makeTentacle(PartDefinition parent, String name, int iteration) { + + var tentacleBase = parent.addOrReplaceChild(name, CubeListBuilder.create() + .addBox(-1.5F, 0.0F, -1.5F, 3, 5, 3), + switch (iteration) { + case 0 -> PartPose.offset(4.5F, 7, 4.5F); + case 1 -> PartPose.offset(-4.5F, 7, 4.5F); + case 2 -> PartPose.offset(0F, 7, 0F); + case 3 -> PartPose.offset(5.5F, 7, -4.5F); + case 4 -> PartPose.offset(-5.5F, 7, -4.5F); + case 5 -> PartPose.offsetAndRotation(-7.5F, 3.5F, -1F, 0F, 0F, Mth.PI / 4.0F); + case 6 -> PartPose.offsetAndRotation(-7.5F, -1.5F, 3.5F, 0F, 0F, Mth.PI / 3.0F); + case 7 -> PartPose.offsetAndRotation(7.5F, 3.5F, -1F, 0F, 0F, -Mth.PI / 4.0F); + case 8 -> PartPose.offsetAndRotation(7.5F, -1.5F, 3.5F, 0F, 0F, -Mth.PI / 3.0F); + default -> { + TwilightForestMod.LOGGER.warn("Out of bounds with Ur-Ghast Trophy limb creation: Iteration " + iteration); + yield PartPose.ZERO; + } + }); + + var tentacleExtension = tentacleBase.addOrReplaceChild(name + "_extension", CubeListBuilder.create() + .texOffs(0, 3) + .addBox(-1.5F, 1.0F, -1.5F, 3.0F, 4.0F, 3.0F), + PartPose.offset(0.0F, 4.0F, 0.0F)); + + var tentacleExtension2 = tentacleExtension.addOrReplaceChild(name + "_extension_2", CubeListBuilder.create() + .texOffs(0, 9) + .addBox(-1.5F, 1.0F, -1.5F, 3.0F, 4.0F, 3.0F), + PartPose.offset(0.0F, 4.0F, 0.0F)); + + tentacleExtension2.addOrReplaceChild(name + "_tip", CubeListBuilder.create() + .texOffs(0, 9) + .addBox(-1.5F, 1.0F, -1.5F, 3.0F, 4.0F, 3.0F), + PartPose.offset(0, 4, 0)); + + } + + @Override + public void setupAnim(UrGhast entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + super.setupAnim(entity, limbSwing, limbSwingAmount, ageInTicks, netHeadYaw, headPitch); + + // wave tentacles + for (int i = 0; i < this.tentacles.length; ++i) { + + float wiggle = Math.min(limbSwingAmount, 0.6F); + + float time = (ageInTicks + (i * 9)) / 2.0F; + + this.tentacles[i][0].xRot = (Mth.cos(time * 0.6662F) - (float) Math.PI / 3.0F) * wiggle; + this.tentacles[i][1].xRot = Mth.cos(time * 0.7774F) * 1.2F * wiggle; + this.tentacles[i][2].xRot = Mth.cos(time * 0.8886F + (float) Math.PI / 2.0F) * 1.4F * wiggle; + this.tentacles[i][3].xRot = Mth.cos(time * 0.9998F + (float) Math.PI / 4.0F) * 1.6F * wiggle; + + this.tentacles[i][0].xRot = 0.2F + Mth.cos(time * 0.3335F) * 0.15F; + this.tentacles[i][1].xRot = 0.1F + Mth.cos(time * 0.4445F) * 0.20F; + this.tentacles[i][2].xRot = 0.1F + Mth.cos(time * 0.5555F) * 0.25F; + this.tentacles[i][3].xRot = 0.1F + Mth.cos(time * 0.6665F) * 0.30F; + + float yTwist = 0.4F; + + this.tentacles[i][0].yRot = yTwist * Mth.sin(time * 0.3F); + } + } +} diff --git a/src/main/java/twilightforest/client/model/entity/legacy/package-info.java b/src/main/java/twilightforest/client/model/entity/legacy/package-info.java new file mode 100644 index 0000000000..7e8b6e22d4 --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/legacy/package-info.java @@ -0,0 +1,9 @@ +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault +@FieldsAreNonnullByDefault +package twilightforest.client.model.entity.legacy; + +import net.minecraft.FieldsAreNonnullByDefault; +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/client/model/entity/package-info.java b/src/main/java/twilightforest/client/model/entity/package-info.java new file mode 100644 index 0000000000..b9b10b2eb7 --- /dev/null +++ b/src/main/java/twilightforest/client/model/entity/package-info.java @@ -0,0 +1,9 @@ +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault +@FieldsAreNonnullByDefault +package twilightforest.client.model.entity; + +import net.minecraft.FieldsAreNonnullByDefault; +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/client/model/package-info.java b/src/main/java/twilightforest/client/model/package-info.java new file mode 100644 index 0000000000..dfbc99f30a --- /dev/null +++ b/src/main/java/twilightforest/client/model/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.client.model; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/client/model/tileentity/AlphaYetiTrophyModel.java b/src/main/java/twilightforest/client/model/tileentity/AlphaYetiTrophyModel.java new file mode 100644 index 0000000000..75211246a0 --- /dev/null +++ b/src/main/java/twilightforest/client/model/tileentity/AlphaYetiTrophyModel.java @@ -0,0 +1,138 @@ +package twilightforest.client.model.tileentity; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; + +public class AlphaYetiTrophyModel extends GenericTrophyModel { + public final ModelPart main; + + public final ModelPart leftHorn1; + public final ModelPart leftHorn1Top; + public final ModelPart leftHorn2; + public final ModelPart leftHorn2Top; + public final ModelPart leftHorn3; + public final ModelPart leftHorn3Top; + + public final ModelPart rightHorn1; + public final ModelPart rightHorn1Top; + public final ModelPart rightHorn2; + public final ModelPart rightHorn2Top; + public final ModelPart rightHorn3; + public final ModelPart rightHorn3Top; + + public AlphaYetiTrophyModel(ModelPart part) { + this.main = part.getChild("main"); + + this.leftHorn1 = this.main.getChild("left_horn_1"); + this.leftHorn1Top = this.leftHorn1.getChild("left_horn_1_top"); + this.leftHorn2 = this.main.getChild("left_horn_2"); + this.leftHorn2Top = this.leftHorn2.getChild("left_horn_2_top"); + this.leftHorn3 = this.main.getChild("left_horn_3"); + this.leftHorn3Top = this.leftHorn3.getChild("left_horn_3_top"); + + this.rightHorn1 = this.main.getChild("right_horn_1"); + this.rightHorn1Top = this.rightHorn1.getChild("right_horn_1_top"); + this.rightHorn2 = this.main.getChild("right_horn_2"); + this.rightHorn2Top = this.rightHorn2.getChild("right_horn_2_top"); + this.rightHorn3 = this.main.getChild("right_horn_3"); + this.rightHorn3Top = this.rightHorn3.getChild("right_horn_3_top"); + } + + public static LayerDefinition createHead() { + MeshDefinition meshdefinition = new MeshDefinition(); + PartDefinition partdefinition = meshdefinition.getRoot(); + + var main = partdefinition.addOrReplaceChild("main", + CubeListBuilder.create() + .texOffs(80, 0).addBox(-24.0F, -24.0F, -18.0F, 48.0F, 54.0F, 36.0F) + .texOffs(64, 0).addBox(8.0F, -20.0F, -19.5F, 12.0F, 12.0F, 2.0F) + .texOffs(121, 50).addBox(-17.0F, -8.0F, -19.5F, 34.0F, 29.0F, 2.0F) + .texOffs(64, 0).addBox(-20.0F, -20.0F, -19.5F, 12.0F, 12.0F, 2.0F), + PartPose.offset(0.0F, -6.0F, 0.0F)); + + main.addOrReplaceChild("left_horn_1", + CubeListBuilder.create() + .texOffs(0, 108).addBox(1.6981F, -10.9848F, -5.1743F, 10.0F, 10.0F, 10.0F), + PartPose.offsetAndRotation(22.0F, 6.0F, -1.0F, 0.0F, 0.5236F, 0.0873F)) + + .addOrReplaceChild("left_horn_1_top", + CubeListBuilder.create() + .texOffs(40, 108).addBox(0.4505F, -7.9433F, -4.3855F, 18.0F, 8.0F, 8.0F), + PartPose.offsetAndRotation(11.0F, -2.0F, 0.0F, 0.0F, 0.3491F, 0.0873F)); + + main.addOrReplaceChild("left_horn_2", + CubeListBuilder.create() + .texOffs(0, 108).addBox(0.8966F, -10.8637F, -4.4824F, 10.0F, 10.0F, 10.0F), + PartPose.offsetAndRotation(24.0F, -4.0F, -1.0F, 0.0F, 0.5236F, -0.2618F)) + + .addOrReplaceChild("left_horn_2_top", + CubeListBuilder.create() + .texOffs(40, 108).addBox(2.5764F, -8.5F, -2.8753F, 18.0F, 8.0F, 8.0F), + PartPose.offsetAndRotation(9.0F, -1.0F, 0.0F, 0.0F, 0.3491F, -0.2618F)); + + main.addOrReplaceChild("left_horn_3", + CubeListBuilder.create() + .texOffs(0, 108).addBox(1.9869F, -10.2766F, -3.8528F, 10.0F, 10.0F, 10.0F), + PartPose.offsetAndRotation(24.0F, -16.0F, -1.0F, 0.0F, 0.5236F, -0.6109F)) + + .addOrReplaceChild("left_horn_3_top", + CubeListBuilder.create() + .texOffs(40, 108).addBox(4.9031F, -5.5443F, -1.7225F, 18.0F, 8.0F, 8.0F), + PartPose.offsetAndRotation(8.0F, -2.0F, 0.0F, 0.0F, 0.3491F, -0.6109F)); + + main.addOrReplaceChild("right_horn_1", + CubeListBuilder.create().mirror() + .texOffs(0, 108).addBox(-11.6981F, -10.9848F, -5.1743F, 10.0F, 10.0F, 10.0F), + PartPose.offsetAndRotation(-22.0F, 6.0F, -1.0F, 0.0F, -0.5236F, -0.0873F)) + + .addOrReplaceChild("right_horn_1_top", + CubeListBuilder.create().mirror() + .texOffs(40, 108).addBox(-18.4505F, -7.9433F, -4.3855F, 18.0F, 8.0F, 8.0F), + PartPose.offsetAndRotation(-11.0F, -2.0F, 0.0F, 0.0F, -0.3491F, -0.0873F)); + + main.addOrReplaceChild("right_horn_2", + CubeListBuilder.create().mirror() + .texOffs(0, 108).addBox(-10.8966F, -10.8637F, -4.4824F, 10.0F, 10.0F, 10.0F), + PartPose.offsetAndRotation(-24.0F, -4.0F, -1.0F, 0.0F, -0.5236F, 0.2618F)) + + .addOrReplaceChild("right_horn_2_top", + CubeListBuilder.create().mirror() + .texOffs(40, 108).addBox(-20.5764F, -8.5F, -2.8753F, 18.0F, 8.0F, 8.0F), + PartPose.offsetAndRotation(-9.0F, -1.0F, 0.0F, 0.0F, -0.3491F, 0.2618F)); + + main.addOrReplaceChild("right_horn_3", + CubeListBuilder.create().mirror() + .texOffs(0, 108).addBox(-11.9869F, -10.2766F, -3.8528F, 10.0F, 10.0F, 10.0F), + PartPose.offsetAndRotation(-24.0F, -16.0F, -1.0F, 0.0F, -0.5236F, 0.6109F)) + + .addOrReplaceChild("right_horn_3_top", + CubeListBuilder.create().mirror() + .texOffs(40, 108).addBox(-22.9031F, -5.5443F, -1.7225F, 18.0F, 8.0F, 8.0F), + PartPose.offsetAndRotation(-8.0F, -2.0F, 0.0F, 0.0F, -0.3491F, 0.6109F)); + + return LayerDefinition.create(meshdefinition, 256, 128); + } + + @Override + public void setRotations(float x, float y, float z) { + this.main.yRot = y * ((float) Math.PI / 180F); + this.main.xRot = z * ((float) Math.PI / 180F); + } + + @Override + public void renderToBuffer(PoseStack matrixStack, VertexConsumer buffer, int packedLight, int packedOverlay, float red, float green, float blue, float alpha){ + this.main.render(matrixStack, buffer, packedLight, packedOverlay); + } + + public void setRotationAngle(ModelPart modelRenderer, float x, float y, float z) { + modelRenderer.xRot = x; + modelRenderer.yRot = y; + modelRenderer.zRot = z; + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/client/model/tileentity/GenericTrophyModel.java b/src/main/java/twilightforest/client/model/tileentity/GenericTrophyModel.java new file mode 100644 index 0000000000..98de0c729b --- /dev/null +++ b/src/main/java/twilightforest/client/model/tileentity/GenericTrophyModel.java @@ -0,0 +1,21 @@ +package twilightforest.client.model.tileentity; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.model.Model; +import net.minecraft.client.renderer.RenderType; + +//[VanillaCopy] of SkullModelBase, this is just so our trophies use it +public abstract class GenericTrophyModel extends Model { + + public GenericTrophyModel() { + super(RenderType::entityTranslucent); + } + + public abstract void setRotations(float x, float y, float z); + + public void renderHelmToBuffer(PoseStack matrix, VertexConsumer buffer, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) { + } + + public void openMouthForTrophy(float mouthOpen) {} +} diff --git a/src/main/java/twilightforest/client/model/tileentity/HydraTrophyModel.java b/src/main/java/twilightforest/client/model/tileentity/HydraTrophyModel.java new file mode 100644 index 0000000000..a896a8752e --- /dev/null +++ b/src/main/java/twilightforest/client/model/tileentity/HydraTrophyModel.java @@ -0,0 +1,66 @@ +package twilightforest.client.model.tileentity; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; + +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.*; + +public class HydraTrophyModel extends GenericTrophyModel { + + public final ModelPart head; + public ModelPart plate; + public ModelPart mouth; + + public HydraTrophyModel(ModelPart part) { + this.head = part.getChild("head"); + this.plate = this.head.getChild("plate"); + this.mouth = this.head.getChild("mouth"); + } + + public static LayerDefinition createHead() { + MeshDefinition meshdefinition = new MeshDefinition(); + PartDefinition partdefinition = meshdefinition.getRoot(); + + var head = partdefinition.addOrReplaceChild("head", + CubeListBuilder.create() + .texOffs(260, 64).addBox(-16.0F, -16.0F, -16.0F, 32.0F, 32.0F, 32.0F) + .texOffs(236, 128).addBox(-16.0F, -2.0F, -40.0F, 32.0F, 10.0F, 24.0F) + .texOffs(356, 70).addBox(-12.0F, 8.0F, -36.0F, 24.0F, 6.0F, 20.0F), + PartPose.ZERO); + + head.addOrReplaceChild("plate", + CubeListBuilder.create() + .texOffs(388, 0).addBox(-24.0F, -48.0F, 0.0F, 48.0F, 48.0F, 6.0F) + .texOffs(220, 0).addBox(-4.0F, -32.0F, -8.0F, 8.0F, 32.0F, 8.0F), + PartPose.rotation(-0.7853981633974483F, 0.0F, 0.0F)); + + head.addOrReplaceChild("mouth", + CubeListBuilder.create() + .texOffs(240, 162) + .addBox(-15.0F, -2.0F, -24.0F, 30.0F, 8.0F, 24.0F), + PartPose.offset(0.0F, 10.0F, -14.0F)); + + return LayerDefinition.create(meshdefinition, 512, 256); + } + + @Override + public void setRotations(float x, float y, float z) { + this.head.yRot = y * ((float) Math.PI / 180F); + this.head.xRot = z * ((float) Math.PI / 180F); + } + + public void openMouthForTrophy(float mouthOpen) { + this.head.yRot = 0; + this.head.xRot = 0; + + this.head.xRot -= (float) (mouthOpen * (Math.PI / 12.0)); + this.mouth.xRot = (float) (mouthOpen * (Math.PI / 3.0)); + } + + @Override + public void renderToBuffer(PoseStack matrix, VertexConsumer buffer, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) { + this.head.render(matrix, buffer, packedLight, packedOverlay, red, green, blue, alpha); + } +} diff --git a/src/main/java/twilightforest/client/model/tileentity/KnightPhantomTrophyModel.java b/src/main/java/twilightforest/client/model/tileentity/KnightPhantomTrophyModel.java new file mode 100644 index 0000000000..f9e4e36b72 --- /dev/null +++ b/src/main/java/twilightforest/client/model/tileentity/KnightPhantomTrophyModel.java @@ -0,0 +1,84 @@ +package twilightforest.client.model.tileentity; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; + +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.*; + +public class KnightPhantomTrophyModel extends GenericTrophyModel { + + public final ModelPart head; + public ModelPart helmet; + + public KnightPhantomTrophyModel(ModelPart part) { + this.head = part.getChild("head"); + this.helmet = part.getChild("helmet"); + } + + public static LayerDefinition createHead() { + MeshDefinition meshdefinition = new MeshDefinition(); + PartDefinition partdefinition = meshdefinition.getRoot(); + CubeDeformation deformation = new CubeDeformation(0.25F); + + partdefinition.addOrReplaceChild("head", + CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-4.0F, -8.0F, -4.0F, 8.0F, 8.0F, 8.0F), + PartPose.offset(0.0F, -4.0F, 0.0F)); + + var helm = partdefinition.addOrReplaceChild("helmet", + CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-4.0F, -8.0F, -4.0F, 8.0F, 8.0F, 8.0F, deformation), + PartPose.offset(0.0F, -4.0F, 0.0F)); + + var rightHorn = helm.addOrReplaceChild("right_horn_1", + CubeListBuilder.create() + .texOffs(24, 0) + .addBox(-5.5F, -1.5F, -1.5F, 5.0F, 3.0F, 3.0F, deformation), + PartPose.offsetAndRotation(-4.0F, -6.5F, 0.0F, + 0.0F, -25F / (180F / (float) Math.PI), 45F / (180F / (float) Math.PI))); + + rightHorn.addOrReplaceChild("right_horn_2", + CubeListBuilder.create() + .texOffs(54, 16) + .addBox(-3.5F, -1.0F, -1.0F, 3.0F, 2.0F, 2.0F, deformation), + PartPose.offsetAndRotation(-4.5F, 0.0F, 0.0F, + 0.0F, -15F / (180F / (float) Math.PI), 45F / (180F / (float) Math.PI))); + + var leftHorn = helm.addOrReplaceChild("left_horn_1", + CubeListBuilder.create().mirror() + .texOffs(24, 0) + .addBox(0.5F, -1.5F, -1.5F, 5.0F, 3.0F, 3.0F, deformation), + PartPose.offsetAndRotation(4.0F, -6.5F, 0.0F, + 0.0F, 25F / (180F / (float) Math.PI), -45F / (180F / (float) Math.PI))); + + leftHorn.addOrReplaceChild("left_horn_2", + CubeListBuilder.create() + .texOffs(54, 16) + .addBox(0.5F, -1.0F, -1.0F, 3.0F, 2.0F, 2.0F, deformation), + PartPose.offsetAndRotation(4.5F, 0.0F, 0.0F, + 0.0F, 15F / (180F / (float) Math.PI), -45F / (180F / (float) Math.PI))); + + return LayerDefinition.create(meshdefinition, 64, 32); + } + + @Override + public void setRotations(float x, float y, float z) { + this.head.yRot = y * ((float) Math.PI / 180F); + this.head.xRot = z * ((float) Math.PI / 180F); + this.helmet.xRot = this.head.xRot; + this.helmet.yRot = this.head.yRot; + } + + @Override + public void renderToBuffer(PoseStack matrix, VertexConsumer buffer, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) { + this.head.render(matrix, buffer, packedLight, packedOverlay, red, green, blue, alpha); + } + + public void renderHelmToBuffer(PoseStack matrix, VertexConsumer buffer, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) { + this.helmet.render(matrix, buffer, packedLight, packedOverlay, red, green, blue, alpha); + } +} diff --git a/src/main/java/twilightforest/client/model/tileentity/LichTrophyModel.java b/src/main/java/twilightforest/client/model/tileentity/LichTrophyModel.java new file mode 100644 index 0000000000..0f1f2cd078 --- /dev/null +++ b/src/main/java/twilightforest/client/model/tileentity/LichTrophyModel.java @@ -0,0 +1,49 @@ +package twilightforest.client.model.tileentity; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; + +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.*; + +public class LichTrophyModel extends GenericTrophyModel { + + public final ModelPart head; + public ModelPart crown; + + public LichTrophyModel(ModelPart part) { + this.head = part.getChild("head"); + this.crown = this.head.getChild("crown"); + } + + public static LayerDefinition createHead() { + MeshDefinition meshdefinition = new MeshDefinition(); + PartDefinition partdefinition = meshdefinition.getRoot(); + + var head = partdefinition.addOrReplaceChild("head", + CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-4F, -8F, -4F, 8, 8, 8), + PartPose.offset(0F, -4F, 0F)); + + head.addOrReplaceChild("crown", + CubeListBuilder.create() + .texOffs(32, 0) + .addBox(-4F, -8F, -4F, 8, 8, 8, new CubeDeformation(0.5F)), + PartPose.offset(0.0F, -4.0F, 0.0F)); + + return LayerDefinition.create(meshdefinition, 64, 64); + } + + @Override + public void setRotations(float x, float y, float z) { + this.head.yRot = y * ((float) Math.PI / 180F); + this.head.xRot = z * ((float) Math.PI / 180F); + } + + @Override + public void renderToBuffer(PoseStack matrix, VertexConsumer buffer, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) { + this.head.render(matrix, buffer, packedLight, packedOverlay, red, green, blue, alpha); + } +} diff --git a/src/main/java/twilightforest/client/model/tileentity/MinoshroomTrophyModel.java b/src/main/java/twilightforest/client/model/tileentity/MinoshroomTrophyModel.java new file mode 100644 index 0000000000..4e44df5ef5 --- /dev/null +++ b/src/main/java/twilightforest/client/model/tileentity/MinoshroomTrophyModel.java @@ -0,0 +1,49 @@ +package twilightforest.client.model.tileentity; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; + +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; + +public class MinoshroomTrophyModel extends GenericTrophyModel { + + public final ModelPart head; + + public MinoshroomTrophyModel(ModelPart part) { + this.head = part.getChild("head"); + } + + public static LayerDefinition createHead() { + MeshDefinition meshdefinition = new MeshDefinition(); + PartDefinition partdefinition = meshdefinition.getRoot(); + + partdefinition.addOrReplaceChild("head", + CubeListBuilder.create() + .texOffs(0, 0).addBox(-4.0F, -9.0F, -4.0F, 8.0F, 8.0F, 8.0F) + .texOffs(0, 16).addBox(-3.0F, -4.0F, -5.0F, 6.0F, 3.0F, 1.0F) + .texOffs(32, 0).addBox(-8.0F, -8.0F, -1.0F, 4.0F, 2.0F, 3.0F) + .texOffs(32, 5).addBox(-8.0F, -11.0F, -1.0F, 2.0F, 3.0F, 3.0F) + .texOffs(46, 0).addBox(4.0F, -8.0F, -1.0F, 4.0F, 2.0F, 3.0F) + .texOffs(46, 5).addBox(6.0F, -11.0F, -1.0F, 2.0F, 3.0F, 3.0F), + PartPose.offset(0.0F, -4.0F, 0.0F)); + + return LayerDefinition.create(meshdefinition, 64, 64); + } + + @Override + public void setRotations(float x, float y, float z) { + this.head.yRot = y * ((float) Math.PI / 180F); + this.head.xRot = z * ((float) Math.PI / 180F); + } + + @Override + public void renderToBuffer(PoseStack matrix, VertexConsumer buffer, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) { + matrix.translate(0.0F, .25F, 0.0F); + this.head.render(matrix, buffer, packedLight, packedOverlay, red, green, blue, alpha); + } +} diff --git a/src/main/java/twilightforest/client/model/tileentity/NagaTrophyModel.java b/src/main/java/twilightforest/client/model/tileentity/NagaTrophyModel.java new file mode 100644 index 0000000000..0a9f61cba3 --- /dev/null +++ b/src/main/java/twilightforest/client/model/tileentity/NagaTrophyModel.java @@ -0,0 +1,52 @@ +package twilightforest.client.model.tileentity; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; + +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; + +//This model doesnt require a legacy as the tongue will only show up in newer versions +public class NagaTrophyModel extends GenericTrophyModel { + public final ModelPart head; + public ModelPart tongue; + + public NagaTrophyModel(ModelPart part) { + this.head = part.getChild("head"); + this.tongue = this.head.getChild("tongue"); + } + + public static LayerDefinition createHead() { + MeshDefinition meshdefinition = new MeshDefinition(); + PartDefinition partdefinition = meshdefinition.getRoot(); + + var head = partdefinition.addOrReplaceChild("head", + CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-8.0F, -16.0F, -8.0F, 16.0F, 16.0F, 16.0F), + PartPose.offset(0.0F, -4.0F, 0.0F)); + + head.addOrReplaceChild("tongue", + CubeListBuilder.create() + .texOffs(42, 0) + .addBox(-3.0F, -3.0F, -14.0F, 6.0F, 0.0F, 6.0F), + PartPose.ZERO); + + return LayerDefinition.create(meshdefinition, 64, 32); + } + + @Override + public void setRotations(float x, float y, float z) { + this.head.yRot = y * ((float) Math.PI / 180F); + this.head.xRot = z * ((float) Math.PI / 180F); + } + + @Override + public void renderToBuffer(PoseStack matrix, VertexConsumer buffer, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) { + this.head.render(matrix, buffer, packedLight, packedOverlay, red, green, blue, alpha); + } +} diff --git a/src/main/java/twilightforest/client/model/tileentity/QuestRamTrophyModel.java b/src/main/java/twilightforest/client/model/tileentity/QuestRamTrophyModel.java new file mode 100644 index 0000000000..1afa5fe219 --- /dev/null +++ b/src/main/java/twilightforest/client/model/tileentity/QuestRamTrophyModel.java @@ -0,0 +1,54 @@ +package twilightforest.client.model.tileentity; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; + +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; + +public class QuestRamTrophyModel extends GenericTrophyModel { + + public ModelPart horns; + public final ModelPart head; + + public QuestRamTrophyModel(ModelPart part) { + this.head = part.getChild("head"); + this.horns = this.head.getChild("horns"); + } + + public static LayerDefinition createHead() { + MeshDefinition meshdefinition = new MeshDefinition(); + PartDefinition partdefinition = meshdefinition.getRoot(); + + var head = partdefinition.addOrReplaceChild("head", + CubeListBuilder.create() + .texOffs(74, 70).addBox(-6.0F, -4.0F, -10.0F, 12.0F, 8.0F, 15.0F) + .texOffs(42, 71).addBox(-6.0F, -7.0F, -6.0F, 12.0F, 3.0F, 11.0F), + PartPose.offset(0.0F, -4.0F, 0.0F)); + + head.addOrReplaceChild("horns", + CubeListBuilder.create() + .texOffs(64, 0).addBox(-9.0F, -6.0F, -1.0F, 4.0F, 10.0F, 10.0F) + .texOffs(48, 0).addBox(-13.0F, -6.0F, 5.0F, 4.0F, 4.0F, 4.0F) + .texOffs(92, 0).addBox(5.0F, -6.0F, -1.0F, 4.0F, 10.0F, 10.0F) + .texOffs(110, 0).addBox(9.0F, -6.0F, 5.0F, 4.0F, 4.0F, 4.0F), + PartPose.offsetAndRotation(0.0F, -4.0F, 0.0F, -0.4363323129985824F, 0.0F, 0.0F)); + + return LayerDefinition.create(meshdefinition, 128, 128); + } + + @Override + public void setRotations(float x, float y, float z) { + this.head.yRot = y * ((float) Math.PI / 180F); + this.head.xRot = z * ((float) Math.PI / 180F); + } + + @Override + public void renderToBuffer(PoseStack matrix, VertexConsumer buffer, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) { + this.head.render(matrix, buffer, packedLight, packedOverlay, red, green, blue, alpha); + } +} diff --git a/src/main/java/twilightforest/client/model/tileentity/SnowQueenTrophyModel.java b/src/main/java/twilightforest/client/model/tileentity/SnowQueenTrophyModel.java new file mode 100644 index 0000000000..493f33d350 --- /dev/null +++ b/src/main/java/twilightforest/client/model/tileentity/SnowQueenTrophyModel.java @@ -0,0 +1,76 @@ +package twilightforest.client.model.tileentity; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; + +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; + +public class SnowQueenTrophyModel extends GenericTrophyModel { + + public final ModelPart head; + public ModelPart crownFront; + public ModelPart crownBack; + public ModelPart crownRight; + public ModelPart crownLeft; + + public SnowQueenTrophyModel(ModelPart part) { + this.head = part.getChild("head"); + this.crownRight = this.head.getChild("crown_right"); + this.crownBack = this.head.getChild("crown_back"); + this.crownLeft = this.head.getChild("crown_left"); + this.crownFront = this.head.getChild("crown_front"); + + } + + public static LayerDefinition createHead() { + MeshDefinition meshdefinition = new MeshDefinition(); + PartDefinition partdefinition = meshdefinition.getRoot(); + + var head = partdefinition.addOrReplaceChild("head", + CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-4.0F, -8.0F, -4.0F, 8.0F, 8.0F, 8.0F), + PartPose.ZERO); + head.addOrReplaceChild("crown_right", + CubeListBuilder.create() + .texOffs(24, 4).addBox(-5.0F, -4.0F, 0.0F, 10.0F, 4.0F, 0.0F), + PartPose.offsetAndRotation(-4.0F, -6.0F, 0.0F, 0.39269908169872414F, 1.5707963267948966F, 0.0F)); + head.addOrReplaceChild("crown_back", + CubeListBuilder.create() + .texOffs(44, 0).addBox(-5.0F, -4.0F, 0.0F, 10.0F, 4.0F, 0.0F), + PartPose.offsetAndRotation(0.0F, -6.0F, 4.0F, -0.39269908169872414F, 0.0F, 0.0F) + ); + head.addOrReplaceChild("crown_left", + CubeListBuilder.create() + .texOffs(44, 4).addBox(-5.0F, -4.0F, 0.0F, 10.0F, 4.0F, 0.0F), + PartPose.offsetAndRotation(4.0F, -6.0F, 0.0F, -0.39269908169872414F, 1.5707963267948966F, 0.0F)); + head.addOrReplaceChild("crown_front", + CubeListBuilder.create() + .texOffs(24, 0).addBox(-5.0F, -4.0F, 0.0F, 10.0F, 4.0F, 0.0F), + PartPose.offsetAndRotation(0.0F, -6.0F, -4.0F, 0.39269908169872414F, 0.0F, 0.0F)); + + return LayerDefinition.create(meshdefinition, 64, 64); + } + + public void setRotateAngle(ModelPart modelRenderer, float x, float y, float z) { + modelRenderer.xRot = x; + modelRenderer.yRot = y; + modelRenderer.zRot = z; + } + + @Override + public void setRotations(float x, float y, float z) { + this.head.yRot = y * ((float) Math.PI / 180F); + this.head.xRot = z * ((float) Math.PI / 180F); + } + + @Override + public void renderToBuffer(PoseStack matrix, VertexConsumer buffer, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) { + this.head.render(matrix, buffer, packedLight, packedOverlay, red, green, blue, alpha); + } +} diff --git a/src/main/java/twilightforest/client/model/tileentity/UrGhastTrophyModel.java b/src/main/java/twilightforest/client/model/tileentity/UrGhastTrophyModel.java new file mode 100644 index 0000000000..5beecf7923 --- /dev/null +++ b/src/main/java/twilightforest/client/model/tileentity/UrGhastTrophyModel.java @@ -0,0 +1,110 @@ +package twilightforest.client.model.tileentity; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; + +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; +import net.minecraft.util.Mth; +import twilightforest.TwilightForestMod; + +public class UrGhastTrophyModel extends GenericTrophyModel { + + public final ModelPart body; + private final ModelPart[][] tentacles = new ModelPart[9][3]; + + public UrGhastTrophyModel(ModelPart part) { + this.body = part.getChild("body"); + + for (int i = 0; i < this.tentacles.length; i++) { + this.tentacles[i][0] = body.getChild("tentacle_" + i + "_base"); + this.tentacles[i][1] = this.tentacles[i][0].getChild("tentacle_" + i + "_extension"); + this.tentacles[i][2] = this.tentacles[i][1].getChild("tentacle_" + i + "_tip"); + } + } + + public static LayerDefinition createHead() { + MeshDefinition meshdefinition = new MeshDefinition(); + PartDefinition partdefinition = meshdefinition.getRoot(); + + var body = partdefinition.addOrReplaceChild("body", + CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-8.0F, -8.0F, -8.0F, 16.0F, 16.0F, 16.0F), + PartPose.offset(0.0F, 8.0F, 0.0F)); + + for (int i = 0; i < 9; ++i) { + makeTentacle(body, "tentacle_" + i, i); + } + + return LayerDefinition.create(meshdefinition, 64, 32); + } + + private static void makeTentacle(PartDefinition parent, String name, int iteration) { + var tentacleBase = parent.addOrReplaceChild(name + "_base", CubeListBuilder.create() + .addBox(-1.5F, 0.0F, -1.5F, 3.333F, 5.333F, 3.333F), + switch (iteration) { + case 0 -> PartPose.offset(4.5F, 7, 4.5F); + case 1 -> PartPose.offset(-4.5F, 7, 4.5F); + case 2 -> PartPose.offset(0F, 7, 0F); + case 3 -> PartPose.offset(5.5F, 7, -4.5F); + case 4 -> PartPose.offset(-5.5F, 7, -4.5F); + case 5 -> PartPose.offsetAndRotation(-7.5F, 3.5F, -1F, 0F, 0F, Mth.PI / 4.0F); + case 6 -> PartPose.offsetAndRotation(-7.5F, -1.5F, 3.5F, 0F, 0F, Mth.PI / 3.0F); + case 7 -> PartPose.offsetAndRotation(7.5F, 3.5F, -1F, 0F, 0F, -Mth.PI / 4.0F); + case 8 -> PartPose.offsetAndRotation(7.5F, -1.5F, 3.5F, 0F, 0F, -Mth.PI / 3.0F); + default -> { + TwilightForestMod.LOGGER.warn("Out of bounds with Ur-Ghast Trophy limb creation: Iteration " + iteration); + yield PartPose.ZERO; + } + }); + + var tentacleExtension = tentacleBase.addOrReplaceChild(name + "_extension", CubeListBuilder.create() + .texOffs(0, 3) + .addBox(-1.5F, -1.35F, -1.5F, 3.333F, 6.66F, 3.333F), + PartPose.offset(0, 6.66F, 0)); + + tentacleExtension.addOrReplaceChild(name + "_tip", CubeListBuilder.create() + .texOffs(0, 9) + .addBox(-1.5F, 1.3F, -1.5F, 3.333F, 4, 3.333F), + PartPose.offset(0, 4, 0)); + + } + + @Override + public void setRotations(float x, float y, float z) { + this.body.yRot = y * ((float) Math.PI / 180F); + this.body.xRot = z * ((float) Math.PI / 180F); + for (int i = 0; i < this.tentacles.length; ++i) { + + float wiggle = Math.min(x, 0.6F); + + float time = ((x * .35F) + (i * 9)) / 2.0F; + + this.tentacles[i][1].xRot = (Mth.cos(time * 0.6662F) - (float) Math.PI / 3.0F) * wiggle; + this.tentacles[i][2].xRot = Mth.cos(time * 0.7774F) * 1.2F * wiggle; + + this.tentacles[i][1].xRot = 0.2F + Mth.cos(time * 0.3335F) * 0.15F; + this.tentacles[i][2].xRot = 0.1F + Mth.cos(time * 0.4445F) * 0.20F; + + float yTwist = 0.4F; + + this.tentacles[i][0].xRot = 0.2F * Mth.sin(time * 0.3F + i) + 0.4F; + this.tentacles[i][0].yRot = yTwist * Mth.sin(time * 0.3F); + } + } + + public void setTranslate(PoseStack matrix, float x, float y, float z) { + matrix.translate(x, y, z); + } + + @Override + public void renderToBuffer(PoseStack matrix, VertexConsumer buffer, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) { + this.body.render(matrix, buffer, packedLight, packedOverlay, red, green, blue, alpha); + } + +} diff --git a/src/main/java/twilightforest/client/model/tileentity/legacy/HydraTrophyLegacyModel.java b/src/main/java/twilightforest/client/model/tileentity/legacy/HydraTrophyLegacyModel.java new file mode 100644 index 0000000000..ec5efeb45d --- /dev/null +++ b/src/main/java/twilightforest/client/model/tileentity/legacy/HydraTrophyLegacyModel.java @@ -0,0 +1,91 @@ +package twilightforest.client.model.tileentity.legacy; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; +import net.minecraft.util.Mth; +import twilightforest.client.model.tileentity.GenericTrophyModel; + +public class HydraTrophyLegacyModel extends GenericTrophyModel { + + public final ModelPart head; + public ModelPart jaw; + + public HydraTrophyLegacyModel(ModelPart root) { + this.head = root.getChild("head"); + this.jaw = head.getChild("jaw"); + } + + public static LayerDefinition create() { + MeshDefinition mesh = new MeshDefinition(); + PartDefinition partRoot = mesh.getRoot(); + + var head = partRoot.addOrReplaceChild("head", CubeListBuilder.create() + .texOffs(272, 0) + .addBox(-16.0F, -14.0F, -16.0F, 32, 24, 32) + .texOffs(272, 56) + .addBox(-15.0F, -2.0F, -40.0F, 30, 12, 24) + .texOffs(272, 132) + .addBox(-15.0F, 10.0F, -4.0F, 30, 8, 16) + .texOffs(128, 200) + .addBox(-2.0F, -30.0F, 4.0F, 4, 24, 24) + .texOffs(272, 156) + .addBox(-12.0F, 10.0F, -33.0F, 2, 5, 2) + .texOffs(272, 156) + .addBox(10.0F, 10.0F, -33.0F, 2, 5, 2) + .texOffs(280, 156) + .addBox(-8.0F, 9.0F, -33.0F, 16, 2, 2) + .texOffs(280, 160) + .addBox(-10.0F, 9.0F, -29.0F, 2, 2, 16) + .texOffs(280, 160) + .addBox(8.0F, 9.0F, -29.0F, 2, 2, 16), + PartPose.offset(-16.0F, 0.0F, 0.0F)); + + head.addOrReplaceChild("jaw", CubeListBuilder.create() + .texOffs(272, 92) + .addBox(-15.0F, 0.0F, -16.0F, 30, 8, 32) + .texOffs(272, 156) + .addBox(-10.0F, -5.0F, -15.0F, 2, 5, 2) + .texOffs(272, 156) + .addBox(8.0F, -5.0F, -15.0F, 2, 5, 2) + .texOffs(280, 156) + .addBox(-8.0F, -1.0F, -15.0F, 16, 2, 2) + .texOffs(280, 160) + .addBox(-10.0F, -1.0F, -9.0F, 2, 2, 16) + .texOffs(280, 160) + .addBox(8.0F, -1.0F, -9.0F, 2, 2, 16), + PartPose.offset(0.0F, 10.0F, -20.0F)); + + head.addOrReplaceChild("frill", CubeListBuilder.create() + .texOffs(272, 200) + .addBox(-24.0F, -48.0F, 16.0F, 48, 48, 4), + PartPose.offsetAndRotation(0.0F, 0.0F, -14.0F, -0.5235988F, 0.0F, 0.0F)); + + return LayerDefinition.create(mesh, 512, 256); + } + + @Override + public void setRotations(float x, float y, float z) { + this.head.yRot = y * Mth.DEG_TO_RAD; + this.head.xRot = z * Mth.DEG_TO_RAD; + } + + @Override + public void openMouthForTrophy(float mouthOpen) { + head.yRot = 0.0F; + head.xRot = 0.0F; + + head.xRot -= mouthOpen * (Mth.PI / 12.0F); + jaw.xRot = mouthOpen * (Mth.PI / 3.0F); + } + + @Override + public void renderToBuffer(PoseStack stack, VertexConsumer consumer, int light, int overlay, float red, float green, float blue, float alpha) { + this.head.render(stack, consumer, light, overlay, red, green, blue, alpha); + } +} diff --git a/src/main/java/twilightforest/client/model/tileentity/legacy/MinoshroomTrophyLegacyModel.java b/src/main/java/twilightforest/client/model/tileentity/legacy/MinoshroomTrophyLegacyModel.java new file mode 100644 index 0000000000..236a9d8c74 --- /dev/null +++ b/src/main/java/twilightforest/client/model/tileentity/legacy/MinoshroomTrophyLegacyModel.java @@ -0,0 +1,70 @@ +package twilightforest.client.model.tileentity.legacy; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.*; +import net.minecraft.util.Mth; +import twilightforest.client.model.tileentity.GenericTrophyModel; + +public class MinoshroomTrophyLegacyModel extends GenericTrophyModel { + + public final ModelPart head; + + public MinoshroomTrophyLegacyModel(ModelPart part) { + this.head = part.getChild("head"); + } + + public static LayerDefinition create() { + MeshDefinition mesh = new MeshDefinition(); + PartDefinition partRoot = mesh.getRoot(); + + var head = partRoot.addOrReplaceChild("head", CubeListBuilder.create() + .texOffs(96, 16) + .addBox(-4F, -8F, -4F, 8, 8, 8), + PartPose.offset(0F, -6F, -9F)); + + partRoot.addOrReplaceChild("hat", CubeListBuilder.create(), + PartPose.ZERO); + + head.addOrReplaceChild("snout", CubeListBuilder.create() + .texOffs(105, 28) + .addBox(-2, -1, -1, 4, 3, 1), + PartPose.offset(0F, -2.0F, -4F)); + + var rightHorn = head.addOrReplaceChild("right_horn_1", CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-5.5F, -1.5F, -1.5F, 5, 3, 3), + PartPose.offsetAndRotation(-2.5F, -6.5F, 0.0F, 0.0F, -25F / (180F / Mth.PI), 10F / (180F / Mth.PI) )); + + rightHorn.addOrReplaceChild("right_horn_2", CubeListBuilder.create() + .texOffs(16, 0) + .addBox(-3.5F, -1.0F, -1.0F, 3, 2, 2), + PartPose.offsetAndRotation(-4.5F, 0.0F, 0.0F, 0.0F, -15F / (180F / Mth.PI), 45F / (180F / Mth.PI))); + + var leftHorn = head.addOrReplaceChild("left_horn_1", CubeListBuilder.create().mirror() + .texOffs(0, 0) + .addBox(0.5F, -1.5F, -1.5F, 5, 3, 3), + PartPose.offsetAndRotation(2.5F, -6.5F, 0.0F, 0.0F, 25F / (180F / Mth.PI), -10F / (180F / Mth.PI) )); + + leftHorn.addOrReplaceChild("left_horn_2", CubeListBuilder.create() + .texOffs(16, 0) + .addBox(0.5F, -1.0F, -1.0F, 3, 2, 2), + PartPose.offsetAndRotation(4.5F, 0.0F, 0.0F, 0.0F, 15F / (180F / Mth.PI), -45F / (180F / Mth.PI))); + + return LayerDefinition.create(mesh, 128, 32); + } + + @Override + public void setRotations(float x, float y, float z) { + this.head.yRot = y * ((float) Math.PI / 180F); + this.head.xRot = z * ((float) Math.PI / 180F); + } + + @Override + public void renderToBuffer(PoseStack matrix, VertexConsumer buffer, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) { + matrix.translate(0.0F, .25F, 0.0F); + this.head.render(matrix, buffer, packedLight, packedOverlay, red, green, blue, alpha); + } +} diff --git a/src/main/java/twilightforest/client/model/tileentity/legacy/QuestRamTrophyLegacyModel.java b/src/main/java/twilightforest/client/model/tileentity/legacy/QuestRamTrophyLegacyModel.java new file mode 100644 index 0000000000..20fce0e1e8 --- /dev/null +++ b/src/main/java/twilightforest/client/model/tileentity/legacy/QuestRamTrophyLegacyModel.java @@ -0,0 +1,66 @@ +package twilightforest.client.model.tileentity.legacy; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; +import twilightforest.client.model.tileentity.GenericTrophyModel; + +public class QuestRamTrophyLegacyModel extends GenericTrophyModel { + + public final ModelPart head; + + public QuestRamTrophyLegacyModel(ModelPart root) { + this.head = root.getChild("head"); + } + + public static LayerDefinition create() { + MeshDefinition mesh = new MeshDefinition(); + PartDefinition partRoot = mesh.getRoot(); + + var head = partRoot.addOrReplaceChild("head", CubeListBuilder.create() + .texOffs(0, 70).addBox(-6F, -4.5F, -7F, 12, 9, 15) + .texOffs(0, 94).addBox(5F, -9F, 1F, 4, 4, 6) + .texOffs(20, 96).addBox(7F, -8F, 6F, 3, 4, 4) + .texOffs(34, 95).addBox(8F, -6F, 8F, 3, 6, 3) + .texOffs(46, 98).addBox(9.5F, -2F, 6F, 3, 3, 3) + .texOffs(58, 95).addBox(11F, 0F, 1F, 3, 3, 6) + .texOffs(76, 95).addBox(12F, -4F, -1F, 3, 6, 3) + .texOffs(88, 97).addBox(13F, -6F, 1F, 3, 3, 4) + .texOffs(0, 94).addBox(-9F, -9F, 1F, 4, 4, 6) + .texOffs(20, 96).addBox(-10F, -8F, 6F, 3, 4, 4) + .texOffs(34, 95).addBox(-11F, -6F, 8F, 3, 6, 3) + .texOffs(46, 98).addBox(-12.5F, -2F, 6F, 3, 3, 3) + .texOffs(58, 95).addBox(-14F, 0F, 1F, 3, 3, 6) + .texOffs(76, 95).addBox(-15F, -4F, -1F, 3, 6, 3) + .texOffs(88, 97).addBox(-16F, -6F, 1F, 3, 3, 4), + PartPose.offset(0F, -4F, -0F)); + + partRoot.addOrReplaceChild("neck", CubeListBuilder.create() + .texOffs(66, 37) + .addBox(-5.5F, -8F, 0F, 11, 14, 12), + PartPose.offsetAndRotation(0F, -8F, -7F, 0.2617994F, 0F, 0F)); + + head.addOrReplaceChild("nose", CubeListBuilder.create() + .texOffs(54, 73) + .addBox(-5.5F, -1F, -6F, 11, 9, 12), + PartPose.offsetAndRotation(0F, -7F, -1F, 0.5235988F, 0F, 0F)); + + return LayerDefinition.create(mesh, 128, 128); + } + + @Override + public void setRotations(float x, float y, float z) { + this.head.yRot = y * ((float) Math.PI / 180F); + this.head.xRot = z * ((float) Math.PI / 180F); + } + + @Override + public void renderToBuffer(PoseStack matrix, VertexConsumer buffer, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) { + this.head.render(matrix, buffer, packedLight, packedOverlay, red, green, blue, alpha); + } +} diff --git a/src/main/java/twilightforest/client/model/tileentity/legacy/SnowQueenTrophyLegacyModel.java b/src/main/java/twilightforest/client/model/tileentity/legacy/SnowQueenTrophyLegacyModel.java new file mode 100644 index 0000000000..147d0a78c6 --- /dev/null +++ b/src/main/java/twilightforest/client/model/tileentity/legacy/SnowQueenTrophyLegacyModel.java @@ -0,0 +1,100 @@ +package twilightforest.client.model.tileentity.legacy; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; +import net.minecraft.util.Mth; +import twilightforest.client.model.tileentity.GenericTrophyModel; + +public class SnowQueenTrophyLegacyModel extends GenericTrophyModel { + + public final ModelPart head; + + public SnowQueenTrophyLegacyModel(ModelPart root) { + this.head = root.getChild("head"); + } + + public static LayerDefinition create() { + MeshDefinition mesh = new MeshDefinition(); + PartDefinition partRoot = mesh.getRoot(); + + var head = partRoot.addOrReplaceChild("head", CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-4.0F, -8.0F, -4.0F, 8.0F, 8.0F, 8.0F), + PartPose.offset(0.0F, -4.0F, 0.0F)); + + var crown = head.addOrReplaceChild("crown", CubeListBuilder.create(), + PartPose.ZERO); + + makeFrontCrown(crown, -1, -4, 10F, 0); + makeFrontCrown(crown, 0, 4, -10F, 1); + makeSideCrown(crown, -1, -4, 10F, 0); + makeSideCrown(crown, 0, 4, -10F, 1); + + return LayerDefinition.create(mesh, 64, 32); + } + + private static void makeSideCrown(PartDefinition parent, float spikeDepth, float crownX, float angle, int iteration) { + + var crownSide = parent.addOrReplaceChild("crown_side_" + iteration, CubeListBuilder.create() + .texOffs(28, 28) + .addBox(-3.5F, -0.5F, -0.5F, 7, 1, 1), + PartPose.offsetAndRotation(crownX, -6.0F, 0.0F, 0.0F, Mth.PI / 2.0F, 0.0F)); + + crownSide.addOrReplaceChild("spike_4", CubeListBuilder.create() + .texOffs(48, 27) + .addBox(-0.5F, -3.5F, spikeDepth, 1, 4, 1), + PartPose.offsetAndRotation(0.0F, 0.0F, 0.0F, angle * 1.5F / 180F * Mth.PI, 0.0F, 0.0F)); + + crownSide.addOrReplaceChild("spike_3l", CubeListBuilder.create() + .texOffs(52, 28) + .addBox(-0.5F, -2.5F, spikeDepth, 1, 3, 1), + PartPose.offsetAndRotation(-2.5F, 0.0F, 0.0F, angle / 180F * Mth.PI, 0.0F, -10F / 180F * Mth.PI)); + + crownSide.addOrReplaceChild("spike_3r", CubeListBuilder.create() + .texOffs(52, 28) + .addBox(-0.5F, -2.5F, spikeDepth, 1, 3, 1), + PartPose.offsetAndRotation(2.5F, 0.0F, 0.0F, angle / 180F * Mth.PI, 0.0F, 10F / 180F * Mth.PI)); + + } + + private static void makeFrontCrown(PartDefinition parent, float spikeDepth, float crownZ, float angle, int iteration) { + + var crownFront = parent.addOrReplaceChild("crown_front_" + iteration, CubeListBuilder.create() + .texOffs(28, 30) + .addBox(-4.5F, -0.5F, -0.5F, 9, 1, 1), + PartPose.offset(0.0F, -6.0F, crownZ)); + + crownFront.addOrReplaceChild("spike_4", CubeListBuilder.create() + .texOffs(48, 27) + .addBox(-0.5F, -3.5F, spikeDepth, 1, 4, 1), + PartPose.offsetAndRotation(0.0F, 0.0F, 0.0F, angle * 1.5F / 180F * Mth.PI, 0.0F, 0.0F)); + + crownFront.addOrReplaceChild("spike_3l", CubeListBuilder.create() + .texOffs(52, 28) + .addBox(-0.5F, -2.5F, spikeDepth, 1, 3, 1), + PartPose.offsetAndRotation(-2.5F, 0.0F, 0.0F, angle / 180F * Mth.PI, 0.0F, -10F / 180F * 3.14159F)); + + crownFront.addOrReplaceChild("spike_3r", CubeListBuilder.create() + .texOffs(52, 28) + .addBox(-0.5F, -2.5F, spikeDepth, 1, 3, 1), + PartPose.offsetAndRotation(2.5F, 0.0F, 0.0F, angle / 180F * Mth.PI, 0.0F, 10F / 180F * 3.14159F)); + + } + + @Override + public void setRotations(float x, float y, float z) { + this.head.yRot = y * ((float) Math.PI / 180F); + this.head.xRot = z * ((float) Math.PI / 180F); + } + + @Override + public void renderToBuffer(PoseStack matrix, VertexConsumer buffer, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) { + this.head.render(matrix, buffer, packedLight, packedOverlay, red, green, blue, alpha); + } +} diff --git a/src/main/java/twilightforest/client/model/tileentity/legacy/UrGhastTrophyLegacyModel.java b/src/main/java/twilightforest/client/model/tileentity/legacy/UrGhastTrophyLegacyModel.java new file mode 100644 index 0000000000..7e10573752 --- /dev/null +++ b/src/main/java/twilightforest/client/model/tileentity/legacy/UrGhastTrophyLegacyModel.java @@ -0,0 +1,117 @@ +package twilightforest.client.model.tileentity.legacy; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; +import net.minecraft.util.Mth; +import twilightforest.TwilightForestMod; +import twilightforest.client.model.tileentity.GenericTrophyModel; + +public class UrGhastTrophyLegacyModel extends GenericTrophyModel { + + public final ModelPart body; + private final ModelPart[][] tentacles = new ModelPart[9][3]; + + public UrGhastTrophyLegacyModel(ModelPart root) { + this.body = root.getChild("body"); + + for (int i = 0; i < this.tentacles.length; i++) { + this.tentacles[i][0] = body.getChild("tentacle_" + i + "_base"); + this.tentacles[i][1] = this.tentacles[i][0].getChild("tentacle_" + i + "_extension"); + this.tentacles[i][2] = this.tentacles[i][1].getChild("tentacle_" + i + "_extension_2"); + this.tentacles[i][3] = this.tentacles[i][1].getChild("tentacle_" + i + "_tip"); + } + } + + public static LayerDefinition create() { + MeshDefinition mesh = new MeshDefinition(); + PartDefinition partRoot = mesh.getRoot(); + + var body = partRoot.addOrReplaceChild("body", CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-8.0F, -8.0F, -8.0F, 16, 16, 16), + PartPose.offset(0.0F, 8.0F, 0.0F)); + + for (int i = 0; i < 9; ++i) { + makeTentacle(body, "tentacle_" + i, i); + } + + return LayerDefinition.create(mesh, 64, 32); + } + + protected static void makeTentacle(PartDefinition parent, String name, int iteration) { + + var tentacleBase = parent.addOrReplaceChild(name + "_base", CubeListBuilder.create() + .addBox(-1.5F, 0.0F, -1.5F, 3, 5, 3), + switch (iteration) { + case 0 -> PartPose.offset(4.5F, 7, 4.5F); + case 1 -> PartPose.offset(-4.5F, 7, 4.5F); + case 2 -> PartPose.offset(0F, 7, 0F); + case 3 -> PartPose.offset(5.5F, 7, -4.5F); + case 4 -> PartPose.offset(-5.5F, 7, -4.5F); + case 5 -> PartPose.offsetAndRotation(-7.5F, 3.5F, -1F, 0F, 0F, Mth.PI / 4.0F); + case 6 -> PartPose.offsetAndRotation(-7.5F, -1.5F, 3.5F, 0F, 0F, Mth.PI / 3.0F); + case 7 -> PartPose.offsetAndRotation(7.5F, 3.5F, -1F, 0F, 0F, -Mth.PI / 4.0F); + case 8 -> PartPose.offsetAndRotation(7.5F, -1.5F, 3.5F, 0F, 0F, -Mth.PI / 3.0F); + default -> { + TwilightForestMod.LOGGER.warn("Out of bounds with Ur-Ghast Trophy limb creation: Iteration " + iteration); + yield PartPose.ZERO; + } + }); + + var tentacleExtension = tentacleBase.addOrReplaceChild(name + "_extension", CubeListBuilder.create() + .texOffs(0, 3) + .addBox(-1.5F, -0.5F, -1.5F, 3.0F, 4.0F, 3.0F), + PartPose.offset(0.0F, 4.0F, 0.0F)); + + var tentacleExtension2 = tentacleExtension.addOrReplaceChild(name + "_extension_2", CubeListBuilder.create() + .texOffs(0, 9) + .addBox(-1.5F, 1.3F, -1.5F, 3.0F, 4.0F, 3.0F), + PartPose.offset(0.0F, 4.0F, 0.0F)); + + tentacleExtension2.addOrReplaceChild(name + "_tip", CubeListBuilder.create() + .texOffs(0, 9) + .addBox(-1.5F, 1.3F, -1.5F, 3.0F, 4.0F, 3.0F), + PartPose.offset(0, 4, 0)); + + } + + @Override + public void setRotations(float x, float y, float z) { + this.body.yRot = y * ((float) Math.PI / 180F); + this.body.xRot = z * ((float) Math.PI / 180F); + for (int i = 0; i < this.tentacles.length; ++i) { + + float wiggle = Math.min(x, 0.6F); + + float time = ((x * .5F) + (i * 9)) / 2.0F; + + this.tentacles[i][0].xRot = (Mth.cos(time * 0.6662F) - (float) Math.PI / 3.0F) * wiggle; + this.tentacles[i][1].xRot = Mth.cos(time * 0.7774F) * 1.2F * wiggle; + this.tentacles[i][2].xRot = Mth.cos(time * 0.8886F + (float) Math.PI / 2.0F) * 1.4F * wiggle; + + this.tentacles[i][0].xRot = 0.2F + Mth.cos(time * 0.3335F) * 0.15F; + this.tentacles[i][1].xRot = 0.1F + Mth.cos(time * 0.4445F) * 0.20F; + this.tentacles[i][2].xRot = 0.1F + Mth.cos(time * 0.5555F) * 0.25F; + + float yTwist = 0.4F; + + this.tentacles[i][0].yRot = yTwist * Mth.sin(time * 0.3F); + } + } + + public void setTranslate(PoseStack matrix, float x, float y, float z) { + matrix.translate(x, y, z); + } + + @Override + public void renderToBuffer(PoseStack matrix, VertexConsumer buffer, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) { + this.body.render(matrix, buffer, packedLight, packedOverlay, red, green, blue, alpha); + } + +} diff --git a/src/main/java/twilightforest/client/model/tileentity/legacy/package-info.java b/src/main/java/twilightforest/client/model/tileentity/legacy/package-info.java new file mode 100644 index 0000000000..220b232f7b --- /dev/null +++ b/src/main/java/twilightforest/client/model/tileentity/legacy/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.client.model.tileentity.legacy; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/client/model/tileentity/package-info.java b/src/main/java/twilightforest/client/model/tileentity/package-info.java new file mode 100644 index 0000000000..d5fb59baa0 --- /dev/null +++ b/src/main/java/twilightforest/client/model/tileentity/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.client.model.tileentity; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/client/package-info.java b/src/main/java/twilightforest/client/package-info.java new file mode 100644 index 0000000000..235cff90eb --- /dev/null +++ b/src/main/java/twilightforest/client/package-info.java @@ -0,0 +1,6 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.client; + +import net.minecraft.MethodsReturnNonnullByDefault; +import javax.annotation.ParametersAreNonnullByDefault; diff --git a/src/main/java/twilightforest/client/particle/AnnihilateParticle.java b/src/main/java/twilightforest/client/particle/AnnihilateParticle.java new file mode 100644 index 0000000000..74052d0752 --- /dev/null +++ b/src/main/java/twilightforest/client/particle/AnnihilateParticle.java @@ -0,0 +1,86 @@ +package twilightforest.client.particle; + +import net.minecraft.client.particle.*; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.core.particles.SimpleParticleType; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +@OnlyIn(Dist.CLIENT) +public class AnnihilateParticle extends TextureSheetParticle { + + private final float initialParticleScale; + + public AnnihilateParticle(ClientLevel level, double x, double y, double z, double vx, double vy, double vz, float scale) { + super(level, x, y, z, 0.0D, 0.0D, 0.0D); + this.xd *= 0.1D; + this.yd *= 0.1D; + this.zd *= 0.1D; + this.xd += vx * 0.4D; + this.yd += vy * 0.4D; + this.zd += vz * 0.4D; + this.rCol = this.gCol = this.bCol = 1.0F; + this.quadSize *= 0.75F; + this.quadSize *= scale; + this.initialParticleScale = this.quadSize; + this.lifetime = (int) (60.0D / (Math.random() * 0.8D + 0.6D)); + this.lifetime = (int) (this.lifetime * scale); + this.hasPhysics = true; + } + + @Override + public ParticleRenderType getRenderType() { + return ParticleRenderType.PARTICLE_SHEET_OPAQUE; + } + + @Override + public void tick() { + this.xo = this.x; + this.yo = this.y; + this.zo = this.z; + + if (this.age++ >= this.lifetime) { + this.remove(); + } + + this.move(this.xd, this.yd, this.zd); + + this.xd *= 0.96D; + this.yd *= 0.96D; + this.zd *= 0.96D; + + if (this.onGround) { + this.xd *= 0.7D; + this.zd *= 0.7D; + } + + this.quadSize *= 0.97D; + + if (this.quadSize < 0.04F) { + this.remove(); + } + + float blacken = 0.985F; + + this.rCol *= blacken; + this.gCol *= blacken; + this.bCol *= blacken; + + } + + @Override + public int getLightColor(float partialTicks) { + return 240 | 240 << 16; + } + + @OnlyIn(Dist.CLIENT) + public record Factory(SpriteSet sprite) implements ParticleProvider { + + @Override + public Particle createParticle(SimpleParticleType type, ClientLevel level, double x, double y, double z, double xSpeed, double ySpeed, double zSpeed) { + AnnihilateParticle particle = new AnnihilateParticle(level, x, y, z, xSpeed, ySpeed, zSpeed, 0.75F); + particle.pickSprite(this.sprite); + return particle; + } + } +} diff --git a/src/main/java/twilightforest/client/particle/EntityTFAnnihilateFX.java b/src/main/java/twilightforest/client/particle/EntityTFAnnihilateFX.java deleted file mode 100644 index 8dda255f14..0000000000 --- a/src/main/java/twilightforest/client/particle/EntityTFAnnihilateFX.java +++ /dev/null @@ -1,99 +0,0 @@ -package twilightforest.client.particle; - -import net.minecraft.client.particle.EntityFX; -import net.minecraft.client.renderer.Tessellator; -import net.minecraft.world.World; -import twilightforest.item.ItemTFCubeOfAnnihilation; -import twilightforest.item.ItemTFIceBomb; -import twilightforest.item.TFItems; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -@SideOnly(Side.CLIENT) -public class EntityTFAnnihilateFX extends EntityFX -{ - float initialParticleScale; - - public EntityTFAnnihilateFX(World par1World, double par2, double par4, double par6, double par8, double par10, double par12) - { - this(par1World, par2, par4, par6, par8, par10, par12, 1.0F); - } - - public EntityTFAnnihilateFX(World par1World, double par2, double par4, double par6, double par8, double par10, double par12, float par14) - { - super(par1World, par2, par4, par6, 0.0D, 0.0D, 0.0D); - this.motionX *= 0.10000000149011612D; - this.motionY *= 0.10000000149011612D; - this.motionZ *= 0.10000000149011612D; - this.motionX += par8 * 0.4D; - this.motionY += par10 * 0.4D; - this.motionZ += par12 * 0.4D; - this.particleRed = this.particleGreen = this.particleBlue = 1.0F; - this.particleScale *= 0.75F; - this.particleScale *= par14; - this.initialParticleScale = this.particleScale; - this.particleMaxAge = (int)(60.0D / (Math.random() * 0.8D + 0.6D)); - this.particleMaxAge = (int)((float)this.particleMaxAge * par14); - this.noClip = false; - - this.setParticleIcon(((ItemTFCubeOfAnnihilation)TFItems.cubeOfAnnihilation).getAnnihilateIcon()); - - this.onUpdate(); - } - - public void renderParticle(Tessellator par1Tessellator, float par2, float par3, float par4, float par5, float par6, float par7) - { - super.renderParticle(par1Tessellator, par2, par3, par4, par5, par6, par7); - } - - /** - * Called to update the entity's position/logic. - */ - public void onUpdate() - { - this.prevPosX = this.posX; - this.prevPosY = this.posY; - this.prevPosZ = this.posZ; - - if (this.particleAge++ >= this.particleMaxAge) - { - this.setDead(); - } - - this.moveEntity(this.motionX, this.motionY, this.motionZ); - - this.motionX *= 0.9599999785423279D; - this.motionY *= 0.9599999785423279D; - this.motionZ *= 0.9599999785423279D; - //this.motionY -= 0.019999999552965164D; - - if (this.onGround) - { - this.motionX *= 0.699999988079071D; - this.motionZ *= 0.699999988079071D; - } - - this.particleScale *= 0.97D; - - if (this.particleScale < 0.4D) { - this.setDead(); - } - - float blacken = 0.985F; - - this.particleRed *= blacken; - this.particleGreen *= blacken; - this.particleBlue *= blacken; - - } - - public int getBrightnessForRender(float par1) - { - return 240 | 240 << 16; - } - - public int getFXLayer() - { - return 2; - } -} \ No newline at end of file diff --git a/src/main/java/twilightforest/client/particle/EntityTFBossTearFX.java b/src/main/java/twilightforest/client/particle/EntityTFBossTearFX.java deleted file mode 100644 index 3d16ffb7d3..0000000000 --- a/src/main/java/twilightforest/client/particle/EntityTFBossTearFX.java +++ /dev/null @@ -1,99 +0,0 @@ -package twilightforest.client.particle; - -import net.minecraft.client.particle.EntityFX; -import net.minecraft.client.renderer.Tessellator; -import net.minecraft.init.Blocks; -import net.minecraft.init.Items; -import net.minecraft.item.Item; -import net.minecraft.world.World; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -@SideOnly(Side.CLIENT) -public class EntityTFBossTearFX extends EntityFX -{ - public EntityTFBossTearFX(World par1World, double par2, double par4, double par6, Item par8Item) - { - super(par1World, par2, par4, par6, 0.0D, 0.0D, 0.0D); - this.setParticleIcon(par8Item.getIconFromDamage(0)); - this.particleRed = this.particleGreen = this.particleBlue = 1.0F; - this.particleGravity = Blocks.snow.blockParticleGravity * 2F; - this.particleScale = 16.0F; - - this.particleMaxAge = 20 + rand.nextInt(40); - } - - public EntityTFBossTearFX(World par1World, double par2, double par4, double par6, double par8, double par10, double par12, Item par14Item) - { - this(par1World, par2, par4, par6, par14Item); - this.motionX *= 0.10000000149011612D; - this.motionY *= 0.10000000149011612D; - this.motionZ *= 0.10000000149011612D; - this.motionX += par8; - this.motionY += par10; - this.motionZ += par12; - } - - public int getFXLayer() - { - return 2; - } - - /** - * Called to update the entity's position/logic. - */ - public void onUpdate() - { - super.onUpdate(); - - if (this.onGround && rand.nextBoolean()) - { - //worldObj.playSoundEffect(this.posX, this.posY + 1D, this.posZ, "random.fizz", 2.0F, 2.0F); - //worldObj.spawnParticle("lava", this.posX, this.posY, this.posZ, 0, 0, 0); - //worldObj.playAuxSFXAtEntity(null, 2001, (int)this.posX, (int)this.posY + 1, (int)this.posZ, 0); - //this.worldObj.playAuxSFXAtEntity((EntityPlayer)null, 2002, (int)this.posX, (int)this.posY, (int)this.posZ, 4037); - - worldObj.playSound(this.posX, this.posY + 1D, this.posZ, "random.glass", 0.5F, 1.0F, false); - - for (int var1 = 0; var1 < 50; ++var1) - { - double gaussX = rand.nextGaussian() * 0.1D; - double gaussY = rand.nextGaussian() * 0.2D; - double gaussZ = rand.nextGaussian() * 0.1D; - Item popItem = Items.ghast_tear; - - - worldObj.spawnParticle("iconcrack_" + Item.getIdFromItem(popItem), this.posX + rand.nextFloat() - rand.nextFloat(), this.posY + 0.5F, this.posZ + rand.nextFloat(), gaussX, gaussY, gaussZ); - } - this.setDead(); - } - } - - public void renderParticle(Tessellator par1Tessellator, float par2, float par3, float par4, float par5, float par6, float par7) - { - float f6 = ((float)this.particleTextureIndexX) / 16.0F; - float f7 = f6 + 0.015609375F * 4F; - float f8 = ((float)this.particleTextureIndexY) / 16.0F; - float f9 = f8 + 0.015609375F * 4F; - float f10 = 0.1F * this.particleScale; - - if (this.particleIcon != null) - { - f6 = this.particleIcon.getInterpolatedU(0); - f7 = this.particleIcon.getInterpolatedU(16.0F); - f8 = this.particleIcon.getInterpolatedV(0); - f9 = this.particleIcon.getInterpolatedV(16); - } - - float f11 = (float)(this.prevPosX + (this.posX - this.prevPosX) * (double)par2 - interpPosX); - float f12 = (float)(this.prevPosY + (this.posY - this.prevPosY) * (double)par2 - interpPosY); - float f13 = (float)(this.prevPosZ + (this.posZ - this.prevPosZ) * (double)par2 - interpPosZ); - float f14 = 1.0F; - par1Tessellator.setColorOpaque_F(f14 * this.particleRed, f14 * this.particleGreen, f14 * this.particleBlue); - par1Tessellator.addVertexWithUV((double)(f11 - par3 * f10 - par6 * f10), (double)(f12 - par4 * f10), (double)(f13 - par5 * f10 - par7 * f10), (double)f6, (double)f9); - par1Tessellator.addVertexWithUV((double)(f11 - par3 * f10 + par6 * f10), (double)(f12 + par4 * f10), (double)(f13 - par5 * f10 + par7 * f10), (double)f6, (double)f8); - par1Tessellator.addVertexWithUV((double)(f11 + par3 * f10 + par6 * f10), (double)(f12 + par4 * f10), (double)(f13 + par5 * f10 + par7 * f10), (double)f7, (double)f8); - par1Tessellator.addVertexWithUV((double)(f11 + par3 * f10 - par6 * f10), (double)(f12 - par4 * f10), (double)(f13 + par5 * f10 - par7 * f10), (double)f7, (double)f9); - } - -} diff --git a/src/main/java/twilightforest/client/particle/EntityTFFireflyFX.java b/src/main/java/twilightforest/client/particle/EntityTFFireflyFX.java deleted file mode 100644 index 2aecb26f68..0000000000 --- a/src/main/java/twilightforest/client/particle/EntityTFFireflyFX.java +++ /dev/null @@ -1,116 +0,0 @@ -// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov. -// Jad home page: http://www.kpdus.com/jad.html -// Decompiler options: packimports(3) braces deadcode - -package twilightforest.client.particle; - - -import net.minecraft.client.particle.EntityFX; -import net.minecraft.client.renderer.Tessellator; -import net.minecraft.world.World; - -import org.lwjgl.opengl.GL11; - - -// Referenced classes of package net.minecraft.src: -// EntityFX, World, Tessellator - -public class EntityTFFireflyFX extends EntityFX -{ - - public EntityTFFireflyFX(World world, double d, double d1, double d2, - float f, float f1, float f2) - { - this(world, d, d1, d2, 1.0F, f, f1, f2); - } - - public EntityTFFireflyFX(World world, double d, double d1, double d2, - float f, float f1, float f2, float f3) - { - super(world, d, d1, d2, 0.0D, 0.0D, 0.0D); - motionX *= 2.10000000149011612D; - motionY *= 2.10000000149011612D; - motionZ *= 2.10000000149011612D; - if(f1 == 0.0F) - { - f1 = 1.0F; - } - particleRed = particleGreen = 1.0F * f; - particleRed *= 0.9F; - particleBlue = 0.0F; - particleScale *= 1.0F; - particleScale *= f; - fireflyParticleScale = particleScale; - particleMaxAge = (int)(32D / (Math.random() * 0.80000000000000004D + 0.20000000000000001D)); - particleMaxAge *= f; - fireflyHalfLife = particleMaxAge / 2; - noClip = false; - } - - public void renderParticle(Tessellator par1Tessellator, float par2, float par3, float par4, float par5, float par6, float par7) - { - float f6 = (float)this.particleTextureIndexX / 16.0F; - float f7 = f6 + 0.0624375F; - float f8 = (float)this.particleTextureIndexY / 16.0F; - float f9 = f8 + 0.0624375F; - float f10 = 0.1F * this.particleScale; - - - particleScale = fireflyParticleScale; - GL11.glDisable(3008 /*GL_ALPHA_TEST*/); - GL11.glEnable(3042 /*GL_BLEND*/); - GL11.glColorMask(true, true, true, true); - GL11.glBlendFunc(770, 1); - GL11.glColor4f(1.0F, 1.0F, 1.0F, 0.5f); - - float f11 = (float)(this.prevPosX + (this.posX - this.prevPosX) * (double)par2 - interpPosX); - float f12 = (float)(this.prevPosY + (this.posY - this.prevPosY) * (double)par2 - interpPosY); - float f13 = (float)(this.prevPosZ + (this.posZ - this.prevPosZ) * (double)par2 - interpPosZ); - float f14 = 1.0F; - par1Tessellator.setColorRGBA_F(this.particleRed * f14, this.particleGreen * f14, this.particleBlue * f14, this.particleAlpha); - par1Tessellator.addVertexWithUV((double)(f11 - par3 * f10 - par6 * f10), (double)(f12 - par4 * f10), (double)(f13 - par5 * f10 - par7 * f10), (double)f7, (double)f9); - par1Tessellator.addVertexWithUV((double)(f11 - par3 * f10 + par6 * f10), (double)(f12 + par4 * f10), (double)(f13 - par5 * f10 + par7 * f10), (double)f7, (double)f8); - par1Tessellator.addVertexWithUV((double)(f11 + par3 * f10 + par6 * f10), (double)(f12 + par4 * f10), (double)(f13 + par5 * f10 + par7 * f10), (double)f6, (double)f8); - par1Tessellator.addVertexWithUV((double)(f11 + par3 * f10 - par6 * f10), (double)(f12 - par4 * f10), (double)(f13 + par5 * f10 - par7 * f10), (double)f6, (double)f9); - - GL11.glDisable(3042 /*GL_BLEND*/); - GL11.glEnable(3008 /*GL_ALPHA_TEST*/); - } - - - public void onUpdate() - { - prevPosX = posX; - prevPosY = posY; - prevPosZ = posZ; - if(particleAge++ >= particleMaxAge) - { - setDead(); - } - if (particleAge < fireflyHalfLife) - { - // get bigger - setParticleTextureIndex((particleAge * 8) / fireflyHalfLife); - } else { - // get smaller - setParticleTextureIndex(7 - ((particleAge - fireflyHalfLife) * 8) / particleMaxAge); - } - moveEntity(motionX, motionY, motionZ); - if(posY == prevPosY) - { - motionX *= 1.1000000000000001D; - motionZ *= 1.1000000000000001D; - } - motionX *= 0.95999997854232788D; - motionY *= 0.95999997854232788D; - motionZ *= 0.95999997854232788D; - if(onGround) - { - motionX *= 0.69999998807907104D; - motionZ *= 0.69999998807907104D; - } - } - - float fireflyParticleScale; - int fireflyHalfLife; -} diff --git a/src/main/java/twilightforest/client/particle/EntityTFGhastTrapFX.java b/src/main/java/twilightforest/client/particle/EntityTFGhastTrapFX.java deleted file mode 100644 index 6b29e7d021..0000000000 --- a/src/main/java/twilightforest/client/particle/EntityTFGhastTrapFX.java +++ /dev/null @@ -1,127 +0,0 @@ -package twilightforest.client.particle; - -import net.minecraft.client.particle.EntityFX; -import net.minecraft.client.renderer.Tessellator; -import net.minecraft.world.World; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -@SideOnly(Side.CLIENT) -public class EntityTFGhastTrapFX extends EntityFX -{ - float reddustParticleScale; - private double originX; - private double originY; - private double originZ; - - public EntityTFGhastTrapFX(World par1World, double par2, double par4, double par6, double par8, double par9, double par10) - { - this(par1World, par2, par4, par6, 3.0F, par8, par9, par10); - } - - public EntityTFGhastTrapFX(World par1World, double x, double y, double z, float scale, double mx, double my, double mz) - { - super(par1World, x + mx, y + my, z + mz, mx, my, mz); - this.motionX = mx; - this.motionY = my; - this.motionZ = mz; - - this.originX = x; - this.originY = y; - this.originZ = z; - - float f4 = (float)Math.random() * 0.4F;// + 0.6F; - //this.particleRed = ((float)(Math.random() * 0.20000000298023224D) + 0.8F) * f4; - this.particleGreen = ((float)(Math.random() * 0.20000000298023224D) + 0.8F) * f4; - this.particleBlue = ((float)(Math.random() * 0.20000000298023224D) + 0.8F) * f4; - - this.particleRed = 1.0F; - - this.particleScale *= 0.75F; - this.particleScale *= scale; - this.reddustParticleScale = this.particleScale; - this.particleMaxAge = (int)(10.0D / (Math.random() * 0.8D + 0.2D)); - //this.particleMaxAge = (int)((float)this.particleMaxAge * scale); - - this.noClip = false; - } - - public void renderParticle(Tessellator par1Tessellator, float par2, float par3, float par4, float par5, float par6, float par7) - { - float f6 = ((float)this.particleAge + par2) / (float)this.particleMaxAge * 32.0F; - - if (f6 < 0.0F) - { - f6 = 0.0F; - } - - if (f6 > 1.0F) - { - f6 = 1.0F; - } - - this.particleScale = this.reddustParticleScale * f6; - super.renderParticle(par1Tessellator, par2, par3, par4, par5, par6, par7); - } - -// /** -// * Called to update the entity's position/logic. -// */ -// public void onUpdate() -// { -// this.prevPosX = this.posX; -// this.prevPosY = this.posY; -// this.prevPosZ = this.posZ; -// -// if (this.particleAge++ >= this.particleMaxAge) -// { -// this.setDead(); -// } -// -// this.setParticleTextureIndex(7 - this.particleAge * 8 / this.particleMaxAge); -// this.moveEntity(this.motionX, this.motionY, this.motionZ); -// -// if (this.posY == this.prevPosY) -// { -// this.motionX *= 1.1D; -// this.motionZ *= 1.1D; -// } -// -// this.motionX *= 0.9599999785423279D; -// this.motionY *= 0.9599999785423279D; -// this.motionZ *= 0.9599999785423279D; -// -// if (this.onGround) -// { -// this.motionX *= 0.699999988079071D; -// this.motionZ *= 0.699999988079071D; -// } -// } - - - /** - * Called to update the entity's position/logic. - */ - public void onUpdate() - { - - this.setParticleTextureIndex(7 - this.particleAge * 8 / this.particleMaxAge); - - this.prevPosX = this.posX; - this.prevPosY = this.posY; - this.prevPosZ = this.posZ; - float proportion = (float)this.particleAge / (float)this.particleMaxAge; - proportion = 1.0F - proportion; -// float antiProportion = 1.0F - proportion; -// antiProportion *= antiProportion; -// antiProportion *= antiProportion; - this.posX = this.originX + this.motionX * (double)proportion; - this.posY = this.originY + this.motionY * (double)proportion;// - (double)(antiProportion * 1.2F); - this.posZ = this.originZ + this.motionZ * (double)proportion; - - if (this.particleAge++ >= this.particleMaxAge) - { - this.setDead(); - } - } -} diff --git a/src/main/java/twilightforest/client/particle/EntityTFIceBeamFX.java b/src/main/java/twilightforest/client/particle/EntityTFIceBeamFX.java deleted file mode 100644 index ea55680c66..0000000000 --- a/src/main/java/twilightforest/client/particle/EntityTFIceBeamFX.java +++ /dev/null @@ -1,86 +0,0 @@ -package twilightforest.client.particle; - -import net.minecraft.client.particle.EntityFX; -import net.minecraft.client.renderer.Tessellator; -import net.minecraft.world.World; -import twilightforest.item.ItemTFIceBomb; -import twilightforest.item.TFItems; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -@SideOnly(Side.CLIENT) -public class EntityTFIceBeamFX extends EntityFX -{ - float initialParticleScale; - - public EntityTFIceBeamFX(World par1World, double par2, double par4, double par6, double par8, double par10, double par12) - { - this(par1World, par2, par4, par6, par8, par10, par12, 1.0F); - } - - public EntityTFIceBeamFX(World par1World, double par2, double par4, double par6, double par8, double par10, double par12, float par14) - { - super(par1World, par2, par4, par6, 0.0D, 0.0D, 0.0D); - this.motionX *= 0.10000000149011612D; - this.motionY *= 0.10000000149011612D; - this.motionZ *= 0.10000000149011612D; - this.motionX += par8 * 0.4D; - this.motionY += par10 * 0.4D; - this.motionZ += par12 * 0.4D; - this.particleRed = this.particleGreen = this.particleBlue = 1.0F; - this.particleScale *= 0.75F; - this.particleScale *= par14; - this.initialParticleScale = this.particleScale; -// this.particleMaxAge = (int)(6.0D / (Math.random() * 0.8D + 0.6D)); -// this.particleMaxAge = (int)((float)this.particleMaxAge * par14); - this.particleMaxAge = 50; - this.noClip = false; - - this.setParticleIcon(((ItemTFIceBomb)TFItems.iceBomb).getSnowIcon(rand.nextInt(4))); - - this.onUpdate(); - } - - public void renderParticle(Tessellator par1Tessellator, float par2, float par3, float par4, float par5, float par6, float par7) - { - super.renderParticle(par1Tessellator, par2, par3, par4, par5, par6, par7); - } - - /** - * Called to update the entity's position/logic. - */ - public void onUpdate() - { - this.prevPosX = this.posX; - this.prevPosY = this.posY; - this.prevPosZ = this.posZ; - - if (this.particleAge++ >= this.particleMaxAge) - { - this.setDead(); - } - - this.moveEntity(this.motionX, this.motionY, this.motionZ); - - this.motionX *= 0.9599999785423279D; - this.motionY *= 0.9599999785423279D; - this.motionZ *= 0.9599999785423279D; - //this.motionY -= 0.019999999552965164D; - - if (this.onGround) - { - this.motionX *= 0.699999988079071D; - this.motionZ *= 0.699999988079071D; - } - } - - public int getBrightnessForRender(float par1) - { - return 240 | 240 << 16; - } - - public int getFXLayer() - { - return 2; - } -} \ No newline at end of file diff --git a/src/main/java/twilightforest/client/particle/EntityTFLargeFlameFX.java b/src/main/java/twilightforest/client/particle/EntityTFLargeFlameFX.java deleted file mode 100644 index 3b26787f28..0000000000 --- a/src/main/java/twilightforest/client/particle/EntityTFLargeFlameFX.java +++ /dev/null @@ -1,111 +0,0 @@ -package twilightforest.client.particle; - -import net.minecraft.client.particle.EntityFX; -import net.minecraft.client.renderer.Tessellator; -import net.minecraft.world.World; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -@SideOnly(Side.CLIENT) -public class EntityTFLargeFlameFX extends EntityFX -{ - /** the scale of the flame FX */ - private float flameScale; - - public EntityTFLargeFlameFX(World par1World, double par2, double par4, double par6, double par8, double par10, double par12) - { - super(par1World, par2, par4, par6, par8, par10, par12); - this.motionX = this.motionX * 0.009999999776482582D + par8; - this.motionY = this.motionY * 0.009999999776482582D + par10; - this.motionZ = this.motionZ * 0.009999999776482582D + par12; - this.particleScale *= 5.0D; - this.flameScale = this.particleScale; - this.particleRed = this.particleGreen = this.particleBlue = 1.0F; - this.particleMaxAge = (int)(8.0D / (Math.random() * 0.8D + 0.2D)) + 4; - //this.noClip = true; - this.setParticleTextureIndex(48); - } - - public void renderParticle(Tessellator par1Tessellator, float par2, float par3, float par4, float par5, float par6, float par7) - { - float var8 = ((float)this.particleAge + par2) / (float)this.particleMaxAge; - this.particleScale = this.flameScale * (1.0F - var8 * var8 * 0.5F); - super.renderParticle(par1Tessellator, par2, par3, par4, par5, par6, par7); - } - - public int getBrightnessForRender(float par1) - { - float var2 = ((float)this.particleAge + par1) / (float)this.particleMaxAge; - - if (var2 < 0.0F) - { - var2 = 0.0F; - } - - if (var2 > 1.0F) - { - var2 = 1.0F; - } - - int var3 = super.getBrightnessForRender(par1); - int var4 = var3 & 255; - int var5 = var3 >> 16 & 255; - var4 += (int)(var2 * 15.0F * 16.0F); - - if (var4 > 240) - { - var4 = 240; - } - - return var4 | var5 << 16; - } - - /** - * Gets how bright this entity is. - */ - public float getBrightness(float par1) - { - float var2 = ((float)this.particleAge + par1) / (float)this.particleMaxAge; - - if (var2 < 0.0F) - { - var2 = 0.0F; - } - - if (var2 > 1.0F) - { - var2 = 1.0F; - } - - float var3 = super.getBrightness(par1); - return var3 * var2 + (1.0F - var2); - } - - /** - * Called to update the entity's position/logic. - */ - public void onUpdate() - { - this.prevPosX = this.posX; - this.prevPosY = this.posY; - this.prevPosZ = this.posZ; - - if (this.particleAge++ >= this.particleMaxAge) - { - this.setDead(); - } - - this.motionY += 0.004D; - - this.moveEntity(this.motionX, this.motionY, this.motionZ); - this.motionX *= 0.9599999785423279D; - this.motionY *= 0.9599999785423279D; - this.motionZ *= 0.9599999785423279D; - - if (this.onGround) - { - this.motionX *= 0.699999988079071D; - this.motionZ *= 0.699999988079071D; - } - } -} diff --git a/src/main/java/twilightforest/client/particle/EntityTFLeafRuneFX.java b/src/main/java/twilightforest/client/particle/EntityTFLeafRuneFX.java deleted file mode 100644 index 325043c4d5..0000000000 --- a/src/main/java/twilightforest/client/particle/EntityTFLeafRuneFX.java +++ /dev/null @@ -1,39 +0,0 @@ -package twilightforest.client.particle; - -import net.minecraft.client.particle.EntityEnchantmentTableParticleFX; -import net.minecraft.world.World; - -public class EntityTFLeafRuneFX extends EntityEnchantmentTableParticleFX { - - public EntityTFLeafRuneFX(World world, double x, double y, double z, double velX, double velY, double velZ) - { - super(world, x, y, z, velX, velY, velZ); - - this.particleScale = this.rand.nextFloat() + 1F; - this.particleMaxAge += 10; - this.particleGravity = 0.003F + rand.nextFloat() * 0.006F; - - - this.noClip = false; - } - - - /** - * Called to update the entity's position/logic. - */ - public void onUpdate() - { - this.prevPosX = this.posX; - this.prevPosY = this.posY; - this.prevPosZ = this.posZ; - - this.moveEntity(this.motionX, this.motionY, this.motionZ); - this.motionY -= (double)this.particleGravity; - - - if (this.particleAge++ >= this.particleMaxAge) - { - this.setDead(); - } - } -} diff --git a/src/main/java/twilightforest/client/particle/EntityTFProtectionFX.java b/src/main/java/twilightforest/client/particle/EntityTFProtectionFX.java deleted file mode 100644 index ba1008ca26..0000000000 --- a/src/main/java/twilightforest/client/particle/EntityTFProtectionFX.java +++ /dev/null @@ -1,29 +0,0 @@ -package twilightforest.client.particle; - -import net.minecraft.client.particle.EntityAuraFX; -import net.minecraft.world.World; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public class EntityTFProtectionFX extends EntityAuraFX { - - public EntityTFProtectionFX(World world, double x, double y, double z, double velX, double velY, double velZ) { - super(world, x, y, z, velX, velY, velZ); - this.setParticleTextureIndex(82); - this.setRBGColorF(1.0F, 1.0F, 1.0F); - } - - /** - * Gets how bright this entity is. - */ - public float getBrightness(float par1) - { - return 1.0F; - } - - @SideOnly(Side.CLIENT) - public int getBrightnessForRender(float par1) - { - return 15728880; - } -} diff --git a/src/main/java/twilightforest/client/particle/EntityTFSnowFX.java b/src/main/java/twilightforest/client/particle/EntityTFSnowFX.java deleted file mode 100644 index ba6bfd0faa..0000000000 --- a/src/main/java/twilightforest/client/particle/EntityTFSnowFX.java +++ /dev/null @@ -1,85 +0,0 @@ -package twilightforest.client.particle; - -import net.minecraft.client.particle.EntityFX; -import net.minecraft.client.renderer.Tessellator; -import net.minecraft.world.World; -import twilightforest.item.ItemTFIceBomb; -import twilightforest.item.TFItems; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -@SideOnly(Side.CLIENT) -public class EntityTFSnowFX extends EntityFX -{ - float initialParticleScale; - - public EntityTFSnowFX(World par1World, double par2, double par4, double par6, double par8, double par10, double par12) - { - this(par1World, par2, par4, par6, par8, par10, par12, 1.0F); - } - - public EntityTFSnowFX(World par1World, double par2, double par4, double par6, double par8, double par10, double par12, float par14) - { - super(par1World, par2, par4, par6, 0.0D, 0.0D, 0.0D); - this.motionX *= 0.10000000149011612D; - this.motionY *= 0.10000000149011612D; - this.motionZ *= 0.10000000149011612D; - this.motionX += par8 * 0.4D; - this.motionY += par10 * 0.4D; - this.motionZ += par12 * 0.4D; - this.particleRed = this.particleGreen = this.particleBlue = 1.0F; - this.particleScale *= 0.75F; - this.particleScale *= par14; - this.initialParticleScale = this.particleScale; - this.particleMaxAge = (int)(6.0D / (Math.random() * 0.8D + 0.6D)); - this.particleMaxAge = (int)((float)this.particleMaxAge * par14); - this.noClip = false; - - this.setParticleIcon(((ItemTFIceBomb)TFItems.iceBomb).getSnowIcon(rand.nextInt(4))); - - this.onUpdate(); - } - - public void renderParticle(Tessellator par1Tessellator, float par2, float par3, float par4, float par5, float par6, float par7) - { - super.renderParticle(par1Tessellator, par2, par3, par4, par5, par6, par7); - } - - /** - * Called to update the entity's position/logic. - */ - public void onUpdate() - { - this.prevPosX = this.posX; - this.prevPosY = this.posY; - this.prevPosZ = this.posZ; - - if (this.particleAge++ >= this.particleMaxAge) - { - this.setDead(); - } - - this.moveEntity(this.motionX, this.motionY, this.motionZ); - - this.motionX *= 0.699999988079071D; - this.motionY *= 0.699999988079071D; - this.motionZ *= 0.699999988079071D; - this.motionY -= 0.019999999552965164D; - - if (this.onGround) - { - this.motionX *= 0.699999988079071D; - this.motionZ *= 0.699999988079071D; - } - } - - public int getBrightnessForRender(float par1) - { - return 240 | 240 << 16; - } - - public int getFXLayer() - { - return 2; - } -} \ No newline at end of file diff --git a/src/main/java/twilightforest/client/particle/EntityTFSnowGuardianFX.java b/src/main/java/twilightforest/client/particle/EntityTFSnowGuardianFX.java deleted file mode 100644 index dec370fcc9..0000000000 --- a/src/main/java/twilightforest/client/particle/EntityTFSnowGuardianFX.java +++ /dev/null @@ -1,17 +0,0 @@ -package twilightforest.client.particle; - -import net.minecraft.world.World; - -public class EntityTFSnowGuardianFX extends EntityTFSnowFX { - - public EntityTFSnowGuardianFX(World par1World, double par2, double par4, double par6, double par8, double par10, double par12, float par14) { - super(par1World, par2, par4, par6, par8, par10, par12, par14); - this.particleMaxAge = 10 + this.rand.nextInt(15); - - this.particleRed = this.particleGreen = this.particleBlue = 0.75F + this.rand.nextFloat() * 0.25F; - - } - - - -} diff --git a/src/main/java/twilightforest/client/particle/EntityTFSnowWarningFX.java b/src/main/java/twilightforest/client/particle/EntityTFSnowWarningFX.java deleted file mode 100644 index 0cca4eab61..0000000000 --- a/src/main/java/twilightforest/client/particle/EntityTFSnowWarningFX.java +++ /dev/null @@ -1,23 +0,0 @@ -package twilightforest.client.particle; - -import net.minecraft.world.World; - -public class EntityTFSnowWarningFX extends EntityTFSnowFX { - - public EntityTFSnowWarningFX(World par1World, double par2, double par4, double par6, double par8, double par10, double par12, float par14) { - super(par1World, par2, par4, par6, par8, par10, par12, par14); - this.particleMaxAge = 50; - } - - - /** - * Called to update the entity's position/logic. - */ - public void onUpdate() - { - super.onUpdate(); - - this.motionY -= 0.019999999552965164D; - } - -} diff --git a/src/main/java/twilightforest/client/particle/FireflyParticle.java b/src/main/java/twilightforest/client/particle/FireflyParticle.java new file mode 100644 index 0000000000..29585861ed --- /dev/null +++ b/src/main/java/twilightforest/client/particle/FireflyParticle.java @@ -0,0 +1,71 @@ +package twilightforest.client.particle; + +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.particle.*; +import net.minecraft.client.Camera; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.core.particles.SimpleParticleType; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +public class FireflyParticle extends TextureSheetParticle { + + private final int halfLife; + + public FireflyParticle(ClientLevel level, double x, double y, double z, double vx, double vy, double vz) { + super(level, x, y, z, vx, vy, vz); + xd *= 2.1; + yd *= 2.1; + zd *= 2.1; + rCol = 0.9F; + gCol = 1.0F; + bCol = 0.0F; + quadSize = 0.2f + (random.nextFloat() * 0.1f); + lifetime = 10 + random.nextInt(21); + halfLife = lifetime / 2; + hasPhysics = true; + } + + @Override + public ParticleRenderType getRenderType() { + return ParticleRenderType.PARTICLE_SHEET_TRANSLUCENT; + } + + @Override + public void render(VertexConsumer buffer, Camera camera, float partialTicks) { + alpha = getGlowBrightness(); + super.render(buffer, camera, partialTicks); + } + + @Override + public void tick() { + if (age++ >= lifetime) { + remove(); + } + } + + public float getGlowBrightness() { + int lifeTime = lifetime - age; + if (lifeTime <= halfLife) { + return (float) lifeTime / (float) halfLife; + } else { + return Math.max(1.0f - (((float) lifeTime - halfLife) / halfLife), 0); + } + } + + @Override + public int getLightColor(float partialTicks) { + return 0xF000F0; + } + + @OnlyIn(Dist.CLIENT) + public record Factory(SpriteSet sprite) implements ParticleProvider { + + @Override + public Particle createParticle(SimpleParticleType type, ClientLevel level, double x, double y, double z, double xSpeed, double ySpeed, double zSpeed) { + FireflyParticle particle = new FireflyParticle(level, x, y, z, xSpeed, ySpeed, zSpeed); + particle.pickSprite(this.sprite); + return particle; + } + } +} diff --git a/src/main/java/twilightforest/client/particle/GhastTearParticle.java b/src/main/java/twilightforest/client/particle/GhastTearParticle.java new file mode 100644 index 0000000000..c396ef093f --- /dev/null +++ b/src/main/java/twilightforest/client/particle/GhastTearParticle.java @@ -0,0 +1,67 @@ +package twilightforest.client.particle; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.particle.Particle; +import net.minecraft.client.particle.ParticleProvider; +import net.minecraft.client.particle.ParticleRenderType; +import net.minecraft.client.particle.TextureSheetParticle; +import net.minecraft.core.particles.ItemParticleOption; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.core.particles.SimpleParticleType; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.client.model.data.ModelData; +import twilightforest.init.TFSounds; + +@OnlyIn(Dist.CLIENT) +public class GhastTearParticle extends TextureSheetParticle { + + public GhastTearParticle(ClientLevel level, double x, double y, double z, Item item) { + super(level, x, y, z, 0.0D, 0.0D, 0.0D); + this.sprite = Minecraft.getInstance().getItemRenderer().getItemModelShaper().getItemModel(item).getParticleIcon(ModelData.EMPTY); + this.rCol = this.gCol = this.bCol = 1.0F; + this.quadSize = 2.0F; + this.gravity = 0.6F; + + this.lifetime = 60 + random.nextInt(40); + this.hasPhysics = true; + } + + @Override + public ParticleRenderType getRenderType() { + return ParticleRenderType.TERRAIN_SHEET; + } + + @Override + public void tick() { + if (this.onGround) { + if (this.random.nextBoolean()) { + this.level.playLocalSound(this.x, this.y + 1.0D, this.z, TFSounds.TEAR_BREAK.get(), SoundSource.AMBIENT, 0.5F, 1.65F, false); + } + + ItemStack itemID = new ItemStack(Items.GHAST_TEAR); + for (int i = 0; i < 50; ++i) { + double gaussX = this.random.nextGaussian() * 0.1D; + double gaussY = this.random.nextGaussian() * 0.2D; + double gaussZ = this.random.nextGaussian() * 0.1D; + + this.level.addParticle(new ItemParticleOption(ParticleTypes.ITEM, itemID), this.x + this.random.nextFloat() - this.random.nextFloat(), this.y + 0.5F, this.z + this.random.nextFloat(), gaussX, gaussY, gaussZ); + } + this.remove(); + } + super.tick(); + } + + @OnlyIn(Dist.CLIENT) + public static class Factory implements ParticleProvider { + @Override + public Particle createParticle(SimpleParticleType type, ClientLevel level, double x, double y, double z, double xSpeed, double ySpeed, double zSpeed) { + return new GhastTearParticle(level, x, y, z, Items.GHAST_TEAR); + } + } +} diff --git a/src/main/java/twilightforest/client/particle/GhastTrapParticle.java b/src/main/java/twilightforest/client/particle/GhastTrapParticle.java new file mode 100644 index 0000000000..ed56da6abf --- /dev/null +++ b/src/main/java/twilightforest/client/particle/GhastTrapParticle.java @@ -0,0 +1,81 @@ +package twilightforest.client.particle; + +import net.minecraft.client.particle.*; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.core.particles.SimpleParticleType; +import net.minecraft.util.Mth; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +@OnlyIn(Dist.CLIENT) +public class GhastTrapParticle extends TextureSheetParticle { + + private final float reddustParticleScale; + + private final double originX; + private final double originY; + private final double originZ; + + public GhastTrapParticle(ClientLevel level, double x, double y, double z, double vx, double vy, double vz) { + this(level, x, y, z, 3.0F, vx, vy, vz); + } + + public GhastTrapParticle(ClientLevel level, double x, double y, double z, float scale, double mx, double my, double mz) { + super(level, x + mx, y + my, z + mz, mx, my, mz); + this.xd = mx; + this.yd = my; + this.zd = mz; + + this.originX = x; + this.originY = y; + this.originZ = z; + float brightness = (float) Math.random() * 0.4F; + this.rCol = 1.0F; + this.gCol = ((float) (Math.random() * 0.2D) + 0.8F) * brightness; + this.bCol = ((float) (Math.random() * 0.2D) + 0.8F) * brightness; + this.quadSize *= 0.75F * scale; + this.reddustParticleScale = this.quadSize; + this.lifetime = (int) (10.0D / (Math.random() * 0.8D + 0.2D)); + this.hasPhysics = true; + } + + @Override + public ParticleRenderType getRenderType() { + return ParticleRenderType.PARTICLE_SHEET_OPAQUE; + } + + @Override + public float getQuadSize(float partialTicks) { + float f6 = (this.age + partialTicks) / this.lifetime * 32.0F; + f6 = Mth.clamp(f6, 0.0F, 1.0F); + + return this.reddustParticleScale * f6; + } + + @Override + public void tick() { + this.xo = this.x; + this.yo = this.y; + this.zo = this.z; + float proportion = (float) this.age / (float) this.lifetime; + proportion = 1.0F - proportion; + this.x = this.originX + this.xd * proportion; + this.y = this.originY + this.yd * proportion; + this.z = this.originZ + this.zd * proportion; + + if (this.age++ >= this.lifetime) { + this.remove(); + } + } + + @OnlyIn(Dist.CLIENT) + public record Factory(SpriteSet sprite) implements ParticleProvider { + + @Override + public Particle createParticle(SimpleParticleType type, ClientLevel level, double x, double y, double z, double xSpeed, double ySpeed, double zSpeed) { + GhastTrapParticle particle = new GhastTrapParticle(level, x, y, z, xSpeed, ySpeed, zSpeed); + particle.setSpriteFromAge(this.sprite); + return particle; + } + } +} diff --git a/src/main/java/twilightforest/client/particle/IceBeamParticle.java b/src/main/java/twilightforest/client/particle/IceBeamParticle.java new file mode 100644 index 0000000000..6b3efff390 --- /dev/null +++ b/src/main/java/twilightforest/client/particle/IceBeamParticle.java @@ -0,0 +1,72 @@ +package twilightforest.client.particle; + +import net.minecraft.client.particle.*; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.core.particles.SimpleParticleType; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +@OnlyIn(Dist.CLIENT) +public class IceBeamParticle extends TextureSheetParticle { + + final float initialParticleScale; + + public IceBeamParticle(ClientLevel level, double x, double y, double z, double vx, double vy, double vz, float scale) { + super(level, x, y, z, 0.0D, 0.0D, 0.0D); + this.xd *= 0.1D; + this.yd *= 0.1D; + this.zd *= 0.1D; + this.xd += vx * 0.4D; + this.yd += vy * 0.4D; + this.zd += vz * 0.4D; + this.rCol = this.gCol = this.bCol = 1.0F; + this.quadSize *= 0.75F; + this.quadSize *= scale; + this.initialParticleScale = this.quadSize; + this.lifetime = 50; + this.hasPhysics = true; + } + + @Override + public ParticleRenderType getRenderType() { + return ParticleRenderType.PARTICLE_SHEET_OPAQUE; + } + + @Override + public void tick() { + this.xo = this.x; + this.yo = this.y; + this.zo = this.z; + + if (this.age++ >= this.lifetime) { + this.remove(); + } + + this.move(this.xd, this.yd, this.zd); + + this.xd *= 0.96D; + this.yd *= 0.96D; + this.zd *= 0.96D; + + if (this.onGround) { + this.xd *= 0.7D; + this.zd *= 0.7D; + } + } + + @Override + public int getLightColor(float partialTicks) { + return 240 | 240 << 16; + } + + @OnlyIn(Dist.CLIENT) + public record Factory(SpriteSet sprite) implements ParticleProvider { + + @Override + public Particle createParticle(SimpleParticleType type, ClientLevel level, double x, double y, double z, double xSpeed, double ySpeed, double zSpeed) { + IceBeamParticle particle = new IceBeamParticle(level, x, y, z, xSpeed, ySpeed, zSpeed, 0.75F); + particle.pickSprite(this.sprite); + return particle; + } + } +} diff --git a/src/main/java/twilightforest/client/particle/LargeFlameParticle.java b/src/main/java/twilightforest/client/particle/LargeFlameParticle.java new file mode 100644 index 0000000000..7e10fc62ec --- /dev/null +++ b/src/main/java/twilightforest/client/particle/LargeFlameParticle.java @@ -0,0 +1,94 @@ +package twilightforest.client.particle; + +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.particle.*; +import net.minecraft.core.particles.SimpleParticleType; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +@OnlyIn(Dist.CLIENT) +public class LargeFlameParticle extends TextureSheetParticle { + + private final float flameScale; + + public LargeFlameParticle(ClientLevel level, double x, double y, double z, double vx, double vy, double vz) { + super(level, x, y, z, vx, vy, vz); + this.xd = this.xd * 0.01D + vx; + this.yd = this.yd * 0.01D + vy; + this.zd = this.zd * 0.01D + vz; + this.quadSize *= 5.0D; + this.flameScale = this.quadSize; + this.rCol = this.gCol = this.bCol = 1.0F; + this.lifetime = (int) (8.0D / (Math.random() * 0.8D + 0.2D)) + 4; + this.hasPhysics = false; + } + + @Override + public ParticleRenderType getRenderType() { + return ParticleRenderType.PARTICLE_SHEET_OPAQUE; + } + + @Override + public float getQuadSize(float partialTicks) { + float relativeAge = (this.age + partialTicks) / this.lifetime; + return this.flameScale * (1.0F - relativeAge * relativeAge * 0.5F); + } + + @Override + public int getLightColor(float partialTicks) { + float var2 = (this.age + partialTicks) / this.lifetime; + + if (var2 < 0.0F) { + var2 = 0.0F; + } + + if (var2 > 1.0F) { + var2 = 1.0F; + } + + int var3 = super.getLightColor(partialTicks); + int var4 = var3 & 255; + int var5 = var3 >> 16 & 255; + var4 += (int) (var2 * 15.0F * 16.0F); + + if (var4 > 240) { + var4 = 240; + } + + return var4 | var5 << 16; + } + + @Override + public void tick() { + this.xo = this.x; + this.yo = this.y; + this.zo = this.z; + + if (this.age++ >= this.lifetime) { + this.remove(); + } + + this.yd += 0.004D; + + this.move(this.xd, this.yd, this.zd); + this.xd *= 0.96D; + this.yd *= 0.96D; + this.zd *= 0.96D; + + if (this.onGround) { + this.xd *= 0.7D; + this.zd *= 0.7D; + } + } + + @OnlyIn(Dist.CLIENT) + public record Factory(SpriteSet sprite) implements ParticleProvider { + + @Override + public Particle createParticle(SimpleParticleType type, ClientLevel level, double x, double y, double z, double xSpeed, double ySpeed, double zSpeed) { + LargeFlameParticle particle = new LargeFlameParticle(level, x, y, z, xSpeed, ySpeed, zSpeed); + particle.pickSprite(this.sprite); + return particle; + } + } +} diff --git a/src/main/java/twilightforest/client/particle/LeafParticle.java b/src/main/java/twilightforest/client/particle/LeafParticle.java new file mode 100644 index 0000000000..9a8c2eedb2 --- /dev/null +++ b/src/main/java/twilightforest/client/particle/LeafParticle.java @@ -0,0 +1,132 @@ +package twilightforest.client.particle; + +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.math.Axis; +import org.joml.Quaternionf; +import org.joml.Vector3f; +import net.minecraft.client.Camera; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.particle.*; +import net.minecraft.util.Mth; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import twilightforest.client.particle.data.LeafParticleData; + +@OnlyIn(Dist.CLIENT) +public class LeafParticle extends TextureSheetParticle { + + private final Vec3 target; + private float rot; + + public LeafParticle(ClientLevel world, double x, double y, double z, double vx, double vy, double vz) { + this(world, x, y, z, vx, vy, vz, 1.0F); + } + + public LeafParticle(ClientLevel world, double x, double y, double z, double vx, double vy, double vz, float scale) { + super(world, x, y, z, 0.0D, 0.0D, 0.0D); + target = new Vec3(x, y, z); + this.xd *= 0.1D; + this.yd *= 0.1D; + this.zd *= 0.1D; + this.xd += vx * 0.4D; + this.yd += vy * 0.4D; + this.zd += vz * 0.4D; + this.rCol = this.gCol = this.bCol = 1.0F; + this.alpha = 0.0F; + this.quadSize *= 0.75F * (random.nextBoolean() ? -1.0F : 1.0F); + this.quadSize *= scale; + this.lifetime = 160 + ((int) (random.nextFloat() * 30.0F)); + this.lifetime = (int) (this.lifetime * scale); + this.hasPhysics = true; + this.oRoll = this.roll = random.nextFloat() * 2.0F - 1.0F; + } + + @Override + public ParticleRenderType getRenderType() { + return ParticleRenderType.PARTICLE_SHEET_OPAQUE; + } + + @Override + public void tick() { + this.xo = this.x; + this.yo = this.y; + this.zo = this.z; + + if (this.age++ >= this.lifetime) { + this.remove(); + } + + this.move(this.xd, this.yd, this.zd); + + this.yd *= 0.7D; + this.yd -= 0.02D; + + if (this.onGround) { + this.xd *= 0.7D; + this.zd *= 0.7D; + } else { + rot += 5F; + if (xd == 0) + xd += (random.nextBoolean() ? 1 : -1) * 0.001F; + if (zd == 0) + zd += (random.nextBoolean() ? 1 : -1) * 0.001F; + if (random.nextInt(5) == 0) + xd += Math.signum(target.x - x) * random.nextFloat() * 0.005F; + if (random.nextInt(5) == 0) + zd += Math.signum(target.z - z) * random.nextFloat() * 0.005F; + } + } + + @Override + public void render(VertexConsumer buffer, Camera entity, float partialTicks) { + this.alpha = Math.min(Mth.clamp(this.age, 0, 20) / 20.0F, Mth.clamp(this.lifetime - this.age, 0, 20) / 20.0F); + Vec3 pos = entity.getPosition(); + float lerpx = (float) (Mth.lerp(partialTicks, this.xo, this.x) - pos.x()); + float lerpy = (float) (Mth.lerp(partialTicks, this.yo, this.y) - pos.y()); + float lerpz = (float) (Mth.lerp(partialTicks, this.zo, this.z) - pos.z()); + Quaternionf quaternion = new Quaternionf(entity.rotation()); + if (this.roll != 0.0F) { + float roll = Mth.lerp(partialTicks, this.oRoll, this.roll); + quaternion.mul(Axis.ZP.rotation(roll)); + } + quaternion.mul(Axis.YP.rotation(Mth.cos((float) Math.toRadians(rot % 360.0F)))); + Vector3f vec = new Vector3f(-1.0F, -1.0F, 0.0F); + vec.rotate(quaternion); + Vector3f[] vecList = new Vector3f[]{new Vector3f(-1.0F, -1.0F, 0.0F), new Vector3f(-1.0F, 1.0F, 0.0F), new Vector3f(1.0F, 1.0F, 0.0F), new Vector3f(1.0F, -1.0F, 0.0F)}; + float quadSize = this.getQuadSize(partialTicks); + + for (int i = 0; i < 4; i++) { + Vector3f selectedVec = vecList[i]; + selectedVec.rotate(quaternion); + selectedVec.mul(quadSize); + selectedVec.add(lerpx, lerpy, lerpz); + } + float u = this.getU0(); + float u1 = this.getU1(); + float v = this.getV0(); + float v1 = this.getV1(); + int light = this.getLightColor(partialTicks); + buffer.vertex(vecList[0].x(), vecList[0].y(), vecList[0].z()).uv(u1, v1).color(this.rCol, this.gCol, this.bCol, this.alpha).uv2(light).endVertex(); + buffer.vertex(vecList[1].x(), vecList[1].y(), vecList[1].z()).uv(u1, v).color(this.rCol, this.gCol, this.bCol, this.alpha).uv2(light).endVertex(); + buffer.vertex(vecList[2].x(), vecList[2].y(), vecList[2].z()).uv(u, v).color(this.rCol, this.gCol, this.bCol, this.alpha).uv2(light).endVertex(); + buffer.vertex(vecList[3].x(), vecList[3].y(), vecList[3].z()).uv(u, v1).color(this.rCol, this.gCol, this.bCol, this.alpha).uv2(light).endVertex(); + } + + @Override + public int getLightColor(float partialTicks) { + return 240 | 240 << 16; + } + + @OnlyIn(Dist.CLIENT) + public record Factory(SpriteSet sprite) implements ParticleProvider { + + @Override + public Particle createParticle(LeafParticleData data, ClientLevel level, double x, double y, double z, double xSpeed, double ySpeed, double zSpeed) { + LeafParticle particle = new LeafParticle(level, x, y, z, xSpeed, ySpeed, zSpeed); + particle.setColor(data.r / 255.0F, data.g / 255.0F, data.b / 255.0F); + particle.pickSprite(this.sprite); + return particle; + } + } +} diff --git a/src/main/java/twilightforest/client/particle/LeafRuneParticle.java b/src/main/java/twilightforest/client/particle/LeafRuneParticle.java new file mode 100644 index 0000000000..633562c94d --- /dev/null +++ b/src/main/java/twilightforest/client/particle/LeafRuneParticle.java @@ -0,0 +1,38 @@ +package twilightforest.client.particle; + +import net.minecraft.client.particle.*; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.core.particles.SimpleParticleType; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +public class LeafRuneParticle extends TextureSheetParticle { + + LeafRuneParticle(ClientLevel level, double x, double y, double z, double velX, double velY, double velZ) { + super(level, x, y, z, velX, velY, velZ); + // super applies jittering, reset it + this.xd = velX; + this.yd = velY; + this.zd = velZ; + + this.quadSize = this.random.nextFloat() * 0.25F; + this.lifetime = (int)(Math.random() * 10.0D) + 40; + this.gravity = 0.3F + random.nextFloat() * 0.6F; + } + + @Override + public ParticleRenderType getRenderType() { + return ParticleRenderType.PARTICLE_SHEET_OPAQUE; + } + + @OnlyIn(Dist.CLIENT) + public record Factory(SpriteSet sprite) implements ParticleProvider { + + @Override + public Particle createParticle(SimpleParticleType type, ClientLevel level, double x, double y, double z, double xSpeed, double ySpeed, double zSpeed) { + LeafRuneParticle particle = new LeafRuneParticle(level, x, y, z, xSpeed, ySpeed, zSpeed); + particle.pickSprite(this.sprite); + return particle; + } + } +} diff --git a/src/main/java/twilightforest/client/particle/PinnedFireflyParticle.java b/src/main/java/twilightforest/client/particle/PinnedFireflyParticle.java new file mode 100644 index 0000000000..88bad0221e --- /dev/null +++ b/src/main/java/twilightforest/client/particle/PinnedFireflyParticle.java @@ -0,0 +1,47 @@ +package twilightforest.client.particle; + +import net.minecraft.client.particle.SpriteSet; +import net.minecraft.client.particle.ParticleProvider; +import net.minecraft.client.particle.Particle; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.world.entity.Entity; +import twilightforest.client.particle.data.PinnedFireflyData; + +import org.jetbrains.annotations.Nullable; + +/** + * Version of {@link FireflyParticle} where location is pinned to an entity + */ +public class PinnedFireflyParticle extends FireflyParticle { + private final Entity follow; + + public PinnedFireflyParticle(ClientLevel level, double x, double y, double z, double vx, double vy, double vz, Entity entity) { + super(level, x, y, z, vx, vy, vz); + this.follow = entity; + } + + @Override + public void tick() { + super.tick(); + this.xo = this.x; + this.yo = this.y; + this.zo = this.z; + this.setPos(this.follow.getX(), this.follow.getY(), this.follow.getZ()); + } + + public record Factory(SpriteSet sprite) implements ParticleProvider { + + @Nullable + @Override + public Particle createParticle(PinnedFireflyData data, ClientLevel level, double x, double y, double z, double vx, double vy, double vz) { + Entity e = level.getEntity(data.follow); + if (e == null) { + return null; + } else { + PinnedFireflyParticle ret = new PinnedFireflyParticle(level, x, y, z, vx, vy, vz, e); + ret.pickSprite(sprite); + return ret; + } + } + } +} diff --git a/src/main/java/twilightforest/client/particle/ProtectionParticle.java b/src/main/java/twilightforest/client/particle/ProtectionParticle.java new file mode 100644 index 0000000000..bb502ae7c9 --- /dev/null +++ b/src/main/java/twilightforest/client/particle/ProtectionParticle.java @@ -0,0 +1,32 @@ +package twilightforest.client.particle; + +import net.minecraft.client.particle.SpriteSet; +import net.minecraft.client.particle.ParticleProvider; +import net.minecraft.client.particle.Particle; +import net.minecraft.client.particle.SuspendedTownParticle; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.core.particles.SimpleParticleType; + +public class ProtectionParticle extends SuspendedTownParticle { + + public ProtectionParticle(ClientLevel level, double x, double y, double z, double velX, double velY, double velZ) { + super(level, x, y, z, velX, velY, velZ); + } + + @Override + public int getLightColor(float partialTicks) { + return 0xF000F0; + } + + public record Factory(SpriteSet sprite) implements ParticleProvider { + + @Override + public Particle createParticle(SimpleParticleType type, ClientLevel level, double x, double y, double z, double vx, double vy, double vz) { + ProtectionParticle particle = new ProtectionParticle(level, x, y, z, vx, vy, vz); + particle.pickSprite(this.sprite); + particle.setColor(1.0F, 1.0F, 1.0F); + return particle; + } + } + +} diff --git a/src/main/java/twilightforest/client/particle/SmokeScaleParticle.java b/src/main/java/twilightforest/client/particle/SmokeScaleParticle.java new file mode 100644 index 0000000000..29be7d32d2 --- /dev/null +++ b/src/main/java/twilightforest/client/particle/SmokeScaleParticle.java @@ -0,0 +1,26 @@ +package twilightforest.client.particle; + +import net.minecraft.client.particle.SpriteSet; +import net.minecraft.client.particle.ParticleProvider; +import net.minecraft.client.particle.Particle; +import net.minecraft.client.particle.SmokeParticle; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.core.particles.SimpleParticleType; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +public class SmokeScaleParticle extends SmokeParticle { + + public SmokeScaleParticle(ClientLevel level, double x, double y, double z, double velX, double velY, double velZ, float scale, SpriteSet sprite) { + super(level, x, y, z, velX, velY, velZ, scale, sprite); + } + + @OnlyIn(Dist.CLIENT) + public record Factory(SpriteSet sprite) implements ParticleProvider { + + @Override + public Particle createParticle(SimpleParticleType type, ClientLevel level, double x, double y, double z, double xSpeed, double ySpeed, double zSpeed) { + return new SmokeScaleParticle(level, x, y, z, xSpeed, ySpeed, zSpeed, 4.0F, this.sprite); + } + } +} diff --git a/src/main/java/twilightforest/client/particle/SnowGuardianParticle.java b/src/main/java/twilightforest/client/particle/SnowGuardianParticle.java new file mode 100644 index 0000000000..5bd982cb1b --- /dev/null +++ b/src/main/java/twilightforest/client/particle/SnowGuardianParticle.java @@ -0,0 +1,29 @@ +package twilightforest.client.particle; + +import net.minecraft.client.particle.SpriteSet; +import net.minecraft.client.particle.ParticleProvider; +import net.minecraft.client.particle.Particle; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.core.particles.SimpleParticleType; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +public class SnowGuardianParticle extends SnowParticle { + + public SnowGuardianParticle(ClientLevel world, double x, double y, double z, double vx, double vy, double vz, float scale) { + super(world, x, y, z, vx, vy, vz, scale); + this.lifetime = 10 + this.random.nextInt(15); + this.rCol = this.gCol = this.bCol = 0.75F + this.random.nextFloat() * 0.25F; + } + + @OnlyIn(Dist.CLIENT) + public record Factory(SpriteSet sprite) implements ParticleProvider { + + @Override + public Particle createParticle(SimpleParticleType type, ClientLevel level, double x, double y, double z, double xSpeed, double ySpeed, double zSpeed) { + SnowGuardianParticle particle = new SnowGuardianParticle(level, x, y, z, xSpeed, ySpeed, zSpeed, 0.75F); + particle.pickSprite(this.sprite); + return particle; + } + } +} diff --git a/src/main/java/twilightforest/client/particle/SnowParticle.java b/src/main/java/twilightforest/client/particle/SnowParticle.java new file mode 100644 index 0000000000..7a5b3b3d8a --- /dev/null +++ b/src/main/java/twilightforest/client/particle/SnowParticle.java @@ -0,0 +1,78 @@ +package twilightforest.client.particle; + +import net.minecraft.client.particle.*; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.core.particles.SimpleParticleType; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +@OnlyIn(Dist.CLIENT) +public class SnowParticle extends TextureSheetParticle { + + final float initialParticleScale; + + public SnowParticle(ClientLevel level, double x, double y, double z, double vx, double vy, double vz) { + this(level, x, y, z, vx, vy, vz, 1.0F); + } + + public SnowParticle(ClientLevel level, double x, double y, double z, double vx, double vy, double vz, float scale) { + super(level, x, y, z, 0.0D, 0.0D, 0.0D); + this.xd *= 0.1D; + this.yd *= 0.1D; + this.zd *= 0.1D; + this.xd += vx * 0.4D; + this.yd += vy * 0.4D; + this.zd += vz * 0.4D; + this.rCol = this.gCol = this.bCol = 1.0F; + this.quadSize *= 0.75F; + this.quadSize *= scale; + this.initialParticleScale = this.quadSize; + this.lifetime = (int) (6.0D / (Math.random() * 0.8D + 0.6D)); + this.lifetime = (int) (this.lifetime * scale); + this.hasPhysics = true; + } + + @Override + public ParticleRenderType getRenderType() { + return ParticleRenderType.PARTICLE_SHEET_OPAQUE; + } + + @Override + public void tick() { + this.xo = this.x; + this.yo = this.y; + this.zo = this.z; + + if (this.age++ >= this.lifetime) { + this.remove(); + } + + this.move(this.xd, this.yd, this.zd); + + this.xd *= 0.7D; + this.yd *= 0.7D; + this.zd *= 0.7D; + this.yd -= 0.02D; + + if (this.onGround) { + this.xd *= 0.7D; + this.zd *= 0.7D; + } + } + + @Override + public int getLightColor(float partialTicks) { + return 240 | 240 << 16; + } + + @OnlyIn(Dist.CLIENT) + public record Factory(SpriteSet sprite) implements ParticleProvider { + + @Override + public Particle createParticle(SimpleParticleType type, ClientLevel level, double x, double y, double z, double xSpeed, double ySpeed, double zSpeed) { + SnowParticle particle = new SnowParticle(level, x, y, z, xSpeed, ySpeed, zSpeed); + particle.pickSprite(this.sprite); + return particle; + } + } +} diff --git a/src/main/java/twilightforest/client/particle/SnowWarningParticle.java b/src/main/java/twilightforest/client/particle/SnowWarningParticle.java new file mode 100644 index 0000000000..5ea04b754a --- /dev/null +++ b/src/main/java/twilightforest/client/particle/SnowWarningParticle.java @@ -0,0 +1,45 @@ +package twilightforest.client.particle; + +import net.minecraft.client.particle.SpriteSet; +import net.minecraft.client.particle.ParticleProvider; +import net.minecraft.client.particle.Particle; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.core.particles.SimpleParticleType; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +public class SnowWarningParticle extends SnowParticle { + + SnowWarningParticle(ClientLevel level, double x, double y, double z, double vx, double vy, double vz, float scale, int lifetime) { + super(level, x, y, z, vx, vy, vz, scale); + this.lifetime = lifetime; + } + + @Override + public void tick() { + super.tick(); + this.yd -= 0.02D; + } + + @OnlyIn(Dist.CLIENT) + public record SimpleFactory(SpriteSet sprite) implements ParticleProvider { + + @Override + public Particle createParticle(SimpleParticleType type, ClientLevel level, double x, double y, double z, double xSpeed, double ySpeed, double zSpeed) { + SnowWarningParticle particle = new SnowWarningParticle(level, x, y, z, xSpeed, ySpeed, zSpeed, 1, 50); + particle.pickSprite(this.sprite); + return particle; + } + } + + @OnlyIn(Dist.CLIENT) + public record ExtendedFactory(SpriteSet sprite) implements ParticleProvider { + + @Override + public Particle createParticle(SimpleParticleType type, ClientLevel level, double x, double y, double z, double xSpeed, double ySpeed, double zSpeed) { + SnowWarningParticle particle = new SnowWarningParticle(level, x, y, z, xSpeed, ySpeed, zSpeed, 1, 100); + particle.pickSprite(this.sprite); + return particle; + } + } +} diff --git a/src/main/java/twilightforest/client/particle/SortingParticle.java b/src/main/java/twilightforest/client/particle/SortingParticle.java new file mode 100644 index 0000000000..8ef44348fb --- /dev/null +++ b/src/main/java/twilightforest/client/particle/SortingParticle.java @@ -0,0 +1,92 @@ +package twilightforest.client.particle; + +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.particle.*; +import net.minecraft.core.particles.SimpleParticleType; +import net.minecraft.util.Mth; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +@OnlyIn(Dist.CLIENT) +public class SortingParticle extends TextureSheetParticle { + private final double xStart; + private final double yStart; + private final double zStart; + + public SortingParticle(ClientLevel level, double x, double y, double z, double x2, double y2, double z2) { + super(level, x, y, z); + this.xd = x2; + this.yd = y2; + this.zd = z2; + this.xStart = x; + this.yStart = y; + this.zStart = z; + this.xo = x + x2; + this.yo = y + y2; + this.zo = z + z2; + this.x = this.xo; + this.y = this.yo; + this.z = this.zo; + this.quadSize = 0.4F * (this.random.nextFloat() * 0.3F + 0.2F); + this.hasPhysics = false; + this.lifetime = (int)(Math.random() * 10.0D) + 19; + this.alpha = 0; + } + + public ParticleRenderType getRenderType() { + return ParticleRenderType.PARTICLE_SHEET_TRANSLUCENT; + } + + public void move(double x, double y, double z) { + this.setBoundingBox(this.getBoundingBox().move(x, y, z)); + this.setLocationFromBoundingbox(); + } + + public int getLightColor(float partialTicks) { + float f = ((float)this.age + partialTicks) / (float)this.lifetime; + f = Mth.clamp(f, 0.0F, 1.0F); + int i = super.getLightColor(partialTicks); + int j = i & 255; + int k = i >> 16 & 255; + j += (int)(f * 15.0F * 16.0F); + if (j > 240) { + j = 240; + } + + return j | k << 16; + } + + public void tick() { + this.xo = this.x; + this.yo = this.y; + this.zo = this.z; + if (this.age++ >= this.lifetime) { + this.remove(); + } else { + float f = (float)this.age / (float)this.lifetime; + this.alpha = Math.min(f * 1.35F, 1F); + f = 1.0F - f; + float f1 = 1.0F - f; + f1 *= f1; + f1 *= f1; + this.x = this.xStart + this.xd * (double)f; + this.y = this.yStart + this.yd * (double)f - (double)(f1 * 1.2F); + this.z = this.zStart + this.zd * (double)f; + } + } + + @OnlyIn(Dist.CLIENT) + public record Factory(SpriteSet sprite) implements ParticleProvider { + + public Particle createParticle(SimpleParticleType particleType, ClientLevel level, double x, double y, double z, double x2, double y2, double z2) { + SortingParticle sortingParticle = new SortingParticle(level, x, y, z, x2, y2, z2); + sortingParticle.pickSprite(this.sprite); + return sortingParticle; + } + } + + @Override + public boolean shouldCull() { + return false; + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/client/particle/WanderingFireflyParticle.java b/src/main/java/twilightforest/client/particle/WanderingFireflyParticle.java new file mode 100644 index 0000000000..5a20e8bddb --- /dev/null +++ b/src/main/java/twilightforest/client/particle/WanderingFireflyParticle.java @@ -0,0 +1,99 @@ +package twilightforest.client.particle; + +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.Camera; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.particle.*; +import net.minecraft.core.BlockPos; +import net.minecraft.core.particles.SimpleParticleType; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.LightLayer; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +//same glowy logic as FireflyParticle, but we movin' +public class WanderingFireflyParticle extends TextureSheetParticle { + + private final int halfLife; + private final boolean fromJar; + + public WanderingFireflyParticle(ClientLevel level, double posX, double posY, double posZ, float movementX, float movementY, float movementZ, double additionalX, double additionalY, double additionalZ, SpriteSet set, boolean fromJar) { + super(level, posX, posY, posZ, 0.0D, 0.0D, 0.0D); + this.xd *= movementX; + this.yd *= movementY; + this.zd *= movementZ; + this.xd += additionalX; + this.yd += additionalY; + this.zd += additionalZ; + + this.rCol = 0.9F; + this.gCol = 1.0F; + this.bCol = 0.0F; + this.pickSprite(set); + this.quadSize = 0.2f + (random.nextFloat() * 0.1f); + this.lifetime = 30 + random.nextInt(21); + this.halfLife = lifetime / 2; + this.speedUpWhenYMotionIsBlocked = true; + this.hasPhysics = true; + this.fromJar = fromJar; + } + + @Override + public void tick() { + if(!this.fromJar && this.level.getBrightness(LightLayer.SKY, BlockPos.containing(this.x, this.y, this.z)) < 1) { + this.remove(); + } + super.tick(); + } + + @Override + public ParticleRenderType getRenderType() { + return ParticleRenderType.PARTICLE_SHEET_TRANSLUCENT; + } + + @Override + public void render(VertexConsumer buffer, Camera entity, float partialTicks) { + this.alpha = this.getGlowBrightness(); + super.render(buffer, entity, partialTicks); + } + + public float getGlowBrightness() { + int lifeTime = this.lifetime - this.age; + if (lifeTime <= this.halfLife) { + return (float) lifeTime / (float) this.halfLife; + } else { + return Math.max(1.0f - (((float) lifeTime - this.halfLife) / this.halfLife), 0); + } + } + + @Override + public int getLightColor(float partialTicks) { + return 0xF000F0; + } + + @OnlyIn(Dist.CLIENT) + public record Factory(SpriteSet sprite) implements ParticleProvider { + + @Override + public Particle createParticle(SimpleParticleType type, ClientLevel level, double x, double y, double z, double xSpeed, double ySpeed, double zSpeed) { + RandomSource rand = level.getRandom(); + double speedX = (double) rand.nextFloat() * (rand.nextBoolean() ? -3.9D : 3.9D) * (double) rand.nextFloat() * 0.1D; + double speedY = (double) rand.nextFloat() * -0.25D * (double) rand.nextFloat() * 0.1D; + double speedZ = (double) rand.nextFloat() * (rand.nextBoolean() ? -3.9D : 3.9D) * (double) rand.nextFloat() * 0.1D; + return new WanderingFireflyParticle(level, x, y, z, 0.1F, 0.1F, 0.1F, speedX, speedY, speedZ, this.sprite, false); + } + } + + @OnlyIn(Dist.CLIENT) + public record FromJarFactory(SpriteSet sprite) implements ParticleProvider { + + @Override + public Particle createParticle(SimpleParticleType type, ClientLevel level, double x, double y, double z, double xSpeed, double ySpeed, double zSpeed) { + RandomSource rand = level.getRandom(); + double speedX = (double) rand.nextFloat() * (rand.nextBoolean() ? -3.9D : 3.9D) * (double) rand.nextFloat() * 0.1D; + double speedY = (double) rand.nextFloat() * -0.25D * (double) rand.nextFloat() * 0.1D; + double speedZ = (double) rand.nextFloat() * (rand.nextBoolean() ? -3.9D : 3.9D) * (double) rand.nextFloat() * 0.1D; + return new WanderingFireflyParticle(level, x, y, z, 0.1F, 0.1F, 0.1F, speedX, speedY, speedZ, this.sprite, true); + } + } +} diff --git a/src/main/java/twilightforest/client/particle/data/LeafParticleData.java b/src/main/java/twilightforest/client/particle/data/LeafParticleData.java new file mode 100644 index 0000000000..8cec07087c --- /dev/null +++ b/src/main/java/twilightforest/client/particle/data/LeafParticleData.java @@ -0,0 +1,71 @@ +package twilightforest.client.particle.data; + +import com.mojang.brigadier.StringReader; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.core.particles.ParticleOptions; +import net.minecraft.core.particles.ParticleType; +import twilightforest.init.TFParticleType; + +import javax.annotation.Nonnull; + +public class LeafParticleData implements ParticleOptions { + public final int r; + public final int g; + public final int b; + + public LeafParticleData(int r, int g, int b) { + this.r = r; + this.g = g; + this.b = b; + } + + @Nonnull + @Override + public ParticleType getType() { + return TFParticleType.FALLEN_LEAF.get(); + } + + public static Codec codecLeaf() { + return RecordCodecBuilder.create((instance) -> instance.group( + Codec.INT.fieldOf("r").forGetter((obj) -> obj.r), + Codec.INT.fieldOf("g").forGetter((obj) -> obj.g), + Codec.INT.fieldOf("b").forGetter((obj) -> obj.b)) + .apply(instance, LeafParticleData::new)); + } + + @Override + public void writeToNetwork(@Nonnull FriendlyByteBuf buf) { + buf.writeVarInt(r); + buf.writeVarInt(g); + buf.writeVarInt(b); + } + + @Nonnull + @Override + public String writeToString() { + return String.format("%d %d %d", r, g, b); + } + + public static class Deserializer implements ParticleOptions.Deserializer { + @Nonnull + @Override + public LeafParticleData fromCommand(@Nonnull ParticleType type, @Nonnull StringReader reader) throws CommandSyntaxException { + reader.skipWhitespace(); + int r = reader.readInt(); + reader.skipWhitespace(); + int g = reader.readInt(); + reader.skipWhitespace(); + int b = reader.readInt(); + return new LeafParticleData(r, g, b); + } + + @Nonnull + @Override + public LeafParticleData fromNetwork(@Nonnull ParticleType type, FriendlyByteBuf buf) { + return new LeafParticleData(buf.readVarInt(), buf.readVarInt(), buf.readVarInt()); + } + } +} diff --git a/src/main/java/twilightforest/client/particle/data/PinnedFireflyData.java b/src/main/java/twilightforest/client/particle/data/PinnedFireflyData.java new file mode 100644 index 0000000000..d69ce0167a --- /dev/null +++ b/src/main/java/twilightforest/client/particle/data/PinnedFireflyData.java @@ -0,0 +1,50 @@ +package twilightforest.client.particle.data; + +import com.mojang.brigadier.StringReader; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import com.mojang.serialization.Codec; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.core.particles.ParticleOptions; +import net.minecraft.core.particles.ParticleType; +import twilightforest.init.TFParticleType; + +public class PinnedFireflyData implements ParticleOptions { + + public final int follow; + + public PinnedFireflyData(int follow) { + this.follow = follow; + } + + @Override + public ParticleType getType() { + return TFParticleType.FIREFLY_PINNED.get(); + } + + public static Codec codecFirefly() { + return Codec.INT.xmap(PinnedFireflyData::new, (obj) -> obj.follow); + } + + @Override + public void writeToNetwork(FriendlyByteBuf buf) { + buf.writeVarInt(follow); + } + + @Override + public String writeToString() { + return Integer.toString(follow); + } + + public static class Deserializer implements ParticleOptions.Deserializer { + @Override + public PinnedFireflyData fromCommand(ParticleType type, StringReader rdr) throws CommandSyntaxException { + rdr.skipWhitespace(); + return new PinnedFireflyData(rdr.readInt()); + } + + @Override + public PinnedFireflyData fromNetwork(ParticleType type, FriendlyByteBuf buf) { + return new PinnedFireflyData(buf.readVarInt()); + } + } +} diff --git a/src/main/java/twilightforest/client/particle/data/package-info.java b/src/main/java/twilightforest/client/particle/data/package-info.java new file mode 100644 index 0000000000..cbc768d21c --- /dev/null +++ b/src/main/java/twilightforest/client/particle/data/package-info.java @@ -0,0 +1,6 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.client.particle.data; + +import net.minecraft.MethodsReturnNonnullByDefault; +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/client/particle/package-info.java b/src/main/java/twilightforest/client/particle/package-info.java new file mode 100644 index 0000000000..5587613e35 --- /dev/null +++ b/src/main/java/twilightforest/client/particle/package-info.java @@ -0,0 +1,6 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.client.particle; + +import net.minecraft.MethodsReturnNonnullByDefault; +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/client/renderer/TFFieryItemRenderer.java b/src/main/java/twilightforest/client/renderer/TFFieryItemRenderer.java deleted file mode 100644 index ce48f4169d..0000000000 --- a/src/main/java/twilightforest/client/renderer/TFFieryItemRenderer.java +++ /dev/null @@ -1,198 +0,0 @@ -package twilightforest.client.renderer; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.ItemRenderer; -import net.minecraft.client.renderer.OpenGlHelper; -import net.minecraft.client.renderer.Tessellator; -import net.minecraft.client.renderer.texture.TextureManager; -import net.minecraft.client.renderer.texture.TextureMap; -import net.minecraft.client.renderer.texture.TextureUtil; -import net.minecraft.client.settings.GameSettings; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.item.EntityItem; -import net.minecraft.item.ItemStack; -import net.minecraft.util.IIcon; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.client.IItemRenderer; - -import org.lwjgl.opengl.GL11; - -public class TFFieryItemRenderer implements IItemRenderer { - - private static final ResourceLocation RES_ITEM_GLINT = new ResourceLocation("textures/misc/enchanted_item_glint.png"); - private TextureManager texturemanager; - - public TFFieryItemRenderer(GameSettings gameSettings, TextureManager textureManager) { - this.texturemanager = textureManager; - } - - /** - * Checks if this renderer should handle a specific item's render type - * @param item The item we are trying to render - * @param type A render type to check if this renderer handles - * @return true if this renderer should handle the given render type, - * otherwise false - */ - @Override - public boolean handleRenderType(ItemStack item, ItemRenderType type) { - return type == ItemRenderType.ENTITY || type == ItemRenderType.EQUIPPED || type == ItemRenderType.EQUIPPED_FIRST_PERSON; - } - - /** - * Checks if certain helper functionality should be executed for this renderer. - * See ItemRendererHelper for more info - * - * @param type The render type - * @param item The ItemStack being rendered - * @param helper The type of helper functionality to be ran - * @return True to run the helper functionality, false to not. - */ - @Override - public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) { - return type == ItemRenderType.ENTITY && (helper == ItemRendererHelper.ENTITY_ROTATION || helper == ItemRendererHelper.ENTITY_BOBBING); - } - - /** - * Called to do the actual rendering, see ItemRenderType for details on when specific - * types are run, and what extra data is passed into the data parameter. - * - * @param type The render type - * @param item The ItemStack being rendered - * @param data Extra Type specific data - */ - @Override - public void renderItem(ItemRenderType type, ItemStack item, Object... data) { - - - - if (type == ItemRenderType.EQUIPPED_FIRST_PERSON) { - // render item - IIcon iicon = ((EntityLivingBase)data[1]).getItemIcon(item, 0); - renderFieryItemEquipped(iicon, item); - } else if (type == ItemRenderType.EQUIPPED) { - // render item - IIcon iicon = ((EntityLivingBase)data[1]).getItemIcon(item, 0); - renderFieryItemEquipped(iicon, item); - } else if (type == ItemRenderType.ENTITY) { - EntityItem entityItem = (EntityItem)data[1]; - - this.renderDroppedItem(entityItem, item); - } - } - - private void renderFieryItemEquipped(IIcon iicon, ItemStack par2ItemStack) { - int par3 = 0; - - if (iicon == null) - { - GL11.glPopMatrix(); - return; - } - - texturemanager.bindTexture(texturemanager.getResourceLocation(par2ItemStack.getItemSpriteNumber())); - TextureUtil.func_152777_a(false, false, 1.0F); - Tessellator tessellator = Tessellator.instance; - float f = iicon.getMinU(); - float f1 = iicon.getMaxU(); - float f2 = iicon.getMinV(); - float f3 = iicon.getMaxV(); - - // FULL BRIGHT - Minecraft.getMinecraft().entityRenderer.disableLightmap(0); - - ItemRenderer.renderItemIn2D(tessellator, f1, f2, f, f3, iicon.getIconWidth(), iicon.getIconHeight(), 0.0625F); - - - if (true) - { - GL11.glDepthFunc(GL11.GL_EQUAL); - GL11.glDisable(GL11.GL_LIGHTING); - GL11.glEnable(GL11.GL_BLEND); - GL11.glDisable(GL11.GL_TEXTURE_2D); - GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_DST_ALPHA); - - // pulse yellow - float f9 = (float) Math.sin((float)(Minecraft.getSystemTime() % 6000L) / 6000.0F * 2 * 3.14159F) * 0.2F + 0.2F; - - float yellooo = 0.4F; - GL11.glColor4f(yellooo, yellooo, 0.0F, f9); - - ItemRenderer.renderItemIn2D(tessellator, f1, f2, f, f3, iicon.getIconWidth(), iicon.getIconHeight(), 0.0625F); - - GL11.glEnable(GL11.GL_TEXTURE_2D); - - GL11.glDisable(GL11.GL_BLEND); - GL11.glEnable(GL11.GL_LIGHTING); - GL11.glDepthFunc(GL11.GL_LEQUAL); - } - - if (par2ItemStack.hasEffect(par3)) - { - GL11.glDepthFunc(GL11.GL_EQUAL); - GL11.glDisable(GL11.GL_LIGHTING); - texturemanager.bindTexture(RES_ITEM_GLINT); - GL11.glEnable(GL11.GL_BLEND); - OpenGlHelper.glBlendFunc(768, 1, 1, 0); - float f7 = 0.76F; - GL11.glColor4f(0.5F * f7, 0.25F * f7, 0.8F * f7, 1.0F); - GL11.glMatrixMode(GL11.GL_TEXTURE); - GL11.glPushMatrix(); - float f8 = 0.125F; - GL11.glScalef(f8, f8, f8); - float f9 = (float)(Minecraft.getSystemTime() % 3000L) / 3000.0F * 8.0F; - GL11.glTranslatef(f9, 0.0F, 0.0F); - GL11.glRotatef(-50.0F, 0.0F, 0.0F, 1.0F); - ItemRenderer.renderItemIn2D(tessellator, 0.0F, 0.0F, 1.0F, 1.0F, 256, 256, 0.0625F); - GL11.glPopMatrix(); - GL11.glPushMatrix(); - GL11.glScalef(f8, f8, f8); - f9 = (float)(Minecraft.getSystemTime() % 4873L) / 4873.0F * 8.0F; - GL11.glTranslatef(-f9, 0.0F, 0.0F); - GL11.glRotatef(10.0F, 0.0F, 0.0F, 1.0F); - ItemRenderer.renderItemIn2D(tessellator, 0.0F, 0.0F, 1.0F, 1.0F, 256, 256, 0.0625F); - GL11.glPopMatrix(); - GL11.glMatrixMode(GL11.GL_MODELVIEW); - GL11.glDisable(GL11.GL_BLEND); - GL11.glEnable(GL11.GL_LIGHTING); - GL11.glDepthFunc(GL11.GL_LEQUAL); - } - - texturemanager.bindTexture(texturemanager.getResourceLocation(par2ItemStack.getItemSpriteNumber())); - TextureUtil.func_147945_b(); - - Minecraft.getMinecraft().entityRenderer.enableLightmap(0); - } - - private void renderDroppedItem(EntityItem entityItem, ItemStack item) { - Tessellator tessellator = Tessellator.instance; - - float f9 = 0.5F; - float f10 = 0.25F; - - GL11.glPushMatrix(); - - float f12 = 0.0625F; - float f11 = 0.021875F; - - - GL11.glTranslatef(-f9, -f10, -(f12 + f11)); - - GL11.glTranslatef(0f, 0f, f12 + f11); - - this.texturemanager.bindTexture(TextureMap.locationItemsTexture); - - IIcon par2Icon = item.getIconIndex(); - - // FULL BRIGHT - Minecraft.getMinecraft().entityRenderer.disableLightmap(0); - - //GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - ItemRenderer.renderItemIn2D(tessellator, par2Icon.getMaxU(), par2Icon.getMinV(), par2Icon.getMinU(), par2Icon.getMaxV(), par2Icon.getIconWidth(), par2Icon.getIconHeight(), f12); - - Minecraft.getMinecraft().entityRenderer.enableLightmap(0); - - - GL11.glPopMatrix(); - } - -} diff --git a/src/main/java/twilightforest/client/renderer/TFGiantBlockRenderer.java b/src/main/java/twilightforest/client/renderer/TFGiantBlockRenderer.java deleted file mode 100644 index c0ea19eada..0000000000 --- a/src/main/java/twilightforest/client/renderer/TFGiantBlockRenderer.java +++ /dev/null @@ -1,111 +0,0 @@ -package twilightforest.client.renderer; - -import net.minecraft.block.Block; -import net.minecraft.client.renderer.RenderBlocks; -import net.minecraft.client.renderer.texture.TextureManager; -import net.minecraft.client.settings.GameSettings; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.item.EntityItem; -import net.minecraft.item.ItemStack; -import net.minecraft.util.IIcon; -import net.minecraftforge.client.IItemRenderer; - -import org.lwjgl.opengl.GL11; - -public class TFGiantBlockRenderer implements IItemRenderer { - - public TFGiantBlockRenderer(GameSettings gameSettings, TextureManager textureManager) { - } - - /** - * Checks if this renderer should handle a specific item's render type - * @param item The item we are trying to render - * @param type A render type to check if this renderer handles - * @return true if this renderer should handle the given render type, - * otherwise false - */ - @Override - public boolean handleRenderType(ItemStack item, ItemRenderType type) { - return type == ItemRenderType.ENTITY || type == ItemRenderType.EQUIPPED || type == ItemRenderType.EQUIPPED_FIRST_PERSON; - } - - /** - * Checks if certain helper functionality should be executed for this renderer. - * See ItemRendererHelper for more info - * - * @param type The render type - * @param item The ItemStack being rendered - * @param helper The type of helper functionality to be ran - * @return True to run the helper functionality, false to not. - */ - @Override - public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) { - return (type == ItemRenderType.ENTITY && (helper == ItemRendererHelper.ENTITY_ROTATION || helper == ItemRendererHelper.ENTITY_BOBBING)) || helper == ItemRendererHelper.BLOCK_3D; - } - - /** - * Called to do the actual rendering, see ItemRenderType for details on when specific - * types are run, and what extra data is passed into the data parameter. - * - * @param type The render type - * @param item The ItemStack being rendered - * @param data Extra Type specific data - */ - @Override - public void renderItem(ItemRenderType type, ItemStack item, Object... data) { - - if (type == ItemRenderType.EQUIPPED_FIRST_PERSON) { - // extra scaling - float scale = 4.0F; - GL11.glScalef(scale, scale, scale); - // move for first person - GL11.glTranslatef(1.0F, 0.3F, 0.75F); - GL11.glRotatef(45.0F, 0.0F, 0.0F, 1.0F); - - - // render item - IIcon iicon = ((EntityLivingBase)data[1]).getItemIcon(item, 0); - RenderBlocks renderBlocks = (RenderBlocks)data[0]; - renderGiantItemEquipped(iicon, renderBlocks, item); - } else if (type == ItemRenderType.EQUIPPED) { - // extra scaling - float scale = 4.0F; - GL11.glScalef(scale, scale, scale); - // move item for equipped - GL11.glTranslatef(0.25F, 0.3F, -0.5F); - GL11.glRotatef(15.0F, 0.0F, 0.0F, 1.0F); - - // render item - IIcon iicon = ((EntityLivingBase)data[1]).getItemIcon(item, 0); - RenderBlocks renderBlocks = (RenderBlocks)data[0]; - renderGiantItemEquipped(iicon, renderBlocks, item); - } else if (type == ItemRenderType.ENTITY) { - // extra scaling - float scale = 4.0F; - GL11.glScalef(scale, scale, scale); - // move item for dropped - GL11.glTranslatef(0.0F, 0.5F, 0.0F); - - RenderBlocks renderBlocks = (RenderBlocks)data[0]; - EntityItem entityItem = (EntityItem)data[1]; - - this.renderDroppedItem(entityItem, renderBlocks, item); - } - } - - - private void renderGiantItemEquipped(IIcon iicon, RenderBlocks renderBlocks, ItemStack itemStack) { - Block block = Block.getBlockFromItem(itemStack.getItem()); - - renderBlocks.renderBlockAsItem(block, itemStack.getItemDamage(), 1.0F); - - } - - private void renderDroppedItem(EntityItem entityItem, RenderBlocks renderBlocks, ItemStack itemStack) { - - Block block = Block.getBlockFromItem(itemStack.getItem()); - - renderBlocks.renderBlockAsItem(block, itemStack.getItemDamage(), 1.0F); - } - -} diff --git a/src/main/java/twilightforest/client/renderer/TFGiantItemRenderer.java b/src/main/java/twilightforest/client/renderer/TFGiantItemRenderer.java deleted file mode 100644 index e402669d59..0000000000 --- a/src/main/java/twilightforest/client/renderer/TFGiantItemRenderer.java +++ /dev/null @@ -1,215 +0,0 @@ -package twilightforest.client.renderer; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.ItemRenderer; -import net.minecraft.client.renderer.OpenGlHelper; -import net.minecraft.client.renderer.RenderBlocks; -import net.minecraft.client.renderer.Tessellator; -import net.minecraft.client.renderer.entity.RenderItem; -import net.minecraft.client.renderer.texture.TextureManager; -import net.minecraft.client.renderer.texture.TextureMap; -import net.minecraft.client.renderer.texture.TextureUtil; -import net.minecraft.client.settings.GameSettings; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.item.EntityItem; -import net.minecraft.item.ItemStack; -import net.minecraft.util.IIcon; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.client.IItemRenderer; - -import org.lwjgl.opengl.GL11; - -public class TFGiantItemRenderer implements IItemRenderer { - - private static final ResourceLocation RES_ITEM_GLINT = new ResourceLocation("textures/misc/enchanted_item_glint.png"); - private TextureManager texturemanager; - - public TFGiantItemRenderer(GameSettings gameSettings, TextureManager textureManager) { - this.texturemanager = textureManager; - } - - /** - * Checks if this renderer should handle a specific item's render type - * @param item The item we are trying to render - * @param type A render type to check if this renderer handles - * @return true if this renderer should handle the given render type, - * otherwise false - */ - @Override - public boolean handleRenderType(ItemStack item, ItemRenderType type) { - return type == ItemRenderType.ENTITY || type == ItemRenderType.EQUIPPED || type == ItemRenderType.EQUIPPED_FIRST_PERSON || type == ItemRenderType.INVENTORY; - } - - /** - * Checks if certain helper functionality should be executed for this renderer. - * See ItemRendererHelper for more info - * - * @param type The render type - * @param item The ItemStack being rendered - * @param helper The type of helper functionality to be ran - * @return True to run the helper functionality, false to not. - */ - @Override - public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) { - return type == ItemRenderType.ENTITY && (helper == ItemRendererHelper.ENTITY_ROTATION || helper == ItemRendererHelper.ENTITY_BOBBING); - } - - /** - * Called to do the actual rendering, see ItemRenderType for details on when specific - * types are run, and what extra data is passed into the data parameter. - * - * @param type The render type - * @param item The ItemStack being rendered - * @param data Extra Type specific data - */ - @Override - public void renderItem(ItemRenderType type, ItemStack item, Object... data) { - - - - if (type == ItemRenderType.EQUIPPED_FIRST_PERSON) { - // extra scaling - float scale = 4.0F; - GL11.glScalef(scale, scale, scale); - // move for first person - GL11.glTranslatef(-0.25F, -0.2F, 0.25F); - - // render item - IIcon iicon = ((EntityLivingBase)data[1]).getItemIcon(item, 0); - renderGiantItemEquipped(iicon, item); - } else if (type == ItemRenderType.EQUIPPED) { - // extra scaling - float scale = 4.0F; - GL11.glScalef(scale, scale, scale); - // move item for equipped - GL11.glTranslatef(-0.625F, -0.1F, 0.03F); - - // render item - IIcon iicon = ((EntityLivingBase)data[1]).getItemIcon(item, 0); - renderGiantItemEquipped(iicon, item); - } else if (type == ItemRenderType.ENTITY) { - // extra scaling - float scale = 4.0F; - GL11.glScalef(scale, scale, scale); - // move item for dropped - GL11.glTranslatef(0.0F, 0.15F, 0.0F); - - EntityItem entityItem = (EntityItem)data[1]; - - this.renderDroppedItem(entityItem, item); - } else if (type == ItemRenderType.INVENTORY) { - this.renderInventoryItem(item, (RenderBlocks)data[0]); - } - - - - - } - - private void renderInventoryItem(ItemStack itemStack, RenderBlocks renderBlocks) { - // how do we get the itemrender? - //RenderManager.instance.itemRenderer. - - IIcon iicon = itemStack.getItem().getIcon(itemStack, -1); - - GL11.glDisable(GL11.GL_LIGHTING); //Forge: Make sure that render states are reset, ad renderEffect can derp them up. - GL11.glEnable(GL11.GL_ALPHA_TEST); - - RenderItem.getInstance().renderIcon(0, 0, iicon, 16, 16); - - GL11.glDisable(GL11.GL_ALPHA_TEST); - GL11.glEnable(GL11.GL_LIGHTING); - - if (itemStack.hasEffect(0)) - { - RenderItem.getInstance().renderEffect(this.texturemanager, 0, 0); - } - GL11.glEnable(GL11.GL_LIGHTING); - - //RenderItem.getInstance().renderItemIntoGUI(null, this.texturemanager, item, 0, 0, true); - //renderItemIntoGUI - } - - private void renderGiantItemEquipped(IIcon iicon, ItemStack par2ItemStack) { - int par3 = 0; - - if (iicon == null) - { - GL11.glPopMatrix(); - return; - } - - texturemanager.bindTexture(texturemanager.getResourceLocation(par2ItemStack.getItemSpriteNumber())); - TextureUtil.func_152777_a(false, false, 1.0F); - Tessellator tessellator = Tessellator.instance; - float f = iicon.getMinU(); - float f1 = iicon.getMaxU(); - float f2 = iicon.getMinV(); - float f3 = iicon.getMaxV(); - - ItemRenderer.renderItemIn2D(tessellator, f1, f2, f, f3, iicon.getIconWidth(), iicon.getIconHeight(), 0.0625F); - - if (par2ItemStack.hasEffect(par3)) - { - GL11.glDepthFunc(GL11.GL_EQUAL); - GL11.glDisable(GL11.GL_LIGHTING); - texturemanager.bindTexture(RES_ITEM_GLINT); - GL11.glEnable(GL11.GL_BLEND); - OpenGlHelper.glBlendFunc(768, 1, 1, 0); - float f7 = 0.76F; - GL11.glColor4f(0.5F * f7, 0.25F * f7, 0.8F * f7, 1.0F); - GL11.glMatrixMode(GL11.GL_TEXTURE); - GL11.glPushMatrix(); - float f8 = 0.125F; - GL11.glScalef(f8, f8, f8); - float f9 = (float)(Minecraft.getSystemTime() % 3000L) / 3000.0F * 8.0F; - GL11.glTranslatef(f9, 0.0F, 0.0F); - GL11.glRotatef(-50.0F, 0.0F, 0.0F, 1.0F); - ItemRenderer.renderItemIn2D(tessellator, 0.0F, 0.0F, 1.0F, 1.0F, 256, 256, 0.0625F); - GL11.glPopMatrix(); - GL11.glPushMatrix(); - GL11.glScalef(f8, f8, f8); - f9 = (float)(Minecraft.getSystemTime() % 4873L) / 4873.0F * 8.0F; - GL11.glTranslatef(-f9, 0.0F, 0.0F); - GL11.glRotatef(10.0F, 0.0F, 0.0F, 1.0F); - ItemRenderer.renderItemIn2D(tessellator, 0.0F, 0.0F, 1.0F, 1.0F, 256, 256, 0.0625F); - GL11.glPopMatrix(); - GL11.glMatrixMode(GL11.GL_MODELVIEW); - GL11.glDisable(GL11.GL_BLEND); - GL11.glEnable(GL11.GL_LIGHTING); - GL11.glDepthFunc(GL11.GL_LEQUAL); - } - - texturemanager.bindTexture(texturemanager.getResourceLocation(par2ItemStack.getItemSpriteNumber())); - TextureUtil.func_147945_b(); - } - - private void renderDroppedItem(EntityItem entityItem, ItemStack item) { - Tessellator tessellator = Tessellator.instance; - - float f9 = 0.5F; - float f10 = 0.25F; - - GL11.glPushMatrix(); - - float f12 = 0.0625F; - float f11 = 0.021875F; - - - GL11.glTranslatef(-f9, -f10, -(f12 + f11)); - - GL11.glTranslatef(0f, 0f, f12 + f11); - - this.texturemanager.bindTexture(TextureMap.locationItemsTexture); - - IIcon par2Icon = item.getIconIndex(); - - - //GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - ItemRenderer.renderItemIn2D(tessellator, par2Icon.getMaxU(), par2Icon.getMinV(), par2Icon.getMinU(), par2Icon.getMaxV(), par2Icon.getIconWidth(), par2Icon.getIconHeight(), f12); - - - GL11.glPopMatrix(); - } - -} diff --git a/src/main/java/twilightforest/client/renderer/TFIceItemRenderer.java b/src/main/java/twilightforest/client/renderer/TFIceItemRenderer.java deleted file mode 100644 index 8a01934da7..0000000000 --- a/src/main/java/twilightforest/client/renderer/TFIceItemRenderer.java +++ /dev/null @@ -1,197 +0,0 @@ -package twilightforest.client.renderer; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.ItemRenderer; -import net.minecraft.client.renderer.OpenGlHelper; -import net.minecraft.client.renderer.RenderBlocks; -import net.minecraft.client.renderer.Tessellator; -import net.minecraft.client.renderer.entity.RenderItem; -import net.minecraft.client.renderer.texture.TextureManager; -import net.minecraft.client.renderer.texture.TextureMap; -import net.minecraft.client.renderer.texture.TextureUtil; -import net.minecraft.client.settings.GameSettings; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.item.EntityItem; -import net.minecraft.item.ItemStack; -import net.minecraft.util.IIcon; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.client.IItemRenderer; -import org.lwjgl.opengl.GL11; - -public class TFIceItemRenderer implements IItemRenderer { - - private static final ResourceLocation RES_ITEM_GLINT = new ResourceLocation("textures/misc/enchanted_item_glint.png"); - private TextureManager texturemanager; - - public TFIceItemRenderer(GameSettings gameSettings, TextureManager textureManager) { - this.texturemanager = textureManager; - } - - /** - * Checks if this renderer should handle a specific item's render type - * @param item The item we are trying to render - * @param type A render type to check if this renderer handles - * @return true if this renderer should handle the given render type, - * otherwise false - */ - @Override - public boolean handleRenderType(ItemStack item, ItemRenderType type) { - return type == ItemRenderType.ENTITY || type == ItemRenderType.EQUIPPED || type == ItemRenderType.EQUIPPED_FIRST_PERSON || type == ItemRenderType.INVENTORY; - } - - /** - * Checks if certain helper functionality should be executed for this renderer. - * See ItemRendererHelper for more info - * - * @param type The render type - * @param item The ItemStack being rendered - * @param helper The type of helper functionality to be ran - * @return True to run the helper functionality, false to not. - */ - @Override - public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) { - return type == ItemRenderType.ENTITY && (helper == ItemRendererHelper.ENTITY_ROTATION || helper == ItemRendererHelper.ENTITY_BOBBING); - } - - /** - * Called to do the actual rendering, see ItemRenderType for details on when specific - * types are run, and what extra data is passed into the data parameter. - * - * @param type The render type - * @param item The ItemStack being rendered - * @param data Extra Type specific data - */ - @Override - public void renderItem(ItemRenderType type, ItemStack item, Object... data) { - - - - if (type == ItemRenderType.EQUIPPED_FIRST_PERSON) { - // render item - IIcon iicon = ((EntityLivingBase)data[1]).getItemIcon(item, 0); - renderIcyItemEquipped(iicon, item); - } else if (type == ItemRenderType.EQUIPPED) { - // render item - IIcon iicon = ((EntityLivingBase)data[1]).getItemIcon(item, 0); - renderIcyItemEquipped(iicon, item); - } else if (type == ItemRenderType.ENTITY) { - EntityItem entityItem = (EntityItem)data[1]; - - this.renderDroppedItem(entityItem, item); - } else if (type == ItemRenderType.INVENTORY) { - this.renderInventoryItem(item, (RenderBlocks)data[0]); - } - } - - private void renderIcyItemEquipped(IIcon iicon, ItemStack par2ItemStack) { - int par3 = 0; - - if (iicon == null) - { - GL11.glPopMatrix(); - return; - } - - texturemanager.bindTexture(texturemanager.getResourceLocation(par2ItemStack.getItemSpriteNumber())); - TextureUtil.func_152777_a(false, false, 1.0F); - Tessellator tessellator = Tessellator.instance; - float f = iicon.getMinU(); - float f1 = iicon.getMaxU(); - float f2 = iicon.getMinV(); - float f3 = iicon.getMaxV(); - - GL11.glEnable(GL11.GL_BLEND); - GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - - ItemRenderer.renderItemIn2D(tessellator, f1, f2, f, f3, iicon.getIconWidth(), iicon.getIconHeight(), 0.0625F); - - GL11.glDisable(GL11.GL_BLEND); - - if (par2ItemStack.hasEffect(par3)) - { - GL11.glDepthFunc(GL11.GL_EQUAL); - GL11.glDisable(GL11.GL_LIGHTING); - texturemanager.bindTexture(RES_ITEM_GLINT); - GL11.glEnable(GL11.GL_BLEND); - OpenGlHelper.glBlendFunc(768, 1, 1, 0); - float f7 = 0.76F; - GL11.glColor4f(0.5F * f7, 0.25F * f7, 0.8F * f7, 1.0F); - GL11.glMatrixMode(GL11.GL_TEXTURE); - GL11.glPushMatrix(); - float f8 = 0.125F; - GL11.glScalef(f8, f8, f8); - float f9 = (float)(Minecraft.getSystemTime() % 3000L) / 3000.0F * 8.0F; - GL11.glTranslatef(f9, 0.0F, 0.0F); - GL11.glRotatef(-50.0F, 0.0F, 0.0F, 1.0F); - ItemRenderer.renderItemIn2D(tessellator, 0.0F, 0.0F, 1.0F, 1.0F, 256, 256, 0.0625F); - GL11.glPopMatrix(); - GL11.glPushMatrix(); - GL11.glScalef(f8, f8, f8); - f9 = (float)(Minecraft.getSystemTime() % 4873L) / 4873.0F * 8.0F; - GL11.glTranslatef(-f9, 0.0F, 0.0F); - GL11.glRotatef(10.0F, 0.0F, 0.0F, 1.0F); - ItemRenderer.renderItemIn2D(tessellator, 0.0F, 0.0F, 1.0F, 1.0F, 256, 256, 0.0625F); - GL11.glPopMatrix(); - GL11.glMatrixMode(GL11.GL_MODELVIEW); - GL11.glDisable(GL11.GL_BLEND); - GL11.glEnable(GL11.GL_LIGHTING); - GL11.glDepthFunc(GL11.GL_LEQUAL); - } - - texturemanager.bindTexture(texturemanager.getResourceLocation(par2ItemStack.getItemSpriteNumber())); - TextureUtil.func_147945_b(); - } - - private void renderDroppedItem(EntityItem entityItem, ItemStack item) { - Tessellator tessellator = Tessellator.instance; - - float f9 = 0.5F; - float f10 = 0.25F; - - GL11.glPushMatrix(); - - float f12 = 0.0625F; - float f11 = 0.021875F; - - - GL11.glTranslatef(-f9, -f10, -(f12 + f11)); - - GL11.glTranslatef(0f, 0f, f12 + f11); - - this.texturemanager.bindTexture(TextureMap.locationItemsTexture); - - IIcon par2Icon = item.getIconIndex(); - - GL11.glEnable(GL11.GL_BLEND); - GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - - ItemRenderer.renderItemIn2D(tessellator, par2Icon.getMaxU(), par2Icon.getMinV(), par2Icon.getMinU(), par2Icon.getMaxV(), par2Icon.getIconWidth(), par2Icon.getIconHeight(), f12); - - GL11.glDisable(GL11.GL_BLEND); - - - GL11.glPopMatrix(); - } - - - private void renderInventoryItem(ItemStack itemStack, RenderBlocks renderBlocks) { - IIcon iicon = itemStack.getItem().getIcon(itemStack, -1); - - GL11.glDisable(GL11.GL_LIGHTING); //Forge: Make sure that render states are reset, ad renderEffect can derp them up. - GL11.glEnable(GL11.GL_ALPHA_TEST); - GL11.glEnable(GL11.GL_BLEND); - GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - - RenderItem.getInstance().renderIcon(0, 0, iicon, 16, 16); - - GL11.glDisable(GL11.GL_BLEND); - GL11.glDisable(GL11.GL_ALPHA_TEST); - GL11.glEnable(GL11.GL_LIGHTING); - - if (itemStack.hasEffect(0)) - { - RenderItem.getInstance().renderEffect(this.texturemanager, 0, 0); - } - GL11.glEnable(GL11.GL_LIGHTING); - } -} diff --git a/src/main/java/twilightforest/client/renderer/TFMagicMapRenderer.java b/src/main/java/twilightforest/client/renderer/TFMagicMapRenderer.java deleted file mode 100644 index 2cd0a72b48..0000000000 --- a/src/main/java/twilightforest/client/renderer/TFMagicMapRenderer.java +++ /dev/null @@ -1,229 +0,0 @@ -package twilightforest.client.renderer; - -import java.util.Collection; -import java.util.List; - -import net.minecraft.client.renderer.Tessellator; -import net.minecraft.client.renderer.entity.RenderItem; -import net.minecraft.client.renderer.entity.RenderManager; -import net.minecraft.client.renderer.texture.DynamicTexture; -import net.minecraft.client.renderer.texture.TextureManager; -import net.minecraft.client.settings.GameSettings; -import net.minecraft.entity.item.EntityItem; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.util.ResourceLocation; -import net.minecraft.world.biome.BiomeGenBase; -import net.minecraft.world.storage.MapData; -import net.minecraft.world.storage.MapData.MapCoord; - -import org.lwjgl.opengl.GL11; - -import twilightforest.TFMagicMapData; -import twilightforest.TwilightForestMod; -import twilightforest.item.ItemTFMagicMap; -import twilightforest.item.TFItems; - -public class TFMagicMapRenderer implements net.minecraftforge.client.IItemRenderer { - - private static final ResourceLocation vanillaMapIcons = new ResourceLocation("textures/map/map_icons.png"); - private static final ResourceLocation twilightMapIcons = new ResourceLocation(TwilightForestMod.GUI_DIR + "mapicons.png"); - private static final ResourceLocation mapBackgroundTextures = new ResourceLocation("textures/map/map_background.png"); - private int[] intArray = new int[16384]; - private DynamicTexture bufferedImage; - private final ResourceLocation textureLoc; - - - public TFMagicMapRenderer(GameSettings par1GameSettings, TextureManager par2TextureManager) - { - this.bufferedImage = new DynamicTexture(128, 128); - this.textureLoc = par2TextureManager.getDynamicTextureLocation("map", this.bufferedImage); - this.intArray = this.bufferedImage.getTextureData(); - - for (int i = 0; i < this.intArray.length; ++i) - { - this.intArray[i] = 0; - } - } - - /** - * Checks if this renderer should handle a specific item's render type - * @param item The item we are trying to render - * @param type A render type to check if this renderer handles - * @return true if this renderer should handle the given render type, - * otherwise false - */ - @Override - public boolean handleRenderType(ItemStack item, ItemRenderType type) { - return item.getItem() == TFItems.magicMap && (type == ItemRenderType.FIRST_PERSON_MAP || (RenderItem.renderInFrame && type == ItemRenderType.ENTITY)); - } - - /** - * Checks if certain helper functionality should be executed for this renderer. - * See ItemRendererHelper for more info - * - * @param type The render type - * @param item The ItemStack being rendered - * @param helper The type of helper functionality to be ran - * @return True to run the helper functionality, false to not. - */ - @Override - public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) { - return false; - } - - /** - * Called to do the actual rendering, see ItemRenderType for details on when specific - * types are run, and what extra data is passed into the data parameter. - * - * @param type The render type - * @param item The ItemStack being rendered - * @param data Extra Type specific data - */ - @Override - public void renderItem(ItemRenderType type, ItemStack item, Object... data) { - - if (type == ItemRenderType.FIRST_PERSON_MAP) - { - // get our stuff out of that object array - EntityPlayer player = (EntityPlayer)data[0]; - TextureManager renderEngine = (TextureManager)data[1]; - MapData mapData = (MapData)data[2]; - // if we have data, render it - if (mapData != null && mapData instanceof TFMagicMapData) - { - renderMap(player, renderEngine, (TFMagicMapData)mapData); - } - } - else if (RenderItem.renderInFrame) - { - EntityItem entity = (EntityItem)data[1]; - - TFMagicMapData mapData = ((ItemTFMagicMap) TFItems.magicMap).getMapData(item, entity.worldObj); - - - // if we have data, render it - if (mapData != null) - { - renderMapInFrame(item, RenderManager.instance, mapData); - } - } - } - - - @SuppressWarnings("unchecked") - public void renderMap(EntityPlayer par1EntityPlayer, TextureManager par2TextureManager, TFMagicMapData par3MapData) - { - TFMagicMapData magicMapData = (TFMagicMapData)par3MapData; - - for (int i = 0; i < 16384; ++i) - { - int colorByte = par3MapData.colors[i] & 0xFF; - - if (colorByte == 0) { - this.intArray[i] = (i + i / 128 & 1) * 8 + 16 << 24; - } - else { - int biomeID = colorByte - 1; - BiomeGenBase biome = BiomeGenBase.getBiomeGenArray()[biomeID]; - if (biome != null) { - this.intArray[i] = -16777216 | biome.color; - } - } - } - - this.bufferedImage.updateDynamicTexture(); - byte var15 = 0; - byte var16 = 0; - Tessellator tesselator = Tessellator.instance; - float var18 = 0.0F; - par2TextureManager.bindTexture(this.textureLoc); - GL11.glEnable(GL11.GL_BLEND); - GL11.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA); - GL11.glDisable(GL11.GL_ALPHA_TEST); - tesselator.startDrawingQuads(); - tesselator.addVertexWithUV((double)((float)(var15 + 0) + var18), (double)((float)(var16 + 128) - var18), -0.009999999776482582D, 0.0D, 1.0D); - tesselator.addVertexWithUV((double)((float)(var15 + 128) - var18), (double)((float)(var16 + 128) - var18), -0.009999999776482582D, 1.0D, 1.0D); - tesselator.addVertexWithUV((double)((float)(var15 + 128) - var18), (double)((float)(var16 + 0) + var18), -0.009999999776482582D, 1.0D, 0.0D); - tesselator.addVertexWithUV((double)((float)(var15 + 0) + var18), (double)((float)(var16 + 0) + var18), -0.009999999776482582D, 0.0D, 0.0D); - tesselator.draw(); - GL11.glEnable(GL11.GL_ALPHA_TEST); - GL11.glDisable(GL11.GL_BLEND); - par2TextureManager.bindTexture(vanillaMapIcons); - for(MapCoord mapCoord : (Collection)par3MapData.playersVisibleOnMap.values()) - { - GL11.glPushMatrix(); - GL11.glTranslatef((float)var15 + (float)mapCoord.centerX / 2.0F + 64.0F, (float)var16 + (float)mapCoord.centerZ / 2.0F + 64.0F, -0.04F); - GL11.glRotatef((float)(mapCoord.iconRotation * 360) / 16.0F, 0.0F, 0.0F, 1.0F); - GL11.glScalef(4.0F, 4.0F, 3.0F); - GL11.glTranslatef(-0.125F, 0.125F, 0.0F); - float var21 = (float)(mapCoord.iconSize % 4 + 0) / 4.0F; - float var23 = (float)(mapCoord.iconSize / 4 + 0) / 4.0F; - float var22 = (float)(mapCoord.iconSize % 4 + 1) / 4.0F; - float var24 = (float)(mapCoord.iconSize / 4 + 1) / 4.0F; - tesselator.startDrawingQuads(); - tesselator.addVertexWithUV(-1.0D, 1.0D, 0.0D, (double)var21, (double)var23); - tesselator.addVertexWithUV(1.0D, 1.0D, 0.0D, (double)var22, (double)var23); - tesselator.addVertexWithUV(1.0D, -1.0D, 0.0D, (double)var22, (double)var24); - tesselator.addVertexWithUV(-1.0D, -1.0D, 0.0D, (double)var21, (double)var24); - tesselator.draw(); - GL11.glPopMatrix(); - } - - par2TextureManager.bindTexture(twilightMapIcons); - - for(MapCoord mapCoord : (List)magicMapData.featuresVisibleOnMap) - { - GL11.glPushMatrix(); - GL11.glTranslatef((float)var15 + (float)mapCoord.centerX / 2.0F + 64.0F, (float)var16 + (float)mapCoord.centerZ / 2.0F + 64.0F, -0.02F); - GL11.glRotatef((float)(mapCoord.iconRotation * 360) / 16.0F, 0.0F, 0.0F, 1.0F); - GL11.glScalef(4.0F, 4.0F, 3.0F); - GL11.glTranslatef(-0.125F, 0.125F, 0.0F); - float var21 = (float)(mapCoord.iconSize % 8 + 0) / 8.0F; - float var23 = (float)(mapCoord.iconSize / 8 + 0) / 8.0F; - float var22 = (float)(mapCoord.iconSize % 8 + 1) / 8.0F; - float var24 = (float)(mapCoord.iconSize / 8 + 1) / 8.0F; - tesselator.startDrawingQuads(); - tesselator.addVertexWithUV(-1.0D, 1.0D, 0.0D, (double)var21, (double)var23); - tesselator.addVertexWithUV(1.0D, 1.0D, 0.0D, (double)var22, (double)var23); - tesselator.addVertexWithUV(1.0D, -1.0D, 0.0D, (double)var22, (double)var24); - tesselator.addVertexWithUV(-1.0D, -1.0D, 0.0D, (double)var21, (double)var24); - tesselator.draw(); - GL11.glPopMatrix(); - } - -// GL11.glPushMatrix(); -// GL11.glTranslatef(0.0F, 0.0F, -0.04F); -// GL11.glScalef(1.0F, 1.0F, 1.0F); -// this.fontRenderer.drawString(par3MapData.mapName, var15, var16, -16777216); -// GL11.glPopMatrix(); - } - - private void renderMapInFrame(ItemStack item, RenderManager renderManager, TFMagicMapData mapData) { - - // do some rotations so that we get vaguely in the right place - GL11.glRotatef(180.0F, 0.0F, 1.0F, 0.0F); - GL11.glRotatef(180.0F, 0.0F, 0.0F, 1.0F); - GL11.glScalef(0.00781250F, 0.00781250F, 0.00781250F); - GL11.glTranslatef(-65.0F, -111.0F, -3.0F); - GL11.glNormal3f(0.0F, 0.0F, -1.0F); - - // draw background - renderManager.renderEngine.bindTexture(mapBackgroundTextures); - Tessellator tessellator = Tessellator.instance; - tessellator.startDrawingQuads(); - byte b0 = 7; - tessellator.addVertexWithUV((double)(0 - b0), (double)(128 + b0), 0.0D, 0.0D, 1.0D); - tessellator.addVertexWithUV((double)(128 + b0), (double)(128 + b0), 0.0D, 1.0D, 1.0D); - tessellator.addVertexWithUV((double)(128 + b0), (double)(0 - b0), 0.0D, 1.0D, 0.0D); - tessellator.addVertexWithUV((double)(0 - b0), (double)(0 - b0), 0.0D, 0.0D, 0.0D); - tessellator.draw(); - - // push map texture slightly off background - GL11.glTranslatef(0.0F, 0.0F, -1.0F); - - // draw map - renderMap(null, renderManager.renderEngine, mapData); - } - -} diff --git a/src/main/java/twilightforest/client/renderer/TFMazeMapRenderer.java b/src/main/java/twilightforest/client/renderer/TFMazeMapRenderer.java deleted file mode 100644 index 6a934d0b3b..0000000000 --- a/src/main/java/twilightforest/client/renderer/TFMazeMapRenderer.java +++ /dev/null @@ -1,110 +0,0 @@ -package twilightforest.client.renderer; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.Tessellator; -import net.minecraft.client.renderer.entity.RenderItem; -import net.minecraft.client.renderer.entity.RenderManager; -import net.minecraft.client.renderer.texture.TextureManager; -import net.minecraft.client.settings.GameSettings; -import net.minecraft.entity.item.EntityItem; -import net.minecraft.item.ItemStack; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.client.IItemRenderer; - -import org.lwjgl.opengl.GL11; - -import twilightforest.TFMazeMapData; -import twilightforest.item.ItemTFMazeMap; -import twilightforest.item.TFItems; - -public class TFMazeMapRenderer implements IItemRenderer { - - private static final ResourceLocation mapBackgroundTextures = new ResourceLocation("textures/map/map_background.png"); - - - public TFMazeMapRenderer(GameSettings gameSettings, TextureManager textureManager) { - // TODO Auto-generated constructor stub - } - - /** - * Checks if this renderer should handle a specific item's render type - * @param item The item we are trying to render - * @param type A render type to check if this renderer handles - * @return true if this renderer should handle the given render type, - * otherwise false - */ - @Override - public boolean handleRenderType(ItemStack item, ItemRenderType type) { - return (item.getItem() == TFItems.mazeMap || item.getItem() == TFItems.oreMap) && (RenderItem.renderInFrame && type == ItemRenderType.ENTITY); - } - - /** - * Checks if certain helper functionality should be executed for this renderer. - * See ItemRendererHelper for more info - * - * @param type The render type - * @param item The ItemStack being rendered - * @param helper The type of helper functionality to be ran - * @return True to run the helper functionality, false to not. - */ - @Override - public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) { - return false; - } - - /** - * Called to do the actual rendering, see ItemRenderType for details on when specific - * types are run, and what extra data is passed into the data parameter. - * - * @param type The render type - * @param item The ItemStack being rendered - * @param data Extra Type specific data - */ - @Override - public void renderItem(ItemRenderType type, ItemStack item, Object... data) { - - if (RenderItem.renderInFrame) - { - //RenderBlocks renderBlocks = (RenderBlocks)data[0]; - EntityItem entity = (EntityItem)data[1]; - - TFMazeMapData mapData = ((ItemTFMazeMap) TFItems.mazeMap).getMapData(item, entity.worldObj); - - - // if we have data, render it - if (mapData != null) - { - renderMapInFrame(item, RenderManager.instance, mapData); - } - } - } - - private void renderMapInFrame(ItemStack item, RenderManager renderManager, TFMazeMapData mapData) { - - // do some rotations so that we get vaguely in the right place - GL11.glRotatef(180.0F, 0.0F, 1.0F, 0.0F); - GL11.glRotatef(180.0F, 0.0F, 0.0F, 1.0F); - GL11.glScalef(0.00781250F, 0.00781250F, 0.00781250F); - GL11.glTranslatef(-65.0F, -111.0F, -3.0F); - GL11.glNormal3f(0.0F, 0.0F, -1.0F); - - // draw background - renderManager.renderEngine.bindTexture(mapBackgroundTextures); - Tessellator tessellator = Tessellator.instance; - tessellator.startDrawingQuads(); - byte b0 = 7; - tessellator.addVertexWithUV((double)(0 - b0), (double)(128 + b0), 0.0D, 0.0D, 1.0D); - tessellator.addVertexWithUV((double)(128 + b0), (double)(128 + b0), 0.0D, 1.0D, 1.0D); - tessellator.addVertexWithUV((double)(128 + b0), (double)(0 - b0), 0.0D, 1.0D, 0.0D); - tessellator.addVertexWithUV((double)(0 - b0), (double)(0 - b0), 0.0D, 0.0D, 0.0D); - tessellator.draw(); - - // push map texture slightly off background - GL11.glTranslatef(0.0F, 0.0F, -1.0F); - - // draw map - Minecraft.getMinecraft().entityRenderer.getMapItemRenderer().func_148250_a(mapData, false); - - } - -} diff --git a/src/main/java/twilightforest/client/renderer/TFOverlays.java b/src/main/java/twilightforest/client/renderer/TFOverlays.java new file mode 100644 index 0000000000..8f50d25033 --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/TFOverlays.java @@ -0,0 +1,71 @@ +package twilightforest.client.renderer; + +import com.mojang.blaze3d.platform.GlStateManager; +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.AttackIndicatorStatus; +import net.minecraft.client.Minecraft; +import net.minecraft.client.Options; +import net.minecraft.client.gui.Gui; +import net.minecraft.client.gui.GuiComponent; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.ItemTags; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.GameType; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.client.event.RegisterGuiOverlaysEvent; +import net.minecraftforge.client.gui.overlay.VanillaGuiOverlay; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; +import twilightforest.TFConfig; +import twilightforest.TwilightForestMod; +import twilightforest.entity.passive.QuestRam; + +import java.util.Objects; + +@Mod.EventBusSubscriber(modid = TwilightForestMod.ID, value = Dist.CLIENT, bus = Mod.EventBusSubscriber.Bus.MOD) +public class TFOverlays { + //for some reason we need a 256x256 texture to actually render anything so i'll just make this a generic icons sheet + //if we want to add any more overlay things in the future, we can simply add more icons! + private static final ResourceLocation TF_ICONS_SHEET = TwilightForestMod.prefix("textures/gui/tf_icons.png"); + + @SubscribeEvent + public static void registerOverlays(RegisterGuiOverlaysEvent event) { + event.registerAbove(VanillaGuiOverlay.CROSSHAIR.id(), "quest_ram_indicator", (gui, poseStack, partialTick, screenWidth, screenHeight) -> { + Minecraft minecraft = Minecraft.getInstance(); + LocalPlayer player = minecraft.player; + if (player != null && !minecraft.options.hideGui && TFConfig.CLIENT_CONFIG.showQuestRamCrosshairIndicator.get()) { + RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); + RenderSystem.setShader(GameRenderer::getPositionTexShader); + RenderSystem.setShaderTexture(0, TF_ICONS_SHEET); + RenderSystem.enableBlend(); + renderIndicator(minecraft, poseStack, gui, player, screenWidth, screenHeight); + RenderSystem.disableBlend(); + } + }); + } + + public static void renderIndicator(Minecraft minecraft, PoseStack poseStack, Gui gui, Player player, int screenWidth, int screenHeight) { + Options options = minecraft.options; + if (options.getCameraType().isFirstPerson()) { + if (minecraft.gameMode.getPlayerMode() != GameType.SPECTATOR || gui.canRenderCrosshairForSpectator(minecraft.hitResult)) { + RenderSystem.blendFuncSeparate(GlStateManager.SourceFactor.ONE_MINUS_DST_COLOR, GlStateManager.DestFactor.ONE_MINUS_SRC_COLOR, GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ZERO); + int j = ((screenHeight - 1) / 2) - 11; + int k = ((screenWidth - 1) / 2) - 3; + if (minecraft.crosshairPickEntity instanceof QuestRam ram) { + ItemStack stack = player.getInventory().getItem(player.getInventory().selected); + if (!stack.isEmpty() && stack.is(ItemTags.WOOL)) { + if (ram.guessColor(stack) != null && !ram.isColorPresent(Objects.requireNonNull(ram.guessColor(stack)))) { + GuiComponent.blit(poseStack, k, j, 0, 0, 7, 7); + } else { + GuiComponent.blit(poseStack, k, j, 7, 0, 7, 7); + } + } + } + } + } + } +} diff --git a/src/main/java/twilightforest/client/renderer/TFRenderTypes.java b/src/main/java/twilightforest/client/renderer/TFRenderTypes.java new file mode 100644 index 0000000000..be28f6593f --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/TFRenderTypes.java @@ -0,0 +1,28 @@ +package twilightforest.client.renderer; + +import com.mojang.blaze3d.vertex.DefaultVertexFormat; +import com.mojang.blaze3d.vertex.VertexFormat; +import net.minecraft.client.renderer.RenderStateShard; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.resources.ResourceLocation; + +import javax.annotation.Nonnull; +import javax.annotation.ParametersAreNonnullByDefault; + +@ParametersAreNonnullByDefault +public class TFRenderTypes extends RenderType { + public TFRenderTypes(String name, VertexFormat vertexFormat, VertexFormat.Mode mode, int bufferSize, boolean crumbling, boolean sort, Runnable setup, Runnable clear) { + super(name, vertexFormat, mode, bufferSize, crumbling, sort, setup, clear); + } + + @Nonnull + public static RenderType getProtectionBox(ResourceLocation resourceLocation, float t, float t1) { + return create("protection_box", DefaultVertexFormat.NEW_ENTITY, VertexFormat.Mode.QUADS, 256, false, true, + RenderType.CompositeState.builder().setShaderState(RENDERTYPE_ENERGY_SWIRL_SHADER) + .setTextureState(new RenderStateShard.TextureStateShard(resourceLocation, false, false)) + .setTexturingState(new RenderStateShard.OffsetTexturingStateShard(t, t1)) + .setTransparencyState(TRANSLUCENT_TRANSPARENCY).setCullState(NO_CULL) + .setLightmapState(LIGHTMAP).setOverlayState(OVERLAY) + .createCompositeState(false)); + } +} diff --git a/src/main/java/twilightforest/client/renderer/TFSkyRenderer.java b/src/main/java/twilightforest/client/renderer/TFSkyRenderer.java index 68697487f7..50591b7f6f 100644 --- a/src/main/java/twilightforest/client/renderer/TFSkyRenderer.java +++ b/src/main/java/twilightforest/client/renderer/TFSkyRenderer.java @@ -1,348 +1,159 @@ package twilightforest.client.renderer; -import java.util.Random; - +import com.mojang.blaze3d.platform.GlStateManager; +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.*; +import com.mojang.math.Axis; +import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; -import net.minecraft.client.multiplayer.WorldClient; -import net.minecraft.client.renderer.GLAllocation; -import net.minecraft.client.renderer.RenderHelper; -import net.minecraft.client.renderer.Tessellator; -import net.minecraft.util.Vec3; -import net.minecraft.world.World; -import net.minecraftforge.client.IRenderHandler; - -import org.lwjgl.opengl.GL11; - -import twilightforest.world.TFWorld; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public class TFSkyRenderer extends IRenderHandler { - - /** The star GL Call list */ - private int starGLCallList; - - /** OpenGL sky list */ - private int glSkyList; - - /** OpenGL sky list 2 */ - private int glSkyList2; - - @SideOnly(Side.CLIENT) - public TFSkyRenderer() - { - this.starGLCallList = GLAllocation.generateDisplayLists(3); - GL11.glPushMatrix(); - GL11.glNewList(this.starGLCallList, GL11.GL_COMPILE); - this.renderStars(); - GL11.glEndList(); - GL11.glPopMatrix(); - Tessellator var5 = Tessellator.instance; - this.glSkyList = this.starGLCallList + 1; - GL11.glNewList(this.glSkyList, GL11.GL_COMPILE); - byte var7 = 64; - int var8 = 256 / var7 + 2; - float var6 = 16.0F; - int var9; - int var10; - - for (var9 = -var7 * var8; var9 <= var7 * var8; var9 += var7) - { - for (var10 = -var7 * var8; var10 <= var7 * var8; var10 += var7) - { - var5.startDrawingQuads(); - var5.addVertex((double)(var9 + 0), (double)var6, (double)(var10 + 0)); - var5.addVertex((double)(var9 + var7), (double)var6, (double)(var10 + 0)); - var5.addVertex((double)(var9 + var7), (double)var6, (double)(var10 + var7)); - var5.addVertex((double)(var9 + 0), (double)var6, (double)(var10 + var7)); - var5.draw(); - } - } - - GL11.glEndList(); - this.glSkyList2 = this.starGLCallList + 2; - GL11.glNewList(this.glSkyList2, GL11.GL_COMPILE); - var6 = -16.0F; - var5.startDrawingQuads(); - - for (var9 = -var7 * var8; var9 <= var7 * var8; var9 += var7) - { - for (var10 = -var7 * var8; var10 <= var7 * var8; var10 += var7) - { - var5.addVertex((double)(var9 + var7), (double)var6, (double)(var10 + 0)); - var5.addVertex((double)(var9 + 0), (double)var6, (double)(var10 + 0)); - var5.addVertex((double)(var9 + 0), (double)var6, (double)(var10 + var7)); - var5.addVertex((double)(var9 + var7), (double)var6, (double)(var10 + var7)); - } - } - - var5.draw(); - GL11.glEndList(); - } - - - @Override - @SideOnly(Side.CLIENT) - public void render(float partialTicks, WorldClient world, Minecraft mc) { - GL11.glDisable(GL11.GL_TEXTURE_2D); - Vec3 var2 = getTwilightSkyColor(world);//Vec3 var2 = world.getSkyColor(mc.renderViewEntity, partialTicks); - float var3 = (float)var2.xCoord; - float var4 = (float)var2.yCoord; - float var5 = (float)var2.zCoord; - float var8; - - if (mc.gameSettings.anaglyph) - { - float var6 = (var3 * 30.0F + var4 * 59.0F + var5 * 11.0F) / 100.0F; - float var7 = (var3 * 30.0F + var4 * 70.0F) / 100.0F; - var8 = (var3 * 30.0F + var5 * 70.0F) / 100.0F; - var3 = var6; - var4 = var7; - var5 = var8; - } - - GL11.glColor3f(var3, var4, var5); - Tessellator var23 = Tessellator.instance; - GL11.glDepthMask(false); - GL11.glEnable(GL11.GL_FOG); - GL11.glColor3f(var3, var4, var5); - GL11.glCallList(this.glSkyList); - GL11.glDisable(GL11.GL_FOG); - GL11.glDisable(GL11.GL_ALPHA_TEST); - GL11.glEnable(GL11.GL_BLEND); - GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - RenderHelper.disableStandardItemLighting(); -// float[] var24 = world.provider.calcSunriseSunsetColors(world.getCelestialAngle(partialTicks), partialTicks); - float var9; - float var10; - float var11; - float var12; - -// if (var24 != null) -// { -// GL11.glDisable(GL11.GL_TEXTURE_2D); -// GL11.glShadeModel(GL11.GL_SMOOTH); -// GL11.glPushMatrix(); -// GL11.glRotatef(90.0F, 1.0F, 0.0F, 0.0F); -// GL11.glRotatef(MathHelper.sin(world.getCelestialAngleRadians(partialTicks)) < 0.0F ? 180.0F : 0.0F, 0.0F, 0.0F, 1.0F); -// GL11.glRotatef(90.0F, 0.0F, 0.0F, 1.0F); -// var8 = var24[0]; -// var9 = var24[1]; -// var10 = var24[2]; -// float var13; -// -// if (mc.gameSettings.anaglyph) -// { -// var11 = (var8 * 30.0F + var9 * 59.0F + var10 * 11.0F) / 100.0F; -// var12 = (var8 * 30.0F + var9 * 70.0F) / 100.0F; -// var13 = (var8 * 30.0F + var10 * 70.0F) / 100.0F; -// var8 = var11; -// var9 = var12; -// var10 = var13; -// } -// -// var23.startDrawing(6); -// var23.setColorRGBA_F(var8, var9, var10, var24[3]); -// var23.addVertex(0.0D, 100.0D, 0.0D); -// byte var26 = 16; -// var23.setColorRGBA_F(var24[0], var24[1], var24[2], 0.0F); -// -// for (int var27 = 0; var27 <= var26; ++var27) -// { -// var13 = (float)var27 * (float)Math.PI * 2.0F / (float)var26; -// float var14 = MathHelper.sin(var13); -// float var15 = MathHelper.cos(var13); -// var23.addVertex((double)(var14 * 120.0F), (double)(var15 * 120.0F), (double)(-var15 * 40.0F * var24[3])); -// } -// -// var23.draw(); -// GL11.glPopMatrix(); -// GL11.glShadeModel(GL11.GL_FLAT); -// } - - GL11.glEnable(GL11.GL_TEXTURE_2D); - GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE); - GL11.glPushMatrix(); - var8 = 1.0F - world.getRainStrength(partialTicks); - var9 = 0.0F; - var10 = 0.0F; - var11 = 0.0F; - GL11.glColor4f(1.0F, 1.0F, 1.0F, var8); - GL11.glTranslatef(var9, var10, var11); - GL11.glRotatef(-90.0F, 0.0F, 1.0F, 0.0F); - GL11.glRotatef(getRealCelestialAngle(world, partialTicks) * 360.0F, 1.0F, 0.0F, 0.0F);//GL11.glRotatef(world.getCelestialAngle(partialTicks) * 360.0F, 1.0F, 0.0F, 0.0F); - var12 = 30.0F; -// GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.renderEngine.getTexture("/terrain/sun.png")); -// var23.startDrawingQuads(); -// var23.addVertexWithUV((double)(-var12), 100.0D, (double)(-var12), 0.0D, 0.0D); -// var23.addVertexWithUV((double)var12, 100.0D, (double)(-var12), 1.0D, 0.0D); -// var23.addVertexWithUV((double)var12, 100.0D, (double)var12, 1.0D, 1.0D); -// var23.addVertexWithUV((double)(-var12), 100.0D, (double)var12, 0.0D, 1.0D); -// var23.draw(); -// var12 = 20.0F; -// GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.renderEngine.getTexture("/terrain/moon_phases.png")); -// int var28 = world.getMoonPhase(partialTicks); -// int var30 = var28 % 4; -// int var29 = var28 / 4 % 2; -// float var16 = (float)(var30 + 0) / 4.0F; -// float var17 = (float)(var29 + 0) / 2.0F; -// float var18 = (float)(var30 + 1) / 4.0F; -// float var19 = (float)(var29 + 1) / 2.0F; -// var23.startDrawingQuads(); -// var23.addVertexWithUV((double)(-var12), -100.0D, (double)var12, (double)var18, (double)var19); -// var23.addVertexWithUV((double)var12, -100.0D, (double)var12, (double)var16, (double)var19); -// var23.addVertexWithUV((double)var12, -100.0D, (double)(-var12), (double)var16, (double)var17); -// var23.addVertexWithUV((double)(-var12), -100.0D, (double)(-var12), (double)var18, (double)var17); -// var23.draw(); - GL11.glDisable(GL11.GL_TEXTURE_2D); - float var20 = 1.0f;//world.getStarBrightness(partialTicks) * var8; - - if (var20 > 0.0F) - { - GL11.glColor4f(var20, var20, var20, var20); - GL11.glCallList(this.starGLCallList); - } - - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - GL11.glDisable(GL11.GL_BLEND); - GL11.glEnable(GL11.GL_ALPHA_TEST); - GL11.glEnable(GL11.GL_FOG); - GL11.glPopMatrix(); - GL11.glDisable(GL11.GL_TEXTURE_2D); - GL11.glColor3f(0.0F, 0.0F, 0.0F); - double var25 = mc.thePlayer.getPosition(partialTicks).yCoord - TFWorld.SEALEVEL; - - if (var25 < 0.0D) - { - GL11.glPushMatrix(); - GL11.glTranslatef(0.0F, 12.0F, 0.0F); - GL11.glCallList(this.glSkyList2); - GL11.glPopMatrix(); - var10 = 1.0F; - var11 = -((float)(var25 + 65.0D)); - var12 = -var10; - var23.startDrawingQuads(); - var23.setColorRGBA_I(0, 255); - var23.addVertex((double)(-var10), (double)var11, (double)var10); - var23.addVertex((double)var10, (double)var11, (double)var10); - var23.addVertex((double)var10, (double)var12, (double)var10); - var23.addVertex((double)(-var10), (double)var12, (double)var10); - var23.addVertex((double)(-var10), (double)var12, (double)(-var10)); - var23.addVertex((double)var10, (double)var12, (double)(-var10)); - var23.addVertex((double)var10, (double)var11, (double)(-var10)); - var23.addVertex((double)(-var10), (double)var11, (double)(-var10)); - var23.addVertex((double)var10, (double)var12, (double)(-var10)); - var23.addVertex((double)var10, (double)var12, (double)var10); - var23.addVertex((double)var10, (double)var11, (double)var10); - var23.addVertex((double)var10, (double)var11, (double)(-var10)); - var23.addVertex((double)(-var10), (double)var11, (double)(-var10)); - var23.addVertex((double)(-var10), (double)var11, (double)var10); - var23.addVertex((double)(-var10), (double)var12, (double)var10); - var23.addVertex((double)(-var10), (double)var12, (double)(-var10)); - var23.addVertex((double)(-var10), (double)var12, (double)(-var10)); - var23.addVertex((double)(-var10), (double)var12, (double)var10); - var23.addVertex((double)var10, (double)var12, (double)var10); - var23.addVertex((double)var10, (double)var12, (double)(-var10)); - var23.draw(); - } - - if (world.provider.isSkyColored()) - { - GL11.glColor3f(var3 * 0.2F + 0.04F, var4 * 0.2F + 0.04F, var5 * 0.6F + 0.1F); - } - else - { - GL11.glColor3f(var3, var4, var5); - } - - GL11.glPushMatrix(); - GL11.glTranslatef(0.0F, -((float)(var25 - 16.0D)), 0.0F); - GL11.glCallList(this.glSkyList2); - GL11.glPopMatrix(); - GL11.glEnable(GL11.GL_TEXTURE_2D); - GL11.glDepthMask(true); +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.renderer.FogRenderer; +import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.client.renderer.LevelRenderer; +import net.minecraft.client.renderer.ShaderInstance; +import net.minecraft.util.RandomSource; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import org.joml.Matrix4f; + +@OnlyIn(Dist.CLIENT) +public class TFSkyRenderer { + + private static VertexBuffer starBuffer; + + public TFSkyRenderer() { + this.createStars(); } - - private float getRealCelestialAngle(World world, float partialTicks) { - int var4 = (int)(world.getWorldTime() % 24000L); - float var5 = ((float)var4 + partialTicks) / 24000.0F - 0.25F; - - if (var5 < 0.0F) - { - ++var5; - } - if (var5 > 1.0F) - { - --var5; - } - float var6 = var5; - var5 = 1.0F - (float)((Math.cos((double)var5 * Math.PI) + 1.0D) / 2.0D); - var5 = var6 + (var5 - var6) / 3.0F; - return var5; + // [VanillaCopy] LevelRenderer.renderSky's overworld branch, without sun/moon/sunrise/sunset, using our own stars at full brightness, and lowering void horizon threshold height from getHorizonHeight (63) to 0 + public static boolean renderSky(ClientLevel level, float partialTicks, PoseStack stack, Camera camera, Matrix4f projectionMatrix, Runnable setupFog) { + LevelRenderer levelRenderer = Minecraft.getInstance().levelRenderer; + + setupFog.run(); + Vec3 vec3 = level.getSkyColor(camera.getPosition(), partialTicks); + float f = (float) vec3.x(); + float f1 = (float) vec3.y(); + float f2 = (float) vec3.z(); + FogRenderer.levelFogColor(); + //BufferBuilder bufferbuilder = Tesselator.getInstance().getBuilder(); TF - Unused + RenderSystem.depthMask(false); + RenderSystem.setShaderColor(f, f1, f2, 1.0F); + ShaderInstance shaderinstance = RenderSystem.getShader(); + levelRenderer.skyBuffer.bind(); + levelRenderer.skyBuffer.drawWithShader(stack.last().pose(), projectionMatrix, shaderinstance); + VertexBuffer.unbind(); + RenderSystem.enableBlend(); + /* TF - snip out sunrise/sunset since that doesn't happen here + * float[] afloat = level.effects().getSunriseColor(level.getTimeOfDay(partialTicks), partialTicks); + * if (afloat != null) ... + */ + + RenderSystem.blendFuncSeparate(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE, GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ZERO); + stack.pushPose(); + float f11 = 1.0F - level.getRainLevel(partialTicks); + RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, f11); + stack.mulPose(Axis.YP.rotationDegrees(-90.0F)); + stack.mulPose(Axis.XP.rotationDegrees(level.getTimeOfDay(partialTicks) * 360.0F)); + /* TF - snip out sun/moon + * Matrix4f matrix4f1 = stack.last().pose(); + * float f12 = 30.0F; + * ... + * BufferUploader.drawWithShader(bufferbuilder.end()); + */ + float f10 = 1.0F; // TF - stars are always bright + + //if (f10 > 0.0F) { Always true + RenderSystem.setShaderColor(f10, f10, f10, f10); + RenderSystem.setShaderColor(f10, f10, f10, f10); + FogRenderer.setupNoFog(); + starBuffer.bind(); + starBuffer.drawWithShader(stack.last().pose(), projectionMatrix, GameRenderer.getPositionShader()); + VertexBuffer.unbind(); + setupFog.run(); + //} + + RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); + RenderSystem.disableBlend(); + RenderSystem.defaultBlendFunc(); + stack.popPose(); + RenderSystem.setShaderColor(0.0F, 0.0F, 0.0F, 1.0F); + double d0 = camera.getEntity().getEyePosition(partialTicks).y(); // - level.getLevelData().getHorizonHeight(level); // TF: Lower Void Horizon Y-Threshold from 63 to 0 + if (d0 < 0.0D) { + stack.pushPose(); + stack.translate(0.0F, 12.0F, 0.0F); + levelRenderer.darkBuffer.bind(); + levelRenderer.darkBuffer.drawWithShader(stack.last().pose(), projectionMatrix, shaderinstance); + VertexBuffer.unbind(); + stack.popPose(); + } + + RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); + RenderSystem.depthMask(true); + return true; } - /** - * Maybe in the future we can get the return of sky color by biome? - * @return - */ - private Vec3 getTwilightSkyColor(World world) { - return Vec3.createVectorHelper(32 / 256.0, 34 / 256.0, 74 / 256.0); -// return Vec3.createVectorHelper(43 / 256.0, 46 / 256.0, 99 / 256.0); - } - - - private void renderStars() - { - Random var1 = new Random(10842L); - Tessellator var2 = Tessellator.instance; - var2.startDrawingQuads(); - - for (int var3 = 0; var3 < 3000; ++var3) - { - double var4 = (double)(var1.nextFloat() * 2.0F - 1.0F); - double var6 = (double)(var1.nextFloat() * 2.0F - 1.0F); - double var8 = (double)(var1.nextFloat() * 2.0F - 1.0F); - double size = (double)(0.10F + var1.nextFloat() * 0.25F); - double var12 = var4 * var4 + var6 * var6 + var8 * var8; - - if (var12 < 1.0D && var12 > 0.01D) - { - var12 = 1.0D / Math.sqrt(var12); - var4 *= var12; - var6 *= var12; - var8 *= var12; - double var14 = var4 * 100.0D; - double var16 = var6 * 100.0D; - double var18 = var8 * 100.0D; - double var20 = Math.atan2(var4, var8); - double var22 = Math.sin(var20); - double var24 = Math.cos(var20); - double var26 = Math.atan2(Math.sqrt(var4 * var4 + var8 * var8), var6); - double var28 = Math.sin(var26); - double var30 = Math.cos(var26); - double var32 = var1.nextDouble() * Math.PI * 2.0D; - double var34 = Math.sin(var32); - double var36 = Math.cos(var32); - - for (int var38 = 0; var38 < 4; ++var38) - { - double var39 = 0.0D; - double var41 = (double)((var38 & 2) - 1) * size; - double var43 = (double)((var38 + 1 & 2) - 1) * size; - double var47 = var41 * var36 - var43 * var34; - double var49 = var43 * var36 + var41 * var34; - double var53 = var47 * var28 + var39 * var30; - double var55 = var39 * var28 - var47 * var30; - double var57 = var55 * var22 - var49 * var24; - double var61 = var49 * var22 + var55 * var24; - var2.addVertex(var14 + var57, var16 + var53, var18 + var61); - } - } - } - - var2.draw(); - } + // [VanillaCopy] LevelRenderer.createStars + private void createStars() { + Tesselator tesselator = Tesselator.getInstance(); + BufferBuilder bufferbuilder = tesselator.getBuilder(); + RenderSystem.setShader(GameRenderer::getPositionShader); + if (starBuffer != null) { + starBuffer.close(); + } + + starBuffer = new VertexBuffer(); + BufferBuilder.RenderedBuffer renderedBuffer = this.drawStars(bufferbuilder); + starBuffer.bind(); + starBuffer.upload(renderedBuffer); + VertexBuffer.unbind(); + } + // [VanillaCopy] of LevelRenderer.drawStars but with double the number of them + private BufferBuilder.RenderedBuffer drawStars(BufferBuilder bufferBuilder) { + RandomSource random = RandomSource.create(10842L); + bufferBuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION); + + // TF - 1500 -> 3000 + for (int i = 0; i < 3000; ++i) { + double d0 = random.nextFloat() * 2.0F - 1.0F; + double d1 = random.nextFloat() * 2.0F - 1.0F; + double d2 = random.nextFloat() * 2.0F - 1.0F; + double d3 = 0.15F + random.nextFloat() * 0.1F; + double d4 = d0 * d0 + d1 * d1 + d2 * d2; + if (d4 < 1.0D && d4 > 0.01D) { + d4 = 1.0D / Math.sqrt(d4); + d0 *= d4; + d1 *= d4; + d2 *= d4; + double d5 = d0 * 100.0D; + double d6 = d1 * 100.0D; + double d7 = d2 * 100.0D; + double d8 = Math.atan2(d0, d2); + double d9 = Math.sin(d8); + double d10 = Math.cos(d8); + double d11 = Math.atan2(Math.sqrt(d0 * d0 + d2 * d2), d1); + double d12 = Math.sin(d11); + double d13 = Math.cos(d11); + double d14 = random.nextDouble() * Math.PI * 2.0D; + double d15 = Math.sin(d14); + double d16 = Math.cos(d14); + + for (int j = 0; j < 4; ++j) { + double d18 = ((j & 2) - 1) * d3; + double d19 = ((j + 1 & 2) - 1) * d3; + double d21 = d18 * d16 - d19 * d15; + double d22 = d19 * d16 + d18 * d15; + double d23 = d21 * d12 + 0.0D * d13; + double d24 = 0.0D * d12 - d21 * d13; + double d25 = d24 * d9 - d22 * d10; + double d26 = d22 * d9 + d24 * d10; + bufferBuilder.vertex(d5 + d25, d6 + d23, d7 + d26).endVertex(); + } + } + } + + return bufferBuilder.end(); + } } diff --git a/src/main/java/twilightforest/client/renderer/TFWeatherRenderer.java b/src/main/java/twilightforest/client/renderer/TFWeatherRenderer.java index d9793dc304..c6fcfd42b8 100644 --- a/src/main/java/twilightforest/client/renderer/TFWeatherRenderer.java +++ b/src/main/java/twilightforest/client/renderer/TFWeatherRenderer.java @@ -1,706 +1,603 @@ package twilightforest.client.renderer; -import java.util.Random; - +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.BufferBuilder; +import com.mojang.blaze3d.vertex.DefaultVertexFormat; +import com.mojang.blaze3d.vertex.Tesselator; +import com.mojang.blaze3d.vertex.VertexFormat; +import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; -import net.minecraft.client.multiplayer.WorldClient; -import net.minecraft.client.renderer.OpenGlHelper; -import net.minecraft.client.renderer.Tessellator; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.util.MathHelper; -import net.minecraft.util.ResourceLocation; -import net.minecraft.world.World; -import net.minecraft.world.biome.BiomeGenBase; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import net.minecraftforge.client.IRenderHandler; - -import org.lwjgl.opengl.GL11; - +import net.minecraft.client.ParticleStatus; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.client.renderer.LevelRenderer; +import net.minecraft.client.renderer.LightTexture; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.particles.ParticleOptions; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.tags.FluidTags; +import net.minecraft.util.Mth; +import net.minecraft.util.RandomSource; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.CampfireBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.Heightmap; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.phys.shapes.VoxelShape; +import org.jetbrains.annotations.Nullable; import twilightforest.TwilightForestMod; -import twilightforest.biomes.TFBiomeBase; -import twilightforest.biomes.TFBiomeDarkForest; -import twilightforest.biomes.TFBiomeFireSwamp; -import twilightforest.biomes.TFBiomeGlacier; -import twilightforest.biomes.TFBiomeHighlands; -import twilightforest.biomes.TFBiomeFinalPlateau; -import twilightforest.biomes.TFBiomeSnow; -import twilightforest.biomes.TFBiomeSwamp; -import twilightforest.biomes.TFBiomeThornlands; +import twilightforest.init.TFBiomes; +import twilightforest.util.LandmarkUtil; +import twilightforest.world.registration.TFGenerationSettings; + +import java.util.Random; /** * Copypasta of EntityRenderer.renderRainSnow() hacked to include progression environmental effects */ -public class TFWeatherRenderer extends IRenderHandler { - - private static final ResourceLocation locationRainPng = new ResourceLocation("textures/environment/rain.png"); - private static final ResourceLocation locationSnowPng = new ResourceLocation("textures/environment/snow.png"); - private static final ResourceLocation locationBlizzardPng = new ResourceLocation(TwilightForestMod.ENVRIO_DIR + "blizzard.png"); - private static final ResourceLocation locationMosquitoPng = new ResourceLocation(TwilightForestMod.ENVRIO_DIR + "mosquitoes.png"); - private static final ResourceLocation locationAshesPng = new ResourceLocation(TwilightForestMod.ENVRIO_DIR + "ashes.png"); - private static final ResourceLocation locationDarkstreamPng = new ResourceLocation(TwilightForestMod.ENVRIO_DIR + "darkstream.png"); - private static final ResourceLocation locationBigrainPng = new ResourceLocation(TwilightForestMod.ENVRIO_DIR + "bigrain.png"); - private static final ResourceLocation locationSparklesPng = new ResourceLocation(TwilightForestMod.ENVRIO_DIR + "sparkles.png"); - - /** Rain X coords */ - float[] rainXCoords; - /** Rain Y coords */ - float[] rainYCoords; - private int rendererUpdateCount; - private Random random; - - - private StructureBoundingBox protectedBox; - - - public TFWeatherRenderer() { - this.random = new Random(); - } +public class TFWeatherRenderer { + private static final ResourceLocation RAIN_TEXTURES = new ResourceLocation("textures/environment/rain.png"); + private static final ResourceLocation SNOW_TEXTURES = new ResourceLocation("textures/environment/snow.png"); + private static final ResourceLocation SPARKLES_TEXTURE = TwilightForestMod.getEnvTexture("sparkles.png"); - @Override - public void render(float partialTicks, WorldClient world, Minecraft mc) { - - ++this.rendererUpdateCount; - - // do normal weather rendering - renderNormalWeather(partialTicks, mc); - - if (world.getGameRules().getGameRuleBooleanValue(TwilightForestMod.ENFORCED_PROGRESSION_RULE) && !mc.thePlayer.capabilities.isCreativeMode) { - // locked biome weather effects - renderLockedBiome(partialTicks, world, mc); + private static final float[] rainxs = new float[1024]; + private static final float[] rainzs = new float[1024]; - // locked structures - renderLockedStructure(partialTicks, world, mc); - } - } + private static int rendererUpdateCount; + private static BoundingBox protectedBox; + private static final Random random = new Random(); + private static float urGhastRain = 0.0F; + public static boolean urGhastAlive = false; - private void renderNormalWeather(float partialTicks, Minecraft mc) { - float rainStrength = mc.theWorld.getRainStrength(partialTicks); - - if (rainStrength > 0.0F) - { - mc.entityRenderer.enableLightmap((double)partialTicks); - - this.initializeRainCoords(); - - EntityLivingBase entitylivingbase = mc.renderViewEntity; - WorldClient worldclient = mc.theWorld; - int k2 = MathHelper.floor_double(entitylivingbase.posX); - int l2 = MathHelper.floor_double(entitylivingbase.posY); - int i3 = MathHelper.floor_double(entitylivingbase.posZ); - Tessellator tessellator = Tessellator.instance; - GL11.glDisable(GL11.GL_CULL_FACE); - GL11.glNormal3f(0.0F, 1.0F, 0.0F); - GL11.glEnable(GL11.GL_BLEND); - OpenGlHelper.glBlendFunc(770, 771, 1, 0); - GL11.glAlphaFunc(GL11.GL_GREATER, 0.1F); - double d0 = entitylivingbase.lastTickPosX + (entitylivingbase.posX - entitylivingbase.lastTickPosX) * (double)partialTicks; - double d1 = entitylivingbase.lastTickPosY + (entitylivingbase.posY - entitylivingbase.lastTickPosY) * (double)partialTicks; - double d2 = entitylivingbase.lastTickPosZ + (entitylivingbase.posZ - entitylivingbase.lastTickPosZ) * (double)partialTicks; - int k = MathHelper.floor_double(d1); - byte range = 5; - - if (mc.gameSettings.fancyGraphics) - { - range = 10; - } - - byte b1 = -1; - float f5 = (float)this.rendererUpdateCount + partialTicks; - - if (mc.gameSettings.fancyGraphics) - { - range = 10; - } - - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - for (int l = i3 - range; l <= i3 + range; ++l) - { - for (int i1 = k2 - range; i1 <= k2 + range; ++i1) - { - int j1 = (l - i3 + 16) * 32 + i1 - k2 + 16; - float f6 = this.rainXCoords[j1] * 0.5F; - float f7 = this.rainYCoords[j1] * 0.5F; - BiomeGenBase biomegenbase = worldclient.getBiomeGenForCoords(i1, l); - - if (biomegenbase.canSpawnLightningBolt() || biomegenbase.getEnableSnow()) - { - int k1 = worldclient.getPrecipitationHeight(i1, l); - int l1 = l2 - range; - int i2 = l2 + range; - - if (l1 < k1) - { - l1 = k1; - } - - if (i2 < k1) - { - i2 = k1; - } - - float f8 = 1.0F; - int j2 = k1; - - if (k1 < k) - { - j2 = k; - } - - if (l1 != i2) - { - this.random.setSeed((long)(i1 * i1 * 3121 + i1 * 45238971 ^ l * l * 418711 + l * 13761)); - float f9 = biomegenbase.getFloatTemperature(i1, l1, l); - float downwardsMotion; - double xDist; - - if (worldclient.getWorldChunkManager().getTemperatureAtHeight(f9, k1) >= 0.15F) - { - if (b1 != 0) - { - if (b1 >= 0) - { - tessellator.draw(); - } - - b1 = 0; - mc.getTextureManager().bindTexture(locationRainPng); - tessellator.startDrawingQuads(); - } - - downwardsMotion = ((float)(this.rendererUpdateCount + i1 * i1 * 3121 + i1 * 45238971 + l * l * 418711 + l * 13761 & 31) + partialTicks) / 32.0F * (3.0F + this.random.nextFloat()); - double d3 = (double)((float)i1 + 0.5F) - entitylivingbase.posX; - xDist = (double)((float)l + 0.5F) - entitylivingbase.posZ; - float f12 = MathHelper.sqrt_double(d3 * d3 + xDist * xDist) / (float)range; - float f13 = 1.0F; - tessellator.setBrightness(worldclient.getLightBrightnessForSkyBlocks(i1, j2, l, 0)); - tessellator.setColorRGBA_F(f13, f13, f13, ((1.0F - f12 * f12) * 0.5F + 0.5F) * rainStrength); - tessellator.setTranslation(-d0 * 1.0D, -d1 * 1.0D, -d2 * 1.0D); - tessellator.addVertexWithUV((double)((float)i1 - f6) + 0.5D, (double)l1, (double)((float)l - f7) + 0.5D, (double)(0.0F * f8), (double)((float)l1 * f8 / 4.0F + downwardsMotion * f8)); - tessellator.addVertexWithUV((double)((float)i1 + f6) + 0.5D, (double)l1, (double)((float)l + f7) + 0.5D, (double)(1.0F * f8), (double)((float)l1 * f8 / 4.0F + downwardsMotion * f8)); - tessellator.addVertexWithUV((double)((float)i1 + f6) + 0.5D, (double)i2, (double)((float)l + f7) + 0.5D, (double)(1.0F * f8), (double)((float)i2 * f8 / 4.0F + downwardsMotion * f8)); - tessellator.addVertexWithUV((double)((float)i1 - f6) + 0.5D, (double)i2, (double)((float)l - f7) + 0.5D, (double)(0.0F * f8), (double)((float)i2 * f8 / 4.0F + downwardsMotion * f8)); - tessellator.setTranslation(0.0D, 0.0D, 0.0D); - } - else - { - if (b1 != 1) - { - if (b1 >= 0) - { - tessellator.draw(); - } - - b1 = 1; - mc.getTextureManager().bindTexture(locationSnowPng); - tessellator.startDrawingQuads(); - } - - downwardsMotion = ((float)(this.rendererUpdateCount & 511) + partialTicks) / 512.0F; - float f16 = this.random.nextFloat() + f5 * 0.01F * (float)this.random.nextGaussian(); - float f11 = this.random.nextFloat() + f5 * (float)this.random.nextGaussian() * 0.001F; - xDist = (double)((float)i1 + 0.5F) - entitylivingbase.posX; - double zDist = (double)((float)l + 0.5F) - entitylivingbase.posZ; - float f14 = MathHelper.sqrt_double(xDist * xDist + zDist * zDist) / (float)range; - float f15 = 1.0F; - tessellator.setBrightness((worldclient.getLightBrightnessForSkyBlocks(i1, j2, l, 0) * 3 + 15728880) / 4); - tessellator.setColorRGBA_F(f15, f15, f15, ((1.0F - f14 * f14) * 0.3F + 0.5F) * rainStrength); - tessellator.setTranslation(-d0 * 1.0D, -d1 * 1.0D, -d2 * 1.0D); - tessellator.addVertexWithUV((double)((float)i1 - f6) + 0.5D, (double)l1, (double)((float)l - f7) + 0.5D, (double)(0.0F * f8 + f16), (double)((float)l1 * f8 / 4.0F + downwardsMotion * f8 + f11)); - tessellator.addVertexWithUV((double)((float)i1 + f6) + 0.5D, (double)l1, (double)((float)l + f7) + 0.5D, (double)(1.0F * f8 + f16), (double)((float)l1 * f8 / 4.0F + downwardsMotion * f8 + f11)); - tessellator.addVertexWithUV((double)((float)i1 + f6) + 0.5D, (double)i2, (double)((float)l + f7) + 0.5D, (double)(1.0F * f8 + f16), (double)((float)i2 * f8 / 4.0F + downwardsMotion * f8 + f11)); - tessellator.addVertexWithUV((double)((float)i1 - f6) + 0.5D, (double)i2, (double)((float)l - f7) + 0.5D, (double)(0.0F * f8 + f16), (double)((float)i2 * f8 / 4.0F + downwardsMotion * f8 + f11)); - tessellator.setTranslation(0.0D, 0.0D, 0.0D); - } - } - } - } - } - - if (b1 >= 0) - { - tessellator.draw(); - } - - GL11.glEnable(GL11.GL_CULL_FACE); - GL11.glDisable(GL11.GL_BLEND); - GL11.glAlphaFunc(GL11.GL_GREATER, 0.1F); - mc.entityRenderer.disableLightmap((double)partialTicks); - } + public TFWeatherRenderer() { + for (int i = 0; i < 32; ++i) { + for (int j = 0; j < 32; ++j) { + float f = j - 16; + float f1 = i - 16; + float f2 = Mth.sqrt(f * f + f1 * f1); + rainxs[i << 5 | j] = -f1 / f2; + rainzs[i << 5 | j] = f / f2; + } + } } - - - private void renderLockedBiome(float partialTicks, WorldClient world, Minecraft mc) { - // check nearby for locked biome - if (isNearLockedBiome(world, mc.renderViewEntity)) { - this.initializeRainCoords(); - - EntityLivingBase entitylivingbase = mc.renderViewEntity; - WorldClient worldclient = mc.theWorld; - int px = MathHelper.floor_double(entitylivingbase.posX); - int py = MathHelper.floor_double(entitylivingbase.posY); - int pz = MathHelper.floor_double(entitylivingbase.posZ); - Tessellator tessellator = Tessellator.instance; - GL11.glDisable(GL11.GL_CULL_FACE); - GL11.glNormal3f(0.0F, 1.0F, 0.0F); - GL11.glEnable(GL11.GL_BLEND); - OpenGlHelper.glBlendFunc(770, 771, 1, 0); - GL11.glAlphaFunc(GL11.GL_GREATER, 0.1F); - double offX = entitylivingbase.lastTickPosX + (entitylivingbase.posX - entitylivingbase.lastTickPosX) * (double)partialTicks; - double offY = entitylivingbase.lastTickPosY + (entitylivingbase.posY - entitylivingbase.lastTickPosY) * (double)partialTicks; - double offZ = entitylivingbase.lastTickPosZ + (entitylivingbase.posZ - entitylivingbase.lastTickPosZ) * (double)partialTicks; - int floorY = MathHelper.floor_double(offY); - byte range = 5; - - if (mc.gameSettings.fancyGraphics) - { - range = 10; - } - - byte drawFlag = -1; - float preciseCount = (float)this.rendererUpdateCount + partialTicks; - - if (mc.gameSettings.fancyGraphics) - { - range = 15; - } - - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - for (int dz = pz - range; dz <= pz + range; ++dz) - { - for (int dx = px - range; dx <= px + range; ++dx) - { - int rainIndex = (dz - pz + 16) * 32 + dx - px + 16; - float rainX = this.rainXCoords[rainIndex] * 0.5F; - float rainZ = this.rainYCoords[rainIndex] * 0.5F; - BiomeGenBase biomegenbase = worldclient.getBiomeGenForCoords(dx, dz); - - - if (biomegenbase instanceof TFBiomeBase && entitylivingbase instanceof EntityPlayer && !((TFBiomeBase)biomegenbase).doesPlayerHaveRequiredAchievement((EntityPlayer)entitylivingbase)) { - - int rainHeight = 0;//worldclient.getPrecipitationHeight(dx, dz); - int rainMin = py - range; - int rainMax = py + range * 2; - - if (rainMin < rainHeight) - { - rainMin = rainHeight; - } - - if (rainMax < rainHeight) - { - rainMax = rainHeight; - } - - float one = 1.0F; - int rainFloor = rainHeight; - - if (rainHeight < floorY) - { - rainFloor = floorY; - } - - if (rainMin != rainMax) - { - this.random.setSeed((long)(dx * dx * 3121 + dx * 45238971 ^ dz * dz * 418711 + dz * 13761)); - - if (biomegenbase instanceof TFBiomeSnow || biomegenbase instanceof TFBiomeGlacier) { - // SNOW - - if (drawFlag != 0) - { - if (drawFlag >= 0) - { - tessellator.draw(); - } - - drawFlag = 0; - mc.getTextureManager().bindTexture(locationBlizzardPng); - tessellator.startDrawingQuads(); - } - - float countFactor = ((float)(this.rendererUpdateCount & 511) + partialTicks) / 512.0F; - float uFactor = this.random.nextFloat() + preciseCount * 0.03F * (float)this.random.nextGaussian(); - float vFactor = this.random.nextFloat() + preciseCount * 0.001F * (float)this.random.nextGaussian(); - double xRange = (double)((float)dx + 0.5F) - entitylivingbase.posX; - double zRange = (double)((float)dz + 0.5F) - entitylivingbase.posZ; - float f14 = MathHelper.sqrt_double(xRange * xRange + zRange * zRange) / (float)range; - float onee = 1.0F; - tessellator.setBrightness((worldclient.getLightBrightnessForSkyBlocks(dx, rainFloor, dz, 0) * 3 + 15728880) / 4); - tessellator.setColorRGBA_F(onee, onee, onee, ((1.0F - f14 * f14) * 0.3F + 0.5F) * 1.0F); - tessellator.setTranslation(-offX * 1.0D, -offY * 1.0D, -offZ * 1.0D); - tessellator.addVertexWithUV((double)((float)dx - rainX) + 0.5D, (double)rainMin, (double)((float)dz - rainZ) + 0.5D, (double)(0.0F * one + uFactor), (double)((float)rainMin * one / 4.0F + countFactor * one + vFactor)); - tessellator.addVertexWithUV((double)((float)dx + rainX) + 0.5D, (double)rainMin, (double)((float)dz + rainZ) + 0.5D, (double)(1.0F * one + uFactor), (double)((float)rainMin * one / 4.0F + countFactor * one + vFactor)); - tessellator.addVertexWithUV((double)((float)dx + rainX) + 0.5D, (double)rainMax, (double)((float)dz + rainZ) + 0.5D, (double)(1.0F * one + uFactor), (double)((float)rainMax * one / 4.0F + countFactor * one + vFactor)); - tessellator.addVertexWithUV((double)((float)dx - rainX) + 0.5D, (double)rainMax, (double)((float)dz - rainZ) + 0.5D, (double)(0.0F * one + uFactor), (double)((float)rainMax * one / 4.0F + countFactor * one + vFactor)); - tessellator.setTranslation(0.0D, 0.0D, 0.0D); - - } else if (biomegenbase instanceof TFBiomeSwamp) { - // MOSQUITOES - - if (drawFlag != 1) - { - if (drawFlag >= 0) - { - tessellator.draw(); - } - - drawFlag = 1; - mc.getTextureManager().bindTexture(locationMosquitoPng); - tessellator.startDrawingQuads(); - } - - float countFactor = 0;//((float)(this.rendererUpdateCount & 511) + partialTicks) / 512.0F; - float uFactor = this.random.nextFloat() + preciseCount * 0.03F * (float)this.random.nextGaussian(); - float vFactor = this.random.nextFloat() + preciseCount * 0.003F * (float)this.random.nextGaussian(); - //double xRange = (double)((float)dx + 0.5F) - entitylivingbase.posX; - //double zRange = (double)((float)dz + 0.5F) - entitylivingbase.posZ; - //float distanceFromPlayer = MathHelper.sqrt_double(xRange * xRange + zRange * zRange) / (float)range; - tessellator.setBrightness(983055); - float r = random.nextFloat() * 0.3F; - float g = random.nextFloat() * 0.3F; - float b = random.nextFloat() * 0.3F; - tessellator.setColorRGBA_F(r, g, b, 1.0F);//((1.0F - distanceFromPlayer * distanceFromPlayer) * 0.3F + 0.5F) * 1.0F); - tessellator.setTranslation(-offX * 1.0D, -offY * 1.0D, -offZ * 1.0D); - tessellator.addVertexWithUV((double)((float)dx - rainX) + 0.5D, (double)rainMin, (double)((float)dz - rainZ) + 0.5D, (double)(0.0F * one + uFactor), (double)((float)rainMin * one / 4.0F + countFactor * one + vFactor)); - tessellator.addVertexWithUV((double)((float)dx + rainX) + 0.5D, (double)rainMin, (double)((float)dz + rainZ) + 0.5D, (double)(1.0F * one + uFactor), (double)((float)rainMin * one / 4.0F + countFactor * one + vFactor)); - tessellator.addVertexWithUV((double)((float)dx + rainX) + 0.5D, (double)rainMax, (double)((float)dz + rainZ) + 0.5D, (double)(1.0F * one + uFactor), (double)((float)rainMax * one / 4.0F + countFactor * one + vFactor)); - tessellator.addVertexWithUV((double)((float)dx - rainX) + 0.5D, (double)rainMax, (double)((float)dz - rainZ) + 0.5D, (double)(0.0F * one + uFactor), (double)((float)rainMax * one / 4.0F + countFactor * one + vFactor)); - tessellator.setTranslation(0.0D, 0.0D, 0.0D); - } else if (biomegenbase instanceof TFBiomeFireSwamp) { - // ASHES - - if (drawFlag != 2) - { - if (drawFlag >= 0) - { - tessellator.draw(); - } - - drawFlag = 2; - mc.getTextureManager().bindTexture(locationAshesPng); - tessellator.startDrawingQuads(); - } - - float countFactor = -((float)(this.rendererUpdateCount & 1023) + partialTicks) / 1024.0F; - float uFactor = this.random.nextFloat() + preciseCount * 0.001F * (float)this.random.nextGaussian(); - float vFactor = this.random.nextFloat() + preciseCount * 0.001F * (float)this.random.nextGaussian(); - double xRange = (double)((float)dx + 0.5F) - entitylivingbase.posX; - double zRange = (double)((float)dz + 0.5F) - entitylivingbase.posZ; - float distanceFromPlayer = MathHelper.sqrt_double(xRange * xRange + zRange * zRange) / (float)range; - tessellator.setBrightness(983055); - float bright = random.nextFloat() * 0.2F + 0.8F; - tessellator.setColorRGBA_F(bright, bright, bright, ((1.0F - distanceFromPlayer * distanceFromPlayer) * 0.3F + 0.5F) * 1.0F); - tessellator.setTranslation(-offX * 1.0D, -offY * 1.0D, -offZ * 1.0D); - tessellator.addVertexWithUV((double)((float)dx - rainX) + 0.5D, (double)rainMin, (double)((float)dz - rainZ) + 0.5D, (double)(0.0F * one + uFactor), (double)((float)rainMin * one / 4.0F + countFactor * one + vFactor)); - tessellator.addVertexWithUV((double)((float)dx + rainX) + 0.5D, (double)rainMin, (double)((float)dz + rainZ) + 0.5D, (double)(1.0F * one + uFactor), (double)((float)rainMin * one / 4.0F + countFactor * one + vFactor)); - tessellator.addVertexWithUV((double)((float)dx + rainX) + 0.5D, (double)rainMax, (double)((float)dz + rainZ) + 0.5D, (double)(1.0F * one + uFactor), (double)((float)rainMax * one / 4.0F + countFactor * one + vFactor)); - tessellator.addVertexWithUV((double)((float)dx - rainX) + 0.5D, (double)rainMax, (double)((float)dz - rainZ) + 0.5D, (double)(0.0F * one + uFactor), (double)((float)rainMax * one / 4.0F + countFactor * one + vFactor)); - tessellator.setTranslation(0.0D, 0.0D, 0.0D); - } else if (biomegenbase instanceof TFBiomeDarkForest && random.nextInt(2) == 0) { - // DARKTHINGS - - if (drawFlag != 3) - { - if (drawFlag >= 0) - { - tessellator.draw(); - } - - drawFlag = 3; - mc.getTextureManager().bindTexture(locationDarkstreamPng); - tessellator.startDrawingQuads(); - } - - int darkRainMax = Math.min(rainMax, worldclient.getPrecipitationHeight(dx, dz)); - int darkRainMin = Math.min(rainMin, darkRainMax); - - float countFactor = -((float)(this.rendererUpdateCount & 511) + partialTicks) / 512.0F; - float uFactor = 0;//this.random.nextFloat() + preciseCount * 0.001F * (float)this.random.nextGaussian(); - float vFactor = this.random.nextFloat() + preciseCount * 0.01F * (float)this.random.nextGaussian(); - double xRange = (double)((float)dx + 0.5F) - entitylivingbase.posX; - double zRange = (double)((float)dz + 0.5F) - entitylivingbase.posZ; - float distanceFromPlayer = MathHelper.sqrt_double(xRange * xRange + zRange * zRange) / (float)range; - tessellator.setBrightness(983055); - float bright = 1.0F; - float alpha = random.nextFloat(); - tessellator.setColorRGBA_F(bright, bright, bright, ((1.0F - distanceFromPlayer * distanceFromPlayer) * 0.3F + 0.5F) * alpha); - tessellator.setTranslation(-offX * 1.0D, -offY * 1.0D, -offZ * 1.0D); - tessellator.addVertexWithUV((double)((float)dx - rainX) + 0.5D, (double)darkRainMin, (double)((float)dz - rainZ) + 0.5D, (double)(0.0F * one + uFactor), (double)((float)darkRainMin * one / 4.0F + countFactor * one + vFactor)); - tessellator.addVertexWithUV((double)((float)dx + rainX) + 0.5D, (double)darkRainMin, (double)((float)dz + rainZ) + 0.5D, (double)(1.0F * one + uFactor), (double)((float)darkRainMin * one / 4.0F + countFactor * one + vFactor)); - tessellator.addVertexWithUV((double)((float)dx + rainX) + 0.5D, (double)darkRainMax, (double)((float)dz + rainZ) + 0.5D, (double)(1.0F * one + uFactor), (double)((float)darkRainMax * one / 4.0F + countFactor * one + vFactor)); - tessellator.addVertexWithUV((double)((float)dx - rainX) + 0.5D, (double)darkRainMax, (double)((float)dz - rainZ) + 0.5D, (double)(0.0F * one + uFactor), (double)((float)darkRainMax * one / 4.0F + countFactor * one + vFactor)); - tessellator.setTranslation(0.0D, 0.0D, 0.0D); - } else if (biomegenbase instanceof TFBiomeHighlands || biomegenbase instanceof TFBiomeThornlands || biomegenbase instanceof TFBiomeFinalPlateau) { - // GREENRAIN - - if (drawFlag != 4) - { - if (drawFlag >= 0) - { - tessellator.draw(); - } - - drawFlag = 4; - mc.getTextureManager().bindTexture(locationBigrainPng); - tessellator.startDrawingQuads(); - } - - float countFactor = ((float)(this.rendererUpdateCount + dx * dx * 3121 + dx * 45238971 + dz * dz * 418711 + dz * 13761 & 31) + partialTicks) / 32.0F * (3.0F + this.random.nextFloat()); - float uFactor = this.random.nextFloat(); - float vFactor = this.random.nextFloat(); - double xRange = (double)((float)dx + 0.5F) - entitylivingbase.posX; - double zRange = (double)((float)dz + 0.5F) - entitylivingbase.posZ; - float distanceFromPlayer = MathHelper.sqrt_double(xRange * xRange + zRange * zRange) / (float)range; - tessellator.setBrightness(worldclient.getLightBrightnessForSkyBlocks(dx, rainFloor, dz, 0)); - float bright = 1.0F; - float alpha = 1.0F;//random.nextFloat(); - tessellator.setColorRGBA_F(bright, bright, bright, ((1.0F - distanceFromPlayer * distanceFromPlayer) * 0.3F + 0.5F) * alpha); - tessellator.setTranslation(-offX * 1.0D, -offY * 1.0D, -offZ * 1.0D); - tessellator.addVertexWithUV((double)((float)dx - rainX) + 0.5D, (double)rainMin, (double)((float)dz - rainZ) + 0.5D, (double)(0.0F * one + uFactor), (double)((float)rainMin * one / 4.0F + countFactor * one + vFactor)); - tessellator.addVertexWithUV((double)((float)dx + rainX) + 0.5D, (double)rainMin, (double)((float)dz + rainZ) + 0.5D, (double)(1.0F * one + uFactor), (double)((float)rainMin * one / 4.0F + countFactor * one + vFactor)); - tessellator.addVertexWithUV((double)((float)dx + rainX) + 0.5D, (double)rainMax, (double)((float)dz + rainZ) + 0.5D, (double)(1.0F * one + uFactor), (double)((float)rainMax * one / 4.0F + countFactor * one + vFactor)); - tessellator.addVertexWithUV((double)((float)dx - rainX) + 0.5D, (double)rainMax, (double)((float)dz - rainZ) + 0.5D, (double)(0.0F * one + uFactor), (double)((float)rainMax * one / 4.0F + countFactor * one + vFactor)); - tessellator.setTranslation(0.0D, 0.0D, 0.0D); - } - - } - } - } - } - - if (drawFlag >= 0) - { - tessellator.draw(); - } - - GL11.glEnable(GL11.GL_CULL_FACE); - GL11.glDisable(GL11.GL_BLEND); - GL11.glAlphaFunc(GL11.GL_GREATER, 0.1F); - mc.entityRenderer.disableLightmap((double)partialTicks); - - } + public static void tick() { + ++rendererUpdateCount; } + //Helpful tip: x, y, and z relate to the looking entity's position. + public static boolean renderSnowAndRain(ClientLevel level, int ticks, float partialTicks, LightTexture lightmap, double camX, double camY, double camZ) { + Minecraft mc = Minecraft.getInstance(); + // do normal weather rendering + renderNormalWeather(lightmap, level, partialTicks, camX, camY, camZ, Math.max(urGhastRain, level.getRainLevel(partialTicks))); + if (LandmarkUtil.isProgressionEnforced(level) && mc.player != null && !mc.player.isCreative() && !mc.player.isSpectator()) { + // locked biome weather effects + renderLockedBiome(partialTicks, level, mc, lightmap, mc.player, camX, camY, camZ); - private void renderLockedStructure(float partialTicks, WorldClient world, Minecraft mc) { - // draw locked structure thing - if (isNearLockedStructure(world, mc.renderViewEntity)) { - this.initializeRainCoords(); - - EntityLivingBase entitylivingbase = mc.renderViewEntity; - int px = MathHelper.floor_double(entitylivingbase.posX); - int py = MathHelper.floor_double(entitylivingbase.posY); - int pz = MathHelper.floor_double(entitylivingbase.posZ); - Tessellator tessellator = Tessellator.instance; - GL11.glDisable(GL11.GL_CULL_FACE); - GL11.glNormal3f(0.0F, 1.0F, 0.0F); - GL11.glEnable(GL11.GL_BLEND); - OpenGlHelper.glBlendFunc(770, 771, 1, 0); - GL11.glAlphaFunc(GL11.GL_GREATER, 0.1F); - double offX = entitylivingbase.lastTickPosX + (entitylivingbase.posX - entitylivingbase.lastTickPosX) * (double)partialTicks; - double offY = entitylivingbase.lastTickPosY + (entitylivingbase.posY - entitylivingbase.lastTickPosY) * (double)partialTicks; - double offZ = entitylivingbase.lastTickPosZ + (entitylivingbase.posZ - entitylivingbase.lastTickPosZ) * (double)partialTicks; - byte range = 5; - - if (mc.gameSettings.fancyGraphics) - { - range = 10; - } - - byte drawFlag = -1; - float preciseCount = (float)this.rendererUpdateCount + partialTicks; - - if (mc.gameSettings.fancyGraphics) - { - range = 15; - } - - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - for (int dz = pz - range; dz <= pz + range; ++dz) - { - for (int dx = px - range; dx <= px + range; ++dx) - { - int rainIndex = (dz - pz + 16) * 32 + dx - px + 16; - float rainX = this.rainXCoords[rainIndex] * 0.5F; - float rainZ = this.rainYCoords[rainIndex] * 0.5F; - - if (this.protectedBox != null && this.protectedBox.intersectsWith(dx, dz, dx, dz)) { - - //System.out.println("Column in structure"); - - int structureMin = this.protectedBox.minY - 4; - int structureMax = this.protectedBox.maxY + 4; - int rainMin = py - range; - int rainMax = py + range * 2; - - if (rainMin < structureMin) - { - rainMin = structureMin; - } - - if (rainMax < structureMin) - { - rainMax = structureMin; - } - - if (rainMin > structureMax) - { - rainMin = structureMax; - } - - if (rainMax > structureMax) - { - rainMax = structureMax; - } - - float one = 1.0F; - if (rainMin != rainMax) - { - this.random.setSeed((long)(dx * dx * 3121 + dx * 45238971 ^ dz * dz * 418711 + dz * 13761)); - - if (true) { - - if (drawFlag != 0) - { - if (drawFlag >= 0) - { - tessellator.draw(); - } - - drawFlag = 0; - mc.getTextureManager().bindTexture(locationSparklesPng); - tessellator.startDrawingQuads(); - } - - float countFactor = ((float)(this.rendererUpdateCount & 511) + partialTicks) / 512.0F; - float uFactor = this.random.nextFloat() + preciseCount * 0.01F * (float)this.random.nextGaussian(); - float vFactor = this.random.nextFloat() + preciseCount * 0.01F * (float)this.random.nextGaussian(); - double xRange = (double)((float)dx + 0.5F) - entitylivingbase.posX; - double zRange = (double)((float)dz + 0.5F) - entitylivingbase.posZ; - float distanceFromPlayer = MathHelper.sqrt_double(xRange * xRange + zRange * zRange) / (float)range; - tessellator.setBrightness(983055); - float bright = 1.0F; - float alpha = random.nextFloat(); - tessellator.setColorRGBA_F(bright, bright, bright, ((1.0F - distanceFromPlayer * distanceFromPlayer) * 0.3F + 0.5F) * alpha); - tessellator.setTranslation(-offX * 1.0D, -offY * 1.0D, -offZ * 1.0D); - tessellator.addVertexWithUV((double)((float)dx - rainX) + 0.5D, (double)rainMin, (double)((float)dz - rainZ) + 0.5D, (double)(0.0F * one + uFactor), (double)((float)rainMin * one / 4.0F + countFactor * one + vFactor)); - tessellator.addVertexWithUV((double)((float)dx + rainX) + 0.5D, (double)rainMin, (double)((float)dz + rainZ) + 0.5D, (double)(1.0F * one + uFactor), (double)((float)rainMin * one / 4.0F + countFactor * one + vFactor)); - tessellator.addVertexWithUV((double)((float)dx + rainX) + 0.5D, (double)rainMax, (double)((float)dz + rainZ) + 0.5D, (double)(1.0F * one + uFactor), (double)((float)rainMax * one / 4.0F + countFactor * one + vFactor)); - tessellator.addVertexWithUV((double)((float)dx - rainX) + 0.5D, (double)rainMax, (double)((float)dz - rainZ) + 0.5D, (double)(0.0F * one + uFactor), (double)((float)rainMax * one / 4.0F + countFactor * one + vFactor)); - tessellator.setTranslation(0.0D, 0.0D, 0.0D); - - } - - } - } - } - } - - if (drawFlag >= 0) - { - tessellator.draw(); - } - - GL11.glEnable(GL11.GL_CULL_FACE); - GL11.glDisable(GL11.GL_BLEND); - GL11.glAlphaFunc(GL11.GL_GREATER, 0.1F); - mc.entityRenderer.disableLightmap((double)partialTicks); - - } + // locked structures + renderLockedStructure(partialTicks, mc, lightmap, camX, camY, camZ); + } + return true; } + public static void renderNormalWeather(LightTexture lightmap, ClientLevel level, float ticks, double x, double y, double z, float rainLevel) { + if (rainLevel > 0.0F) { + lightmap.turnOnLightLayer(); + int i = Mth.floor(x); + int j = Mth.floor(y); + int k = Mth.floor(z); + Tesselator tesselator = Tesselator.getInstance(); + BufferBuilder bufferbuilder = tesselator.getBuilder(); + RenderSystem.disableCull(); + RenderSystem.enableBlend(); + RenderSystem.defaultBlendFunc(); + RenderSystem.enableDepthTest(); + + int range = 5; + if (Minecraft.useFancyGraphics()) { + range = 10; + } + + RenderSystem.depthMask(Minecraft.useShaderTransparency()); + int i1 = -1; + float f1 = (float)rendererUpdateCount + ticks; + RenderSystem.setShader(GameRenderer::getParticleShader); + RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); + BlockPos.MutableBlockPos blockpos$mutableblockpos = new BlockPos.MutableBlockPos(); + + for(int j1 = k - range; j1 <= k + range; ++j1) { + for(int k1 = i - range; k1 <= i + range; ++k1) { + int l1 = (j1 - k + 16) * 32 + k1 - i + 16; + double d0 = (double)rainxs[l1] * 0.5D; + double d1 = (double)rainzs[l1] * 0.5D; + blockpos$mutableblockpos.set(k1, 0, j1); + Biome biome = level.getBiome(blockpos$mutableblockpos).value(); + if (biome.hasPrecipitation()) { + int i2 = level.getHeightmapPos(Heightmap.Types.MOTION_BLOCKING, blockpos$mutableblockpos).getY(); + int j2 = j - range; + int k2 = j + range; + if (j2 < i2) { + j2 = i2; + } + + if (k2 < i2) { + k2 = i2; + } + + int l2 = i2; + if (i2 < j) { + l2 = j; + } + + if (j2 != k2) { + Random random = new Random((long) k1 * k1 * 3121 + k1 * 45238971L ^ (long) j1 * j1 * 418711 + j1 * 13761L); + blockpos$mutableblockpos.set(k1, j2, j1); + if (biome.warmEnoughToRain(blockpos$mutableblockpos)) { + if (i1 != 0) { + if (i1 >= 0) { + tesselator.end(); + } + + i1 = 0; + RenderSystem.setShaderTexture(0, RAIN_TEXTURES); + bufferbuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.PARTICLE); + } + + int i3 = rendererUpdateCount + k1 * k1 * 3121 + k1 * 45238971 + j1 * j1 * 418711 + j1 * 13761 & 31; + float f3 = -((float)i3 + ticks) / 32.0F * (3.0F + random.nextFloat()); + double d2 = (double)k1 + 0.5D - x; + double d4 = (double)j1 + 0.5D - z; + float f4 = (float)Math.sqrt(d2 * d2 + d4 * d4) / (float)range; + float f5 = ((1.0F - f4 * f4) * 0.5F + 0.5F) * rainLevel; + blockpos$mutableblockpos.set(k1, l2, j1); + int j3 = LevelRenderer.getLightColor(level, blockpos$mutableblockpos); + bufferbuilder.vertex((double)k1 - x - d0 + 0.5D, (double)k2 - y, (double)j1 - z - d1 + 0.5D).uv(0.0F, (float)j2 * 0.25F + f3).color(1.0F, 1.0F, 1.0F, f5).uv2(j3).endVertex(); + bufferbuilder.vertex((double)k1 - x + d0 + 0.5D, (double)k2 - y, (double)j1 - z + d1 + 0.5D).uv(1.0F, (float)j2 * 0.25F + f3).color(1.0F, 1.0F, 1.0F, f5).uv2(j3).endVertex(); + bufferbuilder.vertex((double)k1 - x + d0 + 0.5D, (double)j2 - y, (double)j1 - z + d1 + 0.5D).uv(1.0F, (float)k2 * 0.25F + f3).color(1.0F, 1.0F, 1.0F, f5).uv2(j3).endVertex(); + bufferbuilder.vertex((double)k1 - x - d0 + 0.5D, (double)j2 - y, (double)j1 - z - d1 + 0.5D).uv(0.0F, (float)k2 * 0.25F + f3).color(1.0F, 1.0F, 1.0F, f5).uv2(j3).endVertex(); + } else { + if (i1 != 1) { + if (i1 >= 0) { + tesselator.end(); + } + + i1 = 1; + RenderSystem.setShaderTexture(0, SNOW_TEXTURES); + bufferbuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.PARTICLE); + } + + float f6 = -((float)(rendererUpdateCount & 511) + ticks) / 512.0F; + float f7 = (float)(random.nextDouble() + (double)f1 * 0.01D * (double)((float)random.nextGaussian())); + float f8 = (float)(random.nextDouble() + (double)(f1 * (float)random.nextGaussian()) * 0.001D); + double d3 = (double)k1 + 0.5D - x; + double d5 = (double)j1 + 0.5D - z; + float f9 = (float)Math.sqrt(d3 * d3 + d5 * d5) / (float)range; + float f10 = ((1.0F - f9 * f9) * 0.3F + 0.5F) * rainLevel; + blockpos$mutableblockpos.set(k1, l2, j1); + int k3 = LevelRenderer.getLightColor(level, blockpos$mutableblockpos); + int l3 = k3 >> 16 & '\uffff'; + int i4 = k3 & '\uffff'; + int j4 = (l3 * 3 + 240) / 4; + int k4 = (i4 * 3 + 240) / 4; + bufferbuilder.vertex((double)k1 - x - d0 + 0.5D, (double)k2 - y, (double)j1 - z - d1 + 0.5D).uv(0.0F + f7, (float)j2 * 0.25F + f6 + f8).color(1.0F, 1.0F, 1.0F, f10).uv2(k4, j4).endVertex(); + bufferbuilder.vertex((double)k1 - x + d0 + 0.5D, (double)k2 - y, (double)j1 - z + d1 + 0.5D).uv(1.0F + f7, (float)j2 * 0.25F + f6 + f8).color(1.0F, 1.0F, 1.0F, f10).uv2(k4, j4).endVertex(); + bufferbuilder.vertex((double)k1 - x + d0 + 0.5D, (double)j2 - y, (double)j1 - z + d1 + 0.5D).uv(1.0F + f7, (float)k2 * 0.25F + f6 + f8).color(1.0F, 1.0F, 1.0F, f10).uv2(k4, j4).endVertex(); + bufferbuilder.vertex((double)k1 - x - d0 + 0.5D, (double)j2 - y, (double)j1 - z - d1 + 0.5D).uv(0.0F + f7, (float)k2 * 0.25F + f6 + f8).color(1.0F, 1.0F, 1.0F, f10).uv2(k4, j4).endVertex(); + } + } + } + } + } + + if (i1 >= 0) { + tesselator.end(); + } + + RenderSystem.enableCull(); + RenderSystem.disableBlend(); + lightmap.turnOffLightLayer(); + } + } - - private void initializeRainCoords() { - if (this.rainXCoords == null) - { - this.rainXCoords = new float[1024]; - this.rainYCoords = new float[1024]; - - for (int i = 0; i < 32; ++i) - { - for (int j = 0; j < 32; ++j) - { - float f2 = (float)(j - 16); - float f3 = (float)(i - 16); - float f4 = MathHelper.sqrt_float(f2 * f2 + f3 * f3); - this.rainXCoords[i << 5 | j] = -f3 / f4; - this.rainYCoords[i << 5 | j] = f2 / f4; - } - } + // [VanillaCopy] inside of EntityRenderer.renderRainSnow, edits noted + private static void renderLockedBiome(float partialTicks, ClientLevel level, Minecraft mc, LightTexture lightmap, LocalPlayer player, double xIn, double yIn, double zIn) { + // check nearby for locked biome + if (isNearLockedBiome(level, player)) { + + lightmap.turnOnLightLayer(); + + int x0 = Mth.floor(xIn); + int y0 = Mth.floor(yIn); + int z0 = Mth.floor(zIn); + + Tesselator tessellator = Tesselator.getInstance(); + BufferBuilder bufferBuilder = tessellator.getBuilder(); + + RenderSystem.disableCull(); + RenderSystem.enableBlend(); + RenderSystem.defaultBlendFunc(); + RenderSystem.enableDepthTest(); + + int range = 5; + if (Minecraft.useFancyGraphics()) { + range = 10; + } + + RenderSystem.depthMask(Minecraft.useShaderTransparency()); + + RenderType currentType = null; + float combinedTicks = rendererUpdateCount + partialTicks; + //bufferBuilder.setTranslation(-dx, -dy, -dz); + RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); + BlockPos.MutableBlockPos blockpos$mutableblockpos = new BlockPos.MutableBlockPos(); + + for (int z = z0 - range; z <= z0 + range; ++z) { + for (int x = x0 - range; x <= x0 + range; ++x) { + + int idx = (z - z0 + 16) * 32 + x - x0 + 16; + double rx = rainxs[idx] * 0.5D; + double ry = rainzs[idx] * 0.5D; + + blockpos$mutableblockpos.set(x, 0, z); + Biome biome = level.getBiome(blockpos$mutableblockpos).value(); + + // TF - check for our own biomes + if (!TFGenerationSettings.isBiomeSafeFor(biome, player)) { + + int groundY = 0; // TF - extend through full height + int minY = y0 - range; + int maxY = y0 + range; + + if (minY < groundY) { + minY = groundY; + } + + if (maxY < groundY) { + maxY = groundY; + } + + int y = Math.max(groundY, y0); + + if (minY != maxY) { + + random.setSeed((long) x * x * 3121 + x * 45238971L ^ (long) z * z * 418711 + z * 13761L); + + // TF - replace temperature check with biome check + RenderType nextType = getRenderType(biome); + if (nextType == null) { + continue; + } + + // TF - share this logic and use an enum instead of magic numbers + if (currentType != nextType) { + if (currentType != null) { + tessellator.end(); + } + currentType = nextType; + RenderSystem._setShaderTexture(0, nextType.getTextureLocation()); + bufferBuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.PARTICLE); + } + + // TF - replicate for each render type with own changes + switch (currentType) { + case BLIZZARD, BIG_RAIN -> { + float d5 = -((rendererUpdateCount + x * x * 3121 + x * 45238971 + z * z * 418711 + z * 13761 & 31) + partialTicks) / 32.0F * (3.0F + random.nextFloat()); + double d6 = x + 0.5F - xIn; + double d7 = z + 0.5F - zIn; + float f3 = Mth.sqrt((float) (d6 * d6 + d7 * d7)) / range; + float f4 = ((1.0F - f3 * f3) * 0.5F + 0.5F); + blockpos$mutableblockpos.set(x, y, z); + int j3 = LevelRenderer.getLightColor(level, blockpos$mutableblockpos); + int k3 = j3 >> 16 & 65535; + int l3 = j3 & 65535; + bufferBuilder.vertex(x - xIn - rx + 0.5D, maxY - yIn, z - zIn - ry + 0.5D).uv(0.0F, minY * 0.25F + d5).color(1.0F, 1.0F, 1.0F, f4).uv2(k3, l3).endVertex(); + bufferBuilder.vertex(x - xIn + rx + 0.5D, maxY - yIn, z - zIn + ry + 0.5D).uv(1.0F, minY * 0.25F + d5).color(1.0F, 1.0F, 1.0F, f4).uv2(k3, l3).endVertex(); + bufferBuilder.vertex(x - xIn + rx + 0.5D, minY - yIn, z - zIn + ry + 0.5D).uv(1.0F, maxY * 0.25F + d5).color(1.0F, 1.0F, 1.0F, f4).uv2(k3, l3).endVertex(); + bufferBuilder.vertex(x - xIn - rx + 0.5D, minY - yIn, z - zIn - ry + 0.5D).uv(0.0F, maxY * 0.25F + d5).color(1.0F, 1.0F, 1.0F, f4).uv2(k3, l3).endVertex(); + } + case MOSQUITO -> { + float d8 = 0; // TF - no wiggle + float d9 = random.nextFloat() + combinedTicks * 0.01F * (float) random.nextGaussian(); + float d10 = random.nextFloat() + (combinedTicks * (float) random.nextGaussian()) * 0.001F; + double d11 = x + 0.5F - xIn; + double d12 = z + 0.5F - zIn; + float f6 = Mth.sqrt((float) (d11 * d11 + d12 * d12)) / range; + float r = random.nextFloat() * 0.3F; // TF - random color + float g = random.nextFloat() * 0.3F; + float b = random.nextFloat() * 0.3F; + float f5 = ((1.0F - f6 * f6) * 0.3F + 0.5F); + int i4 = 15 << 20 | 15 << 4; // TF - fullbright + int j4 = i4 >> 16 & 65535; + int k4 = i4 & 65535; + bufferBuilder.vertex(x - xIn - rx + 0.5D, maxY - yIn, z - zIn - ry + 0.5D).uv(0.0F + d9, minY * 0.25F + d8 + d10).color(r, g, b, f5).uv2(j4, k4).endVertex(); + bufferBuilder.vertex(x - xIn + rx + 0.5D, maxY - yIn, z - zIn + ry + 0.5D).uv(1.0F + d9, minY * 0.25F + d8 + d10).color(r, g, b, f5).uv2(j4, k4).endVertex(); + bufferBuilder.vertex(x - xIn + rx + 0.5D, minY - yIn, z - zIn + ry + 0.5D).uv(1.0F + d9, maxY * 0.25F + d8 + d10).color(r, g, b, f5).uv2(j4, k4).endVertex(); + bufferBuilder.vertex(x - xIn - rx + 0.5D, minY - yIn, z - zIn - ry + 0.5D).uv(0.0F + d9, maxY * 0.25F + d8 + d10).color(r, g, b, f5).uv2(j4, k4).endVertex(); + } + case ASHES -> { + float d8 = -((rendererUpdateCount & 511) + partialTicks) / 512.0F; + float d9 = random.nextFloat() + combinedTicks * 0.01F * (float) random.nextGaussian(); + float d10 = random.nextFloat() + (combinedTicks * (float) random.nextGaussian()) * 0.001F; + double d11 = x + 0.5F - xIn; + double d12 = z + 0.5F - zIn; + float f6 = Mth.sqrt((float) (d11 * d11 + d12 * d12)) / range; + float f5 = ((1.0F - f6 * f6) * 0.3F + 0.5F); + int i4 = 15 << 20 | 15 << 4; // TF - fullbright + int j4 = i4 >> 16 & 65535; + int k4 = i4 & 65535; + float color = random.nextFloat() * 0.2F + 0.8F; // TF - random color + bufferBuilder.vertex(x - xIn - rx + 0.5D, maxY - yIn, z - zIn - ry + 0.5D).uv(0.0F + d9, minY * 0.25F + d8 + d10).color(color, color, color, f5).uv2(j4, k4).endVertex(); + bufferBuilder.vertex(x - xIn + rx + 0.5D, maxY - yIn, z - zIn + ry + 0.5D).uv(1.0F + d9, minY * 0.25F + d8 + d10).color(color, color, color, f5).uv2(j4, k4).endVertex(); + bufferBuilder.vertex(x - xIn + rx + 0.5D, minY - yIn, z - zIn + ry + 0.5D).uv(1.0F + d9, maxY * 0.25F + d8 + d10).color(color, color, color, f5).uv2(j4, k4).endVertex(); + bufferBuilder.vertex(x - xIn - rx + 0.5D, minY - yIn, z - zIn - ry + 0.5D).uv(0.0F + d9, maxY * 0.25F + d8 + d10).color(color, color, color, f5).uv2(j4, k4).endVertex(); + } + case DARK_STREAM -> { + float d8 = -((rendererUpdateCount & 511) + partialTicks) / 512.0F; + float d9 = 0; // TF - no u wiggle + float d10 = random.nextFloat() + (combinedTicks * (float) random.nextGaussian()) * 0.001F; + double d11 = x + 0.5F - xIn; + double d12 = z + 0.5F - zIn; + float f6 = Mth.sqrt((float) (d11 * d11 + d12 * d12)) / range; + float f5 = ((1.0F - f6 * f6) * 0.3F + 0.5F) * random.nextFloat(); // TF - random alpha multiplier + int i4 = 15 << 20 | 15 << 4; // TF - fullbright + int j4 = i4 >> 16 & 65535; + int k4 = i4 & 65535; + float z1 = (float)yIn * 0.125F; + bufferBuilder.vertex(x - xIn - rx + 0.5D, range, z - zIn - ry + 0.5D).uv(0.0F + d9, d8 + d10 - z1).color(1.0F, 1.0F, 1.0F, f5).uv2(j4, k4).endVertex(); + bufferBuilder.vertex(x - xIn + rx + 0.5D, range, z - zIn + ry + 0.5D).uv(1.0F + d9, d8 + d10 - z1).color(1.0F, 1.0F, 1.0F, f5).uv2(j4, k4).endVertex(); + float pV = range * 0.25F + d8 + d10 - z1; + bufferBuilder.vertex(x - xIn + rx + 0.5D, -range, z - zIn + ry + 0.5D).uv(1.0F + d9, pV).color(1.0F, 1.0F, 1.0F, f5).uv2(j4, k4).endVertex(); + bufferBuilder.vertex(x - xIn - rx + 0.5D, -range, z - zIn - ry + 0.5D).uv(0.0F + d9, pV).color(1.0F, 1.0F, 1.0F, f5).uv2(j4, k4).endVertex(); + } + } + } + } + } + } + + if (currentType != null) { + tessellator.end(); + } + + RenderSystem.enableCull(); + RenderSystem.disableBlend(); + lightmap.turnOffLightLayer(); } } + // [VanillaCopy] inside of EntityRenderer.renderRainSnow, edits noted + private static void renderLockedStructure(float partialTicks, Minecraft mc, LightTexture lightmap, double xIn, double yIn, double zIn) { + // draw locked structure thing + if (isNearLockedStructure(xIn, zIn)) { + lightmap.turnOnLightLayer(); + int i = Mth.floor(xIn); + int j = Mth.floor(yIn); + int k = Mth.floor(zIn); + Tesselator tessellator = Tesselator.getInstance(); + BufferBuilder bufferbuilder = tessellator.getBuilder(); + RenderSystem.disableCull(); + RenderSystem.enableBlend(); + RenderSystem.defaultBlendFunc(); + RenderSystem.enableDepthTest(); + + int range = 5; + if (Minecraft.useFancyGraphics()) { + range = 10; + } + + RenderSystem.depthMask(Minecraft.useShaderTransparency()); + int j1 = -1; + RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); + BlockPos.MutableBlockPos blockpos$mutableblockpos = new BlockPos.MutableBlockPos(); + + for (int k1 = k - range; k1 <= k + range; ++k1) { + for (int l1 = i - range; l1 <= i + range; ++l1) { + int i2 = (k1 - k + 16) * 32 + l1 - i + 16; + double d3 = rainxs[i2] * 0.5D; + double d4 = rainzs[i2] * 0.5D; + + // TF - replace biome check with box check + if (protectedBox != null && protectedBox.intersects(l1, k1, l1, k1)) { + int structureMin = protectedBox.minY() - 4; + int structureMax = protectedBox.maxY() + 4; + int k2 = j - range; + int l2 = j + range * 2; + + if (k2 < structureMin) { + k2 = structureMin; + } + + if (l2 < structureMin) { + l2 = structureMin; + } + + if (k2 > structureMax) { + k2 = structureMax; + } + + if (l2 > structureMax) { + l2 = structureMax; + } + + if (k2 != l2) { + Random random = new Random((long) l1 * l1 * 3121 + l1 * 45238971L ^ (long) k1 * k1 * 418711 + k1 * 13761L); + blockpos$mutableblockpos.set(l1, k2, k1); + + // TF - unwrap temperature check for snow, only one branch. Use our own texture + if (j1 != 0) { + if (j1 >= 0) { + tessellator.end(); + } + + j1 = 0; + RenderSystem._setShaderTexture(0, SPARKLES_TEXTURE); + bufferbuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.PARTICLE); + } + + float d5 = -((rendererUpdateCount + l1 * l1 * 3121 + l1 * 45238971 + k1 * k1 * 418711 + k1 * 13761 & 31) + partialTicks) / 32.0F * (3.0F + random.nextFloat()); + double d6 = l1 + 0.5F - xIn; + double d7 = k1 + 0.5F - zIn; + float f3 = Mth.sqrt((float) (d6 * d6 + d7 * d7)) / range; + // TF - "f" was rain strength for alpha + float f = random.nextFloat(); + float f4 = ((1.0F - f3 * f3) * 0.5F + 0.5F) * f; + int j3 = 15 << 20 | 15 << 4; // TF - fullbright + int k3 = j3 >> 16 & 65535; + int l3 = j3 & 65535; + bufferbuilder.vertex(l1 - xIn - d3 + 0.5D, l2 - yIn, k1 - zIn - d4 + 0.5D).uv(0.0F, k2 * 0.25F + d5).color(1.0F, 1.0F, 1.0F, f4).uv2(k3, l3).endVertex(); + bufferbuilder.vertex(l1 - xIn + d3 + 0.5D, l2 - yIn, k1 - zIn + d4 + 0.5D).uv(1.0F, k2 * 0.25F + d5).color(1.0F, 1.0F, 1.0F, f4).uv2(k3, l3).endVertex(); + bufferbuilder.vertex(l1 - xIn + d3 + 0.5D, k2 - yIn, k1 - zIn + d4 + 0.5D).uv(1.0F, l2 * 0.25F + d5).color(1.0F, 1.0F, 1.0F, f4).uv2(k3, l3).endVertex(); + bufferbuilder.vertex(l1 - xIn - d3 + 0.5D, k2 - yIn, k1 - zIn - d4 + 0.5D).uv(0.0F, l2 * 0.25F + d5).color(1.0F, 1.0F, 1.0F, f4).uv2(k3, l3).endVertex(); + } + } + } + } + + if (j1 >= 0) { + tessellator.end(); + } + + RenderSystem.enableCull(); + RenderSystem.disableBlend(); + lightmap.turnOffLightLayer(); + } + } + private static boolean isNearLockedBiome(Level world, Entity viewEntity) { + BlockPos.MutableBlockPos pos = new BlockPos.MutableBlockPos(); + final int range = 15; + int px = Mth.floor(viewEntity.getX()); + int pz = Mth.floor(viewEntity.getZ()); + + for (int z = pz - range; z <= pz + range; ++z) { + for (int x = px - range; x <= px + range; ++x) { + Biome biome = world.getBiome(pos.set(x, 0, z)).value(); + if (!TFGenerationSettings.isBiomeSafeFor(biome, viewEntity)) { + return true; + } + } + } - private boolean isNearLockedBiome(World world, EntityLivingBase viewEntity) { - int range = 15; - int px = MathHelper.floor_double(viewEntity.posX); - int pz = MathHelper.floor_double(viewEntity.posZ); - - for (int z = pz - range ; z <= pz + range; ++z) { - for (int x = px - range; x <= px + range; ++x) { - BiomeGenBase biomegenbase = world.getBiomeGenForCoords(x, z); - if (biomegenbase instanceof TFBiomeBase && viewEntity instanceof EntityPlayer) { - TFBiomeBase tfBiome = (TFBiomeBase)biomegenbase; - EntityPlayer player = (EntityPlayer)viewEntity; - if (!tfBiome.doesPlayerHaveRequiredAchievement(player)) { - return true; - } - } - } - } - return false; } - private boolean isNearLockedStructure(World world, EntityLivingBase viewEntity) { - int range = 15; - int px = MathHelper.floor_double(viewEntity.posX); - int pz = MathHelper.floor_double(viewEntity.posZ); - - if (this.protectedBox != null && this.protectedBox.intersectsWith(px - range, pz - range, px + range, pz + range)) { - return true; - } + private static boolean isNearLockedStructure(double xIn, double zIn) { + final int range = 15; + int px = Mth.floor(xIn); + int pz = Mth.floor(zIn); - return false; + return protectedBox != null && protectedBox.intersects(px - range, pz - range, px + range, pz + range); } + public static void setProtectedBox(BoundingBox protectedBox) { + TFWeatherRenderer.protectedBox = protectedBox; + } - - public StructureBoundingBox getProtectedBox() { - return protectedBox; + private static @Nullable RenderType getRenderType(Biome b) { + if (Minecraft.getInstance().level == null) + return null; + ResourceLocation biome = Minecraft.getInstance().level.registryAccess().registryOrThrow(Registries.BIOME).getKey(b); + if (TFBiomes.SNOWY_FOREST.location().equals(biome) || TFBiomes.GLACIER.location().equals(biome)) { + return RenderType.BLIZZARD; + } else if (TFBiomes.SWAMP.location().equals(biome)) { + return RenderType.MOSQUITO; + } else if (TFBiomes.FIRE_SWAMP.location().equals(biome)) { + return RenderType.ASHES; + } else if (TFBiomes.DARK_FOREST.location().equals(biome) || TFBiomes.DARK_FOREST_CENTER.location().equals(biome)) { + return random.nextInt(2) == 0 ? RenderType.DARK_STREAM : null; + } else if (TFBiomes.HIGHLANDS.location().equals(biome) || TFBiomes.THORNLANDS.location().equals(biome) || TFBiomes.FINAL_PLATEAU.location().equals(biome)) { + return RenderType.BIG_RAIN; + } + return null; } + private enum RenderType { + BLIZZARD("blizzard.png"), + MOSQUITO("mosquitoes.png"), + ASHES("ashes.png"), + DARK_STREAM("darkstream.png"), + BIG_RAIN("bigrain.png"); - public void setProtectedBox(StructureBoundingBox protectedBox) { - this.protectedBox = protectedBox; - - //System.out.println("Set protected box to " + protectedBox); - } + RenderType(String textureName) { + this.textureLocation = TwilightForestMod.getEnvTexture(textureName); + } -} + private final ResourceLocation textureLocation; + public ResourceLocation getTextureLocation() { + return textureLocation; + } + } + private static int rainSoundTime; + + /** + * [VanillaCopy]:
+ * {@link net.minecraft.client.renderer.LevelRenderer#tickRain(Camera)}
+ */ + public static boolean tickRain(ClientLevel level, int ticks, BlockPos blockpos) { + if (urGhastAlive) { + urGhastRain = Math.min(1.0F, urGhastRain + 0.1F); + urGhastAlive = false; + } else urGhastRain = Math.max(0.0F, urGhastRain - 0.02F); + + + float rainLevel = Math.max(level.getRainLevel(1.0F), urGhastRain) / (Minecraft.useFancyGraphics() ? 1.0F : 2.0F); + if (rainLevel > 0.0F) { + RandomSource randomsource = RandomSource.create((long)ticks * 312987231L); + BlockPos blockpos1 = null; + int i = (int)(100.0F * rainLevel * rainLevel) / (Minecraft.getInstance().options.particles().get() == ParticleStatus.DECREASED ? 2 : 1); + + for(int j = 0; j < i; ++j) { + int k = randomsource.nextInt(21) - 10; + int l = randomsource.nextInt(21) - 10; + BlockPos blockpos2 = level.getHeightmapPos(Heightmap.Types.MOTION_BLOCKING, blockpos.offset(k, 0, l)); + Biome biome = level.getBiome(blockpos2).value(); + if (blockpos2.getY() > level.getMinBuildHeight() && blockpos2.getY() <= blockpos.getY() + 10 && blockpos2.getY() >= blockpos.getY() - 10 && biome.hasPrecipitation() && biome.warmEnoughToRain(blockpos2)) { + blockpos1 = blockpos2.below(); + if (Minecraft.getInstance().options.particles().get() == ParticleStatus.MINIMAL) { + break; + } + + double d0 = randomsource.nextDouble(); + double d1 = randomsource.nextDouble(); + BlockState blockstate = level.getBlockState(blockpos1); + FluidState fluidstate = level.getFluidState(blockpos1); + VoxelShape voxelshape = blockstate.getCollisionShape(level, blockpos1); + double d2 = voxelshape.max(Direction.Axis.Y, d0, d1); + double d3 = fluidstate.getHeight(level, blockpos1); + double d4 = Math.max(d2, d3); + ParticleOptions particleoptions = !fluidstate.is(FluidTags.LAVA) && !blockstate.is(Blocks.MAGMA_BLOCK) && !CampfireBlock.isLitCampfire(blockstate) ? ParticleTypes.RAIN : ParticleTypes.SMOKE; + level.addParticle(particleoptions, (double)blockpos1.getX() + d0, (double)blockpos1.getY() + d4, (double)blockpos1.getZ() + d1, 0.0D, 0.0D, 0.0D); + } + } + + if (blockpos1 != null && randomsource.nextInt(4) < rainSoundTime++) { + rainSoundTime = 0; + if (blockpos1.getY() > blockpos.getY() + 1 && level.getHeightmapPos(Heightmap.Types.MOTION_BLOCKING, blockpos).getY() > Mth.floor((float)blockpos.getY())) { + level.playLocalSound(blockpos1, SoundEvents.WEATHER_RAIN_ABOVE, SoundSource.WEATHER, 0.1F, 0.5F, false); + } else { + level.playLocalSound(blockpos1, SoundEvents.WEATHER_RAIN, SoundSource.WEATHER, 0.2F, 1.0F, false); + } + } -//if (l > 0 && this.random.nextInt(3) < this.rainSoundCounter++) -//{ -// this.rainSoundCounter = 0; -// -// if (d1 > entitylivingbase.posY + 1.0D && worldclient.getPrecipitationHeight(MathHelper.floor_double(entitylivingbase.posX), MathHelper.floor_double(entitylivingbase.posZ)) > MathHelper.floor_double(entitylivingbase.posY)) -// { -// this.mc.theWorld.playSound(d0, d1, d2, "ambient.weather.rain", 0.1F, 0.5F, false); -// } -// else -// { -// this.mc.theWorld.playSound(d0, d1, d2, "ambient.weather.rain", 0.2F, 1.0F, false); -// } -//} + } + return true; + } +} diff --git a/src/main/java/twilightforest/client/renderer/TileEntityTFCicadaRenderer.java b/src/main/java/twilightforest/client/renderer/TileEntityTFCicadaRenderer.java deleted file mode 100644 index dd3754145d..0000000000 --- a/src/main/java/twilightforest/client/renderer/TileEntityTFCicadaRenderer.java +++ /dev/null @@ -1,77 +0,0 @@ -package twilightforest.client.renderer; - -import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.ResourceLocation; - -import org.lwjgl.opengl.GL11; - -import twilightforest.TwilightForestMod; -import twilightforest.client.model.ModelTFCicada; -import twilightforest.tileentity.TileEntityTFCicada; - - -public class TileEntityTFCicadaRenderer extends TileEntitySpecialRenderer { - - private ModelTFCicada cicadaModel; - private static final ResourceLocation textureLoc = new ResourceLocation(TwilightForestMod.MODEL_DIR + "cicada-model.png"); - - public TileEntityTFCicadaRenderer() - { - cicadaModel = new ModelTFCicada(); - } - - - @Override - public void renderTileEntityAt(TileEntity tileentity, double d, double d1, double d2, float f) { - renderTileEntityCicadaAt((TileEntityTFCicada)tileentity, d, d1, d2, f); - - } - - /** - * Render a cute cicada! - */ - private void renderTileEntityCicadaAt(TileEntityTFCicada tileentity, double d, double d1, double d2, float f) { - GL11.glPushMatrix(); - int facing = tileentity.getBlockMetadata(); - float rotX = 90.0F; - float rotZ = 0.0F; - if(facing == 3) - { - rotZ = 0F; - } - if(facing == 4) - { - rotZ = 180F; - } - if(facing == 1) - { - rotZ = -90F; - } - if(facing == 2) - { - rotZ = 90F; - } - if(facing == 5) - { - rotX = 0F; - } - if(facing == 6) - { - rotX = 180F; - } - GL11.glTranslatef((float)d + 0.5F, (float)d1 + 0.5F, (float)d2 + 0.5F); - GL11.glRotatef(rotX, 1F, 0F, 0F); - GL11.glRotatef(rotZ, 0F, 0F, 1F); - GL11.glRotatef((float) tileentity.currentYaw, 0F, 1F, 0F); - - this.bindTexture(textureLoc); - GL11.glPushMatrix(); - GL11.glScalef(1f, -1f, -1f); - cicadaModel.render(0.0625f); - GL11.glPopMatrix(); - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - GL11.glPopMatrix(); - } - -} diff --git a/src/main/java/twilightforest/client/renderer/TileEntityTFFireflyRenderer.java b/src/main/java/twilightforest/client/renderer/TileEntityTFFireflyRenderer.java deleted file mode 100644 index 67eaff0928..0000000000 --- a/src/main/java/twilightforest/client/renderer/TileEntityTFFireflyRenderer.java +++ /dev/null @@ -1,103 +0,0 @@ -package twilightforest.client.renderer; - -import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.ResourceLocation; - -import org.lwjgl.opengl.GL11; - -import twilightforest.TwilightForestMod; -import twilightforest.client.model.ModelTFFirefly; -import twilightforest.tileentity.TileEntityTFFirefly; - - -public class TileEntityTFFireflyRenderer extends TileEntitySpecialRenderer { - - private ModelTFFirefly fireflyModel; - private static final ResourceLocation textureLoc = new ResourceLocation(TwilightForestMod.MODEL_DIR + "firefly-tiny.png"); - - public TileEntityTFFireflyRenderer() - { - fireflyModel = new ModelTFFirefly(); - } - - - @Override - public void renderTileEntityAt(TileEntity tileentity, double d, double d1, double d2, float f) { - renderTileEntityFireflyAt((TileEntityTFFirefly)tileentity, d, d1, d2, f); - - } - - - /** - * Render a cute firefly! - */ - private void renderTileEntityFireflyAt(TileEntityTFFirefly tileentity, double d, double d1, double d2, float f) { - GL11.glPushMatrix(); - int facing = tileentity.getBlockMetadata(); - - float rotX = 90.0F; - float rotZ = 0.0F; - if(facing == 3) - { - rotZ = 0F; - } - if(facing == 4) - { - rotZ = 180F; - } - if(facing == 1) - { - rotZ = -90F; - } - if(facing == 2) - { - rotZ = 90F; - } - if(facing == 5) - { - rotX = 0F; - } - if(facing == 6) - { - rotX = 180F; - } - GL11.glTranslatef((float)d + 0.5F, (float)d1 + 0.5F, (float)d2 + 0.5F); - GL11.glRotatef(rotX, 1F, 0F, 0F); - GL11.glRotatef(rotZ, 0F, 0F, 1F); - GL11.glRotatef((float) tileentity.currentYaw, 0F, 1F, 0F); - - this.bindTexture(textureLoc); - GL11.glPushMatrix(); - GL11.glScalef(1f, -1f, -1f); - - GL11.glColorMask(true, true, true, true); - - // render the firefly body - GL11.glDisable(3042 /*GL_BLEND*/); - fireflyModel.render(0.0625f); - -// -// GL11.glEnable(3042 /*GL_BLEND*/); -// GL11.glDisable(3008 /*GL_ALPHA_TEST*/); -// GL11.glBlendFunc(770, 771); -// GL11.glColor4f(1.0F, 1.0F, 1.0F, f1); - - // render the firefly glow - GL11.glEnable(3042 /*GL_BLEND*/); - GL11.glDisable(3008 /*GL_ALPHA_TEST*/); -// GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - GL11.glDisable(GL11.GL_LIGHTING); - GL11.glBlendFunc(770, 1); - GL11.glColor4f(1.0F, 1.0F, 1.0F, tileentity.glowIntensity); - fireflyModel.glow.render(0.0625f); - GL11.glDisable(3042 /*GL_BLEND*/); - GL11.glEnable(3008 /*GL_ALPHA_TEST*/); - GL11.glEnable(GL11.GL_LIGHTING); - - GL11.glPopMatrix(); - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - GL11.glPopMatrix(); - } - -} diff --git a/src/main/java/twilightforest/client/renderer/TileEntityTFMoonwormRenderer.java b/src/main/java/twilightforest/client/renderer/TileEntityTFMoonwormRenderer.java deleted file mode 100644 index 49af783e37..0000000000 --- a/src/main/java/twilightforest/client/renderer/TileEntityTFMoonwormRenderer.java +++ /dev/null @@ -1,81 +0,0 @@ -package twilightforest.client.renderer; - -import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.ResourceLocation; - -import org.lwjgl.opengl.GL11; - -import twilightforest.TwilightForestMod; -import twilightforest.client.model.ModelTFMoonworm; -import twilightforest.tileentity.TileEntityTFMoonworm; - - -public class TileEntityTFMoonwormRenderer extends TileEntitySpecialRenderer { - - private ModelTFMoonworm moonwormModel; - private static final ResourceLocation textureLoc = new ResourceLocation(TwilightForestMod.MODEL_DIR + "moonworm.png"); - - public TileEntityTFMoonwormRenderer() - { - moonwormModel = new ModelTFMoonworm(); - } - - - @Override - public void renderTileEntityAt(TileEntity tileentity, double d, double d1, double d2, float f) { - renderTileEntityFireflyAt((TileEntityTFMoonworm)tileentity, d, d1, d2, f); - - } - - /** - * Render a cute firefly! - */ - private void renderTileEntityFireflyAt(TileEntityTFMoonworm tileentity, double d, double d1, double d2, float partialTime) { - GL11.glPushMatrix(); - int facing = tileentity.getBlockMetadata(); - - float rotX = 90.0F; - float rotZ = 0.0F; - if(facing == 3) - { - rotZ = 0F; - } - if(facing == 4) - { - rotZ = 180F; - } - if(facing == 1) - { - rotZ = -90F; - } - if(facing == 2) - { - rotZ = 90F; - } - if(facing == 5) - { - rotX = 0F; - } - if(facing == 6) - { - rotX = 180F; - } - GL11.glTranslatef((float)d + 0.5F, (float)d1 + 0.5F, (float)d2 + 0.5F); - GL11.glRotatef(rotX, 1F, 0F, 0F); - GL11.glRotatef(rotZ, 0F, 0F, 1F); - GL11.glRotatef((float) tileentity.currentYaw, 0F, 1F, 0F); - - this.bindTexture(textureLoc); - - GL11.glScalef(1f, -1f, -1f); - - moonwormModel.setLivingAnimations(tileentity, partialTime); - - // render the firefly body - moonwormModel.render(0.0625f); - - GL11.glPopMatrix(); - } - -} diff --git a/src/main/java/twilightforest/client/renderer/TileEntityTFTrophyRenderer.java b/src/main/java/twilightforest/client/renderer/TileEntityTFTrophyRenderer.java deleted file mode 100644 index c0d6cc1206..0000000000 --- a/src/main/java/twilightforest/client/renderer/TileEntityTFTrophyRenderer.java +++ /dev/null @@ -1,219 +0,0 @@ -package twilightforest.client.renderer; - -import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; -import net.minecraft.entity.Entity; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.ResourceLocation; - -import org.lwjgl.opengl.GL11; - -import twilightforest.TwilightForestMod; -import twilightforest.client.model.ModelTFHydraHead; -import twilightforest.client.model.ModelTFLich; -import twilightforest.client.model.ModelTFNaga; -import twilightforest.client.model.ModelTFSnowQueen; -import twilightforest.client.model.ModelTFTowerBoss; -import twilightforest.tileentity.TileEntityTFTrophy; - - -public class TileEntityTFTrophyRenderer extends TileEntitySpecialRenderer { - - private ModelTFHydraHead hydraHeadModel; - private static final ResourceLocation textureLocHydra = new ResourceLocation(TwilightForestMod.MODEL_DIR + "hydra4.png"); - private ModelTFNaga nagaHeadModel; - private static final ResourceLocation textureLocNaga = new ResourceLocation(TwilightForestMod.MODEL_DIR + "nagahead.png"); - private ModelTFLich lichModel; - private static final ResourceLocation textureLocLich = new ResourceLocation(TwilightForestMod.MODEL_DIR + "twilightlich64.png"); - private ModelTFTowerBoss urGhastModel; - private static final ResourceLocation textureLocUrGhast = new ResourceLocation(TwilightForestMod.MODEL_DIR + "towerboss.png"); - private ModelTFSnowQueen snowQueenModel; - private static final ResourceLocation textureLocSnowQueen = new ResourceLocation(TwilightForestMod.MODEL_DIR + "snowqueen.png"); - - public TileEntityTFTrophyRenderer() - { - hydraHeadModel = new ModelTFHydraHead(); - nagaHeadModel = new ModelTFNaga(); - lichModel = new ModelTFLich(); - urGhastModel = new ModelTFTowerBoss(); - snowQueenModel = new ModelTFSnowQueen(); - } - - - @Override - public void renderTileEntityAt(TileEntity tileentity, double x, double y, double z, float partialTime) { - TileEntityTFTrophy trophy = (TileEntityTFTrophy)tileentity; - - - GL11.glPushMatrix(); - GL11.glDisable(GL11.GL_CULL_FACE); - - int meta = trophy.getBlockMetadata() & 7; - - float rotation = (float)(trophy.func_145906_b() * 360) / 16.0F; - boolean onGround = true; - - // wall mounted? - if (meta != 1) - { - switch (meta) - { - case 2: - onGround = false; - break; - case 3: - onGround = false; - rotation = 180.0F; - break; - case 4: - onGround = false; - rotation = 270.0F; - break; - case 5: - default: - onGround = false; - rotation = 90.0F; - } - } - - - GL11.glTranslatef((float)x + 0.5F, (float)y + 0.5F, (float)z + 0.5F); - - - - switch (trophy.func_145904_a()) - { - case 0: - renderHydraHead(rotation, onGround); - break; - case 1: - renderNagaHead(rotation, onGround); - break; - case 2: - renderLichHead(rotation, onGround); - break; - case 3: - renderUrGhastHead(trophy, rotation, onGround, partialTime); - break; - case 4: - renderSnowQueenHead(rotation, onGround); - break; - } - - GL11.glPopMatrix(); - - } - - /** - * Render a hydra head - */ - private void renderHydraHead(float rotation, boolean onGround) { - - GL11.glScalef(0.25f, 0.25f, 0.25f); - - this.bindTexture(textureLocHydra); - - GL11.glScalef(1f, -1f, -1f); - - // we seem to be getting a 180 degree rotation here - GL11.glRotatef(rotation, 0F, 1F, 0F); - GL11.glRotatef(180F, 0F, 1F, 0F); - - GL11.glTranslatef(0, onGround ? 1F : -0F, 1.5F); - - // open mouth? - hydraHeadModel.openMouthForTrophy(onGround ? 0F : 0.25F); - - // render the hydra head - hydraHeadModel.render((Entity)null, 0.0F, 0.0F, 0.0F, rotation, 0.0F, 0.0625F); - } - - - private void renderNagaHead(float rotation, boolean onGround) { - - GL11.glTranslatef(0, -0.125F, 0); - - - GL11.glScalef(0.25f, 0.25f, 0.25f); - - this.bindTexture(textureLocNaga); - - GL11.glScalef(1f, -1f, -1f); - - // we seem to be getting a 180 degree rotation here - GL11.glRotatef(rotation, 0F, 1F, 0F); - GL11.glRotatef(180F, 0F, 1F, 0F); - - GL11.glTranslatef(0, onGround ? 1F : -0F, onGround ? 0F : 1F); - - // render the naga head - nagaHeadModel.render((Entity)null, 0.0F, 0.0F, 0.0F, rotation, 0.0F, 0.0625F); - } - - - private void renderLichHead(float rotation, boolean onGround) { - - GL11.glTranslatef(0, 1, 0); - - - //GL11.glScalef(0.5f, 0.5f, 0.5f); - - this.bindTexture(textureLocLich); - - GL11.glScalef(1f, -1f, -1f); - - // we seem to be getting a 180 degree rotation here - GL11.glRotatef(rotation, 0F, 1F, 0F); - GL11.glRotatef(180F, 0F, 1F, 0F); - - GL11.glTranslatef(0, onGround ? 1.75F : 1.5F, onGround ? 0F : 0.24F); - - // render the naga head - lichModel.bipedHead.render(0.0625F); - lichModel.bipedHeadwear.render(0.0625F); - } - - - - private void renderUrGhastHead(TileEntityTFTrophy trophy, float rotation, boolean onGround, float partialTime) { - - GL11.glTranslatef(0, 1, 0); - - GL11.glScalef(0.5f, 0.5f, 0.5f); - - this.bindTexture(textureLocUrGhast); - - GL11.glScalef(1f, -1f, -1f); - - // we seem to be getting a 180 degree rotation here - GL11.glRotatef(rotation, 0F, 1F, 0F); - GL11.glRotatef(180F, 0F, 1F, 0F); - - GL11.glTranslatef(0, onGround ? 1F : 1F, onGround ? 0F : 0F); - - // render the naga head - urGhastModel.render((Entity)null, 0.0F, 0, trophy.ticksExisted + partialTime, 0, 0.0F, 0.0625F); - } - - private void renderSnowQueenHead(float rotation, boolean onGround) { - - GL11.glTranslatef(0, 1, 0); - - - //GL11.glScalef(0.5f, 0.5f, 0.5f); - - this.bindTexture(textureLocSnowQueen); - - GL11.glScalef(1f, -1f, -1f); - - // we seem to be getting a 180 degree rotation here - GL11.glRotatef(rotation, 0F, 1F, 0F); - GL11.glRotatef(180F, 0F, 1F, 0F); - - GL11.glTranslatef(0, onGround ? 1.5F : 1.25F, onGround ? 0F : 0.24F); - - // render the naga head - snowQueenModel.bipedHead.render(0.0625F); - snowQueenModel.bipedHeadwear.render(0.0625F); - } - -} diff --git a/src/main/java/twilightforest/client/renderer/blocks/RenderBlockTFCastleMagic.java b/src/main/java/twilightforest/client/renderer/blocks/RenderBlockTFCastleMagic.java deleted file mode 100644 index 554131dcde..0000000000 --- a/src/main/java/twilightforest/client/renderer/blocks/RenderBlockTFCastleMagic.java +++ /dev/null @@ -1,183 +0,0 @@ -package twilightforest.client.renderer.blocks; - -import org.lwjgl.opengl.GL11; - -import twilightforest.block.BlockTFCastleMagic; -import twilightforest.block.BlockTFFireflyJar; -import twilightforest.block.TFBlocks; -import net.minecraft.block.Block; -import net.minecraft.client.renderer.OpenGlHelper; -import net.minecraft.client.renderer.RenderBlocks; -import net.minecraft.client.renderer.Tessellator; -import net.minecraft.util.IIcon; -import net.minecraft.world.IBlockAccess; -import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; - -public class RenderBlockTFCastleMagic implements ISimpleBlockRenderingHandler { - - private int renderID; - - public RenderBlockTFCastleMagic(int castleMagicBlockRenderID) { - this.renderID = castleMagicBlockRenderID; - } - - @Override - public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer) { - renderInvBlock(renderer, block, metadata); - } - - public static void renderInvBlock(RenderBlocks renderblocks, Block par1Block, int meta) { - Tessellator tessellator = Tessellator.instance; - - GL11.glTranslatef(-0.5F, -0.5F, -0.5F); - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - - renderInvBlock(renderblocks, par1Block, meta, tessellator); - - GL11.glTranslatef(0.5F, 0.5F, 0.5F); - - par1Block.setBlockBoundsForItemRender(); - } - - protected static void renderInvBlock(RenderBlocks renderblocks, Block par1Block, int meta, Tessellator tessellator) { - - - tessellator.startDrawingQuads(); - tessellator.setNormal(0.0F, -1.0F, 0.0F); - renderblocks.renderFaceYNeg(par1Block, 0.0D, 0.0D, 0.0D, par1Block.getIcon(0, meta)); - tessellator.draw(); - tessellator.startDrawingQuads(); - tessellator.setNormal(0.0F, 1.0F, 0.0F); - renderblocks.renderFaceYPos(par1Block, 0.0D, 0.0D, 0.0D, par1Block.getIcon(1, meta)); - tessellator.draw(); - tessellator.startDrawingQuads(); - tessellator.setNormal(0.0F, 0.0F, -1.0F); - renderblocks.renderFaceXPos(par1Block, 0.0D, 0.0D, 0.0D, par1Block.getIcon(2, meta)); - tessellator.draw(); - tessellator.startDrawingQuads(); - tessellator.setNormal(0.0F, 0.0F, 1.0F); - renderblocks.renderFaceXNeg(par1Block, 0.0D, 0.0D, 0.0D, par1Block.getIcon(3, meta)); - tessellator.draw(); - tessellator.startDrawingQuads(); - tessellator.setNormal(-1.0F, 0.0F, 0.0F); - renderblocks.renderFaceZNeg(par1Block, 0.0D, 0.0D, 0.0D, par1Block.getIcon(4, meta)); - tessellator.draw(); - tessellator.startDrawingQuads(); - tessellator.setNormal(1.0F, 0.0F, 0.0F); - renderblocks.renderFaceZPos(par1Block, 0.0D, 0.0D, 0.0D, par1Block.getIcon(5, meta)); - tessellator.draw(); - - - float pixel = 1F / 16F; - - IIcon icon = BlockTFCastleMagic.getMagicIconFor(meta, 0, 0); - - int color = BlockTFCastleMagic.getMagicColorFor(meta); - - float red = (float)(color >> 16 & 255) / 255.0F; - float grn = (float)(color >> 8 & 255) / 255.0F; - float blu = (float)(color & 255) / 255.0F; - - renderblocks.enableAO = false; - - GL11.glDisable(GL11.GL_LIGHTING); - - - tessellator.startDrawingQuads(); - tessellator.setBrightness(15 << 20 | 15 << 4); // full brightness - tessellator.setColorOpaque_F(red, grn, blu); - renderblocks.renderFaceYNeg(par1Block, 0.0D, -pixel, 0.0D, icon); - tessellator.draw(); - tessellator.startDrawingQuads(); - tessellator.setBrightness(15 << 20 | 15 << 4); // full brightness - tessellator.setColorOpaque_F(red, grn, blu); - renderblocks.renderFaceYPos(par1Block, 0.0D, +pixel, 0.0D, icon); - tessellator.draw(); - tessellator.startDrawingQuads(); - tessellator.setBrightness(15 << 20 | 15 << 4); // full brightness - tessellator.setColorOpaque_F(red, grn, blu); - renderblocks.renderFaceXPos(par1Block, +pixel, 0.0D, 0.0D, icon); - tessellator.draw(); - tessellator.startDrawingQuads(); - tessellator.setBrightness(15 << 20 | 15 << 4); // full brightness - tessellator.setColorOpaque_F(red, grn, blu); - renderblocks.renderFaceXNeg(par1Block, -pixel, 0.0D, 0.0D, icon); - tessellator.draw(); - tessellator.startDrawingQuads(); - tessellator.setBrightness(15 << 20 | 15 << 4); // full brightness - tessellator.setColorOpaque_F(red, grn, blu); - renderblocks.renderFaceZNeg(par1Block, 0.0D, 0.0D, -pixel, icon); - tessellator.draw(); - tessellator.startDrawingQuads(); - tessellator.setBrightness(15 << 20 | 15 << 4); // full brightness - tessellator.setColorOpaque_F(red, grn, blu); - renderblocks.renderFaceZPos(par1Block, 0.0D, 0.0D, +pixel, icon); - tessellator.draw(); - - GL11.glEnable(GL11.GL_LIGHTING); - - } - - @Override - public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) { - renderer.clearOverrideBlockTexture(); - renderer.setRenderBounds(0, 0, 0, 1, 1, 1); - renderer.renderStandardBlock(block, x, y, z); - - renderer.overrideBlockTexture = BlockTFCastleMagic.getMagicIconFor(x, y, z); - - int meta = world.getBlockMetadata(x, y, z); - int color = BlockTFCastleMagic.getMagicColorFor(meta); - float red = (float)(color >> 16 & 255) / 255.0F; - float grn = (float)(color >> 8 & 255) / 255.0F; - float blu = (float)(color & 255) / 255.0F; - - - // if the block is a door or other clickable block(?), pulse the glyph a little - if (block == TFBlocks.castleDoor) { - - } - - - Tessellator tessellator = Tessellator.instance; - tessellator.setBrightness(15 << 20 | 15 << 4); // full brightness - tessellator.setColorOpaque_F(red, grn, blu); - - renderer.enableAO = false; - float pixel = 1/16F; - - if (renderer.renderAllFaces || block.shouldSideBeRendered(world, x, y - 1, z, 0) && world.isAirBlock(x, y - 1, z)) { - renderer.renderFaceYNeg(block, (double)x, (double)y - pixel, (double)z, renderer.overrideBlockTexture); - } - if (renderer.renderAllFaces || block.shouldSideBeRendered(world, x, y + 1, z, 1) && world.isAirBlock(x, y + 1, z)) { - renderer.renderFaceYPos(block, (double)x, (double)y + pixel, (double)z, renderer.overrideBlockTexture); - } - if (renderer.renderAllFaces || block.shouldSideBeRendered(world, x, y, z - 1, 2) && world.isAirBlock(x, y, z - 1)) { - renderer.renderFaceZNeg(block, (double)x, (double)y, (double)z - pixel, renderer.overrideBlockTexture); - } - if (renderer.renderAllFaces || block.shouldSideBeRendered(world, x, y, z + 1, 3) && world.isAirBlock(x, y, z + 1)) { - renderer.renderFaceZPos(block, (double)x, (double)y, (double)z + pixel, renderer.overrideBlockTexture); - } - if (renderer.renderAllFaces || block.shouldSideBeRendered(world, x - 1, y, z, 4) && world.isAirBlock(x - 1, y, z)) { - renderer.renderFaceXNeg(block, (double)x - pixel, (double)y, (double)z, renderer.overrideBlockTexture); - } - if (renderer.renderAllFaces || block.shouldSideBeRendered(world, x + 1, y, z, 5) && world.isAirBlock(x + 1, y, z)) { - renderer.renderFaceXPos(block, (double)x + pixel, (double)y, (double)z, renderer.overrideBlockTexture); - } - - renderer.clearOverrideBlockTexture(); - return true; - - } - - @Override - public boolean shouldRender3DInInventory(int modelId) { - return true; - } - - @Override - public int getRenderId() { - return this.renderID; - } - -} diff --git a/src/main/java/twilightforest/client/renderer/blocks/RenderBlockTFCritters.java b/src/main/java/twilightforest/client/renderer/blocks/RenderBlockTFCritters.java deleted file mode 100644 index 977e826be7..0000000000 --- a/src/main/java/twilightforest/client/renderer/blocks/RenderBlockTFCritters.java +++ /dev/null @@ -1,38 +0,0 @@ -package twilightforest.client.renderer.blocks; - -import net.minecraft.block.Block; -import net.minecraft.client.renderer.RenderBlocks; -import net.minecraft.world.IBlockAccess; -import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; - -public class RenderBlockTFCritters implements ISimpleBlockRenderingHandler { - - final int renderID; - - public RenderBlockTFCritters(int blockComplexRenderID) { - this.renderID = blockComplexRenderID; - } - - @Override - public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) { - // TODO Auto-generated method stub - - } - - @Override - public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean shouldRender3DInInventory(int modelId) { - return false; - } - - @Override - public int getRenderId() { - return renderID; - } - -} diff --git a/src/main/java/twilightforest/client/renderer/blocks/RenderBlockTFFireflyJar.java b/src/main/java/twilightforest/client/renderer/blocks/RenderBlockTFFireflyJar.java deleted file mode 100644 index 0b381909ac..0000000000 --- a/src/main/java/twilightforest/client/renderer/blocks/RenderBlockTFFireflyJar.java +++ /dev/null @@ -1,133 +0,0 @@ -package twilightforest.client.renderer.blocks; - -import net.minecraft.block.Block; -import net.minecraft.client.renderer.RenderBlocks; -import net.minecraft.client.renderer.Tessellator; -import net.minecraft.world.IBlockAccess; - -import org.lwjgl.opengl.GL11; - -import twilightforest.block.BlockTFFireflyJar; -import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; - -public class RenderBlockTFFireflyJar implements ISimpleBlockRenderingHandler { - - final int renderID; - - public RenderBlockTFFireflyJar(int blockComplexRenderID) { - this.renderID = blockComplexRenderID; - } - - @Override - public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) { - renderInvJar(renderer, block, metadata); - - } - - @Override - public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) { - return renderJar(renderer, world, x, y, z, block); - } - - @Override - public boolean shouldRender3DInInventory(int modelId) { - return true; - } - - @Override - public int getRenderId() { - return renderID; - } - - /** - * Look, this is no longer in the Block class! I'm an object oriented genius! - */ - public static boolean renderJar(RenderBlocks renderblocks, IBlockAccess world, int x, int y, int z, Block block) { - renderblocks.clearOverrideBlockTexture(); - renderblocks.setRenderBounds(0.1875F, 0.0F, 0.1875F, 0.8125F, 0.875F, 0.8125F); - renderblocks.renderStandardBlock(block, x, y, z); - - renderblocks.overrideBlockTexture = BlockTFFireflyJar.jarCork; - renderblocks.setRenderBounds(0.25F, 0.75F, 0.25F, 0.75F, 1.0F, 0.75F); - renderblocks.renderStandardBlock(block, x, y, z); - renderblocks.clearOverrideBlockTexture(); - - block.setBlockBoundsForItemRender(); - return true; - } - - public static void renderInvJar(RenderBlocks renderblocks, Block par1Block, int meta) { - Tessellator tessellator = Tessellator.instance; - - GL11.glTranslatef(-0.5F, -0.5F, -0.5F); - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - - // render jar portion - renderblocks.setRenderBounds(0.1875F, 0.0F, 0.1875F, 0.8125F, 0.875F, 0.8125F); - - tessellator.startDrawingQuads(); - tessellator.setNormal(0.0F, -1.0F, 0.0F); - renderblocks.renderFaceYNeg(par1Block, 0.0D, 0.0D, 0.0D, BlockTFFireflyJar.jarTop); - tessellator.draw(); - tessellator.startDrawingQuads(); - tessellator.setNormal(0.0F, 1.0F, 0.0F); - renderblocks.renderFaceYPos(par1Block, 0.0D, 0.0D, 0.0D, BlockTFFireflyJar.jarTop); - tessellator.draw(); - tessellator.startDrawingQuads(); - tessellator.setNormal(0.0F, 0.0F, -1.0F); - renderblocks.renderFaceXPos(par1Block, 0.0D, 0.0D, 0.0D, BlockTFFireflyJar.jarSide); - tessellator.draw(); - tessellator.startDrawingQuads(); - tessellator.setNormal(0.0F, 0.0F, 1.0F); - renderblocks.renderFaceXNeg(par1Block, 0.0D, 0.0D, 0.0D, BlockTFFireflyJar.jarSide); - tessellator.draw(); - tessellator.startDrawingQuads(); - tessellator.setNormal(-1.0F, 0.0F, 0.0F); - renderblocks.renderFaceZNeg(par1Block, 0.0D, 0.0D, 0.0D, BlockTFFireflyJar.jarSide); - tessellator.draw(); - tessellator.startDrawingQuads(); - tessellator.setNormal(1.0F, 0.0F, 0.0F); - renderblocks.renderFaceZPos(par1Block, 0.0D, 0.0D, 0.0D, BlockTFFireflyJar.jarSide); - tessellator.draw(); - - // render lid thing - renderblocks.setRenderBounds(0.25F, 0.75F, 0.25F, 0.75F, 1.0F, 0.75F); - - tessellator.startDrawingQuads(); - tessellator.setNormal(0.0F, -1.0F, 0.0F); - renderblocks.renderFaceYNeg(par1Block, 0.0D, 0.0D, 0.0D, BlockTFFireflyJar.jarCork); - tessellator.draw(); - tessellator.startDrawingQuads(); - tessellator.setNormal(0.0F, 1.0F, 0.0F); - renderblocks.renderFaceYPos(par1Block, 0.0D, 0.0D, 0.0D, BlockTFFireflyJar.jarCork); - tessellator.draw(); - tessellator.startDrawingQuads(); - tessellator.setNormal(0.0F, 0.0F, -1.0F); - renderblocks.renderFaceXPos(par1Block, 0.0D, 0.0D, 0.0D, BlockTFFireflyJar.jarCork); - tessellator.draw(); - tessellator.startDrawingQuads(); - tessellator.setNormal(0.0F, 0.0F, 1.0F); - renderblocks.renderFaceXNeg(par1Block, 0.0D, 0.0D, 0.0D, BlockTFFireflyJar.jarCork); - tessellator.draw(); - tessellator.startDrawingQuads(); - tessellator.setNormal(-1.0F, 0.0F, 0.0F); - renderblocks.renderFaceZNeg(par1Block, 0.0D, 0.0D, 0.0D, BlockTFFireflyJar.jarCork); - tessellator.draw(); - tessellator.startDrawingQuads(); - tessellator.setNormal(1.0F, 0.0F, 0.0F); - renderblocks.renderFaceZPos(par1Block, 0.0D, 0.0D, 0.0D, BlockTFFireflyJar.jarCork); - tessellator.draw(); -// renderblocks.renderBottomFace(par1Block, 0.0D, 0.0D, 0.0D, sprLid); -// renderblocks.renderFaceYPos(par1Block, 0.0D, 0.0D, 0.0D, sprLid); -// renderblocks.renderFaceXPos(par1Block, 0.0D, 0.0D, 0.0D, sprLid); -// renderblocks.renderFaceXNeg(par1Block, 0.0D, 0.0D, 0.0D, sprLid); -// renderblocks.renderFaceZNeg(par1Block, 0.0D, 0.0D, 0.0D, sprLid); -// renderblocks.renderFaceZPos(par1Block, 0.0D, 0.0D, 0.0D, sprLid); - - GL11.glTranslatef(0.5F, 0.5F, 0.5F); - - par1Block.setBlockBoundsForItemRender(); - } - - -} diff --git a/src/main/java/twilightforest/client/renderer/blocks/RenderBlockTFGiantBlocks.java b/src/main/java/twilightforest/client/renderer/blocks/RenderBlockTFGiantBlocks.java deleted file mode 100644 index 222d62880a..0000000000 --- a/src/main/java/twilightforest/client/renderer/blocks/RenderBlockTFGiantBlocks.java +++ /dev/null @@ -1,36 +0,0 @@ -package twilightforest.client.renderer.blocks; - -import net.minecraft.block.Block; -import net.minecraft.client.renderer.RenderBlocks; -import net.minecraft.world.IBlockAccess; -import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; - -public class RenderBlockTFGiantBlocks implements ISimpleBlockRenderingHandler { - - @Override - public void renderInventoryBlock(Block block, int metadata, int modelId, - RenderBlocks renderer) { - // TODO Auto-generated method stub - - } - - @Override - public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, - Block block, int modelId, RenderBlocks renderer) { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean shouldRender3DInInventory(int modelId) { - // TODO Auto-generated method stub - return false; - } - - @Override - public int getRenderId() { - // TODO Auto-generated method stub - return 0; - } - -} diff --git a/src/main/java/twilightforest/client/renderer/blocks/RenderBlockTFHugeLilyPad.java b/src/main/java/twilightforest/client/renderer/blocks/RenderBlockTFHugeLilyPad.java deleted file mode 100644 index e281a04f52..0000000000 --- a/src/main/java/twilightforest/client/renderer/blocks/RenderBlockTFHugeLilyPad.java +++ /dev/null @@ -1,73 +0,0 @@ -package twilightforest.client.renderer.blocks; - -import net.minecraft.block.Block; -import net.minecraft.client.renderer.RenderBlocks; -import net.minecraft.client.renderer.Tessellator; -import net.minecraft.world.IBlockAccess; - -import org.lwjgl.opengl.GL11; - -import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; - -public class RenderBlockTFHugeLilyPad implements ISimpleBlockRenderingHandler { - - final int renderID; - - public RenderBlockTFHugeLilyPad(int blockComplexRenderID) { - this.renderID = blockComplexRenderID; - } - - @Override - public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) { - ; - } - - @Override - public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) { - // rotate the sides - int meta = world.getBlockMetadata(x, y, z); - - setRenderRotate(renderer, meta); - boolean didRender = renderer.renderStandardBlock(block, x, y, z); - restoreRendererRotate(renderer); - - return didRender; - - } - - private void restoreRendererRotate(RenderBlocks renderer) { - renderer.uvRotateSouth = 0; - renderer.uvRotateEast = 0; - renderer.uvRotateWest = 0; - renderer.uvRotateNorth = 0; - renderer.uvRotateTop = 0; - renderer.uvRotateBottom = 0; - } - - private void setRenderRotate(RenderBlocks renderer, int meta) { - int orient = meta >> 2; - - // why can't this just be simple? - if (orient == 2) { - orient = 3; - } else if (orient == 3) { - orient = 2; - } - - renderer.uvRotateTop = orient; - renderer.uvRotateBottom = orient; - - } - - @Override - public boolean shouldRender3DInInventory(int modelId) { - return false; - } - - @Override - public int getRenderId() { - return renderID; - } - - -} diff --git a/src/main/java/twilightforest/client/renderer/blocks/RenderBlockTFKnightMetal.java b/src/main/java/twilightforest/client/renderer/blocks/RenderBlockTFKnightMetal.java deleted file mode 100644 index a495e6433e..0000000000 --- a/src/main/java/twilightforest/client/renderer/blocks/RenderBlockTFKnightMetal.java +++ /dev/null @@ -1,126 +0,0 @@ -package twilightforest.client.renderer.blocks; - -import net.minecraft.block.Block; -import net.minecraft.client.renderer.RenderBlocks; -import net.minecraft.client.renderer.Tessellator; -import net.minecraft.world.IBlockAccess; - -import org.lwjgl.opengl.GL11; - -import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; - -public class RenderBlockTFKnightMetal implements ISimpleBlockRenderingHandler { - - final int renderID; - - public RenderBlockTFKnightMetal(int blockComplexRenderID) { - this.renderID = blockComplexRenderID; - } - - @Override - public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) { - renderInvJar(renderer, block, metadata); - - } - - @Override - public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) { - return renderSpikeBlock(renderer, world, x, y, z, block); - } - - @Override - public boolean shouldRender3DInInventory(int modelId) { - return true; - } - - @Override - public int getRenderId() { - return renderID; - } - - /** - * Look, this is no longer in the Block class! I'm an object oriented genius! - */ - public static boolean renderSpikeBlock(RenderBlocks renderblocks, IBlockAccess world, int x, int y, int z, Block block) { - float p = 1F / 16F; - float a = 1F / 1024F; - float p4 = 4F / 16F - a; - - for (int rx = 0; rx < 3; rx++) { - for (int ry = 0; ry < 3; ry++) { - for (int rz = 0; rz < 3; rz++) { - renderblocks.setRenderBounds(rx * 6F * p + a, ry * 6F * p + a, rz * 6F * p + a, rx * 6F * p + p4, ry * 6F * p + p4, rz * 6F * p + p4); - renderblocks.renderStandardBlock(block, x, y, z); - } - } - } - - // middle - renderblocks.setRenderBounds(p, p, p, 15 * p, 15 * p, 15 * p); - renderblocks.renderStandardBlock(block, x, y, z); - - - block.setBlockBoundsForItemRender(); - return true; - } - - public static void renderInvJar(RenderBlocks renderblocks, Block par1Block, int meta) { - Tessellator tessellator = Tessellator.instance; - - GL11.glTranslatef(-0.5F, -0.5F, -0.5F); - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - - // spikes - float p = 1F / 16F; - float a = 1F / 1024F; - float p4 = 4F / 16F - a; - - for (int rx = 0; rx < 3; rx++) { - for (int ry = 0; ry < 3; ry++) { - for (int rz = 0; rz < 3; rz++) { - renderblocks.setRenderBounds(rx * 6F * p + a, ry * 6F * p + a, rz * 6F * p + a, rx * 6F * p + p4, ry * 6F * p + p4, rz * 6F * p + p4); - renderInvBlock(renderblocks, par1Block, meta, tessellator); - - } - } - } - - // middle - renderblocks.setRenderBounds(p, p, p, 15 * p, 15 * p, 15 * p); - renderInvBlock(renderblocks, par1Block, meta, tessellator); - - - GL11.glTranslatef(0.5F, 0.5F, 0.5F); - - par1Block.setBlockBoundsForItemRender(); - } - - protected static void renderInvBlock(RenderBlocks renderblocks, Block par1Block, int meta, Tessellator tessellator) { - tessellator.startDrawingQuads(); - tessellator.setNormal(0.0F, -1.0F, 0.0F); - renderblocks.renderFaceYNeg(par1Block, 0.0D, 0.0D, 0.0D, par1Block.getIcon(0, meta)); - tessellator.draw(); - tessellator.startDrawingQuads(); - tessellator.setNormal(0.0F, 1.0F, 0.0F); - renderblocks.renderFaceYPos(par1Block, 0.0D, 0.0D, 0.0D, par1Block.getIcon(1, meta)); - tessellator.draw(); - tessellator.startDrawingQuads(); - tessellator.setNormal(0.0F, 0.0F, -1.0F); - renderblocks.renderFaceXPos(par1Block, 0.0D, 0.0D, 0.0D, par1Block.getIcon(2, meta)); - tessellator.draw(); - tessellator.startDrawingQuads(); - tessellator.setNormal(0.0F, 0.0F, 1.0F); - renderblocks.renderFaceXNeg(par1Block, 0.0D, 0.0D, 0.0D, par1Block.getIcon(3, meta)); - tessellator.draw(); - tessellator.startDrawingQuads(); - tessellator.setNormal(-1.0F, 0.0F, 0.0F); - renderblocks.renderFaceZNeg(par1Block, 0.0D, 0.0D, 0.0D, par1Block.getIcon(4, meta)); - tessellator.draw(); - tessellator.startDrawingQuads(); - tessellator.setNormal(1.0F, 0.0F, 0.0F); - renderblocks.renderFaceZPos(par1Block, 0.0D, 0.0D, 0.0D, par1Block.getIcon(5, meta)); - tessellator.draw(); - } - - -} diff --git a/src/main/java/twilightforest/client/renderer/blocks/RenderBlockTFMagicLeaves.java b/src/main/java/twilightforest/client/renderer/blocks/RenderBlockTFMagicLeaves.java deleted file mode 100644 index 40a8eec9f7..0000000000 --- a/src/main/java/twilightforest/client/renderer/blocks/RenderBlockTFMagicLeaves.java +++ /dev/null @@ -1,162 +0,0 @@ -package twilightforest.client.renderer.blocks; - -import net.minecraft.block.Block; -import net.minecraft.client.renderer.RenderBlocks; -import net.minecraft.client.renderer.Tessellator; -import net.minecraft.world.IBlockAccess; - -import org.lwjgl.opengl.GL11; - -import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; - -public class RenderBlockTFMagicLeaves implements ISimpleBlockRenderingHandler { - - final int renderID; - - public RenderBlockTFMagicLeaves(int myRenderID) { - this.renderID = myRenderID; - } - - @Override - public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) { - setRenderRotate(renderer, metadata); - renderInvNormalBlock(renderer, block, metadata); - restoreRendererRotate(renderer); - } - - @Override - public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) { - // rotate the sides - int meta = world.getBlockMetadata(x, y, z); - - setRenderRotate(renderer, meta, x, y, z); - boolean didRender = renderer.renderStandardBlock(block, x, y, z); - restoreRendererRotate(renderer); - - return didRender; - - } - - private void restoreRendererRotate(RenderBlocks renderer) { - renderer.uvRotateSouth = 0; - renderer.uvRotateEast = 0; - renderer.uvRotateWest = 0; - renderer.uvRotateNorth = 0; - renderer.uvRotateTop = 0; - renderer.uvRotateBottom = 0; - } - - private void setRenderRotate(RenderBlocks renderer, int meta) { - this.setRenderRotate(renderer, meta, 0, 0, 0); - } - - private void setRenderRotate(RenderBlocks renderer, int meta, int x, int y, int z) { - int type = meta & 3; - - if (type == 0) - { - renderer.uvRotateEast = 3; - renderer.uvRotateBottom = 0; - - renderer.uvRotateNorth = 2; - renderer.uvRotateSouth = 2; - } - else if (type == 1) - { - // bottom and top are semi-random - renderer.uvRotateBottom = (x + y + z) & 3; - renderer.uvRotateTop = (x + y + z) & 3; - - // sides flow down - renderer.uvRotateEast = 1; - renderer.uvRotateWest = 2; - - renderer.uvRotateNorth = 2; - renderer.uvRotateSouth = 1; - } - else if (type == 2) - { - // bottom and top are semi-random - renderer.uvRotateBottom = (x + y + z) & 3; - renderer.uvRotateTop = (x + y + z) & 3; - - // sides flow up - renderer.uvRotateEast = 2; - renderer.uvRotateWest = 1; - - renderer.uvRotateNorth = 1; - renderer.uvRotateSouth = 2; - } - else if (type == 3) - { - // all semi-random - renderer.uvRotateBottom = (x + y + z) & 3; - renderer.uvRotateTop = (x + y + z) & 3; - - renderer.uvRotateEast = (x + y + z) & 3;; - renderer.uvRotateWest = (x + y + z) & 3;; - - renderer.uvRotateNorth = (x + y + z) & 3;; - renderer.uvRotateSouth = (x + y + z) & 3;; - } - - - } - - @Override - public boolean shouldRender3DInInventory(int modelId) { - return true; - } - - @Override - public int getRenderId() { - return renderID; - } - - - public static void renderInvNormalBlock(RenderBlocks renderblocks, Block par1Block, int meta) { - Tessellator tessellator = Tessellator.instance; - - if (renderblocks.useInventoryTint) - { - int colorInt = par1Block.getRenderColor(meta); - - float red = (float)(colorInt >> 16 & 255) / 255.0F; - float green = (float)(colorInt >> 8 & 255) / 255.0F; - float blue = (float)(colorInt & 255) / 255.0F; - GL11.glColor4f(red, green, blue, 1.0F); - } - - GL11.glTranslatef(-0.5F, -0.5F, -0.5F); - - // block! - par1Block.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); - - tessellator.startDrawingQuads(); - tessellator.setNormal(0.0F, -1.0F, 0.0F); - renderblocks.renderFaceYNeg(par1Block, 0.0D, 0.0D, 0.0D, par1Block.getIcon(0, meta)); - tessellator.draw(); - tessellator.startDrawingQuads(); - tessellator.setNormal(0.0F, 1.0F, 0.0F); - renderblocks.renderFaceYPos(par1Block, 0.0D, 0.0D, 0.0D, par1Block.getIcon(1, meta)); - tessellator.draw(); - tessellator.startDrawingQuads(); - tessellator.setNormal(0.0F, 0.0F, -1.0F); - renderblocks.renderFaceXPos(par1Block, 0.0D, 0.0D, 0.0D, par1Block.getIcon(2, meta)); - tessellator.draw(); - tessellator.startDrawingQuads(); - tessellator.setNormal(0.0F, 0.0F, 1.0F); - renderblocks.renderFaceXNeg(par1Block, 0.0D, 0.0D, 0.0D, par1Block.getIcon(3, meta)); - tessellator.draw(); - tessellator.startDrawingQuads(); - tessellator.setNormal(-1.0F, 0.0F, 0.0F); - renderblocks.renderFaceZNeg(par1Block, 0.0D, 0.0D, 0.0D, par1Block.getIcon(4, meta)); - tessellator.draw(); - tessellator.startDrawingQuads(); - tessellator.setNormal(1.0F, 0.0F, 0.0F); - renderblocks.renderFaceZPos(par1Block, 0.0D, 0.0D, 0.0D, par1Block.getIcon(5, meta)); - tessellator.draw(); - } - - -} diff --git a/src/main/java/twilightforest/client/renderer/blocks/RenderBlockTFNagastone.java b/src/main/java/twilightforest/client/renderer/blocks/RenderBlockTFNagastone.java deleted file mode 100644 index 62ca291ea5..0000000000 --- a/src/main/java/twilightforest/client/renderer/blocks/RenderBlockTFNagastone.java +++ /dev/null @@ -1,172 +0,0 @@ -package twilightforest.client.renderer.blocks; - -import net.minecraft.block.Block; -import net.minecraft.client.renderer.RenderBlocks; -import net.minecraft.client.renderer.Tessellator; -import net.minecraft.world.IBlockAccess; - -import org.lwjgl.opengl.GL11; - -import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; - -public class RenderBlockTFNagastone implements ISimpleBlockRenderingHandler { - - final int renderID; - - public RenderBlockTFNagastone(int nagastoneRenderID) { - this.renderID = nagastoneRenderID; - } - - @Override - public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) { - setRenderRotate(renderer, metadata); - renderInvNormalBlock(renderer, block, metadata); - restoreRendererRotate(renderer); - } - - @Override - public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) { - // rotate the sides - int meta = world.getBlockMetadata(x, y, z); - - setRenderRotate(renderer, meta); - boolean didRender = renderer.renderStandardBlock(block, x, y, z); - restoreRendererRotate(renderer); - - return didRender; - - } - - private void restoreRendererRotate(RenderBlocks renderer) { - renderer.uvRotateSouth = 0; - renderer.uvRotateEast = 0; - renderer.uvRotateWest = 0; - renderer.uvRotateNorth = 0; - renderer.uvRotateTop = 0; - renderer.uvRotateBottom = 0; - } - - private void setRenderRotate(RenderBlocks renderer, int meta) { - int type = meta & 12; - int orient = meta & 3; - - // heads - if (type == 0) - { - switch (orient) - { - case 0: - renderer.uvRotateTop = 1; - renderer.uvRotateBottom = 2; - break; - case 1: - renderer.uvRotateTop = 2; - renderer.uvRotateBottom = 1; - renderer.uvRotateSouth = 0; - break; - case 2: - renderer.uvRotateTop = 0; - renderer.uvRotateBottom = 3; - break; - case 3: - renderer.uvRotateTop = 3; - renderer.uvRotateBottom = 0; - break; - } - } - else if (type == 4 || type == 8) - { - switch (orient) - { - case 0: - renderer.uvRotateTop = 2; - renderer.uvRotateBottom = 1; - renderer.uvRotateWest = 2; - break; - case 1: - renderer.uvRotateTop = 1; - renderer.uvRotateBottom = 2; - renderer.uvRotateEast = 2; - break; - case 2: - renderer.uvRotateTop = 3; - renderer.uvRotateBottom = 0; - renderer.uvRotateSouth = 2; - break; - case 3: - renderer.uvRotateTop = 0; - renderer.uvRotateBottom = 3; - renderer.uvRotateNorth = 2; - break; - } - } - else if (type == 12) - { - switch (orient) - { - case 0: - renderer.uvRotateTop = 0; - renderer.uvRotateBottom = 0; - break; - case 1: - renderer.uvRotateTop = 1; - renderer.uvRotateBottom = 1; - break; - case 2: - renderer.uvRotateNorth = 2; - renderer.uvRotateSouth = 2; - renderer.uvRotateEast = 2; - renderer.uvRotateWest = 2; - break; - } - } - } - - @Override - public boolean shouldRender3DInInventory(int modelId) { - return true; - } - - @Override - public int getRenderId() { - return renderID; - } - - - public static void renderInvNormalBlock(RenderBlocks renderblocks, Block par1Block, int meta) { - Tessellator tessellator = Tessellator.instance; - - GL11.glTranslatef(-0.5F, -0.5F, -0.5F); - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - - // render jar portion - par1Block.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); - - tessellator.startDrawingQuads(); - tessellator.setNormal(0.0F, -1.0F, 0.0F); - renderblocks.renderFaceYNeg(par1Block, 0.0D, 0.0D, 0.0D, par1Block.getIcon(0, meta)); - tessellator.draw(); - tessellator.startDrawingQuads(); - tessellator.setNormal(0.0F, 1.0F, 0.0F); - renderblocks.renderFaceYPos(par1Block, 0.0D, 0.0D, 0.0D, par1Block.getIcon(1, meta)); - tessellator.draw(); - tessellator.startDrawingQuads(); - tessellator.setNormal(0.0F, 0.0F, -1.0F); - renderblocks.renderFaceXPos(par1Block, 0.0D, 0.0D, 0.0D, par1Block.getIcon(2, meta)); - tessellator.draw(); - tessellator.startDrawingQuads(); - tessellator.setNormal(0.0F, 0.0F, 1.0F); - renderblocks.renderFaceXNeg(par1Block, 0.0D, 0.0D, 0.0D, par1Block.getIcon(3, meta)); - tessellator.draw(); - tessellator.startDrawingQuads(); - tessellator.setNormal(-1.0F, 0.0F, 0.0F); - renderblocks.renderFaceZNeg(par1Block, 0.0D, 0.0D, 0.0D, par1Block.getIcon(4, meta)); - tessellator.draw(); - tessellator.startDrawingQuads(); - tessellator.setNormal(1.0F, 0.0F, 0.0F); - renderblocks.renderFaceZPos(par1Block, 0.0D, 0.0D, 0.0D, par1Block.getIcon(5, meta)); - tessellator.draw(); - } - - -} diff --git a/src/main/java/twilightforest/client/renderer/blocks/RenderBlockTFPedestal.java b/src/main/java/twilightforest/client/renderer/blocks/RenderBlockTFPedestal.java deleted file mode 100644 index 181cc27b80..0000000000 --- a/src/main/java/twilightforest/client/renderer/blocks/RenderBlockTFPedestal.java +++ /dev/null @@ -1,112 +0,0 @@ -package twilightforest.client.renderer.blocks; - -import net.minecraft.block.Block; -import net.minecraft.client.renderer.RenderBlocks; -import net.minecraft.client.renderer.Tessellator; -import net.minecraft.world.IBlockAccess; - -import org.lwjgl.opengl.GL11; - -import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; - -public class RenderBlockTFPedestal implements ISimpleBlockRenderingHandler { - - final int renderID; - - public RenderBlockTFPedestal(int blockComplexRenderID) { - this.renderID = blockComplexRenderID; - } - - @Override - public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) { - renderInvJar(renderer, block, metadata); - - } - - @Override - public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) { - return renderPedestal(renderer, world, x, y, z, block); - } - - @Override - public boolean shouldRender3DInInventory(int modelId) { - return true; - } - - @Override - public int getRenderId() { - return renderID; - } - - /** - * Look, this is no longer in the Block class! I'm an object oriented genius! - */ - public static boolean renderPedestal(RenderBlocks renderblocks, IBlockAccess world, int x, int y, int z, Block block) { - // top - renderblocks.setRenderBounds(0.0625F, 0.0F, 0.0625F, 0.9375F, 0.1875F, 0.9375F); - renderblocks.renderStandardBlock(block, x, y, z); - - // middle - renderblocks.setRenderBounds(0.125, 0.1875F, 0.125, 0.875F, 0.8125F, 0.875F); - renderblocks.renderStandardBlock(block, x, y, z); - - // bottom - renderblocks.setRenderBounds(0.0625F, 0.8125F, 0.0625F, 0.9375F, 1.0F, 0.9375F); - renderblocks.renderStandardBlock(block, x, y, z); - - block.setBlockBoundsForItemRender(); - return true; - } - - public static void renderInvJar(RenderBlocks renderblocks, Block par1Block, int meta) { - Tessellator tessellator = Tessellator.instance; - - GL11.glTranslatef(-0.5F, -0.5F, -0.5F); - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - - // top - renderblocks.setRenderBounds(0.0625F, 0.0F, 0.0625F, 0.9375F, 0.1875F, 0.9375F); - renderInvBlock(renderblocks, par1Block, meta, tessellator); - - // middle - renderblocks.setRenderBounds(0.125, 0.1875F, 0.125, 0.875F, 0.8125F, 0.875F); - renderInvBlock(renderblocks, par1Block, meta, tessellator); - - // bottom - renderblocks.setRenderBounds(0.0625F, 0.8125F, 0.0625F, 0.9375F, 1.0F, 0.9375F); - renderInvBlock(renderblocks, par1Block, meta, tessellator); - - GL11.glTranslatef(0.5F, 0.5F, 0.5F); - - par1Block.setBlockBoundsForItemRender(); - } - - protected static void renderInvBlock(RenderBlocks renderblocks, Block par1Block, int meta, Tessellator tessellator) { - tessellator.startDrawingQuads(); - tessellator.setNormal(0.0F, -1.0F, 0.0F); - renderblocks.renderFaceYNeg(par1Block, 0.0D, 0.0D, 0.0D, par1Block.getIcon(0, meta)); - tessellator.draw(); - tessellator.startDrawingQuads(); - tessellator.setNormal(0.0F, 1.0F, 0.0F); - renderblocks.renderFaceYPos(par1Block, 0.0D, 0.0D, 0.0D, par1Block.getIcon(1, meta)); - tessellator.draw(); - tessellator.startDrawingQuads(); - tessellator.setNormal(0.0F, 0.0F, -1.0F); - renderblocks.renderFaceXPos(par1Block, 0.0D, 0.0D, 0.0D, par1Block.getIcon(2, meta)); - tessellator.draw(); - tessellator.startDrawingQuads(); - tessellator.setNormal(0.0F, 0.0F, 1.0F); - renderblocks.renderFaceXNeg(par1Block, 0.0D, 0.0D, 0.0D, par1Block.getIcon(3, meta)); - tessellator.draw(); - tessellator.startDrawingQuads(); - tessellator.setNormal(-1.0F, 0.0F, 0.0F); - renderblocks.renderFaceZNeg(par1Block, 0.0D, 0.0D, 0.0D, par1Block.getIcon(4, meta)); - tessellator.draw(); - tessellator.startDrawingQuads(); - tessellator.setNormal(1.0F, 0.0F, 0.0F); - renderblocks.renderFaceZPos(par1Block, 0.0D, 0.0D, 0.0D, par1Block.getIcon(5, meta)); - tessellator.draw(); - } - - -} diff --git a/src/main/java/twilightforest/client/renderer/blocks/RenderBlockTFPlants.java b/src/main/java/twilightforest/client/renderer/blocks/RenderBlockTFPlants.java deleted file mode 100644 index 0bdcc320fa..0000000000 --- a/src/main/java/twilightforest/client/renderer/blocks/RenderBlockTFPlants.java +++ /dev/null @@ -1,205 +0,0 @@ -package twilightforest.client.renderer.blocks; - -import net.minecraft.block.Block; -import net.minecraft.client.renderer.RenderBlocks; -import net.minecraft.world.IBlockAccess; -import twilightforest.block.BlockTFPlant; -import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; - -public class RenderBlockTFPlants implements ISimpleBlockRenderingHandler { - - final int renderID; - - public RenderBlockTFPlants(int blockRenderID) { - this.renderID = blockRenderID; - } - - @Override - public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) { - // TODO Auto-generated method stub - - } - - @Override - public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) { - int meta = world.getBlockMetadata(x, y, z); - if (meta == BlockTFPlant.META_MOSSPATCH) { - renderMossPatch(x, y, z, block, renderer); - - } - else if (meta == BlockTFPlant.META_CLOVERPATCH) { - renderCloverPatch(x, y, z, block, renderer); - - } - else if (meta == BlockTFPlant.META_MAYAPPLE) { - renderMayapple(x, y, z, block, renderer); - } - else if (meta == BlockTFPlant.META_ROOT_STRAND) { - renderer.renderBlockCrops(block, x, y, z); - } - else - { - renderer.renderCrossedSquares(block, x, y, z); - } - - return true; - } - - private void renderMayapple(int x, int y, int z, Block block, - RenderBlocks renderer) { - renderer.clearOverrideBlockTexture(); - renderer.setRenderBounds(4F / 16F, 6F / 16F, 4F / 16F, 13F / 16F, 6F / 16F, 13F / 16F); - renderer.renderStandardBlock(block, x, y, z); - - renderer.overrideBlockTexture = BlockTFPlant.mayappleSide; - renderer.setRenderBounds(8F / 16F, 0F, 8F / 16F, 9F / 16F, 5.99F / 16F, 9F / 16F); - renderer.renderStandardBlock(block, x, y, z); - renderer.clearOverrideBlockTexture(); - } - - private void renderCloverPatch(int x, int y, int z, Block block, - RenderBlocks renderer) { - renderer.renderMinY = renderer.renderMaxY; - renderer.renderStandardBlock(block, x, y, z); - - renderer.renderMinY = 0F; - renderer.renderMaxY -= 0.01F; - - renderer.renderMinX += 1F / 16F; - renderer.renderMinZ += 1F / 16F; - renderer.renderMaxX -= 1F / 16F; - renderer.renderMaxZ -= 1F / 16F; - renderer.renderStandardBlock(block, x, y, z); - } - - private void renderMossPatch(int x, int y, int z, Block block, - RenderBlocks renderer) { - renderer.renderStandardBlock(block, x, y, z); - - // add on shaggy edges - if (renderer.renderMinX > 0) - { - double originalMaxZ = renderer.renderMaxZ; - - long seed = (long)(x * 3129871) ^ (long)y * 116129781L ^ (long)z; - seed = seed * seed * 42317861L + seed * 7L; - - int num0 = (int) (seed >> 12 & 3L) + 1; - int num1 = (int) (seed >> 15 & 3L) + 1; - int num2 = (int) (seed >> 18 & 3L) + 1; - int num3 = (int) (seed >> 21 & 3L) + 1; - - renderer.renderMaxX = renderer.renderMinX; - renderer.renderMinX -= 1F / 16F; - renderer.renderMinZ += num0 / 16F; - if (renderer.renderMaxZ - ((num1 +num2 + num3) / 16F) > renderer.renderMinZ) - { - // draw two blobs - renderer.renderMaxZ = renderer.renderMinZ + num1 / 16F; - renderer.renderStandardBlock(block, x, y, z); - renderer.renderMaxZ = originalMaxZ - num2 / 16F; - renderer.renderMinZ = renderer.renderMaxZ - num3 / 16F; - renderer.renderStandardBlock(block, x, y, z); - } - else - { - //draw one blob - renderer.renderMaxZ -= num2 / 16F; - renderer.renderStandardBlock(block, x, y, z); - } - - // reset render bounds - renderer.setRenderBoundsFromBlock(block); - } - if (renderer.renderMaxX < 1F) - { - double originalMaxZ = renderer.renderMaxZ; - - long seed = (long)(x * 3129871) ^ (long)y * 116129781L ^ (long)z; - seed = seed * seed * 42317861L + seed * 17L; - - int num0 = (int) (seed >> 12 & 3L) + 1; - int num1 = (int) (seed >> 15 & 3L) + 1; - int num2 = (int) (seed >> 18 & 3L) + 1; - int num3 = (int) (seed >> 21 & 3L) + 1; - - renderer.renderMinX = renderer.renderMaxX; - renderer.renderMaxX += 1F / 16F; - renderer.renderMinZ += num0 / 16F; - if (renderer.renderMaxZ - ((num1 +num2 + num3) / 16F) > renderer.renderMinZ) - { - // draw two blobs - renderer.renderMaxZ = renderer.renderMinZ + num1 / 16F; - renderer.renderStandardBlock(block, x, y, z); - renderer.renderMaxZ = originalMaxZ - num2 / 16F; - renderer.renderMinZ = renderer.renderMaxZ - num3 / 16F; - renderer.renderStandardBlock(block, x, y, z); - } - else - { - //draw one blob - renderer.renderMaxZ -= num2 / 16F; - renderer.renderStandardBlock(block, x, y, z); - } - // reset render bounds - renderer.setRenderBoundsFromBlock(block); - } - if (renderer.renderMinZ > 0) - { - double originalMaxX = renderer.renderMaxX; - - long seed = (long)(x * 3129871) ^ (long)y * 116129781L ^ (long)z; - seed = seed * seed * 42317861L + seed * 23L; - - int num0 = (int) (seed >> 12 & 3L) + 1; - int num1 = (int) (seed >> 15 & 3L) + 1; - int num2 = (int) (seed >> 18 & 3L) + 1; - int num3 = (int) (seed >> 21 & 3L) + 1; - - renderer.renderMaxZ = renderer.renderMinZ; - renderer.renderMinZ -= 1F / 16F; - renderer.renderMinX += num0 / 16F; - renderer.renderMaxX = renderer.renderMinX + num1 / 16F; - renderer.renderStandardBlock(block, x, y, z); - renderer.renderMaxX = originalMaxX - num2 / 16F; - renderer.renderMinX = renderer.renderMaxX - num3 / 16F; - renderer.renderStandardBlock(block, x, y, z); - // reset render bounds - renderer.setRenderBoundsFromBlock(block); - } - if (renderer.renderMaxZ < 1F) - { - double originalMaxX = renderer.renderMaxX; - - long seed = (long)(x * 3129871) ^ (long)y * 116129781L ^ (long)z; - seed = seed * seed * 42317861L + seed * 11L; - - int num0 = (int) (seed >> 12 & 3L) + 1; - int num1 = (int) (seed >> 15 & 3L) + 1; - int num2 = (int) (seed >> 18 & 3L) + 1; - int num3 = (int) (seed >> 21 & 3L) + 1; - - renderer.renderMinZ = renderer.renderMaxZ; - renderer.renderMaxZ += 1F / 16F; - renderer.renderMinX += num0 / 16F; - renderer.renderMaxX = renderer.renderMinX + num1 / 16F; - renderer.renderStandardBlock(block, x, y, z); - renderer.renderMaxX = originalMaxX - num2 / 16F; - renderer.renderMinX = renderer.renderMaxX - num3 / 16F; - renderer.renderStandardBlock(block, x, y, z); - // reset render bounds - renderer.setRenderBoundsFromBlock(block); - } - } - - @Override - public boolean shouldRender3DInInventory(int modelId) { - return false; - } - - @Override - public int getRenderId() { - return renderID; - } - -} diff --git a/src/main/java/twilightforest/client/renderer/blocks/RenderBlockTFThorns.java b/src/main/java/twilightforest/client/renderer/blocks/RenderBlockTFThorns.java deleted file mode 100644 index 406687e87e..0000000000 --- a/src/main/java/twilightforest/client/renderer/blocks/RenderBlockTFThorns.java +++ /dev/null @@ -1,434 +0,0 @@ -package twilightforest.client.renderer.blocks; - -import net.minecraft.block.Block; -import net.minecraft.client.renderer.RenderBlocks; -import net.minecraft.client.renderer.Tessellator; -import net.minecraft.util.IIcon; -import net.minecraft.world.IBlockAccess; - -import org.lwjgl.opengl.GL11; - -import twilightforest.block.TFBlocks; -import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; - -public class RenderBlockTFThorns implements ISimpleBlockRenderingHandler { - - final int renderID; - - public RenderBlockTFThorns(int blockComplexRenderID) { - this.renderID = blockComplexRenderID; - } - - @Override - public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) { - renderInvBlock(renderer, block, metadata); - - } - - @Override - public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) { - int l = block.colorMultiplier(world, x, y, z); - float f = (float)(l >> 16 & 255) / 255.0F; - float f1 = (float)(l >> 8 & 255) / 255.0F; - float f2 = (float)(l & 255) / 255.0F; - - int metadata = world.getBlockMetadata(x, y, z); - int type = metadata & 12; - - switch (type) { - case 0: - default: - return this.renderCactusLikeY(block, x, y, z, f, f1, f2, metadata, world, renderer); - case 4: - return this.renderCactusLikeX(block, x, y, z, f, f1, f2, metadata, world, renderer); - case 8: - return this.renderCactusLikeZ(block, x, y, z, f, f1, f2, metadata, world, renderer); - } - - - } - - @Override - public boolean shouldRender3DInInventory(int modelId) { - return true; - } - - @Override - public int getRenderId() { - return renderID; - } - - /** - * Render block cactus implementation - * @param metadata - */ - public boolean renderCactusLikeX(Block block, int x, int y, int z, float red, float green, float blue, int metadata, IBlockAccess world, RenderBlocks renderer) - { - setUVRotationX(renderer); - - Tessellator tessellator = Tessellator.instance; - float middle = 0.5F; - float full = 1.0F; - float f5 = 0.8F; - float f6 = 0.6F; - float bRed = middle * red; - float tRed = full * red; - float zRed = f5 * red; - float xRed = f6 * red; - float bGreen = middle * green; - float tGreen = full * green; - float zGreen = f5 * green; - float xGreen = f6 * green; - float bBlue = middle * blue; - float tBlue = full * blue; - float zBlue = f5 * blue; - float xBlue = f6 * blue; - float onePixel = 0.0625F * 3F; - int blockBrightness = block.getMixedBrightnessForBlock(renderer.blockAccess, x, y, z); - - if (renderer.renderAllFaces || block.shouldSideBeRendered(renderer.blockAccess, x - 1, y, z, 4)) - { - tessellator.setBrightness(renderer.renderMinX > 0.0D ? blockBrightness : block.getMixedBrightnessForBlock(renderer.blockAccess, x - 1, y, z)); - tessellator.setColorOpaque_F(bRed, bGreen, bBlue); - renderer.renderFaceXNeg(block, (double)x, (double)y, (double)z, renderer.getBlockIcon(block, renderer.blockAccess, x, y, z, 4)); - } - - if (renderer.renderAllFaces || block.shouldSideBeRendered(renderer.blockAccess, x + 1, y, z, 5)) - { - tessellator.setBrightness(renderer.renderMaxX < 1.0D ? blockBrightness : block.getMixedBrightnessForBlock(renderer.blockAccess, x + 1, y, z)); - tessellator.setColorOpaque_F(tRed, tGreen, tBlue); - renderer.renderFaceXPos(block, (double)x, (double)y, (double)z, renderer.getBlockIcon(block, renderer.blockAccess, x, y, z, 5)); - } - - drawXSides(block, x, y, z, renderer, metadata, zRed, xRed, zGreen, xGreen, zBlue, xBlue, onePixel, blockBrightness); - - resetUVRotation(renderer); - - - if (canConnectTo(world, x, y, z + 1)) { - setUVRotationZ(renderer); - renderer.setRenderBounds(0F, 0F, 1F - onePixel, 1F, 1F, 1F); - drawZSides(block, x, y, z, renderer, metadata, zRed, xRed, zGreen, xGreen, zBlue, xBlue, 0.063F * 3F, blockBrightness); - resetUVRotation(renderer); - } - - if (canConnectTo(world, x, y, z - 1)) { - setUVRotationZ(renderer); - renderer.setRenderBounds(0F, 0F, 0F, 1F, 1F, onePixel); - drawZSides(block, x, y, z, renderer, metadata, zRed, xRed, zGreen, xGreen, zBlue, xBlue, 0.063F * 3F, blockBrightness); - resetUVRotation(renderer); - } - - if (canConnectTo(world, x, y + 1, z)) { - resetUVRotation(renderer); - renderer.setRenderBounds(0F, 1F - onePixel, 0F, 1F, 1F, 1F); - drawYSides(block, x, y, z, renderer, metadata, zRed, xRed, zGreen, xGreen, zBlue, xBlue, 0.063F * 3F, blockBrightness); - } - - if (canConnectTo(world, x, y - 1, z)) { - resetUVRotation(renderer); - renderer.setRenderBounds(0F, 0F, 0F, 1F, onePixel, 1F); - drawYSides(block, x, y, z, renderer, metadata, zRed, xRed, zGreen, xGreen, zBlue, xBlue, 0.063F * 3F, blockBrightness); - } - - - return true; - } - - /** - * Render block cactus implementation - * @param metadata - */ - public boolean renderCactusLikeY(Block block, int x, int y, int z, float red, float green, float blue, int metadata, IBlockAccess world, RenderBlocks renderer) - { - Tessellator tessellator = Tessellator.instance; - float middle = 0.5F; - float full = 1.0F; - float f5 = 0.8F; - float f6 = 0.6F; - float bRed = middle * red; - float tRed = full * red; - float zRed = f5 * red; - float xRed = f6 * red; - float bGreen = middle * green; - float tGreen = full * green; - float zGreen = f5 * green; - float xGreen = f6 * green; - float bBlue = middle * blue; - float tBlue = full * blue; - float zBlue = f5 * blue; - float xBlue = f6 * blue; - float onePixel = 0.0625F * 3F; - int blockBrightness = block.getMixedBrightnessForBlock(world, x, y, z); - - if (renderer.renderAllFaces || block.shouldSideBeRendered(world, x, y - 1, z, 0)) - { - tessellator.setBrightness(renderer.renderMinY > 0.0D ? blockBrightness : block.getMixedBrightnessForBlock(world, x, y - 1, z)); - tessellator.setColorOpaque_F(bRed, bGreen, bBlue); - renderer.renderFaceYNeg(block, (double)x, (double)y, (double)z, renderer.getBlockIcon(block, world, x, y, z, 0)); - } - - if (renderer.renderAllFaces || block.shouldSideBeRendered(world, x, y + 1, z, 1)) - { - tessellator.setBrightness(renderer.renderMaxY < 1.0D ? blockBrightness : block.getMixedBrightnessForBlock(world, x, y + 1, z)); - tessellator.setColorOpaque_F(tRed, tGreen, tBlue); - renderer.renderFaceYPos(block, (double)x, (double)y, (double)z, renderer.getBlockIcon(block, world, x, y, z, 1)); - } - - drawYSides(block, x, y, z, renderer, metadata, zRed, xRed, zGreen, xGreen, zBlue, xBlue, onePixel, blockBrightness); - - if (canConnectTo(world, x + 1, y, z)) { - setUVRotationX(renderer); - renderer.setRenderBounds(1F - onePixel, 0F, 0F, 1F, 1F, 1F); - drawXSides(block, x, y, z, renderer, metadata, zRed, xRed, zGreen, xGreen, zBlue, xBlue, 0.063F * 3F, blockBrightness); - resetUVRotation(renderer); - } - - if (canConnectTo(world, x - 1, y, z)) { - setUVRotationX(renderer); - renderer.setRenderBounds(0F, 0F, 0F, onePixel, 1F, 1F); - drawXSides(block, x, y, z, renderer, metadata, zRed, xRed, zGreen, xGreen, zBlue, xBlue, 0.063F * 3F, blockBrightness); - resetUVRotation(renderer); - } - - if (canConnectTo(world, x, y, z + 1)) { - setUVRotationZ(renderer); - renderer.setRenderBounds(0F, 0F, 1F - onePixel, 1F, 1F, 1F); - drawZSides(block, x, y, z, renderer, metadata, zRed, xRed, zGreen, xGreen, zBlue, xBlue, 0.063F * 3F, blockBrightness); - resetUVRotation(renderer); - } - - if (canConnectTo(world, x, y, z - 1)) { - setUVRotationZ(renderer); - renderer.setRenderBounds(0F, 0F, 0F, 1F, 1F, onePixel); - drawZSides(block, x, y, z, renderer, metadata, zRed, xRed, zGreen, xGreen, zBlue, xBlue, 0.063F * 3F, blockBrightness); - resetUVRotation(renderer); - } - - - return true; - } - - /** - * Render block cactus implementation - * @param metadata - */ - public boolean renderCactusLikeZ(Block block, int x, int y, int z, float red, float green, float blue, int metadata, IBlockAccess world, RenderBlocks renderer) - { - setUVRotationZ(renderer); - - Tessellator tessellator = Tessellator.instance; - float middle = 0.5F; - float full = 1.0F; - float f5 = 0.8F; - float f6 = 0.6F; - float bRed = middle * red; - float tRed = full * red; - float zRed = f5 * red; - float xRed = f6 * red; - float bGreen = middle * green; - float tGreen = full * green; - float zGreen = f5 * green; - float xGreen = f6 * green; - float bBlue = middle * blue; - float tBlue = full * blue; - float zBlue = f5 * blue; - float xBlue = f6 * blue; - float onePixel = 0.0625F * 3F; - int blockBrightness = block.getMixedBrightnessForBlock(renderer.blockAccess, x, y, z); - - if (renderer.renderAllFaces || block.shouldSideBeRendered(renderer.blockAccess, x, y, z - 1, 0)) - { - tessellator.setBrightness(renderer.renderMinZ > 0.0D ? blockBrightness : block.getMixedBrightnessForBlock(renderer.blockAccess, x, y, z - 1)); - tessellator.setColorOpaque_F(bRed, bGreen, bBlue); - renderer.renderFaceZNeg(block, (double)x, (double)y, (double)z, renderer.getBlockIcon(block, renderer.blockAccess, x, y, z, 2)); - } - - if (renderer.renderAllFaces || block.shouldSideBeRendered(renderer.blockAccess, x, y, z + 1, 1)) - { - tessellator.setBrightness(renderer.renderMaxZ < 1.0D ? blockBrightness : block.getMixedBrightnessForBlock(renderer.blockAccess, x, y, z + 1)); - tessellator.setColorOpaque_F(tRed, tGreen, tBlue); - renderer.renderFaceZPos(block, (double)x, (double)y, (double)z, renderer.getBlockIcon(block, renderer.blockAccess, x, y, z, 3)); - } - - drawZSides(block, x, y, z, renderer, metadata, zRed, xRed, zGreen, xGreen, zBlue, xBlue, onePixel, blockBrightness); - - resetUVRotation(renderer); - - if (canConnectTo(world, x + 1, y, z)) { - setUVRotationX(renderer); - renderer.setRenderBounds(1F - onePixel, 0F, 0F, 1F, 1F, 1F); - drawXSides(block, x, y, z, renderer, metadata, zRed, xRed, zGreen, xGreen, zBlue, xBlue, 0.063F * 3F, blockBrightness); - resetUVRotation(renderer); - } - - if (canConnectTo(world, x - 1, y, z)) { - setUVRotationX(renderer); - renderer.setRenderBounds(0F, 0F, 0F, onePixel, 1F, 1F); - drawXSides(block, x, y, z, renderer, metadata, zRed, xRed, zGreen, xGreen, zBlue, xBlue, 0.063F * 3F, blockBrightness); - resetUVRotation(renderer); - } - - if (canConnectTo(world, x, y + 1, z)) { - resetUVRotation(renderer); - renderer.setRenderBounds(0F, 1F - onePixel, 0F, 1F, 1F, 1F); - drawYSides(block, x, y, z, renderer, metadata, zRed, xRed, zGreen, xGreen, zBlue, xBlue, 0.063F * 3F, blockBrightness); - } - - if (canConnectTo(world, x, y - 1, z)) { - resetUVRotation(renderer); - renderer.setRenderBounds(0F, 0F, 0F, 1F, onePixel, 1F); - drawYSides(block, x, y, z, renderer, metadata, zRed, xRed, zGreen, xGreen, zBlue, xBlue, 0.063F * 3F, blockBrightness); - } - - return true; - } - - private void drawXSides(Block block, int x, int y, int z, RenderBlocks renderer, int metadata, float zRed, - float xRed, float zGreen, float xGreen, float zBlue, float xBlue, float onePixel, int l) { - Tessellator tessellator = Tessellator.instance; - - tessellator.setBrightness(l); - tessellator.setColorOpaque_F(zRed, zGreen, zBlue); - tessellator.addTranslation(0.0F, 0.0F, onePixel); - renderer.renderFaceZNeg(block, (double)x, (double)y, (double)z, getSideIcon(block, metadata)); - tessellator.addTranslation(0.0F, 0.0F, -onePixel); - tessellator.addTranslation(0.0F, 0.0F, -onePixel); - renderer.renderFaceZPos(block, (double)x, (double)y, (double)z, getSideIcon(block, metadata)); - tessellator.addTranslation(0.0F, 0.0F, onePixel); - tessellator.setColorOpaque_F(xRed, xGreen, xBlue); - tessellator.addTranslation(0.0F, onePixel, 0.0F); - renderer.renderFaceYNeg(block, (double)x, (double)y, (double)z, getSideIcon(block, metadata)); - tessellator.addTranslation(0.0F, -onePixel, 0.0F); - tessellator.addTranslation(0.0F, -onePixel, 0.0F); - renderer.renderFaceYPos(block, (double)x, (double)y, (double)z, getSideIcon(block, metadata)); - tessellator.addTranslation(0.0F, onePixel, 0.0F); - } - - private void drawYSides(Block block, int x, int y, int z, RenderBlocks renderer, int metadata, - float zRed, float xRed, float zGreen, float xGreen, float zBlue, float xBlue, float onePixel, int blockBrightness) { - Tessellator tessellator = Tessellator.instance; - - tessellator.setBrightness(blockBrightness); - tessellator.setColorOpaque_F(zRed, zGreen, zBlue); - tessellator.addTranslation(0.0F, 0.0F, onePixel); - renderer.renderFaceZNeg(block, (double)x, (double)y, (double)z, getSideIcon(block, metadata)); - tessellator.addTranslation(0.0F, 0.0F, -onePixel); - tessellator.addTranslation(0.0F, 0.0F, -onePixel); - renderer.renderFaceZPos(block, (double)x, (double)y, (double)z, getSideIcon(block, metadata)); - tessellator.addTranslation(0.0F, 0.0F, onePixel); - tessellator.setColorOpaque_F(xRed, xGreen, xBlue); - tessellator.addTranslation(onePixel, 0.0F, 0.0F); - renderer.renderFaceXNeg(block, (double)x, (double)y, (double)z, getSideIcon(block, metadata)); - tessellator.addTranslation(-onePixel, 0.0F, 0.0F); - tessellator.addTranslation(-onePixel, 0.0F, 0.0F); - renderer.renderFaceXPos(block, (double)x, (double)y, (double)z, getSideIcon(block, metadata)); - tessellator.addTranslation(onePixel, 0.0F, 0.0F); - } - - private void drawZSides(Block block, int x, int y, int z, RenderBlocks renderer, int metadata, - float zRed, float xRed, float zGreen, float xGreen, float zBlue, float xBlue, float onePixel, int blockBrightness) { - Tessellator tessellator = Tessellator.instance; - - tessellator.setBrightness(blockBrightness); - tessellator.setColorOpaque_F(xRed, xGreen, xBlue); - tessellator.addTranslation(onePixel, 0.0F, 0.0F); - renderer.renderFaceXNeg(block, (double)x, (double)y, (double)z, getSideIcon(block, metadata)); - tessellator.addTranslation(-onePixel, 0.0F, 0.0F); - tessellator.addTranslation(-onePixel, 0.0F, 0.0F); - renderer.renderFaceXPos(block, (double)x, (double)y, (double)z, getSideIcon(block, metadata)); - tessellator.addTranslation(onePixel, 0.0F, 0.0F); - tessellator.setColorOpaque_F(zRed, zGreen, zBlue); - tessellator.addTranslation(0.0F, onePixel, 0.0F); - renderer.renderFaceYNeg(block, (double)x, (double)y, (double)z, getSideIcon(block, metadata)); - tessellator.addTranslation(0.0F, -onePixel, 0.0F); - tessellator.addTranslation(0.0F, -onePixel, 0.0F); - renderer.renderFaceYPos(block, (double)x, (double)y, (double)z, getSideIcon(block, metadata)); - tessellator.addTranslation(0.0F, onePixel, 0.0F); - } - - private boolean canConnectTo(IBlockAccess world, int x, int y, int z) { - Block block = world.getBlock(x, y, z); - return block == TFBlocks.thorns || block == TFBlocks.burntThorns || block == TFBlocks.thornRose; - } - - private void setUVRotationX(RenderBlocks renderer) { - renderer.uvRotateEast = 1; - renderer.uvRotateWest = 1; - renderer.uvRotateTop = 1; - renderer.uvRotateBottom = 1; - } - - private void setUVRotationZ(RenderBlocks renderer) { - renderer.uvRotateSouth = 1; - renderer.uvRotateNorth = 1; - } - - private void resetUVRotation(RenderBlocks renderer) { - renderer.uvRotateTop = 0; - renderer.uvRotateBottom = 0; - renderer.uvRotateEast = 0; - renderer.uvRotateWest = 0; - renderer.uvRotateNorth = 0; - renderer.uvRotateSouth = 0; - } - - private IIcon getSideIcon(Block block, int metadata) { - return block.getIcon(2, metadata & 3); - } - - public static void renderInvBlock(RenderBlocks renderblocks, Block par1Block, int meta) { - Tessellator tessellator = Tessellator.instance; - - GL11.glTranslatef(-0.5F, -0.5F, -0.5F); - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - -// // top -// renderblocks.setRenderBounds(0.0625F, 0.0F, 0.0625F, 0.9375F, 0.1875F, 0.9375F); -// renderInvBlock(renderblocks, par1Block, meta, tessellator); -// -// // middle -// renderblocks.setRenderBounds(0.125, 0.1875F, 0.125, 0.875F, 0.8125F, 0.875F); -// renderInvBlock(renderblocks, par1Block, meta, tessellator); -// -// // bottom -// renderblocks.setRenderBounds(0.0625F, 0.8125F, 0.0625F, 0.9375F, 1.0F, 0.9375F); - renderInvBlock(renderblocks, par1Block, meta, tessellator); - - GL11.glTranslatef(0.5F, 0.5F, 0.5F); - - par1Block.setBlockBoundsForItemRender(); - } - - protected static void renderInvBlock(RenderBlocks renderblocks, Block par1Block, int meta, Tessellator tessellator) { - float onePixel = 0.0625F * 3F; - - - tessellator.startDrawingQuads(); - tessellator.setNormal(0.0F, -1.0F, 0.0F); - renderblocks.renderFaceYNeg(par1Block, 0.0D, 0.0D, 0.0D, par1Block.getIcon(0, meta)); - tessellator.draw(); - tessellator.startDrawingQuads(); - tessellator.setNormal(0.0F, 1.0F, 0.0F); - renderblocks.renderFaceYPos(par1Block, 0.0D, 0.0D, 0.0D, par1Block.getIcon(1, meta)); - tessellator.draw(); - tessellator.startDrawingQuads(); - tessellator.setNormal(0.0F, 0.0F, -1.0F); - renderblocks.renderFaceXPos(par1Block, -onePixel, 0.0D, 0.0D, par1Block.getIcon(2, meta)); - tessellator.draw(); - tessellator.startDrawingQuads(); - tessellator.setNormal(0.0F, 0.0F, 1.0F); - renderblocks.renderFaceXNeg(par1Block, onePixel, 0.0D, 0.0D, par1Block.getIcon(3, meta)); - tessellator.draw(); - tessellator.startDrawingQuads(); - tessellator.setNormal(-1.0F, 0.0F, 0.0F); - renderblocks.renderFaceZNeg(par1Block, 0.0D, 0.0D, onePixel, par1Block.getIcon(4, meta)); - tessellator.draw(); - tessellator.startDrawingQuads(); - tessellator.setNormal(1.0F, 0.0F, 0.0F); - renderblocks.renderFaceZPos(par1Block, 0.0D, 0.0D, -onePixel, par1Block.getIcon(5, meta)); - tessellator.draw(); - } - - -} diff --git a/src/main/java/twilightforest/client/renderer/entity/AdherentRenderer.java b/src/main/java/twilightforest/client/renderer/entity/AdherentRenderer.java new file mode 100644 index 0000000000..842d575227 --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/entity/AdherentRenderer.java @@ -0,0 +1,20 @@ +package twilightforest.client.renderer.entity; + +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.util.Mth; +import twilightforest.client.model.TFModelLayers; +import twilightforest.client.model.entity.AdherentModel; +import twilightforest.entity.monster.Adherent; + +public class AdherentRenderer extends TFBipedRenderer { + public AdherentRenderer(EntityRendererProvider.Context manager) { + super(manager, new AdherentModel(manager.bakeLayer(TFModelLayers.ADHERENT)), 0.625F, "adherent.png"); + } + + @Override + protected void scale(Adherent e, PoseStack ms, float partialTicks) { + float bounce = e.tickCount + partialTicks; + ms.translate(0F, -0.125F - Mth.sin((bounce) * 0.133F) * 0.1F, 0F); + } +} diff --git a/src/main/java/twilightforest/client/renderer/entity/BighornRenderer.java b/src/main/java/twilightforest/client/renderer/entity/BighornRenderer.java new file mode 100644 index 0000000000..b20f0da8af --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/entity/BighornRenderer.java @@ -0,0 +1,28 @@ +package twilightforest.client.renderer.entity; + +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.entity.SheepRenderer; +import net.minecraft.client.renderer.entity.layers.SheepFurLayer; +import net.minecraft.client.model.EntityModel; +import net.minecraft.client.model.SheepModel; +import net.minecraft.world.entity.animal.Sheep; +import net.minecraft.resources.ResourceLocation; +import twilightforest.TwilightForestMod; + +public class BighornRenderer extends SheepRenderer { + + private static final ResourceLocation textureLoc = TwilightForestMod.getModelTexture("bighorn.png"); + + @SuppressWarnings("unchecked") + public BighornRenderer(EntityRendererProvider.Context manager, SheepModel baseModel, EntityModel coatModel, float shadowSize) { + super(manager); + this.shadowRadius = shadowSize; + this.model = (SheepModel) baseModel; + this.addLayer(new SheepFurLayer(this, manager.getModelSet())); + } + + @Override + public ResourceLocation getTextureLocation(Sheep ent) { + return textureLoc; + } +} diff --git a/src/main/java/twilightforest/client/renderer/entity/BirdRenderer.java b/src/main/java/twilightforest/client/renderer/entity/BirdRenderer.java new file mode 100644 index 0000000000..65c9fa794f --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/entity/BirdRenderer.java @@ -0,0 +1,34 @@ +package twilightforest.client.renderer.entity; + +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.entity.MobRenderer; +import net.minecraft.client.model.EntityModel; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import twilightforest.TwilightForestMod; +import twilightforest.entity.passive.Bird; + +public class BirdRenderer> extends MobRenderer { + + private final ResourceLocation textureLoc; + + public BirdRenderer(EntityRendererProvider.Context manager, M model, float shadowSize, String textureName) { + super(manager, model, shadowSize); + textureLoc = TwilightForestMod.getModelTexture(textureName); + } + + /** + * Defines what float the third param in setRotationAngles of ModelBase is + */ + @Override + protected float getBob(T living, float time) { + float var3 = living.lastFlapLength + (living.flapLength - living.lastFlapLength) * time; + float var4 = living.lastFlapIntensity + (living.flapIntensity - living.lastFlapIntensity) * time; + return (Mth.sin(var3) + 1.0F) * var4; + } + + @Override + public ResourceLocation getTextureLocation(T entity) { + return textureLoc; + } +} diff --git a/src/main/java/twilightforest/client/renderer/entity/BlockChainGoblinRenderer.java b/src/main/java/twilightforest/client/renderer/entity/BlockChainGoblinRenderer.java new file mode 100644 index 0000000000..787dfb2a0b --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/entity/BlockChainGoblinRenderer.java @@ -0,0 +1,106 @@ +package twilightforest.client.renderer.entity; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.math.Axis; +import org.joml.Vector3f; +import net.minecraft.client.Minecraft; +import net.minecraft.client.model.Model; +import net.minecraft.client.renderer.LevelRenderer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.culling.Frustum; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.entity.HumanoidMobRenderer; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.Vec3; +import twilightforest.TwilightForestMod; +import twilightforest.client.model.TFModelLayers; +import twilightforest.client.model.entity.BlockChainGoblinModel; +import twilightforest.client.model.entity.ChainModel; +import twilightforest.client.model.entity.SpikeBlockModel; +import twilightforest.entity.monster.BlockChainGoblin; + +public class BlockChainGoblinRenderer> extends HumanoidMobRenderer { + + private static final ResourceLocation textureLoc = TwilightForestMod.getModelTexture("blockgoblin.png"); + + private final Model model; + private final Model chainModel; + + public BlockChainGoblinRenderer(EntityRendererProvider.Context manager, M goblinModel, float shadowSize) { + super(manager, goblinModel, shadowSize); + model = new SpikeBlockModel(manager.bakeLayer(TFModelLayers.CHAIN_BLOCK)); + chainModel = new ChainModel(manager.bakeLayer(TFModelLayers.CHAIN)); + } + + @Override + public void render(T goblin, float yaw, float partialTicks, PoseStack stack, MultiBufferSource buffer, int light) { + super.render(goblin, yaw, partialTicks, stack, buffer, light); + + stack.pushPose(); + + double blockInX = (goblin.block.getX() - goblin.getX()); + double blockInY = (goblin.block.getY() - goblin.getY()); + double blockInZ = (goblin.block.getZ() - goblin.getZ()); + + VertexConsumer ivertexbuilder = buffer.getBuffer(this.model.renderType(textureLoc)); + stack.translate(blockInX, blockInY, blockInZ); + + float pitch = goblin.xRotO + (goblin.getXRot() - goblin.xRotO) * partialTicks; + stack.mulPose(Axis.YP.rotationDegrees(180 - Mth.wrapDegrees(yaw))); + stack.mulPose(Axis.XP.rotationDegrees(pitch)); + + stack.scale(-1.0F, -1.0F, 1.0F); + this.model.renderToBuffer(stack, ivertexbuilder, light, OverlayTexture.NO_OVERLAY, 1.0F, 1.0F, 1.0F, 1.0F); + stack.popPose(); + + if (goblin.isAlive()) { + BlockChainRenderer.renderChain(goblin, goblin.chain1, yaw, partialTicks, stack, buffer, light, chainModel); + BlockChainRenderer.renderChain(goblin, goblin.chain2, yaw, partialTicks, stack, buffer, light, chainModel); + BlockChainRenderer.renderChain(goblin, goblin.chain3, yaw, partialTicks, stack, buffer, light, chainModel); + } + //when you allowed debugBoundingBox, you can see Hitbox + if (this.entityRenderDispatcher.shouldRenderHitBoxes() && !goblin.block.isInvisible() && !Minecraft.getInstance().showOnlyReducedInfo()) { + stack.pushPose(); + stack.translate(blockInX, blockInY, blockInZ); + this.renderMultiBoundingBox(stack, buffer.getBuffer(RenderType.lines()), goblin.block, 0.25F, 1.0F, 0.0F); + stack.popPose(); + } + + } + + private void renderMultiBoundingBox(PoseStack stack, VertexConsumer builder, Entity entity, float red, float grean, float blue) { + AABB axisalignedbb = entity.getBoundingBox().move(-entity.getX(), -entity.getY(), -entity.getZ()); + LevelRenderer.renderLineBox(stack, builder, axisalignedbb, red, grean, blue, 1.0F); + } + + @Override + public boolean shouldRender(T entity, Frustum clippingHelper, double camX, double camY, double camZ) { + if (super.shouldRender(entity, clippingHelper, camX, camY, camZ)) { + return true; + } else { + + Vec3 vec3d = this.getPosition(entity.block, entity.block.getBbHeight() * 0.5D, 1.0F); + Vec3 vec3d1 = this.getPosition(entity.block, entity.block.getEyeHeight(), 1.0F); + return clippingHelper.isVisible(new AABB(vec3d1.x, vec3d1.y, vec3d1.z, vec3d.x, vec3d.y, vec3d.z)); + } + } + + private Vec3 getPosition(Entity entity, double p_177110_2_, float p_177110_4_) { + // [VanillaCopy] From GuardianRenderer + double d0 = Mth.lerp(p_177110_4_, entity.xOld, entity.getX()); + double d1 = Mth.lerp(p_177110_4_, entity.yOld, entity.getY()) + p_177110_2_; + double d2 = Mth.lerp(p_177110_4_, entity.zOld, entity.getZ()); + return new Vec3(d0, d1, d2); + } + + @Override + public ResourceLocation getTextureLocation(T entity) { + return textureLoc; + } +} diff --git a/src/main/java/twilightforest/client/renderer/entity/BlockChainRenderer.java b/src/main/java/twilightforest/client/renderer/entity/BlockChainRenderer.java new file mode 100644 index 0000000000..322075f559 --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/entity/BlockChainRenderer.java @@ -0,0 +1,90 @@ +package twilightforest.client.renderer.entity; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.math.Axis; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.LevelRenderer; +import net.minecraft.client.renderer.entity.EntityRenderer; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.model.Model; +import net.minecraft.client.renderer.entity.ItemRenderer; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.world.entity.Entity; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.phys.AABB; +import net.minecraft.util.Mth; +import org.joml.Vector3f; +import twilightforest.TwilightForestMod; +import twilightforest.client.model.TFModelLayers; +import twilightforest.client.model.entity.ChainModel; +import twilightforest.client.model.entity.SpikeBlockModel; +import twilightforest.entity.ChainBlock; + +public class BlockChainRenderer extends EntityRenderer { + + private static final ResourceLocation textureLoc = TwilightForestMod.getModelTexture("blockgoblin.png"); + private final Model model; + private final Model chainModel; + + public BlockChainRenderer(EntityRendererProvider.Context manager) { + super(manager); + model = new SpikeBlockModel(manager.bakeLayer(TFModelLayers.CHAIN_BLOCK)); + chainModel = new ChainModel(manager.bakeLayer(TFModelLayers.CHAIN)); + } + + @Override + public void render(ChainBlock chainBlock, float yaw, float partialTicks, PoseStack stack, MultiBufferSource buffer, int light) { + super.render(chainBlock, yaw, partialTicks, stack, buffer, light); + + stack.pushPose(); + VertexConsumer ivertexbuilder = ItemRenderer.getFoilBufferDirect(buffer, this.model.renderType(textureLoc), false, chainBlock.isFoil()); + + float pitch = chainBlock.xRotO + (chainBlock.getXRot() - chainBlock.xRotO) * partialTicks; + stack.mulPose(Axis.YP.rotationDegrees(180 - Mth.wrapDegrees(yaw))); + stack.mulPose(Axis.XP.rotationDegrees(pitch)); + + stack.scale(-1.0F, -1.0F, 1.0F); + this.model.renderToBuffer(stack, ivertexbuilder, light, OverlayTexture.NO_OVERLAY, 1.0F, 1.0F, 1.0F, 1.0F); + stack.popPose(); + + renderChain(chainBlock, chainBlock.chain1, yaw, partialTicks, stack, buffer, light, chainModel); + renderChain(chainBlock, chainBlock.chain2, yaw, partialTicks, stack, buffer, light, chainModel); + renderChain(chainBlock, chainBlock.chain3, yaw, partialTicks, stack, buffer, light, chainModel); + renderChain(chainBlock, chainBlock.chain4, yaw, partialTicks, stack, buffer, light, chainModel); + renderChain(chainBlock, chainBlock.chain5, yaw, partialTicks, stack, buffer, light, chainModel); + } + + public static void renderChain(Entity parent, Entity chain, float yaw, float partialTicks, PoseStack stack, MultiBufferSource buffer, int light, Model chainModel) { + double chainInX = (Mth.lerp(partialTicks, chain.xOld, chain.getX()) - Mth.lerp(partialTicks, parent.xOld, parent.getX())); + double chainInY = (Mth.lerp(partialTicks, chain.yOld, chain.getY()) - Mth.lerp(partialTicks, parent.yOld, parent.getY())); + double chainInZ = (Mth.lerp(partialTicks, chain.zOld, chain.getZ()) - Mth.lerp(partialTicks, parent.zOld, parent.getZ())); + + stack.pushPose(); + VertexConsumer vertexConsumer; + if(parent instanceof ChainBlock blocc) { + vertexConsumer = ItemRenderer.getFoilBufferDirect(buffer, chainModel.renderType(textureLoc), false, blocc.isFoil()); + } else { + vertexConsumer = buffer.getBuffer(chainModel.renderType(textureLoc)); + } + + stack.translate(chainInX, chainInY, chainInZ); + float pitch = chain.xRotO + (chain.getXRot() - chain.xRotO) * partialTicks; + stack.mulPose(Axis.YP.rotationDegrees(180 - Mth.wrapDegrees(yaw))); + stack.mulPose(Axis.XP.rotationDegrees(pitch)); + + stack.scale(-1.0F, -1.0F, 1.0F); + chainModel.renderToBuffer(stack, vertexConsumer, light, OverlayTexture.NO_OVERLAY, 1.0F, 1.0F, 1.0F, 1.0F); + stack.popPose(); + } + + private void renderMultiBoundingBox(PoseStack stack, VertexConsumer builder, Entity entity, float red, float grean, float blue) { + AABB axisalignedbb = entity.getBoundingBox().move(-entity.getX(), -entity.getY(), -entity.getZ()); + LevelRenderer.renderLineBox(stack, builder, axisalignedbb, red, grean, blue, 1.0F); + } + + @Override + public ResourceLocation getTextureLocation(ChainBlock entity) { + return textureLoc; + } +} diff --git a/src/main/java/twilightforest/client/renderer/entity/BoarRenderer.java b/src/main/java/twilightforest/client/renderer/entity/BoarRenderer.java new file mode 100644 index 0000000000..2ffbde7786 --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/entity/BoarRenderer.java @@ -0,0 +1,23 @@ +package twilightforest.client.renderer.entity; + +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.entity.MobRenderer; +import net.minecraft.resources.ResourceLocation; +import twilightforest.TwilightForestMod; +import twilightforest.client.model.entity.BoarModel; +import twilightforest.entity.passive.Boar; + +//old renderer used to use PigModel, had to change it because of the texture size change +public class BoarRenderer extends MobRenderer> { + + private static final ResourceLocation textureLoc = TwilightForestMod.getModelTexture("wildboar.png"); + + public BoarRenderer(EntityRendererProvider.Context manager, BoarModel model) { + super(manager, model, 0.7F); + } + + @Override + public ResourceLocation getTextureLocation(Boar entity) { + return textureLoc; + } +} diff --git a/src/main/java/twilightforest/client/renderer/entity/BunnyRenderer.java b/src/main/java/twilightforest/client/renderer/entity/BunnyRenderer.java new file mode 100644 index 0000000000..6589660c3e --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/entity/BunnyRenderer.java @@ -0,0 +1,20 @@ +package twilightforest.client.renderer.entity; + +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.entity.MobRenderer; +import net.minecraft.resources.ResourceLocation; +import twilightforest.TwilightForestMod; +import twilightforest.client.model.entity.BunnyModel; +import twilightforest.entity.passive.DwarfRabbit; + +public class BunnyRenderer extends MobRenderer { + + public BunnyRenderer(EntityRendererProvider.Context manager, BunnyModel model, float shadowSize) { + super(manager, model, shadowSize); + } + + @Override + public ResourceLocation getTextureLocation(DwarfRabbit entity) { + return entity.getBunnyType().texture(); + } +} diff --git a/src/main/java/twilightforest/client/renderer/entity/CarminiteBroodlingRenderer.java b/src/main/java/twilightforest/client/renderer/entity/CarminiteBroodlingRenderer.java new file mode 100644 index 0000000000..12eb1fde01 --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/entity/CarminiteBroodlingRenderer.java @@ -0,0 +1,28 @@ +package twilightforest.client.renderer.entity; + +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.entity.SpiderRenderer; +import net.minecraft.resources.ResourceLocation; +import twilightforest.TwilightForestMod; +import twilightforest.entity.monster.TowerBroodling; + +public class CarminiteBroodlingRenderer extends SpiderRenderer { + + private static final ResourceLocation textureLoc = TwilightForestMod.getModelTexture("towerbroodling.png"); + + public CarminiteBroodlingRenderer(EntityRendererProvider.Context manager) { + super(manager); + } + + @Override + public ResourceLocation getTextureLocation(T entity) { + return textureLoc; + } + + @Override + protected void scale(T entity, PoseStack stack, float partialTicks) { + float scale = 0.7F; + stack.scale(scale, scale, scale); + } +} diff --git a/src/main/java/twilightforest/client/renderer/entity/CarminiteGhastRenderer.java b/src/main/java/twilightforest/client/renderer/entity/CarminiteGhastRenderer.java new file mode 100644 index 0000000000..222ae45019 --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/entity/CarminiteGhastRenderer.java @@ -0,0 +1,38 @@ +package twilightforest.client.renderer.entity; + +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import twilightforest.client.model.entity.TFGhastModel; +import twilightforest.entity.monster.CarminiteGhastguard; + +/** + * This is a copy of the RenderGhast class that changes the model + */ +public class CarminiteGhastRenderer> extends TFGhastRenderer { + + private float ghastScale = 8.0F; + + public CarminiteGhastRenderer(EntityRendererProvider.Context renderManager, M modelTFGhast, float f) { + super(renderManager, modelTFGhast, f); + } + + public CarminiteGhastRenderer(EntityRendererProvider.Context renderManager, M modelTFGhast, float f, float scale) { + super(renderManager, modelTFGhast, f); + this.ghastScale = scale; + } + + @Override + protected void scale(T ghast, PoseStack stack, float partialTicks) { + int attackTimer = ghast.getAttackTimer(); + int prevAttackTimer = ghast.getPrevAttackTimer(); + float scaleVariable = (prevAttackTimer + (attackTimer - prevAttackTimer) * partialTicks) / 20.0F; + if (scaleVariable < 0.0F) { + scaleVariable = 0.0F; + } + + scaleVariable = 1.0F / (scaleVariable * scaleVariable * scaleVariable * scaleVariable * scaleVariable * 2.0F + 1.0F); + float yScale = (ghastScale + scaleVariable) / 2.0F; + float xzScale = (ghastScale + 1.0F / scaleVariable) / 2.0F; + stack.scale(xzScale, yScale, xzScale); + } +} diff --git a/src/main/java/twilightforest/client/renderer/entity/CarminiteGolemRenderer.java b/src/main/java/twilightforest/client/renderer/entity/CarminiteGolemRenderer.java new file mode 100644 index 0000000000..ff4118894d --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/entity/CarminiteGolemRenderer.java @@ -0,0 +1,40 @@ +package twilightforest.client.renderer.entity; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Axis; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.entity.MobRenderer; +import net.minecraft.resources.ResourceLocation; +import org.joml.Vector3f; +import twilightforest.TwilightForestMod; +import twilightforest.client.model.entity.CarminiteGolemModel; +import twilightforest.entity.monster.CarminiteGolem; + +public class CarminiteGolemRenderer> extends MobRenderer { + + private static final ResourceLocation textureLoc = TwilightForestMod.getModelTexture("carminitegolem.png"); + + public CarminiteGolemRenderer(EntityRendererProvider.Context manager, M model, float shadowSize) { + super(manager, model, shadowSize); + } + + /** + * [VanillaCopy] {@link net.minecraft.client.renderer.entity.IronGolemRenderer} + */ + @Override + protected void setupRotations(T entity, PoseStack ms, float ageInTicks, float rotationYaw, float partialTicks) { + super.setupRotations(entity, ms, ageInTicks, rotationYaw, partialTicks); + + if (!(entity.walkAnimation.speed() < 0.01D)) { + float f = 13.0F; + float f1 = entity.walkAnimation.position() - entity.walkAnimation.speed() * (1.0F - partialTicks) + 6.0F; + float f2 = (Math.abs(f1 % 13.0F - 6.5F) - 3.25F) / 3.25F; + ms.mulPose(Axis.ZP.rotationDegrees(6.5F * f2)); + } + } + + @Override + public ResourceLocation getTextureLocation(T entity) { + return textureLoc; + } +} diff --git a/src/main/java/twilightforest/client/renderer/entity/CubeOfAnnihilationRenderer.java b/src/main/java/twilightforest/client/renderer/entity/CubeOfAnnihilationRenderer.java new file mode 100644 index 0000000000..04a87518a6 --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/entity/CubeOfAnnihilationRenderer.java @@ -0,0 +1,46 @@ +package twilightforest.client.renderer.entity; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Axis; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.model.Model; +import net.minecraft.client.renderer.entity.EntityRenderer; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import org.joml.Vector3f; +import twilightforest.TwilightForestMod; +import twilightforest.client.model.TFModelLayers; +import twilightforest.client.model.entity.CubeOfAnnihilationModel; +import twilightforest.entity.CubeOfAnnihilation; + +public class CubeOfAnnihilationRenderer extends EntityRenderer { + + private static final ResourceLocation textureLoc = TwilightForestMod.getModelTexture("cubeofannihilation.png"); + private final Model model; + + public CubeOfAnnihilationRenderer(EntityRendererProvider.Context manager) { + super(manager); + model = new CubeOfAnnihilationModel(manager.bakeLayer(TFModelLayers.CUBE_OF_ANNIHILATION)); + } + + @Override + public void render(CubeOfAnnihilation entity, float yaw, float partialTicks, PoseStack stack, MultiBufferSource buffer, int light) { + super.render(entity, yaw, partialTicks, stack, buffer, light); + + stack.pushPose(); + + stack.scale(-1.0F, -1.0F, 1.0F); + stack.mulPose(Axis.YP.rotationDegrees(Mth.wrapDegrees((entity.tickCount + partialTicks) * 11F))); + stack.translate(0F, -0.5F, 0F); + model.renderToBuffer(stack, buffer.getBuffer(model.renderType(textureLoc)), light, OverlayTexture.NO_OVERLAY, 1, 1, 1, 1); + + stack.popPose(); + } + + @Override + public ResourceLocation getTextureLocation(CubeOfAnnihilation entity) { + return textureLoc; + } +} diff --git a/src/main/java/twilightforest/client/renderer/entity/CustomProjectileTextureRenderer.java b/src/main/java/twilightforest/client/renderer/entity/CustomProjectileTextureRenderer.java new file mode 100644 index 0000000000..f20963e4d3 --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/entity/CustomProjectileTextureRenderer.java @@ -0,0 +1,57 @@ +package twilightforest.client.renderer.entity; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.math.Axis; +import org.joml.Matrix3f; +import org.joml.Matrix4f; +import org.joml.Vector3f; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.EntityRenderer; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import twilightforest.entity.projectile.TFThrowable; + +/** + * This renderer serves as a way to render item textures on a projectile without needing an actual item registered for it. + * Consider using {@link net.minecraft.client.renderer.entity.ThrownItemRenderer} if your projectile is an existing item already. + */ +public class CustomProjectileTextureRenderer extends EntityRenderer { + + private final ResourceLocation TEXTURE; + + public CustomProjectileTextureRenderer(EntityRendererProvider.Context ctx, ResourceLocation texture) { + super(ctx); + this.TEXTURE = texture; + } + + //[VanillaCopy] of DragonFireballRender.render, we just input our own texture stuff instead + @Override + public void render(TFThrowable entity, float entityYaw, float partialTicks, PoseStack ms, MultiBufferSource buffer, int light) { + ms.pushPose(); + ms.scale(0.5F, 0.5F, 0.5F); + ms.mulPose(this.entityRenderDispatcher.cameraOrientation()); + ms.mulPose(Axis.YP.rotationDegrees(180.0F)); + PoseStack.Pose posestack$pose = ms.last(); + Matrix4f matrix4f = posestack$pose.pose(); + Matrix3f matrix3f = posestack$pose.normal(); + VertexConsumer vertexconsumer = buffer.getBuffer(RenderType.entityCutoutNoCull(TEXTURE)); + vertex(vertexconsumer, matrix4f, matrix3f, light, 0.0F, 0, 0, 1); + vertex(vertexconsumer, matrix4f, matrix3f, light, 1.0F, 0, 1, 1); + vertex(vertexconsumer, matrix4f, matrix3f, light, 1.0F, 1, 1, 0); + vertex(vertexconsumer, matrix4f, matrix3f, light, 0.0F, 1, 0, 0); + ms.popPose(); + super.render(entity, entityYaw, partialTicks, ms, buffer, light); + } + + private static void vertex(VertexConsumer p_114090_, Matrix4f p_114091_, Matrix3f p_114092_, int p_114093_, float p_114094_, int p_114095_, int p_114096_, int p_114097_) { + p_114090_.vertex(p_114091_, p_114094_ - 0.5F, (float)p_114095_ - 0.25F, 0.0F).color(255, 255, 255, 255).uv((float)p_114096_, (float)p_114097_).overlayCoords(OverlayTexture.NO_OVERLAY).uv2(p_114093_).normal(p_114092_, 0.0F, 1.0F, 0.0F).endVertex(); + } + + @Override + public ResourceLocation getTextureLocation(TFThrowable entity) { + return TEXTURE; + } +} diff --git a/src/main/java/twilightforest/client/renderer/entity/DefaultArrowRenderer.java b/src/main/java/twilightforest/client/renderer/entity/DefaultArrowRenderer.java new file mode 100644 index 0000000000..3cfa9dcfc6 --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/entity/DefaultArrowRenderer.java @@ -0,0 +1,19 @@ +package twilightforest.client.renderer.entity; + +import net.minecraft.client.renderer.entity.ArrowRenderer; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.world.entity.projectile.AbstractArrow; +import net.minecraft.resources.ResourceLocation; + +public class DefaultArrowRenderer extends ArrowRenderer { + public static final ResourceLocation RES_ARROW = new ResourceLocation("textures/entity/projectiles/arrow.png"); + + public DefaultArrowRenderer(EntityRendererProvider.Context manager) { + super(manager); + } + + @Override + public ResourceLocation getTextureLocation(T entity) { + return RES_ARROW; + } +} diff --git a/src/main/java/twilightforest/client/renderer/entity/FallingIceRenderer.java b/src/main/java/twilightforest/client/renderer/entity/FallingIceRenderer.java new file mode 100644 index 0000000000..3409bb61ff --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/entity/FallingIceRenderer.java @@ -0,0 +1,52 @@ +package twilightforest.client.renderer.entity; + +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.block.BlockRenderDispatcher; +import net.minecraft.client.renderer.entity.EntityRenderer; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.core.BlockPos; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.RandomSource; +import net.minecraft.world.inventory.InventoryMenu; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.RenderShape; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.client.model.data.ModelData; +import twilightforest.entity.projectile.FallingIce; + +public class FallingIceRenderer extends EntityRenderer { + public FallingIceRenderer(EntityRendererProvider.Context renderManagerIn) { + super(renderManagerIn); + this.shadowRadius = 0.5F; + } + + /** + * [VanillaCopy] {@link net.minecraft.client.renderer.entity.FallingBlockRenderer} + */ + @Override + public void render(FallingIce entity, float entityYaw, float partialTicks, PoseStack stack, MultiBufferSource buffer, int light) { + BlockState blockstate = entity.getBlockState(); + if (blockstate.getRenderShape() == RenderShape.MODEL) { + Level world = entity.getLevel(); + if (blockstate != world.getBlockState(entity.blockPosition()) && blockstate.getRenderShape() != RenderShape.INVISIBLE) { + stack.pushPose(); + BlockPos blockpos = BlockPos.containing(entity.getX(), entity.getBoundingBox().maxY, entity.getZ()); + stack.translate(-0.5D, 0.0D, -0.5D); + BlockRenderDispatcher dispatcher = Minecraft.getInstance().getBlockRenderer(); + var model = dispatcher.getBlockModel(blockstate); + for (var renderType : model.getRenderTypes(blockstate, RandomSource.create(blockstate.getSeed(entity.blockPosition())), ModelData.EMPTY)) + dispatcher.getModelRenderer().tesselateBlock(world, model, blockstate, blockpos, stack, buffer.getBuffer(renderType), false, RandomSource.create(), blockstate.getSeed(entity.blockPosition()), OverlayTexture.NO_OVERLAY, ModelData.EMPTY, renderType); + stack.popPose(); + super.render(entity, entityYaw, partialTicks, stack, buffer, light); + } + } + } + + @Override + public ResourceLocation getTextureLocation(FallingIce entity) { + return InventoryMenu.BLOCK_ATLAS; + } +} diff --git a/src/main/java/twilightforest/client/renderer/entity/HarbingerCubeRenderer.java b/src/main/java/twilightforest/client/renderer/entity/HarbingerCubeRenderer.java new file mode 100644 index 0000000000..05fa25c8aa --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/entity/HarbingerCubeRenderer.java @@ -0,0 +1,30 @@ +package twilightforest.client.renderer.entity; + +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.entity.MobRenderer; +import net.minecraft.resources.ResourceLocation; +import twilightforest.TwilightForestMod; +import twilightforest.client.model.TFModelLayers; +import twilightforest.client.model.entity.HarbingerCubeModel; +import twilightforest.entity.monster.HarbingerCube; + +public class HarbingerCubeRenderer extends MobRenderer> { + + private static final ResourceLocation textureLoc = TwilightForestMod.getModelTexture("apocalypse2.png"); + + public HarbingerCubeRenderer(EntityRendererProvider.Context manager) { + super(manager, new HarbingerCubeModel<>(manager.bakeLayer(TFModelLayers.HARBINGER_CUBE)), 1.0F); + } + + @Override + public ResourceLocation getTextureLocation(HarbingerCube entity) { + return textureLoc; + } + + @Override + protected void scale(T entity, PoseStack stack, float partialTicks) { + float scale = 1.0F; + stack.scale(scale, scale, scale); + } +} diff --git a/src/main/java/twilightforest/client/renderer/entity/HedgeSpiderRenderer.java b/src/main/java/twilightforest/client/renderer/entity/HedgeSpiderRenderer.java new file mode 100644 index 0000000000..cd88225baa --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/entity/HedgeSpiderRenderer.java @@ -0,0 +1,21 @@ +package twilightforest.client.renderer.entity; + +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.entity.SpiderRenderer; +import net.minecraft.resources.ResourceLocation; +import twilightforest.TwilightForestMod; +import twilightforest.entity.monster.HedgeSpider; + +public class HedgeSpiderRenderer extends SpiderRenderer { + + private static final ResourceLocation textureLoc = TwilightForestMod.getModelTexture("hedgespider.png"); + + public HedgeSpiderRenderer(EntityRendererProvider.Context manager) { + super(manager); + } + + @Override + public ResourceLocation getTextureLocation(T entity) { + return textureLoc; + } +} diff --git a/src/main/java/twilightforest/client/renderer/entity/HostileWolfRenderer.java b/src/main/java/twilightforest/client/renderer/entity/HostileWolfRenderer.java new file mode 100644 index 0000000000..2d32112939 --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/entity/HostileWolfRenderer.java @@ -0,0 +1,27 @@ +package twilightforest.client.renderer.entity; + +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.entity.MobRenderer; +import net.minecraft.resources.ResourceLocation; +import twilightforest.client.model.TFModelLayers; +import twilightforest.client.model.entity.HostileWolfModel; +import twilightforest.entity.monster.HostileWolf; + +public class HostileWolfRenderer extends MobRenderer> { + private static final ResourceLocation WOLF_LOCATION = new ResourceLocation("textures/entity/wolf/wolf.png"); + private static final ResourceLocation WOLF_ANGRY_LOCATION = new ResourceLocation("textures/entity/wolf/wolf_angry.png"); + + public HostileWolfRenderer(EntityRendererProvider.Context p_174452_) { + super(p_174452_, new HostileWolfModel<>(p_174452_.bakeLayer(TFModelLayers.HOSTILE_WOLF)), 0.5F); + } + + @Override + protected float getBob(HostileWolf p_116528_, float p_116529_) { + return p_116528_.getTailAngle(); + } + + @Override + public ResourceLocation getTextureLocation(HostileWolf wolf) { + return wolf.isAggressive() ? WOLF_ANGRY_LOCATION : WOLF_LOCATION; + } +} diff --git a/src/main/java/twilightforest/client/renderer/entity/HydraHeadRenderer.java b/src/main/java/twilightforest/client/renderer/entity/HydraHeadRenderer.java new file mode 100644 index 0000000000..efa104ddcc --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/entity/HydraHeadRenderer.java @@ -0,0 +1,62 @@ +package twilightforest.client.renderer.entity; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Axis; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.resources.ResourceLocation; +import org.joml.Vector3f; +import twilightforest.TwilightForestMod; +import twilightforest.client.model.TFModelLayers; +import twilightforest.client.model.entity.HydraHeadModel; +import twilightforest.entity.boss.Hydra; +import twilightforest.entity.boss.HydraHead; +import twilightforest.entity.boss.HydraHeadContainer; + +import org.jetbrains.annotations.Nullable; + +public class HydraHeadRenderer extends TFPartRenderer { + + private static final ResourceLocation textureLoc = TwilightForestMod.getModelTexture("hydra4.png"); + + + public HydraHeadRenderer(EntityRendererProvider.Context manager) { + super(manager, new HydraHeadModel(manager.bakeLayer(TFModelLayers.HYDRA_HEAD))); + } + + @Override + public void render(HydraHead entity, float yaw, float partialTicks, PoseStack stack, MultiBufferSource buffer, int light) { + // get the HydraHeadContainer that we're taking about + HydraHeadContainer headCon = getHeadObject(entity); + + if (headCon != null) { + // see whether we want to render these + if (headCon.shouldRenderHead()) { + stack.mulPose(Axis.YP.rotationDegrees(-180)); + super.render(entity, yaw, partialTicks, stack, buffer, light); + } + + } else { + super.render(entity, yaw, partialTicks, stack, buffer, light); + } + } + + @Nullable + public static HydraHeadContainer getHeadObject(HydraHead entity) { + Hydra hydra = entity.getParent(); + + if (hydra != null) { + for (int i = 0; i < hydra.numHeads; i++) { + if (hydra.hc[i].headEntity == entity) { + return hydra.hc[i]; + } + } + } + return null; + } + + @Override + public ResourceLocation getTextureLocation(HydraHead entity) { + return textureLoc; + } +} diff --git a/src/main/java/twilightforest/client/renderer/entity/HydraMortarRenderer.java b/src/main/java/twilightforest/client/renderer/entity/HydraMortarRenderer.java new file mode 100644 index 0000000000..a1b2eb28e5 --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/entity/HydraMortarRenderer.java @@ -0,0 +1,59 @@ +package twilightforest.client.renderer.entity; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.EntityRenderer; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import twilightforest.TwilightForestMod; +import twilightforest.client.model.TFModelLayers; +import twilightforest.client.model.entity.HydraMortarModel; +import twilightforest.entity.boss.HydraMortar; + +public class HydraMortarRenderer extends EntityRenderer { + + private static final ResourceLocation textureLoc = TwilightForestMod.getModelTexture("hydramortar.png"); + private final HydraMortarModel mortarModel; + + public HydraMortarRenderer(EntityRendererProvider.Context manager) { + super(manager); + this.shadowRadius = 0.5F; + mortarModel = new HydraMortarModel(manager.bakeLayer(TFModelLayers.HYDRA_MORTAR)); + } + + @Override + public void render(HydraMortar mortar, float yaw, float partialTicks, PoseStack stack, MultiBufferSource buffers, int light) { + stack.pushPose(); + float blink; + // [VanillaCopy] TNTRenderer + if (mortar.fuse - partialTicks + 1.0F < 10.0F) { + float f = 1.0F - (mortar.fuse - partialTicks + 1.0F) / 10.0F; + f = Mth.clamp(f, 0.0F, 1.0F); + f = f * f; + f = f * f; + float f1 = 1.0F + f * 0.3F; + stack.scale(f1, f1, f1); + } + + float alpha = (1.0F - (mortar.fuse - partialTicks + 1.0F) / 100.0F) * 0.8F; + + VertexConsumer builder = buffers.getBuffer(mortarModel.renderType(textureLoc)); + mortarModel.renderToBuffer(stack, builder, light, OverlayTexture.NO_OVERLAY, 1.0F, 1.0F, 1.0F, 0.075F); + + if (mortar.fuse / 5 % 2 == 0) { + builder = buffers.getBuffer(RenderType.entityTranslucent(textureLoc)); + mortarModel.renderToBuffer(stack, builder, light, OverlayTexture.pack(OverlayTexture.u(1), 10), 1.0F, 1.0F, 1.0F, alpha); + } + + stack.popPose(); + } + + @Override + public ResourceLocation getTextureLocation(HydraMortar entity) { + return textureLoc; + } +} diff --git a/src/main/java/twilightforest/client/renderer/entity/HydraNeckRenderer.java b/src/main/java/twilightforest/client/renderer/entity/HydraNeckRenderer.java new file mode 100644 index 0000000000..2055608a62 --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/entity/HydraNeckRenderer.java @@ -0,0 +1,46 @@ +package twilightforest.client.renderer.entity; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Axis; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.resources.ResourceLocation; +import org.joml.Vector3f; +import twilightforest.TwilightForestMod; +import twilightforest.client.model.TFModelLayers; +import twilightforest.client.model.entity.HydraNeckModel; +import twilightforest.entity.boss.HydraNeck; +import twilightforest.entity.boss.HydraHeadContainer; + +public class HydraNeckRenderer extends TFPartRenderer { + + private static final ResourceLocation textureLoc = TwilightForestMod.getModelTexture("hydra4.png"); + + + public HydraNeckRenderer(EntityRendererProvider.Context manager) { + super(manager, new HydraNeckModel(manager.bakeLayer(TFModelLayers.HYDRA_NECK))); + } + + @Override + public void render(HydraNeck entityIn, float entityYaw, float partialTicks, PoseStack matrixStackIn, MultiBufferSource bufferIn, int light) { + HydraHeadContainer headCon = HydraHeadRenderer.getHeadObject(entityIn.head); + if (headCon != null) + if (headCon.shouldRenderHead()) { + float yawDiff = entityIn.getYRot() - entityIn.yRotO; + if (yawDiff > 180) { + yawDiff -= 360; + } else if (yawDiff < -180) { + yawDiff += 360; + } + float yaw2 = entityIn.yRotO + yawDiff * partialTicks; + + matrixStackIn.mulPose(Axis.YN.rotationDegrees(yaw2 + 180)); + super.render(entityIn, entityYaw, partialTicks, matrixStackIn, bufferIn, light); + } + } + + @Override + public ResourceLocation getTextureLocation(HydraNeck entity) { + return textureLoc; + } +} diff --git a/src/main/java/twilightforest/client/renderer/entity/HydraRenderer.java b/src/main/java/twilightforest/client/renderer/entity/HydraRenderer.java new file mode 100644 index 0000000000..1ad130a2fe --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/entity/HydraRenderer.java @@ -0,0 +1,27 @@ +package twilightforest.client.renderer.entity; + +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.entity.MobRenderer; +import net.minecraft.resources.ResourceLocation; +import twilightforest.TwilightForestMod; +import twilightforest.client.model.entity.HydraModel; +import twilightforest.entity.boss.Hydra; + +public class HydraRenderer extends MobRenderer { + + private static final ResourceLocation textureLoc = TwilightForestMod.getModelTexture("hydra4.png"); + + public HydraRenderer(EntityRendererProvider.Context manager, HydraModel modelbase, float shadowSize) { + super(manager, modelbase, shadowSize); + } + + @Override + protected float getFlipDegrees(Hydra entity) { + return 0F; + } + + @Override + public ResourceLocation getTextureLocation(Hydra entity) { + return textureLoc; + } +} diff --git a/src/main/java/twilightforest/client/renderer/entity/IceCrystalRenderer.java b/src/main/java/twilightforest/client/renderer/entity/IceCrystalRenderer.java new file mode 100644 index 0000000000..8478a6bda0 --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/entity/IceCrystalRenderer.java @@ -0,0 +1,31 @@ +package twilightforest.client.renderer.entity; + +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.entity.MobRenderer; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import twilightforest.TwilightForestMod; +import twilightforest.client.model.TFModelLayers; +import twilightforest.client.model.entity.IceCrystalModel; +import twilightforest.entity.monster.IceCrystal; + +public class IceCrystalRenderer extends MobRenderer { + + private static final ResourceLocation textureLoc = TwilightForestMod.getModelTexture("icecrystal.png"); + + public IceCrystalRenderer(EntityRendererProvider.Context manager) { + super(manager, new IceCrystalModel(manager.bakeLayer(TFModelLayers.ICE_CRYSTAL)), 0.25F); + } + + @Override + protected void scale(IceCrystal entity, PoseStack stack, float partialTicks) { + float bounce = entity.tickCount + partialTicks; + stack.translate(0F, Mth.sin((bounce) * 0.2F) * 0.15F, 0F); + } + + @Override + public ResourceLocation getTextureLocation(IceCrystal entity) { + return textureLoc; + } +} diff --git a/src/main/java/twilightforest/client/renderer/entity/IceLayer.java b/src/main/java/twilightforest/client/renderer/entity/IceLayer.java new file mode 100644 index 0000000000..b263f30714 --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/entity/IceLayer.java @@ -0,0 +1,56 @@ +package twilightforest.client.renderer.entity; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Axis; +import net.minecraft.client.Minecraft; +import net.minecraft.client.model.EntityModel; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.RenderLayerParent; +import net.minecraft.client.renderer.entity.layers.RenderLayer; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.util.RandomSource; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.ai.attributes.AttributeInstance; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.level.block.Blocks; +import net.minecraftforge.client.model.data.ModelData; +import twilightforest.potions.FrostedEffect; + +public class IceLayer> extends RenderLayer { + private final RandomSource random = RandomSource.create(); + + public IceLayer(RenderLayerParent renderer) { + super(renderer); + } + + @Override + public void render(PoseStack stack, MultiBufferSource buffer, int light, T entity, float limbSwing, float limbSwingAmount, float partialTicks, float ageInTicks, float netHeadYaw, float headPitch) { + AttributeInstance speed = entity.getAttribute(Attributes.MOVEMENT_SPEED); + if (speed == null) return; + + AttributeModifier frost = speed.getModifier(FrostedEffect.MOVEMENT_SPEED_MODIFIER_UUID); + if (frost == null) return; + + this.random.setSeed(entity.getId() * entity.getId() * 3121L + entity.getId() * 45238971L); + + int numCubes = (int) (entity.getBbHeight() / 0.4F) + (int) (frost.getAmount() / FrostedEffect.FROST_MULTIPLIER) + 1; //Number of cubes, adds more cubes based on the level of the effect + + for (int i = 0; i < numCubes; i++) { //Render cubes + stack.pushPose(); + float dx = ((this.random.nextFloat() * (entity.getBbWidth() * 2.0F)) - entity.getBbWidth()) * 0.1F; + float dy = Math.max(1.5F - (this.random.nextFloat()) * (entity.getBbHeight()), -0.1F); //Gotta limit the height because otherwise frozen giants make blocks spawn like 10 blocks above them + float dz = ((this.random.nextFloat() * (entity.getBbWidth() * 2.0F)) - entity.getBbWidth()) * 0.1F; + stack.translate(dx, dy, dz); + stack.scale(0.5F, 0.5F, 0.5F); + stack.mulPose(Axis.XP.rotationDegrees(this.random.nextFloat() * 360F)); + stack.mulPose(Axis.YP.rotationDegrees(this.random.nextFloat() * 360F)); + stack.mulPose(Axis.ZP.rotationDegrees(this.random.nextFloat() * 360F)); + stack.translate(-0.5F, -0.5F, -0.5F); + + Minecraft.getInstance().getBlockRenderer().renderSingleBlock(Blocks.ICE.defaultBlockState(), stack, buffer, light, OverlayTexture.NO_OVERLAY, ModelData.EMPTY, RenderType.translucentMovingBlock()); + stack.popPose(); + } + } +} diff --git a/src/main/java/twilightforest/client/renderer/entity/KingSpiderRenderer.java b/src/main/java/twilightforest/client/renderer/entity/KingSpiderRenderer.java new file mode 100644 index 0000000000..a2f6444b14 --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/entity/KingSpiderRenderer.java @@ -0,0 +1,28 @@ +package twilightforest.client.renderer.entity; + +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.entity.SpiderRenderer; +import net.minecraft.resources.ResourceLocation; +import twilightforest.TwilightForestMod; +import twilightforest.entity.monster.KingSpider; + +public class KingSpiderRenderer extends SpiderRenderer { + + private static final ResourceLocation textureLoc = TwilightForestMod.getModelTexture("kingspider.png"); + + public KingSpiderRenderer(EntityRendererProvider.Context manager) { + super(manager); + } + + @Override + public ResourceLocation getTextureLocation(KingSpider entity) { + return textureLoc; + } + + @Override + protected void scale(KingSpider entity, PoseStack stack, float partialTicks) { + float scale = 1.9F; + stack.scale(scale, scale, scale); + } +} diff --git a/src/main/java/twilightforest/client/renderer/entity/KnightPhantomRenderer.java b/src/main/java/twilightforest/client/renderer/entity/KnightPhantomRenderer.java new file mode 100644 index 0000000000..c7f917ef01 --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/entity/KnightPhantomRenderer.java @@ -0,0 +1,34 @@ +package twilightforest.client.renderer.entity; + +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.model.geom.ModelLayers; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.entity.HumanoidMobRenderer; +import net.minecraft.client.renderer.entity.layers.HumanoidArmorLayer; +import net.minecraft.client.renderer.entity.layers.ItemInHandLayer; +import net.minecraft.resources.ResourceLocation; +import twilightforest.TwilightForestMod; +import twilightforest.client.model.entity.KnightPhantomModel; +import twilightforest.entity.boss.KnightPhantom; + +public class KnightPhantomRenderer extends HumanoidMobRenderer { + + private static final ResourceLocation PHANTOM_TEXTURE = TwilightForestMod.getModelTexture("phantomskeleton.png"); + + public KnightPhantomRenderer(EntityRendererProvider.Context context, KnightPhantomModel model, float shadowSize) { + super(context, model, shadowSize); + this.addLayer(new ItemInHandLayer<>(this, context.getItemInHandRenderer())); + this.addLayer(new HumanoidArmorLayer<>(this, new KnightPhantomModel(context.bakeLayer(ModelLayers.PLAYER_INNER_ARMOR)), new KnightPhantomModel(context.bakeLayer(ModelLayers.PLAYER_OUTER_ARMOR)), context.getModelManager())); + } + + @Override + public ResourceLocation getTextureLocation(KnightPhantom entity) { + return PHANTOM_TEXTURE; + } + + @Override + protected void scale(KnightPhantom entity, PoseStack stack, float partialTicks) { + float scale = entity.isChargingAtPlayer() ? 1.8F : 1.2F; + stack.scale(scale, scale, scale); + } +} diff --git a/src/main/java/twilightforest/client/renderer/entity/KoboldRenderer.java b/src/main/java/twilightforest/client/renderer/entity/KoboldRenderer.java new file mode 100644 index 0000000000..81da78956d --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/entity/KoboldRenderer.java @@ -0,0 +1,72 @@ +package twilightforest.client.renderer.entity; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Axis; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.ItemInHandRenderer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.entity.RenderLayerParent; +import net.minecraft.client.renderer.entity.layers.ItemInHandLayer; +import net.minecraft.client.renderer.entity.layers.RenderLayer; +import net.minecraft.client.renderer.block.model.ItemTransforms; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.entity.HumanoidArm; +import org.joml.Vector3f; +import twilightforest.client.model.entity.KoboldModel; +import twilightforest.entity.monster.Kobold; + +public class KoboldRenderer extends TFBipedRenderer { + + public KoboldRenderer(EntityRendererProvider.Context context, KoboldModel model, float shadowSize, String textureName) { + super(context, model, shadowSize, textureName); + + this.layers.removeIf(r -> r instanceof ItemInHandLayer); + this.addLayer(new HeldItemLayer(this, context.getItemInHandRenderer())); + } + + /** + * [VanillaCopy] {@link net.minecraft.client.renderer.entity.layers.ItemInHandLayer} with additional transforms + */ + private static class HeldItemLayer extends RenderLayer { + private final ItemInHandRenderer handRenderer; + + public HeldItemLayer(RenderLayerParent renderer, ItemInHandRenderer handRenderer) { + super(renderer); + this.handRenderer = handRenderer; + } + + @Override + public void render(PoseStack ms, MultiBufferSource buffers, int light, Kobold living, float limbSwing, float limbSwingAmount, float partialTicks, float ageInTicks, float netHeadYaw, float headPitch) { + boolean flag = living.getMainArm() == HumanoidArm.RIGHT; + ItemStack itemstack = flag ? living.getOffhandItem() : living.getMainHandItem(); + ItemStack itemstack1 = flag ? living.getMainHandItem() : living.getOffhandItem(); + if (!itemstack.isEmpty() || !itemstack1.isEmpty()) { + ms.pushPose(); + if (this.getParentModel().young) { + ms.translate(0.0D, 0.75D, 0.0D); + ms.scale(0.5F, 0.5F, 0.5F); + } + + this.renderItem(living, itemstack1, ItemDisplayContext.THIRD_PERSON_RIGHT_HAND, HumanoidArm.RIGHT, ms, buffers, light); + this.renderItem(living, itemstack, ItemDisplayContext.THIRD_PERSON_LEFT_HAND, HumanoidArm.LEFT, ms, buffers, light); + ms.popPose(); + } + } + + private void renderItem(LivingEntity entity, ItemStack stack, ItemDisplayContext transform, HumanoidArm handSide, PoseStack ms, MultiBufferSource buffers, int light) { + if (!stack.isEmpty()) { + ms.pushPose(); + this.getParentModel().translateToHand(handSide, ms); + ms.mulPose(Axis.XP.rotationDegrees(-90.0F)); + ms.mulPose(Axis.YP.rotationDegrees(180.0F)); + boolean flag = handSide == HumanoidArm.LEFT; + ms.translate(0.05D, 0.125D, -0.35D); + this.handRenderer.renderItem(entity, stack, transform, flag, ms, buffers, light); + ms.popPose(); + } + } + } +} diff --git a/src/main/java/twilightforest/client/renderer/entity/LichRenderer.java b/src/main/java/twilightforest/client/renderer/entity/LichRenderer.java new file mode 100644 index 0000000000..302696ee80 --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/entity/LichRenderer.java @@ -0,0 +1,45 @@ +package twilightforest.client.renderer.entity; + +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.entity.HumanoidMobRenderer; +import net.minecraft.resources.ResourceLocation; +import twilightforest.TwilightForestMod; +import twilightforest.client.model.entity.LichModel; +import twilightforest.entity.boss.Lich; + +public class LichRenderer extends HumanoidMobRenderer { + + private static final ResourceLocation LICH_TEXTURE = TwilightForestMod.getModelTexture("twilightlich64.png"); + + public LichRenderer(EntityRendererProvider.Context manager, LichModel modelbiped, float shadowSize) { + super(manager, modelbiped, shadowSize); + addLayer(new ShieldLayer<>(this)); + } + + @Override + public void render(Lich lich, float entityYaw, float partialTicks, PoseStack stack, MultiBufferSource buffer, int packedLight) { + if (lich.deathTime > 0) { + stack.pushPose(); + if (lich.deathTime > 50) { + stack.translate(0.0D, -1.8D * Math.pow(Math.min(((float) (lich.deathTime - 50) + partialTicks) * 0.05D, 1.0D), 3.0D), 0.0D); + } else { + float time = (float)lich.deathTime + partialTicks; + stack.translate(Math.sin(time * time) * 0.01D, 0.0D, Math.cos(time * time) * 0.01D); + } + } + super.render(lich, entityYaw, partialTicks, stack, buffer, packedLight); + if (lich.deathTime > 0) stack.popPose(); + } + + @Override + protected float getFlipDegrees(Lich lich) { //Prevent the body from keeling over + return lich.isDeadOrDying() ? 0.0F : super.getFlipDegrees(lich); + } + + @Override + public ResourceLocation getTextureLocation(Lich lich) { + return LICH_TEXTURE; + } +} diff --git a/src/main/java/twilightforest/client/renderer/entity/MazeSlimeRenderer.java b/src/main/java/twilightforest/client/renderer/entity/MazeSlimeRenderer.java new file mode 100644 index 0000000000..b85a4417a5 --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/entity/MazeSlimeRenderer.java @@ -0,0 +1,43 @@ +package twilightforest.client.renderer.entity; + +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.model.SlimeModel; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.entity.MobRenderer; +import net.minecraft.client.renderer.entity.layers.SlimeOuterLayer; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import twilightforest.TwilightForestMod; +import twilightforest.client.model.TFModelLayers; +import twilightforest.entity.monster.MazeSlime; + +public class MazeSlimeRenderer extends MobRenderer> { + + private static final ResourceLocation textureLoc = TwilightForestMod.getModelTexture("mazeslime.png"); + + public MazeSlimeRenderer(EntityRendererProvider.Context manager, float shadowSize) { + super(manager, new SlimeModel<>(manager.bakeLayer(TFModelLayers.MAZE_SLIME)), shadowSize); + this.addLayer(new SlimeOuterLayer<>(this, manager.getModelSet())); + } + + @Override + public void render(MazeSlime entityIn, float entityYaw, float partialTicks, PoseStack matrixStackIn, MultiBufferSource bufferIn, int packedLightIn) { + this.shadowRadius = 0.25F * (float)entityIn.getSize(); + super.render(entityIn, entityYaw, partialTicks, matrixStackIn, bufferIn, packedLightIn); + } + + protected void scale(MazeSlime p_115983_, PoseStack p_115984_, float p_115985_) { + p_115984_.scale(0.999F, 0.999F, 0.999F); + p_115984_.translate(0.0D, 0.0010000000474974513D, 0.0D); + float var5 = (float)p_115983_.getSize(); + float var6 = Mth.lerp(p_115985_, p_115983_.oSquish, p_115983_.squish) / (var5 * 0.5F + 1.0F); + float var7 = 1.0F / (var6 + 1.0F); + p_115984_.scale(var7 * var5, 1.0F / var7 * var5, var7 * var5); + } + + @Override + public ResourceLocation getTextureLocation(MazeSlime entity) { + return textureLoc; + } +} diff --git a/src/main/java/twilightforest/client/renderer/entity/MinoshroomRenderer.java b/src/main/java/twilightforest/client/renderer/entity/MinoshroomRenderer.java new file mode 100644 index 0000000000..9ea54cf68d --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/entity/MinoshroomRenderer.java @@ -0,0 +1,81 @@ +package twilightforest.client.renderer.entity; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Axis; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.block.BlockRenderDispatcher; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.entity.HumanoidMobRenderer; +import net.minecraft.client.renderer.entity.RenderLayerParent; +import net.minecraft.client.renderer.entity.LivingEntityRenderer; +import net.minecraft.client.renderer.entity.layers.RenderLayer; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.resources.ResourceLocation; +import org.joml.Vector3f; +import twilightforest.TwilightForestMod; +import twilightforest.client.model.entity.MinoshroomModel; +import twilightforest.entity.boss.Minoshroom; + +//old renderer had the head mushroom in a different spot - line is commented out +public class MinoshroomRenderer extends HumanoidMobRenderer { + + private static final ResourceLocation textureLoc = TwilightForestMod.getModelTexture("minoshroomtaur.png"); + + public MinoshroomRenderer(EntityRendererProvider.Context manager, MinoshroomModel model, float shadowSize) { + super(manager, model, shadowSize); + this.addLayer(new LayerMinoshroomMushroom(this)); + } + + /** + * [VanillaCopy] {@link net.minecraft.client.renderer.entity.layers.MooshroomMushroomLayer} + */ + static class LayerMinoshroomMushroom extends RenderLayer { + + public LayerMinoshroomMushroom(RenderLayerParent renderer) { + super(renderer); + } + + @Override + public void render(PoseStack ms, MultiBufferSource buffers, int light, Minoshroom entity, float limbSwing, float limbSwingAmount, float partialTicks, float ageInTicks, float netHeadYaw, float headPitch) { + if (!entity.isBaby() && !entity.isInvisible()) { + BlockRenderDispatcher blockrendererdispatcher = Minecraft.getInstance().getBlockRenderer(); + BlockState blockstate = Blocks.RED_MUSHROOM.defaultBlockState(); // TF: hardcode mushroom state + int i = LivingEntityRenderer.getOverlayCoords(entity, 0.0F); + ms.pushPose(); + ms.translate(0.2F, -0.35F, 0.5D); + ms.mulPose(Axis.YP.rotationDegrees(-48.0F)); + ms.scale(-1.0F, -1.0F, 1.0F); + ms.translate(-0.5D, -0.5D, -0.5D); + blockrendererdispatcher.renderSingleBlock(blockstate, ms, buffers, light, i); + ms.popPose(); + ms.pushPose(); + ms.translate(0.2F, -0.35F, 0.5D); + ms.mulPose(Axis.YP.rotationDegrees(42.0F)); + ms.translate(0.1F, 0.0D, -0.6F); + ms.mulPose(Axis.YP.rotationDegrees(-48.0F)); + ms.scale(-1.0F, -1.0F, 1.0F); + ms.translate(-0.5D, -0.5D, -0.5D); + blockrendererdispatcher.renderSingleBlock(blockstate, ms, buffers, light, i); + ms.popPose(); + ms.pushPose(); + this.getParentModel().head.translateAndRotate(ms); + // TF - adjust head shroom + //old render + //ms.translate(0.0D, -0.9, 0.05); + ms.translate(0.0D, -1.1, 0.05); + ms.mulPose(Axis.YP.rotationDegrees(-78.0F)); + ms.scale(-1.0F, -1.0F, 1.0F); + ms.translate(-0.5D, -0.5D, -0.5D); + blockrendererdispatcher.renderSingleBlock(blockstate, ms, buffers, light, i); + ms.popPose(); + } + } + } + + @Override + public ResourceLocation getTextureLocation(Minoshroom entity) { + return textureLoc; + } +} diff --git a/src/main/java/twilightforest/client/renderer/entity/MistWolfRenderer.java b/src/main/java/twilightforest/client/renderer/entity/MistWolfRenderer.java new file mode 100644 index 0000000000..482e38ffa2 --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/entity/MistWolfRenderer.java @@ -0,0 +1,63 @@ +package twilightforest.client.renderer.entity; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.entity.MobRenderer; +import net.minecraft.resources.ResourceLocation; +import org.jetbrains.annotations.Nullable; +import twilightforest.TwilightForestMod; +import twilightforest.client.model.TFModelLayers; +import twilightforest.client.model.entity.HostileWolfModel; +import twilightforest.entity.monster.HostileWolf; + +public class MistWolfRenderer extends MobRenderer> { + + private static HostileWolf parent; // This is a huge hack + + private static final ResourceLocation textureLoc = TwilightForestMod.getModelTexture("mistwolf.png"); + + public MistWolfRenderer(EntityRendererProvider.Context manager) { + super(manager, new HostileWolfModel<>(manager.bakeLayer(TFModelLayers.HOSTILE_WOLF)) { + @Override + public void renderToBuffer(PoseStack poseStack, VertexConsumer buffer, int light, int overlay, float r, float g, float b, float a) { + float brightness = parent.getLevel().getMaxLocalRawBrightness(parent.blockPosition()); + float misty = Math.min(1F, brightness * 3F + 0.25F); + float smoky = brightness * 2F + 0.6F; + super.renderToBuffer(poseStack, buffer, light, overlay, misty, misty, misty, smoky); + } + }, 0.5F); + this.shadowRadius = 1.0F; + } + + @Override + protected void scale(HostileWolf entity, PoseStack stack, float partialTicks) { + float wolfScale = 1.9F; + stack.scale(wolfScale, wolfScale, wolfScale); + } + + @Override + public void render(HostileWolf wolf, float p_115456_, float p_115457_, PoseStack p_115458_, MultiBufferSource p_115459_, int p_115460_) { + parent = wolf; + super.render(wolf, p_115456_, p_115457_, p_115458_, p_115459_, p_115460_); + parent = null; + } + + @Override + protected float getBob(HostileWolf p_116528_, float p_116529_) { + return p_116528_.getTailAngle(); + } + + @Nullable + @Override + protected RenderType getRenderType(HostileWolf entity, boolean p_115323_, boolean p_115324_, boolean p_115325_) { + return RenderType.entityTranslucent(getTextureLocation(entity)); + } + + @Override + public ResourceLocation getTextureLocation(HostileWolf entity) { + return textureLoc; + } +} diff --git a/src/main/java/twilightforest/client/renderer/entity/ModelTFApocalypseCube.java b/src/main/java/twilightforest/client/renderer/entity/ModelTFApocalypseCube.java deleted file mode 100644 index 3245d0e10a..0000000000 --- a/src/main/java/twilightforest/client/renderer/entity/ModelTFApocalypseCube.java +++ /dev/null @@ -1,59 +0,0 @@ -package twilightforest.client.renderer.entity; - -import net.minecraft.client.model.ModelBase; -import net.minecraft.client.model.ModelQuadruped; -import net.minecraft.client.model.ModelRenderer; -import net.minecraft.entity.Entity; -import net.minecraft.util.MathHelper; - -public class ModelTFApocalypseCube extends ModelQuadruped { - - public ModelTFApocalypseCube() { - this(0.0F); - } - - public ModelTFApocalypseCube(float fNumber) { - super(6, fNumber); - - this.textureWidth = 128; - this.textureHeight = 64; - - this.head = new ModelRenderer(this, 0, 0); - - body = new ModelRenderer(this, 0, 0); - body.addBox(-16F, -16F, -16F, 32, 32, 32); - body.setRotationPoint(0F, 0F, -2F); - - leg1 = new ModelRenderer(this, 0, 0); - leg1.addBox(-4F, 0F, -4F, 8, 8, 8); - leg1.setRotationPoint(-6F, 16F, 9F); - - leg2 = new ModelRenderer(this, 0, 0); - leg2.addBox(-4F, 0F, -4F, 8, 8, 8); - leg2.setRotationPoint(6F, 16F, 9F); - - leg3 = new ModelRenderer(this, 0, 0); - leg3.addBox(-4F, 0F, -4F, 8, 8, 8); - leg3.setRotationPoint(-9F, 16F, -14F); - - leg4 = new ModelRenderer(this, 0, 0); - leg4.addBox(-4F, 0F, -4F, 8, 8, 8); - leg4.setRotationPoint(9F, 16F, -14F); - - - this.field_78145_g = 4.0F; - } - - /** - * Sets the model's various rotation angles. For bipeds, par1 and par2 are used for animating the movement of arms - * and legs, where par1 represents the time(so that arms and legs swing back and forth) and par2 represents how - * "far" arms and legs can swing at most. - */ - public void setRotationAngles(float p_78087_1_, float p_78087_2_, float p_78087_3_, float p_78087_4_, float p_78087_5_, float p_78087_6_, Entity p_78087_7_) - { - super.setRotationAngles(p_78087_1_, p_78087_2_, p_78087_3_, p_78087_4_, p_78087_5_, p_78087_6_, p_78087_7_); - - this.body.rotateAngleX = 0F; - } - -} diff --git a/src/main/java/twilightforest/client/renderer/entity/MoonwormShotRenderer.java b/src/main/java/twilightforest/client/renderer/entity/MoonwormShotRenderer.java new file mode 100644 index 0000000000..af3a20449e --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/entity/MoonwormShotRenderer.java @@ -0,0 +1,49 @@ +package twilightforest.client.renderer.entity; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.math.Axis; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.entity.EntityRenderer; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import org.joml.Vector3f; +import twilightforest.TwilightForestMod; +import twilightforest.client.model.TFModelLayers; +import twilightforest.client.model.entity.MoonwormModel; +import twilightforest.entity.projectile.MoonwormShot; + +public class MoonwormShotRenderer extends EntityRenderer { + + private static final ResourceLocation textureLoc = TwilightForestMod.getModelTexture("moonworm.png"); + private final MoonwormModel wormModel; + + public MoonwormShotRenderer(EntityRendererProvider.Context manager) { + super(manager); + this.shadowRadius = 0.25F; + + this.wormModel = new MoonwormModel(manager.bakeLayer(TFModelLayers.MOONWORM)); + } + + @Override + public void render(MoonwormShot entity, float yaw, float partialTicks, PoseStack stack, MultiBufferSource buffer, int light) { + stack.pushPose(); + stack.translate(0.0, 0.5, 0.0); + stack.scale(-1f, -1f, -1f); + + stack.mulPose(Axis.YP.rotationDegrees(Mth.lerp(partialTicks, entity.yRotO, entity.getYRot()) - 180.0F)); + stack.mulPose(Axis.ZP.rotationDegrees(Mth.lerp(partialTicks, entity.xRotO, entity.getXRot()))); + + VertexConsumer builder = buffer.getBuffer(this.wormModel.renderType(textureLoc)); + this.wormModel.renderToBuffer(stack, builder, light, OverlayTexture.NO_OVERLAY, 1.0F, 1.0F, 1.0F, 1.0F); + + stack.popPose(); + } + + @Override + public ResourceLocation getTextureLocation(MoonwormShot entity) { + return textureLoc; + } +} diff --git a/src/main/java/twilightforest/client/renderer/entity/MosquitoSwarmRenderer.java b/src/main/java/twilightforest/client/renderer/entity/MosquitoSwarmRenderer.java new file mode 100644 index 0000000000..d3cc581337 --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/entity/MosquitoSwarmRenderer.java @@ -0,0 +1,18 @@ +package twilightforest.client.renderer.entity; + +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import twilightforest.client.model.TFModelLayers; +import twilightforest.client.model.entity.MosquitoSwarmModel; +import twilightforest.entity.monster.MosquitoSwarm; + +public class MosquitoSwarmRenderer extends TFGenericMobRenderer { + + public MosquitoSwarmRenderer(EntityRendererProvider.Context manager) { + super(manager, new MosquitoSwarmModel(manager.bakeLayer(TFModelLayers.MOSQUITO_SWARM)), 0.0F, "mosquitoswarm.png"); + } + + @Override + protected float getFlipDegrees(MosquitoSwarm swarm) { + return 0.0F; + } +} diff --git a/src/main/java/twilightforest/client/renderer/entity/NagaRenderer.java b/src/main/java/twilightforest/client/renderer/entity/NagaRenderer.java new file mode 100644 index 0000000000..f8e1953f35 --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/entity/NagaRenderer.java @@ -0,0 +1,43 @@ +package twilightforest.client.renderer.entity; + +import net.minecraft.client.renderer.culling.Frustum; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.entity.MobRenderer; +import net.minecraft.resources.ResourceLocation; +import twilightforest.TwilightForestMod; +import twilightforest.client.model.entity.NagaModel; +import twilightforest.entity.boss.Naga; + +//added charging texture for new renderer +public class NagaRenderer> extends MobRenderer { + + private static final ResourceLocation textureLoc = TwilightForestMod.getModelTexture("nagahead.png"); + private static final ResourceLocation textureLocDazed = TwilightForestMod.getModelTexture("nagahead_dazed.png"); + private static final ResourceLocation textureLocCharging = TwilightForestMod.getModelTexture("nagahead_charge.png"); + + public NagaRenderer(EntityRendererProvider.Context manager, M modelbase, float shadowSize) { + super(manager, modelbase, shadowSize); + } + + @Override + public boolean shouldRender(Naga pLivingEntity, Frustum pCamera, double pCamX, double pCamY, double pCamZ) { + if (pLivingEntity.deathTime > 32) return false; + return super.shouldRender(pLivingEntity, pCamera, pCamX, pCamY, pCamZ); + } + + @Override + protected float getFlipDegrees(Naga naga) { //Prevent the body from keeling over + return naga.isDeadOrDying() ? 0.0F : super.getFlipDegrees(naga); + } + + @Override + public ResourceLocation getTextureLocation(Naga entity) { + if (entity.isDazed()) { + return textureLocDazed; + } else if (entity.isCharging() || entity.isDeadOrDying()) { + return textureLocCharging; + } else { + return textureLoc; + } + } +} diff --git a/src/main/java/twilightforest/client/renderer/entity/NagaSegmentRenderer.java b/src/main/java/twilightforest/client/renderer/entity/NagaSegmentRenderer.java new file mode 100644 index 0000000000..f27238f7e5 --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/entity/NagaSegmentRenderer.java @@ -0,0 +1,47 @@ +package twilightforest.client.renderer.entity; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Axis; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.resources.ResourceLocation; +import org.joml.Vector3f; +import twilightforest.TwilightForestMod; +import twilightforest.client.model.TFModelLayers; +import twilightforest.client.model.entity.NagaModel; +import twilightforest.entity.boss.NagaSegment; + +public class NagaSegmentRenderer extends TFPartRenderer> { + private static final ResourceLocation part_TextureLoc = TwilightForestMod.getModelTexture("nagasegment.png"); + + public NagaSegmentRenderer(EntityRendererProvider.Context m) { + super(m, new NagaModel<>(m.bakeLayer(TFModelLayers.NAGA_BODY))); + } + + @Override + public void render(T entityIn, float entityYaw, float partialTicks, PoseStack matrixStackIn, MultiBufferSource bufferIn, int packedLightIn) { + if(!entityIn.isInvisible()) { + matrixStackIn.pushPose(); + + float yawDiff = entityIn.getYRot() - entityIn.yRotO; + if (yawDiff > 180) { + yawDiff -= 360; + } else if (yawDiff < -180) { + yawDiff += 360; + } + float yaw2 = entityIn.yRotO + yawDiff * partialTicks; + + matrixStackIn.mulPose(Axis.YP.rotationDegrees(yaw2)); + matrixStackIn.mulPose(Axis.XP.rotationDegrees(entityIn.getXRot())); + + int light = entityRenderDispatcher.getPackedLightCoords(entityIn.getParent(), partialTicks); + super.render(entityIn, entityYaw, partialTicks, matrixStackIn, bufferIn, light); + matrixStackIn.popPose(); + } + } + + @Override + public ResourceLocation getTextureLocation(T entity) { + return part_TextureLoc; + } +} diff --git a/src/main/java/twilightforest/client/renderer/entity/NoopRenderer.java b/src/main/java/twilightforest/client/renderer/entity/NoopRenderer.java new file mode 100644 index 0000000000..bdf159d5df --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/entity/NoopRenderer.java @@ -0,0 +1,17 @@ +package twilightforest.client.renderer.entity; + +import net.minecraft.client.renderer.entity.EntityRenderer; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.world.entity.Entity; +import net.minecraft.resources.ResourceLocation; + +public class NoopRenderer extends EntityRenderer { + public NoopRenderer(EntityRendererProvider.Context mgr) { + super(mgr); + } + + @Override + public ResourceLocation getTextureLocation(T p_110775_1_) { + throw new UnsupportedOperationException(); + } +} diff --git a/src/main/java/twilightforest/client/renderer/entity/ProtectionBoxRenderer.java b/src/main/java/twilightforest/client/renderer/entity/ProtectionBoxRenderer.java new file mode 100644 index 0000000000..6a2ba3aab4 --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/entity/ProtectionBoxRenderer.java @@ -0,0 +1,51 @@ +package twilightforest.client.renderer.entity; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.culling.Frustum; +import net.minecraft.client.renderer.entity.EntityRenderer; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import twilightforest.TwilightForestMod; +import twilightforest.client.model.TFModelLayers; +import twilightforest.client.model.entity.ProtectionBoxModel; +import twilightforest.client.renderer.TFRenderTypes; +import twilightforest.entity.ProtectionBox; + +public class ProtectionBoxRenderer extends EntityRenderer { + + private static final ResourceLocation textureLoc = TwilightForestMod.getModelTexture("protectionbox.png"); + private final ProtectionBoxModel boxModel; + + public ProtectionBoxRenderer(EntityRendererProvider.Context manager) { + super(manager); + this.shadowRadius = 0.5F; + boxModel = new ProtectionBoxModel<>(manager.bakeLayer(TFModelLayers.PROTECTION_BOX)); + } + + @Override + public boolean shouldRender(T p_114491_, Frustum p_114492_, double p_114493_, double p_114494_, double p_114495_) { + return true; + } + + @Override + public void render(T entity, float yaw, float partialTicks, PoseStack stack, MultiBufferSource buffer, int light) { + float t = (float) entity.tickCount + partialTicks; + + float alpha = 1.0F; + if (entity.lifeTime < 20) { + alpha = entity.lifeTime / 20F; + } + + VertexConsumer vertexconsumer = buffer.getBuffer(TFRenderTypes.getProtectionBox(getTextureLocation(entity), (-t * 0.15F) % 1.0F, -t * 0.10F % 1.0F)); + boxModel.prepareMobModel(entity, 0, 0, 0); + boxModel.renderToBuffer(stack, vertexconsumer, light, OverlayTexture.NO_OVERLAY, 1.0F, 1.0F, 1.0F, alpha); + } + + @Override + public ResourceLocation getTextureLocation(T entity) { + return textureLoc; + } +} diff --git a/src/main/java/twilightforest/client/renderer/entity/QuestRamRenderer.java b/src/main/java/twilightforest/client/renderer/entity/QuestRamRenderer.java new file mode 100644 index 0000000000..2b4b05a500 --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/entity/QuestRamRenderer.java @@ -0,0 +1,45 @@ +package twilightforest.client.renderer.entity; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.entity.RenderLayerParent; +import net.minecraft.client.renderer.entity.MobRenderer; +import net.minecraft.client.renderer.entity.layers.RenderLayer; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import twilightforest.TwilightForestMod; +import twilightforest.client.model.entity.QuestRamModel; +import twilightforest.entity.passive.QuestRam; + +public class QuestRamRenderer extends MobRenderer { + + private static final ResourceLocation textureLoc = TwilightForestMod.getModelTexture("questram.png"); + private static final ResourceLocation textureLocLines = TwilightForestMod.getModelTexture("questram_lines.png"); + + public QuestRamRenderer(EntityRendererProvider.Context manager, QuestRamModel model) { + super(manager, model, 1.0F); + addLayer(new LayerGlowingLines(this)); + } + + @Override + public ResourceLocation getTextureLocation(QuestRam entity) { + return textureLoc; + } + + class LayerGlowingLines extends RenderLayer { + + public LayerGlowingLines(RenderLayerParent renderer) { + super(renderer); + } + + @Override + public void render(PoseStack stack, MultiBufferSource buffer, int i, QuestRam entity, float limbSwing, float limbSwingAmount, float partialTicks, float ageInTicks, float netHeadYaw, float headPitch) { + VertexConsumer builder = buffer.getBuffer(RenderType.entityTranslucent(textureLocLines)); + stack.scale(1.025f, 1.025f, 1.025f); + QuestRamRenderer.this.getModel().renderToBuffer(stack, builder, 0xF000F0, OverlayTexture.NO_OVERLAY, 1.0F, 1.0F, 1.0F, 1.0F); + } + } +} diff --git a/src/main/java/twilightforest/client/renderer/entity/RenderTFAdherent.java b/src/main/java/twilightforest/client/renderer/entity/RenderTFAdherent.java deleted file mode 100644 index ded4c6b37f..0000000000 --- a/src/main/java/twilightforest/client/renderer/entity/RenderTFAdherent.java +++ /dev/null @@ -1,32 +0,0 @@ -package twilightforest.client.renderer.entity; - -import org.lwjgl.opengl.GL11; - -import net.minecraft.client.model.ModelBiped; -import net.minecraft.client.renderer.entity.Render; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLiving; -import net.minecraft.item.ItemStack; -import net.minecraft.util.ResourceLocation; - -public class RenderTFAdherent extends RenderTFBiped { - - public RenderTFAdherent(ModelBiped modelBiped, float scale, String textureName) { - super(modelBiped, scale, textureName); - } - - - /** - * Actually renders the given argument. This is a synthetic bridge method, always casting down its argument and then - * handing it off to a worker function which does the actual work. In all probabilty, the class Render is generic - * (Render 0) - { - //this.itemIcon = Items.itemsList[charm.getItemID()].getIconFromDamage(0); - this.itemIcon = TFItems.charmOfKeeping1.getIconFromDamage(0); - } - } - - GL11.glPushMatrix(); - GL11.glTranslatef((float)par2, (float)par4, (float)par6); - GL11.glEnable(GL12.GL_RESCALE_NORMAL); - GL11.glScalef(0.5F, 0.5F, 0.5F); - this.bindEntityTexture(par1Entity); - Tessellator var10 = Tessellator.instance; - - - this.func_77026_a(var10, this.itemIcon); - GL11.glDisable(GL12.GL_RESCALE_NORMAL); - GL11.glPopMatrix(); - } - - private void func_77026_a(Tessellator par1Tessellator, IIcon par2Icon) - { - float f = par2Icon.getMinU(); - float f1 = par2Icon.getMaxU(); - float f2 = par2Icon.getMinV(); - float f3 = par2Icon.getMaxV(); - float f4 = 1.0F; - float f5 = 0.5F; - float f6 = 0.25F; - GL11.glRotatef(180.0F - this.renderManager.playerViewY, 0.0F, 1.0F, 0.0F); - GL11.glRotatef(-this.renderManager.playerViewX, 1.0F, 0.0F, 0.0F); - par1Tessellator.startDrawingQuads(); - par1Tessellator.setNormal(0.0F, 1.0F, 0.0F); - par1Tessellator.addVertexWithUV((double)(0.0F - f5), (double)(0.0F - f6), 0.0D, (double)f, (double)f3); - par1Tessellator.addVertexWithUV((double)(f4 - f5), (double)(0.0F - f6), 0.0D, (double)f1, (double)f3); - par1Tessellator.addVertexWithUV((double)(f4 - f5), (double)(f4 - f6), 0.0D, (double)f1, (double)f2); - par1Tessellator.addVertexWithUV((double)(0.0F - f5), (double)(f4 - f6), 0.0D, (double)f, (double)f2); - par1Tessellator.draw(); - } - - protected ResourceLocation getEntityTexture(Entity par1Entity) - { - return TextureMap.locationItemsTexture; - } -} diff --git a/src/main/java/twilightforest/client/renderer/entity/RenderTFCubeOfAnnihilation.java b/src/main/java/twilightforest/client/renderer/entity/RenderTFCubeOfAnnihilation.java deleted file mode 100644 index a230dba7ef..0000000000 --- a/src/main/java/twilightforest/client/renderer/entity/RenderTFCubeOfAnnihilation.java +++ /dev/null @@ -1,76 +0,0 @@ -package twilightforest.client.renderer.entity; - -import net.minecraft.client.model.ModelBase; -import net.minecraft.client.renderer.entity.Render; -import net.minecraft.client.renderer.entity.RenderManager; -import net.minecraft.entity.Entity; -import net.minecraft.util.MathHelper; -import net.minecraft.util.ResourceLocation; - -import org.lwjgl.opengl.GL11; - -import twilightforest.TwilightForestMod; -import twilightforest.client.model.ModelTFCubeOfAnnihilation; -import twilightforest.client.model.ModelTFHydraMortar; -import twilightforest.entity.EntityTFBlockGoblin; -import twilightforest.entity.EntityTFChainBlock; - -public class RenderTFCubeOfAnnihilation extends Render { - - private ModelBase model; - private static final ResourceLocation textureLoc = new ResourceLocation(TwilightForestMod.MODEL_DIR + "cubeofannihilation.png"); - - public RenderTFCubeOfAnnihilation() { - this.model = new ModelTFCubeOfAnnihilation(); - } - - /** - * The render method used in RenderBoat that renders the boat model. - */ - public void renderSpikeBlock(Entity entity, double x, double y, double z, float par8, float time) - { - GL11.glPushMatrix(); - GL11.glTranslatef((float)x, (float)y, (float)z); - - this.bindEntityTexture(entity); - - GL11.glScalef(-1.0F, -1.0F, 1.0F); - - // rotate - GL11.glRotatef(MathHelper.wrapAngleTo180_float(((float)x + (float)z + entity.ticksExisted + time) * 11F), 0, 1, 0); - - - GL11.glDisable(GL11.GL_LIGHTING); - GL11.glEnable(GL11.GL_BLEND); - GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - - GL11.glTranslatef(0F, -0.5F, 0F); - this.model.render(entity, 0.0F, 0.0F, 0.0F, 0.0F, time, 0.0625F / 2F); - GL11.glEnable(GL11.GL_LIGHTING); - GL11.glDisable(GL11.GL_BLEND); - - - GL11.glPopMatrix(); - } - - /** - * Actually renders the given argument. This is a synthetic bridge method, always casting down its argument and then - * handing it off to a worker function which does the actual work. In all probabilty, the class Render is generic - * (Render 0) - { - GL11.glRotatef(getPitchForAttack((60 - upperKnight.heavySpearTimer) + par4), 1.0F, 0.0F, 0.0F); - - //System.out.println("Getting attack pitch. Result is " + getPitchForAttack((100 - upperKnight.heavySpearTimer) + (1.0F - par4))); - - } - } - - /** - * Figure out what pitch the goblin should be at depending on where it's at on the the timer - */ - public float getPitchForAttack(float attackTime) { - //System.out.println("Getting attack pitch. AttackTime is " + attackTime); - - if (attackTime <= 10) - { - // rock back - return attackTime * 3.0F; - } - if (attackTime > 10 && attackTime <= 30) - { - // hang back - return 30F; - } - if (attackTime > 30 && attackTime <= 33) - { - // slam forward - return (attackTime - 30) * -25F + 30F; - } - if (attackTime > 33 && attackTime <= 50) - { - // stay forward - return -45F; - } - if (attackTime > 50 && attackTime <= 60) - { - // back to normal - return (10 - (attackTime - 50)) * -4.5F; - } - - -// if (attackTime <= 10) -// { -// // rock back -// return attackTime * 3.0F; -// } -// if (attackTime > 10 && attackTime <= 40) -// { -// // hang back -// return 30F; -// } -// if (attackTime > 40 && attackTime <= 43) -// { -// // slam forward -// return (attackTime - 40) * -25F + 30F; -// } -// if (attackTime > 43 && attackTime <= 90) -// { -// // stay forward -// return -45F; -// } -// if (attackTime > 90 && attackTime <= 100) -// { -// // back to normal -// return (10 - (attackTime - 90)) * -4.5F; -// } - - return 0; - - } -} diff --git a/src/main/java/twilightforest/client/renderer/entity/RenderTFHarbingerCube.java b/src/main/java/twilightforest/client/renderer/entity/RenderTFHarbingerCube.java deleted file mode 100644 index 98c8576f25..0000000000 --- a/src/main/java/twilightforest/client/renderer/entity/RenderTFHarbingerCube.java +++ /dev/null @@ -1,46 +0,0 @@ -package twilightforest.client.renderer.entity; - -import net.minecraft.client.model.ModelBase; -import net.minecraft.client.renderer.entity.Render; -import net.minecraft.client.renderer.entity.RenderLiving; -import net.minecraft.client.renderer.entity.RenderManager; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.util.MathHelper; -import net.minecraft.util.ResourceLocation; - -import org.lwjgl.opengl.GL11; - -import twilightforest.TwilightForestMod; -import twilightforest.client.model.ModelTFCubeOfAnnihilation; -import twilightforest.client.model.ModelTFHydraMortar; -import twilightforest.entity.EntityTFBlockGoblin; -import twilightforest.entity.EntityTFChainBlock; - -public class RenderTFHarbingerCube extends RenderLiving { - - private static final ResourceLocation textureLoc = new ResourceLocation(TwilightForestMod.MODEL_DIR + "apocalypse2.png"); - - public RenderTFHarbingerCube() { - super(new ModelTFApocalypseCube(), 1.0F); - } - - - /** - * Return our specific texture - */ - protected ResourceLocation getEntityTexture(Entity par1Entity) - { - return textureLoc; - } - - /** - * Allows the render to do any OpenGL state modifications necessary before the model is rendered. Args: - * entityLiving, partialTickTime - */ - protected void preRenderCallback(EntityLivingBase par1EntityLivingBase, float par2) - { - float scale = 1.0F; - GL11.glScalef(scale, scale, scale); - } -} diff --git a/src/main/java/twilightforest/client/renderer/entity/RenderTFHedgeSpider.java b/src/main/java/twilightforest/client/renderer/entity/RenderTFHedgeSpider.java deleted file mode 100644 index 3fff7b4628..0000000000 --- a/src/main/java/twilightforest/client/renderer/entity/RenderTFHedgeSpider.java +++ /dev/null @@ -1,17 +0,0 @@ -package twilightforest.client.renderer.entity; - -import net.minecraft.client.renderer.entity.RenderSpider; -import net.minecraft.entity.Entity; -import net.minecraft.util.ResourceLocation; -import twilightforest.TwilightForestMod; - -public class RenderTFHedgeSpider extends RenderSpider { - - private static final ResourceLocation textureLoc = new ResourceLocation(TwilightForestMod.MODEL_DIR + "hedgespider.png"); - - @Override - protected ResourceLocation getEntityTexture(Entity entity) { - return textureLoc; - } - -} diff --git a/src/main/java/twilightforest/client/renderer/entity/RenderTFHydra.java b/src/main/java/twilightforest/client/renderer/entity/RenderTFHydra.java deleted file mode 100644 index 05699cfd26..0000000000 --- a/src/main/java/twilightforest/client/renderer/entity/RenderTFHydra.java +++ /dev/null @@ -1,61 +0,0 @@ -package twilightforest.client.renderer.entity; - - -import net.minecraft.client.model.ModelBase; -import net.minecraft.client.renderer.entity.RenderLiving; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.boss.BossStatus; -import net.minecraft.util.ResourceLocation; -import twilightforest.TwilightForestMod; -import twilightforest.entity.boss.EntityTFHydra; - - - -public class RenderTFHydra extends RenderLiving { - - private static final ResourceLocation textureLoc = new ResourceLocation(TwilightForestMod.MODEL_DIR + "hydra4.png"); - - - public RenderTFHydra(ModelBase modelbase, float f) { - super(modelbase, f); - - } - - @Override - public void doRender(Entity entity, double d, double d1, double d2, float f, float f1) { - // render the hydra body, legs, tail normally - super.doRender(entity, d, d1, d2, f, f1); - - BossStatus.setBossStatus((EntityTFHydra)entity, false); - -// GL11.glPushMatrix(); -//// renderOffsetAABB(entity.boundingBox, d - entity.lastTickPosX, d1 - entity.lastTickPosY, d2 - entity.lastTickPosZ); -// renderOffsetAABB(hydra.body.boundingBox, d - entity.lastTickPosX, d1 - entity.lastTickPosY, d2 - entity.lastTickPosZ); -// renderOffsetAABB(hydra.tail.boundingBox, d - entity.lastTickPosX, d1 - entity.lastTickPosY, d2 - entity.lastTickPosZ); -// GL11.glPopMatrix(); - -// System.out.println("Rendering AABB, d = " + d + ", " + d1 + ", " + d2 + ". entity = " + entity.lastTickPosX + ", " + entity.lastTickPosY + ", " + entity.lastTickPosZ + ". tail = " + hydra.tail.posX + ", " + hydra.tail.posY + ", " + hydra.tail.posZ); -// System.out.println("AABB, at " + (d - entity.lastTickPosX - (entity.lastTickPosX - hydra.tail.posX)) + ", " + (d1 - entity.lastTickPosY - (entity.lastTickPosY - hydra.tail.posY)) + ", " + (d2 - entity.lastTickPosZ - (entity.lastTickPosZ - hydra.tail.posZ))); -// System.out.println("Theoretically it could be " + (d - hydra.tail.posX) + ", " + (d1 - hydra.tail.posY) + ", " + (d2 - hydra.tail.posZ)); - - } - - @Override - protected float getDeathMaxRotation(EntityLivingBase par1EntityLiving) { - return 0F; - } - - /** - * Return our specific texture - */ - protected ResourceLocation getEntityTexture(Entity par1Entity) - { - return textureLoc; - } - - - - - -} diff --git a/src/main/java/twilightforest/client/renderer/entity/RenderTFHydraHead.java b/src/main/java/twilightforest/client/renderer/entity/RenderTFHydraHead.java deleted file mode 100644 index b8212982ec..0000000000 --- a/src/main/java/twilightforest/client/renderer/entity/RenderTFHydraHead.java +++ /dev/null @@ -1,91 +0,0 @@ -package twilightforest.client.renderer.entity; - -import net.minecraft.client.model.ModelBase; -import net.minecraft.client.renderer.entity.RenderLiving; -import net.minecraft.client.renderer.entity.RenderManager; -import net.minecraft.entity.Entity; -import net.minecraft.util.ResourceLocation; -import twilightforest.TwilightForestMod; -import twilightforest.entity.boss.EntityTFHydra; -import twilightforest.entity.boss.EntityTFHydraPart; -import twilightforest.entity.boss.HydraHeadContainer; - -public class RenderTFHydraHead extends RenderLiving { - - private static final ResourceLocation textureLoc = new ResourceLocation(TwilightForestMod.MODEL_DIR + "hydra4.png"); - - public RenderTFHydraHead(ModelBase modelbase, float f) { - super(modelbase, f); - - } - - /** - * Override render to perform a few special rendering tricks, like not rendering "dead" heads & their necks - */ - @Override - public void doRender(Entity entity, double d, double d1, double d2, float f, float f1) { - // get the HydraHeadContainer that we're taking about - HydraHeadContainer headCon = getHeadObject(entity); - - if (headCon != null) - { - // see whether we want to render these - if (headCon.shouldRenderHead()) - { - super.doRender(entity, d, d1, d2, f, f1); - } - - if (headCon.shouldRenderNeck(0)) - { - RenderManager.instance.renderEntitySimple(headCon.necka, f1); - } - if (headCon.shouldRenderNeck(1)) - { - RenderManager.instance.renderEntitySimple(headCon.neckb, f1); - } - if (headCon.shouldRenderNeck(2)) - { - RenderManager.instance.renderEntitySimple(headCon.neckc, f1); - } - if (headCon.shouldRenderNeck(3)) - { - RenderManager.instance.renderEntitySimple(headCon.neckd, f1); - } - if (headCon.shouldRenderNeck(4)) - { - RenderManager.instance.renderEntitySimple(headCon.necke, f1); - } - } - else - { - super.doRender(entity, d, d1, d2, f, f1); - - } - } - - private HydraHeadContainer getHeadObject(Entity entity) { - EntityTFHydra hydra = ((EntityTFHydraPart)entity).hydraObj; - - if (hydra != null) - { - for (int i = 0; i < hydra.numHeads; i++) - { - if (hydra.hc[i].headEntity == entity) - { - return hydra.hc[i]; - } - - } - } - return null; - } - - /** - * Return our specific texture - */ - protected ResourceLocation getEntityTexture(Entity par1Entity) - { - return textureLoc; - } - -} diff --git a/src/main/java/twilightforest/client/renderer/entity/RenderTFHydraMortar.java b/src/main/java/twilightforest/client/renderer/entity/RenderTFHydraMortar.java deleted file mode 100644 index 6d1a487eca..0000000000 --- a/src/main/java/twilightforest/client/renderer/entity/RenderTFHydraMortar.java +++ /dev/null @@ -1,93 +0,0 @@ -package twilightforest.client.renderer.entity; - -import net.minecraft.client.renderer.entity.Render; -import net.minecraft.entity.Entity; -import net.minecraft.util.ResourceLocation; - -import org.lwjgl.opengl.GL11; - -import twilightforest.TwilightForestMod; -import twilightforest.client.model.ModelTFHydraMortar; -import twilightforest.entity.boss.EntityTFHydraMortar; - -public class RenderTFHydraMortar extends Render { - - private ModelTFHydraMortar mortarModel; - private static final ResourceLocation textureLoc = new ResourceLocation(TwilightForestMod.MODEL_DIR + "hydramortar.png"); - - - public RenderTFHydraMortar() - { - mortarModel = new ModelTFHydraMortar(); - this.shadowSize = 0.5F; - } - - - /** - * Actually renders the given argument. This is a synthetic bridge method, always casting down its argument and then - * handing it off to a worker function which does the actual work. In all probabilty, the class Render is generic - * (Render 1.0F) - { - var10 = 1.0F; - } - - var10 *= var10; - var10 *= var10; - float var11 = 1.0F + var10 * 0.3F; - GL11.glScalef(var11, var11, var11); - } - - var10 = (1.0F - ((float)mortar.fuse - partialTick + 1.0F) / 100.0F) * 0.8F; - //this.loadTexture(TwilightForestMod.MODEL_DIR + "hydramortar.png"); - this.bindTexture(textureLoc); - - mortarModel.render(0.075F); - - if (mortar.fuse / 5 % 2 == 0) - { - GL11.glDisable(GL11.GL_TEXTURE_2D); - GL11.glDisable(GL11.GL_LIGHTING); - GL11.glEnable(GL11.GL_BLEND); - GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_DST_ALPHA); - GL11.glColor4f(1.0F, 1.0F, 1.0F, var10); - - mortarModel.render(0.075F); - - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - GL11.glDisable(GL11.GL_BLEND); - GL11.glEnable(GL11.GL_LIGHTING); - GL11.glEnable(GL11.GL_TEXTURE_2D); - } - - GL11.glPopMatrix(); - } - - /** - * Return our specific texture - */ - protected ResourceLocation getEntityTexture(Entity par1Entity) - { - return textureLoc; - } -} diff --git a/src/main/java/twilightforest/client/renderer/entity/RenderTFIceCrystal.java b/src/main/java/twilightforest/client/renderer/entity/RenderTFIceCrystal.java deleted file mode 100644 index 4f0d816e4d..0000000000 --- a/src/main/java/twilightforest/client/renderer/entity/RenderTFIceCrystal.java +++ /dev/null @@ -1,41 +0,0 @@ -package twilightforest.client.renderer.entity; - -import net.minecraft.client.renderer.entity.RenderLiving; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.util.MathHelper; -import net.minecraft.util.ResourceLocation; - -import org.lwjgl.opengl.GL11; - -import twilightforest.TwilightForestMod; -import twilightforest.client.model.ModelTFIceCrystal; - -public class RenderTFIceCrystal extends RenderLiving { - - private static final ResourceLocation textureLoc = new ResourceLocation(TwilightForestMod.MODEL_DIR + "icecrystal.png"); - - - public RenderTFIceCrystal() { - super(new ModelTFIceCrystal(), 1.0F); - } - - - /** - * Allows the render to do any OpenGL state modifications necessary before the model is rendered. Args: - * entityLiving, partialTickTime - */ - protected void preRenderCallback(EntityLivingBase par1EntityLivingBase, float partialTick) - { - float bounce = par1EntityLivingBase.ticksExisted + partialTick; - - GL11.glTranslatef(0F, MathHelper.sin((bounce) * 0.2F) * 0.15F, 0F); - } - - - @Override - protected ResourceLocation getEntityTexture(Entity var1) { - return RenderTFIceCrystal.textureLoc; - } - -} diff --git a/src/main/java/twilightforest/client/renderer/entity/RenderTFIceExploder.java b/src/main/java/twilightforest/client/renderer/entity/RenderTFIceExploder.java deleted file mode 100644 index 4e4d0bf8bc..0000000000 --- a/src/main/java/twilightforest/client/renderer/entity/RenderTFIceExploder.java +++ /dev/null @@ -1,94 +0,0 @@ -package twilightforest.client.renderer.entity; - -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.util.MathHelper; - -import org.lwjgl.opengl.GL11; - -import twilightforest.client.model.ModelTFIceExploder; - -public class RenderTFIceExploder extends RenderTFBiped { - - public RenderTFIceExploder() { - super(new ModelTFIceExploder(), 1.0F, "iceexploder.png"); - } - - /** - * Allows the render to do any OpenGL state modifications necessary before the model is rendered. Args: - * entityLiving, partialTickTime - */ - protected void preRenderCallback(EntityLivingBase par1EntityLivingBase, float partialTick) - { - float bounce = par1EntityLivingBase.ticksExisted + partialTick; - - GL11.glTranslatef(0F, MathHelper.sin((bounce) * 0.2F) * 0.15F, 0F); - - // flash - - float f1 = par1EntityLivingBase.deathTime; - if (f1 > 0) { - float f2 = 1.0F + MathHelper.sin(f1 * 100.0F) * f1 * 0.01F; - - if (f1 < 0.0F) - { - f1 = 0.0F; - } - - if (f1 > 1.0F) - { - f1 = 1.0F; - } - - f1 *= f1; - f1 *= f1; - float f3 = (1.0F + f1 * 0.4F) * f2; - float f4 = (1.0F + f1 * 0.1F) / f2; - GL11.glScalef(f3, f4, f3); - } - } - - protected void rotateCorpse(EntityLivingBase par1EntityLivingBase, float par2, float par3, float par4) - { - GL11.glRotatef(180.0F - par3, 0.0F, 1.0F, 0.0F); - } - - - /** - * Returns an ARGB int color back. Args: entityLiving, lightBrightness, partialTickTime - */ - protected int getColorMultiplier(EntityLivingBase par1EntityLivingBase, float par2, float par3) - { - if (par1EntityLivingBase.deathTime > 0) { - float f2 = par1EntityLivingBase.deathTime + par3; - - if ((int)(f2 / 2) % 2 == 0) - { - return 0; - } - else - { - int i = (int)(f2 * 0.2F * 255.0F); - - if (i < 0) - { - i = 0; - } - - if (i > 255) - { - i = 255; - } - - short short1 = 255; - short short2 = 255; - short short3 = 255; - return i << 24 | short1 << 16 | short2 << 8 | short3; - } - } else { - return 0; - } - } - -} - - diff --git a/src/main/java/twilightforest/client/renderer/entity/RenderTFIceShooter.java b/src/main/java/twilightforest/client/renderer/entity/RenderTFIceShooter.java deleted file mode 100644 index 5860f861b9..0000000000 --- a/src/main/java/twilightforest/client/renderer/entity/RenderTFIceShooter.java +++ /dev/null @@ -1,27 +0,0 @@ -package twilightforest.client.renderer.entity; - -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.util.MathHelper; - -import org.lwjgl.opengl.GL11; - -import twilightforest.client.model.ModelTFIceShooter; -import twilightforest.client.renderer.entity.RenderTFBiped; - -public class RenderTFIceShooter extends RenderTFBiped { - - public RenderTFIceShooter() { - super(new ModelTFIceShooter(), 1.0F, "iceshooter.png"); - } - - /** - * Allows the render to do any OpenGL state modifications necessary before the model is rendered. Args: - * entityLiving, partialTickTime - */ - protected void preRenderCallback(EntityLivingBase par1EntityLivingBase, float partialTick) - { - float bounce = par1EntityLivingBase.ticksExisted + partialTick; - - GL11.glTranslatef(0F, MathHelper.sin((bounce) * 0.2F) * 0.15F, 0F); - } -} diff --git a/src/main/java/twilightforest/client/renderer/entity/RenderTFKingSpider.java b/src/main/java/twilightforest/client/renderer/entity/RenderTFKingSpider.java deleted file mode 100644 index 6aa0c62de5..0000000000 --- a/src/main/java/twilightforest/client/renderer/entity/RenderTFKingSpider.java +++ /dev/null @@ -1,30 +0,0 @@ -package twilightforest.client.renderer.entity; - -import net.minecraft.client.renderer.entity.RenderSpider; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.util.ResourceLocation; - -import org.lwjgl.opengl.GL11; - -import twilightforest.TwilightForestMod; - -public class RenderTFKingSpider extends RenderSpider { - - private static final ResourceLocation textureLoc = new ResourceLocation(TwilightForestMod.MODEL_DIR + "kingspider.png"); - - @Override - protected ResourceLocation getEntityTexture(Entity entity) { - return textureLoc; - } - - /** - * Allows the render to do any OpenGL state modifications necessary before the model is rendered. Args: - * entityLiving, partialTickTime - */ - protected void preRenderCallback(EntityLivingBase par1EntityLivingBase, float par2) - { - float scale = 1.9F; - GL11.glScalef(scale, scale, scale); - } -} diff --git a/src/main/java/twilightforest/client/renderer/entity/RenderTFKnightPhantom.java b/src/main/java/twilightforest/client/renderer/entity/RenderTFKnightPhantom.java deleted file mode 100644 index 13f45422f9..0000000000 --- a/src/main/java/twilightforest/client/renderer/entity/RenderTFKnightPhantom.java +++ /dev/null @@ -1,38 +0,0 @@ -package twilightforest.client.renderer.entity; - -import net.minecraft.client.renderer.entity.RenderBiped; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.util.ResourceLocation; - -import org.lwjgl.opengl.GL11; - -import twilightforest.TwilightForestMod; -import twilightforest.client.model.ModelTFKnightPhantom2; -import twilightforest.entity.boss.EntityTFKnightPhantom; - -public class RenderTFKnightPhantom extends RenderBiped { - - private static final ResourceLocation textureLoc = new ResourceLocation(TwilightForestMod.MODEL_DIR + "phantomskeleton.png"); - - - public RenderTFKnightPhantom(ModelTFKnightPhantom2 modelTFKnightPhantom2, float f) { - super(modelTFKnightPhantom2, f); - } - - @Override - protected ResourceLocation getEntityTexture(Entity entity) { - return textureLoc; - } - - /** - * Allows the render to do any OpenGL state modifications necessary before the model is rendered. Args: - * entityLiving, partialTickTime - */ - protected void preRenderCallback(EntityLivingBase par1EntityLivingBase, float par2) - { - float scale = ((EntityTFKnightPhantom)par1EntityLivingBase).isChargingAtPlayer() ? 1.8F : 1.2F; - GL11.glScalef(scale, scale, scale); - } - -} diff --git a/src/main/java/twilightforest/client/renderer/entity/RenderTFKobold.java b/src/main/java/twilightforest/client/renderer/entity/RenderTFKobold.java deleted file mode 100644 index 5f2a861e94..0000000000 --- a/src/main/java/twilightforest/client/renderer/entity/RenderTFKobold.java +++ /dev/null @@ -1,134 +0,0 @@ -package twilightforest.client.renderer.entity; - -import java.util.UUID; - -import org.lwjgl.opengl.GL11; - -import com.mojang.authlib.GameProfile; - -import net.minecraft.block.Block; -import net.minecraft.client.model.ModelBiped; -import net.minecraft.client.renderer.RenderBlocks; -import net.minecraft.client.renderer.tileentity.TileEntitySkullRenderer; -import net.minecraft.entity.EntityLiving; -import net.minecraft.init.Items; -import net.minecraft.item.Item; -import net.minecraft.item.ItemBlock; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.nbt.NBTUtil; -import net.minecraft.util.StringUtils; - -public class RenderTFKobold extends RenderTFBiped { - - public RenderTFKobold(ModelBiped modelBiped, float scale, String textureName) { - super(modelBiped, scale, textureName); - } - - - protected void renderEquippedItems(EntityLiving p_77029_1_, float p_77029_2_) - { - GL11.glColor3f(1.0F, 1.0F, 1.0F); - //super.renderEquippedItems(p_77029_1_, p_77029_2_); - ItemStack itemstack = p_77029_1_.getHeldItem(); - ItemStack itemstack1 = p_77029_1_.func_130225_q(3); - Item item; - float f1; - - // no armor - - if (itemstack != null && itemstack.getItem() != null) - { - item = itemstack.getItem(); - GL11.glPushMatrix(); - - this.modelBipedMain.bipedRightArm.postRender(0.0625F); - GL11.glTranslatef(-0.0625F, 0.4375F, 0.0625F); - - net.minecraftforge.client.IItemRenderer customRenderer = net.minecraftforge.client.MinecraftForgeClient.getItemRenderer(itemstack, net.minecraftforge.client.IItemRenderer.ItemRenderType.EQUIPPED); - boolean is3D = (customRenderer != null && customRenderer.shouldUseRenderHelper(net.minecraftforge.client.IItemRenderer.ItemRenderType.EQUIPPED, itemstack, net.minecraftforge.client.IItemRenderer.ItemRendererHelper.BLOCK_3D)); - - if (item instanceof ItemBlock && (is3D || RenderBlocks.renderItemIn3d(Block.getBlockFromItem(item).getRenderType()))) - { - f1 = 0.5F; - GL11.glTranslatef(0.0F, 0.1875F, -0.3125F); - f1 *= 0.75F; - GL11.glRotatef(20.0F, 1.0F, 0.0F, 0.0F); - GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F); - GL11.glScalef(-f1, -f1, f1); - } - else if (item == Items.bow) - { - f1 = 0.625F; - GL11.glTranslatef(0.0F, 0.125F, 0.3125F); - GL11.glRotatef(-20.0F, 0.0F, 1.0F, 0.0F); - GL11.glScalef(f1, -f1, f1); - GL11.glRotatef(-100.0F, 1.0F, 0.0F, 0.0F); - GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F); - } - else if (item.isFull3D()) - { - f1 = 0.625F; - - if (item.shouldRotateAroundWhenRendering()) - { - GL11.glRotatef(180.0F, 0.0F, 0.0F, 1.0F); - GL11.glTranslatef(0.0F, -0.125F, 0.0F); - } - - this.func_82422_c(); - GL11.glScalef(f1, -f1, f1); - GL11.glRotatef(-100.0F, 1.0F, 0.0F, 0.0F); - GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F); - } - else - { - f1 = 0.375F; - GL11.glTranslatef(0.25F, 0.0F, -0.1875F); - this.func_82422_c(); // include short arms even when rendering non-tools - GL11.glScalef(f1, f1, f1); - GL11.glRotatef(60.0F, 0.0F, 0.0F, 1.0F); - GL11.glRotatef(-90.0F, 1.0F, 0.0F, 0.0F); - GL11.glRotatef(20.0F, 0.0F, 0.0F, 1.0F); - } - - float f2; - int i; - float f5; - - if (itemstack.getItem().requiresMultipleRenderPasses()) - { - for (i = 0; i < itemstack.getItem().getRenderPasses(itemstack.getItemDamage()); ++i) - { - int j = itemstack.getItem().getColorFromItemStack(itemstack, i); - f5 = (float)(j >> 16 & 255) / 255.0F; - f2 = (float)(j >> 8 & 255) / 255.0F; - float f3 = (float)(j & 255) / 255.0F; - GL11.glColor4f(f5, f2, f3, 1.0F); - this.renderManager.itemRenderer.renderItem(p_77029_1_, itemstack, i); - } - } - else - { - i = itemstack.getItem().getColorFromItemStack(itemstack, 0); - float f4 = (float)(i >> 16 & 255) / 255.0F; - f5 = (float)(i >> 8 & 255) / 255.0F; - f2 = (float)(i & 255) / 255.0F; - GL11.glColor4f(f4, f5, f2, 1.0F); - this.renderManager.itemRenderer.renderItem(p_77029_1_, itemstack, 0); - } - - GL11.glPopMatrix(); - } - } - - - /** - * How far down the arm should we render the equipped item? - */ - protected void func_82422_c() - { - GL11.glTranslatef(0.0F, 0.01875F, 0.0F); - } - -} diff --git a/src/main/java/twilightforest/client/renderer/entity/RenderTFLich.java b/src/main/java/twilightforest/client/renderer/entity/RenderTFLich.java deleted file mode 100644 index 387b5d0d6e..0000000000 --- a/src/main/java/twilightforest/client/renderer/entity/RenderTFLich.java +++ /dev/null @@ -1,69 +0,0 @@ -package twilightforest.client.renderer.entity; - - -import net.minecraft.client.model.ModelBiped; -import net.minecraft.client.renderer.entity.RenderBiped; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.boss.BossStatus; -import net.minecraft.util.ResourceLocation; - -import org.lwjgl.opengl.GL11; - -import twilightforest.TwilightForestMod; -import twilightforest.client.model.ModelTFLich; -import twilightforest.entity.boss.EntityTFLich; - - - -public class RenderTFLich extends RenderBiped { - - public static EntityTFLich entityLich = null; - - private static final ResourceLocation textureLoc = new ResourceLocation(TwilightForestMod.MODEL_DIR + "twilightlich64.png"); - - - public RenderTFLich(ModelBiped modelbiped, float f) { - super(modelbiped, f); - this.setRenderPassModel(new ModelTFLich(true)); - } - - protected int shouldRenderPass(EntityLivingBase entity, int i, float f) - { - EntityTFLich lich = (EntityTFLich)entity; - if (i == 2) { - GL11.glEnable(3042 /*GL_BLEND*/); -// GL11.glDisable(3008 /*GL_ALPHA_TEST*/); - GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - if (lich.isShadowClone()) { - // clone alpha - float shadow = 0.33f; - GL11.glColor4f(shadow, shadow, shadow, 0.8F); - return 2; - } - else - { - if (lich.ticksExisted > 0) - { - BossStatus.setBossStatus(lich, false); - } - // shield alpha (shield texture already has alpha - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0f); - return 1; - } - - - } else { - return 0; - } - } - - /** - * Return our specific texture - */ - protected ResourceLocation getEntityTexture(Entity par1Entity) - { - return textureLoc; - } - -} diff --git a/src/main/java/twilightforest/client/renderer/entity/RenderTFMazeSlime.java b/src/main/java/twilightforest/client/renderer/entity/RenderTFMazeSlime.java deleted file mode 100644 index 0466dfd276..0000000000 --- a/src/main/java/twilightforest/client/renderer/entity/RenderTFMazeSlime.java +++ /dev/null @@ -1,26 +0,0 @@ -package twilightforest.client.renderer.entity; - -import net.minecraft.client.model.ModelBase; -import net.minecraft.client.renderer.entity.RenderSlime; -import net.minecraft.entity.Entity; -import net.minecraft.util.ResourceLocation; -import twilightforest.TwilightForestMod; - -public class RenderTFMazeSlime extends RenderSlime { - - - private static final ResourceLocation textureLoc = new ResourceLocation(TwilightForestMod.MODEL_DIR + "mazeslime.png"); - - public RenderTFMazeSlime(ModelBase par1ModelBase, ModelBase par2ModelBase, float par3) { - super(par1ModelBase, par2ModelBase, par3); - } - - - /** - * Return our specific texture - */ - protected ResourceLocation getEntityTexture(Entity par1Entity) - { - return textureLoc; - } -} diff --git a/src/main/java/twilightforest/client/renderer/entity/RenderTFMiniGhast.java b/src/main/java/twilightforest/client/renderer/entity/RenderTFMiniGhast.java deleted file mode 100644 index e9b5e44999..0000000000 --- a/src/main/java/twilightforest/client/renderer/entity/RenderTFMiniGhast.java +++ /dev/null @@ -1,49 +0,0 @@ -package twilightforest.client.renderer.entity; - -import net.minecraft.client.model.ModelBase; -import net.minecraft.client.renderer.entity.RenderLiving; -import net.minecraft.entity.Entity; -import net.minecraft.util.ResourceLocation; -import twilightforest.TwilightForestMod; -import twilightforest.entity.EntityTFTowerGhast; - -public class RenderTFMiniGhast extends RenderLiving { - - final ResourceLocation textureLocClosed; - final ResourceLocation textureLocOpen; - final ResourceLocation textureLocAttack; - - public RenderTFMiniGhast(ModelBase par1ModelBase, float par2) { - super(par1ModelBase, par2); - - textureLocClosed = new ResourceLocation(TwilightForestMod.MODEL_DIR + "towerghast.png"); - textureLocOpen = new ResourceLocation(TwilightForestMod.MODEL_DIR + "towerghast_openeyes.png"); - textureLocAttack = new ResourceLocation(TwilightForestMod.MODEL_DIR + "towerghast_fire.png"); - } - - /** - * Return our specific texture - */ - protected ResourceLocation getEntityTexture(Entity par1Entity) - { - if (par1Entity instanceof EntityTFTowerGhast) - { - switch (((EntityTFTowerGhast)par1Entity).getAttackStatus()) - { - default: - case 0: - return textureLocClosed; - - case 1: - return textureLocOpen; - - case 2: - return textureLocAttack; - } - } - - // fallback - return textureLocClosed; - } - -} diff --git a/src/main/java/twilightforest/client/renderer/entity/RenderTFMinoshroom.java b/src/main/java/twilightforest/client/renderer/entity/RenderTFMinoshroom.java deleted file mode 100644 index 385d27b3a6..0000000000 --- a/src/main/java/twilightforest/client/renderer/entity/RenderTFMinoshroom.java +++ /dev/null @@ -1,62 +0,0 @@ -package twilightforest.client.renderer.entity; - -import net.minecraft.client.model.ModelBiped; -import net.minecraft.client.renderer.entity.RenderBiped; -import net.minecraft.client.renderer.texture.TextureMap; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.init.Blocks; -import net.minecraft.util.ResourceLocation; - -import org.lwjgl.opengl.GL11; - -import twilightforest.TwilightForestMod; - -public class RenderTFMinoshroom extends RenderBiped { - - private static final ResourceLocation textureLoc = new ResourceLocation(TwilightForestMod.MODEL_DIR + "minoshroomtaur.png"); - - public RenderTFMinoshroom(ModelBiped par1ModelBase, float par2) { - super(par1ModelBase, par2); - } - - protected void renderMooshroomEquippedItems(EntityLivingBase par1EntityLiving, float par2) - { - super.renderEquippedItems(par1EntityLiving, par2); - - this.bindTexture(TextureMap.locationBlocksTexture); - GL11.glEnable(GL11.GL_CULL_FACE); - GL11.glPushMatrix(); - GL11.glScalef(1.0F, -1.0F, 1.0F); - GL11.glTranslatef(0.2F, 0.375F, 0.5F); - GL11.glRotatef(42.0F, 0.0F, 1.0F, 0.0F); - this.field_147909_c.renderBlockAsItem(Blocks.red_mushroom, 0, 1.0F); - GL11.glTranslatef(0.1F, 0.0F, -0.6F); - GL11.glRotatef(42.0F, 0.0F, 1.0F, 0.0F); - this.field_147909_c.renderBlockAsItem(Blocks.red_mushroom, 0, 1.0F); - GL11.glPopMatrix(); - GL11.glPushMatrix(); - ((ModelBiped)this.mainModel).bipedHead.postRender(0.0625F); - GL11.glScalef(1.0F, -1.0F, 1.0F); - GL11.glTranslatef(0.0F, 1.0F, 0F); - GL11.glRotatef(12.0F, 0.0F, 1.0F, 0.0F); - this.field_147909_c.renderBlockAsItem(Blocks.red_mushroom, 0, 1.0F); - GL11.glPopMatrix(); - GL11.glDisable(GL11.GL_CULL_FACE); - } - - @Override - protected void renderEquippedItems(EntityLivingBase par1EntityLiving, float par2) - { - this.renderMooshroomEquippedItems(par1EntityLiving, par2); - } - - /** - * Return our specific texture - */ - protected ResourceLocation getEntityTexture(Entity par1Entity) - { - return textureLoc; - } - -} diff --git a/src/main/java/twilightforest/client/renderer/entity/RenderTFMistWolf.java b/src/main/java/twilightforest/client/renderer/entity/RenderTFMistWolf.java deleted file mode 100644 index c653e9d2a8..0000000000 --- a/src/main/java/twilightforest/client/renderer/entity/RenderTFMistWolf.java +++ /dev/null @@ -1,69 +0,0 @@ -package twilightforest.client.renderer.entity; - -import net.minecraft.client.model.ModelBase; -import net.minecraft.client.renderer.entity.RenderWolf; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.util.ResourceLocation; - -import org.lwjgl.opengl.GL11; - -import twilightforest.TwilightForestMod; - -public class RenderTFMistWolf extends RenderWolf { - - private static final ResourceLocation textureLoc = new ResourceLocation(TwilightForestMod.MODEL_DIR + "mistwolf.png"); - - public RenderTFMistWolf(ModelBase par1ModelBase, ModelBase par2ModelBase, float par3) { - super(par1ModelBase, par2ModelBase, par3); - } - - - /** - * Allows the render to do any OpenGL state modifications necessary before the model is rendered. Args: - * entityLiving, partialTickTime - */ - protected void preRenderCallback(EntityLivingBase par1EntityLiving, float par2) - { - float wolfScale = 1.9F; - GL11.glScalef(wolfScale, wolfScale, wolfScale); - - GL11.glEnable(3042 /*GL_BLEND*/); - GL11.glDisable(3008 /*GL_ALPHA_TEST*/); - //GL11.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE); - GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - //GL11.glBlendFunc(GL11.GL_ONE_MINUS_DST_ALPHA, GL11.GL_DST_ALPHA); - - float misty = par1EntityLiving.getBrightness(0F) * 3F + 0.25F; - misty = Math.min(1F, misty); - - float smoky = par1EntityLiving.getBrightness(0F) * 2F + 0.6F; - - //System.out.println("Misty value is " + misty); - - GL11.glColor4f(misty, misty, misty, smoky); - - } - - /** - * Queries whether should render the specified pass or not. - */ - protected int shouldRenderPass(EntityLivingBase par1EntityLiving, int par2, float par3) - { -// GL11.glFogf(GL11.GL_FOG_START, 1.0f); -// GL11.glFogf(GL11.GL_FOG_END, 5.0f); - - - - return -1; - } - - /** - * Return our specific texture - */ - protected ResourceLocation getEntityTexture(Entity par1Entity) - { - return textureLoc; - } - -} diff --git a/src/main/java/twilightforest/client/renderer/entity/RenderTFMoonwormShot.java b/src/main/java/twilightforest/client/renderer/entity/RenderTFMoonwormShot.java deleted file mode 100644 index 2c93aa91de..0000000000 --- a/src/main/java/twilightforest/client/renderer/entity/RenderTFMoonwormShot.java +++ /dev/null @@ -1,52 +0,0 @@ -package twilightforest.client.renderer.entity; - -import net.minecraft.client.renderer.entity.Render; -import net.minecraft.entity.Entity; -import net.minecraft.util.ResourceLocation; - -import org.lwjgl.opengl.GL11; - -import twilightforest.TwilightForestMod; -import twilightforest.client.model.ModelTFMoonworm; - -public class RenderTFMoonwormShot extends Render { - - private ModelTFMoonworm wormModel; - private static final ResourceLocation textureLoc = new ResourceLocation(TwilightForestMod.MODEL_DIR + "moonworm.png"); - - - public RenderTFMoonwormShot() - { - wormModel = new ModelTFMoonworm(); - this.shadowSize = 0.5F; - } - - /** - * Actually renders the given argument. This is a synthetic bridge method, always casting down its argument and then - * handing it off to a worker function which does the actual work. In all probabilty, the class Render is generic - * (Render 0) - { - BossStatus.setBossStatus((EntityTFUrGhast)entity, false); - } - } - - /** - * Pre-Renders the Ghast. - */ - protected void preRenderGhast(EntityGhast par1EntityGhast, float par2) - { - float scaleVariable = ((float)par1EntityGhast.prevAttackCounter + (float)(par1EntityGhast.attackCounter - par1EntityGhast.prevAttackCounter) * par2) / 20.0F; - - if (scaleVariable < 0.0F) - { - scaleVariable = 0.0F; - } - - scaleVariable = 1.0F / (scaleVariable * scaleVariable * scaleVariable * scaleVariable * scaleVariable * 2.0F + 1.0F); - float yScale = (ghastScale + scaleVariable) / 2.0F; - float xzScale = (ghastScale + 1.0F / scaleVariable) / 2.0F; - GL11.glScalef(xzScale, yScale, xzScale); - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - } - - /** - * Allows the render to do any OpenGL state modifications necessary before the model is rendered. Args: - * entityLiving, partialTickTime - */ - protected void preRenderCallback(EntityLivingBase par1EntityLiving, float par2) - { - this.preRenderGhast((EntityGhast)par1EntityLiving, par2); - } - - -} diff --git a/src/main/java/twilightforest/client/renderer/entity/RenderTFTowerGolem.java b/src/main/java/twilightforest/client/renderer/entity/RenderTFTowerGolem.java deleted file mode 100644 index 111b164060..0000000000 --- a/src/main/java/twilightforest/client/renderer/entity/RenderTFTowerGolem.java +++ /dev/null @@ -1,52 +0,0 @@ -package twilightforest.client.renderer.entity; - -import net.minecraft.client.model.ModelBase; -import net.minecraft.client.renderer.entity.RenderLiving; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.util.ResourceLocation; - -import org.lwjgl.opengl.GL11; - -import twilightforest.TwilightForestMod; -import twilightforest.entity.EntityTFTowerGolem; - -public class RenderTFTowerGolem extends RenderLiving -{ - - private static final ResourceLocation textureLoc = new ResourceLocation(TwilightForestMod.MODEL_DIR + "carminitegolem.png"); - - public RenderTFTowerGolem(ModelBase par1ModelBase, float par2) - { - super(par1ModelBase, par2); - } - - - protected void rotateCorpse(EntityLivingBase par1EntityLiving, float par2, float par3, float par4) - { - this.rotateTowerGolem((EntityTFTowerGolem)par1EntityLiving, par2, par3, par4); - } - - - private void rotateTowerGolem(EntityTFTowerGolem par1EntityLiving, float par2, float par3, float par4) - { - super.rotateCorpse(par1EntityLiving, par2, par3, par4); - - if ((double)par1EntityLiving.limbSwingAmount >= 0.01D) - { - float var5 = 13.0F; - float var6 = par1EntityLiving.limbSwing - par1EntityLiving.limbSwingAmount * (1.0F - par4) + 6.0F; - float var7 = (Math.abs(var6 % var5 - var5 * 0.5F) - var5 * 0.25F) / (var5 * 0.25F); - GL11.glRotatef(6.5F * var7, 0.0F, 0.0F, 1.0F); - } - } - - /** - * Return our specific texture - */ - protected ResourceLocation getEntityTexture(Entity par1Entity) - { - return textureLoc; - } - -} diff --git a/src/main/java/twilightforest/client/renderer/entity/RenderTFUrGhast.java b/src/main/java/twilightforest/client/renderer/entity/RenderTFUrGhast.java deleted file mode 100644 index 94d63071e4..0000000000 --- a/src/main/java/twilightforest/client/renderer/entity/RenderTFUrGhast.java +++ /dev/null @@ -1,50 +0,0 @@ -package twilightforest.client.renderer.entity; - -import net.minecraft.entity.Entity; -import net.minecraft.util.ResourceLocation; -import twilightforest.TwilightForestMod; -import twilightforest.client.model.ModelTFGhast; -import twilightforest.entity.EntityTFTowerGhast; - - -public class RenderTFUrGhast extends RenderTFTowerGhast { - - - final ResourceLocation textureLocClosed; - final ResourceLocation textureLocOpen; - final ResourceLocation textureLocAttack; - - - public RenderTFUrGhast(ModelTFGhast modelTFGhast, float f, float scale) { - super(modelTFGhast, f, scale); - textureLocClosed = new ResourceLocation(TwilightForestMod.MODEL_DIR + "towerboss.png"); - textureLocOpen = new ResourceLocation(TwilightForestMod.MODEL_DIR + "towerboss_openeyes.png"); - textureLocAttack = new ResourceLocation(TwilightForestMod.MODEL_DIR + "towerboss_fire.png"); - } - - - /** - * Return our specific texture - */ - protected ResourceLocation getEntityTexture(Entity par1Entity) - { - if (par1Entity instanceof EntityTFTowerGhast) - { - switch (((EntityTFTowerGhast)par1Entity).getAttackStatus()) - { - default: - case 0: - return textureLocClosed; - - case 1: - return textureLocOpen; - - case 2: - return textureLocAttack; - } - } - - // fallback - return textureLocClosed; - } -} diff --git a/src/main/java/twilightforest/client/renderer/entity/RenderTFWinterWolf.java b/src/main/java/twilightforest/client/renderer/entity/RenderTFWinterWolf.java deleted file mode 100644 index d6a03811fd..0000000000 --- a/src/main/java/twilightforest/client/renderer/entity/RenderTFWinterWolf.java +++ /dev/null @@ -1,69 +0,0 @@ -package twilightforest.client.renderer.entity; - -import net.minecraft.client.model.ModelBase; -import net.minecraft.client.renderer.entity.RenderWolf; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.util.ResourceLocation; - -import org.lwjgl.opengl.GL11; - -import twilightforest.TwilightForestMod; - -public class RenderTFWinterWolf extends RenderWolf { - - private static final ResourceLocation textureLoc = new ResourceLocation(TwilightForestMod.MODEL_DIR + "winterwolf.png"); - - public RenderTFWinterWolf(ModelBase par1ModelBase, ModelBase par2ModelBase, float par3) { - super(par1ModelBase, par2ModelBase, par3); - } - - - /** - * Allows the render to do any OpenGL state modifications necessary before the model is rendered. Args: - * entityLiving, partialTickTime - */ - protected void preRenderCallback(EntityLivingBase par1EntityLiving, float par2) - { - float wolfScale = 1.9F; - GL11.glScalef(wolfScale, wolfScale, wolfScale); - -// GL11.glEnable(3042 /*GL_BLEND*/); -// GL11.glDisable(3008 /*GL_ALPHA_TEST*/); -// //GL11.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE); -// GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); -// //GL11.glBlendFunc(GL11.GL_ONE_MINUS_DST_ALPHA, GL11.GL_DST_ALPHA); -// -// float misty = par1EntityLiving.getBrightness(0F) * 3F + 0.25F; -// misty = Math.min(1F, misty); -// -// float smoky = par1EntityLiving.getBrightness(0F) * 2F + 0.6F; -// -// //System.out.println("Misty value is " + misty); -// -// GL11.glColor4f(misty, misty, misty, smoky); - - } - - /** - * Queries whether should render the specified pass or not. - */ - protected int shouldRenderPass(EntityLivingBase par1EntityLiving, int par2, float par3) - { -// GL11.glFogf(GL11.GL_FOG_START, 1.0f); -// GL11.glFogf(GL11.GL_FOG_END, 5.0f); - - - - return -1; - } - - /** - * Return our specific texture - */ - protected ResourceLocation getEntityTexture(Entity par1Entity) - { - return textureLoc; - } - -} diff --git a/src/main/java/twilightforest/client/renderer/entity/RenderTFWraith.java b/src/main/java/twilightforest/client/renderer/entity/RenderTFWraith.java deleted file mode 100644 index 365ffeae14..0000000000 --- a/src/main/java/twilightforest/client/renderer/entity/RenderTFWraith.java +++ /dev/null @@ -1,54 +0,0 @@ -package twilightforest.client.renderer.entity; - - -import net.minecraft.client.model.ModelBiped; -import net.minecraft.client.renderer.entity.RenderBiped; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.util.ResourceLocation; - -import org.lwjgl.opengl.GL11; - -import twilightforest.TwilightForestMod; - - -public class RenderTFWraith extends RenderBiped { - - //texture = TwilightForestMod.MODEL_DIR + "ghost-crown.png"; - - private static final ResourceLocation textureWraith = new ResourceLocation(TwilightForestMod.MODEL_DIR + "ghost.png"); - private static final ResourceLocation textureCrown = new ResourceLocation(TwilightForestMod.MODEL_DIR + "ghost-crown.png"); - - public RenderTFWraith(ModelBiped modelbiped, float f) { - super(modelbiped, f); - } - - - protected int shouldRenderPass(EntityLivingBase entityliving, int i, float f) - { - setRenderPassModel(this.mainModel); - - if (i == 1) { - this.bindTexture(textureWraith); - GL11.glEnable(3042 /*GL_BLEND*/); - GL11.glDisable(3008 /*GL_ALPHA_TEST*/); - GL11.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE); - //GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - //GL11.glBlendFunc(GL11.GL_ONE_MINUS_DST_ALPHA, GL11.GL_DST_ALPHA); - GL11.glColor4f(1.0F, 1.0F, 1.0F, 0.5f); - - return 1; - } else { - return 0; - } - } - - /** - * Return our specific texture - */ - protected ResourceLocation getEntityTexture(Entity par1Entity) - { - return textureCrown; - } - -} diff --git a/src/main/java/twilightforest/client/renderer/entity/RenderTFYeti.java b/src/main/java/twilightforest/client/renderer/entity/RenderTFYeti.java deleted file mode 100644 index 4649562530..0000000000 --- a/src/main/java/twilightforest/client/renderer/entity/RenderTFYeti.java +++ /dev/null @@ -1,23 +0,0 @@ -package twilightforest.client.renderer.entity; - -import net.minecraft.client.model.ModelBiped; -import net.minecraft.entity.EntityLivingBase; - -import org.lwjgl.opengl.GL11; - -public class RenderTFYeti extends RenderTFBiped { - - public RenderTFYeti(ModelBiped modelBiped, float scale, String textureName) { - super(modelBiped, scale, textureName); - } - - /** - * Allows the render to do any OpenGL state modifications necessary before the model is rendered. Args: - * entityLiving, partialTickTime - */ - protected void preRenderCallback(EntityLivingBase par1EntityLivingBase, float par2) - { - float scale = 1.0F; - GL11.glScalef(scale, scale, scale); - } -} diff --git a/src/main/java/twilightforest/client/renderer/entity/RovingCubeRenderer.java b/src/main/java/twilightforest/client/renderer/entity/RovingCubeRenderer.java new file mode 100644 index 0000000000..920717fdf8 --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/entity/RovingCubeRenderer.java @@ -0,0 +1,47 @@ +package twilightforest.client.renderer.entity; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.math.Axis; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.entity.EntityRenderer; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.model.Model; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import org.joml.Vector3f; +import twilightforest.TwilightForestMod; +import twilightforest.client.model.TFModelLayers; +import twilightforest.client.model.entity.CubeOfAnnihilationModel; +import twilightforest.entity.RovingCube; + +public class RovingCubeRenderer extends EntityRenderer { + + private static final ResourceLocation textureLoc = TwilightForestMod.getModelTexture("cubeofannihilation.png"); + private final Model model; + + public RovingCubeRenderer(EntityRendererProvider.Context manager) { + super(manager); + this.model = new CubeOfAnnihilationModel(manager.bakeLayer(TFModelLayers.CUBE_OF_ANNIHILATION)); + } + + @Override + public void render(T entity, float yaw, float partialTicks, PoseStack stack, MultiBufferSource buffer, int light) { + stack.pushPose(); + + VertexConsumer builder = buffer.getBuffer(model.renderType(textureLoc)); + + stack.scale(2.0F, 2.0F, 2.0F); + stack.mulPose(Axis.YP.rotationDegrees(Mth.wrapDegrees(entity.tickCount + partialTicks) * 11F)); + stack.translate(0F, 0.75F, 0F); + this.model.renderToBuffer(stack, builder, light, OverlayTexture.NO_OVERLAY, 1.0F, 1.0F, 1.0F, 1.0F); + + stack.popPose(); + } + + @Override + public ResourceLocation getTextureLocation(T entity) { + return textureLoc; + } +} diff --git a/src/main/java/twilightforest/client/renderer/entity/ShieldLayer.java b/src/main/java/twilightforest/client/renderer/entity/ShieldLayer.java new file mode 100644 index 0000000000..9ae47c804b --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/entity/ShieldLayer.java @@ -0,0 +1,91 @@ +package twilightforest.client.renderer.entity; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Axis; +import org.joml.Vector3f; +import net.minecraft.client.Minecraft; +import net.minecraft.client.model.EntityModel; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.Sheets; +import net.minecraft.client.renderer.entity.RenderLayerParent; +import net.minecraft.client.renderer.entity.layers.RenderLayer; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.client.resources.model.BakedModel; +import net.minecraft.client.resources.model.ModelResourceLocation; +import net.minecraft.core.Direction; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.client.model.data.ModelData; +import org.apache.commons.lang3.ArrayUtils; +import twilightforest.TwilightForestMod; +import twilightforest.capabilities.CapabilityList; +import twilightforest.capabilities.shield.IShieldCapability; +import twilightforest.entity.boss.Lich; + +public class ShieldLayer> extends RenderLayer { + + public static final ModelResourceLocation LOC = new ModelResourceLocation(new ResourceLocation(TwilightForestMod.ID, "shield"), "inventory"); + private static final Direction[] DIRS = ArrayUtils.add(Direction.values(), null); + + public ShieldLayer(RenderLayerParent renderer) { + super(renderer); + } + + private int getShieldCount(T entity) { + return entity instanceof Lich + ? ((Lich) entity).getShieldStrength() + : entity.getCapability(CapabilityList.SHIELDS).map(IShieldCapability::shieldsLeft).orElse(0); + } + + private void renderShields(PoseStack stack, MultiBufferSource buffer, T entity, float partialTicks) { + float age = entity.tickCount + partialTicks; + float rotateAngleY = age / 5.0F; + float rotateAngleX = Mth.sin(age / 5.0F) / 4.0F; + float rotateAngleZ = Mth.cos(age / 5.0F) / 4.0F; + + int count = getShieldCount(entity); + for (int c = 0; c < count; c++) { + stack.pushPose(); + + // shift to the torso + stack.translate(-0.5, 0.5, -0.5); + + // invert Y + stack.scale(1, -1, 1); + + // perform the rotations, accounting for the fact that baked models are corner-based + stack.translate(0.5, 0.5, 0.5); + stack.mulPose(Axis.ZP.rotationDegrees(rotateAngleZ * (180F / (float) Math.PI))); + stack.mulPose(Axis.YP.rotationDegrees(rotateAngleY * (180F / (float) Math.PI) + (c * (360F / count)))); + stack.mulPose(Axis.XP.rotationDegrees(rotateAngleX * (180F / (float) Math.PI))); + stack.translate(-0.5, -0.5, -0.5); + + // push the shields outwards from the center of rotation + stack.translate(0F, 0F, -0.7F); + + BakedModel model = Minecraft.getInstance().getModelManager().getModel(LOC); + for (Direction dir : DIRS) { + Minecraft.getInstance().getItemRenderer().renderQuadList( + stack, + buffer.getBuffer(Sheets.translucentCullBlockSheet()), + model.getQuads(null, dir, entity.getRandom(), ModelData.EMPTY, Sheets.translucentCullBlockSheet()), + ItemStack.EMPTY, + 0xF000F0, + OverlayTexture.NO_OVERLAY + ); + } + + stack.popPose(); + } + } + + @Override + public void render(PoseStack stack, MultiBufferSource buffer, int light, T living, float limbSwing, float limbSwingAmount, float partialTicks, float ageInTicks, float netHeadYaw, float headPitch) { + if (getShieldCount(living) > 0) { + renderShields(stack, buffer, living, partialTicks); + } + } +} diff --git a/src/main/java/twilightforest/client/renderer/entity/SlideBlockRenderer.java b/src/main/java/twilightforest/client/renderer/entity/SlideBlockRenderer.java new file mode 100644 index 0000000000..de88b61f4f --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/entity/SlideBlockRenderer.java @@ -0,0 +1,74 @@ +package twilightforest.client.renderer.entity; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Axis; +import org.joml.Vector3f; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.block.BlockRenderDispatcher; +import net.minecraft.client.renderer.entity.EntityRenderer; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.client.renderer.texture.TextureAtlas; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.RenderShape; +import net.minecraft.world.level.block.RotatedPillarBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.client.model.data.ModelData; +import twilightforest.entity.SlideBlock; + +public class SlideBlockRenderer extends EntityRenderer { + + public SlideBlockRenderer(EntityRendererProvider.Context manager) { + super(manager); + shadowRadius = 0.0f; + } + + // [VanillaCopy] RenderFallingBlock, with spin + @Override + public void render(SlideBlock entity, float yaw, float partialTicks, PoseStack stack, MultiBufferSource buffer, int light) { + if (entity.getBlockState() != null) { + BlockState blockstate = entity.getBlockState(); + + if (blockstate.getRenderShape() == RenderShape.MODEL) { + Level world = entity.level; + + if (blockstate != world.getBlockState(entity.blockPosition()) && blockstate.getRenderShape() != RenderShape.INVISIBLE) { + stack.pushPose(); + BlockPos blockpos = BlockPos.containing(entity.getX(), entity.getBoundingBox().maxY, entity.getZ()); + // spin + if (blockstate.getProperties().contains(RotatedPillarBlock.AXIS)) { + Direction.Axis axis = blockstate.getValue(RotatedPillarBlock.AXIS); + float angle = (entity.tickCount + partialTicks) * 60F; + stack.translate(0.0, 0.5, 0.0); + if (axis == Direction.Axis.Y) { + stack.mulPose(Axis.YP.rotationDegrees(angle)); + } else if (axis == Direction.Axis.X) { + stack.mulPose(Axis.XP.rotationDegrees(angle)); + } else if (axis == Direction.Axis.Z) { + stack.mulPose(Axis.ZP.rotationDegrees(angle)); + } + stack.translate(-0.5, -0.5, -0.5); + } + + BlockRenderDispatcher dispatcher = Minecraft.getInstance().getBlockRenderer(); + var model = dispatcher.getBlockModel(blockstate); + for (var renderType : model.getRenderTypes(blockstate, RandomSource.create(blockstate.getSeed(entity.blockPosition())), ModelData.EMPTY)) + dispatcher.getModelRenderer().tesselateBlock(world, model, blockstate, blockpos, stack, buffer.getBuffer(renderType), false, RandomSource.create(), blockstate.getSeed(entity.blockPosition()), OverlayTexture.NO_OVERLAY, ModelData.EMPTY, renderType); + + stack.popPose(); + super.render(entity, yaw, partialTicks, stack, buffer, light); + } + } + } + } + + @Override + public ResourceLocation getTextureLocation(SlideBlock entity) { + return TextureAtlas.LOCATION_BLOCKS; + } +} diff --git a/src/main/java/twilightforest/client/renderer/entity/SlimeBeetleRenderer.java b/src/main/java/twilightforest/client/renderer/entity/SlimeBeetleRenderer.java new file mode 100644 index 0000000000..3b99e5b55e --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/entity/SlimeBeetleRenderer.java @@ -0,0 +1,51 @@ +package twilightforest.client.renderer.entity; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.entity.RenderLayerParent; +import net.minecraft.client.renderer.entity.LivingEntityRenderer; +import net.minecraft.client.renderer.entity.MobRenderer; +import net.minecraft.client.renderer.entity.layers.RenderLayer; +import net.minecraft.resources.ResourceLocation; +import twilightforest.TwilightForestMod; +import twilightforest.client.model.TFModelLayers; +import twilightforest.client.model.entity.SlimeBeetleModel; +import twilightforest.entity.monster.SlimeBeetle; + +public class SlimeBeetleRenderer extends MobRenderer { + + private static final ResourceLocation textureLoc = TwilightForestMod.getModelTexture("slimebeetle.png"); + + public SlimeBeetleRenderer(EntityRendererProvider.Context manager, SlimeBeetleModel model, float shadowSize) { + super(manager, model, shadowSize); + this.addLayer(new LayerInner(this, manager)); + } + + @Override + public ResourceLocation getTextureLocation(SlimeBeetle entity) { + return textureLoc; + } + + static class LayerInner extends RenderLayer { + private final SlimeBeetleModel innerModel; + + public LayerInner(RenderLayerParent renderer, EntityRendererProvider.Context manager) { + super(renderer); + innerModel = new SlimeBeetleModel(manager.bakeLayer(TFModelLayers.SLIME_BEETLE_TAIL)); + } + + @Override + public void render(PoseStack ms, MultiBufferSource buffers, int light, SlimeBeetle entity, float limbSwing, float limbSwingAmount, float partialTicks, float ageInTicks, float netHeadYaw, float headPitch) { + if (!entity.isInvisible()) { + innerModel.copyPropertiesTo(getParentModel()); + innerModel.prepareMobModel(entity, limbSwing, limbSwingAmount, partialTicks); + innerModel.setupAnim(entity, limbSwing, limbSwingAmount, ageInTicks, netHeadYaw, headPitch); + VertexConsumer buffer = buffers.getBuffer(RenderType.entityTranslucent(getTextureLocation(entity))); + innerModel.renderTail(ms, buffer, light, LivingEntityRenderer.getOverlayCoords(entity, 0), 1, 1, 1, 1); + } + } + } +} diff --git a/src/main/java/twilightforest/client/renderer/entity/SnowGuardianRenderer.java b/src/main/java/twilightforest/client/renderer/entity/SnowGuardianRenderer.java new file mode 100644 index 0000000000..df28281876 --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/entity/SnowGuardianRenderer.java @@ -0,0 +1,25 @@ +package twilightforest.client.renderer.entity; + +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.model.geom.ModelLayers; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.entity.layers.HumanoidArmorLayer; +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.util.Mth; +import twilightforest.client.model.TFModelLayers; +import twilightforest.client.model.entity.NoopModel; +import twilightforest.entity.monster.SnowGuardian; + +public class SnowGuardianRenderer extends TFBipedRenderer> { + + public SnowGuardianRenderer(EntityRendererProvider.Context context, NoopModel model) { + super(context, model, new NoopModel<>(context.bakeLayer(TFModelLayers.NOOP)), new NoopModel<>(context.bakeLayer(TFModelLayers.NOOP)), 0.25F, "textures/entity/zombie/zombie.png"); + this.addLayer(new HumanoidArmorLayer<>(this, new HumanoidModel<>(context.bakeLayer(ModelLayers.PLAYER_INNER_ARMOR)), new HumanoidModel<>(context.bakeLayer(ModelLayers.PLAYER_OUTER_ARMOR)), context.getModelManager())); + } + + @Override + protected void scale(SnowGuardian entity, PoseStack stack, float partialTicks) { + float bounce = entity.tickCount + partialTicks; + stack.translate(0F, Mth.sin((bounce) * 0.2F) * 0.15F, 0F); + } +} diff --git a/src/main/java/twilightforest/client/renderer/entity/SnowQueenIceShieldLayer.java b/src/main/java/twilightforest/client/renderer/entity/SnowQueenIceShieldLayer.java new file mode 100644 index 0000000000..c736ff22f7 --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/entity/SnowQueenIceShieldLayer.java @@ -0,0 +1,53 @@ +package twilightforest.client.renderer.entity; + +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.util.RandomSource; +import net.minecraft.world.inventory.InventoryMenu; +import net.minecraft.world.level.block.RenderShape; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.block.BlockRenderDispatcher; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.ItemBlockRenderTypes; +import net.minecraft.client.renderer.entity.EntityRenderer; +import net.minecraft.client.renderer.texture.TextureAtlas; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Level; +import net.minecraftforge.client.model.data.ModelData; +import twilightforest.entity.boss.SnowQueenIceShield; + +import java.util.Random; + +public class SnowQueenIceShieldLayer extends EntityRenderer { + public SnowQueenIceShieldLayer(EntityRendererProvider.Context renderManager) { + super(renderManager); + } + + @Override + public void render(T entityIn, float entityYaw, float partialTicks, PoseStack matrixStackIn, MultiBufferSource bufferIn, int packedLightIn) { + BlockState blockstate = Blocks.PACKED_ICE.defaultBlockState(); + if (blockstate.getRenderShape() == RenderShape.MODEL) { + Level world = entityIn.level; + if (blockstate.getRenderShape() != RenderShape.INVISIBLE) { + matrixStackIn.pushPose(); + BlockPos blockpos = BlockPos.containing(entityIn.getX(), entityIn.getBoundingBox().maxY, entityIn.getZ()); + matrixStackIn.translate(-0.5D, 0.0D, -0.5D); + BlockRenderDispatcher dispatcher = Minecraft.getInstance().getBlockRenderer(); + var model = dispatcher.getBlockModel(blockstate); + for (var renderType : model.getRenderTypes(blockstate, RandomSource.create(blockstate.getSeed(entityIn.blockPosition())), ModelData.EMPTY)) + dispatcher.getModelRenderer().tesselateBlock(world, model, blockstate, blockpos, matrixStackIn, bufferIn.getBuffer(renderType), false, RandomSource.create(), blockstate.getSeed(entityIn.blockPosition()), OverlayTexture.NO_OVERLAY, ModelData.EMPTY, renderType); + matrixStackIn.popPose(); + super.render(entityIn, entityYaw, partialTicks, matrixStackIn, bufferIn, packedLightIn); + } + } + } + + @Override + public ResourceLocation getTextureLocation(T entity) { + return InventoryMenu.BLOCK_ATLAS; + } +} diff --git a/src/main/java/twilightforest/client/renderer/entity/SnowQueenRenderer.java b/src/main/java/twilightforest/client/renderer/entity/SnowQueenRenderer.java new file mode 100644 index 0000000000..6d80a02990 --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/entity/SnowQueenRenderer.java @@ -0,0 +1,35 @@ +package twilightforest.client.renderer.entity; + +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.entity.HumanoidMobRenderer; +import net.minecraft.resources.ResourceLocation; +import twilightforest.TwilightForestMod; +import twilightforest.client.model.entity.SnowQueenModel; +import twilightforest.entity.boss.SnowQueen; + +public class SnowQueenRenderer extends HumanoidMobRenderer { + + private static final ResourceLocation textureLoc = TwilightForestMod.getModelTexture("snowqueen.png"); + + public SnowQueenRenderer(EntityRendererProvider.Context manager, SnowQueenModel model) { + super(manager, model, 0.625F); + } + + @Override + public ResourceLocation getTextureLocation(SnowQueen entity) { + return textureLoc; + } + + @Override + protected void scale(SnowQueen queen, PoseStack stack, float partialTicks) { + float scale = 1.2F; + stack.scale(scale, scale, scale); + } + + @Override + public void render(SnowQueen queen, float yaw, float partialTicks, PoseStack stack, MultiBufferSource buffer, int light) { + super.render(queen, yaw, partialTicks, stack, buffer, light); + } +} diff --git a/src/main/java/twilightforest/client/renderer/entity/StableIceCoreRenderer.java b/src/main/java/twilightforest/client/renderer/entity/StableIceCoreRenderer.java new file mode 100644 index 0000000000..07a136a03c --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/entity/StableIceCoreRenderer.java @@ -0,0 +1,20 @@ +package twilightforest.client.renderer.entity; + +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.util.Mth; +import twilightforest.client.model.entity.StableIceCoreModel; +import twilightforest.entity.monster.StableIceCore; + +public class StableIceCoreRenderer extends TFGenericMobRenderer { + + public StableIceCoreRenderer(EntityRendererProvider.Context manager, StableIceCoreModel model) { + super(manager, model, 0.4F, "iceshooter.png"); + } + + @Override + protected void scale(StableIceCore entity, PoseStack stack, float partialTicks) { + float bounce = entity.tickCount + partialTicks; + stack.translate(0F, Mth.sin((bounce) * 0.2F) * 0.15F, 0F); + } +} diff --git a/src/main/java/twilightforest/client/renderer/entity/SwarmSpiderRenderer.java b/src/main/java/twilightforest/client/renderer/entity/SwarmSpiderRenderer.java new file mode 100644 index 0000000000..f1f773998e --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/entity/SwarmSpiderRenderer.java @@ -0,0 +1,30 @@ +package twilightforest.client.renderer.entity; + +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.entity.SpiderRenderer; +import net.minecraft.resources.ResourceLocation; +import twilightforest.TwilightForestMod; +import twilightforest.entity.monster.SwarmSpider; + +public class SwarmSpiderRenderer extends SpiderRenderer { + + private static final ResourceLocation textureLoc = TwilightForestMod.getModelTexture("swarmspider.png"); + + public SwarmSpiderRenderer(EntityRendererProvider.Context manager) { + super(manager); + this.shadowRadius = 0.25F; + } + + @Override + public ResourceLocation getTextureLocation(SwarmSpider entity) { + return textureLoc; + } + + @Override + protected void scale(SwarmSpider entity, PoseStack stack, float partialTicks) { + float scale = 0.5F; + stack.scale(scale, scale, scale); + } +} diff --git a/src/main/java/twilightforest/client/renderer/entity/TFBipedRenderer.java b/src/main/java/twilightforest/client/renderer/entity/TFBipedRenderer.java new file mode 100644 index 0000000000..9719b4dc24 --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/entity/TFBipedRenderer.java @@ -0,0 +1,34 @@ +package twilightforest.client.renderer.entity; + +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.entity.HumanoidMobRenderer; +import net.minecraft.client.renderer.entity.layers.HumanoidArmorLayer; +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.world.entity.Mob; +import net.minecraft.resources.ResourceLocation; +import twilightforest.TwilightForestMod; + +public class TFBipedRenderer> extends HumanoidMobRenderer { + + private final ResourceLocation textureLoc; + + public TFBipedRenderer(EntityRendererProvider.Context manager, M modelBiped, float shadowSize, String textureName) { + super(manager, modelBiped, shadowSize); + + if (textureName.startsWith("textures")) { + textureLoc = new ResourceLocation(textureName); + } else { + textureLoc = TwilightForestMod.getModelTexture(textureName); + } + } + + public TFBipedRenderer(EntityRendererProvider.Context context, M modelBiped, M armorModel1, M armorModel2, float shadowSize, String textureName) { + this(context, modelBiped, shadowSize, textureName); + this.addLayer(new HumanoidArmorLayer<>(this, armorModel1, armorModel2, context.getModelManager())); + } + + @Override + public ResourceLocation getTextureLocation(T entity) { + return textureLoc; + } +} diff --git a/src/main/java/twilightforest/client/renderer/entity/TFGenericMobRenderer.java b/src/main/java/twilightforest/client/renderer/entity/TFGenericMobRenderer.java new file mode 100644 index 0000000000..ca2a0efdae --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/entity/TFGenericMobRenderer.java @@ -0,0 +1,28 @@ +package twilightforest.client.renderer.entity; + +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.entity.MobRenderer; +import net.minecraft.client.model.EntityModel; +import net.minecraft.world.entity.Mob; +import net.minecraft.resources.ResourceLocation; +import twilightforest.TwilightForestMod; + +public class TFGenericMobRenderer> extends MobRenderer { + + private final ResourceLocation textureLoc; + + public TFGenericMobRenderer(EntityRendererProvider.Context manager, M model, float shadowSize, String textureName) { + super(manager, model, shadowSize); + + if (textureName.startsWith("textures")) { + textureLoc = new ResourceLocation(textureName); + } else { + textureLoc = TwilightForestMod.getModelTexture(textureName); + } + } + + @Override + public ResourceLocation getTextureLocation(T entity) { + return textureLoc; + } +} diff --git a/src/main/java/twilightforest/client/renderer/entity/TFGhastRenderer.java b/src/main/java/twilightforest/client/renderer/entity/TFGhastRenderer.java new file mode 100644 index 0000000000..5f3211b97a --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/entity/TFGhastRenderer.java @@ -0,0 +1,28 @@ +package twilightforest.client.renderer.entity; + +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.entity.MobRenderer; +import net.minecraft.resources.ResourceLocation; +import twilightforest.TwilightForestMod; +import twilightforest.client.model.entity.TFGhastModel; +import twilightforest.entity.monster.CarminiteGhastguard; + +public class TFGhastRenderer> extends MobRenderer { + + private static final ResourceLocation textureLocClosed = TwilightForestMod.getModelTexture("towerghast.png"); + private static final ResourceLocation textureLocOpen = TwilightForestMod.getModelTexture("towerghast_openeyes.png"); + private static final ResourceLocation textureLocAttack = TwilightForestMod.getModelTexture("towerghast_fire.png"); + + public TFGhastRenderer(EntityRendererProvider.Context manager, M model, float shadowSize) { + super(manager, model, shadowSize); + } + + @Override + public ResourceLocation getTextureLocation(T entity) { + return switch (entity.isCharging() ? 2 : entity.getAttackStatus()) { + case 1 -> textureLocOpen; + case 2 -> textureLocAttack; + default -> textureLocClosed; + }; + } +} diff --git a/src/main/java/twilightforest/client/renderer/entity/TFGiantRenderer.java b/src/main/java/twilightforest/client/renderer/entity/TFGiantRenderer.java new file mode 100644 index 0000000000..3da2761037 --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/entity/TFGiantRenderer.java @@ -0,0 +1,102 @@ +package twilightforest.client.renderer.entity; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Axis; +import net.minecraft.client.Minecraft; +import net.minecraft.client.model.ArmedModel; +import net.minecraft.client.model.EntityModel; +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.model.PlayerModel; +import net.minecraft.client.model.geom.ModelLayers; +import net.minecraft.client.player.AbstractClientPlayer; +import net.minecraft.client.renderer.ItemInHandRenderer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.entity.MobRenderer; +import net.minecraft.client.renderer.entity.RenderLayerParent; +import net.minecraft.client.renderer.entity.layers.HumanoidArmorLayer; +import net.minecraft.client.renderer.entity.layers.RenderLayer; +import net.minecraft.client.resources.DefaultPlayerSkin; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.HumanoidArm; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import twilightforest.entity.monster.GiantMiner; + +public class TFGiantRenderer extends MobRenderer> { + private final PlayerModel normalModel; + private final PlayerModel slimModel; + + public TFGiantRenderer(EntityRendererProvider.Context context) { + super(context, new PlayerModel<>(context.bakeLayer(ModelLayers.PLAYER), false), 1.8F); + normalModel = getModel(); + slimModel = new PlayerModel<>(context.bakeLayer(ModelLayers.PLAYER_SLIM), true); + + this.addLayer(new GiantItemInHandLayer<>(this, context.getItemInHandRenderer())); + this.addLayer(new HumanoidArmorLayer<>(this, new HumanoidModel<>(context.bakeLayer(ModelLayers.PLAYER_INNER_ARMOR)), new HumanoidModel<>(context.bakeLayer(ModelLayers.PLAYER_OUTER_ARMOR)), context.getModelManager())); + } + + @Override + public ResourceLocation getTextureLocation(GiantMiner entity) { + Minecraft mc = Minecraft.getInstance(); + boolean slim = false; + ResourceLocation texture = DefaultPlayerSkin.getDefaultSkin(); + + if (mc.getCameraEntity() instanceof AbstractClientPlayer client) { + texture = client.getSkinTextureLocation(); + slim = client.getModelName().equals("slim"); + } + + model = slim ? slimModel : normalModel; + return texture; + } + + @Override + public void scale(T entitylivingbaseIn, PoseStack stack, float partialTickTime) { + float scale = 4.0F; + stack.scale(scale, scale, scale); + } + + //[VanillaCopy] of ItemInHandLayer, changes noted + public static class GiantItemInHandLayer & ArmedModel> extends RenderLayer { + private final ItemInHandRenderer handRenderer; + + public GiantItemInHandLayer(RenderLayerParent renderer, ItemInHandRenderer handRenderer) { + super(renderer); + this.handRenderer = handRenderer; + } + public void render(PoseStack stack, MultiBufferSource buffer, int light, T entity, float limbSwing, float limbSwingAmount, float partialTicks, float ageInTicks, float netHeadYaw, float headPitch) { + boolean flag = entity.getMainArm() == HumanoidArm.RIGHT; + ItemStack itemstack = flag ? entity.getOffhandItem() : entity.getMainHandItem(); + ItemStack itemstack1 = flag ? entity.getMainHandItem() : entity.getOffhandItem(); + if (!itemstack.isEmpty() || !itemstack1.isEmpty()) { + stack.pushPose(); + if (this.getParentModel().young) { + stack.translate(0.0D, 0.75D, 0.0D); + stack.scale(0.5F, 0.5F, 0.5F); + } + + this.renderArmWithItem(entity, itemstack1, ItemDisplayContext.THIRD_PERSON_RIGHT_HAND, HumanoidArm.RIGHT, stack, buffer, light); + this.renderArmWithItem(entity, itemstack, ItemDisplayContext.THIRD_PERSON_LEFT_HAND, HumanoidArm.LEFT, stack, buffer, light); + stack.popPose(); + } + } + + protected void renderArmWithItem(LivingEntity entity, ItemStack stack, ItemDisplayContext type, HumanoidArm arm, PoseStack ms, MultiBufferSource buffer, int light) { + if (!stack.isEmpty()) { + ms.pushPose(); + this.getParentModel().translateToHand(arm, ms); + ms.mulPose(Axis.XP.rotationDegrees(-90.0F)); + ms.mulPose(Axis.YP.rotationDegrees(180.0F)); + boolean flag = arm == HumanoidArm.LEFT; + // TF - move item a bit to actually fit in the giant's hand (y and z changes) + ms.translate((float)(flag ? -1 : 1) / 16.0F, 0.0D, -0.5D); + // TF - scale items down to accurately match the actual size it would be in a giant's hand + ms.scale(0.25F, 0.25F, 0.25F); + this.handRenderer.renderItem(entity, stack, type, flag, ms, buffer, light); + ms.popPose(); + } + } + } +} diff --git a/src/main/java/twilightforest/client/renderer/entity/TFPartRenderer.java b/src/main/java/twilightforest/client/renderer/entity/TFPartRenderer.java new file mode 100644 index 0000000000..fcadbeb11b --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/entity/TFPartRenderer.java @@ -0,0 +1,108 @@ +package twilightforest.client.renderer.entity; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.math.Axis; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.EntityRenderer; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.model.ListModel; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import org.joml.Vector3f; +import twilightforest.entity.TFPart; + +import org.jetbrains.annotations.Nullable; + +public abstract class TFPartRenderer, M extends ListModel> extends EntityRenderer { + + protected final M entityModel; + + public TFPartRenderer(EntityRendererProvider.Context renderManager, M model) { + super(renderManager); + this.entityModel = model; + } + + @Override + public void render(T entityIn, float entityYaw, float partialTicks, PoseStack matrixStackIn, MultiBufferSource bufferIn, int light) { + int packedLightIn = entityRenderDispatcher.getPackedLightCoords(entityIn.getParent(), partialTicks); + super.render(entityIn, entityYaw, partialTicks, matrixStackIn, bufferIn, packedLightIn); + matrixStackIn.pushPose(); + + float f = Mth.rotLerp(partialTicks, entityIn.prevRenderYawOffset, entityIn.renderYawOffset); + float f6 = Mth.lerp(partialTicks, entityIn.xRotO, entityIn.getXRot()); + + float f7 = this.handleRotationFloat(entityIn, partialTicks); + this.applyRotations(entityIn, matrixStackIn, f7, f, partialTicks); + matrixStackIn.scale(-1.0F, -1.0F, 1.0F); + matrixStackIn.translate(0.0D, -1.501F, 0.0D); + float f8 = 0.0F; + float f5 = 0.0F; + + this.entityModel.prepareMobModel(entityIn, f5, f8, partialTicks); + this.entityModel.setupAnim(entityIn, f5, f8, f7, f, f6); + Minecraft minecraft = Minecraft.getInstance(); + boolean flag = this.isVisible(entityIn); + boolean flag1 = !flag && !entityIn.isInvisibleTo(minecraft.player); + boolean flag2 = minecraft.shouldEntityAppearGlowing(entityIn); + RenderType rendertype = this.getRenderType(entityIn, flag, flag1, flag2); + if (rendertype != null) { + VertexConsumer ivertexbuilder = bufferIn.getBuffer(rendertype); + int i = getPackedOverlay(entityIn, this.getOverlayProgress(entityIn, partialTicks)); + this.entityModel.renderToBuffer(matrixStackIn, ivertexbuilder, packedLightIn, i, 1.0F, 1.0F, 1.0F, flag1 ? 0.15F : 1.0F); + } + + matrixStackIn.popPose(); + } + + protected float getOverlayProgress(T livingEntityIn, float partialTicks) { + return 0.0F; + } + + public int getPackedOverlay(T livingEntityIn, float uIn) { + if (livingEntityIn.getParent() instanceof LivingEntity) + return OverlayTexture.pack(OverlayTexture.u(uIn), OverlayTexture.v(((LivingEntity) livingEntityIn.getParent()).hurtTime > 0 || ((LivingEntity) livingEntityIn.getParent()).deathTime > 0)); + return OverlayTexture.NO_OVERLAY; + } + + @Nullable + protected RenderType getRenderType(T p_230496_1_, boolean p_230496_2_, boolean p_230496_3_, boolean p_230496_4_) { + ResourceLocation resourcelocation = this.getTextureLocation(p_230496_1_); + if (p_230496_3_) { + return RenderType.itemEntityTranslucentCull(resourcelocation); + } else if (p_230496_2_) { + return this.entityModel.renderType(resourcelocation); + } else { + return p_230496_4_ ? RenderType.outline(resourcelocation) : null; + } + } + + protected float handleRotationFloat(T livingBase, float partialTicks) { + return (float)livingBase.tickCount + partialTicks; + } + + protected void applyRotations(T entityLiving, PoseStack matrixStackIn, float ageInTicks, float rotationYaw, float partialTicks) { + if (entityLiving.deathTime > 0) { + float f = ((float)entityLiving.deathTime + partialTicks - 1.0F) / 20.0F * 1.6F; + f = Mth.sqrt(f); + if (f > 1.0F) { + f = 1.0F; + } + + matrixStackIn.mulPose(Axis.ZP.rotationDegrees(f * this.getDeathMaxRotation(entityLiving))); + } + + } + + protected float getDeathMaxRotation(T entityLivingBaseIn) { + return 90.0F; + } + + protected boolean isVisible(T livingEntityIn) { + return !livingEntityIn.isInvisible(); + } +} diff --git a/src/main/java/twilightforest/client/renderer/entity/ThrownBlockRenderer.java b/src/main/java/twilightforest/client/renderer/entity/ThrownBlockRenderer.java new file mode 100644 index 0000000000..24c1561746 --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/entity/ThrownBlockRenderer.java @@ -0,0 +1,54 @@ +package twilightforest.client.renderer.entity; + +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.block.BlockRenderDispatcher; +import net.minecraft.client.renderer.entity.EntityRenderer; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.client.renderer.texture.TextureAtlas; +import net.minecraft.core.BlockPos; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.RandomSource; +import net.minecraft.world.inventory.InventoryMenu; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.RenderShape; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.client.model.data.ModelData; +import twilightforest.entity.projectile.ThrownBlock; + +/** + * [VanillaCopy] of {@link net.minecraft.client.renderer.entity.FallingBlockRenderer} because of generic type restrictions + */ +public class ThrownBlockRenderer extends EntityRenderer { + + public ThrownBlockRenderer(EntityRendererProvider.Context manager) { + super(manager); + this.shadowRadius = 0.5F; + } + + @Override + public void render(ThrownBlock entity, float yaw, float partialTicks, PoseStack ms, MultiBufferSource buffers, int light) { + BlockState blockstate = entity.getBlockState(); + if (blockstate.getRenderShape() == RenderShape.MODEL) { + Level world = entity.getLevel(); + if (blockstate.getRenderShape() != RenderShape.INVISIBLE) { + ms.pushPose(); + BlockPos blockpos = BlockPos.containing(entity.getX(), entity.getBoundingBox().maxY, entity.getZ()); + ms.translate(-0.5D, 0.0D, -0.5D); + BlockRenderDispatcher dispatcher = Minecraft.getInstance().getBlockRenderer(); + var model = dispatcher.getBlockModel(blockstate); + for (var renderType : model.getRenderTypes(blockstate, RandomSource.create(blockstate.getSeed(entity.blockPosition())), ModelData.EMPTY)) + dispatcher.getModelRenderer().tesselateBlock(world, model, blockstate, blockpos, ms, buffers.getBuffer(renderType), false, RandomSource.create(), blockstate.getSeed(entity.blockPosition()), OverlayTexture.NO_OVERLAY, ModelData.EMPTY, renderType); + ms.popPose(); + super.render(entity, yaw, partialTicks, ms, buffers, light); + } + } + } + + @Override + public ResourceLocation getTextureLocation(ThrownBlock entity) { + return InventoryMenu.BLOCK_ATLAS; + } +} diff --git a/src/main/java/twilightforest/client/renderer/entity/ThrownIceRenderer.java b/src/main/java/twilightforest/client/renderer/entity/ThrownIceRenderer.java new file mode 100644 index 0000000000..f1eafbbd85 --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/entity/ThrownIceRenderer.java @@ -0,0 +1,54 @@ +package twilightforest.client.renderer.entity; + +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.block.BlockRenderDispatcher; +import net.minecraft.client.renderer.entity.EntityRenderer; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.client.renderer.texture.TextureAtlas; +import net.minecraft.core.BlockPos; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.RandomSource; +import net.minecraft.world.inventory.InventoryMenu; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.RenderShape; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.client.model.data.ModelData; +import twilightforest.entity.projectile.IceBomb; + +/** + * [VanillaCopy] of {@link net.minecraft.client.renderer.entity.FallingBlockRenderer} because of generic type restrictions + */ +public class ThrownIceRenderer extends EntityRenderer { + + public ThrownIceRenderer(EntityRendererProvider.Context manager) { + super(manager); + this.shadowRadius = 0.5F; + } + + @Override + public void render(IceBomb entity, float yaw, float partialTicks, PoseStack ms, MultiBufferSource buffers, int light) { + BlockState blockstate = entity.getBlockState(); + if (blockstate.getRenderShape() == RenderShape.MODEL) { + Level world = entity.getCommandSenderWorld(); + if (blockstate != world.getBlockState(entity.blockPosition()) && blockstate.getRenderShape() != RenderShape.INVISIBLE) { + ms.pushPose(); + BlockPos blockpos = BlockPos.containing(entity.getX(), entity.getBoundingBox().maxY, entity.getZ()); + ms.translate(-0.5D, 0.0D, -0.5D); + BlockRenderDispatcher dispatcher = Minecraft.getInstance().getBlockRenderer(); + var model = dispatcher.getBlockModel(blockstate); + for (var renderType : model.getRenderTypes(blockstate, RandomSource.create(blockstate.getSeed(entity.blockPosition())), ModelData.EMPTY)) + dispatcher.getModelRenderer().tesselateBlock(world, model, blockstate, blockpos, ms, buffers.getBuffer(renderType), false, RandomSource.create(), blockstate.getSeed(entity.blockPosition()), OverlayTexture.NO_OVERLAY, ModelData.EMPTY, renderType); + ms.popPose(); + super.render(entity, yaw, partialTicks, ms, buffers, light); + } + } + } + + @Override + public ResourceLocation getTextureLocation(IceBomb entity) { + return InventoryMenu.BLOCK_ATLAS; + } +} diff --git a/src/main/java/twilightforest/client/renderer/entity/ThrownWepRenderer.java b/src/main/java/twilightforest/client/renderer/entity/ThrownWepRenderer.java new file mode 100644 index 0000000000..58536c3bf3 --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/entity/ThrownWepRenderer.java @@ -0,0 +1,63 @@ +package twilightforest.client.renderer.entity; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Axis; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.entity.EntityRenderer; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.block.model.ItemTransforms; +import net.minecraft.client.renderer.texture.TextureAtlas; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.world.inventory.InventoryMenu; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import net.minecraft.resources.ResourceLocation; +import org.joml.Vector3f; +import twilightforest.entity.projectile.ThrownWep; + +public class ThrownWepRenderer extends EntityRenderer { + + public ThrownWepRenderer(EntityRendererProvider.Context manager) { + super(manager); + } + + @Override + public void render(ThrownWep entity, float yaw, float partialTicks, PoseStack stack, MultiBufferSource buffer, int light) { + stack.pushPose(); + + float spin = (entity.tickCount + partialTicks) * 10F; + + // size up + stack.scale(1.25F, 1.25F, 1.25F); + + this.renderDroppedItem(stack, buffer, light, entity.getItem(), yaw, spin); + + stack.popPose(); + } + + private void renderDroppedItem(PoseStack matrix, MultiBufferSource buffer, int light, ItemStack stack, float rotation, float spin) { + matrix.pushPose(); + + float f9 = 0.5F; + float f10 = 0.25F; + + matrix.mulPose(Axis.YP.rotationDegrees(rotation + 90)); + matrix.mulPose(Axis.ZP.rotationDegrees(spin)); + + float f12 = 0.0625F; + float f11 = 0.021875F; + + matrix.translate(-f9, -f10, -(f12 + f11)); + matrix.translate(0f, 0f, f12 + f11); + + Minecraft.getInstance().getItemRenderer().renderStatic(stack, ItemDisplayContext.GROUND, light, OverlayTexture.NO_OVERLAY, matrix, buffer, null, 0); + + matrix.popPose(); + } + + @Override + public ResourceLocation getTextureLocation(ThrownWep entity) { + return InventoryMenu.BLOCK_ATLAS; + } +} diff --git a/src/main/java/twilightforest/client/renderer/entity/TinyBirdRenderer.java b/src/main/java/twilightforest/client/renderer/entity/TinyBirdRenderer.java new file mode 100644 index 0000000000..b22c63b6fe --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/entity/TinyBirdRenderer.java @@ -0,0 +1,19 @@ +package twilightforest.client.renderer.entity; + +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.resources.ResourceLocation; +import twilightforest.TwilightForestMod; +import twilightforest.client.model.entity.TinyBirdModel; +import twilightforest.entity.passive.TinyBird; + +public class TinyBirdRenderer extends BirdRenderer { + + public TinyBirdRenderer(EntityRendererProvider.Context manager, TinyBirdModel model, float shadowSize) { + super(manager, model, shadowSize, ""); + } + + @Override + public ResourceLocation getTextureLocation(TinyBird entity) { + return entity.getBirdType().texture(); + } +} diff --git a/src/main/java/twilightforest/client/renderer/entity/TwilightBoatRenderer.java b/src/main/java/twilightforest/client/renderer/entity/TwilightBoatRenderer.java new file mode 100644 index 0000000000..284766d9af --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/entity/TwilightBoatRenderer.java @@ -0,0 +1,103 @@ +package twilightforest.client.renderer.entity; + +import com.google.common.collect.ImmutableMap; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.datafixers.util.Pair; +import com.mojang.math.Axis; +import net.minecraft.client.model.BoatModel; +import net.minecraft.client.model.ChestBoatModel; +import net.minecraft.client.model.geom.ModelLayerLocation; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.EntityRenderer; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import org.joml.Quaternionf; +import twilightforest.TwilightForestMod; +import twilightforest.entity.TwilightBoat; + +import java.util.Map; +import java.util.stream.Stream; + +public class TwilightBoatRenderer extends EntityRenderer { + + private final Map> boatResources; + + public TwilightBoatRenderer(EntityRendererProvider.Context context, boolean chest) { + super(context); + this.shadowRadius = 0.8F; + this.boatResources = Stream.of(TwilightBoat.Type.values()).collect(ImmutableMap.toImmutableMap(type -> type, type -> Pair.of(new ResourceLocation(TwilightForestMod.ID, getTextureLocation(type, chest)), this.createBoatModel(context, type, chest)))); + } + + private BoatModel createBoatModel(EntityRendererProvider.Context context, TwilightBoat.Type type, boolean chest) { + ModelLayerLocation modellayerlocation = chest ? createChestBoatModelName(type) : createBoatModelName(type); + ModelPart modelpart = context.bakeLayer(modellayerlocation); + return chest ? new ChestBoatModel(modelpart) : new BoatModel(modelpart); + } + + private static ModelLayerLocation createLocation(String path) { + return new ModelLayerLocation(new ResourceLocation(TwilightForestMod.ID, path), "main"); + } + + public static ModelLayerLocation createBoatModelName(TwilightBoat.Type type) { + return createLocation("boat/" + type.getName()); + } + + public static ModelLayerLocation createChestBoatModelName(TwilightBoat.Type type) { + return createLocation("chest_boat/" + type.getName()); + } + + private static String getTextureLocation(TwilightBoat.Type type, boolean chest) { + return chest ? "textures/entity/chest_boat/" + type.getName() + ".png" : "textures/entity/boat/" + type.getName() + ".png"; + } + + @Override + public void render(TwilightBoat boat, float boatYaw, float partialTicks, PoseStack stack, MultiBufferSource buffer, int light) { + stack.pushPose(); + stack.translate(0.0F, 0.375F, 0.0F); + stack.mulPose(Axis.YP.rotationDegrees(180.0F - boatYaw)); + float f = (float)boat.getHurtTime() - partialTicks; + float f1 = boat.getDamage() - partialTicks; + if (f1 < 0.0F) { + f1 = 0.0F; + } + + if (f > 0.0F) { + stack.mulPose(Axis.XP.rotationDegrees(Mth.sin(f) * f * f1 / 10.0F * (float)boat.getHurtDir())); + } + + float f2 = boat.getBubbleAngle(partialTicks); + if (!Mth.equal(f2, 0.0F)) { + stack.mulPose((new Quaternionf()).setAngleAxis(boat.getBubbleAngle(partialTicks) * ((float)Math.PI / 180F), 1.0F, 0.0F, 1.0F)); + } + + Pair pair = this.getModelWithLocation(boat); + ResourceLocation resourcelocation = pair.getFirst(); + BoatModel model = pair.getSecond(); + stack.scale(-1.0F, -1.0F, 1.0F); + stack.mulPose(Axis.YP.rotationDegrees(90.0F)); + model.setupAnim(boat, partialTicks, 0.0F, -0.1F, 0.0F, 0.0F); + VertexConsumer vertexconsumer = buffer.getBuffer(model.renderType(resourcelocation)); + model.renderToBuffer(stack, vertexconsumer, light, OverlayTexture.NO_OVERLAY, 1.0F, 1.0F, 1.0F, 1.0F); + if (!boat.isUnderWater()) { + VertexConsumer vertexconsumer1 = buffer.getBuffer(RenderType.waterMask()); + model.waterPatch().render(stack, vertexconsumer1, light, OverlayTexture.NO_OVERLAY); + } + + stack.popPose(); + super.render(boat, boatYaw, partialTicks, stack, buffer, light); + } + + @Override + public ResourceLocation getTextureLocation(TwilightBoat boat) { + return this.getModelWithLocation(boat).getFirst(); + } + + public Pair getModelWithLocation(TwilightBoat boat) { + return this.boatResources.get(boat.getTwilightBoatType()); + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/client/renderer/entity/UnstableIceCoreRenderer.java b/src/main/java/twilightforest/client/renderer/entity/UnstableIceCoreRenderer.java new file mode 100644 index 0000000000..80b452b322 --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/entity/UnstableIceCoreRenderer.java @@ -0,0 +1,78 @@ +package twilightforest.client.renderer.entity; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Axis; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.util.Mth; +import org.joml.Vector3f; +import twilightforest.client.model.entity.UnstableIceCoreModel; +import twilightforest.entity.monster.UnstableIceCore; + +public class UnstableIceCoreRenderer> extends TFGenericMobRenderer { + + public UnstableIceCoreRenderer(EntityRendererProvider.Context manager, M model) { + super(manager, model, 0.4F, "iceexploder.png"); + } + + @Override + protected void scale(T entity, PoseStack stack, float partialTicks) { + float bounce = entity.tickCount + partialTicks; + + stack.translate(0F, Mth.sin((bounce) * 0.2F) * 0.15F, 0F); + + // flash + float f1 = entity.deathTime; + if (f1 > 0) { + float f2 = 1.0F + Mth.sin(f1 * 100.0F) * f1 * 0.01F; + + if (f1 < 0.0F) { + f1 = 0.0F; + } + + if (f1 > 1.0F) { + f1 = 1.0F; + } + + f1 *= f1; + f1 *= f1; + float f3 = (1.0F + f1 * 0.4F) * f2; + float f4 = (1.0F + f1 * 0.1F) / f2; + stack.scale(f3, f4, f3); + } + } + + @Override + protected void setupRotations(T entity, PoseStack stack, float ageInTicks, float rotationYaw, float partialTicks) { + stack.mulPose(Axis.YP.rotationDegrees(180 - rotationYaw)); + } + + @Override + protected float getWhiteOverlayProgress(T entity, float partialTicks) { + if (entity.deathTime > 0) { + float f2 = entity.deathTime + partialTicks; + + if ((int) (f2 / 2) % 2 == 0) { + return 0; + } else { + int i = (int) (f2 * 0.2F * 255.0F); + + if (i < 0) { + i = 0; + } + + if (i > 255) { + i = 255; + } + + short short1 = 255; + short short2 = 255; + short short3 = 255; + return i << 24 | short1 << 16 | short2 << 8 | short3; + } + } else { + return 0; + } + } +} + + diff --git a/src/main/java/twilightforest/client/renderer/entity/UpperGoblinKnightRenderer.java b/src/main/java/twilightforest/client/renderer/entity/UpperGoblinKnightRenderer.java new file mode 100644 index 0000000000..89d7f47bfd --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/entity/UpperGoblinKnightRenderer.java @@ -0,0 +1,51 @@ +package twilightforest.client.renderer.entity; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Axis; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import org.joml.Vector3f; +import twilightforest.client.model.entity.UpperGoblinKnightModel; +import twilightforest.entity.monster.UpperGoblinKnight; + +public class UpperGoblinKnightRenderer extends TFBipedRenderer { + public UpperGoblinKnightRenderer(EntityRendererProvider.Context manager, UpperGoblinKnightModel model, float shadowSize) { + super(manager, model, shadowSize, "doublegoblin.png"); + } + + @Override + protected void setupRotations(UpperGoblinKnight upperKnight, PoseStack stack, float ageInTicks, float rotationYaw, float partialTicks) { + super.setupRotations(upperKnight, stack, ageInTicks, rotationYaw, partialTicks); + + if (upperKnight.heavySpearTimer > 0) { + stack.mulPose(Axis.XP.rotationDegrees(getPitchForAttack((60 - upperKnight.heavySpearTimer) + partialTicks))); + } + } + + /** + * Figure out what pitch the goblin should be at depending on where it's at on the the timer + */ + private float getPitchForAttack(float attackTime) { + if (attackTime <= 10) { + // rock back + return attackTime * 3.0F; + } + if (attackTime > 10 && attackTime <= 30) { + // hang back + return 30F; + } + if (attackTime > 30 && attackTime <= 33) { + // slam forward + return (attackTime - 30) * -25F + 30F; + } + if (attackTime > 33 && attackTime <= 50) { + // stay forward + return -45F; + } + if (attackTime > 50 && attackTime <= 60) { + // back to normal + return (10 - (attackTime - 50)) * -4.5F; + } + + return 0; + } +} diff --git a/src/main/java/twilightforest/client/renderer/entity/UrGhastRenderer.java b/src/main/java/twilightforest/client/renderer/entity/UrGhastRenderer.java new file mode 100644 index 0000000000..1fe65bb67c --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/entity/UrGhastRenderer.java @@ -0,0 +1,39 @@ +package twilightforest.client.renderer.entity; + +import net.minecraft.client.renderer.culling.Frustum; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.resources.ResourceLocation; +import twilightforest.TwilightForestMod; +import twilightforest.client.model.entity.UrGhastModel; +import twilightforest.entity.boss.UrGhast; + +public class UrGhastRenderer extends CarminiteGhastRenderer { + + private final ResourceLocation textureLocClosed = TwilightForestMod.getModelTexture("towerboss.png"); + private final ResourceLocation textureLocOpen = TwilightForestMod.getModelTexture("towerboss_openeyes.png"); + private final ResourceLocation textureLocAttack = TwilightForestMod.getModelTexture("towerboss_fire.png"); + + public UrGhastRenderer(EntityRendererProvider.Context manager, UrGhastModel modelTFGhast, float shadowSize, float scale) { + super(manager, modelTFGhast, shadowSize, scale); + } + + @Override + public ResourceLocation getTextureLocation(UrGhast entity) { + return switch (entity.isCharging() || entity.isDeadOrDying() ? 2 : entity.getAttackStatus()) { + case 1 -> textureLocOpen; + case 2 -> textureLocAttack; + default -> textureLocClosed; + }; + } + + @Override + public boolean shouldRender(UrGhast pLivingEntity, Frustum pCamera, double pCamX, double pCamY, double pCamZ) { + if (pLivingEntity.deathTime > 40) return false; + return super.shouldRender(pLivingEntity, pCamera, pCamX, pCamY, pCamZ); + } + + @Override + protected float getFlipDegrees(UrGhast urGhast) { //Prevent the body from keeling over + return urGhast.isDeadOrDying() ? 0.0F : super.getFlipDegrees(urGhast); + } +} diff --git a/src/main/java/twilightforest/client/renderer/entity/WinterWolfRenderer.java b/src/main/java/twilightforest/client/renderer/entity/WinterWolfRenderer.java new file mode 100644 index 0000000000..5cc1cab57c --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/entity/WinterWolfRenderer.java @@ -0,0 +1,42 @@ +package twilightforest.client.renderer.entity; + +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.resources.ResourceLocation; +import twilightforest.TwilightForestMod; +import twilightforest.entity.monster.HostileWolf; + +public class WinterWolfRenderer extends HostileWolfRenderer { + + private static final ResourceLocation textureLoc = TwilightForestMod.getModelTexture("winterwolf.png"); + + public WinterWolfRenderer(EntityRendererProvider.Context manager) { + super(manager); + this.shadowRadius = 1.0F; + } + + @Override + protected void scale(HostileWolf entity, PoseStack stack, float partialTicks) { + float wolfScale = 1.9F; + stack.scale(wolfScale, wolfScale, wolfScale); + + //The rest of this stuff won't belong here +// GlStateManager.enableBlend(); +// GlStateManager.disableAlpha(); +// //GlStateManager.blendFunc(GL11.GL_ONE, GL11.GL_ONE); +// GlStateManager.blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); +// //GlStateManager.blendFunc(GL11.GL_ONE_MINUS_DST_ALPHA, GL11.GL_DST_ALPHA); +// +// float misty = entity.getBrightness(0F) * 3F + 0.25F; +// misty = Math.min(1F, misty); +// +// float smoky = entity.getBrightness(0F) * 2F + 0.6F; +// +// GlStateManager.color(misty, misty, misty, smoky); + } + + @Override + public ResourceLocation getTextureLocation(HostileWolf entity) { + return textureLoc; + } +} diff --git a/src/main/java/twilightforest/client/renderer/entity/WraithRenderer.java b/src/main/java/twilightforest/client/renderer/entity/WraithRenderer.java new file mode 100644 index 0000000000..34981ee8ba --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/entity/WraithRenderer.java @@ -0,0 +1,31 @@ +package twilightforest.client.renderer.entity; + +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.entity.HumanoidMobRenderer; +import net.minecraft.resources.ResourceLocation; +import twilightforest.TwilightForestMod; +import twilightforest.client.model.entity.WraithModel; +import twilightforest.entity.monster.Wraith; + +import org.jetbrains.annotations.Nullable; + +public class WraithRenderer extends HumanoidMobRenderer { + + private static final ResourceLocation textureWraith = TwilightForestMod.getModelTexture("ghost.png"); + + public WraithRenderer(EntityRendererProvider.Context manager, WraithModel modelbiped, float shadowSize) { + super(manager, modelbiped, shadowSize); + } + + @Nullable + @Override + protected RenderType getRenderType(Wraith entity, boolean p_230496_2_, boolean p_230496_3_, boolean p_230496_4_) { + return RenderType.entityTranslucent(getTextureLocation(entity)); + } + + @Override + public ResourceLocation getTextureLocation(Wraith wraith) { + return textureWraith; + } +} diff --git a/src/main/java/twilightforest/client/renderer/entity/legacy/LegacyBlockChainGoblinRenderer.java b/src/main/java/twilightforest/client/renderer/entity/legacy/LegacyBlockChainGoblinRenderer.java new file mode 100644 index 0000000000..1dc2ff4521 --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/entity/legacy/LegacyBlockChainGoblinRenderer.java @@ -0,0 +1,106 @@ +package twilightforest.client.renderer.entity.legacy; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.math.Axis; +import org.joml.Vector3f; +import net.minecraft.client.Minecraft; +import net.minecraft.client.model.Model; +import net.minecraft.client.renderer.LevelRenderer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.culling.Frustum; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.entity.HumanoidMobRenderer; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.Vec3; +import twilightforest.TwilightForestMod; +import twilightforest.client.model.TFModelLayers; +import twilightforest.client.model.entity.ChainModel; +import twilightforest.client.model.entity.SpikeBlockModel; +import twilightforest.client.model.entity.legacy.BlockChainGoblinLegacyModel; +import twilightforest.client.renderer.entity.BlockChainRenderer; +import twilightforest.entity.monster.BlockChainGoblin; + +public class LegacyBlockChainGoblinRenderer> extends HumanoidMobRenderer { + + private static final ResourceLocation textureLoc = TwilightForestMod.getModelTexture("blockgoblin.png"); + + private final Model model; + private final Model chainModel; + + public LegacyBlockChainGoblinRenderer(EntityRendererProvider.Context manager, M goblinModel, float shadowSize) { + super(manager, goblinModel, shadowSize); + model = new SpikeBlockModel(manager.bakeLayer(TFModelLayers.CHAIN_BLOCK)); + chainModel = new ChainModel(manager.bakeLayer(TFModelLayers.CHAIN)); + } + + @Override + public void render(T goblin, float yaw, float partialTicks, PoseStack stack, MultiBufferSource buffer, int light) { + super.render(goblin, yaw, partialTicks, stack, buffer, light); + + stack.pushPose(); + + double blockInX = (goblin.block.getX() - goblin.getX()); + double blockInY = (goblin.block.getY() - goblin.getY()); + double blockInZ = (goblin.block.getZ() - goblin.getZ()); + + VertexConsumer ivertexbuilder = buffer.getBuffer(this.model.renderType(textureLoc)); + stack.translate(blockInX, blockInY, blockInZ); + + float pitch = goblin.xRotO + (goblin.getXRot() - goblin.xRotO) * partialTicks; + stack.mulPose(Axis.YP.rotationDegrees(180 - Mth.wrapDegrees(yaw))); + stack.mulPose(Axis.XP.rotationDegrees(pitch)); + + stack.scale(-1.0F, -1.0F, 1.0F); + this.model.renderToBuffer(stack, ivertexbuilder, light, OverlayTexture.NO_OVERLAY, 1.0F, 1.0F, 1.0F, 1.0F); + stack.popPose(); + + BlockChainRenderer.renderChain(goblin, goblin.chain1, yaw, partialTicks, stack, buffer, light, chainModel); + BlockChainRenderer.renderChain(goblin, goblin.chain2, yaw, partialTicks, stack, buffer, light, chainModel); + BlockChainRenderer.renderChain(goblin, goblin.chain3, yaw, partialTicks, stack, buffer, light, chainModel); + + //when you allowed debugBoundingBox, you can see Hitbox + if (this.entityRenderDispatcher.shouldRenderHitBoxes() && !goblin.block.isInvisible() && !Minecraft.getInstance().showOnlyReducedInfo()) { + stack.pushPose(); + stack.translate(blockInX, blockInY, blockInZ); + this.renderMultiBoundingBox(stack, buffer.getBuffer(RenderType.lines()), goblin.block, 0.25F, 1.0F, 0.0F); + stack.popPose(); + } + + } + + private void renderMultiBoundingBox(PoseStack stack, VertexConsumer builder, Entity entity, float red, float grean, float blue) { + AABB axisalignedbb = entity.getBoundingBox().move(-entity.getX(), -entity.getY(), -entity.getZ()); + LevelRenderer.renderLineBox(stack, builder, axisalignedbb, red, grean, blue, 1.0F); + } + + @Override + public boolean shouldRender(T entity, Frustum clippingHelper, double camX, double camY, double camZ) { + if (super.shouldRender(entity, clippingHelper, camX, camY, camZ)) { + return true; + } else { + + Vec3 vec3d = this.getPosition(entity.block, entity.block.getBbHeight() * 0.5D, 1.0F); + Vec3 vec3d1 = this.getPosition(entity.block, entity.block.getEyeHeight(), 1.0F); + return clippingHelper.isVisible(new AABB(vec3d1.x, vec3d1.y, vec3d1.z, vec3d.x, vec3d.y, vec3d.z)); + } + } + + private Vec3 getPosition(Entity entity, double p_177110_2_, float p_177110_4_) { + // [VanillaCopy] From GuardianRenderer + double d0 = Mth.lerp(p_177110_4_, entity.xOld, entity.getX()); + double d1 = Mth.lerp(p_177110_4_, entity.yOld, entity.getY()) + p_177110_2_; + double d2 = Mth.lerp(p_177110_4_, entity.zOld, entity.getZ()); + return new Vec3(d0, d1, d2); + } + + @Override + public ResourceLocation getTextureLocation(T entity) { + return textureLoc; + } +} diff --git a/src/main/java/twilightforest/client/renderer/entity/legacy/LegacyBoarRenderer.java b/src/main/java/twilightforest/client/renderer/entity/legacy/LegacyBoarRenderer.java new file mode 100644 index 0000000000..c1c071d991 --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/entity/legacy/LegacyBoarRenderer.java @@ -0,0 +1,23 @@ +package twilightforest.client.renderer.entity.legacy; + +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.entity.MobRenderer; +import net.minecraft.resources.ResourceLocation; +import twilightforest.TwilightForestMod; +import twilightforest.client.model.entity.legacy.BoarLegacyModel; +import twilightforest.entity.passive.Boar; + +//old renderer used to use PigModel, had to change it because of the texture size change +public class LegacyBoarRenderer extends MobRenderer> { + + private static final ResourceLocation textureLoc = TwilightForestMod.getModelTexture("wildboar.png"); + + public LegacyBoarRenderer(EntityRendererProvider.Context manager, BoarLegacyModel model) { + super(manager, model, 0.7F); + } + + @Override + public ResourceLocation getTextureLocation(Boar entity) { + return textureLoc; + } +} diff --git a/src/main/java/twilightforest/client/renderer/entity/legacy/LegacyHydraHeadRenderer.java b/src/main/java/twilightforest/client/renderer/entity/legacy/LegacyHydraHeadRenderer.java new file mode 100644 index 0000000000..ee01e5e839 --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/entity/legacy/LegacyHydraHeadRenderer.java @@ -0,0 +1,63 @@ +package twilightforest.client.renderer.entity.legacy; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Axis; +import org.joml.Vector3f; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.resources.ResourceLocation; +import twilightforest.TwilightForestMod; +import twilightforest.client.model.TFModelLayers; +import twilightforest.client.model.entity.legacy.HydraHeadLegacyModel; +import twilightforest.client.renderer.entity.TFPartRenderer; +import twilightforest.entity.boss.Hydra; +import twilightforest.entity.boss.HydraHead; +import twilightforest.entity.boss.HydraHeadContainer; + +import org.jetbrains.annotations.Nullable; + +public class LegacyHydraHeadRenderer extends TFPartRenderer { + + private static final ResourceLocation textureLoc = TwilightForestMod.getModelTexture("hydra4.png"); + + + public LegacyHydraHeadRenderer(EntityRendererProvider.Context manager) { + super(manager, new HydraHeadLegacyModel(manager.bakeLayer(TFModelLayers.LEGACY_HYDRA_HEAD))); + } + + @Override + public void render(HydraHead entity, float yaw, float partialTicks, PoseStack stack, MultiBufferSource buffer, int light) { + // get the HydraHeadContainer that we're taking about + HydraHeadContainer headCon = getHeadObject(entity); + + if (headCon != null) { + // see whether we want to render these + if (headCon.shouldRenderHead()) { + stack.mulPose(Axis.YP.rotationDegrees(-180)); + super.render(entity, yaw, partialTicks, stack, buffer, light); + } + + } else { + super.render(entity, yaw, partialTicks, stack, buffer, light); + } + } + + @Nullable + public static HydraHeadContainer getHeadObject(HydraHead entity) { + Hydra hydra = entity.getParent(); + + if (hydra != null) { + for (int i = 0; i < hydra.numHeads; i++) { + if (hydra.hc[i].headEntity == entity) { + return hydra.hc[i]; + } + } + } + return null; + } + + @Override + public ResourceLocation getTextureLocation(HydraHead entity) { + return textureLoc; + } +} diff --git a/src/main/java/twilightforest/client/renderer/entity/legacy/LegacyHydraNeckRenderer.java b/src/main/java/twilightforest/client/renderer/entity/legacy/LegacyHydraNeckRenderer.java new file mode 100644 index 0000000000..1037560e65 --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/entity/legacy/LegacyHydraNeckRenderer.java @@ -0,0 +1,46 @@ +package twilightforest.client.renderer.entity.legacy; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Axis; +import org.joml.Vector3f; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.resources.ResourceLocation; +import twilightforest.TwilightForestMod; +import twilightforest.client.model.TFModelLayers; +import twilightforest.client.model.entity.legacy.HydraNeckLegacyModel; +import twilightforest.client.renderer.entity.TFPartRenderer; +import twilightforest.entity.boss.HydraHeadContainer; +import twilightforest.entity.boss.HydraNeck; + +public class LegacyHydraNeckRenderer extends TFPartRenderer { + + private static final ResourceLocation textureLoc = TwilightForestMod.getModelTexture("hydra4.png"); + + public LegacyHydraNeckRenderer(EntityRendererProvider.Context manager) { + super(manager, new HydraNeckLegacyModel(manager.bakeLayer(TFModelLayers.LEGACY_HYDRA_NECK))); + } + + @Override + public void render(HydraNeck entityIn, float entityYaw, float partialTicks, PoseStack matrixStackIn, MultiBufferSource bufferIn, int light) { + HydraHeadContainer headCon = LegacyHydraHeadRenderer.getHeadObject(entityIn.head); + if (headCon != null) + if (headCon.shouldRenderHead()) { + float yawDiff = entityIn.getYRot() - entityIn.yRotO; + if (yawDiff > 180) { + yawDiff -= 360; + } else if (yawDiff < -180) { + yawDiff += 360; + } + float yaw2 = entityIn.yRotO + yawDiff * partialTicks; + + matrixStackIn.mulPose(Axis.YN.rotationDegrees(yaw2 + 180)); + super.render(entityIn, entityYaw, partialTicks, matrixStackIn, bufferIn, light); + } + } + + @Override + public ResourceLocation getTextureLocation(HydraNeck entity) { + return textureLoc; + } +} diff --git a/src/main/java/twilightforest/client/renderer/entity/legacy/LegacyHydraRenderer.java b/src/main/java/twilightforest/client/renderer/entity/legacy/LegacyHydraRenderer.java new file mode 100644 index 0000000000..7f432b202e --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/entity/legacy/LegacyHydraRenderer.java @@ -0,0 +1,27 @@ +package twilightforest.client.renderer.entity.legacy; + +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.entity.MobRenderer; +import net.minecraft.resources.ResourceLocation; +import twilightforest.TwilightForestMod; +import twilightforest.client.model.entity.legacy.HydraLegacyModel; +import twilightforest.entity.boss.Hydra; + +public class LegacyHydraRenderer extends MobRenderer { + + private static final ResourceLocation textureLoc = TwilightForestMod.getModelTexture("hydra4.png"); + + public LegacyHydraRenderer(EntityRendererProvider.Context manager, HydraLegacyModel modelbase, float shadowSize) { + super(manager, modelbase, shadowSize); + } + + @Override + protected float getFlipDegrees(Hydra entity) { + return 0F; + } + + @Override + public ResourceLocation getTextureLocation(Hydra entity) { + return textureLoc; + } +} diff --git a/src/main/java/twilightforest/client/renderer/entity/legacy/LegacyKoboldRenderer.java b/src/main/java/twilightforest/client/renderer/entity/legacy/LegacyKoboldRenderer.java new file mode 100644 index 0000000000..51b4818699 --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/entity/legacy/LegacyKoboldRenderer.java @@ -0,0 +1,74 @@ +package twilightforest.client.renderer.entity.legacy; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Axis; +import net.minecraft.world.item.ItemDisplayContext; +import org.joml.Vector3f; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.ItemInHandRenderer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.block.model.ItemTransforms; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.entity.RenderLayerParent; +import net.minecraft.client.renderer.entity.layers.ItemInHandLayer; +import net.minecraft.client.renderer.entity.layers.RenderLayer; +import net.minecraft.world.entity.HumanoidArm; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; +import twilightforest.client.model.entity.KoboldModel; +import twilightforest.client.model.entity.legacy.KoboldLegacyModel; +import twilightforest.client.renderer.entity.TFBipedRenderer; +import twilightforest.entity.monster.Kobold; + +public class LegacyKoboldRenderer extends TFBipedRenderer { + + public LegacyKoboldRenderer(EntityRendererProvider.Context context, KoboldLegacyModel model, float shadowSize, String textureName) { + super(context, model, shadowSize, textureName); + + this.layers.removeIf(r -> r instanceof ItemInHandLayer); + this.addLayer(new HeldItemLayer(this, context.getItemInHandRenderer())); + } + + /** + * [VanillaCopy] {@link net.minecraft.client.renderer.entity.layers.ItemInHandLayer} with additional transforms + */ + private static class HeldItemLayer extends RenderLayer { + private final ItemInHandRenderer handRenderer; + + public HeldItemLayer(RenderLayerParent renderer, ItemInHandRenderer handRenderer) { + super(renderer); + this.handRenderer = handRenderer; + } + + @Override + public void render(PoseStack ms, MultiBufferSource buffers, int light, Kobold living, float limbSwing, float limbSwingAmount, float partialTicks, float ageInTicks, float netHeadYaw, float headPitch) { + boolean flag = living.getMainArm() == HumanoidArm.RIGHT; + ItemStack itemstack = flag ? living.getOffhandItem() : living.getMainHandItem(); + ItemStack itemstack1 = flag ? living.getMainHandItem() : living.getOffhandItem(); + if (!itemstack.isEmpty() || !itemstack1.isEmpty()) { + ms.pushPose(); + if (this.getParentModel().young) { + ms.translate(0.0D, 0.75D, 0.0D); + ms.scale(0.5F, 0.5F, 0.5F); + } + + this.renderItem(living, itemstack1, ItemDisplayContext.THIRD_PERSON_RIGHT_HAND, HumanoidArm.RIGHT, ms, buffers, light); + this.renderItem(living, itemstack, ItemDisplayContext.THIRD_PERSON_LEFT_HAND, HumanoidArm.LEFT, ms, buffers, light); + ms.popPose(); + } + } + + private void renderItem(LivingEntity entity, ItemStack stack, ItemDisplayContext transform, HumanoidArm handSide, PoseStack ms, MultiBufferSource buffers, int light) { + if (!stack.isEmpty()) { + ms.pushPose(); + this.getParentModel().translateToHand(handSide, ms); + ms.mulPose(Axis.XP.rotationDegrees(-90.0F)); + ms.mulPose(Axis.YP.rotationDegrees(180.0F)); + boolean flag = handSide == HumanoidArm.LEFT; + ms.translate(0.05D, 0.125D, -0.35D); + this.handRenderer.renderItem(entity, stack, transform, flag, ms, buffers, light); + ms.popPose(); + } + } + } +} diff --git a/src/main/java/twilightforest/client/renderer/entity/legacy/LegacyMinoshroomRenderer.java b/src/main/java/twilightforest/client/renderer/entity/legacy/LegacyMinoshroomRenderer.java new file mode 100644 index 0000000000..13f58d2f53 --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/entity/legacy/LegacyMinoshroomRenderer.java @@ -0,0 +1,79 @@ +package twilightforest.client.renderer.entity.legacy; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Axis; +import org.joml.Vector3f; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.block.BlockRenderDispatcher; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.entity.HumanoidMobRenderer; +import net.minecraft.client.renderer.entity.LivingEntityRenderer; +import net.minecraft.client.renderer.entity.RenderLayerParent; +import net.minecraft.client.renderer.entity.layers.RenderLayer; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import twilightforest.TwilightForestMod; +import twilightforest.client.model.entity.legacy.MinoshroomLegacyModel; +import twilightforest.entity.boss.Minoshroom; + +//old renderer had the head mushroom in a different spot - line is commented out +public class LegacyMinoshroomRenderer extends HumanoidMobRenderer { + + private static final ResourceLocation textureLoc = TwilightForestMod.getModelTexture("minoshroomtaur.png"); + + public LegacyMinoshroomRenderer(EntityRendererProvider.Context manager, MinoshroomLegacyModel model, float shadowSize) { + super(manager, model, shadowSize); + this.addLayer(new LayerMinoshroomMushroom(this)); + } + + /** + * [VanillaCopy] {@link net.minecraft.client.renderer.entity.layers.MushroomCowMushroomLayer} + */ + static class LayerMinoshroomMushroom extends RenderLayer { + + public LayerMinoshroomMushroom(RenderLayerParent renderer) { + super(renderer); + } + + @Override + public void render(PoseStack ms, MultiBufferSource buffers, int light, Minoshroom entity, float limbSwing, float limbSwingAmount, float partialTicks, float ageInTicks, float netHeadYaw, float headPitch) { + if (!entity.isBaby() && !entity.isInvisible()) { + BlockRenderDispatcher blockrendererdispatcher = Minecraft.getInstance().getBlockRenderer(); + BlockState blockstate = Blocks.RED_MUSHROOM.defaultBlockState(); // TF: hardcode mushroom state + int i = LivingEntityRenderer.getOverlayCoords(entity, 0.0F); + ms.pushPose(); + ms.translate(0.2F, -0.35F, 0.5D); + ms.mulPose(Axis.YP.rotationDegrees(-48.0F)); + ms.scale(-1.0F, -1.0F, 1.0F); + ms.translate(-0.5D, -0.5D, -0.5D); + blockrendererdispatcher.renderSingleBlock(blockstate, ms, buffers, light, i); + ms.popPose(); + ms.pushPose(); + ms.translate(0.2F, -0.35F, 0.5D); + ms.mulPose(Axis.YP.rotationDegrees(42.0F)); + ms.translate(0.1F, 0.0D, -0.6F); + ms.mulPose(Axis.YP.rotationDegrees(-48.0F)); + ms.scale(-1.0F, -1.0F, 1.0F); + ms.translate(-0.5D, -0.5D, -0.5D); + blockrendererdispatcher.renderSingleBlock(blockstate, ms, buffers, light, i); + ms.popPose(); + ms.pushPose(); + this.getParentModel().head.translateAndRotate(ms); + // TF - adjust head shroom + ms.translate(0.0D, -0.9, 0.05); + ms.mulPose(Axis.YP.rotationDegrees(-78.0F)); + ms.scale(-1.0F, -1.0F, 1.0F); + ms.translate(-0.5D, -0.5D, -0.5D); + blockrendererdispatcher.renderSingleBlock(blockstate, ms, buffers, light, i); + ms.popPose(); + } + } + } + + @Override + public ResourceLocation getTextureLocation(Minoshroom entity) { + return textureLoc; + } +} diff --git a/src/main/java/twilightforest/client/renderer/entity/legacy/LegacyNagaRenderer.java b/src/main/java/twilightforest/client/renderer/entity/legacy/LegacyNagaRenderer.java new file mode 100644 index 0000000000..9e00977913 --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/entity/legacy/LegacyNagaRenderer.java @@ -0,0 +1,57 @@ +package twilightforest.client.renderer.entity.legacy; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.entity.MobRenderer; +import net.minecraft.client.renderer.entity.RenderLayerParent; +import net.minecraft.client.renderer.entity.layers.RenderLayer; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.phys.Vec3; +import twilightforest.TwilightForestMod; +import twilightforest.client.model.entity.legacy.NagaLegacyModel; +import twilightforest.entity.boss.Naga; + +public class LegacyNagaRenderer> extends MobRenderer { + + private static final ResourceLocation textureLoc = TwilightForestMod.getModelTexture("nagahead.png"); + + public LegacyNagaRenderer(EntityRendererProvider.Context manager, M modelbase, float shadowSize) { + super(manager, modelbase, shadowSize); + this.addLayer(new NagaEyelidsLayer<>(this)); + } + + @Override + protected void scale(Naga entity, PoseStack stack, float p_225620_3_) { + super.scale(entity, stack, p_225620_3_); + //make size adjustment + stack.translate(0.0F, 1.75F, 0.0F); + stack.scale(2.0F, 2.0F, 2.0F); + } + + @Override + public ResourceLocation getTextureLocation(Naga entity) { + return textureLoc; + } + + public static class NagaEyelidsLayer> extends RenderLayer { + private static final ResourceLocation textureLocDazed = TwilightForestMod.getModelTexture("nagahead_dazed.png"); + + public NagaEyelidsLayer(RenderLayerParent renderer) { + super(renderer); + } + + @Override + public void render(PoseStack stack, MultiBufferSource buffer, int i, T entitylivingbaseIn, float limbSwing, float limbSwingAmount, float partialTicks, float ageInTicks, float netHeadYaw, float headPitch) { + if(entitylivingbaseIn.isDazed()) { + VertexConsumer vertex = buffer.getBuffer(RenderType.entityCutoutNoCull(textureLocDazed)); + this.getParentModel().renderToBuffer(stack, vertex, i, OverlayTexture.NO_OVERLAY, 1.0F, 1.0F, 1.0F, 1.0F); + } + } + } +} diff --git a/src/main/java/twilightforest/client/renderer/entity/legacy/LegacyNagaSegmentRenderer.java b/src/main/java/twilightforest/client/renderer/entity/legacy/LegacyNagaSegmentRenderer.java new file mode 100644 index 0000000000..5398fd66aa --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/entity/legacy/LegacyNagaSegmentRenderer.java @@ -0,0 +1,51 @@ +package twilightforest.client.renderer.entity.legacy; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Axis; +import org.joml.Vector3f; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.resources.ResourceLocation; +import twilightforest.TwilightForestMod; +import twilightforest.client.model.TFModelLayers; +import twilightforest.client.model.entity.legacy.NagaLegacyModel; +import twilightforest.client.renderer.entity.TFPartRenderer; +import twilightforest.entity.boss.NagaSegment; + +public class LegacyNagaSegmentRenderer extends TFPartRenderer> { + private static final ResourceLocation part_TextureLoc = TwilightForestMod.getModelTexture("nagasegment.png"); + + public LegacyNagaSegmentRenderer(EntityRendererProvider.Context m) { + super(m, new NagaLegacyModel<>(m.bakeLayer(TFModelLayers.LEGACY_NAGA_BODY))); + } + + @Override + public void render(T entityIn, float entityYaw, float partialTicks, PoseStack matrixStackIn, MultiBufferSource bufferIn, int packedLightIn) { + if(!entityIn.isInvisible()) { + matrixStackIn.pushPose(); + + float yawDiff = entityIn.getYRot() - entityIn.yRotO; + if (yawDiff > 180) { + yawDiff -= 360; + } else if (yawDiff < -180) { + yawDiff += 360; + } + float yaw2 = entityIn.yRotO + yawDiff * partialTicks; + + matrixStackIn.mulPose(Axis.YP.rotationDegrees(yaw2)); + matrixStackIn.mulPose(Axis.XP.rotationDegrees(entityIn.getXRot())); + + matrixStackIn.scale(2.0F, 2.0F, 2.0F); + matrixStackIn.translate(0.0D, -1.501F, 0.0D); + + int light = entityRenderDispatcher.getPackedLightCoords(entityIn.getParent(), partialTicks); + super.render(entityIn, entityYaw, partialTicks, matrixStackIn, bufferIn, light); + matrixStackIn.popPose(); + } + } + + @Override + public ResourceLocation getTextureLocation(T entity) { + return part_TextureLoc; + } +} diff --git a/src/main/java/twilightforest/client/renderer/entity/legacy/LegacyQuestRamRenderer.java b/src/main/java/twilightforest/client/renderer/entity/legacy/LegacyQuestRamRenderer.java new file mode 100644 index 0000000000..f2a9b71c72 --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/entity/legacy/LegacyQuestRamRenderer.java @@ -0,0 +1,45 @@ +package twilightforest.client.renderer.entity.legacy; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.entity.MobRenderer; +import net.minecraft.client.renderer.entity.RenderLayerParent; +import net.minecraft.client.renderer.entity.layers.RenderLayer; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import twilightforest.TwilightForestMod; +import twilightforest.client.model.entity.legacy.QuestRamLegacyModel; +import twilightforest.entity.passive.QuestRam; + +public class LegacyQuestRamRenderer extends MobRenderer { + + private static final ResourceLocation textureLoc = TwilightForestMod.getModelTexture("questram.png"); + private static final ResourceLocation textureLocLines = TwilightForestMod.getModelTexture("questram_lines.png"); + + public LegacyQuestRamRenderer(EntityRendererProvider.Context manager, QuestRamLegacyModel model) { + super(manager, model, 1.0F); + addLayer(new LayerGlowingLines(this)); + } + + @Override + public ResourceLocation getTextureLocation(QuestRam entity) { + return textureLoc; + } + + class LayerGlowingLines extends RenderLayer { + + public LayerGlowingLines(RenderLayerParent renderer) { + super(renderer); + } + + @Override + public void render(PoseStack stack, MultiBufferSource buffer, int i, QuestRam entity, float limbSwing, float limbSwingAmount, float partialTicks, float ageInTicks, float netHeadYaw, float headPitch) { + VertexConsumer builder = buffer.getBuffer(RenderType.entityTranslucent(textureLocLines)); + stack.scale(1.025f, 1.025f, 1.025f); + LegacyQuestRamRenderer.this.getModel().renderToBuffer(stack, builder, 0xF000F0, OverlayTexture.NO_OVERLAY, 1.0F, 1.0F, 1.0F, 1.0F); + } + } +} diff --git a/src/main/java/twilightforest/client/renderer/entity/legacy/LegacySlimeBeetleRenderer.java b/src/main/java/twilightforest/client/renderer/entity/legacy/LegacySlimeBeetleRenderer.java new file mode 100644 index 0000000000..c57e962361 --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/entity/legacy/LegacySlimeBeetleRenderer.java @@ -0,0 +1,57 @@ +package twilightforest.client.renderer.entity.legacy; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.entity.LivingEntityRenderer; +import net.minecraft.client.renderer.entity.MobRenderer; +import net.minecraft.client.renderer.entity.RenderLayerParent; +import net.minecraft.client.renderer.entity.layers.RenderLayer; +import net.minecraft.resources.ResourceLocation; +import twilightforest.TwilightForestMod; +import twilightforest.client.model.TFModelLayers; +import twilightforest.client.model.entity.legacy.SlimeBeetleLegacyModel; +import twilightforest.entity.monster.SlimeBeetle; + +public class LegacySlimeBeetleRenderer extends MobRenderer { + + private static final ResourceLocation textureLoc = TwilightForestMod.getModelTexture("slimebeetle.png"); + + public LegacySlimeBeetleRenderer(EntityRendererProvider.Context manager, SlimeBeetleLegacyModel model, float shadowSize) { + super(manager, model, shadowSize); + addLayer(new LayerInner(this, manager)); + } + + @Override + public void render(SlimeBeetle entityIn, float entityYaw, float partialTicks, PoseStack matrixStackIn, MultiBufferSource bufferIn, int packedLightIn) { + if(this.model.riding) matrixStackIn.translate(0, -0.5F, 0); + super.render(entityIn, entityYaw, partialTicks, matrixStackIn, bufferIn, packedLightIn); + } + + @Override + public ResourceLocation getTextureLocation(SlimeBeetle entity) { + return textureLoc; + } + + static class LayerInner extends RenderLayer { + private final SlimeBeetleLegacyModel innerModel; + + public LayerInner(RenderLayerParent renderer, EntityRendererProvider.Context manager) { + super(renderer); + innerModel = new SlimeBeetleLegacyModel(manager.bakeLayer(TFModelLayers.LEGACY_SLIME_BEETLE_TAIL)); + } + + @Override + public void render(PoseStack ms, MultiBufferSource buffers, int light, SlimeBeetle entity, float limbSwing, float limbSwingAmount, float partialTicks, float ageInTicks, float netHeadYaw, float headPitch) { + if (!entity.isInvisible()) { + innerModel.copyPropertiesTo(getParentModel()); + innerModel.prepareMobModel(entity, limbSwing, limbSwingAmount, partialTicks); + innerModel.setupAnim(entity, limbSwing, limbSwingAmount, ageInTicks, netHeadYaw, headPitch); + VertexConsumer buffer = buffers.getBuffer(RenderType.entityTranslucent(getTextureLocation(entity))); + innerModel.renderTail(ms, buffer, light, LivingEntityRenderer.getOverlayCoords(entity, 0), 1, 1, 1, 1); + } + } + } +} diff --git a/src/main/java/twilightforest/client/renderer/entity/legacy/LegacySnowQueenRenderer.java b/src/main/java/twilightforest/client/renderer/entity/legacy/LegacySnowQueenRenderer.java new file mode 100644 index 0000000000..d8851dd602 --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/entity/legacy/LegacySnowQueenRenderer.java @@ -0,0 +1,35 @@ +package twilightforest.client.renderer.entity.legacy; + +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.entity.HumanoidMobRenderer; +import net.minecraft.resources.ResourceLocation; +import twilightforest.TwilightForestMod; +import twilightforest.client.model.entity.legacy.SnowQueenLegacyModel; +import twilightforest.entity.boss.SnowQueen; + +public class LegacySnowQueenRenderer extends HumanoidMobRenderer { + + private static final ResourceLocation textureLoc = TwilightForestMod.getModelTexture("snowqueen.png"); + + public LegacySnowQueenRenderer(EntityRendererProvider.Context manager, SnowQueenLegacyModel model) { + super(manager, model, 0.625F); + } + + @Override + public ResourceLocation getTextureLocation(SnowQueen entity) { + return textureLoc; + } + + @Override + protected void scale(SnowQueen queen, PoseStack stack, float partialTicks) { + float scale = 1.2F; + stack.scale(scale, scale, scale); + } + + @Override + public void render(SnowQueen queen, float yaw, float partialTicks, PoseStack stack, MultiBufferSource buffer, int light) { + super.render(queen, yaw, partialTicks, stack, buffer, light); + } +} diff --git a/src/main/java/twilightforest/client/renderer/entity/legacy/LegacyTinyBirdRenderer.java b/src/main/java/twilightforest/client/renderer/entity/legacy/LegacyTinyBirdRenderer.java new file mode 100644 index 0000000000..afcd7d1fdc --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/entity/legacy/LegacyTinyBirdRenderer.java @@ -0,0 +1,20 @@ +package twilightforest.client.renderer.entity.legacy; + +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.resources.ResourceLocation; +import twilightforest.TwilightForestMod; +import twilightforest.client.model.entity.legacy.TinyBirdLegacyModel; +import twilightforest.client.renderer.entity.BirdRenderer; +import twilightforest.entity.passive.TinyBird; + +public class LegacyTinyBirdRenderer extends BirdRenderer { + + public LegacyTinyBirdRenderer(EntityRendererProvider.Context manager, TinyBirdLegacyModel model, float shadowSize) { + super(manager, model, shadowSize, ""); + } + + @Override + public ResourceLocation getTextureLocation(TinyBird entity) { + return entity.getBirdType().texture(); + } +} diff --git a/src/main/java/twilightforest/client/renderer/entity/legacy/LegacyUpperGoblinKnightRenderer.java b/src/main/java/twilightforest/client/renderer/entity/legacy/LegacyUpperGoblinKnightRenderer.java new file mode 100644 index 0000000000..9160f848f0 --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/entity/legacy/LegacyUpperGoblinKnightRenderer.java @@ -0,0 +1,52 @@ +package twilightforest.client.renderer.entity.legacy; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Axis; +import org.joml.Vector3f; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import twilightforest.client.model.entity.legacy.UpperGoblinKnightLegacyModel; +import twilightforest.client.renderer.entity.TFBipedRenderer; +import twilightforest.entity.monster.UpperGoblinKnight; + +public class LegacyUpperGoblinKnightRenderer extends TFBipedRenderer { + public LegacyUpperGoblinKnightRenderer(EntityRendererProvider.Context manager, UpperGoblinKnightLegacyModel model, float shadowSize) { + super(manager, model, shadowSize, "doublegoblin.png"); + } + + @Override + protected void setupRotations(UpperGoblinKnight upperKnight, PoseStack stack, float ageInTicks, float rotationYaw, float partialTicks) { + super.setupRotations(upperKnight, stack, ageInTicks, rotationYaw, partialTicks); + + if (upperKnight.heavySpearTimer > 0) { + stack.mulPose(Axis.XP.rotationDegrees(getPitchForAttack((60 - upperKnight.heavySpearTimer) + partialTicks))); + } + } + + /** + * Figure out what pitch the goblin should be at depending on where it's at on the the timer + */ + private float getPitchForAttack(float attackTime) { + if (attackTime <= 10) { + // rock back + return attackTime * 3.0F; + } + if (attackTime > 10 && attackTime <= 30) { + // hang back + return 30F; + } + if (attackTime > 30 && attackTime <= 33) { + // slam forward + return (attackTime - 30) * -25F + 30F; + } + if (attackTime > 33 && attackTime <= 50) { + // stay forward + return -45F; + } + if (attackTime > 50 && attackTime <= 60) { + // back to normal + return (10 - (attackTime - 50)) * -4.5F; + } + + return 0; + } +} diff --git a/src/main/java/twilightforest/client/renderer/entity/legacy/LegacyUrGhastRenderer.java b/src/main/java/twilightforest/client/renderer/entity/legacy/LegacyUrGhastRenderer.java new file mode 100644 index 0000000000..d776a9fa0b --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/entity/legacy/LegacyUrGhastRenderer.java @@ -0,0 +1,28 @@ +package twilightforest.client.renderer.entity.legacy; + +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.resources.ResourceLocation; +import twilightforest.TwilightForestMod; +import twilightforest.client.model.entity.legacy.UrGhastLegacyModel; +import twilightforest.client.renderer.entity.CarminiteGhastRenderer; +import twilightforest.entity.boss.UrGhast; + +public class LegacyUrGhastRenderer extends CarminiteGhastRenderer { + + private final ResourceLocation textureLocClosed = TwilightForestMod.getModelTexture("towerboss.png"); + private final ResourceLocation textureLocOpen = TwilightForestMod.getModelTexture("towerboss_openeyes.png"); + private final ResourceLocation textureLocAttack = TwilightForestMod.getModelTexture("towerboss_fire.png"); + + public LegacyUrGhastRenderer(EntityRendererProvider.Context manager, UrGhastLegacyModel modelTFGhast, float shadowSize, float scale) { + super(manager, modelTFGhast, shadowSize, scale); + } + + @Override + public ResourceLocation getTextureLocation(UrGhast entity) { + return switch (entity.isCharging() ? 2 : entity.getAttackStatus()) { + case 1 -> textureLocOpen; + case 2 -> textureLocAttack; + default -> textureLocClosed; + }; + } +} diff --git a/src/main/java/twilightforest/client/renderer/entity/legacy/package-info.java b/src/main/java/twilightforest/client/renderer/entity/legacy/package-info.java new file mode 100644 index 0000000000..158e4ab69d --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/entity/legacy/package-info.java @@ -0,0 +1,7 @@ +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault +package twilightforest.client.renderer.entity.legacy; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; diff --git a/src/main/java/twilightforest/client/renderer/entity/package-info.java b/src/main/java/twilightforest/client/renderer/entity/package-info.java new file mode 100644 index 0000000000..acaf62c530 --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/entity/package-info.java @@ -0,0 +1,6 @@ +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault +package twilightforest.client.renderer.entity; + +import net.minecraft.MethodsReturnNonnullByDefault; +import javax.annotation.ParametersAreNonnullByDefault; diff --git a/src/main/java/twilightforest/client/renderer/package-info.java b/src/main/java/twilightforest/client/renderer/package-info.java new file mode 100644 index 0000000000..1fb495829c --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.client.renderer; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; diff --git a/src/main/java/twilightforest/client/renderer/tileentity/CasketTileEntityRenderer.java b/src/main/java/twilightforest/client/renderer/tileentity/CasketTileEntityRenderer.java new file mode 100644 index 0000000000..ed69e598aa --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/tileentity/CasketTileEntityRenderer.java @@ -0,0 +1,111 @@ +package twilightforest.client.renderer.tileentity; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.math.Axis; +import org.joml.Vector3f; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; +import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; +import net.minecraft.core.Direction; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.DoubleBlockCombiner; +import net.minecraft.world.level.block.HorizontalDirectionalBlock; +import net.minecraft.world.level.block.entity.LidBlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import twilightforest.TwilightForestMod; +import twilightforest.block.KeepsakeCasketBlock; +import twilightforest.init.TFBlocks; +import twilightforest.block.entity.KeepsakeCasketBlockEntity; +import twilightforest.client.model.TFModelLayers; + +/** + * Keepsake Casket Model - MCVinnyq + * Created using Tabula 8.0.0 + */ +//Most of the other stuff is derived from ChestTileEntityRenderer +@OnlyIn(Dist.CLIENT) +public class CasketTileEntityRenderer implements BlockEntityRenderer { + public final ModelPart base; + public ModelPart lid; + + public CasketTileEntityRenderer(BlockEntityRendererProvider.Context renderer) { + var root = renderer.bakeLayer(TFModelLayers.KEEPSAKE_CASKET); + + this.base = root.getChild("base"); + this.lid = root.getChild("lid"); + } + + public static LayerDefinition create() { + MeshDefinition meshdefinition = new MeshDefinition(); + PartDefinition partdefinition = meshdefinition.getRoot(); + partdefinition.addOrReplaceChild("lid", + CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-8.0F, -8.0F, -13.0F, 16.0F, 10.0F, 14.0F) + .texOffs(0, 46) + .addBox(-8.0F, -10.0F, -13.0F, 16.0F, 2.0F, 0.0F) + .texOffs(2, 34) + .addBox(-7.99F, -10.0F, -12.0F, 0.0F, 2.0F, 14.0F) + .texOffs(2, 36) + .addBox(7.99F, -10.0F, -12.0F, 0.0F, 2.0F, 14.0F), + PartPose.offset(0.0F, -6.0F, 6.0F)); + partdefinition.addOrReplaceChild("base", + CubeListBuilder.create() + .texOffs(1, 28) + .addBox(-7.0F, -10.0F, -2.0F, 14.0F, 10.0F, 8.0F) + .texOffs(0, 26) + .addBox(-7.0F, -10.0F, -6.0F, 1.0F, 6.0F, 4.0F) + .texOffs(40, 26) + .addBox(6.0F, -10.0F, -6.0F, 1.0F, 6.0F, 4.0F) + .texOffs(0, 56) + .addBox(-7.0F, -4.0F, -6.0F, 14.0F, 4.0F, 4.0F), + PartPose.offset(0.0F, -0.01F, 0.0F)); + return LayerDefinition.create(meshdefinition, 64, 64); + } + + + @Override + public void render(T tileEntityIn, float partialTicks, PoseStack matrixStackIn, MultiBufferSource bufferIn, int combinedLightIn, int combinedOverlayIn) { + Level world = tileEntityIn.getLevel(); + boolean flag = world != null; + BlockState blockstate = flag ? tileEntityIn.getBlockState() : TFBlocks.KEEPSAKE_CASKET.get().defaultBlockState(); + Block block = blockstate.getBlock(); + if (block instanceof KeepsakeCasketBlock) { + int damage = blockstate.getValue(KeepsakeCasketBlock.BREAKAGE); + Direction facing = blockstate.getValue(HorizontalDirectionalBlock.FACING); + + matrixStackIn.pushPose(); + + matrixStackIn.translate(0.5, 0.0, 0.5); + matrixStackIn.mulPose(facing.getRotation()); + matrixStackIn.mulPose(Axis.XP.rotationDegrees(90.0F)); + + DoubleBlockCombiner.NeighborCombineResult icallbackwrapper = DoubleBlockCombiner.Combiner::acceptNone; + float f1 = icallbackwrapper.apply(KeepsakeCasketBlock.getLidRotationCallback(tileEntityIn)).get(partialTicks); + f1 = 1.0F - f1; + f1 = 1.0F - f1 * f1 * f1; + + ResourceLocation CASKET = TwilightForestMod.getModelTexture("casket/keepsake_casket_" + damage + ".png"); + this.renderModels(matrixStackIn, bufferIn.getBuffer(RenderType.entityCutoutNoCull(CASKET)), this.lid, this.base, f1, combinedLightIn, combinedOverlayIn); + matrixStackIn.popPose(); + } + } + + private void renderModels(PoseStack matrixStackIn, VertexConsumer bufferIn, ModelPart lid, ModelPart base, float lidAngle, int combinedLightIn, int combinedOverlayIn) { + lid.xRot = -(lidAngle * ((float)Math.PI / 2F)); + lid.render(matrixStackIn, bufferIn, combinedLightIn, combinedOverlayIn); + base.render(matrixStackIn, bufferIn, combinedLightIn, combinedOverlayIn); + } +} diff --git a/src/main/java/twilightforest/client/renderer/tileentity/CicadaTileEntityRenderer.java b/src/main/java/twilightforest/client/renderer/tileentity/CicadaTileEntityRenderer.java new file mode 100644 index 0000000000..79da5f6f0a --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/tileentity/CicadaTileEntityRenderer.java @@ -0,0 +1,48 @@ +package twilightforest.client.renderer.tileentity; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.math.Axis; +import org.joml.Vector3f; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; +import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; +import net.minecraft.core.Direction; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.DirectionalBlock; +import twilightforest.TwilightForestMod; +import twilightforest.block.entity.CicadaBlockEntity; +import twilightforest.client.BugModelAnimationHelper; +import twilightforest.client.model.TFModelLayers; +import twilightforest.client.model.entity.CicadaModel; + +import org.jetbrains.annotations.Nullable; + +public class CicadaTileEntityRenderer implements BlockEntityRenderer { + + private final CicadaModel cicadaModel; + private static final ResourceLocation textureLoc = TwilightForestMod.getModelTexture("cicada-model.png"); + + public CicadaTileEntityRenderer(BlockEntityRendererProvider.Context renderer) { + this.cicadaModel = new CicadaModel(renderer.bakeLayer(TFModelLayers.CICADA)); + } + + @Override + public void render(@Nullable CicadaBlockEntity te, float partialTicks, PoseStack ms, MultiBufferSource buffers, int light, int overlay) { + int yaw = te != null ? te.currentYaw : BugModelAnimationHelper.currentYaw; + + ms.pushPose(); + Direction facing = te != null ? te.getBlockState().getValue(DirectionalBlock.FACING) : Direction.NORTH; + float randRot = te != null ? te.randRot : 0.0F; + + ms.translate(0.5F, 0.5F, 0.5F); + ms.mulPose(facing.getRotation()); + ms.mulPose(Axis.ZP.rotationDegrees(180.0F)); + ms.mulPose(Axis.YP.rotationDegrees(180.0F + randRot)); + ms.mulPose(Axis.YN.rotationDegrees(yaw)); + + VertexConsumer vertex = buffers.getBuffer(cicadaModel.renderType(textureLoc)); + cicadaModel.renderToBuffer(ms, vertex, light, overlay, 1.0F, 1.0F, 1.0F, 1.0F); + ms.popPose(); + } +} diff --git a/src/main/java/twilightforest/client/renderer/tileentity/FireflyTileEntityRenderer.java b/src/main/java/twilightforest/client/renderer/tileentity/FireflyTileEntityRenderer.java new file mode 100644 index 0000000000..1074e6c608 --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/tileentity/FireflyTileEntityRenderer.java @@ -0,0 +1,58 @@ +package twilightforest.client.renderer.tileentity; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.math.Axis; +import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; +import net.minecraft.world.level.block.DirectionalBlock; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; +import net.minecraft.core.Direction; +import net.minecraft.resources.ResourceLocation; +import org.joml.Vector3f; +import twilightforest.TwilightForestMod; +import twilightforest.client.BugModelAnimationHelper; +import twilightforest.client.model.TFModelLayers; +import twilightforest.client.model.entity.FireflyModel; +import twilightforest.block.entity.FireflyBlockEntity; + +import org.jetbrains.annotations.Nullable; + +public class FireflyTileEntityRenderer implements BlockEntityRenderer { + + private final FireflyModel fireflyModel; + private static final ResourceLocation textureLoc = TwilightForestMod.getModelTexture("firefly-tiny.png"); + + public FireflyTileEntityRenderer(BlockEntityRendererProvider.Context renderer) { + this.fireflyModel = new FireflyModel(renderer.bakeLayer(TFModelLayers.FIREFLY)); + } + + @Override + public void render(@Nullable FireflyBlockEntity te, float partialTicks, PoseStack ms, MultiBufferSource buffer, int light, int overlay) { + int yaw = te != null ? te.currentYaw : BugModelAnimationHelper.currentYaw; + float glow = te != null ? te.glowIntensity : BugModelAnimationHelper.glowIntensity; + float randRot = te != null ? te.randRot : 0.0F; + + ms.pushPose(); + Direction facing = te != null ? te.getBlockState().getValue(DirectionalBlock.FACING) : Direction.NORTH; + + ms.translate(0.5F, 0.5F, 0.5F); + ms.mulPose(facing.getRotation()); + ms.mulPose(Axis.ZP.rotationDegrees(180.0F)); + ms.mulPose(Axis.YP.rotationDegrees(180.0F + randRot)); + ms.mulPose(Axis.YN.rotationDegrees(yaw)); + + ms.pushPose(); + + VertexConsumer builder = buffer.getBuffer(RenderType.entityCutout(textureLoc)); + fireflyModel.renderToBuffer(ms, builder, light, OverlayTexture.NO_OVERLAY, 1.0F, 1.0F, 1.0F, 1.0F); + + builder = buffer.getBuffer(RenderType.entityTranslucent(textureLoc)); + fireflyModel.glow.render(ms, builder, 0xF000F0, OverlayTexture.NO_OVERLAY, 1.0F, 1.0F, 1.0F, glow); + + ms.popPose(); + ms.popPose(); + } +} diff --git a/src/main/java/twilightforest/client/renderer/tileentity/MoonwormTileEntityRenderer.java b/src/main/java/twilightforest/client/renderer/tileentity/MoonwormTileEntityRenderer.java new file mode 100644 index 0000000000..e9256d42ef --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/tileentity/MoonwormTileEntityRenderer.java @@ -0,0 +1,53 @@ +package twilightforest.client.renderer.tileentity; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.math.Axis; +import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; +import net.minecraft.world.level.block.DirectionalBlock; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; +import net.minecraft.core.Direction; +import net.minecraft.resources.ResourceLocation; +import org.joml.Vector3f; +import twilightforest.TwilightForestMod; +import twilightforest.client.BugModelAnimationHelper; +import twilightforest.client.model.TFModelLayers; +import twilightforest.client.model.entity.MoonwormModel; +import twilightforest.block.entity.MoonwormBlockEntity; + +import org.jetbrains.annotations.Nullable; + +public class MoonwormTileEntityRenderer implements BlockEntityRenderer { + + private static final ResourceLocation textureLoc = TwilightForestMod.getModelTexture("moonworm.png"); + private final MoonwormModel moonwormModel; + + public MoonwormTileEntityRenderer(BlockEntityRendererProvider.Context renderer) { + this.moonwormModel = new MoonwormModel(renderer.bakeLayer(TFModelLayers.MOONWORM)); + } + + @Override + public void render(@Nullable MoonwormBlockEntity te, float partialTicks, PoseStack ms, MultiBufferSource buffer, int light, int overlay) { + int yaw = te != null ? te.currentYaw : BugModelAnimationHelper.currentRotation; + if (te == null) partialTicks = Minecraft.getInstance().getFrameTime(); + float randRot = te != null ? te.randRot : 0.0F; + + ms.pushPose(); + Direction facing = te != null ? te.getBlockState().getValue(DirectionalBlock.FACING) : Direction.NORTH; + + ms.translate(0.5F, 0.5F, 0.5F); + ms.mulPose(facing.getRotation()); + ms.mulPose(Axis.ZP.rotationDegrees(180.0F)); + ms.mulPose(Axis.YP.rotationDegrees(180.0F + randRot)); + ms.mulPose(Axis.YN.rotationDegrees(yaw)); + + VertexConsumer builder = buffer.getBuffer(this.moonwormModel.renderType(textureLoc)); + this.moonwormModel.setRotationAngles(te, partialTicks); + this.moonwormModel.renderToBuffer(ms, builder, light, OverlayTexture.NO_OVERLAY, 1.0F, 1.0F, 1.0F, 1.0F); + + ms.popPose(); + } +} diff --git a/src/main/java/twilightforest/client/renderer/tileentity/RedThreadRenderer.java b/src/main/java/twilightforest/client/renderer/tileentity/RedThreadRenderer.java new file mode 100644 index 0000000000..2ef61fc910 --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/tileentity/RedThreadRenderer.java @@ -0,0 +1,129 @@ +package twilightforest.client.renderer.tileentity; + +import com.mojang.blaze3d.vertex.DefaultVertexFormat; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.blaze3d.vertex.VertexFormat; +import com.mojang.math.Axis; +import org.joml.Vector3f; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderStateShard; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; +import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.PipeBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.Vec3; +import twilightforest.TwilightForestMod; +import twilightforest.block.entity.RedThreadBlockEntity; +import twilightforest.client.TFShaders; +import twilightforest.client.model.TFModelLayers; +import twilightforest.client.model.entity.RedThreadModel; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFItems; + +public class RedThreadRenderer implements BlockEntityRenderer { + private static final ResourceLocation textureLoc = TwilightForestMod.getModelTexture("red_thread.png"); + private final RedThreadModel redThreadModel; + + private static final RenderType GLOW = RenderType + .create(TwilightForestMod.ID + ":glow", DefaultVertexFormat.BLOCK, VertexFormat.Mode.QUADS, 2097152, true, false, RenderType.CompositeState + .builder() + .setLightmapState(new RenderStateShard.LightmapStateShard(true)) + .setCullState(new RenderStateShard.CullStateShard(true)) + .setDepthTestState(new RenderStateShard.DepthTestStateShard("always", 519)) + .setShaderState(new RenderStateShard.ShaderStateShard(() -> TFShaders.RED_THREAD)) + .setTextureState(new RenderStateShard.TextureStateShard(textureLoc, false, true)) + .createCompositeState(true)); + + public RedThreadRenderer(BlockEntityRendererProvider.Context context) { + this.redThreadModel = new RedThreadModel(context.bakeLayer(TFModelLayers.RED_THREAD)); + } + + @Override + public void render(T thread, float ticks, PoseStack poseStack, MultiBufferSource source, int light, int overlay) { + BlockState state = thread.getBlockState(); + boolean glow = Minecraft.getInstance().player != null && Minecraft.getInstance().player.isHolding(TFItems.RED_THREAD.get()); + + for (Direction face : Direction.values()) { + if (state.getValue(PipeBlock.PROPERTY_BY_DIRECTION.get(face))) { + poseStack.pushPose(); + Vec3 xyz = getXYZ(face); + poseStack.translate(xyz.x, xyz.y, xyz.z); + poseStack.mulPose(Axis.ZP.rotationDegrees(getZPDegrees(face))); + poseStack.mulPose(Axis.XP.rotationDegrees(getXPDegrees(face))); + poseStack.pushPose(); + poseStack.translate(0.5D, 0D, 0.5D); + this.render(thread, face, poseStack, glow ? source.getBuffer(GLOW) : source.getBuffer(RenderType.entityCutout(textureLoc)), glow ? 15728880 : light); + poseStack.popPose(); + poseStack.popPose(); + } + } + } + + private void render(T thread, Direction face, PoseStack poseStack, VertexConsumer consumer, int light) { + Level level = thread.getLevel(); + BlockPos pos = thread.getBlockPos(); + + this.redThreadModel.center.render(poseStack, consumer, light, OverlayTexture.NO_OVERLAY, 1.0F, 1.0F, 1.0F, 1.0F); + for (Direction direction : Direction.values()) { + if (!direction.getAxis().equals(face.getAxis())) { + //We check the blockState to see if the thread on this face is connecting to a different face of the same block. + boolean flag = thread.getBlockState().getValue(PipeBlock.PROPERTY_BY_DIRECTION.get(direction)); + + if (!flag && level != null) { //If there is no other face to connect to, we check neighbouring positions for other red thread blocks. + BlockState state = level.getBlockState(pos.relative(direction)); + flag = state.getBlock().equals(TFBlocks.RED_THREAD.get()) && state.getValue(PipeBlock.PROPERTY_BY_DIRECTION.get(face)); + + if (!flag) { //And if the above check also fails, we check if there is a red thread behind the corner for us to connect to. + state = level.getBlockState(pos.relative(direction).relative(face)); + //check if theres a block in the way of the connection. If there is, dont connect + boolean threadBlocked = level.getBlockState(pos.relative(direction)).isFaceSturdy(level, pos, direction.getOpposite()); + flag = state.getBlock().equals(TFBlocks.RED_THREAD.get()) && !threadBlocked && state.getValue(PipeBlock.PROPERTY_BY_DIRECTION.get(direction.getOpposite())); + } + } + + if (flag) this.redThreadModel.getPart(face, direction).render(poseStack, consumer, light, OverlayTexture.NO_OVERLAY, 1.0F, 1.0F, 1.0F, 1.0F); + } + } + } + + /** + * Get the offset for our model, based on the face it is placed on. + */ + private static Vec3 getXYZ(Direction face) { + return new Vec3( + face == Direction.EAST || face == Direction.UP ? 1D : 0D, + face == Direction.WEST || face == Direction.UP || face == Direction.NORTH ? 1D : 0D, + face == Direction.SOUTH ? 1D : 0D); + } + + /** + * Get the amount of degrees our model will be rotated by on the Z axis, based on the face it is placed on. + */ + private static float getZPDegrees(Direction face) { + return switch (face) { + case EAST -> 90.0F; + case UP -> 180.0F; + case WEST -> 270.0F; + default -> 0.0F; + }; + } + + /** + * Get the amount of degrees our model will be rotated by on the X axis, based on the face it is placed on. + */ + private static float getXPDegrees(Direction face) { + return switch (face) { + case NORTH -> 90.0F; + case SOUTH -> 270.0F; + default -> 0.0F; + }; + } +} diff --git a/src/main/java/twilightforest/client/renderer/tileentity/SkullCandleTileEntityRenderer.java b/src/main/java/twilightforest/client/renderer/tileentity/SkullCandleTileEntityRenderer.java new file mode 100644 index 0000000000..9568557f9a --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/tileentity/SkullCandleTileEntityRenderer.java @@ -0,0 +1,114 @@ +package twilightforest.client.renderer.tileentity; + +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Maps; +import com.mojang.authlib.GameProfile; +import com.mojang.authlib.minecraft.MinecraftProfileTexture; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.Util; +import net.minecraft.client.Minecraft; +import net.minecraft.client.model.SkullModel; +import net.minecraft.client.model.SkullModelBase; +import net.minecraft.client.model.geom.EntityModelSet; +import net.minecraft.client.model.geom.ModelLayers; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; +import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.client.resources.DefaultPlayerSkin; +import net.minecraft.core.Direction; +import net.minecraft.core.UUIDUtil; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.block.CandleBlock; +import net.minecraft.world.level.block.SkullBlock; +import net.minecraft.world.level.block.state.BlockState; +import twilightforest.block.AbstractLightableBlock; +import twilightforest.block.AbstractSkullCandleBlock; +import twilightforest.block.SkullCandleBlock; +import twilightforest.block.WallSkullCandleBlock; +import twilightforest.block.entity.SkullCandleBlockEntity; + +import org.jetbrains.annotations.Nullable; +import java.util.Map; + +//[VanillaCopy] of SkullBlockRenderer, but add le candel +public class SkullCandleTileEntityRenderer implements BlockEntityRenderer { + + private final Map modelByType; + + public static final Map SKIN_BY_TYPE = Util.make(Maps.newHashMap(), (p_112552_) -> { + p_112552_.put(SkullBlock.Types.SKELETON, new ResourceLocation("textures/entity/skeleton/skeleton.png")); + p_112552_.put(SkullBlock.Types.WITHER_SKELETON, new ResourceLocation("textures/entity/skeleton/wither_skeleton.png")); + p_112552_.put(SkullBlock.Types.ZOMBIE, new ResourceLocation("textures/entity/zombie/zombie.png")); + p_112552_.put(SkullBlock.Types.CREEPER, new ResourceLocation("textures/entity/creeper/creeper.png")); + p_112552_.put(SkullBlock.Types.PLAYER, DefaultPlayerSkin.getDefaultSkin()); + }); + + public static Map createSkullRenderers(EntityModelSet p_173662_) { + ImmutableMap.Builder var1 = ImmutableMap.builder(); + var1.put(SkullBlock.Types.SKELETON, new SkullModel(p_173662_.bakeLayer(ModelLayers.SKELETON_SKULL))); + var1.put(SkullBlock.Types.WITHER_SKELETON, new SkullModel(p_173662_.bakeLayer(ModelLayers.WITHER_SKELETON_SKULL))); + var1.put(SkullBlock.Types.PLAYER, new SkullModel(p_173662_.bakeLayer(ModelLayers.PLAYER_HEAD))); + var1.put(SkullBlock.Types.ZOMBIE, new SkullModel(p_173662_.bakeLayer(ModelLayers.ZOMBIE_HEAD))); + var1.put(SkullBlock.Types.CREEPER, new SkullModel(p_173662_.bakeLayer(ModelLayers.CREEPER_HEAD))); + return var1.build(); + } + + public SkullCandleTileEntityRenderer(BlockEntityRendererProvider.Context renderer) { + this.modelByType = createSkullRenderers(renderer.getModelSet()); + } + + @Override + public void render(SkullCandleBlockEntity tile, float ticks, PoseStack ms, MultiBufferSource buffer, int light, int overlay) { + BlockState state = tile.getBlockState(); + boolean flag = state.getBlock() instanceof WallSkullCandleBlock; + Direction dir = flag ? state.getValue(WallSkullCandleBlock.FACING) : null; + float offset = 22.5F * (float) (flag ? (2 + dir.get2DDataValue()) * 4 : state.getValue(SkullCandleBlock.ROTATION)); + SkullBlock.Type type = ((AbstractSkullCandleBlock) state.getBlock()).getType(); + SkullModelBase base = this.modelByType.get(type); + RenderType render = getRenderType(type, tile.getOwnerProfile()); + renderSkull(dir, offset, 0.0F, ms, buffer, light, base, render); + + if (dir != null) { + ms.translate(-(float) dir.getStepX() * 0.25F, 0.0D, -(float) dir.getStepZ() * 0.25F); + } + ms.translate(0.0F, flag ? 0.75F : 0.45F, 0.0F); + if (tile.candleAmount <= 0) tile.candleAmount = 1; + Minecraft.getInstance().getBlockRenderer().renderSingleBlock( + AbstractSkullCandleBlock.candleColorToCandle(AbstractSkullCandleBlock.CandleColors.colorFromInt(tile.candleColor).getSerializedName()) + .defaultBlockState() + .setValue(CandleBlock.CANDLES, tile.candleAmount) + .setValue(CandleBlock.LIT, state.getValue(AbstractSkullCandleBlock.LIGHTING) == AbstractLightableBlock.Lighting.NORMAL), ms, buffer, light, overlay); + + } + + public static void renderSkull(@Nullable Direction dir, float ticks, float animTime, PoseStack ms, MultiBufferSource buffer, int light, SkullModelBase base, RenderType render) { + + ms.pushPose(); + if (dir == null) { + ms.translate(0.5D, 0.0D, 0.5D); + } else { + ms.translate(0.5F - (float)dir.getStepX() * 0.25F, 0.25D, 0.5F - (float)dir.getStepZ() * 0.25F); + } + + ms.scale(-1.0F, -1.0F, 1.0F); + VertexConsumer consumer = buffer.getBuffer(render); + base.setupAnim(animTime, ticks, 0.0F); + base.renderToBuffer(ms, consumer, light, OverlayTexture.NO_OVERLAY, 1.0F, 1.0F, 1.0F, 1.0F); + ms.popPose(); + } + + public static RenderType getRenderType(SkullBlock.Type pSkullType, @Nullable GameProfile pGameProfile) { + ResourceLocation resourcelocation = SKIN_BY_TYPE.get(pSkullType); + if (pSkullType == SkullBlock.Types.PLAYER && pGameProfile != null) { + Minecraft minecraft = Minecraft.getInstance(); + Map map = minecraft.getSkinManager().getInsecureSkinInformation(pGameProfile); + return map.containsKey(MinecraftProfileTexture.Type.SKIN) ? RenderType.entityTranslucent(minecraft.getSkinManager().registerTexture(map.get(MinecraftProfileTexture.Type.SKIN), MinecraftProfileTexture.Type.SKIN)) : RenderType.entityCutoutNoCull(DefaultPlayerSkin.getDefaultSkin(UUIDUtil.getOrCreatePlayerUUID(pGameProfile))); + } else { + return RenderType.entityCutoutNoCullZOffset(resourcelocation); + } + } +} diff --git a/src/main/java/twilightforest/client/renderer/tileentity/TrophyTileEntityRenderer.java b/src/main/java/twilightforest/client/renderer/tileentity/TrophyTileEntityRenderer.java new file mode 100644 index 0000000000..d6543fe5d4 --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/tileentity/TrophyTileEntityRenderer.java @@ -0,0 +1,171 @@ +package twilightforest.client.renderer.tileentity; + +import com.google.common.collect.ImmutableMap; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.Minecraft; +import net.minecraft.client.model.geom.EntityModelSet; +import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.block.model.ItemTransforms; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; +import net.minecraft.world.item.ItemStack; +import net.minecraft.core.Direction; +import net.minecraft.resources.ResourceLocation; +import twilightforest.TwilightForestMod; +import twilightforest.block.AbstractTrophyBlock; +import twilightforest.block.TrophyBlock; +import twilightforest.block.TrophyWallBlock; +import twilightforest.init.TFBlocks; +import twilightforest.client.model.TFModelLayers; +import twilightforest.client.model.tileentity.*; +import twilightforest.client.model.tileentity.legacy.*; +import twilightforest.enums.BossVariant; +import twilightforest.block.entity.TrophyBlockEntity; + +import org.jetbrains.annotations.Nullable; +import java.util.Map; +import java.util.function.BooleanSupplier; + +//Legacy lines are commented out and labeled +public class TrophyTileEntityRenderer implements BlockEntityRenderer { + + private final Map trophies; + + private static final ResourceLocation textureLocHydra = TwilightForestMod.getModelTexture("hydra4.png"); + private static final ResourceLocation textureLocNaga = TwilightForestMod.getModelTexture("nagahead.png"); + private static final ResourceLocation textureLocLich = TwilightForestMod.getModelTexture("twilightlich64.png"); + private static final ResourceLocation textureLocUrGhast = TwilightForestMod.getModelTexture("towerboss.png"); + private static final ResourceLocation textureLocSnowQueen = TwilightForestMod.getModelTexture("snowqueen.png"); + private static final ResourceLocation textureLocMinoshroom = TwilightForestMod.getModelTexture("minoshroomtaur.png"); + private static final ResourceLocation textureLocKnightPhantom = TwilightForestMod.getModelTexture("phantomskeleton.png"); + private static final ResourceLocation textureLocKnightPhantomArmor = new ResourceLocation(TwilightForestMod.ARMOR_DIR + "phantom_1.png"); + private static final ResourceLocation textureLocYeti = TwilightForestMod.getModelTexture("yetialpha.png"); + private static final ResourceLocation textureLocQuestRam = TwilightForestMod.getModelTexture("questram.png"); + private static final ResourceLocation textureLocQuestRamLines = TwilightForestMod.getModelTexture("questram_lines.png"); + + public TrophyTileEntityRenderer(BlockEntityRendererProvider.Context renderer) { + this.trophies = createTrophyRenderers(renderer.getModelSet()); + } + + public static Map createTrophyRenderers(EntityModelSet set) { + BooleanSupplier legacy = () -> Minecraft.getInstance().getResourcePackRepository().getSelectedIds().contains("builtin/twilight_forest_classic_resources"); + ImmutableMap.Builder trophyList = ImmutableMap.builder(); + trophyList.put(BossVariant.NAGA, new NagaTrophyModel(set.bakeLayer(TFModelLayers.NAGA_TROPHY))); + trophyList.put(BossVariant.LICH, new LichTrophyModel(set.bakeLayer(TFModelLayers.LICH_TROPHY))); + trophyList.put(BossVariant.MINOSHROOM, legacy.getAsBoolean() ? new MinoshroomTrophyLegacyModel(set.bakeLayer(TFModelLayers.LEGACY_MINOSHROOM_TROPHY)) : new MinoshroomTrophyModel(set.bakeLayer(TFModelLayers.MINOSHROOM_TROPHY))); + trophyList.put(BossVariant.HYDRA, legacy.getAsBoolean() ? new HydraTrophyLegacyModel(set.bakeLayer(TFModelLayers.LEGACY_HYDRA_TROPHY)) : new HydraTrophyModel(set.bakeLayer(TFModelLayers.HYDRA_TROPHY))); + trophyList.put(BossVariant.KNIGHT_PHANTOM, new KnightPhantomTrophyModel(set.bakeLayer(TFModelLayers.KNIGHT_PHANTOM_TROPHY))); + trophyList.put(BossVariant.UR_GHAST, new UrGhastTrophyModel(set.bakeLayer(TFModelLayers.UR_GHAST_TROPHY))); + trophyList.put(BossVariant.ALPHA_YETI, new AlphaYetiTrophyModel(set.bakeLayer(TFModelLayers.ALPHA_YETI_TROPHY))); + trophyList.put(BossVariant.SNOW_QUEEN, legacy.getAsBoolean() ? new SnowQueenTrophyLegacyModel(set.bakeLayer(TFModelLayers.LEGACY_SNOW_QUEEN_TROPHY)) : new SnowQueenTrophyModel(set.bakeLayer(TFModelLayers.SNOW_QUEEN_TROPHY))); + trophyList.put(BossVariant.QUEST_RAM, legacy.getAsBoolean() ? new QuestRamTrophyLegacyModel(set.bakeLayer(TFModelLayers.LEGACY_QUEST_RAM_TROPHY)) : new QuestRamTrophyModel(set.bakeLayer(TFModelLayers.QUEST_RAM_TROPHY))); + return trophyList.build(); + } + + public static ItemStack stack = new ItemStack(TFBlocks.NAGA_TROPHY.get()); + @Override + public void render(TrophyBlockEntity tileEntityIn, float partialTicks, PoseStack matrixStackIn, MultiBufferSource bufferIn, int combinedLightIn, int combinedOverlayIn) { + float f = tileEntityIn.getAnimationProgress(partialTicks); + BlockState blockstate = tileEntityIn.getBlockState(); + boolean flag = blockstate.getBlock() instanceof TrophyWallBlock; + Direction direction = flag ? blockstate.getValue(TrophyWallBlock.FACING) : null; + float f1 = 22.5F * (flag ? (2 + direction.get2DDataValue()) * 4 : blockstate.getValue(TrophyBlock.ROTATION)); + BossVariant variant = ((AbstractTrophyBlock) blockstate.getBlock()).getVariant(); + GenericTrophyModel trophy = this.trophies.get(variant); + matrixStackIn.pushPose(); + if (variant == BossVariant.HYDRA) { + trophy.openMouthForTrophy(flag ? 0.5F : 0.0F); + } + if (variant == BossVariant.UR_GHAST) { + ((UrGhastTrophyModel)trophy).setTranslate(matrixStackIn, 0F, 1.0F, 0F); + } + render(direction, f1, trophy, variant, f, matrixStackIn, bufferIn, combinedLightIn, ItemDisplayContext.NONE); + matrixStackIn.popPose(); + } + + public static void render(@Nullable Direction directionIn, float y, GenericTrophyModel trophy, BossVariant variant, float animationProgress, PoseStack matrixStackIn, MultiBufferSource buffer, int combinedLight, ItemDisplayContext camera) { + BooleanSupplier legacy = () -> Minecraft.getInstance().getResourcePackRepository().getSelectedIds().contains("builtin/twilight_forest_classic_resources"); + matrixStackIn.pushPose(); + if (directionIn == null || variant == BossVariant.UR_GHAST) { + matrixStackIn.translate(0.5D, 0.01D, 0.5D); + } else { + matrixStackIn.translate(0.5F - directionIn.getStepX() * 0.249F, 0.25D, 0.5F - directionIn.getStepZ() * 0.249F); + } + matrixStackIn.scale(-1.0F, -1.0F, 1.0F); + switch (variant) { + case HYDRA -> { + matrixStackIn.scale(0.25F, 0.25F, 0.25F); + if (camera == ItemDisplayContext.GUI) { + trophy.openMouthForTrophy(0.35F); + } + trophy.setRotations(animationProgress * 4.5F, y, 0.0F); + matrixStackIn.translate(legacy.getAsBoolean() ? 1.0F : 0.0F, legacy.getAsBoolean() ? -1.15F : -1.0F, 0.0F); + VertexConsumer hydraVertex = buffer.getBuffer(RenderType.entityCutoutNoCull(textureLocHydra)); + trophy.renderToBuffer(matrixStackIn, hydraVertex, combinedLight, OverlayTexture.NO_OVERLAY, 1.0F, 1.0F, 1.0F, 1.0F); + } + case NAGA -> { + matrixStackIn.scale(0.5f, 0.5f, 0.5f); + trophy.setRotations(animationProgress * 4.5F, y, 0.0F); + matrixStackIn.translate(0F, .25F, 0F); + VertexConsumer nagaVertex = buffer.getBuffer(RenderType.entityCutoutNoCull(textureLocNaga)); + trophy.renderToBuffer(matrixStackIn, nagaVertex, combinedLight, OverlayTexture.NO_OVERLAY, 1.0F, 1.0F, 1.0F, 1.0F); + } + case LICH -> { + matrixStackIn.translate(0.0F, .25F, 0.0F); + trophy.setRotations(animationProgress * 4.5F, y, 0.0F); + VertexConsumer lichVertex = buffer.getBuffer(RenderType.entityCutoutNoCull(textureLocLich)); + trophy.renderToBuffer(matrixStackIn, lichVertex, combinedLight, OverlayTexture.NO_OVERLAY, 1.0F, 1.0F, 1.0F, 1.0F); + } + case UR_GHAST -> { + matrixStackIn.scale(0.5F, 0.5F, 0.5F); + trophy.setRotations(animationProgress * 4.5F, y, 0.0F); + VertexConsumer ghastVertex = buffer.getBuffer(RenderType.entityCutoutNoCull(textureLocUrGhast)); + trophy.renderToBuffer(matrixStackIn, ghastVertex, combinedLight, OverlayTexture.NO_OVERLAY, 1.0F, 1.0F, 1.0F, 1.0F); + } + case SNOW_QUEEN -> { + trophy.setRotations(animationProgress * 4.5F, y, 0.0F); + matrixStackIn.translate(0.0F, legacy.getAsBoolean() ? 0.25F : 0.0F, 0.0F); + VertexConsumer waifuVertex = buffer.getBuffer(RenderType.entityCutoutNoCull(textureLocSnowQueen)); + trophy.renderToBuffer(matrixStackIn, waifuVertex, combinedLight, OverlayTexture.NO_OVERLAY, 1.0F, 1.0F, 1.0F, 1.0F); + } + case MINOSHROOM -> { + trophy.setRotations(animationProgress * 4.5F, y, 0.0F); + matrixStackIn.translate(0.0F, legacy.getAsBoolean() ? 0.12F : 0.065F, legacy.getAsBoolean() ? 0.56F : 0.0F); + VertexConsumer minoVertex = buffer.getBuffer(RenderType.entityCutoutNoCull(textureLocMinoshroom)); + trophy.renderToBuffer(matrixStackIn, minoVertex, combinedLight, OverlayTexture.NO_OVERLAY, 1.0F, 1.0F, 1.0F, 1.0F); + } + case KNIGHT_PHANTOM -> { + trophy.setRotations(animationProgress * 4.5F, y, 0.0F); + matrixStackIn.translate(0.0F, 0.25F, 0.0F); + VertexConsumer phantomVertex = buffer.getBuffer(RenderType.entityCutoutNoCull(textureLocKnightPhantom)); + trophy.renderToBuffer(matrixStackIn, phantomVertex, combinedLight, OverlayTexture.NO_OVERLAY, 1.0F, 1.0F, 1.0F, 1.0F); + matrixStackIn.scale(1.1F, 1.1F, 1.1F); + matrixStackIn.translate(0.0F, 0.05F, 0.0F); + trophy.setRotations(animationProgress * 4.5F, y, 0.0F); + VertexConsumer phantomArmorVertex = buffer.getBuffer(RenderType.entityCutoutNoCull(textureLocKnightPhantomArmor)); + trophy.renderHelmToBuffer(matrixStackIn, phantomArmorVertex, combinedLight, OverlayTexture.NO_OVERLAY, 1.0F, 1.0F, 1.0F, 0.0625F); + } + case ALPHA_YETI -> { + matrixStackIn.scale(0.2F, 0.2F, 0.2F); + trophy.setRotations(animationProgress * 4.5F, y, 0.0F); + matrixStackIn.translate(0.0F, -1.5F, 0.0F); + VertexConsumer yetiVertex = buffer.getBuffer(RenderType.entityCutoutNoCull(textureLocYeti)); + trophy.renderToBuffer(matrixStackIn, yetiVertex, combinedLight, OverlayTexture.NO_OVERLAY, 1.0F, 1.0F, 1.0F, 1.0F); + } + case QUEST_RAM -> { + matrixStackIn.scale(0.7f, 0.7f, 0.7f); + trophy.setRotations(animationProgress * 4.5F, y, 0.0F); + VertexConsumer ramVertex = buffer.getBuffer(RenderType.entityCutoutNoCull(textureLocQuestRam)); + trophy.renderToBuffer(matrixStackIn, ramVertex, combinedLight, OverlayTexture.NO_OVERLAY, 1.0F, 1.0F, 1.0F, 1.0F); + } + default -> { + } + } + matrixStackIn.popPose(); + } +} diff --git a/src/main/java/twilightforest/client/renderer/tileentity/TwilightChestRenderer.java b/src/main/java/twilightforest/client/renderer/tileentity/TwilightChestRenderer.java new file mode 100644 index 0000000000..8772fda33b --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/tileentity/TwilightChestRenderer.java @@ -0,0 +1,62 @@ +package twilightforest.client.renderer.tileentity; + +import com.google.common.collect.ImmutableMap; +import net.minecraft.client.renderer.Sheets; +import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; +import net.minecraft.client.renderer.blockentity.ChestRenderer; +import net.minecraft.client.resources.model.Material; +import net.minecraft.client.resources.model.ModelBaker; +import net.minecraft.client.resources.model.ModelBakery; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.properties.ChestType; +import twilightforest.TwilightForestMod; +import twilightforest.init.TFBlocks; +import twilightforest.block.entity.TwilightChestEntity; + +import java.util.EnumMap; +import java.util.Map; +import java.util.stream.Collectors; + +public class TwilightChestRenderer extends ChestRenderer { + public static final Map> MATERIALS; + + static { + ImmutableMap.Builder> builder = ImmutableMap.builder(); + + builder.put(TFBlocks.TWILIGHT_OAK_CHEST.get(), chestMaterial("twilight")); + builder.put(TFBlocks.CANOPY_CHEST.get(), chestMaterial("canopy")); + builder.put(TFBlocks.MANGROVE_CHEST.get(), chestMaterial("mangrove")); + builder.put(TFBlocks.DARK_CHEST.get(), chestMaterial("darkwood")); + builder.put(TFBlocks.TIME_CHEST.get(), chestMaterial("time")); + builder.put(TFBlocks.TRANSFORMATION_CHEST.get(), chestMaterial("trans")); + builder.put(TFBlocks.MINING_CHEST.get(), chestMaterial("mining")); + builder.put(TFBlocks.SORTING_CHEST.get(), chestMaterial("sort")); + + MATERIALS = builder.build(); + } + + public TwilightChestRenderer(BlockEntityRendererProvider.Context context) { + super(context); + } + + @Override + protected Material getMaterial(T blockEntity, ChestType chestType) { + EnumMap b = MATERIALS.get(blockEntity.getBlockState().getBlock()); + + if (b == null) return super.getMaterial(blockEntity, chestType); + + Material material = b.get(chestType); + + return material != null ? material : super.getMaterial(blockEntity, chestType); + } + + private static EnumMap chestMaterial(String type) { + EnumMap map = new EnumMap<>(ChestType.class); + + map.put(ChestType.SINGLE, new Material(Sheets.CHEST_SHEET, TwilightForestMod.prefix("model/chest/" + type + "/" + type))); + map.put(ChestType.LEFT, new Material(Sheets.CHEST_SHEET, TwilightForestMod.prefix("model/chest/" + type + "/left"))); + map.put(ChestType.RIGHT, new Material(Sheets.CHEST_SHEET, TwilightForestMod.prefix("model/chest/" + type + "/right"))); + + return map; + } +} diff --git a/src/main/java/twilightforest/client/renderer/tileentity/package-info.java b/src/main/java/twilightforest/client/renderer/tileentity/package-info.java new file mode 100644 index 0000000000..e4879eccaa --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/tileentity/package-info.java @@ -0,0 +1,6 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.client.renderer.tileentity; + +import net.minecraft.MethodsReturnNonnullByDefault; +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/command/CenterCommand.java b/src/main/java/twilightforest/command/CenterCommand.java new file mode 100644 index 0000000000..25c799fefc --- /dev/null +++ b/src/main/java/twilightforest/command/CenterCommand.java @@ -0,0 +1,45 @@ +package twilightforest.command; + +import com.mojang.brigadier.Command; +import com.mojang.brigadier.builder.LiteralArgumentBuilder; +import com.mojang.brigadier.context.CommandContext; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import net.minecraft.ChatFormatting; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.commands.Commands; +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; +import net.minecraft.util.Mth; +import twilightforest.init.TFLandmark; +import twilightforest.util.LegacyLandmarkPlacements; +import twilightforest.world.registration.TFGenerationSettings; + +public class CenterCommand { + public static LiteralArgumentBuilder register() { + return Commands.literal("center").requires(cs -> cs.hasPermission(2)).executes(CenterCommand::run); + } + + private static int run(CommandContext ctx) throws CommandSyntaxException { + CommandSourceStack source = ctx.getSource(); + + if (!TFGenerationSettings.usesTwilightChunkGenerator(source.getLevel())) { + throw TFCommand.NOT_IN_TF.create(); + } + + int dx = Mth.floor(source.getPosition().x()); + int dz = Mth.floor(source.getPosition().z()); + BlockPos cc = LegacyLandmarkPlacements.getNearestCenterXZ(dx >> 4, dz >> 4); + TFLandmark closestFeature = LegacyLandmarkPlacements.pickLandmarkAtBlock(cc.getX(), cc.getZ(), source.getLevel()); + boolean fc = LegacyLandmarkPlacements.blockIsInLandmarkCenter(dx, dz); + + if(closestFeature == TFLandmark.NOTHING) { + source.sendSuccess(Component.translatable("commands.tffeature.none_nearby").withStyle(ChatFormatting.RED), false); + } else { + String structurename = Component.translatable("structure." + closestFeature.name).withStyle(ChatFormatting.DARK_GREEN).getString(); + source.sendSuccess(Component.translatable("commands.tffeature.nearest", structurename), false); + source.sendSuccess(Component.translatable("commands.tffeature.center", cc), false); + source.sendSuccess(Component.translatable("commands.tffeature.chunk", fc), false); + } + return Command.SINGLE_SUCCESS; + } +} diff --git a/src/main/java/twilightforest/command/ConquerCommand.java b/src/main/java/twilightforest/command/ConquerCommand.java new file mode 100644 index 0000000000..c5570703cf --- /dev/null +++ b/src/main/java/twilightforest/command/ConquerCommand.java @@ -0,0 +1,55 @@ +package twilightforest.command; + +import com.mojang.brigadier.Command; +import com.mojang.brigadier.builder.LiteralArgumentBuilder; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import com.mojang.brigadier.exceptions.SimpleCommandExceptionType; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.commands.Commands; +import net.minecraft.core.BlockPos; +import net.minecraft.core.SectionPos; +import net.minecraft.network.chat.Component; +import net.minecraft.world.level.levelgen.structure.StructureStart; +import twilightforest.util.LandmarkUtil; +import twilightforest.util.WorldUtil; +import twilightforest.world.components.chunkgenerators.ChunkGeneratorTwilight; +import twilightforest.world.components.structures.start.TFStructureStart; +import twilightforest.world.registration.TFGenerationSettings; + +import java.util.Optional; + +public class ConquerCommand { + private static final SimpleCommandExceptionType NOT_IN_STRUCTURE = new SimpleCommandExceptionType(Component.translatable("commands.tffeature.structure.required")); + + public static LiteralArgumentBuilder register() { + LiteralArgumentBuilder conquer = Commands.literal("conquer").requires(cs -> cs.hasPermission(2)).executes(ctx -> changeStructureActivity(ctx.getSource(), true)); + LiteralArgumentBuilder reactivate = Commands.literal("reactivate").requires(cs -> cs.hasPermission(2)).executes(ctx -> changeStructureActivity(ctx.getSource(), false)); + return conquer.then(reactivate); + } + + private static int changeStructureActivity(CommandSourceStack source, boolean flag) throws CommandSyntaxException { + if (!TFGenerationSettings.usesTwilightChunkGenerator(source.getLevel())) { + throw TFCommand.NOT_IN_TF.create(); + } + + // are you in a structure? + ChunkGeneratorTwilight chunkGenerator = WorldUtil.getChunkGenerator(source.getLevel()); + + BlockPos pos = BlockPos.containing(source.getPosition()); + if (chunkGenerator != null) { + Optional struct = LandmarkUtil.locateNearestLandmarkStart(source.getLevel(), SectionPos.blockToSectionCoord(pos.getX()), SectionPos.blockToSectionCoord(pos.getZ())); + + if (struct.isPresent() && struct.get().getBoundingBox().isInside(pos) && struct.get() instanceof TFStructureStart TFStructureStart) { + source.sendSuccess(Component.translatable("commands.tffeature.structure.conquer.update", TFStructureStart.isConquered(), flag), true); + + TFStructureStart.setConquered(flag, source.getLevel()); + } else { + throw NOT_IN_STRUCTURE.create(); + } + + return Command.SINGLE_SUCCESS; + } else { + throw NOT_IN_STRUCTURE.create(); + } + } +} diff --git a/src/main/java/twilightforest/command/GenerateBookCommand.java b/src/main/java/twilightforest/command/GenerateBookCommand.java new file mode 100644 index 0000000000..219a90c10e --- /dev/null +++ b/src/main/java/twilightforest/command/GenerateBookCommand.java @@ -0,0 +1,56 @@ +package twilightforest.command; + +import com.mojang.brigadier.Command; +import com.mojang.brigadier.builder.LiteralArgumentBuilder; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import com.mojang.brigadier.exceptions.SimpleCommandExceptionType; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.commands.Commands; +import net.minecraft.commands.arguments.ResourceKeyArgument; +import net.minecraft.core.Holder; +import net.minecraft.core.registries.Registries; +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.levelgen.structure.Structure; +import net.minecraftforge.common.util.FakePlayer; +import org.jetbrains.annotations.Nullable; +import twilightforest.world.components.structures.util.StructureHints; + +public class GenerateBookCommand { + + private static final SimpleCommandExceptionType ERROR_NOT_RUN_BY_PLAYER = new SimpleCommandExceptionType(Component.translatable("commands.tffeature.not_player")); + + public static LiteralArgumentBuilder register() { + return Commands.literal("genbook") + .executes(context -> generateBook(context.getSource(), null)) + .requires(cs -> cs.hasPermission(3)) + .then(Commands.argument("structure", ResourceKeyArgument.key(Registries.STRUCTURE)) + .executes(context -> generateBook(context.getSource(), ResourceKeyArgument.getStructure(context, "structure")))); + } + + private static int generateBook(CommandSourceStack source, @Nullable Holder.Reference structureKey) throws CommandSyntaxException { + if (!(source.getEntity() instanceof Player player) || player instanceof FakePlayer) throw ERROR_NOT_RUN_BY_PLAYER.create(); + if (structureKey == null) { + for (Structure structure : source.getLevel().registryAccess().registryOrThrow(Registries.STRUCTURE).stream().toList()) { + if (structure instanceof StructureHints hint) { + if (!player.addItem(hint.createHintBook())) { + player.drop(hint.createHintBook(), true); + } + } + } + } else { + if (source.getLevel().registryAccess().registryOrThrow(Registries.STRUCTURE).get(structureKey.key()) instanceof StructureHints hint) { + if (!player.addItem(hint.createHintBook())) { + player.drop(hint.createHintBook(), true); + } + } else { + ItemStack book = StructureHints.HintConfig.defaultBook(); + if (!player.addItem(book)) { + player.drop(book, true); + } + } + } + return Command.SINGLE_SUCCESS; + } +} diff --git a/src/main/java/twilightforest/command/InfoCommand.java b/src/main/java/twilightforest/command/InfoCommand.java new file mode 100644 index 0000000000..e050ed2169 --- /dev/null +++ b/src/main/java/twilightforest/command/InfoCommand.java @@ -0,0 +1,81 @@ +package twilightforest.command; + +import com.mojang.brigadier.Command; +import com.mojang.brigadier.builder.LiteralArgumentBuilder; +import com.mojang.brigadier.context.CommandContext; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import net.minecraft.ChatFormatting; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.commands.Commands; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Registry; +import net.minecraft.core.SectionPos; +import net.minecraft.core.registries.Registries; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.MobCategory; +import net.minecraft.world.level.biome.MobSpawnSettings; +import net.minecraft.world.level.levelgen.structure.Structure; +import net.minecraft.world.level.levelgen.structure.StructureStart; +import net.minecraftforge.fml.loading.FMLLoader; +import twilightforest.util.LandmarkUtil; +import twilightforest.world.components.chunkgenerators.ChunkGeneratorTwilight; +import twilightforest.world.components.structures.start.TFStructureStart; +import twilightforest.world.components.structures.util.LandmarkStructure; +import twilightforest.world.registration.TFGenerationSettings; + +import java.util.List; +import java.util.Optional; + +public class InfoCommand { + public static LiteralArgumentBuilder register() { + return Commands.literal("info").requires(cs -> cs.hasPermission(2)).executes(InfoCommand::run); + } + + private static int run(CommandContext ctx) throws CommandSyntaxException { + CommandSourceStack source = ctx.getSource(); + ServerLevel level = source.getLevel(); + + if (!TFGenerationSettings.usesTwilightChunkGenerator(level)) { + throw TFCommand.NOT_IN_TF.create(); + } + + BlockPos pos = BlockPos.containing(source.getPosition()); + + Optional> possibleStructureRegistry = level.registryAccess().registry(Registries.STRUCTURE); + Optional possibleNearLandmark = LandmarkUtil.locateNearestLandmarkStart(level, SectionPos.blockToSectionCoord(pos.getX()), SectionPos.blockToSectionCoord(pos.getZ())); + + if (possibleStructureRegistry.isEmpty() || possibleNearLandmark.isEmpty() || !(possibleNearLandmark.get().getStructure() instanceof LandmarkStructure landmarkStructure)) return 0; + StructureStart structureStart = possibleNearLandmark.get(); + + ResourceLocation key = possibleStructureRegistry.get().getKey(landmarkStructure); + + if (FMLLoader.isProduction()) + source.sendSuccess(Component.translatable("This command is still WIP, some things may still be broken.").withStyle(ChatFormatting.RED, ChatFormatting.BOLD), false); + + // nearest feature + String structureName = Component.translatable("structure." + key.getNamespace() + "." + key.getPath()).getString(); + source.sendSuccess(Component.translatable("commands.tffeature.nearest", structureName), false); + + if (structureStart.getBoundingBox().isInside(pos)) { + source.sendSuccess(Component.translatable("commands.tffeature.structure.inside").withStyle(ChatFormatting.BOLD, ChatFormatting.GREEN), false); + + if (structureStart instanceof TFStructureStart tfStructureStart) { + source.sendSuccess(Component.translatable("commands.tffeature.structure.conquer.status", tfStructureStart.isConquered()).withStyle(ChatFormatting.BOLD, tfStructureStart.isConquered() ? ChatFormatting.GREEN : ChatFormatting.RED), false); + } + + // what is the spawn list + List spawnList = ChunkGeneratorTwilight.gatherPotentialSpawns(level.structureManager(), MobCategory.MONSTER, pos); + source.sendSuccess(Component.translatable("commands.tffeature.structure.spawn_list").withStyle(ChatFormatting.UNDERLINE), false); + if (spawnList != null) + for (MobSpawnSettings.SpawnerData entry : spawnList) + source.sendSuccess(Component.translatable("commands.tffeature.structure.spawn_info", entry.type.getDescription().getString(), entry.getWeight().asInt()), false); + } else { + source.sendSuccess(Component.translatable("commands.tffeature.structure.outside").withStyle(ChatFormatting.BOLD, ChatFormatting.RED), false); + } + + return Command.SINGLE_SUCCESS; + } + +} diff --git a/src/main/java/twilightforest/command/MapBiomesCommand.java b/src/main/java/twilightforest/command/MapBiomesCommand.java new file mode 100644 index 0000000000..5f3b01ee73 --- /dev/null +++ b/src/main/java/twilightforest/command/MapBiomesCommand.java @@ -0,0 +1,177 @@ +package twilightforest.command; + +import com.mojang.blaze3d.platform.NativeImage; +import com.mojang.brigadier.Command; +import com.mojang.brigadier.arguments.BoolArgumentType; +import com.mojang.brigadier.arguments.IntegerArgumentType; +import com.mojang.brigadier.builder.LiteralArgumentBuilder; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import net.minecraft.ChatFormatting; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.commands.Commands; +import net.minecraft.core.registries.Registries; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.Mth; +import net.minecraft.world.level.biome.Biome; +import net.minecraftforge.fml.loading.FMLEnvironment; +import twilightforest.init.TFBiomes; +import twilightforest.item.MagicMapItem; +import twilightforest.util.ColorUtil; +import twilightforest.world.registration.TFGenerationSettings; + +import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.text.DecimalFormat; +import java.util.HashMap; +import java.util.Map; + +/** + * Thank you @SuperCoder79 (from Twitter) for sharing the original code! Code sourced from a LGPL project + */ +public class MapBiomesCommand { + private static final DecimalFormat numberFormat = new DecimalFormat("#.00"); + + private static final HashMap BIOME2COLOR = new HashMap<>(); + + private static void init() { + BIOME2COLOR.put(TFBiomes.STREAM.location(), new MapColor(0, 0, 255)); + BIOME2COLOR.put(TFBiomes.LAKE.location(), new MapColor(0, 0, 255)); + BIOME2COLOR.put(TFBiomes.CLEARING.location(), new MapColor(132, 245, 130)); + BIOME2COLOR.put(TFBiomes.OAK_SAVANNAH.location(), new MapColor(239, 245, 130)); + BIOME2COLOR.put(TFBiomes.FOREST.location(), new MapColor(0, 255, 0)); + BIOME2COLOR.put(TFBiomes.DENSE_FOREST.location(), new MapColor(0, 170, 0)); + BIOME2COLOR.put(TFBiomes.FIREFLY_FOREST.location(), new MapColor(88, 252, 102)); + BIOME2COLOR.put(TFBiomes.ENCHANTED_FOREST.location(), new MapColor(0, 255, 255)); + BIOME2COLOR.put(TFBiomes.SPOOKY_FOREST.location(), new MapColor(119, 0, 255)); + BIOME2COLOR.put(TFBiomes.MUSHROOM_FOREST.location(), new MapColor(204, 0, 139)); + BIOME2COLOR.put(TFBiomes.DENSE_MUSHROOM_FOREST.location(), new MapColor(184, 48, 184)); + + BIOME2COLOR.put(TFBiomes.SWAMP.location(), new MapColor(0, 204, 187)); + BIOME2COLOR.put(TFBiomes.FIRE_SWAMP.location(), new MapColor(140, 0, 0)); + + BIOME2COLOR.put(TFBiomes.DARK_FOREST.location(), new MapColor(25, 61, 13)); + BIOME2COLOR.put(TFBiomes.DARK_FOREST_CENTER.location(), new MapColor(157, 79, 0)); + + BIOME2COLOR.put(TFBiomes.SNOWY_FOREST.location(), new MapColor(255, 255, 255)); + BIOME2COLOR.put(TFBiomes.GLACIER.location(), new MapColor(130, 191, 245)); + + BIOME2COLOR.put(TFBiomes.HIGHLANDS.location(), new MapColor(100, 65, 0)); + BIOME2COLOR.put(TFBiomes.THORNLANDS.location(), new MapColor(128, 100, 90)); + BIOME2COLOR.put(TFBiomes.FINAL_PLATEAU.location(), new MapColor(128, 128, 128)); + } + + public static LiteralArgumentBuilder register() { + return Commands.literal("biomepng").requires(cs -> cs.hasPermission(2)).executes(context -> createMap(context.getSource(), 4096, 4096, true)) + .then(Commands.argument("width", IntegerArgumentType.integer(0)) + .executes(context -> createMap(context.getSource(), IntegerArgumentType.getInteger(context, "width"), IntegerArgumentType.getInteger(context, "width"), true)) + .then(Commands.argument("height", IntegerArgumentType.integer(0)) + .executes(context -> createMap(context.getSource(), IntegerArgumentType.getInteger(context, "width"), IntegerArgumentType.getInteger(context, "height"), true)) + .then(Commands.argument("showBiomePercents", BoolArgumentType.bool()) + .executes(context -> createMap(context.getSource(), IntegerArgumentType.getInteger(context, "width"), IntegerArgumentType.getInteger(context, "height"), BoolArgumentType.getBool(context, "showBiomePercents")))))); + + } + + private static int createMap(CommandSourceStack source, int width, int height, boolean showBiomePercents) throws CommandSyntaxException { + if (FMLEnvironment.dist.isDedicatedServer()) + return -1; + + if (!TFGenerationSettings.usesTwilightChunkGenerator(source.getLevel())) { + throw TFCommand.NOT_IN_TF.create(); + } + + if (BIOME2COLOR.isEmpty()) { + init(); + } + + //setup image + Map biomeCount = new HashMap<>(); + NativeImage img = new NativeImage(width, height, false); + + int progressUpdate = img.getHeight() / 8; + + for (int x = 0; x < img.getHeight(); x++) { + for (int z = 0; z < img.getWidth(); z++) { + ServerLevel level = source.getLevel(); + Biome b = level.getNoiseBiome(x - (img.getWidth() / 2), 0, z - (img.getHeight() / 2)).value(); + ResourceLocation key = level.registryAccess().registryOrThrow(Registries.BIOME).getKey(b); + MapColor color = BIOME2COLOR.get(key); + + if (color == null) { + int colorInt = MagicMapItem.getBiomeColor(source.getLevel(), b); + + if (colorInt == 0) + colorInt = b.getGrassColor(0, 0); + + BIOME2COLOR.put(key, color = new MapColor(colorInt | 0xFF000000)); + } + + if (!biomeCount.containsKey(b)) { + biomeCount.put(b, 0); + } else { + biomeCount.put(b, biomeCount.get(b) + 1); + } + + //set the color + img.setPixelRGBA(x, z, ColorUtil.argbToABGR(color.getARGB())); + } + + //send a progress update to let people know the server isn't dying + if (x % progressUpdate == 0) { + source.sendSuccess(Component.translatable(((double) x / img.getHeight()) * 100 + "% Done mapping"), false); + } + } + + if (showBiomePercents) { + source.sendSuccess(Component.literal("Approximate biome-block counts within a " + (width + "x" + height) + " region"), false); + int totalCount = biomeCount.values().stream().mapToInt(i -> i).sum(); + biomeCount.forEach((biome, integer) -> source.sendSuccess(Component.literal( + source.getLevel().registryAccess().registryOrThrow(Registries.BIOME).getKey(biome).toString()) + .append(": " + (integer) + ChatFormatting.GRAY + " (" + numberFormat.format(((double) integer / totalCount) * 100) + "%)"), false)); + } + + int startX = Mth.floor(source.getPosition().x()) - (img.getWidth() / 2); + int startZ = Mth.floor(source.getPosition().z()) - (img.getHeight() / 2); + //file name is formatted as: biomemap-seed-(startX.startZ)-(endX.endZ) + //I wanted to put generated maps in the path generated/biomemaps/seed, but it doesnt like when I add more params to the method + Path p = Paths.get("biome_map-" + source.getLevel().getSeed() + "-(" + startX + "." + startZ + ")-(" + (startX + width) + "." + (startZ + height) + ").png"); + //save the biome map + try { + img.writeToFile(p.toAbsolutePath().toFile()); + } catch (IOException e) { + e.printStackTrace(); + source.sendFailure(Component.literal("Could not save image! Please report this!")); + return 0; + } + + source.sendSuccess(Component.literal("Image saved!"), false); + + return Command.SINGLE_SUCCESS; + } + + public static class MapColor { + + private final int value; + + public MapColor(int r, int g, int b) { + this(r, g, b, 255); + } + + public MapColor(int r, int g, int b, int a) { + this.value = ((a & 0xFF) << 24) | + ((r & 0xFF) << 16) | + ((g & 0xFF) << 8) | + ((b & 0xFF)); + } + + public MapColor(int rgb) { + this.value = 0xFF000000 | rgb; + } + + public int getARGB() { + return this.value; + } + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/command/ShieldCommand.java b/src/main/java/twilightforest/command/ShieldCommand.java new file mode 100644 index 0000000000..798a69c0d0 --- /dev/null +++ b/src/main/java/twilightforest/command/ShieldCommand.java @@ -0,0 +1,39 @@ +package twilightforest.command; + +import com.mojang.brigadier.Command; +import com.mojang.brigadier.arguments.BoolArgumentType; +import com.mojang.brigadier.arguments.IntegerArgumentType; +import com.mojang.brigadier.builder.LiteralArgumentBuilder; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.commands.Commands; +import net.minecraft.commands.arguments.EntityArgument; +import net.minecraft.world.entity.Entity; +import twilightforest.capabilities.CapabilityList; + +public class ShieldCommand { + public static LiteralArgumentBuilder register() { + return Commands.literal("shield") + .requires(cs -> cs.hasPermission(2)) + .then(Commands.argument("target", EntityArgument.entity()) + .then(Commands.literal("set") + .then(Commands.argument("amount", IntegerArgumentType.integer()) + .executes(ctx -> set(EntityArgument.getEntity(ctx, "target"), IntegerArgumentType.getInteger(ctx, "amount"), true)) + .then(Commands.argument("temp", BoolArgumentType.bool()) + .executes(ctx -> set(EntityArgument.getEntity(ctx, "target"), IntegerArgumentType.getInteger(ctx, "amount"), BoolArgumentType.getBool(ctx, "temp")))))) + .then(Commands.literal("add") + .then(Commands.argument("amount", IntegerArgumentType.integer()) + .executes(ctx -> add(EntityArgument.getEntity(ctx, "target"), IntegerArgumentType.getInteger(ctx, "amount"), true)) + .then(Commands.argument("temp", BoolArgumentType.bool()) + .executes(ctx -> add(EntityArgument.getEntity(ctx, "target"), IntegerArgumentType.getInteger(ctx, "amount"), BoolArgumentType.getBool(ctx, "temp"))))))); + } + + private static int add(Entity e, int num, boolean temporary) { + e.getCapability(CapabilityList.SHIELDS).ifPresent(cap -> cap.addShields(num, temporary)); + return Command.SINGLE_SUCCESS; + } + + private static int set(Entity e, int num, boolean temporary) { + e.getCapability(CapabilityList.SHIELDS).ifPresent(cap -> cap.setShields(num, temporary)); + return Command.SINGLE_SUCCESS; + } +} diff --git a/src/main/java/twilightforest/command/TFCommand.java b/src/main/java/twilightforest/command/TFCommand.java new file mode 100644 index 0000000000..a3a3cb3454 --- /dev/null +++ b/src/main/java/twilightforest/command/TFCommand.java @@ -0,0 +1,34 @@ +package twilightforest.command; + +import com.mojang.brigadier.CommandDispatcher; +import com.mojang.brigadier.builder.LiteralArgumentBuilder; +import com.mojang.brigadier.context.CommandContext; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import com.mojang.brigadier.exceptions.SimpleCommandExceptionType; +import com.mojang.brigadier.tree.LiteralCommandNode; +import net.minecraft.ChatFormatting; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.commands.Commands; +import net.minecraft.network.chat.Component; + +public class TFCommand { + public static final SimpleCommandExceptionType NOT_IN_TF = new SimpleCommandExceptionType(Component.translatable("commands.tffeature.not_in_twilight_forest").withStyle(ChatFormatting.RED)); + + public static void register(CommandDispatcher dispatcher) { + LiteralArgumentBuilder builder = Commands.literal("twilightforest") + .executes(TFCommand::run) + .then(CenterCommand.register()) + .then(ConquerCommand.register()) + .then(GenerateBookCommand.register()) + .then(InfoCommand.register()) + .then(MapBiomesCommand.register()) + .then(ShieldCommand.register()); + LiteralCommandNode node = dispatcher.register(builder); + dispatcher.register(Commands.literal("tf").executes(TFCommand::run).redirect(node)); + dispatcher.register(Commands.literal("tffeature").executes(TFCommand::run).redirect(node)); + } + + private static int run(CommandContext ctx) throws CommandSyntaxException { + throw new SimpleCommandExceptionType(Component.translatable("commands.tffeature.usage", ctx.getInput())).create(); + } +} diff --git a/src/main/java/twilightforest/command/package-info.java b/src/main/java/twilightforest/command/package-info.java new file mode 100644 index 0000000000..ee7ed3948e --- /dev/null +++ b/src/main/java/twilightforest/command/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.command; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/compat/curios/CuriosCompat.java b/src/main/java/twilightforest/compat/curios/CuriosCompat.java new file mode 100644 index 0000000000..92c1413079 --- /dev/null +++ b/src/main/java/twilightforest/compat/curios/CuriosCompat.java @@ -0,0 +1,127 @@ +package twilightforest.compat.curios; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.common.capabilities.ICapabilityProvider; +import net.minecraftforge.fml.InterModComms; +import net.minecraftforge.network.PacketDistributor; +import top.theillusivec4.curios.api.*; +import top.theillusivec4.curios.api.client.CuriosRendererRegistry; +import top.theillusivec4.curios.api.event.DropRulesEvent; +import top.theillusivec4.curios.api.type.capability.ICurio; +import top.theillusivec4.curios.common.capability.CurioItemCapability; +import twilightforest.compat.curios.renderer.CharmOfKeepingRenderer; +import twilightforest.compat.curios.renderer.CharmOfLife1NecklaceRenderer; +import twilightforest.compat.curios.renderer.CharmOfLife2NecklaceRenderer; +import twilightforest.compat.curios.renderer.CurioHeadRenderer; +import twilightforest.events.CharmEvents; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFItems; +import twilightforest.item.SkullCandleItem; +import twilightforest.item.TrophyItem; +import twilightforest.network.CreateMovingCicadaSoundPacket; +import twilightforest.network.TFPacketHandler; + +import javax.annotation.Nonnull; +import java.util.Optional; + +public class CuriosCompat { + + public static void handleCuriosIMCs() { + InterModComms.sendTo(CuriosApi.MODID, SlotTypeMessage.REGISTER_TYPE, () -> SlotTypePreset.CHARM.getMessageBuilder().build()); + InterModComms.sendTo(CuriosApi.MODID, SlotTypeMessage.REGISTER_TYPE, () -> SlotTypePreset.HEAD.getMessageBuilder().build()); + } + + public static ICapabilityProvider setupCuriosCapability(ItemStack stack) { + return CurioItemCapability.createProvider(new ICurio() { + @Override + public ItemStack getStack() { + return stack; + } + + @Nonnull + @Override + public SoundInfo getEquipSound(SlotContext slotContext) { + return new SoundInfo(SoundEvents.ARMOR_EQUIP_GENERIC, 1.0F, 1.0F); + } + + @Override + public void onEquip(SlotContext context, ItemStack prevStack) { + //check that we dont have a cicada already on our head before trying to start the sound + if (!context.entity().getItemBySlot(EquipmentSlot.HEAD).is(TFBlocks.CICADA.get().asItem())) { + if (stack.is(TFBlocks.CICADA.get().asItem()) && !context.entity().getLevel().isClientSide()) { + TFPacketHandler.CHANNEL.send(PacketDistributor.TRACKING_ENTITY_AND_SELF.with(context::entity), new CreateMovingCicadaSoundPacket(context.entity().getId())); + } + } + } + + @Override + public boolean canEquipFromUse(SlotContext slotContext) { + return true; + } + }); + } + + //if we have any curios and die with a charm of keeping on us, keep our curios instead of dropping them + public static void keepCurios(DropRulesEvent event) { + if (event.getEntity() instanceof Player player) { + CompoundTag playerData = CharmEvents.getPlayerData(player); + if (!player.getLevel().isClientSide() && CharmEvents.charmUsed != null && playerData.contains(CharmEvents.CHARM_INV_TAG) && !playerData.getList(CharmEvents.CHARM_INV_TAG, 10).isEmpty()) { + //Keep all Curios items + CuriosApi.getCuriosHelper().getEquippedCurios(player).ifPresent(modifiable -> { + for (int i = 0; i < modifiable.getSlots(); ++i) { + int finalI = i; + event.addOverride(stack -> stack == modifiable.getStackInSlot(finalI), ICurio.DropRule.ALWAYS_KEEP); + } + }); + } + } + } + + public static void registerCurioRenderers() { + CuriosRendererRegistry.register(TFItems.CHARM_OF_LIFE_1.get(), CharmOfLife1NecklaceRenderer::new); + CuriosRendererRegistry.register(TFItems.CHARM_OF_LIFE_2.get(), CharmOfLife2NecklaceRenderer::new); + CuriosRendererRegistry.register(TFItems.CHARM_OF_KEEPING_1.get(), CharmOfKeepingRenderer::new); + CuriosRendererRegistry.register(TFItems.CHARM_OF_KEEPING_2.get(), CharmOfKeepingRenderer::new); + CuriosRendererRegistry.register(TFItems.CHARM_OF_KEEPING_3.get(), CharmOfKeepingRenderer::new); + + CuriosRendererRegistry.register(TFBlocks.NAGA_TROPHY.get().asItem(), CurioHeadRenderer::new); + CuriosRendererRegistry.register(TFBlocks.LICH_TROPHY.get().asItem(), CurioHeadRenderer::new); + CuriosRendererRegistry.register(TFBlocks.MINOSHROOM_TROPHY.get().asItem(), CurioHeadRenderer::new); + CuriosRendererRegistry.register(TFBlocks.HYDRA_TROPHY.get().asItem(), CurioHeadRenderer::new); + CuriosRendererRegistry.register(TFBlocks.KNIGHT_PHANTOM_TROPHY.get().asItem(), CurioHeadRenderer::new); + CuriosRendererRegistry.register(TFBlocks.UR_GHAST_TROPHY.get().asItem(), CurioHeadRenderer::new); + CuriosRendererRegistry.register(TFBlocks.ALPHA_YETI_TROPHY.get().asItem(), CurioHeadRenderer::new); + CuriosRendererRegistry.register(TFBlocks.SNOW_QUEEN_TROPHY.get().asItem(), CurioHeadRenderer::new); + CuriosRendererRegistry.register(TFBlocks.QUEST_RAM_TROPHY.get().asItem(), CurioHeadRenderer::new); + + CuriosRendererRegistry.register(TFBlocks.CICADA.get().asItem(), CurioHeadRenderer::new); + CuriosRendererRegistry.register(TFBlocks.FIREFLY.get().asItem(), CurioHeadRenderer::new); + CuriosRendererRegistry.register(TFBlocks.MOONWORM.get().asItem(), CurioHeadRenderer::new); + + CuriosRendererRegistry.register(TFBlocks.CREEPER_SKULL_CANDLE.get().asItem(), CurioHeadRenderer::new); + CuriosRendererRegistry.register(TFBlocks.PLAYER_SKULL_CANDLE.get().asItem(), CurioHeadRenderer::new); + CuriosRendererRegistry.register(TFBlocks.SKELETON_SKULL_CANDLE.get().asItem(), CurioHeadRenderer::new); + CuriosRendererRegistry.register(TFBlocks.WITHER_SKELE_SKULL_CANDLE.get().asItem(), CurioHeadRenderer::new); + CuriosRendererRegistry.register(TFBlocks.ZOMBIE_SKULL_CANDLE.get().asItem(), CurioHeadRenderer::new); + } + + public static boolean isCicadaEquipped(LivingEntity entity) { + Optional slot = CuriosApi.getCuriosHelper().findFirstCurio(entity, stack -> stack.is(TFBlocks.CICADA.get().asItem())); + return slot.isPresent(); + } + + public static boolean isTrophyCurioEquipped(LivingEntity entity) { + Optional slot = CuriosApi.getCuriosHelper().findFirstCurio(entity, stack -> stack.getItem() instanceof TrophyItem); + return slot.isPresent() && slot.get().slotContext() != null && slot.get().slotContext().visible(); + } + + public static boolean isSkullCurioEquipped(LivingEntity entity) { + Optional slot = CuriosApi.getCuriosHelper().findFirstCurio(entity, stack -> stack.getItem() instanceof SkullCandleItem); + return slot.isPresent() && slot.get().slotContext() != null && slot.get().slotContext().visible(); + } +} diff --git a/src/main/java/twilightforest/compat/curios/model/CharmOfLife1NecklaceModel.java b/src/main/java/twilightforest/compat/curios/model/CharmOfLife1NecklaceModel.java new file mode 100644 index 0000000000..583091b456 --- /dev/null +++ b/src/main/java/twilightforest/compat/curios/model/CharmOfLife1NecklaceModel.java @@ -0,0 +1,56 @@ +package twilightforest.compat.curios.model; + +import com.google.common.collect.ImmutableList; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.*; +import net.minecraft.world.entity.LivingEntity; + +public class CharmOfLife1NecklaceModel extends HumanoidModel { + + public CharmOfLife1NecklaceModel(ModelPart root) { + super(root); + } + + public static LayerDefinition create() { + MeshDefinition meshdefinition = HumanoidModel.createMesh(CubeDeformation.NONE, 0.0F); + PartDefinition partdefinition = meshdefinition.getRoot(); + + PartDefinition body = partdefinition.addOrReplaceChild("body", CubeListBuilder.create() + .texOffs(0, 0).addBox(-6.5F, -0.1F, -4.0F, 13.0F, 21.0F, 8.0F), + PartPose.ZERO); + + body.addOrReplaceChild("heart", CubeListBuilder.create() + .texOffs(46, 0).addBox(-3.5F, 4.9F, -4.5F, 3.0F, 2.0F, 1.0F) + .texOffs(56, 0).addBox(0.5F, 4.9F, -4.5F, 3.0F, 2.0F, 1.0F) + .texOffs(44, 5).addBox(-4.5F, 5.9F, -4.5F, 9.0F, 3.0F, 1.0F) + .texOffs(47, 11).addBox(-3.5F, 8.9F, -4.5F, 7.0F, 1.0F, 1.0F) + .texOffs(49, 15).addBox(-2.5F, 9.9F, -4.5F, 5.0F, 1.0F, 1.0F) + .texOffs(50, 19).addBox(-1.5F, 10.9F, -4.5F, 3.0F, 1.0F, 1.0F) + .texOffs(53, 23).addBox(-0.5F, 11.9F, -4.5F, 1.0F, 1.0F, 1.0F), + PartPose.ZERO); + + return LayerDefinition.create(meshdefinition, 64, 48); + } + + @Override + protected Iterable headParts() { + return ImmutableList.of(); + } + + @Override + protected Iterable bodyParts() { + return ImmutableList.of(body); + } + + @Override + public void renderToBuffer(PoseStack stack, VertexConsumer consumer, int light, int overlay, float red, float green, float blue, float alpha) { + stack.pushPose(); + stack.scale(0.55F, 0.55F, 0.55F); + this.body.render(stack, consumer, light, overlay, red, green, blue, alpha); + stack.popPose(); + } +} diff --git a/src/main/java/twilightforest/compat/curios/model/CharmOfLife2NecklaceModel.java b/src/main/java/twilightforest/compat/curios/model/CharmOfLife2NecklaceModel.java new file mode 100644 index 0000000000..fcaae3b838 --- /dev/null +++ b/src/main/java/twilightforest/compat/curios/model/CharmOfLife2NecklaceModel.java @@ -0,0 +1,56 @@ +package twilightforest.compat.curios.model; + +import com.google.common.collect.ImmutableList; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.*; +import net.minecraft.world.entity.LivingEntity; + +public class CharmOfLife2NecklaceModel extends HumanoidModel { + + public CharmOfLife2NecklaceModel(ModelPart root) { + super(root); + } + + public static LayerDefinition create() { + MeshDefinition meshdefinition = HumanoidModel.createMesh(CubeDeformation.NONE, 0.0F); + PartDefinition partdefinition = meshdefinition.getRoot(); + + PartDefinition body = partdefinition.addOrReplaceChild("body", CubeListBuilder.create() + .texOffs(0, 0).addBox(-6.5F, -0.1F, -4.0F, 13.0F, 21.0F, 8.0F), + PartPose.ZERO); + + body.addOrReplaceChild("heart", CubeListBuilder.create() + .texOffs(46, 0).addBox(-4.0F, 4.9F, -4.5F, 3.0F, 2.0F, 1.0F) + .texOffs(56, 0).addBox(1.0F, 4.9F, -4.5F, 3.0F, 2.0F, 1.0F) + .texOffs(42, 5).addBox(-5.0F, 5.9F, -4.5F, 10.0F, 4.0F, 1.0F) + .texOffs(44, 12).addBox(-4.0F, 9.9F, -4.5F, 8.0F, 1.0F, 1.0F) + .texOffs(46, 16).addBox(-3.0F, 10.9F, -4.5F, 6.0F, 1.0F, 1.0F) + .texOffs(48, 20).addBox(-2.0F, 11.9F, -4.5F, 4.0F, 1.0F, 1.0F) + .texOffs(50, 24).addBox(-1.0F, 12.9F, -4.5F, 2.0F, 1.0F, 1.0F), + PartPose.ZERO); + + return LayerDefinition.create(meshdefinition, 64, 48); + } + + @Override + protected Iterable headParts() { + return ImmutableList.of(); + } + + @Override + protected Iterable bodyParts() { + return ImmutableList.of(body); + } + + @Override + public void renderToBuffer(PoseStack stack, VertexConsumer consumer, int light, int overlay, float red, float green, float blue, float alpha) { + stack.pushPose(); + stack.scale(0.55F, 0.55F, 0.55F); + this.body.render(stack, consumer, light, overlay, red, green, blue, alpha); + stack.popPose(); + } +} diff --git a/src/main/java/twilightforest/compat/curios/model/package-info.java b/src/main/java/twilightforest/compat/curios/model/package-info.java new file mode 100644 index 0000000000..8662afa0a2 --- /dev/null +++ b/src/main/java/twilightforest/compat/curios/model/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.compat.curios.model; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/compat/curios/package-info.java b/src/main/java/twilightforest/compat/curios/package-info.java new file mode 100644 index 0000000000..a9bf061b02 --- /dev/null +++ b/src/main/java/twilightforest/compat/curios/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.compat.curios; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/compat/curios/renderer/CharmOfKeepingRenderer.java b/src/main/java/twilightforest/compat/curios/renderer/CharmOfKeepingRenderer.java new file mode 100644 index 0000000000..683536233c --- /dev/null +++ b/src/main/java/twilightforest/compat/curios/renderer/CharmOfKeepingRenderer.java @@ -0,0 +1,33 @@ +package twilightforest.compat.curios.renderer; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Axis; +import net.minecraft.client.Minecraft; +import net.minecraft.client.model.EntityModel; +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.renderer.ItemInHandRenderer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.block.model.ItemTransforms; +import net.minecraft.client.renderer.entity.RenderLayerParent; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import top.theillusivec4.curios.api.SlotContext; +import top.theillusivec4.curios.api.client.ICurioRenderer; + +public class CharmOfKeepingRenderer implements ICurioRenderer { + + @Override + public > void render(ItemStack stack, SlotContext slotContext, PoseStack ms, RenderLayerParent renderLayerParent, MultiBufferSource buffer, int light, float limbSwing, float limbSwingAmount, float partialTicks, float ageInTicks, float netHeadYaw, float headPitch) { + if (renderLayerParent.getModel() instanceof HumanoidModel model) { + ms.pushPose(); + model.rightLeg.translateAndRotate(ms); + ms.translate(-0.0D, 0.15D, -0.15D); + ms.mulPose(Axis.YP.rotationDegrees(0.0F)); + ms.scale(0.3F, -0.3F, -0.3F); + ItemInHandRenderer renderer = new ItemInHandRenderer(Minecraft.getInstance(), Minecraft.getInstance().getEntityRenderDispatcher(), Minecraft.getInstance().getItemRenderer()); + renderer.renderItem(slotContext.entity(), stack, ItemDisplayContext.FIXED, false, ms, buffer, light); + ms.popPose(); + } + } +} diff --git a/src/main/java/twilightforest/compat/curios/renderer/CharmOfLife1NecklaceRenderer.java b/src/main/java/twilightforest/compat/curios/renderer/CharmOfLife1NecklaceRenderer.java new file mode 100644 index 0000000000..c89bdab79f --- /dev/null +++ b/src/main/java/twilightforest/compat/curios/renderer/CharmOfLife1NecklaceRenderer.java @@ -0,0 +1,35 @@ +package twilightforest.compat.curios.renderer; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.Minecraft; +import net.minecraft.client.model.EntityModel; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.RenderLayerParent; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; +import top.theillusivec4.curios.api.SlotContext; +import top.theillusivec4.curios.api.client.ICurioRenderer; +import twilightforest.TwilightForestMod; +import twilightforest.client.model.TFModelLayers; +import twilightforest.compat.curios.model.CharmOfLife1NecklaceModel; + +public class CharmOfLife1NecklaceRenderer implements ICurioRenderer { + + private final CharmOfLife1NecklaceModel model; + + public CharmOfLife1NecklaceRenderer() { + this.model = new CharmOfLife1NecklaceModel(Minecraft.getInstance().getEntityModels().bakeLayer(TFModelLayers.CHARM_OF_LIFE_1)); + } + + @Override + public > void render(ItemStack item, SlotContext slotContext, PoseStack stack, RenderLayerParent renderLayerParent, MultiBufferSource buffer, int light, float limbSwing, float limbSwingAmount, float partialTicks, float ageInTicks, float netHeadYaw, float headPitch) { + this.model.setupAnim(slotContext.entity(), limbSwing, limbSwingAmount, ageInTicks, netHeadYaw, headPitch); + this.model.prepareMobModel(slotContext.entity(), limbSwing, limbSwingAmount, partialTicks); + ICurioRenderer.followBodyRotations(slotContext.entity(), this.model); + VertexConsumer vertexConsumer = buffer.getBuffer(RenderType.entityCutout(TwilightForestMod.getModelTexture("curios/charm_of_life_1.png"))); + this.model.renderToBuffer(stack, vertexConsumer, light, OverlayTexture.NO_OVERLAY, 1.0F, 1.0F, 1.0F, 1.0F); + } +} diff --git a/src/main/java/twilightforest/compat/curios/renderer/CharmOfLife2NecklaceRenderer.java b/src/main/java/twilightforest/compat/curios/renderer/CharmOfLife2NecklaceRenderer.java new file mode 100644 index 0000000000..1e1499b43e --- /dev/null +++ b/src/main/java/twilightforest/compat/curios/renderer/CharmOfLife2NecklaceRenderer.java @@ -0,0 +1,34 @@ +package twilightforest.compat.curios.renderer; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.Minecraft; +import net.minecraft.client.model.EntityModel; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.RenderLayerParent; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; +import top.theillusivec4.curios.api.SlotContext; +import top.theillusivec4.curios.api.client.ICurioRenderer; +import twilightforest.TwilightForestMod; +import twilightforest.client.model.TFModelLayers; +import twilightforest.compat.curios.model.CharmOfLife2NecklaceModel; + +public class CharmOfLife2NecklaceRenderer implements ICurioRenderer { + + private final CharmOfLife2NecklaceModel model; + + public CharmOfLife2NecklaceRenderer() { + this.model = new CharmOfLife2NecklaceModel(Minecraft.getInstance().getEntityModels().bakeLayer(TFModelLayers.CHARM_OF_LIFE_2)); + } + + @Override + public > void render(ItemStack item, SlotContext slotContext, PoseStack stack, RenderLayerParent renderLayerParent, MultiBufferSource buffer, int light, float limbSwing, float limbSwingAmount, float partialTicks, float ageInTicks, float netHeadYaw, float headPitch) { + + ICurioRenderer.followBodyRotations(slotContext.entity(), this.model); + VertexConsumer vertexConsumer = buffer.getBuffer(RenderType.entityCutout(TwilightForestMod.getModelTexture("curios/charm_of_life_2.png"))); + this.model.renderToBuffer(stack, vertexConsumer, light, OverlayTexture.NO_OVERLAY, 1.0F, 1.0F, 1.0F, 1.0F); + } +} diff --git a/src/main/java/twilightforest/compat/curios/renderer/CurioHeadRenderer.java b/src/main/java/twilightforest/compat/curios/renderer/CurioHeadRenderer.java new file mode 100644 index 0000000000..5615fc802f --- /dev/null +++ b/src/main/java/twilightforest/compat/curios/renderer/CurioHeadRenderer.java @@ -0,0 +1,38 @@ +package twilightforest.compat.curios.renderer; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Axis; +import net.minecraft.world.item.ItemDisplayContext; +import org.joml.Vector3f; +import net.minecraft.client.Minecraft; +import net.minecraft.client.model.EntityModel; +import net.minecraft.client.model.HeadedModel; +import net.minecraft.client.renderer.ItemInHandRenderer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.block.model.ItemTransforms; +import net.minecraft.client.renderer.entity.RenderLayerParent; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.registries.ForgeRegistries; +import top.theillusivec4.curios.api.SlotContext; +import top.theillusivec4.curios.api.client.ICurioRenderer; + +import java.util.Objects; + +public class CurioHeadRenderer implements ICurioRenderer { + + @Override + public > void render(ItemStack stack, SlotContext slotContext, PoseStack matrixStack, RenderLayerParent renderLayerParent, MultiBufferSource renderTypeBuffer, int light, float limbSwing, float limbSwingAmount, float partialTicks, float ageInTicks, float netHeadYaw, float headPitch) { + if (renderLayerParent.getModel() instanceof HeadedModel headModel) { + matrixStack.pushPose(); + headModel.getHead().translateAndRotate(matrixStack); + matrixStack.translate(0.0D, -0.25D, 0.0D); + matrixStack.mulPose(Axis.YP.rotationDegrees(180.0F)); + matrixStack.scale(0.625F, -0.625F, -0.625F); + ItemInHandRenderer renderer = new ItemInHandRenderer(Minecraft.getInstance(), Minecraft.getInstance().getEntityRenderDispatcher(), Minecraft.getInstance().getItemRenderer()); + renderer.renderItem(slotContext.entity(), stack, ItemDisplayContext.HEAD, false, matrixStack, renderTypeBuffer, light); + matrixStack.popPose(); + } + } +} diff --git a/src/main/java/twilightforest/compat/curios/renderer/package-info.java b/src/main/java/twilightforest/compat/curios/renderer/package-info.java new file mode 100644 index 0000000000..d4e52119d2 --- /dev/null +++ b/src/main/java/twilightforest/compat/curios/renderer/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.compat.curios.renderer; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/compat/jade/JadeCompat.java b/src/main/java/twilightforest/compat/jade/JadeCompat.java new file mode 100644 index 0000000000..fce7fdb22d --- /dev/null +++ b/src/main/java/twilightforest/compat/jade/JadeCompat.java @@ -0,0 +1,15 @@ +package twilightforest.compat.jade; + +import snownee.jade.api.IWailaClientRegistration; +import snownee.jade.api.IWailaPlugin; +import snownee.jade.api.WailaPlugin; +import twilightforest.entity.passive.QuestRam; + +@WailaPlugin +public class JadeCompat implements IWailaPlugin { + + @Override + public void registerClient(IWailaClientRegistration registration) { + registration.registerEntityComponent(QuestRamWoolProvider.INSTANCE, QuestRam.class); + } +} diff --git a/src/main/java/twilightforest/compat/jade/QuestRamWoolProvider.java b/src/main/java/twilightforest/compat/jade/QuestRamWoolProvider.java new file mode 100644 index 0000000000..5eaebdc007 --- /dev/null +++ b/src/main/java/twilightforest/compat/jade/QuestRamWoolProvider.java @@ -0,0 +1,46 @@ +package twilightforest.compat.jade; + +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.DyeColor; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.phys.Vec2; +import snownee.jade.Jade; +import snownee.jade.api.EntityAccessor; +import snownee.jade.api.IEntityComponentProvider; +import snownee.jade.api.ITooltip; +import snownee.jade.api.config.IPluginConfig; +import twilightforest.TwilightForestMod; +import twilightforest.entity.passive.QuestRam; +import twilightforest.util.ColorUtil; + +import java.util.Map; + +public enum QuestRamWoolProvider implements IEntityComponentProvider { + + INSTANCE; + + @Override + public void appendTooltip(ITooltip tooltip, EntityAccessor entityAccessor, IPluginConfig pluginConfig) { + if (entityAccessor.getEntity() instanceof QuestRam ram) { + int getRenderedWools = 0; + for (Map.Entry entry : ColorUtil.WOOL_TO_DYE_IN_RAM_ORDER.entrySet()) { + if (!ram.isColorPresent(entry.getKey())) { + if (getRenderedWools % 8 == 0) { + tooltip.add(Jade.smallItem(tooltip.getElementHelper(), new ItemStack(entry.getValue())).size(new Vec2(4.0F, 4.0F))); + } else { + tooltip.append(Jade.smallItem(tooltip.getElementHelper(), new ItemStack(entry.getValue())).size(new Vec2(4.0F, 4.0F))); + } + tooltip.append(Component.literal(" ")); + getRenderedWools++; + } + } + } + } + + @Override + public ResourceLocation getUid() { + return TwilightForestMod.prefix("quest_ram_wool"); + } +} diff --git a/src/main/java/twilightforest/compat/jade/package-info.java b/src/main/java/twilightforest/compat/jade/package-info.java new file mode 100644 index 0000000000..df91b321c5 --- /dev/null +++ b/src/main/java/twilightforest/compat/jade/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.compat.jade; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; diff --git a/src/main/java/twilightforest/compat/jei/FakeItemEntity.java b/src/main/java/twilightforest/compat/jei/FakeItemEntity.java new file mode 100644 index 0000000000..d9247296d8 --- /dev/null +++ b/src/main/java/twilightforest/compat/jei/FakeItemEntity.java @@ -0,0 +1,8 @@ +package twilightforest.compat.jei; + +import net.minecraft.world.item.ItemStack; + +//I have to wrap the itemstack in a class like this because otherwise it conflicts with JEI's VanillaTypes.ITEM_STACK +public record FakeItemEntity(ItemStack stack) { + +} diff --git a/src/main/java/twilightforest/compat/jei/JEICompat.java b/src/main/java/twilightforest/compat/jei/JEICompat.java new file mode 100644 index 0000000000..360970a60f --- /dev/null +++ b/src/main/java/twilightforest/compat/jei/JEICompat.java @@ -0,0 +1,95 @@ +package twilightforest.compat.jei; + +import mezz.jei.api.IModPlugin; +import mezz.jei.api.JeiPlugin; +import mezz.jei.api.constants.RecipeTypes; +import mezz.jei.api.ingredients.IIngredientType; +import mezz.jei.api.registration.*; +import net.minecraft.client.Minecraft; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.CraftingRecipe; +import net.minecraft.world.item.crafting.RecipeManager; +import net.minecraft.world.item.crafting.RecipeType; +import twilightforest.TFConfig; +import twilightforest.TwilightForestMod; +import twilightforest.client.UncraftingScreen; +import twilightforest.compat.jei.categories.CrumbleHornCategory; +import twilightforest.compat.jei.categories.JEIUncraftingCategory; +import twilightforest.compat.jei.categories.TransformationPowderCategory; +import twilightforest.compat.jei.renderers.*; +import twilightforest.data.tags.ItemTagGenerator; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFItems; +import twilightforest.init.TFMenuTypes; +import twilightforest.init.TFRecipes; +import twilightforest.inventory.UncraftingMenu; + +import java.util.Collections; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +@JeiPlugin +@SuppressWarnings({"unused", "rawtypes"}) +public class JEICompat implements IModPlugin { + + public static final IIngredientType ENTITY_TYPE = () -> EntityType.class; + public static final IIngredientType FAKE_ITEM_ENTITY = () -> FakeItemEntity.class; + + @Override + public void registerRecipeCatalysts(IRecipeCatalystRegistration registration) { + registration.addRecipeCatalyst(new ItemStack(TFBlocks.UNCRAFTING_TABLE.get()), RecipeTypes.CRAFTING); + registration.addRecipeCatalyst(new ItemStack(TFBlocks.UNCRAFTING_TABLE.get()), JEIUncraftingCategory.UNCRAFTING); + registration.addRecipeCatalyst(new ItemStack(TFItems.TRANSFORMATION_POWDER.get()), TransformationPowderCategory.TRANSFORMATION); + registration.addRecipeCatalyst(new ItemStack(TFItems.CRUMBLE_HORN.get()), CrumbleHornCategory.CRUMBLE_HORN); + } + + @Override + public void registerRecipeTransferHandlers(IRecipeTransferRegistration registration) { + registration.addRecipeTransferHandler(UncraftingMenu.class, TFMenuTypes.UNCRAFTING.get(), RecipeTypes.CRAFTING, 11, 9, 20, 36); + } + + @Override + public void registerIngredients(IModIngredientRegistration registration) { + registration.register(ENTITY_TYPE, Collections.emptyList(), new EntityHelper(), new EntityRenderer(16)); + registration.register(FAKE_ITEM_ENTITY, Collections.emptyList(), new FakeItemEntityHelper(), new FakeItemEntityRenderer(16)); + } + + @Override + public ResourceLocation getPluginUid() { + return TwilightForestMod.prefix("jei_plugin"); + } + + @Override + public void registerCategories(IRecipeCategoryRegistration registration) { + registration.addRecipeCategories(new JEIUncraftingCategory(registration.getJeiHelpers().getGuiHelper())); + registration.addRecipeCategories(new TransformationPowderCategory(registration.getJeiHelpers().getGuiHelper())); + registration.addRecipeCategories(new CrumbleHornCategory(registration.getJeiHelpers().getGuiHelper())); + } + + @Override + public void registerRecipes(IRecipeRegistration registration) { + RecipeManager manager = Objects.requireNonNull(Minecraft.getInstance().level).getRecipeManager(); + if (!TFConfig.COMMON_CONFIG.UNCRAFTING_STUFFS.disableUncrafting.get()) { //we only do this if uncrafting is not disabled + List recipes = manager.getAllRecipesFor(RecipeType.CRAFTING); + recipes = recipes.stream().filter(recipe -> + !recipe.getResultItem(Minecraft.getInstance().level.registryAccess()).isEmpty() && //get rid of empty items + !recipe.getResultItem(Minecraft.getInstance().level.registryAccess()).is(ItemTagGenerator.BANNED_UNCRAFTABLES) && //Prevents things that are tagged as banned from showing up + TFConfig.COMMON_CONFIG.UNCRAFTING_STUFFS.reverseRecipeBlacklist.get() == TFConfig.COMMON_CONFIG.UNCRAFTING_STUFFS.disableUncraftingRecipes.get().contains(recipe.getId().toString()) && //remove disabled recipes + TFConfig.COMMON_CONFIG.UNCRAFTING_STUFFS.flipUncraftingModIdList.get() == TFConfig.COMMON_CONFIG.UNCRAFTING_STUFFS.blacklistedUncraftingModIds.get().contains(recipe.getId().getNamespace())) //remove blacklisted mod ids + .collect(Collectors.toList()); + recipes.addAll(manager.getAllRecipesFor(TFRecipes.UNCRAFTING_RECIPE.get())); + registration.addRecipes(JEIUncraftingCategory.UNCRAFTING, recipes); + } + registration.addRecipes(TransformationPowderCategory.TRANSFORMATION, manager.getAllRecipesFor(TFRecipes.TRANSFORM_POWDER_RECIPE.get())); + registration.addRecipes(CrumbleHornCategory.CRUMBLE_HORN, manager.getAllRecipesFor(TFRecipes.CRUMBLE_RECIPE.get())); + } + + @Override + public void registerGuiHandlers(IGuiHandlerRegistration registration) { + registration.addRecipeClickArea(UncraftingScreen.class, 34, 33, 27, 20, JEIUncraftingCategory.UNCRAFTING); + registration.addRecipeClickArea(UncraftingScreen.class, 115, 33, 27, 20, RecipeTypes.CRAFTING); + } +} diff --git a/src/main/java/twilightforest/compat/jei/categories/CrumbleHornCategory.java b/src/main/java/twilightforest/compat/jei/categories/CrumbleHornCategory.java new file mode 100644 index 0000000000..91158ca37e --- /dev/null +++ b/src/main/java/twilightforest/compat/jei/categories/CrumbleHornCategory.java @@ -0,0 +1,80 @@ +package twilightforest.compat.jei.categories; + +import com.mojang.blaze3d.vertex.PoseStack; +import mezz.jei.api.constants.VanillaTypes; +import mezz.jei.api.gui.builder.IRecipeLayoutBuilder; +import mezz.jei.api.gui.drawable.IDrawable; +import mezz.jei.api.gui.ingredient.IRecipeSlotsView; +import mezz.jei.api.helpers.IGuiHelper; +import mezz.jei.api.recipe.IFocusGroup; +import mezz.jei.api.recipe.RecipeIngredientRole; +import mezz.jei.api.recipe.RecipeType; +import mezz.jei.api.recipe.category.IRecipeCategory; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import twilightforest.TwilightForestMod; +import twilightforest.compat.jei.FakeItemEntity; +import twilightforest.compat.jei.renderers.FakeItemEntityRenderer; +import twilightforest.compat.jei.JEICompat; +import twilightforest.init.TFItems; +import twilightforest.item.recipe.CrumbleRecipe; + +public class CrumbleHornCategory implements IRecipeCategory { + + public static final RecipeType CRUMBLE_HORN = RecipeType.create(TwilightForestMod.ID, "crumble_horn", CrumbleRecipe.class); + public static final int WIDTH = 116; + public static final int HEIGHT = 54; + private final IDrawable background; + private final IDrawable icon; + private final IDrawable crumbleSlot; + private final Component localizedName; + + private final FakeItemEntityRenderer itemRenderer = new FakeItemEntityRenderer(32); + + public CrumbleHornCategory(IGuiHelper helper) { + ResourceLocation location = TwilightForestMod.getGuiTexture("crumble_horn_jei.png"); + this.background = helper.createDrawable(location, 0, 0, WIDTH, HEIGHT); + this.icon = helper.createDrawableIngredient(VanillaTypes.ITEM_STACK, TFItems.CRUMBLE_HORN.get().getDefaultInstance()); + this.crumbleSlot = helper.createDrawable(location, 116, 0, 26, 26); + this.localizedName = Component.translatable("gui.twilightforest.crumble_horn_jei"); + } + + @Override + public RecipeType getRecipeType() { + return CRUMBLE_HORN; + } + + @Override + public Component getTitle() { + return this.localizedName; + } + + @Override + public IDrawable getBackground() { + return this.background; + } + + @Override + public IDrawable getIcon() { + return this.icon; + } + + @Override + public void draw(CrumbleRecipe recipe, IRecipeSlotsView recipeSlotsView, PoseStack stack, double mouseX, double mouseY) { + if (!recipe.result().isAir()) this.crumbleSlot.draw(stack, 76, 14); + } + + @Override + public void setRecipe(IRecipeLayoutBuilder builder, CrumbleRecipe recipe, IFocusGroup focuses) { + builder.addSlot(RecipeIngredientRole.INPUT, 19, 19).addItemStack(new ItemStack(recipe.input().getBlock().asItem())); + + if (!recipe.result().isAir()) { + builder.addSlot(RecipeIngredientRole.OUTPUT, 81, 19).addItemStack(new ItemStack(recipe.result().getBlock().asItem())); + } else { + builder.addSlot(RecipeIngredientRole.OUTPUT, 75, 12) + .setCustomRenderer(JEICompat.FAKE_ITEM_ENTITY, this.itemRenderer) + .addIngredient(JEICompat.FAKE_ITEM_ENTITY, new FakeItemEntity(new ItemStack(recipe.input().getBlock().asItem()))); + } + } +} diff --git a/src/main/java/twilightforest/compat/jei/categories/JEIUncraftingCategory.java b/src/main/java/twilightforest/compat/jei/categories/JEIUncraftingCategory.java new file mode 100644 index 0000000000..a2b4255e30 --- /dev/null +++ b/src/main/java/twilightforest/compat/jei/categories/JEIUncraftingCategory.java @@ -0,0 +1,89 @@ +package twilightforest.compat.jei.categories; + +import mezz.jei.api.constants.VanillaTypes; +import mezz.jei.api.gui.builder.IRecipeLayoutBuilder; +import mezz.jei.api.gui.drawable.IDrawable; +import mezz.jei.api.helpers.IGuiHelper; +import mezz.jei.api.recipe.IFocusGroup; +import mezz.jei.api.recipe.RecipeIngredientRole; +import mezz.jei.api.recipe.RecipeType; +import mezz.jei.api.recipe.category.IRecipeCategory; +import net.minecraft.client.Minecraft; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.CraftingRecipe; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.item.crafting.ShapelessRecipe; +import twilightforest.TwilightForestMod; +import twilightforest.data.tags.ItemTagGenerator; +import twilightforest.init.TFBlocks; +import twilightforest.item.recipe.UncraftingRecipe; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class JEIUncraftingCategory implements IRecipeCategory { + public static final RecipeType UNCRAFTING = RecipeType.create(TwilightForestMod.ID, "uncrafting", CraftingRecipe.class); + public static final int width = 116; + public static final int height = 54; + private final IDrawable background; + private final IDrawable icon; + private final Component localizedName; + + public JEIUncraftingCategory(IGuiHelper guiHelper) { + ResourceLocation location = TwilightForestMod.getGuiTexture("uncrafting_jei.png"); + this.background = guiHelper.createDrawable(location, 0, 0, width, height); + this.icon = guiHelper.createDrawableIngredient(VanillaTypes.ITEM_STACK, new ItemStack(TFBlocks.UNCRAFTING_TABLE.get())); + this.localizedName = Component.translatable("gui.twilightforest.uncrafting_jei"); + } + + @Override + public RecipeType getRecipeType() { + return UNCRAFTING; + } + + @Override + public Component getTitle() { + return this.localizedName; + } + + @Override + public IDrawable getBackground() { + return this.background; + } + + @Override + public IDrawable getIcon() { + return this.icon; + } + + @Override + public void setRecipe(IRecipeLayoutBuilder builder, CraftingRecipe recipe, IFocusGroup focuses) { + List outputs = new ArrayList<>(recipe.getIngredients()); //Collect each ingredient + for (int i = 0; i < outputs.size(); i++) { + outputs.set(i, Ingredient.of(Arrays.stream(outputs.get(i).getItems()) + .filter(o -> !(o.is(ItemTagGenerator.BANNED_UNCRAFTING_INGREDIENTS))) + .filter(o -> !(o.getItem().hasCraftingRemainingItem(o)))));//Remove any banned items + } + + for (int j = 0, k = 0; j - k < outputs.size() && j < 9; j++) { + int x = j % 3, y = j / 3; + if ((recipe.canCraftInDimensions(x, 3) | recipe.canCraftInDimensions(3, y)) && !(recipe instanceof ShapelessRecipe)) { + k++; + continue; + } //Skips empty spaces in shaped recipes + builder.addSlot(RecipeIngredientRole.OUTPUT, x * 18 + 63, y * 18 + 1).addIngredients(outputs.get(j - k)); //Set input as output and place in the grid + } + + if (recipe instanceof UncraftingRecipe uncraftingRecipe) { + ItemStack[] stacks = uncraftingRecipe.getIngredient().getItems(); + ItemStack[] stackedStacks = new ItemStack[stacks.length]; + for (int i = 0; i < stacks.length; i++) stackedStacks[i] = new ItemStack(stacks[0].getItem(), uncraftingRecipe.count()); + builder.addSlot(RecipeIngredientRole.INPUT, 5, 19).addIngredients(Ingredient.of(stackedStacks));//If the recipe is an uncrafting recipe, we need to get the ingredient instead of an itemStack + } else { + builder.addSlot(RecipeIngredientRole.INPUT, 5, 19).addItemStack(recipe.getResultItem(Minecraft.getInstance().level.registryAccess()));//Set the outputs as inputs and draw the item you're uncrafting in the right spot as well + } + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/compat/jei/categories/TransformationPowderCategory.java b/src/main/java/twilightforest/compat/jei/categories/TransformationPowderCategory.java new file mode 100644 index 0000000000..8df641d062 --- /dev/null +++ b/src/main/java/twilightforest/compat/jei/categories/TransformationPowderCategory.java @@ -0,0 +1,88 @@ +package twilightforest.compat.jei.categories; + +import com.mojang.blaze3d.vertex.PoseStack; +import mezz.jei.api.constants.VanillaTypes; +import mezz.jei.api.gui.builder.IRecipeLayoutBuilder; +import mezz.jei.api.gui.drawable.IDrawable; +import mezz.jei.api.gui.ingredient.IRecipeSlotsView; +import mezz.jei.api.helpers.IGuiHelper; +import mezz.jei.api.recipe.IFocusGroup; +import mezz.jei.api.recipe.RecipeIngredientRole; +import mezz.jei.api.recipe.RecipeType; +import mezz.jei.api.recipe.category.IRecipeCategory; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.common.ForgeSpawnEggItem; +import twilightforest.TwilightForestMod; +import twilightforest.compat.jei.renderers.EntityRenderer; +import twilightforest.compat.jei.JEICompat; +import twilightforest.init.TFItems; +import twilightforest.item.recipe.TransformPowderRecipe; + +public class TransformationPowderCategory implements IRecipeCategory { + public static final RecipeType TRANSFORMATION = RecipeType.create(TwilightForestMod.ID, "transformation", TransformPowderRecipe.class); + public static final int WIDTH = 116; + public static final int HEIGHT = 54; + private final IDrawable background; + private final IDrawable icon; + private final IDrawable arrow; + private final IDrawable doubleArrow; + private final Component localizedName; + private final EntityRenderer entityRenderer = new EntityRenderer(32); + + public TransformationPowderCategory(IGuiHelper helper) { + ResourceLocation location = TwilightForestMod.getGuiTexture("transformation_jei.png"); + this.background = helper.createDrawable(location, 0, 0, WIDTH, HEIGHT); + this.arrow = helper.createDrawable(location, 116, 0, 23, 15); + this.doubleArrow = helper.createDrawable(location, 116, 16, 23, 15); + this.icon = helper.createDrawableIngredient(VanillaTypes.ITEM_STACK, TFItems.TRANSFORMATION_POWDER.get().getDefaultInstance()); + this.localizedName = Component.translatable("gui.twilightforest.transformation_jei"); + } + + @Override + public RecipeType getRecipeType() { + return TRANSFORMATION; + } + + @Override + public Component getTitle() { + return this.localizedName; + } + + @Override + public IDrawable getBackground() { + return this.background; + } + + @Override + public IDrawable getIcon() { + return this.icon; + } + + @Override + public void draw(TransformPowderRecipe recipe, IRecipeSlotsView recipeSlotsView, PoseStack stack, double mouseX, double mouseY) { + if (recipe.isReversible()) { + this.doubleArrow.draw(stack, 46, 19); + } else { + this.arrow.draw(stack, 46, 19); + } + } + + @Override + public void setRecipe(IRecipeLayoutBuilder builder, TransformPowderRecipe recipe, IFocusGroup focuses) { + builder.addSlot(RecipeIngredientRole.INPUT, 8, 11) + .setCustomRenderer(JEICompat.ENTITY_TYPE, this.entityRenderer) + .addIngredient(JEICompat.ENTITY_TYPE, recipe.input()); + + //make it so hovering over the entity shows its name + builder.addInvisibleIngredients(RecipeIngredientRole.INPUT).addItemStack(new ItemStack(ForgeSpawnEggItem.fromEntityType(recipe.input()))); + + builder.addSlot(RecipeIngredientRole.OUTPUT, 76, 11) + .setCustomRenderer(JEICompat.ENTITY_TYPE, this.entityRenderer) + .addIngredient(JEICompat.ENTITY_TYPE, recipe.result()); + + //make it so hovering over the entity shows its name + builder.addInvisibleIngredients(RecipeIngredientRole.OUTPUT).addItemStack(new ItemStack(ForgeSpawnEggItem.fromEntityType(recipe.result()))); + } +} diff --git a/src/main/java/twilightforest/compat/jei/categories/package-info.java b/src/main/java/twilightforest/compat/jei/categories/package-info.java new file mode 100644 index 0000000000..69990a5617 --- /dev/null +++ b/src/main/java/twilightforest/compat/jei/categories/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.compat.jei.categories; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/compat/jei/package-info.java b/src/main/java/twilightforest/compat/jei/package-info.java new file mode 100644 index 0000000000..220b41e569 --- /dev/null +++ b/src/main/java/twilightforest/compat/jei/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.compat.jei; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/compat/jei/renderers/EntityHelper.java b/src/main/java/twilightforest/compat/jei/renderers/EntityHelper.java new file mode 100644 index 0000000000..250d8268ca --- /dev/null +++ b/src/main/java/twilightforest/compat/jei/renderers/EntityHelper.java @@ -0,0 +1,53 @@ +package twilightforest.compat.jei.renderers; + +import mezz.jei.api.ingredients.IIngredientHelper; +import mezz.jei.api.ingredients.IIngredientType; +import mezz.jei.api.ingredients.subtypes.UidContext; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.EntityType; +import net.minecraftforge.registries.ForgeRegistries; +import org.jetbrains.annotations.Nullable; +import twilightforest.compat.jei.JEICompat; + +import java.util.Objects; + +@SuppressWarnings("rawtypes") +public class EntityHelper implements IIngredientHelper { + + @Override + public IIngredientType getIngredientType() { + return JEICompat.ENTITY_TYPE; + } + + @Override + public String getDisplayName(EntityType type) { + return type.getDescription().getString(); + } + + @Override + public String getUniqueId(EntityType type, UidContext context) { + return Objects.requireNonNull(ForgeRegistries.ENTITY_TYPES.getKey(type)).toString(); + } + + @Override + public ResourceLocation getResourceLocation(EntityType type) { + return Objects.requireNonNull(ForgeRegistries.ENTITY_TYPES.getKey(type)); + } + + @Override + public EntityType copyIngredient(EntityType type) { + return type; + } + + @Override + public String getErrorInfo(@Nullable EntityType type) { + if (type == null) { + return "null"; + } + ResourceLocation name = ForgeRegistries.ENTITY_TYPES.getKey(type); + if (name == null) { + return "unnamed sadface :("; + } + return name.toString(); + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/compat/jei/renderers/EntityRenderer.java b/src/main/java/twilightforest/compat/jei/renderers/EntityRenderer.java new file mode 100644 index 0000000000..b6527814a2 --- /dev/null +++ b/src/main/java/twilightforest/compat/jei/renderers/EntityRenderer.java @@ -0,0 +1,147 @@ +package twilightforest.compat.jei.renderers; + +import com.mojang.blaze3d.platform.Lighting; +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Axis; +import mezz.jei.api.ingredients.IIngredientRenderer; +import net.minecraft.ChatFormatting; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.entity.EntityRenderDispatcher; +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; +import net.minecraftforge.registries.ForgeRegistries; +import org.jetbrains.annotations.Nullable; +import org.joml.Quaternionf; +import twilightforest.TwilightForestMod; + +import java.util.*; + +@SuppressWarnings({"rawtypes", "deprecation"}) +//yoinked from TCon, entity melting rendering looks so good and I couldnt be bothered to write my own system +public class EntityRenderer implements IIngredientRenderer { + + private static final Set> IGNORED_ENTITIES = new HashSet<>(); + private final int size; + private final Map, Entity> ENTITY_MAP = new HashMap<>(); + + public EntityRenderer(int size) { + this.size = size; + } + + @Override + public int getWidth() { + return this.size; + } + + @Override + public int getHeight() { + return this.size; + } + + @Override + public void render(PoseStack stack, @Nullable EntityType type) { + if (type != null) { + Level level = Minecraft.getInstance().level; + if (level != null && !IGNORED_ENTITIES.contains(type)) { + Entity entity; + // players cannot be created using the type, but we can use the client player + // side effect is it renders armor/items + if (type == EntityType.PLAYER) { + entity = Minecraft.getInstance().player; + } else { + // entity is created with the client world, but the entity map is thrown away when JEI restarts so they should be okay I think + entity = this.ENTITY_MAP.computeIfAbsent(type, t -> t.create(level)); + } + // only can draw living entities, plus non-living ones don't get recipes anyways + if (entity instanceof LivingEntity livingEntity) { + // scale down large mobs, but don't scale up small ones + int scale = this.size / 2; + float height = entity.getBbHeight(); + float width = entity.getBbWidth(); + if (height > 2.25F || width > 2.25F) { + scale = (int) (20 / Math.max(height, width)); + } + // catch exceptions drawing the entity to be safe, any caught exceptions blacklist the entity + try { + PoseStack modelView = RenderSystem.getModelViewStack(); + modelView.pushPose(); + modelView.mulPoseMatrix(stack.last().pose()); + this.renderTheEntity(this.size / 2, this.size - 2, scale, livingEntity); + modelView.popPose(); + RenderSystem.applyModelViewMatrix(); + } catch (Exception e) { + TwilightForestMod.LOGGER.error("Error drawing entity " + ForgeRegistries.ENTITY_TYPES.getKey(type), e); + IGNORED_ENTITIES.add(type); + this.ENTITY_MAP.remove(type); + } + } else { + // not living, so might as well skip next time + IGNORED_ENTITIES.add(type); + this.ENTITY_MAP.remove(type); + } + } + } + } + + @Override + public List getTooltip(EntityType type, TooltipFlag flag) { + List tooltip = new ArrayList<>(); + tooltip.add(type.getDescription()); + if (flag.isAdvanced()) { + tooltip.add(Component.literal(Objects.requireNonNull(ForgeRegistries.ENTITY_TYPES.getKey(type)).toString()).withStyle(ChatFormatting.DARK_GRAY)); + } + return tooltip; + } + + //[VanillaCopy] of InventoryScreen.renderEntityInInventory, with added rotations and some other modified values + private void renderTheEntity(int x, int y, int scale, LivingEntity entity) { + PoseStack posestack = RenderSystem.getModelViewStack(); + posestack.pushPose(); + posestack.translate(x, y, 1050.0D); + if (entity.getType() == EntityType.GHAST) posestack.translate(0.0D, -8.5D, 0.0D); + posestack.scale(1.0F, 1.0F, -1.0F); + RenderSystem.applyModelViewMatrix(); + PoseStack posestack1 = new PoseStack(); + posestack1.translate(0.0D, 0.0D, 1000.0D); + posestack1.scale((float) scale, (float) scale, (float) scale); + Quaternionf quaternion = Axis.ZP.rotationDegrees(180.0F); + Quaternionf quaternion1 = Axis.XP.rotationDegrees(20.0F); + quaternion.mul(quaternion1); + posestack1.mulPose(quaternion); + posestack1.mulPose(Axis.XN.rotationDegrees(35.0F)); + posestack1.mulPose(Axis.YN.rotationDegrees(145.0F)); + float f2 = entity.yBodyRot; + float f3 = entity.getYRot(); + float f4 = entity.getXRot(); + float f5 = entity.yHeadRotO; + float f6 = entity.yHeadRot; + entity.yBodyRot = 0.0F; + entity.setYRot(0.0F); + entity.setXRot(0.0F); + entity.yHeadRot = entity.getYRot(); + entity.yHeadRotO = entity.getYRot(); + Lighting.setupForEntityInInventory(); + EntityRenderDispatcher entityrenderdispatcher = Minecraft.getInstance().getEntityRenderDispatcher(); + quaternion1.conjugate(); + entityrenderdispatcher.overrideCameraOrientation(quaternion1); + entityrenderdispatcher.setRenderShadow(false); + MultiBufferSource.BufferSource multibuffersource$buffersource = Minecraft.getInstance().renderBuffers().bufferSource(); + RenderSystem.runAsFancy(() -> entityrenderdispatcher.render(entity, 0.0D, 0.0D, 0.0D, 0.0F, 1.0F, posestack1, multibuffersource$buffersource, 15728880)); + multibuffersource$buffersource.endBatch(); + entityrenderdispatcher.setRenderShadow(true); + entity.yBodyRot = f2; + entity.setYRot(f3); + entity.setXRot(f4); + entity.yHeadRotO = f5; + entity.yHeadRot = f6; + posestack.popPose(); + RenderSystem.applyModelViewMatrix(); + Lighting.setupFor3DItems(); + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/compat/jei/renderers/FakeItemEntityHelper.java b/src/main/java/twilightforest/compat/jei/renderers/FakeItemEntityHelper.java new file mode 100644 index 0000000000..f10e9f2589 --- /dev/null +++ b/src/main/java/twilightforest/compat/jei/renderers/FakeItemEntityHelper.java @@ -0,0 +1,48 @@ +package twilightforest.compat.jei.renderers; + +import mezz.jei.api.ingredients.IIngredientHelper; +import mezz.jei.api.ingredients.IIngredientType; +import mezz.jei.api.ingredients.subtypes.UidContext; +import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.registries.ForgeRegistries; +import org.jetbrains.annotations.Nullable; +import twilightforest.compat.jei.FakeItemEntity; +import twilightforest.compat.jei.JEICompat; + +import java.util.Objects; + +public class FakeItemEntityHelper implements IIngredientHelper { + + @Override + public IIngredientType getIngredientType() { + return JEICompat.FAKE_ITEM_ENTITY; + } + + @Override + public String getDisplayName(FakeItemEntity ingredient) { + return ingredient.stack().getItem().getDescription().toString(); + } + + @Override + public String getUniqueId(FakeItemEntity ingredient, UidContext context) { + return Objects.requireNonNull(ForgeRegistries.ITEMS.getKey(ingredient.stack().getItem())).toString(); + } + + @Override + public ResourceLocation getResourceLocation(FakeItemEntity ingredient) { + return Objects.requireNonNull(ForgeRegistries.ITEMS.getKey(ingredient.stack().getItem())); + } + + @Override + public FakeItemEntity copyIngredient(FakeItemEntity ingredient) { + return ingredient; + } + + @Override + public String getErrorInfo(@Nullable FakeItemEntity ingredient) { + if (ingredient == null) { + return "null"; + }; + return ingredient.stack().toString(); + } +} diff --git a/src/main/java/twilightforest/compat/jei/renderers/FakeItemEntityRenderer.java b/src/main/java/twilightforest/compat/jei/renderers/FakeItemEntityRenderer.java new file mode 100644 index 0000000000..b1432ffacb --- /dev/null +++ b/src/main/java/twilightforest/compat/jei/renderers/FakeItemEntityRenderer.java @@ -0,0 +1,132 @@ +package twilightforest.compat.jei.renderers; + +import com.mojang.blaze3d.platform.Lighting; +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Axis; +import mezz.jei.api.ingredients.IIngredientRenderer; +import net.minecraft.ChatFormatting; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.block.model.ItemTransforms; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.client.resources.model.BakedModel; +import net.minecraft.network.chat.Component; +import net.minecraft.util.Mth; +import net.minecraft.util.RandomSource; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; +import net.minecraftforge.registries.ForgeRegistries; +import org.jetbrains.annotations.Nullable; +import org.joml.Quaternionf; +import twilightforest.TwilightForestMod; +import twilightforest.compat.jei.FakeItemEntity; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +@SuppressWarnings("deprecation") +public class FakeItemEntityRenderer implements IIngredientRenderer { + + private final float bobOffs; + private final int size; + + public FakeItemEntityRenderer(int size) { + this.bobOffs = RandomSource.create().nextFloat() * (float) Math.PI * 2.0F; + this.size = size; + } + + @Override + public int getWidth() { + return this.size; + } + + @Override + public int getHeight() { + return this.size; + } + + @Override + public void render(PoseStack stack, @Nullable FakeItemEntity item) { + Level level = Minecraft.getInstance().level; + if (item != null && level != null) { + try { + PoseStack modelView = RenderSystem.getModelViewStack(); + modelView.pushPose(); + modelView.mulPoseMatrix(stack.last().pose()); + this.renderItemEntity(item.stack(), level); + modelView.popPose(); + RenderSystem.applyModelViewMatrix(); + } catch (Exception e) { + TwilightForestMod.LOGGER.error("Error drawing item in JEI!", e); + } + } + } + + @Override + public List getTooltip(FakeItemEntity item, TooltipFlag flag) { + List tooltip = new ArrayList<>(); + tooltip.add(item.stack().getItem().getDescription()); + if (flag.isAdvanced()) { + tooltip.add(Component.literal(Objects.requireNonNull(ForgeRegistries.ITEMS.getKey(item.stack().getItem())).toString()).withStyle(ChatFormatting.DARK_GRAY)); + } + return tooltip; + } + + private void renderItemEntity(ItemStack stack, Level level) { + PoseStack posestack = RenderSystem.getModelViewStack(); + posestack.pushPose(); + posestack.translate(16.0D, 32.0D, 1050.0D); + posestack.scale(1.0F, 1.0F, -1.0F); + RenderSystem.applyModelViewMatrix(); + PoseStack posestack1 = new PoseStack(); + posestack1.translate(0.0D, 0.0D, 1000.0D); + posestack1.scale(50.0F, 50.0F, 50.0F); + Quaternionf quaternion = Axis.ZP.rotationDegrees(180.0F); + Quaternionf quaternion1 = Axis.XP.rotationDegrees(20.0F); + quaternion.mul(quaternion1); + posestack1.mulPose(quaternion); + posestack1.mulPose(Axis.XN.rotationDegrees(35.0F)); + posestack1.mulPose(Axis.YN.rotationDegrees(145.0F)); + Lighting.setupForEntityInInventory(); + quaternion1.conjugate(); + MultiBufferSource.BufferSource buffer = Minecraft.getInstance().renderBuffers().bufferSource(); + ItemEntity item = EntityType.ITEM.create(level); + Objects.requireNonNull(item).setItem(stack); + RenderSystem.runAsFancy(() -> + this.render(item, Minecraft.getInstance().getDeltaFrameTime(), posestack1, buffer, 15728880)); + buffer.endBatch(); + posestack.popPose(); + RenderSystem.applyModelViewMatrix(); + Lighting.setupFor3DItems(); + } + + //[VanillaCopy] of ItemEntityRenderer.render. I have to add my own bob offset and ticker since using the vanilla method has issues + public void render(ItemEntity entity, float partialTicks, PoseStack stack, MultiBufferSource buffer, int light) { + stack.pushPose(); + ItemStack itemstack = entity.getItem(); + BakedModel bakedmodel = Minecraft.getInstance().getItemRenderer().getModel(itemstack, entity.getLevel(), null, entity.getId()); + float f1 = Mth.sin((Objects.requireNonNull(Minecraft.getInstance().level).getGameTime() + partialTicks) / 10.0F + this.bobOffs) * 0.1F + 0.1F; + float f2 = bakedmodel.getTransforms().getTransform(ItemDisplayContext.GROUND).scale.y(); + stack.translate(0.0D, f1 + 0.25F * f2, 0.0D); + float f3 = this.getSpin(partialTicks); + stack.mulPose(Axis.YP.rotation(f3)); + + stack.pushPose(); + + Minecraft.getInstance().getItemRenderer().render(itemstack, ItemDisplayContext.GROUND, false, stack, buffer, light, OverlayTexture.NO_OVERLAY, bakedmodel); + stack.popPose(); + + + stack.popPose(); + } + + public float getSpin(float pPartialTicks) { + return (Objects.requireNonNull(Minecraft.getInstance().level).getGameTime() + pPartialTicks) / 20.0F + this.bobOffs; + } +} diff --git a/src/main/java/twilightforest/compat/jei/renderers/package-info.java b/src/main/java/twilightforest/compat/jei/renderers/package-info.java new file mode 100644 index 0000000000..bfea96730d --- /dev/null +++ b/src/main/java/twilightforest/compat/jei/renderers/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.compat.jei.renderers; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/compat/top/QuestRamWoolElement.java b/src/main/java/twilightforest/compat/top/QuestRamWoolElement.java new file mode 100644 index 0000000000..6a973653f1 --- /dev/null +++ b/src/main/java/twilightforest/compat/top/QuestRamWoolElement.java @@ -0,0 +1,113 @@ +package twilightforest.compat.top; + +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.PoseStack; +import mcjty.theoneprobe.api.IElement; +import mcjty.theoneprobe.api.IElementFactory; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.entity.ItemRenderer; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.DyeColor; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Block; +import twilightforest.TwilightForestMod; +import twilightforest.util.ColorUtil; + +import java.util.Map; + +public class QuestRamWoolElement implements IElement { + + public static ResourceLocation ID = TwilightForestMod.prefix("quest_ram_wool"); + + private final int colorData; + + public QuestRamWoolElement(int colorData) { + this.colorData = colorData; + } + + public QuestRamWoolElement(FriendlyByteBuf buf) { + this.colorData = buf.readInt(); + } + + public boolean isColorPresent(DyeColor color) { + return (this.colorData & (1 << color.getId())) > 0; + } + + @Override + public void render(PoseStack poseStack, int x, int y) { + poseStack.pushPose(); + RenderSystem.enableDepthTest(); + ItemRenderer itemRenderer = Minecraft.getInstance().getItemRenderer(); + PoseStack modelStack = RenderSystem.getModelViewStack(); + modelStack.translate(3, 10, 0); + modelStack.scale(0.6f, 0.6f, 0.6f); + + RenderSystem.applyModelViewMatrix(); + int getRenderedWools = 0; + int colum = 0; + int row = 0; + for (Map.Entry entry : ColorUtil.WOOL_TO_DYE_IN_RAM_ORDER.entrySet()) { + if (!isColorPresent(entry.getKey())) { + if (getRenderedWools % 8 == 0) { + row++; + colum = 0; + } else { + colum++; + } + + itemRenderer.renderGuiItem(poseStack, new ItemStack(entry.getValue()), x + (colum * 15), y + (row * 15)); + + getRenderedWools++; + } + } + RenderSystem.disableDepthTest(); + poseStack.popPose(); + } + + @Override + public int getWidth() { + return 4; + } + + @Override + public int getHeight() { + int getRenderedWools = 0; + int row = 0; + for (Map.Entry entry : ColorUtil.WOOL_TO_DYE_IN_RAM_ORDER.entrySet()) { + if (!isColorPresent(entry.getKey())) { + if (getRenderedWools % 8 == 0) { + row++; + } + + getRenderedWools++; + } + } + + return row * 10; + } + + @Override + public void toBytes(FriendlyByteBuf buf) { + buf.writeInt(this.colorData); + } + + @Override + public ResourceLocation getID() { + return ID; + } + + public enum Factory implements IElementFactory { + INSTANCE; + + @Override + public IElement createElement(FriendlyByteBuf buf) { + return new QuestRamWoolElement(buf); + } + + @Override + public ResourceLocation getId() { + return ID; + } + } +} diff --git a/src/main/java/twilightforest/compat/top/TOPQuestRamWoolProvider.java b/src/main/java/twilightforest/compat/top/TOPQuestRamWoolProvider.java new file mode 100644 index 0000000000..f899a98313 --- /dev/null +++ b/src/main/java/twilightforest/compat/top/TOPQuestRamWoolProvider.java @@ -0,0 +1,28 @@ +package twilightforest.compat.top; + +import mcjty.theoneprobe.api.IProbeHitEntityData; +import mcjty.theoneprobe.api.IProbeInfo; +import mcjty.theoneprobe.api.IProbeInfoEntityProvider; +import mcjty.theoneprobe.api.ProbeMode; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import twilightforest.TwilightForestMod; +import twilightforest.entity.passive.QuestRam; + +public enum TOPQuestRamWoolProvider implements IProbeInfoEntityProvider { + + INSTANCE; + + @Override + public String getID() { + return TwilightForestMod.prefix("quest_ram_wool").toString(); + } + + @Override + public void addProbeEntityInfo(ProbeMode probeMode, IProbeInfo iProbeInfo, Player player, Level level, Entity entity, IProbeHitEntityData iProbeHitEntityData) { + if (entity instanceof QuestRam ram) { + iProbeInfo.element(new QuestRamWoolElement(ram.getColorFlags())); + } + } +} diff --git a/src/main/java/twilightforest/compat/top/TopCompat.java b/src/main/java/twilightforest/compat/top/TopCompat.java new file mode 100644 index 0000000000..746ab440e2 --- /dev/null +++ b/src/main/java/twilightforest/compat/top/TopCompat.java @@ -0,0 +1,14 @@ +package twilightforest.compat.top; + +import mcjty.theoneprobe.api.ITheOneProbe; + +import java.util.function.Function; + +public class TopCompat implements Function { + @Override + public Void apply(ITheOneProbe api) { + api.registerElementFactory(QuestRamWoolElement.Factory.INSTANCE); + api.registerEntityProvider(TOPQuestRamWoolProvider.INSTANCE); + return null; + } +} diff --git a/src/main/java/twilightforest/data/AtlasGenerator.java b/src/main/java/twilightforest/data/AtlasGenerator.java new file mode 100644 index 0000000000..ae67571602 --- /dev/null +++ b/src/main/java/twilightforest/data/AtlasGenerator.java @@ -0,0 +1,24 @@ +package twilightforest.data; + +import net.minecraft.client.renderer.texture.atlas.sources.SingleFile; +import net.minecraft.client.resources.model.Material; +import net.minecraft.data.PackOutput; +import net.minecraftforge.common.data.ExistingFileHelper; +import net.minecraftforge.common.data.SpriteSourceProvider; +import twilightforest.TwilightForestMod; +import twilightforest.client.renderer.tileentity.TwilightChestRenderer; + +import java.util.Optional; + +public class AtlasGenerator extends SpriteSourceProvider { + public AtlasGenerator(PackOutput output, ExistingFileHelper helper) { + super(output, helper, TwilightForestMod.ID); + } + + @Override + protected void addSources() { + TwilightChestRenderer.MATERIALS.values().stream().flatMap(e -> e.values().stream()).map(Material::texture) + .forEach(resourceLocation -> this.atlas(CHESTS_ATLAS).addSource(new SingleFile(resourceLocation, Optional.empty()))); + this.atlas(SHIELD_PATTERNS_ATLAS).addSource(new SingleFile(TwilightForestMod.prefix("model/knightmetal_shield"), Optional.empty())); + } +} diff --git a/src/main/java/twilightforest/data/BlockLootTables.java b/src/main/java/twilightforest/data/BlockLootTables.java new file mode 100644 index 0000000000..1559b29ba5 --- /dev/null +++ b/src/main/java/twilightforest/data/BlockLootTables.java @@ -0,0 +1,594 @@ +package twilightforest.data; + +import net.minecraft.advancements.critereon.ItemPredicate; +import net.minecraft.advancements.critereon.StatePropertiesPredicate; +import net.minecraft.data.loot.BlockLootSubProvider; +import net.minecraft.world.flag.FeatureFlagSet; +import net.minecraft.world.flag.FeatureFlags; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.level.ItemLike; +import net.minecraft.world.level.block.*; +import net.minecraft.world.level.block.state.properties.DoubleBlockHalf; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.LootPool; +import net.minecraft.world.level.storage.loot.LootTable; +import net.minecraft.world.level.storage.loot.entries.AlternativesEntry; +import net.minecraft.world.level.storage.loot.entries.LootItem; +import net.minecraft.world.level.storage.loot.entries.LootPoolEntryContainer; +import net.minecraft.world.level.storage.loot.functions.ApplyBonusCount; +import net.minecraft.world.level.storage.loot.functions.CopyBlockState; +import net.minecraft.world.level.storage.loot.functions.CopyNbtFunction; +import net.minecraft.world.level.storage.loot.functions.SetItemCountFunction; +import net.minecraft.world.level.storage.loot.predicates.*; +import net.minecraft.world.level.storage.loot.providers.nbt.ContextNbtProvider; +import net.minecraft.world.level.storage.loot.providers.number.ConstantValue; +import net.minecraft.world.level.storage.loot.providers.number.UniformGenerator; +import net.minecraftforge.common.Tags; +import net.minecraftforge.registries.ForgeRegistries; +import twilightforest.TwilightForestMod; +import twilightforest.block.*; +import twilightforest.enums.HollowLogVariants; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFItems; + +import java.util.Set; +import java.util.stream.Collectors; + +public class BlockLootTables extends BlockLootSubProvider { + // [VanillaCopy] of BlockLoot fields, just changed shears to work with modded ones + private static final float[] DEFAULT_SAPLING_DROP_RATES = new float[]{0.05F, 0.0625F, 0.083333336F, 0.1F}; + private static final float[] RARE_SAPLING_DROP_RATES = new float[]{0.025F, 0.027777778F, 0.03125F, 0.041666668F, 0.1F}; + private static final LootItemCondition.Builder HAS_SHEARS = MatchTool.toolMatches(ItemPredicate.Builder.item().of(Tags.Items.SHEARS)); + + public BlockLootTables() { + super(Set.of(), FeatureFlags.REGISTRY.allFlags()); + } + + @Override + protected void generate() { + registerEmpty(TFBlocks.EXPERIMENT_115.get()); + registerEmpty(TFBlocks.SLIDER.get()); + registerEmpty(TFBlocks.INFESTED_TOWERWOOD.get()); + dropSelf(TFBlocks.TOWERWOOD.get()); + dropSelf(TFBlocks.ENCASED_TOWERWOOD.get()); + dropSelf(TFBlocks.CRACKED_TOWERWOOD.get()); + dropSelf(TFBlocks.MOSSY_TOWERWOOD.get()); + registerEmpty(TFBlocks.ANTIBUILDER.get()); + dropSelf(TFBlocks.CARMINITE_BUILDER.get()); + dropSelf(TFBlocks.GHAST_TRAP.get()); + dropSelf(TFBlocks.CARMINITE_REACTOR.get()); + dropSelf(TFBlocks.REAPPEARING_BLOCK.get()); + dropSelf(TFBlocks.VANISHING_BLOCK.get()); + dropSelf(TFBlocks.LOCKED_VANISHING_BLOCK.get()); + dropSelf(TFBlocks.FIREFLY.get()); + dropSelf(TFBlocks.CICADA.get()); + dropSelf(TFBlocks.MOONWORM.get()); + dropSelf(TFBlocks.TROPHY_PEDESTAL.get()); + dropSelf(TFBlocks.AURORA_BLOCK.get()); + dropSelf(TFBlocks.AURORA_PILLAR.get()); + add(TFBlocks.AURORA_SLAB.get(), createSlabItemTable(TFBlocks.AURORA_SLAB.get())); + dropWhenSilkTouch(TFBlocks.AURORALIZED_GLASS.get()); + dropSelf(TFBlocks.UNDERBRICK.get()); + dropSelf(TFBlocks.CRACKED_UNDERBRICK.get()); + dropSelf(TFBlocks.MOSSY_UNDERBRICK.get()); + dropSelf(TFBlocks.UNDERBRICK_FLOOR.get()); + dropSelf(TFBlocks.THORN_ROSE.get()); + add(TFBlocks.THORN_LEAVES.get(), silkAndStick(TFBlocks.THORN_LEAVES.get(), Items.STICK, RARE_SAPLING_DROP_RATES)); + add(TFBlocks.BEANSTALK_LEAVES.get(), silkAndStick(TFBlocks.BEANSTALK_LEAVES.get(), TFItems.MAGIC_BEANS.get(), RARE_SAPLING_DROP_RATES)); + dropSelf(TFBlocks.DEADROCK.get()); + dropSelf(TFBlocks.CRACKED_DEADROCK.get()); + dropSelf(TFBlocks.WEATHERED_DEADROCK.get()); + dropSelf(TFBlocks.TROLLSTEINN.get()); + dropWhenSilkTouch(TFBlocks.WISPY_CLOUD.get()); + dropSelf(TFBlocks.FLUFFY_CLOUD.get()); + dropSelf(TFBlocks.GIANT_COBBLESTONE.get()); + dropSelf(TFBlocks.GIANT_LOG.get()); + dropSelf(TFBlocks.GIANT_LEAVES.get()); + dropSelf(TFBlocks.GIANT_OBSIDIAN.get()); + add(TFBlocks.UBEROUS_SOIL.get(), createSingleItemTable(Blocks.DIRT)); + dropSelf(TFBlocks.HUGE_STALK.get()); + add(TFBlocks.HUGE_MUSHGLOOM.get(), createMushroomBlockDrop(TFBlocks.HUGE_MUSHGLOOM.get(), TFBlocks.MUSHGLOOM.get())); + add(TFBlocks.HUGE_MUSHGLOOM_STEM.get(), createMushroomBlockDrop(TFBlocks.HUGE_MUSHGLOOM_STEM.get(), TFBlocks.MUSHGLOOM.get())); + add(TFBlocks.TROLLVIDR.get(), createShearsOnlyDrop(TFBlocks.TROLLVIDR.get())); + add(TFBlocks.UNRIPE_TROLLBER.get(), createShearsOnlyDrop(TFBlocks.UNRIPE_TROLLBER.get())); + add(TFBlocks.TROLLBER.get(), createShearsDispatchTable(TFBlocks.TROLLBER.get(), LootItem.lootTableItem(TFItems.TORCHBERRIES.get()).apply(SetItemCountFunction.setCount(UniformGenerator.between(4.0F, 8.0F))).apply(ApplyBonusCount.addOreBonusCount(Enchantments.BLOCK_FORTUNE)))); + dropSelf(TFBlocks.HUGE_LILY_PAD.get()); + dropSelf(TFBlocks.HUGE_WATER_LILY.get()); + dropSelf(TFBlocks.CASTLE_BRICK.get()); + dropSelf(TFBlocks.WORN_CASTLE_BRICK.get()); + dropSelf(TFBlocks.CRACKED_CASTLE_BRICK.get()); + dropSelf(TFBlocks.MOSSY_CASTLE_BRICK.get()); + dropSelf(TFBlocks.THICK_CASTLE_BRICK.get()); + dropSelf(TFBlocks.CASTLE_ROOF_TILE.get()); + dropSelf(TFBlocks.ENCASED_CASTLE_BRICK_PILLAR.get()); + dropSelf(TFBlocks.ENCASED_CASTLE_BRICK_TILE.get()); + dropSelf(TFBlocks.BOLD_CASTLE_BRICK_PILLAR.get()); + dropSelf(TFBlocks.BOLD_CASTLE_BRICK_TILE.get()); + dropSelf(TFBlocks.CASTLE_BRICK_STAIRS.get()); + dropSelf(TFBlocks.WORN_CASTLE_BRICK_STAIRS.get()); + dropSelf(TFBlocks.CRACKED_CASTLE_BRICK_STAIRS.get()); + dropSelf(TFBlocks.MOSSY_CASTLE_BRICK_STAIRS.get()); + dropSelf(TFBlocks.ENCASED_CASTLE_BRICK_STAIRS.get()); + dropSelf(TFBlocks.BOLD_CASTLE_BRICK_STAIRS.get()); + dropSelf(TFBlocks.VIOLET_CASTLE_RUNE_BRICK.get()); + dropSelf(TFBlocks.YELLOW_CASTLE_RUNE_BRICK.get()); + dropSelf(TFBlocks.PINK_CASTLE_RUNE_BRICK.get()); + dropSelf(TFBlocks.BLUE_CASTLE_RUNE_BRICK.get()); + dropSelf(TFBlocks.CINDER_FURNACE.get()); + dropSelf(TFBlocks.CINDER_LOG.get()); + dropSelf(TFBlocks.CINDER_WOOD.get()); + dropSelf(TFBlocks.VIOLET_CASTLE_DOOR.get()); + dropSelf(TFBlocks.YELLOW_CASTLE_DOOR.get()); + dropSelf(TFBlocks.PINK_CASTLE_DOOR.get()); + dropSelf(TFBlocks.BLUE_CASTLE_DOOR.get()); + dropSelf(TFBlocks.TWILIGHT_PORTAL_MINIATURE_STRUCTURE.get()); + dropSelf(TFBlocks.NAGA_COURTYARD_MINIATURE_STRUCTURE.get()); + dropSelf(TFBlocks.LICH_TOWER_MINIATURE_STRUCTURE.get()); + dropSelf(TFBlocks.KNIGHTMETAL_BLOCK.get()); + dropSelf(TFBlocks.IRONWOOD_BLOCK.get()); + dropSelf(TFBlocks.FIERY_BLOCK.get()); + dropSelf(TFBlocks.STEELEAF_BLOCK.get()); + dropSelf(TFBlocks.ARCTIC_FUR_BLOCK.get()); + dropSelf(TFBlocks.CARMINITE_BLOCK.get()); + dropSelf(TFBlocks.MAZESTONE.get()); + dropSelf(TFBlocks.MAZESTONE_BRICK.get()); + dropSelf(TFBlocks.CUT_MAZESTONE.get()); + dropSelf(TFBlocks.DECORATIVE_MAZESTONE.get()); + dropSelf(TFBlocks.CRACKED_MAZESTONE.get()); + dropSelf(TFBlocks.MOSSY_MAZESTONE.get()); + dropSelf(TFBlocks.MAZESTONE_MOSAIC.get()); + dropSelf(TFBlocks.MAZESTONE_BORDER.get()); + add(TFBlocks.RED_THREAD.get(), redThread()); + dropWhenSilkTouch(TFBlocks.HEDGE.get()); + add(TFBlocks.ROOT_BLOCK.get(), createSingleItemTableWithSilkTouch(TFBlocks.ROOT_BLOCK.get(), Items.STICK, UniformGenerator.between(3, 5))); + add(TFBlocks.LIVEROOT_BLOCK.get(), createSilkTouchDispatchTable(TFBlocks.LIVEROOT_BLOCK.get(), applyExplosionCondition(TFBlocks.LIVEROOT_BLOCK.get(), LootItem.lootTableItem(TFItems.LIVEROOT.get()).apply(ApplyBonusCount.addOreBonusCount(Enchantments.BLOCK_FORTUNE))))); + add(TFBlocks.MANGROVE_ROOT.get(), createSingleItemTableWithSilkTouch(TFBlocks.MANGROVE_ROOT.get(), Items.STICK, UniformGenerator.between(3, 5))); + dropSelf(TFBlocks.UNCRAFTING_TABLE.get()); + dropSelf(TFBlocks.FIREFLY_JAR.get()); + add(TFBlocks.FIREFLY_SPAWNER.get(), particleSpawner()); + dropSelf(TFBlocks.CICADA_JAR.get()); + add(TFBlocks.MOSS_PATCH.get(), createShearsOnlyDrop(TFBlocks.MOSS_PATCH.get())); + add(TFBlocks.MAYAPPLE.get(), createShearsOnlyDrop(TFBlocks.MAYAPPLE.get())); + add(TFBlocks.CLOVER_PATCH.get(), createShearsOnlyDrop(TFBlocks.CLOVER_PATCH.get())); + add(TFBlocks.FIDDLEHEAD.get(), createShearsOnlyDrop(TFBlocks.FIDDLEHEAD.get())); + dropSelf(TFBlocks.MUSHGLOOM.get()); + add(TFBlocks.TORCHBERRY_PLANT.get(), torchberryPlant(TFBlocks.TORCHBERRY_PLANT.get())); + add(TFBlocks.ROOT_STRAND.get(), block -> createShearsDispatchTable(block, applyExplosionDecay(block, LootItem.lootTableItem(Items.STICK).apply(SetItemCountFunction.setCount(UniformGenerator.between(1.0F, 3.0F)))))); + add(TFBlocks.FALLEN_LEAVES.get(), this.fallenLeaves()); + dropSelf(TFBlocks.SMOKER.get()); + dropSelf(TFBlocks.ENCASED_SMOKER.get()); + dropSelf(TFBlocks.FIRE_JET.get()); + dropSelf(TFBlocks.ENCASED_FIRE_JET.get()); + dropSelf(TFBlocks.NAGASTONE_HEAD.get()); + dropSelf(TFBlocks.NAGASTONE.get()); + dropSelf(TFBlocks.SPIRAL_BRICKS.get()); + dropSelf(TFBlocks.NAGASTONE_PILLAR.get()); + dropSelf(TFBlocks.MOSSY_NAGASTONE_PILLAR.get()); + dropSelf(TFBlocks.CRACKED_NAGASTONE_PILLAR.get()); + dropSelf(TFBlocks.ETCHED_NAGASTONE.get()); + dropSelf(TFBlocks.MOSSY_ETCHED_NAGASTONE.get()); + dropSelf(TFBlocks.CRACKED_ETCHED_NAGASTONE.get()); + dropSelf(TFBlocks.NAGASTONE_STAIRS_LEFT.get()); + dropSelf(TFBlocks.NAGASTONE_STAIRS_RIGHT.get()); + dropSelf(TFBlocks.MOSSY_NAGASTONE_STAIRS_LEFT.get()); + dropSelf(TFBlocks.MOSSY_NAGASTONE_STAIRS_RIGHT.get()); + dropSelf(TFBlocks.CRACKED_NAGASTONE_STAIRS_LEFT.get()); + dropSelf(TFBlocks.CRACKED_NAGASTONE_STAIRS_RIGHT.get()); + add(TFBlocks.NAGA_TROPHY.get(), createSingleItemTable(TFBlocks.NAGA_TROPHY.get().asItem())); + add(TFBlocks.NAGA_WALL_TROPHY.get(), createSingleItemTable(TFBlocks.NAGA_TROPHY.get().asItem())); + add(TFBlocks.LICH_TROPHY.get(), createSingleItemTable(TFBlocks.LICH_TROPHY.get().asItem())); + add(TFBlocks.LICH_WALL_TROPHY.get(), createSingleItemTable(TFBlocks.LICH_TROPHY.get().asItem())); + add(TFBlocks.MINOSHROOM_TROPHY.get(), createSingleItemTable(TFBlocks.MINOSHROOM_TROPHY.get().asItem())); + add(TFBlocks.MINOSHROOM_WALL_TROPHY.get(), createSingleItemTable(TFBlocks.MINOSHROOM_TROPHY.get().asItem())); + add(TFBlocks.HYDRA_TROPHY.get(), createSingleItemTable(TFBlocks.HYDRA_TROPHY.get().asItem())); + add(TFBlocks.HYDRA_WALL_TROPHY.get(), createSingleItemTable(TFBlocks.HYDRA_TROPHY.get().asItem())); + add(TFBlocks.KNIGHT_PHANTOM_TROPHY.get(), createSingleItemTable(TFBlocks.KNIGHT_PHANTOM_TROPHY.get().asItem())); + add(TFBlocks.KNIGHT_PHANTOM_WALL_TROPHY.get(), createSingleItemTable(TFBlocks.KNIGHT_PHANTOM_TROPHY.get().asItem())); + add(TFBlocks.UR_GHAST_TROPHY.get(), createSingleItemTable(TFBlocks.UR_GHAST_TROPHY.get().asItem())); + add(TFBlocks.UR_GHAST_WALL_TROPHY.get(), createSingleItemTable(TFBlocks.UR_GHAST_TROPHY.get().asItem())); + add(TFBlocks.ALPHA_YETI_TROPHY.get(), createSingleItemTable(TFBlocks.ALPHA_YETI_TROPHY.get().asItem())); + add(TFBlocks.ALPHA_YETI_WALL_TROPHY.get(), createSingleItemTable(TFBlocks.ALPHA_YETI_TROPHY.get().asItem())); + add(TFBlocks.SNOW_QUEEN_TROPHY.get(), createSingleItemTable(TFBlocks.SNOW_QUEEN_TROPHY.get().asItem())); + add(TFBlocks.SNOW_QUEEN_WALL_TROPHY.get(), createSingleItemTable(TFBlocks.SNOW_QUEEN_TROPHY.get().asItem())); + add(TFBlocks.QUEST_RAM_TROPHY.get(), createSingleItemTable(TFBlocks.QUEST_RAM_TROPHY.get().asItem())); + add(TFBlocks.QUEST_RAM_WALL_TROPHY.get(), createSingleItemTable(TFBlocks.QUEST_RAM_TROPHY.get().asItem())); + + add(TFBlocks.ZOMBIE_SKULL_CANDLE.get(), createSingleItemTable(Blocks.ZOMBIE_HEAD)); + add(TFBlocks.ZOMBIE_WALL_SKULL_CANDLE.get(), createSingleItemTable(Blocks.ZOMBIE_HEAD)); + add(TFBlocks.SKELETON_SKULL_CANDLE.get(), createSingleItemTable(Blocks.SKELETON_SKULL)); + add(TFBlocks.SKELETON_WALL_SKULL_CANDLE.get(), createSingleItemTable(Blocks.SKELETON_SKULL)); + add(TFBlocks.WITHER_SKELE_SKULL_CANDLE.get(), createSingleItemTable(Blocks.WITHER_SKELETON_SKULL)); + add(TFBlocks.WITHER_SKELE_WALL_SKULL_CANDLE.get(), createSingleItemTable(Blocks.WITHER_SKELETON_SKULL)); + add(TFBlocks.CREEPER_SKULL_CANDLE.get(), createSingleItemTable(Blocks.CREEPER_HEAD)); + add(TFBlocks.CREEPER_WALL_SKULL_CANDLE.get(), createSingleItemTable(Blocks.CREEPER_HEAD)); + add(TFBlocks.PLAYER_SKULL_CANDLE.get(), createSingleItemTable(Blocks.PLAYER_HEAD).apply(CopyNbtFunction.copyData(ContextNbtProvider.BLOCK_ENTITY).copy("SkullOwner", "SkullOwner"))); + add(TFBlocks.PLAYER_WALL_SKULL_CANDLE.get(), createSingleItemTable(Blocks.PLAYER_HEAD).apply(CopyNbtFunction.copyData(ContextNbtProvider.BLOCK_ENTITY).copy("SkullOwner", "SkullOwner"))); + + dropSelf(TFBlocks.IRON_LADDER.get()); + dropSelf(TFBlocks.TWISTED_STONE.get()); + dropSelf(TFBlocks.TWISTED_STONE_PILLAR.get()); + dropSelf(TFBlocks.BOLD_STONE_PILLAR.get()); + registerEmpty(TFBlocks.DEATH_TOME_SPAWNER.get()); + dropWhenSilkTouch(TFBlocks.EMPTY_CANOPY_BOOKSHELF.get()); + //registerDropSelfLootTable(TFBlocks.LAPIS_BLOCK.get()); + add(TFBlocks.KEEPSAKE_CASKET.get(), casketInfo(TFBlocks.KEEPSAKE_CASKET.get())); + dropSelf(TFBlocks.CANDELABRA.get()); + dropPottedContents(TFBlocks.POTTED_TWILIGHT_OAK_SAPLING.get()); + dropPottedContents(TFBlocks.POTTED_CANOPY_SAPLING.get()); + dropPottedContents(TFBlocks.POTTED_MANGROVE_SAPLING.get()); + dropPottedContents(TFBlocks.POTTED_DARKWOOD_SAPLING.get()); + dropPottedContents(TFBlocks.POTTED_HOLLOW_OAK_SAPLING.get()); + dropPottedContents(TFBlocks.POTTED_RAINBOW_OAK_SAPLING.get()); + dropPottedContents(TFBlocks.POTTED_TIME_SAPLING.get()); + dropPottedContents(TFBlocks.POTTED_TRANSFORMATION_SAPLING.get()); + dropPottedContents(TFBlocks.POTTED_MINING_SAPLING.get()); + dropPottedContents(TFBlocks.POTTED_SORTING_SAPLING.get()); + dropPottedContents(TFBlocks.POTTED_MAYAPPLE.get()); + dropPottedContents(TFBlocks.POTTED_FIDDLEHEAD.get()); + dropPottedContents(TFBlocks.POTTED_MUSHGLOOM.get()); + add(TFBlocks.POTTED_THORN.get(), createSingleItemTable(Items.FLOWER_POT)); + add(TFBlocks.POTTED_GREEN_THORN.get(), createSingleItemTable(Items.FLOWER_POT)); + add(TFBlocks.POTTED_DEAD_THORN.get(), createSingleItemTable(Items.FLOWER_POT)); + + dropSelf(TFBlocks.OAK_BANISTER.get()); + dropSelf(TFBlocks.SPRUCE_BANISTER.get()); + dropSelf(TFBlocks.BIRCH_BANISTER.get()); + dropSelf(TFBlocks.JUNGLE_BANISTER.get()); + dropSelf(TFBlocks.ACACIA_BANISTER.get()); + dropSelf(TFBlocks.DARK_OAK_BANISTER.get()); + dropSelf(TFBlocks.CRIMSON_BANISTER.get()); + dropSelf(TFBlocks.WARPED_BANISTER.get()); + dropSelf(TFBlocks.VANGROVE_BANISTER.get()); + + add(TFBlocks.HOLLOW_OAK_LOG_HORIZONTAL.get(), hollowLog(TFBlocks.HOLLOW_OAK_LOG_HORIZONTAL.get())); + add(TFBlocks.HOLLOW_SPRUCE_LOG_HORIZONTAL.get(), hollowLog(TFBlocks.HOLLOW_SPRUCE_LOG_HORIZONTAL.get())); + add(TFBlocks.HOLLOW_BIRCH_LOG_HORIZONTAL.get(), hollowLog(TFBlocks.HOLLOW_BIRCH_LOG_HORIZONTAL.get())); + add(TFBlocks.HOLLOW_JUNGLE_LOG_HORIZONTAL.get(), hollowLog(TFBlocks.HOLLOW_JUNGLE_LOG_HORIZONTAL.get())); + add(TFBlocks.HOLLOW_ACACIA_LOG_HORIZONTAL.get(), hollowLog(TFBlocks.HOLLOW_ACACIA_LOG_HORIZONTAL.get())); + add(TFBlocks.HOLLOW_DARK_OAK_LOG_HORIZONTAL.get(), hollowLog(TFBlocks.HOLLOW_DARK_OAK_LOG_HORIZONTAL.get())); + add(TFBlocks.HOLLOW_CRIMSON_STEM_HORIZONTAL.get(), hollowLog(TFBlocks.HOLLOW_CRIMSON_STEM_HORIZONTAL.get())); + add(TFBlocks.HOLLOW_WARPED_STEM_HORIZONTAL.get(), hollowLog(TFBlocks.HOLLOW_WARPED_STEM_HORIZONTAL.get())); + add(TFBlocks.HOLLOW_VANGROVE_LOG_HORIZONTAL.get(), hollowLog(TFBlocks.HOLLOW_VANGROVE_LOG_HORIZONTAL.get())); + add(TFBlocks.HOLLOW_TWILIGHT_OAK_LOG_HORIZONTAL.get(), hollowLog(TFBlocks.HOLLOW_TWILIGHT_OAK_LOG_HORIZONTAL.get())); + add(TFBlocks.HOLLOW_CANOPY_LOG_HORIZONTAL.get(), hollowLog(TFBlocks.HOLLOW_CANOPY_LOG_HORIZONTAL.get())); + add(TFBlocks.HOLLOW_MANGROVE_LOG_HORIZONTAL.get(), hollowLog(TFBlocks.HOLLOW_MANGROVE_LOG_HORIZONTAL.get())); + add(TFBlocks.HOLLOW_DARK_LOG_HORIZONTAL.get(), hollowLog(TFBlocks.HOLLOW_DARK_LOG_HORIZONTAL.get())); + add(TFBlocks.HOLLOW_TIME_LOG_HORIZONTAL.get(), hollowLog(TFBlocks.HOLLOW_TIME_LOG_HORIZONTAL.get())); + add(TFBlocks.HOLLOW_TRANSFORMATION_LOG_HORIZONTAL.get(), hollowLog(TFBlocks.HOLLOW_TRANSFORMATION_LOG_HORIZONTAL.get())); + add(TFBlocks.HOLLOW_MINING_LOG_HORIZONTAL.get(), hollowLog(TFBlocks.HOLLOW_MINING_LOG_HORIZONTAL.get())); + add(TFBlocks.HOLLOW_SORTING_LOG_HORIZONTAL.get(), hollowLog(TFBlocks.HOLLOW_SORTING_LOG_HORIZONTAL.get())); + + add(TFBlocks.HOLLOW_OAK_LOG_VERTICAL.get(), verticalHollowLog(TFBlocks.HOLLOW_OAK_LOG_VERTICAL.get())); + add(TFBlocks.HOLLOW_SPRUCE_LOG_VERTICAL.get(), verticalHollowLog(TFBlocks.HOLLOW_SPRUCE_LOG_VERTICAL.get())); + add(TFBlocks.HOLLOW_BIRCH_LOG_VERTICAL.get(), verticalHollowLog(TFBlocks.HOLLOW_BIRCH_LOG_VERTICAL.get())); + add(TFBlocks.HOLLOW_JUNGLE_LOG_VERTICAL.get(), verticalHollowLog(TFBlocks.HOLLOW_JUNGLE_LOG_VERTICAL.get())); + add(TFBlocks.HOLLOW_ACACIA_LOG_VERTICAL.get(), verticalHollowLog(TFBlocks.HOLLOW_ACACIA_LOG_VERTICAL.get())); + add(TFBlocks.HOLLOW_DARK_OAK_LOG_VERTICAL.get(), verticalHollowLog(TFBlocks.HOLLOW_DARK_OAK_LOG_VERTICAL.get())); + add(TFBlocks.HOLLOW_CRIMSON_STEM_VERTICAL.get(), verticalHollowLog(TFBlocks.HOLLOW_CRIMSON_STEM_VERTICAL.get())); + add(TFBlocks.HOLLOW_WARPED_STEM_VERTICAL.get(), verticalHollowLog(TFBlocks.HOLLOW_WARPED_STEM_VERTICAL.get())); + add(TFBlocks.HOLLOW_VANGROVE_LOG_VERTICAL.get(), verticalHollowLog(TFBlocks.HOLLOW_VANGROVE_LOG_VERTICAL.get())); + add(TFBlocks.HOLLOW_TWILIGHT_OAK_LOG_VERTICAL.get(), verticalHollowLog(TFBlocks.HOLLOW_TWILIGHT_OAK_LOG_VERTICAL.get())); + add(TFBlocks.HOLLOW_CANOPY_LOG_VERTICAL.get(), verticalHollowLog(TFBlocks.HOLLOW_CANOPY_LOG_VERTICAL.get())); + add(TFBlocks.HOLLOW_MANGROVE_LOG_VERTICAL.get(), verticalHollowLog(TFBlocks.HOLLOW_MANGROVE_LOG_VERTICAL.get())); + add(TFBlocks.HOLLOW_DARK_LOG_VERTICAL.get(), verticalHollowLog(TFBlocks.HOLLOW_DARK_LOG_VERTICAL.get())); + add(TFBlocks.HOLLOW_TIME_LOG_VERTICAL.get(), verticalHollowLog(TFBlocks.HOLLOW_TIME_LOG_VERTICAL.get())); + add(TFBlocks.HOLLOW_TRANSFORMATION_LOG_VERTICAL.get(), verticalHollowLog(TFBlocks.HOLLOW_TRANSFORMATION_LOG_VERTICAL.get())); + add(TFBlocks.HOLLOW_MINING_LOG_VERTICAL.get(), verticalHollowLog(TFBlocks.HOLLOW_MINING_LOG_VERTICAL.get())); + add(TFBlocks.HOLLOW_SORTING_LOG_VERTICAL.get(), verticalHollowLog(TFBlocks.HOLLOW_SORTING_LOG_VERTICAL.get())); + + add(TFBlocks.HOLLOW_OAK_LOG_CLIMBABLE.get(), hollowLog(TFBlocks.HOLLOW_OAK_LOG_CLIMBABLE.get())); + add(TFBlocks.HOLLOW_SPRUCE_LOG_CLIMBABLE.get(), hollowLog(TFBlocks.HOLLOW_SPRUCE_LOG_CLIMBABLE.get())); + add(TFBlocks.HOLLOW_BIRCH_LOG_CLIMBABLE.get(), hollowLog(TFBlocks.HOLLOW_BIRCH_LOG_CLIMBABLE.get())); + add(TFBlocks.HOLLOW_JUNGLE_LOG_CLIMBABLE.get(), hollowLog(TFBlocks.HOLLOW_JUNGLE_LOG_CLIMBABLE.get())); + add(TFBlocks.HOLLOW_ACACIA_LOG_CLIMBABLE.get(), hollowLog(TFBlocks.HOLLOW_ACACIA_LOG_CLIMBABLE.get())); + add(TFBlocks.HOLLOW_DARK_OAK_LOG_CLIMBABLE.get(), hollowLog(TFBlocks.HOLLOW_DARK_OAK_LOG_CLIMBABLE.get())); + add(TFBlocks.HOLLOW_CRIMSON_STEM_CLIMBABLE.get(), hollowLog(TFBlocks.HOLLOW_CRIMSON_STEM_CLIMBABLE.get())); + add(TFBlocks.HOLLOW_WARPED_STEM_CLIMBABLE.get(), hollowLog(TFBlocks.HOLLOW_WARPED_STEM_CLIMBABLE.get())); + add(TFBlocks.HOLLOW_VANGROVE_LOG_CLIMBABLE.get(), hollowLog(TFBlocks.HOLLOW_VANGROVE_LOG_CLIMBABLE.get())); + add(TFBlocks.HOLLOW_TWILIGHT_OAK_LOG_CLIMBABLE.get(), hollowLog(TFBlocks.HOLLOW_TWILIGHT_OAK_LOG_CLIMBABLE.get())); + add(TFBlocks.HOLLOW_CANOPY_LOG_CLIMBABLE.get(), hollowLog(TFBlocks.HOLLOW_CANOPY_LOG_CLIMBABLE.get())); + add(TFBlocks.HOLLOW_MANGROVE_LOG_CLIMBABLE.get(), hollowLog(TFBlocks.HOLLOW_MANGROVE_LOG_CLIMBABLE.get())); + add(TFBlocks.HOLLOW_DARK_LOG_CLIMBABLE.get(), hollowLog(TFBlocks.HOLLOW_DARK_LOG_CLIMBABLE.get())); + add(TFBlocks.HOLLOW_TIME_LOG_CLIMBABLE.get(), hollowLog(TFBlocks.HOLLOW_TIME_LOG_CLIMBABLE.get())); + add(TFBlocks.HOLLOW_TRANSFORMATION_LOG_CLIMBABLE.get(), hollowLog(TFBlocks.HOLLOW_TRANSFORMATION_LOG_CLIMBABLE.get())); + add(TFBlocks.HOLLOW_MINING_LOG_CLIMBABLE.get(), hollowLog(TFBlocks.HOLLOW_MINING_LOG_CLIMBABLE.get())); + add(TFBlocks.HOLLOW_SORTING_LOG_CLIMBABLE.get(), hollowLog(TFBlocks.HOLLOW_SORTING_LOG_CLIMBABLE.get())); + + + dropSelf(TFBlocks.TWILIGHT_OAK_LOG.get()); + dropSelf(TFBlocks.STRIPPED_TWILIGHT_OAK_LOG.get()); + dropSelf(TFBlocks.TWILIGHT_OAK_WOOD.get()); + dropSelf(TFBlocks.STRIPPED_TWILIGHT_OAK_WOOD.get()); + dropSelf(TFBlocks.TWILIGHT_OAK_SAPLING.get()); + add(TFBlocks.TWILIGHT_OAK_LEAVES.get(), silkAndStick(TFBlocks.TWILIGHT_OAK_LEAVES.get(), TFBlocks.TWILIGHT_OAK_SAPLING.get(), DEFAULT_SAPLING_DROP_RATES)); + dropSelf(TFBlocks.RAINBOW_OAK_SAPLING.get()); + add(TFBlocks.RAINBOW_OAK_LEAVES.get(), silkAndStick(TFBlocks.RAINBOW_OAK_LEAVES.get(), TFBlocks.RAINBOW_OAK_SAPLING.get(), RARE_SAPLING_DROP_RATES)); + dropSelf(TFBlocks.HOLLOW_OAK_SAPLING.get()); + dropSelf(TFBlocks.TWILIGHT_OAK_PLANKS.get()); + dropSelf(TFBlocks.TWILIGHT_OAK_STAIRS.get()); + add(TFBlocks.TWILIGHT_OAK_SLAB.get(), createSlabItemTable(TFBlocks.TWILIGHT_OAK_SLAB.get())); + dropSelf(TFBlocks.TWILIGHT_OAK_BUTTON.get()); + dropSelf(TFBlocks.TWILIGHT_OAK_FENCE.get()); + dropSelf(TFBlocks.TWILIGHT_OAK_GATE.get()); + dropSelf(TFBlocks.TWILIGHT_OAK_PLATE.get()); + add(TFBlocks.TWILIGHT_OAK_DOOR.get(), createSinglePropConditionTable(TFBlocks.TWILIGHT_OAK_DOOR.get(), DoorBlock.HALF, DoubleBlockHalf.LOWER)); + dropSelf(TFBlocks.TWILIGHT_OAK_TRAPDOOR.get()); + add(TFBlocks.TWILIGHT_OAK_SIGN.get(), createSingleItemTable(TFBlocks.TWILIGHT_OAK_SIGN.get().asItem())); + add(TFBlocks.TWILIGHT_WALL_SIGN.get(), createSingleItemTable(TFBlocks.TWILIGHT_OAK_SIGN.get().asItem())); + dropSelf(TFBlocks.TWILIGHT_OAK_BANISTER.get()); + dropSelf(TFBlocks.TWILIGHT_OAK_CHEST.get()); + + dropSelf(TFBlocks.CANOPY_LOG.get()); + dropSelf(TFBlocks.STRIPPED_CANOPY_LOG.get()); + dropSelf(TFBlocks.CANOPY_WOOD.get()); + dropSelf(TFBlocks.STRIPPED_CANOPY_WOOD.get()); + dropSelf(TFBlocks.CANOPY_SAPLING.get()); + add(TFBlocks.CANOPY_LEAVES.get(), silkAndStick(TFBlocks.CANOPY_LEAVES.get(), TFBlocks.CANOPY_SAPLING.get(), DEFAULT_SAPLING_DROP_RATES)); + dropSelf(TFBlocks.CANOPY_PLANKS.get()); + dropSelf(TFBlocks.CANOPY_STAIRS.get()); + add(TFBlocks.CANOPY_SLAB.get(), createSlabItemTable(TFBlocks.CANOPY_SLAB.get())); + dropSelf(TFBlocks.CANOPY_BUTTON.get()); + dropSelf(TFBlocks.CANOPY_FENCE.get()); + dropSelf(TFBlocks.CANOPY_GATE.get()); + dropSelf(TFBlocks.CANOPY_PLATE.get()); + add(TFBlocks.CANOPY_DOOR.get(), createSinglePropConditionTable(TFBlocks.CANOPY_DOOR.get(), DoorBlock.HALF, DoubleBlockHalf.LOWER)); + dropSelf(TFBlocks.CANOPY_TRAPDOOR.get()); + add(TFBlocks.CANOPY_SIGN.get(), createSingleItemTable(TFBlocks.CANOPY_SIGN.get().asItem())); + add(TFBlocks.CANOPY_WALL_SIGN.get(), createSingleItemTable(TFBlocks.CANOPY_SIGN.get().asItem())); + add(TFBlocks.CANOPY_BOOKSHELF.get(), createSingleItemTableWithSilkTouch(TFBlocks.CANOPY_BOOKSHELF.get(), Items.BOOK, ConstantValue.exactly(2.0F))); + dropSelf(TFBlocks.CANOPY_BANISTER.get()); + dropSelf(TFBlocks.CANOPY_CHEST.get()); + + dropSelf(TFBlocks.MANGROVE_LOG.get()); + dropSelf(TFBlocks.STRIPPED_MANGROVE_LOG.get()); + dropSelf(TFBlocks.MANGROVE_WOOD.get()); + dropSelf(TFBlocks.STRIPPED_MANGROVE_WOOD.get()); + dropSelf(TFBlocks.MANGROVE_SAPLING.get()); + add(TFBlocks.MANGROVE_LEAVES.get(), silkAndStick(TFBlocks.MANGROVE_LEAVES.get(), TFBlocks.MANGROVE_SAPLING.get(), DEFAULT_SAPLING_DROP_RATES)); + dropSelf(TFBlocks.MANGROVE_PLANKS.get()); + dropSelf(TFBlocks.MANGROVE_STAIRS.get()); + add(TFBlocks.MANGROVE_SLAB.get(), createSlabItemTable(TFBlocks.MANGROVE_SLAB.get())); + dropSelf(TFBlocks.MANGROVE_BUTTON.get()); + dropSelf(TFBlocks.MANGROVE_FENCE.get()); + dropSelf(TFBlocks.MANGROVE_GATE.get()); + dropSelf(TFBlocks.MANGROVE_PLATE.get()); + add(TFBlocks.MANGROVE_DOOR.get(), createSinglePropConditionTable(TFBlocks.MANGROVE_DOOR.get(), DoorBlock.HALF, DoubleBlockHalf.LOWER)); + dropSelf(TFBlocks.MANGROVE_TRAPDOOR.get()); + add(TFBlocks.MANGROVE_SIGN.get(), createSingleItemTable(TFBlocks.MANGROVE_SIGN.get().asItem())); + add(TFBlocks.MANGROVE_WALL_SIGN.get(), createSingleItemTable(TFBlocks.MANGROVE_SIGN.get().asItem())); + dropSelf(TFBlocks.MANGROVE_BANISTER.get()); + dropSelf(TFBlocks.MANGROVE_CHEST.get()); + + dropSelf(TFBlocks.DARK_LOG.get()); + dropSelf(TFBlocks.STRIPPED_DARK_LOG.get()); + dropSelf(TFBlocks.DARK_WOOD.get()); + dropSelf(TFBlocks.STRIPPED_DARK_WOOD.get()); + dropSelf(TFBlocks.DARKWOOD_SAPLING.get()); + add(TFBlocks.DARK_LEAVES.get(), silkAndStick(TFBlocks.DARK_LEAVES.get(), TFBlocks.DARKWOOD_SAPLING.get(), RARE_SAPLING_DROP_RATES)); + add(TFBlocks.HARDENED_DARK_LEAVES.get(), silkAndStick(TFBlocks.DARK_LEAVES.get(), TFBlocks.DARKWOOD_SAPLING.get(), RARE_SAPLING_DROP_RATES)); + dropSelf(TFBlocks.DARK_PLANKS.get()); + dropSelf(TFBlocks.DARK_STAIRS.get()); + add(TFBlocks.DARK_SLAB.get(), createSlabItemTable(TFBlocks.DARK_SLAB.get())); + dropSelf(TFBlocks.DARK_BUTTON.get()); + dropSelf(TFBlocks.DARK_FENCE.get()); + dropSelf(TFBlocks.DARK_GATE.get()); + dropSelf(TFBlocks.DARK_PLATE.get()); + add(TFBlocks.DARK_DOOR.get(), createSinglePropConditionTable(TFBlocks.DARK_DOOR.get(), DoorBlock.HALF, DoubleBlockHalf.LOWER)); + dropSelf(TFBlocks.DARK_TRAPDOOR.get()); + add(TFBlocks.DARK_SIGN.get(), createSingleItemTable(TFBlocks.DARK_SIGN.get().asItem())); + add(TFBlocks.DARK_WALL_SIGN.get(), createSingleItemTable(TFBlocks.DARK_SIGN.get().asItem())); + dropSelf(TFBlocks.DARK_BANISTER.get()); + dropSelf(TFBlocks.DARK_CHEST.get()); + + dropSelf(TFBlocks.TIME_LOG.get()); + dropSelf(TFBlocks.STRIPPED_TIME_LOG.get()); + dropSelf(TFBlocks.TIME_WOOD.get()); + dropSelf(TFBlocks.STRIPPED_TIME_WOOD.get()); + dropOther(TFBlocks.TIME_LOG_CORE.get(), TFBlocks.TIME_LOG.get()); + dropSelf(TFBlocks.TIME_SAPLING.get()); + registerLeavesNoSapling(TFBlocks.TIME_LEAVES.get()); + dropSelf(TFBlocks.TIME_PLANKS.get()); + dropSelf(TFBlocks.TIME_STAIRS.get()); + add(TFBlocks.TIME_SLAB.get(), createSlabItemTable(TFBlocks.TIME_SLAB.get())); + dropSelf(TFBlocks.TIME_BUTTON.get()); + dropSelf(TFBlocks.TIME_FENCE.get()); + dropSelf(TFBlocks.TIME_GATE.get()); + dropSelf(TFBlocks.TIME_PLATE.get()); + add(TFBlocks.TIME_DOOR.get(), createSinglePropConditionTable(TFBlocks.TIME_DOOR.get(), DoorBlock.HALF, DoubleBlockHalf.LOWER)); + dropSelf(TFBlocks.TIME_TRAPDOOR.get()); + add(TFBlocks.TIME_SIGN.get(), createSingleItemTable(TFBlocks.TIME_SIGN.get().asItem())); + add(TFBlocks.TIME_WALL_SIGN.get(), createSingleItemTable(TFBlocks.TIME_SIGN.get().asItem())); + dropSelf(TFBlocks.TIME_BANISTER.get()); + dropSelf(TFBlocks.TIME_CHEST.get()); + + dropSelf(TFBlocks.TRANSFORMATION_LOG.get()); + dropSelf(TFBlocks.STRIPPED_TRANSFORMATION_LOG.get()); + dropSelf(TFBlocks.TRANSFORMATION_WOOD.get()); + dropSelf(TFBlocks.STRIPPED_TRANSFORMATION_WOOD.get()); + dropOther(TFBlocks.TRANSFORMATION_LOG_CORE.get(), TFBlocks.TRANSFORMATION_LOG.get()); + dropSelf(TFBlocks.TRANSFORMATION_SAPLING.get()); + registerLeavesNoSapling(TFBlocks.TRANSFORMATION_LEAVES.get()); + dropSelf(TFBlocks.TRANSFORMATION_PLANKS.get()); + dropSelf(TFBlocks.TRANSFORMATION_STAIRS.get()); + add(TFBlocks.TRANSFORMATION_SLAB.get(), createSlabItemTable(TFBlocks.TRANSFORMATION_SLAB.get())); + dropSelf(TFBlocks.TRANSFORMATION_BUTTON.get()); + dropSelf(TFBlocks.TRANSFORMATION_FENCE.get()); + dropSelf(TFBlocks.TRANSFORMATION_GATE.get()); + dropSelf(TFBlocks.TRANSFORMATION_PLATE.get()); + add(TFBlocks.TRANSFORMATION_DOOR.get(), createSinglePropConditionTable(TFBlocks.TRANSFORMATION_DOOR.get(), DoorBlock.HALF, DoubleBlockHalf.LOWER)); + dropSelf(TFBlocks.TRANSFORMATION_TRAPDOOR.get()); + add(TFBlocks.TRANSFORMATION_SIGN.get(), createSingleItemTable(TFBlocks.TRANSFORMATION_SIGN.get().asItem())); + add(TFBlocks.TRANSFORMATION_WALL_SIGN.get(), createSingleItemTable(TFBlocks.TRANSFORMATION_SIGN.get().asItem())); + dropSelf(TFBlocks.TRANSFORMATION_BANISTER.get()); + dropSelf(TFBlocks.TRANSFORMATION_CHEST.get()); + + dropSelf(TFBlocks.MINING_LOG.get()); + dropSelf(TFBlocks.STRIPPED_MINING_LOG.get()); + dropSelf(TFBlocks.MINING_WOOD.get()); + dropSelf(TFBlocks.STRIPPED_MINING_WOOD.get()); + dropOther(TFBlocks.MINING_LOG_CORE.get(), TFBlocks.MINING_LOG.get()); + dropSelf(TFBlocks.MINING_SAPLING.get()); + registerLeavesNoSapling(TFBlocks.MINING_LEAVES.get()); + dropSelf(TFBlocks.MINING_PLANKS.get()); + dropSelf(TFBlocks.MINING_STAIRS.get()); + add(TFBlocks.MINING_SLAB.get(), createSlabItemTable(TFBlocks.MINING_SLAB.get())); + dropSelf(TFBlocks.MINING_BUTTON.get()); + dropSelf(TFBlocks.MINING_FENCE.get()); + dropSelf(TFBlocks.MINING_GATE.get()); + dropSelf(TFBlocks.MINING_PLATE.get()); + add(TFBlocks.MINING_DOOR.get(), createSinglePropConditionTable(TFBlocks.MINING_DOOR.get(), DoorBlock.HALF, DoubleBlockHalf.LOWER)); + dropSelf(TFBlocks.MINING_TRAPDOOR.get()); + add(TFBlocks.MINING_SIGN.get(), createSingleItemTable(TFBlocks.MINING_SIGN.get().asItem())); + add(TFBlocks.MINING_WALL_SIGN.get(), createSingleItemTable(TFBlocks.MINING_SIGN.get().asItem())); + dropSelf(TFBlocks.MINING_BANISTER.get()); + dropSelf(TFBlocks.MINING_CHEST.get()); + + dropSelf(TFBlocks.SORTING_LOG.get()); + dropSelf(TFBlocks.STRIPPED_SORTING_LOG.get()); + dropSelf(TFBlocks.SORTING_WOOD.get()); + dropSelf(TFBlocks.STRIPPED_SORTING_WOOD.get()); + dropOther(TFBlocks.SORTING_LOG_CORE.get(), TFBlocks.SORTING_LOG.get()); + dropSelf(TFBlocks.SORTING_SAPLING.get()); + registerLeavesNoSapling(TFBlocks.SORTING_LEAVES.get()); + dropSelf(TFBlocks.SORTING_PLANKS.get()); + dropSelf(TFBlocks.SORTING_STAIRS.get()); + add(TFBlocks.SORTING_SLAB.get(), createSlabItemTable(TFBlocks.SORTING_SLAB.get())); + dropSelf(TFBlocks.SORTING_BUTTON.get()); + dropSelf(TFBlocks.SORTING_FENCE.get()); + dropSelf(TFBlocks.SORTING_GATE.get()); + dropSelf(TFBlocks.SORTING_PLATE.get()); + add(TFBlocks.SORTING_DOOR.get(), createSinglePropConditionTable(TFBlocks.SORTING_DOOR.get(), DoorBlock.HALF, DoubleBlockHalf.LOWER)); + dropSelf(TFBlocks.SORTING_TRAPDOOR.get()); + add(TFBlocks.SORTING_SIGN.get(), createSingleItemTable(TFBlocks.SORTING_SIGN.get().asItem())); + add(TFBlocks.SORTING_WALL_SIGN.get(), createSingleItemTable(TFBlocks.SORTING_SIGN.get().asItem())); + dropSelf(TFBlocks.SORTING_BANISTER.get()); + dropSelf(TFBlocks.SORTING_CHEST.get()); + + } + + private void registerLeavesNoSapling(Block leaves) { + LootPoolEntryContainer.Builder sticks = applyExplosionDecay(leaves, LootItem.lootTableItem(Items.STICK) + .apply(SetItemCountFunction.setCount(UniformGenerator.between(1.0F, 2.0F))) + .when(BonusLevelTableCondition.bonusLevelFlatChance(Enchantments.BLOCK_FORTUNE, 0.02F, 0.022222223F, 0.025F, 0.033333335F, 0.1F))); + add(leaves, createSilkTouchOrShearsDispatchTable(leaves, sticks)); + } + + private LootTable.Builder hollowLog(Block log) { + return LootTable.lootTable() + .withPool(LootPool.lootPool().setRolls(ConstantValue.exactly(1.0F)) + .add(LootItem.lootTableItem(log.asItem()).when(HAS_SILK_TOUCH).otherwise(LootItem.lootTableItem(Items.STICK).apply(SetItemCountFunction.setCount(UniformGenerator.between(2.0F, 4.0F))).apply(ApplyBonusCount.addUniformBonusCount(Enchantments.BLOCK_FORTUNE))))) + .withPool(LootPool.lootPool().setRolls(ConstantValue.exactly(1.0F)) + .add(LootItem.lootTableItem(Blocks.GRASS).when(HAS_SILK_TOUCH).when(LootItemBlockStatePropertyCondition.hasBlockStateProperties(log).setProperties(StatePropertiesPredicate.Builder.properties().hasProperty(HollowLogHorizontal.VARIANT, HollowLogVariants.Horizontal.MOSS_AND_GRASS))))) + .withPool(LootPool.lootPool().setRolls(ConstantValue.exactly(1.0F)) + .add(LootItem.lootTableItem(TFBlocks.MOSS_PATCH.get()).when(HAS_SILK_TOUCH).when(LootItemBlockStatePropertyCondition.hasBlockStateProperties(log).setProperties(StatePropertiesPredicate.Builder.properties().hasProperty(HollowLogHorizontal.VARIANT, HollowLogVariants.Horizontal.MOSS_AND_GRASS))))) + .withPool(LootPool.lootPool().setRolls(ConstantValue.exactly(1.0F)) + .add(LootItem.lootTableItem(TFBlocks.MOSS_PATCH.get()).when(HAS_SILK_TOUCH).when(LootItemBlockStatePropertyCondition.hasBlockStateProperties(log).setProperties(StatePropertiesPredicate.Builder.properties().hasProperty(HollowLogHorizontal.VARIANT, HollowLogVariants.Horizontal.MOSS))))) + .withPool(LootPool.lootPool().setRolls(ConstantValue.exactly(1.0F)) + .add(LootItem.lootTableItem(Items.SNOWBALL).when(HAS_SILK_TOUCH).when(LootItemBlockStatePropertyCondition.hasBlockStateProperties(log).setProperties(StatePropertiesPredicate.Builder.properties().hasProperty(HollowLogHorizontal.VARIANT, HollowLogVariants.Horizontal.SNOW))))) + .withPool(LootPool.lootPool().setRolls(ConstantValue.exactly(1.0F)) + .add(LootItem.lootTableItem(Blocks.VINE).when(HAS_SILK_TOUCH).when(LootItemBlockStatePropertyCondition.hasBlockStateProperties(log).setProperties(StatePropertiesPredicate.Builder.properties().hasProperty(HollowLogClimbable.VARIANT, HollowLogVariants.Climbable.VINE))))) + .withPool(LootPool.lootPool().setRolls(ConstantValue.exactly(1.0F)) + .add(LootItem.lootTableItem(Blocks.LADDER).when(LootItemBlockStatePropertyCondition.hasBlockStateProperties(log).setProperties(StatePropertiesPredicate.Builder.properties().hasProperty(HollowLogClimbable.VARIANT, HollowLogVariants.Climbable.LADDER))))) + .withPool(LootPool.lootPool().setRolls(ConstantValue.exactly(1.0F)) + .add(LootItem.lootTableItem(Blocks.LADDER).when(LootItemBlockStatePropertyCondition.hasBlockStateProperties(log).setProperties(StatePropertiesPredicate.Builder.properties().hasProperty(HollowLogClimbable.VARIANT, HollowLogVariants.Climbable.LADDER_WATERLOGGED))))); + } + + private LootTable.Builder verticalHollowLog(Block log) { + return LootTable.lootTable() + .withPool(LootPool.lootPool().setRolls(ConstantValue.exactly(1.0F)) + .add(LootItem.lootTableItem(log.asItem()).when(HAS_SILK_TOUCH).otherwise(LootItem.lootTableItem(Items.STICK).apply(SetItemCountFunction.setCount(UniformGenerator.between(2.0F, 4.0F))).apply(ApplyBonusCount.addUniformBonusCount(Enchantments.BLOCK_FORTUNE))))); + } + + // [VanillaCopy] super.droppingWithChancesAndSticks, but non-silk touch parameter can be an item instead of a block + private LootTable.Builder silkAndStick(Block block, ItemLike nonSilk, float... nonSilkFortune) { + return createSilkTouchOrShearsDispatchTable(block, this.applyExplosionCondition(block, LootItem.lootTableItem(nonSilk.asItem())).when(BonusLevelTableCondition.bonusLevelFlatChance(Enchantments.BLOCK_FORTUNE, nonSilkFortune))).withPool(LootPool.lootPool().setRolls(ConstantValue.exactly(1)).when((HAS_SHEARS.or(HAS_SILK_TOUCH)).invert()).add(applyExplosionDecay(block, LootItem.lootTableItem(Items.STICK).apply(SetItemCountFunction.setCount(UniformGenerator.between(1.0F, 2.0F)))).when(BonusLevelTableCondition.bonusLevelFlatChance(Enchantments.BLOCK_FORTUNE, 0.02F, 0.022222223F, 0.025F, 0.033333335F, 0.1F)))); + } + + private static LootTable.Builder casketInfo(Block block) { + return LootTable.lootTable().withPool(LootPool.lootPool().setRolls(ConstantValue.exactly(1)).apply(CopyBlockState.copyState(block).copy(KeepsakeCasketBlock.BREAKAGE))); + } + + private LootTable.Builder particleSpawner() { + return LootTable.lootTable().withPool(LootPool.lootPool().setRolls(ConstantValue.exactly(1.0F)) + .add(this.applyExplosionDecay(TFBlocks.FIREFLY_SPAWNER.get(), LootItem.lootTableItem(TFBlocks.FIREFLY_SPAWNER.get())))) + .withPool(LootPool.lootPool() + .add(AlternativesEntry.alternatives(AlternativesEntry.alternatives(FireflySpawnerBlock.RADIUS.getPossibleValues(), layer -> + LootItem.lootTableItem(TFBlocks.FIREFLY.get()) + .when(LootItemBlockStatePropertyCondition.hasBlockStateProperties(TFBlocks.FIREFLY_SPAWNER.get()) + .setProperties(StatePropertiesPredicate.Builder.properties().hasProperty(FireflySpawnerBlock.RADIUS, layer))) + .apply(SetItemCountFunction.setCount(ConstantValue.exactly((float)layer.intValue() - 1))))))); + } + + protected LootTable.Builder torchberryPlant(Block pBlock) { + return LootTable.lootTable() + .withPool(LootPool.lootPool().setRolls(ConstantValue.exactly(1.0F)) + .add(LootItem.lootTableItem(pBlock).when(HAS_SHEARS))) + .withPool(LootPool.lootPool().setRolls(ConstantValue.exactly(1.0F)) + .add(LootItem.lootTableItem(TFItems.TORCHBERRIES.get()) + .when(LootItemBlockStatePropertyCondition.hasBlockStateProperties(pBlock).setProperties(StatePropertiesPredicate.Builder.properties().hasProperty(TorchberryPlantBlock.HAS_BERRIES, true))))); + } + + protected LootTable.Builder redThread() { + return LootTable.lootTable() + .withPool(LootPool.lootPool() + .add(this.applyExplosionDecay(TFBlocks.RED_THREAD.get(), LootItem.lootTableItem(TFBlocks.RED_THREAD.get()) + .apply(SetItemCountFunction.setCount(ConstantValue.exactly(1.0F), true) + .when(LootItemBlockStatePropertyCondition.hasBlockStateProperties(TFBlocks.RED_THREAD.get()) + .setProperties(StatePropertiesPredicate.Builder.properties() + .hasProperty(PipeBlock.EAST, true)))) + .apply(SetItemCountFunction.setCount(ConstantValue.exactly(1.0F), true) + .when(LootItemBlockStatePropertyCondition.hasBlockStateProperties(TFBlocks.RED_THREAD.get()) + .setProperties(StatePropertiesPredicate.Builder.properties() + .hasProperty(PipeBlock.WEST, true)))) + .apply(SetItemCountFunction.setCount(ConstantValue.exactly(1.0F), true) + .when(LootItemBlockStatePropertyCondition.hasBlockStateProperties(TFBlocks.RED_THREAD.get()) + .setProperties(StatePropertiesPredicate.Builder.properties() + .hasProperty(PipeBlock.NORTH, true)))) + .apply(SetItemCountFunction.setCount(ConstantValue.exactly(1.0F), true) + .when(LootItemBlockStatePropertyCondition.hasBlockStateProperties(TFBlocks.RED_THREAD.get()) + .setProperties(StatePropertiesPredicate.Builder.properties() + .hasProperty(PipeBlock.SOUTH, true)))) + .apply(SetItemCountFunction.setCount(ConstantValue.exactly(1.0F), true) + .when(LootItemBlockStatePropertyCondition.hasBlockStateProperties(TFBlocks.RED_THREAD.get()) + .setProperties(StatePropertiesPredicate.Builder.properties() + .hasProperty(PipeBlock.UP, true)))) + .apply(SetItemCountFunction.setCount(ConstantValue.exactly(1.0F), true) + .when(LootItemBlockStatePropertyCondition.hasBlockStateProperties(TFBlocks.RED_THREAD.get()) + .setProperties(StatePropertiesPredicate.Builder.properties() + .hasProperty(PipeBlock.DOWN, true)))) + .apply(SetItemCountFunction.setCount(ConstantValue.exactly(-1.0F), true))))); + } + + protected LootTable.Builder fallenLeaves() { + return LootTable.lootTable().withPool(LootPool.lootPool() + .add(AlternativesEntry.alternatives(AlternativesEntry.alternatives(FallenLeavesBlock.LAYERS.getPossibleValues(), layer -> + LootItem.lootTableItem(TFBlocks.FALLEN_LEAVES.get()) + .when(LootItemBlockStatePropertyCondition.hasBlockStateProperties(TFBlocks.FALLEN_LEAVES.get()) + .setProperties(StatePropertiesPredicate.Builder.properties().hasProperty(FallenLeavesBlock.LAYERS, layer))) + .apply(SetItemCountFunction.setCount(ConstantValue.exactly((float)layer.intValue())))).when(HAS_SHEARS)))); + } + + //[VanillaCopy] of a few different methods from BlockLoot. These are here just so we can use the modded shears thing + protected static LootTable.Builder createShearsDispatchTable(Block block, LootPoolEntryContainer.Builder builder) { + return createSelfDropDispatchTable(block, HAS_SHEARS, builder); + } + + protected static LootTable.Builder createSilkTouchOrShearsDispatchTable(Block block, LootPoolEntryContainer.Builder builder) { + return createSelfDropDispatchTable(block, HAS_SHEARS.or(HAS_SILK_TOUCH), builder); + } + + protected static LootTable.Builder createShearsOnlyDrop(ItemLike p_124287_) { + return LootTable.lootTable().withPool(LootPool.lootPool().setRolls(ConstantValue.exactly(1.0F)).when(HAS_SHEARS).add(LootItem.lootTableItem(p_124287_))); + } + + private void registerEmpty(Block b) { + add(b, LootTable.lootTable()); + } + + @Override + protected Iterable getKnownBlocks() { + return ForgeRegistries.BLOCKS.getValues().stream().filter(block -> ForgeRegistries.BLOCKS.getKey(block).getNamespace().equals(TwilightForestMod.ID)).collect(Collectors.toList()); + } +} diff --git a/src/main/java/twilightforest/data/BlockstateGenerator.java b/src/main/java/twilightforest/data/BlockstateGenerator.java new file mode 100644 index 0000000000..08e8eb4829 --- /dev/null +++ b/src/main/java/twilightforest/data/BlockstateGenerator.java @@ -0,0 +1,1734 @@ +package twilightforest.data; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; +import net.minecraft.core.Direction; +import net.minecraft.data.PackOutput; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.*; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.SlabType; +import net.minecraftforge.client.model.generators.BlockModelBuilder; +import net.minecraftforge.client.model.generators.ConfiguredModel; +import net.minecraftforge.client.model.generators.ModelFile; +import net.minecraftforge.client.model.generators.MultiPartBlockStateBuilder; +import net.minecraftforge.client.model.generators.loaders.CompositeModelBuilder; +import net.minecraftforge.common.data.ExistingFileHelper; +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.registries.RegistryObject; +import twilightforest.TwilightForestMod; +import twilightforest.block.*; +import twilightforest.client.model.block.doors.CastleDoorBuilder; +import twilightforest.client.model.block.giantblock.GiantBlockBuilder; +import twilightforest.data.helpers.BlockModelBuilders; +import twilightforest.enums.*; +import twilightforest.init.TFBlocks; + +import javax.annotation.Nonnull; +import java.util.*; + +import static twilightforest.TwilightForestMod.prefix; + +//TODO clean this class up for god's sake +//make better helper methods and move them to BlockModelBuilders +//finish datagenning blocks that arent done yet +public class BlockstateGenerator extends BlockModelBuilders { + public BlockstateGenerator(PackOutput output, ExistingFileHelper exFileHelper) { + super(output, exFileHelper); + } + + @Override + protected void registerStatesAndModels() { + tintedAndFlipped(TFBlocks.TOWERWOOD.get()); + simpleBlock(TFBlocks.ENCASED_TOWERWOOD.get(), cubeAllTinted(TFBlocks.ENCASED_TOWERWOOD.getId().getPath(), TFBlocks.ENCASED_TOWERWOOD.getId().getPath())); + simpleBlock(TFBlocks.CRACKED_TOWERWOOD.get(), ConfiguredModel.builder() + .modelFile(cubeAllTinted(TFBlocks.CRACKED_TOWERWOOD.getId().getPath(), TFBlocks.CRACKED_TOWERWOOD.getId().getPath())).nextModel() + .modelFile(cubeAllTinted(TFBlocks.CRACKED_TOWERWOOD.getId().getPath() + "_flipped", TFBlocks.CRACKED_TOWERWOOD.getId().getPath(), true)).nextModel() + .modelFile(cubeAllTinted(TFBlocks.CRACKED_TOWERWOOD.getId().getPath() + "_alt", TFBlocks.CRACKED_TOWERWOOD.getId().getPath() + "_alt")).nextModel() + .modelFile(cubeAllTinted(TFBlocks.CRACKED_TOWERWOOD.getId().getPath() + "_alt_flipped", TFBlocks.CRACKED_TOWERWOOD.getId().getPath() + "_alt", true)).build() + ); + tintedAndFlipped(TFBlocks.MOSSY_TOWERWOOD.get()); + tintedAndFlipped(TFBlocks.INFESTED_TOWERWOOD.get()); + + builtinEntity(TFBlocks.FIREFLY.get(), "twilightforest:block/stone_twist/twist_blank"); + builtinEntity(TFBlocks.MOONWORM.get(), "twilightforest:block/stone_twist/twist_blank"); + builtinEntity(TFBlocks.CICADA.get(), "twilightforest:block/stone_twist/twist_blank"); + + builtinEntity(TFBlocks.RED_THREAD.get(), "twilightforest:block/stone_twist/twist_blank"); + + ModelFile portalModel = models().getExistingFile(prefix("block/twilight_portal")); + ModelFile portalOverlayModel = models().getExistingFile(prefix("block/twilight_portal_barrier")); + getMultipartBuilder(TFBlocks.TWILIGHT_PORTAL.get()) + .part().modelFile(portalModel).addModel().end() + .part().modelFile(portalOverlayModel).addModel().condition(TFPortalBlock.DISALLOW_RETURN, true).end(); + + getVariantBuilder(TFBlocks.EXPERIMENT_115.get()).forAllStates(state -> { + int bitesTaken = state.getValue(Experiment115Block.BITES_TAKEN); + String basePath = String.format("block/experiment115_%d_8", 8 - bitesTaken); + ModelFile model; + if (state.getValue(Experiment115Block.REGENERATE)) { + model = models().withExistingParent(basePath + "_regenerating", prefix(basePath)) + .texture("top_2", "block/experiment115/experiment115_sprinkle"); + } else { + model = models().getExistingFile(prefix(basePath)); + } + return ConfiguredModel.builder().modelFile(model).build(); + }); + + MultiPartBlockStateBuilder ironLadder = getMultipartBuilder(TFBlocks.IRON_LADDER.get()); + ModelFile ironLadderLeft = models().getExistingFile(prefix("block/iron_ladder_left")); + ModelFile ironLadderLeftConnected = models().getExistingFile(prefix("block/iron_ladder_left_connection")); + ModelFile ironLadderRight = models().getExistingFile(prefix("block/iron_ladder_right")); + ModelFile ironLadderRightConnected = models().getExistingFile(prefix("block/iron_ladder_right_connection")); + for (Direction d : Direction.Plane.HORIZONTAL) { + int rotY = switch (d) { + default -> 0; + case EAST -> 90; + case SOUTH -> 180; + case WEST -> 270; + }; + + ironLadder.part().modelFile(ironLadderLeft).rotationY(rotY).addModel() + .condition(LadderBlock.FACING, d).condition(IronLadderBlock.LEFT, false).end(); + ironLadder.part().modelFile(ironLadderLeftConnected).rotationY(rotY).addModel() + .condition(LadderBlock.FACING, d).condition(IronLadderBlock.LEFT, true).end(); + ironLadder.part().modelFile(ironLadderRight).rotationY(rotY).addModel() + .condition(LadderBlock.FACING, d).condition(IronLadderBlock.RIGHT, false).end(); + ironLadder.part().modelFile(ironLadderRightConnected).rotationY(rotY).addModel() + .condition(LadderBlock.FACING, d).condition(IronLadderBlock.RIGHT, true).end(); + } + + towerBlocks(); + + simpleBlock(TFBlocks.FAKE_GOLD.get(), models().getExistingFile(new ResourceLocation("block/gold_block"))); + simpleBlock(TFBlocks.FAKE_DIAMOND.get(), models().getExistingFile(new ResourceLocation("block/diamond_block"))); + + simpleBlock(TFBlocks.NAGA_TROPHY.get(), models().getExistingFile(new ResourceLocation("block/skull"))); + simpleBlock(TFBlocks.LICH_TROPHY.get(), models().getExistingFile(new ResourceLocation("block/skull"))); + simpleBlock(TFBlocks.MINOSHROOM_TROPHY.get(), models().getExistingFile(new ResourceLocation("block/skull"))); + simpleBlock(TFBlocks.HYDRA_TROPHY.get(), models().getExistingFile(new ResourceLocation("block/skull"))); + simpleBlock(TFBlocks.ALPHA_YETI_TROPHY.get(), models().getExistingFile(new ResourceLocation("block/skull"))); + simpleBlock(TFBlocks.SNOW_QUEEN_TROPHY.get(), models().getExistingFile(new ResourceLocation("block/skull"))); + simpleBlock(TFBlocks.KNIGHT_PHANTOM_TROPHY.get(), models().getExistingFile(new ResourceLocation("block/skull"))); + simpleBlock(TFBlocks.UR_GHAST_TROPHY.get(), models().getExistingFile(new ResourceLocation("block/skull"))); + simpleBlock(TFBlocks.QUEST_RAM_TROPHY.get(), models().getExistingFile(new ResourceLocation("block/skull"))); + simpleBlock(TFBlocks.NAGA_WALL_TROPHY.get(), models().getExistingFile(new ResourceLocation("block/skull"))); + simpleBlock(TFBlocks.LICH_WALL_TROPHY.get(), models().getExistingFile(new ResourceLocation("block/skull"))); + simpleBlock(TFBlocks.MINOSHROOM_WALL_TROPHY.get(), models().getExistingFile(new ResourceLocation("block/skull"))); + simpleBlock(TFBlocks.HYDRA_WALL_TROPHY.get(), models().getExistingFile(new ResourceLocation("block/skull"))); + simpleBlock(TFBlocks.ALPHA_YETI_WALL_TROPHY.get(), models().getExistingFile(new ResourceLocation("block/skull"))); + simpleBlock(TFBlocks.SNOW_QUEEN_WALL_TROPHY.get(), models().getExistingFile(new ResourceLocation("block/skull"))); + simpleBlock(TFBlocks.KNIGHT_PHANTOM_WALL_TROPHY.get(), models().getExistingFile(new ResourceLocation("block/skull"))); + simpleBlock(TFBlocks.UR_GHAST_WALL_TROPHY.get(), models().getExistingFile(new ResourceLocation("block/skull"))); + simpleBlock(TFBlocks.QUEST_RAM_WALL_TROPHY.get(), models().getExistingFile(new ResourceLocation("block/skull"))); + + simpleBlock(TFBlocks.ZOMBIE_SKULL_CANDLE.get(), models().getExistingFile(new ResourceLocation("block/skull"))); + simpleBlock(TFBlocks.ZOMBIE_WALL_SKULL_CANDLE.get(), models().getExistingFile(new ResourceLocation("block/skull"))); + simpleBlock(TFBlocks.SKELETON_SKULL_CANDLE.get(), models().getExistingFile(new ResourceLocation("block/skull"))); + simpleBlock(TFBlocks.SKELETON_WALL_SKULL_CANDLE.get(), models().getExistingFile(new ResourceLocation("block/skull"))); + simpleBlock(TFBlocks.WITHER_SKELE_SKULL_CANDLE.get(), models().getExistingFile(new ResourceLocation("block/skull"))); + simpleBlock(TFBlocks.WITHER_SKELE_WALL_SKULL_CANDLE.get(), models().getExistingFile(new ResourceLocation("block/skull"))); + simpleBlock(TFBlocks.CREEPER_SKULL_CANDLE.get(), models().getExistingFile(new ResourceLocation("block/skull"))); + simpleBlock(TFBlocks.CREEPER_WALL_SKULL_CANDLE.get(), models().getExistingFile(new ResourceLocation("block/skull"))); + simpleBlock(TFBlocks.PLAYER_SKULL_CANDLE.get(), models().getExistingFile(new ResourceLocation("block/skull"))); + simpleBlock(TFBlocks.PLAYER_WALL_SKULL_CANDLE.get(), models().getExistingFile(new ResourceLocation("block/skull"))); + + getVariantBuilder(TFBlocks.SPIRAL_BRICKS.get()).forAllStates(state -> ConfiguredModel.builder().modelFile(models().getExistingFile(TwilightForestMod.prefix("block/spiral_bricks/" + state.getValue(SpiralBrickBlock.AXIS_FACING).getName() + "_spiral_" + state.getValue(SpiralBrickBlock.DIAGONAL).getSerializedName()))).build()); + + ModelFile shieldModel = models().cubeTop(TFBlocks.STRONGHOLD_SHIELD.getId().getPath(), prefix("block/shield_outside"), prefix("block/shield_inside")); + getVariantBuilder(TFBlocks.STRONGHOLD_SHIELD.get()) + .forAllStates(state -> { + Direction dir = state.getValue(BlockStateProperties.FACING); + return ConfiguredModel.builder() + .uvLock(true) + .modelFile(shieldModel) + .rotationX(dir == Direction.DOWN ? 180 : dir.getAxis().isHorizontal() ? 90 : 0) + .rotationY(dir.getAxis().isVertical() ? 0 : (int) dir.toYRot() % 360) + .build(); + }); + + trophyPedestal(); + auroraBlocks(); + slider(); + simpleBlock(TFBlocks.UNDERBRICK.get()); + simpleBlock(TFBlocks.CRACKED_UNDERBRICK.get()); + simpleBlock(TFBlocks.MOSSY_UNDERBRICK.get()); + simpleBlock(TFBlocks.UNDERBRICK_FLOOR.get()); + thorns(); + thornRose(); + simpleBlock(TFBlocks.THORN_LEAVES.get(), models().withExistingParent("thorn_leaves", new ResourceLocation("block/oak_leaves"))); + simpleBlock(TFBlocks.BEANSTALK_LEAVES.get(), models().withExistingParent("beanstalk_leaves", new ResourceLocation("block/azalea_leaves"))); + simpleBlock(TFBlocks.HOLLOW_OAK_SAPLING.get(), models().cross(TFBlocks.HOLLOW_OAK_SAPLING.getId().getPath(), blockTexture(TFBlocks.HOLLOW_OAK_SAPLING.get())).renderType(CUTOUT)); + ModelFile deadrock = models().cubeAll(TFBlocks.DEADROCK.getId().getPath(), blockTexture(TFBlocks.DEADROCK.get())); + simpleBlock(TFBlocks.DEADROCK.get(), ConfiguredModel.builder() + .modelFile(deadrock).nextModel() + .rotationY(180).modelFile(deadrock).nextModel() + .rotationY(90).modelFile(deadrock).nextModel() + .rotationY(270).modelFile(deadrock).build() + ); + ModelFile deadrockCracked = models().cubeAll(TFBlocks.CRACKED_DEADROCK.getId().getPath(), blockTexture(TFBlocks.CRACKED_DEADROCK.get())); + allRotations(TFBlocks.CRACKED_DEADROCK.get(), deadrockCracked); + ModelFile deadrockWeathered = models().cubeAll(TFBlocks.WEATHERED_DEADROCK.getId().getPath(), blockTexture(TFBlocks.WEATHERED_DEADROCK.get())); + allRotations(TFBlocks.WEATHERED_DEADROCK.get(), deadrockWeathered); + perFaceBlock(TFBlocks.TROLLSTEINN.get(), blockTexture(TFBlocks.TROLLSTEINN.get()), prefix("block/" + TFBlocks.TROLLSTEINN.getId().getPath() + "_light")); + simpleBlockWithRenderType(TFBlocks.WISPY_CLOUD.get(), TRANSLUCENT); + simpleBlock(TFBlocks.FLUFFY_CLOUD.get()); + simpleBlock(TFBlocks.GIANT_COBBLESTONE.get(), models().withExistingParent(TFBlocks.GIANT_COBBLESTONE.getId().getPath(), new ResourceLocation("block/block")) + .texture("particle", blockTexture(Blocks.COBBLESTONE)) + .texture("all", blockTexture(Blocks.COBBLESTONE)) + .customLoader(GiantBlockBuilder::begin).parentBlock(Blocks.COBBLESTONE).end()); + simpleBlock(TFBlocks.GIANT_LOG.get(), models().withExistingParent(TFBlocks.GIANT_LOG.getId().getPath(), new ResourceLocation("block/block")) + .texture("particle", blockTexture(Blocks.OAK_LOG)) + .texture("north", blockTexture(Blocks.OAK_LOG)).texture("south", blockTexture(Blocks.OAK_LOG)) + .texture("west", blockTexture(Blocks.OAK_LOG)).texture("east", blockTexture(Blocks.OAK_LOG)) + .texture("up", blockTexture(Blocks.OAK_LOG) + "_top").texture("down", blockTexture(Blocks.OAK_LOG) + "_top") + .customLoader(GiantBlockBuilder::begin).parentBlock(Blocks.OAK_LOG).end()); + simpleBlock(TFBlocks.GIANT_LEAVES.get(), models().withExistingParent(TFBlocks.GIANT_LEAVES.getId().getPath(), new ResourceLocation("block/block")) + .renderType(CUTOUT_MIPPED) + .texture("particle", blockTexture(Blocks.OAK_LEAVES)) + .texture("all", blockTexture(Blocks.OAK_LEAVES)) + .customLoader(GiantBlockBuilder::begin).parentBlock(Blocks.OAK_LEAVES).end()); + simpleBlock(TFBlocks.GIANT_OBSIDIAN.get(), models().withExistingParent(TFBlocks.GIANT_OBSIDIAN.getId().getPath(), new ResourceLocation("block/block")) + .texture("particle", blockTexture(Blocks.OBSIDIAN)) + .texture("all", blockTexture(Blocks.OBSIDIAN)) + .customLoader(GiantBlockBuilder::begin).parentBlock(Blocks.OBSIDIAN).end()); + simpleBlock(TFBlocks.UBEROUS_SOIL.get(), models().withExistingParent(TFBlocks.UBEROUS_SOIL.getId().getPath(), "block/template_farmland").renderType(TRANSLUCENT) + .texture("top", blockTexture(TFBlocks.UBEROUS_SOIL.get())) + .texture("dirt", blockTexture(TFBlocks.UBEROUS_SOIL.get()))); + axisBlock(TFBlocks.HUGE_STALK.get(), prefix("block/huge_stalk"), prefix("block/huge_stalk_top")); + builtinEntity(TFBlocks.BEANSTALK_GROWER.get(), "twilightforest:block/stone_twist/twist_blank"); + perFaceBlock(TFBlocks.HUGE_MUSHGLOOM.get(), prefix("block/huge_gloom_inside"), prefix("block/huge_gloom_cap")); + perFaceBlock(TFBlocks.HUGE_MUSHGLOOM_STEM.get(), prefix("block/huge_gloom_inside"), prefix("block/huge_mushgloom_stem")); + simpleBlock(TFBlocks.TROLLVIDR.get(), models().cross(TFBlocks.TROLLVIDR.getId().getPath(), blockTexture(TFBlocks.TROLLVIDR.get())).renderType(CUTOUT)); + simpleBlock(TFBlocks.UNRIPE_TROLLBER.get(), models().cross(TFBlocks.UNRIPE_TROLLBER.getId().getPath(), blockTexture(TFBlocks.UNRIPE_TROLLBER.get())).renderType(CUTOUT)); + ModelFile trollber = this.make2layerCross(TFBlocks.TROLLBER.getId().getPath(), CUTOUT, 1, 10) + .texture("cross", blockTexture(TFBlocks.TROLLBER.get())) + .texture("cross2", prefix("block/" + TFBlocks.TROLLBER.getId().getPath() + "_glow")); + simpleBlock(TFBlocks.TROLLBER.get(), trollber); + lilyPad(TFBlocks.HUGE_LILY_PAD.get()); + simpleBlock(TFBlocks.HUGE_WATER_LILY.get(), models().cross(TFBlocks.HUGE_WATER_LILY.getId().getPath(), blockTexture(TFBlocks.HUGE_WATER_LILY.get())).renderType(CUTOUT)); + simpleBlock(TFBlocks.CASTLE_BRICK.get()); + simpleBlock(TFBlocks.WORN_CASTLE_BRICK.get()); + simpleBlock(TFBlocks.CRACKED_CASTLE_BRICK.get()); + allRotations(TFBlocks.CASTLE_ROOF_TILE.get(), cubeAll(TFBlocks.CASTLE_ROOF_TILE.get())); + simpleBlock(TFBlocks.MOSSY_CASTLE_BRICK.get()); + simpleBlock(TFBlocks.THICK_CASTLE_BRICK.get()); + + rotationallyCorrectColumn(TFBlocks.ENCASED_CASTLE_BRICK_PILLAR.get()); + rotationallyCorrectColumn(TFBlocks.BOLD_CASTLE_BRICK_PILLAR.get()); + simpleBlock(TFBlocks.ENCASED_CASTLE_BRICK_TILE.get(), models().cubeAll(TFBlocks.ENCASED_CASTLE_BRICK_TILE.getId().getPath(), prefix("block/" + TFBlocks.ENCASED_CASTLE_BRICK_PILLAR.getId().getPath() + "_end"))); + simpleBlock(TFBlocks.BOLD_CASTLE_BRICK_TILE.get()); + stairsBlock(TFBlocks.CASTLE_BRICK_STAIRS.get(), prefix("block/" + TFBlocks.CASTLE_BRICK_STAIRS.getId().getPath())); + stairsBlock(TFBlocks.WORN_CASTLE_BRICK_STAIRS.get(), prefix("block/" + TFBlocks.WORN_CASTLE_BRICK.getId().getPath())); + stairsBlock(TFBlocks.CRACKED_CASTLE_BRICK_STAIRS.get(), prefix("block/" + TFBlocks.CRACKED_CASTLE_BRICK_STAIRS.getId().getPath())); + stairsBlock(TFBlocks.MOSSY_CASTLE_BRICK_STAIRS.get(), prefix("block/" + TFBlocks.MOSSY_CASTLE_BRICK_STAIRS.getId().getPath())); + bisectedStairsBlock(TFBlocks.ENCASED_CASTLE_BRICK_STAIRS, prefix("block/encased_castle_brick_pillar_h"), prefix("block/castleblock_tile"), prefix("block/" + TFBlocks.CASTLE_ROOF_TILE.getId().getPath())); + stairsBlock(TFBlocks.BOLD_CASTLE_BRICK_STAIRS.get(), prefix("block/" + TFBlocks.BOLD_CASTLE_BRICK_TILE.getId().getPath())); + + ConfiguredModel[] runeBrickModels = new ConfiguredModel[8]; + for (int i = 0; i < runeBrickModels.length; i++) { + runeBrickModels[i] = new ConfiguredModel(models().withExistingParent("castle_rune_brick_" + i, "block/block") + .texture("particle", prefix("block/castle_brick")).customLoader(CompositeModelBuilder::begin) + .child("brick", models().withExistingParent("castle_rune_bricks", "block/cube_all").texture("all", prefix("block/castle_brick"))) + .child("runes", this.makeEmissiveBlockAll("castle_runes_" + i, CUTOUT, 15).texture("all", prefix("block/castleblock_magic_" + i))) + .end()); + } + + this.make2LayerCubeAllSidesSame("castle_rune_inventory", CUTOUT, 0, 15, false) + .texture("all", prefix("block/castle_brick")) + .texture("all2", prefix("block/castleblock_magic_0")); + + simpleBlock(TFBlocks.YELLOW_CASTLE_RUNE_BRICK.get(), runeBrickModels); + simpleBlock(TFBlocks.VIOLET_CASTLE_RUNE_BRICK.get(), runeBrickModels); + simpleBlock(TFBlocks.PINK_CASTLE_RUNE_BRICK.get(), runeBrickModels); + simpleBlock(TFBlocks.BLUE_CASTLE_RUNE_BRICK.get(), runeBrickModels); + + logBlock(TFBlocks.CINDER_LOG.get()); + simpleBlock(TFBlocks.CINDER_WOOD.get(), models().cubeAll(TFBlocks.CINDER_WOOD.getId().getPath(), prefix("block/" + TFBlocks.CINDER_LOG.getId().getPath()))); + ModelFile furnaceOff = models().getExistingFile(new ResourceLocation("block/furnace")); + ModelFile furnaceOn = models().getExistingFile(new ResourceLocation("block/furnace_on")); + horizontalBlock(TFBlocks.CINDER_FURNACE.get(), state -> state.getValue(AbstractFurnaceBlock.LIT) ? furnaceOn : furnaceOff); + + castleDoor(TFBlocks.YELLOW_CASTLE_DOOR.get()); + castleDoor(TFBlocks.VIOLET_CASTLE_DOOR.get()); + castleDoor(TFBlocks.PINK_CASTLE_DOOR.get()); + castleDoor(TFBlocks.BLUE_CASTLE_DOOR.get()); + + simpleBlockExisting(TFBlocks.KNIGHTMETAL_BLOCK.get()); + simpleBlock(TFBlocks.IRONWOOD_BLOCK.get()); + simpleBlockExisting(TFBlocks.FIERY_BLOCK.get()); + simpleBlock(TFBlocks.ARCTIC_FUR_BLOCK.get()); + ModelFile steeleafBlock = models().cubeAll(TFBlocks.STEELEAF_BLOCK.getId().getPath(), prefix("block/" + TFBlocks.STEELEAF_BLOCK.getId().getPath())); + allRotations(TFBlocks.STEELEAF_BLOCK.get(), steeleafBlock); + ModelFile carminiteBlock = this.make2LayerCubeAllSidesSame(TFBlocks.CARMINITE_BLOCK.getId().getPath(), SOLID, 4, 7, true) + .texture("all", prefix("block/" + TFBlocks.CARMINITE_BLOCK.getId().getPath())) + .texture("all2", prefix("block/" + TFBlocks.CARMINITE_BLOCK.getId().getPath() + "_overlay")); + allRotations(TFBlocks.CARMINITE_BLOCK.get(), carminiteBlock); + + simpleBlock(TFBlocks.TWILIGHT_PORTAL_MINIATURE_STRUCTURE.get(), models().getExistingFile(prefix("block/miniature/portal"))); + simpleBlock(TFBlocks.NAGA_COURTYARD_MINIATURE_STRUCTURE.get(), models().getExistingFile(prefix("block/miniature/naga_courtyard"))); + simpleBlock(TFBlocks.LICH_TOWER_MINIATURE_STRUCTURE.get(), models().getExistingFile(prefix("block/miniature/lich_tower"))); + mazestone(); + simpleBlock(TFBlocks.HEDGE.get(), ConfiguredModel.builder() + .weight(10).modelFile(models().cubeAll(TFBlocks.HEDGE.getId().getPath(), blockTexture(TFBlocks.HEDGE.get()))).nextModel() + .weight(1).modelFile(models().cubeAll(TFBlocks.HEDGE.getId().getPath() + "_rose", prefix("block/" + TFBlocks.HEDGE.getId().getPath() + "_rose"))).build()); + + /*ModelFile bigSpawner = models().withExistingParent("boss_spawner", "block/block").renderType(CUTOUT).texture("particle", "#all").texture("all", TwilightForestMod.prefix("block/boss_spawner")).element() + .from(-4, -4, -4) + .to(20, 20, 20) + .allFaces((dir, builder) -> builder*//*.cullface(dir)*//*.uvs(2, 2, 14, 14).texture("#all")) + .end();*/ + + ModelFile bigSpawner = models().cubeAll("boss_spawner", TwilightForestMod.prefix("block/boss_spawner")).renderType(CUTOUT); + + simpleBlock(TFBlocks.NAGA_BOSS_SPAWNER.get(), bigSpawner); + simpleBlock(TFBlocks.LICH_BOSS_SPAWNER.get(), bigSpawner); + simpleBlock(TFBlocks.HYDRA_BOSS_SPAWNER.get(), bigSpawner); + simpleBlock(TFBlocks.UR_GHAST_BOSS_SPAWNER.get(), bigSpawner); + simpleBlock(TFBlocks.KNIGHT_PHANTOM_BOSS_SPAWNER.get(), bigSpawner); + simpleBlock(TFBlocks.SNOW_QUEEN_BOSS_SPAWNER.get(), bigSpawner); + simpleBlock(TFBlocks.MINOSHROOM_BOSS_SPAWNER.get(), bigSpawner); + simpleBlock(TFBlocks.ALPHA_YETI_BOSS_SPAWNER.get(), bigSpawner); + simpleBlock(TFBlocks.FINAL_BOSS_BOSS_SPAWNER.get(), bigSpawner); + simpleBlock(TFBlocks.FIREFLY_JAR.get(), this.makeJar(TFBlocks.FIREFLY_JAR.getId().getPath()) + .texture("cork", prefix("block/firefly_jar_cork"))); + simpleBlockExisting(TFBlocks.FIREFLY_SPAWNER.get()); + simpleBlock(TFBlocks.CICADA_JAR.get(), this.makeJar(TFBlocks.CICADA_JAR.getId().getPath()) + .texture("cork", prefix("block/cicada_jar_cork"))); + registerPlantBlocks(); + simpleBlock(TFBlocks.ROOT_BLOCK.get()); + simpleBlock(TFBlocks.LIVEROOT_BLOCK.get()); + simpleBlock(TFBlocks.MANGROVE_ROOT.get()); + + ModelFile glowing = this.make2LayerCubeNoBottom(TFBlocks.UNCRAFTING_TABLE.getId().getPath() + "_glowing", TRANSLUCENT, 0, 15, true) + .texture("top", prefix("block/uncrafting_top")) + .texture("north", prefix("block/uncrafting_side")) + .texture("south", prefix("block/uncrafting_side")) + .texture("west", prefix("block/uncrafting_side")) + .texture("east", prefix("block/uncrafting_side")) + .texture("bottom", new ResourceLocation("block/jungle_planks")) + .texture("top2", prefix("block/uncrafting_glow")) + .texture("north2", prefix("block/uncrafting_glow_side")) + .texture("south2", prefix("block/uncrafting_glow_side")) + .texture("west2", prefix("block/uncrafting_glow_side")) + .texture("east2", prefix("block/uncrafting_glow_side")); + + ModelFile notglowing = this.makeCubeWithTopLayer(TFBlocks.UNCRAFTING_TABLE.getId().getPath(), TRANSLUCENT, 0, 15) + .texture("top", prefix("block/uncrafting_top")) + .texture("north", prefix("block/uncrafting_side")) + .texture("south", prefix("block/uncrafting_side")) + .texture("west", prefix("block/uncrafting_side")) + .texture("east", prefix("block/uncrafting_side")) + .texture("bottom", new ResourceLocation("block/jungle_planks")) + .texture("top2", prefix("block/uncrafting_glow")); + + getVariantBuilder(TFBlocks.UNCRAFTING_TABLE.get()).forAllStates(s -> ConfiguredModel.builder().modelFile(s.getValue(UncraftingTableBlock.POWERED) ? glowing : notglowing).build()); + registerSmokersAndJets(); + axisBlock(TFBlocks.TWISTED_STONE.get(), prefix("block/stone_twist/twist_side"), prefix("block/stone_twist/twist_end")); + axisBlock(TFBlocks.BOLD_STONE_PILLAR.get(), prefix("block/stone_pillar_side"), prefix("block/stone_pillar_end")); + simpleBlock(TFBlocks.EMPTY_CANOPY_BOOKSHELF.get(), models().cubeColumn("empty_canopy_bookshelf", prefix("block/wood/bookshelf_spawner/bookshelf_empty"), prefix("block/wood/planks_canopy_0"))); + simpleBlock(TFBlocks.CANOPY_BOOKSHELF.get(), ConfiguredModel.builder() + .weight(3).modelFile(models().cubeColumn("canopy_bookshelf", prefix("block/wood/bookshelf_canopy"), prefix("block/wood/planks_canopy_0"))).nextModel() + .modelFile(models().cubeColumn("canopy_bookshelf_1", prefix("block/wood/bookshelf_canopy_1"), prefix("block/wood/planks_canopy_0"))).nextModel() + .modelFile(models().cubeColumn("canopy_bookshelf_2", prefix("block/wood/bookshelf_canopy_2"), prefix("block/wood/planks_canopy_0"))).nextModel() + .modelFile(models().cubeColumn("canopy_bookshelf_3", prefix("block/wood/bookshelf_canopy_3"), prefix("block/wood/planks_canopy_0"))) + .build()); + //if theres a better way to do this block please do it. I dont want to think about it right now + getVariantBuilder(TFBlocks.DEATH_TOME_SPAWNER.get()).forAllStatesExcept(s -> { + switch (s.getValue(TomeSpawnerBlock.BOOK_STAGES)) { + case 1 -> { + return ConfiguredModel.builder().modelFile(models().cubeColumn("block/death_tome_spawner_1", prefix("block/wood/bookshelf_spawner/bookshelf_1"), prefix("block/wood/planks_canopy_0"))).build(); + } + case 2 -> { + return ConfiguredModel.builder().modelFile(models().cubeColumn("block/death_tome_spawner_2", prefix("block/wood/bookshelf_spawner/bookshelf_2"), prefix("block/wood/planks_canopy_0"))).build(); + } + case 3 -> { + return ConfiguredModel.builder().modelFile(models().cubeColumn("block/death_tome_spawner_3", prefix("block/wood/bookshelf_spawner/bookshelf_3"), prefix("block/wood/planks_canopy_0"))).build(); + } + case 4 -> { + return ConfiguredModel.builder().modelFile(models().cubeColumn("block/death_tome_spawner_4", prefix("block/wood/bookshelf_spawner/bookshelf_4"), prefix("block/wood/planks_canopy_0"))).build(); + } + case 5 -> { + return ConfiguredModel.builder().modelFile(models().cubeColumn("block/death_tome_spawner_5", prefix("block/wood/bookshelf_spawner/bookshelf_5"), prefix("block/wood/planks_canopy_0"))).build(); + } + case 6 -> { + return ConfiguredModel.builder().modelFile(models().cubeColumn("block/death_tome_spawner_6", prefix("block/wood/bookshelf_spawner/bookshelf_6"), prefix("block/wood/planks_canopy_0"))).build(); + } + case 7 -> { + return ConfiguredModel.builder().modelFile(models().cubeColumn("block/death_tome_spawner_7", prefix("block/wood/bookshelf_spawner/bookshelf_7"), prefix("block/wood/planks_canopy_0"))).build(); + } + case 8 -> { + return ConfiguredModel.builder().modelFile(models().cubeColumn("block/death_tome_spawner_8", prefix("block/wood/bookshelf_spawner/bookshelf_8"), prefix("block/wood/planks_canopy_0"))).build(); + } + case 9 -> { + return ConfiguredModel.builder().modelFile(models().cubeColumn("block/death_tome_spawner_9", prefix("block/wood/bookshelf_spawner/bookshelf_9"), prefix("block/wood/planks_canopy_0"))).build(); + } + default -> { + return ConfiguredModel.builder().modelFile(models().cubeColumn("block/death_tome_spawner_10", prefix("block/wood/bookshelf_canopy"), prefix("block/wood/planks_canopy_0"))).build(); + } + } + }, TomeSpawnerBlock.SPAWNER); + + registerWoodBlocks(); + registerNagastone(); + registerForceFields(); + simpleBlock(TFBlocks.POTTED_TWILIGHT_OAK_SAPLING.get(), models().withExistingParent(TFBlocks.POTTED_TWILIGHT_OAK_SAPLING.getId().getPath(), "block/flower_pot_cross").renderType(CUTOUT).texture("plant", blockTexture(TFBlocks.TWILIGHT_OAK_SAPLING.get()))); + simpleBlock(TFBlocks.POTTED_CANOPY_SAPLING.get(), models().withExistingParent(TFBlocks.POTTED_CANOPY_SAPLING.getId().getPath(), "block/flower_pot_cross").renderType(CUTOUT).texture("plant", blockTexture(TFBlocks.CANOPY_SAPLING.get()))); + simpleBlock(TFBlocks.POTTED_MANGROVE_SAPLING.get(), models().withExistingParent(TFBlocks.POTTED_MANGROVE_SAPLING.getId().getPath(), prefix("block/potted_larger_sapling")).renderType(CUTOUT).texture("plant", blockTexture(TFBlocks.MANGROVE_SAPLING.get()))); + simpleBlock(TFBlocks.POTTED_DARKWOOD_SAPLING.get(), models().withExistingParent(TFBlocks.POTTED_DARKWOOD_SAPLING.getId().getPath(), prefix("block/potted_larger_sapling")).renderType(CUTOUT).texture("plant", blockTexture(TFBlocks.DARKWOOD_SAPLING.get()))); + simpleBlock(TFBlocks.POTTED_HOLLOW_OAK_SAPLING.get(), models().withExistingParent(TFBlocks.POTTED_HOLLOW_OAK_SAPLING.getId().getPath(), "block/flower_pot_cross").renderType(CUTOUT).texture("plant", blockTexture(TFBlocks.HOLLOW_OAK_SAPLING.get()))); + simpleBlock(TFBlocks.POTTED_RAINBOW_OAK_SAPLING.get(), models().withExistingParent(TFBlocks.POTTED_RAINBOW_OAK_SAPLING.getId().getPath(), "block/flower_pot_cross").renderType(CUTOUT).texture("plant", blockTexture(TFBlocks.RAINBOW_OAK_SAPLING.get()))); + simpleBlock(TFBlocks.POTTED_TIME_SAPLING.get(), models().withExistingParent(TFBlocks.POTTED_TIME_SAPLING.getId().getPath(), prefix("block/potted_larger_sapling")).renderType(CUTOUT).texture("plant", blockTexture(TFBlocks.TIME_SAPLING.get()))); + simpleBlock(TFBlocks.POTTED_TRANSFORMATION_SAPLING.get(), models().withExistingParent(TFBlocks.POTTED_TRANSFORMATION_SAPLING.getId().getPath(), "block/flower_pot_cross").renderType(CUTOUT).texture("plant", blockTexture(TFBlocks.TRANSFORMATION_SAPLING.get()))); + simpleBlock(TFBlocks.POTTED_MINING_SAPLING.get(), models().withExistingParent(TFBlocks.POTTED_MINING_SAPLING.getId().getPath(), "block/flower_pot_cross").renderType(CUTOUT).texture("plant", blockTexture(TFBlocks.MINING_SAPLING.get()))); + simpleBlock(TFBlocks.POTTED_SORTING_SAPLING.get(), models().withExistingParent(TFBlocks.POTTED_SORTING_SAPLING.getId().getPath(), "block/flower_pot_cross").renderType(CUTOUT).texture("plant", blockTexture(TFBlocks.SORTING_SAPLING.get()))); + simpleBlock(TFBlocks.POTTED_MAYAPPLE.get(), models().getExistingFile(prefix("block/potted_mayapple"))); + simpleBlock(TFBlocks.POTTED_FIDDLEHEAD.get(), models().withExistingParent(TFBlocks.POTTED_FIDDLEHEAD.getId().getPath(), "block/tinted_flower_pot_cross").renderType(CUTOUT).texture("plant", blockTexture(TFBlocks.POTTED_FIDDLEHEAD.get()))); + simpleBlock(TFBlocks.POTTED_MUSHGLOOM.get(), models().withExistingParent(TFBlocks.POTTED_MUSHGLOOM.getId().getPath(), "block/flower_pot_cross").renderType(CUTOUT).texture("plant", blockTexture(TFBlocks.POTTED_MUSHGLOOM.get()))); + simpleBlock(TFBlocks.POTTED_THORN.get(), models().withExistingParent(TFBlocks.POTTED_THORN.getId().getPath(), prefix("block/potted_thorn_template")).texture("thorn_top", prefix("block/brown_thorns_top")).texture("thorn_side", prefix("block/brown_thorns_side"))); + simpleBlock(TFBlocks.POTTED_GREEN_THORN.get(), models().withExistingParent(TFBlocks.POTTED_THORN.getId().getPath(), prefix("block/potted_thorn_template")).texture("thorn_top", prefix("block/green_thorns_top")).texture("thorn_side", prefix("block/green_thorns_side"))); + simpleBlock(TFBlocks.POTTED_DEAD_THORN.get(), models().withExistingParent(TFBlocks.POTTED_THORN.getId().getPath(), prefix("block/potted_thorn_template")).texture("thorn_top", prefix("block/burnt_thorns_top")).texture("thorn_side", prefix("block/burnt_thorns_side"))); + + builtinEntity(TFBlocks.TWILIGHT_OAK_SIGN.get(), "twilightforest:block/wood/planks_twilight_oak_0"); + builtinEntity(TFBlocks.TWILIGHT_WALL_SIGN.get(), "twilightforest:block/wood/planks_twilight_oak_0"); + builtinEntity(TFBlocks.CANOPY_SIGN.get(), "twilightforest:block/wood/planks_canopy_0"); + builtinEntity(TFBlocks.CANOPY_WALL_SIGN.get(), "twilightforest:block/wood/planks_canopy_0"); + builtinEntity(TFBlocks.MANGROVE_SIGN.get(), "twilightforest:block/wood/planks_mangrove_0"); + builtinEntity(TFBlocks.MANGROVE_WALL_SIGN.get(), "twilightforest:block/wood/planks_mangrove_0"); + builtinEntity(TFBlocks.DARK_SIGN.get(), "twilightforest:block/wood/planks_darkwood_0"); + builtinEntity(TFBlocks.DARK_WALL_SIGN.get(), "twilightforest:block/wood/planks_darkwood_0"); + builtinEntity(TFBlocks.TIME_SIGN.get(), "twilightforest:block/wood/planks_time_0"); + builtinEntity(TFBlocks.TIME_WALL_SIGN.get(), "twilightforest:block/wood/planks_time_0"); + builtinEntity(TFBlocks.TRANSFORMATION_SIGN.get(), "twilightforest:block/wood/planks_trans_0"); + builtinEntity(TFBlocks.TRANSFORMATION_WALL_SIGN.get(), "twilightforest:block/wood/planks_trans_0"); + builtinEntity(TFBlocks.MINING_SIGN.get(), "twilightforest:block/wood/planks_mine_0"); + builtinEntity(TFBlocks.MINING_WALL_SIGN.get(), "twilightforest:block/wood/planks_mine_0"); + builtinEntity(TFBlocks.SORTING_SIGN.get(), "twilightforest:block/wood/planks_sort_0"); + builtinEntity(TFBlocks.SORTING_WALL_SIGN.get(), "twilightforest:block/wood/planks_sort_0"); + + builtinEntity(TFBlocks.TWILIGHT_OAK_CHEST.get(), "twilightforest:block/wood/planks_twilight_oak_0"); + builtinEntity(TFBlocks.CANOPY_CHEST.get(), "twilightforest:block/wood/planks_canopy_0"); + builtinEntity(TFBlocks.MANGROVE_CHEST.get(), "twilightforest:block/wood/planks_mangrove_0"); + builtinEntity(TFBlocks.DARK_CHEST.get(), "twilightforest:block/wood/planks_darkwood_0"); + builtinEntity(TFBlocks.TIME_CHEST.get(), "twilightforest:block/wood/planks_time_0"); + builtinEntity(TFBlocks.TRANSFORMATION_CHEST.get(), "twilightforest:block/wood/planks_trans_0"); + builtinEntity(TFBlocks.MINING_CHEST.get(), "twilightforest:block/wood/planks_mine_0"); + builtinEntity(TFBlocks.SORTING_CHEST.get(), "twilightforest:block/wood/planks_sort_0"); + + casketStuff(); + stonePillar(); + candelabra(); + } + + /** + * AVERT YOUR GAZE WHILE SCROLLING PAST THIS METHOD, LOOK FOR TOO LONG AND YOU WILL GO MAD + * if you find a way to trim this down without sacrificing the modularity of the force-fields, feel free + */ + private void registerForceFields() { + String baseName = "block/force_field/force_field"; + //WEST + BlockModelBuilder west = this.models().withExistingParent(baseName + "_west", "minecraft:block/block").texture("particle", "#pane").ao(false) + .element().from(0, 7, 7).to(7, 9, 9).face(Direction.WEST).cullface(Direction.WEST).uvs(7, 7, 9, 9).texture("#pane").emissivity(15, 15).end().shade(false).end(); + + BlockModelBuilder no_west = this.models().withExistingParent(baseName + "_no_west", "minecraft:block/block").texture("particle", "#pane").ao(false) + .element().from(7, 7, 7).to(9, 9, 9).face(Direction.WEST).uvs(7, 7, 9, 9).texture("#pane").emissivity(15, 15).end().shade(false).end(); + //EAST + BlockModelBuilder east = this.models().withExistingParent(baseName + "_east", "minecraft:block/block").texture("particle", "#pane").ao(false) + .element().from(9, 7, 7).to(16, 9, 9).face(Direction.EAST).cullface(Direction.EAST).uvs(7, 7, 9, 9).texture("#pane").emissivity(15, 15).end().shade(false).end(); + + BlockModelBuilder no_east = this.models().withExistingParent(baseName + "_no_east", "minecraft:block/block").texture("particle", "#pane").ao(false) + .element().from(7, 7, 7).to(9, 9, 9).face(Direction.EAST).uvs(7, 7, 9, 9).texture("#pane").emissivity(15, 15).end().shade(false).end(); + //DOWN + BlockModelBuilder down = this.models().withExistingParent(baseName + "_down", "minecraft:block/block").texture("particle", "#pane").ao(false) + .element().from(7, 0, 7).to(9, 7, 9).face(Direction.DOWN).cullface(Direction.DOWN).uvs(7, 7, 9, 9).texture("#pane").emissivity(15, 15).end().shade(false).end(); + + BlockModelBuilder no_down = this.models().withExistingParent(baseName + "_no_down", "minecraft:block/block").texture("particle", "#pane").ao(false) + .element().from(7, 7, 7).to(9, 9, 9).face(Direction.DOWN).uvs(7, 7, 9, 9).texture("#pane").emissivity(15, 15).end().shade(false).end(); + //UP + BlockModelBuilder up = this.models().withExistingParent(baseName + "_up", "minecraft:block/block").texture("particle", "#pane").ao(false) + .element().from(7, 9, 7).to(9, 16, 9).face(Direction.UP).cullface(Direction.UP).uvs(7, 7, 9, 9).texture("#pane").emissivity(15, 15).end().shade(false).end(); + + BlockModelBuilder no_up = this.models().withExistingParent(baseName + "_no_up", "minecraft:block/block").texture("particle", "#pane").ao(false) + .element().from(7, 7, 7).to(9, 9, 9).face(Direction.UP).uvs(7, 7, 9, 9).texture("#pane").emissivity(15, 15).end().shade(false).end(); + //NORTH + BlockModelBuilder north = this.models().withExistingParent(baseName + "_north", "minecraft:block/block").texture("particle", "#pane").ao(false) + .element().from(7, 7, 0).to(9, 9, 7).face(Direction.NORTH).cullface(Direction.NORTH).uvs(7, 7, 9, 9).texture("#pane").emissivity(15, 15).end().shade(false).end(); + + BlockModelBuilder no_north = this.models().withExistingParent(baseName + "_no_north", "minecraft:block/block").texture("particle", "#pane").ao(false) + .element().from(7, 7, 7).to(9, 9, 9).face(Direction.NORTH).uvs(7, 7, 9, 9).texture("#pane").emissivity(15, 15).end().shade(false).end(); + //SOUTH + BlockModelBuilder south = this.models().withExistingParent(baseName + "_south", "minecraft:block/block").texture("particle", "#pane").ao(false) + .element().from(7, 7, 9).to(9, 9, 16).face(Direction.SOUTH).cullface(Direction.SOUTH).uvs(7, 7, 9, 9).texture("#pane").emissivity(15, 15).end().shade(false).end(); + + BlockModelBuilder no_south = this.models().withExistingParent(baseName + "_no_south", "minecraft:block/block").texture("particle", "#pane").ao(false) + .element().from(7, 7, 7).to(9, 9, 9).face(Direction.SOUTH).uvs(7, 7, 9, 9).texture("#pane").emissivity(15, 15).end().shade(false).end(); + //DOWN WEST + BlockModelBuilder down_west = this.models().withExistingParent(baseName + "_down_west", "minecraft:block/block").texture("particle", "#pane").ao(false) + .element().from(0, 0, 7).to(7, 7, 9) + .face(Direction.DOWN).cullface(Direction.DOWN).uvs(0, 7, 7, 9).end() + .face(Direction.WEST).cullface(Direction.WEST).uvs(7, 0, 9, 7).end() + .face(Direction.NORTH).uvs(0, 0, 7, 7).end() + .face(Direction.SOUTH).uvs(9, 0, 16, 7).end().faces((direction, builder) -> builder.texture("#pane").emissivity(15, 15)).shade(false).end(); + + BlockModelBuilder down_no_west = this.models().withExistingParent(baseName + "_down_no_west", "minecraft:block/block").texture("particle", "#pane").ao(false) + .element().from(7, 0, 7).to(9, 7, 9).face(Direction.WEST).uvs(7, 0, 9, 7).texture("#pane").emissivity(15, 15).end().shade(false).end(); + + BlockModelBuilder west_no_down = this.models().withExistingParent(baseName + "_west_no_down", "minecraft:block/block").texture("particle", "#pane").ao(false) + .element().from(0, 7, 7).to(7, 9, 9).face(Direction.DOWN).uvs(0, 7, 7, 9).texture("#pane").emissivity(15, 15).end().shade(false).end(); + //DOWN EAST + BlockModelBuilder down_east = this.models().withExistingParent(baseName + "_down_east", "minecraft:block/block").texture("particle", "#pane").ao(false) + .element().from(9, 0, 7).to(16, 7, 9) + .face(Direction.DOWN).cullface(Direction.DOWN).uvs(9, 7, 16, 9).end() + .face(Direction.EAST).cullface(Direction.EAST).uvs(7, 0, 9, 7).end() + .face(Direction.NORTH).uvs(9, 0, 16, 7).end() + .face(Direction.SOUTH).uvs(0, 0, 7, 7).end().faces((direction, builder) -> builder.texture("#pane").emissivity(15, 15)).shade(false).end(); + + BlockModelBuilder down_no_east = this.models().withExistingParent(baseName + "_down_no_east", "minecraft:block/block").texture("particle", "#pane").ao(false) + .element().from(7, 0, 7).to(9, 7, 9).face(Direction.EAST).uvs(7, 0, 9, 7).texture("#pane").emissivity(15, 15).end().shade(false).end(); + + BlockModelBuilder east_no_down = this.models().withExistingParent(baseName + "_east_no_down", "minecraft:block/block").texture("particle", "#pane").ao(false) + .element().from(9, 7, 7).to(16, 9, 9).face(Direction.DOWN).uvs(9, 7, 16, 9).texture("#pane").emissivity(15, 15).end().shade(false).end(); + //DOWN NORTH + BlockModelBuilder down_north = this.models().withExistingParent(baseName + "_down_north", "minecraft:block/block").texture("particle", "#pane").ao(false) + .element().from(7, 0, 0).to(9, 7, 7) + .face(Direction.DOWN).cullface(Direction.DOWN).uvs(7, 0, 9, 7).end() + .face(Direction.NORTH).cullface(Direction.NORTH).uvs(7, 0, 9, 7).end() + .face(Direction.WEST).uvs(0, 0, 7, 7).end() + .face(Direction.EAST).uvs(9, 9, 16, 16).end().faces((direction, builder) -> builder.texture("#pane").emissivity(15, 15)).shade(false).end(); + + BlockModelBuilder down_no_north = this.models().withExistingParent(baseName + "_down_no_north", "minecraft:block/block").texture("particle", "#pane").ao(false) + .element().from(7, 0, 7).to(9, 7, 9).face(Direction.NORTH).uvs(7, 0, 9, 7).texture("#pane").emissivity(15, 15).end().shade(false).end(); + + BlockModelBuilder north_no_down = this.models().withExistingParent(baseName + "_north_no_down", "minecraft:block/block").texture("particle", "#pane").ao(false) + .element().from(7, 7, 0).to(9, 9, 7).face(Direction.DOWN).uvs(7, 0, 9, 7).texture("#pane").emissivity(15, 15).end().shade(false).end(); + //DOWN SOUTH + BlockModelBuilder down_south = this.models().withExistingParent(baseName + "_down_south", "minecraft:block/block").texture("particle", "#pane").ao(false) + .element().from(7, 0, 9).to(9, 7, 16) + .face(Direction.DOWN).cullface(Direction.DOWN).uvs(7, 9, 9, 16).end() + .face(Direction.SOUTH).cullface(Direction.SOUTH).uvs(7, 0, 9, 7).end() + .face(Direction.WEST).uvs(9, 0, 16, 7).end() + .face(Direction.EAST).uvs(0, 0, 7, 7).end().faces((direction, builder) -> builder.texture("#pane").emissivity(15, 15)).shade(false).end(); + + BlockModelBuilder down_no_south = this.models().withExistingParent(baseName + "_down_no_south", "minecraft:block/block").texture("particle", "#pane").ao(false) + .element().from(7, 0, 7).to(9, 7, 9).face(Direction.SOUTH).uvs(7, 0, 9, 7).texture("#pane").emissivity(15, 15).end().shade(false).end(); + + BlockModelBuilder south_no_down = this.models().withExistingParent(baseName + "_south_no_down", "minecraft:block/block").texture("particle", "#pane").ao(false) + .element().from(7, 7, 9).to(9, 9, 16).face(Direction.DOWN).uvs(7, 9, 9, 16).texture("#pane").emissivity(15, 15).end().shade(false).end(); + //UP WEST + BlockModelBuilder up_west = this.models().withExistingParent(baseName + "_up_west", "minecraft:block/block").texture("particle", "#pane").ao(false) + .element().from(0, 9, 7).to(7, 16, 9) + .face(Direction.UP).cullface(Direction.UP).uvs(0, 7, 7, 9).end() + .face(Direction.WEST).cullface(Direction.WEST).uvs(7, 9, 9, 16).end() + .face(Direction.NORTH).uvs(0, 9, 7, 16).end() + .face(Direction.SOUTH).uvs(9, 9, 16, 16).end().faces((direction, builder) -> builder.texture("#pane").emissivity(15, 15)).shade(false).end(); + + BlockModelBuilder up_no_west = this.models().withExistingParent(baseName + "_up_no_west", "minecraft:block/block").texture("particle", "#pane").ao(false) + .element().from(7, 9, 7).to(9, 16, 9).face(Direction.WEST).uvs(7, 9, 9, 16).texture("#pane").emissivity(15, 15).end().shade(false).end(); + + BlockModelBuilder west_no_up = this.models().withExistingParent(baseName + "_west_no_up", "minecraft:block/block").texture("particle", "#pane").ao(false) + .element().from(0, 7, 7).to(7, 9, 9).face(Direction.UP).uvs(0, 7, 7, 9).texture("#pane").emissivity(15, 15).end().shade(false).end(); + //UP EAST + BlockModelBuilder up_east = this.models().withExistingParent(baseName + "_up_east", "minecraft:block/block").texture("particle", "#pane").ao(false) + .element().from(9, 9, 7).to(16, 16, 9) + .face(Direction.UP).cullface(Direction.UP).uvs(9, 7, 16, 9).end() + .face(Direction.EAST).cullface(Direction.EAST).uvs(7, 9, 9, 16).end() + .face(Direction.NORTH).uvs(9, 9, 16, 16).end() + .face(Direction.SOUTH).uvs(0, 9, 7, 16).end().faces((direction, builder) -> builder.texture("#pane").emissivity(15, 15)).shade(false).end(); + + BlockModelBuilder up_no_east = this.models().withExistingParent(baseName + "_up_no_east", "minecraft:block/block").texture("particle", "#pane").ao(false) + .element().from(7, 9, 7).to(9, 16, 9).face(Direction.EAST).uvs(7, 9, 9, 16).texture("#pane").emissivity(15, 15).end().shade(false).end(); + + BlockModelBuilder east_no_up = this.models().withExistingParent(baseName + "_east_no_up", "minecraft:block/block").texture("particle", "#pane").ao(false) + .element().from(9, 7, 7).to(16, 9, 9).face(Direction.UP).uvs(9, 7, 16, 9).texture("#pane").emissivity(15, 15).end().shade(false).end(); + //UP NORTH + BlockModelBuilder up_north = this.models().withExistingParent(baseName + "_up_north", "minecraft:block/block").texture("particle", "#pane").ao(false) + .element().from(7, 9, 0).to(9, 16, 7) + .face(Direction.UP).cullface(Direction.UP).uvs(7, 0, 9, 7).end() + .face(Direction.NORTH).cullface(Direction.NORTH).uvs(7, 9, 9, 16).end() + .face(Direction.WEST).uvs(0, 9, 7, 16).end() + .face(Direction.EAST).uvs(9, 9, 16, 16).end().faces((direction, builder) -> builder.texture("#pane").emissivity(15, 15)).shade(false).end(); + + BlockModelBuilder up_no_north = this.models().withExistingParent(baseName + "_up_no_north", "minecraft:block/block").texture("particle", "#pane").ao(false) + .element().from(7, 9, 7).to(9, 16, 9).face(Direction.NORTH).uvs(7, 9, 9, 16).texture("#pane").emissivity(15, 15).end().shade(false).end(); + + BlockModelBuilder north_no_up = this.models().withExistingParent(baseName + "_north_no_up", "minecraft:block/block").texture("particle", "#pane").ao(false) + .element().from(7, 7, 0).to(9, 9, 7).face(Direction.UP).uvs(7, 0, 9, 7).texture("#pane").emissivity(15, 15).end().shade(false).end(); + //UP SOUTH + BlockModelBuilder up_south = this.models().withExistingParent(baseName + "_up_south", "minecraft:block/block").texture("particle", "#pane").ao(false) + .element().from(7, 9, 9).to(9, 16, 16) + .face(Direction.UP).cullface(Direction.UP).uvs(7, 9, 9, 16).end() + .face(Direction.SOUTH).cullface(Direction.SOUTH).uvs(7, 9, 9, 16).end() + .face(Direction.WEST).uvs(9, 9, 16, 16).end() + .face(Direction.EAST).uvs(0, 9, 7, 16).end().faces((direction, builder) -> builder.texture("#pane").emissivity(15, 15)).shade(false).end(); + + BlockModelBuilder up_no_south = this.models().withExistingParent(baseName + "_up_no_south", "minecraft:block/block").texture("particle", "#pane").ao(false) + .element().from(7, 9, 7).to(9, 16, 9).face(Direction.SOUTH).uvs(7, 9, 9, 16).texture("#pane").emissivity(15, 15).end().shade(false).end(); + + BlockModelBuilder south_no_up = this.models().withExistingParent(baseName + "_south_no_up", "minecraft:block/block").texture("particle", "#pane").ao(false) + .element().from(7, 7, 9).to(9, 9, 16).face(Direction.UP).uvs(7, 9, 9, 16).texture("#pane").emissivity(15, 15).end().shade(false).end(); + //NORTH WEST + BlockModelBuilder north_west = this.models().withExistingParent(baseName + "_north_west", "minecraft:block/block").texture("particle", "#pane").ao(false) + .element().from(0, 7, 0).to(7, 9, 7) + .face(Direction.NORTH).cullface(Direction.NORTH).uvs(0, 7, 7, 9).end() + .face(Direction.WEST).cullface(Direction.WEST).uvs(9, 7, 16, 9).end() + .face(Direction.DOWN).uvs(0, 9, 7, 16).end() + .face(Direction.UP).uvs(9, 9, 16, 16).end().faces((direction, builder) -> builder.texture("#pane").emissivity(15, 15)).shade(false).end(); + + BlockModelBuilder north_no_west = this.models().withExistingParent(baseName + "_north_no_west", "minecraft:block/block").texture("particle", "#pane").ao(false) + .element().from(7, 7, 0).to(9, 9, 7).face(Direction.WEST).uvs(9, 7, 16, 9).texture("#pane").emissivity(15, 15).end().shade(false).end(); + + BlockModelBuilder west_no_north = this.models().withExistingParent(baseName + "_west_no_north", "minecraft:block/block").texture("particle", "#pane").ao(false) + .element().from(0, 7, 7).to(7, 9, 9).face(Direction.NORTH).uvs(0, 7, 7, 9).texture("#pane").emissivity(15, 15).end().shade(false).end(); + //NORTH EAST + BlockModelBuilder north_east = this.models().withExistingParent(baseName + "_north_east", "minecraft:block/block").texture("particle", "#pane").ao(false) + .element().from(9, 7, 0).to(16, 9, 7) + .face(Direction.NORTH).cullface(Direction.NORTH).uvs(9, 7, 16, 9).end() + .face(Direction.EAST).cullface(Direction.EAST).uvs(0, 7, 7, 9).end() + .face(Direction.DOWN).uvs(9, 9, 16, 16).end() + .face(Direction.UP).uvs(0, 9, 7, 16).end().faces((direction, builder) -> builder.texture("#pane").emissivity(15, 15)).shade(false).end(); + + BlockModelBuilder north_no_east = this.models().withExistingParent(baseName + "_north_no_east", "minecraft:block/block").texture("particle", "#pane").ao(false) + .element().from(7, 7, 0).to(9, 9, 7).face(Direction.EAST).uvs(0, 7, 7, 9).texture("#pane").emissivity(15, 15).end().shade(false).end(); + + BlockModelBuilder east_no_north = this.models().withExistingParent(baseName + "_east_no_north", "minecraft:block/block").texture("particle", "#pane").ao(false) + .element().from(9, 7, 7).to(16, 9, 9).face(Direction.NORTH).uvs(9, 7, 16, 9).texture("#pane").emissivity(15, 15).end().shade(false).end(); + //SOUTH WEST + BlockModelBuilder south_west = this.models().withExistingParent(baseName + "_south_west", "minecraft:block/block").texture("particle", "#pane").ao(false) + .element().from(0, 7, 9).to(7, 9, 16) + .face(Direction.SOUTH).cullface(Direction.SOUTH).uvs(0, 7, 7, 9).end() + .face(Direction.WEST).cullface(Direction.WEST).uvs(9, 7, 16, 9).end() + .face(Direction.DOWN).uvs(0, 9, 7, 16).end() + .face(Direction.UP).uvs(9, 9, 16, 16).end().faces((direction, builder) -> builder.texture("#pane").emissivity(15, 15)).shade(false).end(); + + BlockModelBuilder south_no_west = this.models().withExistingParent(baseName + "_south_no_west", "minecraft:block/block").texture("particle", "#pane").ao(false) + .element().from(7, 7, 9).to(9, 9, 16).face(Direction.WEST).uvs(9, 7, 16, 9).texture("#pane").emissivity(15, 15).end().shade(false).end(); + + BlockModelBuilder west_no_south = this.models().withExistingParent(baseName + "_west_no_south", "minecraft:block/block").texture("particle", "#pane").ao(false) + .element().from(0, 7, 7).to(7, 9, 9).face(Direction.SOUTH).uvs(0, 7, 7, 9).texture("#pane").emissivity(15, 15).end().shade(false).end(); + //SOUTH EAST + BlockModelBuilder south_east = this.models().withExistingParent(baseName + "_south_east", "minecraft:block/block").texture("particle", "#pane").ao(false) + .element().from(9, 7, 9).to(16, 9, 16) + .face(Direction.SOUTH).cullface(Direction.SOUTH).uvs(0, 7, 7, 9).end() + .face(Direction.EAST).cullface(Direction.EAST).uvs(9, 7, 16, 9).end() + .face(Direction.DOWN).uvs(9, 9, 16, 16).end() + .face(Direction.UP).uvs(0, 9, 7, 16).end().faces((direction, builder) -> builder.texture("#pane").emissivity(15, 15)).shade(false).end(); + + BlockModelBuilder south_no_east = this.models().withExistingParent(baseName + "_south_no_east", "minecraft:block/block").texture("particle", "#pane").ao(false) + .element().from(7, 7, 9).to(9, 9, 16).face(Direction.EAST).uvs(9, 7, 16, 9).texture("#pane").emissivity(15, 15).end().shade(false).end(); + + BlockModelBuilder east_no_south = this.models().withExistingParent(baseName + "_east_no_south", "minecraft:block/block").texture("particle", "#pane").ao(false) + .element().from(9, 7, 7).to(16, 9, 9).face(Direction.SOUTH).uvs(0, 7, 7, 9).texture("#pane").emissivity(15, 15).end().shade(false).end(); + + for (RegistryObject block : ImmutableList.of(TFBlocks.PINK_FORCE_FIELD, TFBlocks.BLUE_FORCE_FIELD, TFBlocks.GREEN_FORCE_FIELD, TFBlocks.VIOLET_FORCE_FIELD, TFBlocks.ORANGE_FORCE_FIELD)) { + String blockName = "block/force_field/" + block.getId().getPath(); + ResourceLocation textureLocation = prefix("block/" + block.getId().getPath()); + + ModelFile west_child = models().withExistingParent(blockName + "_west", west.getLocation()).renderType(TRANSLUCENT).texture("pane", textureLocation); + ModelFile no_west_child = models().withExistingParent(blockName + "_no_west", no_west.getLocation()).renderType(TRANSLUCENT).texture("pane", textureLocation); + ModelFile east_child = models().withExistingParent(blockName + "_east", east.getLocation()).renderType(TRANSLUCENT).texture("pane", textureLocation); + ModelFile no_east_child = models().withExistingParent(blockName + "_no_east", no_east.getLocation()).renderType(TRANSLUCENT).texture("pane", textureLocation); + ModelFile down_child = models().withExistingParent(blockName + "_down", down.getLocation()).renderType(TRANSLUCENT).texture("pane", textureLocation); + ModelFile no_down_child = models().withExistingParent(blockName + "_no_down", no_down.getLocation()).renderType(TRANSLUCENT).texture("pane", textureLocation); + ModelFile up_child = models().withExistingParent(blockName + "_up", up.getLocation()).renderType(TRANSLUCENT).texture("pane", textureLocation); + ModelFile no_up_child = models().withExistingParent(blockName + "_no_up", no_up.getLocation()).renderType(TRANSLUCENT).texture("pane", textureLocation); + ModelFile north_child = models().withExistingParent(blockName + "_north", north.getLocation()).renderType(TRANSLUCENT).texture("pane", textureLocation); + ModelFile no_north_child = models().withExistingParent(blockName + "_no_north", no_north.getLocation()).renderType(TRANSLUCENT).texture("pane", textureLocation); + ModelFile south_child = models().withExistingParent(blockName + "_south", south.getLocation()).renderType(TRANSLUCENT).texture("pane", textureLocation); + ModelFile no_south_child = models().withExistingParent(blockName + "_no_south", no_south.getLocation()).renderType(TRANSLUCENT).texture("pane", textureLocation); + ModelFile down_west_child = models().withExistingParent(blockName + "_down_west", down_west.getLocation()).renderType(TRANSLUCENT).texture("pane", textureLocation); + ModelFile down_no_west_child = models().withExistingParent(blockName + "_down_no_west", down_no_west.getLocation()).renderType(TRANSLUCENT).texture("pane", textureLocation); + ModelFile west_no_down_child = models().withExistingParent(blockName + "_west_no_down", west_no_down.getLocation()).renderType(TRANSLUCENT).texture("pane", textureLocation); + ModelFile down_east_child = models().withExistingParent(blockName + "_down_east", down_east.getLocation()).renderType(TRANSLUCENT).texture("pane", textureLocation); + ModelFile down_no_east_child = models().withExistingParent(blockName + "_down_no_east", down_no_east.getLocation()).renderType(TRANSLUCENT).texture("pane", textureLocation); + ModelFile east_no_down_child = models().withExistingParent(blockName + "_east_no_down", east_no_down.getLocation()).renderType(TRANSLUCENT).texture("pane", textureLocation); + ModelFile down_north_child = models().withExistingParent(blockName + "_down_north", down_north.getLocation()).renderType(TRANSLUCENT).texture("pane", textureLocation); + ModelFile down_no_north_child = models().withExistingParent(blockName + "_down_no_north", down_no_north.getLocation()).renderType(TRANSLUCENT).texture("pane", textureLocation); + ModelFile north_no_down_child = models().withExistingParent(blockName + "_north_no_down", north_no_down.getLocation()).renderType(TRANSLUCENT).texture("pane", textureLocation); + ModelFile down_south_child = models().withExistingParent(blockName + "_down_south", down_south.getLocation()).renderType(TRANSLUCENT).texture("pane", textureLocation); + ModelFile down_no_south_child = models().withExistingParent(blockName + "_down_no_south", down_no_south.getLocation()).renderType(TRANSLUCENT).texture("pane", textureLocation); + ModelFile south_no_down_child = models().withExistingParent(blockName + "_south_no_down", south_no_down.getLocation()).renderType(TRANSLUCENT).texture("pane", textureLocation); + ModelFile up_west_child = models().withExistingParent(blockName + "_up_west", up_west.getLocation()).renderType(TRANSLUCENT).texture("pane", textureLocation); + ModelFile up_no_west_child = models().withExistingParent(blockName + "_up_no_west", up_no_west.getLocation()).renderType(TRANSLUCENT).texture("pane", textureLocation); + ModelFile west_no_up_child = models().withExistingParent(blockName + "_west_no_up", west_no_up.getLocation()).renderType(TRANSLUCENT).texture("pane", textureLocation); + ModelFile up_east_child = models().withExistingParent(blockName + "_up_east", up_east.getLocation()).renderType(TRANSLUCENT).texture("pane", textureLocation); + ModelFile up_no_east_child = models().withExistingParent(blockName + "_up_no_east", up_no_east.getLocation()).renderType(TRANSLUCENT).texture("pane", textureLocation); + ModelFile east_no_up_child = models().withExistingParent(blockName + "_east_no_up", east_no_up.getLocation()).renderType(TRANSLUCENT).texture("pane", textureLocation); + ModelFile up_north_child = models().withExistingParent(blockName + "_up_north", up_north.getLocation()).renderType(TRANSLUCENT).texture("pane", textureLocation); + ModelFile up_no_north_child = models().withExistingParent(blockName + "_up_no_north", up_no_north.getLocation()).renderType(TRANSLUCENT).texture("pane", textureLocation); + ModelFile north_no_up_child = models().withExistingParent(blockName + "_north_no_up", north_no_up.getLocation()).renderType(TRANSLUCENT).texture("pane", textureLocation); + ModelFile up_south_child = models().withExistingParent(blockName + "_up_south", up_south.getLocation()).renderType(TRANSLUCENT).texture("pane", textureLocation); + ModelFile up_no_south_child = models().withExistingParent(blockName + "_up_no_south", up_no_south.getLocation()).renderType(TRANSLUCENT).texture("pane", textureLocation); + ModelFile south_no_up_child = models().withExistingParent(blockName + "_south_no_up", south_no_up.getLocation()).renderType(TRANSLUCENT).texture("pane", textureLocation); + ModelFile north_west_child = models().withExistingParent(blockName + "_north_west", north_west.getLocation()).renderType(TRANSLUCENT).texture("pane", textureLocation); + ModelFile north_no_west_child = models().withExistingParent(blockName + "_north_no_west", north_no_west.getLocation()).renderType(TRANSLUCENT).texture("pane", textureLocation); + ModelFile west_no_north_child = models().withExistingParent(blockName + "_west_no_north", west_no_north.getLocation()).renderType(TRANSLUCENT).texture("pane", textureLocation); + ModelFile north_east_child = models().withExistingParent(blockName + "_north_east", north_east.getLocation()).renderType(TRANSLUCENT).texture("pane", textureLocation); + ModelFile north_no_east_child = models().withExistingParent(blockName + "_north_no_east", north_no_east.getLocation()).renderType(TRANSLUCENT).texture("pane", textureLocation); + ModelFile east_no_north_child = models().withExistingParent(blockName + "_east_no_north", east_no_north.getLocation()).renderType(TRANSLUCENT).texture("pane", textureLocation); + ModelFile south_west_child = models().withExistingParent(blockName + "_south_west", south_west.getLocation()).renderType(TRANSLUCENT).texture("pane", textureLocation); + ModelFile south_no_west_child = models().withExistingParent(blockName + "_south_no_west", south_no_west.getLocation()).renderType(TRANSLUCENT).texture("pane", textureLocation); + ModelFile west_no_south_child = models().withExistingParent(blockName + "_west_no_south", west_no_south.getLocation()).renderType(TRANSLUCENT).texture("pane", textureLocation); + ModelFile south_east_child = models().withExistingParent(blockName + "_south_east", south_east.getLocation()).renderType(TRANSLUCENT).texture("pane", textureLocation); + ModelFile south_no_east_child = models().withExistingParent(blockName + "_south_no_east", south_no_east.getLocation()).renderType(TRANSLUCENT).texture("pane", textureLocation); + ModelFile east_no_south_child = models().withExistingParent(blockName + "_east_no_south", east_no_south.getLocation()).renderType(TRANSLUCENT).texture("pane", textureLocation); + + MultiPartBlockStateBuilder builder = getMultipartBuilder(block.get()) + .part().modelFile(west_child).uvLock(true).addModel().condition(PipeBlock.WEST, true).end() + .part().modelFile(no_west_child).uvLock(true).addModel().condition(PipeBlock.WEST, false).end() + .part().modelFile(east_child).uvLock(true).addModel().condition(PipeBlock.EAST, true).end() + .part().modelFile(no_east_child).uvLock(true).addModel().condition(PipeBlock.EAST, false).end() + .part().modelFile(down_child).uvLock(true).addModel().condition(PipeBlock.DOWN, true).end() + .part().modelFile(no_down_child).uvLock(true).addModel().condition(PipeBlock.DOWN, false).end() + .part().modelFile(up_child).uvLock(true).addModel().condition(PipeBlock.UP, true).end() + .part().modelFile(no_up_child).uvLock(true).addModel().condition(PipeBlock.UP, false).end() + .part().modelFile(north_child).uvLock(true).addModel().condition(PipeBlock.NORTH, true).end() + .part().modelFile(no_north_child).uvLock(true).addModel().condition(PipeBlock.NORTH, false).end() + .part().modelFile(south_child).uvLock(true).addModel().condition(PipeBlock.SOUTH, true).end() + .part().modelFile(no_south_child).uvLock(true).addModel().condition(PipeBlock.SOUTH, false).end(); + + builder = builder.part().modelFile(down_west_child).uvLock(true).addModel() + .nestedGroup().condition(PipeBlock.DOWN, true).condition(PipeBlock.WEST, true).condition(PipeBlock.NORTH, false).end().useOr() + .nestedGroup().condition(PipeBlock.DOWN, true).condition(PipeBlock.WEST, true).condition(PipeBlock.SOUTH, false).end().useOr() + .nestedGroup().condition(PipeBlock.DOWN, true).condition(PipeBlock.WEST, true).condition(BlockStateProperties.AXIS, Direction.Axis.Y, Direction.Axis.X).end().end(); + + builder = builder.part().modelFile(down_no_west_child).uvLock(true).addModel() + .nestedGroup().condition(PipeBlock.DOWN, true).condition(PipeBlock.WEST, false).end().useOr() + .nestedGroup().condition(PipeBlock.DOWN, true).condition(PipeBlock.WEST, true).condition(PipeBlock.NORTH, true).condition(PipeBlock.SOUTH, true).condition(BlockStateProperties.AXIS, Direction.Axis.Z).end().useOr() + .nestedGroup().condition(PipeBlock.DOWN, true).condition(PipeBlock.WEST, true).condition(BlockStateProperties.AXIS, Direction.Axis.Z).end().end(); + + builder = builder.part().modelFile(west_no_down_child).uvLock(true).addModel() + .nestedGroup().condition(PipeBlock.DOWN, false).condition(PipeBlock.WEST, true).end().useOr() + .nestedGroup().condition(PipeBlock.DOWN, true).condition(PipeBlock.WEST, true).condition(PipeBlock.NORTH, true).condition(PipeBlock.SOUTH, true).condition(BlockStateProperties.AXIS, Direction.Axis.Z).end().useOr() + .nestedGroup().condition(PipeBlock.DOWN, true).condition(PipeBlock.WEST, true).condition(BlockStateProperties.AXIS, Direction.Axis.Z).end().end(); + + builder = builder.part().modelFile(down_east_child).uvLock(true).addModel() + .nestedGroup().condition(PipeBlock.DOWN, true).condition(PipeBlock.EAST, true).condition(PipeBlock.NORTH, false).end().useOr() + .nestedGroup().condition(PipeBlock.DOWN, true).condition(PipeBlock.EAST, true).condition(PipeBlock.SOUTH, false).end().useOr() + .nestedGroup().condition(PipeBlock.DOWN, true).condition(PipeBlock.EAST, true).condition(BlockStateProperties.AXIS, Direction.Axis.Y, Direction.Axis.X).end().end(); + + builder = builder.part().modelFile(down_no_east_child).uvLock(true).addModel() + .nestedGroup().condition(PipeBlock.DOWN, true).condition(PipeBlock.EAST, false).end().useOr() + .nestedGroup().condition(PipeBlock.DOWN, true).condition(PipeBlock.EAST, true).condition(PipeBlock.NORTH, true).condition(PipeBlock.SOUTH, true).condition(BlockStateProperties.AXIS, Direction.Axis.Z).end().useOr() + .nestedGroup().condition(PipeBlock.DOWN, true).condition(PipeBlock.EAST, true).condition(BlockStateProperties.AXIS, Direction.Axis.Z).end().end(); + + builder = builder.part().modelFile(east_no_down_child).uvLock(true).addModel() + .nestedGroup().condition(PipeBlock.DOWN, false).condition(PipeBlock.EAST, true).end().useOr() + .nestedGroup().condition(PipeBlock.DOWN, true).condition(PipeBlock.EAST, true).condition(PipeBlock.NORTH, true).condition(PipeBlock.SOUTH, true).condition(BlockStateProperties.AXIS, Direction.Axis.Z).end().useOr() + .nestedGroup().condition(PipeBlock.DOWN, true).condition(PipeBlock.EAST, true).condition(BlockStateProperties.AXIS, Direction.Axis.Z).end().end(); + + builder = builder.part().modelFile(down_north_child).uvLock(true).addModel() + .nestedGroup().condition(PipeBlock.DOWN, true).condition(PipeBlock.NORTH, true).condition(PipeBlock.WEST, false).end().useOr() + .nestedGroup().condition(PipeBlock.DOWN, true).condition(PipeBlock.NORTH, true).condition(PipeBlock.EAST, false).end().useOr() + .nestedGroup().condition(PipeBlock.DOWN, true).condition(PipeBlock.NORTH, true).condition(BlockStateProperties.AXIS, Direction.Axis.Y, Direction.Axis.Z).end().end(); + + builder = builder.part().modelFile(down_no_north_child).uvLock(true).addModel() + .nestedGroup().condition(PipeBlock.DOWN, true).condition(PipeBlock.NORTH, false).end().useOr() + .nestedGroup().condition(PipeBlock.DOWN, true).condition(PipeBlock.NORTH, true).condition(PipeBlock.WEST, true).condition(PipeBlock.EAST, true).condition(BlockStateProperties.AXIS, Direction.Axis.X).end().useOr() + .nestedGroup().condition(PipeBlock.DOWN, true).condition(PipeBlock.NORTH, true).condition(BlockStateProperties.AXIS, Direction.Axis.X).end().end(); + + builder = builder.part().modelFile(north_no_down_child).uvLock(true).addModel() + .nestedGroup().condition(PipeBlock.DOWN, false).condition(PipeBlock.NORTH, true).end().useOr() + .nestedGroup().condition(PipeBlock.DOWN, true).condition(PipeBlock.NORTH, true).condition(PipeBlock.WEST, true).condition(PipeBlock.EAST, true).condition(BlockStateProperties.AXIS, Direction.Axis.X).end().useOr() + .nestedGroup().condition(PipeBlock.DOWN, true).condition(PipeBlock.NORTH, true).condition(BlockStateProperties.AXIS, Direction.Axis.X).end().end(); + + builder = builder.part().modelFile(down_south_child).uvLock(true).addModel() + .nestedGroup().condition(PipeBlock.DOWN, true).condition(PipeBlock.SOUTH, true).condition(PipeBlock.WEST, false).end().useOr() + .nestedGroup().condition(PipeBlock.DOWN, true).condition(PipeBlock.SOUTH, true).condition(PipeBlock.EAST, false).end().useOr() + .nestedGroup().condition(PipeBlock.DOWN, true).condition(PipeBlock.SOUTH, true).condition(BlockStateProperties.AXIS, Direction.Axis.Y, Direction.Axis.Z).end().end(); + + builder = builder.part().modelFile(down_no_south_child).uvLock(true).addModel() + .nestedGroup().condition(PipeBlock.DOWN, true).condition(PipeBlock.SOUTH, false).end().useOr() + .nestedGroup().condition(PipeBlock.DOWN, true).condition(PipeBlock.SOUTH, true).condition(PipeBlock.WEST, true).condition(PipeBlock.EAST, true).condition(BlockStateProperties.AXIS, Direction.Axis.X).end().useOr() + .nestedGroup().condition(PipeBlock.DOWN, true).condition(PipeBlock.SOUTH, true).condition(BlockStateProperties.AXIS, Direction.Axis.X).end().end(); + + builder = builder.part().modelFile(south_no_down_child).uvLock(true).addModel() + .nestedGroup().condition(PipeBlock.DOWN, false).condition(PipeBlock.SOUTH, true).end().useOr() + .nestedGroup().condition(PipeBlock.DOWN, true).condition(PipeBlock.SOUTH, true).condition(PipeBlock.WEST, true).condition(PipeBlock.EAST, true).condition(BlockStateProperties.AXIS, Direction.Axis.X).end().useOr() + .nestedGroup().condition(PipeBlock.DOWN, true).condition(PipeBlock.SOUTH, true).condition(BlockStateProperties.AXIS, Direction.Axis.X).end().end(); + + builder = builder.part().modelFile(up_west_child).uvLock(true).addModel() + .nestedGroup().condition(PipeBlock.UP, true).condition(PipeBlock.WEST, true).condition(PipeBlock.NORTH, false).end().useOr() + .nestedGroup().condition(PipeBlock.UP, true).condition(PipeBlock.WEST, true).condition(PipeBlock.SOUTH, false).end().useOr() + .nestedGroup().condition(PipeBlock.UP, true).condition(PipeBlock.WEST, true).condition(BlockStateProperties.AXIS, Direction.Axis.Y, Direction.Axis.X).end().end(); + + builder = builder.part().modelFile(up_no_west_child).uvLock(true).addModel() + .nestedGroup().condition(PipeBlock.UP, true).condition(PipeBlock.WEST, false).end().useOr() + .nestedGroup().condition(PipeBlock.UP, true).condition(PipeBlock.WEST, true).condition(PipeBlock.NORTH, true).condition(PipeBlock.SOUTH, true).condition(BlockStateProperties.AXIS, Direction.Axis.Z).end().useOr() + .nestedGroup().condition(PipeBlock.UP, true).condition(PipeBlock.WEST, true).condition(BlockStateProperties.AXIS, Direction.Axis.Z).end().end(); + + builder = builder.part().modelFile(west_no_up_child).uvLock(true).addModel() + .nestedGroup().condition(PipeBlock.UP, false).condition(PipeBlock.WEST, true).end().useOr() + .nestedGroup().condition(PipeBlock.UP, true).condition(PipeBlock.WEST, true).condition(PipeBlock.NORTH, true).condition(PipeBlock.SOUTH, true).condition(BlockStateProperties.AXIS, Direction.Axis.Z).end().useOr() + .nestedGroup().condition(PipeBlock.UP, true).condition(PipeBlock.WEST, true).condition(BlockStateProperties.AXIS, Direction.Axis.Z).end().end(); + + builder = builder.part().modelFile(up_east_child).uvLock(true).addModel() + .nestedGroup().condition(PipeBlock.UP, true).condition(PipeBlock.EAST, true).condition(PipeBlock.NORTH, false).end().useOr() + .nestedGroup().condition(PipeBlock.UP, true).condition(PipeBlock.EAST, true).condition(PipeBlock.SOUTH, false).end().useOr() + .nestedGroup().condition(PipeBlock.UP, true).condition(PipeBlock.EAST, true).condition(BlockStateProperties.AXIS, Direction.Axis.Y, Direction.Axis.X).end().end(); + + builder = builder.part().modelFile(up_no_east_child).uvLock(true).addModel() + .nestedGroup().condition(PipeBlock.UP, true).condition(PipeBlock.EAST, false).end().useOr() + .nestedGroup().condition(PipeBlock.UP, true).condition(PipeBlock.EAST, true).condition(PipeBlock.NORTH, true).condition(PipeBlock.SOUTH, true).condition(BlockStateProperties.AXIS, Direction.Axis.Z).end().useOr() + .nestedGroup().condition(PipeBlock.UP, true).condition(PipeBlock.EAST, true).condition(BlockStateProperties.AXIS, Direction.Axis.Z).end().end(); + + builder = builder.part().modelFile(east_no_up_child).uvLock(true).addModel() + .nestedGroup().condition(PipeBlock.UP, false).condition(PipeBlock.EAST, true).end().useOr() + .nestedGroup().condition(PipeBlock.UP, true).condition(PipeBlock.EAST, true).condition(PipeBlock.NORTH, true).condition(PipeBlock.SOUTH, true).condition(BlockStateProperties.AXIS, Direction.Axis.Z).end().useOr() + .nestedGroup().condition(PipeBlock.UP, true).condition(PipeBlock.EAST, true).condition(BlockStateProperties.AXIS, Direction.Axis.Z).end().end(); + + builder = builder.part().modelFile(up_north_child).uvLock(true).addModel() + .nestedGroup().condition(PipeBlock.UP, true).condition(PipeBlock.NORTH, true).condition(PipeBlock.WEST, false).end().useOr() + .nestedGroup().condition(PipeBlock.UP, true).condition(PipeBlock.NORTH, true).condition(PipeBlock.EAST, false).end().useOr() + .nestedGroup().condition(PipeBlock.UP, true).condition(PipeBlock.NORTH, true).condition(BlockStateProperties.AXIS, Direction.Axis.Y, Direction.Axis.Z).end().end(); + + builder = builder.part().modelFile(up_no_north_child).uvLock(true).addModel() + .nestedGroup().condition(PipeBlock.UP, true).condition(PipeBlock.NORTH, false).end().useOr() + .nestedGroup().condition(PipeBlock.UP, true).condition(PipeBlock.NORTH, true).condition(PipeBlock.WEST, true).condition(PipeBlock.EAST, true).condition(BlockStateProperties.AXIS, Direction.Axis.X).end().useOr() + .nestedGroup().condition(PipeBlock.UP, true).condition(PipeBlock.NORTH, true).condition(BlockStateProperties.AXIS, Direction.Axis.X).end().end(); + + builder = builder.part().modelFile(north_no_up_child).uvLock(true).addModel() + .nestedGroup().condition(PipeBlock.UP, false).condition(PipeBlock.NORTH, true).end().useOr() + .nestedGroup().condition(PipeBlock.UP, true).condition(PipeBlock.NORTH, true).condition(PipeBlock.WEST, true).condition(PipeBlock.EAST, true).condition(BlockStateProperties.AXIS, Direction.Axis.X).end().useOr() + .nestedGroup().condition(PipeBlock.UP, true).condition(PipeBlock.NORTH, true).condition(BlockStateProperties.AXIS, Direction.Axis.X).end().end(); + + builder = builder.part().modelFile(up_south_child).uvLock(true).addModel() + .nestedGroup().condition(PipeBlock.UP, true).condition(PipeBlock.SOUTH, true).condition(PipeBlock.WEST, false).end().useOr() + .nestedGroup().condition(PipeBlock.UP, true).condition(PipeBlock.SOUTH, true).condition(PipeBlock.EAST, false).end().useOr() + .nestedGroup().condition(PipeBlock.UP, true).condition(PipeBlock.SOUTH, true).condition(BlockStateProperties.AXIS, Direction.Axis.Y, Direction.Axis.Z).end().end(); + + builder = builder.part().modelFile(up_no_south_child).uvLock(true).addModel() + .nestedGroup().condition(PipeBlock.UP, true).condition(PipeBlock.SOUTH, false).end().useOr() + .nestedGroup().condition(PipeBlock.UP, true).condition(PipeBlock.SOUTH, true).condition(PipeBlock.WEST, true).condition(PipeBlock.EAST, true).condition(BlockStateProperties.AXIS, Direction.Axis.X).end().useOr() + .nestedGroup().condition(PipeBlock.UP, true).condition(PipeBlock.SOUTH, true).condition(BlockStateProperties.AXIS, Direction.Axis.X).end().end(); + + builder = builder.part().modelFile(south_no_up_child).uvLock(true).addModel() + .nestedGroup().condition(PipeBlock.UP, false).condition(PipeBlock.SOUTH, true).end().useOr() + .nestedGroup().condition(PipeBlock.UP, true).condition(PipeBlock.SOUTH, true).condition(PipeBlock.WEST, true).condition(PipeBlock.EAST, true).condition(BlockStateProperties.AXIS, Direction.Axis.X).end().useOr() + .nestedGroup().condition(PipeBlock.UP, true).condition(PipeBlock.SOUTH, true).condition(BlockStateProperties.AXIS, Direction.Axis.X).end().end(); + + builder = builder.part().modelFile(north_west_child).uvLock(true).addModel() + .nestedGroup().condition(PipeBlock.NORTH, true).condition(PipeBlock.WEST, true).condition(PipeBlock.DOWN, false).end().useOr() + .nestedGroup().condition(PipeBlock.NORTH, true).condition(PipeBlock.WEST, true).condition(PipeBlock.UP, false).end().useOr() + .nestedGroup().condition(PipeBlock.NORTH, true).condition(PipeBlock.WEST, true).condition(BlockStateProperties.AXIS, Direction.Axis.X, Direction.Axis.Z).end().end(); + + builder = builder.part().modelFile(north_no_west_child).uvLock(true).addModel() + .nestedGroup().condition(PipeBlock.NORTH, true).condition(PipeBlock.WEST, false).end().useOr() + .nestedGroup().condition(PipeBlock.NORTH, true).condition(PipeBlock.WEST, true).condition(PipeBlock.DOWN, true).condition(PipeBlock.UP, true).condition(BlockStateProperties.AXIS, Direction.Axis.Y).end().useOr() + .nestedGroup().condition(PipeBlock.NORTH, true).condition(PipeBlock.WEST, true).condition(BlockStateProperties.AXIS, Direction.Axis.Y).end().end(); + + builder = builder.part().modelFile(west_no_north_child).uvLock(true).addModel() + .nestedGroup().condition(PipeBlock.NORTH, false).condition(PipeBlock.WEST, true).end().useOr() + .nestedGroup().condition(PipeBlock.NORTH, true).condition(PipeBlock.WEST, true).condition(PipeBlock.DOWN, true).condition(PipeBlock.UP, true).condition(BlockStateProperties.AXIS, Direction.Axis.Y).end().useOr() + .nestedGroup().condition(PipeBlock.NORTH, true).condition(PipeBlock.WEST, true).condition(BlockStateProperties.AXIS, Direction.Axis.Y).end().end(); + + builder = builder.part().modelFile(north_east_child).uvLock(true).addModel() + .nestedGroup().condition(PipeBlock.NORTH, true).condition(PipeBlock.EAST, true).condition(PipeBlock.DOWN, false).end().useOr() + .nestedGroup().condition(PipeBlock.NORTH, true).condition(PipeBlock.EAST, true).condition(PipeBlock.UP, false).end().useOr() + .nestedGroup().condition(PipeBlock.NORTH, true).condition(PipeBlock.EAST, true).condition(BlockStateProperties.AXIS, Direction.Axis.X, Direction.Axis.Z).end().end(); + + builder = builder.part().modelFile(north_no_east_child).uvLock(true).addModel() + .nestedGroup().condition(PipeBlock.NORTH, true).condition(PipeBlock.EAST, false).end().useOr() + .nestedGroup().condition(PipeBlock.NORTH, true).condition(PipeBlock.EAST, true).condition(PipeBlock.DOWN, true).condition(PipeBlock.UP, true).condition(BlockStateProperties.AXIS, Direction.Axis.Y).end().useOr() + .nestedGroup().condition(PipeBlock.NORTH, true).condition(PipeBlock.EAST, true).condition(BlockStateProperties.AXIS, Direction.Axis.Y).end().end(); + + builder = builder.part().modelFile(east_no_north_child).uvLock(true).addModel() + .nestedGroup().condition(PipeBlock.NORTH, false).condition(PipeBlock.EAST, true).end().useOr() + .nestedGroup().condition(PipeBlock.NORTH, true).condition(PipeBlock.EAST, true).condition(PipeBlock.DOWN, true).condition(PipeBlock.UP, true).condition(BlockStateProperties.AXIS, Direction.Axis.Y).end().useOr() + .nestedGroup().condition(PipeBlock.NORTH, true).condition(PipeBlock.EAST, true).condition(BlockStateProperties.AXIS, Direction.Axis.Y).end().end(); + + builder = builder.part().modelFile(south_west_child).uvLock(true).addModel() + .nestedGroup().condition(PipeBlock.SOUTH, true).condition(PipeBlock.WEST, true).condition(PipeBlock.DOWN, false).end().useOr() + .nestedGroup().condition(PipeBlock.SOUTH, true).condition(PipeBlock.WEST, true).condition(PipeBlock.UP, false).end().useOr() + .nestedGroup().condition(PipeBlock.SOUTH, true).condition(PipeBlock.WEST, true).condition(BlockStateProperties.AXIS, Direction.Axis.X, Direction.Axis.Z).end().end(); + + builder = builder.part().modelFile(south_no_west_child).uvLock(true).addModel() + .nestedGroup().condition(PipeBlock.SOUTH, true).condition(PipeBlock.WEST, false).end().useOr() + .nestedGroup().condition(PipeBlock.SOUTH, true).condition(PipeBlock.WEST, true).condition(PipeBlock.DOWN, true).condition(PipeBlock.UP, true).condition(BlockStateProperties.AXIS, Direction.Axis.Y).end().useOr() + .nestedGroup().condition(PipeBlock.SOUTH, true).condition(PipeBlock.WEST, true).condition(BlockStateProperties.AXIS, Direction.Axis.Y).end().end(); + + builder = builder.part().modelFile(west_no_south_child).uvLock(true).addModel() + .nestedGroup().condition(PipeBlock.SOUTH, false).condition(PipeBlock.WEST, true).end().useOr() + .nestedGroup().condition(PipeBlock.SOUTH, true).condition(PipeBlock.WEST, true).condition(PipeBlock.DOWN, true).condition(PipeBlock.UP, true).condition(BlockStateProperties.AXIS, Direction.Axis.Y).end().useOr() + .nestedGroup().condition(PipeBlock.SOUTH, true).condition(PipeBlock.WEST, true).condition(BlockStateProperties.AXIS, Direction.Axis.Y).end().end(); + + builder = builder.part().modelFile(south_east_child).uvLock(true).addModel() + .nestedGroup().condition(PipeBlock.SOUTH, true).condition(PipeBlock.EAST, true).condition(PipeBlock.DOWN, false).end().useOr() + .nestedGroup().condition(PipeBlock.SOUTH, true).condition(PipeBlock.EAST, true).condition(PipeBlock.UP, false).end().useOr() + .nestedGroup().condition(PipeBlock.SOUTH, true).condition(PipeBlock.EAST, true).condition(BlockStateProperties.AXIS, Direction.Axis.X, Direction.Axis.Z).end().end(); + + builder = builder.part().modelFile(south_no_east_child).uvLock(true).addModel() + .nestedGroup().condition(PipeBlock.SOUTH, true).condition(PipeBlock.EAST, false).end().useOr() + .nestedGroup().condition(PipeBlock.SOUTH, true).condition(PipeBlock.EAST, true).condition(PipeBlock.DOWN, true).condition(PipeBlock.UP, true).condition(BlockStateProperties.AXIS, Direction.Axis.Y).end().useOr() + .nestedGroup().condition(PipeBlock.SOUTH, true).condition(PipeBlock.EAST, true).condition(BlockStateProperties.AXIS, Direction.Axis.Y).end().end(); + + builder.part().modelFile(east_no_south_child).uvLock(true).addModel() + .nestedGroup().condition(PipeBlock.SOUTH, false).condition(PipeBlock.EAST, true).end().useOr() + .nestedGroup().condition(PipeBlock.SOUTH, true).condition(PipeBlock.EAST, true).condition(PipeBlock.DOWN, true).condition(PipeBlock.UP, true).condition(BlockStateProperties.AXIS, Direction.Axis.Y).end().useOr() + .nestedGroup().condition(PipeBlock.SOUTH, true).condition(PipeBlock.EAST, true).condition(BlockStateProperties.AXIS, Direction.Axis.Y).end().end(); + } + } + + private void registerNagastone() { + // todo 1.15 cleanup: generate these models as well instead of getExistingFile-ing them + String baseName = TFBlocks.NAGASTONE.getId().getPath(); + ModelFile solid = models().cubeBottomTop(baseName, prefix("block/nagastone_long_side"), prefix("block/nagastone_bottom_long"), prefix("block/nagastone_turn_top")); + ModelFile down = models().getExistingFile(prefix("block/naga_segment/down")); + ModelFile up = models().getExistingFile(prefix("block/naga_segment/up")); + ModelFile horizontal = models().getExistingFile(prefix("block/naga_segment/horizontal")); + ModelFile vertical = models().getExistingFile(prefix("block/naga_segment/vertical")); + getVariantBuilder(TFBlocks.NAGASTONE.get()).forAllStates(s -> switch (s.getValue(NagastoneBlock.VARIANT)) { + case NORTH_DOWN -> ConfiguredModel.builder().modelFile(down).rotationY(270).build(); + case SOUTH_DOWN -> ConfiguredModel.builder().modelFile(down).rotationY(90).build(); + case WEST_DOWN -> ConfiguredModel.builder().modelFile(down).rotationY(180).build(); + case EAST_DOWN -> ConfiguredModel.builder().modelFile(down).build(); + case NORTH_UP -> ConfiguredModel.builder().modelFile(up).rotationY(270).build(); + case SOUTH_UP -> ConfiguredModel.builder().modelFile(up).rotationY(90).build(); + case EAST_UP -> ConfiguredModel.builder().modelFile(up).build(); + case WEST_UP -> ConfiguredModel.builder().modelFile(up).rotationY(180).build(); + case AXIS_X -> ConfiguredModel.builder().modelFile(horizontal).build(); + case AXIS_Y -> ConfiguredModel.builder().modelFile(vertical).build(); + case AXIS_Z -> ConfiguredModel.builder().modelFile(horizontal).rotationY(90).build(); + case SOLID -> ConfiguredModel.builder().modelFile(solid).build(); + }); + + horizontalBlock(TFBlocks.NAGASTONE_HEAD.get(), models().getExistingFile(prefix("block/" + TFBlocks.NAGASTONE_HEAD.getId().getPath()))); + nagastonePillar(TFBlocks.NAGASTONE_PILLAR.get(), ""); + nagastonePillar(TFBlocks.MOSSY_NAGASTONE_PILLAR.get(), "_mossy"); + nagastonePillar(TFBlocks.CRACKED_NAGASTONE_PILLAR.get(), "_weathered"); + etchedNagastone(TFBlocks.ETCHED_NAGASTONE.get(), ""); + etchedNagastone(TFBlocks.MOSSY_ETCHED_NAGASTONE.get(), "_mossy"); + etchedNagastone(TFBlocks.CRACKED_ETCHED_NAGASTONE.get(), "_weathered"); + + bisectedStairsBlock(TFBlocks.NAGASTONE_STAIRS_LEFT, prefix("block/etched_nagastone_left"), prefix("block/stone_tiles"), prefix("block/nagastone_bare")); + bisectedStairsBlock(TFBlocks.NAGASTONE_STAIRS_RIGHT, prefix("block/etched_nagastone_right"), prefix("block/stone_tiles"), prefix("block/nagastone_bare")); + bisectedStairsBlock(TFBlocks.MOSSY_NAGASTONE_STAIRS_LEFT, prefix("block/etched_nagastone_left_mossy"), prefix("block/stone_tiles_mossy"), prefix("block/nagastone_bare_mossy")); + bisectedStairsBlock(TFBlocks.MOSSY_NAGASTONE_STAIRS_RIGHT, prefix("block/etched_nagastone_right_mossy"), prefix("block/stone_tiles_mossy"), prefix("block/nagastone_bare_mossy")); + bisectedStairsBlock(TFBlocks.CRACKED_NAGASTONE_STAIRS_LEFT, prefix("block/etched_nagastone_left_weathered"), prefix("block/stone_tiles_weathered"), prefix("block/nagastone_bare_weathered")); + bisectedStairsBlock(TFBlocks.CRACKED_NAGASTONE_STAIRS_RIGHT, prefix("block/etched_nagastone_right_weathered"), prefix("block/stone_tiles_weathered"), prefix("block/nagastone_bare_weathered")); + } + + private void nagastonePillar(Block b, String suffix) { + ResourceLocation side = prefix("block/nagastone_pillar_side" + suffix); + ResourceLocation end = prefix("block/nagastone_pillar_end" + suffix); + ResourceLocation alt = prefix("block/nagastone_pillar_side" + suffix + "_alt"); + ModelFile model = models().cubeColumn(name(b), side, end); + ModelFile reversed = models().cubeColumn(name(b) + "_reversed", alt, end); + getVariantBuilder(b).forAllStates(state -> { + int rotX = 0, rotY = 0; + switch (state.getValue(RotatedPillarBlock.AXIS)) { + default: + case X: + rotX = rotY = 270; + break; + case Y: + break; + case Z: + rotX = 270; + break; + } + ModelFile m = state.getValue(DirectionalRotatedPillarBlock.REVERSED) ? reversed : model; + return ConfiguredModel.builder().rotationX(rotX).rotationY(rotY).modelFile(m).build(); + }); + } + + private void etchedNagastone(Block b, String suffix) { + ResourceLocation stoneTiles = prefix("block/stone_tiles" + suffix); + ResourceLocation upTex = prefix("block/etched_nagastone_up" + suffix); + ResourceLocation downTex = prefix("block/etched_nagastone_down" + suffix); + ResourceLocation rightTex = prefix("block/etched_nagastone_right" + suffix); + ResourceLocation leftTex = prefix("block/etched_nagastone_left" + suffix); + + // todo 1.15 cleanup make this more "logical" with rotations, etc. instead of just reproducing what was in the old blockstate json + ModelFile down = models().cubeColumn(name(b), downTex, stoneTiles); + ModelFile up = models().cubeColumn(name(b) + "_up", upTex, stoneTiles); + ModelFile north = models().cube(name(b) + "_north", upTex, upTex, stoneTiles, stoneTiles, rightTex, leftTex) + .texture("particle", "#down"); + ModelFile south = models().cube(name(b) + "_south", downTex, downTex, stoneTiles, stoneTiles, leftTex, rightTex) + .texture("particle", "#down"); + ModelFile west = models().cube(name(b) + "_west", leftTex, rightTex, rightTex, leftTex, stoneTiles, stoneTiles) + .texture("particle", "#down"); + ModelFile east = models().cube(name(b) + "_east", rightTex, leftTex, leftTex, rightTex, stoneTiles, stoneTiles) + .texture("particle", "#down"); + + getVariantBuilder(b).partialState() + .with(DirectionalBlock.FACING, Direction.DOWN).setModels(new ConfiguredModel(down)); + getVariantBuilder(b).partialState() + .with(DirectionalBlock.FACING, Direction.UP).setModels(new ConfiguredModel(up)); + getVariantBuilder(b).partialState() + .with(DirectionalBlock.FACING, Direction.NORTH).setModels(new ConfiguredModel(north)); + getVariantBuilder(b).partialState() + .with(DirectionalBlock.FACING, Direction.SOUTH).setModels(new ConfiguredModel(south)); + getVariantBuilder(b).partialState() + .with(DirectionalBlock.FACING, Direction.WEST).setModels(new ConfiguredModel(west)); + getVariantBuilder(b).partialState() + .with(DirectionalBlock.FACING, Direction.EAST).setModels(new ConfiguredModel(east)); + } + + private void casketStuff() { + var builder = getVariantBuilder(TFBlocks.KEEPSAKE_CASKET.get()); + + var empty = models().getBuilder(name(TFBlocks.KEEPSAKE_CASKET.get())).parent(new ModelFile.UncheckedModelFile("builtin/entity")).texture("particle", "minecraft:block/netherite_block"); + var obsidian = models().withExistingParent("casket_obsidian", prefix("block/casket_solid_template")).texture("top", new ResourceLocation("block/obsidian")).texture("side", new ResourceLocation("block/obsidian")); + var stone = models().withExistingParent("casket_stone", prefix("block/casket_solid_template")).texture("top", new ResourceLocation("block/stone")).texture("side", new ResourceLocation("block/stone")); + var basalt = models().withExistingParent("casket_basalt", prefix("block/casket_solid_template")).texture("top", new ResourceLocation("block/basalt_top")).texture("side", new ResourceLocation("block/basalt_side")); + + builder.partialState().with(BlockLoggingEnum.MULTILOGGED, BlockLoggingEnum.AIR).setModels(new ConfiguredModel(empty)); + builder.partialState().with(BlockLoggingEnum.MULTILOGGED, BlockLoggingEnum.WATER).setModels(new ConfiguredModel(empty)); + builder.partialState().with(BlockLoggingEnum.MULTILOGGED, BlockLoggingEnum.LAVA).setModels(new ConfiguredModel(empty)); + + builder.partialState().with(BlockLoggingEnum.MULTILOGGED, BlockLoggingEnum.OBSIDIAN).setModels(new ConfiguredModel(obsidian)); + builder.partialState().with(BlockLoggingEnum.MULTILOGGED, BlockLoggingEnum.STONE).setModels(new ConfiguredModel(stone)); + builder.partialState().with(BlockLoggingEnum.MULTILOGGED, BlockLoggingEnum.BASALT).setModels(new ConfiguredModel(basalt)); + } + + private void registerSmokersAndJets() { + simpleBlock(TFBlocks.SMOKER.get(), this.makeTintedBlockColumnUniqueBottom(TFBlocks.SMOKER.getId().getPath()) + .texture("side", prefix("block/firejet_side")) + .texture("top", prefix("block/firejet_top")) + .texture("bottom", new ResourceLocation("block/grass_block_top"))); + simpleBlock(TFBlocks.FIRE_JET.get(), this.makeTintedBlockColumnUniqueBottom(TFBlocks.FIRE_JET.getId().getPath()) + .texture("side", prefix("block/firejet_side")) + .texture("top", prefix("block/firejet_top")) + .texture("bottom", new ResourceLocation("block/grass_block_top"))); + + ModelFile smokerOff = this.make3LayerCubeIdenticalSides1Bottom(TFBlocks.ENCASED_SMOKER.getId().getPath(), 0, 10, 15, 10, 10) + .texture("top", prefix("block/towerdev_ghasttraplid_off")) + .texture("side", prefix("block/towerdev_smoker_off")) + .texture("bottom", blockTexture(TFBlocks.ENCASED_TOWERWOOD.get())) + .texture("top2", prefix("block/tower_device_level_2/towerdev_ghasttraplid_off_1")) + .texture("side2", prefix("block/tower_device_level_1/towerdev_smoker_1")) + .texture("top3", prefix("block/tower_device_level_2/towerdev_ghasttraplid_off_1")) + .texture("side3", prefix("block/tower_device_level_2/towerdev_smoker_off_1")); + + ModelFile smokerOn = this.make3LayerCubeIdenticalSides1Bottom(TFBlocks.ENCASED_SMOKER.getId().getPath() + "_on", 0, 10, 15, 7, 10) + .texture("top", prefix("block/towerdev_ghasttraplid_on")) + .texture("side", prefix("block/towerdev_firejet_on")) + .texture("bottom", blockTexture(TFBlocks.ENCASED_TOWERWOOD.get())) + .texture("top2", prefix("block/tower_device_level_2/towerdev_ghasttraplid_on_1")) + .texture("side2", prefix("block/tower_device_level_1/towerdev_smoker_1")) + .texture("top3", prefix("block/tower_device_level_3/towerdev_ghasttraplid_on_2")) + .texture("side3", prefix("block/tower_device_level_2/towerdev_smoker_on_1")); + getVariantBuilder(TFBlocks.ENCASED_SMOKER.get()).partialState() + .with(EncasedSmokerBlock.ACTIVE, false).setModels(new ConfiguredModel(smokerOff)); + getVariantBuilder(TFBlocks.ENCASED_SMOKER.get()).partialState() + .with(EncasedSmokerBlock.ACTIVE, true).setModels(new ConfiguredModel(smokerOn)); + + ModelFile encasedJetOff = this.make3LayerCubeIdenticalSides1Bottom(TFBlocks.ENCASED_FIRE_JET.getId().getPath(), 0, 10, 15, 10, 10) + .texture("top", prefix("block/towerdev_ghasttraplid_off")) + .texture("side", prefix("block/towerdev_firejet_off")) + .texture("bottom", blockTexture(TFBlocks.ENCASED_TOWERWOOD.get())) + .texture("top2", prefix("block/tower_device_level_2/towerdev_ghasttraplid_off_1")) + .texture("side2", prefix("block/tower_device_level_1/towerdev_firejet_1")) + .texture("top3", prefix("block/tower_device_level_2/towerdev_ghasttraplid_off_1")) + .texture("side3", prefix("block/tower_device_level_2/towerdev_firejet_off_1")); + + ModelFile encasedJetOn = this.make3LayerCubeIdenticalSides1Bottom(TFBlocks.ENCASED_FIRE_JET.getId().getPath() + "_on", 0, 10, 15, 7, 10) + .texture("top", prefix("block/towerdev_ghasttraplid_on")) + .texture("side", prefix("block/towerdev_firejet_on")) + .texture("bottom", blockTexture(TFBlocks.ENCASED_TOWERWOOD.get())) + .texture("top2", prefix("block/tower_device_level_2/towerdev_ghasttraplid_on_1")) + .texture("side2", prefix("block/tower_device_level_1/towerdev_firejet_1")) + .texture("top3", prefix("block/tower_device_level_3/towerdev_ghasttraplid_on_2")) + .texture("side3", prefix("block/tower_device_level_2/towerdev_firejet_on_1")); + + getVariantBuilder(TFBlocks.ENCASED_FIRE_JET.get()).partialState() + .with(FireJetBlock.STATE, FireJetVariant.IDLE).setModels(new ConfiguredModel(encasedJetOff)); + getVariantBuilder(TFBlocks.ENCASED_FIRE_JET.get()).partialState() + .with(FireJetBlock.STATE, FireJetVariant.TIMEOUT).setModels(new ConfiguredModel(encasedJetOff)); + getVariantBuilder(TFBlocks.ENCASED_FIRE_JET.get()).partialState() + .with(FireJetBlock.STATE, FireJetVariant.POPPING).setModels(new ConfiguredModel(encasedJetOn)); + getVariantBuilder(TFBlocks.ENCASED_FIRE_JET.get()).partialState() + .with(FireJetBlock.STATE, FireJetVariant.FLAME).setModels(new ConfiguredModel(encasedJetOn)); + } + + private void registerPlantBlocks() { + simpleBlock(TFBlocks.MOSS_PATCH.get(), new ConfiguredModel(new ModelFile.UncheckedModelFile(TwilightForestMod.prefix("block/moss_patch")))); + simpleBlockExisting(TFBlocks.MAYAPPLE.get()); + simpleBlock(TFBlocks.CLOVER_PATCH.get(), new ConfiguredModel(new ModelFile.UncheckedModelFile(TwilightForestMod.prefix("block/clover_patch")))); + simpleBlock(TFBlocks.FIDDLEHEAD.get(), models().withExistingParent(TFBlocks.FIDDLEHEAD.getId().getPath(), "block/tinted_cross").renderType(CUTOUT) + .texture("cross", blockTexture(TFBlocks.FIDDLEHEAD.get()))); + simpleBlock(TFBlocks.MUSHGLOOM.get(), this.make2layerCross(TFBlocks.MUSHGLOOM.getId().getPath(), CUTOUT, 10, 6) + .texture("cross", blockTexture(TFBlocks.MUSHGLOOM.get())) + .texture("cross2", prefix("block/" + TFBlocks.MUSHGLOOM.getId().getPath() + "_head"))); + + ModelFile berry = this.make2layerCross(TFBlocks.TORCHBERRY_PLANT.getId().getPath(), CUTOUT, 0, 15) + .texture("cross", blockTexture(TFBlocks.TORCHBERRY_PLANT.get())) + .texture("cross2", prefix("block/" + TFBlocks.TORCHBERRY_PLANT.getId().getPath() + "_glow")); + ModelFile noBerry = models().withExistingParent(TFBlocks.TORCHBERRY_PLANT.getId().getPath() + "_no_berries", new ResourceLocation("block/cross")).renderType(CUTOUT) + .texture("cross", blockTexture(TFBlocks.TORCHBERRY_PLANT.get())); + getVariantBuilder(TFBlocks.TORCHBERRY_PLANT.get()).forAllStates(s -> ConfiguredModel.builder().modelFile(s.getValue(TorchberryPlantBlock.HAS_BERRIES) ? berry : noBerry).build()); + + simpleBlockExisting(TFBlocks.ROOT_STRAND.get()); + + getVariantBuilder(TFBlocks.FALLEN_LEAVES.get()).partialState() + .with(FallenLeavesBlock.LAYERS, 1).setModels(new ConfiguredModel(buildFallenLeaves(1))); + getVariantBuilder(TFBlocks.FALLEN_LEAVES.get()).partialState() + .with(FallenLeavesBlock.LAYERS, 2).setModels(new ConfiguredModel(buildFallenLeaves(2))); + getVariantBuilder(TFBlocks.FALLEN_LEAVES.get()).partialState() + .with(FallenLeavesBlock.LAYERS, 3).setModels(new ConfiguredModel(buildFallenLeaves(3))); + getVariantBuilder(TFBlocks.FALLEN_LEAVES.get()).partialState() + .with(FallenLeavesBlock.LAYERS, 4).setModels(new ConfiguredModel(buildFallenLeaves(4))); + getVariantBuilder(TFBlocks.FALLEN_LEAVES.get()).partialState() + .with(FallenLeavesBlock.LAYERS, 5).setModels(new ConfiguredModel(buildFallenLeaves(5))); + getVariantBuilder(TFBlocks.FALLEN_LEAVES.get()).partialState() + .with(FallenLeavesBlock.LAYERS, 6).setModels(new ConfiguredModel(buildFallenLeaves(6))); + getVariantBuilder(TFBlocks.FALLEN_LEAVES.get()).partialState() + .with(FallenLeavesBlock.LAYERS, 7).setModels(new ConfiguredModel(buildFallenLeaves(7))); + getVariantBuilder(TFBlocks.FALLEN_LEAVES.get()).partialState() + .with(FallenLeavesBlock.LAYERS, 8).setModels(new ConfiguredModel(buildFallenLeaves(8))); + } + + private void registerWoodBlocks() { + logWoodSapling(TFBlocks.TWILIGHT_OAK_LOG.get(), TFBlocks.STRIPPED_TWILIGHT_OAK_LOG.get(), TFBlocks.TWILIGHT_OAK_WOOD.get(), TFBlocks.STRIPPED_TWILIGHT_OAK_WOOD.get(), TFBlocks.TWILIGHT_OAK_SAPLING.get()); + plankBlocks("twilight_oak", TFBlocks.TWILIGHT_OAK_PLANKS.get(), TFBlocks.TWILIGHT_OAK_SLAB.get(), TFBlocks.TWILIGHT_OAK_STAIRS.get(), TFBlocks.TWILIGHT_OAK_BUTTON.get(), TFBlocks.TWILIGHT_OAK_FENCE.get(), TFBlocks.TWILIGHT_OAK_GATE.get(), TFBlocks.TWILIGHT_OAK_PLATE.get(), TFBlocks.TWILIGHT_OAK_DOOR.get(), TFBlocks.TWILIGHT_OAK_TRAPDOOR.get(), TFBlocks.TWILIGHT_OAK_BANISTER.get()); + singleBlockBoilerPlate(TFBlocks.TWILIGHT_OAK_LEAVES.get(), "block/leaves", m -> m.texture("all", "minecraft:block/oak_leaves")); + + ResourceLocation rainboakSaplTex = prefix("block/" + TFBlocks.RAINBOW_OAK_SAPLING.getId().getPath()); + simpleBlock(TFBlocks.RAINBOW_OAK_SAPLING.get(), models().cross(TFBlocks.RAINBOW_OAK_SAPLING.getId().getPath(), rainboakSaplTex).renderType(CUTOUT)); + singleBlockBoilerPlate(TFBlocks.RAINBOW_OAK_LEAVES.get(), "block/leaves", m -> m.texture("all", "minecraft:block/oak_leaves")); + + logWoodSapling(TFBlocks.CANOPY_LOG.get(), TFBlocks.STRIPPED_CANOPY_LOG.get(), TFBlocks.CANOPY_WOOD.get(), TFBlocks.STRIPPED_CANOPY_WOOD.get(), TFBlocks.CANOPY_SAPLING.get()); + plankBlocks("canopy", TFBlocks.CANOPY_PLANKS.get(), TFBlocks.CANOPY_SLAB.get(), TFBlocks.CANOPY_STAIRS.get(), TFBlocks.CANOPY_BUTTON.get(), TFBlocks.CANOPY_FENCE.get(), TFBlocks.CANOPY_GATE.get(), TFBlocks.CANOPY_PLATE.get(), TFBlocks.CANOPY_DOOR.get(), TFBlocks.CANOPY_TRAPDOOR.get(), TFBlocks.CANOPY_BANISTER.get()); + singleBlockBoilerPlate(TFBlocks.CANOPY_LEAVES.get(), "block/leaves", m -> m.texture("all", "minecraft:block/spruce_leaves")); + + logWoodSapling(TFBlocks.MANGROVE_LOG.get(), TFBlocks.STRIPPED_MANGROVE_LOG.get(), TFBlocks.MANGROVE_WOOD.get(), TFBlocks.STRIPPED_MANGROVE_WOOD.get(), TFBlocks.MANGROVE_SAPLING.get()); + plankBlocks("mangrove", TFBlocks.MANGROVE_PLANKS.get(), TFBlocks.MANGROVE_SLAB.get(), TFBlocks.MANGROVE_STAIRS.get(), TFBlocks.MANGROVE_BUTTON.get(), TFBlocks.MANGROVE_FENCE.get(), TFBlocks.MANGROVE_GATE.get(), TFBlocks.MANGROVE_PLATE.get(), TFBlocks.MANGROVE_DOOR.get(), TFBlocks.MANGROVE_TRAPDOOR.get(), TFBlocks.MANGROVE_BANISTER.get()); + singleBlockBoilerPlate(TFBlocks.MANGROVE_LEAVES.get(), "block/leaves", m -> m.texture("all", "minecraft:block/birch_leaves")); + + logWoodSapling(TFBlocks.DARK_LOG.get(), TFBlocks.STRIPPED_DARK_LOG.get(), TFBlocks.DARK_WOOD.get(), TFBlocks.STRIPPED_DARK_WOOD.get(), TFBlocks.DARKWOOD_SAPLING.get()); + plankBlocks("darkwood", TFBlocks.DARK_PLANKS.get(), TFBlocks.DARK_SLAB.get(), TFBlocks.DARK_STAIRS.get(), TFBlocks.DARK_BUTTON.get(), TFBlocks.DARK_FENCE.get(), TFBlocks.DARK_GATE.get(), TFBlocks.DARK_PLATE.get(), TFBlocks.DARK_DOOR.get(), TFBlocks.DARK_TRAPDOOR.get(), TFBlocks.DARK_BANISTER.get()); + singleBlockBoilerPlate(TFBlocks.DARK_LEAVES.get(), "block/leaves", m -> m.texture("all", "block/darkwood_leaves")); + singleBlockBoilerPlate(TFBlocks.HARDENED_DARK_LEAVES.get(), "block/leaves", m -> m.texture("all", "block/darkwood_leaves")); + + logWoodSapling(TFBlocks.TIME_LOG.get(), TFBlocks.STRIPPED_TIME_LOG.get(), TFBlocks.TIME_WOOD.get(), TFBlocks.STRIPPED_TIME_WOOD.get(), TFBlocks.TIME_SAPLING.get()); + plankBlocks("time", TFBlocks.TIME_PLANKS.get(), TFBlocks.TIME_SLAB.get(), TFBlocks.TIME_STAIRS.get(), TFBlocks.TIME_BUTTON.get(), TFBlocks.TIME_FENCE.get(), TFBlocks.TIME_GATE.get(), TFBlocks.TIME_PLATE.get(), TFBlocks.TIME_DOOR.get(), TFBlocks.TIME_TRAPDOOR.get(), true, TFBlocks.TIME_BANISTER.get()); + singleBlockBoilerPlate(TFBlocks.TIME_LEAVES.get(), "block/leaves", m -> m.texture("all", "block/time_leaves")); + magicLogCore(TFBlocks.TIME_LOG_CORE.get()); + + logWoodSapling(TFBlocks.TRANSFORMATION_LOG.get(), TFBlocks.STRIPPED_TRANSFORMATION_LOG.get(), TFBlocks.TRANSFORMATION_WOOD.get(), TFBlocks.STRIPPED_TRANSFORMATION_WOOD.get(), TFBlocks.TRANSFORMATION_SAPLING.get()); + plankBlocks("trans", TFBlocks.TRANSFORMATION_PLANKS.get(), TFBlocks.TRANSFORMATION_SLAB.get(), TFBlocks.TRANSFORMATION_STAIRS.get(), TFBlocks.TRANSFORMATION_BUTTON.get(), TFBlocks.TRANSFORMATION_FENCE.get(), TFBlocks.TRANSFORMATION_GATE.get(), TFBlocks.TRANSFORMATION_PLATE.get(), TFBlocks.TRANSFORMATION_DOOR.get(), TFBlocks.TRANSFORMATION_TRAPDOOR.get(), true, TFBlocks.TRANSFORMATION_BANISTER.get()); + singleBlockBoilerPlate(TFBlocks.TRANSFORMATION_LEAVES.get(), "block/leaves", m -> m.texture("all", "block/transformation_leaves")); + magicLogCore(TFBlocks.TRANSFORMATION_LOG_CORE.get()); + + logWoodSapling(TFBlocks.MINING_LOG.get(), TFBlocks.STRIPPED_MINING_LOG.get(), TFBlocks.MINING_WOOD.get(), TFBlocks.STRIPPED_MINING_WOOD.get(), TFBlocks.MINING_SAPLING.get()); + plankBlocks("mine", TFBlocks.MINING_PLANKS.get(), TFBlocks.MINING_SLAB.get(), TFBlocks.MINING_STAIRS.get(), TFBlocks.MINING_BUTTON.get(), TFBlocks.MINING_FENCE.get(), TFBlocks.MINING_GATE.get(), TFBlocks.MINING_PLATE.get(), TFBlocks.MINING_DOOR.get(), TFBlocks.MINING_TRAPDOOR.get(), TFBlocks.MINING_BANISTER.get()); + singleBlockBoilerPlate(TFBlocks.MINING_LEAVES.get(), "block/leaves", m -> m.texture("all", "block/mining_leaves")); + magicLogCore(TFBlocks.MINING_LOG_CORE.get()); + + logWoodSapling(TFBlocks.SORTING_LOG.get(), TFBlocks.STRIPPED_SORTING_LOG.get(), TFBlocks.SORTING_WOOD.get(), TFBlocks.STRIPPED_SORTING_WOOD.get(), TFBlocks.SORTING_SAPLING.get()); + plankBlocks("sort", TFBlocks.SORTING_PLANKS.get(), TFBlocks.SORTING_SLAB.get(), TFBlocks.SORTING_STAIRS.get(), TFBlocks.SORTING_BUTTON.get(), TFBlocks.SORTING_FENCE.get(), TFBlocks.SORTING_GATE.get(), TFBlocks.SORTING_PLATE.get(), TFBlocks.SORTING_DOOR.get(), TFBlocks.SORTING_TRAPDOOR.get(), true, TFBlocks.SORTING_BANISTER.get()); + singleBlockBoilerPlate(TFBlocks.SORTING_LEAVES.get(), "block/leaves", m -> m.texture("all", "block/sorting_leaves")); + magicLogCore(TFBlocks.SORTING_LOG_CORE.get()); + + banisterVanilla(TFBlocks.OAK_BANISTER.get(), "oak_planks", "oak"); + banisterVanilla(TFBlocks.SPRUCE_BANISTER.get(), "spruce_planks", "spruce"); + banisterVanilla(TFBlocks.BIRCH_BANISTER.get(), "birch_planks", "birch"); + banisterVanilla(TFBlocks.JUNGLE_BANISTER.get(), "jungle_planks", "jungle"); + banisterVanilla(TFBlocks.ACACIA_BANISTER.get(), "acacia_planks", "acacia"); + banisterVanilla(TFBlocks.DARK_OAK_BANISTER.get(), "dark_oak_planks", "dark_oak"); + banisterVanilla(TFBlocks.CRIMSON_BANISTER.get(), "crimson_planks", "crimson"); + banisterVanilla(TFBlocks.WARPED_BANISTER.get(), "warped_planks", "warped"); + banisterVanilla(TFBlocks.VANGROVE_BANISTER.get(), "mangrove_planks", "vanilla_mangrove"); + + final ResourceLocation MOSS = TwilightForestMod.prefix("block/mosspatch"); + final ResourceLocation MOSS_OVERHANG = TwilightForestMod.prefix("block/moss_overhang"); + final ResourceLocation TALL_GRASS = new ResourceLocation("block/grass"); + final ResourceLocation SNOW = new ResourceLocation("block/snow"); + final ResourceLocation SNOW_OVERHANG = TwilightForestMod.prefix("block/snow_overhang"); + + final ModelFile EMPTY_LOG = this.buildHorizontalHollowLog(false, false); + final ModelFile LAYERED_LOG = this.buildHorizontalHollowLog(true, false); + final ModelFile MOSS_LOG_GRASS = models().getBuilder("hollow_log_moss_grass").parent(this.buildHorizontalHollowLog(true, true)).renderType(CUTOUT).texture("carpet", MOSS).texture("overhang", MOSS_OVERHANG).texture("plant", TALL_GRASS); + final ModelFile MOSS_LOG = models().getBuilder("hollow_log_moss").parent(LAYERED_LOG).renderType(CUTOUT).texture("carpet", MOSS).texture("overhang", MOSS_OVERHANG); + final ModelFile SNOW_LOG = models().getBuilder("hollow_log_snow").parent(LAYERED_LOG).renderType(CUTOUT).texture("carpet", SNOW).texture("overhang", SNOW_OVERHANG); + final ModelFile HOLLOW_LOG = this.buildVerticalLog(null); + final ModelFile VINE_LOG = this.buildVerticalLog(HollowLogVariants.Climbable.VINE); + final ModelFile LADDER_LOG = this.buildVerticalLog(HollowLogVariants.Climbable.LADDER); + + hollowLogs(Blocks.OAK_LOG, Blocks.STRIPPED_OAK_LOG, TFBlocks.HOLLOW_OAK_LOG_HORIZONTAL, TFBlocks.HOLLOW_OAK_LOG_VERTICAL, TFBlocks.HOLLOW_OAK_LOG_CLIMBABLE, EMPTY_LOG, MOSS_LOG, MOSS_LOG_GRASS, SNOW_LOG, HOLLOW_LOG, VINE_LOG, LADDER_LOG); + hollowLogs(Blocks.SPRUCE_LOG, Blocks.STRIPPED_SPRUCE_LOG, TFBlocks.HOLLOW_SPRUCE_LOG_HORIZONTAL, TFBlocks.HOLLOW_SPRUCE_LOG_VERTICAL, TFBlocks.HOLLOW_SPRUCE_LOG_CLIMBABLE, EMPTY_LOG, MOSS_LOG, MOSS_LOG_GRASS, SNOW_LOG, HOLLOW_LOG, VINE_LOG, LADDER_LOG); + hollowLogs(Blocks.BIRCH_LOG, Blocks.STRIPPED_BIRCH_LOG, TFBlocks.HOLLOW_BIRCH_LOG_HORIZONTAL, TFBlocks.HOLLOW_BIRCH_LOG_VERTICAL, TFBlocks.HOLLOW_BIRCH_LOG_CLIMBABLE, EMPTY_LOG, MOSS_LOG, MOSS_LOG_GRASS, SNOW_LOG, HOLLOW_LOG, VINE_LOG, LADDER_LOG); + hollowLogs(Blocks.JUNGLE_LOG, Blocks.STRIPPED_JUNGLE_LOG, TFBlocks.HOLLOW_JUNGLE_LOG_HORIZONTAL, TFBlocks.HOLLOW_JUNGLE_LOG_VERTICAL, TFBlocks.HOLLOW_JUNGLE_LOG_CLIMBABLE, EMPTY_LOG, MOSS_LOG, MOSS_LOG_GRASS, SNOW_LOG, HOLLOW_LOG, VINE_LOG, LADDER_LOG); + hollowLogs(Blocks.ACACIA_LOG, Blocks.STRIPPED_ACACIA_LOG, TFBlocks.HOLLOW_ACACIA_LOG_HORIZONTAL, TFBlocks.HOLLOW_ACACIA_LOG_VERTICAL, TFBlocks.HOLLOW_ACACIA_LOG_CLIMBABLE, EMPTY_LOG, MOSS_LOG, MOSS_LOG_GRASS, SNOW_LOG, HOLLOW_LOG, VINE_LOG, LADDER_LOG); + hollowLogs(Blocks.DARK_OAK_LOG, Blocks.STRIPPED_DARK_OAK_LOG, TFBlocks.HOLLOW_DARK_OAK_LOG_HORIZONTAL, TFBlocks.HOLLOW_DARK_OAK_LOG_VERTICAL, TFBlocks.HOLLOW_DARK_OAK_LOG_CLIMBABLE, EMPTY_LOG, MOSS_LOG, MOSS_LOG_GRASS, SNOW_LOG, HOLLOW_LOG, VINE_LOG, LADDER_LOG); + hollowLogs(Blocks.CRIMSON_STEM, Blocks.STRIPPED_CRIMSON_STEM, TFBlocks.HOLLOW_CRIMSON_STEM_HORIZONTAL, TFBlocks.HOLLOW_CRIMSON_STEM_VERTICAL, TFBlocks.HOLLOW_CRIMSON_STEM_CLIMBABLE, EMPTY_LOG, MOSS_LOG, MOSS_LOG_GRASS, SNOW_LOG, HOLLOW_LOG, VINE_LOG, LADDER_LOG); + hollowLogs(Blocks.WARPED_STEM, Blocks.STRIPPED_WARPED_STEM, TFBlocks.HOLLOW_WARPED_STEM_HORIZONTAL, TFBlocks.HOLLOW_WARPED_STEM_VERTICAL, TFBlocks.HOLLOW_WARPED_STEM_CLIMBABLE, EMPTY_LOG, MOSS_LOG, MOSS_LOG_GRASS, SNOW_LOG, HOLLOW_LOG, VINE_LOG, LADDER_LOG); + hollowLogs(Blocks.MANGROVE_LOG, Blocks.STRIPPED_MANGROVE_LOG, TFBlocks.HOLLOW_VANGROVE_LOG_HORIZONTAL, TFBlocks.HOLLOW_VANGROVE_LOG_VERTICAL, TFBlocks.HOLLOW_VANGROVE_LOG_CLIMBABLE, EMPTY_LOG, MOSS_LOG, MOSS_LOG_GRASS, SNOW_LOG, HOLLOW_LOG, VINE_LOG, LADDER_LOG); + + hollowLogs(TFBlocks.TWILIGHT_OAK_LOG, TFBlocks.STRIPPED_TWILIGHT_OAK_LOG, TFBlocks.HOLLOW_TWILIGHT_OAK_LOG_HORIZONTAL, TFBlocks.HOLLOW_TWILIGHT_OAK_LOG_VERTICAL, TFBlocks.HOLLOW_TWILIGHT_OAK_LOG_CLIMBABLE, EMPTY_LOG, MOSS_LOG, MOSS_LOG_GRASS, SNOW_LOG, HOLLOW_LOG, VINE_LOG, LADDER_LOG); + hollowLogs(TFBlocks.CANOPY_LOG, TFBlocks.STRIPPED_CANOPY_LOG, TFBlocks.HOLLOW_CANOPY_LOG_HORIZONTAL, TFBlocks.HOLLOW_CANOPY_LOG_VERTICAL, TFBlocks.HOLLOW_CANOPY_LOG_CLIMBABLE, EMPTY_LOG, MOSS_LOG, MOSS_LOG_GRASS, SNOW_LOG, HOLLOW_LOG, VINE_LOG, LADDER_LOG); + hollowLogs(TFBlocks.MANGROVE_LOG, TFBlocks.STRIPPED_MANGROVE_LOG, TFBlocks.HOLLOW_MANGROVE_LOG_HORIZONTAL, TFBlocks.HOLLOW_MANGROVE_LOG_VERTICAL, TFBlocks.HOLLOW_MANGROVE_LOG_CLIMBABLE, EMPTY_LOG, MOSS_LOG, MOSS_LOG_GRASS, SNOW_LOG, HOLLOW_LOG, VINE_LOG, LADDER_LOG); + hollowLogs(TFBlocks.DARK_LOG, TFBlocks.STRIPPED_DARK_LOG, TFBlocks.HOLLOW_DARK_LOG_HORIZONTAL, TFBlocks.HOLLOW_DARK_LOG_VERTICAL, TFBlocks.HOLLOW_DARK_LOG_CLIMBABLE, EMPTY_LOG, MOSS_LOG, MOSS_LOG_GRASS, SNOW_LOG, HOLLOW_LOG, VINE_LOG, LADDER_LOG); + hollowLogs(TFBlocks.TIME_LOG, TFBlocks.STRIPPED_TIME_LOG, TFBlocks.HOLLOW_TIME_LOG_HORIZONTAL, TFBlocks.HOLLOW_TIME_LOG_VERTICAL, TFBlocks.HOLLOW_TIME_LOG_CLIMBABLE, EMPTY_LOG, MOSS_LOG, MOSS_LOG_GRASS, SNOW_LOG, HOLLOW_LOG, VINE_LOG, LADDER_LOG); + hollowLogs(TFBlocks.TRANSFORMATION_LOG, TFBlocks.STRIPPED_TRANSFORMATION_LOG, TFBlocks.HOLLOW_TRANSFORMATION_LOG_HORIZONTAL, TFBlocks.HOLLOW_TRANSFORMATION_LOG_VERTICAL, TFBlocks.HOLLOW_TRANSFORMATION_LOG_CLIMBABLE, EMPTY_LOG, MOSS_LOG, MOSS_LOG_GRASS, SNOW_LOG, HOLLOW_LOG, VINE_LOG, LADDER_LOG); + hollowLogs(TFBlocks.MINING_LOG, TFBlocks.STRIPPED_MINING_LOG, TFBlocks.HOLLOW_MINING_LOG_HORIZONTAL, TFBlocks.HOLLOW_MINING_LOG_VERTICAL, TFBlocks.HOLLOW_MINING_LOG_CLIMBABLE, EMPTY_LOG, MOSS_LOG, MOSS_LOG_GRASS, SNOW_LOG, HOLLOW_LOG, VINE_LOG, LADDER_LOG); + hollowLogs(TFBlocks.SORTING_LOG, TFBlocks.STRIPPED_SORTING_LOG, TFBlocks.HOLLOW_SORTING_LOG_HORIZONTAL, TFBlocks.HOLLOW_SORTING_LOG_VERTICAL, TFBlocks.HOLLOW_SORTING_LOG_CLIMBABLE, EMPTY_LOG, MOSS_LOG, MOSS_LOG_GRASS, SNOW_LOG, HOLLOW_LOG, VINE_LOG, LADDER_LOG); + } + + private void magicLogCore(Block b) { + ResourceLocation topTex = prefix("block/" + name(b).replace("_core", "_top")); + ModelFile off = models().cubeColumn(name(b), blockTexture(b), topTex); + ModelFile on = models().cubeColumn(name(b) + "_on", prefix("block/" + name(b) + "_on"), topTex); + getVariantBuilder(b).forAllStates(s -> { + ModelFile f = s.getValue(SpecialMagicLogBlock.ACTIVE) ? on : off; + Direction.Axis axis = s.getValue(RotatedPillarBlock.AXIS); + int rotX = axis == Direction.Axis.X || axis == Direction.Axis.Z ? 90 : 0; + int rotY = axis == Direction.Axis.X ? 90 : 0; + return ConfiguredModel.builder() + .modelFile(f).rotationX(rotX).rotationY(rotY).build(); + }); + } + + private void rotationallyCorrectColumn(Block b) { + ResourceLocation side = prefix("block/" + name(b) + "_side"); + ResourceLocation end = prefix("block/" + name(b) + "_end"); + ConfiguredModel yModel = new ConfiguredModel(models().cubeColumn(name(b), side, end)); + ConfiguredModel xModel = ConfiguredModel.builder() + .modelFile(models().withExistingParent(name(b) + "_x", prefix("block/util/cube_column_rotationally_correct_x")) + .texture("side", side).texture("end", end)) + .rotationX(90).rotationY(90) + .buildLast(); + ConfiguredModel zModel = ConfiguredModel.builder() + .modelFile(models().withExistingParent(name(b) + "_z", prefix("block/util/cube_column_rotationally_correct_z")) + .texture("side", side).texture("end", end)) + .rotationX(90) + .buildLast(); + getVariantBuilder(b) + .partialState().with(RotatedPillarBlock.AXIS, Direction.Axis.Y).setModels(yModel) + .partialState().with(RotatedPillarBlock.AXIS, Direction.Axis.X).setModels(xModel) + .partialState().with(RotatedPillarBlock.AXIS, Direction.Axis.Z).setModels(zModel); + } + + private void castleDoor(Block b) { + ModelFile vanished = models().withExistingParent(ForgeRegistries.BLOCKS.getKey(b).getPath() + "_vanished", "block/block") + .texture("base", TwilightForestMod.prefix("block/castle_door_vanished")) + .texture("particle", TwilightForestMod.prefix("block/castle_door_vanished")) + .texture("overlay", TwilightForestMod.prefix("block/castle_door_rune_corners")) + .texture("overlay_connected", TwilightForestMod.prefix("block/castle_door_rune_ctm")) + .renderType(CUTOUT) + .customLoader(CastleDoorBuilder::begin).end(); + + ModelFile main = models().withExistingParent(ForgeRegistries.BLOCKS.getKey(b).getPath(), "block/block") + .texture("base", TwilightForestMod.prefix("block/castle_door")) + .texture("particle", TwilightForestMod.prefix("block/castle_door")) + .texture("overlay", TwilightForestMod.prefix("block/castle_door_rune_corners")) + .texture("overlay_connected", TwilightForestMod.prefix("block/castle_door_rune_ctm")) + .renderType(CUTOUT) + .customLoader(CastleDoorBuilder::begin).end(); + + getVariantBuilder(b).forAllStates(state -> ConfiguredModel.builder().modelFile(state.getValue(CastleDoorBlock.VANISHED) ? vanished : main).build()); + } + + private void allRotations(Block b, ModelFile model) { + ConfiguredModel.Builder builder = ConfiguredModel.builder(); + int[] rots = {0, 90, 180, 270}; + for (int x : rots) { + for (int y : rots) { + builder = builder.modelFile(model).rotationX(x).rotationY(y); + if (x != rots[rots.length - 1] && y != rots[rots.length - 1]) { + builder = builder.nextModel(); + } + } + } + simpleBlock(b, builder.build()); + } + + private void stonePillar() { + ModelFile main_x = models().withExistingParent("pillar_main_x", prefix("block/pillar/pillar_12_ctm")).renderType(CUTOUT).texture("side_x", prefix("block/stone_twist/twist_x")).texture("side_z", prefix("block/stone_twist/twist_x")); + ModelFile bottom_x = models().withExistingParent("pillar_bottom_x", prefix("block/pillar/pillar_bottom")).renderType(CUTOUT).texture("bottom_x", prefix("block/stone_twist/cap/y_y_bottom")).texture("bottom_z", prefix("block/stone_twist/cap/y_y_bottom")).texture("bottom_cap", prefix("block/stone_twist/cap/end_bottom_x")); + ModelFile top_x = models().withExistingParent("pillar_top_x", prefix("block/pillar/pillar_top")).renderType(CUTOUT).texture("top_x", prefix("block/stone_twist/cap/y_y_top")).texture("top_z", prefix("block/stone_twist/cap/y_y_top")).texture("top_cap", prefix("block/stone_twist/cap/end_top_x")); + ModelFile main_y = models().withExistingParent("pillar_main_y", prefix("block/pillar/pillar_12_ctm")).renderType(CUTOUT).texture("side_x", prefix("block/stone_twist/twist_y")).texture("side_z", prefix("block/stone_twist/twist_y")); + ModelFile bottom_y = models().withExistingParent("pillar_bottom_y", prefix("block/pillar/pillar_bottom")).renderType(CUTOUT).texture("bottom_x", prefix("block/stone_twist/cap/y_y_bottom")).texture("bottom_z", prefix("block/stone_twist/cap/y_y_bottom")).texture("bottom_cap", prefix("block/stone_twist/cap/end_bottom_y")); + ModelFile top_y = models().withExistingParent("pillar_top_y", prefix("block/pillar/pillar_top")).renderType(CUTOUT).texture("top_x", prefix("block/stone_twist/cap/y_y_top")).texture("top_z", prefix("block/stone_twist/cap/y_y_top")).texture("top_cap", prefix("block/stone_twist/cap/end_top_y")); + ModelFile main_z = models().withExistingParent("pillar_main_z", prefix("block/pillar/pillar_12_ctm")).renderType(CUTOUT).texture("side_x", prefix("block/stone_twist/twist_x")).texture("side_z", prefix("block/stone_twist/twist_y")); + ModelFile bottom_z = models().withExistingParent("pillar_bottom_z", prefix("block/pillar/pillar_bottom")).renderType(CUTOUT).texture("bottom_x", prefix("block/stone_twist/cap/y_y_bottom")).texture("bottom_z", prefix("block/stone_twist/cap/y_y_bottom")).texture("bottom_cap", prefix("block/stone_twist/cap/end_bottom_z")); + ModelFile top_z = models().withExistingParent("pillar_top_z", prefix("block/pillar/pillar_top")).renderType(CUTOUT).texture("top_x", prefix("block/stone_twist/cap/y_y_top")).texture("top_z", prefix("block/stone_twist/cap/y_y_top")).texture("top_cap", prefix("block/stone_twist/cap/end_top_z")); + getMultipartBuilder(TFBlocks.TWISTED_STONE_PILLAR.get()) + .part().modelFile(main_x).uvLock(true).rotationX(90).rotationY(90).addModel().condition(WallPillarBlock.AXIS, Direction.Axis.X).end() + .part().modelFile(top_x).rotationX(90).rotationY(90).addModel().condition(WallPillarBlock.AXIS, Direction.Axis.X).condition(PipeBlock.EAST, false).end() + .part().modelFile(bottom_x).rotationX(90).rotationY(90).addModel().condition(WallPillarBlock.AXIS, Direction.Axis.X).condition(PipeBlock.WEST, false).end() + .part().modelFile(main_y).uvLock(true).addModel().condition(WallPillarBlock.AXIS, Direction.Axis.Y).end() + .part().modelFile(top_y).addModel().condition(WallPillarBlock.AXIS, Direction.Axis.Y).condition(PipeBlock.UP, false).end() + .part().modelFile(bottom_y).addModel().condition(WallPillarBlock.AXIS, Direction.Axis.Y).condition(PipeBlock.DOWN, false).end() + .part().modelFile(main_z).uvLock(true).rotationX(90).addModel().condition(WallPillarBlock.AXIS, Direction.Axis.Z).end() + .part().modelFile(top_z).rotationX(90).addModel().condition(WallPillarBlock.AXIS, Direction.Axis.Z).condition(PipeBlock.NORTH, false).end() + .part().modelFile(bottom_z).rotationX(90).addModel().condition(WallPillarBlock.AXIS, Direction.Axis.Z).condition(PipeBlock.SOUTH, false).end(); + } + + private void slider() { + ModelFile slider = models().getExistingFile(TwilightForestMod.prefix("block/slider")); + ModelFile horizSlider = models().getExistingFile(TwilightForestMod.prefix("block/slider_horiz")); + getVariantBuilder(TFBlocks.SLIDER.get()).forAllStates(state -> switch (state.getValue(SliderBlock.AXIS)) { + case X -> ConfiguredModel.builder().modelFile(horizSlider).rotationX(90).rotationY(90).build(); + case Z -> ConfiguredModel.builder().modelFile(horizSlider).rotationX(90).build(); + default -> ConfiguredModel.builder().modelFile(slider).build(); + }); + } + + private void towerBlocks() { + ModelFile reappear = this.make3LayerCubeAllSidesSame(TFBlocks.REAPPEARING_BLOCK.getId().getPath(), CUTOUT, 0, 15, 10) + .texture("all", prefix("block/towerdev_reappearing_off")) + .texture("all2", prefix("block/tower_device_level_1/towerdev_reappearing_off_1")) + .texture("all3", prefix("block/tower_device_level_2/towerdev_reappearing_off_2")); + ModelFile reappearActive = this.make3LayerCubeAllSidesSame(TFBlocks.REAPPEARING_BLOCK.getId().getPath() + "_active", CUTOUT, 0, 15, 10) + .texture("all", prefix("block/towerdev_reappearing_on")) + .texture("all2", prefix("block/tower_device_level_1/towerdev_reappearing_on_1")) + .texture("all3", prefix("block/tower_device_level_2/towerdev_reappearing_on_2")); + ModelFile reappearVanished = this.make4x4x4SmallCube(TFBlocks.REAPPEARING_BLOCK.getId().getPath() + "_vanished") + .texture("all", prefix("block/towerdev_reappearing_trace_off")); + ModelFile reappearVanishedActive = this.make4x4x4SmallCube(TFBlocks.REAPPEARING_BLOCK.getId().getPath() + "_vanished_active") + .texture("all", prefix("block/towerdev_reappearing_trace_on")); + getVariantBuilder(TFBlocks.REAPPEARING_BLOCK.get()).forAllStates(s -> { + ModelFile model; + if (s.getValue(VanishingBlock.VANISHED)) { + model = s.getValue(VanishingBlock.ACTIVE) ? reappearVanishedActive : reappearVanished; + } else { + model = s.getValue(VanishingBlock.ACTIVE) ? reappearActive : reappear; + } + return ConfiguredModel.builder().modelFile(model).build(); + }); + + ModelFile vanish = this.make3LayerCubeAllSidesSame(TFBlocks.VANISHING_BLOCK.getId().getPath(), CUTOUT, 0, 15, 10) + .texture("all", prefix("block/towerdev_vanish_off")) + .texture("all2", prefix("block/tower_device_level_1/towerdev_vanish_off_1")) + .texture("all3", prefix("block/tower_device_level_2/towerdev_vanish_off_2")); + ModelFile vanishActive = this.make3LayerCubeAllSidesSame(TFBlocks.VANISHING_BLOCK.getId().getPath() + "_active", CUTOUT, 0, 15, 10) + .texture("all", prefix("block/towerdev_vanish_on")) + .texture("all2", prefix("block/tower_device_level_1/towerdev_vanish_on_1")) + .texture("all3", prefix("block/tower_device_level_2/towerdev_vanish_on_2")); + getVariantBuilder(TFBlocks.VANISHING_BLOCK.get()).partialState() + .with(VanishingBlock.ACTIVE, false).setModels(new ConfiguredModel(vanish)); + getVariantBuilder(TFBlocks.VANISHING_BLOCK.get()).partialState() + .with(VanishingBlock.ACTIVE, true).setModels(new ConfiguredModel(vanishActive)); + + ModelFile vanishLocked = this.make3LayerCubeAllSidesSame(TFBlocks.LOCKED_VANISHING_BLOCK.getId().getPath(), CUTOUT, 0, 15, 10) + .texture("all", prefix("block/towerdev_lock_on")) + .texture("all2", prefix("block/tower_device_level_1/towerdev_lock_on_1")) + .texture("all3", prefix("block/tower_device_level_2/towerdev_lock_on_2")); + ModelFile vanishUnlocked = this.make3LayerCubeAllSidesSame(TFBlocks.LOCKED_VANISHING_BLOCK.getId().getPath() + "_unlocked", CUTOUT, 0, 15, 10) + .texture("all", prefix("block/towerdev_lock_off")) + .texture("all2", prefix("block/tower_device_level_1/towerdev_lock_off_1")) + .texture("all3", prefix("block/tower_device_level_2/towerdev_lock_off_2")); + getVariantBuilder(TFBlocks.LOCKED_VANISHING_BLOCK.get()).partialState() + .with(LockedVanishingBlock.LOCKED, true).setModels(new ConfiguredModel(vanishLocked)); + getVariantBuilder(TFBlocks.LOCKED_VANISHING_BLOCK.get()).partialState() + .with(LockedVanishingBlock.LOCKED, false).setModels(new ConfiguredModel(vanishUnlocked)); + + ModelFile ghastTrap = this.make3LayerCubeIdenticalSides1Bottom(TFBlocks.GHAST_TRAP.getId().getPath(), 0, 10, 15, 10, 10) + .texture("top", prefix("block/towerdev_ghasttraplid_off")) + .texture("side", prefix("block/towerdev_ghasttrap_off")) + .texture("bottom", prefix("block/encased_towerwood")) + .texture("top2", prefix("block/tower_device_level_2/towerdev_ghasttraplid_off_1")) + .texture("side2", prefix("block/tower_device_level_1/towerdev_ghasttrap_off_1")) + .texture("top3", prefix("block/tower_device_level_2/towerdev_ghasttraplid_off_1")) + .texture("side3", prefix("block/tower_device_level_2/towerdev_ghasttrap_off_2")); + ModelFile ghastTrapActive = this.make3LayerCubeIdenticalSides1Bottom(TFBlocks.GHAST_TRAP.getId().getPath() + "_active", 0, 10, 15, 7, 10) + .texture("top", prefix("block/towerdev_ghasttraplid_on")) + .texture("side", prefix("block/towerdev_ghasttrap_on")) + .texture("bottom", prefix("block/encased_towerwood")) + .texture("top2", prefix("block/tower_device_level_2/towerdev_ghasttraplid_on_1")) + .texture("side2", prefix("block/tower_device_level_1/towerdev_ghasttrap_on_1")) + .texture("top3", prefix("block/tower_device_level_3/towerdev_ghasttraplid_on_2")) + .texture("side3", prefix("block/tower_device_level_2/towerdev_ghasttrap_on_2")); + getVariantBuilder(TFBlocks.GHAST_TRAP.get()).partialState() + .with(GhastTrapBlock.ACTIVE, false).setModels(new ConfiguredModel(ghastTrap)); + getVariantBuilder(TFBlocks.GHAST_TRAP.get()).partialState() + .with(GhastTrapBlock.ACTIVE, true).setModels(new ConfiguredModel(ghastTrapActive)); + + ModelFile builder = this.make3LayerCubeAllSidesSame(TFBlocks.CARMINITE_BUILDER.getId().getPath(), CUTOUT, 0, 15, 10) + .texture("all", prefix("block/towerdev_builder_off")) + .texture("all2", prefix("block/tower_device_level_1/towerdev_builder_off_1")) + .texture("all3", prefix("block/tower_device_level_2/towerdev_builder_off_2")); + ModelFile builderActive = this.make3LayerCubeAllSidesSame(TFBlocks.CARMINITE_BUILDER.getId().getPath() + "_active", CUTOUT, 0, 15, 10) + .texture("all", prefix("block/towerdev_builder_on")) + .texture("all2", prefix("block/tower_device_level_1/towerdev_builder_on_1")) + .texture("all3", prefix("block/tower_device_level_2/towerdev_builder_on_2")); + ModelFile builderTimeout = this.make3LayerCubeAllSidesSame(TFBlocks.CARMINITE_BUILDER.getId().getPath() + "_timeout", CUTOUT, 0, 10, 7) + .texture("all", prefix("block/towerdev_builder_timeout")) + .texture("all2", prefix("block/tower_device_level_2/towerdev_builder_timeout_1")) + .texture("all3", prefix("block/tower_device_level_3/towerdev_builder_timeout_2")); + getVariantBuilder(TFBlocks.CARMINITE_BUILDER.get()).partialState() + .with(BuilderBlock.STATE, TowerDeviceVariant.BUILDER_INACTIVE).setModels(new ConfiguredModel(builder)); + getVariantBuilder(TFBlocks.CARMINITE_BUILDER.get()).partialState() + .with(BuilderBlock.STATE, TowerDeviceVariant.BUILDER_ACTIVE).setModels(new ConfiguredModel(builderActive)); + getVariantBuilder(TFBlocks.CARMINITE_BUILDER.get()).partialState() + .with(BuilderBlock.STATE, TowerDeviceVariant.BUILDER_TIMEOUT).setModels(new ConfiguredModel(builderTimeout)); + + ModelFile built = this.make2LayerCubeAllSidesSame(TFBlocks.BUILT_BLOCK.getId().getPath(), CUTOUT, 15, 15, false) + .texture("all", prefix("block/towerdev_built_off")) + .texture("all2", prefix("block/tower_device_level_1/towerdev_builder_off_1")); + ModelFile builtActive = this.make2LayerCubeAllSidesSame(TFBlocks.BUILT_BLOCK.getId().getPath() + "_active", CUTOUT, 15, 15, false) + .texture("all", prefix("block/towerdev_built_on")) + .texture("all2", prefix("block/tower_device_level_1/towerdev_builder_on_1")); + getVariantBuilder(TFBlocks.BUILT_BLOCK.get()).partialState() + .with(TranslucentBuiltBlock.ACTIVE, false).setModels(new ConfiguredModel(built)); + getVariantBuilder(TFBlocks.BUILT_BLOCK.get()).partialState() + .with(TranslucentBuiltBlock.ACTIVE, true).setModels(new ConfiguredModel(builtActive)); + + ModelFile antibuilder = this.make3LayerCubeAllSidesSame(TFBlocks.ANTIBUILDER.getId().getPath(), CUTOUT, 0, 15, 10) + .texture("all", prefix("block/towerdev_antibuilder")) + .texture("all2", prefix("block/tower_device_level_1/towerdev_antibuilder_1")) + .texture("all3", prefix("block/tower_device_level_2/towerdev_antibuilder_2")); + simpleBlock(TFBlocks.ANTIBUILDER.get(), antibuilder); + ModelFile antibuilt = this.make2LayerCubeAllSidesSame(TFBlocks.ANTIBUILT_BLOCK.getId().getPath(), CUTOUT, 0, 10, false) + .texture("all", prefix("block/towerdev_antibuilt")) + .texture("all2", prefix("block/tower_device_level_2/towerdev_antibuilt_1")); + simpleBlock(TFBlocks.ANTIBUILT_BLOCK.get(), antibuilt); + + ModelFile reactor = this.make3LayerCubeAllSidesSame(TFBlocks.CARMINITE_REACTOR.getId().getPath(), CUTOUT, 0, 15, 10) + .texture("all", prefix("block/towerdev_reactor_off")) + .texture("all2", prefix("block/tower_device_level_1/towerdev_reactor_off_1")) + .texture("all3", prefix("block/tower_device_level_2/towerdev_reactor_off_2")); + ModelFile reactorActive = this.make3LayerCubeAllSidesSame(TFBlocks.CARMINITE_REACTOR.getId().getPath() + "_active", CUTOUT, 0, 15, 10) + .texture("all", prefix("block/towerdev_reactor_on")) + .texture("all2", prefix("block/tower_device_level_1/towerdev_reactor_on_1")) + .texture("all3", prefix("block/tower_device_level_2/towerdev_reactor_on_2")); + getVariantBuilder(TFBlocks.CARMINITE_REACTOR.get()).partialState() + .with(CarminiteReactorBlock.ACTIVE, false).setModels(new ConfiguredModel(reactor)); + getVariantBuilder(TFBlocks.CARMINITE_REACTOR.get()).partialState() + .with(CarminiteReactorBlock.ACTIVE, true).setModels(new ConfiguredModel(reactorActive)); + simpleBlock(TFBlocks.REACTOR_DEBRIS.get(), models().cubeAll(TFBlocks.REACTOR_DEBRIS.getId().getPath(), new ResourceLocation("block/destroy_stage_9")).renderType(CUTOUT)); + } + + private ModelFile pedestalModel(String name, String north, String south, String west, String east, boolean active) { + BlockModelBuilder ret = this.makePedestal(name, active) + .texture("end", prefix("block/pedestal/top")) + .texture("north", prefix("block/pedestal/" + north + "_latent")) + .texture("south", prefix("block/pedestal/" + south + "_latent")) + .texture("west", prefix("block/pedestal/" + west + "_latent")) + .texture("east", prefix("block/pedestal/" + east + "_latent")); + if (active) { + ret = ret + .texture("end2", prefix("block/pedestal/top_glow")) + .texture("north2", prefix("block/pedestal/" + north + "_glow")) + .texture("south2", prefix("block/pedestal/" + south + "_glow")) + .texture("west2", prefix("block/pedestal/" + west + "_glow")) + .texture("east2", prefix("block/pedestal/" + east + "_glow")) + .texture("north3", prefix("block/pedestal/" + north)) + .texture("south3", prefix("block/pedestal/" + south)) + .texture("west3", prefix("block/pedestal/" + west)) + .texture("east3", prefix("block/pedestal/" + east)); + } + return ret; + } + + private void trophyPedestal() { + String baseName = TFBlocks.TROPHY_PEDESTAL.getId().getPath(); + ModelFile latent0 = pedestalModel(baseName, "naga", "lich", "hydra", "ur-ghast", false); + ModelFile latent1 = pedestalModel(baseName + "_1", "snow_queen", "naga", "lich", "hydra", false); + ModelFile latent2 = pedestalModel(baseName + "_2", "ur-ghast", "snow_queen", "naga", "lich", false); + ModelFile latent3 = pedestalModel(baseName + "_3", "hydra", "ur-ghast", "snow_queen", "naga", false); + ModelFile latent4 = pedestalModel(baseName + "_4", "lich", "hydra", "ur-ghast", "snow_queen", false); + + List latentModels = new ArrayList<>(); + for (ModelFile f : Arrays.asList(latent0, latent1, latent2, latent3, latent4)) { + latentModels.add(new ConfiguredModel(f, 0, 0, false)); + latentModels.add(new ConfiguredModel(f, 0, 90, false)); + latentModels.add(new ConfiguredModel(f, 0, 180, false)); + latentModels.add(new ConfiguredModel(f, 0, 270, false)); + } + getVariantBuilder(TFBlocks.TROPHY_PEDESTAL.get()).partialState() + .with(TrophyPedestalBlock.ACTIVE, false).setModels(latentModels.toArray(new ConfiguredModel[0])); + + + ModelFile active0 = pedestalModel(baseName + "_active", "naga", "lich", "hydra", "ur-ghast", true); + ModelFile active1 = pedestalModel(baseName + "_active_1", "snow_queen", "naga", "lich", "hydra", true); + ModelFile active2 = pedestalModel(baseName + "_active_2", "ur-ghast", "snow_queen", "naga", "lich", true); + ModelFile active3 = pedestalModel(baseName + "_active_3", "hydra", "ur-ghast", "snow_queen", "naga", true); + ModelFile active4 = pedestalModel(baseName + "_active_4", "lich", "hydra", "ur-ghast", "snow_queen", true); + + List activeModels = new ArrayList<>(); + for (ModelFile f : Arrays.asList(active0, active1, active2, active3, active4)) { + activeModels.add(new ConfiguredModel(f, 0, 0, false)); + activeModels.add(new ConfiguredModel(f, 0, 90, false)); + activeModels.add(new ConfiguredModel(f, 0, 180, false)); + activeModels.add(new ConfiguredModel(f, 0, 270, false)); + } + getVariantBuilder(TFBlocks.TROPHY_PEDESTAL.get()).partialState() + .with(TrophyPedestalBlock.ACTIVE, true).setModels(activeModels.toArray(new ConfiguredModel[0])); + } + + private void thorns() { + for (RegistryObject block : ImmutableList.of(TFBlocks.GREEN_THORNS, TFBlocks.BROWN_THORNS, TFBlocks.BURNT_THORNS)) { + String path = block.getId().getPath(); + ResourceLocation sideTexture = prefix("block/" + path + "_side"); + ResourceLocation endTexture = prefix("block/" + path + "_top"); + + models().withExistingParent(path, prefix("block/thorns_main")).renderType(CUTOUT)//This is just used for the item model + .texture("side", sideTexture) + .texture("end", endTexture); + + ModelFile thorns = models().withExistingParent(path + "_thorns", prefix("block/thorns")).renderType(CUTOUT) + .texture("side", sideTexture); + + ModelFile top = models().withExistingParent(path + "_top", prefix("block/thorns_section_top")).renderType(CUTOUT) + .texture("side", sideTexture) + .texture("end", endTexture); + + ModelFile bottom = models().withExistingParent(path + "_bottom", prefix("block/thorns_section_bottom")).renderType(CUTOUT) + .texture("side", sideTexture) + .texture("end", endTexture); + + ModelFile section = models().withExistingParent(path + "_no_section", prefix("block/thorns_no_section")).renderType(CUTOUT) + .texture("side", sideTexture); + + ModelFile noSectionAlt = models().withExistingParent(path + "_no_section_alt", prefix("block/thorns_no_section_alt")).renderType(CUTOUT) + .texture("side", sideTexture); + + getMultipartBuilder(block.get()) + .part().modelFile(thorns).addModel().condition(RotatedPillarBlock.AXIS, Direction.Axis.Y).end() + .part().modelFile(thorns).rotationX(90).addModel().condition(RotatedPillarBlock.AXIS, Direction.Axis.Z).end() + .part().modelFile(thorns).rotationX(90).rotationY(90).addModel().condition(RotatedPillarBlock.AXIS, Direction.Axis.X).end() + + .part().modelFile(top).rotationX(90).addModel().condition(PipeBlock.UP, true).end() + .part().modelFile(section).rotationX(270).addModel().condition(PipeBlock.UP, false).condition(RotatedPillarBlock.AXIS, Direction.Axis.Z, Direction.Axis.Y).end() + .part().modelFile(section).rotationX(270).rotationY(90).addModel().condition(PipeBlock.UP, false).condition(RotatedPillarBlock.AXIS, Direction.Axis.X).end() + + .part().modelFile(bottom).rotationX(90).addModel().condition(PipeBlock.DOWN, true).end() + .part().modelFile(section).rotationX(90).addModel().condition(PipeBlock.DOWN, false).condition(RotatedPillarBlock.AXIS, Direction.Axis.Z, Direction.Axis.Y).end() + .part().modelFile(section).rotationX(90).rotationY(90).addModel().condition(PipeBlock.DOWN, false).condition(RotatedPillarBlock.AXIS, Direction.Axis.X).end() + + .part().modelFile(top).rotationY(270).addModel().condition(PipeBlock.EAST, true).end() + .part().modelFile(section).rotationY(90).addModel().condition(PipeBlock.EAST, false).condition(RotatedPillarBlock.AXIS, Direction.Axis.Y, Direction.Axis.X).end() + .part().modelFile(noSectionAlt).rotationY(90).addModel().condition(PipeBlock.EAST, false).condition(RotatedPillarBlock.AXIS, Direction.Axis.Z).end() + + .part().modelFile(bottom).rotationY(270).addModel().condition(PipeBlock.WEST, true).end() + .part().modelFile(section).rotationY(270).addModel().condition(PipeBlock.WEST, false).condition(RotatedPillarBlock.AXIS, Direction.Axis.Y, Direction.Axis.X).end() + .part().modelFile(noSectionAlt).rotationY(270).addModel().condition(PipeBlock.WEST, false).condition(RotatedPillarBlock.AXIS, Direction.Axis.Z).end() + + .part().modelFile(top).addModel().condition(PipeBlock.SOUTH, true).end() + .part().modelFile(section).rotationY(180).addModel().condition(PipeBlock.SOUTH, false).condition(RotatedPillarBlock.AXIS, Direction.Axis.Y, Direction.Axis.Z).end() + .part().modelFile(noSectionAlt).rotationY(180).addModel().condition(PipeBlock.SOUTH, false).condition(RotatedPillarBlock.AXIS, Direction.Axis.X).end() + + .part().modelFile(bottom).addModel().condition(PipeBlock.NORTH, true).end() + .part().modelFile(section).addModel().condition(PipeBlock.NORTH, false).condition(RotatedPillarBlock.AXIS, Direction.Axis.Y, Direction.Axis.Z).end() + .part().modelFile(noSectionAlt).addModel().condition(PipeBlock.NORTH, false).condition(RotatedPillarBlock.AXIS, Direction.Axis.X).end(); + } + } + + private void thornRose() { + ModelFile rose = models().cross(TFBlocks.THORN_ROSE.getId().getPath(), blockTexture(TFBlocks.THORN_ROSE.get())).renderType(CUTOUT); + getVariantBuilder(TFBlocks.THORN_ROSE.get()).forAllStates(state -> switch (state.getValue(DirectionalBlock.FACING)) { + case UP -> ConfiguredModel.builder().modelFile(rose).build(); + case DOWN -> ConfiguredModel.builder().modelFile(rose).rotationX(180).build(); + case SOUTH -> ConfiguredModel.builder().modelFile(rose).rotationX(270).build(); + case NORTH -> ConfiguredModel.builder().modelFile(rose).rotationX(90).build(); + case WEST -> ConfiguredModel.builder().modelFile(rose).rotationY(90).rotationX(270).build(); + case EAST -> ConfiguredModel.builder().modelFile(rose).rotationY(90).rotationX(90).build(); + }); + } + + private void auroraBlocks() { + int variants = 16; + ModelFile[] models = new ModelFile[variants]; + for (int i = 0; i < variants; i++) { + models[i] = this.makeTintedBlockAll(TFBlocks.AURORA_BLOCK.getId().getPath() + "_" + i, SOLID) + .texture("all", prefix("block/" + TFBlocks.AURORA_BLOCK.getId().getPath() + "_" + i)); + } + for (int i = 0; i < variants; i++) { + getVariantBuilder(TFBlocks.AURORA_BLOCK.get()).partialState().with(AuroraBrickBlock.VARIANT, i) + .setModels(ConfiguredModel.builder() + .weight(3).modelFile(models[i]).nextModel() + .weight(1).modelFile(models[(i + 1) % variants]).build()); + } + + ModelFile pillarModel = this.makeTintedBlockColumn(TFBlocks.AURORA_PILLAR.getId().getPath()) + .texture("end", prefix("block/" + TFBlocks.AURORA_PILLAR.getId().getPath() + "_top")) + .texture("side", blockTexture(TFBlocks.AURORA_PILLAR.get())); + axisBlock(TFBlocks.AURORA_PILLAR.get(), pillarModel, pillarModel); + + ModelFile slabModel = this.makeTintedSlab(TFBlocks.AURORA_SLAB.getId().getPath()) + .texture("bottom", prefix("block/" + TFBlocks.AURORA_PILLAR.getId().getPath() + "_top")) + .texture("top", prefix("block/" + TFBlocks.AURORA_PILLAR.getId().getPath() + "_top")) + .texture("side", prefix("block/" + TFBlocks.AURORA_SLAB.getId().getPath() + "_side")); + ModelFile doubleSlabModel = this.makeTintedBlockColumn(TFBlocks.AURORA_SLAB.getId().getPath() + "_double") + .texture("end", prefix("block/" + TFBlocks.AURORA_PILLAR.getId().getPath() + "_top")) + .texture("side", prefix("block/" + TFBlocks.AURORA_SLAB.getId().getPath() + "_side")); + + getVariantBuilder(TFBlocks.AURORA_SLAB.get()).partialState() + .with(SlabBlock.TYPE, SlabType.BOTTOM).setModels(new ConfiguredModel(slabModel)); + getVariantBuilder(TFBlocks.AURORA_SLAB.get()).partialState() + .with(SlabBlock.TYPE, SlabType.TOP).setModels(ConfiguredModel.builder().uvLock(true).rotationX(180).modelFile(slabModel).build()); + getVariantBuilder(TFBlocks.AURORA_SLAB.get()).partialState() + .with(SlabBlock.TYPE, SlabType.DOUBLE).setModels(new ConfiguredModel(doubleSlabModel)); + + ModelFile auroraGlass = this.makeTintedBlockAll(TFBlocks.AURORALIZED_GLASS.getId().getPath(), TRANSLUCENT) + .texture("all", blockTexture(TFBlocks.AURORALIZED_GLASS.get())); + simpleBlock(TFBlocks.AURORALIZED_GLASS.get(), auroraGlass); + } + + private void mazestone() { + ResourceLocation plainTex = blockTexture(TFBlocks.MAZESTONE.get()); + + ModelFile mazeStone = models().cubeAll(TFBlocks.MAZESTONE.getId().getPath(), plainTex); + simpleBlock(TFBlocks.MAZESTONE.get(), ConfiguredModel.builder() + .rotationX(90).rotationY(90).modelFile(mazeStone).nextModel() + .rotationX(270).rotationY(270).modelFile(mazeStone).build()); + simpleBlock(TFBlocks.MAZESTONE_BRICK.get()); + + ModelFile chiseled = models().cubeColumn(TFBlocks.CUT_MAZESTONE.getId().getPath(), blockTexture(TFBlocks.CUT_MAZESTONE.get()), plainTex); + simpleBlock(TFBlocks.CUT_MAZESTONE.get(), chiseled); + + ModelFile decorative = models().cubeColumn(TFBlocks.DECORATIVE_MAZESTONE.getId().getPath(), blockTexture(TFBlocks.DECORATIVE_MAZESTONE.get()), plainTex); + simpleBlock(TFBlocks.DECORATIVE_MAZESTONE.get(), decorative); + + simpleBlock(TFBlocks.CRACKED_MAZESTONE.get()); + simpleBlock(TFBlocks.MOSSY_MAZESTONE.get()); + + ResourceLocation brickTex = blockTexture(TFBlocks.MAZESTONE_BRICK.get()); + ModelFile mosaic = models().cubeColumn(TFBlocks.MAZESTONE_MOSAIC.getId().getPath(), brickTex, blockTexture(TFBlocks.MAZESTONE_MOSAIC.get())); + simpleBlock(TFBlocks.MAZESTONE_MOSAIC.get(), mosaic); + + ModelFile border = models().cubeColumn(TFBlocks.MAZESTONE_BORDER.getId().getPath(), brickTex, blockTexture(TFBlocks.MAZESTONE_BORDER.get())); + simpleBlock(TFBlocks.MAZESTONE_BORDER.get(), border); + } + + private void lilyPad(Block b) { + String baseName = name(b); + ResourceLocation parent = prefix("block/huge_lily_pad"); + ModelFile[] models = new ModelFile[4]; + for (int i = 0; i < models.length; i++) { + models[i] = models().withExistingParent(baseName + "_" + i, parent).renderType(CUTOUT) + .texture("texture", prefix("block/huge_lily_pad_" + i)) + .texture("particle", "#texture"); + } + + Map north = ImmutableMap.of(HugeLilypadPiece.NW, models[1], + HugeLilypadPiece.NE, models[0], HugeLilypadPiece.SE, models[3], HugeLilypadPiece.SW, models[2]); + Map south = ImmutableMap.of(HugeLilypadPiece.NW, models[3], + HugeLilypadPiece.NE, models[2], HugeLilypadPiece.SE, models[1], HugeLilypadPiece.SW, models[0]); + Map west = ImmutableMap.of(HugeLilypadPiece.NW, models[0], + HugeLilypadPiece.NE, models[3], HugeLilypadPiece.SE, models[2], HugeLilypadPiece.SW, models[1]); + Map east = ImmutableMap.of(HugeLilypadPiece.NW, models[2], + HugeLilypadPiece.NE, models[1], HugeLilypadPiece.SE, models[0], HugeLilypadPiece.SW, models[3]); + + getVariantBuilder(b).forAllStates(state -> { + int rotY; + Map m; + switch (state.getValue(HugeLilyPadBlock.FACING)) { + case SOUTH -> { + rotY = 180; + m = south; + } + case WEST -> { + rotY = 270; + m = west; + } + case EAST -> { + rotY = 90; + m = east; + } + default -> { + rotY = 0; + m = north; + } + } + + ModelFile model = m.get(state.getValue(HugeLilyPadBlock.PIECE)); + return ConfiguredModel.builder().rotationY(rotY).modelFile(model).build(); + }); + } + + @SuppressWarnings("SuspiciousNameCombination") + private void candelabra() { + // TODO variants + final List candelabras = new ArrayList<>(); + final List wallCandelabras = new ArrayList<>(); + + final int minHeight = 4; + final int maxHeight = 5; + for (int right = minHeight; right <= maxHeight; right++) { + for (int center = minHeight; center <= maxHeight; center++) { + for (int left = minHeight; left <= maxHeight; left++) { + candelabras.add(this.buildCandelabra(left, center, right)); + wallCandelabras.add(this.buildWallCandelabra(left, center, right)); + } + } + } + + this.getVariantBuilder(TFBlocks.CANDELABRA.get()).forAllStates(state -> { + Direction direction = state.getValue(CandelabraBlock.FACING); + boolean onWall = state.getValue(CandelabraBlock.ON_WALL); + boolean lit = state.getValue(CandelabraBlock.LIGHTING) != AbstractLightableBlock.Lighting.NONE; + + ConfiguredModel.Builder stateBuilder = ConfiguredModel.builder(); + + Iterator models = onWall ? wallCandelabras.iterator() : candelabras.iterator(); + + while (models.hasNext()) { + ModelFile model = models.next(); + stateBuilder.modelFile(this.models().getBuilder(model.getLocation().toString() + "_plain" + (lit ? "_lit" : "")).parent(model).renderType(CUTOUT).texture("candle", lit ? "minecraft:block/candle_lit" : "minecraft:block/candle")).rotationY((int) direction.toYRot()); + + if (models.hasNext()) + stateBuilder = stateBuilder.nextModel(); + } + + return stateBuilder.build(); + }); + } + + private void perFaceBlock(Block b, ResourceLocation inside, ResourceLocation outside) { + ModelFile modelInside = models().withExistingParent(name(b) + "_inside", new ResourceLocation("block/template_single_face")) + .texture("texture", inside); + ModelFile modelOutside = models().withExistingParent(name(b) + "_outside", new ResourceLocation("block/template_single_face")) + .texture("texture", outside); + getMultipartBuilder(b).part().modelFile(modelInside).addModel().condition(HugeMushroomBlock.NORTH, false).end(); + getMultipartBuilder(b).part().modelFile(modelOutside).addModel().condition(HugeMushroomBlock.NORTH, true).end(); + getMultipartBuilder(b).part().modelFile(modelInside).uvLock(true).rotationY(180).addModel().condition(HugeMushroomBlock.SOUTH, false).end(); + getMultipartBuilder(b).part().modelFile(modelOutside).uvLock(true).rotationY(180).addModel().condition(HugeMushroomBlock.SOUTH, true).end(); + getMultipartBuilder(b).part().modelFile(modelInside).uvLock(true).rotationY(270).addModel().condition(HugeMushroomBlock.WEST, false).end(); + getMultipartBuilder(b).part().modelFile(modelOutside).uvLock(true).rotationY(270).addModel().condition(HugeMushroomBlock.WEST, true).end(); + getMultipartBuilder(b).part().modelFile(modelInside).uvLock(true).rotationY(90).addModel().condition(HugeMushroomBlock.EAST, false).end(); + getMultipartBuilder(b).part().modelFile(modelOutside).uvLock(true).rotationY(90).addModel().condition(HugeMushroomBlock.EAST, true).end(); + getMultipartBuilder(b).part().modelFile(modelInside).uvLock(true).rotationX(270).addModel().condition(HugeMushroomBlock.UP, false).end(); + getMultipartBuilder(b).part().modelFile(modelOutside).uvLock(true).rotationX(270).addModel().condition(HugeMushroomBlock.UP, true).end(); + getMultipartBuilder(b).part().modelFile(modelInside).uvLock(true).rotationX(90).addModel().condition(HugeMushroomBlock.DOWN, false).end(); + getMultipartBuilder(b).part().modelFile(modelOutside).uvLock(true).rotationX(90).addModel().condition(HugeMushroomBlock.DOWN, true).end(); + } + + private void hollowLogs(Block originalLog, Block strippedLog, RegistryObject horizontalHollowLog, RegistryObject verticalHollowLog, RegistryObject climbableHollowLog, ModelFile emptyLog, ModelFile mossLog, ModelFile grassLog, ModelFile snowLog, ModelFile hollowLog, ModelFile vineLog, ModelFile ladderLog) { + ResourceLocation top = new ResourceLocation("block/" + name(originalLog) + "_top"); + ResourceLocation side = new ResourceLocation("block/" + name(originalLog)); + ResourceLocation inner = new ResourceLocation("block/" + name(strippedLog)); + + this.getVariantBuilder(horizontalHollowLog.get()).forAllStates(state -> ConfiguredModel.builder().modelFile((switch (state.getValue(HollowLogHorizontal.VARIANT)) { + case MOSS -> models().getBuilder(horizontalHollowLog.getId().getPath() + "_moss").parent(mossLog); + case MOSS_AND_GRASS -> models().getBuilder(horizontalHollowLog.getId().getPath() + "_moss_grass").parent(grassLog); + case SNOW -> models().getBuilder(horizontalHollowLog.getId().getPath() + "_snow").parent(snowLog); + default -> models().getBuilder(horizontalHollowLog.getId().getPath()).parent(emptyLog); + }).renderType(CUTOUT).texture("top", top).texture("side", side).texture("inner", inner)).rotationY(state.getValue(HollowLogHorizontal.HORIZONTAL_AXIS) == Direction.Axis.X ? 90 : 0).build()); + + this.simpleBlock(verticalHollowLog.get(), models().getBuilder(verticalHollowLog.getId().getPath()).parent(hollowLog).texture("top", top).texture("side", side).texture("inner", inner)); + + this.getVariantBuilder(climbableHollowLog.get()).forAllStates(state -> ConfiguredModel.builder().modelFile((switch (state.getValue(HollowLogClimbable.VARIANT)) { + case VINE -> models().getBuilder(climbableHollowLog.getId().getPath() + "_vine").parent(vineLog); + case LADDER, LADDER_WATERLOGGED -> models().getBuilder(climbableHollowLog.getId().getPath() + "_ladder").parent(ladderLog); + }).renderType(CUTOUT).texture("top", top).texture("side", side).texture("inner", inner)).rotationY((int) state.getValue(HollowLogClimbable.FACING).toYRot()).uvLock(true).build()); + } + + private void hollowLogs(RegistryObject originalLog, RegistryObject strippedLog, RegistryObject horizontalHollowLog, RegistryObject verticalHollowLog, RegistryObject climbableHollowLog, ModelFile emptyLog, ModelFile mossLog, ModelFile grassLog, ModelFile snowLog, ModelFile hollowLog, ModelFile vineLog, ModelFile ladderLog) { + ResourceLocation top = TwilightForestMod.prefix("block/" + originalLog.getId().getPath() + "_top"); + ResourceLocation side = TwilightForestMod.prefix("block/" + originalLog.getId().getPath()); + ResourceLocation inner = TwilightForestMod.prefix("block/" + strippedLog.getId().getPath()); + + this.getVariantBuilder(horizontalHollowLog.get()).forAllStates(state -> ConfiguredModel.builder().modelFile((switch (state.getValue(HollowLogHorizontal.VARIANT)) { + case MOSS -> models().getBuilder(horizontalHollowLog.getId().getPath() + "_moss").parent(mossLog); + case MOSS_AND_GRASS -> models().getBuilder(horizontalHollowLog.getId().getPath() + "_moss_grass").parent(grassLog); + case SNOW -> models().getBuilder(horizontalHollowLog.getId().getPath() + "_snow").parent(snowLog); + default -> models().getBuilder(horizontalHollowLog.getId().getPath()).parent(emptyLog); + }).renderType(CUTOUT).texture("top", top).texture("side", side).texture("inner", inner)).rotationY(state.getValue(HollowLogHorizontal.HORIZONTAL_AXIS) == Direction.Axis.X ? 90 : 0).build()); + + this.simpleBlock(verticalHollowLog.get(), models().getBuilder(verticalHollowLog.getId().getPath()).parent(hollowLog).texture("top", top).texture("side", side).texture("inner", inner)); + + this.getVariantBuilder(climbableHollowLog.get()).forAllStates(state -> ConfiguredModel.builder().modelFile((switch (state.getValue(HollowLogClimbable.VARIANT)) { + case VINE -> models().getBuilder(climbableHollowLog.getId().getPath() + "_vine").parent(vineLog); + case LADDER, LADDER_WATERLOGGED -> models().getBuilder(climbableHollowLog.getId().getPath() + "_ladder").parent(ladderLog); + }).renderType(CUTOUT).texture("top", top).texture("side", side).texture("inner", inner)).rotationY((int) state.getValue(HollowLogClimbable.FACING).toYRot()).uvLock(true).build()); + } + + @Nonnull + @Override + public String getName() { + return "TwilightForest blockstates and block models"; + } +} diff --git a/src/main/java/twilightforest/data/ChestLootTables.java b/src/main/java/twilightforest/data/ChestLootTables.java new file mode 100644 index 0000000000..e49c7312fb --- /dev/null +++ b/src/main/java/twilightforest/data/ChestLootTables.java @@ -0,0 +1,866 @@ +package twilightforest.data; + +import net.minecraft.Util; +import net.minecraft.data.loot.LootTableSubProvider; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.storage.loot.LootPool; +import net.minecraft.world.level.storage.loot.LootTable; +import net.minecraft.world.level.storage.loot.entries.EmptyLootItem; +import net.minecraft.world.level.storage.loot.entries.LootItem; +import net.minecraft.world.level.storage.loot.entries.LootTableReference; +import net.minecraft.world.level.storage.loot.functions.*; +import net.minecraft.world.level.storage.loot.providers.number.ConstantValue; +import net.minecraft.world.level.storage.loot.providers.number.UniformGenerator; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFEnchantments; +import twilightforest.init.TFItems; +import twilightforest.loot.TFLootTables; + +import java.util.function.BiConsumer; + +@SuppressWarnings("deprecation") +public class ChestLootTables implements LootTableSubProvider { + + @Override + public void generate(BiConsumer register) { + register.accept(TFLootTables.USELESS_LOOT.lootTable, + LootTable.lootTable() + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + .add(LootItem.lootTableItem(Items.POPPY).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 4)))) + .add(LootItem.lootTableItem(Items.DANDELION).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 4)))) + .add(LootItem.lootTableItem(Items.FEATHER).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 3)))) + .add(LootItem.lootTableItem(Items.WHEAT_SEEDS).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 2)))) + .add(LootItem.lootTableItem(Items.FLINT).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 2)))) + .add(LootItem.lootTableItem(Items.CACTUS).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 2)))) + .add(LootItem.lootTableItem(Items.SUGAR_CANE).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 4)))) + .add(LootItem.lootTableItem(Items.SAND).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 4)))) + .add(LootItem.lootTableItem(Items.FLOWER_POT)) + .add(LootItem.lootTableItem(Items.BONE_MEAL)))); + + register.accept(TFLootTables.BASEMENT.lootTable, + LootTable.lootTable() + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(4)) + .add(LootTableReference.lootTableReference(TFLootTables.USELESS_LOOT.lootTable).setWeight(25)) + //common loot + .add(LootItem.lootTableItem(Items.POTION).apply(SetNbtFunction.setTag(Util.make(new CompoundTag(), (nbt) -> nbt.putString("Potion", "minecraft:water")))).setWeight(75)) + .add(LootItem.lootTableItem(Items.ROTTEN_FLESH).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 6))).setWeight(75)) + .add(LootItem.lootTableItem(Items.POISONOUS_POTATO).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 2))).setWeight(75)) + .add(LootItem.lootTableItem(Items.WHEAT).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 6))).setWeight(75)) + .add(LootItem.lootTableItem(Items.POTATO).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 6))).setWeight(75)) + .add(LootItem.lootTableItem(Items.CARROT).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 6))).setWeight(75)) + .add(LootItem.lootTableItem(Items.MELON_SLICE).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 6))).setWeight(75)) + .add(LootItem.lootTableItem(Items.WATER_BUCKET).setWeight(75)) + .add(LootItem.lootTableItem(Items.TORCH).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 12))).setWeight(75)) + .add(LootItem.lootTableItem(Items.MUSHROOM_STEW).setWeight(75)) + .add(LootItem.lootTableItem(Items.MILK_BUCKET).setWeight(75)) + .add(LootItem.lootTableItem(Items.SWEET_BERRIES).apply(SetItemCountFunction.setCount(UniformGenerator.between(2, 7))).setWeight(75)) + .add(LootItem.lootTableItem(Items.MELON_SEEDS).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 5))).setWeight(75))) + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(2)) + //uncommon loot + .add(LootItem.lootTableItem(Items.BREAD).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 8)))) + .add(LootItem.lootTableItem(Items.COOKED_BEEF).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 6)))) + .add(LootItem.lootTableItem(Items.COOKED_PORKCHOP).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 8)))) + .add(LootItem.lootTableItem(Items.BAKED_POTATO).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 8)))) + .add(LootItem.lootTableItem(Items.COOKED_CHICKEN).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 10)))) + .add(LootItem.lootTableItem(Items.COOKED_COD).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 8))))) + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + //rare loot + .add(LootItem.lootTableItem(Items.GLISTERING_MELON_SLICE).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 12))).setWeight(75)) + .add(LootItem.lootTableItem(Items.APPLE).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 12))).setWeight(75)) + .add(LootItem.lootTableItem(Items.MAP).setWeight(75)) + .add(LootItem.lootTableItem(TFItems.CHARM_OF_KEEPING_1.get()).setWeight(75)) + //ultrarare loot + .add(LootItem.lootTableItem(Items.GOLDEN_APPLE).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 2))).setWeight(25)) + .add(LootItem.lootTableItem(Items.GOLDEN_CARROT).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 2))).setWeight(25)) + .add(LootItem.lootTableItem(Items.CAKE).setWeight(25)) + .add(LootItem.lootTableItem(Items.OAK_BOAT).setWeight(25)) + .add(LootItem.lootTableItem(TFBlocks.HOLLOW_OAK_SAPLING.get().asItem()).setWeight(25)) + .add(LootItem.lootTableItem(TFItems.MUSIC_DISC_HOME.get()).setWeight(15)) + .add(LootItem.lootTableItem(TFItems.MUSIC_DISC_RADIANCE.get()).setWeight(15)))); + + register.accept(TFLootTables.FOUNDATION_BASEMENT.lootTable, + LootTable.lootTable() + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(4)) + .add(LootTableReference.lootTableReference(TFLootTables.USELESS_LOOT.lootTable).setWeight(25)) + //common loot + .add(LootItem.lootTableItem(Items.POTION).apply(SetNbtFunction.setTag(Util.make(new CompoundTag(), (nbt) -> nbt.putString("Potion", "minecraft:water")))).setWeight(75)) + .add(LootItem.lootTableItem(Items.ROTTEN_FLESH).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 6))).setWeight(75)) + .add(LootItem.lootTableItem(Items.POISONOUS_POTATO).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 2))).setWeight(75)) + .add(LootItem.lootTableItem(Items.WATER_BUCKET).setWeight(75)) + .add(LootItem.lootTableItem(Items.TORCH).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 12))).setWeight(75)) + .add(LootItem.lootTableItem(Items.MILK_BUCKET).setWeight(75))) + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(2)) + //uncommon loot + .add(LootItem.lootTableItem(Items.WHEAT).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 6)))) + .add(LootItem.lootTableItem(Items.POTION).apply(SetNbtFunction.setTag(Util.make(new CompoundTag(), (nbt) -> nbt.putString("Potion", "minecraft:awkward"))))) + .add(LootItem.lootTableItem(Items.POTION).apply(SetNbtFunction.setTag(Util.make(new CompoundTag(), (nbt) -> nbt.putString("Potion", "minecraft:mundane"))))) + .add(LootItem.lootTableItem(Items.POTION).apply(SetNbtFunction.setTag(Util.make(new CompoundTag(), (nbt) -> nbt.putString("Potion", "minecraft:thick"))))) + .add(LootItem.lootTableItem(Items.ROTTEN_FLESH).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 6)))) + .add(LootItem.lootTableItem(Items.MELON_SEEDS).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 5)))) + .add(LootItem.lootTableItem(Items.PUMPKIN_SEEDS).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 5))))) + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + //rare loot + .add(LootItem.lootTableItem(Items.GLISTERING_MELON_SLICE).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 12))).setWeight(75)) + .add(LootItem.lootTableItem(Items.MAP).setWeight(75)) + .add(LootItem.lootTableItem(TFItems.CHARM_OF_KEEPING_1.get()).setWeight(75)) + .add(LootItem.lootTableItem(TFItems.MUSIC_DISC_THREAD.get()).setWeight(50)) + //ultrarare loot + .add(LootItem.lootTableItem(Items.GOLDEN_APPLE).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 2))).setWeight(25)) + .add(LootItem.lootTableItem(Items.GOLDEN_CARROT).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 2))).setWeight(25)) + .add(LootItem.lootTableItem(Items.OAK_BOAT).setWeight(25)) + .add(LootItem.lootTableItem(TFBlocks.HOLLOW_OAK_SAPLING.get().asItem()).setWeight(25)))); + + register.accept(TFLootTables.WELL.lootTable, + LootTable.lootTable() + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(4)) + //common loot + .add(LootItem.lootTableItem(Items.GOLD_NUGGET).apply(SetItemCountFunction.setCount(UniformGenerator.between(3, 5))).setWeight(75)) + .add(LootItem.lootTableItem(Items.IRON_NUGGET).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 3))).setWeight(75)) + .add(LootItem.lootTableItem(Items.STRING).apply(SetItemCountFunction.setCount(UniformGenerator.between(2, 6))).setWeight(75)) + .add(LootItem.lootTableItem(Items.STICK).apply(SetItemCountFunction.setCount(UniformGenerator.between(3, 7))).setWeight(75)) + .add(EmptyLootItem.emptyItem().setWeight(25))) + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(2)) + //uncommon loot + .add(LootItem.lootTableItem(Items.BUCKET)) + .add(LootItem.lootTableItem(Items.MELON_SEEDS).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 4)))) + .add(LootItem.lootTableItem(Items.PUMPKIN_SEEDS).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 4)))) + .add(LootItem.lootTableItem(Items.INK_SAC).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 2)))) + .add(LootItem.lootTableItem(Items.WATER_BUCKET)) + .add(LootItem.lootTableItem(Items.BOWL)) + .add(LootItem.lootTableItem(TFItems.RAW_IRONWOOD.get())) + .add(LootItem.lootTableItem(Items.IRON_INGOT).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 2)))) + .add(LootItem.lootTableItem(Items.GOLD_INGOT).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 2)))) + .add(LootItem.lootTableItem(Items.COPPER_INGOT).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 2))))) + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + //rare loot + .add(LootItem.lootTableItem(Items.SHEARS)) + .add(LootItem.lootTableItem(Items.SADDLE)) + .add(LootItem.lootTableItem(Items.DIAMOND)) + .add(LootItem.lootTableItem(Items.EXPERIENCE_BOTTLE).apply(SetItemCountFunction.setCount(UniformGenerator.between(2, 4)))))); + + register.accept(TFLootTables.FANCY_WELL.lootTable, + LootTable.lootTable() + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(4)) + //common loot + .add(LootItem.lootTableItem(Items.GOLD_NUGGET).apply(SetItemCountFunction.setCount(UniformGenerator.between(5, 15)))) + .add(LootItem.lootTableItem(Items.IRON_NUGGET).apply(SetItemCountFunction.setCount(UniformGenerator.between(6, 12)))) + .add(LootItem.lootTableItem(Items.STRING).apply(SetItemCountFunction.setCount(UniformGenerator.between(4, 7)))) + .add(LootItem.lootTableItem(Items.STICK).apply(SetItemCountFunction.setCount(UniformGenerator.between(5, 20))))) + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(2)) + //uncommon loot + .add(LootItem.lootTableItem(Items.BUCKET)) + .add(LootItem.lootTableItem(Items.WATER_BUCKET)) + .add(LootItem.lootTableItem(TFItems.RAW_IRONWOOD.get()).apply(SetItemCountFunction.setCount(UniformGenerator.between(3, 7)))) + .add(LootItem.lootTableItem(Items.IRON_INGOT).apply(SetItemCountFunction.setCount(UniformGenerator.between(3, 5)))) + .add(LootItem.lootTableItem(Items.GOLD_INGOT).apply(SetItemCountFunction.setCount(UniformGenerator.between(2, 4)))) + .add(LootItem.lootTableItem(Items.COPPER_INGOT).apply(SetItemCountFunction.setCount(UniformGenerator.between(4, 8))))) + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + //rare loot + .add(LootItem.lootTableItem(Items.EXPERIENCE_BOTTLE).apply(SetItemCountFunction.setCount(UniformGenerator.between(5, 9))).setWeight(75)) + .add(LootItem.lootTableItem(TFItems.CHARM_OF_LIFE_1.get()).setWeight(75)) + .add(LootItem.lootTableItem(TFItems.MUSIC_DISC_STEPS.get()).setWeight(50)) + //ultrarare loot + .add(LootItem.lootTableItem(Items.EMERALD).apply(SetItemCountFunction.setCount(UniformGenerator.between(4, 9))).setWeight(25)) + .add(LootItem.lootTableItem(Items.DIAMOND).apply(SetItemCountFunction.setCount(UniformGenerator.between(3, 5))).setWeight(25)) + .add(LootItem.lootTableItem(TFItems.CHARM_OF_KEEPING_2.get()).setWeight(25)) + .add(LootItem.lootTableItem(TFItems.TRANSFORMATION_POWDER.get()).apply(SetItemCountFunction.setCount(UniformGenerator.between(5, 17))).setWeight(25)))); + + register.accept(TFLootTables.HEDGE_MAZE.lootTable, + LootTable.lootTable() + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(4)) + .add(LootTableReference.lootTableReference(TFLootTables.USELESS_LOOT.lootTable).setWeight(25)) + //common loot + .add(LootItem.lootTableItem(Blocks.OAK_PLANKS).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 4))).setWeight(75)) + .add(LootItem.lootTableItem(Blocks.BROWN_MUSHROOM).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 4))).setWeight(75)) + .add(LootItem.lootTableItem(Blocks.RED_MUSHROOM).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 4))).setWeight(75)) + .add(LootItem.lootTableItem(Items.WHEAT).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 4))).setWeight(75)) + .add(LootItem.lootTableItem(Items.STRING).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 4))).setWeight(75)) + .add(LootItem.lootTableItem(Items.STICK).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 6))).setWeight(75))) + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(2)) + //uncommon loot + .add(LootItem.lootTableItem(Items.MELON_SLICE).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 4)))) + .add(LootItem.lootTableItem(Items.MELON_SEEDS).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 4)))) + .add(LootItem.lootTableItem(Items.PUMPKIN_SEEDS).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 4)))) + .add(LootItem.lootTableItem(Items.ARROW).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 12)))) + .add(LootItem.lootTableItem(TFBlocks.FIREFLY.get().asItem()).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 4))))) + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + //rare loot + .add(LootItem.lootTableItem(Items.COBWEB).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 4))).setWeight(75)) + .add(LootItem.lootTableItem(Items.APPLE).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 2))).setWeight(75)) + .add(LootItem.lootTableItem(Items.SHEARS).setWeight(75)) + .add(LootItem.lootTableItem(Items.SADDLE).setWeight(75)) + .add(LootItem.lootTableItem(Items.BOW).setWeight(75)) + //ultrarare loot + .add(LootItem.lootTableItem(Items.GOLDEN_APPLE).setWeight(25)) + .add(LootItem.lootTableItem(Items.MUSHROOM_STEW).setWeight(25)) + .add(LootItem.lootTableItem(Items.DIAMOND).setWeight(25)) + .add(LootItem.lootTableItem(Items.DIAMOND_HOE).setWeight(25)) + .add(LootItem.lootTableItem(TFItems.MUSIC_DISC_MOTION.get()).setWeight(15)))); + + register.accept(TFLootTables.TREE_CACHE.lootTable, + LootTable.lootTable() + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(4)) + .add(LootTableReference.lootTableReference(TFLootTables.USELESS_LOOT.lootTable).setWeight(25)) + //common loot + .add(LootItem.lootTableItem(Items.POISONOUS_POTATO).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 2))).setWeight(75)) + .add(LootItem.lootTableItem(Items.WHEAT).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 6))).setWeight(75)) + .add(LootItem.lootTableItem(Items.POTATO).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 6))).setWeight(75)) + .add(LootItem.lootTableItem(Items.CARROT).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 6))).setWeight(75)) + .add(LootItem.lootTableItem(Items.MELON_SLICE).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 6))).setWeight(75)) + .add(LootItem.lootTableItem(Items.MELON_SEEDS).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 5))).setWeight(75)) + .add(LootItem.lootTableItem(Items.WATER_BUCKET).setWeight(75)) + .add(LootItem.lootTableItem(Items.MILK_BUCKET).setWeight(75))) + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(2)) + //uncommon loot + .add(LootItem.lootTableItem(TFBlocks.TWILIGHT_OAK_SAPLING.get().asItem()).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 4)))) + .add(LootItem.lootTableItem(TFBlocks.CANOPY_SAPLING.get().asItem()).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 4)))) + .add(LootItem.lootTableItem(TFBlocks.MANGROVE_SAPLING.get().asItem()).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 4)))) + .add(LootItem.lootTableItem(TFBlocks.DARKWOOD_SAPLING.get().asItem()).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 4)))) + .add(LootItem.lootTableItem(TFBlocks.FIREFLY.get().asItem()).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 12))))) + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + //rare loot + .add(LootItem.lootTableItem(Items.PUMPKIN_PIE).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 12))).setWeight(75)) + .add(LootItem.lootTableItem(Items.APPLE).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 12))).setWeight(75)) + .add(LootItem.lootTableItem(TFItems.CHARM_OF_KEEPING_1.get()).setWeight(75)) + .add(LootItem.lootTableItem(TFItems.CHARM_OF_LIFE_1.get()).setWeight(75)) + //ultrarare loot + .add(LootItem.lootTableItem(TFBlocks.HOLLOW_OAK_SAPLING.get().asItem()).setWeight(25)) + .add(LootItem.lootTableItem(TFBlocks.TIME_SAPLING.get().asItem()).setWeight(25)) + .add(LootItem.lootTableItem(TFBlocks.TRANSFORMATION_SAPLING.get().asItem()).setWeight(25)) + .add(LootItem.lootTableItem(TFBlocks.MINING_SAPLING.get().asItem()).setWeight(25)) + .add(LootItem.lootTableItem(TFBlocks.SORTING_SAPLING.get().asItem()).setWeight(25)) + .add(LootItem.lootTableItem(TFItems.MUSIC_DISC_SUPERSTITIOUS.get()).setWeight(25)))); + + register.accept(TFLootTables.GRAVEYARD.lootTable, + LootTable.lootTable() + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(4)) + //common loot + .add(LootItem.lootTableItem(Items.PUMPKIN_SEEDS).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 32)))) + .add(LootItem.lootTableItem(Items.PUMPKIN_PIE).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 6)))) + .add(LootItem.lootTableItem(TFItems.TORCHBERRIES.get()).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 16))))) + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(2)) + //uncommon loot + .add(LootItem.lootTableItem(Items.DIAMOND).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 6)))) + .add(LootItem.lootTableItem(TFItems.MOON_DIAL.get()))) + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + //rare loot + .add(LootItem.lootTableItem(TFItems.TRANSFORMATION_POWDER.get()).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 12)))) + .add(LootItem.lootTableItem(TFBlocks.UNCRAFTING_TABLE.get().asItem())) + .add(LootItem.lootTableItem(Items.GOLDEN_APPLE)))); + + register.accept(TFLootTables.SMALL_HOLLOW_HILL.lootTable, + LootTable.lootTable() + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(4)) + .add(LootTableReference.lootTableReference(TFLootTables.USELESS_LOOT.lootTable).setWeight(25)) + //common loot + .add(LootItem.lootTableItem(Items.IRON_INGOT).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 4))).setWeight(75)) + .add(LootItem.lootTableItem(Items.WHEAT).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 4))).setWeight(75)) + .add(LootItem.lootTableItem(Items.STRING).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 4))).setWeight(75)) + .add(LootItem.lootTableItem(Items.BUCKET).setWeight(75))) + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(2)) + //uncommon loot + .add(LootItem.lootTableItem(Items.TORCH).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 12)))) + .add(LootItem.lootTableItem(Items.ARROW).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 12)))) + .add(LootItem.lootTableItem(Items.GUNPOWDER).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 4)))) + .add(LootItem.lootTableItem(Items.BREAD)) + .add(LootItem.lootTableItem(TFItems.ORE_MAGNET.get()))) + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + //rare loot + .add(LootItem.lootTableItem(TFItems.LIVEROOT.get()).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 3))).setWeight(75)) + .add(LootItem.lootTableItem(Items.GOLD_INGOT).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 3))).setWeight(75)) + .add(LootItem.lootTableItem(Items.IRON_PICKAXE).setWeight(75)) + //ultrarare loot + .add(LootItem.lootTableItem(Items.DIAMOND).setWeight(25)) + .add(LootItem.lootTableItem(TFItems.TRANSFORMATION_POWDER.get()).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 12))).setWeight(25)) + .add(LootItem.lootTableItem(TFItems.STEELEAF_INGOT.get()).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 3))).setWeight(25)) + .add(LootItem.lootTableItem(TFItems.MUSIC_DISC_FINDINGS.get()).setWeight(25)))); + + register.accept(TFLootTables.MEDIUM_HOLLOW_HILL.lootTable, + LootTable.lootTable() + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(4)) + .add(LootTableReference.lootTableReference(TFLootTables.USELESS_LOOT.lootTable).setWeight(25)) + //common loot + .add(LootItem.lootTableItem(Items.IRON_INGOT).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 4))).setWeight(75)) + .add(LootItem.lootTableItem(Items.CARROT).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 4))).setWeight(75)) + .add(LootItem.lootTableItem(Items.LADDER).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 6))).setWeight(75)) + .add(LootItem.lootTableItem(Items.BUCKET).setWeight(75))) + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(2)) + //uncommon loot + .add(LootItem.lootTableItem(Items.BAKED_POTATO).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 2)))) + .add(LootItem.lootTableItem(Items.ARROW).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 12)))) + .add(LootItem.lootTableItem(Items.TORCH).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 12)))) + .add(LootItem.lootTableItem(TFItems.ORE_MAGNET.get())) + .add(LootItem.lootTableItem(TFItems.IRONWOOD_INGOT.get()).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 4))))) + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + //rare loot + .add(LootItem.lootTableItem(TFItems.MAGIC_MAP.get()).setWeight(75)) + .add(LootItem.lootTableItem(TFItems.TRANSFORMATION_POWDER.get()).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 12))).setWeight(75)) + .add(LootItem.lootTableItem(TFBlocks.UNCRAFTING_TABLE.get().asItem()).setWeight(75)) + //ultrarare loot + .add(LootItem.lootTableItem(Items.DIAMOND).setWeight(25)) + .add(LootItem.lootTableItem(Items.EMERALD).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 6))).setWeight(25)) + .add(LootItem.lootTableItem(TFItems.PEACOCK_FEATHER_FAN.get()).setWeight(25)) + .add(LootItem.lootTableItem(TFItems.CHARM_OF_LIFE_1.get()).setWeight(25)) + .add(LootItem.lootTableItem(TFItems.MUSIC_DISC_WAYFARER.get()).setWeight(25)))); + + register.accept(TFLootTables.LARGE_HOLLOW_HILL.lootTable, + LootTable.lootTable() + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(4)) + .add(LootTableReference.lootTableReference(TFLootTables.USELESS_LOOT.lootTable).setWeight(25)) + //common loot + .add(LootItem.lootTableItem(Items.GOLD_NUGGET).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 9))).setWeight(75)) + .add(LootItem.lootTableItem(Items.POTATO).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 4))).setWeight(75)) + .add(LootItem.lootTableItem(Items.COD).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 4))).setWeight(75)) + .add(LootItem.lootTableItem(TFItems.TORCHBERRIES.get()).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 5))).setWeight(75))) + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(2)) + //uncommon loot + .add(LootItem.lootTableItem(Items.TORCH).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 12)))) + .add(LootItem.lootTableItem(Items.ARROW).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 12)))) + .add(LootItem.lootTableItem(Items.GUNPOWDER).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 4)))) + .add(LootItem.lootTableItem(TFItems.STEELEAF_INGOT.get()).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 4)))) + .add(LootItem.lootTableItem(Items.PUMPKIN_PIE)) + .add(LootItem.lootTableItem(TFItems.ORE_MAGNET.get()))) + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + //rare loot + .add(LootItem.lootTableItem(TFItems.TRANSFORMATION_POWDER.get()).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 12))).setWeight(75)) + .add(LootItem.lootTableItem(TFItems.IRONWOOD_PICKAXE.get()).apply(new SetEnchantmentsFunction.Builder(false).withEnchantment(Enchantments.BLOCK_EFFICIENCY, ConstantValue.exactly(1)).withEnchantment(Enchantments.BLOCK_FORTUNE, ConstantValue.exactly(1))).setWeight(75)) + .add(LootItem.lootTableItem(TFItems.MAGIC_MAP.get()).setWeight(75)) + //ultrarare loot + .add(LootItem.lootTableItem(Items.DIAMOND).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 2))).setWeight(25)) + .add(LootItem.lootTableItem(TFItems.MOONWORM_QUEEN.get()).setWeight(25)) + .add(LootItem.lootTableItem(TFItems.CHARM_OF_LIFE_1.get()).setWeight(25)) + .add(LootItem.lootTableItem(TFItems.CHARM_OF_KEEPING_1.get()).setWeight(25)) + .add(LootItem.lootTableItem(TFBlocks.IRONWOOD_BLOCK.get().asItem()).setWeight(25)) + .add(LootItem.lootTableItem(TFItems.MUSIC_DISC_MAKER.get()).setWeight(20)))); + + register.accept(TFLootTables.QUEST_GROVE.lootTable, + LootTable.lootTable() + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(4)) + .add(LootItem.lootTableItem(Blocks.WHITE_WOOL)) + .add(LootItem.lootTableItem(Blocks.ORANGE_WOOL)) + .add(LootItem.lootTableItem(Blocks.MAGENTA_WOOL)) + .add(LootItem.lootTableItem(Blocks.LIGHT_BLUE_WOOL)) + .add(LootItem.lootTableItem(Blocks.YELLOW_WOOL)) + .add(LootItem.lootTableItem(Blocks.LIME_WOOL)) + .add(LootItem.lootTableItem(Blocks.PINK_WOOL)) + .add(LootItem.lootTableItem(Blocks.GRAY_WOOL)) + .add(LootItem.lootTableItem(Blocks.LIGHT_GRAY_WOOL)) + .add(LootItem.lootTableItem(Blocks.CYAN_WOOL)) + .add(LootItem.lootTableItem(Blocks.PURPLE_WOOL)) + .add(LootItem.lootTableItem(Blocks.BLUE_WOOL)) + .add(LootItem.lootTableItem(Blocks.BROWN_WOOL)) + .add(LootItem.lootTableItem(Blocks.GREEN_WOOL)) + .add(LootItem.lootTableItem(Blocks.RED_WOOL)) + .add(LootItem.lootTableItem(Blocks.BLACK_WOOL)))); + + register.accept(TFLootTables.TOWER_LIBRARY.lootTable, + LootTable.lootTable() + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(4)) + .add(LootTableReference.lootTableReference(TFLootTables.USELESS_LOOT.lootTable).setWeight(25)) + //common loot + .add(LootItem.lootTableItem(Items.POTION).apply(SetNbtFunction.setTag(Util.make(new CompoundTag(), (nbt) -> nbt.putString("Potion", "minecraft:water")))).setWeight(75)) + .add(LootItem.lootTableItem(Items.GLASS_BOTTLE).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 6))).setWeight(75)) + .add(LootItem.lootTableItem(Items.LADDER).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 6))).setWeight(75)) + .add(LootItem.lootTableItem(Items.PAPER).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 6))).setWeight(75)) + .add(LootItem.lootTableItem(Items.BONE).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 6))).setWeight(75)) + .add(LootItem.lootTableItem(Items.GOLD_NUGGET).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 6))).setWeight(75)) + .add(LootItem.lootTableItem(Items.CLAY_BALL).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 12))).setWeight(75))) + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(2)) + //uncommon loot + .add(LootItem.lootTableItem(Items.IRON_LEGGINGS).apply(EnchantWithLevelsFunction.enchantWithLevels(ConstantValue.exactly(5)))) + .add(LootItem.lootTableItem(Items.FIRE_CHARGE).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 3)))) + .add(LootItem.lootTableItem(Items.BOOK).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 5)))) + .add(LootItem.lootTableItem(Items.MAP)) + .add(LootItem.lootTableItem(Items.POTION).apply(SetNbtFunction.setTag(Util.make(new CompoundTag(), (nbt) -> nbt.putString("Potion", "minecraft:poison"))))) + .add(LootItem.lootTableItem(Items.POTION).apply(SetNbtFunction.setTag(Util.make(new CompoundTag(), (nbt) -> nbt.putString("Potion", "minecraft:awkward"))))) + .add(LootItem.lootTableItem(Items.POTION).apply(SetNbtFunction.setTag(Util.make(new CompoundTag(), (nbt) -> nbt.putString("Potion", "minecraft:weakness")))))) + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + //rare loot + .add(LootItem.lootTableItem(Items.STONE_SWORD).apply(EnchantWithLevelsFunction.enchantWithLevels(ConstantValue.exactly(10))).setWeight(75)) + .add(LootItem.lootTableItem(Items.WOODEN_SWORD).apply(EnchantWithLevelsFunction.enchantWithLevels(ConstantValue.exactly(15))).setWeight(75)) + .add(LootItem.lootTableItem(Items.BOW).apply(EnchantWithLevelsFunction.enchantWithLevels(ConstantValue.exactly(5))).setWeight(75)) + .add(LootItem.lootTableItem(Items.SPLASH_POTION).apply(SetNbtFunction.setTag(Util.make(new CompoundTag(), (nbt) -> nbt.putString("Potion", "minecraft:weakness")))).setWeight(75)) + .add(LootItem.lootTableItem(Items.POTION).apply(SetNbtFunction.setTag(Util.make(new CompoundTag(), (nbt) -> nbt.putString("Potion", "minecraft:strong_regeneration")))).setWeight(75)) + .add(LootItem.lootTableItem(Items.POTION).apply(SetNbtFunction.setTag(Util.make(new CompoundTag(), (nbt) -> nbt.putString("Potion", "minecraft:strong_healing")))).setWeight(75)) + .add(LootItem.lootTableItem(Items.POTION).apply(SetNbtFunction.setTag(Util.make(new CompoundTag(), (nbt) -> nbt.putString("Potion", "minecraft:strong_swiftness")))).setWeight(75)) + //ultrarare loot + .add(LootItem.lootTableItem(Items.GOLDEN_PICKAXE).apply(EnchantWithLevelsFunction.enchantWithLevels(ConstantValue.exactly(10))).setWeight(25)) + .add(LootItem.lootTableItem(Items.IRON_SWORD).apply(EnchantWithLevelsFunction.enchantWithLevels(ConstantValue.exactly(20))).setWeight(25)) + .add(LootItem.lootTableItem(Items.BOW).apply(EnchantWithLevelsFunction.enchantWithLevels(ConstantValue.exactly(30))).setWeight(25)) + .add(LootItem.lootTableItem(Items.BOOKSHELF).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 5))).setWeight(25)) + .add(LootItem.lootTableItem(Items.ENDER_PEARL).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 2))).setWeight(25)) + .add(LootItem.lootTableItem(Items.EXPERIENCE_BOTTLE).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 6))).setWeight(25)))); + + register.accept(TFLootTables.TOWER_ROOM.lootTable, + LootTable.lootTable() + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(4)) + .add(LootTableReference.lootTableReference(TFLootTables.USELESS_LOOT.lootTable).setWeight(25)) + //common loot + .add(LootItem.lootTableItem(Items.POTION).apply(SetNbtFunction.setTag(Util.make(new CompoundTag(), (nbt) -> nbt.putString("Potion", "minecraft:water")))).setWeight(75)) + .add(LootItem.lootTableItem(Items.GLASS_BOTTLE).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 6))).setWeight(75)) + .add(LootItem.lootTableItem(Items.SUGAR).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 5))).setWeight(75)) + .add(LootItem.lootTableItem(Items.SPIDER_EYE).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 3))).setWeight(75)) + .add(LootItem.lootTableItem(Items.GHAST_TEAR).setWeight(75)) + .add(LootItem.lootTableItem(Items.MAGMA_CREAM).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 2))).setWeight(75)) + .add(LootItem.lootTableItem(Items.FERMENTED_SPIDER_EYE).setWeight(75)) + .add(LootItem.lootTableItem(Items.GLISTERING_MELON_SLICE).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 2))).setWeight(75)) + .add(LootItem.lootTableItem(Items.BLAZE_POWDER).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 3))).setWeight(75)) + .add(LootItem.lootTableItem(Items.PAPER).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 6))).setWeight(75))) + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(2)) + //uncommon loot + .add(LootItem.lootTableItem(Items.GOLDEN_SWORD).apply(EnchantWithLevelsFunction.enchantWithLevels(ConstantValue.exactly(10)))) + .add(LootItem.lootTableItem(Items.GOLDEN_SWORD).apply(EnchantWithLevelsFunction.enchantWithLevels(ConstantValue.exactly(7)))) + .add(LootItem.lootTableItem(Items.POTION).apply(SetNbtFunction.setTag(Util.make(new CompoundTag(), (nbt) -> nbt.putString("Potion", "minecraft:swiftness"))))) + .add(LootItem.lootTableItem(Items.POTION).apply(SetNbtFunction.setTag(Util.make(new CompoundTag(), (nbt) -> nbt.putString("Potion", "minecraft:healing"))))) + .add(LootItem.lootTableItem(Items.POTION).apply(SetNbtFunction.setTag(Util.make(new CompoundTag(), (nbt) -> nbt.putString("Potion", "minecraft:fire_resistance"))))) + .add(LootItem.lootTableItem(Items.POTION).apply(SetNbtFunction.setTag(Util.make(new CompoundTag(), (nbt) -> nbt.putString("Potion", "minecraft:harming")))))) + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + //rare loot + .add(LootItem.lootTableItem(Items.GOLDEN_HELMET).apply(EnchantWithLevelsFunction.enchantWithLevels(ConstantValue.exactly(10))).setWeight(75)) + .add(LootItem.lootTableItem(TFItems.TRANSFORMATION_POWDER.get()).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 12))).setWeight(75)) + .add(LootItem.lootTableItem(TFItems.CHARM_OF_KEEPING_1.get()).setWeight(75)) + .add(LootItem.lootTableItem(TFItems.CHARM_OF_LIFE_1.get()).setWeight(75)) + .add(LootItem.lootTableItem(Items.SPLASH_POTION).apply(SetNbtFunction.setTag(Util.make(new CompoundTag(), (nbt) -> nbt.putString("Potion", "minecraft:healing")))).setWeight(75)) + .add(LootItem.lootTableItem(Items.SPLASH_POTION).apply(SetNbtFunction.setTag(Util.make(new CompoundTag(), (nbt) -> nbt.putString("Potion", "minecraft:strong_harming")))).setWeight(75)) + .add(LootItem.lootTableItem(Items.POTION).apply(SetNbtFunction.setTag(Util.make(new CompoundTag(), (nbt) -> nbt.putString("Potion", "minecraft:strong_swiftness")))).setWeight(75)) + .add(LootItem.lootTableItem(Items.POTION).apply(SetNbtFunction.setTag(Util.make(new CompoundTag(), (nbt) -> nbt.putString("Potion", "minecraft:strong_regeneration")))).setWeight(75)) + //ultrarare loot + .add(LootItem.lootTableItem(Items.GOLDEN_AXE).apply(EnchantWithLevelsFunction.enchantWithLevels(ConstantValue.exactly(20))).setWeight(25)) + .add(LootItem.lootTableItem(Items.ENDER_PEARL).setWeight(25)) + .add(LootItem.lootTableItem(Items.DIAMOND).setWeight(25)) + .add(LootItem.lootTableItem(TFItems.MOONWORM_QUEEN.get()).setWeight(25)) + .add(LootItem.lootTableItem(TFItems.PEACOCK_FEATHER_FAN.get()).setWeight(25)) + .add(LootItem.lootTableItem(Items.OBSIDIAN).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 4))).setWeight(25)))); + + //all values in this loot table have been halved so I can fill both chests that appear in the dead ends + register.accept(TFLootTables.LABYRINTH_DEAD_END.lootTable, + LootTable.lootTable() + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(4)) + .add(LootTableReference.lootTableReference(TFLootTables.USELESS_LOOT.lootTable).setWeight(25)) + //common loot + .add(LootItem.lootTableItem(Items.STICK).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 6))).setWeight(75)) + .add(LootItem.lootTableItem(Items.COAL).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 6))).setWeight(75)) + .add(LootItem.lootTableItem(Items.ARROW).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 6))).setWeight(75)) + .add(LootItem.lootTableItem(Items.MUSHROOM_STEW).setWeight(75)) + .add(LootItem.lootTableItem(TFItems.MAZE_WAFER.get()).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 5))).setWeight(75)) + .add(LootItem.lootTableItem(Items.PAPER).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 6))).setWeight(75)) + .add(LootItem.lootTableItem(Items.LEATHER).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 2))).setWeight(75))) + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(2)) + //uncommon loot + .add(LootItem.lootTableItem(Items.MILK_BUCKET)) + .add(LootItem.lootTableItem(Items.PAPER).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 5)))) + .add(LootItem.lootTableItem(Items.IRON_INGOT).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 3)))) + .add(LootItem.lootTableItem(TFItems.IRONWOOD_INGOT.get()).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 4)))) + .add(LootItem.lootTableItem(TFBlocks.FIREFLY.get().asItem()).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 2)))) + .add(LootItem.lootTableItem(TFItems.CHARM_OF_KEEPING_1.get()))) + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + //rare loot + .add(LootItem.lootTableItem(Items.GOLDEN_APPLE)) + .add(LootItem.lootTableItem(TFBlocks.RED_THREAD.get()).apply(SetItemCountFunction.setCount(UniformGenerator.between(5, 18)))) + .add(LootItem.lootTableItem(Items.BLAZE_ROD)) + .add(LootItem.lootTableItem(Items.BOOK).apply(new EnchantRandomlyFunction.Builder().withEnchantment(TFEnchantments.FIRE_REACT.get()))) + .add(LootItem.lootTableItem(TFItems.STEELEAF_INGOT.get()).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 4)))))); + + register.accept(TFLootTables.LABYRINTH_ROOM.lootTable, + LootTable.lootTable() + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(4)) + //common loot + .add(LootItem.lootTableItem(Items.IRON_INGOT).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 4)))) + .add(LootItem.lootTableItem(Items.GUNPOWDER).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 4)))) + .add(LootItem.lootTableItem(TFItems.IRONWOOD_INGOT.get()).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 4)))) + .add(LootItem.lootTableItem(Items.MILK_BUCKET)) + .add(LootItem.lootTableItem(TFItems.MAZE_WAFER.get()).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 12)))) + .add(LootItem.lootTableItem(TFBlocks.FIREFLY.get().asItem()).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 5))))) + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(2)) + //uncommon loot + .add(LootItem.lootTableItem(TFItems.STEELEAF_INGOT.get()).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 6)))) + .add(LootItem.lootTableItem(TFItems.CHARM_OF_KEEPING_1.get())) + .add(LootItem.lootTableItem(TFItems.STEELEAF_HELMET.get())) + .add(LootItem.lootTableItem(TFItems.STEELEAF_CHESTPLATE.get())) + .add(LootItem.lootTableItem(TFItems.STEELEAF_LEGGINGS.get())) + .add(LootItem.lootTableItem(TFItems.STEELEAF_BOOTS.get())) + .add(LootItem.lootTableItem(TFItems.STEELEAF_PICKAXE.get())) + .add(LootItem.lootTableItem(TFItems.IRONWOOD_CHESTPLATE.get())) + .add(LootItem.lootTableItem(TFItems.IRONWOOD_SWORD.get())) + .add(LootItem.lootTableItem(TFBlocks.RED_THREAD.get()).apply(SetItemCountFunction.setCount(UniformGenerator.between(5.0F, 15.0F))))) + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + //rare loot + .add(LootItem.lootTableItem(TFItems.MAZE_MAP_FOCUS.get())) + .add(LootItem.lootTableItem(Items.TNT).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 3)))) + .add(LootItem.lootTableItem(Items.BOOK).apply(new EnchantRandomlyFunction.Builder().withEnchantment(TFEnchantments.FIRE_REACT.get()))) + .add(LootItem.lootTableItem(Items.POTION).apply(SetNbtFunction.setTag(Util.make(new CompoundTag(), (nbt) -> nbt.putString("Potion", "minecraft:strong_healing"))))))); + + register.accept(TFLootTables.LABYRINTH_VAULT.lootTable, + LootTable.lootTable() + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(4)) + //common loot + .add(LootItem.lootTableItem(Items.IRON_INGOT).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 9)))) + .add(LootItem.lootTableItem(Items.EMERALD).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 5)))) + .add(LootItem.lootTableItem(TFItems.IRONWOOD_INGOT.get()).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 9)))) + .add(LootItem.lootTableItem(TFItems.MAZE_WAFER.get()).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 12)))) + .add(LootItem.lootTableItem(Items.POTION).apply(SetNbtFunction.setTag(Util.make(new CompoundTag(), (nbt) -> nbt.putString("Potion", "minecraft:strong_regeneration"))))) + .add(LootItem.lootTableItem(Items.POTION).apply(SetNbtFunction.setTag(Util.make(new CompoundTag(), (nbt) -> nbt.putString("Potion", "minecraft:strong_healing"))))) + .add(LootItem.lootTableItem(Items.POTION).apply(SetNbtFunction.setTag(Util.make(new CompoundTag(), (nbt) -> nbt.putString("Potion", "minecraft:strong_swiftness")))))) + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(2)) + //uncommon loot + .add(LootItem.lootTableItem(Items.BOW).apply(new SetEnchantmentsFunction.Builder(false).withEnchantment(Enchantments.INFINITY_ARROWS, ConstantValue.exactly(1)).withEnchantment(Enchantments.PUNCH_ARROWS, ConstantValue.exactly(2)))) + .add(LootItem.lootTableItem(Items.BOW).apply(new SetEnchantmentsFunction.Builder(false).withEnchantment(Enchantments.POWER_ARROWS, ConstantValue.exactly(3)).withEnchantment(Enchantments.FLAMING_ARROWS, ConstantValue.exactly(1)))) + .add(LootItem.lootTableItem(Items.BOOK).apply(new EnchantRandomlyFunction.Builder().withEnchantment(TFEnchantments.FIRE_REACT.get()))) + .add(LootItem.lootTableItem(TFItems.STEELEAF_INGOT.get()).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 12)))) + .add(LootItem.lootTableItem(TFItems.STEELEAF_SHOVEL.get()).apply(new SetEnchantmentsFunction.Builder(false).withEnchantment(Enchantments.BLOCK_EFFICIENCY, ConstantValue.exactly(4)).withEnchantment(Enchantments.UNBREAKING, ConstantValue.exactly(2)))) + .add(LootItem.lootTableItem(TFItems.STEELEAF_AXE.get()).apply(new SetEnchantmentsFunction.Builder(false).withEnchantment(Enchantments.BLOCK_EFFICIENCY, ConstantValue.exactly(5)))) + .add(LootItem.lootTableItem(TFItems.STEELEAF_CHESTPLATE.get()).apply(new SetEnchantmentsFunction.Builder(false).withEnchantment(Enchantments.ALL_DAMAGE_PROTECTION, ConstantValue.exactly(3)))) + .add(LootItem.lootTableItem(TFItems.STEELEAF_BOOTS.get()).apply(new SetEnchantmentsFunction.Builder(false).withEnchantment(Enchantments.ALL_DAMAGE_PROTECTION, ConstantValue.exactly(2)))) + .add(LootItem.lootTableItem(TFItems.STEELEAF_LEGGINGS.get()).apply(new SetEnchantmentsFunction.Builder(false).withEnchantment(Enchantments.FIRE_PROTECTION, ConstantValue.exactly(4)))) + .add(LootItem.lootTableItem(TFItems.STEELEAF_HELMET.get()).apply(new SetEnchantmentsFunction.Builder(false).withEnchantment(Enchantments.RESPIRATION, ConstantValue.exactly(3))))) + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + //rare loot + .add(LootItem.lootTableItem(Items.EMERALD_BLOCK)) + .add(LootItem.lootTableItem(Items.ENDER_CHEST)) + .add(LootItem.lootTableItem(TFItems.STEELEAF_PICKAXE.get()).apply(new SetEnchantmentsFunction.Builder(false).withEnchantment(Enchantments.BLOCK_EFFICIENCY, ConstantValue.exactly(4)).withEnchantment(Enchantments.SILK_TOUCH, ConstantValue.exactly(1)))) + .add(LootItem.lootTableItem(TFItems.STEELEAF_SWORD.get()).apply(new SetEnchantmentsFunction.Builder(false).withEnchantment(Enchantments.SHARPNESS, ConstantValue.exactly(4)).withEnchantment(Enchantments.KNOCKBACK, ConstantValue.exactly(2)))) + .add(LootItem.lootTableItem(TFItems.STEELEAF_SWORD.get()).apply(new SetEnchantmentsFunction.Builder(false).withEnchantment(Enchantments.BANE_OF_ARTHROPODS, ConstantValue.exactly(5)).withEnchantment(Enchantments.FIRE_ASPECT, ConstantValue.exactly(2)))))); + + //Same as the one above, but with a 100% chance to get a mazebreaker + register.accept(TFLootTables.LABYRINTH_VAULT_JACKPOT.lootTable, + LootTable.lootTable() + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + .add(LootTableReference.lootTableReference(TFLootTables.LABYRINTH_VAULT.lootTable))) + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + //jackpot guaranteed mazebreaker + .add(LootItem.lootTableItem(TFItems.MAZEBREAKER_PICKAXE.get()).apply(new SetEnchantmentsFunction.Builder(false).withEnchantment(Enchantments.BLOCK_EFFICIENCY, ConstantValue.exactly(4)).withEnchantment(Enchantments.UNBREAKING, ConstantValue.exactly(3)).withEnchantment(Enchantments.BLOCK_FORTUNE, ConstantValue.exactly(2)))))); + + register.accept(TFLootTables.STRONGHOLD_CACHE.lootTable, + LootTable.lootTable() + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(4)) + //common loot + .add(LootItem.lootTableItem(Items.STICK).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 12)))) + .add(LootItem.lootTableItem(Items.COAL).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 12)))) + .add(LootItem.lootTableItem(Items.ARROW).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 12)))) + .add(LootItem.lootTableItem(TFItems.MAZE_WAFER.get()).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 9)))) + .add(LootItem.lootTableItem(Items.BLUE_WOOL)) + .add(LootItem.lootTableItem(Items.IRON_INGOT).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 2))))) + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(2)) + //uncommon loot + .add(LootItem.lootTableItem(Items.BUCKET)) + .add(LootItem.lootTableItem(Items.IRON_INGOT).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 6)))) + .add(LootItem.lootTableItem(TFItems.IRONWOOD_INGOT.get()).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 6)))) + .add(LootItem.lootTableItem(TFBlocks.FIREFLY.get().asItem()).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 5)))) + .add(LootItem.lootTableItem(TFItems.CHARM_OF_KEEPING_1.get())) + .add(LootItem.lootTableItem(TFItems.ARMOR_SHARD.get()).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 3))))) + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + //rare loot + .add(LootItem.lootTableItem(TFItems.KNIGHTMETAL_INGOT.get()).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 8))).setWeight(75)) + .add(LootItem.lootTableItem(Items.BOW).apply(EnchantWithLevelsFunction.enchantWithLevels(ConstantValue.exactly(20))).setWeight(75)) + .add(LootItem.lootTableItem(Items.IRON_SWORD).apply(EnchantWithLevelsFunction.enchantWithLevels(ConstantValue.exactly(20))).setWeight(75)) + .add(LootItem.lootTableItem(TFItems.IRONWOOD_SWORD.get()).apply(EnchantWithLevelsFunction.enchantWithLevels(ConstantValue.exactly(15))).setWeight(75)) + .add(LootItem.lootTableItem(TFItems.STEELEAF_SWORD.get()).apply(EnchantWithLevelsFunction.enchantWithLevels(ConstantValue.exactly(10))).setWeight(75)) + //ultrarare loot + .add(LootItem.lootTableItem(Items.ENCHANTED_BOOK).apply(new SetEnchantmentsFunction.Builder(false).withEnchantment(Enchantments.BANE_OF_ARTHROPODS, ConstantValue.exactly(4))).setWeight(25)) + .add(LootItem.lootTableItem(Items.ENCHANTED_BOOK).apply(new SetEnchantmentsFunction.Builder(false).withEnchantment(Enchantments.SHARPNESS, ConstantValue.exactly(4))).setWeight(25)) + .add(LootItem.lootTableItem(Items.ENCHANTED_BOOK).apply(new SetEnchantmentsFunction.Builder(false).withEnchantment(Enchantments.SMITE, ConstantValue.exactly(4))).setWeight(25)) + .add(LootItem.lootTableItem(Items.ENCHANTED_BOOK).apply(new SetEnchantmentsFunction.Builder(false).withEnchantment(Enchantments.UNBREAKING, ConstantValue.exactly(2))).setWeight(25)) + .add(LootItem.lootTableItem(Items.ENCHANTED_BOOK).apply(new SetEnchantmentsFunction.Builder(false).withEnchantment(Enchantments.ALL_DAMAGE_PROTECTION, ConstantValue.exactly(3))).setWeight(25)) + .add(LootItem.lootTableItem(Items.ENCHANTED_BOOK).apply(new SetEnchantmentsFunction.Builder(false).withEnchantment(Enchantments.PROJECTILE_PROTECTION, ConstantValue.exactly(3))).setWeight(25)) + .add(LootItem.lootTableItem(Items.BOOK).apply(new EnchantRandomlyFunction.Builder().withEnchantment(TFEnchantments.DESTRUCTION.get())).setWeight(25)) + .add(LootItem.lootTableItem(Items.ENCHANTED_BOOK).apply(new SetEnchantmentsFunction.Builder(false).withEnchantment(Enchantments.FALL_PROTECTION, ConstantValue.exactly(3))).setWeight(25)))); + + register.accept(TFLootTables.STRONGHOLD_ROOM.lootTable, + LootTable.lootTable() + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(4)) + .add(LootTableReference.lootTableReference(TFLootTables.USELESS_LOOT.lootTable).setWeight(25)) + //common loot + .add(LootItem.lootTableItem(Items.IRON_INGOT).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 4))).setWeight(75)) + .add(LootItem.lootTableItem(Items.GUNPOWDER).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 4))).setWeight(75)) + .add(LootItem.lootTableItem(Items.MILK_BUCKET).setWeight(75)) + .add(LootItem.lootTableItem(TFItems.MAZE_WAFER.get()).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 12))).setWeight(75)) + .add(LootItem.lootTableItem(TFItems.IRONWOOD_INGOT.get()).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 4))).setWeight(75)) + .add(LootItem.lootTableItem(TFBlocks.FIREFLY.get().asItem()).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 5))).setWeight(75))) + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(2)) + //uncommon loot + .add(LootItem.lootTableItem(TFItems.STEELEAF_INGOT.get()).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 6)))) + .add(LootItem.lootTableItem(TFItems.CHARM_OF_LIFE_1.get())) + .add(LootItem.lootTableItem(TFItems.STEELEAF_HELMET.get())) + .add(LootItem.lootTableItem(TFItems.STEELEAF_CHESTPLATE.get())) + .add(LootItem.lootTableItem(TFItems.STEELEAF_LEGGINGS.get())) + .add(LootItem.lootTableItem(TFItems.STEELEAF_BOOTS.get())) + .add(LootItem.lootTableItem(TFItems.STEELEAF_PICKAXE.get())) + .add(LootItem.lootTableItem(TFItems.IRONWOOD_CHESTPLATE.get())) + .add(LootItem.lootTableItem(TFItems.IRONWOOD_SWORD.get()))) + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + //rare loot + .add(LootItem.lootTableItem(TFItems.IRONWOOD_SWORD.get()).apply(EnchantWithLevelsFunction.enchantWithLevels(ConstantValue.exactly(25)))) + .add(LootItem.lootTableItem(TFItems.STEELEAF_SWORD.get()).apply(EnchantWithLevelsFunction.enchantWithLevels(ConstantValue.exactly(20)))) + .add(LootItem.lootTableItem(Items.IRON_SWORD).apply(EnchantWithLevelsFunction.enchantWithLevels(ConstantValue.exactly(30)))) + .add(LootItem.lootTableItem(Items.BOW).apply(EnchantWithLevelsFunction.enchantWithLevels(ConstantValue.exactly(30)))) + .add(LootItem.lootTableItem(Items.DIAMOND_SWORD).apply(EnchantWithLevelsFunction.enchantWithLevels(ConstantValue.exactly(15)))) + .add(LootItem.lootTableItem(Items.BOOK).apply(new EnchantRandomlyFunction.Builder().withEnchantment(TFEnchantments.DESTRUCTION.get()))) + .add(LootItem.lootTableItem(TFItems.MAZE_MAP_FOCUS.get())))); + + register.accept(TFLootTables.STRONGHOLD_BOSS.lootTable, + LootTable.lootTable() + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(4)) + //common loot + .add(LootItem.lootTableItem(TFItems.KNIGHTMETAL_SWORD.get()).apply(EnchantWithLevelsFunction.enchantWithLevels(ConstantValue.exactly(20)))) + .add(LootItem.lootTableItem(TFItems.KNIGHTMETAL_PICKAXE.get()).apply(EnchantWithLevelsFunction.enchantWithLevels(ConstantValue.exactly(20)))) + .add(LootItem.lootTableItem(TFItems.KNIGHTMETAL_AXE.get()).apply(EnchantWithLevelsFunction.enchantWithLevels(ConstantValue.exactly(20))))) + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(2)) + //uncommon loot + .add(LootItem.lootTableItem(TFItems.PHANTOM_HELMET.get()).apply(EnchantWithLevelsFunction.enchantWithLevels(ConstantValue.exactly(20)))) + .add(LootItem.lootTableItem(TFItems.PHANTOM_CHESTPLATE.get()).apply(EnchantWithLevelsFunction.enchantWithLevels(ConstantValue.exactly(20))))) + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + //rare loot + .add(LootItem.lootTableItem(TFItems.PHANTOM_HELMET.get()).apply(EnchantWithLevelsFunction.enchantWithLevels(ConstantValue.exactly(30)))) + .add(LootItem.lootTableItem(TFItems.PHANTOM_CHESTPLATE.get()).apply(EnchantWithLevelsFunction.enchantWithLevels(ConstantValue.exactly(30))))) + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + .add(LootItem.lootTableItem(TFBlocks.KNIGHT_PHANTOM_TROPHY.get().asItem())))); + + register.accept(TFLootTables.DARKTOWER_CACHE.lootTable, + LootTable.lootTable() + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(4)) + .add(LootTableReference.lootTableReference(TFLootTables.USELESS_LOOT.lootTable).setWeight(25)) + //common loot + .add(LootItem.lootTableItem(Items.STICK).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 12))).setWeight(75)) + .add(LootItem.lootTableItem(Items.CHARCOAL).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 12))).setWeight(75)) + .add(LootItem.lootTableItem(Items.ARROW).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 12))).setWeight(75)) + .add(LootItem.lootTableItem(TFItems.EXPERIMENT_115.get()).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 9))).setWeight(75)) + .add(LootItem.lootTableItem(Items.RED_WOOL).setWeight(75)) + .add(LootItem.lootTableItem(Items.REDSTONE).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 6))).setWeight(75))) + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(2)) + //uncommon loot + .add(LootItem.lootTableItem(Items.REDSTONE_LAMP).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 4)))) + .add(LootItem.lootTableItem(Items.IRON_INGOT).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 6)))) + .add(LootItem.lootTableItem(TFItems.IRONWOOD_INGOT.get()).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 8)))) + .add(LootItem.lootTableItem(TFBlocks.FIREFLY.get().asItem()).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 5)))) + .add(LootItem.lootTableItem(TFItems.CHARM_OF_KEEPING_1.get()))) + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + //rare loot + .add(LootItem.lootTableItem(TFItems.STEELEAF_INGOT.get()).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 8)))) + .add(LootItem.lootTableItem(Items.DIAMOND).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 2)))))); + + register.accept(TFLootTables.DARKTOWER_KEY.lootTable, + LootTable.lootTable() + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(4)) + .add(LootTableReference.lootTableReference(TFLootTables.USELESS_LOOT.lootTable).setWeight(25)) + //common loot + .add(LootItem.lootTableItem(Items.IRON_INGOT).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 4))).setWeight(75)) + .add(LootItem.lootTableItem(Items.GUNPOWDER).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 4))).setWeight(75)) + .add(LootItem.lootTableItem(TFItems.IRONWOOD_INGOT.get()).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 4))).setWeight(75)) + .add(LootItem.lootTableItem(TFBlocks.FIREFLY.get().asItem()).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 5))).setWeight(75)) + .add(LootItem.lootTableItem(TFItems.EXPERIMENT_115.get()).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 12))).setWeight(75)) + .add(LootItem.lootTableItem(Items.GLOWSTONE_DUST).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 12))).setWeight(75)) + .add(LootItem.lootTableItem(Items.REDSTONE).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 6))).setWeight(75))) + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(2)) + //uncommon loot + .add(LootItem.lootTableItem(TFItems.STEELEAF_INGOT.get()).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 6)))) + .add(LootItem.lootTableItem(TFItems.CHARM_OF_KEEPING_1.get())) + .add(LootItem.lootTableItem(TFItems.STEELEAF_HELMET.get())) + .add(LootItem.lootTableItem(TFItems.STEELEAF_CHESTPLATE.get())) + .add(LootItem.lootTableItem(TFItems.STEELEAF_LEGGINGS.get())) + .add(LootItem.lootTableItem(TFItems.STEELEAF_BOOTS.get())) + .add(LootItem.lootTableItem(TFItems.STEELEAF_PICKAXE.get())) + .add(LootItem.lootTableItem(TFItems.IRONWOOD_CHESTPLATE.get())) + .add(LootItem.lootTableItem(TFItems.IRONWOOD_SWORD.get()))) + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + //rare loot + .add(LootItem.lootTableItem(TFItems.CHARM_OF_LIFE_1.get())) + .add(LootItem.lootTableItem(Items.ENCHANTED_BOOK).apply(new SetEnchantmentsFunction.Builder(false).withEnchantment(Enchantments.FALL_PROTECTION, ConstantValue.exactly(3)))) + .add(LootItem.lootTableItem(Items.ENCHANTED_BOOK).apply(new SetEnchantmentsFunction.Builder(false).withEnchantment(Enchantments.KNOCKBACK, ConstantValue.exactly(2)))) + .add(LootItem.lootTableItem(Items.ENCHANTED_BOOK).apply(new SetEnchantmentsFunction.Builder(false).withEnchantment(Enchantments.BLOCK_EFFICIENCY, ConstantValue.exactly(3))))) + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + .add(LootItem.lootTableItem(TFItems.TOWER_KEY.get())))); + + // Keeping this here for legacy generated chests + register.accept(TFLootTables.DARKTOWER_BOSS.lootTable, + LootTable.lootTable() + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(4)) + .add(LootItem.lootTableItem(TFItems.CARMINITE.get()).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 3))))) + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(2)) + .add(LootItem.lootTableItem(TFItems.FIERY_TEARS.get()).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 5))))) + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + .add(LootItem.lootTableItem(TFBlocks.UR_GHAST_TROPHY.get().asItem())))); + + register.accept(TFLootTables.AURORA_CACHE.lootTable, + LootTable.lootTable() + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(4)) + .add(LootTableReference.lootTableReference(TFLootTables.USELESS_LOOT.lootTable).setWeight(25)) + //common loot + .add(LootItem.lootTableItem(Items.STICK).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 12))).setWeight(75)) + .add(LootItem.lootTableItem(Items.COAL).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 12))).setWeight(75)) + .add(LootItem.lootTableItem(Items.ARROW).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 12))).setWeight(75)) + .add(LootItem.lootTableItem(Items.ICE).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 4))).setWeight(75)) + .add(LootItem.lootTableItem(Items.PACKED_ICE).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 4))).setWeight(75)) + .add(LootItem.lootTableItem(TFItems.IRONWOOD_INGOT.get()).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 2))).setWeight(75)) + .add(LootItem.lootTableItem(TFItems.MAZE_WAFER.get()).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 9))).setWeight(75))) + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(2)) + //uncommon loot + .add(LootItem.lootTableItem(TFItems.CHARM_OF_KEEPING_1.get())) + .add(LootItem.lootTableItem(TFItems.IRONWOOD_INGOT.get()).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 6)))) + .add(LootItem.lootTableItem(TFBlocks.FIREFLY.get().asItem()).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 5)))) + .add(LootItem.lootTableItem(TFBlocks.AURORA_BLOCK.get().asItem()).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 12)))) + .add(LootItem.lootTableItem(TFItems.ARCTIC_FUR.get()).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 3))))) + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + //rare loot + .add(LootItem.lootTableItem(TFItems.ARCTIC_FUR.get()).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 8))).setWeight(75)) + .add(LootItem.lootTableItem(TFItems.ICE_BOW.get()).setWeight(75)) + .add(LootItem.lootTableItem(TFItems.ENDER_BOW.get()).setWeight(75)) + .add(LootItem.lootTableItem(TFItems.ICE_SWORD.get()).setWeight(75)) + //ultrarare loot + .add(LootItem.lootTableItem(Items.ENCHANTED_BOOK).apply(new SetEnchantmentsFunction.Builder(false).withEnchantment(Enchantments.SHARPNESS, ConstantValue.exactly(4))).setWeight(25)) + .add(LootItem.lootTableItem(Items.ENCHANTED_BOOK).apply(new SetEnchantmentsFunction.Builder(false).withEnchantment(Enchantments.POWER_ARROWS, ConstantValue.exactly(4))).setWeight(25)) + .add(LootItem.lootTableItem(Items.ENCHANTED_BOOK).apply(new SetEnchantmentsFunction.Builder(false).withEnchantment(Enchantments.PUNCH_ARROWS, ConstantValue.exactly(2))).setWeight(25)) + .add(LootItem.lootTableItem(Items.ENCHANTED_BOOK).apply(new SetEnchantmentsFunction.Builder(false).withEnchantment(Enchantments.UNBREAKING, ConstantValue.exactly(2))).setWeight(25)) + .add(LootItem.lootTableItem(Items.BOOK).apply(new EnchantRandomlyFunction.Builder().withEnchantment(TFEnchantments.CHILL_AURA.get())).setWeight(25)) + .add(LootItem.lootTableItem(Items.ENCHANTED_BOOK).apply(new SetEnchantmentsFunction.Builder(false).withEnchantment(Enchantments.INFINITY_ARROWS, ConstantValue.exactly(1))).setWeight(25)))); + + register.accept(TFLootTables.AURORA_ROOM.lootTable, + LootTable.lootTable() + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(4)) + //common loot + .add(LootItem.lootTableItem(TFItems.MAZE_WAFER.get()).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 12)))) + .add(LootItem.lootTableItem(TFItems.ICE_BOMB.get()).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 4)))) + .add(LootItem.lootTableItem(TFBlocks.FIREFLY.get().asItem()).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 5)))) + .add(LootItem.lootTableItem(Items.ICE).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 4)))) + .add(LootItem.lootTableItem(Items.PACKED_ICE).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 4))))) + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(2)) + //uncommon loot + .add(LootItem.lootTableItem(TFItems.ARCTIC_FUR.get()).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 6)))) + .add(LootItem.lootTableItem(TFItems.ARCTIC_HELMET.get())) + .add(LootItem.lootTableItem(TFItems.ARCTIC_CHESTPLATE.get())) + .add(LootItem.lootTableItem(TFItems.ARCTIC_LEGGINGS.get())) + .add(LootItem.lootTableItem(TFItems.ARCTIC_BOOTS.get())) + .add(LootItem.lootTableItem(TFItems.KNIGHTMETAL_CHESTPLATE.get())) + .add(LootItem.lootTableItem(TFItems.KNIGHTMETAL_SWORD.get())) + .add(LootItem.lootTableItem(TFItems.CHARM_OF_LIFE_1.get()))) + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + //rare loot + .add(LootItem.lootTableItem(TFItems.ICE_BOW.get()).apply(EnchantWithLevelsFunction.enchantWithLevels(ConstantValue.exactly(30)))) + .add(LootItem.lootTableItem(TFItems.ENDER_BOW.get()).apply(EnchantWithLevelsFunction.enchantWithLevels(ConstantValue.exactly(5)))) + .add(LootItem.lootTableItem(TFItems.ICE_SWORD.get()).apply(EnchantWithLevelsFunction.enchantWithLevels(ConstantValue.exactly(25)))) + .add(LootItem.lootTableItem(Items.BOOK).apply(new EnchantRandomlyFunction.Builder().withEnchantment(TFEnchantments.CHILL_AURA.get()))) + .add(LootItem.lootTableItem(TFItems.GLASS_SWORD.get()).apply(EnchantWithLevelsFunction.enchantWithLevels(ConstantValue.exactly(20)))))); + + register.accept(TFLootTables.TROLL_GARDEN.lootTable, + LootTable.lootTable() + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(4)) + //common loot + .add(LootItem.lootTableItem(Items.RED_MUSHROOM).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 4)))) + .add(LootItem.lootTableItem(Items.BROWN_MUSHROOM).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 4)))) + .add(LootItem.lootTableItem(Items.WHEAT_SEEDS).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 6)))) + .add(LootItem.lootTableItem(Items.CARROT).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 6)))) + .add(LootItem.lootTableItem(Items.POTATO).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 6)))) + .add(LootItem.lootTableItem(Items.MELON_SEEDS).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 6)))) + .add(LootItem.lootTableItem(Items.BONE_MEAL).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 12))))) + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(2)) + //uncommon loot + .add(LootItem.lootTableItem(TFBlocks.UBEROUS_SOIL.get().asItem()).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 6))))) + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + //rare loot + .add(LootItem.lootTableItem(TFItems.MAGIC_BEANS.get())))); + + register.accept(TFLootTables.TROLL_VAULT.lootTable, + LootTable.lootTable() + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(4)) + //common loot + .add(LootItem.lootTableItem(Items.COAL).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 16)))) + .add(LootItem.lootTableItem(TFItems.TORCHBERRIES.get()).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 16)))) + .add(LootItem.lootTableItem(Items.EMERALD).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 6))))) + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(2)) + //uncommon loot + .add(LootItem.lootTableItem(TFBlocks.TROLLSTEINN.get().asItem()).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 6)))) + .add(LootItem.lootTableItem(Items.OBSIDIAN).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 6)))))); + + register.accept(TFLootTables.TROLL_VAULT_WITH_LAMP.lootTable, + LootTable.lootTable() + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + .add(LootTableReference.lootTableReference(TFLootTables.TROLL_VAULT.lootTable))) + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + .add(LootItem.lootTableItem(TFItems.LAMP_OF_CINDERS.get())))); + } +} diff --git a/src/main/java/twilightforest/data/CraftingGenerator.java b/src/main/java/twilightforest/data/CraftingGenerator.java new file mode 100644 index 0000000000..dbc57dfa69 --- /dev/null +++ b/src/main/java/twilightforest/data/CraftingGenerator.java @@ -0,0 +1,741 @@ +package twilightforest.data; + +import net.minecraft.data.PackOutput; +import net.minecraft.data.recipes.*; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.alchemy.Potions; +import net.minecraft.world.item.crafting.AbstractCookingRecipe; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraft.world.level.block.Blocks; +import net.minecraftforge.common.Tags; +import net.minecraftforge.common.crafting.CompoundIngredient; +import net.minecraftforge.registries.ForgeRegistries; +import twilightforest.TwilightForestMod; +import twilightforest.data.helpers.CraftingDataHelper; +import twilightforest.data.tags.ItemTagGenerator; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFItems; +import twilightforest.init.TFRecipes; + +import java.util.function.Consumer; + +public class CraftingGenerator extends CraftingDataHelper { + public CraftingGenerator(PackOutput output) { + super(output); + } + + @Override + protected void buildRecipes(Consumer consumer) { + StonecuttingGenerator.buildRecipes(consumer); + + // The Recipe Builder currently doesn't support enchantment-resulting recipes, those must be manually created. + blockCompressionRecipes(consumer); + equipmentRecipes(consumer); + emptyMapRecipes(consumer); + woodRecipes(consumer); + fieryConversions(consumer); + + nagastoneRecipes(consumer); + darkTowerRecipes(consumer); + castleRecipes(consumer); + + bannerPattern(consumer, "naga_banner_pattern", TFBlocks.NAGA_TROPHY, TFItems.NAGA_BANNER_PATTERN); + bannerPattern(consumer, "lich_banner_pattern", TFBlocks.LICH_TROPHY, TFItems.LICH_BANNER_PATTERN); + bannerPattern(consumer, "minoshroom_banner_pattern", TFBlocks.MINOSHROOM_TROPHY, TFItems.MINOSHROOM_BANNER_PATTERN); + bannerPattern(consumer, "hydra_banner_pattern", TFBlocks.HYDRA_TROPHY, TFItems.HYDRA_BANNER_PATTERN); + bannerPattern(consumer, "knight_phantom_banner_pattern", TFBlocks.KNIGHT_PHANTOM_TROPHY, TFItems.KNIGHT_PHANTOM_BANNER_PATTERN); + bannerPattern(consumer, "ur_ghast_banner_pattern", TFBlocks.UR_GHAST_TROPHY, TFItems.UR_GHAST_BANNER_PATTERN); + bannerPattern(consumer, "alpha_yeti_banner_pattern", TFBlocks.ALPHA_YETI_TROPHY, TFItems.ALPHA_YETI_BANNER_PATTERN); + bannerPattern(consumer, "snow_queen_banner_pattern", TFBlocks.SNOW_QUEEN_TROPHY, TFItems.SNOW_QUEEN_BANNER_PATTERN); + bannerPattern(consumer, "questing_ram_banner_pattern", TFBlocks.QUEST_RAM_TROPHY, TFItems.QUEST_RAM_BANNER_PATTERN); + + ShapedRecipeBuilder.shaped(RecipeCategory.BUILDING_BLOCKS, Blocks.MOSS_BLOCK) + .pattern("mmm") + .pattern("mtm") + .pattern("mmm") + .define('m', Ingredient.of(TFBlocks.MOSS_PATCH.get())) + .define('t', Ingredient.of(TFItems.TRANSFORMATION_POWDER.get())) + .unlockedBy("has_item", has(TFItems.TRANSFORMATION_POWDER.get())) + .save(consumer, TwilightForestMod.prefix("tf_moss_to_vanilla")); + + ShapelessRecipeBuilder.shapeless(RecipeCategory.DECORATIONS, TFBlocks.MOSS_PATCH.get(), 8) + .requires(Ingredient.of(Items.MOSS_BLOCK)) + .requires(Ingredient.of(TFItems.TRANSFORMATION_POWDER.get())) + .unlockedBy("has_item", has(TFItems.TRANSFORMATION_POWDER.get())) + .save(consumer, TwilightForestMod.prefix("vanilla_to_tf_moss")); + + ShapelessRecipeBuilder.shapeless(RecipeCategory.DECORATIONS, TFBlocks.HUGE_LILY_PAD.get()) + .requires(Ingredient.of(Blocks.LILY_PAD), 4) + .requires(Ingredient.of(TFItems.TRANSFORMATION_POWDER.get())) + .unlockedBy("has_item", has(TFItems.TRANSFORMATION_POWDER.get())) + .save(consumer, TwilightForestMod.prefix("vanilla_to_tf_lilypad")); + + ShapelessRecipeBuilder.shapeless(RecipeCategory.DECORATIONS, Blocks.LILY_PAD, 4) + .requires(Ingredient.of(TFBlocks.HUGE_LILY_PAD.get())) + .requires(Ingredient.of(TFItems.TRANSFORMATION_POWDER.get())) + .unlockedBy("has_item", has(TFItems.TRANSFORMATION_POWDER.get())) + .save(consumer, TwilightForestMod.prefix("tf_to_vanilla_lilypad")); + + slabBlock(consumer, "aurora_slab", TFBlocks.AURORA_SLAB, TFBlocks.AURORA_BLOCK); + ShapedRecipeBuilder.shaped(RecipeCategory.BUILDING_BLOCKS, TFBlocks.AURORA_PILLAR.get(), 2) + .pattern("#") + .pattern("#") + .define('#', Ingredient.of(TFBlocks.AURORA_BLOCK.get())) + .unlockedBy("has_slab", has(TFBlocks.AURORA_SLAB.get())) + .save(consumer); + + ShapedRecipeBuilder.shaped(RecipeCategory.DECORATIONS, TFBlocks.IRON_LADDER.get(), 3) + .pattern("-#-") + .pattern("-#-") + .define('#', Ingredient.of(Blocks.IRON_BARS)) + .define('-', Tags.Items.NUGGETS_IRON) + .unlockedBy("has_iron_bars", has(Blocks.IRON_BARS)) + .save(consumer); + + ShapelessRecipeBuilder.shapeless(RecipeCategory.DECORATIONS, TFBlocks.FIREFLY_JAR.get()) + .requires(Ingredient.of(TFBlocks.FIREFLY.get())) + .requires(Ingredient.of(Items.GLASS_BOTTLE)) + .unlockedBy("has_item", has(TFBlocks.FIREFLY.get())) + .save(consumer); + + ShapelessRecipeBuilder.shapeless(RecipeCategory.DECORATIONS, TFBlocks.FIREFLY_SPAWNER.get()) + .requires(Ingredient.of(TFBlocks.FIREFLY_JAR.get())) + .requires(Ingredient.of(TFBlocks.FIREFLY.get())) + .requires(Ingredient.of(Blocks.POPPY)) + .unlockedBy("has_jar", has(TFBlocks.FIREFLY_JAR.get())) + .save(consumer); + + ShapelessRecipeBuilder.shapeless(RecipeCategory.DECORATIONS, TFBlocks.CICADA_JAR.get()) + .requires(Ingredient.of(TFBlocks.CICADA.get())) + .requires(Ingredient.of(Items.GLASS_BOTTLE)) + .unlockedBy("has_item", has(TFBlocks.CICADA.get())) + .save(consumer); + + ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, Items.MAGENTA_DYE) + .requires(Ingredient.of(TFBlocks.HUGE_WATER_LILY.get())) + .unlockedBy("has_item", has(TFBlocks.HUGE_WATER_LILY.get())) + .save(consumer, TwilightForestMod.prefix("waterlily_to_magenta")); + + ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, Items.RED_DYE) + .requires(Ingredient.of(TFBlocks.THORN_ROSE.get())) + .unlockedBy("has_item", has(TFBlocks.THORN_ROSE.get())) + .save(consumer, TwilightForestMod.prefix("thorn_rose_to_red")); + + ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, Items.STICK) + .requires(Ingredient.of(TFBlocks.ROOT_STRAND.get())) + .unlockedBy("has_item", has(TFBlocks.ROOT_STRAND.get())) + .save(consumer, TwilightForestMod.prefix("root_stick")); + + ShapedRecipeBuilder.shaped(RecipeCategory.DECORATIONS, Blocks.TORCH, 5) + .pattern("∴") + .pattern("|") + .define('∴', Ingredient.of(TFItems.TORCHBERRIES.get())) + .define('|', Tags.Items.RODS_WOODEN) + .unlockedBy("has_item", has(TFItems.TORCHBERRIES.get())) + .save(consumer, TwilightForestMod.prefix("berry_torch")); + + ShapedRecipeBuilder.shaped(RecipeCategory.DECORATIONS, TFBlocks.UNCRAFTING_TABLE.get()) + .pattern("###") + .pattern("#X#") + .pattern("###") + .define('#', Blocks.CRAFTING_TABLE) + .define('X', TFItems.MAZE_MAP_FOCUS.get()) + .unlockedBy("has_uncrafting_table", has(TFBlocks.UNCRAFTING_TABLE.get())) + .save(consumer); + + cookingRecipes(consumer, "smelted", RecipeSerializer.SMELTING_RECIPE, 200); + cookingRecipes(consumer, "smoked", RecipeSerializer.SMOKING_RECIPE, 100); + cookingRecipes(consumer, "campfired", RecipeSerializer.CAMPFIRE_COOKING_RECIPE, 600); + + ingotRecipes(consumer, "smelted", RecipeSerializer.SMELTING_RECIPE, 200); + ingotRecipes(consumer, "blasted", RecipeSerializer.BLASTING_RECIPE, 100); + + crackedWoodRecipes(consumer); + crackedStoneRecipes(consumer); + + ShapedRecipeBuilder.shaped(RecipeCategory.BUILDING_BLOCKS, TFBlocks.EMPTY_CANOPY_BOOKSHELF.get()) + .pattern("---") + .pattern(" ") + .pattern("---") + .define('-', TFBlocks.CANOPY_SLAB.get()) + .unlockedBy("has_item", has(TFBlocks.CANOPY_SLAB.get())) + .save(consumer); + + ShapedRecipeBuilder.shaped(RecipeCategory.BUILDING_BLOCKS, TFBlocks.CANOPY_BOOKSHELF.get()) + .pattern("---") + .pattern("B B") + .pattern("---") + .define('-', TFBlocks.CANOPY_PLANKS.get()) + .define('B', Items.BOOK) + .unlockedBy("has_item", has(TFBlocks.CANOPY_PLANKS.get())) + .save(consumer); + + ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, TFItems.ARMOR_SHARD_CLUSTER.get()) + .requires(Ingredient.of(TFItems.ARMOR_SHARD.get()), 9) + .unlockedBy("has_item", has(TFItems.ARMOR_SHARD.get())) + .save(consumer, TwilightForestMod.prefix("material/" + TFItems.ARMOR_SHARD_CLUSTER.getId().getPath())); + + ShapelessRecipeBuilder.shapeless(RecipeCategory.BUILDING_BLOCKS, TFBlocks.MOSSY_UNDERBRICK.get(), 1) + .requires(Ingredient.of(Blocks.VINE, Blocks.MOSS_BLOCK)) + .requires(Ingredient.of(TFBlocks.UNDERBRICK.get())) + .unlockedBy("has_item", has(TFBlocks.UNDERBRICK.get())) + .save(consumer); + + ShapelessRecipeBuilder.shapeless(RecipeCategory.BUILDING_BLOCKS, TFBlocks.MOSSY_MAZESTONE.get(), 1) + .requires(Ingredient.of(Blocks.VINE, Blocks.MOSS_BLOCK)) + .requires(Ingredient.of(TFBlocks.MAZESTONE_BRICK.get())) + .unlockedBy("has_item", has(TFBlocks.MAZESTONE_BRICK.get())) + .save(consumer, TwilightForestMod.prefix("maze_stone/mossy_mazestone")); + + ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, TFItems.CARMINITE.get()) + .requires(Ingredient.of(TFItems.BORER_ESSENCE.get())) + .requires(Tags.Items.DUSTS_REDSTONE) + .requires(Ingredient.of(TFItems.BORER_ESSENCE.get())) + .requires(Tags.Items.DUSTS_REDSTONE) + .requires(Ingredient.of(Items.GHAST_TEAR)) + .requires(Tags.Items.DUSTS_REDSTONE) + .requires(Ingredient.of(TFItems.BORER_ESSENCE.get())) + .requires(Tags.Items.DUSTS_REDSTONE) + .requires(Ingredient.of(TFItems.BORER_ESSENCE.get())) + .unlockedBy("has_item", has(TFItems.BORER_ESSENCE.get())) + .save(consumer, TwilightForestMod.prefix("material/" + TFItems.CARMINITE.getId().getPath())); + + ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, TFItems.RAW_IRONWOOD.get(), 2) + .requires(Ingredient.of(TFItems.LIVEROOT.get())) + .requires(Ingredient.of(Items.RAW_IRON)) + .requires(Tags.Items.NUGGETS_GOLD) + .unlockedBy("has_item", has(TFItems.LIVEROOT.get())) + .save(consumer, TwilightForestMod.prefix("material/" + TFItems.RAW_IRONWOOD.getId().getPath())); + } + + private void darkTowerRecipes(Consumer consumer) { + ShapedRecipeBuilder.shaped(RecipeCategory.REDSTONE, TFBlocks.ENCASED_FIRE_JET.get()) + .pattern("#∴#") + .pattern("∴^∴") + .pattern("uuu") + .define('∴', Tags.Items.DUSTS_REDSTONE) + .define('#', Ingredient.of(TFBlocks.ENCASED_TOWERWOOD.get())) + .define('^', Ingredient.of(TFBlocks.FIRE_JET.get())) + .define('u', Ingredient.of(Items.LAVA_BUCKET)) + .unlockedBy("has_item", has(TFBlocks.FIRE_JET.get())) + .save(consumer); + + ShapedRecipeBuilder.shaped(RecipeCategory.REDSTONE, TFBlocks.ENCASED_SMOKER.get()) + .pattern("#∴#") + .pattern("∴^∴") + .pattern("#∴#") + .define('∴', Tags.Items.DUSTS_REDSTONE) + .define('#', Ingredient.of(TFBlocks.ENCASED_TOWERWOOD.get())) + .define('^', Ingredient.of(TFBlocks.SMOKER.get())) + .unlockedBy("has_item", has(TFBlocks.SMOKER.get())) + .save(consumer); + + ShapedRecipeBuilder.shaped(RecipeCategory.REDSTONE, TFBlocks.CARMINITE_BUILDER.get()) + .pattern("#6#") + .pattern("6o6") + .pattern("#6#") + .define('6', ItemTagGenerator.CARMINITE_GEMS) + .define('#', Ingredient.of(TFBlocks.ENCASED_TOWERWOOD.get())) + .define('o', Ingredient.of(Blocks.DISPENSER)) + .unlockedBy("has_item", has(ItemTagGenerator.CARMINITE_GEMS)) + .save(consumer); + + ShapedRecipeBuilder.shaped(RecipeCategory.REDSTONE, TFBlocks.CARMINITE_REACTOR.get()) + .pattern("#6#") + .pattern("6%6") + .pattern("#6#") + .define('6', ItemTagGenerator.CARMINITE_GEMS) + .define('#', Ingredient.of(TFBlocks.ENCASED_TOWERWOOD.get())) + .define('%', Tags.Items.ORES_REDSTONE) + .unlockedBy("has_item", has(ItemTagGenerator.CARMINITE_GEMS)) + .save(consumer); + + ShapedRecipeBuilder.shaped(RecipeCategory.REDSTONE, TFBlocks.REAPPEARING_BLOCK.get(), 2) + .pattern("#∴#") + .pattern("∴6∴") + .pattern("#∴#") + .define('∴', Tags.Items.DUSTS_REDSTONE) + .define('#', Ingredient.of(TFBlocks.ENCASED_TOWERWOOD.get())) + .define('6', ItemTagGenerator.CARMINITE_GEMS) + .unlockedBy("has_item", has(TFBlocks.REAPPEARING_BLOCK.get())) + .save(consumer); + + ShapedRecipeBuilder.shaped(RecipeCategory.REDSTONE, TFBlocks.VANISHING_BLOCK.get(), 8) + .pattern("#w#") + .pattern("w6w") + .pattern("#w#") + .define('w', ItemTagGenerator.TOWERWOOD) + .define('#', Ingredient.of(TFBlocks.ENCASED_TOWERWOOD.get())) + .define('6', ItemTagGenerator.CARMINITE_GEMS) + .unlockedBy("has_item", has(TFBlocks.REAPPEARING_BLOCK.get())) + .save(consumer); + + ShapelessRecipeBuilder.shapeless(RecipeCategory.BUILDING_BLOCKS, TFBlocks.MOSSY_TOWERWOOD.get()) + .requires(Ingredient.of(TFBlocks.TOWERWOOD.get())) + .requires(Ingredient.of(Blocks.VINE, Blocks.MOSS_BLOCK)) + .unlockedBy("has_item", has(TFBlocks.TOWERWOOD.get())) + .save(consumer, TwilightForestMod.prefix("wood/" + TFBlocks.MOSSY_TOWERWOOD.getId().getPath())); + + } + + private void equipmentRecipes(Consumer consumer) { + bootsItem(consumer, "arctic_boots", TFItems.ARCTIC_BOOTS, ItemTagGenerator.ARCTIC_FUR); + chestplateItem(consumer, "arctic_chestplate", TFItems.ARCTIC_CHESTPLATE, ItemTagGenerator.ARCTIC_FUR); + helmetItem(consumer, "arctic_helmet", TFItems.ARCTIC_HELMET, ItemTagGenerator.ARCTIC_FUR); + leggingsItem(consumer, "arctic_leggings", TFItems.ARCTIC_LEGGINGS, ItemTagGenerator.ARCTIC_FUR); + + bootsItem(consumer, "fiery_boots", TFItems.FIERY_BOOTS, ItemTagGenerator.FIERY_INGOTS); + chestplateItem(consumer, "fiery_chestplate", TFItems.FIERY_CHESTPLATE, ItemTagGenerator.FIERY_INGOTS); + helmetItem(consumer, "fiery_helmet", TFItems.FIERY_HELMET, ItemTagGenerator.FIERY_INGOTS); + leggingsItem(consumer, "fiery_leggings", TFItems.FIERY_LEGGINGS, ItemTagGenerator.FIERY_INGOTS); + swordItem(consumer, "fiery_sword", TFItems.FIERY_SWORD, ItemTagGenerator.FIERY_INGOTS, Tags.Items.RODS_BLAZE); + pickaxeItem(consumer, "fiery_pickaxe", TFItems.FIERY_PICKAXE, ItemTagGenerator.FIERY_INGOTS, Tags.Items.RODS_BLAZE); + + bootsItem(consumer, "knightmetal_boots", TFItems.KNIGHTMETAL_BOOTS, ItemTagGenerator.KNIGHTMETAL_INGOTS); + chestplateItem(consumer, "knightmetal_chestplate", TFItems.KNIGHTMETAL_CHESTPLATE, ItemTagGenerator.KNIGHTMETAL_INGOTS); + helmetItem(consumer, "knightmetal_helmet", TFItems.KNIGHTMETAL_HELMET, ItemTagGenerator.KNIGHTMETAL_INGOTS); + leggingsItem(consumer, "knightmetal_leggings", TFItems.KNIGHTMETAL_LEGGINGS, ItemTagGenerator.KNIGHTMETAL_INGOTS); + pickaxeItem(consumer, "knightmetal_pickaxe", TFItems.KNIGHTMETAL_PICKAXE, ItemTagGenerator.KNIGHTMETAL_INGOTS, Tags.Items.RODS_WOODEN); + swordItem(consumer, "knightmetal_sword", TFItems.KNIGHTMETAL_SWORD, ItemTagGenerator.KNIGHTMETAL_INGOTS, Tags.Items.RODS_WOODEN); + axeItem(consumer, "knightmetal_axe", TFItems.KNIGHTMETAL_AXE, ItemTagGenerator.KNIGHTMETAL_INGOTS, Tags.Items.RODS_WOODEN); + + ShapedRecipeBuilder.shaped(RecipeCategory.TOOLS, TFItems.GIANT_PICKAXE.get()) + .pattern("###") + .pattern(" X ") + .pattern(" X ") + .define('#', TFBlocks.GIANT_COBBLESTONE.get()) + .define('X', TFBlocks.GIANT_LOG.get()) + .unlockedBy("has_item", has(TFBlocks.GIANT_COBBLESTONE.get())) + .save(consumer, locEquip(TFItems.GIANT_PICKAXE.getId().getPath())); + + ShapedRecipeBuilder.shaped(RecipeCategory.TOOLS, TFItems.GIANT_SWORD.get()) + .pattern("#") + .pattern("#") + .pattern("X") + .define('#', TFBlocks.GIANT_COBBLESTONE.get()) + .define('X', TFBlocks.GIANT_LOG.get()) + .unlockedBy("has_item", has(TFBlocks.GIANT_COBBLESTONE.get())) + .save(consumer, locEquip(TFItems.GIANT_SWORD.getId().getPath())); + + charmRecipe(consumer, "charm_of_keeping_2", TFItems.CHARM_OF_KEEPING_2, TFItems.CHARM_OF_KEEPING_1); + charmRecipe(consumer, "charm_of_keeping_3", TFItems.CHARM_OF_KEEPING_3, TFItems.CHARM_OF_KEEPING_2); + charmRecipe(consumer, "charm_of_life_2", TFItems.CHARM_OF_LIFE_2, TFItems.CHARM_OF_LIFE_1); + + SpecialRecipeBuilder.special(TFRecipes.MOONWORM_QUEEN_REPAIR_RECIPE.get()).save(consumer, TwilightForestMod.prefix("moonworm_queen_repair_recipe").toString()); + SpecialRecipeBuilder.special(TFRecipes.MAGIC_MAP_CLONING_RECIPE.get()).save(consumer, TwilightForestMod.prefix("magic_map_cloning_recipe").toString()); + SpecialRecipeBuilder.special(TFRecipes.MAZE_MAP_CLONING_RECIPE.get()).save(consumer, TwilightForestMod.prefix("maze_map_cloning_recipe").toString()); + + ShapelessRecipeBuilder.shapeless(RecipeCategory.BUILDING_BLOCKS, Blocks.COBBLESTONE, 64) + .requires(TFBlocks.GIANT_COBBLESTONE.get()) + .unlockedBy("has_item", has(TFBlocks.GIANT_COBBLESTONE.get())) + .save(consumer, TwilightForestMod.prefix(TFBlocks.GIANT_COBBLESTONE.getId().getPath() + "_to_" + ForgeRegistries.ITEMS.getKey(Items.COBBLESTONE).getPath())); + + ShapelessRecipeBuilder.shapeless(RecipeCategory.BUILDING_BLOCKS, Blocks.OAK_PLANKS, 64) + .requires(TFBlocks.GIANT_LOG.get()) + .unlockedBy("has_item", has(TFBlocks.GIANT_LOG.get())) + .save(consumer, TwilightForestMod.prefix(TFBlocks.GIANT_LOG.getId().getPath() + "_to_" + ForgeRegistries.ITEMS.getKey(Items.OAK_PLANKS).getPath())); + + ShapelessRecipeBuilder.shapeless(RecipeCategory.BUILDING_BLOCKS, Blocks.OAK_LEAVES, 64) + .requires(TFBlocks.GIANT_LEAVES.get()) + .unlockedBy("has_item", has(TFBlocks.GIANT_LEAVES.get())) + .save(consumer, TwilightForestMod.prefix(TFBlocks.GIANT_LEAVES.getId().getPath() + "_to_" + ForgeRegistries.ITEMS.getKey(Items.OAK_LEAVES).getPath())); + + ShapelessRecipeBuilder.shapeless(RecipeCategory.COMBAT, TFItems.BLOCK_AND_CHAIN.get()) + .requires(Ingredient.of(ItemTagGenerator.STORAGE_BLOCKS_KNIGHTMETAL)) + .requires(Ingredient.of(ItemTagGenerator.KNIGHTMETAL_INGOTS), 3) + .requires(Ingredient.of(TFItems.KNIGHTMETAL_RING.get())) + .unlockedBy("has_block", has(ItemTagGenerator.STORAGE_BLOCKS_KNIGHTMETAL)) + .unlockedBy("has_ingot", has(ItemTagGenerator.KNIGHTMETAL_INGOTS)) + .unlockedBy("has_ring", has(TFItems.KNIGHTMETAL_RING.get())) + .save(consumer, locEquip(TFItems.BLOCK_AND_CHAIN.getId().getPath())); + + ShapedRecipeBuilder.shaped(RecipeCategory.MISC, TFItems.KNIGHTMETAL_RING.get()) + .pattern(" - ") + .pattern("- -") + .pattern(" - ") + .define('-', ItemTagGenerator.KNIGHTMETAL_INGOTS) + .unlockedBy("has_item", has(ItemTagGenerator.KNIGHTMETAL_INGOTS)) + .save(consumer, locEquip(TFItems.KNIGHTMETAL_RING.getId().getPath())); + + ShapedRecipeBuilder.shaped(RecipeCategory.COMBAT, TFItems.KNIGHTMETAL_SHIELD.get()) + .pattern("-#") + .pattern("-o") + .pattern("-#") + .define('-', ItemTagGenerator.KNIGHTMETAL_INGOTS) + .define('#', ItemTagGenerator.TOWERWOOD) + .define('o', Ingredient.of(TFItems.KNIGHTMETAL_RING.get())) + .unlockedBy("has_ingot", has(ItemTagGenerator.KNIGHTMETAL_INGOTS)) + .unlockedBy("has_ring", has(TFItems.KNIGHTMETAL_RING.get())) + .save(consumer, locEquip(TFItems.KNIGHTMETAL_SHIELD.getId().getPath())); + + ShapelessRecipeBuilder.shapeless(RecipeCategory.COMBAT, TFItems.LIFEDRAIN_SCEPTER.get()) + .requires(scepter(TFItems.LIFEDRAIN_SCEPTER.get())) + .requires(Ingredient.of(Items.FERMENTED_SPIDER_EYE)) + .unlockedBy("has_item", has(TFItems.LIFEDRAIN_SCEPTER.get())) + .save(consumer, locEquip(TFItems.LIFEDRAIN_SCEPTER.getId().getPath())); + + ShapelessRecipeBuilder.shapeless(RecipeCategory.COMBAT, TFItems.FORTIFICATION_SCEPTER.get()) + .requires(scepter(TFItems.FORTIFICATION_SCEPTER.get())) + .requires(Ingredient.of(Items.GOLDEN_APPLE)) + .unlockedBy("has_item", has(TFItems.FORTIFICATION_SCEPTER.get())) + .save(consumer, locEquip(TFItems.FORTIFICATION_SCEPTER.getId().getPath())); + + ShapelessRecipeBuilder.shapeless(RecipeCategory.COMBAT, TFItems.TWILIGHT_SCEPTER.get()) + .requires(scepter(TFItems.TWILIGHT_SCEPTER.get())) + .requires(Tags.Items.ENDER_PEARLS) + .unlockedBy("has_item", has(TFItems.TWILIGHT_SCEPTER.get())) + .save(consumer, locEquip(TFItems.TWILIGHT_SCEPTER.getId().getPath())); + + ShapelessRecipeBuilder.shapeless(RecipeCategory.COMBAT, TFItems.ZOMBIE_SCEPTER.get()) + .requires(CompoundIngredient.of(potion(Potions.STRENGTH), potion(Potions.STRONG_STRENGTH), potion(Potions.LONG_STRENGTH))) + .requires(scepter(TFItems.ZOMBIE_SCEPTER.get())) + .requires(Ingredient.of(Items.ROTTEN_FLESH)) + .unlockedBy("has_item", has(TFItems.ZOMBIE_SCEPTER.get())) + .save(consumer, locEquip(TFItems.ZOMBIE_SCEPTER.getId().getPath())); + } + + private void blockCompressionRecipes(Consumer consumer) { + reverseCompressBlock(consumer, "arctic_block_to_item", TFItems.ARCTIC_FUR, ItemTagGenerator.STORAGE_BLOCKS_ARCTIC_FUR); + reverseCompressBlock(consumer, "carminite_block_to_item", TFItems.CARMINITE, ItemTagGenerator.STORAGE_BLOCKS_CARMINITE); + reverseCompressBlock(consumer, "fiery_block_to_ingot", TFItems.FIERY_INGOT, ItemTagGenerator.STORAGE_BLOCKS_FIERY); + reverseCompressBlock(consumer, "ironwood_block_ingot", TFItems.IRONWOOD_INGOT, ItemTagGenerator.STORAGE_BLOCKS_IRONWOOD); + reverseCompressBlock(consumer, "knightmetal_block_ingot", TFItems.KNIGHTMETAL_INGOT, ItemTagGenerator.STORAGE_BLOCKS_KNIGHTMETAL); + reverseCompressBlock(consumer, "steeleaf_block_ingot", TFItems.STEELEAF_INGOT, ItemTagGenerator.STORAGE_BLOCKS_STEELEAF); + + compressedBlock(consumer, "arctic_block", TFBlocks.ARCTIC_FUR_BLOCK, ItemTagGenerator.ARCTIC_FUR); + compressedBlock(consumer, "carminite_block", TFBlocks.CARMINITE_BLOCK, ItemTagGenerator.CARMINITE_GEMS); + compressedBlock(consumer, "fiery_block", TFBlocks.FIERY_BLOCK, ItemTagGenerator.FIERY_INGOTS); + compressedBlock(consumer, "ironwood_block", TFBlocks.IRONWOOD_BLOCK, ItemTagGenerator.IRONWOOD_INGOTS); + compressedBlock(consumer, "knightmetal_block", TFBlocks.KNIGHTMETAL_BLOCK, ItemTagGenerator.KNIGHTMETAL_INGOTS); + compressedBlock(consumer, "steeleaf_block", TFBlocks.STEELEAF_BLOCK, ItemTagGenerator.STEELEAF_INGOTS); + } + + private void emptyMapRecipes(Consumer consumer) { + ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, TFItems.MAGIC_MAP_FOCUS.get()) + .requires(TFItems.RAVEN_FEATHER.get()) + .requires(TFItems.TORCHBERRIES.get()) + .requires(Tags.Items.DUSTS_GLOWSTONE) + .unlockedBy("has_berries", has(TFItems.TORCHBERRIES.get())) + .unlockedBy("has_feather", has(TFItems.RAVEN_FEATHER.get())) + .save(consumer); + + ShapedRecipeBuilder.shaped(RecipeCategory.MISC, TFItems.MAGIC_MAP.get()) + .pattern("###") + .pattern("#•#") + .pattern("###") + .define('#', ItemTagGenerator.PAPER) + .define('•', Ingredient.of(TFItems.MAGIC_MAP_FOCUS.get())) + .unlockedBy("has_item", has(TFItems.MAGIC_MAP_FOCUS.get())) + .save(consumer); + + ShapedRecipeBuilder.shaped(RecipeCategory.MISC, TFItems.MAZE_MAP.get()) + .pattern("###") + .pattern("#•#") + .pattern("###") + .define('#', ItemTagGenerator.PAPER) + .define('•', Ingredient.of(TFItems.MAZE_MAP_FOCUS.get())) + .unlockedBy("has_item", has(TFItems.MAZE_MAP_FOCUS.get())) + .save(consumer); + + ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, TFItems.ORE_MAP.get()) + .requires(TFItems.MAZE_MAP.get()) + .requires(Tags.Items.STORAGE_BLOCKS_DIAMOND) + .requires(Tags.Items.STORAGE_BLOCKS_GOLD) + .requires(Tags.Items.STORAGE_BLOCKS_IRON) + .unlockedBy("has_item", has(TFItems.MAZE_MAP.get())) + .save(consumer); + } + + private void woodRecipes(Consumer consumer) { + buttonBlock(consumer, "canopy", TFBlocks.CANOPY_BUTTON, TFBlocks.CANOPY_PLANKS); + buttonBlock(consumer, "darkwood", TFBlocks.DARK_BUTTON, TFBlocks.DARK_PLANKS); + buttonBlock(consumer, "mangrove", TFBlocks.MANGROVE_BUTTON, TFBlocks.MANGROVE_PLANKS); + buttonBlock(consumer, "mining", TFBlocks.MINING_BUTTON, TFBlocks.MINING_PLANKS); + buttonBlock(consumer, "sorting", TFBlocks.SORTING_BUTTON, TFBlocks.SORTING_PLANKS); + buttonBlock(consumer, "time", TFBlocks.TIME_BUTTON, TFBlocks.TIME_PLANKS); + buttonBlock(consumer, "transformation", TFBlocks.TRANSFORMATION_BUTTON, TFBlocks.TRANSFORMATION_PLANKS); + buttonBlock(consumer, "twilight_oak", TFBlocks.TWILIGHT_OAK_BUTTON, TFBlocks.TWILIGHT_OAK_PLANKS); + + doorBlock(consumer, "canopy", TFBlocks.CANOPY_DOOR, TFBlocks.CANOPY_PLANKS); + doorBlock(consumer, "darkwood", TFBlocks.DARK_DOOR, TFBlocks.DARK_PLANKS); + doorBlock(consumer, "mangrove", TFBlocks.MANGROVE_DOOR, TFBlocks.MANGROVE_PLANKS); + doorBlock(consumer, "mining", TFBlocks.MINING_DOOR, TFBlocks.MINING_PLANKS); + doorBlock(consumer, "sorting", TFBlocks.SORTING_DOOR, TFBlocks.SORTING_PLANKS); + doorBlock(consumer, "time", TFBlocks.TIME_DOOR, TFBlocks.TIME_PLANKS); + doorBlock(consumer, "transformation", TFBlocks.TRANSFORMATION_DOOR, TFBlocks.TRANSFORMATION_PLANKS); + doorBlock(consumer, "twilight_oak", TFBlocks.TWILIGHT_OAK_DOOR, TFBlocks.TWILIGHT_OAK_PLANKS); + + fenceBlock(consumer, "canopy", TFBlocks.CANOPY_FENCE, TFBlocks.CANOPY_PLANKS); + fenceBlock(consumer, "darkwood", TFBlocks.DARK_FENCE, TFBlocks.DARK_PLANKS); + fenceBlock(consumer, "mangrove", TFBlocks.MANGROVE_FENCE, TFBlocks.MANGROVE_PLANKS); + fenceBlock(consumer, "mining", TFBlocks.MINING_FENCE, TFBlocks.MINING_PLANKS); + fenceBlock(consumer, "sorting", TFBlocks.SORTING_FENCE, TFBlocks.SORTING_PLANKS); + fenceBlock(consumer, "time", TFBlocks.TIME_FENCE, TFBlocks.TIME_PLANKS); + fenceBlock(consumer, "transformation", TFBlocks.TRANSFORMATION_FENCE, TFBlocks.TRANSFORMATION_PLANKS); + fenceBlock(consumer, "twilight_oak", TFBlocks.TWILIGHT_OAK_FENCE, TFBlocks.TWILIGHT_OAK_PLANKS); + + gateBlock(consumer, "canopy", TFBlocks.CANOPY_GATE, TFBlocks.CANOPY_PLANKS); + gateBlock(consumer, "darkwood", TFBlocks.DARK_GATE, TFBlocks.DARK_PLANKS); + gateBlock(consumer, "mangrove", TFBlocks.MANGROVE_GATE, TFBlocks.MANGROVE_PLANKS); + gateBlock(consumer, "mining", TFBlocks.MINING_GATE, TFBlocks.MINING_PLANKS); + gateBlock(consumer, "sorting", TFBlocks.SORTING_GATE, TFBlocks.SORTING_PLANKS); + gateBlock(consumer, "time", TFBlocks.TIME_GATE, TFBlocks.TIME_PLANKS); + gateBlock(consumer, "transformation", TFBlocks.TRANSFORMATION_GATE, TFBlocks.TRANSFORMATION_PLANKS); + gateBlock(consumer, "twilight_oak", TFBlocks.TWILIGHT_OAK_GATE, TFBlocks.TWILIGHT_OAK_PLANKS); + + planksBlock(consumer, "canopy", TFBlocks.CANOPY_PLANKS, TFBlocks.CANOPY_LOG); + planksBlock(consumer, "darkwood", TFBlocks.DARK_PLANKS, TFBlocks.DARK_LOG); + planksBlock(consumer, "mangrove", TFBlocks.MANGROVE_PLANKS, TFBlocks.MANGROVE_LOG); + planksBlock(consumer, "mining", TFBlocks.MINING_PLANKS, TFBlocks.MINING_LOG); + planksBlock(consumer, "sorting", TFBlocks.SORTING_PLANKS, TFBlocks.SORTING_LOG); + planksBlock(consumer, "time", TFBlocks.TIME_PLANKS, TFBlocks.TIME_LOG); + planksBlock(consumer, "transformation", TFBlocks.TRANSFORMATION_PLANKS, TFBlocks.TRANSFORMATION_LOG); + planksBlock(consumer, "twilight_oak", TFBlocks.TWILIGHT_OAK_PLANKS, TFBlocks.TWILIGHT_OAK_LOG); + + planksBlock(consumer, "canopy_from_stripped", TFBlocks.CANOPY_PLANKS, TFBlocks.STRIPPED_CANOPY_LOG); + planksBlock(consumer, "darkwood_from_stripped", TFBlocks.DARK_PLANKS, TFBlocks.STRIPPED_DARK_LOG); + planksBlock(consumer, "mangrove_from_stripped", TFBlocks.MANGROVE_PLANKS, TFBlocks.STRIPPED_MANGROVE_LOG); + planksBlock(consumer, "mining_from_stripped", TFBlocks.MINING_PLANKS, TFBlocks.STRIPPED_MINING_LOG); + planksBlock(consumer, "sorting_from_stripped", TFBlocks.SORTING_PLANKS, TFBlocks.STRIPPED_SORTING_LOG); + planksBlock(consumer, "time_from_stripped", TFBlocks.TIME_PLANKS, TFBlocks.STRIPPED_TIME_LOG); + planksBlock(consumer, "transformation_from_stripped", TFBlocks.TRANSFORMATION_PLANKS, TFBlocks.STRIPPED_TRANSFORMATION_LOG); + planksBlock(consumer, "twilight_oak_from_stripped", TFBlocks.TWILIGHT_OAK_PLANKS, TFBlocks.STRIPPED_TWILIGHT_OAK_LOG); + + planksBlock(consumer, "canopy_from_wood", TFBlocks.CANOPY_PLANKS, TFBlocks.CANOPY_WOOD); + planksBlock(consumer, "darkwood_from_wood", TFBlocks.DARK_PLANKS, TFBlocks.DARK_WOOD); + planksBlock(consumer, "mangrove_from_wood", TFBlocks.MANGROVE_PLANKS, TFBlocks.MANGROVE_WOOD); + planksBlock(consumer, "mining_from_wood", TFBlocks.MINING_PLANKS, TFBlocks.MINING_WOOD); + planksBlock(consumer, "sorting_from_wood", TFBlocks.SORTING_PLANKS, TFBlocks.SORTING_WOOD); + planksBlock(consumer, "time_from_wood", TFBlocks.TIME_PLANKS, TFBlocks.TIME_WOOD); + planksBlock(consumer, "transformation_from_wood", TFBlocks.TRANSFORMATION_PLANKS, TFBlocks.TRANSFORMATION_WOOD); + planksBlock(consumer, "twilight_oak_from_wood", TFBlocks.TWILIGHT_OAK_PLANKS, TFBlocks.TWILIGHT_OAK_WOOD); + + planksBlock(consumer, "canopy_from_stripped_wood", TFBlocks.CANOPY_PLANKS, TFBlocks.STRIPPED_CANOPY_WOOD); + planksBlock(consumer, "darkwood_from_stripped_wood", TFBlocks.DARK_PLANKS, TFBlocks.STRIPPED_DARK_WOOD); + planksBlock(consumer, "mangrove_from_stripped_wood", TFBlocks.MANGROVE_PLANKS, TFBlocks.STRIPPED_MANGROVE_WOOD); + planksBlock(consumer, "mining_from_stripped_wood", TFBlocks.MINING_PLANKS, TFBlocks.STRIPPED_MINING_WOOD); + planksBlock(consumer, "sorting_from_stripped_wood", TFBlocks.SORTING_PLANKS, TFBlocks.STRIPPED_SORTING_WOOD); + planksBlock(consumer, "time_from_stripped_wood", TFBlocks.TIME_PLANKS, TFBlocks.STRIPPED_TIME_WOOD); + planksBlock(consumer, "transformation_from_stripped_wood", TFBlocks.TRANSFORMATION_PLANKS, TFBlocks.STRIPPED_TRANSFORMATION_WOOD); + planksBlock(consumer, "twilight_oak_from_stripped_wood", TFBlocks.TWILIGHT_OAK_PLANKS, TFBlocks.STRIPPED_TWILIGHT_OAK_WOOD); + + woodBlock(consumer, "canopy", TFBlocks.CANOPY_WOOD, TFBlocks.CANOPY_LOG); + woodBlock(consumer, "darkwood", TFBlocks.DARK_WOOD, TFBlocks.DARK_LOG); + woodBlock(consumer, "mangrove", TFBlocks.MANGROVE_WOOD, TFBlocks.MANGROVE_LOG); + woodBlock(consumer, "mining", TFBlocks.MINING_WOOD, TFBlocks.MINING_LOG); + woodBlock(consumer, "sorting", TFBlocks.SORTING_WOOD, TFBlocks.SORTING_LOG); + woodBlock(consumer, "time", TFBlocks.TIME_WOOD, TFBlocks.TIME_LOG); + woodBlock(consumer, "transformation", TFBlocks.TRANSFORMATION_WOOD, TFBlocks.TRANSFORMATION_LOG); + woodBlock(consumer, "twilight_oak", TFBlocks.TWILIGHT_OAK_WOOD, TFBlocks.TWILIGHT_OAK_LOG); + + strippedWoodBlock(consumer, "canopy", TFBlocks.STRIPPED_CANOPY_WOOD, TFBlocks.STRIPPED_CANOPY_LOG); + strippedWoodBlock(consumer, "darkwood", TFBlocks.STRIPPED_DARK_WOOD, TFBlocks.STRIPPED_DARK_LOG); + strippedWoodBlock(consumer, "mangrove", TFBlocks.STRIPPED_MANGROVE_WOOD, TFBlocks.STRIPPED_MANGROVE_LOG); + strippedWoodBlock(consumer, "mining", TFBlocks.STRIPPED_MINING_WOOD, TFBlocks.STRIPPED_MINING_LOG); + strippedWoodBlock(consumer, "sorting", TFBlocks.STRIPPED_SORTING_WOOD, TFBlocks.STRIPPED_SORTING_LOG); + strippedWoodBlock(consumer, "time", TFBlocks.STRIPPED_TIME_WOOD, TFBlocks.STRIPPED_TIME_LOG); + strippedWoodBlock(consumer, "transformation", TFBlocks.STRIPPED_TRANSFORMATION_WOOD, TFBlocks.STRIPPED_TRANSFORMATION_LOG); + strippedWoodBlock(consumer, "twilight_oak", TFBlocks.STRIPPED_TWILIGHT_OAK_WOOD, TFBlocks.STRIPPED_TWILIGHT_OAK_LOG); + + plateBlock(consumer, "canopy", TFBlocks.CANOPY_PLATE, TFBlocks.CANOPY_PLANKS); + plateBlock(consumer, "darkwood", TFBlocks.DARK_PLATE, TFBlocks.DARK_PLANKS); + plateBlock(consumer, "mangrove", TFBlocks.MANGROVE_PLATE, TFBlocks.MANGROVE_PLANKS); + plateBlock(consumer, "mining", TFBlocks.MINING_PLATE, TFBlocks.MINING_PLANKS); + plateBlock(consumer, "sorting", TFBlocks.SORTING_PLATE, TFBlocks.SORTING_PLANKS); + plateBlock(consumer, "time", TFBlocks.TIME_PLATE, TFBlocks.TIME_PLANKS); + plateBlock(consumer, "transformation", TFBlocks.TRANSFORMATION_PLATE, TFBlocks.TRANSFORMATION_PLANKS); + plateBlock(consumer, "twilight_oak", TFBlocks.TWILIGHT_OAK_PLATE, TFBlocks.TWILIGHT_OAK_PLANKS); + + slabBlock(consumer, "canopy", TFBlocks.CANOPY_SLAB, TFBlocks.CANOPY_PLANKS); + slabBlock(consumer, "darkwood", TFBlocks.DARK_SLAB, TFBlocks.DARK_PLANKS); + slabBlock(consumer, "mangrove", TFBlocks.MANGROVE_SLAB, TFBlocks.MANGROVE_PLANKS); + slabBlock(consumer, "mining", TFBlocks.MINING_SLAB, TFBlocks.MINING_PLANKS); + slabBlock(consumer, "sorting", TFBlocks.SORTING_SLAB, TFBlocks.SORTING_PLANKS); + slabBlock(consumer, "time", TFBlocks.TIME_SLAB, TFBlocks.TIME_PLANKS); + slabBlock(consumer, "transformation", TFBlocks.TRANSFORMATION_SLAB, TFBlocks.TRANSFORMATION_PLANKS); + slabBlock(consumer, "twilight_oak", TFBlocks.TWILIGHT_OAK_SLAB, TFBlocks.TWILIGHT_OAK_PLANKS); + + stairsBlock(consumer, locWood("canopy_stairs"), TFBlocks.CANOPY_STAIRS, TFBlocks.CANOPY_PLANKS, TFBlocks.CANOPY_PLANKS.get()); + stairsBlock(consumer, locWood("darkwood_stairs"), TFBlocks.DARK_STAIRS, TFBlocks.DARK_PLANKS, TFBlocks.DARK_PLANKS.get()); + stairsBlock(consumer, locWood("mangrove_stairs"), TFBlocks.MANGROVE_STAIRS, TFBlocks.MANGROVE_PLANKS, TFBlocks.MANGROVE_PLANKS.get()); + stairsBlock(consumer, locWood("mining_stairs"), TFBlocks.MINING_STAIRS, TFBlocks.MINING_PLANKS, TFBlocks.MINING_PLANKS.get()); + stairsBlock(consumer, locWood("sorting_stairs"), TFBlocks.SORTING_STAIRS, TFBlocks.SORTING_PLANKS, TFBlocks.SORTING_PLANKS.get()); + stairsBlock(consumer, locWood("time_stairs"), TFBlocks.TIME_STAIRS, TFBlocks.TIME_PLANKS, TFBlocks.TIME_PLANKS.get()); + stairsBlock(consumer, locWood("transformation_stairs"), TFBlocks.TRANSFORMATION_STAIRS, TFBlocks.TRANSFORMATION_PLANKS, TFBlocks.TRANSFORMATION_PLANKS.get()); + stairsBlock(consumer, locWood("twilight_oak_stairs"), TFBlocks.TWILIGHT_OAK_STAIRS, TFBlocks.TWILIGHT_OAK_PLANKS, TFBlocks.TWILIGHT_OAK_PLANKS.get()); + + trapdoorBlock(consumer, "canopy", TFBlocks.CANOPY_TRAPDOOR, TFBlocks.CANOPY_PLANKS); + trapdoorBlock(consumer, "darkwood", TFBlocks.DARK_TRAPDOOR, TFBlocks.DARK_PLANKS); + trapdoorBlock(consumer, "mangrove", TFBlocks.MANGROVE_TRAPDOOR, TFBlocks.MANGROVE_PLANKS); + trapdoorBlock(consumer, "mining", TFBlocks.MINING_TRAPDOOR, TFBlocks.MINING_PLANKS); + trapdoorBlock(consumer, "sorting", TFBlocks.SORTING_TRAPDOOR, TFBlocks.SORTING_PLANKS); + trapdoorBlock(consumer, "time", TFBlocks.TIME_TRAPDOOR, TFBlocks.TIME_PLANKS); + trapdoorBlock(consumer, "transformation", TFBlocks.TRANSFORMATION_TRAPDOOR, TFBlocks.TRANSFORMATION_PLANKS); + trapdoorBlock(consumer, "twilight_oak", TFBlocks.TWILIGHT_OAK_TRAPDOOR, TFBlocks.TWILIGHT_OAK_PLANKS); + + signBlock(consumer, "canopy_sign", TFBlocks.CANOPY_SIGN, TFBlocks.CANOPY_PLANKS); + signBlock(consumer, "darkwood_sign", TFBlocks.DARK_SIGN, TFBlocks.DARK_PLANKS); + signBlock(consumer, "mangrove_sign", TFBlocks.MANGROVE_SIGN, TFBlocks.MANGROVE_PLANKS); + signBlock(consumer, "mining_sign", TFBlocks.MINING_SIGN, TFBlocks.MINING_PLANKS); + signBlock(consumer, "sorting_sign", TFBlocks.SORTING_SIGN, TFBlocks.SORTING_PLANKS); + signBlock(consumer, "time_sign", TFBlocks.TIME_SIGN, TFBlocks.TIME_PLANKS); + signBlock(consumer, "transformation_sign", TFBlocks.TRANSFORMATION_SIGN, TFBlocks.TRANSFORMATION_PLANKS); + signBlock(consumer, "twilight_oak_sign", TFBlocks.TWILIGHT_OAK_SIGN, TFBlocks.TWILIGHT_OAK_PLANKS); + + banisterBlock(consumer, "canopy", TFBlocks.CANOPY_BANISTER, TFBlocks.CANOPY_SLAB); + banisterBlock(consumer, "darkwood", TFBlocks.DARK_BANISTER, TFBlocks.DARK_SLAB); + banisterBlock(consumer, "mangrove", TFBlocks.MANGROVE_BANISTER, TFBlocks.MANGROVE_SLAB); + banisterBlock(consumer, "mining", TFBlocks.MINING_BANISTER, TFBlocks.MINING_SLAB); + banisterBlock(consumer, "sorting", TFBlocks.SORTING_BANISTER, TFBlocks.SORTING_SLAB); + banisterBlock(consumer, "time", TFBlocks.TIME_BANISTER, TFBlocks.TIME_SLAB); + banisterBlock(consumer, "transformation", TFBlocks.TRANSFORMATION_BANISTER, TFBlocks.TRANSFORMATION_SLAB); + banisterBlock(consumer, "twilight_oak", TFBlocks.TWILIGHT_OAK_BANISTER, TFBlocks.TWILIGHT_OAK_SLAB); + + banisterBlock(consumer, "oak", TFBlocks.OAK_BANISTER, Blocks.OAK_SLAB); + banisterBlock(consumer, "spruce", TFBlocks.SPRUCE_BANISTER, Blocks.SPRUCE_SLAB); + banisterBlock(consumer, "birch", TFBlocks.BIRCH_BANISTER, Blocks.BIRCH_SLAB); + banisterBlock(consumer, "jungle", TFBlocks.JUNGLE_BANISTER, Blocks.JUNGLE_SLAB); + banisterBlock(consumer, "acacia", TFBlocks.ACACIA_BANISTER, Blocks.ACACIA_SLAB); + banisterBlock(consumer, "dark_oak", TFBlocks.DARK_OAK_BANISTER, Blocks.DARK_OAK_SLAB); + banisterBlock(consumer, "crimson", TFBlocks.CRIMSON_BANISTER, Blocks.CRIMSON_SLAB); + banisterBlock(consumer, "warped", TFBlocks.WARPED_BANISTER, Blocks.WARPED_SLAB); + banisterBlock(consumer, "vangrove", TFBlocks.VANGROVE_BANISTER, Blocks.MANGROVE_SLAB); + + chestBlock(consumer, "twilight_oak", TFBlocks.TWILIGHT_OAK_CHEST, TFBlocks.TWILIGHT_OAK_PLANKS); + chestBlock(consumer, "canopy", TFBlocks.CANOPY_CHEST, TFBlocks.CANOPY_PLANKS); + chestBlock(consumer, "mangrove", TFBlocks.MANGROVE_CHEST, TFBlocks.MANGROVE_PLANKS); + chestBlock(consumer, "darkwood", TFBlocks.DARK_CHEST, TFBlocks.DARK_PLANKS); + chestBlock(consumer, "time", TFBlocks.TIME_CHEST, TFBlocks.TIME_PLANKS); + chestBlock(consumer, "transformation", TFBlocks.TRANSFORMATION_CHEST, TFBlocks.TRANSFORMATION_PLANKS); + chestBlock(consumer, "mining", TFBlocks.MINING_CHEST, TFBlocks.MINING_PLANKS); + chestBlock(consumer, "sorting", TFBlocks.SORTING_CHEST, TFBlocks.SORTING_PLANKS); + + buildBoats(consumer, TFItems.TWILIGHT_OAK_BOAT, TFItems.TWILIGHT_OAK_CHEST_BOAT, TFBlocks.TWILIGHT_OAK_PLANKS); + buildBoats(consumer, TFItems.CANOPY_BOAT, TFItems.CANOPY_CHEST_BOAT, TFBlocks.CANOPY_PLANKS); + buildBoats(consumer, TFItems.MANGROVE_BOAT, TFItems.MANGROVE_CHEST_BOAT, TFBlocks.MANGROVE_PLANKS); + buildBoats(consumer, TFItems.DARKWOOD_BOAT, TFItems.DARKWOOD_CHEST_BOAT, TFBlocks.DARK_PLANKS); + buildBoats(consumer, TFItems.TIME_BOAT, TFItems.TIME_CHEST_BOAT, TFBlocks.TIME_PLANKS); + buildBoats(consumer, TFItems.TRANSFORMATION_BOAT, TFItems.TRANSFORMATION_CHEST_BOAT, TFBlocks.TRANSFORMATION_PLANKS); + buildBoats(consumer, TFItems.MINING_BOAT, TFItems.MINING_CHEST_BOAT, TFBlocks.MINING_PLANKS); + buildBoats(consumer, TFItems.SORTING_BOAT, TFItems.SORTING_CHEST_BOAT, TFBlocks.SORTING_PLANKS); + } + + private void nagastoneRecipes(Consumer consumer) { + ShapedRecipeBuilder.shaped(RecipeCategory.BUILDING_BLOCKS, TFBlocks.SPIRAL_BRICKS.get(), 8) + .pattern("BSS") + .pattern("BSS") + .pattern("BBB") + .define('B', Ingredient.of(Blocks.STONE_BRICKS, Blocks.MOSSY_STONE_BRICKS, Blocks.CRACKED_STONE_BRICKS, Blocks.CHISELED_STONE_BRICKS))//Ingredient.merge(ImmutableList.of(Ingredient.fromTag(Tags.Items.STONE), Ingredient.fromItems(Blocks.STONE_BRICKS, Blocks.MOSSY_STONE_BRICKS, Blocks.CRACKED_STONE_BRICKS, Blocks.CHISELED_STONE_BRICKS)))) + .define('S', Ingredient.of(Blocks.STONE_SLAB, Blocks.STONE_BRICK_SLAB)) + .unlockedBy("has_item", has(TFBlocks.SPIRAL_BRICKS.get())) + .save(consumer, locNaga("nagastone_spiral")); + + stairsBlock(consumer, locNaga("nagastone_stairs_left"), TFBlocks.NAGASTONE_STAIRS_LEFT, TFBlocks.ETCHED_NAGASTONE, TFBlocks.ETCHED_NAGASTONE.get()); + stairsRightBlock(consumer, locNaga("nagastone_stairs_right"), TFBlocks.NAGASTONE_STAIRS_RIGHT, TFBlocks.ETCHED_NAGASTONE, TFBlocks.ETCHED_NAGASTONE.get()); + + stairsBlock(consumer, locNaga("mossy_nagastone_stairs_left"), TFBlocks.MOSSY_NAGASTONE_STAIRS_LEFT, TFBlocks.MOSSY_ETCHED_NAGASTONE, TFBlocks.MOSSY_ETCHED_NAGASTONE.get()); + stairsRightBlock(consumer, locNaga("mossy_nagastone_stairs_right"), TFBlocks.MOSSY_NAGASTONE_STAIRS_RIGHT, TFBlocks.MOSSY_ETCHED_NAGASTONE, TFBlocks.MOSSY_ETCHED_NAGASTONE.get()); + + ShapelessRecipeBuilder.shapeless(RecipeCategory.BUILDING_BLOCKS, TFBlocks.MOSSY_ETCHED_NAGASTONE.get(), 1) + .requires(Ingredient.of(Blocks.VINE, Blocks.MOSS_BLOCK)) + .requires(Ingredient.of(TFBlocks.ETCHED_NAGASTONE.get())) + .unlockedBy("has_item", has(TFBlocks.ETCHED_NAGASTONE.get())) + .save(consumer, locNaga("mossy_etched_nagastone")); + + ShapelessRecipeBuilder.shapeless(RecipeCategory.BUILDING_BLOCKS, TFBlocks.MOSSY_NAGASTONE_PILLAR.get(), 1) + .requires(Ingredient.of(Blocks.VINE, Blocks.MOSS_BLOCK)) + .requires(Ingredient.of(TFBlocks.NAGASTONE_PILLAR.get())) + .unlockedBy("has_item", has(TFBlocks.NAGASTONE_PILLAR.get())) + .save(consumer, locNaga("mossy_nagastone_pillar")); + + stairsBlock(consumer, locNaga("cracked_nagastone_stairs_left"), TFBlocks.CRACKED_NAGASTONE_STAIRS_LEFT, TFBlocks.CRACKED_ETCHED_NAGASTONE, TFBlocks.CRACKED_ETCHED_NAGASTONE.get()); + stairsRightBlock(consumer, locNaga("cracked_nagastone_stairs_right"), TFBlocks.CRACKED_NAGASTONE_STAIRS_RIGHT, TFBlocks.CRACKED_ETCHED_NAGASTONE, TFBlocks.CRACKED_ETCHED_NAGASTONE.get()); + } + + private void castleRecipes(Consumer consumer) { + ShapelessRecipeBuilder.shapeless(RecipeCategory.BUILDING_BLOCKS, TFBlocks.MOSSY_CASTLE_BRICK.get(), 1) + .requires(Ingredient.of(Blocks.VINE, Blocks.MOSS_BLOCK)) + .requires(Ingredient.of(TFBlocks.CASTLE_BRICK.get())) + .unlockedBy("has_item", has(TFBlocks.CASTLE_BRICK.get())) + .save(consumer, locCastle("mossy_castle_brick")); + + castleBlock(consumer, TFBlocks.THICK_CASTLE_BRICK, TFBlocks.CASTLE_BRICK.get(), TFBlocks.WORN_CASTLE_BRICK.get(), TFBlocks.CRACKED_CASTLE_BRICK.get(), TFBlocks.MOSSY_CASTLE_BRICK.get()); + castleBlock(consumer, TFBlocks.BOLD_CASTLE_BRICK_PILLAR, TFBlocks.THICK_CASTLE_BRICK.get()); + castleBlock(consumer, TFBlocks.BOLD_CASTLE_BRICK_TILE, TFBlocks.BOLD_CASTLE_BRICK_PILLAR.get()); + + ShapedRecipeBuilder.shaped(RecipeCategory.BUILDING_BLOCKS, TFBlocks.BOLD_CASTLE_BRICK_PILLAR.get(), 4) + .pattern("##") + .pattern("##") + .define('#', Ingredient.of(TFBlocks.BOLD_CASTLE_BRICK_TILE.get())) + .unlockedBy("has_castle_brick", has(TFBlocks.CASTLE_BRICK.get())) + .save(consumer, locCastle("bold_castle_pillar_from_tile")); + + ShapedRecipeBuilder.shaped(RecipeCategory.BUILDING_BLOCKS, TFBlocks.ENCASED_CASTLE_BRICK_PILLAR.get(), 6) + .pattern("#H#") + .pattern("#H#") + .define('#', Ingredient.of(TFBlocks.CASTLE_BRICK.get(), TFBlocks.WORN_CASTLE_BRICK.get(), TFBlocks.CRACKED_CASTLE_BRICK.get(), TFBlocks.MOSSY_CASTLE_BRICK.get(), TFBlocks.THICK_CASTLE_BRICK.get())) + .define('H', Ingredient.of(TFBlocks.ENCASED_CASTLE_BRICK_PILLAR.get(), TFBlocks.ENCASED_CASTLE_BRICK_TILE.get(), TFBlocks.BOLD_CASTLE_BRICK_PILLAR.get(), TFBlocks.BOLD_CASTLE_BRICK_TILE.get())) + .unlockedBy("has_castle_brick", has(TFBlocks.CASTLE_BRICK.get())) + .save(consumer, locCastle("encased_castle_pillar")); + + stairsBlock(consumer, locCastle("bold_castle_brick_stairs"), TFBlocks.BOLD_CASTLE_BRICK_STAIRS, TFBlocks.BOLD_CASTLE_BRICK_PILLAR, TFBlocks.BOLD_CASTLE_BRICK_PILLAR.get(), TFBlocks.BOLD_CASTLE_BRICK_TILE.get()); + stairsBlock(consumer, locCastle("castle_brick_stairs"), TFBlocks.CASTLE_BRICK_STAIRS, TFBlocks.CASTLE_BRICK, TFBlocks.CASTLE_BRICK.get()); + stairsBlock(consumer, locCastle("cracked_castle_brick_stairs"), TFBlocks.CRACKED_CASTLE_BRICK_STAIRS, TFBlocks.CRACKED_CASTLE_BRICK, TFBlocks.CRACKED_CASTLE_BRICK.get()); + stairsBlock(consumer, locCastle("encased_castle_brick_stairs"), TFBlocks.ENCASED_CASTLE_BRICK_STAIRS, TFBlocks.ENCASED_CASTLE_BRICK_PILLAR, TFBlocks.ENCASED_CASTLE_BRICK_PILLAR.get(), TFBlocks.ENCASED_CASTLE_BRICK_TILE.get()); + stairsBlock(consumer, locCastle("mossy_castle_brick_stairs"), TFBlocks.MOSSY_CASTLE_BRICK_STAIRS, TFBlocks.MOSSY_CASTLE_BRICK, TFBlocks.MOSSY_CASTLE_BRICK.get()); + stairsBlock(consumer, locCastle("worn_castle_brick_stairs"), TFBlocks.WORN_CASTLE_BRICK_STAIRS, TFBlocks.WORN_CASTLE_BRICK, TFBlocks.WORN_CASTLE_BRICK.get()); + } + + private void fieryConversions(Consumer consumer) { + //FIXME smithing recipes changed. Figure out if we want to keep these or not +// UpgradeRecipeBuilder.smithing(Ingredient.of(Items.IRON_INGOT), Ingredient.of(ItemTagGenerator.FIERY_VIAL), RecipeCategory.MISC, TFItems.FIERY_INGOT.get()).unlocks("has_item", has(TFItems.FIERY_INGOT.get())).save(consumer, TwilightForestMod.prefix("material/fiery_iron_ingot")); +// UpgradeRecipeBuilder.smithing(Ingredient.of(ItemTagGenerator.FIERY_VIAL), Ingredient.of(Items.IRON_INGOT), RecipeCategory.MISC, TFItems.FIERY_INGOT.get()).unlocks("has_item", has(TFItems.FIERY_INGOT.get())).save(consumer, TwilightForestMod.prefix("material/fiery_iron_ingot_reversed")); + + ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, TFItems.FIERY_INGOT.get()) + .requires(Ingredient.of(ItemTagGenerator.FIERY_VIAL)) + .requires(Ingredient.of(Tags.Items.INGOTS_IRON)) + .unlockedBy("has_item", has(ItemTagGenerator.FIERY_VIAL)) + .save(consumer, locEquip("fiery_ingot_crafting")); + + fieryConversion(consumer, TFItems.FIERY_HELMET, Items.IRON_HELMET, 5); + fieryConversion(consumer, TFItems.FIERY_CHESTPLATE, Items.IRON_CHESTPLATE, 8); + fieryConversion(consumer, TFItems.FIERY_LEGGINGS, Items.IRON_LEGGINGS, 7); + fieryConversion(consumer, TFItems.FIERY_BOOTS, Items.IRON_BOOTS, 4); + ShapelessRecipeBuilder.shapeless(RecipeCategory.COMBAT, TFItems.FIERY_SWORD.get()) + .requires(Items.IRON_SWORD) + .requires(Ingredient.of(ItemTagGenerator.FIERY_VIAL), 2) + .requires(Ingredient.of(Tags.Items.RODS_BLAZE)) + .unlockedBy("has_item", has(ItemTagGenerator.FIERY_VIAL)) + .save(consumer, locEquip("fiery_" + ForgeRegistries.ITEMS.getKey(Items.IRON_SWORD).getPath())); + + ShapelessRecipeBuilder.shapeless(RecipeCategory.TOOLS, TFItems.FIERY_PICKAXE.get()) + .requires(Items.IRON_PICKAXE) + .requires(Ingredient.of(ItemTagGenerator.FIERY_VIAL), 3) + .requires(Ingredient.of(Tags.Items.RODS_BLAZE), 2) + .unlockedBy("has_item", has(ItemTagGenerator.FIERY_VIAL)) + .save(consumer, locEquip("fiery_" + ForgeRegistries.ITEMS.getKey(Items.IRON_PICKAXE).getPath())); + } + + private void cookingRecipes(Consumer consumer, String processName, RecipeSerializer process, int smeltingTime) { + SimpleCookingRecipeBuilder.generic(Ingredient.of(TFItems.RAW_MEEF.get()), RecipeCategory.FOOD, TFItems.COOKED_MEEF.get(), 0.3f, smeltingTime, process).unlockedBy("has_food", has(TFItems.RAW_MEEF.get())).save(consumer, TwilightForestMod.prefix("food/" + processName + "_meef").toString()); + SimpleCookingRecipeBuilder.generic(Ingredient.of(TFItems.RAW_VENISON.get()), RecipeCategory.FOOD, TFItems.COOKED_VENISON.get(), 0.3f, smeltingTime, process).unlockedBy("has_food", has(TFItems.RAW_VENISON.get())).save(consumer, TwilightForestMod.prefix("food/" + processName + "_venison").toString()); + } + + private void ingotRecipes(Consumer consumer, String processName, RecipeSerializer process, int smeltingTime) { + SimpleCookingRecipeBuilder.generic(Ingredient.of(TFItems.ARMOR_SHARD_CLUSTER.get()), RecipeCategory.MISC, TFItems.KNIGHTMETAL_INGOT.get(), 1.0f, smeltingTime, process).unlockedBy("has_item", has(TFItems.ARMOR_SHARD_CLUSTER.get())).save(consumer, TwilightForestMod.prefix("material/" + processName + "_knightmetal_ingot").toString()); + SimpleCookingRecipeBuilder.generic(Ingredient.of(TFItems.RAW_IRONWOOD.get()), RecipeCategory.MISC, TFItems.IRONWOOD_INGOT.get(), 1.0f, smeltingTime, process).unlockedBy("has_item", has(TFItems.RAW_IRONWOOD.get())).save(consumer, TwilightForestMod.prefix("material/" + processName + "_ironwood_ingot").toString()); + } + + private void crackedWoodRecipes(Consumer consumer) { + SimpleCookingRecipeBuilder.generic(Ingredient.of(TFBlocks.TOWERWOOD.get()), RecipeCategory.BUILDING_BLOCKS, TFBlocks.CRACKED_TOWERWOOD.get(), 0.3f, 100, RecipeSerializer.SMOKING_RECIPE).unlockedBy("has_item", has(TFBlocks.TOWERWOOD.get())).save(consumer, TwilightForestMod.prefix("wood/" + "smoked" + "_cracked_towerwood").toString()); + } + + private void crackedStoneRecipes(Consumer consumer) { + SimpleCookingRecipeBuilder.generic(Ingredient.of(TFBlocks.NAGASTONE_PILLAR.get()), RecipeCategory.BUILDING_BLOCKS, TFBlocks.CRACKED_NAGASTONE_PILLAR.get(), 0.3f, 200, RecipeSerializer.SMELTING_RECIPE).unlockedBy("has_item", has(TFBlocks.NAGASTONE_PILLAR.get())).save(consumer, TwilightForestMod.prefix("nagastone/" + "smelted" + "_cracked_nagastone_pillar").toString()); + SimpleCookingRecipeBuilder.generic(Ingredient.of(TFBlocks.ETCHED_NAGASTONE.get()), RecipeCategory.BUILDING_BLOCKS, TFBlocks.CRACKED_ETCHED_NAGASTONE.get(), 0.3f, 200, RecipeSerializer.SMELTING_RECIPE).unlockedBy("has_item", has(TFBlocks.ETCHED_NAGASTONE.get())).save(consumer, TwilightForestMod.prefix("nagastone/" + "smelted" + "_cracked_etched_nagastone").toString()); + SimpleCookingRecipeBuilder.generic(Ingredient.of(TFBlocks.MAZESTONE_BRICK.get()), RecipeCategory.BUILDING_BLOCKS, TFBlocks.CRACKED_MAZESTONE.get(), 0.3f, 200, RecipeSerializer.SMELTING_RECIPE).unlockedBy("has_item", has(TFBlocks.MAZESTONE_BRICK.get())).save(consumer, TwilightForestMod.prefix("maze_stone/" + "smelted" + "_maze_stone_cracked").toString()); + SimpleCookingRecipeBuilder.generic(Ingredient.of(TFBlocks.CASTLE_BRICK.get()), RecipeCategory.BUILDING_BLOCKS, TFBlocks.CRACKED_CASTLE_BRICK.get(), 0.3f, 200, RecipeSerializer.SMELTING_RECIPE).unlockedBy("has_item", has(TFBlocks.CASTLE_BRICK.get())).save(consumer, TwilightForestMod.prefix("castleblock/" + "smelted" + "_cracked_castle_brick").toString()); + SimpleCookingRecipeBuilder.generic(Ingredient.of(TFBlocks.UNDERBRICK.get()), RecipeCategory.BUILDING_BLOCKS, TFBlocks.CRACKED_UNDERBRICK.get(), 0.3f, 200, RecipeSerializer.SMELTING_RECIPE).unlockedBy("has_item", has(TFBlocks.UNDERBRICK.get())).save(consumer, TwilightForestMod.prefix("smelted" + "_cracked_underbrick").toString()); + } +} diff --git a/src/main/java/twilightforest/data/DataGenerators.java b/src/main/java/twilightforest/data/DataGenerators.java new file mode 100644 index 0000000000..853e20c8f2 --- /dev/null +++ b/src/main/java/twilightforest/data/DataGenerators.java @@ -0,0 +1,66 @@ +package twilightforest.data; + +import net.minecraft.DetectedVersion; +import net.minecraft.core.HolderLookup; +import net.minecraft.data.DataGenerator; +import net.minecraft.data.PackOutput; +import net.minecraft.data.metadata.PackMetadataGenerator; +import net.minecraft.network.chat.Component; +import net.minecraft.server.packs.PackType; +import net.minecraft.server.packs.metadata.pack.PackMetadataSection; +import net.minecraftforge.common.data.ExistingFileHelper; +import net.minecraftforge.data.event.GatherDataEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; +import twilightforest.TwilightForestMod; +import twilightforest.data.custom.CrumbleHornGenerator; +import twilightforest.data.custom.TransformationPowderGenerator; +import twilightforest.data.custom.UncraftingRecipeGenerator; +import twilightforest.data.custom.stalactites.StalactiteGenerator; +import twilightforest.data.tags.*; + +import java.util.Arrays; +import java.util.concurrent.CompletableFuture; +import java.util.function.Function; +import java.util.stream.Collectors; + +@Mod.EventBusSubscriber(modid = TwilightForestMod.ID, bus = Mod.EventBusSubscriber.Bus.MOD) +public class DataGenerators { + + @SubscribeEvent + public static void gatherData(GatherDataEvent event) { + DataGenerator generator = event.getGenerator(); + PackOutput output = event.getGenerator().getPackOutput(); + CompletableFuture provider = event.getLookupProvider(); + ExistingFileHelper helper = event.getExistingFileHelper(); + + generator.addProvider(event.includeServer(), new TFAdvancementProvider(output, provider, helper)); + generator.addProvider(event.includeClient(), new BlockstateGenerator(output, helper)); + generator.addProvider(event.includeClient(), new ItemModelGenerator(output, helper)); + generator.addProvider(event.includeClient(), new AtlasGenerator(output, helper)); + generator.addProvider(event.includeClient(), new LangGenerator(output)); + generator.addProvider(event.includeClient(), new SoundGenerator(output, helper)); + generator.addProvider(event.includeServer(), new CustomTagGenerator.BannerPatternTagGenerator(output, provider, helper)); + BlockTagGenerator blocktags = new BlockTagGenerator(output, provider, helper); + generator.addProvider(event.includeServer(), blocktags); + generator.addProvider(event.includeServer(), new CustomTagGenerator.BlockEntityTagGenerator(output, provider, helper)); + generator.addProvider(event.includeServer(), new FluidTagGenerator(output, provider, helper)); + generator.addProvider(event.includeServer(), new ItemTagGenerator(output, provider, blocktags.contentsGetter(), helper)); + generator.addProvider(event.includeServer(), new EntityTagGenerator(output, provider, helper)); + generator.addProvider(event.includeServer(), new CustomTagGenerator.EnchantmentTagGenerator(output, provider, helper)); + generator.addProvider(event.includeServer(), new LootGenerator(output)); + generator.addProvider(event.includeServer(), new CraftingGenerator(output)); + generator.addProvider(event.includeServer(), new LootModifierGenerator(output)); + RegistryDataGenerator.addProviders(event.includeServer(), generator, output, provider, helper); + generator.addProvider(event.includeServer(), new StructureTagGenerator(output, provider, helper)); + + generator.addProvider(event.includeServer(), new CrumbleHornGenerator(output, helper)); + generator.addProvider(event.includeServer(), new TransformationPowderGenerator(output, helper)); + generator.addProvider(event.includeServer(), new UncraftingRecipeGenerator(output, helper)); + generator.addProvider(event.includeServer(), new StalactiteGenerator(output)); + generator.addProvider(true, new PackMetadataGenerator(output).add(PackMetadataSection.TYPE, new PackMetadataSection( + Component.literal("Resources for Twilight Forest"), + DetectedVersion.BUILT_IN.getPackVersion(PackType.CLIENT_RESOURCES), + Arrays.stream(PackType.values()).collect(Collectors.toMap(Function.identity(), DetectedVersion.BUILT_IN::getPackVersion))))); + } +} diff --git a/src/main/java/twilightforest/data/EntityLootTables.java b/src/main/java/twilightforest/data/EntityLootTables.java new file mode 100644 index 0000000000..bc0144785a --- /dev/null +++ b/src/main/java/twilightforest/data/EntityLootTables.java @@ -0,0 +1,571 @@ +package twilightforest.data; + +import net.minecraft.Util; +import net.minecraft.data.loot.EntityLootSubProvider; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.flag.FeatureFlags; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.ItemLike; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.storage.loot.BuiltInLootTables; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.LootPool; +import net.minecraft.world.level.storage.loot.LootTable; +import net.minecraft.world.level.storage.loot.entries.LootItem; +import net.minecraft.world.level.storage.loot.entries.LootTableReference; +import net.minecraft.world.level.storage.loot.functions.*; +import net.minecraft.world.level.storage.loot.predicates.LootItemEntityPropertyCondition; +import net.minecraft.world.level.storage.loot.predicates.LootItemKilledByPlayerCondition; +import net.minecraft.world.level.storage.loot.predicates.LootItemRandomChanceWithLootingCondition; +import net.minecraft.world.level.storage.loot.providers.number.ConstantValue; +import net.minecraft.world.level.storage.loot.providers.number.UniformGenerator; +import net.minecraftforge.registries.ForgeRegistries; +import twilightforest.TwilightForestMod; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFEntities; +import twilightforest.init.TFItems; +import twilightforest.loot.TFLootTables; +import twilightforest.loot.conditions.IsMinion; + +import java.util.stream.Stream; + +@SuppressWarnings("deprecation") +public class EntityLootTables extends EntityLootSubProvider { + + protected EntityLootTables() { + super(FeatureFlags.REGISTRY.allFlags()); + } + + @Override + public void generate() { + add(TFEntities.ADHERENT.get(), emptyLootTable()); + add(TFEntities.LICH_MINION.get(), emptyLootTable()); + add(TFEntities.LOYAL_ZOMBIE.get(), emptyLootTable()); + add(TFEntities.KNIGHT_PHANTOM.get(), emptyLootTable()); + //haha no loot for you + add(TFEntities.PLATEAU_BOSS.get(), emptyLootTable()); + add(TFEntities.HARBINGER_CUBE.get(), emptyLootTable()); + add(TFEntities.MOSQUITO_SWARM.get(), emptyLootTable()); + add(TFEntities.PINCH_BEETLE.get(), emptyLootTable()); + add(TFEntities.QUEST_RAM.get(), emptyLootTable()); + add(TFEntities.ROVING_CUBE.get(), emptyLootTable()); + add(TFEntities.SQUIRREL.get(), emptyLootTable()); + add(TFEntities.DWARF_RABBIT.get(), fromEntityLootTable(EntityType.RABBIT)); + add(TFEntities.HEDGE_SPIDER.get(), fromEntityLootTable(EntityType.SPIDER)); + add(TFEntities.FIRE_BEETLE.get(), fromEntityLootTable(EntityType.CREEPER)); + add(TFEntities.HOSTILE_WOLF.get(), fromEntityLootTable(EntityType.WOLF)); + add(TFEntities.KING_SPIDER.get(), fromEntityLootTable(EntityType.SPIDER)); + add(TFEntities.MIST_WOLF.get(), fromEntityLootTable(EntityType.WOLF)); + add(TFEntities.REDCAP_SAPPER.get(), fromEntityLootTable(TFEntities.REDCAP.get())); + add(TFEntities.SWARM_SPIDER.get(), fromEntityLootTable(EntityType.SPIDER)); + add(TFEntities.CARMINITE_BROODLING.get(), fromEntityLootTable(EntityType.SPIDER)); + add(TFEntities.CARMINITE_GHASTGUARD.get(), fromEntityLootTable(EntityType.GHAST)); + add(TFEntities.BIGHORN_SHEEP.get(), fromEntityLootTable(EntityType.SHEEP)); + add(TFEntities.RISING_ZOMBIE.get(), fromEntityLootTable(EntityType.ZOMBIE)); + add(TFEntities.BIGHORN_SHEEP.get(), TFLootTables.BIGHORN_SHEEP_BLACK, sheepLootTableBuilderWithDrop(Blocks.BLACK_WOOL)); + add(TFEntities.BIGHORN_SHEEP.get(), TFLootTables.BIGHORN_SHEEP_BLUE, sheepLootTableBuilderWithDrop(Blocks.BLUE_WOOL)); + add(TFEntities.BIGHORN_SHEEP.get(), TFLootTables.BIGHORN_SHEEP_BROWN, sheepLootTableBuilderWithDrop(Blocks.BROWN_WOOL)); + add(TFEntities.BIGHORN_SHEEP.get(), TFLootTables.BIGHORN_SHEEP_CYAN, sheepLootTableBuilderWithDrop(Blocks.CYAN_WOOL)); + add(TFEntities.BIGHORN_SHEEP.get(), TFLootTables.BIGHORN_SHEEP_GRAY, sheepLootTableBuilderWithDrop(Blocks.GRAY_WOOL)); + add(TFEntities.BIGHORN_SHEEP.get(), TFLootTables.BIGHORN_SHEEP_GREEN, sheepLootTableBuilderWithDrop(Blocks.GREEN_WOOL)); + add(TFEntities.BIGHORN_SHEEP.get(), TFLootTables.BIGHORN_SHEEP_LIGHT_BLUE, sheepLootTableBuilderWithDrop(Blocks.LIGHT_BLUE_WOOL)); + add(TFEntities.BIGHORN_SHEEP.get(), TFLootTables.BIGHORN_SHEEP_LIGHT_GRAY, sheepLootTableBuilderWithDrop(Blocks.LIGHT_GRAY_WOOL)); + add(TFEntities.BIGHORN_SHEEP.get(), TFLootTables.BIGHORN_SHEEP_LIME, sheepLootTableBuilderWithDrop(Blocks.LIME_WOOL)); + add(TFEntities.BIGHORN_SHEEP.get(), TFLootTables.BIGHORN_SHEEP_MAGENTA, sheepLootTableBuilderWithDrop(Blocks.MAGENTA_WOOL)); + add(TFEntities.BIGHORN_SHEEP.get(), TFLootTables.BIGHORN_SHEEP_ORANGE, sheepLootTableBuilderWithDrop(Blocks.ORANGE_WOOL)); + add(TFEntities.BIGHORN_SHEEP.get(), TFLootTables.BIGHORN_SHEEP_PINK, sheepLootTableBuilderWithDrop(Blocks.PINK_WOOL)); + add(TFEntities.BIGHORN_SHEEP.get(), TFLootTables.BIGHORN_SHEEP_PURPLE, sheepLootTableBuilderWithDrop(Blocks.PURPLE_WOOL)); + add(TFEntities.BIGHORN_SHEEP.get(), TFLootTables.BIGHORN_SHEEP_RED, sheepLootTableBuilderWithDrop(Blocks.RED_WOOL)); + add(TFEntities.BIGHORN_SHEEP.get(), TFLootTables.BIGHORN_SHEEP_WHITE, sheepLootTableBuilderWithDrop(Blocks.WHITE_WOOL)); + add(TFEntities.BIGHORN_SHEEP.get(), TFLootTables.BIGHORN_SHEEP_YELLOW, sheepLootTableBuilderWithDrop(Blocks.YELLOW_WOOL)); + + add(TFEntities.ARMORED_GIANT.get(), + LootTable.lootTable() + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + .add(LootItem.lootTableItem(TFItems.GIANT_SWORD.get())) + .when(LootItemKilledByPlayerCondition.killedByPlayer()))); + + add(TFEntities.GIANT_MINER.get(), + LootTable.lootTable() + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + .add(LootItem.lootTableItem(TFItems.GIANT_PICKAXE.get())) + .when(LootItemKilledByPlayerCondition.killedByPlayer()))); + + add(TFEntities.BLOCKCHAIN_GOBLIN.get(), + LootTable.lootTable() + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + .add(LootItem.lootTableItem(TFItems.ARMOR_SHARD.get()) + .apply(SetItemCountFunction.setCount(UniformGenerator.between(0.0F, 2.0F))) + .apply(LootingEnchantFunction.lootingMultiplier(UniformGenerator.between(0.0F, 1.0F)))))); + + add(TFEntities.CARMINITE_GHASTLING.get(), + LootTable.lootTable() + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + .add(LootTableReference.lootTableReference(EntityType.GHAST.getDefaultLootTable())) + .when(IsMinion.builder(true)))); + + /*registerLootTable(TFEntities.BOGGARD.get(), + LootTable.builder() + .addLootPool(LootPool.builder() + .rolls(ConstantRange.of(1)) + .addEntry(ItemLootEntry.builder(TFItems.MAZE_MAP_FOCUS.get()) + .acceptFunction(LootingEnchantBonus.builder(RandomValueRange.of(1.0F, 1.0F)))) + .acceptCondition(RandomChance.builder(0.2F))) + .addLootPool(LootPool.builder() + .rolls(ConstantRange.of(1)) + .addEntry(ItemLootEntry.builder(Items.IRON_BOOTS) + .acceptFunction(LootingEnchantBonus.builder(RandomValueRange.of(1.0F, 1.0F)))) + .acceptCondition(RandomChance.builder(0.1666F))) + .addLootPool(LootPool.builder() + .rolls(ConstantRange.of(1)) + .addEntry(ItemLootEntry.builder(Items.IRON_PICKAXE) + .acceptFunction(LootingEnchantBonus.builder(RandomValueRange.of(1.0F, 1.0F)))) + .acceptCondition(RandomChance.builder(0.1111F))));*/ + + add(TFEntities.BOAR.get(), + LootTable.lootTable() + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + .add(LootItem.lootTableItem(Items.PORKCHOP) + .apply(SetItemCountFunction.setCount(UniformGenerator.between(1.0F, 3.0F))) + .apply(SmeltItemFunction.smelted() + .when(LootItemEntityPropertyCondition.hasProperties(LootContext.EntityTarget.THIS, ENTITY_ON_FIRE))) + .apply(LootingEnchantFunction.lootingMultiplier(UniformGenerator.between(0.0F, 1.0F)))))); + + add(TFEntities.HELMET_CRAB.get(), + LootTable.lootTable() + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + .add(LootItem.lootTableItem(TFItems.ARMOR_SHARD.get()) + .apply(SetItemCountFunction.setCount(UniformGenerator.between(0.0F, 2.0F))) + .apply(LootingEnchantFunction.lootingMultiplier(UniformGenerator.between(0.0F, 1.0F))))) + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + .add(LootItem.lootTableItem(Items.COD) + .apply(SetItemCountFunction.setCount(UniformGenerator.between(1.0F, 1.0F))) + .apply(SmeltItemFunction.smelted() + .when(LootItemEntityPropertyCondition.hasProperties(LootContext.EntityTarget.THIS, ENTITY_ON_FIRE))) + .apply(LootingEnchantFunction.lootingMultiplier(UniformGenerator.between(0.0F, 1.0F)))) + .when((LootItemRandomChanceWithLootingCondition.randomChanceAndLootingBoost(0.5F, 0.1F))))); + + add(TFEntities.UPPER_GOBLIN_KNIGHT.get(), + LootTable.lootTable() + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + .add(LootItem.lootTableItem(TFItems.ARMOR_SHARD.get()) + .apply(SetItemCountFunction.setCount(UniformGenerator.between(0.0F, 2.0F))) + .apply(LootingEnchantFunction.lootingMultiplier(UniformGenerator.between(0.0F, 1.0F)))))); + + add(TFEntities.LOWER_GOBLIN_KNIGHT.get(), + LootTable.lootTable() + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + .add(LootItem.lootTableItem(TFItems.ARMOR_SHARD.get()) + .apply(SetItemCountFunction.setCount(UniformGenerator.between(0.0F, 2.0F))) + .apply(LootingEnchantFunction.lootingMultiplier(UniformGenerator.between(0.0F, 1.0F)))))); + + add(TFEntities.WRAITH.get(), + LootTable.lootTable() + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + .add(LootItem.lootTableItem(Items.GLOWSTONE_DUST) + .apply(SetItemCountFunction.setCount(UniformGenerator.between(0.0F, 2.0F))) + .apply(LootingEnchantFunction.lootingMultiplier(UniformGenerator.between(0.0F, 1.0F)))))); + + add(TFEntities.REDCAP.get(), + LootTable.lootTable() + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + .add(LootItem.lootTableItem(Items.COAL) + .apply(SetItemCountFunction.setCount(UniformGenerator.between(0.0F, 1.0F))) + .apply(LootingEnchantFunction.lootingMultiplier(UniformGenerator.between(0.0F, 1.0F)))))); + + add(TFEntities.YETI.get(), + LootTable.lootTable() + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + .add(LootItem.lootTableItem(TFItems.ARCTIC_FUR.get()) + .apply(SetItemCountFunction.setCount(UniformGenerator.between(0.0F, 2.0F))) + .apply(LootingEnchantFunction.lootingMultiplier(UniformGenerator.between(0.0F, 1.0F)))))); + + add(TFEntities.WINTER_WOLF.get(), + LootTable.lootTable() + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + .add(LootItem.lootTableItem(TFItems.ARCTIC_FUR.get()) + .apply(SetItemCountFunction.setCount(UniformGenerator.between(0.0F, 2.0F))) + .apply(LootingEnchantFunction.lootingMultiplier(UniformGenerator.between(0.0F, 1.0F)))))); + + add(TFEntities.TINY_BIRD.get(), + LootTable.lootTable() + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + .add(LootItem.lootTableItem(Items.FEATHER) + .apply(SetItemCountFunction.setCount(UniformGenerator.between(0.0F, 2.0F))) + .apply(LootingEnchantFunction.lootingMultiplier(UniformGenerator.between(0.0F, 1.0F)))))); + + add(TFEntities.PENGUIN.get(), + LootTable.lootTable() + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + .add(LootItem.lootTableItem(Items.FEATHER) + .apply(SetItemCountFunction.setCount(UniformGenerator.between(0.0F, 2.0F))) + .apply(LootingEnchantFunction.lootingMultiplier(UniformGenerator.between(0.0F, 1.0F)))))); + + add(TFEntities.ICE_CRYSTAL.get(), + LootTable.lootTable() + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + .add(LootItem.lootTableItem(Items.SNOWBALL) + .apply(SetItemCountFunction.setCount(UniformGenerator.between(0.0F, 2.0F))) + .apply(LootingEnchantFunction.lootingMultiplier(UniformGenerator.between(0.0F, 1.0F)))))); + + add(TFEntities.UNSTABLE_ICE_CORE.get(), + LootTable.lootTable() + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + .add(LootItem.lootTableItem(Items.SNOWBALL) + .apply(SetItemCountFunction.setCount(UniformGenerator.between(0.0F, 2.0F))) + .apply(LootingEnchantFunction.lootingMultiplier(UniformGenerator.between(0.0F, 1.0F)))))); + + add(TFEntities.STABLE_ICE_CORE.get(), + LootTable.lootTable() + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + .add(LootItem.lootTableItem(Items.SNOWBALL) + .apply(SetItemCountFunction.setCount(UniformGenerator.between(0.0F, 2.0F))) + .apply(LootingEnchantFunction.lootingMultiplier(UniformGenerator.between(0.0F, 1.0F)))))); + + add(TFEntities.SNOW_GUARDIAN.get(), + LootTable.lootTable() + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + .add(LootItem.lootTableItem(Items.SNOWBALL) + .apply(SetItemCountFunction.setCount(UniformGenerator.between(0.0F, 2.0F))) + .apply(LootingEnchantFunction.lootingMultiplier(UniformGenerator.between(0.0F, 1.0F)))))); + + add(TFEntities.RAVEN.get(), + LootTable.lootTable() + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + .add(LootItem.lootTableItem(TFItems.RAVEN_FEATHER.get()) + .apply(SetItemCountFunction.setCount(UniformGenerator.between(0.0F, 2.0F))) + .apply(LootingEnchantFunction.lootingMultiplier(UniformGenerator.between(0.0F, 1.0F)))))); + + add(TFEntities.TOWERWOOD_BORER.get(), + LootTable.lootTable() + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + .add(LootItem.lootTableItem(TFItems.BORER_ESSENCE.get()) + .apply(SetItemCountFunction.setCount(UniformGenerator.between(0.0F, 2.0F))) + .apply(LootingEnchantFunction.lootingMultiplier(UniformGenerator.between(0.0F, 1.0F)))))); + + add(TFEntities.SKELETON_DRUID.get(), + LootTable.lootTable() + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + .add(LootItem.lootTableItem(Items.BONE) + .apply(SetItemCountFunction.setCount(UniformGenerator.between(0.0F, 2.0F))) + .apply(LootingEnchantFunction.lootingMultiplier(UniformGenerator.between(0.0F, 1.0F))))) + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + .add(LootItem.lootTableItem(TFItems.TORCHBERRIES.get()) + .apply(SetItemCountFunction.setCount(UniformGenerator.between(0.0F, 2.0F))) + .apply(LootingEnchantFunction.lootingMultiplier(UniformGenerator.between(0.0F, 1.0F)))))); + + add(TFEntities.DEER.get(), + LootTable.lootTable() + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + .add(LootItem.lootTableItem(Items.LEATHER) + .apply(SetItemCountFunction.setCount(UniformGenerator.between(0.0F, 2.0F))) + .apply(LootingEnchantFunction.lootingMultiplier(UniformGenerator.between(0.0F, 1.0F))))) + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + .add(LootItem.lootTableItem(TFItems.RAW_VENISON.get()) + .apply(SetItemCountFunction.setCount(UniformGenerator.between(1.0F, 3.0F))) + .apply(SmeltItemFunction.smelted() + .when(LootItemEntityPropertyCondition.hasProperties(LootContext.EntityTarget.THIS, ENTITY_ON_FIRE))) + .apply(LootingEnchantFunction.lootingMultiplier(UniformGenerator.between(0.0F, 1.0F)))))); + + add(TFEntities.KOBOLD.get(), + LootTable.lootTable() + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + .add(LootItem.lootTableItem(Items.WHEAT) + .apply(SetItemCountFunction.setCount(UniformGenerator.between(0.0F, 2.0F))) + .apply(LootingEnchantFunction.lootingMultiplier(UniformGenerator.between(0.0F, 1.0F))))) + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + .add(LootItem.lootTableItem(Items.GOLD_NUGGET) + .apply(SetItemCountFunction.setCount(UniformGenerator.between(-1.0F, 1.0F))) + .apply(LootingEnchantFunction.lootingMultiplier(UniformGenerator.between(0.0F, 1.0F)))) + .when(LootItemKilledByPlayerCondition.killedByPlayer()))); + + add(TFEntities.MAZE_SLIME.get(), + LootTable.lootTable() + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + .add(LootItem.lootTableItem(Items.SLIME_BALL) + .apply(SetItemCountFunction.setCount(ConstantValue.exactly(1))) + .apply(LootingEnchantFunction.lootingMultiplier(UniformGenerator.between(0.0F, 1.0F))))) + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + .add(LootItem.lootTableItem(TFItems.CHARM_OF_KEEPING_1.get())) + .when((LootItemRandomChanceWithLootingCondition.randomChanceAndLootingBoost(0.015F, 0.005F))))); + + add(TFEntities.MINOTAUR.get(), + LootTable.lootTable() + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + .add(LootItem.lootTableItem(TFItems.RAW_MEEF.get()) + .apply(SetItemCountFunction.setCount(ConstantValue.exactly(1))) + .apply(LootingEnchantFunction.lootingMultiplier(UniformGenerator.between(0.0F, 1.0F))) + .apply(SmeltItemFunction.smelted() + .when(LootItemEntityPropertyCondition.hasProperties(LootContext.EntityTarget.THIS, ENTITY_ON_FIRE))))) + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + .add(LootItem.lootTableItem(TFItems.MAZE_MAP_FOCUS.get())) + .when((LootItemRandomChanceWithLootingCondition.randomChanceAndLootingBoost(0.025F, 0.01F))))); + + add(TFEntities.CARMINITE_GOLEM.get(), + LootTable.lootTable() + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + .add(LootItem.lootTableItem(Items.IRON_INGOT) + .apply(SetItemCountFunction.setCount(UniformGenerator.between(0.0F, 2.0F))) + .apply(LootingEnchantFunction.lootingMultiplier(UniformGenerator.between(0.0F, 1.0F))))) + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + .add(LootItem.lootTableItem(TFBlocks.TOWERWOOD.get())) + .apply(SetItemCountFunction.setCount(UniformGenerator.between(0.0F, 2.0F))) + .apply(LootingEnchantFunction.lootingMultiplier(UniformGenerator.between(0.0F, 1.0F))))); + + add(TFEntities.SLIME_BEETLE.get(), + LootTable.lootTable() + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1.0F)) + .add(LootItem.lootTableItem(Items.SLIME_BALL) + .apply(SetItemCountFunction.setCount(UniformGenerator.between(0.0F, 2.0F))) + .apply(LootingEnchantFunction.lootingMultiplier(UniformGenerator.between(0.0F, 1.0F)))))); + + add(TFEntities.TROLL.get(), + LootTable.lootTable() + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + .add(LootItem.lootTableItem(TFItems.MAGIC_BEANS.get())) + .when(LootItemRandomChanceWithLootingCondition.randomChanceAndLootingBoost(0.025F, 0.01F)))); + + add(TFEntities.DEATH_TOME.get(), + LootTable.lootTable() + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + .add(LootItem.lootTableItem(Items.PAPER)) + .apply(SetItemCountFunction.setCount(ConstantValue.exactly(3))) + .apply(LootingEnchantFunction.lootingMultiplier(UniformGenerator.between(0, 1)))) + .withPool(LootPool.lootPool().setRolls(ConstantValue.exactly(1)) + .add(LootItem.lootTableItem(Items.WRITABLE_BOOK).setWeight(2).setQuality(3)) + .add(LootItem.lootTableItem(Items.BOOK).setWeight(19)) + .add(LootTableReference.lootTableReference(TFLootTables.DEATH_TOME_BOOKS).setWeight(1))) + .withPool(LootPool.lootPool().setRolls(ConstantValue.exactly(1)) + .when(LootItemKilledByPlayerCondition.killedByPlayer()) + .when(LootItemRandomChanceWithLootingCondition.randomChanceAndLootingBoost(0.025F, 0.005F)) + .add(LootItem.lootTableItem(TFItems.MAGIC_MAP_FOCUS.get())))); + + add(TFEntities.DEATH_TOME.get(), TFLootTables.DEATH_TOME_HURT, + LootTable.lootTable() + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + .add(LootTableReference.lootTableReference(BuiltInLootTables.EMPTY)) + .add(LootItem.lootTableItem(Items.PAPER)))); + + add(TFEntities.DEATH_TOME.get(), TFLootTables.DEATH_TOME_BOOKS, + LootTable.lootTable() + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + .add(LootItem.lootTableItem(Items.BOOK).setWeight(32) + .apply(EnchantWithLevelsFunction.enchantWithLevels(UniformGenerator.between(1, 10)))) + .add(LootItem.lootTableItem(Items.BOOK).setWeight(8) + .apply(EnchantWithLevelsFunction.enchantWithLevels(UniformGenerator.between(11, 20)))) + .add(LootItem.lootTableItem(Items.BOOK).setWeight(4) + .apply(EnchantWithLevelsFunction.enchantWithLevels(UniformGenerator.between(21, 30)))) + .add(LootItem.lootTableItem(Items.BOOK).setWeight(1) + .apply(EnchantWithLevelsFunction.enchantWithLevels(UniformGenerator.between(31, 40)))))); + + add(TFEntities.NAGA.get(), + LootTable.lootTable() + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + .add(LootItem.lootTableItem(TFItems.NAGA_SCALE.get()) + .apply(SetItemCountFunction.setCount(UniformGenerator.between(6, 11))) + .apply(LootingEnchantFunction.lootingMultiplier(UniformGenerator.between(0.0F, 1.0F))))) + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + .add(LootItem.lootTableItem(TFBlocks.NAGA_TROPHY.get().asItem())))); + + add(TFEntities.LICH.get(), + LootTable.lootTable() + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + .add(LootItem.lootTableItem(TFItems.TWILIGHT_SCEPTER.get())) + .add(LootItem.lootTableItem(TFItems.LIFEDRAIN_SCEPTER.get())) + .add(LootItem.lootTableItem(TFItems.ZOMBIE_SCEPTER.get())) + .add(LootItem.lootTableItem(TFItems.FORTIFICATION_SCEPTER.get()))) + .withPool(LootPool.lootPool() + .setRolls(UniformGenerator.between(2, 4)) + .add(LootItem.lootTableItem(Items.GOLDEN_SWORD) + .apply(EnchantWithLevelsFunction.enchantWithLevels(UniformGenerator.between(10, 40)))) + .add(LootItem.lootTableItem(Items.GOLDEN_HELMET) + .apply(EnchantWithLevelsFunction.enchantWithLevels(UniformGenerator.between(10, 40)))) + .add(LootItem.lootTableItem(Items.GOLDEN_CHESTPLATE) + .apply(EnchantWithLevelsFunction.enchantWithLevels(UniformGenerator.between(10, 40)))) + .add(LootItem.lootTableItem(Items.GOLDEN_LEGGINGS) + .apply(EnchantWithLevelsFunction.enchantWithLevels(UniformGenerator.between(10, 40)))) + .add(LootItem.lootTableItem(Items.GOLDEN_BOOTS) + .apply(EnchantWithLevelsFunction.enchantWithLevels(UniformGenerator.between(10, 40))))) + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + .add(LootItem.lootTableItem(Items.ENDER_PEARL) + .apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 4))) + .apply(LootingEnchantFunction.lootingMultiplier(UniformGenerator.between(0, 1))))) + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + .add(LootItem.lootTableItem(Items.BONE) + .apply(SetItemCountFunction.setCount(UniformGenerator.between(5, 9))) + .apply(LootingEnchantFunction.lootingMultiplier(UniformGenerator.between(0, 1))))) + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + .add(LootItem.lootTableItem(TFBlocks.LICH_TROPHY.get().asItem())))); + + add(TFEntities.MINOSHROOM.get(), + LootTable.lootTable() + .withPool(LootPool.lootPool() + .setRolls(UniformGenerator.between(2, 5)) + .add(LootItem.lootTableItem(TFItems.MEEF_STROGANOFF.get()) + .apply(LootingEnchantFunction.lootingMultiplier(UniformGenerator.between(0, 1))))) + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + .add(LootItem.lootTableItem(TFBlocks.MINOSHROOM_TROPHY.get().asItem()))) + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + .add(LootItem.lootTableItem(TFItems.DIAMOND_MINOTAUR_AXE.get())))); + + add(TFEntities.HYDRA.get(), + LootTable.lootTable() + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + .add(LootItem.lootTableItem(TFItems.HYDRA_CHOP.get()) + .apply(SetItemCountFunction.setCount(UniformGenerator.between(5, 35))) + .apply(LootingEnchantFunction.lootingMultiplier(UniformGenerator.between(0, 1))))) + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + .add(LootItem.lootTableItem(TFItems.FIERY_BLOOD.get()) + .apply(SetItemCountFunction.setCount(UniformGenerator.between(7, 10))) + .apply(LootingEnchantFunction.lootingMultiplier(UniformGenerator.between(0, 2))))) + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + .add(LootItem.lootTableItem(TFBlocks.HYDRA_TROPHY.get().asItem())))); + + add(TFEntities.UR_GHAST.get(), + LootTable.lootTable() + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(4)) + .add(LootItem.lootTableItem(TFItems.CARMINITE.get()) + .apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 3))) + .apply(LootingEnchantFunction.lootingMultiplier(UniformGenerator.between(0, 1))))) + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(2)) + .add(LootItem.lootTableItem(TFItems.FIERY_TEARS.get()) + .apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 5))) + .apply(LootingEnchantFunction.lootingMultiplier(UniformGenerator.between(0, 1))))) + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + .add(LootItem.lootTableItem(TFBlocks.UR_GHAST_TROPHY.get().asItem())))); + + add(TFEntities.ALPHA_YETI.get(), + LootTable.lootTable() + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + .add(LootItem.lootTableItem(TFItems.ALPHA_YETI_FUR.get()) + .apply(SetItemCountFunction.setCount(ConstantValue.exactly(6))) + .apply(LootingEnchantFunction.lootingMultiplier(UniformGenerator.between(0, 1))))) + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + .add(LootItem.lootTableItem(TFItems.ICE_BOMB.get()) + .apply(SetItemCountFunction.setCount(ConstantValue.exactly(6))) + .apply(LootingEnchantFunction.lootingMultiplier(UniformGenerator.between(0, 1))))) + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + .add(LootItem.lootTableItem(TFBlocks.ALPHA_YETI_TROPHY.get().asItem())))); + + add(TFEntities.SNOW_QUEEN.get(), + LootTable.lootTable() + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + .add(LootItem.lootTableItem(TFItems.TRIPLE_BOW.get())) + .add(LootItem.lootTableItem(TFItems.SEEKER_BOW.get()))) + .withPool(LootPool.lootPool() + .setRolls(UniformGenerator.between(1, 4)) + .add(LootItem.lootTableItem(Blocks.PACKED_ICE.asItem()) + .apply(SetItemCountFunction.setCount(ConstantValue.exactly(7))) + .apply(LootingEnchantFunction.lootingMultiplier(UniformGenerator.between(0, 1))))) + .withPool(LootPool.lootPool() + .setRolls(UniformGenerator.between(2, 5)) + .add(LootItem.lootTableItem(Items.SNOWBALL) + .apply(SetItemCountFunction.setCount(ConstantValue.exactly(16))))) + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + .add(LootItem.lootTableItem(TFBlocks.SNOW_QUEEN_TROPHY.get().asItem())))); + + add(TFEntities.QUEST_RAM.get(), TFLootTables.QUESTING_RAM_REWARDS, + LootTable.lootTable() + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + .add(LootItem.lootTableItem(TFItems.CRUMBLE_HORN.get()))) + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + .add(LootItem.lootTableItem(Items.BUNDLE) + .apply(SetNbtFunction.setTag(Util.make(new CompoundTag(), (nbt) -> { + ListTag items = new ListTag(); + + // Do NOT overstuff the bag. + items.add(new ItemStack(TFBlocks.QUEST_RAM_TROPHY.get()).serializeNBT()); + items.add(new ItemStack(Blocks.COAL_BLOCK).serializeNBT()); + items.add(new ItemStack(Blocks.IRON_BLOCK).serializeNBT()); + items.add(new ItemStack(Blocks.COPPER_BLOCK).serializeNBT()); + items.add(new ItemStack(Blocks.LAPIS_BLOCK).serializeNBT()); + items.add(new ItemStack(Blocks.GOLD_BLOCK).serializeNBT()); + items.add(new ItemStack(Blocks.DIAMOND_BLOCK).serializeNBT()); + items.add(new ItemStack(Blocks.EMERALD_BLOCK).serializeNBT()); + + nbt.put("Items", items); + })))))); + } + + public LootTable.Builder emptyLootTable() { + return LootTable.lootTable(); + } + + public LootTable.Builder fromEntityLootTable(EntityType parent) { + return LootTable.lootTable() + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1)) + .add(LootTableReference.lootTableReference(parent.getDefaultLootTable()))); + } + + private static LootTable.Builder sheepLootTableBuilderWithDrop(ItemLike wool) { + return LootTable.lootTable().withPool(LootPool.lootPool().setRolls(ConstantValue.exactly(1)).add(LootItem.lootTableItem(wool))).withPool(LootPool.lootPool().setRolls(ConstantValue.exactly(1)).add(LootTableReference.lootTableReference(EntityType.SHEEP.getDefaultLootTable()))); + } + + @Override + protected Stream> getKnownEntityTypes() { + return ForgeRegistries.ENTITY_TYPES.getValues().stream().filter(entities -> ForgeRegistries.ENTITY_TYPES.getKey(entities).getNamespace().equals(TwilightForestMod.ID)); + } +} diff --git a/src/main/java/twilightforest/data/ItemModelGenerator.java b/src/main/java/twilightforest/data/ItemModelGenerator.java new file mode 100644 index 0000000000..f51a85bac8 --- /dev/null +++ b/src/main/java/twilightforest/data/ItemModelGenerator.java @@ -0,0 +1,768 @@ +package twilightforest.data; + +import net.minecraft.core.Registry; +import net.minecraft.core.registries.Registries; +import net.minecraft.data.DataGenerator; +import net.minecraft.data.PackOutput; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.SpawnEggItem; +import net.minecraft.world.level.block.Block; +import net.minecraftforge.client.ForgeRenderTypes; +import net.minecraftforge.client.model.generators.ItemModelBuilder; +import net.minecraftforge.client.model.generators.ItemModelProvider; +import net.minecraftforge.client.model.generators.ModelFile; +import net.minecraftforge.client.model.generators.loaders.ItemLayerModelBuilder; +import net.minecraftforge.common.data.ExistingFileHelper; +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.registries.RegistryObject; +import twilightforest.TwilightForestMod; +import twilightforest.block.HollowLogHorizontal; +import twilightforest.init.TFBlocks; +import twilightforest.item.Experiment115Item; +import twilightforest.init.TFItems; + +import static twilightforest.TwilightForestMod.prefix; + +public class ItemModelGenerator extends ItemModelProvider { + public ItemModelGenerator(PackOutput output, ExistingFileHelper existingFileHelper) { + super(output, TwilightForestMod.ID, existingFileHelper); + } + + @Override + protected void registerModels() { + for (Item i : ForgeRegistries.ITEMS) { + if (i instanceof SpawnEggItem && ForgeRegistries.ITEMS.getKey(i).getNamespace().equals(TwilightForestMod.ID)) { + getBuilder(ForgeRegistries.ITEMS.getKey(i).getPath()) + .parent(getExistingFile(new ResourceLocation("item/template_spawn_egg"))); + } + } + toBlock(TFBlocks.TOWERWOOD.get()); + toBlock(TFBlocks.ENCASED_TOWERWOOD.get()); + toBlock(TFBlocks.CRACKED_TOWERWOOD.get()); + toBlock(TFBlocks.MOSSY_TOWERWOOD.get()); + toBlock(TFBlocks.INFESTED_TOWERWOOD.get()); + toBlock(TFBlocks.CARMINITE_BUILDER.get()); + toBlock(TFBlocks.ANTIBUILDER.get()); + toBlock(TFBlocks.GHAST_TRAP.get()); + toBlock(TFBlocks.VANISHING_BLOCK.get()); + toBlock(TFBlocks.LOCKED_VANISHING_BLOCK.get()); + toBlock(TFBlocks.REAPPEARING_BLOCK.get()); + toBlock(TFBlocks.CARMINITE_REACTOR.get()); + toBlockModel(TFBlocks.FAKE_GOLD.get(), new ResourceLocation("block/gold_block")); + toBlockModel(TFBlocks.FAKE_DIAMOND.get(), new ResourceLocation("block/diamond_block")); + toBlock(TFBlocks.STRONGHOLD_SHIELD.get()); + toBlock(TFBlocks.TROPHY_PEDESTAL.get()); + toBlockModel(TFBlocks.AURORA_BLOCK.get(), prefix("block/aurora_block_0")); + toBlock(TFBlocks.AURORA_PILLAR.get()); + toBlock(TFBlocks.AURORA_SLAB.get()); + toBlock(TFBlocks.AURORALIZED_GLASS.get()); + toBlock(TFBlocks.UNDERBRICK.get()); + toBlock(TFBlocks.CRACKED_UNDERBRICK.get()); + toBlock(TFBlocks.MOSSY_UNDERBRICK.get()); + toBlock(TFBlocks.UNDERBRICK_FLOOR.get()); + toBlock(TFBlocks.GREEN_THORNS.get()); + toBlock(TFBlocks.BROWN_THORNS.get()); + toBlock(TFBlocks.BURNT_THORNS.get()); + generated(TFBlocks.THORN_ROSE.getId().getPath(), prefix("block/" + TFBlocks.THORN_ROSE.getId().getPath())); + toBlockModel(TFBlocks.THORN_LEAVES.get(), new ResourceLocation("block/oak_leaves")); + toBlockModel(TFBlocks.BEANSTALK_LEAVES.get(), new ResourceLocation("block/azalea_leaves")); + toBlock(TFBlocks.DEADROCK.get()); + toBlock(TFBlocks.CRACKED_DEADROCK.get()); + toBlock(TFBlocks.WEATHERED_DEADROCK.get()); + getBuilder(TFBlocks.TROLLSTEINN.getId().getPath()).parent(getExistingFile(new ResourceLocation("block/cube_all"))) + .texture("all", prefix("block/trollsteinn")); + toBlock(TFBlocks.WISPY_CLOUD.get()); + toBlock(TFBlocks.FLUFFY_CLOUD.get()); + toBlockModel(TFBlocks.GIANT_COBBLESTONE.get(), new ResourceLocation("block/cobblestone")); + toBlockModel(TFBlocks.GIANT_LOG.get(), new ResourceLocation("block/oak_log")); + toBlockModel(TFBlocks.GIANT_LEAVES.get(), new ResourceLocation("block/oak_leaves")); + toBlockModel(TFBlocks.GIANT_OBSIDIAN.get(), new ResourceLocation("block/obsidian")); + toBlock(TFBlocks.UBEROUS_SOIL.get()); + toBlock(TFBlocks.HUGE_STALK.get()); + getBuilder(TFBlocks.HUGE_MUSHGLOOM.getId().getPath()).parent(getExistingFile(new ResourceLocation("block/cube_all"))) + .texture("all", prefix("block/huge_gloom_cap")); + getBuilder(TFBlocks.HUGE_MUSHGLOOM_STEM.getId().getPath()).parent(getExistingFile(new ResourceLocation("block/cube_all"))) + .texture("all", prefix("block/huge_mushgloom_stem")); + generated(TFBlocks.TROLLVIDR.getId().getPath(), prefix("block/" + TFBlocks.TROLLVIDR.getId().getPath())); + generated(TFBlocks.UNRIPE_TROLLBER.getId().getPath(), prefix("block/" + TFBlocks.UNRIPE_TROLLBER.getId().getPath())); + generated(TFBlocks.TROLLBER.getId().getPath(), prefix("block/" + TFBlocks.TROLLBER.getId().getPath())); + toBlock(TFBlocks.SLIDER.get()); + generated(TFBlocks.HUGE_LILY_PAD.getId().getPath(), prefix("block/" + TFBlocks.HUGE_LILY_PAD.getId().getPath())); + generated(TFBlocks.HUGE_WATER_LILY.getId().getPath(), prefix("block/" + TFBlocks.HUGE_WATER_LILY.getId().getPath())); + toBlock(TFBlocks.CASTLE_BRICK.get()); + toBlock(TFBlocks.WORN_CASTLE_BRICK.get()); + toBlock(TFBlocks.CRACKED_CASTLE_BRICK.get()); + toBlock(TFBlocks.CASTLE_ROOF_TILE.get()); + toBlock(TFBlocks.MOSSY_CASTLE_BRICK.get()); + toBlock(TFBlocks.THICK_CASTLE_BRICK.get()); + toBlock(TFBlocks.ENCASED_CASTLE_BRICK_PILLAR.get()); + toBlock(TFBlocks.ENCASED_CASTLE_BRICK_TILE.get()); + toBlock(TFBlocks.BOLD_CASTLE_BRICK_PILLAR.get()); + toBlock(TFBlocks.BOLD_CASTLE_BRICK_TILE.get()); + toBlock(TFBlocks.CASTLE_BRICK_STAIRS.get()); + toBlock(TFBlocks.WORN_CASTLE_BRICK_STAIRS.get()); + toBlock(TFBlocks.CRACKED_CASTLE_BRICK_STAIRS.get()); + toBlock(TFBlocks.MOSSY_CASTLE_BRICK_STAIRS.get()); + toBlock(TFBlocks.ENCASED_CASTLE_BRICK_STAIRS.get()); + toBlock(TFBlocks.BOLD_CASTLE_BRICK_STAIRS.get()); + toBlock(TFBlocks.PINK_CASTLE_DOOR.get()); + toBlock(TFBlocks.YELLOW_CASTLE_DOOR.get()); + toBlock(TFBlocks.BLUE_CASTLE_DOOR.get()); + toBlock(TFBlocks.VIOLET_CASTLE_DOOR.get()); + toBlockModel(TFBlocks.YELLOW_CASTLE_RUNE_BRICK.get(), "castle_rune_inventory"); + toBlockModel(TFBlocks.VIOLET_CASTLE_RUNE_BRICK.get(), "castle_rune_inventory"); + toBlockModel(TFBlocks.PINK_CASTLE_RUNE_BRICK.get(), "castle_rune_inventory"); + toBlockModel(TFBlocks.BLUE_CASTLE_RUNE_BRICK.get(), "castle_rune_inventory"); + forcefield(TFBlocks.PINK_FORCE_FIELD.getId().getPath(), prefix("block/forcefield_white")); + forcefield(TFBlocks.BLUE_FORCE_FIELD.getId().getPath(), prefix("block/forcefield_white")); + forcefield(TFBlocks.GREEN_FORCE_FIELD.getId().getPath(), prefix("block/forcefield_white")); + forcefield(TFBlocks.VIOLET_FORCE_FIELD.getId().getPath(), prefix("block/forcefield_white")); + forcefield(TFBlocks.ORANGE_FORCE_FIELD.getId().getPath(), prefix("block/forcefield_white")); + toBlock(TFBlocks.CINDER_LOG.get()); + toBlock(TFBlocks.CINDER_WOOD.get()); + toBlockModel(TFBlocks.CINDER_FURNACE.get(), new ResourceLocation("block/furnace")); + ModelFile think115 = generated("item/think115", prefix("item/think115")); + ModelFile fullBlockSprinkle = getExistingFile(prefix("block/experiment115_8_8_regenerating")); + generated(TFBlocks.EXPERIMENT_115.getId().getPath(), prefix("item/experiment_115")) + .override().predicate(Experiment115Item.THINK, 1).model(think115).end() + .override().predicate(Experiment115Item.FULL, 1).model(fullBlockSprinkle).end(); + toBlockModel(TFBlocks.TWILIGHT_PORTAL_MINIATURE_STRUCTURE.get(), "miniature/portal"); + toBlockModel(TFBlocks.NAGA_COURTYARD_MINIATURE_STRUCTURE.get(), "miniature/naga_courtyard"); + toBlockModel(TFBlocks.LICH_TOWER_MINIATURE_STRUCTURE.get(), "miniature/lich_tower"); + toBlock(TFBlocks.KNIGHTMETAL_BLOCK.get()); + toBlock(TFBlocks.IRONWOOD_BLOCK.get()); + toBlock(TFBlocks.FIERY_BLOCK.get()); + toBlock(TFBlocks.ARCTIC_FUR_BLOCK.get()); + toBlock(TFBlocks.STEELEAF_BLOCK.get()); + toBlock(TFBlocks.CARMINITE_BLOCK.get()); + toBlock(TFBlocks.MAZESTONE.get()); + toBlock(TFBlocks.MAZESTONE_BRICK.get()); + toBlock(TFBlocks.CUT_MAZESTONE.get()); + toBlock(TFBlocks.DECORATIVE_MAZESTONE.get()); + toBlock(TFBlocks.CRACKED_MAZESTONE.get()); + toBlock(TFBlocks.MOSSY_MAZESTONE.get()); + toBlock(TFBlocks.MAZESTONE_MOSAIC.get()); + toBlock(TFBlocks.MAZESTONE_BORDER.get()); + singleTex(TFItems.RED_THREAD); + toBlock(TFBlocks.HEDGE.get()); + toBlock(TFBlocks.ROOT_BLOCK.get()); + toBlock(TFBlocks.LIVEROOT_BLOCK.get()); + toBlock(TFBlocks.MANGROVE_ROOT.get()); + toBlock(TFBlocks.UNCRAFTING_TABLE.get()); + toBlockModel(TFBlocks.NAGA_BOSS_SPAWNER.get(), new ResourceLocation("block/spawner")); + toBlockModel(TFBlocks.LICH_BOSS_SPAWNER.get(), new ResourceLocation("block/spawner")); + toBlockModel(TFBlocks.HYDRA_BOSS_SPAWNER.get(), new ResourceLocation("block/spawner")); + toBlockModel(TFBlocks.UR_GHAST_BOSS_SPAWNER.get(), new ResourceLocation("block/spawner")); + toBlockModel(TFBlocks.KNIGHT_PHANTOM_BOSS_SPAWNER.get(), new ResourceLocation("block/spawner")); + toBlockModel(TFBlocks.SNOW_QUEEN_BOSS_SPAWNER.get(), new ResourceLocation("block/spawner")); + toBlockModel(TFBlocks.MINOSHROOM_BOSS_SPAWNER.get(), new ResourceLocation("block/spawner")); + toBlockModel(TFBlocks.ALPHA_YETI_BOSS_SPAWNER.get(), new ResourceLocation("block/spawner")); + toBlockModel(TFBlocks.FINAL_BOSS_BOSS_SPAWNER.get(), new ResourceLocation("block/spawner")); + toBlock(TFBlocks.FIREFLY_JAR.get()); + toBlock(TFBlocks.FIREFLY_SPAWNER.get()); + toBlock(TFBlocks.CICADA_JAR.get()); + generated(TFBlocks.MOSS_PATCH.getId().getPath(), prefix("block/patch/moss")); + generated(TFBlocks.MAYAPPLE.getId().getPath(), prefix("block/mayapple")); + generated(TFBlocks.CLOVER_PATCH.getId().getPath(), prefix("block/patch/clover")); + generated(TFBlocks.FIDDLEHEAD.getId().getPath(), prefix("block/fiddlehead")); + generated(TFBlocks.MUSHGLOOM.getId().getPath(), prefix("block/mushgloom"), prefix("block/mushgloom_head")); + generated(TFBlocks.TORCHBERRY_PLANT.getId().getPath(), prefix("block/torchberry_plant")); + generated(TFBlocks.ROOT_STRAND.getId().getPath(), prefix("block/root_strand")); + generated(TFBlocks.FALLEN_LEAVES.getId().getPath(), new ResourceLocation("block/oak_leaves")); + toBlock(TFBlocks.SMOKER.get()); + toBlock(TFBlocks.FIRE_JET.get()); + toBlock(TFBlocks.ENCASED_SMOKER.get()); + toBlock(TFBlocks.ENCASED_FIRE_JET.get()); + toBlock(TFBlocks.NAGASTONE.get()); + toBlock(TFBlocks.NAGASTONE_HEAD.get()); + toBlock(TFBlocks.NAGASTONE_PILLAR.get()); + toBlock(TFBlocks.MOSSY_NAGASTONE_PILLAR.get()); + toBlock(TFBlocks.CRACKED_NAGASTONE_PILLAR.get()); + toBlock(TFBlocks.ETCHED_NAGASTONE.get()); + toBlock(TFBlocks.MOSSY_ETCHED_NAGASTONE.get()); + toBlock(TFBlocks.CRACKED_ETCHED_NAGASTONE.get()); + toBlock(TFBlocks.NAGASTONE_STAIRS_LEFT.get()); + toBlock(TFBlocks.NAGASTONE_STAIRS_RIGHT.get()); + toBlock(TFBlocks.CRACKED_NAGASTONE_STAIRS_LEFT.get()); + toBlock(TFBlocks.CRACKED_NAGASTONE_STAIRS_RIGHT.get()); + toBlock(TFBlocks.MOSSY_NAGASTONE_STAIRS_LEFT.get()); + toBlock(TFBlocks.MOSSY_NAGASTONE_STAIRS_RIGHT.get()); + toBlockModel(TFBlocks.SPIRAL_BRICKS.get(), prefix("block/spiral_bricks/x_spiral_bottom_right")); + toBlock(TFBlocks.TWISTED_STONE.get()); + toBlockModel(TFBlocks.TWISTED_STONE_PILLAR.get(), prefix("block/pillar/pillar_inventory")); + toBlock(TFBlocks.BOLD_STONE_PILLAR.get()); + toBlockModel(TFBlocks.DEATH_TOME_SPAWNER.get(), prefix("block/death_tome_spawner_10")); + toBlock(TFBlocks.EMPTY_CANOPY_BOOKSHELF.get()); + toBlock(TFBlocks.CANOPY_BOOKSHELF.get()); + toBlockModel(TFBlocks.CANDELABRA.get(), "candelabra_4_5_4_plain"); + + withExistingParent(TFBlocks.OAK_BANISTER.getId().toString(), prefix("item/banister_item")).texture("texture", "minecraft:block/oak_planks"); + withExistingParent(TFBlocks.SPRUCE_BANISTER.getId().toString(), prefix("item/banister_item")).texture("texture", "minecraft:block/spruce_planks"); + withExistingParent(TFBlocks.BIRCH_BANISTER.getId().toString(), prefix("item/banister_item")).texture("texture", "minecraft:block/birch_planks"); + withExistingParent(TFBlocks.JUNGLE_BANISTER.getId().toString(), prefix("item/banister_item")).texture("texture", "minecraft:block/jungle_planks"); + withExistingParent(TFBlocks.ACACIA_BANISTER.getId().toString(), prefix("item/banister_item")).texture("texture", "minecraft:block/acacia_planks"); + withExistingParent(TFBlocks.DARK_OAK_BANISTER.getId().toString(), prefix("item/banister_item")).texture("texture", "minecraft:block/dark_oak_planks"); + withExistingParent(TFBlocks.CRIMSON_BANISTER.getId().toString(), prefix("item/banister_item")).texture("texture", "minecraft:block/crimson_planks"); + withExistingParent(TFBlocks.WARPED_BANISTER.getId().toString(), prefix("item/banister_item")).texture("texture", "minecraft:block/warped_planks"); + withExistingParent(TFBlocks.VANGROVE_BANISTER.getId().toString(), prefix("item/banister_item")).texture("texture", "minecraft:block/mangrove_planks"); + + toBlock(TFBlocks.TWILIGHT_OAK_LOG.get()); + toBlock(TFBlocks.STRIPPED_TWILIGHT_OAK_LOG.get()); + toBlock(TFBlocks.TWILIGHT_OAK_WOOD.get()); + toBlock(TFBlocks.STRIPPED_TWILIGHT_OAK_WOOD.get()); + toBlock(TFBlocks.TWILIGHT_OAK_LEAVES.get()); + toBlock(TFBlocks.RAINBOW_OAK_LEAVES.get()); + generated(TFBlocks.RAINBOW_OAK_SAPLING.getId().getPath(), prefix("block/" + TFBlocks.RAINBOW_OAK_SAPLING.getId().getPath())); + generated(TFBlocks.TWILIGHT_OAK_SAPLING.getId().getPath(), prefix("block/" + TFBlocks.TWILIGHT_OAK_SAPLING.getId().getPath())); + woodBlock(TFBlocks.TWILIGHT_OAK_PLANKS.get(), "planks/twilight_oak"); + woodBlock(TFBlocks.TWILIGHT_OAK_STAIRS.get(), "stairs/twilight_oak"); + woodBlock(TFBlocks.TWILIGHT_OAK_SLAB.get(), "slab/twilight_oak"); + woodenButton(TFBlocks.TWILIGHT_OAK_BUTTON.get(), "twilight_oak"); + woodenFence(TFBlocks.TWILIGHT_OAK_FENCE.get(), "twilight_oak"); + woodBlock(TFBlocks.TWILIGHT_OAK_GATE.get(), "fence_gate/twilight_oak"); + woodBlock(TFBlocks.TWILIGHT_OAK_PLATE.get(), "pressure_plate/twilight_oak"); + woodBlockModel(TFBlocks.TWILIGHT_OAK_TRAPDOOR.get(), "twilight_oak_trapdoor_bottom", "trapdoor/twilight_oak"); + generated(TFBlocks.TWILIGHT_OAK_SIGN.getId().getPath(), prefix("item/" + TFBlocks.TWILIGHT_OAK_SIGN.getId().getPath())); + withExistingParent(TFBlocks.TWILIGHT_OAK_BANISTER.getId().toString(), prefix("item/banister_item")).texture("texture", "block/wood/planks_twilight_oak_0"); + generated(TFBlocks.TWILIGHT_OAK_DOOR.getId().getPath(), prefix("item/" + TFBlocks.TWILIGHT_OAK_DOOR.getId().getPath())); + withExistingParent(TFBlocks.TWILIGHT_OAK_CHEST.getId().toString(), "item/chest").texture("particle", prefix("block/wood/planks_twilight_oak_0")); + + toBlock(TFBlocks.CANOPY_LOG.get()); + toBlock(TFBlocks.STRIPPED_CANOPY_LOG.get()); + toBlock(TFBlocks.CANOPY_WOOD.get()); + toBlock(TFBlocks.STRIPPED_CANOPY_WOOD.get()); + toBlock(TFBlocks.CANOPY_LEAVES.get()); + generated(TFBlocks.CANOPY_SAPLING.getId().getPath(), prefix("block/" + TFBlocks.CANOPY_SAPLING.getId().getPath())); + woodBlock(TFBlocks.CANOPY_PLANKS.get(), "planks/canopy"); + woodBlock(TFBlocks.CANOPY_STAIRS.get(), "stairs/canopy"); + woodBlock(TFBlocks.CANOPY_SLAB.get(), "slab/canopy"); + woodenButton(TFBlocks.CANOPY_BUTTON.get(), "canopy"); + woodenFence(TFBlocks.CANOPY_FENCE.get(), "canopy"); + woodBlock(TFBlocks.CANOPY_GATE.get(), "fence_gate/canopy"); + woodBlock(TFBlocks.CANOPY_PLATE.get(), "pressure_plate/canopy"); + woodBlockModel(TFBlocks.CANOPY_TRAPDOOR.get(), "canopy_trapdoor_bottom", "trapdoor/canopy"); + generated(TFBlocks.CANOPY_SIGN.getId().getPath(), prefix("item/" + TFBlocks.CANOPY_SIGN.getId().getPath())); + withExistingParent(TFBlocks.CANOPY_BANISTER.getId().toString(), prefix("item/banister_item")).texture("texture", "block/wood/planks_canopy_0"); + generated(TFBlocks.CANOPY_DOOR.getId().getPath(), prefix("item/" + TFBlocks.CANOPY_DOOR.getId().getPath())); + withExistingParent(TFBlocks.CANOPY_CHEST.getId().toString(), "item/chest").texture("particle", prefix("block/wood/planks_canopy_0")); + + toBlock(TFBlocks.MANGROVE_LOG.get()); + toBlock(TFBlocks.STRIPPED_MANGROVE_LOG.get()); + toBlock(TFBlocks.MANGROVE_WOOD.get()); + toBlock(TFBlocks.STRIPPED_MANGROVE_WOOD.get()); + toBlock(TFBlocks.MANGROVE_LEAVES.get()); + generated(TFBlocks.MANGROVE_SAPLING.getId().getPath(), prefix("block/" + TFBlocks.MANGROVE_SAPLING.getId().getPath())); + woodBlock(TFBlocks.MANGROVE_PLANKS.get(), "planks/mangrove"); + woodBlock(TFBlocks.MANGROVE_STAIRS.get(), "stairs/mangrove"); + woodBlock(TFBlocks.MANGROVE_SLAB.get(), "slab/mangrove"); + woodenButton(TFBlocks.MANGROVE_BUTTON.get(), "mangrove"); + woodenFence(TFBlocks.MANGROVE_FENCE.get(), "mangrove"); + woodBlock(TFBlocks.MANGROVE_GATE.get(), "fence_gate/mangrove"); + woodBlock(TFBlocks.MANGROVE_PLATE.get(), "pressure_plate/mangrove"); + woodBlockModel(TFBlocks.MANGROVE_TRAPDOOR.get(), "mangrove_trapdoor_bottom", "trapdoor/mangrove"); + generated(TFBlocks.MANGROVE_SIGN.getId().getPath(), prefix("item/" + TFBlocks.MANGROVE_SIGN.getId().getPath())); + withExistingParent(TFBlocks.MANGROVE_BANISTER.getId().toString(), prefix("item/banister_item")).texture("texture", "block/wood/planks_mangrove_0"); + generated(TFBlocks.MANGROVE_DOOR.getId().getPath(), prefix("item/" + TFBlocks.MANGROVE_DOOR.getId().getPath())); + withExistingParent(TFBlocks.MANGROVE_CHEST.getId().toString(), "item/chest").texture("particle", prefix("block/wood/planks_mangrove_0")); + + toBlock(TFBlocks.DARK_LOG.get()); + toBlock(TFBlocks.STRIPPED_DARK_LOG.get()); + toBlock(TFBlocks.DARK_WOOD.get()); + toBlock(TFBlocks.STRIPPED_DARK_WOOD.get()); + toBlock(TFBlocks.DARK_LEAVES.get()); + generated(TFBlocks.DARKWOOD_SAPLING.getId().getPath(), prefix("block/" + TFBlocks.DARKWOOD_SAPLING.getId().getPath())); + woodBlock(TFBlocks.DARK_PLANKS.get(), "planks/darkwood"); + woodBlock(TFBlocks.DARK_STAIRS.get(), "stairs/darkwood"); + woodBlock(TFBlocks.DARK_SLAB.get(), "slab/darkwood"); + woodenButton(TFBlocks.DARK_BUTTON.get(), "darkwood"); + woodenFence(TFBlocks.DARK_FENCE.get(), "darkwood"); + woodBlock(TFBlocks.DARK_GATE.get(), "fence_gate/darkwood"); + woodBlock(TFBlocks.DARK_PLATE.get(), "pressure_plate/darkwood"); + woodBlockModel(TFBlocks.DARK_TRAPDOOR.get(), "darkwood_trapdoor_bottom", "trapdoor/darkwood"); + generated(TFBlocks.DARK_SIGN.getId().getPath(), prefix("item/" + TFBlocks.DARK_SIGN.getId().getPath())); + withExistingParent(TFBlocks.DARK_BANISTER.getId().toString(), prefix("item/banister_item")).texture("texture", "block/wood/planks_darkwood_0"); + generated(TFBlocks.DARK_DOOR.getId().getPath(), prefix("item/" + TFBlocks.DARK_DOOR.getId().getPath())); + generated(TFBlocks.HOLLOW_OAK_SAPLING.getId().getPath(), prefix("block/" + TFBlocks.HOLLOW_OAK_SAPLING.getId().getPath())); + withExistingParent(TFBlocks.DARK_CHEST.getId().toString(), "item/chest").texture("particle", prefix("block/wood/planks_darkwood_0")); + + toBlock(TFBlocks.TIME_LOG.get()); + toBlock(TFBlocks.STRIPPED_TIME_LOG.get()); + toBlock(TFBlocks.TIME_WOOD.get()); + toBlock(TFBlocks.STRIPPED_TIME_WOOD.get()); + toBlock(TFBlocks.TIME_LOG_CORE.get()); + toBlock(TFBlocks.TIME_LEAVES.get()); + generated(TFBlocks.TIME_SAPLING.getId().getPath(), prefix("block/" + TFBlocks.TIME_SAPLING.getId().getPath())); + woodBlock(TFBlocks.TIME_PLANKS.get(), "planks/time"); + woodBlock(TFBlocks.TIME_STAIRS.get(), "stairs/time"); + woodBlock(TFBlocks.TIME_SLAB.get(), "slab/time"); + woodenButton(TFBlocks.TIME_BUTTON.get(), "time"); + woodenFence(TFBlocks.TIME_FENCE.get(), "time"); + woodBlock(TFBlocks.TIME_GATE.get(), "fence_gate/time"); + woodBlock(TFBlocks.TIME_PLATE.get(), "pressure_plate/time"); + woodBlockModel(TFBlocks.TIME_TRAPDOOR.get(), "time_trapdoor_bottom", "trapdoor/time"); + generated(TFBlocks.TIME_SIGN.getId().getPath(), prefix("item/" + TFBlocks.TIME_SIGN.getId().getPath())); + withExistingParent(TFBlocks.TIME_BANISTER.getId().toString(), prefix("item/banister_item")).texture("texture", "block/wood/planks_time_0"); + generated(TFBlocks.TIME_DOOR.getId().getPath(), prefix("item/" + TFBlocks.TIME_DOOR.getId().getPath())); + withExistingParent(TFBlocks.TIME_CHEST.getId().toString(), "item/chest").texture("particle", prefix("block/wood/planks_time_0")); + + toBlock(TFBlocks.TRANSFORMATION_LOG.get()); + toBlock(TFBlocks.STRIPPED_TRANSFORMATION_LOG.get()); + toBlock(TFBlocks.TRANSFORMATION_WOOD.get()); + toBlock(TFBlocks.STRIPPED_TRANSFORMATION_WOOD.get()); + toBlock(TFBlocks.TRANSFORMATION_LOG_CORE.get()); + toBlock(TFBlocks.TRANSFORMATION_LEAVES.get()); + generated(TFBlocks.TRANSFORMATION_SAPLING.getId().getPath(), prefix("block/" + TFBlocks.TRANSFORMATION_SAPLING.getId().getPath())); + woodBlock(TFBlocks.TRANSFORMATION_PLANKS.get(), "planks/trans"); + woodBlock(TFBlocks.TRANSFORMATION_STAIRS.get(), "stairs/trans"); + woodBlock(TFBlocks.TRANSFORMATION_SLAB.get(), "slab/trans"); + woodenButton(TFBlocks.TRANSFORMATION_BUTTON.get(), "trans"); + woodenFence(TFBlocks.TRANSFORMATION_FENCE.get(), "trans"); + woodBlock(TFBlocks.TRANSFORMATION_GATE.get(), "fence_gate/trans"); + woodBlock(TFBlocks.TRANSFORMATION_PLATE.get(), "pressure_plate/trans"); + woodBlockModel(TFBlocks.TRANSFORMATION_TRAPDOOR.get(), "trans_trapdoor_bottom", "trapdoor/trans"); + generated(TFBlocks.TRANSFORMATION_SIGN.getId().getPath(), prefix("item/" + TFBlocks.TRANSFORMATION_SIGN.getId().getPath())); + withExistingParent(TFBlocks.TRANSFORMATION_BANISTER.getId().toString(), prefix("item/banister_item")).texture("texture", "block/wood/planks_trans_0"); + generated(TFBlocks.TRANSFORMATION_DOOR.getId().getPath(), prefix("item/" + TFBlocks.TRANSFORMATION_DOOR.getId().getPath())); + withExistingParent(TFBlocks.TRANSFORMATION_CHEST.getId().toString(), "item/chest").texture("particle", prefix("block/wood/planks_trans_0")); + + toBlock(TFBlocks.MINING_LOG.get()); + toBlock(TFBlocks.STRIPPED_MINING_LOG.get()); + toBlock(TFBlocks.MINING_WOOD.get()); + toBlock(TFBlocks.STRIPPED_MINING_WOOD.get()); + toBlock(TFBlocks.MINING_LOG_CORE.get()); + toBlock(TFBlocks.MINING_LEAVES.get()); + generated(TFBlocks.MINING_SAPLING.getId().getPath(), prefix("block/" + TFBlocks.MINING_SAPLING.getId().getPath())); + woodBlock(TFBlocks.MINING_PLANKS.get(), "planks/mine"); + woodBlock(TFBlocks.MINING_STAIRS.get(), "stairs/mine"); + woodBlock(TFBlocks.MINING_SLAB.get(), "slab/mine"); + woodenButton(TFBlocks.MINING_BUTTON.get(), "mine"); + woodenFence(TFBlocks.MINING_FENCE.get(), "mine"); + woodBlock(TFBlocks.MINING_GATE.get(), "fence_gate/mine"); + woodBlock(TFBlocks.MINING_PLATE.get(), "pressure_plate/mine"); + woodBlockModel(TFBlocks.MINING_TRAPDOOR.get(), "mine_trapdoor_bottom", "trapdoor/mine"); + generated(TFBlocks.MINING_SIGN.getId().getPath(), prefix("item/" + TFBlocks.MINING_SIGN.getId().getPath())); + withExistingParent(TFBlocks.MINING_BANISTER.getId().toString(), prefix("item/banister_item")).texture("texture", "block/wood/planks_mine_0"); + generated(TFBlocks.MINING_DOOR.getId().getPath(), prefix("item/" + TFBlocks.MINING_DOOR.getId().getPath())); + withExistingParent(TFBlocks.MINING_CHEST.getId().toString(), "item/chest").texture("particle", prefix("block/wood/planks_mine_0")); + + toBlock(TFBlocks.SORTING_LOG.get()); + toBlock(TFBlocks.STRIPPED_SORTING_LOG.get()); + toBlock(TFBlocks.SORTING_WOOD.get()); + toBlock(TFBlocks.STRIPPED_SORTING_WOOD.get()); + toBlock(TFBlocks.SORTING_LOG_CORE.get()); + toBlock(TFBlocks.SORTING_LEAVES.get()); + generated(TFBlocks.SORTING_SAPLING.getId().getPath(), prefix("block/" + TFBlocks.SORTING_SAPLING.getId().getPath())); + woodBlock(TFBlocks.SORTING_PLANKS.get(), "planks/sort"); + woodBlock(TFBlocks.SORTING_STAIRS.get(), "stairs/sort"); + woodBlock(TFBlocks.SORTING_SLAB.get(), "slab/sort"); + woodenButton(TFBlocks.SORTING_BUTTON.get(), "sort"); + woodenFence(TFBlocks.SORTING_FENCE.get(), "sort"); + woodBlock(TFBlocks.SORTING_GATE.get(), "fence_gate/sort"); + woodBlock(TFBlocks.SORTING_PLATE.get(), "pressure_plate/sort"); + woodBlockModel(TFBlocks.SORTING_TRAPDOOR.get(), "sort_trapdoor_bottom", "trapdoor/sort"); + generated(TFBlocks.SORTING_SIGN.getId().getPath(), prefix("item/" + TFBlocks.SORTING_SIGN.getId().getPath())); + withExistingParent(TFBlocks.SORTING_BANISTER.getId().toString(), prefix("item/banister_item")).texture("texture", "block/wood/planks_sort_0"); + generated(TFBlocks.SORTING_DOOR.getId().getPath(), prefix("item/" + TFBlocks.SORTING_DOOR.getId().getPath())); + withExistingParent(TFBlocks.SORTING_CHEST.getId().toString(), "item/chest").texture("particle", prefix("block/wood/planks_sort_0")); + + withExistingParent(TFBlocks.NAGA_TROPHY.getId().toString(), prefix("item/template_trophy")); + withExistingParent(TFBlocks.LICH_TROPHY.getId().toString(), prefix("item/template_trophy")); + withExistingParent(TFBlocks.MINOSHROOM_TROPHY.getId().toString(), prefix("item/template_trophy")); + withExistingParent(TFBlocks.HYDRA_TROPHY.getId().toString(), prefix("item/template_trophy")); + withExistingParent(TFBlocks.KNIGHT_PHANTOM_TROPHY.getId().toString(), prefix("item/template_trophy")); + //ur-ghast and alpha yeti need special transforms + withExistingParent(TFBlocks.SNOW_QUEEN_TROPHY.getId().toString(), prefix("item/template_trophy")); + withExistingParent(TFBlocks.QUEST_RAM_TROPHY.getId().toString(), prefix("item/template_trophy")); + + withExistingParent(TFBlocks.CREEPER_SKULL_CANDLE.getId().toString(), prefix("item/template_skull_candle")); + withExistingParent(TFBlocks.PLAYER_SKULL_CANDLE.getId().toString(), prefix("item/template_skull_candle")); + withExistingParent(TFBlocks.SKELETON_SKULL_CANDLE.getId().toString(), prefix("item/template_skull_candle")); + withExistingParent(TFBlocks.WITHER_SKELE_SKULL_CANDLE.getId().toString(), prefix("item/template_skull_candle")); + withExistingParent(TFBlocks.ZOMBIE_SKULL_CANDLE.getId().toString(), prefix("item/template_skull_candle")); + + hollowLog(TFBlocks.HOLLOW_OAK_LOG_HORIZONTAL); + hollowLog(TFBlocks.HOLLOW_SPRUCE_LOG_HORIZONTAL); + hollowLog(TFBlocks.HOLLOW_BIRCH_LOG_HORIZONTAL); + hollowLog(TFBlocks.HOLLOW_JUNGLE_LOG_HORIZONTAL); + hollowLog(TFBlocks.HOLLOW_ACACIA_LOG_HORIZONTAL); + hollowLog(TFBlocks.HOLLOW_DARK_OAK_LOG_HORIZONTAL); + hollowLog(TFBlocks.HOLLOW_CRIMSON_STEM_HORIZONTAL); + hollowLog(TFBlocks.HOLLOW_WARPED_STEM_HORIZONTAL); + hollowLog(TFBlocks.HOLLOW_VANGROVE_LOG_HORIZONTAL); + hollowLog(TFBlocks.HOLLOW_TWILIGHT_OAK_LOG_HORIZONTAL); + hollowLog(TFBlocks.HOLLOW_CANOPY_LOG_HORIZONTAL); + hollowLog(TFBlocks.HOLLOW_MANGROVE_LOG_HORIZONTAL); + hollowLog(TFBlocks.HOLLOW_DARK_LOG_HORIZONTAL); + hollowLog(TFBlocks.HOLLOW_TIME_LOG_HORIZONTAL); + hollowLog(TFBlocks.HOLLOW_TRANSFORMATION_LOG_HORIZONTAL); + hollowLog(TFBlocks.HOLLOW_MINING_LOG_HORIZONTAL); + hollowLog(TFBlocks.HOLLOW_SORTING_LOG_HORIZONTAL); + + singleTex(TFItems.NAGA_SCALE); + singleTex(TFItems.NAGA_CHESTPLATE); + singleTex(TFItems.NAGA_LEGGINGS); + singleTexTool(TFItems.TWILIGHT_SCEPTER); + singleTexTool(TFItems.LIFEDRAIN_SCEPTER); + singleTexTool(TFItems.ZOMBIE_SCEPTER); + singleTexTool(TFItems.FORTIFICATION_SCEPTER); + singleTex(TFItems.ORE_METER); + singleTex(TFItems.FILLED_MAGIC_MAP); + singleTex(TFItems.FILLED_MAZE_MAP); + singleTex(TFItems.FILLED_ORE_MAP); + singleTex(TFItems.RAVEN_FEATHER); + singleTex(TFItems.MAGIC_MAP_FOCUS); + singleTex(TFItems.MAZE_MAP_FOCUS); + singleTex(TFItems.LIVEROOT); + singleTex(TFItems.RAW_IRONWOOD); + singleTex(TFItems.IRONWOOD_INGOT); + singleTex(TFItems.IRONWOOD_HELMET); + singleTex(TFItems.IRONWOOD_CHESTPLATE); + singleTex(TFItems.IRONWOOD_LEGGINGS); + singleTex(TFItems.IRONWOOD_BOOTS); + singleTexTool(TFItems.IRONWOOD_SWORD); + singleTexTool(TFItems.IRONWOOD_PICKAXE); + singleTexTool(TFItems.IRONWOOD_AXE); + singleTexTool(TFItems.IRONWOOD_SHOVEL); + singleTexTool(TFItems.IRONWOOD_HOE); + singleTexFullbright(TFItems.TORCHBERRIES); + singleTex(TFItems.RAW_VENISON); + singleTex(TFItems.COOKED_VENISON); + singleTex(TFItems.HYDRA_CHOP); + singleTex(TFItems.FIERY_BLOOD); + singleTex(TFItems.FIERY_TEARS); + singleTexFullbright(TFItems.FIERY_INGOT); + singleTexFullbright(TFItems.FIERY_HELMET); + singleTexFullbright(TFItems.FIERY_CHESTPLATE); + singleTexFullbright(TFItems.FIERY_LEGGINGS); + singleTexFullbright(TFItems.FIERY_BOOTS); + singleTexFullbrightTool(TFItems.FIERY_SWORD); + singleTexFullbrightTool(TFItems.FIERY_PICKAXE); + singleTex(TFItems.STEELEAF_INGOT); + singleTex(TFItems.STEELEAF_HELMET); + singleTex(TFItems.STEELEAF_CHESTPLATE); + singleTex(TFItems.STEELEAF_LEGGINGS); + singleTex(TFItems.STEELEAF_BOOTS); + singleTexTool(TFItems.STEELEAF_SWORD); + singleTexTool(TFItems.STEELEAF_PICKAXE); + singleTexTool(TFItems.STEELEAF_AXE); + singleTexTool(TFItems.STEELEAF_SHOVEL); + singleTexTool(TFItems.STEELEAF_HOE); + singleTexTool(TFItems.DIAMOND_MINOTAUR_AXE); + singleTexTool(TFItems.GOLDEN_MINOTAUR_AXE); + singleTexTool(TFItems.MAZEBREAKER_PICKAXE); + singleTex(TFItems.TRANSFORMATION_POWDER); + singleTex(TFItems.RAW_MEEF); + singleTex(TFItems.COOKED_MEEF); + singleTex(TFItems.MEEF_STROGANOFF); + singleTex(TFItems.MAZE_WAFER); + singleTex(TFItems.MAGIC_MAP); + singleTex(TFItems.MAZE_MAP); + singleTex(TFItems.ORE_MAP); + ModelFile magnetPull1 = generated("ore_magnet_pulling_1", prefix("item/ore_magnet_pulling_1")); + ModelFile magnetPull2 = generated("ore_magnet_pulling_2", prefix("item/ore_magnet_pulling_2")); + singleTex(TFItems.ORE_MAGNET) + .override().predicate(new ResourceLocation("pulling"), 1).predicate(new ResourceLocation("pull"), (float) 0.5).model(magnetPull1).end() + .override().predicate(new ResourceLocation("pulling"), 1).predicate(new ResourceLocation("pull"), 1).model(magnetPull2).end(); + singleTexTool(TFItems.CRUMBLE_HORN); + singleTexTool(TFItems.PEACOCK_FEATHER_FAN); + ModelFile queenAlt = fullbrightTool("moonworm_queen_alt", prefix("item/moonworm_queen_alt")); + singleTexFullbrightTool(TFItems.MOONWORM_QUEEN).override().predicate(prefix("alt"), 1).model(queenAlt).end(); + singleTex(TFItems.CHARM_OF_KEEPING_1); + singleTex(TFItems.CHARM_OF_KEEPING_2); + singleTex(TFItems.CHARM_OF_KEEPING_3); + singleTex(TFItems.CHARM_OF_LIFE_1); + singleTex(TFItems.CHARM_OF_LIFE_2); + singleTexFullbright(TFItems.TOWER_KEY); + generated(TFItems.BORER_ESSENCE.getId().getPath(), prefix("item/" + TFItems.BORER_ESSENCE.getId().getPath()), prefix("item/borer_essence_particles")); + buildItem(TFItems.CARMINITE.getId().getPath(), "item/generated", 7, prefix("item/" + TFItems.CARMINITE.getId().getPath())); + singleTex(TFItems.ARMOR_SHARD); + singleTex(TFItems.ARMOR_SHARD_CLUSTER); + singleTex(TFItems.KNIGHTMETAL_INGOT); + singleTex(TFItems.KNIGHTMETAL_HELMET); + singleTex(TFItems.KNIGHTMETAL_CHESTPLATE); + singleTex(TFItems.KNIGHTMETAL_LEGGINGS); + singleTex(TFItems.KNIGHTMETAL_BOOTS); + singleTexTool(TFItems.KNIGHTMETAL_SWORD); + singleTexTool(TFItems.KNIGHTMETAL_PICKAXE); + singleTexTool(TFItems.KNIGHTMETAL_AXE); + singleTex(TFItems.KNIGHTMETAL_RING); + singleTex(TFItems.PHANTOM_HELMET); + singleTex(TFItems.PHANTOM_CHESTPLATE); + singleTex(TFItems.LAMP_OF_CINDERS); + singleTex(TFItems.ALPHA_YETI_FUR); + singleTex(TFItems.YETI_HELMET); + singleTex(TFItems.YETI_CHESTPLATE); + singleTex(TFItems.YETI_LEGGINGS); + singleTex(TFItems.YETI_BOOTS); + singleTex(TFItems.ICE_BOMB); + singleTex(TFItems.ARCTIC_FUR); + arcticArmorTex(TFItems.ARCTIC_HELMET); + arcticArmorTex(TFItems.ARCTIC_CHESTPLATE); + arcticArmorTex(TFItems.ARCTIC_LEGGINGS); + arcticArmorTex(TFItems.ARCTIC_BOOTS); + singleTex(TFItems.MAGIC_BEANS); + ModelFile triplePulling0 = bowItem("triple_bow_pulling_0", prefix("item/triple_bow_pulling_0")); + ModelFile triplePulling1 = bowItem("triple_bow_pulling_1", prefix("item/triple_bow_pulling_1")); + ModelFile triplePulling2 = bowItem("triple_bow_pulling_2", prefix("item/triple_bow_pulling_2")); + bowTex(TFItems.TRIPLE_BOW, triplePulling0, triplePulling1, triplePulling2); + ModelFile seekerPulling0 = bowItem("seeker_bow_pulling_0", prefix("item/seeker_bow_pulling_0")); + ModelFile seekerPulling1 = bowItem("seeker_bow_pulling_1", prefix("item/seeker_bow_pulling_1")); + ModelFile seekerPulling2 = bowItem("seeker_bow_pulling_2", prefix("item/seeker_bow_pulling_2")); + bowTex(TFItems.SEEKER_BOW, seekerPulling0, seekerPulling1, seekerPulling2); + ModelFile icePulling0 = bowItem("ice_bow_pulling_0", prefix("item/ice_bow_solid_pulling_0"), prefix("item/ice_bow_clear_pulling_0")); + ModelFile icePulling1 = bowItem("ice_bow_pulling_1", prefix("item/ice_bow_solid_pulling_1"), prefix("item/ice_bow_clear_pulling_1")); + ModelFile icePulling2 = bowItem("ice_bow_pulling_2", prefix("item/ice_bow_solid_pulling_2"), prefix("item/ice_bow_clear_pulling_2")); + iceBowTex(icePulling0, icePulling1, icePulling2); + ModelFile enderPulling0 = bowItem("ender_bow_pulling_0", prefix("item/ender_bow_pulling_0")); + ModelFile enderPulling1 = bowItem("ender_bow_pulling_1", prefix("item/ender_bow_pulling_1")); + ModelFile enderPulling2 = bowItem("ender_bow_pulling_2", prefix("item/ender_bow_pulling_2")); + bowTex(TFItems.ENDER_BOW, enderPulling0, enderPulling1, enderPulling2); + tool(TFItems.ICE_SWORD.getId().getPath(), prefix("item/ice_sword_solid"), prefix("item/ice_sword_clear")); + tool(TFItems.GLASS_SWORD.getId().getPath(), prefix("item/glass_sword_solid"), prefix("item/glass_sword_clear")); + ModelFile chainThrown = tool("block_and_chain_thrown", prefix("item/block_and_chain_thrown")); + singleTexTool(TFItems.BLOCK_AND_CHAIN).override().predicate(prefix("thrown"), 1).model(chainThrown).end(); + ModelFile cubeThrown = tool("cube_of_annihilation_thrown", prefix("item/cube_of_annihilation_thrown")); + singleTexTool(TFItems.CUBE_OF_ANNIHILATION).override().predicate(prefix("thrown"), 1).model(cubeThrown).end(); + singleTex(TFItems.CUBE_TALISMAN); + //moon dial is a big boi + ModelFile full = phaseTex("moon_dial_full", prefix("item/moon_dial/full")); + ModelFile waning_gib = phaseTex("moon_dial_waning_gib", prefix("item/moon_dial/waning_gibbous")); + ModelFile quarter3 = phaseTex("moon_dial_quarter3", prefix("item/moon_dial/third_quarter")); + ModelFile waning_cres = phaseTex("moon_dial_waning_cres", prefix("item/moon_dial/waning_cresent")); + ModelFile unlit = phaseTex("moon_dial_new", prefix("item/moon_dial/new")); //cant use new for the name lmao + ModelFile waxing_cres = phaseTex("moon_dial_waxing_cres", prefix("item/moon_dial/waxing_cresent")); + ModelFile quarter1 = phaseTex("moon_dial_quarter1", prefix("item/moon_dial/first_quarter")); + ModelFile waxing_gib = phaseTex("moon_dial_waxing_gib", prefix("item/moon_dial/waxing_gibbous")); + phaseTex(TFItems.MOON_DIAL.getId().getPath(), prefix("item/moon_dial/full")) + .override().predicate(new ResourceLocation("phase"), 0).model(full).end() + .override().predicate(new ResourceLocation("phase"), 0.125F).model(waning_gib).end() + .override().predicate(new ResourceLocation("phase"), 0.25F).model(quarter3).end() + .override().predicate(new ResourceLocation("phase"), 0.375F).model(waning_cres).end() + .override().predicate(new ResourceLocation("phase"), 0.5F).model(unlit).end() + .override().predicate(new ResourceLocation("phase"), 0.625F).model(waxing_cres).end() + .override().predicate(new ResourceLocation("phase"), 0.75F).model(quarter1).end() + .override().predicate(new ResourceLocation("phase"), 0.875F).model(waxing_gib).end(); + + ModelFile fill1 = generated("brittle_flask_0", prefix("item/brittle_potion_flask_1"), prefix("item/brittle_potion_flask_labelled")); + ModelFile fill2 = generated("brittle_flask_1", prefix("item/brittle_potion_flask_2"), prefix("item/brittle_potion_flask_labelled")); + ModelFile fill3 = generated("brittle_flask_2", prefix("item/brittle_potion_flask_3"), prefix("item/brittle_potion_flask_labelled")); + ModelFile fill4 = generated("brittle_flask_3", prefix("item/brittle_potion_flask_4"), prefix("item/brittle_potion_flask_labelled")); + ModelFile splintered = generated("brittle_flask_splintered", prefix("item/brittle_potion_flask_splintered")); + ModelFile fill1_splintered = generated("brittle_flask_0_splintered", prefix("item/brittle_potion_flask_1"), prefix("item/brittle_potion_flask_splintered")); + ModelFile fill2_splintered = generated("brittle_flask_1_splintered", prefix("item/brittle_potion_flask_2"), prefix("item/brittle_potion_flask_splintered")); + ModelFile fill3_splintered = generated("brittle_flask_2_splintered", prefix("item/brittle_potion_flask_3"), prefix("item/brittle_potion_flask_splintered")); + ModelFile fill4_splintered = generated("brittle_flask_3_splintered", prefix("item/brittle_potion_flask_4"), prefix("item/brittle_potion_flask_splintered")); + ModelFile cracked = generated("brittle_flask_cracked", prefix("item/brittle_potion_flask_cracked")); + ModelFile fill1_cracked = generated("brittle_flask_0_cracked", prefix("item/brittle_potion_flask_1"), prefix("item/brittle_potion_flask_cracked")); + ModelFile fill2_cracked = generated("brittle_flask_1_cracked", prefix("item/brittle_potion_flask_2"), prefix("item/brittle_potion_flask_cracked")); + ModelFile fill3_cracked = generated("brittle_flask_2_cracked", prefix("item/brittle_potion_flask_3"), prefix("item/brittle_potion_flask_cracked")); + ModelFile fill4_cracked = generated("brittle_flask_3_cracked", prefix("item/brittle_potion_flask_4"), prefix("item/brittle_potion_flask_cracked")); + ModelFile damaged = generated("brittle_flask_damaged", prefix("item/brittle_potion_flask_damaged")); + ModelFile fill1_damaged = generated("brittle_flask_0_damaged", prefix("item/brittle_potion_flask_1"), prefix("item/brittle_potion_flask_damaged")); + ModelFile fill2_damaged = generated("brittle_flask_1_damaged", prefix("item/brittle_potion_flask_2"), prefix("item/brittle_potion_flask_damaged")); + ModelFile fill3_damaged = generated("brittle_flask_2_damaged", prefix("item/brittle_potion_flask_3"), prefix("item/brittle_potion_flask_damaged")); + ModelFile fill4_damaged = generated("brittle_flask_3_damaged", prefix("item/brittle_potion_flask_4"), prefix("item/brittle_potion_flask_damaged")); + + generated(TFItems.BRITTLE_FLASK.getId().getPath(), prefix("block/stone_twist/twist_blank"), prefix("item/brittle_potion_flask")) + .override().predicate(prefix("potion_level"), 1).model(fill1).end() + .override().predicate(prefix("potion_level"), 2).model(fill2).end() + .override().predicate(prefix("potion_level"), 3).model(fill3).end() + .override().predicate(prefix("potion_level"), 4).model(fill4).end() + .override().predicate(prefix("potion_level"), 0).predicate(prefix("breakage"), 1).model(splintered).end() + .override().predicate(prefix("potion_level"), 1).predicate(prefix("breakage"), 1).model(fill1_splintered).end() + .override().predicate(prefix("potion_level"), 2).predicate(prefix("breakage"), 1).model(fill2_splintered).end() + .override().predicate(prefix("potion_level"), 3).predicate(prefix("breakage"), 1).model(fill3_splintered).end() + .override().predicate(prefix("potion_level"), 4).predicate(prefix("breakage"), 1).model(fill4_splintered).end() + .override().predicate(prefix("potion_level"), 0).predicate(prefix("breakage"), 2).model(cracked).end() + .override().predicate(prefix("potion_level"), 1).predicate(prefix("breakage"), 2).model(fill1_cracked).end() + .override().predicate(prefix("potion_level"), 2).predicate(prefix("breakage"), 2).model(fill2_cracked).end() + .override().predicate(prefix("potion_level"), 3).predicate(prefix("breakage"), 2).model(fill3_cracked).end() + .override().predicate(prefix("potion_level"), 4).predicate(prefix("breakage"), 2).model(fill4_cracked).end() + .override().predicate(prefix("potion_level"), 0).predicate(prefix("breakage"), 3).model(damaged).end() + .override().predicate(prefix("potion_level"), 1).predicate(prefix("breakage"), 3).model(fill1_damaged).end() + .override().predicate(prefix("potion_level"), 2).predicate(prefix("breakage"), 3).model(fill2_damaged).end() + .override().predicate(prefix("potion_level"), 3).predicate(prefix("breakage"), 3).model(fill3_damaged).end() + .override().predicate(prefix("potion_level"), 4).predicate(prefix("breakage"), 3).model(fill4_damaged).end(); + + ModelFile gfill1 = generated("greater_flask_0", prefix("item/greater_potion_flask_1"), prefix("item/greater_potion_flask")); + ModelFile gfill2 = generated("greater_flask_1", prefix("item/greater_potion_flask_2"), prefix("item/greater_potion_flask")); + ModelFile gfill3 = generated("greater_flask_2", prefix("item/greater_potion_flask_3"), prefix("item/greater_potion_flask")); + ModelFile gfill4 = generated("greater_flask_3", prefix("item/greater_potion_flask_4"), prefix("item/greater_potion_flask")); + + generated(TFItems.GREATER_FLASK.getId().getPath(), prefix("block/stone_twist/twist_blank"), prefix("item/greater_potion_flask")) + .override().predicate(prefix("potion_level"), 1).model(gfill1).end() + .override().predicate(prefix("potion_level"), 2).model(gfill2).end() + .override().predicate(prefix("potion_level"), 3).model(gfill3).end() + .override().predicate(prefix("potion_level"), 4).model(gfill4).end(); + + singleTex(TFItems.MUSIC_DISC_FINDINGS); + singleTex(TFItems.MUSIC_DISC_HOME); + singleTex(TFItems.MUSIC_DISC_MAKER); + singleTex(TFItems.MUSIC_DISC_MOTION); + singleTex(TFItems.MUSIC_DISC_RADIANCE); + singleTex(TFItems.MUSIC_DISC_STEPS); + singleTex(TFItems.MUSIC_DISC_SUPERSTITIOUS); + singleTex(TFItems.MUSIC_DISC_THREAD); + singleTex(TFItems.MUSIC_DISC_WAYFARER); + + singleTex(TFItems.TWILIGHT_OAK_BOAT); + singleTex(TFItems.CANOPY_BOAT); + singleTex(TFItems.MANGROVE_BOAT); + singleTex(TFItems.DARKWOOD_BOAT); + singleTex(TFItems.TIME_BOAT); + singleTex(TFItems.TRANSFORMATION_BOAT); + singleTex(TFItems.MINING_BOAT); + singleTex(TFItems.SORTING_BOAT); + + singleTex(TFItems.TWILIGHT_OAK_CHEST_BOAT); + singleTex(TFItems.CANOPY_CHEST_BOAT); + singleTex(TFItems.MANGROVE_CHEST_BOAT); + singleTex(TFItems.DARKWOOD_CHEST_BOAT); + singleTex(TFItems.TIME_CHEST_BOAT); + singleTex(TFItems.TRANSFORMATION_CHEST_BOAT); + singleTex(TFItems.MINING_CHEST_BOAT); + singleTex(TFItems.SORTING_CHEST_BOAT); + + generated(TFItems.NAGA_BANNER_PATTERN.getId().getPath(), prefix("item/tf_banner_pattern")); + generated(TFItems.LICH_BANNER_PATTERN.getId().getPath(), prefix("item/tf_banner_pattern")); + generated(TFItems.MINOSHROOM_BANNER_PATTERN.getId().getPath(), prefix("item/tf_banner_pattern")); + generated(TFItems.HYDRA_BANNER_PATTERN.getId().getPath(), prefix("item/tf_banner_pattern")); + generated(TFItems.KNIGHT_PHANTOM_BANNER_PATTERN.getId().getPath(), prefix("item/tf_banner_pattern")); + generated(TFItems.UR_GHAST_BANNER_PATTERN.getId().getPath(), prefix("item/tf_banner_pattern")); + generated(TFItems.ALPHA_YETI_BANNER_PATTERN.getId().getPath(), prefix("item/tf_banner_pattern")); + generated(TFItems.SNOW_QUEEN_BANNER_PATTERN.getId().getPath(), prefix("item/tf_banner_pattern")); + generated(TFItems.QUEST_RAM_BANNER_PATTERN.getId().getPath(), prefix("item/tf_banner_pattern")); + + //these models are used as references in other things, they dont have actual items + generated("trophy", prefix("item/trophy")); + generated("trophy_minor", prefix("item/trophy_minor")); + generated("trophy_quest", prefix("item/trophy_quest")); + generated("shield", prefix("item/lich_shield_frame"), prefix("item/lich_shield_fill")); + } + + private void fullbright(String name, ResourceLocation... layers) { + buildItem(name, "item/generated", 15, layers); + } + + private ItemModelBuilder fullbrightTool(String name, ResourceLocation... layers) { + return buildItem(name, "item/handheld", 15, layers); + } + + private ItemModelBuilder generated(String name, ResourceLocation... layers) { + return buildItem(name, "item/generated", 0, layers); + } + + private ItemModelBuilder tool(String name, ResourceLocation... layers) { + return buildItem(name, "item/handheld", 0, layers); + } + + private ItemModelBuilder buildItem(String name, String parent, int emissivity, ResourceLocation... layers) { + ItemModelBuilder builder = withExistingParent(name, parent); + for (int i = 0; i < layers.length; i++) { + builder = builder.texture("layer" + i, layers[i]); + } + if (emissivity > 0) builder = builder.customLoader(ItemLayerModelBuilder::begin).emissive(emissivity, emissivity, 0).renderType("forge_entity_unsorted_translucent", 0).end(); + return builder; + } + + private ItemModelBuilder forcefield(String name, ResourceLocation... layers) { + ItemModelBuilder builder = withExistingParent(name, "item/generated"); + for (int i = 0; i < layers.length; i++) { + builder = builder.texture("layer" + i, layers[i]); + } + builder = builder.customLoader(ItemLayerModelBuilder::begin).emissive(15, 15, 0).renderType(new ResourceLocation("translucent"), 0).end(); + return builder; + } + + private void singleTexFullbright(RegistryObject item) { + fullbright(item.getId().getPath(), prefix("item/" + item.getId().getPath())); + } + + private ItemModelBuilder singleTexFullbrightTool(RegistryObject item) { + return fullbrightTool(item.getId().getPath(), prefix("item/" + item.getId().getPath())); + } + + private ItemModelBuilder singleTexTool(RegistryObject item) { + return tool(item.getId().getPath(), prefix("item/" + item.getId().getPath())); + } + + private ItemModelBuilder singleTex(RegistryObject item) { + return generated(item.getId().getPath(), prefix("item/" + item.getId().getPath())); + } + + private void arcticArmorTex(RegistryObject item) { + generated(item.getId().getPath(), prefix("item/" + item.getId().getPath()), prefix("item/" + item.getId().getPath() + "_0")); + } + + private ItemModelBuilder bowItem(String name, ResourceLocation... layers) { + ItemModelBuilder builder = withExistingParent(name, "item/bow"); + for (int i = 0; i < layers.length; i++) { + builder = builder.texture("layer" + i, layers[i]); + } + return builder; + } + + private void bowTex(RegistryObject item, ModelFile pull0, ModelFile pull1, ModelFile pull2) { + bowItem(item.getId().getPath(), prefix("item/" + item.getId().getPath())) + .override().predicate(new ResourceLocation("pulling"), 1).model(pull0).end() + .override().predicate(new ResourceLocation("pulling"), 1).predicate(new ResourceLocation("pull"), (float) 0.65).model(pull1).end() + .override().predicate(new ResourceLocation("pulling"), 1).predicate(new ResourceLocation("pull"), (float) 0.9).model(pull2).end(); + } + + private void iceBowTex(ModelFile pull0, ModelFile pull1, ModelFile pull2) { + bowItem(TFItems.ICE_BOW.getId().getPath(), prefix("item/ice_bow_solid"), prefix("item/ice_bow_clear")) + .override().predicate(new ResourceLocation("pulling"), 1).model(pull0).end() + .override().predicate(new ResourceLocation("pulling"), 1).predicate(new ResourceLocation("pull"), (float) 0.65).model(pull1).end() + .override().predicate(new ResourceLocation("pulling"), 1).predicate(new ResourceLocation("pull"), (float) 0.9).model(pull2).end(); + } + + private ItemModelBuilder phaseTex(String name, ResourceLocation... layers) { + ItemModelBuilder builder = withExistingParent(name, "twilightforest:item/moon_dial_template"); + for (int i = 0; i < layers.length; i++) { + builder = builder.texture("layer" + i, layers[i]); + } + return builder; + } + + private void woodenButton(Block button, String variant) { + getBuilder(ForgeRegistries.BLOCKS.getKey(button).getPath()) + .parent(getExistingFile(mcLoc("block/button_inventory"))) + .texture("texture", "block/wood/planks_" + variant + "_0"); + } + + private void woodenFence(Block fence, String variant) { + getBuilder(ForgeRegistries.BLOCKS.getKey(fence).getPath()) + .parent(getExistingFile(mcLoc("block/fence_inventory"))) + .texture("texture", "block/wood/planks_" + variant + "_0"); + } + + private void hollowLog(RegistryObject hollowLog) { + getBuilder(ForgeRegistries.ITEMS.getKey(hollowLog.get().asItem()).getPath()).parent(new ModelFile.ExistingModelFile(TwilightForestMod.prefix("block/" + hollowLog.getId().getPath()), this.existingFileHelper)); + } + + private void toBlock(Block b) { + toBlockModel(b, ForgeRegistries.BLOCKS.getKey(b).getPath()); + } + + private void woodBlock(Block b, String variant) { + woodBlockModel(b, ForgeRegistries.BLOCKS.getKey(b).getPath(), variant); + } + + private void toBlockModel(Block b, String model) { + toBlockModel(b, prefix("block/" + model)); + } + + private void woodBlockModel(Block b, String model, String variant) { + toBlockModel(b, prefix("block/wood/" + variant + "/" + model)); + } + + private void toBlockModel(Block b, ResourceLocation model) { + withExistingParent(ForgeRegistries.BLOCKS.getKey(b).getPath(), model); + } + + @Override + public String getName() { + return "TwilightForest Item and BlockItem models"; + } +} diff --git a/src/main/java/twilightforest/data/LangGenerator.java b/src/main/java/twilightforest/data/LangGenerator.java new file mode 100644 index 0000000000..812aa51081 --- /dev/null +++ b/src/main/java/twilightforest/data/LangGenerator.java @@ -0,0 +1,1094 @@ +package twilightforest.data; + +import net.minecraft.data.PackOutput; +import twilightforest.TFConfig; +import twilightforest.data.helpers.TFLangProvider; +import twilightforest.init.*; + +public class LangGenerator extends TFLangProvider { + public LangGenerator(PackOutput output) { + super(output); + } + + @Override + protected void addTranslations() { + + this.add("itemGroup.twilightforest.blocks", "Twilight Forest: Blocks"); + this.add("itemGroup.twilightforest.items", "Twilight Forest: Items"); + this.add("itemGroup.twilightforest.equipment", "Twilight Forest: Equipment"); + + this.addBiome(TFBiomes.FOREST, "Twilight Forest"); + this.addBiome(TFBiomes.DENSE_FOREST, "Dense Forest"); + this.addBiome(TFBiomes.FIREFLY_FOREST, "Firefly Forest"); + this.addBiome(TFBiomes.CLEARING, "Twilight Clearing"); + this.addBiome(TFBiomes.OAK_SAVANNAH, "Oak Savanna"); + this.addBiome(TFBiomes.STREAM, "Twilight Stream"); + this.addBiome(TFBiomes.LAKE, "Twilight Lake"); + this.addBiome(TFBiomes.MUSHROOM_FOREST, "Mushroom Forest"); + this.addBiome(TFBiomes.DENSE_MUSHROOM_FOREST, "Dense Mushroom Forest"); + this.addBiome(TFBiomes.ENCHANTED_FOREST, "Enchanted Forest"); + this.addBiome(TFBiomes.SPOOKY_FOREST, "Spooky Forest"); + this.addBiome(TFBiomes.SWAMP, "Twilight Swamp"); + this.addBiome(TFBiomes.FIRE_SWAMP, "Fire Swamp"); + this.addBiome(TFBiomes.DARK_FOREST, "Dark Forest"); + this.addBiome(TFBiomes.DARK_FOREST_CENTER, "Dark Forest Center"); + this.addBiome(TFBiomes.SNOWY_FOREST, "Snowy Forest"); + this.addBiome(TFBiomes.GLACIER, "Twilight Glacier"); + this.addBiome(TFBiomes.HIGHLANDS, "Twilight Highlands"); + this.addBiome(TFBiomes.THORNLANDS, "Thornlands"); + this.addBiome(TFBiomes.FINAL_PLATEAU, "Final Plateau"); + this.addBiome(TFBiomes.UNDERGROUND, "Underground"); + + this.add("dimension.twilightforest.twilightforest", "Twilight Forest"); + + this.addStructure(TFStructures.HEDGE_MAZE, "Hedge Maze"); + this.addStructure(TFStructures.HOLLOW_HILL_SMALL, "Small Hollow Hill"); + this.addStructure(TFStructures.HOLLOW_HILL_MEDIUM, "Medium Hollow Hill"); + this.addStructure(TFStructures.HOLLOW_HILL_LARGE, "Large Hollow Hill"); + this.addStructure(TFStructures.QUEST_GROVE, "Quest Grove"); + this.addStructure(TFStructures.MUSHROOM_TOWER, "Mushroom Castle"); + this.addStructure(TFStructures.NAGA_COURTYARD, "Naga Courtyard"); + this.addStructure(TFStructures.LICH_TOWER, "Lich Tower"); + this.addStructure(TFStructures.LABYRINTH, "Minotaur Labyrinth"); + this.addStructure(TFStructures.HYDRA_LAIR, "Hydra's Lair"); + this.addStructure(TFStructures.KNIGHT_STRONGHOLD, "Knight Stronghold"); + this.addStructure(TFStructures.DARK_TOWER, "Dark Tower"); + this.addStructure(TFStructures.YETI_CAVE, "Yeti Cave"); + this.addStructure(TFStructures.AURORA_PALACE, "Aurora Palace"); + this.addStructure(TFStructures.TROLL_CAVE, "Troll Cave"); + this.addStructure(TFStructures.FINAL_CASTLE, "Final Plateau Castle"); + + this.addCommand("usage", "/%s "); + this.addCommand("not_in_twilight_forest", "You are not in the Twilight Forest dimension"); + this.addCommand("not_player", "This command must be run by a valid player!"); + this.addCommand("none_nearby", "Couldn't find a feature nearby!"); + this.addCommand("nearest", "The nearest feature is: %s"); + this.addCommand("center", "Center of feature: %s"); + this.addCommand("chunk", "Located in feature chunk: %s"); + this.addCommand("structure.inside", "You are in a Landmark structure"); + this.addCommand("structure.outside", "You are not in a Landmark structure"); + this.addCommand("structure.required", "You are not in a structure"); + this.addCommand("structure.conquer.status", "Structure conquer flag: %s"); + this.addCommand("structure.conquer.update", "Structure conquer flag was %s, changing to %s"); + this.addCommand("structure.spawn_list", "Spawn list for this area is:"); + this.addCommand("structure.spawn_info", "%s, Weight %s"); + + this.add("gamerule.tfEnforcedProgression", "Twilight Forest: Enforced Progression"); + this.add("gamerule.tfEnforcedProgression.description", "Some Twilight Forest biomes will be locked until you defeat certain bosses in the dimension. (You can check the progression order in your advancements)"); + + this.add("effect.twilightforest.frosted", "Frosted"); + + this.addEnchantment("chill_aura", "Chill Aura", "Adds a chance for the attacker to gain the frosted effect after hitting the wearer."); + this.addEnchantment("fire_react", "Fire React", "Adds a chance for the attacker to be set on fire after hitting the wearer."); + this.addEnchantment("destruction", "Destruction", "Allows the Block and Chain to break blocks with a higher mining tier."); + + this.addAdvancement("root", "Twilight Forest", "Enter the mysterious, magical woodlands: the Twilight Forest"); + this.addAdvancement("kill_cicada", "Shut", "Kill a Cicada"); + this.addAdvancement("hedge", "Bug Stomper", "Defeat a spider in a Hedge Maze"); + this.addAdvancement("hill1", "The Boots Are Mine!", "Defeat a %s in a Small Hollow Hill"); + this.addAdvancement("hill2", "What Was That Noise?", "Defeat a %s in a Medium Hollow Hill"); + this.addAdvancement("hill3", "I See Right Through You", "Defeat a %s in a Large Hollow Hill"); + this.addAdvancement("quest_ram", "Consummate Baaahs", "Give the %s what it is missing"); + this.addAdvancement("magic_map_focus", "With Fire It Writes", "Craft the %s with a %s, %s, and %s"); + this.addAdvancement("magic_map", "I Can See Forever", "Craft the %s"); + this.addAdvancement("maze_map", "And Now, to Find the Exit", "Craft the %s after obtaining the focus from the labyrinth"); + this.addAdvancement("ore_map", "How Can That Be Worth It?", "Craft the %s"); + this.addAdvancement("twilight_hunter", "The Silence of the Forest", "Hunt some of the local wildlife"); + this.addAdvancement("kill_naga", "Time To Even The Scales", "Slay the %s in its forest courtyard and obtain a %s to overcome the barrier magic surrounding the Lich's tower"); + this.addAdvancement("naga_armors", "Naga Armorer", "Craft both %s chest and leg armor"); + this.addAdvancement("kill_lich", "Bring Out Your Dead", "Slay the %s at top of his tower and retrieve a scepter to clear poisonous mosquitoes from the Swamp, see through blinding darkness of the Dark Forest's curse, and resist the Snowy Forest's chill"); + this.addAdvancement("lich_scepters", "By Our Powers Combined!", "Acquire all four scepters of power"); + this.addAdvancement("full_mettle_alchemist", "Full Mettle Alchemist", "Drink four doses of Harming II from a potion flask in under 8 seconds and survive"); + this.addAdvancement("progress_labyrinth", "Mighty Stroganoff", "Eat the Meef Stroganoff to acclimatize your body to the dangerous heat of the Fire Swamp"); + this.addAdvancement("mazebreaker", "Breaking the Maze", "Find the %s pickaxe in the secret labyrinth vault"); + this.addAdvancement("kill_hydra", "Hydra Slayer", "Defeat the mighty %s and empower yourself"); + this.addAdvancement("hydra_chop", "Hydra Chop, Baby!", "Chow down on a %s when your hunger bar is depleted"); + this.addAdvancement("progress_trophy_pedestal", "Trophied Champion", "Claim your title by placing a trophy on the pedestal in the Dark Forest ruins"); + this.addAdvancement("progress_knights", "Carminite Acclimation", "Settle the restless phantoms in the knight's tomb and the carminite tower's devices will obey you"); + this.addAdvancement("ghast_trap", "Something Strange in Towerwood", "Slay the %ss around a %s and activate to wrench the %s from the sky!"); + this.addAdvancement("progress_ur_ghast", "Tears of Fire", "Touch the fiery red tears of the %s"); + this.addAdvancement("experiment_115", "Mystery Meat?", "It looks like cake, though..."); + this.addAdvancement("experiment_115_2", "Making a note: Huge Success!", "It's so delicious and moist!"); + this.addAdvancement("experiment_115_3", "Eating 115 Everyday, 115 Years, Forever", "eating experiment one-hundred-fifteen all day, forever, one-hundred-fifteen times experiment one-hundred-fifteen, experiment one-hundred-fifteen dot com, double-u double-u double-u dot experiment one-hundred-fifteen dot com, one-hundred-fifteen years, every minute experiment one-hundred-fifteen dot com, double-u double-u double-u dot one-hundred-fifteen times experiment one-hundred-fifteen dot com"); + this.addAdvancement("progress_yeti", "Alpha Fur", "Line your garments with the soft fur from the %s, keeping you safe from the Glacier's cold"); + this.addAdvancement("arctic_dyed", "Getting in Fashion", "Dye four unique pieces of Arctic armor"); + this.addAdvancement("progress_glacier", "Clear Skies", "Defeat the %s atop the Aurora Palace"); + this.addAdvancement("glass_sword", "One Hit Wonder", "Hope you made good use of that."); + this.addAdvancement("fiery_set", "Gallons of Blood and Tears", "Wield a fiery tool or weapon while having at least one piece of fiery armor in your inventory"); + this.addAdvancement("progress_merge", "Ultimate Showdown", "Slay the %s, %s, and %s to clear the acid rain and embolden yourself for the Highlands"); + this.addAdvancement("troll", "We Do a Little Trolling", "Find and kill a %s"); + this.addAdvancement("beanstalk", "Jack and the Beanstalk", "Obtain some %s in the troll caves and use them on the glowing soil beneath the clouds"); + this.addAdvancement("giants", "I'm on Cloud Nine", "Kill a %s in the clouds, retrieve a %s, and return back to the troll caves"); + this.addAdvancement("progress_troll", "I Wish For More Burning", "Find the %s in the troll caves, and you can burn away the thorn barriers"); + this.addAdvancement("progression_end", "End of Progression", "Anything past this point in the Highlands is a work in progress. It will be finished in the future"); + //this.addAdvancement("progress_thorns", "Past the Thorns [NYI]", "Make it past the Thornlands, and unlock the door of the castle"); + //this.addAdvancement("progress_castle", "So Castle Very Wow [NYI]", "What could even be in that castle?!?"); + this.addAdvancement("twilight_dining", "We Dine At Eternal Sundown", "Eat every edible item exclusive to Twilight Forest"); + this.addAdvancement("arborist", "Maniacal Dendrologist", "Get your axes and shears ready. Search every nook and cranny and get anything and everything that comes from trees! Craft, loot, obtain every slab... sapling... leaves... more... everything. ALL OF IT!"); + + this.addMessage("advancement_hidden", ""); + this.addMessage("advancement_required", "Advancement Required:"); + this.addMessage("biome_locked", "Biome Locked!"); + this.addMessage("biome_locked_2", "Check your advancements"); + this.addMessage("core_disabled", "%s is disabled via config"); + this.addMessage("firefly_spawner_radius", "Firefly Particle Radius: %s Blocks"); + this.addMessage("magic_map_fail", "The Magic faltered. Perhaps it doesn't work here?"); + this.addMessage("nyi", "This feature has effects that are not yet implemented."); + this.addMessage("ore_meter_exposed", "Exposed: %s"); + this.addMessage("ore_meter_range", "Radius: %s, Origin: [%s, %s]"); + this.addMessage("pedestal_ineligible", "You are unworthy."); + this.addMessage("portal_unsafe", "It doesn't seem safe here..."); + this.addMessage("portal_unworthy", "The Portal pool is unresponsive. Perhaps something was neglected?"); + this.addMessage("wip0", "This feature is a work in progress and may have bugs or unintended effects that may damage your world."); + this.addMessage("wip1", "Use with caution."); + + this.addBlock(TFBlocks.CICADA, "Cicada"); + this.addBlock(TFBlocks.CICADA_JAR, "Cicada Jar"); + this.addBlock(TFBlocks.FIREFLY, "Firefly"); + this.addBlock(TFBlocks.FIREFLY_JAR, "Firefly Jar"); + this.addBlock(TFBlocks.MOONWORM, "Moonworm"); + this.addBlock(TFBlocks.FIREFLY_SPAWNER, "Firefly Particle Spawner"); + + this.addBlock(TFBlocks.TWILIGHT_PORTAL, "Twilight Forest Portal"); + this.addBlock(TFBlocks.TWILIGHT_PORTAL_MINIATURE_STRUCTURE, "Miniature Twilight Forest Portal"); + + this.addBlock(TFBlocks.NAGASTONE, "Nagastone"); + this.addBlock(TFBlocks.NAGASTONE_HEAD, "Nagastone Head"); + this.addStoneVariants("etched_nagastone", "Etched Nagastone"); + this.addStoneVariants("nagastone_pillar", "Nagastone Pillar"); + this.addBlock(TFBlocks.NAGASTONE_STAIRS_LEFT, "Nagastone Stairs (Left)"); + this.addBlock(TFBlocks.NAGASTONE_STAIRS_RIGHT, "Nagastone Stairs (Right)"); + this.addBlock(TFBlocks.CRACKED_NAGASTONE_STAIRS_LEFT, "Cracked Nagastone Stairs (Left)"); + this.addBlock(TFBlocks.CRACKED_NAGASTONE_STAIRS_RIGHT, "Cracked Nagastone Stairs (Right)"); + this.addBlock(TFBlocks.MOSSY_NAGASTONE_STAIRS_LEFT, "Mossy Nagastone Stairs (Left)"); + this.addBlock(TFBlocks.MOSSY_NAGASTONE_STAIRS_RIGHT, "Mossy Nagastone Stairs (Right)"); + this.addBlock(TFBlocks.SPIRAL_BRICKS, "Spiral Bricks"); + this.addBlock(TFBlocks.NAGA_COURTYARD_MINIATURE_STRUCTURE, "Miniature Naga Courtyard"); + + this.addBlock(TFBlocks.TWISTED_STONE, "Twisted Stone"); + this.addBlock(TFBlocks.TWISTED_STONE_PILLAR, "Twisted Stone Pillar"); + this.addBlock(TFBlocks.BOLD_STONE_PILLAR, "Bold Stone Pillar"); + this.addBlock(TFBlocks.CANDELABRA, "Candelabra"); + this.addBlock(TFBlocks.KEEPSAKE_CASKET, "Keepsake Casket"); + this.add("block.twilightforest.casket.broken", "Your Keepsake Casket was too damaged to hold any more items. All items that would be stored in your casket were dropped on the ground."); + this.add("block.twilightforest.casket.locked", "This Casket can only be opened by %s!"); + this.addBlock(TFBlocks.LICH_TOWER_MINIATURE_STRUCTURE, "Miniature Lich Tower"); + + this.addBlock(TFBlocks.HUGE_LILY_PAD, "Huge Lily Pad"); + this.addBlock(TFBlocks.HUGE_WATER_LILY, "Huge Water Lily"); + this.addBlock(TFBlocks.MAZESTONE, "Mazestone"); + this.addBlock(TFBlocks.MAZESTONE_BRICK, "Mazestone Brick"); + this.addBlock(TFBlocks.CRACKED_MAZESTONE, "Cracked Mazestone Brick"); + this.addBlock(TFBlocks.MOSSY_MAZESTONE, "Mossy Mazestone Brick"); + this.addBlock(TFBlocks.CUT_MAZESTONE, "Cut Mazestone"); + this.addBlock(TFBlocks.DECORATIVE_MAZESTONE, "Decorative Mazestone Brick"); + this.addBlock(TFBlocks.MAZESTONE_MOSAIC, "Mazestone Mosaic"); + this.addBlock(TFBlocks.MAZESTONE_BORDER, "Mazestone Border"); + this.addBlock(TFBlocks.RED_THREAD, "Red Thread"); + + this.addBlock(TFBlocks.SMOKER, "Smoker"); + this.addBlock(TFBlocks.FIRE_JET, "Fire Jet"); + this.addBlock(TFBlocks.ENCASED_SMOKER, "Encased Smoker"); + this.addBlock(TFBlocks.ENCASED_FIRE_JET, "Encased Fire Jet"); + + this.addBlock(TFBlocks.TROPHY_PEDESTAL, "Trophy Pedestal"); + this.addBlock(TFBlocks.STRONGHOLD_SHIELD, "Stronghold Shield"); + this.addBlock(TFBlocks.UNDERBRICK, "Underbrick"); + this.addBlock(TFBlocks.CRACKED_UNDERBRICK, "Cracked Underbrick"); + this.addBlock(TFBlocks.MOSSY_UNDERBRICK, "Mossy Underbrick"); + this.addBlock(TFBlocks.UNDERBRICK_FLOOR, "Underbrick Floor"); + + this.addBlock(TFBlocks.TOWERWOOD, "Towerwood Planks"); + this.addBlock(TFBlocks.CRACKED_TOWERWOOD, "Cracked Towerwood Planks"); + this.addBlock(TFBlocks.MOSSY_TOWERWOOD, "Mossy Towerwood Planks"); + this.addBlock(TFBlocks.INFESTED_TOWERWOOD, "Infested Towerwood Planks"); + this.addBlock(TFBlocks.ENCASED_TOWERWOOD, "Encased Towerwood Planks"); + this.addBlock(TFBlocks.VANISHING_BLOCK, "Vanishing Block"); + this.addBlock(TFBlocks.REAPPEARING_BLOCK, "Reappearing Block"); + this.addBlock(TFBlocks.LOCKED_VANISHING_BLOCK, "Locked Vanishing Block"); + this.addBlock(TFBlocks.CARMINITE_BUILDER, "Carminite Builder"); + this.addBlock(TFBlocks.BUILT_BLOCK, "Built Block"); + this.addBlock(TFBlocks.ANTIBUILDER, "Antibuilder"); + this.addBlock(TFBlocks.ANTIBUILT_BLOCK, "Antibuilt Block"); + this.addBlock(TFBlocks.GHAST_TRAP, "Ghast Trap"); + this.addBlock(TFBlocks.CARMINITE_REACTOR, "Carminite Reactor"); + this.addBlock(TFBlocks.REACTOR_DEBRIS, "Reactor Debris"); + this.addBlock(TFBlocks.FAKE_DIAMOND, "Diamond Block"); + this.addBlock(TFBlocks.FAKE_GOLD, "Gold Block"); + this.addBlock(TFBlocks.EXPERIMENT_115, "Experiment 115"); + + this.addBlock(TFBlocks.AURORA_BLOCK, "Aurora Block"); + this.addBlock(TFBlocks.AURORA_SLAB, "Aurora Slab"); + this.addBlock(TFBlocks.AURORA_PILLAR, "Aurora Pillar"); + this.addBlock(TFBlocks.AURORALIZED_GLASS, "Auroralized Glass"); + + this.addBlock(TFBlocks.HUGE_MUSHGLOOM, "Huge Mushgloom Block"); + this.addBlock(TFBlocks.HUGE_MUSHGLOOM_STEM, "Huge Mushgloom Stem"); + this.addBlock(TFBlocks.HUGE_STALK, "Huge Stalk"); + this.addBlock(TFBlocks.BEANSTALK_LEAVES, "Beanstalk Leaves"); + this.addBlock(TFBlocks.UBEROUS_SOIL, "Uberous Soil"); + this.addBlock(TFBlocks.TROLLVIDR, "Trollvidr"); + this.addBlock(TFBlocks.UNRIPE_TROLLBER, "Unripe Trollber"); + this.addBlock(TFBlocks.TROLLBER, "Trollber"); + this.addBlock(TFBlocks.TROLLSTEINN, "Trollsteinn"); + this.addBlock(TFBlocks.FLUFFY_CLOUD, "Fluffy Cloud"); + this.addBlock(TFBlocks.WISPY_CLOUD, "Wispy Cloud"); + this.addBlock(TFBlocks.GIANT_LEAVES, "Giant Leaves"); + this.addBlock(TFBlocks.GIANT_LOG, "Giant Log"); + this.addBlock(TFBlocks.GIANT_COBBLESTONE, "Giant Cobblestone"); + this.addBlock(TFBlocks.GIANT_OBSIDIAN, "Giant Obsidian"); + + this.addBlock(TFBlocks.BROWN_THORNS, "Thorns"); + this.addBlock(TFBlocks.GREEN_THORNS, "Green Thorns"); + this.addBlock(TFBlocks.BURNT_THORNS, "Burnt Thorns"); + this.addBlock(TFBlocks.THORN_ROSE, "Thorn Rose"); + this.addBlock(TFBlocks.THORN_LEAVES, "Thorn Leaves"); + this.addBlock(TFBlocks.DEADROCK, "Deadrock"); + this.addBlock(TFBlocks.CRACKED_DEADROCK, "Cracked Deadrock"); + this.addBlock(TFBlocks.WEATHERED_DEADROCK, "Weathered Deadrock"); + + this.addStoneVariants("castle_brick", "Castle Brick"); + this.addStoneVariants("castle_brick_stairs", "Castle Brick Stairs"); + this.add(TFBlocks.WORN_CASTLE_BRICK.get(), "Worn Castle Brick"); + this.add(TFBlocks.THICK_CASTLE_BRICK.get(), "Thick Castle Brick"); + this.add(TFBlocks.CASTLE_ROOF_TILE.get(), "Castle Roof Tile"); + this.add(TFBlocks.ENCASED_CASTLE_BRICK_PILLAR.get(), "Encased Castle Brick Pillar"); + this.add(TFBlocks.ENCASED_CASTLE_BRICK_TILE.get(), "Encased Castle Brick Tile"); + this.add(TFBlocks.BOLD_CASTLE_BRICK_PILLAR.get(), "Bold Castle Brick Pillar"); + this.add(TFBlocks.BOLD_CASTLE_BRICK_TILE.get(), "Bold Castle Brick Tile"); + this.add(TFBlocks.WORN_CASTLE_BRICK_STAIRS.get(), "Worn Castle Brick Stairs"); + this.add(TFBlocks.ENCASED_CASTLE_BRICK_STAIRS.get(), "Encased Castle Brick Stairs"); + this.add(TFBlocks.BOLD_CASTLE_BRICK_STAIRS.get(), "Bold Castle Brick Stairs"); + + this.add(TFBlocks.PINK_CASTLE_RUNE_BRICK.get(), "Magenta Castle Rune Brick"); + this.add(TFBlocks.YELLOW_CASTLE_RUNE_BRICK.get(), "Yellow Castle Rune Brick"); + this.add(TFBlocks.BLUE_CASTLE_RUNE_BRICK.get(), "Blue Castle Rune Brick"); + this.add(TFBlocks.VIOLET_CASTLE_RUNE_BRICK.get(), "Violet Castle Rune Brick"); + + this.add(TFBlocks.PINK_CASTLE_DOOR.get(), "Magenta Castle Door"); + this.add(TFBlocks.YELLOW_CASTLE_DOOR.get(), "Yellow Castle Door"); + this.add(TFBlocks.BLUE_CASTLE_DOOR.get(), "Blue Castle Door"); + this.add(TFBlocks.VIOLET_CASTLE_DOOR.get(), "Violet Castle Door"); + + this.add(TFBlocks.PINK_FORCE_FIELD.get(), "Magenta Force Field"); + this.add(TFBlocks.ORANGE_FORCE_FIELD.get(), "Orange Force Field"); + this.add(TFBlocks.GREEN_FORCE_FIELD.get(), "Green Force Field"); + this.add(TFBlocks.BLUE_FORCE_FIELD.get(), "Blue Force Field"); + this.add(TFBlocks.VIOLET_FORCE_FIELD.get(), "Violet Force Field"); + + this.addBlock(TFBlocks.IRONWOOD_BLOCK, "Block of Ironwood"); + this.addBlock(TFBlocks.STEELEAF_BLOCK, "Block of Steeleaf"); + this.addBlock(TFBlocks.KNIGHTMETAL_BLOCK, "Block of Knightmetal"); + this.add("block.twilightforest.knightmetal_block.desc", "Works as a stronger cactus"); + this.addBlock(TFBlocks.ARCTIC_FUR_BLOCK, "Block of Arctic Fur"); + this.add("block.twilightforest.arctic_fur_block.desc", "Reduces fall damage by 90%"); + this.addBlock(TFBlocks.FIERY_BLOCK, "Block of Fiery Metal"); + this.addBlock(TFBlocks.CARMINITE_BLOCK, "Block of Carminite"); + + this.addBlock(TFBlocks.CINDER_FURNACE, "Cinder Furnace"); + this.addBlock(TFBlocks.CINDER_LOG, "Cinder Log"); + this.addBlock(TFBlocks.CINDER_WOOD, "Cinder Wood"); + + this.addBlock(TFBlocks.IRON_LADDER, "Iron Ladder"); + this.addBlock(TFBlocks.SLIDER, "Slide Trap"); + + this.addBlock(TFBlocks.TWILIGHT_OAK_LEAVES, "Twilight Oak Leaves"); + this.addSapling("twilight_oak", "Sickly Twilight Oak Sapling"); + this.createLogs("twilight_oak", "Twilight Oak"); + this.createWoodSet("twilight_oak", "Twilight Oak"); + + this.addBlock(TFBlocks.CANOPY_LEAVES, "Canopy Tree Leaves"); + this.addSapling("canopy", "Canopy Tree Sapling"); + this.createLogs("canopy", "Canopy Tree"); + this.createWoodSet("canopy", "Canopy"); + this.addBlock(TFBlocks.CANOPY_BOOKSHELF, "Canopy Bookshelf"); + this.addBlock(TFBlocks.EMPTY_CANOPY_BOOKSHELF, "Empty Canopy Bookshelf"); + this.addBlock(TFBlocks.DEATH_TOME_SPAWNER, "Death Tome Spawner"); + + this.addBlock(TFBlocks.MANGROVE_LEAVES, "Mangrove Leaves"); + this.addSapling("mangrove", "Mangrove Sapling"); + this.createLogs("mangrove", "Mangrove"); + this.createWoodSet("mangrove", "Mangrove"); + + this.addBlock(TFBlocks.DARK_LEAVES, "Darkwood Leaves"); + this.addBlock(TFBlocks.HARDENED_DARK_LEAVES, "Thick Darkwood Leaves"); + this.addSapling("darkwood", "Darkwood Sapling"); + this.createLogs("dark", "Darkwood"); + this.createWoodSet("dark", "Darkwood"); + + this.addBlock(TFBlocks.TIME_LOG_CORE, "Timewood Clock"); + this.addBlock(TFBlocks.TIME_LEAVES, "Timewood Leaves"); + this.addSapling("time", "Tree of Time Sapling"); + this.createLogs("time", "Timewood"); + this.createWoodSet("time", "Timewood"); + + this.addBlock(TFBlocks.TRANSFORMATION_LOG_CORE, "Heart of Transformation"); + this.addBlock(TFBlocks.TRANSFORMATION_LEAVES, "Leaves of Transformation"); + this.addSapling("transformation", "Tree of Transformation Sapling"); + this.createLogs("transformation", "Transwood"); + this.createWoodSet("transformation", "Transwood"); + + this.addBlock(TFBlocks.MINING_LOG_CORE, "Minewood Core"); + this.addBlock(TFBlocks.MINING_LEAVES, "Miner's Leaves"); + this.addSapling("mining", "Miner's Tree Sapling"); + this.createLogs("mining", "Minewood"); + this.createWoodSet("mining", "Minewood"); + + this.addBlock(TFBlocks.SORTING_LOG_CORE, "Sortingwood Engine"); + this.addBlock(TFBlocks.SORTING_LEAVES, "Sorting Leaves"); + this.addSapling("sorting", "Sorting Tree Sapling"); + this.createLogs("sorting", "Sortingwood"); + this.createWoodSet("sorting", "Sortingwood"); + + this.addBlock(TFBlocks.RAINBOW_OAK_LEAVES, "Rainbow Oak Leaves"); + this.addSapling("rainbow_oak", "Rainbow Oak Sapling"); + this.addSapling("hollow_oak", "Robust Twilight Oak Sapling"); + + this.addBlock(TFBlocks.OAK_BANISTER, "Oak Banister"); + this.addBlock(TFBlocks.SPRUCE_BANISTER, "Spruce Banister"); + this.addBlock(TFBlocks.BIRCH_BANISTER, "Birch Banister"); + this.addBlock(TFBlocks.JUNGLE_BANISTER, "Jungle Banister"); + this.addBlock(TFBlocks.ACACIA_BANISTER, "Acacia Banister"); + this.addBlock(TFBlocks.DARK_OAK_BANISTER, "Dark Oak Banister"); + this.addBlock(TFBlocks.CRIMSON_BANISTER, "Crimson Banister"); + this.addBlock(TFBlocks.WARPED_BANISTER, "Warped Banister"); + this.addBlock(TFBlocks.VANGROVE_BANISTER, "Mangrove Banister"); + + this.createHollowLogs("oak", "Oak", false); + this.createHollowLogs("spruce", "Spruce", false); + this.createHollowLogs("birch", "Birch", false); + this.createHollowLogs("jungle", "Jungle", false); + this.createHollowLogs("acacia", "Acacia", false); + this.createHollowLogs("dark_oak", "Dark Oak", false); + this.createHollowLogs("crimson", "Crimson", true); + this.createHollowLogs("warped", "Warped", true); + this.createHollowLogs("vangrove", "Mangrove", false); + this.add("block.twilightforest.banister.cycle", "Right click with an axe to cycle"); + + this.addBlock(TFBlocks.MOSS_PATCH, "Moss Patch"); + this.addBlock(TFBlocks.CLOVER_PATCH, "Clover Patch"); + this.addBlock(TFBlocks.TORCHBERRY_PLANT, "Torchberry Plant"); + this.addBlock(TFBlocks.ROOT_STRAND, "Root Strands"); + this.addBlock(TFBlocks.FALLEN_LEAVES, "Fallen Leaves"); + this.addBlock(TFBlocks.MAYAPPLE, "Mayapple"); + this.addBlock(TFBlocks.POTTED_MAYAPPLE, "Potted Mayapple"); + this.addBlock(TFBlocks.FIDDLEHEAD, "Mayapple"); + this.addBlock(TFBlocks.POTTED_FIDDLEHEAD, "Potted Mayapple"); + this.addBlock(TFBlocks.MUSHGLOOM, "Mushgloom"); + this.addBlock(TFBlocks.POTTED_MUSHGLOOM, "Potted Mushgloom"); + this.addBlock(TFBlocks.POTTED_THORN, "Potted Thorn"); + this.addBlock(TFBlocks.POTTED_GREEN_THORN, "Potted Green Thorn"); + this.addBlock(TFBlocks.POTTED_DEAD_THORN, "Potted Burnt Thorn"); + + this.addBlock(TFBlocks.HEDGE, "Hedge"); + this.addBlock(TFBlocks.ROOT_BLOCK, "Roots"); + this.addBlock(TFBlocks.LIVEROOT_BLOCK, "Liveroots"); + this.addBlock(TFBlocks.MANGROVE_ROOT, "Mangrove Roots"); + + this.addBlock(TFBlocks.NAGA_TROPHY, "Naga Trophy"); + this.addBlock(TFBlocks.LICH_TROPHY, "Lich Trophy"); + this.addBlock(TFBlocks.MINOSHROOM_TROPHY, "Minoshroom Trophy"); + this.addBlock(TFBlocks.HYDRA_TROPHY, "Hydra Trophy"); + this.addBlock(TFBlocks.KNIGHT_PHANTOM_TROPHY, "Knight Phantom Trophy"); + this.addBlock(TFBlocks.UR_GHAST_TROPHY, "Ur-Ghast Trophy"); + this.addBlock(TFBlocks.ALPHA_YETI_TROPHY, "Alpha Yeti Trophy"); + this.addBlock(TFBlocks.SNOW_QUEEN_TROPHY, "Snow Queen Trophy"); + this.addBlock(TFBlocks.QUEST_RAM_TROPHY, "Quest Ram Trophy"); + + this.addBlock(TFBlocks.NAGA_BOSS_SPAWNER, "Naga Boss Spawner"); + this.addBlock(TFBlocks.LICH_BOSS_SPAWNER, "Lich Boss Spawner"); + this.addBlock(TFBlocks.MINOSHROOM_BOSS_SPAWNER, "Minoshroom Boss Spawner"); + this.addBlock(TFBlocks.HYDRA_BOSS_SPAWNER, "Hydra Boss Spawner"); + this.addBlock(TFBlocks.KNIGHT_PHANTOM_BOSS_SPAWNER, "Knight Phantom Boss Spawner"); + this.addBlock(TFBlocks.UR_GHAST_BOSS_SPAWNER, "Ur-Ghast Boss Spawner"); + this.addBlock(TFBlocks.ALPHA_YETI_BOSS_SPAWNER, "Alpha Yeti Boss Spawner"); + this.addBlock(TFBlocks.SNOW_QUEEN_BOSS_SPAWNER, "Snow Queen Boss Spawner"); + this.addBlock(TFBlocks.FINAL_BOSS_BOSS_SPAWNER, "Final Boss Boss Spawner"); + + this.addBannerPattern("naga", "Naga Scales"); + this.addBannerPattern("lich", "Lich Crown"); + this.addBannerPattern("minoshroom", "Minoshroom Axes"); + this.addBannerPattern("hydra", "Hydra Flame"); + this.addBannerPattern("knight_phantom", "Knight Helmet"); + this.addBannerPattern("ur_ghast", "Carminite Border"); + this.addBannerPattern("alpha_yeti", "Alpha Yeti Face"); + this.addBannerPattern("snow_queen", "Snow Queen Crown"); + this.addBannerPattern("quest_ram", "Quest Ram Swirls"); + + this.addBlock(TFBlocks.ZOMBIE_SKULL_CANDLE, "Zombie Skull Candle"); + this.addBlock(TFBlocks.ZOMBIE_WALL_SKULL_CANDLE, "Zombie Wall Skull Candle"); + this.addBlock(TFBlocks.SKELETON_SKULL_CANDLE, "Skeleton Skull Candle"); + this.addBlock(TFBlocks.SKELETON_WALL_SKULL_CANDLE, "Skeleton Wall Skull Candle"); + this.addBlock(TFBlocks.WITHER_SKELE_SKULL_CANDLE, "Wither Skeleton Skull Candle"); + this.addBlock(TFBlocks.WITHER_SKELE_WALL_SKULL_CANDLE, "Wither Skeleton Wall Skull Candle"); + this.addBlock(TFBlocks.CREEPER_SKULL_CANDLE, "Creeper Skull Candle"); + this.addBlock(TFBlocks.CREEPER_WALL_SKULL_CANDLE, "Creeper Wall Skull Candle"); + this.addBlock(TFBlocks.PLAYER_SKULL_CANDLE, "Player Skull Candle"); + this.add("block.twilightforest.player_skull_candle.named", "%s's Head with Candles"); + this.addBlock(TFBlocks.PLAYER_WALL_SKULL_CANDLE, "Player Wall Skull Candle"); + + this.addBlock(TFBlocks.UNCRAFTING_TABLE, "Uncrafting Table"); + this.add("container.twilightforest.uncrafting_table", "Uncrafting Table"); + this.add("container.twilightforest.uncrafting_table.disabled", "Uncrafting is disabled via config"); + this.add("container.twilightforest.uncrafting_table.disabled_item", "Uncrafting this item is disabled."); + + this.addItem(TFItems.NAGA_SCALE, "Naga Scale"); + this.addItem(TFItems.NAGA_CHESTPLATE, "Naga Scale Tunic"); + this.addItem(TFItems.NAGA_LEGGINGS, "Naga Scale Leggings"); + this.addItem(TFItems.FORTIFICATION_SCEPTER, "Scepter of Fortification"); + this.addItem(TFItems.LIFEDRAIN_SCEPTER, "Scepter of Life Draining"); + this.addItem(TFItems.TWILIGHT_SCEPTER, "Scepter of Twilight"); + this.addItem(TFItems.ZOMBIE_SCEPTER, "Zombie Scepter"); + this.add("item.twilightforest.scepter.desc", "%s charges left"); + this.addItem(TFItems.BRITTLE_FLASK, "Brittle Potion Flask"); + this.addItem(TFItems.GREATER_FLASK, "Greater Potion Flask"); + this.add("item.twilightforest.flask.doses", "Doses: %s/%s"); + this.add("item.twilightforest.flask.no_refill", "Cannot be refilled"); + + this.addItem(TFItems.ORE_METER, "Ore Meter"); + this.addItem(TFItems.FILLED_MAGIC_MAP, "Magic Map"); + this.addItem(TFItems.FILLED_MAZE_MAP, "Maze Map"); + this.addItem(TFItems.FILLED_ORE_MAP, "Maze/Ore Map"); + this.addItem(TFItems.MAGIC_MAP, "Blank Magic Map"); + this.addItem(TFItems.MAZE_MAP, "Blank Maze Map"); + this.addItem(TFItems.ORE_MAP, "Blank Maze/Ore Map"); + this.addItem(TFItems.RAVEN_FEATHER, "Raven Feather"); + this.addItem(TFItems.MAGIC_MAP_FOCUS, "Magic Map Focus"); + this.addItem(TFItems.MAZE_MAP_FOCUS, "Maze Map Focus"); + + this.addItem(TFItems.LIVEROOT, "Liveroot"); + this.addItem(TFItems.RAW_IRONWOOD, "Raw Ironwood"); + this.addItem(TFItems.IRONWOOD_INGOT, "Ironwood Ingot"); + this.addArmor("ironwood", "Ironwood"); + this.addTools("ironwood", "Ironwood"); + + this.addItem(TFItems.STEELEAF_INGOT, "Steeleaf"); + this.addArmor("steeleaf", "Steeleaf"); + this.addTools("steeleaf", "Steeleaf"); + + this.addItem(TFItems.ARMOR_SHARD, "Armor Shard"); + this.addItem(TFItems.ARMOR_SHARD_CLUSTER, "Armor Shard Cluster"); + this.addItem(TFItems.KNIGHTMETAL_INGOT, "Knightmetal Ingot"); + this.addItem(TFItems.KNIGHTMETAL_HELMET, "Knightmetal Helmet"); + this.addItem(TFItems.KNIGHTMETAL_CHESTPLATE, "Knightmetal Chestplate"); + this.addItem(TFItems.KNIGHTMETAL_LEGGINGS, "Knightmetal Greaves"); + this.addItem(TFItems.KNIGHTMETAL_BOOTS, "Knightmetal Boots"); + this.addItem(TFItems.KNIGHTMETAL_SWORD, "Knightmetal Sword"); + this.add("item.twilightforest.knightmetal_sword.desc", "Extra damage to armored targets"); + this.addItem(TFItems.KNIGHTMETAL_PICKAXE, "Knightmetal Pickaxe"); + this.add("item.twilightforest.knightmetal_pickaxe.desc", "Extra damage to armored targets"); + this.addItem(TFItems.KNIGHTMETAL_AXE, "Knightmetal Axe"); + this.add("item.twilightforest.knightmetal_axe.desc", "Extra damage to unarmored targets"); + this.addItem(TFItems.KNIGHTMETAL_RING, "Knightmetal Loop"); + this.addItem(TFItems.KNIGHTMETAL_SHIELD, "Knightmetal Shield"); + this.addItem(TFItems.BLOCK_AND_CHAIN, "Block and Chain"); + this.addItem(TFItems.PHANTOM_HELMET, "Phantom Helmet"); + this.addItem(TFItems.PHANTOM_CHESTPLATE, "Phantom Chestplate"); + this.add("item.twilightforest.phantom_armor.desc", "Is never lost on death"); + + this.addItem(TFItems.FIERY_BLOOD, "Fiery Blood"); + this.addItem(TFItems.FIERY_TEARS, "Fiery Tears"); + this.addItem(TFItems.FIERY_INGOT, "Fiery Ingot"); + this.addArmor("fiery", "Fiery"); + this.add("item.twilightforest.fiery_armor.desc", "Burns attackers"); + this.addItem(TFItems.FIERY_SWORD, "Fiery Sword"); + this.add("item.twilightforest.fiery_sword.desc", "Burns targets"); + this.addItem(TFItems.FIERY_PICKAXE, "Fiery Pickaxe"); + this.add("item.twilightforest.fiery_pickaxe.desc", "Auto-smelting"); + + this.addItem(TFItems.ARCTIC_FUR, "Arctic Fur"); + this.addItem(TFItems.ARCTIC_HELMET, "Arctic Hood"); + this.addItem(TFItems.ARCTIC_CHESTPLATE, "Arctic Jacket"); + this.addItem(TFItems.ARCTIC_LEGGINGS, "Arctic Leggings"); + this.addItem(TFItems.ARCTIC_BOOTS, "Arctic Boots"); + this.add("item.twilightforest.arctic_armor.desc", "Dyeable"); + + this.addItem(TFItems.ALPHA_YETI_FUR, "Alpha Yeti Fur"); + this.addItem(TFItems.YETI_HELMET, "Yeti Horned Helm"); + this.addItem(TFItems.YETI_CHESTPLATE, "Yeti Jacket"); + this.addItem(TFItems.YETI_LEGGINGS, "Yeti Leggings"); + this.addItem(TFItems.YETI_BOOTS, "Yeti Boots"); + this.add("item.twilightforest.yeti_armor.desc", "Chills attackers"); + + + this.addItem(TFItems.DIAMOND_MINOTAUR_AXE, "Diamond Minotaur Axe"); + this.addItem(TFItems.GOLDEN_MINOTAUR_AXE, "Golden Minotaur Axe"); + this.add("item.twilightforest.minotaur_axe.desc", "Extra damage while charging"); + this.addItem(TFItems.MAZEBREAKER_PICKAXE, "Mazebreaker"); + this.addItem(TFItems.ICE_SWORD, "Ice Sword"); + this.addItem(TFItems.ICE_BOMB, "Ice Bomb"); + this.addItem(TFItems.GLASS_SWORD, "Glass Sword"); + this.add("item.twilightforest.glass_sword.desc", "Creative Mode only"); + this.addItem(TFItems.TRIPLE_BOW, "Tri-Bow"); + this.addItem(TFItems.SEEKER_BOW, "Seeker Bow"); + this.addItem(TFItems.ICE_BOW, "Ice Bow"); + this.addItem(TFItems.ENDER_BOW, "Ender Bow"); + this.addItem(TFItems.GIANT_SWORD, "Giant's Sword"); + this.addItem(TFItems.GIANT_PICKAXE, "Giant's Pickaxe"); + this.add("item.twilightforest.giant_pickaxe.desc", "Breaks giant blocks"); + this.addItem(TFItems.LAMP_OF_CINDERS, "Lamp of Cinders"); + this.addItem(TFItems.CUBE_OF_ANNIHILATION, "Cube of Annihilation"); + + this.addItem(TFItems.MOON_DIAL, "Moon Dial"); + this.add("item.twilightforest.moon_dial.phase_0", "Full Moon"); + this.add("item.twilightforest.moon_dial.phase_1", "Waning Gibbous"); + this.add("item.twilightforest.moon_dial.phase_2", "Third Quarter"); + this.add("item.twilightforest.moon_dial.phase_3", "Waning Crescent"); + this.add("item.twilightforest.moon_dial.phase_4", "New Moon"); + this.add("item.twilightforest.moon_dial.phase_5", "Waxing Crescent"); + this.add("item.twilightforest.moon_dial.phase_6", "First Quarter"); + this.add("item.twilightforest.moon_dial.phase_7", "Waxing Gibbous"); + this.add("item.twilightforest.moon_dial.phase_unknown", "Moon phase indeterminate"); + this.add("item.twilightforest.moon_dial.phase_unknown_fools", "404 moon not found"); + + this.addItem(TFItems.ORE_MAGNET, "Ore Magnet"); + this.addItem(TFItems.CRUMBLE_HORN, "Crumble Horn"); + this.addItem(TFItems.MOONWORM_QUEEN, "Moonworm Queen"); + this.addItem(TFItems.PEACOCK_FEATHER_FAN, "Peacock Feather Fan"); + this.addItem(TFItems.TRANSFORMATION_POWDER, "Transformation Powder"); + this.addItem(TFItems.TOWER_KEY, "Tower Key"); + this.addItem(TFItems.BORER_ESSENCE, "Borer Essence"); + this.addItem(TFItems.CARMINITE, "Carminite"); + this.addItem(TFItems.MAGIC_BEANS, "Magic Beans"); + this.addItem(TFItems.CUBE_TALISMAN, "Talisman of the Cube"); + this.add("item.twilightforest.skull_candle.desc", "Has: %s %s Candle"); + this.add("item.twilightforest.skull_candle.desc.multiple", "Has: %s %s Candles"); + + this.addItem(TFItems.TORCHBERRIES, "Torchberries"); + this.addItem(TFItems.RAW_VENISON, "Raw Venison"); + this.addItem(TFItems.COOKED_VENISON, "Venison Steak"); + this.addItem(TFItems.MAZE_WAFER, "Maze Wafer"); + this.addItem(TFItems.RAW_MEEF, "Raw Meef"); + this.addItem(TFItems.COOKED_MEEF, "Meef Steak"); + this.addItem(TFItems.MEEF_STROGANOFF, "Meef Stroganoff"); + this.addItem(TFItems.HYDRA_CHOP, "Hydra Chop"); + + this.addItem(TFItems.CHARM_OF_LIFE_1, "Charm of Life I"); + this.addItem(TFItems.CHARM_OF_LIFE_2, "Charm of Life II"); + this.addItem(TFItems.CHARM_OF_KEEPING_1, "Charm of Keeping I"); + this.addItem(TFItems.CHARM_OF_KEEPING_2, "Charm of Keeping II"); + this.addItem(TFItems.CHARM_OF_KEEPING_3, "Charm of Keeping III"); + + this.addMusicDisc(TFItems.MUSIC_DISC_RADIANCE, "Rotch Gwylt - Radiance"); + this.addMusicDisc(TFItems.MUSIC_DISC_STEPS, "Rotch Gwylt - Steps"); + this.addMusicDisc(TFItems.MUSIC_DISC_SUPERSTITIOUS, "Rotch Gwylt - Superstitious"); + this.addMusicDisc(TFItems.MUSIC_DISC_HOME, "MrCompost - Home"); + this.addMusicDisc(TFItems.MUSIC_DISC_WAYFARER, "MrCompost - Wayfarer"); + this.addMusicDisc(TFItems.MUSIC_DISC_FINDINGS, "MrCompost - Findings"); + this.addMusicDisc(TFItems.MUSIC_DISC_MAKER, "MrCompost - Maker"); + this.addMusicDisc(TFItems.MUSIC_DISC_THREAD, "MrCompost - Thread"); + this.addMusicDisc(TFItems.MUSIC_DISC_MOTION, "MrCompost - Motion"); + + this.add("item.twilightforest.lower_goblin_knight_spawn_egg", "Goblin Knight Spawn Egg"); + + this.addEntityAndEgg(TFEntities.ADHERENT, "Adherent"); + this.addEntityAndEgg(TFEntities.ALPHA_YETI, "Alpha Yeti"); + this.addEntityAndEgg(TFEntities.ARMORED_GIANT, "Armored Giant"); + this.addEntityAndEgg(TFEntities.BIGHORN_SHEEP, "Bighorn Sheep"); + this.addEntityAndEgg(TFEntities.BLOCKCHAIN_GOBLIN, "Block and Chain Goblin"); + this.addEntityAndEgg(TFEntities.BOAR, "Boar"); + this.addEntityAndEgg(TFEntities.CARMINITE_BROODLING, "Carminite Broodling"); + this.addEntityAndEgg(TFEntities.CARMINITE_GHASTGUARD, "Carminite Ghastguard"); + this.addEntityAndEgg(TFEntities.CARMINITE_GHASTLING, "Carminite Ghastling"); + this.addEntityAndEgg(TFEntities.CARMINITE_GOLEM, "Carminite Golem"); + this.addEntityAndEgg(TFEntities.DEATH_TOME, "Death Tome"); + this.addEntityAndEgg(TFEntities.DEER, "Deer"); + this.addEntityAndEgg(TFEntities.DWARF_RABBIT, "Dwarf Rabbit"); + this.addEntityAndEgg(TFEntities.FIRE_BEETLE, "Fire Beetle"); + this.addEntityAndEgg(TFEntities.GIANT_MINER, "Giant Miner"); + this.addEntityAndEgg(TFEntities.HARBINGER_CUBE, "Harbinger Cube"); + this.addEntityAndEgg(TFEntities.HEDGE_SPIDER, "Hedge Spider"); + this.addEntityAndEgg(TFEntities.HELMET_CRAB, "Helmet Crab"); + this.addEntityAndEgg(TFEntities.HOSTILE_WOLF, "Hostile Wolf"); + this.addEntityAndEgg(TFEntities.HYDRA, "Hydra"); + this.addEntityAndEgg(TFEntities.ICE_CRYSTAL, "Ice Crystal"); + this.addEntityAndEgg(TFEntities.KING_SPIDER, "King Spider"); + this.addEntityAndEgg(TFEntities.KNIGHT_PHANTOM, "Knight Phantom"); + this.addEntityAndEgg(TFEntities.KOBOLD, "Kobold"); + this.addEntityAndEgg(TFEntities.LICH, "Lich"); + this.addEntityAndEgg(TFEntities.MAZE_SLIME, "Maze Slime"); + this.addEntityAndEgg(TFEntities.MINOSHROOM, "Minoshroom"); + this.addEntityAndEgg(TFEntities.MINOTAUR, "Minotaur"); + this.addEntityAndEgg(TFEntities.MIST_WOLF, "Mist Wolf"); + this.addEntityAndEgg(TFEntities.MOSQUITO_SWARM, "Mosquito Swarm"); + this.addEntityAndEgg(TFEntities.NAGA, "Naga"); + this.addEntityAndEgg(TFEntities.PENGUIN, "Penguin"); + this.addEntityAndEgg(TFEntities.PINCH_BEETLE, "Pinch Beetle"); + this.addEntityAndEgg(TFEntities.QUEST_RAM, "Quest Ram"); + this.addEntityAndEgg(TFEntities.RAVEN, "Raven"); + this.addEntityAndEgg(TFEntities.REDCAP, "Redcap"); + this.addEntityAndEgg(TFEntities.REDCAP_SAPPER, "Redcap Sapper"); + this.addEntityAndEgg(TFEntities.SKELETON_DRUID, "Skeleton Druid"); + this.addEntityAndEgg(TFEntities.SLIME_BEETLE, "Slime Beetle"); + this.addEntityAndEgg(TFEntities.SNOW_GUARDIAN, "Snow Guardian"); + this.addEntityAndEgg(TFEntities.SNOW_QUEEN, "Snow Queen"); + this.addEntityAndEgg(TFEntities.SQUIRREL, "Squirrel"); + this.addEntityAndEgg(TFEntities.STABLE_ICE_CORE, "Stable Ice Core"); + this.addEntityAndEgg(TFEntities.SWARM_SPIDER, "Swarm Spider"); + this.addEntityAndEgg(TFEntities.TINY_BIRD, "Tiny Bird"); + this.addEntityAndEgg(TFEntities.TOWERWOOD_BORER, "Towerwood Borer"); + this.addEntityAndEgg(TFEntities.TROLL, "Troll"); + this.addEntityAndEgg(TFEntities.UNSTABLE_ICE_CORE, "Unstable Ice Core"); + this.addEntityAndEgg(TFEntities.UR_GHAST, "Ur-Ghast"); + this.addEntityAndEgg(TFEntities.WINTER_WOLF, "Winter Wolf"); + this.addEntityAndEgg(TFEntities.WRAITH, "Wraith"); + this.addEntityAndEgg(TFEntities.YETI, "Yeti"); + + this.addEntityType(TFEntities.LICH_MINION, "Lich Minion"); + this.addEntityType(TFEntities.LOYAL_ZOMBIE, "Loyal Zombie"); + this.addEntityType(TFEntities.LOWER_GOBLIN_KNIGHT, "Lower Goblin Knight"); + this.addEntityType(TFEntities.RISING_ZOMBIE, "Zombie"); + this.addEntityType(TFEntities.ROVING_CUBE, "Roving Cube"); + this.addEntityType(TFEntities.UPPER_GOBLIN_KNIGHT, "Upper Goblin Knight"); + + this.addEntityType(TFEntities.ICE_SNOWBALL, "Ice Snowball"); + this.addEntityType(TFEntities.ICE_ARROW, "Ice Arrow"); + this.addEntityType(TFEntities.SEEKER_ARROW, "Seeker Arrow"); + this.addEntityType(TFEntities.MOONWORM_SHOT, "Moonworm"); + this.addEntityType(TFEntities.NATURE_BOLT, "Nature Bolt"); + this.addEntityType(TFEntities.SLIME_BLOB, "Slime Blob"); + this.addEntityType(TFEntities.TOME_BOLT, "Death Tome Bolt"); + this.addEntityType(TFEntities.WAND_BOLT, "Twilight Scepter Bolt"); + this.addEntityType(TFEntities.LICH_BOLT, "Lich Bolt"); + this.addEntityType(TFEntities.LICH_BOMB, "Explosive Lich Bolt"); + this.addEntityType(TFEntities.HYDRA_MORTAR, "Hydra Mortar"); + this.addEntityType(TFEntities.FALLING_ICE, "Falling Ice"); + this.addEntityType(TFEntities.THROWN_WEP, "Thrown Weapon"); + this.addEntityType(TFEntities.CHARM_EFFECT, "Charm Effect"); + this.addEntityType(TFEntities.CHAIN_BLOCK, "Block and Chain"); + this.addEntityType(TFEntities.CUBE_OF_ANNIHILATION, "Cube of Annihilation"); + this.addEntityType(TFEntities.THROWN_BLOCK, "Thrown Block"); + this.addEntityType(TFEntities.SLIDER, "Moving Slide Trap"); + this.addEntityType(TFEntities.PROTECTION_BOX, "Progression Protection Box"); + this.addEntityType(TFEntities.BOAT, "Boat"); + this.addEntityType(TFEntities.CHEST_BOAT, "Boat with Chest"); + + this.addSubtitle(TFSounds.ACID_RAIN_BURNS, "Acid rain scalds"); + + this.addSubtitle(TFSounds.ALPHA_YETI_ALERT, "Alpha Yeti takes notice"); + this.addSubtitle(TFSounds.ALPHA_YETI_DEATH, "Alpha Yeti dies"); + this.addSubtitle(TFSounds.ALPHA_YETI_GRAB, "Alpha Yeti grabs"); + this.addSubtitle(TFSounds.ALPHA_YETI_GROWL, "Alpha Yeti growls"); + this.addSubtitle(TFSounds.ALPHA_YETI_HURT, "Alpha Yeti hurts"); + this.addSubtitle(TFSounds.ALPHA_YETI_ICE, "Alpha Yeti throws ice"); + this.addSubtitle(TFSounds.ALPHA_YETI_PANT, "Alpha Yeti pants"); + this.addSubtitle(TFSounds.ALPHA_YETI_ROAR, "Alpha Yeti roars"); + this.addSubtitle(TFSounds.ALPHA_YETI_THROW, "Alpha Yeti throws"); + + this.addSubtitle(TFSounds.BIGHORN_SHEEP_AMBIENT, "Bighorn Sheep bleats"); + this.addSubtitle(TFSounds.BIGHORN_SHEEP_DEATH, "Bighorn Sheep dies"); + this.addSubtitle(TFSounds.BIGHORN_SHEEP_HURT, "Bighorn Sheep hurts"); + + this.addSubtitle(TFSounds.BLOCKCHAIN_GOBLIN_AMBIENT, "Block and Chain Goblin chuckles"); + this.addSubtitle(TFSounds.BLOCKCHAIN_GOBLIN_DEATH, "Block and Chain Goblin dies"); + this.addSubtitle(TFSounds.BLOCKCHAIN_GOBLIN_HURT, "Block and Chain Goblin screams"); + + this.addSubtitle(TFSounds.BOAR_AMBIENT, "Boar oinks"); + this.addSubtitle(TFSounds.BOAR_DEATH, "Boar dies"); + this.addSubtitle(TFSounds.BOAR_HURT, "Boar hurts"); + + this.addSubtitle(TFSounds.CARMINITE_BROODLING_AMBIENT, "Carminite Broodling hisses"); + this.addSubtitle(TFSounds.CARMINITE_BROODLING_DEATH, "Carminite Broodling dies"); + this.addSubtitle(TFSounds.CARMINITE_BROODLING_HURT, "Carminite Broodling hurts"); + + this.addSubtitle(TFSounds.CARMINITE_GHASTGUARD_AMBIENT, "Carminite Ghastguard cries"); + this.addSubtitle(TFSounds.CARMINITE_GHASTGUARD_DEATH, "Carminite Ghastguard dies"); + this.addSubtitle(TFSounds.CARMINITE_GHASTGUARD_HURT, "Carminite Ghastguard screams"); + this.addSubtitle(TFSounds.CARMINITE_GHASTGUARD_SHOOT, "Carminite Ghastguard shoots"); + + this.addSubtitle(TFSounds.CARMINITE_GHASTLING_AMBIENT, "Carminite Ghastling cries"); + this.addSubtitle(TFSounds.CARMINITE_GHASTLING_DEATH, "Carminite Ghastling dies"); + this.addSubtitle(TFSounds.CARMINITE_GHASTLING_HURT, "Carminite Ghastling screams"); + this.addSubtitle(TFSounds.CARMINITE_GHASTLING_SHOOT, "Carminite Ghastling shoots"); + + this.addSubtitle(TFSounds.CARMINITE_GOLEM_ATTACK, "Carminite Golem swings"); + this.addSubtitle(TFSounds.CARMINITE_GOLEM_DEATH, "Carminite Golem dies"); + this.addSubtitle(TFSounds.CARMINITE_GOLEM_HURT, "Carminite Golem hurts"); + + this.addSubtitle(TFSounds.DEATH_TOME_AMBIENT, "Death Tome flips pages"); + this.addSubtitle(TFSounds.DEATH_TOME_DEATH, "Death Tome falls apart"); + this.addSubtitle(TFSounds.DEATH_TOME_HURT, "Death Tome creases"); + + this.addSubtitle(TFSounds.DEER_AMBIENT, "Deer moos"); + this.addSubtitle(TFSounds.DEER_DEATH, "Deer dies"); + this.addSubtitle(TFSounds.DEER_HURT, "Deer hurts"); + + this.addSubtitle(TFSounds.DWARF_RABBIT_AMBIENT, "Dwarf Rabbit squeaks"); + this.addSubtitle(TFSounds.DWARF_RABBIT_DEATH, "Dwarf Rabbit dies"); + this.addSubtitle(TFSounds.DWARF_RABBIT_HURT, "Dwarf Rabbit hurts"); + + this.addSubtitle(TFSounds.SKELETON_DRUID_AMBIENT, "Skeleton Druid rattles"); + this.addSubtitle(TFSounds.SKELETON_DRUID_DEATH, "Skeleton Druid dies"); + this.addSubtitle(TFSounds.SKELETON_DRUID_HURT, "Skeleton Druid hurts"); + this.addSubtitle(TFSounds.SKELETON_DRUID_SHOOT, "Skeleton Druid shoots"); + + this.addSubtitle(TFSounds.FIRE_BEETLE_DEATH, "Fire Beetle dies"); + this.addSubtitle(TFSounds.FIRE_BEETLE_HURT, "Fire Beetle hurts"); + this.addSubtitle(TFSounds.FIRE_BEETLE_SHOOT, "Fire Beetle spews flames"); + + this.addSubtitle(TFSounds.GOBLIN_KNIGHT_AMBIENT, "Goblin Knight chuckles"); + this.addSubtitle(TFSounds.GOBLIN_KNIGHT_DEATH, "Goblin Knight groans in agony"); + this.addSubtitle(TFSounds.GOBLIN_KNIGHT_HURT, "Goblin Knight screeches in pain"); + + this.addSubtitle(TFSounds.GOBLIN_KNIGHT_MUFFLED_AMBIENT, "Muffled Goblin Knight chuckles"); + this.addSubtitle(TFSounds.GOBLIN_KNIGHT_MUFFLED_DEATH, "Muffled Goblin Knight groans in agony"); + this.addSubtitle(TFSounds.GOBLIN_KNIGHT_MUFFLED_HURT, "Muffled Goblin Knight screeches in pain"); + + this.addSubtitle(TFSounds.HEDGE_SPIDER_AMBIENT, "Hedge Spider hisses"); + this.addSubtitle(TFSounds.HEDGE_SPIDER_DEATH, "Hedge Spider dies"); + this.addSubtitle(TFSounds.HEDGE_SPIDER_HURT, "Hedge Spider hurts"); + + this.addSubtitle(TFSounds.HELMET_CRAB_DEATH, "Helmet Crab dies"); + this.addSubtitle(TFSounds.HELMET_CRAB_HURT, "Helmet Crab hurts"); + + this.addSubtitle(TFSounds.HOSTILE_WOLF_AMBIENT, "Hostile Wolf growls"); + this.addSubtitle(TFSounds.HOSTILE_WOLF_DEATH, "Hostile Wolf dies"); + this.addSubtitle(TFSounds.HOSTILE_WOLF_HURT, "Hostile Wolf hurts"); + this.addSubtitle(TFSounds.HOSTILE_WOLF_TARGET, "Hostile Wolf takes notice"); + + this.addSubtitle(TFSounds.HYDRA_DEATH, "Hydra roars in defeat"); + this.addSubtitle(TFSounds.HYDRA_GROWL, "Hydra growls"); + this.addSubtitle(TFSounds.HYDRA_HURT, "Hydra hurts"); + this.addSubtitle(TFSounds.HYDRA_ROAR, "Hydra roars"); + this.addSubtitle(TFSounds.HYDRA_SHOOT, "Hydra shoots mortar"); + this.addSubtitle(TFSounds.HYDRA_SHOOT_FIRE, "Hydra shoots fire"); + this.addSubtitle(TFSounds.HYDRA_WARN, "Hydra prepares to bite"); + + this.addSubtitle(TFSounds.ICE_CORE_AMBIENT, "Ice Core crackles"); + this.addSubtitle(TFSounds.ICE_CORE_DEATH, "Ice Core dies"); + this.addSubtitle(TFSounds.ICE_CORE_HURT, "Ice Core hurts"); + this.addSubtitle(TFSounds.ICE_CORE_SHOOT, "Ice Core shoots snowball"); + + this.addSubtitle(TFSounds.KING_SPIDER_AMBIENT, "King Spider hisses"); + this.addSubtitle(TFSounds.KING_SPIDER_DEATH, "King Spider dies"); + this.addSubtitle(TFSounds.KING_SPIDER_HURT, "King Spider hurts"); + + this.addSubtitle(TFSounds.KNIGHT_PHANTOM_AMBIENT, "Knight Phantom gasps"); + this.addSubtitle(TFSounds.KNIGHT_PHANTOM_DEATH, "Knight Phantom dies"); + this.addSubtitle(TFSounds.KNIGHT_PHANTOM_HURT, "Knight Phantom hurts"); + this.addSubtitle(TFSounds.KNIGHT_PHANTOM_THROW_PICK, "Knight Phantom throws axe"); + this.addSubtitle(TFSounds.KNIGHT_PHANTOM_THROW_AXE, "Knight Phantom throws pickaxe"); + + this.addSubtitle(TFSounds.KOBOLD_AMBIENT, "Kobold grumbles"); + this.addSubtitle(TFSounds.KOBOLD_DEATH, "Kobold dies"); + this.addSubtitle(TFSounds.KOBOLD_HURT, "Kobold hurts"); + this.addSubtitle(TFSounds.KOBOLD_MUNCH, "Kobold munches on food"); + + this.addSubtitle(TFSounds.LICH_AMBIENT, "Lich breathes"); + this.addSubtitle(TFSounds.LICH_CLONE_HURT, "Lich shadow clone bypasses attack"); + this.addSubtitle(TFSounds.LICH_DEATH, "Lich dies"); + this.addSubtitle(TFSounds.LICH_HURT, "Lich hurts"); + this.addSubtitle(TFSounds.LICH_POP_MOB, "Lich absorbs mob"); + this.addSubtitle(TFSounds.LICH_SHOOT, "Lich shoots"); + this.addSubtitle(TFSounds.LICH_TELEPORT, "Lich teleports"); + + this.addSubtitle(TFSounds.LOYAL_ZOMBIE_AMBIENT, "Loyal Zombie groans"); + this.addSubtitle(TFSounds.LOYAL_ZOMBIE_DEATH, "Loyal Zombie dies"); + this.addSubtitle(TFSounds.LOYAL_ZOMBIE_HURT, "Loyal Zombie hurts"); + this.addSubtitle(TFSounds.LOYAL_ZOMBIE_SUMMON, "Loyal Zombie summoned"); + + this.addSubtitle(TFSounds.MAZE_SLIME_DEATH, "Maze Slime dies"); + this.addSubtitle(TFSounds.MAZE_SLIME_HURT, "Maze Slime hurts"); + this.addSubtitle(TFSounds.MAZE_SLIME_SQUISH, "Maze Slime squishes"); + + this.addSubtitle(TFSounds.MINION_AMBIENT, "Lich Minion groans"); + this.addSubtitle(TFSounds.MINION_DEATH, "Lich Minion dies"); + this.addSubtitle(TFSounds.MINION_HURT, "Lich Minion hurts"); + this.addSubtitle(TFSounds.MINION_SUMMON, "Lich summons new Minion"); + + this.addSubtitle(TFSounds.MINOSHROOM_AMBIENT, "Minoshroom moos"); + this.addSubtitle(TFSounds.MINOSHROOM_ATTACK, "Minoshroom attacks"); + this.addSubtitle(TFSounds.MINOSHROOM_DEATH, "Minoshroom dies"); + this.addSubtitle(TFSounds.MINOSHROOM_HURT, "Minoshroom hurts"); + this.addSubtitle(TFSounds.MINOSHROOM_SLAM, "Minoshroom slams ground"); + + this.addSubtitle(TFSounds.MINOTAUR_AMBIENT, "Minotaur moos"); + this.addSubtitle(TFSounds.MINOTAUR_ATTACK, "Minotaur attacks"); + this.addSubtitle(TFSounds.MINOTAUR_DEATH, "Minotaur dies"); + this.addSubtitle(TFSounds.MINOTAUR_HURT, "Minotaur hurts"); + + this.addSubtitle(TFSounds.MIST_WOLF_AMBIENT, "Mist Wolf growls"); + this.addSubtitle(TFSounds.MIST_WOLF_DEATH, "Mist Wolf dies"); + this.addSubtitle(TFSounds.MIST_WOLF_HURT, "Mist Wolf hurts"); + this.addSubtitle(TFSounds.MIST_WOLF_TARGET, "Mist Wolf takes notice"); + + this.addSubtitle(TFSounds.MOSQUITO, "Mosquitoes buzz"); + + this.addSubtitle(TFSounds.NAGA_HISS, "Naga hisses"); + this.addSubtitle(TFSounds.NAGA_HURT, "Naga hurts"); + this.addSubtitle(TFSounds.NAGA_RATTLE, "Naga rattles"); + + this.addSubtitle(TFSounds.PINCH_BEETLE_DEATH, "Pinch Beetle dies"); + this.addSubtitle(TFSounds.PINCH_BEETLE_HURT, "Pinch Beetle hurts"); + + this.addSubtitle(TFSounds.QUEST_RAM_AMBIENT, "Quest Ram bleats"); + this.addSubtitle(TFSounds.QUEST_RAM_DEATH, "Quest Ram dies"); + this.addSubtitle(TFSounds.QUEST_RAM_HURT, "Quest Ram hurts"); + + this.addSubtitle(TFSounds.RAVEN_CAW, "Raven caws"); + this.addSubtitle(TFSounds.RAVEN_SQUAWK, "Raven squawks in pain"); + + this.addSubtitle(TFSounds.REDCAP_AMBIENT, "Redcap chuckles"); + this.addSubtitle(TFSounds.REDCAP_DEATH, "Redcap groans in agony"); + this.addSubtitle(TFSounds.REDCAP_HURT, "Redcap screeches in pain"); + + this.addSubtitle(TFSounds.SHIELD_ADD, "Fortification Shield spawns"); + this.addSubtitle(TFSounds.SHIELD_BREAK, "Fortification Shield breaks"); + + this.addSubtitle(TFSounds.SLIME_BEETLE_DEATH, "Slime Beetle dies"); + this.addSubtitle(TFSounds.SLIME_BEETLE_HURT, "Slime Beetle hurts"); + this.addSubtitle(TFSounds.SLIME_BEETLE_SQUISH, "Slime Beetle shoots"); + + this.addSubtitle(TFSounds.SNOW_GUARDIAN_AMBIENT, "Snow Guardian crackles"); + this.addSubtitle(TFSounds.SNOW_GUARDIAN_DEATH, "Snow Guardian dies"); + this.addSubtitle(TFSounds.SNOW_GUARDIAN_HURT, "Snow Guardian hurts"); + + this.addSubtitle(TFSounds.SNOW_QUEEN_AMBIENT, "Snow Queen crackles"); + this.addSubtitle(TFSounds.SNOW_QUEEN_ATTACK, "Snow Queen attacks"); + this.addSubtitle(TFSounds.SNOW_QUEEN_BREAK, "Snow Queen deflects attack"); + this.addSubtitle(TFSounds.SNOW_QUEEN_DEATH, "Snow Queen dies"); + this.addSubtitle(TFSounds.SNOW_QUEEN_HURT, "Snow Queen hurts"); + + this.addSubtitle(TFSounds.SWARM_SPIDER_AMBIENT, "Swarm Spider hisses"); + this.addSubtitle(TFSounds.SWARM_SPIDER_DEATH, "Swarm Spider dies"); + this.addSubtitle(TFSounds.SWARM_SPIDER_HURT, "Swarm Spider hurts"); + + this.addSubtitle(TFSounds.TEAR_BREAK, "Ur-Ghast tear shatters"); + + this.addSubtitle(TFSounds.TINY_BIRD_CHIRP, "Bird chirps"); + this.addSubtitle(TFSounds.TINY_BIRD_HURT, "Bird squeaks in pain"); + this.addSubtitle(TFSounds.TINY_BIRD_SONG, "Bird sings"); + this.addSubtitle(TFSounds.TINY_BIRD_TAKEOFF, "Bird takes off"); + + this.addSubtitle(TFSounds.TROLL_THROWS_ROCK, "Troll chucks block"); + + this.addSubtitle(TFSounds.UR_GHAST_AMBIENT, "Ur-Ghast cries"); + this.addSubtitle(TFSounds.UR_GHAST_DEATH, "Ur-Ghast dies"); + this.addSubtitle(TFSounds.UR_GHAST_HURT, "Ur-Ghast screams"); + this.addSubtitle(TFSounds.UR_GHAST_SHOOT, "Ur-Ghast shoots"); + this.addSubtitle(TFSounds.UR_GHAST_TANTRUM, "Ur-Ghast wails"); + + this.addSubtitle(TFSounds.WINTER_WOLF_AMBIENT, "Winter Wolf growls"); + this.addSubtitle(TFSounds.WINTER_WOLF_DEATH, "Winter Wolf dies"); + this.addSubtitle(TFSounds.WINTER_WOLF_HURT, "Winter Wolf hurts"); + this.addSubtitle(TFSounds.WINTER_WOLF_SHOOT, "Winter Wolf shoots"); + this.addSubtitle(TFSounds.WINTER_WOLF_TARGET, "Winter Wolf takes notice"); + + this.addSubtitle(TFSounds.WRAITH_AMBIENT, "Wraith gasps"); + this.addSubtitle(TFSounds.WRAITH_DEATH, "Wraith dies"); + this.addSubtitle(TFSounds.WRAITH_HURT, "Wraith hurts"); + + this.addSubtitle(TFSounds.YETI_DEATH, "Yeti dies"); + this.addSubtitle(TFSounds.YETI_GRAB, "Yeti grabs"); + this.addSubtitle(TFSounds.YETI_GROWL, "Yeti growls"); + this.addSubtitle(TFSounds.YETI_HURT, "Yeti hurts"); + this.addSubtitle(TFSounds.YETI_THROW, "Yeti throws"); + + this.addSubtitle(TFSounds.ALPHA_YETI_PARROT, "Parrot coldly growls"); + this.addSubtitle(TFSounds.CARMINITE_GOLEM_PARROT, "Parrot thunks"); + this.addSubtitle(TFSounds.DEATH_TOME_PARROT, "Parrot makes book noises"); + this.addSubtitle(TFSounds.HOSTILE_WOLF_PARROT, "Parrot growls"); + this.addSubtitle(TFSounds.HYDRA_PARROT, "Parrot roars"); + this.addSubtitle(TFSounds.ICE_CORE_PARROT, "Parrot crackles"); + this.addSubtitle(TFSounds.KOBOLD_PARROT, "Parrot grumbles"); + this.addSubtitle(TFSounds.MINOTAUR_PARROT, "Parrot moos angrily"); + this.addSubtitle(TFSounds.MOSQUITO_PARROT, "Parrot buzzes"); + this.addSubtitle(TFSounds.NAGA_PARROT, "Parrot rattles"); + this.addSubtitle(TFSounds.REDCAP_PARROT, "Parrot chuckles"); + this.addSubtitle(TFSounds.WRAITH_PARROT, "Parrot gasps"); + + this.addSubtitle(TFSounds.BEANSTALK_GROWTH, "Ground rumbles"); + this.addSubtitle(TFSounds.BLOCK_ANNIHILATED, "Block dissolves"); + this.addSubtitle(TFSounds.BOSS_CHEST_APPEAR, "Boss Chest appears"); + this.addSubtitle(TFSounds.BUG_SQUISH, "Bug gets squished :("); + this.addSubtitle(TFSounds.BUILDER_CREATE, "Carminite Builder creates block"); + this.addSubtitle(TFSounds.BUILDER_OFF, "Carminite Builder deactivates"); + this.addSubtitle(TFSounds.BUILDER_ON, "Carminite Builder activates"); + this.addSubtitle(TFSounds.BUILDER_REPLACE, "Built Block expires"); + this.addSubtitle(TFSounds.CASKET_CLOSE, "Keepsake Casket closes"); + this.addSubtitle(TFSounds.CASKET_LOCKED, "Keepsake Casket clicks"); + this.addSubtitle(TFSounds.CASKET_OPEN, "Keepsake Casket opens"); + this.addSubtitle(TFSounds.CASKET_REPAIR, "Keepsake Casket repaired"); + this.addSubtitle(TFSounds.CICADA, "Cicada screams"); + this.addSubtitle(TFSounds.DOOR_ACTIVATED, "Castle Door clicks"); + this.addSubtitle(TFSounds.DOOR_REAPPEAR, "Castle Door reappears"); + this.addSubtitle(TFSounds.DOOR_VANISH, "Castle Door vanishes"); + this.addSubtitle(TFSounds.GHAST_TRAP_AMBIENT, "Ghast Trap dings"); + this.addSubtitle(TFSounds.GHAST_TRAP_ON, "Ghast Trap buzzes"); + this.addSubtitle(TFSounds.GHAST_TRAP_SPINDOWN, "Ghast Trap shuts off"); + this.addSubtitle(TFSounds.GHAST_TRAP_WARMUP, "Ghast Trap warms up"); + this.addSubtitle(TFSounds.JET_ACTIVE, "Fire Jet flares"); + this.addSubtitle(TFSounds.JET_POP, "Fire Jet pops"); + this.addSubtitle(TFSounds.JET_START, "Fire Jet activates"); + this.addSubtitle(TFSounds.LOCKED_VANISHING_BLOCK, "Towerwood door clicks"); + this.addSubtitle(TFSounds.PEDESTAL_ACTIVATE, "Trophy Pedestal accepts trophy"); + this.addSubtitle(TFSounds.PICKED_TORCHBERRIES, "Torchberries pop"); + this.addSubtitle(TFSounds.PORTAL_WHOOSH, "Twilight Forest Portal beckons"); + this.addSubtitle(TFSounds.REACTOR_AMBIENT, "Carminite Reactor whooshes"); + this.addSubtitle(TFSounds.REAPPEAR_BLOCK, "Reappearing Block reappears"); + this.addSubtitle(TFSounds.REAPPEAR_POOF, "Reappearing Block disappears"); + this.addSubtitle(TFSounds.SLIDER, "Sliding Trap creaks"); + this.addSubtitle(TFSounds.SMOKER_START, "Smoker activates"); + this.addSubtitle(TFSounds.TIME_CORE, "Tree of Time ticks"); + this.addSubtitle(TFSounds.TRANSFORMATION_CORE, "Tree of Transformation hums"); + this.addSubtitle(TFSounds.UNLOCK_VANISHING_BLOCK, "Towerwood door unlocks"); + this.addSubtitle(TFSounds.VANISHING_BLOCK, "Vanishing Block vanishes"); + + this.addSubtitle(TFSounds.BLOCK_AND_CHAIN_COLLIDE, "Block and Chain hits block"); + this.addSubtitle(TFSounds.BLOCK_AND_CHAIN_FIRED, "Block and Chain fires"); + this.addSubtitle(TFSounds.BLOCK_AND_CHAIN_HIT, "Block and Chain hits entity"); + this.addSubtitle(TFSounds.BRITTLE_FLASK_BREAK, "Brittle Flask shatters"); + this.addSubtitle(TFSounds.BRITTLE_FLASK_CRACK, "Brittle Flask cracks"); + this.addSubtitle(TFSounds.CHARM_KEEP, "Charm of Keeping returns items"); + this.addSubtitle(TFSounds.CHARM_LIFE, "Charm of Keeping regenerates"); + this.addSubtitle(TFSounds.FAN_WHOOSH, "Peacock Feather Fan blows"); + this.addSubtitle(TFSounds.FLASK_FILL, "Potion Flask fills"); + this.addSubtitle(TFSounds.GLASS_SWORD_BREAK, "Glass Sword shatters"); + this.addSubtitle(TFSounds.ICE_BOMB_FIRED, "Ice Bomb thrown"); + this.addSubtitle(TFSounds.KNIGHTMETAL_EQUIP, "Knightmetal Armor clanks"); + this.addSubtitle(TFSounds.LAMP_BURN, "Lamp of Cinders ignites area"); + this.addSubtitle(TFSounds.MAGNET_GRAB, "Ore Magnet pulls up ore"); + this.addSubtitle(TFSounds.METAL_SHIELD_SHATTERS, "Metal Shield shatters"); + this.addSubtitle(TFSounds.MOONWORM_SQUISH, "Moonworm fires"); + this.addSubtitle(TFSounds.POWDER_USE, "Mob Transforms"); + this.addSubtitle(TFSounds.SCEPTER_DRAIN, "Life Scepter drains"); + this.addSubtitle(TFSounds.SCEPTER_PEARL, "Twilight Scepter throws pearl"); + this.addSubtitle(TFSounds.WOOD_SHIELD_SHATTERS, "Wooden Shield shatters"); + + this.addDeathMessage("ghastTear", "%1$s was scalded by fiery tears"); + this.addDeathMessage("ghastTear.player", "%1$s was scalded by fiery tears while escaping %2$s"); + this.addDeathMessage("hydraFire", "%1$s was roasted alive by the Hydra"); + this.addDeathMessage("hydraFire.player", "%1$s was roasted alive by the Hydra while escaping %2$s"); + this.addDeathMessage("hydraBite", "%1$s's skin was ripped off by the Hydra"); + this.addDeathMessage("hydraBite.player", "%1$s's skin was ripped off by the Hydra while escaping %2$s"); + this.addDeathMessage("lichBolt", "The Lich's aim was better than %1$s"); + this.addDeathMessage("lichBolt.player", "The Lich and %2$s had better aim than %1$s"); + this.addDeathMessage("lichBomb", "%1$s succumbed to the Lich's explosive magic"); + this.addDeathMessage("lichBomb.player", "%1$s succumbed to the Lich's explosive magic while escaping %2$s"); + this.addDeathMessage("chillingBreath", "%1$s was frozen to death by the Snow Queen"); + this.addDeathMessage("chillingBreath.player", "%1$s was frozen to death by the Snow Queen while escaping %2$s"); + this.addDeathMessage("squish", "%1$s was squashed by the Snow Queen"); + this.addDeathMessage("squish.player", "%1$s was squashed by the Snow Queen while escaping %2$s"); + this.addDeathMessage("thrownAxe", "%1$s was decapitated by a thrown axe"); + this.addDeathMessage("thrownAxe.player", "%1$s was decapitated by a thrown axe while escaping %2$s"); + this.addDeathMessage("thrownPickaxe", "%1$s was decapitated by a thrown pickaxe"); + this.addDeathMessage("thrownPickaxe.player", "%1$s was decapitated by a thrown pickaxe while escaping %2$s"); + this.addDeathMessage("fireJet", "%1$s accidentally walked into a Fire Jet"); + this.addDeathMessage("fireJet.player", "%1$s accidentally walked into a Fire Jet while escaping %2$s"); + this.addDeathMessage("reactor", "%1$s stood too close to a Carminite Reactor"); + this.addDeathMessage("reactor.player", "%1$s stood too close to a Carminite Reactor while escaping %2$s"); + this.addDeathMessage("slider", "%1$s was sliced up by a Sliding Trap"); + this.addDeathMessage("slider.player", "%1$s was sliced up by a Sliding Trap while escaping %2$s"); + this.addDeathMessage("thorns", "%1$s walked into some thorns"); + this.addDeathMessage("thorns.player", "%1$s walked into some thorns while escaping %2$s"); + this.addDeathMessage("knightmetal", "%1$s was skewered by a Knightmetal block"); + this.addDeathMessage("knightmetal.player", "%1$s was skewered by a Knightmetal block while escaping %2$s"); + this.addDeathMessage("fiery", "%1$s walked onto a Fiery block"); + this.addDeathMessage("fiery.player", "%1$s walked onto a Fiery block while escaping %2$s"); + this.addDeathMessage("thrownBlock", "%1$s was squashed by a thrown block"); + this.addDeathMessage("thrownBlock.player", "%1$s was squashed by a thrown block while escaping %2$s"); + this.addDeathMessage("expired", "%1$s's life expired"); + this.addDeathMessage("expired.player", "%1$s's life expired"); + + this.addDeathMessage("axing", "%1$s was chopped up by %2$s"); + this.addDeathMessage("axing.item", "%1$s was chopped up by %2$s using %3$s"); + this.addDeathMessage("moonworm", "%1$s was shot by Moonworm"); + this.addDeathMessage("ant", "%1$s was squashed like an ant by %2$s"); + this.addDeathMessage("ant.item", "%1$s was squashed like an ant by %2$s holding %3$s"); + this.addDeathMessage("haunt", "%1$s joined the %2$s's haunt"); + this.addDeathMessage("haunt.item", "%1$s joined the %2$s's haunt after being killed by %3$s"); + this.addDeathMessage("clamped", "%1$s was squeezed to death by %2$s"); + this.addDeathMessage("clamped.item", "%1$s was squeezed to death by %2$s using %3$s"); + this.addDeathMessage("scorched", "%1$s was scorched by %2$s"); + this.addDeathMessage("scorched.item", "%1$s was scorched by %2$s using %3$s"); + this.addDeathMessage("frozen", "%1$s was frozen by %2$s using an Ice Bomb"); + this.addDeathMessage("frozen.item", "%1$s was frozen by %2$s using %3$s"); + this.addDeathMessage("spiked", "%1$s was skewered by %2$s"); + this.addDeathMessage("spiked.item", "%1$s was skewered by %2$s using %3$s"); + this.addDeathMessage("leafBrain", "%1$s's brain was turned into leaves by %2$s"); + this.addDeathMessage("leafBrain.item", "%1$s's brain was turned into leaves by %2$s using %3$s"); + this.addDeathMessage("lostWords", "%1$s was at a loss for words after being killed by %2$s"); + this.addDeathMessage("lostWords.item", "%1$s was at a loss for words after being killed by %2$s using %3$s"); + this.addDeathMessage("schooled", "%1$s was schooled by %2$s"); + this.addDeathMessage("schooled.item", "%1$s was schooled by %2$s using %3$s"); + this.addDeathMessage("snowballFight", "%1$s lost a snowball fight to %2$s"); + this.addDeathMessage("snowballFight.item", "%1$s lost a snowball fight to %2$s using %3$s"); + this.addDeathMessage("lifedrain", "%1$s's life was drained by %2$s"); + this.addDeathMessage("lifedrain.item", "%1$s's life was drained by %2$s using %3$s"); + this.addDeathMessage("yeeted", "%1$s was yeeted for the last time"); + this.addDeathMessage("yeeted.entity", "%1$s was yeeted for the last time by %2$s"); + this.addDeathMessage("yeeted.item", "%1$s was yeeted for the last time by %2$s while somehow holding %3$s"); + + this.addStat("blocks_crumbled", "Blocks Crumbled"); + this.addStat("bugs_squished", "Bugs Squashed"); + this.addStat("e115_slices_eaten", "Experiment 115 Slices Eaten"); + this.addStat("keeping_charms_activated", "Charms of Keeping Used"); + this.addStat("life_charms_activated", "Charms of Life Used"); + this.addStat("skull_candles_made", "Skull Candles Created"); + this.addStat("tf_shields_broken", "Fortification Shields Broken"); + this.addStat("torchberries_harvested", "Torchberries Harvested"); + this.addStat("trophy_pedestals_activated", "Trophy Pedestals Activated"); + this.addStat("uncrafting_table_interactions", "Interactions with Uncrafting Table"); + + this.add("config.jade.plugin_twilightforest.quest_ram_wool", "Quest Ram Wool"); + + this.add("twilightforest.book.author", "a forgotten explorer"); + + this.addBookAndContents("lichtower", "Notes on a Pointy Tower", + "§8[An explorer's notebook, gnawed on by monsters]§0\n\nI have begun examining the strange aura surrounding this tower. The bricks of the tower are protected by a curse, stronger than any I've seen before. The magic from the curse is boiling off into the", + "surrounding area.\n\nIn my homeland I would have many options for dealing with this magic, but here my supplies are limited. I shall have to research...", + "§8[[Many entries later]]§0\n\nA breakthrough! In my journeys I sighted a huge snake-like monster in a decorated courtyard. Nearby, I picked up a worn down, discarded green scale.\n\nThe magic in the scale seems to have the curse-breaking", + "properties I need, but the magic is too dim. I may need to acquire a fresher specimen, directly from the creature."); + + this.addBookAndContents("labyrinth", "Notes on a Swampy Labyrinth", + "§8[[An explorer's notebook, written on waterproof paper]]§0\n\nThe mosquitoes in this swamp are vexing, but strange. The vast majority of them seem to have no natural source, nor do they seem to have a role in the local ecology. I have begun to suspect that they are", + "some kind of magical curse.\n\n§8[[Next entry]]§0\n\nNow that I have encountered a protection spell on the ruined labyrinth here, I consider my suspicions confirmed. Both the protection spell and the mosquitoes are a", + "curse. This curse seems to have a different source from the others I have encountered. I will have to research further...\n\n§8[[Next entry]]§0\n\nThe curse seems to be of a type too powerful for one being alone to", + "produce. Several wizards working in combination would be necessary.\n\nIf one of the wizards stopped contributing, the whole of the curse over the entire swamp would fall. Strangely, my divinations do not show signs of any nearby living wizards.", + "I did see something interesting in one of the nearby pointy-roofed towers though..."); + + this.addBookAndContents("hydralair", "Notes on the Fire Swamp", + "§8[[An explorer's notebook, written on fireproof paper]]§0\n\nFire is a trivial obstacle for a master explorer such as myself. I have traversed seas of fire, and swam through oceans of lava. The burning air here is an interesting variation, but", + "ultimately no hindrance.\n\nWhat does stop me though is that I have encountered another protection spell, this time surrounding a mighty creature that must be king of this fire swamp. This is not the first protection spell I have encountered, and I am", + "beginning to unravel the mysteries of how they work.\n\nIf this spell is like the others, it will be sustained by a powerful creature nearby. Surrounding the fire swamp are several wet swamps, and under those swamps are labyrinths full of minotaurs.", + "The logical choice to bind such a spell to would be some sort of powerful minotaur, different in some way from the others that surround it..."); + + this.addBookAndContents("tfstronghold", "Notes on a Stronghold", + "§8[[An explorer's notebook, written on faintly glowing paper]]§0\n\nThe tendrils of darkness surrounding this area are just a manifestation of a protective spell over the entire dark forest. The spell causes blindness, which is quite vexing. I have seen several", + "interesting things in the area and would like to keep exploring.\n\n§8[[Next entry]]§0\n\nI have found ruins in the dark forest. They belong to a stronghold, of a type usually inhabited by knights. Rather than knights though, this stronghold is full of", + "goblins. They wear knightly armor, but their behavior is most un-knightly.\n\n§8[[Next entry]]§0\n\nDeep in the ruins, I have found a pedestal. The pedestal seems to be of a type that knights would place trophies on to prove their strength.", + "Obtaining a powerful scepter would seem to weaken the curse on the dark forest, and placing a trophy associated with a powerful creature on the pedestal would likely grant access into the main part of the stronghold."); + + this.addBookAndContents("darktower", "Notes on a Wooden Tower", + "§8[[An explorer's notebook that seems to have survived an explosion]]§0\n\nThis tower clearly has mechanisms that are not responding to me. Their magic almost yearns to acknowledge my touch, but it cannot. It is if the devices of the tower are being", + "suppressed by a powerful group of beings nearby.\n\n§8[[Next entry]]§0\n\nThe magic seems to emanate from deep within the strongholds nearby. It can't come from the goblins, as their magic is charming, but unfocused. There", + "must still be some force still active in the strongholds.\n\n§8[[Next entry]]§0\n\nMy analysis indicates that it comes from several sources, operating as a group. I will head back to the stronghold after I resupply..."); + + this.addBookAndContents("yeticave", "Notes on an Icy Cave", + "§8[[An explorer's notebook, covered in frost]]§0\n\nThe blizzard surrounding these snowy lands is unceasing. This is no ordinary snowfall--this is a magical phenomenon. I will have to conduct experiments to find what is capable of", + "causing such an effect.\n\n§8[[Next entry]]§0\n\nThe curse seems to be of a type too powerful for one being alone to produce. Several wizards working in combination would be necessary. If one of the wizards stopped", + "contributing, the blizzard would calm. Strangely, my divinations do not show signs of any nearby living wizards. I did see something interesting in one of the nearby pointy-roofed towers though..."); + + this.addBookAndContents("icetower", "Notes on Auroral Fortification", + "§8[[An explorer's notebook, caked in ice]]§0\n\nI overcame one blizzard, only to run into this terrible ice storm atop the glacier. My explorations have shown me the splendor of an ice palace, shining with the colors of the", + "polar aurora. It all seems protected by some sort of curse.\n\n§8[[Next entry]]§0\n\nI am no novice. This curse is fed by the power of a creature nearby. The cause of the curse surrounding the fire swamp was built off the power of the", + "leader of the minotaurs nearby.\n\nSurrounding this glacier, there are masses of yetis. Perhaps the yetis have some sort of leader..."); + + this.addBookAndContents("trollcave", "Notes on the Highlands", + "§8[[An explorer's notebook, damaged by acid]]§0\n\nThere seems to be no way to protect myself from the toxic rainstorm surrounding this area. In my brief excursions, I have also encountered another protection spell, similar to the others I have", + "witnessed. The spell must be connected to the toxic storm in some way. Further research to follow...\n\n§8[[Next entry]]§0\n\nSuch supreme weather magic must be the result of multiple undefeated great evils in this world. My studies contain", + "several clues pointing at a searing swamp, a forest coated in deep darkness, and a realm coated in snow."); + + this.addBookAndContents("unknown", "Notes on the Unexplained", + "§8[[This book shows signs of having been copied many times]]§0\n\nI cannot explain the field surrounding this structure, but the magic is powerful. If this curse is like the others, then the answer to unlocking it lies elsewhere. Perhaps there is something I have left", + "undone, or some monster I have yet to defeat. I will have to turn back. I will return to this place later, to see if anything has changed."); + + this.addScreenMessage("optifine.title", "WARNING: OPTIFINE DETECTED"); + this.addScreenMessage("optifine.message", "Before proceeding, please note that Optifine is known to cause crashes, multipart entity visual bugs and many other issues.\n\nBefore reporting a bug, please remove Optifine first and check again to see if the bug is still present.\n\nOptifine-related issues are not solvable on Twilight Forest's end!\n\nThis screen may be disabled in the Client Config."); + this.addScreenMessage("optifine.suggestions", "Here's a selection of mods that we recommend using instead."); + + this.addScreenMessage("crumble_horn_jei", "Crumble Horn"); + this.addScreenMessage("transformation_jei", "Transformation Powder"); + this.addScreenMessage("uncrafting_jei", "Uncrafting"); + } +} diff --git a/src/main/java/twilightforest/data/LootGenerator.java b/src/main/java/twilightforest/data/LootGenerator.java new file mode 100644 index 0000000000..819e354dcd --- /dev/null +++ b/src/main/java/twilightforest/data/LootGenerator.java @@ -0,0 +1,28 @@ +package twilightforest.data; + +import net.minecraft.data.PackOutput; +import net.minecraft.data.loot.LootTableProvider; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.storage.loot.LootTable; +import net.minecraft.world.level.storage.loot.ValidationContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets; +import twilightforest.loot.TFLootTables; + +import java.util.List; +import java.util.Map; + +public class LootGenerator extends LootTableProvider { + public LootGenerator(PackOutput output) { + super(output, TFLootTables.allBuiltin(), List.of( + new LootTableProvider.SubProviderEntry(BlockLootTables::new, LootContextParamSets.BLOCK), + new LootTableProvider.SubProviderEntry(ChestLootTables::new, LootContextParamSets.CHEST), + new LootTableProvider.SubProviderEntry(EntityLootTables::new, LootContextParamSets.ENTITY), + new LootTableProvider.SubProviderEntry(SpecialLootTables::new, LootContextParamSets.EMPTY) + )); + } + + @Override + protected void validate(Map map, ValidationContext validationcontext) { + + } +} diff --git a/src/main/java/twilightforest/data/LootModifierGenerator.java b/src/main/java/twilightforest/data/LootModifierGenerator.java new file mode 100644 index 0000000000..bde5ccea07 --- /dev/null +++ b/src/main/java/twilightforest/data/LootModifierGenerator.java @@ -0,0 +1,25 @@ +package twilightforest.data; + +import net.minecraft.advancements.critereon.ItemPredicate; +import net.minecraft.data.DataGenerator; +import net.minecraft.data.PackOutput; +import net.minecraft.world.level.storage.loot.predicates.LootItemCondition; +import net.minecraft.world.level.storage.loot.predicates.MatchTool; +import net.minecraftforge.common.data.GlobalLootModifierProvider; +import twilightforest.TwilightForestMod; +import twilightforest.init.TFItems; +import twilightforest.init.TFLootModifiers; +import twilightforest.loot.modifiers.FieryToolSmeltingModifier; +import twilightforest.loot.modifiers.GiantToolGroupingModifier; + +public class LootModifierGenerator extends GlobalLootModifierProvider { + public LootModifierGenerator(PackOutput output) { + super(output, TwilightForestMod.ID); + } + + @Override + protected void start() { + add("fiery_pick_smelting", new FieryToolSmeltingModifier(new LootItemCondition[]{MatchTool.toolMatches(ItemPredicate.Builder.item().of(TFItems.FIERY_PICKAXE.get())).build()})); + add("giant_pick_grouping", new GiantToolGroupingModifier(new LootItemCondition[]{MatchTool.toolMatches(ItemPredicate.Builder.item().of(TFItems.GIANT_PICKAXE.get())).build()})); + } +} diff --git a/src/main/java/twilightforest/data/RegistryDataGenerator.java b/src/main/java/twilightforest/data/RegistryDataGenerator.java new file mode 100644 index 0000000000..b375432116 --- /dev/null +++ b/src/main/java/twilightforest/data/RegistryDataGenerator.java @@ -0,0 +1,56 @@ +package twilightforest.data; + +import net.minecraft.core.HolderLookup; +import net.minecraft.core.RegistryAccess; +import net.minecraft.core.RegistrySetBuilder; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.core.registries.Registries; +import net.minecraft.data.DataGenerator; +import net.minecraft.data.PackOutput; +import net.minecraftforge.common.data.DatapackBuiltinEntriesProvider; +import net.minecraftforge.common.data.ExistingFileHelper; +import twilightforest.TwilightForestMod; +import twilightforest.data.tags.BiomeTagGenerator; +import twilightforest.data.tags.CustomTagGenerator; +import twilightforest.data.tags.DamageTypeTagGenerator; +import twilightforest.init.*; +import twilightforest.init.custom.BiomeLayerStack; +import twilightforest.init.custom.WoodPalettes; + +import java.util.Set; +import java.util.concurrent.CompletableFuture; + +public class RegistryDataGenerator extends DatapackBuiltinEntriesProvider { + + public static final RegistrySetBuilder BUILDER = new RegistrySetBuilder() + .add(Registries.CONFIGURED_FEATURE, TFConfiguredFeatures::bootstrap) + .add(Registries.PLACED_FEATURE, TFPlacedFeatures::bootstrap) + .add(Registries.STRUCTURE, TFStructures::bootstrap) + .add(Registries.STRUCTURE_SET, TFStructureSets::bootstrap) + .add(Registries.CONFIGURED_CARVER, TFCaveCarvers::bootstrap) + .add(Registries.NOISE_SETTINGS, TFDimensionSettings::bootstrapNoise) + .add(BiomeLayerStack.BIOME_STACK_KEY, BiomeLayerStack::bootstrap) + .add(Registries.DIMENSION_TYPE, TFDimensionSettings::bootstrapType) + .add(Registries.LEVEL_STEM, TFDimensionSettings::bootstrapStem) + .add(Registries.BIOME, TFBiomes::bootstrap) + .add(WoodPalettes.WOOD_PALETTE_TYPE_KEY, WoodPalettes::bootstrap) + .add(Registries.DAMAGE_TYPE, TFDamageTypes::bootstrap); + + // Use addProviders() instead + private RegistryDataGenerator(PackOutput output, CompletableFuture provider) { + super(output, provider, BUILDER, Set.of("minecraft", TwilightForestMod.ID)); + } + + public static void addProviders(boolean isServer, DataGenerator generator, PackOutput output, CompletableFuture provider, ExistingFileHelper helper) { + generator.addProvider(isServer, new RegistryDataGenerator(output, provider)); + // This is needed here because Minecraft Forge doesn't properly support tagging custom registries, without problems. + // If you think this looks fixable, please ensure the fixes are tested in runData & runClient as these current issues exist entirely within Forge's internals. + generator.addProvider(isServer, new CustomTagGenerator.WoodPaletteTagGenerator(output, provider.thenApply(r -> append(r, BUILDER)), helper)); + generator.addProvider(isServer, new BiomeTagGenerator(output, provider.thenApply(r -> append(r, BUILDER)), helper)); + generator.addProvider(isServer, new DamageTypeTagGenerator(output, provider.thenApply(r -> append(r, BUILDER)), helper)); + } + + private static HolderLookup.Provider append(HolderLookup.Provider original, RegistrySetBuilder builder) { + return builder.buildPatch(RegistryAccess.fromRegistryOfRegistries(BuiltInRegistries.REGISTRY), original); + } +} diff --git a/src/main/java/twilightforest/data/SoundGenerator.java b/src/main/java/twilightforest/data/SoundGenerator.java new file mode 100644 index 0000000000..e04b04e759 --- /dev/null +++ b/src/main/java/twilightforest/data/SoundGenerator.java @@ -0,0 +1,365 @@ +package twilightforest.data; + +import net.minecraft.data.PackOutput; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.SoundEvents; +import net.minecraftforge.common.data.ExistingFileHelper; +import net.minecraftforge.common.data.SoundDefinition; +import twilightforest.TwilightForestMod; +import twilightforest.data.helpers.TFSoundProvider; +import twilightforest.init.TFSounds; + +public class SoundGenerator extends TFSoundProvider { + + public SoundGenerator(PackOutput output, ExistingFileHelper helper) { + super(output, helper); + } + + @Override + public void registerSounds() { + this.generateExistingSoundWithSubtitle(TFSounds.ACID_RAIN_BURNS, SoundEvents.FIRE_EXTINGUISH); + this.generateNewSoundWithSubtitle(TFSounds.ALPHA_YETI_ALERT, "mob/alpha_yeti/alert", 1); + this.generateNewSoundWithSubtitle(TFSounds.ALPHA_YETI_DEATH, "mob/alpha_yeti/death", 1); + this.generateNewSoundWithSubtitle(TFSounds.ALPHA_YETI_GRAB, "mob/alpha_yeti/grab", 1); + this.generateNewSoundWithSubtitle(TFSounds.ALPHA_YETI_GROWL, "mob/alpha_yeti/growl", 3); + this.generateNewSoundWithSubtitle(TFSounds.ALPHA_YETI_HURT, "mob/alpha_yeti/hurt", 3); + this.generateExistingSoundWithSubtitle(TFSounds.ALPHA_YETI_ICE, SoundEvents.ARROW_SHOOT); + this.generateNewSoundWithSubtitle(TFSounds.ALPHA_YETI_PANT, "mob/alpha_yeti/pant", 3); + this.generateNewSoundWithSubtitle(TFSounds.ALPHA_YETI_ROAR, "mob/alpha_yeti/roar", 1); + this.generateNewSoundWithSubtitle(TFSounds.ALPHA_YETI_THROW, "mob/alpha_yeti/throw", 1); + + this.generateExistingSoundWithSubtitle(TFSounds.BIGHORN_SHEEP_AMBIENT, SoundEvents.SHEEP_AMBIENT); + this.generateExistingSoundWithSubtitle(TFSounds.BIGHORN_SHEEP_DEATH, SoundEvents.SHEEP_DEATH); + this.generateExistingSoundWithSubtitle(TFSounds.BIGHORN_SHEEP_HURT, SoundEvents.SHEEP_HURT); + this.makeStepSound(TFSounds.BIGHORN_SHEEP_STEP, SoundEvents.SHEEP_STEP); + + this.generateNewSoundWithSubtitle(TFSounds.BLOCKCHAIN_GOBLIN_AMBIENT, "mob/redcap/redcap", 6); + this.generateNewSoundWithSubtitle(TFSounds.BLOCKCHAIN_GOBLIN_DEATH, "mob/redcap/die", 3); + this.generateNewSoundWithSubtitle(TFSounds.BLOCKCHAIN_GOBLIN_HURT, "mob/redcap/hurt", 4); + + this.generateExistingSoundWithSubtitle(TFSounds.BOAR_AMBIENT, SoundEvents.PIG_AMBIENT); + this.generateExistingSoundWithSubtitle(TFSounds.BOAR_DEATH, SoundEvents.PIG_DEATH); + this.generateExistingSoundWithSubtitle(TFSounds.BOAR_HURT, SoundEvents.PIG_HURT); + this.makeStepSound(TFSounds.BOAR_STEP, SoundEvents.PIG_STEP); + + this.generateExistingSoundWithSubtitle(TFSounds.CARMINITE_BROODLING_AMBIENT, SoundEvents.SPIDER_AMBIENT); + this.generateExistingSoundWithSubtitle(TFSounds.CARMINITE_BROODLING_DEATH, SoundEvents.SPIDER_DEATH); + this.generateExistingSoundWithSubtitle(TFSounds.CARMINITE_BROODLING_HURT, SoundEvents.SPIDER_HURT); + this.makeStepSound(TFSounds.CARMINITE_BROODLING_STEP, SoundEvents.SPIDER_STEP); + + this.generateExistingSoundWithSubtitle(TFSounds.CARMINITE_GHASTGUARD_AMBIENT, SoundEvents.GHAST_AMBIENT); + this.generateExistingSoundWithSubtitle(TFSounds.CARMINITE_GHASTGUARD_DEATH, SoundEvents.GHAST_DEATH); + this.generateExistingSoundWithSubtitle(TFSounds.CARMINITE_GHASTGUARD_HURT, SoundEvents.GHAST_HURT); + this.generateExistingSoundWithSubtitle(TFSounds.CARMINITE_GHASTGUARD_SHOOT, SoundEvents.GHAST_SHOOT); + this.generateSoundWithCustomSubtitle(TFSounds.CARMINITE_GHASTGUARD_WARN, SoundEvents.GHAST_WARN, "subtitles.twilightforest.entity.carminite_ghastguard.shoot"); + + this.generateExistingSoundWithSubtitle(TFSounds.CARMINITE_GHASTLING_AMBIENT, SoundEvents.GHAST_AMBIENT); + this.generateExistingSoundWithSubtitle(TFSounds.CARMINITE_GHASTLING_DEATH, SoundEvents.GHAST_DEATH); + this.generateExistingSoundWithSubtitle(TFSounds.CARMINITE_GHASTLING_HURT, SoundEvents.GHAST_HURT); + this.generateExistingSoundWithSubtitle(TFSounds.CARMINITE_GHASTLING_SHOOT, SoundEvents.GHAST_SHOOT); + this.generateSoundWithCustomSubtitle(TFSounds.CARMINITE_GHASTLING_WARN, SoundEvents.GHAST_WARN, "subtitles.twilightforest.entity.carminite_ghastling.shoot"); + + this.generateExistingSoundWithSubtitle(TFSounds.CARMINITE_GOLEM_ATTACK, SoundEvents.IRON_GOLEM_ATTACK); + this.generateExistingSoundWithSubtitle(TFSounds.CARMINITE_GOLEM_DEATH, SoundEvents.IRON_GOLEM_DEATH); + this.generateExistingSoundWithSubtitle(TFSounds.CARMINITE_GOLEM_HURT, SoundEvents.IRON_GOLEM_HURT); + this.makeStepSound(TFSounds.CARMINITE_GOLEM_STEP, SoundEvents.IRON_GOLEM_STEP); + + this.generateNewSoundWithSubtitle(TFSounds.DEATH_TOME_AMBIENT, "mob/tome/idle", 2); + this.generateNewSoundWithSubtitle(TFSounds.DEATH_TOME_DEATH, "mob/tome/death", 1); + this.generateNewSoundWithSubtitle(TFSounds.DEATH_TOME_HURT, "mob/tome/hurt", 3); + + this.generateNewSoundWithSubtitle(TFSounds.DEER_AMBIENT, "mob/deer/idle", 3); + this.generateNewSoundWithSubtitle(TFSounds.DEER_DEATH, "mob/deer/death", 1); + this.generateNewSoundWithSubtitle(TFSounds.DEER_HURT, "mob/deer/hurt", 2); + + this.generateExistingSoundWithSubtitle(TFSounds.DWARF_RABBIT_AMBIENT, SoundEvents.RABBIT_AMBIENT); + this.generateExistingSoundWithSubtitle(TFSounds.DWARF_RABBIT_DEATH, SoundEvents.RABBIT_DEATH); + this.generateExistingSoundWithSubtitle(TFSounds.DWARF_RABBIT_HURT, SoundEvents.RABBIT_HURT); + + this.generateExistingSoundWithSubtitle(TFSounds.FIRE_BEETLE_DEATH, SoundEvents.SPIDER_DEATH); + this.generateExistingSoundWithSubtitle(TFSounds.FIRE_BEETLE_HURT, SoundEvents.SPIDER_HURT); + this.generateExistingSoundWithSubtitle(TFSounds.FIRE_BEETLE_SHOOT, SoundEvents.GHAST_SHOOT); + this.makeStepSound(TFSounds.FIRE_BEETLE_STEP, SoundEvents.SPIDER_STEP); + + this.generateNewSoundWithSubtitle(TFSounds.GOBLIN_KNIGHT_AMBIENT, "mob/redcap/redcap", 6); + this.generateNewSoundWithSubtitle(TFSounds.GOBLIN_KNIGHT_DEATH, "mob/redcap/die", 3); + this.generateNewSoundWithSubtitle(TFSounds.GOBLIN_KNIGHT_HURT, "mob/redcap/hurt", 4); + + this.generateNewSoundWithSubtitle(TFSounds.GOBLIN_KNIGHT_MUFFLED_AMBIENT, "mob/redcap/muffled/redcap", 6); + this.generateNewSoundWithSubtitle(TFSounds.GOBLIN_KNIGHT_MUFFLED_DEATH, "mob/redcap/muffled/die", 3); + this.generateNewSoundWithSubtitle(TFSounds.GOBLIN_KNIGHT_MUFFLED_HURT, "mob/redcap/muffled/hurt", 4); + + this.generateExistingSoundWithSubtitle(TFSounds.HEDGE_SPIDER_AMBIENT, SoundEvents.SPIDER_AMBIENT); + this.generateExistingSoundWithSubtitle(TFSounds.HEDGE_SPIDER_DEATH, SoundEvents.SPIDER_DEATH); + this.generateExistingSoundWithSubtitle(TFSounds.HEDGE_SPIDER_HURT, SoundEvents.SPIDER_HURT); + this.makeStepSound(TFSounds.HEDGE_SPIDER_STEP, SoundEvents.SPIDER_STEP); + + this.generateExistingSoundWithSubtitle(TFSounds.HELMET_CRAB_DEATH, SoundEvents.SPIDER_DEATH); + this.generateExistingSoundWithSubtitle(TFSounds.HELMET_CRAB_HURT, SoundEvents.SPIDER_HURT); + this.makeStepSound(TFSounds.HELMET_CRAB_STEP, SoundEvents.SPIDER_STEP); + + this.generateNewSoundWithSubtitle(TFSounds.HOSTILE_WOLF_AMBIENT, "mob/mist_wolf/idle", 3); + this.generateExistingSoundWithSubtitle(TFSounds.HOSTILE_WOLF_DEATH, SoundEvents.WOLF_DEATH); + this.generateNewSoundWithSubtitle(TFSounds.HOSTILE_WOLF_HURT, "mob/mist_wolf/hurt", 2); + this.generateNewSoundWithSubtitle(TFSounds.HOSTILE_WOLF_TARGET, "mob/mist_wolf/target", 1); + + this.generateNewSoundWithSubtitle(TFSounds.HYDRA_DEATH, "mob/hydra/death", 1); + this.generateNewSoundWithSubtitle(TFSounds.HYDRA_GROWL, "mob/hydra/growl", 3); + this.generateNewSoundWithSubtitle(TFSounds.HYDRA_HURT, "mob/hydra/hurt", 4); + this.generateNewSoundWithSubtitle(TFSounds.HYDRA_ROAR, "mob/hydra/roar", 2); + this.generateExistingSoundWithSubtitle(TFSounds.HYDRA_SHOOT, SoundEvents.GHAST_SHOOT); + this.generateExistingSoundWithSubtitle(TFSounds.HYDRA_SHOOT_FIRE, SoundEvents.GHAST_SHOOT); + this.generateNewSoundWithSubtitle(TFSounds.HYDRA_WARN, "mob/hydra/warn", 1); + + this.generateNewSoundWithSubtitle(TFSounds.ICE_CORE_AMBIENT, "mob/ice/crackle", 2); + this.generateNewSoundWithSubtitle(TFSounds.ICE_CORE_DEATH, "mob/ice/death", 2); + this.generateNewSoundWithSubtitle(TFSounds.ICE_CORE_HURT, "mob/ice/hurt", 2); + this.generateExistingSoundWithSubtitle(TFSounds.ICE_CORE_SHOOT, SoundEvents.SNOWBALL_THROW); + + this.generateExistingSoundWithSubtitle(TFSounds.KING_SPIDER_AMBIENT, SoundEvents.SPIDER_AMBIENT); + this.generateExistingSoundWithSubtitle(TFSounds.KING_SPIDER_DEATH, SoundEvents.SPIDER_DEATH); + this.generateExistingSoundWithSubtitle(TFSounds.KING_SPIDER_HURT, SoundEvents.SPIDER_HURT); + this.makeStepSound(TFSounds.KING_SPIDER_STEP, SoundEvents.SPIDER_STEP); + + this.generateNewSoundWithSubtitle(TFSounds.KNIGHT_PHANTOM_AMBIENT, "mob/wraith/wraith", 4); + this.generateNewSoundWithSubtitle(TFSounds.KNIGHT_PHANTOM_DEATH, "mob/wraith/wraith", 4); + this.generateNewSoundWithSubtitle(TFSounds.KNIGHT_PHANTOM_HURT, "mob/wraith/wraith", 4); + this.generateExistingSoundWithSubtitle(TFSounds.KNIGHT_PHANTOM_THROW_AXE, SoundEvents.ARROW_SHOOT); + this.generateExistingSoundWithSubtitle(TFSounds.KNIGHT_PHANTOM_THROW_PICK, SoundEvents.ARROW_SHOOT); + + this.generateNewSoundWithSubtitle(TFSounds.KOBOLD_AMBIENT, "mob/kobold/ambient", 6); + this.generateNewSoundWithSubtitle(TFSounds.KOBOLD_DEATH, "mob/kobold/death", 3); + this.generateNewSoundWithSubtitle(TFSounds.KOBOLD_HURT, "mob/kobold/hurt", 3); + this.generateExistingSoundWithSubtitle(TFSounds.KOBOLD_MUNCH, SoundEvents.GENERIC_EAT); + + this.generateExistingSoundWithSubtitle(TFSounds.LICH_AMBIENT, SoundEvents.BLAZE_AMBIENT); + this.generateExistingSoundWithSubtitle(TFSounds.LICH_CLONE_HURT, SoundEvents.FIRE_EXTINGUISH); + this.generateExistingSoundWithSubtitle(TFSounds.LICH_DEATH, SoundEvents.BLAZE_DEATH); + this.generateExistingSoundWithSubtitle(TFSounds.LICH_HURT, SoundEvents.BLAZE_HURT); + this.generateExistingSoundWithSubtitle(TFSounds.LICH_POP_MOB, SoundEvents.CHICKEN_EGG); + this.generateExistingSoundWithSubtitle(TFSounds.LICH_SHOOT, SoundEvents.GHAST_SHOOT); + this.generateExistingSoundWithSubtitle(TFSounds.LICH_TELEPORT, SoundEvents.CHORUS_FRUIT_TELEPORT); + + this.generateExistingSoundWithSubtitle(TFSounds.LOYAL_ZOMBIE_AMBIENT, SoundEvents.ZOMBIE_AMBIENT); + this.generateExistingSoundWithSubtitle(TFSounds.LOYAL_ZOMBIE_DEATH, SoundEvents.ZOMBIE_DEATH); + this.generateExistingSoundWithSubtitle(TFSounds.LOYAL_ZOMBIE_HURT, SoundEvents.ZOMBIE_HURT); + this.makeStepSound(TFSounds.LOYAL_ZOMBIE_STEP, SoundEvents.ZOMBIE_STEP); + this.generateExistingSoundWithSubtitle(TFSounds.LOYAL_ZOMBIE_SUMMON, SoundEvents.ITEM_PICKUP); + + this.generateExistingSoundWithSubtitle(TFSounds.MAZE_SLIME_DEATH, SoundEvents.SLIME_DEATH); + this.generateExistingSoundWithSubtitle(TFSounds.MAZE_SLIME_HURT, SoundEvents.SLIME_HURT); + this.generateExistingSoundWithSubtitle(TFSounds.MAZE_SLIME_SQUISH, SoundEvents.SLIME_SQUISH); + + this.generateSoundWithCustomSubtitle(TFSounds.MAZE_SLIME_DEATH_SMALL, SoundEvents.SLIME_DEATH_SMALL, "subtitles.twilightforest.entity.maze_slime.death"); + this.generateSoundWithCustomSubtitle(TFSounds.MAZE_SLIME_HURT_SMALL, SoundEvents.SLIME_HURT_SMALL, "subtitles.twilightforest.entity.maze_slime.hurt"); + this.generateSoundWithCustomSubtitle(TFSounds.MAZE_SLIME_SQUISH_SMALL, SoundEvents.SLIME_SQUISH_SMALL, "subtitles.twilightforest.entity.maze_slime.squish"); + + this.generateExistingSoundWithSubtitle(TFSounds.MINION_AMBIENT, SoundEvents.ZOMBIE_AMBIENT); + this.generateExistingSoundWithSubtitle(TFSounds.MINION_DEATH, SoundEvents.ZOMBIE_DEATH); + this.generateExistingSoundWithSubtitle(TFSounds.MINION_HURT, SoundEvents.ZOMBIE_HURT); + this.makeStepSound(TFSounds.MINION_STEP, SoundEvents.ZOMBIE_STEP); + this.generateExistingSoundWithSubtitle(TFSounds.MINION_SUMMON, SoundEvents.ITEM_PICKUP); + + this.generateExistingSoundWithSubtitle(TFSounds.MINOSHROOM_AMBIENT, SoundEvents.COW_AMBIENT); + this.generateExistingSoundWithSubtitle(TFSounds.MINOSHROOM_ATTACK, SoundEvents.IRON_GOLEM_ATTACK); + this.generateExistingSoundWithSubtitle(TFSounds.MINOSHROOM_DEATH, SoundEvents.COW_DEATH); + this.generateExistingSoundWithSubtitle(TFSounds.MINOSHROOM_HURT, SoundEvents.COW_HURT); + this.generateExistingSoundWithSubtitle(TFSounds.MINOSHROOM_SLAM, SoundEvents.LIGHTNING_BOLT_IMPACT); + this.makeStepSound(TFSounds.MINOSHROOM_STEP, SoundEvents.COW_STEP); + + this.generateExistingSoundWithSubtitle(TFSounds.MINOTAUR_AMBIENT, SoundEvents.COW_AMBIENT); + this.generateExistingSoundWithSubtitle(TFSounds.MINOTAUR_ATTACK, SoundEvents.IRON_GOLEM_ATTACK); + this.generateExistingSoundWithSubtitle(TFSounds.MINOTAUR_DEATH, SoundEvents.COW_DEATH); + this.generateExistingSoundWithSubtitle(TFSounds.MINOTAUR_HURT, SoundEvents.COW_HURT); + this.makeStepSound(TFSounds.MINOTAUR_STEP, SoundEvents.COW_STEP); + + this.generateNewSoundWithSubtitle(TFSounds.MIST_WOLF_AMBIENT, "mob/mist_wolf/idle", 3); + this.generateExistingSoundWithSubtitle(TFSounds.MIST_WOLF_DEATH, SoundEvents.WOLF_DEATH); + this.generateNewSoundWithSubtitle(TFSounds.MIST_WOLF_HURT, "mob/mist_wolf/hurt", 2); + this.generateNewSoundWithSubtitle(TFSounds.MIST_WOLF_TARGET, "mob/mist_wolf/target", 1); + + this.generateNewSoundWithSubtitle(TFSounds.MOSQUITO, "mob/mosquito/animals132", 1); + + this.generateNewSoundWithSubtitle(TFSounds.NAGA_HISS, "mob/naga/hiss", 3); + this.generateNewSoundWithSubtitle(TFSounds.NAGA_HURT, "mob/naga/hurt", 3); + this.generateNewSoundWithSubtitle(TFSounds.NAGA_RATTLE, "mob/naga/rattle", 2); + + this.generateExistingSoundWithSubtitle(TFSounds.PINCH_BEETLE_DEATH, SoundEvents.SPIDER_DEATH); + this.generateExistingSoundWithSubtitle(TFSounds.PINCH_BEETLE_HURT, SoundEvents.SPIDER_HURT); + this.makeStepSound(TFSounds.PINCH_BEETLE_STEP, SoundEvents.SPIDER_STEP); + + this.generateExistingSoundWithSubtitle(TFSounds.QUEST_RAM_AMBIENT, SoundEvents.SHEEP_AMBIENT); + this.generateExistingSoundWithSubtitle(TFSounds.QUEST_RAM_DEATH, SoundEvents.SHEEP_DEATH); + this.generateExistingSoundWithSubtitle(TFSounds.QUEST_RAM_HURT, SoundEvents.SHEEP_HURT); + this.makeStepSound(TFSounds.QUEST_RAM_STEP, SoundEvents.SHEEP_STEP); + + this.generateNewSoundWithSubtitle(TFSounds.RAVEN_CAW, "mob/raven/caw", 2); + this.generateNewSoundWithSubtitle(TFSounds.RAVEN_SQUAWK, "mob/raven/squawk", 2); + + this.generateNewSoundWithSubtitle(TFSounds.REDCAP_AMBIENT, "mob/redcap/redcap", 6); + this.generateNewSoundWithSubtitle(TFSounds.REDCAP_DEATH, "mob/redcap/die", 3); + this.generateNewSoundWithSubtitle(TFSounds.REDCAP_HURT, "mob/redcap/hurt", 4); + + this.generateExistingSoundWithSubtitle(TFSounds.SHIELD_ADD, SoundEvents.CHICKEN_EGG); + this.generateExistingSoundWithSubtitle(TFSounds.SHIELD_BREAK, SoundEvents.ITEM_BREAK); + + this.generateExistingSoundWithSubtitle(TFSounds.SKELETON_DRUID_AMBIENT, SoundEvents.STRAY_AMBIENT); + this.generateExistingSoundWithSubtitle(TFSounds.SKELETON_DRUID_DEATH, SoundEvents.STRAY_DEATH); + this.generateExistingSoundWithSubtitle(TFSounds.SKELETON_DRUID_HURT, SoundEvents.STRAY_HURT); + this.generateExistingSoundWithSubtitle(TFSounds.SKELETON_DRUID_SHOOT, SoundEvents.GHAST_SHOOT); + this.makeStepSound(TFSounds.SKELETON_DRUID_STEP, SoundEvents.SKELETON_STEP); + + this.generateExistingSoundWithSubtitle(TFSounds.SLIME_BEETLE_DEATH, SoundEvents.SPIDER_DEATH); + this.generateExistingSoundWithSubtitle(TFSounds.SLIME_BEETLE_HURT, SoundEvents.SPIDER_HURT); + this.generateExistingSoundWithSubtitle(TFSounds.SLIME_BEETLE_SQUISH, SoundEvents.SLIME_SQUISH_SMALL); + this.makeStepSound(TFSounds.SLIME_BEETLE_STEP, SoundEvents.SPIDER_STEP); + + this.generateNewSoundWithSubtitle(TFSounds.SNOW_GUARDIAN_AMBIENT, "mob/ice/crackle", 2); + this.generateNewSoundWithSubtitle(TFSounds.SNOW_GUARDIAN_DEATH, "mob/ice/death", 2); + this.generateNewSoundWithSubtitle(TFSounds.SNOW_GUARDIAN_HURT, "mob/ice/hurt", 2); + + this.generateNewSoundWithSubtitle(TFSounds.SNOW_QUEEN_AMBIENT, "mob/ice/crackle", 2); + this.generateExistingSoundWithSubtitle(TFSounds.SNOW_QUEEN_ATTACK, SoundEvents.IRON_GOLEM_ATTACK); + this.generateExistingSoundWithSubtitle(TFSounds.SNOW_QUEEN_BREAK, SoundEvents.ITEM_BREAK); + this.generateNewSoundWithSubtitle(TFSounds.SNOW_QUEEN_DEATH, "mob/ice/death", 2); + this.generateNewSoundWithSubtitle(TFSounds.SNOW_QUEEN_HURT, "mob/ice/hurt", 2); + + this.generateExistingSoundWithSubtitle(TFSounds.SWARM_SPIDER_AMBIENT, SoundEvents.SPIDER_AMBIENT); + this.generateExistingSoundWithSubtitle(TFSounds.SWARM_SPIDER_DEATH, SoundEvents.SPIDER_DEATH); + this.generateExistingSoundWithSubtitle(TFSounds.SWARM_SPIDER_HURT, SoundEvents.SPIDER_HURT); + this.makeStepSound(TFSounds.SWARM_SPIDER_STEP, SoundEvents.SPIDER_STEP); + + this.generateExistingSoundWithSubtitle(TFSounds.TEAR_BREAK, SoundEvents.GLASS_BREAK); + + this.generateNewSoundWithSubtitle(TFSounds.TINY_BIRD_CHIRP, "mob/tiny_bird/chirp", 3); + this.generateNewSoundWithSubtitle(TFSounds.TINY_BIRD_HURT, "mob/tiny_bird/hurt", 2); + this.generateNewSoundWithSubtitle(TFSounds.TINY_BIRD_SONG, "mob/tiny_bird/song", 2); + this.generateExistingSoundWithSubtitle(TFSounds.TINY_BIRD_TAKEOFF, SoundEvents.BAT_TAKEOFF); + + this.generateExistingSoundWithSubtitle(TFSounds.TOWERWOOD_BORER_AMBIENT, SoundEvents.SILVERFISH_AMBIENT); + this.generateExistingSoundWithSubtitle(TFSounds.TOWERWOOD_BORER_DEATH, SoundEvents.SILVERFISH_DEATH); + this.generateExistingSoundWithSubtitle(TFSounds.TOWERWOOD_BORER_HURT, SoundEvents.SILVERFISH_HURT); + this.makeStepSound(TFSounds.TOWERWOOD_BORER_STEP, SoundEvents.SILVERFISH_STEP); + + this.generateExistingSoundWithSubtitle(TFSounds.TROLL_THROWS_ROCK, SoundEvents.ARROW_SHOOT); + + this.generateExistingSoundWithSubtitle(TFSounds.UR_GHAST_AMBIENT, SoundEvents.GHAST_AMBIENT); + this.generateExistingSoundWithSubtitle(TFSounds.UR_GHAST_DEATH, SoundEvents.GHAST_DEATH); + this.generateExistingSoundWithSubtitle(TFSounds.UR_GHAST_HURT, SoundEvents.GHAST_HURT); + this.generateExistingSoundWithSubtitle(TFSounds.UR_GHAST_SHOOT, SoundEvents.GHAST_SHOOT); + this.generateExistingSoundWithSubtitle(TFSounds.UR_GHAST_TANTRUM, SoundEvents.GHAST_HURT); + this.generateSoundWithCustomSubtitle(TFSounds.UR_GHAST_WARN, SoundEvents.GHAST_WARN, "subtitles.twilightforest.entity.ur_ghast.shoot"); + + this.generateNewSoundWithSubtitle(TFSounds.WINTER_WOLF_AMBIENT, "mob/mist_wolf/idle", 3); + this.generateExistingSoundWithSubtitle(TFSounds.WINTER_WOLF_DEATH, SoundEvents.WOLF_DEATH); + this.generateNewSoundWithSubtitle(TFSounds.WINTER_WOLF_HURT, "mob/mist_wolf/hurt", 2); + this.generateExistingSoundWithSubtitle(TFSounds.WINTER_WOLF_SHOOT, SoundEvents.GHAST_SHOOT); + this.generateNewSoundWithSubtitle(TFSounds.WINTER_WOLF_TARGET, "mob/mist_wolf/target", 1); + + this.generateNewSoundWithSubtitle(TFSounds.WRAITH_AMBIENT, "mob/wraith/wraith", 4); + this.generateNewSoundWithSubtitle(TFSounds.WRAITH_DEATH, "mob/wraith/wraith", 4); + this.generateNewSoundWithSubtitle(TFSounds.WRAITH_HURT, "mob/wraith/wraith", 4); + + this.generateNewSoundWithSubtitle(TFSounds.YETI_DEATH, "mob/alpha_yeti/death", 1); + this.generateNewSoundWithSubtitle(TFSounds.YETI_GRAB, "mob/alpha_yeti/grab", 1); + this.generateNewSoundWithSubtitle(TFSounds.YETI_GROWL, "mob/alpha_yeti/growl", 3); + this.generateNewSoundWithSubtitle(TFSounds.YETI_HURT, "mob/alpha_yeti/hurt", 3); + this.generateNewSoundWithSubtitle(TFSounds.YETI_THROW, "mob/alpha_yeti/throw", 1); + + + this.generateParrotSound(TFSounds.ALPHA_YETI_PARROT, TFSounds.ALPHA_YETI_GROWL.get()); + this.generateParrotSound(TFSounds.CARMINITE_GOLEM_PARROT, TFSounds.CARMINITE_GOLEM_HURT.get()); + this.generateParrotSound(TFSounds.DEATH_TOME_PARROT, TFSounds.DEATH_TOME_AMBIENT.get()); + this.generateParrotSound(TFSounds.HOSTILE_WOLF_PARROT, TFSounds.HOSTILE_WOLF_AMBIENT.get()); + this.generateParrotSound(TFSounds.HYDRA_PARROT, TFSounds.HYDRA_GROWL.get()); + this.generateParrotSound(TFSounds.ICE_CORE_PARROT, TFSounds.ICE_CORE_AMBIENT.get()); + this.generateParrotSound(TFSounds.KOBOLD_PARROT, TFSounds.KOBOLD_AMBIENT.get()); + this.generateParrotSound(TFSounds.MINOTAUR_PARROT, TFSounds.MINOTAUR_AMBIENT.get()); + this.generateParrotSound(TFSounds.MOSQUITO_PARROT, TFSounds.MOSQUITO.get()); + this.generateParrotSound(TFSounds.NAGA_PARROT, TFSounds.NAGA_HISS.get()); + this.generateParrotSound(TFSounds.REDCAP_PARROT, TFSounds.REDCAP_AMBIENT.get()); + this.generateParrotSound(TFSounds.WRAITH_PARROT, TFSounds.WRAITH_AMBIENT.get()); + + + this.generateNewSoundWithSubtitle(TFSounds.BEANSTALK_GROWTH, "random/beanstalk_grow", 1); + this.generateExistingSoundWithSubtitle(TFSounds.BLOCK_ANNIHILATED, SoundEvents.FIRE_EXTINGUISH); + this.generateExistingSoundWithSubtitle(TFSounds.BOSS_CHEST_APPEAR, SoundEvents.EVOKER_PREPARE_SUMMON); + this.generateExistingSoundWithSubtitle(TFSounds.BUG_SQUISH, SoundEvents.SLIME_SQUISH_SMALL); + this.generateExistingSoundWithSubtitle(TFSounds.BUILDER_CREATE, SoundEvents.COMPARATOR_CLICK); + this.generateExistingSoundWithSubtitle(TFSounds.BUILDER_OFF, SoundEvents.COMPARATOR_CLICK); + this.generateExistingSoundWithSubtitle(TFSounds.BUILDER_ON, SoundEvents.COMPARATOR_CLICK); + this.generateExistingSoundWithSubtitle(TFSounds.BUILDER_REPLACE, SoundEvents.ITEM_PICKUP); + this.generateNewSoundWithSubtitle(TFSounds.CASKET_CLOSE, "random/casket/close", 1); + this.generateExistingSoundWithSubtitle(TFSounds.CASKET_LOCKED, SoundEvents.CHEST_LOCKED); + this.generateNewSoundWithSubtitle(TFSounds.CASKET_OPEN, "random/casket/open", 1); + this.generateNewSoundWithSubtitle(TFSounds.CASKET_REPAIR, "random/casket/repair", 1); + this.generateNewSoundWithSubtitle(TFSounds.CICADA, "mob/cicada", 2); + this.generateExistingSoundWithSubtitle(TFSounds.DOOR_ACTIVATED, SoundEvents.COMPARATOR_CLICK); + this.generateExistingSoundWithSubtitle(TFSounds.DOOR_REAPPEAR, SoundEvents.FIRE_EXTINGUISH); + this.generateExistingSoundWithSubtitle(TFSounds.DOOR_VANISH, SoundEvents.FIRE_EXTINGUISH); + this.generateExistingSoundWithSubtitle(TFSounds.GHAST_TRAP_AMBIENT, SoundEvents.NOTE_BLOCK_HARP.get()); + this.generateNewSoundWithSubtitle(TFSounds.GHAST_TRAP_ON, "mob/ur_ghast/trap_on", 5); + this.generateNewSoundWithSubtitle(TFSounds.GHAST_TRAP_SPINDOWN, "mob/ur_ghast/trap_spin_down", 1); + this.generateNewSoundWithSubtitle(TFSounds.GHAST_TRAP_WARMUP, "mob/ur_ghast/trap_warmup", 1); + this.generateExistingSoundWithSubtitle(TFSounds.JET_ACTIVE, SoundEvents.GHAST_SHOOT); + this.generateExistingSoundWithSubtitle(TFSounds.JET_POP, SoundEvents.LAVA_POP); + this.generateExistingSoundWithSubtitle(TFSounds.JET_START, SoundEvents.COMPARATOR_CLICK); + this.generateExistingSoundWithSubtitle(TFSounds.LOCKED_VANISHING_BLOCK, SoundEvents.COMPARATOR_CLICK); + this.generateExistingSoundWithSubtitle(TFSounds.PEDESTAL_ACTIVATE, SoundEvents.ZOMBIE_INFECT); + this.generateExistingSoundWithSubtitle(TFSounds.PICKED_TORCHBERRIES, SoundEvents.SWEET_BERRY_BUSH_PICK_BERRIES); + this.generateExistingSoundWithSubtitle(TFSounds.PORTAL_WHOOSH, SoundEvents.PORTAL_AMBIENT); + this.generateExistingSoundWithSubtitle(TFSounds.REACTOR_AMBIENT, SoundEvents.PORTAL_AMBIENT); + this.generateExistingSoundWithSubtitle(TFSounds.REAPPEAR_BLOCK, SoundEvents.ITEM_PICKUP); + this.generateExistingSoundWithSubtitle(TFSounds.REAPPEAR_POOF, SoundEvents.ITEM_PICKUP); + this.generateNewSoundWithSubtitle(TFSounds.SLIDER, "random/creakgo2", 1); + this.generateExistingSoundWithSubtitle(TFSounds.SMOKER_START, SoundEvents.COMPARATOR_CLICK); + this.generateExistingSoundWithSubtitle(TFSounds.TIME_CORE, SoundEvents.COMPARATOR_CLICK); + this.generateExistingSoundWithSubtitle(TFSounds.TRANSFORMATION_CORE, SoundEvents.NOTE_BLOCK_HARP.get()); + this.generateExistingSound(TFSounds.UNCRAFTING_TABLE_ACTIVATE, SoundEvents.END_PORTAL_SPAWN, false); + this.generateExistingSoundWithSubtitle(TFSounds.UNLOCK_VANISHING_BLOCK, SoundEvents.COMPARATOR_CLICK); + this.generateExistingSoundWithSubtitle(TFSounds.VANISHING_BLOCK, SoundEvents.ITEM_PICKUP); + + + this.generateExistingSoundWithSubtitle(TFSounds.BLOCK_AND_CHAIN_COLLIDE, SoundEvents.ANVIL_LAND); + this.generateExistingSoundWithSubtitle(TFSounds.BLOCK_AND_CHAIN_FIRED, SoundEvents.ARROW_SHOOT); + this.generateExistingSoundWithSubtitle(TFSounds.BLOCK_AND_CHAIN_HIT, SoundEvents.IRON_GOLEM_ATTACK); + this.generateExistingSoundWithSubtitle(TFSounds.BRITTLE_FLASK_BREAK, SoundEvents.GLASS_BREAK); + this.generateExistingSoundWithSubtitle(TFSounds.BRITTLE_FLASK_CRACK, SoundEvents.GLASS_BREAK); + this.generateExistingSoundWithSubtitle(TFSounds.CHARM_KEEP, SoundEvents.ZOMBIE_VILLAGER_CONVERTED); + this.generateExistingSoundWithSubtitle(TFSounds.CHARM_LIFE, SoundEvents.TOTEM_USE); + this.generateNewSoundMC(TFSounds.FAN_WHOOSH, "random/breath", 1, true); + this.generateExistingSoundWithSubtitle(TFSounds.FLASK_FILL, SoundEvents.BREWING_STAND_BREW); + this.generateExistingSoundWithSubtitle(TFSounds.GLASS_SWORD_BREAK, SoundEvents.GLASS_BREAK); + this.generateExistingSoundWithSubtitle(TFSounds.ICE_BOMB_FIRED, SoundEvents.ARROW_SHOOT); + this.generateExistingSoundWithSubtitle(TFSounds.KNIGHTMETAL_EQUIP, SoundEvents.ARMOR_EQUIP_NETHERITE); + this.generateExistingSoundWithSubtitle(TFSounds.LAMP_BURN, SoundEvents.GHAST_SHOOT); + this.generateExistingSoundWithSubtitle(TFSounds.MAGNET_GRAB, SoundEvents.CHORUS_FRUIT_TELEPORT); + this.generateExistingSoundWithSubtitle(TFSounds.METAL_SHIELD_SHATTERS, SoundEvents.ZOMBIE_ATTACK_IRON_DOOR); + this.generateExistingSoundWithSubtitle(TFSounds.MOONWORM_SQUISH, SoundEvents.SLIME_SQUISH_SMALL); + this.generateExistingSoundWithSubtitle(TFSounds.POWDER_USE, SoundEvents.ZOMBIE_VILLAGER_CURE); + this.generateExistingSoundWithSubtitle(TFSounds.SCEPTER_DRAIN, SoundEvents.GENERIC_BIG_FALL); + this.generateExistingSoundWithSubtitle(TFSounds.SCEPTER_PEARL, SoundEvents.FLINTANDSTEEL_USE); + this.generateExistingSoundWithSubtitle(TFSounds.WOOD_SHIELD_SHATTERS, SoundEvents.ZOMBIE_BREAK_WOODEN_DOOR); + + this.makeMusicDisc(TFSounds.MUSIC_DISC_RADIANCE, "radiance"); + this.makeMusicDisc(TFSounds.MUSIC_DISC_STEPS, "steps"); + this.makeMusicDisc(TFSounds.MUSIC_DISC_SUPERSTITIOUS, "superstitious"); + this.makeMusicDisc(TFSounds.MUSIC_DISC_HOME, "home"); + this.makeMusicDisc(TFSounds.MUSIC_DISC_WAYFARER, "wayfarer"); + this.makeMusicDisc(TFSounds.MUSIC_DISC_FINDINGS, "findings"); + this.makeMusicDisc(TFSounds.MUSIC_DISC_MAKER, "maker"); + this.makeMusicDisc(TFSounds.MUSIC_DISC_THREAD, "thread"); + this.makeMusicDisc(TFSounds.MUSIC_DISC_MOTION, "motion"); + + this.add(TFSounds.MUSIC, SoundDefinition.definition().with( + SoundDefinition.Sound.sound(new ResourceLocation(TwilightForestMod.ID, "music/superstitious"), SoundDefinition.SoundType.SOUND).stream().volume(0.5F), + SoundDefinition.Sound.sound(new ResourceLocation(TwilightForestMod.ID, "music/steps"), SoundDefinition.SoundType.SOUND).stream().volume(0.5F), + SoundDefinition.Sound.sound(new ResourceLocation(TwilightForestMod.ID, "music/radiance"), SoundDefinition.SoundType.SOUND).stream().volume(0.5F), + SoundDefinition.Sound.sound(new ResourceLocation(TwilightForestMod.ID, "music/home"), SoundDefinition.SoundType.SOUND).stream().volume(0.5F), + SoundDefinition.Sound.sound(new ResourceLocation(TwilightForestMod.ID, "music/wayfarer"), SoundDefinition.SoundType.SOUND).stream().volume(0.5F), + SoundDefinition.Sound.sound(new ResourceLocation(TwilightForestMod.ID, "music/findings"), SoundDefinition.SoundType.SOUND).stream().volume(0.5F), + SoundDefinition.Sound.sound(new ResourceLocation(TwilightForestMod.ID, "music/maker"), SoundDefinition.SoundType.SOUND).stream().volume(0.5F), + SoundDefinition.Sound.sound(new ResourceLocation(TwilightForestMod.ID, "music/thread"), SoundDefinition.SoundType.SOUND).stream().volume(0.5F), + SoundDefinition.Sound.sound(new ResourceLocation(TwilightForestMod.ID, "music/motion"), SoundDefinition.SoundType.SOUND).stream().volume(0.5F))); + } +} diff --git a/src/main/java/twilightforest/data/SpecialLootTables.java b/src/main/java/twilightforest/data/SpecialLootTables.java new file mode 100644 index 0000000000..32b273b712 --- /dev/null +++ b/src/main/java/twilightforest/data/SpecialLootTables.java @@ -0,0 +1,21 @@ +package twilightforest.data; + +import net.minecraft.data.loot.LootTableSubProvider; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.storage.loot.LootPool; +import net.minecraft.world.level.storage.loot.LootTable; +import net.minecraft.world.level.storage.loot.entries.LootItem; +import net.minecraft.world.level.storage.loot.providers.number.ConstantValue; +import twilightforest.loot.TFLootTables; + +import java.util.function.BiConsumer; + +public class SpecialLootTables implements LootTableSubProvider { + @Override + public void generate(BiConsumer consumer) { + consumer.accept(TFLootTables.CICADA_SQUISH_DROPS, LootTable.lootTable().withPool(LootPool.lootPool().setRolls(ConstantValue.exactly(1)).add(LootItem.lootTableItem(Items.GRAY_DYE)))); + consumer.accept(TFLootTables.FIREFLY_SQUISH_DROPS, LootTable.lootTable().withPool(LootPool.lootPool().setRolls(ConstantValue.exactly(1)).add(LootItem.lootTableItem(Items.GLOWSTONE_DUST)))); + consumer.accept(TFLootTables.MOONWORM_SQUISH_DROPS, LootTable.lootTable().withPool(LootPool.lootPool().setRolls(ConstantValue.exactly(1)).add(LootItem.lootTableItem(Items.LIME_DYE)))); + } +} diff --git a/src/main/java/twilightforest/data/StonecuttingGenerator.java b/src/main/java/twilightforest/data/StonecuttingGenerator.java new file mode 100644 index 0000000000..f1546378a1 --- /dev/null +++ b/src/main/java/twilightforest/data/StonecuttingGenerator.java @@ -0,0 +1,147 @@ +package twilightforest.data; + +import com.google.gson.JsonObject; +import net.minecraft.data.DataGenerator; +import net.minecraft.data.PackOutput; +import net.minecraft.data.recipes.FinishedRecipe; +import net.minecraft.data.recipes.RecipeProvider; +import net.minecraft.data.recipes.SingleItemRecipeBuilder; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.level.ItemLike; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.Blocks; +import net.minecraftforge.registries.ForgeRegistries; +import twilightforest.init.TFBlocks; + +import org.jetbrains.annotations.Nullable; +import java.util.function.Consumer; + +import static twilightforest.TwilightForestMod.prefix; + +public class StonecuttingGenerator { + + protected static void buildRecipes(Consumer consumer) { + consumer.accept(stonecutting(TFBlocks.CASTLE_BRICK.get(), TFBlocks.THICK_CASTLE_BRICK.get())); + consumer.accept(stonecutting(TFBlocks.CRACKED_CASTLE_BRICK.get(), TFBlocks.THICK_CASTLE_BRICK.get())); + consumer.accept(stonecutting(TFBlocks.WORN_CASTLE_BRICK.get(), TFBlocks.THICK_CASTLE_BRICK.get())); + consumer.accept(stonecutting(TFBlocks.MOSSY_CASTLE_BRICK.get(), TFBlocks.THICK_CASTLE_BRICK.get())); + + consumer.accept(stonecutting(TFBlocks.CASTLE_BRICK.get(), TFBlocks.WORN_CASTLE_BRICK.get())); + consumer.accept(stonecutting(TFBlocks.THICK_CASTLE_BRICK.get(), TFBlocks.BOLD_CASTLE_BRICK_PILLAR.get())); + consumer.accept(stonecutting(TFBlocks.BOLD_CASTLE_BRICK_PILLAR.get(), TFBlocks.BOLD_CASTLE_BRICK_TILE.get())); + consumer.accept(stonecutting(TFBlocks.ENCASED_CASTLE_BRICK_PILLAR.get(), TFBlocks.ENCASED_CASTLE_BRICK_TILE.get())); + + consumer.accept(stonecutting(TFBlocks.ENCASED_CASTLE_BRICK_PILLAR.get(), TFBlocks.ENCASED_CASTLE_BRICK_STAIRS.get())); + consumer.accept(stonecutting(TFBlocks.BOLD_CASTLE_BRICK_PILLAR.get(), TFBlocks.BOLD_CASTLE_BRICK_STAIRS.get())); + consumer.accept(stonecutting(TFBlocks.CASTLE_BRICK.get(), TFBlocks.CASTLE_BRICK_STAIRS.get())); + consumer.accept(stonecutting(TFBlocks.WORN_CASTLE_BRICK.get(), TFBlocks.WORN_CASTLE_BRICK_STAIRS.get())); + consumer.accept(stonecutting(TFBlocks.CRACKED_CASTLE_BRICK.get(), TFBlocks.CRACKED_CASTLE_BRICK_STAIRS.get())); + consumer.accept(stonecutting(TFBlocks.MOSSY_CASTLE_BRICK.get(), TFBlocks.MOSSY_CASTLE_BRICK_STAIRS.get())); + + consumer.accept(stonecutting(TFBlocks.ETCHED_NAGASTONE.get(), TFBlocks.NAGASTONE_STAIRS_LEFT.get())); + consumer.accept(stonecutting(TFBlocks.ETCHED_NAGASTONE.get(), TFBlocks.NAGASTONE_STAIRS_RIGHT.get())); + consumer.accept(stonecutting(TFBlocks.MOSSY_ETCHED_NAGASTONE.get(), TFBlocks.MOSSY_NAGASTONE_STAIRS_LEFT.get())); + consumer.accept(stonecutting(TFBlocks.MOSSY_ETCHED_NAGASTONE.get(), TFBlocks.MOSSY_NAGASTONE_STAIRS_RIGHT.get())); + consumer.accept(stonecutting(TFBlocks.CRACKED_ETCHED_NAGASTONE.get(), TFBlocks.CRACKED_NAGASTONE_STAIRS_LEFT.get())); + consumer.accept(stonecutting(TFBlocks.CRACKED_ETCHED_NAGASTONE.get(), TFBlocks.CRACKED_NAGASTONE_STAIRS_RIGHT.get())); + + consumer.accept(stonecutting(TFBlocks.NAGASTONE_STAIRS_RIGHT.get(), TFBlocks.NAGASTONE_STAIRS_LEFT.get())); + consumer.accept(stonecutting(TFBlocks.NAGASTONE_STAIRS_LEFT.get(), TFBlocks.NAGASTONE_STAIRS_RIGHT.get())); + consumer.accept(stonecutting(TFBlocks.MOSSY_NAGASTONE_STAIRS_RIGHT.get(), TFBlocks.MOSSY_NAGASTONE_STAIRS_LEFT.get())); + consumer.accept(stonecutting(TFBlocks.MOSSY_NAGASTONE_STAIRS_LEFT.get(), TFBlocks.MOSSY_NAGASTONE_STAIRS_RIGHT.get())); + consumer.accept(stonecutting(TFBlocks.CRACKED_NAGASTONE_STAIRS_RIGHT.get(), TFBlocks.CRACKED_NAGASTONE_STAIRS_LEFT.get())); + consumer.accept(stonecutting(TFBlocks.CRACKED_NAGASTONE_STAIRS_LEFT.get(), TFBlocks.CRACKED_NAGASTONE_STAIRS_RIGHT.get())); + + consumer.accept(stonecutting(TFBlocks.DARK_LOG.get(), TFBlocks.TOWERWOOD.get())); + consumer.accept(stonecutting(TFBlocks.DARK_WOOD.get(), TFBlocks.TOWERWOOD.get())); + consumer.accept(stonecutting(TFBlocks.TOWERWOOD.get(), TFBlocks.ENCASED_TOWERWOOD.get())); + + consumer.accept(stonecutting(TFBlocks.MAZESTONE.get(), TFBlocks.MAZESTONE_BORDER.get())); + consumer.accept(stonecutting(TFBlocks.MAZESTONE.get(), TFBlocks.MAZESTONE_BRICK.get())); + consumer.accept(stonecutting(TFBlocks.MAZESTONE.get(), TFBlocks.CUT_MAZESTONE.get())); + consumer.accept(stonecutting(TFBlocks.MAZESTONE.get(), TFBlocks.DECORATIVE_MAZESTONE.get())); + consumer.accept(stonecutting(TFBlocks.MAZESTONE.get(), TFBlocks.MAZESTONE_MOSAIC.get())); + + consumer.accept(stonecutting(TFBlocks.MAZESTONE_BRICK.get(), TFBlocks.MAZESTONE_BORDER.get())); + consumer.accept(stonecutting(TFBlocks.MAZESTONE_BRICK.get(), TFBlocks.CUT_MAZESTONE.get())); + consumer.accept(stonecutting(TFBlocks.MAZESTONE_BRICK.get(), TFBlocks.DECORATIVE_MAZESTONE.get())); + consumer.accept(stonecutting(TFBlocks.MAZESTONE_BRICK.get(), TFBlocks.MAZESTONE_MOSAIC.get())); + + consumer.accept(stonecutting(TFBlocks.MAZESTONE_BORDER.get(), TFBlocks.MAZESTONE_BRICK.get())); + consumer.accept(stonecutting(TFBlocks.MAZESTONE_BORDER.get(), TFBlocks.CUT_MAZESTONE.get())); + consumer.accept(stonecutting(TFBlocks.MAZESTONE_BORDER.get(), TFBlocks.DECORATIVE_MAZESTONE.get())); + consumer.accept(stonecutting(TFBlocks.MAZESTONE_BORDER.get(), TFBlocks.MAZESTONE_MOSAIC.get())); + + consumer.accept(stonecutting(TFBlocks.CUT_MAZESTONE.get(), TFBlocks.MAZESTONE_BORDER.get())); + consumer.accept(stonecutting(TFBlocks.CUT_MAZESTONE.get(), TFBlocks.MAZESTONE_BRICK.get())); + consumer.accept(stonecutting(TFBlocks.CUT_MAZESTONE.get(), TFBlocks.DECORATIVE_MAZESTONE.get())); + consumer.accept(stonecutting(TFBlocks.CUT_MAZESTONE.get(), TFBlocks.MAZESTONE_MOSAIC.get())); + + consumer.accept(stonecutting(TFBlocks.DECORATIVE_MAZESTONE.get(), TFBlocks.MAZESTONE_BORDER.get())); + consumer.accept(stonecutting(TFBlocks.DECORATIVE_MAZESTONE.get(), TFBlocks.CUT_MAZESTONE.get())); + consumer.accept(stonecutting(TFBlocks.DECORATIVE_MAZESTONE.get(), TFBlocks.MAZESTONE_BRICK.get())); + consumer.accept(stonecutting(TFBlocks.DECORATIVE_MAZESTONE.get(), TFBlocks.MAZESTONE_MOSAIC.get())); + + consumer.accept(stonecutting(TFBlocks.MAZESTONE_MOSAIC.get(), TFBlocks.MAZESTONE_BORDER.get())); + consumer.accept(stonecutting(TFBlocks.MAZESTONE_MOSAIC.get(), TFBlocks.CUT_MAZESTONE.get())); + consumer.accept(stonecutting(TFBlocks.MAZESTONE_MOSAIC.get(), TFBlocks.DECORATIVE_MAZESTONE.get())); + consumer.accept(stonecutting(TFBlocks.MAZESTONE_MOSAIC.get(), TFBlocks.MAZESTONE_BRICK.get())); + + consumer.accept(stonecutting(TFBlocks.TWILIGHT_OAK_LOG.get(), TFBlocks.HOLLOW_TWILIGHT_OAK_LOG_HORIZONTAL.get())); + consumer.accept(stonecutting(TFBlocks.CANOPY_LOG.get(), TFBlocks.HOLLOW_CANOPY_LOG_HORIZONTAL.get())); + consumer.accept(stonecutting(TFBlocks.MANGROVE_LOG.get(), TFBlocks.HOLLOW_MANGROVE_LOG_HORIZONTAL.get())); + consumer.accept(stonecutting(TFBlocks.DARK_LOG.get(), TFBlocks.HOLLOW_DARK_LOG_HORIZONTAL.get())); + consumer.accept(stonecutting(TFBlocks.TIME_LOG.get(), TFBlocks.HOLLOW_TIME_LOG_HORIZONTAL.get())); + consumer.accept(stonecutting(TFBlocks.TRANSFORMATION_LOG.get(), TFBlocks.HOLLOW_TRANSFORMATION_LOG_HORIZONTAL.get())); + consumer.accept(stonecutting(TFBlocks.MINING_LOG.get(), TFBlocks.HOLLOW_MINING_LOG_HORIZONTAL.get())); + consumer.accept(stonecutting(TFBlocks.SORTING_LOG.get(), TFBlocks.HOLLOW_SORTING_LOG_HORIZONTAL.get())); + + consumer.accept(stonecutting(Blocks.OAK_LOG, TFBlocks.HOLLOW_OAK_LOG_HORIZONTAL.get())); + consumer.accept(stonecutting(Blocks.SPRUCE_LOG, TFBlocks.HOLLOW_SPRUCE_LOG_HORIZONTAL.get())); + consumer.accept(stonecutting(Blocks.BIRCH_LOG, TFBlocks.HOLLOW_BIRCH_LOG_HORIZONTAL.get())); + consumer.accept(stonecutting(Blocks.JUNGLE_LOG, TFBlocks.HOLLOW_JUNGLE_LOG_HORIZONTAL.get())); + consumer.accept(stonecutting(Blocks.ACACIA_LOG, TFBlocks.HOLLOW_ACACIA_LOG_HORIZONTAL.get())); + consumer.accept(stonecutting(Blocks.DARK_OAK_LOG, TFBlocks.HOLLOW_DARK_OAK_LOG_HORIZONTAL.get())); + consumer.accept(stonecutting(Blocks.CRIMSON_STEM, TFBlocks.HOLLOW_CRIMSON_STEM_HORIZONTAL.get())); + consumer.accept(stonecutting(Blocks.WARPED_STEM, TFBlocks.HOLLOW_WARPED_STEM_HORIZONTAL.get())); + consumer.accept(stonecutting(Blocks.MANGROVE_LOG, TFBlocks.HOLLOW_VANGROVE_LOG_HORIZONTAL.get())); + consumer.accept(stonecutting(Blocks.STONE, TFBlocks.TWISTED_STONE.get())); + consumer.accept(stonecutting(Blocks.STONE, TFBlocks.BOLD_STONE_PILLAR.get())); + + consumer.accept(stonecutting(TFBlocks.UNDERBRICK.get(), TFBlocks.UNDERBRICK_FLOOR.get())); + } + + private static Wrapper stonecutting(ItemLike input, ItemLike output) { + return stonecutting(input, output, 1); + } + + private static Wrapper stonecutting(ItemLike input, ItemLike output, int count) { + return new Wrapper(getIdFor(input.asItem(), output.asItem()), Ingredient.of(input), output.asItem(), count); + } + + private static ResourceLocation getIdFor(Item input, Item output) { + String path = String.format("stonecutting/%s/%s", ForgeRegistries.ITEMS.getKey(input).getPath(), ForgeRegistries.ITEMS.getKey(output).getPath()); + return prefix(path); + } + + // Wrapper that allows you to not have an advancement + public static class Wrapper extends SingleItemRecipeBuilder.Result { + public Wrapper(ResourceLocation id, Ingredient input, Item output, int count) { + super(id, RecipeSerializer.STONECUTTER, "", input, output, count, null, null); + } + + @Nullable + @Override + public JsonObject serializeAdvancement() { + return null; + } + + @Nullable + @Override + public ResourceLocation getAdvancementId() { + return null; + } + } +} diff --git a/src/main/java/twilightforest/data/TFAdvancementGenerator.java b/src/main/java/twilightforest/data/TFAdvancementGenerator.java new file mode 100644 index 0000000000..4404560bf1 --- /dev/null +++ b/src/main/java/twilightforest/data/TFAdvancementGenerator.java @@ -0,0 +1,558 @@ +package twilightforest.data; + +import net.minecraft.advancements.*; +import net.minecraft.advancements.critereon.*; +import net.minecraft.core.HolderLookup; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.stats.Stats; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.alchemy.Potions; +import net.minecraft.world.level.ItemLike; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.predicates.LootItemEntityPropertyCondition; +import net.minecraftforge.common.data.ExistingFileHelper; +import net.minecraftforge.common.data.ForgeAdvancementProvider; +import net.minecraftforge.registries.ForgeRegistries; +import twilightforest.TwilightForestMod; +import twilightforest.advancements.*; +import twilightforest.block.Experiment115Block; +import twilightforest.init.*; +import twilightforest.world.registration.TFGenerationSettings; + +import java.util.function.Consumer; + +public class TFAdvancementGenerator implements ForgeAdvancementProvider.AdvancementGenerator { + + private static final EntityType[] TF_KILLABLE = new EntityType[]{TFEntities.ADHERENT.get(), TFEntities.ARMORED_GIANT.get(), TFEntities.BIGHORN_SHEEP.get(), TFEntities.BLOCKCHAIN_GOBLIN.get(), TFEntities.DWARF_RABBIT.get(), TFEntities.DEATH_TOME.get(), TFEntities.DEER.get(), TFEntities.FIRE_BEETLE.get(), TFEntities.GIANT_MINER.get(), TFEntities.LOWER_GOBLIN_KNIGHT.get(), TFEntities.UPPER_GOBLIN_KNIGHT.get(), TFEntities.HARBINGER_CUBE.get(), TFEntities.HEDGE_SPIDER.get(), TFEntities.HELMET_CRAB.get(), TFEntities.HOSTILE_WOLF.get(), TFEntities.HYDRA.get(), TFEntities.KING_SPIDER.get(), TFEntities.KNIGHT_PHANTOM.get(), TFEntities.KOBOLD.get(), TFEntities.LICH.get(), TFEntities.LICH_MINION.get(), TFEntities.MAZE_SLIME.get(), TFEntities.CARMINITE_GHASTLING.get(), TFEntities.MINOSHROOM.get(), TFEntities.MINOTAUR.get(), TFEntities.MIST_WOLF.get(), TFEntities.MOSQUITO_SWARM.get(), TFEntities.NAGA.get(), TFEntities.PENGUIN.get(), TFEntities.PINCH_BEETLE.get(), TFEntities.PLATEAU_BOSS.get(), TFEntities.QUEST_RAM.get(), TFEntities.RAVEN.get(), TFEntities.REDCAP.get(), TFEntities.REDCAP_SAPPER.get(), TFEntities.SKELETON_DRUID.get(), TFEntities.SLIME_BEETLE.get(), TFEntities.SNOW_GUARDIAN.get(), TFEntities.SNOW_QUEEN.get(), TFEntities.SQUIRREL.get(), TFEntities.STABLE_ICE_CORE.get(), TFEntities.SWARM_SPIDER.get(), TFEntities.TINY_BIRD.get(), TFEntities.CARMINITE_BROODLING.get(), TFEntities.CARMINITE_GHASTGUARD.get(), TFEntities.CARMINITE_GOLEM.get(), TFEntities.TOWERWOOD_BORER.get(), TFEntities.TROLL.get(), TFEntities.UNSTABLE_ICE_CORE.get(), TFEntities.UR_GHAST.get(), TFEntities.BOAR.get(), TFEntities.WINTER_WOLF.get(), TFEntities.WRAITH.get(), TFEntities.YETI.get(), TFEntities.ALPHA_YETI.get()}; + //man this is a pain + private static final ItemLike[] DENDROLOGIST_BLOCKS = new ItemLike[]{ + TFBlocks.TWILIGHT_OAK_LOG.get(), TFBlocks.TWILIGHT_OAK_WOOD.get(), TFBlocks.STRIPPED_TWILIGHT_OAK_LOG.get(), TFBlocks.STRIPPED_TWILIGHT_OAK_WOOD.get(), TFBlocks.HOLLOW_TWILIGHT_OAK_LOG_HORIZONTAL.get(), TFBlocks.TWILIGHT_OAK_LEAVES.get(), TFBlocks.TWILIGHT_OAK_SAPLING.get(), TFBlocks.TWILIGHT_OAK_PLANKS.get(), TFBlocks.TWILIGHT_OAK_SLAB.get(), TFBlocks.TWILIGHT_OAK_STAIRS.get(), TFBlocks.TWILIGHT_OAK_BUTTON.get(), TFBlocks.TWILIGHT_OAK_FENCE.get(), TFBlocks.TWILIGHT_OAK_GATE.get(), TFBlocks.TWILIGHT_OAK_PLATE.get(), TFBlocks.TWILIGHT_OAK_DOOR.get(), TFBlocks.TWILIGHT_OAK_TRAPDOOR.get(), TFBlocks.TWILIGHT_OAK_SIGN.get(), TFBlocks.TWILIGHT_OAK_CHEST.get(), TFBlocks.TWILIGHT_OAK_BANISTER.get(), TFItems.TWILIGHT_OAK_BOAT.get(), TFItems.TWILIGHT_OAK_CHEST_BOAT.get(), + TFBlocks.CANOPY_LOG.get(), TFBlocks.CANOPY_WOOD.get(), TFBlocks.STRIPPED_CANOPY_LOG.get(), TFBlocks.STRIPPED_CANOPY_WOOD.get(), TFBlocks.HOLLOW_CANOPY_LOG_HORIZONTAL.get(), TFBlocks.CANOPY_LEAVES.get(), TFBlocks.CANOPY_SAPLING.get(), TFBlocks.CANOPY_PLANKS.get(), TFBlocks.CANOPY_SLAB.get(), TFBlocks.CANOPY_STAIRS.get(), TFBlocks.CANOPY_BUTTON.get(), TFBlocks.CANOPY_FENCE.get(), TFBlocks.CANOPY_GATE.get(), TFBlocks.CANOPY_PLATE.get(), TFBlocks.CANOPY_DOOR.get(), TFBlocks.CANOPY_TRAPDOOR.get(), TFBlocks.CANOPY_SIGN.get(), TFBlocks.CANOPY_CHEST.get(), TFBlocks.CANOPY_BANISTER.get(), TFBlocks.CANOPY_BOOKSHELF.get(), TFBlocks.EMPTY_CANOPY_BOOKSHELF.get(), TFItems.CANOPY_BOAT.get(), TFItems.CANOPY_CHEST_BOAT.get(), + TFBlocks.MANGROVE_LOG.get(), TFBlocks.MANGROVE_WOOD.get(), TFBlocks.STRIPPED_MANGROVE_LOG.get(), TFBlocks.STRIPPED_MANGROVE_WOOD.get(), TFBlocks.HOLLOW_MANGROVE_LOG_HORIZONTAL.get(), TFBlocks.MANGROVE_LEAVES.get(), TFBlocks.MANGROVE_SAPLING.get(), TFBlocks.MANGROVE_PLANKS.get(), TFBlocks.MANGROVE_SLAB.get(), TFBlocks.MANGROVE_STAIRS.get(), TFBlocks.MANGROVE_BUTTON.get(), TFBlocks.MANGROVE_FENCE.get(), TFBlocks.MANGROVE_GATE.get(), TFBlocks.MANGROVE_PLATE.get(), TFBlocks.MANGROVE_DOOR.get(), TFBlocks.MANGROVE_TRAPDOOR.get(), TFBlocks.MANGROVE_SIGN.get(), TFBlocks.MANGROVE_CHEST.get(), TFBlocks.MANGROVE_BANISTER.get(), TFItems.MANGROVE_BOAT.get(), TFItems.MANGROVE_CHEST_BOAT.get(), + TFBlocks.DARK_LOG.get(), TFBlocks.DARK_WOOD.get(), TFBlocks.STRIPPED_DARK_LOG.get(), TFBlocks.STRIPPED_DARK_WOOD.get(), TFBlocks.HOLLOW_DARK_LOG_HORIZONTAL.get(), TFBlocks.DARK_LEAVES.get(), TFBlocks.DARKWOOD_SAPLING.get(), TFBlocks.DARK_PLANKS.get(), TFBlocks.DARK_SLAB.get(), TFBlocks.DARK_STAIRS.get(), TFBlocks.DARK_BUTTON.get(), TFBlocks.DARK_FENCE.get(), TFBlocks.DARK_GATE.get(), TFBlocks.DARK_PLATE.get(), TFBlocks.DARK_DOOR.get(), TFBlocks.DARK_TRAPDOOR.get(), TFBlocks.DARK_SIGN.get(), TFBlocks.DARK_CHEST.get(), TFBlocks.DARK_BANISTER.get(), TFItems.DARKWOOD_BOAT.get(), TFItems.DARKWOOD_CHEST_BOAT.get(), + TFBlocks.TIME_LOG.get(), TFBlocks.TIME_WOOD.get(), TFBlocks.STRIPPED_TIME_LOG.get(), TFBlocks.STRIPPED_TIME_WOOD.get(), TFBlocks.HOLLOW_TIME_LOG_HORIZONTAL.get(), TFBlocks.TIME_LEAVES.get(), TFBlocks.TIME_SAPLING.get(), TFBlocks.TIME_PLANKS.get(), TFBlocks.TIME_SLAB.get(), TFBlocks.TIME_STAIRS.get(), TFBlocks.TIME_BUTTON.get(), TFBlocks.TIME_FENCE.get(), TFBlocks.TIME_GATE.get(), TFBlocks.TIME_PLATE.get(), TFBlocks.TIME_DOOR.get(), TFBlocks.TIME_TRAPDOOR.get(), TFBlocks.TIME_SIGN.get(), TFBlocks.TIME_CHEST.get(), TFBlocks.TIME_BANISTER.get(), TFItems.TIME_BOAT.get(), TFItems.TIME_CHEST_BOAT.get(), + TFBlocks.TRANSFORMATION_LOG.get(), TFBlocks.TRANSFORMATION_WOOD.get(), TFBlocks.STRIPPED_TRANSFORMATION_LOG.get(), TFBlocks.STRIPPED_TRANSFORMATION_WOOD.get(), TFBlocks.HOLLOW_TRANSFORMATION_LOG_HORIZONTAL.get(), TFBlocks.TRANSFORMATION_LEAVES.get(), TFBlocks.TRANSFORMATION_SAPLING.get(), TFBlocks.TRANSFORMATION_PLANKS.get(), TFBlocks.TRANSFORMATION_SLAB.get(), TFBlocks.TRANSFORMATION_STAIRS.get(), TFBlocks.TRANSFORMATION_BUTTON.get(), TFBlocks.TRANSFORMATION_FENCE.get(), TFBlocks.TRANSFORMATION_GATE.get(), TFBlocks.TRANSFORMATION_PLATE.get(), TFBlocks.TRANSFORMATION_DOOR.get(), TFBlocks.TRANSFORMATION_TRAPDOOR.get(), TFBlocks.TRANSFORMATION_SIGN.get(), TFBlocks.TRANSFORMATION_CHEST.get(), TFBlocks.TRANSFORMATION_BANISTER.get(), TFItems.TRANSFORMATION_BOAT.get(), TFItems.TRANSFORMATION_CHEST_BOAT.get(), + TFBlocks.MINING_LOG.get(), TFBlocks.MINING_WOOD.get(), TFBlocks.STRIPPED_MINING_LOG.get(), TFBlocks.STRIPPED_MINING_WOOD.get(), TFBlocks.HOLLOW_MINING_LOG_HORIZONTAL.get(), TFBlocks.MINING_LEAVES.get(), TFBlocks.MINING_SAPLING.get(), TFBlocks.MINING_PLANKS.get(), TFBlocks.MINING_SLAB.get(), TFBlocks.MINING_STAIRS.get(), TFBlocks.MINING_BUTTON.get(), TFBlocks.MINING_FENCE.get(), TFBlocks.MINING_GATE.get(), TFBlocks.MINING_PLATE.get(), TFBlocks.MINING_DOOR.get(), TFBlocks.MINING_TRAPDOOR.get(), TFBlocks.MINING_SIGN.get(), TFBlocks.MINING_CHEST.get(), TFBlocks.MINING_BANISTER.get(), TFItems.MINING_BOAT.get(), TFItems.MINING_CHEST_BOAT.get(), + TFBlocks.SORTING_LOG.get(), TFBlocks.SORTING_WOOD.get(), TFBlocks.STRIPPED_SORTING_LOG.get(), TFBlocks.STRIPPED_SORTING_WOOD.get(), TFBlocks.HOLLOW_SORTING_LOG_HORIZONTAL.get(), TFBlocks.SORTING_LEAVES.get(), TFBlocks.SORTING_SAPLING.get(), TFBlocks.SORTING_PLANKS.get(), TFBlocks.SORTING_SLAB.get(), TFBlocks.SORTING_STAIRS.get(), TFBlocks.SORTING_BUTTON.get(), TFBlocks.SORTING_FENCE.get(), TFBlocks.SORTING_GATE.get(), TFBlocks.SORTING_PLATE.get(), TFBlocks.SORTING_DOOR.get(), TFBlocks.SORTING_TRAPDOOR.get(), TFBlocks.SORTING_SIGN.get(), TFBlocks.SORTING_CHEST.get(), TFBlocks.SORTING_BANISTER.get(), TFItems.SORTING_BOAT.get(), TFItems.SORTING_CHEST_BOAT.get(), + TFBlocks.TOWERWOOD.get(), TFBlocks.CRACKED_TOWERWOOD.get(), TFBlocks.MOSSY_TOWERWOOD.get(), TFBlocks.ENCASED_TOWERWOOD.get(), + TFBlocks.ROOT_BLOCK.get(), TFBlocks.ROOT_STRAND.get(), TFBlocks.LIVEROOT_BLOCK.get(), TFItems.LIVEROOT.get(), TFBlocks.HOLLOW_OAK_SAPLING.get(), TFBlocks.RAINBOW_OAK_SAPLING.get(), TFBlocks.RAINBOW_OAK_LEAVES.get(), TFBlocks.GIANT_LOG.get(), TFBlocks.GIANT_LEAVES.get(), TFBlocks.HUGE_STALK.get(), TFBlocks.BEANSTALK_LEAVES.get(), TFBlocks.THORN_LEAVES.get(), TFBlocks.THORN_ROSE.get(), TFBlocks.HEDGE.get(), TFBlocks.FALLEN_LEAVES.get(), TFBlocks.MANGROVE_ROOT.get(), + }; + + @Override + public void generate(HolderLookup.Provider registries, Consumer consumer, ExistingFileHelper helper) { + Advancement root = Advancement.Builder.advancement().display( + TFBlocks.TWILIGHT_PORTAL_MINIATURE_STRUCTURE.get(), + Component.translatable("advancement.twilightforest.root"), + Component.translatable("advancement.twilightforest.root.desc"), + new ResourceLocation(TwilightForestMod.ID, "textures/block/mazestone_large_brick.png"), + FrameType.TASK, + true, false, false) + .requirements(RequirementsStrategy.OR) + .addCriterion("in_tf", + PlayerTrigger.TriggerInstance.located( + LocationPredicate.inDimension(TFGenerationSettings.DIMENSION_KEY))) + .addCriterion("make_portal", + MakePortalTrigger.Instance.makePortal()) + .save(consumer, "twilightforest:root"); + + Advancement silence = this.addTFKillable(Advancement.Builder.advancement().parent(root).display( + TFItems.RAVEN_FEATHER.get(), + Component.translatable("advancement.twilightforest.twilight_hunter"), + Component.translatable("advancement.twilightforest.twilight_hunter.desc"), + null, FrameType.TASK, true, true, false).requirements(RequirementsStrategy.OR)) + .save(consumer, "twilightforest:twilight_hunter"); + + Advancement naga = Advancement.Builder.advancement().parent(root).display( + TFBlocks.NAGA_COURTYARD_MINIATURE_STRUCTURE.get(), + Component.translatable("advancement.twilightforest.kill_naga"), + Component.translatable("advancement.twilightforest.kill_naga.desc", + Component.translatable(TFEntities.NAGA.get().getDescriptionId()), + Component.translatable(TFItems.NAGA_SCALE.get().getDescriptionId())), + null, FrameType.GOAL, true, true, false) + .addCriterion("naga", KilledTrigger.TriggerInstance.playerKilledEntity(EntityPredicate.Builder.entity().of(TFEntities.NAGA.get()))) + .addCriterion("trophy", InventoryChangeTrigger.TriggerInstance.hasItems(TFBlocks.NAGA_TROPHY.get())) + .addCriterion("scale", InventoryChangeTrigger.TriggerInstance.hasItems(TFItems.NAGA_SCALE.get())) + .addCriterion("was_in_fight", HurtBossTrigger.Instance.hurtBoss(EntityPredicate.Builder.entity().of(TFEntities.NAGA.get()))) + .requirements(RequirementsStrategy.OR) + .save(consumer, "twilightforest:progress_naga"); + + Advancement lich = Advancement.Builder.advancement().parent(naga).display( + TFBlocks.LICH_TOWER_MINIATURE_STRUCTURE.get(), + Component.translatable("advancement.twilightforest.kill_lich"), + Component.translatable("advancement.twilightforest.kill_lich.desc", + Component.translatable(TFEntities.LICH.get().getDescriptionId())), + null, FrameType.GOAL, true, true, false) + .addCriterion("kill_lich", KilledTrigger.TriggerInstance.playerKilledEntity(EntityPredicate.Builder.entity().of(TFEntities.LICH.get()))) + .addCriterion("trophy", InventoryChangeTrigger.TriggerInstance.hasItems(TFBlocks.LICH_TROPHY.get())) + .addCriterion("lifedrain_scepter", InventoryChangeTrigger.TriggerInstance.hasItems(TFItems.LIFEDRAIN_SCEPTER.get())) + .addCriterion("twilight_scepter", InventoryChangeTrigger.TriggerInstance.hasItems(TFItems.TWILIGHT_SCEPTER.get())) + .addCriterion("zombie_scepter", InventoryChangeTrigger.TriggerInstance.hasItems(TFItems.ZOMBIE_SCEPTER.get())) + .addCriterion("shield_scepter", InventoryChangeTrigger.TriggerInstance.hasItems(TFItems.FORTIFICATION_SCEPTER.get())) + .addCriterion("was_in_fight", HurtBossTrigger.Instance.hurtBoss(EntityPredicate.Builder.entity().of(TFEntities.LICH.get()))) + .addCriterion("kill_naga", this.advancementTrigger(naga)) + .requirements(new CountRequirementsStrategy(7, 1)) + .save(consumer, "twilightforest:progress_lich"); + + Advancement minoshroom = Advancement.Builder.advancement().parent(lich).display( + TFItems.MEEF_STROGANOFF.get(), + Component.translatable("advancement.twilightforest.progress_labyrinth"), + Component.translatable("advancement.twilightforest.progress_labyrinth.desc"), + null, FrameType.GOAL, true, true, false) + .addCriterion("meef", ConsumeItemTrigger.TriggerInstance.usedItem(TFItems.MEEF_STROGANOFF.get())) + .addCriterion("kill_lich", this.advancementTrigger(lich)) + .requirements(RequirementsStrategy.AND) + .save(consumer, "twilightforest:progress_labyrinth"); + + Advancement hydra = Advancement.Builder.advancement().parent(minoshroom).display( + TFBlocks.HYDRA_TROPHY.get(), + Component.translatable("advancement.twilightforest.kill_hydra"), + Component.translatable("advancement.twilightforest.kill_hydra.desc", + Component.translatable(TFEntities.HYDRA.get().getDescriptionId())), + null, FrameType.GOAL, true, true, false) + .addCriterion("kill_hydra", KilledTrigger.TriggerInstance.playerKilledEntity(EntityPredicate.Builder.entity().of(TFEntities.HYDRA.get()))) + .addCriterion("trophy", InventoryChangeTrigger.TriggerInstance.hasItems(TFBlocks.HYDRA_TROPHY.get())) + .addCriterion("was_in_fight", HurtBossTrigger.Instance.hurtBoss(EntityPredicate.Builder.entity().of(TFEntities.HYDRA.get()))) + .addCriterion("stroganoff", this.advancementTrigger(minoshroom)) + .requirements(new CountRequirementsStrategy(3, 1)) + .save(consumer, "twilightforest:progress_hydra"); + + Advancement trophy_pedestal = Advancement.Builder.advancement().parent(lich).display( + TFBlocks.TROPHY_PEDESTAL.get(), + Component.translatable("advancement.twilightforest.progress_trophy_pedestal"), + Component.translatable("advancement.twilightforest.progress_trophy_pedestal.desc"), + null, FrameType.GOAL, true, true, false) + .addCriterion("trophy_pedestal", new TrophyPedestalTrigger.Instance(EntityPredicate.Composite.ANY)) + .addCriterion("kill_lich", this.advancementTrigger(lich)) + .requirements(RequirementsStrategy.AND) + .save(consumer, "twilightforest:progress_trophy_pedestal"); + + Advancement knights = Advancement.Builder.advancement().parent(trophy_pedestal).display( + TFBlocks.KNIGHT_PHANTOM_TROPHY.get(), + Component.translatable("advancement.twilightforest.progress_knights"), + Component.translatable("advancement.twilightforest.progress_knights.desc"), + null, FrameType.GOAL, true, true, false) + .addCriterion("all_knights", KillAllPhantomsTrigger.Instance.killThemAll()) + .addCriterion("trophy", InventoryChangeTrigger.TriggerInstance.hasItems(TFBlocks.KNIGHT_PHANTOM_TROPHY.get())) + .addCriterion("was_in_fight", HurtBossTrigger.Instance.hurtBoss(EntityPredicate.Builder.entity().of(TFEntities.KNIGHT_PHANTOM.get()))) + .addCriterion("previous_progression", this.advancementTrigger(trophy_pedestal)) + .requirements(new CountRequirementsStrategy(3, 1)) + .save(consumer, "twilightforest:progress_knights"); + + Advancement trap = Advancement.Builder.advancement().parent(knights).display( + TFBlocks.GHAST_TRAP.get(), + Component.translatable("advancement.twilightforest.ghast_trap"), + Component.translatable("advancement.twilightforest.ghast_trap.desc", + Component.translatable(TFEntities.CARMINITE_GHASTLING.get().getDescriptionId()), + Component.translatable(TFBlocks.GHAST_TRAP.get().getDescriptionId()), + Component.translatable(TFEntities.UR_GHAST.get().getDescriptionId())), + null, FrameType.TASK, true, true, false) + .addCriterion("activate_ghast_trap", ActivateGhastTrapTrigger.Instance.activateTrap()) + .save(consumer, "twilightforest:ghast_trap"); + + Advancement ur_ghast = Advancement.Builder.advancement().parent(trap).display( + TFBlocks.UR_GHAST_TROPHY.get(), + Component.translatable("advancement.twilightforest.progress_ur_ghast"), + Component.translatable("advancement.twilightforest.progress_ur_ghast.desc", + Component.translatable(TFEntities.UR_GHAST.get().getDescriptionId())), + null, FrameType.GOAL, true, true, false) + .addCriterion("ghast", KilledTrigger.TriggerInstance.playerKilledEntity(EntityPredicate.Builder.entity().of(TFEntities.UR_GHAST.get()))) + .addCriterion("trophy", InventoryChangeTrigger.TriggerInstance.hasItems(TFBlocks.UR_GHAST_TROPHY.get())) + .addCriterion("was_in_fight", HurtBossTrigger.Instance.hurtBoss(EntityPredicate.Builder.entity().of(TFEntities.UR_GHAST.get()))) + .addCriterion("previous_progression", this.advancementTrigger(knights)) + .requirements(new CountRequirementsStrategy(3, 1)) + .save(consumer, "twilightforest:progress_ur_ghast"); + + Advancement yeti = Advancement.Builder.advancement().parent(lich).display( + TFItems.ALPHA_YETI_FUR.get(), + Component.translatable("advancement.twilightforest.progress_yeti"), + Component.translatable("advancement.twilightforest.progress_yeti.desc", + Component.translatable(TFEntities.ALPHA_YETI.get().getDescriptionId())), + null, FrameType.GOAL, true, true, false) + .addCriterion("yeti", KilledTrigger.TriggerInstance.playerKilledEntity(EntityPredicate.Builder.entity().of(TFEntities.ALPHA_YETI.get()))) + .addCriterion("trophy", InventoryChangeTrigger.TriggerInstance.hasItems(TFBlocks.ALPHA_YETI_TROPHY.get())) + .addCriterion("fur", InventoryChangeTrigger.TriggerInstance.hasItems(TFItems.ALPHA_YETI_FUR.get())) + .addCriterion("was_in_fight", HurtBossTrigger.Instance.hurtBoss(EntityPredicate.Builder.entity().of(TFEntities.ALPHA_YETI.get()))) + .addCriterion("previous_progression", this.advancementTrigger(lich)) + .requirements(new CountRequirementsStrategy(4, 1)) + .save(consumer, "twilightforest:progress_yeti"); + + Advancement snow_queen = Advancement.Builder.advancement().parent(yeti).display( + TFBlocks.SNOW_QUEEN_TROPHY.get(), + Component.translatable("advancement.twilightforest.progress_glacier"), + Component.translatable("advancement.twilightforest.progress_glacier.desc", + Component.translatable(TFEntities.SNOW_QUEEN.get().getDescriptionId())), + null, FrameType.GOAL, true, true, false) + .addCriterion("queen", KilledTrigger.TriggerInstance.playerKilledEntity(EntityPredicate.Builder.entity().of(TFEntities.SNOW_QUEEN.get()))) + .addCriterion("trophy", InventoryChangeTrigger.TriggerInstance.hasItems(TFBlocks.SNOW_QUEEN_TROPHY.get())) + .addCriterion("was_in_fight", HurtBossTrigger.Instance.hurtBoss(EntityPredicate.Builder.entity().of(TFEntities.SNOW_QUEEN.get()))) + .addCriterion("previous_progression", this.advancementTrigger(yeti)) + .requirements(new CountRequirementsStrategy(3, 1)) + .save(consumer, "twilightforest:progress_glacier"); + + Advancement merge = Advancement.Builder.advancement().parent(lich).display( + TFBlocks.UBEROUS_SOIL.get(), + Component.translatable("advancement.twilightforest.progress_merge"), + Component.translatable("advancement.twilightforest.progress_merge.desc", + Component.translatable(TFEntities.HYDRA.get().getDescriptionId()), + Component.translatable(TFEntities.UR_GHAST.get().getDescriptionId()), + Component.translatable(TFEntities.SNOW_QUEEN.get().getDescriptionId())), + null, FrameType.GOAL, true, true, false) + .addCriterion("hydra", this.advancementTrigger(hydra)) + .addCriterion("ur_ghast", this.advancementTrigger(ur_ghast)) + .addCriterion("snow_queen", this.advancementTrigger(snow_queen)) + .save(consumer, "twilightforest:progress_merge"); + + Advancement.Builder.advancement().parent(merge).display( + TFItems.MAGIC_BEANS.get(), + Component.translatable("advancement.twilightforest.troll"), + Component.translatable("advancement.twilightforest.troll.desc", + Component.translatable(TFEntities.TROLL.get().getDescriptionId())), + null, FrameType.TASK, true, true, false) + .addCriterion("troll", KilledTrigger.TriggerInstance.playerKilledEntity(EntityPredicate.Builder.entity().of(TFEntities.TROLL.get()).located(LocationPredicate.inStructure(TFStructures.TROLL_CAVE)))) + .save(consumer, "twilightforest:troll"); + + Advancement beanstalk = Advancement.Builder.advancement().parent(merge).display( + TFBlocks.HUGE_STALK.get(), + Component.translatable("advancement.twilightforest.beanstalk"), + Component.translatable("advancement.twilightforest.beanstalk.desc", + Component.translatable(TFItems.MAGIC_BEANS.get().getDescriptionId())), + null, FrameType.GOAL, true, true, false) + .addCriterion("beans", InventoryChangeTrigger.TriggerInstance.hasItems(TFItems.MAGIC_BEANS.get())) + .addCriterion("use_beans", ItemInteractWithBlockTrigger.TriggerInstance.itemUsedOnBlock(LocationPredicate.Builder.location().setBlock(BlockPredicate.Builder.block().of(TFBlocks.UBEROUS_SOIL.get()).build()), ItemPredicate.Builder.item().of(TFItems.MAGIC_BEANS.get()))) + .save(consumer, "twilightforest:beanstalk"); + + Advancement giants = Advancement.Builder.advancement().parent(beanstalk).display( + TFItems.GIANT_PICKAXE.get(), + Component.translatable("advancement.twilightforest.giants"), + Component.translatable("advancement.twilightforest.giants.desc", + Component.translatable(TFEntities.GIANT_MINER.get().getDescriptionId()), + Component.translatable(TFItems.GIANT_PICKAXE.get().getDescriptionId())), + null, FrameType.GOAL, true, true, false) + .addCriterion("giant", KilledTrigger.TriggerInstance.playerKilledEntity(EntityPredicate.Builder.entity().of(TFEntities.GIANT_MINER.get()))) + .addCriterion("pickaxe", InventoryChangeTrigger.TriggerInstance.hasItems(TFItems.MAGIC_BEANS.get())) + .save(consumer, "twilightforest:giants"); + + Advancement lamp = Advancement.Builder.advancement().parent(giants).display( + TFItems.LAMP_OF_CINDERS.get(), + Component.translatable("advancement.twilightforest.progress_troll"), + Component.translatable("advancement.twilightforest.progress_troll.desc", + Component.translatable(TFItems.LAMP_OF_CINDERS.get().getDescriptionId())), + null, FrameType.GOAL, true, true, false) + .addCriterion("lamp", InventoryChangeTrigger.TriggerInstance.hasItems(TFItems.LAMP_OF_CINDERS.get())) + .addCriterion("previous_progression", this.advancementTrigger(merge)) + .save(consumer, "twilightforest:progress_troll"); + + Advancement.Builder.advancement().parent(lamp).display( + Items.STRUCTURE_VOID, + Component.translatable("advancement.twilightforest.progression_end"), + Component.translatable("advancement.twilightforest.progression_end.desc"), + null, FrameType.GOAL, true, false, false) + .addCriterion("previous_progression", this.advancementTrigger(lamp)) + .addCriterion("plateau", PlayerTrigger.TriggerInstance.located(LocationPredicate.inBiome(TFBiomes.FINAL_PLATEAU))) + .save(consumer, "twilightforest:progression_end"); + +// Advancement thornlands = Advancement.Builder.advancement().parent(lamp).display( +// TFBlocks.BROWN_THORNS.get(), +// Component.translatable("advancement.twilightforest.progress_thorns"), +// Component.translatable("advancement.twilightforest.progress_thorns.desc"), +// null, FrameType.GOAL, true, true, false) +// .addCriterion("castle", PlayerTrigger.TriggerInstance.located(LocationPredicate.inBiome(TFBiomes.FINAL_PLATEAU))) +// .addCriterion("previous_progression", this.advancementTrigger(lamp)) +// .save(consumer, "twilightforest:progress_thorns"); +// +// Advancement.Builder.advancement().parent(thornlands).display( +// TFBlocks.VIOLET_CASTLE_RUNE_BRICK.get(), +// Component.translatable("advancement.twilightforest.progress_castle"), +// Component.translatable("advancement.twilightforest.progress_castle.desc"), +// null, FrameType.GOAL, true, true, false) +// .addCriterion("castle", PlayerTrigger.TriggerInstance.located(LocationPredicate.inStructure(TFStructures.FINAL_CASTLE))) +// .addCriterion("previous_progression", this.advancementTrigger(thornlands)) +// .save(consumer, "twilightforest:progress_castle"); + + Advancement.Builder.advancement().parent(root).display( + TFBlocks.QUEST_RAM_TROPHY.get(), + Component.translatable("advancement.twilightforest.quest_ram"), + Component.translatable("advancement.twilightforest.quest_ram.desc", + Component.translatable(TFEntities.QUEST_RAM.get().getDescriptionId())), + null, FrameType.GOAL, true, true, false) + .addCriterion("quest_ram_complete", QuestRamCompletionTrigger.Instance.completeRam()) + .rewards(AdvancementRewards.Builder.experience(100)) + .save(consumer, "twilightforest:quest_ram"); + + Advancement.Builder.advancement().parent(root).display( + TFBlocks.CICADA.get(), + Component.translatable("advancement.twilightforest.kill_cicada"), + Component.translatable("advancement.twilightforest.kill_cicada.desc", + Component.translatable(TFBlocks.CICADA.get().getDescriptionId())), + null, FrameType.TASK, true, false, true) + .addCriterion("kill_cicada", KillBugTrigger.Instance.killBug(TFBlocks.CICADA.get())) + .save(consumer, "twilightforest:kill_cicada"); + + Advancement focus = Advancement.Builder.advancement().parent(silence).display( + TFItems.MAGIC_MAP_FOCUS.get(), + Component.translatable("advancement.twilightforest.magic_map_focus"), + Component.translatable("advancement.twilightforest.magic_map_focus.desc", + Component.translatable(TFItems.MAGIC_MAP_FOCUS.get().getDescriptionId()), + Component.translatable(TFItems.RAVEN_FEATHER.get().getDescriptionId()), + Component.translatable(Items.GLOWSTONE_DUST.getDescriptionId()), + Component.translatable(TFItems.TORCHBERRIES.get().getDescriptionId())), + null, FrameType.TASK, true, true, false) + .addCriterion("focus", InventoryChangeTrigger.TriggerInstance.hasItems(TFItems.MAGIC_MAP_FOCUS.get())) + .save(consumer, "twilightforest:magic_map_focus"); + + Advancement magic_map = Advancement.Builder.advancement().parent(focus).display( + TFItems.FILLED_MAGIC_MAP.get(), + Component.translatable("advancement.twilightforest.magic_map"), + Component.translatable("advancement.twilightforest.magic_map.desc", + Component.translatable(TFItems.FILLED_MAGIC_MAP.get().getDescriptionId())), + null, FrameType.TASK, true, true, false) + .addCriterion("magic_map", InventoryChangeTrigger.TriggerInstance.hasItems(TFItems.FILLED_MAGIC_MAP.get())) + .save(consumer, "twilightforest:magic_map"); + + Advancement maze_map = Advancement.Builder.advancement().parent(magic_map).display( + TFItems.FILLED_MAZE_MAP.get(), + Component.translatable("advancement.twilightforest.maze_map"), + Component.translatable("advancement.twilightforest.maze_map.desc", + Component.translatable(TFItems.FILLED_MAZE_MAP.get().getDescriptionId())), + null, FrameType.GOAL, true, true, false) + .addCriterion("maze_map", InventoryChangeTrigger.TriggerInstance.hasItems(TFItems.FILLED_MAZE_MAP.get())) + .save(consumer, "twilightforest:maze_map"); + + Advancement.Builder.advancement().parent(maze_map).display( + TFItems.FILLED_ORE_MAP.get(), + Component.translatable("advancement.twilightforest.ore_map"), + Component.translatable("advancement.twilightforest.ore_map.desc", + Component.translatable(TFItems.FILLED_ORE_MAP.get().getDescriptionId())), + null, FrameType.CHALLENGE, true, true, true) + .addCriterion("ore_map", InventoryChangeTrigger.TriggerInstance.hasItems(TFItems.FILLED_ORE_MAP.get())) + .save(consumer, "twilightforest:ore_map"); + + Advancement hill1 = Advancement.Builder.advancement().parent(root).display( + Items.IRON_BOOTS, + Component.translatable("advancement.twilightforest.hill1"), + Component.translatable("advancement.twilightforest.hill1.desc", + Component.translatable(TFEntities.REDCAP.get().getDescriptionId())), + null, FrameType.TASK, true, true, false) + .addCriterion("redcap", KilledTrigger.TriggerInstance.playerKilledEntity(EntityPredicate.Builder.entity().of(TFEntities.REDCAP.get()).located(LocationPredicate.inStructure(TFStructures.HOLLOW_HILL_SMALL)))) + .save(consumer, "twilightforest:hill1"); + + Advancement hill2 = Advancement.Builder.advancement().parent(hill1).display( + TFItems.IRONWOOD_PICKAXE.get(), + Component.translatable("advancement.twilightforest.hill2"), + Component.translatable("advancement.twilightforest.hill2.desc", + Component.translatable(TFEntities.REDCAP_SAPPER.get().getDescriptionId())), + null, FrameType.TASK, true, true, false) + .addCriterion("redcap", KilledTrigger.TriggerInstance.playerKilledEntity(EntityPredicate.Builder.entity().of(TFEntities.REDCAP_SAPPER.get()).located(LocationPredicate.inStructure(TFStructures.HOLLOW_HILL_MEDIUM)))) + .save(consumer, "twilightforest:hill2"); + + Advancement.Builder.advancement().parent(hill2).display( + Items.GLOWSTONE_DUST, + Component.translatable("advancement.twilightforest.hill3"), + Component.translatable("advancement.twilightforest.hill3.desc", + Component.translatable(TFEntities.WRAITH.get().getDescriptionId())), + null, FrameType.TASK, true, true, false) + .addCriterion("redcap", KilledTrigger.TriggerInstance.playerKilledEntity(EntityPredicate.Builder.entity().of(TFEntities.WRAITH.get()).located(LocationPredicate.inStructure(TFStructures.HOLLOW_HILL_LARGE)))) + .save(consumer, "twilightforest:hill3"); + + Advancement.Builder.advancement().parent(root).display( + TFBlocks.HEDGE.get(), + Component.translatable("advancement.twilightforest.hedge"), + Component.translatable("advancement.twilightforest.hedge.desc"), + null, FrameType.TASK, true, true, false) + .addCriterion("hedge_spider", KilledTrigger.TriggerInstance.playerKilledEntity(EntityPredicate.Builder.entity().of(TFEntities.HEDGE_SPIDER.get()).located(LocationPredicate.inStructure(TFStructures.HEDGE_MAZE)))) + .addCriterion("swarm_spider", KilledTrigger.TriggerInstance.playerKilledEntity(EntityPredicate.Builder.entity().of(TFEntities.SWARM_SPIDER.get()).located(LocationPredicate.inStructure(TFStructures.HEDGE_MAZE)))) + .requirements(RequirementsStrategy.OR) + .save(consumer, "twilightforest:hedge"); + + Advancement.Builder.advancement().parent(root).display( + Items.BOWL, + Component.translatable("advancement.twilightforest.twilight_dining"), + Component.translatable("advancement.twilightforest.twilight_dining.desc"), + null, FrameType.CHALLENGE, true, true, false) + .addCriterion("raw_venison", ConsumeItemTrigger.TriggerInstance.usedItem(TFItems.RAW_VENISON.get())) + .addCriterion("cooked_venison", ConsumeItemTrigger.TriggerInstance.usedItem(TFItems.COOKED_VENISON.get())) + .addCriterion("raw_meef", ConsumeItemTrigger.TriggerInstance.usedItem(TFItems.RAW_MEEF.get())) + .addCriterion("cooked_meef", ConsumeItemTrigger.TriggerInstance.usedItem(TFItems.COOKED_MEEF.get())) + .addCriterion("meef_stroganoff", ConsumeItemTrigger.TriggerInstance.usedItem(TFItems.MEEF_STROGANOFF.get())) + .addCriterion("hydra_chop", ConsumeItemTrigger.TriggerInstance.usedItem(TFItems.HYDRA_CHOP.get())) + .addCriterion("maze_wafer", ConsumeItemTrigger.TriggerInstance.usedItem(TFItems.MAZE_WAFER.get())) + .addCriterion("experiment_115", ConsumeItemTrigger.TriggerInstance.usedItem(TFItems.EXPERIMENT_115.get())) + .addCriterion("torchberries", ConsumeItemTrigger.TriggerInstance.usedItem(TFItems.TORCHBERRIES.get())) + .requirements(new CountRequirementsStrategy(2, 2, 1, 1, 1, 1, 1)) + .rewards(AdvancementRewards.Builder.experience(75)) + .save(consumer, "twilightforest:twilight_dinner"); + + Advancement.Builder.advancement().parent(naga).display( + TFItems.NAGA_CHESTPLATE.get(), + Component.translatable("advancement.twilightforest.naga_armors"), + Component.translatable("advancement.twilightforest.naga_armors.desc", + Component.translatable(TFItems.NAGA_SCALE.get().getDescriptionId())), + null, FrameType.CHALLENGE, true, true, false) + .addCriterion("armor", InventoryChangeTrigger.TriggerInstance.hasItems( + TFItems.NAGA_CHESTPLATE.get(), TFItems.NAGA_LEGGINGS.get())) + .rewards(AdvancementRewards.Builder.experience(25)) + .save(consumer, "twilightforest:naga_armors"); + + Advancement.Builder.advancement().parent(lich).display( + TFItems.ZOMBIE_SCEPTER.get(), + Component.translatable("advancement.twilightforest.lich_scepters"), + Component.translatable("advancement.twilightforest.lich_scepters.desc"), + null, FrameType.CHALLENGE, true, true, true) + .addCriterion("scepters", InventoryChangeTrigger.TriggerInstance.hasItems( + TFItems.LIFEDRAIN_SCEPTER.get(), TFItems.TWILIGHT_SCEPTER.get(), + TFItems.ZOMBIE_SCEPTER.get(), TFItems.FORTIFICATION_SCEPTER.get())) + .rewards(AdvancementRewards.Builder.experience(100)) + .save(consumer, "twilightforest:lich_scepters"); + + Advancement.Builder.advancement().parent(lich).display( + flaskWithHarming(), + Component.translatable("advancement.twilightforest.full_mettle_alchemist"), + Component.translatable("advancement.twilightforest.full_mettle_alchemist.desc"), + null, FrameType.CHALLENGE, true, true, true) + .addCriterion("drink_4_harming", DrinkFromFlaskTrigger.Instance.drankPotion(4, Potions.STRONG_HARMING)) + .rewards(AdvancementRewards.Builder.experience(100)) + .save(consumer, "twilightforest:full_mettle_alchemist"); + + Advancement.Builder.advancement().parent(minoshroom).display( + TFItems.MAZEBREAKER_PICKAXE.get(), + Component.translatable("advancement.twilightforest.mazebreaker"), + Component.translatable("advancement.twilightforest.mazebreaker.desc", + Component.translatable(TFItems.MAZEBREAKER_PICKAXE.get().getDescriptionId())), + null, FrameType.CHALLENGE, true, true, false) + .addCriterion("pick", InventoryChangeTrigger.TriggerInstance.hasItems(TFItems.MAZEBREAKER_PICKAXE.get())) + .rewards(AdvancementRewards.Builder.experience(50)) + .save(consumer, "twilightforest:mazebreaker"); + + Advancement.Builder.advancement().parent(hydra).display( + TFItems.HYDRA_CHOP.get(), + Component.translatable("advancement.twilightforest.hydra_chop"), + Component.translatable("advancement.twilightforest.hydra_chop.desc", + Component.translatable(TFEntities.HYDRA.get().getDescriptionId())), + null, FrameType.TASK, true, true, false) + .addCriterion("hydra_chop", HydraChopTrigger.Instance.eatChop()) + .save(consumer, "twilightforest:hydra_chop"); + + Advancement.Builder.advancement().parent(hydra).display( + TFItems.FIERY_SWORD.get(), + Component.translatable("advancement.twilightforest.fiery_set"), + Component.translatable("advancement.twilightforest.fiery_set.desc"), + null, FrameType.CHALLENGE, true, true, false) + .addCriterion("fiery_pick", InventoryChangeTrigger.TriggerInstance.hasItems(TFItems.FIERY_PICKAXE.get())) + .addCriterion("fiery_sword", InventoryChangeTrigger.TriggerInstance.hasItems(TFItems.FIERY_SWORD.get())) + .addCriterion("fiery_helmet", InventoryChangeTrigger.TriggerInstance.hasItems(TFItems.FIERY_HELMET.get())) + .addCriterion("fiery_chestplate", InventoryChangeTrigger.TriggerInstance.hasItems(TFItems.FIERY_CHESTPLATE.get())) + .addCriterion("fiery_leggings", InventoryChangeTrigger.TriggerInstance.hasItems(TFItems.FIERY_LEGGINGS.get())) + .addCriterion("fiery_boots", InventoryChangeTrigger.TriggerInstance.hasItems(TFItems.FIERY_BOOTS.get())) + .requirements(new CountRequirementsStrategy(2, 4)) + .rewards(AdvancementRewards.Builder.experience(75)) + .save(consumer, "twilightforest:fiery_set"); + + Advancement e115 = Advancement.Builder.advancement().parent(knights).display( + TFItems.EXPERIMENT_115.get(), + Component.translatable("advancement.twilightforest.experiment_115"), + Component.translatable("advancement.twilightforest.experiment_115.desc"), + null, FrameType.TASK, true, true, false) + .addCriterion("eat_experiment_115", ConsumeItemTrigger.TriggerInstance.usedItem(TFItems.EXPERIMENT_115.get())) + .save(consumer, "twilightforest:experiment_115"); + + Advancement.Builder.advancement().parent(e115).display( + e115Tag("think"), + Component.translatable("advancement.twilightforest.experiment_115_3"), + Component.translatable("advancement.twilightforest.experiment_115_3.desc"), + null, FrameType.CHALLENGE, true, true, true) + .addCriterion("eat_115_e115", PlayerTrigger.TriggerInstance.located(EntityPredicate.Builder.entity().subPredicate(PlayerPredicate.Builder.player().addStat(Stats.CUSTOM.get(TFStats.E115_SLICES_EATEN.get()), MinMaxBounds.Ints.atLeast(115)).build()).build())) + .save(consumer, "twilightforest:experiment_115_115"); + + Advancement.Builder.advancement().parent(e115).display( + e115Tag("full"), + Component.translatable("advancement.twilightforest.experiment_115_2"), + Component.translatable("advancement.twilightforest.experiment_115_2.desc"), + null, FrameType.CHALLENGE, true, true, true) + .addCriterion("place_complete_e115", ItemInteractWithBlockTrigger.TriggerInstance.itemUsedOnBlock(LocationPredicate.Builder.location().setBlock(BlockPredicate.Builder.block().of(TFBlocks.EXPERIMENT_115.get()).setProperties(StatePropertiesPredicate.Builder.properties().hasProperty(Experiment115Block.REGENERATE, true).build()).build()), ItemPredicate.Builder.item().of(Items.REDSTONE))) + .save(consumer, "twilightforest:experiment_115_self_replenishing"); + + Advancement.Builder.advancement().parent(yeti).display( + TFItems.ARCTIC_CHESTPLATE.get(), + Component.translatable("advancement.twilightforest.arctic_dyed"), + Component.translatable("advancement.twilightforest.arctic_dyed.desc"), + null, FrameType.TASK, true, true, false) + .addCriterion("helmet", InventoryChangeTrigger.TriggerInstance.hasItems(ItemPredicate.Builder.item().of(TFItems.ARCTIC_HELMET.get()).hasNbt(arcticDye(TFItems.ARCTIC_HELMET.get())).build())) + .addCriterion("chestplate", InventoryChangeTrigger.TriggerInstance.hasItems(ItemPredicate.Builder.item().of(TFItems.ARCTIC_CHESTPLATE.get()).hasNbt(arcticDye(TFItems.ARCTIC_CHESTPLATE.get())).build())) + .addCriterion("leggings", InventoryChangeTrigger.TriggerInstance.hasItems(ItemPredicate.Builder.item().of(TFItems.ARCTIC_LEGGINGS.get()).hasNbt(arcticDye(TFItems.ARCTIC_LEGGINGS.get())).build())) + .addCriterion("boots", InventoryChangeTrigger.TriggerInstance.hasItems(ItemPredicate.Builder.item().of(TFItems.ARCTIC_BOOTS.get()).hasNbt(arcticDye(TFItems.ARCTIC_BOOTS.get())).build())) + .rewards(AdvancementRewards.Builder.experience(25)) + .save(consumer, "twilightforest:arctic_armor_dyed"); + + Advancement.Builder.advancement().parent(yeti).display( + TFItems.GLASS_SWORD.get(), + Component.translatable("advancement.twilightforest.glass_sword"), + Component.translatable("advancement.twilightforest.glass_sword.desc"), + null, FrameType.CHALLENGE, true, true, true) + .addCriterion("broken_sword", ItemDurabilityTrigger.TriggerInstance.changedDurability(ItemPredicate.Builder.item().of(TFItems.GLASS_SWORD.get()).build(), MinMaxBounds.Ints.exactly(-1))) + .rewards(AdvancementRewards.Builder.experience(42).addLootTable(TwilightForestMod.prefix("glass_sword"))) + .save(consumer, "twilightforest:break_glass_sword"); + + this.addDendrologistBlock(Advancement.Builder.advancement().parent(root) + .display(TFBlocks.TWILIGHT_OAK_FENCE.get(), + Component.translatable("advancement.twilightforest.arborist"), + Component.translatable("advancement.twilightforest.arborist.desc"), + null, FrameType.CHALLENGE, true, true, false) + .requirements(RequirementsStrategy.AND)) + .rewards(AdvancementRewards.Builder.experience(1000)) + .save(consumer, "twilightforest:arborist"); + + } + + private ItemStack e115Tag(String nbt) { + ItemStack itemstack = new ItemStack(TFItems.EXPERIMENT_115.get()); + CompoundTag compoundtag = itemstack.getOrCreateTagElement(nbt); + compoundtag.putInt(nbt, 1); + return itemstack; + } + + private ItemStack flaskWithHarming() { + ItemStack itemstack = new ItemStack(TFItems.GREATER_FLASK.get()); + CompoundTag compoundtag = itemstack.getOrCreateTag(); + compoundtag.putInt("Uses", 4); + compoundtag.putString("Potion", ForgeRegistries.POTIONS.getKey(Potions.STRONG_HARMING).toString()); + return itemstack; + } + + private CompoundTag arcticDye(Item item) { + ItemStack itemstack = new ItemStack(item); + CompoundTag compoundtag = itemstack.getOrCreateTagElement("display"); + CompoundTag color = itemstack.getOrCreateTagElement("hasColor"); + color.putBoolean("hasColor", true); + compoundtag.put("display", color); + return compoundtag; + } + + private Advancement.Builder addTFKillable(Advancement.Builder builder) { + for (EntityType entity : TF_KILLABLE) { + builder.addCriterion(EntityType.getKey(entity).getPath(), + KilledTrigger.TriggerInstance.playerKilledEntity(EntityPredicate.Builder.entity().of(entity) + .located(LocationPredicate.inDimension(TFGenerationSettings.DIMENSION_KEY)))); + } + return builder; + } + + private Advancement.Builder addDendrologistBlock(Advancement.Builder builder) { + for (ItemLike dendrologistBlock : DENDROLOGIST_BLOCKS) { + builder.addCriterion(ForgeRegistries.ITEMS.getKey(dendrologistBlock.asItem()).getPath(), InventoryChangeTrigger.TriggerInstance.hasItems(dendrologistBlock)); + } + return builder; + } + + private PlayerTrigger.TriggerInstance advancementTrigger(Advancement advancement) { + return this.advancementTrigger(advancement.getId().getPath()); + } + + private PlayerTrigger.TriggerInstance advancementTrigger(String name) { + return new PlayerTrigger.TriggerInstance(CriteriaTriggers.TICK.getId(), EntityPredicate.Composite.create(LootItemEntityPropertyCondition.hasProperties(LootContext.EntityTarget.THIS, EntityPredicate.Builder.entity().subPredicate(PlayerPredicate.Builder.player().checkAdvancementDone(TwilightForestMod.prefix(name), true).build())).build())); + } +} diff --git a/src/main/java/twilightforest/data/TFAdvancementProvider.java b/src/main/java/twilightforest/data/TFAdvancementProvider.java new file mode 100644 index 0000000000..9924467146 --- /dev/null +++ b/src/main/java/twilightforest/data/TFAdvancementProvider.java @@ -0,0 +1,16 @@ +package twilightforest.data; + +import net.minecraft.core.HolderLookup; +import net.minecraft.data.PackOutput; +import net.minecraftforge.common.data.ExistingFileHelper; +import net.minecraftforge.common.data.ForgeAdvancementProvider; + +import java.util.List; +import java.util.concurrent.CompletableFuture; + +public class TFAdvancementProvider extends ForgeAdvancementProvider { + + public TFAdvancementProvider(PackOutput output, CompletableFuture registries, ExistingFileHelper existingFileHelper) { + super(output, registries, existingFileHelper, List.of(new TFAdvancementGenerator())); + } +} diff --git a/src/main/java/twilightforest/data/custom/CrumbleHornGenerator.java b/src/main/java/twilightforest/data/custom/CrumbleHornGenerator.java new file mode 100644 index 0000000000..c3c4d6e6f9 --- /dev/null +++ b/src/main/java/twilightforest/data/custom/CrumbleHornGenerator.java @@ -0,0 +1,55 @@ +package twilightforest.data.custom; + +import net.minecraft.data.DataGenerator; +import net.minecraft.data.PackOutput; +import net.minecraft.world.level.block.Blocks; +import net.minecraftforge.common.data.ExistingFileHelper; +import twilightforest.TwilightForestMod; +import twilightforest.init.TFBlocks; + +public class CrumbleHornGenerator extends CrumbleHornProvider { + + public CrumbleHornGenerator(PackOutput output, ExistingFileHelper helper) { + super(output, TwilightForestMod.ID, helper); + } + + @Override + public void registerTransforms() { + addTransform(Blocks.STONE_BRICKS, Blocks.CRACKED_STONE_BRICKS); + addTransform(Blocks.POLISHED_BLACKSTONE_BRICKS, Blocks.CRACKED_POLISHED_BLACKSTONE_BRICKS); + addTransform(Blocks.CRACKED_POLISHED_BLACKSTONE_BRICKS, Blocks.BLACKSTONE); + addTransform(Blocks.NETHER_BRICKS, Blocks.CRACKED_NETHER_BRICKS); + addTransform(Blocks.DEEPSLATE_BRICKS, Blocks.CRACKED_DEEPSLATE_BRICKS); + addTransform(Blocks.DEEPSLATE_TILES, Blocks.CRACKED_DEEPSLATE_TILES); + addTransform(TFBlocks.MAZESTONE_BRICK.get(), TFBlocks.CRACKED_MAZESTONE.get()); + addTransform(TFBlocks.UNDERBRICK.get(), TFBlocks.CRACKED_UNDERBRICK.get()); + addTransform(TFBlocks.DEADROCK.get(), TFBlocks.CRACKED_DEADROCK.get()); + addTransform(TFBlocks.TOWERWOOD.get(), TFBlocks.CRACKED_TOWERWOOD.get()); + addTransform(TFBlocks.CASTLE_BRICK.get(), TFBlocks.CRACKED_CASTLE_BRICK.get()); + addTransform(TFBlocks.NAGASTONE_PILLAR.get(), TFBlocks.CRACKED_NAGASTONE_PILLAR.get()); + addTransform(TFBlocks.ETCHED_NAGASTONE.get(), TFBlocks.CRACKED_ETCHED_NAGASTONE.get()); + addTransform(Blocks.STONE, Blocks.COBBLESTONE); + addTransform(Blocks.COBBLESTONE, Blocks.GRAVEL); + addTransform(Blocks.SANDSTONE, Blocks.SAND); + addTransform(Blocks.RED_SANDSTONE, Blocks.RED_SAND); + addTransform(Blocks.GRASS_BLOCK, Blocks.DIRT); + addTransform(Blocks.PODZOL, Blocks.DIRT); + addTransform(Blocks.MYCELIUM, Blocks.DIRT); + addTransform(Blocks.COARSE_DIRT, Blocks.DIRT); + addTransform(Blocks.ROOTED_DIRT, Blocks.DIRT); + addTransform(Blocks.OXIDIZED_COPPER, Blocks.WEATHERED_COPPER); + addTransform(Blocks.WEATHERED_COPPER, Blocks.EXPOSED_COPPER); + addTransform(Blocks.EXPOSED_COPPER, Blocks.COPPER_BLOCK); + addTransform(Blocks.OXIDIZED_CUT_COPPER, Blocks.WEATHERED_CUT_COPPER); + addTransform(Blocks.WEATHERED_CUT_COPPER, Blocks.EXPOSED_CUT_COPPER); + addTransform(Blocks.EXPOSED_CUT_COPPER, Blocks.CUT_COPPER); + addDissolve(Blocks.GRAVEL); + addDissolve(Blocks.DIRT); + addDissolve(Blocks.SAND); + addDissolve(Blocks.RED_SAND); + addDissolve(Blocks.CLAY); + addDissolve(Blocks.ANDESITE); + addDissolve(Blocks.DIORITE); + addDissolve(Blocks.GRANITE); + } +} diff --git a/src/main/java/twilightforest/data/custom/CrumbleHornProvider.java b/src/main/java/twilightforest/data/custom/CrumbleHornProvider.java new file mode 100644 index 0000000000..737ccbac91 --- /dev/null +++ b/src/main/java/twilightforest/data/custom/CrumbleHornProvider.java @@ -0,0 +1,102 @@ +package twilightforest.data.custom; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.Maps; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonObject; +import net.minecraft.data.CachedOutput; +import net.minecraft.data.DataGenerator; +import net.minecraft.data.DataProvider; +import net.minecraft.data.PackOutput; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.packs.PackType; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.common.data.ExistingFileHelper; +import net.minecraftforge.registries.ForgeRegistries; +import oshi.util.tuples.Pair; +import twilightforest.TwilightForestMod; +import twilightforest.init.TFRecipes; + +import java.io.IOException; +import java.nio.file.Path; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.concurrent.CompletableFuture; +import java.util.stream.Collectors; + +public abstract class CrumbleHornProvider implements DataProvider { + + private final PackOutput output; + private final String modId; + private final ExistingFileHelper helper; + protected final Map> builders = Maps.newLinkedHashMap(); + + public CrumbleHornProvider(PackOutput output, final String modId, final ExistingFileHelper helper) { + this.output = output; + this.modId = modId; + this.helper = helper; + } + + public abstract void registerTransforms(); + + @Override + public CompletableFuture run(CachedOutput cache) { + this.builders.clear(); + this.registerTransforms(); + + ImmutableList.Builder> futuresBuilder = new ImmutableList.Builder<>(); + + this.builders.forEach((name, transform) -> { + List list = builders.keySet().stream() + .filter(s -> ForgeRegistries.BLOCKS.containsValue(transform.getA().getBlock())) + .filter(s -> ForgeRegistries.BLOCKS.containsValue(transform.getB().getBlock())) + .filter(s -> !this.builders.containsKey(s)) + .filter(this::missing) + .collect(Collectors.toList()); + + if (!list.isEmpty()) { + throw new IllegalArgumentException(String.format("Duplicate Crumble Horn Transformations: %s", list.stream().map(Objects::toString).collect(Collectors.joining(", ")))); + } else { + JsonObject obj = serializeToJson(transform.getA(), transform.getB()); + Path path = createPath(new ResourceLocation(modId, name)); + futuresBuilder.add(DataProvider.saveStable(cache, obj, path)); + } + }); + return CompletableFuture.allOf(futuresBuilder.build().toArray(CompletableFuture[]::new)); + } + + private boolean missing(String name) { + return !this.helper.exists(new ResourceLocation(modId, name), new ExistingFileHelper.ResourceType(PackType.SERVER_DATA, ".json", "crumble_horn")); + } + + private Path createPath(ResourceLocation name) { + return this.output.getOutputFolder().resolve("data/" + name.getNamespace() + "/recipes/crumble_horn/" + name.getPath() + ".json"); + } + + private JsonObject serializeToJson(BlockState transformFrom, BlockState transformTo) { + JsonObject jsonobject = new JsonObject(); + + jsonobject.addProperty("type", ForgeRegistries.RECIPE_SERIALIZERS.getKey(TFRecipes.CRUMBLE_SERIALIZER.get()).toString()); + jsonobject.addProperty("from", ForgeRegistries.BLOCKS.getKey(transformFrom.getBlock()).toString()); + jsonobject.addProperty("to", ForgeRegistries.BLOCKS.getKey(transformTo.getBlock()).toString()); + return jsonobject; + } + + @Override + public String getName() { + return this.modId + " Crumble Horn Transformations"; + } + + //helper methods + public void addTransform(Block from, Block to) { + this.builders.put(ForgeRegistries.BLOCKS.getKey(from).getPath() + "_to_" + ForgeRegistries.BLOCKS.getKey(to).getPath(), new Pair<>(from.defaultBlockState(), to.defaultBlockState())); + } + + public void addDissolve(Block dissolveBlock) { + this.builders.put("dissolve_" + ForgeRegistries.BLOCKS.getKey(dissolveBlock).getPath(), new Pair<>(dissolveBlock.defaultBlockState(), Blocks.AIR.defaultBlockState())); + } +} diff --git a/src/main/java/twilightforest/data/custom/TransformationPowderGenerator.java b/src/main/java/twilightforest/data/custom/TransformationPowderGenerator.java new file mode 100644 index 0000000000..3d56497408 --- /dev/null +++ b/src/main/java/twilightforest/data/custom/TransformationPowderGenerator.java @@ -0,0 +1,35 @@ +package twilightforest.data.custom; + +import net.minecraft.data.DataGenerator; +import net.minecraft.data.PackOutput; +import net.minecraft.world.entity.EntityType; +import net.minecraftforge.common.data.ExistingFileHelper; +import twilightforest.TwilightForestMod; +import twilightforest.init.TFEntities; + +public class TransformationPowderGenerator extends TransformationPowderProvider { + + public TransformationPowderGenerator(PackOutput output, ExistingFileHelper helper) { + super(output, TwilightForestMod.ID, helper); + } + + @Override + public void registerTransforms() { + addTwoWayTransform(TFEntities.MINOTAUR.get(), EntityType.ZOMBIFIED_PIGLIN); + addTwoWayTransform(TFEntities.DEER.get(), EntityType.COW); + addTwoWayTransform(TFEntities.BOAR.get(), EntityType.PIG); + addTwoWayTransform(TFEntities.BIGHORN_SHEEP.get(), EntityType.SHEEP); + addTwoWayTransform(TFEntities.DWARF_RABBIT.get(), EntityType.RABBIT); + addTwoWayTransform(TFEntities.TINY_BIRD.get(), EntityType.PARROT); + addTwoWayTransform(TFEntities.RAVEN.get(), EntityType.BAT); + addTwoWayTransform(TFEntities.HOSTILE_WOLF.get(), EntityType.WOLF); + addTwoWayTransform(TFEntities.PENGUIN.get(), EntityType.CHICKEN); + addTwoWayTransform(TFEntities.HEDGE_SPIDER.get(), EntityType.SPIDER); + addTwoWayTransform(TFEntities.SWARM_SPIDER.get(), EntityType.CAVE_SPIDER); + addTwoWayTransform(TFEntities.WRAITH.get(), EntityType.VEX); + addTwoWayTransform(TFEntities.SKELETON_DRUID.get(), EntityType.WITCH); + addTwoWayTransform(TFEntities.CARMINITE_GHASTGUARD.get(), EntityType.GHAST); + addTwoWayTransform(TFEntities.TOWERWOOD_BORER.get(), EntityType.SILVERFISH); + addTwoWayTransform(TFEntities.MAZE_SLIME.get(), EntityType.SLIME); + } +} diff --git a/src/main/java/twilightforest/data/custom/TransformationPowderProvider.java b/src/main/java/twilightforest/data/custom/TransformationPowderProvider.java new file mode 100644 index 0000000000..27870ec303 --- /dev/null +++ b/src/main/java/twilightforest/data/custom/TransformationPowderProvider.java @@ -0,0 +1,97 @@ +package twilightforest.data.custom; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.Maps; +import com.google.gson.JsonObject; +import net.minecraft.data.CachedOutput; +import net.minecraft.data.DataGenerator; +import net.minecraft.data.DataProvider; +import net.minecraft.data.PackOutput; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.EntityType; +import net.minecraftforge.common.data.ExistingFileHelper; +import net.minecraftforge.registries.ForgeRegistries; +import org.apache.commons.lang3.tuple.Triple; +import twilightforest.TwilightForestMod; +import twilightforest.init.TFRecipes; + +import java.io.IOException; +import java.nio.file.Path; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.concurrent.CompletableFuture; +import java.util.stream.Collectors; + +public abstract class TransformationPowderProvider implements DataProvider { + private final PackOutput output; + private final String modId; + private final ExistingFileHelper helper; + protected final Map, EntityType, Boolean>> builders = Maps.newLinkedHashMap(); + + public TransformationPowderProvider(PackOutput output, final String modId, final ExistingFileHelper helper) { + this.output = output; + this.modId = modId; + this.helper = helper; + } + + public abstract void registerTransforms(); + + @Override + public CompletableFuture run(CachedOutput cache) { + this.builders.clear(); + this.registerTransforms(); + + ImmutableList.Builder> futuresBuilder = new ImmutableList.Builder<>(); + + this.builders.forEach((name, transform) -> { + List list = builders.keySet().stream() + .filter(s -> ForgeRegistries.ENTITY_TYPES.containsValue(transform.getLeft())) + .filter(s -> ForgeRegistries.ENTITY_TYPES.containsValue(transform.getMiddle())) + .filter(s -> !this.builders.containsKey(s)) + .filter(this::missing) + .collect(Collectors.toList()); + + if (!list.isEmpty()) { + throw new IllegalArgumentException(String.format("Duplicate Transformation Powder Transformations: %s", list.stream().map(Objects::toString).collect(Collectors.joining(", ")))); + } else { + JsonObject obj = serializeToJson(transform.getLeft(), transform.getMiddle(), transform.getRight()); + Path path = createPath(new ResourceLocation(this.modId, name)); + futuresBuilder.add(DataProvider.saveStable(cache, obj, path)); + } + }); + return CompletableFuture.allOf(futuresBuilder.build().toArray(CompletableFuture[]::new)); + } + + private boolean missing(String name) { + return this.helper == null || !this.helper.exists(new ResourceLocation(this.modId, name), new ExistingFileHelper.ResourceType(net.minecraft.server.packs.PackType.SERVER_DATA, ".json", "transformation_powder")); + } + + private Path createPath(ResourceLocation name) { + return this.output.getOutputFolder().resolve("data/" + name.getNamespace() + "/recipes/transformation_powder/" + name.getPath() + ".json"); + } + + private JsonObject serializeToJson(EntityType transformFrom, EntityType transformTo, boolean reversible) { + JsonObject jsonobject = new JsonObject(); + + jsonobject.addProperty("type", ForgeRegistries.RECIPE_SERIALIZERS.getKey(TFRecipes.TRANSFORMATION_SERIALIZER.get()).toString()); + jsonobject.addProperty("from", ForgeRegistries.ENTITY_TYPES.getKey(transformFrom).toString()); + jsonobject.addProperty("to", ForgeRegistries.ENTITY_TYPES.getKey(transformTo).toString()); + jsonobject.addProperty("reversible", reversible); + return jsonobject; + } + + @Override + public String getName() { + return this.modId + " Transformation Powder Transformations"; + } + + //helper methods + public void addOneWayTransform(EntityType from, EntityType to) { + this.builders.put(ForgeRegistries.ENTITY_TYPES.getKey(from).getPath() + "_to_" + ForgeRegistries.ENTITY_TYPES.getKey(to).getPath(), Triple.of(from, to, false)); + } + + public void addTwoWayTransform(EntityType from, EntityType to) { + this.builders.put(ForgeRegistries.ENTITY_TYPES.getKey(from).getPath() + "_to_" + ForgeRegistries.ENTITY_TYPES.getKey(to).getPath(), Triple.of(from, to, true)); + } +} diff --git a/src/main/java/twilightforest/data/custom/UncraftingRecipeGenerator.java b/src/main/java/twilightforest/data/custom/UncraftingRecipeGenerator.java new file mode 100644 index 0000000000..25cbdfec6a --- /dev/null +++ b/src/main/java/twilightforest/data/custom/UncraftingRecipeGenerator.java @@ -0,0 +1,19 @@ +package twilightforest.data.custom; + +import net.minecraft.data.PackOutput; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraftforge.common.data.ExistingFileHelper; +import twilightforest.TwilightForestMod; + +public class UncraftingRecipeGenerator extends UncraftingRecipeProvider { + + public UncraftingRecipeGenerator(PackOutput output, ExistingFileHelper helper) { + super(output, TwilightForestMod.ID, helper); + } + + @Override + public void registerUncraftingRecipes() { + this.addUncraftingRecipe("tipped_arrow_uncraft", Ingredient.of(Items.TIPPED_ARROW), 8, 4, new String[]{"AAA", "A A", "AAA"}, Ingredient.of(Items.ARROW)); + } +} diff --git a/src/main/java/twilightforest/data/custom/UncraftingRecipeProvider.java b/src/main/java/twilightforest/data/custom/UncraftingRecipeProvider.java new file mode 100644 index 0000000000..ce0f6f0314 --- /dev/null +++ b/src/main/java/twilightforest/data/custom/UncraftingRecipeProvider.java @@ -0,0 +1,135 @@ +package twilightforest.data.custom; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.Maps; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import net.minecraft.core.NonNullList; +import net.minecraft.data.CachedOutput; +import net.minecraft.data.DataProvider; +import net.minecraft.data.PackOutput; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraftforge.common.data.ExistingFileHelper; +import net.minecraftforge.registries.ForgeRegistries; +import twilightforest.TwilightForestMod; +import twilightforest.init.TFRecipes; +import twilightforest.item.recipe.UncraftingRecipe; + +import java.nio.file.Path; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.concurrent.CompletableFuture; +import java.util.stream.Collectors; + +public abstract class UncraftingRecipeProvider implements DataProvider { + private final PackOutput output; + private final String modId; + private final ExistingFileHelper helper; + protected final Map builders = Maps.newLinkedHashMap(); + + public UncraftingRecipeProvider(PackOutput output, final String modId, final ExistingFileHelper helper) { + this.output = output; + this.modId = modId; + this.helper = helper; + } + + public abstract void registerUncraftingRecipes(); + + @Override + public CompletableFuture run(CachedOutput cache) { + this.builders.clear(); + this.registerUncraftingRecipes(); + + ImmutableList.Builder> futuresBuilder = new ImmutableList.Builder<>(); + + this.builders.forEach((uncraftingRecipe, pattern) -> { + List list = builders.keySet().stream().filter(s -> { + String name = s.getId().getPath(); + return this.missing(name) && !this.builders.containsKey(uncraftingRecipe); + }).toList(); + + if (!list.isEmpty()) { + throw new IllegalArgumentException(String.format("Duplicate Uncrafting recipe: %s", list.stream().map(Objects::toString).collect(Collectors.joining(", ")))); + } else { + JsonObject obj = serializeToJson(uncraftingRecipe, pattern); + Path path = createPath(new ResourceLocation(modId, (uncraftingRecipe.getId().getPath()))); + futuresBuilder.add(DataProvider.saveStable(cache, obj, path)); + } + }); + return CompletableFuture.allOf(futuresBuilder.build().toArray(CompletableFuture[]::new)); + } + + private boolean missing(String name) { + return !this.helper.exists(new ResourceLocation(this.modId, name), new ExistingFileHelper.ResourceType(net.minecraft.server.packs.PackType.SERVER_DATA, ".json", "uncrafting")); + } + + private Path createPath(ResourceLocation name) { + return this.output.getOutputFolder().resolve("data/" + name.getNamespace() + "/recipes/uncrafting/" + name.getPath() + ".json"); + } + + private JsonObject serializeToJson(UncraftingRecipe uncraftingRecipe, String[] pattern) { + JsonObject jsonobject = new JsonObject(); + + jsonobject.addProperty("type", Objects.requireNonNull(ForgeRegistries.RECIPE_SERIALIZERS.getKey(TFRecipes.UNCRAFTING_SERIALIZER.get())).toString()); + jsonobject.add("ingredient", uncraftingRecipe.ingredient().toJson()); + jsonobject.addProperty("count", uncraftingRecipe.count()); + jsonobject.addProperty("cost", uncraftingRecipe.cost()); + + JsonArray jsonarray = new JsonArray(); + for (String line : pattern) jsonarray.add(line); + jsonobject.add("pattern", jsonarray); + + Map keyedPattern = new HashMap<>(); + for (String s : pattern) { + for (int x = 0; x < uncraftingRecipe.width(); x++) { + char key = s.charAt(x); + if (key != ' ' && !keyedPattern.containsKey(key)) + keyedPattern.put(key, uncraftingRecipe.getIngredients().get(keyedPattern.size())); + } + } + + JsonObject keyObject = new JsonObject(); + + for (Map.Entry entry : keyedPattern.entrySet()) { + keyObject.add(entry.getKey().toString(), entry.getValue().toJson()); + } + + jsonobject.add("key", keyObject); + + return jsonobject; + } + + @Override + public String getName() { + return this.modId + " Uncrafting Recipes"; + } + + /** + * To generate the pattern, simply make an array of strings between the size of 0 and 3, and fill it with the characters of your choosing. + * There must also be 0 to 3 characters in each string, the same amount in each. Insert an empty space (' '), to skip a slot. + * After, provide the method with the output ingredients that will automatically be assigned to the pattern characters in order of appearance. + */ + public void addUncraftingRecipe(String name, Ingredient input, int count, int cost, String[] pattern, Ingredient... output) { + int width = pattern[0].length(); + int height = pattern.length; + if (width > 3 || height > 3) { + TwilightForestMod.LOGGER.error("The pattern must be 3x3 in size, or smaller!"); + return; + } else if (width == 0) { + TwilightForestMod.LOGGER.error("A pattern line can not be empty!"); + return; + } + + for (String s : pattern) { + if (s.length() != width) { + TwilightForestMod.LOGGER.error("Each line of a recipe pattern must be the same length!"); + return; + } + } + + this.builders.put(new UncraftingRecipe(new ResourceLocation(name), cost, width, height, input, count, NonNullList.of(Ingredient.EMPTY, output)), pattern); + } +} diff --git a/src/main/java/twilightforest/data/custom/package-info.java b/src/main/java/twilightforest/data/custom/package-info.java new file mode 100644 index 0000000000..cc3f149541 --- /dev/null +++ b/src/main/java/twilightforest/data/custom/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.data.custom; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/data/custom/stalactites/StalactiteGenerator.java b/src/main/java/twilightforest/data/custom/stalactites/StalactiteGenerator.java new file mode 100644 index 0000000000..dfaaffa638 --- /dev/null +++ b/src/main/java/twilightforest/data/custom/stalactites/StalactiteGenerator.java @@ -0,0 +1,34 @@ +package twilightforest.data.custom.stalactites; + +import net.minecraft.data.PackOutput; +import net.minecraft.world.level.block.Blocks; +import twilightforest.TwilightForestMod; +import twilightforest.data.custom.stalactites.entry.Stalactite; + +import java.util.Map; + +public class StalactiteGenerator extends StalactiteProvider { + public StalactiteGenerator(PackOutput output) { + super(output, TwilightForestMod.ID); + } + + @Override + protected void createStalactites() { + this.makeStalactite(new Stalactite(Map.of(Blocks.IRON_ORE, 20, Blocks.RAW_IRON_BLOCK, 1), 0.7F, 8, 24), Stalactite.HollowHillType.SMALL); + this.makeStalactite(new Stalactite(Map.of(Blocks.COAL_ORE, 1), 0.8F, 12, 24), Stalactite.HollowHillType.SMALL); + this.makeStalactite(new Stalactite(Map.of(Blocks.COPPER_ORE, 20, Blocks.RAW_COPPER_BLOCK, 1), 0.6F, 12, 12), Stalactite.HollowHillType.SMALL); + this.makeStalactite(new Stalactite(Map.of(Blocks.GLOWSTONE, 1), 0.5F, 8, 12), Stalactite.HollowHillType.SMALL); + + this.makeStalactite(new Stalactite(Map.of(Blocks.GOLD_ORE, 10, Blocks.RAW_GOLD_BLOCK, 1), 0.6F, 6, 20), Stalactite.HollowHillType.MEDIUM); + this.makeStalactite(new Stalactite(Map.of(Blocks.REDSTONE_ORE, 1), 0.8F, 8, 40), Stalactite.HollowHillType.MEDIUM); + + this.makeStalactite(new Stalactite(Map.of(Blocks.DIAMOND_ORE, 1), 0.5F, 4, 30), Stalactite.HollowHillType.LARGE); + this.makeStalactite(new Stalactite(Map.of(Blocks.LAPIS_ORE, 1), 0.8F, 8, 30), Stalactite.HollowHillType.LARGE); + this.makeStalactite(new Stalactite(Map.of(Blocks.EMERALD_ORE, 1), 0.5F, 3, 15), Stalactite.HollowHillType.LARGE); + } + + @Override + public String getName() { + return "Twilight Forest Hollow Hill Stalactites"; + } +} diff --git a/src/main/java/twilightforest/data/custom/stalactites/StalactiteProvider.java b/src/main/java/twilightforest/data/custom/stalactites/StalactiteProvider.java new file mode 100644 index 0000000000..c12f54da7d --- /dev/null +++ b/src/main/java/twilightforest/data/custom/stalactites/StalactiteProvider.java @@ -0,0 +1,107 @@ +package twilightforest.data.custom.stalactites; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.Maps; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonObject; +import com.mojang.datafixers.util.Pair; +import net.minecraft.data.CachedOutput; +import net.minecraft.data.DataProvider; +import net.minecraft.data.PackOutput; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.Block; +import net.minecraftforge.registries.ForgeRegistries; +import twilightforest.data.custom.stalactites.entry.Stalactite; +import twilightforest.data.custom.stalactites.entry.StalactiteReloadListener; + +import java.nio.file.Path; +import java.util.Locale; +import java.util.Map; +import java.util.StringJoiner; +import java.util.concurrent.CompletableFuture; +import java.util.stream.Collectors; + +public abstract class StalactiteProvider implements DataProvider { + + private final PackOutput generator; + private final String modid; + private final PackOutput.PathProvider entryPath; + protected final Map, Stalactite.HollowHillType> builder = Maps.newLinkedHashMap(); + + public StalactiteProvider(PackOutput generator, String modid) { + this.generator = generator; + this.modid = modid; + this.entryPath = generator.createPathProvider(PackOutput.Target.DATA_PACK, "stalactites/entries"); + } + + @Override + public CompletableFuture run(CachedOutput output) { + Map map = Maps.newHashMap(); + + Map smallHillEntries = Maps.newHashMap(); + Map medHillEntries = Maps.newHashMap(); + Map largeHillEntries = Maps.newHashMap(); + + ImmutableList.Builder> futuresBuilder = new ImmutableList.Builder<>(); + + this.builder.clear(); + this.createStalactites(); + this.builder.forEach((stalactiteMap, type) -> { + if (type == Stalactite.HollowHillType.LARGE) { + largeHillEntries.put(stalactiteMap.getFirst(), stalactiteMap.getSecond()); + } else if (type == Stalactite.HollowHillType.MEDIUM) { + medHillEntries.put(stalactiteMap.getFirst(), stalactiteMap.getSecond()); + } else { + smallHillEntries.put(stalactiteMap.getFirst(), stalactiteMap.getSecond()); + } + map.put(stalactiteMap.getFirst(), stalactiteMap.getSecond()); + }); + + map.forEach((resourceLocation, stalactite) -> { + Path path = this.entryPath.json(resourceLocation); + futuresBuilder.add(DataProvider.saveStable(output, StalactiteReloadListener.serialize(stalactite), path)); + + }); + + Gson hillGson = new GsonBuilder().setPrettyPrinting().create(); + + for (Stalactite.HollowHillType type : Stalactite.HollowHillType.values()) { + Path hillPath = this.generator.getOutputFolder().resolve("data/twilightforest/stalactites/" + type.name().toLowerCase(Locale.ROOT) + "_hollow_hill.json"); + Map mapToUse = type == Stalactite.HollowHillType.LARGE ? largeHillEntries : type == Stalactite.HollowHillType.MEDIUM ? medHillEntries : smallHillEntries; + + JsonObject object = new JsonObject(); + object.addProperty("replace", false); + object.add("stalactites", hillGson.toJsonTree(mapToUse.keySet().stream().map(ResourceLocation::toString).sorted().collect(Collectors.toList()))); + + futuresBuilder.add(DataProvider.saveStable(output, object, hillPath)); + } + return CompletableFuture.allOf(futuresBuilder.build().toArray(CompletableFuture[]::new)); + } + + protected abstract void createStalactites(); + + /** + * Add a new Stalactite entry for hollow hills! This will allow your ores (or even blocks, I don't care what you do) to show up in hollow hills. + * + * @param stalactite the stalactite to make. Takes in list of blocks to use + their weights, the size variation (a lower number typically means longer stalactites), a max length, and the weight of the entry. + * @param type the type of hill this stalactite appears in. + *
+ * Do note that this entry is the lowest tier it appears in, meaning if you add a stalactite to a small hill it will show up in all 3 hills. + *
+ * Pick your weights wisely! All weights from lower tiers are transferred up, so if you want to see your spike more often in a given hill, give it a high weight! + */ + protected void makeStalactite(Stalactite stalactite, Stalactite.HollowHillType type) { + var nameBuilder = new StringJoiner("_", "", "_stalactite"); + + for (ResourceLocation entry : stalactite.ores().keySet().stream().map(ForgeRegistries.BLOCKS::getKey).sorted().toList()) + nameBuilder.add(entry.getPath()); + + this.builder.putIfAbsent(Pair.of(new ResourceLocation(this.modid, nameBuilder.toString()), stalactite), type); + } + + @Override + public String getName() { + return this.modid + " Hollow Hill Stalactites"; + } +} diff --git a/src/main/java/twilightforest/data/custom/stalactites/entry/Stalactite.java b/src/main/java/twilightforest/data/custom/stalactites/entry/Stalactite.java new file mode 100644 index 0000000000..95cebcc79b --- /dev/null +++ b/src/main/java/twilightforest/data/custom/stalactites/entry/Stalactite.java @@ -0,0 +1,82 @@ +package twilightforest.data.custom.stalactites.entry; + +import com.google.gson.*; +import it.unimi.dsi.fastutil.Pair; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.GsonHelper; +import net.minecraft.world.level.block.Block; +import net.minecraftforge.event.AddReloadListenerEvent; +import net.minecraftforge.registries.ForgeRegistries; + +import java.lang.reflect.Type; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public record Stalactite(Map ores, float sizeVariation, int maxLength, int weight) { + + private static StalactiteReloadListener STALACTITE_CONFIG; + + public static void reloadStalactites(AddReloadListenerEvent event) { + STALACTITE_CONFIG = new StalactiteReloadListener(); + event.addListener(STALACTITE_CONFIG); + } + + public static StalactiteReloadListener getStalactiteConfig() { + if (STALACTITE_CONFIG == null) + throw new IllegalStateException("Can not retrieve Stalactites yet!"); + return STALACTITE_CONFIG; + } + + public static class Serializer implements JsonDeserializer, JsonSerializer { + + @Override + public Stalactite deserialize(JsonElement json, Type type, JsonDeserializationContext context) throws JsonParseException { + JsonObject jsonobject = GsonHelper.convertToJsonObject(json, "stalactite"); + float size = GsonHelper.getAsFloat(jsonobject, "size_variation"); + int maxLength = GsonHelper.getAsInt(jsonobject, "max_length"); + int weight = GsonHelper.getAsInt(jsonobject, "weight"); + + return new Stalactite(this.deserializeBlockMap(jsonobject), size, maxLength, weight); + } + + private Map deserializeBlockMap(JsonObject json) { + JsonArray array = GsonHelper.getAsJsonArray(json, "blocks"); + Map map = new HashMap<>(); + array.forEach(jsonElement -> { + map.put(ForgeRegistries.BLOCKS.getValue(ResourceLocation.tryParse(GsonHelper.getAsString(jsonElement.getAsJsonObject(), "block"))), GsonHelper.getAsInt(jsonElement.getAsJsonObject(), "weight")); + }); + return map; + } + + @Override + public JsonElement serialize(Stalactite stalactite, Type type, JsonSerializationContext context) { + JsonObject jsonobject = new JsonObject(); + JsonArray array = new JsonArray(); + + List> blockWeights = stalactite.ores().entrySet().stream() + .map(e -> Pair.of(ForgeRegistries.BLOCKS.getKey(e.getKey()), e.getValue())) + .sorted(Comparator.comparing(Pair::left)) // Compare only the resource locations + .toList(); + + for (Pair entry : blockWeights) { + JsonObject entryObject = new JsonObject(); + entryObject.add("block", context.serialize(entry.left().getPath())); + entryObject.add("weight", context.serialize(entry.right())); + array.add(entryObject); + } + jsonobject.add("blocks", array); + jsonobject.add("size_variation", context.serialize(stalactite.sizeVariation())); + jsonobject.add("max_length", context.serialize(stalactite.maxLength())); + jsonobject.add("weight", context.serialize(stalactite.weight())); + return jsonobject; + } + } + + public enum HollowHillType { + SMALL, + MEDIUM, + LARGE + } +} diff --git a/src/main/java/twilightforest/data/custom/stalactites/entry/StalactiteReloadListener.java b/src/main/java/twilightforest/data/custom/stalactites/entry/StalactiteReloadListener.java new file mode 100644 index 0000000000..b923524cf0 --- /dev/null +++ b/src/main/java/twilightforest/data/custom/stalactites/entry/StalactiteReloadListener.java @@ -0,0 +1,98 @@ +package twilightforest.data.custom.stalactites.entry; + +import com.google.gson.*; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.packs.resources.Resource; +import net.minecraft.server.packs.resources.ResourceManager; +import net.minecraft.server.packs.resources.SimpleJsonResourceReloadListener; +import net.minecraft.util.GsonHelper; +import net.minecraft.util.RandomSource; +import net.minecraft.util.profiling.ProfilerFiller; +import twilightforest.TwilightForestMod; +import twilightforest.world.components.feature.BlockSpikeFeature; + +import java.io.*; +import java.nio.charset.StandardCharsets; +import java.util.*; + +public class StalactiteReloadListener extends SimpleJsonResourceReloadListener { + + public static final Gson GSON = new GsonBuilder().registerTypeAdapter(Stalactite.class, new Stalactite.Serializer()).create(); + + private final Map smallStalactites = new HashMap<>(); + private final Map mediumStalactites = new HashMap<>(); + private final Map largeStalactites = new HashMap<>(); + + public StalactiteReloadListener() { + super(GSON, "stalactites"); + } + + @Override + protected void apply(Map object, ResourceManager resourceManager, ProfilerFiller profiler) { + + for (Stalactite.HollowHillType type : Stalactite.HollowHillType.values()) { + ResourceLocation resourcelocation = new ResourceLocation(TwilightForestMod.ID, "stalactites/" + type.name().toLowerCase(Locale.ROOT) + "_hollow_hill.json"); + List finalLocations = new ArrayList<>(); + Map mapToUse = + type == Stalactite.HollowHillType.LARGE ? this.largeStalactites : + type == Stalactite.HollowHillType.MEDIUM ? this.mediumStalactites : + this.smallStalactites; + + for (Resource resource : resourceManager.getResourceStack(resourcelocation)) { + try (InputStream inputstream = resource.open(); + Reader reader = new BufferedReader(new InputStreamReader(inputstream, StandardCharsets.UTF_8))) { + JsonObject jsonobject = GsonHelper.fromJson(GSON, reader, JsonObject.class); + boolean replace = jsonobject.get("replace").getAsBoolean(); + if (replace) + finalLocations.clear(); + JsonArray entryList = jsonobject.get("stalactites").getAsJsonArray(); + for (JsonElement entry : entryList) { + ResourceLocation loc = new ResourceLocation(entry.getAsString().replace(":", ":entries/")); + finalLocations.remove(loc); + finalLocations.add(loc); + } + } catch (RuntimeException | IOException ioexception) { + TwilightForestMod.LOGGER.error("Couldn't read Hollow Hill list {} in data pack {}", resourcelocation, resource.sourcePackId(), ioexception); + } + + if (finalLocations.isEmpty()) { + TwilightForestMod.LOGGER.warn("Hollow Hill list {} was empty, adding default stone entry so things don't break!", resourcelocation); + mapToUse.put(new ResourceLocation(TwilightForestMod.ID, "default_fallback_stone"), BlockSpikeFeature.STONE_STALACTITE); + break; + } + + for (ResourceLocation location : finalLocations) { + JsonElement json = object.get(location); + mapToUse.put(location, GSON.fromJson(json, Stalactite.class)); + } + } + } + + TwilightForestMod.LOGGER.info("Loaded {} Stalactite configs!", this.getLargeStalactites().size()); + } + + public static JsonElement serialize(Stalactite stalactite) { + return GSON.toJsonTree(stalactite); + } + + public Map getLargeStalactites() { + Map finalMap = this.largeStalactites; + finalMap.putAll(this.getMediumStalactites()); + return finalMap; + } + + public Map getMediumStalactites() { + Map finalMap = this.mediumStalactites; + finalMap.putAll(this.getSmallStalactites()); + return finalMap; + } + + public Map getSmallStalactites() { + return this.smallStalactites; + } + + public Stalactite getRandomStalactiteFromList(RandomSource random, Map map) { + Stalactite[] list = map.values().toArray(new Stalactite[0]); + return list[random.nextInt(list.length)]; + } +} diff --git a/src/main/java/twilightforest/data/custom/stalactites/entry/package-info.java b/src/main/java/twilightforest/data/custom/stalactites/entry/package-info.java new file mode 100644 index 0000000000..cd708cd1b5 --- /dev/null +++ b/src/main/java/twilightforest/data/custom/stalactites/entry/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.data.custom.stalactites.entry; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/data/custom/stalactites/package-info.java b/src/main/java/twilightforest/data/custom/stalactites/package-info.java new file mode 100644 index 0000000000..abb2007f75 --- /dev/null +++ b/src/main/java/twilightforest/data/custom/stalactites/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.data.custom.stalactites; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/data/helpers/BlockModelBuilders.java b/src/main/java/twilightforest/data/helpers/BlockModelBuilders.java new file mode 100644 index 0000000000..2c3c720fbb --- /dev/null +++ b/src/main/java/twilightforest/data/helpers/BlockModelBuilders.java @@ -0,0 +1,483 @@ +package twilightforest.data.helpers; + +import net.minecraft.core.Direction; +import net.minecraft.data.PackOutput; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.Block; +import net.minecraftforge.client.model.generators.BlockModelBuilder; +import net.minecraftforge.client.model.generators.ConfiguredModel; +import net.minecraftforge.client.model.generators.ModelBuilder; +import net.minecraftforge.client.model.generators.ModelFile; +import net.minecraftforge.common.data.ExistingFileHelper; +import org.jetbrains.annotations.Nullable; +import twilightforest.enums.HollowLogVariants; + +import static twilightforest.TwilightForestMod.prefix; + +public abstract class BlockModelBuilders extends BlockModelHelpers { + + public BlockModelBuilders(PackOutput output, ExistingFileHelper helper) { + super(output, helper); + } + + protected BlockModelBuilder makeTintedBlockAll(String name, ResourceLocation renderType) { + return this.makeTintedBlock(name, renderType) + .texture("north", "#all").texture("south", "#all").texture("east", "#all") + .texture("west", "#all").texture("up", "#all").texture("down", "#all"); + } + + protected BlockModelBuilder makeTintedBlockColumn(String name) { + return this.makeTintedBlock(name, SOLID) + .texture("north", "#side").texture("south", "#side").texture("east", "#side") + .texture("west", "#side").texture("up", "#end").texture("down", "#end"); + } + + protected BlockModelBuilder makeTintedBlockColumnUniqueBottom(String name) { + return this.makeTintedBlock(name, SOLID) + .texture("north", "#side").texture("south", "#side").texture("east", "#side") + .texture("west", "#side").texture("up", "#top").texture("down", "#bottom"); + } + + protected BlockModelBuilder makeTintedBlock(String name, ResourceLocation renderType) { + return models().withExistingParent(name, "minecraft:block/block").renderType(renderType).texture("particle", "#north") + .element().from(0.0F, 0.0F, 0.0F).to(16.0F, 16.0F, 16.0F) + .face(Direction.NORTH).texture("#north").cullface(Direction.NORTH).tintindex(0).end() + .face(Direction.EAST).texture("#east").cullface(Direction.EAST).tintindex(0).end() + .face(Direction.SOUTH).texture("#south").cullface(Direction.SOUTH).tintindex(0).end() + .face(Direction.WEST).texture("#west").cullface(Direction.WEST).tintindex(0).end() + .face(Direction.UP).texture("#up").cullface(Direction.UP).tintindex(0).end() + .face(Direction.DOWN).texture("#down").cullface(Direction.DOWN).tintindex(0).end().end(); + } + + protected BlockModelBuilder makeEmissiveBlockAll(String name, ResourceLocation renderType, int emissivity) { + return this.makeEmissiveBlock(name, renderType, emissivity) + .texture("north", "#all").texture("south", "#all").texture("east", "#all") + .texture("west", "#all").texture("up", "#all").texture("down", "#all"); + } + + protected BlockModelBuilder makeEmissiveBlock(String name, ResourceLocation renderType, int emissivity) { + return models().withExistingParent(name, "minecraft:block/block").renderType(renderType).texture("particle", "#north") + .element().from(0.0F, 0.0F, 0.0F).to(16.0F, 16.0F, 16.0F) + .face(Direction.NORTH).texture("#north").cullface(Direction.NORTH).emissivity(emissivity, emissivity).tintindex(0).end() + .face(Direction.EAST).texture("#east").cullface(Direction.EAST).emissivity(emissivity, emissivity).tintindex(0).end() + .face(Direction.SOUTH).texture("#south").cullface(Direction.SOUTH).emissivity(emissivity, emissivity).tintindex(0).end() + .face(Direction.WEST).texture("#west").cullface(Direction.WEST).emissivity(emissivity, emissivity).tintindex(0).end() + .face(Direction.UP).texture("#up").cullface(Direction.UP).emissivity(emissivity, emissivity).tintindex(0).end() + .face(Direction.DOWN).texture("#down").cullface(Direction.DOWN).emissivity(emissivity, emissivity).tintindex(0).end().end(); + } + + protected BlockModelBuilder makeTintedFlippedBlockAll(String name) { + return models().withExistingParent(name, "minecraft:block/block").texture("particle", "#all") + .element().from(0.0F, 0.0F, 0.0F).to(16.0F, 16.0F, 16.0F) + .face(Direction.NORTH).uvs(0.0F, 16.0F, 16.0F, 0.0F).texture("#all").cullface(Direction.NORTH).tintindex(0).end() + .face(Direction.EAST).uvs(0.0F, 16.0F, 16.0F, 0.0F).texture("#all").cullface(Direction.EAST).tintindex(0).end() + .face(Direction.SOUTH).uvs(0.0F, 16.0F, 16.0F, 0.0F).texture("#all").cullface(Direction.SOUTH).tintindex(0).end() + .face(Direction.WEST).uvs(0.0F, 16.0F, 16.0F, 0.0F).texture("#all").cullface(Direction.WEST).tintindex(0).end() + .face(Direction.UP).uvs(0.0F, 16.0F, 16.0F, 0.0F).texture("#all").cullface(Direction.UP).tintindex(0).end() + .face(Direction.DOWN).uvs(0.0F, 16.0F, 16.0F, 0.0F).texture("#all").cullface(Direction.DOWN).tintindex(0).end().end(); + } + + protected BlockModelBuilder makeTintedSlab(String name) { + return models().withExistingParent(name, "minecraft:block/block").texture("particle", "#side") + .element().from(0.0F, 0.0F, 0.0F).to(16.0F, 8.0F, 16.0F) + .face(Direction.NORTH).texture("#side").cullface(Direction.NORTH).tintindex(0).end() + .face(Direction.EAST).texture("#side").cullface(Direction.EAST).tintindex(0).end() + .face(Direction.SOUTH).texture("#side").cullface(Direction.SOUTH).tintindex(0).end() + .face(Direction.WEST).texture("#side").cullface(Direction.WEST).tintindex(0).end() + .face(Direction.UP).texture("#top").tintindex(0).end() + .face(Direction.DOWN).texture("#bottom").cullface(Direction.DOWN).tintindex(0).end().end(); + } + + protected BlockModelBuilder make4x4x4SmallCube(String name) { + return models().withExistingParent(name, "minecraft:block/block").renderType(CUTOUT).texture("particle", "#all") + .element().from(6.0F, 6.0F, 6.0F).to(10.0F, 10.0F, 10.0F) + .face(Direction.NORTH).texture("#all").cullface(Direction.NORTH).emissivity(15, 15).end() + .face(Direction.EAST).texture("#all").cullface(Direction.EAST).emissivity(15, 15).end() + .face(Direction.SOUTH).texture("#all").cullface(Direction.SOUTH).emissivity(15, 15).end() + .face(Direction.WEST).texture("#all").cullface(Direction.WEST).emissivity(15, 15).end() + .face(Direction.UP).texture("#all").cullface(Direction.UP).emissivity(15, 15).end() + .face(Direction.DOWN).texture("#all").cullface(Direction.DOWN).emissivity(15, 15).end().end(); + } + + protected BlockModelBuilder makeCubeWithTopLayer(String name, ResourceLocation renderType, int layer1em, int layer2em) { + return models().withExistingParent(name, "minecraft:block/block").renderType(renderType).texture("particle", "#bottom") + .element().from(0.0F, 0.0F, 0.0F).to(16.0F, 16.0F, 16.0F) + .face(Direction.NORTH).texture("#north").cullface(Direction.NORTH).emissivity(layer1em, layer1em).end() + .face(Direction.EAST).texture("#east").cullface(Direction.EAST).emissivity(layer1em, layer1em).end() + .face(Direction.SOUTH).texture("#south").cullface(Direction.SOUTH).emissivity(layer1em, layer1em).end() + .face(Direction.WEST).texture("#west").cullface(Direction.WEST).emissivity(layer1em, layer1em).end() + .face(Direction.UP).texture("#top").cullface(Direction.UP).emissivity(layer1em, layer1em).end() + .face(Direction.DOWN).texture("#bottom").cullface(Direction.DOWN).emissivity(layer1em, layer1em).end().end() + .element().from(0.0F, 0.0F, 0.0F).to(16.0F, 16.0F, 16.0F) + .face(Direction.UP).texture("#top2").cullface(Direction.UP).emissivity(layer2em, layer2em).end().end(); + } + + protected BlockModelBuilder make2LayerCubeAllSidesSame(String name, ResourceLocation renderType, int layer1em, int layer2em, boolean shade) { + return this.make2LayerCube(name, renderType, + layer1em, layer1em, layer1em, layer1em, layer1em, layer1em, + layer2em, layer2em, layer2em, layer2em, layer2em, layer2em, shade) + .texture("north", "#all").texture("south", "#all").texture("east", "#all") + .texture("west", "#all").texture("top", "#all").texture("bottom", "#all") + .texture("north2", "#all2").texture("south2", "#all2").texture("east2", "#all2") + .texture("west2", "#all2").texture("top2", "#all2").texture("bottom2", "#all2"); + } + + protected BlockModelBuilder make2LayerCube(String name, ResourceLocation renderType, + int layer1emN, int layer1emS, int layer1emW, int layer1emE, int layer1emU, int layer1emD, + int layer2emN, int layer2emS, int layer2emW, int layer2emE, int layer2emU, int layer2emD, boolean shade) { + return models().withExistingParent(name, "minecraft:block/block").renderType(renderType).texture("particle", "#bottom") + .element().from(0.0F, 0.0F, 0.0F).to(16.0F, 16.0F, 16.0F).shade(shade) + .face(Direction.NORTH).texture("#north").cullface(Direction.NORTH).emissivity(layer1emN, layer1emN).end() + .face(Direction.EAST).texture("#east").cullface(Direction.EAST).emissivity(layer1emE, layer1emE).end() + .face(Direction.SOUTH).texture("#south").cullface(Direction.SOUTH).emissivity(layer1emS, layer1emS).end() + .face(Direction.WEST).texture("#west").cullface(Direction.WEST).emissivity(layer1emW, layer1emW).end() + .face(Direction.UP).texture("#top").cullface(Direction.UP).emissivity(layer1emU, layer1emU).end() + .face(Direction.DOWN).texture("#bottom").cullface(Direction.DOWN).emissivity(layer1emD, layer1emD).end().end() + .element().from(0.0F, 0.0F, 0.0F).to(16.0F, 16.0F, 16.0F) + .face(Direction.NORTH).texture("#north2").cullface(Direction.NORTH).emissivity(layer2emN, layer2emN).tintindex(0).end() + .face(Direction.EAST).texture("#east2").cullface(Direction.EAST).emissivity(layer2emE, layer2emE).tintindex(0).end() + .face(Direction.SOUTH).texture("#south2").cullface(Direction.SOUTH).emissivity(layer2emS, layer2emS).tintindex(0).end() + .face(Direction.WEST).texture("#west2").cullface(Direction.WEST).emissivity(layer2emW, layer2emW).tintindex(0).end() + .face(Direction.UP).texture("#top2").cullface(Direction.UP).emissivity(layer2emU, layer2emU).tintindex(0).end() + .face(Direction.DOWN).texture("#bottom2").cullface(Direction.DOWN).emissivity(layer2emD, layer2emD).tintindex(0).end().end(); + } + + protected BlockModelBuilder make2LayerCubeNoBottom(String name, ResourceLocation renderType, int layer1em, int layer2em, boolean shade) { + return models().withExistingParent(name, "minecraft:block/block").renderType(renderType).texture("particle", "#bottom") + .element().from(0.0F, 0.0F, 0.0F).to(16.0F, 16.0F, 16.0F).shade(shade) + .face(Direction.NORTH).texture("#north").cullface(Direction.NORTH).emissivity(layer1em, layer1em).end() + .face(Direction.EAST).texture("#east").cullface(Direction.EAST).emissivity(layer1em, layer1em).end() + .face(Direction.SOUTH).texture("#south").cullface(Direction.SOUTH).emissivity(layer1em, layer1em).end() + .face(Direction.WEST).texture("#west").cullface(Direction.WEST).emissivity(layer1em, layer1em).end() + .face(Direction.UP).texture("#top").cullface(Direction.UP).emissivity(layer1em, layer1em).end() + .face(Direction.DOWN).texture("#bottom").cullface(Direction.DOWN).emissivity(layer1em, layer1em).end().end() + .element().from(0.0F, 0.0F, 0.0F).to(16.0F, 16.0F, 16.0F).shade(shade) + .face(Direction.NORTH).texture("#north2").cullface(Direction.NORTH).emissivity(layer2em, layer2em).end() + .face(Direction.EAST).texture("#east2").cullface(Direction.EAST).emissivity(layer2em, layer2em).end() + .face(Direction.SOUTH).texture("#south2").cullface(Direction.SOUTH).emissivity(layer2em, layer2em).end() + .face(Direction.WEST).texture("#west2").cullface(Direction.WEST).emissivity(layer2em, layer2em).end() + .face(Direction.UP).texture("#top2").cullface(Direction.UP).emissivity(layer2em, layer2em).end().end(); + } + + protected BlockModelBuilder make3LayerCubeAllSidesSame(String name, ResourceLocation renderType, int layer1em, int layer2em, int layer3em) { + return this.make3LayerCube(name, renderType, + layer1em, layer1em, layer1em, layer1em, layer1em, layer1em, + layer2em, layer2em, layer2em, layer2em, layer2em, layer2em, + layer3em, layer3em, layer3em, layer3em, layer3em, layer3em) + .texture("north", "#all").texture("south", "#all").texture("east", "#all") + .texture("west", "#all").texture("top", "#all").texture("bottom", "#all") + .texture("north2", "#all2").texture("south2", "#all2").texture("east2", "#all2") + .texture("west2", "#all2").texture("top2", "#all2").texture("bottom2", "#all2") + .texture("north3", "#all3").texture("south3", "#all3").texture("east3", "#all3") + .texture("west3", "#all3").texture("top3", "#all3").texture("bottom3", "#all3"); + } + + protected BlockModelBuilder make3LayerCube(String name, ResourceLocation renderType, + int layer1emN, int layer1emS, int layer1emW, int layer1emE, int layer1emU, int layer1emD, + int layer2emN, int layer2emS, int layer2emW, int layer2emE, int layer2emU, int layer2emD, + int layer3emN, int layer3emS, int layer3emW, int layer3emE, int layer3emU, int layer3emD) { + return models().withExistingParent(name, "minecraft:block/block").renderType(renderType).texture("particle", "#bottom") + .element().from(0.0F, 0.0F, 0.0F).to(16.0F, 16.0F, 16.0F) + .face(Direction.NORTH).texture("#north").cullface(Direction.NORTH).emissivity(layer1emN, layer1emN).end() + .face(Direction.EAST).texture("#east").cullface(Direction.EAST).emissivity(layer1emE, layer1emE).end() + .face(Direction.SOUTH).texture("#south").cullface(Direction.SOUTH).emissivity(layer1emS, layer1emS).end() + .face(Direction.WEST).texture("#west").cullface(Direction.WEST).emissivity(layer1emW, layer1emW).end() + .face(Direction.UP).texture("#top").cullface(Direction.UP).emissivity(layer1emU, layer1emU).end() + .face(Direction.DOWN).texture("#bottom").cullface(Direction.DOWN).emissivity(layer1emD, layer1emD).end().end() + .element().from(0.0F, 0.0F, 0.0F).to(16.0F, 16.0F, 16.0F) + .face(Direction.NORTH).texture("#north2").cullface(Direction.NORTH).emissivity(layer2emN, layer2emN).end() + .face(Direction.EAST).texture("#east2").cullface(Direction.EAST).emissivity(layer2emE, layer2emE).end() + .face(Direction.SOUTH).texture("#south2").cullface(Direction.SOUTH).emissivity(layer2emS, layer2emS).end() + .face(Direction.WEST).texture("#west2").cullface(Direction.WEST).emissivity(layer2emW, layer2emW).end() + .face(Direction.UP).texture("#top2").cullface(Direction.UP).emissivity(layer2emU, layer2emU).end() + .face(Direction.DOWN).texture("#bottom2").cullface(Direction.DOWN).emissivity(layer2emD, layer2emD).end().end() + .element().from(0.0F, 0.0F, 0.0F).to(16.0F, 16.0F, 16.0F) + .face(Direction.NORTH).texture("#north3").cullface(Direction.NORTH).emissivity(layer3emN, layer3emN).end() + .face(Direction.EAST).texture("#east3").cullface(Direction.EAST).emissivity(layer3emE, layer3emE).end() + .face(Direction.SOUTH).texture("#south3").cullface(Direction.SOUTH).emissivity(layer3emS, layer3emS).end() + .face(Direction.WEST).texture("#west3").cullface(Direction.WEST).emissivity(layer3emW, layer3emW).end() + .face(Direction.UP).texture("#top3").cullface(Direction.UP).emissivity(layer3emU, layer3emU).end() + .face(Direction.DOWN).texture("#bottom3").cullface(Direction.DOWN).emissivity(layer3emD, layer3emD).end().end(); + } + + protected BlockModelBuilder make3LayerCubeIdenticalSides1Bottom(String name, int layer1em, int layer2emTop, int layer2emSides, int layer3emTop, int layer3emSides) { + return this.make3LayerCubeIdenticalSides1Bottom(name, + layer1em, layer1em, layer1em, layer1em, layer1em, layer1em, + layer2emSides, layer2emSides, layer2emSides, layer2emSides, layer2emTop, + layer3emSides, layer3emSides, layer3emSides, layer3emSides, layer3emTop); + } + + protected BlockModelBuilder make3LayerCubeIdenticalSides1Bottom(String name, + int layer1emN, int layer1emS, int layer1emW, int layer1emE, int layer1emU, int layer1emD, + int layer2emN, int layer2emS, int layer2emW, int layer2emE, int layer2emU, + int layer3emN, int layer3emS, int layer3emW, int layer3emE, int layer3emU) { + return models().withExistingParent(name, "minecraft:block/block").renderType(CUTOUT).texture("particle", "#bottom") + .element().from(0.0F, 0.0F, 0.0F).to(16.0F, 16.0F, 16.0F) + .face(Direction.NORTH).texture("#side").cullface(Direction.NORTH).emissivity(layer1emN, layer1emN).end() + .face(Direction.EAST).texture("#side").cullface(Direction.EAST).emissivity(layer1emE, layer1emE).end() + .face(Direction.SOUTH).texture("#side").cullface(Direction.SOUTH).emissivity(layer1emS, layer1emS).end() + .face(Direction.WEST).texture("#side").cullface(Direction.WEST).emissivity(layer1emW, layer1emW).end() + .face(Direction.UP).texture("#top").cullface(Direction.UP).emissivity(layer1emU, layer1emU).end() + .face(Direction.DOWN).texture("#bottom").cullface(Direction.DOWN).emissivity(layer1emD, layer1emD).end().end() + .element().from(0.0F, 0.0F, 0.0F).to(16.0F, 16.0F, 16.0F) + .face(Direction.NORTH).texture("#side2").cullface(Direction.NORTH).emissivity(layer2emN, layer2emN).end() + .face(Direction.EAST).texture("#side2").cullface(Direction.EAST).emissivity(layer2emE, layer1emE).end() + .face(Direction.SOUTH).texture("#side2").cullface(Direction.SOUTH).emissivity(layer2emS, layer1emS).end() + .face(Direction.WEST).texture("#side2").cullface(Direction.WEST).emissivity(layer2emW, layer1emW).end() + .face(Direction.UP).texture("#top2").cullface(Direction.UP).emissivity(layer2emU, layer1emU).end().end() + .element().from(0.0F, 0.0F, 0.0F).to(16.0F, 16.0F, 16.0F) + .face(Direction.NORTH).texture("#side3").cullface(Direction.NORTH).emissivity(layer3emN, layer1emN).end() + .face(Direction.EAST).texture("#side3").cullface(Direction.EAST).emissivity(layer3emE, layer3emE).end() + .face(Direction.SOUTH).texture("#side3").cullface(Direction.SOUTH).emissivity(layer3emS, layer3emS).end() + .face(Direction.WEST).texture("#side3").cullface(Direction.WEST).emissivity(layer3emW, layer3emW).end() + .face(Direction.UP).texture("#top3").cullface(Direction.UP).emissivity(layer3emU, layer3emU).end().end(); + } + + protected BlockModelBuilder make2layerCross(String name, ResourceLocation renderType, int layer1em, int layer2em) { + return models().getBuilder(name).ao(false).texture("particle", "#cross").renderType(renderType) + .element().from(0.8F, 0.0F, 8.0F).to(15.2F, 16.0F, 8.0F) + .rotation().origin(8.0F, 8.0F, 8.0F).axis(Direction.Axis.Y).angle(45.0F).rescale(true).end() + .shade(false) + .face(Direction.NORTH).uvs(0.0F, 0.0F, 16.0F, 16.0F).texture("#cross").emissivity(layer1em, layer1em).end() + .face(Direction.SOUTH).uvs(0.0F, 0.0F, 16.0F, 16.0F).texture("#cross").emissivity(layer1em, layer1em).end().end() + .element().from(8.0F, 0.0F, 0.8F).to(8.0F, 16.0F, 15.2F) + .rotation().origin(8.0F, 8.0F, 8.0F).axis(Direction.Axis.Y).angle(45.0F).rescale(true).end() + .shade(false) + .face(Direction.WEST).uvs(0.0F, 0.0F, 16.0F, 16.0F).texture("#cross").emissivity(layer1em, layer1em).end() + .face(Direction.EAST).uvs(0.0F, 0.0F, 16.0F, 16.0F).texture("#cross").emissivity(layer1em, layer1em).end().end() + .element().from(0.8F, 0.0F, 8.0F).to(15.2F, 16.0F, 8.0F) + .rotation().origin(8.0F, 8.0F, 8.0F).axis(Direction.Axis.Y).angle(45.0F).rescale(true).end() + .shade(false) + .face(Direction.NORTH).uvs(0.0F, 0.0F, 16.0F, 16.0F).texture("#cross2").emissivity(layer2em, layer2em).end() + .face(Direction.SOUTH).uvs(0.0F, 0.0F, 16.0F, 16.0F).texture("#cross2").emissivity(layer2em, layer2em).end().end() + .element().from(8.0F, 0.0F, 0.8F).to(8.0F, 16.0F, 15.2F) + .rotation().origin(8.0F, 8.0F, 8.0F).axis(Direction.Axis.Y).angle(45.0F).rescale(true).end() + .shade(false) + .face(Direction.WEST).uvs(0.0F, 0.0F, 16.0F, 16.0F).texture("#cross2").emissivity(layer2em, layer2em).end() + .face(Direction.EAST).uvs(0.0F, 0.0F, 16.0F, 16.0F).texture("#cross2").emissivity(layer2em, layer2em).end().end(); + } + + protected BlockModelBuilder buildFallenLeaves(int index) { + return models().getBuilder("fallen_leaves" + index).renderType(CUTOUT).texture("particle", "#all").texture("all", "minecraft:block/oak_leaves") + .element().from(0, 0, 0).to(16, index == 1 ? 0.2F : 2.0F * (index - 1), 16) + .face(Direction.UP).uvs(0, 0, 16, 16).tintindex(0).texture("#all").end() + .face(Direction.DOWN).uvs(0, 0, 16, 16).tintindex(0).texture("#all").end() + .face(Direction.NORTH).uvs(0, 0, 16, index == 1 ? 0.2F : 2.0F * (index - 1)).tintindex(0).texture("#all").end() + .face(Direction.SOUTH).uvs(0, 0, 16, index == 1 ? 0.2F : 2.0F * (index - 1)).tintindex(0).texture("#all").end() + .face(Direction.EAST).uvs(0, 0, 16, index == 1 ? 0.2F : 2.0F * (index - 1)).tintindex(0).texture("#all").end() + .face(Direction.WEST).uvs(0, 0, 16, index == 1 ? 0.2F : 2.0F * (index - 1)).tintindex(0).texture("#all").end() + .end(); + } + + protected ModelFile buildCandelabra(final int leftHeight, final int centerHeight, final int rightHeight) { + return this.models().withExistingParent("candelabra_" + leftHeight + "_" + centerHeight + "_" + rightHeight, "minecraft:block/block").renderType(CUTOUT).texture("particle", "#candelabra").texture("candelabra", "block/candelabra") + .element().from(0, 1, 8).to(16, 7, 8).face(Direction.NORTH).uvs(0, 0, 16, 6).texture("#candelabra").end().face(Direction.SOUTH).uvs(16, 0, 0, 6).texture("#candelabra").end().end() + .element().from(8, 1, 5).to(8, 7, 11).face(Direction.EAST).uvs(0, 6, 6, 12).texture("#candelabra").end().face(Direction.WEST).uvs(6, 6, 0, 12).texture("#candelabra").end().end() + .element().from(1, 7, 6).to(5, 8, 10).allFaces((direction, builder) -> builder.uvs(0, 12, 4, direction.getAxis().isHorizontal() ? 13 : 16).texture("#candelabra")).end() + .element().from(6, 7, 6).to(10, 8, 10).allFaces((direction, builder) -> builder.uvs(0, 12, 4, direction.getAxis().isHorizontal() ? 13 : 16).texture("#candelabra")).end() + .element().from(11, 7, 6).to(15, 8, 10).allFaces((direction, builder) -> builder.uvs(0, 12, 4, direction.getAxis().isHorizontal() ? 13 : 16).texture("#candelabra")).end() + .element().from(6, 0, 6).to(10, 1, 10).allFaces((direction, builder) -> builder.uvs(0, 12, 4, direction.getAxis().isHorizontal() ? 13 : 16).texture("#candelabra")).end() + .element().from(2, 8, 7).to(4, 8 + leftHeight, 9).face(Direction.NORTH).end().face(Direction.SOUTH).end().face(Direction.WEST).end().face(Direction.EAST).end().faces((direction, builder) -> builder.uvs(0, 8, 2, 8 + leftHeight).texture("#candle")).face(Direction.UP).uvs(0, 6, 2, 8).texture("#candle").end().end() + .element().from(7, 8, 7).to(9, 8 + centerHeight, 9).face(Direction.NORTH).end().face(Direction.SOUTH).end().face(Direction.WEST).end().face(Direction.EAST).end().faces((direction, builder) -> builder.uvs(0, 8, 2, 8 + centerHeight).texture("#candle")).face(Direction.UP).uvs(0, 6, 2, 8).texture("#candle").end().end() + .element().from(12, 8, 7).to(14, 8 + rightHeight, 9).face(Direction.NORTH).end().face(Direction.SOUTH).end().face(Direction.WEST).end().face(Direction.EAST).end().faces((direction, builder) -> builder.uvs(0, 8, 2, 8 + rightHeight).texture("#candle")).face(Direction.UP).uvs(0, 6, 2, 8).texture("#candle").end().end() + .element().from(2.5f, 8 + leftHeight, 8).to(3.5f, 9 + leftHeight, 8).rotation().angle(45).axis(Direction.Axis.Y).origin(3, 8 + leftHeight, 8).end().face(Direction.NORTH).uvs(0, 5, 1, 6).texture("#candle").end().face(Direction.SOUTH).uvs(0, 5, 1, 6).texture("#candle").end().end() + .element().from(2.5f, 8 + leftHeight, 8).to(3.5f, 9 + leftHeight, 8).rotation().angle(-45).axis(Direction.Axis.Y).origin(3, 8 + leftHeight, 8).end().face(Direction.NORTH).uvs(0, 5, 1, 6).texture("#candle").end().face(Direction.SOUTH).uvs(0, 5, 1, 6).texture("#candle").end().end() + .element().from(7.5f, 8 + centerHeight, 8).to(8.5f, 9 + centerHeight, 8).rotation().angle(45).axis(Direction.Axis.Y).origin(8, 8 + centerHeight, 8).end().face(Direction.NORTH).uvs(0, 5, 1, 6).texture("#candle").end().face(Direction.SOUTH).uvs(0, 5, 1, 6).texture("#candle").end().end() + .element().from(7.5f, 8 + centerHeight, 8).to(8.5f, 9 + centerHeight, 8).rotation().angle(-45).axis(Direction.Axis.Y).origin(8, 8 + centerHeight, 8).end().face(Direction.NORTH).uvs(0, 5, 1, 6).texture("#candle").end().face(Direction.SOUTH).uvs(0, 5, 1, 6).texture("#candle").end().end() + .element().from(12.5f, 8 + rightHeight, 8).to(13.5f, 9 + rightHeight, 8).rotation().angle(45).axis(Direction.Axis.Y).origin(13, 8 + rightHeight, 8).end().face(Direction.NORTH).uvs(0, 5, 1, 6).texture("#candle").end().face(Direction.SOUTH).uvs(0, 5, 1, 6).texture("#candle").end().end() + .element().from(12.5f, 8 + rightHeight, 8).to(13.5f, 9 + rightHeight, 8).rotation().angle(-45).axis(Direction.Axis.Y).origin(13, 8 + rightHeight, 8).end().face(Direction.NORTH).uvs(0, 5, 1, 6).texture("#candle").end().face(Direction.SOUTH).uvs(0, 5, 1, 6).texture("#candle").end().end() + ; + } + + protected ModelFile buildWallCandelabra(final int leftHeight, final int centerHeight, final int rightHeight) { + return this.models().withExistingParent("candelabra_wall_" + leftHeight + "_" + centerHeight + "_" + rightHeight, "minecraft:block/block").renderType(CUTOUT).texture("particle", "#candelabra").texture("candelabra", "block/candelabra") + .element().from(0, 1, 12).to(16, 7, 12).face(Direction.NORTH).uvs(0, 0, 16, 6).texture("#candelabra").end().face(Direction.SOUTH).uvs(16, 0, 0, 6).texture("#candelabra").end().end() + .element().from(8, 1, 9).to(8, 7, 15).face(Direction.EAST).uvs(0, 6, 6, 12).texture("#candelabra").end().face(Direction.WEST).uvs(6, 6, 0, 12).texture("#candelabra").end().end() + .element().from(1, 7, 10).to(5, 8, 14).allFaces((direction, builder) -> builder.uvs(0, 12, 4, direction.getAxis().isHorizontal() ? 13 : 16).texture("#candelabra")).end() + .element().from(6, 7, 10).to(10, 8, 14).allFaces((direction, builder) -> builder.uvs(0, 12, 4, direction.getAxis().isHorizontal() ? 13 : 16).texture("#candelabra")).end() + .element().from(11, 7, 10).to(15, 8, 14).allFaces((direction, builder) -> builder.uvs(0, 12, 4, direction.getAxis().isHorizontal() ? 13 : 16).texture("#candelabra")).end() + .element().from(6, 2, 15).to(10, 6, 16).allFaces((direction, builder) -> builder.uvs(direction.getAxis() == Direction.Axis.X ? 3 : 0, 12, 4, direction.getAxis() == Direction.Axis.Y ? 13 : 16).texture("#candelabra")).end() + .element().from(2, 8, 11).to(4, 8 + leftHeight, 13).face(Direction.NORTH).end().face(Direction.SOUTH).end().face(Direction.WEST).end().face(Direction.EAST).end().faces((direction, builder) -> builder.uvs(0, 8, 2, 8 + leftHeight).texture("#candle")).face(Direction.UP).uvs(0, 6, 2, 8).texture("#candle").end().end() + .element().from(7, 8, 11).to(9, 8 + centerHeight, 13).face(Direction.NORTH).end().face(Direction.SOUTH).end().face(Direction.WEST).end().face(Direction.EAST).end().faces((direction, builder) -> builder.uvs(0, 8, 2, 8 + centerHeight).texture("#candle")).face(Direction.UP).uvs(0, 6, 2, 8).texture("#candle").end().end() + .element().from(12, 8, 11).to(14, 8 + rightHeight, 13).face(Direction.NORTH).end().face(Direction.SOUTH).end().face(Direction.WEST).end().face(Direction.EAST).end().faces((direction, builder) -> builder.uvs(0, 8, 2, 8 + rightHeight).texture("#candle")).face(Direction.UP).uvs(0, 6, 2, 8).texture("#candle").end().end() + .element().from(2.5f, 8 + leftHeight, 12).to(3.5f, 9 + leftHeight, 12).rotation().angle(45).axis(Direction.Axis.Y).origin(3, 8 + leftHeight, 12).end().face(Direction.NORTH).uvs(0, 5, 1, 6).texture("#candle").end().face(Direction.SOUTH).uvs(0, 5, 1, 6).texture("#candle").end().end() + .element().from(2.5f, 8 + leftHeight, 12).to(3.5f, 9 + leftHeight, 12).rotation().angle(-45).axis(Direction.Axis.Y).origin(3, 8 + leftHeight, 12).end().face(Direction.NORTH).uvs(0, 5, 1, 6).texture("#candle").end().face(Direction.SOUTH).uvs(0, 5, 1, 6).texture("#candle").end().end() + .element().from(7.5f, 8 + centerHeight, 12).to(8.5f, 9 + centerHeight, 12).rotation().angle(45).axis(Direction.Axis.Y).origin(8, 8 + centerHeight, 12).end().face(Direction.NORTH).uvs(0, 5, 1, 6).texture("#candle").end().face(Direction.SOUTH).uvs(0, 5, 1, 6).texture("#candle").end().end() + .element().from(7.5f, 8 + centerHeight, 12).to(8.5f, 9 + centerHeight, 12).rotation().angle(-45).axis(Direction.Axis.Y).origin(8, 8 + centerHeight, 12).end().face(Direction.NORTH).uvs(0, 5, 1, 6).texture("#candle").end().face(Direction.SOUTH).uvs(0, 5, 1, 6).texture("#candle").end().end() + .element().from(12.5f, 8 + rightHeight, 12).to(13.5f, 9 + rightHeight, 12).rotation().angle(45).axis(Direction.Axis.Y).origin(13, 8 + rightHeight, 12).end().face(Direction.NORTH).uvs(0, 5, 1, 6).texture("#candle").end().face(Direction.SOUTH).uvs(0, 5, 1, 6).texture("#candle").end().end() + .element().from(12.5f, 8 + rightHeight, 12).to(13.5f, 9 + rightHeight, 12).rotation().angle(-45).axis(Direction.Axis.Y).origin(13, 8 + rightHeight, 12).end().face(Direction.NORTH).uvs(0, 5, 1, 6).texture("#candle").end().face(Direction.SOUTH).uvs(0, 5, 1, 6).texture("#candle").end().end() + ; + } + + protected BlockModelBuilder buildVerticalLog(@Nullable HollowLogVariants.Climbable variant) { + BlockModelBuilder model = this.models().withExistingParent(variant == null ? "vertical_hollow_log" : "vertical_hollow_log_" + variant.getSerializedName(), "minecraft:block/block").texture("particle", "#side") + .element().from(0, 0, 0).to(2, 16, 16).allFaces(((dir, builder) -> builder.cullface(dir).texture(dir == Direction.EAST ? "#inner" : dir.getAxis() == Direction.Axis.Y ? "#top" : "#side"))).face(Direction.EAST).cullface(null).end().end() + .element().from(14, 0, 0).to(16, 16, 16).allFaces(((dir, builder) -> builder.cullface(dir).texture(dir == Direction.WEST ? "#inner" : dir.getAxis() == Direction.Axis.Y ? "#top" : "#side"))).face(Direction.WEST).cullface(null).end().end() + .element().from(2, 0, 0).to(14, 16, 2).allFaces(((dir, builder) -> builder.cullface(dir).texture(dir == Direction.SOUTH ? "#inner" : dir.getAxis() == Direction.Axis.Y ? "#top" : "#side"))).face(Direction.SOUTH).cullface(null).end().end() + .element().from(2, 0, 14).to(14, 16, 16).allFaces(((dir, builder) -> builder.cullface(dir).texture(dir == Direction.NORTH ? "#inner" : dir.getAxis() == Direction.Axis.Y ? "#top" : "#side"))).face(Direction.NORTH).cullface(null).end().end(); + + if (variant != null) model.element().from(2, 0, 2.8f).to(14, 16, 2.8f) + .face(Direction.NORTH).end().face(Direction.SOUTH).end() + .faces((dir, builder) -> builder.texture("#climbable").tintindex(1)).shade(false).end() + .renderType(CUTOUT).texture("climbable", "minecraft:block/" + variant.getSerializedName()); + + return model; + } + + protected BlockModelBuilder buildHorizontalHollowLog(boolean carpet, boolean grass) { + final int height = carpet ? 3 : 2; + final int heightInv = 16 - height; + grass &= carpet; + + // Top, Bottom, Left side, Right side + BlockModelBuilder model = this.models().withExistingParent(carpet ? (grass ? "horizontal_hollow_log_plant" : "horizontal_hollow_log_carpet") : "horizontal_hollow_log", "minecraft:block/block").renderType(CUTOUT).texture("particle", "#side") + .element().from(0, 0, 0).to(16, height, 16) + .allFaces((dir, builder) -> builder + .uvs(0, dir.getAxis() == Direction.Axis.Y ? 0 : heightInv, 16, 16) + .cullface(dir == Direction.UP ? null : dir) + .texture((carpet && dir == Direction.UP) ? "#carpet" : dir.getAxis() == Direction.Axis.Z ? "#top" : dir == Direction.UP ? "#inner" : "#side") + ) + .face(Direction.EAST).uvs(heightInv, 0, 16, 16).rotation(ModelBuilder.FaceRotation.CLOCKWISE_90).end() + .face(Direction.WEST).uvs(0, 0, height, 16).rotation(ModelBuilder.FaceRotation.COUNTERCLOCKWISE_90).end() + .face(Direction.DOWN).rotation(ModelBuilder.FaceRotation.UPSIDE_DOWN).end() + .end() + .element().from(0, 14, 0).to(16, 16, 16) + .allFaces((dir, builder) -> builder + .uvs(0, 0, 16, dir.getAxis() == Direction.Axis.Y ? 16 : 2) + .cullface(dir == Direction.DOWN ? null : dir) + .texture(dir.getAxis() == Direction.Axis.Z ? "#top" : dir == Direction.DOWN ? "#inner" : "#side") + ) + .face(Direction.EAST).uvs(0, 0, 2, 16).rotation(ModelBuilder.FaceRotation.CLOCKWISE_90).end() + .face(Direction.WEST).uvs(14, 0, 16, 16).rotation(ModelBuilder.FaceRotation.COUNTERCLOCKWISE_90).end() + .face(Direction.DOWN).rotation(ModelBuilder.FaceRotation.UPSIDE_DOWN).end() + .end() + .element().from(0, height, 0).to(2, 14, 16) + .face(Direction.NORTH).uvs(14, 2, 16, heightInv).end() + .face(Direction.SOUTH).uvs(0, 2, 2, heightInv).end() + .face(Direction.EAST).uvs(2, 0, heightInv, 16).rotation(ModelBuilder.FaceRotation.CLOCKWISE_90).end() + .face(Direction.WEST).uvs(height, 0, 14, 16).rotation(ModelBuilder.FaceRotation.COUNTERCLOCKWISE_90).end() + .faces((dir, builder) -> builder.cullface(dir == Direction.EAST ? null : dir).texture(dir.getAxis() == Direction.Axis.Z ? "#top" : dir == Direction.EAST ? "#inner" : "#side")).end() + .element().from(14, height, 0).to(16, 14, 16) + .face(Direction.NORTH).uvs(0, 2, 2, heightInv).end() + .face(Direction.SOUTH).uvs(14, 2, 16, heightInv).end() + .face(Direction.EAST).uvs(2, 0, heightInv, 16).rotation(ModelBuilder.FaceRotation.CLOCKWISE_90).end() + .face(Direction.WEST).uvs(height, 0, 14, 16).rotation(ModelBuilder.FaceRotation.COUNTERCLOCKWISE_90).end() + .faces((dir, builder) -> builder.cullface(dir == Direction.WEST ? null : dir).texture(dir.getAxis() == Direction.Axis.Z ? "#top" : dir == Direction.WEST ? "#inner" : "#side")).end(); + + if (carpet) + model.element().from(0, 0, 0).to(16, height, 16).face(Direction.NORTH).end().face(Direction.SOUTH).end().faces((dir, builder) -> builder.uvs(0, 16 - height, 16, 16).texture("#overhang")); + if (grass) { + model.element().from(0.8f, height, 8).to(15.2f, 14, 8).rotation().origin(8, 8, 8).axis(Direction.Axis.Y).angle(45).rescale(true).end().shade(false).face(Direction.NORTH).end().face(Direction.SOUTH).end().faces((direction, faceBuilder) -> faceBuilder.uvs(0, height, 16, 14).texture("#plant").tintindex(1)); + model.element().from(8, height, 0.8f).to(8, 14, 15.2f).rotation().origin(8, 8, 8).axis(Direction.Axis.Y).angle(45).rescale(true).end().shade(false).face(Direction.WEST).end().face(Direction.EAST).end().faces((direction, faceBuilder) -> faceBuilder.uvs(0, height, 16, 14).texture("#plant").tintindex(1)); + } + + return model; + } + + protected BlockModelBuilder makePedestal(String name, boolean has2layers) { + BlockModelBuilder model = models().withExistingParent(name, "minecraft:block/block").renderType(TRANSLUCENT).texture("particle", "#end") + .element().from(2.0F, 3.0F, 2.0F).to(14.0F, 13.0F, 14.0F) + .face(Direction.NORTH).texture("#north").emissivity(0, 0).end().face(Direction.SOUTH).texture("#south").emissivity(0, 0).end() + .face(Direction.WEST).texture("#west").emissivity(0, 0).end().face(Direction.EAST).texture("#east").emissivity(0, 0).end().end() + .element().from(1.0F, 0.0F, 1.0F).to(15.0F, 3.0F, 15.0F) + .face(Direction.UP).texture("#end").emissivity(0, 0).end().face(Direction.DOWN).texture("#end").emissivity(0, 0).cullface(Direction.DOWN).end() + .face(Direction.NORTH).texture("#north").emissivity(0, 0).end().face(Direction.SOUTH).texture("#south").emissivity(0, 0).end() + .face(Direction.WEST).texture("#west").emissivity(0, 0).end().face(Direction.EAST).texture("#east").emissivity(0, 0).end().end() + .element().from(1.0F, 13.0F, 1.0F).to(15.0F, 16.0F, 15.0F) + .face(Direction.UP).texture("#end").emissivity(0, 0).cullface(Direction.UP).end().face(Direction.DOWN).texture("#end").emissivity(0, 0).end() + .face(Direction.NORTH).texture("#north").emissivity(0, 0).end().face(Direction.SOUTH).texture("#south").emissivity(0, 0).end() + .face(Direction.WEST).texture("#west").emissivity(0, 0).end().face(Direction.EAST).texture("#east").emissivity(0, 0).end().end() + .element().from(1.0F, 12.0F, 1.0F).to(4.0F, 13.0F, 4.0F) + .face(Direction.DOWN).texture("#end").emissivity(0, 0).end() + .face(Direction.NORTH).texture("#north").emissivity(0, 0).end().face(Direction.SOUTH).texture("#south").emissivity(0, 0).end() + .face(Direction.WEST).texture("#west").emissivity(0, 0).end().face(Direction.EAST).texture("#east").emissivity(0, 0).end().end() + .element().from(12.0F, 12.0F, 1.0F).to(15.0F, 13.0F, 4.0F) + .face(Direction.DOWN).texture("#end").emissivity(0, 0).end() + .face(Direction.NORTH).texture("#north").emissivity(0, 0).end().face(Direction.SOUTH).texture("#south").emissivity(0, 0).end() + .face(Direction.WEST).texture("#west").emissivity(0, 0).end().face(Direction.EAST).texture("#east").emissivity(0, 0).end().end() + .element().from(1.0F, 12.0F, 12.0F).to(4.0F, 13.0F, 15.0F) + .face(Direction.DOWN).texture("#end").emissivity(0, 0).end() + .face(Direction.NORTH).texture("#north").emissivity(0, 0).end().face(Direction.SOUTH).texture("#south").emissivity(0, 0).end() + .face(Direction.WEST).texture("#west").emissivity(0, 0).end().face(Direction.EAST).texture("#east").emissivity(0, 0).end().end() + .element().from(12.0F, 12.0F, 12.0F).to(15.0F, 13.0F, 15.0F) + .face(Direction.DOWN).texture("#end").emissivity(0, 0).end() + .face(Direction.NORTH).texture("#north").emissivity(0, 0).end().face(Direction.SOUTH).texture("#south").emissivity(0, 0).end() + .face(Direction.WEST).texture("#west").emissivity(0, 0).end().face(Direction.EAST).texture("#east").emissivity(0, 0).end().end(); + + if (has2layers) { + model = model.element().from(2.0F, 3.0F, 2.0F).to(14.0F, 13.0F, 14.0F) + .face(Direction.NORTH).texture("#north2").emissivity(15, 15).end() + .face(Direction.SOUTH).texture("#south2").emissivity(15, 15).end() + .face(Direction.WEST).texture("#west2").emissivity(15, 15).end() + .face(Direction.EAST).texture("#east2").emissivity(15, 15).end().end() + .element().from(1.0F, 0.0F, 1.0F).to(15.0F, 16.0F, 15.0F) + .face(Direction.DOWN).texture("#end2").emissivity(12, 12).cullface(Direction.DOWN).end() + .face(Direction.UP).texture("#end2").emissivity(12, 12).cullface(Direction.UP).end().end() + .element().from(1.0F, 12.0F, 1.0F).to(4.0F, 13.0F, 4.0F) + .face(Direction.NORTH).texture("#north2").emissivity(15, 15).end() + .face(Direction.SOUTH).texture("#south2").emissivity(15, 15).end() + .face(Direction.WEST).texture("#west2").emissivity(15, 15).end() + .face(Direction.EAST).texture("#east2").emissivity(15, 15).end().end() + .element().from(12.0F, 12.0F, 1.0F).to(15.0F, 13.0F, 4.0F) + .face(Direction.NORTH).texture("#north2").emissivity(15, 15).end() + .face(Direction.SOUTH).texture("#south2").emissivity(15, 15).end() + .face(Direction.WEST).texture("#west2").emissivity(15, 15).end() + .face(Direction.EAST).texture("#east2").emissivity(15, 15).end().end() + .element().from(1.0F, 12.0F, 12.0F).to(4.0F, 13.0F, 15.0F) + .face(Direction.NORTH).texture("#north2").emissivity(15, 15).end() + .face(Direction.SOUTH).texture("#south2").emissivity(15, 15).end() + .face(Direction.WEST).texture("#west2").emissivity(15, 15).end() + .face(Direction.EAST).texture("#east2").emissivity(15, 15).end().end() + .element().from(12.0F, 12.0F, 12.0F).to(15.0F, 13.0F, 15.0F) + .face(Direction.NORTH).texture("#north2").emissivity(15, 15).end() + .face(Direction.SOUTH).texture("#south2").emissivity(15, 15).end() + .face(Direction.WEST).texture("#west2").emissivity(15, 15).end() + .face(Direction.EAST).texture("#east2").emissivity(15, 15).end().end(); + + model = model.element().from(2.0F, 3.0F, 2.0F).to(14.0F, 13.0F, 14.0F) + .face(Direction.NORTH).texture("#north3").emissivity(10, 10).end() + .face(Direction.SOUTH).texture("#south3").emissivity(10, 10).end() + .face(Direction.WEST).texture("#west3").emissivity(10, 10).end() + .face(Direction.EAST).texture("#east3").emissivity(10, 10).end().end(); + } + + return model; + } + + protected BlockModelBuilder makeJar(String name) { + return models().withExistingParent(name, "minecraft:block/block").renderType(CUTOUT) + .texture("particle", "#side") + .texture("side", prefix("block/jar_side")) + .texture("bottom", prefix("block/jar_bottom")) + .texture("top", prefix("block/jar_top")) + .element().from(3.0F, 0.0F, 3.0F).to(13.0F, 14.0F, 13.0F) + .face(Direction.UP).texture("#top").end() + .face(Direction.DOWN).texture("#bottom").cullface(Direction.DOWN).end() + .face(Direction.NORTH).texture("#side").end() + .face(Direction.SOUTH).texture("#side").end() + .face(Direction.WEST).texture("#side").end() + .face(Direction.EAST).texture("#side").end().end() + .element().from(4.0F, 12.0F, 4.0F).to(12.0F, 16.0F, 12.0F) + .face(Direction.UP).uvs(4.0F, 4.0F, 12.0F, 12.0F).texture("#cork").cullface(Direction.UP).end() + .face(Direction.DOWN).uvs(4.0F, 4.0F, 12.0F, 12.0F).texture("#cork").end() + .face(Direction.NORTH).uvs(4.0F, 0.0F, 12.0F, 4.0F).texture("#cork").end() + .face(Direction.SOUTH).uvs(4.0F, 0.0F, 12.0F, 4.0F).texture("#cork").end() + .face(Direction.WEST).uvs(4.0F, 0.0F, 12.0F, 4.0F).texture("#cork").end() + .face(Direction.EAST).uvs(4.0F, 0.0F, 12.0F, 4.0F).texture("#cork").end().end(); + } + + protected BlockModelBuilder cubeAllTinted(String name, String all, boolean flipV) { + return (flipV ? this.makeTintedFlippedBlockAll(name) : this.makeTintedBlockAll(name, SOLID)).texture("all", "block/" + all); + } + + protected BlockModelBuilder cubeAllTinted(String name, String all) { + return cubeAllTinted(name, all, false); + } + + protected void tintedAndFlipped(Block b) { + simpleBlock(b, ConfiguredModel.builder() + .modelFile(cubeAllTinted(name(b), name(b))).nextModel() + .modelFile(cubeAllTinted(name(b) + "_flipped", name(b), true)).build() + ); + } +} diff --git a/src/main/java/twilightforest/data/helpers/BlockModelHelpers.java b/src/main/java/twilightforest/data/helpers/BlockModelHelpers.java new file mode 100644 index 0000000000..29603f3353 --- /dev/null +++ b/src/main/java/twilightforest/data/helpers/BlockModelHelpers.java @@ -0,0 +1,405 @@ +package twilightforest.data.helpers; + +import net.minecraft.core.Direction; +import net.minecraft.data.DataGenerator; +import net.minecraft.data.PackOutput; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.*; +import net.minecraft.world.level.block.state.properties.*; +import net.minecraftforge.client.model.generators.*; +import net.minecraftforge.common.data.ExistingFileHelper; +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.registries.RegistryObject; +import twilightforest.TwilightForestMod; +import twilightforest.block.BanisterBlock; + +import java.util.function.Consumer; + +import static twilightforest.TwilightForestMod.prefix; + +public abstract class BlockModelHelpers extends BlockStateProvider { + + protected static final ResourceLocation SOLID = new ResourceLocation("solid"); + protected static final ResourceLocation CUTOUT = new ResourceLocation("cutout"); + protected static final ResourceLocation CUTOUT_MIPPED = new ResourceLocation("cutout_mipped"); + protected static final ResourceLocation TRANSLUCENT = new ResourceLocation("translucent"); + + public BlockModelHelpers(PackOutput output, ExistingFileHelper exFileHelper) { + super(output, TwilightForestMod.ID, exFileHelper); + } + + protected void builtinEntity(Block b, String particle) { + simpleBlock(b, models().getBuilder(name(b)) + .parent(new ModelFile.UncheckedModelFile("builtin/entity")) + .texture("particle", particle)); + } + + protected void simpleBlockExisting(Block b) { + simpleBlock(b, new ConfiguredModel(models().getExistingFile(prefix(name(b))))); + } + + public void simpleBlockWithRenderType(Block block, ResourceLocation type) { + simpleBlock(block, models().cubeAll(name(block), blockTexture(block)).renderType(type)); + } + + /** + * Generates a blockstate json pointing to one single generated model with the same name as the block + * The single generated model has the given parent and can be customized. + */ + protected void singleBlockBoilerPlate(Block b, String parent, Consumer modelCustomizer) { + BlockModelBuilder bModel = models().withExistingParent(name(b), parent); + modelCustomizer.accept(bModel); + simpleBlock(b, bModel); + } + + protected void logWoodSapling(RotatedPillarBlock log, RotatedPillarBlock slog, RotatedPillarBlock wood, RotatedPillarBlock swood, Block sapling) { + logBlock(log); + logBlock(slog); + ResourceLocation sideTex = blockTexture(log); + axisBlock(wood, sideTex, sideTex); + ResourceLocation sSideTex = blockTexture(slog); + axisBlock(swood, sSideTex, sSideTex); + + ResourceLocation saplingTex = prefix("block/" + name(sapling)); + simpleBlock(sapling, models().cross(name(sapling), saplingTex).renderType(CUTOUT)); + } + + protected void plankBlocks(String variant, Block plank, Block slab, StairBlock stair, Block button, Block fence, Block gate, Block plate, DoorBlock door, TrapDoorBlock trapdoor, BanisterBlock banister) { + this.plankBlocks(variant, plank, slab, stair, button, fence, gate, plate, door, trapdoor, false, banister); + } + + protected void plankBlocks(String variant, Block plank, Block slab, StairBlock stair, Block button, Block fence, Block gate, Block plate, DoorBlock door, TrapDoorBlock trapdoor, boolean cutoutDoors, BanisterBlock banister) { + String plankTexName = "planks_" + variant; + String plankDir = "block/wood/planks/" + variant + "/"; + ResourceLocation tex0 = prefix("block/wood/" + plankTexName + "_0"); + ResourceLocation tex1 = prefix("block/wood/" + plankTexName + "_1"); + ResourceLocation tex2 = prefix("block/wood/" + plankTexName + "_2"); + ResourceLocation tex3 = prefix("block/wood/" + plankTexName + "_3"); + ConfiguredModel[] plankModels = ConfiguredModel.builder() + .weight(10).modelFile(models().cubeAll(plankDir + name(plank), tex0)).nextModel() + .weight(10).modelFile(models().cubeAll(plankDir + name(plank) + "_1", tex1)).nextModel() + .weight(1).modelFile(models().cubeAll(plankDir + name(plank) + "_2", tex2)).nextModel() + .weight(1).modelFile(models().cubeAll(plankDir + name(plank) + "_3", tex3)).build(); + simpleBlock(plank, plankModels); + + String slabDir = "block/wood/slab/" + variant + "/"; + ConfiguredModel[] bottomSlabModels = ConfiguredModel.builder() + .weight(10).modelFile(models().slab(slabDir + name(slab), tex0, tex0, tex0)).nextModel() + .weight(10).modelFile(models().slab(slabDir + name(slab) + "_1", tex1, tex1, tex1)).nextModel() + .weight(1).modelFile(models().slab(slabDir + name(slab) + "_2", tex2, tex2, tex2)).nextModel() + .weight(1).modelFile(models().slab(slabDir + name(slab) + "_3", tex3, tex3, tex3)).build(); + ConfiguredModel[] topSlabModels = ConfiguredModel.builder() + .weight(10).uvLock(true).rotationX(180).modelFile(bottomSlabModels[0].model).nextModel() + .weight(10).uvLock(true).rotationX(180).modelFile(bottomSlabModels[1].model).nextModel() + .weight(1).uvLock(true).rotationX(180).modelFile(bottomSlabModels[2].model).nextModel() + .weight(1).uvLock(true).rotationX(180).modelFile(bottomSlabModels[3].model).build(); + getVariantBuilder(slab).partialState().with(SlabBlock.TYPE, SlabType.BOTTOM).setModels(bottomSlabModels); + getVariantBuilder(slab).partialState().with(SlabBlock.TYPE, SlabType.TOP).setModels(topSlabModels); + getVariantBuilder(slab).partialState().with(SlabBlock.TYPE, SlabType.DOUBLE).setModels(plankModels); + + woodStairs(stair, plankTexName, variant); + woodButton(button, plankTexName, variant); + woodFence(fence, plankTexName, variant); + woodGate(gate, plankTexName, variant); + woodPlate(plate, plankTexName, variant); + String doorDir = "block/wood/door/" + variant + "/"; + String trapdoorDir = "block/wood/trapdoor/" + variant + "/"; + + if(cutoutDoors) { + doorBlockWithRenderType(door, doorDir + name(door), prefix("block/wood/door/" + variant + "_lower"), prefix("block/wood/door/" + variant + "_upper"), CUTOUT); + trapdoorBlockWithRenderType(trapdoor, trapdoorDir + variant, prefix("block/wood/trapdoor/" + variant + "_trapdoor"), true, CUTOUT); + } else { + doorBlock(door, doorDir + name(door), prefix("block/wood/door/" + variant + "_lower"), prefix("block/wood/door/" + variant + "_upper")); + trapdoorBlock(trapdoor, trapdoorDir + variant, prefix("block/wood/trapdoor/" + variant + "_trapdoor"), true); + + } + banister(banister, plankTexName, variant); + } + + protected void woodGate(Block gate, String texName, String variant) { + String gateDir = "block/wood/fence_gate/" + variant + "/"; + + ResourceLocation tex0 = prefix("block/wood/" + texName + "_0"); + ResourceLocation tex1 = prefix("block/wood/" + texName + "_1"); + ResourceLocation tex2 = prefix("block/wood/" + texName + "_2"); + ResourceLocation tex3 = prefix("block/wood/" + texName + "_3"); + + ModelFile gate0 = models().fenceGate(gateDir + name(gate), tex0); + ModelFile gate1 = models().fenceGate(gateDir + name(gate) + "_1", tex1); + ModelFile gate2 = models().fenceGate(gateDir + name(gate) + "_2", tex2); + ModelFile gate3 = models().fenceGate(gateDir + name(gate) + "_3", tex3); + ModelFile open0 = models().fenceGateOpen(gateDir + name(gate) + "_open", tex0); + ModelFile open1 = models().fenceGateOpen(gateDir + name(gate) + "_open_1", tex1); + ModelFile open2 = models().fenceGateOpen(gateDir + name(gate) + "_open_2", tex2); + ModelFile open3 = models().fenceGateOpen(gateDir + name(gate) + "_open_3", tex3); + ModelFile wall0 = models().fenceGateWall(gateDir + name(gate) + "_wall", tex0); + ModelFile wall1 = models().fenceGateWall(gateDir + name(gate) + "_wall_1", tex1); + ModelFile wall2 = models().fenceGateWall(gateDir + name(gate) + "_wall_2", tex2); + ModelFile wall3 = models().fenceGateWall(gateDir + name(gate) + "_wall_3", tex3); + ModelFile wallOpen0 = models().fenceGateWallOpen(gateDir + name(gate) + "_wall_open", tex0); + ModelFile wallOpen1 = models().fenceGateWallOpen(gateDir + name(gate) + "_wall_open_1", tex1); + ModelFile wallOpen2 = models().fenceGateWallOpen(gateDir + name(gate) + "_wall_open_2", tex2); + ModelFile wallOpen3 = models().fenceGateWallOpen(gateDir + name(gate) + "_wall_open_3", tex3); + + // [VanillaCopy] super.fenceGateBlock except with more models + getVariantBuilder(gate).forAllStatesExcept(state -> { + ModelFile model0 = gate0; + ModelFile model1 = gate1; + ModelFile model2 = gate2; + ModelFile model3 = gate3; + if (state.getValue(FenceGateBlock.IN_WALL)) { + model0 = wall0; + model1 = wall1; + model2 = wall2; + model3 = wall3; + } + if (state.getValue(FenceGateBlock.OPEN)) { + model0 = model0 == wall0 ? wallOpen0 : open0; + model1 = model1 == wall1 ? wallOpen1 : open1; + model2 = model2 == wall2 ? wallOpen2 : open2; + model3 = model3 == wall3 ? wallOpen3 : open3; + } + return ConfiguredModel.builder() + .weight(10).modelFile(model0) + .rotationY((int) state.getValue(HorizontalDirectionalBlock.FACING).toYRot()) + .uvLock(true).nextModel() + + .weight(10).modelFile(model1) + .rotationY((int) state.getValue(HorizontalDirectionalBlock.FACING).toYRot()) + .uvLock(true).nextModel() + + .weight(1).modelFile(model2) + .rotationY((int) state.getValue(HorizontalDirectionalBlock.FACING).toYRot()) + .uvLock(true).nextModel() + + .weight(1).modelFile(model3) + .rotationY((int) state.getValue(HorizontalDirectionalBlock.FACING).toYRot()) + .uvLock(true) + .build(); + }, FenceGateBlock.POWERED); + } + + protected void woodFence(Block fence, String texName, String variant) { + String fenceDir = "block/wood/fence/" + variant + "/"; + + ResourceLocation tex0 = prefix("block/wood/" + texName + "_0"); + ResourceLocation tex1 = prefix("block/wood/" + texName + "_1"); + ResourceLocation tex2 = prefix("block/wood/" + texName + "_2"); + ResourceLocation tex3 = prefix("block/wood/" + texName + "_3"); + + ModelFile post0 = models().fencePost(fenceDir + name(fence) + "_post", tex0); + ModelFile post1 = models().fencePost(fenceDir + name(fence) + "_post_1", tex1); + ModelFile post2 = models().fencePost(fenceDir + name(fence) + "_post_2", tex2); + ModelFile post3 = models().fencePost(fenceDir + name(fence) + "_post_3", tex3); + ModelFile side0 = models().fenceSide(fenceDir + name(fence) + "_side", tex0); + ModelFile side1 = models().fenceSide(fenceDir + name(fence) + "_side_1", tex1); + ModelFile side2 = models().fenceSide(fenceDir + name(fence) + "_side_2", tex2); + ModelFile side3 = models().fenceSide(fenceDir + name(fence) + "_side_3", tex3); + + // [VanillaCopy] super.fourWayBlock, but with more models + MultiPartBlockStateBuilder builder = getMultipartBuilder(fence).part() + .weight(10).modelFile(post0).nextModel() + .weight(10).modelFile(post1).nextModel() + .weight(1).modelFile(post2).nextModel() + .weight(1).modelFile(post3).addModel().end(); + PipeBlock.PROPERTY_BY_DIRECTION.forEach((dir, value) -> { + if (dir.getAxis().isHorizontal()) { + builder.part() + .weight(10).modelFile(side0).rotationY((((int) dir.toYRot()) + 180) % 360).uvLock(true).nextModel() + .weight(10).modelFile(side1).rotationY((((int) dir.toYRot()) + 180) % 360).uvLock(true).nextModel() + .weight(1).modelFile(side2).rotationY((((int) dir.toYRot()) + 180) % 360).uvLock(true).nextModel() + .weight(1).modelFile(side3).rotationY((((int) dir.toYRot()) + 180) % 360).uvLock(true) + .addModel() + .condition(value, true); + } + }); + } + + protected void woodPlate(Block plate, String texName, String variant) { + String plateDir = "block/wood/pressure_plate/" + variant + "/"; + + ResourceLocation tex0 = prefix("block/wood/" + texName + "_0"); + ResourceLocation tex1 = prefix("block/wood/" + texName + "_1"); + ResourceLocation tex2 = prefix("block/wood/" + texName + "_2"); + ResourceLocation tex3 = prefix("block/wood/" + texName + "_3"); + ConfiguredModel[] unpressed = ConfiguredModel.builder() + .weight(10).modelFile(models().withExistingParent(plateDir + name(plate), "pressure_plate_up").texture("texture", tex0)).nextModel() + .weight(10).modelFile(models().withExistingParent(plateDir + name(plate) + "_1", "pressure_plate_up").texture("texture", tex1)).nextModel() + .weight(1).modelFile(models().withExistingParent(plateDir + name(plate) + "_2", "pressure_plate_up").texture("texture", tex2)).nextModel() + .weight(1).modelFile(models().withExistingParent(plateDir + name(plate) + "_3", "pressure_plate_up").texture("texture", tex3)).build(); + ConfiguredModel[] pressed = ConfiguredModel.builder() + .weight(10).modelFile(models().withExistingParent(plateDir + name(plate) + "_down", "pressure_plate_down").texture("texture", tex0)).nextModel() + .weight(10).modelFile(models().withExistingParent(plateDir + name(plate) + "_down_1", "pressure_plate_down").texture("texture", tex1)).nextModel() + .weight(1).modelFile(models().withExistingParent(plateDir + name(plate) + "_down_2", "pressure_plate_down").texture("texture", tex2)).nextModel() + .weight(1).modelFile(models().withExistingParent(plateDir + name(plate) + "_down_3", "pressure_plate_down").texture("texture", tex3)).build(); + + getVariantBuilder(plate).partialState().with(PressurePlateBlock.POWERED, false).setModels(unpressed); + getVariantBuilder(plate).partialState().with(PressurePlateBlock.POWERED, true).setModels(pressed); + } + + protected void woodButton(Block button, String texName, String variant) { + String buttonDir = "block/wood/button/" + variant + "/"; + + ResourceLocation tex0 = prefix("block/wood/" + texName + "_0"); + ResourceLocation tex1 = prefix("block/wood/" + texName + "_1"); + ResourceLocation tex2 = prefix("block/wood/" + texName + "_2"); + ResourceLocation tex3 = prefix("block/wood/" + texName + "_3"); + ModelFile unpressed0 = models().withExistingParent(buttonDir + name(button), "button").texture("texture", tex0); + ModelFile pressed0 = models().withExistingParent(buttonDir + name(button) + "_pressed", "button_pressed").texture("texture", tex0); + ModelFile unpressed1 = models().withExistingParent(buttonDir + name(button) + "_1", "button").texture("texture", tex1); + ModelFile pressed1 = models().withExistingParent(buttonDir + name(button) + "_pressed_1", "button_pressed").texture("texture", tex1); + ModelFile unpressed2 = models().withExistingParent(buttonDir + name(button) + "_2", "button").texture("texture", tex2); + ModelFile pressed2 = models().withExistingParent(buttonDir + name(button) + "_pressed_2", "button_pressed").texture("texture", tex2); + ModelFile unpressed3 = models().withExistingParent(buttonDir + name(button) + "_3", "button").texture("texture", tex3); + ModelFile pressed3 = models().withExistingParent(buttonDir + name(button) + "_pressed_3", "button_pressed").texture("texture", tex3); + + getVariantBuilder(button).forAllStates(state -> { + ModelFile model0 = state.getValue(ButtonBlock.POWERED) ? pressed0 : unpressed0; + ModelFile model1 = state.getValue(ButtonBlock.POWERED) ? pressed1 : unpressed1; + ModelFile model2 = state.getValue(ButtonBlock.POWERED) ? pressed2 : unpressed2; + ModelFile model3 = state.getValue(ButtonBlock.POWERED) ? pressed3 : unpressed3; + int rotX = switch (state.getValue(FaceAttachedHorizontalDirectionalBlock.FACE)) { + case WALL -> 90; + case FLOOR -> 0; + case CEILING -> 180; + }; + int rotY = 0; + if (state.getValue(FaceAttachedHorizontalDirectionalBlock.FACE) == AttachFace.CEILING) { + switch (state.getValue(HorizontalDirectionalBlock.FACING)) { + case NORTH -> rotY = 180; + case WEST -> rotY = 90; + case EAST -> rotY = 270; + } + } else { + switch (state.getValue(HorizontalDirectionalBlock.FACING)) { + case SOUTH -> rotY = 180; + case WEST -> rotY = 270; + case EAST -> rotY = 90; + } + } + boolean uvlock = state.getValue(FaceAttachedHorizontalDirectionalBlock.FACE) == AttachFace.WALL; + + return ConfiguredModel.builder() + .weight(10).uvLock(uvlock).rotationX(rotX).rotationY(rotY).modelFile(model0).nextModel() + .weight(10).uvLock(uvlock).rotationX(rotX).rotationY(rotY).modelFile(model1).nextModel() + .weight(1).uvLock(uvlock).rotationX(rotX).rotationY(rotY).modelFile(model2).nextModel() + .weight(1).uvLock(uvlock).rotationX(rotX).rotationY(rotY).modelFile(model3) + .build(); + }); + } + + protected void woodStairs(StairBlock block, String texName, String variant) { + String stairsDir = "block/wood/stairs/" + variant + "/"; + + ResourceLocation tex0 = prefix("block/wood/" + texName + "_0"); + ResourceLocation tex1 = prefix("block/wood/" + texName + "_1"); + ResourceLocation tex2 = prefix("block/wood/" + texName + "_2"); + ResourceLocation tex3 = prefix("block/wood/" + texName + "_3"); + ModelFile main0 = models().stairs(stairsDir + name(block), tex0, tex0, tex0); + ModelFile main1 = models().stairs(stairsDir + name(block) + "_1", tex1, tex1, tex1); + ModelFile main2 = models().stairs(stairsDir + name(block) + "_2", tex2, tex2, tex2); + ModelFile main3 = models().stairs(stairsDir + name(block) + "_3", tex3, tex3, tex3); + ModelFile inner0 = models().stairsInner(stairsDir + name(block) + "_inner", tex0, tex0, tex0); + ModelFile inner1 = models().stairsInner(stairsDir + name(block) + "_inner_1", tex1, tex1, tex1); + ModelFile inner2 = models().stairsInner(stairsDir + name(block) + "_inner_2", tex2, tex2, tex2); + ModelFile inner3 = models().stairsInner(stairsDir + name(block) + "_inner_3", tex3, tex3, tex3); + ModelFile outer0 = models().stairsOuter(stairsDir + name(block) + "_outer", tex0, tex0, tex0); + ModelFile outer1 = models().stairsOuter(stairsDir + name(block) + "_outer_1", tex1, tex1, tex1); + ModelFile outer2 = models().stairsOuter(stairsDir + name(block) + "_outer_2", tex2, tex2, tex2); + ModelFile outer3 = models().stairsOuter(stairsDir + name(block) + "_outer_3", tex3, tex3, tex3); + // [VanillaCopy] super.stairsBlock, but multiple files returned each time + getVariantBuilder(block) + .forAllStatesExcept(state -> { + Direction facing = state.getValue(StairBlock.FACING); + Half half = state.getValue(StairBlock.HALF); + StairsShape shape = state.getValue(StairBlock.SHAPE); + int yRot = (int) facing.getClockWise().toYRot(); // Stairs model is rotated 90 degrees clockwise for some reason + if (shape == StairsShape.INNER_LEFT || shape == StairsShape.OUTER_LEFT) { + yRot += 270; // Left facing stairs are rotated 90 degrees clockwise + } + if (shape != StairsShape.STRAIGHT && half == Half.TOP) { + yRot += 90; // Top stairs are rotated 90 degrees clockwise + } + yRot %= 360; + boolean uvlock = yRot != 0 || half == Half.TOP; // Don't set uvlock for states that have no rotation + return ConfiguredModel.builder() + .weight(10) + .modelFile(shape == StairsShape.STRAIGHT ? main0 : shape == StairsShape.INNER_LEFT || shape == StairsShape.INNER_RIGHT ? inner0 : outer0) + .rotationX(half == Half.BOTTOM ? 0 : 180).rotationY(yRot).uvLock(uvlock) + .nextModel() + + .weight(10) + .modelFile(shape == StairsShape.STRAIGHT ? main1 : shape == StairsShape.INNER_LEFT || shape == StairsShape.INNER_RIGHT ? inner1 : outer1) + .rotationX(half == Half.BOTTOM ? 0 : 180).rotationY(yRot).uvLock(uvlock) + .nextModel() + + .weight(1) + .modelFile(shape == StairsShape.STRAIGHT ? main2 : shape == StairsShape.INNER_LEFT || shape == StairsShape.INNER_RIGHT ? inner2 : outer2) + .rotationX(half == Half.BOTTOM ? 0 : 180).rotationY(yRot).uvLock(uvlock) + .nextModel() + + .weight(1) + .modelFile(shape == StairsShape.STRAIGHT ? main3 : shape == StairsShape.INNER_LEFT || shape == StairsShape.INNER_RIGHT ? inner3 : outer3) + .rotationX(half == Half.BOTTOM ? 0 : 180).rotationY(yRot).uvLock(uvlock) + .build(); + }, StairBlock.WATERLOGGED); + } + + protected void banister(BanisterBlock banister, String texName, String woodVariant) { + String banisterDir = "block/wood/banister/" + woodVariant + "/"; + + ResourceLocation tex0 = prefix("block/wood/" + texName + "_0"); + ResourceLocation tex1 = prefix("block/wood/" + texName + "_1"); + ResourceLocation tex2 = prefix("block/wood/" + texName + "_2"); + ResourceLocation tex3 = prefix("block/wood/" + texName + "_3"); + + getVariantBuilder(banister).forAllStatesExcept(state -> { + Direction facing = state.getValue(BanisterBlock.FACING); + int yRot = (int) facing.toYRot(); + String extended = state.getValue(BanisterBlock.EXTENDED) ? "_extended" : ""; + String variant = state.getValue(BanisterBlock.SHAPE).getSerializedName() + extended; + String newModelName = banisterDir + name(banister) + "_" + variant; + + return ConfiguredModel.builder() + .weight(10).modelFile(models().withExistingParent(newModelName, TwilightForestMod.prefix("banister_" + variant)).texture("texture", tex0)).rotationY(yRot).nextModel() + .weight(10).modelFile(models().withExistingParent(newModelName + "_1", TwilightForestMod.prefix("banister_" + variant)).texture("texture", tex1)).rotationY(yRot).nextModel() + .weight(1).modelFile(models().withExistingParent(newModelName + "_2", TwilightForestMod.prefix("banister_" + variant)).texture("texture", tex2)).rotationY(yRot).nextModel() + .weight(1).modelFile(models().withExistingParent(newModelName + "_3", TwilightForestMod.prefix("banister_" + variant)).texture("texture", tex3)).rotationY(yRot).build(); + }, BanisterBlock.WATERLOGGED); + } + + protected void banisterVanilla(BanisterBlock banister, String texName, String woodVariant) { + String banisterDir = "block/wood/banister/" + woodVariant + "/"; + ResourceLocation tex0 = new ResourceLocation("block/" + texName); + + getVariantBuilder(banister).forAllStatesExcept(state -> { + Direction facing = state.getValue(BanisterBlock.FACING); + int yRot = (int) facing.toYRot(); + String extended = state.getValue(BanisterBlock.EXTENDED) ? "_extended" : ""; + String variant = state.getValue(BanisterBlock.SHAPE).getSerializedName() + extended; + + return ConfiguredModel.builder() + .modelFile(models().withExistingParent(banisterDir + name(banister) + "_" + variant, TwilightForestMod.prefix("banister_" + variant)).texture("texture", tex0)).rotationY(yRot).build(); + }, BanisterBlock.WATERLOGGED); + } + + protected void bisectedStairsBlock(RegistryObject block, ResourceLocation side, ResourceLocation end, ResourceLocation middle) { + this.bisectedStairsBlock(block, block.getId().getPath(), side, end, middle); + } + + protected void bisectedStairsBlock(RegistryObject block, String name, ResourceLocation side, ResourceLocation end, ResourceLocation middle) { + ModelFile stairs = this.models().withExistingParent(name, TwilightForestMod.prefix("block/util/bisected_stairs")).texture("side", side).texture("end", end).texture("middle", middle); + ModelFile stairsInner = this.models().withExistingParent(name + "_inner", TwilightForestMod.prefix("block/util/bisected_inner_stairs")).texture("side", side).texture("end", end).texture("middle", middle); + ModelFile stairsOuter = this.models().withExistingParent(name + "_outer", TwilightForestMod.prefix("block/util/bisected_outer_stairs")).texture("side", side).texture("end", end).texture("middle", middle); + + this.stairsBlock(block.get(), stairs, stairsInner, stairsOuter); + } + + protected ResourceLocation key(Block block) { + return ForgeRegistries.BLOCKS.getKey(block); + } + + protected String name(Block block) { + return key(block).getPath(); + } +} diff --git a/src/main/java/twilightforest/data/helpers/CraftingDataHelper.java b/src/main/java/twilightforest/data/helpers/CraftingDataHelper.java new file mode 100644 index 0000000000..e1456a00ab --- /dev/null +++ b/src/main/java/twilightforest/data/helpers/CraftingDataHelper.java @@ -0,0 +1,352 @@ +package twilightforest.data.helpers; + +import net.minecraft.Util; +import net.minecraft.advancements.critereon.InventoryChangeTrigger; +import net.minecraft.advancements.critereon.ItemPredicate; +import net.minecraft.data.DataGenerator; +import net.minecraft.data.PackOutput; +import net.minecraft.data.recipes.*; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.ItemTags; +import net.minecraft.tags.TagKey; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.alchemy.Potion; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.level.ItemLike; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraftforge.common.Tags; +import net.minecraftforge.common.crafting.PartialNBTIngredient; +import net.minecraftforge.registries.ForgeRegistries; +import twilightforest.TwilightForestMod; +import twilightforest.block.TFChestBlock; +import twilightforest.data.tags.ItemTagGenerator; +import twilightforest.init.TFBlocks; + +import java.util.function.Consumer; +import java.util.function.Supplier; + +public abstract class CraftingDataHelper extends RecipeProvider { + public CraftingDataHelper(PackOutput output) { + super(output); + } + + public final PartialNBTIngredient scepter(Item scepter) { + return PartialNBTIngredient.of(scepter, Util.make(() -> { + CompoundTag nbt = new CompoundTag(); + nbt.putInt(ItemStack.TAG_DAMAGE, scepter.getMaxDamage()); + return nbt; + })); + } + + public final PartialNBTIngredient potion(Potion potion) { + return PartialNBTIngredient.of(Items.POTION, Util.make(() -> { + CompoundTag nbt = new CompoundTag(); + nbt.putString("Potion", ForgeRegistries.POTIONS.getKey(potion).toString()); + return nbt; + })); + } + + protected final void charmRecipe(Consumer consumer, String name, Supplier result, Supplier item) { + ShapelessRecipeBuilder.shapeless(RecipeCategory.TOOLS, result.get()) + .requires(item.get(), 4) + .unlockedBy("has_item", has(item.get())) + .save(consumer, TwilightForestMod.prefix(name)); + } + + protected final void castleBlock(Consumer consumer, Supplier result, ItemLike... ingredients) { + ShapedRecipeBuilder.shaped(RecipeCategory.BUILDING_BLOCKS, result.get(), 4) + .pattern("##") + .pattern("##") + .define('#', Ingredient.of(ingredients)) + .unlockedBy("has_castle_brick", has(TFBlocks.CASTLE_BRICK.get())) + .save(consumer, locCastle(ForgeRegistries.BLOCKS.getKey(result.get()).getPath())); + } + + protected final void stairsBlock(Consumer consumer, ResourceLocation loc, Supplier result, Supplier criteria, ItemLike... ingredients) { + ShapedRecipeBuilder.shaped(RecipeCategory.BUILDING_BLOCKS, result.get(), 8) + .pattern("# ") + .pattern("## ") + .pattern("###") + .define('#', Ingredient.of(ingredients)) + .unlockedBy("has_item", has(criteria.get())) + .save(consumer, loc); + } + + protected final void stairsRightBlock(Consumer consumer, ResourceLocation loc, Supplier result, Supplier criteria, ItemLike... ingredients) { + ShapedRecipeBuilder.shaped(RecipeCategory.BUILDING_BLOCKS, result.get(), 8) + .pattern("###") + .pattern(" ##") + .pattern(" #") + .define('#', Ingredient.of(ingredients)) + .unlockedBy("has_item", has(criteria.get())) + .save(consumer, loc); + } + + protected final void compressedBlock(Consumer consumer, String name, Supplier result, TagKey ingredient) { + ShapedRecipeBuilder.shaped(RecipeCategory.BUILDING_BLOCKS, result.get()) + .pattern("###") + .pattern("###") + .pattern("###") + .define('#', ingredient) + .unlockedBy("has_item", has(ingredient)) + .save(consumer, TwilightForestMod.prefix("compressed_blocks/" + name)); + } + + protected final void reverseCompressBlock(Consumer consumer, String name, Supplier result, TagKey ingredient) { + ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, result.get(), 9) + .requires(ingredient) + .unlockedBy("has_item", has(ingredient)) + .save(consumer, TwilightForestMod.prefix("compressed_blocks/reversed/" + name)); + } + + protected final void helmetItem(Consumer consumer, String name, Supplier result, TagKey material) { + ShapedRecipeBuilder.shaped(RecipeCategory.COMBAT, result.get()) + .pattern("###") + .pattern("# #") + .define('#', material) + .unlockedBy("has_item", has(material)) + .save(consumer, locEquip(name)); + } + + protected final void chestplateItem(Consumer consumer, String name, Supplier result, TagKey material) { + ShapedRecipeBuilder.shaped(RecipeCategory.COMBAT, result.get()) + .pattern("# #") + .pattern("###") + .pattern("###") + .define('#', material) + .unlockedBy("has_item", has(material)) + .save(consumer, locEquip(name)); + } + + protected final void leggingsItem(Consumer consumer, String name, Supplier result, TagKey material) { + ShapedRecipeBuilder.shaped(RecipeCategory.COMBAT, result.get()) + .pattern("###") + .pattern("# #") + .pattern("# #") + .define('#', material) + .unlockedBy("has_item", has(material)) + .save(consumer, locEquip(name)); + } + + protected final void bootsItem(Consumer consumer, String name, Supplier result, TagKey material) { + ShapedRecipeBuilder.shaped(RecipeCategory.COMBAT, result.get()) + .pattern("# #") + .pattern("# #") + .define('#', material) + .unlockedBy("has_item", has(material)) + .save(consumer, locEquip(name)); + } + + protected final void pickaxeItem(Consumer consumer, String name, Supplier result, TagKey material, TagKey handle) { + ShapedRecipeBuilder.shaped(RecipeCategory.TOOLS, result.get()) + .pattern("###") + .pattern(" X ") + .pattern(" X ") + .define('#', material) + .define('X', handle) + .unlockedBy("has_item", has(material)) + .save(consumer, locEquip(name)); + } + + protected final void swordItem(Consumer consumer, String name, Supplier result, TagKey material, TagKey handle) { + ShapedRecipeBuilder.shaped(RecipeCategory.COMBAT, result.get()) + .pattern("#") + .pattern("#") + .pattern("X") + .define('#', material) + .define('X', handle) + .unlockedBy("has_item", has(material)) + .save(consumer, locEquip(name)); + } + + protected final void axeItem(Consumer consumer, String name, Supplier result, TagKey material, TagKey handle) { + ShapedRecipeBuilder.shaped(RecipeCategory.TOOLS, result.get()) + .pattern("##") + .pattern("#X") + .pattern(" X") + .define('#', material) + .define('X', handle) + .unlockedBy("has_item", has(material)) + .save(consumer, locEquip(name)); + } + + protected final void buttonBlock(Consumer consumer, String name, Supplier result, Supplier material) { + ShapelessRecipeBuilder.shapeless(RecipeCategory.REDSTONE, result.get()) + .requires(material.get()) + .unlockedBy("has_item", has(material.get())) + .save(consumer, locWood(name + "_button")); + } + + protected final void doorBlock(Consumer consumer, String name, Supplier result, Supplier material) { + ShapedRecipeBuilder.shaped(RecipeCategory.REDSTONE, result.get(), 3) + .pattern("##") + .pattern("##") + .pattern("##") + .define('#', material.get()) + .unlockedBy("has_item", has(material.get())) + .save(consumer, locWood(name + "_door")); + } + + protected final void fenceBlock(Consumer consumer, String name, Supplier result, Supplier material) { + ShapedRecipeBuilder.shaped(RecipeCategory.DECORATIONS, result.get(), 3) + .pattern("#S#") + .pattern("#S#") + .define('#', material.get()) + .define('S', Tags.Items.RODS_WOODEN) + .unlockedBy("has_item", has(material.get())) + .save(consumer, locWood(name + "_fence")); + } + + protected final void gateBlock(Consumer consumer, String name, Supplier result, Supplier material) { + ShapedRecipeBuilder.shaped(RecipeCategory.REDSTONE, result.get()) + .pattern("S#S") + .pattern("S#S") + .define('#', material.get()) + .define('S', Tags.Items.RODS_WOODEN) + .unlockedBy("has_item", has(material.get())) + .save(consumer, locWood(name + "_gate")); + } + + protected final void planksBlock(Consumer consumer, String name, Supplier result, Supplier material) { + ShapelessRecipeBuilder.shapeless(RecipeCategory.BUILDING_BLOCKS, result.get(), 4) + .requires(material.get()) + .unlockedBy("has_item", has(material.get())) + .save(consumer, locWood(name + "_planks")); + } + + protected final void plateBlock(Consumer consumer, String name, Supplier result, Supplier material) { + ShapedRecipeBuilder.shaped(RecipeCategory.REDSTONE, result.get()) + .pattern("##") + .define('#', material.get()) + .unlockedBy("has_item", has(material.get())) + .save(consumer, locWood(name + "_plate")); + } + + protected final void slabBlock(Consumer consumer, String name, Supplier result, Supplier material) { + ShapedRecipeBuilder.shaped(RecipeCategory.BUILDING_BLOCKS, result.get(), 6) + .pattern("###") + .define('#', material.get()) + .unlockedBy("has_item", has(material.get())) + .save(consumer, locWood(name + "_slab")); + } + + protected final void bannerPattern(Consumer consumer, String name, Supplier trophy, Supplier result) { + ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, result.get()) + .requires(Ingredient.of(ItemTagGenerator.PAPER)) + .requires(Ingredient.of(trophy.get().asItem())) + .unlockedBy("has_trophy", has(trophy.get())) + .save(consumer); + } + + protected final void trapdoorBlock(Consumer consumer, String name, Supplier result, Supplier material) { + ShapedRecipeBuilder.shaped(RecipeCategory.REDSTONE, result.get(), 2) + .pattern("###") + .pattern("###") + .define('#', material.get()) + .unlockedBy("has_item", has(material.get())) + .save(consumer, locWood(name + "_trapdoor")); + } + + protected final void woodBlock(Consumer consumer, String name, Supplier result, Supplier material) { + ShapedRecipeBuilder.shaped(RecipeCategory.BUILDING_BLOCKS, result.get(), 3) + .pattern("##") + .pattern("##") + .define('#', material.get()) + .unlockedBy("has_item", has(material.get())) + .save(consumer, locWood(name + "_wood")); + } + + protected final void strippedWoodBlock(Consumer consumer, String name, Supplier result, Supplier material) { + ShapedRecipeBuilder.shaped(RecipeCategory.BUILDING_BLOCKS, result.get(), 3) + .pattern("##") + .pattern("##") + .define('#', material.get()) + .unlockedBy("has_item", has(material.get())) + .save(consumer, locWood(name + "_stripped_wood")); + } + + protected final void signBlock(Consumer consumer, String name, Supplier result, Supplier material) { + ShapedRecipeBuilder.shaped(RecipeCategory.DECORATIONS, result.get(), 3) + .pattern("###") + .pattern("###") + .pattern(" - ") + .define('#', material.get()) + .define('-', Tags.Items.RODS_WOODEN) + .unlockedBy("has_item", has(material.get())) + .save(consumer, locWood(name + "_wood")); + } + + protected final void banisterBlock(Consumer consumer, String name, Supplier result, Supplier material) { + this.banisterBlock(consumer, name, result, material.get()); + } + + protected final void banisterBlock(Consumer consumer, String name, Supplier result, Block material) { + ShapedRecipeBuilder.shaped(RecipeCategory.DECORATIONS, result.get(), 3) + .pattern("---") + .pattern("| |") + .define('-', material) + .define('|', Tags.Items.RODS_WOODEN) + .unlockedBy("has_item", has(material)) + .save(consumer, locWood(name + "_banister")); + } + + protected final void chestBlock(Consumer consumer, String name, Supplier result, Supplier material) { + ShapedRecipeBuilder.shaped(RecipeCategory.DECORATIONS, result.get(), 2) + .pattern("###") + .pattern("#C#") + .pattern("###") + .define('#', material.get()) + .define('C', Tags.Items.CHESTS_WOODEN) + .unlockedBy("has_item", has(material.get())) + .save(consumer, locWood(name + "_chest")); + } + + protected final void fieryConversion(Consumer consumer, Supplier result, Item armor, int vials) { + ShapelessRecipeBuilder.shapeless(RecipeCategory.COMBAT, result.get()) + .requires(armor) + .requires(Ingredient.of(ItemTagGenerator.FIERY_VIAL), vials) + .unlockedBy("has_item", has(ItemTagGenerator.FIERY_VIAL)) + .save(consumer, locEquip("fiery_" + ForgeRegistries.ITEMS.getKey(result.get()).getPath())); + } + + protected final void buildBoats(Consumer consumer, Supplier boat, Supplier chestBoat, Supplier planks) { + ShapedRecipeBuilder.shaped(RecipeCategory.TRANSPORTATION, boat.get()) + .pattern("P P") + .pattern("PPP") + .define('P', planks.get()) + .group("boat") + .unlockedBy("in_water", insideOf(Blocks.WATER)) + .save(consumer); + + ShapelessRecipeBuilder.shapeless(RecipeCategory.TRANSPORTATION, chestBoat.get()) + .requires(boat.get()) + .requires(Tags.Items.CHESTS_WOODEN) + .group("chest_boat") + .unlockedBy("has_boat", has(ItemTags.BOATS)) + .save(consumer); + } + + protected final ResourceLocation locCastle(String name) { + return TwilightForestMod.prefix("castleblock/" + name); + } + + protected final ResourceLocation locEquip(String name) { + return TwilightForestMod.prefix("equipment/" + name); + } + + protected final ResourceLocation locNaga(String name) { + return TwilightForestMod.prefix("nagastone/" + name); + } + + protected final ResourceLocation locWood(String name) { + return TwilightForestMod.prefix("wood/" + name); + } + + protected static InventoryChangeTrigger.TriggerInstance has(TagKey p_206407_) { + return inventoryTrigger(ItemPredicate.Builder.item().of(p_206407_).build()); + } +} diff --git a/src/main/java/twilightforest/data/helpers/TFLangProvider.java b/src/main/java/twilightforest/data/helpers/TFLangProvider.java new file mode 100644 index 0000000000..be2d967cb5 --- /dev/null +++ b/src/main/java/twilightforest/data/helpers/TFLangProvider.java @@ -0,0 +1,151 @@ +package twilightforest.data.helpers; + +import net.minecraft.data.PackOutput; +import net.minecraft.resources.ResourceKey; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.item.DyeColor; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.levelgen.structure.Structure; +import net.minecraftforge.common.data.LanguageProvider; +import net.minecraftforge.registries.RegistryObject; +import org.apache.commons.lang3.text.WordUtils; +import twilightforest.TwilightForestMod; + +import java.util.function.Supplier; + +public abstract class TFLangProvider extends LanguageProvider { + public TFLangProvider(PackOutput output) { + super(output, TwilightForestMod.ID, "en_us"); + } + + public void addBiome(ResourceKey biome, String name) { + this.add("biome.twilightforest." + biome.location().getPath(), name); + } + + public void addSapling(String woodPrefix, String saplingName) { + this.add("block.twilightforest." + woodPrefix + "_sapling", saplingName); + this.add("block.twilightforest.potted_" + woodPrefix + "_sapling", "Potted " + saplingName); + } + + public void createLogs(String woodPrefix, String woodName) { + this.add("block.twilightforest." + woodPrefix + "_log", woodName + " Log"); + this.add("block.twilightforest." + woodPrefix + "_wood", woodName + " Wood"); + this.add("block.twilightforest.stripped_" + woodPrefix + "_log", "Stripped " + woodName + " Log"); + this.add("block.twilightforest.stripped_" + woodPrefix + "_wood", "Stripped " + woodName + " Wood"); + this.createHollowLogs(woodPrefix, woodName, false); + } + + public void createHollowLogs(String woodPrefix, String woodName, boolean stem) { + this.add("block.twilightforest.hollow_" + woodPrefix + (stem ? "_stem" : "_log") + "_horizontal", "Hollow " + woodName + (stem ? " Stem" : " Log")); + this.add("block.twilightforest.hollow_" + woodPrefix + (stem ? "_stem" : "_log") + "_vertical", "Hollow " + woodName + (stem ? " Stem" : " Log")); + this.add("block.twilightforest.hollow_" + woodPrefix + (stem ? "_stem" : "_log") + "_climbable", "Hollow " + woodName + (stem ? " Stem" : " Log")); + } + + public void createWoodSet(String woodPrefix, String woodName) { + this.add("block.twilightforest." + woodPrefix + "_planks", woodName + " Planks"); + this.add("block.twilightforest." + woodPrefix + "_slab", woodName + " Slab"); + this.add("block.twilightforest." + woodPrefix + "_stairs", woodName + " Stairs"); + this.add("block.twilightforest." + woodPrefix + "_button", woodName + " Button"); + this.add("block.twilightforest." + woodPrefix + "_fence", woodName + " Fence"); + this.add("block.twilightforest." + woodPrefix + "_fence_gate", woodName + " Fence Gate"); + this.add("block.twilightforest." + woodPrefix + "_pressure_plate", woodName + " Pressure Plate"); + this.add("block.twilightforest." + woodPrefix + "_trapdoor", woodName + " Trapdoor"); + this.add("block.twilightforest." + woodPrefix + "_door", woodName + " Door"); + this.add("block.twilightforest." + woodPrefix + "_sign", woodName + " Sign"); + this.add("block.twilightforest." + woodPrefix + "_wall_sign", woodName + " Wall Sign"); + this.add("block.twilightforest." + woodPrefix + "_banister", woodName + " Banister"); + this.add("block.twilightforest." + woodPrefix + "_chest", woodName + " Chest"); + this.add("item.twilightforest." + woodPrefix + "_boat", woodName + " Boat"); + this.add("item.twilightforest." + woodPrefix + "_chest_boat", woodName + " Chest Boat"); + //this.add("block.twilightforest." + woodPrefix + "_hanging_sign", woodName + " Hanging Sign"); + } + + public void addBannerPattern(String patternPrefix, String patternName) { + this.add("item.twilightforest." + patternPrefix + "_banner_pattern", "Banner Pattern"); + this.add("item.twilightforest." + patternPrefix + "_banner_pattern.desc", patternName); + for (DyeColor color : DyeColor.values()) { + this.add("block.minecraft.banner.twilightforest." + patternPrefix + "." + color.getName(), WordUtils.capitalize(color.getName().replace('_', ' ')) + " " + patternName); + } + } + + public void addStoneVariants(String blockKey, String blockName) { + this.add("block.twilightforest." + blockKey, blockName); + this.add("block.twilightforest.cracked_" + blockKey, "Cracked " + blockName); + this.add("block.twilightforest.mossy_" + blockKey, "Mossy " + blockName); + } + + public void addArmor(String itemKey, String item) { + this.add("item.twilightforest." + itemKey + "_helmet", item + " Helmet"); + this.add("item.twilightforest." + itemKey + "_chestplate", item + " Chestplate"); + this.add("item.twilightforest." + itemKey + "_leggings", item + " Leggings"); + this.add("item.twilightforest." + itemKey + "_boots", item + " Boots"); + } + + public void addTools(String itemKey, String item) { + this.add("item.twilightforest." + itemKey + "_sword", item + " Sword"); + this.add("item.twilightforest." + itemKey + "_pickaxe", item + " Pickaxe"); + this.add("item.twilightforest." + itemKey + "_axe", item + " Axe"); + this.add("item.twilightforest." + itemKey + "_shovel", item + " Shovel"); + this.add("item.twilightforest." + itemKey + "_hoe", item + " Hoe"); + } + + public void addMusicDisc(Supplier disc, String description) { + this.addItem(disc, "Music Disc"); + this.add(disc.get().getDescriptionId() + ".desc", description); + } + + public void addStructure(ResourceKey biome, String name) { + this.add("structure.twilightforest." + biome.location().getPath(), name); + } + + public void addAdvancement(String key, String title, String desc) { + this.add("advancement.twilightforest." + key, title); + this.add("advancement.twilightforest." + key + ".desc", desc); + } + + public void addEnchantment(String key, String title, String desc) { + this.add("enchantment.twilightforest." + key, title); + this.add("enchantment.twilightforest." + key + ".desc", desc); + } + + public void addEntityAndEgg(RegistryObject> entity, String name) { + this.addEntityType(entity, name); + this.add("item.twilightforest." + entity.getId().getPath() + "_spawn_egg", name + " Spawn Egg"); + } + + public void addSubtitle(RegistryObject sound, String name) { + String[] splitSoundName = sound.getId().getPath().split("\\.", 3); + this.add("subtitles.twilightforest." + splitSoundName[0] + "." + splitSoundName[2], name); + } + + public void addDeathMessage(String key, String name) { + this.add("death.attack.twilightforest." + key, name); + } + + public void addStat(String key, String name) { + this.add("stat.twilightforest." + key, name); + } + + public void addMessage(String key, String name) { + this.add("misc.twilightforest." + key, name); + } + + public void addCommand(String key, String name) { + this.add("commands.tffeature." + key, name); + } + + public void addBookAndContents(String bookKey, String bookTitle, String... pages) { + this.add("twilightforest.book." + bookKey, bookTitle); + int pageCount = 0; + for (String page : pages) { + pageCount++; + this.add("twilightforest.book." + bookKey + "." + pageCount, page); + } + } + + public void addScreenMessage(String key, String name) { + this.add("gui.twilightforest." + key, name); + } +} diff --git a/src/main/java/twilightforest/data/helpers/TFSoundProvider.java b/src/main/java/twilightforest/data/helpers/TFSoundProvider.java new file mode 100644 index 0000000000..10b096200e --- /dev/null +++ b/src/main/java/twilightforest/data/helpers/TFSoundProvider.java @@ -0,0 +1,86 @@ +package twilightforest.data.helpers; + +import net.minecraft.data.PackOutput; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.SoundEvent; +import net.minecraftforge.common.data.ExistingFileHelper; +import net.minecraftforge.common.data.SoundDefinition; +import net.minecraftforge.common.data.SoundDefinitionsProvider; +import net.minecraftforge.registries.RegistryObject; +import twilightforest.TwilightForestMod; + +public abstract class TFSoundProvider extends SoundDefinitionsProvider { + + protected TFSoundProvider(PackOutput output, ExistingFileHelper helper) { + super(output, TwilightForestMod.ID, helper); + } + + public void generateNewSoundWithSubtitle(RegistryObject event, String baseSoundDirectory, int numberOfSounds) { + generateNewSound(event, baseSoundDirectory, numberOfSounds, true); + } + + public void generateNewSound(RegistryObject event, String baseSoundDirectory, int numberOfSounds, boolean subtitle) { + SoundDefinition definition = SoundDefinition.definition(); + if (subtitle) { + String[] splitSoundName = event.getId().getPath().split("\\.", 3); + definition.subtitle("subtitles.twilightforest." + splitSoundName[0] + "." + splitSoundName[2]); + } + for (int i = 1; i <= numberOfSounds; i++) { + definition.with(SoundDefinition.Sound.sound(new ResourceLocation(TwilightForestMod.ID, baseSoundDirectory + (numberOfSounds > 1 ? i : "")), SoundDefinition.SoundType.SOUND)); + } + this.add(event, definition); + } + + public void generateNewSoundMC(RegistryObject event, String baseSoundDirectory, int numberOfSounds, boolean subtitle) { + SoundDefinition definition = SoundDefinition.definition(); + if (subtitle) { + String[] splitSoundName = event.getId().getPath().split("\\.", 3); + definition.subtitle("subtitles.twilightforest." + splitSoundName[0] + "." + splitSoundName[2]); + } + for (int i = 1; i <= numberOfSounds; i++) { + definition.with(SoundDefinition.Sound.sound(new ResourceLocation(baseSoundDirectory + (numberOfSounds > 1 ? i : "")), SoundDefinition.SoundType.SOUND)); + } + this.add(event, definition); + } + + public void generateExistingSoundWithSubtitle(RegistryObject event, SoundEvent referencedSound) { + this.generateExistingSound(event, referencedSound, true); + } + + public void generateSoundWithCustomSubtitle(RegistryObject event, SoundEvent referencedSound, String subtitle) { + this.add(event, SoundDefinition.definition() + .subtitle(subtitle) + .with(SoundDefinition.Sound.sound(referencedSound.getLocation(), SoundDefinition.SoundType.EVENT))); + } + + public void generateExistingSound(RegistryObject event, SoundEvent referencedSound, boolean subtitle) { + SoundDefinition definition = SoundDefinition.definition(); + if (subtitle) { + String[] splitSoundName = event.getId().getPath().split("\\.", 3); + definition.subtitle("subtitles.twilightforest." + splitSoundName[0] + "." + splitSoundName[2]); + } + this.add(event, definition + .with(SoundDefinition.Sound.sound(referencedSound.getLocation(), SoundDefinition.SoundType.EVENT))); + } + + public void makeStepSound(RegistryObject event, SoundEvent referencedSound) { + this.add(event, SoundDefinition.definition() + .subtitle("subtitles.block.generic.footsteps") + .with(SoundDefinition.Sound.sound(referencedSound.getLocation(), SoundDefinition.SoundType.EVENT))); + } + + public void makeMusicDisc(RegistryObject event, String discName) { + this.add(event, SoundDefinition.definition() + .with(SoundDefinition.Sound.sound(new ResourceLocation(TwilightForestMod.ID, "music/" + discName), SoundDefinition.SoundType.SOUND) + .stream())); + } + + public void generateParrotSound(RegistryObject event, SoundEvent referencedSound) { + SoundDefinition definition = SoundDefinition.definition(); + String[] splitSoundName = event.getId().getPath().split("\\.", 3); + definition.subtitle("subtitles.twilightforest." + splitSoundName[0] + "." + splitSoundName[2]); + + this.add(event, definition + .with(SoundDefinition.Sound.sound(referencedSound.getLocation(), SoundDefinition.SoundType.EVENT).pitch(1.8F).volume(0.6F))); + } +} diff --git a/src/main/java/twilightforest/data/helpers/package-info.java b/src/main/java/twilightforest/data/helpers/package-info.java new file mode 100644 index 0000000000..1af87fb5d1 --- /dev/null +++ b/src/main/java/twilightforest/data/helpers/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.data.helpers; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/data/package-info.java b/src/main/java/twilightforest/data/package-info.java new file mode 100644 index 0000000000..6acf4644c8 --- /dev/null +++ b/src/main/java/twilightforest/data/package-info.java @@ -0,0 +1,6 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.data; + +import net.minecraft.MethodsReturnNonnullByDefault; +import javax.annotation.ParametersAreNonnullByDefault; diff --git a/src/main/java/twilightforest/data/tags/BiomeTagGenerator.java b/src/main/java/twilightforest/data/tags/BiomeTagGenerator.java new file mode 100644 index 0000000000..f5783509cd --- /dev/null +++ b/src/main/java/twilightforest/data/tags/BiomeTagGenerator.java @@ -0,0 +1,141 @@ +package twilightforest.data.tags; + +import net.minecraft.core.HolderLookup; +import net.minecraft.core.registries.Registries; +import net.minecraft.data.PackOutput; +import net.minecraft.data.tags.BiomeTagsProvider; +import net.minecraft.tags.BiomeTags; +import net.minecraft.tags.TagKey; +import net.minecraft.world.level.biome.Biome; +import net.minecraftforge.common.data.ExistingFileHelper; +import twilightforest.TwilightForestMod; +import twilightforest.init.TFBiomes; + +import java.util.concurrent.CompletableFuture; + +public class BiomeTagGenerator extends BiomeTagsProvider { + + public static final TagKey IS_TWILIGHT = TagKey.create(Registries.BIOME, TwilightForestMod.prefix("in_twilight_forest")); + + public static final TagKey VALID_QUEST_GROVE_BIOMES = TagKey.create(Registries.BIOME, TwilightForestMod.prefix("valid_quest_grove_biomes")); + + public static final TagKey VALID_HEDGE_MAZE_BIOMES = TagKey.create(Registries.BIOME, TwilightForestMod.prefix("valid_hedge_maze_biomes")); + public static final TagKey VALID_HOLLOW_HILL_BIOMES = TagKey.create(Registries.BIOME, TwilightForestMod.prefix("valid_hollow_hill_biomes")); + public static final TagKey VALID_MUSHROOM_TOWER_BIOMES = TagKey.create(Registries.BIOME, TwilightForestMod.prefix("valid_mushroom_tower_biomes")); + + public static final TagKey VALID_NAGA_COURTYARD_BIOMES = TagKey.create(Registries.BIOME, TwilightForestMod.prefix("valid_naga_courtyard_biomes")); + public static final TagKey VALID_LICH_TOWER_BIOMES = TagKey.create(Registries.BIOME, TwilightForestMod.prefix("valid_lich_tower_biomes")); + public static final TagKey VALID_LABYRINTH_BIOMES = TagKey.create(Registries.BIOME, TwilightForestMod.prefix("valid_labyrinth_biomes")); + public static final TagKey VALID_HYDRA_LAIR_BIOMES = TagKey.create(Registries.BIOME, TwilightForestMod.prefix("valid_hydra_lair_biomes")); + public static final TagKey VALID_KNIGHT_STRONGHOLD_BIOMES = TagKey.create(Registries.BIOME, TwilightForestMod.prefix("valid_knight_stronghold_biomes")); + public static final TagKey VALID_DARK_TOWER_BIOMES = TagKey.create(Registries.BIOME, TwilightForestMod.prefix("valid_dark_tower_biomes")); + public static final TagKey VALID_YETI_CAVE_BIOMES = TagKey.create(Registries.BIOME, TwilightForestMod.prefix("valid_yeti_cave_biomes")); + public static final TagKey VALID_AURORA_PALACE_BIOMES = TagKey.create(Registries.BIOME, TwilightForestMod.prefix("valid_aurora_palace_biomes")); + public static final TagKey VALID_TROLL_CAVE_BIOMES = TagKey.create(Registries.BIOME, TwilightForestMod.prefix("valid_troll_cave_biomes")); + public static final TagKey VALID_FINAL_CASTLE_BIOMES = TagKey.create(Registries.BIOME, TwilightForestMod.prefix("valid_final_castle_biomes")); + + public BiomeTagGenerator(PackOutput output, CompletableFuture provider, ExistingFileHelper helper) { + super(output, provider, TwilightForestMod.ID, helper); + } + + @Override + protected void addTags(HolderLookup.Provider provider) { + + tag(IS_TWILIGHT).add( + TFBiomes.CLEARING, TFBiomes.DENSE_FOREST, + TFBiomes.DENSE_MUSHROOM_FOREST, TFBiomes.FIREFLY_FOREST, + TFBiomes.FOREST, TFBiomes.MUSHROOM_FOREST, + TFBiomes.OAK_SAVANNAH, TFBiomes.SPOOKY_FOREST, + TFBiomes.ENCHANTED_FOREST, TFBiomes.DENSE_MUSHROOM_FOREST, + TFBiomes.LAKE, TFBiomes.STREAM, TFBiomes.UNDERGROUND, + TFBiomes.SWAMP, TFBiomes.FIRE_SWAMP, + TFBiomes.DARK_FOREST, TFBiomes.DARK_FOREST_CENTER, + TFBiomes.SNOWY_FOREST, TFBiomes.GLACIER, + TFBiomes.HIGHLANDS, TFBiomes.THORNLANDS, TFBiomes.FINAL_PLATEAU + ); + + tag(VALID_QUEST_GROVE_BIOMES).add(TFBiomes.ENCHANTED_FOREST); + tag(VALID_MUSHROOM_TOWER_BIOMES).add(TFBiomes.DENSE_MUSHROOM_FOREST); + + tag(VALID_HEDGE_MAZE_BIOMES).add( + TFBiomes.CLEARING, TFBiomes.DENSE_FOREST, + TFBiomes.DENSE_MUSHROOM_FOREST, TFBiomes.FIREFLY_FOREST, + TFBiomes.FOREST, TFBiomes.MUSHROOM_FOREST, + TFBiomes.OAK_SAVANNAH, TFBiomes.SPOOKY_FOREST + ); + tag(VALID_HOLLOW_HILL_BIOMES).add( + TFBiomes.CLEARING, TFBiomes.DENSE_FOREST, + TFBiomes.DENSE_MUSHROOM_FOREST, TFBiomes.FIREFLY_FOREST, + TFBiomes.FOREST, TFBiomes.MUSHROOM_FOREST, + TFBiomes.OAK_SAVANNAH, TFBiomes.SPOOKY_FOREST + ); + tag(VALID_NAGA_COURTYARD_BIOMES).add( + TFBiomes.CLEARING, TFBiomes.DENSE_FOREST, + TFBiomes.DENSE_MUSHROOM_FOREST, TFBiomes.FIREFLY_FOREST, + TFBiomes.FOREST, TFBiomes.MUSHROOM_FOREST, + TFBiomes.OAK_SAVANNAH, TFBiomes.SPOOKY_FOREST + ); + tag(VALID_LICH_TOWER_BIOMES).add( + TFBiomes.CLEARING, TFBiomes.DENSE_FOREST, + TFBiomes.DENSE_MUSHROOM_FOREST, TFBiomes.FIREFLY_FOREST, + TFBiomes.FOREST, TFBiomes.MUSHROOM_FOREST, + TFBiomes.OAK_SAVANNAH, TFBiomes.SPOOKY_FOREST + ); + tag(VALID_LABYRINTH_BIOMES).add(TFBiomes.SWAMP); + tag(VALID_HYDRA_LAIR_BIOMES).add(TFBiomes.FIRE_SWAMP); + tag(VALID_KNIGHT_STRONGHOLD_BIOMES).add(TFBiomes.DARK_FOREST); + tag(VALID_DARK_TOWER_BIOMES).add(TFBiomes.DARK_FOREST_CENTER); + tag(VALID_YETI_CAVE_BIOMES).add(TFBiomes.SNOWY_FOREST); + tag(VALID_AURORA_PALACE_BIOMES).add(TFBiomes.GLACIER); + tag(VALID_TROLL_CAVE_BIOMES).add(TFBiomes.HIGHLANDS); + tag(VALID_FINAL_CASTLE_BIOMES).add(TFBiomes.FINAL_PLATEAU); + + //apparently using forge and vanilla tags allows other mods to spawn stuff in our biomes. Will keep these commented out here just in case we need to reference them later. + //vanilla biome categories +// tag(BiomeTags.IS_FOREST).add( +// TFBiomes.FOREST, TFBiomes.DENSE_FOREST, TFBiomes.FIREFLY_FOREST, +// TFBiomes.OAK_SAVANNAH, TFBiomes.MUSHROOM_FOREST, TFBiomes.DENSE_MUSHROOM_FOREST, +// TFBiomes.DARK_FOREST, TFBiomes.DARK_FOREST_CENTER, +// TFBiomes.SNOWY_FOREST, TFBiomes.HIGHLANDS +// ); +// tag(BiomeTags.IS_MOUNTAIN).add(TFBiomes.HIGHLANDS); +// tag(BiomeTags.IS_HILL).add(TFBiomes.THORNLANDS); + + //forge biome categories +// tag(Tags.Biomes.IS_DENSE).add(TFBiomes.DENSE_FOREST, TFBiomes.DENSE_MUSHROOM_FOREST, TFBiomes.DARK_FOREST, TFBiomes.DARK_FOREST_CENTER, TFBiomes.SNOWY_FOREST, TFBiomes.THORNLANDS); +// tag(Tags.Biomes.IS_SPARSE).add(TFBiomes.CLEARING, TFBiomes.OAK_SAVANNAH, TFBiomes.GLACIER, TFBiomes.FINAL_PLATEAU); +// tag(Tags.Biomes.IS_PLAINS).add(TFBiomes.CLEARING); +// tag(Tags.Biomes.IS_MUSHROOM).add(TFBiomes.MUSHROOM_FOREST, TFBiomes.DENSE_MUSHROOM_FOREST); +// tag(Tags.Biomes.IS_RARE).add(TFBiomes.ENCHANTED_FOREST, TFBiomes.SPOOKY_FOREST, TFBiomes.CLEARING, TFBiomes.DENSE_MUSHROOM_FOREST, TFBiomes.LAKE); +// tag(Tags.Biomes.IS_WATER).add(TFBiomes.LAKE, TFBiomes.STREAM); +// tag(Tags.Biomes.IS_MAGICAL).add(TFBiomes.ENCHANTED_FOREST, TFBiomes.DARK_FOREST_CENTER); +// tag(Tags.Biomes.IS_SPOOKY).add(TFBiomes.SPOOKY_FOREST, TFBiomes.DARK_FOREST, TFBiomes.DARK_FOREST_CENTER); +// tag(Tags.Biomes.IS_DEAD).add(TFBiomes.SPOOKY_FOREST, TFBiomes.THORNLANDS, TFBiomes.FINAL_PLATEAU); +// tag(Tags.Biomes.IS_SWAMP).add(TFBiomes.SWAMP, TFBiomes.FIRE_SWAMP); +// tag(Tags.Biomes.IS_SNOWY).add(TFBiomes.SNOWY_FOREST); +// tag(Tags.Biomes.IS_CONIFEROUS).add(TFBiomes.SNOWY_FOREST, TFBiomes.HIGHLANDS); +// tag(Tags.Biomes.IS_COLD).add(TFBiomes.SNOWY_FOREST, TFBiomes.GLACIER); +// tag(Tags.Biomes.IS_WASTELAND).add(TFBiomes.GLACIER, TFBiomes.THORNLANDS, TFBiomes.FINAL_PLATEAU); +// tag(Tags.Biomes.IS_DRY).add(TFBiomes.THORNLANDS, TFBiomes.FINAL_PLATEAU); +// tag(Tags.Biomes.IS_PLATEAU).add(TFBiomes.FINAL_PLATEAU); +// tag(Tags.Biomes.IS_UNDERGROUND).add(TFBiomes.UNDERGROUND); + + //other vanilla tags + tag(BiomeTags.WITHOUT_WANDERING_TRADER_SPAWNS).addTag(IS_TWILIGHT); + tag(BiomeTags.WITHOUT_PATROL_SPAWNS).addTag(IS_TWILIGHT); + tag(BiomeTags.WITHOUT_ZOMBIE_SIEGES).addTag(IS_TWILIGHT); + + //even though we won't spawn vanilla frogs, we'll still add support for the variants + tag(BiomeTags.SPAWNS_COLD_VARIANT_FROGS).add(TFBiomes.SNOWY_FOREST, TFBiomes.GLACIER); + tag(BiomeTags.SPAWNS_SNOW_FOXES).add(TFBiomes.SNOWY_FOREST, TFBiomes.GLACIER); + tag(BiomeTags.SNOW_GOLEM_MELTS).add(TFBiomes.OAK_SAVANNAH, TFBiomes.FIRE_SWAMP); + tag(BiomeTags.SPAWNS_WARM_VARIANT_FROGS).add(TFBiomes.OAK_SAVANNAH, TFBiomes.FIRE_SWAMP); + + tag(BiomeTags.HAS_CLOSER_WATER_FOG).add(TFBiomes.SPOOKY_FOREST, TFBiomes.SWAMP, TFBiomes.FIRE_SWAMP); + } + + @Override + public String getName() { + return "Twilight Forest Biome Tags"; + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/data/tags/BlockTagGenerator.java b/src/main/java/twilightforest/data/tags/BlockTagGenerator.java new file mode 100644 index 0000000000..7b0ae94287 --- /dev/null +++ b/src/main/java/twilightforest/data/tags/BlockTagGenerator.java @@ -0,0 +1,767 @@ +package twilightforest.data.tags; + +import com.google.common.collect.ImmutableSet; +import net.minecraft.core.HolderLookup; +import net.minecraft.core.registries.Registries; +import net.minecraft.data.PackOutput; +import net.minecraft.data.tags.IntrinsicHolderTagsProvider; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.BlockTags; +import net.minecraft.tags.TagKey; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.material.Material; +import net.minecraftforge.common.Tags; +import net.minecraftforge.common.data.ExistingFileHelper; +import net.minecraftforge.registries.ForgeRegistries; +import twilightforest.TwilightForestMod; +import twilightforest.init.TFBlocks; + +import java.util.Set; +import java.util.concurrent.CompletableFuture; +import java.util.function.Predicate; + +public class BlockTagGenerator extends IntrinsicHolderTagsProvider { + public static final TagKey TOWERWOOD = BlockTags.create(TwilightForestMod.prefix("towerwood")); + public static final TagKey MAZESTONE = BlockTags.create(TwilightForestMod.prefix("mazestone")); + public static final TagKey CASTLE_BLOCKS = BlockTags.create(TwilightForestMod.prefix("castle_blocks")); + + public static final TagKey TWILIGHT_OAK_LOGS = BlockTags.create(TwilightForestMod.prefix("twilight_oak_logs")); + public static final TagKey CANOPY_LOGS = BlockTags.create(TwilightForestMod.prefix("canopy_logs")); + public static final TagKey MANGROVE_LOGS = BlockTags.create(TwilightForestMod.prefix("mangrove_logs")); + public static final TagKey DARKWOOD_LOGS = BlockTags.create(TwilightForestMod.prefix("darkwood_logs")); + public static final TagKey TIME_LOGS = BlockTags.create(TwilightForestMod.prefix("timewood_logs")); + public static final TagKey TRANSFORMATION_LOGS = BlockTags.create(TwilightForestMod.prefix("transwood_logs")); + public static final TagKey MINING_LOGS = BlockTags.create(TwilightForestMod.prefix("mining_logs")); + public static final TagKey SORTING_LOGS = BlockTags.create(TwilightForestMod.prefix("sortwood_logs")); + + public static final TagKey TF_LOGS = BlockTags.create(TwilightForestMod.prefix("logs")); + public static final TagKey BANISTERS = BlockTags.create(TwilightForestMod.prefix("banisters")); + public static final TagKey HOLLOW_LOGS_HORIZONTAL = BlockTags.create(TwilightForestMod.prefix("hollow_logs_horizontal")); + public static final TagKey HOLLOW_LOGS_VERTICAL = BlockTags.create(TwilightForestMod.prefix("hollow_logs_vertical")); + public static final TagKey HOLLOW_LOGS_CLIMBABLE = BlockTags.create(TwilightForestMod.prefix("hollow_logs_climbable")); + public static final TagKey HOLLOW_LOGS = BlockTags.create(TwilightForestMod.prefix("hollow_logs")); + + public static final TagKey STORAGE_BLOCKS_ARCTIC_FUR = BlockTags.create(TwilightForestMod.prefix("storage_blocks/arctic_fur")); + public static final TagKey STORAGE_BLOCKS_CARMINITE = BlockTags.create(TwilightForestMod.prefix("storage_blocks/carminite")); + public static final TagKey STORAGE_BLOCKS_FIERY = BlockTags.create(TwilightForestMod.prefix("storage_blocks/fiery")); + public static final TagKey STORAGE_BLOCKS_IRONWOOD = BlockTags.create(TwilightForestMod.prefix("storage_blocks/ironwood")); + public static final TagKey STORAGE_BLOCKS_KNIGHTMETAL = BlockTags.create(TwilightForestMod.prefix("storage_blocks/knightmetal")); + public static final TagKey STORAGE_BLOCKS_STEELEAF = BlockTags.create(TwilightForestMod.prefix("storage_blocks/steeleaf")); + + public static final TagKey PORTAL_EDGE = BlockTags.create(TwilightForestMod.prefix("portal/edge")); + public static final TagKey PORTAL_POOL = BlockTags.create(TwilightForestMod.prefix("portal/fluid")); + public static final TagKey PORTAL_DECO = BlockTags.create(TwilightForestMod.prefix("portal/decoration")); + public static final TagKey GENERATED_PORTAL_DECO = BlockTags.create(TwilightForestMod.prefix("portal/generated_decoration")); + + public static final TagKey DARK_TOWER_ALLOWED_POTS = BlockTags.create(TwilightForestMod.prefix("dark_tower_allowed_pots")); + public static final TagKey TROPHIES = BlockTags.create(TwilightForestMod.prefix("trophies")); + public static final TagKey FIRE_JET_FUEL = BlockTags.create(TwilightForestMod.prefix("fire_jet_fuel")); + public static final TagKey ICE_BOMB_REPLACEABLES = BlockTags.create(TwilightForestMod.prefix("ice_bomb_replaceables")); + public static final TagKey MAZEBREAKER_ACCELERATED = BlockTags.create(TwilightForestMod.prefix("mazebreaker_accelerated_mining")); + public static final TagKey PLANTS_HANG_ON = BlockTags.create(TwilightForestMod.prefix("plants_hang_on")); + + public static final TagKey COMMON_PROTECTIONS = BlockTags.create(TwilightForestMod.prefix("common_protections")); + public static final TagKey ANNIHILATION_INCLUSIONS = BlockTags.create(TwilightForestMod.prefix("annihilation_inclusions")); + public static final TagKey ANTIBUILDER_IGNORES = BlockTags.create(TwilightForestMod.prefix("antibuilder_ignores")); + public static final TagKey CARMINITE_REACTOR_IMMUNE = BlockTags.create(TwilightForestMod.prefix("carminite_reactor_immune")); + public static final TagKey CARMINITE_REACTOR_ORES = BlockTags.create(TwilightForestMod.prefix("carminite_reactor_ores")); + public static final TagKey STRUCTURE_BANNED_INTERACTIONS = BlockTags.create(TwilightForestMod.prefix("structure_banned_interactions")); + public static final TagKey PROGRESSION_ALLOW_BREAKING = BlockTags.create(TwilightForestMod.prefix("progression_allow_breaking")); + + public static final TagKey WORLDGEN_REPLACEABLES = BlockTags.create(TwilightForestMod.prefix("worldgen_replaceables")); + public static final TagKey ROOT_TRACE_SKIP = BlockTags.create(TwilightForestMod.prefix("tree_roots_skip")); + + public static final TagKey ORE_MAGNET_SAFE_REPLACE_BLOCK = BlockTags.create(TwilightForestMod.prefix("ore_magnet/ore_safe_replace_block")); + public static final TagKey ORE_MAGNET_IGNORE = BlockTags.create(TwilightForestMod.prefix("ore_magnet/ignored_ores")); + public static final TagKey ROOT_GROUND = BlockTags.create(new ResourceLocation("forge", "ore_bearing_ground/root")); + public static final TagKey ROOT_ORES = BlockTags.create(new ResourceLocation("forge", "ores_in_ground/root")); + + public static final TagKey TIME_CORE_EXCLUDED = BlockTags.create(TwilightForestMod.prefix("time_core_excluded")); + + public static final TagKey PENGUINS_SPAWNABLE_ON = BlockTags.create(TwilightForestMod.prefix("penguins_spawnable_on")); + public static final TagKey GIANTS_SPAWNABLE_ON = BlockTags.create(TwilightForestMod.prefix("giants_spawnable_on")); + + public static final TagKey RELOCATION_NOT_SUPPORTED = BlockTags.create(new ResourceLocation("forge", "relocation_not_supported")); + public static final TagKey IMMOVABLE = BlockTags.create(new ResourceLocation("forge", "immovable")); + + public static final TagKey DRUID_PROJECTILE_REPLACEABLE = BlockTags.create(TwilightForestMod.prefix("druid_projectile_replaceable")); + + public BlockTagGenerator(PackOutput output, CompletableFuture future, ExistingFileHelper helper) { + super(output, Registries.BLOCK, future, block -> block.builtInRegistryHolder().key(), TwilightForestMod.ID, helper); + } + + @SuppressWarnings("unchecked") + @Override + protected void addTags(HolderLookup.Provider provider) { + tag(TWILIGHT_OAK_LOGS) + .add(TFBlocks.TWILIGHT_OAK_LOG.get(), TFBlocks.STRIPPED_TWILIGHT_OAK_LOG.get(), TFBlocks.TWILIGHT_OAK_WOOD.get(), TFBlocks.STRIPPED_TWILIGHT_OAK_WOOD.get()); + tag(CANOPY_LOGS) + .add(TFBlocks.CANOPY_LOG.get(), TFBlocks.STRIPPED_CANOPY_LOG.get(), TFBlocks.CANOPY_WOOD.get(), TFBlocks.STRIPPED_CANOPY_WOOD.get()); + tag(MANGROVE_LOGS) + .add(TFBlocks.MANGROVE_LOG.get(), TFBlocks.STRIPPED_MANGROVE_LOG.get(), TFBlocks.MANGROVE_WOOD.get(), TFBlocks.STRIPPED_MANGROVE_WOOD.get()); + tag(DARKWOOD_LOGS) + .add(TFBlocks.DARK_LOG.get(), TFBlocks.STRIPPED_DARK_LOG.get(), TFBlocks.DARK_WOOD.get(), TFBlocks.STRIPPED_DARK_WOOD.get()); + tag(TIME_LOGS) + .add(TFBlocks.TIME_LOG.get(), TFBlocks.STRIPPED_TIME_LOG.get(), TFBlocks.TIME_WOOD.get(), TFBlocks.STRIPPED_TIME_WOOD.get()); + tag(TRANSFORMATION_LOGS) + .add(TFBlocks.TRANSFORMATION_LOG.get(), TFBlocks.STRIPPED_TRANSFORMATION_LOG.get(), TFBlocks.TRANSFORMATION_WOOD.get(), TFBlocks.STRIPPED_TRANSFORMATION_WOOD.get()); + tag(MINING_LOGS) + .add(TFBlocks.MINING_LOG.get(), TFBlocks.STRIPPED_MINING_LOG.get(), TFBlocks.MINING_WOOD.get(), TFBlocks.STRIPPED_MINING_WOOD.get()); + tag(SORTING_LOGS) + .add(TFBlocks.SORTING_LOG.get(), TFBlocks.STRIPPED_SORTING_LOG.get(), TFBlocks.SORTING_WOOD.get(), TFBlocks.STRIPPED_SORTING_WOOD.get()); + + tag(TF_LOGS) + .addTags(TWILIGHT_OAK_LOGS, CANOPY_LOGS, MANGROVE_LOGS, DARKWOOD_LOGS, TIME_LOGS, TRANSFORMATION_LOGS, MINING_LOGS, SORTING_LOGS); + tag(BlockTags.LOGS) + .addTag(TF_LOGS); + + tag(BlockTags.LOGS_THAT_BURN) + .addTags(TWILIGHT_OAK_LOGS, CANOPY_LOGS, MANGROVE_LOGS, TIME_LOGS, TRANSFORMATION_LOGS, MINING_LOGS, SORTING_LOGS); + + tag(BlockTags.SAPLINGS) + .add(TFBlocks.TWILIGHT_OAK_SAPLING.get(), TFBlocks.CANOPY_SAPLING.get(), TFBlocks.MANGROVE_SAPLING.get(), TFBlocks.DARKWOOD_SAPLING.get()) + .add(TFBlocks.TIME_SAPLING.get(), TFBlocks.TRANSFORMATION_SAPLING.get(), TFBlocks.MINING_SAPLING.get(), TFBlocks.SORTING_SAPLING.get()) + .add(TFBlocks.HOLLOW_OAK_SAPLING.get(), TFBlocks.RAINBOW_OAK_SAPLING.get()); + tag(BlockTags.LEAVES) + .add(TFBlocks.RAINBOW_OAK_LEAVES.get(), TFBlocks.TWILIGHT_OAK_LEAVES.get(), TFBlocks.CANOPY_LEAVES.get(), TFBlocks.MANGROVE_LEAVES.get(), TFBlocks.DARK_LEAVES.get()) + .add(TFBlocks.TIME_LEAVES.get(), TFBlocks.TRANSFORMATION_LEAVES.get(), TFBlocks.MINING_LEAVES.get(), TFBlocks.SORTING_LEAVES.get()) + .add(TFBlocks.THORN_LEAVES.get(), TFBlocks.BEANSTALK_LEAVES.get()); + + tag(BlockTags.PLANKS) + .add(TFBlocks.TWILIGHT_OAK_PLANKS.get(), TFBlocks.CANOPY_PLANKS.get(), TFBlocks.MANGROVE_PLANKS.get(), TFBlocks.DARK_PLANKS.get()) + .add(TFBlocks.TIME_PLANKS.get(), TFBlocks.TRANSFORMATION_PLANKS.get(), TFBlocks.MINING_PLANKS.get(), TFBlocks.SORTING_PLANKS.get()) + .add(TFBlocks.TOWERWOOD.get(), TFBlocks.ENCASED_TOWERWOOD.get(), TFBlocks.CRACKED_TOWERWOOD.get(), TFBlocks.MOSSY_TOWERWOOD.get(), TFBlocks.INFESTED_TOWERWOOD.get()); + + tag(BlockTags.WOODEN_FENCES) + .add(TFBlocks.TWILIGHT_OAK_FENCE.get(), TFBlocks.CANOPY_FENCE.get(), TFBlocks.MANGROVE_FENCE.get(), TFBlocks.DARK_FENCE.get()) + .add(TFBlocks.TIME_FENCE.get(), TFBlocks.TRANSFORMATION_FENCE.get(), TFBlocks.MINING_FENCE.get(), TFBlocks.SORTING_FENCE.get()); + tag(BlockTags.FENCE_GATES) + .add(TFBlocks.TWILIGHT_OAK_GATE.get(), TFBlocks.CANOPY_GATE.get(), TFBlocks.MANGROVE_GATE.get(), TFBlocks.DARK_GATE.get()) + .add(TFBlocks.TIME_GATE.get(), TFBlocks.TRANSFORMATION_GATE.get(), TFBlocks.MINING_GATE.get(), TFBlocks.SORTING_GATE.get()); + tag(Tags.Blocks.FENCES) + .add(TFBlocks.TWILIGHT_OAK_FENCE.get(), TFBlocks.CANOPY_FENCE.get(), TFBlocks.MANGROVE_FENCE.get(), TFBlocks.DARK_FENCE.get()) + .add(TFBlocks.TIME_FENCE.get(), TFBlocks.TRANSFORMATION_FENCE.get(), TFBlocks.MINING_FENCE.get(), TFBlocks.SORTING_FENCE.get()); + tag(Tags.Blocks.FENCE_GATES) + .add(TFBlocks.TWILIGHT_OAK_GATE.get(), TFBlocks.CANOPY_GATE.get(), TFBlocks.MANGROVE_GATE.get(), TFBlocks.DARK_GATE.get()) + .add(TFBlocks.TIME_GATE.get(), TFBlocks.TRANSFORMATION_GATE.get(), TFBlocks.MINING_GATE.get(), TFBlocks.SORTING_GATE.get()); + tag(Tags.Blocks.FENCES_WOODEN) + .add(TFBlocks.TWILIGHT_OAK_FENCE.get(), TFBlocks.CANOPY_FENCE.get(), TFBlocks.MANGROVE_FENCE.get(), TFBlocks.DARK_FENCE.get()) + .add(TFBlocks.TIME_FENCE.get(), TFBlocks.TRANSFORMATION_FENCE.get(), TFBlocks.MINING_FENCE.get(), TFBlocks.SORTING_FENCE.get()); + tag(Tags.Blocks.FENCE_GATES_WOODEN) + .add(TFBlocks.TWILIGHT_OAK_GATE.get(), TFBlocks.CANOPY_GATE.get(), TFBlocks.MANGROVE_GATE.get(), TFBlocks.DARK_GATE.get()) + .add(TFBlocks.TIME_GATE.get(), TFBlocks.TRANSFORMATION_GATE.get(), TFBlocks.MINING_GATE.get(), TFBlocks.SORTING_GATE.get()); + + tag(BlockTags.WOODEN_SLABS) + .add(TFBlocks.TWILIGHT_OAK_SLAB.get(), TFBlocks.CANOPY_SLAB.get(), TFBlocks.MANGROVE_SLAB.get(), TFBlocks.DARK_SLAB.get()) + .add(TFBlocks.TIME_SLAB.get(), TFBlocks.TRANSFORMATION_SLAB.get(), TFBlocks.MINING_SLAB.get(), TFBlocks.SORTING_SLAB.get()); + tag(BlockTags.SLABS) + .add(TFBlocks.AURORA_SLAB.get()); + tag(BlockTags.WOODEN_STAIRS) + .add(TFBlocks.TWILIGHT_OAK_STAIRS.get(), TFBlocks.CANOPY_STAIRS.get(), TFBlocks.MANGROVE_STAIRS.get(), TFBlocks.DARK_STAIRS.get()) + .add(TFBlocks.TIME_STAIRS.get(), TFBlocks.TRANSFORMATION_STAIRS.get(), TFBlocks.MINING_STAIRS.get(), TFBlocks.SORTING_STAIRS.get()); + tag(BlockTags.STAIRS) + .add(TFBlocks.CASTLE_BRICK_STAIRS.get(), TFBlocks.WORN_CASTLE_BRICK_STAIRS.get(), TFBlocks.CRACKED_CASTLE_BRICK_STAIRS.get(), TFBlocks.MOSSY_CASTLE_BRICK_STAIRS.get(), TFBlocks.ENCASED_CASTLE_BRICK_STAIRS.get(), TFBlocks.BOLD_CASTLE_BRICK_STAIRS.get()) + .add(TFBlocks.NAGASTONE_STAIRS_LEFT.get(), TFBlocks.NAGASTONE_STAIRS_RIGHT.get(), TFBlocks.MOSSY_NAGASTONE_STAIRS_LEFT.get(), TFBlocks.MOSSY_NAGASTONE_STAIRS_RIGHT.get(), TFBlocks.CRACKED_NAGASTONE_STAIRS_LEFT.get(), TFBlocks.CRACKED_NAGASTONE_STAIRS_RIGHT.get()); + + tag(BlockTags.WOODEN_BUTTONS) + .add(TFBlocks.TWILIGHT_OAK_BUTTON.get(), TFBlocks.CANOPY_BUTTON.get(), TFBlocks.MANGROVE_BUTTON.get(), TFBlocks.DARK_BUTTON.get()) + .add(TFBlocks.TIME_BUTTON.get(), TFBlocks.TRANSFORMATION_BUTTON.get(), TFBlocks.MINING_BUTTON.get(), TFBlocks.SORTING_BUTTON.get()); + tag(BlockTags.WOODEN_PRESSURE_PLATES) + .add(TFBlocks.TWILIGHT_OAK_PLATE.get(), TFBlocks.CANOPY_PLATE.get(), TFBlocks.MANGROVE_PLATE.get(), TFBlocks.DARK_PLATE.get()) + .add(TFBlocks.TIME_PLATE.get(), TFBlocks.TRANSFORMATION_PLATE.get(), TFBlocks.MINING_PLATE.get(), TFBlocks.SORTING_PLATE.get()); + + tag(BlockTags.WOODEN_TRAPDOORS) + .add(TFBlocks.TWILIGHT_OAK_TRAPDOOR.get(), TFBlocks.CANOPY_TRAPDOOR.get(), TFBlocks.MANGROVE_TRAPDOOR.get(), TFBlocks.DARK_TRAPDOOR.get()) + .add(TFBlocks.TIME_TRAPDOOR.get(), TFBlocks.TRANSFORMATION_TRAPDOOR.get(), TFBlocks.MINING_TRAPDOOR.get(), TFBlocks.SORTING_TRAPDOOR.get()); + tag(BlockTags.WOODEN_DOORS) + .add(TFBlocks.TWILIGHT_OAK_DOOR.get(), TFBlocks.CANOPY_DOOR.get(), TFBlocks.MANGROVE_DOOR.get(), TFBlocks.DARK_DOOR.get()) + .add(TFBlocks.TIME_DOOR.get(), TFBlocks.TRANSFORMATION_DOOR.get(), TFBlocks.MINING_DOOR.get(), TFBlocks.SORTING_DOOR.get()); + + tag(Tags.Blocks.CHESTS_WOODEN) + .add(TFBlocks.TWILIGHT_OAK_CHEST.get(), TFBlocks.CANOPY_CHEST.get(), TFBlocks.MANGROVE_CHEST.get(), TFBlocks.DARK_CHEST.get()) + .add(TFBlocks.TIME_CHEST.get(), TFBlocks.TRANSFORMATION_CHEST.get(), TFBlocks.MINING_CHEST.get(), TFBlocks.SORTING_CHEST.get()); + + tag(BlockTags.FLOWER_POTS) + .add(TFBlocks.POTTED_TWILIGHT_OAK_SAPLING.get(), TFBlocks.POTTED_CANOPY_SAPLING.get(), TFBlocks.POTTED_MANGROVE_SAPLING.get(), TFBlocks.POTTED_DARKWOOD_SAPLING.get(), TFBlocks.POTTED_RAINBOW_OAK_SAPLING.get()) + .add(TFBlocks.POTTED_HOLLOW_OAK_SAPLING.get(), TFBlocks.POTTED_TIME_SAPLING.get(), TFBlocks.POTTED_TRANSFORMATION_SAPLING.get(), TFBlocks.POTTED_MINING_SAPLING.get(), TFBlocks.POTTED_SORTING_SAPLING.get()) + .add(TFBlocks.POTTED_MAYAPPLE.get(), TFBlocks.POTTED_FIDDLEHEAD.get(), TFBlocks.POTTED_MUSHGLOOM.get(), TFBlocks.POTTED_THORN.get(), TFBlocks.POTTED_GREEN_THORN.get(), TFBlocks.POTTED_DEAD_THORN.get()); + + tag(BANISTERS).add( + TFBlocks.OAK_BANISTER.get(), + TFBlocks.SPRUCE_BANISTER.get(), + TFBlocks.BIRCH_BANISTER.get(), + TFBlocks.JUNGLE_BANISTER.get(), + TFBlocks.ACACIA_BANISTER.get(), + TFBlocks.DARK_OAK_BANISTER.get(), + TFBlocks.CRIMSON_BANISTER.get(), + TFBlocks.WARPED_BANISTER.get(), + TFBlocks.VANGROVE_BANISTER.get(), + + TFBlocks.TWILIGHT_OAK_BANISTER.get(), + TFBlocks.CANOPY_BANISTER.get(), + TFBlocks.MANGROVE_BANISTER.get(), + TFBlocks.DARK_BANISTER.get(), + TFBlocks.TIME_BANISTER.get(), + TFBlocks.TRANSFORMATION_BANISTER.get(), + TFBlocks.MINING_BANISTER.get(), + TFBlocks.SORTING_BANISTER.get() + ); + + tag(HOLLOW_LOGS_HORIZONTAL).add( + TFBlocks.HOLLOW_OAK_LOG_HORIZONTAL.get(), + TFBlocks.HOLLOW_SPRUCE_LOG_HORIZONTAL.get(), + TFBlocks.HOLLOW_BIRCH_LOG_HORIZONTAL.get(), + TFBlocks.HOLLOW_JUNGLE_LOG_HORIZONTAL.get(), + TFBlocks.HOLLOW_ACACIA_LOG_HORIZONTAL.get(), + TFBlocks.HOLLOW_DARK_OAK_LOG_HORIZONTAL.get(), + TFBlocks.HOLLOW_CRIMSON_STEM_HORIZONTAL.get(), + TFBlocks.HOLLOW_WARPED_STEM_HORIZONTAL.get(), + TFBlocks.HOLLOW_VANGROVE_LOG_HORIZONTAL.get(), + TFBlocks.HOLLOW_TWILIGHT_OAK_LOG_HORIZONTAL.get(), + TFBlocks.HOLLOW_CANOPY_LOG_HORIZONTAL.get(), + TFBlocks.HOLLOW_MANGROVE_LOG_HORIZONTAL.get(), + TFBlocks.HOLLOW_DARK_LOG_HORIZONTAL.get(), + TFBlocks.HOLLOW_TIME_LOG_HORIZONTAL.get(), + TFBlocks.HOLLOW_TRANSFORMATION_LOG_HORIZONTAL.get(), + TFBlocks.HOLLOW_MINING_LOG_HORIZONTAL.get(), + TFBlocks.HOLLOW_SORTING_LOG_HORIZONTAL.get() + ); + + tag(HOLLOW_LOGS_VERTICAL).add( + TFBlocks.HOLLOW_OAK_LOG_VERTICAL.get(), + TFBlocks.HOLLOW_SPRUCE_LOG_VERTICAL.get(), + TFBlocks.HOLLOW_BIRCH_LOG_VERTICAL.get(), + TFBlocks.HOLLOW_JUNGLE_LOG_VERTICAL.get(), + TFBlocks.HOLLOW_ACACIA_LOG_VERTICAL.get(), + TFBlocks.HOLLOW_DARK_OAK_LOG_VERTICAL.get(), + TFBlocks.HOLLOW_CRIMSON_STEM_VERTICAL.get(), + TFBlocks.HOLLOW_WARPED_STEM_VERTICAL.get(), + TFBlocks.HOLLOW_VANGROVE_LOG_VERTICAL.get(), + TFBlocks.HOLLOW_TWILIGHT_OAK_LOG_VERTICAL.get(), + TFBlocks.HOLLOW_CANOPY_LOG_VERTICAL.get(), + TFBlocks.HOLLOW_MANGROVE_LOG_VERTICAL.get(), + TFBlocks.HOLLOW_DARK_LOG_VERTICAL.get(), + TFBlocks.HOLLOW_TIME_LOG_VERTICAL.get(), + TFBlocks.HOLLOW_TRANSFORMATION_LOG_VERTICAL.get(), + TFBlocks.HOLLOW_MINING_LOG_VERTICAL.get(), + TFBlocks.HOLLOW_SORTING_LOG_VERTICAL.get() + ); + + tag(HOLLOW_LOGS_CLIMBABLE).add( + TFBlocks.HOLLOW_OAK_LOG_CLIMBABLE.get(), + TFBlocks.HOLLOW_SPRUCE_LOG_CLIMBABLE.get(), + TFBlocks.HOLLOW_BIRCH_LOG_CLIMBABLE.get(), + TFBlocks.HOLLOW_JUNGLE_LOG_CLIMBABLE.get(), + TFBlocks.HOLLOW_ACACIA_LOG_CLIMBABLE.get(), + TFBlocks.HOLLOW_DARK_OAK_LOG_CLIMBABLE.get(), + TFBlocks.HOLLOW_CRIMSON_STEM_CLIMBABLE.get(), + TFBlocks.HOLLOW_WARPED_STEM_CLIMBABLE.get(), + TFBlocks.HOLLOW_VANGROVE_LOG_CLIMBABLE.get(), + TFBlocks.HOLLOW_TWILIGHT_OAK_LOG_CLIMBABLE.get(), + TFBlocks.HOLLOW_CANOPY_LOG_CLIMBABLE.get(), + TFBlocks.HOLLOW_MANGROVE_LOG_CLIMBABLE.get(), + TFBlocks.HOLLOW_DARK_LOG_CLIMBABLE.get(), + TFBlocks.HOLLOW_TIME_LOG_CLIMBABLE.get(), + TFBlocks.HOLLOW_TRANSFORMATION_LOG_CLIMBABLE.get(), + TFBlocks.HOLLOW_MINING_LOG_CLIMBABLE.get(), + TFBlocks.HOLLOW_SORTING_LOG_CLIMBABLE.get() + ); + + tag(HOLLOW_LOGS).addTags(HOLLOW_LOGS_HORIZONTAL, HOLLOW_LOGS_VERTICAL, HOLLOW_LOGS_CLIMBABLE); + + tag(BlockTags.STRIDER_WARM_BLOCKS).add(TFBlocks.FIERY_BLOCK.get()); + tag(BlockTags.PORTALS).add(TFBlocks.TWILIGHT_PORTAL.get()); + + tag(BlockTags.CLIMBABLE).add(TFBlocks.IRON_LADDER.get(), TFBlocks.ROOT_STRAND.get()).addTag(HOLLOW_LOGS_CLIMBABLE); + + tag(BlockTags.STANDING_SIGNS).add(TFBlocks.TWILIGHT_OAK_SIGN.get(), TFBlocks.CANOPY_SIGN.get(), + TFBlocks.MANGROVE_SIGN.get(), TFBlocks.DARK_SIGN.get(), + TFBlocks.TIME_SIGN.get(), TFBlocks.TRANSFORMATION_SIGN.get(), + TFBlocks.MINING_SIGN.get(), TFBlocks.SORTING_SIGN.get()); + + tag(BlockTags.WALL_SIGNS).add(TFBlocks.TWILIGHT_WALL_SIGN.get(), TFBlocks.CANOPY_WALL_SIGN.get(), + TFBlocks.MANGROVE_WALL_SIGN.get(), TFBlocks.DARK_WALL_SIGN.get(), + TFBlocks.TIME_WALL_SIGN.get(), TFBlocks.TRANSFORMATION_WALL_SIGN.get(), + TFBlocks.MINING_WALL_SIGN.get(), TFBlocks.SORTING_WALL_SIGN.get()); + + tag(TOWERWOOD).add(TFBlocks.TOWERWOOD.get(), TFBlocks.MOSSY_TOWERWOOD.get(), TFBlocks.CRACKED_TOWERWOOD.get(), TFBlocks.INFESTED_TOWERWOOD.get()); + + tag(MAZESTONE).add( + TFBlocks.MAZESTONE.get(), TFBlocks.MAZESTONE_BRICK.get(), + TFBlocks.CRACKED_MAZESTONE.get(), TFBlocks.MOSSY_MAZESTONE.get(), + TFBlocks.CUT_MAZESTONE.get(), TFBlocks.DECORATIVE_MAZESTONE.get(), + TFBlocks.MAZESTONE_MOSAIC.get(), TFBlocks.MAZESTONE_BORDER.get()); + + tag(CASTLE_BLOCKS).add( + TFBlocks.CASTLE_BRICK.get(), TFBlocks.WORN_CASTLE_BRICK.get(), + TFBlocks.CRACKED_CASTLE_BRICK.get(), TFBlocks.MOSSY_CASTLE_BRICK.get(), + TFBlocks.CASTLE_ROOF_TILE.get(), TFBlocks.THICK_CASTLE_BRICK.get(), + TFBlocks.BOLD_CASTLE_BRICK_TILE.get(), TFBlocks.BOLD_CASTLE_BRICK_PILLAR.get(), + TFBlocks.ENCASED_CASTLE_BRICK_TILE.get(), TFBlocks.ENCASED_CASTLE_BRICK_PILLAR.get(), + TFBlocks.CASTLE_BRICK_STAIRS.get(), TFBlocks.WORN_CASTLE_BRICK_STAIRS.get(), + TFBlocks.CRACKED_CASTLE_BRICK_STAIRS.get(), TFBlocks.MOSSY_CASTLE_BRICK_STAIRS.get(), + TFBlocks.ENCASED_CASTLE_BRICK_STAIRS.get(), TFBlocks.BOLD_CASTLE_BRICK_STAIRS.get(), + TFBlocks.PINK_CASTLE_RUNE_BRICK.get(), TFBlocks.YELLOW_CASTLE_RUNE_BRICK.get(), + TFBlocks.BLUE_CASTLE_RUNE_BRICK.get(), TFBlocks.VIOLET_CASTLE_RUNE_BRICK.get(), + TFBlocks.PINK_CASTLE_DOOR.get(), TFBlocks.YELLOW_CASTLE_DOOR.get(), + TFBlocks.BLUE_CASTLE_DOOR.get(), TFBlocks.VIOLET_CASTLE_DOOR.get() + ); + + tag(MAZEBREAKER_ACCELERATED).addTag(MAZESTONE).addTag(CASTLE_BLOCKS); + + tag(STORAGE_BLOCKS_ARCTIC_FUR).add(TFBlocks.ARCTIC_FUR_BLOCK.get()); + tag(STORAGE_BLOCKS_CARMINITE).add(TFBlocks.CARMINITE_BLOCK.get()); + tag(STORAGE_BLOCKS_FIERY).add(TFBlocks.FIERY_BLOCK.get()); + tag(STORAGE_BLOCKS_IRONWOOD).add(TFBlocks.IRONWOOD_BLOCK.get()); + tag(STORAGE_BLOCKS_KNIGHTMETAL).add(TFBlocks.KNIGHTMETAL_BLOCK.get()); + tag(STORAGE_BLOCKS_STEELEAF).add(TFBlocks.STEELEAF_BLOCK.get()); + + tag(BlockTags.BEACON_BASE_BLOCKS).addTags( + STORAGE_BLOCKS_ARCTIC_FUR, + STORAGE_BLOCKS_CARMINITE, + STORAGE_BLOCKS_FIERY, + STORAGE_BLOCKS_IRONWOOD, + STORAGE_BLOCKS_KNIGHTMETAL, + STORAGE_BLOCKS_STEELEAF + ); + + tag(Tags.Blocks.STORAGE_BLOCKS).addTags(STORAGE_BLOCKS_ARCTIC_FUR, STORAGE_BLOCKS_CARMINITE, STORAGE_BLOCKS_FIERY, STORAGE_BLOCKS_IRONWOOD, STORAGE_BLOCKS_KNIGHTMETAL, STORAGE_BLOCKS_STEELEAF); + + tag(BlockTags.DIRT).add(TFBlocks.UBEROUS_SOIL.get()); + tag(PORTAL_EDGE).add(Blocks.FARMLAND, Blocks.DIRT_PATH).addTags(BlockTags.DIRT); + // So yes, we could do fluid tags for the portal pool but the problem is that we're -replacing- the block, effectively replacing what would be waterlogged, with the portal block + // In the future if we can "portal log" blocks then we can re-explore doing it as a fluid + tag(PORTAL_POOL).add(Blocks.WATER); + tag(PORTAL_DECO) + .add(Blocks.BAMBOO) + .add(getAllMinecraftOrTwilightBlocks(b -> (b.material == Material.PLANT || b.material == Material.REPLACEABLE_PLANT || b.material == Material.LEAVES) && !plants.contains(b))) + .addTags(BlockTags.FLOWERS, BlockTags.LEAVES, BlockTags.SAPLINGS, BlockTags.CROPS); + + tag(GENERATED_PORTAL_DECO) + .add(Blocks.BROWN_MUSHROOM, Blocks.RED_MUSHROOM, + Blocks.GRASS, Blocks.FERN, + Blocks.BLUE_ORCHID, Blocks.AZURE_BLUET, + Blocks.LILY_OF_THE_VALLEY, Blocks.OXEYE_DAISY, + Blocks.ALLIUM, Blocks.CORNFLOWER, + Blocks.WHITE_TULIP, Blocks.PINK_TULIP, + Blocks.ORANGE_TULIP, Blocks.RED_TULIP, + TFBlocks.MUSHGLOOM.get(), + TFBlocks.MAYAPPLE.get(), + TFBlocks.FIDDLEHEAD.get()); + + tag(DARK_TOWER_ALLOWED_POTS) + .add(TFBlocks.POTTED_TWILIGHT_OAK_SAPLING.get(), TFBlocks.POTTED_CANOPY_SAPLING.get(), TFBlocks.POTTED_MANGROVE_SAPLING.get(), + TFBlocks.POTTED_DARKWOOD_SAPLING.get(), TFBlocks.POTTED_RAINBOW_OAK_SAPLING.get(), TFBlocks.POTTED_MAYAPPLE.get(), + TFBlocks.POTTED_FIDDLEHEAD.get(), TFBlocks.POTTED_MUSHGLOOM.get()) + .add(Blocks.FLOWER_POT, Blocks.POTTED_POPPY, Blocks.POTTED_BLUE_ORCHID, Blocks.POTTED_ALLIUM, Blocks.POTTED_AZURE_BLUET, + Blocks.POTTED_RED_TULIP, Blocks.POTTED_ORANGE_TULIP, Blocks.POTTED_WHITE_TULIP, Blocks.POTTED_PINK_TULIP, + Blocks.POTTED_OXEYE_DAISY, Blocks.POTTED_DANDELION, Blocks.POTTED_OAK_SAPLING, Blocks.POTTED_SPRUCE_SAPLING, + Blocks.POTTED_BIRCH_SAPLING, Blocks.POTTED_JUNGLE_SAPLING, Blocks.POTTED_ACACIA_SAPLING, Blocks.POTTED_DARK_OAK_SAPLING, + Blocks.POTTED_RED_MUSHROOM, Blocks.POTTED_BROWN_MUSHROOM, Blocks.POTTED_DEAD_BUSH, Blocks.POTTED_FERN, + Blocks.POTTED_CACTUS, Blocks.POTTED_CORNFLOWER, Blocks.POTTED_LILY_OF_THE_VALLEY, Blocks.POTTED_WITHER_ROSE, + Blocks.POTTED_BAMBOO, Blocks.POTTED_CRIMSON_FUNGUS, Blocks.POTTED_WARPED_FUNGUS, Blocks.POTTED_CRIMSON_ROOTS, + Blocks.POTTED_WARPED_ROOTS, Blocks.POTTED_AZALEA, Blocks.POTTED_FLOWERING_AZALEA, Blocks.POTTED_MANGROVE_PROPAGULE); + + tag(BlockTags.FROG_PREFER_JUMP_TO).add(TFBlocks.HUGE_LILY_PAD.get()); + + tag(TROPHIES) + .add(TFBlocks.NAGA_TROPHY.get(), TFBlocks.NAGA_WALL_TROPHY.get()) + .add(TFBlocks.LICH_TROPHY.get(), TFBlocks.LICH_WALL_TROPHY.get()) + .add(TFBlocks.MINOSHROOM_TROPHY.get(), TFBlocks.MINOSHROOM_WALL_TROPHY.get()) + .add(TFBlocks.HYDRA_TROPHY.get(), TFBlocks.HYDRA_WALL_TROPHY.get()) + .add(TFBlocks.KNIGHT_PHANTOM_TROPHY.get(), TFBlocks.KNIGHT_PHANTOM_WALL_TROPHY.get()) + .add(TFBlocks.UR_GHAST_TROPHY.get(), TFBlocks.UR_GHAST_WALL_TROPHY.get()) + .add(TFBlocks.ALPHA_YETI_TROPHY.get(), TFBlocks.ALPHA_YETI_WALL_TROPHY.get()) + .add(TFBlocks.SNOW_QUEEN_TROPHY.get(), TFBlocks.SNOW_QUEEN_WALL_TROPHY.get()) + .add(TFBlocks.QUEST_RAM_TROPHY.get(), TFBlocks.QUEST_RAM_WALL_TROPHY.get()); + + tag(FIRE_JET_FUEL).add(Blocks.LAVA); + + tag(ICE_BOMB_REPLACEABLES) + .add(TFBlocks.MAYAPPLE.get(), TFBlocks.FIDDLEHEAD.get(), Blocks.GRASS, Blocks.TALL_GRASS, Blocks.FERN, Blocks.LARGE_FERN) + .addTag(BlockTags.FLOWERS); + + tag(PLANTS_HANG_ON) + .addTag(BlockTags.DIRT) + .add(Blocks.MOSS_BLOCK, TFBlocks.MANGROVE_ROOT.get(), TFBlocks.ROOT_BLOCK.get(), TFBlocks.LIVEROOT_BLOCK.get()); + + tag(COMMON_PROTECTIONS).add( // For any blocks that absolutely should not be meddled with + TFBlocks.NAGA_BOSS_SPAWNER.get(), + TFBlocks.LICH_BOSS_SPAWNER.get(), + TFBlocks.MINOSHROOM_BOSS_SPAWNER.get(), + TFBlocks.HYDRA_BOSS_SPAWNER.get(), + TFBlocks.KNIGHT_PHANTOM_BOSS_SPAWNER.get(), + TFBlocks.UR_GHAST_BOSS_SPAWNER.get(), + TFBlocks.ALPHA_YETI_BOSS_SPAWNER.get(), + TFBlocks.SNOW_QUEEN_BOSS_SPAWNER.get(), + TFBlocks.FINAL_BOSS_BOSS_SPAWNER.get(), + TFBlocks.STRONGHOLD_SHIELD.get(), + TFBlocks.VANISHING_BLOCK.get(), + TFBlocks.LOCKED_VANISHING_BLOCK.get(), + TFBlocks.PINK_FORCE_FIELD.get(), + TFBlocks.ORANGE_FORCE_FIELD.get(), + TFBlocks.GREEN_FORCE_FIELD.get(), + TFBlocks.BLUE_FORCE_FIELD.get(), + TFBlocks.VIOLET_FORCE_FIELD.get(), + TFBlocks.KEEPSAKE_CASKET.get(), + TFBlocks.TROPHY_PEDESTAL.get() + ).add( // [VanillaCopy] WITHER_IMMUNE - Do NOT include that tag in this tag + Blocks.BARRIER, + Blocks.BEDROCK, + Blocks.END_PORTAL, + Blocks.END_PORTAL_FRAME, + Blocks.END_GATEWAY, + Blocks.COMMAND_BLOCK, + Blocks.REPEATING_COMMAND_BLOCK, + Blocks.CHAIN_COMMAND_BLOCK, + Blocks.STRUCTURE_BLOCK, + Blocks.JIGSAW, + Blocks.MOVING_PISTON, + Blocks.LIGHT, + Blocks.REINFORCED_DEEPSLATE + ); + + tag(BlockTags.DRAGON_IMMUNE).addTag(COMMON_PROTECTIONS).add(TFBlocks.GIANT_OBSIDIAN.get(), TFBlocks.FAKE_DIAMOND.get(), TFBlocks.FAKE_GOLD.get()); + + tag(BlockTags.WITHER_IMMUNE).addTag(COMMON_PROTECTIONS).add(TFBlocks.FAKE_DIAMOND.get(), TFBlocks.FAKE_GOLD.get()); + + tag(CARMINITE_REACTOR_IMMUNE).addTag(COMMON_PROTECTIONS); + + tag(CARMINITE_REACTOR_ORES).add(Blocks.NETHER_QUARTZ_ORE, Blocks.NETHER_GOLD_ORE); + + tag(ANNIHILATION_INCLUSIONS) // This is NOT a blacklist! This is a whitelist + .add(Blocks.NETHER_PORTAL) + .add(TFBlocks.DEADROCK.get(), TFBlocks.CRACKED_DEADROCK.get(), TFBlocks.WEATHERED_DEADROCK.get()) + .add(TFBlocks.CASTLE_BRICK.get(), TFBlocks.CRACKED_DEADROCK.get(), TFBlocks.THICK_CASTLE_BRICK.get(), TFBlocks.MOSSY_CASTLE_BRICK.get(), TFBlocks.CASTLE_ROOF_TILE.get(), TFBlocks.WORN_CASTLE_BRICK.get()) + .add(TFBlocks.BLUE_CASTLE_RUNE_BRICK.get(), TFBlocks.VIOLET_CASTLE_RUNE_BRICK.get(), TFBlocks.YELLOW_CASTLE_RUNE_BRICK.get(), TFBlocks.PINK_CASTLE_RUNE_BRICK.get()) + .add(TFBlocks.PINK_FORCE_FIELD.get(), TFBlocks.ORANGE_FORCE_FIELD.get(), TFBlocks.GREEN_FORCE_FIELD.get(), TFBlocks.BLUE_FORCE_FIELD.get(), TFBlocks.VIOLET_FORCE_FIELD.get()) + .add(TFBlocks.BROWN_THORNS.get(), TFBlocks.GREEN_THORNS.get()); + + tag(ANTIBUILDER_IGNORES).add( + Blocks.REDSTONE_LAMP, + Blocks.TNT, + Blocks.WATER, + TFBlocks.ANTIBUILDER.get(), + TFBlocks.CARMINITE_BUILDER.get(), + TFBlocks.BUILT_BLOCK.get(), + TFBlocks.REACTOR_DEBRIS.get(), + TFBlocks.CARMINITE_REACTOR.get(), + TFBlocks.REAPPEARING_BLOCK.get(), + TFBlocks.GHAST_TRAP.get(), + TFBlocks.FAKE_DIAMOND.get(), + TFBlocks.FAKE_GOLD.get() + ).addTag(COMMON_PROTECTIONS).addOptional(new ResourceLocation("gravestone:gravestone")); + + tag(STRUCTURE_BANNED_INTERACTIONS).add(Blocks.LEVER).add(TFBlocks.ANTIBUILDER.get()).addTags(BlockTags.BUTTONS, Tags.Blocks.CHESTS); + + // TODO add more grave mods to this list + tag(PROGRESSION_ALLOW_BREAKING) + .add(TFBlocks.KEEPSAKE_CASKET.get()) + .addOptional(new ResourceLocation("gravestone", "gravestone")); + + tag(ORE_MAGNET_SAFE_REPLACE_BLOCK).addTags( + BlockTags.DIRT, + Tags.Blocks.GRAVEL, + Tags.Blocks.SAND, + BlockTags.NYLIUM, + BlockTags.BASE_STONE_OVERWORLD, + BlockTags.BASE_STONE_NETHER, + Tags.Blocks.END_STONES, + BlockTags.DEEPSLATE_ORE_REPLACEABLES, + BlockTags.STONE_ORE_REPLACEABLES, + ROOT_GROUND + ); + + tag(ORE_MAGNET_IGNORE).addTag(BlockTags.COAL_ORES); + + tag(ROOT_GROUND).add(TFBlocks.ROOT_BLOCK.get()); + tag(ROOT_ORES).add(TFBlocks.LIVEROOT_BLOCK.get()); + + tag(BlockTags.DAMPENS_VIBRATIONS).add(TFBlocks.ARCTIC_FUR_BLOCK.get(), TFBlocks.FLUFFY_CLOUD.get(), TFBlocks.WISPY_CLOUD.get()); + tag(BlockTags.OCCLUDES_VIBRATION_SIGNALS).add(TFBlocks.ARCTIC_FUR_BLOCK.get()); + + tag(BlockTags.SMALL_DRIPLEAF_PLACEABLE).add(TFBlocks.UBEROUS_SOIL.get()); + + tag(BlockTags.FEATURES_CANNOT_REPLACE).addTag(COMMON_PROTECTIONS).add(TFBlocks.LIVEROOT_BLOCK.get(), TFBlocks.MANGROVE_ROOT.get()); + // For anything that permits replacement during Worldgen + tag(WORLDGEN_REPLACEABLES).addTags(BlockTags.LUSH_GROUND_REPLACEABLE, BlockTags.REPLACEABLE_PLANTS); + + tag(ROOT_TRACE_SKIP).add(TFBlocks.ROOT_BLOCK.get(), TFBlocks.LIVEROOT_BLOCK.get(), TFBlocks.MANGROVE_ROOT.get(), TFBlocks.TIME_WOOD.get()).addTags(BlockTags.FEATURES_CANNOT_REPLACE); + + tag(DRUID_PROJECTILE_REPLACEABLE).addTags(BlockTags.LEAVES, BlockTags.LOGS, BlockTags.PLANKS, BlockTags.OVERWORLD_CARVER_REPLACEABLES, BlockTags.NETHER_CARVER_REPLACEABLES, BlockTags.REPLACEABLE_PLANTS, BlockTags.LUSH_GROUND_REPLACEABLE, BlockTags.SCULK_REPLACEABLE, Tags.Blocks.ORES); + + tag(BlockTags.OVERWORLD_CARVER_REPLACEABLES).add(TFBlocks.TROLLSTEINN.get()); + + tag(BlockTags.REPLACEABLE_PLANTS).add( + TFBlocks.MAYAPPLE.get(), + TFBlocks.FIDDLEHEAD.get(), + TFBlocks.MUSHGLOOM.get(), + TFBlocks.TORCHBERRY_PLANT.get(), + TFBlocks.ROOT_STRAND.get(), + TFBlocks.MOSS_PATCH.get(), + TFBlocks.CLOVER_PATCH.get(), + TFBlocks.FALLEN_LEAVES.get()); + + tag(TIME_CORE_EXCLUDED).add(Blocks.NETHER_PORTAL); + + tag(PENGUINS_SPAWNABLE_ON).add(Blocks.ICE, Blocks.PACKED_ICE, Blocks.BLUE_ICE); + tag(GIANTS_SPAWNABLE_ON).add(TFBlocks.WISPY_CLOUD.get(), TFBlocks.FLUFFY_CLOUD.get()); + + tag(BlockTags.MINEABLE_WITH_AXE).add( + TFBlocks.HEDGE.get(), + TFBlocks.ROOT_BLOCK.get(), + TFBlocks.LIVEROOT_BLOCK.get(), + TFBlocks.MANGROVE_ROOT.get(), + TFBlocks.UNCRAFTING_TABLE.get(), + TFBlocks.ENCASED_SMOKER.get(), + TFBlocks.ENCASED_FIRE_JET.get(), + TFBlocks.TIME_LOG_CORE.get(), + TFBlocks.TRANSFORMATION_LOG_CORE.get(), + TFBlocks.MINING_LOG_CORE.get(), + TFBlocks.SORTING_LOG_CORE.get(), + TFBlocks.REAPPEARING_BLOCK.get(), + TFBlocks.ANTIBUILDER.get(), + TFBlocks.CARMINITE_REACTOR.get(), + TFBlocks.CARMINITE_BUILDER.get(), + TFBlocks.GHAST_TRAP.get(), + TFBlocks.HUGE_STALK.get(), + TFBlocks.HUGE_MUSHGLOOM.get(), + TFBlocks.HUGE_MUSHGLOOM_STEM.get(), + TFBlocks.CINDER_LOG.get(), + TFBlocks.CINDER_WOOD.get(), + TFBlocks.IRONWOOD_BLOCK.get(), + TFBlocks.DEATH_TOME_SPAWNER.get(), + TFBlocks.EMPTY_CANOPY_BOOKSHELF.get(), + TFBlocks.CANOPY_BOOKSHELF.get(), + TFBlocks.TWILIGHT_OAK_CHEST.get(), + TFBlocks.CANOPY_CHEST.get(), + TFBlocks.MANGROVE_CHEST.get(), + TFBlocks.DARK_CHEST.get(), + TFBlocks.TIME_CHEST.get(), + TFBlocks.TRANSFORMATION_CHEST.get(), + TFBlocks.MINING_CHEST.get(), + TFBlocks.SORTING_CHEST.get() + ).addTags(BANISTERS, HOLLOW_LOGS, TOWERWOOD); + + tag(BlockTags.MINEABLE_WITH_HOE).add( + //vanilla doesnt use the leaves tag + TFBlocks.TWILIGHT_OAK_LEAVES.get(), + TFBlocks.CANOPY_LEAVES.get(), + TFBlocks.MANGROVE_LEAVES.get(), + TFBlocks.DARK_LEAVES.get(), + TFBlocks.RAINBOW_OAK_LEAVES.get(), + TFBlocks.TIME_LEAVES.get(), + TFBlocks.TRANSFORMATION_LEAVES.get(), + TFBlocks.MINING_LEAVES.get(), + TFBlocks.SORTING_LEAVES.get(), + TFBlocks.THORN_LEAVES.get(), + TFBlocks.THORN_ROSE.get(), + TFBlocks.BEANSTALK_LEAVES.get(), + TFBlocks.STEELEAF_BLOCK.get(), + TFBlocks.ARCTIC_FUR_BLOCK.get() + ); + + tag(BlockTags.MINEABLE_WITH_PICKAXE).add( + TFBlocks.NAGASTONE.get(), + TFBlocks.NAGASTONE_HEAD.get(), + TFBlocks.STRONGHOLD_SHIELD.get(), + TFBlocks.TROPHY_PEDESTAL.get(), + TFBlocks.AURORA_PILLAR.get(), + TFBlocks.AURORA_SLAB.get(), + TFBlocks.UNDERBRICK.get(), + TFBlocks.MOSSY_UNDERBRICK.get(), + TFBlocks.CRACKED_UNDERBRICK.get(), + TFBlocks.UNDERBRICK_FLOOR.get(), + TFBlocks.DEADROCK.get(), + TFBlocks.CRACKED_DEADROCK.get(), + TFBlocks.WEATHERED_DEADROCK.get(), + TFBlocks.TROLLSTEINN.get(), + TFBlocks.GIANT_LEAVES.get(), + TFBlocks.GIANT_OBSIDIAN.get(), + TFBlocks.GIANT_COBBLESTONE.get(), + TFBlocks.GIANT_LOG.get(), + TFBlocks.CINDER_FURNACE.get(), + TFBlocks.TWILIGHT_PORTAL_MINIATURE_STRUCTURE.get(), + //TFBlocks.HEDGE_MAZE_MINIATURE_STRUCTURE.get(), + //TFBlocks.HOLLOW_HILL_MINIATURE_STRUCTURE.get(), + //TFBlocks.QUEST_GROVE_MINIATURE_STRUCTURE.get(), + //TFBlocks.MUSHROOM_TOWER_MINIATURE_STRUCTURE.get(), + TFBlocks.NAGA_COURTYARD_MINIATURE_STRUCTURE.get(), + TFBlocks.LICH_TOWER_MINIATURE_STRUCTURE.get(), + //TFBlocks.MINOTAUR_LABYRINTH_MINIATURE_STRUCTURE.get(), + //TFBlocks.HYDRA_LAIR_MINIATURE_STRUCTURE.get(), + //TFBlocks.GOBLIN_STRONGHOLD_MINIATURE_STRUCTURE.get(), + //TFBlocks.DARK_TOWER_MINIATURE_STRUCTURE.get(), + //TFBlocks.YETI_CAVE_MINIATURE_STRUCTURE.get(), + //TFBlocks.AURORA_PALACE_MINIATURE_STRUCTURE.get(), + //TFBlocks.TROLL_CAVE_COTTAGE_MINIATURE_STRUCTURE.get(), + //TFBlocks.FINAL_CASTLE_MINIATURE_STRUCTURE.get(), + TFBlocks.KNIGHTMETAL_BLOCK.get(), + TFBlocks.IRONWOOD_BLOCK.get(), + TFBlocks.FIERY_BLOCK.get(), + TFBlocks.SPIRAL_BRICKS.get(), + TFBlocks.ETCHED_NAGASTONE.get(), + TFBlocks.NAGASTONE_PILLAR.get(), + TFBlocks.NAGASTONE_STAIRS_LEFT.get(), + TFBlocks.NAGASTONE_STAIRS_RIGHT.get(), + TFBlocks.MOSSY_ETCHED_NAGASTONE.get(), + TFBlocks.MOSSY_NAGASTONE_PILLAR.get(), + TFBlocks.MOSSY_NAGASTONE_STAIRS_LEFT.get(), + TFBlocks.MOSSY_NAGASTONE_STAIRS_RIGHT.get(), + TFBlocks.CRACKED_ETCHED_NAGASTONE.get(), + TFBlocks.CRACKED_NAGASTONE_PILLAR.get(), + TFBlocks.CRACKED_NAGASTONE_STAIRS_LEFT.get(), + TFBlocks.CRACKED_NAGASTONE_STAIRS_RIGHT.get(), + TFBlocks.IRON_LADDER.get(), + TFBlocks.TWISTED_STONE.get(), + TFBlocks.TWISTED_STONE_PILLAR.get(), + TFBlocks.KEEPSAKE_CASKET.get(), + TFBlocks.BOLD_STONE_PILLAR.get() + ).addTags(MAZESTONE, CASTLE_BLOCKS); + + tag(BlockTags.MINEABLE_WITH_SHOVEL).add( + TFBlocks.SMOKER.get(), + TFBlocks.FIRE_JET.get(), + TFBlocks.UBEROUS_SOIL.get() + ); + + tag(Tags.Blocks.NEEDS_WOOD_TOOL).add( + TFBlocks.NAGASTONE.get(), + TFBlocks.NAGASTONE_HEAD.get(), + TFBlocks.ETCHED_NAGASTONE.get(), + TFBlocks.CRACKED_ETCHED_NAGASTONE.get(), + TFBlocks.MOSSY_ETCHED_NAGASTONE.get(), + TFBlocks.NAGASTONE_PILLAR.get(), + TFBlocks.CRACKED_NAGASTONE_PILLAR.get(), + TFBlocks.MOSSY_NAGASTONE_PILLAR.get(), + TFBlocks.NAGASTONE_STAIRS_LEFT.get(), + TFBlocks.CRACKED_NAGASTONE_STAIRS_LEFT.get(), + TFBlocks.MOSSY_NAGASTONE_STAIRS_LEFT.get(), + TFBlocks.NAGASTONE_STAIRS_RIGHT.get(), + TFBlocks.CRACKED_NAGASTONE_STAIRS_RIGHT.get(), + TFBlocks.MOSSY_NAGASTONE_STAIRS_RIGHT.get(), + TFBlocks.SPIRAL_BRICKS.get(), + TFBlocks.TWISTED_STONE.get(), + TFBlocks.TWISTED_STONE_PILLAR.get(), + TFBlocks.BOLD_STONE_PILLAR.get(), + TFBlocks.AURORA_PILLAR.get(), + TFBlocks.AURORA_SLAB.get(), + TFBlocks.TROLLSTEINN.get() + ); + + tag(BlockTags.NEEDS_STONE_TOOL).add( + TFBlocks.UNDERBRICK.get(), + TFBlocks.CRACKED_UNDERBRICK.get(), + TFBlocks.MOSSY_UNDERBRICK.get(), + TFBlocks.UNDERBRICK_FLOOR.get(), + TFBlocks.IRON_LADDER.get() + ); + + tag(BlockTags.NEEDS_IRON_TOOL).add( + TFBlocks.FIERY_BLOCK.get(), + TFBlocks.KNIGHTMETAL_BLOCK.get() + ); + + tag(BlockTags.NEEDS_DIAMOND_TOOL).add( + TFBlocks.AURORA_BLOCK.get(), + TFBlocks.DEADROCK.get(), + TFBlocks.CRACKED_DEADROCK.get(), + TFBlocks.WEATHERED_DEADROCK.get() + ).addTags(CASTLE_BLOCKS, MAZESTONE); + + tag(BlockTags.MUSHROOM_GROW_BLOCK).add(TFBlocks.UBEROUS_SOIL.get()); + + tag(BlockTags.MOSS_REPLACEABLE).add( + TFBlocks.ROOT_BLOCK.get(), + TFBlocks.LIVEROOT_BLOCK.get(), + TFBlocks.TROLLSTEINN.get() + ); + + tag(BlockTags.INVALID_SPAWN_INSIDE).add(TFBlocks.TWILIGHT_PORTAL.get()); + + tag(RELOCATION_NOT_SUPPORTED).add(TFBlocks.TWILIGHT_PORTAL.get(), TFBlocks.STRONGHOLD_SHIELD.get(), + TFBlocks.TIME_LOG_CORE.get(), TFBlocks.TRANSFORMATION_LOG_CORE.get(), + TFBlocks.MINING_LOG_CORE.get(), TFBlocks.SORTING_LOG_CORE.get(), + TFBlocks.ANTIBUILDER.get(), TFBlocks.BUILT_BLOCK.get(), + TFBlocks.FAKE_DIAMOND.get(), TFBlocks.FAKE_GOLD.get(), + TFBlocks.REACTOR_DEBRIS.get(), TFBlocks.LOCKED_VANISHING_BLOCK.get(), + TFBlocks.VANISHING_BLOCK.get(), TFBlocks.REAPPEARING_BLOCK.get(), + TFBlocks.BEANSTALK_GROWER.get(), TFBlocks.GIANT_COBBLESTONE.get(), + TFBlocks.GIANT_LOG.get(), TFBlocks.GIANT_LEAVES.get(), + TFBlocks.GIANT_OBSIDIAN.get(), TFBlocks.BROWN_THORNS.get(), + TFBlocks.GREEN_THORNS.get(), TFBlocks.BURNT_THORNS.get(), + TFBlocks.PINK_FORCE_FIELD.get(), TFBlocks.ORANGE_FORCE_FIELD.get(), + TFBlocks.GREEN_FORCE_FIELD.get(), TFBlocks.BLUE_FORCE_FIELD.get(), + TFBlocks.VIOLET_FORCE_FIELD.get(), TFBlocks.FINAL_BOSS_BOSS_SPAWNER.get(), + TFBlocks.NAGA_BOSS_SPAWNER.get(), TFBlocks.LICH_BOSS_SPAWNER.get(), + TFBlocks.MINOSHROOM_BOSS_SPAWNER.get(), TFBlocks.HYDRA_BOSS_SPAWNER.get(), + TFBlocks.KNIGHT_PHANTOM_BOSS_SPAWNER.get(), TFBlocks.UR_GHAST_BOSS_SPAWNER.get(), + TFBlocks.ALPHA_YETI_BOSS_SPAWNER.get(), TFBlocks.SNOW_QUEEN_BOSS_SPAWNER.get()); + + tag(IMMOVABLE).add(TFBlocks.TWILIGHT_PORTAL.get(), TFBlocks.STRONGHOLD_SHIELD.get(), + TFBlocks.TIME_LOG_CORE.get(), TFBlocks.TRANSFORMATION_LOG_CORE.get(), + TFBlocks.MINING_LOG_CORE.get(), TFBlocks.SORTING_LOG_CORE.get(), + TFBlocks.ANTIBUILDER.get(), TFBlocks.BUILT_BLOCK.get(), + TFBlocks.FAKE_DIAMOND.get(), TFBlocks.FAKE_GOLD.get(), + TFBlocks.REACTOR_DEBRIS.get(), TFBlocks.LOCKED_VANISHING_BLOCK.get(), + TFBlocks.VANISHING_BLOCK.get(), TFBlocks.REAPPEARING_BLOCK.get(), + TFBlocks.BEANSTALK_GROWER.get(), TFBlocks.GIANT_COBBLESTONE.get(), + TFBlocks.GIANT_LOG.get(), TFBlocks.GIANT_LEAVES.get(), + TFBlocks.GIANT_OBSIDIAN.get(), TFBlocks.BROWN_THORNS.get(), + TFBlocks.GREEN_THORNS.get(), TFBlocks.BURNT_THORNS.get(), + TFBlocks.PINK_FORCE_FIELD.get(), TFBlocks.ORANGE_FORCE_FIELD.get(), + TFBlocks.GREEN_FORCE_FIELD.get(), TFBlocks.BLUE_FORCE_FIELD.get(), + TFBlocks.VIOLET_FORCE_FIELD.get(), TFBlocks.FINAL_BOSS_BOSS_SPAWNER.get(), + TFBlocks.NAGA_BOSS_SPAWNER.get(), TFBlocks.LICH_BOSS_SPAWNER.get(), + TFBlocks.MINOSHROOM_BOSS_SPAWNER.get(), TFBlocks.HYDRA_BOSS_SPAWNER.get(), + TFBlocks.KNIGHT_PHANTOM_BOSS_SPAWNER.get(), TFBlocks.UR_GHAST_BOSS_SPAWNER.get(), + TFBlocks.ALPHA_YETI_BOSS_SPAWNER.get(), TFBlocks.SNOW_QUEEN_BOSS_SPAWNER.get()); + } + + private static Block[] getAllMinecraftOrTwilightBlocks(Predicate predicate) { + return ForgeRegistries.BLOCKS.getValues().stream() + .filter(b -> ForgeRegistries.BLOCKS.getKey(b) != null && (ForgeRegistries.BLOCKS.getKey(b).getNamespace().equals(TwilightForestMod.ID) || ForgeRegistries.BLOCKS.getKey(b).getNamespace().equals("minecraft")) && predicate.test(b)) + .toArray(Block[]::new); + } + + private static final Set plants; + + static { + plants = ImmutableSet.builder().add( + Blocks.DANDELION, Blocks.POPPY, Blocks.BLUE_ORCHID, Blocks.ALLIUM, Blocks.AZURE_BLUET, Blocks.RED_TULIP, Blocks.ORANGE_TULIP, Blocks.WHITE_TULIP, Blocks.PINK_TULIP, Blocks.OXEYE_DAISY, Blocks.CORNFLOWER, Blocks.LILY_OF_THE_VALLEY, Blocks.WITHER_ROSE, // BlockTags.SMALL_FLOWERS + Blocks.SUNFLOWER, Blocks.LILAC, Blocks.PEONY, Blocks.ROSE_BUSH, // BlockTags.TALL_FLOWERS + Blocks.FLOWERING_AZALEA_LEAVES, Blocks.FLOWERING_AZALEA, // BlockTags.FLOWERS + Blocks.JUNGLE_LEAVES, Blocks.OAK_LEAVES, Blocks.SPRUCE_LEAVES, Blocks.DARK_OAK_LEAVES, Blocks.ACACIA_LEAVES, Blocks.BIRCH_LEAVES, Blocks.AZALEA_LEAVES, Blocks.FLOWERING_AZALEA_LEAVES, // BlockTags.LEAVES + Blocks.OAK_SAPLING, Blocks.SPRUCE_SAPLING, Blocks.BIRCH_SAPLING, Blocks.JUNGLE_SAPLING, Blocks.ACACIA_SAPLING, Blocks.DARK_OAK_SAPLING, Blocks.AZALEA, Blocks.FLOWERING_AZALEA, // BlockTags.SAPLINGS + Blocks.BEETROOTS, Blocks.CARROTS, Blocks.POTATOES, Blocks.WHEAT, Blocks.MELON_STEM, Blocks.PUMPKIN_STEM // BlockTags.CROPS + ).add( // TF addons of above taglists + TFBlocks.TWILIGHT_OAK_SAPLING.get(), + TFBlocks.CANOPY_SAPLING.get(), + TFBlocks.MANGROVE_SAPLING.get(), + TFBlocks.DARKWOOD_SAPLING.get(), + TFBlocks.TIME_SAPLING.get(), + TFBlocks.TRANSFORMATION_SAPLING.get(), + TFBlocks.MINING_SAPLING.get(), + TFBlocks.SORTING_SAPLING.get(), + TFBlocks.HOLLOW_OAK_SAPLING.get(), + TFBlocks.RAINBOW_OAK_SAPLING.get(), + TFBlocks.RAINBOW_OAK_LEAVES.get(), + TFBlocks.TWILIGHT_OAK_LEAVES.get(), + TFBlocks.CANOPY_LEAVES.get(), + TFBlocks.MANGROVE_LEAVES.get(), + TFBlocks.DARK_LEAVES.get(), + TFBlocks.TIME_LEAVES.get(), + TFBlocks.TRANSFORMATION_LEAVES.get(), + TFBlocks.MINING_LEAVES.get(), + TFBlocks.SORTING_LEAVES.get(), + TFBlocks.THORN_LEAVES.get(), + TFBlocks.BEANSTALK_LEAVES.get() + ).build(); + } + + @Override + public String getName() { + return "Twilight Forest Block Tags"; + } +} diff --git a/src/main/java/twilightforest/data/tags/CustomTagGenerator.java b/src/main/java/twilightforest/data/tags/CustomTagGenerator.java new file mode 100644 index 0000000000..41fdc3278e --- /dev/null +++ b/src/main/java/twilightforest/data/tags/CustomTagGenerator.java @@ -0,0 +1,158 @@ +package twilightforest.data.tags; + +import net.minecraft.core.HolderLookup; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.core.registries.Registries; +import net.minecraft.data.PackOutput; +import net.minecraft.data.tags.TagsProvider; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.TagKey; +import net.minecraft.world.item.enchantment.Enchantment; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.level.block.entity.BannerPattern; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraftforge.common.data.ExistingFileHelper; +import net.minecraftforge.registries.ForgeRegistries; +import org.jetbrains.annotations.Nullable; +import twilightforest.TwilightForestMod; +import twilightforest.init.TFBannerPatterns; +import twilightforest.init.TFBlockEntities; +import twilightforest.init.custom.WoodPalettes; +import twilightforest.util.WoodPalette; + +import java.util.concurrent.CompletableFuture; + +//a place to hold all custom tags, since I imagine we wont have a lot of them +public class CustomTagGenerator { + + public static class EnchantmentTagGenerator extends TagsProvider { + + public static final TagKey PHANTOM_ARMOR_BANNED_ENCHANTS = TagKey.create(Registries.ENCHANTMENT, TwilightForestMod.prefix("phantom_armor_banned_enchants")); + + public EnchantmentTagGenerator(PackOutput output, CompletableFuture provider, @Nullable ExistingFileHelper helper) { + super(output, Registries.ENCHANTMENT, provider, TwilightForestMod.ID, helper); + } + + @Override + protected void addTags(HolderLookup.Provider provider) { + tag(PHANTOM_ARMOR_BANNED_ENCHANTS).add(ForgeRegistries.ENCHANTMENTS.getResourceKey(Enchantments.VANISHING_CURSE).get(), ForgeRegistries.ENCHANTMENTS.getResourceKey(Enchantments.BINDING_CURSE).get()); + } + + @Override + public String getName() { + return "Twilight Forest Enchantment Tags"; + } + } + + public static class BlockEntityTagGenerator extends TagsProvider> { + + public static final TagKey> RELOCATION_NOT_SUPPORTED = TagKey.create(Registries.BLOCK_ENTITY_TYPE, new ResourceLocation("forge", "relocation_not_supported")); + public static final TagKey> IMMOVABLE = TagKey.create(Registries.BLOCK_ENTITY_TYPE, new ResourceLocation("forge", "immovable")); + + public BlockEntityTagGenerator(PackOutput output, CompletableFuture provider, @Nullable ExistingFileHelper helper) { + super(output, Registries.BLOCK_ENTITY_TYPE, provider, TwilightForestMod.ID, helper); + } + + @Override + protected void addTags(HolderLookup.Provider provider) { + this.tag(RELOCATION_NOT_SUPPORTED).add( + ForgeRegistries.BLOCK_ENTITY_TYPES.getResourceKey(TFBlockEntities.ANTIBUILDER.get()).get(), + ForgeRegistries.BLOCK_ENTITY_TYPES.getResourceKey(TFBlockEntities.BEANSTALK_GROWER.get()).get(), + ForgeRegistries.BLOCK_ENTITY_TYPES.getResourceKey(TFBlockEntities.NAGA_SPAWNER.get()).get(), + ForgeRegistries.BLOCK_ENTITY_TYPES.getResourceKey(TFBlockEntities.LICH_SPAWNER.get()).get(), + ForgeRegistries.BLOCK_ENTITY_TYPES.getResourceKey(TFBlockEntities.MINOSHROOM_SPAWNER.get()).get(), + ForgeRegistries.BLOCK_ENTITY_TYPES.getResourceKey(TFBlockEntities.HYDRA_SPAWNER.get()).get(), + ForgeRegistries.BLOCK_ENTITY_TYPES.getResourceKey(TFBlockEntities.KNIGHT_PHANTOM_SPAWNER.get()).get(), + ForgeRegistries.BLOCK_ENTITY_TYPES.getResourceKey(TFBlockEntities.UR_GHAST_SPAWNER.get()).get(), + ForgeRegistries.BLOCK_ENTITY_TYPES.getResourceKey(TFBlockEntities.ALPHA_YETI_SPAWNER.get()).get(), + ForgeRegistries.BLOCK_ENTITY_TYPES.getResourceKey(TFBlockEntities.SNOW_QUEEN_SPAWNER.get()).get(), + ForgeRegistries.BLOCK_ENTITY_TYPES.getResourceKey(TFBlockEntities.FINAL_BOSS_SPAWNER.get()).get()); + + this.tag(IMMOVABLE).add( + ForgeRegistries.BLOCK_ENTITY_TYPES.getResourceKey(TFBlockEntities.ANTIBUILDER.get()).get(), + ForgeRegistries.BLOCK_ENTITY_TYPES.getResourceKey(TFBlockEntities.BEANSTALK_GROWER.get()).get(), + ForgeRegistries.BLOCK_ENTITY_TYPES.getResourceKey(TFBlockEntities.NAGA_SPAWNER.get()).get(), + ForgeRegistries.BLOCK_ENTITY_TYPES.getResourceKey(TFBlockEntities.LICH_SPAWNER.get()).get(), + ForgeRegistries.BLOCK_ENTITY_TYPES.getResourceKey(TFBlockEntities.MINOSHROOM_SPAWNER.get()).get(), + ForgeRegistries.BLOCK_ENTITY_TYPES.getResourceKey(TFBlockEntities.HYDRA_SPAWNER.get()).get(), + ForgeRegistries.BLOCK_ENTITY_TYPES.getResourceKey(TFBlockEntities.KNIGHT_PHANTOM_SPAWNER.get()).get(), + ForgeRegistries.BLOCK_ENTITY_TYPES.getResourceKey(TFBlockEntities.UR_GHAST_SPAWNER.get()).get(), + ForgeRegistries.BLOCK_ENTITY_TYPES.getResourceKey(TFBlockEntities.ALPHA_YETI_SPAWNER.get()).get(), + ForgeRegistries.BLOCK_ENTITY_TYPES.getResourceKey(TFBlockEntities.SNOW_QUEEN_SPAWNER.get()).get(), + ForgeRegistries.BLOCK_ENTITY_TYPES.getResourceKey(TFBlockEntities.FINAL_BOSS_SPAWNER.get()).get()); + } + + @Override + public String getName() { + return "Twilight Forest Block Entity Tags"; + } + } + + public static class BannerPatternTagGenerator extends TagsProvider { + + public static final TagKey NAGA_BANNER_PATTERN = create("pattern_item/naga"); + public static final TagKey LICH_BANNER_PATTERN = create("pattern_item/lich"); + public static final TagKey MINOSHROOM_BANNER_PATTERN = create("pattern_item/minoshroom"); + public static final TagKey HYDRA_BANNER_PATTERN = create("pattern_item/hydra"); + public static final TagKey KNIGHT_PHANTOM_BANNER_PATTERN = create("pattern_item/knight_phantom"); + public static final TagKey UR_GHAST_BANNER_PATTERN = create("pattern_item/ur_ghast"); + public static final TagKey ALPHA_YETI_BANNER_PATTERN = create("pattern_item/alpha_yeti"); + public static final TagKey SNOW_QUEEN_BANNER_PATTERN = create("pattern_item/snow_queen"); + public static final TagKey QUEST_RAM_BANNER_PATTERN = create("pattern_item/quest_ram"); + + public BannerPatternTagGenerator(PackOutput output, CompletableFuture provider, @Nullable ExistingFileHelper existingFileHelper) { + super(output, Registries.BANNER_PATTERN, provider, TwilightForestMod.ID, existingFileHelper); + } + + @Override + protected void addTags(HolderLookup.Provider provider) { + tag(NAGA_BANNER_PATTERN).add(TFBannerPatterns.NAGA.getKey()); + tag(LICH_BANNER_PATTERN).add(TFBannerPatterns.LICH.getKey()); + tag(MINOSHROOM_BANNER_PATTERN).add(TFBannerPatterns.MINOSHROOM.getKey()); + tag(HYDRA_BANNER_PATTERN).add(TFBannerPatterns.HYDRA.getKey()); + tag(KNIGHT_PHANTOM_BANNER_PATTERN).add(TFBannerPatterns.KNIGHT_PHANTOM.getKey()); + tag(UR_GHAST_BANNER_PATTERN).add(TFBannerPatterns.UR_GHAST.getKey()); + tag(ALPHA_YETI_BANNER_PATTERN).add(TFBannerPatterns.ALPHA_YETI.getKey()); + tag(SNOW_QUEEN_BANNER_PATTERN).add(TFBannerPatterns.SNOW_QUEEN.getKey()); + tag(QUEST_RAM_BANNER_PATTERN).add(TFBannerPatterns.QUEST_RAM.getKey()); + } + + private static TagKey create(String name) { + return TagKey.create(Registries.BANNER_PATTERN, TwilightForestMod.prefix(name)); + } + + @Override + public String getName() { + return "Twilight Forest Banner Pattern Tags"; + } + } + + public static class WoodPaletteTagGenerator extends TagsProvider { + public static final TagKey WELL_SWIZZLE_MASK = WoodPalettes.WOOD_PALETTES.createTagKey(TwilightForestMod.prefix("well_swizzle_mask")); + public static final TagKey DRUID_HUT_SWIZZLE_MASK = WoodPalettes.WOOD_PALETTES.createTagKey(TwilightForestMod.prefix("druid_hut_swizzle_mask")); + public static final TagKey COMMON_PALETTES = WoodPalettes.WOOD_PALETTES.createTagKey(TwilightForestMod.prefix("common")); + public static final TagKey UNCOMMON_PALETTES = WoodPalettes.WOOD_PALETTES.createTagKey(TwilightForestMod.prefix("uncommon")); + public static final TagKey RARE_PALETTES = WoodPalettes.WOOD_PALETTES.createTagKey(TwilightForestMod.prefix("rare")); + public static final TagKey TREASURE_PALETTES = WoodPalettes.WOOD_PALETTES.createTagKey(TwilightForestMod.prefix("treasure")); + + public WoodPaletteTagGenerator(PackOutput output, CompletableFuture provider, @Nullable ExistingFileHelper helper) { + super(output, WoodPalettes.WOOD_PALETTE_TYPE_KEY, provider, TwilightForestMod.ID, helper); + } + + @Override + protected void addTags(HolderLookup.Provider provider) { + tag(WELL_SWIZZLE_MASK).add(WoodPalettes.OAK); + tag(DRUID_HUT_SWIZZLE_MASK).add(WoodPalettes.OAK, WoodPalettes.SPRUCE, WoodPalettes.BIRCH); + + tag(COMMON_PALETTES).add(WoodPalettes.SPRUCE, WoodPalettes.CANOPY); + tag(UNCOMMON_PALETTES).add(WoodPalettes.OAK, WoodPalettes.DARKWOOD, WoodPalettes.TWILIGHT_OAK); + tag(RARE_PALETTES).add(WoodPalettes.BIRCH, WoodPalettes.JUNGLE, WoodPalettes.MANGROVE); + tag(TREASURE_PALETTES).add(WoodPalettes.TIMEWOOD, WoodPalettes.TRANSWOOD, WoodPalettes.MINEWOOD, WoodPalettes.SORTWOOD); + } + + @Override + public String getName() { + return "Twilight Forest Wood Palette Tags"; + } + } +} diff --git a/src/main/java/twilightforest/data/tags/DamageTypeTagGenerator.java b/src/main/java/twilightforest/data/tags/DamageTypeTagGenerator.java new file mode 100644 index 0000000000..dcf7e2268d --- /dev/null +++ b/src/main/java/twilightforest/data/tags/DamageTypeTagGenerator.java @@ -0,0 +1,43 @@ +package twilightforest.data.tags; + +import net.minecraft.core.HolderLookup; +import net.minecraft.core.registries.Registries; +import net.minecraft.data.PackOutput; +import net.minecraft.data.tags.TagsProvider; +import net.minecraft.tags.DamageTypeTags; +import net.minecraft.tags.TagKey; +import net.minecraft.world.damagesource.DamageType; +import net.minecraft.world.damagesource.DamageTypes; +import net.minecraftforge.common.data.ExistingFileHelper; +import twilightforest.TwilightForestMod; +import twilightforest.init.TFDamageTypes; + +import java.util.concurrent.CompletableFuture; + +public class DamageTypeTagGenerator extends TagsProvider { + + public static final TagKey BREAKS_LICH_SHIELDS = create("breaks_lich_shields"); + + public DamageTypeTagGenerator(PackOutput output, CompletableFuture future, ExistingFileHelper helper) { + super(output, Registries.DAMAGE_TYPE, future, TwilightForestMod.ID, helper); + } + + protected void addTags(HolderLookup.Provider provider) { + this.tag(DamageTypeTags.BYPASSES_ARMOR).add(TFDamageTypes.GHAST_TEAR, TFDamageTypes.SLAM, TFDamageTypes.LICH_BOLT, TFDamageTypes.LICH_BOMB, TFDamageTypes.LEAF_BRAIN, TFDamageTypes.LOST_WORDS, TFDamageTypes.SCHOOLED, TFDamageTypes.LIFEDRAIN, TFDamageTypes.EXPIRED, TFDamageTypes.YEETED); + this.tag(DamageTypeTags.DAMAGES_HELMET).add(TFDamageTypes.GHAST_TEAR, TFDamageTypes.THROWN_BLOCK); + this.tag(DamageTypeTags.IS_PROJECTILE).add(TFDamageTypes.TWILIGHT_SCEPTER, TFDamageTypes.LICH_BOLT, TFDamageTypes.LICH_BOMB, TFDamageTypes.THROWN_PICKAXE, TFDamageTypes.THROWN_AXE, TFDamageTypes.THROWN_BLOCK, TFDamageTypes.LEAF_BRAIN, TFDamageTypes.LOST_WORDS, TFDamageTypes.SCHOOLED, TFDamageTypes.SNOWBALL_FIGHT, TFDamageTypes.LIFEDRAIN); + this.tag(DamageTypeTags.IS_FIRE).add(TFDamageTypes.HYDRA_MORTAR, TFDamageTypes.HYDRA_FIRE); + this.tag(DamageTypeTags.BYPASSES_RESISTANCE).add(TFDamageTypes.EXPIRED); + this.tag(DamageTypeTags.ALWAYS_MOST_SIGNIFICANT_FALL).add(TFDamageTypes.EXPIRED); + this.tag(DamageTypeTags.IS_FALL).add(TFDamageTypes.YEETED); + this.tag(DamageTypeTags.NO_ANGER).add(TFDamageTypes.SLAM); + this.tag(DamageTypeTags.BYPASSES_INVULNERABILITY).add(TFDamageTypes.EXPIRED); + this.tag(DamageTypeTags.BYPASSES_ENCHANTMENTS).add(TFDamageTypes.FALLING_ICE); + this.tag(DamageTypeTags.WITCH_RESISTANT_TO).add(TFDamageTypes.LICH_BOMB, TFDamageTypes.LICH_BOLT, TFDamageTypes.LEAF_BRAIN, TFDamageTypes.LOST_WORDS, TFDamageTypes.SCHOOLED); + this.tag(BREAKS_LICH_SHIELDS).add(DamageTypes.MAGIC, DamageTypes.INDIRECT_MAGIC, DamageTypes.SONIC_BOOM, TFDamageTypes.LICH_BOLT, TFDamageTypes.TWILIGHT_SCEPTER); + } + + private static TagKey create(String name) { + return TagKey.create(Registries.DAMAGE_TYPE, TwilightForestMod.prefix(name)); + } +} diff --git a/src/main/java/twilightforest/data/tags/EntityTagGenerator.java b/src/main/java/twilightforest/data/tags/EntityTagGenerator.java new file mode 100644 index 0000000000..48c73bbb54 --- /dev/null +++ b/src/main/java/twilightforest/data/tags/EntityTagGenerator.java @@ -0,0 +1,159 @@ +package twilightforest.data.tags; + +import net.minecraft.core.HolderLookup; +import net.minecraft.core.registries.Registries; +import net.minecraft.data.PackOutput; +import net.minecraft.data.tags.EntityTypeTagsProvider; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.EntityTypeTags; +import net.minecraft.tags.TagKey; +import net.minecraft.world.entity.EntityType; +import net.minecraftforge.common.Tags; +import net.minecraftforge.common.data.ExistingFileHelper; +import org.jetbrains.annotations.Nullable; +import twilightforest.TwilightForestMod; +import twilightforest.init.TFEntities; + +import java.util.concurrent.CompletableFuture; + +public class EntityTagGenerator extends EntityTypeTagsProvider { + public static final TagKey> BOSSES = create(TwilightForestMod.prefix("bosses")); + public static final TagKey> LICH_POPPABLES = create(TwilightForestMod.prefix("lich_poppables")); + public static final TagKey> LIFEDRAIN_DROPS_NO_FLESH = create(TwilightForestMod.prefix("lifedrain_drops_no_flesh")); + public static final TagKey> RIDES_OBSTRUCT_SNATCHING = create(TwilightForestMod.prefix("rides_obstruct_snatching")); + public static final TagKey> DONT_KILL_BUGS = create(TwilightForestMod.prefix("dont_kill_bugs")); + public static final TagKey> SORTABLE_ENTITIES = create(TwilightForestMod.prefix("sortable_entities")); + + public EntityTagGenerator(PackOutput output, CompletableFuture provider, @Nullable ExistingFileHelper helper) { + super(output, provider, TwilightForestMod.ID, helper); + } + + @Override + protected void addTags(HolderLookup.Provider provider) { + tag(EntityTypeTags.SKELETONS).add(TFEntities.SKELETON_DRUID.get()); + tag(EntityTypeTags.ARROWS).add(TFEntities.ICE_ARROW.get(), TFEntities.SEEKER_ARROW.get()); + tag(EntityTypeTags.FREEZE_HURTS_EXTRA_TYPES).add(TFEntities.FIRE_BEETLE.get()); + tag(EntityTypeTags.FROG_FOOD).add(TFEntities.MAZE_SLIME.get()); + + tag(BOSSES).add( + TFEntities.NAGA.get(), + TFEntities.LICH.get(), + TFEntities.MINOSHROOM.get(), + TFEntities.HYDRA.get(), + TFEntities.KNIGHT_PHANTOM.get(), + TFEntities.UR_GHAST.get(), + TFEntities.ALPHA_YETI.get(), + TFEntities.SNOW_QUEEN.get(), + TFEntities.PLATEAU_BOSS.get() + ); + + tag(EntityTypeTags.IMPACT_PROJECTILES).add( + TFEntities.NATURE_BOLT.get(), + TFEntities.LICH_BOLT.get(), + TFEntities.WAND_BOLT.get(), + TFEntities.LICH_BOMB.get(), + TFEntities.MOONWORM_SHOT.get(), + TFEntities.SLIME_BLOB.get(), + TFEntities.THROWN_WEP.get(), + TFEntities.THROWN_ICE.get(), + TFEntities.FALLING_ICE.get(), + TFEntities.ICE_SNOWBALL.get() + ); + + tag(EntityTypeTags.POWDER_SNOW_WALKABLE_MOBS).add( + TFEntities.PENGUIN.get(), + TFEntities.STABLE_ICE_CORE.get(), + TFEntities.UNSTABLE_ICE_CORE.get(), + TFEntities.SNOW_GUARDIAN.get(), + TFEntities.ICE_CRYSTAL.get() + ).add( + TFEntities.RAVEN.get(), + TFEntities.SQUIRREL.get(), + TFEntities.DWARF_RABBIT.get(), + TFEntities.TINY_BIRD.get(), + TFEntities.KOBOLD.get(), + TFEntities.DEATH_TOME.get(), + TFEntities.MOSQUITO_SWARM.get(), + TFEntities.TOWERWOOD_BORER.get() + ); + + tag(EntityTypeTags.FREEZE_IMMUNE_ENTITY_TYPES).add( + TFEntities.PENGUIN.get(), + TFEntities.STABLE_ICE_CORE.get(), + TFEntities.UNSTABLE_ICE_CORE.get(), + TFEntities.SNOW_GUARDIAN.get(), + TFEntities.ICE_CRYSTAL.get() + ).add( + TFEntities.WRAITH.get(), + TFEntities.KNIGHT_PHANTOM.get(), + TFEntities.WINTER_WOLF.get(), + TFEntities.YETI.get() + ).addTag(BOSSES); + + tag(EntityTypeTags.FALL_DAMAGE_IMMUNE).add( + TFEntities.NAGA.get(), + TFEntities.SQUIRREL.get(), + TFEntities.WRAITH.get(), + TFEntities.CARMINITE_GOLEM.get(), + TFEntities.DEATH_TOME.get(), + TFEntities.UR_GHAST.get(), + TFEntities.CARMINITE_GHASTLING.get(), + TFEntities.KNIGHT_PHANTOM.get(), + TFEntities.SNOW_QUEEN.get(), + TFEntities.PENGUIN.get(), + TFEntities.RAVEN.get(), + TFEntities.SNOW_GUARDIAN.get(), + TFEntities.STABLE_ICE_CORE.get(), + TFEntities.MOSQUITO_SWARM.get(), + TFEntities.UNSTABLE_ICE_CORE.get(), + TFEntities.ICE_CRYSTAL.get(), + TFEntities.CARMINITE_GHASTGUARD.get(), + TFEntities.TINY_BIRD.get()); + + tag(LICH_POPPABLES).addTag(EntityTypeTags.SKELETONS).add(EntityType.ZOMBIE, EntityType.ENDERMAN, EntityType.SPIDER, EntityType.CREEPER, TFEntities.SWARM_SPIDER.get()); + + tag(LIFEDRAIN_DROPS_NO_FLESH).addTag(EntityTypeTags.SKELETONS).addTag(EntityTypeTags.FROG_FOOD).add( + EntityType.BLAZE, + EntityType.IRON_GOLEM, + EntityType.PHANTOM, + EntityType.SHULKER, + EntityType.SKELETON_HORSE, + EntityType.SNOW_GOLEM, + EntityType.VEX, + EntityType.WITHER, + TFEntities.CARMINITE_GOLEM.get(), + TFEntities.DEATH_TOME.get(), + TFEntities.ICE_CRYSTAL.get(), + TFEntities.KNIGHT_PHANTOM.get(), + TFEntities.LICH.get(), + TFEntities.MOSQUITO_SWARM.get(), + TFEntities.SNOW_GUARDIAN.get(), + TFEntities.STABLE_ICE_CORE.get(), + TFEntities.UNSTABLE_ICE_CORE.get(), + TFEntities.WRAITH.get()); + + // These entities forcefully take players from the entity they're riding + tag(RIDES_OBSTRUCT_SNATCHING).add(TFEntities.PINCH_BEETLE.get(), TFEntities.YETI.get(), TFEntities.ALPHA_YETI.get()); + + tag(DONT_KILL_BUGS).add(TFEntities.MOONWORM_SHOT.get()); + + tag(SORTABLE_ENTITIES).add( + EntityType.CHEST_MINECART, + EntityType.HOPPER_MINECART, + EntityType.LLAMA, + EntityType.TRADER_LLAMA, + EntityType.DONKEY, + EntityType.MULE); + + tag(Tags.EntityTypes.BOSSES).addTag(BOSSES); + } + + private static TagKey> create(ResourceLocation rl) { + return TagKey.create(Registries.ENTITY_TYPE, rl); + } + + @Override + public String getName() { + return "Twilight Forest Entity Tags"; + } +} diff --git a/src/main/java/twilightforest/data/tags/FluidTagGenerator.java b/src/main/java/twilightforest/data/tags/FluidTagGenerator.java new file mode 100644 index 0000000000..65e941a3aa --- /dev/null +++ b/src/main/java/twilightforest/data/tags/FluidTagGenerator.java @@ -0,0 +1,32 @@ +package twilightforest.data.tags; + +import net.minecraft.core.HolderLookup; +import net.minecraft.data.PackOutput; +import net.minecraft.data.tags.FluidTagsProvider; +import net.minecraft.tags.FluidTags; +import net.minecraft.tags.TagKey; +import net.minecraft.world.level.material.Fluid; +import net.minecraftforge.common.data.ExistingFileHelper; +import org.jetbrains.annotations.Nullable; +import twilightforest.TwilightForestMod; + +import java.util.concurrent.CompletableFuture; + +public class FluidTagGenerator extends FluidTagsProvider { + + public static final TagKey FIRE_JET_FUEL = FluidTags.create(TwilightForestMod.prefix("fire_jet_fuel")); + + public FluidTagGenerator(PackOutput output, CompletableFuture provider, @Nullable ExistingFileHelper existingFileHelper) { + super(output, provider, TwilightForestMod.ID, existingFileHelper); + } + + @Override + protected void addTags(HolderLookup.Provider provider) { + tag(FIRE_JET_FUEL).addTag(FluidTags.LAVA); + } + + @Override + public String getName() { + return "Twilight Forest Fluid Tags"; + } +} diff --git a/src/main/java/twilightforest/data/tags/ItemTagGenerator.java b/src/main/java/twilightforest/data/tags/ItemTagGenerator.java new file mode 100644 index 0000000000..13ed6433bf --- /dev/null +++ b/src/main/java/twilightforest/data/tags/ItemTagGenerator.java @@ -0,0 +1,388 @@ +package twilightforest.data.tags; + +import net.minecraft.core.HolderLookup; +import net.minecraft.data.PackOutput; +import net.minecraft.data.tags.ItemTagsProvider; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.BlockTags; +import net.minecraft.tags.ItemTags; +import net.minecraft.tags.TagKey; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.block.Block; +import net.minecraftforge.common.Tags; +import net.minecraftforge.common.data.ExistingFileHelper; +import twilightforest.TwilightForestMod; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFItems; + +import java.util.concurrent.CompletableFuture; + +public class ItemTagGenerator extends ItemTagsProvider { + public static final TagKey TWILIGHT_OAK_LOGS = ItemTags.create(TwilightForestMod.prefix("twilight_oak_logs")); + public static final TagKey CANOPY_LOGS = ItemTags.create(TwilightForestMod.prefix("canopy_logs")); + public static final TagKey MANGROVE_LOGS = ItemTags.create(TwilightForestMod.prefix("mangrove_logs")); + public static final TagKey DARKWOOD_LOGS = ItemTags.create(TwilightForestMod.prefix("darkwood_logs")); + public static final TagKey TIME_LOGS = ItemTags.create(TwilightForestMod.prefix("timewood_logs")); + public static final TagKey TRANSFORMATION_LOGS = ItemTags.create(TwilightForestMod.prefix("transwood_logs")); + public static final TagKey MINING_LOGS = ItemTags.create(TwilightForestMod.prefix("mining_logs")); + public static final TagKey SORTING_LOGS = ItemTags.create(TwilightForestMod.prefix("sortwood_logs")); + + public static final TagKey TWILIGHT_LOGS = ItemTags.create(TwilightForestMod.prefix("logs")); + + public static final TagKey PAPER = ItemTags.create(new ResourceLocation("forge", "paper")); + + public static final TagKey TOWERWOOD = ItemTags.create(TwilightForestMod.prefix("towerwood")); + + public static final TagKey FIERY_VIAL = ItemTags.create(TwilightForestMod.prefix("fiery_vial")); + + public static final TagKey ARCTIC_FUR = ItemTags.create(TwilightForestMod.prefix("arctic_fur")); + public static final TagKey CARMINITE_GEMS = ItemTags.create(new ResourceLocation("forge", "gems/carminite")); + public static final TagKey FIERY_INGOTS = ItemTags.create(new ResourceLocation("forge", "ingots/fiery")); + public static final TagKey IRONWOOD_INGOTS = ItemTags.create(new ResourceLocation("forge", "ingots/ironwood")); + public static final TagKey KNIGHTMETAL_INGOTS = ItemTags.create(new ResourceLocation("forge", "ingots/knightmetal")); + public static final TagKey STEELEAF_INGOTS = ItemTags.create(new ResourceLocation("forge", "ingots/steeleaf")); + + public static final TagKey STORAGE_BLOCKS_ARCTIC_FUR = ItemTags.create(new ResourceLocation("forge", "storage_blocks/arctic_fur")); + public static final TagKey STORAGE_BLOCKS_CARMINITE = ItemTags.create(new ResourceLocation("forge", "storage_blocks/carminite")); + public static final TagKey STORAGE_BLOCKS_FIERY = ItemTags.create(new ResourceLocation("forge", "storage_blocks/fiery")); + public static final TagKey STORAGE_BLOCKS_IRONWOOD = ItemTags.create(new ResourceLocation("forge", "storage_blocks/ironwood")); + public static final TagKey STORAGE_BLOCKS_KNIGHTMETAL = ItemTags.create(new ResourceLocation("forge", "storage_blocks/knightmetal")); + public static final TagKey STORAGE_BLOCKS_STEELEAF = ItemTags.create(new ResourceLocation("forge", "storage_blocks/steeleaf")); + + public static final TagKey RAW_MATERIALS_IRONWOOD = ItemTags.create(new ResourceLocation("forge", "raw_materials/ironwood")); + public static final TagKey RAW_MATERIALS_KNIGHTMETAL = ItemTags.create(new ResourceLocation("forge", "raw_materials/knightmetal")); + + public static final TagKey PORTAL_ACTIVATOR = ItemTags.create(TwilightForestMod.prefix("portal/activator")); + + public static final TagKey WIP = ItemTags.create(TwilightForestMod.prefix("wip")); + public static final TagKey NYI = ItemTags.create(TwilightForestMod.prefix("nyi")); + + public static final TagKey KOBOLD_PACIFICATION_BREADS = ItemTags.create(TwilightForestMod.prefix("kobold_pacification_breads")); + + public static final TagKey BANNED_UNCRAFTING_INGREDIENTS = ItemTags.create(TwilightForestMod.prefix("banned_uncrafting_ingredients")); + public static final TagKey BANNED_UNCRAFTABLES = ItemTags.create(TwilightForestMod.prefix("banned_uncraftables")); + public static final TagKey UNCRAFTING_IGNORES_COST = ItemTags.create(TwilightForestMod.prefix("uncrafting_ignores_cost")); + + public static final TagKey KEPT_ON_DEATH = ItemTags.create(TwilightForestMod.prefix("kept_on_death")); + + private static final TagKey CHARM = ItemTags.create(new ResourceLocation("curios", "charm")); + private static final TagKey HEAD = ItemTags.create(new ResourceLocation("curios", "head")); + + public static final TagKey CA_PLANTS = ItemTags.create(new ResourceLocation("createaddition", "plants")); + public static final TagKey CA_PLANT_FOODS = ItemTags.create(new ResourceLocation("createaddition", "plant_foods")); + + public static final TagKey RANDOMIUM_BLACKLIST = ItemTags.create(new ResourceLocation("randomium", "blacklist")); + + + public ItemTagGenerator(PackOutput output, CompletableFuture future, CompletableFuture> provider, ExistingFileHelper helper) { + super(output, future, provider, TwilightForestMod.ID, helper); + } + + @Override + protected void addTags(HolderLookup.Provider provider) { + this.copy(BlockTagGenerator.TWILIGHT_OAK_LOGS, TWILIGHT_OAK_LOGS); + this.copy(BlockTagGenerator.CANOPY_LOGS, CANOPY_LOGS); + this.copy(BlockTagGenerator.MANGROVE_LOGS, MANGROVE_LOGS); + this.copy(BlockTagGenerator.DARKWOOD_LOGS, DARKWOOD_LOGS); + this.copy(BlockTagGenerator.TIME_LOGS, TIME_LOGS); + this.copy(BlockTagGenerator.TRANSFORMATION_LOGS, TRANSFORMATION_LOGS); + this.copy(BlockTagGenerator.MINING_LOGS, MINING_LOGS); + this.copy(BlockTagGenerator.SORTING_LOGS, SORTING_LOGS); + + this.copy(BlockTagGenerator.TF_LOGS, TWILIGHT_LOGS); + tag(ItemTags.LOGS).addTag(TWILIGHT_LOGS); + tag(ItemTags.LOGS_THAT_BURN) + .addTag(TWILIGHT_OAK_LOGS).addTag(CANOPY_LOGS).addTag(MANGROVE_LOGS) + .addTag(TIME_LOGS).addTag(TRANSFORMATION_LOGS).addTag(MINING_LOGS).addTag(SORTING_LOGS); + + this.copy(BlockTags.SAPLINGS, ItemTags.SAPLINGS); + this.copy(BlockTags.LEAVES, ItemTags.LEAVES); + + this.copy(BlockTags.PLANKS, ItemTags.PLANKS); + + this.copy(BlockTags.WOODEN_FENCES, ItemTags.WOODEN_FENCES); + this.copy(Tags.Blocks.FENCES, Tags.Items.FENCES); + this.copy(Tags.Blocks.FENCE_GATES, Tags.Items.FENCE_GATES); + this.copy(Tags.Blocks.FENCES_WOODEN, Tags.Items.FENCES_WOODEN); + this.copy(Tags.Blocks.FENCE_GATES_WOODEN, Tags.Items.FENCE_GATES_WOODEN); + + this.copy(BlockTags.WOODEN_SLABS, ItemTags.WOODEN_SLABS); + this.copy(BlockTags.SLABS, ItemTags.SLABS); + this.copy(BlockTags.WOODEN_STAIRS, ItemTags.WOODEN_STAIRS); + this.copy(BlockTags.STAIRS, ItemTags.STAIRS); + + this.copy(BlockTags.WOODEN_BUTTONS, ItemTags.WOODEN_BUTTONS); + this.copy(BlockTags.WOODEN_PRESSURE_PLATES, ItemTags.WOODEN_PRESSURE_PLATES); + + this.copy(BlockTags.WOODEN_TRAPDOORS, ItemTags.WOODEN_TRAPDOORS); + this.copy(BlockTags.WOODEN_DOORS, ItemTags.WOODEN_DOORS); + tag(ItemTags.SIGNS).add(TFBlocks.TWILIGHT_OAK_SIGN.get().asItem(), TFBlocks.CANOPY_SIGN.get().asItem(), + TFBlocks.MANGROVE_SIGN.get().asItem(), TFBlocks.DARK_SIGN.get().asItem(), + TFBlocks.TIME_SIGN.get().asItem(), TFBlocks.TRANSFORMATION_SIGN.get().asItem(), + TFBlocks.MINING_SIGN.get().asItem(), TFBlocks.SORTING_SIGN.get().asItem()); + + this.copy(Tags.Blocks.CHESTS_WOODEN, Tags.Items.CHESTS_WOODEN); + + this.copy(BlockTagGenerator.STORAGE_BLOCKS_ARCTIC_FUR, STORAGE_BLOCKS_ARCTIC_FUR); + this.copy(BlockTagGenerator.STORAGE_BLOCKS_CARMINITE, STORAGE_BLOCKS_CARMINITE); + this.copy(BlockTagGenerator.STORAGE_BLOCKS_FIERY, STORAGE_BLOCKS_FIERY); + this.copy(BlockTagGenerator.STORAGE_BLOCKS_IRONWOOD, STORAGE_BLOCKS_IRONWOOD); + this.copy(BlockTagGenerator.STORAGE_BLOCKS_KNIGHTMETAL, STORAGE_BLOCKS_KNIGHTMETAL); + this.copy(BlockTagGenerator.STORAGE_BLOCKS_STEELEAF, STORAGE_BLOCKS_STEELEAF); + + tag(Tags.Items.STORAGE_BLOCKS) + .addTag(STORAGE_BLOCKS_FIERY).addTag(STORAGE_BLOCKS_ARCTIC_FUR) + .addTag(STORAGE_BLOCKS_CARMINITE).addTag(STORAGE_BLOCKS_IRONWOOD) + .addTag(STORAGE_BLOCKS_KNIGHTMETAL).addTag(STORAGE_BLOCKS_STEELEAF); + + this.copy(BlockTagGenerator.TOWERWOOD, TOWERWOOD); + + tag(PAPER).add(Items.PAPER); + tag(Tags.Items.FEATHERS).add(Items.FEATHER).add(TFItems.RAVEN_FEATHER.get()); + + tag(FIERY_VIAL).add(TFItems.FIERY_BLOOD.get(), TFItems.FIERY_TEARS.get()); + + tag(ARCTIC_FUR).add(TFItems.ARCTIC_FUR.get()); + tag(CARMINITE_GEMS).add(TFItems.CARMINITE.get()); + tag(FIERY_INGOTS).add(TFItems.FIERY_INGOT.get()); + tag(IRONWOOD_INGOTS).add(TFItems.IRONWOOD_INGOT.get()); + tag(KNIGHTMETAL_INGOTS).add(TFItems.KNIGHTMETAL_INGOT.get()); + tag(STEELEAF_INGOTS).add(TFItems.STEELEAF_INGOT.get()); + + tag(Tags.Items.GEMS).addTag(CARMINITE_GEMS); + + tag(Tags.Items.INGOTS) + .addTag(IRONWOOD_INGOTS).addTag(FIERY_INGOTS) + .addTag(KNIGHTMETAL_INGOTS).addTag(STEELEAF_INGOTS); + + tag(RAW_MATERIALS_IRONWOOD).add(TFItems.RAW_IRONWOOD.get()); + tag(RAW_MATERIALS_KNIGHTMETAL).add(TFItems.ARMOR_SHARD_CLUSTER.get()); + tag(Tags.Items.RAW_MATERIALS).addTag(RAW_MATERIALS_IRONWOOD).addTag(RAW_MATERIALS_KNIGHTMETAL); + + tag(PORTAL_ACTIVATOR).addTag(Tags.Items.GEMS_DIAMOND); + + tag(ItemTags.BOATS).add( + TFItems.TWILIGHT_OAK_BOAT.get(), TFItems.CANOPY_BOAT.get(), + TFItems.MANGROVE_BOAT.get(), TFItems.DARKWOOD_BOAT.get(), + TFItems.TIME_BOAT.get(), TFItems.TRANSFORMATION_BOAT.get(), + TFItems.MINING_BOAT.get(), TFItems.SORTING_BOAT.get() + ); + + tag(ItemTags.CHEST_BOATS).add( + TFItems.TWILIGHT_OAK_CHEST_BOAT.get(), TFItems.CANOPY_CHEST_BOAT.get(), + TFItems.MANGROVE_CHEST_BOAT.get(), TFItems.DARKWOOD_CHEST_BOAT.get(), + TFItems.TIME_CHEST_BOAT.get(), TFItems.TRANSFORMATION_CHEST_BOAT.get(), + TFItems.MINING_CHEST_BOAT.get(), TFItems.SORTING_CHEST_BOAT.get() + ); + + tag(ItemTags.FREEZE_IMMUNE_WEARABLES).add( + TFItems.FIERY_HELMET.get(), + TFItems.FIERY_CHESTPLATE.get(), + TFItems.FIERY_LEGGINGS.get(), + TFItems.FIERY_BOOTS.get(), + TFItems.ARCTIC_HELMET.get(), + TFItems.ARCTIC_CHESTPLATE.get(), + TFItems.ARCTIC_LEGGINGS.get(), + TFItems.ARCTIC_BOOTS.get(), + TFItems.YETI_HELMET.get(), + TFItems.YETI_CHESTPLATE.get(), + TFItems.YETI_LEGGINGS.get(), + TFItems.YETI_BOOTS.get() + ); + + tag(WIP).add( + TFBlocks.KEEPSAKE_CASKET.get().asItem(), + TFBlocks.CANDELABRA.get().asItem(), + TFItems.BRITTLE_FLASK.get(), + TFItems.GREATER_FLASK.get(), + TFItems.CUBE_OF_ANNIHILATION.get() + ); + + tag(NYI).add( + TFBlocks.CINDER_FURNACE.get().asItem(), + TFBlocks.CINDER_LOG.get().asItem(), + TFBlocks.CINDER_WOOD.get().asItem(), + TFBlocks.TWILIGHT_PORTAL_MINIATURE_STRUCTURE.get().asItem(), + TFBlocks.NAGA_COURTYARD_MINIATURE_STRUCTURE.get().asItem(), + TFBlocks.LICH_TOWER_MINIATURE_STRUCTURE.get().asItem(), + TFBlocks.AURORALIZED_GLASS.get().asItem(), + TFBlocks.SLIDER.get().asItem(), + TFBlocks.TWISTED_STONE.get().asItem(), + TFBlocks.TWISTED_STONE_PILLAR.get().asItem(), + TFItems.ORE_METER.get() + ); + + tag(KOBOLD_PACIFICATION_BREADS).add(Items.BREAD); + + tag(ItemTags.MUSIC_DISCS).add( + TFItems.MUSIC_DISC_FINDINGS.get(), + TFItems.MUSIC_DISC_HOME.get(), + TFItems.MUSIC_DISC_MAKER.get(), + TFItems.MUSIC_DISC_MOTION.get(), + TFItems.MUSIC_DISC_RADIANCE.get(), + TFItems.MUSIC_DISC_STEPS.get(), + TFItems.MUSIC_DISC_SUPERSTITIOUS.get(), + TFItems.MUSIC_DISC_THREAD.get(), + TFItems.MUSIC_DISC_WAYFARER.get()); + + tag(BANNED_UNCRAFTING_INGREDIENTS).add( + TFBlocks.INFESTED_TOWERWOOD.get().asItem(), + TFBlocks.HOLLOW_OAK_SAPLING.get().asItem(), + TFBlocks.TIME_SAPLING.get().asItem(), + TFBlocks.TRANSFORMATION_SAPLING.get().asItem(), + TFBlocks.MINING_SAPLING.get().asItem(), + TFBlocks.SORTING_SAPLING.get().asItem(), + TFItems.TRANSFORMATION_POWDER.get()); + + tag(BANNED_UNCRAFTABLES).add(TFBlocks.GIANT_LOG.get().asItem()); + tag(UNCRAFTING_IGNORES_COST).addTag(Tags.Items.RODS_WOODEN); + + tag(KEPT_ON_DEATH).add(TFItems.TOWER_KEY.get(), TFItems.PHANTOM_HELMET.get(), TFItems.PHANTOM_CHESTPLATE.get()); + + tag(ItemTags.PIGLIN_LOVED).add(TFItems.GOLDEN_MINOTAUR_AXE.get(), TFItems.CHARM_OF_KEEPING_3.get(), TFItems.CHARM_OF_LIFE_2.get(), TFItems.LAMP_OF_CINDERS.get()); + + tag(CHARM).add( + TFItems.CHARM_OF_LIFE_1.get(), TFItems.CHARM_OF_LIFE_2.get(), + TFItems.CHARM_OF_KEEPING_1.get(), TFItems.CHARM_OF_KEEPING_2.get(), TFItems.CHARM_OF_KEEPING_3.get() + ); + + tag(HEAD).add( + TFBlocks.NAGA_TROPHY.get().asItem(), + TFBlocks.LICH_TROPHY.get().asItem(), + TFBlocks.MINOSHROOM_TROPHY.get().asItem(), + TFBlocks.HYDRA_TROPHY.get().asItem(), + TFBlocks.KNIGHT_PHANTOM_TROPHY.get().asItem(), + TFBlocks.UR_GHAST_TROPHY.get().asItem(), + TFBlocks.ALPHA_YETI_TROPHY.get().asItem(), + TFBlocks.SNOW_QUEEN_TROPHY.get().asItem(), + TFBlocks.QUEST_RAM_TROPHY.get().asItem(), + TFBlocks.CICADA.get().asItem(), + TFBlocks.FIREFLY.get().asItem(), + TFBlocks.MOONWORM.get().asItem(), + TFBlocks.CREEPER_SKULL_CANDLE.get().asItem(), + TFBlocks.PLAYER_SKULL_CANDLE.get().asItem(), + TFBlocks.SKELETON_SKULL_CANDLE.get().asItem(), + TFBlocks.WITHER_SKELE_SKULL_CANDLE.get().asItem(), + TFBlocks.ZOMBIE_SKULL_CANDLE.get().asItem()); + + tag(Tags.Items.HEADS).add( + TFBlocks.ZOMBIE_SKULL_CANDLE.get().asItem(), + TFBlocks.SKELETON_SKULL_CANDLE.get().asItem(), + TFBlocks.WITHER_SKELE_SKULL_CANDLE.get().asItem(), + TFBlocks.CREEPER_SKULL_CANDLE.get().asItem(), + TFBlocks.PLAYER_SKULL_CANDLE.get().asItem()); + + tag(Tags.Items.ARMORS_HELMETS).add( + TFItems.IRONWOOD_HELMET.get(), + TFItems.STEELEAF_HELMET.get(), + TFItems.KNIGHTMETAL_HELMET.get(), + TFItems.PHANTOM_HELMET.get(), + TFItems.FIERY_HELMET.get(), + TFItems.ARCTIC_HELMET.get(), + TFItems.YETI_HELMET.get()); + + tag(Tags.Items.ARMORS_CHESTPLATES).add( + TFItems.NAGA_CHESTPLATE.get(), + TFItems.IRONWOOD_CHESTPLATE.get(), + TFItems.STEELEAF_CHESTPLATE.get(), + TFItems.KNIGHTMETAL_CHESTPLATE.get(), + TFItems.PHANTOM_CHESTPLATE.get(), + TFItems.FIERY_CHESTPLATE.get(), + TFItems.ARCTIC_CHESTPLATE.get(), + TFItems.YETI_CHESTPLATE.get()); + + tag(Tags.Items.ARMORS_LEGGINGS).add( + TFItems.NAGA_LEGGINGS.get(), + TFItems.IRONWOOD_LEGGINGS.get(), + TFItems.STEELEAF_LEGGINGS.get(), + TFItems.KNIGHTMETAL_LEGGINGS.get(), + TFItems.FIERY_LEGGINGS.get(), + TFItems.ARCTIC_LEGGINGS.get(), + TFItems.YETI_LEGGINGS.get()); + + tag(Tags.Items.ARMORS_BOOTS).add( + TFItems.IRONWOOD_BOOTS.get(), + TFItems.STEELEAF_BOOTS.get(), + TFItems.KNIGHTMETAL_BOOTS.get(), + TFItems.FIERY_BOOTS.get(), + TFItems.ARCTIC_BOOTS.get(), + TFItems.YETI_BOOTS.get()); + + tag(ItemTags.SWORDS).add( + TFItems.IRONWOOD_SWORD.get(), + TFItems.STEELEAF_SWORD.get(), + TFItems.KNIGHTMETAL_SWORD.get(), + TFItems.FIERY_SWORD.get(), + TFItems.GIANT_SWORD.get(), + TFItems.ICE_SWORD.get(), + TFItems.GLASS_SWORD.get()); + + tag(ItemTags.PICKAXES).add( + TFItems.IRONWOOD_PICKAXE.get(), + TFItems.STEELEAF_PICKAXE.get(), + TFItems.KNIGHTMETAL_PICKAXE.get(), + TFItems.MAZEBREAKER_PICKAXE.get(), + TFItems.FIERY_PICKAXE.get(), + TFItems.GIANT_PICKAXE.get()); + + tag(ItemTags.AXES).add(TFItems.IRONWOOD_AXE.get(), TFItems.STEELEAF_AXE.get(), TFItems.KNIGHTMETAL_AXE.get()); + tag(ItemTags.SHOVELS).add(TFItems.IRONWOOD_SHOVEL.get(), TFItems.STEELEAF_SHOVEL.get()); + tag(ItemTags.HOES).add(TFItems.IRONWOOD_HOE.get(), TFItems.STEELEAF_HOE.get()); + tag(Tags.Items.TOOLS_SHIELDS).add(TFItems.KNIGHTMETAL_SHIELD.get()); + tag(Tags.Items.TOOLS_BOWS).add(TFItems.TRIPLE_BOW.get(), TFItems.SEEKER_BOW.get(), TFItems.ICE_BOW.get(), TFItems.ENDER_BOW.get()); + + tag(ItemTags.CLUSTER_MAX_HARVESTABLES).add( + TFItems.IRONWOOD_PICKAXE.get(), + TFItems.STEELEAF_PICKAXE.get(), + TFItems.KNIGHTMETAL_PICKAXE.get(), + TFItems.MAZEBREAKER_PICKAXE.get(), + TFItems.FIERY_PICKAXE.get(), + TFItems.GIANT_PICKAXE.get()); + + tag(ItemTags.SMALL_FLOWERS).add(TFBlocks.THORN_ROSE.get().asItem()); + + tag(CA_PLANT_FOODS).add(TFItems.TORCHBERRIES.get()); + + tag(CA_PLANTS).add(TFItems.LIVEROOT.get(), TFItems.MAGIC_BEANS.get(), + TFBlocks.HUGE_WATER_LILY.get().asItem(), TFBlocks.HUGE_LILY_PAD.get().asItem(), + TFBlocks.TROLLVIDR.get().asItem(), TFBlocks.UNRIPE_TROLLBER.get().asItem(), + TFBlocks.TROLLBER.get().asItem(), TFBlocks.HUGE_STALK.get().asItem(), + TFBlocks.THORN_ROSE.get().asItem(), TFBlocks.MAYAPPLE.get().asItem(), + TFBlocks.CLOVER_PATCH.get().asItem(), TFBlocks.FIDDLEHEAD.get().asItem(), + TFBlocks.MUSHGLOOM.get().asItem(), TFBlocks.TORCHBERRY_PLANT.get().asItem(), + TFBlocks.ROOT_STRAND.get().asItem(), TFBlocks.FALLEN_LEAVES.get().asItem(), + TFBlocks.HEDGE.get().asItem(), TFBlocks.ROOT_BLOCK.get().asItem(), TFBlocks.LIVEROOT_BLOCK.get().asItem()); + + tag(RANDOMIUM_BLACKLIST).addTag(NYI).addTag(WIP).add(TFItems.GLASS_SWORD.get(), //this one is here because the ore can give the unbreakable one + TFBlocks.TIME_LOG_CORE.get().asItem(), TFBlocks.TRANSFORMATION_LOG_CORE.get().asItem(), + TFBlocks.MINING_LOG_CORE.get().asItem(), TFBlocks.SORTING_LOG_CORE.get().asItem(), + TFBlocks.ANTIBUILDER.get().asItem(), TFBlocks.STRONGHOLD_SHIELD.get().asItem(), + TFBlocks.LOCKED_VANISHING_BLOCK.get().asItem(), TFBlocks.BROWN_THORNS.get().asItem(), + TFBlocks.GREEN_THORNS.get().asItem(), TFBlocks.BURNT_THORNS.get().asItem(), + TFBlocks.PINK_FORCE_FIELD.get().asItem(), TFBlocks.ORANGE_FORCE_FIELD.get().asItem(), + TFBlocks.GREEN_FORCE_FIELD.get().asItem(), TFBlocks.BLUE_FORCE_FIELD.get().asItem(), + TFBlocks.VIOLET_FORCE_FIELD.get().asItem(), TFBlocks.FINAL_BOSS_BOSS_SPAWNER.get().asItem(), + TFBlocks.NAGA_BOSS_SPAWNER.get().asItem(), TFBlocks.LICH_BOSS_SPAWNER.get().asItem(), + TFBlocks.MINOSHROOM_BOSS_SPAWNER.get().asItem(), TFBlocks.HYDRA_BOSS_SPAWNER.get().asItem(), + TFBlocks.KNIGHT_PHANTOM_BOSS_SPAWNER.get().asItem(), TFBlocks.UR_GHAST_BOSS_SPAWNER.get().asItem(), + TFBlocks.ALPHA_YETI_BOSS_SPAWNER.get().asItem(), TFBlocks.SNOW_QUEEN_BOSS_SPAWNER.get().asItem()); + + //saved for 1.20 +// tag(ItemTags.TRIMMABLE_ARMOR) +// .add(TFItems.IRONWOOD_HELMET.get(), TFItems.IRONWOOD_CHESTPLATE.get(), TFItems.IRONWOOD_LEGGINGS.get(), TFItems.IRONWOOD_BOOTS.get()) +// .add(TFItems.STEELEAF_HELMET.get(), TFItems.STEELEAF_CHESTPLATE.get(), TFItems.STEELEAF_LEGGINGS.get(), TFItems.STEELEAF_BOOTS.get()) +// .add(TFItems.KNIGHTMETAL_HELMET.get(), TFItems.KNIGHTMETAL_CHESTPLATE.get(), TFItems.KNIGHTMETAL_LEGGINGS.get(), TFItems.KNIGHTMETAL_BOOTS.get()) +// .add(TFItems.ARCTIC_HELMET.get(), TFItems.ARCTIC_CHESTPLATE.get(), TFItems.ARCTIC_LEGGINGS.get(), TFItems.ARCTIC_BOOTS.get()) +// .add(TFItems.YETI_HELMET.get(), TFItems.YETI_CHESTPLATE.get(), TFItems.YETI_LEGGINGS.get(), TFItems.YETI_BOOTS.get()) +// .add(TFItems.FIERY_HELMET.get(), TFItems.FIERY_CHESTPLATE.get(), TFItems.FIERY_LEGGINGS.get(), TFItems.FIERY_BOOTS.get()) +// .add(TFItems.PHANTOM_HELMET.get(), TFItems.PHANTOM_CHESTPLATE.get(), TFItems.NAGA_CHESTPLATE.get(), TFItems.NAGA_LEGGINGS.get()); +// +// tag(ItemTags.TRIM_MATERIALS).add(TFItems.IRONWOOD_INGOT.get(), TFItems.STEELEAF_INGOT.get(), TFItems.KNIGHTMETAL_INGOT.get(), TFItems.NAGA_SCALE.get(), TFItems.CARMINITE.get(), TFItems.FIERY_INGOT.get()); + } + + @Override + public String getName() { + return "Twilight Forest Item Tags"; + } +} diff --git a/src/main/java/twilightforest/data/tags/StructureTagGenerator.java b/src/main/java/twilightforest/data/tags/StructureTagGenerator.java new file mode 100644 index 0000000000..734d0e8c21 --- /dev/null +++ b/src/main/java/twilightforest/data/tags/StructureTagGenerator.java @@ -0,0 +1,44 @@ +package twilightforest.data.tags; + +import net.minecraft.core.HolderLookup; +import net.minecraft.core.registries.Registries; +import net.minecraft.data.PackOutput; +import net.minecraft.data.tags.StructureTagsProvider; +import net.minecraft.tags.TagKey; +import net.minecraft.world.level.levelgen.structure.Structure; +import net.minecraftforge.common.data.ExistingFileHelper; +import org.jetbrains.annotations.Nullable; +import twilightforest.TwilightForestMod; +import twilightforest.init.TFStructures; + +import java.util.concurrent.CompletableFuture; + +public class StructureTagGenerator extends StructureTagsProvider { + public static final TagKey LANDMARK = TagKey.create(Registries.STRUCTURE, TwilightForestMod.prefix("landmark")); + + public StructureTagGenerator(PackOutput output, CompletableFuture provider, @Nullable ExistingFileHelper helper) { + super(output, provider, TwilightForestMod.ID, helper); + } + + @Override + protected void addTags(HolderLookup.Provider p_256087_) { + this.tag(LANDMARK).add( + TFStructures.HEDGE_MAZE, + TFStructures.QUEST_GROVE, + TFStructures.MUSHROOM_TOWER, + TFStructures.HOLLOW_HILL_SMALL, + TFStructures.HOLLOW_HILL_MEDIUM, + TFStructures.HOLLOW_HILL_LARGE, + TFStructures.NAGA_COURTYARD, + TFStructures.LICH_TOWER, + TFStructures.LABYRINTH, + TFStructures.HYDRA_LAIR, + TFStructures.KNIGHT_STRONGHOLD, + TFStructures.DARK_TOWER, + TFStructures.YETI_CAVE, + TFStructures.AURORA_PALACE, + TFStructures.TROLL_CAVE, + TFStructures.FINAL_CASTLE + ); + } +} diff --git a/src/main/java/twilightforest/data/tags/package-info.java b/src/main/java/twilightforest/data/tags/package-info.java new file mode 100644 index 0000000000..657be0f6ee --- /dev/null +++ b/src/main/java/twilightforest/data/tags/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.data.tags; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/dispenser/CrumbleDispenseBehavior.java b/src/main/java/twilightforest/dispenser/CrumbleDispenseBehavior.java new file mode 100644 index 0000000000..4565a7a67f --- /dev/null +++ b/src/main/java/twilightforest/dispenser/CrumbleDispenseBehavior.java @@ -0,0 +1,52 @@ +package twilightforest.dispenser; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockSource; +import net.minecraft.core.dispenser.DefaultDispenseItemBehavior; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.DispenserBlock; +import net.minecraft.world.level.block.state.BlockState; +import twilightforest.init.TFRecipes; + +public class CrumbleDispenseBehavior extends DefaultDispenseItemBehavior { + + boolean fired = false; + + @Override + protected ItemStack execute(BlockSource source, ItemStack stack) { + Level level = source.getLevel(); + BlockPos pos = source.getPos().relative(source.getBlockState().getValue(DispenserBlock.FACING)); + BlockState state = level.getBlockState(pos); + if (!level.isClientSide()) { + if (!(stack.getMaxDamage() == stack.getDamageValue() + 1)) { + level.getRecipeManager().getAllRecipesFor(TFRecipes.CRUMBLE_RECIPE.get()).forEach(recipe -> { + if (recipe.input().is(state.getBlock())) { + if (recipe.result().is(Blocks.AIR)) { + level.removeBlock(pos, true); + level.levelEvent(2001, pos, Block.getId(state)); + } else { + level.setBlock(pos, recipe.result().getBlock().withPropertiesOf(state), 3); + } + stack.hurt(1, level.getRandom(), null); + this.fired = true; + } + }); + } + } + return stack; + } + + @Override + protected void playSound(BlockSource source) { + if (this.fired) { + super.playSound(source); + this.fired = false; + } else { + source.getLevel().levelEvent(1001, source.getPos(), 0); + } + } + +} diff --git a/src/main/java/twilightforest/dispenser/DamageableStackDispenseBehavior.java b/src/main/java/twilightforest/dispenser/DamageableStackDispenseBehavior.java new file mode 100644 index 0000000000..164a333c9a --- /dev/null +++ b/src/main/java/twilightforest/dispenser/DamageableStackDispenseBehavior.java @@ -0,0 +1,62 @@ +package twilightforest.dispenser; + +import net.minecraft.core.BlockSource; +import net.minecraft.core.Direction; +import net.minecraft.core.Position; +import net.minecraft.core.dispenser.DefaultDispenseItemBehavior; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.entity.projectile.Projectile; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.DispenserBlock; +import twilightforest.init.TFSounds; + +//[VanillaCopy] of ProjectileDispenseBehavior, but it damages the stack instead of using it up every shot +public abstract class DamageableStackDispenseBehavior extends DefaultDispenseItemBehavior { + + private boolean fired = false; + + @Override + public ItemStack execute(BlockSource source, ItemStack stack) { + Level level = source.getLevel(); + Position pos = DispenserBlock.getDispensePosition(source); + Direction direction = source.getBlockState().getValue(DispenserBlock.FACING); + if (!level.isClientSide()) { + if (!(stack.getMaxDamage() == stack.getDamageValue() + this.getDamageAmount())) { + Projectile projectileentity = this.getProjectileEntity(level, pos, stack); + projectileentity.shoot(direction.getStepX(), (float) direction.getStepY() + 0.1F, direction.getStepZ(), this.getProjectileVelocity(), this.getProjectileInaccuracy()); + level.addFreshEntity(projectileentity); + if (stack.hurt(this.getDamageAmount(), level.getRandom(), null)) { + stack.setCount(0); + } + this.fired = true; + } + } + return stack; + } + + protected void playSound(BlockSource source) { + if (this.fired) { + source.getLevel().playSound(null, source.x(), source.y(), source.z(), this.getFiredSound(), SoundSource.NEUTRAL, 1.0F, 1.0F); + this.fired = false; + } else { + source.getLevel().levelEvent(1001, source.getPos(), 0); + } + } + + protected abstract Projectile getProjectileEntity(Level level, Position position, ItemStack stack); + + protected abstract int getDamageAmount(); + + protected abstract SoundEvent getFiredSound(); + + //bigger inaccuracy is a good thing in this case, right? + protected float getProjectileInaccuracy() { + return 18.0F; + } + + protected float getProjectileVelocity() { + return 1.1F; + } +} diff --git a/src/main/java/twilightforest/dispenser/FeatherFanDispenseBehavior.java b/src/main/java/twilightforest/dispenser/FeatherFanDispenseBehavior.java new file mode 100644 index 0000000000..93d64baca8 --- /dev/null +++ b/src/main/java/twilightforest/dispenser/FeatherFanDispenseBehavior.java @@ -0,0 +1,88 @@ +package twilightforest.dispenser; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockSource; +import net.minecraft.core.Direction; +import net.minecraft.core.Vec3i; +import net.minecraft.core.dispenser.DefaultDispenseItemBehavior; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.sounds.SoundSource; +import net.minecraft.util.RandomSource; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntitySelector; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.DispenserBlock; +import net.minecraft.world.phys.AABB; +import twilightforest.init.TFSounds; + +import java.util.List; + +public class FeatherFanDispenseBehavior extends DefaultDispenseItemBehavior { + + boolean fired = false; + + @Override + protected ItemStack execute(BlockSource source, ItemStack stack) { + Level level = source.getLevel(); + BlockPos blockpos = source.getPos().relative(source.getBlockState().getValue(DispenserBlock.FACING)); + int damage = stack.getMaxDamage() - stack.getDamageValue(); + if (!level.isClientSide()) { + List thingsToPush = level.getEntitiesOfClass(LivingEntity.class, new AABB(blockpos).inflate(3), EntitySelector.NO_SPECTATORS); + if (!(thingsToPush.size() >= damage)) { + for (Entity entity : thingsToPush) { + Vec3i lookVec = level.getBlockState(source.getPos()).getValue(DispenserBlock.FACING).getNormal(); + + if (entity.isPushable() || entity instanceof ItemEntity) { + entity.setDeltaMovement(lookVec.getX(), lookVec.getY(), lookVec.getZ()); + if (stack.hurt(1, level.getRandom(), null)) { + stack.setCount(0); + } + } + } + this.fired = true; + } + } + return stack; + } + + @Override + protected void playSound(BlockSource source) { + if (this.fired) { + RandomSource random = source.getLevel().getRandom(); + source.getLevel().playSound(null, source.getPos(), TFSounds.FAN_WHOOSH.get(), SoundSource.BLOCKS, 1.0F + random.nextFloat(), random.nextFloat() * 0.7F + 0.3F); + this.fired = false; + } else { + source.getLevel().levelEvent(1001, source.getPos(), 0); + } + } + + //Particle woooosh + //[VanillaCopy] of WorldRender.playEvent(case 2000), but with further range and a different particle + @Override + protected void playAnimation(BlockSource source, Direction direction) { + BlockPos blockpos = source.getPos().relative(source.getBlockState().getValue(DispenserBlock.FACING)); + Level world = source.getLevel(); + RandomSource random = world.getRandom(); + + int j1 = direction.getStepX(); + int j2 = direction.getStepY(); + int k2 = direction.getStepZ(); + double d18 = (double) blockpos.getX() + (double) j1 * 0.6D + 0.5D; + double d24 = (double) blockpos.getY() + (double) j2 * 0.6D + 0.5D; + double d28 = (double) blockpos.getZ() + (double) k2 * 0.6D + 0.5D; + + for (int i = 0; i < 30; ++i) { + double d4 = random.nextDouble() * 0.2D + 0.01D; + double d6 = d18 + (double) j1 * 0.01D + (random.nextDouble() - 0.5D) * (double) k2 * 0.5D; + double d8 = d24 + (double) j2 * 0.01D + (random.nextDouble() - 0.5D) * (double) j2 * 0.5D; + double d30 = d28 + (double) k2 * 0.01D + (random.nextDouble() - 0.5D) * (double) j1 * 0.5D; + double d9 = (double) j1 * d4 + random.nextGaussian() * 0.01D; + double d10 = (double) j2 * d4 + random.nextGaussian() * 0.01D; + double d11 = (double) k2 * d4 + random.nextGaussian() * 0.01D; + world.addParticle(ParticleTypes.CLOUD, d6, d8, d30, d9, d10, d11); + } + } +} diff --git a/src/main/java/twilightforest/dispenser/IgniteLightableDispenseBehavior.java b/src/main/java/twilightforest/dispenser/IgniteLightableDispenseBehavior.java new file mode 100644 index 0000000000..9647000821 --- /dev/null +++ b/src/main/java/twilightforest/dispenser/IgniteLightableDispenseBehavior.java @@ -0,0 +1,47 @@ +package twilightforest.dispenser; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockSource; +import net.minecraft.core.dispenser.DispenseItemBehavior; +import net.minecraft.core.dispenser.OptionalDispenseItemBehavior; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.DispenserBlock; +import net.minecraft.world.level.block.state.BlockState; +import twilightforest.block.AbstractLightableBlock; + +public class IgniteLightableDispenseBehavior extends OptionalDispenseItemBehavior { + + private final DispenseItemBehavior vanillaBehavior; + + public IgniteLightableDispenseBehavior(DispenseItemBehavior vanillaBehavior) { + this.vanillaBehavior = vanillaBehavior; + } + + @Override + protected ItemStack execute(BlockSource source, ItemStack stack) { + ServerLevel level = source.getLevel(); + if (!level.isClientSide()) { + BlockPos blockpos = source.getPos().relative(source.getBlockState().getValue(DispenserBlock.FACING)); + this.setSuccess(tryLightBlock(level, blockpos)); + if (this.isSuccess() && stack.hurt(1, level.getRandom(), null)) { + stack.setCount(0); + } + } + + return this.vanillaBehavior.dispense(source, stack); + } + + private static boolean tryLightBlock(ServerLevel level, BlockPos pos) { + BlockState blockstate = level.getBlockState(pos); + if (blockstate.getBlock() instanceof AbstractLightableBlock) { + AbstractLightableBlock.Lighting lightValue = blockstate.getValue(AbstractLightableBlock.LIGHTING); + if (lightValue == AbstractLightableBlock.Lighting.NONE) { + level.setBlockAndUpdate(pos, blockstate.setValue(AbstractLightableBlock.LIGHTING, AbstractLightableBlock.Lighting.NORMAL)); + return true; + } + } + + return false; + } +} diff --git a/src/main/java/twilightforest/dispenser/SkullCandleDispenseBehavior.java b/src/main/java/twilightforest/dispenser/SkullCandleDispenseBehavior.java new file mode 100644 index 0000000000..6a1479bc86 --- /dev/null +++ b/src/main/java/twilightforest/dispenser/SkullCandleDispenseBehavior.java @@ -0,0 +1,121 @@ +package twilightforest.dispenser; + +import com.mojang.authlib.GameProfile; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockSource; +import net.minecraft.core.dispenser.OptionalDispenseItemBehavior; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.*; +import net.minecraft.world.level.block.entity.SkullBlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import twilightforest.block.AbstractLightableBlock; +import twilightforest.block.AbstractSkullCandleBlock; +import twilightforest.block.SkullCandleBlock; +import twilightforest.block.WallSkullCandleBlock; +import twilightforest.block.entity.SkullCandleBlockEntity; +import twilightforest.init.TFBlocks; + +public class SkullCandleDispenseBehavior extends OptionalDispenseItemBehavior { + + public SkullCandleDispenseBehavior() { + } + + @Override + protected ItemStack execute(BlockSource source, ItemStack stack) { + ServerLevel level = source.getLevel(); + if (!level.isClientSide()) { + BlockPos blockpos = source.getPos().relative(source.getBlockState().getValue(DispenserBlock.FACING)); + this.setSuccess(tryAddCandle(level, blockpos, stack.getItem()) || tryCreateSkullCandle(level, blockpos, stack.getItem())); + if (this.isSuccess()) { + stack.shrink(1); + } + } + + return stack; + } + + private static boolean tryAddCandle(ServerLevel level, BlockPos pos, Item candle) { + if (level.getBlockEntity(pos) instanceof SkullCandleBlockEntity sc) { + if (candle == AbstractSkullCandleBlock.candleColorToCandle(AbstractSkullCandleBlock.CandleColors.colorFromInt(sc.candleColor).getSerializedName()).asItem()) { + if (sc.candleAmount < 4) { + sc.candleAmount++; + level.playSound(null, pos, SoundEvents.CANDLE_PLACE, SoundSource.BLOCKS, 1.0F, 1.0F); + level.getLightEngine().checkBlock(pos); + level.sendBlockUpdated(pos, level.getBlockState(pos), level.getBlockState(pos), 1); + return true; + } + } + } + return false; + } + + private static boolean tryCreateSkullCandle(ServerLevel level, BlockPos pos, Item candle) { + BlockState blockstate = level.getBlockState(pos); + if (blockstate.getBlock() instanceof AbstractSkullBlock skull) { + SkullBlock.Types type = (SkullBlock.Types) skull.getType(); + boolean wall = blockstate.getBlock() instanceof WallSkullBlock; + switch (type) { + + case SKELETON -> { + if (wall) makeWallSkull(level, pos, TFBlocks.SKELETON_WALL_SKULL_CANDLE.get(), candle); + else makeFloorSkull(level, pos, TFBlocks.SKELETON_SKULL_CANDLE.get(), candle); + } + case WITHER_SKELETON -> { + if (wall) makeWallSkull(level, pos, TFBlocks.WITHER_SKELE_WALL_SKULL_CANDLE.get(), candle); + else makeFloorSkull(level, pos, TFBlocks.WITHER_SKELE_SKULL_CANDLE.get(), candle); + } + case PLAYER -> { + if (wall) makeWallSkull(level, pos, TFBlocks.PLAYER_WALL_SKULL_CANDLE.get(), candle); + else makeFloorSkull(level, pos, TFBlocks.PLAYER_SKULL_CANDLE.get(), candle); + } + case ZOMBIE -> { + if (wall) makeWallSkull(level, pos, TFBlocks.ZOMBIE_WALL_SKULL_CANDLE.get(), candle); + else makeFloorSkull(level, pos, TFBlocks.ZOMBIE_SKULL_CANDLE.get(), candle); + } + case CREEPER -> { + if (wall) makeWallSkull(level, pos, TFBlocks.CREEPER_WALL_SKULL_CANDLE.get(), candle); + else makeFloorSkull(level, pos, TFBlocks.CREEPER_SKULL_CANDLE.get(), candle); + } + default -> { + return false; + } + } + return true; + } + + return false; + } + + private static void makeFloorSkull(Level level, BlockPos pos, Block newBlock, Item candle) { + GameProfile profile = null; + if (level.getBlockEntity(pos) instanceof SkullBlockEntity skull) profile = skull.getOwnerProfile(); + level.setBlockAndUpdate(pos, newBlock.defaultBlockState() + .setValue(AbstractSkullCandleBlock.LIGHTING, AbstractLightableBlock.Lighting.NONE) + .setValue(SkullCandleBlock.ROTATION, level.getBlockState(pos).getValue(SkullBlock.ROTATION))); + level.setBlockEntity(new SkullCandleBlockEntity(pos, + newBlock.defaultBlockState() + .setValue(AbstractSkullCandleBlock.LIGHTING, AbstractLightableBlock.Lighting.NONE) + .setValue(SkullCandleBlock.ROTATION, level.getBlockState(pos).getValue(SkullBlock.ROTATION)), + AbstractSkullCandleBlock.candleToCandleColor(candle).getValue(), 1)); + if (level.getBlockEntity(pos) instanceof SkullCandleBlockEntity sc) sc.setOwner(profile); + } + + private static void makeWallSkull(Level level, BlockPos pos, Block newBlock, Item candle) { + GameProfile profile = null; + if (level.getBlockEntity(pos) instanceof SkullBlockEntity skull) profile = skull.getOwnerProfile(); + level.setBlockAndUpdate(pos, newBlock.defaultBlockState() + .setValue(AbstractSkullCandleBlock.LIGHTING, AbstractLightableBlock.Lighting.NONE) + .setValue(WallSkullCandleBlock.FACING, level.getBlockState(pos).getValue(WallSkullBlock.FACING))); + level.setBlockEntity(new SkullCandleBlockEntity(pos, + newBlock.defaultBlockState() + .setValue(AbstractSkullCandleBlock.LIGHTING, AbstractLightableBlock.Lighting.NONE) + .setValue(WallSkullCandleBlock.FACING, level.getBlockState(pos).getValue(WallSkullBlock.FACING)), + AbstractSkullCandleBlock.candleToCandleColor(candle).getValue(), 1)); + if (level.getBlockEntity(pos) instanceof SkullCandleBlockEntity sc) sc.setOwner(profile); + } +} diff --git a/src/main/java/twilightforest/dispenser/TFDispenserBehaviors.java b/src/main/java/twilightforest/dispenser/TFDispenserBehaviors.java new file mode 100644 index 0000000000..2b44360986 --- /dev/null +++ b/src/main/java/twilightforest/dispenser/TFDispenserBehaviors.java @@ -0,0 +1,126 @@ +package twilightforest.dispenser; + +import net.minecraft.core.BlockSource; +import net.minecraft.core.Position; +import net.minecraft.core.dispenser.AbstractProjectileDispenseBehavior; +import net.minecraft.core.dispenser.DispenseItemBehavior; +import net.minecraft.core.dispenser.OptionalDispenseItemBehavior; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.entity.projectile.Projectile; +import net.minecraft.world.item.ArmorItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.DispenserBlock; +import twilightforest.entity.projectile.IceBomb; +import twilightforest.entity.projectile.MoonwormShot; +import twilightforest.entity.projectile.TwilightWandBolt; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFItems; +import twilightforest.init.TFSounds; + +public class TFDispenserBehaviors { + + public static void init() { + DispenserBlock.registerBehavior(TFItems.MOONWORM_QUEEN.get(), new DamageableStackDispenseBehavior() { + @Override + protected Projectile getProjectileEntity(Level level, Position position, ItemStack stack) { + return new MoonwormShot(level, position.x(), position.y(), position.z()); + } + + @Override + protected int getDamageAmount() { + return 2; + } + + @Override + protected SoundEvent getFiredSound() { + return TFSounds.MOONWORM_SQUISH.get(); + } + }); + + DispenseItemBehavior idispenseitembehavior = new OptionalDispenseItemBehavior() { + @Override + protected ItemStack execute(BlockSource source, ItemStack stack) { + this.setSuccess(ArmorItem.dispenseArmor(source, stack)); + return stack; + } + }; + DispenserBlock.registerBehavior(TFBlocks.NAGA_TROPHY.get().asItem(), idispenseitembehavior); + DispenserBlock.registerBehavior(TFBlocks.LICH_TROPHY.get().asItem(), idispenseitembehavior); + DispenserBlock.registerBehavior(TFBlocks.MINOSHROOM_TROPHY.get().asItem(), idispenseitembehavior); + DispenserBlock.registerBehavior(TFBlocks.HYDRA_TROPHY.get().asItem(), idispenseitembehavior); + DispenserBlock.registerBehavior(TFBlocks.KNIGHT_PHANTOM_TROPHY.get().asItem(), idispenseitembehavior); + DispenserBlock.registerBehavior(TFBlocks.UR_GHAST_TROPHY.get().asItem(), idispenseitembehavior); + DispenserBlock.registerBehavior(TFBlocks.ALPHA_YETI_TROPHY.get().asItem(), idispenseitembehavior); + DispenserBlock.registerBehavior(TFBlocks.SNOW_QUEEN_TROPHY.get().asItem(), idispenseitembehavior); + DispenserBlock.registerBehavior(TFBlocks.QUEST_RAM_TROPHY.get().asItem(), idispenseitembehavior); + DispenserBlock.registerBehavior(TFBlocks.CREEPER_SKULL_CANDLE.get().asItem(), idispenseitembehavior); + DispenserBlock.registerBehavior(TFBlocks.PLAYER_SKULL_CANDLE.get().asItem(), idispenseitembehavior); + DispenserBlock.registerBehavior(TFBlocks.SKELETON_SKULL_CANDLE.get().asItem(), idispenseitembehavior); + DispenserBlock.registerBehavior(TFBlocks.WITHER_SKELE_SKULL_CANDLE.get().asItem(), idispenseitembehavior); + DispenserBlock.registerBehavior(TFBlocks.ZOMBIE_SKULL_CANDLE.get().asItem(), idispenseitembehavior); + DispenserBlock.registerBehavior(TFBlocks.CICADA.get().asItem(), idispenseitembehavior); + DispenserBlock.registerBehavior(TFBlocks.FIREFLY.get().asItem(), idispenseitembehavior); + DispenserBlock.registerBehavior(TFBlocks.MOONWORM.get().asItem(), idispenseitembehavior); + + DispenserBlock.registerBehavior(TFItems.PEACOCK_FEATHER_FAN.get().asItem(), new FeatherFanDispenseBehavior()); + DispenserBlock.registerBehavior(TFItems.CRUMBLE_HORN.get().asItem(), new CrumbleDispenseBehavior()); + DispenserBlock.registerBehavior(TFItems.TRANSFORMATION_POWDER.get().asItem(), new TransformationDispenseBehavior()); + + DispenserBlock.registerBehavior(TFItems.TWILIGHT_SCEPTER.get(), new DamageableStackDispenseBehavior() { + @Override + protected Projectile getProjectileEntity(Level level, Position position, ItemStack stack) { + return new TwilightWandBolt(level, position.x(), position.y(), position.z()); + } + + @Override + protected int getDamageAmount() { + return 1; + } + + @Override + protected SoundEvent getFiredSound() { + return TFSounds.SCEPTER_PEARL.get(); + } + + @Override + protected float getProjectileInaccuracy() { + return 6.0F; + } + }); + + DispenserBlock.registerBehavior(TFItems.ICE_BOMB.get(), new AbstractProjectileDispenseBehavior() { + @Override + protected Projectile getProjectile(Level level, Position pos, ItemStack stack) { + return new IceBomb(level, pos); + } + }); + + //store the vanilla values so we can use them in case our stuff fails + DispenseItemBehavior cachedFlintBehavior = DispenserBlock.DISPENSER_REGISTRY.get(Items.FLINT_AND_STEEL); + DispenseItemBehavior cachedFireChargeBehavior = DispenserBlock.DISPENSER_REGISTRY.get(Items.FIRE_CHARGE); + + DispenserBlock.registerBehavior(Items.FLINT_AND_STEEL, new IgniteLightableDispenseBehavior(cachedFlintBehavior)); + DispenserBlock.registerBehavior(Items.FIRE_CHARGE, new IgniteLightableDispenseBehavior(cachedFireChargeBehavior)); + + //handling tags should be a thing smh + DispenserBlock.registerBehavior(Items.CANDLE, new SkullCandleDispenseBehavior()); + DispenserBlock.registerBehavior(Items.BLACK_CANDLE, new SkullCandleDispenseBehavior()); + DispenserBlock.registerBehavior(Items.GRAY_CANDLE, new SkullCandleDispenseBehavior()); + DispenserBlock.registerBehavior(Items.LIGHT_GRAY_CANDLE, new SkullCandleDispenseBehavior()); + DispenserBlock.registerBehavior(Items.WHITE_CANDLE, new SkullCandleDispenseBehavior()); + DispenserBlock.registerBehavior(Items.RED_CANDLE, new SkullCandleDispenseBehavior()); + DispenserBlock.registerBehavior(Items.ORANGE_CANDLE, new SkullCandleDispenseBehavior()); + DispenserBlock.registerBehavior(Items.YELLOW_CANDLE, new SkullCandleDispenseBehavior()); + DispenserBlock.registerBehavior(Items.GREEN_CANDLE, new SkullCandleDispenseBehavior()); + DispenserBlock.registerBehavior(Items.LIME_CANDLE, new SkullCandleDispenseBehavior()); + DispenserBlock.registerBehavior(Items.BLUE_CANDLE, new SkullCandleDispenseBehavior()); + DispenserBlock.registerBehavior(Items.CYAN_CANDLE, new SkullCandleDispenseBehavior()); + DispenserBlock.registerBehavior(Items.LIGHT_BLUE_CANDLE, new SkullCandleDispenseBehavior()); + DispenserBlock.registerBehavior(Items.PURPLE_CANDLE, new SkullCandleDispenseBehavior()); + DispenserBlock.registerBehavior(Items.MAGENTA_CANDLE, new SkullCandleDispenseBehavior()); + DispenserBlock.registerBehavior(Items.PINK_CANDLE, new SkullCandleDispenseBehavior()); + DispenserBlock.registerBehavior(Items.BROWN_CANDLE, new SkullCandleDispenseBehavior()); + } +} diff --git a/src/main/java/twilightforest/dispenser/TransformationDispenseBehavior.java b/src/main/java/twilightforest/dispenser/TransformationDispenseBehavior.java new file mode 100644 index 0000000000..5d477bea68 --- /dev/null +++ b/src/main/java/twilightforest/dispenser/TransformationDispenseBehavior.java @@ -0,0 +1,76 @@ +package twilightforest.dispenser; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockSource; +import net.minecraft.core.dispenser.DefaultDispenseItemBehavior; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.entity.*; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.ServerLevelAccessor; +import net.minecraft.world.level.block.DispenserBlock; +import net.minecraft.world.phys.AABB; +import net.minecraftforge.event.ForgeEventFactory; +import twilightforest.TwilightForestMod; +import twilightforest.init.TFRecipes; +import twilightforest.init.TFSounds; + +import java.util.UUID; + +public class TransformationDispenseBehavior extends DefaultDispenseItemBehavior { + + boolean fired = false; + + @Override + protected ItemStack execute(BlockSource source, ItemStack stack) { + Level level = source.getLevel(); + RandomSource random = level.getRandom(); + BlockPos blockpos = source.getPos().relative(source.getBlockState().getValue(DispenserBlock.FACING)); + if (!level.isClientSide()) { + for (LivingEntity livingentity : level.getEntitiesOfClass(LivingEntity.class, new AABB(blockpos), EntitySelector.NO_SPECTATORS)) { + level.getRecipeManager().getAllRecipesFor(TFRecipes.TRANSFORM_POWDER_RECIPE.get()).forEach((recipe) -> { + if (recipe.input() == livingentity.getType() || (recipe.isReversible() && recipe.result() == livingentity.getType())) { + EntityType type = recipe.isReversible() && recipe.result() == livingentity.getType() ? recipe.input() : recipe.result(); + Entity newEntity = type.create(level); + if (newEntity != null) { + newEntity.moveTo(livingentity.getX(), livingentity.getY(), livingentity.getZ(), livingentity.getYRot(), livingentity.getXRot()); + if (newEntity instanceof Mob mob && livingentity.getLevel() instanceof ServerLevelAccessor accessor) { + ForgeEventFactory.onFinalizeSpawn(mob, accessor, livingentity.getLevel().getCurrentDifficultyAt(livingentity.blockPosition()), MobSpawnType.CONVERSION, null, null); + } + + try { + UUID uuid = newEntity.getUUID(); + newEntity.load(livingentity.saveWithoutId(newEntity.saveWithoutId(new CompoundTag()))); + newEntity.setUUID(uuid); + } catch (Exception e) { + TwilightForestMod.LOGGER.warn("Couldn't transform entity NBT data", e); + } + + livingentity.getLevel().addFreshEntity(newEntity); + livingentity.discard(); + + if (livingentity instanceof Mob && livingentity.getLevel().isClientSide()) { + ((Mob) livingentity).spawnAnim(); + ((Mob) livingentity).spawnAnim(); + } + livingentity.playSound(TFSounds.POWDER_USE.get(), 1.0F + random.nextFloat(), random.nextFloat() * 0.7F + 0.3F); + stack.shrink(1); + this.fired = true; + } + } + }); + } + } + return stack; + } + + @Override + protected void playSound(BlockSource source) { + if (this.fired) { + super.playSound(source); + } else { + source.getLevel().levelEvent(1001, source.getPos(), 0); + } + } +} diff --git a/src/main/java/twilightforest/dispenser/package-info.java b/src/main/java/twilightforest/dispenser/package-info.java new file mode 100644 index 0000000000..03dceb7f0b --- /dev/null +++ b/src/main/java/twilightforest/dispenser/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.dispenser; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/enchantment/ChillAuraEnchantment.java b/src/main/java/twilightforest/enchantment/ChillAuraEnchantment.java new file mode 100644 index 0000000000..49f84acdc6 --- /dev/null +++ b/src/main/java/twilightforest/enchantment/ChillAuraEnchantment.java @@ -0,0 +1,78 @@ +package twilightforest.enchantment; + +import net.minecraft.tags.EntityTypeTags; +import net.minecraft.tags.ItemTags; +import net.minecraft.util.RandomSource; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ArmorItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.Enchantment; +import net.minecraft.world.item.enchantment.EnchantmentCategory; +import net.minecraft.world.item.enchantment.Enchantments; +import twilightforest.init.TFEnchantments; +import twilightforest.init.TFMobEffects; + +public class ChillAuraEnchantment extends LootOnlyEnchantment { + + public ChillAuraEnchantment(Rarity rarity) { + super(rarity, EnchantmentCategory.ARMOR, new EquipmentSlot[]{EquipmentSlot.HEAD, EquipmentSlot.CHEST, + EquipmentSlot.LEGS, EquipmentSlot.FEET}); + } + + @Override + public boolean canEnchant(ItemStack stack) { + return stack.getItem() instanceof ArmorItem || super.canEnchant(stack); + } + + @Override + public int getMinCost(int level) { + return 5 + (level - 1) * 9; + } + + @Override + public int getMaxCost(int level) { + return this.getMinCost(level) + 15; + } + + @Override + public int getMaxLevel() { + return 3; + } + + @Override + public void doPostHurt(LivingEntity user, Entity attacker, int level) { + if (attacker instanceof LivingEntity entity) { + doChillAuraEffect(entity, 200, level - 1, this.shouldHit(level, user.getRandom())); + } + } + + public static void doChillAuraEffect(LivingEntity victim, int duration, int amplifier, boolean shouldHit) { + if (shouldHit && !victim.getType().is(EntityTypeTags.FREEZE_IMMUNE_ENTITY_TYPES)) { + if (!victim.getItemBySlot(EquipmentSlot.HEAD).is(ItemTags.FREEZE_IMMUNE_WEARABLES) && + !victim.getItemBySlot(EquipmentSlot.CHEST).is(ItemTags.FREEZE_IMMUNE_WEARABLES) && + !victim.getItemBySlot(EquipmentSlot.LEGS).is(ItemTags.FREEZE_IMMUNE_WEARABLES) && + !victim.getItemBySlot(EquipmentSlot.FEET).is(ItemTags.FREEZE_IMMUNE_WEARABLES)) { + if (!(victim instanceof Player player) || !player.isCreative()) { + victim.addEffect(new MobEffectInstance(TFMobEffects.FROSTY.get(), duration, amplifier)); + } + } + } + } + + private boolean shouldHit(int level, RandomSource pRnd) { + if (level <= 0) { + return false; + } else { + return pRnd.nextFloat() < 0.15F * (float) level; + } + } + + @Override + protected boolean checkCompatibility(Enchantment other) { + return super.checkCompatibility(other) && other != TFEnchantments.FIRE_REACT.get() && other != Enchantments.THORNS; + } +} diff --git a/src/main/java/twilightforest/enchantment/DestructionEnchantment.java b/src/main/java/twilightforest/enchantment/DestructionEnchantment.java new file mode 100644 index 0000000000..a34bcb5623 --- /dev/null +++ b/src/main/java/twilightforest/enchantment/DestructionEnchantment.java @@ -0,0 +1,43 @@ +package twilightforest.enchantment; + +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.MobType; +import net.minecraft.world.item.CreativeModeTab; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.Enchantment; +import twilightforest.init.TFEnchantments; +import twilightforest.init.TFItems; +import twilightforest.item.ChainBlockItem; + +public class DestructionEnchantment extends LootOnlyEnchantment { + + public DestructionEnchantment(Rarity rarity) { + super(rarity, TFEnchantments.BLOCK_AND_CHAIN, new EquipmentSlot[] {EquipmentSlot.MAINHAND}); + } + + @Override + public int getMinCost(int level) { + return 5 + (level - 1) * 9; + } + + @Override + public int getMaxCost(int level) { + return this.getMinCost(level) + 15; + } + + @Override + public int getMaxLevel() { + return 3; + } + + @Override + public boolean canEnchant(ItemStack stack) { + return stack.getItem() instanceof ChainBlockItem; + } + + @Override + public float getDamageBonus(int level, MobType type, ItemStack item) { + return -level * 1.5F; + } +} diff --git a/src/main/java/twilightforest/enchantment/EnchantmentTFChillAura.java b/src/main/java/twilightforest/enchantment/EnchantmentTFChillAura.java deleted file mode 100644 index f21f4bc243..0000000000 --- a/src/main/java/twilightforest/enchantment/EnchantmentTFChillAura.java +++ /dev/null @@ -1,14 +0,0 @@ -package twilightforest.enchantment; - -import net.minecraft.enchantment.Enchantment; -import net.minecraft.enchantment.EnumEnchantmentType; - -public class EnchantmentTFChillAura extends Enchantment { - - public EnchantmentTFChillAura(int par1, int par2) - { - super(par1, par2, EnumEnchantmentType.armor); - this.setName("tfChillAura"); - - } -} diff --git a/src/main/java/twilightforest/enchantment/EnchantmentTFFireReact.java b/src/main/java/twilightforest/enchantment/EnchantmentTFFireReact.java deleted file mode 100644 index 7cbfe33e90..0000000000 --- a/src/main/java/twilightforest/enchantment/EnchantmentTFFireReact.java +++ /dev/null @@ -1,14 +0,0 @@ -package twilightforest.enchantment; - -import net.minecraft.enchantment.Enchantment; -import net.minecraft.enchantment.EnumEnchantmentType; - -public class EnchantmentTFFireReact extends Enchantment { - - public EnchantmentTFFireReact(int par1, int par2) - { - super(par1, par2, EnumEnchantmentType.armor); - this.setName("tfFireReact"); - - } -} diff --git a/src/main/java/twilightforest/enchantment/FireReactEnchantment.java b/src/main/java/twilightforest/enchantment/FireReactEnchantment.java new file mode 100644 index 0000000000..b5813a06a2 --- /dev/null +++ b/src/main/java/twilightforest/enchantment/FireReactEnchantment.java @@ -0,0 +1,65 @@ +package twilightforest.enchantment; + +import net.minecraft.util.RandomSource; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ArmorItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.Enchantment; +import net.minecraft.world.item.enchantment.EnchantmentCategory; +import net.minecraft.world.item.enchantment.Enchantments; +import twilightforest.init.TFEnchantments; + +import javax.annotation.Nullable; + +public class FireReactEnchantment extends LootOnlyEnchantment { + + public FireReactEnchantment(Rarity rarity) { + super(rarity, EnchantmentCategory.ARMOR, new EquipmentSlot[]{ + EquipmentSlot.HEAD, EquipmentSlot.CHEST, + EquipmentSlot.LEGS, EquipmentSlot.FEET + }); + } + + @Override + public boolean canEnchant(ItemStack stack) { + return stack.getItem() instanceof ArmorItem || super.canEnchant(stack); + } + + @Override + public int getMinCost(int level) { + return 5 + (level - 1) * 9; + } + + @Override + public int getMaxCost(int level) { + return this.getMinCost(level) + 15; + } + + @Override + public int getMaxLevel() { + return 3; + } + + @Override + public void doPostHurt(LivingEntity user, @Nullable Entity attacker, int level) { + RandomSource random = user.getRandom(); + if (attacker != null && shouldHit(level, random, attacker)) { + attacker.setSecondsOnFire(2 + (random.nextInt(level) * 3)); + } + } + + public static boolean shouldHit(int level, RandomSource random, Entity attacker) { + if (level <= 0 || attacker.fireImmune()) { + return false; + } else { + return random.nextFloat() < 0.15F * (float)level; + } + } + + @Override + protected boolean checkCompatibility(Enchantment other) { + return super.checkCompatibility(other) && other != TFEnchantments.CHILL_AURA.get() && other != Enchantments.THORNS; + } +} diff --git a/src/main/java/twilightforest/enchantment/LootOnlyEnchantment.java b/src/main/java/twilightforest/enchantment/LootOnlyEnchantment.java new file mode 100644 index 0000000000..f9e307da77 --- /dev/null +++ b/src/main/java/twilightforest/enchantment/LootOnlyEnchantment.java @@ -0,0 +1,30 @@ +package twilightforest.enchantment; + +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.item.CreativeModeTab; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.enchantment.Enchantment; +import net.minecraft.world.item.enchantment.EnchantmentCategory; +import twilightforest.init.TFItems; + +public class LootOnlyEnchantment extends Enchantment { + + protected LootOnlyEnchantment(Rarity rarity, EnchantmentCategory category, EquipmentSlot[] applicableSlots) { + super(rarity, category, applicableSlots); + } + + @Override + public boolean isTradeable() { + return false; + } + + @Override + public boolean isTreasureOnly() { + return true; + } + + @Override + public boolean isDiscoverable() { + return false; + } +} diff --git a/src/main/java/twilightforest/enchantment/TFEnchantment.java b/src/main/java/twilightforest/enchantment/TFEnchantment.java deleted file mode 100644 index 700c0bfd9d..0000000000 --- a/src/main/java/twilightforest/enchantment/TFEnchantment.java +++ /dev/null @@ -1,56 +0,0 @@ -package twilightforest.enchantment; - -import net.minecraft.enchantment.Enchantment; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.enchantment.EnumEnchantmentType; -import net.minecraft.entity.player.InventoryPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.util.DamageSource; -import twilightforest.TwilightForestMod; -import twilightforest.item.ItemTFFieryArmor; -import twilightforest.item.ItemTFYetiArmor; - -public class TFEnchantment extends Enchantment -{ - - protected TFEnchantment(int par1, int par2, EnumEnchantmentType par3EnumEnchantmentType) { - super(par1, par2, par3EnumEnchantmentType); - } - - - /** - * Add up the number of fiery armor pieces the player is wearing, multiplied by 5 - */ - public static int getFieryAuraLevel(InventoryPlayer par0InventoryPlayer, DamageSource par1DamageSource) - { - int modifier = 0; - - for (int i = 0; i < par0InventoryPlayer.armorInventory.length; i++) { - ItemStack armor = par0InventoryPlayer.armorInventory[i]; - - if (armor != null && armor.getItem() instanceof ItemTFFieryArmor) { - modifier += 5; - } - } - - return modifier; - } - - /** - * Add up the number of yeti armor pieces the player is wearing, 0-4 - */ - public static int getChillAuraLevel(InventoryPlayer par0InventoryPlayer, DamageSource par1DamageSource) - { - int modifier = 0; - - for (int i = 0; i < par0InventoryPlayer.armorInventory.length; i++) { - ItemStack armor = par0InventoryPlayer.armorInventory[i]; - - if (armor != null && armor.getItem() instanceof ItemTFYetiArmor) { - modifier++; - } - } - - return modifier; - } -} diff --git a/src/main/java/twilightforest/enchantment/package-info.java b/src/main/java/twilightforest/enchantment/package-info.java new file mode 100644 index 0000000000..601f2f7681 --- /dev/null +++ b/src/main/java/twilightforest/enchantment/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.enchantment; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/entity/Chain.java b/src/main/java/twilightforest/entity/Chain.java new file mode 100644 index 0000000000..0bd24a8838 --- /dev/null +++ b/src/main/java/twilightforest/entity/Chain.java @@ -0,0 +1,33 @@ +package twilightforest.entity; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityDimensions; +import twilightforest.entity.monster.BlockChainGoblin; + +public class Chain extends BlockChainGoblin.MultipartGenericsAreDumb { + + public Chain(Entity parent) { + super(parent); + } + + @Override + protected void defineSynchedData() { + this.realSize = EntityDimensions.scalable(0.75F, 0.75F); + } + + @Override + public boolean isPickable() { + return false; + } + + @Override + protected void readAdditionalSaveData(CompoundTag compound) { + + } + + @Override + protected void addAdditionalSaveData(CompoundTag compound) { + + } +} diff --git a/src/main/java/twilightforest/entity/ChainBlock.java b/src/main/java/twilightforest/entity/ChainBlock.java new file mode 100644 index 0000000000..4aff955753 --- /dev/null +++ b/src/main/java/twilightforest/entity/ChainBlock.java @@ -0,0 +1,342 @@ +package twilightforest.entity; + +import net.minecraft.core.BlockPos; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.syncher.EntityDataAccessor; +import net.minecraft.network.syncher.EntityDataSerializers; +import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.entity.projectile.ThrowableProjectile; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.gameevent.GameEvent; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.EntityHitResult; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.common.ToolActions; +import net.minecraftforge.entity.IEntityAdditionalSpawnData; +import net.minecraftforge.entity.PartEntity; +import net.minecraftforge.event.ForgeEventFactory; +import net.minecraftforge.event.level.BlockEvent; +import twilightforest.entity.monster.BlockChainGoblin; +import twilightforest.init.TFDamageTypes; +import twilightforest.init.TFEnchantments; +import twilightforest.init.TFItems; +import twilightforest.init.TFSounds; +import twilightforest.util.WorldUtil; + +public class ChainBlock extends ThrowableProjectile implements IEntityAdditionalSpawnData { + + private static final int MAX_SMASH = 12; + private static final int MAX_CHAIN = 16; + + private static final EntityDataAccessor HAND = SynchedEntityData.defineId(ChainBlock.class, EntityDataSerializers.BOOLEAN); + private static final EntityDataAccessor IS_FOIL = SynchedEntityData.defineId(ChainBlock.class, EntityDataSerializers.BOOLEAN); + private boolean isReturning = false; + private boolean canSmashBlocks; + private boolean hitEntity = false; + private ItemStack stack; + private int blocksSmashed = 0; + private double velX; + private double velY; + private double velZ; + + public final Chain chain1; + public final Chain chain2; + public final Chain chain3; + public final Chain chain4; + public final Chain chain5; + private final BlockChainGoblin.MultipartGenericsAreDumb[] partsArray; + + public ChainBlock(EntityType type, Level world) { + super(type, world); + + this.chain1 = new Chain(this); + this.chain2 = new Chain(this); + this.chain3 = new Chain(this); + this.chain4 = new Chain(this); + this.chain5 = new Chain(this); + this.partsArray = new BlockChainGoblin.MultipartGenericsAreDumb[]{this.chain1, this.chain2, this.chain3, this.chain4, this.chain5}; + } + + public ChainBlock(EntityType type, Level world, LivingEntity thrower, InteractionHand hand, ItemStack stack) { + super(type, thrower, world); + this.isReturning = false; + this.canSmashBlocks = EnchantmentHelper.getTagEnchantmentLevel(TFEnchantments.DESTRUCTION.get(), stack) > 0 && !thrower.hasEffect(MobEffects.DIG_SLOWDOWN); + this.stack = stack; + this.setHand(hand); + this.chain1 = new Chain(this); + this.chain2 = new Chain(this); + this.chain3 = new Chain(this); + this.chain4 = new Chain(this); + this.chain5 = new Chain(this); + this.partsArray = new BlockChainGoblin.MultipartGenericsAreDumb[]{this.chain1, this.chain2, this.chain3, this.chain4, this.chain5}; + this.shootFromRotation(thrower, thrower.getXRot(), thrower.getYRot(), 0.0F, 1.5F, 1.0F); + this.entityData.set(IS_FOIL, stack.hasFoil()); + } + + private void setHand(InteractionHand hand) { + this.entityData.set(HAND, hand == InteractionHand.MAIN_HAND); + } + + public InteractionHand getHand() { + return this.entityData.get(HAND) ? InteractionHand.MAIN_HAND : InteractionHand.OFF_HAND; + } + + public boolean isFoil() { + return this.entityData.get(IS_FOIL); + } + + @Override + public boolean canChangeDimensions() { + return false; + } + + @Override + public void shoot(double x, double y, double z, float speed, float accuracy) { + super.shoot(x, y, z, speed, accuracy); + + // save velocity + this.velX = this.getDeltaMovement().x(); + this.velY = this.getDeltaMovement().y(); + this.velZ = this.getDeltaMovement().z(); + } + + @Override + protected float getGravity() { + return 0.05F; + } + + @Override + protected void onHitEntity(EntityHitResult result) { + super.onHitEntity(result); + // only hit living things + if (!this.getLevel().isClientSide() && result.getEntity() != this.getOwner()) { + float damage = 0.0F; + if (result.getEntity() instanceof LivingEntity living) { + damage = 10 + EnchantmentHelper.getDamageBonus(this.stack, living.getMobType()); + } else if (result.getEntity() instanceof PartEntity part && part.getParent() instanceof LivingEntity living) { + damage = 10 + EnchantmentHelper.getDamageBonus(this.stack, living.getMobType()); + } + + //properly disable shields + if (result.getEntity() instanceof Player player && player.isUsingItem() && player.getUseItem().canPerformAction(ToolActions.SHIELD_BLOCK)) { + player.getUseItem().hurtAndBreak(5, player, event -> event.broadcastBreakEvent(player.getUsedItemHand())); + player.disableShield(true); + } + + if (damage > 0.0F) { + if (result.getEntity().hurt(TFDamageTypes.getIndirectEntityDamageSource(this.getLevel(), TFDamageTypes.SPIKED, this.getOwner(), this), damage)) { + this.playSound(TFSounds.BLOCK_AND_CHAIN_HIT.get(), 1.0f, this.random.nextFloat()); + // age when we hit a monster so that we go back to the player faster + this.hitEntity = true; + this.isReturning = true; + this.tickCount += 60; + if (this.getOwner() instanceof LivingEntity living) { + this.stack.hurtAndBreak(1, living, user -> user.broadcastBreakEvent(this.getHand())); + } + } + } + } + } + + @Override + protected void onHitBlock(BlockHitResult result) { + super.onHitBlock(result); + if (!this.getLevel().isClientSide() && !this.getLevel().isEmptyBlock(result.getBlockPos())) { + if (!this.stack.isCorrectToolForDrops(this.getLevel().getBlockState(result.getBlockPos()))) { + if (!this.isReturning && !this.hitEntity) { + this.playSound(TFSounds.BLOCK_AND_CHAIN_COLLIDE.get(), 0.125f, this.random.nextFloat()); + this.gameEvent(GameEvent.HIT_GROUND); + } + + this.isReturning = true; + + // riccochet + double bounce = 0.6; + this.velX *= bounce; + this.velY *= bounce; + this.velZ *= bounce; + + + switch (result.getDirection()) { + case DOWN: + if (this.velY > 0) { + this.velY *= -bounce; + } + break; + case UP: + if (this.velY < 0) { + this.velY *= -bounce; + } + break; + case NORTH: + if (this.velZ > 0) { + this.velZ *= -bounce; + } + break; + case SOUTH: + if (this.velZ < 0) { + this.velZ *= -bounce; + } + break; + case WEST: + if (this.velX > 0) { + this.velX *= -bounce; + } + break; + case EAST: + if (this.velX < 0) { + this.velX *= -bounce; + } + break; + } + } + + if (this.canSmashBlocks) { + // demolish some blocks + AABB aabb = this.getBoundingBox().inflate(0.25D); + //I don't know why, and I can't find out why, but we have to subtract the coordinates by 0.5 here. + //Otherwise, it will sometimes not break blocks when hitting west, and always break too many when hitting east. + this.affectBlocksInAABB(aabb.move(result.getLocation().subtract(aabb.getCenter()).add(-0.5D, 0D, 0D))); + } + } + + // if we have smashed enough, add to ticks so that we go back faster + if (this.blocksSmashed > MAX_SMASH) { + this.isReturning = true; + if (this.tickCount < 60) { + this.tickCount += 60; + } + } + } + + private void affectBlocksInAABB(AABB box) { + if (this.getOwner() instanceof Player player) { + boolean creative = player.getAbilities().instabuild; + + for (BlockPos pos : WorldUtil.getAllInBB(box)) { + BlockState state = this.getLevel().getBlockState(pos); + Block block = state.getBlock(); + + if (!state.isAir() && this.stack.isCorrectToolForDrops(state) && block.canEntityDestroy(state, this.getLevel(), pos, this)) { + if (!MinecraftForge.EVENT_BUS.post(new BlockEvent.BreakEvent(this.getLevel(), pos, state, player))) { + if (ForgeEventFactory.doPlayerHarvestCheck(player, state, !state.requiresCorrectToolForDrops() || player.getItemInHand(this.getHand()).isCorrectToolForDrops(state))) { + this.getLevel().destroyBlock(pos, false); + if (!creative) block.playerDestroy(this.getLevel(), player, pos, state, this.getLevel().getBlockEntity(pos), player.getItemInHand(this.getHand())); + this.blocksSmashed++; + if (this.blocksSmashed > MAX_SMASH) { + break; + } + } + } + } + } + } + } + + @Override + public void tick() { + super.tick(); + + if (this.getLevel().isClientSide()) { + this.chain1.tick(); + this.chain2.tick(); + this.chain3.tick(); + this.chain4.tick(); + this.chain5.tick(); + + // set chain positions + if (this.getOwner() != null) { + // interpolate chain position + Vec3 handVec = this.getOwner().getLookAngle().yRot(getHand() == InteractionHand.MAIN_HAND ? -0.4F : 0.4F); + + double sx = this.getOwner().getX() + handVec.x(); + double sy = this.getOwner().getY() + handVec.y() - 0.4F + this.getOwner().getEyeHeight(); + double sz = this.getOwner().getZ() + handVec.z(); + + double ox = sx - this.getX(); + double oy = sy - this.getY() - 0.25F; + double oz = sz - this.getZ(); + + this.chain1.setPos(sx - ox * 0.05, sy - oy * 0.05, sz - oz * 0.05); + this.chain2.setPos(sx - ox * 0.25, sy - oy * 0.25, sz - oz * 0.25); + this.chain3.setPos(sx - ox * 0.45, sy - oy * 0.45, sz - oz * 0.45); + this.chain4.setPos(sx - ox * 0.65, sy - oy * 0.65, sz - oz * 0.65); + this.chain5.setPos(sx - ox * 0.85, sy - oy * 0.85, sz - oz * 0.85); + } + } else { + if (this.getOwner() == null) { + this.discard(); + } else { + double distToPlayer = this.distanceTo(this.getOwner()); + // return if far enough away + if (!this.isReturning && distToPlayer > MAX_CHAIN) { + this.isReturning = true; + } + + if (this.isReturning) { + // despawn if close enough + if (distToPlayer < 2F) { + if (this.getOwner() instanceof LivingEntity living && this.blocksSmashed > 0) { + this.stack.hurtAndBreak(Math.min(this.blocksSmashed, 3), living, user -> user.broadcastBreakEvent(this.getHand())); + } + this.discard(); + } + + LivingEntity returnTo = (LivingEntity) this.getOwner(); + + Vec3 back = new Vec3(returnTo.getX(), returnTo.getY() + returnTo.getEyeHeight(), returnTo.getZ()).subtract(this.position()).normalize(); + float age = Math.min(this.tickCount * 0.03F, 1.0F); + + // separate the return velocity from the normal bouncy velocity + this.setDeltaMovement(new Vec3( + this.velX * (1.0 - age) + (back.x() * 2F * age), + this.velY * (1.0 - age) + (back.y() * 2F * age) - this.getGravity(), + this.velZ * (1.0 - age) + (back.z() * 2F * age) + )); + } + } + } + } + + @Override + protected void defineSynchedData() { + this.entityData.define(HAND, true); + this.entityData.define(IS_FOIL, false); + } + + @Override + public void remove(RemovalReason reason) { + super.remove(reason); + LivingEntity thrower = (LivingEntity) this.getOwner(); + if (thrower != null && thrower.getUseItem().is(TFItems.BLOCK_AND_CHAIN.get())) { + thrower.stopUsingItem(); + } + } + + @Override + public void writeSpawnData(FriendlyByteBuf buffer) { + buffer.writeInt(this.getOwner() != null ? this.getOwner().getId() : -1); + buffer.writeBoolean(this.getHand() == InteractionHand.MAIN_HAND); + } + + @Override + public void readSpawnData(FriendlyByteBuf buf) { + Entity e = this.getLevel().getEntity(buf.readInt()); + if (e instanceof LivingEntity) { + this.setOwner(e); + } + this.setHand(buf.readBoolean() ? InteractionHand.MAIN_HAND : InteractionHand.OFF_HAND); + } +} diff --git a/src/main/java/twilightforest/entity/CharmEffect.java b/src/main/java/twilightforest/entity/CharmEffect.java new file mode 100644 index 0000000000..6368c1a455 --- /dev/null +++ b/src/main/java/twilightforest/entity/CharmEffect.java @@ -0,0 +1,148 @@ +package twilightforest.entity; + +import net.minecraft.core.particles.ItemParticleOption; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.syncher.EntityDataAccessor; +import net.minecraft.network.syncher.EntityDataSerializers; +import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.projectile.ItemSupplier; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.network.NetworkHooks; + +import javax.annotation.Nonnull; +import org.jetbrains.annotations.Nullable; + +@OnlyIn(value = Dist.CLIENT, _interface = ItemSupplier.class) +public class CharmEffect extends Entity implements ItemSupplier { + private static final EntityDataAccessor DATA_OWNER = SynchedEntityData.defineId(CharmEffect.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_ITEMID = SynchedEntityData.defineId(CharmEffect.class, EntityDataSerializers.ITEM_STACK); + private static final double DISTANCE = 0.75D; + private double interpTargetX; + private double interpTargetY; + private double interpTargetZ; + private double interpTargetYaw; + private double interpTargetPitch; + private int newPosRotationIncrements; + + public float offset; + + public CharmEffect(EntityType type, Level world) { + super(type, world); + } + + public CharmEffect(EntityType type, Level world, LivingEntity owner, Item item) { + this(type, world); + + this.setOwner(owner); + this.setItemID(item); + + this.moveTo(owner.getX(), owner.getY() + owner.getEyeHeight(), owner.getZ(), owner.getYRot(), owner.getXRot()); + + Vec3 look = new Vec3(DISTANCE, 0, 0); + double x = getX() + (look.x() * DISTANCE); + double z = getZ() + (look.z() * DISTANCE); + this.setPos(x, this.getY(), z); + } + + @Override + public void tick() { + this.xOld = this.getX(); + this.yOld = this.getY(); + this.zOld = this.getZ(); + super.tick(); + + //[VanillaCopy] Beginning of LivingEntity.livingTick + if (this.newPosRotationIncrements > 0) { + double d0 = this.getX() + (this.interpTargetX - this.getX()) / this.newPosRotationIncrements; + double d1 = this.getY() + (this.interpTargetY - this.getY()) / this.newPosRotationIncrements; + double d2 = this.getZ() + (this.interpTargetZ - this.getZ()) / this.newPosRotationIncrements; + double d3 = Mth.wrapDegrees(this.interpTargetYaw - this.getYRot()); + this.setYRot((float) (this.getYRot() + d3 / this.newPosRotationIncrements)); + this.setXRot((float) (this.getXRot() + (this.interpTargetPitch - this.getXRot()) / this.newPosRotationIncrements)); + --this.newPosRotationIncrements; + this.setPos(d0, d1, d2); + this.setRot(this.getYRot(), this.getXRot()); + } + + LivingEntity orbiting = this.getOwner(); + + if (orbiting != null) { + float rotation = this.tickCount / 10.0F + this.offset; + Vec3 look = new Vec3(DISTANCE, 0, 0).yRot(rotation); + this.moveTo(orbiting.getX() + look.x(), orbiting.getY() + orbiting.getEyeHeight(), orbiting.getZ() + look.z(), orbiting.getYRot(), orbiting.getXRot()); + } + + if (!this.getItemID().isEmpty()) { + double dx = getX() + 0.25 * (this.random.nextDouble() - this.random.nextDouble()); + double dy = getY() + 0.25 * (this.random.nextDouble() - this.random.nextDouble()); + double dz = getZ() + 0.25 * (this.random.nextDouble() - this.random.nextDouble()); + + this.getLevel().addParticle(new ItemParticleOption(ParticleTypes.ITEM, getItemID()), dx, dy, dz, 0, 0.2, 0); + } + + if (!this.getLevel().isClientSide() && (this.tickCount > 200 || (orbiting != null && !orbiting.isAlive()))) { + this.discard(); + } + } + + @Override + public void lerpTo(double x, double y, double z, float yaw, float pitch, int posRotationIncrements, boolean teleport) { + this.interpTargetX = x; + this.interpTargetY = y; + this.interpTargetZ = z; + this.interpTargetYaw = yaw; + this.interpTargetPitch = pitch; + this.newPosRotationIncrements = posRotationIncrements; + } + + @Override + protected void defineSynchedData() { + this.entityData.define(DATA_ITEMID, ItemStack.EMPTY); + this.entityData.define(DATA_OWNER, -1); + } + + public void setOwner(LivingEntity owner) { + this.entityData.set(DATA_OWNER, owner.getId()); + } + + @Nullable + public LivingEntity getOwner() { + Entity e = this.getLevel().getEntity(this.entityData.get(DATA_OWNER)); + if (e instanceof LivingEntity living) + return living; + else return null; + } + + public ItemStack getItemID() { + return this.entityData.get(DATA_ITEMID); + } + + public void setItemID(Item item) { + this.entityData.set(DATA_ITEMID, new ItemStack(item)); + } + + @Override + protected void readAdditionalSaveData(CompoundTag cmp) { + } + + @Override + protected void addAdditionalSaveData(CompoundTag cmp) { + } + + @Nonnull + @Override + public ItemStack getItem() { + return this.getItemID(); + } +} diff --git a/src/main/java/twilightforest/entity/CubeOfAnnihilation.java b/src/main/java/twilightforest/entity/CubeOfAnnihilation.java new file mode 100644 index 0000000000..24268c62a3 --- /dev/null +++ b/src/main/java/twilightforest/entity/CubeOfAnnihilation.java @@ -0,0 +1,204 @@ +package twilightforest.entity; + +import net.minecraft.core.BlockPos; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.game.ClientGamePacketListener; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.Mth; +import net.minecraft.util.RandomSource; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.entity.projectile.ThrowableProjectile; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.gameevent.GameEvent; +import net.minecraft.world.phys.*; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.event.level.BlockEvent; +import net.minecraftforge.network.NetworkHooks; +import twilightforest.data.tags.BlockTagGenerator; +import twilightforest.init.TFItems; +import twilightforest.init.TFParticleType; +import twilightforest.init.TFSounds; +import twilightforest.util.WorldUtil; + +public class CubeOfAnnihilation extends ThrowableProjectile { + + private boolean hasHitObstacle = false; + + public CubeOfAnnihilation(EntityType type, Level world) { + super(type, world); + } + + public CubeOfAnnihilation(EntityType type, Level world, LivingEntity thrower) { + super(type, thrower, world); + this.shootFromRotation(thrower, thrower.getXRot(), thrower.getYRot(), 0.0F, 1.5F, 1.0F); + } + + @Override + public boolean canChangeDimensions() { + return false; + } + + @Override + protected void defineSynchedData() { + } + + @Override + protected float getGravity() { + return 0F; + } + + @Override + protected void onHitEntity(EntityHitResult result) { + super.onHitEntity(result); + if (result.getEntity() instanceof LivingEntity && result.getEntity().hurt(this.getDamageSource(), 10)) { + this.tickCount += 60; + } + } + + @Override + protected void onHitBlock(BlockHitResult result) { + if (!this.level.isEmptyBlock(result.getBlockPos())) { + this.affectBlocksInAABB(this.getBoundingBox().inflate(0.2F, 0.2F, 0.2F)); + } + } + + @Override + protected void onHit(HitResult result) { + HitResult.Type hitresult$type = result.getType(); + if (hitresult$type == HitResult.Type.ENTITY) { + this.onHitEntity((EntityHitResult) result); + } else if (hitresult$type == HitResult.Type.BLOCK) { + this.onHitBlock((BlockHitResult) result); + } + } + + private DamageSource getDamageSource() { + LivingEntity thrower = (LivingEntity) this.getOwner(); + if (thrower instanceof Player) { + return this.damageSources().playerAttack((Player) thrower); + } else if (thrower != null) { + return this.damageSources().mobAttack(thrower); + } else { + return this.damageSources().thrown(this, null); + } + } + + private void affectBlocksInAABB(AABB box) { + for (BlockPos pos : WorldUtil.getAllInBB(box)) { + BlockState state = this.getLevel().getBlockState(pos); + if (!state.isAir()) { + if (this.getOwner() instanceof Player player) { + if (!MinecraftForge.EVENT_BUS.post(new BlockEvent.BreakEvent(this.getLevel(), pos, state, player))) { + if (this.canAnnihilate(pos, state)) { + this.getLevel().removeBlock(pos, false); + this.playSound(TFSounds.BLOCK_ANNIHILATED.get(), 0.125f, this.random.nextFloat() * 0.25F + 0.75F); + this.annihilateParticles(this.getLevel(), pos); + this.gameEvent(GameEvent.BLOCK_DESTROY); + } else { + this.hasHitObstacle = true; + } + } else { + this.hasHitObstacle = true; + } + } + } + } + } + + private boolean canAnnihilate(BlockPos pos, BlockState state) { + // whitelist many castle blocks + Block block = state.getBlock(); + return state.is(BlockTagGenerator.ANNIHILATION_INCLUSIONS) || block.getExplosionResistance() < 8F && state.getDestroySpeed(this.getLevel(), pos) >= 0; + } + + private void annihilateParticles(Level level, BlockPos pos) { + RandomSource rand = level.getRandom(); + if (level instanceof ServerLevel server) { + for (int dx = 0; dx < 3; dx++) { + for (int dy = 0; dy < 3; dy++) { + for (int dz = 0; dz < 3; dz++) { + + double x = pos.getX() + (dx + 0.5D) / 4; + double y = pos.getY() + (dy + 0.5D) / 4; + double z = pos.getZ() + (dz + 0.5D) / 4; + + double speed = rand.nextGaussian() * 0.2D; + + server.sendParticles(TFParticleType.ANNIHILATE.get(), x, y, z, 1, 0, 0, 0, speed); + } + } + } + } + } + + @Override + public void tick() { + super.tick(); + + if (!this.level.isClientSide) { + if (this.getOwner() == null) { + this.remove(RemovalReason.KILLED); + return; + } + + // always head towards either the point or towards the player + Vec3 destPoint = new Vec3(this.getOwner().getX(), this.getOwner().getY() + this.getOwner().getEyeHeight(), this.getOwner().getZ()); + + double distToPlayer = this.distanceTo(this.getOwner()); + + if (this.isReturning()) { + // if we are returning, and are near enough to the player, then we are done + if (distToPlayer < 2.0F) { + this.remove(RemovalReason.KILLED); + } + } else { + destPoint = destPoint.add(this.getOwner().getLookAngle().scale(16F)); + } + + // set motions + Vec3 velocity = new Vec3(this.getX() - destPoint.x(), (this.getY() + this.getBbHeight() / 2F) - destPoint.y(), this.getZ() - destPoint.z()); + + this.setDeltaMovement(-velocity.x(), -velocity.y(), -velocity.z()); + + // normalize speed + float currentSpeed = Mth.sqrt((float) (this.getDeltaMovement().x() * this.getDeltaMovement().x() + this.getDeltaMovement().y() * this.getDeltaMovement().y() + this.getDeltaMovement().z() * this.getDeltaMovement().z())); + + float maxSpeed = 0.5F; + + if (currentSpeed > maxSpeed) { + this.setDeltaMovement(new Vec3( + this.getDeltaMovement().x() / (currentSpeed / maxSpeed), + this.getDeltaMovement().y() / (currentSpeed / maxSpeed), + this.getDeltaMovement().z() / (currentSpeed / maxSpeed))); + } else { + float slow = 0.5F; + this.getDeltaMovement().multiply(slow, slow, slow); + } + + // demolish some blocks + this.affectBlocksInAABB(this.getBoundingBox().inflate(0.2F)); + } + } + + @Override + public void remove(RemovalReason reason) { + super.remove(reason); + LivingEntity thrower = (LivingEntity) this.getOwner(); + if (thrower != null && thrower.getUseItem().is(TFItems.CUBE_OF_ANNIHILATION.get())) { + thrower.stopUsingItem(); + } + } + + private boolean isReturning() { + if (this.hasHitObstacle || this.getOwner() == null || !(this.getOwner() instanceof Player player)) { + return true; + } else { + return !player.isUsingItem(); + } + } +} diff --git a/src/main/java/twilightforest/entity/EnforcedHomePoint.java b/src/main/java/twilightforest/entity/EnforcedHomePoint.java new file mode 100644 index 0000000000..1d2c7ab5c2 --- /dev/null +++ b/src/main/java/twilightforest/entity/EnforcedHomePoint.java @@ -0,0 +1,47 @@ +package twilightforest.entity; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.DoubleTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.world.entity.PathfinderMob; +import net.minecraft.world.entity.ai.goal.GoalSelector; +import net.minecraft.world.entity.ai.goal.MoveTowardsRestrictionGoal; + +public interface EnforcedHomePoint { + + default void addRestrictionGoals(PathfinderMob entity, GoalSelector selector) { + selector.addGoal(5, new MoveTowardsRestrictionGoal(entity, 1.25D)); + } + + default void saveHomePointToNbt(CompoundTag tag) { + if (this.getRestrictionCenter() != BlockPos.ZERO) { + BlockPos home = this.getRestrictionCenter(); + tag.put("Home", this.makeDoubleList(home.getX(), home.getY(), home.getZ())); + } + } + + default void loadHomePointFromNbt(CompoundTag tag, int radius) { + if (tag.contains("Home", 9)) { + ListTag nbttaglist = tag.getList("Home", 6); + int hx = (int) nbttaglist.getDouble(0); + int hy = (int) nbttaglist.getDouble(1); + int hz = (int) nbttaglist.getDouble(2); + this.setRestriction(new BlockPos(hx, hy, hz), radius); + } + } + + default ListTag makeDoubleList(double... pNumbers) { + ListTag listtag = new ListTag(); + + for(double d0 : pNumbers) { + listtag.add(DoubleTag.valueOf(d0)); + } + + return listtag; + } + + BlockPos getRestrictionCenter(); + + void setRestriction(BlockPos pos, int dist); +} diff --git a/src/main/java/twilightforest/entity/EntityIceArrow.java b/src/main/java/twilightforest/entity/EntityIceArrow.java deleted file mode 100644 index 2a52f652ac..0000000000 --- a/src/main/java/twilightforest/entity/EntityIceArrow.java +++ /dev/null @@ -1,23 +0,0 @@ -package twilightforest.entity; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.projectile.EntityArrow; -import net.minecraft.world.World; - -public class EntityIceArrow extends EntityArrow { - - public EntityIceArrow(World par1World) { - super(par1World); - } - - public EntityIceArrow(World world, EntityPlayer player, float velocity) { - super(world, player, velocity); - } - - /** - * Called to update the entity's position/logic. - */ - public void onUpdate() { - super.onUpdate(); - } -} diff --git a/src/main/java/twilightforest/entity/EntitySeekerArrow.java b/src/main/java/twilightforest/entity/EntitySeekerArrow.java deleted file mode 100644 index 3f3432942d..0000000000 --- a/src/main/java/twilightforest/entity/EntitySeekerArrow.java +++ /dev/null @@ -1,152 +0,0 @@ -package twilightforest.entity; - -import java.util.List; - -import net.minecraft.command.IEntitySelector; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.projectile.EntityArrow; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.MathHelper; -import net.minecraft.util.Vec3; -import net.minecraft.world.World; - -public class EntitySeekerArrow extends EntityArrow { - - private EntityLivingBase homingTarget; - double seekDistance = 5.0; - - - public EntitySeekerArrow(World par1World) { - super(par1World); - } - - public EntitySeekerArrow(World world, EntityPlayer player, float velocity) { - super(world, player, velocity); - } - - /** - * Called to update the entity's position/logic. - */ - @SuppressWarnings("rawtypes") - public void onUpdate() - { - // seek! - if (isThisArrowFlying()) { - - if (this.homingTarget == null) { - // find new target - - // target BB - double minX = this.lastTickPosX; - double minY = this.lastTickPosY; - double minZ = this.lastTickPosZ; - double maxX = this.lastTickPosX; - double maxY = this.lastTickPosY; - double maxZ = this.lastTickPosZ; - - - AxisAlignedBB targetBB = AxisAlignedBB.getBoundingBox(minX, minY, minZ, maxX, maxY, maxZ); - - // add two possible courses to our selection box - Vec3 courseVec = Vec3.createVectorHelper(this.motionX * seekDistance, this.motionY * seekDistance, this.motionZ * seekDistance); - courseVec.rotateAroundY((float) (Math.PI / 6F)); - targetBB = targetBB.addCoord(courseVec.xCoord, courseVec.yCoord, courseVec.zCoord); - - courseVec = Vec3.createVectorHelper(this.motionX * seekDistance, this.motionY * seekDistance, this.motionZ * seekDistance); - courseVec.rotateAroundY(-(float) (Math.PI / 6F)); - targetBB = targetBB.addCoord(courseVec.xCoord, courseVec.yCoord, courseVec.zCoord); - - targetBB.minY -= 3; - targetBB.maxY += 3; - - // find targets in box - List targets = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, targetBB, IEntitySelector.selectAnything); - - double closestDot = 1; - - for (Object thing : targets) { - if (thing instanceof EntityLivingBase && !(thing instanceof EntityPlayer)) { - EntityLivingBase living = (EntityLivingBase)thing; - - System.out.println("Possible target : " + living); - //System.out.println("Selection box = " + targetBB); - - courseVec = Vec3.createVectorHelper(this.motionX, this.motionY, this.motionZ); - courseVec = courseVec.normalize(); - Vec3 targetVec = Vec3.createVectorHelper(this.posX - living.posX, this.posY - (living.posY + (double)living.getEyeHeight()), this.posZ - living.posZ); - - //double d0 = targetVec.lengthVector(); // do we need this? - targetVec = targetVec.normalize(); - double dot = courseVec.dotProduct(targetVec); - - //System.out.println("dot product : " + dot); - - if (dot < closestDot) { - this.homingTarget = living; - closestDot = dot; - } - } - } - if (targets.size() > 0) { - //System.out.println("--- End of list"); - //System.out.println("We have chosen " + this.homingTarget + " as the target"); - } - } else { - // find ideal heading - Vec3 targetVec = Vec3.createVectorHelper(this.posX - this.homingTarget.posX, this.posY - (this.homingTarget.posY + this.homingTarget.getEyeHeight()), this.posZ - this.homingTarget.posZ); - targetVec = targetVec.normalize(); - - Vec3 courseVec = Vec3.createVectorHelper(this.motionX * seekDistance, this.motionY * seekDistance, this.motionZ * seekDistance); - courseVec = courseVec.normalize(); - - double dotProduct = courseVec.dotProduct(targetVec); - //System.out.println("target vec compared to course vec= " + dotProduct); - - if (dotProduct < 0) { - - // match current speed - float currentSpeed = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionY * this.motionY + this.motionZ * this.motionZ); - - currentSpeed *= 1.0; - - targetVec.xCoord *= currentSpeed; - targetVec.yCoord *= currentSpeed; - targetVec.zCoord *= currentSpeed; - - // adjust current heading - double dx = MathHelper.clamp_double(targetVec.xCoord, -2.0, 2.0); - double dy = MathHelper.clamp_double(targetVec.yCoord, -1.0, 1.0); - double dz = MathHelper.clamp_double(targetVec.zCoord, -2.0, 2.0); - - // System.out.println("Current heading is " + this.motionX + ", " + this.motionY + ", " + this.motionZ); - // System.out.println("Ideal heading is " + targetVec.xCoord + ", " + targetVec.yCoord + ", " + targetVec.zCoord); - // System.out.println("Adjustment is " + dx + ", " + dy + ", " + dz); - - this.motionX -= dx; - this.motionY -= dy; - this.motionZ -= dz; - } else { - // abandon target, they're behind us! - //System.out.println("abandoning target!"); - - this.homingTarget = null; - } - } - - this.motionY += 0.045F; - - } - - // this is a slower arrow, adjust for gravity slightly - - super.onUpdate(); - - - } - - private boolean isThisArrowFlying() { - return MathHelper.sqrt_double(this.motionX * this.motionX + this.motionY * this.motionY + this.motionZ * this.motionZ) > 1.0; - } - -} diff --git a/src/main/java/twilightforest/entity/EntityTFAdherent.java b/src/main/java/twilightforest/entity/EntityTFAdherent.java deleted file mode 100644 index 38d89a4588..0000000000 --- a/src/main/java/twilightforest/entity/EntityTFAdherent.java +++ /dev/null @@ -1,125 +0,0 @@ -package twilightforest.entity; - -import twilightforest.TFAchievementPage; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.IRangedAttackMob; -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.ai.EntityAIArrowAttack; -import net.minecraft.entity.ai.EntityAIFleeSun; -import net.minecraft.entity.ai.EntityAIHurtByTarget; -import net.minecraft.entity.ai.EntityAILookIdle; -import net.minecraft.entity.ai.EntityAINearestAttackableTarget; -import net.minecraft.entity.ai.EntityAIRestrictSun; -import net.minecraft.entity.ai.EntityAISwimming; -import net.minecraft.entity.ai.EntityAIWander; -import net.minecraft.entity.ai.EntityAIWatchClosest; -import net.minecraft.entity.monster.EntityMob; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Items; -import net.minecraft.item.ItemStack; -import net.minecraft.util.DamageSource; -import net.minecraft.util.MathHelper; -import net.minecraft.world.World; - - -public class EntityTFAdherent extends EntityMob implements IRangedAttackMob, ITFCharger { - - private static final int CHARGE_FLAG = 17; - - public EntityTFAdherent(World world) { - super(world); - - this.tasks.addTask(1, new EntityAISwimming(this)); - this.tasks.addTask(2, new EntityAIRestrictSun(this)); - this.tasks.addTask(3, new EntityAIFleeSun(this, 1.0D)); - this.tasks.addTask(4, new EntityAIArrowAttack(this, 1.0D, 60, 10.0F)); - this.tasks.addTask(5, new EntityAIWander(this, 1.0D)); - this.tasks.addTask(6, new EntityAIWatchClosest(this, EntityPlayer.class, 8.0F)); - this.tasks.addTask(6, new EntityAILookIdle(this)); - this.targetTasks.addTask(1, new EntityAIHurtByTarget(this, false)); - this.targetTasks.addTask(2, new EntityAINearestAttackableTarget(this, EntityPlayer.class, 0, true)); - - this.setSize(0.8F, 2.2F); - } - - @Override - protected void entityInit() - { - super.entityInit(); - dataWatcher.addObject(CHARGE_FLAG, Byte.valueOf((byte)0)); - } - - /** - * Returns true if the newer Entity AI code should be run - */ - @Override - public boolean isAIEnabled() - { - return true; - } - - /** - * Set monster attributes - */ - @Override - protected void applyEntityAttributes() - { - super.applyEntityAttributes(); - this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(20.0D); // max health - this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.25D); // movement speed - } - - - /** - * Trigger achievement when killed - */ - @Override - public void onDeath(DamageSource par1DamageSource) { - super.onDeath(par1DamageSource); - if (par1DamageSource.getSourceOfDamage() instanceof EntityPlayer) { - ((EntityPlayer)par1DamageSource.getSourceOfDamage()).triggerAchievement(TFAchievementPage.twilightHunter); - } - } - - /** - * Attack the specified entity using a ranged attack. - */ - @Override - public void attackEntityWithRangedAttack(EntityLivingBase attackTarget, float extraDamage) { - EntityTFNatureBolt natureBolt = new EntityTFNatureBolt(this.worldObj, this); - this.worldObj.playSoundAtEntity(this, "mob.ghast.fireball", 1.0F, 1.0F / (rand.nextFloat() * 0.4F + 0.8F)); - - natureBolt.setTarget(attackTarget); - - double tx = attackTarget.posX - this.posX; - double ty = attackTarget.posY + attackTarget.getEyeHeight() - 2.699999988079071D - this.posY; - double tz = attackTarget.posZ - this.posZ; - float heightOffset = MathHelper.sqrt_double(tx * tx + tz * tz) * 0.2F; - natureBolt.setThrowableHeading(tx, ty + heightOffset, tz, 0.6F, 6.0F); // 0.6 speed, 6.0 inaccuracy - this.worldObj.spawnEntityInWorld(natureBolt); - - } - - /** - * In this case we're not charging like a bull, but charging up a ranged attack - * @return - */ - public boolean isCharging() - { - return dataWatcher.getWatchableObjectByte(CHARGE_FLAG) != 0; - } - - public void setCharging(boolean flag) - { - if (flag) - { - dataWatcher.updateObject(CHARGE_FLAG, Byte.valueOf((byte)127)); - } - else - { - dataWatcher.updateObject(CHARGE_FLAG, Byte.valueOf((byte)0)); - } - } - - -} diff --git a/src/main/java/twilightforest/entity/EntityTFArmoredGiant.java b/src/main/java/twilightforest/entity/EntityTFArmoredGiant.java deleted file mode 100644 index 80d3431caf..0000000000 --- a/src/main/java/twilightforest/entity/EntityTFArmoredGiant.java +++ /dev/null @@ -1,26 +0,0 @@ -package twilightforest.entity; - -import twilightforest.item.TFItems; -import net.minecraft.init.Items; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; - -public class EntityTFArmoredGiant extends EntityTFGiantMiner { - - public EntityTFArmoredGiant(World par1World) { - super(par1World); - - this.setCurrentItemOrArmor(0, new ItemStack(Items.stone_sword)); - this.setCurrentItemOrArmor(1, new ItemStack(Items.iron_helmet)); - this.setCurrentItemOrArmor(2, new ItemStack(Items.iron_chestplate)); - this.setCurrentItemOrArmor(3, new ItemStack(Items.iron_leggings)); - this.setCurrentItemOrArmor(4, new ItemStack(Items.iron_boots)); - - } - - protected Item getDropItem() - { - return TFItems.giantSword; - } -} diff --git a/src/main/java/twilightforest/entity/EntityTFBlockGoblin.java b/src/main/java/twilightforest/entity/EntityTFBlockGoblin.java deleted file mode 100644 index 468d133c99..0000000000 --- a/src/main/java/twilightforest/entity/EntityTFBlockGoblin.java +++ /dev/null @@ -1,379 +0,0 @@ -package twilightforest.entity; - -import java.util.List; - -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.IEntityMultiPart; -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.ai.EntityAIAttackOnCollide; -import net.minecraft.entity.ai.EntityAIAvoidEntity; -import net.minecraft.entity.ai.EntityAIHurtByTarget; -import net.minecraft.entity.ai.EntityAILookIdle; -import net.minecraft.entity.ai.EntityAINearestAttackableTarget; -import net.minecraft.entity.ai.EntityAISwimming; -import net.minecraft.entity.ai.EntityAIWander; -import net.minecraft.entity.ai.EntityAIWatchClosest; -import net.minecraft.entity.boss.EntityDragonPart; -import net.minecraft.entity.item.EntityTNTPrimed; -import net.minecraft.entity.monster.EntityMob; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.Item; -import net.minecraft.util.DamageSource; -import net.minecraft.util.Vec3; -import net.minecraft.world.World; -import twilightforest.TFAchievementPage; -import twilightforest.TwilightForestMod; -import twilightforest.item.TFItems; - - -public class EntityTFBlockGoblin extends EntityMob implements IEntityMultiPart { - - - - private static final float CHAIN_SPEED = 16F; - private static final int DATA_CHAINLENGTH = 17; - private static final int DATA_CHAINPOS = 18; - - int recoilCounter; - float chainAngle; - - public EntityTFSpikeBlock block; - public EntityTFGoblinChain chain1; - public EntityTFGoblinChain chain2; - public EntityTFGoblinChain chain3; - - public Entity[] partsArray; - - - public EntityTFBlockGoblin(World world) - { - super(world); - //texture = TwilightForestMod.MODEL_DIR + "blockgoblin.png"; - //moveSpeed = 0.28F; - setSize(0.9F, 1.4F); - - this.tasks.addTask(0, new EntityAISwimming(this)); - this.tasks.addTask(1, new EntityAIAvoidEntity(this, EntityTNTPrimed.class, 2.0F, 0.8F, 1.5F)); - this.tasks.addTask(5, new EntityAIAttackOnCollide(this, EntityPlayer.class, 1.0F, false)); - this.tasks.addTask(6, new EntityAIWander(this, 1.0F)); - this.tasks.addTask(7, new EntityAIWatchClosest(this, EntityPlayer.class, 8.0F)); - this.tasks.addTask(7, new EntityAILookIdle(this)); - this.targetTasks.addTask(1, new EntityAIHurtByTarget(this, false)); - this.targetTasks.addTask(2, new EntityAINearestAttackableTarget(this, EntityPlayer.class, 0, true)); - - this.recoilCounter = 0; - - this.partsArray = (new Entity[] - { - block = new EntityTFSpikeBlock(this), chain1 = new EntityTFGoblinChain(this), chain2 = new EntityTFGoblinChain(this), chain3 = new EntityTFGoblinChain(this) - }); - - } - - - @Override - protected void entityInit() - { - super.entityInit(); - this.dataWatcher.addObject(DATA_CHAINLENGTH, Byte.valueOf((byte) 0)); - this.dataWatcher.addObject(DATA_CHAINPOS, Byte.valueOf((byte) 0)); - } - - /** - * Returns true if the newer Entity AI code should be run - */ - @Override - protected boolean isAIEnabled() - { - return true; - } - - /** - * Set monster attributes - */ - @Override - protected void applyEntityAttributes() - { - super.applyEntityAttributes(); - this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(20.0D); // max health - this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.28D); // movement speed - this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(8.0D); // attack damage - } - - - @Override - protected String getLivingSound() - { - return TwilightForestMod.ID + ":mob.redcap.redcap"; - } - - @Override - protected String getHurtSound() - { - return TwilightForestMod.ID + ":mob.redcap.hurt"; - } - - @Override - protected String getDeathSound() - { - return TwilightForestMod.ID + ":mob.redcap.die"; - } - - /** - * Returns the item ID for the item the mob drops on death. - */ - protected Item getDropItemId() - { - return TFItems.armorShard; - } - - - /** - * Trigger achievement when killed - */ - @Override - public void onDeath(DamageSource par1DamageSource) { - super.onDeath(par1DamageSource); - if (par1DamageSource.getSourceOfDamage() instanceof EntityPlayer) { - ((EntityPlayer)par1DamageSource.getSourceOfDamage()).triggerAchievement(TFAchievementPage.twilightHunter); - } - } - - /** - * How high is the chain - */ - public double getChainYOffset() - { - return 1.5 - this.getChainLength() / 4.0; - } - - /** - * Get the block & chain position - */ - public Vec3 getChainPosition() - { - return this.getChainPosition(getChainAngle(), getChainLength()); - } - - /** - * Get the block & chain position - */ - public Vec3 getChainPosition(float angle, float distance) - { - double var1 = Math.cos((angle) * Math.PI / 180.0D) * distance; - double var3 = Math.sin((angle) * Math.PI / 180.0D) * distance; - - return Vec3.createVectorHelper(this.posX + var1, this.posY + this.getChainYOffset(), this.posZ + var3); - } - - public boolean isSwingingChain() - { - return this.isSwingInProgress || (this.getAttackTarget() != null && this.recoilCounter == 0); - } - - /** - * Do not deal damage by colliding with the goblin - */ - @Override - public boolean attackEntityAsMob(Entity par1Entity) { - - this.swingItem(); - - - return false; - - - //return super.attackEntityAsMob(par1Entity); - } - - /** - * Keep block position updated - */ - @Override - public void onUpdate() { - - super.onUpdate(); - block.onUpdate(); - chain1.onUpdate(); - chain2.onUpdate(); - chain3.onUpdate(); - - if (recoilCounter > 0) - { - recoilCounter--; - } - - - chainAngle += CHAIN_SPEED; - chainAngle %= 360; - - if (!this.worldObj.isRemote) - { - this.dataWatcher.updateObject(DATA_CHAINLENGTH, Byte.valueOf((byte) Math.floor(getChainLength() * 127F))); - this.dataWatcher.updateObject(DATA_CHAINPOS, Byte.valueOf((byte) Math.floor(getChainAngle() / 360F * 255F))); - } - else - { - // synch chain pos if it's wrong - if (Math.abs(this.chainAngle - this.getChainAngle()) > CHAIN_SPEED * 2) - { - //FMLLog.info("Fixing chain pos on client"); - this.chainAngle = getChainAngle(); - } - } - - // set block position - Vec3 blockPos = this.getChainPosition(); - this.block.setPosition(blockPos.xCoord, blockPos.yCoord, blockPos.zCoord); - this.block.rotationYaw = getChainAngle(); - - // interpolate chain position - double sx = this.posX; - double sy = this.posY + this.height - 0.1; - double sz = this.posZ; - - double ox = sx - blockPos.xCoord; - double oy = sy - blockPos.yCoord - (block.height / 3D); - double oz = sz - blockPos.zCoord; - - this.chain1.setPosition(sx - ox * 0.4, sy - oy * 0.4, sz - oz * 0.4); - this.chain2.setPosition(sx - ox * 0.5, sy - oy * 0.5, sz - oz * 0.5); - this.chain3.setPosition(sx - ox * 0.6, sy - oy * 0.6, sz - oz * 0.6); - - // collide things with the block - if (!worldObj.isRemote && this.isSwingingChain()) - { - this.applyBlockCollisions(this.block); - } - - } - - /** - * Check if the block is colliding with any nearby entities - */ - @SuppressWarnings("unchecked") - protected void applyBlockCollisions(Entity collider) - { - List list = this.worldObj.getEntitiesWithinAABBExcludingEntity(collider, collider.boundingBox.expand(0.20000000298023224D, 0.0D, 0.20000000298023224D)); - - if (list != null && !list.isEmpty()) - { - for (int i = 0; i < list.size(); ++i) - { - Entity entity = (Entity)list.get(i); - - if (entity.canBePushed()) - { - applyBlockCollision(collider, entity); - } - } - } - } - - /** - * Do the effect where the block hits something - */ - protected void applyBlockCollision(Entity collider, Entity collided) - { - if (collided != this) - { - collided.applyEntityCollision(collider); - if (collided instanceof EntityLivingBase) - { - //FMLLog.info("Spike ball collided with entity %s", collided); - - // do hit and throw - boolean attackSuccess = super.attackEntityAsMob(collided); - - if (attackSuccess) - { - collided.motionY += 0.4000000059604645D; - this.playSound("mob.irongolem.throw", 1.0F, 1.0F); - - //System.out.println("Spike ball attack success"); - - this.recoilCounter = 40; - } - - } - } - } - - /** - * Angle between 0 and 360 to place the chain at - */ - public float getChainAngle() - { - if (!this.worldObj.isRemote) - { - return this.chainAngle; - } - else - { - return (this.dataWatcher.getWatchableObjectByte(DATA_CHAINPOS) & 0xFF) / 255F * 360F; - } - } - - /** - * Between 0.0F and 2.0F, how long is the chain right now? - */ - public float getChainLength() - { - if (!this.worldObj.isRemote) - { - if (isSwingingChain()) - { - return 0.9F; - } - else - { - return 0.3F; - } - } - else - { - return (this.dataWatcher.getWatchableObjectByte(DATA_CHAINLENGTH) & 0xFF) / 127F; - } - } - - @Override - public World func_82194_d() { - return this.worldObj; - } - - @Override - public boolean attackEntityFromPart(EntityDragonPart entitydragonpart, DamageSource damagesource, float i) { - return false; - } - - - /** - * We need to do this for the bounding boxes on the parts to become active - */ - @Override - public Entity[] getParts() - { - return partsArray; - } - - /** - * Returns the current armor value as determined by a call to InventoryPlayer.getTotalArmorValue - */ - public int getTotalArmorValue() - { - int i = super.getTotalArmorValue() + 11; - - if (i > 20) - { - i = 20; - } - - return i; - } - - - - - -} diff --git a/src/main/java/twilightforest/entity/EntityTFBoggard.java b/src/main/java/twilightforest/entity/EntityTFBoggard.java deleted file mode 100644 index 3df2edb9a8..0000000000 --- a/src/main/java/twilightforest/entity/EntityTFBoggard.java +++ /dev/null @@ -1,220 +0,0 @@ -package twilightforest.entity; - -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.ai.EntityAIAttackOnCollide; -import net.minecraft.entity.ai.EntityAIHurtByTarget; -import net.minecraft.entity.ai.EntityAILookIdle; -import net.minecraft.entity.ai.EntityAINearestAttackableTarget; -import net.minecraft.entity.ai.EntityAISwimming; -import net.minecraft.entity.ai.EntityAIWander; -import net.minecraft.entity.ai.EntityAIWatchClosest; -import net.minecraft.entity.monster.EntityMob; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Items; -import net.minecraft.item.Item; -import net.minecraft.util.DamageSource; -import net.minecraft.util.MathHelper; -import net.minecraft.world.World; -import twilightforest.TFAchievementPage; -import twilightforest.TFFeature; -import twilightforest.TwilightForestMod; -import twilightforest.entity.ai.EntityAITFChargeAttack; -import twilightforest.item.TFItems; - - -public class EntityTFBoggard extends EntityMob { - - - private boolean shy; - - public EntityTFBoggard(World world) - { - super(world); - //texture = "/mob/pigzombie.png"; - //moveSpeed = 0.28F; - setSize(0.8F, 1.1F); - //attackStrength = 3; - - shy = true; - - this.tasks.addTask(0, new EntityAISwimming(this)); -// this.tasks.addTask(1, new EntityAITFRedcapShy(this, this.moveSpeed)); - this.tasks.addTask(2, new EntityAITFChargeAttack(this, 2.0F)); - this.tasks.addTask(3, new EntityAIAttackOnCollide(this, EntityPlayer.class, 1.0F, false)); - this.tasks.addTask(6, new EntityAIWander(this, 1.0F)); - this.tasks.addTask(7, new EntityAIWatchClosest(this, EntityPlayer.class, 8.0F)); - this.tasks.addTask(7, new EntityAILookIdle(this)); - this.targetTasks.addTask(1, new EntityAIHurtByTarget(this, false)); - this.targetTasks.addTask(2, new EntityAINearestAttackableTarget(this, EntityPlayer.class, 0, false)); - - } - - public EntityTFBoggard(World world, double x, double y, double z) - { - this(world); - this.setPosition(x, y, z); - } - - /** - * Returns true if the newer Entity AI code should be run - */ - @Override - protected boolean isAIEnabled() - { - return true; - } - - - /** - * Set monster attributes - */ - @Override - protected void applyEntityAttributes() - { - super.applyEntityAttributes(); - this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(14.0D); // max health - this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.28D); // movement speed - this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(3.0D); // attack damage - } - - @Override - protected String getLivingSound() - { - return TwilightForestMod.ID + ":mob.redcap.redcap"; - } - - @Override - protected String getHurtSound() - { - return TwilightForestMod.ID + ":mob.redcap.redcaphurt"; - } - - @Override - protected String getDeathSound() - { - return TwilightForestMod.ID + ":mob.redcap.redcapdie"; - } - - @Override - protected Item getDropItem() - { - return Items.iron_boots; - } - - @Override - protected void dropFewItems(boolean flag, int i) - { - if (rand.nextInt(5) == 0) - { - this.dropItem(TFItems.mazeMapFocus, 1 + i); - } - if (rand.nextInt(6) == 0) - { - this.dropItem(Items.iron_boots, 1 + i); - } - if (rand.nextInt(9) == 0) - { - this.dropItem(Items.iron_pickaxe, 1 + i); - } - } - - /** - * The redcap is hesitant, and when he is getting close to the player, he may suddenly veer off to the side - * - * This is our old AI, no longer used - * - protected void updateEntityActionState() - { - super.updateEntityActionState(); - - if (entityToAttack != null) { - float enemyDist = entityToAttack.getDistanceToEntity(this); - - // speed up when very close to enemy or feeling bold - if (enemyDist < 4 || !shy) { - moveSpeed = 0.8F; - } else { - moveSpeed = 0.5F; - } - - // avoid frontal assault - if (enemyDist > 4 && enemyDist < 6 && shy) { - - if (isTargetLookingAtMe()) { - // strafe to the side - moveStrafing = lefty ? moveForward : -moveForward; - moveForward = 0; - } - } - } - - } - */ - - public boolean isShy() { - return shy && this.recentlyHit <= 0; - } - - /** - * Fairly straightforward. Returns true in a 120 degree arc in front of the player's view. - * @return - */ - public boolean isTargetLookingAtMe() { - // find angle of approach - double dx = posX - entityToAttack.posX; - double dz = posZ - entityToAttack.posZ; - float angle = (float)((Math.atan2(dz, dx) * 180D) / 3.1415927410125732D) - 90F; - - float difference = MathHelper.abs((entityToAttack.rotationYaw - angle) % 360); - -// System.out.println("Difference in angle of approach is " + difference); - - return difference < 60 || difference > 300; - } - - - -// @Override -// public boolean attackEntityFrom(Entity entity, int i) { -// -// if (entityToAttack != null && entityToAttack == entity) { -// shy = false; -// // possibly notify others? -// } -// -// return super.attackEntityFrom(entity, i); -// } - - /** - * Trigger achievement when killed - */ - @Override - public void onDeath(DamageSource par1DamageSource) { - super.onDeath(par1DamageSource); - if (par1DamageSource.getSourceOfDamage() instanceof EntityPlayer) { - ((EntityPlayer)par1DamageSource.getSourceOfDamage()).triggerAchievement(TFAchievementPage.twilightHunter); - // are we in a level 1 hill? - int chunkX = MathHelper.floor_double(posX) >> 4; - int chunkZ = MathHelper.floor_double(posZ) >> 4; - if (TFFeature.getNearestFeature(chunkX, chunkZ, worldObj) == TFFeature.hill1) { - // award level 1 hill cheevo - ((EntityPlayer)par1DamageSource.getSourceOfDamage()).triggerAchievement(TFAchievementPage.twilightHill1); - } - - } - } - - @Override - public void moveEntityWithHeading(float par1, float par2) { - super.moveEntityWithHeading(par1, par2); - -// System.out.println("prevLegYaw = " + this.prevLimbYaw); -// System.out.println("legYaw = " + this.limbYaw); - - } - - - - - -} diff --git a/src/main/java/twilightforest/entity/EntityTFChainBlock.java b/src/main/java/twilightforest/entity/EntityTFChainBlock.java deleted file mode 100644 index 869227c301..0000000000 --- a/src/main/java/twilightforest/entity/EntityTFChainBlock.java +++ /dev/null @@ -1,351 +0,0 @@ -package twilightforest.entity; - -import java.util.List; - -import twilightforest.item.ItemTFChainBlock; -import twilightforest.item.TFItems; -import net.minecraft.block.Block; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.IEntityMultiPart; -import net.minecraft.entity.boss.EntityDragonPart; -import net.minecraft.entity.item.EntityMinecart; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.projectile.EntityThrowable; -import net.minecraft.init.Blocks; -import net.minecraft.init.Items; -import net.minecraft.item.Item; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.DamageSource; -import net.minecraft.util.MathHelper; -import net.minecraft.util.MovingObjectPosition; -import net.minecraft.util.Vec3; -import net.minecraft.world.World; - - -public class EntityTFChainBlock extends EntityThrowable implements IEntityMultiPart { - - private static final int MAX_SMASH = 12; - private static final int MAX_CHAIN = 16; - private boolean isReturning = false; - private int blocksSmashed = 0; - - // where are we headed? - private double velX; - private double velY; - private double velZ; - - - // for the client to show the chain - private boolean isAttached; - private EntityLivingBase attachedTo; - - public EntityTFGoblinChain chain1; - public EntityTFGoblinChain chain2; - public EntityTFGoblinChain chain3; - public EntityTFGoblinChain chain4; - public EntityTFGoblinChain chain5; - public Entity[] partsArray; - - public EntityTFChainBlock(World par1World) { - super(par1World); - - this.setSize(0.6F, 0.6F); - - - this.partsArray = (new Entity[] - { - chain1 = new EntityTFGoblinChain(this), chain2 = new EntityTFGoblinChain(this), chain3 = new EntityTFGoblinChain(this), chain4 = new EntityTFGoblinChain(this), chain5 = new EntityTFGoblinChain(this) - }); - } - - - public EntityTFChainBlock(World par1World, double par2, double par4, double par6) { - super(par1World, par2, par4, par6); - // TODO Auto-generated constructor stub - } - - - public EntityTFChainBlock(World par1World, EntityLivingBase par2EntityLiving) { - super(par1World, par2EntityLiving); - - this.setSize(0.6F, 0.6F); - - this.isReturning = false; - } - - /** - * Similar to setArrowHeading, it's point the throwable entity to a x, y, z direction. - */ - public void setThrowableHeading(double x, double y, double z, float speed, float accuracy) - { - super.setThrowableHeading(x, y, z, speed, accuracy); - - // save velocity - this.velX = this.motionX; - this.velY = this.motionY; - this.velZ = this.motionZ; - } - - /** - * How much this entity falls each tick - */ - @Override - protected float getGravityVelocity() - { - return 0.05F; - } - - - - @Override - protected void onImpact(MovingObjectPosition mop) { - // only hit living things - if (mop.entityHit != null && mop.entityHit instanceof EntityLivingBase && mop.entityHit != this.getThrower()) { - if (mop.entityHit.attackEntityFrom(DamageSource.causePlayerDamage((EntityPlayer) this.getThrower()), 10)) { - // age when we hit a monster so that we go back to the player faster - this.ticksExisted += 60; - } - } - - if (!this.worldObj.isAirBlock(mop.blockX, mop.blockY, mop.blockZ)) { - - // clang! - if (!this.isReturning) { - this.worldObj.playSoundAtEntity(this, "random.anvil_land", 0.125f, this.rand.nextFloat()); - } - - if (!this.worldObj.isRemote && this.blocksSmashed < MAX_SMASH) { - if (this.worldObj.getBlock(mop.blockX, mop.blockY, mop.blockZ).getBlockHardness(worldObj, mop.blockX, mop.blockY, mop.blockZ) > 0.3F) { - // riccochet - double bounce = 0.6; - this.velX *= bounce; - this.velY *= bounce; - this.velZ *= bounce; - - - switch (mop.sideHit) { - case 0: - if (this.velY > 0) { - this.velY *= -bounce; - } - break; - case 1: - if (this.velY < 0) { - this.velY *= -bounce; - } - break; - case 2: - if (this.velZ > 0) { - this.velZ *= -bounce; - } - break; - case 3: - if (this.velZ < 0) { - this.velZ *= -bounce; - } - break; - case 4: - if (this.velX > 0) { - this.velX *= -bounce; - } - break; - case 5: - if (this.velX < 0) { - this.velX *= -bounce; - } - break; - } - } - - // demolish some blocks - this.affectBlocksInAABB(this.boundingBox, this.getThrower()); - } - - // head back to owner - if (!this.worldObj.isRemote) { - this.isReturning = true; - } - - // if we have smashed enough, add to ticks so that we go back faster - if (this.blocksSmashed > MAX_SMASH && this.ticksExisted < 60) { - this.ticksExisted += 60; - } - } - - } - - - /** - * Do our ball and chain effect on blocks we hit. Harvest/destroy/whatevs - * @param entity - */ - private boolean affectBlocksInAABB(AxisAlignedBB par1AxisAlignedBB, EntityLivingBase entity) { - //System.out.println("Destroying blocks in " + par1AxisAlignedBB); - - int minX = MathHelper.floor_double(par1AxisAlignedBB.minX); - int minY = MathHelper.floor_double(par1AxisAlignedBB.minY); - int minZ = MathHelper.floor_double(par1AxisAlignedBB.minZ); - int maxX = MathHelper.floor_double(par1AxisAlignedBB.maxX); - int maxY = MathHelper.floor_double(par1AxisAlignedBB.maxY); - int maxZ = MathHelper.floor_double(par1AxisAlignedBB.maxZ); - boolean hitBlock = false; - for (int dx = minX; dx <= maxX; ++dx) { - for (int dy = minY; dy <= maxY; ++dy) { - for (int dz = minZ; dz <= maxZ; ++dz) { - Block block = this.worldObj.getBlock(dx, dy, dz); - int currentMeta = this.worldObj.getBlockMetadata(dx, dy, dz); - - if (block != Blocks.air && block.getExplosionResistance(this) < 7F && block.getBlockHardness(worldObj, dx, dy, dz) >= 0) { - - if (entity != null && entity instanceof EntityPlayer) { - EntityPlayer player = (EntityPlayer)entity; - - if (block.canHarvestBlock(player, currentMeta)){ - block.harvestBlock(this.worldObj, player, dx, dy, dz, currentMeta); - } - } - - this.worldObj.setBlockToAir(dx, dy, dz); - - // here, this effect will have to do - worldObj.playAuxSFX(2001, dx, dy, dz, Block.getIdFromBlock(block) + (currentMeta << 12)); - - this.blocksSmashed++; - - hitBlock = true; - } - } - } - } - - return hitBlock; - } - - - /** - * Skip most of the living update things - */ - @Override - public void onUpdate() { - super.onUpdate(); - - // chains are probably always null on the server - if (this.chain1 != null) { - chain1.onUpdate(); - chain2.onUpdate(); - chain3.onUpdate(); - chain4.onUpdate(); - chain5.onUpdate(); - } - - if (this.getThrower() == null && !this.worldObj.isRemote) { - this.setDead(); - } - - if (this.getThrower() != null) { - float distToPlayer = this.getDistanceToEntity(this.getThrower()); - // return if far enough away - if (!this.isReturning && distToPlayer > MAX_CHAIN) { - this.isReturning = true; - } - - // despawn if close enough - if (this.isReturning && distToPlayer < 1F) { - //System.out.println("we have returned after smashing " + this.blocksSmashed + " blocks"); - if (this.getThrower() instanceof EntityPlayer) { - ItemTFChainBlock.setChainAsReturned((EntityPlayer)this.getThrower()); - } - this.setDead(); - } - } - - // if we are returning, set course for the player - if (this.isReturning && !this.worldObj.isRemote && this.getThrower() != null) { - - EntityLivingBase returnTo = this.getThrower(); - - Vec3 back = Vec3.createVectorHelper(returnTo.posX - this.posX, returnTo.posY + (double)returnTo.getEyeHeight() - 1.200000023841858D - this.posY, returnTo.posZ - this.posZ).normalize(); - - float age = Math.min(this.ticksExisted * 0.03F, 1.0F); - - // separate the return velocity from the normal bouncy velocity - this.motionX = this.velX * (1.0 - age) + (back.xCoord * 2F * age); - this.motionY = this.velY * (1.0 - age) + (back.yCoord * 2F * age) - this.getGravityVelocity(); - this.motionZ = this.velZ * (1.0 - age) + (back.zCoord * 2F * age); - - } - - - // on the client, if we are not attached, assume we have just spawned, and attach to the player - if (this.worldObj.isRemote && !this.isAttached) { - List nearbyEntities = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox.addCoord(-this.motionX, -this.motionY, -this.motionZ).expand(2.0D, 2.0D, 2.0D)); - for (int i = 0; i < nearbyEntities.size(); ++i) { - Entity nearby = (Entity)nearbyEntities.get(i); - - // attach? should we check for closest player? - if (nearby instanceof EntityPlayer) { - this.attachedTo = (EntityPlayer) nearby; - - //System.out.println("Attached to player nearby"); - } - } - - this.isAttached = true; - } - - // set chain positions, client only - if (this.attachedTo != null) { - // interpolate chain position - Vec3 handVec = this.attachedTo.getLookVec(); - - handVec.rotateAroundY(-0.4F); - - double sx = this.attachedTo.posX + handVec.xCoord; - double sy = this.attachedTo.posY + handVec.yCoord - 0.6F; - double sz = this.attachedTo.posZ + handVec.zCoord; - - double ox = sx - this.posX; - double oy = sy - this.posY - 0.25F; - double oz = sz - this.posZ; - - this.chain1.setPosition(sx - ox * 0.05, sy - oy * 0.05, sz - oz * 0.05); - this.chain2.setPosition(sx - ox * 0.25, sy - oy * 0.25, sz - oz * 0.25); - this.chain3.setPosition(sx - ox * 0.45, sy - oy * 0.45, sz - oz * 0.45); - this.chain4.setPosition(sx - ox * 0.65, sy - oy * 0.65, sz - oz * 0.65); - this.chain5.setPosition(sx - ox * 0.85, sy - oy * 0.85, sz - oz * 0.85); - } - } - - - - /** - * Velocity - */ - protected float func_70182_d() - { - return 1.5F; - } - - - @Override - public World func_82194_d() { - return this.worldObj; - } - - - @Override - public boolean attackEntityFromPart(EntityDragonPart p_70965_1_, DamageSource p_70965_2_, float p_70965_3_) { - return false; - } - - /** - * We need to do this for the bounding boxes on the parts to become active - */ - @Override - public Entity[] getParts() - { - return partsArray; - } - -} diff --git a/src/main/java/twilightforest/entity/EntityTFCharmEffect.java b/src/main/java/twilightforest/entity/EntityTFCharmEffect.java deleted file mode 100644 index edc2fb9162..0000000000 --- a/src/main/java/twilightforest/entity/EntityTFCharmEffect.java +++ /dev/null @@ -1,181 +0,0 @@ -package twilightforest.entity; - -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.item.Item; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.MathHelper; -import net.minecraft.util.Vec3; -import net.minecraft.world.World; -import twilightforest.item.TFItems; - -public class EntityTFCharmEffect extends Entity -{ - - private static final int DATA_OWNER = 17; - private static final int DATA_ITEMID = 16; - private static final double DISTANCE = 1.75; - private EntityLivingBase orbiting; - private double newPosX; - private double newPosY; - private double newPosZ; - private double newRotationYaw; - private double newRotationPitch; - private int newPosRotationIncrements; - - public float offset; - - // client constructor - public EntityTFCharmEffect(World par1World) - { - super(par1World); - this.setSize(0.25F, 0.25F); - - this.setItemID(TFItems.charmOfLife1); - } - - // server constructor - public EntityTFCharmEffect(World par1World, EntityLivingBase par2EntityLiving, Item item) - { - super(par1World); - this.setSize(0.25F, 0.25F); - - this.orbiting = par2EntityLiving; - //this.setOwner(orbiting.getEntityName()); - this.setItemID(item); - - Vec3 look = Vec3.createVectorHelper(DISTANCE, 0, 0); - - this.setLocationAndAngles(par2EntityLiving.posX, par2EntityLiving.posY + par2EntityLiving.getEyeHeight(), par2EntityLiving.posZ, par2EntityLiving.rotationYaw, par2EntityLiving.rotationPitch); - this.posX += look.xCoord * DISTANCE; - //this.posY += look.yCoord * DISTANCE; - this.posZ += look.zCoord * DISTANCE; - this.setPosition(this.posX, this.posY, this.posZ); - this.yOffset = 0.0F; - - } - - /** - * Called to update the entity's position/logic. - */ - public void onUpdate() - { - this.lastTickPosX = this.posX; - this.lastTickPosY = this.posY; - this.lastTickPosZ = this.posZ; - super.onUpdate(); - - - if (this.newPosRotationIncrements > 0) - { - double var1 = this.posX + (this.newPosX - this.posX) / (double)this.newPosRotationIncrements; - double var3 = this.posY + (this.newPosY - this.posY) / (double)this.newPosRotationIncrements; - double var5 = this.posZ + (this.newPosZ - this.posZ) / (double)this.newPosRotationIncrements; - double var7 = MathHelper.wrapAngleTo180_double(this.newRotationYaw - (double)this.rotationYaw); - this.rotationYaw = (float)((double)this.rotationYaw + var7 / this.newPosRotationIncrements); - this.rotationPitch = (float)((double)this.rotationPitch + (this.newRotationPitch - (double)this.rotationPitch) / this.newPosRotationIncrements); - --this.newPosRotationIncrements; - this.setPosition(var1, var3, var5); - this.setRotation(this.rotationYaw, this.rotationPitch); - } - - float rotation = this.ticksExisted / 5.0F + offset; - - if (this.orbiting == null) - { - this.orbiting = getOwner(); - } - - if (this.orbiting != null && !worldObj.isRemote) - { - this.setLocationAndAngles(orbiting.posX, orbiting.posY + orbiting.getEyeHeight(), orbiting.posZ, orbiting.rotationYaw, orbiting.rotationPitch); - - Vec3 look = Vec3.createVectorHelper(DISTANCE, 0, 0); - look.rotateAroundY(rotation); - this.posX += look.xCoord; -// this.posY += Math.sin(this.ticksExisted / 3.0F + offset); - this.posZ += look.zCoord; - - this.setPosition(this.posX, this.posY, this.posZ); - - } - - if (this.getItemID() > 0) - { - for (int i = 0; i < 3; i++) { - double dx = posX + 0.5 * (rand.nextDouble() - rand.nextDouble()); - double dy = posY + 0.5 * (rand.nextDouble() - rand.nextDouble()); - double dz = posZ + 0.5 * (rand.nextDouble() - rand.nextDouble()); - - worldObj.spawnParticle("iconcrack_" + this.getItemID(), dx, dy, dz, 0, 0.2, 0); - } - } - - if (this.ticksExisted > 200 || this.orbiting == null || this.orbiting.isDead) - { - this.setDead(); - } - } - - /** - * Sets the position and rotation. Only difference from the other one is no bounding on the rotation. Args: posX, - * posY, posZ, yaw, pitch - */ - public void setPositionAndRotation2(double par1, double par3, double par5, float par7, float par8, int par9) - { - this.yOffset = 0.0F; - this.newPosX = par1; - this.newPosY = par3; - this.newPosZ = par5; - this.newRotationYaw = par7; - this.newRotationPitch = par8; - this.newPosRotationIncrements = par9; - } - - - protected void entityInit() - { - this.dataWatcher.addObject(DATA_ITEMID, Integer.valueOf(0)); - this.dataWatcher.addObject(DATA_OWNER, ""); - } - - public String getOwnerName() - { - return this.dataWatcher.getWatchableObjectString(DATA_OWNER); - } - - public void setOwner(String par1Str) - { - this.dataWatcher.updateObject(DATA_OWNER, par1Str); - } - - public EntityLivingBase getOwner() - { - return this.worldObj.getPlayerEntityByName(this.getOwnerName()); - } - - public int getItemID() - { - return this.dataWatcher.getWatchableObjectInt(DATA_ITEMID); - } - - public void setItemID(Item charmOfLife1) - { - //this.dataWatcher.updateObject(DATA_ITEMID, Integer.valueOf(charmOfLife1)); - } - - @Override - protected void readEntityFromNBT(NBTTagCompound par1NBTTagCompound) - { - par1NBTTagCompound.setString("Owner", this.getOwnerName()); - par1NBTTagCompound.setShort("ItemID", (short) this.getItemID()); - } - - @Override - protected void writeEntityToNBT(NBTTagCompound par1NBTTagCompound) - { - this.setOwner(par1NBTTagCompound.getString("Owner")); - //this.setItemID(par1NBTTagCompound.getShort("ItemID")); - } - -} diff --git a/src/main/java/twilightforest/entity/EntityTFCubeOfAnnihilation.java b/src/main/java/twilightforest/entity/EntityTFCubeOfAnnihilation.java deleted file mode 100644 index 74f5d318b6..0000000000 --- a/src/main/java/twilightforest/entity/EntityTFCubeOfAnnihilation.java +++ /dev/null @@ -1,264 +0,0 @@ -package twilightforest.entity; - -import java.util.List; - -import twilightforest.TFGenericPacketHandler; -import twilightforest.TwilightForestMod; -import twilightforest.block.TFBlocks; -import twilightforest.item.ItemTFChainBlock; -import twilightforest.item.ItemTFCubeOfAnnihilation; -import cpw.mods.fml.common.network.NetworkRegistry; -import cpw.mods.fml.common.network.internal.FMLProxyPacket; -import net.minecraft.block.Block; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.IEntityMultiPart; -import net.minecraft.entity.boss.EntityDragonPart; -import net.minecraft.entity.item.EntityMinecart; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.projectile.EntityThrowable; -import net.minecraft.init.Blocks; -import net.minecraft.init.Items; -import net.minecraft.item.Item; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.DamageSource; -import net.minecraft.util.MathHelper; -import net.minecraft.util.MovingObjectPosition; -import net.minecraft.util.Vec3; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; - - -public class EntityTFCubeOfAnnihilation extends EntityThrowable { - - boolean hasHitObstacle = false; - - public EntityTFCubeOfAnnihilation(World par1World) { - super(par1World); - - this.setSize(1.1F, 1F); - this.isImmuneToFire = true; - - } - - - public EntityTFCubeOfAnnihilation(World par1World, double par2, double par4, double par6) { - super(par1World, par2, par4, par6); - this.setSize(1F, 1F); - this.isImmuneToFire = true; - } - - - public EntityTFCubeOfAnnihilation(World par1World, EntityLivingBase par2EntityLiving) { - super(par1World, par2EntityLiving); - - this.setSize(1F, 1F); - this.isImmuneToFire = true; - } - - - /** - * How much this entity falls each tick - */ - @Override - protected float getGravityVelocity() - { - return 0F; - } - - - - @Override - protected void onImpact(MovingObjectPosition mop) { - // only hit living things - if (mop.entityHit != null && mop.entityHit instanceof EntityLivingBase) - { - if (mop.entityHit.attackEntityFrom(DamageSource.causePlayerDamage((EntityPlayer) this.getThrower()), 10)) - { - this.ticksExisted += 60; - } - } - - if (!this.worldObj.isAirBlock(mop.blockX, mop.blockY, mop.blockZ)) { - - // demolish some blocks - if (!this.worldObj.isRemote) { - this.affectBlocksInAABB(this.boundingBox.expand(0.2F, 0.2F, 0.2F), this.getThrower()); - } - - } - - } - - - /** - * Do our ball and chain effect on blocks we hit. Harvest/destroy/whatevs - * @param entity - */ - private boolean affectBlocksInAABB(AxisAlignedBB par1AxisAlignedBB, EntityLivingBase entity) { - //System.out.println("Destroying blocks in " + par1AxisAlignedBB); - - int minX = MathHelper.floor_double(par1AxisAlignedBB.minX); - int minY = MathHelper.floor_double(par1AxisAlignedBB.minY); - int minZ = MathHelper.floor_double(par1AxisAlignedBB.minZ); - int maxX = MathHelper.floor_double(par1AxisAlignedBB.maxX); - int maxY = MathHelper.floor_double(par1AxisAlignedBB.maxY); - int maxZ = MathHelper.floor_double(par1AxisAlignedBB.maxZ); - boolean hitBlock = false; - for (int dx = minX; dx <= maxX; ++dx) { - for (int dy = minY; dy <= maxY; ++dy) { - for (int dz = minZ; dz <= maxZ; ++dz) { - Block block = this.worldObj.getBlock(dx, dy, dz); - int currentMeta = this.worldObj.getBlockMetadata(dx, dy, dz); - - if (block != Blocks.air) { - if (canAnnihilate(dx, dy, dz, block, currentMeta)) { - this.worldObj.setBlockToAir(dx, dy, dz); - - this.worldObj.playSoundAtEntity(this, "random.fizz", 0.125f, this.rand.nextFloat() * 0.25F + 0.75F); - - this.sendAnnihilateBlockPacket(worldObj, dx, dy, dz); - - } else { - // return if we hit an obstacle - this.hasHitObstacle = true; - } - hitBlock = true; - } - } - } - } - - return hitBlock; - } - - - private boolean canAnnihilate(int dx, int dy, int dz, Block block, int meta) { - // whitelist many castle blocks - if (block == TFBlocks.deadrock || block == TFBlocks.castleBlock || (block == TFBlocks.castleMagic && meta != 3) || block == TFBlocks.forceField || block == TFBlocks.thorns) { - return true; - } - - return block.getExplosionResistance(this) < 8F && block.getBlockHardness(worldObj, dx, dy, dz) >= 0; - } - - - - private void sendAnnihilateBlockPacket(World world, int x, int y, int z) { - // send packet - FMLProxyPacket message = TFGenericPacketHandler.makeAnnihilateBlockPacket(x, y, z); - - NetworkRegistry.TargetPoint targetPoint = new NetworkRegistry.TargetPoint(world.provider.dimensionId, x, y, z, 64); - - TwilightForestMod.genericChannel.sendToAllAround(message, targetPoint); - } - - /** - * Skip most of the living update things - */ - @Override - public void onUpdate() { - super.onUpdate(); - - // all server side - if (!this.worldObj.isRemote) { - - if (this.getThrower() == null) { - this.setDead(); - return; - } - - if (this.isReturning()) { - // if we are returning, and are near enough to the player, then we are done - List list = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox.addCoord(this.motionX, this.motionY, this.motionZ).expand(1.0D, 1.0D, 1.0D)); - - if (list.contains(this.getThrower()) && !this.worldObj.isRemote) { - //System.out.println("we have returned"); - if (this.getThrower() instanceof EntityPlayer) { - ItemTFCubeOfAnnihilation.setCubeAsReturned((EntityPlayer)this.getThrower()); - } - this.setDead(); - } - } - - - - // always head towards either the point or towards the player - Vec3 destPoint = Vec3.createVectorHelper(this.getThrower().posX, this.getThrower().posY + this.getThrower().getEyeHeight(), this.getThrower().posZ); - - if (!this.isReturning()) { - Vec3 look = this.getThrower().getLookVec(); - - - - float dist = 16F; - - look.xCoord *= dist; - look.yCoord *= dist; - look.zCoord *= dist; - - destPoint.xCoord += look.xCoord; - destPoint.yCoord += look.yCoord; - destPoint.zCoord += look.zCoord; - } - - //System.out.println("Dest point = " + destPoint); - - - // set motions - Vec3 velocity = Vec3.createVectorHelper(this.posX - destPoint.xCoord, (this.posY + this.height / 2F) - destPoint.yCoord, this.posZ - destPoint.zCoord); - - this.motionX -= velocity.xCoord; - this.motionY -= velocity.yCoord; - this.motionZ -= velocity.zCoord; - - // normalize speed - float currentSpeed = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionY * this.motionY + this.motionZ * this.motionZ); - - float maxSpeed = 0.5F; - - - if (currentSpeed > maxSpeed) { - this.motionX /= currentSpeed / maxSpeed; - this.motionY /= currentSpeed / maxSpeed; - this.motionZ /= currentSpeed / maxSpeed; - } else { - float slow = 0.5F; - this.motionX *= slow; - this.motionY *= slow; - this.motionZ *= slow; - } - - - // demolish some blocks - this.affectBlocksInAABB(this.boundingBox.expand(0.2F, 0.2F, 0.2F), this.getThrower()); - - } - - - - - } - - public boolean isReturning() { - if (this.hasHitObstacle || this.getThrower() == null || !(this.getThrower() instanceof EntityPlayer)) { - return true; - } else { - EntityPlayer player = (EntityPlayer) this.getThrower(); - - return !player.isUsingItem(); - } - } - - - - /** - * Velocity - */ - protected float func_70182_d() - { - return 1.5F; - } - - -} diff --git a/src/main/java/twilightforest/entity/EntityTFDeathTome.java b/src/main/java/twilightforest/entity/EntityTFDeathTome.java deleted file mode 100644 index ca9063cc2e..0000000000 --- a/src/main/java/twilightforest/entity/EntityTFDeathTome.java +++ /dev/null @@ -1,153 +0,0 @@ -package twilightforest.entity; - -import net.minecraft.entity.Entity; -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.ai.EntityAIHurtByTarget; -import net.minecraft.entity.ai.EntityAILookIdle; -import net.minecraft.entity.ai.EntityAINearestAttackableTarget; -import net.minecraft.entity.ai.EntityAISwimming; -import net.minecraft.entity.ai.EntityAIWander; -import net.minecraft.entity.ai.EntityAIWatchClosest; -import net.minecraft.entity.monster.EntityMob; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Items; -import net.minecraft.item.Item; -import net.minecraft.util.DamageSource; -import net.minecraft.world.World; -import twilightforest.TFAchievementPage; -import twilightforest.entity.ai.EntityAITFMagicAttack; -import twilightforest.item.TFItems; - -public class EntityTFDeathTome extends EntityMob { - - public EntityTFDeathTome(World par1World) { - super(par1World); - //texture = "/item/book.png"; - - //this.attackStrength = 4; - //this.moveSpeed = 0.25F; - - this.tasks.addTask(0, new EntityAISwimming(this)); - this.tasks.addTask(4, new EntityAITFMagicAttack(this, 1.0F, 2, 60)); - this.tasks.addTask(5, new EntityAIWander(this, 1.0F)); - this.tasks.addTask(6, new EntityAIWatchClosest(this, EntityPlayer.class, 8.0F)); - this.tasks.addTask(6, new EntityAILookIdle(this)); - this.targetTasks.addTask(1, new EntityAIHurtByTarget(this, false)); - this.targetTasks.addTask(2, new EntityAINearestAttackableTarget(this, EntityPlayer.class, 0, true)); - } - - public int getAttackStrength(Entity par1Entity) - { - return 4; - } - - /** - * Returns true if the newer Entity AI code should be run - */ - @Override - protected boolean isAIEnabled() - { - return true; - } - - - /** - * Set monster attributes - */ - @Override - protected void applyEntityAttributes() - { - super.applyEntityAttributes(); - this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(30.0D); // max health - this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.25D); // movement speed - } - - @Override - public void onLivingUpdate() { - super.onLivingUpdate(); - - for (int i = 0; i < 1; ++i) - { - this.worldObj.spawnParticle("enchantmenttable", this.posX + (this.rand.nextDouble() - 0.5D) * this.width, this.posY + this.rand.nextDouble() * (this.height - 0.75D) + 0.5D, this.posZ + (this.rand.nextDouble() - 0.5D) * this.width, - 0, 0.5, 0); - } - } - - /** - * Called when the entity is attacked. - */ - @Override - public boolean attackEntityFrom(DamageSource par1DamageSource, float par2) - { - if (par1DamageSource.isFireDamage()) - { - par2 *= 2; - } - - if (super.attackEntityFrom(par1DamageSource, par2)) - { - // we took damage - if (this.rand.nextInt(2) == 0) - { - func_145778_a(Items.paper, 1, 1.0F); - } - return true; - } - else - { - return false; - } - } - - /** - * Returns the item ID for the item the mob drops on death. - */ - @Override - protected Item getDropItem() - { - return Items.paper; - } - - /** - * Drop 0-2 items of this living's type - */ - @Override - protected void dropFewItems(boolean par1, int par2) - { - int var3 = this.rand.nextInt(3 + par2); - int var4; - - for (var4 = 0; var4 < var3; ++var4) - { - this.dropItem(Items.paper, 1); - } - - if (this.rand.nextInt(5) - par2 <= 0) - { - this.dropItem(Items.writable_book, 1); - } - else - { - this.dropItem(Items.book, 1); - } - } - - @Override - protected void dropRareDrop(int par1) - { - this.dropItem(TFItems.magicMapFocus, 1); - } - - - /** - * Trigger achievement when killed - */ - @Override - public void onDeath(DamageSource par1DamageSource) { - super.onDeath(par1DamageSource); - if (par1DamageSource.getSourceOfDamage() instanceof EntityPlayer) { - ((EntityPlayer)par1DamageSource.getSourceOfDamage()).triggerAchievement(TFAchievementPage.twilightHunter); - } - } - -} diff --git a/src/main/java/twilightforest/entity/EntityTFFireBeetle.java b/src/main/java/twilightforest/entity/EntityTFFireBeetle.java deleted file mode 100644 index 97d9550ceb..0000000000 --- a/src/main/java/twilightforest/entity/EntityTFFireBeetle.java +++ /dev/null @@ -1,273 +0,0 @@ -package twilightforest.entity; - -import net.minecraft.block.Block; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EnumCreatureAttribute; -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.ai.EntityAIAttackOnCollide; -import net.minecraft.entity.ai.EntityAIHurtByTarget; -import net.minecraft.entity.ai.EntityAINearestAttackableTarget; -import net.minecraft.entity.ai.EntityAISwimming; -import net.minecraft.entity.ai.EntityAIWander; -import net.minecraft.entity.monster.EntityMob; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Items; -import net.minecraft.item.Item; -import net.minecraft.util.DamageSource; -import net.minecraft.util.Vec3; -import net.minecraft.world.World; -import twilightforest.TFAchievementPage; -import twilightforest.entity.ai.EntityAITFBreathAttack; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - - -public class EntityTFFireBeetle extends EntityMob implements IBreathAttacker -{ - - public static final int BREATH_DURATION = 10; - public static final int BREATH_DAMAGE = 2; - - - public EntityTFFireBeetle(World world) - { - super(world); - //texture = TwilightForestMod.MODEL_DIR + "firebeetle.png"; - //moveSpeed = 0.23F; - setSize(1.1F, .75F); - - this.tasks.addTask(0, new EntityAISwimming(this)); - this.tasks.addTask(2, new EntityAITFBreathAttack(this, 1.0F, 5F, 30, 0.1F)); - this.tasks.addTask(3, new EntityAIAttackOnCollide(this, EntityPlayer.class, 1.0F, false)); - this.tasks.addTask(6, new EntityAIWander(this, 1.0F)); - //this.tasks.addTask(7, new EntityAIWatchClosest(this, EntityPlayer.class, 8.0F)); - //this.tasks.addTask(7, new EntityAILookIdle(this)); - this.targetTasks.addTask(1, new EntityAIHurtByTarget(this, false)); - this.targetTasks.addTask(2, new EntityAINearestAttackableTarget(this, EntityPlayer.class, 0, true)); - - } - - public EntityTFFireBeetle(World world, double x, double y, double z) - { - this(world); - this.setPosition(x, y, z); - } - - @Override - protected void entityInit() - { - super.entityInit(); - dataWatcher.addObject(17, Byte.valueOf((byte)0)); - } - - /** - * Returns true if the newer Entity AI code should be run - */ - @Override - protected boolean isAIEnabled() - { - return true; - } - - /** - * Set monster attributes - */ - @Override - protected void applyEntityAttributes() - { - super.applyEntityAttributes(); - this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(25.0D); // max health - this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.23D); // movement speed - this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(4.0D); // attack damage - } - - - - /** - * Returns the sound this mob makes while it's alive. - */ - @Override - protected String getLivingSound() - { - return null; - } - - /** - * Returns the sound this mob makes when it is hurt. - */ - @Override - protected String getHurtSound() - { - return "mob.spider.say"; - } - - /** - * Returns the sound this mob makes on death. - */ - @Override - protected String getDeathSound() - { - return "mob.spider.death"; - } - - /** - * Plays step sound at given x, y, z for the entity - */ - @Override - protected void func_145780_a(int var1, int var2, int var3, Block var4) - { - this.worldObj.playSoundAtEntity(this, "mob.spider.step", 0.15F, 1.0F); - } - - - @Override - protected Item getDropItem() - { - return Items.gunpowder; - } - - /* (non-Javadoc) - * @see twilightforest.entity.IBreathAttacker#isBreathing() - */ - @Override - public boolean isBreathing() - { - return dataWatcher.getWatchableObjectByte(17) != 0; - } - - /* (non-Javadoc) - * @see twilightforest.entity.IBreathAttacker#setBreathing(boolean) - */ - @Override - public void setBreathing(boolean flag) - { - if (flag) - { - dataWatcher.updateObject(17, Byte.valueOf((byte)127)); - } - else - { - dataWatcher.updateObject(17, Byte.valueOf((byte)0)); - } - } - - - /** - * Called frequently so the entity can update its state every tick as required. For example, zombies and skeletons - * use this to react to sunlight and start to burn. - */ - @Override - public void onLivingUpdate() - { - super.onLivingUpdate(); - - // when breathing fire, spew particles - if (isBreathing()) - { - Vec3 look = this.getLookVec(); - - double dist = 0.9; - double px = this.posX + look.xCoord * dist; - double py = this.posY + 0.25 + look.yCoord * dist; - double pz = this.posZ + look.zCoord * dist; - - for (int i = 0; i < 2; i++) - { - double dx = look.xCoord; - double dy = look.yCoord; - double dz = look.zCoord; - - double spread = 5 + this.getRNG().nextDouble() * 2.5; - double velocity = 0.15 + this.getRNG().nextDouble() * 0.15; - - // spread flame - dx += this.getRNG().nextGaussian() * 0.007499999832361937D * spread; - dy += this.getRNG().nextGaussian() * 0.007499999832361937D * spread; - dz += this.getRNG().nextGaussian() * 0.007499999832361937D * spread; - dx *= velocity; - dy *= velocity; - dz *= velocity; - - worldObj.spawnParticle(getFlameParticle(), px, py, pz, dx, dy, dz); - } - - playBreathSound(); - } - - } - - public String getFlameParticle() { - return "flame"; - } - - public void playBreathSound() { - worldObj.playSoundEffect(this.posX + 0.5, this.posY + 0.5, this.posZ + 0.5, "mob.ghast.fireball", rand.nextFloat() * 0.5F, rand.nextFloat() * 0.5F); - } - - @Override - @SideOnly(Side.CLIENT) - public int getBrightnessForRender(float par1) { - if (isBreathing()) - { - return 15728880; - } - else - { - return super.getBrightnessForRender(par1); - } - } - - /** - * Trigger achievement when killed - */ - @Override - public void onDeath(DamageSource par1DamageSource) { - super.onDeath(par1DamageSource); - if (par1DamageSource.getSourceOfDamage() instanceof EntityPlayer) { - ((EntityPlayer)par1DamageSource.getSourceOfDamage()).triggerAchievement(TFAchievementPage.twilightHunter); - } - } - - /** - * Rather than speed, this seems to control how far up or down the heads can tilt? - */ - @Override - public int getVerticalFaceSpeed() - { - return 500; - } - - @Override - @SideOnly(Side.CLIENT) - public float getShadowSize() - { - return 1.1F; - } - - @Override - public float getEyeHeight() { - return 0.25F; - } - - /** - * Get this Entity's EnumCreatureAttribute - */ - @Override - public EnumCreatureAttribute getCreatureAttribute() - { - return EnumCreatureAttribute.ARTHROPOD; - } - - /* (non-Javadoc) - * @see twilightforest.entity.IBreathAttacker#doBreathAttack(net.minecraft.entity.Entity) - */ - @Override - public void doBreathAttack(Entity target) - { - if (!target.isImmuneToFire() && target.attackEntityFrom(DamageSource.inFire, BREATH_DAMAGE)) - { - target.setFire(BREATH_DURATION); - } - } - -} diff --git a/src/main/java/twilightforest/entity/EntityTFGiantMiner.java b/src/main/java/twilightforest/entity/EntityTFGiantMiner.java deleted file mode 100644 index 3830bb0e6b..0000000000 --- a/src/main/java/twilightforest/entity/EntityTFGiantMiner.java +++ /dev/null @@ -1,83 +0,0 @@ -package twilightforest.entity; - -import twilightforest.entity.ai.EntityAITFGiantAttackOnCollide; -import twilightforest.item.TFItems; -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.ai.EntityAIHurtByTarget; -import net.minecraft.entity.ai.EntityAILookIdle; -import net.minecraft.entity.ai.EntityAINearestAttackableTarget; -import net.minecraft.entity.ai.EntityAISwimming; -import net.minecraft.entity.ai.EntityAIWander; -import net.minecraft.entity.ai.EntityAIWatchClosest; -import net.minecraft.entity.monster.EntityMob; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Items; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; - -public class EntityTFGiantMiner extends EntityMob { - - public EntityTFGiantMiner(World par1World) { - super(par1World); - this.setSize(this.width * 4.0F, this.height * 4.0F); - - - this.tasks.addTask(1, new EntityAISwimming(this)); - - this.tasks.addTask(4, new EntityAITFGiantAttackOnCollide(this, EntityPlayer.class, 1.0D, false)); - this.tasks.addTask(5, new EntityAIWander(this, 1.0D)); - this.tasks.addTask(6, new EntityAIWatchClosest(this, EntityPlayer.class, 8.0F)); - this.tasks.addTask(6, new EntityAILookIdle(this)); - this.targetTasks.addTask(1, new EntityAIHurtByTarget(this, false)); - this.targetTasks.addTask(2, new EntityAINearestAttackableTarget(this, EntityPlayer.class, 0, true)); - - this.setCurrentItemOrArmor(0, new ItemStack(Items.stone_pickaxe)); - - for (int i = 0; i < this.equipmentDropChances.length; ++i) - { - this.equipmentDropChances[i] = 0F; - } - } - - protected void applyEntityAttributes() { - super.applyEntityAttributes(); - this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(80.0D); - this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.23D); - this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(10.0D); - this.getEntityAttribute(SharedMonsterAttributes.followRange).setBaseValue(40.0D); - } - - - /** - * Returns true if the newer Entity AI code should be run - */ - @Override - protected boolean isAIEnabled() { - return true; - } - - - protected Item getDropItem() - { - return TFItems.giantPick; - } - - /** - * Drop 0-2 items of this living's type. @param par1 - Whether this entity has recently been hit by a player. @param - * par2 - Level of Looting used to kill this mob. - */ - protected void dropFewItems(boolean par1, int par2) - { - Item item = this.getDropItem(); - // just drop 1 item every time - if (item != null && par1) { - this.dropItem(item, 1); - } - } - - public void makeNonDespawning() { - this.func_110163_bv(); - } - -} diff --git a/src/main/java/twilightforest/entity/EntityTFGoblinChain.java b/src/main/java/twilightforest/entity/EntityTFGoblinChain.java deleted file mode 100644 index c752cfefc6..0000000000 --- a/src/main/java/twilightforest/entity/EntityTFGoblinChain.java +++ /dev/null @@ -1,86 +0,0 @@ -package twilightforest.entity; - -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.DamageSource; -import net.minecraft.world.World; - -public class EntityTFGoblinChain extends Entity { - - Entity goblin; - - public EntityTFGoblinChain(World par1World) { - super(par1World); - setSize(0.1F, 0.1F); - } - - public EntityTFGoblinChain(Entity goblin) { - this(goblin.worldObj); - this.goblin = goblin; - } - - /** - * Don't take damage from attacks - */ - @Override - public boolean attackEntityFrom(DamageSource par1DamageSource, float par2) { - return false; - } - - - /** - * Keep position updated - */ - @Override - public void onUpdate() { - super.onUpdate(); - - this.ticksExisted++; - - - lastTickPosX = posX; - lastTickPosY = posY; - lastTickPosZ = posZ; - - - //System.out.println("Updating " + this + " with angles " + rotationYawHead + ", " + rotationPitch); - - for (; rotationYaw - prevRotationYaw < -180F; prevRotationYaw -= 360F) { } - for (; rotationYaw - prevRotationYaw >= 180F; prevRotationYaw += 360F) { } - for (; rotationPitch - prevRotationPitch < -180F; prevRotationPitch -= 360F) { } - for (; rotationPitch - prevRotationPitch >= 180F; prevRotationPitch += 360F) { } - - } - - /** - * Returns true if other Entities should be prevented from moving through this Entity. - */ - public boolean canBeCollidedWith() - { - return false; - } - - /** - * Returns true if this entity should push and be pushed by other entities when colliding. - */ - public boolean canBePushed() - { - return false; - } - - public boolean isEntityEqual(Entity entity) - { - return this == entity || this.goblin == entity; - } - - @Override - protected void entityInit() { } - - @Override - protected void readEntityFromNBT(NBTTagCompound nbttagcompound) { } - - @Override - protected void writeEntityToNBT(NBTTagCompound nbttagcompound) { } - -} diff --git a/src/main/java/twilightforest/entity/EntityTFGoblinKnightLower.java b/src/main/java/twilightforest/entity/EntityTFGoblinKnightLower.java deleted file mode 100644 index 7909910866..0000000000 --- a/src/main/java/twilightforest/entity/EntityTFGoblinKnightLower.java +++ /dev/null @@ -1,290 +0,0 @@ -package twilightforest.entity; - -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLiving; -import net.minecraft.entity.IEntityLivingData; -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.ai.EntityAIAttackOnCollide; -import net.minecraft.entity.ai.EntityAIHurtByTarget; -import net.minecraft.entity.ai.EntityAILookIdle; -import net.minecraft.entity.ai.EntityAINearestAttackableTarget; -import net.minecraft.entity.ai.EntityAISwimming; -import net.minecraft.entity.ai.EntityAIWander; -import net.minecraft.entity.ai.EntityAIWatchClosest; -import net.minecraft.entity.monster.EntityMob; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Items; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.DamageSource; -import net.minecraft.util.MathHelper; -import net.minecraft.world.World; -import twilightforest.entity.ai.EntityAITFRiderSpearAttack; -import twilightforest.item.TFItems; - -public class EntityTFGoblinKnightLower extends EntityMob { - - private static final int DATA_EQUIP = 17; - - public EntityTFGoblinKnightLower(World par1World) { - super(par1World); - //texture = TwilightForestMod.MODEL_DIR + "doublegoblin.png"; - //moveSpeed = 0.28F; - setSize(0.7F, 1.1F); - - this.tasks.addTask(0, new EntityAITFRiderSpearAttack(this)); - this.tasks.addTask(1, new EntityAISwimming(this)); - this.tasks.addTask(3, new EntityAIAttackOnCollide(this, EntityPlayer.class, 1.0D, false)); - this.tasks.addTask(6, new EntityAIWander(this, 1.0D)); - this.tasks.addTask(7, new EntityAIWatchClosest(this, EntityPlayer.class, 8.0F)); - this.tasks.addTask(7, new EntityAILookIdle(this)); - this.targetTasks.addTask(1, new EntityAIHurtByTarget(this, false)); - this.targetTasks.addTask(2, new EntityAINearestAttackableTarget(this, EntityPlayer.class, 0, false)); - - this.setHasArmor(true); - } - - - /** - * Set monster attributes - */ - @Override - protected void applyEntityAttributes() - { - super.applyEntityAttributes(); - this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(20.0D); // max health - this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.28D); // movement speed - this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(4.0D); // attack damage - } - - /** - * Returns true if the newer Entity AI code should be run - */ - @Override - protected boolean isAIEnabled() - { - return true; - } - - @Override - protected void entityInit() - { - super.entityInit(); - dataWatcher.addObject(DATA_EQUIP, Byte.valueOf((byte)0)); - } - - public boolean hasArmor() - { - return (dataWatcher.getWatchableObjectByte(DATA_EQUIP) & 1) > 0; - } - - public void setHasArmor(boolean flag) - { - byte otherFlags = dataWatcher.getWatchableObjectByte(DATA_EQUIP); - otherFlags &= 126; - - if (flag) - { - dataWatcher.updateObject(DATA_EQUIP, Byte.valueOf((byte) (otherFlags | 1))); - } - else - { - dataWatcher.updateObject(DATA_EQUIP, Byte.valueOf((byte)otherFlags)); - } - } - - /** - * (abstract) Protected helper method to write subclass entity data to NBT. - */ - @Override - public void writeEntityToNBT(NBTTagCompound par1NBTTagCompound) - { - super.writeEntityToNBT(par1NBTTagCompound); - par1NBTTagCompound.setBoolean("hasArmor", this.hasArmor()); - } - - /** - * (abstract) Protected helper method to read subclass entity data from NBT. - */ - @Override - public void readEntityFromNBT(NBTTagCompound par1NBTTagCompound) - { - super.readEntityFromNBT(par1NBTTagCompound); - this.setHasArmor(par1NBTTagCompound.getBoolean("hasArmor")); - } - - - /** - * Initialize this creature. - */ - public void initCreature() - { - // we start with the upper guy riding us - EntityTFGoblinKnightUpper upper = new EntityTFGoblinKnightUpper(this.worldObj); - upper.setLocationAndAngles(this.posX, this.posY, this.posZ, this.rotationYaw, 0.0F); - upper.onSpawnWithEgg((IEntityLivingData)null); - this.worldObj.spawnEntityInWorld(upper); - upper.mountEntity(this); - } - - /** - * Init creature with mount - */ - public IEntityLivingData onSpawnWithEgg(IEntityLivingData par1EntityLivingData) - { - Object par1EntityLivingData1 = super.onSpawnWithEgg(par1EntityLivingData); - - // we start with the upper guy riding us - EntityTFGoblinKnightUpper upper = new EntityTFGoblinKnightUpper(this.worldObj); - upper.setLocationAndAngles(this.posX, this.posY, this.posZ, this.rotationYaw, 0.0F); - upper.onSpawnWithEgg((IEntityLivingData)null); - this.worldObj.spawnEntityInWorld(upper); - upper.mountEntity(this); - - return (IEntityLivingData)par1EntityLivingData1; - } - - - /** - * Returns the Y offset from the entity's position for any entity riding this one. - */ - public double getMountedYOffset() - { - return 1.0D; - } - - /** - * Called to update the entity's position/logic. - */ - public void onUpdate() - { - if (this.isEntityAlive()) - { - // synch target with lower goblin - if (this.riddenByEntity != null && this.riddenByEntity instanceof EntityLiving && this.getAttackTarget() == null) - { - this.setAttackTarget(((EntityLiving) this.riddenByEntity).getAttackTarget()); - } - } - - super.onUpdate(); - } - - /** - * Do not attack if we have a rider - */ - @Override - public boolean attackEntityAsMob(Entity par1Entity) { - - if (this.riddenByEntity != null && this.riddenByEntity instanceof EntityLiving) - { - return ((EntityLiving)this.riddenByEntity).attackEntityAsMob(par1Entity); - } - else - { - return super.attackEntityAsMob(par1Entity); - } - - } - - /** - * Called when the entity is attacked. - */ - @Override - public boolean attackEntityFrom(DamageSource par1DamageSource, float damageAmount) { - // check the angle of attack, if applicable - Entity attacker = null; - if (par1DamageSource.getSourceOfDamage() != null) - { - attacker = par1DamageSource.getSourceOfDamage(); - } - - if (par1DamageSource.getEntity() != null) - { - attacker = par1DamageSource.getEntity(); - } - - if (attacker != null) - { - // determine angle - - double dx = this.posX - attacker.posX; - double dz = this.posZ - attacker.posZ; - float angle = (float)((Math.atan2(dz, dx) * 180D) / Math.PI) - 90F; - - float difference = MathHelper.abs((this.renderYawOffset - angle) % 360); - - //System.out.println("Difference in angle of approach is " + difference); - - // shield? - EntityTFGoblinKnightUpper upper = null; - - if (this.riddenByEntity != null && this.riddenByEntity instanceof EntityTFGoblinKnightUpper) - { - upper = (EntityTFGoblinKnightUpper) this.riddenByEntity; - } - - if (upper != null && upper.hasShield() && difference > 150 && difference < 230) - { - if (upper.takeHitOnShield(par1DamageSource, damageAmount)) - { - return false; - } - } - - // break armor? - if (this.hasArmor() && (difference > 300 || difference < 60)) - { - breakArmor(); - } - } - - - boolean attackSuccess = super.attackEntityFrom(par1DamageSource, damageAmount); - - // I think we're done - return attackSuccess; - } - - /** - * Break our armor - */ - public void breakArmor() { - this.renderBrokenItemStack(new ItemStack(Items.iron_chestplate)); - this.renderBrokenItemStack(new ItemStack(Items.iron_chestplate)); - this.renderBrokenItemStack(new ItemStack(Items.iron_chestplate)); - - this.setHasArmor(false); - } - - /** - * Returns the current armor value as determined by a call to InventoryPlayer.getTotalArmorValue - */ - public int getTotalArmorValue() - { - int armor = super.getTotalArmorValue(); - - if (this.hasArmor()) - { - armor += 17; - } - - if (armor > 20) - { - armor = 20; - } - - return armor; - } - - - /** - * Returns the item ID for the item the mob drops on death. - */ - protected Item getDropItemId() - { - return TFItems.armorShard; - } - -} diff --git a/src/main/java/twilightforest/entity/EntityTFGoblinKnightUpper.java b/src/main/java/twilightforest/entity/EntityTFGoblinKnightUpper.java deleted file mode 100644 index 29261bb0eb..0000000000 --- a/src/main/java/twilightforest/entity/EntityTFGoblinKnightUpper.java +++ /dev/null @@ -1,493 +0,0 @@ -package twilightforest.entity; - -import java.util.List; - -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLiving; -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.ai.EntityAIAttackOnCollide; -import net.minecraft.entity.ai.EntityAIHurtByTarget; -import net.minecraft.entity.ai.EntityAILookIdle; -import net.minecraft.entity.ai.EntityAINearestAttackableTarget; -import net.minecraft.entity.ai.EntityAISwimming; -import net.minecraft.entity.ai.EntityAIWander; -import net.minecraft.entity.ai.EntityAIWatchClosest; -import net.minecraft.entity.monster.EntityMob; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Items; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.DamageSource; -import net.minecraft.util.MathHelper; -import net.minecraft.util.Vec3; -import net.minecraft.world.World; -import twilightforest.entity.ai.EntityAITFHeavySpearAttack; -import twilightforest.item.TFItems; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public class EntityTFGoblinKnightUpper extends EntityMob { - - private static final int SHIELD_DAMAGE_THRESHOLD = 10; - - private static final int DATA_EQUIP = 17; - - public int shieldHits; - - public int heavySpearTimer; - - - public EntityTFGoblinKnightUpper(World par1World) { - super(par1World); - //texture = TwilightForestMod.MODEL_DIR + "doublegoblin.png"; - //moveSpeed = 0.28F; - setSize(1.1F, 1.3F); - - this.tasks.addTask(0, new EntityAITFHeavySpearAttack(this)); - this.tasks.addTask(1, new EntityAISwimming(this)); - this.tasks.addTask(3, new EntityAIAttackOnCollide(this, EntityPlayer.class, 1.0D, false)); - this.tasks.addTask(6, new EntityAIWander(this, 1.0D)); - this.tasks.addTask(7, new EntityAIWatchClosest(this, EntityPlayer.class, 8.0F)); - this.tasks.addTask(7, new EntityAILookIdle(this)); - this.targetTasks.addTask(1, new EntityAIHurtByTarget(this, false)); - this.targetTasks.addTask(2, new EntityAINearestAttackableTarget(this, EntityPlayer.class, 0, false)); - - this.setHasArmor(true); - this.setHasShield(true); - - //this.setCurrentItemOrArmor(0, new ItemStack(Items.swordSteel)); - - - this.shieldHits = 0; - } - - - /** - * Returns true if the newer Entity AI code should be run - */ - @Override - protected boolean isAIEnabled() - { - return true; - } - - - /** - * Set monster attributes - */ - @Override - protected void applyEntityAttributes() - { - super.applyEntityAttributes(); - this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(30.0D); // max health - this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.28D); // movement speed - this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(4.0D); // attack damage - } - - @Override - protected void entityInit() - { - super.entityInit(); - dataWatcher.addObject(DATA_EQUIP, Byte.valueOf((byte)0)); - } - - public boolean hasArmor() - { - return (dataWatcher.getWatchableObjectByte(DATA_EQUIP) & 1) > 0; - } - - public void setHasArmor(boolean flag) - { - byte otherFlags = dataWatcher.getWatchableObjectByte(DATA_EQUIP); - otherFlags &= 126; - - if (flag) - { - dataWatcher.updateObject(DATA_EQUIP, Byte.valueOf((byte) (otherFlags | 1))); - } - else - { - dataWatcher.updateObject(DATA_EQUIP, Byte.valueOf((byte)otherFlags)); - } - } - - public boolean hasShield() - { - return (dataWatcher.getWatchableObjectByte(DATA_EQUIP) & 2) > 0; - } - - public void setHasShield(boolean flag) - { - byte otherFlags = dataWatcher.getWatchableObjectByte(DATA_EQUIP); - otherFlags &= 125; - - if (flag) - { - dataWatcher.updateObject(DATA_EQUIP, Byte.valueOf((byte) (otherFlags | 2))); - } - else - { - dataWatcher.updateObject(DATA_EQUIP, Byte.valueOf((byte)otherFlags)); - } - } - - /** - * (abstract) Protected helper method to write subclass entity data to NBT. - */ - @Override - public void writeEntityToNBT(NBTTagCompound par1NBTTagCompound) - { - super.writeEntityToNBT(par1NBTTagCompound); - par1NBTTagCompound.setBoolean("hasArmor", this.hasArmor()); - par1NBTTagCompound.setBoolean("hasShield", this.hasShield()); - } - - /** - * (abstract) Protected helper method to read subclass entity data from NBT. - */ - @Override - public void readEntityFromNBT(NBTTagCompound par1NBTTagCompound) - { - super.readEntityFromNBT(par1NBTTagCompound); - this.setHasArmor(par1NBTTagCompound.getBoolean("hasArmor")); - this.setHasShield(par1NBTTagCompound.getBoolean("hasShield")); - } - - /** - * Called to update the entity's position/logic. - */ - public void onUpdate() - { - if (this.isEntityAlive()) - { - // synch target with lower goblin - if (this.ridingEntity != null && this.ridingEntity instanceof EntityLiving && this.getAttackTarget() == null) - { - this.setAttackTarget(((EntityLiving) this.ridingEntity).getAttackTarget()); - } - - // keep doing attack timer - if (this.heavySpearTimer > 0) - { - --this.heavySpearTimer; - - if (this.heavySpearTimer == 25) - { - //System.out.println("Landing spear attack in world " + this.worldObj); - - this.landHeavySpearAttack(); - } - } - - // break shield if we're on the ground - if (this.ridingEntity == null && this.hasShield()) - { - this.breakShield(); - } - } - - super.onUpdate(); - } - - @SuppressWarnings("unchecked") - private void landHeavySpearAttack() { - - - // find vector in front of us - Vec3 vector = this.getLookVec(); - - double dist = 1.25; - double px = this.posX + vector.xCoord * dist; - double py = this.boundingBox.minY - 0.75; - double pz = this.posZ + vector.zCoord * dist; - - - for (int i = 0; i < 50; i++) - { - //worldObj.spawnParticle("crit", px + (rand.nextFloat() - rand.nextFloat()) * 0.5F, py + rand.nextFloat(), pz + (rand.nextFloat() - rand.nextFloat()) * 0.5F, 0, 0.5, 0); - worldObj.spawnParticle("largesmoke", px, py, pz, (rand.nextFloat() - rand.nextFloat()) * 0.25F, 0, (rand.nextFloat() - rand.nextFloat()) * 0.25F); - } - - // damage things in front that aren't us or our "mount" - double radius = 1.5D; - - AxisAlignedBB spearBB = AxisAlignedBB.getBoundingBox(px - radius, py - radius, pz - radius, px + radius, py + radius, pz + radius); - - List inBox = worldObj.getEntitiesWithinAABB(Entity.class, spearBB); - - for (Entity entity : inBox) - { - if (this.ridingEntity != null && entity != this.ridingEntity && entity != this) - { - super.attackEntityAsMob(entity); - } - } - - } - - /** - * Returns the amount of damage a mob should deal. - */ - public int getAttackStrength(Entity par1Entity) - { - if (this.heavySpearTimer > 0) - { - return 20; - } - else - { - return 8; - } - } - - - - /** - * Handles updating while being ridden by an entity - */ - public void updateRidden() - { -// if (this.ridingEntity != null) -// { -// this.renderYawOffset = ((EntityLiving)this.ridingEntity).renderYawOffset; -// } - super.updateRidden(); - if (this.ridingEntity != null) - { - this.renderYawOffset = ((EntityLiving)this.ridingEntity).renderYawOffset; - } - } - - - @SideOnly(Side.CLIENT) - public void handleHealthUpdate(byte par1) - { - if (par1 == 4) - { - this.heavySpearTimer = 60; - //this.playSound("mob.irongolem.throw", 1.0F, 1.0F); - } - else - { - super.handleHealthUpdate(par1); - } - } - - - /** - * Swing arm when attacking - */ - @Override - public boolean attackEntityAsMob(Entity par1Entity) { - - if (this.heavySpearTimer > 0) - { - return false; - } - - if (rand.nextInt(2) == 0) - { - // do mega spear attack - this.startHeavySpearAttack(); - - return false; - } - - // normal attack - this.swingItem(); - - //System.out.println("Spear!"); - - return super.attackEntityAsMob(par1Entity); - } - - - private void startHeavySpearAttack() { - //System.out.println("Heavy Spear!"); - - - this.heavySpearTimer = 60; - this.worldObj.setEntityState(this, (byte)4); - } - - - /** - * Called when the entity is attacked. - */ - @Override - public boolean attackEntityFrom(DamageSource par1DamageSource, float damageAmount) { - // don't take suffocation damage while riding - if (par1DamageSource == DamageSource.inWall && this.ridingEntity != null) - { - return false; - } - - // check the angle of attack, if applicable - Entity attacker = null; - if (par1DamageSource.getSourceOfDamage() != null) - { - attacker = par1DamageSource.getSourceOfDamage(); - } - - if (par1DamageSource.getEntity() != null) - { - attacker = par1DamageSource.getEntity(); - } - - if (attacker != null) - { - // determine angle - - double dx = this.posX - attacker.posX; - double dz = this.posZ - attacker.posZ; - float angle = (float)((Math.atan2(dz, dx) * 180D) / Math.PI) - 90F; - - float difference = MathHelper.abs((this.renderYawOffset - angle) % 360); - - //System.out.println("Difference in angle of approach is " + difference); - - // if we have a shield, the shield will take the damage instead - if (this.hasShield() && difference > 150 && difference < 230) - { - if (takeHitOnShield(par1DamageSource, damageAmount)) - { - return false; - } - } - else - { - // unblocked hits may eventually break shield - if (this.hasShield() && rand.nextBoolean()) - { - damageShield(); - } - } - - // break armor? - if (this.hasArmor() && (difference > 300 || difference < 60)) - { - breakArmor(); - } - } - - boolean attackSuccess = super.attackEntityFrom(par1DamageSource, damageAmount); - - if (attackSuccess && this.ridingEntity != null && this.ridingEntity instanceof EntityLiving && attacker != null) - { - ((EntityLiving)this.ridingEntity).knockBack(attacker, damageAmount, 0.1, 0.1); - } - - // - return attackSuccess; - } - - - /** - * Break our armor - */ - public void breakArmor() { - this.renderBrokenItemStack(new ItemStack(Items.iron_chestplate)); - this.renderBrokenItemStack(new ItemStack(Items.iron_chestplate)); - this.renderBrokenItemStack(new ItemStack(Items.iron_chestplate)); - - this.setHasArmor(false); - } - - /** - * Break our shield - */ - public void breakShield() { - - this.renderBrokenItemStack(new ItemStack(Items.iron_chestplate)); - this.renderBrokenItemStack(new ItemStack(Items.iron_chestplate)); - this.renderBrokenItemStack(new ItemStack(Items.iron_chestplate)); - - this.setHasShield(false); - } - - - public boolean takeHitOnShield(DamageSource par1DamageSource, float damageAmount) { - //System.out.println("Hit blocked by shield"); - - if (damageAmount > SHIELD_DAMAGE_THRESHOLD && !this.worldObj.isRemote) - { - damageShield(); - } - else - { - this.worldObj.playSoundAtEntity(this, "random.break", 1.0F, ((this.rand.nextFloat() - this.rand.nextFloat()) * 0.7F + 1.0F) * 2.0F); - } - - - // knock back slightly - EntityLiving toKnockback = (this.ridingEntity != null && this.ridingEntity instanceof EntityLiving) ? (EntityLiving)this.ridingEntity : this; - - if (par1DamageSource.getEntity() != null) - { - double d0 = par1DamageSource.getEntity().posX - this.posX; - double d1; - - for (d1 = par1DamageSource.getEntity().posZ - this.posZ; d0 * d0 + d1 * d1 < 1.0E-4D; d1 = (Math.random() - Math.random()) * 0.01D) - { - d0 = (Math.random() - Math.random()) * 0.01D; - } - - toKnockback.knockBack(par1DamageSource.getEntity(), 0, d0 / 4D, d1 / 4D); - - // also set revenge target - if (par1DamageSource.getEntity() instanceof EntityLiving) - { - this.setRevengeTarget((EntityLiving)par1DamageSource.getEntity()); - } - } - - - return true; - } - - - private void damageShield() { - // door break noise - //this.worldObj.playAuxSFX(1010, MathHelper.floor_double(this.posX), MathHelper.floor_double(this.posY), MathHelper.floor_double(this.posZ), 0); - this.worldObj.playSoundAtEntity(this, "mob.zombie.metal", 0.25F, 0.25F); - - this.shieldHits++; - - if (!worldObj.isRemote && this.shieldHits >= 3) - { - this.breakShield(); - } - } - - /** - * Returns the current armor value as determined by a call to InventoryPlayer.getTotalArmorValue - */ - public int getTotalArmorValue() - { - int armor = super.getTotalArmorValue(); - - if (this.hasArmor()) - { - armor += 20; - } - - if (armor > 20) - { - armor = 20; - } - - return armor; - } - - /** - * Returns the item ID for the item the mob drops on death. - */ - protected Item getDropItem() - { - return TFItems.armorShard; - } - - -} diff --git a/src/main/java/twilightforest/entity/EntityTFHarbingerCube.java b/src/main/java/twilightforest/entity/EntityTFHarbingerCube.java deleted file mode 100644 index bc8372ff2d..0000000000 --- a/src/main/java/twilightforest/entity/EntityTFHarbingerCube.java +++ /dev/null @@ -1,49 +0,0 @@ -package twilightforest.entity; - -import twilightforest.entity.ai.EntityAITFGiantAttackOnCollide; -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.ai.EntityAIHurtByTarget; -import net.minecraft.entity.ai.EntityAILookIdle; -import net.minecraft.entity.ai.EntityAINearestAttackableTarget; -import net.minecraft.entity.ai.EntityAISwimming; -import net.minecraft.entity.ai.EntityAIWander; -import net.minecraft.entity.ai.EntityAIWatchClosest; -import net.minecraft.entity.monster.EntityMob; -import net.minecraft.entity.monster.EntityZombie; -import net.minecraft.entity.passive.EntityPig; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.world.World; - - -public class EntityTFHarbingerCube extends EntityMob { - - public EntityTFHarbingerCube(World world) { - super(world); - - this.setSize(1.9F, 2.4F); - - this.tasks.addTask(1, new EntityAISwimming(this)); - - this.tasks.addTask(1, new EntityAIWander(this, 1.0D)); - this.tasks.addTask(2, new EntityAIWatchClosest(this, EntityPlayer.class, 8.0F)); - this.tasks.addTask(2, new EntityAILookIdle(this)); - this.targetTasks.addTask(1, new EntityAIHurtByTarget(this, false)); - this.targetTasks.addTask(2, new EntityAINearestAttackableTarget(this, EntityPlayer.class, 0, true)); - - } - - protected void applyEntityAttributes() { - super.applyEntityAttributes(); - this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(40.0D); - this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.23D); - } - - - /** - * Returns true if the newer Entity AI code should be run - */ - @Override - protected boolean isAIEnabled() { - return true; - } -} diff --git a/src/main/java/twilightforest/entity/EntityTFHedgeSpider.java b/src/main/java/twilightforest/entity/EntityTFHedgeSpider.java deleted file mode 100644 index cf657b843a..0000000000 --- a/src/main/java/twilightforest/entity/EntityTFHedgeSpider.java +++ /dev/null @@ -1,80 +0,0 @@ -package twilightforest.entity; - -import net.minecraft.entity.Entity; -import net.minecraft.entity.monster.EntitySpider; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.util.DamageSource; -import net.minecraft.util.MathHelper; -import net.minecraft.world.World; -import twilightforest.TFAchievementPage; -import twilightforest.TFFeature; - - -/** - * The hedge spider is just like a normal spider, but it can spawn in the daytime. - * - * @author Ben - * - */ -public class EntityTFHedgeSpider extends EntitySpider { - - public EntityTFHedgeSpider(World world) { - super(world); - //texture = TwilightForestMod.MODEL_DIR + "hedgespider.png"; - } - - public EntityTFHedgeSpider(World world, double x, double y, double z) - { - this(world); - this.setPosition(x, y, z); - } - - /** - * Finds the closest player within 16 blocks to attack, or null if this Entity isn't interested in attacking - * (Animals, Spiders at day, peaceful PigZombies). - */ - @Override - protected Entity findPlayerToAttack() - { - // kill at all times! - double var2 = 16.0D; - return this.worldObj.getClosestVulnerablePlayerToEntity(this, var2); - } - - /** - * Checks to make sure the light is not too bright where the mob is spawning - */ - @Override - protected boolean isValidLightLevel() - { - int chunkX = MathHelper.floor_double(posX) >> 4; - int chunkZ = MathHelper.floor_double(posZ) >> 4; - // We're allowed to spawn in bright light only in hedge mazes. - if (TFFeature.getNearestFeature(chunkX, chunkZ, worldObj) == TFFeature.hedgeMaze) - { - return true; - } - else - { - return super.isValidLightLevel(); - } - } - - /** - * Trigger achievement when killed - */ - @Override - public void onDeath(DamageSource par1DamageSource) { - super.onDeath(par1DamageSource); - if (par1DamageSource.getSourceOfDamage() instanceof EntityPlayer) { - ((EntityPlayer)par1DamageSource.getSourceOfDamage()).triggerAchievement(TFAchievementPage.twilightHunter); - // are in a hedge maze? - int chunkX = MathHelper.floor_double(posX) >> 4; - int chunkZ = MathHelper.floor_double(posZ) >> 4; - if (TFFeature.getNearestFeature(chunkX, chunkZ, worldObj) == TFFeature.hedgeMaze) { - // award hedge maze cheevo - ((EntityPlayer)par1DamageSource.getSourceOfDamage()).triggerAchievement(TFAchievementPage.twilightHedge); - } - } - } -} diff --git a/src/main/java/twilightforest/entity/EntityTFHelmetCrab.java b/src/main/java/twilightforest/entity/EntityTFHelmetCrab.java deleted file mode 100644 index d16e09440b..0000000000 --- a/src/main/java/twilightforest/entity/EntityTFHelmetCrab.java +++ /dev/null @@ -1,176 +0,0 @@ -package twilightforest.entity; - -import net.minecraft.block.Block; -import net.minecraft.entity.EnumCreatureAttribute; -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.ai.EntityAIAttackOnCollide; -import net.minecraft.entity.ai.EntityAIHurtByTarget; -import net.minecraft.entity.ai.EntityAILeapAtTarget; -import net.minecraft.entity.ai.EntityAILookIdle; -import net.minecraft.entity.ai.EntityAINearestAttackableTarget; -import net.minecraft.entity.ai.EntityAISwimming; -import net.minecraft.entity.ai.EntityAIWander; -import net.minecraft.entity.ai.EntityAIWatchClosest; -import net.minecraft.entity.monster.EntityMob; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Items; -import net.minecraft.item.Item; -import net.minecraft.util.DamageSource; -import net.minecraft.world.World; -import twilightforest.TFAchievementPage; -import twilightforest.item.TFItems; - - -public class EntityTFHelmetCrab extends EntityMob { - - - public EntityTFHelmetCrab(World world) - { - super(world); - //texture = TwilightForestMod.MODEL_DIR + "helmetcrab.png"; - //moveSpeed = 0.28F; - setSize(0.8F, 1.1F); - - this.tasks.addTask(0, new EntityAISwimming(this)); - this.tasks.addTask(2, new EntityAILeapAtTarget(this, 0.28F)); - this.tasks.addTask(3, new EntityAIAttackOnCollide(this, EntityPlayer.class, 1.0D, false)); - this.tasks.addTask(6, new EntityAIWander(this, 1.0D)); - this.tasks.addTask(7, new EntityAIWatchClosest(this, EntityPlayer.class, 8.0F)); - this.tasks.addTask(7, new EntityAILookIdle(this)); - this.targetTasks.addTask(1, new EntityAIHurtByTarget(this, true)); - this.targetTasks.addTask(2, new EntityAINearestAttackableTarget(this, EntityPlayer.class, 0, true)); - - } - - public EntityTFHelmetCrab(World world, double x, double y, double z) - { - this(world); - this.setPosition(x, y, z); - } - - @Override - protected void entityInit() - { - super.entityInit(); - } - - /** - * Returns true if the newer Entity AI code should be run - */ - @Override - protected boolean isAIEnabled() - { - return true; - } - - /** - * Set monster attributes - */ - @Override - protected void applyEntityAttributes() - { - super.applyEntityAttributes(); - this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(13.0D); // max health - this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.28D); // movement speed - this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(3.0D); // attack damage - } - - - - @Override - protected String getLivingSound() - { - return null; - } - - /** - * Returns the sound this mob makes when it is hurt. - */ - protected String getHurtSound() - { - return "mob.spider.say"; - } - - /** - * Returns the sound this mob makes on death. - */ - protected String getDeathSound() - { - return "mob.spider.death"; - } - - /** - * Plays step sound at given x, y, z for the entity - */ - protected void func_145780_a(int par1, int par2, int par3, Block par4) - { - this.playSound("mob.spider.step", 0.15F, 1.0F); - } - - /** - * Returns the item ID for the item the mob drops on death. - */ - protected Item getDropItem() - { - return TFItems.armorShard; - } - - @Override - protected void dropFewItems(boolean flag, int i) - { - super.dropFewItems(flag, i); - - if (rand.nextInt(2) == 0) - { - this.dropItem(Items.fish, 1 + i); - } - } - - - /** - * Trigger achievement when killed - */ - @Override - public void onDeath(DamageSource par1DamageSource) { - super.onDeath(par1DamageSource); - if (par1DamageSource.getSourceOfDamage() instanceof EntityPlayer) { - ((EntityPlayer)par1DamageSource.getSourceOfDamage()).triggerAchievement(TFAchievementPage.twilightHunter); - } - } - - - /** - * Will return how many at most can spawn in a chunk at once. - */ - @Override - public int getMaxSpawnedInChunk() - { - return 8; - } - - - /** - * Get this Entity's EnumCreatureAttribute - */ - public EnumCreatureAttribute getCreatureAttribute() - { - return EnumCreatureAttribute.ARTHROPOD; - } - - - /** - * Returns the current armor value as determined by a call to InventoryPlayer.getTotalArmorValue - */ - public int getTotalArmorValue() - { - int i = super.getTotalArmorValue() + 6; - - if (i > 20) - { - i = 20; - } - - return i; - } - -} diff --git a/src/main/java/twilightforest/entity/EntityTFHostileWolf.java b/src/main/java/twilightforest/entity/EntityTFHostileWolf.java deleted file mode 100644 index d2112480d0..0000000000 --- a/src/main/java/twilightforest/entity/EntityTFHostileWolf.java +++ /dev/null @@ -1,132 +0,0 @@ -package twilightforest.entity; - -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.ai.EntityAINearestAttackableTarget; -import net.minecraft.entity.monster.IMob; -import net.minecraft.entity.passive.EntityWolf; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.util.DamageSource; -import net.minecraft.util.MathHelper; -import net.minecraft.world.EnumDifficulty; -import net.minecraft.world.EnumSkyBlock; -import net.minecraft.world.World; -import twilightforest.TFAchievementPage; -import twilightforest.TFFeature; - - -public class EntityTFHostileWolf extends EntityWolf implements IMob { - - public EntityTFHostileWolf(World world) { - super(world); - setAngry(true); - - this.targetTasks.addTask(4, new EntityAINearestAttackableTarget(this, EntityPlayer.class, 0, true)); - } - - public EntityTFHostileWolf(World world, double x, double y, double z) - { - this(world); - this.setPosition(x, y, z); - } - - - /** - * Set monster attributes - */ - @Override - protected void applyEntityAttributes() - { - super.applyEntityAttributes(); - this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(10.0D); // max health - } - - @Override - public void onUpdate() - { - super.onUpdate(); - if(!worldObj.isRemote && worldObj.difficultySetting == EnumDifficulty.PEACEFUL) - { - setDead(); - } - } - - /** - * Trigger achievement when killed - */ - @Override - public void onDeath(DamageSource par1DamageSource) { - super.onDeath(par1DamageSource); - if (par1DamageSource.getSourceOfDamage() instanceof EntityPlayer) { - ((EntityPlayer)par1DamageSource.getSourceOfDamage()).triggerAchievement(TFAchievementPage.twilightHunter); - } - } - - /** - * Checks if the entity's current position is a valid location to spawn this entity. - */ - @Override - public boolean getCanSpawnHere() - { - // are we near a hedge maze? - int chunkX = MathHelper.floor_double(posX) >> 4; - int chunkZ = MathHelper.floor_double(posZ) >> 4; - if (TFFeature.getNearestFeature(chunkX, chunkZ, worldObj) == TFFeature.hedgeMaze) { - // don't check light level - return worldObj.checkNoEntityCollision(boundingBox) && worldObj.getCollidingBoundingBoxes(this, boundingBox).size() == 0 && !worldObj.isAnyLiquid(boundingBox); - } - else { - return isValidLightLevel() && worldObj.checkNoEntityCollision(boundingBox) && worldObj.getCollidingBoundingBoxes(this, boundingBox).size() == 0 && !worldObj.isAnyLiquid(boundingBox); - } - } - - /** - * Checks to make sure the light is not too bright where the mob is spawning - * Copied from EntityMob - */ - protected boolean isValidLightLevel() - { - int var1 = MathHelper.floor_double(this.posX); - int var2 = MathHelper.floor_double(this.boundingBox.minY); - int var3 = MathHelper.floor_double(this.posZ); - - if (this.worldObj.getSavedLightValue(EnumSkyBlock.Sky, var1, var2, var3) > this.rand.nextInt(32)) - { - return false; - } - else - { - int var4 = this.worldObj.getBlockLightValue(var1, var2, var3); - - if (this.worldObj.isThundering()) - { - int var5 = this.worldObj.skylightSubtracted; - this.worldObj.skylightSubtracted = 10; - var4 = this.worldObj.getBlockLightValue(var1, var2, var3); - this.worldObj.skylightSubtracted = var5; - } - - return var4 <= this.rand.nextInt(8); - } - } - - /** - * Checks if the parameter is an item which this animal can be fed to breed it (wheat, carrots or seeds depending on - * the animal type) - */ - @Override - public boolean isBreedingItem(ItemStack par1ItemStack) - { - return false; - } - - /** - * Called when a player interacts with a mob. e.g. gets milk from a cow, gets into the saddle on a pig. - */ - @Override - public boolean interact(EntityPlayer par1EntityPlayer) - { - return false; - } - -} diff --git a/src/main/java/twilightforest/entity/EntityTFIceExploder.java b/src/main/java/twilightforest/entity/EntityTFIceExploder.java deleted file mode 100644 index 889f63f892..0000000000 --- a/src/main/java/twilightforest/entity/EntityTFIceExploder.java +++ /dev/null @@ -1,274 +0,0 @@ -package twilightforest.entity; - -import net.minecraft.block.Block; -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.ai.EntityAIAttackOnCollide; -import net.minecraft.entity.ai.EntityAIHurtByTarget; -import net.minecraft.entity.ai.EntityAILookIdle; -import net.minecraft.entity.ai.EntityAINearestAttackableTarget; -import net.minecraft.entity.ai.EntityAISwimming; -import net.minecraft.entity.ai.EntityAIWander; -import net.minecraft.entity.ai.EntityAIWatchClosest; -import net.minecraft.entity.item.EntityXPOrb; -import net.minecraft.entity.monster.EntityMob; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.init.Items; -import net.minecraft.item.Item; -import net.minecraft.util.DamageSource; -import net.minecraft.util.MathHelper; -import net.minecraft.world.World; -import twilightforest.TFAchievementPage; -import twilightforest.TwilightForestMod; -import twilightforest.block.TFBlocks; - -public class EntityTFIceExploder extends EntityMob { - - private static final float EXPLOSION_RADIUS = 1; - - - public EntityTFIceExploder(World par1World) { - super(par1World); - - this.tasks.addTask(0, new EntityAISwimming(this)); - this.tasks.addTask(1, new EntityAIAttackOnCollide(this, EntityPlayer.class, 1.0D, false)); - this.tasks.addTask(2, new EntityAIWander(this, 1.0D)); - this.tasks.addTask(3, new EntityAIWatchClosest(this, EntityPlayer.class, 8.0F)); - this.tasks.addTask(3, new EntityAILookIdle(this)); - this.targetTasks.addTask(1, new EntityAIHurtByTarget(this, true)); - this.targetTasks.addTask(2, new EntityAINearestAttackableTarget(this, EntityPlayer.class, 0, true)); - this.setSize(0.8F, 1.8F); - } - - - protected void applyEntityAttributes() - { - super.applyEntityAttributes(); - this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.23000000417232513D); - this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(3.0D); - } - - - /** - * Returns true if the newer Entity AI code should be run - */ - protected boolean isAIEnabled() - { - return true; - } - - - /** - * Returns the item ID for the item the mob drops on death. - */ - protected Item getDropItem() - { - return Items.snowball; - } - - - /** - * Called frequently so the entity can update its state every tick as required. For example, zombies and skeletons - * use this to react to sunlight and start to burn. - */ - public void onLivingUpdate() - { - super.onLivingUpdate(); - // make snow particles - for (int i = 0; i < 3; i++) { - float px = (this.rand.nextFloat() - this.rand.nextFloat()) * 0.3F; - float py = this.getEyeHeight() + (this.rand.nextFloat() - this.rand.nextFloat()) * 0.5F; - float pz = (this.rand.nextFloat() - this.rand.nextFloat()) * 0.3F; - - TwilightForestMod.proxy.spawnParticle(this.worldObj, "snowguardian", this.lastTickPosX + px, this.lastTickPosY + py, this.lastTickPosZ + pz, 0, 0, 0); - } - - } - - @Override - protected String getLivingSound() - { - return TwilightForestMod.ID + ":mob.ice.noise"; - } - - /** - * Returns the sound this mob makes when it is hurt. - */ - protected String getHurtSound() - { - return TwilightForestMod.ID + ":mob.ice.hurt"; - } - - /** - * Returns the sound this mob makes on death. - */ - protected String getDeathSound() - { - return TwilightForestMod.ID + ":mob.ice.death"; - } - - - - public float getEyeHeight() - { - return this.height * 0.6F; - } - - /** - * Trigger achievement when killed - */ - @Override - public void onDeath(DamageSource par1DamageSource) { - super.onDeath(par1DamageSource); - if (par1DamageSource.getSourceOfDamage() instanceof EntityPlayer) { - ((EntityPlayer)par1DamageSource.getSourceOfDamage()).triggerAchievement(TFAchievementPage.twilightHunter); - } - } - - /** - * handles entity death timer, experience orb and particle creation - */ - protected void onDeathUpdate() { - ++this.deathTime; - - if (this.deathTime == 60) - { - int i; - - - boolean flag = this.worldObj.getGameRules().getGameRuleBooleanValue("mobGriefing"); - this.worldObj.createExplosion(this, this.posX, this.posY, this.posZ, (float)EntityTFIceExploder.EXPLOSION_RADIUS, flag); - - if (flag) { - this.detonate(); - } - - if (!this.worldObj.isRemote && (this.recentlyHit > 0 || this.isPlayer()) && this.func_146066_aG() && this.worldObj.getGameRules().getGameRuleBooleanValue("doMobLoot")) - { - i = this.getExperiencePoints(this.attackingPlayer); - - while (i > 0) - { - int j = EntityXPOrb.getXPSplit(i); - i -= j; - this.worldObj.spawnEntityInWorld(new EntityXPOrb(this.worldObj, this.posX, this.posY, this.posZ, j)); - } - } - - this.setDead(); - - for (i = 0; i < 20; ++i) - { - double d2 = this.rand.nextGaussian() * 0.02D; - double d0 = this.rand.nextGaussian() * 0.02D; - double d1 = this.rand.nextGaussian() * 0.02D; - this.worldObj.spawnParticle("explode", this.posX + (double)(this.rand.nextFloat() * this.width * 2.0F) - (double)this.width, this.posY + (double)(this.rand.nextFloat() * this.height), this.posZ + (double)(this.rand.nextFloat() * this.width * 2.0F) - (double)this.width, d2, d0, d1); - } - } - } - - - private void detonate() { - int range = 4; - - int sx = MathHelper.floor_double(this.posX); - int sy = MathHelper.floor_double(this.posY); - int sz = MathHelper.floor_double(this.posZ); - - for (int dx = -range; dx <= range; dx++) { - for (int dy = -range; dy <= range; dy++) { - for (int dz = -range; dz <= range; dz++) { - double distance = Math.sqrt(dx * dx + dy * dy + dz * dz); - - float randRange = range + (rand.nextFloat() - rand.nextFloat()) * 2F; - - if (distance < randRange) { - this.transformBlock(sx + dx, sy + dy, sz + dz); - } - } - } - } - } - - - private void transformBlock(int x, int y, int z) { - Block block = this.worldObj.getBlock(x, y, z); - int meta = this.worldObj.getBlockMetadata(x, y, z); - - // check if we should even explode this - if (block.getExplosionResistance(this) < 8F && block.getBlockHardness(worldObj, x, y, z) >= 0) { - - int blockColor = 16777215; - - //TODO: use a better check than exception handling to determine if we have access to client-side methods or not - try { - // figure out color - blockColor = block.colorMultiplier(worldObj, x, y, z); - } catch (NoSuchMethodError e) { - // fine, we're on a server - } - - if (blockColor == 16777215) { - blockColor = block.getMapColor(meta).colorValue; - } - - // do appropriate transformation - if (this.shouldTransformGlass(block, x, y, z)) { - this.worldObj.setBlock(x, y, z, Blocks.stained_glass, this.getMetaForColor(blockColor), 3); - } else if (this.shouldTransformClay(block, x, y, z)) { - this.worldObj.setBlock(x, y, z, Blocks.stained_hardened_clay, this.getMetaForColor(blockColor), 3); - } - } - } - - - private boolean shouldTransformClay(Block block, int x, int y, int z) { - return block.isNormalCube(this.worldObj, x, y, z); - } - - - private boolean shouldTransformGlass(Block block, int x, int y, int z) { - return block != Blocks.air && this.isBlockNormalBounds(block, x, y, z) && (!block.getMaterial().isOpaque() || block.isLeaves(this.worldObj, x, y, z) || block == Blocks.ice || block == TFBlocks.auroraBlock); - } - - - private boolean isBlockNormalBounds(Block block, int x, int y, int z) { - return block.getBlockBoundsMaxX() == 1.0F && block.getBlockBoundsMaxY() == 1.0F && block.getBlockBoundsMaxZ() == 1.0F && block.getBlockBoundsMinX() == 0.0F && block.getBlockBoundsMinY() == 0.0F && block.getBlockBoundsMinZ() == 0.0F; - } - - - private int getMetaForColor(int blockColor) { - int red = (blockColor >> 16) & 255; - int green = (blockColor >> 8) & 255; - int blue = blockColor & 255; - - - int bestColor = 0; - int bestDifference = 1024; - - for (int i = 0; i < 15; i++) { - int iColor = Blocks.wool.getMapColor(i).colorValue; - - int iRed = (iColor >> 16) & 255; - int iGreen = (iColor >> 8) & 255; - int iBlue = iColor & 255; - - int difference = Math.abs(red - iRed) + Math.abs(green - iGreen) + Math.abs(blue - iBlue); - - if (difference < bestDifference) { - bestColor = i; - bestDifference = difference; - } - } - - return bestColor; - } - - /** - * Will return how many at most can spawn in a chunk at once. - */ - public int getMaxSpawnedInChunk() - { - return 8; - } -} diff --git a/src/main/java/twilightforest/entity/EntityTFIceShooter.java b/src/main/java/twilightforest/entity/EntityTFIceShooter.java deleted file mode 100644 index 6b01aabd55..0000000000 --- a/src/main/java/twilightforest/entity/EntityTFIceShooter.java +++ /dev/null @@ -1,146 +0,0 @@ -package twilightforest.entity; - -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.IRangedAttackMob; -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.ai.EntityAIArrowAttack; -import net.minecraft.entity.ai.EntityAIHurtByTarget; -import net.minecraft.entity.ai.EntityAILookIdle; -import net.minecraft.entity.ai.EntityAINearestAttackableTarget; -import net.minecraft.entity.ai.EntityAISwimming; -import net.minecraft.entity.ai.EntityAIWander; -import net.minecraft.entity.ai.EntityAIWatchClosest; -import net.minecraft.entity.monster.EntityMob; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Items; -import net.minecraft.item.Item; -import net.minecraft.util.DamageSource; -import net.minecraft.util.MathHelper; -import net.minecraft.world.World; -import twilightforest.TFAchievementPage; -import twilightforest.TwilightForestMod; - -public class EntityTFIceShooter extends EntityMob implements IRangedAttackMob { - - public EntityTFIceShooter(World par1World) { - super(par1World); - - this.tasks.addTask(0, new EntityAISwimming(this)); - this.tasks.addTask(1, new EntityAIArrowAttack(this, 1.25D, 20, 10.0F)); - this.tasks.addTask(2, new EntityAIWander(this, 1.0D)); - this.tasks.addTask(3, new EntityAIWatchClosest(this, EntityPlayer.class, 8.0F)); - this.tasks.addTask(3, new EntityAILookIdle(this)); - this.targetTasks.addTask(1, new EntityAIHurtByTarget(this, true)); - this.targetTasks.addTask(2, new EntityAINearestAttackableTarget(this, EntityPlayer.class, 0, true)); - this.setSize(0.8F, 1.8F); - } - - - protected void applyEntityAttributes() - { - super.applyEntityAttributes(); - this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.23000000417232513D); - this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(3.0D); - } - - - /** - * Returns true if the newer Entity AI code should be run - */ - protected boolean isAIEnabled() - { - return true; - } - - - public float getEyeHeight() - { - return this.height * 0.6F; - } - - /** - * Returns the item ID for the item the mob drops on death. - */ - protected Item getDropItem() - { - return Items.snowball; - } - - - /** - * Called frequently so the entity can update its state every tick as required. For example, zombies and skeletons - * use this to react to sunlight and start to burn. - */ - public void onLivingUpdate() - { - super.onLivingUpdate(); - // make snow particles - for (int i = 0; i < 3; i++) { - float px = (this.rand.nextFloat() - this.rand.nextFloat()) * 0.3F; - float py = this.getEyeHeight() + (this.rand.nextFloat() - this.rand.nextFloat()) * 0.5F; - float pz = (this.rand.nextFloat() - this.rand.nextFloat()) * 0.3F; - - TwilightForestMod.proxy.spawnParticle(this.worldObj, "snowguardian", this.lastTickPosX + px, this.lastTickPosY + py, this.lastTickPosZ + pz, 0, 0, 0); - } - - } - - @Override - protected String getLivingSound() - { - return TwilightForestMod.ID + ":mob.ice.noise"; - } - - /** - * Returns the sound this mob makes when it is hurt. - */ - protected String getHurtSound() - { - return TwilightForestMod.ID + ":mob.ice.hurt"; - } - - /** - * Returns the sound this mob makes on death. - */ - protected String getDeathSound() - { - return TwilightForestMod.ID + ":mob.ice.death"; - } - - /** - * Trigger achievement when killed - */ - @Override - public void onDeath(DamageSource par1DamageSource) { - super.onDeath(par1DamageSource); - if (par1DamageSource.getSourceOfDamage() instanceof EntityPlayer) { - ((EntityPlayer)par1DamageSource.getSourceOfDamage()).triggerAchievement(TFAchievementPage.twilightHunter); - } - } - - - /** - * Will return how many at most can spawn in a chunk at once. - */ - @Override - public int getMaxSpawnedInChunk() - { - return 8; - } - - /** - * Attack the specified entity using a ranged attack. - */ - @Override - public void attackEntityWithRangedAttack(EntityLivingBase par1EntityLivingBase, float par2) - { - EntityTFIceSnowball entitysnowball = new EntityTFIceSnowball(this.worldObj, this); - double d0 = par1EntityLivingBase.posX - this.posX; - double d1 = par1EntityLivingBase.posY + (double)par1EntityLivingBase.getEyeHeight() - 1.100000023841858D - entitysnowball.posY; - double d2 = par1EntityLivingBase.posZ - this.posZ; - float f1 = MathHelper.sqrt_double(d0 * d0 + d2 * d2) * 0.2F; - entitysnowball.setThrowableHeading(d0, d1 + (double)f1, d2, 0.6F, 12.0F); - this.playSound("random.bow", 1.0F, 1.0F / (this.getRNG().nextFloat() * 0.4F + 0.8F)); - this.worldObj.spawnEntityInWorld(entitysnowball); - } -} diff --git a/src/main/java/twilightforest/entity/EntityTFIceSnowball.java b/src/main/java/twilightforest/entity/EntityTFIceSnowball.java deleted file mode 100644 index bcd3f58705..0000000000 --- a/src/main/java/twilightforest/entity/EntityTFIceSnowball.java +++ /dev/null @@ -1,102 +0,0 @@ -package twilightforest.entity; - -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.projectile.EntityThrowable; -import net.minecraft.util.DamageSource; -import net.minecraft.util.MovingObjectPosition; -import net.minecraft.world.World; - -public class EntityTFIceSnowball extends EntityThrowable { - - private static final int DAMAGE = 8; - - public EntityTFIceSnowball(World par1World) { - super(par1World); - } - - public EntityTFIceSnowball(World par1World, EntityLivingBase par2EntityLiving) { - super(par1World, par2EntityLiving); - } - - @Override - public void onUpdate() { - super.onUpdate(); - - makeTrail(); - } - - /** - * How much this entity falls each tick - */ - @Override - protected float getGravityVelocity() - { - return 0.006F; - } - - /** - * Make slimy trail - */ - public void makeTrail() { - for (int i = 0; i < 2; i++) { - double dx = posX + 0.5 * (rand.nextDouble() - rand.nextDouble()); - double dy = posY + 0.5 * (rand.nextDouble() - rand.nextDouble()); - double dz = posZ + 0.5 * (rand.nextDouble() - rand.nextDouble()); - worldObj.spawnParticle("snowballpoof", dx, dy, dz, 0.0D, 0.0D, 0.0D); - } - } - - /** - * Reflect! - */ - @Override - public boolean attackEntityFrom(DamageSource damagesource, float i) - { - - setBeenAttacked(); - - pop(); - - return true; - } - - /** - * What happens when we hit something? - */ - @Override - protected void onImpact(MovingObjectPosition par1MovingObjectPosition) { - // only damage living things - if (par1MovingObjectPosition.entityHit != null && par1MovingObjectPosition.entityHit instanceof EntityLivingBase) - { - if (par1MovingObjectPosition.entityHit.attackEntityFrom(DamageSource.causeThrownDamage(this, this.getThrower()), DAMAGE)) - { - // damage armor? - //TODO: - } - } - - pop(); - - } - - /** - * Yeah, do that - */ - protected void pop() { - for (int i = 0; i < 8; ++i) - { - this.worldObj.spawnParticle("snowballpoof", this.posX, this.posY, this.posZ, rand.nextGaussian() * 0.05D, rand.nextDouble() * 0.2D, rand.nextGaussian() * 0.05D); - } - - // noise - //this.worldObj.playSoundAtEntity(this, "mob.slime.big", 1.0F, 1.0F / (rand.nextFloat() * 0.4F + 0.8F)); - - - if (!this.worldObj.isRemote) - { - this.setDead(); - } - } - - -} diff --git a/src/main/java/twilightforest/entity/EntityTFKingSpider.java b/src/main/java/twilightforest/entity/EntityTFKingSpider.java deleted file mode 100644 index e8d53fd0b0..0000000000 --- a/src/main/java/twilightforest/entity/EntityTFKingSpider.java +++ /dev/null @@ -1,123 +0,0 @@ -package twilightforest.entity; - -import net.minecraft.entity.Entity; -import net.minecraft.entity.IEntityLivingData; -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.ai.EntityAIAttackOnCollide; -import net.minecraft.entity.ai.EntityAIHurtByTarget; -import net.minecraft.entity.ai.EntityAILeapAtTarget; -import net.minecraft.entity.ai.EntityAILookIdle; -import net.minecraft.entity.ai.EntityAINearestAttackableTarget; -import net.minecraft.entity.ai.EntityAIWander; -import net.minecraft.entity.ai.EntityAIWatchClosest; -import net.minecraft.entity.monster.EntitySpider; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.world.World; - -public class EntityTFKingSpider extends EntitySpider { - - public EntityTFKingSpider(World world) { - super(world); - //texture = TwilightForestMod.MODEL_DIR + "kingspider.png"; - this.setSize(1.6F, 1.6F); - //this.moveSpeed = 0.35F; - - this.getNavigator().setAvoidsWater(true); - //this.tasks.addTask(1, new EntityAITFChargeAttack(this, 0.4F)); - this.tasks.addTask(2, new EntityAIAttackOnCollide(this, EntityPlayer.class, 1.0D, false)); - this.tasks.addTask(3, new EntityAILeapAtTarget(this, 0.3F)); - this.tasks.addTask(6, new EntityAIWander(this, 0.2F)); - this.tasks.addTask(7, new EntityAIWatchClosest(this, EntityPlayer.class, 6.0F)); - this.tasks.addTask(8, new EntityAILookIdle(this)); - this.targetTasks.addTask(2, new EntityAIHurtByTarget(this, false)); - this.targetTasks.addTask(2, new EntityAINearestAttackableTarget(this, EntityPlayer.class, 0, true)); - - } - - /** - * Returns true if the newer Entity AI code should be run - */ - @Override - protected boolean isAIEnabled() - { - return true; - } - - /** - * Set monster attributes - */ - @Override - protected void applyEntityAttributes() - { - super.applyEntityAttributes(); - this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(30.0D); // max health - this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.35D); // movement speed - this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(6.0D); // attack damage - } - - - /** - * Finds the closest player within 16 blocks to attack, or null if this Entity isn't interested in attacking - * (Animals, Spiders at day, peaceful PigZombies). - */ - @Override - protected Entity findPlayerToAttack() - { - // kill at all times! - double var2 = 16.0D; - return this.worldObj.getClosestVulnerablePlayerToEntity(this, var2); - } - - /** - * How large the spider should be scaled. - */ - //@Override - public float spiderScaleAmount() - { - return 1.9F; - } - - /** - * Actually only used for the shadow - */ - @Override - public float getRenderSizeModifier() { - return 2.0F; - } - - - /** - * returns true if this entity is by a ladder, false otherwise - */ - public boolean isOnLadder() - { - // let's not climb - return false; - } - - /** - * Init creature with mount - */ - public IEntityLivingData onSpawnWithEgg(IEntityLivingData par1EntityLivingData) - { - Object par1EntityLivingData1 = super.onSpawnWithEgg(par1EntityLivingData); - - // always a spider jockey - EntityTFSkeletonDruid druid = new EntityTFSkeletonDruid(this.worldObj); - druid.setLocationAndAngles(this.posX, this.posY, this.posZ, this.rotationYaw, 0.0F); - druid.onSpawnWithEgg((IEntityLivingData)null); - this.worldObj.spawnEntityInWorld(druid); - druid.mountEntity(this); - - return (IEntityLivingData)par1EntityLivingData1; - } - - /** - * Returns the Y offset from the entity's position for any entity riding this one. - */ - public double getMountedYOffset() - { - return (double)this.height * 0.5D; - } - -} diff --git a/src/main/java/twilightforest/entity/EntityTFKobold.java b/src/main/java/twilightforest/entity/EntityTFKobold.java deleted file mode 100644 index a82df12414..0000000000 --- a/src/main/java/twilightforest/entity/EntityTFKobold.java +++ /dev/null @@ -1,187 +0,0 @@ -package twilightforest.entity; - -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.ai.EntityAIAttackOnCollide; -import net.minecraft.entity.ai.EntityAIHurtByTarget; -import net.minecraft.entity.ai.EntityAILeapAtTarget; -import net.minecraft.entity.ai.EntityAILookIdle; -import net.minecraft.entity.ai.EntityAINearestAttackableTarget; -import net.minecraft.entity.ai.EntityAISwimming; -import net.minecraft.entity.ai.EntityAIWander; -import net.minecraft.entity.ai.EntityAIWatchClosest; -import net.minecraft.entity.monster.EntityMob; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Items; -import net.minecraft.item.Item; -import net.minecraft.util.DamageSource; -import net.minecraft.world.World; -import twilightforest.TFAchievementPage; -import twilightforest.TwilightForestMod; -import twilightforest.entity.ai.EntityAITFFlockToSameKind; -import twilightforest.entity.ai.EntityAITFPanicOnFlockDeath; - - -public class EntityTFKobold extends EntityMob { - - - private boolean shy; - - public EntityTFKobold(World world) - { - super(world); - //texture = TwilightForestMod.MODEL_DIR + "kobold.png"; - //moveSpeed = 0.28F; - setSize(0.8F, 1.1F); - - shy = true; - - this.tasks.addTask(0, new EntityAISwimming(this)); - this.tasks.addTask(1, new EntityAITFPanicOnFlockDeath(this, 2.0F)); - this.tasks.addTask(2, new EntityAILeapAtTarget(this, 0.3F)); - this.tasks.addTask(3, new EntityAIAttackOnCollide(this, EntityPlayer.class, 1.0D, false)); - this.tasks.addTask(4, new EntityAITFFlockToSameKind(this, 1.0D)); - this.tasks.addTask(6, new EntityAIWander(this, 1.0D)); - this.tasks.addTask(7, new EntityAIWatchClosest(this, EntityPlayer.class, 8.0F)); - this.tasks.addTask(7, new EntityAILookIdle(this)); - this.targetTasks.addTask(1, new EntityAIHurtByTarget(this, true)); - this.targetTasks.addTask(2, new EntityAINearestAttackableTarget(this, EntityPlayer.class, 0, true)); - - } - - public EntityTFKobold(World world, double x, double y, double z) - { - this(world); - this.setPosition(x, y, z); - } - - @Override - protected void entityInit() - { - super.entityInit(); - dataWatcher.addObject(17, Byte.valueOf((byte)0)); - } - - /** - * Returns true if the newer Entity AI code should be run - */ - @Override - protected boolean isAIEnabled() - { - return true; - } - - /** - * Set monster attributes - */ - @Override - protected void applyEntityAttributes() - { - super.applyEntityAttributes(); - this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(13.0D); // max health - this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.28D); // movement speed - this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(4.0D); // attack damage - } - - - - @Override - protected String getLivingSound() - { - return TwilightForestMod.ID + ":mob.kobold.kobold"; - } - - @Override - protected String getHurtSound() - { - return TwilightForestMod.ID + ":mob.kobold.hurt"; - } - - @Override - protected String getDeathSound() - { - return TwilightForestMod.ID + ":mob.kobold.die"; - } - - @Override - protected Item getDropItem() - { - return Items.wheat; - } - - @Override - protected void dropFewItems(boolean flag, int i) - { - super.dropFewItems(flag, i); - - if (rand.nextInt(2) == 0) - { - this.dropItem(Items.gold_nugget, 1 + i); - } - } - - public boolean isShy() { - return shy && this.recentlyHit <= 0; - } - - public boolean isPanicked() - { - return dataWatcher.getWatchableObjectByte(17) != 0; - } - - public void setPanicked(boolean flag) - { - if (flag) - { - dataWatcher.updateObject(17, Byte.valueOf((byte)127)); - } - else - { - dataWatcher.updateObject(17, Byte.valueOf((byte)0)); - } - } - - - /** - * Called frequently so the entity can update its state every tick as required. For example, zombies and skeletons - * use this to react to sunlight and start to burn. - */ - @Override - public void onLivingUpdate() - { - super.onLivingUpdate(); - - //when panicked, spawn tears/sweat - if (isPanicked()) - { - for (int i = 0; i < 2; i++) - { - this.worldObj.spawnParticle("splash", this.posX + (this.rand.nextDouble() - 0.5D) * this.width * 0.5, this.posY + this.getEyeHeight(), this.posZ + (this.rand.nextDouble() - 0.5D) * this.width * 0.5, 0, 0, 0); - } - } - - } - - - /** - * Trigger achievement when killed - */ - @Override - public void onDeath(DamageSource par1DamageSource) { - super.onDeath(par1DamageSource); - if (par1DamageSource.getSourceOfDamage() instanceof EntityPlayer) { - ((EntityPlayer)par1DamageSource.getSourceOfDamage()).triggerAchievement(TFAchievementPage.twilightHunter); - } - } - - - /** - * Will return how many at most can spawn in a chunk at once. - */ - @Override - public int getMaxSpawnedInChunk() - { - return 8; - } - - -} diff --git a/src/main/java/twilightforest/entity/EntityTFLoyalZombie.java b/src/main/java/twilightforest/entity/EntityTFLoyalZombie.java deleted file mode 100644 index 422e2edfc1..0000000000 --- a/src/main/java/twilightforest/entity/EntityTFLoyalZombie.java +++ /dev/null @@ -1,185 +0,0 @@ -package twilightforest.entity; - -import net.minecraft.block.Block; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityAgeable; -import net.minecraft.entity.EnumCreatureAttribute; -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.ai.EntityAIAttackOnCollide; -import net.minecraft.entity.ai.EntityAIFollowOwner; -import net.minecraft.entity.ai.EntityAIHurtByTarget; -import net.minecraft.entity.ai.EntityAILeapAtTarget; -import net.minecraft.entity.ai.EntityAILookIdle; -import net.minecraft.entity.ai.EntityAINearestAttackableTarget; -import net.minecraft.entity.ai.EntityAIOwnerHurtByTarget; -import net.minecraft.entity.ai.EntityAIOwnerHurtTarget; -import net.minecraft.entity.ai.EntityAISwimming; -import net.minecraft.entity.ai.EntityAIWander; -import net.minecraft.entity.ai.EntityAIWatchClosest; -import net.minecraft.entity.monster.EntityMob; -import net.minecraft.entity.passive.EntityAnimal; -import net.minecraft.entity.passive.EntityTameable; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.Item; -import net.minecraft.potion.Potion; -import net.minecraft.util.DamageSource; -import net.minecraft.world.World; - - -public class EntityTFLoyalZombie extends EntityTameable { - - public EntityTFLoyalZombie(World par1World) { - super(par1World); - //this.texture = "/mob/zombie.png"; - //this.moveSpeed = 0.3F; - this.setSize(0.6F, 1.8F); - this.getNavigator().setAvoidsWater(true); - this.tasks.addTask(1, new EntityAISwimming(this)); - this.tasks.addTask(3, new EntityAILeapAtTarget(this, 0.4F)); - this.tasks.addTask(4, new EntityAIAttackOnCollide(this, 1.0D, true)); - this.tasks.addTask(5, new EntityAIFollowOwner(this, 1.0D, 10.0F, 2.0F)); - this.tasks.addTask(7, new EntityAIWander(this, 1.0D)); - this.tasks.addTask(9, new EntityAIWatchClosest(this, EntityPlayer.class, 8.0F)); - this.tasks.addTask(9, new EntityAILookIdle(this)); - this.targetTasks.addTask(1, new EntityAIOwnerHurtByTarget(this)); - this.targetTasks.addTask(2, new EntityAIOwnerHurtTarget(this)); - this.targetTasks.addTask(3, new EntityAIHurtByTarget(this, true)); - this.targetTasks.addTask(4, new EntityAINearestAttackableTarget(this, EntityMob.class, 0, true)); - - } - - @Override - public EntityAnimal createChild(EntityAgeable entityanimal) - { - return null; - } - - - /** - * Set monster attributes - */ - @Override - protected void applyEntityAttributes() - { - super.applyEntityAttributes(); - this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(40.0D); // max health - this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.3D); // movement speed - } - - /** - * Rawr! - */ - public boolean attackEntityAsMob(Entity par1Entity) - { - int attackpower = 7; - boolean success = par1Entity.attackEntityFrom(DamageSource.causeMobDamage(this), attackpower); - - // throw some enemies around! - if (success) - { - par1Entity.motionY += 0.2000000059604645D; - } - - return success; - } - - /** - * Called frequently so the entity can update its state every tick as required. For example, zombies and skeletons - * use this to react to sunlight and start to burn. - */ - @Override - public void onLivingUpdate() - { - // once our damage boost effect wears out, start to burn - // the effect here is that we die shortly after our 60 second lifespan - if (!this.worldObj.isRemote && this.getActivePotionEffect(Potion.damageBoost) == null) - { - this.setFire(100); - } - - super.onLivingUpdate(); - } - - - /** - * Determines if an entity can be despawned, used on idle far away entities - */ - @Override - protected boolean canDespawn() - { - return !this.isTamed(); - } - - /** - * Returns the current armor value as determined by a call to InventoryPlayer.getTotalArmorValue - */ - @Override - public int getTotalArmorValue() - { - return 3; - } - - /** - * Returns true if the newer Entity AI code should be run - */ - @Override - protected boolean isAIEnabled() - { - return true; - } - - /** - * Returns the sound this mob makes while it's alive. - */ - @Override - protected String getLivingSound() - { - return "mob.zombie.say"; - } - - /** - * Returns the sound this mob makes when it is hurt. - */ - @Override - protected String getHurtSound() - { - return "mob.zombie.hurt"; - } - - /** - * Returns the sound this mob makes on death. - */ - @Override - protected String getDeathSound() - { - return "mob.zombie.death"; - } - - /** - * Plays step sound at given x, y, z for the entity - */ - @Override - protected void func_145780_a(int par1, int par2, int par3, Block par4) - { - this.worldObj.playSoundAtEntity(this, "mob.zombie.step", 0.15F, 1.0F); - } - - - /** - * Returns the item ID for the item the mob drops on death. - */ - @Override - protected Item getDropItem() - { - return Item.getItemById(0); - } - - /** - * Get this Entity's EnumCreatureAttribute - */ - @Override - public EnumCreatureAttribute getCreatureAttribute() - { - return EnumCreatureAttribute.UNDEAD; - } -} diff --git a/src/main/java/twilightforest/entity/EntityTFMazeSlime.java b/src/main/java/twilightforest/entity/EntityTFMazeSlime.java deleted file mode 100644 index 8015a771b3..0000000000 --- a/src/main/java/twilightforest/entity/EntityTFMazeSlime.java +++ /dev/null @@ -1,142 +0,0 @@ -package twilightforest.entity; - -import net.minecraft.block.Block; -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.monster.EntitySlime; -import net.minecraft.util.MathHelper; -import net.minecraft.world.EnumDifficulty; -import net.minecraft.world.EnumSkyBlock; -import net.minecraft.world.World; -import twilightforest.block.TFBlocks; -import twilightforest.item.TFItems; - -public class EntityTFMazeSlime extends EntitySlime -{ - - private String slimeParticleString; - - public EntityTFMazeSlime(World par1World) { - super(par1World); - //texture = TwilightForestMod.MODEL_DIR + "mazeslime.png"; - this.setSlimeSize(1 << (1 + this.rand.nextInt(2))); - } - - /** - * Make more of meeee - */ - @Override - protected EntitySlime createInstance() - { - return new EntityTFMazeSlime(this.worldObj); - } - - @Override - public void setSlimeSize(int par1) - { - super.setSlimeSize(par1); - this.experienceValue = par1 + 3; - } - - /** - * Checks if the entity's current position is a valid location to spawn this entity. - */ - @Override - public boolean getCanSpawnHere() - { - return this.worldObj.difficultySetting != EnumDifficulty.PEACEFUL && this.worldObj.checkNoEntityCollision(this.boundingBox) - && this.worldObj.getCollidingBoundingBoxes(this, this.boundingBox).isEmpty() - && !this.worldObj.isAnyLiquid(this.boundingBox) && this.isValidLightLevel(); - } - - /** - * Set monster attributes - */ - @Override - protected void applyEntityAttributes() - { - super.applyEntityAttributes(); - int size = this.getSlimeSize(); - this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(2.0D * size * size); // max health - } - - /** - * Indicates weather the slime is able to damage the player (based upon the slime's size) - */ - @Override - protected boolean canDamagePlayer() - { - return true; - } - - /** - * Gets the amount of damage dealt to the player when "attacked" by the slime. - */ - @Override - protected int getAttackStrength() - { - return super.getAttackStrength() + 3; - } - - - /** - * Returns the name of a particle effect that may be randomly created by EntitySlime.onUpdate() - */ - @Override - protected String getSlimeParticle() - { - if (slimeParticleString == null) - { - slimeParticleString = "blockcrack_" + Block.getIdFromBlock(TFBlocks.mazestone) + "_1"; - } - - return slimeParticleString; - } - - /** - * Checks to make sure the light is not too bright where the mob is spawning - */ - protected boolean isValidLightLevel() - { - int var1 = MathHelper.floor_double(this.posX); - int var2 = MathHelper.floor_double(this.boundingBox.minY); - int var3 = MathHelper.floor_double(this.posZ); - - if (this.worldObj.getSavedLightValue(EnumSkyBlock.Sky, var1, var2, var3) > this.rand.nextInt(32)) - { - return false; - } - else - { - int var4 = this.worldObj.getBlockLightValue(var1, var2, var3); - - if (this.worldObj.isThundering()) - { - int var5 = this.worldObj.skylightSubtracted; - this.worldObj.skylightSubtracted = 10; - var4 = this.worldObj.getBlockLightValue(var1, var2, var3); - this.worldObj.skylightSubtracted = var5; - } - - return var4 <= this.rand.nextInt(8); - } - } - - - /** - * Returns the volume for the sounds this mob makes. - */ - @Override - protected float getSoundVolume() - { - // OH MY GOD, SHUT UP - return 0.1F * this.getSlimeSize(); - } - - - @Override - protected void dropRareDrop(int par1) - { - this.dropItem(TFItems.charmOfKeeping1, 1); - } - -} diff --git a/src/main/java/twilightforest/entity/EntityTFMiniGhast.java b/src/main/java/twilightforest/entity/EntityTFMiniGhast.java deleted file mode 100644 index 2d777fc9ed..0000000000 --- a/src/main/java/twilightforest/entity/EntityTFMiniGhast.java +++ /dev/null @@ -1,172 +0,0 @@ -package twilightforest.entity; - -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.MathHelper; -import net.minecraft.util.Vec3; -import net.minecraft.world.EnumSkyBlock; -import net.minecraft.world.World; - -public class EntityTFMiniGhast extends EntityTFTowerGhast -{ - public boolean isMinion = false; - - public EntityTFMiniGhast(World par1World) { - super(par1World); - this.setSize(1.1F, 1.5F); - //this.texture = TwilightForestMod.MODEL_DIR + "towerghast.png"; - - this.aggroRange = 16.0F; - this.stareRange = 8.0F; - - this.wanderFactor = 4.0F; - - } - - /** - * Will return how many at most can spawn in a chunk at once. - */ - public int getMaxSpawnedInChunk() - { - return 16; - } - - /** - * Set monster attributes - */ - @Override - protected void applyEntityAttributes() - { - super.applyEntityAttributes(); - this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.isMinion ? 6 : 10); // max health - } - - @Override - public void onUpdate() - { - super.onUpdate(); - //byte aggroStatus = this.dataWatcher.getWatchableObjectByte(16); - -// switch (aggroStatus) -// { -// case 0: -// default: -// this.texture = TwilightForestMod.MODEL_DIR + "towerghast.png"; -// break; -// case 1: -// this.texture = TwilightForestMod.MODEL_DIR + "towerghast_openeyes.png"; -// break; -// case 2: -// this.texture = TwilightForestMod.MODEL_DIR + "towerghast_fire.png"; -// break; -// } - } - - /** - * Checks to see if this mini ghast should be attacking this player. - * - * Very similar to endermen code, but we also attack at a certain range - */ - protected boolean shouldAttackPlayer(EntityPlayer par1EntityPlayer) - { - ItemStack playerHeadArmor = par1EntityPlayer.inventory.armorInventory[3]; - - if (playerHeadArmor != null && playerHeadArmor.getItem() == Item.getItemFromBlock(Blocks.pumpkin)) - { - return false; - } - else if (par1EntityPlayer.getDistanceToEntity(this) <= 3.5F && par1EntityPlayer.canEntityBeSeen(this)) - { - return true; - } - else - { - Vec3 var3 = par1EntityPlayer.getLook(1.0F).normalize(); - Vec3 var4 = Vec3.createVectorHelper(this.posX - par1EntityPlayer.posX, this.boundingBox.minY + (double)(this.height / 2.0F) - (par1EntityPlayer.posY + (double)par1EntityPlayer.getEyeHeight()), this.posZ - par1EntityPlayer.posZ); - double var5 = var4.lengthVector(); - var4 = var4.normalize(); - double var7 = var3.dotProduct(var4); - return var7 > 1.0D - 0.025D / var5 ? par1EntityPlayer.canEntityBeSeen(this) : false; - } - } - - - /** - * Checks to make sure the light is not too bright where the mob is spawning - */ - protected boolean isValidLightLevel() - { - if (isMinion) - { - return true; - } - - int myX = MathHelper.floor_double(this.posX); - int myY = MathHelper.floor_double(this.boundingBox.minY); - int myZ = MathHelper.floor_double(this.posZ); - - if (this.worldObj.getSavedLightValue(EnumSkyBlock.Sky, myX, myY, myZ) > this.rand.nextInt(32)) - { - return false; - } - else - { - int lightLevel = this.worldObj.getBlockLightValue(myX, myY, myZ); - - if (this.worldObj.isThundering()) - { - int var5 = this.worldObj.skylightSubtracted; - this.worldObj.skylightSubtracted = 10; - lightLevel = this.worldObj.getBlockLightValue(myX, myY, myZ); - this.worldObj.skylightSubtracted = var5; - } - - return lightLevel <= this.rand.nextInt(8); - } - } - - /** - * Turn this mini ghast into a boss minion - */ - public void makeBossMinion() { - this.wanderFactor = 0.005F; - this.isMinion = true; - - this.setHealth(this.getMaxHealth()); - } - - /** - * Drop 0-2 items of this living's type. @param par1 - Whether this entity has recently been hit by a player. @param - * par2 - Level of Looting used to kill this mob. - */ - protected void dropFewItems(boolean par1, int par2) - { - // no loot from minions - if (!this.isMinion) - { - super.dropFewItems(par1, par2); - } - } - - @Override - public void writeEntityToNBT(NBTTagCompound nbttagcompound) - { - nbttagcompound.setBoolean("isMinion", this.isMinion); - super.writeEntityToNBT(nbttagcompound); - } - - @Override - public void readEntityFromNBT(NBTTagCompound nbttagcompound) - { - super.readEntityFromNBT(nbttagcompound); - if (nbttagcompound.getBoolean("isMinion")) - { - makeBossMinion(); - } - } - -} diff --git a/src/main/java/twilightforest/entity/EntityTFMinotaur.java b/src/main/java/twilightforest/entity/EntityTFMinotaur.java deleted file mode 100644 index c249489fc8..0000000000 --- a/src/main/java/twilightforest/entity/EntityTFMinotaur.java +++ /dev/null @@ -1,225 +0,0 @@ -package twilightforest.entity; - -import net.minecraft.block.Block; -import net.minecraft.entity.Entity; -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.ai.EntityAIAttackOnCollide; -import net.minecraft.entity.ai.EntityAIHurtByTarget; -import net.minecraft.entity.ai.EntityAILookIdle; -import net.minecraft.entity.ai.EntityAINearestAttackableTarget; -import net.minecraft.entity.ai.EntityAISwimming; -import net.minecraft.entity.ai.EntityAIWander; -import net.minecraft.entity.ai.EntityAIWatchClosest; -import net.minecraft.entity.monster.EntityMob; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Items; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.DamageSource; -import net.minecraft.world.World; -import twilightforest.TFAchievementPage; -import twilightforest.entity.ai.EntityAITFChargeAttack; -import twilightforest.item.TFItems; - -public class EntityTFMinotaur extends EntityMob implements ITFCharger { - - public EntityTFMinotaur(World par1World) { - super(par1World); - //this.texture = TwilightForestMod.MODEL_DIR + "minotaur.png"; - //this.moveSpeed = 0.25F; - - this.tasks.addTask(0, new EntityAISwimming(this)); - this.tasks.addTask(2, new EntityAITFChargeAttack(this, 2.0F)); - this.tasks.addTask(3, new EntityAIAttackOnCollide(this, EntityPlayer.class, 1.0D, false)); - this.tasks.addTask(6, new EntityAIWander(this, 1.0D)); - this.tasks.addTask(7, new EntityAIWatchClosest(this, EntityPlayer.class, 8.0F)); - this.tasks.addTask(7, new EntityAILookIdle(this)); - this.targetTasks.addTask(1, new EntityAIHurtByTarget(this, false)); - this.targetTasks.addTask(2, new EntityAINearestAttackableTarget(this, EntityPlayer.class, 0, false)); - - this.setCurrentItemOrArmor(0, new ItemStack(Items.golden_axe)); - } - - /** - * Set monster attributes - */ - @Override - protected void applyEntityAttributes() - { - super.applyEntityAttributes(); - this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(30.0D); // max health - this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.25D); // movement speed - this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(7.0D); // attack damage - } - - - - - @Override - protected void entityInit() - { - super.entityInit(); - dataWatcher.addObject(17, Byte.valueOf((byte)0)); - } - - /** - * Returns true if the newer Entity AI code should be run - */ - @Override - protected boolean isAIEnabled() - { - return true; - } - - public boolean isCharging() - { - return dataWatcher.getWatchableObjectByte(17) != 0; - } - - public void setCharging(boolean flag) - { - if (flag) - { - dataWatcher.updateObject(17, Byte.valueOf((byte)127)); - } - else - { - dataWatcher.updateObject(17, Byte.valueOf((byte)0)); - } - } - - public boolean attackEntityAsMob(Entity par1Entity) - { - boolean success = super.attackEntityAsMob(par1Entity); - - if (success && this.isCharging()) - { - par1Entity.motionY += 0.4000000059604645D; - this.worldObj.playSoundAtEntity(this, "mob.irongolem.throw", 1.0F, 1.0F); - } - - return success; - } - - - /** - * Called frequently so the entity can update its state every tick as required. For example, zombies and skeletons - * use this to react to sunlight and start to burn. - */ - @Override - public void onLivingUpdate() - { - super.onLivingUpdate(); - - //when charging, move legs fast - if (isCharging()) - { - this.limbSwingAmount += 0.6; - } - - } - - /** - * Returns the sound this mob makes while it's alive. - */ - @Override - protected String getLivingSound() - { - return "mob.cow.say"; - } - - /** - * Returns the sound this mob makes when it is hurt. - */ - @Override - protected String getHurtSound() - { - return "mob.cow.hurt"; - } - - /** - * Returns the sound this mob makes on death. - */ - @Override - protected String getDeathSound() - { - return "mob.cow.hurt"; - } - - /** - * Plays step sound at given x, y, z for the entity - */ - @Override - protected void func_145780_a(int par1, int par2, int par3, Block par4) - { - this.worldObj.playSoundAtEntity(this, "mob.cow.step", 0.15F, 0.8F); - } - - /** - * Gets the pitch of living sounds in living entities. - */ - @Override - protected float getSoundPitch() - { - return (this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F + 0.7F; - } - - /** - * Returns the item ID for the item the mob drops on death. - */ - @Override - protected Item getDropItem() - { - return TFItems.meefRaw; - } - - /** - * Drop 0-2 items of this living's type - */ - @Override - protected void dropFewItems(boolean par1, int par2) - { - int numDrops = this.rand.nextInt(2) + this.rand.nextInt(1 + par2); - - for (int i = 0; i < numDrops; ++i) - { - if (this.isBurning()) - { - this.dropItem(TFItems.meefSteak, 1); - } - else - { - this.dropItem(TFItems.meefRaw, 1); - } - } - } - - @Override - protected void dropRareDrop(int par1) - { - this.dropItem(TFItems.mazeMapFocus, 1); - } - - -// /** -// * Initialize this creature. -// */ -// @Override -// public void initCreature() -// { -// //this.func_82164_bB(); -// this.func_82162_bC(); -// } - - /** - * Trigger achievement when killed - */ - @Override - public void onDeath(DamageSource par1DamageSource) { - super.onDeath(par1DamageSource); - if (par1DamageSource.getSourceOfDamage() instanceof EntityPlayer) { - ((EntityPlayer)par1DamageSource.getSourceOfDamage()).triggerAchievement(TFAchievementPage.twilightHunter); - } - } - -} diff --git a/src/main/java/twilightforest/entity/EntityTFMistWolf.java b/src/main/java/twilightforest/entity/EntityTFMistWolf.java deleted file mode 100644 index 0d34aa214a..0000000000 --- a/src/main/java/twilightforest/entity/EntityTFMistWolf.java +++ /dev/null @@ -1,85 +0,0 @@ -package twilightforest.entity; - -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.potion.Potion; -import net.minecraft.potion.PotionEffect; -import net.minecraft.util.DamageSource; -import net.minecraft.world.EnumDifficulty; -import net.minecraft.world.World; - -public class EntityTFMistWolf extends EntityTFHostileWolf { - - public EntityTFMistWolf(World world) { - super(world); - this.setSize(1.4F, 1.9F); - - //this.texture = TwilightForestMod.MODEL_DIR + "mistwolf.png"; - } - - /** - * Set monster attributes - */ - @Override - protected void applyEntityAttributes() - { - super.applyEntityAttributes(); - this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(30.0D); // max health - } - - /** - * Returns the amount of damage a mob should deal. - */ - public int getAttackStrength(Entity par1Entity) - { - return 6; - } - - public boolean attackEntityAsMob(Entity par1Entity) - { - int damage = this.getAttackStrength(par1Entity); - if (par1Entity.attackEntityFrom(DamageSource.causeMobDamage(this), damage)) - { - float myBrightness = this.getBrightness(1.0F); - - //System.out.println("Biting and brightness is " + myBrightness); - - if (par1Entity instanceof EntityLivingBase && myBrightness < 0.10F) - { - byte effectDuration = 0; - - if (this.worldObj.difficultySetting != EnumDifficulty.EASY) - { - if (this.worldObj.difficultySetting == EnumDifficulty.NORMAL) - { - effectDuration = 7; - } - else if (this.worldObj.difficultySetting == EnumDifficulty.HARD) - { - effectDuration = 15; - } - } - - if (effectDuration > 0) - { - ((EntityLivingBase)par1Entity).addPotionEffect(new PotionEffect(Potion.blindness.id, effectDuration * 20, 0)); - } - } - - return true; - } - else - { - return false; - } - } - - /** - * Gets the pitch of living sounds in living entities. - */ - protected float getSoundPitch() - { - return (this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F + 0.6F; - } -} diff --git a/src/main/java/twilightforest/entity/EntityTFMoonwormShot.java b/src/main/java/twilightforest/entity/EntityTFMoonwormShot.java deleted file mode 100644 index 26cd8280d3..0000000000 --- a/src/main/java/twilightforest/entity/EntityTFMoonwormShot.java +++ /dev/null @@ -1,145 +0,0 @@ -package twilightforest.entity; - -import net.minecraft.block.Block; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.projectile.EntityThrowable; -import net.minecraft.util.DamageSource; -import net.minecraft.util.MovingObjectPosition; -import net.minecraft.util.MovingObjectPosition.MovingObjectType; -import net.minecraft.world.World; -import twilightforest.block.TFBlocks; -import twilightforest.item.TFItems; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - - -public class EntityTFMoonwormShot extends EntityThrowable { - - public EntityTFMoonwormShot(World par1World, double par2, double par4, double par6) { - super(par1World, par2, par4, par6); - // TODO Auto-generated constructor stub - } - - public EntityTFMoonwormShot(World par1World, EntityLivingBase par2EntityLiving) { - super(par1World, par2EntityLiving); - // TODO Auto-generated constructor stub - } - - public EntityTFMoonwormShot(World par1World) { - super(par1World); - // TODO Auto-generated constructor stub - } - - - /** - * projectile speed - */ - protected float func_40077_c() - { - return 0.5F; - } - - - @Override - public void onUpdate() { - super.onUpdate(); - - makeTrail(); - } - - /** - * Gets how bright this entity is. - */ - @Override - public float getBrightness(float par1) - { - return 1.0F; - } - - @Override - @SideOnly(Side.CLIENT) - public int getBrightnessForRender(float par1) - { - return 15728880; - } - - - - public void makeTrail() { -// for (int i = 0; i < 5; i++) { -// double dx = posX + 0.5 * (rand.nextDouble() - rand.nextDouble()); -// double dy = posY + 0.5 * (rand.nextDouble() - rand.nextDouble()); -// double dz = posZ + 0.5 * (rand.nextDouble() - rand.nextDouble()); -// -// double s1 = ((rand.nextFloat() * 0.5F) + 0.5F) * 0.17F; -// double s2 = ((rand.nextFloat() * 0.5F) + 0.5F) * 0.80F; -// double s3 = ((rand.nextFloat() * 0.5F) + 0.5F) * 0.69F; -// -// worldObj.spawnParticle("mobSpell", dx, dy, dz, s1, s2, s3); -// } - } - - /** - * Returns true if other Entities should be prevented from moving through this Entity. - */ - @Override - public boolean canBeCollidedWith() - { - return true; - } - - /** - * We need to set this so that the player can attack and reflect the bolt - */ - @Override - public float getCollisionBorderSize() - { - return 1.0F; - } - - /** - * How much this entity falls each tick - */ - @Override - protected float getGravityVelocity() - { - return 0.03F; - } - - @Override - protected void onImpact(MovingObjectPosition mop) { - - // did we hit a block? Make a worm there! - - if (mop.typeOfHit == MovingObjectType.BLOCK) - { - if (!worldObj.isRemote) - { - TFItems.moonwormQueen.onItemUse(null, (EntityPlayer)this.getThrower(), this.worldObj, mop.blockX, mop.blockY, mop.blockZ, mop.sideHit, 0, 0, 0); - } - else - { - //particles - - } - } - - if (mop.entityHit != null) - { - mop.entityHit.attackEntityFrom(DamageSource.causeThrownDamage(this, this.getThrower()), 0); - } - - for (int var3 = 0; var3 < 8; ++var3) - { - this.worldObj.spawnParticle("blockcrack_" + Block.getIdFromBlock(TFBlocks.moonworm) + "_0", this.posX, this.posY, this.posZ, 0.0D, 0.0D, 0.0D); - } - - if (!this.worldObj.isRemote) - { - this.setDead(); - } - } - - -} diff --git a/src/main/java/twilightforest/entity/EntityTFMosquitoSwarm.java b/src/main/java/twilightforest/entity/EntityTFMosquitoSwarm.java deleted file mode 100644 index 668057aa24..0000000000 --- a/src/main/java/twilightforest/entity/EntityTFMosquitoSwarm.java +++ /dev/null @@ -1,146 +0,0 @@ -package twilightforest.entity; - -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.ai.EntityAIAttackOnCollide; -import net.minecraft.entity.ai.EntityAIHurtByTarget; -import net.minecraft.entity.ai.EntityAINearestAttackableTarget; -import net.minecraft.entity.ai.EntityAISwimming; -import net.minecraft.entity.ai.EntityAIWander; -import net.minecraft.entity.monster.EntityMob; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.potion.Potion; -import net.minecraft.potion.PotionEffect; -import net.minecraft.util.DamageSource; -import net.minecraft.util.MathHelper; -import net.minecraft.world.EnumDifficulty; -import net.minecraft.world.World; -import twilightforest.TFAchievementPage; -import twilightforest.TwilightForestMod; -import twilightforest.biomes.TFBiomeBase; - -public class EntityTFMosquitoSwarm extends EntityMob { - - public EntityTFMosquitoSwarm(World par1World) { - super(par1World); - - setSize(.7F, 1.9F); - this.stepHeight = 2.1f; - - this.tasks.addTask(0, new EntityAISwimming(this)); - this.tasks.addTask(3, new EntityAIAttackOnCollide(this, EntityPlayer.class, 1.0D, false)); - this.tasks.addTask(6, new EntityAIWander(this, 1.0D)); - this.targetTasks.addTask(1, new EntityAIHurtByTarget(this, true)); - this.targetTasks.addTask(2, new EntityAINearestAttackableTarget(this, EntityPlayer.class, 0, true)); - } - - - /** - * Returns true if the newer Entity AI code should be run - */ - @Override - protected boolean isAIEnabled() - { - return true; - } - - /** - * Set monster attributes - */ - @Override - protected void applyEntityAttributes() - { - super.applyEntityAttributes(); - this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(12.0D); // max health - this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.23D); // movement speed - this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(3.0D); // attack damage - } - - - - @Override - protected String getLivingSound() - { - return TwilightForestMod.ID + ":mob.mosquito.mosquito"; - } - - - /** - * Like cave spiders, but we add the hunger effect - */ - public boolean attackEntityAsMob(Entity par1Entity) - { - if (super.attackEntityAsMob(par1Entity)) - { - if (par1Entity instanceof EntityLivingBase) - { - byte duration = 7; - - if (this.worldObj.difficultySetting != EnumDifficulty.EASY) - { - if (this.worldObj.difficultySetting == EnumDifficulty.NORMAL) - { - duration = 15; - } - else if (this.worldObj.difficultySetting == EnumDifficulty.HARD) - { - duration = 30; - } - } - - if (duration > 0) - { - ((EntityLivingBase)par1Entity).addPotionEffect(new PotionEffect(Potion.hunger.id, duration * 20, 0)); - } - } - - return true; - } - else - { - return false; - } - } - - - - /** - * We're allowed to spawn in bright light only in swamps - */ - @Override - public boolean getCanSpawnHere() - { - // are we in the swamp - if (worldObj.getBiomeGenForCoords(MathHelper.floor_double(posX), MathHelper.floor_double(posZ)) == TFBiomeBase.tfSwamp) { - // don't check light level - return worldObj.checkNoEntityCollision(boundingBox) && worldObj.getCollidingBoundingBoxes(this, boundingBox).size() == 0; - } - else { - // normal EntityMob spawn check, checks light level - return super.getCanSpawnHere(); - } - } - - /** - * Will return how many at most can spawn in a chunk at once. - */ - @Override - public int getMaxSpawnedInChunk() - { - // we are solitary creatures - return 1; - } - - /** - * Trigger achievement when killed - */ - @Override - public void onDeath(DamageSource par1DamageSource) { - super.onDeath(par1DamageSource); - if (par1DamageSource.getSourceOfDamage() instanceof EntityPlayer) { - ((EntityPlayer)par1DamageSource.getSourceOfDamage()).triggerAchievement(TFAchievementPage.twilightHunter); - } - } - -} diff --git a/src/main/java/twilightforest/entity/EntityTFNatureBolt.java b/src/main/java/twilightforest/entity/EntityTFNatureBolt.java deleted file mode 100644 index a5d6eb73d3..0000000000 --- a/src/main/java/twilightforest/entity/EntityTFNatureBolt.java +++ /dev/null @@ -1,140 +0,0 @@ -package twilightforest.entity; - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.projectile.EntityThrowable; -import net.minecraft.init.Blocks; -import net.minecraft.init.Items; -import net.minecraft.item.ItemStack; -import net.minecraft.potion.Potion; -import net.minecraft.potion.PotionEffect; -import net.minecraft.util.DamageSource; -import net.minecraft.util.MathHelper; -import net.minecraft.util.MovingObjectPosition; -import net.minecraft.world.EnumDifficulty; -import net.minecraft.world.World; - - -public class EntityTFNatureBolt extends EntityThrowable { - - - - private EntityPlayer playerTarget; - - public EntityTFNatureBolt(World par1World, double par2, double par4, double par6) { - super(par1World, par2, par4, par6); - } - - public EntityTFNatureBolt(World par1World, EntityLivingBase par2EntityLiving) { - super(par1World, par2EntityLiving); - } - - public EntityTFNatureBolt(World par1World) { - super(par1World); - } - - - @Override - public void onUpdate() { - super.onUpdate(); - - makeTrail(); - } - - /** - * How much this entity falls each tick - */ - @Override - protected float getGravityVelocity() - { - return 0.003F; - } - - /** - * Make sparkly trail - */ - public void makeTrail() { - for (int i = 0; i < 5; i++) { - double dx = posX + 0.5 * (rand.nextDouble() - rand.nextDouble()); - double dy = posY + 0.5 * (rand.nextDouble() - rand.nextDouble()); - double dz = posZ + 0.5 * (rand.nextDouble() - rand.nextDouble()); - worldObj.spawnParticle("happyVillager", dx, dy, dz, 0.0D, 0.0D, 0.0D); - } - } - - /** - * What happens when we hit something? - */ - @Override - protected void onImpact(MovingObjectPosition par1MovingObjectPosition) { - // only damage living things - if (par1MovingObjectPosition.entityHit != null && par1MovingObjectPosition.entityHit instanceof EntityLivingBase) - { - if (par1MovingObjectPosition.entityHit.attackEntityFrom(DamageSource.causeIndirectMagicDamage(this, this.getThrower()), 2)) - { - // similar to EntityCaveSpider - byte poisonStrength = (byte) (worldObj.difficultySetting == EnumDifficulty.PEACEFUL ? 0 : worldObj.difficultySetting == EnumDifficulty.NORMAL ? 3 : 7); - if(poisonStrength > 0) - { - ((EntityLivingBase)par1MovingObjectPosition.entityHit).addPotionEffect(new PotionEffect(Potion.poison.id, poisonStrength * 20, 0)); - -// System.out.println("Poisoning entityHit " + par1MovingObjectPosition.entityHit); - } - - } - } - - for (int i = 0; i < 8; ++i) - { - this.worldObj.spawnParticle("blockcrack_" + Block.getIdFromBlock(Blocks.leaves) + "_0", this.posX, this.posY, this.posZ, rand.nextGaussian() * 0.05D, rand.nextDouble() * 0.2D, rand.nextGaussian() * 0.05D); - } - - if (!this.worldObj.isRemote) - { - this.setDead(); - - if (par1MovingObjectPosition != null) { - // if we hit a solid block, maybe do our nature burst effect. - int dx = MathHelper.floor_double(par1MovingObjectPosition.blockX); - int dy = MathHelper.floor_double(par1MovingObjectPosition.blockY); - int dz = MathHelper.floor_double(par1MovingObjectPosition.blockZ); - - Material materialHit = worldObj.getBlock(dx, dy, dz).getMaterial(); - - if (materialHit == Material.grass && this.playerTarget != null) - { - Items.dye.onItemUse(new ItemStack(Items.dye, 1, 15), playerTarget, worldObj, dx, dy, dz, 0, 0, 0, 0); - } - else if (materialHit.isSolid() && canReplaceBlock(worldObj, dx, dy, dz)) - { - worldObj.setBlock(dx, dy, dz, Blocks.leaves, 2, 3); - } - } - } - - } - - /** - * This is surprisingly difficult to determine - */ - private boolean canReplaceBlock(World worldObj, int dx, int dy, int dz) - { - Block blockID = worldObj.getBlock(dx, dy, dz); - //int meta = worldObj.getBlockMetadata(dx, dy, dz); - Block blockObj = blockID; - float hardness = blockObj == null ? -1 : blockObj.getBlockHardness(worldObj, dx, dy, dz); - - return hardness >= 0 && hardness < 50F; - } - - public void setTarget(EntityLivingBase attackTarget) - { - if (attackTarget instanceof EntityPlayer) - { - this.playerTarget = (EntityPlayer)attackTarget; - } - } - -} diff --git a/src/main/java/twilightforest/entity/EntityTFPinchBeetle.java b/src/main/java/twilightforest/entity/EntityTFPinchBeetle.java deleted file mode 100644 index 9e303449a0..0000000000 --- a/src/main/java/twilightforest/entity/EntityTFPinchBeetle.java +++ /dev/null @@ -1,288 +0,0 @@ -package twilightforest.entity; - -import net.minecraft.block.Block; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EnumCreatureAttribute; -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.ai.EntityAIAttackOnCollide; -import net.minecraft.entity.ai.EntityAIHurtByTarget; -import net.minecraft.entity.ai.EntityAINearestAttackableTarget; -import net.minecraft.entity.ai.EntityAISwimming; -import net.minecraft.entity.ai.EntityAIWander; -import net.minecraft.entity.ai.EntityAIWatchClosest; -import net.minecraft.entity.monster.EntityMob; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.util.DamageSource; -import net.minecraft.util.Vec3; -import net.minecraft.world.World; -import twilightforest.TFAchievementPage; -import twilightforest.entity.ai.EntityAITFChargeAttack; -import twilightforest.entity.ai.EntityAITFKidnapRider; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public class EntityTFPinchBeetle extends EntityMob -{ - public EntityTFPinchBeetle(World world) { - super(world); - //texture = TwilightForestMod.MODEL_DIR + "pinchbeetle.png"; - //moveSpeed = 0.23F; - setSize(1.2F, 1.1F); - - this.tasks.addTask(0, new EntityAISwimming(this)); - this.tasks.addTask(1, new EntityAITFKidnapRider(this, 2.0F)); - this.tasks.addTask(2, new EntityAITFChargeAttack(this, 2.0F)); - this.tasks.addTask(4, new EntityAIAttackOnCollide(this, EntityPlayer.class, 1.0D, false)); - this.tasks.addTask(6, new EntityAIWander(this, 1.0D)); - this.tasks.addTask(7, new EntityAIWatchClosest(this, EntityPlayer.class, 8.0F)); - //this.tasks.addTask(8, new EntityAILookIdle(this)); - this.targetTasks.addTask(1, new EntityAIHurtByTarget(this, false)); - this.targetTasks.addTask(2, new EntityAINearestAttackableTarget(this, EntityPlayer.class, 0, true)); - } - - - /** - * Returns true if the newer Entity AI code should be run - */ - @Override - protected boolean isAIEnabled() - { - return true; - } - - /** - * Set monster attributes - */ - @Override - protected void applyEntityAttributes() - { - super.applyEntityAttributes(); - this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(40.0D); // max health - this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.23D); // movement speed - this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(4.0D); // attack damage - } - - /** - * Returns the current armor value as determined by a call to InventoryPlayer.getTotalArmorValue - */ - @Override - public int getTotalArmorValue() - { - int var1 = super.getTotalArmorValue() + 2; - - if (var1 > 20) - { - var1 = 20; - } - - return var1; - } - - /** - * Returns the sound this mob makes while it's alive. - */ - @Override - protected String getLivingSound() - { - return null; - } - - /** - * Returns the sound this mob makes when it is hurt. - */ - @Override - protected String getHurtSound() - { - return "mob.spider.say"; - } - - /** - * Returns the sound this mob makes on death. - */ - @Override - protected String getDeathSound() - { - return "mob.spider.death"; - } - - /** - * Plays step sound at given x, y, z for the entity - */ - @Override - protected void func_145780_a(int var1, int var2, int var3, Block var4) - { - this.worldObj.playSoundAtEntity(this, "mob.spider.step", 0.15F, 1.0F); - } - - /** - * Called frequently so the entity can update its state every tick as required. For example, zombies and skeletons - * use this to react to sunlight and start to burn. - */ - @Override - public void onLivingUpdate() - { - if (this.riddenByEntity != null) - { - this.setSize(1.9F, 2.0F); - - // stop player sneaking so that they can't dismount! - if (this.riddenByEntity.isSneaking()) - { - //System.out.println("Pinch beetle sneaking detected!"); - - this.riddenByEntity.setSneaking(false); - } - } - else - { - this.setSize(1.2F, 1.1F); - - } - - super.onLivingUpdate(); - - // look at things in our jaws - if (this.riddenByEntity != null) - { - this.getLookHelper().setLookPositionWithEntity(riddenByEntity, 100F, 100F); - //this.faceEntity(riddenByEntity, 100F, 100F); - - - // push out of user in wall - Vec3 riderPos = this.getRiderPosition(); - this.func_145771_j(riderPos.xCoord, riderPos.yCoord, riderPos.zCoord); // push out of block - - - } - } - - /** - * Trigger achievement when killed - */ - @Override - public void onDeath(DamageSource par1DamageSource) { - super.onDeath(par1DamageSource); - if (par1DamageSource.getSourceOfDamage() instanceof EntityPlayer) { - ((EntityPlayer)par1DamageSource.getSourceOfDamage()).triggerAchievement(TFAchievementPage.twilightHunter); - } - } - - /** - * Attack strength - */ - public int getAttackStrength(Entity par1Entity) - { - return 8; - } - - @Override - @SideOnly(Side.CLIENT) - public float getShadowSize() - { - return 1.1F; - } - - /** - * Pick up things we attack! - */ - @Override - public boolean attackEntityAsMob(Entity par1Entity) - { - if (this.riddenByEntity == null && par1Entity.ridingEntity == null) - { - par1Entity.mountEntity(this); - } - - return super.attackEntityAsMob(par1Entity); - } - - - /** - * Called when a player interacts with a mob. e.g. gets milk from a cow, gets into the saddle on a pig. - */ - @Override - public boolean interact(EntityPlayer par1EntityPlayer) - { - if (super.interact(par1EntityPlayer)) - { - return true; - } -// else if (!this.worldObj.isRemote && (this.riddenByEntity == null || this.riddenByEntity == par1EntityPlayer)) -// { -// par1EntityPlayer.mountEntity(this); -// return true; -// } - else - { - return false; - } - } - - @Override - public float getEyeHeight() { - return 0.25F; - } - - /** - * Get this Entity's EnumCreatureAttribute - */ - @Override - public EnumCreatureAttribute getCreatureAttribute() - { - return EnumCreatureAttribute.ARTHROPOD; - } - - /** - * Put the player out in front of where we are - */ - @Override - public void updateRiderPosition() - { - if (this.riddenByEntity != null) - { - Vec3 riderPos = this.getRiderPosition(); - - this.riddenByEntity.setPosition(riderPos.xCoord, riderPos.yCoord, riderPos.zCoord); - } - } - - /** - * Returns the Y offset from the entity's position for any entity riding this one. - */ - @Override - public double getMountedYOffset() - { - return 0.75D; - } - - /** - * Used to both get a rider position and to push out of blocks - */ - public Vec3 getRiderPosition() - { - if (this.riddenByEntity != null) - { - float distance = 0.9F; - - double var1 = Math.cos((this.rotationYaw + 90) * Math.PI / 180.0D) * distance; - double var3 = Math.sin((this.rotationYaw + 90) * Math.PI / 180.0D) * distance; - - return Vec3.createVectorHelper(this.posX + var1, this.posY + this.getMountedYOffset() + this.riddenByEntity.getYOffset(), this.posZ + var3); - } - else - { - return Vec3.createVectorHelper(this.posX, this.posY, this.posZ); - } - } - - /** - * If a rider of this entity can interact with this entity. Should return true on the - * ridden entity if so. - * - * @return if the entity can be interacted with from a rider - */ - public boolean canRiderInteract() - { - return true; - } -} diff --git a/src/main/java/twilightforest/entity/EntityTFProtectionBox.java b/src/main/java/twilightforest/entity/EntityTFProtectionBox.java deleted file mode 100644 index 7f2b9122d8..0000000000 --- a/src/main/java/twilightforest/entity/EntityTFProtectionBox.java +++ /dev/null @@ -1,87 +0,0 @@ -package twilightforest.entity; - -import net.minecraft.entity.Entity; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.world.World; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public class EntityTFProtectionBox extends Entity { - - public int lifeTime; - public int sizeX; - public int sizeY; - public int sizeZ; - - public EntityTFProtectionBox(World worldObj, int minX, int minY, int minZ, int maxX, int maxY, int maxZ) { - super(worldObj); - - this.setLocationAndAngles(minX, minY, minZ, 0.0F, 0.0F); - - sizeX = Math.abs(maxX - minX) + 1; - sizeY = Math.abs(maxY - minY) + 1; - sizeZ = Math.abs(maxZ - minZ) + 1; - - this.setSize(Math.max(sizeX, sizeZ), sizeY); - - this.lifeTime = 60; - - //System.out.println("Made new box"); - - } - - @Override - public void onUpdate() - { - super.onUpdate(); - - if (lifeTime <= 1) { - setDead(); - } else { - lifeTime--; - } - - } - - /** - * Gets how bright this entity is. - */ - public float getBrightness(float par1) - { - return 1.0F; - } - - @SideOnly(Side.CLIENT) - public int getBrightnessForRender(float par1) - { - return 15728880; - } - - @Override - protected void entityInit() { - // TODO Auto-generated method stub - - } - - @Override - protected void readEntityFromNBT(NBTTagCompound var1) { - // TODO Auto-generated method stub - - } - - @Override - protected void writeEntityToNBT(NBTTagCompound var1) { - // TODO Auto-generated method stub - - } - - /** - * Return whether this entity should be rendered as on fire. - */ - @SideOnly(Side.CLIENT) - public boolean canRenderOnFire() - { - return false; - } - -} diff --git a/src/main/java/twilightforest/entity/EntityTFRedcap.java b/src/main/java/twilightforest/entity/EntityTFRedcap.java deleted file mode 100644 index 6e742ae8c0..0000000000 --- a/src/main/java/twilightforest/entity/EntityTFRedcap.java +++ /dev/null @@ -1,176 +0,0 @@ -package twilightforest.entity; - -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.ai.EntityAIAttackOnCollide; -import net.minecraft.entity.ai.EntityAIAvoidEntity; -import net.minecraft.entity.ai.EntityAIHurtByTarget; -import net.minecraft.entity.ai.EntityAILookIdle; -import net.minecraft.entity.ai.EntityAINearestAttackableTarget; -import net.minecraft.entity.ai.EntityAISwimming; -import net.minecraft.entity.ai.EntityAIWander; -import net.minecraft.entity.ai.EntityAIWatchClosest; -import net.minecraft.entity.item.EntityTNTPrimed; -import net.minecraft.entity.monster.EntityMob; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.init.Items; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.DamageSource; -import net.minecraft.util.MathHelper; -import net.minecraft.world.World; -import twilightforest.TFAchievementPage; -import twilightforest.TFFeature; -import twilightforest.TwilightForestMod; -import twilightforest.entity.ai.EntityAITFRedcapLightTNT; -import twilightforest.entity.ai.EntityAITFRedcapShy; - - -public class EntityTFRedcap extends EntityMob { - - - public static ItemStack heldPick = new ItemStack(Items.iron_pickaxe, 1); - public static ItemStack heldTNT = new ItemStack(Blocks.tnt, 1); - public static ItemStack heldFlint = new ItemStack(Items.flint_and_steel, 1); - - private boolean shy; - - private int tntLeft = 0; - - public EntityTFRedcap(World world) - { - super(world); - //texture = TwilightForestMod.MODEL_DIR + "redcap.png"; - //moveSpeed = 0.28F; - setSize(0.9F, 1.4F); - - shy = true; - - this.tasks.addTask(0, new EntityAISwimming(this)); - this.tasks.addTask(1, new EntityAIAvoidEntity(this, EntityTNTPrimed.class, 2.0F, 1.0F, 2.0F)); - this.tasks.addTask(2, new EntityAITFRedcapShy(this, 1.0F)); - this.tasks.addTask(3, new EntityAITFRedcapLightTNT(this, 1.0F)); // light TNT - this.tasks.addTask(5, new EntityAIAttackOnCollide(this, EntityPlayer.class, 1.0D, false)); - this.tasks.addTask(6, new EntityAIWander(this, 1.0D)); - this.tasks.addTask(7, new EntityAIWatchClosest(this, EntityPlayer.class, 8.0F)); - this.tasks.addTask(7, new EntityAILookIdle(this)); - this.targetTasks.addTask(1, new EntityAIHurtByTarget(this, false)); - this.targetTasks.addTask(2, new EntityAINearestAttackableTarget(this, EntityPlayer.class, 0, true)); - - this.setCurrentItemOrArmor(0, heldPick); - this.setCurrentItemOrArmor(1, new ItemStack(Items.iron_boots)); - - this.equipmentDropChances[0] = 0.2F; - this.equipmentDropChances[1] = 0.2F; - - } - - public EntityTFRedcap(World world, double x, double y, double z) - { - this(world); - this.setPosition(x, y, z); - } - - /** - * Returns true if the newer Entity AI code should be run - */ - @Override - protected boolean isAIEnabled() - { - return true; - } - - /** - * Set monster attributes - */ - @Override - protected void applyEntityAttributes() - { - super.applyEntityAttributes(); - this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(20.0D); // max health - this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.28D); // movement speed - } - - @Override - protected String getLivingSound() - { - return TwilightForestMod.ID + ":mob.redcap.redcap"; - } - - @Override - protected String getHurtSound() - { - return TwilightForestMod.ID + ":mob.redcap.hurt"; - } - - @Override - protected String getDeathSound() - { - return TwilightForestMod.ID + ":mob.redcap.die"; - } - - @Override - protected Item getDropItem() - { - return Items.coal; - } - - public boolean isShy() - { - return shy && this.recentlyHit <= 0; - } - - public int getTntLeft() { - return tntLeft; - } - - public void setTntLeft(int tntLeft) { - this.tntLeft = tntLeft; - } - - public ItemStack getPick() - { - return heldPick; - } - - /** - * (abstract) Protected helper method to write subclass entity data to NBT. - */ - @Override - public void writeEntityToNBT(NBTTagCompound par1NBTTagCompound) - { - super.writeEntityToNBT(par1NBTTagCompound); - par1NBTTagCompound.setInteger("TNTLeft", this.getTntLeft()); - } - - /** - * (abstract) Protected helper method to read subclass entity data from NBT. - */ - @Override - public void readEntityFromNBT(NBTTagCompound par1NBTTagCompound) - { - super.readEntityFromNBT(par1NBTTagCompound); - this.setTntLeft(par1NBTTagCompound.getInteger("TNTLeft")); - } - - /** - * Trigger achievement when killed - */ - @Override - public void onDeath(DamageSource par1DamageSource) { - super.onDeath(par1DamageSource); - if (par1DamageSource.getSourceOfDamage() instanceof EntityPlayer) { - ((EntityPlayer)par1DamageSource.getSourceOfDamage()).triggerAchievement(TFAchievementPage.twilightHunter); - // are we in a level 1 hill? - int chunkX = MathHelper.floor_double(posX) >> 4; - int chunkZ = MathHelper.floor_double(posZ) >> 4; - if (TFFeature.getNearestFeature(chunkX, chunkZ, worldObj) == TFFeature.hill1) { - // award level 1 hill cheevo - ((EntityPlayer)par1DamageSource.getSourceOfDamage()).triggerAchievement(TFAchievementPage.twilightHill1); - } - - } - } - -} diff --git a/src/main/java/twilightforest/entity/EntityTFRedcapSapper.java b/src/main/java/twilightforest/entity/EntityTFRedcapSapper.java deleted file mode 100644 index 522f7ee9ab..0000000000 --- a/src/main/java/twilightforest/entity/EntityTFRedcapSapper.java +++ /dev/null @@ -1,81 +0,0 @@ -package twilightforest.entity; - -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.util.DamageSource; -import net.minecraft.util.MathHelper; -import net.minecraft.world.World; -import twilightforest.TFAchievementPage; -import twilightforest.TFFeature; -import twilightforest.entity.ai.EntityAITFRedcapPlantTNT; -import twilightforest.item.TFItems; - -public class EntityTFRedcapSapper extends EntityTFRedcap { - - - public EntityTFRedcapSapper(World world) { - super(world); - - this.tasks.addTask(4, new EntityAITFRedcapPlantTNT(this)); // plant TNT - - //texture = TwilightForestMod.MODEL_DIR + "redcapsapper.png"; - - this.setTntLeft(3); - - this.setCurrentItemOrArmor(1, new ItemStack(TFItems.ironwoodBoots)); - this.setCurrentItemOrArmor(0, new ItemStack(TFItems.ironwoodPick, 1)); - } - - /** - * Set monster attributes - */ - @Override - protected void applyEntityAttributes() - { - super.applyEntityAttributes(); - this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(30.0D); // max health - } - - /** - * Returns the current armor value as determined by a call to InventoryPlayer.getTotalArmorValue - */ - @Override - public int getTotalArmorValue() - { - int var1 = super.getTotalArmorValue() + 2; - - if (var1 > 20) - { - var1 = 20; - } - - return var1; - } - - - @Override - public ItemStack getPick() - { - return new ItemStack(TFItems.ironwoodPick); - } - - /** - * Trigger achievement when killed - */ - @Override - public void onDeath(DamageSource par1DamageSource) { - super.onDeath(par1DamageSource); - if (par1DamageSource.getSourceOfDamage() instanceof EntityPlayer) { - ((EntityPlayer)par1DamageSource.getSourceOfDamage()).triggerAchievement(TFAchievementPage.twilightHunter); - // are we in a level 2 hill? - int chunkX = MathHelper.floor_double(posX) >> 4; - int chunkZ = MathHelper.floor_double(posZ) >> 4; - if (TFFeature.getNearestFeature(chunkX, chunkZ, worldObj) == TFFeature.hill2) { - // award level 2 hill cheevo - ((EntityPlayer)par1DamageSource.getSourceOfDamage()).triggerAchievement(TFAchievementPage.twilightHill2); - } - - } - } -} diff --git a/src/main/java/twilightforest/entity/EntityTFRovingCube.java b/src/main/java/twilightforest/entity/EntityTFRovingCube.java deleted file mode 100644 index 80caee1885..0000000000 --- a/src/main/java/twilightforest/entity/EntityTFRovingCube.java +++ /dev/null @@ -1,71 +0,0 @@ -package twilightforest.entity; - -import twilightforest.TwilightForestMod; -import twilightforest.entity.ai.EntityAICubeCenterOnSymbol; -import twilightforest.entity.ai.EntityAICubeMoveToRedstoneSymbols; -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.ai.EntityAIWander; -import net.minecraft.entity.monster.EntityMob; -import net.minecraft.world.World; - -public class EntityTFRovingCube extends EntityMob { - - // data needed for cube AI - - // last circle visited - public boolean hasFoundSymbol = false; - public int symbolX = 0; - public int symbolY = 0; - public int symbolZ = 0; - - // direction traveling - - // blocks traveled - - public EntityTFRovingCube(World world) { - super(world); - setSize(1.2F, 2.1F); - - this.tasks.addTask(0, new EntityAICubeMoveToRedstoneSymbols(this, 1.0D)); - this.tasks.addTask(1, new EntityAICubeCenterOnSymbol(this, 1.0D)); - - } - - protected void applyEntityAttributes() - { - super.applyEntityAttributes(); - this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(10.0D); - this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.23000000417232513D); - this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(5.0D); - } - - - /** - * Returns true if the newer Entity AI code should be run - */ - protected boolean isAIEnabled() - { - return true; - } - - - /** - * Called frequently so the entity can update its state every tick as required. For example, zombies and skeletons - * use this to react to sunlight and start to burn. - */ - public void onLivingUpdate() - { - super.onLivingUpdate(); - // make annihilation particles - for (int i = 0; i < 3; i++) { - float px = (this.rand.nextFloat() - this.rand.nextFloat()) * 0.75F; - float py = this.getEyeHeight() - 0.25F + (this.rand.nextFloat() - this.rand.nextFloat()) * 0.75F; - float pz = (this.rand.nextFloat() - this.rand.nextFloat()) * 0.75F; - - TwilightForestMod.proxy.spawnParticle(this.worldObj, "annihilate", this.lastTickPosX + px, this.lastTickPosY + py, this.lastTickPosZ + pz, 0, 0, 0); - } - - } - - -} diff --git a/src/main/java/twilightforest/entity/EntityTFSkeletonDruid.java b/src/main/java/twilightforest/entity/EntityTFSkeletonDruid.java deleted file mode 100644 index f77c08a3ec..0000000000 --- a/src/main/java/twilightforest/entity/EntityTFSkeletonDruid.java +++ /dev/null @@ -1,199 +0,0 @@ - -package twilightforest.entity; - -import net.minecraft.block.Block; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.EnumCreatureAttribute; -import net.minecraft.entity.IRangedAttackMob; -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.ai.EntityAIArrowAttack; -import net.minecraft.entity.ai.EntityAIFleeSun; -import net.minecraft.entity.ai.EntityAIHurtByTarget; -import net.minecraft.entity.ai.EntityAILookIdle; -import net.minecraft.entity.ai.EntityAINearestAttackableTarget; -import net.minecraft.entity.ai.EntityAIRestrictSun; -import net.minecraft.entity.ai.EntityAISwimming; -import net.minecraft.entity.ai.EntityAIWander; -import net.minecraft.entity.ai.EntityAIWatchClosest; -import net.minecraft.entity.monster.EntityMob; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Items; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.DamageSource; -import net.minecraft.util.MathHelper; -import net.minecraft.world.EnumSkyBlock; -import net.minecraft.world.World; -import twilightforest.TFAchievementPage; -import twilightforest.item.TFItems; - - - -public class EntityTFSkeletonDruid extends EntityMob implements IRangedAttackMob -{ - - public EntityTFSkeletonDruid(World world) - { - super(world); - //texture = TwilightForestMod.MODEL_DIR + "skeletondruid.png"; - - //this.moveSpeed = 0.25F; - this.tasks.addTask(1, new EntityAISwimming(this)); - this.tasks.addTask(2, new EntityAIRestrictSun(this)); - this.tasks.addTask(3, new EntityAIFleeSun(this, 1.0D)); - this.tasks.addTask(4, new EntityAIArrowAttack(this, 1.0D, 60, 10.0F)); - this.tasks.addTask(5, new EntityAIWander(this, 1.0D)); - this.tasks.addTask(6, new EntityAIWatchClosest(this, EntityPlayer.class, 8.0F)); - this.tasks.addTask(6, new EntityAILookIdle(this)); - this.targetTasks.addTask(1, new EntityAIHurtByTarget(this, false)); - this.targetTasks.addTask(2, new EntityAINearestAttackableTarget(this, EntityPlayer.class, 0, true)); - - this.setCurrentItemOrArmor(0, new ItemStack(Items.golden_hoe)); - - } - - /** - * Returns true if the newer Entity AI code should be run - */ - @Override - public boolean isAIEnabled() - { - return true; - } - - /** - * Set monster attributes - */ - @Override - protected void applyEntityAttributes() - { - super.applyEntityAttributes(); - this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(20.0D); // max health - this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.25D); // movement speed - } - - /** - * Returns the sound this mob makes while it's alive. - */ - protected String getLivingSound() - { - return "mob.skeleton.say"; - } - - /** - * Returns the sound this mob makes when it is hurt. - */ - protected String getHurtSound() - { - return "mob.skeleton.hurt"; - } - - /** - * Returns the sound this mob makes on death. - */ - protected String getDeathSound() - { - return "mob.skeleton.death"; - } - - /** - * Plays step sound at given x, y, z for the entity - */ - protected void func_145780_a(int par1, int par2, int par3, Block par4) - { - this.playSound("mob.skeleton.step", 0.15F, 1.0F); - } - - @Override - protected Item getDropItem() - { - return TFItems.torchberries; - } - - /** - * Drop 0-2 items of this living's type. @param par1 - Whether this entity has recently been hit by a player. @param - * par2 - Level of Looting used to kill this mob. - */ - protected void dropFewItems(boolean par1, int lootingModifier) - { - int numberOfItemsToDrop; - int i; - - numberOfItemsToDrop = this.rand.nextInt(3 + lootingModifier); - - for (i = 0; i < numberOfItemsToDrop; ++i) - { - this.dropItem(TFItems.torchberries, 1); - } - - numberOfItemsToDrop = this.rand.nextInt(3 + lootingModifier); - - for (i = 0; i < numberOfItemsToDrop; ++i) - { - this.dropItem(Items.bone, 1); - } - } - - /** - * Get this Entity's EnumCreatureAttribute - */ - public EnumCreatureAttribute getCreatureAttribute() - { - return EnumCreatureAttribute.UNDEAD; - } - - - /** - * Trigger achievement when killed - */ - @Override - public void onDeath(DamageSource par1DamageSource) { - super.onDeath(par1DamageSource); - if (par1DamageSource.getSourceOfDamage() instanceof EntityPlayer) { - ((EntityPlayer)par1DamageSource.getSourceOfDamage()).triggerAchievement(TFAchievementPage.twilightHunter); - } - } - - /** - * Attack the specified entity using a ranged attack. - */ - @Override - public void attackEntityWithRangedAttack(EntityLivingBase attackTarget, float extraDamage) { - EntityTFNatureBolt natureBolt = new EntityTFNatureBolt(this.worldObj, this); - this.worldObj.playSoundAtEntity(this, "mob.ghast.fireball", 1.0F, 1.0F / (rand.nextFloat() * 0.4F + 0.8F)); - - natureBolt.setTarget(attackTarget); - - double tx = attackTarget.posX - this.posX; - double ty = attackTarget.posY + attackTarget.getEyeHeight() - 2.699999988079071D - this.posY; - double tz = attackTarget.posZ - this.posZ; - float heightOffset = MathHelper.sqrt_double(tx * tx + tz * tz) * 0.2F; - natureBolt.setThrowableHeading(tx, ty + heightOffset, tz, 0.6F, 6.0F); // 0.6 speed, 6.0 inaccuracy - this.worldObj.spawnEntityInWorld(natureBolt); - - } - - /** - * Checks to make sure the light is not too bright where the mob is spawning - */ - protected boolean isValidLightLevel() - { - boolean valid = false; - int dx = MathHelper.floor_double(this.posX); - int dy = MathHelper.floor_double(this.boundingBox.minY); - int dz = MathHelper.floor_double(this.posZ); - - if (this.worldObj.getSavedLightValue(EnumSkyBlock.Sky, dx, dy, dz) > this.rand.nextInt(32)) - { - valid = false; - } - else - { - int light = this.worldObj.getBlockLightValue(dx, dy, dz); - - valid = light <= this.rand.nextInt(12); - - } - return valid; - } -} diff --git a/src/main/java/twilightforest/entity/EntityTFSlideBlock.java b/src/main/java/twilightforest/entity/EntityTFSlideBlock.java deleted file mode 100644 index 9b1ce1392b..0000000000 --- a/src/main/java/twilightforest/entity/EntityTFSlideBlock.java +++ /dev/null @@ -1,384 +0,0 @@ -package twilightforest.entity; - -import io.netty.buffer.ByteBuf; - -import java.util.Iterator; -import java.util.List; - -import twilightforest.TwilightForestMod; -import cpw.mods.fml.common.registry.IEntityAdditionalSpawnData; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import net.minecraft.block.Block; -import net.minecraft.block.BlockFalling; -import net.minecraft.block.ITileEntityProvider; -import net.minecraft.block.material.Material; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.item.EntityFallingBlock; -import net.minecraft.init.Blocks; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTBase; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.DamageSource; -import net.minecraft.util.MathHelper; -import net.minecraft.world.World; - -public class EntityTFSlideBlock extends Entity implements IEntityAdditionalSpawnData { - - private static final int WARMUP_TIME = 20; - private Block myBlock; - private int myMeta; - private short slideTime; - private boolean canDropItem = true; - - float moveX; - float moveY; - float moveZ; - - public EntityTFSlideBlock(World world) { - super(world); - this.preventEntitySpawning = true; - this.entityCollisionReduction = 1F; - this.setSize(0.98F, 0.98F); - //this.yOffset = this.height / 2.0F; - } - - - public EntityTFSlideBlock(World world, double x, double y, double z, Block block, int meta) { - super(world); - - this.myBlock = block; - this.myMeta = meta; - this.preventEntitySpawning = true; - this.entityCollisionReduction = 1F; - this.setSize(0.98F, 0.98F); - //this.yOffset = this.height / 2.0F; - this.setPosition(x, y, z); - this.motionX = 0.0D; - this.motionY = 0.0D; - this.motionZ = 0.0D; - this.prevPosX = x; - this.prevPosY = y; - this.prevPosZ = z; - - this.determineMoveDirection(); - } - - /** - * Called when creating the entity to determine which direction the block will slide. The logic here is a little tricky - */ - private void determineMoveDirection() { - this.moveX = 0F; - this.moveY = 0F; - this.moveZ = 0F; - - int bx = MathHelper.floor_double(this.posX); - int by = MathHelper.floor_double(this.posY); - int bz = MathHelper.floor_double(this.posZ); - - if ((this.myMeta & 12) == 4) { - // horizontal blocks will go up or down if there is a block on one side and air on the other - if (!this.worldObj.isAirBlock(bx, by + 1, bz) && this.worldObj.isAirBlock(bx, by - 1, bz)) { - this.moveY = -1F; - } else if (!this.worldObj.isAirBlock(bx, by - 1, bz) && this.worldObj.isAirBlock(bx, by + 1, bz)) { - this.moveY = 1F; - } else if (!this.worldObj.isAirBlock(bx, by, bz + 1) && this.worldObj.isAirBlock(bx, by, bz - 1)) { // then try Z - this.moveZ = -1F; - } else if (!this.worldObj.isAirBlock(bx, by, bz - 1) && this.worldObj.isAirBlock(bx, by, bz + 1)) { - this.moveZ = 1F; - } else if (this.worldObj.isAirBlock(bx, by - 1, bz)) { // if no wall, travel towards open air - this.moveY = -1F; - } else if (this.worldObj.isAirBlock(bx, by + 1, bz)) { - this.moveY = 1F; - } else if (this.worldObj.isAirBlock(bx, by, bz - 1)) { - this.moveZ = -1F; - } else if (this.worldObj.isAirBlock(bx, by, bz + 1)) { - this.moveZ = 1F; - } - } else if ((this.myMeta & 12) == 8) { - // horizontal blocks will go up or down if there is a block on one side and air on the other - if (!this.worldObj.isAirBlock(bx, by + 1, bz) && this.worldObj.isAirBlock(bx, by - 1, bz)) { - this.moveY = -1F; - } else if (!this.worldObj.isAirBlock(bx, by - 1, bz) && this.worldObj.isAirBlock(bx, by + 1, bz)) { - this.moveY = 1F; - } else if (!this.worldObj.isAirBlock(bx + 1, by, bz) && this.worldObj.isAirBlock(bx - 1, by, bz)) { // then try X - this.moveX = -1F; - } else if (!this.worldObj.isAirBlock(bx - 1, by, bz) && this.worldObj.isAirBlock(bx + 1, by, bz)) { - this.moveX = 1F; - } else if (this.worldObj.isAirBlock(bx, by - 1, bz)) { // if no wall, travel towards open air - this.moveY = -1F; - } else if (this.worldObj.isAirBlock(bx, by + 1, bz)) { - this.moveY = 1F; - } else if (this.worldObj.isAirBlock(bx - 1, by, bz)) { - this.moveX = -1F; - } else if (this.worldObj.isAirBlock(bx + 1, by, bz)) { - this.moveX = 1F; - } - } else if ((this.myMeta & 12) == 0) { - // vertical blocks priority is -x, +x, -z, +z - if (!this.worldObj.isAirBlock(bx + 1, by, bz) && this.worldObj.isAirBlock(bx - 1, by, bz)) { - this.moveX = -1F; - } else if (!this.worldObj.isAirBlock(bx - 1, by, bz) && this.worldObj.isAirBlock(bx + 1, by, bz)) { - this.moveX = 1F; - } else if (!this.worldObj.isAirBlock(bx, by, bz + 1) && this.worldObj.isAirBlock(bx, by, bz - 1)) { - this.moveZ = -1F; - } else if (!this.worldObj.isAirBlock(bx, by, bz - 1) && this.worldObj.isAirBlock(bx, by, bz + 1)) { - this.moveZ = 1F; - } else if (this.worldObj.isAirBlock(bx - 1, by, bz)) { // if no wall, travel towards open air - this.moveX = -1F; - } else if (this.worldObj.isAirBlock(bx + 1, by, bz)) { - this.moveX = 1F; - } else if (this.worldObj.isAirBlock(bx, by, bz - 1)) { - this.moveZ = -1F; - } else if (this.worldObj.isAirBlock(bx, by, bz + 1)) { - this.moveZ = 1F; - } - - } - - } - - - @Override - protected void entityInit() { } - - /** - * returns if this entity triggers Block.onEntityWalking on the blocks they walk on. used for spiders and wolves to - * prevent them from trampling crops - */ - protected boolean canTriggerWalking() - { - return false; - } - - /** - * Returns true if other Entities should be prevented from moving through this Entity. - */ - public boolean canBeCollidedWith() - { - return !this.isDead; - } - - - - @SideOnly(Side.CLIENT) - public float getShadowSize() - { - return 0.0F; - } - - /** - * Called to update the entity's position/logic. - */ - public void onUpdate() - { - if (this.myBlock == null || this.myBlock.getMaterial() == Material.air) - { - this.setDead(); - } - else - { - this.prevPosX = this.posX; - this.prevPosY = this.posY; - this.prevPosZ = this.posZ; - ++this.slideTime; - // start moving after warmup - if (this.slideTime > WARMUP_TIME) { - this.motionX += this.moveX * 0.03999999910593033D; - this.motionY += this.moveY * 0.03999999910593033D; - this.motionZ += this.moveZ * 0.03999999910593033D; - this.moveEntity(this.motionX, this.motionY, this.motionZ); - } - this.motionX *= 0.9800000190734863D; - this.motionY *= 0.9800000190734863D; - this.motionZ *= 0.9800000190734863D; - - // sound - if (this.slideTime % 5 == 0) { - this.worldObj.playSoundEffect(this.posX, this.posY, this.posZ, TwilightForestMod.ID + ":random.slider", 1.0F, 0.9F + (this.rand.nextFloat() * 0.4F)); - } - - - if (!this.worldObj.isRemote) - { - int bx = MathHelper.floor_double(this.posX); - int by = MathHelper.floor_double(this.posY); - int bz = MathHelper.floor_double(this.posZ); - - if (this.slideTime == 1) - { - if (this.worldObj.getBlock(bx, by, bz) != this.myBlock) - { - this.setDead(); - return; - } - - this.worldObj.setBlockToAir(bx, by, bz); - } - - // if we have not hit anything after 2 seconds of movement, reverse direction - if (this.slideTime == WARMUP_TIME + 40) { - this.motionX = 0; - this.motionY = 0; - this.motionZ = 0; - - this.moveX *= -1F; - this.moveY *= -1F; - this.moveZ *= -1F; - } - - //System.out.println("Status! onGround = " + this.onGround + ", isCollided = " + this.isCollided + ", hv = " + this.isCollidedHorizontally + ", " + this.isCollidedVertically); - - if (this.isCollided || this.isStopped()) - { - this.motionX *= 0.699999988079071D; - this.motionZ *= 0.699999988079071D; - this.motionY *= 0.699999988079071D; - - this.setDead(); - - if (this.worldObj.canPlaceEntityOnSide(this.myBlock, bx, by, bz, true, 1, (Entity)null, (ItemStack)null) && this.worldObj.setBlock(bx, by, bz, this.myBlock, this.myMeta, 3)) - { - // successfully set block - } - else if (this.canDropItem ) - { - this.entityDropItem(new ItemStack(this.myBlock, 1, this.myBlock.damageDropped(this.myMeta)), 0.0F); - } - } - else if (this.slideTime > 100 && !this.worldObj.isRemote && (by < 1 || by > 256) || this.slideTime > 600) - { - if (this.canDropItem) - { - this.entityDropItem(new ItemStack(this.myBlock, 1, this.myBlock.damageDropped(this.myMeta)), 0.0F); - } - - this.setDead(); - } - - // push things out and damage them - this.damageKnockbackEntities(this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox), this); - } - } - } - - /** - * Pushes all entities inside the list out and damages them - */ - private void damageKnockbackEntities(List par1List, Entity me) - { - for (Entity entity : par1List) - { - if (entity instanceof EntityLivingBase) - { - entity.attackEntityFrom(DamageSource.generic, 5); - - double kx = (this.posX - entity.posX) * 2.0; - double kz = (this.posZ - entity.posZ) * 2.0; - - ((EntityLivingBase) entity).knockBack(this, 5, kx, kz); - } - } - } - - /** - * Returns a boundingBox used to collide the entity with other entities and blocks. This enables the entity to be - * pushable on contact, like boats or minecarts. - */ - public AxisAlignedBB getCollisionBox(Entity p_70114_1_) - { - return null; - } - - private boolean isStopped() { - return this.moveX == 0 && this.moveY == 0 && this.moveZ == 0; - } - - - /** - * Return whether this entity should be rendered as on fire. - */ - @SideOnly(Side.CLIENT) - public boolean canRenderOnFire() - { - return false; - } - - - @Override - protected void readEntityFromNBT(NBTTagCompound nbtTagCompound) { - this.myBlock = Block.getBlockById(nbtTagCompound.getInteger("TileID")); - this.myMeta = nbtTagCompound.getByte("Meta"); - this.slideTime = nbtTagCompound.getShort("Time"); - this.moveX = nbtTagCompound.getFloat("MoveX"); - this.moveY = nbtTagCompound.getFloat("MoveY"); - this.moveZ = nbtTagCompound.getFloat("MoveZ"); - - } - - @Override - protected void writeEntityToNBT(NBTTagCompound nbtTagCompound) { - nbtTagCompound.setInteger("TileID", Block.getIdFromBlock(this.myBlock)); - nbtTagCompound.setByte("Meta", (byte)this.myMeta); - nbtTagCompound.setShort("Time", this.slideTime); - nbtTagCompound.setFloat("MoveX", this.moveX); - nbtTagCompound.setFloat("MoveY", this.moveY); - nbtTagCompound.setFloat("MoveZ", this.moveZ); - } - - public Block getBlock() { - return this.myBlock; - } - - public int getMeta() { - return this.myMeta; - } - - /** - * Called by the server when constructing the spawn packet. - * Data should be added to the provided stream. - * - * @param buffer The packet data stream - */ - @Override - public void writeSpawnData(ByteBuf buffer) { - int blockData = Block.getIdFromBlock(this.myBlock) + (this.myMeta << 16); - - buffer.writeInt(blockData); - - //System.out.println("Wrote additional spawn data as " + blockData); - } - - /** - * Called by the client when it receives a Entity spawn packet. - * Data should be read out of the stream in the same way as it was written. - * - * @param data The packet data stream - */ - @Override - public void readSpawnData(ByteBuf additionalData) { - int blockData = additionalData.readInt(); - - this.myBlock = Block.getBlockById(blockData & 65535); - this.myMeta = blockData >> 16; - - //System.out.println("Read additional spawn data as " + blockData + " so my block is " + this.myBlock); - - } - - /** - * Returns true if this entity should push and be pushed by other entities when colliding. - */ - public boolean canBePushed() - { - return false; - } - - public boolean isPushedByWater() - { - return false; - } -} diff --git a/src/main/java/twilightforest/entity/EntityTFSlimeBeetle.java b/src/main/java/twilightforest/entity/EntityTFSlimeBeetle.java deleted file mode 100644 index 9d59c67f42..0000000000 --- a/src/main/java/twilightforest/entity/EntityTFSlimeBeetle.java +++ /dev/null @@ -1,171 +0,0 @@ -package twilightforest.entity; - -import net.minecraft.block.Block; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EnumCreatureAttribute; -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.ai.EntityAIAvoidEntity; -import net.minecraft.entity.ai.EntityAIHurtByTarget; -import net.minecraft.entity.ai.EntityAILookIdle; -import net.minecraft.entity.ai.EntityAINearestAttackableTarget; -import net.minecraft.entity.ai.EntityAISwimming; -import net.minecraft.entity.ai.EntityAIWander; -import net.minecraft.entity.ai.EntityAIWatchClosest; -import net.minecraft.entity.monster.EntityMob; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Items; -import net.minecraft.item.Item; -import net.minecraft.util.DamageSource; -import net.minecraft.world.World; -import twilightforest.TFAchievementPage; -import twilightforest.entity.ai.EntityAITFMagicAttack; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public class EntityTFSlimeBeetle extends EntityMob -{ - - public EntityTFSlimeBeetle(World world) { - super(world); - //texture = TwilightForestMod.MODEL_DIR + "slimebeetle.png"; - //moveSpeed = 0.23F; - setSize(0.9F, 1.75F); - - this.tasks.addTask(0, new EntityAISwimming(this)); - //this.tasks.addTask(2, new EntityAITFFireBreath(this, this.moveSpeed, 5F, 30, 0.1F)); - this.tasks.addTask(2, new EntityAIAvoidEntity(this, EntityPlayer.class, 3.0F, 1.25F, 2.0F)); - this.tasks.addTask(3, new EntityAITFMagicAttack(this, 1.0F, EntityAITFMagicAttack.SLIME, 30)); - //this.tasks.addTask(4, new EntityAIAttackOnCollide(this, EntityPlayer.class, this.moveSpeed, false)); - this.tasks.addTask(6, new EntityAIWander(this, 1.0D)); - this.tasks.addTask(7, new EntityAIWatchClosest(this, EntityPlayer.class, 8.0F)); - this.tasks.addTask(8, new EntityAILookIdle(this)); - this.targetTasks.addTask(1, new EntityAIHurtByTarget(this, false)); - this.targetTasks.addTask(2, new EntityAINearestAttackableTarget(this, EntityPlayer.class, 0, true)); - - } - - /** - * Returns true if the newer Entity AI code should be run - */ - @Override - protected boolean isAIEnabled() - { - return true; - } - - /** - * Set monster attributes - */ - @Override - protected void applyEntityAttributes() - { - super.applyEntityAttributes(); - this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(25.0D); // max health - this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.23D); // movement speed - } - - - /** - * Returns the sound this mob makes while it's alive. - */ - @Override - protected String getLivingSound() - { - return null; - } - - /** - * Returns the sound this mob makes when it is hurt. - */ - @Override - protected String getHurtSound() - { - return "mob.spider.say"; - } - - /** - * Returns the sound this mob makes on death. - */ - @Override - protected String getDeathSound() - { - return "mob.spider.death"; - } - - /** - * Plays step sound at given x, y, z for the entity - */ - @Override - protected void func_145780_a(int var1, int var2, int var3, Block var4) - { - this.worldObj.playSoundAtEntity(this, "mob.spider.step", 0.15F, 1.0F); - } - - /** - * Called frequently so the entity can update its state every tick as required. For example, zombies and skeletons - * use this to react to sunlight and start to burn. - */ - @Override - public void onLivingUpdate() - { - super.onLivingUpdate(); - -// // dribble slime particles out of mouth -// Vec3 look = this.getLookVec(); -// -// double dist = 0.9; -// double px = this.posX + look.xCoord * dist; -// double py = this.posY + 0.25 + look.yCoord * dist; -// double pz = this.posZ + look.zCoord * dist; -// -// worldObj.spawnParticle("slime", px, py, pz, 0, 0, 0); - - } - - /** - * Trigger achievement when killed - */ - @Override - public void onDeath(DamageSource par1DamageSource) { - super.onDeath(par1DamageSource); - if (par1DamageSource.getSourceOfDamage() instanceof EntityPlayer) { - ((EntityPlayer)par1DamageSource.getSourceOfDamage()).triggerAchievement(TFAchievementPage.twilightHunter); - } - } - - /** - * Attack strength - */ - public int getAttackStrength(Entity par1Entity) - { - return 4; - } - - @Override - @SideOnly(Side.CLIENT) - public float getShadowSize() - { - return 1.1F; - } - - @Override - public float getEyeHeight() { - return 0.25F; - } - - /** - * Get this Entity's EnumCreatureAttribute - */ - @Override - public EnumCreatureAttribute getCreatureAttribute() - { - return EnumCreatureAttribute.ARTHROPOD; - } - - @Override - protected Item getDropItem() - { - return Items.slime_ball; - } - -} diff --git a/src/main/java/twilightforest/entity/EntityTFSlimeProjectile.java b/src/main/java/twilightforest/entity/EntityTFSlimeProjectile.java deleted file mode 100644 index e7fe9e235f..0000000000 --- a/src/main/java/twilightforest/entity/EntityTFSlimeProjectile.java +++ /dev/null @@ -1,101 +0,0 @@ -package twilightforest.entity; - -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.projectile.EntityThrowable; -import net.minecraft.util.DamageSource; -import net.minecraft.util.MovingObjectPosition; -import net.minecraft.world.World; - -public class EntityTFSlimeProjectile extends EntityThrowable { - - public EntityTFSlimeProjectile(World par1World) { - super(par1World); - // TODO Auto-generated constructor stub - } - - public EntityTFSlimeProjectile(World par1World, EntityLivingBase par2EntityLiving) { - super(par1World, par2EntityLiving); - } - - @Override - public void onUpdate() { - super.onUpdate(); - - makeTrail(); - } - - /** - * How much this entity falls each tick - */ - @Override - protected float getGravityVelocity() - { - return 0.006F; - } - - /** - * Make slimy trail - */ - public void makeTrail() { - for (int i = 0; i < 2; i++) { - double dx = posX + 0.5 * (rand.nextDouble() - rand.nextDouble()); - double dy = posY + 0.5 * (rand.nextDouble() - rand.nextDouble()); - double dz = posZ + 0.5 * (rand.nextDouble() - rand.nextDouble()); - worldObj.spawnParticle("slime", dx, dy, dz, 0.0D, 0.0D, 0.0D); - } - } - - /** - * Reflect! - */ - @Override - public boolean attackEntityFrom(DamageSource damagesource, float i) - { - - setBeenAttacked(); - - pop(); - - return true; - } - - /** - * What happens when we hit something? - */ - @Override - protected void onImpact(MovingObjectPosition par1MovingObjectPosition) { - // only damage living things - if (par1MovingObjectPosition.entityHit != null && par1MovingObjectPosition.entityHit instanceof EntityLivingBase) - { - if (par1MovingObjectPosition.entityHit.attackEntityFrom(DamageSource.causeThrownDamage(this, this.getThrower()), 8)) - { - // damage armor? - //TODO: - } - } - - pop(); - - } - - /** - * Yeah, do that - */ - protected void pop() { - for (int i = 0; i < 8; ++i) - { - this.worldObj.spawnParticle("slime", this.posX, this.posY, this.posZ, rand.nextGaussian() * 0.05D, rand.nextDouble() * 0.2D, rand.nextGaussian() * 0.05D); - } - - // noise - this.worldObj.playSoundAtEntity(this, "mob.slime.big", 1.0F, 1.0F / (rand.nextFloat() * 0.4F + 0.8F)); - - - if (!this.worldObj.isRemote) - { - this.setDead(); - } - } - - -} diff --git a/src/main/java/twilightforest/entity/EntityTFSnowGuardian.java b/src/main/java/twilightforest/entity/EntityTFSnowGuardian.java deleted file mode 100644 index b936f202c5..0000000000 --- a/src/main/java/twilightforest/entity/EntityTFSnowGuardian.java +++ /dev/null @@ -1,218 +0,0 @@ -package twilightforest.entity; - -import net.minecraft.entity.IEntityLivingData; -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.ai.EntityAIAttackOnCollide; -import net.minecraft.entity.ai.EntityAIHurtByTarget; -import net.minecraft.entity.ai.EntityAILookIdle; -import net.minecraft.entity.ai.EntityAINearestAttackableTarget; -import net.minecraft.entity.ai.EntityAISwimming; -import net.minecraft.entity.ai.EntityAIWander; -import net.minecraft.entity.ai.EntityAIWatchClosest; -import net.minecraft.entity.monster.EntityMob; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Items; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; -import twilightforest.TwilightForestMod; -import twilightforest.item.TFItems; - -public class EntityTFSnowGuardian extends EntityMob { - - public EntityTFSnowGuardian(World par1World) { - super(par1World); - - this.tasks.addTask(0, new EntityAISwimming(this)); - this.tasks.addTask(1, new EntityAIAttackOnCollide(this, EntityPlayer.class, 1.0D, false)); - this.tasks.addTask(2, new EntityAIWander(this, 1.0D)); - this.tasks.addTask(3, new EntityAIWatchClosest(this, EntityPlayer.class, 8.0F)); - this.tasks.addTask(3, new EntityAILookIdle(this)); - this.targetTasks.addTask(1, new EntityAIHurtByTarget(this, true)); - this.targetTasks.addTask(2, new EntityAINearestAttackableTarget(this, EntityPlayer.class, 0, true)); - this.setSize(0.6F, 1.8F); - } - - - protected void applyEntityAttributes() - { - super.applyEntityAttributes(); - this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.23000000417232513D); - this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(3.0D); - this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(10.0D); - } - - - /** - * Returns true if the newer Entity AI code should be run - */ - protected boolean isAIEnabled() - { - return true; - } - - @Override - protected String getLivingSound() - { - return TwilightForestMod.ID + ":mob.ice.noise"; - } - - /** - * Returns the sound this mob makes when it is hurt. - */ - protected String getHurtSound() - { - return TwilightForestMod.ID + ":mob.ice.hurt"; - } - - /** - * Returns the sound this mob makes on death. - */ - protected String getDeathSound() - { - return TwilightForestMod.ID + ":mob.ice.death"; - } - - /** - * Gets the pitch of living sounds in living entities. - */ - protected float getSoundPitch() - { - return (this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F + 0.8F; - } - - /** - * Makes entity wear random armor based on difficulty - */ - protected void addRandomArmor() - { - // always random armor - - // random armor type - int type = rand.nextInt(4); - - this.setCurrentItemOrArmor(0, new ItemStack(this.makeItemForSlot(0, type))); - - this.setCurrentItemOrArmor(3, new ItemStack(this.makeItemForSlot(3, type))); - this.setCurrentItemOrArmor(4, new ItemStack(this.makeItemForSlot(4, type))); - } - - protected Item makeItemForSlot(int slot, int type) { - switch (slot) { - case 0: // sword - default: - switch (type) { - case 0: - default: - return TFItems.ironwoodSword; - case 1: - return TFItems.steeleafSword; - case 2: - return TFItems.knightlySword; - case 3: - return TFItems.knightlySword; - } - case 1: // boots - switch (type) { - case 0: - default: - return TFItems.ironwoodBoots; - case 1: - return TFItems.steeleafBoots; - case 2: - return TFItems.knightlyBoots; - case 3: - return TFItems.arcticBoots; - } - case 2: // legs - switch (type) { - case 0: - default: - return TFItems.ironwoodLegs; - case 1: - return TFItems.steeleafLegs; - case 2: - return TFItems.knightlyLegs; - case 3: - return TFItems.arcticLegs; - } - case 3: // chest - switch (type) { - case 0: - default: - return TFItems.ironwoodPlate; - case 1: - return TFItems.steeleafPlate; - case 2: - return TFItems.knightlyPlate; - case 3: - return TFItems.arcticPlate; - } - case 4: // helm - switch (type) { - case 0: - default: - return TFItems.ironwoodHelm; - case 1: - return TFItems.steeleafHelm; - case 2: - return TFItems.knightlyHelm; - case 3: - return TFItems.arcticHelm; - } - } - } - - /** - * Returns the item ID for the item the mob drops on death. - */ - protected Item getDropItem() - { - return Items.snowball; - } - - /** - * Enchants the entity's armor and held item based on difficulty - */ - protected void enchantEquipment() - { - super.enchantEquipment(); - } - - public IEntityLivingData onSpawnWithEgg(IEntityLivingData par1EntityLivingData) - { - IEntityLivingData data = super.onSpawnWithEgg(par1EntityLivingData); - - this.addRandomArmor(); - //this.enchantEquipment(); - - return data; - - } - - /** - * Called frequently so the entity can update its state every tick as required. For example, zombies and skeletons - * use this to react to sunlight and start to burn. - */ - public void onLivingUpdate() - { - super.onLivingUpdate(); - // make snow particles - for (int i = 0; i < 3; i++) { - float px = (this.rand.nextFloat() - this.rand.nextFloat()) * 0.3F; - float py = this.getEyeHeight() + (this.rand.nextFloat() - this.rand.nextFloat()) * 0.5F; - float pz = (this.rand.nextFloat() - this.rand.nextFloat()) * 0.3F; - - TwilightForestMod.proxy.spawnParticle(this.worldObj, "snowguardian", this.lastTickPosX + px, this.lastTickPosY + py, this.lastTickPosZ + pz, 0, 0, 0); - } - - } - - /** - * Will return how many at most can spawn in a chunk at once. - */ - public int getMaxSpawnedInChunk() - { - return 8; - } -} diff --git a/src/main/java/twilightforest/entity/EntityTFSpikeBlock.java b/src/main/java/twilightforest/entity/EntityTFSpikeBlock.java deleted file mode 100644 index 7d0389a620..0000000000 --- a/src/main/java/twilightforest/entity/EntityTFSpikeBlock.java +++ /dev/null @@ -1,92 +0,0 @@ -package twilightforest.entity; - -import net.minecraft.entity.Entity; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.DamageSource; -import net.minecraft.world.World; - -public class EntityTFSpikeBlock extends Entity { - - EntityTFBlockGoblin goblin; - - public EntityTFSpikeBlock(World par1World) { - super(par1World); - setSize(0.75F, 0.75F); - } - - public EntityTFSpikeBlock(EntityTFBlockGoblin goblin) { - this(goblin.func_82194_d()); - this.goblin = goblin; - } - - /** - * Don't take damage from attacks - */ - @Override - public boolean attackEntityFrom(DamageSource par1DamageSource, float par2) { - return false; - } - - - /** - * Skip most of the living update things - */ - @Override - public void onUpdate() { - super.onUpdate(); - - this.ticksExisted++; - - lastTickPosX = posX; - lastTickPosY = posY; - lastTickPosZ = posZ; - - - //System.out.println("Updating " + this + " with angles " + rotationYawHead + ", " + rotationPitch); - - for (; rotationYaw - prevRotationYaw < -180F; prevRotationYaw -= 360F) { } - for (; rotationYaw - prevRotationYaw >= 180F; prevRotationYaw += 360F) { } - for (; rotationPitch - prevRotationPitch < -180F; prevRotationPitch -= 360F) { } - for (; rotationPitch - prevRotationPitch >= 180F; prevRotationPitch += 360F) { } - - } - - /** - * Returns true if other Entities should be prevented from moving through this Entity. - */ - public boolean canBeCollidedWith() - { - return false; - } - - /** - * Returns true if this entity should push and be pushed by other entities when colliding. - */ - public boolean canBePushed() - { - return false; - } - - public boolean isEntityEqual(Entity entity) - { - return this == entity || this.goblin == entity; - } - - @Override - protected void entityInit() { } - - @Override - protected void readEntityFromNBT(NBTTagCompound nbttagcompound) { } - - @Override - protected void writeEntityToNBT(NBTTagCompound nbttagcompound) { } - -// /** -// * Returns the texture's file path as a String. -// */ -// @Override -// public String getTexture() -// { -// return this.texture; -// } -} diff --git a/src/main/java/twilightforest/entity/EntityTFSwarmSpider.java b/src/main/java/twilightforest/entity/EntityTFSwarmSpider.java deleted file mode 100644 index 79dd627355..0000000000 --- a/src/main/java/twilightforest/entity/EntityTFSwarmSpider.java +++ /dev/null @@ -1,218 +0,0 @@ -package twilightforest.entity; - -import net.minecraft.entity.Entity; -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.monster.EntitySpider; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.DamageSource; -import net.minecraft.util.MathHelper; -import net.minecraft.world.World; -import twilightforest.TFAchievementPage; -import twilightforest.TFFeature; - - -public class EntityTFSwarmSpider extends EntitySpider { - - protected boolean shouldSpawn = false; - - public EntityTFSwarmSpider(World world) { - this(world, true); - } - - public EntityTFSwarmSpider(World world, boolean spawnMore) { - super(world); - - setSize(0.8F, 0.4F); - setSpawnMore(spawnMore); - //texture = TwilightForestMod.MODEL_DIR + "swarmspider.png"; - experienceValue = 2; // XP value - } - - public EntityTFSwarmSpider(World world, double x, double y, double z) - { - this(world); - this.setPosition(x, y, z); - } - - /** - * Set monster attributes - */ - @Override - protected void applyEntityAttributes() - { - super.applyEntityAttributes(); - this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(3.0D); // max health - this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(1.0D); // attack damage - } - - - /** - * How large the spider should be scaled. - */ - //@Override - public float spiderScaleAmount() - { - return 0.5F; - } - - /** - * Actually only used for the shadow - */ - @Override - public float getRenderSizeModifier() { - return 0.5F; - } - - /** - * Spawn more if that flag is set. - */ - @Override - public void onUpdate() { - if (shouldSpawnMore()) { - // don't spawn if we're connected in multiplayer - if (!worldObj.isRemote) { - int more = 1 + rand.nextInt(2); - for (int i = 0; i < more; i++) { - // try twice to spawn - if (!spawnAnother()) { - spawnAnother(); - } - } - } - setSpawnMore(false); - } - - super.onUpdate(); - } - - /** - * Only have the spider do damage a fraction of the time - */ - protected void attackEntity(Entity entity, float f) - { - if (this.attackTime <= 0 && (!this.isAirBorne || rand.nextInt(4) != 0)) - { - this.attackTime = 20; - } - else - { - super.attackEntity(entity, f); - } - - } - - /** - * Finds the closest player within 16 blocks to attack, or null if this Entity isn't interested in attacking - * (Animals, Spiders at day, peaceful PigZombies). - */ - @Override - protected Entity findPlayerToAttack() - { - // kill at all times! - double var2 = 16.0D; - return this.worldObj.getClosestVulnerablePlayerToEntity(this, var2); - } - - /** - * Spawn another spider! - * - * @return - */ - protected boolean spawnAnother() { - EntityTFSwarmSpider another = new EntityTFSwarmSpider(worldObj, false); - - - double sx = posX + (rand.nextBoolean() ? 0.9 : -0.9); - double sy = posY; - double sz = posZ + (rand.nextBoolean() ? 0.9 : -0.9); - another.setLocationAndAngles(sx, sy, sz, rand.nextFloat() * 360F, 0.0F); - if(!another.getCanSpawnHere()) - { - another.setDead(); - return false; - } - worldObj.spawnEntityInWorld(another); - - return true; - } - - /** - * Checks to make sure the light is not too bright where the mob is spawning - */ - @Override - protected boolean isValidLightLevel() - { - int chunkX = MathHelper.floor_double(posX) >> 4; - int chunkZ = MathHelper.floor_double(posZ) >> 4; - // We're allowed to spawn in bright light only in hedge mazes. - if (TFFeature.getNearestFeature(chunkX, chunkZ, worldObj) == TFFeature.hedgeMaze) - { - return true; - } - else - { - return super.isValidLightLevel(); - } - } - - public boolean shouldSpawnMore() - { - return shouldSpawn; - } - - public void setSpawnMore(boolean flag) - { - this.shouldSpawn = flag; - } - - @Override - public void writeEntityToNBT(NBTTagCompound nbttagcompound) - { - super.writeEntityToNBT(nbttagcompound); - nbttagcompound.setBoolean("SpawnMore", shouldSpawnMore()); - } - - @Override - public void readEntityFromNBT(NBTTagCompound nbttagcompound) - { - super.readEntityFromNBT(nbttagcompound); - setSpawnMore(nbttagcompound.getBoolean("SpawnMore")); - } - - /** - * Trigger achievement when killed - */ - @Override - public void onDeath(DamageSource par1DamageSource) { - super.onDeath(par1DamageSource); - if (par1DamageSource.getSourceOfDamage() instanceof EntityPlayer) { - ((EntityPlayer)par1DamageSource.getSourceOfDamage()).triggerAchievement(TFAchievementPage.twilightHunter); - // are we in a hedge maze? - int chunkX = MathHelper.floor_double(posX) >> 4; - int chunkZ = MathHelper.floor_double(posZ) >> 4; - if (TFFeature.getNearestFeature(chunkX, chunkZ, worldObj) == TFFeature.hedgeMaze) { - // award hedge maze cheevo - ((EntityPlayer)par1DamageSource.getSourceOfDamage()).triggerAchievement(TFAchievementPage.twilightHedge); - } - } - } - - /** - * Gets the pitch of living sounds in living entities. - */ - @Override - protected float getSoundPitch() - { - return (this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F + 1.5F; - } - - /** - * Will return how many at most can spawn in a chunk at once. - */ - public int getMaxSpawnedInChunk() - { - return 16; - } - -} diff --git a/src/main/java/twilightforest/entity/EntityTFTomeBolt.java b/src/main/java/twilightforest/entity/EntityTFTomeBolt.java deleted file mode 100644 index 2cb271e73b..0000000000 --- a/src/main/java/twilightforest/entity/EntityTFTomeBolt.java +++ /dev/null @@ -1,95 +0,0 @@ -package twilightforest.entity; - -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.projectile.EntityThrowable; -import net.minecraft.init.Items; -import net.minecraft.item.Item; -import net.minecraft.potion.Potion; -import net.minecraft.potion.PotionEffect; -import net.minecraft.util.DamageSource; -import net.minecraft.util.MovingObjectPosition; -import net.minecraft.world.EnumDifficulty; -import net.minecraft.world.World; - - -public class EntityTFTomeBolt extends EntityThrowable { - - public EntityTFTomeBolt(World par1World, double par2, double par4, - double par6) { - super(par1World, par2, par4, par6); - // TODO Auto-generated constructor stub - } - - public EntityTFTomeBolt(World par1World, EntityLivingBase par2EntityLiving) { - super(par1World, par2EntityLiving); - // TODO Auto-generated constructor stub - } - - public EntityTFTomeBolt(World par1World) { - super(par1World); - // TODO Auto-generated constructor stub - } - - - @Override - public void onUpdate() { - super.onUpdate(); - - makeTrail(); - } - - /** - * How much this entity falls each tick - */ - @Override - protected float getGravityVelocity() - { - return 0.003F; - } - - /** - * Make sparkly trail - */ - public void makeTrail() { - for (int i = 0; i < 5; i++) { - double dx = posX + 0.5 * (rand.nextDouble() - rand.nextDouble()); - double dy = posY + 0.5 * (rand.nextDouble() - rand.nextDouble()); - double dz = posZ + 0.5 * (rand.nextDouble() - rand.nextDouble()); - worldObj.spawnParticle("crit", dx, dy, dz, 0.0D, 0.0D, 0.0D); - } - } - - /** - * What happens when we hit something? - */ - @Override - protected void onImpact(MovingObjectPosition par1MovingObjectPosition) { - // only damage living things - if (par1MovingObjectPosition.entityHit != null && par1MovingObjectPosition.entityHit instanceof EntityLivingBase) - { - if (par1MovingObjectPosition.entityHit.attackEntityFrom(DamageSource.causeThrownDamage(this, this.getThrower()), 6)) - { - // inflict move slowdown - byte potionStrength = (byte) (worldObj.difficultySetting == EnumDifficulty.PEACEFUL ? 3 : worldObj.difficultySetting == EnumDifficulty.NORMAL ? 7 : 9); - if(potionStrength > 0) - { - ((EntityLivingBase)par1MovingObjectPosition.entityHit).addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, potionStrength * 20, 1)); - } - - } - } - - - for (int i = 0; i < 8; ++i) - { - this.worldObj.spawnParticle("iconcrack_" + Item.getIdFromItem(Items.fire_charge), this.posX, this.posY, this.posZ, rand.nextGaussian() * 0.05D, rand.nextDouble() * 0.2D, rand.nextGaussian() * 0.05D); - } - - if (!this.worldObj.isRemote) - { - this.setDead(); - } - - } - -} diff --git a/src/main/java/twilightforest/entity/EntityTFTowerBroodling.java b/src/main/java/twilightforest/entity/EntityTFTowerBroodling.java deleted file mode 100644 index 5a0c9f8aba..0000000000 --- a/src/main/java/twilightforest/entity/EntityTFTowerBroodling.java +++ /dev/null @@ -1,52 +0,0 @@ -package twilightforest.entity; - -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.world.World; - -public class EntityTFTowerBroodling extends EntityTFSwarmSpider -{ - - public EntityTFTowerBroodling(World world) { - this(world, true); - } - - public EntityTFTowerBroodling(World world, boolean spawnMore) { - super(world, spawnMore); - experienceValue = 3; // XP value - //texture = TwilightForestMod.MODEL_DIR + "towerbroodling.png"; - } - - /** - * Set monster attributes - */ - @Override - protected void applyEntityAttributes() - { - super.applyEntityAttributes(); - this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(7.0D); // max health - this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(4.0D); // attack damage - } - - /** - * Spawn another spider! - * - * @return - */ - protected boolean spawnAnother() - { - EntityTFSwarmSpider another = new EntityTFTowerBroodling(worldObj, false); - - double sx = posX + (rand.nextBoolean() ? 0.9 : -0.9); - double sy = posY; - double sz = posZ + (rand.nextBoolean() ? 0.9 : -0.9); - another.setLocationAndAngles(sx, sy, sz, rand.nextFloat() * 360F, 0.0F); - if(!another.getCanSpawnHere()) - { - another.setDead(); - return false; - } - worldObj.spawnEntityInWorld(another); - - return true; - } -} diff --git a/src/main/java/twilightforest/entity/EntityTFTowerGhast.java b/src/main/java/twilightforest/entity/EntityTFTowerGhast.java deleted file mode 100644 index 577f099844..0000000000 --- a/src/main/java/twilightforest/entity/EntityTFTowerGhast.java +++ /dev/null @@ -1,541 +0,0 @@ -package twilightforest.entity; - -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.monster.EntityGhast; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.projectile.EntityLargeFireball; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.ChunkCoordinates; -import net.minecraft.util.DamageSource; -import net.minecraft.util.MathHelper; -import net.minecraft.util.Vec3; -import net.minecraft.world.EnumDifficulty; -import net.minecraft.world.World; -import twilightforest.TFFeature; - -public class EntityTFTowerGhast extends EntityGhast -{ - - private static final int AGGRO_STATUS = 16; - protected EntityLivingBase targetedEntity; - protected boolean isAggressive; - protected int aggroCooldown; - protected int explosionPower; - protected int aggroCounter; - - protected float aggroRange; - protected float stareRange; - - protected float wanderFactor; - - protected int inTrapCounter; - - private ChunkCoordinates homePosition = new ChunkCoordinates(0, 0, 0); - /** If -1 there is no maximum distance */ - private float maximumHomeDistance = -1.0F; - - public EntityTFTowerGhast(World par1World) { - super(par1World); - //this.texture = TwilightForestMod.MODEL_DIR + "towerghast.png"; - - this.setSize(4.0F, 6.0F); - - this.aggroRange = 64.0F; - this.stareRange = 32.0F; - - this.wanderFactor = 16.0F; - - this.inTrapCounter = 0; - } -// -// public int getMaxHealth() -// { -// return 30; -// } - - /** - * Set monster attributes - */ - @Override - protected void applyEntityAttributes() - { - super.applyEntityAttributes(); - this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(30.0D); // max health - } - - /** - * Returns the volume for the sounds this mob makes. - */ - protected float getSoundVolume() - { - return 0.5F; - } - - /** - * Get number of ticks, at least during which the living entity will be silent. - */ - public int getTalkInterval() - { - return 160; - } - - /** - * Will return how many at most can spawn in a chunk at once. - */ - public int getMaxSpawnedInChunk() - { - return 8; - } - - @Override - public void onUpdate() - { - super.onUpdate(); - //byte aggroStatus = this.dataWatcher.getWatchableObjectByte(AGGRO_STATUS); - -// switch (aggroStatus) -// { -// case 0: -// default: -// this.texture = TwilightForestMod.MODEL_DIR + "towerghast.png"; -// break; -// case 1: -// this.texture = TwilightForestMod.MODEL_DIR + "towerghast_openeyes.png"; -// break; -// case 2: -// this.texture = TwilightForestMod.MODEL_DIR + "towerghast_fire.png"; -// break; -// } - } - - public int getAttackStatus() { - return this.dataWatcher.getWatchableObjectByte(AGGRO_STATUS); - } - - /** - * Called frequently so the entity can update its state every tick as required. For example, zombies and skeletons - * use this to react to sunlight and start to burn. - */ - public void onLivingUpdate() - { - // age when in light, like mobs - float var1 = this.getBrightness(1.0F); - - if (var1 > 0.5F) - { - this.entityAge += 2; - } - - if (this.rand.nextBoolean()) - { - this.worldObj.spawnParticle("reddust", this.posX + (this.rand.nextDouble() - 0.5D) * (double)this.width, this.posY + this.rand.nextDouble() * (double)this.height - 0.25D, this.posZ + (this.rand.nextDouble() - 0.5D) * (double)this.width, 0, 0, 0); - } - - super.onLivingUpdate(); - } - - /** - * Altered Ghast AI - */ - protected void updateEntityActionState() - { - if (!this.worldObj.isRemote && this.worldObj.difficultySetting == EnumDifficulty.PEACEFUL) - { - this.setDead(); - } - - this.despawnEntity(); - - // tower home - checkForTowerHome(); - - // check if in trap - if (this.inTrapCounter > 0) - { - this.inTrapCounter--; - this.targetedEntity = null; - return; // do nothing if in trap; - } - - this.prevAttackCounter = this.attackCounter; - - // target - if (this.targetedEntity != null && this.targetedEntity.isDead) - { - this.targetedEntity = null; - } - - if (this.targetedEntity == null) - { - this.targetedEntity = findPlayerInRange(); - } - else if (!this.isAggressive && this.targetedEntity instanceof EntityPlayer) - { - checkToIncreaseAggro((EntityPlayer) this.targetedEntity); - } - - // check if we are at our waypoint target - double offsetX = this.waypointX - this.posX; - double offsetY = this.waypointY - this.posY; - double offsetZ = this.waypointZ - this.posZ; - double distanceDesired = offsetX * offsetX + offsetY * offsetY + offsetZ * offsetZ; - - if ((distanceDesired < 1.0D || distanceDesired > 3600.0D) && this.wanderFactor > 0) - { - this.waypointX = this.posX + (double)((this.rand.nextFloat() * 2.0F - 1.0F) * wanderFactor); - this.waypointY = this.posY + (double)((this.rand.nextFloat() * 2.0F - 1.0F) * wanderFactor); - this.waypointZ = this.posZ + (double)((this.rand.nextFloat() * 2.0F - 1.0F) * wanderFactor); - } - - - - // move? - if (this.targetedEntity == null && this.wanderFactor > 0) - { - if (this.courseChangeCooldown-- <= 0) - { - this.courseChangeCooldown += this.rand.nextInt(20) + 20; - distanceDesired = (double)MathHelper.sqrt_double(distanceDesired); - - if (!this.isWithinHomeDistance(MathHelper.floor_double(waypointX), MathHelper.floor_double(waypointY), MathHelper.floor_double(waypointZ))) - { - // change waypoint to be more towards home - ChunkCoordinates cc = TFFeature.getNearestCenterXYZ(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.posZ), worldObj); - - Vec3 homeVector = Vec3.createVectorHelper(cc.posX - this.posX, cc.posY + 128 - this.posY, cc.posZ - this.posZ); - homeVector = homeVector.normalize(); - - this.waypointX = this.posX + homeVector.xCoord * 16.0F + (double)((this.rand.nextFloat() * 2.0F - 1.0F) * 16.0F); - this.waypointY = this.posY + homeVector.yCoord * 16.0F + (double)((this.rand.nextFloat() * 2.0F - 1.0F) * 16.0F); - this.waypointZ = this.posZ + homeVector.zCoord * 16.0F + (double)((this.rand.nextFloat() * 2.0F - 1.0F) * 16.0F); - - //System.out.println("Setting tower ghast on a course towards home: " + this.waypointX + ", " + this.waypointY + ", " + this.waypointZ); - } - - - if (this.isCourseTraversable(this.waypointX, this.waypointY, this.waypointZ, distanceDesired)) - { - this.motionX += offsetX / distanceDesired * 0.1D; - this.motionY += offsetY / distanceDesired * 0.1D; - this.motionZ += offsetZ / distanceDesired * 0.1D; - } - else - { - this.waypointX = this.posX; - this.waypointY = this.posY; - this.waypointZ = this.posZ; - } - } - } - else - { - this.motionX *= 0.75; - this.motionY *= 0.75; - this.motionZ *= 0.75; - } - - // check if our target is still within range - double targetRange = (this.aggroCounter > 0 || this.isAggressive) ? aggroRange : stareRange; - - if (this.targetedEntity != null && this.targetedEntity.getDistanceSqToEntity(this) < targetRange * targetRange && this.canEntityBeSeen(this.targetedEntity)) - { - // turn towards target - this.faceEntity(this.targetedEntity, 10F, this.getVerticalFaceSpeed()); - - // attack if aggressive - if (this.isAggressive) - { - if (this.attackCounter == 10) - { - this.worldObj.playAuxSFXAtEntity((EntityPlayer)null, 1007, (int)this.posX, (int)this.posY, (int)this.posZ, 0); - } - - ++this.attackCounter; - - if (this.attackCounter == 20) - { - spitFireball(); - this.attackCounter = -40; - } - } - } - else - { - // ignore player, move normally - this.isAggressive = false; - this.targetedEntity = null; - this.renderYawOffset = this.rotationYaw = -((float)Math.atan2(this.motionX, this.motionZ)) * 180.0F / (float)Math.PI; - - // changing the pitch with movement looks goofy and un-ghast-like - //double dist = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ); - this.rotationPitch = 0;//(float) (-((Math.atan2(this.motionY, dist) * 180D) / Math.PI));; - - } - - if (this.attackCounter > 0 && !this.isAggressive) - { - --this.attackCounter; - } - - // set aggro status - byte currentAggroStatus = this.dataWatcher.getWatchableObjectByte(AGGRO_STATUS); - byte newAggroStatus = (byte)(this.attackCounter > 10 ? 2 : (this.aggroCounter > 0 || this.isAggressive) ? 1 : 0); - - if (currentAggroStatus != newAggroStatus) - { - this.dataWatcher.updateObject(AGGRO_STATUS, Byte.valueOf(newAggroStatus)); - } - } - - - /** - * Something is deeply wrong with the calculations based off of this value, so let's set it high enough that it's ignored. - */ - @Override - public int getVerticalFaceSpeed() - { - return 500; - } - - /** - * Spit a fireball - */ - protected void spitFireball() { - double offsetX = this.targetedEntity.posX - this.posX; - double offsetY = this.targetedEntity.boundingBox.minY + (double)(this.targetedEntity.height / 2.0F) - (this.posY + (double)(this.height / 2.0F)); - double offsetZ = this.targetedEntity.posZ - this.posZ; - - // fireball sound effect - this.worldObj.playAuxSFXAtEntity((EntityPlayer)null, 1008, (int)this.posX, (int)this.posY, (int)this.posZ, 0); - - - EntityLargeFireball entityFireball = new EntityLargeFireball(this.worldObj, this, offsetX, offsetY, offsetZ); - //var17.field_92012_e = this.explosionPower; - double shotSpawnDistance = 0.5D; - Vec3 lookVec = this.getLook(1.0F); - entityFireball.posX = this.posX + lookVec.xCoord * shotSpawnDistance; - entityFireball.posY = this.posY + (double)(this.height / 2.0F) + lookVec.yCoord * shotSpawnDistance; - entityFireball.posZ = this.posZ + lookVec.zCoord * shotSpawnDistance; - this.worldObj.spawnEntityInWorld(entityFireball); - - // when we attack, there is a 1-in-6 chance we decide to stop attacking - if (rand.nextInt(6) == 0) - { - this.isAggressive = false; - } - } - - /** - * Find a player in our aggro range. If we feel the need to become aggressive towards that - * player, or it is within our stare range, return - * - * @return - */ - protected EntityLivingBase findPlayerInRange() { - EntityPlayer closest = this.worldObj.getClosestVulnerablePlayerToEntity(this, aggroRange); - - if (closest != null) - { - float range = this.getDistanceToEntity(closest); - if (range < this.stareRange || this.shouldAttackPlayer(closest)) - { - return closest; - } - } - return null; - } - - /** - * Check if we should become aggressive towards the player. - * - * @param par1EntityPlayer - */ - protected void checkToIncreaseAggro(EntityPlayer par1EntityPlayer) - { - if (this.shouldAttackPlayer(par1EntityPlayer)) - { - if (this.aggroCounter == 0) - { - this.worldObj.playSoundAtEntity(this, "mob.ghast.moan", 1.0F, 1.0F); - } - - if (this.aggroCounter++ >= 20) - { - this.aggroCounter = 0; - this.isAggressive = true; - } - } - else - { - this.aggroCounter = 0; - } - } - - - - /** - * Checks to see if this tower ghast should be attacking this player. - * Tower ghasts attack if the block above the player is not Tower wood - */ - protected boolean shouldAttackPlayer(EntityPlayer par1EntityPlayer) - { - int dx = MathHelper.floor_double(par1EntityPlayer.posX); - int dy = MathHelper.floor_double(par1EntityPlayer.posY); - int dz = MathHelper.floor_double(par1EntityPlayer.posZ); - - return worldObj.canBlockSeeTheSky(dx, dy, dz) && par1EntityPlayer.canEntityBeSeen(this); - } - - - - /** - * True if the ghast has an unobstructed line of travel to the waypoint. - */ - protected boolean isCourseTraversable(double par1, double par3, double par5, double par7) - { - double var9 = (this.waypointX - this.posX) / par7; - double var11 = (this.waypointY - this.posY) / par7; - double var13 = (this.waypointZ - this.posZ) / par7; - AxisAlignedBB var15 = this.boundingBox.copy(); - - for (int var16 = 1; (double)var16 < par7; ++var16) - { - var15.offset(var9, var11, var13); - - if (!this.worldObj.getCollidingBoundingBoxes(this, var15).isEmpty()) - { - return false; - } - } - - return true; - } - - /** - * Called when the entity is attacked. - */ - public boolean attackEntityFrom(DamageSource par1DamageSource, float par2) - { - boolean wasAttacked = super.attackEntityFrom(par1DamageSource, par2); - - if (wasAttacked && par1DamageSource.getSourceOfDamage() instanceof EntityLivingBase) - { - this.targetedEntity = (EntityLivingBase)par1DamageSource.getSourceOfDamage(); - - this.isAggressive = true; - - return true; - } - else - { - return wasAttacked; - } - } - - /** - * Checks if the entity's current position is a valid location to spawn this entity. - */ - public boolean getCanSpawnHere() - { - return this.worldObj.checkNoEntityCollision(this.boundingBox) - && this.worldObj.getCollidingBoundingBoxes(this, this.boundingBox).isEmpty() - && !this.worldObj.isAnyLiquid(this.boundingBox) - && this.worldObj.difficultySetting != EnumDifficulty.PEACEFUL - && this.isValidLightLevel(); - } - - /** - * Checks to make sure the light is not too bright where the mob is spawning - */ - protected boolean isValidLightLevel() - { - return true; - } - - /** - * Check for our tower home and if we find it, set it - */ - protected void checkForTowerHome() - { - if (!this.hasHome()) - { - // check if we're near a dark forest tower and if so, set that as home - int chunkX = MathHelper.floor_double(this.posX) >> 4; - int chunkZ = MathHelper.floor_double(this.posZ) >> 4; - - TFFeature nearFeature = TFFeature.getFeatureForRegion(chunkX, chunkZ, this.worldObj); - - if (nearFeature != TFFeature.darkTower) - { - this.detachHome(); - - this.entityAge += 5; - - //System.out.println("Tower ghast is lost"); - - } - else - { - // set our home position to the center of the tower - ChunkCoordinates cc = TFFeature.getNearestCenterXYZ(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.posZ), worldObj); - this.setHomeArea(cc.posX, cc.posY + 128, cc.posZ, 64); - -// System.out.println("Ghast is at " + this.posX + ", " + this.posY + ", " + this.posZ); -// System.out.println("Set home area to " + cc.posX + ", " + (cc.posY + 128) + ", " + cc.posZ); - } - } - } - - /** - * Towers are so large, a simple radius doesn't really work, so we make it more of a cylinder - */ - public boolean isWithinHomeDistance(int x, int y, int z) - { - if (this.getMaximumHomeDistance() == -1.0F) - { - return true; - } - else - { - ChunkCoordinates home = this.getHomePosition(); - -// System.out.println("Checking home for " + x + ", " + y + ", " + z + " and home is " + home.posX + ", " + home.posY + ", " + home.posZ); -// System.out.println("home.getDistanceSquared(x, home.posY, z) = " + home.getDistanceSquared(x, home.posY, z) + " compared to " + (this.getMaximumHomeDistance() * this.getMaximumHomeDistance())); - - return y > 64 && y < 210 && home.getDistanceSquared(x, home.posY, z) < this.getMaximumHomeDistance() * this.getMaximumHomeDistance(); - } - } - - public void setInTrap() - { - this.inTrapCounter = 10; - } - - public void setHomeArea(int par1, int par2, int par3, int par4) - { - this.homePosition.set(par1, par2, par3); - this.maximumHomeDistance = (float)par4; - } - - public ChunkCoordinates getHomePosition() - { - return this.homePosition; - } - - public float getMaximumHomeDistance() - { - return this.maximumHomeDistance; - } - - public void detachHome() - { - this.maximumHomeDistance = -1.0F; - } - - public boolean hasHome() - { - return this.maximumHomeDistance != -1.0F; - } -} - diff --git a/src/main/java/twilightforest/entity/EntityTFTowerGolem.java b/src/main/java/twilightforest/entity/EntityTFTowerGolem.java deleted file mode 100644 index 2481aa0b2e..0000000000 --- a/src/main/java/twilightforest/entity/EntityTFTowerGolem.java +++ /dev/null @@ -1,230 +0,0 @@ -package twilightforest.entity; - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.ai.EntityAIAttackOnCollide; -import net.minecraft.entity.ai.EntityAIHurtByTarget; -import net.minecraft.entity.ai.EntityAILookIdle; -import net.minecraft.entity.ai.EntityAINearestAttackableTarget; -import net.minecraft.entity.ai.EntityAIWander; -import net.minecraft.entity.ai.EntityAIWatchClosest; -import net.minecraft.entity.monster.EntityMob; -import net.minecraft.entity.monster.IMob; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Items; -import net.minecraft.item.Item; -import net.minecraft.util.MathHelper; -import net.minecraft.world.World; -import twilightforest.block.TFBlocks; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public class EntityTFTowerGolem extends EntityMob -{ - - private int attackTimer; - - public EntityTFTowerGolem(World par1World) - { - super(par1World); - //this.texture = TwilightForestMod.MODEL_DIR + "carminitegolem.png"; - - this.setSize(1.4F, 2.9F); - //this.moveSpeed = 0.25F; - - - this.getNavigator().setAvoidsWater(true); - this.tasks.addTask(1, new EntityAIAttackOnCollide(this, EntityPlayer.class, 1.0D, false)); - this.tasks.addTask(2, new EntityAIWander(this, 1.0F)); - this.tasks.addTask(3, new EntityAIWatchClosest(this, EntityPlayer.class, 6.0F)); - this.tasks.addTask(3, new EntityAILookIdle(this)); - this.targetTasks.addTask(1, new EntityAIHurtByTarget(this, false)); - this.targetTasks.addTask(2, new EntityAINearestAttackableTarget(this, EntityPlayer.class, 0, true)); - } - - /** - * Returns true if the newer Entity AI code should be run - */ - @Override - protected boolean isAIEnabled() - { - return true; - } - - /** - * Set monster attributes - */ - @Override - protected void applyEntityAttributes() - { - super.applyEntityAttributes(); - this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(40.0D); // max health - this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.25D); // movement speed - this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(9.0D); // attack damage - } - - /** - * Returns the current armor value as determined by a call to InventoryPlayer.getTotalArmorValue - */ - @Override - public int getTotalArmorValue() - { - int var1 = super.getTotalArmorValue() + 2; - - if (var1 > 20) - { - var1 = 20; - } - - return var1; - } - - public boolean attackEntityAsMob(Entity par1Entity) - { - this.attackTimer = 10; - this.worldObj.setEntityState(this, (byte)4); - boolean attackSuccess = super.attackEntityAsMob(par1Entity); - - if (attackSuccess) - { - par1Entity.motionY += 0.4000000059604645D; - } - - this.playSound("mob.irongolem.throw", 1.0F, 1.0F); - return attackSuccess; - } - - /** - * Returns the sound this mob makes while it's alive. - */ - protected String getLivingSound() - { - return "none"; - } - - /** - * Returns the sound this mob makes when it is hurt. - */ - protected String getHurtSound() - { - return "mob.irongolem.hit"; - } - - /** - * Returns the sound this mob makes on death. - */ - protected String getDeathSound() - { - return "mob.irongolem.death"; - } - - /** - * Plays step sound at given x, y, z for the entity - */ - protected void func_145780_a(int par1, int par2, int par3, Block par4) - { - this.playSound("mob.irongolem.walk", 1.0F, 1.0F); - } - - - protected void collideWithEntity(Entity par1Entity) - { - if (par1Entity instanceof IMob && this.getRNG().nextInt(10) == 0) - { - this.setAttackTarget((EntityLivingBase)par1Entity); - } - - super.collideWithEntity(par1Entity); - } - - - /** - * Called frequently so the entity can update its state every tick as required. For example, zombies and skeletons - * use this to react to sunlight and start to burn. - */ - public void onLivingUpdate() - { - super.onLivingUpdate(); - - if (this.attackTimer > 0) - { - --this.attackTimer; - } - - if (this.motionX * this.motionX + this.motionZ * this.motionZ > 2.500000277905201E-7D && this.rand.nextInt(5) == 0) - { - int var1 = MathHelper.floor_double(this.posX); - int var2 = MathHelper.floor_double(this.posY - 0.20000000298023224D - (double)this.yOffset); - int var3 = MathHelper.floor_double(this.posZ); - Block block = this.worldObj.getBlock(var1, var2, var3); - - if (block.getMaterial() != Material.air) - { - this.worldObj.spawnParticle("blockcrack_" + Block.getIdFromBlock(block) + "_" + this.worldObj.getBlockMetadata(var1, var2, var3), this.posX + ((double)this.rand.nextFloat() - 0.5D) * (double)this.width, this.boundingBox.minY + 0.1D, this.posZ + ((double)this.rand.nextFloat() - 0.5D) * (double)this.width, 4.0D * ((double)this.rand.nextFloat() - 0.5D), 0.5D, ((double)this.rand.nextFloat() - 0.5D) * 4.0D); - } - } - - // redstone sparkles? - if (this.rand.nextBoolean()) - { - this.worldObj.spawnParticle("reddust", this.posX + (this.rand.nextDouble() - 0.5D) * (double)this.width, this.posY + this.rand.nextDouble() * (double)this.height - 0.25D, this.posZ + (this.rand.nextDouble() - 0.5D) * (double)this.width, 0, 0, 0); - } - - } - - - @SideOnly(Side.CLIENT) - public void handleHealthUpdate(byte par1) - { - if (par1 == 4) - { - this.attackTimer = 10; - this.playSound("mob.irongolem.throw", 1.0F, 1.0F); - } - else - { - super.handleHealthUpdate(par1); - } - } - - @SideOnly(Side.CLIENT) - public int getAttackTimer() - { - return this.attackTimer; - } - - /** - * Drop 0-2 items of this living's type. @param par1 - Whether this entity has recently been hit by a player. @param - * par2 - Level of Looting used to kill this mob. - */ - protected void dropFewItems(boolean par1, int par2) - { - int var4; - - var4 = this.rand.nextInt(3); - - for (int i = 0; i < var4; ++i) - { - this.dropItem(Items.iron_ingot, 1); - } - - var4 = this.rand.nextInt(3); - - for (int i = 0; i < var4; ++i) - { - this.dropItem(Item.getItemFromBlock(TFBlocks.towerWood), 1); - } - } - - /** - * Will return how many at most can spawn in a chunk at once. - */ - public int getMaxSpawnedInChunk() - { - return 16; - } - -} diff --git a/src/main/java/twilightforest/entity/EntityTFTowerTermite.java b/src/main/java/twilightforest/entity/EntityTFTowerTermite.java deleted file mode 100644 index 864bb34ad5..0000000000 --- a/src/main/java/twilightforest/entity/EntityTFTowerTermite.java +++ /dev/null @@ -1,266 +0,0 @@ -package twilightforest.entity; - -import net.minecraft.block.Block; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EnumCreatureAttribute; -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.ai.EntityAIAttackOnCollide; -import net.minecraft.entity.ai.EntityAIHurtByTarget; -import net.minecraft.entity.ai.EntityAILookIdle; -import net.minecraft.entity.ai.EntityAINearestAttackableTarget; -import net.minecraft.entity.ai.EntityAISwimming; -import net.minecraft.entity.ai.EntityAIWander; -import net.minecraft.entity.ai.EntityAIWatchClosest; -import net.minecraft.entity.monster.EntityMob; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.item.Item; -import net.minecraft.util.DamageSource; -import net.minecraft.util.EntityDamageSource; -import net.minecraft.util.Facing; -import net.minecraft.util.MathHelper; -import net.minecraft.world.World; -import twilightforest.block.BlockTFTowerWood; -import twilightforest.block.TFBlocks; -import twilightforest.item.TFItems; - -public class EntityTFTowerTermite extends EntityMob -{ - - private int allySummonCooldown; - - public EntityTFTowerTermite(World par1World) { - super(par1World); - - //this.texture = TwilightForestMod.MODEL_DIR + "towertermite.png"; - this.setSize(0.3F, 0.7F); - //this.moveSpeed = 0.27F; - - this.tasks.addTask(0, new EntityAISwimming(this)); - this.tasks.addTask(1, new EntityAIAttackOnCollide(this, EntityPlayer.class, 1.0D, false)); - this.tasks.addTask(2, new EntityAIWander(this, 1.0D)); - this.tasks.addTask(3, new EntityAIWatchClosest(this, EntityPlayer.class, 8.0F)); - this.tasks.addTask(4, new EntityAILookIdle(this)); - this.targetTasks.addTask(1, new EntityAIHurtByTarget(this, true)); - this.targetTasks.addTask(2, new EntityAINearestAttackableTarget(this, EntityPlayer.class, 0, true)); - } - - /** - * Returns true if the newer Entity AI code should be run - */ - @Override - protected boolean isAIEnabled() - { - return true; - } - - - /** - * Set monster attributes - */ - @Override - protected void applyEntityAttributes() - { - super.applyEntityAttributes(); - this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(15.0D); // max health - this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.27D); // movement speed - this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(5.0D); // attack damage - } - - /** - * returns if this entity triggers Blocks.onEntityWalking on the blocks they walk on. used for spiders and wolves to - * prevent them from trampling crops - */ - protected boolean canTriggerWalking() - { - return false; - } - - /** - * Finds the closest player within 16 blocks to attack, or null if this Entity isn't interested in attacking - * (Animals, Spiders at day, peaceful PigZombies). - */ - protected Entity findPlayerToAttack() - { - double var1 = 8.0D; - return this.worldObj.getClosestVulnerablePlayerToEntity(this, var1); - } - - /** - * Returns the sound this mob makes while it's alive. - */ - protected String getLivingSound() - { - return "mob.silverfish.say"; - } - - /** - * Returns the sound this mob makes when it is hurt. - */ - protected String getHurtSound() - { - return "mob.silverfish.hit"; - } - - /** - * Returns the sound this mob makes on death. - */ - protected String getDeathSound() - { - return "mob.silverfish.kill"; - } - - /** - * Called when the entity is attacked. - */ - public boolean attackEntityFrom(DamageSource par1DamageSource, int par2) - { - if (this.isEntityInvulnerable()) - { - return false; - } - else - { - if (this.allySummonCooldown <= 0 && (par1DamageSource instanceof EntityDamageSource || par1DamageSource == DamageSource.magic)) - { - this.allySummonCooldown = 20; - } - - return super.attackEntityFrom(par1DamageSource, par2); - } - } - - protected void updateAITasks() - { - super.updateAITasks(); - - // if we are summoning allies, do that - if (this.allySummonCooldown > 0) - { - --this.allySummonCooldown; - - if (this.allySummonCooldown == 0) - { - tryToSummonAllies(); - } - } - - - // if we have no target, burrow - if (this.getAttackTarget() == null && this.getNavigator().noPath()) - { - tryToBurrow(); - } - - } - - /** - * Check nearby blocks. If they are infested blocks, pop them! - */ - protected void tryToSummonAllies() { - int sx = MathHelper.floor_double(this.posX); - int sy = MathHelper.floor_double(this.posY); - int sz = MathHelper.floor_double(this.posZ); - boolean stopSummoning = false; - - for (int dy = 0; !stopSummoning && dy <= 5 && dy >= -5; dy = dy <= 0 ? 1 - dy : 0 - dy) - { - for (int dx = 0; !stopSummoning && dx <= 10 && dx >= -10; dx = dx <= 0 ? 1 - dx : 0 - dx) - { - for (int dz = 0; !stopSummoning && dz <= 10 && dz >= -10; dz = dz <= 0 ? 1 - dz : 0 - dz) - { - Block blockID = this.worldObj.getBlock(sx + dx, sy + dy, sz + dz); - int blockMeta = this.worldObj.getBlockMetadata(sx + dx, sy + dy, sz + dz); - - if (blockID == TFBlocks.towerWood && blockMeta == BlockTFTowerWood.META_INFESTED) - { - this.worldObj.playAuxSFX(2001, sx + dx, sy + dy, sz + dz, Block.getIdFromBlock(blockID) + (blockMeta << 12)); - this.worldObj.setBlock(sx + dx, sy + dy, sz + dz, Blocks.air, 0, 3); - TFBlocks.towerWood.onBlockDestroyedByPlayer(this.worldObj, sx + dx, sy + dy, sz + dz, BlockTFTowerWood.META_INFESTED); - - if (this.rand.nextBoolean()) - { - stopSummoning = true; - break; - } - } - } - } - } - } - - /** - * Look at a random nearby block. Is it the proper tower wood? If so, burrow. - */ - protected void tryToBurrow() { - int x = MathHelper.floor_double(this.posX); - int y = MathHelper.floor_double(this.posY + 0.5D); - int z = MathHelper.floor_double(this.posZ); - int randomFacing = this.rand.nextInt(6); - - x += Facing.offsetsXForSide[randomFacing]; - y += Facing.offsetsYForSide[randomFacing]; - z += Facing.offsetsZForSide[randomFacing]; - - Block blockIDNearby = this.worldObj.getBlock(x, y, z); - int blockMetaNearby = this.worldObj.getBlockMetadata(x, y, z); - - if (canBurrowIn(blockIDNearby, blockMetaNearby)) - { - this.worldObj.setBlock(x, y, z, TFBlocks.towerWood, BlockTFTowerWood.META_INFESTED, 3); - this.spawnExplosionParticle(); - this.setDead(); - } - } - - /** - * @return true if we can burrow in the specified block - */ - protected boolean canBurrowIn(Block blockIDNearby, int blockMetaNearby) - { - return blockIDNearby == TFBlocks.towerWood && blockMetaNearby == 0; - } - - /** - * @return true if the nearby block is infested - */ - protected boolean isInfestedBlock(Block blockIDNearby, int blockMetaNearby) - { - return blockIDNearby == TFBlocks.towerWood && blockMetaNearby == BlockTFTowerWood.META_INFESTED; - } - - /** - * Plays step sound at given x, y, z for the entity - */ - protected void func_145780_a(int par1, int par2, int par3, Block par4) - { - this.playSound("mob.silverfish.step", 0.15F, 1.0F); - } - - /** - * Returns the item ID for the item the mob drops on death. - */ - protected Item getDropItem() - { - return TFItems.borerEssence; - } - - /** - * Called to update the entity's position/logic. - */ - public void onUpdate() - { - this.renderYawOffset = this.rotationYaw; - super.onUpdate(); - } - - - /** - * Get this Entity's EnumCreatureAttribute - */ - public EnumCreatureAttribute getCreatureAttribute() - { - return EnumCreatureAttribute.ARTHROPOD; - } - -} diff --git a/src/main/java/twilightforest/entity/EntityTFTroll.java b/src/main/java/twilightforest/entity/EntityTFTroll.java deleted file mode 100644 index a0142c6561..0000000000 --- a/src/main/java/twilightforest/entity/EntityTFTroll.java +++ /dev/null @@ -1,343 +0,0 @@ -package twilightforest.entity; - -import net.minecraft.block.Block; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.IRangedAttackMob; -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.ai.EntityAIArrowAttack; -import net.minecraft.entity.ai.EntityAIAttackOnCollide; -import net.minecraft.entity.ai.EntityAIFleeSun; -import net.minecraft.entity.ai.EntityAIHurtByTarget; -import net.minecraft.entity.ai.EntityAILookIdle; -import net.minecraft.entity.ai.EntityAINearestAttackableTarget; -import net.minecraft.entity.ai.EntityAIRestrictSun; -import net.minecraft.entity.ai.EntityAISwimming; -import net.minecraft.entity.ai.EntityAIWander; -import net.minecraft.entity.ai.EntityAIWatchClosest; -import net.minecraft.entity.monster.EntityMob; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.init.Items; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.network.play.server.S0BPacketAnimation; -import net.minecraft.potion.Potion; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.DamageSource; -import net.minecraft.util.MathHelper; -import net.minecraft.world.World; -import net.minecraft.world.WorldServer; -import twilightforest.TFAchievementPage; -import twilightforest.block.TFBlocks; -import twilightforest.entity.ai.EntityAITFCollideAttackFixed; -import twilightforest.entity.boss.EntityTFIceBomb; -import twilightforest.item.TFItems; - -public class EntityTFTroll extends EntityMob implements IRangedAttackMob -{ - private static final int ROCK_FLAG = 16; - - private EntityAIArrowAttack aiArrowAttack = new EntityAIArrowAttack(this, 1.0D, 20, 60, 15.0F); - private EntityAITFCollideAttackFixed aiAttackOnCollide = new EntityAITFCollideAttackFixed(this, EntityPlayer.class, 1.2D, false); - - public EntityTFTroll(World par1World) - { - super(par1World); - this.setSize(1.4F, 2.4F); - - this.tasks.addTask(1, new EntityAISwimming(this)); - this.tasks.addTask(2, new EntityAIRestrictSun(this)); - this.tasks.addTask(3, new EntityAIFleeSun(this, 1.0D)); - this.tasks.addTask(5, new EntityAIWander(this, 1.0D)); - this.tasks.addTask(6, new EntityAIWatchClosest(this, EntityPlayer.class, 8.0F)); - this.tasks.addTask(6, new EntityAILookIdle(this)); - this.targetTasks.addTask(1, new EntityAIHurtByTarget(this, false)); - this.targetTasks.addTask(2, new EntityAINearestAttackableTarget(this, EntityPlayer.class, 0, true)); - - if (par1World != null && !par1World.isRemote) - { - this.setCombatTask(); - } - } - - - /** - * Returns true if the newer Entity AI code should be run - */ - @Override - protected boolean isAIEnabled() - { - return true; - } - - /** - * Set monster attributes - */ - @Override - protected void applyEntityAttributes() - { - super.applyEntityAttributes(); - this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(30.0D); // max health - this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.28D); // movement speed - this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(7.0D); - } - - protected void entityInit() - { - super.entityInit(); - this.dataWatcher.addObject(ROCK_FLAG, Byte.valueOf((byte)0)); - } - - /** - * Called frequently so the entity can update its state every tick as required. For example, zombies and skeletons - * use this to react to sunlight and start to burn. - */ - @Override - public void onLivingUpdate() - { - super.onLivingUpdate(); - } - - - /** - * Determines whether this troll has a rock or not. - */ - public boolean hasRock() { - return (this.dataWatcher.getWatchableObjectByte(ROCK_FLAG) & 2) != 0; - } - - /** - * Sets whether this troll has a rock or not. - */ - public void setHasRock(boolean rock) { - byte b0 = this.dataWatcher.getWatchableObjectByte(ROCK_FLAG); - - if (rock) { - this.getEntityAttribute(SharedMonsterAttributes.followRange).setBaseValue(40.0D); - this.dataWatcher.updateObject(ROCK_FLAG, Byte.valueOf((byte)(b0 | 2))); - } else { - this.dataWatcher.updateObject(ROCK_FLAG, Byte.valueOf((byte)(b0 & -3))); - } - - this.setCombatTask(); - } - - /** - * Swing! - */ - @Override - public boolean attackEntityAsMob(Entity par1Entity) { - - this.swingItem(); - - return super.attackEntityAsMob(par1Entity); - } - - /** - * (abstract) Protected helper method to write subclass entity data to NBT. - */ - public void writeEntityToNBT(NBTTagCompound par1NBTTagCompound) - { - super.writeEntityToNBT(par1NBTTagCompound); - par1NBTTagCompound.setBoolean("HasRock", this.hasRock()); - } - - /** - * (abstract) Protected helper method to read subclass entity data from NBT. - */ - public void readEntityFromNBT(NBTTagCompound par1NBTTagCompound) - { - super.readEntityFromNBT(par1NBTTagCompound); - this.setHasRock(par1NBTTagCompound.getBoolean("HasRock")); - } - - - /** - * sets this entity's combat AI. - */ - public void setCombatTask() - { - this.tasks.removeTask(this.aiAttackOnCollide); - this.tasks.removeTask(this.aiArrowAttack); - - if (this.hasRock()) { - this.tasks.addTask(4, this.aiArrowAttack); - } else { - this.tasks.addTask(4, this.aiAttackOnCollide); - } - } - - /** - * handles entity death timer, experience orb and particle creation - */ - protected void onDeathUpdate() { - super.onDeathUpdate(); - - if (this.deathTime % 5 == 0) { - this.ripenTrollBerNearby(this.deathTime / 5); - } - - if (this.deathTime == 1) { - //this.makeTrollStoneInAABB(this.boundingBox); - } - } - - - private void ripenTrollBerNearby(int offset) { - int sx = MathHelper.floor_double(this.posX); - int sy = MathHelper.floor_double(this.posY); - int sz = MathHelper.floor_double(this.posZ); - - int range = 12; - for (int dx = -range; dx < range; dx++) { - for (int dy = -range; dy < range; dy++) { - for (int dz = -range; dz < range; dz++) { - if (true) { - int cx = sx + dx; - int cy = sy + dy; - int cz = sz + dz; - - ripenBer(offset, cx, cy, cz); - } - } - } - } - } - - - private void ripenBer(int offset, int cx, int cy, int cz) { - if (this.worldObj.getBlock(cx, cy, cz) == TFBlocks.unripeTrollBer && this.rand.nextBoolean() && (Math.abs(cx + cy + cz) % 5 == offset)) { - this.worldObj.setBlock(cx, cy, cz, TFBlocks.trollBer); - worldObj.playAuxSFX(2004, cx, cy, cz, 0); - - } - } - - - /** - * Trigger achievement when killed - */ - @Override - public void onDeath(DamageSource par1DamageSource) { - super.onDeath(par1DamageSource); - if (par1DamageSource.getSourceOfDamage() instanceof EntityPlayer) { - ((EntityPlayer)par1DamageSource.getSourceOfDamage()).triggerAchievement(TFAchievementPage.twilightHunter); - } - - } - - /** - * Turns blocks to trollstone inside the given bounding box. - */ - private void makeTrollStoneInAABB(AxisAlignedBB par1AxisAlignedBB) - { - //System.out.println("Destroying blocks in " + par1AxisAlignedBB); - - int minX = MathHelper.ceiling_double_int(par1AxisAlignedBB.minX); - int minY = MathHelper.ceiling_double_int(par1AxisAlignedBB.minY); - int minZ = MathHelper.ceiling_double_int(par1AxisAlignedBB.minZ); - int maxX = MathHelper.floor_double(par1AxisAlignedBB.maxX); - int maxY = MathHelper.floor_double(par1AxisAlignedBB.maxY); - int maxZ = MathHelper.floor_double(par1AxisAlignedBB.maxZ); - - for (int dx = minX; dx <= maxX; ++dx) - { - for (int dy = minY; dy <= maxY; ++dy) - { - for (int dz = minZ; dz <= maxZ; ++dz) - { - Block currentID = this.worldObj.getBlock(dx, dy, dz); - - if (currentID == Blocks.air) - { - this.worldObj.setBlock(dx, dy, dz, TFBlocks.trollSteinn); - // here, this effect will have to do - worldObj.playAuxSFX(2001, dx, dy, dz, Block.getIdFromBlock(TFBlocks.trollSteinn) + (0 << 12)); - } - } - } - } - } - - protected Item getDropItem() - { - return null; - } - - protected void dropRareDrop(int p_70600_1_) - { - this.dropItem(TFItems.magicBeans, 1); - } - - /** - * Attack the specified entity using a ranged attack. - */ - public void attackEntityWithRangedAttack(EntityLivingBase target, float par2) - { - if (this.hasRock()) { - - EntityTFIceBomb ice = new EntityTFIceBomb(this.worldObj, this); - - double d0 = target.posX - this.posX; - double d1 = target.posY + (double)target.getEyeHeight() - 1.100000023841858D - target.posY; - double d2 = target.posZ - this.posZ; - float f1 = MathHelper.sqrt_double(d0 * d0 + d2 * d2) * 0.2F; - ice.setThrowableHeading(d0, d1 + (double)f1, d2, 0.75F, 12.0F); - - this.playSound("random.bow", 1.0F, 1.0F / (this.getRNG().nextFloat() * 0.4F + 0.8F)); - this.worldObj.spawnEntityInWorld(ice); - } - } - - - /** - * Swings the item the player is holding. - */ - public void swingItem() { - if (!this.isSwingInProgress || this.swingProgressInt >= this.getArmSwingAnimationEnd() / 2 || this.swingProgressInt < 0) { - this.swingProgressInt = -1; - this.isSwingInProgress = true; - - if (this.worldObj instanceof WorldServer) - { - ((WorldServer)this.worldObj).getEntityTracker().func_151247_a(this, new S0BPacketAnimation(this, 0)); - } - } - } - - /** - * Updates the arm swing progress counters and animation progress - */ - protected void updateArmSwingProgress() - { - int maxSwing = this.getArmSwingAnimationEnd(); - - if (this.isSwingInProgress) - { - ++this.swingProgressInt; - - if (this.swingProgressInt >= maxSwing) - { - this.swingProgressInt = 0; - this.isSwingInProgress = false; - } - } - else - { - this.swingProgressInt = 0; - } - - this.swingProgress = (float)this.swingProgressInt / (float)maxSwing; - } - - /** - * Returns an integer indicating the end point of the swing animation, used by {@link #swingProgress} to provide a - * progress indicator. Takes dig speed enchantments into account. - */ - private int getArmSwingAnimationEnd() - { - return 6; - } -} diff --git a/src/main/java/twilightforest/entity/EntityTFTwilightWandBolt.java b/src/main/java/twilightforest/entity/EntityTFTwilightWandBolt.java deleted file mode 100644 index 81b386c0ee..0000000000 --- a/src/main/java/twilightforest/entity/EntityTFTwilightWandBolt.java +++ /dev/null @@ -1,85 +0,0 @@ -package twilightforest.entity; - -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.projectile.EntityThrowable; -import net.minecraft.init.Items; -import net.minecraft.item.Item; -import net.minecraft.util.DamageSource; -import net.minecraft.util.MovingObjectPosition; -import net.minecraft.world.World; - - -public class EntityTFTwilightWandBolt extends EntityThrowable { - - public EntityTFTwilightWandBolt(World par1World) { - super(par1World); - } - - - public EntityTFTwilightWandBolt(World par1World, double par2, double par4, double par6) { - super(par1World, par2, par4, par6); - // TODO Auto-generated constructor stub - } - - - public EntityTFTwilightWandBolt(World par1World, EntityLivingBase par2EntityLiving) { - super(par1World, par2EntityLiving); - // TODO Auto-generated constructor stub - } - - @Override - public void onUpdate() { - super.onUpdate(); - - makeTrail(); - } - - public void makeTrail() { - for (int i = 0; i < 5; i++) { - double dx = posX + 0.5 * (rand.nextDouble() - rand.nextDouble()); - double dy = posY + 0.5 * (rand.nextDouble() - rand.nextDouble()); - double dz = posZ + 0.5 * (rand.nextDouble() - rand.nextDouble()); - - double s1 = ((rand.nextFloat() * 0.5F) + 0.5F) * 0.17F; // color - double s2 = ((rand.nextFloat() * 0.5F) + 0.5F) * 0.80F; // color - double s3 = ((rand.nextFloat() * 0.5F) + 0.5F) * 0.69F; // color - - worldObj.spawnParticle("mobSpell", dx, dy, dz, s1, s2, s3); - } - } - - /** - * How much this entity falls each tick - */ - @Override - protected float getGravityVelocity() - { - return 0.003F; - } - - - - @Override - protected void onImpact(MovingObjectPosition par1MovingObjectPosition) { - // only hit living things - if (par1MovingObjectPosition.entityHit != null && par1MovingObjectPosition.entityHit instanceof EntityLivingBase) - { - if (par1MovingObjectPosition.entityHit.attackEntityFrom(DamageSource.causeIndirectMagicDamage(this, this.getThrower()), 6)) - { - ; - } - } - - for (int i = 0; i < 8; ++i) - { - this.worldObj.spawnParticle("iconcrack_" + Item.getIdFromItem(Items.ender_pearl), this.posX, this.posY, this.posZ, rand.nextGaussian() * 0.05D, rand.nextDouble() * 0.2D, rand.nextGaussian() * 0.05D); - } - - if (!this.worldObj.isRemote) - { - this.setDead(); - } - - } - -} diff --git a/src/main/java/twilightforest/entity/EntityTFWinterWolf.java b/src/main/java/twilightforest/entity/EntityTFWinterWolf.java deleted file mode 100644 index 0bd5c90096..0000000000 --- a/src/main/java/twilightforest/entity/EntityTFWinterWolf.java +++ /dev/null @@ -1,176 +0,0 @@ -package twilightforest.entity; - -import net.minecraft.entity.Entity; -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.ai.EntityAIAttackOnCollide; -import net.minecraft.entity.ai.EntityAIHurtByTarget; -import net.minecraft.entity.ai.EntityAINearestAttackableTarget; -import net.minecraft.entity.ai.EntityAISwimming; -import net.minecraft.entity.ai.EntityAIWander; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.Item; -import net.minecraft.util.DamageSource; -import net.minecraft.util.MathHelper; -import net.minecraft.util.Vec3; -import net.minecraft.world.World; -import twilightforest.TwilightForestMod; -import twilightforest.biomes.TFBiomeBase; -import twilightforest.entity.ai.EntityAITFBreathAttack; -import twilightforest.item.TFItems; - -public class EntityTFWinterWolf extends EntityTFHostileWolf implements IBreathAttacker { - - private static final int BREATH_FLAG = 21; - public static final int BREATH_DURATION = 10; - public static final int BREATH_DAMAGE = 2; - - public EntityTFWinterWolf(World world) { - super(world); - this.setSize(1.4F, 1.9F); - - this.tasks.taskEntries.clear(); - this.tasks.addTask(0, new EntityAISwimming(this)); - this.tasks.addTask(2, new EntityAITFBreathAttack(this, 1.0F, 5F, 30, 0.1F)); - this.tasks.addTask(3, new EntityAIAttackOnCollide(this, EntityPlayer.class, 1.0F, false)); - this.tasks.addTask(6, new EntityAIWander(this, 1.0F)); - - this.targetTasks.taskEntries.clear(); - this.targetTasks.addTask(1, new EntityAIHurtByTarget(this, false)); - this.targetTasks.addTask(2, new EntityAINearestAttackableTarget(this, EntityPlayer.class, 0, true)); - } - - /** - * Set monster attributes - */ - @Override - protected void applyEntityAttributes() - { - super.applyEntityAttributes(); - this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(30.0D); // max health - } - - protected void entityInit() - { - super.entityInit(); - this.dataWatcher.addObject(BREATH_FLAG, Byte.valueOf((byte)0)); - } - - /** - * Returns the amount of damage a mob should deal. - */ - public int getAttackStrength(Entity par1Entity) - { - return 6; - } - - public boolean attackEntityAsMob(Entity par1Entity) - { - int damage = this.getAttackStrength(par1Entity); - if (par1Entity.attackEntityFrom(DamageSource.causeMobDamage(this), damage)) - { - return true; - } - else - { - return false; - } - } - - /** - * Called frequently so the entity can update its state every tick as required. For example, zombies and skeletons - * use this to react to sunlight and start to burn. - */ - @Override - public void onLivingUpdate() - { - super.onLivingUpdate(); - - // when breathing fire, spew particles - if (isBreathing()) - { - Vec3 look = this.getLookVec(); - - double dist = 0.5; - double px = this.posX + look.xCoord * dist; - double py = this.posY + 1.25 + look.yCoord * dist; - double pz = this.posZ + look.zCoord * dist; - - for (int i = 0; i < 10; i++) - { - double dx = look.xCoord; - double dy = look.yCoord; - double dz = look.zCoord; - - double spread = 5 + this.getRNG().nextDouble() * 2.5; - double velocity = 3.0 + this.getRNG().nextDouble() * 0.15; - - // spread flame - dx += this.getRNG().nextGaussian() * 0.007499999832361937D * spread; - dy += this.getRNG().nextGaussian() * 0.007499999832361937D * spread; - dz += this.getRNG().nextGaussian() * 0.007499999832361937D * spread; - dx *= velocity; - dy *= velocity; - dz *= velocity; - - TwilightForestMod.proxy.spawnParticle(this.worldObj, "snowstuff", px, py, pz, dx, dy, dz); - //worldObj.spawnParticle(getFlameParticle(), px, py, pz, dx, dy, dz); - } - - playBreathSound(); - } - - } - - public void playBreathSound() { - worldObj.playSoundEffect(this.posX + 0.5, this.posY + 0.5, this.posZ + 0.5, "mob.ghast.fireball", rand.nextFloat() * 0.5F, rand.nextFloat() * 0.5F); - } - - /** - * Gets the pitch of living sounds in living entities. - */ - protected float getSoundPitch() - { - return (this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F + 0.6F; - } - - @Override - public boolean isBreathing() { - return this.getDataWatcher().getWatchableObjectByte(BREATH_FLAG) == 1; - - } - - @Override - public void setBreathing(boolean flag) { - this.getDataWatcher().updateObject(BREATH_FLAG, Byte.valueOf((byte)(flag ? 1 : 0))); - } - - @Override - public void doBreathAttack(Entity target) { -// if (!target.isImmuneToFire() && target.attackEntityFrom(DamageSource.inFire, BREATH_DAMAGE)) -// { -// target.setFire(BREATH_DURATION); -// } - } - - /** - * Checks to make sure the light is not too bright where the mob is spawning - */ - @Override - protected boolean isValidLightLevel() { - int x = MathHelper.floor_double(this.posX); - int z = MathHelper.floor_double(this.posZ); - - if (worldObj.getBiomeGenForCoords(x, z) == TFBiomeBase.tfSnow) { - return true; - } else { - return super.isValidLightLevel(); - } - } - - - protected Item getDropItem() - { - return TFItems.arcticFur; - } - -} diff --git a/src/main/java/twilightforest/entity/EntityTFWraith.java b/src/main/java/twilightforest/entity/EntityTFWraith.java deleted file mode 100644 index b9966455fb..0000000000 --- a/src/main/java/twilightforest/entity/EntityTFWraith.java +++ /dev/null @@ -1,337 +0,0 @@ -package twilightforest.entity; - -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityFlying; -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.monster.IMob; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Items; -import net.minecraft.item.Item; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.DamageSource; -import net.minecraft.util.MathHelper; -import net.minecraft.world.EnumDifficulty; -import net.minecraft.world.EnumSkyBlock; -import net.minecraft.world.World; -import twilightforest.TFAchievementPage; -import twilightforest.TFFeature; -import twilightforest.TwilightForestMod; - - -public class EntityTFWraith extends EntityFlying implements IMob { - - public EntityTFWraith(World world) - { - super(world); - } - - public EntityTFWraith(World world, double x, double y, double z) - { - this(world); - this.setPosition(x, y, z); - } - - /** - * Set monster attributes - */ - @Override - protected void applyEntityAttributes() - { - super.applyEntityAttributes(); - this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(20.0D); // max health - this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.5D); // movement speed - - // need to initialize damage since we're not an EntityMob - this.getAttributeMap().registerAttribute(SharedMonsterAttributes.attackDamage); - this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(5.0D); // attack damage - } - - @Override - public void onLivingUpdate() - { - if(worldObj.isDaytime()) - { - float f = getBrightness(1.0F); - if(f > 0.5F && worldObj.canBlockSeeTheSky(MathHelper.floor_double(posX), MathHelper.floor_double(posY), MathHelper.floor_double(posZ)) && rand.nextFloat() * 30F < (f - 0.4F) * 2.0F) - { -// fire = 300; - } - } - super.onLivingUpdate(); - } - - /** - * Supress walking sounds - */ - @Override - public boolean canTriggerWalking() - { - return false; - } - - /** - * Adapted from the ghast code. The ghost wanders randomly until it targets a player, at which point it moves towards the player. - * - * TODO: pathfinding! - */ - @Override - protected void updateEntityActionState() - { - if(!worldObj.isRemote && worldObj.difficultySetting == EnumDifficulty.PEACEFUL) - { - setDead(); - } - despawnEntity(); - prevAttackCounter = attackCounter; - double d = waypointX - posX; - double d1 = waypointY - posY; - double d2 = waypointZ - posZ; - double d3 = MathHelper.sqrt_double(d * d + d1 * d1 + d2 * d2); - if(d3 < 1.0D || d3 > 60D) - { - waypointX = posX + (rand.nextFloat() * 2.0F - 1.0F) * 16F; - waypointY = posY + (rand.nextFloat() * 2.0F - 1.0F) * 16F; - waypointZ = posZ + (rand.nextFloat() * 2.0F - 1.0F) * 16F; - } - if(courseChangeCooldown-- <= 0) - { - courseChangeCooldown += rand.nextInt(5) + 2; - if(isCourseTraversable(waypointX, waypointY, waypointZ, d3)) - { - motionX += (d / d3) * 0.10000000000000001D; - motionY += (d1 / d3) * 0.10000000000000001D; - motionZ += (d2 / d3) * 0.10000000000000001D; - } else - { - waypointX = posX; - waypointY = posY; - waypointZ = posZ; - - // clear target? - targetedEntity = null; - } - } - if(targetedEntity != null && targetedEntity.isDead) - { - targetedEntity = null; - } - if(targetedEntity == null || aggroCooldown-- <= 0) - { - targetedEntity = findPlayerToAttack(); - if(targetedEntity != null) - { - aggroCooldown = 20; - } - } else { - float f1 = targetedEntity.getDistanceToEntity(this); - if(canEntityBeSeen(targetedEntity)) - { - attackEntity(targetedEntity, f1); - } else - { - attackBlockedEntity(targetedEntity, f1); - } - } - double d4 = 64D; - if(targetedEntity != null && targetedEntity.getDistanceSqToEntity(this) < d4 * d4) - { - double d5 = targetedEntity.posX - posX; - //double d6 = (targetedEntity.boundingBox.minY + (double)(targetedEntity.height / 2.0F)) - (posY + height / 2.0F); - double d7 = targetedEntity.posZ - posZ; - renderYawOffset = rotationYaw = (-(float)Math.atan2(d5, d7) * 180F) / 3.141593F; - if(canEntityBeSeen(targetedEntity)) - { - if(attackCounter == 10) - { - //worldObj.playSoundAtEntity(this, "mob.ghast.charge", getSoundVolume(), (rand.nextFloat() - rand.nextFloat()) * 0.2F + 1.0F); - } - attackCounter++; - if(attackCounter == 20) - { - waypointX = targetedEntity.posX; - waypointY = targetedEntity.posY - targetedEntity.height + 0.5; - waypointZ = targetedEntity.posZ; - - - attackCounter = -40; - } - } else - if(attackCounter > 0) - { - attackCounter--; - } - } else - { - renderYawOffset = rotationYaw = (-(float)Math.atan2(motionX, motionZ) * 180F) / 3.141593F; - if(attackCounter > 0) - { - attackCounter--; - } - } - } - - protected void attackEntity(Entity entity, float f) - { - if(attackTime <= 0 && f < 2.0F && entity.boundingBox.maxY > boundingBox.minY && entity.boundingBox.minY < boundingBox.maxY) - { - attackTime = 20; - - float damage = (float)this.getEntityAttribute(SharedMonsterAttributes.attackDamage).getBaseValue(); - - entity.attackEntityFrom(DamageSource.causeMobDamage(this), damage); - } - } - - protected void attackBlockedEntity(Entity entity, float f) - { - } - - - /** - * Adapted from EntityMob - * @return - */ - - @Override - public boolean attackEntityFrom(DamageSource damagesource, float i) - { - if(super.attackEntityFrom(damagesource, i)) - { - Entity entity = damagesource.getEntity(); - if(riddenByEntity == entity || ridingEntity == entity) - { - return true; - } - if(entity != this) - { - targetedEntity = entity; - } - return true; - } else - { - return false; - } - } - - /** - * Copied from EntityMob - * @return - */ - protected Entity findPlayerToAttack() - { - EntityPlayer entityplayer = worldObj.getClosestVulnerablePlayerToEntity(this, 16D); - if(entityplayer != null && canEntityBeSeen(entityplayer)) - { - return entityplayer; - } else - { - return null; - } - } - - private boolean isCourseTraversable(double d, double d1, double d2, double d3) - { - double d4 = (waypointX - posX) / d3; - double d5 = (waypointY - posY) / d3; - double d6 = (waypointZ - posZ) / d3; - AxisAlignedBB axisalignedbb = boundingBox.copy(); - for(int i = 1; i < d3; i++) - { - axisalignedbb.offset(d4, d5, d6); - if(worldObj.getCollidingBoundingBoxes(this, axisalignedbb).size() > 0) - { - return false; - } - } - - return true; - } - - @Override - protected String getLivingSound() - { - return TwilightForestMod.ID + ":mob.wraith.wraith"; - } - - @Override - protected String getHurtSound() - { - return TwilightForestMod.ID + ":mob.wraith.wraith"; - } - - @Override - protected String getDeathSound() - { - return TwilightForestMod.ID + ":mob.wraith.wraith"; - } - - @Override - protected Item getDropItem() - { - return Items.glowstone_dust; - } - - public int courseChangeCooldown; - public double waypointX; - public double waypointY; - public double waypointZ; - private Entity targetedEntity; - private int aggroCooldown; - public int prevAttackCounter; - public int attackCounter; - - /** - * Trigger achievement when killed - */ - @Override - public void onDeath(DamageSource par1DamageSource) { - super.onDeath(par1DamageSource); - if (par1DamageSource.getSourceOfDamage() instanceof EntityPlayer) { - ((EntityPlayer)par1DamageSource.getSourceOfDamage()).triggerAchievement(TFAchievementPage.twilightHunter); - // are we in a level 3 hill? - int chunkX = MathHelper.floor_double(posX) >> 4; - int chunkZ = MathHelper.floor_double(posZ) >> 4; - if (TFFeature.getNearestFeature(chunkX, chunkZ, worldObj) == TFFeature.hill3) { - // award level 3 hill cheevo - ((EntityPlayer)par1DamageSource.getSourceOfDamage()).triggerAchievement(TFAchievementPage.twilightHill3); - } - } - } - - /** - * Checks to make sure the light is not too bright where the mob is spawning - */ - protected boolean isValidLightLevel() - { - int i = MathHelper.floor_double(this.posX); - int j = MathHelper.floor_double(this.boundingBox.minY); - int k = MathHelper.floor_double(this.posZ); - - if (this.worldObj.getSavedLightValue(EnumSkyBlock.Sky, i, j, k) > this.rand.nextInt(32)) - { - return false; - } - else - { - int l = this.worldObj.getBlockLightValue(i, j, k); - - if (this.worldObj.isThundering()) - { - int i1 = this.worldObj.skylightSubtracted; - this.worldObj.skylightSubtracted = 10; - l = this.worldObj.getBlockLightValue(i, j, k); - this.worldObj.skylightSubtracted = i1; - } - - return l <= this.rand.nextInt(8); - } - } - - /** - * Checks if the entity's current position is a valid location to spawn this entity. - */ - public boolean getCanSpawnHere() - { - return this.worldObj.difficultySetting != EnumDifficulty.PEACEFUL && this.isValidLightLevel() && super.getCanSpawnHere(); - } -} diff --git a/src/main/java/twilightforest/entity/EntityTFYeti.java b/src/main/java/twilightforest/entity/EntityTFYeti.java deleted file mode 100644 index f817dd1f21..0000000000 --- a/src/main/java/twilightforest/entity/EntityTFYeti.java +++ /dev/null @@ -1,310 +0,0 @@ -package twilightforest.entity; - -import net.minecraft.entity.Entity; -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.ai.EntityAIAttackOnCollide; -import net.minecraft.entity.ai.EntityAIHurtByTarget; -import net.minecraft.entity.ai.EntityAILookIdle; -import net.minecraft.entity.ai.EntityAINearestAttackableTarget; -import net.minecraft.entity.ai.EntityAIWander; -import net.minecraft.entity.ai.EntityAIWatchClosest; -import net.minecraft.entity.monster.EntityMob; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.Item; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.DamageSource; -import net.minecraft.util.MathHelper; -import net.minecraft.util.Vec3; -import net.minecraft.world.World; -import twilightforest.TFAchievementPage; -import twilightforest.biomes.TFBiomeBase; -import twilightforest.entity.ai.EntityAITFThrowRider; -import twilightforest.item.TFItems; - -public class EntityTFYeti extends EntityMob -{ - - - private static final int ANGER_FLAG = 16; - - public EntityTFYeti(World par1World) - { - super(par1World); - this.setSize(1.4F, 2.4F); - - - this.getNavigator().setAvoidsWater(true); - this.tasks.addTask(1, new EntityAITFThrowRider(this, 1.0F)); - this.tasks.addTask(2, new EntityAIAttackOnCollide(this, EntityPlayer.class, 1.0D, false)); - this.tasks.addTask(3, new EntityAIWander(this, 1.0F)); - this.tasks.addTask(4, new EntityAIWatchClosest(this, EntityPlayer.class, 8.0F)); - this.tasks.addTask(4, new EntityAILookIdle(this)); - this.targetTasks.addTask(1, new EntityAIHurtByTarget(this, false)); - this.targetTasks.addTask(2, new EntityAINearestAttackableTarget(this, EntityPlayer.class, 0, true, false)); - } - - - /** - * Returns true if the newer Entity AI code should be run - */ - @Override - protected boolean isAIEnabled() - { - return true; - } - - /** - * Set monster attributes - */ - @Override - protected void applyEntityAttributes() - { - super.applyEntityAttributes(); - this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(20.0D); // max health - this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.38D); // movement speed - this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(0.0D); - this.getEntityAttribute(SharedMonsterAttributes.followRange).setBaseValue(4.0D); - } - - protected void entityInit() - { - super.entityInit(); - this.dataWatcher.addObject(ANGER_FLAG, Byte.valueOf((byte)0)); - } - - /** - * Called frequently so the entity can update its state every tick as required. For example, zombies and skeletons - * use this to react to sunlight and start to burn. - */ - @Override - public void onLivingUpdate() - { - if (this.riddenByEntity != null) - { - this.setSize(1.4F, 2.4F); - - // stop player sneaking so that they can't dismount! - if (this.riddenByEntity.isSneaking()) - { - //System.out.println("Pinch beetle sneaking detected!"); - - this.riddenByEntity.setSneaking(false); - } - } - else - { - this.setSize(1.4F, 2.4F); - - } - - super.onLivingUpdate(); - - // look at things in our jaws - if (this.riddenByEntity != null) - { - this.getLookHelper().setLookPositionWithEntity(riddenByEntity, 100F, 100F); - //this.faceEntity(riddenByEntity, 100F, 100F); - - - // push out of user in wall - Vec3 riderPos = this.getRiderPosition(); - this.func_145771_j(riderPos.xCoord, riderPos.yCoord, riderPos.zCoord); // push out of block - - - } - } - - - /** - * Called when a player interacts with a mob. e.g. gets milk from a cow, gets into the saddle on a pig. - */ - @Override - public boolean interact(EntityPlayer par1EntityPlayer) - { - if (super.interact(par1EntityPlayer)) - { - return true; - } -// else if (!this.worldObj.isRemote && (this.riddenByEntity == null || this.riddenByEntity == par1EntityPlayer)) -// { -// par1EntityPlayer.mountEntity(this); -// return true; -// } - else - { - return false; - } - } - - /** - * Pick up things we attack! - */ - @Override - public boolean attackEntityAsMob(Entity par1Entity) - { - if (this.riddenByEntity == null && par1Entity.ridingEntity == null) - { - par1Entity.mountEntity(this); - } - - return super.attackEntityAsMob(par1Entity); - } - - /** - * Called when the entity is attacked. - */ - public boolean attackEntityFrom(DamageSource par1DamageSource, float par2) - { - if (par1DamageSource.getSourceOfDamage() != null) { - // become angry - this.setAngry(true); - } - - return super.attackEntityFrom(par1DamageSource, par2); - } - - - - /** - * Determines whether this yeti is angry or not. - */ - public boolean isAngry() { - return (this.dataWatcher.getWatchableObjectByte(ANGER_FLAG) & 2) != 0; - } - - /** - * Sets whether this yeti is angry or not. - */ - public void setAngry(boolean anger) { - byte b0 = this.dataWatcher.getWatchableObjectByte(ANGER_FLAG); - - if (anger) { - this.getEntityAttribute(SharedMonsterAttributes.followRange).setBaseValue(40.0D); - this.dataWatcher.updateObject(ANGER_FLAG, Byte.valueOf((byte)(b0 | 2))); - } else { - this.dataWatcher.updateObject(ANGER_FLAG, Byte.valueOf((byte)(b0 & -3))); - } - } - - /** - * (abstract) Protected helper method to write subclass entity data to NBT. - */ - public void writeEntityToNBT(NBTTagCompound par1NBTTagCompound) - { - super.writeEntityToNBT(par1NBTTagCompound); - par1NBTTagCompound.setBoolean("Angry", this.isAngry()); - } - - /** - * (abstract) Protected helper method to read subclass entity data from NBT. - */ - public void readEntityFromNBT(NBTTagCompound par1NBTTagCompound) - { - super.readEntityFromNBT(par1NBTTagCompound); - this.setAngry(par1NBTTagCompound.getBoolean("Angry")); - } - - /** - * Put the player out in front of where we are - */ - @Override - public void updateRiderPosition() - { - if (this.riddenByEntity != null) - { - Vec3 riderPos = this.getRiderPosition(); - - this.riddenByEntity.setPosition(riderPos.xCoord, riderPos.yCoord, riderPos.zCoord); - } - } - - /** - * Returns the Y offset from the entity's position for any entity riding this one. - */ - @Override - public double getMountedYOffset() - { - return 2.25D; - } - - /** - * Used to both get a rider position and to push out of blocks - */ - public Vec3 getRiderPosition() - { - if (this.riddenByEntity != null) - { - float distance = 0.4F; - - double var1 = Math.cos((this.rotationYaw + 90) * Math.PI / 180.0D) * distance; - double var3 = Math.sin((this.rotationYaw + 90) * Math.PI / 180.0D) * distance; - - return Vec3.createVectorHelper(this.posX + var1, this.posY + this.getMountedYOffset() + this.riddenByEntity.getYOffset(), this.posZ + var3); - } - else - { - return Vec3.createVectorHelper(this.posX, this.posY, this.posZ); - } - } - - /** - * If a rider of this entity can interact with this entity. Should return true on the - * ridden entity if so. - * - * @return if the entity can be interacted with from a rider - */ - public boolean canRiderInteract() - { - return true; - } - - /** - * Trigger achievement when killed - */ - @Override - public void onDeath(DamageSource par1DamageSource) { - super.onDeath(par1DamageSource); - if (par1DamageSource.getSourceOfDamage() instanceof EntityPlayer) { - ((EntityPlayer)par1DamageSource.getSourceOfDamage()).triggerAchievement(TFAchievementPage.twilightHunter); - } - } - - /** - * We're allowed to spawn in bright light only in sniw - */ - @Override - public boolean getCanSpawnHere() - { - // are we in the snow - if (worldObj.getBiomeGenForCoords(MathHelper.floor_double(posX), MathHelper.floor_double(posZ)) == TFBiomeBase.tfSnow) { - // don't check light level - return worldObj.checkNoEntityCollision(boundingBox) && worldObj.getCollidingBoundingBoxes(this, boundingBox).size() == 0; - } - else { - // normal EntityMob spawn check, checks light level - return super.getCanSpawnHere(); - } - } - - /** - * Checks to make sure the light is not too bright where the mob is spawning - */ - @Override - protected boolean isValidLightLevel() { - int x = MathHelper.floor_double(this.posX); - int z = MathHelper.floor_double(this.posZ); - - if (worldObj.getBiomeGenForCoords(x, z) == TFBiomeBase.tfSnow) { - return true; - } else { - return super.isValidLightLevel(); - } - } - - protected Item getDropItem() - { - return TFItems.arcticFur; - } - - -} diff --git a/src/main/java/twilightforest/entity/IBreathAttacker.java b/src/main/java/twilightforest/entity/IBreathAttacker.java index 23e84d6938..efbec1acf5 100644 --- a/src/main/java/twilightforest/entity/IBreathAttacker.java +++ b/src/main/java/twilightforest/entity/IBreathAttacker.java @@ -1,17 +1,17 @@ package twilightforest.entity; -import net.minecraft.entity.Entity; +import net.minecraft.world.entity.Entity; public interface IBreathAttacker { - public abstract boolean isBreathing(); + boolean isBreathing(); - public abstract void setBreathing(boolean flag); + void setBreathing(boolean flag); /** * Deal damage for our breath attack + * * @param target */ - public abstract void doBreathAttack(Entity target); - + void doBreathAttack(Entity target); } \ No newline at end of file diff --git a/src/main/java/twilightforest/entity/IHostileMount.java b/src/main/java/twilightforest/entity/IHostileMount.java new file mode 100644 index 0000000000..da59032dbf --- /dev/null +++ b/src/main/java/twilightforest/entity/IHostileMount.java @@ -0,0 +1,6 @@ +package twilightforest.entity; + +/** + * Marker interface for entities that can forcefully pick up the player. + */ +public interface IHostileMount {} diff --git a/src/main/java/twilightforest/entity/ITFCharger.java b/src/main/java/twilightforest/entity/ITFCharger.java index a52ea903c5..2560024310 100644 --- a/src/main/java/twilightforest/entity/ITFCharger.java +++ b/src/main/java/twilightforest/entity/ITFCharger.java @@ -2,8 +2,7 @@ public interface ITFCharger { - public boolean isCharging(); - - public void setCharging(boolean flag); - + boolean isCharging(); + + void setCharging(boolean flag); } diff --git a/src/main/java/twilightforest/entity/ProtectionBox.java b/src/main/java/twilightforest/entity/ProtectionBox.java new file mode 100644 index 0000000000..3d0f1da91c --- /dev/null +++ b/src/main/java/twilightforest/entity/ProtectionBox.java @@ -0,0 +1,85 @@ +package twilightforest.entity; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.protocol.Packet; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityDimensions; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import twilightforest.init.TFEntities; + +public class ProtectionBox extends Entity { + + public int lifeTime; + + public final int sizeX; + public final int sizeY; + public final int sizeZ; + + private final BoundingBox sbb; + + public ProtectionBox(EntityType type, Level world) { + super(type, world); + this.sizeX = this.sizeY = this.sizeZ = 0; + this.sbb = null; + } + + public ProtectionBox(Level world, BoundingBox sbb) { + super(TFEntities.PROTECTION_BOX.get(), world); + + this.sbb = sbb; + + this.moveTo(sbb.minX(), sbb.minY(), sbb.minZ(), 0.0F, 0.0F); + + this.sizeX = sbb.getXSpan(); + this.sizeY = sbb.getYSpan(); + this.sizeZ = sbb.getZSpan(); + + this.dimensions = EntityDimensions.fixed(Math.max(this.sizeX, this.sizeZ), this.sizeY); + + this.lifeTime = 60; + } + + @Override + public void tick() { + super.tick(); + + if (this.lifeTime <= 1) { + this.discard(); + } else { + this.lifeTime--; + } + } + + public boolean matches(BoundingBox sbb) { + return this.sbb.minX() == sbb.minX() && this.sbb.minY() == sbb.minY() && this.sbb.minZ() == sbb.minZ() + && this.sbb.maxX() == sbb.maxX() && this.sbb.maxY() == sbb.maxY() && this.sbb.maxZ() == sbb.maxZ(); + } + + public void resetLifetime() { + this.lifeTime = 60; + } + + @Override + protected void defineSynchedData() { + } + + @Override + protected void readAdditionalSaveData(CompoundTag compound) { + } + + @Override + protected void addAdditionalSaveData(CompoundTag compound) { + } + + @Override + public boolean displayFireAnimation() { + return false; + } + + @Override + protected boolean canRide(Entity entityIn) { + return false; + } +} diff --git a/src/main/java/twilightforest/entity/RovingCube.java b/src/main/java/twilightforest/entity/RovingCube.java new file mode 100644 index 0000000000..b82c8578ea --- /dev/null +++ b/src/main/java/twilightforest/entity/RovingCube.java @@ -0,0 +1,57 @@ +package twilightforest.entity; + +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.monster.Monster; +import net.minecraft.world.level.Level; +import twilightforest.entity.ai.goal.CubeCenterOnSymbolGoal; +import twilightforest.entity.ai.goal.CubeMoveToRedstoneSymbolsGoal; +import twilightforest.init.TFParticleType; + +public class RovingCube extends Monster { + + // data needed for cube AI + + // last circle visited + public boolean hasFoundSymbol = false; + public int symbolX = 0; + public int symbolY = 0; + public int symbolZ = 0; + + // direction traveling + + // blocks traveled + + public RovingCube(EntityType type, Level world) { + super(type, world); + } + + @Override + protected void registerGoals() { + this.goalSelector.addGoal(0, new CubeMoveToRedstoneSymbolsGoal(this, 1.0D)); + this.goalSelector.addGoal(1, new CubeCenterOnSymbolGoal(this, 1.0D)); + } + + public static AttributeSupplier.Builder registerAttributes() { + return Monster.createMonsterAttributes() + .add(Attributes.MAX_HEALTH, 10.0D) + .add(Attributes.MOVEMENT_SPEED, 0.23D) + .add(Attributes.ATTACK_DAMAGE, 5.0D); + } + + @Override + public void aiStep() { + super.aiStep(); + + if (this.getLevel().isClientSide()) { + for (int i = 0; i < 3; i++) { + float px = (this.getRandom().nextFloat() - this.getRandom().nextFloat()) * 2.0F; + float py = this.getEyeHeight() - 0.25F + (this.getRandom().nextFloat() - this.getRandom().nextFloat()) * 2.0F; + float pz = (this.getRandom().nextFloat() - this.getRandom().nextFloat()) * 2.0F; + + this.getLevel().addParticle(TFParticleType.ANNIHILATE.get(), this.xOld + px, this.yOld + py, this.zOld + pz, 0, 0, 0); + } + } + } +} diff --git a/src/main/java/twilightforest/entity/SlideBlock.java b/src/main/java/twilightforest/entity/SlideBlock.java new file mode 100644 index 0000000000..2f8a6a61f7 --- /dev/null +++ b/src/main/java/twilightforest/entity/SlideBlock.java @@ -0,0 +1,221 @@ +package twilightforest.entity; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.syncher.EntityDataAccessor; +import net.minecraft.network.syncher.EntityDataSerializers; +import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.MoverType; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.RotatedPillarBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.phys.Vec3; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.entity.IEntityAdditionalSpawnData; +import twilightforest.init.TFDamageTypes; +import twilightforest.init.TFSounds; + +import javax.annotation.Nonnull; +import java.util.List; + +public class SlideBlock extends Entity implements IEntityAdditionalSpawnData { + + private static final int WARMUP_TIME = 20; + private static final EntityDataAccessor MOVE_DIRECTION = SynchedEntityData.defineId(SlideBlock.class, EntityDataSerializers.DIRECTION); + + private BlockState myState; + private int slideTime; + + public SlideBlock(EntityType type, Level world) { + super(type, world); + this.blocksBuilding = true; + } + + public SlideBlock(EntityType type, Level world, double x, double y, double z, BlockState state) { + super(type, world); + + this.myState = state; + this.blocksBuilding = true; + this.setPos(x, y, z); + this.setDeltaMovement(new Vec3(0, 0, 0)); + this.xo = x; + this.yo = y; + this.zo = z; + + this.determineMoveDirection(); + } + + private void determineMoveDirection() { + BlockPos pos = new BlockPos(this.blockPosition()); + + Direction[] toCheck = switch (myState.getValue(RotatedPillarBlock.AXIS)) { + case X -> // horizontal blocks will go up or down if there is a block on one side and air on the other + new Direction[]{Direction.DOWN, Direction.UP, Direction.NORTH, Direction.SOUTH}; + case Z -> // horizontal blocks will go up or down if there is a block on one side and air on the other + new Direction[]{Direction.DOWN, Direction.UP, Direction.WEST, Direction.EAST}; + case Y -> // vertical blocks priority is -x, +x, -z, +z + new Direction[]{Direction.WEST, Direction.EAST, Direction.NORTH, Direction.SOUTH}; + }; + + for (Direction e : toCheck) { + if (this.getLevel().isEmptyBlock(pos.relative(e)) && !this.getLevel().isEmptyBlock(pos.relative(e.getOpposite()))) { + this.entityData.set(MOVE_DIRECTION, e); + return; + } + } + + // if no wall, travel towards open air + for (Direction e : toCheck) { + if (this.getLevel().isEmptyBlock(pos.relative(e))) { + this.entityData.set(MOVE_DIRECTION, e); + return; + } + } + } + + @Override + protected void defineSynchedData() { + this.entityData.define(MOVE_DIRECTION, Direction.DOWN); + } + + @Override + public boolean isSteppingCarefully() { + return false; + } + + @Override + public boolean isPickable() { + return this.isAlive(); + } + + @Override + public void tick() { + if (this.myState == null || this.myState.getMaterial() == Material.AIR) { + this.discard(); + } else { + this.xo = this.getX(); + this.yo = this.getY(); + this.zo = this.getZ(); + ++this.slideTime; + // start moving after warmup + if (this.slideTime > WARMUP_TIME) { + final double moveAcceleration = 0.04; + Direction moveDirection = this.entityData.get(MOVE_DIRECTION); + this.setDeltaMovement(this.getDeltaMovement().add(moveDirection.getStepX() * moveAcceleration, moveDirection.getStepY() * moveAcceleration, moveDirection.getStepZ() * moveAcceleration)); + this.move(MoverType.SELF, new Vec3(this.getDeltaMovement().x(), this.getDeltaMovement().y(), this.getDeltaMovement().z())); + } + this.getDeltaMovement().multiply(0.98, 0.98, 0.98); + + if (!this.getLevel().isClientSide()) { + if (this.slideTime % 5 == 0) { + this.playSound(TFSounds.SLIDER.get(), 1.0F, 0.9F + (this.random.nextFloat() * 0.4F)); + } + + BlockPos pos = new BlockPos(this.blockPosition()); + + if (this.slideTime == 1) { + if (this.getLevel().getBlockState(pos) != this.myState) { + this.discard(); + return; + } + + this.getLevel().removeBlock(pos, false); + } + + if (this.slideTime == WARMUP_TIME + 40) { + this.setDeltaMovement(new Vec3(0, 0, 0)); + + this.entityData.set(MOVE_DIRECTION, entityData.get(MOVE_DIRECTION).getOpposite()); + } + + if (this.verticalCollision || this.horizontalCollision) { + this.setDeltaMovement(this.getDeltaMovement().multiply(0.7D, 0.7D, 0.7D)); + + this.discard(); + + if (this.getLevel().isUnobstructed(this.myState, pos, CollisionContext.empty())) { + this.getLevel().setBlockAndUpdate(pos, this.myState); + } else { + this.spawnAtLocation(new ItemStack(this.myState.getBlock()), 0.0F); + } + } else if (this.slideTime > 100 && (pos.getY() < this.getLevel().getMinBuildHeight() + 1 || pos.getY() > this.getLevel().getMaxBuildHeight()) || this.slideTime > 600) { + this.spawnAtLocation(new ItemStack(this.myState.getBlock()), 0.0F); + this.discard(); + } + + // push things out and damage them + this.damageKnockbackEntities(this.getLevel().getEntities(this, this.getBoundingBox())); + } + } + } + + private void damageKnockbackEntities(List entities) { + for (Entity entity : entities) { + if (entity instanceof LivingEntity living) { + living.hurt(TFDamageTypes.getDamageSource(this.getLevel(), TFDamageTypes.SLIDER), 5.0F); + + double kx = (this.getX() - entity.getX()) * 2.0D; + double kz = (this.getZ() - entity.getZ()) * 2.0D; + + living.knockback(2.0F, kx, kz); + } + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public boolean displayFireAnimation() { + return false; + } + + @Override + protected void readAdditionalSaveData(@Nonnull CompoundTag compound) { + this.slideTime = compound.getInt("Time"); + this.entityData.set(MOVE_DIRECTION, Direction.from3DDataValue(compound.getByte("Direction"))); + } + + @Override + protected void addAdditionalSaveData(@Nonnull CompoundTag compound) { + compound.putInt("Time", this.slideTime); + compound.putByte("Direction", (byte) this.entityData.get(MOVE_DIRECTION).get3DDataValue()); + } + + @Override + public void writeSpawnData(FriendlyByteBuf buffer) { + buffer.writeInt(Block.getId(this.myState)); + } + + @Override + public void readSpawnData(FriendlyByteBuf additionalData) { + this.myState = Block.stateById(additionalData.readInt()); + } + + @Override + public boolean isPushable() { + return false; + } + + @Override + public boolean isPushedByFluid() { + return false; + } + + @Override + protected boolean canRide(Entity entityIn) { + return false; + } + + public BlockState getBlockState() { + return this.myState; + } +} diff --git a/src/main/java/twilightforest/entity/SpikeBlock.java b/src/main/java/twilightforest/entity/SpikeBlock.java new file mode 100644 index 0000000000..b6ce3d0a06 --- /dev/null +++ b/src/main/java/twilightforest/entity/SpikeBlock.java @@ -0,0 +1,91 @@ +package twilightforest.entity; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.game.ClientGamePacketListener; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityDimensions; +import net.minecraft.world.entity.MoverType; +import net.minecraft.world.entity.Pose; +import net.minecraft.world.level.gameevent.GameEvent; +import twilightforest.entity.monster.BlockChainGoblin; +import twilightforest.init.TFSounds; + +public class SpikeBlock extends BlockChainGoblin.MultipartGenericsAreDumb { + private final Entity goblin; + + private boolean isCollideBlock; + + @Override + public EntityDimensions getDimensions(Pose pos) { + return EntityDimensions.scalable(0.75F, 0.75F); + } + + public SpikeBlock(Entity goblin) { + super(goblin); + this.goblin = goblin; + this.realSize = EntityDimensions.scalable(0.75F, 0.75F); + } + + @Override + public void tick() { + super.tick(); + if (this.goblin != null && !this.goblin.isAlive()) { + this.doFall(); + } + } + + public void doFall() { + if (this.onGround && !this.isCollideBlock) { + this.playSound(TFSounds.BLOCK_AND_CHAIN_COLLIDE.get(), 0.65F, 0.75F); + this.gameEvent(GameEvent.HIT_GROUND); + this.isCollideBlock = true; + } else { + this.setDeltaMovement(0.0F, this.getDeltaMovement().y() - 0.04F, 0.0F); + this.move(MoverType.SELF, this.getDeltaMovement()); + } + } + + @Override + public boolean hurt(DamageSource source, float amount) { + return false; + } + + @Override + public boolean isPickable() { + return false; + } + + @Override + public boolean isPushable() { + return false; + } + + @Override + public boolean is(Entity entity) { + return this == entity || this.getParent() == entity; + } + + @Override + public Packet getAddEntityPacket() { + throw new UnsupportedOperationException(); + } + + @Override + protected void defineSynchedData() { + } + + @Override + protected boolean canRide(Entity entity) { + return false; + } + + @Override + protected void readAdditionalSaveData(CompoundTag compound) { + } + + @Override + protected void addAdditionalSaveData(CompoundTag compound) { + } +} diff --git a/src/main/java/twilightforest/entity/TFCreatures.java b/src/main/java/twilightforest/entity/TFCreatures.java deleted file mode 100644 index aa3f94aca8..0000000000 --- a/src/main/java/twilightforest/entity/TFCreatures.java +++ /dev/null @@ -1,107 +0,0 @@ -package twilightforest.entity; - -import java.util.HashMap; -import java.util.LinkedHashMap; - -import net.minecraft.entity.Entity; -import net.minecraft.world.World; -import twilightforest.TwilightForestMod; -import cpw.mods.fml.common.FMLCommonHandler; -import cpw.mods.fml.common.ModContainer; -import cpw.mods.fml.common.registry.EntityRegistry; -import cpw.mods.fml.common.registry.EntityRegistry.EntityRegistration; - -public class TFCreatures { - - /** This is a HashMap of the Creative Entity Eggs/Spawners. */ - public static HashMap entityEggs = new LinkedHashMap(); - - - public static void registerTFCreature(Class entityClass, String entityName, int id, int backgroundEggColour, int foregroundEggColour) { - registerTFCreature(entityClass, entityName, id, backgroundEggColour, foregroundEggColour, 80, 3, true); - } - - public static void registerTFCreature(Class entityClass, String entityName, int id, int backgroundEggColour, int foregroundEggColour, int trackingRange, int updateFrequency, boolean sendsVelocityUpdates) { - if (TwilightForestMod.creatureCompatibility) - { - // only register global id if flag is set - EntityRegistry.registerGlobalEntityID(entityClass, entityName, id); - } - EntityRegistry.registerModEntity(entityClass, entityName, id, TwilightForestMod.instance, trackingRange, updateFrequency, sendsVelocityUpdates); - entityEggs.put(Integer.valueOf(id), new TFEntityEggInfo(id, backgroundEggColour, foregroundEggColour)); - } - - public static void registerTFCreature(Class entityClass, String entityName, int id) { - if (TwilightForestMod.creatureCompatibility) - { - // only register global id if flag is set - EntityRegistry.registerGlobalEntityID(entityClass, entityName, id); - } - EntityRegistry.registerModEntity(entityClass, entityName, id, TwilightForestMod.instance, 80, 3, true); - } - - /** - * Create a new instance of an entity in the world by using an entity ID. - * This is the version that creates twilight forest creatures for use by their spawn eggs. - */ - public static Entity createEntityByID(int entityID, World par1World) - { - Entity entity = null; - - try - { - //Class clazz = (Class)IDtoClassMapping.get(Integer.valueOf(entityID)); - ModContainer mc = FMLCommonHandler.instance().findContainerFor(TwilightForestMod.instance); - EntityRegistration er = EntityRegistry.instance().lookupModSpawn(mc, entityID); - Class clazz = er.getEntityClass(); - - if (clazz != null) - { - entity = (Entity)clazz.getConstructor(new Class[] {World.class}).newInstance(new Object[] {par1World}); - } - } - catch (Exception var4) - { - var4.printStackTrace(); - } - - if (entity == null) - { - System.out.println("Skipping Entity with id " + entityID); - } - - return entity; - } - - /** - * Return the name of the monster with that ID. - */ - public static String getStringFromID(int entityID) - { - ModContainer mc = FMLCommonHandler.instance().findContainerFor(TwilightForestMod.instance); - EntityRegistration er = EntityRegistry.instance().lookupModSpawn(mc, entityID); - - if (er != null) { - return er.getEntityName(); - } - - return null; - } - - /** - * Return a string suitable for setting as the mobID in spawners. If the compatibility flag is set, then use the base monster name - * If the flag is false, return TwilightForest.mobName - */ - public static String getSpawnerNameFor(String baseName) { - if (TwilightForestMod.creatureCompatibility) - { - return baseName; - } - else - { - return "TwilightForest." + baseName; - } - } - - -} diff --git a/src/main/java/twilightforest/entity/TFEntityEggInfo.java b/src/main/java/twilightforest/entity/TFEntityEggInfo.java deleted file mode 100644 index 64a7620e3a..0000000000 --- a/src/main/java/twilightforest/entity/TFEntityEggInfo.java +++ /dev/null @@ -1,45 +0,0 @@ -package twilightforest.entity; - -import net.minecraft.stats.StatBase; -import net.minecraft.util.ChatComponentTranslation; - -/** - * Very similar to EntityEggInfo, but registers the stat info differently - */ -public class TFEntityEggInfo { - /** - * The entityID of the spawned mob - */ - public final int spawnedID; - /** - * Base color of the egg - */ - public final int primaryColor; - /** - * Color of the egg spots - */ - public final int secondaryColor; - public final StatBase killedStat; - public final StatBase killedByStat; - - public TFEntityEggInfo(int par1, int par2, int par3) - { - this.spawnedID = par1; - this.primaryColor = par2; - this.secondaryColor = par3; - this.killedStat = TFEntityEggInfo.makeEntityKillStat(this); - this.killedByStat = TFEntityEggInfo.makeEntityKilledByStat(this); - } - - public static StatBase makeEntityKillStat(TFEntityEggInfo eggInfo) - { - String s = TFCreatures.getStringFromID(eggInfo.spawnedID); - return s == null ? null : (new StatBase("stat.killEntity." + s, new ChatComponentTranslation("stat.entityKill", new Object[] {new ChatComponentTranslation("entity." + s + ".name", new Object[0])}))).registerStat(); - } - - public static StatBase makeEntityKilledByStat(TFEntityEggInfo p_151176_0_) - { - String s = TFCreatures.getStringFromID(p_151176_0_.spawnedID); - return s == null ? null : (new StatBase("stat.entityKilledBy." + s, new ChatComponentTranslation("stat.entityKilledBy", new Object[] {new ChatComponentTranslation("entity." + s + ".name", new Object[0])}))).registerStat(); - } -} diff --git a/src/main/java/twilightforest/entity/TFEntityNames.java b/src/main/java/twilightforest/entity/TFEntityNames.java new file mode 100644 index 0000000000..adf5106e50 --- /dev/null +++ b/src/main/java/twilightforest/entity/TFEntityNames.java @@ -0,0 +1,122 @@ +package twilightforest.entity; + +import net.minecraft.resources.ResourceLocation; +import static twilightforest.TwilightForestMod.prefix; + +public class TFEntityNames { + // Passive Animals + public static final ResourceLocation BOAR = prefix("boar"); + public static final ResourceLocation BIGHORN_SHEEP = prefix("bighorn_sheep"); + public static final ResourceLocation DEER = prefix("deer"); + public static final ResourceLocation PENGUIN = prefix("penguin"); + public static final ResourceLocation TINY_BIRD = prefix("tiny_bird"); + public static final ResourceLocation SQUIRREL = prefix("squirrel"); + public static final ResourceLocation DWARF_RABBIT = prefix("dwarf_rabbit"); + public static final ResourceLocation RAVEN = prefix("raven"); + + public static final ResourceLocation QUEST_RAM = prefix("quest_ram"); + + // Common Enemies + public static final ResourceLocation SKELETON_DRUID = prefix("skeleton_druid"); + public static final ResourceLocation WRAITH = prefix("wraith"); + public static final ResourceLocation KOBOLD = prefix("kobold"); + public static final ResourceLocation HOSTILE_WOLF = prefix("hostile_wolf"); + + public static final ResourceLocation REDCAP = prefix("redcap"); + public static final ResourceLocation REDCAP_SAPPER = prefix("redcap_sapper"); + + public static final ResourceLocation SWARM_SPIDER = prefix("swarm_spider"); + public static final ResourceLocation HEDGE_SPIDER = prefix("hedge_spider"); + + public static final ResourceLocation FIRE_BEETLE = prefix("fire_beetle"); + public static final ResourceLocation SLIME_BEETLE = prefix("slime_beetle"); + public static final ResourceLocation PINCH_BEETLE = prefix("pinch_beetle"); + + public static final ResourceLocation BOGGARD = prefix("boggard"); // <- ?? + + // Graveyard + public static final ResourceLocation RISING_ZOMBIE = prefix("rising_zombie"); + + // Courtyard + public static final ResourceLocation NAGA = prefix("naga"); + + // Lich Tower + public static final ResourceLocation LICH = prefix("lich"); + public static final ResourceLocation LICH_MINION = prefix("lich_minion"); + public static final ResourceLocation LOYAL_ZOMBIE = prefix("loyal_zombie"); + public static final ResourceLocation DEATH_TOME = prefix("death_tome"); + + // Swamp + public static final ResourceLocation MOSQUITO_SWARM = prefix("mosquito_swarm"); + public static final ResourceLocation HYDRA = prefix("hydra"); + + public static final ResourceLocation MINOTAUR = prefix("minotaur"); + public static final ResourceLocation MINOSHROOM = prefix("minoshroom"); + public static final ResourceLocation MAZE_SLIME = prefix("maze_slime"); + + // Dark Forest + public static final ResourceLocation MIST_WOLF = prefix("mist_wolf"); + public static final ResourceLocation KING_SPIDER = prefix("king_spider"); + + public static final ResourceLocation CARMINITE_GHASTLING = prefix("carminite_ghastling"); + public static final ResourceLocation CARMINITE_GHASTGUARD = prefix("carminite_ghastguard"); + public static final ResourceLocation CARMINITE_GOLEM = prefix("carminite_golem"); + public static final ResourceLocation TOWERWOOD_BORER = prefix("towerwood_borer"); + public static final ResourceLocation CARMINITE_BROODLING = prefix("carminite_broodling"); + public static final ResourceLocation UR_GHAST = prefix("ur_ghast"); + + public static final ResourceLocation BLOCKCHAIN_GOBLIN = prefix("blockchain_goblin"); + public static final ResourceLocation UPPER_GOBLIN_KNIGHT = prefix("upper_goblin_knight"); + public static final ResourceLocation LOWER_GOBLIN_KNIGHT = prefix("lower_goblin_knight"); + public static final ResourceLocation HELMET_CRAB = prefix("helmet_crab"); + public static final ResourceLocation KNIGHT_PHANTOM = prefix("knight_phantom"); + + // Snow Region + public static final ResourceLocation YETI = prefix("yeti"); + public static final ResourceLocation ALPHA_YETI = prefix("alpha_yeti"); + public static final ResourceLocation WINTER_WOLF = prefix("winter_wolf"); + + public static final ResourceLocation SNOW_GUARDIAN = prefix("snow_guardian"); + public static final ResourceLocation STABLE_ICE_CORE = prefix("stable_ice_core"); + public static final ResourceLocation UNSTABLE_ICE_CORE = prefix("unstable_ice_core"); + public static final ResourceLocation SNOW_QUEEN = prefix("snow_queen"); + public static final ResourceLocation ICE_CRYSTAL = prefix("ice_crystal"); + + // Highlands + public static final ResourceLocation TROLL = prefix("troll"); + + public static final ResourceLocation GIANT_MINER = prefix("giant_miner"); + public static final ResourceLocation ARMORED_GIANT = prefix("armored_giant"); + + public static final ResourceLocation HARBINGER_CUBE = prefix("harbinger_cube"); + public static final ResourceLocation ADHERENT = prefix("adherent"); + public static final ResourceLocation ROVING_CUBE = prefix("roving_cube"); + public static final ResourceLocation SLIDER = prefix("slider"); + public static final ResourceLocation PLATEAU_BOSS = prefix("plateau_boss"); + + // Technical + public static final ResourceLocation CHARM_EFFECT = prefix("charm_effect"); + public static final ResourceLocation FALLING_ICE = prefix("falling_ice"); + public static final ResourceLocation CHAIN_BLOCK = prefix("chain_block"); + public static final ResourceLocation CUBE_OF_ANNIHILATION = prefix("cube_of_annihilation"); + public static final ResourceLocation PROTECTION_BOX = prefix("protection_box"); + public static final ResourceLocation BOAT = prefix("boat"); + public static final ResourceLocation CHEST_BOAT = prefix("chest_boat"); + + // Projectiles + public static final ResourceLocation NATURE_BOLT = prefix("nature_bolt"); + public static final ResourceLocation LICH_BOLT = prefix("lich_bolt"); + public static final ResourceLocation WAND_BOLT = prefix("wand_bolt"); + public static final ResourceLocation TOME_BOLT = prefix("tome_bolt"); + public static final ResourceLocation HYDRA_MORTAR = prefix("hydra_mortar"); + public static final ResourceLocation LICH_BOMB = prefix("lich_bomb"); + public static final ResourceLocation CICADA_SHOT = prefix("cicada_shot"); + public static final ResourceLocation MOONWORM_SHOT = prefix("moonworm_shot"); + public static final ResourceLocation SLIME_BLOB = prefix("slime_blob"); + public static final ResourceLocation THROWN_WEP = prefix("thrown_wep"); + public static final ResourceLocation THROWN_ICE = prefix("thrown_ice"); + public static final ResourceLocation THROWN_BLOCK = prefix("thrown_block"); + public static final ResourceLocation SEEKER_ARROW = prefix("seeker_arrow"); + public static final ResourceLocation ICE_ARROW = prefix("ice_arrow"); + public static final ResourceLocation ICE_SNOWBALL = prefix("ice_snowball"); +} diff --git a/src/main/java/twilightforest/entity/TFPart.java b/src/main/java/twilightforest/entity/TFPart.java new file mode 100644 index 0000000000..36a8d31888 --- /dev/null +++ b/src/main/java/twilightforest/entity/TFPart.java @@ -0,0 +1,151 @@ +package twilightforest.entity; + +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityDimensions; +import net.minecraft.world.entity.Pose; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.entity.PartEntity; +import twilightforest.TwilightForestMod; +import twilightforest.network.UpdateTFMultipartPacket; + +import java.util.Objects; + +public abstract class TFPart extends PartEntity { + + public static final ResourceLocation RENDERER = TwilightForestMod.prefix("noop"); + + protected EntityDimensions realSize; + + protected int newPosRotationIncrements; + protected double interpTargetX; + protected double interpTargetY; + protected double interpTargetZ; + protected double interpTargetYaw; + protected double interpTargetPitch; + public float renderYawOffset; + public float prevRenderYawOffset; + + public int deathTime; + public int hurtTime; + + public TFPart(T parent) { + super(parent); + } + + @OnlyIn(Dist.CLIENT) + public ResourceLocation renderer() { + return RENDERER; + } + + @OnlyIn(Dist.CLIENT) + public void setPositionAndRotationDirect(double x, double y, double z, float yaw, float pitch, int posRotationIncrements) { + this.interpTargetX = x; + this.interpTargetY = y; + this.interpTargetZ = z; + this.interpTargetYaw = yaw; + this.interpTargetPitch = pitch; + this.newPosRotationIncrements = posRotationIncrements; + } + + @Override + public void tick() { + updateLastPos(); + super.tick(); + if (this.newPosRotationIncrements > 0) { + double d0 = this.getX() + (this.interpTargetX - this.getX()) / (double) this.newPosRotationIncrements; + double d2 = this.getY() + (this.interpTargetY - this.getY()) / (double) this.newPosRotationIncrements; + double d4 = this.getZ() + (this.interpTargetZ - this.getZ()) / (double) this.newPosRotationIncrements; + double d6 = Mth.wrapDegrees(this.interpTargetYaw - (double) this.getYRot()); + this.setYRot((float) ((double) this.getYRot() + d6 / (double) this.newPosRotationIncrements)); + this.setXRot((float) ((double) this.getXRot() + (this.interpTargetPitch - (double) this.getXRot()) / (double) this.newPosRotationIncrements)); + --this.newPosRotationIncrements; + this.setPos(d0, d2, d4); + this.setRot(this.getYRot(), this.getXRot()); + } + + while (getYRot() - this.yRotO < -180F) this.yRotO -= 360F; + while (getYRot() - this.yRotO >= 180F) this.yRotO += 360F; + + while (this.renderYawOffset - this.prevRenderYawOffset < -180F) this.prevRenderYawOffset -= 360F; + while (this.renderYawOffset - this.prevRenderYawOffset >= 180F) this.prevRenderYawOffset += 360F; + + while (getXRot() - this.xRotO < -180F) this.xRotO -= 360F; + while (getXRot() - this.xRotO >= 180F) this.xRotO += 360F; + } + + public final void updateLastPos() { + this.moveTo(this.getX(), this.getY(), this.getZ()); + this.yRotO = this.getYRot(); + this.xRotO = this.getXRot(); + this.tickCount++; + } + + protected void setSize(EntityDimensions size) { + this.realSize = size; + this.refreshDimensions(); + } + + @Override + public boolean isCurrentlyGlowing() { + return this.getParent().isCurrentlyGlowing(); + } + + @Override + public boolean isInvisible() { + return this.getParent().isInvisible(); + } + + @Override + public EntityDimensions getDimensions(Pose pose) { + return this.realSize; + } + + @Override + public boolean isPickable() { + return true; + } + + @Override + public void setId(int id) { + super.setId(id + 1); + } + + public UpdateTFMultipartPacket.PartDataHolder writeData() { + return new UpdateTFMultipartPacket.PartDataHolder( + this.getX(), + this.getY(), + this.getZ(), + this.getYRot(), + this.getXRot(), + this.dimensions.width, + this.dimensions.height, + this.dimensions.fixed, + getEntityData().isDirty(), + getEntityData().isDirty() ? getEntityData().packDirty() : null); + + } + + public void readData(UpdateTFMultipartPacket.PartDataHolder data) { + Vec3 vec = new Vec3(data.x(), data.y(), data.z()); + this.setPositionAndRotationDirect(vec.x(), vec.y(), vec.z(), data.yRot(), data.xRot(), 3); + final float w = data.width(); + final float h = data.height(); + this.setSize(data.fixed() ? EntityDimensions.fixed(w, h) : EntityDimensions.scalable(w, h)); + this.refreshDimensions(); + if (data.dirty()) + getEntityData().assignValues(data.data()); + } + + public static void assignPartIDs(Entity parent) { + PartEntity[] parts = parent.getParts(); + for (int i = 0, partsLength = Objects.requireNonNull(parts).length; i < partsLength; i++) { + PartEntity part = parts[i]; + part.setId(parent.getId() + i); + } + } +} diff --git a/src/main/java/twilightforest/entity/TwilightBoat.java b/src/main/java/twilightforest/entity/TwilightBoat.java new file mode 100644 index 0000000000..eb0eb67234 --- /dev/null +++ b/src/main/java/twilightforest/entity/TwilightBoat.java @@ -0,0 +1,132 @@ +package twilightforest.entity; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.game.ClientGamePacketListener; +import net.minecraft.network.syncher.EntityDataAccessor; +import net.minecraft.network.syncher.EntityDataSerializers; +import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.vehicle.Boat; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraftforge.network.NetworkHooks; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFEntities; +import twilightforest.init.TFItems; + +public class TwilightBoat extends Boat { + + private static final EntityDataAccessor BOAT_TYPE = SynchedEntityData.defineId(TwilightBoat.class, EntityDataSerializers.INT); + + public TwilightBoat(EntityType type, Level level) { + super(type, level); + this.blocksBuilding = true; + } + + public TwilightBoat(Level level, double x, double y, double z) { + this(TFEntities.BOAT.get(), level); + this.setPos(x, y, z); + this.xo = x; + this.yo = y; + this.zo = z; + } + + public TwilightBoat.Type getTwilightBoatType() { + return TwilightBoat.Type.byId(this.getEntityData().get(BOAT_TYPE)); + } + + @Override + public Item getDropItem() { + return switch (this.getTwilightBoatType()) { + case TWILIGHT_OAK -> TFItems.TWILIGHT_OAK_BOAT.get(); + case CANOPY -> TFItems.CANOPY_BOAT.get(); + case MANGROVE -> TFItems.MANGROVE_BOAT.get(); + case DARKWOOD -> TFItems.DARKWOOD_BOAT.get(); + case TIME -> TFItems.TIME_BOAT.get(); + case TRANSFORMATION -> TFItems.TRANSFORMATION_BOAT.get(); + case MINING -> TFItems.MINING_BOAT.get(); + case SORTING -> TFItems.SORTING_BOAT.get(); + }; + } + + public void setTwilightBoatType(TwilightBoat.Type boatType) { + this.getEntityData().set(BOAT_TYPE, boatType.ordinal()); + } + + @Override + protected void defineSynchedData() { + super.defineSynchedData(); + this.getEntityData().define(BOAT_TYPE, Type.TWILIGHT_OAK.ordinal()); + } + + @Override + protected void addAdditionalSaveData(CompoundTag tag) { + tag.putString("Type", this.getTwilightBoatType().getName()); + } + + @Override + protected void readAdditionalSaveData(CompoundTag tag) { + if (tag.contains("Type", 8)) { + this.setTwilightBoatType(TwilightBoat.Type.getTypeFromString(tag.getString("Type"))); + } + } + + @Override + public Packet getAddEntityPacket() { + return NetworkHooks.getEntitySpawningPacket(this); + } + + public enum Type { + TWILIGHT_OAK(TFBlocks.TWILIGHT_OAK_PLANKS.get(), "twilight_oak"), + CANOPY(TFBlocks.CANOPY_PLANKS.get(), "canopy"), + MANGROVE(TFBlocks.MANGROVE_PLANKS.get(), "mangrove"), + DARKWOOD(TFBlocks.DARK_PLANKS.get(), "dark"), + TIME(TFBlocks.TIME_PLANKS.get(), "time"), + TRANSFORMATION(TFBlocks.TRANSFORMATION_PLANKS.get(), "transformation"), + MINING(TFBlocks.MINING_PLANKS.get(), "mining"), + SORTING(TFBlocks.SORTING_PLANKS.get(), "sorting"); + + private final String name; + private final Block block; + + Type(Block block, String name) { + this.name = name; + this.block = block; + } + + public String getName() { + return this.name; + } + + public Block asPlank() { + return this.block; + } + + public String toString() { + return this.name; + } + + public static TwilightBoat.Type byId(int id) { + TwilightBoat.Type[] types = values(); + if (id < 0 || id >= types.length) { + id = 0; + } + + return types[id]; + } + + public static TwilightBoat.Type getTypeFromString(String nameIn) { + TwilightBoat.Type[] types = values(); + + for (Type type : types) { + if (type.getName().equals(nameIn)) { + return type; + } + } + + return types[0]; + } + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/entity/TwilightChestBoat.java b/src/main/java/twilightforest/entity/TwilightChestBoat.java new file mode 100644 index 0000000000..0afabbb54c --- /dev/null +++ b/src/main/java/twilightforest/entity/TwilightChestBoat.java @@ -0,0 +1,212 @@ +package twilightforest.entity; + +import net.minecraft.core.NonNullList; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.Containers; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.HasCustomInventoryScreen; +import net.minecraft.world.entity.SlotAccess; +import net.minecraft.world.entity.monster.piglin.PiglinAi; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.entity.vehicle.ContainerEntity; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.inventory.ChestMenu; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.gameevent.GameEvent; +import org.jetbrains.annotations.Nullable; +import twilightforest.init.TFEntities; +import twilightforest.init.TFItems; + +public class TwilightChestBoat extends TwilightBoat implements HasCustomInventoryScreen, ContainerEntity { + + private NonNullList itemStacks = NonNullList.withSize(27, ItemStack.EMPTY); + @Nullable + private ResourceLocation lootTable; + private long lootTableSeed; + + public TwilightChestBoat(EntityType type, Level level) { + super(type, level); + } + + public TwilightChestBoat(Level level, double x, double y, double z) { + this(TFEntities.CHEST_BOAT.get(), level); + this.setPos(x, y, z); + this.xo = x; + this.yo = y; + this.zo = z; + } + + @Override + protected float getSinglePassengerXOffset() { + return 0.15F; + } + + @Override + protected int getMaxPassengers() { + return 1; + } + + @Override + protected void addAdditionalSaveData(CompoundTag tag) { + super.addAdditionalSaveData(tag); + this.addChestVehicleSaveData(tag); + } + + @Override + protected void readAdditionalSaveData(CompoundTag tag) { + super.readAdditionalSaveData(tag); + this.readChestVehicleSaveData(tag); + } + + @Override + public void destroy(DamageSource damageSource) { + super.destroy(damageSource); + this.chestVehicleDestroyed(damageSource, this.getLevel(), this); + } + + @Override + public void remove(Entity.RemovalReason reason) { + if (!this.getLevel().isClientSide() && reason.shouldDestroy()) { + Containers.dropContents(this.getLevel(), this, this); + } + + super.remove(reason); + } + + @Override + public InteractionResult interact(Player player, InteractionHand hand) { + if (this.canAddPassenger(player) && !player.isSecondaryUseActive()) { + return super.interact(player, hand); + } else { + InteractionResult interactionresult = this.interactWithContainerVehicle(player); + if (interactionresult.consumesAction()) { + this.gameEvent(GameEvent.CONTAINER_OPEN, player); + PiglinAi.angerNearbyPiglins(player, true); + } + + return interactionresult; + } + } + + @Override + public void openCustomInventoryScreen(Player player) { + player.openMenu(this); + if (!player.getLevel().isClientSide()) { + this.gameEvent(GameEvent.CONTAINER_OPEN, player); + PiglinAi.angerNearbyPiglins(player, true); + } + + } + + @Override + public Item getDropItem() { + return switch (this.getTwilightBoatType()) { + case TWILIGHT_OAK -> TFItems.TWILIGHT_OAK_CHEST_BOAT.get(); + case CANOPY -> TFItems.CANOPY_CHEST_BOAT.get(); + case MANGROVE -> TFItems.MANGROVE_CHEST_BOAT.get(); + case DARKWOOD -> TFItems.DARKWOOD_CHEST_BOAT.get(); + case TIME -> TFItems.TIME_CHEST_BOAT.get(); + case TRANSFORMATION -> TFItems.TRANSFORMATION_CHEST_BOAT.get(); + case MINING -> TFItems.MINING_CHEST_BOAT.get(); + case SORTING -> TFItems.SORTING_CHEST_BOAT.get(); + }; + } + + @Override + public void clearContent() { + this.clearChestVehicleContent(); + } + + @Override + public int getContainerSize() { + return 27; + } + + @Override + public ItemStack getItem(int index) { + return this.getChestVehicleItem(index); + } + + @Override + public ItemStack removeItem(int index, int amount) { + return this.removeChestVehicleItem(index, amount); + } + + @Override + public ItemStack removeItemNoUpdate(int index) { + return this.removeChestVehicleItemNoUpdate(index); + } + + @Override + public void setItem(int index, ItemStack stack) { + this.setChestVehicleItem(index, stack); + } + + @Override + public SlotAccess getSlot(int index) { + return this.getChestVehicleSlot(index); + } + + @Override + public void setChanged() { + } + + @Override + public boolean stillValid(Player player) { + return this.isChestVehicleStillValid(player); + } + + @Nullable + @Override + public AbstractContainerMenu createMenu(int id, Inventory inventory, Player player) { + if (this.lootTable != null && player.isSpectator()) { + return null; + } else { + this.unpackLootTable(inventory.player); + return ChestMenu.threeRows(id, inventory, this); + } + } + + public void unpackLootTable(@Nullable Player player) { + this.unpackChestVehicleLootTable(player); + } + + @Nullable + @Override + public ResourceLocation getLootTable() { + return this.lootTable; + } + + @Override + public void setLootTable(@Nullable ResourceLocation location) { + this.lootTable = location; + } + + @Override + public long getLootTableSeed() { + return this.lootTableSeed; + } + + @Override + public void setLootTableSeed(long seed) { + this.lootTableSeed = seed; + } + + @Override + public NonNullList getItemStacks() { + return this.itemStacks; + } + + @Override + public void clearItemStacks() { + this.itemStacks = NonNullList.withSize(this.getContainerSize(), ItemStack.EMPTY); + } +} diff --git a/src/main/java/twilightforest/entity/ai/EntityAICubeCenterOnSymbol.java b/src/main/java/twilightforest/entity/ai/EntityAICubeCenterOnSymbol.java deleted file mode 100644 index 349c3c0258..0000000000 --- a/src/main/java/twilightforest/entity/ai/EntityAICubeCenterOnSymbol.java +++ /dev/null @@ -1,89 +0,0 @@ -package twilightforest.entity.ai; - -import twilightforest.entity.EntityTFRovingCube; -import net.minecraft.entity.ai.EntityAIBase; - -/** - * - * This is a task that runs when we are near a symbol and have stopped pathfinding, but are not centered on the symbol. - * - * The goal of this task is to center on a symbol. - * - * @author benma_000 - * - */ -public class EntityAICubeCenterOnSymbol extends EntityAIBase { - - private EntityTFRovingCube myCube; - private double xPosition; - private double yPosition; - private double zPosition; - private double speed; - - public EntityAICubeCenterOnSymbol(EntityTFRovingCube entityTFRovingCube, double d) { - this.myCube = entityTFRovingCube; - this.xPosition = this.myCube.symbolX; - this.yPosition = this.myCube.symbolY; - this.zPosition = this.myCube.symbolZ; - this.speed = d; - } - - @Override - public boolean shouldExecute() { - this.xPosition = this.myCube.symbolX; - this.yPosition = this.myCube.symbolY; - this.zPosition = this.myCube.symbolZ; - - - if (!this.myCube.getNavigator().noPath()) { - return false; - } else if (this.isCloseToSymbol()) { - - return true; - } else { - return false; - } - } - - /** - * Returns whether an in-progress EntityAIBase should continue executing - */ - public boolean continueExecuting() - { - - - // inch towards it - double dist = this.distanceFromSymbol(); - - - this.myCube.getMoveHelper().setMoveTo(this.xPosition + 0.5F, this.yPosition, this.zPosition + 0.5F, this.speed); - - - if (this.myCube.ticksExisted % 5 == 0) { - //System.out.println("Centering cube on symbol. Dist = " + dist); - //System.out.println("heading to " + this.xPosition + ", " + this.yPosition + ", " + this.zPosition); - } - - return dist > 0.1F && this.isCourseTraversable(); - } - - private boolean isCourseTraversable() { - - return this.distanceFromSymbol() < 100; - } - - private boolean isCloseToSymbol() { - double dist = this.distanceFromSymbol(); - //System.out.println("are we close? Dist = " + dist); - - return dist > 0.25F && dist < 10F; - } - - public double distanceFromSymbol() { - double dx = this.xPosition - this.myCube.posX + 0.5F; - double dy = this.yPosition - this.myCube.posY; - double dz = this.zPosition - this.myCube.posZ + 0.5F; - return Math.sqrt(dx * dx + dy * dy + dz * dz); - } - -} diff --git a/src/main/java/twilightforest/entity/ai/EntityAICubeMoveToRedstoneSymbols.java b/src/main/java/twilightforest/entity/ai/EntityAICubeMoveToRedstoneSymbols.java deleted file mode 100644 index 813151922f..0000000000 --- a/src/main/java/twilightforest/entity/ai/EntityAICubeMoveToRedstoneSymbols.java +++ /dev/null @@ -1,121 +0,0 @@ -package twilightforest.entity.ai; - -import twilightforest.entity.EntityTFRovingCube; -import net.minecraft.entity.ai.EntityAIBase; -import net.minecraft.entity.ai.RandomPositionGenerator; -import net.minecraft.init.Blocks; -import net.minecraft.util.MathHelper; -import net.minecraft.util.Vec3; - -public class EntityAICubeMoveToRedstoneSymbols extends EntityAIBase { - - private EntityTFRovingCube myCube; - private double xPosition; - private double yPosition; - private double zPosition; - private double speed; - - public EntityAICubeMoveToRedstoneSymbols(EntityTFRovingCube entityTFRovingCube, double d) { - this.myCube = entityTFRovingCube; - this.speed = d; - } - - @Override - public boolean shouldExecute() { - if (this.myCube.getRNG().nextInt(20) != 0) - { - return false; - } - else - { - //System.out.println("Cube scanning for symbol"); - - Vec3 vec3 = this.searchForRedstoneSymbol(this.myCube, 16, 5); - - if (vec3 == null) - { - return false; - } - else - { - this.xPosition = vec3.xCoord; - this.yPosition = vec3.yCoord; - this.zPosition = vec3.zCoord; - return true; - } - } - } - - /** - * Returns whether an in-progress EntityAIBase should continue executing - */ - public boolean continueExecuting() - { - return !this.myCube.getNavigator().noPath(); - } - - /** - * Execute a one shot task or start executing a continuous task - */ - public void startExecuting() - { - this.myCube.getNavigator().tryMoveToXYZ(this.xPosition, this.yPosition, this.zPosition, this.speed); - } - - /** - * Search the area for a redstone circle (8 redstone dust around a blank square) - */ - private Vec3 searchForRedstoneSymbol(EntityTFRovingCube myCube2, int xzRange, int yRange) { - - int curX = MathHelper.floor_double(myCube2.posX); - int curY = MathHelper.floor_double(myCube2.posY); - int curZ = MathHelper.floor_double(myCube2.posZ); - - boolean foundSymbol = false; - - for (int x = curX - xzRange; x < curX + xzRange; x++) { - for (int z = curZ - xzRange; z < curZ + xzRange; z++) { - for (int y = curY - yRange; y < curY + yRange; y++) { - if (this.isRedstoneSymbol(x, y, z)) { - - //System.out.println("Cube found symbol at " + x + ", " + y + ", " + z); - - this.myCube.hasFoundSymbol = true; - this.myCube.symbolX = x; - this.myCube.symbolY = y; - this.myCube.symbolZ = z; - - return Vec3.createVectorHelper(x, y, z); - } - } - } - } - - return null; - } - - private boolean isRedstoneSymbol(int x, int y, int z) { - - //System.out.println("Cube checking area at " + x + ", " + y + ", " + z); - - if (!this.myCube.worldObj.blockExists(x, y, z) || !this.myCube.worldObj.isAirBlock(x, y, z)) { - return false; - } else { - // we found an air block, is it surrounded by redstone? - if (this.myCube.worldObj.getBlock(x + 1, y, z) == Blocks.redstone_wire - && this.myCube.worldObj.getBlock(x - 1, y, z) == Blocks.redstone_wire - && this.myCube.worldObj.getBlock(x, y, z + 1) == Blocks.redstone_wire - && this.myCube.worldObj.getBlock(x, y, z - 1) == Blocks.redstone_wire - && this.myCube.worldObj.getBlock(x + 1, y, z + 1) == Blocks.redstone_wire - && this.myCube.worldObj.getBlock(x - 1, y, z + 1) == Blocks.redstone_wire - && this.myCube.worldObj.getBlock(x + 1, y, z - 1) == Blocks.redstone_wire - && this.myCube.worldObj.getBlock(x - 1, y, z - 1) == Blocks.redstone_wire) { - - return true; - } else { - return false; - } - } - } - -} diff --git a/src/main/java/twilightforest/entity/ai/EntityAIStayNearHome.java b/src/main/java/twilightforest/entity/ai/EntityAIStayNearHome.java deleted file mode 100644 index 5608b6b246..0000000000 --- a/src/main/java/twilightforest/entity/ai/EntityAIStayNearHome.java +++ /dev/null @@ -1,71 +0,0 @@ -package twilightforest.entity.ai; - -import net.minecraft.entity.EntityCreature; -import net.minecraft.entity.ai.EntityAIBase; -import net.minecraft.entity.ai.RandomPositionGenerator; -import net.minecraft.util.Vec3; - -public class EntityAIStayNearHome extends EntityAIBase { - - private EntityCreature entity; - private float speed; - - public EntityAIStayNearHome(EntityCreature entityTFYetiAlpha, float sp) { - this.entity = entityTFYetiAlpha; - this.speed = sp; - this.setMutexBits(1); - - } - - @Override - public boolean shouldExecute() { - boolean isOutOfRange = !this.entity.isWithinHomeDistanceCurrentPosition(); - -// if (isOutOfRange) { -// System.out.println("This creature is outside home range, moving home!"); -// } else { -// System.out.println("This creature is inside home range"); -// } - - return isOutOfRange; - } - - /** - * Returns whether an in-progress EntityAIBase should continue executing - */ - public boolean continueExecuting() - { - return !this.entity.getNavigator().noPath(); - } - -// /** -// * Execute a one shot task or start executing a continuous task -// */ -// public void startExecuting() -// { -// this.entity.getNavigator().tryMoveToXYZ(this.entity.getHomePosition().posX, this.entity.getHomePosition().posY, this.entity.getHomePosition().posZ, this.speed); -// } - - /** - * Execute a one shot task or start executing a continuous task - */ - public void startExecuting() - { - //this.insidePosX = -1; - - if (this.entity.getDistanceSq(this.entity.getHomePosition().posX, this.entity.getHomePosition().posY, this.entity.getHomePosition().posZ) > 256.0D) - { - Vec3 vec3 = RandomPositionGenerator.findRandomTargetBlockTowards(this.entity, 14, 3, Vec3.createVectorHelper(this.entity.getHomePosition().posX + 0.5D, this.entity.getHomePosition().posY, this.entity.getHomePosition().posZ + 0.5D)); - - if (vec3 != null) - { - this.entity.getNavigator().tryMoveToXYZ(vec3.xCoord, vec3.yCoord, vec3.zCoord, speed); - } - } - else - { - this.entity.getNavigator().tryMoveToXYZ(this.entity.getHomePosition().posX + 0.5D, this.entity.getHomePosition().posY, this.entity.getHomePosition().posZ + 0.5D, speed); - } - } - -} diff --git a/src/main/java/twilightforest/entity/ai/EntityAITFAvoidFrontalAttack.java b/src/main/java/twilightforest/entity/ai/EntityAITFAvoidFrontalAttack.java deleted file mode 100644 index 23d1de6d22..0000000000 --- a/src/main/java/twilightforest/entity/ai/EntityAITFAvoidFrontalAttack.java +++ /dev/null @@ -1,154 +0,0 @@ -package twilightforest.entity.ai; - -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLiving; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.ai.EntityAIBase; -import net.minecraft.util.MathHelper; -import net.minecraft.util.Vec3; -import twilightforest.entity.EntityTFRedcap; - -public class EntityAITFAvoidFrontalAttack extends EntityAIBase { - - EntityLivingBase entityTarget; - EntityLiving me; - float speed; - boolean lefty; - double xPosition; - double yPosition; - double zPosition; - - double minDistance = 3.0; - double maxDistance = 6.0; - - public EntityAITFAvoidFrontalAttack(EntityTFRedcap entityTFRedcap, float moveSpeed) { - this.me = entityTFRedcap; - this.speed = moveSpeed; - this.lefty = me.worldObj.rand.nextBoolean(); - this.setMutexBits(1); - } - - @Override - public boolean shouldExecute() { - EntityLivingBase attackTarget = this.me.getAttackTarget(); - - if (attackTarget == null || attackTarget.getDistanceToEntity(me) > maxDistance || attackTarget.getDistanceToEntity(me) < minDistance || !isTargetLookingAtMe(attackTarget)) { - return false; - } - else - { - this.entityTarget = attackTarget; - Vec3 avoidPos = findCirclePoint(me, entityTarget, 5, lefty ? 1 : -1); - - if (avoidPos == null) - { - return false; - } - else - { - this.xPosition = avoidPos.xCoord; - this.yPosition = avoidPos.yCoord; - this.zPosition = avoidPos.zCoord; - return true; - } - } - - } - - /** - * Execute a one shot task or start executing a continuous task - */ - @Override - public void startExecuting() - { - //System.out.println("avoid ai starting"); - this.me.getNavigator().tryMoveToXYZ(this.xPosition, this.yPosition, this.zPosition, this.speed); - } - - - /** - * Returns whether an in-progress EntityAIBase should continue executing - */ - @Override - public boolean continueExecuting() - { - EntityLivingBase attackTarget = this.me.getAttackTarget(); - - if (attackTarget == null) { - return false; - } - else if (!this.entityTarget.isEntityAlive()) { - return false; - } - else if (this.me.getNavigator().noPath()) { - return false; - } - - boolean shouldContinue = attackTarget.getDistanceToEntity(me) < maxDistance && attackTarget.getDistanceToEntity(me) > minDistance && isTargetLookingAtMe(attackTarget); - - //System.out.println("ai evaluating should continue to " + shouldContinue); - - return shouldContinue; - } - - /** - * Updates the task - */ - @Override - public void updateTask() - { - this.me.getLookHelper().setLookPositionWithEntity(this.entityTarget, 30.0F, 30.0F); - } - - - /** - * Resets the task - */ - @Override - public void resetTask() - { - this.entityTarget = null; - this.me.getNavigator().clearPathEntity(); - } - - - /** - * Finds a point that allows us to circle the player clockwise. - */ - protected Vec3 findCirclePoint(Entity circler, Entity toCircle, double radius, double rotation) { - - // compute angle - double vecx = circler.posX - toCircle.posX; - double vecz = circler.posZ - toCircle.posZ; - float rangle = (float)(Math.atan2(vecz, vecx)); - - // add a little, so he circles - rangle += rotation; - - // figure out where we're headed from the target angle - double dx = MathHelper.cos(rangle) * radius; - double dz = MathHelper.sin(rangle) * radius; - - // add that to the target entity's position, and we have our destination - return Vec3.createVectorHelper(toCircle.posX + dx, circler.boundingBox.minY, toCircle.posZ + dz); - } - - - /** - * Fairly straightforward. Returns true in a 120 degree arc in front of the target's view. - * @return - */ - public boolean isTargetLookingAtMe(EntityLivingBase attackTarget) { - // find angle of approach - double dx = me.posX - attackTarget.posX; - double dz = me.posZ - attackTarget.posZ; - float angle = (float)((Math.atan2(dz, dx) * 180D) / 3.1415927410125732D) - 90F; - - float difference = MathHelper.abs((attackTarget.rotationYaw - angle) % 360); - -// System.out.println("Difference in angle of approach is " + difference); - - return difference < 60 || difference > 300; - } - -} diff --git a/src/main/java/twilightforest/entity/ai/EntityAITFBirdFly.java b/src/main/java/twilightforest/entity/ai/EntityAITFBirdFly.java deleted file mode 100644 index e3e8368303..0000000000 --- a/src/main/java/twilightforest/entity/ai/EntityAITFBirdFly.java +++ /dev/null @@ -1,33 +0,0 @@ -package twilightforest.entity.ai; - -import net.minecraft.entity.ai.EntityAIBase; -import twilightforest.entity.passive.EntityTFTinyBird; - -public class EntityAITFBirdFly extends EntityAIBase { - - private EntityTFTinyBird entity; - - public EntityAITFBirdFly(EntityTFTinyBird par1EntityCreature) - { - this.entity = par1EntityCreature; - this.setMutexBits(5); - } - - /** - * Returns whether the EntityAIBase should begin execution. - */ - @Override - public boolean shouldExecute() { - return !entity.isBirdLanded(); - } - - /** - * Returns whether an in-progress EntityAIBase should continue executing - */ - @Override - public boolean continueExecuting() - { - return !entity.isBirdLanded(); - } - -} diff --git a/src/main/java/twilightforest/entity/ai/EntityAITFBreathAttack.java b/src/main/java/twilightforest/entity/ai/EntityAITFBreathAttack.java deleted file mode 100644 index f96879f289..0000000000 --- a/src/main/java/twilightforest/entity/ai/EntityAITFBreathAttack.java +++ /dev/null @@ -1,207 +0,0 @@ -package twilightforest.entity.ai; - -import java.util.List; - -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLiving; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.ai.EntityAIBase; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.MathHelper; -import net.minecraft.util.MovingObjectPosition; -import net.minecraft.util.Vec3; -import twilightforest.entity.IBreathAttacker; - -public class EntityAITFBreathAttack extends EntityAIBase { - - private EntityLiving entityHost; - private EntityLivingBase attackTarget; - - protected double breathX; - protected double breathY; - protected double breathZ; - - private int maxDuration; - private float attackChance; - private float breathRange; - - private int durationLeft; - - public EntityAITFBreathAttack(EntityLiving par1EntityLiving, float speed, float range, int time, float chance) - { - this.entityHost = par1EntityLiving; - this.breathRange = range; - this.maxDuration = time; - this.attackChance = chance; - this.setMutexBits(7); - } - - /** - * Breathe when we are within range and line of sight of the target - */ - @Override - public boolean shouldExecute() - { - this.attackTarget = this.entityHost.getAttackTarget(); - - if (this.attackTarget == null || this.entityHost.getDistanceToEntity(attackTarget) > this.breathRange || !this.entityHost.canEntityBeSeen(attackTarget)) - { - return false; - } - else - { - breathX = attackTarget.posX; - breathY = attackTarget.posY + attackTarget.getEyeHeight(); - breathZ = attackTarget.posZ; - - return this.entityHost.getRNG().nextFloat() < this.attackChance; - } - } - - /** - * Initialize counters - */ - @Override - public void startExecuting() - { - this.durationLeft = this.maxDuration; - - // set breather flag - if (this.entityHost instanceof IBreathAttacker) - { - ((IBreathAttacker) entityHost).setBreathing(true); - } - } - - /** - * Keep breathing until the target dies, or moves out of range or line of sight - */ - @Override - public boolean continueExecuting() - { - return this.durationLeft > 0 && !this.entityHost.isDead && !this.attackTarget.isDead - && this.entityHost.getDistanceToEntity(attackTarget) <= this.breathRange - && this.entityHost.canEntityBeSeen(attackTarget); - } - - /** - * Update timers, deal damage - */ - @Override - public void updateTask() - { - this.durationLeft--; - - // why do we need both of these? - this.entityHost.getLookHelper().setLookPosition(breathX, breathY, breathZ, 100.0F, 100.0F); - faceVec(breathX, breathY, breathZ, 100.0F, 100.0F); - - if ((this.maxDuration - this.durationLeft) > 5) - { - // anyhoo, deal damage - Entity target = getHeadLookTarget(); - - if (target != null) - { - ((IBreathAttacker) entityHost).doBreathAttack(target); - } - } - - } - - @Override - public void resetTask() - { - this.durationLeft = 0; - - // set breather flag - if (this.entityHost instanceof IBreathAttacker) - { - ((IBreathAttacker) entityHost).setBreathing(false); - } - } - - - /** - * What, if anything, is the head currently looking at? - */ - @SuppressWarnings("unchecked") - private Entity getHeadLookTarget() { - Entity pointedEntity = null; - double range = 30.0D; - Vec3 srcVec = Vec3.createVectorHelper(this.entityHost.posX, this.entityHost.posY + 0.25, this.entityHost.posZ); - Vec3 lookVec = this.entityHost.getLook(1.0F); - Vec3 destVec = srcVec.addVector(lookVec.xCoord * range, lookVec.yCoord * range, lookVec.zCoord * range); - float var9 = 3.0F; - List possibleList = this.entityHost.worldObj.getEntitiesWithinAABBExcludingEntity(this.entityHost, this.entityHost.boundingBox.addCoord(lookVec.xCoord * range, lookVec.yCoord * range, lookVec.zCoord * range).expand(var9, var9, var9)); - double hitDist = 0; - - for (Entity possibleEntity : possibleList) - { - if (possibleEntity.canBeCollidedWith() && possibleEntity != this.entityHost) - { - float borderSize = possibleEntity.getCollisionBorderSize(); - AxisAlignedBB collisionBB = possibleEntity.boundingBox.expand((double)borderSize, (double)borderSize, (double)borderSize); - MovingObjectPosition interceptPos = collisionBB.calculateIntercept(srcVec, destVec); - - if (collisionBB.isVecInside(srcVec)) - { - if (0.0D < hitDist || hitDist == 0.0D) - { - pointedEntity = possibleEntity; - hitDist = 0.0D; - } - } - else if (interceptPos != null) - { - double possibleDist = srcVec.distanceTo(interceptPos.hitVec); - - if (possibleDist < hitDist || hitDist == 0.0D) - { - pointedEntity = possibleEntity; - hitDist = possibleDist; - } - } - } - } - return pointedEntity; - } - - /** - * Face the head towards a specific Vector - */ - public void faceVec(double xCoord, double yCoord, double zCoord, float yawConstraint, float pitchConstraint) { - double xOffset = xCoord - entityHost.posX; - double zOffset = zCoord - entityHost.posZ; - double yOffset = (entityHost.posY + 0.25) - yCoord; - - double distance = MathHelper.sqrt_double(xOffset * xOffset + zOffset * zOffset); - float xyAngle = (float)((Math.atan2(zOffset, xOffset) * 180D) / Math.PI) - 90F; - float zdAngle = (float)(-((Math.atan2(yOffset, distance) * 180D) / Math.PI)); - entityHost.rotationPitch = -updateRotation(entityHost.rotationPitch, zdAngle, pitchConstraint); - entityHost.rotationYaw = updateRotation(entityHost.rotationYaw, xyAngle, yawConstraint); - - } - - /** - * Arguments: current rotation, intended rotation, max increment. - */ - private float updateRotation(float par1, float par2, float par3) - { - float var4 = MathHelper.wrapAngleTo180_float(par2 - par1); - - if (var4 > par3) - { - var4 = par3; - } - - if (var4 < -par3) - { - var4 = -par3; - } - - return par1 + var4; - } - - -} diff --git a/src/main/java/twilightforest/entity/ai/EntityAITFChargeAttack.java b/src/main/java/twilightforest/entity/ai/EntityAITFChargeAttack.java deleted file mode 100644 index 400d8706af..0000000000 --- a/src/main/java/twilightforest/entity/ai/EntityAITFChargeAttack.java +++ /dev/null @@ -1,187 +0,0 @@ -package twilightforest.entity.ai; - -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityCreature; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.ai.EntityAIBase; -import net.minecraft.util.MathHelper; -import net.minecraft.util.Vec3; -import twilightforest.entity.EntityTFMinotaur; -import twilightforest.entity.ITFCharger; - -public class EntityAITFChargeAttack extends EntityAIBase { - - protected static final double MIN_RANGE_SQ = 16.0D; - protected static final double MAX_RANGE_SQ = 64.0D; - protected static final int FREQ = 1; - - protected EntityCreature charger; - protected EntityLivingBase chargeTarget; - protected double chargeX; - protected double chargeY; - protected double chargeZ; - - protected float speed; - - protected int windup; - - protected boolean hasAttacked; - - public EntityAITFChargeAttack(EntityCreature entityLiving, float f) { - this.charger = entityLiving; - this.speed = f; - this.windup = 0; - this.hasAttacked = false; - this.setMutexBits(3); - } - - /** - * Returns whether the EntityAIBase should begin execution. - */ - @Override - public boolean shouldExecute() { - this.chargeTarget = this.charger.getAttackTarget(); - - if (this.chargeTarget == null) - { - return false; - } - else - { - double distance = this.charger.getDistanceSqToEntity(this.chargeTarget); - if (distance < MIN_RANGE_SQ || distance > MAX_RANGE_SQ) { - return false; - } - else if (!this.charger.onGround) { - return false; - } - else { - Vec3 chargePos = findChargePoint(charger, chargeTarget, 2.1); - boolean canSeeTargetFromDest = chargeTarget.worldObj.rayTraceBlocks(Vec3.createVectorHelper(chargeTarget.posX, chargeTarget.posY + chargeTarget.getEyeHeight(), chargeTarget.posZ), chargePos) == null; - if (chargePos == null || !canSeeTargetFromDest) - { - return false; - } - else - { - chargeX = chargePos.xCoord; - chargeY = chargePos.yCoord; - chargeZ = chargePos.zCoord; - - //System.out.println("Setting charge position to " + chargePos.xCoord + ", " + chargePos.yCoord + ", " + chargePos.zCoord); - - return this.charger.getRNG().nextInt(FREQ) == 0; - } - } - - } - } - - /** - * Execute a one shot task or start executing a continuous task - */ - @Override - public void startExecuting() - { - this.windup = 15 + this.charger.getRNG().nextInt(30); - } - - - /** - * Returns whether an in-progress EntityAIBase should continue executing - */ - @Override - public boolean continueExecuting() - { - return windup > 0 || !this.charger.getNavigator().noPath(); - } - - /** - * Updates the task - */ - @Override - public void updateTask() - { - // look where we're going - this.charger.getLookHelper().setLookPosition(chargeX, chargeY - 1, chargeZ, 10.0F, this.charger.getVerticalFaceSpeed()); - - if (windup > 0) - { - if (--windup == 0) - { - // actually charge! - - this.charger.getNavigator().tryMoveToXYZ(chargeX, chargeY, chargeZ, this.speed); - } - else - { - //System.out.println("charging in " + windup); - this.charger.limbSwingAmount += 0.8; - - if (this.charger instanceof ITFCharger) - { - ((ITFCharger)charger).setCharging(true); - } - } - } - - // attack the target when we get in range - double var1 = this.charger.width * 2.1F * this.charger.width * 2.1F; - - if (this.charger.getDistanceSq(this.chargeTarget.posX, this.chargeTarget.boundingBox.minY, this.chargeTarget.posZ) <= var1) - { - if (!this.hasAttacked) - { - this.hasAttacked = true; - this.charger.attackEntityAsMob(this.chargeTarget); - } - } - - } - - - /** - * Resets the task - */ - @Override - public void resetTask() - { - //System.out.println("Resetting charge task, we're done"); - - this.windup = 0; - this.chargeTarget = null; - this.hasAttacked = false; - - if (this.charger instanceof ITFCharger) - { - ((ITFCharger)charger).setCharging(false); - } - - } - - - /** - * Finds a point that is overshoot blocks "beyond" the target from our position. - */ - protected Vec3 findChargePoint(Entity attacker, Entity target, double overshoot) { - - // compute angle - double vecx = target.posX - attacker.posX; - double vecz = target.posZ - attacker.posZ; - float rangle = (float)(Math.atan2(vecz, vecx)); - - double distance = MathHelper.sqrt_double(vecx * vecx + vecz * vecz); - - // figure out where we're headed from the target angle - double dx = MathHelper.cos(rangle) * (distance + overshoot); - double dz = MathHelper.sin(rangle) * (distance + overshoot); - -// System.out.println("Charge position is " + (attacker.posX + dx) + ", " + (attacker.posZ + dz)); -// System.out.println("Target position is " + target.posX + ", " + target.posZ); - - // add that to the target entity's position, and we have our destination - return Vec3.createVectorHelper(attacker.posX + dx, target.posY, attacker.posZ + dz); - } - - -} diff --git a/src/main/java/twilightforest/entity/ai/EntityAITFCollideAttackFixed.java b/src/main/java/twilightforest/entity/ai/EntityAITFCollideAttackFixed.java deleted file mode 100644 index 0814d6785a..0000000000 --- a/src/main/java/twilightforest/entity/ai/EntityAITFCollideAttackFixed.java +++ /dev/null @@ -1,183 +0,0 @@ -package twilightforest.entity.ai; - -import net.minecraft.entity.EntityCreature; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.ai.EntityAIBase; -import net.minecraft.pathfinding.PathEntity; -import net.minecraft.pathfinding.PathPoint; -import net.minecraft.util.MathHelper; -import net.minecraft.world.World; - -/** - * This is a copy of EntityAIAttackOnCollide modified to change a few hardcoded behaviors - * - * @author Mojang - * - */ -public class EntityAITFCollideAttackFixed extends EntityAIBase -{ - World worldObj; - EntityCreature attacker; - /** - * An amount of decrementing ticks that allows the entity to attack once the tick reaches 0. - */ - int attackTick; - /** The speed with which the mob will approach the target */ - double speedTowardsTarget; - /** - * When true, the mob will continue chasing its target, even if it can't find a path to them right now. - */ - boolean longMemory; - /** The PathEntity of our entity. */ - PathEntity entityPathEntity; - Class classTarget; - private int delayTicks; - private double pathX; - private double pathY; - private double pathZ; - private int failedPathFindingPenalty; - - public EntityAITFCollideAttackFixed(EntityCreature par1EntityCreature, Class par2Class, double par3, boolean par5) - { - this(par1EntityCreature, par3, par5); - this.classTarget = par2Class; - } - - public EntityAITFCollideAttackFixed(EntityCreature par1EntityCreature, double par2, boolean par4) - { - this.attacker = par1EntityCreature; - this.worldObj = par1EntityCreature.worldObj; - this.speedTowardsTarget = par2; - this.longMemory = par4; - this.setMutexBits(3); - } - - /** - * Returns whether the EntityAIBase should begin execution. - */ - public boolean shouldExecute() - { - EntityLivingBase entitylivingbase = this.attacker.getAttackTarget(); - - if (entitylivingbase == null) - { - return false; - } - else if (!entitylivingbase.isEntityAlive()) - { - return false; - } - else if (this.classTarget != null && !this.classTarget.isAssignableFrom(entitylivingbase.getClass())) - { - return false; - } - else - { - if (-- this.delayTicks <= 0) - { - this.entityPathEntity = this.attacker.getNavigator().getPathToEntityLiving(entitylivingbase); - this.delayTicks = 4 + this.attacker.getRNG().nextInt(7); - return this.entityPathEntity != null; - } - else - { - return true; - } - } - } - - /** - * Returns whether an in-progress EntityAIBase should continue executing - */ - public boolean continueExecuting() - { - EntityLivingBase entitylivingbase = this.attacker.getAttackTarget(); - return entitylivingbase == null ? false : (!entitylivingbase.isEntityAlive() ? false : (!this.longMemory ? !this.attacker.getNavigator().noPath() : this.attacker.isWithinHomeDistance(MathHelper.floor_double(entitylivingbase.posX), MathHelper.floor_double(entitylivingbase.posY), MathHelper.floor_double(entitylivingbase.posZ)))); - } - - /** - * Execute a one shot task or start executing a continuous task - */ - public void startExecuting() - { - this.attacker.getNavigator().setPath(this.entityPathEntity, this.speedTowardsTarget); - this.delayTicks = 0; - } - - /** - * Resets the task - */ - public void resetTask() - { - this.attacker.getNavigator().clearPathEntity(); - } - - /** - * Updates the task - */ - public void updateTask() - { - EntityLivingBase entitylivingbase = this.attacker.getAttackTarget(); - this.attacker.getLookHelper().setLookPositionWithEntity(entitylivingbase, 30.0F, 30.0F); - - double distanceToAttacker = this.attacker.getDistanceSq(entitylivingbase.posX, entitylivingbase.boundingBox.minY, entitylivingbase.posZ); - double attackRange = (double)(this.attacker.width * 2.0F * this.attacker.width * 2.0F + entitylivingbase.width); - - --this.delayTicks; - - if ((this.longMemory || this.attacker.getEntitySenses().canSee(entitylivingbase)) && this.delayTicks <= 0 && (this.pathX == 0.0D && this.pathY == 0.0D && this.pathZ == 0.0D || entitylivingbase.getDistanceSq(this.pathX, this.pathY, this.pathZ) >= 1.0D || this.attacker.getRNG().nextFloat() < 0.05F)) - { - this.pathX = entitylivingbase.posX; - this.pathY = entitylivingbase.boundingBox.minY; - this.pathZ = entitylivingbase.posZ; - this.delayTicks = failedPathFindingPenalty + 4 + this.attacker.getRNG().nextInt(7); - - if (this.attacker.getNavigator().getPath() != null) - { - PathPoint finalPathPoint = this.attacker.getNavigator().getPath().getFinalPathPoint(); - if (finalPathPoint != null && entitylivingbase.getDistanceSq(finalPathPoint.xCoord, finalPathPoint.yCoord, finalPathPoint.zCoord) < 1) - { - failedPathFindingPenalty = 0; - } - else - { - failedPathFindingPenalty += 10; - } - } - else - { - failedPathFindingPenalty += 10; - } - - if (distanceToAttacker > 1024.0D) - { - this.delayTicks += 10; - } - else if (distanceToAttacker > 256.0D) - { - this.delayTicks += 5; - } - - if (!this.attacker.getNavigator().tryMoveToEntityLiving(entitylivingbase, this.speedTowardsTarget)) - { - this.delayTicks += 15; - } - } - - this.attackTick = Math.max(this.attackTick - 1, 0); - - // fix bug removing any delay from attacks - if (distanceToAttacker <= attackRange && this.attackTick <= 0) - { - // double attack timeout - this.attackTick = 20; - - if (this.attacker.getHeldItem() != null) - { - this.attacker.swingItem(); - } - - this.attacker.attackEntityAsMob(entitylivingbase); - } - } -} \ No newline at end of file diff --git a/src/main/java/twilightforest/entity/ai/EntityAITFEatLoose.java b/src/main/java/twilightforest/entity/ai/EntityAITFEatLoose.java deleted file mode 100644 index 03f0d0b1b0..0000000000 --- a/src/main/java/twilightforest/entity/ai/EntityAITFEatLoose.java +++ /dev/null @@ -1,119 +0,0 @@ -package twilightforest.entity.ai; - -import java.util.List; - -import net.minecraft.entity.ai.EntityAIBase; -import net.minecraft.entity.item.EntityItem; -import net.minecraft.item.Item; -import twilightforest.entity.passive.EntityTFQuestRam; - -/** - * This is an AI task for the quest ram. When one of the items it wants comes within a close distance, i - * - * @author Ben - * - */ -public class EntityAITFEatLoose extends EntityAIBase { - - /** The entity using this AI that is tempted by the player. */ - private EntityTFQuestRam temptedQuestRam; - - private Item temptID; - - private int delayTemptCounter; - - private EntityItem temptingItem; - - - public EntityAITFEatLoose(EntityTFQuestRam entityTFQuestRam, Item blockID) { - this.temptedQuestRam = entityTFQuestRam; - this.temptID = blockID; - this.setMutexBits(0); - } - - /** - * Returns whether the EntityAIBase should begin execution. - */ - @SuppressWarnings("unchecked") - @Override - public boolean shouldExecute() - { - if (this.delayTemptCounter > 0) - { - --this.delayTemptCounter; - return false; - } - else - { - this.temptingItem = null; - - List nearbyItems = this.temptedQuestRam.worldObj.getEntitiesWithinAABB(EntityItem.class, this.temptedQuestRam.boundingBox.expand(2.0D, 2.0D, 2.0D)); - - for (EntityItem itemNearby : nearbyItems) { - if (itemNearby.getEntityItem().getItem() == temptID && !temptedQuestRam.isColorPresent(itemNearby.getEntityItem().getItemDamage()) && itemNearby.isEntityAlive()) { // is a wool block really "alive"? - this.temptingItem = itemNearby; - break; - } - } - - if (this.temptingItem == null) { - return false; - } - else { - return true; - } - } - } - - - /** - * Returns whether an in-progress EntityAIBase should continue executing - */ - @Override - public boolean continueExecuting() - { - return this.shouldExecute(); - } - - /** - * Execute a one shot task or start executing a continuous task - */ - @Override - public void startExecuting() - { - ; - } - - /** - * Resets the task - */ - @Override - public void resetTask() - { - this.temptingItem = null; - this.temptedQuestRam.getNavigator().clearPathEntity(); - this.delayTemptCounter = 100; - } - - /** - * Updates the task - */ - @Override - public void updateTask() - { - this.temptedQuestRam.getLookHelper().setLookPositionWithEntity(this.temptingItem, 30.0F, this.temptedQuestRam.getVerticalFaceSpeed()); - - if (this.temptedQuestRam.getDistanceSqToEntity(this.temptingItem) < 6.25D) - { - if (!temptedQuestRam.isColorPresent(temptingItem.getEntityItem().getItemDamage())) { // we did technically already check this, but why not check again - // EAT IT! - this.temptingItem.setDead(); - this.temptedQuestRam.playLivingSound(); - this.temptedQuestRam.setColorPresent(temptingItem.getEntityItem().getItemDamage()); - this.temptedQuestRam.animateAddColor(temptingItem.getEntityItem().getItemDamage(), 50); // TODO: find a better place for this? refactor? - //System.out.println("yum"); - } - } - } - -} diff --git a/src/main/java/twilightforest/entity/ai/EntityAITFFindLoose.java b/src/main/java/twilightforest/entity/ai/EntityAITFFindLoose.java deleted file mode 100644 index 857e095c73..0000000000 --- a/src/main/java/twilightforest/entity/ai/EntityAITFFindLoose.java +++ /dev/null @@ -1,112 +0,0 @@ -package twilightforest.entity.ai; - -import java.util.List; - -import net.minecraft.entity.EntityCreature; -import net.minecraft.entity.ai.EntityAIBase; -import net.minecraft.entity.item.EntityItem; -import net.minecraft.item.Item; -import twilightforest.entity.passive.EntityTFQuestRam; - - -public class EntityAITFFindLoose extends EntityAIBase { - - /** The entity using this AI that is tempted by the player. */ - private EntityCreature temptedEntity; - - private Item temptID; - private float pursueSpeed; - - private int delayTemptCounter; - - private EntityItem temptingItem; - - public EntityAITFFindLoose(EntityTFQuestRam entityTFQuestRam, float speed, Item blockID) { - this.temptedEntity = entityTFQuestRam; - this.pursueSpeed = speed; - this.temptID = blockID; - this.setMutexBits(3); - } - - /** - * Returns whether the EntityAIBase should begin execution. - */ - @SuppressWarnings("unchecked") - @Override - public boolean shouldExecute() - { - if (this.delayTemptCounter > 0) - { - --this.delayTemptCounter; - return false; - } - else - { - this.temptingItem = null; - - List nearbyItems = this.temptedEntity.worldObj.getEntitiesWithinAABB(EntityItem.class, this.temptedEntity.boundingBox.expand(16.0D, 4.0D, 16.0D)); - - for (EntityItem itemNearby : nearbyItems) { - if (itemNearby.getEntityItem().getItem() == temptID && itemNearby.isEntityAlive()) { - this.temptingItem = itemNearby; - break; - } - } - - if (this.temptingItem == null) { - return false; - } - else { - return true; - } - } - } - - - /** - * Returns whether an in-progress EntityAIBase should continue executing - */ - @Override - public boolean continueExecuting() - { - return this.shouldExecute(); - } - - /** - * Execute a one shot task or start executing a continuous task - */ - @Override - public void startExecuting() - { - ; - } - - /** - * Resets the task - */ - @Override - public void resetTask() - { - this.temptingItem = null; - this.temptedEntity.getNavigator().clearPathEntity(); - this.delayTemptCounter = 100; - } - - /** - * Updates the task - */ - @Override - public void updateTask() - { - this.temptedEntity.getLookHelper().setLookPositionWithEntity(this.temptingItem, 30.0F, this.temptedEntity.getVerticalFaceSpeed()); - - if (this.temptedEntity.getDistanceSqToEntity(this.temptingItem) < 6.25D) - { - this.temptedEntity.getNavigator().clearPathEntity(); - } - else - { - this.temptedEntity.getNavigator().tryMoveToXYZ(temptingItem.posX, temptingItem.posY, temptingItem.posZ, this.pursueSpeed); - } - } -} diff --git a/src/main/java/twilightforest/entity/ai/EntityAITFFlockTarget.java b/src/main/java/twilightforest/entity/ai/EntityAITFFlockTarget.java deleted file mode 100644 index 4873c96843..0000000000 --- a/src/main/java/twilightforest/entity/ai/EntityAITFFlockTarget.java +++ /dev/null @@ -1,63 +0,0 @@ -package twilightforest.entity.ai; - -import java.util.ArrayList; -import java.util.List; - -import net.minecraft.entity.EntityCreature; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.ai.EntityAITarget; - -public class EntityAITFFlockTarget extends EntityAITarget -{ - EntityLivingBase flockCreature; - EntityLivingBase flockTarget; - - public EntityAITFFlockTarget(EntityCreature par1EntityLiving, boolean b) - { - super(par1EntityLiving, false); - this.flockCreature = par1EntityLiving; - this.setMutexBits(1); - } - - /** - * Returns whether the EntityAIBase should begin execution. - */ - @SuppressWarnings("unchecked") - @Override - public boolean shouldExecute() - { - List flockList = this.flockCreature.worldObj.getEntitiesWithinAABB(this.flockCreature.getClass(), this.flockCreature.boundingBox.expand(16.0D, 4.0D, 16.0D)); - List targetList = new ArrayList(); - - for (EntityLivingBase flocker : flockList) - { - if (flocker.getAITarget() != null) { - targetList.add(flocker.getAITarget()); - } - } - - if (targetList.isEmpty()) { - return false; - } - else - { - // hmm, just pick a random target? - EntityLivingBase randomTarget = targetList.get(this.flockCreature.worldObj.rand.nextInt(targetList.size())); - - System.out.println("randomTarget = " + randomTarget); - - this.flockTarget = randomTarget; - return this.isSuitableTarget(this.flockTarget, true); - } - } - - /** - * Execute a one shot task or start executing a continuous task - */ - @Override - public void startExecuting() - { - this.taskOwner.setAttackTarget(this.flockTarget); - super.startExecuting(); - } -} diff --git a/src/main/java/twilightforest/entity/ai/EntityAITFFlockToSameKind.java b/src/main/java/twilightforest/entity/ai/EntityAITFFlockToSameKind.java deleted file mode 100644 index 73cc05fbae..0000000000 --- a/src/main/java/twilightforest/entity/ai/EntityAITFFlockToSameKind.java +++ /dev/null @@ -1,114 +0,0 @@ -package twilightforest.entity.ai; - -import java.util.List; - -import net.minecraft.entity.EntityLiving; -import net.minecraft.entity.ai.EntityAIBase; -import net.minecraft.util.Vec3; - -public class EntityAITFFlockToSameKind extends EntityAIBase -{ - private static final double MAX_DIST = 256.0D; - private static final double MIN_DIST = 25.0D; - /** The child that is following its parent. */ - EntityLiving flockCreature; - Vec3 flockPosition; - double speed; - private int moveTimer; - - public EntityAITFFlockToSameKind(EntityLiving par1EntityLiving, double par2) - { - this.flockCreature = par1EntityLiving; - this.speed = par2; - } - - /** - * Returns whether the EntityAIBase should begin execution. - */ - @SuppressWarnings("unchecked") - @Override - public boolean shouldExecute() - { - if (this.flockCreature.getRNG().nextInt(40) != 0) - { - return false; - } - - List flockList = this.flockCreature.worldObj.getEntitiesWithinAABB(this.flockCreature.getClass(), this.flockCreature.boundingBox.expand(16.0D, 4.0D, 16.0D)); - - int flocknum = 0; - double flockX = 0; - double flockY = 0; - double flockZ = 0; - - for (EntityLiving flocker : flockList) - { - flocknum++; - flockX += flocker.posX; - flockY += flocker.posY; - flockZ += flocker.posZ; - } - - flockX /= flocknum; - flockY /= flocknum; - flockZ /= flocknum; - - - if (flockCreature.getDistanceSq(flockX, flockY, flockZ) < MIN_DIST) { - return false; - } - else - { - this.flockPosition = Vec3.createVectorHelper(flockX, flockY, flockZ); - return true; - } - } - - /** - * Returns whether an in-progress EntityAIBase should continue executing - */ - @Override - public boolean continueExecuting() - { - if (flockPosition == null) - { - return false; - } - else - { - double distance = this.flockCreature.getDistanceSq(flockPosition.xCoord, flockPosition.yCoord, flockPosition.zCoord); - return distance >= MIN_DIST && distance <= MAX_DIST; - } - } - - /** - * Execute a one shot task or start executing a continuous task - */ - @Override - public void startExecuting() - { - this.moveTimer = 0; - } - - /** - * Resets the task - */ - @Override - public void resetTask() - { - this.flockPosition = null; - } - - /** - * Updates the task - */ - @Override - public void updateTask() - { - if (--this.moveTimer <= 0) - { - this.moveTimer = 10; - this.flockCreature.getNavigator().tryMoveToXYZ(flockPosition.xCoord, flockPosition.yCoord, flockPosition.zCoord, this.speed); - } - } -} diff --git a/src/main/java/twilightforest/entity/ai/EntityAITFGiantAttackOnCollide.java b/src/main/java/twilightforest/entity/ai/EntityAITFGiantAttackOnCollide.java deleted file mode 100644 index 6c9ad613d7..0000000000 --- a/src/main/java/twilightforest/entity/ai/EntityAITFGiantAttackOnCollide.java +++ /dev/null @@ -1,184 +0,0 @@ -package twilightforest.entity.ai; - -import net.minecraft.entity.EntityCreature; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.ai.EntityAIBase; -import net.minecraft.pathfinding.PathEntity; -import net.minecraft.pathfinding.PathPoint; -import net.minecraft.util.MathHelper; -import net.minecraft.world.World; - -/** - * This is a copy of EntityAIAttackOnCollide modified to change a few hardcoded behaviors - * - * @author Mostly Mojang - * - */ -public class EntityAITFGiantAttackOnCollide extends EntityAIBase -{ - World worldObj; - EntityCreature attacker; - /** - * An amount of decrementing ticks that allows the entity to attack once the tick reaches 0. - */ - int attackTick; - /** The speed with which the mob will approach the target */ - double speedTowardsTarget; - /** - * When true, the mob will continue chasing its target, even if it can't find a path to them right now. - */ - boolean longMemory; - /** The PathEntity of our entity. */ - PathEntity entityPathEntity; - Class classTarget; - private int delayTicks; - private double pathX; - private double pathY; - private double pathZ; - private int failedPathFindingPenalty; - - public EntityAITFGiantAttackOnCollide(EntityCreature par1EntityCreature, Class par2Class, double par3, boolean par5) - { - this(par1EntityCreature, par3, par5); - this.classTarget = par2Class; - } - - public EntityAITFGiantAttackOnCollide(EntityCreature par1EntityCreature, double par2, boolean par4) - { - this.attacker = par1EntityCreature; - this.worldObj = par1EntityCreature.worldObj; - this.speedTowardsTarget = par2; - this.longMemory = par4; - this.setMutexBits(3); - } - - /** - * Returns whether the EntityAIBase should begin execution. - */ - public boolean shouldExecute() - { - EntityLivingBase entitylivingbase = this.attacker.getAttackTarget(); - - if (entitylivingbase == null) - { - return false; - } - else if (!entitylivingbase.isEntityAlive()) - { - return false; - } - else if (this.classTarget != null && !this.classTarget.isAssignableFrom(entitylivingbase.getClass())) - { - return false; - } - else - { - if (-- this.delayTicks <= 0) - { - this.entityPathEntity = this.attacker.getNavigator().getPathToEntityLiving(entitylivingbase); - this.delayTicks = 4 + this.attacker.getRNG().nextInt(7); - return this.entityPathEntity != null; - } - else - { - return true; - } - } - } - - /** - * Returns whether an in-progress EntityAIBase should continue executing - */ - public boolean continueExecuting() - { - EntityLivingBase entitylivingbase = this.attacker.getAttackTarget(); - return entitylivingbase == null ? false : (!entitylivingbase.isEntityAlive() ? false : (!this.longMemory ? !this.attacker.getNavigator().noPath() : this.attacker.isWithinHomeDistance(MathHelper.floor_double(entitylivingbase.posX), MathHelper.floor_double(entitylivingbase.posY), MathHelper.floor_double(entitylivingbase.posZ)))); - } - - /** - * Execute a one shot task or start executing a continuous task - */ - public void startExecuting() - { - this.attacker.getNavigator().setPath(this.entityPathEntity, this.speedTowardsTarget); - this.delayTicks = 0; - } - - /** - * Resets the task - */ - public void resetTask() - { - this.attacker.getNavigator().clearPathEntity(); - } - - /** - * Updates the task - */ - public void updateTask() - { - EntityLivingBase entitylivingbase = this.attacker.getAttackTarget(); - this.attacker.getLookHelper().setLookPositionWithEntity(entitylivingbase, 30.0F, 30.0F); - - double distanceToAttacker = this.attacker.getDistanceSq(entitylivingbase.posX, entitylivingbase.boundingBox.minY, entitylivingbase.posZ); - // lower attack range - double attackRange = (double)(this.attacker.width * this.attacker.height); - - --this.delayTicks; - - if ((this.longMemory || this.attacker.getEntitySenses().canSee(entitylivingbase)) && this.delayTicks <= 0 && (this.pathX == 0.0D && this.pathY == 0.0D && this.pathZ == 0.0D || entitylivingbase.getDistanceSq(this.pathX, this.pathY, this.pathZ) >= 1.0D || this.attacker.getRNG().nextFloat() < 0.05F)) - { - this.pathX = entitylivingbase.posX; - this.pathY = entitylivingbase.boundingBox.minY; - this.pathZ = entitylivingbase.posZ; - this.delayTicks = failedPathFindingPenalty + 4 + this.attacker.getRNG().nextInt(7); - - if (this.attacker.getNavigator().getPath() != null) - { - PathPoint finalPathPoint = this.attacker.getNavigator().getPath().getFinalPathPoint(); - if (finalPathPoint != null && entitylivingbase.getDistanceSq(finalPathPoint.xCoord, finalPathPoint.yCoord, finalPathPoint.zCoord) < 1) - { - failedPathFindingPenalty = 0; - } - else - { - failedPathFindingPenalty += 10; - } - } - else - { - failedPathFindingPenalty += 10; - } - - if (distanceToAttacker > 1024.0D) - { - this.delayTicks += 10; - } - else if (distanceToAttacker > 256.0D) - { - this.delayTicks += 5; - } - - if (!this.attacker.getNavigator().tryMoveToEntityLiving(entitylivingbase, this.speedTowardsTarget)) - { - this.delayTicks += 15; - } - } - - this.attackTick = Math.max(this.attackTick - 1, 0); - - // fix bug removing any delay from attacks - if (distanceToAttacker <= attackRange && this.attackTick <= 0) - { - // double attack timeout - this.attackTick = 20; - - if (this.attacker.getHeldItem() != null) - { - this.attacker.swingItem(); - } - - this.attacker.attackEntityAsMob(entitylivingbase); - } - } -} \ No newline at end of file diff --git a/src/main/java/twilightforest/entity/ai/EntityAITFHeavySpearAttack.java b/src/main/java/twilightforest/entity/ai/EntityAITFHeavySpearAttack.java deleted file mode 100644 index c954c9ab42..0000000000 --- a/src/main/java/twilightforest/entity/ai/EntityAITFHeavySpearAttack.java +++ /dev/null @@ -1,33 +0,0 @@ -package twilightforest.entity.ai; - -import net.minecraft.entity.ai.EntityAIBase; -import twilightforest.entity.EntityTFGoblinKnightUpper; - -public class EntityAITFHeavySpearAttack extends EntityAIBase { - - private EntityTFGoblinKnightUpper entity; - - public EntityAITFHeavySpearAttack(EntityTFGoblinKnightUpper par1EntityCreature) - { - this.entity = par1EntityCreature; - this.setMutexBits(7); - } - - /** - * Returns whether the EntityAIBase should begin execution. - */ - @Override - public boolean shouldExecute() { - return entity.heavySpearTimer > 0 && entity.heavySpearTimer < 50; - } - - /** - * Returns whether an in-progress EntityAIBase should continue executing - */ - @Override - public boolean continueExecuting() - { - return entity.heavySpearTimer > 0 && entity.heavySpearTimer < 50; - } - -} diff --git a/src/main/java/twilightforest/entity/ai/EntityAITFHoverBeam.java b/src/main/java/twilightforest/entity/ai/EntityAITFHoverBeam.java deleted file mode 100644 index d0f7764528..0000000000 --- a/src/main/java/twilightforest/entity/ai/EntityAITFHoverBeam.java +++ /dev/null @@ -1,285 +0,0 @@ -package twilightforest.entity.ai; - -import java.util.List; - -import twilightforest.entity.boss.EntityTFSnowQueen; -import twilightforest.entity.boss.EntityTFSnowQueen.Phase; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.ai.EntityAIBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.MathHelper; -import net.minecraft.util.MovingObjectPosition; -import net.minecraft.util.Vec3; - -public class EntityAITFHoverBeam extends EntityAIBase { - - private static final float HOVER_HEIGHT = 3F; - private static final float HOVER_RADIUS = 4F; - private Class classTarget; - private EntityTFSnowQueen attacker; - - private double hoverPosX; - private double hoverPosY; - private double hoverPosZ; - private int hoverTimer; - private int beamTimer; - private int maxHoverTime; - private int maxBeamTime; - private int seekTimer; - private int maxSeekTime; - private double beamY; - private boolean isInPosition; - - public EntityAITFHoverBeam(EntityTFSnowQueen entityTFSnowQueen, Class class1, int hoverTime, int dropTime) { - this.attacker = entityTFSnowQueen; - this.classTarget = class1; - this.setMutexBits(3); - this.maxHoverTime = hoverTime; - this.maxSeekTime = hoverTime; - this.maxBeamTime = dropTime; - - this.hoverTimer = 0; - this.isInPosition = false; - } - - /** - * Returns whether the EntityAIBase should begin execution. - */ - @Override - public boolean shouldExecute() { - EntityLivingBase target = this.attacker.getAttackTarget(); - - if (target == null) { - return false; - } else if (!target.isEntityAlive()) { - return false; - } else if (this.classTarget != null && !this.classTarget.isAssignableFrom(target.getClass())) { - return false; - } else if (this.attacker.getCurrentPhase() != Phase.BEAM) { - return false; - } else { - //System.out.println("We can hover at target!"); - - return true;//attacker.canEntityBeSeen(target); - } - - } - - /** - * Returns whether an in-progress EntityAIBase should continue executing - */ - @Override - public boolean continueExecuting() { - EntityLivingBase target = this.attacker.getAttackTarget(); - - if (target == null || !target.isEntityAlive()) { - return false; - } else if (this.attacker.getCurrentPhase() != Phase.BEAM) { - return false; - } else if (this.seekTimer >= this.maxSeekTime) { - return false; - } else if (this.beamTimer >= this.maxBeamTime) { - return false; - } else { - return true; - } - } - - /** - * Execute a one shot task or start executing a continuous task - */ - @Override - public void startExecuting() { - EntityLivingBase target = this.attacker.getAttackTarget(); - - if (target != null) { - // find a spot above the player - makeNewHoverSpot(target); - } - } - - /** - * Resets the task - */ - @Override - public void resetTask() { - this.seekTimer = 0; - this.hoverTimer = 0; - this.beamTimer = 0; - this.isInPosition = false; - - this.attacker.setBreathing(false); - } - - /** - * Updates the task - */ - @Override - public void updateTask() { - - // check if we're in position - if (this.attacker.getDistanceSq(hoverPosX, hoverPosY, hoverPosZ) <= 1.0F) { - this.isInPosition = true; - } - - // update timers - if (this.isInPosition) { - this.hoverTimer++; - } else { - this.seekTimer++; - } - - // drop once the hover timer runs out - if (this.hoverTimer >= this.maxHoverTime) { - this.beamTimer++; - this.attacker.setBreathing(true); - - // anyhoo, deal damage - Entity target = getHeadLookTarget(); - if (target != null) { - attacker.doBreathAttack(target); - } - - // descend - this.hoverPosY -= 0.05F; - - if (this.hoverPosY < this.beamY) { - this.hoverPosY = this.beamY; - } - } - - // check if we are at our waypoint target - double offsetX = this.hoverPosX - this.attacker.posX; - double offsetY = this.hoverPosY - this.attacker.posY; - double offsetZ = this.hoverPosZ - this.attacker.posZ; - - double distanceDesired = offsetX * offsetX + offsetY * offsetY + offsetZ * offsetZ; - - distanceDesired = (double)MathHelper.sqrt_double(distanceDesired); - - if (distanceDesired > 0.5) { - - // add velocity - double velX = offsetX / distanceDesired * 0.05D; - double velY = offsetY / distanceDesired * 0.1D; - double velZ = offsetZ / distanceDesired * 0.05D; - - // gravity offset - velY += 0.02F; - - - this.attacker.addVelocity(velX, velY, velZ); - //System.out.println("Just set hover velocity, velY = " + velY + " result y = " + this.attacker.motionY); - - } - - - // look at target - EntityLivingBase target = this.attacker.getAttackTarget(); - if (target != null) { - float tracking = this.isInPosition ? 1F: 20.0F; - - this.attacker.faceEntity(target, tracking, tracking); - this.attacker.getLookHelper().setLookPositionWithEntity(target, tracking, tracking); - } - - //System.out.println("Hovering!"); - } - - /** - * What, if anything, is the head currently looking at? - */ - @SuppressWarnings("unchecked") - private Entity getHeadLookTarget() { - Entity pointedEntity = null; - double range = 30.0D; - Vec3 srcVec = Vec3.createVectorHelper(this.attacker.posX, this.attacker.posY + 0.25, this.attacker.posZ); - Vec3 lookVec = this.attacker.getLook(1.0F); - Vec3 destVec = srcVec.addVector(lookVec.xCoord * range, lookVec.yCoord * range, lookVec.zCoord * range); - float var9 = 3.0F; - List possibleList = this.attacker.worldObj.getEntitiesWithinAABBExcludingEntity(this.attacker, this.attacker.boundingBox.addCoord(lookVec.xCoord * range, lookVec.yCoord * range, lookVec.zCoord * range).expand(var9, var9, var9)); - double hitDist = 0; - - for (Entity possibleEntity : possibleList) - { - if (possibleEntity.canBeCollidedWith() && possibleEntity != this.attacker) - { - float borderSize = possibleEntity.getCollisionBorderSize(); - AxisAlignedBB collisionBB = possibleEntity.boundingBox.expand((double)borderSize, (double)borderSize, (double)borderSize); - MovingObjectPosition interceptPos = collisionBB.calculateIntercept(srcVec, destVec); - - if (collisionBB.isVecInside(srcVec)) - { - if (0.0D < hitDist || hitDist == 0.0D) - { - pointedEntity = possibleEntity; - hitDist = 0.0D; - } - } - else if (interceptPos != null) - { - double possibleDist = srcVec.distanceTo(interceptPos.hitVec); - - if (possibleDist < hitDist || hitDist == 0.0D) - { - pointedEntity = possibleEntity; - hitDist = possibleDist; - } - } - } - } - return pointedEntity; - } - - - /** - * Make a new spot to hover at! - */ - private void makeNewHoverSpot(EntityLivingBase target) { - double hx = 0, hy = 0, hz = 0; - - int tries = 100; - - for (int i = 0; i < tries; i++) { - hx = target.posX + (this.attacker.getRNG().nextFloat() - this.attacker.getRNG().nextFloat()) * HOVER_RADIUS; - hy = target.posY + HOVER_HEIGHT; - hz = target.posZ + (this.attacker.getRNG().nextFloat() - this.attacker.getRNG().nextFloat()) * HOVER_RADIUS; - - if (!isPositionOccupied(hx, hy, hz) && this.canEntitySee(this.attacker, hx, hy, hz) && this.canEntitySee(target, hx, hy, hz)) { - break; - } - } - - if (tries == 99) { - //System.out.println("Found no spots, giving up"); - } - - this.hoverPosX = hx; - this.hoverPosY = hy; - this.hoverPosZ = hz; - - this.beamY = target.posY; - - // reset seek timer - this.seekTimer = 0; - } - - private boolean isPositionOccupied(double hx, double hy, double hz) { - float radius = this.attacker.width / 2F; - AxisAlignedBB aabb = AxisAlignedBB.getBoundingBox(hx - radius, hy, hz - radius, hx + radius, hy + this.attacker.height, hz + radius); - - boolean isOccupied = this.attacker.worldObj.getCollidingBoundingBoxes(attacker, aabb).isEmpty(); - - return isOccupied; - } - - /** - * Can the specified entity see the specified location? - */ - protected boolean canEntitySee(Entity entity, double dx, double dy, double dz) { - return entity.worldObj.rayTraceBlocks(Vec3.createVectorHelper(entity.posX, entity.posY + (double)entity.getEyeHeight(), entity.posZ), Vec3.createVectorHelper(dx, dy, dz)) == null; - - } -} diff --git a/src/main/java/twilightforest/entity/ai/EntityAITFHoverSummon.java b/src/main/java/twilightforest/entity/ai/EntityAITFHoverSummon.java deleted file mode 100644 index b45c864e05..0000000000 --- a/src/main/java/twilightforest/entity/ai/EntityAITFHoverSummon.java +++ /dev/null @@ -1,209 +0,0 @@ -package twilightforest.entity.ai; - -import twilightforest.entity.boss.EntityTFSnowQueen; -import twilightforest.entity.boss.EntityTFSnowQueen.Phase; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.ai.EntityAIBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.MathHelper; -import net.minecraft.util.Vec3; - -public class EntityAITFHoverSummon extends EntityAIBase { - - private static final float HOVER_HEIGHT = 6F; - private static final float HOVER_RADIUS = 6F; - private static final int MAX_MINIONS_AT_ONCE = 4; - - - private Class classTarget; - private EntityTFSnowQueen attacker; - - private double hoverPosX; - private double hoverPosY; - private double hoverPosZ; - private int seekTimer; - private int maxSeekTime; - - public EntityAITFHoverSummon(EntityTFSnowQueen entityTFSnowQueen, Class class1, double speed) { - this.attacker = entityTFSnowQueen; - this.classTarget = class1; - this.setMutexBits(3); - this.maxSeekTime = 80; - - } - - /** - * Returns whether the EntityAIBase should begin execution. - */ - @Override - public boolean shouldExecute() { - EntityLivingBase target = this.attacker.getAttackTarget(); - - if (target == null) { - return false; - } else if (!target.isEntityAlive()) { - return false; - } else if (this.classTarget != null && !this.classTarget.isAssignableFrom(target.getClass())) { - return false; - } else if (this.attacker.getCurrentPhase() != Phase.SUMMON) { - return false; - } else { - //System.out.println("We can hover at target!"); - - return attacker.canEntityBeSeen(target); - } - - } - - /** - * Returns whether an in-progress EntityAIBase should continue executing - */ - @Override - public boolean continueExecuting() { - EntityLivingBase target = this.attacker.getAttackTarget(); - - if (target == null || !target.isEntityAlive()) { - return false; - } else if (this.attacker.getCurrentPhase() != Phase.SUMMON){ - return false; - } else if (this.seekTimer > this.maxSeekTime){ - return false; - } else { - // check visibility - boolean isVisible = this.canEntitySee(this.attacker, hoverPosX, hoverPosY, hoverPosZ); - - if (!isVisible) { - //System.out.println("Hover spot is no longer visible"); - } - - return isVisible; - } - } - - /** - * Execute a one shot task or start executing a continuous task - */ - @Override - public void startExecuting() { - EntityLivingBase target = this.attacker.getAttackTarget(); - - if (target != null) { - // find a spot above the player - makeNewHoverSpot(target); - } - } - - /** - * Resets the task - */ - @Override - public void resetTask() { - // - } - - /** - * Updates the task - */ - @Override - public void updateTask() { - this.seekTimer++; - EntityLivingBase target = this.attacker.getAttackTarget(); - - // are we there yet? - if (this.attacker.getDistanceSq(hoverPosX, hoverPosY, hoverPosZ) <= 1.0F){ - //System.out.println("Successful hovering, making new spot"); - - this.checkAndSummon(); - - this.makeNewHoverSpot(target); - } - - // check if we are at our waypoint target - double offsetX = this.hoverPosX - this.attacker.posX; - double offsetY = this.hoverPosY - this.attacker.posY; - double offsetZ = this.hoverPosZ - this.attacker.posZ; - - double distanceDesired = offsetX * offsetX + offsetY * offsetY + offsetZ * offsetZ; - - distanceDesired = (double)MathHelper.sqrt_double(distanceDesired); - - - // add velocity - double velX = offsetX / distanceDesired * 0.05D; - double velY = offsetY / distanceDesired * 0.1D; - double velZ = offsetZ / distanceDesired * 0.05D; - - // gravity offset - velY += 0.05F; - - this.attacker.addVelocity(velX, velY, velZ); - - // look at target - if (target != null) { - this.attacker.faceEntity(target, 30.0F, 30.0F); - this.attacker.getLookHelper().setLookPositionWithEntity(target, 30.0F, 30.0F); - } - - //System.out.println("Hovering!"); - } - - - /** - * Make a new spot to hover at! - */ - private void makeNewHoverSpot(EntityLivingBase target) { - double hx = 0, hy = 0, hz = 0; - - int tries = 100; - - for (int i = 0; i < tries; i++) { - hx = target.posX + (this.attacker.getRNG().nextFloat() - this.attacker.getRNG().nextFloat()) * HOVER_RADIUS; - hy = target.posY + HOVER_HEIGHT; - hz = target.posZ + (this.attacker.getRNG().nextFloat() - this.attacker.getRNG().nextFloat()) * HOVER_RADIUS; - - if (!isPositionOccupied(hx, hy, hz) && this.canEntitySee(this.attacker, hx, hy, hz) && this.canEntitySee(target, hx, hy, hz)) { - break; - } - } - - if (tries == 99) { - System.out.println("Found no spots, giving up"); - } - - this.hoverPosX = hx; - this.hoverPosY = hy; - this.hoverPosZ = hz; - - this.seekTimer = 0; - - } - - private boolean isPositionOccupied(double hx, double hy, double hz) { - float radius = this.attacker.width / 2F; - AxisAlignedBB aabb = AxisAlignedBB.getBoundingBox(hx - radius, hy, hz - radius, hx + radius, hy + this.attacker.height, hz + radius); - - boolean isOccupied = this.attacker.worldObj.getCollidingBoundingBoxes(attacker, aabb).isEmpty(); - - return isOccupied; - } - - /** - * Can the specified entity see the specified location? - */ - protected boolean canEntitySee(Entity entity, double dx, double dy, double dz) { - return entity.worldObj.rayTraceBlocks(Vec3.createVectorHelper(entity.posX, entity.posY + (double)entity.getEyeHeight(), entity.posZ), Vec3.createVectorHelper(dx, dy, dz)) == null; - - } - - private void checkAndSummon() { - if (this.attacker.getSummonsRemaining() > 0 && this.attacker.countMyMinions() < MAX_MINIONS_AT_ONCE) { - this.attacker.summonMinionAt(this.attacker.getAttackTarget()); - - //System.out.println("Summoning minion"); - } else { - //System.out.println("Summons full"); - } - } -} diff --git a/src/main/java/twilightforest/entity/ai/EntityAITFHoverThenDrop.java b/src/main/java/twilightforest/entity/ai/EntityAITFHoverThenDrop.java deleted file mode 100644 index f6ded10a8a..0000000000 --- a/src/main/java/twilightforest/entity/ai/EntityAITFHoverThenDrop.java +++ /dev/null @@ -1,219 +0,0 @@ -package twilightforest.entity.ai; - -import twilightforest.entity.boss.EntityTFSnowQueen; -import twilightforest.entity.boss.EntityTFSnowQueen.Phase; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.ai.EntityAIBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.MathHelper; -import net.minecraft.util.Vec3; - -public class EntityAITFHoverThenDrop extends EntityAIBase { - - private static final float HOVER_HEIGHT = 6F; - private static final float HOVER_RADIUS = 0; - private Class classTarget; - private EntityTFSnowQueen attacker; - - private double hoverPosX; - private double hoverPosY; - private double hoverPosZ; - private int hoverTimer; - private int dropTimer; - private int maxHoverTime; - private int maxDropTime; - private int seekTimer; - private int maxSeekTime; - - private double dropY; - - public EntityAITFHoverThenDrop(EntityTFSnowQueen entityTFSnowQueen, Class class1, int hoverTime, int dropTime) { - this.attacker = entityTFSnowQueen; - this.classTarget = class1; - this.setMutexBits(3); - this.maxHoverTime = hoverTime; - this.maxSeekTime = hoverTime; - this.maxDropTime = dropTime; - - this.hoverTimer = 0; - - } - - /** - * Returns whether the EntityAIBase should begin execution. - */ - @Override - public boolean shouldExecute() { - EntityLivingBase target = this.attacker.getAttackTarget(); - - if (target == null) { - return false; - } else if (!target.isEntityAlive()) { - return false; - } else if (this.classTarget != null && !this.classTarget.isAssignableFrom(target.getClass())) { - return false; - } else if (this.attacker.getCurrentPhase() != Phase.DROP) { - return false; - } else { - //System.out.println("We can hover at target!"); - - return true;//attacker.canEntityBeSeen(target); - } - - } - - /** - * Returns whether an in-progress EntityAIBase should continue executing - */ - @Override - public boolean continueExecuting() { - EntityLivingBase target = this.attacker.getAttackTarget(); - - if (target == null || !target.isEntityAlive()) { - return false; - } else if (this.attacker.getCurrentPhase() != Phase.DROP) { - return false; - } else if (this.seekTimer > this.maxSeekTime) { - return false; - } else if (this.attacker.getDistanceSq(hoverPosX, hoverPosY, hoverPosZ) <= 1.0F){ - // are we there yet? - //System.out.println("Successfully in position, beginning drop mode"); - this.hoverTimer++; - return true; - }else if (this.dropTimer < this.maxDropTime) { - return true; - } else { - // max drop time! - this.attacker.incrementSuccessfulDrops(); - return false; - } - } - - /** - * Execute a one shot task or start executing a continuous task - */ - @Override - public void startExecuting() { - EntityLivingBase target = this.attacker.getAttackTarget(); - - if (target != null) { - // find a spot above the player - makeNewHoverSpot(target); - } - } - - /** - * Resets the task - */ - @Override - public void resetTask() { - this.hoverTimer = 0; - this.dropTimer = 0; - } - - /** - * Updates the task - */ - @Override - public void updateTask() { - - // if we have hit the drop spot, start dropping - if (this.hoverTimer > 0) { - this.hoverTimer++; - } else { - this.seekTimer++; - } - - if (this.hoverTimer < this.maxHoverTime) { - - // check if we are at our waypoint target - double offsetX = this.hoverPosX - this.attacker.posX; - double offsetY = this.hoverPosY - this.attacker.posY; - double offsetZ = this.hoverPosZ - this.attacker.posZ; - - double distanceDesired = offsetX * offsetX + offsetY * offsetY + offsetZ * offsetZ; - - distanceDesired = (double)MathHelper.sqrt_double(distanceDesired); - - - // add velocity - double velX = offsetX / distanceDesired * 0.05D; - double velY = offsetY / distanceDesired * 0.1D; - double velZ = offsetZ / distanceDesired * 0.05D; - - // gravity offset - velY += 0.05F; - - this.attacker.addVelocity(velX, velY, velZ); - - - - // look at target - EntityLivingBase target = this.attacker.getAttackTarget(); - if (target != null) { - this.attacker.faceEntity(target, 30.0F, 30.0F); - this.attacker.getLookHelper().setLookPositionWithEntity(target, 30.0F, 30.0F); - } - - //System.out.println("Hovering!"); - } else { - // drop! - //System.out.println("Dropping!"); - this.dropTimer++; - - if (this.attacker.posY > this.dropY) { - this.attacker.destroyBlocksInAABB(this.attacker.boundingBox.expand(1, 0.5F, 1)); - } - } - } - - - /** - * Make a new spot to hover at! - */ - private void makeNewHoverSpot(EntityLivingBase target) { - double hx = 0, hy = 0, hz = 0; - - int tries = 100; - - for (int i = 0; i < tries; i++) { - hx = target.posX + (this.attacker.getRNG().nextFloat() - this.attacker.getRNG().nextFloat()) * HOVER_RADIUS; - hy = target.posY + HOVER_HEIGHT; - hz = target.posZ + (this.attacker.getRNG().nextFloat() - this.attacker.getRNG().nextFloat()) * HOVER_RADIUS; - - if (!isPositionOccupied(hx, hy, hz) && this.canEntitySee(this.attacker, hx, hy, hz) && this.canEntitySee(target, hx, hy, hz)) { - break; - } - } - - if (tries == 99) { - System.out.println("Found no spots, giving up"); - } - - this.hoverPosX = hx; - this.hoverPosY = hy; - this.hoverPosZ = hz; - - this.dropY = target.posY - 1F; - this.seekTimer = 0; - } - - private boolean isPositionOccupied(double hx, double hy, double hz) { - float radius = this.attacker.width / 2F; - AxisAlignedBB aabb = AxisAlignedBB.getBoundingBox(hx - radius, hy, hz - radius, hx + radius, hy + this.attacker.height, hz + radius); - - boolean isOccupied = this.attacker.worldObj.getCollidingBoundingBoxes(attacker, aabb).isEmpty(); - - return isOccupied; - } - - /** - * Can the specified entity see the specified location? - */ - protected boolean canEntitySee(Entity entity, double dx, double dy, double dz) { - return entity.worldObj.rayTraceBlocks(Vec3.createVectorHelper(entity.posX, entity.posY + (double)entity.getEyeHeight(), entity.posZ), Vec3.createVectorHelper(dx, dy, dz)) == null; - - } -} diff --git a/src/main/java/twilightforest/entity/ai/EntityAITFKidnapRider.java b/src/main/java/twilightforest/entity/ai/EntityAITFKidnapRider.java deleted file mode 100644 index 8b6e5570b9..0000000000 --- a/src/main/java/twilightforest/entity/ai/EntityAITFKidnapRider.java +++ /dev/null @@ -1,68 +0,0 @@ -package twilightforest.entity.ai; - -import net.minecraft.entity.EntityCreature; -import net.minecraft.entity.ai.EntityAIBase; -import net.minecraft.entity.ai.RandomPositionGenerator; -import net.minecraft.util.Vec3; - -public class EntityAITFKidnapRider extends EntityAIBase -{ - private EntityCreature theEntityCreature; - private float speed; - private double randPosX; - private double randPosY; - private double randPosZ; - - public EntityAITFKidnapRider(EntityCreature par1EntityCreature, float par2) - { - this.theEntityCreature = par1EntityCreature; - this.speed = par2; - this.setMutexBits(1); - } - - /** - * Returns whether the EntityAIBase should begin execution. - */ - @Override - public boolean shouldExecute() - { - if (this.theEntityCreature.riddenByEntity == null || this.theEntityCreature.getRNG().nextInt(5) > 0) - { - return false; - } - else - { - Vec3 var1 = RandomPositionGenerator.findRandomTarget(this.theEntityCreature, 5, 4); - - if (var1 == null) - { - return false; - } - else - { - this.randPosX = var1.xCoord; - this.randPosY = var1.yCoord; - this.randPosZ = var1.zCoord; - return true; - } - } - } - - /** - * Execute a one shot task or start executing a continuous task - */ - @Override - public void startExecuting() - { - this.theEntityCreature.getNavigator().tryMoveToXYZ(this.randPosX, this.randPosY, this.randPosZ, this.speed); - } - - /** - * Returns whether an in-progress EntityAIBase should continue executing - */ - @Override - public boolean continueExecuting() - { - return !this.theEntityCreature.getNavigator().noPath(); - } -} diff --git a/src/main/java/twilightforest/entity/ai/EntityAITFMagicAttack.java b/src/main/java/twilightforest/entity/ai/EntityAITFMagicAttack.java deleted file mode 100644 index b26fc1fab5..0000000000 --- a/src/main/java/twilightforest/entity/ai/EntityAITFMagicAttack.java +++ /dev/null @@ -1,183 +0,0 @@ -package twilightforest.entity.ai; - -import net.minecraft.entity.EntityLiving; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.ai.EntityAIBase; -import net.minecraft.entity.projectile.EntityThrowable; -import net.minecraft.util.MathHelper; -import net.minecraft.world.World; -import twilightforest.entity.EntityTFNatureBolt; -import twilightforest.entity.EntityTFSlimeProjectile; -import twilightforest.entity.EntityTFTomeBolt; -import twilightforest.entity.boss.EntityTFLichBolt; - - -public class EntityAITFMagicAttack extends EntityAIBase -{ - public static final int SLIME = 4; - public static final int LICH = 3; - public static final int TOME = 2; - public static final int NATURE = 1; - - World worldObj; - - /** The entity the AI instance has been applied to */ - EntityLiving entityHost; - EntityLivingBase attackTarget; - - /** - * A decrementing tick that spawns a ranged attack once this value reaches 0. It is then set back to the - * maxRangedAttackTime. - */ - int rangedAttackTime = 0; - float moveSpeed; - int ticksLookingAtTarget = 0; - - /** - * The ID of this ranged attack AI. This chooses which entity is to be used as a ranged attack. - */ - int rangedAttackID; - - /** - * The maximum time the AI has to wait before peforming another ranged attack. - */ - int maxRangedAttackTime; - - float attackChance; - - public EntityAITFMagicAttack(EntityLiving par1EntityLiving, float speed, int id, int time) - { - this(par1EntityLiving, speed, id, time, 1.0F); - } - - public EntityAITFMagicAttack(EntityLiving par1EntityLiving, float speed, int id, int time, float chance) - { - this.entityHost = par1EntityLiving; - this.worldObj = par1EntityLiving.worldObj; - this.moveSpeed = speed; - this.rangedAttackID = id; - this.maxRangedAttackTime = time; - this.attackChance = chance; - this.setMutexBits(3); - } - - /** - * Returns whether the EntityAIBase should begin execution. - */ - @Override - public boolean shouldExecute() - { - EntityLivingBase var1 = this.entityHost.getAttackTarget(); - - if (var1 == null || this.entityHost.getRNG().nextFloat() > attackChance) - { - return false; - } - else - { - this.attackTarget = var1; - return true; - } - } - - /** - * Returns whether an in-progress EntityAIBase should continue executing - */ - @Override - public boolean continueExecuting() - { - return this.shouldExecute() || !this.entityHost.getNavigator().noPath(); - } - - /** - * Resets the task - */ - @Override - public void resetTask() - { - this.attackTarget = null; - } - - /** - * Updates the task - */ - @Override - public void updateTask() - { - double maxRange = 100.0D; - double targetDistance = this.entityHost.getDistanceSq(this.attackTarget.posX, this.attackTarget.boundingBox.minY, this.attackTarget.posZ); - boolean canSee = this.entityHost.getEntitySenses().canSee(this.attackTarget); - - if (canSee) - { - ++this.ticksLookingAtTarget; - } - else - { - this.ticksLookingAtTarget = 0; - } - - if (targetDistance <= maxRange && this.ticksLookingAtTarget >= 20) - { - this.entityHost.getNavigator().clearPathEntity(); - } - else - { - this.entityHost.getNavigator().tryMoveToEntityLiving(this.attackTarget, this.moveSpeed); - } - - this.entityHost.getLookHelper().setLookPositionWithEntity(this.attackTarget, 30.0F, 30.0F); - this.rangedAttackTime = Math.max(this.rangedAttackTime - 1, 0); - - if (this.rangedAttackTime <= 0) - { - if (targetDistance <= maxRange && canSee) - { - this.doRangedAttack(); - this.rangedAttackTime = this.maxRangedAttackTime; - } - } - } - - /** - * Performs a ranged attack according to the AI's rangedAttackID. - */ - protected void doRangedAttack() - { - EntityThrowable projectile = null; - - if (this.rangedAttackID == NATURE) - { - projectile = new EntityTFNatureBolt(this.worldObj, this.entityHost); - this.worldObj.playSoundAtEntity(this.entityHost, "mob.ghast.fireball", 1.0F, 1.0F / (this.entityHost.getRNG().nextFloat() * 0.4F + 0.8F)); - } - else if (this.rangedAttackID == TOME) - { - projectile = new EntityTFTomeBolt(this.worldObj, this.entityHost); - this.worldObj.playSoundAtEntity(this.entityHost, "mob.ghast.fireball", 1.0F, 1.0F / (this.entityHost.getRNG().nextFloat() * 0.4F + 0.8F)); - } - else if (this.rangedAttackID == LICH) - { - projectile = new EntityTFLichBolt(this.worldObj, this.entityHost); - this.worldObj.playSoundAtEntity(this.entityHost, "mob.ghast.fireball", 1.0F, 1.0F / (this.entityHost.getRNG().nextFloat() * 0.4F + 0.8F)); - } - else if (this.rangedAttackID == SLIME) - { - projectile = new EntityTFSlimeProjectile(this.worldObj, this.entityHost); - this.worldObj.playSoundAtEntity(this.entityHost, "mob.slime.small", 1.0F, 1.0F / (this.entityHost.getRNG().nextFloat() * 0.4F + 0.8F)); - } - - // launch the projectile - if (projectile != null) - { - double tx = this.attackTarget.posX - this.entityHost.posX; - double ty = this.attackTarget.posY + this.attackTarget.getEyeHeight() - 1.100000023841858D - projectile.posY; - double tz = this.attackTarget.posZ - this.entityHost.posZ; - float heightOffset = MathHelper.sqrt_double(tx * tx + tz * tz) * 0.2F; - projectile.setThrowableHeading(tx, ty + heightOffset, tz, 0.6F, 6.0F); // 0.6 speed, 6.0 inaccuracy - this.worldObj.spawnEntityInWorld(projectile); - } - } - - -} diff --git a/src/main/java/twilightforest/entity/ai/EntityAITFPanicOnFlockDeath.java b/src/main/java/twilightforest/entity/ai/EntityAITFPanicOnFlockDeath.java deleted file mode 100644 index 62d43fb7a5..0000000000 --- a/src/main/java/twilightforest/entity/ai/EntityAITFPanicOnFlockDeath.java +++ /dev/null @@ -1,119 +0,0 @@ -package twilightforest.entity.ai; - -import java.util.List; - -import net.minecraft.entity.EntityCreature; -import net.minecraft.entity.EntityLiving; -import net.minecraft.entity.ai.EntityAIBase; -import net.minecraft.entity.ai.RandomPositionGenerator; -import net.minecraft.util.Vec3; -import twilightforest.entity.EntityTFKobold; - -public class EntityAITFPanicOnFlockDeath extends EntityAIBase -{ - private EntityCreature flockCreature; - private float speed; - private double fleeX; - private double fleeY; - private double fleeZ; - - int fleeTimer; - - public EntityAITFPanicOnFlockDeath(EntityCreature par1EntityCreature, float par2) - { - this.flockCreature = par1EntityCreature; - this.speed = par2; - this.setMutexBits(1); - this.fleeTimer = 0; - } - - /** - * Returns whether the EntityAIBase should begin execution. - */ - @SuppressWarnings("unchecked") - @Override - public boolean shouldExecute() - { - boolean yikes = fleeTimer > 0; - - // check if any of us is dead within 4 squares - List flockList = this.flockCreature.worldObj.getEntitiesWithinAABB(this.flockCreature.getClass(), this.flockCreature.boundingBox.expand(4.0D, 2.0D, 4.0D)); - for (EntityLiving flocker : flockList) - { - if (flocker.deathTime > 0) { - yikes = true; - break; - } - } - - if (!yikes) - { - return false; - } - else - { - Vec3 var1 = RandomPositionGenerator.findRandomTarget(this.flockCreature, 5, 4); - - if (var1 == null) - { - return false; - } - else - { - this.fleeX = var1.xCoord; - this.fleeY = var1.yCoord; - this.fleeZ = var1.zCoord; - return true; - } - } - } - - /** - * Execute a one shot task or start executing a continuous task - */ - @Override - public void startExecuting() - { - this.fleeTimer = 40; - this.flockCreature.getNavigator().tryMoveToXYZ(this.fleeX, this.fleeY, this.fleeZ, this.speed); - - // panic flag for kobold animations - if (flockCreature instanceof EntityTFKobold) - { - ((EntityTFKobold)flockCreature).setPanicked(true); - } - } - - /** - * Returns whether an in-progress EntityAIBase should continue executing - */ - @Override - public boolean continueExecuting() - { - return fleeTimer > 0 && !this.flockCreature.getNavigator().noPath(); - } - - /** - * Updates the task - */ - @Override - public void updateTask() { - fleeTimer--; - } - - /** - * Resets the task - */ - @Override - public void resetTask() { - fleeTimer -= 20; - - // panic flag for kobold animations - if (flockCreature instanceof EntityTFKobold) - { - ((EntityTFKobold)flockCreature).setPanicked(false); - } - } - - -} diff --git a/src/main/java/twilightforest/entity/ai/EntityAITFRedcapBase.java b/src/main/java/twilightforest/entity/ai/EntityAITFRedcapBase.java deleted file mode 100644 index 1a892cf37d..0000000000 --- a/src/main/java/twilightforest/entity/ai/EntityAITFRedcapBase.java +++ /dev/null @@ -1,81 +0,0 @@ -package twilightforest.entity.ai; - -import java.util.List; - -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.ai.EntityAIBase; -import net.minecraft.entity.item.EntityTNTPrimed; -import net.minecraft.init.Blocks; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.ChunkCoordinates; -import net.minecraft.util.MathHelper; -import twilightforest.entity.EntityTFRedcap; - -public abstract class EntityAITFRedcapBase extends EntityAIBase -{ - - protected EntityTFRedcap entityObj; - - /** - * Fairly straightforward. Returns true in a 120 degree arc in front of the target's view. - * @return - */ - public boolean isTargetLookingAtMe(EntityLivingBase attackTarget) { - // find angle of approach - double dx = entityObj.posX - attackTarget.posX; - double dz = entityObj.posZ - attackTarget.posZ; - float angle = (float)((Math.atan2(dz, dx) * 180D) / Math.PI) - 90F; - - float difference = MathHelper.abs((attackTarget.rotationYaw - angle) % 360); - - // System.out.println("Difference in angle of approach is " + difference); - - return difference < 60 || difference > 300; - } - - /** - * Check within the specified range to see if any of the blocks nearby are TNT - * - * @param range - * @return - */ - public ChunkCoordinates findBlockTNTNearby(int range) { - int entityPosX = MathHelper.floor_double(this.entityObj.posX); - int entityPosY = MathHelper.floor_double(this.entityObj.posY); - int entityPosZ = MathHelper.floor_double(this.entityObj.posZ); - - for (int x = -range; x <= range; x++) - { - for (int y = -range; y <= range; y++) - { - for (int z = -range; z <= range; z++) - { - if (entityObj.worldObj.getBlock(entityPosX + x, entityPosY + y, entityPosZ + z) == Blocks.tnt) - { - return new ChunkCoordinates(entityPosX + x, entityPosY + y, entityPosZ + z); - } - } - } - } - - return null; - } - - /** - * Check within the specified range to see if any of the blocks nearby are TNT - * - * @param range - * @return - */ - @SuppressWarnings("unchecked") - public boolean isLitTNTNearby(int range) - { - AxisAlignedBB expandedBox = entityObj.boundingBox.expand(range, range, range); - - List nearbyTNT = entityObj.worldObj.getEntitiesWithinAABB(EntityTNTPrimed.class, expandedBox); - - return nearbyTNT.size() > 0; - } - -} diff --git a/src/main/java/twilightforest/entity/ai/EntityAITFRedcapLightTNT.java b/src/main/java/twilightforest/entity/ai/EntityAITFRedcapLightTNT.java deleted file mode 100644 index e27743b439..0000000000 --- a/src/main/java/twilightforest/entity/ai/EntityAITFRedcapLightTNT.java +++ /dev/null @@ -1,102 +0,0 @@ -package twilightforest.entity.ai; - -import net.minecraft.init.Blocks; -import net.minecraft.util.ChunkCoordinates; -import twilightforest.entity.EntityTFRedcap; - -public class EntityAITFRedcapLightTNT extends EntityAITFRedcapBase { - - - private float pursueSpeed; - private int delayTemptCounter; - private int tntX; - private int tntY; - private int tntZ; - - public EntityAITFRedcapLightTNT(EntityTFRedcap hostEntity, float speed) { - this.entityObj = hostEntity; - this.pursueSpeed = speed; - this.setMutexBits(3); - } - - /** - * Is there an unlit TNT block nearby? - */ - @Override - public boolean shouldExecute() { - - ChunkCoordinates nearbyTNT = this.findBlockTNTNearby(8); - - if (this.delayTemptCounter > 0) - { - --this.delayTemptCounter; - return false; - } - - if (nearbyTNT != null) - { - this.tntX = nearbyTNT.posX; - this.tntY = nearbyTNT.posY; - this.tntZ = nearbyTNT.posZ; - - return true; - } - - return false; - } - - - - /** - * Returns whether an in-progress EntityAIBase should continue executing - */ - @Override - public boolean continueExecuting() - { - return entityObj.worldObj.getBlock(tntX, tntY, tntZ) == Blocks.tnt; - } - - /** - * Execute a one shot task or start executing a continuous task - */ - @Override - public void startExecuting() - { - this.entityObj.setCurrentItemOrArmor(0, EntityTFRedcap.heldFlint); - } - - /** - * Resets the task - */ - @Override - public void resetTask() - { - this.entityObj.getNavigator().clearPathEntity(); - this.entityObj.setCurrentItemOrArmor(0, entityObj.getPick()); - this.delayTemptCounter = 20; - } - - /** - * Updates the task - */ - @Override - public void updateTask() - { - this.entityObj.getLookHelper().setLookPosition(tntX, tntY, tntZ, 30.0F, this.entityObj.getVerticalFaceSpeed()); - - if (this.entityObj.getDistance(tntX, tntY, tntZ) < 2.4D) - { - // light it! - entityObj.playLivingSound(); - - Blocks.tnt.onBlockDestroyedByPlayer(entityObj.worldObj, tntX, tntY, tntZ, 1); - entityObj.worldObj.setBlock(tntX, tntY, tntZ, Blocks.air, 0, 2); - this.entityObj.getNavigator().clearPathEntity(); - } - else - { - this.entityObj.getNavigator().tryMoveToXYZ(tntX, tntY, tntZ, this.pursueSpeed); - } - } - -} diff --git a/src/main/java/twilightforest/entity/ai/EntityAITFRedcapPlantTNT.java b/src/main/java/twilightforest/entity/ai/EntityAITFRedcapPlantTNT.java deleted file mode 100644 index a4fd785b10..0000000000 --- a/src/main/java/twilightforest/entity/ai/EntityAITFRedcapPlantTNT.java +++ /dev/null @@ -1,62 +0,0 @@ -package twilightforest.entity.ai; - -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.init.Blocks; -import net.minecraft.util.MathHelper; -import twilightforest.entity.EntityTFRedcap; - -public class EntityAITFRedcapPlantTNT extends EntityAITFRedcapBase { - - public EntityAITFRedcapPlantTNT(EntityTFRedcap entityTFRedcap) - { - this.entityObj = entityTFRedcap; - } - - @Override - public boolean shouldExecute() { - EntityLivingBase attackTarget = this.entityObj.getAttackTarget(); - - if (attackTarget != null && entityObj.getTntLeft() > 0 && entityObj.getDistanceSqToEntity(attackTarget) < 25 && !isTargetLookingAtMe(attackTarget) - && !isLitTNTNearby(8) && findBlockTNTNearby(5) == null) - { - //System.out.println("Redcap can plant TNT"); - return true; - } - else - { - return false; - } - } - - /** - * Execute a one shot task or start executing a continuous task - */ - @Override - public void startExecuting() - { - int entityPosX = MathHelper.floor_double(this.entityObj.posX); - int entityPosY = MathHelper.floor_double(this.entityObj.posY); - int entityPosZ = MathHelper.floor_double(this.entityObj.posZ); - - //System.out.println("Redcap trying to plant TNT"); - - this.entityObj.setCurrentItemOrArmor(0, EntityTFRedcap.heldTNT); - - if (this.entityObj.worldObj.isAirBlock(entityPosX, entityPosY, entityPosZ)) - { - entityObj.setTntLeft(entityObj.getTntLeft() - 1); - entityObj.playLivingSound(); - entityObj.worldObj.setBlock(entityPosX, entityPosY, entityPosZ, Blocks.tnt, 0, 3); - } - } - - - /** - * Resets the task - */ - @Override - public void resetTask() - { - this.entityObj.setCurrentItemOrArmor(0, entityObj.getPick()); - } -} diff --git a/src/main/java/twilightforest/entity/ai/EntityAITFRedcapShy.java b/src/main/java/twilightforest/entity/ai/EntityAITFRedcapShy.java deleted file mode 100644 index e3c59a58e0..0000000000 --- a/src/main/java/twilightforest/entity/ai/EntityAITFRedcapShy.java +++ /dev/null @@ -1,136 +0,0 @@ -package twilightforest.entity.ai; - -import java.util.Random; - -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.util.MathHelper; -import net.minecraft.util.Vec3; -import twilightforest.entity.EntityTFRedcap; - -public class EntityAITFRedcapShy extends EntityAITFRedcapBase { - - EntityLivingBase entityTarget; - float speed; - boolean lefty; - double xPosition; - double yPosition; - double zPosition; - - double minDistance = 3.0; - double maxDistance = 6.0; - - public EntityAITFRedcapShy(EntityTFRedcap entityTFRedcap, float moveSpeed) { - this.entityObj = entityTFRedcap; - this.speed = moveSpeed; - this.lefty = (new Random()).nextBoolean(); - this.setMutexBits(1); - } - - @Override - public boolean shouldExecute() { - EntityLivingBase attackTarget = this.entityObj.getAttackTarget(); - - if (attackTarget == null || !this.entityObj.isShy() || attackTarget.getDistanceToEntity(entityObj) > maxDistance - || attackTarget.getDistanceToEntity(entityObj) < minDistance || !isTargetLookingAtMe(attackTarget)) { - return false; - } - else - { - this.entityTarget = attackTarget; - Vec3 avoidPos = findCirclePoint(entityObj, entityTarget, 5, lefty ? 1 : -1); - - if (avoidPos == null) - { - return false; - } - else - { - this.xPosition = avoidPos.xCoord; - this.yPosition = avoidPos.yCoord; - this.zPosition = avoidPos.zCoord; - return true; - } - } - - } - - /** - * Execute a one shot task or start executing a continuous task - */ - @Override - public void startExecuting() - { - //System.out.println("avoid ai starting"); - this.entityObj.getNavigator().tryMoveToXYZ(this.xPosition, this.yPosition, this.zPosition, this.speed); - } - - - /** - * Returns whether an in-progress EntityAIBase should continue executing - */ - @Override - public boolean continueExecuting() - { - EntityLivingBase attackTarget = this.entityObj.getAttackTarget(); - - if (attackTarget == null) { - return false; - } - else if (!this.entityTarget.isEntityAlive()) { - return false; - } - else if (this.entityObj.getNavigator().noPath()) { - return false; - } - - boolean shouldContinue = entityObj.isShy() && attackTarget.getDistanceToEntity(entityObj) < maxDistance && attackTarget.getDistanceToEntity(entityObj) > minDistance && isTargetLookingAtMe(attackTarget); - - //System.out.println("ai evaluating should continue to " + shouldContinue); - - return shouldContinue; - } - - /** - * Updates the task - */ - @Override - public void updateTask() - { - this.entityObj.getLookHelper().setLookPositionWithEntity(this.entityTarget, 30.0F, 30.0F); - } - - - /** - * Resets the task - */ - @Override - public void resetTask() - { - this.entityTarget = null; - this.entityObj.getNavigator().clearPathEntity(); - } - - - /** - * Finds a point that allows us to circle the player clockwise. - */ - protected Vec3 findCirclePoint(Entity circler, Entity toCircle, double radius, double rotation) { - - // compute angle - double vecx = circler.posX - toCircle.posX; - double vecz = circler.posZ - toCircle.posZ; - float rangle = (float)(Math.atan2(vecz, vecx)); - - // add a little, so he circles - rangle += rotation; - - // figure out where we're headed from the target angle - double dx = MathHelper.cos(rangle) * radius; - double dz = MathHelper.sin(rangle) * radius; - - // add that to the target entity's position, and we have our destination - return Vec3.createVectorHelper(toCircle.posX + dx, circler.boundingBox.minY, toCircle.posZ + dz); - } - -} diff --git a/src/main/java/twilightforest/entity/ai/EntityAITFRiderSpearAttack.java b/src/main/java/twilightforest/entity/ai/EntityAITFRiderSpearAttack.java deleted file mode 100644 index 6bc6367c09..0000000000 --- a/src/main/java/twilightforest/entity/ai/EntityAITFRiderSpearAttack.java +++ /dev/null @@ -1,47 +0,0 @@ -package twilightforest.entity.ai; - -import net.minecraft.entity.ai.EntityAIBase; -import twilightforest.entity.EntityTFGoblinKnightLower; -import twilightforest.entity.EntityTFGoblinKnightUpper; - -public class EntityAITFRiderSpearAttack extends EntityAIBase { - - private EntityTFGoblinKnightLower entity; - - public EntityAITFRiderSpearAttack(EntityTFGoblinKnightLower par1EntityCreature) - { - this.entity = par1EntityCreature; - this.setMutexBits(7); - } - - /** - * Returns whether the EntityAIBase should begin execution. - */ - @Override - public boolean shouldExecute() { - return isRiderDoingSpearAttack(); - } - - public boolean isRiderDoingSpearAttack() - { - if (this.entity.riddenByEntity != null && this.entity.riddenByEntity instanceof EntityTFGoblinKnightUpper) - { - int timer = ((EntityTFGoblinKnightUpper)this.entity.riddenByEntity).heavySpearTimer; - return timer > 0 && timer < 50; - } - else - { - return false; - } - } - - /** - * Returns whether an in-progress EntityAIBase should continue executing - */ - @Override - public boolean continueExecuting() - { - return isRiderDoingSpearAttack(); - } - -} diff --git a/src/main/java/twilightforest/entity/ai/EntityAITFThrowRider.java b/src/main/java/twilightforest/entity/ai/EntityAITFThrowRider.java deleted file mode 100644 index a2b9cab01e..0000000000 --- a/src/main/java/twilightforest/entity/ai/EntityAITFThrowRider.java +++ /dev/null @@ -1,85 +0,0 @@ -package twilightforest.entity.ai; - -import net.minecraft.entity.EntityCreature; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.ai.EntityAIBase; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.util.Vec3; -import twilightforest.TFGenericPacketHandler; -import twilightforest.TwilightForestMod; -import cpw.mods.fml.common.network.internal.FMLProxyPacket; - -public class EntityAITFThrowRider extends EntityAIBase { - - - private EntityCreature theEntityCreature; - private int throwTimer; - - - public EntityAITFThrowRider(EntityCreature par1EntityCreature, float par2) - { - this.theEntityCreature = par1EntityCreature; - this.setMutexBits(1); - } - /** - * Returns whether the EntityAIBase should begin execution. - */ - @Override - public boolean shouldExecute() - { - if (this.theEntityCreature.riddenByEntity == null || this.theEntityCreature.getRNG().nextInt(5) > 0) - { - return false; - } - else - { - return true; - } - } - - /** - * Execute a one shot task or start executing a continuous task - */ - @Override - public void startExecuting() - { - EntityLivingBase rider = (EntityLivingBase) this.theEntityCreature.riddenByEntity; - rider.mountEntity(null); - - Vec3 throwVec = this.theEntityCreature.getLookVec(); - throwVec.xCoord *= 2F; - throwVec.yCoord *= 2F; - throwVec.zCoord *= 2F; - - // let's throw the player a fixed value in the air - throwVec.yCoord = 0.9; - - rider.addVelocity(throwVec.xCoord, throwVec.yCoord, throwVec.zCoord); - - // if we're throwing a player (probably!), send a packet with the velocity - if (rider instanceof EntityPlayerMP) { - EntityPlayerMP player = (EntityPlayerMP)rider; - - FMLProxyPacket message = TFGenericPacketHandler.makeThrowPlayerPacket((float)throwVec.xCoord, (float)throwVec.yCoord, (float)throwVec.zCoord); - TwilightForestMod.genericChannel.sendTo(message, player); - - } - - System.out.println("throw!"); - this.throwTimer = 0; - } - - /** - * Returns whether an in-progress EntityAIBase should continue executing - */ - @Override - public boolean continueExecuting() - { - if (this.theEntityCreature.riddenByEntity == null) { - this.throwTimer++; - } - - return this.throwTimer <= 40; - } - -} diff --git a/src/main/java/twilightforest/entity/ai/EntityAITFYetiRampage.java b/src/main/java/twilightforest/entity/ai/EntityAITFYetiRampage.java deleted file mode 100644 index bb55af5615..0000000000 --- a/src/main/java/twilightforest/entity/ai/EntityAITFYetiRampage.java +++ /dev/null @@ -1,114 +0,0 @@ -package twilightforest.entity.ai; - -import net.minecraft.entity.ai.EntityAIBase; -import twilightforest.entity.boss.EntityTFYetiAlpha; - -public class EntityAITFYetiRampage extends EntityAIBase { - - private EntityTFYetiAlpha yeti; - private int currentTimeOut; - private int currentDuration; - private int maxTantrumTimeOut; - private int tantrumDuration; - - public EntityAITFYetiRampage(EntityTFYetiAlpha entityTFYetiAlpha, int timeout, int duration) { - this.yeti = entityTFYetiAlpha; - this.currentTimeOut = timeout; - this.maxTantrumTimeOut = timeout; - this.tantrumDuration = duration; - - this.setMutexBits(5); - - } - - @Override - public boolean shouldExecute() { - if (this.yeti.getAttackTarget() != null && this.yeti.canRampage()) { - this.currentTimeOut--; - } - - //System.out.println("Tantrum time out = " + this.tantrumTimeOut); - - - return this.currentTimeOut <= 0; - } - - - /** - * Execute a one shot task or start executing a continuous task - */ - @Override - public void startExecuting() - { - this.currentDuration = this.tantrumDuration; - this.yeti.setRampaging(true); - } - - - /** - * Returns whether an in-progress EntityAIBase should continue executing - */ - @Override - public boolean continueExecuting() - { - return currentDuration > 0; - } - - /** - * Updates the task - */ - @Override - public void updateTask() - { - this.currentDuration--; - -// int rx = MathHelper.floor_double(this.yeti.posX); -// int ry = MathHelper.floor_double(this.yeti.posY - 1); -// int rz = MathHelper.floor_double(this.yeti.posZ); -// -// this.yeti.worldObj.playAuxSFX(2004, rx, ry, rz, 0); - - if (this.yeti.getAttackTarget() != null) { - this.yeti.getLookHelper().setLookPositionWithEntity(this.yeti.getAttackTarget(), 10.0F, (float)this.yeti.getVerticalFaceSpeed()); - } - - if (this.yeti.onGround) { - this.yeti.motionX = 0; - this.yeti.motionZ = 0; - this.yeti.motionY = 0.4F; - } - - this.yeti.destroyBlocksInAABB(this.yeti.boundingBox.expand(1, 2, 1).offset(0, 2, 0)); - - // regular falling blocks - if (this.currentDuration % 20 == 0) { - this.yeti.makeRandomBlockFall(); - } - - // blocks target players - if (this.currentDuration % 40 == 0) { - this.yeti.makeBlockAboveTargetFall(); - } - - // blocks target players - if (this.currentDuration < 40 && this.currentDuration % 10 == 0) { - this.yeti.makeNearbyBlockFall(); - } - - //System.out.println("Rampage!"); - - } - - - /** - * Resets the task - */ - @Override - public void resetTask() - { - this.currentTimeOut = this.maxTantrumTimeOut; - this.yeti.setRampaging(false); - this.yeti.setTired(true); - - } -} diff --git a/src/main/java/twilightforest/entity/ai/EntityAITFYetiTired.java b/src/main/java/twilightforest/entity/ai/EntityAITFYetiTired.java deleted file mode 100644 index 983d5c9449..0000000000 --- a/src/main/java/twilightforest/entity/ai/EntityAITFYetiTired.java +++ /dev/null @@ -1,49 +0,0 @@ -package twilightforest.entity.ai; - -import net.minecraft.entity.ai.EntityAIBase; -import twilightforest.entity.boss.EntityTFYetiAlpha; - -public class EntityAITFYetiTired extends EntityAIBase { - - private EntityTFYetiAlpha yeti; - private int tiredDuration; - private int tiredTimer; - - public EntityAITFYetiTired(EntityTFYetiAlpha entityTFYetiAlpha, int i) { - this.yeti = entityTFYetiAlpha; - this.tiredDuration = i; - this.setMutexBits(5); - } - - @Override - public boolean shouldExecute() { - return this.yeti.isTired(); - } - - @Override - public boolean continueExecuting() { - return this.tiredTimer < this.tiredDuration; - } - - @Override - public boolean isInterruptible() { - return false; - } - - @Override - public void startExecuting() { - this.tiredTimer = 0; - } - - @Override - public void resetTask() { - this.tiredTimer = 0; - this.yeti.setTired(false); - } - - @Override - public void updateTask() { - this.tiredTimer++; - } - -} diff --git a/src/main/java/twilightforest/entity/ai/EntityTFRavenLookHelper.java b/src/main/java/twilightforest/entity/ai/EntityTFRavenLookHelper.java deleted file mode 100644 index fb56d6de01..0000000000 --- a/src/main/java/twilightforest/entity/ai/EntityTFRavenLookHelper.java +++ /dev/null @@ -1,138 +0,0 @@ -package twilightforest.entity.ai; - -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLiving; -import net.minecraft.entity.ai.EntityLookHelper; -import net.minecraft.util.MathHelper; - - -public class EntityTFRavenLookHelper extends EntityLookHelper -{ - private EntityLiving entity; - private float field_46149_b; - private float field_46150_c; - private boolean field_46147_d = false; - private double posX; - private double posY; - private double posZ; - - public EntityTFRavenLookHelper(EntityLiving par1EntityLiving) - { - super(par1EntityLiving); - this.entity = par1EntityLiving; - } - - /** - * Sets position to look at using entity - */ - public void setLookPositionWithEntity(Entity par1Entity, float par2, float par3) - { - this.posX = par1Entity.posX; - - if (par1Entity instanceof EntityLiving) - { - this.posY = par1Entity.posY + (double)((EntityLiving)par1Entity).getEyeHeight(); - } - else - { - this.posY = (par1Entity.boundingBox.minY + par1Entity.boundingBox.maxY) / 2.0D; - } - - this.posZ = par1Entity.posZ; - this.field_46149_b = par2; - this.field_46150_c = par3; - this.field_46147_d = true; - } - - /** - * Sets position to look at - */ - @Override - public void setLookPosition(double par1, double par3, double par5, float par7, float par8) - { - this.posX = par1; - this.posY = par3; - this.posZ = par5; - this.field_46149_b = par7; - this.field_46150_c = par8; - this.field_46147_d = true; - } - - /** - * Updates look - */ - @Override - public void onUpdateLook() - { - this.entity.rotationPitch = 0.0F; - - if (this.field_46147_d) - { - this.field_46147_d = false; - double var1 = this.posX - this.entity.posX; - double var3 = this.posY - (this.entity.posY + this.entity.getEyeHeight()); - double var5 = this.posZ - this.entity.posZ; - double var7 = MathHelper.sqrt_double(var1 * var1 + var5 * var5); - float var9 = (float)(Math.atan2(var5, var1) * 180.0D / Math.PI) - 30.0F; - float var10 = (float)(-(Math.atan2(var3, var7) * 180.0D / Math.PI)); - this.entity.rotationPitch = this.updateRotation(this.entity.rotationPitch, var10, this.field_46150_c); - this.entity.rotationYawHead = this.updateRotation(this.entity.rotationYawHead, var9, this.field_46149_b); - } - else - { - this.entity.rotationYawHead = this.updateRotation(this.entity.rotationYawHead, this.entity.renderYawOffset, 10.0F); - } - - float var11; - - for (var11 = this.entity.rotationYawHead - this.entity.renderYawOffset; var11 < -180.0F; var11 += 360.0F) - { - ; - } - - while (var11 >= 180.0F) - { - var11 -= 360.0F; - } - - if (!this.entity.getNavigator().noPath()) - { - if (var11 < -75.0F) - { - this.entity.rotationYawHead = this.entity.renderYawOffset - 75.0F; - } - - if (var11 > 75.0F) - { - this.entity.rotationYawHead = this.entity.renderYawOffset + 75.0F; - } - } - } - - private float updateRotation(float par1, float par2, float par3) - { - float var4; - - for (var4 = par2 - par1; var4 < -180.0F; var4 += 360.0F) - { - ; - } - - while (var4 >= 180.0F) - { - var4 -= 360.0F; - } - - if (var4 > par3) - { - var4 = par3; - } - - if (var4 < -par3) - { - var4 = -par3; - } - - return par1 + var4; - } -} diff --git a/src/main/java/twilightforest/entity/ai/control/NagaMoveControl.java b/src/main/java/twilightforest/entity/ai/control/NagaMoveControl.java new file mode 100644 index 0000000000..8677e37d50 --- /dev/null +++ b/src/main/java/twilightforest/entity/ai/control/NagaMoveControl.java @@ -0,0 +1,28 @@ +package twilightforest.entity.ai.control; + +import net.minecraft.util.Mth; +import net.minecraft.world.entity.ai.control.MoveControl; +import twilightforest.entity.ai.goal.NagaMovementPattern; +import twilightforest.entity.boss.Naga; + +public class NagaMoveControl extends MoveControl { + + public NagaMoveControl(Naga naga) { + super(naga); + } + + @Override + public void tick() { + // TF - slither! + NagaMovementPattern.MovementState currentState = ((Naga) this.mob).getMovementAI().getState(); + if (currentState == NagaMovementPattern.MovementState.DAZE) { + this.mob.xxa = 0F; + } else if (currentState != NagaMovementPattern.MovementState.CHARGE && currentState != NagaMovementPattern.MovementState.INTIMIDATE) { + this.mob.xxa = Mth.cos(this.mob.tickCount * 0.3F) * 0.6F; + } else { + this.mob.xxa *= 0.8F; + } + + super.tick(); + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/entity/ai/control/NoClipMoveControl.java b/src/main/java/twilightforest/entity/ai/control/NoClipMoveControl.java new file mode 100644 index 0000000000..61e3feeb6a --- /dev/null +++ b/src/main/java/twilightforest/entity/ai/control/NoClipMoveControl.java @@ -0,0 +1,33 @@ +package twilightforest.entity.ai.control; + +import net.minecraft.util.Mth; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.ai.control.MoveControl; + +public class NoClipMoveControl extends MoveControl { + private final LivingEntity parentEntity; + private int courseChangeCooldown; + + public NoClipMoveControl(Mob entity) { + super(entity); + this.parentEntity = entity; + } + + @Override + public void tick() { + if (this.operation == MoveControl.Operation.MOVE_TO) { + double dx = this.getWantedX() - this.parentEntity.getX(); + double dy = this.getWantedY() - this.parentEntity.getY(); + double dz = this.getWantedZ() - this.parentEntity.getZ(); + double dist = dx * dx + dy * dy + dz * dz; + + if (this.courseChangeCooldown-- <= 0) { + this.courseChangeCooldown += this.parentEntity.getRandom().nextInt(5) + 2; + dist = Mth.sqrt((float) dist); + + this.parentEntity.setDeltaMovement(this.parentEntity.getDeltaMovement().add((dx / dist * 0.1D) * this.speedModifier, (dy / dist * 0.1D) * this.speedModifier, (dz / dist * 0.1D) * speedModifier)); + } + } + } +} diff --git a/src/main/java/twilightforest/entity/ai/goal/AlwaysWatchTargetGoal.java b/src/main/java/twilightforest/entity/ai/goal/AlwaysWatchTargetGoal.java new file mode 100644 index 0000000000..32a86ce7f9 --- /dev/null +++ b/src/main/java/twilightforest/entity/ai/goal/AlwaysWatchTargetGoal.java @@ -0,0 +1,31 @@ +package twilightforest.entity.ai.goal; + +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.ai.goal.Goal; + +public class AlwaysWatchTargetGoal extends Goal { + + private final Mob mob; + + public AlwaysWatchTargetGoal(Mob mob) { + this.mob = mob; + } + + @Override + public boolean requiresUpdateEveryTick() { + return true; + } + + @Override + public boolean canUse() { + return this.mob.getTarget() != null; + } + + @Override + public void tick() { + super.tick(); + if (this.mob.getTarget() != null) { + this.mob.getLookControl().setLookAt(this.mob.getTarget(), 100.0F, 100.0F); + } + } +} diff --git a/src/main/java/twilightforest/entity/ai/goal/AvoidAnyEntityGoal.java b/src/main/java/twilightforest/entity/ai/goal/AvoidAnyEntityGoal.java new file mode 100644 index 0000000000..a25b19074c --- /dev/null +++ b/src/main/java/twilightforest/entity/ai/goal/AvoidAnyEntityGoal.java @@ -0,0 +1,102 @@ +package twilightforest.entity.ai.goal; + +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntitySelector; +import net.minecraft.world.entity.PathfinderMob; +import net.minecraft.world.entity.ai.goal.Goal; +import net.minecraft.world.entity.ai.navigation.PathNavigation; +import net.minecraft.world.entity.ai.util.DefaultRandomPos; +import net.minecraft.world.level.pathfinder.Path; +import net.minecraft.world.phys.Vec3; + +import org.jetbrains.annotations.Nullable; +import java.util.EnumSet; +import java.util.List; +import java.util.function.Predicate; + +//VanillaCopy of AvoidEntityGoal, but hacked together with EntityAIAvoidEntity from 1.12 +//This is so that any Entity will be avoided, including non-living Entities +public class AvoidAnyEntityGoal extends Goal { + + private final Predicate builtTargetSelector; + protected final PathfinderMob entity; + private final double farSpeed; + private final double nearSpeed; + protected T avoidTarget; + protected final float avoidDistance; + protected Path path; + protected final PathNavigation navigation; + /** + * Class of entity this behavior seeks to avoid + */ + protected final Class classToAvoid; + protected final Predicate avoidTargetSelector; + + public AvoidAnyEntityGoal(PathfinderMob entityIn, Class classToAvoidIn, float avoidDistanceIn, double farSpeedIn, double nearSpeedIn) { + this(entityIn, classToAvoidIn, (entity) -> true, avoidDistanceIn, farSpeedIn, nearSpeedIn); + } + + public AvoidAnyEntityGoal(PathfinderMob entityIn, Class avoidClass, Predicate targetPredicate, float distance, double nearSpeedIn, double farSpeedIn) { + this.builtTargetSelector = new Predicate<>() { + @Override + public boolean test(@Nullable Entity input) { + return input != null && input.isAlive() && + AvoidAnyEntityGoal.this.entity.getSensing().hasLineOfSight(input) && + !AvoidAnyEntityGoal.this.entity.isAlliedTo(input); + } + }; + + this.entity = entityIn; + this.classToAvoid = avoidClass; + this.avoidTargetSelector = targetPredicate; + this.avoidDistance = distance; + this.farSpeed = nearSpeedIn; + this.nearSpeed = farSpeedIn; + this.navigation = entityIn.getNavigation(); + this.setFlags(EnumSet.of(Goal.Flag.MOVE)); + } + + @Override + public boolean canUse() { + List list = this.entity.getLevel().getEntitiesOfClass(this.classToAvoid, this.entity.getBoundingBox().inflate(this.avoidDistance, 3.0D, this.avoidDistance), EntitySelector.NO_CREATIVE_OR_SPECTATOR.and(this.builtTargetSelector).and(this.avoidTargetSelector)); + + if (!list.isEmpty()) { + this.avoidTarget = list.get(0); + Vec3 vec3d = DefaultRandomPos.getPosAway(this.entity, 16, 7, this.entity.position()); + + if (vec3d == null) { + return false; + } else if (this.avoidTarget.distanceToSqr(vec3d.x(), vec3d.y(), vec3d.z()) < this.avoidTarget.distanceToSqr(this.entity)) { + return false; + } else { + this.path = this.navigation.createPath(vec3d.x(), vec3d.y(), vec3d.z(), 0); + return this.path != null; + } + } + return false; + } + + @Override + public boolean canContinueToUse() { + return !this.navigation.isDone(); + } + + @Override + public void start() { + this.navigation.moveTo(this.path, this.farSpeed); + } + + @Override + public void stop() { + this.avoidTarget = null; + } + + @Override + public void tick() { + if (this.entity.distanceToSqr(this.avoidTarget) < 49.0D) { + this.entity.getNavigation().setSpeedModifier(this.nearSpeed); + } else { + this.entity.getNavigation().setSpeedModifier(this.farSpeed); + } + } +} diff --git a/src/main/java/twilightforest/entity/ai/goal/BreathAttackGoal.java b/src/main/java/twilightforest/entity/ai/goal/BreathAttackGoal.java new file mode 100644 index 0000000000..60d8e0430e --- /dev/null +++ b/src/main/java/twilightforest/entity/ai/goal/BreathAttackGoal.java @@ -0,0 +1,175 @@ +package twilightforest.entity.ai.goal; + +import net.minecraft.util.Mth; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntitySelector; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.ai.goal.Goal; +import net.minecraft.world.level.gameevent.GameEvent; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.Vec3; +import twilightforest.entity.IBreathAttacker; + +import org.jetbrains.annotations.Nullable; +import java.util.*; + +public class BreathAttackGoal extends Goal { + + private final T entityHost; + private LivingEntity attackTarget; + + private Vec3 breathPos; + + private final int maxDuration; + private final float attackChance; + private final float breathRange; + + private int durationLeft; + + public BreathAttackGoal(T living, float range, int time, float chance) { + this.entityHost = living; + this.breathRange = range; + this.maxDuration = time; + this.attackChance = chance; + this.setFlags(EnumSet.of(Flag.MOVE, Flag.LOOK, Flag.JUMP)); + } + + @Override + public boolean canUse() { + this.attackTarget = this.entityHost.getLastHurtByMob(); + + if (this.attackTarget == null || this.entityHost.distanceTo(attackTarget) > this.breathRange || !this.entityHost.getSensing().hasLineOfSight(attackTarget) || !EntitySelector.NO_CREATIVE_OR_SPECTATOR.and(EntitySelector.LIVING_ENTITY_STILL_ALIVE).test(attackTarget)) { + return false; + } else { + this.breathPos = this.attackTarget.getEyePosition(); + + return this.entityHost.getRandom().nextFloat() < this.attackChance; + } + } + + /** + * Initialize counters + */ + @Override + public void start() { + this.durationLeft = this.maxDuration; + // set breather flag + this.entityHost.setBreathing(true); + } + + /** + * Keep breathing until the target dies, or moves out of range or line of sight + */ + @Override + public boolean canContinueToUse() { + return this.durationLeft > 0 && this.entityHost.isAlive() && this.attackTarget.isAlive() + && this.entityHost.distanceTo(this.attackTarget) <= this.breathRange + && this.entityHost.getSensing().hasLineOfSight(this.attackTarget) + && EntitySelector.NO_CREATIVE_OR_SPECTATOR.and(EntitySelector.LIVING_ENTITY_STILL_ALIVE).test(attackTarget); + } + + /** + * Update timers, deal damage + */ + @Override + public void tick() { + this.durationLeft--; + + // why do we need both of these? + this.entityHost.getLookControl().setLookAt(this.breathPos); + this.faceVec(this.breathPos, 100.0F, 100.0F); + + if ((this.maxDuration - this.durationLeft) > 5) { + // anyhoo, deal damage + Entity target = this.getHeadLookTarget(); + if (target != null) { + this.entityHost.doBreathAttack(target); + this.entityHost.gameEvent(GameEvent.PROJECTILE_SHOOT); + } + } + } + + @Override + public void stop() { + this.durationLeft = 0; + this.attackTarget = null; + // set breather flag + this.entityHost.setBreathing(false); + } + + /** + * What, if anything, is the head currently looking at? + */ + @Nullable + private Entity getHeadLookTarget() { + Entity pointedEntity = null; + double range = 30.0D; + double offset = 3.0D; + Vec3 srcVec = new Vec3(this.entityHost.getX(), this.entityHost.getY() + 0.25, this.entityHost.getZ()); + Vec3 lookVec = this.entityHost.getViewVector(1.0F); + Vec3 destVec = srcVec.add(lookVec.x() * range, lookVec.y() * range, lookVec.z() * range); + float var9 = 0.5F; + List possibleList = this.entityHost.getLevel().getEntities(this.entityHost, this.entityHost.getBoundingBox().move(lookVec.x() * offset, lookVec.y() * offset, lookVec.z() * offset).inflate(var9, var9, var9)); + double hitDist = 0; + + if (this.entityHost.isMultipartEntity()) + possibleList.removeAll(Arrays.asList(Objects.requireNonNull(this.entityHost.getParts()))); + + for (Entity possibleEntity : possibleList) { + if (possibleEntity.isPickable() && possibleEntity != this.entityHost && EntitySelector.NO_CREATIVE_OR_SPECTATOR.and(EntitySelector.LIVING_ENTITY_STILL_ALIVE).test(possibleEntity)) { + float borderSize = possibleEntity.getPickRadius(); + AABB collisionBB = possibleEntity.getBoundingBox().inflate(borderSize, borderSize, borderSize); + Optional interceptPos = collisionBB.clip(srcVec, destVec); + + if (collisionBB.contains(srcVec)) { + if (0.0D < hitDist || hitDist == 0.0D) { + pointedEntity = possibleEntity; + hitDist = 0.0D; + } + } else if (interceptPos.isPresent()) { + double possibleDist = srcVec.distanceTo(interceptPos.get()); + + if (possibleDist < hitDist || hitDist == 0.0D) { + pointedEntity = possibleEntity; + hitDist = possibleDist; + } + } + } + } + return pointedEntity; + } + + /** + * Face the head towards a specific Vector + */ + public void faceVec(Vec3 pos, float yawConstraint, float pitchConstraint) { + double xOffset = pos.x() - this.entityHost.getX(); + double zOffset = pos.z() - this.entityHost.getZ(); + double yOffset = (this.entityHost.getY() + 0.25) - pos.y(); + + double distance = Mth.sqrt((float) (xOffset * xOffset + zOffset * zOffset)); + float xyAngle = (float) ((Math.atan2(zOffset, xOffset) * 180D) / Math.PI) - 90F; + float zdAngle = (float) (-((Math.atan2(yOffset, distance) * 180D) / Math.PI)); + this.entityHost.setXRot(-updateRotation(this.entityHost.getXRot(), zdAngle, pitchConstraint)); + this.entityHost.setYRot(updateRotation(this.entityHost.getYRot(), xyAngle, yawConstraint)); + + } + + /** + * Arguments: current rotation, intended rotation, max increment. + */ + private float updateRotation(float current, float target, float maxDelta) { + float delta = Mth.wrapDegrees(target - current); + + if (delta > maxDelta) { + delta = maxDelta; + } + + if (delta < -maxDelta) { + delta = -maxDelta; + } + + return current + delta; + } +} diff --git a/src/main/java/twilightforest/entity/ai/goal/ChargeAttackGoal.java b/src/main/java/twilightforest/entity/ai/goal/ChargeAttackGoal.java new file mode 100644 index 0000000000..dc01e4dc49 --- /dev/null +++ b/src/main/java/twilightforest/entity/ai/goal/ChargeAttackGoal.java @@ -0,0 +1,166 @@ +package twilightforest.entity.ai.goal; + +import net.minecraft.core.BlockPos; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.PathfinderMob; +import net.minecraft.world.entity.ai.goal.Goal; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.event.ForgeEventFactory; +import twilightforest.entity.ITFCharger; +import twilightforest.entity.boss.Minoshroom; +import twilightforest.util.EntityUtil; + +import java.util.EnumSet; + +public class ChargeAttackGoal extends Goal { + + private static final double MIN_RANGE_SQ = 16.0D; + private static final double MAX_RANGE_SQ = 64.0D; + private static final int FREQ = 10; + + private final PathfinderMob charger; + private LivingEntity chargeTarget; + private Vec3 chargePos; + + protected final float speed; + private final boolean canBreak; + private int windup; + private boolean hasAttacked; + + public ChargeAttackGoal(PathfinderMob mob, float f, boolean canBreak) { + this.charger = mob; + this.speed = f; + this.canBreak = canBreak; + this.windup = 0; + this.hasAttacked = false; + this.setFlags(EnumSet.of(Flag.MOVE, Flag.LOOK)); + } + + @Override + public boolean canUse() { + this.chargeTarget = this.charger.getTarget(); + + if (this.chargeTarget == null) { + return false; + } else { + double distance = this.charger.distanceToSqr(this.chargeTarget); + //minoshroom will charge when the target is further away than the normal minotaur + double minoshroomBonus = this.charger instanceof Minoshroom ? 9.0D : 0.0D; + if (distance < MIN_RANGE_SQ + minoshroomBonus || distance > MAX_RANGE_SQ + minoshroomBonus) { + return false; + } else if (!this.charger.isOnGround()) { + return false; + } else { + Vec3 chargePos = findChargePoint(this.charger, this.chargeTarget); + boolean canSeeTargetFromDest = this.charger.getSensing().hasLineOfSight(this.chargeTarget); + if (!canSeeTargetFromDest) { + return false; + } else { + this.chargePos = chargePos; + + return this.charger.getRandom().nextInt(FREQ) == 0; + } + } + } + } + + @Override + public void start() { + this.windup = 15 + this.charger.getRandom().nextInt(30); + this.charger.setSprinting(true); + } + + @Override + public boolean canContinueToUse() { + return this.windup > 0 || !this.charger.getNavigation().isDone(); + } + + @Override + public void tick() { + // look where we're going + this.charger.getLookControl().setLookAt(this.chargePos.x(), this.chargePos.y() - 1, this.chargePos.z(), 10.0F, this.charger.getMaxHeadXRot()); + + if (this.windup > 0) { + if (--this.windup == 0) { + // actually charge! + + this.charger.getNavigation().moveTo(this.chargePos.x(), this.chargePos.y(), this.chargePos.z(), this.speed); + } else { + this.charger.walkAnimation.setSpeed(this.charger.walkAnimation.speed() + 0.8F); + + if (this.charger instanceof ITFCharger chargeMob) { + chargeMob.setCharging(true); + } + } + } else if (this.canBreak) { + if (!this.charger.getLevel().isClientSide() && ForgeEventFactory.getMobGriefingEvent(this.charger.getLevel(), this.charger)) { + + AABB bb = this.charger.getBoundingBox(); + int minx = Mth.floor(bb.minX - 0.75D); + int miny = Mth.floor(bb.minY + 0.0D); + int minz = Mth.floor(bb.minZ - 0.75D); + int maxx = Mth.floor(bb.maxX + 0.75D); + int maxy = Mth.floor(bb.maxY + 0.15D); + int maxz = Mth.floor(bb.maxZ + 0.75D); + + BlockPos min = new BlockPos(minx, miny, minz); + BlockPos max = new BlockPos(maxx, maxy, maxz); + + if (this.charger.getLevel().hasChunksAt(min, max)) { + for (BlockPos pos : BlockPos.betweenClosed(min, max)) { + if (EntityUtil.canDestroyBlock(this.charger.getLevel(), pos, this.charger) && this.charger.getLevel().getBlockEntity(pos) == null) { + this.charger.getLevel().destroyBlock(pos, true); + } + } + } + } + } + + // attack the target when we get in range + double rangeSq = this.charger instanceof Minoshroom ? 5.0D : this.charger.getBbWidth() * 2.0F * this.charger.getBbWidth() * 2.0F + this.chargeTarget.getBbWidth(); + + if (this.charger.distanceToSqr(this.chargeTarget.getX(), this.chargeTarget.getBoundingBox().minY, this.chargeTarget.getZ()) <= rangeSq) { + if (!this.hasAttacked) { + this.hasAttacked = true; + this.charger.doHurtTarget(this.chargeTarget); + } + } + } + + @Override + public void stop() { + this.windup = 0; + this.chargeTarget = null; + this.hasAttacked = false; + this.charger.setSprinting(false); + + if (this.charger instanceof ITFCharger chargeMob) { + chargeMob.setCharging(false); + } + } + + + /** + * Finds a point that is overshoot blocks "beyond" the target from our position. + */ + protected Vec3 findChargePoint(Entity attacker, Entity target) { + + // compute angle + double vecx = target.getX() - attacker.getX(); + double vecz = target.getZ() - attacker.getZ(); + float rangle = (float) (Math.atan2(vecz, vecx)); + + double distance = Mth.sqrt((float) (vecx * vecx + vecz * vecz)); + double overshoot = 2.1D; + + // figure out where we're headed from the target angle + double dx = Mth.cos(rangle) * (distance + overshoot); + double dz = Mth.sin(rangle) * (distance + overshoot); + + // add that to the target entity's position, and we have our destination + return new Vec3(attacker.getX() + dx, target.getY(), attacker.getZ() + dz); + } +} diff --git a/src/main/java/twilightforest/entity/ai/goal/CubeCenterOnSymbolGoal.java b/src/main/java/twilightforest/entity/ai/goal/CubeCenterOnSymbolGoal.java new file mode 100644 index 0000000000..27ce8053fa --- /dev/null +++ b/src/main/java/twilightforest/entity/ai/goal/CubeCenterOnSymbolGoal.java @@ -0,0 +1,69 @@ +package twilightforest.entity.ai.goal; + +import net.minecraft.world.entity.ai.goal.Goal; +import twilightforest.entity.RovingCube; + +import java.util.EnumSet; + +/** + * This is a task that runs when we are near a symbol and have stopped pathfinding, but are not centered on the symbol. + *

+ * The goal of this task is to center on a symbol. + * + * @author benma_000 + */ +public class CubeCenterOnSymbolGoal extends Goal { + private final RovingCube myCube; + private final double speed; + + private double xPosition; + private double yPosition; + private double zPosition; + + public CubeCenterOnSymbolGoal(RovingCube cube, double d) { + this.myCube = cube; + this.xPosition = this.myCube.symbolX; + this.yPosition = this.myCube.symbolY; + this.zPosition = this.myCube.symbolZ; + this.speed = d; + this.setFlags(EnumSet.of(Flag.MOVE)); + } + + @Override + public boolean canUse() { + this.xPosition = this.myCube.symbolX; + this.yPosition = this.myCube.symbolY; + this.zPosition = this.myCube.symbolZ; + + + if (!this.myCube.getNavigation().isDone()) { + return false; + } else { + return this.isCloseToSymbol(); + } + } + + @Override + public boolean canContinueToUse() { + // inch towards it + this.myCube.getMoveControl().setWantedPosition(this.xPosition + 0.5F, this.yPosition, this.zPosition + 0.5F, this.speed); + return this.distanceFromSymbol() > 0.1F && this.isCourseTraversable(); + } + + private boolean isCourseTraversable() { + return this.distanceFromSymbol() < 100; + } + + private boolean isCloseToSymbol() { + double dist = this.distanceFromSymbol(); + return dist > 0.25F && dist < 10F; + } + + private double distanceFromSymbol() { + double dx = this.xPosition - this.myCube.getX() + 0.5F; + double dy = this.yPosition - this.myCube.getY(); + double dz = this.zPosition - this.myCube.getZ() + 0.5F; + return Math.sqrt(dx * dx + dy * dy + dz * dz); + } + +} diff --git a/src/main/java/twilightforest/entity/ai/goal/CubeMoveToRedstoneSymbolsGoal.java b/src/main/java/twilightforest/entity/ai/goal/CubeMoveToRedstoneSymbolsGoal.java new file mode 100644 index 0000000000..ff6b8f80f9 --- /dev/null +++ b/src/main/java/twilightforest/entity/ai/goal/CubeMoveToRedstoneSymbolsGoal.java @@ -0,0 +1,90 @@ +package twilightforest.entity.ai.goal; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.entity.ai.goal.Goal; +import net.minecraft.world.level.block.Blocks; +import twilightforest.entity.RovingCube; + +import org.jetbrains.annotations.Nullable; +import java.util.EnumSet; + +public class CubeMoveToRedstoneSymbolsGoal extends Goal { + + private final RovingCube myCube; + private final double speed; + private BlockPos targetPos; + + public CubeMoveToRedstoneSymbolsGoal(RovingCube cube, double speed) { + this.myCube = cube; + this.speed = speed; + this.setFlags(EnumSet.of(Flag.MOVE)); + } + + @Override + public boolean canUse() { + if (this.myCube.getRandom().nextInt(20) != 0) { + return false; + } else { + BlockPos pos = this.searchForRedstoneSymbol(this.myCube); + + if (pos == null) { + return false; + } else { + this.targetPos = pos; + return true; + } + } + } + + @Override + public boolean canContinueToUse() { + return !this.myCube.getNavigation().isDone(); + } + + @Override + public void start() { + this.myCube.getNavigation().moveTo(this.targetPos.getX(), this.targetPos.getY(), this.targetPos.getZ(), this.speed); + } + + /** + * Search the area for a redstone circle (8 redstone dust around a blank square) + */ + @Nullable + private BlockPos searchForRedstoneSymbol(RovingCube cube) { + BlockPos curPos = new BlockPos(cube.blockPosition()); + + for (int x = -16; x < 16; x++) { + for (int z = -16; z < 16; z++) { + for (int y = -5; y < 5; y++) { + if (this.isRedstoneSymbol(curPos.offset(x, y, z))) { + this.myCube.hasFoundSymbol = true; + this.myCube.symbolX = curPos.getX() + x; + this.myCube.symbolY = curPos.getY() + y; + this.myCube.symbolZ = curPos.getZ() + z; + + return curPos.offset(x, y, z); + } + } + } + } + + return null; + } + + private boolean isRedstoneSymbol(BlockPos pos) { + if (!this.myCube.getLevel().hasChunkAt(pos) || !this.myCube.getLevel().isEmptyBlock(pos)) { + return false; + } else { + // we found an air block, is it surrounded by redstone? + for (Direction e : Direction.values()) { + if (this.myCube.getLevel().getBlockState(pos.relative(e)).getBlock() != Blocks.REDSTONE_WIRE) { + return false; + } + } + + return true; + } + } + +} diff --git a/src/main/java/twilightforest/entity/ai/goal/FlockToSameKindGoal.java b/src/main/java/twilightforest/entity/ai/goal/FlockToSameKindGoal.java new file mode 100644 index 0000000000..33dcd4fe2a --- /dev/null +++ b/src/main/java/twilightforest/entity/ai/goal/FlockToSameKindGoal.java @@ -0,0 +1,113 @@ +package twilightforest.entity.ai.goal; + +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.ai.goal.Goal; +import net.minecraft.world.phys.Vec3; +import twilightforest.data.tags.ItemTagGenerator; +import twilightforest.entity.monster.Kobold; + +import java.util.List; + +public class FlockToSameKindGoal extends Goal { + private static final double MAX_DIST = 256.0D; + private static final double MIN_DIST = 25.0D; + /** + * The child that is following its parent. + */ + private final Mob flockCreature; + private Vec3 flockPosition; + final double speed; + private int moveTimer; + + public FlockToSameKindGoal(Mob living, double speed) { + this.flockCreature = living; + this.speed = speed; + } + + /** + * Returns whether the EntityAIBase should begin execution. + */ + @Override + public boolean canUse() { + + if (this.flockCreature instanceof Kobold kobold && kobold.getItemBySlot(EquipmentSlot.MAINHAND).is(ItemTagGenerator.KOBOLD_PACIFICATION_BREADS)) { + return false; + } + + if (this.flockCreature.getRandom().nextInt(40) != 0) { + return false; + } + + List flockList = this.flockCreature.getLevel().getEntitiesOfClass(this.flockCreature.getClass(), this.flockCreature.getBoundingBox().inflate(16.0D, 4.0D, 16.0D)); + + if (flockList.size() > 5) { + return false; + } + + int flocknum = 0; + double flockX = 0; + double flockY = 0; + double flockZ = 0; + + for (LivingEntity flocker : flockList) { + flocknum++; + flockX += flocker.getX(); + flockY += flocker.getY(); + flockZ += flocker.getZ(); + } + + flockX /= flocknum; + flockY /= flocknum; + flockZ /= flocknum; + + + if (this.flockCreature.distanceToSqr(flockX, flockY, flockZ) < MIN_DIST) { + return false; + } else { + this.flockPosition = new Vec3(flockX, flockY, flockZ); + return true; + } + } + + /** + * Returns whether an in-progress EntityAIBase should continue executing + */ + @Override + public boolean canContinueToUse() { + if (this.flockPosition == null) { + return false; + } else { + double distance = this.flockCreature.distanceToSqr(this.flockPosition.x(), this.flockPosition.y(), this.flockPosition.z()); + return distance >= MIN_DIST && distance <= MAX_DIST; + } + } + + /** + * Execute a one shot task or start executing a continuous task + */ + @Override + public void start() { + this.moveTimer = 0; + } + + /** + * Resets the task + */ + @Override + public void stop() { + this.flockPosition = null; + } + + /** + * Updates the task + */ + @Override + public void tick() { + if (--this.moveTimer <= 0) { + this.moveTimer = 10; + this.flockCreature.getNavigation().moveTo(this.flockPosition.x(), this.flockPosition.y(), this.flockPosition.z(), this.speed); + } + } +} diff --git a/src/main/java/twilightforest/entity/ai/goal/GhastguardAttackGoal.java b/src/main/java/twilightforest/entity/ai/goal/GhastguardAttackGoal.java new file mode 100644 index 0000000000..910793f472 --- /dev/null +++ b/src/main/java/twilightforest/entity/ai/goal/GhastguardAttackGoal.java @@ -0,0 +1,63 @@ +package twilightforest.entity.ai.goal; + +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.ai.goal.Goal; +import twilightforest.entity.monster.CarminiteGhastguard; + +// [VanillaCopy] EntityGhast.AIFireballAttack, edits noted +public class GhastguardAttackGoal extends Goal { + private final CarminiteGhastguard ghast; + public int attackTimer; + public int prevAttackTimer; // TF - add for renderer + + public GhastguardAttackGoal(CarminiteGhastguard ghast) { + this.ghast = ghast; + } + + @Override + public boolean canUse() { + return this.ghast.getTarget() != null && ghast.shouldAttack(ghast.getTarget()); + } + + @Override + public void start() { + this.attackTimer = this.prevAttackTimer = 0; + } + + @Override + public void stop() { + this.ghast.setCharging(false); + } + + @Override + public void tick() { + LivingEntity target = this.ghast.getTarget(); + + if (target.distanceToSqr(this.ghast) < 4096.0D && this.ghast.getSensing().hasLineOfSight(target)) { + this.prevAttackTimer = attackTimer; + ++this.attackTimer; + + // TF face our target at all times + this.ghast.getLookControl().setLookAt(target, 10F, this.ghast.getMaxHeadXRot()); + + if (this.attackTimer == 10) { + ghast.playSound(ghast.getWarnSound(), 10.0F, ghast.getVoicePitch()); + } + + if (this.attackTimer == 20) { + if (this.ghast.shouldAttack(target)) { + // TF - call custom method + this.ghast.playSound(ghast.getFireSound(), 10.0F, this.ghast.getVoicePitch()); + this.ghast.spitFireball(); + this.prevAttackTimer = attackTimer; + } + this.attackTimer = -40; + } + } else if (this.attackTimer > 0) { + this.prevAttackTimer = attackTimer; + --this.attackTimer; + } + + this.ghast.setCharging(this.attackTimer > 10); + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/entity/ai/goal/GhastguardHomedFlightGoal.java b/src/main/java/twilightforest/entity/ai/goal/GhastguardHomedFlightGoal.java new file mode 100644 index 0000000000..2c468405c5 --- /dev/null +++ b/src/main/java/twilightforest/entity/ai/goal/GhastguardHomedFlightGoal.java @@ -0,0 +1,64 @@ +package twilightforest.entity.ai.goal; + +import net.minecraft.util.RandomSource; +import net.minecraft.world.entity.ai.control.MoveControl; +import net.minecraft.world.entity.ai.goal.Goal; +import net.minecraft.world.phys.Vec3; +import twilightforest.entity.monster.CarminiteGhastguard; + +import java.util.EnumSet; + +// [VanillaCopy]-ish mixture of Ghast.RandomFloatAroundGoal and MoveTowardsRestrictionGoal +public class GhastguardHomedFlightGoal extends Goal { + private final CarminiteGhastguard parentEntity; + + public GhastguardHomedFlightGoal(CarminiteGhastguard ghast) { + this.parentEntity = ghast; + this.setFlags(EnumSet.of(Flag.MOVE)); + } + + // From RandomFloatAroundGoal, but with extra condition from MoveTowardsRestrictionGoal + @Override + public boolean canUse() { + MoveControl control = this.parentEntity.getMoveControl(); + + if (!control.hasWanted()) { + return !this.parentEntity.isWithinRestriction(); + } else { + double d0 = control.getWantedX() - this.parentEntity.getX(); + double d1 = control.getWantedY() - this.parentEntity.getY(); + double d2 = control.getWantedZ() - this.parentEntity.getZ(); + double d3 = d0 * d0 + d1 * d1 + d2 * d2; + return (d3 < 1.0D || d3 > 3600.0D) + && !this.parentEntity.isWithinRestriction(); + } + } + + // From RandomFloatAroundGoal + @Override + public boolean canContinueToUse() { + return false; + } + + // From MoveTowardsRestrictionGoal but use move helper instead of PathNavigate + @Override + public void start() { + RandomSource random = this.parentEntity.getRandom(); + double d0 = this.parentEntity.getX() + (random.nextFloat() * 2.0F - 1.0F) * parentEntity.getWanderFactor(); + double d1 = this.parentEntity.getY() + (random.nextFloat() * 2.0F - 1.0F) * parentEntity.getWanderFactor(); + double d2 = this.parentEntity.getZ() + (random.nextFloat() * 2.0F - 1.0F) * parentEntity.getWanderFactor(); + this.parentEntity.getMoveControl().setWantedPosition(d0, d1, d2, 1.0D); + + if (this.parentEntity.distanceToSqr(Vec3.atLowerCornerOf(this.parentEntity.getRestrictCenter())) > 256.0D) { + Vec3 vecToHome = Vec3.atLowerCornerOf(this.parentEntity.getRestrictCenter()).subtract(this.parentEntity.position()).normalize(); + + double targetX = this.parentEntity.getX() + vecToHome.x() * parentEntity.getWanderFactor() + (this.parentEntity.getRandom().nextFloat() * 2.0F - 1.0F) * parentEntity.getWanderFactor(); + double targetY = this.parentEntity.getY() + vecToHome.y() * parentEntity.getWanderFactor() + (this.parentEntity.getRandom().nextFloat() * 2.0F - 1.0F) * parentEntity.getWanderFactor(); + double targetZ = this.parentEntity.getZ() + vecToHome.z() * parentEntity.getWanderFactor() + (this.parentEntity.getRandom().nextFloat() * 2.0F - 1.0F) * parentEntity.getWanderFactor(); + + this.parentEntity.getMoveControl().setWantedPosition(targetX, targetY, targetZ, 1.0D); + } else { + this.parentEntity.getMoveControl().setWantedPosition(this.parentEntity.getRestrictCenter().getX() + 0.5D, this.parentEntity.getRestrictCenter().getY(), this.parentEntity.getRestrictCenter().getZ() + 0.5D, 1.0D); + } + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/entity/ai/goal/GhastguardRandomFlyGoal.java b/src/main/java/twilightforest/entity/ai/goal/GhastguardRandomFlyGoal.java new file mode 100644 index 0000000000..33e1a4e3c9 --- /dev/null +++ b/src/main/java/twilightforest/entity/ai/goal/GhastguardRandomFlyGoal.java @@ -0,0 +1,46 @@ +package twilightforest.entity.ai.goal; + +import net.minecraft.util.RandomSource; +import net.minecraft.world.entity.ai.control.MoveControl; +import net.minecraft.world.entity.ai.goal.Goal; +import twilightforest.entity.monster.CarminiteGhastguard; + +import java.util.EnumSet; + +// [VanillaCopy] from Ghast but we use wanderFactor instead, we also stop moving when we have a target +public class GhastguardRandomFlyGoal extends Goal { + private final CarminiteGhastguard parentEntity; + + public GhastguardRandomFlyGoal(CarminiteGhastguard ghast) { + this.parentEntity = ghast; + this.setFlags(EnumSet.of(Flag.MOVE)); + } + + @Override + public boolean canUse() { + MoveControl entitymovehelper = this.parentEntity.getMoveControl(); + if (!entitymovehelper.hasWanted()) { + return parentEntity.getTarget() == null; + } else { + double d0 = entitymovehelper.getWantedX() - this.parentEntity.getX(); + double d1 = entitymovehelper.getWantedY() - this.parentEntity.getY(); + double d2 = entitymovehelper.getWantedZ() - this.parentEntity.getZ(); + double d3 = d0 * d0 + d1 * d1 + d2 * d2; + return parentEntity.getTarget() == null && (d3 < 1.0D || d3 > 3600.0D); + } + } + + @Override + public boolean canContinueToUse() { + return false; + } + + @Override + public void start() { + RandomSource random = this.parentEntity.getRandom(); + double d0 = this.parentEntity.getX() + (random.nextFloat() * 2.0F - 1.0F) * parentEntity.getWanderFactor(); + double d1 = this.parentEntity.getY() + (random.nextFloat() * 2.0F - 1.0F) * parentEntity.getWanderFactor(); + double d2 = this.parentEntity.getZ() + (random.nextFloat() * 2.0F - 1.0F) * parentEntity.getWanderFactor(); + this.parentEntity.getMoveControl().setWantedPosition(d0, d1, d2, 1.0D); + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/entity/ai/goal/GroundAttackGoal.java b/src/main/java/twilightforest/entity/ai/goal/GroundAttackGoal.java new file mode 100644 index 0000000000..a8001fbf02 --- /dev/null +++ b/src/main/java/twilightforest/entity/ai/goal/GroundAttackGoal.java @@ -0,0 +1,96 @@ +package twilightforest.entity.ai.goal; + +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.control.MoveControl; +import net.minecraft.world.entity.ai.goal.Goal; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.gameevent.GameEvent; +import net.minecraft.world.phys.AABB; +import twilightforest.entity.boss.Minoshroom; +import twilightforest.init.TFDamageTypes; +import twilightforest.init.TFSounds; + +import java.util.EnumSet; +import java.util.List; + +public class GroundAttackGoal extends Goal { + private static final double MIN_RANGE_SQ = 2.0D; + private static final double MAX_RANGE_SQ = 9.0D; + private static final int FREQ = 24; + + private final Minoshroom attacker; + private LivingEntity attackTarget; + private int cooldown; + private int attackTick; + + public GroundAttackGoal(Minoshroom minoshroom) { + this.attacker = minoshroom; + this.setFlags(EnumSet.of(Flag.MOVE, Flag.LOOK)); + } + + @Override + public boolean canUse() { + this.attackTarget = this.attacker.getTarget(); + + if (this.cooldown-- > 0 || this.attackTarget == null) { + return false; + } else { + double distance = this.attacker.distanceToSqr(this.attackTarget); + if (distance < MIN_RANGE_SQ || distance > MAX_RANGE_SQ) { + return false; + } else if (!this.attacker.isOnGround()) { + return false; + } else { + if (this.attacker.hasLineOfSight(attackTarget)) { + return this.attacker.getRandom().nextInt(FREQ) == 0; + } else { + return this.attacker.getRandom().nextInt(FREQ - 4) == 0; + } + } + } + } + + @Override + public void start() { + this.cooldown = (20 * 10) + this.attacker.getRandom().nextInt(20 * 10); // 10 - 20 second cooldown + this.attackTick = 30 + this.attacker.getRandom().nextInt(30); + this.attacker.setMaxCharge(this.attackTick); + this.attacker.setGroundAttackCharge(true); + } + + @Override + public boolean canContinueToUse() { + return this.attackTick >= 0; + } + + @Override + public void stop() { + this.attackTick = 0; + this.attackTarget = null; + } + + @Override + public void tick() { + // look where we're going + this.attacker.getLookControl().setLookAt(this.attackTarget, 30.0F, 30.0F); + this.attacker.getMoveControl().operation = MoveControl.Operation.WAIT; + + if (this.attackTick-- <= 0) { + this.attacker.setGroundAttackCharge(false); + this.attacker.playSound(TFSounds.MINOSHROOM_SLAM.get(), 2.0F, 1.0F + this.attacker.getRandom().nextFloat() * 0.1F); + this.attacker.gameEvent(GameEvent.HIT_GROUND); + + AABB selection = new AABB(this.attacker.blockPosition().getX() - 7.5F, this.attacker.blockPosition().getY(), this.attacker.blockPosition().getZ() - 7.5F, this.attacker.blockPosition().getX() + 7.5F, this.attacker.blockPosition().getY() + 3.0F, this.attacker.blockPosition().getZ() + 7.5F); + + List hit = attacker.getLevel().getEntitiesOfClass(Entity.class, selection, entity -> entity instanceof Player); + for (Entity entity : hit) { + if (entity.isOnGround()) { + entity.push(0.0D, 0.23D, 0.0D); + entity.hurt(TFDamageTypes.getEntityDamageSource(this.attacker.getLevel(), TFDamageTypes.SLAM, this.attacker), (float) (this.attacker.getAttributeValue(Attributes.ATTACK_DAMAGE) * 0.5F)); + } + } + } + } +} diff --git a/src/main/java/twilightforest/entity/ai/goal/HeavySpearAttackGoal.java b/src/main/java/twilightforest/entity/ai/goal/HeavySpearAttackGoal.java new file mode 100644 index 0000000000..c7d4aa67e7 --- /dev/null +++ b/src/main/java/twilightforest/entity/ai/goal/HeavySpearAttackGoal.java @@ -0,0 +1,29 @@ +package twilightforest.entity.ai.goal; + +import net.minecraft.world.entity.EntitySelector; +import net.minecraft.world.entity.ai.goal.Goal; +import twilightforest.entity.monster.UpperGoblinKnight; + +import java.util.EnumSet; + +public class HeavySpearAttackGoal extends Goal { + + private final UpperGoblinKnight entity; + + public HeavySpearAttackGoal(UpperGoblinKnight upperKnight) { + this.entity = upperKnight; + this.setFlags(EnumSet.of(Flag.MOVE, Flag.LOOK)); + } + + @Override + public void tick() { + if (this.entity.heavySpearTimer == 25) { + this.entity.landHeavySpearAttack(); + } + } + + @Override + public boolean canUse() { + return this.entity.heavySpearTimer > 0 && this.entity.heavySpearTimer < UpperGoblinKnight.HEAVY_SPEAR_TIMER_START && this.entity.getTarget() != null && EntitySelector.NO_CREATIVE_OR_SPECTATOR.and(EntitySelector.LIVING_ENTITY_STILL_ALIVE).test(this.entity.getTarget()); + } +} diff --git a/src/main/java/twilightforest/entity/ai/goal/HoverBaseGoal.java b/src/main/java/twilightforest/entity/ai/goal/HoverBaseGoal.java new file mode 100644 index 0000000000..602211a533 --- /dev/null +++ b/src/main/java/twilightforest/entity/ai/goal/HoverBaseGoal.java @@ -0,0 +1,69 @@ +package twilightforest.entity.ai.goal; + +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.ai.goal.Goal; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.shapes.Shapes; +import twilightforest.TwilightForestMod; + +public abstract class HoverBaseGoal extends Goal { + + protected final T attacker; + + protected final float hoverHeight; + protected final float hoverRadius; + + protected double hoverPosX; + protected double hoverPosY; + protected double hoverPosZ; + + protected HoverBaseGoal(T snowQueen, float hoverHeight, float hoverRadius) { + this.attacker = snowQueen; + this.hoverHeight = hoverHeight; + this.hoverRadius = hoverRadius; + } + + @Override + public void start() { + LivingEntity target = this.attacker.getTarget(); + if (target != null) { + // find a spot above the player + this.makeNewHoverSpot(target); + } + } + + /** + * Make a new spot to hover at! + */ + protected void makeNewHoverSpot(LivingEntity target) { + double hx = 0, hy = 0, hz = 0; + + boolean found = false; + + for (int i = 0; i < 100; i++) { + hx = target.getX() + (this.attacker.getRandom().nextFloat() - this.attacker.getRandom().nextFloat()) * this.hoverRadius; + hy = target.getY() + this.hoverHeight; + hz = target.getZ() + (this.attacker.getRandom().nextFloat() - this.attacker.getRandom().nextFloat()) * this.hoverRadius; + + if (!this.isPositionOccupied(hx, hy, hz) && this.attacker.hasLineOfSight(target)) { + found = true; + break; + } + } + + if (!found) { + TwilightForestMod.LOGGER.debug("Found no spots, giving up"); + } + + this.hoverPosX = hx; + this.hoverPosY = hy; + this.hoverPosZ = hz; + } + + protected boolean isPositionOccupied(double hx, double hy, double hz) { + float radius = this.attacker.getBbWidth() / 2F; + AABB aabb = new AABB(hx - radius, hy, hz - radius, hx + radius, hy + this.attacker.getBbHeight(), hz + radius); + return !this.attacker.getLevel().isUnobstructed(attacker, Shapes.create(aabb)) || !this.attacker.getLevel().noCollision(attacker, aabb); + } +} diff --git a/src/main/java/twilightforest/entity/ai/goal/HoverBeamGoal.java b/src/main/java/twilightforest/entity/ai/goal/HoverBeamGoal.java new file mode 100644 index 0000000000..6ea189f011 --- /dev/null +++ b/src/main/java/twilightforest/entity/ai/goal/HoverBeamGoal.java @@ -0,0 +1,178 @@ +package twilightforest.entity.ai.goal; + +import net.minecraft.util.Mth; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.Vec3; +import twilightforest.entity.boss.SnowQueen; +import twilightforest.entity.boss.SnowQueen.Phase; + +import java.util.*; + +public class HoverBeamGoal extends HoverBaseGoal { + + private int hoverTimer; + private int beamTimer; + private int seekTimer; + + private final int maxHoverTime; + private final int maxBeamTime; + private final int maxSeekTime; + + private double beamY; + private boolean isInPosition; + + public HoverBeamGoal(SnowQueen snowQueen, int hoverTime, int dropTime) { + super(snowQueen, 3F, 4F); + + this.setFlags(EnumSet.of(Flag.MOVE, Flag.LOOK)); + this.maxHoverTime = hoverTime; + this.maxSeekTime = hoverTime; + this.maxBeamTime = dropTime; + + this.hoverTimer = 0; + this.isInPosition = false; + } + + @Override + public boolean canUse() { + LivingEntity target = this.attacker.getTarget(); + + if (target == null) { + return false; + } else //attacker.canEntityBeSeen(target); + if (!target.isAlive()) { + return false; + } else return this.attacker.getCurrentPhase() == Phase.BEAM; + } + + @Override + public boolean canContinueToUse() { + LivingEntity target = this.attacker.getTarget(); + + if (target == null || !target.isAlive()) { + return false; + } else if (this.attacker.getCurrentPhase() != Phase.BEAM) { + return false; + } else if (this.seekTimer >= this.maxSeekTime) { + return false; + } else return this.beamTimer < this.maxBeamTime; + } + + @Override + public void stop() { + this.seekTimer = 0; + this.hoverTimer = 0; + this.beamTimer = 0; + this.isInPosition = false; + + this.attacker.setBreathing(false); + } + + @Override + public void tick() { + + // check if we're in position + if (this.attacker.distanceToSqr(this.hoverPosX, this.hoverPosY, this.hoverPosZ) <= 1.0F) { + this.isInPosition = true; + } + + // update timers + if (this.isInPosition) { + this.hoverTimer++; + } else { + this.seekTimer++; + } + + // drop once the hover timer runs out + if (this.hoverTimer >= this.maxHoverTime) { + this.beamTimer++; + this.attacker.setBreathing(true); + + // anyhoo, deal damage + this.doRayAttack(); + + // descend + this.hoverPosY -= 0.05F; + + if (this.hoverPosY < this.beamY) { + this.hoverPosY = this.beamY; + } + } + + // check if we are at our waypoint target + double offsetX = this.hoverPosX - this.attacker.getX(); + double offsetY = this.hoverPosY - this.attacker.getY(); + double offsetZ = this.hoverPosZ - this.attacker.getZ(); + + double distanceDesired = offsetX * offsetX + offsetY * offsetY + offsetZ * offsetZ; + + distanceDesired = Mth.sqrt((float) distanceDesired); + + if (distanceDesired > 0.5) { + + // add velocity + double velX = offsetX / distanceDesired * 0.05D; + double velY = offsetY / distanceDesired * 0.1D; + double velZ = offsetZ / distanceDesired * 0.05D; + + // gravity offset + velY += 0.045F; + + this.attacker.push(velX, velY, velZ); + } + + // look at target + LivingEntity target = this.attacker.getTarget(); + if (target != null) { + float tracking = this.isInPosition ? 1F : 20.0F; + + this.attacker.lookAt(target, tracking, tracking); + this.attacker.getLookControl().setLookAt(target, tracking, tracking); + } + } + + private void doRayAttack() { + + double range = 20.0D; + double offset = 10.0D; + Vec3 srcVec = new Vec3(this.attacker.getX(), this.attacker.getY() + 0.25, this.attacker.getZ()); + Vec3 lookVec = this.attacker.getViewVector(1.0F); + Vec3 destVec = srcVec.add(lookVec.x() * range, lookVec.y() * range, lookVec.z() * range); + List possibleList = this.attacker.getLevel().getEntities(this.attacker, this.attacker.getBoundingBox().move(lookVec.x() * offset, lookVec.y() * offset, lookVec.z() * offset).inflate(range, range, range)); + double hitDist = 0; + + if (this.attacker.isMultipartEntity()) + possibleList.removeAll(Arrays.asList(Objects.requireNonNull(this.attacker.getParts()))); + + for (Entity possibleEntity : possibleList) { + if (possibleEntity.isPickable() && possibleEntity != this.attacker) { + float borderSize = possibleEntity.getPickRadius(); + AABB collisionBB = possibleEntity.getBoundingBox().inflate(borderSize, borderSize, borderSize); + Optional interceptPos = collisionBB.clip(srcVec, destVec); + + if (collisionBB.contains(srcVec)) { + if (0.0D < hitDist || hitDist == 0.0D) { + this.attacker.doBreathAttack(possibleEntity); + hitDist = 0.0D; + } + } else if (interceptPos.isPresent()) { + double possibleDist = srcVec.distanceTo(interceptPos.get()); + + if (possibleDist < hitDist || hitDist == 0.0D) { + this.attacker.doBreathAttack(possibleEntity); + hitDist = possibleDist; + } + } + } + } + } + + @Override + protected void makeNewHoverSpot(LivingEntity target) { + super.makeNewHoverSpot(target); + this.beamY = target.getY(); + this.seekTimer = 0; + } +} diff --git a/src/main/java/twilightforest/entity/ai/goal/HoverSummonGoal.java b/src/main/java/twilightforest/entity/ai/goal/HoverSummonGoal.java new file mode 100644 index 0000000000..5075b32b9c --- /dev/null +++ b/src/main/java/twilightforest/entity/ai/goal/HoverSummonGoal.java @@ -0,0 +1,109 @@ +package twilightforest.entity.ai.goal; + +import net.minecraft.util.Mth; +import net.minecraft.world.entity.LivingEntity; +import twilightforest.entity.boss.SnowQueen; +import twilightforest.entity.boss.SnowQueen.Phase; + +import java.util.EnumSet; + +public class HoverSummonGoal extends HoverBaseGoal { + + private static final int MAX_MINIONS_AT_ONCE = 4; + + private int seekTimer; + + private final int maxSeekTime; + + public HoverSummonGoal(SnowQueen snowQueen) { + super(snowQueen, 6F, 6F); + + this.setFlags(EnumSet.of(Flag.MOVE, Flag.LOOK)); + this.maxSeekTime = 80; + } + + @Override + public boolean canUse() { + LivingEntity target = this.attacker.getTarget(); + + if (target == null) { + return false; + } else if (!target.isAlive()) { + return false; + } else if (this.attacker.getCurrentPhase() != Phase.SUMMON) { + return false; + } else { + return this.attacker.getSensing().hasLineOfSight(target); + } + } + + @Override + public boolean canContinueToUse() { + LivingEntity target = this.attacker.getTarget(); + + if (target == null || !target.isAlive()) { + return false; + } else if (this.attacker.getCurrentPhase() != Phase.SUMMON) { + return false; + } else if (this.seekTimer > this.maxSeekTime) { + return false; + } else { + return this.attacker.hasLineOfSight(target); + } + } + + @Override + public void stop() { + } + + @Override + public void tick() { + + this.seekTimer++; + LivingEntity target = this.attacker.getTarget(); + + // are we there yet? + if (target != null && this.attacker.distanceToSqr(this.hoverPosX, this.hoverPosY, this.hoverPosZ) <= 3.0F) { + this.checkAndSummon(); + + this.makeNewHoverSpot(target); + } + + // check if we are at our waypoint target + double offsetX = this.hoverPosX - this.attacker.getX(); + double offsetY = this.hoverPosY - this.attacker.getY(); + double offsetZ = this.hoverPosZ - this.attacker.getZ(); + + double distanceDesired = offsetX * offsetX + offsetY * offsetY + offsetZ * offsetZ; + + distanceDesired = Mth.sqrt((float) distanceDesired); + + // add velocity + double velX = offsetX / distanceDesired * 0.05D; + double velY = offsetY / distanceDesired * 0.1D; + double velZ = offsetZ / distanceDesired * 0.05D; + + // gravity offset + velY += 0.05D; + + this.attacker.push(velX, velY, velZ); + + // look at target + if (target != null) { + this.attacker.lookAt(target, 30.0F, 30.0F); + this.attacker.getLookControl().setLookAt(target, 30.0F, 30.0F); + } + } + + @Override + protected void makeNewHoverSpot(LivingEntity target) { + super.makeNewHoverSpot(target); + this.seekTimer = 0; + } + + private void checkAndSummon() { + if (this.attacker.getSummonsRemaining() > 0 && this.attacker.countMyMinions() < MAX_MINIONS_AT_ONCE) { + this.attacker.summonMinionAt(this.attacker.getTarget()); + } + } +} diff --git a/src/main/java/twilightforest/entity/ai/goal/HoverThenDropGoal.java b/src/main/java/twilightforest/entity/ai/goal/HoverThenDropGoal.java new file mode 100644 index 0000000000..44490348f1 --- /dev/null +++ b/src/main/java/twilightforest/entity/ai/goal/HoverThenDropGoal.java @@ -0,0 +1,127 @@ +package twilightforest.entity.ai.goal; + +import net.minecraft.util.Mth; +import net.minecraft.world.entity.LivingEntity; +import twilightforest.entity.boss.SnowQueen; +import twilightforest.entity.boss.SnowQueen.Phase; + +import java.util.EnumSet; + +public class HoverThenDropGoal extends HoverBaseGoal { + + private int hoverTimer; + private int dropTimer; + private int seekTimer; + + private final int maxHoverTime; + private final int maxDropTime; + private final int maxSeekTime; + + private double dropY; + + public HoverThenDropGoal(SnowQueen snowQueen, int hoverTime, int dropTime) { + super(snowQueen, 6F, 0F); + + this.setFlags(EnumSet.of(Flag.MOVE, Flag.LOOK)); + this.maxHoverTime = hoverTime; + this.maxSeekTime = hoverTime; + this.maxDropTime = dropTime; + + this.hoverTimer = 0; + } + + @Override + public boolean canUse() { + LivingEntity target = this.attacker.getTarget(); + + if (target == null) { + return false; + } else if (!target.isAlive()) { + return false; + } else { + return this.attacker.getCurrentPhase() == Phase.DROP; + } + } + + @Override + public boolean canContinueToUse() { + LivingEntity target = this.attacker.getTarget(); + + if (target == null || !target.isAlive()) { + return false; + } else if (this.attacker.getCurrentPhase() != Phase.DROP) { + return false; + } else if (this.seekTimer > this.maxSeekTime) { + return false; + } else if (this.attacker.distanceToSqr(this.hoverPosX, this.hoverPosY, this.hoverPosZ) <= 1.0F) { + // are we there yet? + this.hoverTimer++; + return true; + } else if (this.dropTimer < this.maxDropTime) { + return true; + } else { + // max drop time! + this.attacker.incrementSuccessfulDrops(); + return false; + } + } + + @Override + public void stop() { + this.hoverTimer = 0; + this.dropTimer = 0; + } + + @Override + public void tick() { + + // if we have hit the drop spot, start dropping + if (this.hoverTimer > 0) { + this.hoverTimer++; + } else { + this.seekTimer++; + } + + if (this.hoverTimer < this.maxHoverTime) { + + // check if we are at our waypoint target + double offsetX = this.hoverPosX - this.attacker.getX(); + double offsetY = this.hoverPosY - this.attacker.getY(); + double offsetZ = this.hoverPosZ - this.attacker.getZ(); + + double distanceDesired = offsetX * offsetX + offsetY * offsetY + offsetZ * offsetZ; + + distanceDesired = Mth.sqrt((float) distanceDesired); + + // add velocity + double velX = offsetX / distanceDesired * 0.05D; + double velY = offsetY / distanceDesired * 0.1D; + double velZ = offsetZ / distanceDesired * 0.05D; + + // gravity offset + velY += 0.05D; + + this.attacker.push(velX, velY, velZ); + + // look at target + LivingEntity target = this.attacker.getTarget(); + if (target != null) { + this.attacker.lookAt(target, 30.0F, 30.0F); + this.attacker.getLookControl().setLookAt(target, 30.0F, 30.0F); + } + } else { + // drop! + this.dropTimer++; + if (this.attacker.getY() > this.dropY) { + this.attacker.destroyBlocksInAABB(this.attacker.getBoundingBox().inflate(1, 0.5F, 1)); + } + } + } + + @Override + protected void makeNewHoverSpot(LivingEntity target) { + super.makeNewHoverSpot(target); + this.dropY = target.getY() - 1F; + this.seekTimer = 0; + } +} diff --git a/src/main/java/twilightforest/entity/ai/goal/LichAbsorbMinionsGoal.java b/src/main/java/twilightforest/entity/ai/goal/LichAbsorbMinionsGoal.java new file mode 100644 index 0000000000..90285b67d9 --- /dev/null +++ b/src/main/java/twilightforest/entity/ai/goal/LichAbsorbMinionsGoal.java @@ -0,0 +1,75 @@ +package twilightforest.entity.ai.goal; + +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.ai.goal.Goal; +import net.minecraft.world.level.gameevent.GameEvent; +import twilightforest.entity.boss.Lich; +import twilightforest.entity.monster.LichMinion; +import twilightforest.init.TFSounds; +import twilightforest.item.LifedrainScepterItem; +import twilightforest.util.EntityUtil; + +import java.util.EnumSet; +import java.util.List; +import java.util.stream.Collectors; + +public class LichAbsorbMinionsGoal extends Goal { + + private final Lich lich; + + public LichAbsorbMinionsGoal(Lich lich) { + this.lich = lich; + this.setFlags(EnumSet.of(Flag.LOOK, Flag.MOVE)); + } + + @Override + public boolean canUse() { + return this.lich.getHealth() < this.lich.getMaxHealth() / 2 && this.lich.countMyMinions() > 0; + } + + @Override + public void start() { + super.start(); + this.lich.setScepterTime(); + } + + @Override + public void stop() { + super.stop(); + this.lich.resetScepterTime(); + } + + @Override + public void tick() { + super.tick(); + if (this.lich.getScepterTimeLeft() > 0) return; + + List minions = this.lich.getLevel().getEntitiesOfClass(LichMinion.class, this.lich.getBoundingBox().inflate(32.0D, 16.0D, 32.0D)) + .stream().filter(m -> m.master == this.lich).collect(Collectors.toList()); + + if (!minions.isEmpty()) { + LichMinion minion = minions.get(0); + minion.discard(); + //rain particles + LifedrainScepterItem.animateTargetShatter((ServerLevel) this.lich.getLevel(), minion); + // play death sound + SoundEvent deathSound = EntityUtil.getDeathSound(minion); + if (deathSound != null) { + this.lich.getLevel().playSound(null, minion.blockPosition(), deathSound, SoundSource.HOSTILE, 1.0F, minion.getVoicePitch()); + } + //funny pop sound + this.lich.playSound(TFSounds.LICH_POP_MOB.get(), 3.0F, 0.4F + this.lich.getRandom().nextFloat() * 0.2F); + minion.playSound(TFSounds.LICH_POP_MOB.get(), 3.0F, 0.4F + this.lich.getRandom().nextFloat() * 0.2F); + // make trail so it's clear that we did it + this.lich.makeMagicTrail(minion.getEyePosition(), this.lich.getEyePosition(), 0.5F, 0.0F, 1.0F); + //heal some health + this.lich.heal(minion.getHealth()); + this.lich.swing(InteractionHand.MAIN_HAND); + this.lich.setPopCooldown(40); + this.lich.gameEvent(GameEvent.ENTITY_DIE); + } + } +} diff --git a/src/main/java/twilightforest/entity/ai/goal/LichMinionsGoal.java b/src/main/java/twilightforest/entity/ai/goal/LichMinionsGoal.java new file mode 100644 index 0000000000..9dce6f32e9 --- /dev/null +++ b/src/main/java/twilightforest/entity/ai/goal/LichMinionsGoal.java @@ -0,0 +1,111 @@ +package twilightforest.entity.ai.goal; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.MobSpawnType; +import net.minecraft.world.entity.ai.goal.Goal; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.ServerLevelAccessor; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.event.ForgeEventFactory; +import twilightforest.entity.boss.Lich; +import twilightforest.entity.monster.LichMinion; +import twilightforest.entity.projectile.LichBolt; +import twilightforest.entity.projectile.LichBomb; +import twilightforest.init.TFItems; +import twilightforest.init.TFSounds; + +import java.util.EnumSet; + +public class LichMinionsGoal extends Goal { + + private final Lich lich; + + public LichMinionsGoal(Lich boss) { + this.lich = boss; + this.setFlags(EnumSet.of(Flag.MOVE, Flag.LOOK)); + } + + @Override + public boolean canUse() { + return this.lich.getPhase() == 2 && !this.lich.isShadowClone(); + } + + @Override + public void start() { + this.lich.setItemSlot(EquipmentSlot.MAINHAND, new ItemStack(TFItems.ZOMBIE_SCEPTER.get())); + } + + @Override + public void tick() { + LivingEntity targetedEntity = this.lich.getTarget(); + if (targetedEntity == null) + return; + float dist = this.lich.distanceTo(targetedEntity); + // spawn minions every so often + if (this.lich.getAttackCooldown() % 15 == 0) { + this.checkAndSpawnMinions(); + } + + if (this.lich.getAttackCooldown() == 0) { + if (dist < 2.0F) { + // melee attack + this.lich.doHurtTarget(targetedEntity); + this.lich.setAttackCooldown(20); + } else if (dist < 20F && this.lich.getSensing().hasLineOfSight(targetedEntity)) { + if (this.lich.getNextAttackType() == 0) { + this.lich.launchProjectileAt(new LichBolt(this.lich.getLevel(), this.lich)); + } else { + this.lich.launchProjectileAt(new LichBomb(this.lich.getLevel(), this.lich)); + } + + this.lich.swing(InteractionHand.MAIN_HAND); + this.lich.setNextAttackType(this.lich.getRandom().nextBoolean() ? 0 : 1); + this.lich.setAttackCooldown(60); + } else { + // if not, teleport around + this.lich.teleportToSightOfEntity(targetedEntity); + this.lich.setAttackCooldown(20); + + } + } + } + + private void checkAndSpawnMinions() { + if (!this.lich.getLevel().isClientSide() && this.lich.getMinionsToSummon() > 0) { + int minions = this.lich.countMyMinions(); + + // if not, spawn one! + if (minions < Lich.MAX_ACTIVE_MINIONS) { + this.spawnMinionAt(); + this.lich.setMinionsToSummon(this.lich.getMinionsToSummon() - 1); + } + } + } + + private void spawnMinionAt() { + // find a good spot + LivingEntity targetedEntity = this.lich.getTarget(); + Vec3 minionSpot = this.lich.findVecInLOSOf(targetedEntity); + + if (minionSpot != null && this.lich.getLevel() instanceof ServerLevelAccessor accessor) { + // put a clone there + LichMinion minion = new LichMinion(this.lich.getLevel(), this.lich); + minion.setPos(minionSpot.x(), minionSpot.y(), minionSpot.z()); + ForgeEventFactory.onFinalizeSpawn(minion, accessor, this.lich.getLevel().getCurrentDifficultyAt(BlockPos.containing(minionSpot)), MobSpawnType.MOB_SUMMONED, null, null); + this.lich.getLevel().addFreshEntity(minion); + + minion.setTarget(targetedEntity); + + minion.spawnAnim(); + minion.playSound(TFSounds.MINION_SUMMON.get(), 1.0F, ((this.lich.getRandom().nextFloat() - this.lich.getRandom().nextFloat()) * 0.7F + 1.0F) * 2.0F); + + this.lich.swing(InteractionHand.MAIN_HAND); + // make sparkles leading to it + this.lich.makeMagicTrail(this.lich.getEyePosition(), minion.getEyePosition(), 0.0F, 0.0F, 0.0F); + } + } + +} diff --git a/src/main/java/twilightforest/entity/ai/goal/LichPopMobsGoal.java b/src/main/java/twilightforest/entity/ai/goal/LichPopMobsGoal.java new file mode 100644 index 0000000000..c3dedf4ec4 --- /dev/null +++ b/src/main/java/twilightforest/entity/ai/goal/LichPopMobsGoal.java @@ -0,0 +1,84 @@ +package twilightforest.entity.ai.goal; + +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.ai.goal.Goal; +import net.minecraft.world.level.gameevent.GameEvent; +import twilightforest.data.tags.EntityTagGenerator; +import twilightforest.entity.boss.Lich; +import twilightforest.init.TFSounds; +import twilightforest.item.LifedrainScepterItem; +import twilightforest.util.EntityUtil; + +import java.util.EnumSet; + +public class LichPopMobsGoal extends Goal { + + private final Lich lich; + + public LichPopMobsGoal(Lich lich) { + this.lich = lich; + this.setFlags(EnumSet.of(Flag.LOOK, Flag.MOVE)); + } + + @Override + public boolean requiresUpdateEveryTick() { + return true; + } + + @Override + public void start() { + super.start(); + this.lich.setScepterTime(); + } + + @Override + public void stop() { + super.stop(); + this.lich.resetScepterTime(); + } + + @Override + public boolean canUse() { + return !this.lich.isShadowClone() && + this.lich.getHealth() < this.lich.getMaxHealth() && + this.lich.getPopCooldown() == 0 && + !this.lich.getLevel().getEntitiesOfClass(Mob.class, + this.lich.getBoundingBox().inflate(32.0D, 16.0D, 32.0D), + e -> e.getType().is(EntityTagGenerator.LICH_POPPABLES) && this.lich.hasLineOfSight(e)).isEmpty(); + } + + @Override + public void tick() { + super.tick(); + if (this.lich.getScepterTimeLeft() > 0) return; + for (Mob mob : this.lich.getLevel().getEntitiesOfClass(Mob.class, this.lich.getBoundingBox().inflate(32.0D, 16.0D, 32.0D), e -> e.getType().is(EntityTagGenerator.LICH_POPPABLES))) { + if (this.lich.getSensing().hasLineOfSight(mob)) { + if (!this.lich.getLevel().isClientSide()) { + mob.discard(); + //rain particles + LifedrainScepterItem.animateTargetShatter((ServerLevel) this.lich.getLevel(), mob); + // play death sound + SoundEvent deathSound = EntityUtil.getDeathSound(mob); + if (deathSound != null) { + this.lich.getLevel().playSound(null, mob.blockPosition(), deathSound, SoundSource.HOSTILE, 1.0F, mob.getVoicePitch()); + } + //funny pop sound + this.lich.playSound(TFSounds.LICH_POP_MOB.get(), 3.0F, 0.4F + this.lich.getRandom().nextFloat() * 0.2F); + mob.playSound(TFSounds.LICH_POP_MOB.get(), 3.0F, 0.4F + this.lich.getRandom().nextFloat() * 0.2F); + // make trail so it's clear that we did it + this.lich.makeMagicTrail(mob.getEyePosition(), this.lich.getEyePosition(), 1.0F, 0.5F, 0.5F); + //heal a little health + this.lich.heal(2.0F); + this.lich.swing(InteractionHand.MAIN_HAND); + this.lich.setPopCooldown(40); + this.lich.gameEvent(GameEvent.ENTITY_DIE); + break; + } + } + } + } +} diff --git a/src/main/java/twilightforest/entity/ai/goal/LichShadowsGoal.java b/src/main/java/twilightforest/entity/ai/goal/LichShadowsGoal.java new file mode 100644 index 0000000000..0e362457a7 --- /dev/null +++ b/src/main/java/twilightforest/entity/ai/goal/LichShadowsGoal.java @@ -0,0 +1,133 @@ +package twilightforest.entity.ai.goal; + +import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.ai.goal.Goal; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.phys.Vec3; +import twilightforest.entity.boss.Lich; +import twilightforest.entity.projectile.LichBolt; +import twilightforest.entity.projectile.LichBomb; +import twilightforest.init.TFItems; + +import java.util.EnumSet; + +public class LichShadowsGoal extends Goal { + + private final Lich lich; + + public LichShadowsGoal(Lich boss) { + this.lich = boss; + this.setFlags(EnumSet.of(Flag.LOOK, Flag.MOVE)); + } + + @Override + public boolean canUse() { + return this.lich.getPhase() == 1; + } + + @Override + public void start() { + this.lich.setItemSlot(EquipmentSlot.MAINHAND, new ItemStack(TFItems.TWILIGHT_SCEPTER.get())); + } + + @Override + public void stop() { + this.despawnClones(); + } + + @Override + public void tick() { + if (this.lich.isShadowClone()) + this.checkForMaster(); + LivingEntity targetedEntity = this.lich.getTarget(); + if (targetedEntity == null) + return; + float dist = this.lich.distanceTo(targetedEntity); + + if (this.lich.getAttackCooldown() == 60) { + this.lich.teleportToSightOfEntity(targetedEntity); + + if (!this.lich.isShadowClone()) { + this.checkAndSpawnClones(); + } + } + + if (this.lich.getSensing().hasLineOfSight(targetedEntity) && this.lich.getAttackCooldown() == 0 && dist < 20F) { + if (this.lich.getNextAttackType() == 0) { + this.lich.launchProjectileAt(new LichBolt(this.lich.getLevel(), this.lich)); + } else { + this.lich.launchProjectileAt(new LichBomb(this.lich.getLevel(), this.lich)); + } + + this.lich.swing(InteractionHand.MAIN_HAND); + + if (this.lich.getRandom().nextInt(3) > 0) { + this.lich.setNextAttackType(0); + } else { + this.lich.setNextAttackType(1); + } + this.lich.setAttackCooldown(100); + } + } + + private void checkForMaster() { + if (this.lich.getMasterLich() == null) { + this.findNewMaster(); + } + if (!this.lich.getLevel().isClientSide() && (this.lich.getMasterLich() == null || !this.lich.getMasterLich().isAlive() || this.lich.getMasterLich().getPhase() != 1)) { + this.lich.discard(); + } + } + + private void checkAndSpawnClones() { + // if not, spawn one! + if (this.lich.countMyClones() < Lich.MAX_SHADOW_CLONES) + this.spawnShadowClone(); + } + + private void spawnShadowClone() { + LivingEntity targetedEntity = this.lich.getTarget(); + + // find a good spot + Vec3 cloneSpot = this.lich.findVecInLOSOf(targetedEntity); + + if (cloneSpot != null) { + // put a clone there + Lich newClone = new Lich(this.lich.getLevel(), this.lich); + newClone.setPos(cloneSpot.x(), cloneSpot.y(), cloneSpot.z()); + this.lich.getLevel().addFreshEntity(newClone); + + newClone.setTarget(targetedEntity); + newClone.setAttackCooldown(60 + this.lich.getRandom().nextInt(3) - this.lich.getRandom().nextInt(3)); + + // make sparkles leading to it + this.lich.makeTeleportTrail(this.lich.getX(), this.lich.getY(), this.lich.getZ(), cloneSpot.x(), cloneSpot.y(), cloneSpot.z()); + } + } + + private void despawnClones() { + for (Lich nearbyLich : this.lich.getNearbyLiches()) { + if (nearbyLich.isShadowClone()) { + nearbyLich.remove(Entity.RemovalReason.DISCARDED); + } + } + } + + private void findNewMaster() { + + for (Lich nearbyLich : this.lich.getNearbyLiches()) { + if (!nearbyLich.isShadowClone() && nearbyLich.wantsNewClone(this.lich)) { + this.lich.setMaster(nearbyLich); + + // animate our new linkage! + this.lich.makeTeleportTrail(this.lich.getX(), this.lich.getY(), this.lich.getZ(), nearbyLich.getX(), nearbyLich.getY(), nearbyLich.getZ()); + + this.lich.setTarget(nearbyLich.getTarget()); + break; + } + } + } +} diff --git a/src/main/java/twilightforest/entity/ai/goal/NagaMovementPattern.java b/src/main/java/twilightforest/entity/ai/goal/NagaMovementPattern.java new file mode 100644 index 0000000000..8f0784c2d0 --- /dev/null +++ b/src/main/java/twilightforest/entity/ai/goal/NagaMovementPattern.java @@ -0,0 +1,239 @@ +package twilightforest.entity.ai.goal; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.ai.goal.Goal; +import net.minecraft.world.level.gameevent.GameEvent; +import net.minecraftforge.event.ForgeEventFactory; +import twilightforest.data.tags.BlockTagGenerator; +import twilightforest.entity.boss.Naga; +import twilightforest.init.TFSounds; +import twilightforest.util.EntityUtil; + +import java.util.EnumSet; + +public class NagaMovementPattern extends Goal { + + private final Naga naga; + private MovementState state; + private int stateCounter; + private boolean clockwise; + + public NagaMovementPattern(Naga naga) { + this.naga = naga; + this.setFlags(EnumSet.of(Flag.MOVE, Flag.LOOK)); + this.stop(); + } + + @Override + public boolean canUse() { + return this.naga.getTarget() != null && this.naga.areSelfAndTargetInHome(this.naga.getTarget()); + } + + @Override + public void stop() { + this.state = MovementState.CIRCLE; + this.stateCounter = 15; + this.clockwise = false; + } + + @Override + public void tick() { + if (!this.naga.getNavigation().isDone()) { + // If we still have an uncompleted path don't run yet + // This isn't in shouldExecute/shouldContinueExecuting because we don't want to reset the task + + //ok im pretty sure this bit right here was what was causing the naga to become undazed after hitting a shield sometimes + //this.naga.setDazed(false); // Since we have a path, we shouldn't be dazed anymore. + + //if we get stuck, give up. This really only happens when mob griefing is set to false + if (this.naga.getNavigation().isStuck()) { + this.naga.getNavigation().stop(); + } + + return; + } + + switch (this.state) { + case INTIMIDATE -> { + this.naga.getNavigation().stop(); + if (naga.getTarget() != null) { + this.naga.getLookControl().setLookAt(this.naga.getTarget(), 30.0F, 30.0F); + this.naga.lookAt(this.naga.getTarget(), 30.0F, 30.0F); + } + this.naga.zza = 0.1f; + } + case CRUMBLE -> { + this.naga.getNavigation().stop(); + this.crumbleBelowTarget(2); + this.crumbleBelowTarget(3); + } + case CHARGE -> { + if (naga.getTarget() != null) { + BlockPos tpoint = this.findCirclePoint(clockwise, 14, Math.PI); + this.naga.getNavigation().moveTo(tpoint.getX(), tpoint.getY(), tpoint.getZ(), 1.0D); + } + this.naga.setCharging(true); + } + case CIRCLE -> { + // normal radius is 13 + double radius = this.stateCounter % 2 == 0 ? 12.0D : 14.0D; + double rotation = 1; // in radians + + // hook out slightly before circling + if (this.stateCounter == 2) { + radius = 16; + } + + // head almost straight at the player at the end + if (this.stateCounter == 1) { + rotation = 0.1D; + } + + if (naga.getTarget() != null) { + BlockPos tpoint = this.findCirclePoint(this.clockwise, radius, rotation); + this.naga.getNavigation().moveTo(tpoint.getX(), tpoint.getY(), tpoint.getZ(), 1.0D); + } + } + case DAZE -> { + this.naga.getNavigation().stop(); + this.naga.setDazed(true); + this.naga.setCharging(false); + } + } + + this.stateCounter--; + if (this.stateCounter <= 0) { + this.transitionState(); + } + } + + private void transitionState() { + this.naga.setDazed(false); + this.naga.setCharging(false); + switch (this.state) { + case INTIMIDATE -> { + this.clockwise = !this.clockwise; + + if (naga.getTarget() != null && this.naga.getTarget().getBoundingBox().minY > this.naga.getBoundingBox().maxY) { + this.doCrumblePlayer(); + } else { + this.doCharge(); + } + } + case CRUMBLE -> this.doCharge(); + case CHARGE, DAZE -> this.doCircle(); + case CIRCLE -> this.doIntimidate(); + } + } + + public void doDaze() { + this.state = MovementState.DAZE; + this.naga.getNavigation().stop(); + this.stateCounter = 60 + this.naga.getRandom().nextInt(40); + } + + public void doCircle() { + this.state = MovementState.CIRCLE; + this.stateCounter += 10 + this.naga.getRandom().nextInt(10); + this.naga.goNormal(); + } + + public void doCrumblePlayer() { + this.state = MovementState.CRUMBLE; + this.stateCounter = 20 + this.naga.getRandom().nextInt(20); + this.naga.goSlow(); + } + + /** + * Charge the player. Although the count is 3, we actually charge only 2 times. + */ + private void doCharge() { + this.state = MovementState.CHARGE; + this.stateCounter = 3; + this.naga.goFast(); + } + + private void doIntimidate() { + this.state = MovementState.INTIMIDATE; + this.naga.playSound(TFSounds.NAGA_RATTLE.get(), 4.0F, this.naga.getVoicePitch()); + this.naga.gameEvent(GameEvent.ENTITY_ROAR); + + this.stateCounter += 15 + this.naga.getRandom().nextInt(10); + this.naga.goSlow(); + } + + private void crumbleBelowTarget(int range) { + if (!ForgeEventFactory.getMobGriefingEvent(this.naga.getLevel(), this.naga) || naga.getTarget() == null) return; + + int floor = (int) this.naga.getBoundingBox().minY; + int targetY = (int) this.naga.getTarget().getBoundingBox().minY; + + if (targetY > floor) { + int dx = (int) this.naga.getTarget().getX() + this.naga.getRandom().nextInt(range) - this.naga.getRandom().nextInt(range); + int dz = (int) this.naga.getTarget().getZ() + this.naga.getRandom().nextInt(range) - this.naga.getRandom().nextInt(range); + int dy = targetY - this.naga.getRandom().nextInt(range) + this.naga.getRandom().nextInt(range > 1 ? range - 1 : range); + + if (dy <= floor) { + dy = targetY; + } + + BlockPos pos = new BlockPos(dx, dy, dz); + + if (EntityUtil.canDestroyBlock(this.naga.getLevel(), pos, this.naga)) { + this.naga.getLevel().destroyBlock(pos, true); + + // sparkle!! + for (int k = 0; k < 20; k++) { + double d = this.naga.getRandom().nextGaussian() * 0.02D; + double d1 = this.naga.getRandom().nextGaussian() * 0.02D; + double d2 = this.naga.getRandom().nextGaussian() * 0.02D; + + this.naga.getLevel().addParticle(ParticleTypes.CRIT, + (this.naga.getX() + this.naga.getRandom().nextFloat() * this.naga.getBbWidth() * 2.0F) - this.naga.getBbWidth(), + this.naga.getY() + this.naga.getRandom().nextFloat() * this.naga.getBbHeight(), + (this.naga.getZ() + this.naga.getRandom().nextFloat() * this.naga.getBbWidth() * 2.0F) - this.naga.getBbWidth(), + d, d1, d2); + } + } + } + } + + /** + * Finds a point that allows us to circle the target clockwise. + */ + private BlockPos findCirclePoint(boolean clockwise, double radius, double rotation) { + LivingEntity toCircle = this.naga.getTarget(); + + // compute angle + double vecx = this.naga.getX() - toCircle.getX(); + double vecz = this.naga.getZ() - toCircle.getZ(); + float rangle = (float) (Math.atan2(vecz, vecx)); + + // add a little, so he circles (clockwise) + rangle += clockwise ? rotation : -rotation; + + // figure out where we're headed from the target angle + double dx = Mth.cos(rangle) * radius; + double dz = Mth.sin(rangle) * radius; + + double dy = Math.min(this.naga.getBoundingBox().minY, toCircle.getY()); + + // add that to the target entity's position, and we have our destination + return BlockPos.containing(toCircle.getX() + dx, dy, toCircle.getZ() + dz); + } + + public MovementState getState() { + return this.state; + } + + public enum MovementState { + INTIMIDATE, + CRUMBLE, + CHARGE, + CIRCLE, + DAZE + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/entity/ai/goal/NagaSmashGoal.java b/src/main/java/twilightforest/entity/ai/goal/NagaSmashGoal.java new file mode 100644 index 0000000000..88301b9d05 --- /dev/null +++ b/src/main/java/twilightforest/entity/ai/goal/NagaSmashGoal.java @@ -0,0 +1,52 @@ +package twilightforest.entity.ai.goal; + +import net.minecraft.core.BlockPos; +import net.minecraft.tags.BlockTags; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.ai.goal.Goal; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.AABB; +import net.minecraftforge.event.ForgeEventFactory; +import twilightforest.entity.boss.Naga; +import twilightforest.util.EntityUtil; + +public class NagaSmashGoal extends Goal { + + private final Naga naga; + + public NagaSmashGoal(Naga naga) { + this.naga = naga; + } + + @Override + public boolean canUse() { + return this.naga.horizontalCollision && ForgeEventFactory.getMobGriefingEvent(this.naga.getLevel(), this.naga); + } + + @Override + public void start() { + // NAGA SMASH! + if (this.naga.getLevel().isClientSide()) return; + + AABB bb = this.naga.getBoundingBox(); + + int minx = Mth.floor(bb.minX - 0.75D); + int miny = Mth.floor(bb.minY + 1.01D); + int minz = Mth.floor(bb.minZ - 0.75D); + int maxx = Mth.floor(bb.maxX + 0.75D); + int maxy = Mth.floor(bb.maxY + 0.0D); + int maxz = Mth.floor(bb.maxZ + 0.75D); + + BlockPos min = new BlockPos(minx, miny, minz); + BlockPos max = new BlockPos(maxx, maxy, maxz); + + if (this.naga.getLevel().hasChunksAt(min, max)) { + for (BlockPos pos : BlockPos.betweenClosed(min, max)) { + BlockState state = this.naga.getLevel().getBlockState(pos); + if (state.is(BlockTags.LEAVES) || (this.naga.shouldDestroyAllBlocks() && EntityUtil.canDestroyBlock(this.naga.getLevel(), pos, this.naga))) { + this.naga.getLevel().destroyBlock(pos, !state.is(BlockTags.LEAVES)); + } + } + } + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/entity/ai/goal/PanicOnFlockDeathGoal.java b/src/main/java/twilightforest/entity/ai/goal/PanicOnFlockDeathGoal.java new file mode 100644 index 0000000000..1617489ff1 --- /dev/null +++ b/src/main/java/twilightforest/entity/ai/goal/PanicOnFlockDeathGoal.java @@ -0,0 +1,100 @@ +package twilightforest.entity.ai.goal; + +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.PathfinderMob; +import net.minecraft.world.entity.ai.goal.Goal; +import net.minecraft.world.entity.ai.util.DefaultRandomPos; +import net.minecraft.world.phys.Vec3; +import twilightforest.entity.monster.Kobold; + +import java.util.EnumSet; +import java.util.List; + +public class PanicOnFlockDeathGoal extends Goal { + private final PathfinderMob flockCreature; + private final float speed; + private double fleeX; + private double fleeY; + private double fleeZ; + + private int fleeTimer; + + public PanicOnFlockDeathGoal(PathfinderMob creature, float speed) { + this.flockCreature = creature; + this.speed = speed; + this.setFlags(EnumSet.of(Flag.MOVE)); + this.fleeTimer = 0; + } + + @Override + public boolean canUse() { + boolean yikes = fleeTimer > 0; + + // check if any of us is dead within 4 squares + List flockList = this.flockCreature.level.getEntitiesOfClass(this.flockCreature.getClass(), this.flockCreature.getBoundingBox().inflate(4.0D, 2.0D, 4.0D)); + for (LivingEntity flocker : flockList) { + if (flocker.deathTime > 0) { + yikes = true; + break; + } + } + + if (!yikes) { + return false; + } else { + Vec3 target = DefaultRandomPos.getPos(this.flockCreature, 5, 4); + + if (target == null) { + return false; + } else { + this.fleeX = target.x(); + this.fleeY = target.y(); + this.fleeZ = target.z(); + return true; + } + } + } + + /** + * Execute a one shot task or start executing a continuous task + */ + @Override + public void start() { + this.fleeTimer = 40; + this.flockCreature.getNavigation().moveTo(this.fleeX, this.fleeY, this.fleeZ, this.speed); + + // panic flag for kobold animations + if (flockCreature instanceof Kobold kobold) { + kobold.setPanicked(true); + } + } + + /** + * Returns whether an in-progress EntityAIBase should continue executing + */ + @Override + public boolean canContinueToUse() { + return fleeTimer > 0 && !this.flockCreature.getNavigation().isDone(); + } + + /** + * Updates the task + */ + @Override + public void tick() { + fleeTimer--; + } + + /** + * Resets the task + */ + @Override + public void stop() { + fleeTimer -= 20; + + // panic flag for kobold animations + if (flockCreature instanceof Kobold kobold) { + kobold.setPanicked(false); + } + } +} diff --git a/src/main/java/twilightforest/entity/ai/goal/PhantomAttackStartGoal.java b/src/main/java/twilightforest/entity/ai/goal/PhantomAttackStartGoal.java new file mode 100644 index 0000000000..7801155130 --- /dev/null +++ b/src/main/java/twilightforest/entity/ai/goal/PhantomAttackStartGoal.java @@ -0,0 +1,37 @@ +package twilightforest.entity.ai.goal; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.ai.goal.Goal; +import twilightforest.entity.boss.KnightPhantom; + +import java.util.EnumSet; + +public class PhantomAttackStartGoal extends Goal { + + private final KnightPhantom boss; + + public PhantomAttackStartGoal(KnightPhantom entity) { + this.boss = entity; + setFlags(EnumSet.of(Flag.LOOK)); + } + + @Override + public boolean canUse() { + return this.boss.getTarget() != null && this.boss.getCurrentFormation() == KnightPhantom.Formation.ATTACK_PLAYER_START; + } + + @Override + public void tick() { + LivingEntity target = this.boss.getTarget(); + if (target != null) { + BlockPos targetPos = BlockPos.containing(target.xOld, target.yOld, target.zOld); + + if (this.boss.isWithinRestriction(targetPos)) { + this.boss.setChargePos(targetPos); + } else { + this.boss.setChargePos(this.boss.getRestrictCenter()); + } + } + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/entity/ai/goal/PhantomThrowWeaponGoal.java b/src/main/java/twilightforest/entity/ai/goal/PhantomThrowWeaponGoal.java new file mode 100644 index 0000000000..c4e393a587 --- /dev/null +++ b/src/main/java/twilightforest/entity/ai/goal/PhantomThrowWeaponGoal.java @@ -0,0 +1,91 @@ +package twilightforest.entity.ai.goal; + +import net.minecraft.util.Mth; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.ai.goal.Goal; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.gameevent.GameEvent; +import twilightforest.entity.boss.KnightPhantom; +import twilightforest.entity.projectile.ThrownWep; +import twilightforest.init.TFEntities; +import twilightforest.init.TFItems; +import twilightforest.init.TFSounds; + +import java.util.EnumSet; + +public class PhantomThrowWeaponGoal extends Goal { + + private final KnightPhantom boss; + + public PhantomThrowWeaponGoal(KnightPhantom entity) { + this.boss = entity; + setFlags(EnumSet.of(Flag.LOOK)); + } + + @Override + public boolean canUse() { + return this.boss.getTarget() != null && this.boss.getCurrentFormation() == KnightPhantom.Formation.ATTACK_PLAYER_ATTACK; + } + + @Override + public void tick() { + if (this.boss.getTarget() != null && this.boss.getTicksProgress() % 4 == 0) { + if (this.boss.isAxeKnight()) + this.launchAxeAt(this.boss.getTarget()); + else if (this.boss.isPickKnight()) + this.launchPicks(); + } + } + + private void launchAxeAt(Entity targetedEntity) { + float bodyFacingAngle = ((this.boss.yBodyRot * Mth.PI) / 180F); + double sx = this.boss.getX() + (Mth.cos(bodyFacingAngle) * 1); + double sy = this.boss.getY() + (this.boss.getBbHeight() * 0.82D); + double sz = this.boss.getZ() + (Mth.sin(bodyFacingAngle) * 1); + + double tx = targetedEntity.getX() - sx; + double ty = (targetedEntity.getBoundingBox().minY + targetedEntity.getBbHeight() / 2.0F) - (this.boss.getY() + this.boss.getBbHeight() / 2.0F); + double tz = targetedEntity.getZ() - sz; + + this.boss.playSound(TFSounds.KNIGHT_PHANTOM_THROW_AXE.get(), 1.0F, (this.boss.getRandom().nextFloat() - this.boss.getRandom().nextFloat()) * 0.2F + 0.4F); + this.boss.gameEvent(GameEvent.PROJECTILE_SHOOT); + ThrownWep projectile = new ThrownWep(TFEntities.THROWN_WEP.get(), this.boss.getLevel(), this.boss).setItem(new ItemStack(TFItems.KNIGHTMETAL_AXE.get())); + + float speed = 0.75F; + + projectile.shoot(tx, ty, tz, speed, 1.0F); + + projectile.moveTo(sx, sy, sz, this.boss.getYRot(), this.boss.getXRot()); + + this.boss.getLevel().addFreshEntity(projectile); + } + + private void launchPicks() { + this.boss.playSound(TFSounds.KNIGHT_PHANTOM_THROW_PICK.get(), 1.0F, (boss.getRandom().nextFloat() - boss.getRandom().nextFloat()) * 0.2F + 0.4F); + this.boss.gameEvent(GameEvent.PROJECTILE_SHOOT); + + for (int i = 0; i < 8; i++) { + float throwAngle = i * Mth.PI / 4F; + + double sx = this.boss.getX() + (Mth.cos(throwAngle) * 1); + double sy = this.boss.getY() + (this.boss.getBbHeight() * 0.82D); + double sz = this.boss.getZ() + (Mth.sin(throwAngle) * 1); + + double vx = Mth.cos(throwAngle); + double vy = 0; + double vz = Mth.sin(throwAngle); + + + ThrownWep projectile = new ThrownWep(TFEntities.THROWN_WEP.get(), this.boss.getLevel(), this.boss).setDamage(3).setVelocity(0.015F).setItem(new ItemStack(TFItems.KNIGHTMETAL_PICKAXE.get())); + + + projectile.moveTo(sx, sy, sz, i * 45F, this.boss.getXRot()); + + float speed = 0.5F; + + projectile.shoot(vx, vy, vz, speed, 1.0F); + + this.boss.getLevel().addFreshEntity(projectile); + } + } +} diff --git a/src/main/java/twilightforest/entity/ai/goal/PhantomUpdateFormationAndMoveGoal.java b/src/main/java/twilightforest/entity/ai/goal/PhantomUpdateFormationAndMoveGoal.java new file mode 100644 index 0000000000..b13cfe3ba3 --- /dev/null +++ b/src/main/java/twilightforest/entity/ai/goal/PhantomUpdateFormationAndMoveGoal.java @@ -0,0 +1,238 @@ +package twilightforest.entity.ai.goal; + +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.ai.goal.Goal; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.phys.Vec3; +import twilightforest.entity.boss.KnightPhantom; +import twilightforest.init.TFItems; + +import java.util.List; + +public class PhantomUpdateFormationAndMoveGoal extends Goal { + + private static final float CIRCLE_SMALL_RADIUS = 2.5F; + private static final float CIRCLE_LARGE_RADIUS = 8.5F; + + private final KnightPhantom boss; + + public PhantomUpdateFormationAndMoveGoal(KnightPhantom entity) { + boss = entity; + } + + @Override + public boolean canUse() { + return true; + } + + @Override + public void tick() { + this.boss.noPhysics = this.boss.getTicksProgress() % 20 != 0; + this.boss.setTicksProgress(this.boss.getTicksProgress() + 1); + if (this.boss.getTicksProgress() >= this.boss.getMaxTicksForFormation()) + switchToNextFormation(); + Vec3 dest = getDestination(); + this.boss.getMoveControl().setWantedPosition(dest.x(), dest.y(), dest.z(), this.boss.isChargingAtPlayer() ? 2 : 1); + } + + public Vec3 getDestination() { + + if (!this.boss.hasHome()) + this.boss.restrictTo(this.boss.blockPosition(), 20); + + return switch (this.boss.getCurrentFormation()) { + case LARGE_CLOCKWISE -> this.getCirclePosition(CIRCLE_LARGE_RADIUS, true); + case SMALL_CLOCKWISE -> this.getCirclePosition(CIRCLE_SMALL_RADIUS, true); + case LARGE_ANTICLOCKWISE -> this.getCirclePosition(CIRCLE_LARGE_RADIUS, false); + case SMALL_ANTICLOCKWISE -> this.getCirclePosition(CIRCLE_SMALL_RADIUS, false); + case CHARGE_PLUSX -> this.getMoveAcrossPosition(true, true); + case CHARGE_MINUSX -> this.getMoveAcrossPosition(false, true); + case CHARGE_PLUSZ -> this.getMoveAcrossPosition(true, false); + case ATTACK_PLAYER_START, HOVER -> this.getHoverPosition(CIRCLE_LARGE_RADIUS); + case CHARGE_MINUSZ -> this.getMoveAcrossPosition(false, false); + default -> this.getLoiterPosition(); + case ATTACK_PLAYER_ATTACK -> this.getAttackPlayerPosition(); + }; + } + + /** + * Called each time the current formation ends. + *

+ * If the current knight is the leader knight, it will pick and broadcast a new formation. + */ + private void switchToNextFormation() { + List nearbyKnights = this.boss.getNearbyKnights(); + + if (this.boss.getCurrentFormation() == KnightPhantom.Formation.ATTACK_PLAYER_START) { + this.boss.switchToFormation(KnightPhantom.Formation.ATTACK_PLAYER_ATTACK); + } else if (this.boss.getCurrentFormation() == KnightPhantom.Formation.ATTACK_PLAYER_ATTACK) { + if (nearbyKnights.size() > 1) { + this.boss.switchToFormation(KnightPhantom.Formation.WAITING_FOR_LEADER); + } else { + // random weapon switch! + switch (this.boss.getRandom().nextInt(3)) { + case 0 -> this.boss.setItemSlot(EquipmentSlot.MAINHAND, new ItemStack(TFItems.KNIGHTMETAL_SWORD.get())); + case 1 -> this.boss.setItemSlot(EquipmentSlot.MAINHAND, new ItemStack(TFItems.KNIGHTMETAL_AXE.get())); + case 2 -> this.boss.setItemSlot(EquipmentSlot.MAINHAND, new ItemStack(TFItems.KNIGHTMETAL_PICKAXE.get())); + } + + this.boss.switchToFormation(KnightPhantom.Formation.ATTACK_PLAYER_START); + } + } else if (this.boss.getCurrentFormation() == KnightPhantom.Formation.WAITING_FOR_LEADER) { + // try to find a nearby knight and do what they're doing + if (nearbyKnights.size() > 1) { + this.boss.switchToFormation(nearbyKnights.get(1).getCurrentFormation()); + this.boss.setTicksProgress(nearbyKnights.get(1).getTicksProgress()); + } else { + this.boss.switchToFormation(KnightPhantom.Formation.ATTACK_PLAYER_START); + } + } else { + + if (this.isThisTheLeader(nearbyKnights)) { + // pick a random formation + this.pickRandomFormation(); + + // broadcast it + this.broadcastMyFormation(nearbyKnights); + + // if no one is charging + if (this.isNobodyCharging(nearbyKnights)) { + this.makeARandomKnightCharge(nearbyKnights); + } + } + } + } + + /** + * Check within 20ish squares. If this phantom is the lowest numbered one, return true + */ + private boolean isThisTheLeader(List nearbyKnights) { + boolean iAmTheLowest = true; + + // find more knights + for (KnightPhantom knight : nearbyKnights) { + if (knight.getNumber() < this.boss.getNumber()) { + iAmTheLowest = false; + break; // don't bother checking more + } + } + + return iAmTheLowest; + } + + /** + * Pick a random formation. Called by the leader when his current formation duration ends + */ + private void pickRandomFormation() { + switch (this.boss.getRandom().nextInt(8)) { + case 0, 7 -> this.boss.switchToFormation(KnightPhantom.Formation.SMALL_CLOCKWISE); + case 1, 2 -> this.boss.switchToFormation(KnightPhantom.Formation.SMALL_ANTICLOCKWISE); + case 3 -> this.boss.switchToFormation(KnightPhantom.Formation.CHARGE_PLUSX); + case 4 -> this.boss.switchToFormation(KnightPhantom.Formation.CHARGE_MINUSX); + case 5 -> this.boss.switchToFormation(KnightPhantom.Formation.CHARGE_PLUSZ); + case 6 -> boss.switchToFormation(KnightPhantom.Formation.CHARGE_MINUSZ); + } + } + + /** + * Tell a random knight from the list to charge + */ + private void makeARandomKnightCharge(List nearbyKnights) { + int randomNum = this.boss.getRandom().nextInt(nearbyKnights.size()); + nearbyKnights.get(randomNum).switchToFormation(KnightPhantom.Formation.ATTACK_PLAYER_START); + } + + private void broadcastMyFormation(List nearbyKnights) { + // find more knights + for (KnightPhantom knight : nearbyKnights) { + if (!knight.isChargingAtPlayer()) { + knight.switchToFormation(this.boss.getCurrentFormation()); + } + } + } + + private boolean isNobodyCharging(List nearbyKnights) { + boolean noCharge = true; + for (KnightPhantom knight : nearbyKnights) { + if (knight.isChargingAtPlayer()) { + noCharge = false; + break; // don't bother checking more + } + } + + return noCharge; + } + + private Vec3 getMoveAcrossPosition(boolean plus, boolean alongX) { + float offset0 = (this.boss.getNumber() * 3F) - 7.5F; + float offset1; + + if (this.boss.getTicksProgress() < 60) { + offset1 = -7F; + } else { + offset1 = -7F + (((this.boss.getTicksProgress() - 60) / 120F) * 14F); + } + + if (!plus) { + offset1 *= -1; + } + + double dx = this.boss.getRestrictCenter().getX() + (alongX ? offset0 : offset1); + double dy = this.boss.getRestrictCenter().getY() + Math.cos(this.boss.getTicksProgress() / 7F + this.boss.getNumber()); + double dz = this.boss.getRestrictCenter().getZ() + (alongX ? offset1 : offset0); + return new Vec3(dx, dy, dz); + } + + private Vec3 getCirclePosition(float distance, boolean clockwise) { + float angle = (this.boss.getTicksProgress() * 2.0F); + + if (!clockwise) { + angle *= -1; + } + + angle += (60F * this.boss.getNumber()); + + double dx = this.boss.getRestrictCenter().getX() + Math.cos((angle) * Math.PI / 180.0D) * distance; + double dy = this.boss.getRestrictCenter().getY() + Math.cos(this.boss.getTicksProgress() / 7F + this.boss.getNumber()); + double dz = this.boss.getRestrictCenter().getZ() + Math.sin((angle) * Math.PI / 180.0D) * distance; + return new Vec3(dx, dy, dz); + } + + private Vec3 getHoverPosition(float distance) { + // bound this by distance so we don't hover in walls if we get knocked into them + + double dx = this.boss.xOld; + double dy = this.boss.getRestrictCenter().getY() + Math.cos(this.boss.getTicksProgress() / 7F + this.boss.getNumber()); + double dz = this.boss.zOld; + + // let's just bound this by 2D distance + double ox = (this.boss.getRestrictCenter().getX() - dx); + double oz = (this.boss.getRestrictCenter().getZ() - dz); + double dDist = Math.sqrt(ox * ox + oz * oz); + + if (dDist > distance) { + // normalize back to boundaries + + dx = this.boss.getRestrictCenter().getX() + (ox / dDist * distance); + dz = this.boss.getRestrictCenter().getZ() + (oz / dDist * distance); + } + + return new Vec3(dx, dy, dz); + } + + private Vec3 getLoiterPosition() { + double dx = this.boss.getRestrictCenter().getX(); + double dy = this.boss.getRestrictCenter().getY() + Math.cos(this.boss.getTicksProgress() / 7F + this.boss.getNumber()); + double dz = this.boss.getRestrictCenter().getZ(); + return new Vec3(dx, dy, dz); + } + + private Vec3 getAttackPlayerPosition() { + if (this.boss.isSwordKnight()) { + return Vec3.atLowerCornerOf(this.boss.getChargePos()); + } else { + return getHoverPosition(CIRCLE_LARGE_RADIUS); + } + + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/entity/ai/goal/PhantomWatchAndAttackGoal.java b/src/main/java/twilightforest/entity/ai/goal/PhantomWatchAndAttackGoal.java new file mode 100644 index 0000000000..55a0cd9ed9 --- /dev/null +++ b/src/main/java/twilightforest/entity/ai/goal/PhantomWatchAndAttackGoal.java @@ -0,0 +1,63 @@ +package twilightforest.entity.ai.goal; + +import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.ai.goal.Goal; +import net.minecraft.world.item.ShieldItem; +import twilightforest.entity.boss.KnightPhantom; + +public class PhantomWatchAndAttackGoal extends Goal { + + private final KnightPhantom boss; + private int attackTime; + private int guardCoolDownTime; + private boolean isGuard; + + public PhantomWatchAndAttackGoal(KnightPhantom entity) { + this.boss = entity; + } + + @Override + public boolean canUse() { + return this.boss.getTarget() != null; + } + + @Override + public void tick() { + LivingEntity target = this.boss.getTarget(); + if (target != null) { + this.boss.lookAt(target, 10.0F, 500.0F); + + if (target.isAlive()) { + float f1 = target.distanceTo(this.boss); + + if (this.boss.getSensing().hasLineOfSight(target)) { + if (attackTime-- <= 0 && f1 < 2.0F && target.getBoundingBox().maxY > this.boss.getBoundingBox().minY && this.boss.getTarget().getBoundingBox().minY < this.boss.getBoundingBox().maxY) { + attackTime = 20; + this.boss.doHurtTarget(target); + } + } + + if (this.boss.getOffhandItem().getItem() instanceof ShieldItem && this.boss.getCurrentFormation() != KnightPhantom.Formation.ATTACK_PLAYER_ATTACK && this.isGuard) { + this.boss.startUsingItem(InteractionHand.OFF_HAND); + } else { + this.boss.stopUsingItem(); + } + + if (this.isGuard) { + if (this.guardCoolDownTime <= 180) { + ++this.guardCoolDownTime; + } else { + this.isGuard = false; + } + } else { + if (this.guardCoolDownTime > 0) { + --this.guardCoolDownTime; + } else { + this.isGuard = true; + } + } + } + } + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/entity/ai/goal/QuestRamEatWoolGoal.java b/src/main/java/twilightforest/entity/ai/goal/QuestRamEatWoolGoal.java new file mode 100644 index 0000000000..4b1a5b72e2 --- /dev/null +++ b/src/main/java/twilightforest/entity/ai/goal/QuestRamEatWoolGoal.java @@ -0,0 +1,82 @@ +package twilightforest.entity.ai.goal; + +import net.minecraft.tags.ItemTags; +import net.minecraft.world.entity.ai.goal.Goal; +import net.minecraft.world.entity.ai.navigation.PathNavigation; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.item.DyeColor; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.gameevent.GameEvent; +import org.jetbrains.annotations.Nullable; +import twilightforest.entity.passive.QuestRam; + +import java.util.Comparator; +import java.util.EnumSet; +import java.util.List; + +public class QuestRamEatWoolGoal extends Goal { + private final QuestRam ram; + private final PathNavigation navigation; + @Nullable + private ItemEntity targetItem = null; + + public QuestRamEatWoolGoal(QuestRam ram) { + this.ram = ram; + this.navigation = ram.getNavigation(); + this.setFlags(EnumSet.of(Goal.Flag.MOVE, Goal.Flag.LOOK)); + } + + @Override + public boolean canUse() { + //sort through valid items, get the closest one + //we want to check if the item is valid and not in the air, that the ram can see it, and that its actually wool + List items = this.ram.getLevel().getEntitiesOfClass(ItemEntity.class, this.ram.getBoundingBox().inflate(16.0D), item -> + (item.isOnGround() || item.isInWater()) && item.isAlive() && + !item.getItem().isEmpty() && this.ram.hasLineOfSight(item) && this.isTempting(item.getItem())); + items.sort(Comparator.comparingDouble(this.ram::distanceToSqr)); + + if (!items.isEmpty()) { + this.targetItem = items.get(0); + return true; + } + return false; + } + + protected boolean isTempting(ItemStack stack) { + if (stack.is(ItemTags.WOOL)) { + DyeColor color = this.ram.guessColor(stack); + return color != null && !this.ram.isColorPresent(color); + } + return false; + } + + @Override + public boolean canContinueToUse() { + return this.ram.isAlive() && !this.navigation.isStuck() && !this.navigation.isDone() && + this.targetItem != null && this.targetItem.isAlive() && this.isTempting(this.targetItem.getItem()); + } + + @Override + public void start() { + if (this.targetItem != null) { + this.navigation.stop(); + this.ram.getLookControl().setLookAt(this.targetItem, this.ram.getMaxHeadYRot() + 20, this.ram.getMaxHeadXRot()); + this.navigation.moveTo(this.targetItem, 1.0D); + } + } + + @Override + public void tick() { + super.tick(); + if (!this.ram.getLevel().isClientSide()) { + if (this.targetItem != null && this.isTempting(this.targetItem.getItem())) { + this.ram.getLookControl().setLookAt(this.targetItem, this.ram.getMaxHeadYRot() + 20, this.ram.getMaxHeadXRot()); + if (this.ram.distanceToSqr(this.targetItem.position()) < 6.25D && this.ram.tryAccept(this.targetItem.getItem())) { + //consume the wool + this.targetItem.discard(); + this.ram.gameEvent(GameEvent.EAT); + } + } + } + } +} diff --git a/src/main/java/twilightforest/entity/ai/goal/RedcapBaseGoal.java b/src/main/java/twilightforest/entity/ai/goal/RedcapBaseGoal.java new file mode 100644 index 0000000000..cfd82cff17 --- /dev/null +++ b/src/main/java/twilightforest/entity/ai/goal/RedcapBaseGoal.java @@ -0,0 +1,57 @@ +package twilightforest.entity.ai.goal; + +import net.minecraft.core.BlockPos; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.ai.goal.Goal; +import net.minecraft.world.entity.item.PrimedTnt; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.phys.AABB; +import twilightforest.entity.monster.Redcap; + +import org.jetbrains.annotations.Nullable; + +public abstract class RedcapBaseGoal extends Goal { + + protected final Redcap redcap; + + protected RedcapBaseGoal(Redcap entity) { + this.redcap = entity; + } + + /** + * Fairly straightforward. Returns true in a 120 degree arc in front of the target's view. + */ + public boolean isTargetLookingAtMe(LivingEntity attackTarget) { + // find angle of approach + double dx = this.redcap.getX() - attackTarget.getX(); + double dz = this.redcap.getZ() - attackTarget.getZ(); + float angle = (float) ((Math.atan2(dz, dx) * 180D) / Math.PI) - 90F; + + float difference = Mth.abs((attackTarget.getYRot() - angle) % 360); + + return difference < 60 || difference > 300; + } + + @Nullable + public BlockPos findBlockTNTNearby(int range) { + BlockPos entityPos = this.redcap.blockPosition(); + + for (int x = -range; x <= range; x++) { + for (int y = -range; y <= range; y++) { + for (int z = -range; z <= range; z++) { + if (this.redcap.getLevel().getBlockState(entityPos.offset(x, y, z)).getBlock() == Blocks.TNT) { + return entityPos.offset(x, y, z); + } + } + } + } + + return null; + } + + public boolean isLitTNTNearby(int range) { + AABB expandedBox = this.redcap.getBoundingBox().inflate(range, range, range); + return !this.redcap.getLevel().getEntitiesOfClass(PrimedTnt.class, expandedBox).isEmpty(); + } +} diff --git a/src/main/java/twilightforest/entity/ai/goal/RedcapLightTNTGoal.java b/src/main/java/twilightforest/entity/ai/goal/RedcapLightTNTGoal.java new file mode 100644 index 0000000000..3611162bf3 --- /dev/null +++ b/src/main/java/twilightforest/entity/ai/goal/RedcapLightTNTGoal.java @@ -0,0 +1,81 @@ +package twilightforest.entity.ai.goal; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.gameevent.GameEvent; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.event.ForgeEventFactory; +import twilightforest.entity.monster.Redcap; + +import java.util.EnumSet; + +public class RedcapLightTNTGoal extends RedcapBaseGoal { + + private final float pursueSpeed; + private int delay; + private BlockPos tntPos = null; + + public RedcapLightTNTGoal(Redcap hostEntity, float speed) { + super(hostEntity); + this.pursueSpeed = speed; + this.setFlags(EnumSet.of(Flag.MOVE, Flag.LOOK)); + } + + @Override + public boolean canUse() { + if (!ForgeEventFactory.getMobGriefingEvent(this.redcap.getLevel(), this.redcap)) { + return false; + } + + if (this.delay > 0) { + --this.delay; + return false; + } + + BlockPos nearbyTNT = this.findBlockTNTNearby(8); + if (nearbyTNT != null) { + this.tntPos = nearbyTNT; + return true; + } + + return false; + } + + @Override + public boolean canContinueToUse() { + return this.redcap.getLevel().getBlockState(this.tntPos).is(Blocks.TNT); + } + + @Override + public void start() { + this.redcap.setItemSlot(EquipmentSlot.MAINHAND, this.redcap.heldFlint); + } + + @Override + public void stop() { + this.redcap.getNavigation().stop(); + this.redcap.setItemSlot(EquipmentSlot.MAINHAND, this.redcap.heldPick); + this.delay = 20; + this.tntPos = null; + } + + @Override + public void tick() { + this.redcap.getLookControl().setLookAt(this.tntPos.getX(), this.tntPos.getY(), this.tntPos.getZ(), 30.0F, this.redcap.getMaxHeadXRot()); + + if (this.redcap.distanceToSqr(Vec3.atLowerCornerOf(this.tntPos)) < 2.4D * 2.4D) { + redcap.playAmbientSound(); + + Blocks.TNT.onCaughtFire(Blocks.TNT.defaultBlockState(), this.redcap.getLevel(), this.tntPos, Direction.UP, this.redcap); + this.redcap.swing(InteractionHand.MAIN_HAND); + this.redcap.getLevel().setBlock(this.tntPos, Blocks.AIR.defaultBlockState(), 2); + this.redcap.gameEvent(GameEvent.PRIME_FUSE); + this.redcap.getNavigation().stop(); + } else { + this.redcap.getNavigation().moveTo(this.tntPos.getX(), this.tntPos.getY(), this.tntPos.getZ(), this.pursueSpeed); + } + } +} diff --git a/src/main/java/twilightforest/entity/ai/goal/RedcapPlantTNTGoal.java b/src/main/java/twilightforest/entity/ai/goal/RedcapPlantTNTGoal.java new file mode 100644 index 0000000000..40b6ad305c --- /dev/null +++ b/src/main/java/twilightforest/entity/ai/goal/RedcapPlantTNTGoal.java @@ -0,0 +1,47 @@ +package twilightforest.entity.ai.goal; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.gameevent.GameEvent; +import net.minecraftforge.event.ForgeEventFactory; +import twilightforest.entity.monster.Redcap; + +public class RedcapPlantTNTGoal extends RedcapBaseGoal { + + public RedcapPlantTNTGoal(Redcap entityTFRedcap) { + super(entityTFRedcap); + } + + @Override + public boolean canUse() { + LivingEntity attackTarget = this.redcap.getTarget(); + return attackTarget != null + && !this.redcap.heldTNT.isEmpty() + && this.redcap.distanceToSqr(attackTarget) < 25 + && !isTargetLookingAtMe(attackTarget) + && ForgeEventFactory.getMobGriefingEvent(this.redcap.getLevel(), this.redcap) + && !isLitTNTNearby(8) + && findBlockTNTNearby(5) == null; + } + + @Override + public void start() { + BlockPos entityPos = new BlockPos(this.redcap.blockPosition()); + + this.redcap.setItemSlot(EquipmentSlot.MAINHAND, this.redcap.heldTNT); + + if (this.redcap.getLevel().isEmptyBlock(entityPos)) { + this.redcap.heldTNT.shrink(1); + this.redcap.playAmbientSound(); + this.redcap.getLevel().setBlockAndUpdate(entityPos, Blocks.TNT.defaultBlockState()); + this.redcap.gameEvent(GameEvent.BLOCK_PLACE); + } + } + + @Override + public void stop() { + this.redcap.setItemSlot(EquipmentSlot.MAINHAND, this.redcap.heldPick); + } +} diff --git a/src/main/java/twilightforest/entity/ai/goal/RedcapShyGoal.java b/src/main/java/twilightforest/entity/ai/goal/RedcapShyGoal.java new file mode 100644 index 0000000000..a8e8296093 --- /dev/null +++ b/src/main/java/twilightforest/entity/ai/goal/RedcapShyGoal.java @@ -0,0 +1,101 @@ +package twilightforest.entity.ai.goal; + +import net.minecraft.util.Mth; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.phys.Vec3; +import twilightforest.entity.monster.Redcap; + +import java.util.EnumSet; + +public class RedcapShyGoal extends RedcapBaseGoal { + + private LivingEntity entityTarget; + private final float speed; + private final boolean lefty = Math.random() < 0.5; + private double targetX; + private double targetY; + private double targetZ; + + private static final double minDistance = 3.0; + private static final double maxDistance = 6.0; + + public RedcapShyGoal(Redcap entityTFRedcap, float moveSpeed) { + super(entityTFRedcap); + this.speed = moveSpeed; + this.setFlags(EnumSet.of(Flag.MOVE, Flag.LOOK)); + } + + @Override + public boolean canUse() { + LivingEntity attackTarget = this.redcap.getTarget(); + + if (attackTarget == null + || !this.redcap.isShy() + || attackTarget.distanceTo(this.redcap) > maxDistance + || attackTarget.distanceTo(this.redcap) < minDistance + || !isTargetLookingAtMe(attackTarget)) { + return false; + } else { + this.entityTarget = attackTarget; + Vec3 avoidPos = findCirclePoint(this.redcap, this.entityTarget, 5, this.lefty ? 1 : -1); + + this.targetX = avoidPos.x(); + this.targetY = avoidPos.y(); + this.targetZ = avoidPos.z(); + return true; + } + + } + + /** + * Execute a one shot task or start executing a continuous task + */ + @Override + public void start() { + this.redcap.getNavigation().moveTo(this.targetX, this.targetY, this.targetZ, this.speed); + } + + @Override + public boolean canContinueToUse() { + LivingEntity attackTarget = this.redcap.getTarget(); + + if (attackTarget == null) { + return false; + } else if (!this.entityTarget.isAlive()) { + return false; + } else if (this.redcap.getNavigation().isDone()) { + return false; + } + + return this.redcap.isShy() && attackTarget.distanceTo(this.redcap) < maxDistance && attackTarget.distanceTo(this.redcap) > minDistance && isTargetLookingAtMe(attackTarget); + } + + @Override + public void tick() { + this.redcap.getLookControl().setLookAt(this.entityTarget, 30.0F, 30.0F); + } + + @Override + public void stop() { + this.entityTarget = null; + this.redcap.getNavigation().stop(); + } + + private Vec3 findCirclePoint(Entity circler, Entity toCircle, double radius, double rotation) { + // compute angle + double vecx = circler.getX() - toCircle.getX(); + double vecz = circler.getZ() - toCircle.getZ(); + float rangle = (float) (Math.atan2(vecz, vecx)); + + // add a little, so he circles + rangle += rotation; + + // figure out where we're headed from the target angle + double dx = Mth.cos(rangle) * radius; + double dz = Mth.sin(rangle) * radius; + + // add that to the target entity's position, and we have our destination + return new Vec3(toCircle.getX() + dx, circler.getBoundingBox().minY, toCircle.getZ() + dz); + } +} diff --git a/src/main/java/twilightforest/entity/ai/goal/RiderSpearAttackGoal.java b/src/main/java/twilightforest/entity/ai/goal/RiderSpearAttackGoal.java new file mode 100644 index 0000000000..a108d2d952 --- /dev/null +++ b/src/main/java/twilightforest/entity/ai/goal/RiderSpearAttackGoal.java @@ -0,0 +1,28 @@ +package twilightforest.entity.ai.goal; + +import net.minecraft.world.entity.EntitySelector; +import net.minecraft.world.entity.ai.goal.Goal; +import twilightforest.entity.monster.LowerGoblinKnight; +import twilightforest.entity.monster.UpperGoblinKnight; + +import java.util.EnumSet; + +public class RiderSpearAttackGoal extends Goal { + + private final LowerGoblinKnight entity; + + public RiderSpearAttackGoal(LowerGoblinKnight lowerKnight) { + this.entity = lowerKnight; + this.setFlags(EnumSet.of(Flag.MOVE, Flag.LOOK)); // Prevent moving + } + + @Override + public boolean canUse() { + if (!this.entity.getPassengers().isEmpty() && this.entity.getPassengers().get(0) instanceof UpperGoblinKnight && this.entity.getTarget() != null && EntitySelector.NO_CREATIVE_OR_SPECTATOR.and(EntitySelector.LIVING_ENTITY_STILL_ALIVE).test(this.entity.getTarget())) { + int timer = ((UpperGoblinKnight) this.entity.getPassengers().get(0)).heavySpearTimer; + return timer > 0 && timer < UpperGoblinKnight.HEAVY_SPEAR_TIMER_START; + } else { + return false; + } + } +} diff --git a/src/main/java/twilightforest/entity/ai/goal/SimplifiedAttackGoal.java b/src/main/java/twilightforest/entity/ai/goal/SimplifiedAttackGoal.java new file mode 100644 index 0000000000..dddadcfdb4 --- /dev/null +++ b/src/main/java/twilightforest/entity/ai/goal/SimplifiedAttackGoal.java @@ -0,0 +1,69 @@ +package twilightforest.entity.ai.goal; + +import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.PathfinderMob; +import net.minecraft.world.entity.ai.goal.Goal; +import twilightforest.entity.boss.Naga; +import twilightforest.entity.monster.Wraith; + +public class SimplifiedAttackGoal extends Goal { + + private final Mob mob; + private int attackTick; + + public SimplifiedAttackGoal(Mob mob) { + this.mob = mob; + } + + @Override + public boolean canUse() { + LivingEntity target = mob.getTarget(); + return target != null && this.getAttackReachSqr(target) >= this.mob.distanceToSqr(target.getX(), target.getY(), target.getZ()); + } + + @Override + public boolean requiresUpdateEveryTick() { + return true; + } + + @Override + public void start() { + this.attackTick = 0; + } + + @Override + public void stop() { + this.attackTick = 0; + } + + @Override + public void tick() { + if (this.attackTick > 0) { + this.attackTick--; + } else { + LivingEntity livingentity = this.mob.getTarget(); + if (livingentity == null) { + this.stop(); + return; + } + double d0 = this.mob.getPerceivedTargetDistanceSquareForMeleeAttack(livingentity); + this.checkAndPerformAttack(livingentity, d0); + } + } + + protected void checkAndPerformAttack(LivingEntity entity, double distance) { + double d0 = this.getAttackReachSqr(entity); + if (distance <= d0) { + this.attackTick = this.adjustedTickDelay(20); + this.mob.swing(InteractionHand.MAIN_HAND); + this.mob.doHurtTarget(entity); + } + + } + + protected double getAttackReachSqr(LivingEntity entity) { + return this.mob.getBbWidth() * 2.0F * this.mob.getBbWidth() * 2.0F + entity.getBbWidth(); + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/entity/ai/goal/ThrowRiderGoal.java b/src/main/java/twilightforest/entity/ai/goal/ThrowRiderGoal.java new file mode 100644 index 0000000000..60d3c156eb --- /dev/null +++ b/src/main/java/twilightforest/entity/ai/goal/ThrowRiderGoal.java @@ -0,0 +1,111 @@ +package twilightforest.entity.ai.goal; + +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.PathfinderMob; +import net.minecraft.world.entity.ai.goal.MeleeAttackGoal; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.common.Tags; +import net.minecraftforge.network.PacketDistributor; +import twilightforest.capabilities.CapabilityList; +import twilightforest.data.tags.EntityTagGenerator; +import twilightforest.events.HostileMountEvents; +import twilightforest.network.TFPacketHandler; +import twilightforest.network.ThrowPlayerPacket; + +public class ThrowRiderGoal extends MeleeAttackGoal { + + private int throwTimer; + private int timeout; + private int cooldown; + + public ThrowRiderGoal(PathfinderMob creature, double speedIn, boolean useLongMemory) { + super(creature, speedIn, useLongMemory); + } + + @Override + public boolean canUse() { + return this.mob.getPassengers().isEmpty() && + this.mob.getTarget() != null && + !this.mob.getTarget().getType().is(Tags.EntityTypes.BOSSES) && + this.mob.getTarget().getCapability(CapabilityList.YETI_THROWN).map(cap -> cap.getThrowCooldown() <= 0).orElse(true) && + super.canUse(); + } + + @Override + public void start() { + this.throwTimer = 10 + this.mob.getRandom().nextInt(30); // Wait 0.5 to 2 seconds before we throw the target + this.timeout = 80 + this.mob.getRandom().nextInt(40); // Lets only try to chase for around 4-6 seconds + super.start(); + } + + @Override + public void tick() { + this.timeout--; + if (!this.mob.getPassengers().isEmpty()) + this.throwTimer--; + else + super.tick(); + } + + // Vanilla Copy with edits + @Override + protected void checkAndPerformAttack(LivingEntity victim, double p_190102_2_) { + double d0 = this.getAttackReachSqr(victim); + + if (p_190102_2_ <= d0 && this.getTicksUntilNextAttack() <= 0 && this.mob.getPassengers().isEmpty() && this.cooldown-- == 0) { + this.cooldown = 3; // Gives the thrower a pause so it doesn't pick the target back up immediately after throwing; for whatever reason the attack cooldown isn't enough... + this.resetAttackCooldown(); + this.mob.swing(InteractionHand.MAIN_HAND); + if (this.mob.getPassengers().isEmpty()) { + var v = victim.getVehicle(); + + if (v == null || !v.getType().is(EntityTagGenerator.RIDES_OBSTRUCT_SNATCHING)) { + // Pluck them from the boat, minecart, donkey, or whatever + victim.stopRiding(); + + victim.startRiding(this.mob, true); + } + } + } + } + + @Override + public void stop() { + if (!this.mob.getPassengers().isEmpty()) { + Entity rider = this.mob.getPassengers().get(0); + HostileMountEvents.allowDismount = true; + rider.stopRiding(); + HostileMountEvents.allowDismount = false; + + Vec3 throwVec = this.mob.getLookAngle().scale(2); + throwVec = new Vec3(throwVec.x(), 0.9, throwVec.z()); + + rider.push(throwVec.x(), throwVec.y(), throwVec.z()); + + if (rider instanceof LivingEntity entity) { + entity.getCapability(CapabilityList.YETI_THROWN).ifPresent(cap -> { + if (entity instanceof Player) + cap.setThrown(true, this.mob); + //make it so other yetis wont try to pick us up for a bit, 10 seconds seems fair + cap.setThrowCooldown(200); + }); + } + + if (rider instanceof ServerPlayer player) { + ThrowPlayerPacket message = new ThrowPlayerPacket(throwVec.x(), throwVec.y(), throwVec.z()); + TFPacketHandler.CHANNEL.send(PacketDistributor.PLAYER.with(() -> player), message); + } + } + super.stop(); + } + + @Override + public boolean canContinueToUse() { + return (this.throwTimer > 0 && !this.mob.getPassengers().isEmpty()) || (this.timeout > 0 && super.canContinueToUse() && this.mob.getPassengers().isEmpty()); + } + +} diff --git a/src/main/java/twilightforest/entity/ai/goal/ThrowSpikeBlockGoal.java b/src/main/java/twilightforest/entity/ai/goal/ThrowSpikeBlockGoal.java new file mode 100644 index 0000000000..68b8b003ca --- /dev/null +++ b/src/main/java/twilightforest/entity/ai/goal/ThrowSpikeBlockGoal.java @@ -0,0 +1,45 @@ +package twilightforest.entity.ai.goal; + +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.ai.goal.Goal; +import net.minecraft.world.level.gameevent.GameEvent; +import twilightforest.entity.SpikeBlock; +import twilightforest.entity.monster.BlockChainGoblin; + +import java.util.EnumSet; + +public class ThrowSpikeBlockGoal extends Goal { + + protected final BlockChainGoblin attacker; + protected final SpikeBlock spikeBlock; + private int cooldown; + + public ThrowSpikeBlockGoal(BlockChainGoblin goblin, SpikeBlock block) { + this.attacker = goblin; + this.spikeBlock = block; + this.setFlags(EnumSet.of(Flag.MOVE, Flag.LOOK)); + } + + @Override + public boolean canUse() { + LivingEntity target = this.attacker.getTarget(); + if (target == null || this.attacker.distanceToSqr(target) > 42 || this.cooldown > 0) { + this.cooldown--; + return false; + } else { + return this.attacker.isAlive() && this.attacker.hasLineOfSight(target) && this.attacker.getLevel().getRandom().nextInt(56) == 0; + } + } + + @Override + public boolean canContinueToUse() { + return this.attacker.getChainMoveLength() > 0; + } + + @Override + public void start() { + this.attacker.setThrowing(true); + this.cooldown = 100 + this.attacker.getLevel().getRandom().nextInt(100); + this.attacker.gameEvent(GameEvent.PROJECTILE_SHOOT); + } +} diff --git a/src/main/java/twilightforest/entity/ai/goal/UrGhastFlightGoal.java b/src/main/java/twilightforest/entity/ai/goal/UrGhastFlightGoal.java new file mode 100644 index 0000000000..934d27534e --- /dev/null +++ b/src/main/java/twilightforest/entity/ai/goal/UrGhastFlightGoal.java @@ -0,0 +1,102 @@ +package twilightforest.entity.ai.goal; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.ai.control.MoveControl; +import net.minecraft.world.entity.ai.goal.Goal; +import twilightforest.TwilightForestMod; +import twilightforest.entity.boss.UrGhast; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.EnumSet; +import java.util.List; + +public class UrGhastFlightGoal extends Goal { + + //private static final int CRUISING_ALTITUDE = 235; // absolute cruising altitude + private static final int HOVER_ALTITUDE = 20; // how far, relatively, do we hover over ghast traps? + private final UrGhast ghast; + + private List pointsToVisit; + private int currentPoint = 0; + + public UrGhastFlightGoal(UrGhast ghast) { + this.ghast = ghast; + setFlags(EnumSet.of(Flag.MOVE)); + } + + // [VanillaCopy] Ghast.RandomFloatAroundGoal + @Override + public boolean canUse() { + MoveControl entitymovehelper = this.ghast.getMoveControl(); + this.pointsToVisit = this.createPath(); + if (this.pointsToVisit.isEmpty()) return false; + + if (!entitymovehelper.hasWanted()) { + return true; + } else { + double d0 = entitymovehelper.getWantedX() - this.ghast.getX(); + double d1 = entitymovehelper.getWantedY() - this.ghast.getY(); + double d2 = entitymovehelper.getWantedZ() - this.ghast.getZ(); + double d3 = d0 * d0 + d1 * d1 + d2 * d2; + return d3 < 1.0D || d3 > 3600.0D; + } + } + + @Override + public boolean canContinueToUse() { + return false; + } + + @Override + public void start() { + + if (this.pointsToVisit.isEmpty()) { + this.pointsToVisit.addAll(this.createPath()); + } else { + if (this.currentPoint >= this.pointsToVisit.size()) { + this.currentPoint = 0; + + // when we're in tantrum mode, this is a good time to check if we need to spawn more ghasts + if (!this.ghast.checkGhastsAtTraps()) { + this.ghast.spawnGhastsAtTraps(); + } + } + + // TODO reintroduce wanderFactor somehow? Would need to change move helper or add extra fields here + + double x = this.pointsToVisit.get(this.currentPoint).getX(); + double y = this.pointsToVisit.get(this.currentPoint).getY() + (this.ghast.hasRestriction() ? HOVER_ALTITUDE : 0); + double z = this.pointsToVisit.get(this.currentPoint).getZ(); + this.ghast.getMoveControl().setWantedPosition(x, y, z, 1.0F); + this.currentPoint++; + + // we have reached cruising altitude, time to turn noClip off + this.ghast.noPhysics = false; + } + } + + private List createPath() { + List potentialPoints = new ArrayList<>(); + BlockPos pos = new BlockPos(this.ghast.getLogicalScanPoint()); + + if (!this.ghast.getTrapLocations().isEmpty()) { + // make a copy of the trap locations list + potentialPoints.addAll(this.ghast.getTrapLocations()); + } else { + potentialPoints.add(pos.offset(20, 0, 0)); + potentialPoints.add(pos.offset(0, 0, -20)); + potentialPoints.add(pos.offset(-20, 0, 0)); + potentialPoints.add(pos.offset(0, 0, 20)); + } + + Collections.shuffle(potentialPoints); + + if (this.ghast.getTrapLocations().isEmpty()) { + // if in no trap mode, head back to the middle when we're done + potentialPoints.add(pos); + } + + return potentialPoints; + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/entity/ai/goal/YetiRampageGoal.java b/src/main/java/twilightforest/entity/ai/goal/YetiRampageGoal.java new file mode 100644 index 0000000000..d3e00e234c --- /dev/null +++ b/src/main/java/twilightforest/entity/ai/goal/YetiRampageGoal.java @@ -0,0 +1,111 @@ +package twilightforest.entity.ai.goal; + +import net.minecraft.world.entity.ai.goal.Goal; +import net.minecraft.world.level.gameevent.GameEvent; +import net.minecraft.world.phys.Vec3; +import twilightforest.init.TFSounds; +import twilightforest.init.TFEntities; +import twilightforest.entity.projectile.IceBomb; +import twilightforest.entity.boss.AlphaYeti; + +import java.util.EnumSet; + +public class YetiRampageGoal extends Goal { + + private final AlphaYeti yeti; + private int currentTimeOut; + private int currentDuration; + private final int maxTantrumTimeOut; + private final int tantrumDuration; + + public YetiRampageGoal(AlphaYeti yeti, int timeout, int duration) { + this.yeti = yeti; + this.currentTimeOut = timeout; + this.maxTantrumTimeOut = timeout; + this.tantrumDuration = duration; + + this.setFlags(EnumSet.of(Flag.MOVE, Flag.JUMP)); + } + + @Override + public boolean canUse() { + if (this.yeti.getTarget() != null && this.yeti.canRampage()) { + this.currentTimeOut--; + } + + return this.currentTimeOut <= 0; + } + + /** + * Execute a one shot task or start executing a continuous task + */ + @Override + public void start() { + this.currentDuration = this.tantrumDuration; + this.yeti.setRampaging(true); + this.yeti.playSound(TFSounds.ALPHA_YETI_ROAR.get(), 4F, 0.5F + yeti.getRandom().nextFloat() * 0.5F); + this.yeti.gameEvent(GameEvent.ENTITY_ROAR); + } + + /** + * Returns whether an in-progress EntityAIBase should continue executing + */ + @Override + public boolean canContinueToUse() { + return currentDuration > 0; + } + + /** + * Updates the task + */ + @Override + public void tick() { + this.currentDuration--; + + if (this.yeti.getTarget() != null) { + this.yeti.getLookControl().setLookAt(this.yeti.getTarget(), 10.0F, this.yeti.getMaxHeadXRot()); + } + + if (this.yeti.isOnGround()) { + this.yeti.setDeltaMovement(0, 0.4D, 0); + this.yeti.gameEvent(GameEvent.HIT_GROUND); + } + + this.yeti.destroyBlocksInAABB(this.yeti.getBoundingBox().inflate(1, 2, 1).move(0, 2, 0)); + + // regular falling blocks, twice a second + if (this.currentDuration % 10 == 0) { + this.yeti.makeRandomBlockFall(30, 80); + } + + // blocks target players, one every second + if (this.currentDuration % 20 == 0) { + this.yeti.makeBlockAboveTargetFall(); + } + + // blocks that fall close to the yeti, twice a second near the end of the rampage + if (this.currentDuration < 40 && this.currentDuration % 10 == 0) { + this.yeti.makeRandomBlockFall(15, 40); + } + + if (this.currentDuration % 20 == 0) { + IceBomb ice = new IceBomb(TFEntities.THROWN_ICE.get(), this.yeti.getLevel(), this.yeti); + Vec3 vec = new Vec3(0.5F + this.yeti.getRandom().nextFloat() * 0.5F, 0.5F + this.yeti.getRandom().nextFloat() * 0.3F, 0).yRot(this.yeti.getRandom().nextFloat() * 360F); + ice.shoot(vec.x(), vec.y(), vec.z(), 0.4F + yeti.getRandom().nextFloat() * 0.3F, 0); + this.yeti.playSound(TFSounds.ALPHA_YETI_ICE.get(), 1.0F, 1.0F / (this.yeti.getRandom().nextFloat() * 0.4F + 0.8F)); + this.yeti.gameEvent(GameEvent.PROJECTILE_SHOOT); + this.yeti.getLevel().addFreshEntity(ice); + } + } + + /** + * Resets the task + */ + @Override + public void stop() { + this.currentTimeOut = this.maxTantrumTimeOut; + this.yeti.setRampaging(false); + this.yeti.setTired(true); + + } +} diff --git a/src/main/java/twilightforest/entity/ai/goal/YetiTiredGoal.java b/src/main/java/twilightforest/entity/ai/goal/YetiTiredGoal.java new file mode 100644 index 0000000000..82e9a035d3 --- /dev/null +++ b/src/main/java/twilightforest/entity/ai/goal/YetiTiredGoal.java @@ -0,0 +1,52 @@ +package twilightforest.entity.ai.goal; + +import net.minecraft.world.entity.ai.goal.Goal; +import twilightforest.entity.boss.AlphaYeti; +import twilightforest.init.TFSounds; + +import java.util.EnumSet; + +public class YetiTiredGoal extends Goal { + + private final AlphaYeti yeti; + private final int tiredDuration; + private int tiredTimer; + + public YetiTiredGoal(AlphaYeti alpha, int i) { + this.yeti = alpha; + this.tiredDuration = i; + this.setFlags(EnumSet.of(Flag.MOVE, Flag.JUMP)); + } + + @Override + public boolean canUse() { + return this.yeti.isTired(); + } + + @Override + public boolean canContinueToUse() { + return this.tiredTimer < this.tiredDuration; + } + + @Override + public boolean isInterruptable() { + return false; + } + + @Override + public void start() { + this.tiredTimer = 0; + } + + @Override + public void stop() { + this.tiredTimer = 0; + this.yeti.setTired(false); + } + + @Override + public void tick() { + if (++this.tiredTimer % 10 == 0) + this.yeti.playSound(TFSounds.ALPHA_YETI_PANT.get(), 4F, 0.5F + this.yeti.getRandom().nextFloat() * 0.5F); + } +} diff --git a/src/main/java/twilightforest/entity/ai/goal/package-info.java b/src/main/java/twilightforest/entity/ai/goal/package-info.java new file mode 100644 index 0000000000..c4e451f175 --- /dev/null +++ b/src/main/java/twilightforest/entity/ai/goal/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.entity.ai.goal; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/entity/boss/AlphaYeti.java b/src/main/java/twilightforest/entity/boss/AlphaYeti.java new file mode 100644 index 0000000000..27b8ecf927 --- /dev/null +++ b/src/main/java/twilightforest/entity/boss/AlphaYeti.java @@ -0,0 +1,463 @@ +package twilightforest.entity.boss; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.network.syncher.EntityDataAccessor; +import net.minecraft.network.syncher.EntityDataSerializers; +import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.server.level.ServerBossEvent; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.tags.BlockTags; +import net.minecraft.tags.DamageTypeTags; +import net.minecraft.util.Mth; +import net.minecraft.world.BossEvent; +import net.minecraft.world.Difficulty; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.goal.*; +import net.minecraft.world.entity.ai.goal.target.HurtByTargetGoal; +import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal; +import net.minecraft.world.entity.monster.Monster; +import net.minecraft.world.entity.monster.RangedAttackMob; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.gameevent.GameEvent; +import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.event.ForgeEventFactory; +import net.minecraftforge.fluids.FluidType; +import org.jetbrains.annotations.Nullable; +import twilightforest.advancements.TFAdvancements; +import twilightforest.entity.EnforcedHomePoint; +import twilightforest.entity.IHostileMount; +import twilightforest.entity.ai.goal.ThrowRiderGoal; +import twilightforest.entity.ai.goal.YetiRampageGoal; +import twilightforest.entity.ai.goal.YetiTiredGoal; +import twilightforest.entity.projectile.FallingIce; +import twilightforest.entity.projectile.IceBomb; +import twilightforest.init.*; +import twilightforest.loot.TFLootTables; +import twilightforest.util.EntityUtil; +import twilightforest.util.LandmarkUtil; +import twilightforest.util.WorldUtil; + +import java.util.ArrayList; +import java.util.List; + +public class AlphaYeti extends Monster implements RangedAttackMob, IHostileMount, EnforcedHomePoint { + + private static final EntityDataAccessor RAMPAGE_FLAG = SynchedEntityData.defineId(AlphaYeti.class, EntityDataSerializers.BYTE); + private static final EntityDataAccessor TIRED_FLAG = SynchedEntityData.defineId(AlphaYeti.class, EntityDataSerializers.BYTE); + private final ServerBossEvent bossInfo = new ServerBossEvent(this.getDisplayName(), BossEvent.BossBarColor.WHITE, BossEvent.BossBarOverlay.PROGRESS); + private int collisionCounter; + private boolean canRampage; + private final List hurtBy = new ArrayList<>(); + + public AlphaYeti(EntityType type, Level world) { + super(type, world); + this.xpReward = 317; + } + + @Override + protected void registerGoals() { + this.goalSelector.addGoal(0, new FloatGoal(this)); + this.goalSelector.addGoal(1, new YetiTiredGoal(this, 100)); + this.goalSelector.addGoal(3, new YetiRampageGoal(this, 10, 180)); + this.goalSelector.addGoal(4, new RangedAttackGoal(this, 1.0D, 40, 40, 40.0F) { + @Override + public boolean canUse() { + return AlphaYeti.this.getRandom().nextInt(50) > 0 && AlphaYeti.this.getTarget() != null && AlphaYeti.this.distanceToSqr(AlphaYeti.this.getTarget()) >= 16D && super.canUse(); // Give us a chance to move to the next AI + } + }); + this.goalSelector.addGoal(4, new ThrowRiderGoal(this, 1.0D, false) { + @Override + protected void checkAndPerformAttack(LivingEntity victim, double p_190102_2_) { + super.checkAndPerformAttack(victim, p_190102_2_); + if (!AlphaYeti.this.getPassengers().isEmpty()) + AlphaYeti.this.playSound(TFSounds.ALPHA_YETI_GRAB.get(), 4F, 0.75F + AlphaYeti.this.getRandom().nextFloat() * 0.25F); + } + + @Override + public void stop() { + if (!AlphaYeti.this.getPassengers().isEmpty()) + AlphaYeti.this.playSound(TFSounds.ALPHA_YETI_THROW.get(), 4F, 0.75F + AlphaYeti.this.getRandom().nextFloat() * 0.25F); + super.stop(); + } + }); + this.addRestrictionGoals(this, this.goalSelector); + this.goalSelector.addGoal(5, new WaterAvoidingRandomStrollGoal(this, 2.0D)); + this.goalSelector.addGoal(6, new LookAtPlayerGoal(this, Player.class, 8.0F)); + this.goalSelector.addGoal(7, new RandomLookAroundGoal(this)); + this.targetSelector.addGoal(1, new HurtByTargetGoal(this)); + this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true)); + } + + @Override + protected void defineSynchedData() { + super.defineSynchedData(); + this.entityData.define(RAMPAGE_FLAG, (byte) 0); + this.entityData.define(TIRED_FLAG, (byte) 0); + } + + public static AttributeSupplier.Builder registerAttributes() { + return Monster.createMonsterAttributes() + .add(Attributes.MAX_HEALTH, 200.0D) + .add(Attributes.MOVEMENT_SPEED, 0.38D) + .add(Attributes.ATTACK_DAMAGE, 1.0D) + .add(Attributes.FOLLOW_RANGE, 40.0D) + .add(Attributes.KNOCKBACK_RESISTANCE, 0.5D); + } + + @Override + public void aiStep() { + if (!this.getPassengers().isEmpty() && this.getPassengers().get(0).isShiftKeyDown()) { + this.getPassengers().get(0).setShiftKeyDown(false); + } + + super.aiStep(); + + if (this.isVehicle()) { + this.getLookControl().setLookAt(getPassengers().get(0), 100F, 100F); + } + + if (!this.getLevel().isClientSide()) { + this.bossInfo.setProgress(this.getHealth() / this.getMaxHealth()); + + if (this.isRampaging() && (this.horizontalCollision || this.verticalCollision)) { //collided does not exist, but this is an equal? + this.collisionCounter++; + } + + if (this.collisionCounter >= 15) { + this.destroyBlocksInAABB(this.getBoundingBox()); + this.collisionCounter = 0; + } + } else { + if (this.isRampaging()) { + float rotation = this.tickCount / 10F; + + for (int i = 0; i < 20; i++) { + addSnowEffect(rotation + (i * 50), i + rotation); + } + + // also swing limbs + this.walkAnimation.setSpeed(this.walkAnimation.speed() + 0.6F); + } + + if (this.isTired()) { + for (int i = 0; i < 20; i++) { + this.getLevel().addParticle(ParticleTypes.SPLASH, this.getX() + (this.random.nextDouble() - 0.5D) * this.getBbWidth() * 0.5, this.getY() + this.getEyeHeight(), this.getZ() + (this.random.nextDouble() - 0.5D) * this.getBbWidth() * 0.5, (random.nextFloat() - 0.5F) * 0.75F, 0, (random.nextFloat() - 0.5F) * 0.75F); + } + } + } + } + + private void addSnowEffect(float rotation, float hgt) { + double px = 3F * Math.cos(rotation); + double py = hgt % 5F; + double pz = 3F * Math.sin(rotation); + + this.getLevel().addParticle(TFParticleType.SNOW.get(), this.xOld + px, this.yOld + py, this.zOld + pz, 0, 0, 0); + } + + @Override + public void setTarget(@Nullable LivingEntity entity) { + if (entity != null && entity != this.getTarget()) + this.playSound(TFSounds.ALPHA_YETI_ALERT.get(), 4F, 0.5F + this.getRandom().nextFloat() * 0.5F); + super.setTarget(entity); + } + + @Override + public boolean hurt(DamageSource source, float amount) { + // no arrow damage when in ranged mode + if (!this.canRampage && !this.isTired() && source.is(DamageTypeTags.IS_PROJECTILE)) { + return false; + } + + this.canRampage = true; + if (source.getEntity() instanceof ServerPlayer player && !this.hurtBy.contains(player)) { + this.hurtBy.add(player); + } + return super.hurt(source, amount); + } + + @Override + public void lavaHurt() { + if (!this.fireImmune()) { + this.setSecondsOnFire(5); + if (this.hurt(this.damageSources().lava(), 4F)) { + this.playSound(SoundEvents.GENERIC_BURN, 0.4F, 2.0F + this.random.nextFloat() * 0.4F); + EntityUtil.killLavaAround(this); + } + } + } + + @Nullable + @Override + protected SoundEvent getAmbientSound() { + return TFSounds.ALPHA_YETI_GROWL.get(); + } + + @Override + protected SoundEvent getHurtSound(DamageSource source) { + return TFSounds.ALPHA_YETI_HURT.get(); + } + + @Override + protected SoundEvent getDeathSound() { + return TFSounds.ALPHA_YETI_DEATH.get(); + } + + @Override + public float getVoicePitch() { + return 0.5F + this.getRandom().nextFloat() * 0.5F; + } + + @Override + protected float getSoundVolume() { + return 4.0F; + } + + @Override + public void positionRider(Entity passenger) { + Vec3 riderPos = this.getRiderPosition(); + passenger.setPos(riderPos.x(), riderPos.y(), riderPos.z()); + } + + @Override + public double getPassengersRidingOffset() { + return 5.75D; + } + + /** + * Used to both get a rider position and to push out of blocks + */ + private Vec3 getRiderPosition() { + if (this.isVehicle()) { + float distance = 0.4F; + + double dx = Math.cos((this.getYRot() + 90) * Math.PI / 180.0D) * distance; + double dz = Math.sin((this.getYRot() + 90) * Math.PI / 180.0D) * distance; + + return new Vec3(this.getX() + dx, this.getY() + this.getPassengersRidingOffset() + this.getPassengers().get(0).getMyRidingOffset(), this.getZ() + dz); + } else { + return new Vec3(this.getX(), this.getY(), this.getZ()); + } + } + + @Override + public boolean canRiderInteract() { + return true; + } + + public void destroyBlocksInAABB(AABB box) { + if (ForgeEventFactory.getMobGriefingEvent(this.getLevel(), this)) { + for (BlockPos pos : WorldUtil.getAllInBB(box)) { + if (EntityUtil.canDestroyBlock(this.getLevel(), pos, this)) { + this.getLevel().destroyBlock(pos, false); + } + } + } + } + + public void makeRandomBlockFall(int range, int hangTime) { + if (ForgeEventFactory.getMobGriefingEvent(this.getLevel(), this)) { + // find a block nearby + int bx = Mth.floor(this.getX()) + this.getRandom().nextInt(range) - this.getRandom().nextInt(range); + int bz = Mth.floor(this.getZ()) + this.getRandom().nextInt(range) - this.getRandom().nextInt(range); + int by = Mth.floor(this.getY() + this.getEyeHeight()); + + this.makeBlockFallAbove(new BlockPos(bx, by, bz), hangTime); + } + } + + private void makeBlockFallAbove(BlockPos pos, int hangTime) { + for (int i = 1; i < 25; i++) { + BlockPos up = pos.above(i); + if (this.getLevel().getBlockState(up).is(BlockTags.ICE) && this.getLevel().getBlockState(up.below()).isAir()) { + this.makeBlockFall(up, hangTime); + break; + } + } + } + + public void makeBlockAboveTargetFall() { + if (this.getTarget() != null) { + this.makeBlockFallAbove(this.getTarget().blockPosition(), 40); + } + } + + private void makeBlockFall(BlockPos pos, int hangTime) { + FallingIce ice = new FallingIce(this.getLevel(), pos.getX() + 0.5D, pos.getY(), pos.getZ() + 0.5D, this.getLevel().getBlockState(pos), hangTime); + this.getLevel().setBlockAndUpdate(pos, Blocks.AIR.defaultBlockState()); + this.getLevel().addFreshEntity(ice); + } + + @Override + public void performRangedAttack(LivingEntity target, float distanceFactor) { + if (!this.canRampage) { + IceBomb ice = new IceBomb(TFEntities.THROWN_ICE.get(), this.getLevel(), this); + + // [VanillaCopy] Part of Skeleton.performRangedAttack + double d0 = target.getX() - this.getX(); + double d1 = target.getBoundingBox().minY + target.getBbHeight() / 3.0F - ice.getY(); + double d2 = target.getZ() - this.getZ(); + double d3 = Mth.sqrt((float) (d0 * d0 + d2 * d2)); + ice.shoot(d0, d1 + d3 * 0.2D, d2, 1.6F, 14 - this.getLevel().getDifficulty().getId() * 4); + + this.playSound(TFSounds.ALPHA_YETI_ICE.get(), 1.0F, 1.0F / (this.getRandom().nextFloat() * 0.4F + 0.8F)); + this.gameEvent(GameEvent.PROJECTILE_SHOOT); + this.getLevel().addFreshEntity(ice); + } + } + + @Override + public boolean removeWhenFarAway(double dist) { + return false; + } + + @Override + public void checkDespawn() { + if (this.getLevel().getDifficulty() == Difficulty.PEACEFUL) { + if (this.getRestrictCenter() != BlockPos.ZERO) { + this.getLevel().setBlockAndUpdate(this.getRestrictCenter(), TFBlocks.ALPHA_YETI_BOSS_SPAWNER.get().defaultBlockState()); + } + this.discard(); + } else { + super.checkDespawn(); + } + } + + public boolean canRampage() { + return this.canRampage; + } + + public void setRampaging(boolean rampaging) { + entityData.set(RAMPAGE_FLAG, (byte) (rampaging ? 1 : 0)); + } + + public boolean isRampaging() { + return entityData.get(RAMPAGE_FLAG) == 1; + } + + public void setTired(boolean tired) { + this.entityData.set(TIRED_FLAG, (byte) (tired ? 1 : 0)); + this.canRampage = false; + } + + public boolean isTired() { + return this.entityData.get(TIRED_FLAG) == 1; + } + + @Override + public boolean causeFallDamage(float distance, float multiplier, DamageSource source) { + + if (!this.getLevel().isClientSide() && isRampaging()) { + this.playSound(TFSounds.ALPHA_YETI_ICE.get(), 1.0F, 1.0F / (this.getRandom().nextFloat() * 0.4F + 0.8F)); + this.hitNearbyEntities(); + } + + return super.causeFallDamage(distance, multiplier, source); + } + + private void hitNearbyEntities() { + for (LivingEntity entity : this.getLevel().getEntitiesOfClass(LivingEntity.class, this.getBoundingBox().inflate(5, 0, 5))) { + if (entity != this && entity.hurt(this.damageSources().mobAttack(this), 5F)) { + entity.push(0, 0.4, 0); + } + } + } + + @Override + public void die(DamageSource cause) { + super.die(cause); + // mark the lair as defeated + if (!this.getLevel().isClientSide()) { + this.bossInfo.setProgress(0.0F); + LandmarkUtil.markStructureConquered(this.getLevel(), this, TFStructures.YETI_CAVE, true); + for (ServerPlayer player : this.hurtBy) { + TFAdvancements.HURT_BOSS.trigger(player, this); + } + + TFLootTables.entityDropsIntoContainer(this, this.createLootContext(true, cause).create(LootContextParamSets.ENTITY), TFBlocks.CANOPY_CHEST.get().defaultBlockState(), EntityUtil.bossChestLocation(this)); + } + } + + @Override + protected boolean shouldDropLoot() { + // Invoked the mob's loot during die, this will avoid duplicating during the actual drop phase + return false; + } + + @Override + public void setCustomName(@Nullable Component name) { + super.setCustomName(name); + this.bossInfo.setName(this.getDisplayName()); + } + + @Override + public void startSeenByPlayer(ServerPlayer player) { + super.startSeenByPlayer(player); + this.bossInfo.addPlayer(player); + } + + @Override + public void stopSeenByPlayer(ServerPlayer player) { + super.stopSeenByPlayer(player); + this.bossInfo.removePlayer(player); + } + + @Override + public void addAdditionalSaveData(CompoundTag compound) { + this.saveHomePointToNbt(compound); + super.addAdditionalSaveData(compound); + } + + @Override + public void readAdditionalSaveData(CompoundTag compound) { + super.readAdditionalSaveData(compound); + this.loadHomePointFromNbt(compound, 30); + if (this.hasCustomName()) { + this.bossInfo.setName(this.getDisplayName()); + } + } + + @Override + public boolean isPushedByFluid(FluidType type) { + return false; + } + + @Override + protected float getWaterSlowDown() { + return 1.0F; + } + + @Override + protected boolean canRide(Entity entityIn) { + return false; + } + + @Override + public boolean canChangeDimensions() { + return false; + } + + @Override + public BlockPos getRestrictionCenter() { + return this.getRestrictCenter(); + } + + @Override + public void setRestriction(BlockPos pos, int dist) { + this.restrictTo(pos, dist); + } +} diff --git a/src/main/java/twilightforest/entity/boss/EntityTFFallingIce.java b/src/main/java/twilightforest/entity/boss/EntityTFFallingIce.java deleted file mode 100644 index b97f4abbf5..0000000000 --- a/src/main/java/twilightforest/entity/boss/EntityTFFallingIce.java +++ /dev/null @@ -1,224 +0,0 @@ -package twilightforest.entity.boss; - -import java.util.ArrayList; - -import net.minecraft.block.Block; -import net.minecraft.entity.Entity; -import net.minecraft.init.Blocks; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.DamageSource; -import net.minecraft.util.MathHelper; -import net.minecraft.world.World; -import twilightforest.TwilightForestMod; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public class EntityTFFallingIce extends Entity { - - private static final int HANG_TIME = 100; - private int fallTime; - private float hurtAmount; - private int hurtMax; - - public EntityTFFallingIce(World par1World) { - super(par1World); - this.setSize(2.98F, 2.98F); - - this.hurtAmount = 10; - this.hurtMax = 30; - } - - public EntityTFFallingIce(World par1World, int x, int y, int z) { - this(par1World); - - this.preventEntitySpawning = true; - - this.setPosition(x, y, z); - this.motionX = 0.0D; - this.motionY = 0.0D; - this.motionZ = 0.0D; - this.prevPosX = x; - this.prevPosY = y; - this.prevPosZ = z; - } - - /** - * returns if this entity triggers Block.onEntityWalking on the blocks they walk on. used for spiders and wolves to - * prevent them from trampling crops - */ - protected boolean canTriggerWalking() - { - return false; - } - - protected void entityInit() {} - - /** - * Returns true if other Entities should be prevented from moving through this Entity. - */ - public boolean canBeCollidedWith() - { - return !this.isDead; - } - - /** - * Called to update the entity's position/logic. - */ - @SuppressWarnings("unchecked") - public void onUpdate() - { - this.prevPosX = this.posX; - this.prevPosY = this.posY; - this.prevPosZ = this.posZ; - - ++this.fallTime; - - if (this.fallTime > HANG_TIME) { - this.motionY -= 0.03999999910593033D; - } - - this.moveEntity(this.motionX, this.motionY, this.motionZ); - this.motionX *= 0.9800000190734863D; - this.motionY *= 0.9800000190734863D; - this.motionZ *= 0.9800000190734863D; - - if (!this.worldObj.isRemote) - { - //int y = MathHelper.floor_double(this.posY); - - if (this.onGround) - { - this.motionX *= 0.699999988079071D; - this.motionZ *= 0.699999988079071D; - this.motionY *= -0.5D; - - this.setDead(); - } -// else if (this.fallTime > 100 && !this.worldObj.isRemote && (y < 1 || y > 256) || this.fallTime > 600) -// { -// // something's wrong -// this.setDead(); -// } - } - - // kill other nearby blocks if they are not as old as this one - if (!this.worldObj.isRemote) { - ArrayList nearby = new ArrayList(this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox)); - - for (Entity entity : nearby) { - if (entity instanceof EntityTFFallingIce) { - EntityTFFallingIce otherIce = (EntityTFFallingIce)entity; - - if (otherIce.getFallTime() < this.fallTime) { - otherIce.setDead(); - } - } - } - - destroyIceInAABB(this.boundingBox.expand(0.5, 0, 0.5)); - } - - makeTrail(); - } - - public void makeTrail() { - for (int i = 0; i < 2; i++) { - double dx = this.posX + 2F * (rand.nextFloat() - rand.nextFloat()); - double dy = this.posY - 3F + 3F * (rand.nextFloat() - rand.nextFloat()); - double dz = this.posZ + 2F * (rand.nextFloat() - rand.nextFloat()); - - TwilightForestMod.proxy.spawnParticle(this.worldObj, "snowwarning", dx, dy, dz, 0, -1, 0); - - //System.out.println("Trail! " + this.worldObj); - } - } - - /** - * Called when the mob is falling. Calculates and applies fall damage. - */ - @SuppressWarnings({ "unchecked" }) - protected void fall(float par1) - { - int distance = MathHelper.ceiling_float_int(par1 - 1.0F); - - if (distance > 0) - { - ArrayList nearby = new ArrayList(this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox.expand(2, 0, 2))); - DamageSource damagesource = DamageSource.fallingBlock; - for (Entity entity : nearby) { - if (!(entity instanceof EntityTFYetiAlpha)) { - entity.attackEntityFrom(damagesource, (float)Math.min(MathHelper.floor_float((float)distance * this.hurtAmount), this.hurtMax)); - } - } - } - - for (int i = 0; i < 200; i++) { - double dx = this.posX + 3F * (rand.nextFloat() - rand.nextFloat()); - double dy = this.posY + 2 + 3F * (rand.nextFloat() - rand.nextFloat()); - double dz = this.posZ + 3F * (rand.nextFloat() - rand.nextFloat()); - - this.worldObj.spawnParticle("blockcrack_" + Block.getIdFromBlock(Blocks.packed_ice) + "_0", dx, dy, dz, 0, 0, 0); - } - - this.playSound(Blocks.anvil.stepSound.getBreakSound(), 3F, 0.5F); - this.playSound(Blocks.packed_ice.stepSound.getBreakSound(), 3F, 0.5F); - } - - /** - * Destroys all blocks that aren't associated with 'The End' inside the given bounding box. - */ - public void destroyIceInAABB(AxisAlignedBB par1AxisAlignedBB) - { - //System.out.println("Destroying blocks in " + par1AxisAlignedBB); - - int minX = MathHelper.floor_double(par1AxisAlignedBB.minX); - int minY = MathHelper.floor_double(par1AxisAlignedBB.minY); - int minZ = MathHelper.floor_double(par1AxisAlignedBB.minZ); - int maxX = MathHelper.floor_double(par1AxisAlignedBB.maxX); - int maxY = MathHelper.floor_double(par1AxisAlignedBB.maxY); - int maxZ = MathHelper.floor_double(par1AxisAlignedBB.maxZ); - - for (int dx = minX; dx <= maxX; ++dx) { - for (int dy = minY; dy <= maxY; ++dy) { - for (int dz = minZ; dz <= maxZ; ++dz) { - Block block = this.worldObj.getBlock(dx, dy, dz); - - if (block == Blocks.ice || block == Blocks.packed_ice || block == Blocks.stone) { - this.worldObj.setBlock(dx, dy, dz, Blocks.air, 0, 3); - } - } - } - } - } - - - @Override - protected void readEntityFromNBT(NBTTagCompound var1) { - // TODO Auto-generated method stub - - } - - @Override - protected void writeEntityToNBT(NBTTagCompound var1) { - // TODO Auto-generated method stub - - } - - /** - * Return whether this entity should be rendered as on fire. - */ - @SideOnly(Side.CLIENT) - public boolean canRenderOnFire() - { - return false; - } - - public Block getBlock() { - return Blocks.packed_ice; - } - - public int getFallTime() { - return this.fallTime; - } -} diff --git a/src/main/java/twilightforest/entity/boss/EntityTFHydra.java b/src/main/java/twilightforest/entity/boss/EntityTFHydra.java deleted file mode 100644 index 9949562da9..0000000000 --- a/src/main/java/twilightforest/entity/boss/EntityTFHydra.java +++ /dev/null @@ -1,1223 +0,0 @@ -package twilightforest.entity.boss; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -import net.minecraft.block.Block; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLiving; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.IEntityMultiPart; -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.boss.EntityDragonPart; -import net.minecraft.entity.boss.IBossDisplayData; -import net.minecraft.entity.item.EntityXPOrb; -import net.minecraft.entity.monster.IMob; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.DamageSource; -import net.minecraft.util.MathHelper; -import net.minecraft.world.EnumDifficulty; -import net.minecraft.world.World; -import twilightforest.TFAchievementPage; -import twilightforest.TFFeature; -import twilightforest.TwilightForestMod; -import twilightforest.item.TFItems; -import twilightforest.world.ChunkProviderTwilightForest; -import twilightforest.world.TFWorldChunkManager; -import twilightforest.world.WorldProviderTwilightForest; - - - -public class EntityTFHydra extends EntityLiving implements IBossDisplayData, IEntityMultiPart, IMob -{ - - private static int TICKS_BEFORE_HEALING = 1000; - private static int HEAD_RESPAWN_TICKS = 100; - private static int HEAD_MAX_DAMAGE = 120; - private static float ARMOR_MULTIPLIER = 8.0F; - private static int MAX_HEALTH = 360; - private static float HEADS_ACTIVITY_FACTOR = 0.3F; - - private static int SECONDARY_FLAME_CHANCE = 10; - private static int SECONDARY_MORTAR_CHANCE = 16; - - private static final int DATA_SPAWNHEADS = 17; - private static final int DATA_BOSSHEALTH = 18; - - public Entity partArray[]; - public EntityDragonPart body; - - public HydraHeadContainer[] hc; - public int numHeads = 7; - - public EntityDragonPart leftLeg; - public EntityDragonPart rightLeg; - public EntityDragonPart tail; - - Entity currentTarget = null; - - public int ticksSinceDamaged = 0; - - public EntityTFHydra(World world) { - super(world); - - partArray = (new Entity[] - { - body = new EntityDragonPart(this, "body", 4F, 4F), leftLeg = new EntityDragonPart(this, "leg", 2F, 3F), rightLeg = new EntityDragonPart(this, "leg", 2F, 3F), tail = new EntityDragonPart(this, "tail", 4F, 4F) - }); - - // head array - this.hc = new HydraHeadContainer[this.numHeads]; - for (int i = 0; i < numHeads; i++) - { - hc[i] = new HydraHeadContainer(this, i, i < 3); - } - - // re-do partArray - ArrayList partList = new ArrayList(); - Collections.addAll(partList, partArray); - - for (int i = 0; i < numHeads; i++) - { - Collections.addAll(partList, hc[i].getNeckArray()); - } - - partArray = partList.toArray(partArray); - - setSize(16F, 12F); - this.ignoreFrustumCheck = true; - - //texture = TwilightForestMod.MODEL_DIR + "hydra4.png"; - isImmuneToFire = true; - - this.experienceValue = 511; - - setSpawnHeads(true); - } - - public EntityTFHydra(World world, double x, double y, double z) - { - this(world); - this.setPosition(x, y, z); - } - - - /** - * Set monster attributes - */ - @Override - protected void applyEntityAttributes() - { - super.applyEntityAttributes(); - this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(MAX_HEALTH); // max health - this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.28D); // movement speed - } - - - @SuppressWarnings("unchecked") - @Override - public void onLivingUpdate() - { - if (hc[0].headEntity == null || hc[1].headEntity == null || hc[2].headEntity == null) - { - // don't spawn if we're connected in multiplayer - if (shouldSpawnHeads() && !worldObj.isRemote) { - for (int i = 0; i < numHeads; i++) - { - hc[i].headEntity = new EntityTFHydraHead(this, "head" + i, 3F, 3F); - hc[i].headEntity.setPosition(this.posX, this.posY, this.posZ); - worldObj.spawnEntityInWorld(hc[i].headEntity); - } - - setSpawnHeads(false); - - //System.out.println("Server is spawning heads"); - } - else - { - // I think the head containers should attempt connection during the update call below - } - } - - body.onUpdate(); - - // update all heads (maybe we should change to only active ones - for (int i = 0; i < numHeads; i++) - { - hc[i].onUpdate(); - } - - // update health - if (!this.worldObj.isRemote) - { - this.dataWatcher.updateObject(DATA_BOSSHEALTH, Integer.valueOf((int)this.getHealth())); - } - else - { -// if (this.getBossHealth() != this.getHealth()) -// { -// this.setEntityHealth(this.getBossHealth()); -// } - if (this.getHealth() > 0) - { - // this seems to get set off during creation at some point - this.deathTime = 0; - } - } - - if (this.hurtTime > 0) - { - for (int i = 0; i < numHeads; i++) - { - hc[i].setHurtTime(this.hurtTime); - } - } - - this.ticksSinceDamaged++; - - if (!this.worldObj.isRemote && this.ticksSinceDamaged > TICKS_BEFORE_HEALING && this.ticksSinceDamaged % 5 == 0) - { - this.heal(1); - } - - // update fight variables for difficulty setting - setDifficultyVariables(); - - if (this.newPosRotationIncrements > 0) - { - double var1 = this.posX + (this.newPosX - this.posX) / this.newPosRotationIncrements; - double var3 = this.posY + (this.newPosY - this.posY) / this.newPosRotationIncrements; - double var5 = this.posZ + (this.newPosZ - this.posZ) / this.newPosRotationIncrements; - double var7 = MathHelper.wrapAngleTo180_double(this.newRotationYaw - this.rotationYaw); - this.rotationYaw = (float)(this.rotationYaw + var7 / this.newPosRotationIncrements); - this.rotationPitch = (float)(this.rotationPitch + (this.newRotationPitch - this.rotationPitch) / this.newPosRotationIncrements); - --this.newPosRotationIncrements; - this.setPosition(var1, var3, var5); - this.setRotation(this.rotationYaw, this.rotationPitch); - } - - if (Math.abs(this.motionX) < 0.005D) - { - this.motionX = 0.0D; - } - - if (Math.abs(this.motionY) < 0.005D) - { - this.motionY = 0.0D; - } - - if (Math.abs(this.motionZ) < 0.005D) - { - this.motionZ = 0.0D; - } - - this.worldObj.theProfiler.startSection("ai"); - - if (this.isMovementBlocked()) - { - this.isJumping = false; - this.moveStrafing = 0.0F; - this.moveForward = 0.0F; - this.randomYawVelocity = 0.0F; - } - else if (this.isClientWorld()) - { - this.worldObj.theProfiler.startSection("oldAi"); - this.updateEntityActionState(); - this.worldObj.theProfiler.endSection(); - this.rotationYawHead = this.rotationYaw; - } - - this.worldObj.theProfiler.endSection(); - this.worldObj.theProfiler.startSection("jump"); - - if (this.isJumping) - { - if (!this.isInWater() && !this.handleLavaMovement()) - { - if (this.onGround) - { - this.jump(); - } - } - else - { - this.motionY += 0.03999999910593033D; - } - } - - this.worldObj.theProfiler.endSection(); - this.worldObj.theProfiler.startSection("travel"); - this.moveStrafing *= 0.98F; - this.moveForward *= 0.98F; - this.randomYawVelocity *= 0.9F; -// float var9 = this.landMovementFactor; -// this.landMovementFactor *= this.getSpeedModifier(); - this.moveEntityWithHeading(this.moveStrafing, this.moveForward); -// this.landMovementFactor = var9; - this.worldObj.theProfiler.endSection(); - - body.width = body.height = 6.0F; - tail.width = 6.0F; tail.height = 2.0F; - - // set body part positions - float angle; - double dx, dy, dz; - - // body goes behind the actual position of the hydra - angle = (((renderYawOffset + 180) * 3.141593F) / 180F); - - dx = posX - MathHelper.sin(angle) * 3.0; - dy = posY + 0.1; - dz = posZ + MathHelper.cos(angle) * 3.0; - body.setPosition(dx, dy, dz); - - dx = posX - MathHelper.sin(angle) * 10.5; - dy = posY + 0.1; - dz = posZ + MathHelper.cos(angle) * 10.5; - tail.setPosition(dx, dy, dz); - - //worldObj.spawnParticle("mobSpell", body.posX, body.posY, body.posZ, 0.2, 0.2, 0.2); - - this.worldObj.theProfiler.startSection("push"); - - if (!this.worldObj.isRemote && this.hurtTime == 0) - { - this.collideWithEntities(this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.body.boundingBox), this.body); - this.collideWithEntities(this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.tail.boundingBox), this.tail); - } - - this.worldObj.theProfiler.endSection(); - - // destroy blocks - if (!this.worldObj.isRemote) - { - this.destroyBlocksInAABB(this.body.boundingBox); - this.destroyBlocksInAABB(this.tail.boundingBox); - - for (int i = 0; i < numHeads; i++) - { - if (hc[i].headEntity != null && hc[i].isActive()) - { - this.destroyBlocksInAABB(this.hc[i].headEntity.boundingBox); - } - } - - // smash blocks beneath us too - if (this.ticksExisted % 20 == 0) - { - // - if (isUnsteadySurfaceBeneath()) - { - this.destroyBlocksInAABB(this.boundingBox.offset(0, -1, 0)); - - } - } - } - - } - - - @Override - protected void entityInit() - { - super.entityInit(); - dataWatcher.addObject(DATA_SPAWNHEADS, Byte.valueOf((byte)0)); - this.dataWatcher.addObject(DATA_BOSSHEALTH, new Integer(MAX_HEALTH)); - } - - - public boolean shouldSpawnHeads() - { - return dataWatcher.getWatchableObjectByte(DATA_SPAWNHEADS) != 0; - } - - public void setSpawnHeads(boolean flag) - { - if (flag) - { - dataWatcher.updateObject(DATA_SPAWNHEADS, Byte.valueOf((byte)127)); - } - else - { - dataWatcher.updateObject(DATA_SPAWNHEADS, Byte.valueOf((byte)0)); - } - } - - /** - * Save to disk. - */ - @Override - public void writeEntityToNBT(NBTTagCompound nbttagcompound) - { - super.writeEntityToNBT(nbttagcompound); - nbttagcompound.setBoolean("SpawnHeads", shouldSpawnHeads()); - nbttagcompound.setByte("NumHeads", (byte) countActiveHeads()); - } - - /** - * Load from disk. Return state to roughly where we saved it. - */ - @Override - public void readEntityFromNBT(NBTTagCompound nbttagcompound) - { - super.readEntityFromNBT(nbttagcompound); - setSpawnHeads(nbttagcompound.getBoolean("SpawnHeads")); - activateNumberOfHeads(nbttagcompound.getByte("NumHeads")); - } - - - - @Override - protected void updateEntityActionState() - { -// System.out.println("Calling updateEntityActionState"); -// System.out.println("Current target = " + currentTarget); - - entityAge++; - despawnEntity(); - moveStrafing = 0.0F; - moveForward = 0.0F; - float f = 48F; - - // kill heads that have taken too much damage - for (int i = 0; i < numHeads; i++) - { - if (hc[i].isActive() && hc[i].getDamageTaken() > HEAD_MAX_DAMAGE) - { - hc[i].setNextState(HydraHeadContainer.STATE_DYING); - hc[i].endCurrentAction(); - - // set this head and a random dead head to respawn - hc[i].setRespawnCounter(HEAD_RESPAWN_TICKS); - int otherHead = getRandomDeadHead(); - if (otherHead != -1) - { - hc[otherHead].setRespawnCounter(HEAD_RESPAWN_TICKS); - } - } - } - - if (rand.nextFloat() < 0.7F) - { - EntityPlayer entityplayer1 = worldObj.getClosestVulnerablePlayerToEntity(this, f); - //EntityPlayer entityplayer1 = worldObj.getClosestPlayerToEntity(this, f); - - if (entityplayer1 != null) - { - currentTarget = entityplayer1; - numTicksToChaseTarget = 100 + rand.nextInt(20); - } - else - { - randomYawVelocity = (rand.nextFloat() - 0.5F) * 20F; - } - } - - if (currentTarget != null) - { - faceEntity(currentTarget, 10F, getVerticalFaceSpeed()); - - // have any heads not currently attacking switch to the primary target - for (int i = 0; i < numHeads; i++) - { - if (!isHeadAttacking(hc[i]) && !hc[i].isSecondaryAttacking) - { - hc[i].setTargetEntity(currentTarget); - } - } - - // let's pick an attack - if (this.currentTarget.isEntityAlive()) - { - float distance = this.currentTarget.getDistanceToEntity(this); - - if (this.canEntityBeSeen(this.currentTarget)) - { - this.attackEntity(this.currentTarget, distance); - } - } - - if (numTicksToChaseTarget-- <= 0 || currentTarget.isDead || currentTarget.getDistanceSqToEntity(this) > (double)(f * f)) - { - currentTarget = null; - } - } - else - { - if (rand.nextFloat() < 0.05F) - { - randomYawVelocity = (rand.nextFloat() - 0.5F) * 20F; - } - - rotationYaw += randomYawVelocity; - rotationPitch = defaultPitch; - - // TODO: while we are idle, consider having the heads breathe fire on passive mobs - - // set idle heads to no target - for (int i = 0; i < numHeads; i++) - { - if (hc[i].currentState == HydraHeadContainer.STATE_IDLE) - { - hc[i].setTargetEntity(null); - } - } - } - - // heads that are free at this point may consider attacking secondary targets - this.secondaryAttacks(); - - boolean flag = isInWater(); - boolean flag1 = handleLavaMovement(); - - if (flag || flag1) - { - isJumping = rand.nextFloat() < 0.8F; - } - } - - /** - * Make some of the mechanics harder on hard mode - */ - private void setDifficultyVariables() { - if (worldObj.difficultySetting != EnumDifficulty.HARD) - { - EntityTFHydra.HEADS_ACTIVITY_FACTOR = 0.3F; - } - else - { - // hard mode! - EntityTFHydra.HEADS_ACTIVITY_FACTOR = 0.5F; // higher is harder - } - - } - - /** - * Find a random head to respawn - * - * TODO: make random - */ - private int getRandomDeadHead() { - for (int i = 0; i < numHeads; i++) - { - if (hc[i].currentState == HydraHeadContainer.STATE_DEAD && hc[i].respawnCounter == -1) - { - return i; - } - } - return -1; - } - - /** - * Used when re-loading from save. Assumes three heads are active and activates more if necessary. - * - * @param howMany - */ - private void activateNumberOfHeads(int howMany) - { - int moreHeads = howMany - this.countActiveHeads(); - - //System.out.println("Reactivating " + moreHeads + " more heads."); - - for (int i = 0; i < moreHeads; i++) - { - int otherHead = getRandomDeadHead(); - if (otherHead != -1) - { - // move directly into not dead - hc[otherHead].currentState = HydraHeadContainer.STATE_IDLE; - hc[otherHead].setNextState(HydraHeadContainer.STATE_IDLE); - hc[otherHead].endCurrentAction(); - } - } - } - - /** - * Count timers, and pick an attack against the entity if our timer says go - */ - private void attackEntity(Entity target, float distance) { - - int BITE_CHANCE = 10; - int FLAME_CHANCE = 100; - int MORTAR_CHANCE = 160; - - boolean targetAbove = target.boundingBox.minY > this.boundingBox.maxY; - - // three main heads can do these kinds of attacks - for (int i = 0; i < 3; i++) - { - if (hc[i].currentState == HydraHeadContainer.STATE_IDLE && !areTooManyHeadsAttacking(target, i)) - { - if (distance > 4 && distance < 10 && rand.nextInt(BITE_CHANCE) == 0 && this.countActiveHeads() > 2 && !areOtherHeadsBiting(target, i)) - { - hc[i].setNextState(HydraHeadContainer.STATE_BITE_BEGINNING); - } - else if (distance > 0 && distance < 20 && rand.nextInt(FLAME_CHANCE) == 0) - { - hc[i].setNextState(HydraHeadContainer.STATE_FLAME_BEGINNING); - } - else if (distance > 8 && distance < 32 && !targetAbove && rand.nextInt(MORTAR_CHANCE) == 0) - { - hc[i].setNextState(HydraHeadContainer.STATE_MORTAR_BEGINNING); - } - } - } - - // heads 4-7 can do everything but bite - for (int i = 3; i < numHeads; i++) - { - if (hc[i].currentState == HydraHeadContainer.STATE_IDLE && !areTooManyHeadsAttacking(target, i)) - { - if (distance > 0 && distance < 20 && rand.nextInt(FLAME_CHANCE) == 0) - { - hc[i].setNextState(HydraHeadContainer.STATE_FLAME_BEGINNING); - } - else if (distance > 8 && distance < 32 && !targetAbove && rand.nextInt(MORTAR_CHANCE) == 0) - { - hc[i].setNextState(HydraHeadContainer.STATE_MORTAR_BEGINNING); - } - } - } - } - - protected boolean areTooManyHeadsAttacking(Entity target, int testHead) { - int otherAttacks = 0; - - for (int i = 0; i < numHeads; i++) - { - if (i != testHead && isHeadAttacking(hc[i])) - { - otherAttacks++; - - // biting heads count triple - if (isHeadBiting(hc[i])) - { - otherAttacks += 2; - } - } - } - - return otherAttacks >= 1 + (countActiveHeads() * HEADS_ACTIVITY_FACTOR); - } - - /** - * How many active heads do we have? - */ - public int countActiveHeads() - { - int count = 0; - - for (int i = 0; i < numHeads; i++) - { - if (hc[i].isActive()) - { - count++; - } - } - - return count; - } - - private boolean isHeadAttacking(HydraHeadContainer head) { - return head.currentState == HydraHeadContainer.STATE_BITE_BEGINNING || head.currentState == HydraHeadContainer.STATE_BITE_READY - || head.currentState == HydraHeadContainer.STATE_BITE_BITING || head.currentState == HydraHeadContainer.STATE_FLAME_BEGINNING - || head.currentState == HydraHeadContainer.STATE_FLAME_BREATHING || head.currentState == HydraHeadContainer.STATE_MORTAR_BEGINNING - || head.currentState == HydraHeadContainer.STATE_MORTAR_LAUNCH; - - } - - protected boolean areOtherHeadsBiting(Entity target, int testHead) - { - for (int i = 0; i < numHeads; i++) - { - if (i != testHead && isHeadBiting(hc[i])) - { - return true; - } - } - - return false; - } - - protected boolean isHeadBiting(HydraHeadContainer head) - { - return head.currentState == HydraHeadContainer.STATE_BITE_BEGINNING || head.currentState == HydraHeadContainer.STATE_BITE_READY - || head.currentState == HydraHeadContainer.STATE_BITE_BITING || head.nextState == HydraHeadContainer.STATE_BITE_BEGINNING; - } - - /** - * Called sometime after the main attackEntity routine. Finds a valid secondary target and has an unoccupied head start an attack against it. - * - * The center head (head 0) does not make secondary attacks - */ - private void secondaryAttacks() { - for (int i = 0; i < numHeads; i++) - { - if (hc[i].headEntity == null) - { - return; - } - } - - // find entities nearby that none of the heads are targeting right now - EntityLivingBase secondaryTarget = findSecondaryTarget(20); - - if (secondaryTarget != null) - { - float distance = secondaryTarget.getDistanceToEntity(this); - - //System.out.println("Found a valid secondary target " + distance + " squares away."); - //System.out.println("Secondary target is " + secondaryTarget); - - for (int i = 1; i < numHeads; i++) - { - if (hc[i].isActive() && hc[i].currentState == HydraHeadContainer.STATE_IDLE && isTargetOnThisSide(i, secondaryTarget)) - { - if (distance > 0 && distance < 20 && rand.nextInt(SECONDARY_FLAME_CHANCE) == 0) - { - hc[i].setTargetEntity(secondaryTarget); - hc[i].isSecondaryAttacking = true; - hc[i].setNextState(HydraHeadContainer.STATE_FLAME_BEGINNING); - } - else if (distance > 8 && distance < 32 && rand.nextInt(SECONDARY_MORTAR_CHANCE) == 0) - { - hc[i].setTargetEntity(secondaryTarget); - hc[i].isSecondaryAttacking = true; - hc[i].setNextState(HydraHeadContainer.STATE_MORTAR_BEGINNING); - } - } - - } - - } - } - - /** - * Used to make sure heads don't attack across the whole body - */ - public boolean isTargetOnThisSide(int headNum, Entity target) - { - double headDist = distanceSqXZ(hc[headNum].headEntity, target); - double middleDist = distanceSqXZ(this, target); - - return headDist < middleDist; - } - - - /** - * Square of distance between two entities with y not a factor, just x and z - */ - private double distanceSqXZ(Entity headEntity, Entity target) { - double distX = headEntity.posX - target.posX; - double distZ = headEntity.posZ - target.posZ; - return distX * distX + distZ * distZ; - } - - /** - * Find an EntityLiving within the specified range. Exclude our primary target and any head's target. - * - * Right now just finds the closest living entity that is not exluded by our criteria - */ - @SuppressWarnings("unchecked") - public EntityLivingBase findSecondaryTarget(double range) - { - double closestRange = -1.0D; - EntityLivingBase closestEntity = null; - - List nearbyEntities = this.worldObj.getEntitiesWithinAABB(EntityLivingBase.class, AxisAlignedBB.getBoundingBox(this.posX, this.posY, this.posZ, this.posX + 1, this.posY + 1, this.posZ + 1).expand(range, range, range)); - - for (EntityLivingBase nearbyLiving : nearbyEntities) - { - // exclude me - if (nearbyLiving instanceof EntityTFHydra || nearbyLiving instanceof EntityTFHydraPart) - { - continue; - } - - // exclude current target and any head's target - if (nearbyLiving == currentTarget || isAnyHeadTargeting(nearbyLiving)) - { - continue; - } - - // only things we can see - if (!this.canEntityBeSeen(nearbyLiving)) - { - continue; - } - - double curDist = nearbyLiving.getDistanceSq(this.posX, this.posY, this.posZ); - - if ((range < 0.0D || curDist < range * range) && (closestRange == -1.0D || curDist < closestRange)) - { - closestRange = curDist; - closestEntity = nearbyLiving; - } - - } - - return closestEntity; - } - - boolean isAnyHeadTargeting(Entity targetEntity) - { - for (int i = 0; i < numHeads; i++) - { - if (hc[i].targetEntity != null && hc[i].targetEntity.equals(targetEntity)) - { - return true; - } - } - - return false; - } - - - /** - * Pushes all entities inside the list away from the enderdragon. - */ - private void collideWithEntities(List par1List, Entity part) - { - double pushPower = 4.0D; - - double centerX = (part.boundingBox.minX + part.boundingBox.maxX) / 2.0D; - double centerY = (part.boundingBox.minZ + part.boundingBox.maxZ) / 2.0D; - - for (Entity entity : par1List) - { - if (entity instanceof EntityLivingBase) - { - double distX = entity.posX - centerX; - double distZ = entity.posZ - centerY; - double sqDist = distX * distX + distZ * distZ; - entity.addVelocity(distX / sqDist * pushPower, 0.20000000298023224D, distZ / sqDist * pushPower); - } - } - } - - /** - * Check the surface immediately beneath us, if it is less than 80% solid - * @return - */ - private boolean isUnsteadySurfaceBeneath() { - - int minX = MathHelper.floor_double(this.boundingBox.minX); - int minZ = MathHelper.floor_double(this.boundingBox.minZ); - int maxX = MathHelper.floor_double(this.boundingBox.maxX); - int maxZ = MathHelper.floor_double(this.boundingBox.maxZ); - int minY = MathHelper.floor_double(this.boundingBox.minY); - - int solid = 0; - int total = 0; - - int dy = minY - 1; - - for (int dx = minX; dx <= maxX; ++dx) - { - for (int dz = minZ; dz <= maxZ; ++dz) - { - total++; - if (this.worldObj.getBlock(dx, dy, dz).getMaterial().isSolid()) - { - solid++; - } - } - } - - //System.out.println("Checking solidness. total = " + total + ", solid = " + solid + ", ratio = " + ((float)solid / (float)total)); - - return ((float)solid / (float)total) < 0.6F; - } - - /** - * Destroys all blocks that aren't associated with 'The End' inside the given bounding box. - */ - private boolean destroyBlocksInAABB(AxisAlignedBB par1AxisAlignedBB) - { - //System.out.println("Destroying blocks in " + par1AxisAlignedBB); - - int minX = MathHelper.floor_double(par1AxisAlignedBB.minX); - int minY = MathHelper.floor_double(par1AxisAlignedBB.minY); - int minZ = MathHelper.floor_double(par1AxisAlignedBB.minZ); - int maxX = MathHelper.floor_double(par1AxisAlignedBB.maxX); - int maxY = MathHelper.floor_double(par1AxisAlignedBB.maxY); - int maxZ = MathHelper.floor_double(par1AxisAlignedBB.maxZ); - boolean wasBlocked = false; - for (int dx = minX; dx <= maxX; ++dx) - { - for (int dy = minY; dy <= maxY; ++dy) - { - for (int dz = minZ; dz <= maxZ; ++dz) - { - Block currentID = this.worldObj.getBlock(dx, dy, dz); - - if (currentID != Blocks.air) - { - int currentMeta = this.worldObj.getBlockMetadata(dx, dy, dz); - - if (currentID != Blocks.obsidian && currentID != Blocks.end_stone && currentID != Blocks.bedrock) - { - this.worldObj.setBlock(dx, dy, dz, Blocks.air, 0, 2); - - // here, this effect will have to do - worldObj.playAuxSFX(2001, dx, dy, dz, Block.getIdFromBlock(currentID) + (currentMeta << 12)); - } - else - { - wasBlocked = true; - } - } - } - } - } - - return wasBlocked; - } - - /** - * Rather than speed, this seems to control how far up or down the heads can tilt? - */ - @Override - public int getVerticalFaceSpeed() - { - return 500; - } - - - - @Override - public boolean attackEntityFromPart(EntityDragonPart dragonpart, DamageSource damagesource, float i) - { - // I think only the body parts are EntityDragonPart. - //System.out.println("Taking an attack on part " + dragonpart.name + " of type " + damagesource.damageType); - - // try to find range that damage is coming from - double range = calculateRange(damagesource); - - //System.out.println("We decided the range is " + range); - - if (range > 400) - { - //System.out.println("Ignoring attack from out of range"); - return false; - } - - return superAttackFrom(damagesource, Math.round(i / 8.0F)); - } - - protected boolean superAttackFrom(DamageSource par1DamageSource, float par2) - { - return super.attackEntityFrom(par1DamageSource, par2); - } - - public boolean attackEntityFromPart(EntityTFHydraPart part, DamageSource damagesource, float damageAmount) - { - //System.out.println("Taking an attack on part " + part.getPartName() + " of type " + damagesource.damageType); - - // if we're in a wall, kill that wall - if (!worldObj.isRemote && damagesource == DamageSource.inWall && part.getBoundingBox() != null) - { - destroyBlocksInAABB(part.getBoundingBox()); - } - - HydraHeadContainer headCon = null; - - for (int i = 0; i < numHeads; i++) - { - if (hc[i].headEntity == part) - { - headCon = hc[i]; - } - } - - // try to find range that damage is coming from - double range = calculateRange(damagesource); - - //System.out.println("We decided the range is " + range); - - if (range > 400) - { - //System.out.println("Ignoring attack from out of range"); - return false; - } - - // ignore hits on dying heads, it's weird - if (headCon != null && !headCon.isActive()) - { - return false; - } - - boolean tookDamage; - if (headCon != null && headCon.getCurrentMouthOpen() > 0.5) - { - tookDamage = superAttackFrom(damagesource, damageAmount); - headCon.addDamage(damageAmount); - } - else - { - int armoredDamage = Math.round(damageAmount / ARMOR_MULTIPLIER); - tookDamage = superAttackFrom(damagesource, armoredDamage); - - if (headCon != null) - { - headCon.addDamage(armoredDamage); - } - } - - if (tookDamage) - { - this.ticksSinceDamaged = 0; - } - - return tookDamage; - } - - protected double calculateRange(DamageSource damagesource) { - double range = -1; - - if (damagesource.getSourceOfDamage() != null) - { - range = this.getDistanceSqToEntity(damagesource.getSourceOfDamage()); - } - - if (damagesource.getEntity() != null) - { - range = this.getDistanceSqToEntity(damagesource.getEntity()); - } - return range; - } - - /** - * Called when the entity is attacked. - */ - @Override - public boolean attackEntityFrom(DamageSource par1DamageSource, float par2) - { -// System.out.println("Taking a direct attack of type " + par1DamageSource.damageType); -// -// return superAttackFrom(par1DamageSource, Math.round(par2 / 8.0F)); - return false; - } - - - /** - * We need to do this for the bounding boxes on the parts to become active - */ - @Override - public Entity[] getParts() - { - return partArray; - } - - /** - * This is set as off for the hydra, which has an enormous bounding box, but set as on for the parts. - */ - @Override - public boolean canBeCollidedWith() - { - return false; - } - - /** - * If this is on, the player pushes us based on our bounding box rather than it going by parts - */ - @Override - public boolean canBePushed() { - return false; - } - - /** - * Don't get knocked back - */ - @Override - public void knockBack(Entity entity, float i, double d, double d1) - { - // do nothing? - } - - - /** - * Returns the sound this mob makes while it's alive. - */ - @Override - protected String getLivingSound() - { - return TwilightForestMod.ID + ":mob.hydra.growl"; - } - - /** - * Returns the sound this mob makes when it is hurt. - */ - @Override - protected String getHurtSound() - { - return TwilightForestMod.ID + ":mob.hydra.hurt"; - } - - /** - * Returns the sound this mob makes on death. - */ - @Override - protected String getDeathSound() - { - return TwilightForestMod.ID + ":mob.hydra.death"; - } - - /** - * Returns the volume for the sounds this mob makes. - */ - @Override - protected float getSoundVolume() - { - return 2F; - } - - /** - * Trigger achievement when killed - */ - @Override - public void onDeath(DamageSource par1DamageSource) { - super.onDeath(par1DamageSource); - if (par1DamageSource.getSourceOfDamage() instanceof EntityPlayer) { - ((EntityPlayer)par1DamageSource.getSourceOfDamage()).triggerAchievement(TFAchievementPage.twilightHunter); - ((EntityPlayer)par1DamageSource.getSourceOfDamage()).triggerAchievement(TFAchievementPage.twilightKillHydra); - } - - // mark the lair as defeated - if (!worldObj.isRemote && worldObj.provider instanceof WorldProviderTwilightForest) { - int dx = MathHelper.floor_double(this.posX); - int dy = MathHelper.floor_double(this.posY); - int dz = MathHelper.floor_double(this.posZ); - - ChunkProviderTwilightForest chunkProvider = ((WorldProviderTwilightForest)worldObj.provider).getChunkProvider(); - TFFeature nearbyFeature = ((TFWorldChunkManager)worldObj.provider.worldChunkMgr).getFeatureAt(dx, dz, worldObj); - - if (nearbyFeature == TFFeature.hydraLair) { - chunkProvider.setStructureConquered(dx, dy, dz, true); - } - } - } - - /** - * EPIC LOOTZ! - */ - @Override - protected void dropFewItems(boolean par1, int par2) { - - // chops - int totalDrops = this.rand.nextInt(3 + par2) + 5; - for (int i = 0; i < totalDrops; ++i) - { - this.dropItem(TFItems.hydraChop, 5); - } - - // blood - totalDrops = this.rand.nextInt(4 + par2) + 7; - for (int i = 0; i < totalDrops; ++i) - { - this.dropItem(TFItems.fieryBlood, 1); - } - - // trophy - this.dropItem(TFItems.trophy, 1); - } - - /** - * Determines if an entity can be despawned, used on idle far away entities - */ - @Override - protected boolean canDespawn() - { - return false; - } - - /** - * Returns true if the entity is on fire. Used by render to add the fire effect on rendering. - */ - @Override - public boolean isBurning() - { - // never burn - return false; - } - - /** - * handles entity death timer, experience orb and particle creation - */ - @Override - protected void onDeathUpdate() - { - ++this.deathTime; - - // stop any head actions on death - if (deathTime == 1) - { - for (int i = 0; i < numHeads; i++) - { - hc[i].setRespawnCounter(-1); - if (hc[i].isActive()) - { - hc[i].setNextState(HydraHeadContainer.STATE_IDLE); - hc[i].endCurrentAction(); - hc[i].setHurtTime(200); - } - } - } - - // heads die off one by one - if (this.deathTime <= 140 && this.deathTime % 20 == 0) - { - int headToDie = (this.deathTime / 20) - 1; - - if (hc[headToDie].isActive()) - { - hc[headToDie].setNextState(HydraHeadContainer.STATE_DYING); - hc[headToDie].endCurrentAction(); - } - } - - if (this.deathTime == 200) - { - if (!this.worldObj.isRemote && (this.recentlyHit > 0 || this.isPlayer()) && !this.isChild()) - { - int var1 = this.getExperiencePoints(this.attackingPlayer); - - while (var1 > 0) - { - int var2 = EntityXPOrb.getXPSplit(var1); - var1 -= var2; - this.worldObj.spawnEntityInWorld(new EntityXPOrb(this.worldObj, this.posX, this.posY, this.posZ, var2)); - } - } - - this.setDead(); - - } - - for (int var1 = 0; var1 < 20; ++var1) - { - double var8 = this.rand.nextGaussian() * 0.02D; - double var4 = this.rand.nextGaussian() * 0.02D; - double var6 = this.rand.nextGaussian() * 0.02D; - String particle = rand.nextInt(2) == 0 ? "largeexplode" : "explode"; - this.worldObj.spawnParticle(particle, this.posX + this.rand.nextFloat() * this.body.width * 2.0F - this.body.width, this.posY + this.rand.nextFloat() * this.body.height, this.posZ + this.rand.nextFloat() * this.body.width * 2.0F - this.body.width, var8, var4, var6); - } - } - - @Override - public World func_82194_d() { - return this.worldObj; - } - -// @Override -// public int getBossHealth() { -// return this.dataWatcher.getWatchableObjectInt(EntityTFHydra.DATA_BOSSHEALTH); -// } - - -} diff --git a/src/main/java/twilightforest/entity/boss/EntityTFHydraHead.java b/src/main/java/twilightforest/entity/boss/EntityTFHydraHead.java deleted file mode 100644 index 096b4fbe70..0000000000 --- a/src/main/java/twilightforest/entity/boss/EntityTFHydraHead.java +++ /dev/null @@ -1,81 +0,0 @@ -package twilightforest.entity.boss; - -import net.minecraft.world.World; - -public class EntityTFHydraHead extends EntityTFHydraPart { - - public EntityTFHydraHead(World world) - { - super(world); - //texture = TwilightForestMod.MODEL_DIR + "hydra4.png"; - - // the necks draw with the head, so we just draw the head at all times, sorry - this.ignoreFrustumCheck = true; - } - - public EntityTFHydraHead(EntityTFHydra hydra, String s, float f, float f1) { - super(hydra, s, f, f1); - } - - - /** - * Rather than speed, this seems to control how far up or down the heads can tilt? - */ - @Override - public int getVerticalFaceSpeed() - { - return 500; - } - - /** - * We have our own custom death here. In any case, we don't actually ever die, despawn and spew out XP orbs, so don't do that - */ - @Override - protected void onDeathUpdate() { - ++this.deathTime; - } - - @Override - protected void entityInit() - { - super.entityInit(); - dataWatcher.addObject(18, Byte.valueOf((byte)0)); - dataWatcher.addObject(19, Byte.valueOf((byte)0)); - } - - - public float getMouthOpen() - { - return (dataWatcher.getWatchableObjectByte(18) & 0xFF) / 255.0F; - } - - public int getState() - { - return (dataWatcher.getWatchableObjectByte(19) & 0xFF); - } - - public void setMouthOpen(float openness) - { - // bounds - if (openness < 0.0F) - { - openness = 0.0F; - } - if (openness > 1.0F) - { - openness = 1.0F; - } - - int openByte = Math.round(openness * 255); - - openByte &= 0xFF; - dataWatcher.updateObject(18, Byte.valueOf((byte)openByte)); - } - - public void setState(int state) - { - state &= 0xFF; - dataWatcher.updateObject(19, Byte.valueOf((byte)state)); - } - -} diff --git a/src/main/java/twilightforest/entity/boss/EntityTFHydraMortar.java b/src/main/java/twilightforest/entity/boss/EntityTFHydraMortar.java deleted file mode 100644 index 43ba8eae74..0000000000 --- a/src/main/java/twilightforest/entity/boss/EntityTFHydraMortar.java +++ /dev/null @@ -1,232 +0,0 @@ -package twilightforest.entity.boss; - -import java.util.ArrayList; -import java.util.List; - -import net.minecraft.block.Block; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.projectile.EntityThrowable; -import net.minecraft.init.Blocks; -import net.minecraft.util.DamageSource; -import net.minecraft.util.MovingObjectPosition; -import net.minecraft.util.Vec3; -import net.minecraft.world.Explosion; -import net.minecraft.world.World; - -public class EntityTFHydraMortar extends EntityThrowable { - - private static final int BURN_FACTOR = 5; - private static final int DIRECT_DAMAGE = 18; - - public EntityLivingBase playerReflects = null; - - public int fuse = 80; - - public boolean megaBlast = false; - - public EntityTFHydraMortar(World par1World) - { - super(par1World); - this.setSize(0.75F, 0.75F); - - } - - public EntityTFHydraMortar(World par1World, EntityLivingBase par2EntityLiving) { - super(par1World, par2EntityLiving); - this.setSize(0.75F, 0.75F); - } - - /** - * Called to update the entity's position/logic. - */ - @Override - public void onUpdate() - { - super.onUpdate(); - - this.func_145771_j(this.posX, (this.boundingBox.minY + this.boundingBox.maxY) / 2.0D, this.posZ); // push out of block - - if (this.onGround) - { - if (!worldObj.isRemote) - { - // slow down - this.motionX *= 0.9D; - this.motionY *= 0.9D; - this.motionZ *= 0.9D; - } - - // eventually explode - if (this.fuse-- <= 0) - { - detonate(); - } - - } - } - - - /** - * Converts this mortar into a blasting one. - */ - public void setToBlasting() { - this.megaBlast = true; - } - - - /** - * Called when this EntityThrowable hits a block or entity. - */ - @Override - protected void onImpact(MovingObjectPosition mop) { - if (mop.entityHit == null && !megaBlast) - { - // we hit the ground - this.motionY = 0; - this.onGround = true; - } - else - { - detonate(); - - } - } - - @Override - public float func_145772_a(Explosion par1Explosion, World par2World, int par3, int par4, int par5, Block par6Block) - { - float var6 = super.func_145772_a(par1Explosion, par2World, par3, par4, par5, par6Block); - - if (this.megaBlast && par6Block != Blocks.bedrock && par6Block != Blocks.end_portal && par6Block != Blocks.end_portal_frame) - { - var6 = Math.min(0.8F, var6); - } - - return var6; - } - - @SuppressWarnings("unchecked") - protected void detonate() - { - //this.worldObj.playAuxSFX(2004, (int)Math.round(this.posX), (int)Math.round(this.posY), (int)Math.round(this.posZ), 32764); - - //this.worldObj.createExplosion((Entity)null, this.posX, this.posY, this.posZ, explosionPower, true); - - float explosionPower = megaBlast ? 4.0F : 0.1F; - this.worldObj.newExplosion(this, this.posX, this.posY, this.posZ, explosionPower, true, true); - - - if (!worldObj.isRemote) - { - // damage nearby things - List nearbyList = new ArrayList(this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox.expand(1.0D, 1.0D, 1.0D))); - - for (Entity nearby : nearbyList) - { - if (nearby.attackEntityFrom(DamageSource.causeFireballDamage(null, this.getThrower()), DIRECT_DAMAGE) && !nearby.isImmuneToFire()) - { - nearby.setFire(BURN_FACTOR); - } - } - } - - this.setDead(); - } - - /** - * Reflect! - */ - @Override - public boolean attackEntityFrom(DamageSource damagesource, float i) - { -// System.out.println("Hydra mortar being attacked!"); - - setBeenAttacked(); - if (damagesource.getEntity() != null && !this.worldObj.isRemote) - { - Vec3 vec3d = damagesource.getEntity().getLookVec(); - if (vec3d != null) - { - this.setThrowableHeading(vec3d.xCoord, vec3d.yCoord + 1, vec3d.zCoord, 1.5F, 0.1F); // reflect faster and more accurately - this.onGround = false; - this.fuse += 20; - - } - if (damagesource.getEntity() instanceof EntityLivingBase) - { - this.playerReflects = (EntityLivingBase)damagesource.getEntity(); - } - return true; - } - else - { - return false; - } - } - - - /** - * Return who threw this projectile - */ - @Override - public EntityLivingBase getThrower() - { - if (this.playerReflects != null) - { - return this.playerReflects; - } - else - { - return super.getThrower(); - } - } - - /** - * Always be on fire! - */ - @Override - public boolean isBurning() - { - return true; - } - - /** - * Returns true if other Entities should be prevented from moving through this Entity. - */ - @Override - public boolean canBeCollidedWith() - { - return true; - } - - /** - * We need to set this so that the player can attack and reflect the bolt - */ - @Override - public float getCollisionBorderSize() - { - return 1.5F; - } - - /** - * Gets the amount of gravity to apply to the thrown entity with each tick. - */ - @Override - protected float getGravityVelocity() - { - return 0.05F; - } - - @Override - protected float func_70182_d() - { - return 0.75F; - } - - @Override - protected float func_70183_g() - { - return -20.0F; - } -} diff --git a/src/main/java/twilightforest/entity/boss/EntityTFHydraNeck.java b/src/main/java/twilightforest/entity/boss/EntityTFHydraNeck.java deleted file mode 100644 index 5dc898e1d1..0000000000 --- a/src/main/java/twilightforest/entity/boss/EntityTFHydraNeck.java +++ /dev/null @@ -1,9 +0,0 @@ -package twilightforest.entity.boss; - -public class EntityTFHydraNeck extends EntityTFHydraPart { - - public EntityTFHydraNeck(EntityTFHydra hydra, String s, float f, float f1) { - super(hydra, s, f, f1); - } - -} diff --git a/src/main/java/twilightforest/entity/boss/EntityTFHydraPart.java b/src/main/java/twilightforest/entity/boss/EntityTFHydraPart.java deleted file mode 100644 index 92c6e2a3cd..0000000000 --- a/src/main/java/twilightforest/entity/boss/EntityTFHydraPart.java +++ /dev/null @@ -1,161 +0,0 @@ -package twilightforest.entity.boss; - -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLiving; -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.DamageSource; -import net.minecraft.util.MathHelper; -import net.minecraft.world.World; - - -public class EntityTFHydraPart extends EntityLiving { - public EntityTFHydra hydraObj; - - public EntityTFHydraPart(World world) - { - super(world); - isImmuneToFire = true; - } - - public EntityTFHydraPart(EntityTFHydra hydra, String s, float f, float f1) - { - super(hydra.worldObj); - setSize(f, f1); - hydraObj = hydra; - setPartName(s); - - //texture = TwilightForestMod.MODEL_DIR + "hydra4.png"; - isImmuneToFire = true; - - } - - @Override - protected void entityInit() - { - super.entityInit(); - dataWatcher.addObject(17, ""); - } - - - public String getPartName() - { - return dataWatcher.getWatchableObjectString(17); - } - - public void setPartName(String name) - { - dataWatcher.updateObject(17, name); - } - - - @Override - public void writeEntityToNBT(NBTTagCompound nbttagcompound) - { - super.writeEntityToNBT(nbttagcompound); - nbttagcompound.setString("PartName", getPartName()); - } - - @Override - public void readEntityFromNBT(NBTTagCompound nbttagcompound) - { - super.readEntityFromNBT(nbttagcompound); - setPartName(nbttagcompound.getString("PartName")); - } - - /** - * We need this to display bounding boxes - */ - @Override - public void onUpdate() { - if (this.hydraObj != null && this.hydraObj.deathTime > 190) - { - setDead(); - } - - // just die if we've been alive 60 seconds and there's still no body - if (this.hydraObj == null && this.ticksExisted > 1200) - { - setDead(); - } - - super.onEntityUpdate(); - - lastTickPosX = posX; - lastTickPosY = posY; - lastTickPosZ = posZ; - - if (this.newPosRotationIncrements > 0) - { - double var1 = this.posX + (this.newPosX - this.posX) / this.newPosRotationIncrements; - double var3 = this.posY + (this.newPosY - this.posY) / this.newPosRotationIncrements; - double var5 = this.posZ + (this.newPosZ - this.posZ) / this.newPosRotationIncrements; - double var7 = MathHelper.wrapAngleTo180_double(this.newRotationYaw - this.rotationYaw); - this.rotationYaw = (float)(this.rotationYaw + var7 / this.newPosRotationIncrements); - this.rotationPitch = (float)(this.rotationPitch + (this.newRotationPitch - this.rotationPitch) / this.newPosRotationIncrements); - --this.newPosRotationIncrements; - this.setPosition(var1, var3, var5); - this.setRotation(this.rotationYaw, this.rotationPitch); - } - - - - //System.out.println("Updating " + this + " with angles " + rotationYawHead + ", " + rotationPitch); - - - this.rotationYawHead = this.rotationYaw; - this.prevRotationYawHead = this.prevRotationYaw; - - for (; rotationYaw - prevRotationYaw < -180F; prevRotationYaw -= 360F) { } - for (; rotationYaw - prevRotationYaw >= 180F; prevRotationYaw += 360F) { } - for (; renderYawOffset - prevRenderYawOffset < -180F; prevRenderYawOffset -= 360F) { } - for (; renderYawOffset - prevRenderYawOffset >= 180F; prevRenderYawOffset += 360F) { } - for (; rotationPitch - prevRotationPitch < -180F; prevRotationPitch -= 360F) { } - for (; rotationPitch - prevRotationPitch >= 180F; prevRotationPitch += 360F) { } - for (; rotationYawHead - prevRotationYawHead < -180F; prevRotationYawHead -= 360F) { } - for (; rotationYawHead - prevRotationYawHead >= 180F; prevRotationYawHead += 360F) { } - - - - } - - - /** - * Set monster attributes - */ - @Override - protected void applyEntityAttributes() - { - super.applyEntityAttributes(); - this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(1000D); // max health - } - - - @Override - public boolean attackEntityFrom(DamageSource damagesource, float i) - { - if (hydraObj != null) - { - return hydraObj.attackEntityFromPart(this, damagesource, i); - } - else - { - return false; - } - } - - public boolean isEntityEqual(Entity entity) - { - return this == entity || hydraObj == entity; - } - - /** - * Sets the rotation of the entity - */ - @Override - protected void setRotation(float par1, float par2) - { - this.rotationYaw = par1 % 360.0F; - this.rotationPitch = par2 % 360.0F; - } -} diff --git a/src/main/java/twilightforest/entity/boss/EntityTFIceBomb.java b/src/main/java/twilightforest/entity/boss/EntityTFIceBomb.java deleted file mode 100644 index 7f6b5c1443..0000000000 --- a/src/main/java/twilightforest/entity/boss/EntityTFIceBomb.java +++ /dev/null @@ -1,209 +0,0 @@ -package twilightforest.entity.boss; - -import java.util.ArrayList; - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.projectile.EntityThrowable; -import net.minecraft.init.Blocks; -import net.minecraft.potion.Potion; -import net.minecraft.potion.PotionEffect; -import net.minecraft.util.DamageSource; -import net.minecraft.util.MathHelper; -import net.minecraft.util.MovingObjectPosition; -import net.minecraft.world.World; -import twilightforest.TwilightForestMod; -import twilightforest.entity.EntityTFYeti; - -public class EntityTFIceBomb extends EntityThrowable { - - private int zoneTimer = 80; - private boolean hasHit; - - public EntityTFIceBomb(World par1World) { - super(par1World); - } - - public EntityTFIceBomb(World par1World, EntityLivingBase thrower) { - super(par1World, thrower); - } - - /** - * Called when this EntityThrowable hits a block or entity. - */ - @Override - protected void onImpact(MovingObjectPosition mop) { - if (this.getThrower() != null && this.getThrower() instanceof EntityTFYetiAlpha) { - double dist = this.getDistanceSqToEntity(this.getThrower()); - - if (dist <= 100) { - this.setDead(); - } - } - - this.motionY = 0; - this.hasHit = true; - - if (!worldObj.isRemote) { - this.doTerrainEffects(); - } - } - - /** - * Called when this EntityThrowable hits a block or entity. - */ - private void doTerrainEffects() { - int range = 3; - int ix = MathHelper.floor_double(this.lastTickPosX); - int iy = MathHelper.floor_double(this.lastTickPosY); - int iz = MathHelper.floor_double(this.lastTickPosZ); - - for (int x = -range; x <= range; x++) { - for (int y = -range; y <= range; y++) { - for (int z = -range; z <= range; z++) { - this.doTerrainEffect(ix + x, iy + y, iz + z); - } - } - } - } - - /** - * Freeze water, put snow on snowable surfaces - */ - private void doTerrainEffect(int x, int y, int z) { - if (this.worldObj.getBlock(x, y, z).getMaterial() == Material.water) { - this.worldObj.setBlock(x, y, z, Blocks.ice); - } - if (this.worldObj.getBlock(x, y, z).getMaterial() == Material.lava) { - this.worldObj.setBlock(x, y, z, Blocks.obsidian); - } - if (this.worldObj.isAirBlock(x, y, z) && Blocks.snow_layer.canPlaceBlockAt(this.worldObj, x, y, z)) { - this.worldObj.setBlock(x, y, z, Blocks.snow_layer); - } - } - - /** - * Called to update the entity's position/logic. - */ - @Override - public void onUpdate() - { - super.onUpdate(); - - //this.func_145771_j(this.posX, (this.boundingBox.minY + this.boundingBox.maxY) / 2.0D, this.posZ); // push out of block - - if (this.hasHit) - { - if (!worldObj.isRemote) - { - // slow down - this.motionX *= 0.1D; - this.motionY *= 0.1D; - this.motionZ *= 0.1D; - } - - this.zoneTimer--; - - makeIceZone(); - - // eventually explode - if (this.zoneTimer <= 0) - { - detonate(); - } - - } else { - makeTrail(); - } - } - - public void makeTrail() { - for (int i = 0; i < 10; i++) { - double dx = posX + 0.75F * (rand.nextFloat() - 0.5F); - double dy = posY + 0.75F * (rand.nextFloat() - 0.5F); - double dz = posZ + 0.75F * (rand.nextFloat() - 0.5F); - - TwilightForestMod.proxy.spawnParticle(this.worldObj, "snowstuff", dx, dy, dz, 0, 0, 0); - } - } - - private void makeIceZone() { - // nearby sparkles - if (this.worldObj.isRemote) { - // sparkles - for (int i = 0; i < 20; i++) { - double dx = this.posX + (rand.nextFloat() - rand.nextFloat()) * 3.0F; - double dy = this.posY + (rand.nextFloat() - rand.nextFloat()) * 3.0F; - double dz = this.posZ + (rand.nextFloat() - rand.nextFloat()) * 3.0F; - - - TwilightForestMod.proxy.spawnParticle(this.worldObj, "snowstuff", dx, dy, dz, 0.0D, 0.0D, 0.0D); - } - } else { - // damage - if (this.zoneTimer % 10 == 0) { - hitNearbyEntities(); - - } - } - } - - @SuppressWarnings("unchecked") - private void hitNearbyEntities() { - ArrayList nearby = new ArrayList(this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox.expand(3, 2, 3))); - - for (Entity entity : nearby) { - if (entity instanceof EntityLivingBase && entity != this.getThrower()) { - - if (entity instanceof EntityTFYeti) { - // TODO: make "frozen yeti" entity? - entity.setDead(); - int ix = MathHelper.floor_double(entity.lastTickPosX); - int iy = MathHelper.floor_double(entity.lastTickPosY); - int iz = MathHelper.floor_double(entity.lastTickPosZ); - - worldObj.setBlock(ix, iy, iz, Blocks.ice); - worldObj.setBlock(ix, iy + 1, iz, Blocks.ice); - - } else { - entity.attackEntityFrom(DamageSource.magic, 1); - int chillLevel = 2; - ((EntityLivingBase)entity).addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 20 * 5, chillLevel, true)); - } - - } - } - } - - private void detonate() { - this.setDead(); - } - - public Block getBlock() { - return Blocks.packed_ice; - } - - @Override - protected float func_70182_d() - { - // velocity - return 0.75F; - } - - /** - * Gets the amount of gravity to apply to the thrown entity with each tick. - */ - @Override - protected float getGravityVelocity() - { - return this.hasHit ? 0F : 0.025F; - } - - @Override - protected float func_70183_g() - { - return -20.0F; - } -} diff --git a/src/main/java/twilightforest/entity/boss/EntityTFIceCrystal.java b/src/main/java/twilightforest/entity/boss/EntityTFIceCrystal.java deleted file mode 100644 index 407e8c31cb..0000000000 --- a/src/main/java/twilightforest/entity/boss/EntityTFIceCrystal.java +++ /dev/null @@ -1,133 +0,0 @@ -package twilightforest.entity.boss; - -import twilightforest.TwilightForestMod; -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.ai.EntityAIAttackOnCollide; -import net.minecraft.entity.ai.EntityAIHurtByTarget; -import net.minecraft.entity.ai.EntityAILookIdle; -import net.minecraft.entity.ai.EntityAINearestAttackableTarget; -import net.minecraft.entity.ai.EntityAISwimming; -import net.minecraft.entity.ai.EntityAIWander; -import net.minecraft.entity.ai.EntityAIWatchClosest; -import net.minecraft.entity.monster.EntityMob; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Items; -import net.minecraft.item.Item; -import net.minecraft.world.World; - -public class EntityTFIceCrystal extends EntityMob { - - private int crystalAge; - public int maxCrystalAge; - - - public EntityTFIceCrystal(World par1World) { - super(par1World); - - this.tasks.addTask(0, new EntityAISwimming(this)); - this.tasks.addTask(1, new EntityAIAttackOnCollide(this, EntityPlayer.class, 1.0D, false)); - this.tasks.addTask(2, new EntityAIWander(this, 1.0D)); - this.tasks.addTask(3, new EntityAIWatchClosest(this, EntityPlayer.class, 8.0F)); - this.tasks.addTask(3, new EntityAILookIdle(this)); - this.targetTasks.addTask(1, new EntityAIHurtByTarget(this, true)); - this.targetTasks.addTask(2, new EntityAINearestAttackableTarget(this, EntityPlayer.class, 0, true)); - this.setSize(0.6F, 1.8F); - - this.maxCrystalAge = -1; - - //this.setCurrentItemOrArmor(0, new ItemStack(TFItems.iceSword)); - - } - - - protected void applyEntityAttributes() - { - super.applyEntityAttributes(); - this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(10.0D); - this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.23000000417232513D); - this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(5.0D); - } - - - /** - * Returns true if the newer Entity AI code should be run - */ - protected boolean isAIEnabled() - { - return true; - } - - /** - * Returns the item ID for the item the mob drops on death. - */ - protected Item getDropItem() - { - return Items.snowball; - } - - /** - * Will return how many at most can spawn in a chunk at once. - */ - public int getMaxSpawnedInChunk() - { - return 8; - } - - @Override - protected String getLivingSound() - { - return TwilightForestMod.ID + ":mob.ice.noise"; - } - - /** - * Returns the sound this mob makes when it is hurt. - */ - protected String getHurtSound() - { - return TwilightForestMod.ID + ":mob.ice.hurt"; - } - - /** - * Returns the sound this mob makes on death. - */ - protected String getDeathSound() - { - return TwilightForestMod.ID + ":mob.ice.death"; - } - - - /** - * Used by the snow queen when she summons crystals - */ - public void setToDieIn30Seconds() { - this.maxCrystalAge = 600; - } - -// -// /** -// * Get this Entity's EnumCreatureAttribute -// */ -// public EnumCreatureAttribute getCreatureAttribute() -// { -// return EnumCreatureAttribute.UNDEAD; -// } - - - /** - * Called frequently so the entity can update its state every tick as required. For example, zombies and skeletons - * use this to react to sunlight and start to burn. - */ - public void onLivingUpdate() - { - super.onLivingUpdate(); - - this.crystalAge++; - - //System.out.println("I am a skeleton and my age is " + this.skeletonAge); - - // die after 30 seconds - if (this.maxCrystalAge > 0 && this.crystalAge >= this.maxCrystalAge && !this.worldObj.isRemote) { - this.setDead(); - } - } -} diff --git a/src/main/java/twilightforest/entity/boss/EntityTFKnightPhantom.java b/src/main/java/twilightforest/entity/boss/EntityTFKnightPhantom.java deleted file mode 100644 index f63fc676e1..0000000000 --- a/src/main/java/twilightforest/entity/boss/EntityTFKnightPhantom.java +++ /dev/null @@ -1,998 +0,0 @@ -package twilightforest.entity.boss; - -import java.util.List; - -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityFlying; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.monster.IMob; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.nbt.NBTTagList; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.ChunkCoordinates; -import net.minecraft.util.DamageSource; -import net.minecraft.util.MathHelper; -import net.minecraft.util.Vec3; -import net.minecraft.world.EnumDifficulty; -import net.minecraft.world.World; -import twilightforest.TFAchievementPage; -import twilightforest.TFFeature; -import twilightforest.TFTreasure; -import twilightforest.TwilightForestMod; -import twilightforest.item.TFItems; -import twilightforest.world.ChunkProviderTwilightForest; -import twilightforest.world.TFWorldChunkManager; -import twilightforest.world.WorldProviderTwilightForest; - -public class EntityTFKnightPhantom extends EntityFlying implements IMob -{ - - private static final float CIRCLE_SMALL_RADIUS = 2.5F; - private static final float CIRCLE_LARGE_RADIUS = 8.5F; - private static final int FLAG_CHARGING = 17; - int number; - int ticksProgress; - Formation currentFormation; - - private ChunkCoordinates homePosition = new ChunkCoordinates(0, 0, 0); - /** If -1 there is no maximum distance */ - private float maximumHomeDistance = -1.0F; - - private int chargePosX; - private int chargePosY; - private int chargePosZ; - - public enum Formation { HOVER, LARGE_CLOCKWISE, SMALL_CLOCKWISE, LARGE_ANTICLOCKWISE, SMALL_ANTICLOCKWISE, CHARGE_PLUSX, CHARGE_MINUSX, CHARGE_PLUSZ, CHARGE_MINUSZ, WAITING_FOR_LEADER, ATTACK_PLAYER_START, ATTACK_PLAYER_ATTACK}; - - public EntityTFKnightPhantom(World par1World) { - super(par1World); - - this.setSize(1.5F, 3.0F); - - this.noClip = true; - this.isImmuneToFire = true; - - this.currentFormation = Formation.HOVER; - - this.experienceValue = 93; - - this.setCurrentItemOrArmor(0, new ItemStack(TFItems.knightlySword)); - this.setCurrentItemOrArmor(3, new ItemStack(TFItems.phantomPlate)); - this.setCurrentItemOrArmor(4, new ItemStack(TFItems.phantomHelm)); - - - } - - - @Override - protected void entityInit() - { - super.entityInit(); - dataWatcher.addObject(FLAG_CHARGING, Byte.valueOf((byte)0)); - } - - /** - * Set monster attributes - */ - @Override - protected void applyEntityAttributes() - { - super.applyEntityAttributes(); - this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(35.0D); // max health - this.getAttributeMap().registerAttribute(SharedMonsterAttributes.attackDamage); // initialize this value - this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(1.0D); // attack damage - } - - /** - * Determines if an entity can be despawned, used on idle far away entities - */ - @Override - protected boolean canDespawn() - { - return false; - } - - /** - * Called when the entity is attacked. - */ - public boolean attackEntityFrom(DamageSource par1DamageSource, float par2) - { - if (this.isEntityInvulnerable()) - { - return false; - } - else if (par1DamageSource == DamageSource.inWall) - { - return false; - } - else - { - return super.attackEntityFrom(par1DamageSource, par2); - } - } - - /** - * Called frequently so the entity can update its state every tick as required. For example, zombies and skeletons - * use this to react to sunlight and start to burn. - */ - public void onLivingUpdate() - { - super.onLivingUpdate(); - - if (this.isChargingAtPlayer()) - { - // make particles - for (int i = 0; i < 4; ++i) - { - Item particleID = this.rand.nextBoolean() ? TFItems.phantomHelm : TFItems.knightlySword; - - worldObj.spawnParticle("iconcrack_" + Item.getIdFromItem(particleID), this.posX + (this.rand.nextFloat() * this.rand.nextFloat() - 0.5D) * this.width, this.posY + this.rand.nextFloat() * (this.height - 0.75D) + 0.5D, this.posZ + (this.rand.nextFloat() * this.rand.nextFloat() - 0.5D) * this.width, 0, -0.1, 0); - worldObj.spawnParticle("smoke", this.posX + (this.rand.nextFloat() * this.rand.nextFloat() - 0.5D) * this.width, this.posY + this.rand.nextFloat() * (this.height - 0.75D) + 0.5D, this.posZ + (this.rand.nextFloat() * this.rand.nextFloat() - 0.5D) * this.width, 0, 0.1, 0); - } - } - } - - /** - * handles entity death timer, experience orb and particle creation - */ - @Override - protected void onDeathUpdate() - { - super.onDeathUpdate(); - - for (int i = 0; i < 20; ++i) - { - double d0 = this.rand.nextGaussian() * 0.02D; - double d1 = this.rand.nextGaussian() * 0.02D; - double d2 = this.rand.nextGaussian() * 0.02D; - this.worldObj.spawnParticle("explode", this.posX + (double)(this.rand.nextFloat() * this.width * 2.0F) - (double)this.width, this.posY + (double)(this.rand.nextFloat() * this.height), this.posZ + (double)(this.rand.nextFloat() * this.width * 2.0F) - (double)this.width, d0, d1, d2); - } - - - } - - /** - * Trigger achievement when killed - */ - @Override - public void onDeath(DamageSource par1DamageSource) { - super.onDeath(par1DamageSource); - if (par1DamageSource.getSourceOfDamage() instanceof EntityPlayer) { - ((EntityPlayer)par1DamageSource.getSourceOfDamage()).triggerAchievement(TFAchievementPage.twilightHunter); - ((EntityPlayer)par1DamageSource.getSourceOfDamage()).triggerAchievement(TFAchievementPage.twilightProgressKnights); - } - - // mark the stronghold as defeated - if (!worldObj.isRemote && worldObj.provider instanceof WorldProviderTwilightForest) { - int dx = getHomePosition().posX; - int dy = getHomePosition().posY; - int dz = getHomePosition().posZ; - - ChunkProviderTwilightForest chunkProvider = ((WorldProviderTwilightForest)worldObj.provider).getChunkProvider(); - TFFeature nearbyFeature = ((TFWorldChunkManager)worldObj.provider.worldChunkMgr).getFeatureAt(dx, dz, worldObj); - - if (nearbyFeature == TFFeature.tfStronghold) { - chunkProvider.setStructureConquered(dx, dy, dz, true); - } - } - - - // make treasure for killing the last knight - if (!this.worldObj.isRemote) { - // am I the last one?!?! - List nearbyKnights = getNearbyKnights(); - if (nearbyKnights.size() <= 1) - { - // make a treasure!' - //System.out.println("I think I'm the last one!"); - this.makeATreasure(); - } - } - - } - - /** - * Make a treasure for when we're dead - */ - private void makeATreasure() { - if (this.getHomePosition().posX != 0) { - // if we have a proper home position, generate the treasure there - TFTreasure.stronghold_boss.generate(worldObj, null, getHomePosition().posX, getHomePosition().posY - 1, getHomePosition().posZ); - } else { - // if not, spawn it right where we are - int px = MathHelper.floor_double(this.lastTickPosX); - int py = MathHelper.floor_double(this.lastTickPosY); - int pz = MathHelper.floor_double(this.lastTickPosZ); - - TFTreasure.stronghold_boss.generate(worldObj, null, px, py, pz); - } - } - - - /** - * Formation-based AI - */ - protected void updateEntityActionState() - { - if (!this.worldObj.isRemote && this.worldObj.difficultySetting == EnumDifficulty.PEACEFUL) - { - this.setDead(); - } - - this.despawnEntity(); - - this.noClip = this.ticksProgress % 20 != 0; - - ticksProgress++; - - if (ticksProgress >= getMaxTicksForFormation()) - { - switchToNextFormation(); - } - - float seekRange = this.isChargingAtPlayer() ? 24 : 9; - - EntityPlayer target = this.worldObj.getClosestVulnerablePlayerToEntity(this, seekRange); - //EntityPlayer target = this.worldObj.getClosestPlayerToEntity(this, seekRange); - - if (target != null && this.currentFormation == Formation.ATTACK_PLAYER_START) - { - int targetX = MathHelper.floor_double(target.lastTickPosX); - int targetY = MathHelper.floor_double(target.lastTickPosY); - int targetZ = MathHelper.floor_double(target.lastTickPosZ); - - if (this.isWithinHomeArea(targetX, targetY, targetZ)) - { - this.chargePosX = targetX; - this.chargePosY = targetY; - this.chargePosZ = targetZ; - } - else - { - this.chargePosX = this.getHomePosition().posX; - this.chargePosY = this.getHomePosition().posY; - this.chargePosZ = this.getHomePosition().posZ; - } - } - - Vec3 dest = this.getDestination(); - -// if (this.getNumber() == 0) -// { -// System.out.printf("Knight Phantom %d moving towards %f, %f, %f. Is in formation %s, progress %d.\n", this.getNumber(), dest.xCoord, dest.yCoord, dest.zCoord, this.currentFormation, ticksProgress); -// System.out.printf("Knight Phantom %d at position %f, %f, %f.\n", this.getNumber(), this.posX, this.posY, this.posZ); -// } - - double moveX = dest.xCoord - this.posX; - double moveY = dest.yCoord - this.posY; - double moveZ = dest.zCoord - this.posZ; - - double factor = moveX * moveX + moveY * moveY + moveZ * moveZ; - - factor = (double)MathHelper.sqrt_double(factor); - - double speed = 0.1D;//this.isChargingAtPlayer() ? 0.1D : 0.05D; - - this.motionX += moveX / factor * speed; - this.motionY += moveY / factor * speed; - this.motionZ += moveZ / factor * speed; - - if (target != null) - { - this.faceEntity(target, 10.0F, 500.0F); - - if (target.isEntityAlive()) - { - float f1 = target.getDistanceToEntity(this); - - if (this.canEntityBeSeen(target)) - { - this.attackEntity(target, f1); - } - } - - // launch axe at the appropriate time in our routine - if (isAxeKnight() && this.currentFormation == Formation.ATTACK_PLAYER_ATTACK && (this.ticksProgress % 4) == 0) - { - this.launchAxeAt(target); - } - - // same for picks - if (isPickKnight() && this.currentFormation == Formation.ATTACK_PLAYER_ATTACK && (this.ticksProgress % 4) == 0) - { - this.launchPicks(); - } - - } - - - //this.setPosition(dest.xCoord, dest.yCoord, dest.zCoord); - } - - - /** - * Basic mob attack. Default to touch of death in EntityCreature. Overridden by each mob to define their attack. - */ - protected void attackEntity(Entity par1Entity, float par2) - { - - if (this.attackTime <= 0 && par2 < 2.0F && par1Entity.boundingBox.maxY > this.boundingBox.minY && par1Entity.boundingBox.minY < this.boundingBox.maxY) - { - this.attackTime = 20; - this.attackEntityAsMob(par1Entity); - - } - } - - /** - * Copy of EntityMob attack - */ - public boolean attackEntityAsMob(Entity par1Entity) - { - float f = getAttackDamage(); - int i = 0; - - if (par1Entity instanceof EntityLivingBase) - { - f += EnchantmentHelper.getEnchantmentModifierLiving(this, (EntityLivingBase)par1Entity); - i += EnchantmentHelper.getKnockbackModifier(this, (EntityLivingBase)par1Entity); - } - - boolean flag = par1Entity.attackEntityFrom(DamageSource.causeMobDamage(this), f); - - if (flag) - { - if (i > 0) - { - par1Entity.addVelocity((double)(-MathHelper.sin(this.rotationYaw * (float)Math.PI / 180.0F) * (float)i * 0.5F), 0.1D, (double)(MathHelper.cos(this.rotationYaw * (float)Math.PI / 180.0F) * (float)i * 0.5F)); - this.motionX *= 0.6D; - this.motionZ *= 0.6D; - } - - int j = EnchantmentHelper.getFireAspectModifier(this); - - if (j > 0) - { - par1Entity.setFire(j * 4); - } - - if (par1Entity instanceof EntityLivingBase) - { - //EnchantmentThorns.func_151367_b(this, (EntityLivingBase)par1Entity, this.rand); - } - } - - return flag; - } - - - /** - * How much damage do we deal, per attack? - * @return - */ - private float getAttackDamage() { - float damage = (float)this.getEntityAttribute(SharedMonsterAttributes.attackDamage).getAttributeValue(); - - if (this.isChargingAtPlayer()) - { - damage += 7; - } - - return damage; - } - - /** - * Fires an axe at the target - * @param targetedEntity - */ - protected void launchAxeAt(Entity targetedEntity) { - float bodyFacingAngle = ((renderYawOffset * 3.141593F) / 180F); - double sx = posX + (MathHelper.cos(bodyFacingAngle) * 1); - double sy = posY + (height * 0.82); - double sz = posZ + (MathHelper.sin(bodyFacingAngle) * 1); - - double tx = targetedEntity.posX - sx; - double ty = (targetedEntity.boundingBox.minY + (double)(targetedEntity.height / 2.0F)) - (posY + height / 2.0F); - double tz = targetedEntity.posZ - sz; - - worldObj.playSoundAtEntity(this, "random.bow", getSoundVolume(), (rand.nextFloat() - rand.nextFloat()) * 0.2F + 0.4F); - EntityTFThrownAxe projectile = new EntityTFThrownAxe(worldObj, this); - - float speed = 0.75F; - - projectile.setThrowableHeading(tx, ty, tz, speed, 1.0F); - - projectile.setLocationAndAngles(sx, sy, sz, rotationYaw, rotationPitch); - - worldObj.spawnEntityInWorld(projectile); - } - - protected void launchPicks() - { - worldObj.playSoundAtEntity(this, "random.bow", getSoundVolume(), (rand.nextFloat() - rand.nextFloat()) * 0.2F + 0.4F); - - for (int i = 0; i < 8; i++) - { - float throwAngle = i * 3.14159165F / 4F; - - - double sx = posX + (MathHelper.cos(throwAngle) * 1); - double sy = posY + (height * 0.82); - double sz = posZ + (MathHelper.sin(throwAngle) * 1); - - double vx = MathHelper.cos(throwAngle); - double vy = 0; - double vz = MathHelper.sin(throwAngle); - - - EntityTFThrownPick projectile = new EntityTFThrownPick(worldObj, this); - - - projectile.setLocationAndAngles(sx, sy, sz, i * 45F, rotationPitch); - - float speed = 0.5F; - - projectile.setThrowableHeading(vx, vy, vz, speed, 1.0F); - - worldObj.spawnEntityInWorld(projectile); - } - } - - /** - * Returns true if this entity should push and be pushed by other entities when colliding. - */ - public boolean canBePushed() - { - return true; - } - - /** - * knocks back this entity - */ - @Override - public void knockBack(Entity par1Entity, float damage, double par3, double par5) - { - this.isAirBorne = true; - float f = MathHelper.sqrt_double(par3 * par3 + par5 * par5); - float distance = 0.2F; - this.motionX /= 2.0D; - this.motionY /= 2.0D; - this.motionZ /= 2.0D; - this.motionX -= par3 / (double)f * (double)distance; - this.motionY += (double)distance; - this.motionZ -= par5 / (double)f * (double)distance; - - if (this.motionY > 0.4000000059604645D) - { - this.motionY = 0.4000000059604645D; - } - } - - /** - * Called each time the current formation ends. - * - * If the current knight is the leader knight, it will pick and broadcast a new formation. - */ - public void switchToNextFormation() { - List nearbyKnights = getNearbyKnights(); - - if (this.currentFormation == Formation.ATTACK_PLAYER_START) - { - this.switchToFormation(Formation.ATTACK_PLAYER_ATTACK); - } - else if (this.currentFormation == Formation.ATTACK_PLAYER_ATTACK) - { - if (nearbyKnights.size() > 1) - { - this.switchToFormation(Formation.WAITING_FOR_LEADER); - } - else - { - // random weapon switch! - switch (rand.nextInt(3)) - { - case 0: - this.setCurrentItemOrArmor(0, new ItemStack(TFItems.knightlySword)); - break; - case 1: - this.setCurrentItemOrArmor(0, new ItemStack(TFItems.knightlyAxe)); - break; - case 2: - this.setCurrentItemOrArmor(0, new ItemStack(TFItems.knightlyPick)); - break; - } - - this.switchToFormation(Formation.ATTACK_PLAYER_START); - } - } - else if (this.currentFormation == Formation.WAITING_FOR_LEADER) - { - //System.out.println("I am done waiting"); - - // try to find a nearby knight and do what they're doing - if (nearbyKnights.size() > 1) - { - this.switchToFormation(nearbyKnights.get(1).currentFormation); - this.ticksProgress = nearbyKnights.get(1).ticksProgress; - } - else - { - this.switchToFormation(Formation.ATTACK_PLAYER_START); - //System.out.println("Can't find nearby knight, charging"); - } - } - else - { - - if (isThisTheLeader(nearbyKnights)) - { - // pick a random formation - pickRandomFormation(); - - // broadcast it - broadcastMyFormation(nearbyKnights); - - // if no one is charging - if (isNobodyCharging(nearbyKnights)) - { - makeARandomKnightCharge(nearbyKnights); - } - } - } - } - - - @SuppressWarnings("unchecked") - private List getNearbyKnights() { - List nearbyKnights = worldObj.getEntitiesWithinAABB(EntityTFKnightPhantom.class, AxisAlignedBB.getBoundingBox(this.posX, this.posY, this.posZ, this.posX + 1, this.posY + 1, this.posZ + 1).expand(32.0D, 8.0D, 32.0D)); - return nearbyKnights; - } - - /** - * Pick a random formation. Called by the leader when his current formation duration ends - */ - protected void pickRandomFormation() { - switch (rand.nextInt(8)) - { - case 0: - currentFormation = Formation.SMALL_CLOCKWISE; - break; - case 1: - currentFormation = Formation.SMALL_ANTICLOCKWISE; - //currentFormation = Formation.LARGE_ANTICLOCKWISE; - break; - case 2: - currentFormation = Formation.SMALL_ANTICLOCKWISE; - break; - case 3: - currentFormation = Formation.CHARGE_PLUSX; - break; - case 4: - currentFormation = Formation.CHARGE_MINUSX; - break; - case 5: - currentFormation = Formation.CHARGE_PLUSZ; - break; - case 6: - currentFormation = Formation.CHARGE_MINUSZ; - break; - case 7: - currentFormation = Formation.SMALL_CLOCKWISE; - //currentFormation = Formation.LARGE_CLOCKWISE; - break; - } - - this.switchToFormation(currentFormation); - } - - /** - * Check within 20ish squares. If this phantom is the lowest numbered one, return true - * @param nearbyKnights - */ - private boolean isThisTheLeader(List nearbyKnights) { - - boolean iAmTheLowest = true; - - //System.out.println("Checking " + nearbyKnights.size() + " knights to see if I'm the leader"); - - - // find more knights - - for (EntityTFKnightPhantom knight : nearbyKnights) - { - if (knight.getNumber() < this.getNumber()) - { - iAmTheLowest = false; - break; // don't bother checking more - } - } - - return iAmTheLowest; - } - - private boolean isNobodyCharging(List nearbyKnights) { - boolean noCharge = true; - for (EntityTFKnightPhantom knight : nearbyKnights) - { - if (knight.isChargingAtPlayer()) - { - noCharge = false; - break; // don't bother checking more - } - } - - return noCharge; - } - - /** - * Tell a random knight from the list to charge - */ - private void makeARandomKnightCharge(List nearbyKnights) { - int randomNum = rand.nextInt(nearbyKnights.size()); - - nearbyKnights.get(randomNum).switchToFormation(Formation.ATTACK_PLAYER_START); - - //System.out.println("Telling knight " + randomNum + " to charge"); - } - - - /** - * Tell all the knights on the list to do something - */ - private void broadcastMyFormation(List nearbyKnights) { - // find more knights - - //System.out.println("Broadcasting to " + nearbyKnights.size() + " knights"); - - for (EntityTFKnightPhantom knight : nearbyKnights) - { - if (!knight.isChargingAtPlayer()) - { - //System.out.println("Telling knight " + knight + " to switch"); - knight.switchToFormation(this.currentFormation); - } - } - - //System.out.println("knight phantom broadcast switch to formation " + this.currentFormation); - } - - public boolean isChargingAtPlayer() - { - return dataWatcher.getWatchableObjectByte(FLAG_CHARGING) != 0; - } - - public void setChargingAtPlayer(boolean flag) - { - if (flag) - { - dataWatcher.updateObject(FLAG_CHARGING, Byte.valueOf((byte)127)); - } - else - { - dataWatcher.updateObject(FLAG_CHARGING, Byte.valueOf((byte)0)); - } - } - - @Override - protected String getLivingSound() - { - return TwilightForestMod.ID + ":mob.wraith.wraith"; - } - - @Override - protected String getHurtSound() - { - return TwilightForestMod.ID + ":mob.wraith.wraith"; - } - - @Override - protected String getDeathSound() - { - return TwilightForestMod.ID + ":mob.wraith.wraith"; - } - - - private void switchToFormationByNumber(int formationNumber) { - - currentFormation = Formation.values()[formationNumber]; - - this.ticksProgress = 0; - } - - public void switchToFormation(Formation formation) - { - //System.out.println("Knight " + this.getNumber() + " now switching to formation " + formation); - - this.currentFormation = formation; - this.ticksProgress = 0; - - this.setChargingAtPlayer(this.currentFormation == Formation.ATTACK_PLAYER_START || this.currentFormation == Formation.ATTACK_PLAYER_ATTACK); - - } - - public int getFormationAsNumber() - { - return this.currentFormation.ordinal(); - } - - - public int getTicksProgress() { - return ticksProgress; - } - - public void setTicksProgress(int ticksProgress) { - this.ticksProgress = ticksProgress; - } - - public int getMaxTicksForFormation() - { - switch (currentFormation) - { - default: - case HOVER: - return 90; - case LARGE_CLOCKWISE: - return 180; - case SMALL_CLOCKWISE: - return 90; - case LARGE_ANTICLOCKWISE: - return 180; - case SMALL_ANTICLOCKWISE: - return 90; - case CHARGE_PLUSX: - return 180; - case CHARGE_MINUSX: - return 180; - case CHARGE_PLUSZ: - return 180; - case CHARGE_MINUSZ: - return 180; - case ATTACK_PLAYER_START: - return 50; - case ATTACK_PLAYER_ATTACK: - return 50; - case WAITING_FOR_LEADER: - return 10; - } - } - - private Vec3 getDestination() { - - if (!this.hasHome()) - { - // hmmm - } - - switch (currentFormation) - { - case LARGE_CLOCKWISE: - return getCirclePosition(CIRCLE_LARGE_RADIUS, true); - case SMALL_CLOCKWISE: - return getCirclePosition(CIRCLE_SMALL_RADIUS, true); - case LARGE_ANTICLOCKWISE: - return getCirclePosition(CIRCLE_LARGE_RADIUS, false); - case SMALL_ANTICLOCKWISE: - return getCirclePosition(CIRCLE_SMALL_RADIUS, false); - case CHARGE_PLUSX: - return getMoveAcrossPosition(true, true); - case CHARGE_MINUSX: - return getMoveAcrossPosition(false, true); - case CHARGE_PLUSZ: - return getMoveAcrossPosition(true, false); - case ATTACK_PLAYER_START: - case HOVER: - return getHoverPosition(CIRCLE_LARGE_RADIUS); - case CHARGE_MINUSZ: - return getMoveAcrossPosition(false, false); - case WAITING_FOR_LEADER: - return getLoiterPosition(); - case ATTACK_PLAYER_ATTACK: - return getAttackPlayerPosition(); - default: - return getLoiterPosition(); - } - } - - private Vec3 getMoveAcrossPosition(boolean plus, boolean alongX) { - - float offset0 = (this.getNumber() * 3F) - 7.5F; - - float offset1; - - if (this.ticksProgress < 60) - { - offset1 = -7F; - } - else - { - offset1 = -7F + (((this.ticksProgress - 60) / 120F) * 14F); - } - - if (!plus) - { - offset1 *= -1; - } - - - double dx = this.getHomePosition().posX + (alongX ? offset0 : offset1); - double dy = this.getHomePosition().posY + Math.cos(this.ticksProgress / 7F + this.getNumber()); - double dz = this.getHomePosition().posZ + (alongX ? offset1 : offset0); - return Vec3.createVectorHelper(dx, dy, dz); - } - - protected Vec3 getCirclePosition(float distance, boolean clockwise) { - float angle = (this.ticksProgress * 2.0F); - - if (!clockwise) - { - angle *= -1; - } - - angle += (60F * this.getNumber()); - - double dx = this.getHomePosition().posX + Math.cos((angle) * Math.PI / 180.0D) * distance; - double dy = this.getHomePosition().posY + Math.cos(this.ticksProgress / 7F + this.getNumber()); - double dz = this.getHomePosition().posZ + Math.sin((angle) * Math.PI / 180.0D) * distance; - return Vec3.createVectorHelper(dx, dy, dz); - } - - private Vec3 getHoverPosition(float distance) { - // bound this by distance so we don't hover in walls if we get knocked into them - - double dx = this.lastTickPosX; - double dy = this.getHomePosition().posY + Math.cos(this.ticksProgress / 7F + this.getNumber()); - double dz = this.lastTickPosZ; - - // let's just bound this by 2D distance - double ox = (this.getHomePosition().posX - dx); - double oz = (this.getHomePosition().posZ - dz); - double dDist = Math.sqrt(ox * ox + oz * oz); - - if (dDist > distance) - { -// System.out.println("Phantom hovering beyond normal bounds"); - - // normalize back to boundaries - - dx = this.getHomePosition().posX + (ox / dDist * distance); - dz = this.getHomePosition().posZ + (oz / dDist * distance); - } - - return Vec3.createVectorHelper(dx, dy, dz); - } - - private Vec3 getLoiterPosition() { - double dx = this.getHomePosition().posX; - double dy = this.getHomePosition().posY + Math.cos(this.ticksProgress / 7F + this.getNumber()); - double dz = this.getHomePosition().posZ; - return Vec3.createVectorHelper(dx, dy, dz); - } - - - private Vec3 getAttackPlayerPosition() { - if (isSwordKnight()) - { - return Vec3.createVectorHelper(this.chargePosX, this.chargePosY, this.chargePosZ); - } - else - { - return getHoverPosition(CIRCLE_LARGE_RADIUS); - } - - } - - - public boolean isSwordKnight() { - return this.getEquipmentInSlot(0) != null && this.getEquipmentInSlot(0).getItem() == TFItems.knightlySword; - } - public boolean isAxeKnight() { - return this.getEquipmentInSlot(0) != null && this.getEquipmentInSlot(0).getItem() == TFItems.knightlyAxe; - } - public boolean isPickKnight() { - return this.getEquipmentInSlot(0) != null && this.getEquipmentInSlot(0).getItem() == TFItems.knightlyPick; - } - - - public int getNumber() { - return number; - } - - public void setNumber(int number) { - this.number = number; - - // set weapon per number - switch (number % 3) - { - case 0: - this.setCurrentItemOrArmor(0, new ItemStack(TFItems.knightlySword)); - break; - case 1: - this.setCurrentItemOrArmor(0, new ItemStack(TFItems.knightlyAxe)); - break; - case 2: - this.setCurrentItemOrArmor(0, new ItemStack(TFItems.knightlyPick)); - break; - } - } - - @Override - public void writeEntityToNBT(NBTTagCompound nbttagcompound) - { - super.writeEntityToNBT(nbttagcompound); - ChunkCoordinates home = this.getHomePosition(); - nbttagcompound.setTag("Home", newDoubleNBTList(new double[] { - home.posX, home.posY, home.posZ - })); - nbttagcompound.setBoolean("HasHome", this.hasHome()); - nbttagcompound.setInteger("MyNumber", this.getNumber()); - nbttagcompound.setInteger("Formation", this.getFormationAsNumber()); - nbttagcompound.setInteger("TicksProgress", this.getTicksProgress()); - } - - @Override - public void readEntityFromNBT(NBTTagCompound nbttagcompound) - { - super.readEntityFromNBT(nbttagcompound); - - if (nbttagcompound.hasKey("Home", 9)) - { - NBTTagList nbttaglist = nbttagcompound.getTagList("Home", 6); - int hx = (int) nbttaglist.func_150309_d(0); - int hy = (int) nbttaglist.func_150309_d(1); - int hz = (int) nbttaglist.func_150309_d(2); - this.setHomeArea(hx, hy, hz, 20); - } - if (!nbttagcompound.getBoolean("HasHome")) - { - this.detachHome(); - } - this.setNumber(nbttagcompound.getInteger("MyNumber")); - this.switchToFormationByNumber(nbttagcompound.getInteger("Formation")); - this.setTicksProgress(nbttagcompound.getInteger("TicksProgress")); - } - -// public boolean func_110173_bK() -// { -// return this.func_110176_b(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.posY), MathHelper.floor_double(this.posZ)); -// } - - public boolean isWithinHomeArea(int par1, int par2, int par3) - { - return this.maximumHomeDistance == -1.0F ? true : this.homePosition.getDistanceSquared(par1, par2, par3) < this.maximumHomeDistance * this.maximumHomeDistance; - } - - public void setHomeArea(int par1, int par2, int par3, int par4) - { - - this.homePosition.set(par1, par2, par3); - this.maximumHomeDistance = (float)par4; - - } - - public ChunkCoordinates getHomePosition() - { - return this.homePosition; - } - - public float getMaximumHomeDistance() - { - return this.maximumHomeDistance; - } - - public void detachHome() - { - this.maximumHomeDistance = -1.0F; - } - - public boolean hasHome() - { - return this.maximumHomeDistance != -1.0F; - } - - -} diff --git a/src/main/java/twilightforest/entity/boss/EntityTFLich.java b/src/main/java/twilightforest/entity/boss/EntityTFLich.java deleted file mode 100644 index ae4b66581c..0000000000 --- a/src/main/java/twilightforest/entity/boss/EntityTFLich.java +++ /dev/null @@ -1,1087 +0,0 @@ -package twilightforest.entity.boss; - -import java.util.List; - -import net.minecraft.block.Block; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLiving; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.EnumCreatureAttribute; -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.boss.IBossDisplayData; -import net.minecraft.entity.monster.EntityCreeper; -import net.minecraft.entity.monster.EntityEnderman; -import net.minecraft.entity.monster.EntityMob; -import net.minecraft.entity.monster.EntitySkeleton; -import net.minecraft.entity.monster.EntitySpider; -import net.minecraft.entity.monster.EntityZombie; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.init.Items; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.DamageSource; -import net.minecraft.util.MathHelper; -import net.minecraft.util.Vec3; -import net.minecraft.world.World; -import twilightforest.TFAchievementPage; -import twilightforest.TFFeature; -import twilightforest.entity.EntityTFSwarmSpider; -import twilightforest.item.TFItems; -import twilightforest.world.ChunkProviderTwilightForest; -import twilightforest.world.TFWorldChunkManager; -import twilightforest.world.WorldProviderTwilightForest; - - - - -public class EntityTFLich extends EntityMob implements IBossDisplayData { - - - private static final int DATA_ISCLONE = 21; - private static final int DATA_SHIELDSTRENGTH = 17; - private static final int DATA_MINIONSLEFT = 18; - private static final int DATA_BOSSHEALTH = 19; - private static final int DATA_ATTACKTYPE = 20; - - EntityTFLich masterLich; - - private static final ItemStack heldItems[] = {new ItemStack(TFItems.scepterTwilight, 1), new ItemStack(TFItems.scepterZombie, 1), new ItemStack(Items.golden_sword, 1)}; - public static final int MAX_SHADOW_CLONES = 2; - public static final int INITIAL_SHIELD_STRENGTH = 5; - public static final int MAX_ACTIVE_MINIONS = 3; - public static final int INITIAL_MINIONS_TO_SUMMON = 9; - public static final int MAX_HEALTH = 100; - - - /** - * Make a new master lich. - */ - public EntityTFLich(World world) { - super(world); - setSize(1.1F, 2.5F); - //texture = TwilightForestMod.MODEL_DIR + "twilightlich64.png"; -// this.yOffset = .25F; - - setShadowClone(false); - this.masterLich = null; - this.isImmuneToFire = true; - setShieldStrength(INITIAL_SHIELD_STRENGTH); - setMinionsToSummon(INITIAL_MINIONS_TO_SUMMON); - - this.experienceValue = 217; - - } - - public EntityTFLich(World world, double x, double y, double z) - { - this(world); - this.setPosition(x, y, z); - } - - /** - * Make a lich shadow clone - */ - public EntityTFLich(World world, EntityTFLich otherLich) { - this(world); - - setShadowClone(true); - this.masterLich = otherLich; - } - - @Override - protected void entityInit() - { - super.entityInit(); - this.dataWatcher.addObject(DATA_ISCLONE, Byte.valueOf((byte)0)); - this.dataWatcher.addObject(DATA_SHIELDSTRENGTH, Byte.valueOf((byte)0)); - this.dataWatcher.addObject(DATA_MINIONSLEFT, Byte.valueOf((byte)0)); - this.dataWatcher.addObject(DATA_BOSSHEALTH, new Integer(EntityTFLich.MAX_HEALTH)); - this.dataWatcher.addObject(DATA_ATTACKTYPE, Byte.valueOf((byte)0)); - } - - - - /** - * Set monster attributes - */ - @Override - protected void applyEntityAttributes() - { - super.applyEntityAttributes(); - this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(MAX_HEALTH); // max health - this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(6.0D); // attack damage - this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.800000011920929D); // movement speed - } - - - @Override - public ItemStack getHeldItem() - { - return heldItems[getPhase() - 1]; - } - - @Override - protected void dropFewItems(boolean par1, int par2) { - dropScepter(); - - int totalDrops = this.rand.nextInt(3 + par2) + 2; - for (int i = 0; i < totalDrops; ++i) - { - dropGoldThing(); - } - - totalDrops = this.rand.nextInt(4 + par2) + 1; - for (int i = 0; i < totalDrops; ++i) - { - this.dropItem(Items.ender_pearl, 1); - } - - // bones - totalDrops = this.rand.nextInt(5 + par2) + 5; - for (int i = 0; i < totalDrops; ++i) - { - this.dropItem(Items.bone, 1); - } - - // trophy - this.entityDropItem(new ItemStack(TFItems.trophy, 1, 2), 0); - } - - private void dropScepter() { - int scepterType = rand.nextInt(3); - if (scepterType == 0) { - this.entityDropItem(new ItemStack(TFItems.scepterZombie), 0); - } - else if (scepterType == 1) { - this.entityDropItem(new ItemStack(TFItems.scepterLifeDrain), 0); - } - else { - this.entityDropItem(new ItemStack(TFItems.scepterTwilight), 0); - } - } - - private void dropGoldThing() { - ItemStack goldThing; - int thingType = rand.nextInt(5); - if (thingType == 0) { - goldThing = new ItemStack(Items.golden_sword); - } - else if (thingType == 1) { - goldThing = new ItemStack(Items.golden_helmet); - } - else if (thingType == 2) { - goldThing = new ItemStack(Items.golden_chestplate); - } - else if (thingType == 3) { - goldThing = new ItemStack(Items.golden_leggings); - } - else { - goldThing = new ItemStack(Items.golden_boots); - } - // enchant! - EnchantmentHelper.addRandomEnchantment(rand, goldThing, 10 + rand.nextInt(30)); - this.entityDropItem(goldThing, 0); - } - - /** - * Sets the Entity inside a web block. - * We are immune to webs. - */ - @Override - public void setInWeb() { - // nope! - } - - /** - * Determines if an entity can be despawned, used on idle far away entities - */ - @Override - protected boolean canDespawn() - { - return false; - } - - - /** - * Do not get slowed by lava. - */ - @Override - public boolean handleLavaMovement() - { - return false; - } - - /** - * Do not get slowed by water. - */ - @Override - public boolean isInWater() - { - return false; - } - - /** - * What phase of the fight are we on? - * - * 1 - reflecting bolts, shield up - * 2 - summoning minions - * 3 - melee - */ - public int getPhase() { - if (isShadowClone() || getShieldStrength() > 0) { - return 1; - } - else if (getMinionsToSummon() > 0) { - return 2; - } - else { - return 3; - } - } - - /** - * For now we'll just add some cute particles. - */ - @Override - public void onLivingUpdate() { - // determine the hand position - float angle = ((renderYawOffset * 3.141593F) / 180F); - - double dx = posX + (MathHelper.cos(angle) * 0.65); - double dy = posY + (height * 0.94); - double dz = posZ + (MathHelper.sin(angle) * 0.65); - - - // add particles! - - // how many particles do we want to add?! - int factor = (80 - attackTime) / 10; - int particles = factor > 0 ? rand.nextInt(factor) : 1; - - - for (int j1 = 0; j1 < particles; j1++) - { - float sparkle = 1.0F - (attackTime + 1.0F) / 60.0F; - sparkle *= sparkle; - - float red = 0.37F * sparkle; - float grn = 0.99F * sparkle; - float blu = 0.89F * sparkle; - - // change color for fireball - if (this.getNextAttackType() != 0) - { - red = 0.99F * sparkle; - grn = 0.47F * sparkle; - blu = 0.00F * sparkle; - } - - worldObj.spawnParticle("mobSpell", dx + (rand.nextGaussian() * 0.025), dy + (rand.nextGaussian() * 0.025), dz + (rand.nextGaussian() * 0.025), red, grn, blu); - } - - if (isShadowClone()) { - // clones despawn if they have strayed from the master - checkForMaster(); - } - - // update health - if (!this.worldObj.isRemote) - { - this.dataWatcher.updateObject(DATA_BOSSHEALTH, Integer.valueOf((int)this.getHealth())); - } - - super.onLivingUpdate(); - } - - - /** - * Called when we get attacked. - * - * Never switch targets to any lich. - * - * TODO maybe we could compare masters to make teams or something. - */ - @Override - public boolean attackEntityFrom(DamageSource par1DamageSource, float damage) { - // if we're in a wall, teleport for gosh sakes - if (par1DamageSource.getDamageType() == "inWall" && entityToAttack != null) { - teleportToSightOfEntity(entityToAttack); - } - - if (isShadowClone()) { - this.worldObj.playSoundAtEntity(this, "random.fizz", 1.0F, ((this.rand.nextFloat() - this.rand.nextFloat()) * 0.7F + 1.0F) * 2.0F); - return false; - } - - Entity prevTarget = this.entityToAttack; - -// System.out.println("Damage source is " + par1DamageSource); -// System.out.println("Damage type is " + par1DamageSource.getDamageType()); -// System.out.println("Damage source source is " + par1DamageSource.getSourceOfDamage()); - - // ignore all bolts that are not reflected - if (par1DamageSource.getEntity() instanceof EntityTFLich) { - return false; - } - - // if our shield is up, ignore any damage that can be blocked. - if (getShieldStrength() > 0) - { - if (par1DamageSource.isUnblockable() && damage > 2) - { - // reduce shield for magic damage greater than 1 heart - if (getShieldStrength() > 0) { - setShieldStrength(getShieldStrength() - 1); - this.worldObj.playSoundAtEntity(this, "random.break", 1.0F, ((this.rand.nextFloat() - this.rand.nextFloat()) * 0.7F + 1.0F) * 2.0F); - } - } - else - { - this.worldObj.playSoundAtEntity(this, "random.break", 1.0F, ((this.rand.nextFloat() - this.rand.nextFloat()) * 0.7F + 1.0F) * 2.0F); - // HACK for creative mode: but get annoyed at what's causing it. - if (par1DamageSource.getEntity() instanceof EntityPlayer) - { - this.entityToAttack = par1DamageSource.getEntity(); - } - } - - return false; - } - - // never attack another lich? - //TODO: this could better check who is actually attacking against the masterLich variable thing - if (super.attackEntityFrom(par1DamageSource, damage)) - { - if (entityToAttack instanceof EntityTFLich) { - this.entityToAttack = prevTarget; - } - - // if we were attacked successfully during phase 1 or 2, teleport - // during phase 3, 1 in 4 chance of teleport - if (this.getPhase() < 3 || rand.nextInt(4) == 0) - { - this.teleportToSightOfEntity(this.entityToAttack); - } - - return true; - } - else - { - return false; - } - } - -// /** -// * Another method to stop the shadow clones from being attacked -// */ -// @Override -// public boolean canAttackWithItem() { -// if (isShadowClone()) { -// return false; -// } -// else { -// return super.canAttackWithItem(); -// } -// } - - - /** - * Attack! - */ - @Override - protected void attackEntity(Entity targetedEntity, float f) - { - if (!isShadowClone() && attackTime % 15 == 0) { - popNearbyMob(); - } - - if (getPhase() == 1) { - if (attackTime == 60 && !worldObj.isRemote) { - - teleportToSightOfEntity(targetedEntity); - - if (!isShadowClone()) { - // if we are the master, check for clones - checkAndSpawnClones(targetedEntity); - } - } - - if(canEntityBeSeen(targetedEntity) && attackTime == 0 && f < 20F) - { - if (this.getNextAttackType() == 0) - { - // if not, and we can see the target, launch a bolt - launchBoltAt(targetedEntity); - } - else - { - launchBombAt(targetedEntity); - } - - // decide next attack type - if (rand.nextInt(3) > 0) - { - this.setNextAttackType(0); - } - else - { - this.setNextAttackType(1); - } - attackTime = 100; - - } - // do not chase the player - hasAttacked = true; - } - if (getPhase() == 2 && !isShadowClone()) { - despawnClones(); - - // spawn minions every so often - if (attackTime % 15 == 0) { - // spawn minion - checkAndSpawnMinions(targetedEntity); - } - - if (attackTime == 0) { - // if we're in melee, attack - if (f < 2.0F) { - // melee attack - this.attackEntityAsMob(targetedEntity); - attackTime = 20; - } - else if (f < 20F && canEntityBeSeen(targetedEntity)) { - // if not, and we can see the target, launch a bolt - if (this.getNextAttackType() == 0) - { - // if not, and we can see the target, launch a bolt - launchBoltAt(targetedEntity); - } - else - { - launchBombAt(targetedEntity); - } - - // decide next attack type - if (rand.nextInt(2) > 0) - { - this.setNextAttackType(0); - } - else - { - this.setNextAttackType(1); - } - attackTime = 60; - } - else { - // if not, teleport around - teleportToSightOfEntity(targetedEntity); - attackTime = 20; - - } - } - // do not chase - hasAttacked = true; - - } - if (getPhase() == 3) { - // melee! - if (this.attackTime <= 0 && f < 2.0F && targetedEntity.boundingBox.maxY > this.boundingBox.minY && targetedEntity.boundingBox.minY < this.boundingBox.maxY) - { - this.attackTime = 20; - this.attackEntityAsMob(targetedEntity); - hasAttacked = true; - } - } - - - } - - /** - * Fires a lich bolt at the target - * @param targetedEntity - */ - protected void launchBoltAt(Entity targetedEntity) { - float bodyFacingAngle = ((renderYawOffset * 3.141593F) / 180F); - double sx = posX + (MathHelper.cos(bodyFacingAngle) * 0.65); - double sy = posY + (height * 0.82); - double sz = posZ + (MathHelper.sin(bodyFacingAngle) * 0.65); - - double tx = targetedEntity.posX - sx; - double ty = (targetedEntity.boundingBox.minY + (double)(targetedEntity.height / 2.0F)) - (posY + height / 2.0F); - double tz = targetedEntity.posZ - sz; - - worldObj.playSoundAtEntity(this, "mob.ghast.fireball", getSoundVolume(), (rand.nextFloat() - rand.nextFloat()) * 0.2F + 1.0F); - EntityTFLichBolt projectile = new EntityTFLichBolt(worldObj, this); - projectile.setThrowableHeading(tx, ty, tz, projectile.func_70182_d(), 1.0F); - - projectile.setLocationAndAngles(sx, sy, sz, rotationYaw, rotationPitch); - - worldObj.spawnEntityInWorld(projectile); - } - - /** - * Fires a lich bomb at the target - * @param targetedEntity - */ - protected void launchBombAt(Entity targetedEntity) { - float bodyFacingAngle = ((renderYawOffset * 3.141593F) / 180F); - double sx = posX + (MathHelper.cos(bodyFacingAngle) * 0.65); - double sy = posY + (height * 0.82); - double sz = posZ + (MathHelper.sin(bodyFacingAngle) * 0.65); - - double tx = targetedEntity.posX - sx; - double ty = (targetedEntity.boundingBox.minY + (double)(targetedEntity.height / 2.0F)) - (posY + height / 2.0F); - double tz = targetedEntity.posZ - sz; - - worldObj.playSoundAtEntity(this, "mob.ghast.fireball", getSoundVolume(), (rand.nextFloat() - rand.nextFloat()) * 0.2F + 1.0F); - EntityTFLichBomb projectile = new EntityTFLichBomb(worldObj, this); - projectile.setThrowableHeading(tx, ty, tz, projectile.func_40077_c(), 1.0F); - - projectile.setLocationAndAngles(sx, sy, sz, rotationYaw, rotationPitch); - - worldObj.spawnEntityInWorld(projectile); - } - - /** - * Check the surrounding area for weaker monsters, and if we find any, magically destroy them. - */ - @SuppressWarnings("unchecked") - protected void popNearbyMob() { - List nearbyMobs = worldObj.getEntitiesWithinAABBExcludingEntity(this, AxisAlignedBB.getBoundingBox(posX, posY, posZ, posX + 1, posY + 1, posZ + 1).expand(32.0D, 16.0D, 32.0D)); - - for (Entity entity : nearbyMobs) { - if (entity instanceof EntityLiving && canPop(entity) && canEntityBeSeen(entity)) { - EntityLiving mob = (EntityLiving)entity; - - if (!worldObj.isRemote) { - mob.setDead(); - - mob.spawnExplosionParticle(); - - // play death sound -// worldObj.playSoundAtEntity(mob, mob.getDeathSound(), mob.getSoundVolume(), (rand.nextFloat() - rand.nextFloat()) * 0.2F + 1.0F); - } - - // make trail so it's clear that we did it - makeRedMagicTrail(mob.posX, mob.posY + mob.height / 2.0, mob.posZ, this.posX, this.posY + this.height / 2.0, this.posZ); - - // one per cycle, please - break; - } - } - - - } - - /** - * Can we pop the nearby thing? - */ - @SuppressWarnings("rawtypes") - protected boolean canPop(Entity nearby) { - Class[] poppable = {EntitySkeleton.class, EntityZombie.class, EntityEnderman.class, EntitySpider.class, EntityCreeper.class, EntityTFSwarmSpider.class}; - - for (Class pop : poppable) { - if (nearby.getClass() == pop) { - return true; - } - } - return false; - } - - /** - * Look and see if there are enough clones in the surrounding area. If there are not, spawn one. - * @param targetedEntity - */ - protected void checkAndSpawnClones(Entity targetedEntity) { - // if not, spawn one! - if (countMyClones() < EntityTFLich.MAX_SHADOW_CLONES) { - spawnShadowClone(targetedEntity); - } - } - - @SuppressWarnings("unchecked") - protected int countMyClones() { - // check if there are enough clones. we check a 32x16x32 area - List nearbyLiches = worldObj.getEntitiesWithinAABB(EntityTFLich.class, AxisAlignedBB.getBoundingBox(posX, posY, posZ, posX + 1, posY + 1, posZ + 1).expand(32.0D, 16.0D, 32.0D)); - int count = 0; - - for (EntityTFLich nearbyLich : nearbyLiches) { - if (nearbyLich.isShadowClone() && nearbyLich.masterLich == this) { - count++; - } - } - - return count; - } - - public boolean wantsNewClone(EntityTFLich clone) { - return clone.isShadowClone() && countMyClones() < EntityTFLich.MAX_SHADOW_CLONES; - } - - - protected void spawnShadowClone(Entity targetedEntity) { -// System.out.println("Lich is making a shadow clone!"); - - - // find a good spot - Vec3 cloneSpot = findVecInLOSOf(targetedEntity); - - // put a clone there - EntityTFLich newClone = new EntityTFLich(worldObj, this); - newClone.setPosition(cloneSpot.xCoord, cloneSpot.yCoord, cloneSpot.zCoord); - worldObj.spawnEntityInWorld(newClone); - - newClone.entityToAttack = targetedEntity; - newClone.attackTime = 60 + rand.nextInt(3) - rand.nextInt(3); - - // make sparkles leading to it - makeTeleportTrail(posX, posY, posZ, cloneSpot.xCoord, cloneSpot.yCoord, cloneSpot.zCoord); - } - - /** - * Despawn neaby clones - */ - @SuppressWarnings("unchecked") - protected void despawnClones() { - List nearbyLiches = worldObj.getEntitiesWithinAABB(this.getClass(), AxisAlignedBB.getBoundingBox(posX, posY, posZ, posX + 1, posY + 1, posZ + 1).expand(32.0D, 16.0D, 32.0D)); - - for (EntityTFLich nearbyLich : nearbyLiches) { - if (nearbyLich.isShadowClone()) { - nearbyLich.isDead = true; - } - } - } - - - - protected void checkAndSpawnMinions(Entity targetedEntity) { - if (!worldObj.isRemote && this.getMinionsToSummon() > 0) { - int minions = countMyMinions(); - - // if not, spawn one! - if (minions < EntityTFLich.MAX_ACTIVE_MINIONS) { - spawnMinionAt((EntityLivingBase)targetedEntity); - this.setMinionsToSummon(this.getMinionsToSummon() - 1); - } - } - // if there's no minions left to summon, we should move into phase 3 naturally - } - - @SuppressWarnings("unchecked") - protected int countMyMinions() { - // check if there are enough clones. we check a 32x16x32 area - List nearbyMinons = worldObj.getEntitiesWithinAABB(EntityTFLichMinion.class, AxisAlignedBB.getBoundingBox(posX, posY, posZ, posX + 1, posY + 1, posZ + 1).expand(32.0D, 16.0D, 32.0D)); - int count = 0; - - for (EntityTFLichMinion nearbyMinon : nearbyMinons) { - if (nearbyMinon.master == this) { - count++; - } - } - - return count; - } - - protected void spawnMinionAt(EntityLivingBase targetedEntity) { - - // find a good spot - Vec3 minionSpot = findVecInLOSOf(targetedEntity); - - // put a clone there - EntityTFLichMinion minion = new EntityTFLichMinion(worldObj, this); - minion.setPosition(minionSpot.xCoord, minionSpot.yCoord, minionSpot.zCoord); - //minion.initCreature(); - worldObj.spawnEntityInWorld(minion); - - minion.setAttackTarget(targetedEntity); - - minion.spawnExplosionParticle(); - this.worldObj.playSoundAtEntity(minion, "random.pop", 1.0F, ((this.rand.nextFloat() - this.rand.nextFloat()) * 0.7F + 1.0F) * 2.0F); - - // make sparkles leading to it - makeBlackMagicTrail(posX, posY + this.getEyeHeight(), posZ, minionSpot.xCoord, minionSpot.yCoord + minion.height / 2.0, minionSpot.zCoord); - } - - public boolean wantsNewMinion(EntityTFLichMinion minion) { - return countMyMinions() < EntityTFLich.MAX_ACTIVE_MINIONS; - } - - /** - * A method on the clones that despawns this clone if we are too far from the master - */ - protected void checkForMaster() { - if (masterLich == null) { - findNewMaster(); - } - if (!worldObj.isRemote) { - if (masterLich == null || masterLich.isDead) { - this.isDead = true; - } - else { - //double distance = (this.posX - masterLich.posX) * (this.posX - masterLich.posX) + (this.posY - masterLich.posY) * (this.posY - masterLich.posY) + (this.posZ - masterLich.posZ) * (this.posZ - masterLich.posZ); -// System.out.println("Clone says that distance from master is " + distance); - } - } - } - - /** - * Find a new master for this clone - */ - @SuppressWarnings("unchecked") - private void findNewMaster() { - List nearbyLiches = worldObj.getEntitiesWithinAABB(EntityTFLich.class, AxisAlignedBB.getBoundingBox(posX, posY, posZ, posX + 1, posY + 1, posZ + 1).expand(32.0D, 16.0D, 32.0D)); - - for (EntityTFLich nearbyLich : nearbyLiches) { - if (!nearbyLich.isShadowClone() && nearbyLich.wantsNewClone(this)) { - this.masterLich = nearbyLich; - - // animate our new linkage! - makeTeleportTrail(posX, posY, posZ, nearbyLich.posX, nearbyLich.posY, nearbyLich.posZ); - // become angry at our masters target - setAttackTarget(masterLich.getAttackTarget()); - - // quit looking - break; - } - } - } - - - /** - * Teleports to within line of sight of (but not necessarily in view of) the target - */ - protected void teleportToSightOfEntity(Entity entity) - { - Vec3 dest = findVecInLOSOf(entity); - double srcX = posX; - double srcY = posY; - double srcZ = posZ; - - if (dest != null) { - teleportToNoChecks(dest.xCoord, dest.yCoord, dest.zCoord); - faceEntity(entity, 100F, 100F); - this.renderYawOffset = this.rotationYaw; - - if (!this.canEntityBeSeen(entity)) { - // um teleport mishap, return to start -// System.out.println("Teleport fail!!!"); - teleportToNoChecks(srcX, srcY, srcZ); - - } - } - } - - /** - * Returns coords that would be good to teleport to. - * - * Returns null if we can't find anything - */ - protected Vec3 findVecInLOSOf(Entity targetEntity) - { - // for some reason we occasionally get null here - if (targetEntity == null) - { - return null; - } - - double tx = 0, ty = 0, tz = 0; - int tries = 100; - for (int i = 0; i < tries; i++) { - tx = targetEntity.posX + rand.nextGaussian() * 16D; - ty = targetEntity.posY + rand.nextGaussian() * 8D; - tz = targetEntity.posZ + rand.nextGaussian() * 16D; - - // put the y on something solid - boolean groundFlag = false; - // we need to get the integer coordinates for this calculation - int bx = MathHelper.floor_double(tx); - int by = MathHelper.floor_double(ty); - int bz = MathHelper.floor_double(tz); - while (!groundFlag && ty > 0) - { - Block whatsThere = worldObj.getBlock(bx, by - 1, bz); - if (whatsThere == Blocks.air || !whatsThere.getMaterial().isSolid()) - { - ty--; - by--; - } - else - { - groundFlag = true; - } - } - - // did we not find anything at all to stand on? - if (by == 0) { -// System.out.println("teleport find failed to find a block to stand on"); - continue; - } - - // - if (!canEntitySee(targetEntity, tx, ty, tz)) { -// System.out.println("teleport find failed because of lack of LOS"); -// System.out.println("ty = " + ty); - continue; - } - - // check that we're not colliding and not in liquid - float halfWidth = this.width / 2.0F; - AxisAlignedBB destBox = AxisAlignedBB.getBoundingBox(tx - halfWidth, ty - yOffset + ySize, tz - halfWidth, tx + halfWidth, ty - yOffset + ySize + height, tz + halfWidth); - if (worldObj.getCollidingBoundingBoxes(this, destBox).size() > 0) - { -// System.out.println("teleport find failed because of collision"); - continue; - } - - if (worldObj.isAnyLiquid(destBox)) { -// System.out.println("teleport find failed because of liquid at destination"); - continue; - } - - // if we made it this far, we win! - break; - } - - if (tries == 99) { - return null; - } - -// System.out.println("I think we found a good destination at " + tx + ", " + ty + ", " + tz); -// System.out.println("canEntitySee = " + canEntitySee(targetEntity, tx, ty, tz)); - return Vec3.createVectorHelper(tx, ty, tz); - } - - /** - * Can the specified entity see the specified location? - */ - protected boolean canEntitySee(Entity entity, double dx, double dy, double dz) { - return worldObj.rayTraceBlocks(Vec3.createVectorHelper(entity.posX, entity.posY + (double)entity.getEyeHeight(), entity.posZ), Vec3.createVectorHelper(dx, dy, dz)) == null; - - } - - /** - * Does not check that the teleport destination is valid, we just go there - */ - protected boolean teleportToNoChecks(double destX, double destY, double destZ) - { - // save original position - double srcX = posX; - double srcY = posY; - double srcZ = posZ; - - // change position - setPosition(destX, destY, destZ); - - makeTeleportTrail(srcX, srcY, srcZ, destX, destY, destZ); - - worldObj.playSoundEffect(srcX, srcY, srcZ, "mob.endermen.portal", 1.0F, 1.0F); - worldObj.playSoundAtEntity(this, "mob.endermen.portal", 1.0F, 1.0F); - - // sometimes we need to do this - this.isJumping = false; - - return true; - } - - /** - * Make a trail of particles from one point to another - */ - protected void makeTeleportTrail(double srcX, double srcY, double srcZ, double destX, double destY, double destZ) { - // make particle trail - int particles = 128; - for (int i = 0; i < particles; i++) - { - double trailFactor = i / (particles - 1.0D); - float f = (rand.nextFloat() - 0.5F) * 0.2F; - float f1 = (rand.nextFloat() - 0.5F) * 0.2F; - float f2 = (rand.nextFloat() - 0.5F) * 0.2F; - double tx = srcX + (destX - srcX) * trailFactor + (rand.nextDouble() - 0.5D) * width * 2D; - double ty = srcY + (destY - srcY) * trailFactor + rand.nextDouble() * height; - double tz = srcZ + (destZ - srcZ) * trailFactor + (rand.nextDouble() - 0.5D) * width * 2D; - worldObj.spawnParticle("spell", tx, ty, tz, f, f1, f2); - } - } - - /** - * Make a trail of particles from one point to another - */ - protected void makeRedMagicTrail(double srcX, double srcY, double srcZ, double destX, double destY, double destZ) { - // make particle trail - int particles = 32; - for (int i = 0; i < particles; i++) - { - double trailFactor = i / (particles - 1.0D); - float f = 1.0F; - float f1 = 0.5F; - float f2 = 0.5F; - double tx = srcX + (destX - srcX) * trailFactor + rand.nextGaussian() * 0.005; - double ty = srcY + (destY - srcY) * trailFactor + rand.nextGaussian() * 0.005; - double tz = srcZ + (destZ - srcZ) * trailFactor + rand.nextGaussian() * 0.005; - worldObj.spawnParticle("mobSpell", tx, ty, tz, f, f1, f2); - } - } - - /** - * Make a trail of particles from one point to another - */ - protected void makeBlackMagicTrail(double srcX, double srcY, double srcZ, double destX, double destY, double destZ) { - // make particle trail - int particles = 32; - for (int i = 0; i < particles; i++) - { - double trailFactor = i / (particles - 1.0D); - float f = 0.2F; - float f1 = 0.2F; - float f2 = 0.2F; - double tx = srcX + (destX - srcX) * trailFactor + rand.nextGaussian() * 0.005; - double ty = srcY + (destY - srcY) * trailFactor + rand.nextGaussian() * 0.005; - double tz = srcZ + (destZ - srcZ) * trailFactor + rand.nextGaussian() * 0.005; - worldObj.spawnParticle("mobSpell", tx, ty, tz, f, f1, f2); - } - } - - /** - * @return Is this lich a shadow clone or the real one? - */ - public boolean isShadowClone() - { - return (this.dataWatcher.getWatchableObjectByte(DATA_ISCLONE) & 2) != 0; - } - - /** - * sets Is this lich a shadow clone or the real one? - */ - public void setShadowClone(boolean par1) - { - byte var2 = this.dataWatcher.getWatchableObjectByte(DATA_ISCLONE); - - if (par1) - { - this.dataWatcher.updateObject(DATA_ISCLONE, Byte.valueOf((byte)(var2 | 2))); - } - else - { - this.dataWatcher.updateObject(DATA_ISCLONE, Byte.valueOf((byte)(var2 & -3))); - } - } - - public byte getShieldStrength() { - return this.dataWatcher.getWatchableObjectByte(DATA_SHIELDSTRENGTH); - } - - public void setShieldStrength(int shieldStrength) { - this.dataWatcher.updateObject(DATA_SHIELDSTRENGTH, Byte.valueOf((byte) shieldStrength)); - } - - public byte getMinionsToSummon() { - return this.dataWatcher.getWatchableObjectByte(DATA_MINIONSLEFT); - } - - public void setMinionsToSummon(int minionsToSummon) { - this.dataWatcher.updateObject(DATA_MINIONSLEFT, Byte.valueOf((byte) minionsToSummon)); - } - - public byte getNextAttackType() { - return this.dataWatcher.getWatchableObjectByte(DATA_ATTACKTYPE); - } - - public void setNextAttackType(int attackType) { - this.dataWatcher.updateObject(DATA_ATTACKTYPE, Byte.valueOf((byte) attackType)); - } - - /** - * Returns the sound this mob makes while it's alive. - */ - @Override - protected String getLivingSound() - { - return "mob.blaze.breathe"; - } - - /** - * Returns the sound this mob makes when it is hurt. - */ - @Override - protected String getHurtSound() - { - return "mob.blaze.hit"; - } - - /** - * Returns the sound this mob makes on death. - */ - @Override - protected String getDeathSound() - { - return "mob.blaze.death"; - } - - - @Override - public void writeEntityToNBT(NBTTagCompound nbttagcompound) - { - super.writeEntityToNBT(nbttagcompound); - nbttagcompound.setBoolean("ShadowClone", isShadowClone()); - nbttagcompound.setByte("ShieldStrength", getShieldStrength()); - nbttagcompound.setByte("MinionsToSummon", getMinionsToSummon()); - } - - @Override - public void readEntityFromNBT(NBTTagCompound nbttagcompound) - { - super.readEntityFromNBT(nbttagcompound); - setShadowClone(nbttagcompound.getBoolean("ShadowClone")); - setShieldStrength(nbttagcompound.getByte("ShieldStrength")); - setMinionsToSummon(nbttagcompound.getByte("MinionsToSummon")); - } - - - /** - * Trigger achievement when killed - */ - @Override - public void onDeath(DamageSource par1DamageSource) { - super.onDeath(par1DamageSource); - if (par1DamageSource.getSourceOfDamage() instanceof EntityPlayer) { - ((EntityPlayer)par1DamageSource.getSourceOfDamage()).triggerAchievement(TFAchievementPage.twilightHunter); - ((EntityPlayer)par1DamageSource.getSourceOfDamage()).triggerAchievement(TFAchievementPage.twilightKillLich); - - } - - // mark the tower as defeated - if (!worldObj.isRemote && !this.isShadowClone()) { - int dx = MathHelper.floor_double(this.posX); - int dy = MathHelper.floor_double(this.posY); - int dz = MathHelper.floor_double(this.posZ); - - if (worldObj.provider instanceof WorldProviderTwilightForest){ - ChunkProviderTwilightForest chunkProvider = ((WorldProviderTwilightForest)worldObj.provider).getChunkProvider(); - TFFeature nearbyFeature = ((TFWorldChunkManager)worldObj.provider.worldChunkMgr).getFeatureAt(dx, dz, worldObj); - - if (nearbyFeature == TFFeature.lichTower) { - chunkProvider.setStructureConquered(dx, dy, dz, true); - } - } - } - } - -// @Override -// public int getBossHealth() { -// return this.dataWatcher.getWatchableObjectInt(EntityTFLich.DATA_BOSSHEALTH); -// } - - - - /** - * Get this Entity's EnumCreatureAttribute - */ - @Override - public EnumCreatureAttribute getCreatureAttribute() - { - return EnumCreatureAttribute.UNDEAD; - } - -} diff --git a/src/main/java/twilightforest/entity/boss/EntityTFLichBolt.java b/src/main/java/twilightforest/entity/boss/EntityTFLichBolt.java deleted file mode 100644 index 1880937bdb..0000000000 --- a/src/main/java/twilightforest/entity/boss/EntityTFLichBolt.java +++ /dev/null @@ -1,173 +0,0 @@ -package twilightforest.entity.boss; - -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.projectile.EntityThrowable; -import net.minecraft.init.Items; -import net.minecraft.item.Item; -import net.minecraft.util.DamageSource; -import net.minecraft.util.MovingObjectPosition; -import net.minecraft.util.Vec3; -import net.minecraft.world.World; - - -public class EntityTFLichBolt extends EntityThrowable { - - public EntityLivingBase playerReflects = null; - - public EntityTFLichBolt(World par1World, double par2, double par4, double par6) { - super(par1World, par2, par4, par6); - } - - public EntityTFLichBolt(World par1World, EntityLivingBase par2EntityLiving) { - super(par1World, par2EntityLiving); - } - - public EntityTFLichBolt(World par1World) { - super(par1World); - } - - - /** - * projectile speed - */ - protected float func_70182_d() - { - return 0.5F; - } - - - @Override - public void onUpdate() { - super.onUpdate(); - - makeTrail(); - } - - - public void makeTrail() { - for (int i = 0; i < 5; i++) { - double dx = posX + 0.5 * (rand.nextDouble() - rand.nextDouble()); - double dy = posY + 0.5 * (rand.nextDouble() - rand.nextDouble()); - double dz = posZ + 0.5 * (rand.nextDouble() - rand.nextDouble()); - - double s1 = ((rand.nextFloat() * 0.5F) + 0.5F) * 0.17F; - double s2 = ((rand.nextFloat() * 0.5F) + 0.5F) * 0.80F; - double s3 = ((rand.nextFloat() * 0.5F) + 0.5F) * 0.69F; - - worldObj.spawnParticle("mobSpell", dx, dy, dz, s1, s2, s3); - } - } - - /** - * Returns true if other Entities should be prevented from moving through this Entity. - */ - @Override - public boolean canBeCollidedWith() - { - return true; - } - - /** - * We need to set this so that the player can attack and reflect the bolt - */ - @Override - public float getCollisionBorderSize() - { - return 1.0F; - } - - - /** - * Reflect! - */ - @Override - public boolean attackEntityFrom(DamageSource damagesource, float i) - { -// System.out.println("Lich bolt being attacked!"); - - setBeenAttacked(); - if (damagesource.getEntity() != null) - { - Vec3 vec3d = damagesource.getEntity().getLookVec(); - if (vec3d != null) - { - this.setThrowableHeading(vec3d.xCoord, vec3d.yCoord, vec3d.zCoord, 1.5F, 0.1F); // reflect faster and more accurately - } - if (damagesource.getEntity() instanceof EntityLivingBase) - { - playerReflects = (EntityLivingBase)damagesource.getEntity(); - } - return true; - } - else - { - return false; - } - } - - /** - * Return who threw this projectile - */ - @Override - public EntityLivingBase getThrower() - { - if (this.playerReflects != null) - { - return this.playerReflects; - } - else - { - return super.getThrower(); - } - } - - /** - * How much this entity falls each tick - */ - @Override - protected float getGravityVelocity() - { - return 0.001F; - } - - @Override - protected void onImpact(MovingObjectPosition par1MovingObjectPosition) { - boolean passThrough = false; - - // pass through other lich bolts - if (par1MovingObjectPosition.entityHit != null && (par1MovingObjectPosition.entityHit instanceof EntityTFLichBolt || par1MovingObjectPosition.entityHit instanceof EntityTFLichBomb)) { - passThrough = true; - } - - // only damage living things - if (par1MovingObjectPosition.entityHit != null && par1MovingObjectPosition.entityHit instanceof EntityLivingBase) - { - if (par1MovingObjectPosition.entityHit instanceof EntityTFLich) { - EntityTFLich lich = (EntityTFLich)par1MovingObjectPosition.entityHit; - if (lich.isShadowClone()) { - passThrough = true; - } - } - // if we're not set to pass, damage what we hit - if (!passThrough && par1MovingObjectPosition.entityHit.attackEntityFrom(DamageSource.causeIndirectMagicDamage(this, this.getThrower()), 6)) - { - ; - } - } - // if we don't pass through, then stop and die - if (!passThrough) { - for (int i = 0; i < 8; ++i) - { - this.worldObj.spawnParticle("iconcrack_" + Item.getIdFromItem(Items.ender_pearl), this.posX, this.posY, this.posZ, rand.nextGaussian() * 0.05D, rand.nextDouble() * 0.2D, rand.nextGaussian() * 0.05D); - } - - if (!this.worldObj.isRemote) - { - this.setDead(); - } - } - - } - - -} diff --git a/src/main/java/twilightforest/entity/boss/EntityTFLichBomb.java b/src/main/java/twilightforest/entity/boss/EntityTFLichBomb.java deleted file mode 100644 index dc83eb42a9..0000000000 --- a/src/main/java/twilightforest/entity/boss/EntityTFLichBomb.java +++ /dev/null @@ -1,148 +0,0 @@ -package twilightforest.entity.boss; - -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.projectile.EntityThrowable; -import net.minecraft.util.DamageSource; -import net.minecraft.util.MovingObjectPosition; -import net.minecraft.world.World; - - -public class EntityTFLichBomb extends EntityThrowable { - - public EntityTFLichBomb(World par1World, double par2, double par4, double par6) { - super(par1World, par2, par4, par6); - } - - public EntityTFLichBomb(World par1World, EntityLivingBase par2EntityLiving) { - super(par1World, par2EntityLiving); - } - - public EntityTFLichBomb(World par1World) { - super(par1World); - } - - - /** - * projectile speed - */ - protected float func_40077_c() - { - return 0.35F; - } - - - @Override - public void onUpdate() { - super.onUpdate(); - - makeTrail(); - } - - - public void makeTrail() { - for (int i = 0; i < 1; i++) { - double sx = 0.5 * (rand.nextDouble() - rand.nextDouble()) + this.motionX; - double sy = 0.5 * (rand.nextDouble() - rand.nextDouble()) + this.motionY; - double sz = 0.5 * (rand.nextDouble() - rand.nextDouble()) + this.motionZ; - - - double dx = posX + sx; - double dy = posY + sy; - double dz = posZ + sz; - - worldObj.spawnParticle("flame", dx, dy, dz, sx * -0.25, sy * -0.25, sz * -0.25); - } - } - - - /** - * Always be on fire! - */ - @Override - public boolean isBurning() - { - return true; - } - - /** - * Returns true if other Entities should be prevented from moving through this Entity. - */ - @Override - public boolean canBeCollidedWith() - { - return true; - } - - /** - * We need to set this so that the player can attack and reflect the bolt - */ - @Override - public float getCollisionBorderSize() - { - return 1.0F; - } - - - /** - * Reflect! - */ - @Override - public boolean attackEntityFrom(DamageSource damagesource, float i) - { -// System.out.println("Lich bolt being attacked!"); - - setBeenAttacked(); - if (damagesource.getEntity() != null) - { - // explode - explode(); - - return true; - } - else - { - return false; - } - } - - protected void explode() { - float explosionPower = 2F; - this.worldObj.newExplosion(this, this.posX, this.posY, this.posZ, explosionPower, false, false); - - this.setDead(); - } - - /** - * How much this entity falls each tick - */ - @Override - protected float getGravityVelocity() - { - return 0.001F; - } - - @Override - protected void onImpact(MovingObjectPosition par1MovingObjectPosition) { - boolean passThrough = false; - - // pass through other lich bolts - if (par1MovingObjectPosition.entityHit != null && (par1MovingObjectPosition.entityHit instanceof EntityTFLichBolt || par1MovingObjectPosition.entityHit instanceof EntityTFLichBomb)) { - passThrough = true; - } - - // only damage living things - if (par1MovingObjectPosition.entityHit != null && par1MovingObjectPosition.entityHit instanceof EntityTFLich) - { - passThrough = true; - } - - // if we're not set to pass, damage what we hit - if (!passThrough) - { - explode(); - } - - } - - -} diff --git a/src/main/java/twilightforest/entity/boss/EntityTFLichMinion.java b/src/main/java/twilightforest/entity/boss/EntityTFLichMinion.java deleted file mode 100644 index 48a5ecebf4..0000000000 --- a/src/main/java/twilightforest/entity/boss/EntityTFLichMinion.java +++ /dev/null @@ -1,171 +0,0 @@ -package twilightforest.entity.boss; - -import java.util.List; - -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.monster.EntityZombie; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.potion.Potion; -import net.minecraft.potion.PotionEffect; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.DamageSource; -import net.minecraft.world.EnumDifficulty; -import net.minecraft.world.World; -import twilightforest.TFAchievementPage; - - - -public class EntityTFLichMinion extends EntityZombie { - - EntityTFLich master; - - public EntityTFLichMinion(World par1World) { - super(par1World); - this.master = null; - } - - public EntityTFLichMinion(World world, double x, double y, double z) - { - this(world); - this.setPosition(x, y, z); - } - - public EntityTFLichMinion(World par1World, EntityTFLich entityTFLich) { - super(par1World); - this.master = entityTFLich; - } - - - /** - * Called when we get attacked. - * - * If we are hit by a lich, still take the damage, but attack stronger and move faster. - */ - @Override - public boolean attackEntityFrom(DamageSource par1DamageSource, float par2) { - EntityLivingBase prevTarget = getAttackTarget(); - - if (super.attackEntityFrom(par1DamageSource, par2)) { - if (par1DamageSource.getEntity() instanceof EntityTFLich) { - // return to previous target - setAttackTarget(prevTarget); - setRevengeTarget(prevTarget); - // but speed up - addPotionEffect(new PotionEffect(Potion.moveSpeed.id, 200, 4)); - addPotionEffect(new PotionEffect(Potion.damageBoost.id, 200, 1)); - } - return true; - } - else { - return false; - } - } - - /** - * Check and see if our master is dead. If so, die - */ - @Override - public void onLivingUpdate() { - if (master == null) { - findNewMaster(); - } - // if we still don't have a master, or ours is dead, die. - if (master == null || master.isDead) { - this.setHealth(0); - } - super.onLivingUpdate(); - } - - @SuppressWarnings("unchecked") - private void findNewMaster() { - List nearbyLiches = worldObj.getEntitiesWithinAABB(EntityTFLich.class, AxisAlignedBB.getBoundingBox(posX, posY, posZ, posX + 1, posY + 1, posZ + 1).expand(32.0D, 16.0D, 32.0D)); - - for (EntityTFLich nearbyLich : nearbyLiches) { - if (!nearbyLich.isShadowClone() && nearbyLich.wantsNewMinion(this)) { - this.master = nearbyLich; - - // animate our new linkage! - master.makeBlackMagicTrail(posX, posY + this.getEyeHeight(), posZ, master.posX, master.posY + master.getEyeHeight(), master.posZ); - - // become angry at our masters target - setAttackTarget(master.getAttackTarget()); - - // quit looking - break; - } - } - } - - /** - * Trigger achievement when killed - */ - @Override - public void onDeath(DamageSource par1DamageSource) { - super.onDeath(par1DamageSource); - if (par1DamageSource.getSourceOfDamage() instanceof EntityPlayer) { - ((EntityPlayer)par1DamageSource.getSourceOfDamage()).triggerAchievement(TFAchievementPage.twilightHunter); - } - } - - -// /** -// * Initialize this creature. -// */ -// @Override -// public void initCreature() -// { -// this.addRandomArmor(); -// this.func_82162_bC(); -// } - - - @Override - protected void addRandomArmor() - { - float[] equipChances = new float[] {0.0F, 0.25F, 0.75F, 1F}; - - if (this.rand.nextFloat() < equipChances[2]) //this.worldObj.difficultySetting]) - { - int var1 = this.rand.nextInt(2); - float var2 = this.worldObj.difficultySetting == EnumDifficulty.HARD ? 0.1F : 0.25F; - - if (this.rand.nextFloat() < 0.07F) - { - ++var1; - } - - if (this.rand.nextFloat() < 0.07F) - { - ++var1; - } - - if (this.rand.nextFloat() < 0.07F) - { - ++var1; - } - - for (int var3 = 3; var3 >= 0; --var3) - { - ItemStack var4 = this.func_130225_q(var3); - - if (var3 < 3 && this.rand.nextFloat() < var2) - { - break; - } - - if (var4 == null) - { - Item var5 = getArmorItemForSlot(var3 + 1, var1); - - if (var5 != null) - { - this.setCurrentItemOrArmor(var3 + 1, new ItemStack(var5)); - } - } - } - } - } - -} diff --git a/src/main/java/twilightforest/entity/boss/EntityTFMinoshroom.java b/src/main/java/twilightforest/entity/boss/EntityTFMinoshroom.java deleted file mode 100644 index b4813c1da2..0000000000 --- a/src/main/java/twilightforest/entity/boss/EntityTFMinoshroom.java +++ /dev/null @@ -1,76 +0,0 @@ -package twilightforest.entity.boss; - -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; -import twilightforest.entity.EntityTFMinotaur; -import twilightforest.item.TFItems; - -public class EntityTFMinoshroom extends EntityTFMinotaur { - - public EntityTFMinoshroom(World par1World) { - super(par1World); - //this.texture = TwilightForestMod.MODEL_DIR + "minoshroomtaur.png"; - this.setSize(1.49F, 2.9F); - - this.experienceValue = 100; - - this.setCurrentItemOrArmor(0, new ItemStack(TFItems.minotaurAxe)); - this.equipmentDropChances[0] = 0.0F; - } - - /** - * Set monster attributes - */ - @Override - protected void applyEntityAttributes() - { - super.applyEntityAttributes(); - this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(120.0D); // max health - } - - /** - * Returns the item ID for the item the mob drops on death. - */ - @Override - protected Item getDropItem() - { - return TFItems.meefStroganoff; - } - - /** - * Drop 0-2 items of this living's type - */ - @Override - protected void dropFewItems(boolean par1, int par2) - { - int numDrops = this.rand.nextInt(4) + 2 + this.rand.nextInt(1 + par2); - - for (int i = 0; i < numDrops; ++i) - { - this.dropItem(TFItems.meefStroganoff, 1); - } - } - - /** - * Determines if an entity can be despawned, used on idle far away entities - */ - @Override - protected boolean canDespawn() - { - return false; - } - - /** - * Drop the equipment for this entity. - */ - protected void dropEquipment(boolean par1, int par2) - { - super.dropEquipment(par1, par2); - this.entityDropItem(new ItemStack(TFItems.minotaurAxe), 0.0F); - - } - - -} diff --git a/src/main/java/twilightforest/entity/boss/EntityTFNaga.java b/src/main/java/twilightforest/entity/boss/EntityTFNaga.java deleted file mode 100644 index fd278fc451..0000000000 --- a/src/main/java/twilightforest/entity/boss/EntityTFNaga.java +++ /dev/null @@ -1,1222 +0,0 @@ -package twilightforest.entity.boss; - -import net.minecraft.block.Block; -import net.minecraft.entity.Entity; -import net.minecraft.entity.IEntityMultiPart; -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.boss.EntityDragonPart; -import net.minecraft.entity.boss.IBossDisplayData; -import net.minecraft.entity.monster.EntityMob; -import net.minecraft.entity.monster.IMob; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.nbt.NBTTagList; -import net.minecraft.pathfinding.PathEntity; -import net.minecraft.util.ChunkCoordinates; -import net.minecraft.util.DamageSource; -import net.minecraft.util.MathHelper; -import net.minecraft.util.Vec3; -import net.minecraft.world.EnumDifficulty; -import net.minecraft.world.World; -import twilightforest.TFAchievementPage; -import twilightforest.TFFeature; -import twilightforest.TwilightForestMod; -import twilightforest.block.TFBlocks; -import twilightforest.item.TFItems; -import twilightforest.world.ChunkProviderTwilightForest; -import twilightforest.world.TFWorldChunkManager; -import twilightforest.world.WorldProviderTwilightForest; - - -public class EntityTFNaga extends EntityMob -implements IMob, IBossDisplayData, IEntityMultiPart { - - private static int TICKS_BEFORE_HEALING = 600; - - private static int MAX_SEGMENTS = 12; - - int currentSegments = 0; // not including head - - float segmentHealth; - - int LEASH_X = 46; - int LEASH_Y = 7; - int LEASH_Z = 46; - - EntityTFNagaSegment[] body; - - protected PathEntity pathToEntity; - protected Entity targetEntity; - - int circleCount; - int intimidateTimer; - int crumblePlayerTimer; - int chargeCount; - - boolean clockwise; - - public int ticksSinceDamaged = 0; - - public EntityTFNaga(World world) { - super(world); - - //this.texture = TwilightForestMod.MODEL_DIR + "nagahead.png"; - this.setSize(1.75f, 3.0f); - //this.moveSpeed = 0.6f; - this.stepHeight = 2; - - this.setHealth(getMaxHealth()); - this.segmentHealth = getMaxHealth() / 10; - setSegmentsPerHealth(); - - this.experienceValue = 217; - - this.ignoreFrustumCheck = true; - - circleCount = 15; - - // make segments - this.body = new EntityTFNagaSegment[MAX_SEGMENTS]; - for (int i = 0; i < body.length; i++) - { - this.body[i] = new EntityTFNagaSegment(this, i); - world.spawnEntityInWorld(body[i]); - } - - this.goNormal(); - } - - @Override - protected void entityInit() - { - super.entityInit(); - } - - /** - * Returns true if the newer Entity AI code should be run - */ - protected boolean isAIEnabled() - { - return true; - } - - public float getMaxHealthPerDifficulty() { - if (worldObj != null) { - if (worldObj.difficultySetting == EnumDifficulty.EASY) - { - return 120; - } - else if (worldObj.difficultySetting == EnumDifficulty.NORMAL) - { - return 200; - } - else if (worldObj.difficultySetting == EnumDifficulty.HARD) - { - return 250; - } - else - { - //???? - return 200; - } - } - else { - // why is the world null? - return 200; - } - - } - - /** - * Determines if an entity can be despawned, used on idle far away entities - */ - protected boolean canDespawn() - { - return false; - } - - /** - * Set monster attributes - */ - @Override - protected void applyEntityAttributes() - { - super.applyEntityAttributes(); - this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(getMaxHealthPerDifficulty()); // max health - this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(2.0D); // movement speed - this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(6.0D); // attack damage - } - - - - /** - * Determine how many segments, from 2-12, the naga should have, dependent on its current health - */ - protected int setSegmentsPerHealth() - { - int oldSegments = this.currentSegments; - int newSegments = (int) ((this.getHealth() / segmentHealth) + (getHealth() > 0 ? 2 : 0)); - - // certain types of overkill seem to make this happen by setting health to a negative number - if (newSegments < 0) { - newSegments = 0; - } - - // why is this happening? healing rays? - if (newSegments > MAX_SEGMENTS) - { - newSegments = MAX_SEGMENTS; - } - - if (newSegments != oldSegments) { - // detonate unused segments - if (newSegments < oldSegments) { - for (int i = newSegments; i < oldSegments; i++) { - if (body != null && body[i] != null) { - body[i].selfDestruct(); - } - } - } - else - { - // grow new segments? - this.spawnBodySegments(); - } - } - - // change current variables - this.currentSegments = newSegments; - setMovementFactorPerSegments(); - - return currentSegments; - } - - /** - * Sets how fast the naga should be moving, depending on how many segments it has left; - */ - protected void setMovementFactorPerSegments() { - float movementFactor = 0.6F - (currentSegments / 12f * 0.2f); - - - - this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(movementFactor); // movement speed - -// landMovementFactor = 0.6F - (currentSegments / 12f * 0.2f); -// jumpMovementFactor = landMovementFactor / 2F; - -// for (int i = 0; i < currentSegments; i++) { -// if (body != null && body.length > i && body[i] != null) { -// body[i].landMovementFactor = this.landMovementFactor * 1.25F; -// body[i].jumpMovementFactor = this.jumpMovementFactor * 1.25F; -// } -// } - } - - /** - * Supress walking sounds - */ - @Override - public boolean canTriggerWalking() - { - return false; - } - - /** - * Do not get slowed by lava. - */ - @Override - public boolean handleLavaMovement() - { - return false; - } - - - - /** - * Die on peaceful - */ - @Override - public void onUpdate() { - despawnIfInvalid(); - - if (deathTime > 0) { - for(int k = 0; k < 5; k++) - { - double d = rand.nextGaussian() * 0.02D; - double d1 = rand.nextGaussian() * 0.02D; - double d2 = rand.nextGaussian() * 0.02D; - String explosionType = rand.nextBoolean() ? "hugeexplosion" : "explode"; - - worldObj.spawnParticle(explosionType, (posX + rand.nextFloat() * width * 2.0F) - width, posY + rand.nextFloat() * height, (posZ + rand.nextFloat() * width * 2.0F) - width, d, d1, d2); - } - } - - // update health - this.ticksSinceDamaged++; - - if (!this.worldObj.isRemote && this.ticksSinceDamaged > TICKS_BEFORE_HEALING && this.ticksSinceDamaged % 20 == 0) - { - this.heal(1); - } -// -// -// if (!this.worldObj.isRemote) -// { -// this.dataWatcher.updateObject(DATA_BOSSHEALTH, Integer.valueOf((int)this.getHealth())); -// } -// else -// { -//// if (this.getBossHealth() != this.getHealth()) -//// { -//// this.setEntityHealth(this.getBossHealth()); -//// } -// if (this.getHealth() > 0) -// { -// // this seems to get set off during creation at some point -// this.deathTime = 0; -// } -// } - - setSegmentsPerHealth(); - - - super.onUpdate(); - -// if (!this.worldObj.isRemote) -// { -// for (int i = 0; i < this.body.length; i++) -// { -// body[i].onUpdate(); -// } -// } - - - // move bodies - moveSegments(); - - for (int i = 0; i < body.length; i++) - { - if (!body[i].addedToChunk && !worldObj.isRemote) - { - worldObj.spawnEntityInWorld(body[i]); - } - } - } - - - /** - * Semi-copied from EntityCreature, but this adds the capability to just path around and not target the player - * - */ - @Override - protected void updateAITasks() - { - super.updateAITasks(); -// super.updateEntityActionState(); - - /* - // Resist fire - if (fire >= 20) { - fire -= 10; - } - */ - - // NAGA SMASH! - if (isCollidedHorizontally && hasTarget()) - { - breakNearbyBlocks(); - } - - // break targeting if our target goes outside the walls - if (targetEntity != null && !this.isEntityWithinHomeArea(targetEntity)) - { - this.targetEntity = null; - } - - // perform target and path maintenance - if (targetEntity == null) - { - targetEntity = findTarget(); - if(targetEntity != null) - { - acquireNewPath(); - } - } - else if (!targetEntity.isEntityAlive()) - { - targetEntity = null; - } - else - { - float targetDistance = targetEntity.getDistanceToEntity(this); - - if (targetDistance > 80) { - targetEntity = null; - } - else { - if(canEntityBeSeen(targetEntity)) - { - attackEntity(targetEntity, targetDistance); - } - else - { - //attackBlockedEntity(entityToAttack, f1); - } - } - } - - if(!hasPath()) - { - acquireNewPath(); - } - - boolean inWater = isInWater(); - boolean inLava = handleLavaMovement(); - - //rotationPitch = 0.0F; - - Vec3 vec3d = hasPath() ? pathToEntity.getPosition(this) : null; - - // if we are very close to the path point, go to the next point, unless the path is finished - for(double d = width * 4.0F; vec3d != null && vec3d.squareDistanceTo(posX, vec3d.yCoord, posZ) < d * d;) - { - pathToEntity.incrementPathIndex(); - if(pathToEntity.isFinished()) - { - vec3d = null; - pathToEntity = null; - } else - { - vec3d = pathToEntity.getPosition(this); - } - } - - isJumping = false; - if(vec3d != null) - { - double d1 = vec3d.xCoord - posX; - double d2 = vec3d.zCoord - posZ; - - double dist = MathHelper.sqrt_double(d1 * d1 + d2 * d2); - - int i = MathHelper.floor_double(boundingBox.minY + 0.5D); - double d3 = vec3d.yCoord - i; - float f2 = (float)((Math.atan2(d2, d1) * 180D) / 3.1415927410125732D) - 90F; - float f3 = f2 - rotationYaw; - moveForward = getMoveSpeed(); - this.setAIMoveSpeed(0.5f); - - //this.moveForward = (float)this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).getBaseValue(); - - // slither! - if (dist > 4 && chargeCount == 0) { - moveStrafing = MathHelper.cos(this.ticksExisted * 0.3F) * getMoveSpeed() * 0.6F; - } - - for(; f3 < -180F; f3 += 360F) { } - for(; f3 >= 180F; f3 -= 360F) { } - if(f3 > 30F) - { - f3 = 30F; - } - if(f3 < -30F) - { - f3 = -30F; - } - rotationYaw += f3; - if(d3 > 0.6D) - { - isJumping = true; - } - } - if(intimidateTimer > 0 && hasTarget()) - { - faceEntity(targetEntity, 30F, 30F); - moveForward = 0.1f; - } - if(intimidateTimer > 0 && hasTarget()) - { - faceEntity(targetEntity, 30F, 30F); - moveForward = 0.1f; - } - if(rand.nextFloat() < 0.8F && (inWater || inLava)) - { - isJumping = true; - } - } - - private float getMoveSpeed() { - return 0.5F; - } - - /** - * Utility method to set our move speed - */ - private void setMoveSpeed(float f) { - //this.setAIMoveSpeed(0.5f); - this.setAIMoveSpeed(f); - } - - /** - * Breaks blocks near the naga - */ - protected void breakNearbyBlocks() { - int minx = MathHelper.floor_double(boundingBox.minX - 0.5D); - int miny = MathHelper.floor_double(boundingBox.minY + 1.01D); - int minz = MathHelper.floor_double(boundingBox.minZ - 0.5D); - int maxx = MathHelper.floor_double(boundingBox.maxX + 0.5D); - int maxy = MathHelper.floor_double(boundingBox.maxY + 0.001D); - int maxz = MathHelper.floor_double(boundingBox.maxZ + 0.5D); - if(worldObj.checkChunksExist(minx, miny, minz, maxx, maxy, maxz)) - { - for(int dx = minx; dx <= maxx; dx++) - { - for(int dy = miny; dy <= maxy; dy++) - { - for(int dz = minz; dz <= maxz; dz++) - { - Block i5 = worldObj.getBlock(dx, dy, dz); - if(i5 != Blocks.air) - { - breakBlock(dx, dy, dz); - } - } - - } - - } - - } - } - - - /** - * Returns the sound this mob makes while it's alive. - */ - @Override - protected String getLivingSound() - { - return rand.nextInt(3) != 0 ? TwilightForestMod.ID + ":mob.naga.hiss" : TwilightForestMod.ID + ":mob.naga.rattle"; - } - - /** - * Returns the sound this mob makes when it is hurt. - */ - @Override - protected String getHurtSound() - { - return TwilightForestMod.ID + ":mob.naga.hurt"; - } - - /** - * Returns the sound this mob makes on death. - */ - @Override - protected String getDeathSound() - { - return TwilightForestMod.ID + ":mob.naga.hurt"; - } - - /** - * Finds a new path. Currently this is designed to circle the target entity - */ - protected void acquireNewPath() { - - // if we don't have a target, do nuffin - if (!hasTarget()) - { - wanderRandomly(); - return; - } - - // if we're supposed to intimidate, don't set a path - if (intimidateTimer > 0) - { - - pathToEntity = null; - intimidateTimer--; - - if (intimidateTimer == 0) - { - clockwise = !clockwise; - - // check to see if we want to charge or crumble blocks around the player - if (targetEntity.boundingBox.minY > boundingBox.maxY) - { - // crumble! - doCrumblePlayer(); - } - else - { - doCharge(); - } - } - - return; - } - - // crumbling is like intimidating, but we just charge after it - if (crumblePlayerTimer > 0) - { - pathToEntity = null; - crumblePlayerTimer--; - - crumbleBelowTarget(2); - crumbleBelowTarget(3); - - if (crumblePlayerTimer == 0) { - doCharge(); - } - } - - // looks like we're charging! - if (chargeCount > 0) - { - chargeCount--; - - Vec3 tpoint = findCirclePoint(targetEntity, 14, Math.PI); - pathToEntity = worldObj.getEntityPathToXYZ(this, MathHelper.floor_double(tpoint.xCoord), MathHelper.floor_double(tpoint.yCoord), MathHelper.floor_double(tpoint.zCoord), 40F, true, true, true, true); - - if (chargeCount == 0) - { - doCircle(); - } - } - - // circle if we're supposed to - if (circleCount > 0) { - - circleCount--; - - // normal radius is 13 - double radius = circleCount % 2 == 0 ? 12.0 : 14.0; - double rotation = 1; // in radians - - // hook out slightly before circling - if (circleCount > 1 && circleCount < 3) { - radius = 16; - } - - // head almost straight at the player at the end - if (circleCount == 1) { - rotation = 0.1; - } - - Vec3 tpoint = findCirclePoint(targetEntity, radius, rotation); - - pathToEntity = worldObj.getEntityPathToXYZ(this, (int)tpoint.xCoord, (int)tpoint.yCoord, (int)tpoint.zCoord, 40F, true, true, true, true); - - if (circleCount == 0) { - doIntimidate(); - } - - - } - - } - - /** - * Crumbles blocks below our current targetEntity. - */ - protected void crumbleBelowTarget(int range) { - int floor = (int) boundingBox.minY; // the block level the naga is standing on. - int targetY = (int) targetEntity.boundingBox.minY; // the block level the target is standing on. - - if (targetY > floor) - { - int dx = (int) targetEntity.posX + rand.nextInt(range) - rand.nextInt(range); - int dz = (int) targetEntity.posZ + rand.nextInt(range) - rand.nextInt(range); - int dy = targetY - rand.nextInt(range) + rand.nextInt(range > 1 ? range - 1 : range); - - if (dy <= floor) { - dy = targetY; - } - -// System.out.println("Crumbling block at " + dx + ", " + dy + ", " + dz); - if (worldObj.getBlock(dx, dy, dz) != Blocks.air) - { - breakBlock(dx, dy, dz); - - // sparkle!! - for(int k = 0; k < 20; k++) - { - double d = rand.nextGaussian() * 0.02D; - double d1 = rand.nextGaussian() * 0.02D; - double d2 = rand.nextGaussian() * 0.02D; - - worldObj.spawnParticle("crit", (posX + rand.nextFloat() * width * 2.0F) - width, posY + rand.nextFloat() * height, (posZ + rand.nextFloat() * width * 2.0F) - width, d, d1, d2); - } - } - } - } - - /** - * Breaks a block, no questions asked. - * - * TODO: there should be some limits on what kinds of blocks we can break. - */ - protected void breakBlock(int dx, int dy, int dz) - { - Block whatsThere = worldObj.getBlock(dx, dy, dz); - int whatsMeta = worldObj.getBlockMetadata(dx, dy, dz); - - if (whatsThere != Blocks.air) { - whatsThere.dropBlockAsItem(worldObj, dx, dy, dz, whatsMeta, 0); - this.worldObj.setBlock(dx, dy, dz, Blocks.air, 0, 2); - - worldObj.playAuxSFX(2001, dx, dy, dz, Block.getIdFromBlock(whatsThere) + (whatsMeta << 12)); - } - } - - /** - * Begin the circle cycle - */ - protected void doCircle() { -// System.out.println("Resuming circle mode"); - circleCount += 10 + rand.nextInt(10); - goNormal(); - } - - /** - * Crumble blocks around the player. This could use maybe some sort of animation or effect to show it is happening. - */ - protected void doCrumblePlayer() { -// System.out.println("Crumbling blocks around the player"); - crumblePlayerTimer = 20 + rand.nextInt(20); - goSlow(); - } - - /** - * Charge the player. Although the count is 4, we actually charge only 3 times. - */ - protected void doCharge() { - // charrrrrge! -// System.out.println("Starting to charge!"); - chargeCount = 4; - goFast(); - } - - /** - * Intimidate the player. This mostly involves pausing and staring. - */ - protected void doIntimidate() { -// System.out.println("Intimidating!"); - // start the timer - intimidateTimer += 15 + rand.nextInt(10); - goSlow(); - - } - - /** - * Sets the naga to move slowly, such as when he is intimidating the player - */ - protected void goSlow() { - // move slowly -// moveForward = 0f; - moveStrafing = 0; - setMoveSpeed(0.1f); - pathToEntity = null; - } - - /** - * Normal speed, like when he is circling - */ - protected void goNormal() { - setMoveSpeed(0.6F); - } - - /** - * Fast, like when he is charging - */ - protected void goFast() { - setMoveSpeed(1.0F); - } - - - /** - * Do not get pushed while we're intimidating. - */ - @Override - public boolean canBePushed() { - return false; - } - - /** - * Finds a point that allows us to circle the player clockwise. - */ - protected Vec3 findCirclePoint(Entity toCircle, double radius, double rotation) - { - // compute angle - double vecx = posX - toCircle.posX; - double vecz = posZ - toCircle.posZ; - float rangle = (float)(Math.atan2(vecz, vecx)); - - // add a little, so he circles (clockwise) - rangle += clockwise ? rotation : -rotation; - - // figure out where we're headed from the target angle - double dx = MathHelper.cos(rangle) * radius; - double dz = MathHelper.sin(rangle) * radius; - - double dy = Math.min(boundingBox.minY, toCircle.posY); - - // add that to the target entity's position, and we have our destination - return Vec3.createVectorHelper(toCircle.posX + dx, dy, toCircle.posZ + dz); - } - - public boolean hasTarget() { - return targetEntity != null; - } - - /** - * Copied from EntityMob - */ - protected Entity findTarget() - { - EntityPlayer entityplayer = worldObj.getClosestVulnerablePlayerToEntity(this, 32D); - //EntityPlayer entityplayer = worldObj.getClosestPlayerToEntity(this, 32D); - if (entityplayer != null && canEntityBeSeen(entityplayer) && isEntityWithinHomeArea(entityplayer)) - { - // check range - return entityplayer; - } - else - { - return null; - } - } - - /** - * We take damage from another entity. - */ - @Override - public boolean attackEntityFrom(DamageSource damagesource, float i) - { - // reject damage from outside of our home radius - if (damagesource.getSourceOfDamage() != null) - { - if (!this.isEntityWithinHomeArea(damagesource.getSourceOfDamage())) - { - return false; - } - - } - - if (damagesource.getEntity() != null) - { - if (!this.isEntityWithinHomeArea(damagesource.getEntity())) - { - return false; - } - } - - // normal damage processing - if (super.attackEntityFrom(damagesource, i)) - { - setSegmentsPerHealth(); - - Entity entity = damagesource.getEntity(); - - if(entity != this) - { - targetEntity = entity; - } - - this.ticksSinceDamaged = 0; - - return true; - } - else - { -// System.out.println("Naga rejected damage"); - - return false; - } - } - - /** - * We attempt to attack another entity. Checks y height and attackTime counter - */ - protected void attackEntity(Entity toAttack, float f) - { - if(attackTime <= 0 && f < 4.0F && toAttack.boundingBox.maxY > (boundingBox.minY - 2.5) && toAttack.boundingBox.minY < (boundingBox.maxY + 2.5)) - { - attackTime = 20; - attackEntityAsMob(toAttack); - - if (getMoveSpeed() > 0.8) { - // charging, apply extra pushback - toAttack.addVelocity(-MathHelper.sin((rotationYaw * 3.141593F) / 180F) * 1.0F, 0.10000000000000001D, MathHelper.cos((rotationYaw * 3.141593F) / 180F) * 1.0F); - } - } - } - - /** - * Like it says in the method title, find a random destinaton and set sail. - */ - protected void wanderRandomly() - { - goNormal(); - - boolean flag = false; - int tx = -1; - int ty = -1; - int tz = -1; - float worstweight = -99999F; - for(int l = 0; l < 10; l++) - { - int dx = MathHelper.floor_double((posX + rand.nextInt(21)) - 6D); - int dy = MathHelper.floor_double((posY + rand.nextInt(7)) - 3D); - int dz = MathHelper.floor_double((posZ + rand.nextInt(21)) - 6D); - - // if we are thinking about out of bounds, head back home instead - if (!this.isWithinHomeDistance(dx, dy, dz)) - { -// System.err.println("Naga wants to go out of bounds"); - - dx = this.getHomePosition().posX + rand.nextInt(21) - rand.nextInt(21); - dy = this.getHomePosition().posY + rand.nextInt(7) - rand.nextInt(7); - dz = this.getHomePosition().posZ + rand.nextInt(21) - rand.nextInt(21); - } - - float weight = getBlockPathWeight(dx, dy, dz); - if(weight > worstweight) - { - worstweight = weight; - tx = dx; - ty = dy; - tz = dz; - flag = true; - } - } - - if(flag) - { - pathToEntity = worldObj.getEntityPathToXYZ(this, tx, ty, tz, 80F, true, true, true, true); - } - } - - /** - * Copied from EntityCreature - */ - @Override - public float getBlockPathWeight(int i, int j, int k) - { - // if it's out of bounds, we hate it - if (!this.isWithinHomeDistance(i, j, k)) - { - return Float.MIN_VALUE; - } - else - { - return 0.0F; - } - } - - /** - * Copied from EntityCreature - */ - @Override - public boolean hasPath() - { - return pathToEntity != null; - } - - @Override - protected Item getDropItem() - { - return TFItems.nagaScale; - } - - - - @Override - protected void dropFewItems(boolean flag, int z) { - Item i = getDropItem(); - if(i != null) - { - int j = 6 + rand.nextInt(6); - for(int k = 0; k < j; k++) - { - this.dropItem(i, 1); - } - - } - - // trophy - this.entityDropItem(new ItemStack(TFItems.trophy, 1, 1), 0); - } - - /** - * Check to make sure all parts exist. If they don't, despawn. - */ - protected void despawnIfInvalid() { - // check to see if we're valid - if(!worldObj.isRemote && worldObj.difficultySetting == EnumDifficulty.PEACEFUL) - { - despawnMe(); - } - } - - /** - * Despawn the naga, and restore the boss spawner at our home location, if set - */ - protected void despawnMe() { - if (isLeashed()) - { - ChunkCoordinates home = this.getHomePosition(); - worldObj.setBlock(home.posX, home.posY, home.posZ, TFBlocks.bossSpawner, 0, 2); - } - setDead(); - } - - /** - * Are there free-roaming nagas out there? Should there be? - */ - public boolean isLeashed() { - return this.getMaximumHomeDistance() > -1; - } - - /** - * The naga does not keep a circular home - */ - //@Override - public boolean isWithinHomeDistance(int x, int y, int z) - { - if (this.getMaximumHomeDistance() == -1) - { - return true; - } - else - { - int distX = Math.abs(this.getHomePosition().posX - x); - int distY = Math.abs(this.getHomePosition().posY - y); - int distZ = Math.abs(this.getHomePosition().posZ - z); - - return distX <= LEASH_X && distY <= LEASH_Y && distZ <= LEASH_Z; - } - } - - /** - * Is the entity within our home area? - */ - public boolean isEntityWithinHomeArea(Entity entity) - { - return isWithinHomeDistance(MathHelper.floor_double(entity.posX), MathHelper.floor_double(entity.posY), MathHelper.floor_double(entity.posZ)); - } - - - /** - * Spawns the body of the naga - */ - protected void spawnBodySegments() - { - if (!worldObj.isRemote) - { - if (body == null) - { - body = new EntityTFNagaSegment[MAX_SEGMENTS]; - } - for (int i = 0; i < currentSegments; i++) - { - if (body[i] == null || body[i].isDead) - { - body[i] = new EntityTFNagaSegment(this, i); - body[i].setLocationAndAngles(posX + 0.1 * i, posY + 0.5D, posZ + 0.1 * i, rand.nextFloat() * 360F, 0.0F); - worldObj.spawnEntityInWorld(body[i]); - } - } - } - } - - /** - * Sets the heading (ha ha) of the body segments - */ - protected void moveSegments() { - for (int i = 0; i < this.currentSegments; i++) - { - double followX, followY, followZ; - Entity leader; - - if (i == 0) - { - leader = this; - } - else - { - leader = this.body[i - 1]; - } - - followX = leader.posX; - followY = leader.posY; - followZ = leader.posZ; - - - // also weight the position so that the segments straighten out a little bit, and the front ones straighten more - float angle = (((leader.rotationYaw + 180) * 3.141593F) / 180F); - - - double straightenForce = 0.05D + (1.0 / (float)(i + 1)) * 0.5D; - - double idealX = -MathHelper.sin(angle) * straightenForce; - double idealZ = MathHelper.cos(angle) * straightenForce; - - - Vec3 diff = Vec3.createVectorHelper(body[i].posX - followX, body[i].posY - followY, body[i].posZ - followZ); - diff = diff.normalize(); - - // weight so segments drift towards their ideal position - diff = diff.addVector(idealX, 0, idealZ); - diff = diff.normalize(); - -// if (worldObj.isRemote) -// { -// System.out.println("Difference for segment " + i + " is " + diff.xCoord + ", " + diff.yCoord + ", " + diff.zCoord); -// } - - double f = 2.0D; - - - - double destX = followX + f * diff.xCoord; - double destY = followY + f * diff.yCoord; - double destZ = followZ + f * diff.zCoord; - -// if (body[i].onGround && diff.yCoord > 0) -// { -// destY = body[i].posY; -// } - - - body[i].setPosition(destX, destY, destZ); - - body[i].motionX = f * diff.xCoord; - body[i].motionY = f * diff.yCoord; - body[i].motionZ = f * diff.zCoord; - - double distance = (double)MathHelper.sqrt_double(diff.xCoord * diff.xCoord + diff.zCoord * diff.zCoord); - - if (i == 0) - { - diff.yCoord -= 0.15D; - } - - body[i].setRotation((float) (Math.atan2(diff.zCoord, diff.xCoord) * 180.0D / Math.PI) + 90.0F, -(float)(Math.atan2(diff.yCoord, distance) * 180.0D / Math.PI)); - - - -// if (worldObj.isRemote) -// { -// System.out.println("Client body segment " + i + " to " + body[i].posX + ", " + body[i].posY + ", " + body[i].posZ); -// } -// else -// { -// System.out.println("Server body segment " + i + " to " + body[i].posX + ", " + body[i].posY + ", " + body[i].posZ); -// } - - } - - - - } - - @Override - public void writeEntityToNBT(NBTTagCompound nbttagcompound) - { - ChunkCoordinates home = this.getHomePosition(); - nbttagcompound.setTag("Home", newDoubleNBTList(new double[] { - home.posX, home.posY, home.posZ - })); - nbttagcompound.setBoolean("HasHome", this.hasHome()); - super.writeEntityToNBT(nbttagcompound); - } - - @Override - public void readEntityFromNBT(NBTTagCompound nbttagcompound) - { - super.readEntityFromNBT(nbttagcompound); - if (nbttagcompound.hasKey("Home", 9)) - { - NBTTagList nbttaglist = nbttagcompound.getTagList("Home", 6); - int hx = (int) nbttaglist.func_150309_d(0); - int hy = (int) nbttaglist.func_150309_d(1); - int hz = (int) nbttaglist.func_150309_d(2); - this.setHomeArea(hx, hy, hz, 20); - } - if (!nbttagcompound.getBoolean("HasHome")) - { - this.detachHome(); - } - - // check health and segments - setSegmentsPerHealth(); - } - - /** - * Trigger achievement when killed - */ - @Override - public void onDeath(DamageSource par1DamageSource) { - super.onDeath(par1DamageSource); - if (par1DamageSource.getSourceOfDamage() instanceof EntityPlayer) { - ((EntityPlayer)par1DamageSource.getSourceOfDamage()).triggerAchievement(TFAchievementPage.twilightHunter); - ((EntityPlayer)par1DamageSource.getSourceOfDamage()).triggerAchievement(TFAchievementPage.twilightKillNaga); - } - - // mark the courtyard as defeated - if (!worldObj.isRemote && worldObj.provider instanceof WorldProviderTwilightForest) { - int dx = MathHelper.floor_double(this.posX); - int dy = MathHelper.floor_double(this.posY); - int dz = MathHelper.floor_double(this.posZ); - - ChunkProviderTwilightForest chunkProvider = ((WorldProviderTwilightForest)worldObj.provider).getChunkProvider(); - TFFeature nearbyFeature = ((TFWorldChunkManager)worldObj.provider.worldChunkMgr).getFeatureAt(dx, dz, worldObj); - - if (nearbyFeature == TFFeature.nagaCourtyard) { - chunkProvider.setStructureConquered(dx, dy, dz, true); - } - } - - } - -// public float getMoveSpeed() { -// return this.moveSpeed; -// } - -// /** -// * Needed for boss health bar on the client -// */ -// @Override -// public int getBossHealth() { -// return this.dataWatcher.getWatchableObjectInt(EntityTFNaga.DATA_BOSSHEALTH); -// } - - - @Override - public World func_82194_d() { - return this.worldObj; - } - - @Override - public boolean attackEntityFromPart(EntityDragonPart entitydragonpart, DamageSource damagesource, float i) { - return false; - } - - - /** - * We need to do this for the bounding boxes on the parts to become active - */ - @Override - public Entity[] getParts() - { - return body; - } - - public float getMaximumHomeDistance() - { - return this.func_110174_bM(); - } -} diff --git a/src/main/java/twilightforest/entity/boss/EntityTFNagaSegment.java b/src/main/java/twilightforest/entity/boss/EntityTFNagaSegment.java deleted file mode 100644 index 17f7d1e046..0000000000 --- a/src/main/java/twilightforest/entity/boss/EntityTFNagaSegment.java +++ /dev/null @@ -1,259 +0,0 @@ -package twilightforest.entity.boss; - -import java.util.List; - -import net.minecraft.block.Block; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.passive.EntityAnimal; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.DamageSource; -import net.minecraft.util.MathHelper; -import net.minecraft.world.World; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public class EntityTFNagaSegment extends Entity { - - EntityTFNaga naga; - int segment; - - String texture; - - private int deathCounter; - - public EntityTFNagaSegment(World par1World) { - super(par1World); - //this.texture = TwilightForestMod.MODEL_DIR + "nagasegment.png"; - setSize(1.8F, 1.8F); - this.stepHeight = 2; - - } - - public EntityTFNagaSegment(EntityTFNaga myNaga, int segNum) { - this(myNaga.func_82194_d()); - this.naga = myNaga; - this.segment = segNum; - } - - /** - * When we're attacked transfer damage to the head. Segments only transfer 2/3 normal damage to the head. - * Segments do not transfer damage from fire, explosions or lava. - */ - @Override - public boolean attackEntityFrom(DamageSource damagesource, float damage) { - // do not transfer (or take) fire, explosion, or lava damage. - if (damagesource.isExplosion() || damagesource.isFireDamage()) { - //hurtTime = 0; -// System.out.println("Prevented damage from fire/explosion/lava. DamageSource == " + damagesource.damageType); - return false; - } - - // do not transfer damage from segments that are disconnected and about to explode - if (naga != null) { - //hurtTime = maxHurtTime = 10; - // System.out.println("transferring damage, world is " + this.worldObj); - - return naga.attackEntityFrom(damagesource, Math.round(damage * 2.0F / 3.0F)); - } - else - { - return false; - } - } - - - /** - * Skip most of the living update things - */ - @Override - public void onUpdate() { - super.onUpdate(); - - // remove if invalid - if (this.naga == null || this.naga.isDead) - { - this.setDead(); - } - - this.ticksExisted++; - - lastTickPosX = posX; - lastTickPosY = posY; - lastTickPosZ = posZ; - - -// System.out.println("Updating " + this + " with angles " + rotationYaw + ", " + rotationPitch); - - for (; rotationYaw - prevRotationYaw < -180F; prevRotationYaw -= 360F) { } - for (; rotationYaw - prevRotationYaw >= 180F; prevRotationYaw += 360F) { } - for (; rotationPitch - prevRotationPitch < -180F; prevRotationPitch -= 360F) { } - for (; rotationPitch - prevRotationPitch >= 180F; prevRotationPitch += 360F) { } - - - //this.pushOutOfBlocks(posX, posY, posZ); - - if (!this.onGround) - { - this.motionY -= 0.08D; - } - else - { - this.motionX *= 0.800000011920929D; -// this.motionY *= 0.800000011920929D; - this.motionZ *= 0.800000011920929D; - } - - this.moveEntity(motionX, motionY, motionZ); - - collideWithOthers(); - -// if (this.segment == 6) -// { -// System.out.println("Updating segment 6"); -// -//// int dx = MathHelper.floor_double(this.posX); -//// int dy = MathHelper.floor_double(this.posY); -//// int dz = MathHelper.floor_double(this.posZ); -//// -//// if (worldObj.isAirBlock(dx, dy, dz)) -//// { -//// worldObj.setBlock(dx, dy, dz, Blocks.torch); -//// } -// -// } - - if (deathCounter > 0) { - deathCounter--; - - if (deathCounter == 0) { - - for(int k = 0; k < 20; k++) - { - double d = rand.nextGaussian() * 0.02D; - double d1 = rand.nextGaussian() * 0.02D; - double d2 = rand.nextGaussian() * 0.02D; - String explosionType = rand.nextBoolean() ? "largeexplode" : "explode"; - - worldObj.spawnParticle(explosionType, (posX + rand.nextFloat() * width * 2.0F) - width, posY + rand.nextFloat() * height, (posZ + rand.nextFloat() * width * 2.0F) - width, d, d1, d2); - } - - // really explode? -// worldObj.newExplosion(null, posX, posY, posZ, 3.0F, true); - - setDead(); - worldObj.removeEntity(this); - } - } - - } - - @SuppressWarnings("unchecked") - protected void collideWithOthers() - { - List list = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox.expand(0.20000000298023224D, 0.0D, 0.20000000298023224D)); - - for (Entity entity : list) - { - if (entity.canBePushed()) - { - this.collideWithEntity(entity); - } - } - } - - private void collideWithEntity(Entity entity) { - entity.applyEntityCollision(this); - - // attack anything that's not us - if ((entity instanceof EntityLivingBase) && !(entity instanceof EntityTFNaga) && !(entity instanceof EntityTFNagaSegment)) - { - naga.attackTime = 10; - int attackStrength = 2; - - // get rid of nearby deer & look impressive - if (entity instanceof EntityAnimal) - { - attackStrength *= 3; - } - - entity.attackEntityFrom(DamageSource.causeMobDamage(naga), attackStrength); - } - - - } - - /** - * Sets the rotation of the entity - */ - public void setRotation(float par1, float par2) - { - this.rotationYaw = MathHelper.wrapAngleTo180_float(par1 % 360.0F); - this.rotationPitch = par2 % 360.0F; - } - - /** - * Returns true if other Entities should be prevented from moving through this Entity. - */ - public boolean canBeCollidedWith() - { - return true; - } - - /** - * Returns true if this entity should push and be pushed by other entities when colliding. - */ - public boolean canBePushed() - { - return false; - } - - /** - * Determines if an entity can be despawned, used on idle far away entities - */ - protected boolean canDespawn() - { - return false; - } - - public boolean isEntityEqual(Entity entity) - { - return this == entity || this.naga == entity; - } - - @Override - protected void entityInit() { } - - @Override - protected void readEntityFromNBT(NBTTagCompound nbttagcompound) { } - - @Override - protected void writeEntityToNBT(NBTTagCompound nbttagcompound) { } - - - /** - * Plays step sound at given x, y, z for the entity - */ - protected void func_145780_a(int par1, int par2, int par3, Block par4) - { - ; - } - - @SideOnly(Side.CLIENT) - - /** - * Returns the texture's file path as a String. - */ - public String getTexture() - { - return this.texture; - } - - /** - * Starts the self destruction process - */ - public void selfDestruct() { - this.deathCounter = 30; - } - -} diff --git a/src/main/java/twilightforest/entity/boss/EntityTFSnowQueen.java b/src/main/java/twilightforest/entity/boss/EntityTFSnowQueen.java deleted file mode 100644 index c9379d38b6..0000000000 --- a/src/main/java/twilightforest/entity/boss/EntityTFSnowQueen.java +++ /dev/null @@ -1,685 +0,0 @@ -package twilightforest.entity.boss; - -import java.util.List; - -import net.minecraft.block.Block; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.IEntityLivingData; -import net.minecraft.entity.IEntityMultiPart; -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.ai.EntityAIAttackOnCollide; -import net.minecraft.entity.ai.EntityAIHurtByTarget; -import net.minecraft.entity.ai.EntityAILookIdle; -import net.minecraft.entity.ai.EntityAINearestAttackableTarget; -import net.minecraft.entity.ai.EntityAISwimming; -import net.minecraft.entity.ai.EntityAIWander; -import net.minecraft.entity.ai.EntityAIWatchClosest; -import net.minecraft.entity.boss.EntityDragonPart; -import net.minecraft.entity.boss.IBossDisplayData; -import net.minecraft.entity.monster.EntityMob; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.init.Items; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.DamageSource; -import net.minecraft.util.MathHelper; -import net.minecraft.util.Vec3; -import net.minecraft.world.World; -import twilightforest.TFAchievementPage; -import twilightforest.TFFeature; -import twilightforest.TwilightForestMod; -import twilightforest.entity.IBreathAttacker; -import twilightforest.entity.ai.EntityAITFHoverBeam; -import twilightforest.entity.ai.EntityAITFHoverSummon; -import twilightforest.entity.ai.EntityAITFHoverThenDrop; -import twilightforest.item.TFItems; -import twilightforest.world.ChunkProviderTwilightForest; -import twilightforest.world.TFWorldChunkManager; -import twilightforest.world.WorldProviderTwilightForest; - -public class EntityTFSnowQueen extends EntityMob implements IBossDisplayData, IEntityMultiPart, IBreathAttacker { - - private static final int MAX_SUMMONS = 6; - private static final int BEAM_FLAG = 21; - private static final int PHASE_FLAG = 22; - private static final int MAX_DAMAGE_WHILE_BEAMING = 25; - private static final float BREATH_DAMAGE = 4.0F; - - - public enum Phase { SUMMON, DROP, BEAM }; - - public Entity[] iceArray; - - private int summonsRemaining = 0; - private int successfulDrops; - private int maxDrops; - private int damageWhileBeaming; - - public EntityTFSnowQueen(World par1World) { - super(par1World); - - this.tasks.addTask(0, new EntityAISwimming(this)); - this.tasks.addTask(1, new EntityAITFHoverSummon(this, EntityPlayer.class, 1.0D)); - this.tasks.addTask(2, new EntityAITFHoverThenDrop(this, EntityPlayer.class, 80, 20)); - this.tasks.addTask(3, new EntityAITFHoverBeam(this, EntityPlayer.class, 80, 100)); - this.tasks.addTask(6, new EntityAIAttackOnCollide(this, EntityPlayer.class, 1.0D, true)); - this.tasks.addTask(7, new EntityAIWander(this, 1.0D)); - this.tasks.addTask(8, new EntityAIWatchClosest(this, EntityPlayer.class, 8.0F)); - this.tasks.addTask(8, new EntityAILookIdle(this)); - this.targetTasks.addTask(1, new EntityAIHurtByTarget(this, true)); - this.targetTasks.addTask(2, new EntityAINearestAttackableTarget(this, EntityPlayer.class, 0, true)); - this.setSize(0.7F, 2.2F); - - this.iceArray = new Entity[7]; - for (int i = 0; i < this.iceArray.length; i++) { - this.iceArray[i] = new EntityTFSnowQueenIceShield(this); - } - - this.setCurrentPhase(Phase.SUMMON); - - this.isImmuneToFire = true; - this.experienceValue = 317; - - } - - /** - * Returns true if this entity should push and be pushed by other entities when colliding. - */ - public boolean canBePushed() - { - return false; - } - - protected void applyEntityAttributes() - { - super.applyEntityAttributes(); - this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.23000000417232513D); - this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(7.0D); - this.getEntityAttribute(SharedMonsterAttributes.followRange).setBaseValue(40.0D); - this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(200.0D); - } - - protected void entityInit() - { - super.entityInit(); - this.dataWatcher.addObject(BEAM_FLAG, Byte.valueOf((byte)0)); - this.dataWatcher.addObject(PHASE_FLAG, Byte.valueOf((byte)0)); - } - - /** - * Returns true if the newer Entity AI code should be run - */ - protected boolean isAIEnabled() - { - return true; - } - - @Override - protected String getLivingSound() - { - return TwilightForestMod.ID + ":mob.ice.noise"; - } - - /** - * Returns the sound this mob makes when it is hurt. - */ - protected String getHurtSound() - { - return TwilightForestMod.ID + ":mob.ice.hurt"; - } - - /** - * Returns the sound this mob makes on death. - */ - protected String getDeathSound() - { - return TwilightForestMod.ID + ":mob.ice.death"; - } - - /** - * Returns the item ID for the item the mob drops on death. - */ - protected Item getDropItem() - { - return Items.snowball; - } - - /** - * Enchants the entity's armor and held item based on difficulty - */ - protected void enchantEquipment() - { - super.enchantEquipment(); - } - - public IEntityLivingData onSpawnWithEgg(IEntityLivingData par1EntityLivingData) - { - IEntityLivingData data = super.onSpawnWithEgg(par1EntityLivingData); - - return data; - - } - - /** - * Called frequently so the entity can update its state every tick as required. For example, zombies and skeletons - * use this to react to sunlight and start to burn. - */ - public void onLivingUpdate() - { - super.onLivingUpdate(); - // make snow particles - for (int i = 0; i < 3; i++) { - float px = (this.rand.nextFloat() - this.rand.nextFloat()) * 0.3F; - float py = this.getEyeHeight() + (this.rand.nextFloat() - this.rand.nextFloat()) * 0.5F; - float pz = (this.rand.nextFloat() - this.rand.nextFloat()) * 0.3F; - - TwilightForestMod.proxy.spawnParticle(this.worldObj, "snowguardian", this.lastTickPosX + px, this.lastTickPosY + py, this.lastTickPosZ + pz, 0, 0, 0); - } - - // during drop phase, all the ice blocks should make particles - if (this.getCurrentPhase() == Phase.DROP) { - for (int i = 0; i < this.iceArray.length; i++) { - float px = (this.rand.nextFloat() - this.rand.nextFloat()) * 0.5F; - float py = (this.rand.nextFloat() - this.rand.nextFloat()) * 0.5F; - float pz = (this.rand.nextFloat() - this.rand.nextFloat()) * 0.5F; - - TwilightForestMod.proxy.spawnParticle(this.worldObj, "snowwarning", this.iceArray[i].lastTickPosX + px, this.iceArray[i].lastTickPosY + py, this.iceArray[i].lastTickPosZ + pz, 0, 0, 0); - } - } - - // when ice beaming, spew particles - if (isBreathing() && this.isEntityAlive()) - { - Vec3 look = this.getLookVec(); - - double dist = 0.5; - double px = this.posX + look.xCoord * dist; - double py = this.posY + 1.7F + look.yCoord * dist; - double pz = this.posZ + look.zCoord * dist; - - for (int i = 0; i < 10; i++) - { - double dx = look.xCoord; - double dy = 0;//look.yCoord; - double dz = look.zCoord; - - double spread = 2 + this.getRNG().nextDouble() * 2.5; - double velocity = 2.0 + this.getRNG().nextDouble() * 0.15; - - // beeeam - dx += this.getRNG().nextGaussian() * 0.0075D * spread; - dy += this.getRNG().nextGaussian() * 0.0075D * spread; - dz += this.getRNG().nextGaussian() * 0.0075D * spread; - dx *= velocity; - dy *= velocity; - dz *= velocity; - - TwilightForestMod.proxy.spawnParticle(this.worldObj, "icebeam", px, py, pz, dx, dy, dz); - //worldObj.spawnParticle(getFlameParticle(), px, py, pz, dx, dy, dz); - } - - //playBreathSound(); - } - -// // am I in a block?!? -// int fx = MathHelper.floor_double(this.posX); -// int fy = MathHelper.floor_double(this.posY); -// int fz = MathHelper.floor_double(this.posZ); -// -// if (this.worldObj.getBlock(fx, fy, fz) != Blocks.air) { -// System.out.println("I am in a block! World =" + this.worldObj); -// this.posY += 1D; -// } - - } - - /** - * Keep ice shield position updated - */ - @Override - public void onUpdate() { - - super.onUpdate(); - - for (int i = 0; i < this.iceArray.length; i++) { - - this.iceArray[i].onUpdate(); - - if (i < this.iceArray.length - 1) { - // set block position - Vec3 blockPos = this.getIceShieldPosition(i); - - //System.out.println("Got position for block " + i + " and it is" + blockPos); - - this.iceArray[i].setPosition(blockPos.xCoord, blockPos.yCoord, blockPos.zCoord); - this.iceArray[i].rotationYaw = this.getIceShieldAngle(i); - } else { - // last block beneath - this.iceArray[i].setPosition(this.posX, this.posY - 1, this.posZ); - this.iceArray[i].rotationYaw = this.getIceShieldAngle(i); - } - - // collide things with the block - if (!worldObj.isRemote) { - this.applyShieldCollisions(this.iceArray[i]); - } - } - - // death animation - if (deathTime > 0) { - for(int k = 0; k < 5; k++) - { - double d = rand.nextGaussian() * 0.02D; - double d1 = rand.nextGaussian() * 0.02D; - double d2 = rand.nextGaussian() * 0.02D; - String explosionType = rand.nextBoolean() ? "hugeexplosion" : "explode"; - - worldObj.spawnParticle(explosionType, (posX + rand.nextFloat() * width * 2.0F) - width, posY + rand.nextFloat() * height, (posZ + rand.nextFloat() * width * 2.0F) - width, d, d1, d2); - } - } - } - - - @Override - protected void dropFewItems(boolean par1, int par2) { - dropBow(); - - // ice cubes - int totalDrops = this.rand.nextInt(4 + par2) + 1; - for (int i = 0; i < totalDrops; ++i) - { - this.dropItem(Item.getItemFromBlock(Blocks.packed_ice), 7); - } - - // snowballs - totalDrops = this.rand.nextInt(5 + par2) + 5; - for (int i = 0; i < totalDrops; ++i) - { - this.dropItem(Items.snowball, 16); - } - - // trophy - this.entityDropItem(new ItemStack(TFItems.trophy, 1, 4), 0); - } - - private void dropBow() { - int bowType = rand.nextInt(2); - if (bowType == 0) { - this.entityDropItem(new ItemStack(TFItems.tripleBow), 0); - } else { - this.entityDropItem(new ItemStack(TFItems.seekerBow), 0); - } - } - - /** - * Trigger achievement when killed - */ - @Override - public void onDeath(DamageSource par1DamageSource) { - super.onDeath(par1DamageSource); - if (par1DamageSource.getSourceOfDamage() instanceof EntityPlayer) { - ((EntityPlayer)par1DamageSource.getSourceOfDamage()).triggerAchievement(TFAchievementPage.twilightHunter); - ((EntityPlayer)par1DamageSource.getSourceOfDamage()).triggerAchievement(TFAchievementPage.twilightProgressGlacier); - - } - - // mark the tower as defeated - if (!worldObj.isRemote) { - int dx = MathHelper.floor_double(this.posX); - int dy = MathHelper.floor_double(this.posY); - int dz = MathHelper.floor_double(this.posZ); - - if (worldObj.provider instanceof WorldProviderTwilightForest){ - ChunkProviderTwilightForest chunkProvider = ((WorldProviderTwilightForest)worldObj.provider).getChunkProvider(); - TFFeature nearbyFeature = ((TFWorldChunkManager)worldObj.provider.worldChunkMgr).getFeatureAt(dx, dz, worldObj); - - if (nearbyFeature == TFFeature.lichTower) { - chunkProvider.setStructureConquered(dx, dy, dz, true); - } - } - } - } - - @SuppressWarnings("unchecked") - private void applyShieldCollisions(Entity collider) { - List list = this.worldObj.getEntitiesWithinAABBExcludingEntity(collider, collider.boundingBox.expand(-0.2F, -0.2F, -0.2F)); - - for (Entity collided : list) { - - if (collided.canBePushed()) { - applyShieldCollision(collider, collided); - } - } - } - - /** - * Do the effect where the shield hits something - */ - protected void applyShieldCollision(Entity collider, Entity collided) - { - if (collided != this) { - collided.applyEntityCollision(collider); - if (collided instanceof EntityLivingBase) { - //FMLLog.info("Spike ball collided with entity %s", collided); - - // do hit and throw - boolean attackSuccess = super.attackEntityAsMob(collided); - - if (attackSuccess) { - collided.motionY += 0.4000000059604645D; - this.playSound("mob.irongolem.throw", 1.0F, 1.0F); - - //System.out.println("Spike ball attack success"); - - } - - } - } - } - - - - protected void updateAITasks() { - super.updateAITasks(); - - // switch phases - if (this.getCurrentPhase() == Phase.SUMMON && this.getSummonsRemaining() == 0 && this.countMyMinions() <= 0) { - this.setCurrentPhase(Phase.DROP); - } - if (this.getCurrentPhase() == Phase.DROP && this.successfulDrops >= this.maxDrops) { - this.setCurrentPhase(Phase.BEAM); - } - if (this.getCurrentPhase() == Phase.BEAM && this.damageWhileBeaming >= MAX_DAMAGE_WHILE_BEAMING) { - this.setCurrentPhase(Phase.SUMMON); - } - } - - /** - * Called when we get attacked. - */ - @Override - public boolean attackEntityFrom(DamageSource par1DamageSource, float damage) { - boolean result = super.attackEntityFrom(par1DamageSource, damage); - - if (result && this.getCurrentPhase() == Phase.BEAM) { - this.damageWhileBeaming += damage; - } - - return result; - - } - - - private Vec3 getIceShieldPosition(int i) { - return this.getIceShieldPosition(getIceShieldAngle(i), 1F); - } - - - private float getIceShieldAngle(int i) { - //System.out.println("Getting angle for shield " + i + " and it is " + (((float)Math.PI / 3F) * (float)i)); - - - return 60F * i + (this.ticksExisted * 5F); - - } - - - /** - * Get the ice shield position - */ - public Vec3 getIceShieldPosition(float angle, float distance) - { - double var1 = Math.cos((angle) * Math.PI / 180.0D) * distance; - double var3 = Math.sin((angle) * Math.PI / 180.0D) * distance; - - return Vec3.createVectorHelper(this.posX + var1, this.posY + this.getShieldYOffset(), this.posZ + var3); - } - - - /** - * How high is the shield - */ - public double getShieldYOffset() - { - return 0.1F; - } - - /** - * Called when the mob is falling. Calculates and applies fall damage. - */ - @Override - protected void fall(float par1) { - ; // no falling - } - - - @Override - public World func_82194_d() { - return this.worldObj; - } - - @Override - public boolean attackEntityFromPart(EntityDragonPart entitydragonpart, DamageSource damagesource, float i) { - return false; - } - - - /** - * We need to do this for the bounding boxes on the parts to become active - */ - @Override - public Entity[] getParts() { - return iceArray; - } - - /** - * Destroys all ice related blocks in the AABB - */ - public boolean destroyBlocksInAABB(AxisAlignedBB par1AxisAlignedBB) { - //System.out.println("Destroying blocks in " + par1AxisAlignedBB); - - int minX = MathHelper.floor_double(par1AxisAlignedBB.minX); - int minY = MathHelper.floor_double(par1AxisAlignedBB.minY); - int minZ = MathHelper.floor_double(par1AxisAlignedBB.minZ); - int maxX = MathHelper.floor_double(par1AxisAlignedBB.maxX); - int maxY = MathHelper.floor_double(par1AxisAlignedBB.maxY); - int maxZ = MathHelper.floor_double(par1AxisAlignedBB.maxZ); - boolean wasBlocked = false; - for (int dx = minX; dx <= maxX; ++dx) { - for (int dy = minY; dy <= maxY; ++dy) { - for (int dz = minZ; dz <= maxZ; ++dz) { - Block block = this.worldObj.getBlock(dx, dy, dz); - - if (block != Blocks.air) { - int currentMeta = this.worldObj.getBlockMetadata(dx, dy, dz); - - if (block == Blocks.ice || block == Blocks.packed_ice) { - this.worldObj.setBlock(dx, dy, dz, Blocks.air, 0, 2); - - // here, this effect will have to do - worldObj.playAuxSFX(2001, dx, dy, dz, Block.getIdFromBlock(block) + (currentMeta << 12)); - } else { - wasBlocked = true; - } - } - } - } - } - - return wasBlocked; - } - - public boolean isBreathing() { - return this.getDataWatcher().getWatchableObjectByte(BEAM_FLAG) == 1; - - } - - public void setBreathing(boolean flag) { - this.getDataWatcher().updateObject(BEAM_FLAG, Byte.valueOf((byte)(flag ? 1 : 0))); - } - - - public Phase getCurrentPhase() { - return Phase.values()[this.getDataWatcher().getWatchableObjectByte(PHASE_FLAG)]; - } - - - public void setCurrentPhase(Phase currentPhase) { - this.getDataWatcher().updateObject(PHASE_FLAG, Byte.valueOf((byte) currentPhase.ordinal())); - - // set variables for current phase - if (currentPhase == Phase.SUMMON) { - this.setSummonsRemaining(MAX_SUMMONS); - } - if (currentPhase == Phase.DROP) { - this.successfulDrops = 0; - this.maxDrops = 2 + this.rand.nextInt(3); - } - if (currentPhase == Phase.BEAM) { - this.damageWhileBeaming = 0; - } - } - - - public int getSummonsRemaining() { - return summonsRemaining; - } - - - public void setSummonsRemaining(int summonsRemaining) { - this.summonsRemaining = summonsRemaining; - } - - public void summonMinionAt(EntityLivingBase targetedEntity) { - - // find a good spot - Vec3 minionSpot = findVecInLOSOf(targetedEntity); - - // put a minion there - EntityTFIceCrystal minion = new EntityTFIceCrystal(worldObj); - minion.setPosition(minionSpot.xCoord, minionSpot.yCoord, minionSpot.zCoord); - worldObj.spawnEntityInWorld(minion); - - minion.setAttackTarget(targetedEntity); - minion.setToDieIn30Seconds(); // don't stick around - - // reduce summons - this.summonsRemaining--; - } - - - /** - * Returns coords that would be good to teleport to. - * - * Returns null if we can't find anything - */ - protected Vec3 findVecInLOSOf(Entity targetEntity) - { - // for some reason we occasionally get null here - if (targetEntity == null) - { - return null; - } - - double tx = 0, ty = 0, tz = 0; - int tries = 100; - for (int i = 0; i < tries; i++) { - tx = targetEntity.posX + rand.nextGaussian() * 16D; - ty = targetEntity.posY + rand.nextGaussian() * 8D; - tz = targetEntity.posZ + rand.nextGaussian() * 16D; - - // put the y on something solid - boolean groundFlag = false; - // we need to get the integer coordinates for this calculation - int bx = MathHelper.floor_double(tx); - int by = MathHelper.floor_double(ty); - int bz = MathHelper.floor_double(tz); - while (!groundFlag && ty > 0) - { - Block whatsThere = worldObj.getBlock(bx, by - 1, bz); - if (whatsThere == Blocks.air || !whatsThere.getMaterial().isSolid()) - { - ty--; - by--; - } - else - { - groundFlag = true; - } - } - - // did we not find anything at all to stand on? - if (by == 0) { -// System.out.println("teleport find failed to find a block to stand on"); - continue; - } - - // - if (!canEntitySee(targetEntity, tx, ty, tz)) { -// System.out.println("teleport find failed because of lack of LOS"); -// System.out.println("ty = " + ty); - continue; - } - - // check that we're not colliding and not in liquid - float halfWidth = this.width / 2.0F; - AxisAlignedBB destBox = AxisAlignedBB.getBoundingBox(tx - halfWidth, ty - yOffset + ySize, tz - halfWidth, tx + halfWidth, ty - yOffset + ySize + height, tz + halfWidth); - if (worldObj.getCollidingBoundingBoxes(this, destBox).size() > 0) - { -// System.out.println("teleport find failed because of collision"); - continue; - } - - if (worldObj.isAnyLiquid(destBox)) { -// System.out.println("teleport find failed because of liquid at destination"); - continue; - } - - // if we made it this far, we win! - break; - } - - if (tries == 99) { - //System.out.println("Found no spots, giving up"); - return null; - } - - //System.out.println("I think we found a good destination at " + tx + ", " + ty + ", " + tz); -// System.out.println("canEntitySee = " + canEntitySee(targetEntity, tx, ty, tz)); - return Vec3.createVectorHelper(tx, ty, tz); - } - - /** - * Can the specified entity see the specified location? - */ - protected boolean canEntitySee(Entity entity, double dx, double dy, double dz) { - return worldObj.rayTraceBlocks(Vec3.createVectorHelper(entity.posX, entity.posY + (double)entity.getEyeHeight(), entity.posZ), Vec3.createVectorHelper(dx, dy, dz)) == null; - - } - - @SuppressWarnings("unchecked") - public int countMyMinions() { - // check if there are enough minions. we check a 32x16x32 area - List nearbyMinons = worldObj.getEntitiesWithinAABB(EntityTFIceCrystal.class, AxisAlignedBB.getBoundingBox(posX, posY, posZ, posX + 1, posY + 1, posZ + 1).expand(32.0D, 16.0D, 32.0D)); - - return nearbyMinons.size(); - } - - - public void incrementSuccessfulDrops() { - this.successfulDrops++; - } - - - @Override - public void doBreathAttack(Entity target) { - if (target.attackEntityFrom(DamageSource.causeMobDamage(this), BREATH_DAMAGE)) { - // slow target? - } - } - - -} diff --git a/src/main/java/twilightforest/entity/boss/EntityTFSnowQueenIceShield.java b/src/main/java/twilightforest/entity/boss/EntityTFSnowQueenIceShield.java deleted file mode 100644 index b10817a2bb..0000000000 --- a/src/main/java/twilightforest/entity/boss/EntityTFSnowQueenIceShield.java +++ /dev/null @@ -1,86 +0,0 @@ -package twilightforest.entity.boss; - -import net.minecraft.entity.Entity; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.DamageSource; -import net.minecraft.world.World; - -public class EntityTFSnowQueenIceShield extends Entity { - - EntityTFSnowQueen queen; - - public EntityTFSnowQueenIceShield(World par1World) { - super(par1World); - setSize(0.75F, 0.75F); - } - - public EntityTFSnowQueenIceShield(EntityTFSnowQueen goblin) { - this(goblin.func_82194_d()); - this.queen = goblin; - } - - /** - * Don't take damage from attacks - */ - @Override - public boolean attackEntityFrom(DamageSource par1DamageSource, float par2) { - this.worldObj.playSoundAtEntity(this, "random.break", 1.0F, ((this.rand.nextFloat() - this.rand.nextFloat()) * 0.7F + 1.0F) * 2.0F); - - return false; - } - - - /** - * Skip most of the living update things - */ - @Override - public void onUpdate() { - super.onUpdate(); - - this.ticksExisted++; - - lastTickPosX = posX; - lastTickPosY = posY; - lastTickPosZ = posZ; - - - //System.out.println("Updating " + this + " with angles " + rotationYawHead + ", " + rotationPitch); - - for (; rotationYaw - prevRotationYaw < -180F; prevRotationYaw -= 360F) { } - for (; rotationYaw - prevRotationYaw >= 180F; prevRotationYaw += 360F) { } - for (; rotationPitch - prevRotationPitch < -180F; prevRotationPitch -= 360F) { } - for (; rotationPitch - prevRotationPitch >= 180F; prevRotationPitch += 360F) { } - - } - - /** - * Returns true if other Entities should be prevented from moving through this Entity. - */ - public boolean canBeCollidedWith() - { - return true; - } - - /** - * Returns true if this entity should push and be pushed by other entities when colliding. - */ - public boolean canBePushed() - { - return false; - } - - public boolean isEntityEqual(Entity entity) - { - return this == entity || this.queen == entity; - } - - @Override - protected void entityInit() { } - - @Override - protected void readEntityFromNBT(NBTTagCompound nbttagcompound) { } - - @Override - protected void writeEntityToNBT(NBTTagCompound nbttagcompound) { } - -} diff --git a/src/main/java/twilightforest/entity/boss/EntityTFThrownAxe.java b/src/main/java/twilightforest/entity/boss/EntityTFThrownAxe.java deleted file mode 100644 index db0fc7ae81..0000000000 --- a/src/main/java/twilightforest/entity/boss/EntityTFThrownAxe.java +++ /dev/null @@ -1,87 +0,0 @@ -package twilightforest.entity.boss; - -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.projectile.EntityThrowable; -import net.minecraft.util.DamageSource; -import net.minecraft.util.MovingObjectPosition; -import net.minecraft.world.World; - -public class EntityTFThrownAxe extends EntityThrowable { - - private static final float PROJECTILE_DAMAGE = 6; - - public EntityTFThrownAxe(World par1World, EntityLivingBase par2EntityLivingBase) { - super(par1World, par2EntityLivingBase); - this.setSize(0.5F, 0.5F); - } - - public EntityTFThrownAxe(World par1World) { - super(par1World); - this.setSize(0.5F, 0.5F); - } - - - - @Override - protected void onImpact(MovingObjectPosition par1MovingObjectPosition) { - boolean passThru = false; - - if (par1MovingObjectPosition.entityHit != null) - { - if (par1MovingObjectPosition.entityHit instanceof EntityTFKnightPhantom) - { - passThru = true; - } - - // if we're not set to pass, damage what we hit - if (!passThru) - { - par1MovingObjectPosition.entityHit.attackEntityFrom(DamageSource.causeThrownDamage(this, this.getThrower()), PROJECTILE_DAMAGE); - } - } - - for (int i = 0; i < 8; ++i) - { - this.worldObj.spawnParticle("largesmoke", this.posX, this.posY, this.posZ, 0.0D, 0.0D, 0.0D); - } - - if (!passThru && !this.worldObj.isRemote) - { - this.setDead(); - } - } - - /** - * Returns true if other Entities should be prevented from moving through this Entity. - */ - @Override - public boolean canBeCollidedWith() - { - return true; - } - - /** - * We need to set this so that the player can attack and reflect the bolt - */ - @Override - public float getCollisionBorderSize() - { - return 1.0F; - } - - /** - * Projectile speed - */ - protected float func_70182_d() - { - return 0.1F; - } - - /** - * Gets the amount of gravity to apply to the thrown entity with each tick. - */ - protected float getGravityVelocity() - { - return 0.001F; - } -} diff --git a/src/main/java/twilightforest/entity/boss/EntityTFThrownPick.java b/src/main/java/twilightforest/entity/boss/EntityTFThrownPick.java deleted file mode 100644 index d3b6382cd0..0000000000 --- a/src/main/java/twilightforest/entity/boss/EntityTFThrownPick.java +++ /dev/null @@ -1,87 +0,0 @@ -package twilightforest.entity.boss; - -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.projectile.EntityThrowable; -import net.minecraft.util.DamageSource; -import net.minecraft.util.MovingObjectPosition; -import net.minecraft.world.World; - -public class EntityTFThrownPick extends EntityThrowable { - - private static final float PROJECTILE_DAMAGE = 3; - - public EntityTFThrownPick(World par1World, EntityLivingBase par2EntityLivingBase) { - super(par1World, par2EntityLivingBase); - this.setSize(0.5F, 0.5F); - } - - public EntityTFThrownPick(World par1World) { - super(par1World); - this.setSize(0.5F, 0.5F); - } - - - - @Override - protected void onImpact(MovingObjectPosition par1MovingObjectPosition) { - boolean passThru = false; - - if (par1MovingObjectPosition.entityHit != null) - { - if (par1MovingObjectPosition.entityHit instanceof EntityTFKnightPhantom) - { - passThru = true; - } - - // if we're not set to pass, damage what we hit - if (!passThru) - { - par1MovingObjectPosition.entityHit.attackEntityFrom(DamageSource.causeThrownDamage(this, this.getThrower()), PROJECTILE_DAMAGE); - } - } - - for (int i = 0; i < 8; ++i) - { - this.worldObj.spawnParticle("largesmoke", this.posX, this.posY, this.posZ, 0.0D, 0.0D, 0.0D); - } - - if (!passThru && !this.worldObj.isRemote) - { - this.setDead(); - } - } - - /** - * Returns true if other Entities should be prevented from moving through this Entity. - */ - @Override - public boolean canBeCollidedWith() - { - return true; - } - - /** - * We need to set this so that the player can attack and reflect the bolt - */ - @Override - public float getCollisionBorderSize() - { - return 1.0F; - } - - /** - * Projectile speed - */ - protected float func_70182_d() - { - return 1.0F; - } - - /** - * Gets the amount of gravity to apply to the thrown entity with each tick. - */ - protected float getGravityVelocity() - { - return 0.015F; - } -} diff --git a/src/main/java/twilightforest/entity/boss/EntityTFUrGhast.java b/src/main/java/twilightforest/entity/boss/EntityTFUrGhast.java deleted file mode 100644 index 0bba892f06..0000000000 --- a/src/main/java/twilightforest/entity/boss/EntityTFUrGhast.java +++ /dev/null @@ -1,911 +0,0 @@ -package twilightforest.entity.boss; - -import java.util.ArrayList; -import java.util.List; - -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.boss.IBossDisplayData; -import net.minecraft.entity.effect.EntityLightningBolt; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.server.MinecraftServer; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.ChunkCoordinates; -import net.minecraft.util.DamageSource; -import net.minecraft.util.MathHelper; -import net.minecraft.util.Vec3; -import net.minecraft.world.EnumDifficulty; -import net.minecraft.world.World; -import net.minecraft.world.storage.WorldInfo; -import twilightforest.TFAchievementPage; -import twilightforest.TFFeature; -import twilightforest.TFTreasure; -import twilightforest.TwilightForestMod; -import twilightforest.block.BlockTFTowerDevice; -import twilightforest.block.TFBlocks; -import twilightforest.entity.EntityTFMiniGhast; -import twilightforest.entity.EntityTFTowerGhast; -import twilightforest.world.ChunkProviderTwilightForest; -import twilightforest.world.TFWorldChunkManager; -import twilightforest.world.WorldProviderTwilightForest; -import cpw.mods.fml.common.FMLLog; - -public class EntityTFUrGhast extends EntityTFTowerGhast implements IBossDisplayData { - -// private static final int DATA_BOSSHEALTH = 17; - private static final int DATA_TANTRUM = 18; - - - //private static final int CRUISING_ALTITUDE = 235; // absolute cruising altitude - private static final int HOVER_ALTITUDE = 20; // how far, relatively, do we hover over ghast traps? - - - public double courseX; - public double courseY; - public double courseZ; - - ArrayList trapLocations; - ArrayList travelCoords; - - int currentTravelCoordIndex; - - int travelPathRepetitions; - int desiredRepetitions; - - int nextTantrumCry; - - float damageUntilNextPhase; // how much damage can we take before we toggle tantrum mode - - boolean noTrapMode; // are there no traps nearby? just float around - - public EntityTFUrGhast(World par1World) - { - super(par1World); - - this.setSize(14.0F, 18.0F); - this.aggroRange = 128.0F; - this.wanderFactor = 32.0F; - - //this.texture = TwilightForestMod.MODEL_DIR + "towerboss.png"; - - - this.noClip = true; - - this.trapLocations = new ArrayList(); - this.travelCoords = new ArrayList(); - - this.setInTantrum(false); - - this.damageUntilNextPhase = 45; - - this.experienceValue = 317; - - this.noTrapMode = false; - - } - -// public int getMaxHealth() -// { -// return 250; -// } - - /** - * Set monster attributes - */ - @Override - protected void applyEntityAttributes() - { - super.applyEntityAttributes(); - this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(250); // max health - } - - @Override - protected void entityInit() - { - super.entityInit(); -// this.dataWatcher.addObject(DATA_BOSSHEALTH, new Integer(this.getMaxHealth())); - this.dataWatcher.addObject(DATA_TANTRUM, Byte.valueOf((byte) 0)); - } - - /** - * Determines if an entity can be despawned, used on idle far away entities - */ - @Override - protected boolean canDespawn() - { - return false; - } - - /** - * Keep health updated - */ - @Override - public void onUpdate() { - - super.onUpdate(); - - // extra death explosions - if (deathTime > 0) { - for(int k = 0; k < 5; k++) - { - double d = rand.nextGaussian() * 0.02D; - double d1 = rand.nextGaussian() * 0.02D; - double d2 = rand.nextGaussian() * 0.02D; - String explosionType = rand.nextBoolean() ? "hugeexplosion" : "explode"; - - worldObj.spawnParticle(explosionType, (posX + rand.nextFloat() * width * 2.0F) - width, posY + rand.nextFloat() * height, (posZ + rand.nextFloat() * width * 2.0F) - width, d, d1, d2); - } - } - } - - /** - * Called when the entity is attacked. - */ - public boolean attackEntityFrom(DamageSource source, float damage) - { - // ignore suffocation - if (source == DamageSource.inWall) - { - return false; - } - - boolean attackSuccessful = false; - - // in tantrum mode take only 1/4 damage - if (this.isInTantrum()) - { - damage /= 4; - } - - if ("fireball".equals(source.getDamageType()) && source.getEntity() instanceof EntityPlayer) - { - // 'hide' fireball attacks so that we don't take 1000 damage. - attackSuccessful = super.attackEntityFrom(DamageSource.causeThrownDamage(source.getSourceOfDamage(), source.getEntity()), damage); - } - else - { - attackSuccessful = super.attackEntityFrom(source, damage); - } - - if (!worldObj.isRemote) - { - if (this.hurtTime == this.maxHurtTime) - { - this.damageUntilNextPhase -= this.getLastDamage(); - - FMLLog.info("[Urghast] Attack successful, %f damage until phase switch.", this.damageUntilNextPhase); - - if (this.damageUntilNextPhase <= 0) - { - this.switchPhase(); - } - } - else - { - FMLLog.info("[Urghast] Attack fail with %s type attack for %f damage", source.damageType, damage); - } - } - - return attackSuccessful; - } - - private float getLastDamage() { - - - return this.prevHealth - this.getHealth(); - } - - /** - * Move to the next phase of our behavior - */ - private void switchPhase() { - if (this.isInTantrum()) { - this.stopTantrum(); - } else { - this.startTantrum(); - } - - this.damageUntilNextPhase = 48; - } - - /** - * Start throwing a tantrum - */ - protected void startTantrum() { - this.setInTantrum(true); - - // start raining - int rainTime = 300 * 20; - - WorldInfo worldInfo = MinecraftServer.getServer().worldServers[0].getWorldInfo(); - - //System.out.println("Starting rain and thunder. world = " + worldObj); - - worldInfo.setRaining(true); - worldInfo.setThundering(true); - worldInfo.setRainTime(rainTime); - worldInfo.setThunderTime(rainTime); - - spawnGhastsAtTraps(); - } - - /** - * Spawn ghasts at two of the traps - */ - protected void spawnGhastsAtTraps() { - // spawn ghasts around two of the traps - ArrayList ghastSpawns = new ArrayList(this.trapLocations); - - int numSpawns = Math.min(2, ghastSpawns.size()); - - for (int i = 0; i < numSpawns; i++) - { - int index = this.rand.nextInt(ghastSpawns.size()); - - ChunkCoordinates spawnCoord = ghastSpawns.get(index); - ghastSpawns.remove(index); - - spawnMinionGhastsAt(spawnCoord.posX, spawnCoord.posY, spawnCoord.posZ); - } - } - - public void stopTantrum() - { - this.setInTantrum(false); - - } - - /** - * Spawn up to 6 minon ghasts around the indicated area - */ - private void spawnMinionGhastsAt(int x, int y, int z) { - int tries = 24; - int spawns = 0; - int maxSpawns = 6; - - int rangeXZ = 4; - int rangeY = 8; - - //System.out.printf("Spawning minions near %d, %d, %d.\n", x, y, z); - - // lightning strike - this.worldObj.addWeatherEffect(new EntityLightningBolt(worldObj, x, y + 4, z)); - - - for (int i = 0; i < tries; i++) - { - EntityTFMiniGhast minion = new EntityTFMiniGhast(worldObj); - - double sx = x + ((rand.nextDouble() - rand.nextDouble()) * rangeXZ); - double sy = y + (rand.nextDouble() * rangeY); - double sz = z + ((rand.nextDouble() - rand.nextDouble()) * rangeXZ); - - minion.setLocationAndAngles(sx, sy, sz, this.worldObj.rand.nextFloat() * 360.0F, 0.0F); - minion.makeBossMinion(); - - if (minion.getCanSpawnHere()) - { - //System.out.println("Spawned minion!"); - - this.worldObj.spawnEntityInWorld(minion); - minion.spawnExplosionParticle(); - } - else - { - //System.out.println("Minion can't spawn!"); - } - - // limit the total number of successful spawns - if (++spawns >= maxSpawns) - { - //System.out.println("Spawned maxiumum minions."); - break; - } - } - - } - - /** - * Altered Ghast AI - */ - @SuppressWarnings("unchecked") - protected void updateEntityActionState() - { - if (!this.worldObj.isRemote && this.worldObj.difficultySetting == EnumDifficulty.PEACEFUL) - { - this.setDead(); - } - - this.despawnEntity(); - - // despawn mini ghasts that are in our AABB - List nearbyGhasts = worldObj.getEntitiesWithinAABB(EntityTFMiniGhast.class, this.boundingBox.expand(1, 1, 1)); - for (EntityTFMiniGhast ghast : nearbyGhasts) - { - ghast.setDead(); - this.heal(2); - } - - - // trap locations? - if (this.trapLocations.isEmpty() && !this.noTrapMode) - { - //System.out.println("Tower boss scannning for traps."); - - this.scanForTrapsTwice(); - - //System.out.println("Traps found: " + this.trapLocations.size()); - } - - // did we find any traps? - if (this.trapLocations.isEmpty() && !this.noTrapMode) - { - FMLLog.info("[TwilightForest] Ur-ghast cannot find traps nearby, entering trap-less mode"); - this.noTrapMode = true; - } - - // check if in trap - if (this.inTrapCounter > 0) - { - this.inTrapCounter--; - this.targetedEntity = null; - return; // do nothing if in trap; - } - - this.prevAttackCounter = this.attackCounter; - - // target - if (this.targetedEntity != null && this.targetedEntity.isDead) - { - this.targetedEntity = null; - } - - if (this.targetedEntity == null) - { - this.targetedEntity = findPlayerInRange(); - } - else if (!this.isAggressive && this.targetedEntity instanceof EntityPlayer) - { - checkToIncreaseAggro((EntityPlayer) this.targetedEntity); - } - - - // tantrum? - if (this.isInTantrum()) - { - shedTear(); - - this.targetedEntity = null; - - // cry? - if (--this.nextTantrumCry <= 0) - { - this.playSound(getHurtSound(), this.getSoundVolume(), this.getSoundPitch()); - this.nextTantrumCry = 20 + rand.nextInt(30); - } - - if (this.ticksExisted % 10 == 0) - { - doTantrumDamageEffects(); - } - - } - - - // do this - checkAndChangeCourse(); - - - // check if we are at our waypoint target - double offsetX = this.waypointX - this.posX; - double offsetY = this.waypointY - this.posY; - double offsetZ = this.waypointZ - this.posZ; - double distanceToWaypoint = offsetX * offsetX + offsetY * offsetY + offsetZ * offsetZ; - - if (distanceToWaypoint < 1.0D || distanceToWaypoint > 3600.0D) - { - makeNewWaypoint(); - } - - - - // move? - if (this.courseChangeCooldown-- <= 0) - { - this.courseChangeCooldown += this.rand.nextInt(5) + 0; - distanceToWaypoint = (double)MathHelper.sqrt_double(distanceToWaypoint); - - double speed = 0.05D; - this.motionX += offsetX / distanceToWaypoint * speed; - this.motionY += offsetY / distanceToWaypoint * speed; - this.motionZ += offsetZ / distanceToWaypoint * speed; - } - - // check if our target is still within range - double targetRange = (this.aggroCounter > 0 || this.isAggressive) ? aggroRange : stareRange; - - if (this.targetedEntity != null && this.targetedEntity.getDistanceSqToEntity(this) < targetRange * targetRange && this.canEntityBeSeen(this.targetedEntity)) - { - // turn towards target - this.faceEntity(this.targetedEntity, 10F, this.getVerticalFaceSpeed()); - - // attack if aggressive - if (this.isAggressive) - { - if (this.attackCounter == 10) - { - //this.worldObj.playAuxSFXAtEntity((EntityPlayer)null, 1007, (int)this.posX, (int)this.posY, (int)this.posZ, 0); - this.playSound("mob.ghast.charge", this.getSoundVolume(), this.getSoundPitch()); - } - - ++this.attackCounter; - - if (this.attackCounter == 20) - { - spitFireball(); - this.attackCounter = -40; - } - } - } - else - { - // ignore player, move normally - this.isAggressive = false; - this.targetedEntity = null; - this.rotationYaw = -((float)Math.atan2(this.motionX, this.motionZ)) * 180.0F / (float)Math.PI; - - // changing the pitch with movement looks goofy and un-ghast-like - //double dist = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ); - this.rotationPitch = 0;//(float) (-((Math.atan2(this.motionY, dist) * 180D) / Math.PI));; - - } - - if (this.attackCounter > 0 && !this.isAggressive) - { - --this.attackCounter; - } - - // set aggro status - byte currentAggroStatus = this.dataWatcher.getWatchableObjectByte(16); - byte newAggroStatus = (byte)(this.attackCounter > 10 ? 2 : (this.aggroCounter > 0 || this.isAggressive) ? 1 : 0); - - if (currentAggroStatus != newAggroStatus) - { - this.dataWatcher.updateObject(16, Byte.valueOf(newAggroStatus)); - } - } - - @SuppressWarnings("unchecked") - private void doTantrumDamageEffects() { - // harm player below - AxisAlignedBB below = this.boundingBox.getOffsetBoundingBox(0, -16, 0).expand(0, 16, 0); - - List playersBelow = worldObj.getEntitiesWithinAABB(EntityPlayer.class, below); - - for (EntityPlayer player : playersBelow) - { - int dx = MathHelper.floor_double(player.posX); - int dy = MathHelper.floor_double(player.posY); - int dz = MathHelper.floor_double(player.posZ); - - if (worldObj.canBlockSeeTheSky(dx, dy, dz)) - { - player.attackEntityFrom(DamageSource.anvil, 3); - } - } - - // also suck up mini ghasts - List ghastsBelow = worldObj.getEntitiesWithinAABB(EntityTFMiniGhast.class, below); - - for (EntityTFMiniGhast ghast : ghastsBelow) - { - ghast.motionY += 1; - } - } - - /** - * Make a tear particle fall off the ghast - */ - private void shedTear() - { - TwilightForestMod.proxy.spawnParticle(this.worldObj, "bosstear", this.posX + (this.rand.nextDouble() - 0.5D) * (double)this.width, this.posY + this.rand.nextDouble() * (double)this.height - 0.25D, this.posZ + (this.rand.nextDouble() - 0.5D) * (double)this.width, 0, 0, 0); - } - - /** - * Waypoints should be closer to our course than we are now. Try 50 times and take the closest - */ - protected void makeNewWaypoint() - { - - double closestDistance = this.getDistanceSq(this.courseX, this.courseY, this.courseZ); - - for (int i = 0; i < 50; i++) - { - double potentialX = this.posX + (double)((this.rand.nextFloat() * 2.0F - 1.0F) * wanderFactor); - double potentialY = this.courseY + this.rand.nextFloat() * 8.0F - 4.0F; - double potentialZ = this.posZ + (double)((this.rand.nextFloat() * 2.0F - 1.0F) * wanderFactor); - - double offsetX = this.courseX - potentialX; - double offsetY = this.courseY - potentialY; - double offsetZ = this.courseZ - potentialZ; - - double potentialDistanceToCourse = offsetX * offsetX + offsetY * offsetY + offsetZ * offsetZ; - - if (potentialDistanceToCourse < closestDistance) - { - this.waypointX = potentialX; - this.waypointY = potentialY; - this.waypointZ = potentialZ; - - closestDistance = potentialDistanceToCourse; - } - } - - - } - - protected void checkAndChangeCourse() { - // check course. - if (courseX == 0 && courseY == 0 && courseZ == 0) - { - changeCourse(); - } - - double offsetX = this.courseX - this.posX; - double offsetY = this.courseY - this.posY; - double offsetZ = this.courseZ - this.posZ; - double distanceToCourse = offsetX * offsetX + offsetY * offsetY + offsetZ * offsetZ; - - if (distanceToCourse < 100.0D) - { - changeCourse(); - } - } - - - /** - * Change to a new course target - */ - private void changeCourse() { - //System.out.println("Boss changing course"); - - if (this.travelCoords.isEmpty()) - { - //System.out.println("Boss travel coords is empty, making a new list"); - makeTravelPath(); - } - - if (!this.travelCoords.isEmpty()) - { - if (this.currentTravelCoordIndex >= travelCoords.size()) - { - this.currentTravelCoordIndex = 0; - this.travelPathRepetitions++; - - //System.out.println("Tower boss has repeated path " + travelPathRepetitions + " times."); - - // when we're in tantrum mode, this is a good time to check if we need to spawn more ghasts - if (!checkGhastsAtTraps()) - { - this.spawnGhastsAtTraps(); - } - } - - this.courseX = travelCoords.get(currentTravelCoordIndex).posX; - this.courseY = travelCoords.get(currentTravelCoordIndex).posY + HOVER_ALTITUDE; - this.courseZ = travelCoords.get(currentTravelCoordIndex).posZ; - - this.currentTravelCoordIndex++; - } - - - } - - /** - * Check if there are at least 4 ghasts near at least 2 traps. Return false if not. - */ - @SuppressWarnings("unchecked") - private boolean checkGhastsAtTraps() { - int trapsWithEnoughGhasts = 0; - - for (ChunkCoordinates trap : this.trapLocations) - { - AxisAlignedBB aabb = AxisAlignedBB.getBoundingBox(trap.posX, trap.posY, trap.posZ, trap.posX + 1, trap.posY + 1, trap.posZ + 1).expand(8D, 16D, 8D); - - List nearbyGhasts = worldObj.getEntitiesWithinAABB(EntityTFMiniGhast.class, aabb); - - //System.out.println("Checking for ghasts. There are " + nearbyGhasts.size() + " ghasts near this trap."); - - - if (nearbyGhasts.size() >= 4) - { - trapsWithEnoughGhasts++; - } - } - - //System.out.println("Checking traps for ghasts. There are " + trapsWithEnoughGhasts + " traps with enough ghasts."); - - return trapsWithEnoughGhasts >= 1; - - } - - private void makeTravelPath() - { - ArrayList potentialPoints; - - int px = MathHelper.floor_double(this.posX); - int py = MathHelper.floor_double(this.posY); - int pz = MathHelper.floor_double(this.posZ); - - if (!this.noTrapMode) - { - // make a copy of the trap locations list - potentialPoints = new ArrayList(this.trapLocations); - } - else - { - potentialPoints = new ArrayList(); - potentialPoints.add(new ChunkCoordinates(px + 20, py - HOVER_ALTITUDE, pz)); - potentialPoints.add(new ChunkCoordinates(px, py - HOVER_ALTITUDE, pz - 20)); - potentialPoints.add(new ChunkCoordinates(px - 20, py - HOVER_ALTITUDE, pz)); - potentialPoints.add(new ChunkCoordinates(px, py - HOVER_ALTITUDE, pz + 20)); - - //System.out.println("Adding fake points to the potentials list"); - } - - // put the potential points on our travel coords list in random order - travelCoords.clear(); - - while (!potentialPoints.isEmpty()) - { - int index = rand.nextInt(potentialPoints.size()); - - travelCoords.add(potentialPoints.get(index)); - - potentialPoints.remove(index); - } - - if (this.noTrapMode) - { - // if in no trap mode, head back to the middle when we're done - travelCoords.add(new ChunkCoordinates(px, py - HOVER_ALTITUDE, pz)); - } - } - - /** - * Spit a fireball - */ - protected void spitFireball() { - double offsetX = this.targetedEntity.posX - this.posX; - double offsetY = this.targetedEntity.boundingBox.minY + (double)(this.targetedEntity.height / 2.0F) - (this.posY + (double)(this.height / 2.0F)); - double offsetZ = this.targetedEntity.posZ - this.posZ; - - // fireball sound effect - this.worldObj.playAuxSFXAtEntity((EntityPlayer)null, 1008, (int)this.posX, (int)this.posY, (int)this.posZ, 0); - - EntityTFUrGhastFireball entityFireball = new EntityTFUrGhastFireball(this.worldObj, this, offsetX, offsetY, offsetZ); - entityFireball.field_92057_e = 1; - double shotSpawnDistance = 8.5D; - Vec3 lookVec = this.getLook(1.0F); - entityFireball.posX = this.posX + lookVec.xCoord * shotSpawnDistance; - entityFireball.posY = this.posY + (double)(this.height / 2.0F) + lookVec.yCoord * shotSpawnDistance; - entityFireball.posZ = this.posZ + lookVec.zCoord * shotSpawnDistance; - this.worldObj.spawnEntityInWorld(entityFireball); - - for (int i = 0; i < 2; i++) - { - entityFireball = new EntityTFUrGhastFireball(this.worldObj, this, offsetX + (rand.nextFloat() - rand.nextFloat()) * 8, offsetY, offsetZ + (rand.nextFloat() - rand.nextFloat()) * 8); - entityFireball.field_92057_e = 1; - entityFireball.posX = this.posX + lookVec.xCoord * shotSpawnDistance; - entityFireball.posY = this.posY + (double)(this.height / 2.0F) + lookVec.yCoord * shotSpawnDistance; - entityFireball.posZ = this.posZ + lookVec.zCoord * shotSpawnDistance; - this.worldObj.spawnEntityInWorld(entityFireball); - } - - } - - /** - * Scan a few chunks around us for ghast trap blocks and if we find any, add them to our list - */ - private void scanForTrapsTwice() - { - int scanRangeXZ = 48; - int scanRangeY = 32; - - int px = MathHelper.floor_double(this.posX); - int py = MathHelper.floor_double(this.posY); - int pz = MathHelper.floor_double(this.posZ); - - scanForTraps(scanRangeXZ, scanRangeY, px, py, pz); - - if (trapLocations.size() > 0) - { - // average the location of the traps we've found, and scan again from there - int ax = 0, ay = 0, az = 0; - - for(ChunkCoordinates trapCoords : trapLocations) - { - ax += trapCoords.posX; - ay += trapCoords.posY; - az += trapCoords.posZ; - } - - ax /= trapLocations.size(); - ay /= trapLocations.size(); - az /= trapLocations.size(); - - scanForTraps(scanRangeXZ, scanRangeY, ax, ay, az); - } - } - - /** - * Scan in the specified range for traps - */ - protected void scanForTraps(int scanRangeXZ, int scanRangeY, int px, int py, int pz) { - for (int sx = -scanRangeXZ; sx <= scanRangeXZ; sx++) { - for (int sz = -scanRangeXZ; sz <= scanRangeXZ; sz++) { - for (int sy = -scanRangeY; sy <= scanRangeY; sy++) { - if (isTrapAt(px + sx, py + sy, pz + sz)) { - // add to list - ChunkCoordinates trapCoords = new ChunkCoordinates(px + sx, py + sy, pz + sz); - if (!trapLocations.contains(trapCoords)) - { - trapLocations.add(trapCoords); - } - } - } - } - } - } - - private boolean isTrapAt(int x, int y, int z) - { - return worldObj.blockExists(x, y, z) - && worldObj.getBlock(x, y, z) == TFBlocks.towerDevice - && (worldObj.getBlockMetadata(x, y, z) == BlockTFTowerDevice.META_GHASTTRAP_INACTIVE || worldObj.getBlockMetadata(x, y, z) == BlockTFTowerDevice.META_GHASTTRAP_ACTIVE); - } - - /** - * Returns true if the entity is on fire. Used by render to add the fire effect on rendering. - */ - @Override - public boolean isBurning() - { - // never burn - return false; - } - - /** - * No point in ever being pushed - */ - @Override - public boolean canBePushed() { - return false; - } - - /** - * Are we throwing a tantrum? - */ - public boolean isInTantrum() - { - return this.dataWatcher.getWatchableObjectByte(DATA_TANTRUM) != (byte)0; - } - - /** - * Sets whether we are throwing a tantrum - */ - public void setInTantrum(boolean par1) - { - this.dataWatcher.updateObject(DATA_TANTRUM, par1 ? Byte.valueOf((byte)-1) : Byte.valueOf((byte)0)); - - // can we just reset this each time it is called? - this.damageUntilNextPhase = 48; - } - - /** - * Returns the volume for the sounds this mob makes. - */ - protected float getSoundVolume() - { - return 16F; - } - - /** - * Gets the pitch of living sounds in living entities. - */ - protected float getSoundPitch() - { - return (this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F + 0.5F; - } - - /** - * Needed for boss health bar on the client - */ -// @Override -// public int getBossHealth() { -// return this.dataWatcher.getWatchableObjectInt(DATA_BOSSHEALTH); -// } - - @Override - public void writeEntityToNBT(NBTTagCompound nbttagcompound) - { - nbttagcompound.setBoolean("inTantrum", this.isInTantrum()); - super.writeEntityToNBT(nbttagcompound); - } - - @Override - public void readEntityFromNBT(NBTTagCompound nbttagcompound) - { - super.readEntityFromNBT(nbttagcompound); - this.setInTantrum(nbttagcompound.getBoolean("inTantrum")); - } - - /** - * handles entity death timer, experience orb and particle creation - */ - protected void onDeathUpdate() - { - super.onDeathUpdate(); - - if (this.deathTime == 20 && !worldObj.isRemote) - { - // make chest - ChunkCoordinates chestCoords = this.findChestCoords(); - TFTreasure.darktower_boss.generate(worldObj, null, chestCoords.posX, chestCoords.posY, chestCoords.posZ); - } - } - - /** - * Trigger achievement when killed - */ - @Override - public void onDeath(DamageSource par1DamageSource) { - super.onDeath(par1DamageSource); - if (par1DamageSource.getSourceOfDamage() instanceof EntityPlayer) { - ((EntityPlayer)par1DamageSource.getSourceOfDamage()).triggerAchievement(TFAchievementPage.twilightHunter); - ((EntityPlayer)par1DamageSource.getSourceOfDamage()).triggerAchievement(TFAchievementPage.twilightProgressUrghast); - - } - - // mark the tower as defeated - if (!worldObj.isRemote && worldObj.provider instanceof WorldProviderTwilightForest) { - ChunkCoordinates chestCoords = this.findChestCoords(); - int dx = chestCoords.posX; - int dy = chestCoords.posY; - int dz = chestCoords.posZ; - - ChunkProviderTwilightForest chunkProvider = ((WorldProviderTwilightForest)worldObj.provider).getChunkProvider(); - TFFeature nearbyFeature = ((TFWorldChunkManager)worldObj.provider.worldChunkMgr).getFeatureAt(dx, dz, worldObj); - - if (nearbyFeature == TFFeature.darkTower) { - chunkProvider.setStructureConquered(dx, dy, dz, true); - } - } - } - - private ChunkCoordinates findChestCoords() { - if (trapLocations.size() > 0) - { - // average the location of the traps we've found, and scan again from there - int ax = 0, ay = 0, az = 0; - - for(ChunkCoordinates trapCoords : trapLocations) - { - ax += trapCoords.posX; - ay += trapCoords.posY; - az += trapCoords.posZ; - } - - ax /= trapLocations.size(); - ay /= trapLocations.size(); - az /= trapLocations.size(); - - - return new ChunkCoordinates(ax, ay + 2, az); - } - else - { - return new ChunkCoordinates(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.posY), MathHelper.floor_double(this.posZ)); - } - } -} diff --git a/src/main/java/twilightforest/entity/boss/EntityTFUrGhastFireball.java b/src/main/java/twilightforest/entity/boss/EntityTFUrGhastFireball.java deleted file mode 100644 index 8bca4dedb7..0000000000 --- a/src/main/java/twilightforest/entity/boss/EntityTFUrGhastFireball.java +++ /dev/null @@ -1,34 +0,0 @@ -package twilightforest.entity.boss; - -import net.minecraft.entity.Entity; -import net.minecraft.entity.projectile.EntityFireball; -import net.minecraft.entity.projectile.EntityLargeFireball; -import net.minecraft.util.DamageSource; -import net.minecraft.util.MovingObjectPosition; -import net.minecraft.world.World; - -public class EntityTFUrGhastFireball extends EntityLargeFireball { - - public EntityTFUrGhastFireball(World worldObj, EntityTFUrGhast entityTFTowerBoss, double x, double y, double z) - { - super(worldObj, entityTFTowerBoss, x, y, z); - } - - - /** - * Called when this EntityFireball hits a block or entity. - */ - protected void onImpact(MovingObjectPosition par1MovingObjectPosition) - { - if (!this.worldObj.isRemote && !(par1MovingObjectPosition.entityHit instanceof EntityFireball)) - { - if (par1MovingObjectPosition.entityHit != null) - { - par1MovingObjectPosition.entityHit.attackEntityFrom(DamageSource.causeFireballDamage(this, this.shootingEntity), 16); - } - - this.worldObj.newExplosion((Entity)null, this.posX, this.posY, this.posZ, (float)this.field_92057_e, true, this.worldObj.getGameRules().getGameRuleBooleanValue("mobGriefing")); - this.setDead(); - } - } -} diff --git a/src/main/java/twilightforest/entity/boss/EntityTFYetiAlpha.java b/src/main/java/twilightforest/entity/boss/EntityTFYetiAlpha.java deleted file mode 100644 index 875546d1ef..0000000000 --- a/src/main/java/twilightforest/entity/boss/EntityTFYetiAlpha.java +++ /dev/null @@ -1,599 +0,0 @@ -package twilightforest.entity.boss; - -import java.util.ArrayList; - -import net.minecraft.block.Block; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.IRangedAttackMob; -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.ai.EntityAIArrowAttack; -import net.minecraft.entity.ai.EntityAIHurtByTarget; -import net.minecraft.entity.ai.EntityAILookIdle; -import net.minecraft.entity.ai.EntityAINearestAttackableTarget; -import net.minecraft.entity.ai.EntityAIWander; -import net.minecraft.entity.ai.EntityAIWatchClosest; -import net.minecraft.entity.monster.EntityMob; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.item.Item; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.nbt.NBTTagList; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.ChunkCoordinates; -import net.minecraft.util.DamageSource; -import net.minecraft.util.MathHelper; -import net.minecraft.util.Vec3; -import net.minecraft.world.World; -import twilightforest.TFAchievementPage; -import twilightforest.TFFeature; -import twilightforest.TwilightForestMod; -import twilightforest.entity.ai.EntityAIStayNearHome; -import twilightforest.entity.ai.EntityAITFThrowRider; -import twilightforest.entity.ai.EntityAITFYetiRampage; -import twilightforest.entity.ai.EntityAITFYetiTired; -import twilightforest.item.TFItems; -import twilightforest.world.ChunkProviderTwilightForest; -import twilightforest.world.TFWorldChunkManager; -import twilightforest.world.WorldProviderTwilightForest; - -public class EntityTFYetiAlpha extends EntityMob implements IRangedAttackMob -{ - - - private static final int RAMPAGE_FLAG = 16; - private static final int TIRED_FLAG = 17; - private int collisionCounter; - private boolean canRampage; - - - - public EntityTFYetiAlpha(World par1World) - { - super(par1World); - this.setSize(3.8F, 5.0F); - - - this.getNavigator().setAvoidsWater(true); - this.tasks.addTask(1, new EntityAITFYetiTired(this, 100)); - this.tasks.addTask(2, new EntityAITFThrowRider(this, 1.0F)); - this.tasks.addTask(3, new EntityAIStayNearHome(this, 2.0F)); - this.tasks.addTask(4, new EntityAITFYetiRampage(this, 10, 180)); - - this.tasks.addTask(5, new EntityAIArrowAttack(this, 1.0D, 40, 40, 40.0F)); - this.tasks.addTask(6, new EntityAIWander(this, 2.0F)); - this.tasks.addTask(7, new EntityAIWatchClosest(this, EntityPlayer.class, 8.0F)); - this.tasks.addTask(8, new EntityAILookIdle(this)); - this.targetTasks.addTask(1, new EntityAIHurtByTarget(this, false)); - this.targetTasks.addTask(2, new EntityAINearestAttackableTarget(this, EntityPlayer.class, 0, false)); - - this.experienceValue = 317; - - } - - - /** - * Returns true if the newer Entity AI code should be run - */ - @Override - protected boolean isAIEnabled() - { - return true; - } - - - protected void entityInit() - { - super.entityInit(); - this.dataWatcher.addObject(RAMPAGE_FLAG, Byte.valueOf((byte)0)); - this.dataWatcher.addObject(TIRED_FLAG, Byte.valueOf((byte)0)); - } - - /** - * Set monster attributes - */ - @Override - protected void applyEntityAttributes() - { - super.applyEntityAttributes(); - this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(200.0D); // max health - this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.38D); // movement speed - this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(1.0D); - this.getEntityAttribute(SharedMonsterAttributes.followRange).setBaseValue(40.0D); - } - - /** - * Called frequently so the entity can update its state every tick as required. For example, zombies and skeletons - * use this to react to sunlight and start to burn. - */ - @Override - public void onLivingUpdate() - { - if (this.riddenByEntity != null) - { - - // stop player sneaking so that they can't dismount! - if (this.riddenByEntity.isSneaking()) - { - //System.out.println("Pinch beetle sneaking detected!"); - - this.riddenByEntity.setSneaking(false); - } - } - else - { - - } - - super.onLivingUpdate(); - - // look at things we are holding - if (this.riddenByEntity != null) - { - this.getLookHelper().setLookPositionWithEntity(riddenByEntity, 100F, 100F); - } - - if (this.isCollided) { - this.collisionCounter++; - } - - if (this.collisionCounter >= 15) { - if (!this.worldObj.isRemote) { - this.destroyBlocksInAABB(this.boundingBox); - } - this.collisionCounter = 0; - } - - // add rampage snow effects - if (this.isRampaging()) { - - float rotation = this.ticksExisted / 10F; - - - for (int i = 0; i < 20; i++) { - addSnowEffect(rotation + (i * 50), i + rotation); - } - - // also swing limbs - this.limbSwingAmount += 0.6; - } - - //when tired, spawn tears/sweat - if (this.isTired()) - { - for (int i = 0; i < 20; i++) - { - this.worldObj.spawnParticle("splash", this.posX + (this.rand.nextDouble() - 0.5D) * this.width * 0.5, this.posY + this.getEyeHeight(), this.posZ + (this.rand.nextDouble() - 0.5D) * this.width * 0.5, (rand.nextFloat() - 0.5F) * 0.75F, 0, (rand.nextFloat() - 0.5F) * 0.75F); - } - } - - } - - - private void addSnowEffect(float rotation, float hgt) { - double px = 3F * Math.cos(rotation); - double py = hgt % 5F; - double pz = 3F * Math.sin(rotation); - - TwilightForestMod.proxy.spawnParticle(this.worldObj, "snowstuff", this.lastTickPosX + px, this.lastTickPosY + py, this.lastTickPosZ + pz, 0, 0, 0); - } - - - /** - * Called when a player interacts with a mob. e.g. gets milk from a cow, gets into the saddle on a pig. - */ - @Override - public boolean interact(EntityPlayer par1EntityPlayer) - { - if (super.interact(par1EntityPlayer)) - { - return true; - } - else if (!this.worldObj.isRemote && (this.riddenByEntity == null || this.riddenByEntity == par1EntityPlayer)) - { - par1EntityPlayer.mountEntity(this); - return true; - } - else - { - return false; - } - } - - /** - * Pick up things we attack! - */ - @Override - public boolean attackEntityAsMob(Entity par1Entity) - { - if (this.riddenByEntity == null && par1Entity.ridingEntity == null) - { - par1Entity.mountEntity(this); - } - - return super.attackEntityAsMob(par1Entity); - } - - - /** - * Called when the entity is attacked. - */ - public boolean attackEntityFrom(DamageSource par1DamageSource, float par2) - { - // no arrow damage when in ranged mode - if (!this.canRampage && !this.isTired() && par1DamageSource.isProjectile()) { - return false; - } - - boolean success = super.attackEntityFrom(par1DamageSource, par2); - - this.canRampage = true; - - return success; - } - - /** - * Drop 0-2 items of this living's type. @param par1 - Whether this entity has recently been hit by a player. @param - * par2 - Level of Looting used to kill this mob. - */ - @Override - protected void dropFewItems(boolean flag, int looting) { - Item fur = getDropItem(); - if(fur != null) - { - int drops = 6 + rand.nextInt(6 + looting); - for(int d = 0; d < drops; d++) - { - this.dropItem(fur, 1); - } - - } - - Item bombs = TFItems.iceBomb; - int drops = 6 + rand.nextInt(6 + looting); - for(int d = 0; d < drops; d++) - { - this.dropItem(bombs, 1); - } - - } - - @Override - protected Item getDropItem() - { - return TFItems.alphaFur; - } - - /** - * Put the player out in front of where we are - */ - @Override - public void updateRiderPosition() - { - if (this.riddenByEntity != null) - { - Vec3 riderPos = this.getRiderPosition(); - - this.riddenByEntity.setPosition(riderPos.xCoord, riderPos.yCoord, riderPos.zCoord); - } - } - - /** - * Returns the Y offset from the entity's position for any entity riding this one. - */ - @Override - public double getMountedYOffset() - { - return 5.75D; - } - - /** - * Used to both get a rider position and to push out of blocks - */ - public Vec3 getRiderPosition() - { - if (this.riddenByEntity != null) - { - float distance = 0.4F; - - double var1 = Math.cos((this.rotationYaw + 90) * Math.PI / 180.0D) * distance; - double var3 = Math.sin((this.rotationYaw + 90) * Math.PI / 180.0D) * distance; - - return Vec3.createVectorHelper(this.posX + var1, this.posY + this.getMountedYOffset() + this.riddenByEntity.getYOffset(), this.posZ + var3); - } - else - { - return Vec3.createVectorHelper(this.posX, this.posY, this.posZ); - } - } - - /** - * If a rider of this entity can interact with this entity. Should return true on the - * ridden entity if so. - * - * @return if the entity can be interacted with from a rider - */ - public boolean canRiderInteract() - { - return true; - } - - /** - * Destroys all blocks that aren't associated with 'The End' inside the given bounding box. - */ - public boolean destroyBlocksInAABB(AxisAlignedBB par1AxisAlignedBB) - { - //System.out.println("Destroying blocks in " + par1AxisAlignedBB); - - int minX = MathHelper.floor_double(par1AxisAlignedBB.minX); - int minY = MathHelper.floor_double(par1AxisAlignedBB.minY); - int minZ = MathHelper.floor_double(par1AxisAlignedBB.minZ); - int maxX = MathHelper.floor_double(par1AxisAlignedBB.maxX); - int maxY = MathHelper.floor_double(par1AxisAlignedBB.maxY); - int maxZ = MathHelper.floor_double(par1AxisAlignedBB.maxZ); - boolean wasBlocked = false; - for (int dx = minX; dx <= maxX; ++dx) - { - for (int dy = minY; dy <= maxY; ++dy) - { - for (int dz = minZ; dz <= maxZ; ++dz) - { - Block currentID = this.worldObj.getBlock(dx, dy, dz); - - if (currentID != Blocks.air) - { - int currentMeta = this.worldObj.getBlockMetadata(dx, dy, dz); - - if (currentID != Blocks.obsidian && currentID != Blocks.end_stone && currentID != Blocks.bedrock) - { - this.worldObj.setBlock(dx, dy, dz, Blocks.air, 0, 2); - - // here, this effect will have to do - worldObj.playAuxSFX(2001, dx, dy, dz, Block.getIdFromBlock(currentID) + (currentMeta << 12)); - } - else - { - wasBlocked = true; - } - } - } - } - } - - return wasBlocked; - } - - - - public void makeRandomBlockFall() { - // begin turning blocks into falling blocks - makeRandomBlockFall(30); - } - - - private void makeRandomBlockFall(int range) { - // find a block nearby - int bx = MathHelper.floor_double(this.posX) + this.getRNG().nextInt(range) - this.getRNG().nextInt(range); - int bz = MathHelper.floor_double(this.posZ) + this.getRNG().nextInt(range) - this.getRNG().nextInt(range); - int by = MathHelper.floor_double(this.posY + this.getEyeHeight()); - - makeBlockFallAbove(bx, bz, by); - } - - - private void makeBlockFallAbove(int bx, int bz, int by) { - if (worldObj.isAirBlock(bx, by, bz)) { - for (int i = 1; i < 30; i++) { - if (!worldObj.isAirBlock(bx, by + i, bz)) { - makeBlockFall(bx, by + i, bz); - break; - } - } - } - } - - - public void makeNearbyBlockFall() { - makeRandomBlockFall(15); - } - - - public void makeBlockAboveTargetFall() { - if (this.getAttackTarget() != null) { - - int bx = MathHelper.floor_double(this.getAttackTarget().posX); - int bz = MathHelper.floor_double(this.getAttackTarget().posZ); - int by = MathHelper.floor_double(this.getAttackTarget().posY + this.getAttackTarget().getEyeHeight()); - - makeBlockFallAbove(bx, bz, by); - } - - } - - - private void makeBlockFall(int bx, int by, int bz) { - //worldObj.setBlock(bx, by, bz, Blocks.gravel); - - //EntityFallingBlock sand; - - Block currentID = this.worldObj.getBlock(bx, by, bz); - int currentMeta = this.worldObj.getBlockMetadata(bx, by, bz); - - // just set it to ice for now - worldObj.setBlock(bx, by, bz, Blocks.packed_ice); - - worldObj.playAuxSFX(2001, bx, by, bz, Block.getIdFromBlock(currentID) + (currentMeta << 12)); - - - EntityTFFallingIce ice = new EntityTFFallingIce(worldObj, bx, by - 3, bz); - worldObj.spawnEntityInWorld(ice); - - - } - - - - /** - * Attack the specified entity using a ranged attack. - */ - public void attackEntityWithRangedAttack(EntityLivingBase target, float par2) - { - if (!this.canRampage) { - - EntityTFIceBomb ice = new EntityTFIceBomb(this.worldObj, this); - - double d0 = target.posX - this.posX; - double d1 = target.posY + (double)target.getEyeHeight() - 1.100000023841858D - target.posY; - double d2 = target.posZ - this.posZ; - float f1 = MathHelper.sqrt_double(d0 * d0 + d2 * d2) * 0.2F; - ice.setThrowableHeading(d0, d1 + (double)f1, d2, 0.75F, 12.0F); - - this.playSound("random.bow", 1.0F, 1.0F / (this.getRNG().nextFloat() * 0.4F + 0.8F)); - this.worldObj.spawnEntityInWorld(ice); - } - } - - public boolean canDespawn() { - return false; - } - - public boolean canRampage() { - return this.canRampage; - } - - /** - * Set whether this yeti is currently in rampage mode. - */ - public void setRampaging(boolean par1) - { - this.getDataWatcher().updateObject(RAMPAGE_FLAG, Byte.valueOf((byte)(par1 ? 1 : 0))); - } - - /** - * Return whether this yeti is currently in rampage mode. - */ - public boolean isRampaging() - { - return this.getDataWatcher().getWatchableObjectByte(RAMPAGE_FLAG) == 1; - } - - /** - * Set whether this yeti is currently tired. - */ - public void setTired(boolean par1) - { - this.getDataWatcher().updateObject(TIRED_FLAG, Byte.valueOf((byte)(par1 ? 1 : 0))); - this.canRampage = false; - } - - /** - * Return whether this yeti is currently tired. - */ - public boolean isTired() - { - return this.getDataWatcher().getWatchableObjectByte(TIRED_FLAG) == 1; - } - - /** - * Called when the mob is falling. Calculates and applies fall damage. - */ - protected void fall(float par1) - { - super.fall(par1); - - if (this.isRampaging()) { - // make jump effects - this.playSound("random.bow", 1.0F, 1.0F / (this.getRNG().nextFloat() * 0.4F + 0.8F)); - - int i = MathHelper.floor_double(this.posX); - int j = MathHelper.floor_double(this.posY - 0.20000000298023224D - (double)this.yOffset); - int k = MathHelper.floor_double(this.posZ); - - this.worldObj.playAuxSFX(2006, i, j, k, 20); - this.worldObj.playAuxSFX(2006, i, j, k, 30); - - // hit everything around - if (!this.worldObj.isRemote) { - hitNearbyEntities(); - } - - } - } - - - @SuppressWarnings("unchecked") - private void hitNearbyEntities() { - ArrayList nearby = new ArrayList(this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox.expand(5, 0, 5))); - - for (Entity entity : nearby) { - if (entity instanceof EntityLivingBase) { - - boolean hit = entity.attackEntityFrom(DamageSource.causeMobDamage(this), 5F); - - if (hit) - { - entity.motionY += 0.4000000059604645D; - } - } - } - } - - - /** - * Trigger achievement when killed - */ - @Override - public void onDeath(DamageSource par1DamageSource) { - super.onDeath(par1DamageSource); - if (par1DamageSource.getSourceOfDamage() instanceof EntityPlayer) { - ((EntityPlayer)par1DamageSource.getSourceOfDamage()).triggerAchievement(TFAchievementPage.twilightHunter); - ((EntityPlayer)par1DamageSource.getSourceOfDamage()).triggerAchievement(TFAchievementPage.twilightProgressYeti); - } - - // mark the lair as defeated - if (!worldObj.isRemote) { - int dx = MathHelper.floor_double(this.posX); - int dy = MathHelper.floor_double(this.posY); - int dz = MathHelper.floor_double(this.posZ); - - if (worldObj.provider instanceof WorldProviderTwilightForest){ - ChunkProviderTwilightForest chunkProvider = ((WorldProviderTwilightForest)worldObj.provider).getChunkProvider(); - TFFeature nearbyFeature = ((TFWorldChunkManager)worldObj.provider.worldChunkMgr).getFeatureAt(dx, dz, worldObj); - - if (nearbyFeature == TFFeature.yetiCave) { - chunkProvider.setStructureConquered(dx, dy, dz, true); - } - } - } - } - - @Override - public void writeEntityToNBT(NBTTagCompound nbttagcompound) - { - ChunkCoordinates home = this.getHomePosition(); - nbttagcompound.setTag("Home", newDoubleNBTList(new double[] { - home.posX, home.posY, home.posZ - })); - nbttagcompound.setBoolean("HasHome", this.hasHome()); - super.writeEntityToNBT(nbttagcompound); - } - - @Override - public void readEntityFromNBT(NBTTagCompound nbttagcompound) - { - super.readEntityFromNBT(nbttagcompound); - if (nbttagcompound.hasKey("Home", 9)) - { - NBTTagList nbttaglist = nbttagcompound.getTagList("Home", 6); - int hx = (int) nbttaglist.func_150309_d(0); - int hy = (int) nbttaglist.func_150309_d(1); - int hz = (int) nbttaglist.func_150309_d(2); - this.setHomeArea(hx, hy, hz, 30); - } - if (!nbttagcompound.getBoolean("HasHome")) - { - this.detachHome(); - } - } - -} diff --git a/src/main/java/twilightforest/entity/boss/Hydra.java b/src/main/java/twilightforest/entity/boss/Hydra.java new file mode 100644 index 0000000000..ffbcbac37a --- /dev/null +++ b/src/main/java/twilightforest/entity/boss/Hydra.java @@ -0,0 +1,824 @@ +package twilightforest.entity.boss; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.network.protocol.game.ClientboundAddEntityPacket; +import net.minecraft.server.level.ServerBossEvent; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.util.Mth; +import net.minecraft.world.BossEvent; +import net.minecraft.world.Difficulty; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.damagesource.DamageTypes; +import net.minecraft.world.entity.*; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.monster.Enemy; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.GameRules; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets; +import net.minecraft.world.phys.AABB; +import net.minecraftforge.entity.PartEntity; +import net.minecraftforge.event.ForgeEventFactory; +import net.minecraftforge.fluids.FluidType; +import org.jetbrains.annotations.Nullable; +import twilightforest.advancements.TFAdvancements; +import twilightforest.entity.EnforcedHomePoint; +import twilightforest.entity.TFPart; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFDamageTypes; +import twilightforest.init.TFSounds; +import twilightforest.init.TFStructures; +import twilightforest.loot.TFLootTables; +import twilightforest.util.EntityUtil; +import twilightforest.util.LandmarkUtil; +import twilightforest.util.WorldUtil; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +public class Hydra extends Mob implements Enemy, EnforcedHomePoint { + + private static final int TICKS_BEFORE_HEALING = 1000; + private static final int HEAD_RESPAWN_TICKS = 100; + private static final int HEAD_MAX_DAMAGE = 120; + private static final float ARMOR_MULTIPLIER = 8.0F; + private static final int MAX_HEALTH = 360; + private static float HEADS_ACTIVITY_FACTOR = 0.3F; + + private static final int SECONDARY_FLAME_CHANCE = 10; + private static final int SECONDARY_MORTAR_CHANCE = 16; + + private final HydraPart[] partArray; + + public final int numHeads = 7; + public final HydraHeadContainer[] hc = new HydraHeadContainer[numHeads]; + + public final HydraSmallPart body; + private final HydraSmallPart leftLeg; + private final HydraSmallPart rightLeg; + private final HydraSmallPart tail; + private final ServerBossEvent bossInfo = new ServerBossEvent(this.getDisplayName(), BossEvent.BossBarColor.BLUE, BossEvent.BossBarOverlay.PROGRESS); + private float randomYawVelocity = 0f; + + private int ticksSinceDamaged = 0; + private final List hurtBy = new ArrayList<>(); + + public boolean renderFakeHeads = true; + + public Hydra(EntityType type, Level world) { + super(type, world); + + List parts = new ArrayList<>(); + + this.body = new HydraSmallPart(this, 6F, 6F); + this.leftLeg = new HydraSmallPart(this, 2F, 3F); + this.rightLeg = new HydraSmallPart(this, 2F, 3F); + this.tail = new HydraSmallPart(this, 6.0f, 2.0f); + + parts.add(this.body); + parts.add(this.leftLeg); + parts.add(this.rightLeg); + parts.add(this.tail); + + for (int i = 0; i < this.numHeads; i++) { + this.hc[i] = new HydraHeadContainer(this, i, i < 3); + parts.add(this.hc[i].headEntity); + Collections.addAll(parts, this.hc[i].getNeckArray()); + } + + this.partArray = parts.toArray(new HydraPart[0]); + + this.noCulling = true; + this.xpReward = 511; + + } + + @Override + public void setCustomName(@Nullable Component name) { + super.setCustomName(name); + this.bossInfo.setName(this.getDisplayName()); + } + + public static AttributeSupplier.Builder registerAttributes() { + return Mob.createMobAttributes() + .add(Attributes.MAX_HEALTH, MAX_HEALTH) + .add(Attributes.MOVEMENT_SPEED, 0.28D); + } + + @Override + public void startSeenByPlayer(ServerPlayer player) { + super.startSeenByPlayer(player); + this.bossInfo.addPlayer(player); + } + + @Override + public void stopSeenByPlayer(ServerPlayer player) { + super.stopSeenByPlayer(player); + this.bossInfo.removePlayer(player); + } + + @Override + public void checkDespawn() { + if (this.getLevel().getDifficulty() == Difficulty.PEACEFUL) { + this.getLevel().setBlockAndUpdate(this.blockPosition().offset(0, 2, 0), TFBlocks.HYDRA_BOSS_SPAWNER.get().defaultBlockState()); + this.discard(); + for (HydraHeadContainer container : hc) { + if (container.headEntity != null) { + container.headEntity.discard(); + } + } + } else { + super.checkDespawn(); + } + } + + // [Vanilla Copy] from LivingEntity. Hydra doesn't like the one from EntityLiving for whatever reason + @Override + protected float tickHeadTurn(float p_110146_1_, float p_110146_2_) { + float f = Mth.wrapDegrees(p_110146_1_ - this.yBodyRot); + this.yBodyRot += f * 0.3F; + float f1 = Mth.wrapDegrees(this.getYRot() - this.yBodyRot); + boolean flag = f1 < -90.0F || f1 >= 90.0F; + + if (f1 < -75.0F) { + f1 = -75.0F; + } + + if (f1 >= 75.0F) { + f1 = 75.0F; + } + + this.yBodyRot = this.getYRot() - f1; + + if (f1 * f1 > 2500.0F) { + this.yBodyRot += f1 * 0.2F; + } + + if (flag) { + p_110146_2_ *= -1.0F; + } + + return p_110146_2_; + } + + @Override + public void aiStep() { + if (this.renderFakeHeads) this.renderFakeHeads = false; + this.clearFire(); + this.body.tick(); + this.leftLeg.tick(); + this.rightLeg.tick(); + + // update all heads (maybe we should change to only active ones + for (int i = 0; i < this.numHeads; i++) { + this.hc[i].tick(); + } + + if (this.hurtTime > 0) { + for (int i = 0; i < this.numHeads; i++) { + this.hc[i].setHurtTime(this.hurtTime); + } + } + + this.ticksSinceDamaged++; + + if (!this.getLevel().isClientSide() && this.ticksSinceDamaged > TICKS_BEFORE_HEALING && this.ticksSinceDamaged % 5 == 0) { + this.heal(1); + } + + // update fight variables for difficulty setting + this.setDifficultyVariables(); + + super.aiStep(); + + // set body part positions + float angle; + double dx, dy, dz; + + // body goes behind the actual position of the hydra + angle = (((this.yBodyRot + 180.0F) * Mth.PI) / 180.0F); + + dx = getX() - Mth.sin(angle) * 3.0D; + dy = getY() + 0.1D; + dz = getZ() + Mth.cos(angle) * 3.0D; + this.body.setPos(dx, dy, dz); + + dx = getX() - Mth.sin(angle) * 10.5D; + dy = getY() + 0.1D; + dz = getZ() + Mth.cos(angle) * 10.5D; + this.tail.setPos(dx, dy, dz); + + if (hurtTime == 0) { + this.collideWithEntities(this.getLevel().getEntities(this, this.body.getBoundingBox()), this.body); + this.collideWithEntities(this.getLevel().getEntities(this, this.tail.getBoundingBox()), this.tail); + } + + // destroy blocks + if (!this.getLevel().isClientSide()) { + this.destroyBlocksInAABB(this.body.getBoundingBox()); + this.destroyBlocksInAABB(this.tail.getBoundingBox()); + + for (int i = 0; i < this.numHeads; i++) { + if (this.hc[i].headEntity != null && this.hc[i].isActive()) { + this.destroyBlocksInAABB(this.hc[i].headEntity.getBoundingBox()); + } + } + + // smash blocks beneath us too + if (this.tickCount % 20 == 0) { + if (this.isUnsteadySurfaceBeneath()) { + this.destroyBlocksInAABB(this.getBoundingBox().move(0, -1, 0)); + + } + } + + this.bossInfo.setProgress(this.getHealth() / this.getMaxHealth()); + } + } + + @Override + public void addAdditionalSaveData(CompoundTag compound) { + this.saveHomePointToNbt(compound); + compound.putByte("NumHeads", (byte) this.countActiveHeads()); + super.addAdditionalSaveData(compound); + } + + @Override + public void readAdditionalSaveData(CompoundTag compound) { + super.readAdditionalSaveData(compound); + this.loadHomePointFromNbt(compound, 20); + this.activateNumberOfHeads(compound.getByte("NumHeads")); + if (this.hasCustomName()) { + this.bossInfo.setName(this.getDisplayName()); + } + } + + // TODO modernize this more (old AI copypasta still kind of here) + private int numTicksToChaseTarget; + + @Override + protected void customServerAiStep() { + this.xxa = 0.0F; + this.zza = 0.0F; + float f = 48.0F; + + // kill heads that have taken too much damage + for (int i = 0; i < this.numHeads; i++) { + if (this.hc[i].isActive() && this.hc[i].getDamageTaken() > HEAD_MAX_DAMAGE) { + this.hc[i].setNextState(HydraHeadContainer.State.DYING); + this.hc[i].endCurrentAction(); + + // set this head and a random dead head to respawn + this.hc[i].setRespawnCounter(HEAD_RESPAWN_TICKS); + int otherHead = this.getRandomDeadHead(); + if (otherHead != -1) { + this.hc[otherHead].setRespawnCounter(HEAD_RESPAWN_TICKS); + } + } + } + + if (this.getRandom().nextFloat() < 0.7F) { + Player entityplayer1 = this.getLevel().getNearestPlayer(this, f); + + if (entityplayer1 != null && !entityplayer1.isCreative()) { + setTarget(entityplayer1); + this.numTicksToChaseTarget = 100 + this.getRandom().nextInt(20); + } else { + this.randomYawVelocity = (this.getRandom().nextFloat() - 0.5F) * 20F; + } + } + + if (this.getTarget() != null) { + this.lookAt(this.getTarget(), 10.0F, this.getMaxHeadXRot()); + + // have any heads not currently attacking switch to the primary target + for (int i = 0; i < this.numHeads; i++) { + if (!this.hc[i].isAttacking() && !this.hc[i].isSecondaryAttacking) { + this.hc[i].setTargetEntity(this.getTarget()); + } + } + + // let's pick an attack + if (this.getTarget().isAlive()) { + float distance = this.getTarget().distanceTo(this); + + if (this.getSensing().hasLineOfSight(this.getTarget())) { + this.attackEntity(this.getTarget(), distance); + } + } + + if (this.numTicksToChaseTarget-- <= 0 || !this.getTarget().isAlive() || this.getTarget().distanceToSqr(this) > f * f) { + this.setTarget(null); + } + } else { + if (this.getRandom().nextFloat() < 0.05F) { + this.randomYawVelocity = (this.getRandom().nextFloat() - 0.5F) * 20F; + } + + this.setYRot(this.getYRot() + this.randomYawVelocity); + this.setXRot(0); + + // TODO: while we are idle, consider having the heads breathe fire on passive mobs + + // set idle heads to no target + for (int i = 0; i < this.numHeads; i++) { + if (this.hc[i].isIdle()) { + this.hc[i].setTargetEntity(null); + } + } + } + + // heads that are free at this point may consider attacking secondary targets + this.secondaryAttacks(); + } + + private void setDifficultyVariables() { + if (this.getLevel().getDifficulty() != Difficulty.HARD) { + Hydra.HEADS_ACTIVITY_FACTOR = 0.3F; + } else { + Hydra.HEADS_ACTIVITY_FACTOR = 0.5F; // higher is harder + } + } + + private int getRandomDeadHead() { + List headIDs = new ArrayList<>(); + for (int i = 0; i < this.numHeads; i++) { + if (this.hc[i].canRespawn()) headIDs.add(i); + } + return headIDs.isEmpty() ? -1 : headIDs.get(this.random.nextInt(headIDs.size())); + } + + /** + * Used when re-loading from save. Assumes three heads are active and activates more if necessary. + */ + private void activateNumberOfHeads(int howMany) { + int moreHeads = howMany - this.countActiveHeads(); + + for (int i = 0; i < moreHeads; i++) { + int otherHead = this.getRandomDeadHead(); + if (otherHead != -1) { + // move directly into not dead + this.hc[otherHead].setNextState(HydraHeadContainer.State.IDLE); + this.hc[otherHead].endCurrentAction(); + } + } + } + + /** + * Count timers, and pick an attack against the entity if our timer says go + */ + private void attackEntity(Entity target, float distance) { + + int BITE_CHANCE = 10; + int FLAME_CHANCE = 100; + int MORTAR_CHANCE = 160; + + boolean targetAbove = target.getBoundingBox().minY > this.getBoundingBox().maxY; + + // three main heads can do these kinds of attacks + for (int i = 0; i < 3; i++) { + if (this.hc[i].isIdle() && !areTooManyHeadsAttacking(i)) { + if (distance > 4 && distance < 10 && this.getRandom().nextInt(BITE_CHANCE) == 0 && this.countActiveHeads() > 2 && !this.areOtherHeadsBiting(i)) { + this.hc[i].setNextState(HydraHeadContainer.State.BITE_BEGINNING); + } else if (distance > 0 && distance < 20 && this.getRandom().nextInt(FLAME_CHANCE) == 0) { + this.hc[i].setNextState(HydraHeadContainer.State.FLAME_BEGINNING); + } else if (distance > 8 && distance < 32 && !targetAbove && this.getRandom().nextInt(MORTAR_CHANCE) == 0) { + this.hc[i].setNextState(HydraHeadContainer.State.MORTAR_BEGINNING); + } + } + } + + // heads 4-7 can do everything but bite + for (int i = 3; i < numHeads; i++) { + if (this.hc[i].isIdle() && !this.areTooManyHeadsAttacking(i)) { + if (distance > 0 && distance < 20 && this.getRandom().nextInt(FLAME_CHANCE) == 0) { + this.hc[i].setNextState(HydraHeadContainer.State.FLAME_BEGINNING); + } else if (distance > 8 && distance < 32 && !targetAbove && this.getRandom().nextInt(MORTAR_CHANCE) == 0) { + this.hc[i].setNextState(HydraHeadContainer.State.MORTAR_BEGINNING); + } + } + } + } + + private boolean areTooManyHeadsAttacking(int testHead) { + int otherAttacks = 0; + + for (int i = 0; i < this.numHeads; i++) { + if (i != testHead && this.hc[i].isAttacking()) { + otherAttacks++; + + // biting heads count triple + if (this.hc[i].isBiting()) { + otherAttacks += 2; + } + } + } + + return otherAttacks >= 1 + (countActiveHeads() * HEADS_ACTIVITY_FACTOR); + } + + private int countActiveHeads() { + int count = 0; + + for (int i = 0; i < this.numHeads; i++) { + if (this.hc[i].isActive()) { + count++; + } + } + + return count; + } + + private boolean areOtherHeadsBiting(int testHead) { + for (int i = 0; i < this.numHeads; i++) { + if (i != testHead && this.hc[i].isBiting()) { + return true; + } + } + return false; + } + + /** + * Called sometime after the main attackEntity routine. Finds a valid secondary target and has an unoccupied head start an attack against it. + *

+ * The center head (head 0) does not make secondary attacks + */ + private void secondaryAttacks() { + for (int i = 0; i < this.numHeads; i++) { + if (this.hc[i].headEntity == null) { + return; + } + } + + LivingEntity secondaryTarget = findSecondaryTarget(20); + + if (secondaryTarget != null) { + float distance = secondaryTarget.distanceTo(this); + + for (int i = 1; i < this.numHeads; i++) { + if (this.hc[i].isActive() && this.hc[i].isIdle() && isTargetOnThisSide(i, secondaryTarget)) { + if (distance > 0 && distance < 20 && this.getRandom().nextInt(SECONDARY_FLAME_CHANCE) == 0) { + this.hc[i].setTargetEntity(secondaryTarget); + this.hc[i].isSecondaryAttacking = true; + this.hc[i].setNextState(HydraHeadContainer.State.FLAME_BEGINNING); + } else if (distance > 8 && distance < 32 && this.getRandom().nextInt(SECONDARY_MORTAR_CHANCE) == 0) { + this.hc[i].setTargetEntity(secondaryTarget); + this.hc[i].isSecondaryAttacking = true; + this.hc[i].setNextState(HydraHeadContainer.State.MORTAR_BEGINNING); + } + } + } + } + } + + /** + * Used to make sure heads don't attack across the whole body + */ + private boolean isTargetOnThisSide(int headNum, Entity target) { + double headDist = distanceSqXZ(this.hc[headNum].headEntity, target); + double middleDist = distanceSqXZ(this, target); + return headDist < middleDist; + } + + /** + * Square of distance between two entities with y not a factor, just x and z + */ + private double distanceSqXZ(Entity headEntity, Entity target) { + double distX = headEntity.getX() - target.getX(); + double distZ = headEntity.getZ() - target.getZ(); + return distX * distX + distZ * distZ; + } + + @Nullable + private LivingEntity findSecondaryTarget(double range) { + return this.getLevel().getEntitiesOfClass(LivingEntity.class, new AABB(this.getX(), this.getY(), this.getZ(), this.getX() + 1, this.getY() + 1, this.getZ() + 1).inflate(range, range, range)) + .stream() + .filter(e -> !(e instanceof Hydra)) + .filter(e -> e != getTarget() && !isAnyHeadTargeting(e) && getSensing().hasLineOfSight(e) && EntitySelector.NO_CREATIVE_OR_SPECTATOR.test(e)) + .min(Comparator.comparingDouble(this::distanceToSqr)).orElse(null); + } + + private boolean isAnyHeadTargeting(Entity targetEntity) { + for (int i = 0; i < this.numHeads; i++) { + if (this.hc[i].targetEntity != null && this.hc[i].targetEntity.equals(targetEntity)) { + return true; + } + } + + return false; + } + + // [VanillaCopy] based on EnderDragon.knockBack + private void collideWithEntities(List entities, Entity part) { + double d0 = (part.getBoundingBox().minX + part.getBoundingBox().maxX) / 2.0D; + double d1 = (part.getBoundingBox().minZ + part.getBoundingBox().maxZ) / 2.0D; + + for (Entity entity : entities) { + if (entity instanceof Player player && player.isCreative()) continue; + if (entity instanceof LivingEntity) { + double d2 = entity.getX() - d0; + double d3 = entity.getZ() - d1; + double d4 = Math.max(d2 * d2 + d3 * d3, 0.1D); + entity.push(d2 / d4 * 8.0D, 0.2D, d3 / d4 * 8.0D); + } + } + } + + /** + * Check the surface immediately beneath us, if it is less than 80% solid + */ + private boolean isUnsteadySurfaceBeneath() { + int minX = Mth.floor(this.getBoundingBox().minX); + int minZ = Mth.floor(this.getBoundingBox().minZ); + int maxX = Mth.floor(this.getBoundingBox().maxX); + int maxZ = Mth.floor(this.getBoundingBox().maxZ); + int minY = Mth.floor(this.getBoundingBox().minY); + + int solid = 0; + int total = 0; + + int dy = minY - 1; + + for (int dx = minX; dx <= maxX; ++dx) { + for (int dz = minZ; dz <= maxZ; ++dz) { + total++; + if (this.getLevel().getBlockState(new BlockPos(dx, dy, dz)).getMaterial().isSolid()) { + solid++; + } + } + } + + return ((float) solid / (float) total) < 0.6F; + } + + private void destroyBlocksInAABB(AABB box) { + if (this.deathTime <= 0 && ForgeEventFactory.getMobGriefingEvent(this.getLevel(), this)) { + for (BlockPos pos : WorldUtil.getAllInBB(box)) { + if (EntityUtil.canDestroyBlock(this.getLevel(), pos, this)) { + this.getLevel().destroyBlock(pos, false); + } + } + } + } + + @Override + public int getMaxHeadXRot() { + return 500; + } + + public boolean attackEntityFromPart(HydraPart part, DamageSource source, float damage) { + // if we're in a wall, kill that wall + if (!this.getLevel().isClientSide() && source.is(DamageTypes.IN_WALL)) { + this.destroyBlocksInAABB(part.getBoundingBox()); + } + + if (source.getEntity() == this || source.getDirectEntity() == this) + return false; + if (this.getParts() != null) + for (PartEntity partEntity : this.getParts()) + if (partEntity == source.getEntity() || partEntity == source.getDirectEntity()) + return false; + + HydraHeadContainer headCon = null; + + for (int i = 0; i < this.numHeads; i++) { + if (this.hc[i].headEntity == part) { + headCon = this.hc[i]; + } else if (part instanceof HydraNeck neck && this.hc[i].headEntity == neck.head && !this.hc[i].isActive()) + return false; + } + + double range = calculateRange(source); + + // Give some leeway for reflected mortars + if (range > 400 + (source.getDirectEntity() instanceof HydraMortar ? 200 : 0)) { + return false; + } + + // ignore hits on dying heads, it's weird + if (headCon != null && !headCon.isActive()) { + return false; + } + + boolean tookDamage; + if (headCon != null && headCon.getCurrentMouthOpen() > 0.5) { + tookDamage = super.hurt(source, damage); + headCon.addDamage(damage); + } else { + int armoredDamage = Math.round(damage / ARMOR_MULTIPLIER); + tookDamage = super.hurt(source, armoredDamage); + + if (headCon != null) { + headCon.addDamage(armoredDamage); + } + } + + if (tookDamage) { + this.ticksSinceDamaged = 0; + } + + return tookDamage; + } + + private double calculateRange(DamageSource damagesource) { + return damagesource.getEntity() != null ? this.distanceToSqr(damagesource.getEntity()) : -1; + } + + @Override + public boolean hurt(DamageSource src, float damage) { + if (src.getEntity() instanceof ServerPlayer player && !this.hurtBy.contains(player)) { + this.hurtBy.add(player); + } + return src.is(DamageTypes.OUT_OF_WORLD) && super.hurt(src, damage); + } + + @Override + public boolean isInvulnerableTo(DamageSource source) { + return !source.is(TFDamageTypes.HYDRA_MORTAR) && super.isInvulnerableTo(source); + } + + @Override + public boolean isMultipartEntity() { + return true; + } + + /** + * We need to do this for the bounding boxes on the parts to become active + */ + @Nullable + @Override + public PartEntity[] getParts() { + return this.partArray; + } + + @Override + public void recreateFromPacket(ClientboundAddEntityPacket packet) { + super.recreateFromPacket(packet); + TFPart.assignPartIDs(this); + } + + /** + * This is set as off for the hydra, which has an enormous bounding box, but set as on for the parts. + */ + @Override + public boolean isPickable() { + return false; + } + + /** + * If this is on, the player pushes us based on our bounding box rather than it going by parts + */ + @Override + public boolean isPushable() { + return false; + } + + @Override + protected void doPush(Entity entity) { + } + + @Override + public void knockback(double strength, double xRatio, double zRatio) { + } + + @Override + protected SoundEvent getAmbientSound() { + return TFSounds.HYDRA_GROWL.get(); + } + + @Override + protected SoundEvent getHurtSound(DamageSource source) { + return TFSounds.HYDRA_HURT.get(); + } + + @Override + protected SoundEvent getDeathSound() { + return TFSounds.HYDRA_DEATH.get(); + } + + @Override + protected float getSoundVolume() { + return 2F; + } + + @Override + public void die(DamageSource cause) { + super.die(cause); + // mark the lair as defeated + if (!this.getLevel().isClientSide()) { + this.bossInfo.setProgress(0.0F); + LandmarkUtil.markStructureConquered(this.getLevel(), this, TFStructures.HYDRA_LAIR, true); + for (ServerPlayer player : this.hurtBy) { + TFAdvancements.HURT_BOSS.trigger(player, this); + } + + TFLootTables.entityDropsIntoContainer(this, this.createLootContext(true, cause).create(LootContextParamSets.ENTITY), TFBlocks.MANGROVE_CHEST.get().defaultBlockState(), EntityUtil.bossChestLocation(this)); + } + } + + @Override + protected boolean shouldDropLoot() { + // Invoked the mob's loot during die, this will avoid duplicating during the actual drop phase + return false; + } + + @Override + public boolean removeWhenFarAway(double distance) { + return false; + } + + @Override + public boolean isOnFire() { + return false; + } + + @Override + protected void tickDeath() { + ++this.deathTime; + + // stop any head actions on death + if (this.deathTime == 1) { + for (int i = 0; i < this.numHeads; i++) { + this.hc[i].setRespawnCounter(-1); + if (this.hc[i].isActive()) { + this.hc[i].setNextState(HydraHeadContainer.State.IDLE); + this.hc[i].endCurrentAction(); + this.hc[i].setHurtTime(200); + } + } + } + + // heads die off one by one + if (this.deathTime <= 140 && this.deathTime % 20 == 0) { + int headToDie = (this.deathTime / 20) - 1; + + if (this.hc[headToDie].isActive()) { + this.hc[headToDie].setNextState(HydraHeadContainer.State.DYING); + this.hc[headToDie].endCurrentAction(); + } + } + + if (this.deathTime == 200) { + if (!this.getLevel().isClientSide() && (this.isAlwaysExperienceDropper() || this.lastHurtByPlayerTime > 0 && this.shouldDropExperience() && this.getLevel().getGameRules().getBoolean(GameRules.RULE_DOMOBLOOT))) { + int i = this.getExperienceReward(); + i = ForgeEventFactory.getExperienceDrop(this, this.lastHurtByPlayer, i); + while (i > 0) { + int j = ExperienceOrb.getExperienceValue(i); + i -= j; + this.getLevel().addFreshEntity(new ExperienceOrb(this.getLevel(), this.getX(), this.getY(), this.getZ(), j)); + } + } + + this.discard(); + } + + for (int i = 0; i < 10; ++i) { + double vx = this.getRandom().nextGaussian() * 0.02D; + double vy = this.getRandom().nextGaussian() * 0.02D; + double vz = this.getRandom().nextGaussian() * 0.02D; + this.getLevel().addParticle((this.getRandom().nextInt(2) == 0 ? ParticleTypes.EXPLOSION : ParticleTypes.POOF), + this.getX() + this.getRandom().nextFloat() * this.body.getBbWidth() * 2.0F - this.body.getBbWidth(), + this.getY() + this.getRandom().nextFloat() * this.body.getBbHeight(), + this.getZ() + this.getRandom().nextFloat() * this.body.getBbWidth() * 2.0F - this.body.getBbWidth(), + vx, vy, vz + ); + } + } + + @Override + public boolean isPushedByFluid(FluidType type) { + return false; + } + + @Override + protected float getWaterSlowDown() { + return 1.0F; + } + + @Override + protected boolean canRide(Entity entity) { + return false; + } + + @Override + public boolean canChangeDimensions() { + return false; + } + + @Override + public BlockPos getRestrictionCenter() { + return this.getRestrictCenter(); + } + + @Override + public void setRestriction(BlockPos pos, int dist) { + this.restrictTo(pos, dist); + } +} diff --git a/src/main/java/twilightforest/entity/boss/HydraHead.java b/src/main/java/twilightforest/entity/boss/HydraHead.java new file mode 100644 index 0000000000..262d3fe6fe --- /dev/null +++ b/src/main/java/twilightforest/entity/boss/HydraHead.java @@ -0,0 +1,56 @@ +package twilightforest.entity.boss; + +import net.minecraft.network.syncher.EntityDataAccessor; +import net.minecraft.network.syncher.EntityDataSerializers; +import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import twilightforest.TwilightForestMod; + +public class HydraHead extends HydraPart { + + public static final ResourceLocation RENDERER = TwilightForestMod.prefix("hydra_head"); + + private static final EntityDataAccessor DATA_MOUTH_POSITION = SynchedEntityData.defineId(HydraHead.class, EntityDataSerializers.FLOAT); + private static final EntityDataAccessor DATA_MOUTH_POSITION_LAST = SynchedEntityData.defineId(HydraHead.class, EntityDataSerializers.FLOAT); + private static final EntityDataAccessor DATA_STATE = SynchedEntityData.defineId(HydraHead.class, EntityDataSerializers.BYTE); + + public HydraHead(Hydra hydra) { + super(hydra, 4F, 4F); + } + + @OnlyIn(Dist.CLIENT) + public ResourceLocation renderer() { + return RENDERER; + } + + @Override + protected void defineSynchedData() { + super.defineSynchedData(); + this.entityData.define(DATA_MOUTH_POSITION, 0F); + this.entityData.define(DATA_MOUTH_POSITION_LAST, 0F); + this.entityData.define(DATA_STATE, (byte) 0); + } + + public float getMouthOpen() { + return this.entityData.get(DATA_MOUTH_POSITION); + } + + public float getMouthOpenLast() { + return this.entityData.get(DATA_MOUTH_POSITION_LAST); + } + + public HydraHeadContainer.State getState() { + return HydraHeadContainer.State.values()[this.entityData.get(DATA_STATE)]; + } + + public void setMouthOpen(float openness) { + this.entityData.set(DATA_MOUTH_POSITION_LAST, getMouthOpen()); + this.entityData.set(DATA_MOUTH_POSITION, openness); + } + + public void setState(HydraHeadContainer.State state) { + this.entityData.set(DATA_STATE, (byte) state.ordinal()); + } +} diff --git a/src/main/java/twilightforest/entity/boss/HydraHeadContainer.java b/src/main/java/twilightforest/entity/boss/HydraHeadContainer.java index 41931e643a..6d66318832 100644 --- a/src/main/java/twilightforest/entity/boss/HydraHeadContainer.java +++ b/src/main/java/twilightforest/entity/boss/HydraHeadContainer.java @@ -1,398 +1,385 @@ package twilightforest.entity.boss; +import com.google.common.collect.ImmutableMap; +import net.minecraft.core.BlockPos; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundSource; +import net.minecraft.util.Mth; +import net.minecraft.world.Difficulty; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.ClipContext; +import net.minecraft.world.level.gameevent.GameEvent; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.common.ToolActions; +import net.minecraftforge.network.PacketDistributor; +import twilightforest.init.TFDamageTypes; +import twilightforest.init.TFEntities; +import twilightforest.init.TFParticleType; +import twilightforest.init.TFSounds; +import twilightforest.network.TFPacketHandler; +import twilightforest.network.ThrowPlayerPacket; + +import org.jetbrains.annotations.Nullable; +import java.util.EnumMap; import java.util.List; - -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.boss.EntityDragonPart; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.DamageSource; -import net.minecraft.util.MathHelper; -import net.minecraft.util.MovingObjectPosition; -import net.minecraft.util.Vec3; -import net.minecraft.world.EnumDifficulty; -import twilightforest.TwilightForestMod; +import java.util.Map; +import java.util.Optional; /** * This class holds the state data for a single hydra head - * - * @author Ben * + * @author Ben */ public class HydraHeadContainer { - + // balancing factors - private static int FLAME_BURN_FACTOR = 3; - private static int FLAME_DAMAGE = 19; - private static int BITE_DAMAGE = 48; + private static final int FLAME_BURN_FACTOR = 3; + private static final int FLAME_DAMAGE = 19; + private static final int BITE_DAMAGE = 48; private static double FLAME_BREATH_TRACKING_SPEED = 0.04D; - - public static final int NEXT_AUTOMATIC = -1; - - public static final int STATE_IDLE = 0; - public static final int STATE_BITE_BEGINNING = 1; - public static final int STATE_BITE_READY = 2; - public static final int STATE_BITE_BITING = 3; - public static final int STATE_BITE_ENDING = 4; - public static final int STATE_FLAME_BEGINNING = 5; - public static final int STATE_FLAME_BREATHING = 6; - public static final int STATE_FLAME_ENDING = 7; - public static final int STATE_MORTAR_BEGINNING = 8; - public static final int STATE_MORTAR_LAUNCH = 9; - public static final int STATE_MORTAR_ENDING = 10; - public static final int STATE_DYING = 11; - public static final int STATE_DEAD = 12; - public static final int STATE_ATTACK_COOLDOWN = 13; - public static final int STATE_BORN = 14; - public static final int STATE_ROAR_START = 15; - public static final int STATE_ROAR_RAWR = 16; - - - public static final int NUM_STATES = 17; - - public EntityTFHydraHead headEntity; - public EntityTFHydraNeck necka; - public EntityTFHydraNeck neckb; - public EntityTFHydraNeck neckc; - public EntityTFHydraNeck neckd; - public EntityTFHydraNeck necke; - + + private static final State NEXT_AUTOMATIC = null; + + enum State { + IDLE(10), + + BITE_BEGINNING(40), + BITE_READY(80), + BITING(7), + BITE_ENDING(40), + + FLAME_BEGINNING(40), + FLAMING(100), + FLAME_ENDING(30), + + MORTAR_BEGINNING(40), + MORTAR_SHOOTING(25), + MORTAR_ENDING(30), + + DYING(70), + DEAD(20), + + ATTACK_COOLDOWN(80), + + BORN(20), + ROAR_START(10), + ROAR_RAWR(50); + + private static final Map NEXT_STATE; + public final int duration; + + State(int duration) { + this.duration = duration; + } + + static { + EnumMap b = new EnumMap<>(State.class); + b.put(IDLE, IDLE); + + b.put(BITE_BEGINNING, BITE_READY); + b.put(BITE_READY, BITING); + b.put(BITING, BITE_ENDING); + b.put(BITE_ENDING, ATTACK_COOLDOWN); + + b.put(FLAME_BEGINNING, FLAMING); + b.put(FLAMING, FLAME_ENDING); + b.put(FLAME_ENDING, ATTACK_COOLDOWN); + + b.put(MORTAR_BEGINNING, MORTAR_SHOOTING); + b.put(MORTAR_SHOOTING, MORTAR_ENDING); + b.put(MORTAR_ENDING, ATTACK_COOLDOWN); + + b.put(ATTACK_COOLDOWN, IDLE); + + b.put(DYING, DEAD); + + b.put(DEAD, DEAD); + + b.put(BORN, ROAR_START); + b.put(ROAR_START, ROAR_RAWR); + b.put(ROAR_RAWR, IDLE); + NEXT_STATE = ImmutableMap.copyOf(b); + } + } + + public final HydraHead headEntity; + public final HydraNeck necka; + public final HydraNeck neckb; + public final HydraNeck neckc; + public final HydraNeck neckd; + public final HydraNeck necke; + public Entity targetEntity; - public double targetX; - public double targetY; - public double targetZ; + private double targetX; + private double targetY; + private double targetZ; + + private State prevState; + private State currentState; + private State nextState; - public int prevState; - public int currentState; - public int nextState = NEXT_AUTOMATIC; - - public boolean didRoar; - public boolean isSecondaryAttacking; - - public int ticksNeeded; - public int ticksProgress; - - public final int headNum; - - public int damageTaken; - public int respawnCounter; - - public final EntityTFHydra hydraObj; - - public int[] nextStates; - public int[] stateDurations; - public float[][] stateNeckLength; - public float[][] stateXRotations; - public float[][] stateYRotations; - public float[][] stateMouthOpen; - - - public HydraHeadContainer(EntityTFHydra hydra, int number, boolean startActive) - { + + private int ticksNeeded; + private int ticksProgress; + + private final int headNum; + + private int damageTaken; + private int respawnCounter; + + private final Hydra hydra; + + private final Map[] stateNeckLength; + private final Map[] stateXRotations; + private final Map[] stateYRotations; + private final Map[] stateMouthOpen; + + @SuppressWarnings("unchecked") + public HydraHeadContainer(Hydra hydra, int number, boolean startActive) { this.headNum = number; - this.hydraObj = hydra; - + this.hydra = hydra; + this.damageTaken = 0; this.respawnCounter = -1; - this.didRoar = false; - - // is this a good place to initialize the necks? - necka = new EntityTFHydraNeck(hydraObj, "neck" + headNum + "a", 2F, 2F); - neckb = new EntityTFHydraNeck(hydraObj, "neck" + headNum + "b", 2F, 2F); - neckc = new EntityTFHydraNeck(hydraObj, "neck" + headNum + "c", 2F, 2F); - neckd = new EntityTFHydraNeck(hydraObj, "neck" + headNum + "d", 2F, 2F); - necke = new EntityTFHydraNeck(hydraObj, "neck" + headNum + "e", 2F, 2F); - - // state variables, what state is next in the chain - nextStates = new int[NUM_STATES]; - - nextStates[STATE_IDLE] = STATE_IDLE; - - nextStates[STATE_BITE_BEGINNING] = STATE_BITE_READY; - nextStates[STATE_BITE_READY] = STATE_BITE_BITING; - nextStates[STATE_BITE_BITING] = STATE_BITE_ENDING; - nextStates[STATE_BITE_ENDING] = STATE_ATTACK_COOLDOWN; - - nextStates[STATE_FLAME_BEGINNING] = STATE_FLAME_BREATHING; - nextStates[STATE_FLAME_BREATHING] = STATE_FLAME_ENDING; - nextStates[STATE_FLAME_ENDING] = STATE_ATTACK_COOLDOWN; - - nextStates[STATE_MORTAR_BEGINNING] = STATE_MORTAR_LAUNCH; - nextStates[STATE_MORTAR_LAUNCH] = STATE_MORTAR_ENDING; - nextStates[STATE_MORTAR_ENDING] = STATE_ATTACK_COOLDOWN; - - nextStates[STATE_ATTACK_COOLDOWN] = STATE_IDLE; - - nextStates[STATE_DYING] = STATE_DEAD; - - nextStates[STATE_DEAD] = STATE_DEAD; - - nextStates[STATE_BORN] = STATE_ROAR_START; - nextStates[STATE_ROAR_START] = STATE_ROAR_RAWR; - nextStates[STATE_ROAR_RAWR] = STATE_IDLE; - - // state durations, how long in each state - stateDurations = new int[NUM_STATES]; - - setupStateDurations(); - + + this.headEntity = new HydraHead(hydra); + this.headEntity.setPos(hydra.getX(), hydra.getY(), hydra.getZ()); + + this.necka = new HydraNeck(this.headEntity); + this.neckb = new HydraNeck(this.headEntity); + this.neckc = new HydraNeck(this.headEntity); + this.neckd = new HydraNeck(this.headEntity); + this.necke = new HydraNeck(this.headEntity); + // state positions, where is each state positioned? - stateNeckLength = new float[hydraObj.numHeads][NUM_STATES]; - stateXRotations = new float[hydraObj.numHeads][NUM_STATES]; - stateYRotations = new float[hydraObj.numHeads][NUM_STATES]; - stateMouthOpen = new float[hydraObj.numHeads][NUM_STATES]; - - setupStateRotations(); - - if (startActive) - { - this.prevState = STATE_IDLE; - this.currentState = STATE_IDLE; + this.stateNeckLength = (Map[]) new Map[this.hydra.numHeads]; + this.stateXRotations = (Map[]) new Map[this.hydra.numHeads]; + this.stateYRotations = (Map[]) new Map[this.hydra.numHeads]; + this.stateMouthOpen = (Map[]) new Map[this.hydra.numHeads]; + + for (int i = 0; i < this.hydra.numHeads; i++) { + this.stateNeckLength[i] = new EnumMap<>(State.class); + this.stateXRotations[i] = new EnumMap<>(State.class); + this.stateYRotations[i] = new EnumMap<>(State.class); + this.stateMouthOpen[i] = new EnumMap<>(State.class); + } + + this.setupStateRotations(); + + if (startActive) { + this.prevState = State.IDLE; + this.currentState = State.IDLE; this.nextState = NEXT_AUTOMATIC; this.ticksNeeded = 60; this.ticksProgress = 60; - } - else - { - this.prevState = STATE_DEAD; - this.currentState = STATE_DEAD; + } else { + this.prevState = State.DEAD; + this.currentState = State.DEAD; this.nextState = NEXT_AUTOMATIC; this.ticksNeeded = 20; this.ticksProgress = 20; } - } - - protected void setupStateDurations() { - stateDurations[STATE_IDLE] = 10; - - stateDurations[STATE_BITE_BEGINNING] = 40; - stateDurations[STATE_BITE_READY] = 80; - stateDurations[STATE_BITE_BITING] = 7; - stateDurations[STATE_BITE_ENDING] = 40; - - stateDurations[STATE_FLAME_BEGINNING] = 40; - stateDurations[STATE_FLAME_BREATHING] = 100; - stateDurations[STATE_FLAME_ENDING] = 30; - - stateDurations[STATE_MORTAR_BEGINNING] = 40; - stateDurations[STATE_MORTAR_LAUNCH] = 25; - stateDurations[STATE_MORTAR_ENDING] = 30; - - stateDurations[STATE_ATTACK_COOLDOWN] = 80; - - stateDurations[STATE_DYING] = 70; - stateDurations[STATE_DEAD] = 20; - - stateDurations[STATE_BORN] = 20; - - stateDurations[STATE_ROAR_START] = 10; - stateDurations[STATE_ROAR_RAWR] = 50; - + this.setHeadPosition(); + this.setNeckPosition(); } protected void setupStateRotations() { - setAnimation(0, STATE_IDLE, 60, 0, 7, 0); - setAnimation(1, STATE_IDLE, 10, 60, 9, 0); - setAnimation(2, STATE_IDLE, 10, -60, 9, 0); - setAnimation(3, STATE_IDLE, 50, 90, 8, 0); - setAnimation(4, STATE_IDLE, 50, -90, 8, 0); - setAnimation(5, STATE_IDLE, -10, 90, 9, 0); - setAnimation(6, STATE_IDLE, -10, -90, 9, 0); - - setAnimation(0, STATE_ATTACK_COOLDOWN, 60, 0, 7, 0); - setAnimation(1, STATE_ATTACK_COOLDOWN, 10, 60, 9, 0); - setAnimation(2, STATE_ATTACK_COOLDOWN, 10, -60, 9, 0); - setAnimation(3, STATE_ATTACK_COOLDOWN, 50, 90, 8, 0); - setAnimation(4, STATE_ATTACK_COOLDOWN, 50, -90, 8, 0); - setAnimation(5, STATE_ATTACK_COOLDOWN, -10, 90, 9, 0); - setAnimation(6, STATE_ATTACK_COOLDOWN, -10, -90, 9, 0); - - setAnimation(0, STATE_FLAME_BEGINNING, 50, 0, 8, 0.75F); - setAnimation(1, STATE_FLAME_BEGINNING, 30, 45, 9, 0.75F); - setAnimation(2, STATE_FLAME_BEGINNING, 30, -45, 9, 0.75F); - setAnimation(3, STATE_FLAME_BEGINNING, 50, 90, 8, 0.75F); - setAnimation(4, STATE_FLAME_BEGINNING, 50, -90, 8, 0.75F); - setAnimation(5, STATE_FLAME_BEGINNING, -10, 90, 9, 0.75F); - setAnimation(6, STATE_FLAME_BEGINNING, -10, -90, 9, 0.75F); - - setAnimation(0, STATE_FLAME_BREATHING, 45, 0, 8, 1); - setAnimation(1, STATE_FLAME_BREATHING, 30, 60, 9, 1); - setAnimation(2, STATE_FLAME_BREATHING, 30, -60, 9, 1); - setAnimation(3, STATE_FLAME_BREATHING, 50, 90, 8, 1); - setAnimation(4, STATE_FLAME_BREATHING, 50, -90, 8, 1); - setAnimation(5, STATE_FLAME_BREATHING, -10, 90, 9, 1); - setAnimation(6, STATE_FLAME_BREATHING, -10, -90, 9, 1); - - setAnimation(0, STATE_FLAME_ENDING, 60, 0, 7, 0); - setAnimation(1, STATE_FLAME_ENDING, 10, 45, 9, 0); - setAnimation(2, STATE_FLAME_ENDING, 10, -45, 9, 0); - setAnimation(3, STATE_FLAME_ENDING, 50, 90, 8, 0); - setAnimation(4, STATE_FLAME_ENDING, 50, -90, 8, 0); - setAnimation(5, STATE_FLAME_ENDING, -10, 90, 9, 0); - setAnimation(6, STATE_FLAME_ENDING, -10, -90, 9, 0); - - setAnimation(0, STATE_BITE_BEGINNING, -5, 60, 5, 0.25f); - setAnimation(1, STATE_BITE_BEGINNING, -10, 60, 9, 0.25f); - setAnimation(2, STATE_BITE_BEGINNING, -10, -60, 9, 0.25f); - - setAnimation(0, STATE_BITE_READY, -5, 60, 5, 1); - setAnimation(1, STATE_BITE_READY, -10, 60, 9, 1); - setAnimation(2, STATE_BITE_READY, -10, -60, 9, 1); - - setAnimation(0, STATE_BITE_BITING, -5, -30, 5, 0.2F); - setAnimation(1, STATE_BITE_BITING, -10, -30, 5, 0.2F); - setAnimation(2, STATE_BITE_BITING, -10, 30, 5, 0.2F); - - setAnimation(0, STATE_BITE_ENDING, 60, 0, 7, 0); - setAnimation(1, STATE_BITE_ENDING, -10, 60, 9, 0); - setAnimation(2, STATE_BITE_ENDING, -10, -60, 9, 0); - - setAnimation(0, STATE_MORTAR_BEGINNING, 50, 0, 8, 0.75F); - setAnimation(1, STATE_MORTAR_BEGINNING, 30, 45, 9, 0.75F); - setAnimation(2, STATE_MORTAR_BEGINNING, 30, -45, 9, 0.75F); - setAnimation(3, STATE_MORTAR_BEGINNING, 50, 90, 8, 0.75F); - setAnimation(4, STATE_MORTAR_BEGINNING, 50, -90, 8, 0.75F); - setAnimation(5, STATE_MORTAR_BEGINNING, -10, 90, 9, 0.75F); - setAnimation(6, STATE_MORTAR_BEGINNING, -10, -90, 9, 0.75F); - - setAnimation(0, STATE_MORTAR_LAUNCH, 45, 0, 8, 1); - setAnimation(1, STATE_MORTAR_LAUNCH, 30, 60, 9, 1); - setAnimation(2, STATE_MORTAR_LAUNCH, 30, -60, 9, 1); - setAnimation(3, STATE_MORTAR_LAUNCH, 50, 90, 8, 1); - setAnimation(4, STATE_MORTAR_LAUNCH, 50, -90, 8, 1); - setAnimation(5, STATE_MORTAR_LAUNCH, -10, 90, 9, 1); - setAnimation(6, STATE_MORTAR_LAUNCH, -10, -90, 9, 1); - - setAnimation(0, STATE_MORTAR_ENDING, 60, 0, 7, 0); - setAnimation(1, STATE_MORTAR_ENDING, 10, 45, 9, 0); - setAnimation(2, STATE_MORTAR_ENDING, 10, -45, 9, 0); - setAnimation(3, STATE_MORTAR_ENDING, 50, 90, 8, 0); - setAnimation(4, STATE_MORTAR_ENDING, 50, -90, 8, 0); - setAnimation(5, STATE_MORTAR_ENDING, -10, 90, 9, 0); - setAnimation(6, STATE_MORTAR_ENDING, -10, -90, 9, 0); - - setAnimation(0, STATE_DYING, -20, 0, 7, 0); - setAnimation(1, STATE_DYING, -20, 60, 9, 0); - setAnimation(2, STATE_DYING, -20, -60, 9, 0); - setAnimation(3, STATE_DYING, -20, 90, 8, 0); - setAnimation(4, STATE_DYING, -20, -90, 8, 0); - setAnimation(5, STATE_DYING, -10, 90, 9, 0); - setAnimation(6, STATE_DYING, -10, -90, 9, 0); - - setAnimation(0, STATE_DEAD, 0, 179, 4, 0); - setAnimation(1, STATE_DEAD, 0, 179, 4, 0); - setAnimation(2, STATE_DEAD, 0, -180, 4, 0); - setAnimation(3, STATE_DEAD, 0, 179, 4, 0); - setAnimation(4, STATE_DEAD, 0, -180, 4, 0); - setAnimation(5, STATE_DEAD, 0, 179, 4, 0); - setAnimation(6, STATE_DEAD, 0, -180, 4, 0); - - setAnimation(0, STATE_BORN, 60, 0, 7, 0); - setAnimation(1, STATE_BORN, 10, 60, 9, 0); - setAnimation(2, STATE_BORN, 10, -60, 9, 0); - setAnimation(3, STATE_BORN, 50, 90, 8, 0); - setAnimation(4, STATE_BORN, 50, -90, 8, 0); - setAnimation(5, STATE_BORN, -10, 90, 9, 0); - setAnimation(6, STATE_BORN, -10, -90, 9, 0); - - setAnimation(0, STATE_ROAR_START, 60, 0, 7, 0.25F); - setAnimation(1, STATE_ROAR_START, 10, 60, 9, 0.25F); - setAnimation(2, STATE_ROAR_START, 10, -60, 9, 0.25F); - setAnimation(3, STATE_ROAR_START, 50, 90, 8, 0.25F); - setAnimation(4, STATE_ROAR_START, 50, -90, 8, 0.25F); - setAnimation(5, STATE_ROAR_START, -10, 90, 9, 0.25F); - setAnimation(6, STATE_ROAR_START, -10, -90, 9, 0.25F); - - setAnimation(0, STATE_ROAR_RAWR, 60, 0, 9, 1); - setAnimation(1, STATE_ROAR_RAWR, 10, 60, 11, 1); - setAnimation(2, STATE_ROAR_RAWR, 10, -60, 11, 1); - setAnimation(3, STATE_ROAR_RAWR, 50, 90, 10, 1); - setAnimation(4, STATE_ROAR_RAWR, 50, -90, 10, 1); - setAnimation(5, STATE_ROAR_RAWR, -10, 90, 11, 1); - setAnimation(6, STATE_ROAR_RAWR, -10, -90, 11, 1); - - - } - - protected void setAnimation(int head, int state, float xRotation, float yRotation, float neckLength, float mouthOpen) - { - this.stateXRotations[head][state] = xRotation; - this.stateYRotations[head][state] = yRotation; - this.stateNeckLength[head][state] = neckLength; - this.stateMouthOpen[head][state] = mouthOpen; // this doesn't really need to be set per-head, more per-state - } - - public EntityTFHydraNeck[] getNeckArray() - { - return new EntityTFHydraNeck[] { necka, neckb, neckc, neckd, necke }; + this.setAnimation(0, State.IDLE, 60, 0, 7, 0); + this.setAnimation(1, State.IDLE, 10, 60, 9, 0); + this.setAnimation(2, State.IDLE, 10, -60, 9, 0); + this.setAnimation(3, State.IDLE, 50, 90, 8, 0); + this.setAnimation(4, State.IDLE, 50, -90, 8, 0); + this.setAnimation(5, State.IDLE, -10, 90, 9, 0); + this.setAnimation(6, State.IDLE, -10, -90, 9, 0); + + this.setAnimation(0, State.ATTACK_COOLDOWN, 60, 0, 7, 0); + this.setAnimation(1, State.ATTACK_COOLDOWN, 10, 60, 9, 0); + this.setAnimation(2, State.ATTACK_COOLDOWN, 10, -60, 9, 0); + this.setAnimation(3, State.ATTACK_COOLDOWN, 50, 90, 8, 0); + this.setAnimation(4, State.ATTACK_COOLDOWN, 50, -90, 8, 0); + this.setAnimation(5, State.ATTACK_COOLDOWN, -10, 90, 9, 0); + this.setAnimation(6, State.ATTACK_COOLDOWN, -10, -90, 9, 0); + + this.setAnimation(0, State.FLAME_BEGINNING, 50, 0, 8, 0.75F); + this.setAnimation(1, State.FLAME_BEGINNING, 30, 45, 9, 0.75F); + this.setAnimation(2, State.FLAME_BEGINNING, 30, -45, 9, 0.75F); + this.setAnimation(3, State.FLAME_BEGINNING, 50, 90, 8, 0.75F); + this.setAnimation(4, State.FLAME_BEGINNING, 50, -90, 8, 0.75F); + this.setAnimation(5, State.FLAME_BEGINNING, -10, 90, 9, 0.75F); + this.setAnimation(6, State.FLAME_BEGINNING, -10, -90, 9, 0.75F); + + this.setAnimation(0, State.FLAMING, 45, 0, 8, 1); + this.setAnimation(1, State.FLAMING, 30, 60, 9, 1); + this.setAnimation(2, State.FLAMING, 30, -60, 9, 1); + this.setAnimation(3, State.FLAMING, 50, 90, 8, 1); + this.setAnimation(4, State.FLAMING, 50, -90, 8, 1); + this.setAnimation(5, State.FLAMING, -10, 90, 9, 1); + this.setAnimation(6, State.FLAMING, -10, -90, 9, 1); + + this.setAnimation(0, State.FLAME_ENDING, 60, 0, 7, 0); + this.setAnimation(1, State.FLAME_ENDING, 10, 45, 9, 0); + this.setAnimation(2, State.FLAME_ENDING, 10, -45, 9, 0); + this.setAnimation(3, State.FLAME_ENDING, 50, 90, 8, 0); + this.setAnimation(4, State.FLAME_ENDING, 50, -90, 8, 0); + this.setAnimation(5, State.FLAME_ENDING, -10, 90, 9, 0); + this.setAnimation(6, State.FLAME_ENDING, -10, -90, 9, 0); + + this.setAnimation(0, State.BITE_BEGINNING, -5, 60, 5, 0.25f); + this.setAnimation(1, State.BITE_BEGINNING, -10, 60, 9, 0.25f); + this.setAnimation(2, State.BITE_BEGINNING, -10, -60, 9, 0.25f); + + this.setAnimation(0, State.BITE_READY, -5, 60, 5, 1); + this.setAnimation(1, State.BITE_READY, -10, 60, 9, 1); + this.setAnimation(2, State.BITE_READY, -10, -60, 9, 1); + + this.setAnimation(0, State.BITING, -5, -30, 5, 0.2F); + this.setAnimation(1, State.BITING, -10, -30, 5, 0.2F); + this.setAnimation(2, State.BITING, -10, 30, 5, 0.2F); + + this.setAnimation(0, State.BITE_ENDING, 60, 0, 7, 0); + this.setAnimation(1, State.BITE_ENDING, -10, 60, 9, 0); + this.setAnimation(2, State.BITE_ENDING, -10, -60, 9, 0); + + this.setAnimation(0, State.MORTAR_BEGINNING, 50, 0, 8, 0.75F); + this.setAnimation(1, State.MORTAR_BEGINNING, 30, 45, 9, 0.75F); + this.setAnimation(2, State.MORTAR_BEGINNING, 30, -45, 9, 0.75F); + this.setAnimation(3, State.MORTAR_BEGINNING, 50, 90, 8, 0.75F); + this.setAnimation(4, State.MORTAR_BEGINNING, 50, -90, 8, 0.75F); + this.setAnimation(5, State.MORTAR_BEGINNING, -10, 90, 9, 0.75F); + this.setAnimation(6, State.MORTAR_BEGINNING, -10, -90, 9, 0.75F); + + this.setAnimation(0, State.MORTAR_SHOOTING, 45, 0, 8, 1); + this.setAnimation(1, State.MORTAR_SHOOTING, 30, 60, 9, 1); + this.setAnimation(2, State.MORTAR_SHOOTING, 30, -60, 9, 1); + this.setAnimation(3, State.MORTAR_SHOOTING, 50, 90, 8, 1); + this.setAnimation(4, State.MORTAR_SHOOTING, 50, -90, 8, 1); + this.setAnimation(5, State.MORTAR_SHOOTING, -10, 90, 9, 1); + this.setAnimation(6, State.MORTAR_SHOOTING, -10, -90, 9, 1); + + this.setAnimation(0, State.MORTAR_ENDING, 60, 0, 7, 0); + this.setAnimation(1, State.MORTAR_ENDING, 10, 45, 9, 0); + this.setAnimation(2, State.MORTAR_ENDING, 10, -45, 9, 0); + this.setAnimation(3, State.MORTAR_ENDING, 50, 90, 8, 0); + this.setAnimation(4, State.MORTAR_ENDING, 50, -90, 8, 0); + this.setAnimation(5, State.MORTAR_ENDING, -10, 90, 9, 0); + this.setAnimation(6, State.MORTAR_ENDING, -10, -90, 9, 0); + + this.setAnimation(0, State.DYING, -20, 0, 7, 0); + this.setAnimation(1, State.DYING, -20, 60, 9, 0); + this.setAnimation(2, State.DYING, -20, -60, 9, 0); + this.setAnimation(3, State.DYING, -20, 90, 8, 0); + this.setAnimation(4, State.DYING, -20, -90, 8, 0); + this.setAnimation(5, State.DYING, -10, 90, 9, 0); + this.setAnimation(6, State.DYING, -10, -90, 9, 0); + + this.setAnimation(0, State.DEAD, 0, 179, 4, 0); + this.setAnimation(1, State.DEAD, 0, 179, 4, 0); + this.setAnimation(2, State.DEAD, 0, -180, 4, 0); + this.setAnimation(3, State.DEAD, 0, 179, 4, 0); + this.setAnimation(4, State.DEAD, 0, -180, 4, 0); + this.setAnimation(5, State.DEAD, 0, 179, 4, 0); + this.setAnimation(6, State.DEAD, 0, -180, 4, 0); + + this.setAnimation(0, State.BORN, 60, 0, 7, 0); + this.setAnimation(1, State.BORN, 10, 60, 9, 0); + this.setAnimation(2, State.BORN, 10, -60, 9, 0); + this.setAnimation(3, State.BORN, 50, 90, 8, 0); + this.setAnimation(4, State.BORN, 50, -90, 8, 0); + this.setAnimation(5, State.BORN, -10, 90, 9, 0); + this.setAnimation(6, State.BORN, -10, -90, 9, 0); + + this.setAnimation(0, State.ROAR_START, 60, 0, 7, 0.25F); + this.setAnimation(1, State.ROAR_START, 10, 60, 9, 0.25F); + this.setAnimation(2, State.ROAR_START, 10, -60, 9, 0.25F); + this.setAnimation(3, State.ROAR_START, 50, 90, 8, 0.25F); + this.setAnimation(4, State.ROAR_START, 50, -90, 8, 0.25F); + this.setAnimation(5, State.ROAR_START, -10, 90, 9, 0.25F); + this.setAnimation(6, State.ROAR_START, -10, -90, 9, 0.25F); + + this.setAnimation(0, State.ROAR_RAWR, 60, 0, 9, 1); + this.setAnimation(1, State.ROAR_RAWR, 10, 60, 11, 1); + this.setAnimation(2, State.ROAR_RAWR, 10, -60, 11, 1); + this.setAnimation(3, State.ROAR_RAWR, 50, 90, 10, 1); + this.setAnimation(4, State.ROAR_RAWR, 50, -90, 10, 1); + this.setAnimation(5, State.ROAR_RAWR, -10, 90, 11, 1); + this.setAnimation(6, State.ROAR_RAWR, -10, -90, 11, 1); + } + + private void setAnimation(int head, State state, float xRotation, float yRotation, float neckLength, float mouthOpen) { + this.stateXRotations[head].put(state, xRotation); + this.stateYRotations[head].put(state, yRotation); + this.stateNeckLength[head].put(state, neckLength); + this.stateMouthOpen[head].put(state, mouthOpen); // this doesn't really need to be set per-head, more per-state + } + + public HydraNeck[] getNeckArray() { + return new HydraNeck[]{this.necka, this.neckb, this.neckc, this.neckd, this.necke}; } /** * Called once per tick as part of the hydra entity update loop. */ - public void onUpdate() { - + public void tick() { + + this.headEntity.tick(); // neck updates - necka.onUpdate(); - neckb.onUpdate(); - neckc.onUpdate(); - neckd.onUpdate(); - necke.onUpdate(); - - // check if the head is here - if (headEntity == null) - { - headEntity = findNearbyHead("head" + headNum); - } - + this.necka.tick(); + this.neckb.tick(); + this.neckc.tick(); + this.neckd.tick(); + this.necke.tick(); + // adjust for difficulty setDifficultyVariables(); - if (headEntity != null) - { + // only actually do these things on the server + if (!this.hydra.getLevel().isClientSide()) { // make sure this is set up - headEntity.width = headEntity.height = this.isActive() ? 4.0F : 1.0F; - - // only actually do these things on the server - if (!hydraObj.worldObj.isRemote) - { - advanceRespawnCounter(); - - advanceHeadState(); - - setHeadPosition(); - - setHeadFacing(); - - executeAttacks(); - } - else - { - clientAnimateHeadDeath(); - } - - setNeckPosition(); - - addMouthParticles(); - - playSounds(); - + if (this.isActive() && this.headEntity.dimensions.width == 0) { + this.headEntity.activate(); + this.necka.activate(); + this.neckb.activate(); + this.neckc.activate(); + this.neckd.activate(); + this.necke.activate(); + } else if (!this.isActive() && this.headEntity.dimensions.width > 0) { + this.headEntity.deactivate(); + this.necka.deactivate(); + this.neckb.deactivate(); + this.neckc.deactivate(); + this.neckd.deactivate(); + this.necke.deactivate(); + } + this.advanceRespawnCounter(); + this.advanceHeadState(); + this.setHeadPosition(); + this.setHeadFacing(); + this.executeAttacks(); + this.playSounds(); + } else { + this.clientAnimateHeadDeath(); + this.addMouthParticles(); } + + this.setNeckPosition(); } - /** - * If we are dead, decrement the respawn counter and respawn when it is empty. - */ - protected void advanceRespawnCounter() { - if (this.currentState == STATE_DEAD && respawnCounter > -1) - { - if (--this.respawnCounter <= 0) - { - this.setNextState(STATE_BORN); + public boolean canRespawn() { + return this.currentState == State.DEAD && this.respawnCounter == -1; + } + + private void advanceRespawnCounter() { + if (this.currentState == State.DEAD && this.respawnCounter > -1) { + if (--this.respawnCounter <= 0) { + this.setNextState(State.BORN); this.damageTaken = 0; this.endCurrentAction(); this.respawnCounter = -1; @@ -400,342 +387,251 @@ protected void advanceRespawnCounter() { } } - /** - * We need to animate head death on the client - */ - protected void clientAnimateHeadDeath() { - // this will start the animation - if (headEntity.getState() == HydraHeadContainer.STATE_DYING) - { - // several things, like head visibility animate off this - this.headEntity.deathTime++; - - // make explosion particles and stuff - if (headEntity.deathTime > 0) - { - if (headEntity.deathTime < 20) - { - doExplosionOn(headEntity, true); - } - else if (headEntity.deathTime < 30) - { - doExplosionOn(necka, false); - } - else if (headEntity.deathTime < 40) - { - doExplosionOn(neckb, false); - } - else if (headEntity.deathTime < 50) - { - doExplosionOn(neckc, false); - } - else if (headEntity.deathTime < 60) - { - doExplosionOn(neckd, false); - } - else if (headEntity.deathTime < 70) - { - doExplosionOn(necke, false); - } - } - - // turn necks red - necka.hurtTime = 20; - neckb.hurtTime = 20; - neckc.hurtTime = 20; - neckd.hurtTime = 20; - necke.hurtTime = 20; - - } - else - { - this.headEntity.deathTime = 0; - this.headEntity.setHealth((float) this.headEntity.getEntityAttribute(SharedMonsterAttributes.maxHealth).getBaseValue()); - } + private void clientAnimateHeadDeath() { + // this will start the animation + if (this.headEntity.getState() == State.DYING) { + // several things, like head visibility animate off this + this.headEntity.deathTime++; + + // make explosion particles and stuff + if (this.headEntity.deathTime > 0) { + if (this.headEntity.deathTime < 20) { + this.doExplosionOn(this.headEntity, true); + } else if (this.headEntity.deathTime < 30) { + this.doExplosionOn(this.necka, false); + } else if (this.headEntity.deathTime < 40) { + this.doExplosionOn(this.neckb, false); + } else if (this.headEntity.deathTime < 50) { + this.doExplosionOn(this.neckc, false); + } else if (this.headEntity.deathTime < 60) { + this.doExplosionOn(this.neckd, false); + } else if (this.headEntity.deathTime < 70) { + this.doExplosionOn(this.necke, false); + } + } + + // turn necks red + this.necka.hurtTime = 20; + this.neckb.hurtTime = 20; + this.neckc.hurtTime = 20; + this.neckd.hurtTime = 20; + this.necke.hurtTime = 20; + + } else { + this.headEntity.deathTime = 0; + this.headEntity.health = this.headEntity.maxHealth; + } } - private void doExplosionOn(EntityTFHydraPart part, boolean large) { - for (int i = 0; i < 10; ++i) - { - double var8 = part.getRNG().nextGaussian() * 0.02D; - double var4 = part.getRNG().nextGaussian() * 0.02D; - double var6 = part.getRNG().nextGaussian() * 0.02D; - String particle = large && part.getRNG().nextInt(5) == 0 ? "largeexplode" : "explode"; - part.worldObj.spawnParticle(particle, part.posX + part.getRNG().nextFloat() * part.width * 2.0F - part.width, part.posY + part.getRNG().nextFloat() * part.height, part.posZ + part.getRNG().nextFloat() * part.width * 2.0F - part.width, var8, var4, var6); - } - + private void doExplosionOn(HydraPart part, boolean large) { + for (int i = 0; i < 5; ++i) { + double vx = part.getLevel().getRandom().nextGaussian() * 0.02D; + double vy = part.getLevel().getRandom().nextGaussian() * 0.02D; + double vz = part.getLevel().getRandom().nextGaussian() * 0.02D; + part.getLevel().addParticle((part.getLevel().getRandom().nextInt(5) == 0 || large ? ParticleTypes.EXPLOSION : ParticleTypes.POOF), part.getX() + part.getLevel().getRandom().nextFloat() * 2.0F, part.getY() + part.getLevel().getRandom().nextFloat() * 2.0F, part.getZ() + part.getLevel().getRandom().nextFloat() * 2.0F, vx, vy, vz); + } } - /** - * Move the state counter along - * This is only called on the server, the client just receives the resulting data - */ - protected void advanceHeadState() { + private void advanceHeadState() { // check head state - if (++ticksProgress >= this.ticksNeeded) - { - int myNext; - + if (++this.ticksProgress >= this.ticksNeeded) { + State myNext; + // advance state - if (this.nextState == NEXT_AUTOMATIC) - { - myNext = nextStates[this.currentState]; - if (myNext != currentState) - { - //System.out.println("Automatically advancing head " + this.headNum + " to state " + myNext); - + if (this.nextState == NEXT_AUTOMATIC) { + myNext = State.NEXT_STATE.get(this.currentState); + if (myNext != this.currentState) { // when returning from a secondary attack, no attack cooldown - if (this.isSecondaryAttacking && myNext == HydraHeadContainer.STATE_ATTACK_COOLDOWN) - { + if (this.isSecondaryAttacking && myNext == State.ATTACK_COOLDOWN) { this.isSecondaryAttacking = false; - myNext = HydraHeadContainer.STATE_IDLE; + myNext = State.IDLE; } } - } - else - { + } else { myNext = this.nextState; this.nextState = NEXT_AUTOMATIC; - //System.out.println("Manually advancing head " + this.headNum + " to state " + myNext); } - - this.ticksNeeded = this.ticksProgress = stateDurations[myNext]; + + this.ticksNeeded = myNext.duration; this.ticksProgress = 0; - + this.prevState = this.currentState; this.currentState = myNext; } // set datawatcher so client can properly animate - if (headEntity.getState() != this.currentState) - { - headEntity.setState(this.currentState); + if (this.headEntity.getState() != this.currentState) { + this.headEntity.setState(this.currentState); } - } - /** - * Set the direction the head is facing. It mostly faces the targetEntity, but that depends on the state - */ - protected void setHeadFacing() { - if (this.currentState == HydraHeadContainer.STATE_BITE_READY) - { + private void setHeadFacing() { + if (this.currentState == State.BITE_READY) { // face target within certain constraints - this.faceEntity(targetEntity, 5F, hydraObj.getVerticalFaceSpeed()); - + this.faceEntity(this.targetEntity, 5.0F, this.hydra.getMaxHeadXRot()); + // head 0 and 1 max yaw - float biteMaxYaw = -60; - float biteMinYaw = -90; - - if (headNum == 2) - { + float biteMaxYaw = -60.0F; + float biteMinYaw = -90.0F; + + if (this.headNum == 2) { // head 2 max/min yaw biteMaxYaw = 60; biteMinYaw = 90; } - float yawOffOffset = MathHelper.wrapAngleTo180_float(headEntity.rotationYaw - hydraObj.renderYawOffset); - - //System.out.println("biting head yaw = " + yawOffOffset); - - if (yawOffOffset > biteMaxYaw) - { - headEntity.rotationYaw = hydraObj.renderYawOffset + biteMaxYaw; + float yawOffOffset = Mth.wrapDegrees(this.headEntity.getYRot() - this.hydra.yBodyRot); + + if (yawOffOffset > biteMaxYaw) { + this.headEntity.setYRot(this.hydra.yBodyRot + biteMaxYaw); } - if (yawOffOffset < biteMinYaw) - { - headEntity.rotationYaw = hydraObj.renderYawOffset + biteMinYaw; + if (yawOffOffset < biteMinYaw) { + this.headEntity.setYRot(this.hydra.yBodyRot + biteMinYaw); } - + // make the target vector be a point off in the distance in the direction we're already facing - Vec3 look = this.headEntity.getLookVec(); + Vec3 look = this.headEntity.getLookAngle(); double distance = 16.0D; - this.targetX = headEntity.posX + look.xCoord * distance; - this.targetY = headEntity.posY + 1.5 + look.yCoord * distance; - this.targetZ = headEntity.posZ + look.zCoord * distance; - } - else if (this.currentState == HydraHeadContainer.STATE_BITE_BITING || this.currentState == HydraHeadContainer.STATE_BITE_ENDING) - { - this.faceEntity(targetEntity, 5F, hydraObj.getVerticalFaceSpeed()); - headEntity.rotationPitch += Math.PI / 4; - } - else if (this.currentState == HydraHeadContainer.STATE_ROAR_RAWR) - { + this.targetX = this.headEntity.getX() + look.x() * distance; + this.targetY = this.headEntity.getY() + 1.5 + look.y() * distance; + this.targetZ = this.headEntity.getZ() + look.z() * distance; + + } else if (this.currentState == State.BITING || this.currentState == State.BITE_ENDING) { + this.faceEntity(this.targetEntity, 5.0F, hydra.getMaxHeadXRot()); + this.headEntity.setXRot((float) (this.headEntity.getXRot() + Math.PI / 4.0F)); + + } else if (this.currentState == State.ROAR_RAWR) { // keep facing target vector, don't move - this.faceVec(this.targetX, this.targetY, this.targetZ, 10F, hydraObj.getVerticalFaceSpeed()); - } - else if (this.currentState == HydraHeadContainer.STATE_FLAME_BREATHING || (this.currentState == HydraHeadContainer.STATE_FLAME_BEGINNING)) - { + this.faceVec(this.targetX, this.targetY, this.targetZ, 10.0F, this.hydra.getMaxHeadXRot()); + + } else if (this.currentState == State.FLAMING || this.currentState == State.FLAME_BEGINNING) { // move flame breath slowly towards the player - moveTargetCoordsTowardsTargetEntity(FLAME_BREATH_TRACKING_SPEED); + this.moveTargetCoordsTowardsTargetEntity(FLAME_BREATH_TRACKING_SPEED); // face the target coordinates - this.faceVec(this.targetX, this.targetY, this.targetZ, 5F, hydraObj.getVerticalFaceSpeed()); - } - else { - if (this.isActive()) - { - if (this.targetEntity != null) - { + this.faceVec(this.targetX, this.targetY, this.targetZ, 5.0F, this.hydra.getMaxHeadXRot()); + + } else { + if (this.isActive()) { + if (this.targetEntity != null) { // watch the target entity - this.faceEntity(targetEntity, 5F, hydraObj.getVerticalFaceSpeed()); - } - else - { + this.faceEntity(this.targetEntity, 5.0F, this.hydra.getMaxHeadXRot()); + } else { // while idle, look where the body is looking? - faceIdle(1.5F, hydraObj.getVerticalFaceSpeed()); + this.faceIdle(1.5F, this.hydra.getMaxHeadXRot()); } } } } - /** - * Slowly track our target coords towards the target entity - */ - protected void moveTargetCoordsTowardsTargetEntity(double distance) - { - if (this.targetEntity != null) - { - Vec3 vect = Vec3.createVectorHelper(this.targetEntity.posX - this.targetX, this.targetEntity.posY - this.targetY, this.targetEntity.posZ - this.targetZ); + private void moveTargetCoordsTowardsTargetEntity(double distance) { + if (this.targetEntity != null) { + Vec3 vect = new Vec3(this.targetEntity.getX() - this.targetX, this.targetEntity.getY() - this.targetY, this.targetEntity.getZ() - this.targetZ); vect = vect.normalize(); - this.targetX += vect.xCoord * distance; - this.targetY += vect.yCoord * distance; - this.targetZ += vect.zCoord * distance; + this.targetX += vect.x() * distance; + this.targetY += vect.y() * distance; + this.targetZ += vect.z() * distance; } } - /** - * During certain states, animate particles coming out of the mouth - */ - protected void addMouthParticles() { - Vec3 vector = headEntity.getLookVec(); - + private void addMouthParticles() { + Vec3 vector = this.headEntity.getLookAngle(); + double dist = 3.5; - double px = headEntity.posX + vector.xCoord * dist; - double py = headEntity.posY + 1 + vector.yCoord * dist; - double pz = headEntity.posZ + vector.zCoord * dist; - - //hydraObj.worldObj.spawnParticle("mobSpell", px, py, pz, 0.3, 0.9, 0.1); - - if (headEntity.getState() == STATE_FLAME_BEGINNING) - { - headEntity.worldObj.spawnParticle("flame", px + headEntity.getRNG().nextDouble() - 0.5, py + headEntity.getRNG().nextDouble() - 0.5, pz + headEntity.getRNG().nextDouble() - 0.5, 0, 0, 0); - headEntity.worldObj.spawnParticle("smoke", px + headEntity.getRNG().nextDouble() - 0.5, py + headEntity.getRNG().nextDouble() - 0.5, pz + headEntity.getRNG().nextDouble() - 0.5, 0, 0, 0); + double px = this.headEntity.getX() + vector.x() * dist; + double py = this.headEntity.getY() + 1.0D + vector.y() * dist; + double pz = this.headEntity.getZ() + vector.z() * dist; + + if (this.headEntity.getState() == State.FLAME_BEGINNING) { + this.headEntity.getLevel().addAlwaysVisibleParticle(ParticleTypes.FLAME, px + this.headEntity.getLevel().getRandom().nextDouble() - 0.5, py + this.headEntity.getLevel().getRandom().nextDouble() - 0.5, pz + this.headEntity.getLevel().getRandom().nextDouble() - 0.5, 0, 0, 0); + this.headEntity.getLevel().addAlwaysVisibleParticle(ParticleTypes.SMOKE, px + this.headEntity.getLevel().getRandom().nextDouble() - 0.5, py + this.headEntity.getLevel().getRandom().nextDouble() - 0.5, pz + this.headEntity.getLevel().getRandom().nextDouble() - 0.5, 0, 0, 0); } - - if (headEntity.getState() == STATE_FLAME_BREATHING) - { - Vec3 look = headEntity.getLookVec(); - for (int i = 0; i < 5; i++) - { - double dx = look.xCoord; - double dy = look.yCoord; - double dz = look.zCoord; - - double spread = 5 + headEntity.getRNG().nextDouble() * 2.5; - double velocity = 1.0 + headEntity.getRNG().nextDouble(); - + + if (this.headEntity.getState() == State.FLAMING) { + Vec3 look = this.headEntity.getLookAngle(); + for (int i = 0; i < 5; i++) { + double dx = look.x(); + double dy = look.y(); + double dz = look.z(); + + double spread = 5.0D + this.headEntity.getLevel().getRandom().nextDouble() * 2.5D; + double velocity = 1.0D + this.headEntity.getLevel().getRandom().nextDouble(); + // spread flame - dx += headEntity.getRNG().nextGaussian() * 0.007499999832361937D * spread; - dy += headEntity.getRNG().nextGaussian() * 0.007499999832361937D * spread; - dz += headEntity.getRNG().nextGaussian() * 0.007499999832361937D * spread; - dx *= velocity; - dy *= velocity; - dz *= velocity; - - TwilightForestMod.proxy.spawnParticle(headEntity.worldObj, "largeflame", px, py, pz, dx, dy, dz); + dx += this.headEntity.getLevel().getRandom().nextGaussian() * 0.0075D * spread; + dy += this.headEntity.getLevel().getRandom().nextGaussian() * 0.0075D * spread; + dz += this.headEntity.getLevel().getRandom().nextGaussian() * 0.0075D * spread; + dx *= velocity; + dy *= velocity; + dz *= velocity; + + this.headEntity.getLevel().addAlwaysVisibleParticle(TFParticleType.LARGE_FLAME.get(), px, py, pz, dx, dy, dz); } } - - if (headEntity.getState() == STATE_BITE_BEGINNING || headEntity.getState() == STATE_BITE_READY) - { - headEntity.worldObj.spawnParticle("splash", px + headEntity.getRNG().nextDouble() - 0.5, py + headEntity.getRNG().nextDouble() - 0.5, pz + headEntity.getRNG().nextDouble() - 0.5, 0, 0, 0); + + if (this.headEntity.getState() == State.BITE_BEGINNING || this.headEntity.getState() == State.BITE_READY) { + this.headEntity.getLevel().addAlwaysVisibleParticle(ParticleTypes.SPLASH, px + this.headEntity.getLevel().getRandom().nextDouble() - 0.5, py + this.headEntity.getLevel().getRandom().nextDouble() - 0.5, pz + this.headEntity.getLevel().getRandom().nextDouble() - 0.5, 0, 0, 0); } - - if (headEntity.getState() == STATE_MORTAR_BEGINNING) - { - headEntity.worldObj.spawnParticle("largesmoke", px + headEntity.getRNG().nextDouble() - 0.5, py + headEntity.getRNG().nextDouble() - 0.5, pz + headEntity.getRNG().nextDouble() - 0.5, 0, 0, 0); + + if (this.headEntity.getState() == State.MORTAR_BEGINNING) { + this.headEntity.getLevel().addAlwaysVisibleParticle(ParticleTypes.LARGE_SMOKE, px + this.headEntity.getLevel().getRandom().nextDouble() - 0.5, py + this.headEntity.getLevel().getRandom().nextDouble() - 0.5, pz + this.headEntity.getLevel().getRandom().nextDouble() - 0.5, 0, 0, 0); } } - /** - * Generate any sounds we need to go along with head animations - */ - protected void playSounds() { - if (headEntity.getState() == STATE_FLAME_BREATHING && headEntity.ticksExisted % 5 == 0) - { + private void playSounds() { + if (this.headEntity.getState() == State.FLAMING && this.headEntity.tickCount % 5 == 0) { // fire breathing! - headEntity.worldObj.playSoundEffect(headEntity.posX + 0.5, headEntity.posY + 0.5, headEntity.posZ + 0.5, "mob.ghast.fireball", 0.5F + headEntity.getRNG().nextFloat(), headEntity.getRNG().nextFloat() * 0.7F + 0.3F); + this.headEntity.playSound(TFSounds.HYDRA_SHOOT_FIRE.get(), 0.5F + this.headEntity.getLevel().getRandom().nextFloat(), this.headEntity.getLevel().getRandom().nextFloat() * 0.7F + 0.3F); + this.headEntity.gameEvent(GameEvent.PROJECTILE_SHOOT); } - if (headEntity.getState() == STATE_ROAR_RAWR) - { - headEntity.worldObj.playSoundEffect(headEntity.posX + 0.5, headEntity.posY + 0.5, headEntity.posZ + 0.5, TwilightForestMod.ID + ":mob.hydra.roar", 1.25F, headEntity.getRNG().nextFloat() * 0.3F + 0.7F); + if (this.headEntity.getState() == State.ROAR_RAWR) { + this.headEntity.playSound(TFSounds.HYDRA_ROAR.get(), 1.25F, this.headEntity.getLevel().getRandom().nextFloat() * 0.3F + 0.7F); + this.headEntity.gameEvent(GameEvent.ENTITY_ROAR); } - if (headEntity.getState() == STATE_BITE_READY && this.ticksProgress == 60) - { - headEntity.worldObj.playSoundEffect(headEntity.posX + 0.5, headEntity.posY + 0.5, headEntity.posZ + 0.5, TwilightForestMod.ID + ":mob.hydra.warn", 2.0F, headEntity.getRNG().nextFloat() * 0.3F + 0.7F); - } - if (headEntity.getState() == STATE_IDLE) - { - this.didRoar = false; + if (this.headEntity.getState() == State.BITE_READY && this.ticksProgress == 60) { + this.headEntity.playSound(TFSounds.HYDRA_WARN.get(), 2.0F, this.headEntity.getLevel().getRandom().nextFloat() * 0.3F + 0.7F); } } - /** - * Put the neck entities into the proper place, based on the body and head positions - * Done on both server and client. - */ protected void setNeckPosition() { // set neck positions Vec3 vector = null; float neckRotation = 0; - - if (headNum == 0) - { - vector = Vec3.createVectorHelper(0, 3, -1); + + if (this.headNum == 0) { + vector = new Vec3(0, 3, -1); neckRotation = 0; } - if (headNum == 1) - { - vector = Vec3.createVectorHelper(-1, 3, 3); + if (this.headNum == 1) { + vector = new Vec3(-1, 3, 3); neckRotation = 90; } - if (headNum == 2) - { - vector = Vec3.createVectorHelper(1, 3, 3); + if (this.headNum == 2) { + vector = new Vec3(1, 3, 3); neckRotation = -90; } - if (headNum == 3) - { - vector = Vec3.createVectorHelper(-1, 3, 3); + if (this.headNum == 3) { + vector = new Vec3(-1, 3, 3); neckRotation = 135; } - if (headNum == 4) - { - vector = Vec3.createVectorHelper(1, 3, 3); + if (this.headNum == 4) { + vector = new Vec3(1, 3, 3); neckRotation = -135; } - - if (headNum == 5) - { - vector = Vec3.createVectorHelper(-1, 3, 5); + + if (this.headNum == 5) { + vector = new Vec3(-1, 3, 5); neckRotation = 135; } - if (headNum == 6) - { - vector = Vec3.createVectorHelper(1, 3, 5); + if (this.headNum == 6) { + vector = new Vec3(1, 3, 5); neckRotation = -135; } - - - vector.rotateAroundY((-(hydraObj.renderYawOffset + neckRotation) * 3.141593F) / 180F); - setNeckPositon(hydraObj.posX + vector.xCoord, hydraObj.posY + vector.yCoord, hydraObj.posZ + vector.zCoord, hydraObj.renderYawOffset, 0); + + vector = vector.yRot((-(this.hydra.yBodyRot + neckRotation) * Mth.PI) / 180.0F); + this.setNeckPosition(this.hydra.getX() + vector.x(), this.hydra.getY() + vector.y(), this.hydra.getZ() + vector.z(), this.hydra.yBodyRot); } - /** - * Position the head object appropriately - * This is only called on the server, the client just receives the resulting data - */ protected void setHeadPosition() { // set head positions Vec3 vector; @@ -744,460 +640,343 @@ protected void setHeadPosition() { // head1 is above // head2 is to the right // head3 is to the left - setupStateDurations(); - setupStateRotations(); // temporary, for debugging - - float neckLength = getCurrentNeckLength(); - float xRotation = getCurrentHeadXRotation(); - float yRotation = getCurrentHeadYRotation(); - - - float periodX = (headNum == 0 || headNum == 3) ? 20F : ((headNum == 1 || headNum == 4) ? 5.0f : 7.0F); - float periodY = (headNum == 0 || headNum == 4) ? 10F : ((headNum == 1 || headNum == 6) ? 6.0f : 5.0F); - - float xSwing = MathHelper.sin(hydraObj.ticksExisted / periodX) * 3.0F; - float ySwing = MathHelper.sin(hydraObj.ticksExisted / periodY) * 5.0F; - - if (!this.isActive()) - { + //setupStateRotations(); // temporary, for debugging + + float neckLength = this.getCurrentNeckLength(); + float xRotation = this.getCurrentHeadXRotation(); + float yRotation = this.getCurrentHeadYRotation(); + + + float periodX = (this.headNum == 0 || this.headNum == 3) ? 20F : ((this.headNum == 1 || this.headNum == 4) ? 5.0f : 7.0F); + float periodY = (this.headNum == 0 || this.headNum == 4) ? 10F : ((this.headNum == 1 || this.headNum == 6) ? 6.0f : 5.0F); + + float xSwing = Mth.sin(this.hydra.tickCount / periodX) * 3.0F; + float ySwing = Mth.sin(this.hydra.tickCount / periodY) * 5.0F; + + if (!this.isActive()) { xSwing = ySwing = 0; } - - vector = Vec3.createVectorHelper(0, 0, neckLength); // -53 = 3.3125 - vector.rotateAroundX((xRotation * 3.141593F + xSwing) / 180F); - vector.rotateAroundY((-(hydraObj.renderYawOffset + yRotation + ySwing) * 3.141593F) / 180F); - - dx = hydraObj.posX + vector.xCoord; - dy = hydraObj.posY + vector.yCoord + 3; - dz = hydraObj.posZ + vector.zCoord; - - headEntity.setPosition(dx, dy, dz); - headEntity.setMouthOpen(getCurrentMouthOpen()); - + + vector = new Vec3(0, 0, neckLength); // -53 = 3.3125 + vector = vector.xRot((xRotation * Mth.PI + xSwing) / 180.0F); + vector = vector.yRot((-(this.hydra.yBodyRot + yRotation + ySwing) * Mth.PI) / 180.0F); + + dx = this.hydra.getX() + vector.x(); + dy = this.hydra.getY() + vector.y() + 3; + dz = this.hydra.getZ() + vector.z(); + + this.headEntity.setPos(dx, dy, dz); + this.headEntity.setMouthOpen(getCurrentMouthOpen()); } - /** - * Execute whatever effect we need. Deal damage with the bite, the breath weapon, or launch mortars when appropriate - */ - @SuppressWarnings("unchecked") - protected void executeAttacks() - { - if (this.currentState == HydraHeadContainer.STATE_MORTAR_LAUNCH && this.ticksProgress % 10 == 0) - { - Entity lookTarget = getHeadLookTarget(); - - if (lookTarget != null && (lookTarget instanceof EntityTFHydraPart || lookTarget instanceof EntityDragonPart)) - { - // stop hurting yourself! - this.endCurrentAction(); + private void executeAttacks() { + if (this.currentState == State.MORTAR_SHOOTING && this.ticksProgress % 10 == 0) { + HydraMortar mortar = new HydraMortar(TFEntities.HYDRA_MORTAR.get(), this.headEntity.getLevel(), this.headEntity); + + // launch blasting mortars if the player is hiding + if (this.targetEntity != null && !this.headEntity.canEntityBeSeen(this.targetEntity)) { + mortar.setToBlasting(); } - else - { - EntityTFHydraMortar mortar = new EntityTFHydraMortar(headEntity.worldObj, this.headEntity); - - Vec3 vector = headEntity.getLookVec(); - - double dist = 3.5; - double px = headEntity.posX + vector.xCoord * dist; - double py = headEntity.posY + 1 + vector.yCoord * dist; - double pz = headEntity.posZ + vector.zCoord * dist; - - mortar.setLocationAndAngles(px, py, pz, 0, 0); - - // launch blasting mortars if the player is hiding - if (this.targetEntity != null && !headEntity.canEntityBeSeen(this.targetEntity)) - { - //System.out.println("Launching blasting mortar at hiding target."); - mortar.setToBlasting(); - } - headEntity.worldObj.playAuxSFXAtEntity((EntityPlayer)null, 1008, (int)headEntity.posX, (int)headEntity.posY, (int)headEntity.posZ, 0); + this.headEntity.playSound(TFSounds.HYDRA_SHOOT.get(), 10.0F, (this.headEntity.getLevel().getRandom().nextFloat() - this.headEntity.getLevel().getRandom().nextFloat()) * 0.2F + 1.0F); + this.headEntity.getLevel().addFreshEntity(mortar); + + } + if (this.headEntity.getState() == State.BITING) { + // damage nearby things + List nearbyList = this.headEntity.getLevel().getEntities(this.headEntity, this.headEntity.getBoundingBox().inflate(0.0, 1.0, 0.0)); + + for (Entity nearby : nearbyList) { + if (nearby instanceof LivingEntity living && nearby != this.hydra) { + //is a player holding a shield? Let's do some extra stuff! + if (nearby instanceof Player player && player.isUsingItem() && player.getUseItem().getItem().canPerformAction(player.getUseItem(), ToolActions.SHIELD_BLOCK)) { + if (!player.getCooldowns().isOnCooldown(player.getUseItem().getItem())) { + //cause severe damage and play a shatter sound + this.headEntity.getLevel().playSound(null, player.blockPosition(), player.getUseItem().is(Items.SHIELD) ? TFSounds.WOOD_SHIELD_SHATTERS.get() : TFSounds.METAL_SHIELD_SHATTERS.get(), SoundSource.PLAYERS, 1.0F, player.getVoicePitch()); + player.getUseItem().hurtAndBreak(112, player, event -> event.broadcastBreakEvent(player.getUsedItemHand())); + } + //add cooldown and knockback + player.getCooldowns().addCooldown(player.getUseItem().getItem(), 200); + TFPacketHandler.CHANNEL.send(PacketDistributor.PLAYER.with(() -> (ServerPlayer) player), new ThrowPlayerPacket(-this.headEntity.getDirection().getStepX() * 0.5F, 0.15F, -this.headEntity.getDirection().getStepZ() * 0.5F)); + } + + // bite it! + nearby.hurt(TFDamageTypes.getDamageSource(living.getLevel(), TFDamageTypes.HYDRA_BITE, TFEntities.HYDRA.get()), BITE_DAMAGE); - headEntity.worldObj.spawnEntityInWorld(mortar); + //knockback! + if (living instanceof Player player) { + TFPacketHandler.CHANNEL.send(PacketDistributor.PLAYER.with(() -> (ServerPlayer) player), new ThrowPlayerPacket(-this.headEntity.getDirection().getStepX() * 0.5F, 0.1F, -this.headEntity.getDirection().getStepZ() * 0.5F)); + } else { + living.knockback(-this.headEntity.getDirection().getStepX(), 0.1F, -this.headEntity.getDirection().getStepZ()); + } + } } } - if (headEntity.getState() == STATE_BITE_BITING) - { - // damage nearby things - List nearbyList = headEntity.worldObj.getEntitiesWithinAABBExcludingEntity(headEntity, headEntity.boundingBox.expand(0.0, 1.0, 0.0)); - - for (Entity nearby : nearbyList) - { - if (nearby instanceof EntityLivingBase && !(nearby instanceof EntityTFHydraPart) && !(nearby instanceof EntityTFHydra) && !(nearby instanceof EntityDragonPart)) - { - // bite it! - nearby.attackEntityFrom(DamageSource.causeMobDamage(hydraObj), BITE_DAMAGE); - } - } - } - - if (headEntity.getState() == STATE_FLAME_BREATHING) - { - Entity target = getHeadLookTarget(); - - if (target != null) - { - if (target instanceof EntityTFHydraPart || target instanceof EntityDragonPart) - { - // stop hurting yourself! - this.endCurrentAction(); - - //System.out.println("Stopping breath from head " + headNum + " because I am about to hit" + target); - } - else if (!target.isImmuneToFire() && target.attackEntityFrom(DamageSource.inFire, FLAME_DAMAGE)) - { - target.setFire(FLAME_BURN_FACTOR); - } - } - } + if (this.headEntity.getState() == State.FLAMING) { + Entity target = getHeadLookTarget(); + + if (target != null && target != this.headEntity.getParent() && (!(target instanceof HydraPart) || ((HydraPart) target).getParent() != this.headEntity.getParent())) { + if (!target.fireImmune() && target.hurt(TFDamageTypes.getDamageSource(target.getLevel(), TFDamageTypes.HYDRA_FIRE, TFEntities.HYDRA.get()), FLAME_DAMAGE)) { + target.setSecondsOnFire(FLAME_BURN_FACTOR); + } + } + } } - - protected void setDifficultyVariables() { - if (this.hydraObj.worldObj.difficultySetting != EnumDifficulty.HARD) - { + private void setDifficultyVariables() { + if (this.hydra.getLevel().getDifficulty() != Difficulty.HARD) { HydraHeadContainer.FLAME_BREATH_TRACKING_SPEED = 0.04D; - - } - else - { + } else { // hard mode! HydraHeadContainer.FLAME_BREATH_TRACKING_SPEED = 0.1D; // higher is harder } - } - /** - * What, if anything, is the head currently looking at? - */ - @SuppressWarnings("unchecked") + // TODO this seems copied from somewhere? + @SuppressWarnings("ConstantConditions") + @Nullable private Entity getHeadLookTarget() { Entity pointedEntity = null; double range = 30.0D; - Vec3 srcVec = Vec3.createVectorHelper(headEntity.posX, headEntity.posY + 1.0, headEntity.posZ); - Vec3 lookVec = headEntity.getLook(1.0F); - Vec3 destVec = srcVec.addVector(lookVec.xCoord * range, lookVec.yCoord * range, lookVec.zCoord * range); - float var9 = 3.0F; - List possibleList = headEntity.worldObj.getEntitiesWithinAABBExcludingEntity(headEntity, headEntity.boundingBox.addCoord(lookVec.xCoord * range, lookVec.yCoord * range, lookVec.zCoord * range).expand(var9, var9, var9)); - double hitDist = 0; - - for (Entity possibleEntity : possibleList) - { - if (possibleEntity.canBeCollidedWith() && possibleEntity != headEntity && possibleEntity != necka && possibleEntity != neckb && possibleEntity != neckc) - { - float borderSize = possibleEntity.getCollisionBorderSize(); - AxisAlignedBB collisionBB = possibleEntity.boundingBox.expand((double)borderSize, (double)borderSize, (double)borderSize); - MovingObjectPosition interceptPos = collisionBB.calculateIntercept(srcVec, destVec); - - if (collisionBB.isVecInside(srcVec)) - { - if (0.0D < hitDist || hitDist == 0.0D) - { - pointedEntity = possibleEntity; - hitDist = 0.0D; - } - } - else if (interceptPos != null) - { - double possibleDist = srcVec.distanceTo(interceptPos.hitVec); - - if (possibleDist < hitDist || hitDist == 0.0D) - { - pointedEntity = possibleEntity; - hitDist = possibleDist; - } - } - } - } + Vec3 srcVec = new Vec3(this.headEntity.getX(), this.headEntity.getY() + 1.0, this.headEntity.getZ()); + Vec3 lookVec = this.headEntity.getViewVector(1.0F); + BlockHitResult raytrace = this.headEntity.getLevel().clip(new ClipContext(srcVec, srcVec.add(lookVec.x() * range, lookVec.y() * range, lookVec.z() * range), ClipContext.Block.OUTLINE, ClipContext.Fluid.ANY, this.headEntity)); + BlockPos hitpos = raytrace != null ? raytrace.getBlockPos() : null; + double rx = hitpos == null ? range : Math.min(range, Math.abs(this.headEntity.getX() - hitpos.getX())); + double ry = hitpos == null ? range : Math.min(range, Math.abs(this.headEntity.getY() - hitpos.getY())); + double rz = hitpos == null ? range : Math.min(range, Math.abs(this.headEntity.getZ() - hitpos.getZ())); + Vec3 destVec = srcVec.add(lookVec.x() * range, lookVec.y() * range, lookVec.z() * range); + float var9 = 3.0F; + List possibleList = this.headEntity.getLevel().getEntities(this.headEntity, this.headEntity.getBoundingBox().move(lookVec.x() * rx, lookVec.y() * ry, lookVec.z() * rz).inflate(var9, var9, var9)); + double hitDist = 0; + + for (Entity possibleEntity : possibleList) { + if (possibleEntity.isPickable() && possibleEntity != this.headEntity && possibleEntity != this.necka && possibleEntity != this.neckb && possibleEntity != this.neckc) { + float borderSize = possibleEntity.getPickRadius(); + AABB collisionBB = possibleEntity.getBoundingBox().inflate(borderSize, borderSize, borderSize); + Optional interceptPos = collisionBB.clip(srcVec, destVec); + + if (collisionBB.contains(srcVec)) { + if (0.0D < hitDist || hitDist == 0.0D) { + pointedEntity = possibleEntity; + hitDist = 0.0D; + } + } else if (interceptPos.isPresent()) { + double possibleDist = srcVec.distanceTo(interceptPos.get()); + + if (possibleDist < hitDist || hitDist == 0.0D) { + pointedEntity = possibleEntity; + hitDist = possibleDist; + } + } + } + } return pointedEntity; } - - /** - * What state should we go to next? - */ - public void setNextState(int next) - { + + public void setNextState(State next) { this.nextState = next; } - - /** - * - */ - public void endCurrentAction() - { + + public void endCurrentAction() { this.ticksProgress = this.ticksNeeded; } - - /** - * Search for nearby heads with the string as their name - */ - @SuppressWarnings("unchecked") - private EntityTFHydraHead findNearbyHead(String string) - { - - List nearbyHeads = hydraObj.worldObj.getEntitiesWithinAABB(EntityTFHydraHead.class, AxisAlignedBB.getBoundingBox(hydraObj.posX, hydraObj.posY, hydraObj.posZ, hydraObj.posX + 1, hydraObj.posY + 1, hydraObj.posZ + 1).expand(16.0D, 16.0D, 16.0D)); - - for (EntityTFHydraHead nearbyHead : nearbyHeads) - { - - if (nearbyHead.getPartName().equals(string)) { - nearbyHead.hydraObj = hydraObj; - - //System.out.println("Reconnected hydra with head named " + string + " in world " + hydraObj.worldObj); - - return nearbyHead; - } - - } - //System.out.println("Did not find head named " + string); - return null; - } - - /** - * The current neck length depends on the current state, and how far along are we from the previous state - * Other factors include which head it is. - */ - protected float getCurrentNeckLength() - { - float prevLength = stateNeckLength[this.headNum][this.prevState]; - float curLength = stateNeckLength[this.headNum][this.currentState]; - float progress = (float)ticksProgress / (float)ticksNeeded; + private float getCurrentNeckLength() { + float prevLength = this.stateNeckLength[this.headNum].get(this.prevState); + float curLength = this.stateNeckLength[this.headNum].get(this.currentState); + float progress = (float) this.ticksProgress / (float) this.ticksNeeded; - return prevLength + (curLength - prevLength) * progress; + return Mth.clampedLerp(prevLength, curLength, progress); } - - /** - * The current x rotation depends on the current state, and how far along are we from the previous state - * Other factors include which head it is. - */ - protected float getCurrentHeadXRotation() - { - float prevRotation = stateXRotations[this.headNum][this.prevState]; - float currentRotation = stateXRotations[this.headNum][this.currentState]; - float progress = (float)ticksProgress / (float)ticksNeeded; - return prevRotation + (currentRotation - prevRotation) * progress; + private float getCurrentHeadXRotation() { + float prevRotation = this.stateXRotations[this.headNum].get(this.prevState); + float currentRotation = this.stateXRotations[this.headNum].get(this.currentState); + float progress = (float) this.ticksProgress / (float) this.ticksNeeded; + + return Mth.clampedLerp(prevRotation, currentRotation, progress); } - - protected float getCurrentHeadYRotation() - { - float prevRotation = stateYRotations[this.headNum][this.prevState]; - float currentRotation = stateYRotations[this.headNum][this.currentState]; - float progress = (float)ticksProgress / (float)ticksNeeded; + private float getCurrentHeadYRotation() { + float prevRotation = this.stateYRotations[this.headNum].get(this.prevState); + float currentRotation = this.stateYRotations[this.headNum].get(this.currentState); + float progress = (float) this.ticksProgress / (float) this.ticksNeeded; - return prevRotation + (currentRotation - prevRotation) * progress; + return Mth.clampedLerp(prevRotation, currentRotation, progress); } + protected float getCurrentMouthOpen() { + float prevOpen = this.stateMouthOpen[this.headNum].get(this.prevState); + float curOpen = this.stateMouthOpen[this.headNum].get(this.currentState); + float progress = (float) this.ticksProgress / (float) this.ticksNeeded; - protected float getCurrentMouthOpen() - { - float prevOpen = stateMouthOpen[this.headNum][this.prevState]; - float curOpen = stateMouthOpen[this.headNum][this.currentState]; - float progress = (float)ticksProgress / (float)ticksNeeded; - - return prevOpen + (curOpen - prevOpen) * progress; + return Mth.clampedLerp(prevOpen, curOpen, progress); } /** * Sets the four neck positions ranging from the start position to the head position. - * - * @param hi head index - * @param startX - * @param startY - * @param startZ - * @param startYaw - * @param startPitch */ - protected void setNeckPositon(double startX, double startY, double startZ, float startYaw, float startPitch) { - - double endX = headEntity.posX; - double endY = headEntity.posY; - double endZ = headEntity.posZ; - float endYaw = headEntity.rotationYaw; - float endPitch = headEntity.rotationPitch; - - for (; startYaw - endYaw < -180F; endYaw -= 360F) { } - for (; startYaw - endYaw >= 180F; endYaw += 360F) { } - for (; startPitch - endPitch < -180F; endPitch -= 360F) { } - for (; startPitch - endPitch >= 180F; endPitch += 360F) { } - - + protected void setNeckPosition(double startX, double startY, double startZ, float startYaw) { + + double endX = this.headEntity.getX(); + double endY = this.headEntity.getY(); + double endZ = this.headEntity.getZ(); + float endYaw = this.headEntity.getYRot(); + float endPitch = this.headEntity.getXRot(); + + for (; startYaw - endYaw < -180F; endYaw -= 360F) { + } + for (; startYaw - endYaw >= 180F; endYaw += 360F) { + } + for (; 0.0F - endPitch < -180F; endPitch -= 360F) { + } + for (; 0.0F - endPitch >= 180F; endPitch += 360F) { + } + // translate the end position back 1 unit - if (endPitch > 0) - { + if (endPitch > 0) { // if we are looking down, don't raise the first neck position, it looks weird - Vec3 vector = Vec3.createVectorHelper(0, 0, -1.0); - vector.rotateAroundY((-endYaw * 3.141593F) / 180F); - endX += vector.xCoord; - endY += vector.yCoord; - endZ += vector.zCoord; - } - else - { + Vec3 vector = new Vec3(0.0D, 0.0D, -1.0D).yRot((-endYaw * 3.141593F) / 180.0F); + endX += vector.x(); + endY += vector.y(); + endZ += vector.z(); + } else { // but if we are looking up, lower it or it goes through the crest - Vec3 vector = headEntity.getLookVec(); + Vec3 vector = this.headEntity.getLookAngle(); float dist = 1.0f; - - endX -= vector.xCoord * dist; - endY -= vector.yCoord * dist; - endZ -= vector.zCoord * dist; - } - + endX -= vector.x() * dist; + endY -= vector.y() * dist; + endZ -= vector.z() * dist; - float factor = 0F; + } - factor = 0.00F; - necka.setPosition(endX + (startX - endX) * factor, endY + (startY - endY) * factor, endZ + (startZ - endZ) * factor); - necka.rotationYaw = endYaw + (startYaw - endYaw) * factor; - necka.rotationPitch = endPitch + (startPitch - endPitch) * factor; + float factor; - factor = 0.25F; - neckb.setPosition(endX + (startX - endX) * factor, endY + (startY - endY) * factor, endZ + (startZ - endZ) * factor); - neckb.rotationYaw = endYaw + (startYaw - endYaw) * factor; - neckb.rotationPitch = endPitch + (startPitch - endPitch) * factor; + factor = 0.00F; + this.necka.setPos(endX + (startX - endX) * factor, endY + (startY - endY) * factor, endZ + (startZ - endZ) * factor); + this.necka.setYRot(endYaw + (startYaw - endYaw) * factor); + this.necka.setXRot(endPitch + ((float) 0 - endPitch) * factor); - factor = 0.50F; - neckc.setPosition(endX + (startX - endX) * factor, endY + (startY - endY) * factor, endZ + (startZ - endZ) * factor); - neckc.rotationYaw = endYaw + (startYaw - endYaw) * factor; - neckc.rotationPitch = endPitch + (startPitch - endPitch) * factor; + factor = 0.25F; + this.neckb.setPos(endX + (startX - endX) * factor, endY + (startY - endY) * factor, endZ + (startZ - endZ) * factor); + this.neckb.setYRot(endYaw + (startYaw - endYaw) * factor); + this.neckb.setXRot(endPitch + ((float) 0 - endPitch) * factor); - factor = 0.75F; - neckd.setPosition(endX + (startX - endX) * factor, endY + (startY - endY) * factor, endZ + (startZ - endZ) * factor); - neckd.rotationYaw = endYaw + (startYaw - endYaw) * factor; - neckd.rotationPitch = endPitch + (startPitch - endPitch) * factor; + factor = 0.50F; + this.neckc.setPos(endX + (startX - endX) * factor, endY + (startY - endY) * factor, endZ + (startZ - endZ) * factor); + this.neckc.setYRot(endYaw + (startYaw - endYaw) * factor); + this.neckc.setXRot(endPitch + ((float) 0 - endPitch) * factor); - factor = 1.0F; - necke.setPosition(endX + (startX - endX) * factor, endY + (startY - endY) * factor, endZ + (startZ - endZ) * factor); - necke.rotationYaw = endYaw + (startYaw - endYaw) * factor; - necke.rotationPitch = endPitch + (startPitch - endPitch) * factor; + factor = 0.75F; + this.neckd.setPos(endX + (startX - endX) * factor, endY + (startY - endY) * factor, endZ + (startZ - endZ) * factor); + this.neckd.setYRot(endYaw + (startYaw - endYaw) * factor); + this.neckd.setXRot(endPitch + ((float) 0 - endPitch) * factor); + factor = 1.0F; + this.necke.setPos(endX + (startX - endX) * factor, endY + (startY - endY) * factor, endZ + (startZ - endZ) * factor); + this.necke.setYRot(endYaw + (startYaw - endYaw) * factor); + this.necke.setXRot(endPitch + ((float) 0 - endPitch) * factor); } - - /** - * Face a vector in front of the hydra entity. - * This is used to give the heads something to look at when we don't have an acutal target. - */ - protected void faceIdle(float yawConstraint, float pitchConstraint) { - //headEntity.rotationPitch = hydraObj.rotationPitch; - //headEntity.rotationYaw = hydraObj.rotationYaw; - - float angle = (((hydraObj.rotationYaw) * 3.141593F) / 180F); + + private void faceIdle(float yawConstraint, float pitchConstraint) { + float angle = (((this.hydra.getYRot()) * 3.141593F) / 180F); float distance = 30.0F; - double dx = hydraObj.posX - MathHelper.sin(angle) * distance; - double dy = hydraObj.posY + 3.0; - double dz = hydraObj.posZ + MathHelper.cos(angle) * distance; - - faceVec(dx, dy, dz, yawConstraint, pitchConstraint); + double dx = this.hydra.getX() - Mth.sin(angle) * distance; + double dy = this.hydra.getY() + 3.0; + double dz = this.hydra.getZ() + Mth.cos(angle) * distance; + + faceVec(dx, dy, dz, yawConstraint, pitchConstraint); } - /** - * Face this head towards an entity - */ public void faceEntity(Entity entity, float yawConstraint, float pitchConstraint) { double yTarget; - if (entity instanceof EntityLivingBase) - { - EntityLivingBase entityliving = (EntityLivingBase)entity; - yTarget = entityliving.posY + entityliving.getEyeHeight(); - } - else - { - yTarget = (entity.boundingBox.minY + entity.boundingBox.maxY) / 2D; - } - - faceVec(entity.posX, yTarget, entity.posZ, yawConstraint, pitchConstraint); - - // let's just set the target vector here - this.targetX = entity.posX; - this.targetY = entity.posY; - this.targetZ = entity.posZ; + if (entity instanceof LivingEntity entityliving) { + yTarget = entityliving.getY() + entityliving.getEyeHeight(); + } else { + yTarget = (entity.getBoundingBox().minY + entity.getBoundingBox().maxY) / 2D; + } + + faceVec(entity.getX(), yTarget, entity.getZ(), yawConstraint, pitchConstraint); + + // let's just set the target vector here + this.targetX = entity.getX(); + this.targetY = entity.getY(); + this.targetZ = entity.getZ(); } - - /** - * Face this head towards a specific Vector - */ - public void faceVec(double xCoord, double yCoord, double zCoord, float yawConstraint, float pitchConstraint) { - double xOffset = xCoord - headEntity.posX; - double zOffset = zCoord - headEntity.posZ; - double yOffset = (headEntity.posY + 1.0) - yCoord; - - double distance = MathHelper.sqrt_double(xOffset * xOffset + zOffset * zOffset); - float xyAngle = (float)((Math.atan2(zOffset, xOffset) * 180D) / Math.PI) - 90F; - float zdAngle = (float)(-((Math.atan2(yOffset, distance) * 180D) / Math.PI)); - headEntity.rotationPitch = -updateRotation(headEntity.rotationPitch, zdAngle, pitchConstraint); - headEntity.rotationYaw = updateRotation(headEntity.rotationYaw, xyAngle, yawConstraint); - -// System.out.println("Updating head " + head + " with rotationPitch " + head.rotationPitch); -// System.out.println("Updating head " + head + " with rotationYaw " + head.rotationYaw); + private void faceVec(double x, double y, double z, float yawConstraint, float pitchConstraint) { + double xOffset = x - this.headEntity.getX(); + double zOffset = z - this.headEntity.getZ(); + double yOffset = (this.headEntity.getY() + 1.0) - y; + + double distance = Mth.sqrt((float) (xOffset * xOffset + zOffset * zOffset)); + float xyAngle = (float) ((Math.atan2(zOffset, xOffset) * 180D) / Math.PI) - 90F; + float zdAngle = (float) (-((Math.atan2(yOffset, distance) * 180D) / Math.PI)); + this.headEntity.setXRot(-updateRotation(this.headEntity.getXRot(), zdAngle, pitchConstraint)); + this.headEntity.setYRot(updateRotation(this.headEntity.getYRot(), xyAngle, yawConstraint)); } - - /** - * Arguments: current rotation, intended rotation, max increment. - */ - private float updateRotation(float current, float intended, float increment) - { - float delta = MathHelper.wrapAngleTo180_float(intended - current); - - if (delta > increment) - { - delta = increment; - } - - if (delta < -increment) - { - delta = -increment; - } - - return MathHelper.wrapAngleTo180_float(current + delta); - } - - public Entity getTargetEntity() { - return targetEntity; + + private float updateRotation(float current, float intended, float increment) { + float delta = Mth.wrapDegrees(intended - current); + + if (delta > increment) { + delta = increment; + } + + if (delta < -increment) { + delta = -increment; + } + + return Mth.wrapDegrees(current + delta); } - public void setTargetEntity(Entity targetEntity) { + public void setTargetEntity(@Nullable Entity targetEntity) { this.targetEntity = targetEntity; } public void setHurtTime(int hurtTime) { - if (headEntity != null) { - headEntity.hurtTime = hurtTime; + if (this.headEntity != null) { + this.headEntity.hurtTime = hurtTime; } - necka.hurtTime = hurtTime; - neckb.hurtTime = hurtTime; - neckc.hurtTime = hurtTime; - neckd.hurtTime = hurtTime; - necke.hurtTime = hurtTime; - } - - /** - * At certain times, some of the heads are "dead" and hidden - */ - public boolean shouldRenderHead() - { - return this.headEntity.getState() != STATE_DEAD && this.headEntity.deathTime < 20; + this.necka.hurtTime = hurtTime; + this.neckb.hurtTime = hurtTime; + this.neckc.hurtTime = hurtTime; + this.neckd.hurtTime = hurtTime; + this.necke.hurtTime = hurtTime; } /** - * Same with the neck parts + * At certain times, some of the heads are "dead" and hidden */ - public boolean shouldRenderNeck(int neckNum) - { - int time = 30 + 10 * neckNum; - return this.headEntity.getState() != STATE_DEAD && this.headEntity.deathTime < time; + public boolean shouldRenderHead() { + return this.headEntity.getState() != State.DEAD && this.headEntity.deathTime < 20; } /** * Is this head active, that is, not dying or dead? */ public boolean isActive() { - return this.currentState != STATE_DYING && this.currentState != STATE_DEAD; + return this.currentState != State.DYING && this.currentState != State.DEAD; + } + + public boolean isIdle() { + return this.currentState == State.IDLE && (this.nextState == NEXT_AUTOMATIC || this.nextState == State.IDLE); + } + + public boolean isAttacking() { + return this.currentState == State.BITE_BEGINNING || this.currentState == State.BITE_READY + || this.currentState == State.BITING || this.currentState == State.FLAME_BEGINNING + || this.currentState == State.FLAMING || this.currentState == State.MORTAR_BEGINNING + || this.currentState == State.MORTAR_SHOOTING; + } + + public boolean isBiting() { + return this.currentState == State.BITE_BEGINNING || this.currentState == State.BITE_READY + || this.currentState == State.BITING || this.nextState == State.BITE_BEGINNING; } /** diff --git a/src/main/java/twilightforest/entity/boss/HydraMortar.java b/src/main/java/twilightforest/entity/boss/HydraMortar.java new file mode 100644 index 0000000000..cf7e223579 --- /dev/null +++ b/src/main/java/twilightforest/entity/boss/HydraMortar.java @@ -0,0 +1,183 @@ +package twilightforest.entity.boss; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.projectile.ThrowableProjectile; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Explosion; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.EntityHitResult; +import net.minecraft.world.phys.HitResult; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.event.ForgeEventFactory; +import twilightforest.data.tags.BlockTagGenerator; +import twilightforest.init.TFDamageTypes; +import twilightforest.init.TFEntities; + +public class HydraMortar extends ThrowableProjectile { + + private static final int BURN_FACTOR = 5; + private static final int DIRECT_DAMAGE = 18; + + public int fuse = 80; + private boolean megaBlast = false; + + public HydraMortar(EntityType type, Level world) { + super(type, world); + } + + public HydraMortar(EntityType type, Level world, HydraHead head) { + super(type, head.getParent(), world); + + Vec3 vector = head.getLookAngle(); + + double dist = 3.5; + double px = head.getX() + vector.x() * dist; + double py = head.getY() + 1 + vector.y() * dist; + double pz = head.getZ() + vector.z() * dist; + + this.moveTo(px, py, pz, 0, 0); + // these are being set to extreme numbers when we get here, why? + head.setDeltaMovement(Vec3.ZERO); + this.shootFromRotation(head, head.getXRot(), head.getYRot(), -20.0F, 0.5F, 1F); + + //TwilightForestMod.LOGGER.debug("Launching mortar! Current head motion is {}, {}", head.getDeltaMovement().x(), head.getDeltaMovement().z()); + } + + @Override + protected void defineSynchedData() { + + } + + @Override + public void tick() { + super.tick(); + + if (this.isOnGround()) { + this.getDeltaMovement().multiply(0.9D, 0.9D, 0.9D); + + if (!this.getLevel().isClientSide() && this.fuse-- <= 0) { + this.detonate(); + } + } + } + + public void setToBlasting() { + this.megaBlast = true; + } + + @Override + protected void onHitBlock(BlockHitResult result) { + super.onHitBlock(result); + if (!this.megaBlast) { + //if we hit a wall, explode + if (result.getDirection() != Direction.UP) this.detonate(); + // we hit the ground + this.setDeltaMovement(this.getDeltaMovement().x(), 0.0D, this.getDeltaMovement().z()); + this.onGround = true; + } else { + this.detonate(); + } + } + + @Override + protected void onHit(HitResult result) { + HitResult.Type hitresult$type = result.getType(); + if (hitresult$type == HitResult.Type.ENTITY) { + this.onHitEntity((EntityHitResult) result); + } else if (hitresult$type == HitResult.Type.BLOCK) { + this.onHitBlock((BlockHitResult) result); + } + } + + @Override + protected void onHitEntity(EntityHitResult result) { + Entity entity = result.getEntity(); + if (!this.getLevel().isClientSide() && this.getOwner() != null) { + if ((!(entity instanceof HydraMortar mortar) || mortar.getOwner().is(this.getOwner())) && !entity.is(this.getOwner()) && !this.isPartOfHydra(entity)) { + this.detonate(); + } + } + } + + private boolean isPartOfHydra(Entity entity) { + return this.getOwner() instanceof Hydra && entity instanceof HydraPart part && part.getParent().is(this.getOwner()); + } + + @Override + public float getBlockExplosionResistance(Explosion explosion, BlockGetter getter, BlockPos pos, BlockState state, FluidState fluid, float idk) { + float resistance = super.getBlockExplosionResistance(explosion, getter, pos, state, fluid, idk); + + if (this.megaBlast && !state.is(BlockTagGenerator.COMMON_PROTECTIONS)) { + resistance = Math.min(0.8F, resistance); + } + + return resistance; + } + + private void detonate() { + float explosionPower = megaBlast ? 4.0F : 0.1F; + boolean flag = ForgeEventFactory.getMobGriefingEvent(this.getLevel(), this); + this.getLevel().explode(this, this.getX(), this.getY(), this.getZ(), explosionPower, flag, Level.ExplosionInteraction.MOB); + + for (Entity nearby : this.getLevel().getEntities(this, this.getBoundingBox().inflate(1.0D, 1.0D, 1.0D))) { + if ((!nearby.fireImmune() || nearby instanceof Hydra || nearby instanceof HydraPart) && nearby.hurt(TFDamageTypes.getDamageSource(this.getLevel(), TFDamageTypes.HYDRA_MORTAR, TFEntities.HYDRA.get()), DIRECT_DAMAGE)) { + nearby.setSecondsOnFire(BURN_FACTOR); + } + } + + this.discard(); + } + + @Override + public boolean hurt(DamageSource source, float amount) { + super.hurt(source, amount); + + if (source.getEntity() != null && !this.getLevel().isClientSide()) { + Vec3 vec3d = source.getEntity().getLookAngle(); + if (vec3d != null) { + // reflect faster and more accurately + this.shoot(vec3d.x(), vec3d.y(), vec3d.z(), 1.5F, 0.1F); // reflect faster and more accurately + this.onGround = false; + this.fuse += 20; + } + + if (source.getEntity() instanceof LivingEntity) { + this.setOwner(source.getEntity()); + } + return true; + } else { + return false; + } + } + + @Override + public boolean isOnFire() { + return true; + } + + @Override + public boolean isPickable() { + return true; + } + + /** + * We need to set this so that the player can attack and reflect the bolt + */ + @Override + public float getPickRadius() { + return 1.5F; + } + + @Override + protected float getGravity() { + return 0.05F; + } +} diff --git a/src/main/java/twilightforest/entity/boss/HydraNeck.java b/src/main/java/twilightforest/entity/boss/HydraNeck.java new file mode 100644 index 0000000000..0183cd7313 --- /dev/null +++ b/src/main/java/twilightforest/entity/boss/HydraNeck.java @@ -0,0 +1,23 @@ +package twilightforest.entity.boss; + +import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import twilightforest.TwilightForestMod; + +public class HydraNeck extends HydraPart { + + public static final ResourceLocation RENDERER = TwilightForestMod.prefix("hydra_neck"); + + public final HydraHead head; + + public HydraNeck(HydraHead head) { + super(head.getParent(), 2F, 2F); + this.head = head; + } + + @OnlyIn(Dist.CLIENT) + public ResourceLocation renderer() { + return RENDERER; + } +} diff --git a/src/main/java/twilightforest/entity/boss/HydraPart.java b/src/main/java/twilightforest/entity/boss/HydraPart.java new file mode 100644 index 0000000000..e50739943c --- /dev/null +++ b/src/main/java/twilightforest/entity/boss/HydraPart.java @@ -0,0 +1,126 @@ +package twilightforest.entity.boss; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.syncher.EntityDataAccessor; +import net.minecraft.network.syncher.EntityDataSerializers; +import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityDimensions; +import net.minecraft.world.level.ClipContext; +import net.minecraft.world.level.gameevent.GameEvent; +import net.minecraft.world.phys.HitResult; +import net.minecraft.world.phys.Vec3; +import twilightforest.entity.TFPart; + +public abstract class HydraPart extends TFPart { + + private static final EntityDataAccessor DATA_SIZEACTIVE = SynchedEntityData.defineId(HydraPart.class, EntityDataSerializers.BOOLEAN); + + final float maxHealth = 1000F; + float health = this.maxHealth; + + private EntityDimensions cacheSize; + + public HydraPart(Hydra hydra) { + super(hydra); + } + + @Override + protected void defineSynchedData() { + this.entityData.define(DATA_SIZEACTIVE, true); + } + + @Override + public void onSyncedDataUpdated(EntityDataAccessor accessor) { + super.onSyncedDataUpdated(accessor); + if (accessor == DATA_SIZEACTIVE) { + if (this.entityData.get(DATA_SIZEACTIVE)) + this.activate(); + else + this.deactivate(); + } + } + + // [VanillaCopy] from MobEntity + public boolean canEntityBeSeen(Entity entity) { + Vec3 vector3d = new Vec3(this.getX(), this.getEyeY(), this.getZ()); + Vec3 vector3d1 = new Vec3(entity.getX(), entity.getEyeY(), entity.getZ()); + return this.getLevel().clip(new ClipContext(vector3d, vector3d1, ClipContext.Block.COLLIDER, ClipContext.Fluid.NONE, this)).getType() == HitResult.Type.MISS; + } + + public HydraPart(Hydra parent, float width, float height) { + this(parent); + this.setSize(EntityDimensions.scalable(width, height)); + this.refreshDimensions(); + } + + @Override + protected void setSize(EntityDimensions size) { + super.setSize(size); + this.cacheSize = size; + } + + @Override + public void tick() { + clearFire(); + super.tick(); + + if (this.hurtTime > 0) + this.hurtTime--; + + if (this.health <= 0F) + this.deathTime++; + + } + + @Override + public boolean hurt(DamageSource source, float amount) { + boolean flag = this.getParent() != null && this.getParent().attackEntityFromPart(this, source, amount); + if (flag) { + this.gameEvent(GameEvent.ENTITY_DAMAGE); + } + return flag; + } + + @Override + protected void readAdditionalSaveData(CompoundTag compound) { + + } + + @Override + protected void addAdditionalSaveData(CompoundTag compound) { + + } + + @Override + public boolean is(Entity entity) { + return this == entity || this.getParent() == entity; + } + + @Override + protected void setRot(float yaw, float pitch) { + this.setYRot(yaw % 360.0F); + this.setXRot(pitch % 360.0F); + } + + @Override + protected boolean canRide(Entity entityIn) { + return false; + } + + @Override + public boolean canChangeDimensions() { + return false; + } + + public void activate() { + this.dimensions = this.cacheSize; + this.entityData.set(DATA_SIZEACTIVE, true); + } + + public void deactivate() { + this.dimensions = EntityDimensions.scalable(0, 0); + this.entityData.set(DATA_SIZEACTIVE, false); + } +} diff --git a/src/main/java/twilightforest/entity/boss/HydraSmallPart.java b/src/main/java/twilightforest/entity/boss/HydraSmallPart.java new file mode 100644 index 0000000000..06b25d63cc --- /dev/null +++ b/src/main/java/twilightforest/entity/boss/HydraSmallPart.java @@ -0,0 +1,8 @@ +package twilightforest.entity.boss; + +public class HydraSmallPart extends HydraPart { + + public HydraSmallPart(Hydra hydra, float w, float h) { + super(hydra, w, h); + } +} diff --git a/src/main/java/twilightforest/entity/boss/IBossLootBuffer.java b/src/main/java/twilightforest/entity/boss/IBossLootBuffer.java new file mode 100644 index 0000000000..cc38069418 --- /dev/null +++ b/src/main/java/twilightforest/entity/boss/IBossLootBuffer.java @@ -0,0 +1,100 @@ +package twilightforest.entity.boss; + +import it.unimi.dsi.fastutil.objects.ObjectArrayList; +import net.minecraft.Util; +import net.minecraft.core.BlockPos; +import net.minecraft.core.NonNullList; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.RandomSource; +import net.minecraft.world.Container; +import net.minecraft.world.ContainerHelper; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.LootTable; +import net.minecraft.world.phys.Vec3; +import twilightforest.init.TFSounds; +import twilightforest.loot.TFLootTables; + +import java.util.List; + +public interface IBossLootBuffer { + int CONTAINER_SIZE = 27; + + default ItemStack getItem(int slot) { + return this.getItemStacks().get(slot); + } + + default void setItem(int slot, ItemStack stack) { + this.getItemStacks().set(slot, stack); + if (!stack.isEmpty() && stack.getCount() > 64) { + stack.setCount(64); + } + } + + default void addDeathItemsSaveData(CompoundTag tag) { + ContainerHelper.saveAllItems(tag, this.getItemStacks()); + } + + default void readDeathItemsSaveData(CompoundTag tag) { + ContainerHelper.loadAllItems(tag, this.getItemStacks()); + } + + static void saveDropsIntoBoss(T boss, LootContext lootContext, ServerLevel serverLevel) { + LootTable table = serverLevel.getServer().getLootTables().get(boss.getLootTable()); + ObjectArrayList stacks = table.getRandomItems(lootContext); + boss.fill(lootContext, table); + + //If our loot stack size is bigger than the inventory, drop everything else outside it. Don't want to lose any loot now do we? + if (stacks.size() > CONTAINER_SIZE) { + for (ItemStack stack : stacks.subList(28, stacks.size())) { + ItemEntity item = new ItemEntity(serverLevel, boss.getX(), boss.getY(), boss.getZ(), stack); + item.setExtendedLifetime(); + item.setNoPickUpDelay(); + serverLevel.addFreshEntity(item); + } + } + } + + + static void depositDropsIntoChest(T boss, BlockState chest, BlockPos pos, ServerLevel serverLevel) { + if ((serverLevel.setBlock(pos, chest, TFLootTables.DEFAULT_PLACE_FLAG) || serverLevel.getBlockState(pos).is(chest.getBlock())) && serverLevel.getBlockEntity(pos) instanceof Container container) { + for (int i = 0; i < CONTAINER_SIZE && i < container.getContainerSize(); i++) { + container.setItem(i, boss.getItem(i)); + } + Vec3 vec3 = Vec3.atCenterOf(pos); + serverLevel.playSound(null, vec3.x, vec3.y, vec3.z, TFSounds.BOSS_CHEST_APPEAR.get(), boss.getSoundSource(), 128.0F, (boss.getRandom().nextFloat() - boss.getRandom().nextFloat()) * 0.175F + 0.5F); + } + } + + default void fill(LootContext context, LootTable table) { + ObjectArrayList items = table.getRandomItems(context); + RandomSource randomsource = context.getRandom(); + List list = this.getAvailableSlots(randomsource); + table.shuffleAndSplitItems(items, list.size(), randomsource); + + for(ItemStack itemstack : items) { + if (list.isEmpty()) { + return; + } + + if (itemstack.isEmpty()) { + this.setItem(list.remove(list.size() - 1), ItemStack.EMPTY); + } else { + this.setItem(list.remove(list.size() - 1), itemstack); + } + } + } + + default List getAvailableSlots(RandomSource random) { + ObjectArrayList arrayList = new ObjectArrayList<>(); + for(int i = 0; i < CONTAINER_SIZE; ++i) arrayList.add(i); + Util.shuffle(arrayList, random); + return arrayList; + } + + NonNullList getItemStacks(); +} diff --git a/src/main/java/twilightforest/entity/boss/KnightPhantom.java b/src/main/java/twilightforest/entity/boss/KnightPhantom.java new file mode 100644 index 0000000000..fc4f89536a --- /dev/null +++ b/src/main/java/twilightforest/entity/boss/KnightPhantom.java @@ -0,0 +1,570 @@ +package twilightforest.entity.boss; + +import com.google.common.collect.Lists; +import com.google.common.primitives.Ints; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.particles.ItemParticleOption; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.network.syncher.EntityDataAccessor; +import net.minecraft.network.syncher.EntityDataSerializers; +import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.server.level.ServerBossEvent; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.util.Mth; +import net.minecraft.util.RandomSource; +import net.minecraft.world.BossEvent; +import net.minecraft.world.Difficulty; +import net.minecraft.world.DifficultyInstance; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.damagesource.DamageTypes; +import net.minecraft.world.entity.*; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal; +import net.minecraft.world.entity.monster.Enemy; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.ServerLevelAccessor; +import net.minecraft.world.level.gameevent.GameEvent; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.fluids.FluidType; +import org.jetbrains.annotations.Nullable; +import twilightforest.advancements.TFAdvancements; +import twilightforest.entity.EnforcedHomePoint; +import twilightforest.entity.ai.control.NoClipMoveControl; +import twilightforest.entity.ai.goal.PhantomAttackStartGoal; +import twilightforest.entity.ai.goal.PhantomThrowWeaponGoal; +import twilightforest.entity.ai.goal.PhantomUpdateFormationAndMoveGoal; +import twilightforest.entity.ai.goal.PhantomWatchAndAttackGoal; +import twilightforest.init.*; +import twilightforest.loot.TFLootTables; +import twilightforest.util.EntityUtil; +import twilightforest.util.LandmarkUtil; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class KnightPhantom extends FlyingMob implements Enemy, EnforcedHomePoint { + + private static final EntityDataAccessor FLAG_CHARGING = SynchedEntityData.defineId(KnightPhantom.class, EntityDataSerializers.BOOLEAN); + private static final AttributeModifier CHARGING_MODIFIER = new AttributeModifier("Charging attack boost", 7, AttributeModifier.Operation.ADDITION); + private static final AttributeModifier NON_CHARGING_ARMOR_MODIFIER = new AttributeModifier("Inactive Armor boost", 4.0D, AttributeModifier.Operation.MULTIPLY_TOTAL); + + private final ServerBossEvent bossInfo = new ServerBossEvent(getDisplayName(), BossEvent.BossBarColor.WHITE, BossEvent.BossBarOverlay.PROGRESS); + + private int number; + private int totalKnownKnights = 1; + private int ticksProgress; + private Formation currentFormation; + private BlockPos chargePos = BlockPos.ZERO; + private final List hurtBy = new ArrayList<>(); + + public KnightPhantom(EntityType type, Level world) { + super(type, world); + this.noPhysics = true; + this.currentFormation = Formation.HOVER; + this.xpReward = 93; + this.moveControl = new NoClipMoveControl(this); + } + + @Override + public void setCustomName(@Nullable Component name) { + super.setCustomName(name); + this.bossInfo.setName(this.getDisplayName()); + } + + @Override + public void startSeenByPlayer(ServerPlayer player) { + super.startSeenByPlayer(player); + if (getNumber() == 0) + this.bossInfo.addPlayer(player); + } + + @Override + public void stopSeenByPlayer(ServerPlayer player) { + super.stopSeenByPlayer(player); + this.bossInfo.removePlayer(player); + } + + @Nullable + @Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor accessor, DifficultyInstance difficulty, MobSpawnType reason, @Nullable SpawnGroupData spawnDataIn, @Nullable CompoundTag dataTag) { + SpawnGroupData data = super.finalizeSpawn(accessor, difficulty, reason, spawnDataIn, dataTag); + this.populateDefaultEquipmentSlots(accessor.getRandom(), difficulty); + this.populateDefaultEquipmentEnchantments(accessor.getRandom(), difficulty); + this.getAttribute(Attributes.ARMOR).addTransientModifier(NON_CHARGING_ARMOR_MODIFIER); + return data; + } + + @Override + protected void populateDefaultEquipmentSlots(RandomSource random, DifficultyInstance difficulty) { + this.setItemSlot(EquipmentSlot.MAINHAND, new ItemStack(TFItems.KNIGHTMETAL_SWORD.get())); + this.setItemSlot(EquipmentSlot.CHEST, new ItemStack(TFItems.PHANTOM_CHESTPLATE.get())); + this.setItemSlot(EquipmentSlot.HEAD, new ItemStack(TFItems.PHANTOM_HELMET.get())); + } + + @Override + protected void defineSynchedData() { + super.defineSynchedData(); + this.entityData.define(FLAG_CHARGING, false); + } + + @Override + protected void registerGoals() { + this.goalSelector.addGoal(0, new PhantomWatchAndAttackGoal(this)); + this.goalSelector.addGoal(1, new PhantomUpdateFormationAndMoveGoal(this)); + this.goalSelector.addGoal(2, new PhantomAttackStartGoal(this)); + this.goalSelector.addGoal(3, new PhantomThrowWeaponGoal(this)); + + this.targetSelector.addGoal(0, new NearestAttackableTargetGoal<>(this, Player.class, false)); + } + + public static AttributeSupplier.Builder registerAttributes() { + return Mob.createMobAttributes() + .add(Attributes.MAX_HEALTH, 35.0D) + .add(Attributes.ATTACK_DAMAGE, 1.0D); + } + + public Formation getCurrentFormation() { + return this.currentFormation; + } + + public BlockPos getChargePos() { + return this.chargePos; + } + + public void setChargePos(BlockPos pos) { + this.chargePos = pos; + } + + @Override + public boolean removeWhenFarAway(double p_213397_1_) { + return false; + } + + @Override + public boolean isInvulnerableTo(DamageSource src) { + return src.is(DamageTypes.IN_WALL) || super.isInvulnerableTo(src); + } + + @Override + public void checkDespawn() { + if (this.getLevel().getDifficulty() == Difficulty.PEACEFUL) { + if (this.hasHome() && this.getNumber() == 0) { + this.getLevel().setBlockAndUpdate(getRestrictCenter(), TFBlocks.KNIGHT_PHANTOM_BOSS_SPAWNER.get().defaultBlockState()); + } + this.discard(); + } else { + super.checkDespawn(); + } + } + + @Override + public void aiStep() { + super.aiStep(); + + if (!this.getLevel().isClientSide() && getNumber() == 0) { + float health = 0F; + float maxHealth = 0F; + int amount = 0; + for (KnightPhantom nearbyKnight : getNearbyKnights()) { + health += nearbyKnight.getHealth(); + maxHealth += nearbyKnight.getMaxHealth(); + amount++; + } + int remaining = totalKnownKnights - amount; + if (remaining > 0) { + maxHealth += (getMaxHealth() * (float) remaining); + } + this.bossInfo.setProgress(health / maxHealth); + } + + if (this.isChargingAtPlayer()) { + // make particles + for (int i = 0; i < 4; ++i) { + Item particleID = this.getRandom().nextBoolean() ? TFItems.PHANTOM_HELMET.get() : TFItems.KNIGHTMETAL_SWORD.get(); + + this.getLevel().addParticle(new ItemParticleOption(ParticleTypes.ITEM, new ItemStack(particleID)), getX() + (this.getRandom().nextFloat() - 0.5D) * this.getBbWidth(), getY() + this.getRandom().nextFloat() * (this.getBbHeight() - 0.75D) + 0.5D, getZ() + (this.getRandom().nextFloat() - 0.5D) * this.getBbWidth(), 0, -0.1, 0); + this.getLevel().addParticle(ParticleTypes.SMOKE, getX() + (this.getRandom().nextFloat() - 0.5D) * getBbWidth(), getY() + this.getRandom().nextFloat() * (this.getBbHeight() - 0.75D) + 0.5D, getZ() + (this.getRandom().nextFloat() - 0.5D) * this.getBbWidth(), 0, 0.1, 0); + } + } + } + + @Override + protected void tickDeath() { + super.tickDeath(); + + for (int i = 0; i < 20; ++i) { + double d0 = this.getRandom().nextGaussian() * 0.02D; + double d1 = this.getRandom().nextGaussian() * 0.02D; + double d2 = this.getRandom().nextGaussian() * 0.02D; + this.getLevel().addParticle(ParticleTypes.EXPLOSION, getX() + this.getRandom().nextFloat() * getBbWidth() * 2.0F - getBbWidth(), getY() + this.getRandom().nextFloat() * getBbHeight(), getZ() + this.getRandom().nextFloat() * getBbWidth() * 2.0F - getBbWidth(), d0, d1, d2); + } + } + + @Override + public void die(DamageSource cause) { + + super.die(cause); + + if (this.getLevel() instanceof ServerLevel serverLevel) { + List knights = getNearbyKnights(); + if (!knights.isEmpty()) { + knights.forEach(KnightPhantom::updateMyNumber); + } else if (!cause.is(DamageTypes.OUT_OF_WORLD)) { + this.bossInfo.setProgress(0.0F); + + BlockPos treasurePos = this.hasHome() ? this.getRestrictCenter().below() : this.blockPosition(); + + // make treasure for killing the last knight + // This one won't receive the same loot treatment like the other bosses because this chest is supposed to reward for all of them instead of just the last one killed + TFLootTables.STRONGHOLD_BOSS.generateChest(serverLevel, treasurePos, Direction.NORTH, false); + + //trigger criteria for killing every phantom in a group + if (cause.getEntity() instanceof ServerPlayer player) { + TFAdvancements.KILL_ALL_PHANTOMS.trigger(player); + } + + // mark the stronghold as defeated + LandmarkUtil.markStructureConquered(this.getLevel(), this, TFStructures.KNIGHT_STRONGHOLD, true); + + for (ServerPlayer player : this.hurtBy) { + TFAdvancements.HURT_BOSS.trigger(player, this); + } + + for (ServerPlayer player : this.getLevel().getEntitiesOfClass(ServerPlayer.class, new AABB(this.homePosition).inflate(64.0D))) { + TFAdvancements.HURT_BOSS.trigger(player, this); + } + } + } + } + + @Override + public boolean hurt(DamageSource source, float amount) { + if(this.isDamageSourceBlocked(source)) { + this.playSound(SoundEvents.SHIELD_BLOCK, 1.0F, 0.8F + this.getLevel().getRandom().nextFloat() * 0.4F); + } + + if(source.getEntity() instanceof ServerPlayer player && !this.hurtBy.contains(player)) { + this.hurtBy.add(player); + } + return super.hurt(source, amount); + } + + @Override + public void lavaHurt() { + if (!this.fireImmune()) { + this.setSecondsOnFire(5); + if (this.hurt(this.damageSources().lava(), 4F)) { + this.playSound(SoundEvents.GENERIC_BURN, 0.4F, 2.0F + this.random.nextFloat() * 0.4F); + EntityUtil.killLavaAround(this); + } + } + } + + @Override + public boolean doHurtTarget(Entity entity) { + return EntityUtil.properlyApplyCustomDamageSource(this, entity, TFDamageTypes.getEntityDamageSource(this.getLevel(), TFDamageTypes.HAUNT, this)); + } + + @Override + public boolean isPushable() { + return true; + } + + @Override + public MobType getMobType() { + return MobType.UNDEAD; + } + + @Override + public void knockback(double damage, double xRatio, double zRatio) { + this.hasImpulse = true; + float f = Mth.sqrt((float) (xRatio * xRatio + zRatio * zRatio)); + float distance = 0.2F; + this.setDeltaMovement(new Vec3(this.getDeltaMovement().x() / 2.0D, this.getDeltaMovement().y() / 2.0D, this.getDeltaMovement().z() / 2.0D)); + this.setDeltaMovement(new Vec3( + this.getDeltaMovement().x() - xRatio / f * distance, + this.getDeltaMovement().y() + distance, + this.getDeltaMovement().z() - zRatio / f * distance)); + + if (this.getDeltaMovement().y() > 0.4D) { + this.setDeltaMovement(this.getDeltaMovement().x(), 0.4D, this.getDeltaMovement().z()); + } + } + + public List getNearbyKnights() { + return this.getLevel().getEntitiesOfClass(KnightPhantom.class, getBoundingBox().inflate(64.0D), LivingEntity::isAlive); + } + + private void updateMyNumber() { + List nums = Lists.newArrayList(); + List knights = getNearbyKnights(); + for (KnightPhantom knight : knights) { + if (knight == this || !knight.isAlive()) + continue; + nums.add(knight.getNumber()); + if (knight.getNumber() == 0) + restrictTo(knight.getRestrictCenter(), 20); + } + if (nums.isEmpty()) { + setNumber(0); + return; + } + int[] n = Ints.toArray(nums); + Arrays.sort(n); + int smallest = n[0]; + int largest = knights.size() + 1; + int smallestUnused = largest + 1; + if (smallest > 0) { + smallestUnused = 0; + } else { + for (int i = 1; i < largest; i++) { + if (Arrays.binarySearch(n, i) < 0) { + smallestUnused = i; + break; + } + } + } + if (totalKnownKnights < largest) + totalKnownKnights = largest; + if (this.number > smallestUnused || nums.contains(this.number)) + setNumber(smallestUnused); + } + + public boolean isChargingAtPlayer() { + return this.entityData.get(FLAG_CHARGING); + } + + private void setChargingAtPlayer(boolean flag) { + this.entityData.set(FLAG_CHARGING, flag); + this.gameEvent(GameEvent.ENTITY_INTERACT); + if (!this.getLevel().isClientSide()) { + if (flag) { + if (!this.getAttribute(Attributes.ATTACK_DAMAGE).hasModifier(CHARGING_MODIFIER)) { + this.getAttribute(Attributes.ATTACK_DAMAGE).addTransientModifier(CHARGING_MODIFIER); + } + if (this.getAttribute(Attributes.ARMOR).hasModifier(NON_CHARGING_ARMOR_MODIFIER)) { + this.getAttribute(Attributes.ARMOR).removeModifier(NON_CHARGING_ARMOR_MODIFIER); + } + } else { + this.getAttribute(Attributes.ATTACK_DAMAGE).removeModifier(CHARGING_MODIFIER); + if (!this.getAttribute(Attributes.ARMOR).hasModifier(NON_CHARGING_ARMOR_MODIFIER)) { + this.getAttribute(Attributes.ARMOR).addTransientModifier(NON_CHARGING_ARMOR_MODIFIER); + } + } + } + } + + @Override + protected SoundEvent getAmbientSound() { + return TFSounds.KNIGHT_PHANTOM_AMBIENT.get(); + } + + @Override + protected SoundEvent getHurtSound(DamageSource source) { + return TFSounds.KNIGHT_PHANTOM_HURT.get(); + } + + @Override + protected SoundEvent getDeathSound() { + return TFSounds.KNIGHT_PHANTOM_DEATH.get(); + } + + private void switchToFormationByNumber(int formationNumber) { + this.currentFormation = Formation.values()[formationNumber]; + this.ticksProgress = 0; + } + + public void switchToFormation(Formation formation) { + this.currentFormation = formation; + this.ticksProgress = 0; + this.updateMyNumber(); + this.setChargingAtPlayer(this.currentFormation == Formation.ATTACK_PLAYER_START || this.currentFormation == Formation.ATTACK_PLAYER_ATTACK); + + } + + private int getFormationAsNumber() { + return this.currentFormation.ordinal(); + } + + public int getTicksProgress() { + return this.ticksProgress; + } + + public void setTicksProgress(int ticksProgress) { + this.ticksProgress = ticksProgress; + } + + public int getMaxTicksForFormation() { + return this.currentFormation.duration; + } + + public boolean isSwordKnight() { + return this.getMainHandItem().is(TFItems.KNIGHTMETAL_SWORD.get()); + } + + public boolean isAxeKnight() { + return this.getMainHandItem().is(TFItems.KNIGHTMETAL_AXE.get()); + } + + public boolean isPickKnight() { + return this.getMainHandItem().is(TFItems.KNIGHTMETAL_PICKAXE.get()); + } + + public int getNumber() { + return this.number; + } + + public void setNumber(int number) { + this.number = number; + if (number == 0) + getLevel().getEntitiesOfClass(ServerPlayer.class, getBoundingBox().inflate(64D)).forEach(this::startSeenByPlayer); + + // set weapon per number + switch (number % 3) { + case 0 -> this.setItemSlot(EquipmentSlot.MAINHAND, new ItemStack(TFItems.KNIGHTMETAL_SWORD.get())); + case 1 -> this.setItemSlot(EquipmentSlot.MAINHAND, new ItemStack(TFItems.KNIGHTMETAL_AXE.get())); + case 2 -> this.setItemSlot(EquipmentSlot.MAINHAND, new ItemStack(TFItems.KNIGHTMETAL_PICKAXE.get())); + } + } + + @Override + public void addAdditionalSaveData(CompoundTag compound) { + super.addAdditionalSaveData(compound); + this.saveHomePointToNbt(compound); + compound.putInt("MyNumber", this.getNumber()); + compound.putInt("Formation", this.getFormationAsNumber()); + compound.putInt("TicksProgress", this.getTicksProgress()); + } + + @Override + public void readAdditionalSaveData(CompoundTag compound) { + super.readAdditionalSaveData(compound); + + this.loadHomePointFromNbt(compound, 20); + this.setNumber(compound.getInt("MyNumber")); + this.switchToFormationByNumber(compound.getInt("Formation")); + this.setTicksProgress(compound.getInt("TicksProgress")); + + if (this.hasCustomName()) { + this.bossInfo.setName(this.getDisplayName()); + } + } + + public enum Formation { + + HOVER(90), + + LARGE_CLOCKWISE(180), + + SMALL_CLOCKWISE(90), + + LARGE_ANTICLOCKWISE(180), + + SMALL_ANTICLOCKWISE(90), + + CHARGE_PLUSX(180), + + CHARGE_MINUSX(180), + + CHARGE_PLUSZ(180), + + CHARGE_MINUSZ(180), + + WAITING_FOR_LEADER(10), + + ATTACK_PLAYER_START(50), + + ATTACK_PLAYER_ATTACK(50); + + final int duration; + + Formation(int duration) { + this.duration = duration; + } + } + + @Override + protected boolean canRide(Entity entityIn) { + return false; + } + + @Override + public boolean isPushedByFluid(FluidType type) { + return false; + } + + @Override + protected float getWaterSlowDown() { + return 1.0F; + } + + @Override + public boolean canChangeDimensions() { + return false; + } + + @Override + public BlockPos getRestrictionCenter() { + return this.getRestrictCenter(); + } + + @Override + public void setRestriction(BlockPos pos, int dist) { + this.restrictTo(pos, dist); + } + + // [VanillaCopy] Home fields and methods from CreatureEntity, changes noted + private BlockPos homePosition = BlockPos.ZERO; + private float maximumHomeDistance = -1.0F; + + @Override + public boolean isWithinRestriction() { + return this.isWithinRestriction(new BlockPos(this.blockPosition())); + } + + @Override + public boolean isWithinRestriction(BlockPos pos) { + return this.maximumHomeDistance == -1.0F || this.homePosition.distSqr(pos) < this.maximumHomeDistance * this.maximumHomeDistance; + } + + @Override + public void restrictTo(BlockPos pos, int distance) { + // set the chargePos here as well so we dont go off flying in some direction when we first spawn + this.homePosition = this.chargePos = pos; + this.maximumHomeDistance = distance; + } + + @Override + public BlockPos getRestrictCenter() { + return this.homePosition; + } + + @Override + public float getRestrictRadius() { + return this.maximumHomeDistance; + } + + @Override + public boolean hasRestriction() { + this.maximumHomeDistance = -1.0F; + return false; + } + + public boolean hasHome() { + return this.maximumHomeDistance != -1.0F; + } + // End copy +} diff --git a/src/main/java/twilightforest/entity/boss/Lich.java b/src/main/java/twilightforest/entity/boss/Lich.java new file mode 100644 index 0000000000..b3ae95c864 --- /dev/null +++ b/src/main/java/twilightforest/entity/boss/Lich.java @@ -0,0 +1,847 @@ +package twilightforest.entity.boss; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.NonNullList; +import net.minecraft.core.particles.ItemParticleOption; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.network.syncher.EntityDataAccessor; +import net.minecraft.network.syncher.EntityDataSerializers; +import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerBossEvent; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.tags.DamageTypeTags; +import net.minecraft.util.Mth; +import net.minecraft.world.BossEvent; +import net.minecraft.world.Difficulty; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.damagesource.DamageTypes; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.MobType; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.goal.FloatGoal; +import net.minecraft.world.entity.ai.goal.MeleeAttackGoal; +import net.minecraft.world.entity.ai.goal.target.HurtByTargetGoal; +import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal; +import net.minecraft.world.entity.monster.Monster; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.entity.projectile.ThrowableProjectile; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.AbstractCandleBlock; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.gameevent.GameEvent; +import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.fluids.FluidType; +import net.minecraftforge.network.PacketDistributor; +import org.jetbrains.annotations.Nullable; +import twilightforest.advancements.TFAdvancements; +import twilightforest.block.AbstractLightableBlock; +import twilightforest.data.tags.DamageTypeTagGenerator; +import twilightforest.entity.EnforcedHomePoint; +import twilightforest.entity.ai.goal.*; +import twilightforest.entity.monster.LichMinion; +import twilightforest.init.*; +import twilightforest.network.ParticlePacket; +import twilightforest.network.TFPacketHandler; +import twilightforest.util.EntityUtil; +import twilightforest.util.LandmarkUtil; +import twilightforest.util.WorldUtil; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +public class Lich extends Monster implements EnforcedHomePoint, IBossLootBuffer { + + private static final EntityDataAccessor IS_CLONE = SynchedEntityData.defineId(Lich.class, EntityDataSerializers.BOOLEAN); + private static final EntityDataAccessor SHIELD_STRENGTH = SynchedEntityData.defineId(Lich.class, EntityDataSerializers.INT); + private static final EntityDataAccessor MINIONS_LEFT = SynchedEntityData.defineId(Lich.class, EntityDataSerializers.INT); + private static final EntityDataAccessor ATTACK_TYPE = SynchedEntityData.defineId(Lich.class, EntityDataSerializers.INT); + private final NonNullList dyingInventory = NonNullList.withSize(27, ItemStack.EMPTY); + + public static final int MAX_SHADOW_CLONES = 2; + public static final int INITIAL_SHIELD_STRENGTH = 6; + public static final int MAX_ACTIVE_MINIONS = 3; + public static final int INITIAL_MINIONS_TO_SUMMON = 9; + public static final int MAX_HEALTH = 100; + + @Nullable + private Lich masterLich; + private int attackCooldown; + private int popCooldown; + private int heldScepterTime; + private int spawnTime; + private final ServerBossEvent bossInfo = new ServerBossEvent(getDisplayName(), BossEvent.BossBarColor.YELLOW, BossEvent.BossBarOverlay.NOTCHED_6); + private final List hurtBy = new ArrayList<>(); + + public Lich(EntityType type, Level world) { + super(type, world); + + this.setShadowClone(false); + this.masterLich = null; + this.xpReward = 217; + } + + public Lich(Level level, Lich otherLich) { + this(TFEntities.LICH.get(), level); + + this.setShadowClone(true); + this.masterLich = otherLich; + } + + public static AttributeSupplier.Builder registerAttributes() { + return Monster.createMonsterAttributes() + .add(Attributes.MAX_HEALTH, MAX_HEALTH) + .add(Attributes.ATTACK_DAMAGE, 3.0D) + .add(Attributes.MOVEMENT_SPEED, 0.45D); // Same speed as an angry enderman + } + + @Override + protected void defineSynchedData() { + super.defineSynchedData(); + this.entityData.define(IS_CLONE, false); + this.entityData.define(SHIELD_STRENGTH, INITIAL_SHIELD_STRENGTH); + this.entityData.define(MINIONS_LEFT, INITIAL_MINIONS_TO_SUMMON); + this.entityData.define(ATTACK_TYPE, 0); + } + + @Override + protected void registerGoals() { + this.goalSelector.addGoal(0, new FloatGoal(this)); + this.goalSelector.addGoal(1, new AlwaysWatchTargetGoal(this)); + this.goalSelector.addGoal(1, new LichPopMobsGoal(this)); + this.goalSelector.addGoal(1, new LichAbsorbMinionsGoal(this)); + this.goalSelector.addGoal(2, new LichShadowsGoal(this)); + this.goalSelector.addGoal(3, new LichMinionsGoal(this)); + this.goalSelector.addGoal(4, new MeleeAttackGoal(this, 0.75D, true) { + @Override + public boolean canUse() { + return getPhase() == 3 && super.canUse(); + } + + @Override + public void start() { + super.start(); + this.mob.setItemInHand(InteractionHand.MAIN_HAND, new ItemStack(Items.GOLDEN_SWORD)); + } + }); + this.addRestrictionGoals(this, this.goalSelector); + this.targetSelector.addGoal(1, new HurtByTargetGoal(this) { + @Override + public boolean canUse() { + if (this.mob instanceof Lich main && this.mob.getLastHurtByMob() instanceof Lich lich && lich.masterLich == main.masterLich) { + return false; + } + return super.canUse(); + } + }); + this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, false)); + } + + @Override + public void addAdditionalSaveData(CompoundTag compound) { + this.saveHomePointToNbt(compound); + compound.putBoolean("ShadowClone", this.isShadowClone()); + compound.putInt("ShieldStrength", this.getShieldStrength()); + compound.putInt("MinionsToSummon", this.getMinionsToSummon()); + this.addDeathItemsSaveData(compound); + super.addAdditionalSaveData(compound); + } + + @Override + public void readAdditionalSaveData(CompoundTag compound) { + super.readAdditionalSaveData(compound); + this.readDeathItemsSaveData(compound); + this.loadHomePointFromNbt(compound, 20); + this.setShadowClone(compound.getBoolean("ShadowClone")); + this.setShieldStrength(compound.getInt("ShieldStrength")); + this.setMinionsToSummon(compound.getInt("MinionsToSummon")); + + if (this.hasCustomName()) { + this.bossInfo.setName(this.getDisplayName()); + } + } + + @Override + public void setCustomName(@Nullable Component name) { + super.setCustomName(name); + this.bossInfo.setName(this.getDisplayName()); + } + + @Override + public void startSeenByPlayer(ServerPlayer player) { + super.startSeenByPlayer(player); + this.bossInfo.addPlayer(player); + } + + @Override + public void stopSeenByPlayer(ServerPlayer player) { + super.stopSeenByPlayer(player); + this.bossInfo.removePlayer(player); + } + + @Override + public void aiStep() { + if (!this.getLevel().isClientSide()) { + if (this.getPhase() == 1) { + this.bossInfo.setProgress((float) (this.getShieldStrength()) / (float) (INITIAL_SHIELD_STRENGTH)); + } else { + this.bossInfo.setOverlay(BossEvent.BossBarOverlay.PROGRESS); + this.bossInfo.setProgress(this.getHealth() / this.getMaxHealth()); + if (this.getPhase() == 2) + this.bossInfo.setColor(BossEvent.BossBarColor.PURPLE); + else + this.bossInfo.setColor(BossEvent.BossBarColor.RED); + } + } + + super.aiStep(); + + if (this.isDeadOrDying()) return; + + // determine the hand position + float angle = ((this.yBodyRot * Mth.PI) / 180F); + + double dx = this.getX() + (Mth.cos(angle) * 0.65); + double dy = this.getY() + (this.getBbHeight() * 0.94); + double dz = this.getZ() + (Mth.sin(angle) * 0.65); + + + // add particles! + + // how many particles do we want to add?! + int factor = (80 - this.getAttackCooldown()) / 10; + int particles = factor > 0 ? this.getRandom().nextInt(factor) : 1; + + + for (int j1 = 0; j1 < particles; j1++) { + float sparkle = 1.0F - (this.getAttackCooldown() + 1.0F) / 60.0F; + sparkle *= sparkle; + + float red = 0.37F * sparkle; + float grn = 0.99F * sparkle; + float blu = 0.89F * sparkle; + + // change color for fireball + if (this.getNextAttackType() != 0) { + red = 0.99F * sparkle; + grn = 0.47F * sparkle; + blu = 0.00F * sparkle; + } + + this.getLevel().addParticle(ParticleTypes.ENTITY_EFFECT, dx + (this.getRandom().nextGaussian() * 0.025), dy + (this.getRandom().nextGaussian() * 0.025), dz + (this.getRandom().nextGaussian() * 0.025), red, grn, blu); + } + + if (this.getPhase() == 3) + this.getLevel().addParticle(ParticleTypes.ANGRY_VILLAGER, + this.getX() + this.getRandom().nextFloat() * this.getBbWidth() * 2.0F - this.getBbWidth(), + this.getY() + 1.0D + this.getRandom().nextFloat() * this.getBbHeight(), + this.getZ() + this.getRandom().nextFloat() * this.getBbWidth() * 2.0F - this.getBbWidth(), + this.getRandom().nextGaussian() * 0.02D, this.getRandom().nextGaussian() * 0.02D, this.getRandom().nextGaussian() * 0.02D); + } + + @Override + protected void customServerAiStep() { + super.customServerAiStep(); + + if (this.getAttackCooldown() > 0 && this.spawnTime <= 0) { + this.attackCooldown--; + } + + if (this.getPopCooldown() > 0 && this.getHealth() < this.getMaxHealth() && this.getScepterTimeLeft() <= 0) { + this.popCooldown--; + } + + if (this.getScepterTimeLeft() == 0 && this.getPopCooldown() < 30 && this.getItemInHand(InteractionHand.MAIN_HAND).is(TFItems.LIFEDRAIN_SCEPTER.get())) { + this.setItemInHand(InteractionHand.MAIN_HAND, new ItemStack(this.getPhase() == 2 ? TFItems.ZOMBIE_SCEPTER.get() : Items.GOLDEN_SWORD)); + } + + if (this.getScepterTimeLeft() > 0) { + this.heldScepterTime--; + } + + if (this.getTarget() != null) { + if (this.spawnTime > 0 && this.hasLineOfSight(this.getTarget())) { + this.spawnTime--; + if (this.spawnTime <= 0) { + this.extinguishNearbyCandles(); + } + } + } + } + + @Override + public boolean hurt(DamageSource src, float damage) { + // if we're in a wall, teleport for gosh sakes + if (src.is(DamageTypes.IN_WALL) && this.getTarget() != null) { + teleportToSightOfEntity(this.getTarget()); + } + + if (this.isShadowClone() && !src.is(DamageTypeTags.BYPASSES_INVULNERABILITY)) { + this.playSound(TFSounds.LICH_CLONE_HURT.get(), 1.0F, this.getVoicePitch() * 2.0F); + return false; + } + + // ignore all bolts that are not reflected + if (src.getEntity() instanceof Lich) { + return false; + } + + // if our shield is up, ignore any damage that can be blocked. + if (!src.is(DamageTypeTags.BYPASSES_INVULNERABILITY) && this.getShieldStrength() > 0) { + if (src.is(DamageTypeTagGenerator.BREAKS_LICH_SHIELDS) && damage > 2) { + // reduce shield for magic damage greater than 1 heart + if (this.getShieldStrength() > 0) { + this.setShieldStrength(this.getShieldStrength() - 1); + this.playSound(TFSounds.SHIELD_BREAK.get(), 1.0F, this.getVoicePitch() * 2.0F); + this.gameEvent(GameEvent.ENTITY_DAMAGE); + } + } else { + this.playSound(TFSounds.SHIELD_BREAK.get(), 1.0F, this.getVoicePitch() * 2.0F); + this.gameEvent(GameEvent.ENTITY_DAMAGE); + if (src.getEntity() instanceof LivingEntity living) { + this.setLastHurtByMob(living); + } + } + + return false; + } + + if (super.hurt(src, damage)) { + if (this.getRandom().nextInt(this.getPhase() == 3 ? 6 : 3) == 0) { + this.teleportToSightOfEntity(this.getTarget()); + } + + if (src.getEntity() instanceof ServerPlayer player && !this.hurtBy.contains(player)) { + this.hurtBy.add(player); + } + + return true; + } else { + return false; + } + } + + @Override + public void lavaHurt() { + if (!this.fireImmune()) { + this.setSecondsOnFire(5); + if (this.hurt(this.damageSources().lava(), 4F)) { + this.playSound(SoundEvents.GENERIC_BURN, 0.4F, 2.0F + this.random.nextFloat() * 0.4F); + EntityUtil.killLavaAround(this); + } + } + } + + @Override + public void die(DamageSource cause) { + super.die(cause); + // mark the tower as defeated + if (this.getLevel() instanceof ServerLevel serverLevel && !this.isShadowClone()) { + this.bossInfo.setProgress(0.0F); + LandmarkUtil.markStructureConquered(this.getLevel(), this, TFStructures.LICH_TOWER, true); + for (ServerPlayer player : this.hurtBy) { + TFAdvancements.HURT_BOSS.trigger(player, this); + } + + this.setItemInHand(InteractionHand.MAIN_HAND, ItemStack.EMPTY); + IBossLootBuffer.saveDropsIntoBoss(this, this.createLootContext(true, cause).create(LootContextParamSets.ENTITY), serverLevel); + } + } + + private static final ItemParticleOption BONE_PARTICLE = new ItemParticleOption(ParticleTypes.ITEM, Items.BONE.getDefaultInstance()); + + @Override + protected void tickDeath() { + ++this.deathTime; + + if (this.level instanceof ServerLevel) { + int maxDeath = 175;//How many ticks until the body disappears + if (this.deathTime <= 50) { + boolean done = this.deathTime == 50; + boolean hurt = this.deathTime % 17 == 0; + + if (hurt) this.playHurtSound(this.damageSources().generic()); + if (done) { + SoundEvent soundevent = this.getDeathSound(); + if (soundevent != null) { + this.playSound(soundevent, this.getSoundVolume(), this.getVoicePitch()); + } + } + + Vec3 pos = this.position(); + ParticlePacket particlePacket = new ParticlePacket(); + + for (int i = 0; i < (hurt ? 12 : 3); i++) { + double x = (this.random.nextDouble() - 0.5D) * 0.7D; + double y = this.random.nextDouble() * this.getBbHeight(); + double z = (this.random.nextDouble() - 0.5D) * 0.7D; + particlePacket.queueParticle(this.random.nextBoolean() || hurt ? BONE_PARTICLE : ParticleTypes.SMOKE, false, pos.add(x, y, z), Vec3.ZERO); + } + + if (hurt) { + double x = (this.random.nextDouble() - 0.5D) * 0.7D; + double y = this.random.nextDouble() * this.getBbHeight(); + double z = (this.random.nextDouble() - 0.5D) * 0.7D; + for (int i = 0; i < 7; i++) { + double x1 = x + (this.random.nextDouble() - 0.5D) * 0.1D; + double y1 = y + (this.random.nextDouble() - 0.5D) * 0.1D; + double z1 = z + (this.random.nextDouble() - 0.5D) * 0.1D; + particlePacket.queueParticle(this.random.nextBoolean() ? BONE_PARTICLE : ParticleTypes.CLOUD, false, pos.add(x1, y1, z1), Vec3.ZERO); + } + } + + if (done) { + for (int i = 0; i < 32; i++) { + double x = (this.random.nextDouble() - 0.5D) * 0.7D; + double y = this.random.nextDouble() * this.getBbHeight(); + double z = (this.random.nextDouble() - 0.5D) * 0.7D; + particlePacket.queueParticle(this.random.nextBoolean() ? BONE_PARTICLE : ParticleTypes.CLOUD, false, pos.add(x, y, z), Vec3.ZERO); + } + } + + TFPacketHandler.CHANNEL.send(PacketDistributor.TRACKING_ENTITY.with(() -> this), particlePacket); + } else if (this.deathTime == 70) { + ParticlePacket particlePacket = new ParticlePacket(); + for (int i = 0; i < 3; i++) { + double x = (this.random.nextDouble() - 0.5D) * 0.75D; + double z = (this.random.nextDouble() - 0.5D) * 0.75D; + particlePacket.queueParticle(ParticleTypes.CLOUD, false, this.position().add(x, 0.0D, z), Vec3.ZERO); + } + + TFPacketHandler.CHANNEL.send(PacketDistributor.TRACKING_ENTITY.with(() -> this), particlePacket); + } else if (this.deathTime > 70) { + boolean flag = this.deathTime >= maxDeath && !this.isRemoved(); + + Vec3 start = this.position().add(0.0D, 0.45F, 0.0D); + Vec3 end = Vec3.atCenterOf(EntityUtil.bossChestLocation(this)); + int deathTime2 = this.deathTime - 70; + double factor = (double) deathTime2 / 105.0D; + double powFactor = Math.pow(factor, 2.0D) * 2.0D; + double expandFactor = (Math.cos((factor + 0.5D) * Math.PI * 2) + 1.0D) * 0.5D; + Vec3 particlePos = start.add(end.subtract(start).scale(Math.min(((double) deathTime2 / 70.0D) * 1.25D, 1.0D))); + ParticlePacket particlePacket = new ParticlePacket(); + if (this.deathTime >= maxDeath - 3) { + for (int i = 0; i < 40; i++) { + double x = (this.random.nextDouble() - 0.5D) * 0.075D * i; + double y = (this.random.nextDouble() - 0.5D) * 0.075D * i; + double z = (this.random.nextDouble() - 0.5D) * 0.075D * i; + particlePacket.queueParticle(this.random.nextBoolean() ? TFParticleType.OMINOUS_FLAME.get() : ParticleTypes.POOF, false, end.add(x, y, z), Vec3.ZERO); + } + } + if (flag) { + for (int i = 0; i < 16; i++) { + double x = (this.random.nextDouble() - 0.5D) * 0.075D * i; + double y = (this.random.nextDouble() - 0.5D) * 0.075D * i; + double z = (this.random.nextDouble() - 0.5D) * 0.075D * i; + particlePacket.queueParticle(ParticleTypes.POOF, false, start.add(x, y, z), Vec3.ZERO); + } + } + for (double i = 0.0D; i < 1.0D; i += 0.2D) { + double x = Math.sin((powFactor + i) * Math.PI * 2.0D) * expandFactor * 1.25D; + double z = Math.cos((powFactor + i) * Math.PI * 2.0D) * expandFactor * 1.25D; + particlePacket.queueParticle(TFParticleType.OMINOUS_FLAME.get(), false, particlePos.add(x, -0.25D, z), Vec3.ZERO); + } + + TFPacketHandler.CHANNEL.send(PacketDistributor.TRACKING_ENTITY.with(() -> this), particlePacket); + + if (flag) this.remove(RemovalReason.KILLED); + } + } + } + + @Override + public void remove(RemovalReason removalReason) { + if (removalReason.equals(RemovalReason.KILLED) && this.level instanceof ServerLevel serverLevel) { + IBossLootBuffer.depositDropsIntoChest(this, this.random.nextBoolean() ? TFBlocks.TWILIGHT_OAK_CHEST.get().defaultBlockState() : TFBlocks.CANOPY_CHEST.get().defaultBlockState(), EntityUtil.bossChestLocation(this), serverLevel); + } + super.remove(removalReason); + } + + @Override + public void checkDespawn() { + if (this.getLevel().getDifficulty() == Difficulty.PEACEFUL && !this.isShadowClone()) { + if (this.hasRestriction()) { + this.getLevel().setBlockAndUpdate(getRestrictCenter(), TFBlocks.LICH_BOSS_SPAWNER.get().defaultBlockState()); + } + this.discard(); + } else { + super.checkDespawn(); + } + } + + //-----------------------------------------// + // PROJECTILES, CLONES, AND MINIONS // + //-----------------------------------------// + + public void launchProjectileAt(ThrowableProjectile projectile) { + float bodyFacingAngle = ((this.yBodyRot * Mth.PI) / 180F); + double sx = getX() + (Mth.cos(bodyFacingAngle) * 0.65D); + double sy = getY() + (this.getBbHeight() * 0.82D); + double sz = getZ() + (Mth.sin(bodyFacingAngle) * 0.65D); + + double tx = Objects.requireNonNull(this.getTarget()).getX() - sx; + double ty = (this.getTarget().getBoundingBox().minY + this.getTarget().getBbHeight() / 2.0F) - (this.getY() + this.getBbHeight() / 2.0F); + double tz = this.getTarget().getZ() - sz; + + this.playSound(TFSounds.LICH_SHOOT.get(), this.getSoundVolume(), (this.getRandom().nextFloat() - this.getRandom().nextFloat()) * 0.2F + 1.0F); + + projectile.moveTo(sx, sy, sz, getYRot(), getXRot()); + projectile.shoot(tx, ty, tz, 0.5F, 1.0F); + + this.getLevel().addFreshEntity(projectile); + } + + public boolean wantsNewClone(Lich clone) { + return clone.isShadowClone() && this.countMyClones() < Lich.MAX_SHADOW_CLONES; + } + + public int countMyClones() { + // check if there are enough clones. we check a 32x16x32 area + int count = 0; + + for (Lich nearbyLich : this.getNearbyLiches()) { + if (nearbyLich.isShadowClone() && nearbyLich.getMasterLich() == this) { + count++; + } + } + + return count; + } + + public List getNearbyLiches() { + return this.getLevel().getEntitiesOfClass(getClass(), new AABB(this.getX(), this.getY(), this.getZ(), this.getX() + 1, this.getY() + 1, this.getZ() + 1).inflate(32.0D, 16.0D, 32.0D)); + } + + public boolean wantsNewMinion() { + return countMyMinions() < Lich.MAX_ACTIVE_MINIONS; + } + + public int countMyMinions() { + return (int) this.getLevel().getEntitiesOfClass(LichMinion.class, new AABB(this.getX(), this.getY(), this.getZ(), this.getX() + 1, this.getY() + 1, this.getZ() + 1).inflate(32.0D, 16.0D, 32.0D)) + .stream() + .filter(m -> m.master == this) + .count(); + } + + //-----------------------------------------// + // TELEPORTATION // + //-----------------------------------------// + + public void teleportToSightOfEntity(@Nullable Entity entity) { + Vec3 dest = this.findVecInLOSOf(entity); + double srcX = getX(); + double srcY = getY(); + double srcZ = getZ(); + + if (dest != null && entity != null) { + this.teleportToNoChecks(dest.x(), dest.y(), dest.z()); + this.getLookControl().setLookAt(entity, 100.0F, 100.0F); + this.yBodyRot = this.getYRot(); + + if (!this.getSensing().hasLineOfSight(entity)) { + this.teleportToNoChecks(srcX, srcY, srcZ); + } + } + } + + /** + * Returns coords that would be good to teleport to. + * Returns null if we can't find anything + */ + @Nullable + public Vec3 findVecInLOSOf(@Nullable Entity targetEntity) { + if (targetEntity == null) return null; + double origX = this.getX(); + double origY = this.getY(); + double origZ = this.getZ(); + + int tries = 100; + for (int i = 0; i < tries; i++) { + // we abuse LivingEntity.attemptTeleport, which does all the collision/ground checking for us, then teleport back to our original spot + double tx = targetEntity.getX() + this.getRandom().nextGaussian() * 16D; + double ty = targetEntity.getY(); + double tz = targetEntity.getZ() + this.getRandom().nextGaussian() * 16D; + + boolean destClear = this.randomTeleport(tx, ty, tz, true); + boolean canSeeTargetAtDest = this.hasLineOfSight(targetEntity); // Don't use senses cache because we're in a temporary position + this.teleportTo(origX, origY, origZ); + + if (destClear && canSeeTargetAtDest) { + return new Vec3(tx, ty, tz); + } + } + + return null; + } + + /** + * Does not check that the teleport destination is valid, we just go there + */ + private void teleportToNoChecks(double destX, double destY, double destZ) { + // save original position + double srcX = this.getX(); + double srcY = this.getY(); + double srcZ = this.getZ(); + + // change position + this.teleportTo(destX, destY, destZ); + + this.makeTeleportTrail(srcX, srcY, srcZ, destX, destY, destZ); + this.getLevel().playSound(null, srcX, srcY, srcZ, TFSounds.LICH_TELEPORT.get(), this.getSoundSource(), 1.0F, 1.0F); + this.playSound(TFSounds.LICH_TELEPORT.get(), 1.0F, 1.0F); + this.gameEvent(GameEvent.TELEPORT); + + // sometimes we need to do this + this.jumping = false; + } + + //-----------------------------------------// + // PARTICLES // + //-----------------------------------------// + + public void makeTeleportTrail(double srcX, double srcY, double srcZ, double destX, double destY, double destZ) { + // make particle trail + int particles = 128; + for (int i = 0; i < particles; i++) { + double trailFactor = i / (particles - 1.0D); + float f = (this.getRandom().nextFloat() - 0.5F) * 0.2F; + float f1 = (this.getRandom().nextFloat() - 0.5F) * 0.2F; + float f2 = (this.getRandom().nextFloat() - 0.5F) * 0.2F; + double tx = srcX + (destX - srcX) * trailFactor + (this.getRandom().nextDouble() - 0.5D) * this.getBbWidth() * 2D; + double ty = srcY + (destY - srcY) * trailFactor + this.getRandom().nextDouble() * this.getBbHeight(); + double tz = srcZ + (destZ - srcZ) * trailFactor + (this.getRandom().nextDouble() - 0.5D) * this.getBbWidth() * 2D; + this.getLevel().addParticle(ParticleTypes.EFFECT, tx, ty, tz, f, f1, f2); + } + } + + public void makeMagicTrail(Vec3 source, Vec3 target, float red, float green, float blue) { + int particles = 60; + if (!this.getLevel().isClientSide()) { + for (ServerPlayer serverplayer : ((ServerLevel) this.getLevel()).players()) { + if (serverplayer.distanceToSqr(source) < 4096.0D) { + ParticlePacket packet = new ParticlePacket(); + + for (int i = 0; i < particles; i++) { + double trailFactor = i / (particles - 1.0D); + double tx = source.x() + (target.x() - source.x()) * trailFactor + this.getRandom().nextGaussian() * 0.005D; + double ty = source.y() + 0.2D + (target.y() - source.y()) * trailFactor + this.getRandom().nextGaussian() * 0.005D; + double tz = source.z() + (target.z() - source.z()) * trailFactor + this.getRandom().nextGaussian() * 0.005D; + packet.queueParticle(ParticleTypes.ENTITY_EFFECT, false, tx, ty, tz, red, green, blue); + } + + TFPacketHandler.CHANNEL.send(PacketDistributor.PLAYER.with(() -> serverplayer), packet); + } + } + } + } + + private void extinguishNearbyCandles() { + for (BlockPos pos : WorldUtil.getAllAround(this.blockPosition(), 10)) { + if (level.getBlockState(pos).getBlock() instanceof AbstractCandleBlock && level.getBlockState(pos).getValue(BlockStateProperties.LIT)) { + level.setBlockAndUpdate(pos, level.getBlockState(pos).setValue(BlockStateProperties.LIT, false)); + level.playSound(null, pos, SoundEvents.CANDLE_EXTINGUISH, SoundSource.BLOCKS, 2.0F, 1.0F); + } else if (level.getBlockState(pos).getBlock() instanceof AbstractLightableBlock && level.getBlockState(pos).getValue(AbstractLightableBlock.LIGHTING) == AbstractLightableBlock.Lighting.NORMAL) { + level.setBlockAndUpdate(pos, level.getBlockState(pos).setValue(AbstractLightableBlock.LIGHTING, AbstractLightableBlock.Lighting.OMINOUS)); + level.playSound(null, pos, SoundEvents.CANDLE_EXTINGUISH, SoundSource.BLOCKS, 2.0F, 0.75F); + } + } + } + + //-----------------------------------------// + // METHOD GETTERS AND SETTERS // + //-----------------------------------------// + + public void setExtinguishTimer() { + this.spawnTime = 20; + } + + /** + * What phase of the fight are we on? + *

+ * 1 - reflecting bolts, shield up + * 2 - summoning minions + * 3 - melee + */ + public int getPhase() { + if (this.isShadowClone() || this.getShieldStrength() > 0) { + return 1; + } else if (this.getMinionsToSummon() > 0 || this.countMyMinions() > 0) { + return 2; + } else { + return 3; + } + } + + @Nullable + public Lich getMasterLich() { + return this.masterLich; + } + + public void setMaster(Lich lich) { + this.masterLich = lich; + } + + public int getAttackCooldown() { + return this.attackCooldown; + } + + public void setAttackCooldown(int cooldown) { + this.attackCooldown = cooldown; + } + + public int getPopCooldown() { + return this.popCooldown; + } + + public void setPopCooldown(int cooldown) { + this.popCooldown = cooldown; + } + + public int getScepterTimeLeft() { + return this.heldScepterTime; + } + + public void setScepterTime() { + this.heldScepterTime = 20 + this.getRandom().nextInt(20); + this.setItemInHand(InteractionHand.MAIN_HAND, new ItemStack(TFItems.LIFEDRAIN_SCEPTER.get())); + } + + public void resetScepterTime() { + this.heldScepterTime = 0; + } + + public boolean isShadowClone() { + return this.entityData.get(IS_CLONE); + } + + public void setShadowClone(boolean shadowClone) { + this.bossInfo.setVisible(!shadowClone); + this.entityData.set(IS_CLONE, shadowClone); + } + + public int getShieldStrength() { + return this.entityData.get(SHIELD_STRENGTH); + } + + public void setShieldStrength(int shieldStrength) { + this.entityData.set(SHIELD_STRENGTH, shieldStrength); + } + + public int getMinionsToSummon() { + return this.entityData.get(MINIONS_LEFT); + } + + public void setMinionsToSummon(int minionsToSummon) { + this.entityData.set(MINIONS_LEFT, minionsToSummon); + } + + public int getNextAttackType() { + return this.entityData.get(ATTACK_TYPE); + } + + public void setNextAttackType(int attackType) { + this.entityData.set(ATTACK_TYPE, attackType); + } + + + //-----------------------------------------// + // OVERRIDES // + //-----------------------------------------// + + @Override + protected SoundEvent getAmbientSound() { + return TFSounds.LICH_AMBIENT.get(); + } + + @Override + protected SoundEvent getHurtSound(DamageSource source) { + return TFSounds.LICH_HURT.get(); + } + + @Override + protected SoundEvent getDeathSound() { + return this.deathTime > 1 ? TFSounds.LICH_DEATH.get() : TFSounds.LICH_HURT.get(); + } + + @Override + public ResourceLocation getDefaultLootTable() { + return !this.isShadowClone() ? super.getDefaultLootTable() : null; + } + + @Override + public boolean removeWhenFarAway(double dist) { + return false; + } + + @Override + protected boolean shouldDropLoot() { + // Invoked the mob's loot during die, this will avoid duplicating during the actual drop phase + return false; + } + + @Override + public boolean displayFireAnimation() { + return this.deathTime <= 0 && super.displayFireAnimation(); + } + + //as funny as left handed liches are, it would be better if it always holds its scepter/sword in the correct hand + @Override + public boolean isLeftHanded() { + return false; + } + + @Override + public MobType getMobType() { + return MobType.UNDEAD; + } + + @Override + protected boolean canRide(Entity entity) { + return false; + } + + @Override + public boolean isPushedByFluid(FluidType type) { + return false; + } + + @Override + protected float getWaterSlowDown() { + return 1.0F; + } + + @Override + public boolean canChangeDimensions() { + return false; + } + + @Override + public BlockPos getRestrictionCenter() { + return this.getRestrictCenter(); + } + + @Override + public void setRestriction(BlockPos pos, int dist) { + this.restrictTo(pos, dist); + } + + @Override + public NonNullList getItemStacks() { + return this.dyingInventory; + } +} diff --git a/src/main/java/twilightforest/entity/boss/Minoshroom.java b/src/main/java/twilightforest/entity/boss/Minoshroom.java new file mode 100644 index 0000000000..59d1f4bb15 --- /dev/null +++ b/src/main/java/twilightforest/entity/boss/Minoshroom.java @@ -0,0 +1,282 @@ +package twilightforest.entity.boss; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.particles.BlockParticleOption; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.network.syncher.EntityDataAccessor; +import net.minecraft.network.syncher.EntityDataSerializers; +import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.server.level.ServerBossEvent; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.util.Mth; +import net.minecraft.util.RandomSource; +import net.minecraft.world.BossEvent; +import net.minecraft.world.Difficulty; +import net.minecraft.world.DifficultyInstance; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.fluids.FluidType; +import org.jetbrains.annotations.Nullable; +import twilightforest.advancements.TFAdvancements; +import twilightforest.entity.EnforcedHomePoint; +import twilightforest.entity.ai.goal.GroundAttackGoal; +import twilightforest.entity.monster.Minotaur; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFItems; +import twilightforest.init.TFSounds; +import twilightforest.init.TFStructures; +import twilightforest.loot.TFLootTables; +import twilightforest.util.EntityUtil; +import twilightforest.util.LandmarkUtil; + +import java.util.ArrayList; +import java.util.List; + +public class Minoshroom extends Minotaur implements EnforcedHomePoint { + private static final EntityDataAccessor GROUND_ATTACK = SynchedEntityData.defineId(Minoshroom.class, EntityDataSerializers.BOOLEAN); + private static final EntityDataAccessor GROUND_CHARGE = SynchedEntityData.defineId(Minoshroom.class, EntityDataSerializers.INT); + private float prevClientSideChargeAnimation; + private float clientSideChargeAnimation; + private boolean groundSmashState = false; + private final List hurtBy = new ArrayList<>(); + private final ServerBossEvent bossInfo = new ServerBossEvent(this.getDisplayName(), BossEvent.BossBarColor.RED, BossEvent.BossBarOverlay.PROGRESS); + + public Minoshroom(EntityType type, Level level) { + super(type, level); + this.xpReward = 100; + this.setDropChance(EquipmentSlot.MAINHAND, 0.0F); + } + + @Override + protected void registerGoals() { + super.registerGoals(); + this.goalSelector.addGoal(1, new GroundAttackGoal(this)); + this.addRestrictionGoals(this, this.goalSelector); + } + + @Override + protected void defineSynchedData() { + super.defineSynchedData(); + this.entityData.define(GROUND_ATTACK, false); + this.entityData.define(GROUND_CHARGE, 0); + } + + public boolean isGroundAttackCharge() { + return this.entityData.get(GROUND_ATTACK); + } + + public void setGroundAttackCharge(boolean flag) { + this.entityData.set(GROUND_ATTACK, flag); + } + + public static AttributeSupplier.Builder registerAttributes() { + return Minotaur.registerAttributes() + .add(Attributes.MAX_HEALTH, 120.0D) + .add(Attributes.KNOCKBACK_RESISTANCE, 0.5D); + } + + @Override + public void setCustomName(@Nullable Component name) { + super.setCustomName(name); + this.bossInfo.setName(this.getDisplayName()); + } + + @Override + protected void customServerAiStep() { + super.customServerAiStep(); + this.bossInfo.setProgress(this.getHealth() / this.getMaxHealth()); + } + + @Override + public void startSeenByPlayer(ServerPlayer player) { + super.startSeenByPlayer(player); + this.bossInfo.addPlayer(player); + } + + @Override + public void stopSeenByPlayer(ServerPlayer player) { + super.stopSeenByPlayer(player); + this.bossInfo.removePlayer(player); + } + + @Override + public void addAdditionalSaveData(CompoundTag compound) { + this.saveHomePointToNbt(compound); + super.addAdditionalSaveData(compound); + } + + @Override + public void readAdditionalSaveData(CompoundTag compound) { + super.readAdditionalSaveData(compound); + this.loadHomePointFromNbt(compound, 20); + if (this.hasCustomName()) { + this.bossInfo.setName(this.getDisplayName()); + } + } + + @Override + public void tick() { + super.tick(); + if (this.getLevel().isClientSide()) { + this.prevClientSideChargeAnimation = this.clientSideChargeAnimation; + if (this.isGroundAttackCharge()) { + this.clientSideChargeAnimation = Mth.clamp(this.clientSideChargeAnimation + (1.0F / ((float) this.entityData.get(GROUND_CHARGE)) * 6.0F), 0.0F, 6.0F); + this.groundSmashState = true; + } else { + this.clientSideChargeAnimation = Mth.clamp(this.clientSideChargeAnimation - 1.0F, 0.0F, 6.0F); + if (this.groundSmashState) { + BlockState block = this.getLevel().getBlockState(this.blockPosition().below()); + + for (int i = 0; i < 80; i++) { + double cx = this.blockPosition().getX() + this.getLevel().getRandom().nextFloat() * 10.0F - 5.0F; + double cy = this.getBoundingBox().minY + 0.1F + getLevel().getRandom().nextFloat() * 0.3F; + double cz = this.blockPosition().getZ() + this.getLevel().getRandom().nextFloat() * 10.0F - 5.0F; + + this.getLevel().addParticle(new BlockParticleOption(ParticleTypes.BLOCK, block), cx, cy, cz, 0.0D, 0.0D, 0.0D); + } + this.groundSmashState = false; + } + } + } + } + + @Override + protected SoundEvent getAmbientSound() { + return TFSounds.MINOSHROOM_AMBIENT.get(); + } + + @Override + protected SoundEvent getHurtSound(DamageSource source) { + return TFSounds.MINOSHROOM_HURT.get(); + } + + @Override + protected SoundEvent getDeathSound() { + return TFSounds.MINOSHROOM_DEATH.get(); + } + + @Override + protected void playStepSound(BlockPos pos, BlockState state) { + this.playSound(TFSounds.MINOSHROOM_STEP.get(), 0.15F, 0.8F); + } + + @Override + protected SoundEvent getChargeSound() { + return TFSounds.MINOSHROOM_ATTACK.get(); + } + + @OnlyIn(Dist.CLIENT) + public float getChargeAnimationScale(float scale) { + return (this.prevClientSideChargeAnimation + (this.clientSideChargeAnimation - this.prevClientSideChargeAnimation) * scale) / 6.0F; + } + + public void setMaxCharge(int charge) { + this.entityData.set(GROUND_CHARGE, charge); + } + + @Override + protected void populateDefaultEquipmentSlots(RandomSource source, DifficultyInstance difficulty) { + super.populateDefaultEquipmentSlots(source, difficulty); + this.setItemSlot(EquipmentSlot.MAINHAND, new ItemStack(TFItems.DIAMOND_MINOTAUR_AXE.get())); + } + + @Override + public boolean hurt(DamageSource source, float amount) { + if(source.getEntity() instanceof ServerPlayer player && !this.hurtBy.contains(player)) { + this.hurtBy.add(player); + } + return super.hurt(source, amount); + } + + @Override + public void lavaHurt() { + if (!this.fireImmune()) { + this.setSecondsOnFire(5); + if (this.hurt(this.damageSources().lava(), 4F)) { + this.playSound(SoundEvents.GENERIC_BURN, 0.4F, 2.0F + this.random.nextFloat() * 0.4F); + EntityUtil.killLavaAround(this); + } + } + } + + @Override + public void die(DamageSource cause) { + super.die(cause); + if (!this.getLevel().isClientSide()) { + this.bossInfo.setProgress(0.0F); + LandmarkUtil.markStructureConquered(this.getLevel(), this, TFStructures.LABYRINTH, true); + for(ServerPlayer player : this.hurtBy) { + TFAdvancements.HURT_BOSS.trigger(player, this); + } + + TFLootTables.entityDropsIntoContainer(this, this.createLootContext(true, cause).create(LootContextParamSets.ENTITY), TFBlocks.MANGROVE_CHEST.get().defaultBlockState(), EntityUtil.bossChestLocation(this)); + } + } + + @Override + protected boolean shouldDropLoot() { + // Invoked the mob's loot during die, this will avoid duplicating during the actual drop phase + return false; + } + + @Override + public boolean removeWhenFarAway(double distance) { + return false; + } + + @Override + public void checkDespawn() { + if (this.getLevel().getDifficulty() == Difficulty.PEACEFUL) { + if (this.hasRestriction()) { + this.getLevel().setBlockAndUpdate(this.getRestrictCenter(), TFBlocks.MINOSHROOM_BOSS_SPAWNER.get().defaultBlockState()); + } + this.discard(); + } else { + super.checkDespawn(); + } + } + + @Override + protected boolean canRide(Entity entity) { + return false; + } + + @Override + public boolean isPushedByFluid(FluidType type) { + return false; + } + + @Override + protected float getWaterSlowDown() { + return 1.0F; + } + + @Override + public boolean canChangeDimensions() { + return false; + } + + @Override + public BlockPos getRestrictionCenter() { + return this.getRestrictCenter(); + } + + @Override + public void setRestriction(BlockPos pos, int dist) { + this.restrictTo(pos, dist); + } +} diff --git a/src/main/java/twilightforest/entity/boss/Naga.java b/src/main/java/twilightforest/entity/boss/Naga.java new file mode 100644 index 0000000000..75843f118f --- /dev/null +++ b/src/main/java/twilightforest/entity/boss/Naga.java @@ -0,0 +1,726 @@ +package twilightforest.entity.boss; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.NonNullList; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.network.protocol.game.ClientboundAddEntityPacket; +import net.minecraft.network.syncher.EntityDataAccessor; +import net.minecraft.network.syncher.EntityDataSerializers; +import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.server.level.ServerBossEvent; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.tags.BlockTags; +import net.minecraft.tags.DamageTypeTags; +import net.minecraft.util.Mth; +import net.minecraft.world.BossEvent; +import net.minecraft.world.Difficulty; +import net.minecraft.world.DifficultyInstance; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.*; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.goal.FloatGoal; +import net.minecraft.world.entity.ai.goal.MoveTowardsRestrictionGoal; +import net.minecraft.world.entity.ai.goal.RandomStrollGoal; +import net.minecraft.world.entity.ai.goal.target.HurtByTargetGoal; +import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal; +import net.minecraft.world.entity.ai.util.DefaultRandomPos; +import net.minecraft.world.entity.monster.Monster; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.ClipContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.ServerLevelAccessor; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.entity.PartEntity; +import net.minecraftforge.event.ForgeEventFactory; +import net.minecraftforge.fluids.FluidType; +import net.minecraftforge.network.PacketDistributor; +import org.jetbrains.annotations.Nullable; +import twilightforest.advancements.TFAdvancements; +import twilightforest.entity.EnforcedHomePoint; +import twilightforest.entity.TFPart; +import twilightforest.entity.ai.control.NagaMoveControl; +import twilightforest.entity.ai.goal.NagaMovementPattern; +import twilightforest.entity.ai.goal.NagaSmashGoal; +import twilightforest.entity.ai.goal.SimplifiedAttackGoal; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFSounds; +import twilightforest.init.TFStructures; +import twilightforest.network.ParticlePacket; +import twilightforest.network.TFPacketHandler; +import twilightforest.network.ThrowPlayerPacket; +import twilightforest.util.EntityUtil; +import twilightforest.util.LandmarkUtil; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +public class Naga extends Monster implements EnforcedHomePoint, IBossLootBuffer { + + private static final int TICKS_BEFORE_HEALING = 600; + private static final int MAX_SEGMENTS = 12; + private static final int LEASH_X = 46; + private static final int LEASH_Y = 7; + private static final int LEASH_Z = 46; + private static final double DEFAULT_SPEED = 0.3; + + private int currentSegmentCount = 0; // not including head + private final float healthPerSegment; + private final NagaSegment[] bodySegments = new NagaSegment[MAX_SEGMENTS]; + private NagaMovementPattern movementAI; + private int ticksSinceDamaged = 0; + private final List hurtBy = new ArrayList<>(); + private final NonNullList dyingInventory = NonNullList.withSize(27, ItemStack.EMPTY); + + private final ServerBossEvent bossInfo = new ServerBossEvent(getDisplayName(), BossEvent.BossBarColor.GREEN, BossEvent.BossBarOverlay.NOTCHED_10); + + private final AttributeModifier slowSpeed = new AttributeModifier("Naga Slow Speed", 0.25F, AttributeModifier.Operation.ADDITION); + private final AttributeModifier fastSpeed = new AttributeModifier("Naga Fast Speed", 0.50F, AttributeModifier.Operation.ADDITION); + + private static final EntityDataAccessor DATA_DAZE = SynchedEntityData.defineId(Naga.class, EntityDataSerializers.BOOLEAN); + private static final EntityDataAccessor DATA_CHARGE = SynchedEntityData.defineId(Naga.class, EntityDataSerializers.BOOLEAN); + + public Naga(EntityType type, Level level) { + super(type, level); + this.xpReward = 217; + this.noCulling = true; + + for (int i = 0; i < this.bodySegments.length; i++) { + this.bodySegments[i] = new NagaSegment(this); + } + + this.goNormal(); + this.healthPerSegment = this.getMaxHealth() / 10; + } + + @Override + protected void defineSynchedData() { + super.defineSynchedData(); + this.entityData.define(DATA_DAZE, false); + this.entityData.define(DATA_CHARGE, false); + } + + public boolean isDazed() { + return this.entityData.get(DATA_DAZE); + } + + public void setDazed(boolean daze) { + this.entityData.set(DATA_DAZE, daze); + } + + public boolean isCharging() { + return this.entityData.get(DATA_CHARGE); + } + + public void setCharging(boolean charge) { + this.entityData.set(DATA_CHARGE, charge); + } + + public NagaMovementPattern getMovementAI() { + return this.movementAI; + } + + @Override + protected void registerGoals() { + this.goalSelector.addGoal(1, new FloatGoal(this)); + this.goalSelector.addGoal(2, new SimplifiedAttackGoal(this)); + this.goalSelector.addGoal(3, new NagaSmashGoal(this)); + this.goalSelector.addGoal(4, this.movementAI = new NagaMovementPattern(this)); + this.goalSelector.addGoal(5, new MoveTowardsRestrictionGoal(this, 1.0D) { + @Override + public void start() { + Naga.this.setTarget(null); + super.start(); + } + }); + this.goalSelector.addGoal(8, new RandomStrollGoal(this, 1, 1) { + @Override + public void start() { + Naga.this.goNormal(); + super.start(); + } + + @Override + protected Vec3 getPosition() { + return DefaultRandomPos.getPos(this.mob, 30, 7); + } + }); + this.targetSelector.addGoal(1, new HurtByTargetGoal(this)); + this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, false) { + @Override + public boolean canUse() { + return Naga.this.isWithinRestriction(Naga.this.blockPosition()) && super.canUse(); + } + }); + + this.moveControl = new NagaMoveControl(this); + } + + @Override + public void aiStep() { + + super.aiStep(); + + if (this.getLevel().isClientSide() || !ForgeEventFactory.getMobGriefingEvent(this.getLevel(), this)) return; + + AABB bb = this.getBoundingBox(); + + int minx = Mth.floor(bb.minX - 0.75D); + int miny = Mth.floor(bb.minY + (this.shouldDestroyAllBlocks() ? 1.01F : 0.5F)); + int minz = Mth.floor(bb.minZ - 0.75D); + int maxx = Mth.floor(bb.maxX + 0.75D); + int maxy = Mth.floor(bb.maxY + 1.0D); + int maxz = Mth.floor(bb.maxZ + 0.75D); + + BlockPos min = new BlockPos(minx, miny, minz); + BlockPos max = new BlockPos(maxx, maxy, maxz); + + if (this.getLevel().hasChunksAt(min, max)) { + for (BlockPos pos : BlockPos.betweenClosed(min, max)) { + BlockState state = this.getLevel().getBlockState(pos); + if (state.is(BlockTags.LEAVES) || (this.shouldDestroyAllBlocks() && EntityUtil.canDestroyBlock(this.getLevel(), pos, this))) { + this.getLevel().destroyBlock(pos, !state.is(BlockTags.LEAVES)); + } + } + } + } + + public boolean shouldDestroyAllBlocks() { + return this.isCharging() || !this.isWithinRestriction(); + } + + public static AttributeSupplier.Builder registerAttributes() { + return Monster.createMonsterAttributes() + .add(Attributes.MAX_HEALTH, 120) + .add(Attributes.MOVEMENT_SPEED, DEFAULT_SPEED) + .add(Attributes.ATTACK_DAMAGE, 5.0D) + .add(Attributes.FOLLOW_RANGE, 80.0D) + .add(Attributes.KNOCKBACK_RESISTANCE, 0.25D); + } + + /** + * Determine how many segments, from 2-12, the naga should have, dependent on its current health + */ + private void setSegmentsPerHealth() { + int oldSegments = this.currentSegmentCount; + int newSegments = Mth.clamp((int) ((this.getHealth() / this.healthPerSegment) + (getHealth() > 0 ? 2 : 0)), 0, MAX_SEGMENTS); + this.currentSegmentCount = newSegments; + if (newSegments < oldSegments) { + for (int i = newSegments; i < oldSegments; i++) { + this.bodySegments[i].selfDestruct((oldSegments - i) * 12); + } + } else if (newSegments > oldSegments) { + this.activateBodySegments(); + } + + if (!this.getLevel().isClientSide()) { + double newSpeed = DEFAULT_SPEED - newSegments * (-0.2F / 12F); + if (newSpeed < 0) + newSpeed = 0; + Objects.requireNonNull(this.getAttribute(Attributes.MOVEMENT_SPEED)).setBaseValue(newSpeed); + } + } + + @Nullable + @Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor accessor, DifficultyInstance difficulty, MobSpawnType type, @Nullable SpawnGroupData data, @Nullable CompoundTag tag) { + if (this.getLevel().getDifficulty() != Difficulty.EASY && this.getAttribute(Attributes.MAX_HEALTH) != null) { + boolean hard = this.level.getDifficulty() == Difficulty.HARD; + AttributeModifier modifier = new AttributeModifier("Difficulty Health Boost", hard ? 130 : 80, AttributeModifier.Operation.ADDITION); + if (!Objects.requireNonNull(this.getAttribute(Attributes.MAX_HEALTH)).hasModifier(modifier)) { + Objects.requireNonNull(this.getAttribute(Attributes.MAX_HEALTH)).addPermanentModifier(modifier); + this.setHealth(this.getMaxHealth()); + } + } + return data; + } + + @Override + public boolean isSteppingCarefully() { + return false; + } + + @Override + public boolean isInLava() { + return false; + } + + @Override + public void tick() { + if (this.isDazed() && this.deathTime < 10) { + for (int i = 0; i < 5; i++) { + Vec3 pos = new Vec3(this.getX(), this.getY() + 2.15D, this.getZ()).add(new Vec3(1.5D, 0, 0).yRot((float) Math.toRadians(this.getRandom().nextInt(360)))); + this.getLevel().addParticle(ParticleTypes.CRIT, pos.x(), pos.y(), pos.z(), 0, 0, 0); + } + } + + // update health + this.ticksSinceDamaged++; + + if (!this.getLevel().isClientSide() && this.ticksSinceDamaged > TICKS_BEFORE_HEALING && this.ticksSinceDamaged % 20 == 0) { + this.heal(1); + } + + this.setSegmentsPerHealth(); + + super.tick(); + + this.moveSegments(); + } + + @Override + protected void customServerAiStep() { + super.customServerAiStep(); + + if (this.getTarget() != null && (this.distanceToSqr(getTarget()) > 80 * 80 || !this.areSelfAndTargetInHome(this.getTarget()))) { + this.setTarget(null); + } + + // if we are very close to the path point, go to the next point, unless the path is finished + double d = this.getBbWidth() * 4.0F; + Vec3 vec3d = this.isPathFinding() ? Objects.requireNonNull(this.getNavigation().getPath()).getNextEntityPos(this) : null; + + while (vec3d != null && vec3d.distanceToSqr(this.getX(), vec3d.y(), this.getZ()) < d * d) { + this.getNavigation().getPath().advance(); + + if (this.getNavigation().getPath().isDone()) { + vec3d = null; + } else { + vec3d = this.getNavigation().getPath().getNextEntityPos(this); + } + } + + // BOSS BAR! + this.bossInfo.setProgress(this.getHealth() / this.getMaxHealth()); + } + + @Override + protected SoundEvent getAmbientSound() { + return TFSounds.NAGA_HISS.get(); + } + + @Override + protected SoundEvent getHurtSound(DamageSource source) { + return TFSounds.NAGA_HURT.get(); + } + + @Override + public void playHurtSound(DamageSource pSource) {//Just made public + super.playHurtSound(pSource); + } + + @Override + protected SoundEvent getDeathSound() { + return TFSounds.NAGA_HURT.get(); + } + + /** + * Sets the naga to move slowly, such as when he is intimidating the player + */ + public void goSlow() { + Objects.requireNonNull(this.getAttribute(Attributes.MOVEMENT_SPEED)).removeModifier(slowSpeed); // if we apply this twice, we crash, but we can always remove it + Objects.requireNonNull(this.getAttribute(Attributes.MOVEMENT_SPEED)).removeModifier(fastSpeed); + Objects.requireNonNull(this.getAttribute(Attributes.MOVEMENT_SPEED)).addTransientModifier(slowSpeed); + } + + /** + * Normal speed, like when he is circling + */ + public void goNormal() { + Objects.requireNonNull(this.getAttribute(Attributes.MOVEMENT_SPEED)).removeModifier(slowSpeed); + Objects.requireNonNull(this.getAttribute(Attributes.MOVEMENT_SPEED)).removeModifier(fastSpeed); + } + + /** + * Fast, like when he is charging + */ + public void goFast() { + Objects.requireNonNull(this.getAttribute(Attributes.MOVEMENT_SPEED)).removeModifier(slowSpeed); + Objects.requireNonNull(this.getAttribute(Attributes.MOVEMENT_SPEED)).removeModifier(fastSpeed); + Objects.requireNonNull(this.getAttribute(Attributes.MOVEMENT_SPEED)).addTransientModifier(fastSpeed); + } + + @Override + public boolean isPushable() { + return false; + } + + @Override + public boolean isInvulnerableTo(DamageSource src) { + return src.getEntity() != null && !this.isEntityWithinHomeArea(src.getEntity()) // reject damage from outside of our home radius + || src.getDirectEntity() != null && !this.isEntityWithinHomeArea(src.getDirectEntity()) + || src.is(DamageTypeTags.IS_EXPLOSION) || super.isInvulnerableTo(src); + } + + @Override + public boolean hurt(DamageSource source, float amount) { + if (super.hurt(source, amount)) { + this.ticksSinceDamaged = 0; + if (source.getEntity() instanceof ServerPlayer player && !this.hurtBy.contains(player)) { + this.hurtBy.add(player); + } + return true; + } else { + return false; + } + } + + @Override + public boolean doHurtTarget(Entity toAttack) { + if (this.movementAI.getState() == NagaMovementPattern.MovementState.CHARGE && toAttack instanceof LivingEntity living && living.isBlocking()) { + Vec3 motion = this.getDeltaMovement(); + toAttack.push(motion.x() * 1.5D, 0.5D, motion.z() * 1.5D); + this.push(motion.x() * -1.25D, 0.5D, motion.z() * -1.25D); + if (toAttack instanceof ServerPlayer player) { + player.getUseItem().hurtAndBreak(5, player, user -> user.broadcastBreakEvent(player.getUsedItemHand())); + TFPacketHandler.CHANNEL.send(PacketDistributor.PLAYER.with(() -> player), new ThrowPlayerPacket(motion.x() * 3.0D, motion.y() + 0.75D, motion.z() * 3.0D)); + } + this.hurt(this.damageSources().generic(), 4.0F); + this.getLevel().playSound(null, toAttack.blockPosition(), SoundEvents.SHIELD_BLOCK, SoundSource.PLAYERS, 1.0F, 0.8F + this.getLevel().getRandom().nextFloat() * 0.4F); + this.movementAI.doDaze(); + return false; + } + + if (!this.isDazed()) { + boolean result = super.doHurtTarget(toAttack); + + if (result) { + // charging, apply extra pushback + toAttack.push(-Mth.sin((getYRot() * Mth.PI) / 180.0F) * 2.0F, 0.4F, Mth.cos((getYRot() * Mth.PI) / 180.0F) * 2.0F); + } + + return result; + } + return false; + } + + @Override + public float getWalkTargetValue(BlockPos pos) { + if (!this.isWithinRestriction(pos)) { + return Float.MIN_VALUE; + } else { + return 0.0F; + } + } + + @Override + public void checkDespawn() { + if (this.getLevel().getDifficulty() == Difficulty.PEACEFUL) { + if (this.getRestrictCenter() != BlockPos.ZERO) { + this.getLevel().setBlockAndUpdate(this.getRestrictCenter(), TFBlocks.NAGA_BOSS_SPAWNER.get().defaultBlockState()); + } + this.discard(); + } else { + super.checkDespawn(); + } + } + + @Override + public void remove(RemovalReason reason) { + if (reason.equals(RemovalReason.KILLED) && this.level instanceof ServerLevel serverLevel) { + IBossLootBuffer.depositDropsIntoChest(this, this.random.nextBoolean() ? TFBlocks.TWILIGHT_OAK_CHEST.get().defaultBlockState() : TFBlocks.CANOPY_CHEST.get().defaultBlockState(), EntityUtil.bossChestLocation(this), serverLevel); + } + super.remove(reason); + if (this.getLevel() instanceof ServerLevel) { + for (NagaSegment seg : this.bodySegments) { + // must use this instead of setDead + // since multiparts are not added to the world tick list which is what checks isDead + seg.kill(); + } + } + } + + @Override + public boolean isWithinRestriction(BlockPos pos) { + if (this.getRestrictRadius() == -1) { + return true; + } else { + int distX = Math.abs(this.getRestrictCenter().getX() - pos.getX()); + int distY = Math.abs(this.getRestrictCenter().getY() - pos.getY()); + int distZ = Math.abs(this.getRestrictCenter().getZ() - pos.getZ()); + + return distX <= LEASH_X && distY <= LEASH_Y && distZ <= LEASH_Z; + } + } + + public boolean isEntityWithinHomeArea(Entity entity) { + return this.isWithinRestriction(entity.blockPosition()); + } + + public boolean areSelfAndTargetInHome(Entity entity) { + return this.isWithinRestriction(this.blockPosition()) && this.isEntityWithinHomeArea(entity); + } + + private void activateBodySegments() { + for (int i = 0; i < this.currentSegmentCount; i++) { + NagaSegment segment = this.bodySegments[i]; + segment.activate(); + segment.moveTo(getX() + 0.1 * i, getY() + 0.5D, getZ() + 0.1 * i, this.getRandom().nextFloat() * 360.0F, 0.0F); + for (int j = 0; j < 20; j++) { + double d0 = this.getRandom().nextGaussian() * 0.02D; + double d1 = this.getRandom().nextGaussian() * 0.02D; + double d2 = this.getRandom().nextGaussian() * 0.02D; + this.getLevel().addParticle(ParticleTypes.EXPLOSION, + segment.getX() + this.getRandom().nextFloat() * segment.getBbWidth() * 2.0F - segment.getBbWidth() - d0 * 10.0D, + segment.getY() + this.getRandom().nextFloat() * segment.getBbHeight() - d1 * 10.0D, + segment.getZ() + this.getRandom().nextFloat() * segment.getBbWidth() * 2.0F - segment.getBbWidth() - d2 * 10.0D, + d0, d1, d2); + } + } + } + + /** + * Sets the heading (ha ha) of the bodySegments segments + */ + private void moveSegments() { + for (int i = 0; i < this.bodySegments.length; i++) { + this.bodySegments[i].tick(); + Entity leader = i == 0 ? this : this.bodySegments[i - 1]; + double followX = leader.getX(); + double followY = leader.getY(); + double followZ = leader.getZ(); + + // also weight the position so that the segments straighten out a little bit, and the front ones straighten more + float angle = (((leader.getYRot() + 180) * Mth.PI) / 180.0F); + + + double straightenForce = 0.05D + (1.0D / (i + 1)) * 0.5D; + if (this.isDeadOrDying()) straightenForce = 0.0D; //Dead snakes don't move + + double idealX = -Mth.sin(angle) * straightenForce; + double idealZ = Mth.cos(angle) * straightenForce; + + double groundY = this.bodySegments[i].isInWall() ? followY + 2.0F : followY; + double idealY = (groundY - followY) * straightenForce; + + Vec3 diff = new Vec3(this.bodySegments[i].getX() - followX, this.bodySegments[i].getY() - followY, this.bodySegments[i].getZ() - followZ); + diff = diff.normalize(); + + // weight so segments drift towards their ideal position + diff = diff.add(idealX, idealY, idealZ).normalize(); + + double f = 2.0D; + + double destX = followX + f * diff.x(); + double destY = followY + f * diff.y(); + double destZ = followZ + f * diff.z(); + + this.bodySegments[i].setPos(destX, destY, destZ); + + double distance = Mth.sqrt((float) (diff.x() * diff.x() + diff.z() * diff.z())); + + if (i == 0) { + // tilt segment next to head up towards head + diff = diff.add(0.0D, -0.15D, 0.0D); + } + + this.bodySegments[i].setRot((float) (Math.atan2(diff.z(), diff.x()) * 180.0D / Math.PI) + 90.0F, -(float) (Math.atan2(diff.y(), distance) * 180.0D / Math.PI)); + } + } + + @Override + public void addAdditionalSaveData(CompoundTag compound) { + this.saveHomePointToNbt(compound); + this.addDeathItemsSaveData(compound); + super.addAdditionalSaveData(compound); + } + + @Override + public void readAdditionalSaveData(CompoundTag compound) { + super.readAdditionalSaveData(compound); + this.readDeathItemsSaveData(compound); + this.loadHomePointFromNbt(compound, 20); + if (this.hasCustomName()) { + this.bossInfo.setName(this.getDisplayName()); + } + } + + @Override + public void die(DamageSource cause) { + super.die(cause); + // mark the courtyard as defeated + if (this.getLevel() instanceof ServerLevel serverLevel) { + this.bossInfo.setProgress(0.0F); + LandmarkUtil.markStructureConquered(this.getLevel(), this, TFStructures.NAGA_COURTYARD, true); + for (ServerPlayer player : this.hurtBy) { + TFAdvancements.HURT_BOSS.trigger(player, this); + } + + IBossLootBuffer.saveDropsIntoBoss(this, this.createLootContext(true, cause).create(LootContextParamSets.ENTITY), serverLevel); + } + } + + @Override + protected void tickDeath() { + ++this.deathTime; + if (!this.level.isClientSide && !this.isRemoved()) { + int renderEnd = 24; + int maxDeath = renderEnd + 120; + if (this.deathTime >= renderEnd) { + if (this.deathTime == renderEnd) { + SoundEvent soundevent = this.getDeathSound(); + if (soundevent != null) { + this.playSound(soundevent, this.getSoundVolume() * 1.2F, this.getVoicePitch() * 0.75F); + } + this.level.broadcastEntityEvent(this, (byte) 60); + } else if (this.deathTime >= maxDeath) { + this.remove(Entity.RemovalReason.KILLED); + } else { + Vec3 start = this.position().add(0.0D, this.getBbHeight() * 0.5D, 0.0D); + Vec3 end = Vec3.atCenterOf(EntityUtil.bossChestLocation(this)); + Vec3 diff = end.subtract(start); + + ParticlePacket particlePacket = new ParticlePacket(); + if (this.deathTime >= maxDeath - 3) { + for (int i = 0; i < 40; i++) { + double x = (this.random.nextDouble() - 0.5D) * 0.075D * i; + double y = (this.random.nextDouble() - 0.5D) * 0.075D * i; + double z = (this.random.nextDouble() - 0.5D) * 0.075D * i; + particlePacket.queueParticle(ParticleTypes.POOF, false, end.add(x, y, z), Vec3.ZERO); + } + } + + double angle = Math.atan2(end.z - start.z, end.x - start.x) * Mth.RAD_TO_DEG + 180D; + + double xMul = angle % 180.0D; + xMul = Math.min(xMul, 180.0D - xMul); + xMul = Math.pow((xMul / 90.0D), 1.5D) * 2.0D; + + double zMul = (angle + 90.0D) % 180.0D; + zMul = Math.min(zMul, 180.0D - zMul); + zMul = Math.pow((zMul / 90.0D), 1.5D) * 2.0D; + + for (int p = 0; p < 4; p++) { + int trailTime = (this.deathTime - renderEnd) - p + 1;//Plus one cuz the math makes it reach the correct spot at 120 ticks, but the method ends at 119 + if (trailTime < 0) continue; + for (double d = 0.0D; d < 1.0D; d += 0.25D) { + double preciseTime = trailTime - d; + if (preciseTime < 0.0D) continue; + double factor = preciseTime / (double) (maxDeath - renderEnd); + Vec3 particlePos = start.add(diff.scale(factor)).add(Math.sin(preciseTime * Math.PI * 0.075D) * xMul, Math.sin(preciseTime * Math.PI * 0.025D) * 0.1D, Math.cos(preciseTime * Math.PI * 0.0625D) * zMul);//Some sine waves to make it slither-y; + BlockHitResult blockhitresult = this.level.clip(new ClipContext(particlePos.add(0.0D, 2.0D, 0.0D), particlePos.subtract(0.0D, 3.0D, 0.0D), ClipContext.Block.COLLIDER, ClipContext.Fluid.WATER, null)); + particlePacket.queueParticle(ParticleTypes.COMPOSTER, false, blockhitresult.getLocation().add(0.0D, 0.15D, 0.0D), Vec3.ZERO); + } + } + TFPacketHandler.CHANNEL.send(PacketDistributor.TRACKING_ENTITY.with(() -> this), particlePacket); + } + } + } + } + + @Override + public void handleEntityEvent(byte id) { + if (id == 60) { + Vec3 pos = this.position(); + float width = this.getBbWidth(); + float height = this.getBbHeight(); + for (int k = 0; k < 20; k++) { + this.getLevel().addParticle(random.nextBoolean() ? ParticleTypes.EXPLOSION : ParticleTypes.POOF, + (pos.x + this.random.nextFloat() * width * 2.0F) - width, + pos.y + this.random.nextFloat() * height, + (pos.z + this.random.nextFloat() * width * 2.0F) - width, + this.random.nextGaussian() * 0.02D, this.random.nextGaussian() * 0.02D, this.random.nextGaussian() * 0.02D); + } + } + super.handleEntityEvent(id); + } + + @Override + protected boolean shouldDropLoot() { + // Invoked the mob's loot during die, this will avoid duplicating during the actual drop phase + return false; + } + + @Override + public boolean isMultipartEntity() { + return true; + } + + @Override + public void recreateFromPacket(ClientboundAddEntityPacket packet) { + super.recreateFromPacket(packet); + TFPart.assignPartIDs(this); + } + + @Nullable + @Override + public PartEntity[] getParts() { + return this.bodySegments; + } + + @Override + public void startSeenByPlayer(ServerPlayer player) { + super.startSeenByPlayer(player); + this.bossInfo.addPlayer(player); + } + + @Override + public void stopSeenByPlayer(ServerPlayer player) { + super.stopSeenByPlayer(player); + this.bossInfo.removePlayer(player); + } + + @Override + public void setCustomName(@Nullable Component name) { + super.setCustomName(name); + this.bossInfo.setName(this.getDisplayName()); + } + + @Override + public float getStepHeight() { + return 2.0F; + } + + @Override + public boolean removeWhenFarAway(double distance) { + return false; + } + + @Override + protected boolean canRide(Entity entity) { + return false; + } + + @Override + public boolean isPushedByFluid(FluidType type) { + return false; + } + + @Override + protected float getWaterSlowDown() { + return 1.0F; + } + + @Override + public boolean canChangeDimensions() { + return false; + } + + @Override + public BlockPos getRestrictionCenter() { + return this.getRestrictCenter(); + } + + @Override + public void setRestriction(BlockPos pos, int dist) { + this.restrictTo(pos, dist); + } + + @Override + public NonNullList getItemStacks() { + return this.dyingInventory; + } +} diff --git a/src/main/java/twilightforest/entity/boss/NagaSegment.java b/src/main/java/twilightforest/entity/boss/NagaSegment.java new file mode 100644 index 0000000000..c8abe31753 --- /dev/null +++ b/src/main/java/twilightforest/entity/boss/NagaSegment.java @@ -0,0 +1,152 @@ +package twilightforest.entity.boss; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityDimensions; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.animal.Animal; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import twilightforest.TwilightForestMod; +import twilightforest.entity.TFPart; + +import java.util.List; + +public class NagaSegment extends TFPart { + + public static final ResourceLocation RENDERER = TwilightForestMod.prefix("naga_segment"); + + private int deathCounter; + + public NagaSegment(Naga naga) { + super(naga); + this.setPos(naga.getX(), naga.getY(), naga.getZ()); + } + + @Override + protected void defineSynchedData() { + this.deactivate(); + } + + @Override + @OnlyIn(Dist.CLIENT) + public ResourceLocation renderer() { + return RENDERER; + } + + @Override + public boolean hurt(DamageSource src, float damage) { + return !this.isInvisible() && this.getParent().hurt(src, damage * 2.0F / 3.0F); + } + + @Override + public boolean is(Entity entity) { + return entity == this || entity == this.getParent(); + } + + @Override + protected void readAdditionalSaveData(CompoundTag compound) { + + } + + @Override + protected void addAdditionalSaveData(CompoundTag compound) { + + } + + @Override + public void tick() { + super.tick(); + + ++this.tickCount; + + if (!this.isInvisible()) + this.collideWithOthers(); + + if (this.deathCounter > 0) { + this.deathCounter--; + if (this.deathCounter <= 0) { + Vec3 pos = this.position(); + float width = this.getBbWidth(); + float height = this.getBbHeight(); + for (int k = 0; k < 20; k++) { + this.getLevel().addParticle(random.nextBoolean() ? ParticleTypes.EXPLOSION : ParticleTypes.POOF, + (pos.x + this.random.nextFloat() * width * 2.0F) - width, + pos.y + this.random.nextFloat() * height, + (pos.z + this.random.nextFloat() * width * 2.0F) - width, + this.random.nextGaussian() * 0.02D, this.random.nextGaussian() * 0.02D, this.random.nextGaussian() * 0.02D); + } + + this.getParent().playHurtSound(this.damageSources().generic()); + this.getParent().deathTime = 0; + this.deactivate(); + } + } + } + + private void collideWithOthers() { + List list = this.getLevel().getEntities(this, this.getBoundingBox().inflate(0.2D, 0.0D, 0.2D)); + + for (Entity entity : list) { + if (entity.isPushable()) { + this.collideWithEntity(entity); + } + } + } + + private void collideWithEntity(Entity entity) { + entity.push(this); + + // attack anything that's not us + if (entity instanceof LivingEntity && !(entity instanceof Naga) && !this.getParent().isDazed()) { + int attackStrength = 2; + + // get rid of nearby deer & look impressive + if (entity instanceof Animal) { + attackStrength *= 3; + } + + entity.hurt(entity.getLevel().damageSources().mobAttack(this.getParent()), attackStrength); + } + } + + public void deactivate() { + this.setSize(EntityDimensions.scalable(0.0F, 0.0F)); + this.setInvisible(true); + } + + public void activate() { + this.setSize(EntityDimensions.scalable(1.8F, 1.8F)); + this.setInvisible(false); + } + + // make public + @Override + public void setRot(float yaw, float pitch) { + super.setRot(yaw, pitch); + } + + @Override + protected void playStepSound(BlockPos pos, BlockState block) { + } + + public void selfDestruct(int counter) { + this.deathCounter = counter; + } + + @Override + public boolean canChangeDimensions() { + return false; + } + + @Override + public float getStepHeight() { + return 2.0F; + } +} diff --git a/src/main/java/twilightforest/entity/boss/PlateauBoss.java b/src/main/java/twilightforest/entity/boss/PlateauBoss.java new file mode 100644 index 0000000000..f83d63421c --- /dev/null +++ b/src/main/java/twilightforest/entity/boss/PlateauBoss.java @@ -0,0 +1,152 @@ +package twilightforest.entity.boss; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerBossEvent; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.BossEvent; +import net.minecraft.world.Difficulty; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.monster.Monster; +import net.minecraft.world.level.Level; +import net.minecraftforge.fluids.FluidType; +import org.jetbrains.annotations.Nullable; +import twilightforest.advancements.TFAdvancements; +import twilightforest.entity.EnforcedHomePoint; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFStructures; +import twilightforest.util.LandmarkUtil; + +import java.util.ArrayList; +import java.util.List; + +public class PlateauBoss extends Monster implements EnforcedHomePoint { + + private final ServerBossEvent bossInfo = new ServerBossEvent(getDisplayName(), BossEvent.BossBarColor.WHITE, BossEvent.BossBarOverlay.PROGRESS); + private final List hurtBy = new ArrayList<>(); + + public PlateauBoss(EntityType type, Level world) { + super(type, world); + this.xpReward = 647; + } + + public static AttributeSupplier.Builder registerAttributes() { + return Monster.createMonsterAttributes(); + } + + @Override + protected void registerGoals() { + } + + @Override + public void aiStep() { + if (!this.getLevel().isClientSide()) { + this.bossInfo.setProgress(this.getHealth() / this.getMaxHealth()); + } + } + + @Override + public boolean removeWhenFarAway(double distance) { + return false; + } + + @Override + public void checkDespawn() { + if (this.getLevel().getDifficulty() == Difficulty.PEACEFUL) { + if (!this.hasRestriction()) { + this.getLevel().setBlockAndUpdate(getRestrictCenter(), TFBlocks.FINAL_BOSS_BOSS_SPAWNER.get().defaultBlockState()); + } + this.discard(); + } else { + super.checkDespawn(); + } + } + + @Override + public boolean hurt(DamageSource source, float amount) { + if(source.getEntity() instanceof ServerPlayer player && !this.hurtBy.contains(player)) { + this.hurtBy.add(player); + } + return super.hurt(source, amount); + } + + @Override + public void die(DamageSource cause) { + super.die(cause); + if (!this.getLevel().isClientSide()) { + this.bossInfo.setProgress(0.0F); + LandmarkUtil.markStructureConquered(this.getLevel(), this, TFStructures.FINAL_CASTLE, true); + for(ServerPlayer player : this.hurtBy) { + TFAdvancements.HURT_BOSS.trigger(player, this); + } + } + } + + @Override + public void setCustomName(@Nullable Component name) { + super.setCustomName(name); + this.bossInfo.setName(this.getDisplayName()); + } + + @Override + public void startSeenByPlayer(ServerPlayer player) { + super.startSeenByPlayer(player); + this.bossInfo.addPlayer(player); + } + + @Override + public void stopSeenByPlayer(ServerPlayer player) { + super.stopSeenByPlayer(player); + this.bossInfo.removePlayer(player); + } + + @Override + public void addAdditionalSaveData(CompoundTag compound) { + BlockPos home = this.getRestrictCenter(); + this.saveHomePointToNbt(compound); + super.addAdditionalSaveData(compound); + } + + @Override + public void readAdditionalSaveData(CompoundTag compound) { + super.readAdditionalSaveData(compound); + this.loadHomePointFromNbt(compound, 30); + if (this.hasCustomName()) { + this.bossInfo.setName(this.getDisplayName()); + } + } + + @Override + protected boolean canRide(Entity entity) { + return false; + } + + @Override + public boolean isPushedByFluid(FluidType type) { + return false; + } + + @Override + protected float getWaterSlowDown() { + return 1.0F; + } + + @Override + public boolean canChangeDimensions() { + return false; + } + + @Override + public BlockPos getRestrictionCenter() { + return this.getRestrictCenter(); + } + + @Override + public void setRestriction(BlockPos pos, int dist) { + this.restrictTo(pos, dist); + } +} diff --git a/src/main/java/twilightforest/entity/boss/SnowQueen.java b/src/main/java/twilightforest/entity/boss/SnowQueen.java new file mode 100644 index 0000000000..ebddb13f23 --- /dev/null +++ b/src/main/java/twilightforest/entity/boss/SnowQueen.java @@ -0,0 +1,549 @@ +package twilightforest.entity.boss; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.network.protocol.game.ClientboundAddEntityPacket; +import net.minecraft.network.syncher.EntityDataAccessor; +import net.minecraft.network.syncher.EntityDataSerializers; +import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.server.level.ServerBossEvent; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.world.BossEvent; +import net.minecraft.world.Difficulty; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.control.FlyingMoveControl; +import net.minecraft.world.entity.ai.goal.LookAtPlayerGoal; +import net.minecraft.world.entity.ai.goal.MeleeAttackGoal; +import net.minecraft.world.entity.ai.goal.RandomLookAroundGoal; +import net.minecraft.world.entity.ai.goal.target.HurtByTargetGoal; +import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal; +import net.minecraft.world.entity.monster.Monster; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.gameevent.GameEvent; +import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.entity.PartEntity; +import net.minecraftforge.event.ForgeEventFactory; +import net.minecraftforge.fluids.FluidType; +import org.jetbrains.annotations.Nullable; +import twilightforest.advancements.TFAdvancements; +import twilightforest.entity.EnforcedHomePoint; +import twilightforest.entity.IBreathAttacker; +import twilightforest.entity.TFPart; +import twilightforest.entity.ai.goal.HoverBeamGoal; +import twilightforest.entity.ai.goal.HoverSummonGoal; +import twilightforest.entity.ai.goal.HoverThenDropGoal; +import twilightforest.entity.monster.IceCrystal; +import twilightforest.init.*; +import twilightforest.loot.TFLootTables; +import twilightforest.util.EntityUtil; +import twilightforest.util.LandmarkUtil; +import twilightforest.util.WorldUtil; + +import java.util.ArrayList; +import java.util.List; + +public class SnowQueen extends Monster implements IBreathAttacker, EnforcedHomePoint { + + private static final int MAX_SUMMONS = 6; + private static final EntityDataAccessor BEAM_FLAG = SynchedEntityData.defineId(SnowQueen.class, EntityDataSerializers.BOOLEAN); + private static final EntityDataAccessor PHASE_FLAG = SynchedEntityData.defineId(SnowQueen.class, EntityDataSerializers.BYTE); + private final ServerBossEvent bossInfo = new ServerBossEvent(getDisplayName(), BossEvent.BossBarColor.WHITE, BossEvent.BossBarOverlay.PROGRESS); + private static final int MAX_DAMAGE_WHILE_BEAMING = 25; + private static final float BREATH_DAMAGE = 4.0F; + + public enum Phase {SUMMON, DROP, BEAM} + + public final SnowQueenIceShield[] iceArray = new SnowQueenIceShield[7]; + + private int summonsRemaining = 0; + private int successfulDrops; + private int maxDrops; + private int damageWhileBeaming; + + private final List hurtBy = new ArrayList<>(); + + public SnowQueen(EntityType type, Level world) { + super(type, world); + + for (int i = 0; i < this.iceArray.length; i++) { + this.iceArray[i] = new SnowQueenIceShield(this); + } + + this.setCurrentPhase(Phase.SUMMON); + + this.xpReward = 317; + this.moveControl = new FlyingMoveControl(this, 10, true); + setNoGravity(true); + } + + @Override + protected void registerGoals() { + this.goalSelector.addGoal(1, new HoverSummonGoal(this)); + this.goalSelector.addGoal(2, new HoverThenDropGoal(this, 80, 20)); + this.goalSelector.addGoal(3, new HoverBeamGoal(this, 80, 100)); + this.addRestrictionGoals(this, this.goalSelector); + this.goalSelector.addGoal(6, new MeleeAttackGoal(this, 1.0D, true)); + this.goalSelector.addGoal(8, new LookAtPlayerGoal(this, Player.class, 8.0F)); + this.goalSelector.addGoal(8, new RandomLookAroundGoal(this)); + this.targetSelector.addGoal(1, new HurtByTargetGoal(this)); + this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true)); + } + + @Override + public boolean isPushable() { + return false; + } + + public static AttributeSupplier.Builder registerAttributes() { + return Monster.createMonsterAttributes() + .add(Attributes.MOVEMENT_SPEED, 0.23D) + .add(Attributes.FLYING_SPEED, 0.23D) + .add(Attributes.ATTACK_DAMAGE, 7.0D) + .add(Attributes.FOLLOW_RANGE, 40.0D) + .add(Attributes.MAX_HEALTH, 200.0D) + .add(Attributes.KNOCKBACK_RESISTANCE, 0.75D); + } + + @Override + protected void defineSynchedData() { + super.defineSynchedData(); + this.getEntityData().define(BEAM_FLAG, false); + this.getEntityData().define(PHASE_FLAG, (byte) 0); + } + + @Override + protected SoundEvent getAmbientSound() { + return TFSounds.SNOW_QUEEN_AMBIENT.get(); + } + + @Override + protected SoundEvent getHurtSound(DamageSource source) { + return TFSounds.SNOW_QUEEN_HURT.get(); + } + + @Override + protected SoundEvent getDeathSound() { + return TFSounds.SNOW_QUEEN_DEATH.get(); + } + + @Override + public void aiStep() { + super.aiStep(); + if (!this.getLevel().isClientSide()) { + this.bossInfo.setProgress(this.getHealth() / this.getMaxHealth()); + } else { + this.spawnParticles(); + } + } + + private void spawnParticles() { + // make snow particles + for (int i = 0; i < 3; i++) { + float px = (this.getRandom().nextFloat() - this.getRandom().nextFloat()) * 0.3F; + float py = this.getEyeHeight() + (this.getRandom().nextFloat() - this.getRandom().nextFloat()) * 0.5F; + float pz = (this.getRandom().nextFloat() - this.getRandom().nextFloat()) * 0.3F; + + this.getLevel().addParticle(TFParticleType.SNOW_GUARDIAN.get(), this.xOld + px, this.yOld + py, this.zOld + pz, 0, 0, 0); + } + + // during drop phase, all the ice blocks should make particles + if (this.getCurrentPhase() == Phase.DROP) { + for (Entity ice : this.iceArray) { + float px = (this.getRandom().nextFloat() - this.getRandom().nextFloat()) * 0.5F; + float py = (this.getRandom().nextFloat() - this.getRandom().nextFloat()) * 0.5F; + float pz = (this.getRandom().nextFloat() - this.getRandom().nextFloat()) * 0.5F; + + this.getLevel().addParticle(TFParticleType.SNOW_WARNING.get(), ice.xOld + px, ice.yOld + py, ice.zOld + pz, 0, 0, 0); + } + } + + // when ice beaming, spew particles + if (isBreathing() && this.isAlive()) { + Vec3 look = this.getLookAngle(); + + double dist = 0.5; + double px = this.getX() + look.x() * dist; + double py = this.getY() + 1.7F + look.y() * dist; + double pz = this.getZ() + look.z() * dist; + + for (int i = 0; i < 10; i++) { + double dx = look.x(); + double dy = 0; + double dz = look.z(); + + double spread = 2 + this.getRandom().nextDouble() * 2.5; + double velocity = 2.0 + this.getRandom().nextDouble() * 0.15; + + // beeeam + dx += this.getRandom().nextGaussian() * 0.0075D * spread; + dy += this.getRandom().nextGaussian() * 0.0075D * spread; + dz += this.getRandom().nextGaussian() * 0.0075D * spread; + dx *= velocity; + dy *= velocity; + dz *= velocity; + + this.getLevel().addParticle(TFParticleType.ICE_BEAM.get(), px, py, pz, dx, dy, dz); + } + } + } + + @Override + public void tick() { + this.setDeltaMovement(this.getDeltaMovement().x(), this.getDeltaMovement().y() - 0.05D, this.getDeltaMovement().z()); + super.tick(); + + for (int i = 0; i < this.iceArray.length; i++) { + this.iceArray[i].tick(); + if (i < this.iceArray.length - 1) { + // set block position + Vec3 blockPos = this.getIceShieldPosition(i); + + this.iceArray[i].setPos(blockPos.x(), blockPos.y(), blockPos.z()); + } else { + // last block beneath + this.iceArray[i].setPos(this.getX(), this.getY() - 1, this.getZ()); + } + this.iceArray[i].setYRot(this.getIceShieldAngle(i)); + + // collide things with the block + if (!this.getLevel().isClientSide()) { + this.applyShieldCollisions(this.iceArray[i]); + } + } + + // death animation + if (this.deathTime > 0) { + for (int k = 0; k < 5; k++) { + double d = this.getRandom().nextGaussian() * 0.02D; + double d1 = this.getRandom().nextGaussian() * 0.02D; + double d2 = this.getRandom().nextGaussian() * 0.02D; + this.getLevel().addParticle(this.getRandom().nextBoolean() ? ParticleTypes.EXPLOSION : ParticleTypes.POOF, + (this.getX() + this.getRandom().nextFloat() * this.getBbWidth() * 2.0F) - this.getBbWidth(), + this.getY() + this.getRandom().nextFloat() * this.getBbHeight(), + (this.getZ() + this.getRandom().nextFloat() * this.getBbWidth() * 2.0F) - this.getBbWidth(), d, d1, d2); + } + } + } + + @Override + public boolean removeWhenFarAway(double distance) { + return false; + } + + @Override + public void checkDespawn() { + if (this.getLevel().getDifficulty() == Difficulty.PEACEFUL) { + if (this.getRestrictCenter() != BlockPos.ZERO) { + this.getLevel().setBlockAndUpdate(this.getRestrictCenter(), TFBlocks.SNOW_QUEEN_BOSS_SPAWNER.get().defaultBlockState()); + } + this.discard(); + } else { + super.checkDespawn(); + } + } + + @Override + public void die(DamageSource cause) { + super.die(cause); + // mark the tower as defeated + if (!this.getLevel().isClientSide()) { + this.bossInfo.setProgress(0.0F); + LandmarkUtil.markStructureConquered(this.getLevel(), this, TFStructures.AURORA_PALACE, true); + for (ServerPlayer player : this.hurtBy) { + TFAdvancements.HURT_BOSS.trigger(player, this); + } + + TFLootTables.entityDropsIntoContainer(this, this.createLootContext(true, cause).create(LootContextParamSets.ENTITY), TFBlocks.TWILIGHT_OAK_CHEST.get().defaultBlockState(), EntityUtil.bossChestLocation(this)); + } + } + + @Override + protected boolean shouldDropLoot() { + // Invoked the mob's loot during die, this will avoid duplicating during the actual drop phase + return false; + } + + private void applyShieldCollisions(Entity collider) { + List list = this.getLevel().getEntities(collider, collider.getBoundingBox().inflate(-0.2F, -0.2F, -0.2F)); + + for (Entity collided : list) { + if (collided.isPushable()) { + this.applyShieldCollision(collider, collided); + } + } + } + + /** + * Do the effect where the shield hits something + */ + private void applyShieldCollision(Entity collider, Entity collided) { + if (collided != this) { + collided.push(collider); + if (collided instanceof LivingEntity && this.doHurtTarget(collided)) { + Vec3 motion = collided.getDeltaMovement(); + collided.setDeltaMovement(motion.x(), motion.y() + 0.4, motion.z()); + this.playSound(TFSounds.SNOW_QUEEN_ATTACK.get(), 1.0F, 1.0F); + } + } + } + + @Override + public boolean doHurtTarget(Entity entity) { + DamageSource source = this.getCurrentPhase() == Phase.DROP ? TFDamageTypes.getDamageSource(this.getLevel(), TFDamageTypes.SQUISH, TFEntities.SNOW_QUEEN.get()) : this.getLevel().damageSources().mobAttack(this); + return EntityUtil.properlyApplyCustomDamageSource(this, entity, source); + } + + @Override + protected void customServerAiStep() { + super.customServerAiStep(); + + // switch phases + if (this.getCurrentPhase() == Phase.SUMMON && this.getSummonsRemaining() == 0 && this.countMyMinions() <= 0) { + this.setCurrentPhase(Phase.DROP); + } + if (this.getCurrentPhase() == Phase.DROP && this.successfulDrops >= this.maxDrops) { + this.setCurrentPhase(Phase.BEAM); + } + if (this.getCurrentPhase() == Phase.BEAM && this.damageWhileBeaming >= MAX_DAMAGE_WHILE_BEAMING) { + this.setCurrentPhase(Phase.SUMMON); + } + } + + @Override + public boolean hurt(DamageSource source, float damage) { + boolean result = super.hurt(source, damage); + + if (result && this.getCurrentPhase() == Phase.BEAM) { + this.damageWhileBeaming += damage; + } + + if (source.getEntity() instanceof ServerPlayer player && !this.hurtBy.contains(player)) { + this.hurtBy.add(player); + } + return result; + + } + + @Override + public void lavaHurt() { + if (!this.fireImmune()) { + this.setSecondsOnFire(5); + if (this.hurt(this.damageSources().lava(), 4F)) { + this.playSound(SoundEvents.GENERIC_BURN, 0.4F, 2.0F + this.random.nextFloat() * 0.4F); + EntityUtil.killLavaAround(this); + } + } + } + + private Vec3 getIceShieldPosition(int idx) { + return this.getIceShieldPosition(this.getIceShieldAngle(idx), 1.0F); + } + + private float getIceShieldAngle(int idx) { + return 60F * idx + (this.tickCount * 5.0F); + } + + private Vec3 getIceShieldPosition(float angle, float distance) { + double dx = Math.cos((angle) * Math.PI / 180.0D) * distance; + double dz = Math.sin((angle) * Math.PI / 180.0D) * distance; + + return new Vec3(this.getX() + dx, this.getY() + this.getShieldYOffset(), this.getZ() + dz); + } + + private double getShieldYOffset() { + return 0.1F; + } + + public void destroyBlocksInAABB(AABB box) { + if (ForgeEventFactory.getMobGriefingEvent(this.getLevel(), this)) { + for (BlockPos pos : WorldUtil.getAllInBB(box)) { + BlockState state = this.getLevel().getBlockState(pos); + if (state.getBlock() == Blocks.ICE || state.getBlock() == Blocks.PACKED_ICE) { + this.getLevel().destroyBlock(pos, false); + this.gameEvent(GameEvent.BLOCK_DESTROY); + } + } + } + } + + @Override + public boolean isBreathing() { + return this.entityData.get(BEAM_FLAG); + } + + @Override + public void setBreathing(boolean flag) { + this.entityData.set(BEAM_FLAG, flag); + } + + public Phase getCurrentPhase() { + return Phase.values()[this.entityData.get(PHASE_FLAG)]; + } + + public void setCurrentPhase(Phase currentPhase) { + this.entityData.set(PHASE_FLAG, (byte) currentPhase.ordinal()); + + // set variables for current phase + if (currentPhase == Phase.SUMMON) { + this.setSummonsRemaining(MAX_SUMMONS); + } + if (currentPhase == Phase.DROP) { + this.successfulDrops = 0; + this.maxDrops = 2 + this.getRandom().nextInt(3); + } + if (currentPhase == Phase.BEAM) { + this.damageWhileBeaming = 0; + } + } + + public int getSummonsRemaining() { + return this.summonsRemaining; + } + + public void setSummonsRemaining(int summonsRemaining) { + this.summonsRemaining = summonsRemaining; + } + + public void summonMinionAt(LivingEntity targetedEntity) { + IceCrystal minion = new IceCrystal(this.getLevel()); + minion.absMoveTo(this.getX(), this.getY(), this.getZ(), 0.0F, 0.0F); + + this.getLevel().addFreshEntity(minion); + + for (int i = 0; i < 100; i++) { + double attemptX; + double attemptY; + double attemptZ; + if (getRestrictCenter() != BlockPos.ZERO) { + BlockPos home = getRestrictCenter(); + attemptX = home.getX() + this.getRandom().nextGaussian() * 3.0D; + attemptY = home.getY() + this.getRandom().nextGaussian() * 2.0D; + attemptZ = home.getZ() + this.getRandom().nextGaussian() * 3.0D; + } else { + attemptX = targetedEntity.getX() + this.getRandom().nextGaussian() * 6.0D; + attemptY = targetedEntity.getY() + this.getRandom().nextGaussian() * 8.0D; + attemptZ = targetedEntity.getZ() + this.getRandom().nextGaussian() * 6.0D; + } + if (minion.randomTeleport(attemptX, attemptY, attemptZ, true)) { + this.gameEvent(GameEvent.ENTITY_PLACE, minion); + break; + } + } + + minion.setTarget(targetedEntity); + minion.setToDieIn30Seconds(); // don't stick around + + this.summonsRemaining--; + } + + public int countMyMinions() { + return this.getLevel().getEntitiesOfClass(IceCrystal.class, new AABB(this.getX(), this.getY(), this.getZ(), this.getX() + 1, this.getY() + 1, this.getZ() + 1).inflate(32.0D, 16.0D, 32.0D)).size(); + } + + public void incrementSuccessfulDrops() { + this.successfulDrops++; + } + + @Override + public void doBreathAttack(Entity target) { + target.hurt(TFDamageTypes.getDamageSource(this.getLevel(), TFDamageTypes.CHILLING_BREATH, TFEntities.SNOW_QUEEN.get()), BREATH_DAMAGE); + // TODO: slow target? + } + + @Override + public void setCustomName(@Nullable Component name) { + super.setCustomName(name); + this.bossInfo.setName(this.getDisplayName()); + } + + @Override + public void startSeenByPlayer(ServerPlayer player) { + super.startSeenByPlayer(player); + this.bossInfo.addPlayer(player); + } + + @Override + public void stopSeenByPlayer(ServerPlayer player) { + super.stopSeenByPlayer(player); + this.bossInfo.removePlayer(player); + } + + @Override + public void addAdditionalSaveData(CompoundTag compound) { + this.saveHomePointToNbt(compound); + super.addAdditionalSaveData(compound); + } + + @Override + public void readAdditionalSaveData(CompoundTag compound) { + super.readAdditionalSaveData(compound); + this.loadHomePointFromNbt(compound, 20); + if (this.hasCustomName()) { + this.bossInfo.setName(this.getDisplayName()); + } + } + + @Override + protected boolean canRide(Entity entity) { + return false; + } + + @Override + public boolean isPushedByFluid(FluidType type) { + return false; + } + + @Override + protected float getWaterSlowDown() { + return 1.0F; + } + + @Override + public boolean canChangeDimensions() { + return false; + } + + @Override + public boolean isMultipartEntity() { + return true; + } + + @Override + public void recreateFromPacket(ClientboundAddEntityPacket packet) { + super.recreateFromPacket(packet); + TFPart.assignPartIDs(this); + } + + /** + * We need to do this for the bounding boxes on the parts to become active + */ + @Nullable + @Override + public PartEntity[] getParts() { + return this.iceArray; + } + + @Override + public BlockPos getRestrictionCenter() { + return this.getRestrictCenter(); + } + + @Override + public void setRestriction(BlockPos pos, int dist) { + this.restrictTo(pos, dist); + } +} diff --git a/src/main/java/twilightforest/entity/boss/SnowQueenIceShield.java b/src/main/java/twilightforest/entity/boss/SnowQueenIceShield.java new file mode 100644 index 0000000000..0a7589c860 --- /dev/null +++ b/src/main/java/twilightforest/entity/boss/SnowQueenIceShield.java @@ -0,0 +1,52 @@ +package twilightforest.entity.boss; + +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.EntityDimensions; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.projectile.AbstractArrow; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import twilightforest.init.TFSounds; +import twilightforest.TwilightForestMod; +import twilightforest.entity.TFPart; + +public class SnowQueenIceShield extends TFPart { + + public static final ResourceLocation RENDERER = TwilightForestMod.prefix("snowqueen_iceshield"); + + public SnowQueenIceShield(SnowQueen parent) { + super(parent); + this.dimensions = EntityDimensions.scalable(0.75F, 0.75F); + } + + @OnlyIn(Dist.CLIENT) + public ResourceLocation renderer() { + return RENDERER; + } + + @Override + public boolean hurt(DamageSource source, float amount) { + if (source.getDirectEntity() instanceof AbstractArrow arrow && arrow.getPierceLevel() > 0) { + return true; + } + + this.playSound(TFSounds.SNOW_QUEEN_BREAK.get(), 1.0F, ((this.random.nextFloat() - this.random.nextFloat()) * 0.7F + 1.0F) * 2.0F); + return false; + } + + @Override + protected void readAdditionalSaveData(CompoundTag compound) { + + } + + @Override + protected void addAdditionalSaveData(CompoundTag compound) { + + } + + @Override + protected void defineSynchedData() { + + } +} diff --git a/src/main/java/twilightforest/entity/boss/UrGhast.java b/src/main/java/twilightforest/entity/boss/UrGhast.java new file mode 100644 index 0000000000..5b170fdac0 --- /dev/null +++ b/src/main/java/twilightforest/entity/boss/UrGhast.java @@ -0,0 +1,592 @@ +package twilightforest.entity.boss; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.NonNullList; +import net.minecraft.core.particles.DustParticleOptions; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.network.syncher.EntityDataAccessor; +import net.minecraft.network.syncher.EntityDataSerializers; +import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.server.level.ServerBossEvent; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.tags.DamageTypeTags; +import net.minecraft.world.BossEvent; +import net.minecraft.world.Difficulty; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.damagesource.DamageTypes; +import net.minecraft.world.entity.*; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.village.poi.PoiManager; +import net.minecraft.world.entity.ai.village.poi.PoiRecord; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.network.PacketDistributor; +import org.jetbrains.annotations.Nullable; +import twilightforest.advancements.TFAdvancements; +import twilightforest.client.renderer.TFWeatherRenderer; +import twilightforest.entity.ai.control.NoClipMoveControl; +import twilightforest.entity.ai.goal.GhastguardHomedFlightGoal; +import twilightforest.entity.ai.goal.UrGhastFlightGoal; +import twilightforest.entity.monster.CarminiteGhastguard; +import twilightforest.entity.monster.CarminiteGhastling; +import twilightforest.entity.projectile.UrGhastFireball; +import twilightforest.init.*; +import twilightforest.network.ParticlePacket; +import twilightforest.network.TFPacketHandler; +import twilightforest.util.EntityUtil; +import twilightforest.util.LandmarkUtil; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +//ghastguards already set home points so theres no need to here +public class UrGhast extends CarminiteGhastguard implements IBossLootBuffer { + private static final Vec3 DYING_DECENT = new Vec3(0.0D, -0.03D, 0.0D); + private static final EntityDataAccessor DATA_TANTRUM = SynchedEntityData.defineId(UrGhast.class, EntityDataSerializers.BOOLEAN); + private final NonNullList dyingInventory = NonNullList.withSize(27, ItemStack.EMPTY); + + private List trapLocations; + private int nextTantrumCry; + + private float damageUntilNextPhase = 10; // how much damage can we take before we toggle tantrum mode + private final ServerBossEvent bossInfo = new ServerBossEvent(getDisplayName(), BossEvent.BossBarColor.RED, BossEvent.BossBarOverlay.PROGRESS); + private final List hurtBy = new ArrayList<>(); + + public UrGhast(EntityType type, Level world) { + super(type, world); + this.wanderFactor = 32.0F; + this.noPhysics = true; + this.setInTantrum(false); + this.xpReward = 317; + this.moveControl = new NoClipMoveControl(this); + } + + @Override + public void setCustomName(@Nullable Component name) { + super.setCustomName(name); + this.bossInfo.setName(this.getDisplayName()); + } + + public static AttributeSupplier.Builder registerAttributes() { + return CarminiteGhastguard.registerAttributes() + .add(Attributes.MAX_HEALTH, 250) + .add(Attributes.FOLLOW_RANGE, 128.0D) + .add(Attributes.KNOCKBACK_RESISTANCE, 1.0D); + } + + @Override + protected void defineSynchedData() { + super.defineSynchedData(); + this.entityData.define(DATA_TANTRUM, false); + } + + public List getTrapLocations() { + return this.trapLocations; + } + + @Override + protected void registerGoals() { + super.registerGoals(); + this.trapLocations = new ArrayList<>(); + this.goalSelector.availableGoals.removeIf(e -> e.getGoal() instanceof GhastguardHomedFlightGoal); + this.goalSelector.addGoal(5, new UrGhastFlightGoal(this)); + } + + @Override + public boolean removeWhenFarAway(double dist) { + return false; + } + + @Override + public void checkDespawn() { + if (this.getLevel().getDifficulty() == Difficulty.PEACEFUL) { + if (this.getRestrictCenter() != BlockPos.ZERO) { + this.getLevel().setBlockAndUpdate(this.getRestrictCenter(), TFBlocks.UR_GHAST_BOSS_SPAWNER.get().defaultBlockState()); + } + this.discard(); + } else { + super.checkDespawn(); + } + } + + @Override + protected SoundEvent getAmbientSound() { + return TFSounds.UR_GHAST_AMBIENT.get(); + } + + @Override + protected SoundEvent getHurtSound(DamageSource source) { + return TFSounds.UR_GHAST_HURT.get(); + } + + @Override + protected SoundEvent getDeathSound() { + return TFSounds.UR_GHAST_DEATH.get(); + } + + @Override + public SoundEvent getFireSound() { + return TFSounds.UR_GHAST_SHOOT.get(); + } + + @Override + public SoundEvent getWarnSound() { + return TFSounds.UR_GHAST_WARN.get(); + } + + @Override + public void aiStep() { + super.aiStep(); + + if (!this.getLevel().isClientSide()) { + this.bossInfo.setProgress(this.getHealth() / this.getMaxHealth()); + } else { + if (this.isInTantrum() && !this.isDeadOrDying()) { + this.getLevel().addParticle(TFParticleType.BOSS_TEAR.get(), + this.getX() + (this.getRandom().nextDouble() - 0.5D) * this.getBbWidth() * 0.75D, + this.getY() + this.getRandom().nextDouble() * this.getBbHeight() * 0.5D, + this.getZ() + (this.getRandom().nextDouble() - 0.5D) * this.getBbWidth() * 0.75D, + 0, 0, 0 + ); + } + } + } + + @Override + public boolean isInvulnerableTo(DamageSource src) { + return src.is(DamageTypes.IN_WALL) || src.is(DamageTypeTags.IS_FIRE) || super.isInvulnerableTo(src); + } + + @Override + public void knockback(double strength, double xRatio, double zRatio) { + // Don't take knockback + } + + @Override + public boolean hurt(DamageSource source, float damage) { + // in tantrum mode take only 1/10 damage + if (this.isInTantrum()) { + damage /= 10; + } + + float oldHealth = getHealth(); + boolean attackSuccessful; + + if ("fireball".equals(source.getMsgId()) && source.getEntity() instanceof Player) { + // 'hide' fireball attacks so that we don't take 1000 damage. + attackSuccessful = super.hurt(this.damageSources().thrown(source.getEntity(), source.getDirectEntity()), damage); + } else { + attackSuccessful = super.hurt(source, damage); + } + + float lastDamage = oldHealth - this.getHealth(); + + if (source.getEntity() instanceof ServerPlayer player && !this.hurtBy.contains(player)) { + this.hurtBy.add(player); + } + + if (!this.getLevel().isClientSide()) { + if (this.hurtTime == this.hurtDuration && !this.isDeadOrDying()) { + this.damageUntilNextPhase -= lastDamage; + + if (this.damageUntilNextPhase <= 0) { + this.switchPhase(); + } + } + } + + return attackSuccessful; + } + + private void switchPhase() { + if (this.isInTantrum()) { + this.setInTantrum(false); + } else { + this.startTantrum(); + } + + this.resetDamageUntilNextPhase(); + } + + public void resetDamageUntilNextPhase() { + damageUntilNextPhase = 18; + } + + private void startTantrum() { + this.setInTantrum(true); + if (this.level instanceof ServerLevel serverLevel) { + LightningBolt lightningbolt = EntityType.LIGHTNING_BOLT.create(serverLevel); + if (lightningbolt != null) { + BlockPos blockpos = serverLevel.findLightningTargetAround(BlockPos.containing(this.position().add(new Vec3(18, 0, 0).yRot((float) Math.toRadians(this.getRandom().nextInt(360)))))); + lightningbolt.moveTo(Vec3.atBottomCenterOf(blockpos)); + lightningbolt.setVisualOnly(true); + serverLevel.addFreshEntity(lightningbolt); + } + } + this.spawnGhastsAtTraps(); + } + + @Override + public void tick() { + if (this.level.isClientSide && !this.isDeadOrDying() && this.isInTantrum()) TFWeatherRenderer.urGhastAlive = true; + super.tick(); + } + + /** + * Spawn ghasts at two of the traps + */ + public void spawnGhastsAtTraps() { + // spawn ghasts around two of the traps + List ghastSpawns = new ArrayList<>(this.trapLocations); + Collections.shuffle(ghastSpawns); + + int numSpawns = Math.min(2, ghastSpawns.size()); + + for (int i = 0; i < numSpawns; i++) { + BlockPos spawnCoord = ghastSpawns.get(i); + this.spawnMinionGhastsAt(spawnCoord.getX(), spawnCoord.getY(), spawnCoord.getZ()); + } + } + + /** + * Spawn up to 6 minion ghasts around the indicated area + */ + private void spawnMinionGhastsAt(int x, int y, int z) { + int tries = 24; + int spawns = 0; + int maxSpawns = 6; + + int rangeXZ = 4; + int rangeY = 8; + + // lightning strike + LightningBolt bolt = new LightningBolt(EntityType.LIGHTNING_BOLT, this.getLevel()); + bolt.setPos(x, y + 4, z); + bolt.setVisualOnly(true); + this.getLevel().addFreshEntity(bolt); + + for (int i = 0; i < tries; i++) { + CarminiteGhastling minion = TFEntities.CARMINITE_GHASTLING.get().create(this.getLevel()); + + double sx = x + ((this.getRandom().nextDouble() - this.getRandom().nextDouble()) * rangeXZ); + double sy = y + (this.getRandom().nextDouble() * rangeY); + double sz = z + ((this.getRandom().nextDouble() - this.getRandom().nextDouble()) * rangeXZ); + + minion.moveTo(sx, sy, sz, this.getLevel().getRandom().nextFloat() * 360.0F, 0.0F); + minion.makeBossMinion(); + + if (minion.checkSpawnRules(this.getLevel(), MobSpawnType.MOB_SUMMONED)) { + this.getLevel().addFreshEntity(minion); + minion.spawnAnim(); + } + + if (++spawns >= maxSpawns) { + break; + } + } + } + + @Override + protected void customServerAiStep() { + super.customServerAiStep(); + + // despawn mini ghasts that are in our AABB + for (CarminiteGhastling ghast : this.getLevel().getEntitiesOfClass(CarminiteGhastling.class, this.getBoundingBox().inflate(1.0D))) { + ghast.spawnAnim(); + ghast.discard(); + this.heal(2); + } + + if (this.tickCount % 60 == 0 && !this.getTrapLocations().isEmpty()) { + //validate traps positions are still actually usable traps. If not, remove them + this.getTrapLocations().removeIf(pos -> !this.getLevel().getBlockState(pos).is(TFBlocks.GHAST_TRAP.get()) || !this.getLevel().canSeeSky(pos.above())); + } + + if (this.firstTick || this.tickCount % 100 == 0) { + List addedPositions = this.scanForTraps((ServerLevel) this.getLevel()); + addedPositions.removeIf(pos -> this.getTrapLocations().contains(pos)); + if (!addedPositions.isEmpty()) { + this.getTrapLocations().addAll(addedPositions); + } + } + + if (this.isInTantrum()) { + this.setTarget(null); + + // cry? + if (--this.nextTantrumCry <= 0) { + this.playSound(TFSounds.UR_GHAST_TANTRUM.get()); + this.nextTantrumCry = 20 + this.getRandom().nextInt(30); + } + + if (this.tickCount % 10 == 0) { + this.doTantrumDamageEffects(); + } + } + } + + //If we have a home position, use that for scanning, otherwise use our current position + public BlockPos getLogicalScanPoint() { + return this.getRestrictionCenter() == BlockPos.ZERO ? this.blockPosition() : this.getRestrictionCenter(); + } + + private List scanForTraps(ServerLevel level) { + PoiManager poimanager = level.getPoiManager(); + Stream stream = poimanager.getInRange(type -> + type.is(TFPOITypes.GHAST_TRAP.getKey()), + this.getLogicalScanPoint(), + (int)(this.getRestrictRadius() == -1 ? 32 : this.getRestrictRadius()), + PoiManager.Occupancy.ANY); + return stream.map(PoiRecord::getPos) + .filter(trapPos -> level.canSeeSky(trapPos.above())) + .sorted(Comparator.comparingDouble(trapPos -> trapPos.distSqr(this.getLogicalScanPoint()))) + .collect(Collectors.toList()); + } + + private void doTantrumDamageEffects() { + // harm player below + AABB below = this.getBoundingBox().move(0, -16, 0).inflate(0, 16, 0); + + for (Player player : this.getLevel().getEntitiesOfClass(Player.class, below)) { + if (this.getLevel().canSeeSkyFromBelowWater(player.blockPosition())) { + player.hurt(TFDamageTypes.getDamageSource(this.getLevel(), TFDamageTypes.GHAST_TEAR, TFEntities.UR_GHAST.get()), 3); + } + } + + // also suck up mini ghasts + for (CarminiteGhastling ghast : this.getLevel().getEntitiesOfClass(CarminiteGhastling.class, below)) { + ghast.push(0, 1, 0); + } + } + + /** + * Check if there are at least 4 ghasts near at least 2 traps. Return false if not. + */ + public boolean checkGhastsAtTraps() { + int trapsWithEnoughGhasts = 0; + + for (BlockPos trap : this.getTrapLocations()) { + AABB aabb = new AABB(trap, trap.offset(1, 1, 1)).inflate(8D, 16D, 8D); + + List nearbyGhasts = this.getLevel().getEntitiesOfClass(CarminiteGhastling.class, aabb); + + if (nearbyGhasts.size() >= 4) { + trapsWithEnoughGhasts++; + } + } + + return trapsWithEnoughGhasts >= 1; + } + + @Override + public void spitFireball() { + double offsetX = this.getTarget().getX() - this.getX(); + double offsetY = this.getTarget().getBoundingBox().minY + this.getTarget().getBbHeight() / 2.0F - (this.getY() + this.getBbHeight() / 2.0F); + double offsetZ = this.getTarget().getZ() - this.getZ(); + + UrGhastFireball entityFireball = new UrGhastFireball(this.getLevel(), this, offsetX, offsetY, offsetZ, 1); + double shotSpawnDistance = 8.5D; + Vec3 lookVec = this.getViewVector(1.0F); + entityFireball.setPos( + this.getX() + lookVec.x() * shotSpawnDistance, + this.getY() + this.getBbHeight() / 2.0F + lookVec.y() * shotSpawnDistance, + this.getZ() + lookVec.z() * shotSpawnDistance + ); + this.getLevel().addFreshEntity(entityFireball); + + for (int i = 0; i < 2; i++) { + entityFireball = new UrGhastFireball(this.getLevel(), this, offsetX + (this.getRandom().nextFloat() - this.getRandom().nextFloat()) * 8, offsetY, offsetZ + (this.getRandom().nextFloat() - this.getRandom().nextFloat()) * 8, 1); + entityFireball.setPos( + this.getX() + lookVec.x() * shotSpawnDistance, + this.getY() + this.getBbHeight() / 2.0F + lookVec.y() * shotSpawnDistance, + this.getZ() + lookVec.z() * shotSpawnDistance + ); + this.getLevel().addFreshEntity(entityFireball); + } + } + + @Override + public void startSeenByPlayer(ServerPlayer player) { + super.startSeenByPlayer(player); + this.bossInfo.addPlayer(player); + } + + @Override + public void stopSeenByPlayer(ServerPlayer player) { + super.stopSeenByPlayer(player); + this.bossInfo.removePlayer(player); + } + + @Override + public boolean isOnFire() { + return false; + } + + @Override + public boolean isPushable() { + return false; + } + + public boolean isInTantrum() { + return this.entityData.get(DATA_TANTRUM); + } + + public void setInTantrum(boolean inTantrum) { + this.entityData.set(DATA_TANTRUM, inTantrum); + this.resetDamageUntilNextPhase(); + } + + @Override + protected float getSoundVolume() { + return 16.0F; + } + + @Override + public float getVoicePitch() { + return (this.getRandom().nextFloat() - this.getRandom().nextFloat()) * 0.2F + 0.5F; + } + + @Override + public void addAdditionalSaveData(CompoundTag compound) { + compound.putBoolean("inTantrum", this.isInTantrum()); + this.addDeathItemsSaveData(compound); + super.addAdditionalSaveData(compound); + } + + @Override + public void readAdditionalSaveData(CompoundTag compound) { + super.readAdditionalSaveData(compound); + this.setInTantrum(compound.getBoolean("inTantrum")); + this.readDeathItemsSaveData(compound); + if (this.hasCustomName()) { + this.bossInfo.setName(this.getDisplayName()); + } + } + + @Override + public void die(DamageSource cause) { + super.die(cause); + // mark the tower as defeated + if (this.getLevel() instanceof ServerLevel serverLevel) { + this.bossInfo.setProgress(0.0F); + IBossLootBuffer.saveDropsIntoBoss(this, this.createLootContext(true, cause).create(LootContextParamSets.ENTITY), serverLevel); + LandmarkUtil.markStructureConquered(this.getLevel(), this, TFStructures.DARK_TOWER, true); + for (ServerPlayer player : this.hurtBy) { + TFAdvancements.HURT_BOSS.trigger(player, this); + } + + LightningBolt lightningbolt = EntityType.LIGHTNING_BOLT.create(serverLevel); + if (lightningbolt != null) { + lightningbolt.moveTo(this.position().add(0.0D, this.getBbHeight() * 0.5F, 0.0D)); + lightningbolt.setVisualOnly(true); + serverLevel.addFreshEntity(lightningbolt); + } + } + } + + @Override + protected void tickDeath() { + ++this.deathTime; + int maxDeath = 80; + // extra death explosions + if (this.deathTime <= maxDeath / 2) { + float bbWidth = this.getBbWidth(); + float bbHeight = this.getBbHeight(); + for (int k = 0; k < 12; k++) { + double d = this.random.nextGaussian() * 0.02D; + double d1 = this.random.nextGaussian() * 0.02D; + double d2 = this.random.nextGaussian() * 0.02D; + + this.getLevel().addParticle(this.random.nextBoolean() ? (this.random.nextBoolean() ? ParticleTypes.POOF : ParticleTypes.EXPLOSION) : DustParticleOptions.REDSTONE, + (this.getX() + this.random.nextFloat() * bbWidth * 1.8F) - bbWidth, + this.getY() + this.random.nextFloat() * bbHeight, + (this.getZ() + this.random.nextFloat() * bbWidth * 1.8F) - bbWidth, + d, d1, d2 + ); + } + } else if (this.level instanceof ServerLevel) { + if (this.deathTime >= maxDeath && !this.isRemoved()) { + this.level.broadcastEntityEvent(this, (byte) 60); + this.remove(Entity.RemovalReason.KILLED); + return; + } + Vec3 start = this.position().add(0.0D, this.getBbHeight() * 0.5F, 0.0D); + Vec3 end = Vec3.atCenterOf(EntityUtil.bossChestLocation(this)); + Vec3 diff = end.subtract(start); + + int deathTime2 = this.deathTime - (maxDeath / 2) + 1; + double factor = (double) deathTime2 / (double) (maxDeath / 2); + Vec3 particlePos = start.add(diff.scale(factor)).add(Math.sin(deathTime2 * Math.PI * 0.1D), Math.sin(deathTime2 * Math.PI * 0.05D), Math.cos(deathTime2 * Math.PI * 0.1125D));//Some sine waves to make it pretty + + ParticlePacket particlePacket = new ParticlePacket(); + if (this.deathTime >= maxDeath - 2) { + for (int i = 0; i < 40; i++) { + double x = (this.random.nextDouble() - 0.5D) * 0.075D * i; + double y = (this.random.nextDouble() - 0.5D) * 0.075D * i; + double z = (this.random.nextDouble() - 0.5D) * 0.075D * i; + particlePacket.queueParticle(ParticleTypes.POOF, false, end.add(x, y, z), Vec3.ZERO); + } + } + for (int i = 0; i < 40; i++) { + double x = (this.random.nextDouble() - 0.5D) * 0.05D * i; + double y = (this.random.nextDouble() - 0.5D) * 0.05D * i; + double z = (this.random.nextDouble() - 0.5D) * 0.05D * i; + particlePacket.queueParticle(DustParticleOptions.REDSTONE, false, particlePos.add(x, y, z), Vec3.ZERO); + } + TFPacketHandler.CHANNEL.send(PacketDistributor.TRACKING_ENTITY.with(() -> this), particlePacket); + } + } + + @Override + public Vec3 getDeltaMovement() { + return this.isDeadOrDying() ? DYING_DECENT : super.getDeltaMovement(); + } + + @Override + public void remove(RemovalReason removalReason) { + if (removalReason.equals(RemovalReason.KILLED) && this.level instanceof ServerLevel serverLevel) { + IBossLootBuffer.depositDropsIntoChest(this, TFBlocks.DARK_CHEST.get().defaultBlockState(), EntityUtil.bossChestLocation(this), serverLevel); + } + super.remove(removalReason); + } + + @Override + protected boolean shouldDropLoot() { + // Invoked the mob's loot during die, this will avoid duplicating during the actual drop phase + return false; + } + + // Don't attack (or even think about attacking) things while we're throwing a tantrum + @Override + public boolean shouldAttack(LivingEntity living) { + return !this.isInTantrum(); + } + + @Override + protected boolean canRide(Entity entityIn) { + return false; + } + + @Override + public boolean canChangeDimensions() { + return false; + } + + @Override + public NonNullList getItemStacks() { + return this.dyingInventory; + } +} diff --git a/src/main/java/twilightforest/entity/boss/package-info.java b/src/main/java/twilightforest/entity/boss/package-info.java new file mode 100644 index 0000000000..627df44e5c --- /dev/null +++ b/src/main/java/twilightforest/entity/boss/package-info.java @@ -0,0 +1,6 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.entity.boss; + +import net.minecraft.MethodsReturnNonnullByDefault; +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/entity/monster/Adherent.java b/src/main/java/twilightforest/entity/monster/Adherent.java new file mode 100644 index 0000000000..d1bccc6f72 --- /dev/null +++ b/src/main/java/twilightforest/entity/monster/Adherent.java @@ -0,0 +1,87 @@ +package twilightforest.entity.monster; + +import net.minecraft.network.syncher.EntityDataAccessor; +import net.minecraft.network.syncher.EntityDataSerializers; +import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.goal.*; +import net.minecraft.world.entity.ai.goal.target.HurtByTargetGoal; +import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal; +import net.minecraft.world.entity.monster.Monster; +import net.minecraft.world.entity.monster.RangedAttackMob; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import twilightforest.entity.ITFCharger; +import twilightforest.entity.projectile.NatureBolt; + +public class Adherent extends Monster implements RangedAttackMob, ITFCharger { + + private static final EntityDataAccessor CHARGE_FLAG = SynchedEntityData.defineId(Adherent.class, EntityDataSerializers.BOOLEAN); + + public Adherent(EntityType type, Level world) { + super(type, world); + } + + @Override + protected void registerGoals() { + this.goalSelector.addGoal(1, new FloatGoal(this)); + this.goalSelector.addGoal(2, new RestrictSunGoal(this)); + this.goalSelector.addGoal(3, new FleeSunGoal(this, 1.0D)); + this.goalSelector.addGoal(4, new RangedAttackGoal(this, 1.0D, 60, 10.0F)); + this.goalSelector.addGoal(5, new WaterAvoidingRandomStrollGoal(this, 1.0D)); + this.goalSelector.addGoal(6, new LookAtPlayerGoal(this, Player.class, 8.0F)); + this.goalSelector.addGoal(6, new RandomLookAroundGoal(this)); + this.targetSelector.addGoal(1, new HurtByTargetGoal(this)); + this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true)); + } + + @Override + protected void defineSynchedData() { + super.defineSynchedData(); + this.entityData.define(CHARGE_FLAG, false); + } + + public static AttributeSupplier.Builder registerAttributes() { + return Monster.createMonsterAttributes() + .add(Attributes.MAX_HEALTH, 20.0D) + .add(Attributes.MOVEMENT_SPEED, 0.25D); + } + + @Override + public void performRangedAttack(LivingEntity attackTarget, float extraDamage) { + NatureBolt natureBolt = new NatureBolt(this.getLevel(), this); + this.playSound(SoundEvents.GHAST_SHOOT, 1.0F, 1.0F / (this.getRandom().nextFloat() * 0.4F + 0.8F)); + + // [VanillaCopy] adapted from EntitySnowman, with lower velocity and inaccuracy calculation + double d0 = attackTarget.getY() + attackTarget.getEyeHeight() - 1.100000023841858D; + double d1 = attackTarget.getX() - this.getX(); + double d2 = d0 - natureBolt.getY(); + double d3 = attackTarget.getZ() - this.getZ(); + float f = Mth.sqrt((float) (d1 * d1 + d3 * d3)) * 0.2F; + natureBolt.shoot(d1, d2 + f, d3, 0.6F, 10 - this.getLevel().getDifficulty().getId() * 4); + + this.getLevel().addFreshEntity(natureBolt); + + } + + @Override + protected boolean canRide(Entity entityIn) { + return false; + } + + @Override + public boolean isCharging() { + return this.entityData.get(CHARGE_FLAG); + } + + @Override + public void setCharging(boolean flag) { + this.entityData.set(CHARGE_FLAG, flag); + } +} diff --git a/src/main/java/twilightforest/entity/monster/ArmoredGiant.java b/src/main/java/twilightforest/entity/monster/ArmoredGiant.java new file mode 100644 index 0000000000..7a73e7340b --- /dev/null +++ b/src/main/java/twilightforest/entity/monster/ArmoredGiant.java @@ -0,0 +1,27 @@ +package twilightforest.entity.monster; + +import net.minecraft.util.RandomSource; +import net.minecraft.world.DifficultyInstance; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.Level; +import twilightforest.init.TFItems; + +public class ArmoredGiant extends GiantMiner { + + public ArmoredGiant(EntityType type, Level world) { + super(type, world); + } + + @Override + protected void populateDefaultEquipmentSlots(RandomSource random, DifficultyInstance difficulty) { + super.populateDefaultEquipmentSlots(random, difficulty); + this.setItemSlot(EquipmentSlot.MAINHAND, new ItemStack(TFItems.GIANT_SWORD.get())); + this.setItemSlot(EquipmentSlot.HEAD, new ItemStack(Items.IRON_HELMET)); + this.setItemSlot(EquipmentSlot.CHEST, new ItemStack(Items.IRON_CHESTPLATE)); + this.setItemSlot(EquipmentSlot.LEGS, new ItemStack(Items.IRON_LEGGINGS)); + this.setItemSlot(EquipmentSlot.FEET, new ItemStack(Items.IRON_BOOTS)); + } +} diff --git a/src/main/java/twilightforest/entity/monster/BaseIceMob.java b/src/main/java/twilightforest/entity/monster/BaseIceMob.java new file mode 100644 index 0000000000..a3b0fa3688 --- /dev/null +++ b/src/main/java/twilightforest/entity/monster/BaseIceMob.java @@ -0,0 +1,52 @@ +package twilightforest.entity.monster; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.tags.BiomeTags; +import net.minecraft.tags.DamageTypeTags; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.monster.Monster; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.Vec3; +import twilightforest.init.TFParticleType; + +public abstract class BaseIceMob extends Monster { + public BaseIceMob(EntityType type, Level worldIn) { + super(type, worldIn); + } + + @Override + public void aiStep() { + if (!this.onGround && this.getDeltaMovement().y() < 0.0D) { + Vec3 motion = getDeltaMovement(); + this.setDeltaMovement(motion.x(), motion.y() * 0.6D, motion.z()); + } + super.aiStep(); + if (this.getLevel().isClientSide()) { + // make snow particles + for (int i = 0; i < 3; i++) { + float px = (this.getRandom().nextFloat() - this.getRandom().nextFloat()) * 0.3F; + float py = this.getEyeHeight() + (this.getRandom().nextFloat() - this.getRandom().nextFloat()) * 0.5F; + float pz = (this.getRandom().nextFloat() - this.getRandom().nextFloat()) * 0.3F; + + this.getLevel().addParticle(TFParticleType.SNOW_GUARDIAN.get(), this.xOld + px, this.yOld + py, this.zOld + pz, 0, 0, 0); + if (this.getLevel().getBiome(this.blockPosition()).is(BiomeTags.SNOW_GOLEM_MELTS)) { + this.getLevel().addParticle(ParticleTypes.CLOUD, this.xOld + px, this.yOld + py, this.zOld + pz, 0, 0.1F, 0); + this.getLevel().addParticle(ParticleTypes.DRIPPING_WATER, this.xOld + px, this.yOld + py, this.zOld + pz, 0, 0, 0); + } + } + } + if (this.getLevel().getBiome(this.blockPosition()).is(BiomeTags.SNOW_GOLEM_MELTS) && this.tickCount % 20 == 0) { + //BURN!!! + this.hurt(this.damageSources().onFire(), 1.0F); + } + } + + @Override + protected boolean canRide(Entity entity) { + return false; + } +} diff --git a/src/main/java/twilightforest/entity/monster/BlockChainGoblin.java b/src/main/java/twilightforest/entity/monster/BlockChainGoblin.java new file mode 100644 index 0000000000..a8a83fa654 --- /dev/null +++ b/src/main/java/twilightforest/entity/monster/BlockChainGoblin.java @@ -0,0 +1,345 @@ +package twilightforest.entity.monster; + +import net.minecraft.network.protocol.game.ClientboundAddEntityPacket; +import net.minecraft.network.syncher.EntityDataAccessor; +import net.minecraft.network.syncher.EntityDataSerializers; +import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.util.Mth; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.Pose; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.goal.*; +import net.minecraft.world.entity.ai.goal.target.HurtByTargetGoal; +import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal; +import net.minecraft.world.entity.item.PrimedTnt; +import net.minecraft.world.entity.monster.Monster; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.gameevent.GameEvent; +import net.minecraft.world.phys.Vec3; +import twilightforest.entity.Chain; +import twilightforest.entity.SpikeBlock; +import twilightforest.entity.TFPart; +import twilightforest.entity.ai.goal.AvoidAnyEntityGoal; +import twilightforest.entity.ai.goal.ThrowSpikeBlockGoal; +import twilightforest.init.TFDamageTypes; +import twilightforest.init.TFSounds; +import twilightforest.util.EntityUtil; + +import java.util.List; + +public class BlockChainGoblin extends Monster { + //this is here but its never been used + //private static final UUID MODIFIER_UUID = UUID.fromString("5CD17E52-A79A-43D3-A529-90FDE04B181E"); + //private static final AttributeModifier MODIFIER = new AttributeModifier(MODIFIER_UUID, "speedPenalty", -0.25D, AttributeModifier.Operation.ADDITION); + + private static final float CHAIN_SPEED = 16F; + private static final EntityDataAccessor DATA_CHAINLENGTH = SynchedEntityData.defineId(BlockChainGoblin.class, EntityDataSerializers.BYTE); + private static final EntityDataAccessor DATA_CHAINPOS = SynchedEntityData.defineId(BlockChainGoblin.class, EntityDataSerializers.BYTE); + private static final EntityDataAccessor IS_THROWING = SynchedEntityData.defineId(BlockChainGoblin.class, EntityDataSerializers.BOOLEAN); + + private int recoilCounter; + private float chainAngle; + + private float chainMoveLength; + + public final SpikeBlock block = new SpikeBlock(this); + public final Chain chain1; + public final Chain chain2; + public final Chain chain3; + + private final MultipartGenericsAreDumb[] partsArray; + + public BlockChainGoblin(EntityType type, Level world) { + super(type, world); + + this.chain1 = new Chain(this); + this.chain2 = new Chain(this); + this.chain3 = new Chain(this); + + this.partsArray = new MultipartGenericsAreDumb[]{this.block, this.chain1, this.chain2, this.chain3}; + } + + public static abstract class MultipartGenericsAreDumb extends TFPart { + + public MultipartGenericsAreDumb(Entity parent) { + super(parent); + } + } + + @Override + protected void registerGoals() { + this.goalSelector.addGoal(0, new FloatGoal(this)); + this.goalSelector.addGoal(1, new AvoidAnyEntityGoal<>(this, PrimedTnt.class, 2.0F, 1.0F, 2.0F)); + this.goalSelector.addGoal(4, new ThrowSpikeBlockGoal(this, this.block)); + this.goalSelector.addGoal(5, new MeleeAttackGoal(this, 1.0F, false)); + this.goalSelector.addGoal(6, new WaterAvoidingRandomStrollGoal(this, 1.0D)); + this.goalSelector.addGoal(7, new LookAtPlayerGoal(this, Player.class, 8.0F)); + this.goalSelector.addGoal(7, new RandomLookAroundGoal(this)); + this.targetSelector.addGoal(1, new HurtByTargetGoal(this)); + this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true)); + } + + @Override + protected void defineSynchedData() { + super.defineSynchedData(); + this.entityData.define(DATA_CHAINLENGTH, (byte) 0); + this.entityData.define(DATA_CHAINPOS, (byte) 0); + this.entityData.define(IS_THROWING, false); + } + + public static AttributeSupplier.Builder registerAttributes() { + return Monster.createMonsterAttributes() + .add(Attributes.MAX_HEALTH, 20.0D) + .add(Attributes.MOVEMENT_SPEED, 0.28D) + .add(Attributes.ATTACK_DAMAGE, 8.0D) + .add(Attributes.ARMOR, 11.0D); + } + + @Override + public float getEyeHeight(Pose pose) { + return this.getBbHeight() * 0.78F; + } + + @Override + protected SoundEvent getAmbientSound() { + return TFSounds.BLOCKCHAIN_GOBLIN_AMBIENT.get(); + } + + @Override + protected SoundEvent getHurtSound(DamageSource source) { + return TFSounds.BLOCKCHAIN_GOBLIN_HURT.get(); + } + + @Override + protected SoundEvent getDeathSound() { + return TFSounds.BLOCKCHAIN_GOBLIN_DEATH.get(); + } + + /** + * How high is the chain + */ + public double getChainYOffset() { + return 1.5D - this.getChainLength() / 4.0D; + } + + /** + * Get the block & chain position + */ + public Vec3 getChainPosition() { + return this.getChainPosition(this.getChainAngle(), this.getChainLength()); + } + + /** + * Get the block & chain position + */ + public Vec3 getChainPosition(float angle, float distance) { + double dx = Math.cos((angle) * Math.PI / 180.0D) * distance; + double dz = Math.sin((angle) * Math.PI / 180.0D) * distance; + + return new Vec3(this.getX() + dx, this.getY() + this.getChainYOffset(), this.getZ() + dz); + } + + public boolean isSwingingChain() { + return this.swinging || (this.getTarget() != null && this.recoilCounter == 0); + } + + @Override + public boolean doHurtTarget(Entity entity) { + return EntityUtil.properlyApplyCustomDamageSource(this, entity, TFDamageTypes.getIndirectEntityDamageSource(this.getLevel(), TFDamageTypes.SPIKED, this, this.block)); + } + + @Override + public void tick() { + super.tick(); + this.block.tick(); + this.chain1.tick(); + this.chain2.tick(); + this.chain3.tick(); + + if (this.recoilCounter > 0) { + this.recoilCounter--; + } + + this.chainAngle += CHAIN_SPEED; + this.chainAngle %= 360; + + if (!this.getLevel().isClientSide()) { + this.entityData.set(DATA_CHAINLENGTH, (byte) Math.floor(this.getChainLength() * 127.0F)); + this.entityData.set(DATA_CHAINPOS, (byte) Math.floor(this.getChainAngle() / 360.0F * 255.0F)); + } else { + // synch chain pos if it's wrong + if (Math.abs(this.chainAngle - this.getChainAngle()) > CHAIN_SPEED * 2) { + this.chainAngle = this.getChainAngle(); + } + } + + //when alive,Holding SpikeBlock + if (this.isAlive()) { + if (this.chainMoveLength > 0) { + + Vec3 blockPos = this.getThrowPos(); + + double sx2 = this.getX(); + double sy2 = this.getY() + this.getBbHeight() - 0.1D; + double sz2 = this.getZ(); + + double ox2 = sx2 - blockPos.x(); + double oy2 = sy2 - blockPos.y() - 0.25F; + double oz2 = sz2 - blockPos.z(); + + //When the thrown chainblock exceeds a certain distance, return to the owner + if (this.chainMoveLength >= 6.0F || !this.isAlive()) { + this.setThrowing(false); + } + + this.chain1.setPos(sx2 - ox2 * 0.25D, sy2 - oy2 * 0.25D, sz2 - oz2 * 0.25D); + this.chain2.setPos(sx2 - ox2 * 0.5D, sy2 - oy2 * 0.5D, sz2 - oz2 * 0.5D); + this.chain3.setPos(sx2 - ox2 * 0.85D, sy2 - oy2 * 0.85D, sz2 - oz2 * 0.85D); + + this.block.setPos(sx2 - ox2, sy2 - oy2, sz2 - oz2); + } else { + + // set block position + Vec3 blockPos = this.getChainPosition(); + this.block.setPos(blockPos.x(), blockPos.y(), blockPos.z()); + this.block.setYRot(getChainAngle()); + + // interpolate chain position + double sx = this.getX(); + double sy = this.getY() + this.getBbHeight() - 0.1D; + double sz = this.getZ(); + + double ox = sx - blockPos.x(); + double oy = sy - blockPos.y() - (this.block.getBbHeight() / 3.0D); + double oz = sz - blockPos.z(); + + this.chain1.setPos(sx - ox * 0.4D, sy - oy * 0.4D, sz - oz * 0.4D); + this.chain2.setPos(sx - ox * 0.5D, sy - oy * 0.5D, sz - oz * 0.5D); + this.chain3.setPos(sx - ox * 0.6D, sy - oy * 0.6D, sz - oz * 0.6D); + } + } + + // collide things with the block + if (!level.isClientSide && this.isAlive() && (this.isThrowing() || this.isSwingingChain())) { + this.applyBlockCollisions(this.block); + } + this.chainMove(); + } + + private Vec3 getThrowPos() { + Vec3 vec3d = this.getViewVector(1.0F); + return new Vec3(this.getX() + vec3d.x() * this.chainMoveLength, this.getY() + this.getEyeHeight(), this.getZ() + vec3d.z() * this.chainMoveLength); + } + + private void chainMove() { + if (this.isThrowing()) { + this.chainMoveLength = Mth.clamp(this.chainMoveLength + 0.5F, 0.0F, 6.0F); + } else { + this.chainMoveLength = Mth.clamp(this.chainMoveLength - 1.5F, 0.0F, 6.0F); + } + } + + public float getChainMoveLength() { + return chainMoveLength; + } + + /** + * Check if the block is colliding with any nearby entities + */ + protected void applyBlockCollisions(Entity collider) { + List list = this.getLevel().getEntities(collider, collider.getBoundingBox().inflate(0.2D, 0.0D, 0.2D)); + + for (Entity entity : list) { + if (entity.isPushable()) { + this.applyBlockCollision(collider, entity); + } + } + + if (this.isThrowing() && collider.isInWall()) { + this.setThrowing(false); + collider.playSound(TFSounds.BLOCK_AND_CHAIN_COLLIDE.get(), 0.65F, 0.75F); + this.gameEvent(GameEvent.HIT_GROUND); + } + } + + /** + * Do the effect where the block hits something + */ + protected void applyBlockCollision(Entity collider, Entity collided) { + if (collided != this) { + collided.push(collider); + if (collided instanceof LivingEntity) { + if (super.doHurtTarget(collided)) { + collided.push(0, 0.4, 0); + this.playSound(TFSounds.BLOCK_AND_CHAIN_HIT.get(), 1.0F, 1.0F); + this.gameEvent(GameEvent.PROJECTILE_LAND); + this.recoilCounter = 40; + if (this.isThrowing()) { + this.setThrowing(false); + } + } + + } + } + } + + public boolean isThrowing() { + return this.entityData.get(IS_THROWING); + } + + public void setThrowing(boolean isThrowing) { + this.entityData.set(IS_THROWING, isThrowing); + } + + /** + * Angle between 0 and 360 to place the chain at + */ + private float getChainAngle() { + if (!this.getLevel().isClientSide()) { + return this.chainAngle; + } else { + return (this.entityData.get(DATA_CHAINPOS) & 0xFF) / 255.0F * 360.0F; + } + } + + /** + * Between 0.0F and 2.0F, how long is the chain right now? + */ + private float getChainLength() { + if (!this.getLevel().isClientSide()) { + if (this.isSwingingChain()) { + return 0.9F; + } else { + return 0.3F; + } + } else { + return (this.entityData.get(DATA_CHAINLENGTH) & 0xFF) / 127.0F; + } + } + + @Override + public boolean isMultipartEntity() { + return true; + } + + @Override + public void recreateFromPacket(ClientboundAddEntityPacket packet) { + super.recreateFromPacket(packet); + TFPart.assignPartIDs(this); + } + + /** + * We need to do this for the bounding boxes on the parts to become active + */ + @Override + public MultipartGenericsAreDumb[] getParts() { + return partsArray; + } +} diff --git a/src/main/java/twilightforest/entity/monster/Boggard.java b/src/main/java/twilightforest/entity/monster/Boggard.java new file mode 100644 index 0000000000..12f7b983eb --- /dev/null +++ b/src/main/java/twilightforest/entity/monster/Boggard.java @@ -0,0 +1,56 @@ +package twilightforest.entity.monster; + +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.goal.*; +import net.minecraft.world.entity.ai.goal.target.HurtByTargetGoal; +import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal; +import net.minecraft.world.entity.monster.Monster; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import twilightforest.entity.ai.goal.ChargeAttackGoal; +import twilightforest.init.TFSounds; + +public class Boggard extends Monster { + + public Boggard(EntityType type, Level world) { + super(type, world); + } + + @Override + protected void registerGoals() { + this.goalSelector.addGoal(0, new FloatGoal(this)); + this.goalSelector.addGoal(2, new ChargeAttackGoal(this, 1.5F, false)); + this.goalSelector.addGoal(3, new MeleeAttackGoal(this, 1.0F, false)); + this.goalSelector.addGoal(6, new WaterAvoidingRandomStrollGoal(this, 1.0D)); + this.goalSelector.addGoal(7, new LookAtPlayerGoal(this, Player.class, 8.0F)); + this.goalSelector.addGoal(7, new RandomLookAroundGoal(this)); + this.targetSelector.addGoal(1, new HurtByTargetGoal(this)); + this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, false)); + } + + public static AttributeSupplier.Builder registerAttributes() { + return Monster.createMonsterAttributes() + .add(Attributes.MAX_HEALTH, 14.0D) + .add(Attributes.MOVEMENT_SPEED, 0.28D) + .add(Attributes.ATTACK_DAMAGE, 3.0D); + } + + @Override + protected SoundEvent getAmbientSound() { + return TFSounds.REDCAP_AMBIENT.get(); + } + + @Override + protected SoundEvent getHurtSound(DamageSource source) { + return TFSounds.REDCAP_HURT.get(); + } + + @Override + protected SoundEvent getDeathSound() { + return TFSounds.REDCAP_AMBIENT.get(); + } +} diff --git a/src/main/java/twilightforest/entity/monster/CarminiteGhastguard.java b/src/main/java/twilightforest/entity/monster/CarminiteGhastguard.java new file mode 100644 index 0000000000..dc82fb89c9 --- /dev/null +++ b/src/main/java/twilightforest/entity/monster/CarminiteGhastguard.java @@ -0,0 +1,236 @@ +package twilightforest.entity.monster; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.particles.DustParticleOptions; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.network.syncher.EntityDataAccessor; +import net.minecraft.network.syncher.EntityDataSerializers; +import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.util.Mth; +import net.minecraft.util.RandomSource; +import net.minecraft.world.Difficulty; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.MobSpawnType; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal; +import net.minecraft.world.entity.monster.Ghast; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.entity.projectile.LargeFireball; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.phys.Vec3; +import twilightforest.entity.EnforcedHomePoint; +import twilightforest.entity.ai.goal.GhastguardAttackGoal; +import twilightforest.entity.ai.goal.GhastguardHomedFlightGoal; +import twilightforest.entity.ai.goal.GhastguardRandomFlyGoal; +import twilightforest.entity.boss.UrGhast; +import twilightforest.init.TFLandmark; +import twilightforest.init.TFSounds; + +public class CarminiteGhastguard extends Ghast implements EnforcedHomePoint { + // 0 = idle, 1 = eyes open / tracking player, 2 = shooting fireball + private static final EntityDataAccessor ATTACK_STATUS = SynchedEntityData.defineId(CarminiteGhastguard.class, EntityDataSerializers.BYTE); + private static final EntityDataAccessor ATTACK_TIMER = SynchedEntityData.defineId(CarminiteGhastguard.class, EntityDataSerializers.BYTE); + private static final EntityDataAccessor ATTACK_PREVTIMER = SynchedEntityData.defineId(CarminiteGhastguard.class, EntityDataSerializers.BYTE); + + private GhastguardAttackGoal attackAI; + protected float wanderFactor; + private int inTrapCounter; + + public CarminiteGhastguard(EntityType type, Level world) { + super(type, world); + + this.wanderFactor = 16.0F; + this.inTrapCounter = 0; + } + + @Override + protected void defineSynchedData() { + super.defineSynchedData(); + this.entityData.define(ATTACK_STATUS, (byte) 0); + this.entityData.define(ATTACK_TIMER, (byte) 0); + this.entityData.define(ATTACK_PREVTIMER, (byte) 0); + } + + @Override + protected void registerGoals() { + this.goalSelector.addGoal(5, new GhastguardHomedFlightGoal(this)); + if (!(this instanceof UrGhast)) this.goalSelector.addGoal(5, new GhastguardRandomFlyGoal(this)); + this.goalSelector.addGoal(7, new Ghast.GhastLookGoal(this)); + this.goalSelector.addGoal(7, attackAI = new GhastguardAttackGoal(this)); + this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, Player.class, true)); + } + + public float getWanderFactor() { + return this.wanderFactor; + } + + public void setInTrap() { + this.inTrapCounter = 10; + } + + public static AttributeSupplier.Builder registerAttributes() { + return Ghast.createAttributes() + .add(Attributes.MAX_HEALTH, 30.0D) + .add(Attributes.FOLLOW_RANGE, 64.0D); + } + + @Override + protected SoundEvent getAmbientSound() { + return TFSounds.CARMINITE_GHASTGUARD_AMBIENT.get(); + } + + @Override + protected SoundEvent getHurtSound(DamageSource source) { + return TFSounds.CARMINITE_GHASTGUARD_HURT.get(); + } + + @Override + protected SoundEvent getDeathSound() { + return TFSounds.CARMINITE_GHASTGUARD_DEATH.get(); + } + + public SoundEvent getFireSound() { + return TFSounds.CARMINITE_GHASTGUARD_SHOOT.get(); + } + + public SoundEvent getWarnSound() { + return TFSounds.CARMINITE_GHASTGUARD_WARN.get(); + } + + @Override + protected float getSoundVolume() { + return 0.5F; + } + + @Override + public int getAmbientSoundInterval() { + return 160; + } + + @Override + public int getMaxSpawnClusterSize() { + return 8; + } + + @Override + public void aiStep() { + if (this.getRandom().nextBoolean()) { + this.getLevel().addParticle(DustParticleOptions.REDSTONE, this.getX() + (this.getRandom().nextDouble() - 0.5D) * this.getBbWidth(), this.getY() + this.getRandom().nextDouble() * this.getBbHeight() - 0.25D, this.getZ() + (this.getRandom().nextDouble() - 0.5D) * this.getBbWidth(), 0, 0, 0); + } + + super.aiStep(); + } + + @Override + protected void customServerAiStep() { + + if (this.inTrapCounter > 0) { + this.inTrapCounter--; + this.setTarget(null); + } + + int status = getTarget() != null && this.shouldAttack(this.getTarget()) ? 1 : 0; + + this.entityData.set(ATTACK_STATUS, (byte) status); + this.entityData.set(ATTACK_TIMER, (byte) attackAI.attackTimer); + this.entityData.set(ATTACK_PREVTIMER, (byte) attackAI.prevAttackTimer); + } + + public int getAttackStatus() { + return this.entityData.get(ATTACK_STATUS); + } + + public int getAttackTimer() { + return this.entityData.get(ATTACK_TIMER); + } + + public int getPrevAttackTimer() { + return this.entityData.get(ATTACK_PREVTIMER); + } + + public boolean shouldAttack(LivingEntity living) { + return true; + } + + /** + * Something is deeply wrong with the calculations based off of this value, so let's set it high enough that it's ignored. + */ + @Override + public int getMaxHeadXRot() { + return 500; + } + + @Override + protected boolean canRide(Entity entity) { + return false; + } + + public void spitFireball() { + Vec3 vec3d = this.getViewVector(1.0F); + double d2 = this.getTarget().getX() - (this.getX() + vec3d.x() * 4.0D); + double d3 = this.getTarget().getBoundingBox().minY + this.getTarget().getBbHeight() / 2.0F - (0.5D + this.getY() + this.getBbHeight() / 2.0F); + double d4 = this.getTarget().getZ() - (this.getZ() + vec3d.z() * 4.0D); + LargeFireball entitylargefireball = new LargeFireball(this.getLevel(), this, d2, d3, d4, this.getExplosionPower()); + entitylargefireball.setPos(this.getX() + vec3d.x() * 4.0D, this.getY() + this.getBbHeight() / 2.0F + 0.5D, this.getZ() + vec3d.z() * 4.0D); + this.getLevel().addFreshEntity(entitylargefireball); + + // when we attack, there is a 1-in-6 chance we decide to stop attacking + if (this.getRandom().nextInt(6) == 0) { + this.setTarget(null); + } + } + + public static boolean ghastSpawnHandler(EntityType entityType, LevelAccessor accessor, MobSpawnType type, BlockPos pos, RandomSource random) { + return accessor.getDifficulty() != Difficulty.PEACEFUL && checkMobSpawnRules(entityType, accessor, type, pos, random); + } + + @Override + public boolean checkSpawnObstruction(LevelReader world) { + return world.isUnobstructed(this) && !world.containsAnyLiquid(this.getBoundingBox()); + } + + @Override + public boolean isWithinRestriction(BlockPos pos) { + // TF - restrict valid y levels + // Towers are so large, a simple radius doesn't really work, so we make it more of a cylinder + if (this.getRestrictRadius() == -1.0F) { + return true; + } else { + return pos.getY() > this.getLevel().getMinBuildHeight() + 64 && + pos.getY() < this.getLevel().getMaxBuildHeight() - 64 && + this.getRestrictCenter().distSqr(pos) < (double)(this.getRestrictRadius() * this.getRestrictRadius()); + } + } + + @Override + public void addAdditionalSaveData(CompoundTag compound) { + this.saveHomePointToNbt(compound); + super.addAdditionalSaveData(compound); + } + + @Override + public void readAdditionalSaveData(CompoundTag compound) { + super.readAdditionalSaveData(compound); + this.loadHomePointFromNbt(compound, 64); + } + + @Override + public BlockPos getRestrictionCenter() { + return this.getRestrictCenter(); + } + + @Override + public void setRestriction(BlockPos pos, int dist) { + this.restrictTo(pos, dist); + } +} + diff --git a/src/main/java/twilightforest/entity/monster/CarminiteGhastling.java b/src/main/java/twilightforest/entity/monster/CarminiteGhastling.java new file mode 100644 index 0000000000..60dae1c989 --- /dev/null +++ b/src/main/java/twilightforest/entity/monster/CarminiteGhastling.java @@ -0,0 +1,131 @@ +package twilightforest.entity.monster; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.util.RandomSource; +import net.minecraft.world.Difficulty; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.*; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.monster.Monster; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.ServerLevelAccessor; +import net.minecraft.world.phys.Vec3; +import twilightforest.init.TFSounds; + +import java.util.Objects; + +public class CarminiteGhastling extends CarminiteGhastguard { + + private boolean isMinion = false; + + public CarminiteGhastling(EntityType type, Level world) { + super(type, world); + this.wanderFactor = 4.0F; + + if (this.isMinion() && this.getAttribute(Attributes.MAX_HEALTH) != null) { + Objects.requireNonNull(this.getAttribute(Attributes.MAX_HEALTH)).setBaseValue(6); + this.setHealth(this.getMaxHealth()); + } + } + + @Override + public int getMaxSpawnClusterSize() { + return 16; + } + + public static AttributeSupplier.Builder registerAttributes() { + return CarminiteGhastguard.registerAttributes() + .add(Attributes.MAX_HEALTH, 10) + .add(Attributes.FOLLOW_RANGE, 16.0D); + } + + @Override + protected float getStandingEyeHeight(Pose pose, EntityDimensions size) { + return 0.5F; + } + + @Override + protected SoundEvent getAmbientSound() { + return TFSounds.CARMINITE_GHASTLING_AMBIENT.get(); + } + + @Override + protected SoundEvent getHurtSound(DamageSource source) { + return TFSounds.CARMINITE_GHASTLING_HURT.get(); + } + + @Override + protected SoundEvent getDeathSound() { + return TFSounds.CARMINITE_GHASTLING_DEATH.get(); + } + + @Override + public SoundEvent getFireSound() { + return TFSounds.CARMINITE_GHASTLING_SHOOT.get(); + } + + @Override + public SoundEvent getWarnSound() { + return TFSounds.CARMINITE_GHASTLING_WARN.get(); + } + + // Loosely based on EnderMan.isLookingAtMe + @Override + public boolean shouldAttack(LivingEntity living) { + ItemStack helmet = living.getItemBySlot(EquipmentSlot.HEAD); + if (!helmet.isEmpty() && helmet.is(Items.PUMPKIN)) { + return false; + } else if (living.distanceTo(this) <= 3.5F) { + return living.hasLineOfSight(this); + } else { + Vec3 vec3d = living.getViewVector(1.0F).normalize(); + Vec3 vec3d1 = new Vec3(this.getX() - living.getX(), this.getBoundingBox().minY + this.getEyeHeight() - (living.getY() + living.getEyeHeight()), this.getZ() - living.getZ()); + double d0 = vec3d1.length(); + vec3d1 = vec3d1.normalize(); + double d1 = vec3d.dot(vec3d1); + return d1 > 1.0D - 0.025D / d0 && living.hasLineOfSight(this); + } + } + + //This does not factor into whether the entity is a Minion or not. However, since it is spawned via MOB_SUMMONED, it will always spawn if that is the SpawnReason + public static boolean canSpawnHere(EntityType entity, ServerLevelAccessor world, MobSpawnType reason, BlockPos pos, RandomSource random) { + return world.getDifficulty() != Difficulty.PEACEFUL && (reason == MobSpawnType.MOB_SUMMONED || Monster.isDarkEnoughToSpawn(world, pos, random)) && checkMobSpawnRules(entity, world, reason, pos, random); + } + + public void makeBossMinion() { + this.wanderFactor = 0.005F; + this.isMinion = true; + + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(6); + this.setHealth(this.getMaxHealth()); + } + + public boolean isMinion() { + return this.isMinion; + } + + @Override + public void addAdditionalSaveData(CompoundTag compound) { + compound.putBoolean("isMinion", this.isMinion); + super.addAdditionalSaveData(compound); + } + + @Override + public void readAdditionalSaveData(CompoundTag compound) { + super.readAdditionalSaveData(compound); + if (compound.getBoolean("isMinion")) { + this.makeBossMinion(); + } + } + + //prevents ghastlings from triggering the traps on accident + @Override + public boolean isIgnoringBlockTriggers() { + return true; + } +} diff --git a/src/main/java/twilightforest/entity/monster/CarminiteGolem.java b/src/main/java/twilightforest/entity/monster/CarminiteGolem.java new file mode 100644 index 0000000000..8108b14b7e --- /dev/null +++ b/src/main/java/twilightforest/entity/monster/CarminiteGolem.java @@ -0,0 +1,131 @@ +package twilightforest.entity.monster; + +import org.joml.Vector3f; +import net.minecraft.core.BlockPos; +import net.minecraft.core.particles.BlockParticleOption; +import net.minecraft.core.particles.DustParticleOptions; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.util.Mth; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.goal.LookAtPlayerGoal; +import net.minecraft.world.entity.ai.goal.MeleeAttackGoal; +import net.minecraft.world.entity.ai.goal.RandomLookAroundGoal; +import net.minecraft.world.entity.ai.goal.WaterAvoidingRandomStrollGoal; +import net.minecraft.world.entity.ai.goal.target.HurtByTargetGoal; +import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal; +import net.minecraft.world.entity.monster.Monster; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.pathfinder.BlockPathTypes; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import twilightforest.init.TFSounds; + +public class CarminiteGolem extends Monster { + + private int attackTimer; + + public CarminiteGolem(EntityType type, Level world) { + super(type, world); + this.setPathfindingMalus(BlockPathTypes.WATER, -1.0F); + } + + @Override + protected void registerGoals() { + this.goalSelector.addGoal(1, new MeleeAttackGoal(this, 1.0D, false)); + this.goalSelector.addGoal(2, new WaterAvoidingRandomStrollGoal(this, 1.0D, 0.0F)); + this.goalSelector.addGoal(3, new LookAtPlayerGoal(this, Player.class, 6.0F)); + this.goalSelector.addGoal(3, new RandomLookAroundGoal(this)); + this.targetSelector.addGoal(1, new HurtByTargetGoal(this)); + this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true)); + } + + public static AttributeSupplier.Builder registerAttributes() { + return Monster.createMonsterAttributes() + .add(Attributes.MAX_HEALTH, 40.0D) + .add(Attributes.MOVEMENT_SPEED, 0.25D) + .add(Attributes.ATTACK_DAMAGE, 9.0D) + .add(Attributes.ARMOR, 2.0D); + } + + @Override + public boolean doHurtTarget(Entity entity) { + boolean attackSuccess = super.doHurtTarget(entity); + + if (attackSuccess) { + this.attackTimer = 10; + this.getLevel().broadcastEntityEvent(this, (byte) 4); + entity.push(0.0D, 0.4D, 0.0D); + } + + return attackSuccess; + } + + @Override + protected SoundEvent getHurtSound(DamageSource source) { + return TFSounds.CARMINITE_GOLEM_HURT.get(); + } + + @Override + protected SoundEvent getDeathSound() { + return TFSounds.CARMINITE_GOLEM_DEATH.get(); + } + + @Override + protected void playStepSound(BlockPos pos, BlockState state) { + this.playSound(TFSounds.CARMINITE_GOLEM_STEP.get(), 1.0F, 1.0F); + } + + @Override + public void aiStep() { + super.aiStep(); + + if (this.attackTimer > 0) { + --this.attackTimer; + } + + // [VanillaCopy] last half of IronGolem.aiStep + if (this.getDeltaMovement().x() * this.getDeltaMovement().x() + this.getDeltaMovement().z() * this.getDeltaMovement().z() > 2.500000277905201E-7D && this.getRandom().nextInt(5) == 0) { + int i = Mth.floor(this.getX()); + int j = Mth.floor(this.getY() - 0.2D); + int k = Mth.floor(this.getZ()); + BlockState state = this.getLevel().getBlockState(new BlockPos(i, j, k)); + + if (state.getMaterial() != Material.AIR) { + this.getLevel().addParticle(new BlockParticleOption(ParticleTypes.BLOCK, state), this.getX() + (this.getRandom().nextFloat() - 0.5D) * this.getBbWidth(), this.getBoundingBox().minY + 0.1D, this.getZ() + (this.getRandom().nextFloat() - 0.5D) * this.getBbWidth(), 4.0D * (this.getRandom().nextFloat() - 0.5D), 0.5D, (this.getRandom().nextFloat() - 0.5D) * 4.0D); + } + } + // End copy + + if (this.getRandom().nextBoolean()) { + this.getLevel().addParticle(new DustParticleOptions(new Vector3f(1.0F, 0.0F, 0.0F), 1.0F), this.getX() + (this.getRandom().nextDouble() - 0.5D) * this.getBbWidth(), this.getY() + this.getRandom().nextDouble() * this.getBbHeight() - 0.25D, this.getZ() + (this.getRandom().nextDouble() - 0.5D) * this.getBbWidth(), 0, 0, 0); + } + } + + @OnlyIn(Dist.CLIENT) + @Override + public void handleEntityEvent(byte id) { + if (id == 4) { + this.attackTimer = 10; + this.playSound(TFSounds.CARMINITE_GOLEM_ATTACK.get(), 1.0F, 1.0F); + } else { + super.handleEntityEvent(id); + } + } + + public int getAttackTimer() { + return this.attackTimer; + } + + @Override + public int getMaxSpawnClusterSize() { + return 2; + } +} diff --git a/src/main/java/twilightforest/entity/monster/DeathTome.java b/src/main/java/twilightforest/entity/monster/DeathTome.java new file mode 100644 index 0000000000..b170d920b4 --- /dev/null +++ b/src/main/java/twilightforest/entity/monster/DeathTome.java @@ -0,0 +1,145 @@ +package twilightforest.entity.monster; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.tags.DamageTypeTags; +import net.minecraft.util.Mth; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.damagesource.DamageTypes; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.control.FlyingMoveControl; +import net.minecraft.world.entity.ai.goal.*; +import net.minecraft.world.entity.ai.goal.target.HurtByTargetGoal; +import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal; +import net.minecraft.world.entity.ai.navigation.FlyingPathNavigation; +import net.minecraft.world.entity.ai.navigation.PathNavigation; +import net.minecraft.world.entity.monster.Monster; +import net.minecraft.world.entity.monster.RangedAttackMob; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.entity.projectile.ThrowableProjectile; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.gameevent.GameEvent; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets; +import net.minecraft.world.phys.Vec3; +import twilightforest.entity.projectile.TomeBolt; +import twilightforest.init.TFEntities; +import twilightforest.init.TFSounds; +import twilightforest.loot.TFLootTables; + +import org.jetbrains.annotations.Nullable; +import java.util.Objects; + +public class DeathTome extends Monster implements RangedAttackMob { + + public DeathTome(EntityType type, Level world) { + super(type, world); + this.moveControl = new FlyingMoveControl(this, 10, false); + } + + @Override + protected void registerGoals() { + this.goalSelector.addGoal(0, new FloatGoal(this)); + this.goalSelector.addGoal(4, new RangedAttackGoal(this, 1, 100, 5)); + this.goalSelector.addGoal(5, new WaterAvoidingRandomFlyingGoal(this, 1.0D)); + this.goalSelector.addGoal(6, new LookAtPlayerGoal(this, Player.class, 8.0F)); + this.goalSelector.addGoal(6, new RandomLookAroundGoal(this)); + this.targetSelector.addGoal(1, new HurtByTargetGoal(this)); + this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true)); + } + + public static AttributeSupplier.Builder registerAttributes() { + return Monster.createMonsterAttributes() + .add(Attributes.MAX_HEALTH, 30.0D) + .add(Attributes.MOVEMENT_SPEED, 0.25D) + .add(Attributes.FLYING_SPEED, 0.6D) + .add(Attributes.ATTACK_DAMAGE, 4.0D); + } + + @Override + protected PathNavigation createNavigation(Level level) { + FlyingPathNavigation flyingpathnavigation = new FlyingPathNavigation(this, level) { + public boolean isStableDestination(BlockPos pos) { + return !this.level.getBlockState(pos.below()).isAir(); + } + }; + flyingpathnavigation.setCanOpenDoors(false); + flyingpathnavigation.setCanFloat(false); + flyingpathnavigation.setCanPassDoors(true); + return flyingpathnavigation; + } + + @Override + public void aiStep() { + super.aiStep(); + + Vec3 vel = this.getDeltaMovement(); + if (!this.isOnGround() && vel.y() < 0.0D) { + this.setDeltaMovement(vel.multiply(1.0D, 0.6D, 1.0D)); + } + + for (int i = 0; i < 1; ++i) { + this.getLevel().addParticle(ParticleTypes.ENCHANT, this.getX() + (this.getRandom().nextDouble() - 0.5D) * this.getBbWidth(), this.getY() + this.getRandom().nextDouble() * (this.getBbHeight() - 0.75D) + 0.5D, this.getZ() + (this.getRandom().nextDouble() - 0.5D) * this.getBbWidth(), + 0.0D, 0.5D, 0.0D); + } + } + + @Override + public boolean hurt(DamageSource src, float damage) { + if (src.is(DamageTypeTags.IS_FIRE)) { + damage *= 2; + } + + if (super.hurt(src, damage)) { + if (damage > 0) { + if (!this.getLevel().isClientSide()) { + LootContext ctx = createLootContext(true, src).create(LootContextParamSets.ENTITY); + + Objects.requireNonNull(this.getLevel().getServer()).getLootTables().get(TFLootTables.DEATH_TOME_HURT).getRandomItems(ctx, s -> spawnAtLocation(s, 1.0F)); + } + } + return true; + } else { + return false; + } + } + + @Override + protected boolean canRide(Entity entity) { + return false; + } + + @Nullable + @Override + protected SoundEvent getAmbientSound() { + return TFSounds.DEATH_TOME_AMBIENT.get(); + } + + @Override + protected SoundEvent getHurtSound(DamageSource source) { + return TFSounds.DEATH_TOME_HURT.get(); + } + + @Override + protected SoundEvent getDeathSound() { + return TFSounds.DEATH_TOME_DEATH.get(); + } + + @Override + public void performRangedAttack(LivingEntity target, float distanceFactor) { + ThrowableProjectile projectile = new TomeBolt(TFEntities.TOME_BOLT.get(), this.getLevel(), this); + double tx = target.getX() - this.getX(); + double ty = target.getY() + target.getEyeHeight() - 1.1D - projectile.getY(); + double tz = target.getZ() - this.getZ(); + float heightOffset = Mth.sqrt((float) (tx * tx + tz * tz)) * 0.2F; + projectile.shoot(tx, ty + heightOffset, tz, 0.6F, 6.0F); + this.gameEvent(GameEvent.PROJECTILE_SHOOT); + this.getLevel().addFreshEntity(projectile); + } +} diff --git a/src/main/java/twilightforest/entity/monster/FireBeetle.java b/src/main/java/twilightforest/entity/monster/FireBeetle.java new file mode 100644 index 0000000000..0a43e1d77a --- /dev/null +++ b/src/main/java/twilightforest/entity/monster/FireBeetle.java @@ -0,0 +1,156 @@ +package twilightforest.entity.monster; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.network.syncher.EntityDataAccessor; +import net.minecraft.network.syncher.EntityDataSerializers; +import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.MobType; +import net.minecraft.world.entity.Pose; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.goal.FloatGoal; +import net.minecraft.world.entity.ai.goal.MeleeAttackGoal; +import net.minecraft.world.entity.ai.goal.WaterAvoidingRandomStrollGoal; +import net.minecraft.world.entity.ai.goal.target.HurtByTargetGoal; +import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal; +import net.minecraft.world.entity.monster.Monster; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.gameevent.GameEvent; +import net.minecraft.world.phys.Vec3; +import twilightforest.entity.IBreathAttacker; +import twilightforest.entity.ai.goal.BreathAttackGoal; +import twilightforest.init.TFDamageTypes; +import twilightforest.init.TFSounds; + +public class FireBeetle extends Monster implements IBreathAttacker { + + private static final EntityDataAccessor BREATHING = SynchedEntityData.defineId(FireBeetle.class, EntityDataSerializers.BOOLEAN); + private static final int BREATH_DURATION = 10; + private static final int BREATH_DAMAGE = 2; + + public FireBeetle(EntityType type, Level world) { + super(type, world); + } + + @Override + protected void registerGoals() { + this.goalSelector.addGoal(0, new FloatGoal(this)); + this.goalSelector.addGoal(2, new BreathAttackGoal<>(this, 5F, 30, 0.1F)); + this.goalSelector.addGoal(3, new MeleeAttackGoal(this, 1.0F, false)); + this.goalSelector.addGoal(6, new WaterAvoidingRandomStrollGoal(this, 1.0D)); + this.targetSelector.addGoal(1, new HurtByTargetGoal(this)); + this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true)); + } + + @Override + protected void defineSynchedData() { + super.defineSynchedData(); + this.entityData.define(BREATHING, false); + } + + public static AttributeSupplier.Builder registerAttributes() { + return Monster.createMonsterAttributes() + .add(Attributes.MAX_HEALTH, 25.0D) + .add(Attributes.MOVEMENT_SPEED, 0.23D) + .add(Attributes.ATTACK_DAMAGE, 4.0D); + } + + @Override + protected SoundEvent getHurtSound(DamageSource source) { + return TFSounds.FIRE_BEETLE_HURT.get(); + } + + @Override + protected SoundEvent getDeathSound() { + return TFSounds.FIRE_BEETLE_DEATH.get(); + } + + @Override + protected void playStepSound(BlockPos pos, BlockState block) { + playSound(TFSounds.FIRE_BEETLE_STEP.get(), 0.15F, 1.0F); + } + + @Override + public boolean isBreathing() { + return this.entityData.get(BREATHING); + } + + @Override + public void setBreathing(boolean flag) { + this.entityData.set(BREATHING, flag); + } + + @Override + public void aiStep() { + super.aiStep(); + + // when breathing fire, spew particles + if (this.isBreathing()) { + Vec3 look = this.getLookAngle(); + + double dist = 0.9; + double px = this.getX() + look.x() * dist; + double py = this.getY() + 0.25D + look.y() * dist; + double pz = this.getZ() + look.z() * dist; + + for (int i = 0; i < 2; i++) { + double dx = look.x(); + double dy = look.y(); + double dz = look.z(); + + double spread = 5 + this.getRandom().nextDouble() * 2.5; + double velocity = 0.15 + this.getRandom().nextDouble() * 0.15; + + // spread flame + dx += this.getRandom().nextGaussian() * 0.0075D * spread; + dy += this.getRandom().nextGaussian() * 0.0075D * spread; + dz += this.getRandom().nextGaussian() * 0.0075D * spread; + dx *= velocity; + dy *= velocity; + dz *= velocity; + + this.getLevel().addParticle(ParticleTypes.FLAME, px, py, pz, dx, dy, dz); + } + + playSound(TFSounds.FIRE_BEETLE_SHOOT.get(), this.getRandom().nextFloat() * 0.5F, this.getRandom().nextFloat() * 0.5F); + this.gameEvent(GameEvent.PROJECTILE_SHOOT); + } + } + + @Override + public int getMaxHeadXRot() { + return 500; + } + + @Override + public float getEyeHeight(Pose pose) { + return this.getBbHeight() * 0.6F; + } + + @Override + public MobType getMobType() { + return MobType.ARTHROPOD; + } + + @Override + public void doBreathAttack(Entity target) { + if (!target.fireImmune() && target.hurt(TFDamageTypes.getEntityDamageSource(this.getLevel(), TFDamageTypes.SCORCHED, this), BREATH_DAMAGE)) { + target.setSecondsOnFire(BREATH_DURATION); + } + } + + @Override + public boolean doHurtTarget(Entity entity) { + if (this.isBreathing()) { + return entity.hurt(TFDamageTypes.getEntityDamageSource(this.getLevel(), TFDamageTypes.SCORCHED, this), BREATH_DAMAGE); + } + return super.doHurtTarget(entity); + } +} diff --git a/src/main/java/twilightforest/entity/monster/GiantMiner.java b/src/main/java/twilightforest/entity/monster/GiantMiner.java new file mode 100644 index 0000000000..73b719335c --- /dev/null +++ b/src/main/java/twilightforest/entity/monster/GiantMiner.java @@ -0,0 +1,121 @@ +package twilightforest.entity.monster; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.DifficultyInstance; +import net.minecraft.world.entity.*; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.goal.*; +import net.minecraft.world.entity.ai.goal.target.HurtByTargetGoal; +import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal; +import net.minecraft.world.entity.monster.Monster; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.ServerLevelAccessor; +import org.jetbrains.annotations.Nullable; +import twilightforest.data.tags.BlockTagGenerator; +import twilightforest.init.TFDamageTypes; +import twilightforest.init.TFItems; +import twilightforest.util.EntityUtil; + +import java.util.List; + +public class GiantMiner extends Monster { + + public GiantMiner(EntityType type, Level world) { + super(type, world); + + for (EquipmentSlot slot : EquipmentSlot.values()) { + this.setDropChance(slot, 0); + } + } + + @Override + protected void registerGoals() { + this.goalSelector.addGoal(1, new FloatGoal(this)); + this.goalSelector.addGoal(4, new MeleeAttackGoal(this, 1.0D, false) { + @Override + protected double getAttackReachSqr(LivingEntity attackTarget) { + return this.mob.getBbWidth() * this.mob.getBbHeight(); + } + + @Override + protected void checkAndPerformAttack(LivingEntity pEnemy, double pDistToEnemySqr) { + double eyeHeightDistToEnemySqr = this.mob.distanceToSqr(pEnemy.getX(), pEnemy.getY() - this.mob.getEyeHeight() + pEnemy.getEyeHeight(), pEnemy.getZ()); + super.checkAndPerformAttack(pEnemy, Math.min(pDistToEnemySqr, eyeHeightDistToEnemySqr * 0.8D)); + } + }); + this.goalSelector.addGoal(5, new WaterAvoidingRandomStrollGoal(this, 1.0D)); + this.goalSelector.addGoal(6, new LookAtPlayerGoal(this, Player.class, 8.0F)); + this.goalSelector.addGoal(6, new RandomLookAroundGoal(this)); + this.targetSelector.addGoal(1, new HurtByTargetGoal(this)); + this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true)); + } + + public static AttributeSupplier.Builder registerAttributes() { + return Monster.createMonsterAttributes() + .add(Attributes.MAX_HEALTH, 80.0D) + .add(Attributes.MOVEMENT_SPEED, 0.23D) + .add(Attributes.ATTACK_DAMAGE, 2.0D) + .add(Attributes.FOLLOW_RANGE, 40.0D); + } + + @Nullable + @Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor accessor, DifficultyInstance difficulty, MobSpawnType reason, @Nullable SpawnGroupData spawnDataIn, @Nullable CompoundTag dataTag) { + SpawnGroupData data = super.finalizeSpawn(accessor, difficulty, reason, spawnDataIn, dataTag); + populateDefaultEquipmentSlots(accessor.getRandom(), difficulty); + populateDefaultEquipmentEnchantments(accessor.getRandom(), difficulty); + + return data; + } + + @Override + protected void populateDefaultEquipmentSlots(RandomSource random, DifficultyInstance difficulty) { + this.setItemSlot(EquipmentSlot.MAINHAND, new ItemStack(TFItems.GIANT_PICKAXE.get())); + } + + @Override + protected void enchantSpawnedWeapon(RandomSource random, float chance) { + + } + + @Override + protected void enchantSpawnedArmor(RandomSource random, float chance, EquipmentSlot slot) { + + } + + @Override + public boolean doHurtTarget(Entity entity) { + return EntityUtil.properlyApplyCustomDamageSource(this, entity, TFDamageTypes.getEntityDamageSource(this.getLevel(), TFDamageTypes.ANT, this)); + } + + @Override + public double getMyRidingOffset() { + return -2.5D; + } + + @Override + public int getMaxSpawnClusterSize() { + return 1; + } + + @Override + public boolean checkSpawnRules(LevelAccessor accessor, MobSpawnType reason) { + List giantsNearby = accessor.getEntitiesOfClass(GiantMiner.class, this.getBoundingBox().inflate(100, 10, 100)); + return giantsNearby.size() < 5; + } + + public static boolean canSpawn(EntityType type, ServerLevelAccessor accessor, MobSpawnType reason, BlockPos pos, RandomSource rand) { + return accessor.getBlockState(pos.below()).is(BlockTagGenerator.GIANTS_SPAWNABLE_ON); + } + + @Override + protected boolean canRide(Entity entity) { + return false; + } +} diff --git a/src/main/java/twilightforest/entity/monster/HarbingerCube.java b/src/main/java/twilightforest/entity/monster/HarbingerCube.java new file mode 100644 index 0000000000..9bc04d2e02 --- /dev/null +++ b/src/main/java/twilightforest/entity/monster/HarbingerCube.java @@ -0,0 +1,37 @@ +package twilightforest.entity.monster; + +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.goal.FloatGoal; +import net.minecraft.world.entity.ai.goal.LookAtPlayerGoal; +import net.minecraft.world.entity.ai.goal.RandomLookAroundGoal; +import net.minecraft.world.entity.ai.goal.WaterAvoidingRandomStrollGoal; +import net.minecraft.world.entity.ai.goal.target.HurtByTargetGoal; +import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal; +import net.minecraft.world.entity.monster.Monster; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; + +public class HarbingerCube extends Monster { + + public HarbingerCube(EntityType type, Level world) { + super(type, world); + } + + @Override + protected void registerGoals() { + this.goalSelector.addGoal(1, new FloatGoal(this)); + this.goalSelector.addGoal(1, new WaterAvoidingRandomStrollGoal(this, 1.0D)); + this.goalSelector.addGoal(2, new LookAtPlayerGoal(this, Player.class, 8.0F)); + this.goalSelector.addGoal(2, new RandomLookAroundGoal(this)); + this.targetSelector.addGoal(1, new HurtByTargetGoal(this)); + this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true)); + } + + public static AttributeSupplier.Builder registerAttributes() { + return Monster.createMonsterAttributes() + .add(Attributes.MAX_HEALTH, 40.0D) + .add(Attributes.MOVEMENT_SPEED, 0.23D); + } +} diff --git a/src/main/java/twilightforest/entity/monster/HedgeSpider.java b/src/main/java/twilightforest/entity/monster/HedgeSpider.java new file mode 100644 index 0000000000..8618ad124f --- /dev/null +++ b/src/main/java/twilightforest/entity/monster/HedgeSpider.java @@ -0,0 +1,89 @@ +package twilightforest.entity.monster; + +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.util.Mth; +import net.minecraft.util.RandomSource; +import net.minecraft.world.Difficulty; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.MobSpawnType; +import net.minecraft.world.entity.ai.goal.MeleeAttackGoal; +import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal; +import net.minecraft.world.entity.monster.Monster; +import net.minecraft.world.entity.monster.Spider; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.ServerLevelAccessor; +import net.minecraft.world.level.block.state.BlockState; +import twilightforest.init.TFLandmark; +import twilightforest.init.TFSounds; +import twilightforest.util.LegacyLandmarkPlacements; + +/** + * The hedge spider is just like a normal spider, but it can spawn in the daytime. + * + * @author Ben + */ +public class HedgeSpider extends Spider { + + public HedgeSpider(EntityType type, Level world) { + super(type, world); + } + + @Override + protected void registerGoals() { + super.registerGoals(); + + // Remove default spider melee task + this.goalSelector.availableGoals.removeIf(t -> t.getGoal() instanceof MeleeAttackGoal); + + // Replace with one that doesn't become docile in light + // [VanillaCopy] based on Spider.MeleeAttackGoal + this.goalSelector.addGoal(4, new MeleeAttackGoal(this, 1, true) { + @Override + protected double getAttackReachSqr(LivingEntity attackTarget) { + return 4.0F + attackTarget.getBbWidth(); + } + }); + + // Remove default spider target player task + this.targetSelector.availableGoals.removeIf(t -> t.getPriority() == 2 && t.getGoal() instanceof NearestAttackableTargetGoal); + // Replace with one that doesn't care about light + this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true)); + } + + public static boolean isValidLightLevel(ServerLevelAccessor accessor, BlockPos pos, RandomSource random) { + int chunkX = Mth.floor(pos.getX()) >> 4; + int chunkZ = Mth.floor(pos.getZ()) >> 4; + // We're allowed to spawn in bright light only in hedge mazes. + return LegacyLandmarkPlacements.getNearestLandmark(chunkX, chunkZ, (ServerLevel) accessor) == TFLandmark.HEDGE_MAZE + || Monster.isDarkEnoughToSpawn(accessor, pos, random); + } + + @Override + protected SoundEvent getAmbientSound() { + return TFSounds.HEDGE_SPIDER_AMBIENT.get(); + } + + @Override + protected SoundEvent getHurtSound(DamageSource source) { + return TFSounds.HEDGE_SPIDER_HURT.get(); + } + + @Override + protected SoundEvent getDeathSound() { + return TFSounds.HEDGE_SPIDER_DEATH.get(); + } + + @Override + protected void playStepSound(BlockPos pos, BlockState state) { + this.playSound(TFSounds.HEDGE_SPIDER_STEP.get(), 0.15F, 1.0F); + } + + public static boolean canSpawn(EntityType type, ServerLevelAccessor accessor, MobSpawnType reason, BlockPos pos, RandomSource random) { + return accessor.getDifficulty() != Difficulty.PEACEFUL && isValidLightLevel(accessor, pos, random); + } +} diff --git a/src/main/java/twilightforest/entity/monster/HelmetCrab.java b/src/main/java/twilightforest/entity/monster/HelmetCrab.java new file mode 100644 index 0000000000..9b9b9b8fb9 --- /dev/null +++ b/src/main/java/twilightforest/entity/monster/HelmetCrab.java @@ -0,0 +1,75 @@ +package twilightforest.entity.monster; + +import net.minecraft.core.BlockPos; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.MobType; +import net.minecraft.world.entity.Pose; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.goal.*; +import net.minecraft.world.entity.ai.goal.target.HurtByTargetGoal; +import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal; +import net.minecraft.world.entity.monster.Monster; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import twilightforest.init.TFSounds; + +public class HelmetCrab extends Monster { + + public HelmetCrab(EntityType type, Level world) { + super(type, world); + } + + @Override + protected void registerGoals() { + this.goalSelector.addGoal(0, new FloatGoal(this)); + this.goalSelector.addGoal(2, new LeapAtTargetGoal(this, 0.28F)); + this.goalSelector.addGoal(3, new MeleeAttackGoal(this, 1.0D, false)); + this.goalSelector.addGoal(6, new RandomStrollGoal(this, 1.0D)); + this.goalSelector.addGoal(7, new LookAtPlayerGoal(this, Player.class, 8.0F)); + this.goalSelector.addGoal(7, new RandomLookAroundGoal(this)); + this.targetSelector.addGoal(1, new HurtByTargetGoal(this)); + this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true)); + } + + public static AttributeSupplier.Builder registerAttributes() { + return Monster.createMonsterAttributes() + .add(Attributes.MAX_HEALTH, 13.0D) + .add(Attributes.MOVEMENT_SPEED, 0.28D) + .add(Attributes.ATTACK_DAMAGE, 3.0D) + .add(Attributes.ARMOR, 6.0D); + } + + @Override + public float getEyeHeight(Pose pose) { + return this.getBbHeight() * 0.4F; + } + + @Override + protected SoundEvent getHurtSound(DamageSource source) { + return TFSounds.HELMET_CRAB_HURT.get(); + } + + @Override + protected SoundEvent getDeathSound() { + return TFSounds.HELMET_CRAB_DEATH.get(); + } + + @Override + protected void playStepSound(BlockPos pos, BlockState state) { + this.playSound(TFSounds.HELMET_CRAB_STEP.get(), 0.15F, 1.0F); + } + + @Override + public int getMaxSpawnClusterSize() { + return 4; + } + + @Override + public MobType getMobType() { + return MobType.ARTHROPOD; + } +} diff --git a/src/main/java/twilightforest/entity/monster/HostileWolf.java b/src/main/java/twilightforest/entity/monster/HostileWolf.java new file mode 100644 index 0000000000..adcf46e9b4 --- /dev/null +++ b/src/main/java/twilightforest/entity/monster/HostileWolf.java @@ -0,0 +1,133 @@ +package twilightforest.entity.monster; + +import net.minecraft.core.BlockPos; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.util.Mth; +import net.minecraft.util.RandomSource; +import net.minecraft.world.Difficulty; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.MobSpawnType; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.goal.*; +import net.minecraft.world.entity.ai.goal.target.HurtByTargetGoal; +import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal; +import net.minecraft.world.entity.monster.Monster; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.ServerLevelAccessor; +import net.minecraft.world.level.block.state.BlockState; +import org.jetbrains.annotations.Nullable; +import twilightforest.init.TFLandmark; +import twilightforest.init.TFSounds; +import twilightforest.util.LegacyLandmarkPlacements; + +public class HostileWolf extends Monster { + + public HostileWolf(EntityType type, Level world) { + super(type, world); + } + + public static AttributeSupplier.Builder registerAttributes() { + return Mob.createMobAttributes().add(Attributes.MOVEMENT_SPEED, 0.3F).add(Attributes.MAX_HEALTH, 20.0D).add(Attributes.ATTACK_DAMAGE, 2.0D); + } + + @Override + protected void registerGoals() { + this.goalSelector.addGoal(1, new FloatGoal(this)); + this.goalSelector.addGoal(2, new LeapGoal(this, 0.4F)); + this.goalSelector.addGoal(3, new MeleeAttackGoal(this, 1.0D, true)); + this.goalSelector.addGoal(4, new WaterAvoidingRandomStrollGoal(this, 1.0D)); + this.goalSelector.addGoal(5, new LookAtPlayerGoal(this, Player.class, 8.0F)); + this.goalSelector.addGoal(5, new RandomLookAroundGoal(this)); + this.targetSelector.addGoal(1, new HurtByTargetGoal(this, HostileWolf.class)); + this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true)); + } + + @Override + public void setTarget(@Nullable LivingEntity entity) { + if (entity != null && entity != this.getTarget()) + this.playSound(this.getTargetSound(), 4F, this.getVoicePitch()); + super.setTarget(entity); + } + + public static boolean checkWolfSpawnRules(EntityType entity, ServerLevelAccessor accessor, MobSpawnType reason, BlockPos pos, RandomSource random) { + return accessor.getDifficulty() != Difficulty.PEACEFUL && isValidLightLevel(accessor, pos, random) && checkMobSpawnRules(entity, accessor, reason, pos, random); + } + + public static boolean isValidLightLevel(ServerLevelAccessor accessor, BlockPos pos, RandomSource random) { + int chunkX = Mth.floor(pos.getX()) >> 4; + int chunkZ = Mth.floor(pos.getZ()) >> 4; + // We're allowed to spawn in bright light only in hedge mazes. + return LegacyLandmarkPlacements.getNearestLandmark(chunkX, chunkZ, accessor.getLevel()) == TFLandmark.HEDGE_MAZE || Monster.isDarkEnoughToSpawn(accessor, pos, random); + } + + protected SoundEvent getTargetSound() { + return TFSounds.HOSTILE_WOLF_TARGET.get(); + } + + @Override + protected SoundEvent getAmbientSound() { + return TFSounds.HOSTILE_WOLF_AMBIENT.get(); + } + + @Override + protected SoundEvent getHurtSound(DamageSource source) { + return TFSounds.HOSTILE_WOLF_HURT.get(); + } + + @Override + protected SoundEvent getDeathSound() { + return TFSounds.HOSTILE_WOLF_DEATH.get(); + } + + @Override + protected void playStepSound(BlockPos pos, BlockState state) { + this.playSound(SoundEvents.WOLF_STEP, 0.15F, 1.0F); + } + + @Override + protected float getSoundVolume() { + return 0.4F; + } + + @Override + protected boolean shouldDespawnInPeaceful() { + return true; + } + + public float getTailAngle() { + if (this.getTarget() != null) { + return 1.5393804F; + } else { + return ((float) Math.PI / 5F); + } + } + + //add aggressive flags so its face doesnt turn passive when it jumps + public static class LeapGoal extends LeapAtTargetGoal { + + private final Mob mob; + + public LeapGoal(Mob mob, float jump) { + super(mob, jump); + this.mob = mob; + } + + @Override + public void start() { + super.start(); + mob.setAggressive(true); + } + + @Override + public void stop() { + super.stop(); + mob.setAggressive(false); + } + } +} diff --git a/src/main/java/twilightforest/entity/monster/IceCrystal.java b/src/main/java/twilightforest/entity/monster/IceCrystal.java new file mode 100644 index 0000000000..a957c681a2 --- /dev/null +++ b/src/main/java/twilightforest/entity/monster/IceCrystal.java @@ -0,0 +1,83 @@ +package twilightforest.entity.monster; + +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.goal.*; +import net.minecraft.world.entity.ai.goal.target.HurtByTargetGoal; +import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal; +import net.minecraft.world.entity.monster.Monster; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import twilightforest.init.TFEntities; +import twilightforest.init.TFSounds; + +public class IceCrystal extends BaseIceMob { + + private int crystalAge; + private int maxCrystalAge = -1; + + public IceCrystal(Level worldIn) { + super(TFEntities.ICE_CRYSTAL.get(), worldIn); + } + + public IceCrystal(EntityType type, Level world) { + super(type, world); + } + + @Override + protected void registerGoals() { + this.goalSelector.addGoal(0, new FloatGoal(this)); + this.goalSelector.addGoal(1, new MeleeAttackGoal(this, 1.0D, false)); + this.goalSelector.addGoal(2, new WaterAvoidingRandomStrollGoal(this, 1.0D)); + this.goalSelector.addGoal(3, new LookAtPlayerGoal(this, Player.class, 8.0F)); + this.goalSelector.addGoal(3, new RandomLookAroundGoal(this)); + this.targetSelector.addGoal(1, new HurtByTargetGoal(this)); + this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true)); + } + + public static AttributeSupplier.Builder registerAttributes() { + return Monster.createMonsterAttributes() + .add(Attributes.MAX_HEALTH, 10.0D) + .add(Attributes.MOVEMENT_SPEED, 0.23D) + .add(Attributes.ATTACK_DAMAGE, 5.0D); + } + + @Override + public int getMaxSpawnClusterSize() { + return 4; + } + + @Override + protected SoundEvent getAmbientSound() { + return TFSounds.ICE_CORE_AMBIENT.get(); + } + + @Override + protected SoundEvent getHurtSound(DamageSource source) { + return TFSounds.ICE_CORE_HURT.get(); + } + + @Override + protected SoundEvent getDeathSound() { + return TFSounds.ICE_CORE_DEATH.get(); + } + + public void setToDieIn30Seconds() { + this.maxCrystalAge = 600; + } + + @Override + public void aiStep() { + super.aiStep(); + + if (!this.getLevel().isClientSide()) { + this.crystalAge++; + if (this.maxCrystalAge > 0 && this.crystalAge >= this.maxCrystalAge) { + this.discard(); + } + } + } +} diff --git a/src/main/java/twilightforest/entity/monster/KingSpider.java b/src/main/java/twilightforest/entity/monster/KingSpider.java new file mode 100644 index 0000000000..c6f852f5b0 --- /dev/null +++ b/src/main/java/twilightforest/entity/monster/KingSpider.java @@ -0,0 +1,83 @@ +package twilightforest.entity.monster; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.DifficultyInstance; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.MobSpawnType; +import net.minecraft.world.entity.SpawnGroupData; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.monster.Spider; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.ServerLevelAccessor; +import net.minecraft.world.level.block.state.BlockState; +import twilightforest.init.TFEntities; +import twilightforest.init.TFSounds; + +import org.jetbrains.annotations.Nullable; + +public class KingSpider extends Spider { + + public KingSpider(EntityType type, Level world) { + super(type, world); + } + + public static AttributeSupplier.Builder registerAttributes() { + return Spider.createAttributes() + .add(Attributes.MAX_HEALTH, 30.0D) + .add(Attributes.MOVEMENT_SPEED, 0.35D) + .add(Attributes.ATTACK_DAMAGE, 6.0D); + } + + @Override + protected SoundEvent getAmbientSound() { + return TFSounds.KING_SPIDER_AMBIENT.get(); + } + + @Override + protected SoundEvent getHurtSound(DamageSource source) { + return TFSounds.KING_SPIDER_HURT.get(); + } + + @Override + protected SoundEvent getDeathSound() { + return TFSounds.KING_SPIDER_DEATH.get(); + } + + @Override + protected void playStepSound(BlockPos pos, BlockState blockIn) { + this.playSound(TFSounds.KING_SPIDER_STEP.get(), 0.15F, 1.0F); + } + + @Override + public boolean onClimbable() { + // let's not climb + return false; + } + + @Nullable + @Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor accessor, DifficultyInstance difficulty, MobSpawnType reason, @Nullable SpawnGroupData data, @Nullable CompoundTag tag) { + data = super.finalizeSpawn(accessor, difficulty, reason, data, tag); + + // will always have a druid riding the spider or whatever is riding the spider + SkeletonDruid druid = TFEntities.SKELETON_DRUID.get().create(this.getLevel()); + druid.moveTo(this.getX(), this.getY(), this.getZ(), this.getYRot(), 0.0F); + druid.finalizeSpawn(accessor, difficulty, MobSpawnType.JOCKEY, null, null); + Entity lastRider = this; + while (!lastRider.getPassengers().isEmpty()) + lastRider = lastRider.getPassengers().get(0); + druid.startRiding(lastRider); + + return data; + } + + @Override + public double getPassengersRidingOffset() { + return this.getBbHeight() * 0.75D; + } +} diff --git a/src/main/java/twilightforest/entity/monster/Kobold.java b/src/main/java/twilightforest/entity/monster/Kobold.java new file mode 100644 index 0000000000..44e7e4ebe7 --- /dev/null +++ b/src/main/java/twilightforest/entity/monster/Kobold.java @@ -0,0 +1,328 @@ +package twilightforest.entity.monster; + +import net.minecraft.core.particles.ItemParticleOption; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.syncher.EntityDataAccessor; +import net.minecraft.network.syncher.EntityDataSerializers; +import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.util.Mth; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.goal.*; +import net.minecraft.world.entity.ai.goal.target.HurtByTargetGoal; +import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.entity.monster.Monster; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.gameevent.GameEvent; +import net.minecraft.world.phys.Vec3; +import twilightforest.data.tags.ItemTagGenerator; +import twilightforest.entity.ai.goal.FlockToSameKindGoal; +import twilightforest.entity.ai.goal.PanicOnFlockDeathGoal; +import twilightforest.init.TFSounds; + +import java.util.EnumSet; +import java.util.List; +import java.util.function.Predicate; + +public class Kobold extends Monster { + + private static final EntityDataAccessor PANICKED = SynchedEntityData.defineId(Kobold.class, EntityDataSerializers.BOOLEAN); + private int lastEatenBreadTicks; + private int eatingTime; + + public Kobold(EntityType type, Level world) { + super(type, world); + this.setCanPickUpLoot(true); + } + + @Override + protected void registerGoals() { + this.goalSelector.addGoal(0, new FloatGoal(this)); + this.goalSelector.addGoal(1, new PanicOnFlockDeathGoal(this, 2.0F)); + this.goalSelector.addGoal(2, new SeekBreadGoal(this)); + this.goalSelector.addGoal(2, new RunAwayWhileHoldingBreadGoal(this)); + this.goalSelector.addGoal(3, new LeapAtTargetGoal(this, 0.3F)); + this.goalSelector.addGoal(4, new MeleeAttackGoal(this, 1.0D, false)); + this.goalSelector.addGoal(5, new FlockToSameKindGoal(this, 1.0D)); + this.goalSelector.addGoal(6, new WaterAvoidingRandomStrollGoal(this, 1.0D)); + this.goalSelector.addGoal(7, new LookAtPlayerGoal(this, Player.class, 8.0F)); + this.goalSelector.addGoal(7, new RandomLookAroundGoal(this)); + this.targetSelector.addGoal(1, new HurtByTargetGoal(this)); + this.targetSelector.addGoal(2, new KoboldAttackPlayerTarget(this)); + } + + @Override + protected void defineSynchedData() { + super.defineSynchedData(); + this.entityData.define(PANICKED, false); + } + + public static AttributeSupplier.Builder registerAttributes() { + return Monster.createMonsterAttributes() + .add(Attributes.MAX_HEALTH, 13.0D) + .add(Attributes.MOVEMENT_SPEED, 0.28D) + .add(Attributes.ATTACK_DAMAGE, 4.0D); + } + + @Override + protected SoundEvent getAmbientSound() { + return TFSounds.KOBOLD_AMBIENT.get(); + } + + @Override + protected SoundEvent getHurtSound(DamageSource source) { + return TFSounds.KOBOLD_HURT.get(); + } + + @Override + protected SoundEvent getDeathSound() { + return TFSounds.KOBOLD_DEATH.get(); + } + + public boolean isPanicked() { + return this.entityData.get(PANICKED); + } + + public void setPanicked(boolean flag) { + this.entityData.set(PANICKED, flag); + } + + @Override + public SoundEvent getEatingSound(ItemStack stack) { + return TFSounds.KOBOLD_MUNCH.get(); + } + + @Override + public void aiStep() { + super.aiStep(); + + if (this.getLevel().isClientSide() && this.isPanicked()) { + for (int i = 0; i < 2; i++) { + this.getLevel().addParticle(ParticleTypes.SPLASH, this.getX() + (this.getRandom().nextDouble() - 0.5D) * this.getBbWidth() * 0.5, this.getY() + this.getEyeHeight(), this.getZ() + (this.getRandom().nextDouble() - 0.5D) * this.getBbWidth() * 0.5, 0, 0, 0); + } + } + + //bread munching + if (!this.getLevel().isClientSide() && this.isAlive() && this.getItemBySlot(EquipmentSlot.MAINHAND).is(ItemTagGenerator.KOBOLD_PACIFICATION_BREADS)) { + ++this.lastEatenBreadTicks; + if (this.eatingTime > 0) this.eatingTime--; + ItemStack itemstack = this.getItemBySlot(EquipmentSlot.MAINHAND); + if (this.canEat(itemstack)) { + if (this.eatingTime <= 0) { + ItemStack itemstack1 = itemstack.finishUsingItem(this.getLevel(), this); + if (!itemstack1.isEmpty()) { + this.setItemSlot(EquipmentSlot.MAINHAND, itemstack1); + } + } + //every 3 seconds chew some bread + if (this.lastEatenBreadTicks > 60 && this.getRandom().nextFloat() < 0.1F) { + this.playSound(this.getEatingSound(itemstack), 0.75F, 0.9F); + this.gameEvent(GameEvent.EAT); + this.getLevel().broadcastEntityEvent(this, (byte) 45); + this.lastEatenBreadTicks = 0; + } + } + } + } + + @Override + public void handleEntityEvent(byte pId) { + if (pId == 45) { + ItemStack itemstack = this.getItemBySlot(EquipmentSlot.MAINHAND); + if (!itemstack.isEmpty()) { + this.spawnItemParticles(itemstack, 8); + } + } else { + super.handleEntityEvent(pId); + } + + } + + private void spawnItemParticles(ItemStack stack, int amount) { + for (int i = 0; i < amount; ++i) { + Vec3 vec3 = new Vec3((this.getRandom().nextFloat() - 0.5D) * 0.1D, Math.random() * 0.1D + 0.1D, 0.0D); + vec3 = vec3.xRot(-this.getXRot() * Mth.DEG_TO_RAD); + vec3 = vec3.yRot(-this.getYHeadRot() * Mth.DEG_TO_RAD); + double d0 = -this.getRandom().nextFloat() * 0.6D - 0.3D; + Vec3 vec31 = new Vec3((this.getRandom().nextFloat() - 0.5D) * 0.3D, d0, 0.6D); + vec31 = vec31.xRot(-this.getXRot() * Mth.DEG_TO_RAD); + vec31 = vec31.yRot(-this.getYHeadRot() * Mth.DEG_TO_RAD); + vec31 = vec31.add(this.getX(), this.getEyeY(), this.getZ()); + if (this.getLevel() instanceof ServerLevel server) + server.sendParticles(new ItemParticleOption(ParticleTypes.ITEM, stack), vec31.x(), vec31.y(), vec31.z(), 1, vec3.x(), vec3.y() + 0.05D, vec3.z(), 0.0D); + else + this.getLevel().addParticle(new ItemParticleOption(ParticleTypes.ITEM, stack), vec31.x(), vec31.y(), vec31.z(), vec3.x(), vec3.y() + 0.05D, vec3.z()); + } + } + + private boolean canEat(ItemStack stack) { + return stack.getItem().isEdible() && !this.isPanicked(); + } + + @Override + public boolean canTakeItem(ItemStack stack) { + EquipmentSlot equipmentslot = Mob.getEquipmentSlotForItem(stack); + if (!this.getItemBySlot(equipmentslot).isEmpty()) { + return false; + } else { + return equipmentslot == EquipmentSlot.MAINHAND && super.canTakeItem(stack); + } + } + + @Override + public boolean canHoldItem(ItemStack stack) { + return this.getItemBySlot(EquipmentSlot.MAINHAND).isEmpty() && stack.is(ItemTagGenerator.KOBOLD_PACIFICATION_BREADS) && !this.isPanicked(); + } + + @Override + protected void pickUpItem(ItemEntity item) { + ItemStack itemstack = item.getItem(); + if (this.canHoldItem(itemstack)) { + int i = itemstack.getCount(); + if (i > 1) { + this.dropItemStack(itemstack.split(i - 1)); + } + + this.onItemPickup(item); + this.setItemSlot(EquipmentSlot.MAINHAND, itemstack.split(1)); + this.handDropChances[EquipmentSlot.MAINHAND.getIndex()] = 2.0F; + this.take(item, itemstack.getCount()); + this.gameEvent(GameEvent.EQUIP); + item.discard(); + this.lastEatenBreadTicks = 1; + this.eatingTime = this.difficultyTime() + this.getRandom().nextInt(600); + this.setTarget(null); + } + } + + //change the timer based on difficulty + private int difficultyTime() { + switch (this.getLevel().getDifficulty()) { + case EASY -> { + return 400; + } + case NORMAL -> { + return 200; + } + case HARD -> { + return 100; + } + } + return 200; + } + + private void dropItemStack(ItemStack stack) { + ItemEntity itementity = new ItemEntity(this.getLevel(), this.getX(), this.getY(), this.getZ(), stack); + this.getLevel().addFreshEntity(itementity); + } + + @Override + public void addAdditionalSaveData(CompoundTag tag) { + super.addAdditionalSaveData(tag); + tag.putInt("EatingTimeLeft", this.eatingTime); + tag.putInt("TimeSinceBreadLastEaten", this.lastEatenBreadTicks); + } + + @Override + public void readAdditionalSaveData(CompoundTag tag) { + super.readAdditionalSaveData(tag); + this.eatingTime = tag.getInt("EatingTimeLeft"); + this.lastEatenBreadTicks = tag.getInt("TimeSinceBreadLastEaten"); + } + + @Override + public int getMaxSpawnClusterSize() { + return 1; + } + + //we dont want kobolds to attack if they're pacified + private static class KoboldAttackPlayerTarget extends NearestAttackableTargetGoal { + + public KoboldAttackPlayerTarget(Kobold mob) { + super(mob, Player.class, true); + } + + @Override + public boolean canUse() { + if (this.mob.getItemBySlot(EquipmentSlot.MAINHAND).is(ItemTagGenerator.KOBOLD_PACIFICATION_BREADS)) { + return false; + } + return super.canUse(); + } + } + + //look for bread + //greatly inspired by Fox.FoxSearchForItemsGoal + private static class SeekBreadGoal extends Goal { + + private static final Predicate ALLOWED_ITEMS = (item) -> + item.getItem().is(ItemTagGenerator.KOBOLD_PACIFICATION_BREADS); + + private final Kobold mob; + + public SeekBreadGoal(Kobold mob) { + this.setFlags(EnumSet.of(Goal.Flag.MOVE)); + this.mob = mob; + } + + @Override + public boolean canUse() { + if (!this.mob.getUseItem().isEmpty()) { + return false; + } else if (!this.mob.isPanicked()) { + if (this.mob.getRandom().nextInt(10) != 0) { + return false; + } else { + List list = this.mob.getLevel().getEntitiesOfClass(ItemEntity.class, this.mob.getBoundingBox().inflate(8.0D, 8.0D, 8.0D), ALLOWED_ITEMS); + return !list.isEmpty() && this.mob.getItemBySlot(EquipmentSlot.MAINHAND).isEmpty(); + } + } else { + return false; + } + } + + @Override + public void tick() { + List list = this.mob.getLevel().getEntitiesOfClass(ItemEntity.class, this.mob.getBoundingBox().inflate(8.0D, 8.0D, 8.0D), ALLOWED_ITEMS); + ItemStack itemstack = this.mob.getItemBySlot(EquipmentSlot.MAINHAND); + if (itemstack.isEmpty() && !list.isEmpty()) { + this.mob.getNavigation().moveTo(list.get(0), 1.2F); + this.mob.getLookControl().setLookAt(list.get(0).getX(), list.get(0).getY(), list.get(0).getZ()); + } + } + + @Override + public void start() { + List list = this.mob.getLevel().getEntitiesOfClass(ItemEntity.class, this.mob.getBoundingBox().inflate(8.0D, 8.0D, 8.0D), ALLOWED_ITEMS); + if (!list.isEmpty()) { + this.mob.getNavigation().moveTo(list.get(0), 1.2F); + } + } + } + + //avoid players only while holding bread + private static class RunAwayWhileHoldingBreadGoal extends AvoidEntityGoal { + + public RunAwayWhileHoldingBreadGoal(Kobold mob) { + super(mob, Player.class, 8.0F, 1.5F, 1.5F); + } + + @Override + public boolean canUse() { + if (this.mob.getItemBySlot(EquipmentSlot.MAINHAND).is(ItemTagGenerator.KOBOLD_PACIFICATION_BREADS)) { + return super.canUse(); + } + return false; + } + } +} diff --git a/src/main/java/twilightforest/entity/monster/LichMinion.java b/src/main/java/twilightforest/entity/monster/LichMinion.java new file mode 100644 index 0000000000..857909a910 --- /dev/null +++ b/src/main/java/twilightforest/entity/monster/LichMinion.java @@ -0,0 +1,101 @@ +package twilightforest.entity.monster; + +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.monster.Zombie; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.AABB; +import twilightforest.entity.boss.Lich; +import twilightforest.init.TFEntities; +import twilightforest.init.TFSounds; + +import java.util.List; + +public class LichMinion extends Zombie { + + public Lich master; + + public LichMinion(EntityType type, Level world) { + super(type, world); + this.master = null; + } + + public LichMinion(Level world, Lich entityTFLich) { + super(TFEntities.LICH_MINION.get(), world); + this.master = entityTFLich; + } + + @Override + public boolean hurt(DamageSource source, float amount) { + LivingEntity prevTarget = getTarget(); + + if (super.hurt(source, amount)) { + if (source.getEntity() instanceof Lich) { + // return to previous target but speed up + this.setLastHurtByMob(prevTarget); + this.addEffect(new MobEffectInstance(MobEffects.MOVEMENT_SPEED, 200, 4)); + this.addEffect(new MobEffectInstance(MobEffects.DAMAGE_BOOST, 200, 1)); + } + return true; + } else { + return false; + } + } + + @Override + protected SoundEvent getAmbientSound() { + return TFSounds.MINION_AMBIENT.get(); + } + + @Override + protected SoundEvent getHurtSound(DamageSource damageSourceIn) { + return TFSounds.MINION_HURT.get(); + } + + @Override + protected SoundEvent getDeathSound() { + return TFSounds.MINION_DEATH.get(); + } + + @Override + protected SoundEvent getStepSound() { + return TFSounds.MINION_STEP.get(); + } + + @Override + public void aiStep() { + if (this.master == null) { + this.findNewMaster(); + } + // if we still don't have a master, or ours is dead, die. + if (this.master == null || !this.master.isAlive()) { + this.kill(); + } + super.aiStep(); + } + + private void findNewMaster() { + List nearbyLiches = this.getLevel().getEntitiesOfClass(Lich.class, new AABB(getX(), getY(), getZ(), getX() + 1, getY() + 1, getZ() + 1).inflate(32.0D, 16.0D, 32.0D)); + + for (Lich nearbyLich : nearbyLiches) { + if (!nearbyLich.isShadowClone() && nearbyLich.wantsNewMinion()) { + this.master = nearbyLich; + + // animate our new linkage! + if (!this.getLevel().isClientSide()) { + this.master.makeMagicTrail(this.getEyePosition(), this.master.getEyePosition(), 0.0F, 0.0F, 0.0F); + } + + // become angry at our masters target + this.setTarget(this.master.getTarget()); + + // quit looking + break; + } + } + } +} diff --git a/src/main/java/twilightforest/entity/monster/LowerGoblinKnight.java b/src/main/java/twilightforest/entity/monster/LowerGoblinKnight.java new file mode 100644 index 0000000000..940e96cf8d --- /dev/null +++ b/src/main/java/twilightforest/entity/monster/LowerGoblinKnight.java @@ -0,0 +1,220 @@ +package twilightforest.entity.monster; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.syncher.EntityDataAccessor; +import net.minecraft.network.syncher.EntityDataSerializers; +import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.util.Mth; +import net.minecraft.world.DifficultyInstance; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.*; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.goal.*; +import net.minecraft.world.entity.ai.goal.target.HurtByTargetGoal; +import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal; +import net.minecraft.world.entity.monster.Monster; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.ServerLevelAccessor; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import twilightforest.init.TFSounds; +import twilightforest.init.TFEntities; +import twilightforest.entity.ai.goal.RiderSpearAttackGoal; + +import org.jetbrains.annotations.Nullable; +import java.util.Objects; + +public class LowerGoblinKnight extends Monster { + + private static final EntityDataAccessor ARMOR = SynchedEntityData.defineId(LowerGoblinKnight.class, EntityDataSerializers.BOOLEAN); + private static final AttributeModifier ARMOR_MODIFIER = new AttributeModifier("Armor boost", 17, AttributeModifier.Operation.ADDITION); + + public LowerGoblinKnight(EntityType type, Level world) { + super(type, world); + this.setHasArmor(true); + } + + @Override + protected void registerGoals() { + this.goalSelector.addGoal(0, new RiderSpearAttackGoal(this)); + this.goalSelector.addGoal(1, new FloatGoal(this)); + this.goalSelector.addGoal(3, new MeleeAttackGoal(this, 1.0D, false) { + @Override + public boolean canUse() { + if (mob.isVehicle() && this.mob.getPassengers().get(0) instanceof UpperGoblinKnight knight && knight.heavySpearTimer > 0) { + return false; + } + return super.canUse(); + } + }); + this.goalSelector.addGoal(6, new WaterAvoidingRandomStrollGoal(this, 1.0D)); + this.goalSelector.addGoal(7, new LookAtPlayerGoal(this, Player.class, 8.0F)); + this.goalSelector.addGoal(7, new RandomLookAroundGoal(this)); + this.targetSelector.addGoal(1, new HurtByTargetGoal(this)); + this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, false)); + } + + public static AttributeSupplier.Builder registerAttributes() { + return Monster.createMonsterAttributes() + .add(Attributes.MAX_HEALTH, 20.0D) + .add(Attributes.MOVEMENT_SPEED, 0.28D) + .add(Attributes.ATTACK_DAMAGE, 4.0D); + } + + @Override + protected void defineSynchedData() { + super.defineSynchedData(); + this.entityData.define(ARMOR, false); + } + + public boolean hasArmor() { + return this.entityData.get(ARMOR); + } + + private void setHasArmor(boolean flag) { + this.entityData.set(ARMOR, flag); + + if (!this.getLevel().isClientSide()) { + if (flag) { + if (!Objects.requireNonNull(this.getAttribute(Attributes.ARMOR)).hasModifier(ARMOR_MODIFIER)) { + Objects.requireNonNull(this.getAttribute(Attributes.ARMOR)).addTransientModifier(ARMOR_MODIFIER); + } + } else { + Objects.requireNonNull(this.getAttribute(Attributes.ARMOR)).removeModifier(ARMOR_MODIFIER); + } + } + } + + @Override + public void addAdditionalSaveData(CompoundTag compound) { + super.addAdditionalSaveData(compound); + compound.putBoolean("hasArmor", this.hasArmor()); + } + + @Override + public void readAdditionalSaveData(CompoundTag compound) { + super.readAdditionalSaveData(compound); + this.setHasArmor(compound.getBoolean("hasArmor")); + } + + @Nullable + @Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor accessor, DifficultyInstance difficulty, MobSpawnType reason, @Nullable SpawnGroupData data, @Nullable CompoundTag tag) { + data = super.finalizeSpawn(accessor, difficulty, reason, data, tag); + + UpperGoblinKnight upper = new UpperGoblinKnight(TFEntities.UPPER_GOBLIN_KNIGHT.get(), this.getLevel()); + upper.moveTo(this.getX(), this.getY(), this.getZ(), this.getYRot(), 0.0F); + upper.finalizeSpawn(accessor, difficulty, MobSpawnType.NATURAL, data, tag); + upper.startRiding(this); + + return data; + } + + @Override + public double getPassengersRidingOffset() { + return 1.0D; + } + + @Override + public boolean doHurtTarget(Entity entity) { + if (this.isVehicle() && this.getPassengers().get(0) instanceof LivingEntity living) { + return living.doHurtTarget(entity); + } else { + return super.doHurtTarget(entity); + } + + } + + @Nullable + @Override + protected SoundEvent getAmbientSound() { + return this.isVehicle() ? TFSounds.GOBLIN_KNIGHT_MUFFLED_AMBIENT.get() : TFSounds.GOBLIN_KNIGHT_AMBIENT.get(); + } + + @Override + protected SoundEvent getDeathSound() { + return this.isVehicle() ? TFSounds.GOBLIN_KNIGHT_MUFFLED_DEATH.get() : TFSounds.GOBLIN_KNIGHT_DEATH.get(); + } + + @Override + protected SoundEvent getHurtSound(DamageSource source) { + return this.isVehicle() ? TFSounds.GOBLIN_KNIGHT_MUFFLED_HURT.get() : TFSounds.GOBLIN_KNIGHT_HURT.get(); + } + + @Override + public boolean hurt(DamageSource source, float amount) { + // check the angle of attack, if applicable + Entity attacker = null; + if (source.getEntity() != null) { + attacker = source.getEntity(); + } + + if (source.getEntity() != null) { + attacker = source.getEntity(); + } + + if (attacker != null) { + // determine angle + + double dx = this.getX() - attacker.getX(); + double dz = this.getZ() - attacker.getZ(); + float angle = (float) ((Math.atan2(dz, dx) * 180D) / Math.PI) - 90F; + + float difference = Mth.abs((this.yBodyRot - angle) % 360); + + // shield? + UpperGoblinKnight upper = null; + + if (this.isVehicle() && this.getPassengers().get(0) instanceof UpperGoblinKnight goblin) { + upper = goblin; + } + + if (upper != null && upper.hasShield() && difference > 150 && difference < 230) { + if (upper.takeHitOnShield(source, amount)) { + return false; + } + } + + // break armor? + if (this.hasArmor() && (difference > 300 || difference < 60)) { + this.breakArmor(); + } + } + + return super.hurt(source, amount); + } + + @Override + public void positionRider(Entity entity) { + super.positionRider(entity); + if(entity instanceof UpperGoblinKnight goblin) { + goblin.setYBodyRot(this.getYRot()); + goblin.setYHeadRot(this.getYRot()); + goblin.setYRot(this.getYRot()); + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void handleEntityEvent(byte id) { + if (id == 5) { + ItemStack broken = new ItemStack(Items.IRON_CHESTPLATE); + this.breakItem(broken); + this.breakItem(broken); + this.breakItem(broken); + } else { + super.handleEntityEvent(id); + } + } + + private void breakArmor() { + this.getLevel().broadcastEntityEvent(this, (byte) 5); + this.setHasArmor(false); + } +} diff --git a/src/main/java/twilightforest/entity/monster/LoyalZombie.java b/src/main/java/twilightforest/entity/monster/LoyalZombie.java new file mode 100644 index 0000000000..92a13588b4 --- /dev/null +++ b/src/main/java/twilightforest/entity/monster/LoyalZombie.java @@ -0,0 +1,163 @@ +package twilightforest.entity.monster; + +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.*; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.goal.*; +import net.minecraft.world.entity.ai.goal.target.HurtByTargetGoal; +import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal; +import net.minecraft.world.entity.ai.goal.target.OwnerHurtByTargetGoal; +import net.minecraft.world.entity.ai.goal.target.OwnerHurtTargetGoal; +import net.minecraft.world.entity.animal.Animal; +import net.minecraft.world.entity.animal.Wolf; +import net.minecraft.world.entity.animal.horse.AbstractHorse; +import net.minecraft.world.entity.monster.Creeper; +import net.minecraft.world.entity.monster.Ghast; +import net.minecraft.world.entity.monster.Monster; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.Vec3; +import twilightforest.init.TFDamageTypes; +import twilightforest.init.TFSounds; + +public class LoyalZombie extends TamableAnimal { + + public LoyalZombie(EntityType type, Level world) { + super(type, world); + } + + @Override + protected void registerGoals() { + this.goalSelector.addGoal(1, new FloatGoal(this)); + this.goalSelector.addGoal(4, new MeleeAttackGoal(this, 1.0D, true)); + this.goalSelector.addGoal(5, new FollowOwnerGoal(this, 1.0D, 10.0F, 2.0F, true)); + this.goalSelector.addGoal(7, new WaterAvoidingRandomStrollGoal(this, 1.0D)); + this.goalSelector.addGoal(9, new LookAtPlayerGoal(this, Player.class, 8.0F)); + this.goalSelector.addGoal(9, new RandomLookAroundGoal(this)); + this.targetSelector.addGoal(1, new OwnerHurtByTargetGoal(this)); + this.targetSelector.addGoal(2, new OwnerHurtTargetGoal(this)); + this.targetSelector.addGoal(3, new HurtByTargetGoal(this)); + this.targetSelector.addGoal(4, new NearestAttackableTargetGoal<>(this, Monster.class, true)); + } + + @Override + public Animal getBreedOffspring(ServerLevel level, AgeableMob animal) { + return null; + } + + public static AttributeSupplier.Builder registerAttributes() { + return Mob.createMobAttributes() + .add(Attributes.MAX_HEALTH, 40.0D) + .add(Attributes.MOVEMENT_SPEED, 0.3D) + .add(Attributes.ARMOR, 3.0D); + } + + @Override + public boolean doHurtTarget(Entity entity) { + boolean success = entity.hurt(this.damageSources().mobAttack(this), 7.0F); + + if (success) { + entity.push(0.0D, 0.2D, 0.0D); + } + + return success; + } + + @Override + public void aiStep() { + // once our damage boost effect wears out, start to decay + // the effect here is that we die shortly after our 60 second lifespan + if (!this.getLevel().isClientSide() && this.getEffect(MobEffects.DAMAGE_BOOST) == null) { + if (this.tickCount % 20 == 0) { + this.hurt(TFDamageTypes.getDamageSource(this.getLevel(), TFDamageTypes.EXPIRED), 2); + } + } + + super.aiStep(); + } + + @Override + public InteractionResult interactAt(Player player, Vec3 vec3, InteractionHand hand) { + //feeding a loyal zombie rotten flesh will refresh its death timer, allowing your minions to stick around for longer + if (this.getOwner() != null && this.getOwner().is(player) && player.getItemInHand(hand).is(Items.ROTTEN_FLESH)) { + this.removeEffect(MobEffects.DAMAGE_BOOST); + this.addEffect(new MobEffectInstance(MobEffects.DAMAGE_BOOST, 1200, 1)); + this.heal(1.0F); + this.playSound(SoundEvents.ZOMBIE_INFECT, this.getSoundVolume(), this.getVoicePitch()); + if (!player.getAbilities().instabuild) player.getItemInHand(hand).shrink(1); + return InteractionResult.sidedSuccess(this.getLevel().isClientSide()); + } + + return super.interactAt(player, vec3, hand); + } + + /** + * [VanillaCopy] {@link Wolf#wantsToAttack(LivingEntity, LivingEntity)} ()}, substituting with our class + */ + @Override + public boolean wantsToAttack(LivingEntity target, LivingEntity owner) { + if (!(target instanceof Creeper) && !(target instanceof Ghast)) { + if (target instanceof LoyalZombie zombie) { + return !zombie.isTame() || zombie.getOwner() != owner; + } else if (target instanceof Player pTarget && owner instanceof Player pOwner && !pOwner.canHarmPlayer(pTarget)) { + return false; + } else if (target instanceof AbstractHorse horse && horse.isTamed()) { + return false; + } else { + return !(target instanceof TamableAnimal animal) || !animal.isTame(); + } + } else { + return false; + } + } + + @Override + public boolean removeWhenFarAway(double distanceToClosestPlayer) { + return !this.isTame(); + } + + @Override + public double getMyRidingOffset() { + return -0.35D; + } + + @Override + protected SoundEvent getAmbientSound() { + return TFSounds.LOYAL_ZOMBIE_AMBIENT.get(); + } + + @Override + protected SoundEvent getHurtSound(DamageSource source) { + return TFSounds.LOYAL_ZOMBIE_HURT.get(); + } + + @Override + protected SoundEvent getDeathSound() { + return TFSounds.LOYAL_ZOMBIE_DEATH.get(); + } + + @Override + protected void playStepSound(BlockPos pos, BlockState state) { + playSound(TFSounds.LOYAL_ZOMBIE_STEP.get(), 0.15F, 1.0F); + } + + @Override + public MobType getMobType() { + return MobType.UNDEAD; + } + + @Override + protected void dropExperience() { + } +} diff --git a/src/main/java/twilightforest/entity/monster/MazeSlime.java b/src/main/java/twilightforest/entity/monster/MazeSlime.java new file mode 100644 index 0000000000..519655aac8 --- /dev/null +++ b/src/main/java/twilightforest/entity/monster/MazeSlime.java @@ -0,0 +1,115 @@ +package twilightforest.entity.monster; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.particles.BlockParticleOption; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.util.Mth; +import net.minecraft.util.RandomSource; +import net.minecraft.world.Difficulty; +import net.minecraft.world.DifficultyInstance; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.MobSpawnType; +import net.minecraft.world.entity.SpawnGroupData; +import net.minecraft.world.entity.ai.attributes.AttributeInstance; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.monster.Monster; +import net.minecraft.world.entity.monster.Slime; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.ServerLevelAccessor; +import net.minecraft.world.level.block.state.BlockState; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFSounds; + +import org.jetbrains.annotations.Nullable; + +public class MazeSlime extends Slime { + + private static final AttributeModifier DOUBLE_HEALTH = new AttributeModifier("Maze slime double health", 1, AttributeModifier.Operation.MULTIPLY_BASE); + + public MazeSlime(EntityType type, Level world) { + super(type, world); + } + + @Override + public void setSize(int size, boolean resetHealth) { + super.setSize(size, resetHealth); + this.xpReward += 3; + } + + public static boolean getCanSpawnHere(EntityType entity, ServerLevelAccessor world, MobSpawnType reason, BlockPos pos, RandomSource random) { + return world.getDifficulty() != Difficulty.PEACEFUL && checkMobSpawnRules(entity, world, reason, pos, random) && Monster.isDarkEnoughToSpawn(world, pos, random); + } + + public static AttributeSupplier.Builder registerAttributes() { + return Monster.createMonsterAttributes() + .add(Attributes.MAX_HEALTH); + } + + @Nullable + @Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor worldIn, DifficultyInstance difficultyIn, MobSpawnType reason, @Nullable SpawnGroupData spawnDataIn, @Nullable CompoundTag dataTag) { + AttributeInstance health = this.getAttribute(Attributes.MAX_HEALTH); + assert health != null; + health.addPermanentModifier(DOUBLE_HEALTH); + return super.finalizeSpawn(worldIn, difficultyIn, reason, spawnDataIn, dataTag); + } + + @Override + public double getMyRidingOffset() { + return 0.25D; + } + + @Override + protected SoundEvent getHurtSound(DamageSource source) { + return this.isTiny() ? TFSounds.MAZE_SLIME_HURT_SMALL.get() : TFSounds.MAZE_SLIME_HURT.get(); + } + + @Override + protected SoundEvent getDeathSound() { + return this.isTiny() ? TFSounds.MAZE_SLIME_DEATH_SMALL.get() : TFSounds.MAZE_SLIME_DEATH.get(); + } + + @Override + protected SoundEvent getSquishSound() { + return this.isTiny() ? TFSounds.MAZE_SLIME_SQUISH_SMALL.get() : TFSounds.MAZE_SLIME_SQUISH.get(); + } + + @Override + protected SoundEvent getJumpSound() { + return this.isTiny() ? TFSounds.MAZE_SLIME_SQUISH_SMALL.get() : TFSounds.MAZE_SLIME_SQUISH.get(); + } + + @Override + protected boolean isDealsDamage() { + return true; + } + + @Override + protected boolean spawnCustomParticles() { + // [VanillaCopy] from super tick with own particles + int i = getSize(); + for (int j = 0; j < i * 8; ++j) { + float f = this.getRandom().nextFloat() * ((float) Math.PI * 2F); + float f1 = this.getRandom().nextFloat() * 0.5F + 0.5F; + float f2 = Mth.sin(f) * i * 0.5F * f1; + float f3 = Mth.cos(f) * i * 0.5F * f1; + Level world = this.getLevel(); + double d0 = this.getX() + f2; + double d1 = this.getZ() + f3; + BlockState state = TFBlocks.MAZESTONE_BRICK.get().defaultBlockState(); + world.addParticle(new BlockParticleOption(ParticleTypes.BLOCK, state), d0, this.getBoundingBox().minY, d1, 0.0D, 0.0D, 0.0D); + } + return true; + } + + @Override + protected float getSoundVolume() { + // OH MY GOD, SHUT UP + return 0.1F * this.getSize(); + } +} diff --git a/src/main/java/twilightforest/entity/monster/Minotaur.java b/src/main/java/twilightforest/entity/monster/Minotaur.java new file mode 100644 index 0000000000..43f353092c --- /dev/null +++ b/src/main/java/twilightforest/entity/monster/Minotaur.java @@ -0,0 +1,187 @@ +package twilightforest.entity.monster; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.syncher.EntityDataAccessor; +import net.minecraft.network.syncher.EntityDataSerializers; +import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.util.Mth; +import net.minecraft.util.RandomSource; +import net.minecraft.world.DifficultyInstance; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.*; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.goal.*; +import net.minecraft.world.entity.ai.goal.target.HurtByTargetGoal; +import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal; +import net.minecraft.world.entity.monster.Monster; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.ServerLevelAccessor; +import net.minecraft.world.level.block.state.BlockState; +import twilightforest.entity.ITFCharger; +import twilightforest.entity.ai.goal.ChargeAttackGoal; +import twilightforest.entity.boss.Minoshroom; +import twilightforest.init.TFDamageTypes; +import twilightforest.init.TFItems; +import twilightforest.init.TFSounds; + +import org.jetbrains.annotations.Nullable; + +public class Minotaur extends Monster implements ITFCharger { + + private static final EntityDataAccessor CHARGING = SynchedEntityData.defineId(Minotaur.class, EntityDataSerializers.BOOLEAN); + + public Minotaur(EntityType type, Level world) { + super(type, world); + } + + @Override + protected void registerGoals() { + this.goalSelector.addGoal(0, new FloatGoal(this)); + this.goalSelector.addGoal(2, new ChargeAttackGoal(this, 1.5F, this instanceof Minoshroom)); + this.goalSelector.addGoal(3, new MeleeAttackGoal(this, 1.0D, false) { + //normally, the minoshroom attack reach is 9.5. It can hit you from nearly 2 blocks away! + //lowering this to make the fight a bit more fair and more doable hitless with melee + @Override + protected double getAttackReachSqr(LivingEntity entity) { + return this.mob instanceof Minoshroom ? 5.0D : super.getAttackReachSqr(entity); + } + }); + this.goalSelector.addGoal(6, new WaterAvoidingRandomStrollGoal(this, 1.0D)); + this.goalSelector.addGoal(7, new LookAtPlayerGoal(this, Player.class, 8.0F)); + this.goalSelector.addGoal(7, new RandomLookAroundGoal(this)); + this.targetSelector.addGoal(1, new HurtByTargetGoal(this)); + this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, false)); + } + + public static AttributeSupplier.Builder registerAttributes() { + return Monster.createMonsterAttributes() + .add(Attributes.MAX_HEALTH, 30.0D) + .add(Attributes.MOVEMENT_SPEED, 0.25D); + } + + @Override + protected void defineSynchedData() { + super.defineSynchedData(); + this.entityData.define(CHARGING, false); + } + + @Nullable + @Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor accessor, DifficultyInstance difficulty, MobSpawnType reason, @Nullable SpawnGroupData data, @Nullable CompoundTag tag) { + data = super.finalizeSpawn(accessor, difficulty, reason, data, tag); + this.populateDefaultEquipmentSlots(accessor.getRandom(), difficulty); + this.populateDefaultEquipmentEnchantments(accessor.getRandom(), difficulty); + return data; + } + + @Override + protected void populateDefaultEquipmentSlots(RandomSource source, DifficultyInstance difficulty) { + int random = this.getRandom().nextInt(10); + float additionalDiff = difficulty.getEffectiveDifficulty() + 1; + int result = (int) (random / additionalDiff); + if (result == 0) + this.setItemSlot(EquipmentSlot.MAINHAND, new ItemStack(TFItems.GOLDEN_MINOTAUR_AXE.get())); + else + this.setItemSlot(EquipmentSlot.MAINHAND, new ItemStack(Items.GOLDEN_AXE)); + } + + @Override + public boolean isCharging() { + return this.entityData.get(CHARGING); + } + + @Override + public void setCharging(boolean flag) { + this.entityData.set(CHARGING, flag); + } + + //[VanillaCopy] of Mob.doHurtTarget, edits noted + @Override + public boolean doHurtTarget(Entity entity) { + float f = (float) this.getAttributeValue(Attributes.ATTACK_DAMAGE); + float f1 = (float) this.getAttributeValue(Attributes.ATTACK_KNOCKBACK); + if (entity instanceof LivingEntity living) { + f += EnchantmentHelper.getDamageBonus(this.getMainHandItem(), living.getMobType()); + f1 += (float) EnchantmentHelper.getKnockbackBonus(this); + } + + int i = EnchantmentHelper.getFireAspect(this); + if (i > 0) { + entity.setSecondsOnFire(i * 4); + } + + //TF: change damage source to minotaur one + boolean flag = entity.hurt(TFDamageTypes.getEntityDamageSource(this.getLevel(), TFDamageTypes.AXING, this), f); + if (flag) { + if (f1 > 0.0F && entity instanceof LivingEntity living) { + living.knockback(f1 * 0.5F, Mth.sin(this.getYRot() * Mth.DEG_TO_RAD), -Mth.cos(this.getYRot() * Mth.DEG_TO_RAD)); + this.setDeltaMovement(this.getDeltaMovement().multiply(0.6D, 1.0D, 0.6D)); + } + + //TF: check if we're charging. If we are, throw the player upwards and play a sound + if (this.isCharging()) { + entity.push(this.getDirection().getStepX(), 0.35D, this.getDirection().getStepZ()); + this.playSound(this.getChargeSound(), 1.0F, 1.0F); + } + + if (entity instanceof Player player) { + this.maybeDisableShield(player, this.getMainHandItem(), player.isUsingItem() ? player.getUseItem() : ItemStack.EMPTY); + } + + this.doEnchantDamageEffects(this, entity); + this.setLastHurtMob(entity); + } + + return flag; + } + + protected SoundEvent getChargeSound() { + return TFSounds.MINOTAUR_ATTACK.get(); + } + + @Override + public void aiStep() { + super.aiStep(); + + if (this.isCharging()) { + this.walkAnimation.setSpeed(this.walkAnimation.speed() + 0.6F); + } + } + + @Override + public double getMyRidingOffset() { + return -0.5D; + } + + @Override + protected SoundEvent getAmbientSound() { + return TFSounds.MINOTAUR_AMBIENT.get(); + } + + @Override + protected SoundEvent getHurtSound(DamageSource source) { + return TFSounds.MINOTAUR_HURT.get(); + } + + @Override + protected SoundEvent getDeathSound() { + return TFSounds.MINOTAUR_DEATH.get(); + } + + @Override + protected void playStepSound(BlockPos pos, BlockState state) { + playSound(TFSounds.MINOTAUR_STEP.get(), 0.15F, 0.8F); + } + + @Override + public float getVoicePitch() { + return (this.getRandom().nextFloat() - this.getRandom().nextFloat()) * 0.2F + 0.7F; + } +} diff --git a/src/main/java/twilightforest/entity/monster/MistWolf.java b/src/main/java/twilightforest/entity/monster/MistWolf.java new file mode 100644 index 0000000000..a0ce5427c7 --- /dev/null +++ b/src/main/java/twilightforest/entity/monster/MistWolf.java @@ -0,0 +1,74 @@ +package twilightforest.entity.monster; + +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.level.Level; +import twilightforest.init.TFSounds; + +public class MistWolf extends HostileWolf { + + public MistWolf(EntityType type, Level world) { + super(type, world); + } + + public static AttributeSupplier.Builder registerAttributes() { + return HostileWolf.registerAttributes() + .add(Attributes.MAX_HEALTH, 30.0D) + .add(Attributes.ATTACK_DAMAGE, 6); + } + + @Override + public boolean doHurtTarget(Entity entity) { + if (super.doHurtTarget(entity)) { + float myBrightness = this.getLevel().getMaxLocalRawBrightness(this.blockPosition()); + + if (entity instanceof LivingEntity && myBrightness < 0.10F) { + int effectDuration = switch (this.getLevel().getDifficulty()) { + case EASY -> 0; + case HARD -> 15; + default -> 7; + }; + + if (effectDuration > 0 && !this.getLevel().getBlockState(this.blockPosition()).getMaterial().isSolid()) { + ((LivingEntity) entity).addEffect(new MobEffectInstance(MobEffects.BLINDNESS, effectDuration * 20, 0)); + } + } + + return true; + } else { + return false; + } + } + + @Override + protected SoundEvent getTargetSound() { + return TFSounds.MIST_WOLF_TARGET.get(); + } + + @Override + protected SoundEvent getAmbientSound() { + return TFSounds.MIST_WOLF_AMBIENT.get(); + } + + @Override + protected SoundEvent getHurtSound(DamageSource damageSourceIn) { + return TFSounds.MIST_WOLF_HURT.get(); + } + + @Override + protected SoundEvent getDeathSound() { + return TFSounds.MIST_WOLF_DEATH.get(); + } + + @Override + public float getVoicePitch() { + return (this.getRandom().nextFloat() - this.getRandom().nextFloat()) * 0.2F + 0.6F; + } +} diff --git a/src/main/java/twilightforest/entity/monster/MosquitoSwarm.java b/src/main/java/twilightforest/entity/monster/MosquitoSwarm.java new file mode 100644 index 0000000000..13d72d595d --- /dev/null +++ b/src/main/java/twilightforest/entity/monster/MosquitoSwarm.java @@ -0,0 +1,100 @@ +package twilightforest.entity.monster; + +import net.minecraft.core.BlockPos; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.util.RandomSource; +import net.minecraft.world.Difficulty; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.*; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.goal.FloatGoal; +import net.minecraft.world.entity.ai.goal.MeleeAttackGoal; +import net.minecraft.world.entity.ai.goal.WaterAvoidingRandomStrollGoal; +import net.minecraft.world.entity.ai.goal.target.HurtByTargetGoal; +import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal; +import net.minecraft.world.entity.monster.Monster; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import twilightforest.init.TFSounds; + +public class MosquitoSwarm extends Monster { + + public MosquitoSwarm(EntityType type, Level world) { + super(type, world); + } + + @Override + protected void registerGoals() { + this.goalSelector.addGoal(0, new FloatGoal(this)); + this.goalSelector.addGoal(3, new MeleeAttackGoal(this, 1.0D, false)); + this.goalSelector.addGoal(6, new WaterAvoidingRandomStrollGoal(this, 1.0D)); + this.targetSelector.addGoal(1, new HurtByTargetGoal(this)); + this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true)); + } + + public static AttributeSupplier.Builder registerAttributes() { + return Monster.createMonsterAttributes() + .add(Attributes.MAX_HEALTH, 12.0D) + .add(Attributes.MOVEMENT_SPEED, 0.23D) + .add(Attributes.ATTACK_DAMAGE, 3.0D); + } + + @Override + public float getStepHeight() { + return 2.1F; + } + + @Override + protected SoundEvent getAmbientSound() { + return TFSounds.MOSQUITO.get(); + } + + @Override + protected SoundEvent getHurtSound(DamageSource pDamageSource) { + return null; + } + + @Override + protected SoundEvent getDeathSound() { + return null; + } + + @Override + public boolean doHurtTarget(Entity entity) { + if (super.doHurtTarget(entity)) { + if (entity instanceof LivingEntity living) { + int duration = switch (this.getLevel().getDifficulty()) { + case EASY -> 7; + case HARD -> 30; + default -> 15; + }; + + living.addEffect(new MobEffectInstance(MobEffects.HUNGER, duration * 20, 0)); + } + + return true; + } else { + return false; + } + } + + @Override + public boolean displayFireAnimation() { + return false; + } + + @Override + protected boolean canRide(Entity entityIn) { + return false; + } + + @Override + public int getMaxSpawnClusterSize() { + return 1; + } + +} diff --git a/src/main/java/twilightforest/entity/monster/PinchBeetle.java b/src/main/java/twilightforest/entity/monster/PinchBeetle.java new file mode 100644 index 0000000000..e778c21e21 --- /dev/null +++ b/src/main/java/twilightforest/entity/monster/PinchBeetle.java @@ -0,0 +1,165 @@ +package twilightforest.entity.monster; + +import net.minecraft.core.BlockPos; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.*; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.goal.*; +import net.minecraft.world.entity.ai.goal.target.HurtByTargetGoal; +import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal; +import net.minecraft.world.entity.monster.Monster; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.Vec3; +import twilightforest.data.tags.EntityTagGenerator; +import twilightforest.entity.IHostileMount; +import twilightforest.entity.ai.goal.ChargeAttackGoal; +import twilightforest.init.TFDamageTypes; +import twilightforest.init.TFSounds; + +public class PinchBeetle extends Monster implements IHostileMount { + + public PinchBeetle(EntityType type, Level world) { + super(type, world); + } + + @Override + protected void registerGoals() { + this.goalSelector.addGoal(0, new FloatGoal(this)); + this.goalSelector.addGoal(2, new ChargeAttackGoal(this, 1.5F, false)); + this.goalSelector.addGoal(4, new MeleeAttackGoal(this, 1.0D, false)); + this.goalSelector.addGoal(6, new WaterAvoidingRandomStrollGoal(this, 1.0D)); + this.goalSelector.addGoal(7, new LookAtPlayerGoal(this, Player.class, 8.0F)); + this.goalSelector.addGoal(8, new RandomLookAroundGoal(this)); + this.targetSelector.addGoal(1, new HurtByTargetGoal(this)); + this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true)); + } + + public static AttributeSupplier.Builder registerAttributes() { + return Monster.createMonsterAttributes() + .add(Attributes.MAX_HEALTH, 40.0D) + .add(Attributes.MOVEMENT_SPEED, 0.23D) + .add(Attributes.ATTACK_DAMAGE, 4.0D) + .add(Attributes.ARMOR, 2.0D); + } + + @Override + protected SoundEvent getHurtSound(DamageSource source) { + return TFSounds.PINCH_BEETLE_HURT.get(); + } + + @Override + protected SoundEvent getDeathSound() { + return TFSounds.PINCH_BEETLE_DEATH.get(); + } + + @Override + protected void playStepSound(BlockPos pos, BlockState state) { + playSound(TFSounds.PINCH_BEETLE_STEP.get(), 0.15F, 1.0F); + } + + @Override + public void aiStep() { + + super.aiStep(); + this.dimensions = this.getDimensions(this.getPose()); + + if (!this.getPassengers().isEmpty()) { + this.getLookControl().setLookAt(this.getPassengers().get(0), 100.0F, 100.0F); + //always set our passenger as our target + if (this.getPassengers().get(0) instanceof LivingEntity entity) { + this.setTarget(entity); + } + + //if our held player switches gamemodes let them go + if (this.getPassengers().get(0) instanceof Player player && player.getAbilities().invulnerable) { + player.stopRiding(); + this.setTarget(null); + } + } + } + + @Override + public void knockback(double x, double y, double z) { + //only take knockback if not holding something + if(this.getPassengers().isEmpty()) { + super.knockback(x, y, z); + } + } + + @Override + public boolean doHurtTarget(Entity entity) { + if (this.getPassengers().isEmpty()) { + var v = entity.getVehicle(); + + if (v == null || !v.getType().is(EntityTagGenerator.RIDES_OBSTRUCT_SNATCHING)) { + // Pluck them from the boat, minecart, donkey, or whatever + entity.stopRiding(); + + entity.startRiding(this, true); + } + } + entity.hurt(TFDamageTypes.getEntityDamageSource(this.getLevel(), TFDamageTypes.CLAMPED, this), (float) this.getAttributeValue(Attributes.ATTACK_DAMAGE)); + return super.doHurtTarget(entity); + } + + @Override + public float getEyeHeight(Pose pose) { + return 0.25F; + } + + @Override + public void positionRider(Entity passenger) { + if (!this.getPassengers().isEmpty()) { + Vec3 riderPos = this.getRiderPosition(); + + this.getPassengers().get(0).setPos(riderPos.x(), riderPos.y(), riderPos.z()); + } + } + + @Override + public double getMyRidingOffset() { + return -0.1D; + } + + @Override + public double getPassengersRidingOffset() { + return 0.75D; + } + + private Vec3 getRiderPosition() { + if (!this.getPassengers().isEmpty()) { + float distance = 0.75F; + + double dx = Math.cos((this.getYRot() + 90) * Math.PI / 180.0D) * distance; + double dz = Math.sin((this.getYRot() + 90) * Math.PI / 180.0D) * distance; + + return new Vec3(this.getX() + dx, this.getY() + this.getPassengersRidingOffset() + this.getPassengers().get(0).getMyRidingOffset(), this.getZ() + dz); + } else { + return new Vec3(this.getX(), this.getY(), this.getZ()); + } + } + + @Override + public boolean canRiderInteract() { + return true; + } + + @Override + public EntityDimensions getDimensions(Pose pose) { + + if (!this.getPassengers().isEmpty()) { + return EntityDimensions.scalable(2.25F, 1.25F); + } else { + return super.getDimensions(pose); + } + } + + @Override + public MobType getMobType() { + return MobType.ARTHROPOD; + } +} diff --git a/src/main/java/twilightforest/entity/monster/Redcap.java b/src/main/java/twilightforest/entity/monster/Redcap.java new file mode 100644 index 0000000000..61a072ba07 --- /dev/null +++ b/src/main/java/twilightforest/entity/monster/Redcap.java @@ -0,0 +1,117 @@ +package twilightforest.entity.monster; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.util.RandomSource; +import net.minecraft.world.DifficultyInstance; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.MobSpawnType; +import net.minecraft.world.entity.SpawnGroupData; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.goal.*; +import net.minecraft.world.entity.ai.goal.target.HurtByTargetGoal; +import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal; +import net.minecraft.world.entity.item.PrimedTnt; +import net.minecraft.world.entity.monster.Monster; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.ServerLevelAccessor; +import net.minecraft.world.level.block.Blocks; +import twilightforest.entity.ai.goal.AvoidAnyEntityGoal; +import twilightforest.entity.ai.goal.RedcapLightTNTGoal; +import twilightforest.entity.ai.goal.RedcapShyGoal; +import twilightforest.init.TFSounds; + +import org.jetbrains.annotations.Nullable; + +public class Redcap extends Monster { + + public ItemStack heldPick = new ItemStack(Items.IRON_PICKAXE); + public final ItemStack heldTNT = new ItemStack(Blocks.TNT); + public final ItemStack heldFlint = new ItemStack(Items.FLINT_AND_STEEL); + + public Redcap(EntityType type, Level world) { + super(type, world); + } + + @Override + protected void registerGoals() { + this.goalSelector.addGoal(0, new FloatGoal(this)); + this.goalSelector.addGoal(1, new AvoidAnyEntityGoal<>(this, PrimedTnt.class, 2.0F, 1.0F, 2.0F)); + this.goalSelector.addGoal(2, new RedcapShyGoal(this, 1.0F)); + this.goalSelector.addGoal(3, new RedcapLightTNTGoal(this, 1.0F)); // light TNT + this.goalSelector.addGoal(5, new MeleeAttackGoal(this, 1.0D, false)); + this.goalSelector.addGoal(6, new WaterAvoidingRandomStrollGoal(this, 1.0D)); + this.goalSelector.addGoal(7, new LookAtPlayerGoal(this, Player.class, 8.0F)); + this.goalSelector.addGoal(7, new RandomLookAroundGoal(this)); + this.targetSelector.addGoal(1, new HurtByTargetGoal(this)); + this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true)); + } + + public static AttributeSupplier.Builder registerAttributes() { + return Monster.createMonsterAttributes() + .add(Attributes.MAX_HEALTH, 20.0D) + .add(Attributes.MOVEMENT_SPEED, 0.28D); + } + + @Override + protected SoundEvent getAmbientSound() { + return TFSounds.REDCAP_AMBIENT.get(); + } + + @Override + protected SoundEvent getHurtSound(DamageSource source) { + return TFSounds.REDCAP_HURT.get(); + } + + @Override + protected SoundEvent getDeathSound() { + return TFSounds.REDCAP_DEATH.get(); + } + + public boolean isShy() { + return this.lastHurtByPlayerTime <= 0; + } + + @Nullable + @Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor accessor, DifficultyInstance difficulty, MobSpawnType reason, @Nullable SpawnGroupData spawnDataIn, @Nullable CompoundTag dataTag) { + SpawnGroupData data = super.finalizeSpawn(accessor, difficulty, reason, spawnDataIn, dataTag); + + this.populateDefaultEquipmentSlots(accessor.getRandom(), difficulty); + this.populateDefaultEquipmentEnchantments(accessor.getRandom(), difficulty); + + this.setDropChance(EquipmentSlot.MAINHAND, 0.2F); + this.setDropChance(EquipmentSlot.FEET, 0.2F); + + return data; + } + + @Override + protected void populateDefaultEquipmentSlots(RandomSource source, DifficultyInstance difficulty) { + this.setItemSlot(EquipmentSlot.MAINHAND, this.heldPick); + this.setItemSlot(EquipmentSlot.FEET, new ItemStack(Items.IRON_BOOTS)); + } + + @Override + public void addAdditionalSaveData(CompoundTag compound) { + super.addAdditionalSaveData(compound); + compound.putInt("TNTLeft", this.heldTNT.getCount()); + } + + @Override + public void readAdditionalSaveData(CompoundTag compound) { + super.readAdditionalSaveData(compound); + this.heldTNT.setCount(compound.getInt("TNTLeft")); + } + + @Override + public double getMyRidingOffset() { + return -0.25D; + } +} diff --git a/src/main/java/twilightforest/entity/monster/RedcapSapper.java b/src/main/java/twilightforest/entity/monster/RedcapSapper.java new file mode 100644 index 0000000000..769e0279aa --- /dev/null +++ b/src/main/java/twilightforest/entity/monster/RedcapSapper.java @@ -0,0 +1,39 @@ +package twilightforest.entity.monster; + +import net.minecraft.util.RandomSource; +import net.minecraft.world.DifficultyInstance; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import twilightforest.entity.ai.goal.RedcapPlantTNTGoal; +import twilightforest.init.TFItems; + +public class RedcapSapper extends Redcap { + + public RedcapSapper(EntityType type, Level world) { + super(type, world); + this.heldPick = new ItemStack(TFItems.IRONWOOD_PICKAXE.get()); + this.heldTNT.setCount(3); + } + + @Override + protected void populateDefaultEquipmentSlots(RandomSource random, DifficultyInstance difficulty) { + super.populateDefaultEquipmentSlots(random, difficulty); + this.setItemSlot(EquipmentSlot.FEET, new ItemStack(TFItems.IRONWOOD_BOOTS.get())); + } + + @Override + protected void registerGoals() { + super.registerGoals(); + this.goalSelector.addGoal(4, new RedcapPlantTNTGoal(this)); + } + + public static AttributeSupplier.Builder registerAttributes() { + return Redcap.registerAttributes() + .add(Attributes.MAX_HEALTH, 30.0D) + .add(Attributes.ARMOR, 2.0D); + } +} diff --git a/src/main/java/twilightforest/entity/monster/RisingZombie.java b/src/main/java/twilightforest/entity/monster/RisingZombie.java new file mode 100644 index 0000000000..759baca40c --- /dev/null +++ b/src/main/java/twilightforest/entity/monster/RisingZombie.java @@ -0,0 +1,69 @@ +package twilightforest.entity.monster; + +import net.minecraft.core.particles.BlockParticleOption; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.DifficultyInstance; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.MobSpawnType; +import net.minecraft.world.entity.SpawnGroupData; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.monster.Zombie; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.ServerLevelAccessor; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.phys.Vec3; + +import org.jetbrains.annotations.Nullable; +import java.util.Objects; + +public class RisingZombie extends Zombie { + + public RisingZombie(EntityType type, Level worldIn) { + super(type, worldIn); + } + + @Override + protected void registerGoals() { + // NO-OP + } + + @Nullable + @Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor accessor, DifficultyInstance difficulty, MobSpawnType reason, @Nullable SpawnGroupData data, @Nullable CompoundTag tag) { + // NO-OP + return data; + } + + @Override + public void aiStep() { + this.setDeltaMovement(new Vec3(0, 0, 0)); + super.aiStep(); + if (!this.getLevel().isClientSide() && this.tickCount % 130 == 0) { + this.discard(); + Zombie zombie = new Zombie(this.getLevel()); + zombie.teleportTo(this.getX(), this.getY(), this.getZ()); + Objects.requireNonNull(zombie.getAttribute(Attributes.MAX_HEALTH)).setBaseValue(this.getMaxHealth()); + zombie.setHealth(this.getHealth()); + zombie.setBaby(this.isBaby()); + this.getLevel().addFreshEntity(zombie); + if (this.getRandom().nextBoolean() && this.getLevel().getBlockState(blockPosition().below()).is(Blocks.GRASS_BLOCK)) + this.getLevel().setBlockAndUpdate(blockPosition().below(), Blocks.DIRT.defaultBlockState()); + } + if (this.getLevel().isClientSide() && !this.getLevel().isEmptyBlock(blockPosition().below())) { + for (int i = 0; i < 5; i++) + this.getLevel().addParticle(new BlockParticleOption(ParticleTypes.BLOCK, this.getLevel().getBlockState(blockPosition().below())), getX() + this.getRandom().nextGaussian() * 0.01F, getY() + this.getRandom().nextGaussian() * 0.01F, getZ() + this.getRandom().nextGaussian() * 0.01F, 0, 0, 0); + } + } + + @Override + public void knockback(double strength, double xRatio, double zRatio) { + //NO-OP + } + + @Override + protected boolean canRide(Entity entity) { + return false; + } +} diff --git a/src/main/java/twilightforest/entity/monster/SkeletonDruid.java b/src/main/java/twilightforest/entity/monster/SkeletonDruid.java new file mode 100644 index 0000000000..83bbc9b745 --- /dev/null +++ b/src/main/java/twilightforest/entity/monster/SkeletonDruid.java @@ -0,0 +1,191 @@ +package twilightforest.entity.monster; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.syncher.EntityDataAccessor; +import net.minecraft.network.syncher.EntityDataSerializers; +import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.util.Mth; +import net.minecraft.util.RandomSource; +import net.minecraft.world.Difficulty; +import net.minecraft.world.DifficultyInstance; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.*; +import net.minecraft.world.entity.ai.attributes.AttributeInstance; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.goal.RangedAttackGoal; +import net.minecraft.world.entity.monster.AbstractSkeleton; +import net.minecraft.world.item.HoeItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.LightLayer; +import twilightforest.entity.projectile.NatureBolt; +import twilightforest.init.TFSounds; + +import java.util.UUID; + +public class SkeletonDruid extends AbstractSkeleton { + private RangedAttackGoal rangedAttackGoal; + + public SkeletonDruid(EntityType type, Level world) { + super(type, world); + } + + @Override + protected void registerGoals() { + super.registerGoals(); + + this.rangedAttackGoal = new RangedAttackGoal(this, 1.25D, 60, 5.0F); + + this.goalSelector.addGoal(4, this.rangedAttackGoal); + } + + @Override + protected void defineSynchedData() { + super.defineSynchedData(); + this.getEntityData().define(DATA_BABY_ID, false); + } + + @Override + protected SoundEvent getAmbientSound() { + return TFSounds.SKELETON_DRUID_AMBIENT.get(); + } + + @Override + protected SoundEvent getHurtSound(DamageSource source) { + return TFSounds.SKELETON_DRUID_HURT.get(); + } + + @Override + protected SoundEvent getDeathSound() { + return TFSounds.SKELETON_DRUID_DEATH.get(); + } + + @Override + protected SoundEvent getStepSound() { + return TFSounds.SKELETON_DRUID_STEP.get(); + } + + + @Override + public void reassessWeaponGoal() { + if (!this.getLevel().isClientSide()) { + this.goalSelector.removeGoal(this.rangedAttackGoal); + + if (this.getItemInHand(InteractionHand.MAIN_HAND).getItem() instanceof HoeItem) { + this.goalSelector.addGoal(4, this.rangedAttackGoal); + } else { + super.reassessWeaponGoal(); + } + } else { + super.reassessWeaponGoal(); + } + } + + @Override + protected void populateDefaultEquipmentSlots(RandomSource random, DifficultyInstance difficulty) { + if (this.isBaby()) { + this.setItemSlot(EquipmentSlot.MAINHAND, new ItemStack(Items.STICK)); + } else { + this.setItemSlot(EquipmentSlot.MAINHAND, new ItemStack(Items.GOLDEN_HOE)); + } + } + + @Override + public void performRangedAttack(LivingEntity attackTarget, float extraDamage) { + if (this.getItemInHand(InteractionHand.MAIN_HAND).getItem() instanceof HoeItem) { + NatureBolt natureBolt = new NatureBolt(this.getLevel(), this); + playSound(TFSounds.SKELETON_DRUID_SHOOT.get(), 1.0F, 1.0F / (this.getRandom().nextFloat() * 0.4F + 0.8F)); + + double tx = attackTarget.getX() - this.getX(); + double ty = attackTarget.getY() + attackTarget.getEyeHeight() - 2.7D - this.getY(); + double tz = attackTarget.getZ() - this.getZ(); + float heightOffset = Mth.sqrt((float) (tx * tx + tz * tz)) * 0.2F; + natureBolt.shoot(tx, ty + heightOffset, tz, 0.6F, 6.0F); + this.getLevel().addFreshEntity(natureBolt); + } else if (!this.getItemInHand(InteractionHand.MAIN_HAND).is(Items.STICK)) { + super.performRangedAttack(attackTarget, extraDamage); + } + } + + public static boolean checkDruidSpawnRules(EntityType entity, LevelAccessor world, MobSpawnType reason, BlockPos pos, RandomSource random) { + return world.getDifficulty() != Difficulty.PEACEFUL && isValidLightLevel(world, pos, random) && checkMobSpawnRules(entity, world, reason, pos, random); + } + + // [VanillaCopy] of super. Edits noted. + public static boolean isValidLightLevel(LevelAccessor accessor, BlockPos pos, RandomSource random) { + if (accessor.getBrightness(LightLayer.SKY, pos) > random.nextInt(32)) { + return false; + } else { + return accessor.getMaxLocalRawBrightness(pos) <= random.nextInt(12); // TF - rand(8) -> rand(12) + } + } + + @Override + public void addAdditionalSaveData(CompoundTag compound) { + super.addAdditionalSaveData(compound); + compound.putBoolean("IsBaby", this.isBaby()); + } + + @Override + public void readAdditionalSaveData(CompoundTag compound) { + super.readAdditionalSaveData(compound); + this.setBaby(compound.getBoolean("IsBaby")); + } + + // Below: VANILLACOPY Zombie Baby Code + + private static final UUID SPEED_MODIFIER_BABY_UUID = UUID.fromString("3F508BEA-92F5-47B3-BCA2-B0FA84860574"); + private static final AttributeModifier SPEED_MODIFIER_BABY = new AttributeModifier(SPEED_MODIFIER_BABY_UUID, "Baby speed boost", 0.5D, AttributeModifier.Operation.MULTIPLY_BASE); + private static final EntityDataAccessor DATA_BABY_ID = SynchedEntityData.defineId(SkeletonDruid.class, EntityDataSerializers.BOOLEAN); + + @Override + public boolean isBaby() { + return this.getEntityData().get(DATA_BABY_ID); + } + + @Override + public int getExperienceReward() { + if (this.isBaby()) { + this.xpReward = (int) (this.xpReward * 2.5F); + } + + return super.getExperienceReward(); + } + + @Override + public void setBaby(boolean shouldBaby) { + this.getEntityData().set(DATA_BABY_ID, shouldBaby); + if (!this.getLevel().isClientSide()) { + AttributeInstance attributeinstance = this.getAttribute(Attributes.MOVEMENT_SPEED); + attributeinstance.removeModifier(SPEED_MODIFIER_BABY); + if (shouldBaby) { + attributeinstance.addTransientModifier(SPEED_MODIFIER_BABY); + } + } + } + + @Override + public void onSyncedDataUpdated(EntityDataAccessor dataAccessor) { + if (DATA_BABY_ID.equals(dataAccessor)) { + this.refreshDimensions(); + } + + super.onSyncedDataUpdated(dataAccessor); + } + + @Override + public double getMyRidingOffset() { + return this.isBaby() ? -0.35D : -0.6D; + } + + @Override + protected float getStandingEyeHeight(Pose pose, EntityDimensions size) { + return this.isBaby() ? 0.93F : super.getStandingEyeHeight(pose, size); + } +} diff --git a/src/main/java/twilightforest/entity/monster/SlimeBeetle.java b/src/main/java/twilightforest/entity/monster/SlimeBeetle.java new file mode 100644 index 0000000000..69349e84a4 --- /dev/null +++ b/src/main/java/twilightforest/entity/monster/SlimeBeetle.java @@ -0,0 +1,92 @@ +package twilightforest.entity.monster; + +import net.minecraft.core.BlockPos; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.util.Mth; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.MobType; +import net.minecraft.world.entity.Pose; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.goal.*; +import net.minecraft.world.entity.ai.goal.target.HurtByTargetGoal; +import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal; +import net.minecraft.world.entity.monster.Monster; +import net.minecraft.world.entity.monster.RangedAttackMob; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.entity.projectile.ThrowableProjectile; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import twilightforest.entity.projectile.SlimeProjectile; +import twilightforest.init.TFEntities; +import twilightforest.init.TFSounds; + +public class SlimeBeetle extends Monster implements RangedAttackMob { + + public SlimeBeetle(EntityType type, Level world) { + super(type, world); + } + + @Override + protected void registerGoals() { + this.goalSelector.addGoal(0, new FloatGoal(this)); + this.goalSelector.addGoal(2, new AvoidEntityGoal<>(this, Player.class, 3.0F, 1.25F, 2.0F)); + this.goalSelector.addGoal(3, new RangedAttackGoal(this, 1, 30, 10)); + this.goalSelector.addGoal(6, new WaterAvoidingRandomStrollGoal(this, 1.0D)); + this.goalSelector.addGoal(7, new LookAtPlayerGoal(this, Player.class, 8.0F)); + this.goalSelector.addGoal(8, new RandomLookAroundGoal(this)); + this.targetSelector.addGoal(1, new HurtByTargetGoal(this)); + this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true)); + } + + public static AttributeSupplier.Builder registerAttributes() { + return Monster.createMonsterAttributes() + .add(Attributes.MAX_HEALTH, 25.0D) + .add(Attributes.MOVEMENT_SPEED, 0.23D) + .add(Attributes.ATTACK_DAMAGE, 4); + } + + @Override + protected SoundEvent getHurtSound(DamageSource source) { + return TFSounds.SLIME_BEETLE_HURT.get(); + } + + @Override + protected SoundEvent getDeathSound() { + return TFSounds.SLIME_BEETLE_DEATH.get(); + } + + @Override + protected void playStepSound(BlockPos pos, BlockState state) { + playSound(TFSounds.SLIME_BEETLE_STEP.get(), 0.15F, 1.0F); + } + + @Override + public float getEyeHeight(Pose pose) { + return 0.25F; + } + + @Override + public double getMyRidingOffset() { + return -0.15D; + } + + @Override + public MobType getMobType() { + return MobType.ARTHROPOD; + } + + @Override + public void performRangedAttack(LivingEntity target, float distanceFactor) { + ThrowableProjectile projectile = new SlimeProjectile(TFEntities.SLIME_BLOB.get(), this.getLevel(), this); + playSound(TFSounds.SLIME_BEETLE_SQUISH.get(), 1.0F, 1.0F / (this.getRandom().nextFloat() * 0.4F + 0.8F)); + double tx = target.getX() - this.getX(); + double ty = target.getY() + target.getEyeHeight() - 1.1D - projectile.getY(); + double tz = target.getZ() - this.getZ(); + float heightOffset = Mth.sqrt((float) (tx * tx + tz * tz)) * 0.2F; + projectile.shoot(tx, ty + heightOffset, tz, 0.6F, 6.0F); + this.getLevel().addFreshEntity(projectile); + } +} diff --git a/src/main/java/twilightforest/entity/monster/SnowGuardian.java b/src/main/java/twilightforest/entity/monster/SnowGuardian.java new file mode 100644 index 0000000000..3b5126defc --- /dev/null +++ b/src/main/java/twilightforest/entity/monster/SnowGuardian.java @@ -0,0 +1,143 @@ +package twilightforest.entity.monster; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.util.RandomSource; +import net.minecraft.world.DifficultyInstance; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.MobSpawnType; +import net.minecraft.world.entity.SpawnGroupData; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.goal.*; +import net.minecraft.world.entity.ai.goal.target.HurtByTargetGoal; +import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal; +import net.minecraft.world.entity.monster.Monster; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.ServerLevelAccessor; +import twilightforest.init.TFItems; +import twilightforest.init.TFParticleType; +import twilightforest.init.TFSounds; + +import org.jetbrains.annotations.Nullable; + +public class SnowGuardian extends BaseIceMob { + + public SnowGuardian(EntityType type, Level world) { + super(type, world); + } + + @Override + protected void registerGoals() { + this.goalSelector.addGoal(0, new FloatGoal(this)); + this.goalSelector.addGoal(1, new MeleeAttackGoal(this, 1.0D, false)); + this.goalSelector.addGoal(2, new WaterAvoidingRandomStrollGoal(this, 1.0D)); + this.goalSelector.addGoal(3, new LookAtPlayerGoal(this, Player.class, 8.0F)); + this.goalSelector.addGoal(3, new RandomLookAroundGoal(this)); + this.targetSelector.addGoal(1, new HurtByTargetGoal(this)); + this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true)); + } + + public static AttributeSupplier.Builder registerAttributes() { + return Monster.createMonsterAttributes() + .add(Attributes.MOVEMENT_SPEED, 0.23D) + .add(Attributes.ATTACK_DAMAGE, 3.0D) + .add(Attributes.MAX_HEALTH, 10.0D); + } + + @Override + protected SoundEvent getAmbientSound() { + return TFSounds.SNOW_GUARDIAN_AMBIENT.get(); + } + + @Override + protected SoundEvent getHurtSound(DamageSource source) { + return TFSounds.SNOW_GUARDIAN_HURT.get(); + } + + @Override + protected SoundEvent getDeathSound() { + return TFSounds.SNOW_GUARDIAN_DEATH.get(); + } + + @Override + public float getVoicePitch() { + return (this.getRandom().nextFloat() - this.getRandom().nextFloat()) * 0.2F + 0.8F; + } + + @Override + protected void populateDefaultEquipmentSlots(RandomSource random, DifficultyInstance difficulty) { + int type = random.nextInt(4); + this.setItemSlot(EquipmentSlot.MAINHAND, new ItemStack(this.makeItemForSlot(EquipmentSlot.MAINHAND, type))); + this.setItemSlot(EquipmentSlot.CHEST, new ItemStack(this.makeItemForSlot(EquipmentSlot.CHEST, type))); + this.setItemSlot(EquipmentSlot.HEAD, new ItemStack(this.makeItemForSlot(EquipmentSlot.HEAD, type))); + } + + private Item makeItemForSlot(EquipmentSlot slot, int type) { + return switch (slot) { + default -> switch (type) { + default -> TFItems.IRONWOOD_SWORD.get(); + case 1 -> TFItems.STEELEAF_SWORD.get(); + case 2, 3 -> TFItems.KNIGHTMETAL_SWORD.get(); + }; + case FEET -> switch (type) { + default -> TFItems.IRONWOOD_BOOTS.get(); + case 1 -> TFItems.STEELEAF_BOOTS.get(); + case 2 -> TFItems.KNIGHTMETAL_BOOTS.get(); + case 3 -> TFItems.ARCTIC_BOOTS.get(); + }; + case LEGS -> switch (type) { + default -> TFItems.IRONWOOD_LEGGINGS.get(); + case 1 -> TFItems.STEELEAF_LEGGINGS.get(); + case 2 -> TFItems.KNIGHTMETAL_LEGGINGS.get(); + case 3 -> TFItems.ARCTIC_LEGGINGS.get(); + }; + case CHEST -> switch (type) { + default -> TFItems.IRONWOOD_CHESTPLATE.get(); + case 1 -> TFItems.STEELEAF_CHESTPLATE.get(); + case 2 -> TFItems.KNIGHTMETAL_CHESTPLATE.get(); + case 3 -> TFItems.ARCTIC_CHESTPLATE.get(); + }; + case HEAD -> switch (type) { + default -> TFItems.IRONWOOD_HELMET.get(); + case 1 -> TFItems.STEELEAF_HELMET.get(); + case 2 -> TFItems.KNIGHTMETAL_HELMET.get(); + case 3 -> TFItems.ARCTIC_HELMET.get(); + }; + }; + } + + @Nullable + @Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor accessor, DifficultyInstance difficulty, MobSpawnType reason, @Nullable SpawnGroupData spawnDataIn, @Nullable CompoundTag dataTag) { + SpawnGroupData data = super.finalizeSpawn(accessor, difficulty, reason, spawnDataIn, dataTag); + this.populateDefaultEquipmentSlots(accessor.getRandom(), difficulty); + this.populateDefaultEquipmentEnchantments(accessor.getRandom(), difficulty); + return data; + } + + @Override + public void aiStep() { + super.aiStep(); + + if (this.getLevel().isClientSide()) { + for (int i = 0; i < 3; i++) { + float px = (this.getRandom().nextFloat() - this.getRandom().nextFloat()) * 0.3F; + float py = this.getEyeHeight() + (this.getRandom().nextFloat() - this.getRandom().nextFloat()) * 0.5F; + float pz = (this.getRandom().nextFloat() - this.getRandom().nextFloat()) * 0.3F; + + this.getLevel().addParticle(TFParticleType.SNOW_GUARDIAN.get(), this.xOld + px, this.yOld + py, this.zOld + pz, 0, 0, 0); + } + } + } + + @Override + public int getMaxSpawnClusterSize() { + return 2; + } +} diff --git a/src/main/java/twilightforest/entity/monster/StableIceCore.java b/src/main/java/twilightforest/entity/monster/StableIceCore.java new file mode 100644 index 0000000000..83d8027c0c --- /dev/null +++ b/src/main/java/twilightforest/entity/monster/StableIceCore.java @@ -0,0 +1,86 @@ +package twilightforest.entity.monster; + +import net.minecraft.sounds.SoundEvent; +import net.minecraft.util.Mth; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.Pose; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.goal.*; +import net.minecraft.world.entity.ai.goal.target.HurtByTargetGoal; +import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal; +import net.minecraft.world.entity.monster.Monster; +import net.minecraft.world.entity.monster.RangedAttackMob; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import twilightforest.init.TFSounds; +import twilightforest.entity.projectile.IceSnowball; + +public class StableIceCore extends BaseIceMob implements RangedAttackMob { + + public StableIceCore(EntityType type, Level world) { + super(type, world); + } + + @Override + protected void registerGoals() { + this.goalSelector.addGoal(0, new FloatGoal(this)); + this.goalSelector.addGoal(1, new RangedAttackGoal(this, 1.25D, 20, 10.0F)); + this.goalSelector.addGoal(2, new WaterAvoidingRandomStrollGoal(this, 1.0D)); + this.goalSelector.addGoal(3, new LookAtPlayerGoal(this, Player.class, 8.0F)); + this.goalSelector.addGoal(3, new RandomLookAroundGoal(this)); + this.targetSelector.addGoal(1, new HurtByTargetGoal(this)); + this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true)); + } + + public static AttributeSupplier.Builder registerAttributes() { + return Monster.createMonsterAttributes() + .add(Attributes.MOVEMENT_SPEED, 0.23D) + .add(Attributes.ATTACK_DAMAGE, 3.0D); + } + + @Override + public float getEyeHeight(Pose pose) { + return this.getBbHeight() * 0.6F; + } + + @Override + protected SoundEvent getAmbientSound() { + return TFSounds.ICE_CORE_AMBIENT.get(); + } + + @Override + protected SoundEvent getHurtSound(DamageSource source) { + return TFSounds.ICE_CORE_HURT.get(); + } + + @Override + protected SoundEvent getDeathSound() { + return TFSounds.ICE_CORE_DEATH.get(); + } + + @Override + public int getMaxSpawnClusterSize() { + return 2; + } + + @Override + public void performRangedAttack(LivingEntity target, float distanceFactor) { + IceSnowball snowball = new IceSnowball(this.getLevel(), this); + snowball.setPos(this.getX(), this.getY() + this.getEyeHeight(), this.getZ()); + + // [VanillaCopy] Adapted from SlowGolem + double d0 = target.getY() + target.getEyeHeight() - 1.4D; + double d1 = target.getX() - this.getX(); + double d2 = d0 - snowball.getY(); + double d3 = target.getZ() - this.getZ(); + float f = Mth.sqrt((float) (d1 * d1 + d3 * d3)) * 0.2F; + //accuracy of a normal difficulty skeleton + snowball.shoot(d1, d2 + f, d3, 1.6F, 6.0F); + + this.playSound(TFSounds.ICE_CORE_SHOOT.get(), 1.0F, 1.0F / (this.getRandom().nextFloat() * 0.4F + 0.8F)); + this.getLevel().addFreshEntity(snowball); + } +} diff --git a/src/main/java/twilightforest/entity/monster/SwarmSpider.java b/src/main/java/twilightforest/entity/monster/SwarmSpider.java new file mode 100644 index 0000000000..5026525c9e --- /dev/null +++ b/src/main/java/twilightforest/entity/monster/SwarmSpider.java @@ -0,0 +1,203 @@ +package twilightforest.entity.monster; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.util.Mth; +import net.minecraft.util.RandomSource; +import net.minecraft.world.Difficulty; +import net.minecraft.world.DifficultyInstance; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.*; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.goal.MeleeAttackGoal; +import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal; +import net.minecraft.world.entity.monster.Monster; +import net.minecraft.world.entity.monster.Spider; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.ServerLevelAccessor; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.event.ForgeEventFactory; +import twilightforest.init.TFEntities; +import twilightforest.init.TFLandmark; +import twilightforest.init.TFSounds; + +import org.jetbrains.annotations.Nullable; +import twilightforest.util.LegacyLandmarkPlacements; + +public class SwarmSpider extends Spider { + + protected boolean shouldSpawn = false; + + public SwarmSpider(EntityType type, Level world) { + this(type, world, true); + } + + public SwarmSpider(EntityType type, Level world, boolean spawnMore) { + super(type, world); + + this.setSpawnMore(spawnMore); + this.xpReward = 2; + } + + public static AttributeSupplier.Builder registerAttributes() { + return Spider.createAttributes() + .add(Attributes.MAX_HEALTH, 3.0D) + .add(Attributes.ATTACK_DAMAGE, 1.0D); + } + + @Override + protected void registerGoals() { + super.registerGoals(); + + // Remove default spider melee task + this.goalSelector.availableGoals.removeIf(t -> t.getGoal() instanceof MeleeAttackGoal); + + // Replace with one that doesn't become docile in light + // [VanillaCopy] based on EntitySpider.AISpiderAttack + this.goalSelector.addGoal(4, new MeleeAttackGoal(this, 1, true) { + @Override + protected double getAttackReachSqr(LivingEntity attackTarget) { + return 4.0F + attackTarget.getBbWidth(); + } + }); + + // Remove default spider target player task + this.targetSelector.availableGoals.removeIf(t -> t.getPriority() == 2 && t.getGoal() instanceof NearestAttackableTargetGoal); + // Replace with one that doesn't care about light + this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true)); + } + + @Override + protected SoundEvent getAmbientSound() { + return TFSounds.SWARM_SPIDER_AMBIENT.get(); + } + + @Override + protected SoundEvent getHurtSound(DamageSource damageSourceIn) { + return TFSounds.SWARM_SPIDER_HURT.get(); + } + + @Override + protected SoundEvent getDeathSound() { + return TFSounds.SWARM_SPIDER_DEATH.get(); + } + + @Override + protected void playStepSound(BlockPos pos, BlockState state) { + this.playSound(TFSounds.SWARM_SPIDER_STEP.get(), 0.15F, 1.0F); + } + + @Override + protected float getStandingEyeHeight(Pose pose, EntityDimensions size) { + return 0.3F; + } + + @Override + public double getMyRidingOffset() { + return 0.15D; + } + + @Override + public void tick() { + if (!this.getLevel().isClientSide() && shouldSpawnMore()) { + int more = 1 + this.getRandom().nextInt(2); + for (int i = 0; i < more; i++) { + // try twice to spawn + if (!spawnAnother()) { + spawnAnother(); + } + } + setSpawnMore(false); + } + + super.tick(); + } + + @Override + public boolean doHurtTarget(Entity entity) { + return this.getRandom().nextInt(4) == 0 && super.doHurtTarget(entity); + } + + protected boolean spawnAnother() { + SwarmSpider another = new SwarmSpider(TFEntities.SWARM_SPIDER.get(), this.getLevel(), false); + + double sx = this.getX() + (this.getRandom().nextBoolean() ? 0.9D : -0.9D); + double sy = this.getY(); + double sz = this.getZ() + (this.getRandom().nextBoolean() ? 0.9D : -0.9D); + another.moveTo(sx, sy, sz, this.getRandom().nextFloat() * 360.0F, 0.0F); + if (!another.checkSpawnRules(this.getLevel(), MobSpawnType.MOB_SUMMONED)) { + another.discard(); + return false; + } + this.getLevel().addFreshEntity(another); + another.spawnAnim(); + + return true; + } + + public static boolean getCanSpawnHere(EntityType entity, ServerLevelAccessor accessor, MobSpawnType reason, BlockPos pos, RandomSource random) { + return accessor.getDifficulty() != Difficulty.PEACEFUL && isValidLightLevel(accessor, pos, random) && checkMobSpawnRules(entity, accessor, reason, pos, random); + } + + public static boolean isValidLightLevel(ServerLevelAccessor accessor, BlockPos pos, RandomSource random) { + int chunkX = Mth.floor(pos.getX()) >> 4; + int chunkZ = Mth.floor(pos.getZ()) >> 4; + // We're allowed to spawn in bright light only in hedge mazes. + return LegacyLandmarkPlacements.getNearestLandmark(chunkX, chunkZ, accessor.getLevel()) == TFLandmark.HEDGE_MAZE || Monster.isDarkEnoughToSpawn(accessor, pos, random); + } + + public boolean shouldSpawnMore() { + return shouldSpawn; + } + + public void setSpawnMore(boolean flag) { + this.shouldSpawn = flag; + } + + @Override + public void addAdditionalSaveData(CompoundTag compound) { + super.addAdditionalSaveData(compound); + compound.putBoolean("SpawnMore", this.shouldSpawnMore()); + } + + @Override + public void readAdditionalSaveData(CompoundTag compound) { + super.readAdditionalSaveData(compound); + this.setSpawnMore(compound.getBoolean("SpawnMore")); + } + + @Override + public float getVoicePitch() { + return (this.getRandom().nextFloat() - this.getRandom().nextFloat()) * 0.2F + 1.5F; + } + + @Override + public int getMaxSpawnClusterSize() { + return 6; + } + + @Nullable + @Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor accessor, DifficultyInstance difficulty, MobSpawnType reason, @Nullable SpawnGroupData livingData, @Nullable CompoundTag dataTag) { + livingData = super.finalizeSpawn(accessor, difficulty, reason, livingData, dataTag); + + if (this.getFirstPassenger() != null || accessor.getRandom().nextInt(20) <= difficulty.getDifficulty().getId()) { + SkeletonDruid druid = TFEntities.SKELETON_DRUID.get().create(this.getLevel()); + druid.moveTo(this.getX(), this.getY(), this.getZ(), this.getYRot(), 0.0F); + druid.setBaby(true); + ForgeEventFactory.onFinalizeSpawn(druid, accessor, difficulty, MobSpawnType.JOCKEY, null, null); + + if (this.hasPassenger(e -> true)) { + this.ejectPassengers(); + } + + druid.startRiding(this); + } + + return livingData; + } +} diff --git a/src/main/java/twilightforest/entity/monster/TowerBroodling.java b/src/main/java/twilightforest/entity/monster/TowerBroodling.java new file mode 100644 index 0000000000..b52f3c21e7 --- /dev/null +++ b/src/main/java/twilightforest/entity/monster/TowerBroodling.java @@ -0,0 +1,82 @@ +package twilightforest.entity.monster; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.DifficultyInstance; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.MobSpawnType; +import net.minecraft.world.entity.SpawnGroupData; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.ServerLevelAccessor; +import net.minecraft.world.level.block.state.BlockState; +import twilightforest.init.TFEntities; +import twilightforest.init.TFSounds; + +import org.jetbrains.annotations.Nullable; + +public class TowerBroodling extends SwarmSpider { + + public TowerBroodling(EntityType type, Level world) { + this(type, world, true); + } + + public TowerBroodling(EntityType type, Level world, boolean spawnMore) { + super(type, world, spawnMore); + this.xpReward = 3; + } + + public static AttributeSupplier.Builder registerAttributes() { + return SwarmSpider.registerAttributes() + .add(Attributes.MAX_HEALTH, 7.0D) + .add(Attributes.ATTACK_DAMAGE, 4.0D); + } + + @Override + protected SoundEvent getAmbientSound() { + return TFSounds.CARMINITE_BROODLING_AMBIENT.get(); + } + + @Override + protected SoundEvent getHurtSound(DamageSource source) { + return TFSounds.CARMINITE_BROODLING_HURT.get(); + } + + @Override + protected SoundEvent getDeathSound() { + return TFSounds.CARMINITE_BROODLING_DEATH.get(); + } + + @Override + protected void playStepSound(BlockPos pos, BlockState state) { + this.playSound(TFSounds.CARMINITE_BROODLING_STEP.get(), 0.15F, 1.0F); + } + + @Override + protected boolean spawnAnother() { + SwarmSpider another = new TowerBroodling(TFEntities.CARMINITE_BROODLING.get(), this.getLevel(), false); + + double sx = getX() + (this.getRandom().nextBoolean() ? 0.9D : -0.9D); + double sy = getY(); + double sz = getZ() + (this.getRandom().nextBoolean() ? 0.9D : -0.9D); + another.moveTo(sx, sy, sz, this.getRandom().nextFloat() * 360.0F, 0.0F); + if (!another.checkSpawnRules(this.getLevel(), MobSpawnType.MOB_SUMMONED)) { + another.discard(); + return false; + } + this.getLevel().addFreshEntity(another); + another.spawnAnim(); + + return true; + } + + //no skeleton druid jockeys for us + @Nullable + @Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor accessor, DifficultyInstance difficulty, MobSpawnType reason, @Nullable SpawnGroupData data, @Nullable CompoundTag tag) { + return data; + } +} diff --git a/src/main/java/twilightforest/entity/monster/TowerwoodBorer.java b/src/main/java/twilightforest/entity/monster/TowerwoodBorer.java new file mode 100644 index 0000000000..d53f4a7508 --- /dev/null +++ b/src/main/java/twilightforest/entity/monster/TowerwoodBorer.java @@ -0,0 +1,231 @@ +package twilightforest.entity.monster; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.tags.DamageTypeTags; +import net.minecraft.util.RandomSource; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.MobType; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.goal.*; +import net.minecraft.world.entity.ai.goal.target.HurtByTargetGoal; +import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal; +import net.minecraft.world.entity.monster.Monster; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.gameevent.GameEvent; +import net.minecraftforge.event.ForgeEventFactory; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFSounds; + +import java.util.EnumSet; + +public class TowerwoodBorer extends Monster { + + private SummonBorersGoal summonBorers; + + public TowerwoodBorer(EntityType type, Level world) { + super(type, world); + } + + @Override + protected void registerGoals() { + this.goalSelector.addGoal(1, new FloatGoal(this)); + this.goalSelector.addGoal(1, new ClimbOnTopOfPowderSnowGoal(this, this.level)); + this.goalSelector.addGoal(3, this.summonBorers = new SummonBorersGoal(this)); + this.goalSelector.addGoal(4, new MeleeAttackGoal(this, 1.0D, false)); + this.goalSelector.addGoal(5, new HideInTowerwoodGoal(this)); + this.targetSelector.addGoal(1, (new HurtByTargetGoal(this)).setAlertOthers()); + this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true)); + } + + public static AttributeSupplier.Builder registerAttributes() { + return Monster.createMonsterAttributes() + .add(Attributes.MAX_HEALTH, 15.0D) + .add(Attributes.MOVEMENT_SPEED, 0.27D) + .add(Attributes.ATTACK_DAMAGE, 5.0D) + .add(Attributes.FOLLOW_RANGE, 8.0D); + } + + @Override + protected Entity.MovementEmission getMovementEmission() { + return Entity.MovementEmission.EVENTS; + } + + @Override + public boolean isSteppingCarefully() { + return false; + } + + @Override + protected SoundEvent getAmbientSound() { + return TFSounds.TOWERWOOD_BORER_AMBIENT.get(); + } + + @Override + protected SoundEvent getHurtSound(DamageSource source) { + return TFSounds.TOWERWOOD_BORER_HURT.get(); + } + + @Override + protected SoundEvent getDeathSound() { + return TFSounds.TOWERWOOD_BORER_DEATH.get(); + } + + // [VanillaCopy] Silverfish.hurt + @Override + public boolean hurt(DamageSource source, float amount) { + if (this.isInvulnerableTo(source)) { + return false; + } else { + if ((source.getEntity() != null || source.is(DamageTypeTags.ALWAYS_TRIGGERS_SILVERFISH)) && this.summonBorers != null) { + this.summonBorers.notifyHurt(); + } + + return super.hurt(source, amount); + } + } + + @Override + protected void playStepSound(BlockPos pos, BlockState block) { + this.playSound(TFSounds.TOWERWOOD_BORER_STEP.get(), 0.15F, 1.0F); + } + + @Override + public void tick() { + this.yBodyRot = this.getYRot(); + super.tick(); + } + + @Override + public MobType getMobType() { + return MobType.ARTHROPOD; + } + + // [VanillaCopy] Silverfish.SilverfishMergeWithStoneGoal. Changes noted + private static class HideInTowerwoodGoal extends RandomStrollGoal { + + private Direction facing; + private boolean doMerge; + + public HideInTowerwoodGoal(TowerwoodBorer borer) { + super(borer, 1.0D, 10); + this.setFlags(EnumSet.of(Flag.MOVE)); + } + + @Override + public boolean canUse() { + if (this.mob.getTarget() != null) { + return false; + } else if (!this.mob.getNavigation().isDone()) { + return false; + } else { + RandomSource random = this.mob.getRandom(); + + if (random.nextInt(10) == 0 && ForgeEventFactory.getMobGriefingEvent(this.mob.getLevel(), this.mob)) { + this.facing = Direction.getRandom(random); + BlockPos blockpos = BlockPos.containing(this.mob.getX(), this.mob.getY() + 0.5D, this.mob.getZ()).relative(this.facing); + BlockState state = this.mob.getLevel().getBlockState(blockpos); + + // TF - Change block check + if (state.is(TFBlocks.TOWERWOOD.get())) { + this.doMerge = true; + return true; + } + } + + this.doMerge = false; + return super.canUse(); + } + } + + @Override + public boolean canContinueToUse() { + return !this.doMerge && super.canContinueToUse(); + } + + @Override + public void start() { + if (!this.doMerge) { + super.start(); + } else { + Level level = this.mob.getLevel(); + BlockPos blockpos = BlockPos.containing(this.mob.getX(), this.mob.getY() + 0.5D, this.mob.getZ()).relative(this.facing); + BlockState state = level.getBlockState(blockpos); + + // TF - Change block check + // TF - add a random chance to dig. This should prevent them from instantly digging away + if (state.is(TFBlocks.TOWERWOOD.get()) && this.mob.getRandom().nextInt(5) == 0) { + // TF - Change block type + level.setBlock(blockpos, TFBlocks.INFESTED_TOWERWOOD.get().defaultBlockState(), 3); + this.mob.spawnAnim(); + this.mob.discard(); + } + } + } + } + + // [VanillaCopy] of Silverfish.SilverfishWakeUpFriendsGoal. Changes noted + private static class SummonBorersGoal extends Goal { + + private final TowerwoodBorer borer; // TF - type change + private int lookForFriends; + + public SummonBorersGoal(TowerwoodBorer borer) { + this.borer = borer; + } + + public void notifyHurt() { + if (this.lookForFriends == 0) { + this.lookForFriends = 20; + } + } + + @Override + public boolean canUse() { + return this.lookForFriends > 0; + } + + @Override + public void tick() { + --this.lookForFriends; + + if (this.lookForFriends <= 0) { + + Level world = this.borer.getLevel(); + RandomSource random = this.borer.getRandom(); + BlockPos pos = new BlockPos(this.borer.blockPosition()); + + for (int i = 0; i <= 5 && i >= -5; i = (i <= 0 ? 1 : 0) - i) { + for (int j = 0; j <= 10 && j >= -10; j = (j <= 0 ? 1 : 0) - j) { + for (int k = 0; k <= 10 && k >= -10; k = (k <= 0 ? 1 : 0) - k) { + + BlockPos offsetPos = pos.offset(j, i, k); + BlockState state = world.getBlockState(offsetPos); + + // TF - Change block check + if (state.is(TFBlocks.INFESTED_TOWERWOOD.get())) { + if (ForgeEventFactory.getMobGriefingEvent(world, this.borer)) { + world.destroyBlock(offsetPos, true); + this.borer.gameEvent(GameEvent.BLOCK_DESTROY); + } else { + // TF - reset to normal tower wood + world.setBlock(offsetPos, TFBlocks.TOWERWOOD.get().defaultBlockState(), 3); + } + + if (random.nextBoolean()) { + return; + } + } + } + } + } + } + } + } +} diff --git a/src/main/java/twilightforest/entity/monster/Troll.java b/src/main/java/twilightforest/entity/monster/Troll.java new file mode 100644 index 0000000000..b4d6a349ff --- /dev/null +++ b/src/main/java/twilightforest/entity/monster/Troll.java @@ -0,0 +1,239 @@ +package twilightforest.entity.monster; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.registries.Registries; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtUtils; +import net.minecraft.network.syncher.EntityDataAccessor; +import net.minecraft.network.syncher.EntityDataSerializers; +import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.tags.BlockTags; +import net.minecraft.util.Mth; +import net.minecraft.util.RandomSource; +import net.minecraft.world.Difficulty; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.MobSpawnType; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.goal.*; +import net.minecraft.world.entity.ai.goal.target.HurtByTargetGoal; +import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal; +import net.minecraft.world.entity.monster.Monster; +import net.minecraft.world.entity.monster.RangedAttackMob; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.ClipContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.gameevent.GameEvent; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.Vec3; +import twilightforest.entity.projectile.ThrownBlock; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFEntities; +import twilightforest.init.TFSounds; +import twilightforest.util.WorldUtil; + +import org.jetbrains.annotations.Nullable; +import java.util.Objects; + +public class Troll extends Monster implements RangedAttackMob { + + private static final EntityDataAccessor ROCK_FLAG = SynchedEntityData.defineId(Troll.class, EntityDataSerializers.BOOLEAN); + private static final AttributeModifier ROCK_MODIFIER = new AttributeModifier("Rock follow boost", 24, AttributeModifier.Operation.ADDITION); + + private RangedAttackGoal aiArrowAttack; + private MeleeAttackGoal aiAttackOnCollide; + private int rockCooldown; + @Nullable + private BlockState rock; + + public Troll(EntityType type, Level world) { + super(type, world); + this.rockCooldown = 300; + } + + @Override + public void registerGoals() { + this.aiArrowAttack = new RangedAttackGoal(this, 1.0D, 20, 60, 15.0F); + this.aiAttackOnCollide = new MeleeAttackGoal(this, 1.2D, false); + + this.goalSelector.addGoal(1, new FloatGoal(this)); + this.goalSelector.addGoal(2, new RestrictSunGoal(this)); + this.goalSelector.addGoal(3, new FleeSunGoal(this, 1.0D)); + this.goalSelector.addGoal(5, new WaterAvoidingRandomStrollGoal(this, 1.0D)); + this.goalSelector.addGoal(6, new LookAtPlayerGoal(this, Player.class, 8.0F)); + this.goalSelector.addGoal(6, new RandomLookAroundGoal(this)); + this.targetSelector.addGoal(1, new HurtByTargetGoal(this, Troll.class)); + this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true)); + + if (!this.getLevel().isClientSide()) { + this.setCombatTask(); + } + } + + public static AttributeSupplier.Builder registerAttributes() { + return Monster.createMonsterAttributes() + .add(Attributes.MAX_HEALTH, 30.0D) + .add(Attributes.MOVEMENT_SPEED, 0.28D) + .add(Attributes.ATTACK_DAMAGE, 7.0D); + } + + @Override + public void tick() { + super.tick(); + if (!this.getLevel().isClientSide()) { + + if (!this.hasRock() && this.getTarget() != null) { + if (this.rockCooldown > 0) { + this.rockCooldown--; + } else { + //copied from EnderMan.EndermanTakeBlockGoal.tick() + RandomSource random = this.getRandom(); + Level level = this.level; + int i = Mth.floor(this.getX() - 2.0D + random.nextDouble() * 4.0D); + int j = Mth.floor(this.getY() + random.nextDouble() * 3.0D); + int k = Mth.floor(this.getZ() - 2.0D + random.nextDouble() * 4.0D); + BlockPos blockpos = new BlockPos(i, j, k); + BlockState blockstate = level.getBlockState(blockpos); + Vec3 vec3 = new Vec3((double) this.getBlockX() + 0.5D, (double) j + 0.5D, (double) this.getBlockZ() + 0.5D); + Vec3 vec31 = new Vec3((double) i + 0.5D, (double) j + 0.5D, (double) k + 0.5D); + BlockHitResult blockhitresult = level.clip(new ClipContext(vec3, vec31, ClipContext.Block.OUTLINE, ClipContext.Fluid.NONE, this)); + boolean flag = blockhitresult.getBlockPos().equals(blockpos); + if (blockstate.is(BlockTags.BASE_STONE_OVERWORLD) && flag) { + this.rock = level.getBlockState(blockpos); + level.removeBlock(blockpos, false); + level.gameEvent(this, GameEvent.BLOCK_DESTROY, blockpos); + } + + if (this.rock != null) { + this.setHasRock(true); + ThrownBlock block = new ThrownBlock(level, this, this.rock); + block.startRiding(this); + level.addFreshEntity(block); + } + } + } + } + } + + @Override + public double getPassengersRidingOffset() { + return super.getPassengersRidingOffset() + 1.75D; + } + + @Override + public void positionRider(Entity entity) { + super.positionRider(entity); + entity.setXRot(this.getXRot()); + } + + @Override + protected void defineSynchedData() { + super.defineSynchedData(); + this.entityData.define(ROCK_FLAG, false); + } + + public boolean hasRock() { + return this.entityData.get(ROCK_FLAG); + } + + public void setHasRock(boolean rock) { + this.entityData.set(ROCK_FLAG, rock); + + if (!this.getLevel().isClientSide()) { + if (rock) { + if (!Objects.requireNonNull(getAttribute(Attributes.FOLLOW_RANGE)).hasModifier(ROCK_MODIFIER)) { + Objects.requireNonNull(this.getAttribute(Attributes.FOLLOW_RANGE)).addTransientModifier(ROCK_MODIFIER); + } + } else { + Objects.requireNonNull(this.getAttribute(Attributes.FOLLOW_RANGE)).removeModifier(ROCK_MODIFIER); + } + this.setCombatTask(); + } + } + + @Override + public boolean doHurtTarget(Entity entity) { + return super.doHurtTarget(entity); + } + + @Override + public void addAdditionalSaveData(CompoundTag compound) { + super.addAdditionalSaveData(compound); + compound.putBoolean("HasRock", this.hasRock()); + compound.putInt("RockCooldown", this.rockCooldown); + if (this.rock != null) { + compound.put("RockState", NbtUtils.writeBlockState(this.rock)); + } + } + + @Override + public void readAdditionalSaveData(CompoundTag compound) { + super.readAdditionalSaveData(compound); + this.setHasRock(compound.getBoolean("HasRock")); + this.rockCooldown = compound.getInt("RockCooldown"); + this.rock = NbtUtils.readBlockState(this.getLevel().holderLookup(Registries.BLOCK), compound.getCompound("RockState")); + } + + private void setCombatTask() { + this.goalSelector.removeGoal(this.aiAttackOnCollide); + this.goalSelector.removeGoal(this.aiArrowAttack); + + if (this.hasRock()) { + this.goalSelector.addGoal(4, this.aiArrowAttack); + } else { + this.goalSelector.addGoal(4, this.aiAttackOnCollide); + } + } + + @Override + protected void tickDeath() { + super.tickDeath(); + + if (this.deathTime % 5 == 0) { + this.ripenTrollBerNearby(this.deathTime / 5); + } + } + + private void ripenTrollBerNearby(int offset) { + int range = 12; + for (BlockPos pos : WorldUtil.getAllAround(new BlockPos(this.blockPosition()), range)) { + ripenBer(offset, pos); + } + } + + private void ripenBer(int offset, BlockPos pos) { + if (this.getLevel().getBlockState(pos).getBlock() == TFBlocks.UNRIPE_TROLLBER.get() && this.getRandom().nextBoolean() && (Math.abs(pos.getX() + pos.getY() + pos.getZ()) % 5 == offset)) { + this.getLevel().setBlockAndUpdate(pos, TFBlocks.TROLLBER.get().defaultBlockState()); + this.getLevel().levelEvent(2004, pos, 0); + } + } + + @Override + public void performRangedAttack(LivingEntity target, float distanceFactor) { + if (this.hasRock()) { + ThrownBlock blocc = new ThrownBlock(this.getLevel(), this, this.rock); + + double d0 = target.getX() - this.getX(); + double d1 = target.getBoundingBox().minY + target.getBbHeight() / 3.0F - blocc.getY(); + double d2 = target.getZ() - this.getZ(); + double d3 = Mth.sqrt((float) (d0 * d0 + d2 * d2)); + blocc.shoot(d0, d1 + d3 * 0.2D, d2, 1.6F, 4 - this.getLevel().getDifficulty().getId()); + + this.playSound(TFSounds.TROLL_THROWS_ROCK.get(), 1.0F, 1.0F / (this.getRandom().nextFloat() * 0.4F + 0.8F)); + this.gameEvent(GameEvent.PROJECTILE_SHOOT); + this.getLevel().addFreshEntity(blocc); + this.setHasRock(false); + if (!this.getPassengers().isEmpty() && Objects.requireNonNull(this.getFirstPassenger()).getType() == TFEntities.THROWN_BLOCK.get()) { + this.getFirstPassenger().discard(); + } + this.rockCooldown = 300; + this.rock = null; + } + } +} diff --git a/src/main/java/twilightforest/entity/monster/UnstableIceCore.java b/src/main/java/twilightforest/entity/monster/UnstableIceCore.java new file mode 100644 index 0000000000..d1b553766b --- /dev/null +++ b/src/main/java/twilightforest/entity/monster/UnstableIceCore.java @@ -0,0 +1,172 @@ +package twilightforest.entity.monster; + +import net.minecraft.core.BlockPos; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.Pose; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.goal.*; +import net.minecraft.world.entity.ai.goal.target.HurtByTargetGoal; +import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal; +import net.minecraft.world.entity.monster.Monster; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.DyeColor; +import net.minecraft.world.level.Explosion; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Material; +import net.minecraftforge.event.ForgeEventFactory; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFSounds; +import twilightforest.util.ColorUtil; + +public class UnstableIceCore extends BaseIceMob { + + private static final float EXPLOSION_RADIUS = 1; + + public UnstableIceCore(EntityType type, Level world) { + super(type, world); + } + + @Override + protected void registerGoals() { + this.goalSelector.addGoal(0, new FloatGoal(this)); + this.goalSelector.addGoal(1, new MeleeAttackGoal(this, 1.0D, false)); + this.goalSelector.addGoal(2, new WaterAvoidingRandomStrollGoal(this, 1.0D)); + this.goalSelector.addGoal(3, new LookAtPlayerGoal(this, Player.class, 8.0F)); + this.goalSelector.addGoal(3, new RandomLookAroundGoal(this)); + this.targetSelector.addGoal(1, new HurtByTargetGoal(this)); + this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true)); + } + + public static AttributeSupplier.Builder registerAttributes() { + return Monster.createMonsterAttributes() + .add(Attributes.MOVEMENT_SPEED, 0.23D) + .add(Attributes.ATTACK_DAMAGE, 3.0D); + } + + @Override + protected SoundEvent getAmbientSound() { + return TFSounds.ICE_CORE_AMBIENT.get(); + } + + @Override + protected SoundEvent getHurtSound(DamageSource source) { + return TFSounds.ICE_CORE_HURT.get(); + } + + @Override + protected SoundEvent getDeathSound() { + return TFSounds.ICE_CORE_DEATH.get(); + } + + @Override + public float getEyeHeight(Pose pose) { + return this.getBbHeight() * 0.6F; + } + + @Override + protected void tickDeath() { + ++this.deathTime; + + if (this.deathTime == 60) { // delay until 3 seconds + if (!this.getLevel().isClientSide()) { + boolean mobGriefing = ForgeEventFactory.getMobGriefingEvent(this.getLevel(), this); + this.getLevel().explode(this, this.getX(), this.getY(), this.getZ(), UnstableIceCore.EXPLOSION_RADIUS, Level.ExplosionInteraction.MOB); + + if (mobGriefing) { + this.transformBlocks(); + } + } + // Fake to trigger super's behaviour + this.deathTime = 19; + super.tickDeath(); + this.deathTime = 60; + } + } + + private void transformBlocks() { + int range = 4; + + BlockPos pos = new BlockPos(this.blockPosition()); + + for (int dx = -range; dx <= range; dx++) { + for (int dy = -range; dy <= range; dy++) { + for (int dz = -range; dz <= range; dz++) { + double distance = Math.sqrt(dx * dx + dy * dy + dz * dz); + + float randRange = range + (this.getRandom().nextFloat() - this.getRandom().nextFloat()) * 2.0F; + + if (distance < randRange) { + this.transformBlock(pos.offset(dx, dy, dz)); + } + } + } + } + } + + private void transformBlock(BlockPos pos) { + BlockState state = this.getLevel().getBlockState(pos); + Block block = state.getBlock(); + + if (block.getExplosionResistance() < 8F && state.getDestroySpeed(this.getLevel(), pos) >= 0) { + // todo improve for blocks where state is known? or perhaps if a propertycolor is present + int blockColor = state.getMapColor(this.getLevel(), pos).col; + + // do appropriate transformation + if (this.shouldTransformGlass(state, pos)) { + this.getLevel().setBlockAndUpdate(pos, ColorUtil.STAINED_GLASS.getColor(getClosestDyeColor(blockColor))); + } else if (this.shouldTransformClay(state, pos)) { + this.getLevel().setBlockAndUpdate(pos, ColorUtil.TERRACOTTA.getColor(getClosestDyeColor(blockColor))); + } + } + } + + private boolean shouldTransformClay(BlockState state, BlockPos pos) { + return state.isRedstoneConductor(this.getLevel(), pos); + } + + private boolean shouldTransformGlass(BlockState state, BlockPos pos) { + return state.getBlock() != Blocks.AIR && isBlockNormalBounds(state, pos) && (!state.getMaterial().isSolidBlocking() || state.getMaterial() == Material.LEAVES || state.is(Blocks.ICE) || state.is(TFBlocks.AURORA_BLOCK.get())); + } + + private boolean isBlockNormalBounds(BlockState state, BlockPos pos) { + return Block.isShapeFullBlock(state.getShape(this.getLevel(), pos)); + } + + private static DyeColor getClosestDyeColor(int blockColor) { + int red = (blockColor >> 16) & 255; + int green = (blockColor >> 8) & 255; + int blue = blockColor & 255; + + + DyeColor bestColor = DyeColor.WHITE; + int bestDifference = 1024; + + for (DyeColor color : DyeColor.values()) { + float[] iColor = color.getTextureDiffuseColors(); + + int iRed = (int) (iColor[0] * 255F); + int iGreen = (int) (iColor[1] * 255F); + int iBlue = (int) (iColor[2] * 255F); + + int difference = Math.abs(red - iRed) + Math.abs(green - iGreen) + Math.abs(blue - iBlue); + + if (difference < bestDifference) { + bestColor = color; + bestDifference = difference; + } + } + + return bestColor; + } + + @Override + public int getMaxSpawnClusterSize() { + return 2; + } +} diff --git a/src/main/java/twilightforest/entity/monster/UpperGoblinKnight.java b/src/main/java/twilightforest/entity/monster/UpperGoblinKnight.java new file mode 100644 index 0000000000..330efdf9e7 --- /dev/null +++ b/src/main/java/twilightforest/entity/monster/UpperGoblinKnight.java @@ -0,0 +1,364 @@ +package twilightforest.entity.monster; + +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.syncher.EntityDataAccessor; +import net.minecraft.network.syncher.EntityDataSerializers; +import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.util.Mth; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.damagesource.DamageTypes; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.goal.*; +import net.minecraft.world.entity.ai.goal.target.HurtByTargetGoal; +import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal; +import net.minecraft.world.entity.monster.Monster; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.AxeItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.gameevent.GameEvent; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import twilightforest.entity.ai.goal.HeavySpearAttackGoal; +import twilightforest.init.TFSounds; + +import java.util.List; +import java.util.Objects; + +public class UpperGoblinKnight extends Monster { + + private static final int SHIELD_DAMAGE_THRESHOLD = 10; + private static final EntityDataAccessor DATA_EQUIP = SynchedEntityData.defineId(UpperGoblinKnight.class, EntityDataSerializers.BYTE); + private static final EntityDataAccessor SHIELD_DISABLED = SynchedEntityData.defineId(UpperGoblinKnight.class, EntityDataSerializers.BOOLEAN); + + private static final AttributeModifier ARMOR_MODIFIER = new AttributeModifier("Armor boost", 20, AttributeModifier.Operation.ADDITION); + private static final AttributeModifier DAMAGE_MODIFIER = new AttributeModifier("Heavy spear attack boost", 12, AttributeModifier.Operation.ADDITION); + public static final int HEAVY_SPEAR_TIMER_START = 60; + + private int shieldHits = 0; + private int shieldDisabledTicks; + public int heavySpearTimer; + + public UpperGoblinKnight(EntityType type, Level level) { + super(type, level); + + this.setHasArmor(true); + this.setHasShield(true); + } + + @Override + protected void registerGoals() { + this.goalSelector.addGoal(0, new HeavySpearAttackGoal(this)); + this.goalSelector.addGoal(1, new FloatGoal(this)); + this.goalSelector.addGoal(3, new MeleeAttackGoal(this, 1.0D, false) { + @Override + public boolean canUse() { + return !this.mob.isPassenger() && !(((UpperGoblinKnight) this.mob).heavySpearTimer > 0) && super.canUse(); + } + }); + this.goalSelector.addGoal(6, new WaterAvoidingRandomStrollGoal(this, 1.0D)); + this.goalSelector.addGoal(7, new LookAtPlayerGoal(this, Player.class, 8.0F)); + this.goalSelector.addGoal(7, new RandomLookAroundGoal(this)); + this.targetSelector.addGoal(1, new HurtByTargetGoal(this)); + this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, false)); + } + + public static AttributeSupplier.Builder registerAttributes() { + return Monster.createMonsterAttributes() + .add(Attributes.MAX_HEALTH, 30.0D) + .add(Attributes.MOVEMENT_SPEED, 0.28D) + .add(Attributes.ATTACK_DAMAGE, 8.0D); + } + + @Override + protected void defineSynchedData() { + super.defineSynchedData(); + this.getEntityData().define(DATA_EQUIP, (byte) 0); + this.getEntityData().define(SHIELD_DISABLED, false); + } + + public boolean hasArmor() { + return (this.getEntityData().get(DATA_EQUIP) & 1) > 0; + } + + private void setHasArmor(boolean flag) { + byte otherFlags = this.getEntityData().get(DATA_EQUIP); + this.getEntityData().set(DATA_EQUIP, flag ? (byte) (otherFlags | 1) : (byte) (otherFlags & ~1)); + + if (!this.getLevel().isClientSide()) { + if (flag) { + if (!Objects.requireNonNull(getAttribute(Attributes.ARMOR)).hasModifier(ARMOR_MODIFIER)) { + Objects.requireNonNull(getAttribute(Attributes.ARMOR)).addTransientModifier(ARMOR_MODIFIER); + } + } else { + Objects.requireNonNull(getAttribute(Attributes.ARMOR)).removeModifier(ARMOR_MODIFIER); + } + } + } + + public boolean hasShield() { + return (this.getEntityData().get(DATA_EQUIP) & 2) != 0; + } + + public void setHasShield(boolean flag) { + byte otherFlags = this.getEntityData().get(DATA_EQUIP); + this.getEntityData().set(DATA_EQUIP, flag ? (byte) (otherFlags | 2) : (byte) (otherFlags & ~2)); + } + + @Override + public void addAdditionalSaveData(CompoundTag compound) { + super.addAdditionalSaveData(compound); + compound.putBoolean("hasArmor", this.hasArmor()); + compound.putBoolean("hasShield", this.hasShield()); + } + + @Override + public void readAdditionalSaveData(CompoundTag compound) { + super.readAdditionalSaveData(compound); + this.setHasArmor(compound.getBoolean("hasArmor")); + this.setHasShield(compound.getBoolean("hasShield")); + } + + @Override + public void aiStep() { + super.aiStep(); + // Must be decremented on client as well for rendering + if ((this.getLevel().isClientSide() || !this.isNoAi()) && this.heavySpearTimer > 0) { + --this.heavySpearTimer; + } + + if (this.isShieldDisabled()) { + this.getLevel().addParticle(ParticleTypes.SPLASH, + this.getX() + (this.getRandom().nextDouble() - 0.5D) * this.getBbWidth() * 0.25D, + this.getY() + this.getEyeHeight(), + this.getZ() + (this.getRandom().nextDouble() - 0.5D) * this.getBbWidth() * 0.25D, + (this.getRandom().nextFloat() - 0.5F) * 0.75F, + 0, + (this.getRandom().nextFloat() - 0.5F) * 0.75F); + } + } + + @Override + protected SoundEvent getAmbientSound() { + return TFSounds.GOBLIN_KNIGHT_AMBIENT.get(); + } + + @Override + protected SoundEvent getDeathSound() { + return TFSounds.GOBLIN_KNIGHT_DEATH.get(); + } + + @Override + protected SoundEvent getHurtSound(DamageSource source) { + return TFSounds.GOBLIN_KNIGHT_HURT.get(); + } + + @Override + public void customServerAiStep() { + super.customServerAiStep(); + + if (this.isShieldDisabled() && this.shieldDisabledTicks++ >= 100) { + this.shieldDisabledTicks = 0; + this.getEntityData().set(SHIELD_DISABLED, false); + } + + if (this.isAlive()) { + // synch target with lower goblin + if (this.getVehicle() instanceof Mob mob && this.getTarget() == null) { + this.setTarget(mob.getTarget()); + } + + if (!this.isPassenger() && this.hasShield()) { + this.breakShield(); + } + + if (this.heavySpearTimer > 0) { + if (!Objects.requireNonNull(this.getAttribute(Attributes.ATTACK_DAMAGE)).hasModifier(DAMAGE_MODIFIER)) { + Objects.requireNonNull(this.getAttribute(Attributes.ATTACK_DAMAGE)).addTransientModifier(DAMAGE_MODIFIER); + } + } else { + Objects.requireNonNull(this.getAttribute(Attributes.ATTACK_DAMAGE)).removeModifier(DAMAGE_MODIFIER.getId()); + } + } + } + + public void landHeavySpearAttack() { + // find vector in front of us + Vec3 vector = this.getLookAngle(); + + double dist = 1.25; + double px = this.getX() + vector.x() * dist; + double py = this.getBoundingBox().minY - (this.isPassenger() ? 0.75D : 0.0D); + double pz = this.getZ() + vector.z() * dist; + + + if (this.getLevel() instanceof ServerLevel server) { + for (int i = 0; i < 50; i++) { + server.sendParticles( + ParticleTypes.LARGE_SMOKE, px, py, pz, 1, + (this.getRandom().nextFloat() - this.getRandom().nextFloat()) * 0.25F, + 0, + (this.getRandom().nextFloat() - this.getRandom().nextFloat()) * 0.25F, 0); + } + } + + // damage things in front that aren't us or our "mount" + double radius = 1.5D; + + AABB spearBB = new AABB(px - radius, py - radius, pz - radius, px + radius, py + radius, pz + radius); + + List inBox = this.getLevel().getEntities(this, spearBB, e -> e != this.getVehicle()); + + for (Entity entity : inBox) { + super.doHurtTarget(entity); + } + + if (!inBox.isEmpty()) { + this.playSound(SoundEvents.PLAYER_ATTACK_CRIT, getSoundVolume(), getVoicePitch()); + } + + this.gameEvent(GameEvent.HIT_GROUND); + } + + @OnlyIn(Dist.CLIENT) + @Override + public void handleEntityEvent(byte id) { + if (id == 4) { + this.heavySpearTimer = HEAVY_SPEAR_TIMER_START; + } else if (id == 5) { + ItemStack broken = new ItemStack(Items.IRON_CHESTPLATE); + this.breakItem(broken); + this.breakItem(broken); + this.breakItem(broken); + } else { + super.handleEntityEvent(id); + } + } + + @Override + public boolean doHurtTarget(Entity entity) { + + if (this.heavySpearTimer > 0) { + return false; + } + + if (this.getRandom().nextInt(2) == 0) { + this.heavySpearTimer = HEAVY_SPEAR_TIMER_START; + this.getLevel().broadcastEntityEvent(this, (byte) 4); + return false; + } + + this.swing(InteractionHand.MAIN_HAND); + return super.doHurtTarget(entity); + } + + @Override + public boolean hurt(DamageSource damageSource, float amount) { + // don't take suffocation damage while riding + if (damageSource.is(DamageTypes.IN_WALL) && this.getVehicle() != null) { + return false; + } + + Entity attacker = damageSource.getEntity(); + + if (attacker != null) { + double dx = this.getX() - attacker.getX(); + double dz = this.getZ() - attacker.getZ(); + float angle = (float) ((Math.atan2(dz, dx) * 180D) / Math.PI) - 90F; + + float difference = Mth.abs((this.yBodyRot - angle) % 360); + + if (this.hasShield() && difference > 150 && difference < 230) { + if (this.takeHitOnShield(damageSource, amount)) { + return false; + } + } else { + if (this.hasShield() && this.getRandom().nextBoolean()) { + this.damageShield(); + } + } + + if (this.hasArmor() && (difference > 300 || difference < 60)) { + this.breakArmor(); + } + } + + return super.hurt(damageSource, amount); + } + + private void breakArmor() { + this.getLevel().broadcastEntityEvent(this, (byte) 5); + this.setHasArmor(false); + } + + private void breakShield() { + this.getLevel().broadcastEntityEvent(this, (byte) 5); + this.setHasShield(false); + } + + public boolean isShieldDisabled() { + return this.getEntityData().get(SHIELD_DISABLED); + } + + public boolean takeHitOnShield(DamageSource source, float amount) { + if (this.isShieldDisabled()) return false; + + if (source.getEntity() instanceof LivingEntity living && living.getMainHandItem().getItem() instanceof AxeItem && !this.getLevel().isClientSide()) { + this.getEntityData().set(SHIELD_DISABLED, true); + this.playSound(SoundEvents.SHIELD_BREAK, 1.0F, 0.8F + this.getLevel().getRandom().nextFloat() * 0.4F); + return true; + } + + if (amount > SHIELD_DAMAGE_THRESHOLD && !this.getLevel().isClientSide()) { + this.damageShield(); + } else { + this.playSound(SoundEvents.SHIELD_BLOCK, 1.0F, 0.8F + this.getLevel().getRandom().nextFloat() * 0.4F); + } + + // knock back slightly + LivingEntity toKnockback = (this.getVehicle() instanceof LivingEntity) ? (LivingEntity) this.getVehicle() : this; + + if (source.getEntity() != null) { + double d0 = source.getEntity().getX() - this.getX(); + double d1; + + for (d1 = source.getEntity().getZ() - this.getZ(); d0 * d0 + d1 * d1 < 1.0E-4D; d1 = (Math.random() - Math.random()) * 0.01D) { + d0 = (Math.random() - Math.random()) * 0.01D; + } + + toKnockback.knockback(0, d0 / 4D, d1 / 4D); + + // also set revenge target + if (source.getEntity() instanceof LivingEntity living) { + this.setLastHurtByMob(living); + } + } + + return true; + } + + + private void damageShield() { + this.playSound(SoundEvents.ZOMBIE_ATTACK_IRON_DOOR, 0.25F, 0.25F); + + this.shieldHits++; + + if (!this.getLevel().isClientSide() && this.shieldHits >= 3) { + this.breakShield(); + } + } +} diff --git a/src/main/java/twilightforest/entity/monster/WinterWolf.java b/src/main/java/twilightforest/entity/monster/WinterWolf.java new file mode 100644 index 0000000000..3ee3ce5f7d --- /dev/null +++ b/src/main/java/twilightforest/entity/monster/WinterWolf.java @@ -0,0 +1,158 @@ +package twilightforest.entity.monster; + +import net.minecraft.core.BlockPos; +import net.minecraft.network.syncher.EntityDataAccessor; +import net.minecraft.network.syncher.EntityDataSerializers; +import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.resources.ResourceKey; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.util.RandomSource; +import net.minecraft.world.Difficulty; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.MobSpawnType; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.goal.FloatGoal; +import net.minecraft.world.entity.ai.goal.MeleeAttackGoal; +import net.minecraft.world.entity.ai.goal.WaterAvoidingRandomStrollGoal; +import net.minecraft.world.entity.ai.goal.target.HurtByTargetGoal; +import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal; +import net.minecraft.world.entity.monster.Monster; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.ServerLevelAccessor; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.phys.Vec3; +import twilightforest.entity.IBreathAttacker; +import twilightforest.entity.ai.goal.BreathAttackGoal; +import twilightforest.init.TFBiomes; +import twilightforest.init.TFParticleType; +import twilightforest.init.TFSounds; + +import java.util.Objects; +import java.util.Optional; + +public class WinterWolf extends HostileWolf implements IBreathAttacker { + + private static final EntityDataAccessor BREATH_FLAG = SynchedEntityData.defineId(WinterWolf.class, EntityDataSerializers.BOOLEAN); + private static final float BREATH_DAMAGE = 2.0F; + + public WinterWolf(EntityType type, Level world) { + super(type, world); + } + + @Override + protected void registerGoals() { + this.goalSelector.addGoal(0, new FloatGoal(this)); + this.goalSelector.addGoal(2, new BreathAttackGoal<>(this, 5F, 30, 0.1F)); + this.goalSelector.addGoal(3, new MeleeAttackGoal(this, 1.0F, false)); + this.goalSelector.addGoal(6, new WaterAvoidingRandomStrollGoal(this, 1.0D)); + + this.targetSelector.addGoal(1, new HurtByTargetGoal(this)); + this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true)); + } + + public static AttributeSupplier.Builder registerAttributes() { + return HostileWolf.registerAttributes() + .add(Attributes.MAX_HEALTH, 30.0D) + .add(Attributes.ATTACK_DAMAGE, 6); + } + + @Override + protected void defineSynchedData() { + super.defineSynchedData(); + this.entityData.define(BREATH_FLAG, false); + } + + @Override + public void aiStep() { + super.aiStep(); + + if (this.isBreathing()) { + if (this.getLevel().isClientSide()) { + this.spawnBreathParticles(); + } + this.playBreathSound(); + } + } + + private void spawnBreathParticles() { + + Vec3 look = this.getLookAngle(); + + final double dist = 0.5; + double px = this.getX() + look.x() * dist; + double py = this.getY() + 1.25 + look.y() * dist; + double pz = this.getZ() + look.z() * dist; + + for (int i = 0; i < 10; i++) { + double dx = look.x(); + double dy = look.y(); + double dz = look.z(); + + double spread = 5.0 + this.getRandom().nextDouble() * 2.5; + double velocity = 3.0 + this.getRandom().nextDouble() * 0.15; + + // spread flame + dx += this.getRandom().nextGaussian() * 0.0075D * spread; + dy += this.getRandom().nextGaussian() * 0.0075D * spread; + dz += this.getRandom().nextGaussian() * 0.0075D * spread; + dx *= velocity; + dy *= velocity; + dz *= velocity; + + this.getLevel().addParticle(TFParticleType.SNOW.get(), px, py, pz, dx, dy, dz); + } + } + + @Override + protected SoundEvent getTargetSound() { + return TFSounds.WINTER_WOLF_TARGET.get(); + } + + @Override + protected SoundEvent getAmbientSound() { + return TFSounds.WINTER_WOLF_AMBIENT.get(); + } + + @Override + protected SoundEvent getHurtSound(DamageSource damageSourceIn) { + return TFSounds.WINTER_WOLF_HURT.get(); + } + + private void playBreathSound() { + playSound(TFSounds.WINTER_WOLF_SHOOT.get(), this.getRandom().nextFloat() * 0.5F, this.getRandom().nextFloat() * 0.5F); + } + + @Override + protected SoundEvent getDeathSound() { + return TFSounds.WINTER_WOLF_DEATH.get(); + } + + @Override + public float getVoicePitch() { + return (this.getRandom().nextFloat() - this.getRandom().nextFloat()) * 0.2F + 0.6F; + } + + @Override + public boolean isBreathing() { + return this.entityData.get(BREATH_FLAG); + } + + @Override + public void setBreathing(boolean flag) { + this.entityData.set(BREATH_FLAG, flag); + } + + @Override + public void doBreathAttack(Entity target) { + target.hurt(this.damageSources().mobAttack(this), BREATH_DAMAGE); + } + + public static boolean canSpawnHere(EntityType entity, ServerLevelAccessor accessor, MobSpawnType reason, BlockPos pos, RandomSource random) { + Optional> key = accessor.getBiome(pos).unwrapKey(); + return accessor.getDifficulty() != Difficulty.PEACEFUL && Objects.equals(key, Optional.of(TFBiomes.SNOWY_FOREST)) || Monster.isDarkEnoughToSpawn(accessor, pos, random); + } +} diff --git a/src/main/java/twilightforest/entity/monster/Wraith.java b/src/main/java/twilightforest/entity/monster/Wraith.java new file mode 100644 index 0000000000..586367d0c9 --- /dev/null +++ b/src/main/java/twilightforest/entity/monster/Wraith.java @@ -0,0 +1,276 @@ +package twilightforest.entity.monster; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.util.Mth; +import net.minecraft.util.RandomSource; +import net.minecraft.world.Difficulty; +import net.minecraft.world.DifficultyInstance; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.*; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.control.MoveControl; +import net.minecraft.world.entity.ai.goal.Goal; +import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal; +import net.minecraft.world.entity.monster.Enemy; +import net.minecraft.world.entity.monster.Monster; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.ServerLevelAccessor; +import org.jetbrains.annotations.Nullable; +import twilightforest.entity.EnforcedHomePoint; +import twilightforest.entity.ai.control.NoClipMoveControl; +import twilightforest.entity.ai.goal.SimplifiedAttackGoal; +import twilightforest.init.TFDamageTypes; +import twilightforest.init.TFSounds; + +import java.util.EnumSet; + +public class Wraith extends FlyingMob implements Enemy, EnforcedHomePoint { + + public Wraith(EntityType type, Level level) { + super(type, level); + this.moveControl = new NoClipMoveControl(this); + this.noPhysics = true; + } + + @Override + protected void registerGoals() { + this.goalSelector.addGoal(2, new MoveTowardsHomeGoal(this, 0.85D)); + this.goalSelector.addGoal(4, new SimplifiedAttackGoal(this)); + this.goalSelector.addGoal(5, new FlyTowardsTargetGoal(this)); + this.goalSelector.addGoal(6, new RandomFloatAroundGoal(this)); + this.goalSelector.addGoal(7, new LookAroundGoal(this)); + this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, Player.class, false)); + } + + public static AttributeSupplier.Builder registerAttributes() { + return Mob.createMobAttributes() + .add(Attributes.MAX_HEALTH, 20.0D) + .add(Attributes.MOVEMENT_SPEED, 0.5D) + .add(Attributes.ATTACK_DAMAGE, 5.0D); + } + + @Override + public boolean isSteppingCarefully() { + return true; + } + + @Override + protected boolean shouldDespawnInPeaceful() { + return true; + } + + @Override + public boolean hurt(DamageSource source, float amount) { + if (super.hurt(source, amount)) { + Entity entity = source.getEntity(); + if (this.getVehicle() == entity || this.getPassengers().contains(entity)) { + return true; + } + if (entity != this && entity instanceof LivingEntity && !source.isCreativePlayer()) { + this.setTarget((LivingEntity) entity); + } + return true; + } else { + return false; + } + } + + @Override + public boolean doHurtTarget(Entity entity) { + entity.hurt(TFDamageTypes.getEntityDamageSource(this.getLevel(), TFDamageTypes.HAUNT, this), (float) this.getAttributeValue(Attributes.ATTACK_DAMAGE)); + return super.doHurtTarget(entity); + } + + @Override + protected boolean canRide(Entity entity) { + return false; + } + + @Override + protected SoundEvent getAmbientSound() { + return TFSounds.WRAITH_AMBIENT.get(); + } + + @Override + protected SoundEvent getHurtSound(DamageSource source) { + return TFSounds.WRAITH_HURT.get(); + } + + @Override + protected SoundEvent getDeathSound() { + return TFSounds.WRAITH_DEATH.get(); + } + + public static boolean checkMonsterSpawnRules(EntityType entity, ServerLevelAccessor world, MobSpawnType reason, BlockPos pos, RandomSource random) { + return world.getDifficulty() != Difficulty.PEACEFUL && Monster.isDarkEnoughToSpawn(world, pos, random) && checkMobSpawnRules(entity, world, reason, pos, random); + } + + @Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor accessor, DifficultyInstance difficulty, MobSpawnType type, @Nullable SpawnGroupData data, @Nullable CompoundTag tag) { + if (type == MobSpawnType.STRUCTURE || type == MobSpawnType.SPAWNER) this.restrictTo(this.blockPosition(), 20); + return super.finalizeSpawn(accessor, difficulty, type, data, tag); + } + + @Override + public void addAdditionalSaveData(CompoundTag tag) { + super.addAdditionalSaveData(tag); + this.saveHomePointToNbt(tag); + } + + @Override + public void readAdditionalSaveData(CompoundTag tag) { + super.readAdditionalSaveData(tag); + this.loadHomePointFromNbt(tag, 20); + } + + @Override + public BlockPos getRestrictionCenter() { + return this.getRestrictCenter(); + } + + @Override + public void setRestriction(BlockPos pos, int dist) { + this.restrictTo(pos, dist); + } + + static class FlyTowardsTargetGoal extends Goal { + private final Wraith wraith; + + FlyTowardsTargetGoal(Wraith wraith) { + this.wraith = wraith; + this.setFlags(EnumSet.of(Flag.MOVE)); + } + + @Override + public boolean canUse() { + return wraith.getTarget() != null; + } + + @Override + public boolean canContinueToUse() { + return false; + } + + @Override + public void start() { + LivingEntity target = wraith.getTarget(); + if (target != null) + wraith.getMoveControl().setWantedPosition(target.getX(), target.getY(), target.getZ(), 0.5F); + } + } + + // [VanillaCopy] Ghast.RandomFloatAroundGoal + static class RandomFloatAroundGoal extends Goal { + private final Wraith wraith; + + public RandomFloatAroundGoal(Wraith wraith) { + this.wraith = wraith; + this.setFlags(EnumSet.of(Flag.MOVE)); + } + + @Override + public boolean canUse() { + if (this.wraith.getTarget() != null || !this.wraith.isWithinRestriction()) + return false; + MoveControl control = this.wraith.getMoveControl(); + double d0 = control.getWantedX() - this.wraith.getX(); + double d1 = control.getWantedY() - this.wraith.getY(); + double d2 = control.getWantedZ() - this.wraith.getZ(); + double d3 = d0 * d0 + d1 * d1 + d2 * d2; + return d3 < 1.0D || d3 > 3600.0D; + } + + @Override + public boolean canContinueToUse() { + return false; + } + + @Override + public void start() { + RandomSource random = this.wraith.getRandom(); + double d0 = this.wraith.getX() + (random.nextFloat() * 2.0F - 1.0F) * 16.0F; + double d1 = this.wraith.getY() + (random.nextFloat() * 2.0F - 1.0F) * 16.0F; + double d2 = this.wraith.getZ() + (random.nextFloat() * 2.0F - 1.0F) * 16.0F; + this.wraith.getMoveControl().setWantedPosition(d0, d1, d2, 0.5D); + } + } + + // [VanillaCopy] Ghast.GhastLookGoal + public static class LookAroundGoal extends Goal { + private final Wraith wraith; + + public LookAroundGoal(Wraith wraith) { + this.wraith = wraith; + this.setFlags(EnumSet.of(Flag.LOOK)); + } + + @Override + public boolean canUse() { + return true; + } + + @Override + public void tick() { + if (this.wraith.getTarget() == null) { + this.wraith.setYRot(-((float) Mth.atan2(this.wraith.getDeltaMovement().x(), this.wraith.getDeltaMovement().z())) * (180F / (float) Math.PI)); + this.wraith.setYBodyRot(this.wraith.getYRot()); + } else { + LivingEntity entitylivingbase = this.wraith.getTarget(); + + if (entitylivingbase.distanceToSqr(this.wraith) < 4096.0D) { + double d1 = entitylivingbase.getX() - this.wraith.getX(); + double d2 = entitylivingbase.getZ() - this.wraith.getZ(); + this.wraith.setYRot(-((float) Mth.atan2(d1, d2)) * (180F / (float) Math.PI)); + this.wraith.setYBodyRot(this.wraith.getYRot()); + } + } + } + } + + //modified version of MoveTowardsRestrictionGoal. We're limited with what we can use since Wraiths arent PathfinderMobs + public static class MoveTowardsHomeGoal extends Goal { + private final FlyingMob mob; + private double wantedX; + private double wantedY; + private double wantedZ; + private final double speedModifier; + + public MoveTowardsHomeGoal(FlyingMob mob, double speedModifier) { + this.mob = mob; + this.speedModifier = speedModifier; + this.setFlags(EnumSet.of(Goal.Flag.MOVE)); + } + + public boolean canUse() { + if (this.mob.isWithinRestriction() || this.mob.getTarget() != null) { + return false; + } else { + BlockPos pos = this.mob.getRestrictCenter() + .relative(Direction.getRandom(this.mob.getRandom())) + .offset(this.mob.getRandom().nextInt(5), this.mob.getRandom().nextInt(5), this.mob.getRandom().nextInt(5)); + if (pos == null || !this.mob.getLevel().isLoaded(pos)) { + return false; + } else { + this.wantedX = pos.getX(); + this.wantedY = pos.getY(); + this.wantedZ = pos.getZ(); + return true; + } + } + } + + public boolean canContinueToUse() { + return false; + } + + public void start() { + this.mob.getMoveControl().setWantedPosition(this.wantedX, this.wantedY, this.wantedZ, this.speedModifier); + } + } +} diff --git a/src/main/java/twilightforest/entity/monster/Yeti.java b/src/main/java/twilightforest/entity/monster/Yeti.java new file mode 100644 index 0000000000..8460e2b7dc --- /dev/null +++ b/src/main/java/twilightforest/entity/monster/Yeti.java @@ -0,0 +1,228 @@ +package twilightforest.entity.monster; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.syncher.EntityDataAccessor; +import net.minecraft.network.syncher.EntityDataSerializers; +import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.resources.ResourceKey; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.util.RandomSource; +import net.minecraft.world.Difficulty; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.MobSpawnType; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.goal.FloatGoal; +import net.minecraft.world.entity.ai.goal.LookAtPlayerGoal; +import net.minecraft.world.entity.ai.goal.RandomLookAroundGoal; +import net.minecraft.world.entity.ai.goal.WaterAvoidingRandomStrollGoal; +import net.minecraft.world.entity.ai.goal.target.HurtByTargetGoal; +import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal; +import net.minecraft.world.entity.monster.Monster; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LightLayer; +import net.minecraft.world.level.ServerLevelAccessor; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.phys.Vec3; +import twilightforest.entity.IHostileMount; +import twilightforest.entity.ai.goal.ThrowRiderGoal; +import twilightforest.init.TFBiomes; +import twilightforest.init.TFSounds; + +import org.jetbrains.annotations.Nullable; +import java.util.Objects; +import java.util.Optional; + +public class Yeti extends Monster implements IHostileMount { + + private static final EntityDataAccessor ANGER_FLAG = SynchedEntityData.defineId(Yeti.class, EntityDataSerializers.BOOLEAN); + private static final AttributeModifier ANGRY_MODIFIER = new AttributeModifier("Angry follow range boost", 24, AttributeModifier.Operation.ADDITION); + + public Yeti(EntityType type, Level world) { + super(type, world); + } + + @Override + protected void registerGoals() { + this.goalSelector.addGoal(0, new FloatGoal(this)); + this.goalSelector.addGoal(1, new ThrowRiderGoal(this, 1.0D, false) { + @Override + protected void checkAndPerformAttack(LivingEntity victim, double p_190102_2_) { + super.checkAndPerformAttack(victim, p_190102_2_); + if (!getPassengers().isEmpty()) + playSound(TFSounds.YETI_GRAB.get(), 1F, 1.25F + getRandom().nextFloat() * 0.5F); + } + + @Override + public void stop() { + if (!getPassengers().isEmpty()) + playSound(TFSounds.YETI_THROW.get(), 1F, 1.25F + getRandom().nextFloat() * 0.5F); + super.stop(); + } + }); + this.goalSelector.addGoal(2, new WaterAvoidingRandomStrollGoal(this, 1.0D)); + this.goalSelector.addGoal(3, new LookAtPlayerGoal(this, Player.class, 8.0F)); + this.goalSelector.addGoal(3, new RandomLookAroundGoal(this)); + this.targetSelector.addGoal(1, new HurtByTargetGoal(this)); + this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true)); + } + + public static AttributeSupplier.Builder registerAttributes() { + return Monster.createMonsterAttributes() + .add(Attributes.MAX_HEALTH, 20.0D) + .add(Attributes.MOVEMENT_SPEED, 0.38D) + .add(Attributes.ATTACK_DAMAGE, 0.0D) + .add(Attributes.FOLLOW_RANGE, 4.0D); + } + + @Override + protected void defineSynchedData() { + super.defineSynchedData(); + this.entityData.define(ANGER_FLAG, false); + } + + @Override + public void aiStep() { + + super.aiStep(); + + // if we no longer have a target, lets calm down + if (this.getTarget() == null && this.isAngry()) { + this.setAngry(false); + } + + // look at things in our jaws + if (!this.getPassengers().isEmpty()) { + this.getLookControl().setLookAt(this.getPassengers().get(0), 100F, 100F); + } + } + + @Override + public boolean hurt(DamageSource source, float amount) { + if (source.getEntity() != null && !source.isCreativePlayer()) { + // become angry + this.setAngry(true); + } + + return super.hurt(source, amount); + } + + public boolean isAngry() { + return this.entityData.get(ANGER_FLAG); + } + + public void setAngry(boolean anger) { + this.entityData.set(ANGER_FLAG, anger); + + if (!this.getLevel().isClientSide()) { + if (anger) { + if (!Objects.requireNonNull(getAttribute(Attributes.FOLLOW_RANGE)).hasModifier(ANGRY_MODIFIER)) { + Objects.requireNonNull(this.getAttribute(Attributes.FOLLOW_RANGE)).addTransientModifier(ANGRY_MODIFIER); + } + } else { + Objects.requireNonNull(this.getAttribute(Attributes.FOLLOW_RANGE)).removeModifier(ANGRY_MODIFIER); + } + } + } + + @Override + public void addAdditionalSaveData(CompoundTag compound) { + super.addAdditionalSaveData(compound); + compound.putBoolean("Angry", this.isAngry()); + } + + @Override + public void readAdditionalSaveData(CompoundTag compound) { + super.readAdditionalSaveData(compound); + this.setAngry(compound.getBoolean("Angry")); + } + + /** + * Put the player out in front of where we are + */ + @Override + public void positionRider(Entity passenger) { + Vec3 riderPos = this.getRiderPosition(passenger); + passenger.setPos(riderPos.x(), riderPos.y(), riderPos.z()); + } + + /** + * Returns the Y offset from the entity's position for any entity riding this one. + */ + @Override + public double getPassengersRidingOffset() { + return 2.25D; + } + + /** + * Used to both get a rider position and to push out of blocks + */ + private Vec3 getRiderPosition(@Nullable Entity passenger) { + if (passenger != null) { + float distance = 0.4F; + + double dx = Math.cos((this.getYRot() + 90) * Math.PI / 180.0D) * distance; + double dz = Math.sin((this.getYRot() + 90) * Math.PI / 180.0D) * distance; + + return new Vec3(this.getX() + dx, this.getY() + this.getPassengersRidingOffset() + passenger.getMyRidingOffset(), this.getZ() + dz); + } else { + return new Vec3(this.getX(), this.getY(), this.getZ()); + } + } + + @Override + public boolean canRiderInteract() { + return true; + } + + public static boolean yetiSnowyForestSpawnHandler(EntityType entityType, ServerLevelAccessor accessor, MobSpawnType reason, BlockPos pos, RandomSource random) { + Optional> key = accessor.getBiome(pos).unwrapKey(); + if (Objects.equals(key, Optional.of(TFBiomes.SNOWY_FOREST))) { + return checkMobSpawnRules(entityType, accessor, reason, pos, random); + } else { + // normal EntityMob spawn check, checks light level + return normalYetiSpawnHandler(entityType, accessor, reason, pos, random); + } + } + + public static boolean normalYetiSpawnHandler(EntityType entity, ServerLevelAccessor accessor, MobSpawnType reason, BlockPos pos, RandomSource random) { + return accessor.getDifficulty() != Difficulty.PEACEFUL && isValidLightLevel(accessor, pos, random) && checkMobSpawnRules(entity, accessor, reason, pos, random); + } + + public static boolean isValidLightLevel(ServerLevelAccessor accessor, BlockPos blockPos, RandomSource random) { + Optional> key = accessor.getBiome(blockPos).unwrapKey(); + if (accessor.getBrightness(LightLayer.SKY, blockPos) > random.nextInt(32)) { + return Objects.equals(key, Optional.of(TFBiomes.SNOWY_FOREST)); + } else { + int i = accessor.getLevel().isThundering() ? accessor.getMaxLocalRawBrightness(blockPos, 10) : accessor.getMaxLocalRawBrightness(blockPos); + return i <= random.nextInt(8) || Objects.equals(key, Optional.of(TFBiomes.SNOWY_FOREST)); + } + } + + @Override + public float getVoicePitch() { + return super.getVoicePitch() + 0.55F; + } + + @Nullable + @Override + protected SoundEvent getAmbientSound() { + return TFSounds.YETI_GROWL.get(); + } + + @Override + protected SoundEvent getHurtSound(DamageSource source) { + return TFSounds.YETI_HURT.get(); + } + + @Override + protected SoundEvent getDeathSound() { + return TFSounds.YETI_DEATH.get(); + } +} diff --git a/src/main/java/twilightforest/entity/monster/package-info.java b/src/main/java/twilightforest/entity/monster/package-info.java new file mode 100644 index 0000000000..d04eeee233 --- /dev/null +++ b/src/main/java/twilightforest/entity/monster/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.entity.monster; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/entity/package-info.java b/src/main/java/twilightforest/entity/package-info.java new file mode 100644 index 0000000000..067f774abd --- /dev/null +++ b/src/main/java/twilightforest/entity/package-info.java @@ -0,0 +1,6 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.entity; + +import net.minecraft.MethodsReturnNonnullByDefault; +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/entity/passive/Bighorn.java b/src/main/java/twilightforest/entity/passive/Bighorn.java new file mode 100644 index 0000000000..a086ee3186 --- /dev/null +++ b/src/main/java/twilightforest/entity/passive/Bighorn.java @@ -0,0 +1,109 @@ +package twilightforest.entity.passive; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.util.RandomSource; +import net.minecraft.world.DifficultyInstance; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.AgeableMob; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.MobSpawnType; +import net.minecraft.world.entity.SpawnGroupData; +import net.minecraft.world.entity.animal.Sheep; +import net.minecraft.world.item.DyeColor; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.ServerLevelAccessor; +import net.minecraft.world.level.block.state.BlockState; +import twilightforest.TwilightForestMod; +import twilightforest.init.TFEntities; +import twilightforest.init.TFSounds; +import twilightforest.loot.TFLootTables; + +import org.jetbrains.annotations.Nullable; + +public class Bighorn extends Sheep { + + public Bighorn(EntityType type, Level world) { + super(type, world); + } + + public Bighorn(Level world, double x, double y, double z) { + this(TFEntities.BIGHORN_SHEEP.get(), world); + this.setPos(x, y, z); + } + + @Override + public ResourceLocation getDefaultLootTable() { + if (this.isSheared()) { + return this.getType().getDefaultLootTable(); + } else { + return switch (this.getColor()) { + case ORANGE -> TFLootTables.BIGHORN_SHEEP_ORANGE; + case MAGENTA -> TFLootTables.BIGHORN_SHEEP_MAGENTA; + case LIGHT_BLUE -> TFLootTables.BIGHORN_SHEEP_LIGHT_BLUE; + case YELLOW -> TFLootTables.BIGHORN_SHEEP_YELLOW; + case LIME -> TFLootTables.BIGHORN_SHEEP_LIME; + case PINK -> TFLootTables.BIGHORN_SHEEP_PINK; + case GRAY -> TFLootTables.BIGHORN_SHEEP_GRAY; + case LIGHT_GRAY -> TFLootTables.BIGHORN_SHEEP_LIGHT_GRAY; + case CYAN -> TFLootTables.BIGHORN_SHEEP_CYAN; + case PURPLE -> TFLootTables.BIGHORN_SHEEP_PURPLE; + case BLUE -> TFLootTables.BIGHORN_SHEEP_BLUE; + case BROWN -> TFLootTables.BIGHORN_SHEEP_BROWN; + case GREEN -> TFLootTables.BIGHORN_SHEEP_GREEN; + case RED -> TFLootTables.BIGHORN_SHEEP_RED; + case BLACK -> TFLootTables.BIGHORN_SHEEP_BLACK; + default -> TFLootTables.BIGHORN_SHEEP_WHITE; + }; + } + } + + private static DyeColor getRandomFleeceColor(RandomSource random) { + return random.nextBoolean() + ? DyeColor.BROWN + : DyeColor.byId(random.nextInt(16)); + } + + @Nullable + @Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor accessor, DifficultyInstance difficulty, MobSpawnType reason, @Nullable SpawnGroupData livingdata, @Nullable CompoundTag dataTag) { + livingdata = super.finalizeSpawn(accessor, difficulty, reason, livingdata, dataTag); + this.setColor(getRandomFleeceColor(accessor.getRandom())); + return livingdata; + } + + @Override + public Sheep getBreedOffspring(ServerLevel world, AgeableMob ageable) { + if (!(ageable instanceof Bighorn otherParent)) { + TwilightForestMod.LOGGER.error("Code was called to breed a Bighorn with a non Bighorn! Cancelling!"); + return null; + } + + Bighorn babySheep = TFEntities.BIGHORN_SHEEP.get().create(world); + babySheep.setColor(getOffspringColor(this, otherParent)); + return babySheep; + } + + @Override + protected SoundEvent getAmbientSound() { + return TFSounds.BIGHORN_SHEEP_AMBIENT.get(); + } + + @Override + protected SoundEvent getHurtSound(DamageSource source) { + return TFSounds.BIGHORN_SHEEP_HURT.get(); + } + + @Override + protected SoundEvent getDeathSound() { + return TFSounds.BIGHORN_SHEEP_DEATH.get(); + } + + @Override + protected void playStepSound(BlockPos pos, BlockState state) { + this.playSound(TFSounds.BIGHORN_SHEEP_STEP.get(), 0.15F, 1.0F); + } +} diff --git a/src/main/java/twilightforest/entity/passive/Bird.java b/src/main/java/twilightforest/entity/passive/Bird.java new file mode 100644 index 0000000000..a0344cff02 --- /dev/null +++ b/src/main/java/twilightforest/entity/passive/Bird.java @@ -0,0 +1,78 @@ +package twilightforest.entity.passive; + +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.AgeableMob; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.animal.Animal; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.Vec3; + +import javax.annotation.Nonnull; + +public abstract class Bird extends Animal { + + protected static final Ingredient SEEDS = Ingredient.of(Items.WHEAT_SEEDS, Items.MELON_SEEDS, Items.PUMPKIN_SEEDS, Items.BEETROOT_SEEDS); + + public float flapLength = 0.0F; + public float flapIntensity = 0.0F; + public float lastFlapIntensity; + public float lastFlapLength; + public float flapSpeed = 1.0F; + + public Bird(EntityType entity, Level world) { + super(entity, world); + } + + @Override + public void aiStep() { + super.aiStep(); + this.lastFlapLength = this.flapLength; + this.lastFlapIntensity = this.flapIntensity; + this.flapIntensity = (float) (this.flapIntensity + (this.onGround ? -1 : 4) * 0.3D); + + if (this.flapIntensity < 0.0F) { + this.flapIntensity = 0.0F; + } + + if (this.flapIntensity > 1.0F) { + this.flapIntensity = 1.0F; + } + + if (!this.onGround && this.flapSpeed < 1.0F) { + this.flapSpeed = 1.0F; + } + + this.flapSpeed = (float) (this.flapSpeed * 0.9D); + + // don't fall as fast + if (!this.onGround && this.getDeltaMovement().y() < 0.0D) { + this.setDeltaMovement(new Vec3(getDeltaMovement().x(), getDeltaMovement().y() * 0.6D, getDeltaMovement().z())); + } + + this.flapLength += this.flapSpeed * 2.0F; + + } + + @Override + public boolean isSteppingCarefully() { + return false; + } + + @Override + public Animal getBreedOffspring(ServerLevel world, AgeableMob ageableMob) { + return null; + } + + /** + * Overridden by flying birds + */ + public boolean isBirdLanded() { + return true; + } + +} diff --git a/src/main/java/twilightforest/entity/passive/Boar.java b/src/main/java/twilightforest/entity/passive/Boar.java new file mode 100644 index 0000000000..bcabcb79a5 --- /dev/null +++ b/src/main/java/twilightforest/entity/passive/Boar.java @@ -0,0 +1,84 @@ +package twilightforest.entity.passive; + +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.AgeableMob; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.goal.*; +import net.minecraft.world.entity.animal.Animal; +import net.minecraft.world.entity.animal.Pig; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.Vec3; +import twilightforest.init.TFEntities; +import twilightforest.init.TFSounds; + +public class Boar extends Animal { + + private static final Ingredient FOOD_ITEMS = Ingredient.of(Items.CARROT, Items.POTATO, Items.BEETROOT); + + public Boar(EntityType type, Level world) { + super(type, world); + } + + @Override + protected void registerGoals() { + this.goalSelector.addGoal(0, new FloatGoal(this)); + this.goalSelector.addGoal(1, new PanicGoal(this, 1.25D)); + this.goalSelector.addGoal(3, new BreedGoal(this, 1.0D)); + this.goalSelector.addGoal(4, new TemptGoal(this, 1.2D, Ingredient.of(Items.CARROT_ON_A_STICK), false)); + this.goalSelector.addGoal(4, new TemptGoal(this, 1.2D, FOOD_ITEMS, false)); + this.goalSelector.addGoal(5, new FollowParentGoal(this, 1.1D)); + this.goalSelector.addGoal(6, new WaterAvoidingRandomStrollGoal(this, 1.0D)); + this.goalSelector.addGoal(7, new LookAtPlayerGoal(this, Player.class, 6.0F)); + this.goalSelector.addGoal(8, new RandomLookAroundGoal(this)); + } + + public static AttributeSupplier.Builder registerAttributes() { + return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 10.0D).add(Attributes.MOVEMENT_SPEED, 0.25D); + } + + @Override + public Boar getBreedOffspring(ServerLevel world, AgeableMob ageableMob) { + return TFEntities.BOAR.get().create(world); + } + + @Override + protected SoundEvent getAmbientSound() { + return TFSounds.BOAR_AMBIENT.get(); + } + + @Override + protected SoundEvent getHurtSound(DamageSource source) { + return TFSounds.BOAR_HURT.get(); + } + + @Override + protected SoundEvent getDeathSound() { + return TFSounds.BOAR_DEATH.get(); + } + + @Override + protected void playStepSound(BlockPos pos, BlockState state) { + this.playSound(TFSounds.BOAR_STEP.get(), 0.15F, 1.0F); + } + + @Override + public boolean isFood(ItemStack stack) { + return FOOD_ITEMS.test(stack); + } + + @Override + public Vec3 getLeashOffset() { + return new Vec3(0.0D, (double)(0.6F * this.getEyeHeight()), (double)(this.getBbWidth() * 0.4F)); + } +} diff --git a/src/main/java/twilightforest/entity/passive/Deer.java b/src/main/java/twilightforest/entity/passive/Deer.java new file mode 100644 index 0000000000..e24f70d68b --- /dev/null +++ b/src/main/java/twilightforest/entity/passive/Deer.java @@ -0,0 +1,78 @@ +package twilightforest.entity.passive; + +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.*; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.goal.*; +import net.minecraft.world.entity.animal.Animal; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import twilightforest.init.TFEntities; +import twilightforest.init.TFSounds; + +public class Deer extends Animal { + + public Deer(EntityType type, Level world) { + super(type, world); + } + + @Override + protected void registerGoals() { + goalSelector.addGoal(0, new FloatGoal(this)); + goalSelector.addGoal(1, new PanicGoal(this, 2.0D)); + goalSelector.addGoal(2, new BreedGoal(this, 1.0D)); + goalSelector.addGoal(3, new TemptGoal(this, 1.25D, Ingredient.of(Items.WHEAT), false)); + goalSelector.addGoal(4, new FollowParentGoal(this, 1.25D)); + goalSelector.addGoal(4, new AvoidEntityGoal<>(this, Player.class, 16.0F, 1.5D, 1.8D)); + goalSelector.addGoal(5, new WaterAvoidingRandomStrollGoal(this, 1.0D)); + goalSelector.addGoal(6, new LookAtPlayerGoal(this, Player.class, 6.0F)); + goalSelector.addGoal(7, new RandomLookAroundGoal(this)); + } + + public static AttributeSupplier.Builder registerAttributes() { + return Mob.createMobAttributes() + .add(Attributes.MAX_HEALTH, 10.0) + .add(Attributes.MOVEMENT_SPEED, 0.2); + } + + @Override + public float getEyeHeight(Pose pose) { + return this.getBbHeight() * 0.7F; + } + + @Override + protected SoundEvent getAmbientSound() { + return TFSounds.DEER_AMBIENT.get(); + } + + @Override + protected SoundEvent getHurtSound(DamageSource source) { + return TFSounds.DEER_HURT.get(); + } + + @Override + protected SoundEvent getDeathSound() { + return TFSounds.DEER_DEATH.get(); + } + + @Override + protected void playStepSound(BlockPos pos, BlockState state) { + } + + @Override + public Deer getBreedOffspring(ServerLevel level, AgeableMob mate) { + return TFEntities.DEER.get().create(level); + } + + @Override + protected float getStandingEyeHeight(Pose pos, EntityDimensions size) { + return this.isBaby() ? size.height * 0.95F : 1.65F; + } +} diff --git a/src/main/java/twilightforest/entity/passive/DwarfRabbit.java b/src/main/java/twilightforest/entity/passive/DwarfRabbit.java new file mode 100644 index 0000000000..b6b9a64b73 --- /dev/null +++ b/src/main/java/twilightforest/entity/passive/DwarfRabbit.java @@ -0,0 +1,164 @@ +package twilightforest.entity.passive; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.syncher.EntityDataAccessor; +import net.minecraft.network.syncher.EntityDataSerializers; +import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.AgeableMob; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.Pose; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.goal.*; +import net.minecraft.world.entity.animal.*; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.material.Material; +import org.jetbrains.annotations.Nullable; +import twilightforest.init.TFEntities; +import twilightforest.init.TFSounds; +import twilightforest.init.custom.DwarfRabbitVariant; + +public class DwarfRabbit extends Animal { + + private static final EntityDataAccessor TYPE = SynchedEntityData.defineId(DwarfRabbit.class, EntityDataSerializers.STRING); + + public DwarfRabbit(EntityType type, Level world) { + super(type, world); + this.setBunnyType(DwarfRabbitVariant.getVariantId(DwarfRabbitVariant.getRandomVariant(this.getRandom()))); + } + + @Override + protected void registerGoals() { + this.goalSelector.addGoal(0, new FloatGoal(this)); + this.goalSelector.addGoal(1, new PanicGoal(this, 2.0F)); + this.goalSelector.addGoal(2, new BreedGoal(this, 0.8D)); + this.goalSelector.addGoal(2, new TemptGoal(this, 1.0F, Ingredient.of(Items.CARROT, Items.GOLDEN_CARROT, Blocks.DANDELION), false)); + this.goalSelector.addGoal(3, new AvoidEntityGoal<>(this, Player.class, 2.0F, 0.8F, 1.33F)); + this.goalSelector.addGoal(4, new AvoidEntityGoal<>(this, Ocelot.class, 8.0F, 0.8F, 1.1F)); + this.goalSelector.addGoal(4, new AvoidEntityGoal<>(this, Cat.class, 8.0F, 0.8F, 1.1F)); + this.goalSelector.addGoal(4, new AvoidEntityGoal<>(this, Wolf.class, 8.0F, 0.8F, 1.1F)); + this.goalSelector.addGoal(4, new AvoidEntityGoal<>(this, Fox.class, 8.0F, 0.8F, 1.1F)); + this.goalSelector.addGoal(5, new WaterAvoidingRandomStrollGoal(this, 0.8F)); + this.goalSelector.addGoal(6, new WaterAvoidingRandomStrollGoal(this, 1.0F)); + this.goalSelector.addGoal(7, new LookAtPlayerGoal(this, Player.class, 6F)); + this.goalSelector.addGoal(8, new RandomLookAroundGoal(this)); + } + + public static AttributeSupplier.Builder registerAttributes() { + return Mob.createMobAttributes() + .add(Attributes.MAX_HEALTH, 3.0D) + .add(Attributes.MOVEMENT_SPEED, 0.3D); + } + + @Override + public float getStepHeight() { + return 1.0F; + } + + @Nullable + @Override + public AgeableMob getBreedOffspring(ServerLevel level, AgeableMob mob) { + DwarfRabbit dwarf = TFEntities.DWARF_RABBIT.get().create(level); + DwarfRabbitVariant variant = DwarfRabbitVariant.getRandomVariant(this.getRandom()); + if (this.getRandom().nextInt(20) != 0) { + if (mob instanceof DwarfRabbit rabbit && this.getRandom().nextBoolean()) { + variant = rabbit.getBunnyType(); + } else { + variant = this.getBunnyType(); + } + } + + dwarf.setBunnyType(DwarfRabbitVariant.getVariantId(variant)); + return dwarf; + } + + @Override + protected void defineSynchedData() { + super.defineSynchedData(); + this.entityData.define(TYPE, DwarfRabbitVariant.getVariantId(DwarfRabbitVariant.getRandomVariant(this.getRandom()))); + } + + @Override + public void addAdditionalSaveData(CompoundTag compound) { + super.addAdditionalSaveData(compound); + compound.putString("BunnyType", DwarfRabbitVariant.getVariantId(this.getBunnyType())); + } + + @Override + public void readAdditionalSaveData(CompoundTag compound) { + super.readAdditionalSaveData(compound); + this.setBunnyType(compound.getString("BunnyType")); + } + + public DwarfRabbitVariant getBunnyType() { + return DwarfRabbitVariant.getVariant(this.entityData.get(TYPE)).orElse(DwarfRabbitVariant.BROWN.get()); + } + + public void setBunnyType(String type) { + this.entityData.set(TYPE, type); + } + + @Override + public float getEyeHeight(Pose pose) { + return this.getBbHeight() * 0.5F; + } + + @Override + public boolean removeWhenFarAway(double distance) { + return false; + } + + @Override + public float getWalkTargetValue(BlockPos pos) { + // avoid leaves & wood + Material underMaterial = this.getLevel().getBlockState(pos.below()).getMaterial(); + if (underMaterial == Material.LEAVES) { + return -1.0F; + } + if (underMaterial == Material.WOOD) { + return -1.0F; + } + if (underMaterial == Material.GRASS) { + return 10.0F; + } + // default to just prefering lighter areas + return this.getLevel().getMaxLocalRawBrightness(pos) - 0.5F; + } + + private static boolean isTemptingItem(ItemStack stack) { + return stack.is(Items.CARROT) || stack.is(Items.GOLDEN_CARROT) || stack.is(Blocks.DANDELION.asItem()); + } + + @Override + public boolean isFood(ItemStack stack) { + return isTemptingItem(stack); + } + + @Nullable + @Override + protected SoundEvent getDeathSound() { + return TFSounds.DWARF_RABBIT_DEATH.get(); + } + + @Nullable + @Override + protected SoundEvent getHurtSound(DamageSource source) { + return TFSounds.DWARF_RABBIT_HURT.get(); + } + + @Nullable + @Override + protected SoundEvent getAmbientSound() { + return TFSounds.DWARF_RABBIT_AMBIENT.get(); + } +} diff --git a/src/main/java/twilightforest/entity/passive/EntityTFBighorn.java b/src/main/java/twilightforest/entity/passive/EntityTFBighorn.java deleted file mode 100644 index 621277fed6..0000000000 --- a/src/main/java/twilightforest/entity/passive/EntityTFBighorn.java +++ /dev/null @@ -1,90 +0,0 @@ -package twilightforest.entity.passive; - -import java.util.Random; - -import net.minecraft.entity.EntityAgeable; -import net.minecraft.entity.IEntityLivingData; -import net.minecraft.entity.passive.EntitySheep; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.util.DamageSource; -import net.minecraft.world.World; -import twilightforest.TFAchievementPage; - - - -public class EntityTFBighorn extends EntitySheep -{ - - public EntityTFBighorn(World world) - { - super(world); - //texture = TwilightForestMod.MODEL_DIR + "bighorn.png"; - setSize(0.9F, 1.3F); - } - - public EntityTFBighorn(World world, double x, double y, double z) - { - this(world); - this.setPosition(x, y, z); - } - - /** - * 50% brown, 50% any other color - * - * @param random - * @return - */ - public static int getRandomFleeceColor(Random random) - { - if (random.nextInt(2) == 0) - { - return 12; - } - else - { - return random.nextInt(15); - } - } - - - /** - * Entity init, set our fleece color - */ - @Override - public IEntityLivingData onSpawnWithEgg(IEntityLivingData par1EntityLivingData) - { - par1EntityLivingData = super.onSpawnWithEgg(par1EntityLivingData); - this.setFleeceColor(getRandomFleeceColor(this.worldObj.rand)); - return par1EntityLivingData; - } - - /** - * What is our baby?! - */ - @Override - public EntitySheep createChild(EntityAgeable entityanimal) - { - EntityTFBighorn otherParent = (EntityTFBighorn)entityanimal; - EntityTFBighorn babySheep = new EntityTFBighorn(worldObj); - if(rand.nextBoolean()) - { - babySheep.setFleeceColor(getFleeceColor()); - } else - { - babySheep.setFleeceColor(otherParent.getFleeceColor()); - } - return babySheep; - } - - /** - * Trigger achievement when killed - */ - @Override - public void onDeath(DamageSource par1DamageSource) { - super.onDeath(par1DamageSource); - if (par1DamageSource.getSourceOfDamage() instanceof EntityPlayer) { - ((EntityPlayer)par1DamageSource.getSourceOfDamage()).triggerAchievement(TFAchievementPage.twilightHunter); - } - } - -} diff --git a/src/main/java/twilightforest/entity/passive/EntityTFBird.java b/src/main/java/twilightforest/entity/passive/EntityTFBird.java deleted file mode 100644 index efd22c99b4..0000000000 --- a/src/main/java/twilightforest/entity/passive/EntityTFBird.java +++ /dev/null @@ -1,115 +0,0 @@ -package twilightforest.entity.passive; - -import net.minecraft.entity.EntityAgeable; -import net.minecraft.entity.passive.EntityAnimal; -import net.minecraft.init.Items; -import net.minecraft.item.Item; -import net.minecraft.world.World; - - -public abstract class EntityTFBird extends EntityAnimal { - - public float flapLength = 0.0F; - public float flapIntensity = 0.0F; - public float lastFlapIntensity; - public float lastFlapLength; - public float flapSpeed = 1.0F; - - public EntityTFBird(World par1World) { - super(par1World); - } - - /** - * Returns true if the newer Entity AI code should be run - */ - @Override - public boolean isAIEnabled() { - return true; - } - - /** - * Called frequently so the entity can update its state every tick as required. For example, zombies and skeletons - * use this to react to sunlight and start to burn. - */ - @Override - public void onLivingUpdate() { - super.onLivingUpdate(); - this.lastFlapLength = this.flapLength; - this.lastFlapIntensity = this.flapIntensity; - this.flapIntensity = (float)(this.flapIntensity + (this.onGround ? -1 : 4) * 0.3D); - - if (this.flapIntensity < 0.0F) - { - this.flapIntensity = 0.0F; - } - - if (this.flapIntensity > 1.0F) - { - this.flapIntensity = 1.0F; - } - - if (!this.onGround && this.flapSpeed < 1.0F) - { - this.flapSpeed = 1.0F; - } - - this.flapSpeed = (float)(this.flapSpeed * 0.9D); - - // don't fall as fast - if (!this.onGround && this.motionY < 0.0D) - { - this.motionY *= 0.6D; - } - - this.flapLength += this.flapSpeed * 2.0F; - -// // rise up when we go fast? -// if (this.getMoveHelper().getSpeed() > 0.39F && this.moveForward > 0.1F) -// { -// this.motionY += (0.30000001192092896D - this.motionY) * 0.30000001192092896D; -// this.moveForward *= 2F; -// } - } - - /** - * Called when the mob is falling. Calculates and applies fall damage. - */ - @Override - protected void fall(float par1) {} - - /** - * returns if this entity triggers Blocks.onEntityWalking on the blocks they walk on. used for spiders and wolves to - * prevent them from trampling crops - */ - @Override - protected boolean canTriggerWalking() - { - return false; - } - - /** - * Returns the item ID for the item the mob drops on death. - */ - @Override - protected Item getDropItem() { - return Items.feather; - } - - /** - * This function is used when two same-species animals in 'love mode' breed to generate the new baby animal. - */ - @Override - public EntityAnimal createChild(EntityAgeable entityanimal) - { - return null; - } - - /** - * Overridden by flying birds - */ - public boolean isBirdLanded() - { - return true; - } - -} \ No newline at end of file diff --git a/src/main/java/twilightforest/entity/passive/EntityTFBoar.java b/src/main/java/twilightforest/entity/passive/EntityTFBoar.java deleted file mode 100644 index 787cd4d72e..0000000000 --- a/src/main/java/twilightforest/entity/passive/EntityTFBoar.java +++ /dev/null @@ -1,46 +0,0 @@ -package twilightforest.entity.passive; - -import net.minecraft.entity.EntityAgeable; -import net.minecraft.entity.passive.EntityPig; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.util.DamageSource; -import net.minecraft.world.World; -import twilightforest.TFAchievementPage; - - -public class EntityTFBoar extends EntityPig { - - public EntityTFBoar(World world) - { - super(world); - //texture = TwilightForestMod.MODEL_DIR + "wildboar.png"; - setSize(0.9F, 0.9F); - } - - public EntityTFBoar(World world, double x, double y, double z) - { - this(world); - this.setPosition(x, y, z); - } - - /** - * What is our baby?! - */ - @Override - public EntityPig createChild(EntityAgeable entityanimal) - { - return new EntityTFBoar(worldObj); - } - - /** - * Trigger achievement when killed - */ - @Override - public void onDeath(DamageSource par1DamageSource) { - super.onDeath(par1DamageSource); - if (par1DamageSource.getSourceOfDamage() instanceof EntityPlayer) { - ((EntityPlayer)par1DamageSource.getSourceOfDamage()).triggerAchievement(TFAchievementPage.twilightHunter); - } - } - -} diff --git a/src/main/java/twilightforest/entity/passive/EntityTFBunny.java b/src/main/java/twilightforest/entity/passive/EntityTFBunny.java deleted file mode 100644 index fdbcd1a371..0000000000 --- a/src/main/java/twilightforest/entity/passive/EntityTFBunny.java +++ /dev/null @@ -1,182 +0,0 @@ -package twilightforest.entity.passive; - -import net.minecraft.block.material.Material; -import net.minecraft.entity.EntityCreature; -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.ai.EntityAIAvoidEntity; -import net.minecraft.entity.ai.EntityAILookIdle; -import net.minecraft.entity.ai.EntityAIPanic; -import net.minecraft.entity.ai.EntityAISwimming; -import net.minecraft.entity.ai.EntityAITempt; -import net.minecraft.entity.ai.EntityAIWander; -import net.minecraft.entity.ai.EntityAIWatchClosest; -import net.minecraft.entity.passive.IAnimals; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Items; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.DamageSource; -import net.minecraft.world.World; -import twilightforest.TFAchievementPage; - - -public class EntityTFBunny extends EntityCreature implements IAnimals { - - public EntityTFBunny(World par1World) { - super(par1World); - //texture = TwilightForestMod.MODEL_DIR + "bunnydutch.png"; - - this.setSize(0.3F, 0.7F); - - // maybe this will help them move cuter? - this.stepHeight = 1; - - // squirrel AI - this.getNavigator().setAvoidsWater(true); - this.tasks.addTask(0, new EntityAISwimming(this)); - this.tasks.addTask(1, new EntityAIPanic(this, 2.0F)); - this.tasks.addTask(2, new EntityAITempt(this, 1.0F, Items.wheat_seeds, true)); - this.tasks.addTask(3, new EntityAIAvoidEntity(this, EntityPlayer.class, 2.0F, 0.8F, 1.33F)); - this.tasks.addTask(5, new EntityAIWander(this, 0.8F)); - this.tasks.addTask(6, new EntityAIWander(this, 1.0F)); - this.tasks.addTask(7, new EntityAIWatchClosest(this, EntityPlayer.class, 6F)); - this.tasks.addTask(8, new EntityAILookIdle(this)); - - // random color - setBunnyType(rand.nextInt(4)); - - } - - - /** - * Set monster attributes - */ - @Override - protected void applyEntityAttributes() - { - super.applyEntityAttributes(); - this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(3.0D); // max health - this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.3D); - } - - @Override - protected void entityInit() - { - super.entityInit(); - this.dataWatcher.addObject(16, Byte.valueOf((byte)0)); - } - - /** - * Returns true if the newer Entity AI code should be run - */ - @Override - public boolean isAIEnabled() { - return true; - } - -// /** -// * Returns the texture's file path as a String. -// */ -// @Override -// public String getTexture() -// { -// switch (this.getBunnyType()) -// { -// case 0: -// return TwilightForestMod.MODEL_DIR + "bunnydutch.png"; -// -// case 1: -// return TwilightForestMod.MODEL_DIR + "bunnydutch.png"; -// -// case 2: -// return TwilightForestMod.MODEL_DIR + "bunnywhite.png"; -// -// case 3: -// return TwilightForestMod.MODEL_DIR + "bunnybrown.png"; -// -// default: -// return super.getTexture(); -// } -// } - - /** - * (abstract) Protected helper method to write subclass entity data to NBT. - */ - @Override - public void writeEntityToNBT(NBTTagCompound par1NBTTagCompound) - { - super.writeEntityToNBT(par1NBTTagCompound); - par1NBTTagCompound.setInteger("BunnyType", this.getBunnyType()); - } - - /** - * (abstract) Protected helper method to read subclass entity data from NBT. - */ - @Override - public void readEntityFromNBT(NBTTagCompound par1NBTTagCompound) - { - super.readEntityFromNBT(par1NBTTagCompound); - this.setBunnyType(par1NBTTagCompound.getInteger("BunnyType")); - } - - public int getBunnyType() - { - return this.dataWatcher.getWatchableObjectByte(16); - } - - public void setBunnyType(int par1) - { - this.dataWatcher.updateObject(16, Byte.valueOf((byte)par1)); - } - - - /** - * Actually only used for the shadow - */ - @Override - public float getRenderSizeModifier() { - return 0.3F; - } - - /** - * Determines if an entity can be despawned, used on idle far away entities - */ - @Override - protected boolean canDespawn() - { - return false; - } - - - /** - * Takes a coordinate in and returns a weight to determine how likely this creature will try to path to the block. - * Args: x, y, z - */ - @Override - public float getBlockPathWeight(int par1, int par2, int par3) - { - // avoid leaves & wood - Material underMaterial = this.worldObj.getBlock(par1, par2 - 1, par3).getMaterial(); - if (underMaterial == Material.leaves) { - return -1.0F; - } - if (underMaterial == Material.wood) { - return -1.0F; - } - if (underMaterial == Material.grass) { - return 10.0F; - } - // default to just prefering lighter areas - return this.worldObj.getLightBrightness(par1, par2, par3) - 0.5F; - } - - /** - * Trigger achievement when killed - */ - @Override - public void onDeath(DamageSource par1DamageSource) { - super.onDeath(par1DamageSource); - if (par1DamageSource.getSourceOfDamage() instanceof EntityPlayer) { - ((EntityPlayer)par1DamageSource.getSourceOfDamage()).triggerAchievement(TFAchievementPage.twilightHunter); - } - } -} diff --git a/src/main/java/twilightforest/entity/passive/EntityTFDeer.java b/src/main/java/twilightforest/entity/passive/EntityTFDeer.java deleted file mode 100644 index 6f7396759e..0000000000 --- a/src/main/java/twilightforest/entity/passive/EntityTFDeer.java +++ /dev/null @@ -1,137 +0,0 @@ -package twilightforest.entity.passive; - -import net.minecraft.block.Block; -import net.minecraft.entity.EntityAgeable; -import net.minecraft.entity.passive.EntityCow; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Items; -import net.minecraft.item.ItemStack; -import net.minecraft.util.DamageSource; -import net.minecraft.world.World; -import twilightforest.TFAchievementPage; -import twilightforest.item.TFItems; - - -/** - * Deer are like quiet, non-milkable cows! - * - * Also they look like deer - * - * @author Ben - * - */ -public class EntityTFDeer extends EntityCow -{ - - public EntityTFDeer(World world) - { - super(world); - //texture = TwilightForestMod.MODEL_DIR + "wilddeer.png"; - setSize(0.7F, 2.3F); - -// this.tasks.taskEntries.clear(); -// -// this.tasks.addTask(0, new EntityAISwimming(this)); -// this.tasks.addTask(1, new EntityAITFPanicOnFlockDeath(this, 0.38F)); -// this.tasks.addTask(2, new EntityAIMate(this, 0.2F)); -// this.tasks.addTask(3, new EntityAITempt(this, 0.25F, Items.wheat, false)); -// this.tasks.addTask(4, new EntityAIFollowParent(this, 0.25F)); -// this.tasks.addTask(5, new EntityAIWander(this, 0.2F)); -// this.tasks.addTask(6, new EntityAIWatchClosest(this, EntityPlayer.class, 6.0F)); -// this.tasks.addTask(7, new EntityAILookIdle(this)); - } - - public EntityTFDeer(World world, double x, double y, double z) - { - this(world); - this.setPosition(x, y, z); - } - - - /** - * No sounds when idle - */ - @Override - protected String getLivingSound() - { - return null; - } - - /** - * Plays step sound at given x, y, z for the entity - */ - @Override - protected void func_145780_a(int par1, int par2, int par3, Block par4) - { - //this.worldObj.playSoundAtEntity(this, "mob.cow.step", 0.15F, 1.0F); - } - - /** - * Not milkable - */ - @Override - public boolean interact(EntityPlayer entityplayer) - { - ItemStack itemstack = entityplayer.inventory.getCurrentItem(); - if(itemstack != null && itemstack.getItem() == Items.bucket) - { - // specifically do not respond to this - return false; - } else - { - return super.interact(entityplayer); - } - } - - - /** - * Drop 0-2 items of this living's type - */ - @Override - protected void dropFewItems(boolean par1, int par2) - { - int var3 = this.rand.nextInt(3) + this.rand.nextInt(1 + par2); - int var4; - - for (var4 = 0; var4 < var3; ++var4) - { - this.dropItem(Items.leather, 1); - } - - var3 = this.rand.nextInt(3) + 1 + this.rand.nextInt(1 + par2); - - for (var4 = 0; var4 < var3; ++var4) - { - if (this.isBurning()) - { - this.dropItem(TFItems.venisonCooked, 1); - } - else - { - this.dropItem(TFItems.venisonRaw, 1); - } - } - } - - - /** - * What is our baby going to be? Another deer?! - */ - @Override - public EntityCow createChild(EntityAgeable entityanimal) - { - return new EntityTFDeer(worldObj); - } - - /** - * Trigger achievement when killed - */ - @Override - public void onDeath(DamageSource par1DamageSource) { - super.onDeath(par1DamageSource); - if (par1DamageSource.getSourceOfDamage() instanceof EntityPlayer) { - ((EntityPlayer)par1DamageSource.getSourceOfDamage()).triggerAchievement(TFAchievementPage.twilightHunter); - } - } - -} diff --git a/src/main/java/twilightforest/entity/passive/EntityTFMobileFirefly.java b/src/main/java/twilightforest/entity/passive/EntityTFMobileFirefly.java deleted file mode 100644 index 0e8b4461e8..0000000000 --- a/src/main/java/twilightforest/entity/passive/EntityTFMobileFirefly.java +++ /dev/null @@ -1,197 +0,0 @@ -package twilightforest.entity.passive; - -import net.minecraft.entity.Entity; -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.passive.EntityAmbientCreature; -import net.minecraft.util.ChunkCoordinates; -import net.minecraft.util.MathHelper; -import net.minecraft.world.World; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public class EntityTFMobileFirefly extends EntityAmbientCreature -{ - /** - * randomly selected ChunkCoordinates in a 7x6x7 box around the bat (y offset -2 to 4) towards which it will fly. - * upon getting close a new target will be selected - */ - private ChunkCoordinates currentFlightTarget; - - public EntityTFMobileFirefly(World par1World) - { - super(par1World); - this.setSize(0.5F, 0.5F); - } - /** - * Returns the volume for the sounds this mob makes. - */ - @Override - protected float getSoundVolume() - { - return 0.1F; - } - - /** - * Gets the pitch of living sounds in living entities. - */ - @Override - protected float getSoundPitch() - { - return super.getSoundPitch() * 0.95F; - } - - /** - * Returns the sound this mob makes when it is hurt. - */ - @Override - protected String getHurtSound() - { - return "mob.bat.hurt"; - } - - /** - * Returns the sound this mob makes on death. - */ - @Override - protected String getDeathSound() - { - return "mob.bat.death"; - } - - /** - * Returns true if this entity should push and be pushed by other entities when colliding. - */ - @Override - public boolean canBePushed() - { - return false; - } - - protected void collideWithEntity(Entity par1Entity) {} - - /** - * Set monster attributes - */ - @Override - protected void applyEntityAttributes() - { - super.applyEntityAttributes(); - this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(6.0D); // max health - } - - /** - * Returns true if the newer Entity AI code should be run - */ - @Override - protected boolean isAIEnabled() - { - return true; - } - - /** - * Called to update the entity's position/logic. - */ - @Override - public void onUpdate() - { - super.onUpdate(); - - this.motionY *= 0.6000000238418579D; - } - - @Override - protected void updateAITasks() - { - super.updateAITasks(); - - - if (this.currentFlightTarget != null && (!this.worldObj.isAirBlock(this.currentFlightTarget.posX, this.currentFlightTarget.posY, this.currentFlightTarget.posZ) || this.currentFlightTarget.posY < 1)) - { - this.currentFlightTarget = null; - } - - if (this.currentFlightTarget == null || this.rand.nextInt(30) == 0 || this.currentFlightTarget.getDistanceSquared((int)this.posX, (int)this.posY, (int)this.posZ) < 4.0F) - { - this.currentFlightTarget = new ChunkCoordinates((int)this.posX + this.rand.nextInt(7) - this.rand.nextInt(7), (int)this.posY + this.rand.nextInt(6) - 2, (int)this.posZ + this.rand.nextInt(7) - this.rand.nextInt(7)); - } - - double var1 = this.currentFlightTarget.posX + 0.5D - this.posX; - double var3 = this.currentFlightTarget.posY + 0.1D - this.posY; - double var5 = this.currentFlightTarget.posZ + 0.5D - this.posZ; - double speed = 0.05000000149011612D; - this.motionX += (Math.signum(var1) * 0.5D - this.motionX) * speed; - this.motionY += (Math.signum(var3) * 0.699999988079071D - this.motionY) * speed * 2; - this.motionZ += (Math.signum(var5) * 0.5D - this.motionZ) * speed; - float var7 = (float)(Math.atan2(this.motionZ, this.motionX) * 180.0D / Math.PI) - 90.0F; - float var8 = MathHelper.wrapAngleTo180_float(var7 - this.rotationYaw); - this.moveForward = 0.5F; - this.rotationYaw += var8; - } - - /** - * returns if this entity triggers Blocks.onEntityWalking on the blocks they walk on. used for spiders and wolves to - * prevent them from trampling crops - */ - @Override - protected boolean canTriggerWalking() - { - return false; - } - - /** - * Called when the mob is falling. Calculates and applies fall damage. - */ - @Override - protected void fall(float par1) {} - - /** - * Takes in the distance the entity has fallen this tick and whether its on the ground to update the fall distance - * and deal fall damage if landing on the ground. Args: distanceFallenThisTick, onGround - */ - @Override - protected void updateFallState(double par1, boolean par3) {} - - /** - * Return whether this entity should NOT trigger a pressure plate or a tripwire. - */ - @Override - public boolean doesEntityNotTriggerPressurePlate() - { - return true; - } - - /** - * Checks if the entity's current position is a valid location to spawn this entity. - */ - @Override - public boolean getCanSpawnHere() - { - int var1 = MathHelper.floor_double(this.boundingBox.minY); - - if (var1 >= 63) - { - return false; - } - else - { - int var2 = MathHelper.floor_double(this.posX); - int var3 = MathHelper.floor_double(this.posZ); - int var4 = this.worldObj.getBlockLightValue(var2, var1, var3); - byte var5 = 4; - - return var4 > this.rand.nextInt(var5) ? false : super.getCanSpawnHere(); - } - } - - @Override - @SideOnly(Side.CLIENT) - public int getBrightnessForRender(float par1) - { - return 15728880; - } - - public float getGlowBrightness() - { - return (float)Math.sin(this.ticksExisted / 7.0) + 1F; - } -} diff --git a/src/main/java/twilightforest/entity/passive/EntityTFPenguin.java b/src/main/java/twilightforest/entity/passive/EntityTFPenguin.java deleted file mode 100644 index 1db58913d2..0000000000 --- a/src/main/java/twilightforest/entity/passive/EntityTFPenguin.java +++ /dev/null @@ -1,95 +0,0 @@ -package twilightforest.entity.passive; - -import net.minecraft.entity.EntityAgeable; -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.ai.EntityAIFollowParent; -import net.minecraft.entity.ai.EntityAILookIdle; -import net.minecraft.entity.ai.EntityAIMate; -import net.minecraft.entity.ai.EntityAIPanic; -import net.minecraft.entity.ai.EntityAISwimming; -import net.minecraft.entity.ai.EntityAITempt; -import net.minecraft.entity.ai.EntityAIWander; -import net.minecraft.entity.ai.EntityAIWatchClosest; -import net.minecraft.entity.ai.EntityAIWatchClosest2; -import net.minecraft.entity.passive.EntityAnimal; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Items; -import net.minecraft.item.ItemStack; -import net.minecraft.util.DamageSource; -import net.minecraft.world.World; -import twilightforest.TFAchievementPage; - - -public class EntityTFPenguin extends EntityTFBird { - - public EntityTFPenguin(World world) { - super(world); - //texture = TwilightForestMod.MODEL_DIR + "penguin.png"; - - this.setSize(0.5F, 0.9F); - - // reset tasks for fish - tasks.addTask(0, new EntityAISwimming(this)); - tasks.addTask(1, new EntityAIPanic(this, 1.75F)); - tasks.addTask(2, new EntityAIMate(this, 1.0F)); - tasks.addTask(3, new EntityAITempt(this, 0.75F, Items.fish, false)); - tasks.addTask(4, new EntityAIFollowParent(this, 1.15F)); - tasks.addTask(5, new EntityAIWander(this, 1.0F)); - tasks.addTask(6, new EntityAIWatchClosest(this, EntityPlayer.class, 6F)); - tasks.addTask(7, new EntityAIWatchClosest2(this, twilightforest.entity.passive.EntityTFPenguin.class, 5F, 0.02F)); - tasks.addTask(8, new EntityAILookIdle(this)); - - } - - /** - * Returns the sound this mob makes while it's alive. - */ - @Override - protected String getLivingSound() - { - return null;//"mob.chicken"; - } - - - /** - * [This function is used when two same-species animals in 'love mode' breed to generate the new baby animal.] - */ - @Override - public EntityAnimal createChild(EntityAgeable entityanimal) - { - return new EntityTFPenguin(worldObj); - } - - /** - * Checks if the parameter is an item which this animal can be fed to breed it (wheat, carrots or seeds depending on - * the animal type) - */ - @Override - public boolean isBreedingItem(ItemStack par1ItemStack) - { - return par1ItemStack != null && par1ItemStack.getItem() == Items.fish; - } - - - /** - * Trigger achievement when killed - */ - @Override - public void onDeath(DamageSource par1DamageSource) { - super.onDeath(par1DamageSource); - if (par1DamageSource.getSourceOfDamage() instanceof EntityPlayer) { - ((EntityPlayer)par1DamageSource.getSourceOfDamage()).triggerAchievement(TFAchievementPage.twilightHunter); - } - } - - /** - * Set monster attributes - */ - @Override - protected void applyEntityAttributes() - { - super.applyEntityAttributes(); - this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(10.0D); // max health - this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.2D); - } -} diff --git a/src/main/java/twilightforest/entity/passive/EntityTFQuestRam.java b/src/main/java/twilightforest/entity/passive/EntityTFQuestRam.java deleted file mode 100644 index 5e1c281d79..0000000000 --- a/src/main/java/twilightforest/entity/passive/EntityTFQuestRam.java +++ /dev/null @@ -1,397 +0,0 @@ -package twilightforest.entity.passive; - -import java.util.List; - -import net.minecraft.block.Block; -import net.minecraft.entity.EntityAgeable; -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.ai.EntityAILookIdle; -import net.minecraft.entity.ai.EntityAIPanic; -import net.minecraft.entity.ai.EntityAISwimming; -import net.minecraft.entity.ai.EntityAITempt; -import net.minecraft.entity.ai.EntityAIWander; -import net.minecraft.entity.passive.EntityAnimal; -import net.minecraft.entity.passive.EntitySheep; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.ChunkCoordinates; -import net.minecraft.util.MathHelper; -import net.minecraft.world.World; -import twilightforest.TFAchievementPage; -import twilightforest.TFFeature; -import twilightforest.entity.ai.EntityAITFEatLoose; -import twilightforest.entity.ai.EntityAITFFindLoose; -import twilightforest.item.TFItems; - - -public class EntityTFQuestRam extends EntityAnimal { - - private int randomTickDivider; - - - public EntityTFQuestRam(World par1World) { - super(par1World); - //this.texture = TwilightForestMod.MODEL_DIR + "questram.png"; - this.setSize(1.25F, 2.9F); - this.randomTickDivider = 0; - - - this.getNavigator().setAvoidsWater(true); - this.tasks.addTask(0, new EntityAISwimming(this)); - this.tasks.addTask(1, new EntityAIPanic(this, 1.38F)); - this.tasks.addTask(2, new EntityAITempt(this, 1.0F, Item.getItemFromBlock(Blocks.wool), false)); - this.tasks.addTask(3, new EntityAITFEatLoose(this, Item.getItemFromBlock(Blocks.wool))); - this.tasks.addTask(4, new EntityAITFFindLoose(this, 1.0F, Item.getItemFromBlock(Blocks.wool))); - this.tasks.addTask(5, new EntityAIWander(this, 1.0F)); -// this.tasks.addTask(4, new EntityAIWatchClosest(this, EntityPlayer.class, 6.0F)); - this.tasks.addTask(6, new EntityAILookIdle(this)); - } - - @Override - public EntityAnimal createChild(EntityAgeable entityanimal) - { - return null; - } - - /** - * Set monster attributes - */ - @Override - protected void applyEntityAttributes() - { - super.applyEntityAttributes(); - this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(70.0D); // max health - this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.23000000417232513D); - } - - @Override - protected void entityInit() - { - super.entityInit(); - this.dataWatcher.addObject(16, Integer.valueOf(0)); - this.dataWatcher.addObject(17, Byte.valueOf((byte)0)); - } - - - /** - * Returns true if the newer Entity AI code should be run - */ - @Override - public boolean isAIEnabled() - { - return true; - } - - /** - * Determines if an entity can be despawned, used on idle far away entities - */ - @Override - protected boolean canDespawn() - { - return false; - } - - - /** - * main AI tick function, replaces updateEntityActionState - */ - @Override - protected void updateAITick() - { - if (--this.randomTickDivider <= 0) - { - this.randomTickDivider = 70 + this.rand.nextInt(50); - - // check if we're near a quest grove and if so, set that as home - int chunkX = MathHelper.floor_double(this.posX) / 16; - int chunkZ = MathHelper.floor_double(this.posZ) / 16; - - TFFeature nearFeature = TFFeature.getNearestFeature(chunkX, chunkZ, this.worldObj); - - if (nearFeature != TFFeature.questGrove) - { - this.detachHome(); - } - else - { - // set our home position to the center of the quest grove - ChunkCoordinates cc = TFFeature.getNearestCenterXYZ(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.posZ), worldObj); - this.setHomeArea(cc.posX, cc.posY, cc.posZ, 13); - - //System.out.println("Set home area to " + cc.posX + ", " + cc.posY + ", " + cc.posZ); - } - - // do we need to reward the player? - if (countColorsSet() > 15 && !getRewarded()) { - rewardQuest(); - setRewarded(true); - } - - } - - super.updateAITick(); - } - - /** - * Pay out! - */ - private void rewardQuest() { - func_145778_a(Item.getItemFromBlock(Blocks.diamond_block), 1, 1.0F); - func_145778_a(Item.getItemFromBlock(Blocks.iron_block), 1, 1.0F); - func_145778_a(Item.getItemFromBlock(Blocks.emerald_block), 1, 1.0F); - func_145778_a(Item.getItemFromBlock(Blocks.gold_block), 1, 1.0F); - func_145778_a(Item.getItemFromBlock(Blocks.lapis_block), 1, 1.0F); - func_145778_a(TFItems.crumbleHorn, 1, 1.0F); - - rewardNearbyPlayers(this.worldObj, this.posX, this.posY, this.posZ); - } - - /** - * Give achievement to nearby players - */ - @SuppressWarnings("unchecked") - private void rewardNearbyPlayers(World world, double posX, double posY, double posZ) { - // scan for players nearby to give the achievement - List nearbyPlayers = world.getEntitiesWithinAABB(EntityPlayer.class, AxisAlignedBB.getBoundingBox(posX, posY, posZ, posX + 1, posY + 1, posZ + 1).expand(16.0D, 16.0D, 16.0D)); - - for (EntityPlayer player : nearbyPlayers) { - player.triggerAchievement(TFAchievementPage.twilightQuestRam); - } - } - - /** - * Called when a player interacts with a mob. e.g. gets milk from a cow, gets into the saddle on a pig. - */ - @Override - public boolean interact(EntityPlayer par1EntityPlayer) - { - ItemStack currentItem = par1EntityPlayer.inventory.getCurrentItem(); - - if (currentItem != null && currentItem.getItem() == Item.getItemFromBlock(Blocks.wool) && !isColorPresent(currentItem.getItemDamage())) - { -// par1EntityPlayer.inventory.setInventorySlotContents(par1EntityPlayer.inventory.currentItem, new ItemStack(Items.bucketMilk)); - this.setColorPresent(currentItem.getItemDamage()); - this.animateAddColor(currentItem.getItemDamage(), 50); - - if (!par1EntityPlayer.capabilities.isCreativeMode) - { - --currentItem.stackSize; - - if (currentItem.stackSize <= 0) - { - par1EntityPlayer.inventory.setInventorySlotContents(par1EntityPlayer.inventory.currentItem, (ItemStack)null); - } - } - - //par1EntityPlayer.addChatMessage("Successfully used color " + currentItem.getItemDamage()); - //par1EntityPlayer.addChatMessage("Color flags are now " + Integer.toBinaryString(this.getColorFlags())); - return true; - } - else - { - return super.interact(par1EntityPlayer); - } - } - - - /** - * Called frequently so the entity can update its state every tick as required. For example, zombies and skeletons - * use this to react to sunlight and start to burn. - */ - @Override - public void onLivingUpdate() - { - super.onLivingUpdate(); - -// for (int var1 = 0; var1 < 2; ++var1) -// { -// this.worldObj.spawnParticle("mobSpell", this.posX + (this.rand.nextDouble() - 0.5D) * (double)this.width, this.posY + this.rand.nextDouble() * (double)this.height, this.posZ + (this.rand.nextDouble() - 0.5D) * (double)this.width, 0.44, 0.625, this.rand.nextDouble()); -// } - checkAndAnimateColors(); - } - - - /** - * Called every tick. If we have got all the colors and have not paid out the reward yet, do a colorful animation. - */ - public void checkAndAnimateColors() { - if (countColorsSet() > 15 && !getRewarded()) { - animateAddColor(this.rand.nextInt(16), 5); - } - } - - /** - * (abstract) Protected helper method to write subclass entity data to NBT. - */ - @Override - public void writeEntityToNBT(NBTTagCompound par1NBTTagCompound) - { - super.writeEntityToNBT(par1NBTTagCompound); - par1NBTTagCompound.setInteger("ColorFlags", this.getColorFlags()); - par1NBTTagCompound.setBoolean("Rewarded", this.getRewarded()); - } - - /** - * (abstract) Protected helper method to read subclass entity data from NBT. - */ - @Override - public void readEntityFromNBT(NBTTagCompound par1NBTTagCompound) - { - super.readEntityFromNBT(par1NBTTagCompound); - this.setColorFlags(par1NBTTagCompound.getInteger("ColorFlags")); - this.setRewarded(par1NBTTagCompound.getBoolean("Rewarded")); - } - - /** - * Returns an int representing which of the 16 colors this ram currently has - */ - public int getColorFlags() - { - return this.dataWatcher.getWatchableObjectInt(16); - } - - /** - * Sets the color flags int - */ - public void setColorFlags(int par1) - { - this.dataWatcher.updateObject(16, Integer.valueOf(par1)); - } - - /** - * @param color - * @return true if the specified color is marked present - */ - public boolean isColorPresent(int color) { - int flags = this.getColorFlags(); - - return (flags & (int)Math.pow(2, color)) > 0; - } - - public void setColorPresent(int color) { - int flags = this.getColorFlags(); - -// System.out.println("Setting color flag for color " + color); -// System.out.println("Color int is " + flags); -// System.out.println("ORing that with " + Math.pow(2, color) + " which is " + Integer.toBinaryString((int) Math.pow(2, color))); - - setColorFlags(flags | (int)Math.pow(2, color)); - } - - /** - * Have we paid out the reward yet? - */ - public boolean getRewarded() - { - return this.dataWatcher.getWatchableObjectByte(17) != (byte)0; - } - - /** - * Sets whether we have paid the quest reward yet - */ - public void setRewarded(boolean par1) - { - this.dataWatcher.updateObject(17, par1 ? Byte.valueOf((byte)1) : Byte.valueOf((byte)0)); - } - - - - /** - * Do a little animation for when we successfully add a new color - * @param color - */ - public void animateAddColor(int color, int iterations) { - //EntitySheep.fleeceColorTable[i][0] - - for (int i = 0; i < iterations; i++) { - this.worldObj.spawnParticle("mobSpell", this.posX + (this.rand.nextDouble() - 0.5D) * this.width * 1.5, this.posY + this.rand.nextDouble() * this.height * 1.5, this.posZ + (this.rand.nextDouble() - 0.5D) * this.width * 1.5, EntitySheep.fleeceColorTable[color][0], EntitySheep.fleeceColorTable[color][1], EntitySheep.fleeceColorTable[color][2]); - } - - //TODO: it would be nice to play a custom sound - playLivingSound(); - } - - /** - * - * @return how many colors are present currently - */ - public int countColorsSet() { - int count = 0; - - for (int i = 0; i < 16; i++) { - if (isColorPresent(i)) { - count++; - } - } - - return count; - } - - - - - /** - * Plays living's sound at its position - */ - @Override - public void playLivingSound() - { - this.worldObj.playSoundAtEntity(this, "mob.sheep.say", this.getSoundVolume(), this.getSoundPitch()); - } - - /** - * Returns the volume for the sounds this mob makes. - */ - @Override - protected float getSoundVolume() - { - return 5.0F; - } - - /** - * Gets the pitch of living sounds in living entities. - */ - @Override - protected float getSoundPitch() - { - return (this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F + 0.7F; - } - - /** - * Returns the sound this mob makes while it's alive. - */ - protected String getLivingSound() - { - return "mob.sheep.say"; - } - - /** - * Returns the sound this mob makes when it is hurt. - */ - protected String getHurtSound() - { - return "mob.sheep.say"; - } - - /** - * Returns the sound this mob makes on death. - */ - protected String getDeathSound() - { - return "mob.sheep.say"; - } - - protected void func_145780_a(int p_145780_1_, int p_145780_2_, int p_145780_3_, Block p_145780_4_) - { - this.playSound("mob.sheep.step", 0.15F, 1.0F); - } - - public float getMaximumHomeDistance() - { - return this.func_110174_bM(); - } -} diff --git a/src/main/java/twilightforest/entity/passive/EntityTFRaven.java b/src/main/java/twilightforest/entity/passive/EntityTFRaven.java deleted file mode 100644 index b9d5d3545f..0000000000 --- a/src/main/java/twilightforest/entity/passive/EntityTFRaven.java +++ /dev/null @@ -1,126 +0,0 @@ -package twilightforest.entity.passive; - -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.ai.EntityAILookIdle; -import net.minecraft.entity.ai.EntityAIPanic; -import net.minecraft.entity.ai.EntityAISwimming; -import net.minecraft.entity.ai.EntityAITempt; -import net.minecraft.entity.ai.EntityAIWander; -import net.minecraft.entity.ai.EntityAIWatchClosest; -import net.minecraft.entity.ai.EntityLookHelper; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Items; -import net.minecraft.item.Item; -import net.minecraft.world.World; -import twilightforest.TwilightForestMod; -import twilightforest.entity.ai.EntityTFRavenLookHelper; -import twilightforest.item.TFItems; - - -public class EntityTFRaven extends EntityTFTinyBird { - - EntityTFRavenLookHelper ravenLook = new EntityTFRavenLookHelper(this); - - public EntityTFRaven(World par1World) { - super(par1World); - //texture = TwilightForestMod.MODEL_DIR + "raven.png"; - - this.setSize(0.3F, 0.7F); - - // maybe this will help them move cuter? - this.stepHeight = 1; - - // bird AI - this.getNavigator().setAvoidsWater(true); - this.tasks.addTask(0, new EntityAISwimming(this)); - this.tasks.addTask(1, new EntityAIPanic(this, 1.5F)); - this.tasks.addTask(2, new EntityAITempt(this, 0.85F, Items.wheat_seeds, true)); -// this.tasks.addTask(3, new EntityAIAvoidEntity(this, EntityPlayer.class, 2.0F, 0.23F, 0.4F)); -// this.tasks.addTask(4, new EntityAITFBirdFly(this, 0.25F)); - this.tasks.addTask(5, new EntityAIWander(this, 1.0F)); - this.tasks.addTask(6, new EntityAIWatchClosest(this, EntityPlayer.class, 6F)); - this.tasks.addTask(7, new EntityAILookIdle(this)); - } - - /** - * Set monster attributes - */ - @Override - protected void applyEntityAttributes() - { - super.applyEntityAttributes(); - this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(10.0D); // max health - this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.20000001192092896D); - } - - /** - * We have our own getLookHelper - */ - @Override - protected void updateAITasks() { - super.updateAITasks(); - this.ravenLook.onUpdateLook(); - } - - /** - * We have our own getLookHelper - */ - @Override - public EntityLookHelper getLookHelper() - { - return this.ravenLook; - } - - /** - * Returns the sound this mob makes while it's alive. - */ - @Override - protected String getLivingSound() - { - return TwilightForestMod.ID + ":mob.raven.caw"; - } - - /** - * Returns the sound this mob makes when it is hurt. - */ - @Override - protected String getHurtSound() - { - return TwilightForestMod.ID + ":mob.raven.squawk"; - } - - /** - * Returns the sound this mob makes on death. - */ - @Override - protected String getDeathSound() - { - return TwilightForestMod.ID + ":mob.raven.squawk"; - } - - /** - * Returns the item ID for the item the mob drops on death. - */ - @Override - protected Item getDropItem() - { - return TFItems.feather; - } - - /** - * Actually only used for the shadow - */ - @Override - public float getRenderSizeModifier() { - return 0.3F; - } - - - /** - * Return true if the bird is spooked - */ - public boolean isSpooked() { - return this.hurtTime > 0; - } - -} diff --git a/src/main/java/twilightforest/entity/passive/EntityTFSquirrel.java b/src/main/java/twilightforest/entity/passive/EntityTFSquirrel.java deleted file mode 100644 index 34d53efdf0..0000000000 --- a/src/main/java/twilightforest/entity/passive/EntityTFSquirrel.java +++ /dev/null @@ -1,119 +0,0 @@ -package twilightforest.entity.passive; - -import net.minecraft.block.material.Material; -import net.minecraft.entity.EntityCreature; -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.ai.EntityAIAvoidEntity; -import net.minecraft.entity.ai.EntityAILookIdle; -import net.minecraft.entity.ai.EntityAIPanic; -import net.minecraft.entity.ai.EntityAISwimming; -import net.minecraft.entity.ai.EntityAITempt; -import net.minecraft.entity.ai.EntityAIWander; -import net.minecraft.entity.ai.EntityAIWatchClosest; -import net.minecraft.entity.passive.IAnimals; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Items; -import net.minecraft.util.DamageSource; -import net.minecraft.world.World; -import twilightforest.TFAchievementPage; - - -public class EntityTFSquirrel extends EntityCreature implements IAnimals { - - public EntityTFSquirrel(World par1World) { - super(par1World); - - this.setSize(0.3F, 0.7F); - - // maybe this will help them move cuter? - this.stepHeight = 1; - - // squirrel AI - this.getNavigator().setAvoidsWater(true); - this.tasks.addTask(0, new EntityAISwimming(this)); - this.tasks.addTask(1, new EntityAIPanic(this, 1.38F)); - this.tasks.addTask(2, new EntityAITempt(this, 1.0F, Items.wheat_seeds, true)); - this.tasks.addTask(3, new EntityAIAvoidEntity(this, EntityPlayer.class, 2.0F, 0.8F, 1.4F)); - this.tasks.addTask(5, new EntityAIWander(this, 1.0F)); - this.tasks.addTask(6, new EntityAIWander(this, 1.25F)); - this.tasks.addTask(7, new EntityAIWatchClosest(this, EntityPlayer.class, 6F)); - this.tasks.addTask(8, new EntityAILookIdle(this)); - - } - - /** - * Set monster attributes - */ - @Override - protected void applyEntityAttributes() - { - super.applyEntityAttributes(); - this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(1.0D); // max health - this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.3D); - } - - /** - * Called when the mob is falling. Calculates and applies fall damage. - * TODO: maybe they should just take less damage? - */ - @Override - protected void fall(float par1) {} - - /** - * Returns true if the newer Entity AI code should be run - */ - @Override - public boolean isAIEnabled() { - return true; - } - - /** - * Actually only used for the shadow - */ - @Override - public float getRenderSizeModifier() { - return 0.3F; - } - - /** - * Takes a coordinate in and returns a weight to determine how likely this creature will try to path to the block. - * Args: x, y, z - */ - @Override - public float getBlockPathWeight(int par1, int par2, int par3) - { - // prefer standing on leaves - Material underMaterial = this.worldObj.getBlock(par1, par2 - 1, par3).getMaterial(); - if (underMaterial == Material.leaves) { - return 12.0F; - } - if (underMaterial == Material.wood) { - return 15.0F; - } - if (underMaterial == Material.grass) { - return 10.0F; - } - // default to just prefering lighter areas - return this.worldObj.getLightBrightness(par1, par2, par3) - 0.5F; - } - - /** - * Determines if an entity can be despawned, used on idle far away entities - */ - @Override - protected boolean canDespawn() - { - return false; - } - - /** - * Trigger achievement when killed - */ - @Override - public void onDeath(DamageSource par1DamageSource) { - super.onDeath(par1DamageSource); - if (par1DamageSource.getSourceOfDamage() instanceof EntityPlayer) { - ((EntityPlayer)par1DamageSource.getSourceOfDamage()).triggerAchievement(TFAchievementPage.twilightHunter); - } - } -} diff --git a/src/main/java/twilightforest/entity/passive/EntityTFTinyBird.java b/src/main/java/twilightforest/entity/passive/EntityTFTinyBird.java deleted file mode 100644 index 0fc2b2ee2e..0000000000 --- a/src/main/java/twilightforest/entity/passive/EntityTFTinyBird.java +++ /dev/null @@ -1,353 +0,0 @@ -package twilightforest.entity.passive; - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.entity.Entity; -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.ai.EntityAILookIdle; -import net.minecraft.entity.ai.EntityAITempt; -import net.minecraft.entity.ai.EntityAIWander; -import net.minecraft.entity.ai.EntityAIWatchClosest; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.init.Items; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.ChunkCoordinates; -import net.minecraft.util.DamageSource; -import net.minecraft.util.MathHelper; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; -import twilightforest.TFAchievementPage; -import twilightforest.TwilightForestMod; -import twilightforest.entity.ai.EntityAITFBirdFly; - - -public class EntityTFTinyBird extends EntityTFBird { - - private static final int DATA_BIRDTYPE = 16; - private static final int DATA_BIRDFLAGS = 17; - - /** - * randomly selected ChunkCoordinates in a 7x6x7 box around the bat (y offset -2 to 4) towards which it will fly. - * upon getting close a new target will be selected - */ - private ChunkCoordinates currentFlightTarget; - private int currentFlightTime; - - public EntityTFTinyBird(World par1World) { - super(par1World); - //texture = TwilightForestMod.MODEL_DIR + "tinybirdbrown.png"; - - this.setSize(0.5F, 0.9F); - - // maybe this will help them move cuter? - //this.stepHeight = 2; - - // bird AI - this.getNavigator().setAvoidsWater(true); - this.tasks.addTask(0, new EntityAITFBirdFly(this)); - this.tasks.addTask(1, new EntityAITempt(this, 1.0F, Items.wheat_seeds, true)); - this.tasks.addTask(2, new EntityAIWander(this, 1.0F)); - this.tasks.addTask(3, new EntityAIWatchClosest(this, EntityPlayer.class, 6F)); - this.tasks.addTask(4, new EntityAILookIdle(this)); - - // random color - setBirdType(rand.nextInt(4)); - - setIsBirdLanded(true); - } - - @Override - protected void entityInit() - { - super.entityInit(); - this.dataWatcher.addObject(DATA_BIRDTYPE, Byte.valueOf((byte)0)); - this.dataWatcher.addObject(DATA_BIRDFLAGS, Byte.valueOf((byte)0)); - } - - /** - * Set monster attributes - */ - @Override - protected void applyEntityAttributes() - { - super.applyEntityAttributes(); - this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(1.0D); // max health - this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.20000001192092896D); - } - -// /** -// * Returns the texture's file path as a String. -// */ -// @Override -// public String getTexture() -// { -// switch (this.getBirdType()) -// { -// case 0: -// return TwilightForestMod.MODEL_DIR + "tinybirdbrown.png"; -// -// case 1: -// return TwilightForestMod.MODEL_DIR + "tinybirdblue.png"; -// -// case 2: -// return TwilightForestMod.MODEL_DIR + "tinybirdred.png"; -// -// case 3: -// return TwilightForestMod.MODEL_DIR + "tinybirdgold.png"; -// -// default: -// return super.getTexture(); -// } -// } - - /** - * (abstract) Protected helper method to write subclass entity data to NBT. - */ - @Override - public void writeEntityToNBT(NBTTagCompound par1NBTTagCompound) - { - super.writeEntityToNBT(par1NBTTagCompound); - par1NBTTagCompound.setInteger("BirdType", this.getBirdType()); - } - - /** - * (abstract) Protected helper method to read subclass entity data from NBT. - */ - @Override - public void readEntityFromNBT(NBTTagCompound par1NBTTagCompound) - { - super.readEntityFromNBT(par1NBTTagCompound); - this.setBirdType(par1NBTTagCompound.getInteger("BirdType")); - } - - public int getBirdType() - { - return this.dataWatcher.getWatchableObjectByte(16); - } - - public void setBirdType(int par1) - { - this.dataWatcher.updateObject(DATA_BIRDTYPE, Byte.valueOf((byte)par1)); - } - - /** - * Returns the sound this mob makes while it's alive. - */ - @Override - protected String getLivingSound() - { - return TwilightForestMod.ID + ":mob.tinybird.chirp"; - } - - /** - * Returns the sound this mob makes when it is hurt. - */ - @Override - protected String getHurtSound() - { - return TwilightForestMod.ID + ":mob.tinybird.hurt"; - } - - /** - * Returns the sound this mob makes on death. - */ - @Override - protected String getDeathSound() - { - return TwilightForestMod.ID + ":mob.tinybird.hurt"; - } - - /** - * Actually only used for the shadow - */ - @Override - public float getRenderSizeModifier() { - return 0.3F; - } - - /** - * Determines if an entity can be despawned, used on idle far away entities - */ - @Override - protected boolean canDespawn() - { - return false; - } - - /** - * Takes a coordinate in and returns a weight to determine how likely this creature will try to path to the block. - * Args: x, y, z - */ - @Override - public float getBlockPathWeight(int par1, int par2, int par3) - { - // prefer standing on leaves - Material underMaterial = this.worldObj.getBlock(par1, par2 - 1, par3).getMaterial(); - if (underMaterial == Material.leaves) { - return 200.0F; - } - if (underMaterial == Material.wood) { - return 15.0F; - } - if (underMaterial == Material.grass) { - return 9.0F; - } - // default to just prefering lighter areas - return this.worldObj.getLightBrightness(par1, par2, par3) - 0.5F; - } - - /** - * Trigger achievement when killed - */ - @Override - public void onDeath(DamageSource par1DamageSource) { - super.onDeath(par1DamageSource); - if (par1DamageSource.getSourceOfDamage() instanceof EntityPlayer) { - ((EntityPlayer)par1DamageSource.getSourceOfDamage()).triggerAchievement(TFAchievementPage.twilightHunter); - } - } - - /** - * Called to update the entity's position/logic. - */ - public void onUpdate() - { - super.onUpdate(); - - // while we are flying, try to level out somewhat - if (!this.isBirdLanded()) - { - this.motionY *= 0.6000000238418579D; - } - - - } - - protected void updateAITasks() - { - super.updateAITasks(); - - if (this.isBirdLanded()) - { - this.currentFlightTime = 0; - - if (this.rand.nextInt(200) == 0 && !isLandableBlock(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.posY - 1), MathHelper.floor_double(this.posZ))) - { - this.setIsBirdLanded(false); - this.worldObj.playAuxSFXAtEntity((EntityPlayer)null, 1015, (int)this.posX, (int)this.posY, (int)this.posZ, 0); - this.motionY = 0.4; - //FMLLog.info("bird taking off because it is no longer on land"); - } - else - { - if (isSpooked()) - { - this.setIsBirdLanded(false); - this.motionY = 0.4; - this.worldObj.playAuxSFXAtEntity((EntityPlayer)null, 1015, (int)this.posX, (int)this.posY, (int)this.posZ, 0); - //FMLLog.info("bird taking off because it was spooked"); - } - } - } - else - { - this.currentFlightTime++; - - if (this.currentFlightTarget != null && (!this.worldObj.isAirBlock(this.currentFlightTarget.posX, this.currentFlightTarget.posY, this.currentFlightTarget.posZ) || this.currentFlightTarget.posY < 1)) - { - this.currentFlightTarget = null; - } - - if (this.currentFlightTarget == null || this.rand.nextInt(30) == 0 || this.currentFlightTarget.getDistanceSquared((int)this.posX, (int)this.posY, (int)this.posZ) < 4.0F) - { - int yTarget = this.currentFlightTime < 100 ? 2 : 4; - - this.currentFlightTarget = new ChunkCoordinates((int)this.posX + this.rand.nextInt(7) - this.rand.nextInt(7), (int)this.posY + this.rand.nextInt(6) - yTarget, (int)this.posZ + this.rand.nextInt(7) - this.rand.nextInt(7)); - } - - double d0 = (double)this.currentFlightTarget.posX + 0.5D - this.posX; - double d1 = (double)this.currentFlightTarget.posY + 0.1D - this.posY; - double d2 = (double)this.currentFlightTarget.posZ + 0.5D - this.posZ; - this.motionX += (Math.signum(d0) * 0.5D - this.motionX) * 0.10000000149011612D; - this.motionY += (Math.signum(d1) * 0.699999988079071D - this.motionY) * 0.10000000149011612D; - this.motionZ += (Math.signum(d2) * 0.5D - this.motionZ) * 0.10000000149011612D; - float f = (float)(Math.atan2(this.motionZ, this.motionX) * 180.0D / Math.PI) - 90.0F; - float f1 = MathHelper.wrapAngleTo180_float(f - this.rotationYaw); - this.moveForward = 0.5F; - this.rotationYaw += f1; - - - if (this.rand.nextInt(10) == 0 && isLandableBlock(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.posY - 1), MathHelper.floor_double(this.posZ))) - { - - - this.setIsBirdLanded(true); - - this.motionY = 0; - - //this.posY = MathHelper.floor_double(posY); - //FMLLog.info("bird landing"); - } - } - } - - /** - * Return true if the bird is spooked - */ - public boolean isSpooked() { - EntityPlayer closestPlayer = this.worldObj.getClosestPlayerToEntity(this, 4.0D); - - return this.hurtTime > 0 || (closestPlayer != null && (closestPlayer.inventory.getCurrentItem() == null || closestPlayer.inventory.getCurrentItem().getItem() != Items.wheat_seeds)); - } - - - /** - * Can the bird land here? - */ - public boolean isLandableBlock(int x, int y, int z) - { - Block block = this.worldObj.getBlock(x, y, z); - - if (block == Blocks.air) - { - return false; - } - else - { - return block.isLeaves(worldObj, x, y, z) || block.isSideSolid(worldObj, x, y, z, ForgeDirection.UP); - } - } - - - public boolean isBirdLanded() - { - return (this.dataWatcher.getWatchableObjectByte(DATA_BIRDFLAGS) & 1) != 0; - } - - public void setIsBirdLanded(boolean par1) - { - byte b0 = this.dataWatcher.getWatchableObjectByte(DATA_BIRDFLAGS); - - if (par1) - { - this.dataWatcher.updateObject(DATA_BIRDFLAGS, Byte.valueOf((byte)(b0 | 1))); - } - else - { - this.dataWatcher.updateObject(DATA_BIRDFLAGS, Byte.valueOf((byte)(b0 & -2))); - } - } - - /** - * Returns true if this entity should push and be pushed by other entities when colliding. - */ - public boolean canBePushed() - { - return false; - } - - protected void collideWithEntity(Entity par1Entity) {} - - protected void func_85033_bc() {} -} diff --git a/src/main/java/twilightforest/entity/passive/EntityTFTinyFirefly.java b/src/main/java/twilightforest/entity/passive/EntityTFTinyFirefly.java deleted file mode 100644 index bde7f53122..0000000000 --- a/src/main/java/twilightforest/entity/passive/EntityTFTinyFirefly.java +++ /dev/null @@ -1,66 +0,0 @@ -package twilightforest.entity.passive; - -import net.minecraft.entity.effect.EntityWeatherEffect; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.world.World; - - -public class EntityTFTinyFirefly extends EntityWeatherEffect { - - int lifeTime; - int halfLife; - - public float glowSize; - - public EntityTFTinyFirefly(World world, double d, double d1, double d2) { - super(world); - setLocationAndAngles(d, d1, d2, 0.0F, 0.0F); - - lifeTime = 10 + rand.nextInt(21); - halfLife = lifeTime / 2; - - glowSize = 0.2f + (rand.nextFloat() * 0.6f); - } - - @Override - public void onUpdate() - { - super.onUpdate(); - - if (lifeTime <= 1) { - setDead(); - } else { - lifeTime--; - } - - } - - public float getGlowBrightness() { - if (lifeTime <= halfLife) { - return (float)lifeTime / (float)halfLife; - } else { - return 1.0f - (((float)lifeTime - halfLife) / halfLife); - } - } - - - - @Override - protected void entityInit() { - // TODO Auto-generated method stub - - } - - @Override - protected void readEntityFromNBT(NBTTagCompound nbttagcompound) { - // TODO Auto-generated method stub - - } - - @Override - protected void writeEntityToNBT(NBTTagCompound nbttagcompound) { - // TODO Auto-generated method stub - - } - -} diff --git a/src/main/java/twilightforest/entity/passive/FlyingBird.java b/src/main/java/twilightforest/entity/passive/FlyingBird.java new file mode 100644 index 0000000000..ec68011446 --- /dev/null +++ b/src/main/java/twilightforest/entity/passive/FlyingBird.java @@ -0,0 +1,189 @@ +package twilightforest.entity.passive; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.network.syncher.EntityDataAccessor; +import net.minecraft.network.syncher.EntityDataSerializers; +import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.tags.BlockTags; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.goal.*; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.phys.Vec3; +import twilightforest.init.TFSounds; + +//flying logic moved out of TinyBird, put here instead. +//had to migrate this code because for some odd reason, ravens extend TinyBird, and fail to save the variant because they dont have them +public abstract class FlyingBird extends Bird { + + private static final EntityDataAccessor DATA_BIRDFLAGS = SynchedEntityData.defineId(FlyingBird.class, EntityDataSerializers.BYTE); + + // [VanillaCopy] Bat field + private BlockPos targetPosition; + private int currentFlightTime; + + public FlyingBird(EntityType entity, Level world) { + super(entity, world); + this.setIsBirdLanded(true); + this.setAge(0); + } + + @Override + protected void defineSynchedData() { + super.defineSynchedData(); + this.getEntityData().define(DATA_BIRDFLAGS, (byte) 0); + } + + @Override + protected void registerGoals() { + super.registerGoals(); + this.goalSelector.addGoal(0, new FloatGoal(this)); + this.goalSelector.addGoal(0, new PanicGoal(this, 1.5F)); + this.goalSelector.addGoal(3, new TemptGoal(this, 1.0F, SEEDS, true)); + this.goalSelector.addGoal(5, new WaterAvoidingRandomStrollGoal(this, 1.0D)); + this.goalSelector.addGoal(6, new LookAtPlayerGoal(this, Player.class, 6F)); + this.goalSelector.addGoal(7, new RandomLookAroundGoal(this)); + } + + @Override + public float getStepHeight() { + return 1.0F; + } + + @Override + public float getWalkTargetValue(BlockPos pos) { + // prefer standing on leaves + Material underMaterial = this.getLevel().getBlockState(pos.below()).getMaterial(); + if (underMaterial == Material.LEAVES) { + return 200.0F; + } + if (underMaterial == Material.WOOD) { + return 15.0F; + } + if (underMaterial == Material.GRASS) { + return 9.0F; + } + // default to just preferring lighter areas + return this.getLevel().getMaxLocalRawBrightness(pos) - 0.5F; + } + + @Override + public void tick() { + super.tick(); + // while we are flying, try to level out somewhat + if (!this.isBirdLanded()) { + this.setDeltaMovement(this.getDeltaMovement().multiply(1.0F, 0.6D, 1.0F)); + } + } + + @Override + protected void customServerAiStep() { + super.customServerAiStep(); + + if (this.isBirdLanded()) { + this.currentFlightTime = 0; + + boolean flag = this.isSilent(); + if (this.isSpooked() || this.isInWater() || !this.getLevel().getBlockState(this.blockPosition().below()).getFluidState().isEmpty() || (this.getRandom().nextInt(200) == 0 && !this.isLandableBlock(this.blockPosition().below()))) { + this.setIsBirdLanded(false); + if (!flag) { + this.playSound(TFSounds.TINY_BIRD_TAKEOFF.get(), 0.05F, this.getVoicePitch()); + } + } + } else { + this.currentFlightTime++; + + // [VanillaCopy] Modified version of last half of Bat.customServerAiStep(). Edits noted + if (this.targetPosition != null && (!this.getLevel().isEmptyBlock(this.targetPosition) || this.targetPosition.getY() <= this.getLevel().getMinBuildHeight())) { + this.targetPosition = null; + } + + //TF - no drowning birds + if (this.isInWater() || !this.getLevel().getBlockState(this.blockPosition().below()).getFluidState().isEmpty()) { + this.currentFlightTime = 0; // reset timer for MAX FLIGHT :v + this.setDeltaMovement(this.getDeltaMovement().x(), 0.1F, this.getDeltaMovement().z()); + } + + if (this.targetPosition == null || this.getRandom().nextInt(30) == 0 || this.targetPosition.closerToCenterThan(this.position(), 2.0D)) { + // TF - modify shift factor of Y + int yTarget = this.currentFlightTime < 100 ? 2 : 4; + this.targetPosition = BlockPos.containing( + this.getX() + (double) this.getRandom().nextInt(7) - (double) this.getRandom().nextInt(7), + this.getY() + (double) this.getRandom().nextInt(6) - yTarget, + this.getZ() + (double) this.getRandom().nextInt(7) - (double) this.getRandom().nextInt(7)); + } + + double d2 = (double) this.targetPosition.getX() + 0.5D - this.getX(); + double d0 = (double) this.targetPosition.getY() + 0.1D - this.getY(); + double d1 = (double) this.targetPosition.getZ() + 0.5D - this.getZ(); + Vec3 vec3 = this.getDeltaMovement(); + Vec3 vec31 = vec3.add((Math.signum(d2) * 0.5D - vec3.x()) * (double) 0.1F, (Math.signum(d0) * (double) 0.7F - vec3.y()) * (double) 0.1F, (Math.signum(d1) * 0.5D - vec3.z()) * (double) 0.1F); + this.setDeltaMovement(vec31); + float f = (float) (Mth.atan2(vec31.z(), vec31.x()) * (double) (180F / (float) Math.PI)) - 90.0F; + float f1 = Mth.wrapDegrees(f - this.getYRot()); + this.zza = 0.5F; + this.setYRot(this.getYRot() + f1); + // TF - change chance 100 -> 10; change check to isLandable + if (this.getRandom().nextInt(10) == 0 && this.isLandableBlock(this.blockPosition().below())) { + //TF - land the bird + this.setIsBirdLanded(true); + this.setDeltaMovement(this.getDeltaMovement().multiply(1.0F, 0.0F, 1.0F)); + } + // End copy + } + } + + public boolean isLandableBlock(BlockPos pos) { + BlockState state = this.getLevel().getBlockState(pos); + return !state.isAir() + && (state.is(BlockTags.LEAVES) || state.isFaceSturdy(this.getLevel(), pos, Direction.UP)); + } + + @Override + public boolean isBirdLanded() { + return (this.getEntityData().get(DATA_BIRDFLAGS) & 1) != 0; + } + + public void setIsBirdLanded(boolean landed) { + byte flags = this.getEntityData().get(DATA_BIRDFLAGS); + this.getEntityData().set(DATA_BIRDFLAGS, (byte) (landed ? flags | 1 : flags & ~1)); + } + + @Override + public boolean isPushable() { + return false; + } + + @Override + protected void doPush(Entity entity) { + } + + @Override + public boolean isIgnoringBlockTriggers() { + return true; + } + + @Override + protected boolean canRide(Entity entity) { + return false; + } + + @Override + protected void pushEntities() { + } + + @Override + public boolean isBaby() { + return false; + } + + public abstract boolean isSpooked(); +} diff --git a/src/main/java/twilightforest/entity/passive/Penguin.java b/src/main/java/twilightforest/entity/passive/Penguin.java new file mode 100644 index 0000000000..66e33b7687 --- /dev/null +++ b/src/main/java/twilightforest/entity/passive/Penguin.java @@ -0,0 +1,65 @@ +package twilightforest.entity.passive; + +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.RandomSource; +import net.minecraft.world.entity.AgeableMob; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.MobSpawnType; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.goal.*; +import net.minecraft.world.entity.animal.Animal; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import twilightforest.data.tags.BlockTagGenerator; +import twilightforest.init.TFEntities; + +public class Penguin extends Bird { + public Penguin(EntityType type, Level world) { + super(type, world); + } + + @Override + protected void registerGoals() { + goalSelector.addGoal(0, new FloatGoal(this)); + goalSelector.addGoal(1, new PanicGoal(this, 1.75F)); + goalSelector.addGoal(2, new BreedGoal(this, 1.0F)); + goalSelector.addGoal(3, new TemptGoal(this, 0.75F, Ingredient.of(Items.COD), false)); + goalSelector.addGoal(4, new FollowParentGoal(this, 1.15F)); + goalSelector.addGoal(5, new RandomStrollGoal(this, 1.0F)); + goalSelector.addGoal(6, new LookAtPlayerGoal(this, Player.class, 6F)); + goalSelector.addGoal(7, new LookAtPlayerGoal(this, Penguin.class, 5F, 0.02F)); + goalSelector.addGoal(8, new RandomLookAroundGoal(this)); + } + + @Override + public Animal getBreedOffspring(ServerLevel level, AgeableMob ageableMob) { + return TFEntities.PENGUIN.get().create(level); + } + + @Override + public boolean isFood(ItemStack stack) { + return stack.is(Items.COD); + } + + public static AttributeSupplier.Builder registerAttributes() { + return Mob.createMobAttributes() + .add(Attributes.MAX_HEALTH, 10.0D) + .add(Attributes.MOVEMENT_SPEED, 0.2D); + } + + @Override + public boolean checkSpawnRules(LevelAccessor accessor, MobSpawnType type) { + return true; + } + + public static boolean canSpawn(EntityType type, LevelAccessor accessor, MobSpawnType reason, BlockPos pos, RandomSource rand) { + return accessor.getBlockState(pos.below()).is(BlockTagGenerator.PENGUINS_SPAWNABLE_ON); + } +} diff --git a/src/main/java/twilightforest/entity/passive/QuestRam.java b/src/main/java/twilightforest/entity/passive/QuestRam.java new file mode 100644 index 0000000000..4cde2cc697 --- /dev/null +++ b/src/main/java/twilightforest/entity/passive/QuestRam.java @@ -0,0 +1,290 @@ +package twilightforest.entity.passive; + +import it.unimi.dsi.fastutil.objects.ObjectArrayList; +import net.minecraft.core.BlockPos; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.syncher.EntityDataAccessor; +import net.minecraft.network.syncher.EntityDataSerializers; +import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.tags.ItemTags; +import net.minecraft.world.DifficultyInstance; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.*; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.goal.*; +import net.minecraft.world.entity.animal.Animal; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.DyeColor; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.ServerLevelAccessor; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.network.PacketDistributor; +import org.jetbrains.annotations.Nullable; +import twilightforest.advancements.TFAdvancements; +import twilightforest.entity.EnforcedHomePoint; +import twilightforest.entity.ai.goal.QuestRamEatWoolGoal; +import twilightforest.init.TFSounds; +import twilightforest.loot.TFLootTables; +import twilightforest.network.ParticlePacket; +import twilightforest.network.TFPacketHandler; + +public class QuestRam extends Animal implements EnforcedHomePoint { + + private static final EntityDataAccessor DATA_COLOR = SynchedEntityData.defineId(QuestRam.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_REWARDED = SynchedEntityData.defineId(QuestRam.class, EntityDataSerializers.BOOLEAN); + + private int randomTickDivider; + + public QuestRam(EntityType type, Level level) { + super(type, level); + this.randomTickDivider = 0; + } + + @Override + protected void registerGoals() { + this.goalSelector.addGoal(0, new FloatGoal(this)); + this.goalSelector.addGoal(1, new PanicGoal(this, 1.38F)); + this.goalSelector.addGoal(2, new QuestRamEatWoolGoal(this)); + this.goalSelector.addGoal(3, new TemptGoal(this, 1.0F, Ingredient.of(ItemTags.WOOL), false)); + this.addRestrictionGoals(this, this.goalSelector); + this.goalSelector.addGoal(5, new WaterAvoidingRandomStrollGoal(this, 1.0F)); + this.goalSelector.addGoal(6, new RandomLookAroundGoal(this)); + } + + @Nullable + @Override + public Animal getBreedOffspring(ServerLevel level, AgeableMob mate) { + return null; + } + + public static AttributeSupplier.Builder registerAttributes() { + return Mob.createMobAttributes() + .add(Attributes.MAX_HEALTH, 70.0D) + .add(Attributes.MOVEMENT_SPEED, 0.23D); + } + + @Override + protected void defineSynchedData() { + super.defineSynchedData(); + this.entityData.define(DATA_COLOR, 0); + this.entityData.define(DATA_REWARDED, false); + } + + @Override + protected void customServerAiStep() { + if (--this.randomTickDivider <= 0) { + this.randomTickDivider = 70 + this.getRandom().nextInt(50); + + if (this.countColorsSet() > 15 && !this.getRewarded()) { + this.rewardQuest(); + this.setRewarded(true); + } + + } + + if (this.countColorsSet() > 15 && !this.getRewarded()) { + this.animateAddColor(DyeColor.byId(this.getRandom().nextInt(16)), 5); + this.playAmbientSound(); + } + + super.customServerAiStep(); + } + + @Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor accessor, DifficultyInstance difficulty, MobSpawnType type, @Nullable SpawnGroupData data, @Nullable CompoundTag tag) { + if (type == MobSpawnType.STRUCTURE) this.restrictTo(this.blockPosition(), 13); + return super.finalizeSpawn(accessor, difficulty, type, data, tag); + } + + private void rewardQuest() { + // todo flesh the context out more + LootContext ctx = new LootContext.Builder((ServerLevel) this.getLevel()).withParameter(LootContextParams.THIS_ENTITY, this).create(LootContextParamSets.PIGLIN_BARTER); + ObjectArrayList rewards = this.getLevel().getServer().getLootTables().get(TFLootTables.QUESTING_RAM_REWARDS).getRandomItems(ctx); + rewards.forEach(stack -> this.spawnAtLocation(stack, 1.0F)); + + for (ServerPlayer player : this.getLevel().getEntitiesOfClass(ServerPlayer.class, getBoundingBox().inflate(16.0D, 16.0D, 16.0D))) { + TFAdvancements.QUEST_RAM_COMPLETED.trigger(player); + } + } + + @Override + public InteractionResult interactAt(Player player, Vec3 vec, InteractionHand hand) { + ItemStack currentItem = player.getItemInHand(hand); + + if (this.tryAccept(currentItem)) { + if (!player.getAbilities().instabuild) { + currentItem.shrink(1); + } + + return InteractionResult.SUCCESS; + } else { + return super.interactAt(player, vec, hand); + } + } + + public boolean tryAccept(ItemStack stack) { + if (stack.is(ItemTags.WOOL)) { + DyeColor color = guessColor(stack); + if (color != null && !this.isColorPresent(color)) { + this.setColorPresent(color); + this.animateAddColor(color, 50); + this.playAmbientSound(); + return true; + } + } + return false; + } + + @Nullable + public DyeColor guessColor(ItemStack stack) { + if (stack.getItem() instanceof BlockItem blockItem) { + Material material = blockItem.getBlock().material; + if (material.equals(Material.WOOL)) { + return switch (blockItem.getBlock().defaultMaterialColor().id) { + case 8 -> DyeColor.byId(0); //SNOW + case 15 -> DyeColor.byId(1); //COLOR_ORANGE + case 16 -> DyeColor.byId(2); //COLOR_MAGENTA + case 17 -> DyeColor.byId(3); //COLOR_LIGHT_BLUE + case 18 -> DyeColor.byId(4); //COLOR_YELLOW + case 19 -> DyeColor.byId(5); //COLOR_LIGHT_GREEN + case 20 -> DyeColor.byId(6); //COLOR_PINK + case 21 -> DyeColor.byId(7); //COLOR_GRAY + case 22 -> DyeColor.byId(8); //COLOR_LIGHT_GRAY + case 23 -> DyeColor.byId(9); //COLOR_CYAN + case 24 -> DyeColor.byId(10); //COLOR_PURPLE + case 25 -> DyeColor.byId(11); //COLOR_BLUE + case 26 -> DyeColor.byId(12); //COLOR_BROWN + case 27 -> DyeColor.byId(13); //COLOR_GREEN + case 28 -> DyeColor.byId(14); //COLOR_RED + case 29 -> DyeColor.byId(15); //COLOR_BLACK + default -> null; + }; + } + } + return null; + } + + @Override + public void addAdditionalSaveData(CompoundTag compound) { + super.addAdditionalSaveData(compound); + compound.putInt("ColorFlags", this.getColorFlags()); + compound.putBoolean("Rewarded", this.getRewarded()); + this.saveHomePointToNbt(compound); + } + + @Override + public void readAdditionalSaveData(CompoundTag compound) { + super.readAdditionalSaveData(compound); + this.setColorFlags(compound.getInt("ColorFlags")); + this.setRewarded(compound.getBoolean("Rewarded")); + this.loadHomePointFromNbt(compound, 13); + } + + public int getColorFlags() { + return this.entityData.get(DATA_COLOR); + } + + private void setColorFlags(int flags) { + this.entityData.set(DATA_COLOR, flags); + } + + public boolean isColorPresent(DyeColor color) { + return (this.getColorFlags() & (1 << color.getId())) > 0; + } + + public void setColorPresent(DyeColor color) { + this.setColorFlags(this.getColorFlags() | (1 << color.getId())); + } + + public boolean getRewarded() { + return this.entityData.get(DATA_REWARDED); + } + + public void setRewarded(boolean rewarded) { + this.entityData.set(DATA_REWARDED, rewarded); + } + + private void animateAddColor(DyeColor color, int iterations) { + float[] colorVal = color.getTextureDiffuseColors(); + float red = colorVal[0]; + float green = colorVal[1]; + float blue = colorVal[2]; + + if (!this.getLevel().isClientSide()) { + for (ServerPlayer serverplayer : ((ServerLevel) this.getLevel()).players()) { + if (serverplayer.distanceToSqr(Vec3.atCenterOf(this.blockPosition())) < 4096.0D) { + ParticlePacket packet = new ParticlePacket(); + + for (int i = 0; i < iterations; i++) { + packet.queueParticle(ParticleTypes.ENTITY_EFFECT, false, + this.getX() + (this.getRandom().nextDouble() - 0.5D) * this.getBbWidth() * 1.5D, + this.getY() + this.getRandom().nextDouble() * this.getBbHeight() * 1.5D, + this.getZ() + (this.getRandom().nextDouble() - 0.5D) * this.getBbWidth() * 1.5D, + red, green, blue); + } + + TFPacketHandler.CHANNEL.send(PacketDistributor.PLAYER.with(() -> serverplayer), packet); + } + } + } + } + + public int countColorsSet() { + return Integer.bitCount(this.getColorFlags()); + } + + @Override + protected boolean canRide(Entity entityIn) { + return false; + } + + @Override + public float getVoicePitch() { + return (this.getRandom().nextFloat() - this.getRandom().nextFloat()) * 0.2F + 0.7F; + } + + @Override + protected SoundEvent getAmbientSound() { + return TFSounds.QUEST_RAM_AMBIENT.get(); + } + + @Override + protected SoundEvent getHurtSound(DamageSource source) { + return TFSounds.QUEST_RAM_HURT.get(); + } + + @Override + protected SoundEvent getDeathSound() { + return TFSounds.QUEST_RAM_DEATH.get(); + } + + @Override + protected void playStepSound(BlockPos pos, BlockState state) { + this.playSound(TFSounds.QUEST_RAM_STEP.get(), 0.15F, 1.0F); + } + + @Override + public BlockPos getRestrictionCenter() { + return this.getRestrictCenter(); + } + + @Override + public void setRestriction(BlockPos pos, int dist) { + this.restrictTo(pos, dist); + } +} diff --git a/src/main/java/twilightforest/entity/passive/Raven.java b/src/main/java/twilightforest/entity/passive/Raven.java new file mode 100644 index 0000000000..7628bc407f --- /dev/null +++ b/src/main/java/twilightforest/entity/passive/Raven.java @@ -0,0 +1,49 @@ +package twilightforest.entity.passive; + +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.Pose; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.level.Level; +import twilightforest.init.TFSounds; + +public class Raven extends FlyingBird { + + public Raven(EntityType type, Level world) { + super(type, world); + } + + public static AttributeSupplier.Builder registerAttributes() { + return FlyingBird.createMobAttributes() + .add(Attributes.MAX_HEALTH, 10.0D) + .add(Attributes.MOVEMENT_SPEED, 0.2D); + } + + @Override + protected SoundEvent getAmbientSound() { + return TFSounds.RAVEN_CAW.get(); + } + + @Override + protected SoundEvent getHurtSound(DamageSource source) { + return TFSounds.RAVEN_SQUAWK.get(); + } + + @Override + protected SoundEvent getDeathSound() { + return TFSounds.RAVEN_SQUAWK.get(); + } + + @Override + public float getEyeHeight(Pose pose) { + return this.getBbHeight() * 0.75F; + } + + @Override + public boolean isSpooked() { + return this.getLastHurtByMob() != null; + } +} diff --git a/src/main/java/twilightforest/entity/passive/Squirrel.java b/src/main/java/twilightforest/entity/passive/Squirrel.java new file mode 100644 index 0000000000..59fc19ec86 --- /dev/null +++ b/src/main/java/twilightforest/entity/passive/Squirrel.java @@ -0,0 +1,84 @@ +package twilightforest.entity.passive; + +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.AgeableMob; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.Pose; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.goal.*; +import net.minecraft.world.entity.animal.*; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.material.Material; + +import org.jetbrains.annotations.Nullable; + +public class Squirrel extends Animal { + + protected static final Ingredient SEEDS = Ingredient.of(Items.WHEAT_SEEDS, Items.MELON_SEEDS, Items.PUMPKIN_SEEDS, Items.BEETROOT_SEEDS); + + public Squirrel(EntityType type, Level world) { + super(type, world); + } + + @Override + protected void registerGoals() { + this.goalSelector.addGoal(0, new FloatGoal(this)); + this.goalSelector.addGoal(1, new PanicGoal(this, 1.38F)); + this.goalSelector.addGoal(2, new TemptGoal(this, 1.0F, SEEDS, true)); + this.goalSelector.addGoal(3, new AvoidEntityGoal<>(this, Player.class, 2.0F, 0.8F, 1.4F)); + this.goalSelector.addGoal(3, new AvoidEntityGoal<>(this, Wolf.class, 8.0F, 0.8F, 1.4F)); + this.goalSelector.addGoal(3, new AvoidEntityGoal<>(this, Cat.class, 8.0F, 0.8F, 1.4F)); + this.goalSelector.addGoal(3, new AvoidEntityGoal<>(this, Ocelot.class, 8.0F, 0.8F, 1.4F)); + this.goalSelector.addGoal(3, new AvoidEntityGoal<>(this, Fox.class, 8.0F, 0.8F, 1.4F)); + this.goalSelector.addGoal(5, new WaterAvoidingRandomStrollGoal(this, 1.0F)); + this.goalSelector.addGoal(6, new WaterAvoidingRandomStrollGoal(this, 1.25F)); + this.goalSelector.addGoal(7, new LookAtPlayerGoal(this, Player.class, 6F)); + this.goalSelector.addGoal(8, new RandomLookAroundGoal(this)); + } + + public static AttributeSupplier.Builder registerAttributes() { + return Mob.createMobAttributes() + .add(Attributes.MAX_HEALTH, 1.0D) + .add(Attributes.MOVEMENT_SPEED, 0.3D); + } + + @Override + public float getStepHeight() { + return 1.0F; + } + + @Override + public float getEyeHeight(Pose pose) { + return this.getBbHeight() * 0.7F; + } + + @Override + public float getWalkTargetValue(BlockPos pos) { + // prefer standing on leaves + Material underMaterial = this.getLevel().getBlockState(pos.below()).getMaterial(); + if (underMaterial == Material.LEAVES) { + return 12.0F; + } + if (underMaterial == Material.WOOD) { + return 15.0F; + } + if (underMaterial == Material.GRASS) { + return 10.0F; + } + // default to just prefering lighter areas + return this.getLevel().getMaxLocalRawBrightness(pos) - 0.5F; + } + + @Nullable + @Override + public AgeableMob getBreedOffspring(ServerLevel level, AgeableMob mob) { + return null; + } +} diff --git a/src/main/java/twilightforest/entity/passive/TinyBird.java b/src/main/java/twilightforest/entity/passive/TinyBird.java new file mode 100644 index 0000000000..7e572b31d8 --- /dev/null +++ b/src/main/java/twilightforest/entity/passive/TinyBird.java @@ -0,0 +1,99 @@ +package twilightforest.entity.passive; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.syncher.EntityDataAccessor; +import net.minecraft.network.syncher.EntityDataSerializers; +import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.Pose; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.goal.AvoidEntityGoal; +import net.minecraft.world.entity.animal.Cat; +import net.minecraft.world.entity.animal.Ocelot; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import twilightforest.init.TFSounds; +import twilightforest.init.custom.TinyBirdVariant; + +public class TinyBird extends FlyingBird { + + private static final EntityDataAccessor TYPE = SynchedEntityData.defineId(TinyBird.class, EntityDataSerializers.STRING); + + public TinyBird(EntityType type, Level level) { + super(type, level); + this.setBirdType(TinyBirdVariant.getVariantId(TinyBirdVariant.getRandomVariant(this.getRandom()))); + } + + @Override + protected void registerGoals() { + super.registerGoals(); + this.goalSelector.addGoal(4, new AvoidEntityGoal<>(this, Cat.class, 8.0F, 1.0D, 1.25D)); + this.goalSelector.addGoal(4, new AvoidEntityGoal<>(this, Ocelot.class, 8.0F, 1.0D, 1.25D)); + } + + + @Override + protected void defineSynchedData() { + super.defineSynchedData(); + this.getEntityData().define(TYPE, TinyBirdVariant.getVariantId(TinyBirdVariant.getRandomVariant(this.getRandom()))); + } + + public static AttributeSupplier.Builder registerAttributes() { + return FlyingBird.createMobAttributes() + .add(Attributes.MAX_HEALTH, 1.0D) + .add(Attributes.MOVEMENT_SPEED, 0.2D); + } + + @Override + public void addAdditionalSaveData(CompoundTag compound) { + super.addAdditionalSaveData(compound); + compound.putString("BirdType", TinyBirdVariant.getVariantId(this.getBirdType())); + } + + @Override + public void readAdditionalSaveData(CompoundTag compound) { + super.readAdditionalSaveData(compound); + this.setBirdType(compound.getString("BirdType")); + } + + public TinyBirdVariant getBirdType() { + return TinyBirdVariant.getVariant(this.getEntityData().get(TYPE)).orElse(TinyBirdVariant.BLUE.get()); + } + + public void setBirdType(String type) { + this.getEntityData().set(TYPE, type); + } + + @Override + protected SoundEvent getAmbientSound() { + return this.getRandom().nextInt(20) == 0 ? TFSounds.TINY_BIRD_SONG.get() : TFSounds.TINY_BIRD_CHIRP.get(); + } + + @Override + protected SoundEvent getHurtSound(DamageSource source) { + return TFSounds.TINY_BIRD_HURT.get(); + } + + @Override + protected SoundEvent getDeathSound() { + return TFSounds.TINY_BIRD_HURT.get(); + } + + @Override + public float getEyeHeight(Pose pose) { + return this.getBbHeight() * 0.7F; + } + + @Override + public boolean isSpooked() { + if (this.getLastHurtByMob() != null) return true; + Player closestPlayer = this.getLevel().getNearestPlayer(this.getX(), this.getY(), this.getZ(), 4.0D, true); + return closestPlayer != null + && !SEEDS.test(closestPlayer.getMainHandItem()) + && !SEEDS.test(closestPlayer.getOffhandItem()); + } +} diff --git a/src/main/java/twilightforest/entity/passive/package-info.java b/src/main/java/twilightforest/entity/passive/package-info.java new file mode 100644 index 0000000000..acd6f18b5a --- /dev/null +++ b/src/main/java/twilightforest/entity/passive/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.entity.passive; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/entity/projectile/FallingIce.java b/src/main/java/twilightforest/entity/projectile/FallingIce.java new file mode 100644 index 0000000000..d9d050dbe9 --- /dev/null +++ b/src/main/java/twilightforest/entity/projectile/FallingIce.java @@ -0,0 +1,281 @@ +package twilightforest.entity.projectile; + +import net.minecraft.CrashReportCategory; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.particles.BlockParticleOption; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.core.registries.Registries; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtUtils; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.game.ClientGamePacketListener; +import net.minecraft.network.protocol.game.ClientboundAddEntityPacket; +import net.minecraft.network.protocol.game.ClientboundBlockUpdatePacket; +import net.minecraft.network.syncher.EntityDataAccessor; +import net.minecraft.network.syncher.EntityDataSerializers; +import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.Mth; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntitySelector; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.MoverType; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.DirectionalPlaceContext; +import net.minecraft.world.level.ClipContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.ConcretePowderBlock; +import net.minecraft.world.level.block.FallingBlock; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.material.Fluids; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.HitResult; +import net.minecraft.world.phys.Vec3; +import org.jetbrains.annotations.Nullable; +import twilightforest.TwilightForestMod; +import twilightforest.entity.boss.AlphaYeti; +import twilightforest.init.TFDamageTypes; +import twilightforest.init.TFEntities; +import twilightforest.init.TFParticleType; + +import java.util.Objects; + +//modified version of FallingBlockEntity, edits noted +public class FallingIce extends Entity { + + private int hangTime = 100; //TF: add hangTime. This defines how long the block should exist before falling. + private BlockState blockState = Blocks.PACKED_ICE.defaultBlockState(); //TF: change default block to packed ice + public int time; + protected int fallDamageMax = 100; //TF: change max damage to 100 damage from 40 + public float[] damagePerDifficulty = { 1.0F, 1.0F, 3.0F, 6.0F }; //TF: change the damage done per block fallen based on difficulty + @Nullable + public CompoundTag blockData; + protected static final EntityDataAccessor DATA_START_POS = SynchedEntityData.defineId(FallingIce.class, EntityDataSerializers.BLOCK_POS); + + public FallingIce(EntityType type, Level level) { + super(type, level); + } + + public FallingIce(Level level, double x, double y, double z, BlockState state, int hangTime) { + this(TFEntities.FALLING_ICE.get(), level); + this.hangTime = hangTime; + this.blockState = state; + this.blocksBuilding = true; + this.setPos(x, y, z); + this.setDeltaMovement(Vec3.ZERO); + this.xo = x; + this.yo = y; + this.zo = z; + this.setStartPos(this.blockPosition()); + } + + public void setStartPos(BlockPos pos) { + this.entityData.set(DATA_START_POS, pos); + } + + public BlockPos getStartPos() { + return this.entityData.get(DATA_START_POS); + } + + @Override + public boolean isAttackable() { + return false; + } + + @Override + protected Entity.MovementEmission getMovementEmission() { + return Entity.MovementEmission.NONE; + } + + @Override + protected void defineSynchedData() { + this.entityData.define(DATA_START_POS, BlockPos.ZERO); + } + + @Override + public boolean isPickable() { + return !this.isRemoved(); + } + + @Override + public void tick() { + if (this.blockState.isAir()) { + this.discard(); + } else { + this.time++; + this.setNoGravity(this.time < this.hangTime); //TF: if we haven't passed our hanging time, keep in the air + if (!this.isNoGravity()) { + this.setDeltaMovement(this.getDeltaMovement().add(0.0D, -0.04D, 0.0D)); + } + + this.move(MoverType.SELF, this.getDeltaMovement()); + if (!this.getLevel().isClientSide()) { + BlockPos blockpos = this.blockPosition(); + boolean flag = this.blockState.getBlock() instanceof ConcretePowderBlock; + boolean flag1 = flag && this.blockState.canBeHydrated(this.level, blockpos, this.level.getFluidState(blockpos), blockpos); + double d0 = this.getDeltaMovement().lengthSqr(); + if (flag && d0 > 1.0D) { + BlockHitResult blockhitresult = this.level.clip(new ClipContext(new Vec3(this.xo, this.yo, this.zo), this.position(), ClipContext.Block.COLLIDER, ClipContext.Fluid.SOURCE_ONLY, this)); + if (blockhitresult.getType() != HitResult.Type.MISS && this.blockState.canBeHydrated(this.getLevel(), blockpos, this.getLevel().getFluidState(blockhitresult.getBlockPos()), blockhitresult.getBlockPos())) { + blockpos = blockhitresult.getBlockPos(); + flag1 = true; + } + } + + if (!this.onGround && !flag1) { + if (!this.getLevel().isClientSide() && (this.time > 100 && (blockpos.getY() <= this.getLevel().getMinBuildHeight() || blockpos.getY() > this.getLevel().getMaxBuildHeight()) || this.time > 1000)) { + this.discard(); + } + } else { + BlockState blockstate = this.getLevel().getBlockState(blockpos); + this.setDeltaMovement(this.getDeltaMovement().multiply(0.7D, -0.5D, 0.7D)); + if (!blockstate.is(Blocks.MOVING_PISTON)) { + boolean flag2 = blockstate.canBeReplaced(new DirectionalPlaceContext(this.getLevel(), blockpos, Direction.DOWN, ItemStack.EMPTY, Direction.UP)); + boolean flag3 = FallingBlock.isFree(this.getLevel().getBlockState(blockpos.below())) && (!flag || !flag1); + boolean flag4 = this.blockState.canSurvive(this.getLevel(), blockpos) && !flag3; + if (flag2 && flag4) { + if (this.blockState.hasProperty(BlockStateProperties.WATERLOGGED) && this.getLevel().getFluidState(blockpos).getType() == Fluids.WATER) { + this.blockState = this.blockState.setValue(BlockStateProperties.WATERLOGGED, true); + } + + if (this.getLevel().setBlock(blockpos, this.blockState, 3)) { + ((ServerLevel) this.getLevel()).getChunkSource().chunkMap.broadcast(this, new ClientboundBlockUpdatePacket(blockpos, this.getLevel().getBlockState(blockpos))); + this.discard(); + + if (this.blockData != null && this.blockState.hasBlockEntity()) { + BlockEntity blockentity = this.getLevel().getBlockEntity(blockpos); + if (blockentity != null) { + CompoundTag compoundtag = blockentity.saveWithoutMetadata(); + + for (String s : this.blockData.getAllKeys()) { + compoundtag.put(s, Objects.requireNonNull(this.blockData.get(s)).copy()); + } + + try { + blockentity.load(compoundtag); + } catch (Exception exception) { + TwilightForestMod.LOGGER.error("Failed to load block entity from falling block", exception); + } + + blockentity.setChanged(); + } + } + } + } else { + this.discard(); + } + } + } + } else { + //TF: add ice trail + this.makeTrail(); + } + + this.setDeltaMovement(this.getDeltaMovement().scale(0.98D)); + } + } + + private void makeTrail() { + for (int i = 0; i < 3; i++) { + double dx = this.getX() + 1.5F * (this.random.nextFloat() - this.random.nextFloat()); + double dy = this.getY() - 4.0F * (this.random.nextFloat() - this.random.nextFloat()) - 3.0F; + double dz = this.getZ() + 1.5F * (this.random.nextFloat() - this.random.nextFloat()); + + this.getLevel().addAlwaysVisibleParticle(TFParticleType.EXTENDED_SNOW_WARNING.get(), dx, dy, dz, 0.0D, -1.0D, 0.0D); + } + } + + //TF: always hurt entities, remove anvil and dripstone crap, make sure our target isn't the alpha yeti, and scale damage based on difficulty + @Override + public boolean causeFallDamage(float dist, float multiplier, DamageSource source) { + + int realDist = Mth.ceil(dist - 1.0F); + if (realDist >= 0) { + float dmg = (float) Math.min(Mth.floor((float) realDist * this.damagePerDifficulty[this.getLevel().getDifficulty().getId()]), this.fallDamageMax); + this.getLevel().getEntities(this, this.getBoundingBox().inflate(1.0F, 0.0F, 1.0F), EntitySelector.NO_SPECTATORS).forEach((entity) -> { + if (!(entity instanceof AlphaYeti)) { + entity.hurt(TFDamageTypes.getDamageSource(this.getLevel(), TFDamageTypes.FALLING_ICE), dmg); + } + }); + } + + //TF: Shattering particles and sound + for (int i = 0; i < 200; i++) { + double dx = this.getX() + 3.0F * (this.random.nextFloat() - this.random.nextFloat()); + double dy = this.getY() + 5.0F * (this.random.nextFloat() - this.random.nextFloat()); + double dz = this.getZ() + 3.0F * (this.random.nextFloat() - this.random.nextFloat()); + + this.getLevel().addParticle(new BlockParticleOption(ParticleTypes.BLOCK, this.blockState), dx, dy, dz, 0, 0, 0); + } + + this.playSound(Blocks.PACKED_ICE.getSoundType(Blocks.PACKED_ICE.defaultBlockState(), this.getLevel(), blockPosition(), null).getBreakSound(), 3.0F, 0.5F); + return false; + } + + @Override + protected void addAdditionalSaveData(CompoundTag tag) { + tag.put("BlockState", NbtUtils.writeBlockState(this.blockState)); + tag.putInt("Time", this.time); + if (this.blockData != null) { + tag.put("BlockEntityData", this.blockData); + } + + } + + @Override + protected void readAdditionalSaveData(CompoundTag tag) { + this.blockState = NbtUtils.readBlockState(this.getLevel().holderLookup(Registries.BLOCK), tag.getCompound("BlockState")); + this.time = tag.getInt("Time"); + if (tag.contains("BlockEntityData", 10)) { + this.blockData = tag.getCompound("BlockEntityData"); + } + + if (this.blockState.isAir()) { + this.blockState = Blocks.PACKED_ICE.defaultBlockState(); + } + + } + + @Override + public boolean displayFireAnimation() { + return false; + } + + @Override + public void fillCrashReportCategory(CrashReportCategory category) { + super.fillCrashReportCategory(category); + category.setDetail("Imitating BlockState", this.blockState.toString()); + } + + public BlockState getBlockState() { + return this.blockState; + } + + @Override + public boolean onlyOpCanSetNbt() { + return true; + } + + @Override + public Packet getAddEntityPacket() { + return new ClientboundAddEntityPacket(this, Block.getId(this.getBlockState())); + } + + @Override + public void recreateFromPacket(ClientboundAddEntityPacket packet) { + super.recreateFromPacket(packet); + this.blockState = Block.stateById(packet.getData()); + this.blocksBuilding = true; + double d0 = packet.getX(); + double d1 = packet.getY(); + double d2 = packet.getZ(); + this.setPos(d0, d1, d2); + this.setStartPos(this.blockPosition()); + } +} diff --git a/src/main/java/twilightforest/entity/projectile/ITFProjectile.java b/src/main/java/twilightforest/entity/projectile/ITFProjectile.java new file mode 100644 index 0000000000..cfba1c1960 --- /dev/null +++ b/src/main/java/twilightforest/entity/projectile/ITFProjectile.java @@ -0,0 +1,6 @@ +package twilightforest.entity.projectile; + +/** + * Marker interface for our projectiles, used for parrying. + */ +public interface ITFProjectile {} diff --git a/src/main/java/twilightforest/entity/projectile/IceArrow.java b/src/main/java/twilightforest/entity/projectile/IceArrow.java new file mode 100644 index 0000000000..863c7c8079 --- /dev/null +++ b/src/main/java/twilightforest/entity/projectile/IceArrow.java @@ -0,0 +1,43 @@ +package twilightforest.entity.projectile; + +import net.minecraft.core.particles.BlockParticleOption; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.EntityHitResult; +import twilightforest.enchantment.ChillAuraEnchantment; +import twilightforest.init.TFEntities; + +public class IceArrow extends TFArrow { + + public IceArrow(EntityType type, Level world) { + super(type, world); + } + + public IceArrow(Level world, Entity shooter) { + super(TFEntities.ICE_ARROW.get(), world, shooter); + } + + @Override + public void tick() { + super.tick(); + if (this.getLevel().isClientSide() && !this.inGround) { + BlockState stateId = Blocks.SNOW.defaultBlockState(); + for (int i = 0; i < 4; ++i) { + this.getLevel().addParticle(new BlockParticleOption(ParticleTypes.FALLING_DUST, stateId), this.getX() + this.getDeltaMovement().x() * i / 4.0D, this.getY() + this.getDeltaMovement().y() * i / 4.0D, this.getZ() + this.getDeltaMovement().z() * i / 4.0D, -this.getDeltaMovement().x(), -this.getDeltaMovement().y() + 0.2D, -this.getDeltaMovement().z()); + } + } + } + + @Override + protected void onHitEntity(EntityHitResult result) { + super.onHitEntity(result); + if (!this.getLevel().isClientSide() && result.getEntity() instanceof LivingEntity living) { + ChillAuraEnchantment.doChillAuraEffect(living, 200, 2, true); + } + } +} diff --git a/src/main/java/twilightforest/entity/projectile/IceBomb.java b/src/main/java/twilightforest/entity/projectile/IceBomb.java new file mode 100644 index 0000000000..a9c5f1c048 --- /dev/null +++ b/src/main/java/twilightforest/entity/projectile/IceBomb.java @@ -0,0 +1,161 @@ +package twilightforest.entity.projectile; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Position; +import net.minecraft.core.particles.BlockParticleOption; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.tags.EntityTypeTags; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.SnowLayerBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.phys.HitResult; +import twilightforest.data.tags.BlockTagGenerator; +import twilightforest.enchantment.ChillAuraEnchantment; +import twilightforest.entity.boss.AlphaYeti; +import twilightforest.entity.monster.Yeti; +import twilightforest.init.TFDamageTypes; +import twilightforest.init.TFEntities; + +import java.util.List; + +public class IceBomb extends TFThrowable { + + private int zoneTimer = 80; + private boolean hasHit; + + public IceBomb(EntityType type, Level world) { + super(type, world); + } + + public IceBomb(EntityType type, Level world, LivingEntity thrower) { + super(type, world, thrower); + } + + public IceBomb(Level world, Position pos) { + super(TFEntities.THROWN_ICE.get(), world, pos.x(), pos.y(), pos.z()); + } + + @Override + protected void onHit(HitResult result) { + this.setDeltaMovement(0.0D, 0.0D, 0.0D); + this.hasHit = true; + + this.doTerrainEffects(); + } + + private void doTerrainEffects() { + + final int range = 3; + + int ix = Mth.floor(this.xOld); + int iy = Mth.floor(this.yOld); + int iz = Mth.floor(this.zOld); + + for (int x = -range; x <= range; x++) { + for (int y = -range; y <= range; y++) { + for (int z = -range; z <= range; z++) { + BlockPos pos = new BlockPos(ix + x, iy + y, iz + z); + this.doTerrainEffect(pos); + } + } + } + } + + /** + * Freeze water, put snow on snowable surfaces + */ + private void doTerrainEffect(BlockPos pos) { + BlockState state = this.getLevel().getBlockState(pos); + if (!this.getLevel().isClientSide()) { + if (state.getMaterial() == Material.WATER) { + this.getLevel().setBlockAndUpdate(pos, Blocks.ICE.defaultBlockState()); + } + if (state == Blocks.LAVA.defaultBlockState()) { + this.getLevel().setBlockAndUpdate(pos, Blocks.OBSIDIAN.defaultBlockState()); + } + if (this.getLevel().isEmptyBlock(pos) && Blocks.SNOW.defaultBlockState().canSurvive(this.getLevel(), pos)) { + this.getLevel().setBlockAndUpdate(pos, Blocks.SNOW.defaultBlockState()); + } + if (state.is(BlockTagGenerator.ICE_BOMB_REPLACEABLES)) { + this.getLevel().setBlock(pos, Blocks.SNOW.defaultBlockState().canSurvive(this.getLevel(), pos) ? Blocks.SNOW.defaultBlockState() : Blocks.AIR.defaultBlockState(), 3); + } + if (state.is(Blocks.SNOW) && state.getValue(SnowLayerBlock.LAYERS) < 8) { + this.getLevel().setBlockAndUpdate(pos, state.setValue(SnowLayerBlock.LAYERS, state.getValue(SnowLayerBlock.LAYERS) + 1)); + } + } + } + + @Override + public void tick() { + super.tick(); + + if (this.hasHit) { + this.getDeltaMovement().multiply(0.1D, 0.1D, 0.1D); + + this.zoneTimer--; + this.makeIceZone(); + + if (!this.getLevel().isClientSide() && this.zoneTimer <= 0) { + this.getLevel().levelEvent(2001, new BlockPos(this.blockPosition()), Block.getId(Blocks.ICE.defaultBlockState())); + this.discard(); + } + } else { + this.makeTrail(new BlockParticleOption(ParticleTypes.FALLING_DUST, Blocks.SNOW.defaultBlockState()), this.getOwner() instanceof AlphaYeti ? 2 : 5); + } + } + + private void makeIceZone() { + if (this.getLevel().isClientSide()) { + // sparkles + BlockState stateId = Blocks.SNOW.defaultBlockState(); + for (int i = 0; i < 15; i++) { + double dx = this.getX() + (this.random.nextFloat() - this.random.nextFloat()) * 3.0F; + double dy = this.getY() + (this.random.nextFloat() - this.random.nextFloat()) * 3.0F; + double dz = this.getZ() + (this.random.nextFloat() - this.random.nextFloat()) * 3.0F; + + this.getLevel().addParticle(new BlockParticleOption(ParticleTypes.FALLING_DUST, stateId), dx, dy, dz, 0, 0, 0); + } + } else { + if (this.zoneTimer % 20 == 0) { + this.hitNearbyEntities(); + } + } + } + + private void hitNearbyEntities() { + List nearby = this.getLevel().getEntitiesOfClass(LivingEntity.class, this.getBoundingBox().inflate(3, 2, 3)); + + for (LivingEntity entity : nearby) { + if (entity != this.getOwner()) { + if (entity instanceof Yeti) { + // TODO: make "frozen yeti" entity? + BlockPos pos = BlockPos.containing(entity.xOld, entity.yOld, entity.zOld); + this.getLevel().setBlockAndUpdate(pos, Blocks.ICE.defaultBlockState()); + this.getLevel().setBlockAndUpdate(pos.above(), Blocks.ICE.defaultBlockState()); + + entity.discard(); + } else { + if (!entity.getType().is(EntityTypeTags.FREEZE_IMMUNE_ENTITY_TYPES)) { + entity.hurt(TFDamageTypes.getIndirectEntityDamageSource(this.getLevel(), TFDamageTypes.FROZEN, this.getOwner(), this), entity.getType().is(EntityTypeTags.FREEZE_HURTS_EXTRA_TYPES) ? 5 : 1); + ChillAuraEnchantment.doChillAuraEffect(entity, 100, 0, true); + } + } + } + } + } + + public BlockState getBlockState() { + return Blocks.PACKED_ICE.defaultBlockState(); + } + + @Override + protected float getGravity() { + return this.hasHit ? 0F : 0.025F; + } +} diff --git a/src/main/java/twilightforest/entity/projectile/IceSnowball.java b/src/main/java/twilightforest/entity/projectile/IceSnowball.java new file mode 100644 index 0000000000..9b0ceb6324 --- /dev/null +++ b/src/main/java/twilightforest/entity/projectile/IceSnowball.java @@ -0,0 +1,94 @@ +package twilightforest.entity.projectile; + +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.entity.projectile.ItemSupplier; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.EntityHitResult; +import net.minecraft.world.phys.HitResult; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import twilightforest.init.TFDamageTypes; +import twilightforest.init.TFEntities; + +@OnlyIn(value = Dist.CLIENT, _interface = ItemSupplier.class) +public class IceSnowball extends TFThrowable implements ItemSupplier { + + private static final int DAMAGE = 2; + + public IceSnowball(EntityType type, Level world) { + super(type, world); + } + + public IceSnowball(Level world, LivingEntity thrower) { + super(TFEntities.ICE_SNOWBALL.get(), world, thrower); + } + + @Override + public void tick() { + super.tick(); + this.makeTrail(ParticleTypes.ITEM_SNOWBALL, 2); + } + + @Override + protected float getGravity() { + return 0.006F; + } + + @Override + public boolean hurt(DamageSource source, float amount) { + super.hurt(source, amount); + this.die(); + return true; + } + + @OnlyIn(Dist.CLIENT) + @Override + public void handleEntityEvent(byte id) { + if (id == 3) { + for (int j = 0; j < 8; ++j) { + this.getLevel().addParticle(ParticleTypes.ITEM_SNOWBALL, this.getX(), this.getY(), this.getZ(), 0.0D, 0.0D, 0.0D); + } + } else { + super.handleEntityEvent(id); + } + } + + @Override + protected void onHitEntity(EntityHitResult result) { + super.onHitEntity(result); + Entity target = result.getEntity(); + if (!this.getLevel().isClientSide() && target instanceof LivingEntity) { + target.hurt(TFDamageTypes.getIndirectEntityDamageSource(this.getLevel(), TFDamageTypes.SNOWBALL_FIGHT, this.getOwner(), this), DAMAGE); + //damage armor pieces + if (target instanceof Player) { + for (ItemStack stack : target.getArmorSlots()) + stack.hurtAndBreak(this.random.nextInt(1), ((Player) target), (user) -> user.broadcastBreakEvent(stack.getEquipmentSlot())); + } + } + } + + @Override + protected void onHit(HitResult result) { + super.onHit(result); + this.die(); + } + + private void die() { + if (!this.getLevel().isClientSide()) { + this.getLevel().broadcastEntityEvent(this, (byte) 3); + this.discard(); + } + } + + @Override + public ItemStack getItem() { + return new ItemStack(Items.SNOWBALL); + } +} diff --git a/src/main/java/twilightforest/entity/projectile/LichBolt.java b/src/main/java/twilightforest/entity/projectile/LichBolt.java new file mode 100644 index 0000000000..45a18d82ff --- /dev/null +++ b/src/main/java/twilightforest/entity/projectile/LichBolt.java @@ -0,0 +1,113 @@ +package twilightforest.entity.projectile; + +import net.minecraft.core.particles.ItemParticleOption; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.EntityHitResult; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import twilightforest.entity.boss.Lich; +import twilightforest.init.TFDamageTypes; +import twilightforest.init.TFEntities; + +public class LichBolt extends TFThrowable { + + public LichBolt(EntityType type, Level level) { + super(type, level); + } + + public LichBolt(Level level, LivingEntity owner) { + super(TFEntities.LICH_BOLT.get(), level, owner); + } + + @Override + public void tick() { + super.tick(); + this.makeTrail(); + } + + private void makeTrail() { + double s1 = ((this.random.nextFloat() * 0.5F) + 0.5F) * 0.17F; + double s2 = ((this.random.nextFloat() * 0.5F) + 0.5F) * 0.80F; + double s3 = ((this.random.nextFloat() * 0.5F) + 0.5F) * 0.69F; + + this.makeTrail(ParticleTypes.ENTITY_EFFECT, s1, s2, s3, 5); + } + + @Override + public boolean isPickable() { + return true; + } + + @Override + public float getPickRadius() { + return 1.0F; + } + + @Override + public boolean hurt(DamageSource damagesource, float amount) { + super.hurt(damagesource, amount); + + if (!this.getLevel().isClientSide() && damagesource.getEntity() != null) { + Vec3 vec3d = damagesource.getEntity().getLookAngle(); + // reflect faster and more accurately + this.shoot(vec3d.x(), vec3d.y(), vec3d.z(), 1.5F, 0.1F); // reflect faster and more accurately + + if (damagesource.getDirectEntity() instanceof LivingEntity) + this.setOwner(damagesource.getDirectEntity()); + + return true; + } + + return false; + } + + @Override + protected float getGravity() { + return 0.001F; + } + + @OnlyIn(Dist.CLIENT) + @Override + public void handleEntityEvent(byte id) { + if (id == 3) { + ItemStack itemId = new ItemStack(Items.ENDER_PEARL); + for (int i = 0; i < 8; ++i) { + this.getLevel().addParticle(new ItemParticleOption(ParticleTypes.ITEM, itemId), this.getX(), this.getY(), this.getZ(), random.nextGaussian() * 0.05D, random.nextDouble() * 0.2D, random.nextGaussian() * 0.05D); + } + } else { + super.handleEntityEvent(id); + } + } + + @Override + protected void onHitBlock(BlockHitResult result) { + super.onHitBlock(result); + this.getLevel().broadcastEntityEvent(this, (byte) 3); + this.discard(); + } + + @Override + protected void onHitEntity(EntityHitResult result) { + Entity hit = result.getEntity(); + if (hit instanceof LichBolt || hit instanceof LichBomb || (hit instanceof Lich lich && lich.isShadowClone())) { + return; + } + + if (!this.getLevel().isClientSide()) { + if (hit instanceof LivingEntity) { + hit.hurt(TFDamageTypes.getDamageSource(this.getLevel(), TFDamageTypes.LICH_BOLT, TFEntities.LICH.get()), 6); + } + this.getLevel().broadcastEntityEvent(this, (byte) 3); + this.discard(); + } + } +} diff --git a/src/main/java/twilightforest/entity/projectile/LichBomb.java b/src/main/java/twilightforest/entity/projectile/LichBomb.java new file mode 100644 index 0000000000..9a649bf221 --- /dev/null +++ b/src/main/java/twilightforest/entity/projectile/LichBomb.java @@ -0,0 +1,110 @@ +package twilightforest.entity.projectile; + +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.tags.DamageTypeTags; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.projectile.ItemSupplier; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.EntityHitResult; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import twilightforest.entity.boss.Lich; +import twilightforest.init.TFDamageTypes; +import twilightforest.init.TFEntities; + +@OnlyIn(value = Dist.CLIENT, _interface = ItemSupplier.class) +public class LichBomb extends TFThrowable implements ItemSupplier { + + public LichBomb(EntityType type, Level world) { + super(type, world); + } + + public LichBomb(Level world, LivingEntity thrower) { + super(TFEntities.LICH_BOMB.get(), world, thrower); + } + + @Override + public void tick() { + super.tick(); + this.makeTrail(); + } + + private void makeTrail() { + for (int i = 0; i < 1; i++) { + double sx = 0.5 * (this.random.nextDouble() - this.random.nextDouble()) + this.getDeltaMovement().x(); + double sy = 0.5 * (this.random.nextDouble() - this.random.nextDouble()) + this.getDeltaMovement().y(); + double sz = 0.5 * (this.random.nextDouble() - this.random.nextDouble()) + this.getDeltaMovement().z(); + + double dx = this.getX() + sx; + double dy = this.getY() + sy; + double dz = this.getZ() + sz; + + this.getLevel().addParticle(ParticleTypes.FLAME, dx, dy, dz, sx * -0.25, sy * -0.25, sz * -0.25); + } + } + + @Override + public boolean isOnFire() { + return true; + } + + @Override + public boolean isPickable() { + return true; + } + + @Override + public float getPickRadius() { + return 1.0F; + } + + @Override + public boolean hurt(DamageSource source, float amount) { + super.hurt(source, amount); + + if (source.getDirectEntity() != null) { + if (!source.is(DamageTypeTags.IS_EXPLOSION)) + this.explode(); + return true; + } else { + return false; + } + } + + private void explode() { + if (!this.getLevel().isClientSide()) { + this.getLevel().explode(this, TFDamageTypes.getDamageSource(this.getLevel(), TFDamageTypes.LICH_BOMB, TFEntities.LICH.get()), null, this.getX(), this.getY(), this.getZ(), 2.0F, false, Level.ExplosionInteraction.NONE); + this.discard(); + } + } + + @Override + protected float getGravity() { + return 0.001F; + } + + @Override + protected void onHitBlock(BlockHitResult result) { + super.onHitBlock(result); + this.explode(); + } + + @Override + protected void onHitEntity(EntityHitResult result) { + super.onHitEntity(result); + if (result.getEntity() instanceof LichBolt || result.getEntity() instanceof LichBomb || result.getEntity() instanceof Lich) { + return; + } + this.explode(); + } + + @Override + public ItemStack getItem() { + return new ItemStack(Items.MAGMA_CREAM); + } +} diff --git a/src/main/java/twilightforest/entity/projectile/MoonwormShot.java b/src/main/java/twilightforest/entity/projectile/MoonwormShot.java new file mode 100644 index 0000000000..d82b1c7642 --- /dev/null +++ b/src/main/java/twilightforest/entity/projectile/MoonwormShot.java @@ -0,0 +1,107 @@ +package twilightforest.entity.projectile; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.particles.BlockParticleOption; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.sounds.SoundSource; +import net.minecraft.tags.BlockTags; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.DirectionalBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.gameevent.GameEvent; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.EntityHitResult; +import net.minecraft.world.phys.HitResult; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFEntities; +import twilightforest.init.TFSounds; + +public class MoonwormShot extends TFThrowable { + + public MoonwormShot(EntityType type, Level level) { + super(type, level); + } + + public MoonwormShot(EntityType type, Level level, LivingEntity thrower) { + super(type, level, thrower); + this.shootFromRotation(thrower, thrower.getXRot(), thrower.getYRot(), 0F, 1.5F, 1.0F); + } + + public MoonwormShot(Level level, double x, double y, double z) { + super(TFEntities.MOONWORM_SHOT.get(), level, x, y, z); + } + + @Override + public boolean isPickable() { + return true; + } + + @Override + public float getPickRadius() { + return 1.0F; + } + + @Override + protected float getGravity() { + return 0.03F; + } + + @OnlyIn(Dist.CLIENT) + @Override + public void handleEntityEvent(byte id) { + if (id == 3) { + for (int i = 0; i < 8; ++i) { + this.getLevel().addParticle(new BlockParticleOption(ParticleTypes.BLOCK, Blocks.SLIME_BLOCK.defaultBlockState()), true, this.getX(), this.getY() + 0.1D, this.getZ(), 0.0D, 0.0D, 0.0D); + } + } else { + super.handleEntityEvent(id); + } + } + + @Override + protected void onHitBlock(BlockHitResult result) { + super.onHitBlock(result); + BlockPos pos = result.getBlockPos().relative(result.getDirection()); + BlockState currentState = this.getLevel().getBlockState(pos); + + if (currentState.getMaterial().isReplaceable() && !currentState.is(BlockTags.FIRE) && !currentState.is(Blocks.LAVA)) { + this.getLevel().setBlockAndUpdate(pos, TFBlocks.MOONWORM.get().defaultBlockState().setValue(DirectionalBlock.FACING, result.getDirection())); + this.gameEvent(GameEvent.PROJECTILE_LAND, this.getOwner()); + this.getLevel().playSound(null, result.getBlockPos(), TFSounds.MOONWORM_SQUISH.get(), SoundSource.BLOCKS, 1.0F, 1.0F); + } else { + ItemEntity squish = new ItemEntity(this.getLevel(), pos.getX(), pos.getY(), pos.getZ(), Items.LIME_DYE.getDefaultInstance()); + squish.spawnAtLocation(squish.getItem()); + this.gameEvent(GameEvent.ENTITY_DIE); + } + } + + @Override + protected void onHitEntity(EntityHitResult result) { + super.onHitEntity(result); + if (result.getEntity() instanceof Player player && !player.hasItemInSlot(EquipmentSlot.HEAD)) { + player.setItemSlot(EquipmentSlot.HEAD, new ItemStack(TFBlocks.MOONWORM.get())); + } else { + //FIXME custom damage source + //result.getEntity().hurt(new IndirectEntityDamageSource("moonworm", this, this), this.random.nextInt(3) == 0 ? 1 : 0); + } + } + + @Override + protected void onHit(HitResult result) { + super.onHit(result); + if (!this.getLevel().isClientSide()) { + this.getLevel().broadcastEntityEvent(this, (byte) 3); + this.discard(); + } + } +} diff --git a/src/main/java/twilightforest/entity/projectile/NatureBolt.java b/src/main/java/twilightforest/entity/projectile/NatureBolt.java new file mode 100644 index 0000000000..43304cbc35 --- /dev/null +++ b/src/main/java/twilightforest/entity/projectile/NatureBolt.java @@ -0,0 +1,114 @@ +package twilightforest.entity.projectile; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.particles.BlockParticleOption; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.world.Difficulty; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.projectile.ItemSupplier; +import net.minecraft.world.item.BoneMealItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.LeavesBlock; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.EntityHitResult; +import net.minecraft.world.phys.HitResult; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.event.ForgeEventFactory; +import twilightforest.data.tags.BlockTagGenerator; +import twilightforest.init.TFDamageTypes; +import twilightforest.init.TFEntities; +import twilightforest.util.EntityUtil; + +@OnlyIn(value = Dist.CLIENT, _interface = ItemSupplier.class) +public class NatureBolt extends TFThrowable implements ITFProjectile, ItemSupplier { + + public NatureBolt(EntityType type, Level level) { + super(type, level); + } + + public NatureBolt(Level level, LivingEntity owner) { + super(TFEntities.NATURE_BOLT.get(), level, owner); + } + + @Override + public void tick() { + super.tick(); + this.makeTrail(ParticleTypes.HAPPY_VILLAGER, 5); + } + + @Override + protected float getGravity() { + return 0.003F; + } + + @OnlyIn(Dist.CLIENT) + @Override + public void handleEntityEvent(byte id) { + if (id == 3) { + for (int i = 0; i < 8; ++i) { + this.getLevel().addParticle(new BlockParticleOption(ParticleTypes.BLOCK, Blocks.OAK_LEAVES.defaultBlockState()), false, this.getX(), this.getY(), this.getZ(), random.nextGaussian() * 0.05D, random.nextDouble() * 0.2D, random.nextGaussian() * 0.05D); + } + } else { + super.handleEntityEvent(id); + } + } + + @Override + protected void onHitBlock(BlockHitResult result) { + super.onHitBlock(result); + BlockPos blockPosHit = result.getBlockPos(); + Material materialHit = this.getLevel().getBlockState(blockPosHit).getMaterial(); + + if (ForgeEventFactory.getMobGriefingEvent(this.getLevel(), this)) { + if (materialHit == Material.GRASS) { + ItemStack dummy = new ItemStack(Items.BONE_MEAL, 1); + if (BoneMealItem.growCrop(dummy, this.getLevel(), blockPosHit)) { + this.getLevel().levelEvent(2005, blockPosHit, 0); + } + } else if (materialHit.isSolid() && this.canReplaceBlock(this.getLevel(), blockPosHit)) { + this.getLevel().setBlockAndUpdate(blockPosHit, Blocks.BIRCH_LEAVES.defaultBlockState().setValue(LeavesBlock.PERSISTENT, true)); + } + } + } + + @Override + protected void onHitEntity(EntityHitResult result) { + super.onHitEntity(result); + Entity owner = this.getOwner(); + Entity entityHit = result.getEntity(); + if (entityHit instanceof LivingEntity living && (owner == null || (entityHit != owner && entityHit != owner.getVehicle()))) { + if (entityHit.hurt(TFDamageTypes.getIndirectEntityDamageSource(this.getLevel(), TFDamageTypes.LEAF_BRAIN, this.getOwner(), this), 2) + && this.getLevel().getDifficulty() != Difficulty.PEACEFUL) { + int poisonTime = this.getLevel().getDifficulty() == Difficulty.HARD ? 7 : 3; + living.addEffect(new MobEffectInstance(MobEffects.POISON, poisonTime * 20, 0)); + } + } + } + + @Override + protected void onHit(HitResult result) { + super.onHit(result); + if (!this.getLevel().isClientSide()) { + this.getLevel().broadcastEntityEvent(this, (byte) 3); + this.discard(); + } + } + + private boolean canReplaceBlock(Level level, BlockPos pos) { + return !level.getBlockState(pos).hasBlockEntity() && level.getBlockState(pos).isSolidRender(level, pos) && level.getBlockState(pos).is(BlockTagGenerator.DRUID_PROJECTILE_REPLACEABLE) && EntityUtil.canDestroyBlock(level, pos, this); + } + + @Override + public ItemStack getItem() { + return new ItemStack(Items.WHEAT_SEEDS); + } +} diff --git a/src/main/java/twilightforest/entity/projectile/SeekerArrow.java b/src/main/java/twilightforest/entity/projectile/SeekerArrow.java new file mode 100644 index 0000000000..c7dc1e9d6a --- /dev/null +++ b/src/main/java/twilightforest/entity/projectile/SeekerArrow.java @@ -0,0 +1,184 @@ +package twilightforest.entity.projectile; + +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.network.syncher.EntityDataAccessor; +import net.minecraft.network.syncher.EntityDataSerializers; +import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.world.entity.*; +import net.minecraft.world.entity.monster.Monster; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.EntityHitResult; +import net.minecraft.world.phys.Vec3; +import twilightforest.init.TFEntities; + +import org.jetbrains.annotations.Nullable; +import java.util.List; +import java.util.stream.Collectors; + +public class SeekerArrow extends TFArrow { + + private static final EntityDataAccessor TARGET = SynchedEntityData.defineId(SeekerArrow.class, EntityDataSerializers.INT); + + private static final double seekDistance = 5.0; + private static final double seekFactor = 0.8; + private static final double seekAngle = Math.PI / 6.0; + private static final double seekThreshold = 0.5; + + public SeekerArrow(EntityType type, Level world) { + super(type, world); + this.setBaseDamage(1.0D); + } + + public SeekerArrow(Level world, Entity shooter) { + super(TFEntities.SEEKER_ARROW.get(), world, shooter); + this.setBaseDamage(1.0D); + } + + @Override + protected void defineSynchedData() { + super.defineSynchedData(); + this.entityData.define(TARGET, -1); + } + + @Override + public void tick() { + if (isThisArrowFlying()) { + if (!this.getLevel().isClientSide()) { + this.updateTarget(); + } + + if (this.getLevel().isClientSide() && !this.inGround) { + for (int i = 0; i < 4; ++i) { + this.getLevel().addParticle(ParticleTypes.WITCH, this.getX() + this.getDeltaMovement().x() * i / 4.0D, this.getY() + this.getDeltaMovement().y() * i / 4.0D, this.getZ() + this.getDeltaMovement().z() * i / 4.0D, -this.getDeltaMovement().x(), -this.getDeltaMovement().y() + 0.2D, -this.getDeltaMovement().z()); + } + } + + Entity target = getTarget(); + if (target != null) { + + Vec3 targetVec = getVectorToTarget(target).scale(seekFactor); + Vec3 courseVec = getMotionVec(); + + // vector lengths + double courseLen = courseVec.length(); + double targetLen = targetVec.length(); + double totalLen = Math.sqrt(courseLen * courseLen + targetLen * targetLen); + + double dotProduct = courseVec.dot(targetVec) / (courseLen * targetLen); // cosine similarity + + if (dotProduct > seekThreshold) { + + // add vector to target, scale to match current velocity + Vec3 newMotion = courseVec.scale(courseLen / totalLen).add(targetVec.scale(courseLen / totalLen)); + + this.setDeltaMovement(newMotion.add(0, 0.045F, 0)); + + } else if (!this.getLevel().isClientSide()) { + // too inaccurate for our intended target, give up on it + this.setTarget(null); + } + } + } + + super.tick(); + } + + private void updateTarget() { + + Entity target = getTarget(); + + if (target != null && !target.isAlive()) { + target = null; + this.setTarget(null); + } + + if (target == null) { + AABB positionBB = new AABB(getX(), getY(), getZ(), getX(), getY(), getZ()); + AABB targetBB = positionBB; + + // add two possible courses to our selection box + Vec3 courseVec = getMotionVec().scale(seekDistance).yRot((float) seekAngle); + targetBB = targetBB.minmax(positionBB.move(courseVec)); + + courseVec = getMotionVec().scale(seekDistance).yRot((float) -seekAngle); + targetBB = targetBB.minmax(positionBB.move(courseVec)); + + targetBB = targetBB.inflate(0, seekDistance * 0.5, 0); + + double closestDot = -1.0; + Entity closestTarget = null; + + List entityList = this.getLevel().getEntitiesOfClass(LivingEntity.class, targetBB); + List monsters = entityList.stream().filter(l -> l instanceof Monster).collect(Collectors.toList()); + + if (!monsters.isEmpty()) { + for (LivingEntity monster : monsters) { + if (((Monster) monster).getTarget() == this.getOwner()) { + setTarget(monster); + return; + } + } + for (LivingEntity monster : monsters) { + if (monster instanceof NeutralMob) continue; + + if (monster.hasLineOfSight(this)) { + setTarget(monster); + return; + } + } + } + + for (LivingEntity living : entityList) { + + if (!living.hasLineOfSight(this)) continue; + + if (living == this.getOwner()) continue; + + if (getOwner() != null && living instanceof TamableAnimal animal && animal.getOwner() == this.getOwner()) + continue; + + Vec3 motionVec = getMotionVec().normalize(); + Vec3 targetVec = getVectorToTarget(living).normalize(); + + double dot = motionVec.dot(targetVec); + + if (dot > Math.max(closestDot, seekThreshold)) { + closestDot = dot; + closestTarget = living; + } + } + + if (closestTarget != null) { + setTarget(closestTarget); + } + } + } + + private Vec3 getMotionVec() { + return new Vec3(this.getDeltaMovement().x(), this.getDeltaMovement().y(), this.getDeltaMovement().z()); + } + + private Vec3 getVectorToTarget(Entity target) { + return new Vec3(target.getX() - this.getX(), (target.getY() + target.getEyeHeight()) - this.getY(), target.getZ() - this.getZ()); + } + + @Nullable + private Entity getTarget() { + return this.getLevel().getEntity(this.entityData.get(TARGET)); + } + + private void setTarget(@Nullable Entity e) { + this.entityData.set(TARGET, e == null ? -1 : e.getId()); + } + + private boolean isThisArrowFlying() { + return !this.inGround && getDeltaMovement().lengthSqr() > 1.0; + } + + @Override + protected void onHitEntity(EntityHitResult result) { + this.setCritArrow(false); + super.onHitEntity(result); + } +} diff --git a/src/main/java/twilightforest/entity/projectile/SlimeProjectile.java b/src/main/java/twilightforest/entity/projectile/SlimeProjectile.java new file mode 100644 index 0000000000..8ab1d9ba21 --- /dev/null +++ b/src/main/java/twilightforest/entity/projectile/SlimeProjectile.java @@ -0,0 +1,93 @@ +package twilightforest.entity.projectile; + +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.entity.projectile.ItemSupplier; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.EntityHitResult; +import net.minecraft.world.phys.HitResult; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +@OnlyIn(value = Dist.CLIENT, _interface = ItemSupplier.class) +public class SlimeProjectile extends TFThrowable implements ItemSupplier { + + public SlimeProjectile(EntityType type, Level world) { + super(type, world); + } + + public SlimeProjectile(EntityType type, Level world, LivingEntity thrower) { + super(type, world, thrower); + } + + @Override + public void tick() { + super.tick(); + this.makeTrail(ParticleTypes.ITEM_SLIME, 2); + } + + @Override + protected float getGravity() { + return 0.006F; + } + + @Override + public boolean hurt(DamageSource source, float amount) { + super.hurt(source, amount); + this.die(); + return true; + } + + @OnlyIn(Dist.CLIENT) + @Override + public void handleEntityEvent(byte id) { + if (id == 3) { + for (int i = 0; i < 8; ++i) { + this.getLevel().addParticle(ParticleTypes.ITEM_SLIME, this.getX(), this.getY(), this.getZ(), this.random.nextGaussian() * 0.05D, random.nextDouble() * 0.2D, random.nextGaussian() * 0.05D); + } + } else { + super.handleEntityEvent(id); + } + } + + @Override + protected void onHitEntity(EntityHitResult result) { + super.onHitEntity(result); + Entity target = result.getEntity(); + if (!this.getLevel().isClientSide() && target instanceof LivingEntity) { + target.hurt(this.damageSources().thrown(this, this.getOwner()), 4); + //damage armor pieces + if (target instanceof Player player) { + for (ItemStack stack : player.getArmorSlots()) + stack.hurtAndBreak(this.random.nextInt(1), player, (user) -> user.broadcastBreakEvent(stack.getEquipmentSlot() != null ? stack.getEquipmentSlot() : EquipmentSlot.HEAD)); + } + } + } + + @Override + protected void onHit(HitResult result) { + super.onHit(result); + this.die(); + } + + private void die() { + if (!this.getLevel().isClientSide()) { + this.playSound(SoundEvents.SLIME_SQUISH, 1.0F, 1.0F / (this.random.nextFloat() * 0.4F + 0.8F)); + this.discard(); + this.getLevel().broadcastEntityEvent(this, (byte) 3); + } + } + + @Override + public ItemStack getItem() { + return new ItemStack(Items.SLIME_BALL); + } +} diff --git a/src/main/java/twilightforest/entity/projectile/TFArrow.java b/src/main/java/twilightforest/entity/projectile/TFArrow.java new file mode 100644 index 0000000000..e0406b4a8f --- /dev/null +++ b/src/main/java/twilightforest/entity/projectile/TFArrow.java @@ -0,0 +1,28 @@ +package twilightforest.entity.projectile; + +import net.minecraft.network.protocol.Packet; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.projectile.AbstractArrow; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.Level; +import net.minecraftforge.network.NetworkHooks; + +public abstract class TFArrow extends AbstractArrow implements ITFProjectile { + + public TFArrow(EntityType type, Level worldIn) { + super(type, worldIn); + } + + public TFArrow(EntityType type, Level worldIn, Entity shooter) { + super(type, worldIn); + this.setOwner(shooter); + this.setPos(shooter.getX(), shooter.getEyeY() - 0.1D, shooter.getZ()); + } + + @Override + protected ItemStack getPickupItem() { + return new ItemStack(Items.ARROW); + } +} diff --git a/src/main/java/twilightforest/entity/projectile/TFThrowable.java b/src/main/java/twilightforest/entity/projectile/TFThrowable.java new file mode 100644 index 0000000000..2396a6f781 --- /dev/null +++ b/src/main/java/twilightforest/entity/projectile/TFThrowable.java @@ -0,0 +1,44 @@ +package twilightforest.entity.projectile; + +import net.minecraft.core.particles.ParticleOptions; +import net.minecraft.core.particles.ParticleType; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.network.protocol.Packet; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.projectile.ThrowableProjectile; +import net.minecraft.world.level.Level; +import net.minecraftforge.network.NetworkHooks; + +public abstract class TFThrowable extends ThrowableProjectile implements ITFProjectile { + + public TFThrowable(EntityType type, Level worldIn) { + super(type, worldIn); + } + + public TFThrowable(EntityType type, Level worldIn, double x, double y, double z) { + super(type, x, y, z, worldIn); + } + + public TFThrowable(EntityType type, Level worldIn, LivingEntity throwerIn) { + super(type, throwerIn, worldIn); + } + + @Override + protected void defineSynchedData() { + + } + + public void makeTrail(ParticleOptions particle, int amount) { + this.makeTrail(particle, 0.0D, 0.0D, 0.0D, amount); + } + + public void makeTrail(ParticleOptions particle, double r, double g, double b, int amount) { + for (int i = 0; i < amount; i++) { + double dx = this.getX() + 0.5 * (this.random.nextDouble() - this.random.nextDouble()); + double dy = this.getY() + 0.5 * (this.random.nextDouble() - this.random.nextDouble()); + double dz = this.getZ() + 0.5 * (this.random.nextDouble() - this.random.nextDouble()); + this.getLevel().addParticle(particle, dx, dy, dz, r, g, b); + } + } +} diff --git a/src/main/java/twilightforest/entity/projectile/ThrownBlock.java b/src/main/java/twilightforest/entity/projectile/ThrownBlock.java new file mode 100644 index 0000000000..ee703914d2 --- /dev/null +++ b/src/main/java/twilightforest/entity/projectile/ThrownBlock.java @@ -0,0 +1,107 @@ +package twilightforest.entity.projectile; + +import net.minecraft.core.particles.BlockParticleOption; +import net.minecraft.core.particles.ParticleOptions; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.core.registries.Registries; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtUtils; +import net.minecraft.network.chat.Component; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.game.ClientGamePacketListener; +import net.minecraft.network.protocol.game.ClientboundAddEntityPacket; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.gameevent.GameEvent; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.EntityHitResult; +import twilightforest.entity.monster.Troll; +import twilightforest.init.TFDamageTypes; +import twilightforest.init.TFEntities; + +import org.jetbrains.annotations.Nullable; + +public class ThrownBlock extends TFThrowable { + + private BlockState state = Blocks.STONE.defaultBlockState(); + + public ThrownBlock(EntityType type, Level worldIn) { + super(type, worldIn); + } + + public ThrownBlock(Level world, LivingEntity thrower, @Nullable BlockState state) { + super(TFEntities.THROWN_BLOCK.get(), world, thrower); + if (state != null) { + this.state = state; + } + } + + @Override + protected void addAdditionalSaveData(CompoundTag tag) { + super.addAdditionalSaveData(tag); + tag.put("BlockState", NbtUtils.writeBlockState(this.state)); + } + + @Override + protected void readAdditionalSaveData(CompoundTag tag) { + super.readAdditionalSaveData(tag); + this.state = NbtUtils.readBlockState(this.getLevel().holderLookup(Registries.BLOCK), tag.getCompound("BlockState")); + } + + @Override + public void handleEntityEvent(byte id) { + if (id == 3) { + ParticleOptions particle = new BlockParticleOption(ParticleTypes.BLOCK, this.state); + for (int i = 0; i < 20; i++) { + this.level.addParticle(particle, false, this.getX(), this.getY(), this.getZ(), this.random.nextGaussian() * 0.05D, this.random.nextDouble() * 0.2D, this.random.nextGaussian() * 0.05D); + } + } else { + super.handleEntityEvent(id); + } + } + + @Override + protected void onHitEntity(EntityHitResult result) { + super.onHitEntity(result); + if (result.getEntity() instanceof LivingEntity living && !(living instanceof Troll) && !this.getLevel().isClientSide()) { + living.hurt(TFDamageTypes.getDamageSource(this.getLevel(), TFDamageTypes.THROWN_BLOCK), 6); + + this.getLevel().broadcastEntityEvent(this, (byte) 3); + this.discard(); + } + } + + @Override + protected void onHitBlock(BlockHitResult result) { + super.onHitBlock(result); + if (!this.getLevel().isClientSide()) { + this.getLevel().broadcastEntityEvent(this, (byte) 3); + this.gameEvent(GameEvent.BLOCK_DESTROY, this.getOwner()); + this.discard(); + } + } + + public BlockState getBlockState() { + return this.state; + } + + @Override + public Packet getAddEntityPacket() { + return new ClientboundAddEntityPacket(this, Block.getId(this.getBlockState())); + } + + @Override + public Component getTypeName() { + return this.getBlockState().getBlock().getName(); + } + + @Override + public void recreateFromPacket(ClientboundAddEntityPacket packet) { + super.recreateFromPacket(packet); + this.state = Block.stateById(packet.getData()); + } +} diff --git a/src/main/java/twilightforest/entity/projectile/ThrownWep.java b/src/main/java/twilightforest/entity/projectile/ThrownWep.java new file mode 100644 index 0000000000..110a502efe --- /dev/null +++ b/src/main/java/twilightforest/entity/projectile/ThrownWep.java @@ -0,0 +1,106 @@ +package twilightforest.entity.projectile; + +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.network.syncher.EntityDataAccessor; +import net.minecraft.network.syncher.EntityDataSerializers; +import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.EntityHitResult; +import net.minecraft.world.phys.HitResult; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import twilightforest.entity.boss.KnightPhantom; +import twilightforest.init.TFDamageTypes; +import twilightforest.init.TFItems; + +public class ThrownWep extends TFThrowable { + + private static final EntityDataAccessor DATA_ITEMSTACK = SynchedEntityData.defineId(ThrownWep.class, EntityDataSerializers.ITEM_STACK); + private static final EntityDataAccessor DATA_VELOCITY = SynchedEntityData.defineId(ThrownWep.class, EntityDataSerializers.FLOAT); + + private float projectileDamage = 6; + + public ThrownWep(EntityType type, Level world, LivingEntity thrower) { + super(type, world, thrower); + } + + public ThrownWep(EntityType type, Level world) { + super(type, world); + } + + public ThrownWep setDamage(float damage) { + this.projectileDamage = damage; + return this; + } + + @Override + protected void defineSynchedData() { + this.entityData.define(DATA_ITEMSTACK, ItemStack.EMPTY); + this.entityData.define(DATA_VELOCITY, 0.001F); + } + + public ThrownWep setItem(ItemStack stack) { + this.entityData.set(DATA_ITEMSTACK, stack); + return this; + } + + public ItemStack getItem() { + return this.entityData.get(DATA_ITEMSTACK); + } + + public ThrownWep setVelocity(float velocity) { + this.entityData.set(DATA_VELOCITY, velocity); + return this; + } + + @OnlyIn(Dist.CLIENT) + @Override + public void handleEntityEvent(byte id) { + if (id == 3) { + for (int i = 0; i < 8; ++i) { + this.getLevel().addParticle(ParticleTypes.LARGE_SMOKE, this.getX(), this.getY(), this.getZ(), 0.0D, 0.0D, 0.0D); + } + } else { + super.handleEntityEvent(id); + } + } + + @Override + protected void onHitEntity(EntityHitResult result) { + super.onHitEntity(result); + if (result.getEntity() instanceof KnightPhantom || result.getEntity() == this.getOwner()) { + return; + } + + if (!this.getLevel().isClientSide()) { + result.getEntity().hurt(TFDamageTypes.getDamageSource(this.getLevel(), this.getItem().getItem() == TFItems.KNIGHTMETAL_PICKAXE.get() ? TFDamageTypes.THROWN_PICKAXE : TFDamageTypes.THROWN_AXE), this.projectileDamage); + } + } + + @Override + protected void onHit(HitResult result) { + super.onHit(result); + if (!this.getLevel().isClientSide()) { + this.getLevel().broadcastEntityEvent(this, (byte) 3); + discard(); + } + } + + @Override + public boolean isPickable() { + return true; + } + + @Override + public float getPickRadius() { + return 1.0F; + } + + @Override + protected float getGravity() { + return this.entityData.get(DATA_VELOCITY); + } +} diff --git a/src/main/java/twilightforest/entity/projectile/TomeBolt.java b/src/main/java/twilightforest/entity/projectile/TomeBolt.java new file mode 100644 index 0000000000..c233f4b463 --- /dev/null +++ b/src/main/java/twilightforest/entity/projectile/TomeBolt.java @@ -0,0 +1,84 @@ +package twilightforest.entity.projectile; + +import net.minecraft.core.particles.ItemParticleOption; +import net.minecraft.core.particles.ParticleOptions; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.world.Difficulty; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.projectile.ItemSupplier; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.EntityHitResult; +import net.minecraft.world.phys.HitResult; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import twilightforest.init.TFDamageTypes; +import twilightforest.init.TFEntities; + +@OnlyIn(value = Dist.CLIENT, _interface = ItemSupplier.class) +public class TomeBolt extends TFThrowable implements ItemSupplier { + + public TomeBolt(EntityType type, Level world, LivingEntity thrower) { + super(type, world, thrower); + } + + public TomeBolt(EntityType type, Level world) { + super(type, world); + } + + @Override + public void tick() { + super.tick(); + this.makeTrail(ParticleTypes.CRIT, 5); + } + + @Override + protected float getGravity() { + return 0.003F; + } + + + + @OnlyIn(Dist.CLIENT) + @Override + public void handleEntityEvent(byte id) { + if (id == 3) { + ParticleOptions particle = new ItemParticleOption(ParticleTypes.ITEM, new ItemStack(Items.PAPER)); + for (int i = 0; i < 8; ++i) { + this.getLevel().addParticle(particle, false, this.getX(), this.getY(), this.getZ(), this.random.nextGaussian() * 0.05D, this.random.nextDouble() * 0.2D, this.random.nextGaussian() * 0.05D); + } + } else { + super.handleEntityEvent(id); + } + } + + @Override + protected void onHitEntity(EntityHitResult result) { + super.onHitEntity(result); + if (result.getEntity() instanceof LivingEntity living) { + if (result.getEntity().hurt(TFDamageTypes.getIndirectEntityDamageSource(this.getLevel(), this.random.nextBoolean() ? TFDamageTypes.LOST_WORDS : TFDamageTypes.SCHOOLED, this.getOwner(), this), 3)) { + // inflict move slowdown + int duration = this.getLevel().getDifficulty() == Difficulty.EASY ? 2 : this.getLevel().getDifficulty() == Difficulty.NORMAL ? 6 : 8; + living.addEffect(new MobEffectInstance(MobEffects.MOVEMENT_SLOWDOWN, duration * 20, 1)); + } + } + } + + @Override + protected void onHit(HitResult result) { + super.onHit(result); + if (!this.getLevel().isClientSide()) { + this.getLevel().broadcastEntityEvent(this, (byte) 3); + this.discard(); + } + } + + @Override + public ItemStack getItem() { + return new ItemStack(Items.PAPER); + } +} diff --git a/src/main/java/twilightforest/entity/projectile/TwilightWandBolt.java b/src/main/java/twilightforest/entity/projectile/TwilightWandBolt.java new file mode 100644 index 0000000000..46173959f1 --- /dev/null +++ b/src/main/java/twilightforest/entity/projectile/TwilightWandBolt.java @@ -0,0 +1,111 @@ +package twilightforest.entity.projectile; + +import net.minecraft.core.particles.ItemParticleOption; +import net.minecraft.core.particles.ParticleOptions; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.EntityHitResult; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import twilightforest.init.TFDamageTypes; +import twilightforest.init.TFEntities; + +public class TwilightWandBolt extends TFThrowable { + + public TwilightWandBolt(EntityType type, Level world) { + super(type, world); + } + + public TwilightWandBolt(Level world, LivingEntity thrower) { + super(TFEntities.WAND_BOLT.get(), world, thrower); + this.shootFromRotation(thrower, thrower.getXRot(), thrower.getYRot(), 0, 1.5F, 1.0F); + } + + public TwilightWandBolt(Level worldIn, double x, double y, double z) { + super(TFEntities.WAND_BOLT.get(), worldIn, x, y, z); + } + + @Override + public void tick() { + super.tick(); + this.makeTrail(); + } + + private void makeTrail() { + for (int i = 0; i < 5; i++) { + double dx = this.getX() + 0.5D * (this.random.nextDouble() - this.random.nextDouble()); + double dy = this.getY() + 0.5D * (this.random.nextDouble() - this.random.nextDouble()); + double dz = this.getZ() + 0.5D * (this.random.nextDouble() - this.random.nextDouble()); + + double s1 = ((this.random.nextFloat() * 0.5F) + 0.5F) * 0.17F; // color + double s2 = ((this.random.nextFloat() * 0.5F) + 0.5F) * 0.80F; // color + double s3 = ((this.random.nextFloat() * 0.5F) + 0.5F) * 0.69F; // color + + this.getLevel().addParticle(ParticleTypes.ENTITY_EFFECT, dx, dy, dz, s1, s2, s3); + } + } + + @Override + protected float getGravity() { + return 0.003F; + } + + @OnlyIn(Dist.CLIENT) + @Override + public void handleEntityEvent(byte id) { + if (id == 3) { + ParticleOptions particle = new ItemParticleOption(ParticleTypes.ITEM, new ItemStack(Items.ENDER_PEARL)); + for (int i = 0; i < 8; i++) { + this.getLevel().addParticle(particle, false, this.getX(), this.getY(), this.getZ(), this.random.nextGaussian() * 0.05D, random.nextDouble() * 0.2D, random.nextGaussian() * 0.05D); + } + } else { + super.handleEntityEvent(id); + } + } + + @Override + protected void onHitEntity(EntityHitResult result) { + super.onHitEntity(result); + if (!this.getLevel().isClientSide()) { + result.getEntity().hurt(TFDamageTypes.getIndirectEntityDamageSource(this.getLevel(), TFDamageTypes.TWILIGHT_SCEPTER, this.getOwner(), this), 6); + + this.getLevel().broadcastEntityEvent(this, (byte) 3); + this.discard(); + } + } + + @Override + protected void onHitBlock(BlockHitResult result) { + super.onHitBlock(result); + if (!this.getLevel().isClientSide()) { + + this.getLevel().broadcastEntityEvent(this, (byte) 3); + this.discard(); + } + } + + @Override + public boolean hurt(DamageSource source, float amount) { + super.hurt(source, amount); + + if (!this.getLevel().isClientSide() && source.getEntity() != null) { + Vec3 vec3d = source.getEntity().getLookAngle(); + // reflect faster and more accurately + this.shoot(vec3d.x(), vec3d.y(), vec3d.z(), 1.5F, 0.1F); + + if (source.getDirectEntity() instanceof LivingEntity) { + this.setOwner(source.getDirectEntity()); + } + return true; + } + + return false; + } +} diff --git a/src/main/java/twilightforest/entity/projectile/UrGhastFireball.java b/src/main/java/twilightforest/entity/projectile/UrGhastFireball.java new file mode 100644 index 0000000000..01858de599 --- /dev/null +++ b/src/main/java/twilightforest/entity/projectile/UrGhastFireball.java @@ -0,0 +1,79 @@ +package twilightforest.entity.projectile; + +import net.minecraft.core.BlockPos; +import net.minecraft.util.Mth; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.projectile.AbstractHurtingProjectile; +import net.minecraft.world.entity.projectile.LargeFireball; +import net.minecraft.world.level.Explosion; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.gameevent.GameEvent; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.EntityHitResult; +import net.minecraft.world.phys.HitResult; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.event.ForgeEventFactory; +import twilightforest.entity.boss.UrGhast; + +public class UrGhastFireball extends LargeFireball implements ITFProjectile { + + private final int power; + + public UrGhastFireball(Level world, UrGhast entityTFTowerBoss, double x, double y, double z, int power) { + super(world, entityTFTowerBoss, x, y, z, power); + this.power = power; + } + + //[VanillaCopy] of Projectile.onHit. We don't want fireballs to explode no matter what they hit, which is what LargeFireball.onHit does + @Override + protected void onHit(HitResult pResult) { + HitResult.Type hitresult$type = pResult.getType(); + if (hitresult$type == HitResult.Type.ENTITY) { + this.onHitEntity((EntityHitResult)pResult); + this.level.gameEvent(GameEvent.PROJECTILE_LAND, pResult.getLocation(), GameEvent.Context.of(this, null)); + } else if (hitresult$type == HitResult.Type.BLOCK) { + BlockHitResult blockhitresult = (BlockHitResult)pResult; + this.onHitBlock(blockhitresult); + BlockPos blockpos = blockhitresult.getBlockPos(); + this.level.gameEvent(GameEvent.PROJECTILE_LAND, blockpos, GameEvent.Context.of(this, this.level.getBlockState(blockpos))); + } + } + + @Override + protected void onHitEntity(EntityHitResult result) { + if (!this.getLevel().isClientSide() && !(result.getEntity() instanceof AbstractHurtingProjectile)) { + // TF - up damage by 10 + result.getEntity().hurt(this.damageSources().fireball(this, this.getOwner()), 16.0F); + this.doEnchantDamageEffects((LivingEntity) this.getOwner(), result.getEntity()); + + boolean flag = ForgeEventFactory.getMobGriefingEvent(this.getLevel(), this.getOwner()); + this.getLevel().explode(null, this.getX(), this.getY(), this.getZ(), this.power, flag, Level.ExplosionInteraction.NONE); + this.discard(); + } + } + + @Override + protected void onHitBlock(BlockHitResult result) { + super.onHitBlock(result); + //explode and leave fire when hitting a block, but dont destroy them + boolean flag = ForgeEventFactory.getMobGriefingEvent(this.getLevel(), this.getOwner()); + this.getLevel().explode(null, this.getX(), this.getY(), this.getZ(), (float) this.power, flag, Level.ExplosionInteraction.NONE); + this.discard(); + } + + @Override + public void shoot(double x, double y, double z, float scale, float dist) { + Vec3 vec3d = (new Vec3(x, y, z)) + .normalize() + .add(this.random.nextGaussian() * 0.0075F * dist, this.random.nextGaussian() * 0.0075F * dist, this.random.nextGaussian() * 0.0075F * dist) + .scale(scale); + this.setDeltaMovement(vec3d); + float f = Mth.sqrt((float) distanceToSqr(vec3d)); + this.setYRot((float) (Mth.atan2(vec3d.x(), z) * (180F / Mth.PI))); + this.setXRot((float) (Mth.atan2(vec3d.y(), f) * (180F / Mth.PI))); + this.yRotO = this.getYRot(); + this.xRotO = this.getXRot(); + } +} diff --git a/src/main/java/twilightforest/entity/projectile/package-info.java b/src/main/java/twilightforest/entity/projectile/package-info.java new file mode 100644 index 0000000000..7eb2d44652 --- /dev/null +++ b/src/main/java/twilightforest/entity/projectile/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.entity.projectile; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/enums/BanisterShape.java b/src/main/java/twilightforest/enums/BanisterShape.java new file mode 100644 index 0000000000..e0f2a5ad79 --- /dev/null +++ b/src/main/java/twilightforest/enums/BanisterShape.java @@ -0,0 +1,23 @@ +package twilightforest.enums; + +import net.minecraft.util.StringRepresentable; + +import java.util.Locale; + +public enum BanisterShape implements StringRepresentable { + SHORT, + TALL, + CONNECTED; + + // FIXME Once Mojang fixes this bug that's already older than half the age of the game itself, + // we can re-look at readding these two variants. The models themselves expand behind the normal 0->16 Voxel range, + // so before re-adding these models PLEASE PLEASE ensure the lighting looks good and proper on them. + // https://bugs.mojang.com/browse/MC-84633 + //TILT_RIGHT, + //TILT_LEFT; + + @Override + public String getSerializedName() { + return this.name().toLowerCase(Locale.ROOT); + } +} diff --git a/src/main/java/twilightforest/enums/BlockLoggingEnum.java b/src/main/java/twilightforest/enums/BlockLoggingEnum.java new file mode 100644 index 0000000000..00e996675a --- /dev/null +++ b/src/main/java/twilightforest/enums/BlockLoggingEnum.java @@ -0,0 +1,102 @@ +package twilightforest.enums; + +import net.minecraft.core.BlockPos; +import net.minecraft.util.StringRepresentable; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.*; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.EnumProperty; +import net.minecraft.world.level.material.Fluid; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.level.material.Fluids; + +import java.util.HashMap; +import java.util.Locale; + +public enum BlockLoggingEnum implements StringRepresentable { + AIR (Blocks.AIR, Fluids.EMPTY), + WATER (Blocks.WATER, Fluids.WATER), + LAVA (Blocks.LAVA, Fluids.LAVA), + OBSIDIAN (Blocks.OBSIDIAN, Fluids.EMPTY), + STONE (Blocks.STONE, Fluids.EMPTY), + BASALT (Blocks.BASALT, Fluids.EMPTY); + + public static final EnumProperty MULTILOGGED = EnumProperty.create("multilogged", BlockLoggingEnum.class); + + private final Block block; + private final Fluid fluid; + private final String name; + + BlockLoggingEnum(Block block, Fluid fluid) { + this.block = block; + this.fluid = fluid; + this.name = name().toLowerCase(Locale.ROOT); + + if (fluid != Fluids.EMPTY && block == Blocks.AIR) { + Ref.FLUIDS.put(fluid, this); + } + if(fluid == Fluids.EMPTY && block != Blocks.AIR) { + Ref.BLOCKS.put(block, this); + } + } + + public static BlockLoggingEnum getFromFluid(Fluid fluid) { + return Ref.FLUIDS.getOrDefault(fluid, AIR); + } + + public static BlockLoggingEnum getFromBlock(Block block) { + return Ref.BLOCKS.getOrDefault(block, AIR); + } + + @Override + public String getSerializedName() { + return name; + } + + public Fluid getFluid() { + return fluid; + } + + public Block getBlock() { + return block; + } + + public interface IMultiLoggable extends BucketPickup, LiquidBlockContainer { + @Override + default ItemStack pickupBlock(LevelAccessor world, BlockPos pos, BlockState state) { + Fluid stateFluid = state.getValue(MULTILOGGED).fluid; + + if (stateFluid != Fluids.EMPTY) { + world.setBlock(pos, state.setValue(MULTILOGGED, AIR), 3); + } + + return new ItemStack(stateFluid.getBucket()); + } + + @Override + default boolean canPlaceLiquid(BlockGetter world, BlockPos pos, BlockState state, Fluid fluid) { + return state.hasProperty(MULTILOGGED) && Ref.FLUIDS.containsKey(fluid) && !fluid.equals(state.getValue(MULTILOGGED).fluid) && state.getValue(MULTILOGGED) == AIR; + } + + @Override + default boolean placeLiquid(LevelAccessor world, BlockPos pos, BlockState state, FluidState fluidState) { + Fluid stateFluid = state.getValue(MULTILOGGED).fluid; + + if (stateFluid != fluidState.getType() && Ref.FLUIDS.containsKey(fluidState.getType())) { + if (!world.isClientSide()) { + world.setBlock(pos, state.setValue(MULTILOGGED, Ref.FLUIDS.get(fluidState.getType())), 3); + world.scheduleTick(pos, fluidState.getType(), fluidState.getType().getTickDelay(world)); + } + return true; + } + return false; + } + } + + private static class Ref { + private final static HashMap FLUIDS = new HashMap<>(); + private final static HashMap BLOCKS = new HashMap<>(); + } +} diff --git a/src/main/java/twilightforest/enums/BossVariant.java b/src/main/java/twilightforest/enums/BossVariant.java new file mode 100644 index 0000000000..6521f784bc --- /dev/null +++ b/src/main/java/twilightforest/enums/BossVariant.java @@ -0,0 +1,66 @@ +package twilightforest.enums; + +import net.minecraft.world.level.block.SkullBlock; +import net.minecraft.util.StringRepresentable; +import net.minecraft.world.level.block.entity.BlockEntityType; +import twilightforest.init.TFBlockEntities; +import twilightforest.block.entity.spawner.BossSpawnerBlockEntity; + +import org.jetbrains.annotations.Nullable; +import java.util.Locale; +import java.util.function.Supplier; + +public enum BossVariant implements StringRepresentable, SkullBlock.Type { + + NAGA (TrophyType.GOLD , TFBlockEntities.NAGA_SPAWNER::get), + LICH (TrophyType.GOLD , TFBlockEntities.LICH_SPAWNER::get), + HYDRA (TrophyType.GOLD , TFBlockEntities.HYDRA_SPAWNER::get), + UR_GHAST (TrophyType.GOLD , TFBlockEntities.UR_GHAST_SPAWNER::get), + KNIGHT_PHANTOM(TrophyType.IRON , TFBlockEntities.KNIGHT_PHANTOM_SPAWNER::get), + SNOW_QUEEN (TrophyType.GOLD , TFBlockEntities.SNOW_QUEEN_SPAWNER::get), + MINOSHROOM (TrophyType.IRON , TFBlockEntities.MINOSHROOM_SPAWNER::get), + ALPHA_YETI (TrophyType.IRON , TFBlockEntities.ALPHA_YETI_SPAWNER::get), + QUEST_RAM (TrophyType.IRONWOOD, null), + FINAL_BOSS (TrophyType.GOLD , TFBlockEntities.FINAL_BOSS_SPAWNER::get); + + private final TrophyType trophyType; + private final Supplier>> blockEntityType; + + public static final BossVariant[] VARIANTS = values(); + + BossVariant(TrophyType trophyType, @Nullable Supplier>> blockEntityType) { + this.trophyType = trophyType; + this.blockEntityType = blockEntityType; + } + + @Override + public String getSerializedName() { + return name().toLowerCase(Locale.ROOT); + } + + public TrophyType getTrophyType() { + return this.trophyType; + } + + + @Nullable + public BlockEntityType> getType() { + return blockEntityType != null ? blockEntityType.get() : null; + } + + public enum TrophyType { + GOLD("trophy"), + IRON("trophy_minor"), + IRONWOOD("trophy_quest"); + + private final String modelName; + + TrophyType(String modelName) { + this.modelName = modelName; + } + + public String getModelName() { + return this.modelName; + } + } +} diff --git a/src/main/java/twilightforest/enums/Diagonals.java b/src/main/java/twilightforest/enums/Diagonals.java new file mode 100644 index 0000000000..349a921321 --- /dev/null +++ b/src/main/java/twilightforest/enums/Diagonals.java @@ -0,0 +1,115 @@ +package twilightforest.enums; + +import net.minecraft.core.Direction; +import net.minecraft.util.StringRepresentable; +import net.minecraft.world.level.block.Mirror; +import net.minecraft.world.level.block.Rotation; + +import java.util.Locale; + +public enum Diagonals implements StringRepresentable { + TOP_RIGHT ((x, rX) -> rX - x, (y, rY) -> y , true , false), + BOTTOM_RIGHT((x, rX) -> rX - x, (y, rY) -> rY - y, false, false), + BOTTOM_LEFT ((x, rX) -> x , (y, rY) -> rY - y, false, true ), + TOP_LEFT ((x, rX) -> x , (y, rY) -> y , true , true ); + + public final Inversion operationX; + public final Inversion operationY; + private final boolean isTop; + private final boolean isLeft; + + Diagonals(Inversion operationX, Inversion operationY, boolean isTop, boolean isLeft) { + this.operationX = operationX; + this.operationY = operationY; + this.isTop = isTop; + this.isLeft = isLeft; + } + + public static Diagonals getDiagonalFromUpDownLeftRight(boolean isLeft, boolean isTop) { + if (isLeft) + return isTop ? TOP_LEFT : BOTTOM_LEFT; + else + return isTop ? TOP_RIGHT : BOTTOM_RIGHT; + } + + public static Diagonals rotate(Diagonals diagonal, Rotation rotation) { + return Diagonals.values()[(diagonal.ordinal() + rotation.ordinal()) % 4]; + } + + public static Diagonals mirrorOn(Direction.Axis axis, Diagonals diagonal, Mirror mirror) { + return switch (axis) { + case X -> mirrorOnX(diagonal, mirror); + case Z -> mirrorOnZ(diagonal, mirror); + default -> mirror(diagonal, mirror); + }; + } + + public static Diagonals mirrorOnX(Diagonals diagonal, Mirror mirror) { + if (mirror == Mirror.FRONT_BACK) { + return switch (diagonal) { + case TOP_RIGHT -> BOTTOM_RIGHT; + case BOTTOM_RIGHT -> TOP_RIGHT; + case BOTTOM_LEFT -> TOP_LEFT; + case TOP_LEFT -> BOTTOM_LEFT; + //default -> diagonal; + }; + } + return diagonal; + } + + public static Diagonals mirrorLeftRight(Diagonals diagonal) { + return switch (diagonal) { + case TOP_RIGHT -> TOP_LEFT; + case BOTTOM_RIGHT -> BOTTOM_LEFT; + case BOTTOM_LEFT -> BOTTOM_RIGHT; + case TOP_LEFT -> TOP_RIGHT; + }; + } + + public static Diagonals mirrorUpDown(Diagonals diagonal) { + return switch (diagonal) { + case TOP_RIGHT -> BOTTOM_RIGHT; + case BOTTOM_RIGHT -> TOP_RIGHT; + case BOTTOM_LEFT -> TOP_LEFT; + case TOP_LEFT -> BOTTOM_LEFT; + }; + } + + public static Diagonals mirror(Diagonals diagonal, Mirror mirror) { + return switch (mirror) { + case LEFT_RIGHT -> mirrorLeftRight(diagonal); + case FRONT_BACK -> mirrorUpDown(diagonal); + default -> diagonal; + }; + } + + public static Diagonals mirrorOnZ(Diagonals diagonal, Mirror mirror) { + if (mirror == Mirror.LEFT_RIGHT) { + return switch (diagonal) { + case TOP_RIGHT -> TOP_LEFT; + case BOTTOM_RIGHT -> BOTTOM_LEFT; + case BOTTOM_LEFT -> BOTTOM_RIGHT; + case TOP_LEFT -> TOP_RIGHT; + //default -> diagonal; + }; + } + return diagonal; + } + + @Override + public String getSerializedName() { + return name().toLowerCase(Locale.ROOT); + } + + public boolean isTop() { + return isTop; + } + + public boolean isLeft() { + return isLeft; + } + + public interface Inversion { + int convert(int numberIn, int range); + } +} diff --git a/src/main/java/twilightforest/enums/FireJetVariant.java b/src/main/java/twilightforest/enums/FireJetVariant.java new file mode 100644 index 0000000000..a10c4f8191 --- /dev/null +++ b/src/main/java/twilightforest/enums/FireJetVariant.java @@ -0,0 +1,22 @@ +package twilightforest.enums; + +import net.minecraft.util.StringRepresentable; + +import java.util.Locale; + +public enum FireJetVariant implements StringRepresentable { + IDLE, + POPPING, + FLAME, + TIMEOUT; + + @Override + public String toString() { + return getSerializedName(); + } + + @Override + public String getSerializedName() { + return name().toLowerCase(Locale.ROOT); + } +} diff --git a/src/main/java/twilightforest/enums/HollowLogVariants.java b/src/main/java/twilightforest/enums/HollowLogVariants.java new file mode 100644 index 0000000000..a9ad186da0 --- /dev/null +++ b/src/main/java/twilightforest/enums/HollowLogVariants.java @@ -0,0 +1,34 @@ +package twilightforest.enums; + +import net.minecraft.util.StringRepresentable; + +import java.util.Locale; + +public final class HollowLogVariants { + public enum Horizontal implements StringRepresentable { + EMPTY, + MOSS, + MOSS_AND_GRASS, + SNOW, + WATERLOGGED; + + @Override + public String getSerializedName() { + return this.name().toLowerCase(Locale.ROOT); + } + } + + public enum Climbable implements StringRepresentable { + VINE, + LADDER, + LADDER_WATERLOGGED; + + @Override + public String getSerializedName() { + return this.name().toLowerCase(Locale.ROOT); + } + } + + private HollowLogVariants () { + } +} diff --git a/src/main/java/twilightforest/enums/HugeLilypadPiece.java b/src/main/java/twilightforest/enums/HugeLilypadPiece.java new file mode 100644 index 0000000000..a40b7b985d --- /dev/null +++ b/src/main/java/twilightforest/enums/HugeLilypadPiece.java @@ -0,0 +1,17 @@ +package twilightforest.enums; + +import net.minecraft.util.StringRepresentable; + +import java.util.Locale; + +public enum HugeLilypadPiece implements StringRepresentable { + NW, + NE, + SE, + SW; + + @Override + public String getSerializedName() { + return name().toLowerCase(Locale.ROOT); + } +} diff --git a/src/main/java/twilightforest/enums/NagastoneVariant.java b/src/main/java/twilightforest/enums/NagastoneVariant.java new file mode 100644 index 0000000000..016cede32e --- /dev/null +++ b/src/main/java/twilightforest/enums/NagastoneVariant.java @@ -0,0 +1,63 @@ +package twilightforest.enums; + +import net.minecraft.core.Direction; +import net.minecraft.util.StringRepresentable; + +import java.util.Locale; + +public enum NagastoneVariant implements StringRepresentable { + NORTH_DOWN, + SOUTH_DOWN, + WEST_DOWN, + EAST_DOWN, + NORTH_UP, + SOUTH_UP, + EAST_UP, + WEST_UP, + AXIS_X, + AXIS_Y, + AXIS_Z, + SOLID; // This can act as null + + @Override + public String getSerializedName() { + return name().toLowerCase(Locale.ROOT); + } + + public static NagastoneVariant getVariantFromAxis(Direction.Axis axis) { + return switch (axis) { + case X -> AXIS_X; + case Y -> AXIS_Y; + case Z -> AXIS_Z; + //default -> SOLID; + }; + } + + public static NagastoneVariant getVariantFromDoubleFacing(Direction facing1, Direction facing2) { + if (facing1.getAxis() == facing2.getAxis()) // Pairs of 6 dirs and axes + return getVariantFromAxis(facing1.getAxis()); // Both faces are on same axis + else if (facing1.getAxis() != Direction.Axis.Y && facing2.getAxis() != Direction.Axis.Y) + return SOLID; // Elbow connection doesn't have Y + + Direction facingYAxis = facing1.getAxis() == Direction.Axis.Y ? facing1 : facing2; + Direction otherFace = facing1.getAxis() != Direction.Axis.Y ? facing1 : facing2; + + if (facingYAxis == Direction.UP) { + return switch (otherFace) { + case NORTH -> NORTH_UP; + case SOUTH -> SOUTH_UP; + case WEST -> WEST_UP; + case EAST -> EAST_UP; + default -> SOLID; + }; + } else { + return switch (otherFace) { + case NORTH -> NORTH_DOWN; + case SOUTH -> SOUTH_DOWN; + case WEST -> WEST_DOWN; + case EAST -> EAST_DOWN; + default -> SOLID; + }; + } + } +} diff --git a/src/main/java/twilightforest/enums/TowerDeviceVariant.java b/src/main/java/twilightforest/enums/TowerDeviceVariant.java new file mode 100644 index 0000000000..1ae3b10035 --- /dev/null +++ b/src/main/java/twilightforest/enums/TowerDeviceVariant.java @@ -0,0 +1,16 @@ +package twilightforest.enums; + +import net.minecraft.util.StringRepresentable; + +import java.util.Locale; + +public enum TowerDeviceVariant implements StringRepresentable { + BUILDER_INACTIVE, + BUILDER_ACTIVE, + BUILDER_TIMEOUT; + + @Override + public String getSerializedName() { + return name().toLowerCase(Locale.ROOT); + } +} diff --git a/src/main/java/twilightforest/enums/TwilightArmorMaterial.java b/src/main/java/twilightforest/enums/TwilightArmorMaterial.java new file mode 100644 index 0000000000..f4377ea35e --- /dev/null +++ b/src/main/java/twilightforest/enums/TwilightArmorMaterial.java @@ -0,0 +1,129 @@ +package twilightforest.enums; + +import net.minecraft.Util; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.item.ArmorItem; +import net.minecraft.world.item.ArmorMaterial; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundEvents; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import twilightforest.init.TFSounds; +import twilightforest.init.TFItems; + +import java.util.EnumMap; +import java.util.function.Supplier; + +public enum TwilightArmorMaterial implements ArmorMaterial { + ARMOR_NAGA("naga_scale", 21, Util.make(new EnumMap<>(ArmorItem.Type.class), map -> { + map.put(ArmorItem.Type.BOOTS, 3); + map.put(ArmorItem.Type.LEGGINGS, 6); + map.put(ArmorItem.Type.CHESTPLATE, 7); + map.put(ArmorItem.Type.HELMET, 2); + }), 15, SoundEvents.ARMOR_EQUIP_GENERIC, 0.5F, () -> Ingredient.of(TFItems.NAGA_SCALE.get())), + ARMOR_IRONWOOD("ironwood", 20, Util.make(new EnumMap<>(ArmorItem.Type.class), map -> { + map.put(ArmorItem.Type.BOOTS, 2); + map.put(ArmorItem.Type.LEGGINGS, 5); + map.put(ArmorItem.Type.CHESTPLATE, 7); + map.put(ArmorItem.Type.HELMET, 2); + }), 15, SoundEvents.ARMOR_EQUIP_GENERIC, 0F, () -> Ingredient.of(TFItems.IRONWOOD_INGOT.get())), + ARMOR_FIERY("fiery", 25, Util.make(new EnumMap<>(ArmorItem.Type.class), map -> { + map.put(ArmorItem.Type.BOOTS, 4); + map.put(ArmorItem.Type.LEGGINGS, 7); + map.put(ArmorItem.Type.CHESTPLATE, 9); + map.put(ArmorItem.Type.HELMET, 4); + }), 10, SoundEvents.ARMOR_EQUIP_GENERIC, 1.5F, () -> Ingredient.of(TFItems.FIERY_INGOT.get())), + ARMOR_STEELEAF("steeleaf", 10, Util.make(new EnumMap<>(ArmorItem.Type.class), map -> { + map.put(ArmorItem.Type.BOOTS, 3); + map.put(ArmorItem.Type.LEGGINGS, 6); + map.put(ArmorItem.Type.CHESTPLATE, 8); + map.put(ArmorItem.Type.HELMET, 3); + }), 9, SoundEvents.ARMOR_EQUIP_GENERIC, 0F, () -> Ingredient.of(TFItems.STEELEAF_INGOT.get())), + ARMOR_KNIGHTLY("knightly", 20, Util.make(new EnumMap<>(ArmorItem.Type.class), map -> { + map.put(ArmorItem.Type.BOOTS, 3); + map.put(ArmorItem.Type.LEGGINGS, 6); + map.put(ArmorItem.Type.CHESTPLATE, 8); + map.put(ArmorItem.Type.HELMET, 3); + }), 8, TFSounds.KNIGHTMETAL_EQUIP.get(), 1.0F, () -> Ingredient.of(TFItems.KNIGHTMETAL_INGOT.get())), + ARMOR_PHANTOM("phantom", 30, Util.make(new EnumMap<>(ArmorItem.Type.class), map -> { + map.put(ArmorItem.Type.BOOTS, 3); + map.put(ArmorItem.Type.LEGGINGS, 6); + map.put(ArmorItem.Type.CHESTPLATE, 8); + map.put(ArmorItem.Type.HELMET, 3); + }), 8, SoundEvents.ARMOR_EQUIP_GENERIC, 2.5F, () -> Ingredient.of(TFItems.KNIGHTMETAL_INGOT.get())), + ARMOR_YETI("yetiarmor", 20, Util.make(new EnumMap<>(ArmorItem.Type.class), map -> { + map.put(ArmorItem.Type.BOOTS, 3); + map.put(ArmorItem.Type.LEGGINGS, 6); + map.put(ArmorItem.Type.CHESTPLATE, 7); + map.put(ArmorItem.Type.HELMET, 4); + }), 15, SoundEvents.ARMOR_EQUIP_GENERIC, 3F, () -> Ingredient.of(TFItems.ALPHA_YETI_FUR.get())), + ARMOR_ARCTIC("arcticarmor", 10, Util.make(new EnumMap<>(ArmorItem.Type.class), map -> { + map.put(ArmorItem.Type.BOOTS, 2); + map.put(ArmorItem.Type.LEGGINGS, 5); + map.put(ArmorItem.Type.CHESTPLATE, 7); + map.put(ArmorItem.Type.HELMET, 2); + }), 8, SoundEvents.ARMOR_EQUIP_GENERIC, 2F, () -> Ingredient.of(TFItems.ARCTIC_FUR.get())); + + private static final EnumMap HEALTH_FUNCTION_FOR_TYPE = Util.make(new EnumMap<>(ArmorItem.Type.class), map -> { + map.put(ArmorItem.Type.BOOTS, 13); + map.put(ArmorItem.Type.LEGGINGS, 15); + map.put(ArmorItem.Type.CHESTPLATE, 16); + map.put(ArmorItem.Type.HELMET, 11); + }); + private final String name; + private final int durability; + private final EnumMap protectionFunctionForType; + private final int enchantability; + private final SoundEvent equipSound; + private final float toughness; + private final Supplier repairMaterial; + + TwilightArmorMaterial(String name, int durability, EnumMap protectionFunctionForType, int enchantability, SoundEvent sound, float toughness, Supplier repairMaterial) { + this.name = name; + this.durability = durability; + this.protectionFunctionForType = protectionFunctionForType; + this.enchantability = enchantability; + this.equipSound = sound; + this.toughness = toughness; + this.repairMaterial = repairMaterial; + } + + @Override + public String getName() { + return name; + } + + public int getDurabilityForType(ArmorItem.Type type) { + return HEALTH_FUNCTION_FOR_TYPE.get(type) * this.durability; + } + + public int getDefenseForType(ArmorItem.Type type) { + return this.protectionFunctionForType.get(type); + } + + @Override + public int getEnchantmentValue() { + return enchantability; + } + + @Override + public SoundEvent getEquipSound() { + return equipSound; + } + + @Override + public float getToughness() { + return toughness; + } + + @Override + public Ingredient getRepairIngredient() { + return repairMaterial.get(); + } + + @Override + public float getKnockbackResistance() { + return 0.0F; //Discuss use in other sets + } +} diff --git a/src/main/java/twilightforest/enums/package-info.java b/src/main/java/twilightforest/enums/package-info.java new file mode 100644 index 0000000000..3faaec5e61 --- /dev/null +++ b/src/main/java/twilightforest/enums/package-info.java @@ -0,0 +1,6 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.enums; + +import net.minecraft.MethodsReturnNonnullByDefault; +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/events/CapabilityEvents.java b/src/main/java/twilightforest/events/CapabilityEvents.java new file mode 100644 index 0000000000..109a2a3991 --- /dev/null +++ b/src/main/java/twilightforest/events/CapabilityEvents.java @@ -0,0 +1,113 @@ +package twilightforest.events; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.tags.DamageTypeTags; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraftforge.event.entity.living.LivingAttackEvent; +import net.minecraftforge.event.entity.living.LivingEvent; +import net.minecraftforge.event.entity.player.PlayerEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.network.PacketDistributor; +import twilightforest.TFConfig; +import twilightforest.TwilightForestMod; +import twilightforest.block.TFPortalBlock; +import twilightforest.capabilities.CapabilityList; +import twilightforest.capabilities.fan.FeatherFanFallCapability; +import twilightforest.capabilities.shield.IShieldCapability; +import twilightforest.capabilities.thrown.YetiThrowCapability; +import twilightforest.network.TFPacketHandler; +import twilightforest.network.UpdateShieldPacket; + +@Mod.EventBusSubscriber(modid = TwilightForestMod.ID) +public class CapabilityEvents { + + private static final String NBT_TAG_TWILIGHT = "twilightforest_banished"; + + @SubscribeEvent + public static void updateCaps(LivingEvent.LivingTickEvent event) { + event.getEntity().getCapability(CapabilityList.SHIELDS).ifPresent(IShieldCapability::update); + event.getEntity().getCapability(CapabilityList.FEATHER_FAN_FALLING).ifPresent(FeatherFanFallCapability::update); + event.getEntity().getCapability(CapabilityList.YETI_THROWN).ifPresent(YetiThrowCapability::update); + } + + @SubscribeEvent + public static void livingAttack(LivingAttackEvent event) { + LivingEntity living = event.getEntity(); + // shields + if (!living.getLevel().isClientSide() && !event.getSource().is(DamageTypeTags.BYPASSES_ARMOR)) { + living.getCapability(CapabilityList.SHIELDS).ifPresent(cap -> { + if (cap.shieldsLeft() > 0) { + cap.breakShield(); + event.setCanceled(true); + } + }); + } + } + + @SubscribeEvent + public static void onPlayerRespawn(PlayerEvent.PlayerRespawnEvent event) { + if (!(event.getEntity() instanceof ServerPlayer serverPlayer)) return; + if (event.isEndConquered()) { + updateCapabilities(serverPlayer, serverPlayer); + } + + if (TFConfig.COMMON_CONFIG.DIMENSION.newPlayersSpawnInTF.get() && serverPlayer.getRespawnPosition() == null) { + CompoundTag tagCompound = serverPlayer.getPersistentData(); + CompoundTag playerData = tagCompound.getCompound(Player.PERSISTED_NBT_TAG); + playerData.putBoolean(NBT_TAG_TWILIGHT, false); // set to false so that the method works + tagCompound.put(Player.PERSISTED_NBT_TAG, playerData); // commit + banishNewbieToTwilightZone(serverPlayer); + } + } + + /** + * When player logs in, report conflict status, set progression status + */ + @SubscribeEvent + public static void playerLogsIn(PlayerEvent.PlayerLoggedInEvent event) { + if (!event.getEntity().getLevel().isClientSide() && event.getEntity() instanceof ServerPlayer) { + updateCapabilities((ServerPlayer) event.getEntity(), event.getEntity()); + banishNewbieToTwilightZone(event.getEntity()); + } + } + + @SubscribeEvent + public static void playerPortals(PlayerEvent.PlayerChangedDimensionEvent event) { + if (!event.getEntity().getLevel().isClientSide() && event.getEntity() instanceof ServerPlayer player) { + updateCapabilities(player, event.getEntity()); + } + } + + @SubscribeEvent + public static void onStartTracking(PlayerEvent.StartTracking event) { + updateCapabilities((ServerPlayer) event.getEntity(), event.getTarget()); + } + + // send any capabilities that are needed client-side + private static void updateCapabilities(ServerPlayer clientTarget, Entity shielded) { + shielded.getCapability(CapabilityList.SHIELDS).ifPresent(cap -> { + if (cap.shieldsLeft() > 0) { + TFPacketHandler.CHANNEL.send(PacketDistributor.PLAYER.with(() -> clientTarget), new UpdateShieldPacket(shielded, cap)); + } + }); + } + + // Teleport first-time players to Twilight Forest + private static void banishNewbieToTwilightZone(Player player) { + CompoundTag tagCompound = player.getPersistentData(); + CompoundTag playerData = tagCompound.getCompound(Player.PERSISTED_NBT_TAG); + + // getBoolean returns false, if false or didn't exist + boolean shouldBanishPlayer = TFConfig.COMMON_CONFIG.DIMENSION.newPlayersSpawnInTF.get() && !playerData.getBoolean(NBT_TAG_TWILIGHT); + + playerData.putBoolean(NBT_TAG_TWILIGHT, true); // set true once player has spawned either way + tagCompound.put(Player.PERSISTED_NBT_TAG, playerData); // commit + + if (shouldBanishPlayer) + TFPortalBlock.attemptSendEntity(player, true, TFConfig.COMMON_CONFIG.DIMENSION.portalForNewPlayerSpawn.get()); // See ya hate to be ya + } +} diff --git a/src/main/java/twilightforest/events/CharmEvents.java b/src/main/java/twilightforest/events/CharmEvents.java new file mode 100644 index 0000000000..9928b9795b --- /dev/null +++ b/src/main/java/twilightforest/events/CharmEvents.java @@ -0,0 +1,331 @@ +package twilightforest.events; + +import net.minecraft.ChatFormatting; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.NonNullList; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.GameRules; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.material.FluidState; +import net.minecraftforge.common.util.FakePlayer; +import net.minecraftforge.event.entity.living.LivingDeathEvent; +import net.minecraftforge.event.entity.player.PlayerEvent; +import net.minecraftforge.eventbus.api.EventPriority; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.ModList; +import net.minecraftforge.fml.common.Mod; +import top.theillusivec4.curios.api.CuriosApi; +import top.theillusivec4.curios.api.SlotResult; +import twilightforest.TFConfig; +import twilightforest.TwilightForestMod; +import twilightforest.block.KeepsakeCasketBlock; +import twilightforest.block.entity.KeepsakeCasketBlockEntity; +import twilightforest.data.tags.ItemTagGenerator; +import twilightforest.entity.CharmEffect; +import twilightforest.enums.BlockLoggingEnum; +import twilightforest.init.*; +import twilightforest.util.TFItemStackUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +@Mod.EventBusSubscriber(modid = TwilightForestMod.ID) +public class CharmEvents { + + public static final String CHARM_INV_TAG = "TFCharmInventory"; + //stores if the casket was planned to break on respawn + private static boolean casketExpiration = false; + //stores the charm that was used for the effect later + public static ItemStack charmUsed; + + @SubscribeEvent(priority = EventPriority.HIGHEST) + // For when the player dies + public static void applyDeathItems(LivingDeathEvent event) { + LivingEntity living = event.getEntity(); + + //ensure our player is real and in survival before attempting anything + if (living.getLevel().isClientSide() || !(living instanceof Player player) || living instanceof FakePlayer || + player.isCreative() || player.isSpectator()) return; + + if (charmOfLife(player)) { + event.setCanceled(true); // Executes if the player had charms + } else if (!living.getLevel().getGameRules().getBoolean(GameRules.RULE_KEEPINVENTORY)) { + // Did the player recover? No? Let's give them their stuff based on the keeping charms + charmOfKeeping(player); + + // Then let's store the rest of their stuff in the casket + keepsakeCasket(player); + } + } + + @SubscribeEvent + public static void onPlayerRespawn(PlayerEvent.PlayerRespawnEvent event) { + if (!(event.getEntity() instanceof ServerPlayer serverPlayer)) return; + if (!event.isEndConquered()) { + if (casketExpiration) { + serverPlayer.sendSystemMessage(Component.translatable("block.twilightforest.casket.broken").withStyle(ChatFormatting.RED)); + casketExpiration = false; + } + returnStoredItems(serverPlayer); + } + } + + private static boolean charmOfLife(Player player) { + boolean charm2 = TFItemStackUtils.consumeInventoryItem(player, TFItems.CHARM_OF_LIFE_2.get()) || hasCharmCurio(TFItems.CHARM_OF_LIFE_2.get(), player); + boolean charm1 = !charm2 && (TFItemStackUtils.consumeInventoryItem(player, TFItems.CHARM_OF_LIFE_1.get()) || hasCharmCurio(TFItems.CHARM_OF_LIFE_1.get(), player)); + + if (charm2 || charm1) { + if (charm1) { + player.setHealth(8); + player.addEffect(new MobEffectInstance(MobEffects.REGENERATION, 100, 0)); + } + + if (charm2) { + player.setHealth(player.getMaxHealth()); + + player.addEffect(new MobEffectInstance(MobEffects.REGENERATION, 600, 3)); + player.addEffect(new MobEffectInstance(MobEffects.DAMAGE_RESISTANCE, 600, 0)); + player.addEffect(new MobEffectInstance(MobEffects.FIRE_RESISTANCE, 600, 0)); + } + + // spawn effect thingers + CharmEffect effect = new CharmEffect(TFEntities.CHARM_EFFECT.get(), player.getLevel(), player, charm1 ? TFItems.CHARM_OF_LIFE_1.get() : TFItems.CHARM_OF_LIFE_2.get()); + player.getLevel().addFreshEntity(effect); + + CharmEffect effect2 = new CharmEffect(TFEntities.CHARM_EFFECT.get(), player.getLevel(), player, charm1 ? TFItems.CHARM_OF_LIFE_1.get() : TFItems.CHARM_OF_LIFE_2.get()); + effect2.offset = (float) Math.PI; + player.getLevel().addFreshEntity(effect2); + + player.getLevel().playSound(null, player.getX(), player.getY(), player.getZ(), TFSounds.CHARM_LIFE.get(), player.getSoundSource(), 1, 1); + + if (player instanceof ServerPlayer) player.awardStat(TFStats.LIFE_CHARMS_ACTIVATED.get()); + + return true; + } + + return false; + } + + private static void charmOfKeeping(Player player) { + //check our inventory for any charms of keeping. We also want to check curio slots (if the mod is installed) + // TODO also consider situations where the actual slots may be empty, and charm gets consumed anyway. Usually won't happen. + boolean tier3 = TFItemStackUtils.consumeInventoryItem(player, TFItems.CHARM_OF_KEEPING_3.get()) || hasCharmCurio(TFItems.CHARM_OF_KEEPING_3.get(), player); + boolean tier2 = tier3 || TFItemStackUtils.consumeInventoryItem(player, TFItems.CHARM_OF_KEEPING_2.get()) || hasCharmCurio(TFItems.CHARM_OF_KEEPING_2.get(), player); + boolean tier1 = tier2 || TFItemStackUtils.consumeInventoryItem(player, TFItems.CHARM_OF_KEEPING_1.get()) || hasCharmCurio(TFItems.CHARM_OF_KEEPING_1.get(), player); + + //create a fake inventory to organize our kept inventory in + Inventory keepInventory = new Inventory(null); + ListTag tagList = new ListTag(); + + //if we have any charm of keeping, all armor and offhand items are kept, so add those + if (tier1) { + keepWholeList(keepInventory.armor, player.getInventory().armor); + keepWholeList(keepInventory.offhand, player.getInventory().offhand); + } + + if (tier3) { + //tier 3 keeps our entire inventory + keepWholeList(keepInventory.items, player.getInventory().items); + charmUsed = new ItemStack(TFItems.CHARM_OF_KEEPING_3.get()); + } else if (tier2) { + //tier 2 keeps our hotbar only + for (int i = 0; i < 9; i++) { + keepInventory.items.set(i, player.getInventory().items.get(i).copy()); + player.getInventory().items.set(i, ItemStack.EMPTY); + } + charmUsed = new ItemStack(TFItems.CHARM_OF_KEEPING_2.get()); + } else if (tier1) { + //tier 1 keeps our selected item only + int i = player.getInventory().selected; + if (Inventory.isHotbarSlot(i)) { + keepInventory.items.set(i, player.getInventory().items.get(i).copy()); + player.getInventory().items.set(i, ItemStack.EMPTY); + } + charmUsed = new ItemStack(TFItems.CHARM_OF_KEEPING_1.get()); + } + + //keep all items in the kept_on_death tag. This allows modpacks to support other items to keep on death + for (int i = 0; i < player.getInventory().items.size(); i++) { + ItemStack stack = player.getInventory().items.get(i); + if (stack.is(ItemTagGenerator.KEPT_ON_DEATH)) { + keepInventory.items.set(i, stack.copy()); + player.getInventory().items.set(i, ItemStack.EMPTY); + } + } + + for (int i = 0; i < player.getInventory().armor.size(); i++) { + ItemStack armor = player.getInventory().armor.get(i); + if (armor.is(ItemTagGenerator.KEPT_ON_DEATH)) { + keepInventory.armor.set(i, armor.copy()); + player.getInventory().armor.set(i, ItemStack.EMPTY); + } + } + + if (player.getInventory().offhand.get(0).is(ItemTagGenerator.KEPT_ON_DEATH)) { + keepInventory.offhand.set(0, player.getInventory().offhand.get(0).copy()); + player.getInventory().offhand.set(0, ItemStack.EMPTY); + } + + //take our fake inventory and save it to the persistent player data. + //by saving it there we can guarantee we will always get all of our items back, even if the player logs out and back in. + if (!keepInventory.isEmpty()) { + keepInventory.save(tagList); + getPlayerData(player).put(CHARM_INV_TAG, tagList); + } + } + + private static void keepsakeCasket(Player player) { + //reset this just in case. I was having fresh caskets place as the max damaged ones + TFItemStackUtils.damage = 0; + boolean casketConsumed = TFItemStackUtils.consumeInventoryItem(player, TFBlocks.KEEPSAKE_CASKET.get().asItem()); + + if (casketConsumed) { + Level level = player.getCommandSenderWorld(); + BlockPos.MutableBlockPos pos = player.blockPosition().mutable(); + + if (pos.getY() < level.dimensionType().minY() + 2) { + pos.setY(level.dimensionType().minY() + 2); + } else { + int logicalHeight = player.getCommandSenderWorld().dimensionType().logicalHeight(); + + if (pos.getY() > logicalHeight) { + pos.setY(logicalHeight - 1); + } + } + + pos.move(0, -1, 0); + + do { + pos.move(0, 1, 0); + } while (!level.getBlockState(pos).getMaterial().isReplaceable()); + + BlockPos immutablePos = pos.immutable(); + FluidState fluidState = level.getFluidState(immutablePos); + + if (level.setBlockAndUpdate(immutablePos, TFBlocks.KEEPSAKE_CASKET.get().defaultBlockState().setValue(BlockLoggingEnum.MULTILOGGED, BlockLoggingEnum.getFromFluid(fluidState.getType())).setValue(KeepsakeCasketBlock.BREAKAGE, TFItemStackUtils.damage).setValue(KeepsakeCasketBlock.FACING, Direction.from2DDataValue(level.getRandom().nextInt(3))))) { + BlockEntity te = level.getBlockEntity(immutablePos); + + if (te instanceof KeepsakeCasketBlockEntity casket) { + if (TFConfig.COMMON_CONFIG.casketUUIDLocking.get()) { + //make it so only the player who died can open the chest if our config allows us + casket.playeruuid = player.getGameProfile().getId(); + } else { + casket.playeruuid = null; + } + + //some names are way too long for the casket so we'll cut them down + String modifiedName; + if (player.getName().getString().length() > 12) + modifiedName = player.getName().getString().substring(0, 12); + else modifiedName = player.getName().getString(); + casket.name = player.getName().getString(); + casket.casketname = modifiedName; + casket.setCustomName(Component.literal(modifiedName + "'s " + (level.getRandom().nextInt(1000) == 0 ? "Costco Casket" : casket.getDisplayName().getString()))); + int damage = level.getBlockState(immutablePos).getValue(KeepsakeCasketBlock.BREAKAGE); + if (level.getRandom().nextFloat() <= 0.15F) { + if (damage >= 2) { + player.getInventory().dropAll(); + level.setBlockAndUpdate(immutablePos, Blocks.AIR.defaultBlockState()); + casketExpiration = true; + TwilightForestMod.LOGGER.debug("{}'s Casket damage value was too high, alerting the player and dropping extra items", player.getName().getString()); + } else { + damage = damage + 1; + level.setBlockAndUpdate(immutablePos, TFBlocks.KEEPSAKE_CASKET.get().defaultBlockState().setValue(BlockLoggingEnum.MULTILOGGED, BlockLoggingEnum.getFromFluid(fluidState.getType())).setValue(KeepsakeCasketBlock.BREAKAGE, damage)); + TwilightForestMod.LOGGER.debug("{}'s Casket was randomly damaged, applying new damage", player.getName().getString()); + } + } + int casketCapacity = casket.getContainerSize(); + List list = new ArrayList<>(casketCapacity); + NonNullList filler = NonNullList.withSize(4, ItemStack.EMPTY); + + // lets add our inventory exactly how it was on us + list.addAll(TFItemStackUtils.sortArmorForCasket(player)); + player.getInventory().armor.clear(); + list.addAll(filler); + list.addAll(player.getInventory().offhand); + player.getInventory().offhand.clear(); + list.addAll(TFItemStackUtils.sortInvForCasket(player)); + player.getInventory().items.clear(); + + casket.setItems(NonNullList.of(ItemStack.EMPTY, list.toArray(new ItemStack[casketCapacity]))); + } + } else { + TwilightForestMod.LOGGER.error("Could not place Keepsake Casket at " + pos); + } + } + } + + /** + * Maybe we kept some stuff for the player! + */ + private static void returnStoredItems(Player player) { + + TwilightForestMod.LOGGER.debug("Player {} ({}) respawned and received items held in storage", player.getName().getString(), player.getUUID()); + + //check if our tag is in the persistent player data. If so, copy that inventory over to our own. Cloud storage at its finest! + CompoundTag playerData = getPlayerData(player); + if (!player.getLevel().isClientSide() && playerData.contains(CHARM_INV_TAG)) { + ListTag tagList = playerData.getList(CHARM_INV_TAG, 10); + TFItemStackUtils.loadNoClear(tagList, player.getInventory()); + getPlayerData(player).getList(CHARM_INV_TAG, 10).clear(); + getPlayerData(player).remove(CHARM_INV_TAG); + } + + // spawn effect thingers + if (charmUsed != null) { + CharmEffect effect = new CharmEffect(TFEntities.CHARM_EFFECT.get(), player.getLevel(), player, charmUsed.getItem()); + player.getLevel().addFreshEntity(effect); + + CharmEffect effect2 = new CharmEffect(TFEntities.CHARM_EFFECT.get(), player.getLevel(), player, charmUsed.getItem()); + effect2.offset = (float) Math.PI; + player.getLevel().addFreshEntity(effect2); + + player.getLevel().playSound(null, player.getX(), player.getY(), player.getZ(), TFSounds.CHARM_KEEP.get(), player.getSoundSource(), 1.5F, 1.0F); + if (player instanceof ServerPlayer) player.awardStat(TFStats.KEEPING_CHARMS_ACTIVATED.get()); + charmUsed = null; + } + } + + public static CompoundTag getPlayerData(Player player) { + if (!player.getPersistentData().contains(Player.PERSISTED_NBT_TAG)) { + player.getPersistentData().put(Player.PERSISTED_NBT_TAG, new CompoundTag()); + } + return player.getPersistentData().getCompound(Player.PERSISTED_NBT_TAG); + } + + //transfers a list of items to another + private static void keepWholeList(NonNullList transferTo, NonNullList transferFrom) { + for (int i = 0; i < transferFrom.size(); i++) { + transferTo.set(i, transferFrom.get(i).copy()); + } + transferFrom.clear(); + } + + private static boolean hasCharmCurio(Item item, Player player) { + if (ModList.get().isLoaded("curios")) { + Optional slot = CuriosApi.getCuriosHelper().findFirstCurio(player, stack -> stack.is(item)); + + if (slot.isPresent()) { + slot.get().stack().shrink(1); + return true; + } + } + + return false; + } + +} diff --git a/src/main/java/twilightforest/events/EntityEvents.java b/src/main/java/twilightforest/events/EntityEvents.java new file mode 100644 index 0000000000..08e9434756 --- /dev/null +++ b/src/main/java/twilightforest/events/EntityEvents.java @@ -0,0 +1,271 @@ +package twilightforest.events; + +import com.mojang.authlib.GameProfile; +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.tags.DamageTypeTags; +import net.minecraft.tags.ItemTags; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.damagesource.DamageType; +import net.minecraft.world.damagesource.DamageTypes; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.entity.projectile.AbstractHurtingProjectile; +import net.minecraft.world.entity.projectile.Projectile; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.AbstractSkullBlock; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.SkullBlock; +import net.minecraft.world.level.block.WallSkullBlock; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.SkullBlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.EntityHitResult; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.event.entity.ProjectileImpactEvent; +import net.minecraftforge.event.entity.living.LivingHurtEvent; +import net.minecraftforge.event.entity.player.PlayerEvent; +import net.minecraftforge.event.entity.player.PlayerInteractEvent; +import net.minecraftforge.event.level.BlockEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.ModList; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.items.ItemHandlerHelper; +import net.minecraftforge.registries.ForgeRegistries; +import twilightforest.TFConfig; +import twilightforest.TwilightForestMod; +import twilightforest.block.AbstractLightableBlock; +import twilightforest.block.AbstractSkullCandleBlock; +import twilightforest.block.SkullCandleBlock; +import twilightforest.block.WallSkullCandleBlock; +import twilightforest.block.entity.KeepsakeCasketBlockEntity; +import twilightforest.block.entity.SkullCandleBlockEntity; +import twilightforest.enchantment.ChillAuraEnchantment; +import twilightforest.entity.projectile.ITFProjectile; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFItems; +import twilightforest.init.TFMobEffects; +import twilightforest.init.TFStats; +import twilightforest.item.FieryArmorItem; +import twilightforest.item.YetiArmorItem; + +import java.util.Optional; +import java.util.UUID; + +@Mod.EventBusSubscriber(modid = TwilightForestMod.ID) +public class EntityEvents { + + private static final boolean SHIELD_PARRY_MOD_LOADED = ModList.get().isLoaded("parry"); + + @SubscribeEvent + public static void entityHurts(LivingHurtEvent event) { + LivingEntity living = event.getEntity(); + DamageSource source = event.getSource(); + Entity trueSource = source.getEntity(); + + // fire react and chill aura + if (source.getEntity() != null && trueSource != null && event.getAmount() > 0) { + int fireLevel = getGearCoverage(living, false) * 5; + int chillLevel = getGearCoverage(living, true); + + if (fireLevel > 0 && living.getRandom().nextInt(25) < fireLevel && !trueSource.fireImmune()) { + trueSource.setSecondsOnFire(fireLevel / 2); + } + + if (trueSource instanceof LivingEntity target) { + ChillAuraEnchantment.doChillAuraEffect(target, chillLevel * 5 + 5, chillLevel, chillLevel > 0); + } + } + + // triple bow strips invulnerableTime + if (source.getMsgId().equals("arrow") && trueSource instanceof Player player) { + + if (player.getItemInHand(player.getUsedItemHand()).is(TFItems.TRIPLE_BOW.get())) { + living.invulnerableTime = 0; + } + } + } + + @SubscribeEvent + //if our casket is owned by someone and that player isnt the one breaking it, stop them + public static void onCasketBreak(BlockEvent.BreakEvent event) { + Block block = event.getState().getBlock(); + Player player = event.getPlayer(); + BlockEntity te = event.getLevel().getBlockEntity(event.getPos()); + UUID checker; + if (block == TFBlocks.KEEPSAKE_CASKET.get()) { + if (te instanceof KeepsakeCasketBlockEntity casket) { + checker = casket.playeruuid; + } else checker = null; + if (checker != null) { + if (!((KeepsakeCasketBlockEntity) te).isEmpty()) { + if (!player.hasPermissions(3) || !player.getGameProfile().getId().equals(checker)) { + event.setCanceled(true); + } + } + } + } + } + + @SubscribeEvent + public static void onCrafting(PlayerEvent.ItemCraftedEvent event) { + ItemStack itemStack = event.getCrafting(); + + // if we've crafted 64 planks from a giant log, sneak 192 more planks into the player's inventory or drop them nearby + if (itemStack.is(Items.OAK_PLANKS) && itemStack.getCount() == 64 && event.getInventory().countItem(TFBlocks.GIANT_LOG.get().asItem()) > 0) { + Player player = event.getEntity(); + ItemHandlerHelper.giveItemToPlayer(player, new ItemStack(Items.OAK_PLANKS, 64)); + ItemHandlerHelper.giveItemToPlayer(player, new ItemStack(Items.OAK_PLANKS, 64)); + ItemHandlerHelper.giveItemToPlayer(player, new ItemStack(Items.OAK_PLANKS, 64)); + } + } + + @SubscribeEvent + public static void onLivingHurtEvent(LivingHurtEvent event) { + LivingEntity living = event.getEntity(); + if (living != null) { + Optional.ofNullable(living.getEffect(TFMobEffects.FROSTY.get())).ifPresent(mobEffectInstance -> { + if (event.getSource().is(DamageTypes.FREEZE)) { + event.setAmount(event.getAmount() + (float)(mobEffectInstance.getAmplifier() / 2)); + } else if (event.getSource().is(DamageTypeTags.IS_FIRE)) { + living.removeEffect(TFMobEffects.FROSTY.get()); + mobEffectInstance.amplifier -= 1; + if (mobEffectInstance.amplifier >= 0) living.addEffect(mobEffectInstance); + } + }); + } + } + + // Parrying + @SubscribeEvent + public static void onParryProjectile(ProjectileImpactEvent event) { + final Projectile projectile = event.getProjectile(); + + if (!projectile.getCommandSenderWorld().isClientSide() && !SHIELD_PARRY_MOD_LOADED && (TFConfig.COMMON_CONFIG.SHIELD_INTERACTIONS.parryNonTwilightAttacks.get() || projectile instanceof ITFProjectile)) { + if (event.getRayTraceResult() instanceof EntityHitResult result) { + Entity entity = result.getEntity(); + + if (event.getEntity() != null && entity instanceof LivingEntity entityBlocking) { + if (entityBlocking.isBlocking() && entityBlocking.getUseItem().getUseDuration() - entityBlocking.getUseItemRemainingTicks() <= TFConfig.COMMON_CONFIG.SHIELD_INTERACTIONS.shieldParryTicks.get()) { + projectile.setOwner(entityBlocking); + Vec3 rebound = entityBlocking.getLookAngle(); + projectile.shoot(rebound.x(), rebound.y(), rebound.z(), 1.1F, 0.1F); // reflect faster and more accurately + if (projectile instanceof AbstractHurtingProjectile hurting) { + hurting.xPower = rebound.x() * 0.1D; + hurting.yPower = rebound.y() * 0.1D; + hurting.zPower = rebound.z() * 0.1D; + } + + event.setCanceled(true); + } + } + } + } + } + + /** + * Checks if the player is attempting to create a skull candle + */ + // I wanted to make sure absolutely nothing broke, so I also check against the namespaces of the item to make sure theyre vanilla. + // Worst case some stupid mod adds their own stuff to the minecraft namespace and breaks this, then you can disable this via config. + @SubscribeEvent + public static void createSkullCandle(PlayerInteractEvent.RightClickBlock event) { + ItemStack stack = event.getItemStack(); + Level level = event.getLevel(); + BlockPos pos = event.getPos(); + BlockState state = level.getBlockState(pos); + if (!TFConfig.COMMON_CONFIG.disableSkullCandles.get()) { + if (stack.is(ItemTags.CANDLES) && ForgeRegistries.ITEMS.getKey(stack.getItem()).getNamespace().equals("minecraft") && !event.getEntity().isShiftKeyDown()) { + if (state.getBlock() instanceof AbstractSkullBlock skull && ForgeRegistries.BLOCKS.getKey(state.getBlock()).getNamespace().equals("minecraft")) { + SkullBlock.Types type = (SkullBlock.Types) skull.getType(); + boolean wall = state.getBlock() instanceof WallSkullBlock; + switch (type) { + case SKELETON -> { + if (wall) makeWallSkull(event, TFBlocks.SKELETON_WALL_SKULL_CANDLE.get()); + else makeFloorSkull(event, TFBlocks.SKELETON_SKULL_CANDLE.get()); + } + case WITHER_SKELETON -> { + if (wall) makeWallSkull(event, TFBlocks.WITHER_SKELE_WALL_SKULL_CANDLE.get()); + else makeFloorSkull(event, TFBlocks.WITHER_SKELE_SKULL_CANDLE.get()); + } + case PLAYER -> { + if (wall) makeWallSkull(event, TFBlocks.PLAYER_WALL_SKULL_CANDLE.get()); + else makeFloorSkull(event, TFBlocks.PLAYER_SKULL_CANDLE.get()); + } + case ZOMBIE -> { + if (wall) makeWallSkull(event, TFBlocks.ZOMBIE_WALL_SKULL_CANDLE.get()); + else makeFloorSkull(event, TFBlocks.ZOMBIE_SKULL_CANDLE.get()); + } + case CREEPER -> { + if (wall) makeWallSkull(event, TFBlocks.CREEPER_WALL_SKULL_CANDLE.get()); + else makeFloorSkull(event, TFBlocks.CREEPER_SKULL_CANDLE.get()); + } + default -> { + return; + } + } + if (!event.getEntity().getAbilities().instabuild) stack.shrink(1); + event.getEntity().swing(event.getHand()); + if (event.getEntity() instanceof ServerPlayer) + event.getEntity().awardStat(TFStats.SKULL_CANDLES_MADE.get()); + //this is to prevent anything from being placed afterwords + event.setCanceled(true); + } + } + } + } + + private static void makeFloorSkull(PlayerInteractEvent.RightClickBlock event, Block newBlock) { + GameProfile profile = null; + Level level = event.getLevel(); + if (level.getBlockEntity(event.getPos()) instanceof SkullBlockEntity skull) + profile = skull.getOwnerProfile(); + level.playSound(null, event.getPos(), SoundEvents.CANDLE_PLACE, SoundSource.BLOCKS, 1.0F, 1.0F); + level.setBlockAndUpdate(event.getPos(), newBlock.defaultBlockState() + .setValue(AbstractSkullCandleBlock.LIGHTING, AbstractLightableBlock.Lighting.NONE) + .setValue(SkullCandleBlock.ROTATION, level.getBlockState(event.getPos()).getValue(SkullBlock.ROTATION))); + level.setBlockEntity(new SkullCandleBlockEntity(event.getPos(), + newBlock.defaultBlockState() + .setValue(AbstractSkullCandleBlock.LIGHTING, AbstractLightableBlock.Lighting.NONE) + .setValue(SkullCandleBlock.ROTATION, level.getBlockState(event.getPos()).getValue(SkullBlock.ROTATION)), + AbstractSkullCandleBlock.candleToCandleColor(event.getItemStack().getItem()).getValue(), 1)); + if (level.getBlockEntity(event.getPos()) instanceof SkullCandleBlockEntity sc) sc.setOwner(profile); + } + + private static void makeWallSkull(PlayerInteractEvent.RightClickBlock event, Block newBlock) { + GameProfile profile = null; + Level level = event.getLevel(); + if (level.getBlockEntity(event.getPos()) instanceof SkullBlockEntity skull) + profile = skull.getOwnerProfile(); + level.playSound(null, event.getPos(), SoundEvents.CANDLE_PLACE, SoundSource.BLOCKS, 1.0F, 1.0F); + level.setBlockAndUpdate(event.getPos(), newBlock.defaultBlockState() + .setValue(AbstractSkullCandleBlock.LIGHTING, AbstractLightableBlock.Lighting.NONE) + .setValue(WallSkullCandleBlock.FACING, level.getBlockState(event.getPos()).getValue(WallSkullBlock.FACING))); + level.setBlockEntity(new SkullCandleBlockEntity(event.getPos(), + newBlock.defaultBlockState() + .setValue(AbstractSkullCandleBlock.LIGHTING, AbstractLightableBlock.Lighting.NONE) + .setValue(WallSkullCandleBlock.FACING, level.getBlockState(event.getPos()).getValue(WallSkullBlock.FACING)), + AbstractSkullCandleBlock.candleToCandleColor(event.getItemStack().getItem()).getValue(), 1)); + if (level.getBlockEntity(event.getPos()) instanceof SkullCandleBlockEntity sc) sc.setOwner(profile); + } + + /** + * Add up the number of armor pieces the player is wearing (either fiery or yeti) + */ + public static int getGearCoverage(LivingEntity entity, boolean yeti) { + int amount = 0; + + for (ItemStack armor : entity.getArmorSlots()) { + if (!armor.isEmpty() && (yeti ? armor.getItem() instanceof YetiArmorItem : armor.getItem() instanceof FieryArmorItem)) { + amount++; + } + } + + return amount; + } +} diff --git a/src/main/java/twilightforest/events/HostileMountEvents.java b/src/main/java/twilightforest/events/HostileMountEvents.java new file mode 100644 index 0000000000..19bedd1f9b --- /dev/null +++ b/src/main/java/twilightforest/events/HostileMountEvents.java @@ -0,0 +1,67 @@ +package twilightforest.events; + +import net.minecraft.tags.DamageTypeTags; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.damagesource.DamageTypes; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraftforge.event.entity.EntityMountEvent; +import net.minecraftforge.event.entity.EntityTeleportEvent; +import net.minecraftforge.event.entity.living.LivingAttackEvent; +import net.minecraftforge.event.entity.living.LivingEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; +import twilightforest.TwilightForestMod; +import twilightforest.capabilities.CapabilityList; +import twilightforest.capabilities.thrown.YetiThrowCapability; +import twilightforest.entity.IHostileMount; +import twilightforest.init.TFDamageTypes; + +@Mod.EventBusSubscriber(modid = TwilightForestMod.ID) +public class HostileMountEvents { + + public static volatile boolean allowDismount = false; + + @SubscribeEvent + public static void entityHurts(LivingAttackEvent event) { + LivingEntity living = event.getEntity(); + DamageSource damageSource = event.getSource(); + // lets not make the player take suffocation damage if riding something + if (living instanceof Player && isRidingUnfriendly(living) && damageSource.is(DamageTypes.IN_WALL)) { + event.setCanceled(true); + } + + if (damageSource.is(DamageTypes.FALL) && living.getCapability(CapabilityList.YETI_THROWN).map(YetiThrowCapability::getThrown).orElse(false)) { + float amount = event.getAmount(); + event.setCanceled(true); + living.hurt(TFDamageTypes.getEntityDamageSource(living.getLevel(), TFDamageTypes.YEETED, living.getCapability(CapabilityList.YETI_THROWN).resolve().get().getThrower()), amount); + } + } + + @SubscribeEvent + public static void entityTeleports(EntityTeleportEvent event) { + // if our grabbed target tries to teleport dont let them + if (event.getEntity() instanceof LivingEntity living && isRidingUnfriendly(living)) { + event.setCanceled(true); + } + } + + @SubscribeEvent + public static void preventMountDismount(EntityMountEvent event) { + if (!event.getEntityBeingMounted().getLevel().isClientSide() && + !event.isMounting() && event.getEntityBeingMounted().isAlive() && + event.getEntityMounting() instanceof Player player && player.isAlive() && + isRidingUnfriendly(player) && !allowDismount && !player.getAbilities().invulnerable) + event.setCanceled(true); + } + + @SubscribeEvent + public static void livingUpdate(LivingEvent.LivingTickEvent event) { + if (event.getEntity() instanceof IHostileMount) + event.getEntity().getPassengers().forEach(e -> e.setShiftKeyDown(false)); + } + + public static boolean isRidingUnfriendly(LivingEntity entity) { + return entity.isPassenger() && entity.getVehicle() instanceof IHostileMount; + } +} diff --git a/src/main/java/twilightforest/events/MiscEvents.java b/src/main/java/twilightforest/events/MiscEvents.java new file mode 100644 index 0000000000..a8749da834 --- /dev/null +++ b/src/main/java/twilightforest/events/MiscEvents.java @@ -0,0 +1,71 @@ +package twilightforest.events; + +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.*; +import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal; +import net.minecraft.world.entity.ai.goal.target.NonTameRandomTargetGoal; +import net.minecraftforge.event.entity.EntityJoinLevelEvent; +import net.minecraftforge.event.entity.living.LivingEquipmentChangeEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.ModList; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.network.PacketDistributor; +import twilightforest.TwilightForestMod; +import twilightforest.advancements.TFAdvancements; +import twilightforest.compat.curios.CuriosCompat; +import twilightforest.entity.passive.Bighorn; +import twilightforest.entity.passive.DwarfRabbit; +import twilightforest.entity.passive.Squirrel; +import twilightforest.entity.passive.TinyBird; +import twilightforest.init.TFBlocks; +import twilightforest.network.CreateMovingCicadaSoundPacket; +import twilightforest.network.TFPacketHandler; + +@Mod.EventBusSubscriber(modid = TwilightForestMod.ID) +public class MiscEvents { + + @SubscribeEvent + public static void addPrey(EntityJoinLevelEvent event) { + if (event.getEntity() instanceof Mob mob) { + EntityType type = mob.getType(); + if (type == EntityType.CAT) { + mob.targetSelector.addGoal(1, new NonTameRandomTargetGoal<>((TamableAnimal) mob, DwarfRabbit.class, false, null)); + mob.targetSelector.addGoal(1, new NonTameRandomTargetGoal<>((TamableAnimal) mob, Squirrel.class, false, null)); + mob.targetSelector.addGoal(1, new NonTameRandomTargetGoal<>((TamableAnimal) mob, TinyBird.class, false, null)); + } else if (type == EntityType.OCELOT) { + mob.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(mob, DwarfRabbit.class, false)); + mob.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(mob, Squirrel.class, false)); + mob.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(mob, TinyBird.class, false)); + } else if (type == EntityType.FOX) { + mob.targetSelector.addGoal(6, new NearestAttackableTargetGoal<>(mob, DwarfRabbit.class, false)); + mob.targetSelector.addGoal(6, new NearestAttackableTargetGoal<>(mob, Squirrel.class, false)); + } else if (type == EntityType.WOLF) { + mob.targetSelector.addGoal(7, new NonTameRandomTargetGoal<>((TamableAnimal) mob, DwarfRabbit.class, false, null)); + mob.targetSelector.addGoal(7, new NonTameRandomTargetGoal<>((TamableAnimal) mob, Squirrel.class, false, null)); + mob.targetSelector.addGoal(7, new NonTameRandomTargetGoal<>((TamableAnimal) mob, Bighorn.class, false, null)); + } + } + } + + @SubscribeEvent + public static void armorChanged(LivingEquipmentChangeEvent event) { + LivingEntity living = event.getEntity(); + if (living instanceof ServerPlayer serverPlayer && !serverPlayer.level.isClientSide()) { + TFAdvancements.ARMOR_CHANGED.trigger(serverPlayer, event.getFrom(), event.getTo()); + } + + // from what I can see, vanilla doesnt have a hook for this in the item class. So this will have to do. + // we only have to check equipping, when its unequipped the sound instance handles the rest + + //if we have a cicada in our curios slot, dont try to run this + if (ModList.get().isLoaded("curios")) { + if (CuriosCompat.isCicadaEquipped(event.getEntity())) { + return; + } + } + + if (event.getEntity() != null && !living.level.isClientSide() && event.getSlot() == EquipmentSlot.HEAD && event.getTo().is(TFBlocks.CICADA.get().asItem())) { + TFPacketHandler.CHANNEL.send(PacketDistributor.TRACKING_ENTITY_AND_SELF.with(event::getEntity), new CreateMovingCicadaSoundPacket(event.getEntity().getId())); + } + } +} diff --git a/src/main/java/twilightforest/events/ProgressionEvents.java b/src/main/java/twilightforest/events/ProgressionEvents.java new file mode 100644 index 0000000000..779ba7eac5 --- /dev/null +++ b/src/main/java/twilightforest/events/ProgressionEvents.java @@ -0,0 +1,165 @@ +package twilightforest.events; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.SectionPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.monster.Enemy; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructureStart; +import net.minecraftforge.common.util.FakePlayer; +import net.minecraftforge.event.entity.living.LivingAttackEvent; +import net.minecraftforge.event.entity.player.PlayerEvent; +import net.minecraftforge.event.entity.player.PlayerInteractEvent; +import net.minecraftforge.event.level.BlockEvent; +import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.network.PacketDistributor; +import twilightforest.TwilightForestMod; +import twilightforest.data.tags.BlockTagGenerator; +import twilightforest.entity.monster.Kobold; +import twilightforest.init.TFLandmark; +import twilightforest.network.AreaProtectionPacket; +import twilightforest.network.EnforceProgressionStatusPacket; +import twilightforest.network.TFPacketHandler; +import twilightforest.util.LandmarkUtil; +import twilightforest.util.LegacyLandmarkPlacements; +import twilightforest.util.WorldUtil; +import twilightforest.world.components.chunkgenerators.ChunkGeneratorTwilight; +import twilightforest.world.components.structures.util.ProgressionStructure; +import twilightforest.world.registration.TFGenerationSettings; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +/** + * A class to store events relating to progression + */ +@Mod.EventBusSubscriber(modid = TwilightForestMod.ID) +public class ProgressionEvents { + + /** + * Check if the player is trying to break a block in a structure that's considered unbreakable for progression reasons + */ + @SubscribeEvent + public static void breakBlock(BlockEvent.BreakEvent event) { + Player player = event.getPlayer(); + BlockPos pos = event.getPos(); + + if (!(event.getLevel() instanceof Level level) || level.isClientSide()) return; + + if (isBlockProtectedFromBreaking(level, pos) && isAreaProtected(level, player, pos)) { + event.setCanceled(true); + + } + } + + /** + * Stop the player from interacting with blocks that could produce treasure or open doors in a protected area + */ + @SubscribeEvent + public static void onPlayerRightClick(PlayerInteractEvent.RightClickBlock event) { + + Player player = event.getEntity(); + Level level = player.getLevel(); + + if (!level.isClientSide() && isBlockProtectedFromInteraction(level, event.getPos()) && isAreaProtected(level, player, event.getPos())) { + event.setUseBlock(Event.Result.DENY); + } + } + + private static boolean isBlockProtectedFromInteraction(Level level, BlockPos pos) { + return level.getBlockState(pos).is(BlockTagGenerator.STRUCTURE_BANNED_INTERACTIONS); + } + + private static boolean isBlockProtectedFromBreaking(Level level, BlockPos pos) { + return !level.getBlockState(pos).is(BlockTagGenerator.PROGRESSION_ALLOW_BREAKING); + } + + /** + * Return if the area at the coordinates is considered protected for that player. + * Currently, if we return true, we also send the area protection packet here. + */ + private static boolean isAreaProtected(Level level, Player player, BlockPos pos) { + + if (player.getAbilities().instabuild || player.isSpectator() || + !LandmarkUtil.isProgressionEnforced(level) || player instanceof FakePlayer) { + return false; + } + + ChunkGeneratorTwilight chunkGenerator = WorldUtil.getChunkGenerator(level); + + if (chunkGenerator != null) { + Optional struct = LandmarkUtil.locateNearestLandmarkStart(level, SectionPos.blockToSectionCoord(pos.getX()), SectionPos.blockToSectionCoord(pos.getZ())); + if (struct.isPresent()) { + StructureStart structureStart = struct.get(); + if (structureStart.getBoundingBox().isInside(pos) && structureStart.getStructure() instanceof ProgressionStructure structureHints) { + if (!structureHints.doesPlayerHaveRequiredAdvancements(player)/* && chunkGenerator.isBlockProtected(pos)*/) { + // what feature is nearby? is it one the player has not unlocked? + TFLandmark nearbyFeature = LegacyLandmarkPlacements.pickLandmarkAtBlock(pos.getX(), pos.getZ(), (ServerLevel) level); + + // TODO: This is terrible but *works* for now.. proper solution is to figure out why the stronghold bounding box is going so high + if (nearbyFeature == TFLandmark.KNIGHT_STRONGHOLD && pos.getY() >= TFGenerationSettings.SEALEVEL) + return false; + + // send protection packet + List boxes = new ArrayList<>(); + structureStart.getPieces().forEach(piece -> { + if (piece.getBoundingBox().isInside(pos)) + boxes.add(piece.getBoundingBox()); + }); + + sendAreaProtectionPacket(level, pos, boxes); + + // send a hint monster? + structureHints.trySpawnHintMonster(level, player, pos); + + return true; + } + } + } + } + return false; + } + + private static void sendAreaProtectionPacket(Level level, BlockPos pos, List sbb) { + PacketDistributor.TargetPoint targetPoint = new PacketDistributor.TargetPoint(pos.getX(), pos.getY(), pos.getZ(), 64, level.dimension()); + TFPacketHandler.CHANNEL.send(PacketDistributor.NEAR.with(() -> targetPoint), new AreaProtectionPacket(sbb, pos)); + } + + @SubscribeEvent + public static void livingAttack(LivingAttackEvent event) { + LivingEntity living = event.getEntity(); + // cancel attacks in protected areas + if (!living.getLevel().isClientSide() && living instanceof Enemy && event.getSource().getEntity() instanceof Player && !(living instanceof Kobold) + && isAreaProtected(living.getLevel(), (Player) event.getSource().getEntity(), new BlockPos(living.blockPosition()))) { + + event.setCanceled(true); + } + } + + @SubscribeEvent + public static void playerPortals(PlayerEvent.PlayerChangedDimensionEvent event) { + if (!event.getEntity().getLevel().isClientSide() && event.getEntity() instanceof ServerPlayer player) { + if (TFGenerationSettings.usesTwilightChunkGenerator(player.getLevel())) { + sendEnforcedProgressionStatus(player, LandmarkUtil.isProgressionEnforced(player.getLevel())); + } + } + } + + @SubscribeEvent + public static void playerLogsIn(PlayerEvent.PlayerLoggedInEvent event) { + if (!event.getEntity().getLevel().isClientSide() && event.getEntity() instanceof ServerPlayer player) { + sendEnforcedProgressionStatus(player, LandmarkUtil.isProgressionEnforced(event.getEntity().getLevel())); + } + } + + private static void sendEnforcedProgressionStatus(ServerPlayer player, boolean isEnforced) { + TFPacketHandler.CHANNEL.send(PacketDistributor.PLAYER.with(() -> player), new EnforceProgressionStatusPacket(isEnforced)); + } +} diff --git a/src/main/java/twilightforest/events/ToolEvents.java b/src/main/java/twilightforest/events/ToolEvents.java new file mode 100644 index 0000000000..179a363da5 --- /dev/null +++ b/src/main/java/twilightforest/events/ToolEvents.java @@ -0,0 +1,203 @@ +package twilightforest.events; + +import net.minecraft.network.protocol.game.ClientboundAnimatePacket; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.util.Mth; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.ai.attributes.AttributeInstance; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.entity.projectile.Projectile; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.ClipContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.EntityHitResult; +import net.minecraft.world.phys.HitResult; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.common.ForgeMod; +import net.minecraftforge.event.entity.ProjectileImpactEvent; +import net.minecraftforge.event.entity.living.LivingAttackEvent; +import net.minecraftforge.event.entity.living.LivingHurtEvent; +import net.minecraftforge.event.entity.player.PlayerInteractEvent; +import net.minecraftforge.event.level.BlockEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; +import twilightforest.TwilightForestMod; +import twilightforest.data.tags.BlockTagGenerator; +import twilightforest.init.TFItems; +import twilightforest.item.EnderBowItem; +import twilightforest.item.GiantItem; +import twilightforest.item.MazebreakerPickItem; +import twilightforest.item.MinotaurAxeItem; + +import org.jetbrains.annotations.Nullable; + +import java.util.UUID; + +@Mod.EventBusSubscriber(modid = TwilightForestMod.ID) +public class ToolEvents { + + private static final int KNIGHTMETAL_BONUS_DAMAGE = 2; + private static final int MINOTAUR_AXE_BONUS_DAMAGE = 7; + + public static InteractionHand INTERACTION_HAND; + + @SubscribeEvent + public static void onEnderBowHit(ProjectileImpactEvent evt) { + Projectile arrow = evt.getProjectile(); + if (arrow.getOwner() instanceof Player player + && evt.getRayTraceResult() instanceof EntityHitResult result + && result.getEntity() instanceof LivingEntity living + && arrow.getOwner() != result.getEntity()) { + + if (arrow.getPersistentData().contains(EnderBowItem.KEY)) { + double sourceX = player.getX(), sourceY = player.getY(), sourceZ = player.getZ(); + float sourceYaw = player.getYRot(), sourcePitch = player.getXRot(); + @Nullable Entity playerVehicle = player.getVehicle(); + + player.setYRot(living.getYRot()); + player.teleportTo(living.getX(), living.getY(), living.getZ()); + player.invulnerableTime = 40; + player.getLevel().broadcastEntityEvent(player, (byte) 46); + if (living.isPassenger() && living.getVehicle() != null) { + player.startRiding(living.getVehicle(), true); + living.stopRiding(); + } + player.playSound(SoundEvents.CHORUS_FRUIT_TELEPORT, 1.0F, 1.0F); + + living.setYRot(sourceYaw); + living.setXRot(sourcePitch); + living.teleportTo(sourceX, sourceY, sourceZ); + living.getLevel().broadcastEntityEvent(player, (byte) 46); + if (playerVehicle != null) { + living.startRiding(playerVehicle, true); + player.stopRiding(); + } + living.playSound(SoundEvents.CHORUS_FRUIT_TELEPORT, 1.0F, 1.0F); + } + } + } + + @SubscribeEvent + public static void fieryToolSetFire(LivingAttackEvent event) { + if (event.getSource().getEntity() instanceof LivingEntity living && (living.getMainHandItem().is(TFItems.FIERY_SWORD.get()) || living.getMainHandItem().is(TFItems.FIERY_PICKAXE.get())) && !event.getEntity().fireImmune()) { + event.getEntity().setSecondsOnFire(1); + } + } + + @SubscribeEvent + public static void onKnightmetalToolDamage(LivingHurtEvent event) { + LivingEntity target = event.getEntity(); + + if (!target.getLevel().isClientSide() && event.getSource().getDirectEntity() instanceof LivingEntity living) { + ItemStack weapon = living.getMainHandItem(); + + if (!weapon.isEmpty()) { + if (target.getArmorValue() > 0 && (weapon.is(TFItems.KNIGHTMETAL_PICKAXE.get()) || weapon.is(TFItems.KNIGHTMETAL_SWORD.get()))) { + if (target.getArmorCoverPercentage() > 0) { + int moreBonus = (int) (KNIGHTMETAL_BONUS_DAMAGE * target.getArmorCoverPercentage()); + event.setAmount(event.getAmount() + moreBonus); + } else { + event.setAmount(event.getAmount() + KNIGHTMETAL_BONUS_DAMAGE); + } + // enchantment attack sparkles + ((ServerLevel) target.getLevel()).getChunkSource().broadcastAndSend(target, new ClientboundAnimatePacket(target, 5)); + } else if (target.getArmorValue() == 0 && weapon.is(TFItems.KNIGHTMETAL_AXE.get())) { + event.setAmount(event.getAmount() + KNIGHTMETAL_BONUS_DAMAGE); + // enchantment attack sparkles + ((ServerLevel) target.getLevel()).getChunkSource().broadcastAndSend(target, new ClientboundAnimatePacket(target, 5)); + } + } + } + } + + @SubscribeEvent + public static void onMinotaurAxeCharge(LivingHurtEvent event) { + LivingEntity target = event.getEntity(); + Entity source = event.getSource().getDirectEntity(); + if (!target.getLevel().isClientSide() && source instanceof LivingEntity living && source.isSprinting() && (event.getSource().getMsgId().equals("player") || event.getSource().getMsgId().equals("mob"))) { + ItemStack weapon = living.getMainHandItem(); + if (!weapon.isEmpty() && weapon.getItem() instanceof MinotaurAxeItem) { + event.setAmount(event.getAmount() + MINOTAUR_AXE_BONUS_DAMAGE); + // enchantment attack sparkles + ((ServerLevel) target.getLevel()).getChunkSource().broadcastAndSend(target, new ClientboundAnimatePacket(target, 5)); + } + } + } + + + @SubscribeEvent + public static void damageToolsExtra(BlockEvent.BreakEvent event) { + ItemStack stack = event.getPlayer().getMainHandItem(); + if (event.getState().is(BlockTagGenerator.MAZESTONE) || event.getState().is(BlockTagGenerator.CASTLE_BLOCKS)) { + if (stack.isDamageableItem() && !(stack.getItem() instanceof MazebreakerPickItem)) { + stack.hurtAndBreak(16, event.getPlayer(), (user) -> user.broadcastBreakEvent(InteractionHand.MAIN_HAND)); + } + } + } + + @SubscribeEvent + public static void onEntityInteract(PlayerInteractEvent event) { + if (event instanceof PlayerInteractEvent.EntityInteractSpecific entityInteractSpecific) { + checkEntityTooFar(entityInteractSpecific, entityInteractSpecific.getTarget(), entityInteractSpecific.getEntity(), entityInteractSpecific.getHand()); + } else if (event instanceof PlayerInteractEvent.EntityInteract entityInteract) { + checkEntityTooFar(entityInteract, entityInteract.getTarget(), entityInteract.getEntity(), entityInteract.getHand()); + } else if (event instanceof PlayerInteractEvent.RightClickBlock rightClickBlock) { + checkBlockTooFar(event, rightClickBlock.getEntity(), rightClickBlock.getHand()); + } else if (event instanceof PlayerInteractEvent.RightClickItem rightClickItem) { + INTERACTION_HAND = rightClickItem.getHand(); + } + } + + private static void checkEntityTooFar(PlayerInteractEvent event, Entity target, Player player, InteractionHand hand) { + if (!event.isCanceled()) { + ItemStack heldStack = player.getItemInHand(hand); + if (hasGiantItemInOneHand(player) && !(heldStack.getItem() instanceof GiantItem) && hand == InteractionHand.OFF_HAND) { + UUID uuidForOppositeHand = GiantItem.GIANT_RANGE_MODIFIER; + AttributeInstance attackRange = player.getAttribute(ForgeMod.ENTITY_REACH.get()); + if (attackRange != null) { + AttributeModifier giantModifier = attackRange.getModifier(uuidForOppositeHand); + if (giantModifier != null) { + attackRange.removeModifier(giantModifier); + double range = player.getAttributeValue(ForgeMod.ENTITY_REACH.get()); + double trueReach = range == 0 ? 0 : range + (player.isCreative() ? 3 : 0); // Copied from IForgePlayer#getAttackRange(). + boolean tooFar = !player.isCloseEnough(target, trueReach); + attackRange.addTransientModifier(giantModifier); + event.setCanceled(tooFar); + } + } + } + } + } + + private static void checkBlockTooFar(PlayerInteractEvent event, Player player, InteractionHand hand) { + if (!event.isCanceled()) { + ItemStack heldStack = player.getItemInHand(hand); + if (hasGiantItemInOneHand(player) && !(heldStack.getItem() instanceof GiantItem) && hand == InteractionHand.OFF_HAND) { + UUID uuidForOppositeHand = GiantItem.GIANT_REACH_MODIFIER; + AttributeInstance reachDistance = player.getAttribute(ForgeMod.BLOCK_REACH.get()); + if (reachDistance != null) { + AttributeModifier giantModifier = reachDistance.getModifier(uuidForOppositeHand); + if (giantModifier != null) { + reachDistance.removeModifier(giantModifier); + double reach = player.getAttributeValue(ForgeMod.BLOCK_REACH.get()); + double trueReach = reach == 0 ? 0 : reach + (player.isCreative() ? 0.5 : 0); // Copied from IForgePlayer#getReachDistance(). + boolean tooFar = player.pick(trueReach, 0.0F, false).getType() != HitResult.Type.BLOCK; + reachDistance.addTransientModifier(giantModifier); + event.setCanceled(tooFar); + } + } + } + } + } + + public static boolean hasGiantItemInOneHand(Player player) { + ItemStack mainHandStack = player.getMainHandItem(); + ItemStack offHandStack = player.getOffhandItem(); + return (mainHandStack.getItem() instanceof GiantItem && !(offHandStack.getItem() instanceof GiantItem)); + } +} diff --git a/src/main/java/twilightforest/events/package-info.java b/src/main/java/twilightforest/events/package-info.java new file mode 100644 index 0000000000..a8212a2959 --- /dev/null +++ b/src/main/java/twilightforest/events/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.events; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/init/TFBannerPatterns.java b/src/main/java/twilightforest/init/TFBannerPatterns.java new file mode 100644 index 0000000000..b742335759 --- /dev/null +++ b/src/main/java/twilightforest/init/TFBannerPatterns.java @@ -0,0 +1,23 @@ +package twilightforest.init; + +import net.minecraft.core.Registry; +import net.minecraft.core.registries.Registries; +import net.minecraft.world.level.block.entity.BannerPattern; +import net.minecraftforge.registries.DeferredRegister; +import net.minecraftforge.registries.RegistryObject; +import twilightforest.TwilightForestMod; + +public class TFBannerPatterns { + public static final DeferredRegister BANNER_PATTERNS = DeferredRegister.create(Registries.BANNER_PATTERN, TwilightForestMod.ID); + + public static final RegistryObject NAGA = BANNER_PATTERNS.register("naga", () -> new BannerPattern("tfn")); + public static final RegistryObject LICH = BANNER_PATTERNS.register("lich", () -> new BannerPattern("tfl")); + public static final RegistryObject MINOSHROOM = BANNER_PATTERNS.register("minoshroom", () -> new BannerPattern("tfm")); + public static final RegistryObject HYDRA = BANNER_PATTERNS.register("hydra", () -> new BannerPattern("tfh")); + public static final RegistryObject KNIGHT_PHANTOM = BANNER_PATTERNS.register("knight_phantom", () -> new BannerPattern("tfp")); + public static final RegistryObject UR_GHAST = BANNER_PATTERNS.register("ur_ghast", () -> new BannerPattern("tfg")); + public static final RegistryObject ALPHA_YETI = BANNER_PATTERNS.register("alpha_yeti", () -> new BannerPattern("tfy")); + public static final RegistryObject SNOW_QUEEN = BANNER_PATTERNS.register("snow_queen", () -> new BannerPattern("tfq")); + public static final RegistryObject QUEST_RAM = BANNER_PATTERNS.register("quest_ram", () -> new BannerPattern("tfr")); + +} diff --git a/src/main/java/twilightforest/init/TFBiomes.java b/src/main/java/twilightforest/init/TFBiomes.java new file mode 100644 index 0000000000..24924ed243 --- /dev/null +++ b/src/main/java/twilightforest/init/TFBiomes.java @@ -0,0 +1,84 @@ +package twilightforest.init; + +import net.minecraft.core.HolderGetter; +import net.minecraft.core.registries.Registries; +import net.minecraft.data.worldgen.BootstapContext; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.biome.BiomeGenerationSettings; +import net.minecraft.world.level.biome.MobSpawnSettings; +import net.minecraft.world.level.levelgen.carver.ConfiguredWorldCarver; +import net.minecraft.world.level.levelgen.placement.PlacedFeature; +import twilightforest.TwilightForestMod; +import twilightforest.world.components.BiomeGrassColors; + +import static twilightforest.world.registration.biomes.BiomeHelper.*; + +public class TFBiomes { + + public static final ResourceKey FOREST = makeKey("forest"); + public static final ResourceKey DENSE_FOREST = makeKey("dense_forest"); + public static final ResourceKey FIREFLY_FOREST = makeKey("firefly_forest"); + public static final ResourceKey CLEARING = makeKey("clearing"); + public static final ResourceKey OAK_SAVANNAH = makeKey("oak_savannah"); + public static final ResourceKey STREAM = makeKey("stream"); + public static final ResourceKey LAKE = makeKey("lake"); + + public static final ResourceKey MUSHROOM_FOREST = makeKey("mushroom_forest"); + public static final ResourceKey DENSE_MUSHROOM_FOREST = makeKey("dense_mushroom_forest"); + + public static final ResourceKey ENCHANTED_FOREST = makeKey("enchanted_forest"); + public static final ResourceKey SPOOKY_FOREST = makeKey("spooky_forest"); + + public static final ResourceKey SWAMP = makeKey("swamp"); + public static final ResourceKey FIRE_SWAMP = makeKey("fire_swamp"); + + public static final ResourceKey DARK_FOREST = makeKey("dark_forest"); + public static final ResourceKey DARK_FOREST_CENTER = makeKey("dark_forest_center"); + + public static final ResourceKey SNOWY_FOREST = makeKey("snowy_forest"); + public static final ResourceKey GLACIER = makeKey("glacier"); + + public static final ResourceKey HIGHLANDS = makeKey("highlands"); + public static final ResourceKey THORNLANDS = makeKey("thornlands"); + public static final ResourceKey FINAL_PLATEAU = makeKey("final_plateau"); + + public static final ResourceKey UNDERGROUND = makeKey("underground"); + + private static ResourceKey makeKey(String name) { + return ResourceKey.create(Registries.BIOME, TwilightForestMod.prefix(name)); + } + + public static void bootstrap(BootstapContext context) { + HolderGetter featureGetter = context.lookup(Registries.PLACED_FEATURE); + HolderGetter> carverGetter = context.lookup(Registries.CONFIGURED_CARVER); + context.register(FOREST, biomeWithDefaults(fireflyParticles(defaultAmbientBuilder()), defaultMobSpawning(), twilightForestGen(featureGetter, carverGetter)).build()); + context.register(DENSE_FOREST, biomeWithDefaults(fireflyParticles(defaultAmbientBuilder()).waterColor(0x005522), defaultMobSpawning(), denseForestGen(featureGetter, carverGetter)).temperature(0.7F).downfall(0.8F).build()); + context.register(FIREFLY_FOREST, biomeWithDefaults(fireflyForestParticles(defaultAmbientBuilder()), defaultMobSpawning(), fireflyForestGen(featureGetter, carverGetter)).temperature(0.5F).downfall(1).build()); + context.register(CLEARING, biomeWithDefaults(defaultAmbientBuilder(), defaultMobSpawning(), clearingGen(featureGetter, carverGetter)).temperature(0.8F).downfall(0.4F).build()); + context.register(OAK_SAVANNAH, biomeWithDefaults(defaultAmbientBuilder(), defaultMobSpawning(), oakSavannaGen(featureGetter, carverGetter)).temperature(0.9F).downfall(0).build()); + + context.register(MUSHROOM_FOREST, biomeWithDefaults(fireflyParticles(defaultAmbientBuilder()), defaultMobSpawning(), mushroomForestGen(featureGetter, carverGetter)).temperature(0.8F).downfall(0.8F).build()); + context.register(DENSE_MUSHROOM_FOREST, biomeWithDefaults(fireflyParticles(defaultAmbientBuilder()), defaultMobSpawning(), denseMushroomForestGen(featureGetter, carverGetter)).temperature(0.8F).downfall(1).build()); + + context.register(SPOOKY_FOREST, biomeWithDefaults(defaultAmbientBuilder().grassColorOverride(0xC45123).foliageColorOverride(0xFF8501).waterColor(0xBC8857).grassColorModifier(BiomeGrassColors.SPOOKY_FOREST), spookSpawning(), spookyForestGen(featureGetter, carverGetter)).temperature(0.5F).downfall(1).build()); + context.register(ENCHANTED_FOREST, biomeWithDefaults(fireflyParticles(defaultAmbientBuilder()).foliageColorOverride(0x00FFFF).grassColorOverride(0x00FFFF).grassColorModifier(BiomeGrassColors.ENCHANTED_FOREST), defaultMobSpawning(), enchantedForestGen(featureGetter, carverGetter)).hasPrecipitation(false).build()); + context.register(STREAM, biomeWithDefaults(defaultAmbientBuilder(), defaultMobSpawning(), streamsAndLakes(featureGetter, carverGetter, false)).temperature(0.5F).downfall(0.1F).build()); + context.register(LAKE, biomeWithDefaults(defaultAmbientBuilder(), defaultMobSpawning(), streamsAndLakes(featureGetter, carverGetter, true)).temperature(0.66F).downfall(1).build()); + + context.register(SWAMP, biomeWithDefaults(defaultAmbientBuilder().skyColor(0x002112).fogColor(0x003F21).grassColorOverride(0x5C694E).foliageColorOverride(0x496137).waterColor(0x95B55F).grassColorModifier(BiomeGrassColors.SWAMP), swampSpawning(), swampGen(featureGetter, carverGetter)).temperature(0.8F).downfall(0.9F).build()); + context.register(FIRE_SWAMP, biomeWithDefaults(whiteAshParticles(defaultAmbientBuilder()).waterColor(0x2D0700).fogColor(0x380A00).grassColorOverride(0x572E23).foliageColorOverride(0x64260F).waterColor(0x6C2C2C), new MobSpawnSettings.Builder(), fireSwampGen(featureGetter, carverGetter)).hasPrecipitation(false).temperature(1).downfall(0.4F).build()); + + context.register(DARK_FOREST, biomeWithDefaults(defaultAmbientBuilder().skyColor(0x000000).fogColor(0x000000).grassColorOverride(0x4B6754).foliageColorOverride(0x3B5E3F).grassColorModifier(BiomeGrassColors.DARK_FOREST), darkForestSpawning(), darkForestGen(featureGetter, carverGetter)).temperature(0.7F).downfall(0.8F).build()); + context.register(DARK_FOREST_CENTER, biomeWithDefaults(defaultAmbientBuilder().skyColor(0x000000).fogColor(0x493000).grassColorOverride(0x667540).foliageColorOverride(0xF9821E).grassColorModifier(BiomeGrassColors.DARK_FOREST_CENTER), new MobSpawnSettings.Builder(), darkForestCenterGen(featureGetter, carverGetter)).build()); + + context.register(SNOWY_FOREST, biomeWithDefaults(defaultAmbientBuilder().skyColor(0x808080).fogColor(0xFFFFFF).foliageColorOverride(0xFFFFFF).grassColorOverride(0xFFFFFF), snowForestSpawning(), snowyForestGen(featureGetter, carverGetter)).hasPrecipitation(true).temperature(0.09F).downfall(0.9F).build()); + context.register(GLACIER, biomeWithDefaults(defaultAmbientBuilder().skyColor(0x130D28).fogColor(0x361F88), penguinSpawning(), glacierGen(featureGetter, carverGetter)).temperature(0.8F).downfall(0.1F).hasPrecipitation(true).build()); + + context.register(HIGHLANDS, biomeWithDefaults(defaultAmbientBuilder(), defaultMobSpawning(), highlandsGen(featureGetter, carverGetter)).temperature(0.4F).downfall(0.7F).build()); + context.register(THORNLANDS, biomeWithDefaults(defaultAmbientBuilder(), new MobSpawnSettings.Builder(), thornlandsGen(featureGetter, carverGetter)).temperature(0.3F).downfall(0.2F).build()); + context.register(FINAL_PLATEAU, biomeWithDefaults(defaultAmbientBuilder(), ravenSpawning(), new BiomeGenerationSettings.Builder(featureGetter, carverGetter)).temperature(1.0F).downfall(0.2F).build()); + + context.register(UNDERGROUND, biomeWithDefaults(defaultAmbientBuilder(), undergroundMobSpawning(), undergroundGen(featureGetter, carverGetter)).temperature(0.7F).downfall(0.0F).build()); + } +} diff --git a/src/main/java/twilightforest/init/TFBlockEntities.java b/src/main/java/twilightforest/init/TFBlockEntities.java new file mode 100644 index 0000000000..0527080554 --- /dev/null +++ b/src/main/java/twilightforest/init/TFBlockEntities.java @@ -0,0 +1,117 @@ +package twilightforest.init; + +import net.minecraft.client.renderer.blockentity.BlockEntityRenderers; +import net.minecraft.client.renderer.blockentity.SignRenderer; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.registries.DeferredRegister; +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.registries.RegistryObject; +import twilightforest.TwilightForestMod; +import twilightforest.block.entity.*; +import twilightforest.init.TFBlocks; +import twilightforest.block.entity.spawner.*; +import twilightforest.client.renderer.tileentity.*; + +public class TFBlockEntities { + + public static final DeferredRegister> BLOCK_ENTITIES = DeferredRegister.create(ForgeRegistries.BLOCK_ENTITY_TYPES, TwilightForestMod.ID); + + public static final RegistryObject> ANTIBUILDER = BLOCK_ENTITIES.register("antibuilder", () -> + BlockEntityType.Builder.of(AntibuilderBlockEntity::new, TFBlocks.ANTIBUILDER.get()).build(null)); + public static final RegistryObject> CINDER_FURNACE = BLOCK_ENTITIES.register("cinder_furnace", () -> + BlockEntityType.Builder.of(CinderFurnaceBlockEntity::new, TFBlocks.CINDER_FURNACE.get()).build(null)); + public static final RegistryObject> CARMINITE_REACTOR = BLOCK_ENTITIES.register("carminite_reactor", () -> + BlockEntityType.Builder.of(CarminiteReactorBlockEntity::new, TFBlocks.CARMINITE_REACTOR.get()).build(null)); + public static final RegistryObject> FLAME_JET = BLOCK_ENTITIES.register("flame_jet", () -> + BlockEntityType.Builder.of(FireJetBlockEntity::new, TFBlocks.FIRE_JET.get(), TFBlocks.ENCASED_FIRE_JET.get()).build(null)); + public static final RegistryObject> GHAST_TRAP = BLOCK_ENTITIES.register("ghast_trap", () -> + BlockEntityType.Builder.of(GhastTrapBlockEntity::new, TFBlocks.GHAST_TRAP.get()).build(null)); + public static final RegistryObject> SMOKER = BLOCK_ENTITIES.register("smoker", () -> + BlockEntityType.Builder.of(TFSmokerBlockEntity::new, TFBlocks.SMOKER.get(), TFBlocks.ENCASED_SMOKER.get()).build(null)); + public static final RegistryObject> TOWER_BUILDER = BLOCK_ENTITIES.register("tower_builder", () -> + BlockEntityType.Builder.of(CarminiteBuilderBlockEntity::new, TFBlocks.CARMINITE_BUILDER.get()).build(null)); + public static final RegistryObject> TROPHY = BLOCK_ENTITIES.register("trophy", () -> + BlockEntityType.Builder.of(TrophyBlockEntity::new, TFBlocks.NAGA_TROPHY.get(), TFBlocks.LICH_TROPHY.get(), TFBlocks.MINOSHROOM_TROPHY.get(), + TFBlocks.HYDRA_TROPHY.get(), TFBlocks.KNIGHT_PHANTOM_TROPHY.get(), TFBlocks.UR_GHAST_TROPHY.get(), TFBlocks.ALPHA_YETI_TROPHY.get(), + TFBlocks.SNOW_QUEEN_TROPHY.get(), TFBlocks.QUEST_RAM_TROPHY.get(), TFBlocks.NAGA_WALL_TROPHY.get(), TFBlocks.LICH_WALL_TROPHY.get(), + TFBlocks.MINOSHROOM_WALL_TROPHY.get(), TFBlocks.HYDRA_WALL_TROPHY.get(), TFBlocks.KNIGHT_PHANTOM_WALL_TROPHY.get(), TFBlocks.UR_GHAST_WALL_TROPHY.get(), + TFBlocks.ALPHA_YETI_WALL_TROPHY.get(), TFBlocks.SNOW_QUEEN_WALL_TROPHY.get(), TFBlocks.QUEST_RAM_WALL_TROPHY.get()).build(null)); + public static final RegistryObject> ALPHA_YETI_SPAWNER = BLOCK_ENTITIES.register("alpha_yeti_spawner", () -> + BlockEntityType.Builder.of(AlphaYetiSpawnerBlockEntity::new, TFBlocks.ALPHA_YETI_BOSS_SPAWNER.get()).build(null)); + public static final RegistryObject> FINAL_BOSS_SPAWNER = BLOCK_ENTITIES.register("final_boss_spawner", () -> + BlockEntityType.Builder.of(FinalBossSpawnerBlockEntity::new, TFBlocks.FINAL_BOSS_BOSS_SPAWNER.get()).build(null)); + public static final RegistryObject> HYDRA_SPAWNER = BLOCK_ENTITIES.register("hydra_boss_spawner", () -> + BlockEntityType.Builder.of(HydraSpawnerBlockEntity::new, TFBlocks.HYDRA_BOSS_SPAWNER.get()).build(null)); + public static final RegistryObject> KNIGHT_PHANTOM_SPAWNER = BLOCK_ENTITIES.register("knight_phantom_spawner", () -> + BlockEntityType.Builder.of(KnightPhantomSpawnerBlockEntity::new, TFBlocks.KNIGHT_PHANTOM_BOSS_SPAWNER.get()).build(null)); + public static final RegistryObject> LICH_SPAWNER = BLOCK_ENTITIES.register("lich_spawner", () -> + BlockEntityType.Builder.of(LichSpawnerBlockEntity::new, TFBlocks.LICH_BOSS_SPAWNER.get()).build(null)); + public static final RegistryObject> MINOSHROOM_SPAWNER = BLOCK_ENTITIES.register("minoshroom_spawner", () -> + BlockEntityType.Builder.of(MinoshroomSpawnerBlockEntity::new, TFBlocks.MINOSHROOM_BOSS_SPAWNER.get()).build(null)); + public static final RegistryObject> NAGA_SPAWNER = BLOCK_ENTITIES.register("naga_spawner", () -> + BlockEntityType.Builder.of(NagaSpawnerBlockEntity::new, TFBlocks.NAGA_BOSS_SPAWNER.get()).build(null)); + public static final RegistryObject> SNOW_QUEEN_SPAWNER = BLOCK_ENTITIES.register("snow_queen_spawner", () -> + BlockEntityType.Builder.of(SnowQueenSpawnerBlockEntity::new, TFBlocks.SNOW_QUEEN_BOSS_SPAWNER.get()).build(null)); + public static final RegistryObject> UR_GHAST_SPAWNER = BLOCK_ENTITIES.register("tower_boss_spawner", () -> + BlockEntityType.Builder.of(UrGhastSpawnerBlockEntity::new, TFBlocks.UR_GHAST_BOSS_SPAWNER.get()).build(null)); + + public static final RegistryObject> CICADA = BLOCK_ENTITIES.register("cicada", () -> + BlockEntityType.Builder.of(CicadaBlockEntity::new, TFBlocks.CICADA.get()).build(null)); + public static final RegistryObject> FIREFLY = BLOCK_ENTITIES.register("firefly", () -> + BlockEntityType.Builder.of(FireflyBlockEntity::new, TFBlocks.FIREFLY.get()).build(null)); + public static final RegistryObject> MOONWORM = BLOCK_ENTITIES.register("moonworm", () -> + BlockEntityType.Builder.of(MoonwormBlockEntity::new, TFBlocks.MOONWORM.get()).build(null)); + + public static final RegistryObject> KEEPSAKE_CASKET = BLOCK_ENTITIES.register("keepsake_casket", () -> + BlockEntityType.Builder.of(KeepsakeCasketBlockEntity::new, TFBlocks.KEEPSAKE_CASKET.get()).build(null)); + + public static final RegistryObject> TF_SIGN = BLOCK_ENTITIES.register("tf_sign", () -> + BlockEntityType.Builder.of(TFSignBlockEntity::new, + TFBlocks.TWILIGHT_OAK_SIGN.get(), TFBlocks.TWILIGHT_WALL_SIGN.get(), + TFBlocks.CANOPY_SIGN.get(), TFBlocks.CANOPY_WALL_SIGN.get(), + TFBlocks.MANGROVE_SIGN.get(), TFBlocks.MANGROVE_WALL_SIGN.get(), + TFBlocks.DARK_SIGN.get(), TFBlocks.DARK_WALL_SIGN.get(), + TFBlocks.TIME_SIGN.get(), TFBlocks.TIME_WALL_SIGN.get(), + TFBlocks.TRANSFORMATION_SIGN.get(), TFBlocks.TRANSFORMATION_WALL_SIGN.get(), + TFBlocks.MINING_SIGN.get(), TFBlocks.MINING_WALL_SIGN.get(), + TFBlocks.SORTING_SIGN.get(), TFBlocks.SORTING_WALL_SIGN.get()).build(null)); + + public static final RegistryObject> TF_CHEST = BLOCK_ENTITIES.register("tf_chest", () -> + BlockEntityType.Builder.of(TwilightChestEntity::new, + TFBlocks.TWILIGHT_OAK_CHEST.get(), TFBlocks.CANOPY_CHEST.get(), TFBlocks.MANGROVE_CHEST.get(), + TFBlocks.DARK_CHEST.get(), TFBlocks.TIME_CHEST.get(), TFBlocks.TRANSFORMATION_CHEST.get(), + TFBlocks.MINING_CHEST.get(), TFBlocks.SORTING_CHEST.get()).build(null)); + + public static final RegistryObject> SKULL_CANDLE = BLOCK_ENTITIES.register("skull_candle", () -> + BlockEntityType.Builder.of(SkullCandleBlockEntity::new, + TFBlocks.ZOMBIE_SKULL_CANDLE.get(), TFBlocks.ZOMBIE_WALL_SKULL_CANDLE.get(), + TFBlocks.SKELETON_SKULL_CANDLE.get(), TFBlocks.SKELETON_WALL_SKULL_CANDLE.get(), + TFBlocks.WITHER_SKELE_SKULL_CANDLE.get(), TFBlocks.WITHER_SKELE_WALL_SKULL_CANDLE.get(), + TFBlocks.CREEPER_SKULL_CANDLE.get(), TFBlocks.CREEPER_WALL_SKULL_CANDLE.get(), + TFBlocks.PLAYER_SKULL_CANDLE.get(), TFBlocks.PLAYER_WALL_SKULL_CANDLE.get()).build(null)); + + public static final RegistryObject> TOME_SPAWNER = BLOCK_ENTITIES.register("tome_spawner", () -> + BlockEntityType.Builder.of(TomeSpawnerBlockEntity::new, TFBlocks.DEATH_TOME_SPAWNER.get()).build(null)); + + public static final RegistryObject> BEANSTALK_GROWER = BLOCK_ENTITIES.register("beanstalk_grower", () -> + BlockEntityType.Builder.of(GrowingBeanstalkBlockEntity::new, TFBlocks.BEANSTALK_GROWER.get()).build(null)); + + public static final RegistryObject> RED_THREAD = BLOCK_ENTITIES.register("red_thread", () -> + BlockEntityType.Builder.of(RedThreadBlockEntity::new, TFBlocks.RED_THREAD.get()).build(null)); + + @OnlyIn(Dist.CLIENT) + public static void registerTileEntityRenders() { + // tile entities + BlockEntityRenderers.register(FIREFLY.get(), FireflyTileEntityRenderer::new); + BlockEntityRenderers.register(CICADA.get(), CicadaTileEntityRenderer::new); + BlockEntityRenderers.register(MOONWORM.get(), MoonwormTileEntityRenderer::new); + BlockEntityRenderers.register(TROPHY.get(), TrophyTileEntityRenderer::new); + BlockEntityRenderers.register(TF_SIGN.get(), SignRenderer::new); + BlockEntityRenderers.register(TF_CHEST.get(), TwilightChestRenderer::new); + BlockEntityRenderers.register(KEEPSAKE_CASKET.get(), CasketTileEntityRenderer::new); + BlockEntityRenderers.register(SKULL_CANDLE.get(), SkullCandleTileEntityRenderer::new); + BlockEntityRenderers.register(RED_THREAD.get(), RedThreadRenderer::new); + } +} diff --git a/src/main/java/twilightforest/init/TFBlockItems.java b/src/main/java/twilightforest/init/TFBlockItems.java new file mode 100644 index 0000000000..74dd6becc3 --- /dev/null +++ b/src/main/java/twilightforest/init/TFBlockItems.java @@ -0,0 +1,525 @@ +package twilightforest.init; + +import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.*; +import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.level.ClipContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraftforge.client.extensions.common.IClientItemExtensions; +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.registries.RegisterEvent; +import net.minecraftforge.registries.RegistryObject; +import twilightforest.TwilightForestMod; +import twilightforest.block.AbstractSkullCandleBlock; +import twilightforest.block.HollowLogClimbable; +import twilightforest.block.HollowLogHorizontal; +import twilightforest.block.HollowLogVertical; +import twilightforest.client.ISTER; +import twilightforest.item.*; + +import java.util.Objects; +import java.util.function.Consumer; + +//TODO move this out of the register event. I would ideally like to register these alongside blocks +public class TFBlockItems { + + public static void registerBlockItems(RegisterEvent event) { + if(Objects.equals(event.getForgeRegistry(), ForgeRegistries.ITEMS)) { + + register(event, trophyBlock(TFBlocks.NAGA_TROPHY, TFBlocks.NAGA_WALL_TROPHY)); + register(event, trophyBlock(TFBlocks.LICH_TROPHY, TFBlocks.LICH_WALL_TROPHY)); + register(event, trophyBlock(TFBlocks.MINOSHROOM_TROPHY, TFBlocks.MINOSHROOM_WALL_TROPHY)); + register(event, trophyBlock(TFBlocks.HYDRA_TROPHY, TFBlocks.HYDRA_WALL_TROPHY)); + register(event, trophyBlock(TFBlocks.KNIGHT_PHANTOM_TROPHY, TFBlocks.KNIGHT_PHANTOM_WALL_TROPHY)); + register(event, trophyBlock(TFBlocks.UR_GHAST_TROPHY, TFBlocks.UR_GHAST_WALL_TROPHY)); + register(event, trophyBlock(TFBlocks.ALPHA_YETI_TROPHY, TFBlocks.ALPHA_YETI_WALL_TROPHY)); + register(event, trophyBlock(TFBlocks.SNOW_QUEEN_TROPHY, TFBlocks.SNOW_QUEEN_WALL_TROPHY)); + register(event, trophyBlock(TFBlocks.QUEST_RAM_TROPHY, TFBlocks.QUEST_RAM_WALL_TROPHY)); + + register(event, blockItem(TFBlocks.TWILIGHT_PORTAL_MINIATURE_STRUCTURE)); +// register(event, blockItem(TFBlocks.HEDGE_MAZE_MINIATURE_STRUCTURE)); +// register(event, blockItem(TFBlocks.HOLLOW_HILL_MINIATURE_STRUCTURE)); +// register(event, blockItem(TFBlocks.MUSHROOM_TOWER_MINIATURE_STRUCTURE)); +// register(event, blockItem(TFBlocks.QUEST_GROVE_MINIATURE_STRUCTURE)); + register(event, blockItem(TFBlocks.NAGA_COURTYARD_MINIATURE_STRUCTURE)); + register(event, blockItem(TFBlocks.LICH_TOWER_MINIATURE_STRUCTURE)); +// register(event, blockItem(TFBlocks.MINOTAUR_LABYRINTH_MINIATURE_STRUCTURE)); +// register(event, blockItem(TFBlocks.HYDRA_LAIR_MINIATURE_STRUCTURE)); +// register(event, blockItem(TFBlocks.GOBLIN_STRONGHOLD_MINIATURE_STRUCTURE)); +// register(event, blockItem(TFBlocks.DARK_TOWER_MINIATURE_STRUCTURE)); +// register(event, blockItem(TFBlocks.YETI_CAVE_MINIATURE_STRUCTURE)); +// register(event, blockItem(TFBlocks.AURORA_PALACE_MINIATURE_STRUCTURE)); +// register(event, blockItem(TFBlocks.TROLL_CAVE_COTTAGE_MINIATURE_STRUCTURE)); +// register(event, blockItem(TFBlocks.FINAL_CASTLE_MINIATURE_STRUCTURE)); + + register(event, blockItem(TFBlocks.NAGA_BOSS_SPAWNER)); + register(event, blockItem(TFBlocks.LICH_BOSS_SPAWNER)); + register(event, blockItem(TFBlocks.MINOSHROOM_BOSS_SPAWNER)); + register(event, blockItem(TFBlocks.HYDRA_BOSS_SPAWNER)); + register(event, blockItem(TFBlocks.KNIGHT_PHANTOM_BOSS_SPAWNER)); + register(event, blockItem(TFBlocks.UR_GHAST_BOSS_SPAWNER)); + register(event, blockItem(TFBlocks.ALPHA_YETI_BOSS_SPAWNER)); + register(event, blockItem(TFBlocks.SNOW_QUEEN_BOSS_SPAWNER)); + register(event, blockItem(TFBlocks.FINAL_BOSS_BOSS_SPAWNER)); + + register(event, blockItem(TFBlocks.ETCHED_NAGASTONE)); + register(event, blockItem(TFBlocks.CRACKED_ETCHED_NAGASTONE)); + register(event, blockItem(TFBlocks.MOSSY_ETCHED_NAGASTONE)); + register(event, blockItem(TFBlocks.NAGASTONE_PILLAR)); + register(event, blockItem(TFBlocks.CRACKED_NAGASTONE_PILLAR)); + register(event, blockItem(TFBlocks.MOSSY_NAGASTONE_PILLAR)); + register(event, blockItem(TFBlocks.NAGASTONE_STAIRS_LEFT)); + register(event, blockItem(TFBlocks.CRACKED_NAGASTONE_STAIRS_LEFT)); + register(event, blockItem(TFBlocks.MOSSY_NAGASTONE_STAIRS_LEFT)); + register(event, blockItem(TFBlocks.NAGASTONE_STAIRS_RIGHT)); + register(event, blockItem(TFBlocks.CRACKED_NAGASTONE_STAIRS_RIGHT)); + register(event, blockItem(TFBlocks.MOSSY_NAGASTONE_STAIRS_RIGHT)); + register(event, blockItem(TFBlocks.NAGASTONE_HEAD)); + register(event, blockItem(TFBlocks.NAGASTONE)); + register(event, blockItem(TFBlocks.SPIRAL_BRICKS)); +// register(event, blockItem(TFBlocks.TERRORCOTTA_CIRCLE)); +// register(event, blockItem(TFBlocks.TERRORCOTTA_DIAGONAL)); +// register(event, blockItem(TFBlocks.LAPIS_BLOCK)); + register(event, blockItem(TFBlocks.TWISTED_STONE)); + register(event, blockItem(TFBlocks.TWISTED_STONE_PILLAR)); + register(event, new BlockItem(TFBlocks.KEEPSAKE_CASKET.get(), new Item.Properties().fireResistant()) { + @Override + public void initializeClient(Consumer consumer) { + consumer.accept(new IClientItemExtensions() { + @Override + public BlockEntityWithoutLevelRenderer getCustomRenderer() { + return new ISTER(); + } + }); + } + }); + register(event, blockItem(TFBlocks.CANDELABRA)); + register(event, blockItem(TFBlocks.BOLD_STONE_PILLAR)); + register(event, blockItem(TFBlocks.DEATH_TOME_SPAWNER)); + register(event, blockItem(TFBlocks.EMPTY_CANOPY_BOOKSHELF)); + register(event, skullCandleItem(TFBlocks.ZOMBIE_SKULL_CANDLE, TFBlocks.ZOMBIE_WALL_SKULL_CANDLE)); + register(event, skullCandleItem(TFBlocks.SKELETON_SKULL_CANDLE, TFBlocks.SKELETON_WALL_SKULL_CANDLE)); + register(event, skullCandleItem(TFBlocks.WITHER_SKELE_SKULL_CANDLE, TFBlocks.WITHER_SKELE_WALL_SKULL_CANDLE)); + register(event, skullCandleItem(TFBlocks.CREEPER_SKULL_CANDLE, TFBlocks.CREEPER_WALL_SKULL_CANDLE)); + register(event, skullCandleItem(TFBlocks.PLAYER_SKULL_CANDLE, TFBlocks.PLAYER_WALL_SKULL_CANDLE)); + register(event, new HugeWaterLilyItem(TFBlocks.HUGE_WATER_LILY.get(), new Item.Properties())); + register(event, new HugeLilyPadItem(TFBlocks.HUGE_LILY_PAD.get(), new Item.Properties())); + register(event, blockItem(TFBlocks.MAZESTONE)); + register(event, blockItem(TFBlocks.MAZESTONE_BRICK)); + register(event, blockItem(TFBlocks.CRACKED_MAZESTONE)); + register(event, blockItem(TFBlocks.MOSSY_MAZESTONE)); + register(event, blockItem(TFBlocks.DECORATIVE_MAZESTONE)); + register(event, blockItem(TFBlocks.CUT_MAZESTONE)); + register(event, blockItem(TFBlocks.MAZESTONE_BORDER)); + register(event, blockItem(TFBlocks.MAZESTONE_MOSAIC)); + register(event, blockItem(TFBlocks.SMOKER)); + register(event, blockItem(TFBlocks.ENCASED_SMOKER)); + register(event, blockItem(TFBlocks.FIRE_JET)); + register(event, blockItem(TFBlocks.ENCASED_FIRE_JET)); + register(event, blockItem(TFBlocks.STRONGHOLD_SHIELD)); + register(event, blockItem(TFBlocks.TROPHY_PEDESTAL)); + register(event, blockItem(TFBlocks.UNDERBRICK)); + register(event, blockItem(TFBlocks.CRACKED_UNDERBRICK)); + register(event, blockItem(TFBlocks.MOSSY_UNDERBRICK)); + register(event, blockItem(TFBlocks.UNDERBRICK_FLOOR)); + register(event, blockItem(TFBlocks.TOWERWOOD)); + register(event, blockItem(TFBlocks.CRACKED_TOWERWOOD)); + register(event, blockItem(TFBlocks.MOSSY_TOWERWOOD)); + register(event, blockItem(TFBlocks.INFESTED_TOWERWOOD)); + register(event, blockItem(TFBlocks.ENCASED_TOWERWOOD)); + register(event, blockItem(TFBlocks.VANISHING_BLOCK)); + register(event, blockItem(TFBlocks.REAPPEARING_BLOCK)); + register(event, blockItem(TFBlocks.LOCKED_VANISHING_BLOCK)); + register(event, blockItem(TFBlocks.CARMINITE_BUILDER)); + register(event, blockItem(TFBlocks.ANTIBUILDER)); + register(event, blockItem(TFBlocks.CARMINITE_REACTOR)); + register(event, blockItem(TFBlocks.GHAST_TRAP)); + register(event, blockItem(TFBlocks.AURORA_BLOCK)); + register(event, blockItem(TFBlocks.AURORA_PILLAR)); + register(event, blockItem(TFBlocks.AURORA_SLAB)); + register(event, blockItem(TFBlocks.AURORALIZED_GLASS)); + register(event, blockItem(TFBlocks.TROLLSTEINN)); + register(event, blockItem(TFBlocks.TROLLVIDR)); + register(event, blockItem(TFBlocks.UNRIPE_TROLLBER)); + register(event, blockItem(TFBlocks.TROLLBER)); + register(event, blockItem(TFBlocks.HUGE_MUSHGLOOM)); + register(event, blockItem(TFBlocks.HUGE_MUSHGLOOM_STEM)); + register(event, blockItem(TFBlocks.UBEROUS_SOIL)); + register(event, blockItem(TFBlocks.HUGE_STALK)); + register(event, blockItem(TFBlocks.BEANSTALK_LEAVES)); + register(event, blockItem(TFBlocks.WISPY_CLOUD)); + register(event, blockItem(TFBlocks.FLUFFY_CLOUD)); + register(event, blockItem(TFBlocks.GIANT_COBBLESTONE)); + register(event, blockItem(TFBlocks.GIANT_LOG)); + register(event, blockItem(TFBlocks.GIANT_LEAVES)); + register(event, blockItem(TFBlocks.GIANT_OBSIDIAN)); + register(event, blockItem(TFBlocks.DEADROCK)); + register(event, blockItem(TFBlocks.CRACKED_DEADROCK)); + register(event, blockItem(TFBlocks.WEATHERED_DEADROCK)); + register(event, blockItem(TFBlocks.BROWN_THORNS)); + register(event, blockItem(TFBlocks.GREEN_THORNS)); + register(event, blockItem(TFBlocks.BURNT_THORNS)); + register(event, blockItem(TFBlocks.THORN_ROSE)); + register(event, blockItem(TFBlocks.THORN_LEAVES)); + register(event, blockItem(TFBlocks.CASTLE_BRICK)); + register(event, blockItem(TFBlocks.WORN_CASTLE_BRICK)); + register(event, blockItem(TFBlocks.CRACKED_CASTLE_BRICK)); + register(event, blockItem(TFBlocks.MOSSY_CASTLE_BRICK)); + register(event, blockItem(TFBlocks.THICK_CASTLE_BRICK)); + register(event, blockItem(TFBlocks.CASTLE_ROOF_TILE)); + register(event, blockItem(TFBlocks.ENCASED_CASTLE_BRICK_PILLAR)); + register(event, blockItem(TFBlocks.ENCASED_CASTLE_BRICK_TILE)); + register(event, blockItem(TFBlocks.BOLD_CASTLE_BRICK_PILLAR)); + register(event, blockItem(TFBlocks.BOLD_CASTLE_BRICK_TILE)); + register(event, blockItem(TFBlocks.CASTLE_BRICK_STAIRS)); + register(event, blockItem(TFBlocks.WORN_CASTLE_BRICK_STAIRS)); + register(event, blockItem(TFBlocks.CRACKED_CASTLE_BRICK_STAIRS)); + register(event, blockItem(TFBlocks.MOSSY_CASTLE_BRICK_STAIRS)); + register(event, blockItem(TFBlocks.ENCASED_CASTLE_BRICK_STAIRS)); + register(event, blockItem(TFBlocks.BOLD_CASTLE_BRICK_STAIRS)); + register(event, blockItem(TFBlocks.PINK_CASTLE_RUNE_BRICK)); + register(event, blockItem(TFBlocks.YELLOW_CASTLE_RUNE_BRICK)); + register(event, blockItem(TFBlocks.BLUE_CASTLE_RUNE_BRICK)); + register(event, blockItem(TFBlocks.VIOLET_CASTLE_RUNE_BRICK)); + register(event, blockItem(TFBlocks.PINK_CASTLE_DOOR)); + register(event, blockItem(TFBlocks.YELLOW_CASTLE_DOOR)); + register(event, blockItem(TFBlocks.BLUE_CASTLE_DOOR)); + register(event, blockItem(TFBlocks.VIOLET_CASTLE_DOOR)); + register(event, blockItem(TFBlocks.PINK_FORCE_FIELD)); + register(event, blockItem(TFBlocks.ORANGE_FORCE_FIELD)); + register(event, blockItem(TFBlocks.GREEN_FORCE_FIELD)); + register(event, blockItem(TFBlocks.BLUE_FORCE_FIELD)); + register(event, blockItem(TFBlocks.VIOLET_FORCE_FIELD)); + + register(event, blockItem(TFBlocks.UNCRAFTING_TABLE)); + register(event, blockItem(TFBlocks.CINDER_FURNACE)); + register(event, blockItem(TFBlocks.CINDER_LOG)); + register(event, blockItem(TFBlocks.CINDER_WOOD)); + register(event, blockItem(TFBlocks.SLIDER)); + register(event, blockItem(TFBlocks.IRON_LADDER)); + + register(event, blockItem(TFBlocks.IRONWOOD_BLOCK)); + register(event, blockItem(TFBlocks.STEELEAF_BLOCK)); + register(event, fireImmuneBlock(TFBlocks.FIERY_BLOCK)); + register(event, blockItem(TFBlocks.KNIGHTMETAL_BLOCK)); + register(event, blockItem(TFBlocks.CARMINITE_BLOCK)); + register(event, blockItem(TFBlocks.ARCTIC_FUR_BLOCK)); + + register(event, blockItem(TFBlocks.MOSS_PATCH)); + register(event, blockItem(TFBlocks.MAYAPPLE)); + register(event, blockItem(TFBlocks.CLOVER_PATCH)); + register(event, blockItem(TFBlocks.FIDDLEHEAD)); + register(event, blockItem(TFBlocks.MUSHGLOOM)); + register(event, blockItem(TFBlocks.TORCHBERRY_PLANT)); + register(event, blockItem(TFBlocks.ROOT_STRAND)); + register(event, placeOnWaterBlockItemReplaceable(TFBlocks.FALLEN_LEAVES)); + register(event, wearableBlock(TFBlocks.FIREFLY, TFBlockEntities.FIREFLY)); + register(event, wearableBlock(TFBlocks.CICADA, TFBlockEntities.CICADA)); + register(event, wearableBlock(TFBlocks.MOONWORM, TFBlockEntities.MOONWORM)); + register(event, blockItem(TFBlocks.FIREFLY_JAR)); + register(event, blockItem(TFBlocks.FIREFLY_SPAWNER)); + register(event, blockItem(TFBlocks.CICADA_JAR)); + register(event, blockItem(TFBlocks.HEDGE)); + register(event, blockItem(TFBlocks.ROOT_BLOCK)); + register(event, blockItem(TFBlocks.LIVEROOT_BLOCK)); + register(event, blockItem(TFBlocks.MANGROVE_ROOT)); + + register(event, blockItem(TFBlocks.TWILIGHT_OAK_LEAVES)); + register(event, blockItem(TFBlocks.CANOPY_LEAVES)); + register(event, blockItem(TFBlocks.MANGROVE_LEAVES)); + register(event, blockItem(TFBlocks.DARK_LEAVES)); + register(event, blockItem(TFBlocks.TIME_LEAVES)); + register(event, blockItem(TFBlocks.TRANSFORMATION_LEAVES)); + register(event, blockItem(TFBlocks.MINING_LEAVES)); + register(event, blockItem(TFBlocks.SORTING_LEAVES)); + register(event, blockItem(TFBlocks.RAINBOW_OAK_LEAVES)); + register(event, blockItem(TFBlocks.TWILIGHT_OAK_LOG)); + register(event, blockItem(TFBlocks.CANOPY_LOG)); + register(event, blockItem(TFBlocks.MANGROVE_LOG)); + register(event, blockItem(TFBlocks.DARK_LOG)); + register(event, blockItem(TFBlocks.TIME_LOG)); + register(event, blockItem(TFBlocks.TRANSFORMATION_LOG)); + register(event, blockItem(TFBlocks.MINING_LOG)); + register(event, blockItem(TFBlocks.SORTING_LOG)); + register(event, blockItem(TFBlocks.STRIPPED_TWILIGHT_OAK_LOG)); + register(event, blockItem(TFBlocks.STRIPPED_CANOPY_LOG)); + register(event, blockItem(TFBlocks.STRIPPED_MANGROVE_LOG)); + register(event, blockItem(TFBlocks.STRIPPED_DARK_LOG)); + register(event, blockItem(TFBlocks.STRIPPED_TIME_LOG)); + register(event, blockItem(TFBlocks.STRIPPED_TRANSFORMATION_LOG)); + register(event, blockItem(TFBlocks.STRIPPED_MINING_LOG)); + register(event, blockItem(TFBlocks.STRIPPED_SORTING_LOG)); + register(event, blockItem(TFBlocks.TWILIGHT_OAK_WOOD)); + register(event, blockItem(TFBlocks.CANOPY_WOOD)); + register(event, blockItem(TFBlocks.MANGROVE_WOOD)); + register(event, blockItem(TFBlocks.DARK_WOOD)); + register(event, blockItem(TFBlocks.TIME_WOOD)); + register(event, blockItem(TFBlocks.TRANSFORMATION_WOOD)); + register(event, blockItem(TFBlocks.MINING_WOOD)); + register(event, blockItem(TFBlocks.SORTING_WOOD)); + register(event, blockItem(TFBlocks.STRIPPED_TWILIGHT_OAK_WOOD)); + register(event, blockItem(TFBlocks.STRIPPED_CANOPY_WOOD)); + register(event, blockItem(TFBlocks.STRIPPED_MANGROVE_WOOD)); + register(event, blockItem(TFBlocks.STRIPPED_DARK_WOOD)); + register(event, blockItem(TFBlocks.STRIPPED_TIME_WOOD)); + register(event, blockItem(TFBlocks.STRIPPED_TRANSFORMATION_WOOD)); + register(event, blockItem(TFBlocks.STRIPPED_MINING_WOOD)); + register(event, blockItem(TFBlocks.STRIPPED_SORTING_WOOD)); + + register(event, blockItem(TFBlocks.TIME_LOG_CORE)); + register(event, blockItem(TFBlocks.TRANSFORMATION_LOG_CORE)); + register(event, blockItem(TFBlocks.MINING_LOG_CORE)); + register(event, blockItem(TFBlocks.SORTING_LOG_CORE)); + register(event, blockItem(TFBlocks.TWILIGHT_OAK_SAPLING)); + register(event, blockItem(TFBlocks.CANOPY_SAPLING)); + register(event, blockItem(TFBlocks.MANGROVE_SAPLING)); + register(event, blockItem(TFBlocks.DARKWOOD_SAPLING)); + register(event, blockItem(TFBlocks.HOLLOW_OAK_SAPLING)); + register(event, blockItem(TFBlocks.TIME_SAPLING)); + register(event, blockItem(TFBlocks.TRANSFORMATION_SAPLING)); + register(event, blockItem(TFBlocks.MINING_SAPLING)); + register(event, blockItem(TFBlocks.SORTING_SAPLING)); + register(event, blockItem(TFBlocks.RAINBOW_OAK_SAPLING)); + + register(event, burningItem(TFBlocks.OAK_BANISTER, 300)); + register(event, burningItem(TFBlocks.SPRUCE_BANISTER, 300)); + register(event, burningItem(TFBlocks.BIRCH_BANISTER, 300)); + register(event, burningItem(TFBlocks.JUNGLE_BANISTER, 300)); + register(event, burningItem(TFBlocks.ACACIA_BANISTER, 300)); + register(event, burningItem(TFBlocks.DARK_OAK_BANISTER, 300)); + register(event, burningItem(TFBlocks.CRIMSON_BANISTER, 300)); + register(event, burningItem(TFBlocks.WARPED_BANISTER, 300)); + register(event, burningItem(TFBlocks.VANGROVE_BANISTER, 300)); + + registerWithCustomName(event, "hollow_oak_log", hollowLog(TFBlocks.HOLLOW_OAK_LOG_HORIZONTAL, TFBlocks.HOLLOW_OAK_LOG_VERTICAL, TFBlocks.HOLLOW_OAK_LOG_CLIMBABLE)); + registerWithCustomName(event, "hollow_spruce_log", hollowLog(TFBlocks.HOLLOW_SPRUCE_LOG_HORIZONTAL, TFBlocks.HOLLOW_SPRUCE_LOG_VERTICAL, TFBlocks.HOLLOW_SPRUCE_LOG_CLIMBABLE)); + registerWithCustomName(event, "hollow_birch_log", hollowLog(TFBlocks.HOLLOW_BIRCH_LOG_HORIZONTAL, TFBlocks.HOLLOW_BIRCH_LOG_VERTICAL, TFBlocks.HOLLOW_BIRCH_LOG_CLIMBABLE)); + registerWithCustomName(event, "hollow_jungle_log", hollowLog(TFBlocks.HOLLOW_JUNGLE_LOG_HORIZONTAL, TFBlocks.HOLLOW_JUNGLE_LOG_VERTICAL, TFBlocks.HOLLOW_JUNGLE_LOG_CLIMBABLE)); + registerWithCustomName(event, "hollow_acacia_log", hollowLog(TFBlocks.HOLLOW_ACACIA_LOG_HORIZONTAL, TFBlocks.HOLLOW_ACACIA_LOG_VERTICAL, TFBlocks.HOLLOW_ACACIA_LOG_CLIMBABLE)); + registerWithCustomName(event, "hollow_dark_oak_log", hollowLog(TFBlocks.HOLLOW_DARK_OAK_LOG_HORIZONTAL, TFBlocks.HOLLOW_DARK_OAK_LOG_VERTICAL, TFBlocks.HOLLOW_DARK_OAK_LOG_CLIMBABLE)); + registerWithCustomName(event, "hollow_crimson_stem", hollowLog(TFBlocks.HOLLOW_CRIMSON_STEM_HORIZONTAL, TFBlocks.HOLLOW_CRIMSON_STEM_VERTICAL, TFBlocks.HOLLOW_CRIMSON_STEM_CLIMBABLE)); + registerWithCustomName(event, "hollow_warped_stem", hollowLog(TFBlocks.HOLLOW_WARPED_STEM_HORIZONTAL, TFBlocks.HOLLOW_WARPED_STEM_VERTICAL, TFBlocks.HOLLOW_WARPED_STEM_CLIMBABLE)); + registerWithCustomName(event, "hollow_vangrove_log", hollowLog(TFBlocks.HOLLOW_VANGROVE_LOG_HORIZONTAL, TFBlocks.HOLLOW_VANGROVE_LOG_VERTICAL, TFBlocks.HOLLOW_VANGROVE_LOG_CLIMBABLE)); + + registerWithCustomName(event, "hollow_twilight_oak_log", hollowLog(TFBlocks.HOLLOW_TWILIGHT_OAK_LOG_HORIZONTAL, TFBlocks.HOLLOW_TWILIGHT_OAK_LOG_VERTICAL, TFBlocks.HOLLOW_TWILIGHT_OAK_LOG_CLIMBABLE)); + registerWithCustomName(event, "hollow_canopy_log", hollowLog(TFBlocks.HOLLOW_CANOPY_LOG_HORIZONTAL, TFBlocks.HOLLOW_CANOPY_LOG_VERTICAL, TFBlocks.HOLLOW_CANOPY_LOG_CLIMBABLE)); + registerWithCustomName(event, "hollow_mangrove_log", hollowLog(TFBlocks.HOLLOW_MANGROVE_LOG_HORIZONTAL, TFBlocks.HOLLOW_MANGROVE_LOG_VERTICAL, TFBlocks.HOLLOW_MANGROVE_LOG_CLIMBABLE)); + registerWithCustomName(event, "hollow_dark_log", hollowLog(TFBlocks.HOLLOW_DARK_LOG_HORIZONTAL, TFBlocks.HOLLOW_DARK_LOG_VERTICAL, TFBlocks.HOLLOW_DARK_LOG_CLIMBABLE)); + registerWithCustomName(event, "hollow_time_log", hollowLog(TFBlocks.HOLLOW_TIME_LOG_HORIZONTAL, TFBlocks.HOLLOW_TIME_LOG_VERTICAL, TFBlocks.HOLLOW_TIME_LOG_CLIMBABLE)); + registerWithCustomName(event, "hollow_transformation_log", hollowLog(TFBlocks.HOLLOW_TRANSFORMATION_LOG_HORIZONTAL, TFBlocks.HOLLOW_TRANSFORMATION_LOG_VERTICAL, TFBlocks.HOLLOW_TRANSFORMATION_LOG_CLIMBABLE)); + registerWithCustomName(event, "hollow_mining_log", hollowLog(TFBlocks.HOLLOW_MINING_LOG_HORIZONTAL, TFBlocks.HOLLOW_MINING_LOG_VERTICAL, TFBlocks.HOLLOW_MINING_LOG_CLIMBABLE)); + registerWithCustomName(event, "hollow_sorting_log", hollowLog(TFBlocks.HOLLOW_SORTING_LOG_HORIZONTAL, TFBlocks.HOLLOW_SORTING_LOG_VERTICAL, TFBlocks.HOLLOW_SORTING_LOG_CLIMBABLE)); + + register(event, blockItem(TFBlocks.TWILIGHT_OAK_PLANKS)); + register(event, blockItem(TFBlocks.TWILIGHT_OAK_STAIRS)); + register(event, blockItem(TFBlocks.TWILIGHT_OAK_SLAB)); + register(event, blockItem(TFBlocks.TWILIGHT_OAK_BUTTON)); + register(event, burningItem(TFBlocks.TWILIGHT_OAK_FENCE, 300)); + register(event, burningItem(TFBlocks.TWILIGHT_OAK_GATE, 300)); + register(event, blockItem(TFBlocks.TWILIGHT_OAK_PLATE)); + register(event, blockItem(TFBlocks.TWILIGHT_OAK_TRAPDOOR)); + register(event, tallBlock(TFBlocks.TWILIGHT_OAK_DOOR)); + register(event, signBlock(TFBlocks.TWILIGHT_OAK_SIGN, TFBlocks.TWILIGHT_WALL_SIGN)); + register(event, burningItem(TFBlocks.TWILIGHT_OAK_BANISTER, 300)); + register(event, blockItem(TFBlocks.CANOPY_PLANKS)); + register(event, blockItem(TFBlocks.CANOPY_STAIRS)); + register(event, blockItem(TFBlocks.CANOPY_SLAB)); + register(event, blockItem(TFBlocks.CANOPY_BUTTON)); + register(event, burningItem(TFBlocks.CANOPY_FENCE, 300)); + register(event, burningItem(TFBlocks.CANOPY_GATE, 300)); + register(event, blockItem(TFBlocks.CANOPY_PLATE)); + register(event, blockItem(TFBlocks.CANOPY_TRAPDOOR)); + register(event, tallBlock(TFBlocks.CANOPY_DOOR)); + register(event, signBlock(TFBlocks.CANOPY_SIGN, TFBlocks.CANOPY_WALL_SIGN)); + register(event, burningItem(TFBlocks.CANOPY_BANISTER, 300)); + register(event, blockItem(TFBlocks.CANOPY_BOOKSHELF)); + register(event, blockItem(TFBlocks.MANGROVE_PLANKS)); + register(event, blockItem(TFBlocks.MANGROVE_STAIRS)); + register(event, blockItem(TFBlocks.MANGROVE_SLAB)); + register(event, blockItem(TFBlocks.MANGROVE_BUTTON)); + register(event, burningItem(TFBlocks.MANGROVE_FENCE, 300)); + register(event, burningItem(TFBlocks.MANGROVE_GATE, 300)); + register(event, blockItem(TFBlocks.MANGROVE_PLATE)); + register(event, blockItem(TFBlocks.MANGROVE_TRAPDOOR)); + register(event, tallBlock(TFBlocks.MANGROVE_DOOR)); + register(event, signBlock(TFBlocks.MANGROVE_SIGN, TFBlocks.MANGROVE_WALL_SIGN)); + register(event, burningItem(TFBlocks.MANGROVE_BANISTER, 300)); + register(event, blockItem(TFBlocks.DARK_PLANKS)); + register(event, blockItem(TFBlocks.DARK_STAIRS)); + register(event, blockItem(TFBlocks.DARK_SLAB)); + register(event, blockItem(TFBlocks.DARK_BUTTON)); + register(event, burningItem(TFBlocks.DARK_FENCE, 300)); + register(event, burningItem(TFBlocks.DARK_GATE, 300)); + register(event, blockItem(TFBlocks.DARK_PLATE)); + register(event, blockItem(TFBlocks.DARK_TRAPDOOR)); + register(event, tallBlock(TFBlocks.DARK_DOOR)); + register(event, signBlock(TFBlocks.DARK_SIGN, TFBlocks.DARK_WALL_SIGN)); + register(event, burningItem(TFBlocks.DARK_BANISTER, 300)); + register(event, blockItem(TFBlocks.TIME_PLANKS)); + register(event, blockItem(TFBlocks.TIME_STAIRS)); + register(event, blockItem(TFBlocks.TIME_SLAB)); + register(event, blockItem(TFBlocks.TIME_BUTTON)); + register(event, burningItem(TFBlocks.TIME_FENCE, 300)); + register(event, burningItem(TFBlocks.TIME_GATE, 300)); + register(event, blockItem(TFBlocks.TIME_PLATE)); + register(event, blockItem(TFBlocks.TIME_TRAPDOOR)); + register(event, tallBlock(TFBlocks.TIME_DOOR)); + register(event, signBlock(TFBlocks.TIME_SIGN, TFBlocks.TIME_WALL_SIGN)); + register(event, burningItem(TFBlocks.TIME_BANISTER, 300)); + register(event, blockItem(TFBlocks.TRANSFORMATION_PLANKS)); + register(event, blockItem(TFBlocks.TRANSFORMATION_STAIRS)); + register(event, blockItem(TFBlocks.TRANSFORMATION_SLAB)); + register(event, blockItem(TFBlocks.TRANSFORMATION_BUTTON)); + register(event, burningItem(TFBlocks.TRANSFORMATION_FENCE, 300)); + register(event, burningItem(TFBlocks.TRANSFORMATION_GATE, 300)); + register(event, blockItem(TFBlocks.TRANSFORMATION_PLATE)); + register(event, blockItem(TFBlocks.TRANSFORMATION_TRAPDOOR)); + register(event, tallBlock(TFBlocks.TRANSFORMATION_DOOR)); + register(event, signBlock(TFBlocks.TRANSFORMATION_SIGN, TFBlocks.TRANSFORMATION_WALL_SIGN)); + register(event, burningItem(TFBlocks.TRANSFORMATION_BANISTER, 300)); + register(event, blockItem(TFBlocks.MINING_PLANKS)); + register(event, blockItem(TFBlocks.MINING_STAIRS)); + register(event, blockItem(TFBlocks.MINING_SLAB)); + register(event, blockItem(TFBlocks.MINING_BUTTON)); + register(event, burningItem(TFBlocks.MINING_FENCE, 300)); + register(event, burningItem(TFBlocks.MINING_GATE, 300)); + register(event, blockItem(TFBlocks.MINING_PLATE)); + register(event, blockItem(TFBlocks.MINING_TRAPDOOR)); + register(event, tallBlock(TFBlocks.MINING_DOOR)); + register(event, signBlock(TFBlocks.MINING_SIGN, TFBlocks.MINING_WALL_SIGN)); + register(event, burningItem(TFBlocks.MINING_BANISTER, 300)); + register(event, blockItem(TFBlocks.SORTING_PLANKS)); + register(event, blockItem(TFBlocks.SORTING_STAIRS)); + register(event, blockItem(TFBlocks.SORTING_SLAB)); + register(event, blockItem(TFBlocks.SORTING_BUTTON)); + register(event, burningItem(TFBlocks.SORTING_FENCE, 300)); + register(event, burningItem(TFBlocks.SORTING_GATE, 300)); + register(event, blockItem(TFBlocks.SORTING_PLATE)); + register(event, blockItem(TFBlocks.SORTING_TRAPDOOR)); + register(event, tallBlock(TFBlocks.SORTING_DOOR)); + register(event, signBlock(TFBlocks.SORTING_SIGN, TFBlocks.SORTING_WALL_SIGN)); + register(event, burningItem(TFBlocks.SORTING_BANISTER, 300)); + + makeBEWLRItem(event, TFBlocks.TWILIGHT_OAK_CHEST); + makeBEWLRItem(event, TFBlocks.CANOPY_CHEST); + makeBEWLRItem(event, TFBlocks.MANGROVE_CHEST); + makeBEWLRItem(event, TFBlocks.DARK_CHEST); + makeBEWLRItem(event, TFBlocks.TIME_CHEST); + makeBEWLRItem(event, TFBlocks.TRANSFORMATION_CHEST); + makeBEWLRItem(event, TFBlocks.MINING_CHEST); + makeBEWLRItem(event, TFBlocks.SORTING_CHEST); + } + } + + private static BlockItem hollowLog(RegistryObject horizontalLog, RegistryObject verticalLog, RegistryObject climbable) { + return new HollowLogItem(horizontalLog, verticalLog, climbable, new Item.Properties()); + } + + private static BlockItem blockItem(RegistryObject block) { + return new BlockItem(block.get(), new Item.Properties()); + } + + private static BlockItem placeOnWaterBlockItemReplaceable(RegistryObject block) { + return new BlockItem(block.get(), new Item.Properties()) { + @Override + public InteractionResult useOn(UseOnContext context) { + return context.getLevel().getBlockState(context.getClickedPos()).is(block.get()) ? super.useOn(context) : InteractionResult.PASS; + } + @Override + public InteractionResultHolder use(Level p_220231_, Player p_220232_, InteractionHand p_220233_) { + BlockHitResult blockhitresult = getPlayerPOVHitResult(p_220231_, p_220232_, ClipContext.Fluid.SOURCE_ONLY); + BlockHitResult blockhitresult1 = blockhitresult.withPosition(blockhitresult.getBlockPos().above()); + InteractionResult interactionresult = super.useOn(new UseOnContext(p_220232_, p_220233_, blockhitresult1)); + return new InteractionResultHolder<>(interactionresult, p_220232_.getItemInHand(p_220233_)); + } + }; + } + + private static BlockItem fireImmuneBlock(RegistryObject block) { + return new BlockItem(block.get(), new Item.Properties().fireResistant()); + } + + private static BlockItem skullCandleItem(RegistryObject floor, RegistryObject wall) { + return new SkullCandleItem(floor.get(), wall.get(), new Item.Properties().rarity(Rarity.UNCOMMON)) { + @Override + public void initializeClient(Consumer consumer) { + consumer.accept(new IClientItemExtensions() { + @Override + public BlockEntityWithoutLevelRenderer getCustomRenderer() { + return new ISTER(); + } + }); + } + }; + } + + private static BlockItem burningItem(RegistryObject block, int burntime) { + return new FurnaceFuelItem(block.get(), new Item.Properties(), burntime); + } + + private static BlockItem trophyBlock(RegistryObject block, RegistryObject wallblock) { + return new TrophyItem(block.get(), wallblock.get(), new Item.Properties().rarity(TwilightForestMod.getRarity())) { + @Override + public void initializeClient(Consumer consumer) { + consumer.accept(new IClientItemExtensions() { + @Override + public BlockEntityWithoutLevelRenderer getCustomRenderer() { + return new ISTER(); + } + }); + } + }; + } + + private static BlockItem wearableBlock(RegistryObject block, RegistryObject> tileentity) { + return new WearableItem(block.get(), new Item.Properties()) { + @Override + public void initializeClient(Consumer consumer) { + consumer.accept(new IClientItemExtensions() { + @Override + public BlockEntityWithoutLevelRenderer getCustomRenderer() { + return new ISTER(); + } + }); + } + }; + } + + private static BlockItem tallBlock(RegistryObject block) { + return new DoubleHighBlockItem(block.get(), new Item.Properties()); + } + + private static BlockItem signBlock(RegistryObject block, RegistryObject wallblock) { + return new SignItem(new Item.Properties().stacksTo(16), block.get(), wallblock.get()); + } + + private static void makeBEWLRItem(RegisterEvent event, RegistryObject block) { + register(event, new BlockItem(block.get(), new Item.Properties()) { + @Override + public void initializeClient(Consumer consumer) { + consumer.accept(new IClientItemExtensions() { + @Override + public BlockEntityWithoutLevelRenderer getCustomRenderer() { + return new ISTER(); + } + }); + } + }); + } + + private static void register(RegisterEvent event, BlockItem item) { + event.register(ForgeRegistries.Keys.ITEMS, helper -> helper.register(ForgeRegistries.BLOCKS.getKey(item.getBlock()), item)); + } + + private static void registerWithCustomName(RegisterEvent event, String name, BlockItem item) { + event.register(ForgeRegistries.Keys.ITEMS, helper -> helper.register(name, item)); + } +} diff --git a/src/main/java/twilightforest/init/TFBlocks.java b/src/main/java/twilightforest/init/TFBlocks.java new file mode 100644 index 0000000000..1939f23c7f --- /dev/null +++ b/src/main/java/twilightforest/init/TFBlocks.java @@ -0,0 +1,694 @@ +package twilightforest.init; + +import net.minecraft.core.Direction; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.world.level.block.*; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.properties.BlockSetType; +import net.minecraft.world.level.block.state.properties.WoodType; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.material.MaterialColor; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.registries.DeferredRegister; +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.registries.RegisterEvent; +import net.minecraftforge.registries.RegistryObject; +import twilightforest.TwilightForestMod; +import twilightforest.block.*; +import twilightforest.enums.BossVariant; +import twilightforest.enums.FireJetVariant; +import twilightforest.enums.TowerDeviceVariant; +import twilightforest.util.TFWoodTypes; +import twilightforest.world.components.feature.trees.growers.*; + +import javax.annotation.Nonnull; +import java.util.Objects; + +@SuppressWarnings({"WeakerAccess", "unused", "deprecation"}) +@Nonnull +@Mod.EventBusSubscriber(modid = TwilightForestMod.ID, bus = Mod.EventBusSubscriber.Bus.MOD) +public class TFBlocks { + public static final DeferredRegister BLOCKS = DeferredRegister.create(ForgeRegistries.BLOCKS, TwilightForestMod.ID); + + public static final RegistryObject TWILIGHT_PORTAL = BLOCKS.register("twilight_portal", () -> new TFPortalBlock(BlockBehaviour.Properties.of(Material.PORTAL).strength(-1.0F).sound(SoundType.GLASS).lightLevel((state) -> 11).noCollission().noOcclusion().noLootTable())); + + //misc. + public static final RegistryObject HEDGE = BLOCKS.register("hedge", () -> new HedgeBlock(BlockBehaviour.Properties.of(Material.CACTUS).strength(2.0F, 6.0F).sound(SoundType.GRASS))); + public static final RegistryObject FIREFLY_JAR = BLOCKS.register("firefly_jar", () -> new JarBlock(BlockBehaviour.Properties.of(Material.GLASS).strength(0.3F, 3.0F).sound(SoundType.BONE_BLOCK).lightLevel((state) -> 15).noOcclusion())); + public static final RegistryObject FIREFLY_SPAWNER = BLOCKS.register("firefly_particle_spawner", () -> new FireflySpawnerBlock(BlockBehaviour.Properties.of(Material.GLASS).strength(0.3F, 3.0F).sound(SoundType.BONE_BLOCK).lightLevel((state) -> 15).noOcclusion())); + public static final RegistryObject CICADA_JAR = BLOCKS.register("cicada_jar", () -> new JarBlock(BlockBehaviour.Properties.of(Material.GLASS).strength(0.3F, 3.0F).sound(SoundType.BONE_BLOCK).noOcclusion().randomTicks())); + public static final RegistryObject MOSS_PATCH = BLOCKS.register("moss_patch", () -> new MossPatchBlock(BlockBehaviour.Properties.of(Material.PLANT).instabreak().sound(SoundType.MOSS).noCollission().noOcclusion())); + public static final RegistryObject MAYAPPLE = BLOCKS.register("mayapple", () -> new MayappleBlock(BlockBehaviour.Properties.of(Material.PLANT).instabreak().sound(SoundType.GRASS).noCollission().noOcclusion())); + public static final RegistryObject CLOVER_PATCH = BLOCKS.register("clover_patch", () -> new PatchBlock(BlockBehaviour.Properties.of(Material.PLANT).instabreak().sound(SoundType.GRASS).noCollission().noOcclusion())); + public static final RegistryObject FIDDLEHEAD = BLOCKS.register("fiddlehead", () -> new FiddleheadBlock(BlockBehaviour.Properties.of(Material.REPLACEABLE_PLANT).instabreak().sound(SoundType.GRASS).noCollission().noOcclusion())); + public static final RegistryObject MUSHGLOOM = BLOCKS.register("mushgloom", () -> new MushgloomBlock(BlockBehaviour.Properties.of(Material.PLANT).instabreak().sound(SoundType.FUNGUS).noCollission().noOcclusion().lightLevel((state) -> 3))); + public static final RegistryObject TORCHBERRY_PLANT = BLOCKS.register("torchberry_plant", () -> new TorchberryPlantBlock(BlockBehaviour.Properties.of(Material.PLANT).instabreak().sound(SoundType.HANGING_ROOTS).noCollission().noOcclusion().lightLevel((state) -> (state.getValue(TorchberryPlantBlock.HAS_BERRIES) ? 8 : 0)))); + public static final RegistryObject ROOT_STRAND = BLOCKS.register("root_strand", () -> new RootStrandBlock(BlockBehaviour.Properties.of(Material.PLANT).instabreak().sound(SoundType.HANGING_ROOTS).noCollission().noOcclusion())); + public static final RegistryObject FALLEN_LEAVES = BLOCKS.register("fallen_leaves", () -> new FallenLeavesBlock(BlockBehaviour.Properties.of(Material.REPLACEABLE_PLANT).instabreak().sound(SoundType.AZALEA_LEAVES).noCollission().noOcclusion())); + public static final RegistryObject ROOT_BLOCK = BLOCKS.register("root", () -> new Block(BlockBehaviour.Properties.of(Material.WOOD).strength(2.0F, 3.0F).sound(SoundType.WOOD))); + public static final RegistryObject LIVEROOT_BLOCK = BLOCKS.register("liveroot_block", () -> new LiverootBlock(BlockBehaviour.Properties.of(Material.WOOD).strength(2.0F, 3.0F).sound(SoundType.WOOD))); + public static final RegistryObject UNCRAFTING_TABLE = BLOCKS.register("uncrafting_table", UncraftingTableBlock::new); + public static final RegistryObject SMOKER = BLOCKS.register("smoker", () -> new TFSmokerBlock(BlockBehaviour.Properties.of(Material.STONE, MaterialColor.GRASS).strength(1.5F, 6.0F).sound(SoundType.WOOD))); + public static final RegistryObject ENCASED_SMOKER = BLOCKS.register("encased_smoker", () -> new EncasedSmokerBlock(BlockBehaviour.Properties.of(Material.WOOD, MaterialColor.SAND).requiresCorrectToolForDrops().strength(1.5F, 6.0F).sound(SoundType.WOOD))); + public static final RegistryObject FIRE_JET = BLOCKS.register("fire_jet", () -> new FireJetBlock(BlockBehaviour.Properties.of(Material.STONE, MaterialColor.GRASS).strength(1.5F, 6.0F).sound(SoundType.WOOD).randomTicks().lightLevel((state) -> state.getValue(FireJetBlock.STATE) != FireJetVariant.FLAME ? 0 : 15))); + public static final RegistryObject ENCASED_FIRE_JET = BLOCKS.register("encased_fire_jet", () -> new EncasedFireJetBlock(BlockBehaviour.Properties.of(Material.WOOD, MaterialColor.SAND).requiresCorrectToolForDrops().strength(1.5F, 6.0F).sound(SoundType.WOOD).lightLevel((state) -> 15))); + public static final RegistryObject FIREFLY = BLOCKS.register("firefly", () -> new FireflyBlock(BlockBehaviour.Properties.of(new Material.Builder(MaterialColor.GRASS).noCollider().nonSolid().build()).lightLevel((state) -> 15).sound(SoundType.SLIME_BLOCK).instabreak().noCollission())); + public static final RegistryObject CICADA = BLOCKS.register("cicada", () -> new CicadaBlock(BlockBehaviour.Properties.of(new Material.Builder(MaterialColor.GRASS).noCollider().nonSolid().build()).sound(SoundType.SLIME_BLOCK).instabreak().noCollission())); + public static final RegistryObject MOONWORM = BLOCKS.register("moonworm", () -> new MoonwormBlock(BlockBehaviour.Properties.of(new Material.Builder(MaterialColor.GRASS).noCollider().nonSolid().build()).lightLevel((state) -> 14).sound(SoundType.SLIME_BLOCK).instabreak().noCollission())); + public static final RegistryObject HUGE_LILY_PAD = BLOCKS.register("huge_lily_pad", () -> new HugeLilyPadBlock(BlockBehaviour.Properties.of(Material.PLANT).instabreak().sound(SoundType.GRASS))); + public static final RegistryObject HUGE_WATER_LILY = BLOCKS.register("huge_water_lily", () -> new HugeWaterLilyBlock(BlockBehaviour.Properties.of(Material.PLANT).noCollission().instabreak().sound(SoundType.GRASS))); + public static final RegistryObject SLIDER = BLOCKS.register("slider", SliderBlock::new); + public static final RegistryObject IRON_LADDER = BLOCKS.register("iron_ladder", () -> new IronLadderBlock(BlockBehaviour.Properties.of(Material.DECORATION).requiresCorrectToolForDrops().strength(5.0F, 6.0F).sound(SoundType.METAL).noOcclusion())); + + //naga courtyard + public static final RegistryObject NAGASTONE_HEAD = BLOCKS.register("nagastone_head", () -> new TFHorizontalBlock(BlockBehaviour.Properties.of(Material.STONE).requiresCorrectToolForDrops().strength(1.5F, 6.0F).sound(SoundType.STONE))); + public static final RegistryObject NAGASTONE = BLOCKS.register("nagastone", () -> new NagastoneBlock(BlockBehaviour.Properties.of(Material.STONE).requiresCorrectToolForDrops().strength(1.5F, 6.0F).sound(SoundType.STONE))); + public static final RegistryObject SPIRAL_BRICKS = BLOCKS.register("spiral_bricks", SpiralBrickBlock::new); + public static final RegistryObject ETCHED_NAGASTONE = BLOCKS.register("etched_nagastone", () -> new EtchedNagastoneBlock(BlockBehaviour.Properties.of(Material.STONE).requiresCorrectToolForDrops().strength(1.5F, 6.0F).sound(SoundType.STONE))); + public static final RegistryObject NAGASTONE_PILLAR = BLOCKS.register("nagastone_pillar", NagastonePillarBlock::new); + public static final RegistryObject NAGASTONE_STAIRS_LEFT = BLOCKS.register("nagastone_stairs_left", () -> new StairBlock(ETCHED_NAGASTONE.get().defaultBlockState(), BlockBehaviour.Properties.copy(ETCHED_NAGASTONE.get()))); + public static final RegistryObject NAGASTONE_STAIRS_RIGHT = BLOCKS.register("nagastone_stairs_right", () -> new StairBlock(ETCHED_NAGASTONE.get().defaultBlockState(), BlockBehaviour.Properties.copy(ETCHED_NAGASTONE.get()))); + public static final RegistryObject MOSSY_ETCHED_NAGASTONE = BLOCKS.register("mossy_etched_nagastone", () -> new EtchedNagastoneBlock(BlockBehaviour.Properties.of(Material.STONE).requiresCorrectToolForDrops().strength(1.5F, 6.0F).sound(SoundType.STONE))); + public static final RegistryObject MOSSY_NAGASTONE_PILLAR = BLOCKS.register("mossy_nagastone_pillar", NagastonePillarBlock::new); + public static final RegistryObject MOSSY_NAGASTONE_STAIRS_LEFT = BLOCKS.register("mossy_nagastone_stairs_left", () -> new StairBlock(MOSSY_ETCHED_NAGASTONE.get().defaultBlockState(), BlockBehaviour.Properties.copy(MOSSY_ETCHED_NAGASTONE.get()))); + public static final RegistryObject MOSSY_NAGASTONE_STAIRS_RIGHT = BLOCKS.register("mossy_nagastone_stairs_right", () -> new StairBlock(MOSSY_ETCHED_NAGASTONE.get().defaultBlockState(), BlockBehaviour.Properties.copy(MOSSY_ETCHED_NAGASTONE.get()))); + public static final RegistryObject CRACKED_ETCHED_NAGASTONE = BLOCKS.register("cracked_etched_nagastone", () -> new EtchedNagastoneBlock(BlockBehaviour.Properties.of(Material.STONE).strength(1.5F, 6.0F).sound(SoundType.STONE))); + public static final RegistryObject CRACKED_NAGASTONE_PILLAR = BLOCKS.register("cracked_nagastone_pillar", NagastonePillarBlock::new); + public static final RegistryObject CRACKED_NAGASTONE_STAIRS_LEFT = BLOCKS.register("cracked_nagastone_stairs_left", () -> new StairBlock(CRACKED_ETCHED_NAGASTONE.get().defaultBlockState(), BlockBehaviour.Properties.copy(CRACKED_ETCHED_NAGASTONE.get()))); + public static final RegistryObject CRACKED_NAGASTONE_STAIRS_RIGHT = BLOCKS.register("cracked_nagastone_stairs_right", () -> new StairBlock(CRACKED_ETCHED_NAGASTONE.get().defaultBlockState(), BlockBehaviour.Properties.copy(CRACKED_ETCHED_NAGASTONE.get()))); + + //lich tower + public static final RegistryObject TWISTED_STONE = BLOCKS.register("twisted_stone", () -> new RotatedPillarBlock(BlockBehaviour.Properties.of(Material.STONE).requiresCorrectToolForDrops().strength(1.5F, 6.0F))); + public static final RegistryObject TWISTED_STONE_PILLAR = BLOCKS.register("twisted_stone_pillar", () -> new WallPillarBlock(Material.STONE, 12, 16)); + public static final RegistryObject KEEPSAKE_CASKET = BLOCKS.register("keepsake_casket", KeepsakeCasketBlock::new); + public static final RegistryObject BOLD_STONE_PILLAR = BLOCKS.register("bold_stone_pillar", () -> new RotatedPillarBlock(BlockBehaviour.Properties.of(Material.STONE).requiresCorrectToolForDrops().strength(1.5F, 6.0F))); + public static final RegistryObject DEATH_TOME_SPAWNER = BLOCKS.register("death_tome_spawner", () -> new TomeSpawnerBlock(BlockBehaviour.Properties.of(Material.WOOD).strength(2.5F).sound(SoundType.WOOD))); + public static final RegistryObject EMPTY_CANOPY_BOOKSHELF = BLOCKS.register("empty_canopy_bookshelf", () -> new Block(BlockBehaviour.Properties.of(Material.WOOD).strength(1.5F).sound(SoundType.WOOD))); + public static final RegistryObject CANDELABRA = BLOCKS.register("candelabra", () -> new CandelabraBlock(BlockBehaviour.Properties.of(Material.METAL, MaterialColor.STONE).lightLevel(state -> state.getValue(AbstractLightableBlock.LIGHTING) == AbstractLightableBlock.Lighting.NORMAL ? 15 : state.getValue(AbstractLightableBlock.LIGHTING) == AbstractLightableBlock.Lighting.OMINOUS ? 7 : 0))); + public static final RegistryObject ZOMBIE_SKULL_CANDLE = BLOCKS.register("zombie_skull_candle", () -> new SkullCandleBlock(SkullBlock.Types.ZOMBIE, BlockBehaviour.Properties.copy(Blocks.ZOMBIE_HEAD))); + public static final RegistryObject ZOMBIE_WALL_SKULL_CANDLE = BLOCKS.register("zombie_wall_skull_candle", () -> new WallSkullCandleBlock(SkullBlock.Types.ZOMBIE, BlockBehaviour.Properties.copy(Blocks.ZOMBIE_WALL_HEAD))); + public static final RegistryObject SKELETON_SKULL_CANDLE = BLOCKS.register("skeleton_skull_candle", () -> new SkullCandleBlock(SkullBlock.Types.SKELETON, BlockBehaviour.Properties.copy(Blocks.SKELETON_SKULL))); + public static final RegistryObject SKELETON_WALL_SKULL_CANDLE = BLOCKS.register("skeleton_wall_skull_candle", () -> new WallSkullCandleBlock(SkullBlock.Types.SKELETON, BlockBehaviour.Properties.copy(Blocks.SKELETON_WALL_SKULL))); + public static final RegistryObject WITHER_SKELE_SKULL_CANDLE = BLOCKS.register("wither_skeleton_skull_candle", () -> new SkullCandleBlock(SkullBlock.Types.WITHER_SKELETON, BlockBehaviour.Properties.copy(Blocks.WITHER_SKELETON_SKULL))); + public static final RegistryObject WITHER_SKELE_WALL_SKULL_CANDLE = BLOCKS.register("wither_skeleton_wall_skull_candle", () -> new WallSkullCandleBlock(SkullBlock.Types.WITHER_SKELETON, BlockBehaviour.Properties.copy(Blocks.WITHER_SKELETON_WALL_SKULL))); + public static final RegistryObject CREEPER_SKULL_CANDLE = BLOCKS.register("creeper_skull_candle", () -> new SkullCandleBlock(SkullBlock.Types.CREEPER, BlockBehaviour.Properties.copy(Blocks.CREEPER_HEAD))); + public static final RegistryObject CREEPER_WALL_SKULL_CANDLE = BLOCKS.register("creeper_wall_skull_candle", () -> new WallSkullCandleBlock(SkullBlock.Types.CREEPER, BlockBehaviour.Properties.copy(Blocks.CREEPER_WALL_HEAD))); + public static final RegistryObject PLAYER_SKULL_CANDLE = BLOCKS.register("player_skull_candle", () -> new SkullCandleBlock(SkullBlock.Types.PLAYER, BlockBehaviour.Properties.copy(Blocks.PLAYER_HEAD))); + public static final RegistryObject PLAYER_WALL_SKULL_CANDLE = BLOCKS.register("player_wall_skull_candle", () -> new WallSkullCandleBlock(SkullBlock.Types.PLAYER, BlockBehaviour.Properties.copy(Blocks.PLAYER_WALL_HEAD))); + + //labyrinth + public static final RegistryObject MAZESTONE = BLOCKS.register("mazestone", () -> new Block(BlockBehaviour.Properties.of(Material.STONE).requiresCorrectToolForDrops().strength(100.0F, 5.0F).sound(SoundType.STONE))); + public static final RegistryObject MAZESTONE_BRICK = BLOCKS.register("mazestone_brick", () -> new Block(BlockBehaviour.Properties.copy(MAZESTONE.get()))); + public static final RegistryObject CUT_MAZESTONE = BLOCKS.register("cut_mazestone", () -> new Block(BlockBehaviour.Properties.copy(MAZESTONE.get()))); + public static final RegistryObject DECORATIVE_MAZESTONE = BLOCKS.register("decorative_mazestone", () -> new Block(BlockBehaviour.Properties.copy(MAZESTONE.get()))); + public static final RegistryObject CRACKED_MAZESTONE = BLOCKS.register("cracked_mazestone", () -> new Block(BlockBehaviour.Properties.copy(MAZESTONE.get()))); + public static final RegistryObject MOSSY_MAZESTONE = BLOCKS.register("mossy_mazestone", () -> new Block(BlockBehaviour.Properties.copy(MAZESTONE.get()))); + public static final RegistryObject MAZESTONE_MOSAIC = BLOCKS.register("mazestone_mosaic", () -> new Block(BlockBehaviour.Properties.copy(MAZESTONE.get()))); + public static final RegistryObject MAZESTONE_BORDER = BLOCKS.register("mazestone_border", () -> new Block(BlockBehaviour.Properties.copy(MAZESTONE.get()))); + public static final RegistryObject RED_THREAD = BLOCKS.register("red_thread", () -> new RedThreadBlock(BlockBehaviour.Properties.of(Material.DECORATION).instabreak().noCollission().color(MaterialColor.FIRE))); + + //stronghold + public static final RegistryObject STRONGHOLD_SHIELD = BLOCKS.register("stronghold_shield", () -> new StrongholdShieldBlock(BlockBehaviour.Properties.of(Material.STONE).requiresCorrectToolForDrops().strength(-1.0F, 6000000.0F).sound(SoundType.METAL).noLootTable())); + public static final RegistryObject TROPHY_PEDESTAL = BLOCKS.register("trophy_pedestal", () -> new TrophyPedestalBlock(BlockBehaviour.Properties.of(Material.STONE).requiresCorrectToolForDrops().strength(2.0F, 2000.0F).sound(SoundType.STONE))); + public static final RegistryObject UNDERBRICK = BLOCKS.register("underbrick", () -> new Block(BlockBehaviour.Properties.of(Material.STONE, MaterialColor.WOOD).requiresCorrectToolForDrops().strength(1.5F, 6.0F).sound(SoundType.STONE))); + public static final RegistryObject MOSSY_UNDERBRICK = BLOCKS.register("mossy_underbrick", () -> new Block(BlockBehaviour.Properties.of(Material.STONE, MaterialColor.WOOD).requiresCorrectToolForDrops().strength(1.5F, 6.0F).sound(SoundType.STONE))); + public static final RegistryObject CRACKED_UNDERBRICK = BLOCKS.register("cracked_underbrick", () -> new Block(BlockBehaviour.Properties.of(Material.STONE, MaterialColor.WOOD).requiresCorrectToolForDrops().strength(1.5F, 6.0F).sound(SoundType.STONE))); + public static final RegistryObject UNDERBRICK_FLOOR = BLOCKS.register("underbrick_floor", () -> new Block(BlockBehaviour.Properties.of(Material.STONE, MaterialColor.WOOD).requiresCorrectToolForDrops().strength(1.5F, 6.0F).sound(SoundType.STONE))); + + //dark tower + public static final RegistryObject TOWERWOOD = BLOCKS.register("towerwood", () -> new FlammableBlock(1, 0, BlockBehaviour.Properties.of(Material.WOOD, MaterialColor.COLOR_ORANGE).strength(40.0F, 6.0F).sound(SoundType.WOOD))); + public static final RegistryObject ENCASED_TOWERWOOD = BLOCKS.register("encased_towerwood", () -> new FlammableBlock(1, 0, BlockBehaviour.Properties.of(Material.WOOD, MaterialColor.SAND).strength(40.0F, 6.0F).sound(SoundType.WOOD))); + public static final RegistryObject CRACKED_TOWERWOOD = BLOCKS.register("cracked_towerwood", () -> new FlammableBlock(1, 0, BlockBehaviour.Properties.of(Material.WOOD, MaterialColor.COLOR_ORANGE).strength(40.0F, 6.0F).sound(SoundType.WOOD))); + public static final RegistryObject MOSSY_TOWERWOOD = BLOCKS.register("mossy_towerwood", () -> new FlammableBlock(1, 0, BlockBehaviour.Properties.of(Material.WOOD, MaterialColor.COLOR_ORANGE).strength(40.0F, 6.0F).sound(SoundType.WOOD))); + public static final RegistryObject INFESTED_TOWERWOOD = BLOCKS.register("infested_towerwood", () -> new InfestedTowerwoodBlock(1, 0, BlockBehaviour.Properties.of(Material.WOOD, MaterialColor.COLOR_ORANGE).strength(1.0F, 6.0F).sound(SoundType.WOOD))); + public static final RegistryObject REAPPEARING_BLOCK = BLOCKS.register("reappearing_block", () -> new ReappearingBlock(BlockBehaviour.Properties.of(Material.WOOD, MaterialColor.SAND).requiresCorrectToolForDrops().strength(10.0F, 35.0F).sound(SoundType.WOOD).lightLevel((state) -> 4))); + // FIXME Split Vanishing block into regular breakable variant, and then the unbreakable variant + public static final RegistryObject VANISHING_BLOCK = BLOCKS.register("vanishing_block", () -> new VanishingBlock(BlockBehaviour.Properties.of(Material.WOOD, MaterialColor.SAND).strength(-1.0F, 35.0F).sound(SoundType.WOOD).lightLevel((state) -> state.getValue(VanishingBlock.ACTIVE) ? 4 : 0))); + public static final RegistryObject LOCKED_VANISHING_BLOCK = BLOCKS.register("locked_vanishing_block", () -> new LockedVanishingBlock(BlockBehaviour.Properties.of(Material.WOOD, MaterialColor.SAND).strength(-1.0F, 2000.0F).sound(SoundType.WOOD))); + public static final RegistryObject CARMINITE_BUILDER = BLOCKS.register("carminite_builder", () -> new BuilderBlock(BlockBehaviour.Properties.of(Material.WOOD, MaterialColor.SAND).requiresCorrectToolForDrops().strength(10.0F, 6.0F).sound(SoundType.WOOD).lightLevel((state) -> state.getValue(BuilderBlock.STATE) == TowerDeviceVariant.BUILDER_ACTIVE ? 4 : 0))); + public static final RegistryObject BUILT_BLOCK = BLOCKS.register("built_block", () -> new TranslucentBuiltBlock(BlockBehaviour.Properties.of(Material.GLASS).strength(50.0F, 2000.0F).sound(SoundType.METAL).noOcclusion().noLootTable())); + public static final RegistryObject ANTIBUILDER = BLOCKS.register("antibuilder", () -> new AntibuilderBlock(BlockBehaviour.Properties.of(Material.WOOD, MaterialColor.SAND).requiresCorrectToolForDrops().strength(10.0F, 6.0F).sound(SoundType.WOOD).lightLevel((state) -> 10))); + public static final RegistryObject ANTIBUILT_BLOCK = BLOCKS.register("antibuilt_block", () -> new Block(BlockBehaviour.Properties.of(Material.GLASS).strength(0.3F, 2000.0F).sound(SoundType.METAL).noLootTable().noOcclusion())); + public static final RegistryObject GHAST_TRAP = BLOCKS.register("ghast_trap", () -> new GhastTrapBlock(BlockBehaviour.Properties.of(Material.WOOD, MaterialColor.SAND).requiresCorrectToolForDrops().strength(10.0F, 6.0F).sound(SoundType.WOOD).lightLevel((state) -> state.getValue(GhastTrapBlock.ACTIVE) ? 15 : 0))); + public static final RegistryObject CARMINITE_REACTOR = BLOCKS.register("carminite_reactor", () -> new CarminiteReactorBlock(BlockBehaviour.Properties.of(Material.WOOD, MaterialColor.SAND).requiresCorrectToolForDrops().strength(10.0F, 6.0F).sound(SoundType.WOOD).lightLevel((state) -> state.getValue(CarminiteReactorBlock.ACTIVE) ? 15 : 0))); + public static final RegistryObject REACTOR_DEBRIS = BLOCKS.register("reactor_debris", () -> new Block(BlockBehaviour.Properties.of(Material.GLASS).strength(0.3F, 2000.0F).sound(SoundType.METAL).noLootTable().noOcclusion())); + public static final RegistryObject FAKE_GOLD = BLOCKS.register("fake_gold", () -> new Block(BlockBehaviour.Properties.of(Material.GLASS).strength(50.0F, 2000.0F).sound(SoundType.METAL).noLootTable())); + public static final RegistryObject FAKE_DIAMOND = BLOCKS.register("fake_diamond", () -> new Block(BlockBehaviour.Properties.of(Material.GLASS).strength(50.0F, 2000.0F).sound(SoundType.METAL).noLootTable())); + public static final RegistryObject EXPERIMENT_115 = BLOCKS.register("experiment_115", Experiment115Block::new); + + //aurora palace + public static final RegistryObject AURORA_BLOCK = BLOCKS.register("aurora_block", () -> new AuroraBrickBlock(BlockBehaviour.Properties.of(Material.ICE_SOLID).strength(10.0F, 6.0F))); + public static final RegistryObject AURORA_PILLAR = BLOCKS.register("aurora_pillar", () -> new RotatedPillarBlock(BlockBehaviour.Properties.of(Material.ICE_SOLID).requiresCorrectToolForDrops().strength(2.0F, 6.0F))); + public static final RegistryObject AURORA_SLAB = BLOCKS.register("aurora_slab", () -> new SlabBlock(BlockBehaviour.Properties.of(Material.ICE_SOLID).requiresCorrectToolForDrops().strength(2.0F, 6.0F))); + public static final RegistryObject AURORALIZED_GLASS = BLOCKS.register("auroralized_glass", () -> new AuroralizedGlassBlock(BlockBehaviour.Properties.copy(Blocks.GLASS).noOcclusion())); + + //highlands/thornlands + public static final RegistryObject BROWN_THORNS = BLOCKS.register("brown_thorns", () -> new ThornsBlock(BlockBehaviour.Properties.of(Material.WOOD, MaterialColor.PODZOL).strength(50.0F, 2000.0F).sound(SoundType.WOOD).noLootTable())); + public static final RegistryObject GREEN_THORNS = BLOCKS.register("green_thorns", () -> new ThornsBlock(BlockBehaviour.Properties.of(Material.WOOD, MaterialColor.PLANT).strength(50.0F, 2000.0F).sound(SoundType.WOOD).noLootTable())); + public static final RegistryObject BURNT_THORNS = BLOCKS.register("burnt_thorns", () -> new BurntThornsBlock(BlockBehaviour.Properties.of(Material.WOOD, MaterialColor.STONE).strength(0.01F, 0.0F).sound(SoundType.SAND).noLootTable())); + public static final RegistryObject THORN_ROSE = BLOCKS.register("thorn_rose", () -> new ThornRoseBlock(BlockBehaviour.Properties.of(Material.PLANT).strength(10.0F, 0.0F).sound(SoundType.GRASS).noCollission())); + public static final RegistryObject THORN_LEAVES = BLOCKS.register("thorn_leaves", () -> new ThornLeavesBlock(BlockBehaviour.Properties.of(Material.LEAVES).strength(0.2F).randomTicks().noOcclusion().sound(SoundType.AZALEA_LEAVES).isSuffocating((state, getter, pos) -> false).isViewBlocking((state, getter, pos) -> false))); + public static final RegistryObject BEANSTALK_LEAVES = BLOCKS.register("beanstalk_leaves", () -> new BeanstalkLeavesBlock(BlockBehaviour.Properties.of(Material.LEAVES).strength(0.2F).randomTicks().noOcclusion().sound(SoundType.AZALEA_LEAVES).isSuffocating((state, getter, pos) -> false).isViewBlocking((state, getter, pos) -> false))); + public static final RegistryObject DEADROCK = BLOCKS.register("deadrock", () -> new Block(BlockBehaviour.Properties.of(Material.STONE).requiresCorrectToolForDrops().strength(100.0F, 6000000.0F).sound(SoundType.STONE))); + public static final RegistryObject CRACKED_DEADROCK = BLOCKS.register("cracked_deadrock", () -> new Block(BlockBehaviour.Properties.of(Material.STONE).requiresCorrectToolForDrops().strength(100.0F, 6000000.0F).sound(SoundType.STONE))); + public static final RegistryObject WEATHERED_DEADROCK = BLOCKS.register("weathered_deadrock", () -> new Block(BlockBehaviour.Properties.of(Material.STONE).requiresCorrectToolForDrops().strength(100.0F, 6000000.0F).sound(SoundType.STONE))); + public static final RegistryObject TROLLSTEINN = BLOCKS.register("trollsteinn", () -> new TrollsteinnBlock(BlockBehaviour.Properties.of(Material.STONE).requiresCorrectToolForDrops().strength(2.0F, 6.0F).sound(SoundType.STONE).randomTicks())); + public static final RegistryObject WISPY_CLOUD = BLOCKS.register("wispy_cloud", () -> new HalfTransparentBlock(BlockBehaviour.Properties.of(Material.TOP_SNOW).strength(0.3F, 0.0F).sound(SoundType.WOOL).noOcclusion())); + public static final RegistryObject FLUFFY_CLOUD = BLOCKS.register("fluffy_cloud", () -> new Block(BlockBehaviour.Properties.of(Material.ICE_SOLID).strength(0.8F, 0.0F).sound(SoundType.WOOL))); + public static final RegistryObject GIANT_COBBLESTONE = BLOCKS.register("giant_cobblestone", () -> new GiantBlock(BlockBehaviour.Properties.copy(Blocks.COBBLESTONE).requiresCorrectToolForDrops().strength(128.0F, 50.0F))); + public static final RegistryObject GIANT_LOG = BLOCKS.register("giant_log", () -> new GiantBlock(BlockBehaviour.Properties.copy(Blocks.OAK_PLANKS).requiresCorrectToolForDrops().strength(128F, 30.0F))); + public static final RegistryObject GIANT_LEAVES = BLOCKS.register("giant_leaves", () -> new GiantLeavesBlock(BlockBehaviour.Properties.copy(Blocks.OAK_LEAVES).requiresCorrectToolForDrops().strength(0.2F * 64.0F, 15.0F).sound(SoundType.AZALEA_LEAVES).noOcclusion())); + public static final RegistryObject GIANT_OBSIDIAN = BLOCKS.register("giant_obsidian", () -> new GiantBlock(BlockBehaviour.Properties.copy(Blocks.OBSIDIAN).isValidSpawn((state, getter, pos, type) -> false).requiresCorrectToolForDrops().strength(50.0F * 64.0F * 64.0F, 2000.0F * 64.0F * 64.0F))); + public static final RegistryObject UBEROUS_SOIL = BLOCKS.register("uberous_soil", () -> new UberousSoilBlock(BlockBehaviour.Properties.of(Material.DIRT).strength(0.6F).sound(SoundType.GRAVEL))); + public static final RegistryObject HUGE_STALK = BLOCKS.register("huge_stalk", () -> new RotatedPillarBlock(BlockBehaviour.Properties.of(Material.WOOD, MaterialColor.PLANT).strength(1.5F, 3.0F).sound(SoundType.STEM))); + public static final RegistryObject BEANSTALK_GROWER = BLOCKS.register("beanstalk_grower", () -> new GrowingBeanstalkBlock(BlockBehaviour.Properties.of(Material.AIR).strength(-1.0F, 6000000.0F).noCollission().noOcclusion().noLootTable())); + public static final RegistryObject HUGE_MUSHGLOOM = BLOCKS.register("huge_mushgloom", () -> new HugeMushroomBlock(BlockBehaviour.Properties.of(Material.WOOD, MaterialColor.COLOR_ORANGE).strength(0.2F).sound(SoundType.WOOD).lightLevel((state) -> 5))); + public static final RegistryObject HUGE_MUSHGLOOM_STEM = BLOCKS.register("huge_mushgloom_stem", () -> new HugeMushroomBlock(BlockBehaviour.Properties.of(Material.WOOD, MaterialColor.COLOR_ORANGE).strength(0.2F).sound(SoundType.WOOD).lightLevel((state) -> 5))); + public static final RegistryObject TROLLVIDR = BLOCKS.register("trollvidr", () -> new TrollRootBlock(BlockBehaviour.Properties.of(Material.PLANT).sound(SoundType.AZALEA_LEAVES).instabreak().noCollission())); + public static final RegistryObject UNRIPE_TROLLBER = BLOCKS.register("unripe_trollber", () -> new UnripeTorchClusterBlock(BlockBehaviour.Properties.of(Material.PLANT).sound(SoundType.AZALEA_LEAVES).instabreak().noCollission().randomTicks())); + public static final RegistryObject TROLLBER = BLOCKS.register("trollber", () -> new TrollRootBlock(BlockBehaviour.Properties.of(Material.PLANT).sound(SoundType.FLOWERING_AZALEA).instabreak().noCollission().lightLevel((state) -> 15))); + + //plateau castle + public static final RegistryObject CASTLE_BRICK = BLOCKS.register("castle_brick", () -> new Block(BlockBehaviour.Properties.of(Material.STONE, MaterialColor.QUARTZ).requiresCorrectToolForDrops().strength(100.0F, 50.0F).sound(SoundType.STONE))); + public static final RegistryObject WORN_CASTLE_BRICK = BLOCKS.register("worn_castle_brick", () -> new Block(BlockBehaviour.Properties.copy(CASTLE_BRICK.get()))); + public static final RegistryObject CRACKED_CASTLE_BRICK = BLOCKS.register("cracked_castle_brick", () -> new Block(BlockBehaviour.Properties.copy(CASTLE_BRICK.get()))); + public static final RegistryObject CASTLE_ROOF_TILE = BLOCKS.register("castle_roof_tile", () -> new Block(BlockBehaviour.Properties.of(Material.STONE, MaterialColor.COLOR_GRAY).requiresCorrectToolForDrops().strength(100.0F, 50.0F).sound(SoundType.STONE))); + public static final RegistryObject MOSSY_CASTLE_BRICK = BLOCKS.register("mossy_castle_brick", () -> new Block(BlockBehaviour.Properties.copy(CASTLE_BRICK.get()))); + public static final RegistryObject THICK_CASTLE_BRICK = BLOCKS.register("thick_castle_brick", () -> new Block(BlockBehaviour.Properties.copy(CASTLE_BRICK.get()))); + public static final RegistryObject ENCASED_CASTLE_BRICK_PILLAR = BLOCKS.register("encased_castle_brick_pillar", () -> new RotatedPillarBlock(BlockBehaviour.Properties.of(Material.STONE, MaterialColor.QUARTZ).requiresCorrectToolForDrops().strength(100.0F, 50.0F).sound(SoundType.STONE))); + public static final RegistryObject ENCASED_CASTLE_BRICK_TILE = BLOCKS.register("encased_castle_brick_tile", () -> new Block(BlockBehaviour.Properties.of(Material.STONE, MaterialColor.QUARTZ).requiresCorrectToolForDrops().strength(100.0F, 50.0F).sound(SoundType.STONE))); + public static final RegistryObject BOLD_CASTLE_BRICK_PILLAR = BLOCKS.register("bold_castle_brick_pillar", () -> new RotatedPillarBlock(BlockBehaviour.Properties.of(Material.STONE, MaterialColor.QUARTZ).requiresCorrectToolForDrops().strength(100.0F, 50.0F).sound(SoundType.STONE))); + public static final RegistryObject BOLD_CASTLE_BRICK_TILE = BLOCKS.register("bold_castle_brick_tile", () -> new Block(BlockBehaviour.Properties.of(Material.STONE, MaterialColor.QUARTZ).requiresCorrectToolForDrops().strength(100.0F, 50.0F).sound(SoundType.STONE))); + public static final RegistryObject CASTLE_BRICK_STAIRS = BLOCKS.register("castle_brick_stairs", () -> new StairBlock(CASTLE_BRICK.get().defaultBlockState(), BlockBehaviour.Properties.copy(CASTLE_BRICK.get()))); + public static final RegistryObject WORN_CASTLE_BRICK_STAIRS = BLOCKS.register("worn_castle_brick_stairs", () -> new StairBlock(WORN_CASTLE_BRICK.get().defaultBlockState(), BlockBehaviour.Properties.copy(WORN_CASTLE_BRICK.get()))); + public static final RegistryObject CRACKED_CASTLE_BRICK_STAIRS = BLOCKS.register("cracked_castle_brick_stairs", () -> new StairBlock(CRACKED_CASTLE_BRICK.get().defaultBlockState(), BlockBehaviour.Properties.copy(CRACKED_CASTLE_BRICK.get()))); + public static final RegistryObject MOSSY_CASTLE_BRICK_STAIRS = BLOCKS.register("mossy_castle_brick_stairs", () -> new StairBlock(MOSSY_CASTLE_BRICK.get().defaultBlockState(), BlockBehaviour.Properties.copy(MOSSY_CASTLE_BRICK.get()))); + public static final RegistryObject ENCASED_CASTLE_BRICK_STAIRS = BLOCKS.register("encased_castle_brick_stairs", () -> new StairBlock(ENCASED_CASTLE_BRICK_PILLAR.get().defaultBlockState(), BlockBehaviour.Properties.copy(ENCASED_CASTLE_BRICK_PILLAR.get()))); + public static final RegistryObject BOLD_CASTLE_BRICK_STAIRS = BLOCKS.register("bold_castle_brick_stairs", () -> new StairBlock(BOLD_CASTLE_BRICK_PILLAR.get().defaultBlockState(), BlockBehaviour.Properties.copy(BOLD_CASTLE_BRICK_PILLAR.get()))); + public static final RegistryObject PINK_CASTLE_RUNE_BRICK = BLOCKS.register("pink_castle_rune_brick", () -> new Block(BlockBehaviour.Properties.of(Material.STONE, MaterialColor.QUARTZ).requiresCorrectToolForDrops().strength(100.0F, 50.0F).sound(SoundType.STONE))); + public static final RegistryObject BLUE_CASTLE_RUNE_BRICK = BLOCKS.register("blue_castle_rune_brick", () -> new Block(BlockBehaviour.Properties.of(Material.STONE, MaterialColor.QUARTZ).requiresCorrectToolForDrops().strength(100.0F, 50.0F).sound(SoundType.STONE))); + public static final RegistryObject YELLOW_CASTLE_RUNE_BRICK = BLOCKS.register("yellow_castle_rune_brick", () -> new Block(BlockBehaviour.Properties.of(Material.STONE, MaterialColor.QUARTZ).requiresCorrectToolForDrops().strength(100.0F, 50.0F).sound(SoundType.STONE))); + public static final RegistryObject VIOLET_CASTLE_RUNE_BRICK = BLOCKS.register("violet_castle_rune_brick", () -> new Block(BlockBehaviour.Properties.of(Material.STONE, MaterialColor.QUARTZ).requiresCorrectToolForDrops().strength(100.0F, 50.0F).sound(SoundType.STONE))); + public static final RegistryObject VIOLET_FORCE_FIELD = BLOCKS.register("violet_force_field", () -> new ForceFieldBlock(BlockBehaviour.Properties.of(Material.BARRIER).strength(-1.0F, 3600000.8F).lightLevel((state) -> 2).noLootTable().noOcclusion())); + public static final RegistryObject PINK_FORCE_FIELD = BLOCKS.register("pink_force_field", () -> new ForceFieldBlock(BlockBehaviour.Properties.of(Material.BARRIER).strength(-1.0F, 3600000.8F).lightLevel((state) -> 2).noLootTable().noOcclusion())); + public static final RegistryObject ORANGE_FORCE_FIELD = BLOCKS.register("orange_force_field", () -> new ForceFieldBlock(BlockBehaviour.Properties.of(Material.BARRIER).strength(-1.0F, 3600000.8F).lightLevel((state) -> 2).noLootTable().noOcclusion())); + public static final RegistryObject GREEN_FORCE_FIELD = BLOCKS.register("green_force_field", () -> new ForceFieldBlock(BlockBehaviour.Properties.of(Material.BARRIER).strength(-1.0F, 3600000.8F).lightLevel((state) -> 2).noLootTable().noOcclusion())); + public static final RegistryObject BLUE_FORCE_FIELD = BLOCKS.register("blue_force_field", () -> new ForceFieldBlock(BlockBehaviour.Properties.of(Material.BARRIER).strength(-1.0F, 3600000.8F).lightLevel((state) -> 2).noLootTable().noOcclusion())); + public static final RegistryObject CINDER_FURNACE = BLOCKS.register("cinder_furnace", CinderFurnaceBlock::new); + public static final RegistryObject CINDER_LOG = BLOCKS.register("cinder_log", () -> new TFLogBlock(BlockBehaviour.Properties.of(Material.WOOD, MaterialColor.COLOR_GRAY).strength(1.0F))); + public static final RegistryObject CINDER_WOOD = BLOCKS.register("cinder_wood", () -> new Block(BlockBehaviour.Properties.of(Material.WOOD, MaterialColor.COLOR_GRAY).strength(1.0F))); + public static final RegistryObject YELLOW_CASTLE_DOOR = BLOCKS.register("yellow_castle_door", () -> new CastleDoorBlock(BlockBehaviour.Properties.of(Material.STONE, (state) -> state.getValue(CastleDoorBlock.VANISHED) ? MaterialColor.NONE : MaterialColor.COLOR_CYAN).requiresCorrectToolForDrops().strength(100.0F, 100.0F))); + public static final RegistryObject VIOLET_CASTLE_DOOR = BLOCKS.register("violet_castle_door", () -> new CastleDoorBlock(BlockBehaviour.Properties.of(Material.STONE, (state) -> state.getValue(CastleDoorBlock.VANISHED) ? MaterialColor.NONE : MaterialColor.COLOR_CYAN).requiresCorrectToolForDrops().strength(100.0F, 100.0F))); + public static final RegistryObject PINK_CASTLE_DOOR = BLOCKS.register("pink_castle_door", () -> new CastleDoorBlock(BlockBehaviour.Properties.of(Material.STONE, (state) -> state.getValue(CastleDoorBlock.VANISHED) ? MaterialColor.NONE : MaterialColor.COLOR_CYAN).requiresCorrectToolForDrops().strength(100.0F, 100.0F))); + public static final RegistryObject BLUE_CASTLE_DOOR = BLOCKS.register("blue_castle_door", () -> new CastleDoorBlock(BlockBehaviour.Properties.of(Material.STONE, (state) -> state.getValue(CastleDoorBlock.VANISHED) ? MaterialColor.NONE : MaterialColor.COLOR_CYAN).requiresCorrectToolForDrops().strength(100.0F, 100.0F))); + + //mini structures + public static final RegistryObject TWILIGHT_PORTAL_MINIATURE_STRUCTURE = BLOCKS.register("twilight_portal_miniature_structure", () -> new Block(BlockBehaviour.Properties.of(Material.BARRIER).requiresCorrectToolForDrops().strength(0.75F).noOcclusion())); + // public static final RegistryObject HEDGE_MAZE_MINIATURE_STRUCTURE = BLOCKS.register("hedge_maze_miniature_structure", () -> new Block(BlockBehaviour.Properties.of(Material.BARRIER).requiresCorrectToolForDrops().strength(0.75F).noOcclusion())); +// public static final RegistryObject HOLLOW_HILL_MINIATURE_STRUCTURE = BLOCKS.register("hollow_hill_miniature_structure", () -> new Block(BlockBehaviour.Properties.of(Material.BARRIER).requiresCorrectToolForDrops().strength(0.75F).noOcclusion())); +// public static final RegistryObject QUEST_GROVE_MINIATURE_STRUCTURE = BLOCKS.register("quest_grove_miniature_structure", () -> new Block(BlockBehaviour.Properties.of(Material.BARRIER).requiresCorrectToolForDrops().strength(0.75F).noOcclusion())); +// public static final RegistryObject MUSHROOM_TOWER_MINIATURE_STRUCTURE = BLOCKS.register("mushroom_tower_miniature_structure", () -> new Block(BlockBehaviour.Properties.of(Material.BARRIER).requiresCorrectToolForDrops().strength(0.75F).noOcclusion())); + public static final RegistryObject NAGA_COURTYARD_MINIATURE_STRUCTURE = BLOCKS.register("naga_courtyard_miniature_structure", () -> new Block(BlockBehaviour.Properties.of(Material.BARRIER).requiresCorrectToolForDrops().strength(0.75F).noOcclusion())); + public static final RegistryObject LICH_TOWER_MINIATURE_STRUCTURE = BLOCKS.register("lich_tower_miniature_structure", () -> new Block(BlockBehaviour.Properties.of(Material.BARRIER).requiresCorrectToolForDrops().strength(0.75F).noOcclusion())); + // public static final RegistryObject MINOTAUR_LABYRINTH_MINIATURE_STRUCTURE = BLOCKS.register("minotaur_labyrinth_miniature_structure", () -> new Block(BlockBehaviour.Properties.of(Material.BARRIER).requiresCorrectToolForDrops().strength(0.75F).noOcclusion())); +// public static final RegistryObject HYDRA_LAIR_MINIATURE_STRUCTURE = BLOCKS.register("hydra_lair_miniature_structure", () -> new Block(BlockBehaviour.Properties.of(Material.BARRIER).requiresCorrectToolForDrops().strength(0.75F).noOcclusion())); +// public static final RegistryObject GOBLIN_STRONGHOLD_MINIATURE_STRUCTURE = BLOCKS.register("goblin_stronghold_miniature_structure", () -> new Block(BlockBehaviour.Properties.of(Material.BARRIER).requiresCorrectToolForDrops().strength(0.75F).noOcclusion())); +// public static final RegistryObject DARK_TOWER_MINIATURE_STRUCTURE = BLOCKS.register("dark_tower_miniature_structure", () -> new Block(BlockBehaviour.Properties.of(Material.BARRIER).requiresCorrectToolForDrops().strength(0.75F).noOcclusion())); +// public static final RegistryObject YETI_CAVE_MINIATURE_STRUCTURE = BLOCKS.register("yeti_cave_miniature_structure", () -> new Block(BlockBehaviour.Properties.of(Material.BARRIER).requiresCorrectToolForDrops().strength(0.75F).noOcclusion())); +// public static final RegistryObject AURORA_PALACE_MINIATURE_STRUCTURE = BLOCKS.register("aurora_palace_miniature_structure", () -> new Block(BlockBehaviour.Properties.of(Material.BARRIER).requiresCorrectToolForDrops().strength(0.75F).noOcclusion())); +// public static final RegistryObject TROLL_CAVE_COTTAGE_MINIATURE_STRUCTURE = BLOCKS.register("troll_cave_cottage_miniature_structure", () -> new Block(BlockBehaviour.Properties.of(Material.BARRIER).requiresCorrectToolForDrops().strength(0.75F).noOcclusion())); +// public static final RegistryObject FINAL_CASTLE_MINIATURE_STRUCTURE = BLOCKS.register("final_castle_miniature_structure", () -> new Block(BlockBehaviour.Properties.of(Material.BARRIER).requiresCorrectToolForDrops().strength(0.75F).noOcclusion())); + public static final RegistryObject KNIGHTMETAL_BLOCK = BLOCKS.register("knightmetal_block", () -> new KnightmetalBlock(BlockBehaviour.Properties.of(Material.METAL).requiresCorrectToolForDrops().strength(5.0F, 40.0F).sound(SoundType.NETHERITE_BLOCK))); + public static final RegistryObject IRONWOOD_BLOCK = BLOCKS.register("ironwood_block", () -> new Block(BlockBehaviour.Properties.of(Material.WOOD, MaterialColor.WOOD).strength(5.0F, 6.0F).sound(SoundType.WOOD))); + public static final RegistryObject FIERY_BLOCK = BLOCKS.register("fiery_block", () -> new FieryBlock(BlockBehaviour.Properties.of(Material.METAL, MaterialColor.TERRACOTTA_BLACK).requiresCorrectToolForDrops().strength(5.0F, 6.0F).sound(SoundType.METAL).noOcclusion().emissiveRendering((state, world, pos) -> true))); + public static final RegistryObject STEELEAF_BLOCK = BLOCKS.register("steeleaf_block", () -> new Block(BlockBehaviour.Properties.of(Material.LEAVES, MaterialColor.PLANT).strength(5.0F, 6.0F).sound(SoundType.MOSS))); + public static final RegistryObject ARCTIC_FUR_BLOCK = BLOCKS.register("arctic_fur_block", () -> new ArcticFurBlock(BlockBehaviour.Properties.of(Material.WOOL, MaterialColor.WOOL).strength(0.8F).sound(SoundType.WOOL))); + public static final RegistryObject CARMINITE_BLOCK = BLOCKS.register("carminite_block", () -> new CarminiteBlock(BlockBehaviour.Properties.of(Material.CLAY, MaterialColor.COLOR_RED).instabreak().sound(SoundType.SLIME_BLOCK))); + + //boss trophies and spawners + public static final RegistryObject NAGA_BOSS_SPAWNER = BLOCKS.register("naga_boss_spawner", () -> new BossSpawnerBlock(BlockBehaviour.Properties.of(Material.STONE).strength(-1.0F, 3600000.8F).noOcclusion().noLootTable(), BossVariant.NAGA)); + public static final RegistryObject LICH_BOSS_SPAWNER = BLOCKS.register("lich_boss_spawner", () -> new BossSpawnerBlock(BlockBehaviour.Properties.of(Material.STONE).strength(-1.0F, 3600000.8F).noOcclusion().noLootTable(), BossVariant.LICH)); + public static final RegistryObject HYDRA_BOSS_SPAWNER = BLOCKS.register("hydra_boss_spawner", () -> new BossSpawnerBlock(BlockBehaviour.Properties.of(Material.STONE).strength(-1.0F, 3600000.8F).noOcclusion().noLootTable(), BossVariant.HYDRA)); + public static final RegistryObject UR_GHAST_BOSS_SPAWNER = BLOCKS.register("ur_ghast_boss_spawner", () -> new BossSpawnerBlock(BlockBehaviour.Properties.of(Material.STONE).strength(-1.0F, 3600000.8F).noOcclusion().noLootTable(), BossVariant.UR_GHAST)); + public static final RegistryObject KNIGHT_PHANTOM_BOSS_SPAWNER = BLOCKS.register("knight_phantom_boss_spawner", () -> new BossSpawnerBlock(BlockBehaviour.Properties.of(Material.STONE).strength(-1.0F, 3600000.8F).noOcclusion().noLootTable(), BossVariant.KNIGHT_PHANTOM)); + public static final RegistryObject SNOW_QUEEN_BOSS_SPAWNER = BLOCKS.register("snow_queen_boss_spawner", () -> new BossSpawnerBlock(BlockBehaviour.Properties.of(Material.STONE).strength(-1.0F, 3600000.8F).noOcclusion().noLootTable(), BossVariant.SNOW_QUEEN)); + public static final RegistryObject MINOSHROOM_BOSS_SPAWNER = BLOCKS.register("minoshroom_boss_spawner", () -> new BossSpawnerBlock(BlockBehaviour.Properties.of(Material.STONE).strength(-1.0F, 3600000.8F).noOcclusion().noLootTable(), BossVariant.MINOSHROOM)); + public static final RegistryObject ALPHA_YETI_BOSS_SPAWNER = BLOCKS.register("alpha_yeti_boss_spawner", () -> new BossSpawnerBlock(BlockBehaviour.Properties.of(Material.STONE).strength(-1.0F, 3600000.8F).noOcclusion().noLootTable(), BossVariant.ALPHA_YETI)); + public static final RegistryObject FINAL_BOSS_BOSS_SPAWNER = BLOCKS.register("final_boss_boss_spawner", () -> new BossSpawnerBlock(BlockBehaviour.Properties.of(Material.STONE).strength(-1.0F, 3600000.8F).noOcclusion().noLootTable(), BossVariant.FINAL_BOSS)); + public static final RegistryObject NAGA_TROPHY = BLOCKS.register("naga_trophy", () -> new TrophyBlock(BossVariant.NAGA, 5)); + public static final RegistryObject LICH_TROPHY = BLOCKS.register("lich_trophy", () -> new TrophyBlock(BossVariant.LICH, 6)); + public static final RegistryObject HYDRA_TROPHY = BLOCKS.register("hydra_trophy", () -> new TrophyBlock(BossVariant.HYDRA, 12)); + public static final RegistryObject UR_GHAST_TROPHY = BLOCKS.register("ur_ghast_trophy", () -> new TrophyBlock(BossVariant.UR_GHAST, 13)); + public static final RegistryObject KNIGHT_PHANTOM_TROPHY = BLOCKS.register("knight_phantom_trophy", () -> new TrophyBlock(BossVariant.KNIGHT_PHANTOM, 8)); + public static final RegistryObject SNOW_QUEEN_TROPHY = BLOCKS.register("snow_queen_trophy", () -> new TrophyBlock(BossVariant.SNOW_QUEEN, 14)); + public static final RegistryObject MINOSHROOM_TROPHY = BLOCKS.register("minoshroom_trophy", () -> new TrophyBlock(BossVariant.MINOSHROOM, 7)); + public static final RegistryObject ALPHA_YETI_TROPHY = BLOCKS.register("alpha_yeti_trophy", () -> new TrophyBlock(BossVariant.ALPHA_YETI, 9)); + public static final RegistryObject QUEST_RAM_TROPHY = BLOCKS.register("quest_ram_trophy", () -> new TrophyBlock(BossVariant.QUEST_RAM, 1)); + public static final RegistryObject NAGA_WALL_TROPHY = BLOCKS.register("naga_wall_trophy", () -> new TrophyWallBlock(BossVariant.NAGA)); + public static final RegistryObject LICH_WALL_TROPHY = BLOCKS.register("lich_wall_trophy", () -> new TrophyWallBlock(BossVariant.LICH)); + public static final RegistryObject HYDRA_WALL_TROPHY = BLOCKS.register("hydra_wall_trophy", () -> new TrophyWallBlock(BossVariant.HYDRA)); + public static final RegistryObject UR_GHAST_WALL_TROPHY = BLOCKS.register("ur_ghast_wall_trophy", () -> new TrophyWallBlock(BossVariant.UR_GHAST)); + public static final RegistryObject KNIGHT_PHANTOM_WALL_TROPHY = BLOCKS.register("knight_phantom_wall_trophy", () -> new TrophyWallBlock(BossVariant.KNIGHT_PHANTOM)); + public static final RegistryObject SNOW_QUEEN_WALL_TROPHY = BLOCKS.register("snow_queen_wall_trophy", () -> new TrophyWallBlock(BossVariant.SNOW_QUEEN)); + public static final RegistryObject MINOSHROOM_WALL_TROPHY = BLOCKS.register("minoshroom_wall_trophy", () -> new TrophyWallBlock(BossVariant.MINOSHROOM)); + public static final RegistryObject ALPHA_YETI_WALL_TROPHY = BLOCKS.register("alpha_yeti_wall_trophy", () -> new TrophyWallBlock(BossVariant.ALPHA_YETI)); + public static final RegistryObject QUEST_RAM_WALL_TROPHY = BLOCKS.register("quest_ram_wall_trophy", () -> new TrophyWallBlock(BossVariant.QUEST_RAM)); + + // TODO Enumify all of the dang tree stuff + + //all tree related stuff + public static final RegistryObject OAK_BANISTER = BLOCKS.register("oak_banister", () -> new BanisterBlock(BlockBehaviour.Properties.copy(Blocks.OAK_PLANKS))); + public static final RegistryObject SPRUCE_BANISTER = BLOCKS.register("spruce_banister", () -> new BanisterBlock(BlockBehaviour.Properties.copy(Blocks.SPRUCE_PLANKS))); + public static final RegistryObject BIRCH_BANISTER = BLOCKS.register("birch_banister", () -> new BanisterBlock(BlockBehaviour.Properties.copy(Blocks.BIRCH_PLANKS))); + public static final RegistryObject JUNGLE_BANISTER = BLOCKS.register("jungle_banister", () -> new BanisterBlock(BlockBehaviour.Properties.copy(Blocks.JUNGLE_PLANKS))); + public static final RegistryObject ACACIA_BANISTER = BLOCKS.register("acacia_banister", () -> new BanisterBlock(BlockBehaviour.Properties.copy(Blocks.ACACIA_PLANKS))); + public static final RegistryObject DARK_OAK_BANISTER = BLOCKS.register("dark_oak_banister", () -> new BanisterBlock(BlockBehaviour.Properties.copy(Blocks.DARK_OAK_PLANKS))); + public static final RegistryObject CRIMSON_BANISTER = BLOCKS.register("crimson_banister", () -> new BanisterBlock(BlockBehaviour.Properties.copy(Blocks.CRIMSON_PLANKS))); + public static final RegistryObject WARPED_BANISTER = BLOCKS.register("warped_banister", () -> new BanisterBlock(BlockBehaviour.Properties.copy(Blocks.WARPED_PLANKS))); + public static final RegistryObject VANGROVE_BANISTER = BLOCKS.register("vangrove_banister", () -> new BanisterBlock(BlockBehaviour.Properties.copy(Blocks.MANGROVE_PLANKS))); + + public static final BlockBehaviour.Properties TWILIGHT_OAK_LOG_PROPS = logProperties(MaterialColor.WOOD, MaterialColor.PODZOL).strength(2.0F).sound(SoundType.WOOD); + public static final BlockBehaviour.Properties CANOPY_LOG_PROPS = logProperties(MaterialColor.PODZOL, MaterialColor.COLOR_BROWN).strength(2.0F).sound(SoundType.WOOD); + public static final BlockBehaviour.Properties MANGROVE_LOG_PROPS = logProperties(MaterialColor.DIRT, MaterialColor.PODZOL).strength(2.0F).sound(SoundType.WOOD); + public static final BlockBehaviour.Properties DARK_LOG_PROPS = logProperties(MaterialColor.COLOR_BROWN, MaterialColor.STONE).strength(2.0F).sound(SoundType.WOOD); + public static final BlockBehaviour.Properties TIME_LOG_PROPS = logProperties(MaterialColor.DIRT, MaterialColor.PODZOL).strength(2.0F).sound(SoundType.WOOD); + public static final BlockBehaviour.Properties TRANSFORMATION_LOG_PROPS = logProperties(MaterialColor.WOOD, MaterialColor.PODZOL).strength(2.0F).sound(SoundType.WOOD); + public static final BlockBehaviour.Properties MINING_LOG_PROPS = logProperties(MaterialColor.SAND, MaterialColor.QUARTZ).strength(2.0F).sound(SoundType.WOOD); + public static final BlockBehaviour.Properties SORTING_LOG_PROPS = logProperties(MaterialColor.PODZOL, MaterialColor.COLOR_BROWN).strength(2.0F).sound(SoundType.WOOD); + + public static final BlockBehaviour.Properties TWILIGHT_OAK_BARK_PROPS = logProperties(MaterialColor.PODZOL).strength(2.0F).sound(SoundType.WOOD); + public static final BlockBehaviour.Properties CANOPY_BARK_PROPS = logProperties(MaterialColor.COLOR_BROWN).strength(2.0F).sound(SoundType.WOOD); + public static final BlockBehaviour.Properties MANGROVE_BARK_PROPS = logProperties(MaterialColor.PODZOL).strength(2.0F).sound(SoundType.WOOD); + public static final BlockBehaviour.Properties DARK_BARK_PROPS = logProperties(MaterialColor.STONE).strength(2.0F).sound(SoundType.WOOD); + public static final BlockBehaviour.Properties TIME_BARK_PROPS = logProperties(MaterialColor.PODZOL).strength(2.0F).sound(SoundType.WOOD); + public static final BlockBehaviour.Properties TRANSFORMATION_BARK_PROPS = logProperties(MaterialColor.PODZOL).strength(2.0F).sound(SoundType.WOOD); + public static final BlockBehaviour.Properties MINING_BARK_PROPS = logProperties(MaterialColor.QUARTZ).strength(2.0F).sound(SoundType.WOOD); + public static final BlockBehaviour.Properties SORTING_BARK_PROPS = logProperties(MaterialColor.COLOR_BROWN).strength(2.0F).sound(SoundType.WOOD); + + public static final BlockBehaviour.Properties TWILIGHT_OAK_STRIPPED_PROPS = logProperties(MaterialColor.WOOD).strength(2.0F).sound(SoundType.WOOD); + public static final BlockBehaviour.Properties CANOPY_STRIPPED_PROPS = logProperties(MaterialColor.PODZOL).strength(2.0F).sound(SoundType.WOOD); + public static final BlockBehaviour.Properties MANGROVE_STRIPPED_PROPS = logProperties(MaterialColor.DIRT).strength(2.0F).sound(SoundType.WOOD); + public static final BlockBehaviour.Properties DARK_STRIPPED_PROPS = logProperties(MaterialColor.COLOR_BROWN).strength(2.0F).sound(SoundType.WOOD); + public static final BlockBehaviour.Properties TIME_STRIPPED_PROPS = logProperties(MaterialColor.DIRT).strength(2.0F).sound(SoundType.WOOD); + public static final BlockBehaviour.Properties TRANSFORMATION_STRIPPED_PROPS = logProperties(MaterialColor.WOOD).strength(2.0F).sound(SoundType.WOOD); + public static final BlockBehaviour.Properties MINING_STRIPPED_PROPS = logProperties(MaterialColor.SAND).strength(2.0F).sound(SoundType.WOOD); + public static final BlockBehaviour.Properties SORTING_STRIPPED_PROPS = logProperties(MaterialColor.PODZOL).strength(2.0F).sound(SoundType.WOOD); + + public static final RegistryObject TWILIGHT_OAK_LOG = BLOCKS.register("twilight_oak_log", () -> new TFLogBlock(TWILIGHT_OAK_LOG_PROPS)); + public static final RegistryObject CANOPY_LOG = BLOCKS.register("canopy_log", () -> new TFLogBlock(CANOPY_LOG_PROPS)); + public static final RegistryObject MANGROVE_LOG = BLOCKS.register("mangrove_log", () -> new TFLogBlock(MANGROVE_LOG_PROPS)); + public static final RegistryObject DARK_LOG = BLOCKS.register("dark_log", () -> new TFLogBlock(DARK_LOG_PROPS)); + public static final RegistryObject TIME_LOG = BLOCKS.register("time_log", () -> new TFLogBlock(TIME_LOG_PROPS)); + public static final RegistryObject TRANSFORMATION_LOG = BLOCKS.register("transformation_log", () -> new TFLogBlock(TRANSFORMATION_LOG_PROPS)); + public static final RegistryObject MINING_LOG = BLOCKS.register("mining_log", () -> new TFLogBlock(MINING_LOG_PROPS)); + public static final RegistryObject SORTING_LOG = BLOCKS.register("sorting_log", () -> new TFLogBlock(SORTING_LOG_PROPS)); + + public static final RegistryObject HOLLOW_TWILIGHT_OAK_LOG_HORIZONTAL = BLOCKS.register("hollow_twilight_oak_log_horizontal", () -> new HollowLogHorizontal(TWILIGHT_OAK_BARK_PROPS)); + public static final RegistryObject HOLLOW_CANOPY_LOG_HORIZONTAL = BLOCKS.register("hollow_canopy_log_horizontal", () -> new HollowLogHorizontal(CANOPY_BARK_PROPS)); + public static final RegistryObject HOLLOW_MANGROVE_LOG_HORIZONTAL = BLOCKS.register("hollow_mangrove_log_horizontal", () -> new HollowLogHorizontal(MANGROVE_BARK_PROPS)); + public static final RegistryObject HOLLOW_DARK_LOG_HORIZONTAL = BLOCKS.register("hollow_dark_log_horizontal", () -> new HollowLogHorizontal(DARK_BARK_PROPS)); + public static final RegistryObject HOLLOW_TIME_LOG_HORIZONTAL = BLOCKS.register("hollow_time_log_horizontal", () -> new HollowLogHorizontal(TIME_BARK_PROPS)); + public static final RegistryObject HOLLOW_TRANSFORMATION_LOG_HORIZONTAL = BLOCKS.register("hollow_transformation_log_horizontal", () -> new HollowLogHorizontal(TRANSFORMATION_BARK_PROPS)); + public static final RegistryObject HOLLOW_MINING_LOG_HORIZONTAL = BLOCKS.register("hollow_mining_log_horizontal", () -> new HollowLogHorizontal(MINING_BARK_PROPS)); + public static final RegistryObject HOLLOW_SORTING_LOG_HORIZONTAL = BLOCKS.register("hollow_sorting_log_horizontal", () -> new HollowLogHorizontal(SORTING_BARK_PROPS)); + + public static final RegistryObject HOLLOW_TWILIGHT_OAK_LOG_VERTICAL = BLOCKS.register("hollow_twilight_oak_log_vertical", () -> new HollowLogVertical(TWILIGHT_OAK_STRIPPED_PROPS, TFBlocks.HOLLOW_TWILIGHT_OAK_LOG_CLIMBABLE)); + public static final RegistryObject HOLLOW_CANOPY_LOG_VERTICAL = BLOCKS.register("hollow_canopy_log_vertical", () -> new HollowLogVertical(CANOPY_STRIPPED_PROPS, TFBlocks.HOLLOW_CANOPY_LOG_CLIMBABLE)); + public static final RegistryObject HOLLOW_MANGROVE_LOG_VERTICAL = BLOCKS.register("hollow_mangrove_log_vertical", () -> new HollowLogVertical(MANGROVE_STRIPPED_PROPS, TFBlocks.HOLLOW_MANGROVE_LOG_CLIMBABLE)); + public static final RegistryObject HOLLOW_DARK_LOG_VERTICAL = BLOCKS.register("hollow_dark_log_vertical", () -> new HollowLogVertical(DARK_STRIPPED_PROPS, TFBlocks.HOLLOW_DARK_LOG_CLIMBABLE)); + public static final RegistryObject HOLLOW_TIME_LOG_VERTICAL = BLOCKS.register("hollow_time_log_vertical", () -> new HollowLogVertical(TIME_STRIPPED_PROPS, TFBlocks.HOLLOW_TIME_LOG_CLIMBABLE)); + public static final RegistryObject HOLLOW_TRANSFORMATION_LOG_VERTICAL = BLOCKS.register("hollow_transformation_log_vertical", () -> new HollowLogVertical(TRANSFORMATION_STRIPPED_PROPS, TFBlocks.HOLLOW_TRANSFORMATION_LOG_CLIMBABLE)); + public static final RegistryObject HOLLOW_MINING_LOG_VERTICAL = BLOCKS.register("hollow_mining_log_vertical", () -> new HollowLogVertical(MINING_STRIPPED_PROPS, TFBlocks.HOLLOW_MINING_LOG_CLIMBABLE)); + public static final RegistryObject HOLLOW_SORTING_LOG_VERTICAL = BLOCKS.register("hollow_sorting_log_vertical", () -> new HollowLogVertical(SORTING_STRIPPED_PROPS, TFBlocks.HOLLOW_SORTING_LOG_CLIMBABLE)); + + public static final RegistryObject HOLLOW_TWILIGHT_OAK_LOG_CLIMBABLE = BLOCKS.register("hollow_twilight_oak_log_climbable", () -> new HollowLogClimbable(TWILIGHT_OAK_STRIPPED_PROPS, TFBlocks.HOLLOW_TWILIGHT_OAK_LOG_VERTICAL)); + public static final RegistryObject HOLLOW_CANOPY_LOG_CLIMBABLE = BLOCKS.register("hollow_canopy_log_climbable", () -> new HollowLogClimbable(CANOPY_STRIPPED_PROPS, TFBlocks.HOLLOW_CANOPY_LOG_VERTICAL)); + public static final RegistryObject HOLLOW_MANGROVE_LOG_CLIMBABLE = BLOCKS.register("hollow_mangrove_log_climbable", () -> new HollowLogClimbable(MANGROVE_STRIPPED_PROPS, TFBlocks.HOLLOW_MANGROVE_LOG_VERTICAL)); + public static final RegistryObject HOLLOW_DARK_LOG_CLIMBABLE = BLOCKS.register("hollow_dark_log_climbable", () -> new HollowLogClimbable(DARK_STRIPPED_PROPS, TFBlocks.HOLLOW_DARK_LOG_VERTICAL)); + public static final RegistryObject HOLLOW_TIME_LOG_CLIMBABLE = BLOCKS.register("hollow_time_log_climbable", () -> new HollowLogClimbable(TIME_STRIPPED_PROPS, TFBlocks.HOLLOW_TIME_LOG_VERTICAL)); + public static final RegistryObject HOLLOW_TRANSFORMATION_LOG_CLIMBABLE = BLOCKS.register("hollow_transformation_log_climbable", () -> new HollowLogClimbable(TRANSFORMATION_STRIPPED_PROPS, TFBlocks.HOLLOW_TRANSFORMATION_LOG_VERTICAL)); + public static final RegistryObject HOLLOW_MINING_LOG_CLIMBABLE = BLOCKS.register("hollow_mining_log_climbable", () -> new HollowLogClimbable(MINING_STRIPPED_PROPS, TFBlocks.HOLLOW_MINING_LOG_VERTICAL)); + public static final RegistryObject HOLLOW_SORTING_LOG_CLIMBABLE = BLOCKS.register("hollow_sorting_log_climbable", () -> new HollowLogClimbable(SORTING_STRIPPED_PROPS, TFBlocks.HOLLOW_SORTING_LOG_VERTICAL)); + + public static final RegistryObject HOLLOW_OAK_LOG_HORIZONTAL = BLOCKS.register("hollow_oak_log_horizontal", () -> new HollowLogHorizontal(BlockBehaviour.Properties.copy(Blocks.OAK_WOOD))); + public static final RegistryObject HOLLOW_SPRUCE_LOG_HORIZONTAL = BLOCKS.register("hollow_spruce_log_horizontal", () -> new HollowLogHorizontal((BlockBehaviour.Properties.copy(Blocks.SPRUCE_WOOD)))); + public static final RegistryObject HOLLOW_BIRCH_LOG_HORIZONTAL = BLOCKS.register("hollow_birch_log_horizontal", () -> new HollowLogHorizontal(BlockBehaviour.Properties.copy(Blocks.BIRCH_WOOD))); + public static final RegistryObject HOLLOW_JUNGLE_LOG_HORIZONTAL = BLOCKS.register("hollow_jungle_log_horizontal", () -> new HollowLogHorizontal(BlockBehaviour.Properties.copy(Blocks.JUNGLE_WOOD))); + public static final RegistryObject HOLLOW_ACACIA_LOG_HORIZONTAL = BLOCKS.register("hollow_acacia_log_horizontal", () -> new HollowLogHorizontal(BlockBehaviour.Properties.copy(Blocks.ACACIA_WOOD))); + public static final RegistryObject HOLLOW_DARK_OAK_LOG_HORIZONTAL = BLOCKS.register("hollow_dark_oak_log_horizontal", () -> new HollowLogHorizontal(BlockBehaviour.Properties.copy(Blocks.DARK_OAK_WOOD))); + public static final RegistryObject HOLLOW_CRIMSON_STEM_HORIZONTAL = BLOCKS.register("hollow_crimson_stem_horizontal", () -> new HollowLogHorizontal(BlockBehaviour.Properties.copy(Blocks.CRIMSON_HYPHAE))); + public static final RegistryObject HOLLOW_WARPED_STEM_HORIZONTAL = BLOCKS.register("hollow_warped_stem_horizontal", () -> new HollowLogHorizontal(BlockBehaviour.Properties.copy(Blocks.WARPED_HYPHAE))); + public static final RegistryObject HOLLOW_VANGROVE_LOG_HORIZONTAL = BLOCKS.register("hollow_vangrove_log_horizontal", () -> new HollowLogHorizontal(BlockBehaviour.Properties.copy(Blocks.MANGROVE_WOOD))); + + public static final RegistryObject HOLLOW_OAK_LOG_VERTICAL = BLOCKS.register("hollow_oak_log_vertical", () -> new HollowLogVertical(BlockBehaviour.Properties.copy(Blocks.STRIPPED_OAK_WOOD), TFBlocks.HOLLOW_OAK_LOG_CLIMBABLE)); + public static final RegistryObject HOLLOW_SPRUCE_LOG_VERTICAL = BLOCKS.register("hollow_spruce_log_vertical", () -> new HollowLogVertical(BlockBehaviour.Properties.copy(Blocks.STRIPPED_SPRUCE_WOOD), TFBlocks.HOLLOW_SPRUCE_LOG_CLIMBABLE)); + public static final RegistryObject HOLLOW_BIRCH_LOG_VERTICAL = BLOCKS.register("hollow_birch_log_vertical", () -> new HollowLogVertical(BlockBehaviour.Properties.copy(Blocks.STRIPPED_BIRCH_WOOD), TFBlocks.HOLLOW_BIRCH_LOG_CLIMBABLE)); + public static final RegistryObject HOLLOW_JUNGLE_LOG_VERTICAL = BLOCKS.register("hollow_jungle_log_vertical", () -> new HollowLogVertical(BlockBehaviour.Properties.copy(Blocks.STRIPPED_JUNGLE_WOOD), TFBlocks.HOLLOW_JUNGLE_LOG_CLIMBABLE)); + public static final RegistryObject HOLLOW_ACACIA_LOG_VERTICAL = BLOCKS.register("hollow_acacia_log_vertical", () -> new HollowLogVertical(BlockBehaviour.Properties.copy(Blocks.STRIPPED_ACACIA_WOOD), TFBlocks.HOLLOW_ACACIA_LOG_CLIMBABLE)); + public static final RegistryObject HOLLOW_DARK_OAK_LOG_VERTICAL = BLOCKS.register("hollow_dark_oak_log_vertical", () -> new HollowLogVertical(BlockBehaviour.Properties.copy(Blocks.STRIPPED_DARK_OAK_WOOD), TFBlocks.HOLLOW_DARK_OAK_LOG_CLIMBABLE)); + public static final RegistryObject HOLLOW_CRIMSON_STEM_VERTICAL = BLOCKS.register("hollow_crimson_stem_vertical", () -> new HollowLogVertical(BlockBehaviour.Properties.copy(Blocks.STRIPPED_CRIMSON_HYPHAE), TFBlocks.HOLLOW_CRIMSON_STEM_CLIMBABLE)); + public static final RegistryObject HOLLOW_WARPED_STEM_VERTICAL = BLOCKS.register("hollow_warped_stem_vertical", () -> new HollowLogVertical(BlockBehaviour.Properties.copy(Blocks.STRIPPED_WARPED_HYPHAE), TFBlocks.HOLLOW_WARPED_STEM_CLIMBABLE)); + // wanna see a funny crash? Use BlockBehaviour.Properties.copy(Blocks.STRIPPED_MANGROVE_WOOD) instead of the BlockBehaviour.Properties.of(...) + // I still legit have no idea why it happens but it does + public static final RegistryObject HOLLOW_VANGROVE_LOG_VERTICAL = BLOCKS.register("hollow_vangrove_log_vertical", () -> new HollowLogVertical(BlockBehaviour.Properties.of(Material.WOOD, MaterialColor.COLOR_RED).strength(2.0F).sound(SoundType.WOOD), TFBlocks.HOLLOW_VANGROVE_LOG_CLIMBABLE)); + + public static final RegistryObject HOLLOW_OAK_LOG_CLIMBABLE = BLOCKS.register("hollow_oak_log_climbable", () -> new HollowLogClimbable(BlockBehaviour.Properties.copy(Blocks.STRIPPED_OAK_WOOD), TFBlocks.HOLLOW_OAK_LOG_VERTICAL)); + public static final RegistryObject HOLLOW_SPRUCE_LOG_CLIMBABLE = BLOCKS.register("hollow_spruce_log_climbable", () -> new HollowLogClimbable(BlockBehaviour.Properties.copy(Blocks.STRIPPED_SPRUCE_WOOD), TFBlocks.HOLLOW_SPRUCE_LOG_VERTICAL)); + public static final RegistryObject HOLLOW_BIRCH_LOG_CLIMBABLE = BLOCKS.register("hollow_birch_log_climbable", () -> new HollowLogClimbable(BlockBehaviour.Properties.copy(Blocks.STRIPPED_BIRCH_WOOD), TFBlocks.HOLLOW_BIRCH_LOG_VERTICAL)); + public static final RegistryObject HOLLOW_JUNGLE_LOG_CLIMBABLE = BLOCKS.register("hollow_jungle_log_climbable", () -> new HollowLogClimbable(BlockBehaviour.Properties.copy(Blocks.STRIPPED_JUNGLE_WOOD), TFBlocks.HOLLOW_JUNGLE_LOG_VERTICAL)); + public static final RegistryObject HOLLOW_ACACIA_LOG_CLIMBABLE = BLOCKS.register("hollow_acacia_log_climbable", () -> new HollowLogClimbable(BlockBehaviour.Properties.copy(Blocks.STRIPPED_ACACIA_WOOD), TFBlocks.HOLLOW_ACACIA_LOG_VERTICAL)); + public static final RegistryObject HOLLOW_DARK_OAK_LOG_CLIMBABLE = BLOCKS.register("hollow_dark_oak_log_climbable", () -> new HollowLogClimbable(BlockBehaviour.Properties.copy(Blocks.STRIPPED_DARK_OAK_WOOD), TFBlocks.HOLLOW_DARK_OAK_LOG_VERTICAL)); + public static final RegistryObject HOLLOW_CRIMSON_STEM_CLIMBABLE = BLOCKS.register("hollow_crimson_stem_climbable", () -> new HollowLogClimbable(BlockBehaviour.Properties.copy(Blocks.STRIPPED_CRIMSON_HYPHAE), TFBlocks.HOLLOW_CRIMSON_STEM_VERTICAL)); + public static final RegistryObject HOLLOW_WARPED_STEM_CLIMBABLE = BLOCKS.register("hollow_warped_stem_climbable", () -> new HollowLogClimbable(BlockBehaviour.Properties.copy(Blocks.STRIPPED_WARPED_HYPHAE), TFBlocks.HOLLOW_WARPED_STEM_VERTICAL)); + public static final RegistryObject HOLLOW_VANGROVE_LOG_CLIMBABLE = BLOCKS.register("hollow_vangrove_log_climbable", () -> new HollowLogClimbable(BlockBehaviour.Properties.of(Material.WOOD, MaterialColor.COLOR_RED).strength(2.0F).sound(SoundType.WOOD), TFBlocks.HOLLOW_VANGROVE_LOG_VERTICAL)); + + public static final RegistryObject STRIPPED_TWILIGHT_OAK_LOG = BLOCKS.register("stripped_twilight_oak_log", () -> new TFLogBlock(TWILIGHT_OAK_STRIPPED_PROPS)); + public static final RegistryObject STRIPPED_CANOPY_LOG = BLOCKS.register("stripped_canopy_log", () -> new TFLogBlock(CANOPY_STRIPPED_PROPS)); + public static final RegistryObject STRIPPED_MANGROVE_LOG = BLOCKS.register("stripped_mangrove_log", () -> new TFLogBlock(MANGROVE_STRIPPED_PROPS)); + public static final RegistryObject STRIPPED_DARK_LOG = BLOCKS.register("stripped_dark_log", () -> new TFLogBlock(DARK_STRIPPED_PROPS)); + public static final RegistryObject STRIPPED_TIME_LOG = BLOCKS.register("stripped_time_log", () -> new TFLogBlock(TIME_STRIPPED_PROPS)); + public static final RegistryObject STRIPPED_TRANSFORMATION_LOG = BLOCKS.register("stripped_transformation_log", () -> new TFLogBlock(TRANSFORMATION_STRIPPED_PROPS)); + public static final RegistryObject STRIPPED_MINING_LOG = BLOCKS.register("stripped_mining_log", () -> new TFLogBlock(MINING_STRIPPED_PROPS)); + public static final RegistryObject STRIPPED_SORTING_LOG = BLOCKS.register("stripped_sorting_log", () -> new TFLogBlock(SORTING_STRIPPED_PROPS)); + + public static final RegistryObject TWILIGHT_OAK_WOOD = BLOCKS.register("twilight_oak_wood", () -> new TFLogBlock(TWILIGHT_OAK_BARK_PROPS)); + public static final RegistryObject CANOPY_WOOD = BLOCKS.register("canopy_wood", () -> new TFLogBlock(CANOPY_BARK_PROPS)); + public static final RegistryObject MANGROVE_WOOD = BLOCKS.register("mangrove_wood", () -> new TFLogBlock(MANGROVE_BARK_PROPS)); + public static final RegistryObject DARK_WOOD = BLOCKS.register("dark_wood", () -> new TFLogBlock(DARK_BARK_PROPS)); + public static final RegistryObject TIME_WOOD = BLOCKS.register("time_wood", () -> new TFLogBlock(TIME_BARK_PROPS)); + public static final RegistryObject TRANSFORMATION_WOOD = BLOCKS.register("transformation_wood", () -> new TFLogBlock(TRANSFORMATION_BARK_PROPS)); + public static final RegistryObject MINING_WOOD = BLOCKS.register("mining_wood", () -> new TFLogBlock(MINING_BARK_PROPS)); + public static final RegistryObject SORTING_WOOD = BLOCKS.register("sorting_wood", () -> new TFLogBlock(SORTING_BARK_PROPS)); + + public static final RegistryObject STRIPPED_TWILIGHT_OAK_WOOD = BLOCKS.register("stripped_twilight_oak_wood", () -> new TFLogBlock(TWILIGHT_OAK_STRIPPED_PROPS)); + public static final RegistryObject STRIPPED_CANOPY_WOOD = BLOCKS.register("stripped_canopy_wood", () -> new TFLogBlock(CANOPY_STRIPPED_PROPS)); + public static final RegistryObject STRIPPED_MANGROVE_WOOD = BLOCKS.register("stripped_mangrove_wood", () -> new TFLogBlock(MANGROVE_STRIPPED_PROPS)); + public static final RegistryObject STRIPPED_DARK_WOOD = BLOCKS.register("stripped_dark_wood", () -> new TFLogBlock(DARK_STRIPPED_PROPS)); + public static final RegistryObject STRIPPED_TIME_WOOD = BLOCKS.register("stripped_time_wood", () -> new TFLogBlock(TIME_STRIPPED_PROPS)); + public static final RegistryObject STRIPPED_TRANSFORMATION_WOOD = BLOCKS.register("stripped_transformation_wood", () -> new TFLogBlock(TRANSFORMATION_STRIPPED_PROPS)); + public static final RegistryObject STRIPPED_MINING_WOOD = BLOCKS.register("stripped_mining_wood", () -> new TFLogBlock(MINING_STRIPPED_PROPS)); + public static final RegistryObject STRIPPED_SORTING_WOOD = BLOCKS.register("stripped_sorting_wood", () -> new TFLogBlock(SORTING_STRIPPED_PROPS)); + + public static final RegistryObject TIME_LOG_CORE = BLOCKS.register("time_log_core", () -> new TimeLogCoreBlock(TIME_LOG_PROPS)); + public static final RegistryObject TRANSFORMATION_LOG_CORE = BLOCKS.register("transformation_log_core", () -> new TransLogCoreBlock(TRANSFORMATION_LOG_PROPS)); + public static final RegistryObject MINING_LOG_CORE = BLOCKS.register("mining_log_core", () -> new MineLogCoreBlock(MINING_LOG_PROPS)); + public static final RegistryObject SORTING_LOG_CORE = BLOCKS.register("sorting_log_core", () -> new SortLogCoreBlock(SORTING_LOG_PROPS)); + + public static final RegistryObject MANGROVE_ROOT = BLOCKS.register("mangrove_root", () -> new Block(BlockBehaviour.Properties.of(Material.WOOD).strength(2.0F).sound(SoundType.WOOD))); + + public static final RegistryObject TWILIGHT_OAK_LEAVES = BLOCKS.register("twilight_oak_leaves", () -> new TFLeavesBlock(BlockBehaviour.Properties.of(Material.LEAVES).strength(0.2F).randomTicks().noOcclusion().sound(SoundType.AZALEA_LEAVES).isSuffocating((state, getter, pos) -> false).isViewBlocking((state, getter, pos) -> false))); + public static final RegistryObject CANOPY_LEAVES = BLOCKS.register("canopy_leaves", () -> new TFLeavesBlock(BlockBehaviour.Properties.of(Material.LEAVES).strength(0.2F).randomTicks().noOcclusion().sound(SoundType.AZALEA_LEAVES).isSuffocating((state, getter, pos) -> false).isViewBlocking((state, getter, pos) -> false))); + public static final RegistryObject MANGROVE_LEAVES = BLOCKS.register("mangrove_leaves", () -> new TFLeavesBlock(BlockBehaviour.Properties.of(Material.LEAVES).strength(0.2F).randomTicks().noOcclusion().sound(SoundType.AZALEA_LEAVES).isSuffocating((state, getter, pos) -> false).isViewBlocking((state, getter, pos) -> false))); + public static final RegistryObject DARK_LEAVES = BLOCKS.register("dark_leaves", () -> new DarkLeavesBlock(BlockBehaviour.Properties.of(Material.LEAVES).strength(2.0F, 10.0F).sound(SoundType.AZALEA_LEAVES).isSuffocating((state, getter, pos) -> false).isViewBlocking((state, getter, pos) -> false))); + public static final RegistryObject HARDENED_DARK_LEAVES = BLOCKS.register("hardened_dark_leaves", () -> new HardenedDarkLeavesBlock(BlockBehaviour.Properties.of(Material.LEAVES).strength(2.0F, 10.0F).sound(SoundType.AZALEA_LEAVES))); + public static final RegistryObject RAINBOW_OAK_LEAVES = BLOCKS.register("rainbow_oak_leaves", () -> new TFLeavesBlock(BlockBehaviour.Properties.of(Material.LEAVES).strength(0.2F).randomTicks().noOcclusion().sound(SoundType.AZALEA_LEAVES).isSuffocating((state, getter, pos) -> false).isViewBlocking((state, getter, pos) -> false))); + public static final RegistryObject TIME_LEAVES = BLOCKS.register("time_leaves", () -> new MagicLeavesBlock(BlockBehaviour.Properties.of(Material.LEAVES).strength(0.2F).sound(SoundType.AZALEA_LEAVES).randomTicks().noOcclusion().isSuffocating((state, getter, pos) -> false).isViewBlocking((state, getter, pos) -> false))); + public static final RegistryObject TRANSFORMATION_LEAVES = BLOCKS.register("transformation_leaves", () -> new MagicLeavesBlock(BlockBehaviour.Properties.of(Material.LEAVES).strength(0.2F).sound(SoundType.AZALEA_LEAVES).randomTicks().noOcclusion().isSuffocating((state, getter, pos) -> false).isViewBlocking((state, getter, pos) -> false))); + public static final RegistryObject MINING_LEAVES = BLOCKS.register("mining_leaves", () -> new MagicLeavesBlock(BlockBehaviour.Properties.of(Material.LEAVES).strength(0.2F).sound(SoundType.AZALEA_LEAVES).randomTicks().noOcclusion().isSuffocating((state, getter, pos) -> false).isViewBlocking((state, getter, pos) -> false))); + public static final RegistryObject SORTING_LEAVES = BLOCKS.register("sorting_leaves", () -> new MagicLeavesBlock(BlockBehaviour.Properties.of(Material.LEAVES).strength(0.2F).sound(SoundType.AZALEA_LEAVES).randomTicks().noOcclusion().isSuffocating((state, getter, pos) -> false).isViewBlocking((state, getter, pos) -> false))); + + public static final RegistryObject TWILIGHT_OAK_SAPLING = BLOCKS.register("twilight_oak_sapling", () -> new SaplingBlock(new SmallOakTreeGrower(), BlockBehaviour.Properties.of(Material.PLANT).instabreak().sound(SoundType.GRASS).noCollission().randomTicks())); + public static final RegistryObject CANOPY_SAPLING = BLOCKS.register("canopy_sapling", () -> new SaplingBlock(new CanopyTreeGrower(), BlockBehaviour.Properties.of(Material.PLANT).instabreak().sound(SoundType.GRASS).noCollission().randomTicks())); + public static final RegistryObject MANGROVE_SAPLING = BLOCKS.register("mangrove_sapling", () -> new MangroveSaplingBlock(new MangroveTreeGrower(), BlockBehaviour.Properties.of(Material.PLANT).instabreak().sound(SoundType.GRASS).noCollission().randomTicks())); + public static final RegistryObject DARKWOOD_SAPLING = BLOCKS.register("darkwood_sapling", () -> new SaplingBlock(new DarkCanopyTreeGrower(), BlockBehaviour.Properties.of(Material.PLANT).instabreak().sound(SoundType.GRASS).noCollission().randomTicks())); + public static final RegistryObject HOLLOW_OAK_SAPLING = BLOCKS.register("hollow_oak_sapling", () -> new SaplingBlock(new HollowTreeGrower(), BlockBehaviour.Properties.of(Material.PLANT).instabreak().sound(SoundType.GRASS).noCollission().randomTicks())); + public static final RegistryObject TIME_SAPLING = BLOCKS.register("time_sapling", () -> new SaplingBlock(new TimeTreeGrower(), BlockBehaviour.Properties.of(Material.PLANT).instabreak().sound(SoundType.GRASS).noCollission().randomTicks())); + public static final RegistryObject TRANSFORMATION_SAPLING = BLOCKS.register("transformation_sapling", () -> new SaplingBlock(new TransformationTreeGrower(), BlockBehaviour.Properties.of(Material.PLANT).instabreak().sound(SoundType.GRASS).noCollission().randomTicks())); + public static final RegistryObject MINING_SAPLING = BLOCKS.register("mining_sapling", () -> new SaplingBlock(new MiningTreeGrower(), BlockBehaviour.Properties.of(Material.PLANT).instabreak().sound(SoundType.GRASS).noCollission().randomTicks())); + public static final RegistryObject SORTING_SAPLING = BLOCKS.register("sorting_sapling", () -> new SaplingBlock(new SortingTreeGrower(), BlockBehaviour.Properties.of(Material.PLANT).instabreak().sound(SoundType.GRASS).noCollission().randomTicks())); + public static final RegistryObject RAINBOW_OAK_SAPLING = BLOCKS.register("rainbow_oak_sapling", () -> new SaplingBlock(new RainboakTreeGrower(), BlockBehaviour.Properties.of(Material.PLANT).instabreak().sound(SoundType.GRASS).noCollission().randomTicks())); + + public static final RegistryObject TWILIGHT_OAK_PLANKS = BLOCKS.register("twilight_oak_planks", () -> new Block(BlockBehaviour.Properties.of(Material.WOOD, MaterialColor.WOOD).strength(2.0F, 3.0F).sound(SoundType.WOOD))); + public static final RegistryObject TWILIGHT_OAK_STAIRS = BLOCKS.register("twilight_oak_stairs", () -> new StairBlock(TWILIGHT_OAK_PLANKS.get().defaultBlockState(), BlockBehaviour.Properties.copy(TWILIGHT_OAK_PLANKS.get()))); + public static final RegistryObject TWILIGHT_OAK_SLAB = BLOCKS.register("twilight_oak_slab", () -> new SlabBlock(BlockBehaviour.Properties.copy(TWILIGHT_OAK_PLANKS.get()))); + public static final RegistryObject TWILIGHT_OAK_BUTTON = BLOCKS.register("twilight_oak_button", () -> new ButtonBlock(BlockBehaviour.Properties.copy(TWILIGHT_OAK_PLANKS.get()).noCollission().strength(0.5F), TFWoodTypes.TWILIGHT_OAK_SET, 30, true)); + public static final RegistryObject TWILIGHT_OAK_FENCE = BLOCKS.register("twilight_oak_fence", () -> new FenceBlock(BlockBehaviour.Properties.copy(TWILIGHT_OAK_PLANKS.get()))); + public static final RegistryObject TWILIGHT_OAK_GATE = BLOCKS.register("twilight_oak_fence_gate", () -> new FenceGateBlock(BlockBehaviour.Properties.copy(TWILIGHT_OAK_PLANKS.get()), TFWoodTypes.TWILIGHT_OAK_WOOD_TYPE)); + public static final RegistryObject TWILIGHT_OAK_PLATE = BLOCKS.register("twilight_oak_pressure_plate", () -> new PressurePlateBlock(PressurePlateBlock.Sensitivity.EVERYTHING, BlockBehaviour.Properties.copy(TWILIGHT_OAK_PLANKS.get()).noCollission().strength(0.5F), TFWoodTypes.TWILIGHT_OAK_SET)); + public static final RegistryObject TWILIGHT_OAK_DOOR = BLOCKS.register("twilight_oak_door", () -> new DoorBlock(BlockBehaviour.Properties.copy(TWILIGHT_OAK_PLANKS.get()).strength(3.0F).sound(SoundType.WOOD).noOcclusion(), TFWoodTypes.TWILIGHT_OAK_SET)); + public static final RegistryObject TWILIGHT_OAK_TRAPDOOR = BLOCKS.register("twilight_oak_trapdoor", () -> new TrapDoorBlock(BlockBehaviour.Properties.copy(TWILIGHT_OAK_PLANKS.get()).strength(3.0F).noOcclusion(), TFWoodTypes.TWILIGHT_OAK_SET)); + public static final RegistryObject TWILIGHT_OAK_SIGN = BLOCKS.register("twilight_oak_sign", () -> new TFSignBlock(BlockBehaviour.Properties.copy(TWILIGHT_OAK_PLANKS.get()).strength(3.0F).noOcclusion().noCollission(), TFWoodTypes.TWILIGHT_OAK_WOOD_TYPE)); + public static final RegistryObject TWILIGHT_WALL_SIGN = BLOCKS.register("twilight_wall_sign", () -> new TFWallSignBlock(BlockBehaviour.Properties.copy(TWILIGHT_OAK_PLANKS.get()).strength(3.0F).noOcclusion().noCollission(), TFWoodTypes.TWILIGHT_OAK_WOOD_TYPE)); + public static final RegistryObject TWILIGHT_OAK_BANISTER = BLOCKS.register("twilight_oak_banister", () -> new BanisterBlock(BlockBehaviour.Properties.copy(TWILIGHT_OAK_PLANKS.get()))); + public static final RegistryObject CANOPY_PLANKS = BLOCKS.register("canopy_planks", () -> new Block(BlockBehaviour.Properties.of(Material.WOOD, MaterialColor.PODZOL).strength(2.0F, 3.0F).sound(SoundType.WOOD))); + public static final RegistryObject CANOPY_STAIRS = BLOCKS.register("canopy_stairs", () -> new StairBlock(CANOPY_PLANKS.get().defaultBlockState(), BlockBehaviour.Properties.copy(CANOPY_PLANKS.get()))); + public static final RegistryObject CANOPY_SLAB = BLOCKS.register("canopy_slab", () -> new SlabBlock(BlockBehaviour.Properties.copy(CANOPY_PLANKS.get()))); + public static final RegistryObject CANOPY_BUTTON = BLOCKS.register("canopy_button", () -> new ButtonBlock(BlockBehaviour.Properties.copy(CANOPY_PLANKS.get()).noCollission().strength(0.5F), TFWoodTypes.CANOPY_WOOD_SET, 30, true)); + public static final RegistryObject CANOPY_FENCE = BLOCKS.register("canopy_fence", () -> new FenceBlock(BlockBehaviour.Properties.copy(CANOPY_PLANKS.get()))); + public static final RegistryObject CANOPY_GATE = BLOCKS.register("canopy_fence_gate", () -> new FenceGateBlock(BlockBehaviour.Properties.copy(CANOPY_PLANKS.get()), TFWoodTypes.CANOPY_WOOD_TYPE)); + public static final RegistryObject CANOPY_PLATE = BLOCKS.register("canopy_pressure_plate", () -> new PressurePlateBlock(PressurePlateBlock.Sensitivity.EVERYTHING, BlockBehaviour.Properties.copy(CANOPY_PLANKS.get()).noCollission().strength(0.5F), TFWoodTypes.CANOPY_WOOD_SET)); + public static final RegistryObject CANOPY_DOOR = BLOCKS.register("canopy_door", () -> new DoorBlock(BlockBehaviour.Properties.copy(CANOPY_PLANKS.get()).strength(3.0F).noOcclusion(), TFWoodTypes.CANOPY_WOOD_SET)); + public static final RegistryObject CANOPY_TRAPDOOR = BLOCKS.register("canopy_trapdoor", () -> new TrapDoorBlock(BlockBehaviour.Properties.of(Material.WOOD, MaterialColor.SAND).strength(3.0F).sound(SoundType.WOOD).noOcclusion(), TFWoodTypes.CANOPY_WOOD_SET)); + public static final RegistryObject CANOPY_SIGN = BLOCKS.register("canopy_sign", () -> new TFSignBlock(BlockBehaviour.Properties.copy(CANOPY_PLANKS.get()).strength(1.0F).noOcclusion().noCollission(), TFWoodTypes.CANOPY_WOOD_TYPE)); + public static final RegistryObject CANOPY_WALL_SIGN = BLOCKS.register("canopy_wall_sign", () -> new TFWallSignBlock(BlockBehaviour.Properties.copy(CANOPY_PLANKS.get()).strength(1.0F).noOcclusion().noCollission(), TFWoodTypes.CANOPY_WOOD_TYPE)); + public static final RegistryObject CANOPY_BOOKSHELF = BLOCKS.register("canopy_bookshelf", () -> new BookshelfBlock(BlockBehaviour.Properties.copy(CANOPY_PLANKS.get()).strength(1.5F))); + public static final RegistryObject CANOPY_BANISTER = BLOCKS.register("canopy_banister", () -> new BanisterBlock(BlockBehaviour.Properties.copy(CANOPY_PLANKS.get()))); + public static final RegistryObject MANGROVE_PLANKS = BLOCKS.register("mangrove_planks", () -> new Block(BlockBehaviour.Properties.of(Material.WOOD, MaterialColor.DIRT).strength(2.0F, 3.0F).sound(SoundType.WOOD))); + public static final RegistryObject MANGROVE_STAIRS = BLOCKS.register("mangrove_stairs", () -> new StairBlock(MANGROVE_PLANKS.get().defaultBlockState(), BlockBehaviour.Properties.copy(MANGROVE_PLANKS.get()))); + public static final RegistryObject MANGROVE_SLAB = BLOCKS.register("mangrove_slab", () -> new SlabBlock(BlockBehaviour.Properties.copy(MANGROVE_PLANKS.get()))); + public static final RegistryObject MANGROVE_BUTTON = BLOCKS.register("mangrove_button", () -> new ButtonBlock(BlockBehaviour.Properties.copy(MANGROVE_PLANKS.get()).noCollission().strength(0.5F), TFWoodTypes.MANGROVE_WOOD_SET, 30, true)); + public static final RegistryObject MANGROVE_FENCE = BLOCKS.register("mangrove_fence", () -> new FenceBlock(BlockBehaviour.Properties.copy(MANGROVE_PLANKS.get()))); + public static final RegistryObject MANGROVE_GATE = BLOCKS.register("mangrove_fence_gate", () -> new FenceGateBlock(BlockBehaviour.Properties.copy(MANGROVE_PLANKS.get()), TFWoodTypes.MANGROVE_WOOD_TYPE)); + public static final RegistryObject MANGROVE_PLATE = BLOCKS.register("mangrove_pressure_plate", () -> new PressurePlateBlock(PressurePlateBlock.Sensitivity.EVERYTHING, BlockBehaviour.Properties.copy(MANGROVE_PLANKS.get()).noCollission().strength(0.5F), TFWoodTypes.MANGROVE_WOOD_SET)); + public static final RegistryObject MANGROVE_DOOR = BLOCKS.register("mangrove_door", () -> new DoorBlock(BlockBehaviour.Properties.copy(MANGROVE_PLANKS.get()).strength(3.0F).noOcclusion(), TFWoodTypes.MANGROVE_WOOD_SET)); + public static final RegistryObject MANGROVE_TRAPDOOR = BLOCKS.register("mangrove_trapdoor", () -> new TrapDoorBlock(BlockBehaviour.Properties.copy(MANGROVE_PLANKS.get()).strength(3.0F).noOcclusion(), TFWoodTypes.MANGROVE_WOOD_SET)); + public static final RegistryObject MANGROVE_SIGN = BLOCKS.register("mangrove_sign", () -> new TFSignBlock(BlockBehaviour.Properties.copy(MANGROVE_PLANKS.get()).strength(1.0F).noOcclusion().noCollission(), TFWoodTypes.MANGROVE_WOOD_TYPE)); + public static final RegistryObject MANGROVE_WALL_SIGN = BLOCKS.register("mangrove_wall_sign", () -> new TFWallSignBlock(BlockBehaviour.Properties.copy(MANGROVE_PLANKS.get()).strength(1.0F).noOcclusion().noCollission(), TFWoodTypes.MANGROVE_WOOD_TYPE)); + public static final RegistryObject MANGROVE_BANISTER = BLOCKS.register("mangrove_banister", () -> new BanisterBlock(BlockBehaviour.Properties.copy(MANGROVE_PLANKS.get()))); + public static final RegistryObject DARK_PLANKS = BLOCKS.register("dark_planks", () -> new Block(BlockBehaviour.Properties.of(Material.WOOD, MaterialColor.COLOR_ORANGE).strength(2.0F, 3.0F).sound(SoundType.WOOD))); + public static final RegistryObject DARK_STAIRS = BLOCKS.register("dark_stairs", () -> new StairBlock(DARK_PLANKS.get().defaultBlockState(), BlockBehaviour.Properties.copy(DARK_PLANKS.get()))); + public static final RegistryObject DARK_SLAB = BLOCKS.register("dark_slab", () -> new SlabBlock(BlockBehaviour.Properties.copy(DARK_PLANKS.get()).sound(SoundType.WOOD))); + public static final RegistryObject DARK_BUTTON = BLOCKS.register("dark_button", () -> new ButtonBlock(BlockBehaviour.Properties.copy(DARK_PLANKS.get()).noCollission().strength(0.5F), TFWoodTypes.DARKWOOD_WOOD_SET, 30, true)); + public static final RegistryObject DARK_FENCE = BLOCKS.register("dark_fence", () -> new FenceBlock(BlockBehaviour.Properties.copy(DARK_PLANKS.get()))); + public static final RegistryObject DARK_GATE = BLOCKS.register("dark_fence_gate", () -> new FenceGateBlock(BlockBehaviour.Properties.copy(DARK_PLANKS.get()), TFWoodTypes.DARKWOOD_WOOD_TYPE)); + public static final RegistryObject DARK_PLATE = BLOCKS.register("dark_pressure_plate", () -> new PressurePlateBlock(PressurePlateBlock.Sensitivity.EVERYTHING, BlockBehaviour.Properties.copy(DARK_PLANKS.get()).noCollission().strength(0.5F), TFWoodTypes.DARKWOOD_WOOD_SET)); + public static final RegistryObject DARK_DOOR = BLOCKS.register("dark_door", () -> new DoorBlock(BlockBehaviour.Properties.copy(DARK_PLANKS.get()).strength(3.0F).sound(SoundType.WOOD).noOcclusion(), TFWoodTypes.DARKWOOD_WOOD_SET)); + public static final RegistryObject DARK_TRAPDOOR = BLOCKS.register("dark_trapdoor", () -> new TrapDoorBlock(BlockBehaviour.Properties.copy(DARK_PLANKS.get()).strength(3.0F).noOcclusion(), TFWoodTypes.DARKWOOD_WOOD_SET)); + public static final RegistryObject DARK_SIGN = BLOCKS.register("dark_sign", () -> new TFSignBlock(BlockBehaviour.Properties.copy(DARK_PLANKS.get()).strength(1.0F).noOcclusion().noCollission(), TFWoodTypes.DARKWOOD_WOOD_TYPE)); + public static final RegistryObject DARK_WALL_SIGN = BLOCKS.register("dark_wall_sign", () -> new TFWallSignBlock(BlockBehaviour.Properties.copy(DARK_PLANKS.get()).strength(1.0F).noOcclusion().noCollission(), TFWoodTypes.DARKWOOD_WOOD_TYPE)); + public static final RegistryObject DARK_BANISTER = BLOCKS.register("dark_banister", () -> new BanisterBlock(BlockBehaviour.Properties.copy(DARK_PLANKS.get()))); + public static final RegistryObject TIME_PLANKS = BLOCKS.register("time_planks", () -> new Block(BlockBehaviour.Properties.of(Material.WOOD, MaterialColor.DIRT).strength(2.0F, 3.0F).sound(SoundType.WOOD))); + public static final RegistryObject TIME_STAIRS = BLOCKS.register("time_stairs", () -> new StairBlock(TIME_PLANKS.get().defaultBlockState(), BlockBehaviour.Properties.copy(TIME_PLANKS.get()))); + public static final RegistryObject TIME_SLAB = BLOCKS.register("time_slab", () -> new SlabBlock(BlockBehaviour.Properties.copy(TIME_PLANKS.get()).sound(SoundType.WOOD))); + public static final RegistryObject TIME_BUTTON = BLOCKS.register("time_button", () -> new ButtonBlock(BlockBehaviour.Properties.copy(TIME_PLANKS.get()).noCollission().strength(0.5F), TFWoodTypes.TIMEWOOD_WOOD_SET, 30, true)); + public static final RegistryObject TIME_FENCE = BLOCKS.register("time_fence", () -> new FenceBlock(BlockBehaviour.Properties.copy(TIME_PLANKS.get()))); + public static final RegistryObject TIME_GATE = BLOCKS.register("time_fence_gate", () -> new FenceGateBlock(BlockBehaviour.Properties.copy(TIME_PLANKS.get()), TFWoodTypes.TIMEWOOD_WOOD_TYPE)); + public static final RegistryObject TIME_PLATE = BLOCKS.register("time_pressure_plate", () -> new PressurePlateBlock(PressurePlateBlock.Sensitivity.EVERYTHING, BlockBehaviour.Properties.copy(TIME_PLANKS.get()).noCollission().strength(0.5F), TFWoodTypes.TIMEWOOD_WOOD_SET)); + public static final RegistryObject TIME_DOOR = BLOCKS.register("time_door", () -> new DoorBlock(BlockBehaviour.Properties.copy(TIME_PLANKS.get()).strength(3.0F).sound(SoundType.WOOD).noOcclusion(), TFWoodTypes.TIMEWOOD_WOOD_SET)); + public static final RegistryObject TIME_TRAPDOOR = BLOCKS.register("time_trapdoor", () -> new TrapDoorBlock(BlockBehaviour.Properties.copy(TIME_PLANKS.get()).strength(3.0F).noOcclusion(), TFWoodTypes.TIMEWOOD_WOOD_SET)); + public static final RegistryObject TIME_SIGN = BLOCKS.register("time_sign", () -> new TFSignBlock(BlockBehaviour.Properties.copy(TIME_PLANKS.get()).strength(1.0F).noOcclusion().noCollission(), TFWoodTypes.TIMEWOOD_WOOD_TYPE)); + public static final RegistryObject TIME_WALL_SIGN = BLOCKS.register("time_wall_sign", () -> new TFWallSignBlock(BlockBehaviour.Properties.copy(TIME_PLANKS.get()).strength(1.0F).noOcclusion().noCollission(), TFWoodTypes.TIMEWOOD_WOOD_TYPE)); + public static final RegistryObject TIME_BANISTER = BLOCKS.register("time_banister", () -> new BanisterBlock(BlockBehaviour.Properties.copy(TIME_PLANKS.get()))); + public static final RegistryObject TRANSFORMATION_PLANKS = BLOCKS.register("transformation_planks", () -> new Block(BlockBehaviour.Properties.of(Material.WOOD, MaterialColor.WOOD).strength(2.0F, 3.0F).sound(SoundType.WOOD))); + public static final RegistryObject TRANSFORMATION_STAIRS = BLOCKS.register("transformation_stairs", () -> new StairBlock(TRANSFORMATION_PLANKS.get().defaultBlockState(), BlockBehaviour.Properties.copy(TRANSFORMATION_PLANKS.get()))); + public static final RegistryObject TRANSFORMATION_SLAB = BLOCKS.register("transformation_slab", () -> new SlabBlock(BlockBehaviour.Properties.copy(TRANSFORMATION_PLANKS.get()))); + public static final RegistryObject TRANSFORMATION_BUTTON = BLOCKS.register("transformation_button", () -> new ButtonBlock(BlockBehaviour.Properties.copy(TRANSFORMATION_PLANKS.get()).noCollission().strength(0.5F), TFWoodTypes.TRANSFORMATION_WOOD_SET, 30, true)); + public static final RegistryObject TRANSFORMATION_FENCE = BLOCKS.register("transformation_fence", () -> new FenceBlock(BlockBehaviour.Properties.copy(TRANSFORMATION_PLANKS.get()))); + public static final RegistryObject TRANSFORMATION_GATE = BLOCKS.register("transformation_fence_gate", () -> new FenceGateBlock(BlockBehaviour.Properties.copy(TRANSFORMATION_PLANKS.get()), TFWoodTypes.TRANSFORMATION_WOOD_TYPE)); + public static final RegistryObject TRANSFORMATION_PLATE = BLOCKS.register("transformation_pressure_plate", () -> new PressurePlateBlock(PressurePlateBlock.Sensitivity.EVERYTHING, BlockBehaviour.Properties.copy(TRANSFORMATION_PLANKS.get()).noCollission().strength(0.5F), TFWoodTypes.TRANSFORMATION_WOOD_SET)); + public static final RegistryObject TRANSFORMATION_DOOR = BLOCKS.register("transformation_door", () -> new DoorBlock(BlockBehaviour.Properties.copy(TRANSFORMATION_PLANKS.get()).strength(3.0F).noOcclusion(), TFWoodTypes.TRANSFORMATION_WOOD_SET)); + public static final RegistryObject TRANSFORMATION_TRAPDOOR = BLOCKS.register("transformation_trapdoor", () -> new TrapDoorBlock(BlockBehaviour.Properties.copy(TRANSFORMATION_PLANKS.get()).strength(3.0F).noOcclusion(), TFWoodTypes.TRANSFORMATION_WOOD_SET)); + public static final RegistryObject TRANSFORMATION_SIGN = BLOCKS.register("transformation_sign", () -> new TFSignBlock(BlockBehaviour.Properties.copy(TRANSFORMATION_PLANKS.get()).strength(1.0F).noOcclusion().noCollission(), TFWoodTypes.TRANSFORMATION_WOOD_TYPE)); + public static final RegistryObject TRANSFORMATION_WALL_SIGN = BLOCKS.register("transformation_wall_sign", () -> new TFWallSignBlock(BlockBehaviour.Properties.copy(TRANSFORMATION_PLANKS.get()).strength(1.0F).noOcclusion().noCollission(), TFWoodTypes.TRANSFORMATION_WOOD_TYPE)); + public static final RegistryObject TRANSFORMATION_BANISTER = BLOCKS.register("transformation_banister", () -> new BanisterBlock(BlockBehaviour.Properties.copy(TRANSFORMATION_PLANKS.get()))); + public static final RegistryObject MINING_PLANKS = BLOCKS.register("mining_planks", () -> new Block(BlockBehaviour.Properties.of(Material.WOOD, MaterialColor.SAND).strength(2.0F, 3.0F).sound(SoundType.WOOD))); + public static final RegistryObject MINING_STAIRS = BLOCKS.register("mining_stairs", () -> new StairBlock(MINING_PLANKS.get().defaultBlockState(), BlockBehaviour.Properties.copy(MINING_PLANKS.get()))); + public static final RegistryObject MINING_SLAB = BLOCKS.register("mining_slab", () -> new SlabBlock(BlockBehaviour.Properties.copy(MINING_PLANKS.get()))); + public static final RegistryObject MINING_BUTTON = BLOCKS.register("mining_button", () -> new ButtonBlock(BlockBehaviour.Properties.copy(MINING_PLANKS.get()).noCollission().strength(0.5F), TFWoodTypes.MINING_WOOD_SET, 30, true)); + public static final RegistryObject MINING_FENCE = BLOCKS.register("mining_fence", () -> new FenceBlock(BlockBehaviour.Properties.copy(MINING_PLANKS.get()))); + public static final RegistryObject MINING_GATE = BLOCKS.register("mining_fence_gate", () -> new FenceGateBlock(BlockBehaviour.Properties.copy(MINING_PLANKS.get()), TFWoodTypes.MINING_WOOD_TYPE)); + public static final RegistryObject MINING_PLATE = BLOCKS.register("mining_pressure_plate", () -> new PressurePlateBlock(PressurePlateBlock.Sensitivity.EVERYTHING, BlockBehaviour.Properties.copy(MINING_PLANKS.get()).noCollission().strength(0.5F), TFWoodTypes.MINING_WOOD_SET)); + public static final RegistryObject MINING_DOOR = BLOCKS.register("mining_door", () -> new DoorBlock(BlockBehaviour.Properties.copy(MINING_PLANKS.get()).strength(3.0F).noOcclusion(), TFWoodTypes.MINING_WOOD_SET)); + public static final RegistryObject MINING_TRAPDOOR = BLOCKS.register("mining_trapdoor", () -> new TrapDoorBlock(BlockBehaviour.Properties.copy(MINING_PLANKS.get()).strength(3.0F).noOcclusion(), TFWoodTypes.MINING_WOOD_SET)); + public static final RegistryObject MINING_SIGN = BLOCKS.register("mining_sign", () -> new TFSignBlock(BlockBehaviour.Properties.copy(MINING_PLANKS.get()).strength(1.0F).noOcclusion().noCollission(), TFWoodTypes.MINING_WOOD_TYPE)); + public static final RegistryObject MINING_WALL_SIGN = BLOCKS.register("mining_wall_sign", () -> new TFWallSignBlock(BlockBehaviour.Properties.copy(MINING_PLANKS.get()).strength(1.0F).noOcclusion().noCollission(), TFWoodTypes.MINING_WOOD_TYPE)); + public static final RegistryObject MINING_BANISTER = BLOCKS.register("mining_banister", () -> new BanisterBlock(BlockBehaviour.Properties.copy(MINING_PLANKS.get()))); + public static final RegistryObject SORTING_PLANKS = BLOCKS.register("sorting_planks", () -> new Block(BlockBehaviour.Properties.of(Material.WOOD, MaterialColor.PODZOL).strength(2.0F, 3.0F).sound(SoundType.WOOD))); + public static final RegistryObject SORTING_STAIRS = BLOCKS.register("sorting_stairs", () -> new StairBlock(SORTING_PLANKS.get().defaultBlockState(), BlockBehaviour.Properties.copy(SORTING_PLANKS.get()))); + public static final RegistryObject SORTING_SLAB = BLOCKS.register("sorting_slab", () -> new SlabBlock(BlockBehaviour.Properties.copy(SORTING_PLANKS.get()))); + public static final RegistryObject SORTING_BUTTON = BLOCKS.register("sorting_button", () -> new ButtonBlock(BlockBehaviour.Properties.copy(SORTING_PLANKS.get()).noCollission().strength(0.5F), TFWoodTypes.SORTING_WOOD_SET, 30, true)); + public static final RegistryObject SORTING_FENCE = BLOCKS.register("sorting_fence", () -> new FenceBlock(BlockBehaviour.Properties.copy(SORTING_PLANKS.get()))); + public static final RegistryObject SORTING_GATE = BLOCKS.register("sorting_fence_gate", () -> new FenceGateBlock(BlockBehaviour.Properties.copy(SORTING_PLANKS.get()), TFWoodTypes.SORTING_WOOD_TYPE)); + public static final RegistryObject SORTING_PLATE = BLOCKS.register("sorting_pressure_plate", () -> new PressurePlateBlock(PressurePlateBlock.Sensitivity.EVERYTHING, BlockBehaviour.Properties.copy(SORTING_PLANKS.get()).noCollission().strength(0.5F), TFWoodTypes.SORTING_WOOD_SET)); + public static final RegistryObject SORTING_DOOR = BLOCKS.register("sorting_door", () -> new DoorBlock(BlockBehaviour.Properties.copy(SORTING_PLANKS.get()).strength(3.0F).noOcclusion(), TFWoodTypes.SORTING_WOOD_SET)); + public static final RegistryObject SORTING_TRAPDOOR = BLOCKS.register("sorting_trapdoor", () -> new TrapDoorBlock(BlockBehaviour.Properties.copy(SORTING_PLANKS.get()).strength(3.0F).noOcclusion(), TFWoodTypes.SORTING_WOOD_SET)); + public static final RegistryObject SORTING_SIGN = BLOCKS.register("sorting_sign", () -> new TFSignBlock(BlockBehaviour.Properties.copy(SORTING_PLANKS.get()).strength(1.0F).noOcclusion().noCollission(), TFWoodTypes.SORTING_WOOD_TYPE)); + public static final RegistryObject SORTING_WALL_SIGN = BLOCKS.register("sorting_wall_sign", () -> new TFWallSignBlock(BlockBehaviour.Properties.copy(SORTING_PLANKS.get()).strength(1.0F).noOcclusion().noCollission(), TFWoodTypes.SORTING_WOOD_TYPE)); + public static final RegistryObject SORTING_BANISTER = BLOCKS.register("sorting_banister", () -> new BanisterBlock(BlockBehaviour.Properties.copy(SORTING_PLANKS.get()))); + + public static final RegistryObject TWILIGHT_OAK_CHEST = BLOCKS.register("twilight_oak_chest", () -> new TFChestBlock(BlockBehaviour.Properties.copy(TWILIGHT_OAK_PLANKS.get()).strength(2.5F))); + public static final RegistryObject CANOPY_CHEST = BLOCKS.register("canopy_chest", () -> new TFChestBlock(BlockBehaviour.Properties.copy(CANOPY_PLANKS.get()).strength(2.5F))); + public static final RegistryObject MANGROVE_CHEST = BLOCKS.register("mangrove_chest", () -> new TFChestBlock(BlockBehaviour.Properties.copy(MANGROVE_PLANKS.get()).strength(2.5F))); + public static final RegistryObject DARK_CHEST = BLOCKS.register("dark_chest", () -> new TFChestBlock(BlockBehaviour.Properties.copy(DARK_PLANKS.get()).strength(2.5F))); + public static final RegistryObject TIME_CHEST = BLOCKS.register("time_chest", () -> new TFChestBlock(BlockBehaviour.Properties.copy(TIME_PLANKS.get()).strength(2.5F))); + public static final RegistryObject TRANSFORMATION_CHEST = BLOCKS.register("transformation_chest", () -> new TFChestBlock(BlockBehaviour.Properties.copy(TRANSFORMATION_PLANKS.get()).strength(2.5F))); + public static final RegistryObject MINING_CHEST = BLOCKS.register("mining_chest", () -> new TFChestBlock(BlockBehaviour.Properties.copy(MINING_PLANKS.get()).strength(2.5F))); + public static final RegistryObject SORTING_CHEST = BLOCKS.register("sorting_chest", () -> new TFChestBlock(BlockBehaviour.Properties.copy(SORTING_PLANKS.get()).strength(2.5F))); + + //Flower Pots + public static final RegistryObject POTTED_TWILIGHT_OAK_SAPLING = BLOCKS.register("potted_twilight_oak_sapling", () -> new FlowerPotBlock(() -> (FlowerPotBlock) Blocks.FLOWER_POT, TWILIGHT_OAK_SAPLING, BlockBehaviour.Properties.copy(Blocks.FLOWER_POT))); + public static final RegistryObject POTTED_CANOPY_SAPLING = BLOCKS.register("potted_canopy_sapling", () -> new FlowerPotBlock(() -> (FlowerPotBlock) Blocks.FLOWER_POT, CANOPY_SAPLING, BlockBehaviour.Properties.copy(Blocks.FLOWER_POT))); + public static final RegistryObject POTTED_MANGROVE_SAPLING = BLOCKS.register("potted_mangrove_sapling", () -> new FlowerPotBlock(() -> (FlowerPotBlock) Blocks.FLOWER_POT, MANGROVE_SAPLING, BlockBehaviour.Properties.copy(Blocks.FLOWER_POT))); + public static final RegistryObject POTTED_DARKWOOD_SAPLING = BLOCKS.register("potted_darkwood_sapling", () -> new FlowerPotBlock(() -> (FlowerPotBlock) Blocks.FLOWER_POT, DARKWOOD_SAPLING, BlockBehaviour.Properties.copy(Blocks.FLOWER_POT))); + public static final RegistryObject POTTED_HOLLOW_OAK_SAPLING = BLOCKS.register("potted_hollow_oak_sapling", () -> new FlowerPotBlock(() -> (FlowerPotBlock) Blocks.FLOWER_POT, HOLLOW_OAK_SAPLING, BlockBehaviour.Properties.copy(Blocks.FLOWER_POT))); + public static final RegistryObject POTTED_RAINBOW_OAK_SAPLING = BLOCKS.register("potted_rainbow_oak_sapling", () -> new FlowerPotBlock(() -> (FlowerPotBlock) Blocks.FLOWER_POT, RAINBOW_OAK_SAPLING, BlockBehaviour.Properties.copy(Blocks.FLOWER_POT))); + public static final RegistryObject POTTED_TIME_SAPLING = BLOCKS.register("potted_time_sapling", () -> new FlowerPotBlock(() -> (FlowerPotBlock) Blocks.FLOWER_POT, TIME_SAPLING, BlockBehaviour.Properties.copy(Blocks.FLOWER_POT))); + public static final RegistryObject POTTED_TRANSFORMATION_SAPLING = BLOCKS.register("potted_transformation_sapling", () -> new FlowerPotBlock(() -> (FlowerPotBlock) Blocks.FLOWER_POT, TRANSFORMATION_SAPLING, BlockBehaviour.Properties.copy(Blocks.FLOWER_POT))); + public static final RegistryObject POTTED_MINING_SAPLING = BLOCKS.register("potted_mining_sapling", () -> new FlowerPotBlock(() -> (FlowerPotBlock) Blocks.FLOWER_POT, MINING_SAPLING, BlockBehaviour.Properties.copy(Blocks.FLOWER_POT))); + public static final RegistryObject POTTED_SORTING_SAPLING = BLOCKS.register("potted_sorting_sapling", () -> new FlowerPotBlock(() -> (FlowerPotBlock) Blocks.FLOWER_POT, SORTING_SAPLING, BlockBehaviour.Properties.copy(Blocks.FLOWER_POT))); + public static final RegistryObject POTTED_MAYAPPLE = BLOCKS.register("potted_mayapple", () -> new FlowerPotBlock(() -> (FlowerPotBlock) Blocks.FLOWER_POT, MAYAPPLE, BlockBehaviour.Properties.copy(Blocks.FLOWER_POT))); + public static final RegistryObject POTTED_FIDDLEHEAD = BLOCKS.register("potted_fiddlehead", () -> new FlowerPotBlock(() -> (FlowerPotBlock) Blocks.FLOWER_POT, FIDDLEHEAD, BlockBehaviour.Properties.copy(Blocks.FLOWER_POT))); + public static final RegistryObject POTTED_MUSHGLOOM = BLOCKS.register("potted_mushgloom", () -> new FlowerPotBlock(() -> (FlowerPotBlock) Blocks.FLOWER_POT, MUSHGLOOM, BlockBehaviour.Properties.copy(Blocks.FLOWER_POT))); + public static final RegistryObject POTTED_THORN = BLOCKS.register("potted_thorn", () -> new SpecialFlowerPotBlock(() -> (FlowerPotBlock) Blocks.FLOWER_POT, BROWN_THORNS, BlockBehaviour.Properties.copy(Blocks.FLOWER_POT))); + public static final RegistryObject POTTED_GREEN_THORN = BLOCKS.register("potted_green_thorn", () -> new SpecialFlowerPotBlock(() -> (FlowerPotBlock) Blocks.FLOWER_POT, GREEN_THORNS, BlockBehaviour.Properties.copy(Blocks.FLOWER_POT))); + public static final RegistryObject POTTED_DEAD_THORN = BLOCKS.register("potted_dead_thorn", () -> new SpecialFlowerPotBlock(() -> (FlowerPotBlock) Blocks.FLOWER_POT, BURNT_THORNS, BlockBehaviour.Properties.copy(Blocks.FLOWER_POT))); + + + @SubscribeEvent + public static void registerItemblocks(RegisterEvent evt) { + if (Objects.equals(evt.getForgeRegistry(), ForgeRegistries.ITEMS)) { + TFBlockItems.registerBlockItems(evt); + } + } + + private static BlockBehaviour.Properties logProperties(MaterialColor color) { + return BlockBehaviour.Properties.of(Material.WOOD, color); + } + + private static BlockBehaviour.Properties logProperties(MaterialColor top, MaterialColor side) { + return BlockBehaviour.Properties.of(Material.WOOD, (state) -> state.getValue(RotatedPillarBlock.AXIS) == Direction.Axis.Y ? top : side); + } + + public static void tfCompostables() { + ComposterBlock.add(0.1F, FALLEN_LEAVES.get()); + ComposterBlock.add(0.3F, CANOPY_LEAVES.get()); + ComposterBlock.add(0.3F, CLOVER_PATCH.get()); + ComposterBlock.add(0.3F, DARK_LEAVES.get()); + ComposterBlock.add(0.3F, FIDDLEHEAD.get()); + ComposterBlock.add(0.3F, HEDGE.get()); + ComposterBlock.add(0.3F, MANGROVE_LEAVES.get()); + ComposterBlock.add(0.3F, MAYAPPLE.get()); + ComposterBlock.add(0.3F, MINING_LEAVES.get()); + ComposterBlock.add(0.3F, TWILIGHT_OAK_LEAVES.get()); + ComposterBlock.add(0.3F, RAINBOW_OAK_LEAVES.get()); + ComposterBlock.add(0.3F, ROOT_STRAND.get()); + ComposterBlock.add(0.3F, SORTING_LEAVES.get()); + ComposterBlock.add(0.3F, THORN_LEAVES.get()); + ComposterBlock.add(0.3F, TIME_LEAVES.get()); + ComposterBlock.add(0.3F, TRANSFORMATION_LEAVES.get()); + ComposterBlock.add(0.3F, TWILIGHT_OAK_SAPLING.get()); + ComposterBlock.add(0.3F, CANOPY_SAPLING.get()); + ComposterBlock.add(0.3F, MANGROVE_SAPLING.get()); + ComposterBlock.add(0.3F, DARKWOOD_SAPLING.get()); + ComposterBlock.add(0.3F, RAINBOW_OAK_SAPLING.get()); + ComposterBlock.add(0.5F, BEANSTALK_LEAVES.get()); + ComposterBlock.add(0.5F, MOSS_PATCH.get()); + ComposterBlock.add(0.5F, ROOT_BLOCK.get()); + ComposterBlock.add(0.5F, THORN_ROSE.get()); + ComposterBlock.add(0.5F, TROLLVIDR.get()); + ComposterBlock.add(0.5F, HOLLOW_OAK_SAPLING.get()); + ComposterBlock.add(0.5F, TIME_SAPLING.get()); + ComposterBlock.add(0.5F, TRANSFORMATION_SAPLING.get()); + ComposterBlock.add(0.5F, MINING_SAPLING.get()); + ComposterBlock.add(0.5F, SORTING_SAPLING.get()); + ComposterBlock.add(0.5F, TORCHBERRY_PLANT.get()); + ComposterBlock.add(0.65F, HUGE_MUSHGLOOM_STEM.get()); + ComposterBlock.add(0.65F, HUGE_WATER_LILY.get()); + ComposterBlock.add(0.65F, LIVEROOT_BLOCK.get()); + ComposterBlock.add(0.65F, MUSHGLOOM.get()); + ComposterBlock.add(0.65F, UBEROUS_SOIL.get()); + ComposterBlock.add(0.65F, HUGE_STALK.get()); + ComposterBlock.add(0.65F, UNRIPE_TROLLBER.get()); + ComposterBlock.add(0.65F, TROLLBER.get()); + ComposterBlock.add(0.85F, HUGE_LILY_PAD.get()); + ComposterBlock.add(0.85F, HUGE_MUSHGLOOM.get()); + + //eh, we'll do items here too + ComposterBlock.add(0.3F, TFItems.TORCHBERRIES.get()); + ComposterBlock.add(0.5F, TFItems.LIVEROOT.get()); + ComposterBlock.add(0.65F, TFItems.MAZE_WAFER.get()); + ComposterBlock.add(0.85F, TFItems.EXPERIMENT_115.get()); + ComposterBlock.add(0.85F, TFItems.MAGIC_BEANS.get()); + } + + public static void tfBurnables() { + FireBlock fireblock = (FireBlock) Blocks.FIRE; + fireblock.setFlammable(ROOT_BLOCK.get(), 5, 20); + fireblock.setFlammable(ARCTIC_FUR_BLOCK.get(), 20, 20); + fireblock.setFlammable(LIVEROOT_BLOCK.get(), 5, 20); + fireblock.setFlammable(EMPTY_CANOPY_BOOKSHELF.get(), 30, 20); + fireblock.setFlammable(DEATH_TOME_SPAWNER.get(), 30, 20); + fireblock.setFlammable(TWILIGHT_OAK_WOOD.get(), 5, 5); + fireblock.setFlammable(TWILIGHT_OAK_PLANKS.get(), 5, 20); + fireblock.setFlammable(TWILIGHT_OAK_SLAB.get(), 5, 20); + fireblock.setFlammable(TWILIGHT_OAK_STAIRS.get(), 5, 20); + fireblock.setFlammable(TWILIGHT_OAK_FENCE.get(), 5, 20); + fireblock.setFlammable(TWILIGHT_OAK_GATE.get(), 5, 20); + fireblock.setFlammable(CANOPY_WOOD.get(), 5, 5); + fireblock.setFlammable(CANOPY_PLANKS.get(), 5, 20); + fireblock.setFlammable(CANOPY_SLAB.get(), 5, 20); + fireblock.setFlammable(CANOPY_STAIRS.get(), 5, 20); + fireblock.setFlammable(CANOPY_FENCE.get(), 5, 20); + fireblock.setFlammable(CANOPY_GATE.get(), 5, 20); + fireblock.setFlammable(CANOPY_BOOKSHELF.get(), 5, 20); + fireblock.setFlammable(MANGROVE_WOOD.get(), 5, 5); + fireblock.setFlammable(MANGROVE_PLANKS.get(), 5, 20); + fireblock.setFlammable(MANGROVE_SLAB.get(), 5, 20); + fireblock.setFlammable(MANGROVE_STAIRS.get(), 5, 20); + fireblock.setFlammable(MANGROVE_FENCE.get(), 5, 20); + fireblock.setFlammable(MANGROVE_GATE.get(), 5, 20); + fireblock.setFlammable(MANGROVE_ROOT.get(), 5, 20); + fireblock.setFlammable(DARK_WOOD.get(), 5, 5); + fireblock.setFlammable(DARK_PLANKS.get(), 5, 20); + fireblock.setFlammable(DARK_SLAB.get(), 5, 20); + fireblock.setFlammable(DARK_STAIRS.get(), 5, 20); + fireblock.setFlammable(DARK_FENCE.get(), 5, 20); + fireblock.setFlammable(DARK_GATE.get(), 5, 20); + fireblock.setFlammable(TIME_WOOD.get(), 5, 5); + fireblock.setFlammable(TIME_PLANKS.get(), 5, 20); + fireblock.setFlammable(TIME_SLAB.get(), 5, 20); + fireblock.setFlammable(TIME_STAIRS.get(), 5, 20); + fireblock.setFlammable(TIME_FENCE.get(), 5, 20); + fireblock.setFlammable(TIME_GATE.get(), 5, 20); + fireblock.setFlammable(TRANSFORMATION_WOOD.get(), 5, 5); + fireblock.setFlammable(TRANSFORMATION_PLANKS.get(), 5, 20); + fireblock.setFlammable(TRANSFORMATION_SLAB.get(), 5, 20); + fireblock.setFlammable(TRANSFORMATION_STAIRS.get(), 5, 20); + fireblock.setFlammable(TRANSFORMATION_FENCE.get(), 5, 20); + fireblock.setFlammable(TRANSFORMATION_GATE.get(), 5, 20); + fireblock.setFlammable(MINING_WOOD.get(), 5, 5); + fireblock.setFlammable(MINING_PLANKS.get(), 5, 20); + fireblock.setFlammable(MINING_SLAB.get(), 5, 20); + fireblock.setFlammable(MINING_STAIRS.get(), 5, 20); + fireblock.setFlammable(MINING_FENCE.get(), 5, 20); + fireblock.setFlammable(MINING_GATE.get(), 5, 20); + fireblock.setFlammable(SORTING_WOOD.get(), 5, 5); + fireblock.setFlammable(SORTING_PLANKS.get(), 5, 20); + fireblock.setFlammable(SORTING_SLAB.get(), 5, 20); + fireblock.setFlammable(SORTING_STAIRS.get(), 5, 20); + fireblock.setFlammable(SORTING_FENCE.get(), 5, 20); + fireblock.setFlammable(SORTING_GATE.get(), 5, 20); + } + + public static void tfPots() { + FlowerPotBlock pot = (FlowerPotBlock) Blocks.FLOWER_POT; + + pot.addPlant(TWILIGHT_OAK_SAPLING.getId(), POTTED_TWILIGHT_OAK_SAPLING); + pot.addPlant(CANOPY_SAPLING.getId(), POTTED_CANOPY_SAPLING); + pot.addPlant(MANGROVE_SAPLING.getId(), POTTED_MANGROVE_SAPLING); + pot.addPlant(DARKWOOD_SAPLING.getId(), POTTED_DARKWOOD_SAPLING); + pot.addPlant(HOLLOW_OAK_SAPLING.getId(), POTTED_HOLLOW_OAK_SAPLING); + pot.addPlant(RAINBOW_OAK_SAPLING.getId(), POTTED_RAINBOW_OAK_SAPLING); + pot.addPlant(TIME_SAPLING.getId(), POTTED_TIME_SAPLING); + pot.addPlant(TRANSFORMATION_SAPLING.getId(), POTTED_TRANSFORMATION_SAPLING); + pot.addPlant(MINING_SAPLING.getId(), POTTED_MINING_SAPLING); + pot.addPlant(SORTING_SAPLING.getId(), POTTED_SORTING_SAPLING); + pot.addPlant(MAYAPPLE.getId(), POTTED_MAYAPPLE); + pot.addPlant(FIDDLEHEAD.getId(), POTTED_FIDDLEHEAD); + pot.addPlant(MUSHGLOOM.getId(), POTTED_MUSHGLOOM); + pot.addPlant(BROWN_THORNS.getId(), POTTED_THORN); + pot.addPlant(GREEN_THORNS.getId(), POTTED_GREEN_THORN); + pot.addPlant(BURNT_THORNS.getId(), POTTED_DEAD_THORN); + } +} diff --git a/src/main/java/twilightforest/init/TFCaveCarvers.java b/src/main/java/twilightforest/init/TFCaveCarvers.java new file mode 100644 index 0000000000..d6e6228d93 --- /dev/null +++ b/src/main/java/twilightforest/init/TFCaveCarvers.java @@ -0,0 +1,51 @@ +package twilightforest.init; + +import net.minecraft.core.HolderGetter; +import net.minecraft.core.registries.Registries; +import net.minecraft.data.worldgen.BootstapContext; +import net.minecraft.resources.ResourceKey; +import net.minecraft.tags.BlockTags; +import net.minecraft.util.valueproviders.ConstantFloat; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.levelgen.VerticalAnchor; +import net.minecraft.world.level.levelgen.carver.CaveCarverConfiguration; +import net.minecraft.world.level.levelgen.carver.ConfiguredWorldCarver; +import net.minecraft.world.level.levelgen.heightproviders.BiasedToBottomHeight; +import net.minecraft.world.level.levelgen.heightproviders.UniformHeight; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.registries.RegisterEvent; +import twilightforest.TwilightForestMod; +import twilightforest.world.components.TFCavesCarver; + +import java.util.Objects; + +//this was all put into 1 class because it seems like a waste to have it in 2 +@Mod.EventBusSubscriber(modid = TwilightForestMod.ID, bus = Mod.EventBusSubscriber.Bus.MOD) +public class TFCaveCarvers { + public static final TFCavesCarver TFCAVES = new TFCavesCarver(CaveCarverConfiguration.CODEC, false); + public static final TFCavesCarver HIGHLANDCAVES = new TFCavesCarver(CaveCarverConfiguration.CODEC, true); + + //this one has to stay, configured versions dont work otherwise + @SubscribeEvent + public static void register(RegisterEvent evt) { + if (Objects.equals(evt.getForgeRegistry(), ForgeRegistries.WORLD_CARVERS)) { + evt.register(ForgeRegistries.Keys.WORLD_CARVERS, helper -> helper.register(TwilightForestMod.prefix("tf_caves"), TFCAVES)); + evt.register(ForgeRegistries.Keys.WORLD_CARVERS, helper -> helper.register(TwilightForestMod.prefix("highland_caves"), HIGHLANDCAVES)); + } + } + + public static final ResourceKey> TFCAVES_CONFIGURED = registerKey("tf_caves"); + public static final ResourceKey> HIGHLANDCAVES_CONFIGURED = registerKey("highland_caves"); + + private static ResourceKey> registerKey(String name) { + return ResourceKey.create(Registries.CONFIGURED_CARVER, TwilightForestMod.prefix(name)); + } + + public static void bootstrap(BootstapContext> context) { + HolderGetter blocks = context.lookup(Registries.BLOCK); + context.register(TFCAVES_CONFIGURED, TFCAVES.configured(new CaveCarverConfiguration(0.1F, UniformHeight.of(VerticalAnchor.aboveBottom(5), VerticalAnchor.absolute(-8)), ConstantFloat.of(0.6F), VerticalAnchor.bottom(), blocks.getOrThrow(BlockTags.OVERWORLD_CARVER_REPLACEABLES), ConstantFloat.of(1.0F), ConstantFloat.of(1.0F), ConstantFloat.of(-0.7F)))); + context.register(HIGHLANDCAVES_CONFIGURED, HIGHLANDCAVES.configured(new CaveCarverConfiguration(0.1F, BiasedToBottomHeight.of(VerticalAnchor.aboveBottom(5), VerticalAnchor.absolute(65), 48), ConstantFloat.of(0.75F), VerticalAnchor.bottom(), blocks.getOrThrow(BlockTags.OVERWORLD_CARVER_REPLACEABLES), ConstantFloat.of(1.0F), ConstantFloat.of(1.0F), ConstantFloat.of(-0.7F)))); + } +} diff --git a/src/main/java/twilightforest/init/TFConfiguredFeatures.java b/src/main/java/twilightforest/init/TFConfiguredFeatures.java new file mode 100644 index 0000000000..72a3204337 --- /dev/null +++ b/src/main/java/twilightforest/init/TFConfiguredFeatures.java @@ -0,0 +1,364 @@ +package twilightforest.init; + +import com.google.common.collect.ImmutableList; +import net.minecraft.core.HolderGetter; +import net.minecraft.core.registries.Registries; +import net.minecraft.data.worldgen.BootstapContext; +import net.minecraft.data.worldgen.features.FeatureUtils; +import net.minecraft.data.worldgen.features.TreeFeatures; +import net.minecraft.data.worldgen.placement.PlacementUtils; +import net.minecraft.resources.ResourceKey; +import net.minecraft.sounds.Music; +import net.minecraft.tags.BlockTags; +import net.minecraft.util.valueproviders.ConstantInt; +import net.minecraft.util.valueproviders.UniformInt; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.HugeMushroomBlock; +import net.minecraft.world.level.levelgen.blockpredicates.BlockPredicate; +import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; +import net.minecraft.world.level.levelgen.feature.Feature; +import net.minecraft.world.level.levelgen.feature.LakeFeature; +import net.minecraft.world.level.levelgen.feature.WeightedPlacedFeature; +import net.minecraft.world.level.levelgen.feature.configurations.*; +import net.minecraft.world.level.levelgen.feature.featuresize.TwoLayersFeatureSize; +import net.minecraft.world.level.levelgen.feature.foliageplacers.BlobFoliagePlacer; +import net.minecraft.world.level.levelgen.feature.foliageplacers.SpruceFoliagePlacer; +import net.minecraft.world.level.levelgen.feature.stateproviders.BlockStateProvider; +import net.minecraft.world.level.levelgen.feature.stateproviders.NoiseProvider; +import net.minecraft.world.level.levelgen.feature.stateproviders.RuleBasedBlockStateProvider; +import net.minecraft.world.level.levelgen.feature.trunkplacers.StraightTrunkPlacer; +import net.minecraft.world.level.levelgen.structure.templatesystem.*; +import net.minecraft.world.level.levelgen.synth.NormalNoise; +import twilightforest.TwilightForestMod; +import twilightforest.block.TorchberryPlantBlock; +import twilightforest.data.tags.CustomTagGenerator; +import twilightforest.init.custom.WoodPalettes; +import twilightforest.util.WoodPalette; +import twilightforest.world.components.feature.config.HollowLogConfig; +import twilightforest.world.components.feature.config.RootConfig; +import twilightforest.world.components.feature.config.SwizzleConfig; +import twilightforest.world.components.feature.config.ThornsConfig; +import twilightforest.world.registration.TreeConfigurations; +import twilightforest.world.registration.TreeDecorators; + +import java.util.List; + +public final class TFConfiguredFeatures { + + //vanilla features with custom placement code + public static final ResourceKey> LAKE_LAVA = registerKey("lava_lake"); + public static final ResourceKey> LAKE_WATER = registerKey("water_lake"); + + //"structures" that arent actually structures + public static final ResourceKey> SIMPLE_WELL = registerKey("simple_well"); + public static final ResourceKey> FANCY_WELL = registerKey("fancy_well"); + public static final ResourceKey> DRUID_HUT = registerKey("druid_hut"); + public static final ResourceKey> GRAVEYARD = registerKey("graveyard"); + + //all the fun little things you find around the dimension + public static final ResourceKey> BIG_MUSHGLOOM = registerKey("mushroom/big_mushgloom"); + public static final ResourceKey> FALLEN_LEAVES = registerKey("fallen_leaves"); + public static final ResourceKey> MAYAPPLE = registerKey("mayapple"); + public static final ResourceKey> FIDDLEHEAD = registerKey("fiddlehead"); + public static final ResourceKey> FIRE_JET = registerKey("fire_jet"); + public static final ResourceKey> FOUNDATION = registerKey("foundation"); + public static final ResourceKey> GROVE_RUINS = registerKey("grove_ruins"); + public static final ResourceKey> HOLLOW_LOG = registerKey("hollow_log"); + public static final ResourceKey> HOLLOW_STUMP = registerKey("hollow_stump"); + public static final ResourceKey> HUGE_LILY_PAD = registerKey("huge_lily_pad"); + public static final ResourceKey> HUGE_WATER_LILY = registerKey("huge_water_lily"); + public static final ResourceKey> CICADA_LAMPPOST = registerKey("cicada_lamppost"); + public static final ResourceKey> FIREFLY_LAMPPOST = registerKey("firefly_lamppost"); + public static final ResourceKey> MONOLITH = registerKey("monolith"); + public static final ResourceKey> MUSHGLOOM_CLUSTER = registerKey("mushgloom_cluster"); + public static final ResourceKey> MYCELIUM_BLOB = registerKey("mycelium_blob"); + public static final ResourceKey> OUTSIDE_STALAGMITE = registerKey("outside_stalagmite"); + public static final ResourceKey> PLANT_ROOTS = registerKey("plant_roots"); + public static final ResourceKey> PUMPKIN_LAMPPOST = registerKey("pumpkin_lamppost"); + public static final ResourceKey> SMOKER = registerKey("smoker"); + public static final ResourceKey> STONE_CIRCLE = registerKey("stone_circle"); + public static final ResourceKey> THORNS = registerKey("thorns"); + public static final ResourceKey> TORCH_BERRIES = registerKey("torch_berries"); + public static final ResourceKey> TROLL_ROOTS = registerKey("troll_roots"); + public static final ResourceKey> VANILLA_ROOTS = registerKey("vanilla_roots"); + public static final ResourceKey> WEBS = registerKey("webs"); + public static final ResourceKey> WOOD_ROOTS_SPREAD = registerKey("ore/wood_roots_spread"); + public static final ResourceKey> SNOW_UNDER_TREES = registerKey("snow_under_trees"); + + //fallen logs! + public static final ResourceKey> TF_OAK_FALLEN_LOG = registerKey("tf_oak_fallen_log"); + public static final ResourceKey> CANOPY_FALLEN_LOG = registerKey("canopy_fallen_log"); + public static final ResourceKey> MANGROVE_FALLEN_LOG = registerKey("mangrove_fallen_log"); + public static final ResourceKey> OAK_FALLEN_LOG = registerKey("oak_fallen_log"); + public static final ResourceKey> SPRUCE_FALLEN_LOG = registerKey("spruce_fallen_log"); + public static final ResourceKey> BIRCH_FALLEN_LOG = registerKey("birch_fallen_log"); + + //smol stone veins + public static final ResourceKey> SMALL_GRANITE = registerKey("small_granite"); + public static final ResourceKey> SMALL_DIORITE = registerKey("small_diorite"); + public static final ResourceKey> SMALL_ANDESITE = registerKey("small_andesite"); + + //Ores! Lets keep pre 1.18 ore rates :) + public static final ResourceKey> LEGACY_COAL_ORE = registerKey("legacy_coal_ore"); + public static final ResourceKey> LEGACY_IRON_ORE = registerKey("legacy_iron_ore"); + public static final ResourceKey> LEGACY_GOLD_ORE = registerKey("legacy_gold_ore"); + public static final ResourceKey> LEGACY_REDSTONE_ORE = registerKey("legacy_redstone_ore"); + public static final ResourceKey> LEGACY_DIAMOND_ORE = registerKey("legacy_diamond_ore"); + public static final ResourceKey> LEGACY_LAPIS_ORE = registerKey("legacy_lapis_ore"); + public static final ResourceKey> LEGACY_COPPER_ORE = registerKey("legacy_copper_ore"); + + //Dark Forest needs special placements, so here we go + public static final ResourceKey> DARK_MUSHGLOOMS = registerKey("dark_mushglooms"); + public static final ResourceKey> DARK_PUMPKINS = registerKey("dark_pumpkins"); + public static final ResourceKey> DARK_GRASS = registerKey("dark_grass"); + public static final ResourceKey> DARK_FERNS = registerKey("dark_ferns"); + public static final ResourceKey> DARK_MUSHROOMS = registerKey("dark_mushrooms"); + public static final ResourceKey> DARK_DEAD_BUSHES = registerKey("dark_dead_bushes"); + + //troll caves special stuff + public static final ResourceKey> UBEROUS_SOIL_PATCH_BIG = registerKey("uberous_soil_patch_big"); + public static final ResourceKey> TROLL_CAVE_MYCELIUM = registerKey("troll_cave_mycelium"); + public static final ResourceKey> TROLL_CAVE_DIRT = registerKey("troll_cave_dirt"); + public static final ResourceKey> UBEROUS_SOIL_PATCH_SMALL = registerKey("uberous_soil_patch_small"); + + //Trees! + public static final ResourceKey> TWILIGHT_OAK_TREE = registerKey("tree/twilight_oak_tree"); + public static final ResourceKey> LARGE_TWILIGHT_OAK_TREE = registerKey("tree/large_twilight_oak_tree"); + public static final ResourceKey> SWAMPY_OAK_TREE = registerKey("tree/swampy_oak_tree"); + public static final ResourceKey> CANOPY_TREE = registerKey("tree/canopy_tree"); + public static final ResourceKey> FIREFLY_CANOPY_TREE = registerKey("tree/firefly_canopy_tree"); + public static final ResourceKey> DEAD_CANOPY_TREE = registerKey("tree/dead_canopy_tree"); + public static final ResourceKey> MANGROVE_TREE = registerKey("tree/mangrove_tree"); + public static final ResourceKey> DARKWOOD_TREE = registerKey("tree/darkwood_tree"); + public static final ResourceKey> HOMEGROWN_DARKWOOD_TREE = registerKey("tree/homegrown_darkwood_tree"); + public static final ResourceKey> DARKWOOD_LANTERN_TREE = registerKey("tree/darkwood_lantern_tree"); + public static final ResourceKey> TIME_TREE = registerKey("tree/time_tree"); + public static final ResourceKey> TRANSFORMATION_TREE = registerKey("tree/transformation_tree"); + public static final ResourceKey> MINING_TREE = registerKey("tree/mining_tree"); + public static final ResourceKey> SORTING_TREE = registerKey("tree/sorting_tree"); + public static final ResourceKey> FOREST_CANOPY_OAK_TREE = registerKey("tree/forest_canopy_oak_tree"); + public static final ResourceKey> SAVANNAH_CANOPY_OAK_TREE = registerKey("tree/savannah_canopy_oak_tree"); + public static final ResourceKey> HOLLOW_TREE = registerKey("tree/hollow_tree"); + public static final ResourceKey> RAINBOW_OAK_TREE = registerKey("tree/rainbow_oak"); + public static final ResourceKey> LARGE_RAINBOW_OAK_TREE = registerKey("tree/large_rainbow_oak"); + public static final ResourceKey> BROWN_CANOPY_MUSHROOM_TREE = registerKey("mushroom/brown_canopy_mushroom"); + public static final ResourceKey> RED_CANOPY_MUSHROOM_TREE = registerKey("mushroom/red_canopy_mushroom"); + public static final ResourceKey> MEGA_SPRUCE_TREE = registerKey("tree/mega_spruce_tree"); + public static final ResourceKey> LARGE_WINTER_TREE = registerKey("tree/large_winter_tree"); + public static final ResourceKey> SNOWY_SPRUCE_TREE = registerKey("tree/snowy_spruce_tree"); + public static final ResourceKey> DARK_FOREST_OAK_TREE = registerKey("tree/dark_forest_oak_tree"); + public static final ResourceKey> DARK_FOREST_BIRCH_TREE = registerKey("tree/dark_forest_birch_tree"); + public static final ResourceKey> VANILLA_OAK_TREE = registerKey("tree/vanilla_oak_tree"); + public static final ResourceKey> VANILLA_BIRCH_TREE = registerKey("tree/vanilla_birch_tree"); + public static final ResourceKey> SMALLER_JUNGLE_TREE = registerKey("tree/smaller_jungle_tree"); + public static final ResourceKey> DUMMY_TREE = registerKey("tree/dummy"); + + //random selectors + public static final ResourceKey> CANOPY_TREES = registerKey("tree/selector/canopy_trees"); + public static final ResourceKey> DENSE_CANOPY_TREES = registerKey("tree/selector/dense_canopy_trees"); + public static final ResourceKey> FIREFLY_FOREST_TREES = registerKey("tree/selector/firefly_forest_trees"); + public static final ResourceKey> DARK_FOREST_TREES = registerKey("tree/selector/dark_forest_trees"); + public static final ResourceKey> HIGHLANDS_TREES = registerKey("tree/selector/highlands_trees"); + public static final ResourceKey> ENCHANTED_FOREST_TREES = registerKey("tree/selector/enchanted_forest_trees"); + public static final ResourceKey> SNOWY_FOREST_TREES = registerKey("tree/selector/snowy_forest_trees"); + public static final ResourceKey> VANILLA_TF_TREES = registerKey("tree/selector/vanilla_trees"); + public static final ResourceKey> VANILLA_TF_BIG_MUSH = registerKey("tree/selector/vanilla/vanilla_mushrooms"); + + public static final ResourceKey> WELL_PLACER = TFConfiguredFeatures.registerKey("well_placer"); + public static final ResourceKey> LAMPPOST_PLACER = TFConfiguredFeatures.registerKey("lamppost_placer"); + public static final ResourceKey> DEFAULT_FALLEN_LOGS = TFConfiguredFeatures.registerKey("default_fallen_logs"); + + //super funky tree placement lists + public static final ResourceKey> CANOPY_MUSHROOMS_SPARSE = registerKey("mushroom/canopy_mushrooms_sparse"); + public static final ResourceKey> CANOPY_MUSHROOMS_DENSE = registerKey("mushroom/canopy_mushrooms_dense"); + + //ground decoration + public static final RandomPatchConfiguration SMALL_FLOWER_CONFIG = (new RandomPatchConfiguration(32, 7, 7, + PlacementUtils.filtered(Feature.SIMPLE_BLOCK, new SimpleBlockConfiguration( + new NoiseProvider(2345L, new NormalNoise.NoiseParameters(0, 1.0D), 0.020833334F, List.of( + Blocks.POPPY.defaultBlockState(), + Blocks.DANDELION.defaultBlockState(), + Blocks.RED_TULIP.defaultBlockState(), + Blocks.ORANGE_TULIP.defaultBlockState(), + Blocks.PINK_TULIP.defaultBlockState(), + Blocks.WHITE_TULIP.defaultBlockState(), + Blocks.CORNFLOWER.defaultBlockState(), + Blocks.LILY_OF_THE_VALLEY.defaultBlockState(), + Blocks.BLUE_ORCHID.defaultBlockState(), + Blocks.ALLIUM.defaultBlockState(), + Blocks.AZURE_BLUET.defaultBlockState(), + Blocks.OXEYE_DAISY.defaultBlockState()) + )), BlockPredicate.ONLY_IN_AIR_PREDICATE))); + + public static final ResourceKey> FLOWER_PLACER = registerKey("flower_placer"); + + public static final RandomPatchConfiguration SMALL_FLOWER_CONFIG_ALT = (new RandomPatchConfiguration(32, 7, 7, + PlacementUtils.filtered(Feature.SIMPLE_BLOCK, new SimpleBlockConfiguration( + new NoiseProvider(2345L, new NormalNoise.NoiseParameters(0, 1.0D), 0.020833334F, List.of( + Blocks.WHITE_TULIP.defaultBlockState(), + Blocks.PINK_TULIP.defaultBlockState(), + Blocks.ORANGE_TULIP.defaultBlockState(), + Blocks.RED_TULIP.defaultBlockState(), + Blocks.DANDELION.defaultBlockState(), + Blocks.POPPY.defaultBlockState(), + Blocks.OXEYE_DAISY.defaultBlockState(), + Blocks.AZURE_BLUET.defaultBlockState(), + Blocks.ALLIUM.defaultBlockState(), + Blocks.BLUE_ORCHID.defaultBlockState(), + Blocks.LILY_OF_THE_VALLEY.defaultBlockState(), + Blocks.CORNFLOWER.defaultBlockState()) + )), BlockPredicate.ONLY_IN_AIR_PREDICATE))); + + public static final ResourceKey> FLOWER_PLACER_ALT = registerKey("flower_placer_alt"); + + //music! + public static final Music TFMUSICTYPE = new Music(TFSounds.MUSIC.getHolder().orElseThrow(), 1200, 12000, true); + + public static ResourceKey> registerKey(String name) { + return ResourceKey.create(Registries.CONFIGURED_FEATURE, TwilightForestMod.prefix(name)); + } + + public static void bootstrap(BootstapContext> context) { + HolderGetter> features = context.lookup(Registries.CONFIGURED_FEATURE); + context.register(LAKE_LAVA, new ConfiguredFeature<>(Feature.LAKE, new LakeFeature.Configuration(BlockStateProvider.simple(Blocks.LAVA), BlockStateProvider.simple(Blocks.STONE)))); + context.register(LAKE_WATER, new ConfiguredFeature<>(Feature.LAKE, new LakeFeature.Configuration(BlockStateProvider.simple(Blocks.WATER), BlockStateProvider.simple(Blocks.STONE)))); + + registerTemplateFeatures(context); + + context.register(BIG_MUSHGLOOM, new ConfiguredFeature<>(TFFeatures.BIG_MUSHGLOOM.get(), new HugeMushroomFeatureConfiguration(BlockStateProvider.simple(TFBlocks.HUGE_MUSHGLOOM.get().defaultBlockState().setValue(HugeMushroomBlock.UP, Boolean.TRUE).setValue(HugeMushroomBlock.DOWN, Boolean.FALSE)), BlockStateProvider.simple(TFBlocks.HUGE_MUSHGLOOM_STEM.get().defaultBlockState().setValue(HugeMushroomBlock.UP, Boolean.FALSE).setValue(HugeMushroomBlock.DOWN, Boolean.FALSE)), 1))); + context.register(FALLEN_LEAVES, new ConfiguredFeature<>(TFFeatures.FALLEN_LEAVES.get(), FeatureConfiguration.NONE)); + context.register(MAYAPPLE, new ConfiguredFeature<>(Feature.RANDOM_PATCH, FeatureUtils.simplePatchConfiguration(Feature.SIMPLE_BLOCK, new SimpleBlockConfiguration(BlockStateProvider.simple(TFBlocks.MAYAPPLE.get()))))); + context.register(FIDDLEHEAD, new ConfiguredFeature<>(Feature.RANDOM_PATCH, FeatureUtils.simplePatchConfiguration(Feature.SIMPLE_BLOCK, new SimpleBlockConfiguration(BlockStateProvider.simple(TFBlocks.FIDDLEHEAD.get()))))); + context.register(FIRE_JET, new ConfiguredFeature<>(TFFeatures.FIRE_JET.get(), new BlockStateConfiguration(TFBlocks.FIRE_JET.get().defaultBlockState()))); + context.register(FOUNDATION, new ConfiguredFeature<>(TFFeatures.FOUNDATION.get(), NoneFeatureConfiguration.NONE)); + context.register(GROVE_RUINS, new ConfiguredFeature<>(TFFeatures.GROVE_RUINS.get(), NoneFeatureConfiguration.NONE)); + context.register(HOLLOW_LOG, new ConfiguredFeature<>(TFFeatures.FALLEN_HOLLOW_LOG.get(), NoneFeatureConfiguration.NONE)); + context.register(HOLLOW_STUMP, new ConfiguredFeature<>(TFFeatures.HOLLOW_STUMP.get(), TreeConfigurations.HOLLOW_TREE)); + context.register(HUGE_LILY_PAD, new ConfiguredFeature<>(TFFeatures.HUGE_LILY_PAD.get(), NoneFeatureConfiguration.NONE)); + context.register(HUGE_WATER_LILY, new ConfiguredFeature<>(TFFeatures.HUGE_WATER_LILY.get(), NoneFeatureConfiguration.NONE)); + context.register(CICADA_LAMPPOST, new ConfiguredFeature<>(TFFeatures.LAMPPOSTS.get(), new BlockStateConfiguration(TFBlocks.CICADA_JAR.get().defaultBlockState()))); + context.register(FIREFLY_LAMPPOST, new ConfiguredFeature<>(TFFeatures.LAMPPOSTS.get(), new BlockStateConfiguration(TFBlocks.FIREFLY_JAR.get().defaultBlockState()))); + context.register(MONOLITH, new ConfiguredFeature<>(TFFeatures.MONOLITH.get(), NoneFeatureConfiguration.NONE)); + context.register(MUSHGLOOM_CLUSTER, new ConfiguredFeature<>(Feature.RANDOM_PATCH, FeatureUtils.simplePatchConfiguration(Feature.SIMPLE_BLOCK, new SimpleBlockConfiguration(BlockStateProvider.simple(TFBlocks.MUSHGLOOM.get()))))); + context.register(MYCELIUM_BLOB, new ConfiguredFeature<>(TFFeatures.MYCELIUM_BLOB.get(), new DiskConfiguration(RuleBasedBlockStateProvider.simple(Blocks.MYCELIUM), BlockPredicate.matchesBlocks(Blocks.GRASS_BLOCK), UniformInt.of(4, 6), 3))); + context.register(OUTSIDE_STALAGMITE, new ConfiguredFeature<>(TFFeatures.CAVE_STALACTITE.get(), NoneFeatureConfiguration.NONE)); + context.register(PLANT_ROOTS, new ConfiguredFeature<>(TFFeatures.UNDERGROUND_PLANTS.get(), new BlockStateConfiguration(TFBlocks.ROOT_STRAND.get().defaultBlockState()))); + context.register(PUMPKIN_LAMPPOST, new ConfiguredFeature<>(TFFeatures.LAMPPOSTS.get(), new BlockStateConfiguration(Blocks.JACK_O_LANTERN.defaultBlockState()))); + context.register(SMOKER, new ConfiguredFeature<>(TFFeatures.FIRE_JET.get(), new BlockStateConfiguration(TFBlocks.SMOKER.get().defaultBlockState()))); + context.register(STONE_CIRCLE, new ConfiguredFeature<>(TFFeatures.STONE_CIRCLE.get(), NoneFeatureConfiguration.NONE)); + context.register(THORNS, new ConfiguredFeature<>(TFFeatures.THORNS.get(), new ThornsConfig(7, 3, 3, 50))); + context.register(TORCH_BERRIES, new ConfiguredFeature<>(TFFeatures.UNDERGROUND_PLANTS.get(), new BlockStateConfiguration(TFBlocks.TORCHBERRY_PLANT.get().defaultBlockState().setValue(TorchberryPlantBlock.HAS_BERRIES, true)))); + context.register(TROLL_ROOTS, new ConfiguredFeature<>(TFFeatures.TROLL_VINES.get(), new BlockStateConfiguration(TFBlocks.TROLLVIDR.get().defaultBlockState()))); + context.register(VANILLA_ROOTS, new ConfiguredFeature<>(TFFeatures.UNDERGROUND_PLANTS.get(), new BlockStateConfiguration(Blocks.HANGING_ROOTS.defaultBlockState()))); + context.register(WEBS, new ConfiguredFeature<>(TFFeatures.WEBS.get(), NoneFeatureConfiguration.NONE)); + context.register(WOOD_ROOTS_SPREAD, new ConfiguredFeature<>(TFFeatures.WOOD_ROOTS.get(), new RootConfig(TreeDecorators.ROOT_BLEND_PROVIDER, BlockStateProvider.simple(TFBlocks.LIVEROOT_BLOCK.get())))); + context.register(SNOW_UNDER_TREES, new ConfiguredFeature<>(TFFeatures.SNOW_UNDER_TREES.get(), NoneFeatureConfiguration.NONE)); + + context.register(TF_OAK_FALLEN_LOG, new ConfiguredFeature<>(TFFeatures.FALLEN_SMALL_LOG.get(), new HollowLogConfig(TFBlocks.TWILIGHT_OAK_LOG.get().defaultBlockState(), TFBlocks.HOLLOW_TWILIGHT_OAK_LOG_HORIZONTAL.get().defaultBlockState()))); + context.register(CANOPY_FALLEN_LOG, new ConfiguredFeature<>(TFFeatures.FALLEN_SMALL_LOG.get(), new HollowLogConfig(TFBlocks.CANOPY_LOG.get().defaultBlockState(), TFBlocks.HOLLOW_CANOPY_LOG_HORIZONTAL.get().defaultBlockState()))); + context.register(MANGROVE_FALLEN_LOG, new ConfiguredFeature<>(TFFeatures.FALLEN_SMALL_LOG.get(), new HollowLogConfig(TFBlocks.MANGROVE_LOG.get().defaultBlockState(), TFBlocks.HOLLOW_MANGROVE_LOG_HORIZONTAL.get().defaultBlockState()))); + context.register(OAK_FALLEN_LOG, new ConfiguredFeature<>(TFFeatures.FALLEN_SMALL_LOG.get(), new HollowLogConfig(Blocks.OAK_LOG.defaultBlockState(), TFBlocks.HOLLOW_OAK_LOG_HORIZONTAL.get().defaultBlockState()))); + context.register(SPRUCE_FALLEN_LOG, new ConfiguredFeature<>(TFFeatures.FALLEN_SMALL_LOG.get(), new HollowLogConfig(Blocks.SPRUCE_LOG.defaultBlockState(), TFBlocks.HOLLOW_SPRUCE_LOG_HORIZONTAL.get().defaultBlockState()))); + context.register(BIRCH_FALLEN_LOG, new ConfiguredFeature<>(TFFeatures.FALLEN_SMALL_LOG.get(), new HollowLogConfig(Blocks.BIRCH_LOG.defaultBlockState(), TFBlocks.HOLLOW_BIRCH_LOG_HORIZONTAL.get().defaultBlockState()))); + + context.register(SMALL_GRANITE, new ConfiguredFeature<>(Feature.ORE, new OreConfiguration(new TagMatchTest(BlockTags.STONE_ORE_REPLACEABLES), Blocks.GRANITE.defaultBlockState(), 16))); + context.register(SMALL_DIORITE, new ConfiguredFeature<>(Feature.ORE, new OreConfiguration(new TagMatchTest(BlockTags.STONE_ORE_REPLACEABLES), Blocks.DIORITE.defaultBlockState(), 16))); + context.register(SMALL_ANDESITE, new ConfiguredFeature<>(Feature.ORE, new OreConfiguration(new TagMatchTest(BlockTags.STONE_ORE_REPLACEABLES), Blocks.ANDESITE.defaultBlockState(), 16))); + + context.register(LEGACY_COAL_ORE, new ConfiguredFeature<>(Feature.ORE, new OreConfiguration(new TagMatchTest(BlockTags.STONE_ORE_REPLACEABLES), Blocks.COAL_ORE.defaultBlockState(), 16))); + context.register(LEGACY_IRON_ORE, new ConfiguredFeature<>(Feature.ORE, new OreConfiguration(new TagMatchTest(BlockTags.STONE_ORE_REPLACEABLES), Blocks.IRON_ORE.defaultBlockState(), 9))); + context.register(LEGACY_GOLD_ORE, new ConfiguredFeature<>(Feature.ORE, new OreConfiguration(new TagMatchTest(BlockTags.STONE_ORE_REPLACEABLES), Blocks.GOLD_ORE.defaultBlockState(), 9))); + context.register(LEGACY_REDSTONE_ORE, new ConfiguredFeature<>(Feature.ORE, new OreConfiguration(new TagMatchTest(BlockTags.STONE_ORE_REPLACEABLES), Blocks.REDSTONE_ORE.defaultBlockState(), 8))); + context.register(LEGACY_DIAMOND_ORE, new ConfiguredFeature<>(Feature.ORE, new OreConfiguration(new TagMatchTest(BlockTags.STONE_ORE_REPLACEABLES), Blocks.DIAMOND_ORE.defaultBlockState(), 8))); + context.register(LEGACY_LAPIS_ORE, new ConfiguredFeature<>(Feature.ORE, new OreConfiguration(new TagMatchTest(BlockTags.STONE_ORE_REPLACEABLES), Blocks.LAPIS_ORE.defaultBlockState(), 7))); + context.register(LEGACY_COPPER_ORE, new ConfiguredFeature<>(Feature.ORE, new OreConfiguration(new TagMatchTest(BlockTags.STONE_ORE_REPLACEABLES), Blocks.COPPER_ORE.defaultBlockState(), 10))); + + context.register(DARK_MUSHGLOOMS, new ConfiguredFeature<>(TFFeatures.DARK_FOREST_PLACER.get(), FeatureUtils.simplePatchConfiguration(Feature.SIMPLE_BLOCK, new SimpleBlockConfiguration(BlockStateProvider.simple(TFBlocks.MUSHGLOOM.get())), List.of(Blocks.GRASS_BLOCK), 50))); + context.register(DARK_PUMPKINS, new ConfiguredFeature<>(TFFeatures.DARK_FOREST_PLACER.get(), FeatureUtils.simplePatchConfiguration(Feature.SIMPLE_BLOCK, new SimpleBlockConfiguration(BlockStateProvider.simple(Blocks.PUMPKIN)), List.of(Blocks.GRASS_BLOCK), 50))); + context.register(DARK_GRASS, new ConfiguredFeature<>(TFFeatures.DARK_FOREST_PLACER.get(), FeatureUtils.simplePatchConfiguration(Feature.SIMPLE_BLOCK, new SimpleBlockConfiguration(BlockStateProvider.simple(Blocks.GRASS)), List.of(Blocks.GRASS_BLOCK), 128))); + context.register(DARK_FERNS, new ConfiguredFeature<>(TFFeatures.DARK_FOREST_PLACER.get(), FeatureUtils.simplePatchConfiguration(Feature.SIMPLE_BLOCK, new SimpleBlockConfiguration(BlockStateProvider.simple(Blocks.FERN)), List.of(Blocks.GRASS_BLOCK), 128))); + context.register(DARK_MUSHROOMS, new ConfiguredFeature<>(TFFeatures.DARK_FOREST_PLACER.get(), FeatureUtils.simplePatchConfiguration(Feature.SIMPLE_BLOCK, new SimpleBlockConfiguration(BlockStateProvider.simple(Blocks.BROWN_MUSHROOM)), List.of(Blocks.GRASS_BLOCK), 50))); + context.register(DARK_DEAD_BUSHES, new ConfiguredFeature<>(TFFeatures.DARK_FOREST_PLACER.get(), FeatureUtils.simplePatchConfiguration(Feature.SIMPLE_BLOCK, new SimpleBlockConfiguration(BlockStateProvider.simple(Blocks.DEAD_BUSH)), List.of(Blocks.GRASS_BLOCK), 50))); + + context.register(UBEROUS_SOIL_PATCH_BIG, new ConfiguredFeature<>(TFFeatures.MYCELIUM_BLOB.get(), new DiskConfiguration(RuleBasedBlockStateProvider.simple(TFBlocks.UBEROUS_SOIL.get()), BlockPredicate.matchesBlocks(Blocks.PODZOL, Blocks.COARSE_DIRT, Blocks.DIRT), UniformInt.of(4, 8), 1))); + context.register(TROLL_CAVE_MYCELIUM, new ConfiguredFeature<>(TFFeatures.MYCELIUM_BLOB.get(), new DiskConfiguration(RuleBasedBlockStateProvider.simple(Blocks.MYCELIUM), BlockPredicate.matchesBlocks(Blocks.STONE, TFBlocks.DEADROCK.get()), UniformInt.of(3, 5), 0))); + context.register(TROLL_CAVE_DIRT, new ConfiguredFeature<>(TFFeatures.MYCELIUM_BLOB.get(), new DiskConfiguration(RuleBasedBlockStateProvider.simple(Blocks.DIRT), BlockPredicate.matchesBlocks(Blocks.STONE, TFBlocks.DEADROCK.get()), UniformInt.of(2, 5), 0))); + context.register(UBEROUS_SOIL_PATCH_SMALL, new ConfiguredFeature<>(TFFeatures.MYCELIUM_BLOB.get(), new DiskConfiguration(RuleBasedBlockStateProvider.simple(TFBlocks.UBEROUS_SOIL.get()), BlockPredicate.matchesBlocks(Blocks.PODZOL, Blocks.COARSE_DIRT, Blocks.DIRT), UniformInt.of(2, 3), 0))); + + context.register(TWILIGHT_OAK_TREE, new ConfiguredFeature<>(Feature.TREE, TreeConfigurations.TWILIGHT_OAK)); + context.register(LARGE_TWILIGHT_OAK_TREE, new ConfiguredFeature<>(Feature.TREE, TreeConfigurations.LARGE_TWILIGHT_OAK)); + context.register(SWAMPY_OAK_TREE, new ConfiguredFeature<>(Feature.TREE, TreeConfigurations.SWAMPY_OAK)); + context.register(CANOPY_TREE, new ConfiguredFeature<>(Feature.TREE, TreeConfigurations.CANOPY_TREE)); + context.register(FIREFLY_CANOPY_TREE, new ConfiguredFeature<>(Feature.TREE, TreeConfigurations.CANOPY_TREE_FIREFLY)); + context.register(DEAD_CANOPY_TREE, new ConfiguredFeature<>(Feature.TREE, TreeConfigurations.CANOPY_TREE_DEAD)); + context.register(MANGROVE_TREE, new ConfiguredFeature<>(Feature.TREE, TreeConfigurations.MANGROVE_TREE)); + context.register(DARKWOOD_TREE, new ConfiguredFeature<>(TFFeatures.DARK_CANOPY_TREE.get(), TreeConfigurations.DARKWOOD_TREE)); + context.register(HOMEGROWN_DARKWOOD_TREE, new ConfiguredFeature<>(TFFeatures.DARK_CANOPY_TREE.get(), TreeConfigurations.HOMEGROWN_DARKWOOD_TREE)); + context.register(DARKWOOD_LANTERN_TREE, new ConfiguredFeature<>(TFFeatures.DARK_CANOPY_TREE.get(), TreeConfigurations.DARKWOOD_LANTERN_TREE)); + context.register(TIME_TREE, new ConfiguredFeature<>(TFFeatures.TREE_OF_TIME.get(), TreeConfigurations.TIME_TREE)); + context.register(TRANSFORMATION_TREE, new ConfiguredFeature<>(Feature.TREE, TreeConfigurations.TRANSFORM_TREE)); + context.register(MINING_TREE, new ConfiguredFeature<>(TFFeatures.MINERS_TREE.get(), TreeConfigurations.MINING_TREE)); + context.register(SORTING_TREE, new ConfiguredFeature<>(Feature.TREE, TreeConfigurations.SORT_TREE)); + context.register(FOREST_CANOPY_OAK_TREE, new ConfiguredFeature<>(TFFeatures.CANOPY_OAK.get(), TreeConfigurations.FOREST_CANOPY_OAK)); + context.register(SAVANNAH_CANOPY_OAK_TREE, new ConfiguredFeature<>(TFFeatures.CANOPY_OAK.get(), TreeConfigurations.SAVANNAH_CANOPY_OAK)); + context.register(HOLLOW_TREE, new ConfiguredFeature<>(TFFeatures.HOLLOW_TREE.get(), TreeConfigurations.HOLLOW_TREE)); + context.register(RAINBOW_OAK_TREE, new ConfiguredFeature<>(Feature.TREE, TreeConfigurations.RAINBOAK_TREE)); + context.register(LARGE_RAINBOW_OAK_TREE, new ConfiguredFeature<>(Feature.TREE, TreeConfigurations.LARGE_RAINBOAK_TREE)); + context.register(BROWN_CANOPY_MUSHROOM_TREE, new ConfiguredFeature<>(TFFeatures.CANOPY_BROWN_MUSHROOM.get(), new HugeMushroomFeatureConfiguration(BlockStateProvider.simple(Blocks.BROWN_MUSHROOM_BLOCK.defaultBlockState().setValue(HugeMushroomBlock.UP, Boolean.TRUE).setValue(HugeMushroomBlock.DOWN, Boolean.FALSE)), BlockStateProvider.simple(Blocks.MUSHROOM_STEM.defaultBlockState().setValue(HugeMushroomBlock.UP, Boolean.FALSE).setValue(HugeMushroomBlock.DOWN, Boolean.FALSE)), 3))); + context.register(RED_CANOPY_MUSHROOM_TREE, new ConfiguredFeature<>(TFFeatures.CANOPY_RED_MUSHROOM.get(), new HugeMushroomFeatureConfiguration(BlockStateProvider.simple(Blocks.RED_MUSHROOM_BLOCK.defaultBlockState().setValue(HugeMushroomBlock.UP, Boolean.TRUE).setValue(HugeMushroomBlock.DOWN, Boolean.FALSE)), BlockStateProvider.simple(Blocks.MUSHROOM_STEM.defaultBlockState().setValue(HugeMushroomBlock.UP, Boolean.FALSE).setValue(HugeMushroomBlock.DOWN, Boolean.FALSE)), 3))); + context.register(MEGA_SPRUCE_TREE, new ConfiguredFeature<>(Feature.TREE, TreeConfigurations.BIG_SPRUCE)); + context.register(LARGE_WINTER_TREE, new ConfiguredFeature<>(TFFeatures.LARGE_WINTER_TREE.get(), TreeConfigurations.LARGE_WINTER)); + context.register(SNOWY_SPRUCE_TREE, new ConfiguredFeature<>(TFFeatures.SNOW_TREE.get(), new TreeConfiguration.TreeConfigurationBuilder(BlockStateProvider.simple(Blocks.SPRUCE_LOG), new StraightTrunkPlacer(5, 2, 1), BlockStateProvider.simple(Blocks.SPRUCE_LEAVES), new SpruceFoliagePlacer(UniformInt.of(2, 3), UniformInt.of(0, 2), UniformInt.of(1, 2)), new TwoLayersFeatureSize(2, 0, 2)).ignoreVines().build())); + context.register(DARK_FOREST_OAK_TREE, new ConfiguredFeature<>(TFFeatures.DARK_CANOPY_TREE.get(), new TreeConfiguration.TreeConfigurationBuilder(BlockStateProvider.simple(Blocks.OAK_LOG), new StraightTrunkPlacer(4, 2, 0), BlockStateProvider.simple(Blocks.OAK_LEAVES), new BlobFoliagePlacer(ConstantInt.of(2), ConstantInt.of(0), 3), new TwoLayersFeatureSize(1, 0, 1)).ignoreVines().build())); + context.register(DARK_FOREST_BIRCH_TREE, new ConfiguredFeature<>(TFFeatures.DARK_CANOPY_TREE.get(), new TreeConfiguration.TreeConfigurationBuilder(BlockStateProvider.simple(Blocks.BIRCH_LOG), new StraightTrunkPlacer(5, 2, 0), BlockStateProvider.simple(Blocks.BIRCH_LEAVES), new BlobFoliagePlacer(ConstantInt.of(2), ConstantInt.of(0), 3), new TwoLayersFeatureSize(1, 0, 1)).ignoreVines().build())); + context.register(VANILLA_OAK_TREE, new ConfiguredFeature<>(Feature.TREE, new TreeConfiguration.TreeConfigurationBuilder(BlockStateProvider.simple(Blocks.OAK_LOG), new StraightTrunkPlacer(4, 2, 0), BlockStateProvider.simple(Blocks.OAK_LEAVES), new BlobFoliagePlacer(ConstantInt.of(2), ConstantInt.of(0), 3), new TwoLayersFeatureSize(1, 0, 1)).ignoreVines().build())); + context.register(VANILLA_BIRCH_TREE, new ConfiguredFeature<>(Feature.TREE, new TreeConfiguration.TreeConfigurationBuilder(BlockStateProvider.simple(Blocks.BIRCH_LOG), new StraightTrunkPlacer(5, 2, 0), BlockStateProvider.simple(Blocks.BIRCH_LEAVES), new BlobFoliagePlacer(ConstantInt.of(2), ConstantInt.of(0), 3), new TwoLayersFeatureSize(1, 0, 1)).ignoreVines().build())); + context.register(SMALLER_JUNGLE_TREE, new ConfiguredFeature<>(Feature.TREE, TreeConfigurations.SMALL_JUNGLE)); + context.register(DUMMY_TREE, new ConfiguredFeature<>(Feature.NO_OP, NoneFeatureConfiguration.INSTANCE)); + + context.register(WELL_PLACER, new ConfiguredFeature<>(Feature.RANDOM_SELECTOR, new RandomFeatureConfiguration(ImmutableList.of(new WeightedPlacedFeature(PlacementUtils.inlinePlaced(features.getOrThrow(FANCY_WELL)), 0.05F)), PlacementUtils.inlinePlaced(features.getOrThrow(SIMPLE_WELL))))); + context.register(LAMPPOST_PLACER, new ConfiguredFeature<>(Feature.RANDOM_SELECTOR, new RandomFeatureConfiguration(ImmutableList.of(new WeightedPlacedFeature(PlacementUtils.inlinePlaced(features.getOrThrow(CICADA_LAMPPOST)), 0.1F)), PlacementUtils.inlinePlaced(features.getOrThrow(FIREFLY_LAMPPOST))))); + context.register(DEFAULT_FALLEN_LOGS, new ConfiguredFeature<>(Feature.RANDOM_SELECTOR, new RandomFeatureConfiguration(ImmutableList.of(new WeightedPlacedFeature(PlacementUtils.inlinePlaced(features.getOrThrow(BIRCH_FALLEN_LOG)), 0.1F), new WeightedPlacedFeature(PlacementUtils.inlinePlaced(features.getOrThrow(OAK_FALLEN_LOG)), 0.2F), new WeightedPlacedFeature(PlacementUtils.inlinePlaced(features.getOrThrow(CANOPY_FALLEN_LOG)), 0.4F)), PlacementUtils.inlinePlaced(features.getOrThrow(TF_OAK_FALLEN_LOG))))); + + context.register(CANOPY_TREES, new ConfiguredFeature<>(Feature.RANDOM_SELECTOR, new RandomFeatureConfiguration(ImmutableList.of(new WeightedPlacedFeature(PlacementUtils.inlinePlaced(features.getOrThrow(CANOPY_TREE)), 0.6F)), PlacementUtils.inlinePlaced(features.getOrThrow(TWILIGHT_OAK_TREE))))); + context.register(DENSE_CANOPY_TREES, new ConfiguredFeature<>(Feature.RANDOM_SELECTOR, new RandomFeatureConfiguration(ImmutableList.of(new WeightedPlacedFeature(PlacementUtils.inlinePlaced(features.getOrThrow(CANOPY_TREE)), 0.7F)), PlacementUtils.inlinePlaced(features.getOrThrow(TWILIGHT_OAK_TREE))))); + context.register(FIREFLY_FOREST_TREES, new ConfiguredFeature<>(Feature.RANDOM_SELECTOR, new RandomFeatureConfiguration(ImmutableList.of(new WeightedPlacedFeature(PlacementUtils.inlinePlaced(features.getOrThrow(CANOPY_TREE)), 0.33F), new WeightedPlacedFeature(PlacementUtils.inlinePlaced(features.getOrThrow(FIREFLY_CANOPY_TREE)), 0.45F)), PlacementUtils.inlinePlaced(features.getOrThrow(TWILIGHT_OAK_TREE))))); + context.register(DARK_FOREST_TREES, new ConfiguredFeature<>(Feature.RANDOM_SELECTOR, new RandomFeatureConfiguration(ImmutableList.of(new WeightedPlacedFeature(PlacementUtils.inlinePlaced(features.getOrThrow(DARK_FOREST_BIRCH_TREE)), 0.2F), new WeightedPlacedFeature(PlacementUtils.inlinePlaced(features.getOrThrow(DARK_FOREST_OAK_TREE)), 0.2F)), PlacementUtils.inlinePlaced(features.getOrThrow(DARKWOOD_TREE))))); + context.register(HIGHLANDS_TREES, new ConfiguredFeature<>(Feature.RANDOM_SELECTOR, new RandomFeatureConfiguration(ImmutableList.of(new WeightedPlacedFeature(PlacementUtils.inlinePlaced(features.getOrThrow(TreeFeatures.SPRUCE)), 0.25F), new WeightedPlacedFeature(PlacementUtils.inlinePlaced(features.getOrThrow(TreeFeatures.PINE)), 0.1F)), PlacementUtils.inlinePlaced(features.getOrThrow(MEGA_SPRUCE_TREE))))); + context.register(ENCHANTED_FOREST_TREES, new ConfiguredFeature<>(Feature.RANDOM_SELECTOR, new RandomFeatureConfiguration(ImmutableList.of(new WeightedPlacedFeature(PlacementUtils.inlinePlaced(features.getOrThrow(VANILLA_OAK_TREE)), 0.15F), new WeightedPlacedFeature(PlacementUtils.inlinePlaced(features.getOrThrow(VANILLA_BIRCH_TREE)), 0.15F), new WeightedPlacedFeature(PlacementUtils.inlinePlaced(features.getOrThrow(LARGE_RAINBOW_OAK_TREE)), 0.1F)), PlacementUtils.inlinePlaced(features.getOrThrow(RAINBOW_OAK_TREE))))); + context.register(SNOWY_FOREST_TREES, new ConfiguredFeature<>(Feature.RANDOM_SELECTOR, new RandomFeatureConfiguration(ImmutableList.of(new WeightedPlacedFeature(PlacementUtils.inlinePlaced(features.getOrThrow(MEGA_SPRUCE_TREE)), 0.1F), new WeightedPlacedFeature(PlacementUtils.inlinePlaced(features.getOrThrow(LARGE_WINTER_TREE)), 0.01F)), PlacementUtils.inlinePlaced(features.getOrThrow(SNOWY_SPRUCE_TREE))))); + context.register(VANILLA_TF_TREES, new ConfiguredFeature<>(Feature.RANDOM_SELECTOR, new RandomFeatureConfiguration(ImmutableList.of(new WeightedPlacedFeature(PlacementUtils.inlinePlaced(features.getOrThrow(VANILLA_BIRCH_TREE)), 0.25F), new WeightedPlacedFeature(PlacementUtils.inlinePlaced(features.getOrThrow(VANILLA_OAK_TREE)), 0.25F)), PlacementUtils.inlinePlaced(features.getOrThrow(TWILIGHT_OAK_TREE))))); + context.register(VANILLA_TF_BIG_MUSH, new ConfiguredFeature<>(Feature.RANDOM_BOOLEAN_SELECTOR, new RandomBooleanFeatureConfiguration(PlacementUtils.inlinePlaced(features.getOrThrow(TreeFeatures.HUGE_RED_MUSHROOM)), PlacementUtils.inlinePlaced(features.getOrThrow(TreeFeatures.HUGE_BROWN_MUSHROOM))))); + + context.register(CANOPY_MUSHROOMS_SPARSE, new ConfiguredFeature<>(Feature.RANDOM_SELECTOR, new RandomFeatureConfiguration(List.of(new WeightedPlacedFeature(PlacementUtils.inlinePlaced(features.getOrThrow(BROWN_CANOPY_MUSHROOM_TREE)), 0.15f), new WeightedPlacedFeature(PlacementUtils.inlinePlaced(features.getOrThrow(RED_CANOPY_MUSHROOM_TREE)), 0.05f)), PlacementUtils.inlinePlaced(features.getOrThrow(DUMMY_TREE))))); + context.register(CANOPY_MUSHROOMS_DENSE, new ConfiguredFeature<>(Feature.RANDOM_SELECTOR, new RandomFeatureConfiguration(List.of(new WeightedPlacedFeature(PlacementUtils.inlinePlaced(features.getOrThrow(BROWN_CANOPY_MUSHROOM_TREE)), 0.675f), new WeightedPlacedFeature(PlacementUtils.inlinePlaced(features.getOrThrow(RED_CANOPY_MUSHROOM_TREE)), 0.225f)), PlacementUtils.inlinePlaced(features.getOrThrow(DUMMY_TREE))))); + context.register(FLOWER_PLACER, new ConfiguredFeature<>(Feature.FLOWER, SMALL_FLOWER_CONFIG)); + context.register(FLOWER_PLACER_ALT, new ConfiguredFeature<>(Feature.FLOWER, SMALL_FLOWER_CONFIG_ALT)); + } + + private static void registerTemplateFeatures(BootstapContext> context) { + HolderGetter paletteHolders = context.lookup(WoodPalettes.WOOD_PALETTE_TYPE_KEY); + var paletteChoices = SwizzleConfig.buildRarityPalette(paletteHolders); + + ProcessorRule processorCobbleBlock = new ProcessorRule(new RandomBlockMatchTest(Blocks.COBBLESTONE, 0.5f), AlwaysTrueTest.INSTANCE, Blocks.MOSSY_COBBLESTONE.defaultBlockState()); + ProcessorRule processorCobbleStair = new ProcessorRule(new RandomBlockMatchTest(Blocks.COBBLESTONE_STAIRS, 0.5f), AlwaysTrueTest.INSTANCE, Blocks.MOSSY_COBBLESTONE_STAIRS.defaultBlockState()); + ProcessorRule processorCobbleSlab = new ProcessorRule(new RandomBlockMatchTest(Blocks.COBBLESTONE_SLAB, 0.5f), AlwaysTrueTest.INSTANCE, Blocks.MOSSY_COBBLESTONE_SLAB.defaultBlockState()); + ProcessorRule processorCobbleWall = new ProcessorRule(new RandomBlockMatchTest(Blocks.COBBLESTONE_WALL, 0.5f), AlwaysTrueTest.INSTANCE, Blocks.MOSSY_COBBLESTONE_WALL.defaultBlockState()); + + ProcessorRule processorStoneBrickBlock = new ProcessorRule(new RandomBlockMatchTest(Blocks.STONE_BRICKS, 0.5f), AlwaysTrueTest.INSTANCE, Blocks.MOSSY_STONE_BRICKS.defaultBlockState()); + ProcessorRule processorStoneBrickStair = new ProcessorRule(new RandomBlockMatchTest(Blocks.STONE_BRICK_STAIRS, 0.5f), AlwaysTrueTest.INSTANCE, Blocks.MOSSY_STONE_BRICK_STAIRS.defaultBlockState()); + ProcessorRule processorStoneBrickSlab = new ProcessorRule(new RandomBlockMatchTest(Blocks.STONE_BRICK_SLAB, 0.5f), AlwaysTrueTest.INSTANCE, Blocks.MOSSY_STONE_BRICK_SLAB.defaultBlockState()); + ProcessorRule processorStoneBrickWall = new ProcessorRule(new RandomBlockMatchTest(Blocks.STONE_BRICK_WALL, 0.5f), AlwaysTrueTest.INSTANCE, Blocks.MOSSY_STONE_BRICK_WALL.defaultBlockState()); + + SwizzleConfig simpleWellConfig = SwizzleConfig.generate(paletteHolders, CustomTagGenerator.WoodPaletteTagGenerator.WELL_SWIZZLE_MASK, paletteChoices, processorCobbleBlock, processorCobbleStair, processorCobbleSlab, processorCobbleWall); + context.register(SIMPLE_WELL, new ConfiguredFeature<>(TFFeatures.SIMPLE_WELL.get(), simpleWellConfig)); + + SwizzleConfig fancyWellConfig = SwizzleConfig.generate(paletteHolders, CustomTagGenerator.WoodPaletteTagGenerator.WELL_SWIZZLE_MASK, paletteChoices, processorCobbleBlock, processorCobbleStair, processorCobbleSlab, processorCobbleWall, processorStoneBrickBlock, processorStoneBrickStair, processorStoneBrickSlab, processorStoneBrickWall); + context.register(FANCY_WELL, new ConfiguredFeature<>(TFFeatures.FANCY_WELL.get(), fancyWellConfig)); + + SwizzleConfig hutConfig = SwizzleConfig.generate(paletteHolders, CustomTagGenerator.WoodPaletteTagGenerator.DRUID_HUT_SWIZZLE_MASK, paletteChoices, processorCobbleBlock, processorCobbleStair, processorCobbleSlab, processorCobbleWall, processorStoneBrickBlock, processorStoneBrickStair, processorStoneBrickSlab, processorStoneBrickWall); + context.register(DRUID_HUT, new ConfiguredFeature<>(TFFeatures.DRUID_HUT.get(), hutConfig)); + + context.register(GRAVEYARD, new ConfiguredFeature<>(TFFeatures.GRAVEYARD.get(), FeatureConfiguration.NONE)); + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/init/TFCreativeTabs.java b/src/main/java/twilightforest/init/TFCreativeTabs.java new file mode 100644 index 0000000000..ba1879e029 --- /dev/null +++ b/src/main/java/twilightforest/init/TFCreativeTabs.java @@ -0,0 +1,596 @@ +package twilightforest.init; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.StringTag; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.CreativeModeTab; +import net.minecraft.world.item.EnchantedBookItem; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.Enchantment; +import net.minecraft.world.item.enchantment.EnchantmentInstance; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.level.ItemLike; +import net.minecraftforge.event.CreativeModeTabEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.registries.RegistryObject; +import twilightforest.TFConfig; +import twilightforest.TwilightForestMod; + +import java.util.Collection; +import java.util.List; + +@Mod.EventBusSubscriber(modid = TwilightForestMod.ID, bus = Mod.EventBusSubscriber.Bus.MOD) +public class TFCreativeTabs { + + @SubscribeEvent + public static void registerTFBlocksTab(CreativeModeTabEvent.Register event) { + CreativeModeTab BLOCKS = event.registerCreativeModeTab(TwilightForestMod.prefix("blocks"), builder -> builder + .title(Component.translatable("itemGroup.twilightforest.blocks")) + .icon(() -> new ItemStack(TFBlocks.NAGA_COURTYARD_MINIATURE_STRUCTURE.get())) + .displayItems((parameters, output) -> { + output.accept(TFBlocks.TWILIGHT_OAK_PLANKS.get()); + output.accept(TFBlocks.CANOPY_PLANKS.get()); + output.accept(TFBlocks.MANGROVE_PLANKS.get()); + output.accept(TFBlocks.DARK_PLANKS.get()); + output.accept(TFBlocks.TIME_PLANKS.get()); + output.accept(TFBlocks.TRANSFORMATION_PLANKS.get()); + output.accept(TFBlocks.MINING_PLANKS.get()); + output.accept(TFBlocks.SORTING_PLANKS.get()); + output.accept(TFBlocks.OAK_BANISTER.get()); + output.accept(TFBlocks.TWILIGHT_OAK_STAIRS.get()); + output.accept(TFBlocks.CANOPY_STAIRS.get()); + output.accept(TFBlocks.MANGROVE_STAIRS.get()); + output.accept(TFBlocks.DARK_STAIRS.get()); + output.accept(TFBlocks.TIME_STAIRS.get()); + output.accept(TFBlocks.TRANSFORMATION_STAIRS.get()); + output.accept(TFBlocks.MINING_STAIRS.get()); + output.accept(TFBlocks.SORTING_STAIRS.get()); + output.accept(TFBlocks.SPRUCE_BANISTER.get()); + output.accept(TFBlocks.TWILIGHT_OAK_SLAB.get()); + output.accept(TFBlocks.CANOPY_SLAB.get()); + output.accept(TFBlocks.MANGROVE_SLAB.get()); + output.accept(TFBlocks.DARK_SLAB.get()); + output.accept(TFBlocks.TIME_SLAB.get()); + output.accept(TFBlocks.TRANSFORMATION_SLAB.get()); + output.accept(TFBlocks.MINING_SLAB.get()); + output.accept(TFBlocks.SORTING_SLAB.get()); + output.accept(TFBlocks.BIRCH_BANISTER.get()); + output.accept(TFBlocks.TWILIGHT_OAK_FENCE.get()); + output.accept(TFBlocks.CANOPY_FENCE.get()); + output.accept(TFBlocks.MANGROVE_FENCE.get()); + output.accept(TFBlocks.DARK_FENCE.get()); + output.accept(TFBlocks.TIME_FENCE.get()); + output.accept(TFBlocks.TRANSFORMATION_FENCE.get()); + output.accept(TFBlocks.MINING_FENCE.get()); + output.accept(TFBlocks.SORTING_FENCE.get()); + output.accept(TFBlocks.JUNGLE_BANISTER.get()); + output.accept(TFBlocks.TWILIGHT_OAK_BANISTER.get()); + output.accept(TFBlocks.CANOPY_BANISTER.get()); + output.accept(TFBlocks.MANGROVE_BANISTER.get()); + output.accept(TFBlocks.DARK_BANISTER.get()); + output.accept(TFBlocks.TIME_BANISTER.get()); + output.accept(TFBlocks.TRANSFORMATION_BANISTER.get()); + output.accept(TFBlocks.MINING_BANISTER.get()); + output.accept(TFBlocks.SORTING_BANISTER.get()); + output.accept(TFBlocks.ACACIA_BANISTER.get()); + output.accept(TFBlocks.TWILIGHT_OAK_GATE.get()); + output.accept(TFBlocks.CANOPY_GATE.get()); + output.accept(TFBlocks.MANGROVE_GATE.get()); + output.accept(TFBlocks.DARK_GATE.get()); + output.accept(TFBlocks.TIME_GATE.get()); + output.accept(TFBlocks.TRANSFORMATION_GATE.get()); + output.accept(TFBlocks.MINING_GATE.get()); + output.accept(TFBlocks.SORTING_GATE.get()); + output.accept(TFBlocks.DARK_OAK_BANISTER.get()); + output.accept(TFBlocks.TWILIGHT_OAK_TRAPDOOR.get()); + output.accept(TFBlocks.CANOPY_TRAPDOOR.get()); + output.accept(TFBlocks.MANGROVE_TRAPDOOR.get()); + output.accept(TFBlocks.DARK_TRAPDOOR.get()); + output.accept(TFBlocks.TIME_TRAPDOOR.get()); + output.accept(TFBlocks.TRANSFORMATION_TRAPDOOR.get()); + output.accept(TFBlocks.MINING_TRAPDOOR.get()); + output.accept(TFBlocks.SORTING_TRAPDOOR.get()); + output.accept(TFBlocks.CRIMSON_BANISTER.get()); + output.accept(TFBlocks.TWILIGHT_OAK_PLATE.get()); + output.accept(TFBlocks.CANOPY_PLATE.get()); + output.accept(TFBlocks.MANGROVE_PLATE.get()); + output.accept(TFBlocks.DARK_PLATE.get()); + output.accept(TFBlocks.TIME_PLATE.get()); + output.accept(TFBlocks.TRANSFORMATION_PLATE.get()); + output.accept(TFBlocks.MINING_PLATE.get()); + output.accept(TFBlocks.SORTING_PLATE.get()); + output.accept(TFBlocks.WARPED_BANISTER.get()); + output.accept(TFBlocks.TWILIGHT_OAK_BUTTON.get()); + output.accept(TFBlocks.CANOPY_BUTTON.get()); + output.accept(TFBlocks.MANGROVE_BUTTON.get()); + output.accept(TFBlocks.DARK_BUTTON.get()); + output.accept(TFBlocks.TIME_BUTTON.get()); + output.accept(TFBlocks.TRANSFORMATION_BUTTON.get()); + output.accept(TFBlocks.MINING_BUTTON.get()); + output.accept(TFBlocks.SORTING_BUTTON.get()); + output.accept(TFBlocks.VANGROVE_BANISTER.get()); + output.accept(TFBlocks.TWILIGHT_OAK_DOOR.get()); + output.accept(TFBlocks.CANOPY_DOOR.get()); + output.accept(TFBlocks.MANGROVE_DOOR.get()); + output.accept(TFBlocks.DARK_DOOR.get()); + output.accept(TFBlocks.TIME_DOOR.get()); + output.accept(TFBlocks.TRANSFORMATION_DOOR.get()); + output.accept(TFBlocks.MINING_DOOR.get()); + output.accept(TFBlocks.SORTING_DOOR.get()); + output.accept(TFBlocks.HOLLOW_OAK_LOG_HORIZONTAL.get()); + output.accept(TFBlocks.TWILIGHT_OAK_SIGN.get()); + output.accept(TFBlocks.CANOPY_SIGN.get()); + output.accept(TFBlocks.MANGROVE_SIGN.get()); + output.accept(TFBlocks.DARK_SIGN.get()); + output.accept(TFBlocks.TIME_SIGN.get()); + output.accept(TFBlocks.TRANSFORMATION_SIGN.get()); + output.accept(TFBlocks.MINING_SIGN.get()); + output.accept(TFBlocks.SORTING_SIGN.get()); + output.accept(TFBlocks.HOLLOW_SPRUCE_LOG_HORIZONTAL.get()); + output.accept(TFBlocks.TWILIGHT_OAK_CHEST.get()); + output.accept(TFBlocks.CANOPY_CHEST.get()); + output.accept(TFBlocks.MANGROVE_CHEST.get()); + output.accept(TFBlocks.DARK_CHEST.get()); + output.accept(TFBlocks.TIME_CHEST.get()); + output.accept(TFBlocks.TRANSFORMATION_CHEST.get()); + output.accept(TFBlocks.MINING_CHEST.get()); + output.accept(TFBlocks.SORTING_CHEST.get()); + output.accept(TFBlocks.HOLLOW_BIRCH_LOG_HORIZONTAL.get()); + output.accept(TFBlocks.TWILIGHT_OAK_WOOD.get()); + output.accept(TFBlocks.CANOPY_WOOD.get()); + output.accept(TFBlocks.MANGROVE_WOOD.get()); + output.accept(TFBlocks.DARK_WOOD.get()); + output.accept(TFBlocks.TIME_WOOD.get()); + output.accept(TFBlocks.TRANSFORMATION_WOOD.get()); + output.accept(TFBlocks.MINING_WOOD.get()); + output.accept(TFBlocks.SORTING_WOOD.get()); + output.accept(TFBlocks.HOLLOW_JUNGLE_LOG_HORIZONTAL.get()); + output.accept(TFBlocks.TWILIGHT_OAK_LOG.get()); + output.accept(TFBlocks.CANOPY_LOG.get()); + output.accept(TFBlocks.MANGROVE_LOG.get()); + output.accept(TFBlocks.DARK_LOG.get()); + output.accept(TFBlocks.TIME_LOG.get()); + output.accept(TFBlocks.TRANSFORMATION_LOG.get()); + output.accept(TFBlocks.MINING_LOG.get()); + output.accept(TFBlocks.SORTING_LOG.get()); + output.accept(TFBlocks.HOLLOW_ACACIA_LOG_HORIZONTAL.get()); + output.accept(TFBlocks.STRIPPED_TWILIGHT_OAK_LOG.get()); + output.accept(TFBlocks.STRIPPED_CANOPY_LOG.get()); + output.accept(TFBlocks.STRIPPED_MANGROVE_LOG.get()); + output.accept(TFBlocks.STRIPPED_DARK_LOG.get()); + output.accept(TFBlocks.STRIPPED_TIME_LOG.get()); + output.accept(TFBlocks.STRIPPED_TRANSFORMATION_LOG.get()); + output.accept(TFBlocks.STRIPPED_MINING_LOG.get()); + output.accept(TFBlocks.STRIPPED_SORTING_LOG.get()); + output.accept(TFBlocks.HOLLOW_DARK_OAK_LOG_HORIZONTAL.get()); + output.accept(TFBlocks.STRIPPED_TWILIGHT_OAK_WOOD.get()); + output.accept(TFBlocks.STRIPPED_CANOPY_WOOD.get()); + output.accept(TFBlocks.STRIPPED_MANGROVE_WOOD.get()); + output.accept(TFBlocks.STRIPPED_DARK_WOOD.get()); + output.accept(TFBlocks.STRIPPED_TIME_WOOD.get()); + output.accept(TFBlocks.STRIPPED_TRANSFORMATION_WOOD.get()); + output.accept(TFBlocks.STRIPPED_MINING_WOOD.get()); + output.accept(TFBlocks.STRIPPED_SORTING_WOOD.get()); + output.accept(TFBlocks.HOLLOW_CRIMSON_STEM_HORIZONTAL.get()); + output.accept(TFBlocks.ROOT_BLOCK.get()); + output.accept(TFBlocks.LIVEROOT_BLOCK.get()); + output.accept(TFBlocks.MANGROVE_ROOT.get()); + output.accept(TFBlocks.CANOPY_BOOKSHELF.get()); + output.accept(TFBlocks.TIME_LOG_CORE.get()); + output.accept(TFBlocks.TRANSFORMATION_LOG_CORE.get()); + output.accept(TFBlocks.MINING_LOG_CORE.get()); + output.accept(TFBlocks.SORTING_LOG_CORE.get()); + output.accept(TFBlocks.HOLLOW_WARPED_STEM_HORIZONTAL.get()); + output.accept(TFBlocks.HOLLOW_TWILIGHT_OAK_LOG_HORIZONTAL.get()); + output.accept(TFBlocks.HOLLOW_CANOPY_LOG_HORIZONTAL.get()); + output.accept(TFBlocks.HOLLOW_MANGROVE_LOG_HORIZONTAL.get()); + output.accept(TFBlocks.HOLLOW_DARK_LOG_HORIZONTAL.get()); + output.accept(TFBlocks.HOLLOW_TIME_LOG_HORIZONTAL.get()); + output.accept(TFBlocks.HOLLOW_TRANSFORMATION_LOG_HORIZONTAL.get()); + output.accept(TFBlocks.HOLLOW_MINING_LOG_HORIZONTAL.get()); + output.accept(TFBlocks.HOLLOW_SORTING_LOG_HORIZONTAL.get()); + output.accept(TFBlocks.HOLLOW_VANGROVE_LOG_HORIZONTAL.get()); + output.accept(TFBlocks.TWILIGHT_OAK_LEAVES.get()); + output.accept(TFBlocks.CANOPY_LEAVES.get()); + output.accept(TFBlocks.MANGROVE_LEAVES.get()); + output.accept(TFBlocks.DARK_LEAVES.get()); + output.accept(TFBlocks.TIME_LEAVES.get()); + output.accept(TFBlocks.TRANSFORMATION_LEAVES.get()); + output.accept(TFBlocks.MINING_LEAVES.get()); + output.accept(TFBlocks.SORTING_LEAVES.get()); + output.accept(TFBlocks.RAINBOW_OAK_LEAVES.get()); + output.accept(TFBlocks.TWILIGHT_OAK_SAPLING.get()); + output.accept(TFBlocks.CANOPY_SAPLING.get()); + output.accept(TFBlocks.MANGROVE_SAPLING.get()); + output.accept(TFBlocks.DARKWOOD_SAPLING.get()); + output.accept(TFBlocks.TIME_SAPLING.get()); + output.accept(TFBlocks.TRANSFORMATION_SAPLING.get()); + output.accept(TFBlocks.MINING_SAPLING.get()); + output.accept(TFBlocks.SORTING_SAPLING.get()); + output.accept(TFBlocks.RAINBOW_OAK_SAPLING.get()); + output.accept(TFBlocks.HOLLOW_OAK_SAPLING.get()); + output.accept(TFBlocks.MOSS_PATCH.get()); + output.accept(TFBlocks.MAYAPPLE.get()); + output.accept(TFBlocks.CLOVER_PATCH.get()); + output.accept(TFBlocks.FIDDLEHEAD.get()); + output.accept(TFBlocks.MUSHGLOOM.get()); + output.accept(TFBlocks.TORCHBERRY_PLANT.get()); + output.accept(TFBlocks.FALLEN_LEAVES.get()); + output.accept(TFBlocks.ROOT_STRAND.get()); + output.accept(TFBlocks.TROLLVIDR.get()); + output.accept(TFBlocks.UNRIPE_TROLLBER.get()); + output.accept(TFBlocks.TROLLBER.get()); + output.accept(TFBlocks.HUGE_MUSHGLOOM.get()); + output.accept(TFBlocks.HUGE_MUSHGLOOM_STEM.get()); + output.accept(TFBlocks.HUGE_STALK.get()); + output.accept(TFBlocks.BEANSTALK_LEAVES.get()); + output.accept(TFBlocks.HUGE_WATER_LILY.get()); + output.accept(TFBlocks.HUGE_LILY_PAD.get()); + output.accept(TFBlocks.BROWN_THORNS.get()); + output.accept(TFBlocks.GREEN_THORNS.get()); + output.accept(TFBlocks.BURNT_THORNS.get()); + output.accept(TFBlocks.THORN_ROSE.get()); + output.accept(TFBlocks.THORN_LEAVES.get()); + output.accept(TFBlocks.HEDGE.get()); + output.accept(TFBlocks.FIREFLY_JAR.get()); + output.accept(TFBlocks.CICADA_JAR.get()); + output.accept(TFBlocks.FIREFLY_SPAWNER.get()); + output.accept(TFBlocks.FIREFLY.get()); + output.accept(TFBlocks.CICADA.get()); + output.accept(TFBlocks.MOONWORM.get()); + output.accept(TFBlocks.IRONWOOD_BLOCK.get()); + output.accept(TFBlocks.STEELEAF_BLOCK.get()); + output.accept(TFBlocks.FIERY_BLOCK.get()); + output.accept(TFBlocks.KNIGHTMETAL_BLOCK.get()); + output.accept(TFBlocks.CARMINITE_BLOCK.get()); + output.accept(TFBlocks.ARCTIC_FUR_BLOCK.get()); + output.accept(TFBlocks.NAGA_TROPHY.get()); + output.accept(TFBlocks.LICH_TROPHY.get()); + output.accept(TFBlocks.MINOSHROOM_TROPHY.get()); + output.accept(TFBlocks.HYDRA_TROPHY.get()); + output.accept(TFBlocks.KNIGHT_PHANTOM_TROPHY.get()); + output.accept(TFBlocks.UR_GHAST_TROPHY.get()); + output.accept(TFBlocks.ALPHA_YETI_TROPHY.get()); + output.accept(TFBlocks.SNOW_QUEEN_TROPHY.get()); + output.accept(TFBlocks.QUEST_RAM_TROPHY.get()); + output.accept(TFBlocks.NAGA_BOSS_SPAWNER.get()); + output.accept(TFBlocks.LICH_BOSS_SPAWNER.get()); + output.accept(TFBlocks.MINOSHROOM_BOSS_SPAWNER.get()); + output.accept(TFBlocks.HYDRA_BOSS_SPAWNER.get()); + output.accept(TFBlocks.KNIGHT_PHANTOM_BOSS_SPAWNER.get()); + output.accept(TFBlocks.UR_GHAST_BOSS_SPAWNER.get()); + output.accept(TFBlocks.ALPHA_YETI_BOSS_SPAWNER.get()); + output.accept(TFBlocks.SNOW_QUEEN_BOSS_SPAWNER.get()); + output.accept(TFBlocks.FINAL_BOSS_BOSS_SPAWNER.get()); + output.accept(TFBlocks.TWILIGHT_PORTAL_MINIATURE_STRUCTURE.get()); + output.accept(TFBlocks.NAGA_COURTYARD_MINIATURE_STRUCTURE.get()); + output.accept(TFBlocks.LICH_TOWER_MINIATURE_STRUCTURE.get()); + output.accept(TFBlocks.ETCHED_NAGASTONE.get()); + output.accept(TFBlocks.CRACKED_ETCHED_NAGASTONE.get()); + output.accept(TFBlocks.MOSSY_ETCHED_NAGASTONE.get()); + output.accept(TFBlocks.NAGASTONE_PILLAR.get()); + output.accept(TFBlocks.CRACKED_NAGASTONE_PILLAR.get()); + output.accept(TFBlocks.MOSSY_NAGASTONE_PILLAR.get()); + output.accept(TFBlocks.NAGASTONE_STAIRS_LEFT.get()); + output.accept(TFBlocks.CRACKED_NAGASTONE_STAIRS_LEFT.get()); + output.accept(TFBlocks.MOSSY_NAGASTONE_STAIRS_LEFT.get()); + output.accept(TFBlocks.NAGASTONE_STAIRS_RIGHT.get()); + output.accept(TFBlocks.CRACKED_NAGASTONE_STAIRS_RIGHT.get()); + output.accept(TFBlocks.MOSSY_NAGASTONE_STAIRS_RIGHT.get()); + output.accept(TFBlocks.NAGASTONE_HEAD.get()); + output.accept(TFBlocks.NAGASTONE.get()); + output.accept(TFBlocks.SPIRAL_BRICKS.get()); + output.accept(TFBlocks.BOLD_STONE_PILLAR.get()); + output.accept(TFBlocks.TWISTED_STONE.get()); + output.accept(TFBlocks.TWISTED_STONE_PILLAR.get()); + output.accept(TFBlocks.CANDELABRA.get()); + makeSkullCandle(output, TFBlocks.ZOMBIE_SKULL_CANDLE.get()); + makeSkullCandle(output, TFBlocks.SKELETON_SKULL_CANDLE.get()); + makeSkullCandle(output, TFBlocks.WITHER_SKELE_SKULL_CANDLE.get()); + makeSkullCandle(output, TFBlocks.CREEPER_SKULL_CANDLE.get()); + makeSkullCandle(output, TFBlocks.PLAYER_SKULL_CANDLE.get()); + output.accept(TFBlocks.DEATH_TOME_SPAWNER.get()); + output.accept(TFBlocks.EMPTY_CANOPY_BOOKSHELF.get()); + output.accept(TFBlocks.KEEPSAKE_CASKET.get()); + output.accept(TFBlocks.SMOKER.get()); + output.accept(TFBlocks.FIRE_JET.get()); + output.accept(TFBlocks.MAZESTONE.get()); + output.accept(TFBlocks.MAZESTONE_BRICK.get()); + output.accept(TFBlocks.CRACKED_MAZESTONE.get()); + output.accept(TFBlocks.MOSSY_MAZESTONE.get()); + output.accept(TFBlocks.DECORATIVE_MAZESTONE.get()); + output.accept(TFBlocks.CUT_MAZESTONE.get()); + output.accept(TFBlocks.MAZESTONE_MOSAIC.get()); + output.accept(TFBlocks.MAZESTONE_BORDER.get()); + output.accept(TFBlocks.UNDERBRICK.get()); + output.accept(TFBlocks.CRACKED_UNDERBRICK.get()); + output.accept(TFBlocks.MOSSY_UNDERBRICK.get()); + output.accept(TFBlocks.UNDERBRICK_FLOOR.get()); + output.accept(TFBlocks.STRONGHOLD_SHIELD.get()); + output.accept(TFBlocks.TROPHY_PEDESTAL.get()); + output.accept(TFBlocks.TOWERWOOD.get()); + output.accept(TFBlocks.CRACKED_TOWERWOOD.get()); + output.accept(TFBlocks.MOSSY_TOWERWOOD.get()); + output.accept(TFBlocks.INFESTED_TOWERWOOD.get()); + output.accept(TFBlocks.ENCASED_TOWERWOOD.get()); + output.accept(TFBlocks.ENCASED_SMOKER.get()); + output.accept(TFBlocks.ENCASED_FIRE_JET.get()); + output.accept(TFBlocks.GHAST_TRAP.get()); + output.accept(TFBlocks.VANISHING_BLOCK.get()); + output.accept(TFBlocks.REAPPEARING_BLOCK.get()); + output.accept(TFBlocks.LOCKED_VANISHING_BLOCK.get()); + output.accept(TFBlocks.CARMINITE_BUILDER.get()); + output.accept(TFBlocks.ANTIBUILDER.get()); + output.accept(TFBlocks.CARMINITE_REACTOR.get()); + output.accept(TFBlocks.AURORA_BLOCK.get()); + output.accept(TFBlocks.AURORA_PILLAR.get()); + output.accept(TFBlocks.AURORA_SLAB.get()); + output.accept(TFBlocks.AURORALIZED_GLASS.get()); + output.accept(TFBlocks.TROLLSTEINN.get()); + output.accept(TFBlocks.UBEROUS_SOIL.get()); + output.accept(TFBlocks.WISPY_CLOUD.get()); + output.accept(TFBlocks.FLUFFY_CLOUD.get()); + output.accept(TFBlocks.GIANT_COBBLESTONE.get()); + output.accept(TFBlocks.GIANT_LOG.get()); + output.accept(TFBlocks.GIANT_LEAVES.get()); + output.accept(TFBlocks.GIANT_OBSIDIAN.get()); + output.accept(TFBlocks.DEADROCK.get()); + output.accept(TFBlocks.CRACKED_DEADROCK.get()); + output.accept(TFBlocks.WEATHERED_DEADROCK.get()); + output.accept(TFBlocks.CASTLE_BRICK.get()); + output.accept(TFBlocks.WORN_CASTLE_BRICK.get()); + output.accept(TFBlocks.CRACKED_CASTLE_BRICK.get()); + output.accept(TFBlocks.MOSSY_CASTLE_BRICK.get()); + output.accept(TFBlocks.THICK_CASTLE_BRICK.get()); + output.accept(TFBlocks.CASTLE_ROOF_TILE.get()); + output.accept(TFBlocks.ENCASED_CASTLE_BRICK_PILLAR.get()); + output.accept(TFBlocks.ENCASED_CASTLE_BRICK_TILE.get()); + output.accept(TFBlocks.BOLD_CASTLE_BRICK_PILLAR.get()); + output.accept(TFBlocks.BOLD_CASTLE_BRICK_TILE.get()); + output.accept(TFBlocks.CASTLE_BRICK_STAIRS.get()); + output.accept(TFBlocks.WORN_CASTLE_BRICK_STAIRS.get()); + output.accept(TFBlocks.CRACKED_CASTLE_BRICK_STAIRS.get()); + output.accept(TFBlocks.MOSSY_CASTLE_BRICK_STAIRS.get()); + output.accept(TFBlocks.ENCASED_CASTLE_BRICK_STAIRS.get()); + output.accept(TFBlocks.BOLD_CASTLE_BRICK_STAIRS.get()); + output.accept(TFBlocks.PINK_CASTLE_RUNE_BRICK.get()); + output.accept(TFBlocks.YELLOW_CASTLE_RUNE_BRICK.get()); + output.accept(TFBlocks.BLUE_CASTLE_RUNE_BRICK.get()); + output.accept(TFBlocks.VIOLET_CASTLE_RUNE_BRICK.get()); + output.accept(TFBlocks.PINK_CASTLE_DOOR.get()); + output.accept(TFBlocks.YELLOW_CASTLE_DOOR.get()); + output.accept(TFBlocks.BLUE_CASTLE_DOOR.get()); + output.accept(TFBlocks.VIOLET_CASTLE_DOOR.get()); + output.accept(TFBlocks.PINK_FORCE_FIELD.get()); + output.accept(TFBlocks.ORANGE_FORCE_FIELD.get()); + output.accept(TFBlocks.GREEN_FORCE_FIELD.get()); + output.accept(TFBlocks.BLUE_FORCE_FIELD.get()); + output.accept(TFBlocks.VIOLET_FORCE_FIELD.get()); + output.accept(TFBlocks.CINDER_FURNACE.get()); + output.accept(TFBlocks.CINDER_LOG.get()); + output.accept(TFBlocks.CINDER_WOOD.get()); + output.accept(TFBlocks.SLIDER.get()); + output.accept(TFBlocks.UNCRAFTING_TABLE.get()); + output.accept(TFBlocks.IRON_LADDER.get()); + })); + + CreativeModeTab ITEMS = event.registerCreativeModeTab(TwilightForestMod.prefix("items"), List.of(), List.of(BLOCKS), builder -> builder + .title(Component.translatable("itemGroup.twilightforest.items")) + .icon(() -> new ItemStack(TFBlocks.TWILIGHT_PORTAL_MINIATURE_STRUCTURE.get())) + .displayItems((parameters, output) -> { + output.accept(TFItems.TORCHBERRIES.get()); + output.accept(TFItems.RAVEN_FEATHER.get()); + output.accept(TFItems.MAGIC_MAP_FOCUS.get()); + output.accept(TFItems.MAZE_MAP_FOCUS.get()); + output.accept(TFItems.MAGIC_MAP.get()); + output.accept(TFItems.MAZE_MAP.get()); + output.accept(TFItems.ORE_MAP.get()); + output.accept(TFItems.ORE_METER.get()); + output.accept(TFItems.MOON_DIAL.get()); + output.accept(TFItems.LIVEROOT.get()); + output.accept(TFItems.RAW_IRONWOOD.get()); + output.accept(TFItems.IRONWOOD_INGOT.get()); + output.accept(TFItems.STEELEAF_INGOT.get()); + output.accept(TFItems.NAGA_SCALE.get()); + output.accept(TFItems.ARMOR_SHARD.get()); + output.accept(TFItems.ARMOR_SHARD_CLUSTER.get()); + output.accept(TFItems.KNIGHTMETAL_INGOT.get()); + output.accept(TFItems.KNIGHTMETAL_RING.get()); + output.accept(TFItems.FIERY_BLOOD.get()); + output.accept(TFItems.FIERY_TEARS.get()); + output.accept(TFItems.FIERY_INGOT.get()); + output.accept(TFItems.ARCTIC_FUR.get()); + output.accept(TFItems.ALPHA_YETI_FUR.get()); + output.accept(TFItems.RAW_VENISON.get()); + output.accept(TFItems.COOKED_VENISON.get()); + output.accept(TFItems.RAW_MEEF.get()); + output.accept(TFItems.COOKED_MEEF.get()); + output.accept(TFItems.MAZE_WAFER.get()); + output.accept(TFItems.MEEF_STROGANOFF.get()); + output.accept(TFItems.HYDRA_CHOP.get()); + output.accept(TFItems.EXPERIMENT_115.get()); + output.accept(TFItems.CHARM_OF_LIFE_1.get()); + output.accept(TFItems.CHARM_OF_LIFE_2.get()); + output.accept(TFItems.CHARM_OF_KEEPING_1.get()); + output.accept(TFItems.CHARM_OF_KEEPING_2.get()); + output.accept(TFItems.CHARM_OF_KEEPING_3.get()); + output.accept(TFItems.BORER_ESSENCE.get()); + output.accept(TFItems.CARMINITE.get()); + output.accept(TFItems.TOWER_KEY.get()); + output.accept(TFItems.TRANSFORMATION_POWDER.get()); + output.accept(TFItems.BRITTLE_FLASK.get()); + output.accept(TFItems.GREATER_FLASK.get()); + output.accept(TFItems.RED_THREAD.get()); + output.accept(TFItems.MAGIC_BEANS.get()); + output.accept(TFItems.CUBE_TALISMAN.get()); + output.accept(TFItems.MUSIC_DISC_THREAD.get()); + output.accept(TFItems.MUSIC_DISC_FINDINGS.get()); + output.accept(TFItems.MUSIC_DISC_RADIANCE.get()); + output.accept(TFItems.MUSIC_DISC_STEPS.get()); + output.accept(TFItems.MUSIC_DISC_MOTION.get()); + output.accept(TFItems.MUSIC_DISC_WAYFARER.get()); + output.accept(TFItems.MUSIC_DISC_HOME.get()); + output.accept(TFItems.MUSIC_DISC_MAKER.get()); + output.accept(TFItems.MUSIC_DISC_SUPERSTITIOUS.get()); + output.accept(TFItems.NAGA_BANNER_PATTERN.get()); + output.accept(TFItems.LICH_BANNER_PATTERN.get()); + output.accept(TFItems.MINOSHROOM_BANNER_PATTERN.get()); + output.accept(TFItems.HYDRA_BANNER_PATTERN.get()); + output.accept(TFItems.KNIGHT_PHANTOM_BANNER_PATTERN.get()); + output.accept(TFItems.UR_GHAST_BANNER_PATTERN.get()); + output.accept(TFItems.ALPHA_YETI_BANNER_PATTERN.get()); + output.accept(TFItems.SNOW_QUEEN_BANNER_PATTERN.get()); + output.accept(TFItems.QUEST_RAM_BANNER_PATTERN.get()); + output.accept(TFItems.TWILIGHT_OAK_BOAT.get()); + output.accept(TFItems.CANOPY_BOAT.get()); + output.accept(TFItems.MANGROVE_BOAT.get()); + output.accept(TFItems.DARKWOOD_BOAT.get()); + output.accept(TFItems.TIME_BOAT.get()); + output.accept(TFItems.TRANSFORMATION_BOAT.get()); + output.accept(TFItems.MINING_BOAT.get()); + output.accept(TFItems.SORTING_BOAT.get()); + output.accept(TFItems.TWILIGHT_OAK_CHEST_BOAT.get()); + output.accept(TFItems.CANOPY_CHEST_BOAT.get()); + output.accept(TFItems.MANGROVE_CHEST_BOAT.get()); + output.accept(TFItems.DARKWOOD_CHEST_BOAT.get()); + output.accept(TFItems.TIME_CHEST_BOAT.get()); + output.accept(TFItems.TRANSFORMATION_CHEST_BOAT.get()); + output.accept(TFItems.MINING_CHEST_BOAT.get()); + output.accept(TFItems.SORTING_CHEST_BOAT.get()); + createSpawnEggsAlphabetical(output); + })); + + event.registerCreativeModeTab(TwilightForestMod.prefix("equipment"), List.of(), List.of(ITEMS), builder -> builder + .title(Component.translatable("itemGroup.twilightforest.equipment")) + .icon(() -> new ItemStack(TFItems.KNIGHTMETAL_PICKAXE.get())) + .displayItems((parameters, output) -> { + generateGearWithEnchants(output, TFItems.IRONWOOD_HELMET.get(), new EnchantmentInstance(Enchantments.AQUA_AFFINITY, 1)); + generateGearWithEnchants(output, TFItems.IRONWOOD_CHESTPLATE.get(), new EnchantmentInstance(Enchantments.ALL_DAMAGE_PROTECTION, 1)); + generateGearWithEnchants(output, TFItems.IRONWOOD_LEGGINGS.get(), new EnchantmentInstance(Enchantments.ALL_DAMAGE_PROTECTION, 1)); + generateGearWithEnchants(output, TFItems.IRONWOOD_BOOTS.get(), new EnchantmentInstance(Enchantments.FALL_PROTECTION, 1)); + generateGearWithEnchants(output, TFItems.IRONWOOD_SWORD.get(), new EnchantmentInstance(Enchantments.UNBREAKING, 1)); + generateGearWithEnchants(output, TFItems.IRONWOOD_SHOVEL.get(), new EnchantmentInstance(Enchantments.UNBREAKING, 1)); + generateGearWithEnchants(output, TFItems.IRONWOOD_PICKAXE.get(), new EnchantmentInstance(Enchantments.BLOCK_EFFICIENCY, 1)); + generateGearWithEnchants(output, TFItems.IRONWOOD_AXE.get(), new EnchantmentInstance(Enchantments.BLOCK_FORTUNE, 1)); + generateGearWithEnchants(output, TFItems.IRONWOOD_HOE.get(), new EnchantmentInstance(Enchantments.BLOCK_EFFICIENCY, 1)); + generateGearWithEnchants(output, TFItems.STEELEAF_HELMET.get(), new EnchantmentInstance(Enchantments.PROJECTILE_PROTECTION, 2)); + generateGearWithEnchants(output, TFItems.STEELEAF_CHESTPLATE.get(), new EnchantmentInstance(Enchantments.BLAST_PROTECTION, 2)); + generateGearWithEnchants(output, TFItems.STEELEAF_LEGGINGS.get(), new EnchantmentInstance(Enchantments.FIRE_PROTECTION, 2)); + generateGearWithEnchants(output, TFItems.STEELEAF_BOOTS.get(), new EnchantmentInstance(Enchantments.FALL_PROTECTION, 2)); + generateGearWithEnchants(output, TFItems.STEELEAF_SWORD.get(), new EnchantmentInstance(Enchantments.MOB_LOOTING, 2)); + generateGearWithEnchants(output, TFItems.STEELEAF_SHOVEL.get(), new EnchantmentInstance(Enchantments.BLOCK_EFFICIENCY, 2)); + generateGearWithEnchants(output, TFItems.STEELEAF_PICKAXE.get(), new EnchantmentInstance(Enchantments.BLOCK_FORTUNE, 2)); + generateGearWithEnchants(output, TFItems.STEELEAF_AXE.get(), new EnchantmentInstance(Enchantments.BLOCK_EFFICIENCY, 2)); + generateGearWithEnchants(output, TFItems.STEELEAF_HOE.get(), new EnchantmentInstance(Enchantments.BLOCK_FORTUNE, 2)); + output.accept(TFItems.KNIGHTMETAL_HELMET.get()); + output.accept(TFItems.KNIGHTMETAL_CHESTPLATE.get()); + output.accept(TFItems.KNIGHTMETAL_LEGGINGS.get()); + output.accept(TFItems.KNIGHTMETAL_BOOTS.get()); + output.accept(TFItems.KNIGHTMETAL_SWORD.get()); + output.accept(TFItems.KNIGHTMETAL_PICKAXE.get()); + output.accept(TFItems.KNIGHTMETAL_AXE.get()); + output.accept(TFItems.BLOCK_AND_CHAIN.get()); + output.accept(TFItems.KNIGHTMETAL_SHIELD.get()); + output.accept(TFItems.FIERY_HELMET.get()); + output.accept(TFItems.FIERY_CHESTPLATE.get()); + output.accept(TFItems.FIERY_LEGGINGS.get()); + output.accept(TFItems.FIERY_BOOTS.get()); + output.accept(TFItems.FIERY_SWORD.get()); + output.accept(TFItems.FIERY_PICKAXE.get()); + generateGearWithEnchants(output, TFItems.MAZEBREAKER_PICKAXE.get(), new EnchantmentInstance(Enchantments.BLOCK_EFFICIENCY, 4), new EnchantmentInstance(Enchantments.UNBREAKING, 3), new EnchantmentInstance(Enchantments.BLOCK_FORTUNE, 2)); + output.accept(TFItems.GOLDEN_MINOTAUR_AXE.get()); + output.accept(TFItems.DIAMOND_MINOTAUR_AXE.get()); + output.accept(TFItems.ARCTIC_HELMET.get()); + output.accept(TFItems.ARCTIC_CHESTPLATE.get()); + output.accept(TFItems.ARCTIC_LEGGINGS.get()); + output.accept(TFItems.ARCTIC_BOOTS.get()); + output.accept(TFItems.ICE_SWORD.get()); + output.accept(TFItems.TRIPLE_BOW.get()); + output.accept(TFItems.SEEKER_BOW.get()); + output.accept(TFItems.ICE_BOW.get()); + output.accept(TFItems.ENDER_BOW.get()); + generateGearWithEnchants(output, TFItems.YETI_HELMET.get(), new EnchantmentInstance(Enchantments.ALL_DAMAGE_PROTECTION, 2)); + generateGearWithEnchants(output, TFItems.YETI_CHESTPLATE.get(), new EnchantmentInstance(Enchantments.ALL_DAMAGE_PROTECTION, 2)); + generateGearWithEnchants(output, TFItems.YETI_LEGGINGS.get(), new EnchantmentInstance(Enchantments.ALL_DAMAGE_PROTECTION, 2)); + generateGearWithEnchants(output, TFItems.YETI_BOOTS.get(), new EnchantmentInstance(Enchantments.ALL_DAMAGE_PROTECTION, 2), new EnchantmentInstance(Enchantments.FALL_PROTECTION, 4)); + output.accept(TFItems.GIANT_SWORD.get()); + output.accept(TFItems.GIANT_PICKAXE.get()); + createGlassSwordAndLoreVer(output); + output.accept(TFItems.ICE_BOMB.get()); + output.accept(TFItems.PHANTOM_HELMET.get()); + output.accept(TFItems.PHANTOM_CHESTPLATE.get()); + generateGearWithEnchants(output, TFItems.NAGA_CHESTPLATE.get(), new EnchantmentInstance(Enchantments.FIRE_PROTECTION, 3)); + generateGearWithEnchants(output, TFItems.NAGA_LEGGINGS.get(), new EnchantmentInstance(Enchantments.ALL_DAMAGE_PROTECTION, 3)); + output.accept(TFItems.TWILIGHT_SCEPTER.get()); + output.accept(TFItems.LIFEDRAIN_SCEPTER.get()); + output.accept(TFItems.ZOMBIE_SCEPTER.get()); + output.accept(TFItems.FORTIFICATION_SCEPTER.get()); + output.accept(TFItems.LAMP_OF_CINDERS.get()); + output.accept(TFItems.ORE_MAGNET.get()); + output.accept(TFItems.CRUMBLE_HORN.get()); + output.accept(TFItems.PEACOCK_FEATHER_FAN.get()); + output.accept(TFItems.MOONWORM_QUEEN.get()); + output.accept(TFItems.CUBE_OF_ANNIHILATION.get()); + tfEnchants(output, CreativeModeTab.TabVisibility.PARENT_TAB_ONLY); + tfEnchants(output, CreativeModeTab.TabVisibility.SEARCH_TAB_ONLY); + })); + } + + private static void tfEnchants(CreativeModeTab.Output output, CreativeModeTab.TabVisibility visibility) { + for (RegistryObject enchantment : TFEnchantments.ENCHANTMENTS.getEntries()) { + if (visibility == CreativeModeTab.TabVisibility.PARENT_TAB_ONLY) { + output.accept(EnchantedBookItem.createForEnchantment(new EnchantmentInstance(enchantment.get(), enchantment.get().getMaxLevel())), visibility); + } else { + for (int i = enchantment.get().getMinLevel(); i <= enchantment.get().getMaxLevel(); ++i) { + output.accept(EnchantedBookItem.createForEnchantment(new EnchantmentInstance(enchantment.get(), i)), visibility); + } + } + } + } + + private static void generateGearWithEnchants(CreativeModeTab.Output output, Item item, EnchantmentInstance... instances) { + ItemStack stack = new ItemStack(item); + if (TFConfig.COMMON_CONFIG.defaultItemEnchants.get()) { + for (EnchantmentInstance enchant : instances) { + stack.enchant(enchant.enchantment, enchant.level); + } + } + output.accept(stack); + } + + private static void createSpawnEggsAlphabetical(CreativeModeTab.Output output) { + Collection eggs = TFEntities.SPAWN_EGGS.getEntries().stream().map(RegistryObject::get).toList(); + eggs.forEach(output::accept); + } + + private static void makeSkullCandle(CreativeModeTab.Output output, ItemLike item) { + ItemStack stack = new ItemStack(item); + CompoundTag tag = new CompoundTag(); + tag.putInt("CandleAmount", 1); + tag.putInt("CandleColor", 0); + stack.addTagElement("BlockEntityTag", tag); + output.accept(stack); + } + + private static void createGlassSwordAndLoreVer(CreativeModeTab.Output output) { + output.accept(TFItems.GLASS_SWORD.get()); + ItemStack loreSword = new ItemStack(TFItems.GLASS_SWORD.get()); + CompoundTag tags = new CompoundTag(); + tags.putBoolean("Unbreakable", true); + + ListTag lore = new ListTag(); + lore.add(StringTag.valueOf("{\"translate\":\"item.twilightforest.glass_sword.desc\",\"italic\":false,\"color\":\"gray\"}")); + // uncomment if someone asks if this will ever generate as loot +// lore.add(StringTag.valueOf("{\"translate\":\"item.twilightforest.glass_sword.desc2\",\"italic\":false,\"color\":\"gray\"}")); + + CompoundTag display = new CompoundTag(); + display.put("Lore", lore); + + tags.put("display", display); + loreSword.setTag(tags); + output.accept(loreSword); + } +} diff --git a/src/main/java/twilightforest/init/TFDamageTypes.java b/src/main/java/twilightforest/init/TFDamageTypes.java new file mode 100644 index 0000000000..4cc52099f9 --- /dev/null +++ b/src/main/java/twilightforest/init/TFDamageTypes.java @@ -0,0 +1,105 @@ +package twilightforest.init; + +import net.minecraft.core.registries.Registries; +import net.minecraft.data.worldgen.BootstapContext; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.damagesource.*; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.level.Level; +import org.jetbrains.annotations.Nullable; +import twilightforest.TwilightForestMod; +import twilightforest.util.EntityExcludedDamageSource; + +public class TFDamageTypes { + public static final ResourceKey GHAST_TEAR = create("ghast_tear"); //Ur-Ghast + public static final ResourceKey HYDRA_BITE = create("hydra_bite"); //Hydra + public static final ResourceKey HYDRA_FIRE = create("hydra_fire"); //Hydra + + public static final ResourceKey HYDRA_MORTAR = create("hydra_mortar"); //Hydra + public static final ResourceKey LICH_BOLT = create("lich_bolt"); //Lich + public static final ResourceKey LICH_BOMB = create("lich_bomb"); //Lich + public static final ResourceKey CHILLING_BREATH = create("chilling_breath"); //Snow Queen + public static final ResourceKey SQUISH = create("squish"); //Snow Queen + public static final ResourceKey THROWN_AXE = create("thrown_axe"); + public static final ResourceKey THROWN_PICKAXE = create("thrown_pickaxe"); + public static final ResourceKey THORNS = create("thorns"); + public static final ResourceKey KNIGHTMETAL = create("knightmetal"); + public static final ResourceKey FIERY = create("fiery"); + public static final ResourceKey FIRE_JET = create("fire_jet"); + public static final ResourceKey REACTOR = create("reactor"); + public static final ResourceKey SLIDER = create("slider"); + public static final ResourceKey THROWN_BLOCK = create("thrown_block"); + public static final ResourceKey AXING = create("axing"); //Minotaur, Minoshroom + public static final ResourceKey SLAM = create("slam"); //Minoshroom + public static final ResourceKey YEETED = create("yeeted"); //Yeti, Alpha Yeti + public static final ResourceKey ANT = create("ant"); //Giants + public static final ResourceKey HAUNT = create("haunt"); //Knight Phantom, Wraith + public static final ResourceKey CLAMPED = create("clamped"); //Pinch Beetle + public static final ResourceKey SCORCHED = create("scorched"); //Fire Beetle + public static final ResourceKey FROZEN = create("frozen"); // + public static final ResourceKey SPIKED = create("spiked"); //Block and Chain + public static final ResourceKey LEAF_BRAIN = create("leaf_brain"); //Skeleton Druid + public static final ResourceKey LOST_WORDS = create("lost_words"); //Death Tome + public static final ResourceKey SCHOOLED = create("schooled"); //Death Tome 2 + public static final ResourceKey SNOWBALL_FIGHT = create("snowball_fight"); //Ice Core + public static final ResourceKey TWILIGHT_SCEPTER = create("twilight_scepter"); + public static final ResourceKey LIFEDRAIN = create("lifedrain"); + public static final ResourceKey EXPIRED = create("expired"); + public static final ResourceKey FALLING_ICE = create("falling_ice"); + public static final ResourceKey MOONWORM = create("moonworm"); //Moonworm + + public static ResourceKey create(String name) { + return ResourceKey.create(Registries.DAMAGE_TYPE, TwilightForestMod.prefix(name)); + } + + public static DamageSource getDamageSource(Level level, ResourceKey type, EntityType... toIgnore) { + return getEntityDamageSource(level, type, null, toIgnore); + } + + public static DamageSource getEntityDamageSource(Level level, ResourceKey type, @Nullable Entity attacker, EntityType... toIgnore) { + return getIndirectEntityDamageSource(level, type, attacker, attacker, toIgnore); + } + + public static DamageSource getIndirectEntityDamageSource(Level level, ResourceKey type, @Nullable Entity attacker, @Nullable Entity indirectAttacker, EntityType... toIgnore) { + return toIgnore.length > 0 ? new EntityExcludedDamageSource(level.registryAccess().registryOrThrow(Registries.DAMAGE_TYPE).getHolderOrThrow(type), toIgnore) : new DamageSource(level.registryAccess().registryOrThrow(Registries.DAMAGE_TYPE).getHolderOrThrow(type), attacker, indirectAttacker); + } + + public static void bootstrap(BootstapContext context) { + context.register(GHAST_TEAR, new DamageType("twilightforest.ghastTear", 0.0F)); + context.register(HYDRA_BITE, new DamageType("twilightforest.hydraBite", 0.0F)); + context.register(HYDRA_FIRE, new DamageType("twilightforest.hydraFire", 0.0F)); + context.register(HYDRA_MORTAR, new DamageType("onFire", 0.0F, DamageEffects.BURNING)); + context.register(LICH_BOLT, new DamageType("twilightforest.lichBolt", 0.0F)); + context.register(LICH_BOMB, new DamageType("twilightforest.lichBomb", 0.0F)); + context.register(CHILLING_BREATH, new DamageType("twilightforest.chillingBreath", 0.0F, DamageEffects.FREEZING)); + context.register(SQUISH, new DamageType("twilightforest.squish", 0.0F)); + context.register(THROWN_AXE, new DamageType("twilightforest.thrownAxe", 0.0F)); + context.register(THROWN_PICKAXE, new DamageType("twilightforest.thrownPickaxe", 0.0F)); + context.register(THORNS, new DamageType("twilightforest.thorns", 0.1F)); + context.register(KNIGHTMETAL, new DamageType("twilightforest.knightmetal", 0.1F)); + context.register(FIERY, new DamageType("twilightforest.fiery", 0.1F, DamageEffects.BURNING)); + context.register(FIRE_JET, new DamageType("twilightforest.fireJet", 0.1F, DamageEffects.BURNING)); + context.register(REACTOR, new DamageType("twilightforest.reactor", 0.1F)); + context.register(SLIDER, new DamageType("twilightforest.slider", 0.1F)); + context.register(THROWN_BLOCK, new DamageType("twilightforest.thrownBlock", 0.1F)); + context.register(AXING, new DamageType("twilightforest.axing", 0.1F)); + context.register(SLAM, new DamageType("twilightforest.axing", 0.1F)); + context.register(YEETED, new DamageType("twilightforest.yeeted", 0.1F)); + context.register(ANT, new DamageType("twilightforest.ant", 0.1F)); + context.register(HAUNT, new DamageType("twilightforest.haunt", 0.1F)); + context.register(CLAMPED, new DamageType("twilightforest.clamped", 0.1F)); + context.register(SCORCHED, new DamageType("twilightforest.scorched", 0.1F, DamageEffects.BURNING)); + context.register(FROZEN, new DamageType("twilightforest.frozen", 0.1F, DamageEffects.FREEZING)); + context.register(SPIKED, new DamageType("twilightforest.spiked", 0.1F)); + context.register(LEAF_BRAIN, new DamageType("twilightforest.leafBrain", 0.1F)); + context.register(LOST_WORDS, new DamageType("twilightforest.lostWords", 0.1F)); + context.register(SCHOOLED, new DamageType("twilightforest.schooled", 0.1F)); + context.register(SNOWBALL_FIGHT, new DamageType("twilightforest.snowballFight", 0.1F, DamageEffects.FREEZING)); + context.register(TWILIGHT_SCEPTER, new DamageType("indirectMagic", 0.0F)); + context.register(LIFEDRAIN, new DamageType("twilightforest.lifedrain", 0.0F)); + context.register(EXPIRED, new DamageType("twilightforest.expired", 0.0F)); + context.register(FALLING_ICE, new DamageType("fallingBlock", 0.1F)); + context.register(MOONWORM, new DamageType("twilightforest.moonworm", 0.0F)); + } +} diff --git a/src/main/java/twilightforest/init/TFDimensionSettings.java b/src/main/java/twilightforest/init/TFDimensionSettings.java new file mode 100644 index 0000000000..ccc7fd533e --- /dev/null +++ b/src/main/java/twilightforest/init/TFDimensionSettings.java @@ -0,0 +1,172 @@ +package twilightforest.init; + +import net.minecraft.core.HolderGetter; +import net.minecraft.core.registries.Registries; +import net.minecraft.data.worldgen.BootstapContext; +import net.minecraft.resources.ResourceKey; +import net.minecraft.tags.BlockTags; +import net.minecraft.util.valueproviders.UniformInt; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.dimension.DimensionType; +import net.minecraft.world.level.dimension.LevelStem; +import net.minecraft.world.level.levelgen.*; +import twilightforest.TwilightForestMod; +import twilightforest.init.custom.BiomeLayerStack; +import twilightforest.world.components.biomesources.TFBiomeProvider; +import twilightforest.world.components.chunkgenerators.ChunkGeneratorTwilight; +import twilightforest.world.registration.biomes.BiomeMaker; +import twilightforest.world.registration.surface_rules.TFSurfaceRules; + +import java.util.List; +import java.util.Optional; +import java.util.OptionalLong; + +public class TFDimensionSettings { + + public static long seed; //Minecraft Overworld seed - used for seed ASM + + public static final ResourceKey TWILIGHT_NOISE_GEN = ResourceKey.create(Registries.NOISE_SETTINGS, TwilightForestMod.prefix("twilight_noise_gen")); + public static final ResourceKey SKYLIGHT_NOISE_GEN = ResourceKey.create(Registries.NOISE_SETTINGS, TwilightForestMod.prefix("skylight_noise_gen")); + + public static final ResourceKey TWILIGHT_DIM_TYPE = ResourceKey.create(Registries.DIMENSION_TYPE, TwilightForestMod.prefix("twilight_forest_type")); + + public static final ResourceKey TWILIGHT_LEVEL_STEM = ResourceKey.create(Registries.LEVEL_STEM, TwilightForestMod.prefix("twilight_forest")); + + private static DimensionType twilightDimType() { + return new DimensionType( + OptionalLong.of(13000L), //fixed time + true, //skylight + false, //ceiling + false, //ultrawarm + true, //natural + 0.125D, //coordinate scale + true, //bed works + true, //respawn anchor works + -32, // Minimum Y Level + 32 + 256, // Height + Min Y = Max Y + 32 + 256, // Logical Height + BlockTags.INFINIBURN_OVERWORLD, //infiburn + TwilightForestMod.prefix("renderer"), // DimensionRenderInfo + 0f, // Wish this could be set to -0.05 since it'll make the world truly blacked out if an area is not sky-lit (see: Dark Forests) Sadly this also messes up night vision so it gets 0 + new DimensionType.MonsterSettings(false, false, UniformInt.of(0, 7), 7) + ); + } + + + public static NoiseGeneratorSettings tfDefault() { + NoiseSettings tfNoise = NoiseSettings.create( + -32, //TODO Deliberate over this. For now it'll be -32 + 256, + 1, + 2 + ); + + return new NoiseGeneratorSettings( + tfNoise, + Blocks.STONE.defaultBlockState(), + Blocks.WATER.defaultBlockState(), + new NoiseRouter( + DensityFunctions.zero(), + DensityFunctions.zero(), + DensityFunctions.zero(), + DensityFunctions.zero(), + DensityFunctions.zero(), + DensityFunctions.zero(), + DensityFunctions.zero(), + DensityFunctions.zero(), + DensityFunctions.zero(), + DensityFunctions.zero(), + DensityFunctions.zero(), + DensityFunctions.zero(), + DensityFunctions.zero(), + DensityFunctions.zero(), + DensityFunctions.zero() + ), + TFSurfaceRules.tfSurface(), + List.of(), + 0, + false, + false, + false, + false + ); + } + + public static NoiseGeneratorSettings skylight() { + NoiseSettings skylightNoise = NoiseSettings.create( + -32, //min height + 256, // height + 2, // size_horizontal + 1 // size_vertical + ); + + // Problem island at /tp 9389.60 90.00 11041.66 + return new NoiseGeneratorSettings( + // https://misode.github.io/worldgen/noise-settings/ + // So far this looks great! We just need to raise the island levels to sea level. Otherwise is generates flat-flakey islands that really show the roots on dirt bottoms from trees + skylightNoise, + Blocks.STONE.defaultBlockState(), + Blocks.WATER.defaultBlockState(), + new NoiseRouter( + DensityFunctions.zero(), + DensityFunctions.zero(), + DensityFunctions.zero(), + DensityFunctions.zero(), + DensityFunctions.zero(), + DensityFunctions.zero(), + DensityFunctions.zero(), + DensityFunctions.zero(), + DensityFunctions.zero(), + DensityFunctions.zero(), + DensityFunctions.zero(), + DensityFunctions.zero(), + DensityFunctions.zero(), + DensityFunctions.zero(), + DensityFunctions.zero() + ), + TFSurfaceRules.tfSurface(), + List.of(), + 0, + false, + false, + false, + false + ); + } + + public static void bootstrapNoise(BootstapContext context) { + context.register(TWILIGHT_NOISE_GEN, tfDefault()); + context.register(SKYLIGHT_NOISE_GEN, skylight()); + } + + public static void bootstrapType(BootstapContext context) { + context.register(TWILIGHT_DIM_TYPE, twilightDimType()); + } + + public static void bootstrapStem(BootstapContext context) { + HolderGetter biomeRegistry = context.lookup(Registries.BIOME); + HolderGetter dimTypes = context.lookup(Registries.DIMENSION_TYPE); + HolderGetter noiseGenSettings = context.lookup(Registries.NOISE_SETTINGS); + + NoiseBasedChunkGenerator wrappedChunkGenerator = new NoiseBasedChunkGenerator( + new TFBiomeProvider( + BiomeMaker.makeBiomeList(biomeRegistry, biomeRegistry.getOrThrow(TFBiomes.UNDERGROUND)), + -1.25F, + 2.5F, + context.lookup(BiomeLayerStack.BIOME_STACK_KEY).getOrThrow(BiomeLayerStack.BIOMES_ALONG_STREAMS) + ), + noiseGenSettings.getOrThrow(TFDimensionSettings.TWILIGHT_NOISE_GEN)); + + LevelStem stem = new LevelStem( + dimTypes.getOrThrow(TFDimensionSettings.TWILIGHT_DIM_TYPE), + new ChunkGeneratorTwilight( + wrappedChunkGenerator, + noiseGenSettings.getOrThrow(TFDimensionSettings.TWILIGHT_NOISE_GEN), + true, + Optional.of(19), + BiomeMaker.BIOME_FEATURES_SETS)); + + context.register(TWILIGHT_LEVEL_STEM, stem); + } +} diff --git a/src/main/java/twilightforest/init/TFEnchantments.java b/src/main/java/twilightforest/init/TFEnchantments.java new file mode 100644 index 0000000000..2cdef6883e --- /dev/null +++ b/src/main/java/twilightforest/init/TFEnchantments.java @@ -0,0 +1,21 @@ +package twilightforest.init; + +import net.minecraft.world.item.enchantment.Enchantment; +import net.minecraft.world.item.enchantment.EnchantmentCategory; +import net.minecraftforge.registries.DeferredRegister; +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.registries.RegistryObject; +import twilightforest.TwilightForestMod; +import twilightforest.enchantment.*; +import twilightforest.item.ChainBlockItem; + +public class TFEnchantments { + + public static final DeferredRegister ENCHANTMENTS = DeferredRegister.create(ForgeRegistries.ENCHANTMENTS, TwilightForestMod.ID); + + public static final RegistryObject FIRE_REACT = ENCHANTMENTS.register("fire_react", () -> new FireReactEnchantment(Enchantment.Rarity.UNCOMMON)); + public static final RegistryObject CHILL_AURA = ENCHANTMENTS.register("chill_aura", () -> new ChillAuraEnchantment(Enchantment.Rarity.UNCOMMON)); + public static final RegistryObject DESTRUCTION = ENCHANTMENTS.register("destruction", () -> new DestructionEnchantment(Enchantment.Rarity.RARE)); + + public static final EnchantmentCategory BLOCK_AND_CHAIN = EnchantmentCategory.create("twilightforest_block_and_chain", item -> item instanceof ChainBlockItem); +} diff --git a/src/main/java/twilightforest/init/TFEntities.java b/src/main/java/twilightforest/init/TFEntities.java new file mode 100644 index 0000000000..d92df35422 --- /dev/null +++ b/src/main/java/twilightforest/init/TFEntities.java @@ -0,0 +1,275 @@ +package twilightforest.init; + +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.*; +import net.minecraft.world.entity.animal.Animal; +import net.minecraft.world.entity.animal.Sheep; +import net.minecraft.world.entity.monster.*; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.levelgen.Heightmap; +import net.minecraftforge.common.ForgeSpawnEggItem; +import net.minecraftforge.event.entity.EntityAttributeCreationEvent; +import net.minecraftforge.event.entity.SpawnPlacementRegisterEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.registries.DeferredRegister; +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.registries.RegistryObject; +import twilightforest.TwilightForestMod; +import twilightforest.entity.*; +import twilightforest.entity.boss.*; +import twilightforest.entity.monster.*; +import twilightforest.entity.passive.*; +import twilightforest.entity.projectile.*; + +@Mod.EventBusSubscriber(modid = TwilightForestMod.ID, bus = Mod.EventBusSubscriber.Bus.MOD) +public class TFEntities { + + public static final DeferredRegister> ENTITIES = DeferredRegister.create(ForgeRegistries.ENTITY_TYPES, TwilightForestMod.ID); + public static final DeferredRegister SPAWN_EGGS = DeferredRegister.create(ForgeRegistries.ITEMS, TwilightForestMod.ID); + + public static final RegistryObject> ADHERENT = make(TFEntityNames.ADHERENT, Adherent::new, MobCategory.MONSTER, 0.8F, 2.2F, 0x0a0000, 0x00008b); + public static final RegistryObject> ALPHA_YETI = make(TFEntityNames.ALPHA_YETI, AlphaYeti::new, MobCategory.MONSTER, 3.8F, 5.0F, 0xcdcdcd, 0x29486e); + public static final RegistryObject> ARMORED_GIANT = make(TFEntityNames.ARMORED_GIANT, ArmoredGiant::new, MobCategory.MONSTER, 2.4F, 7.2F, 0x239391, 0x9a9a9a); + public static final RegistryObject> BIGHORN_SHEEP = make(TFEntityNames.BIGHORN_SHEEP, Bighorn::new, MobCategory.CREATURE, 0.9F, 1.3F, 0xdbceaf, 0xd7c771); + public static final RegistryObject> BLOCKCHAIN_GOBLIN = make(TFEntityNames.BLOCKCHAIN_GOBLIN, BlockChainGoblin::new, MobCategory.MONSTER, 0.9F, 1.4F, 0xd3e7bc, 0x1f3fff); + public static final RegistryObject> BOAR = make(TFEntityNames.BOAR, Boar::new, MobCategory.CREATURE, 0.9F, 0.9F, 0x83653b, 0xffefca); + public static final RegistryObject> BOAT = buildNoEgg(TFEntityNames.BOAT, makeCastedBuilder(TwilightBoat.class, TwilightBoat::new, 1.375F, 0.5625F, 10, 3), false); + //public static final RegistryObject> BOGGARD = make(TFEntityNames.BOGGARD, Boggard::new, MobCategory.MONSTER, 0.8F, 1.1F); + public static final RegistryObject> CARMINITE_BROODLING = make(TFEntityNames.CARMINITE_BROODLING, TowerBroodling::new, MobCategory.MONSTER, 0.7F, 0.5F, 0x343c14, 0xbaee02); + public static final RegistryObject> CARMINITE_GHASTGUARD = make(TFEntityNames.CARMINITE_GHASTGUARD, CarminiteGhastguard::new, MobCategory.MONSTER, 4.0F, 6.0F, 0xbcbcbc, 0xb77878); + public static final RegistryObject> CARMINITE_GHASTLING = make(TFEntityNames.CARMINITE_GHASTLING, CarminiteGhastling::new, MobCategory.MONSTER, 1.1F, 1.5F, 0xbcbcbc, 0xa74343); + public static final RegistryObject> CARMINITE_GOLEM = make(TFEntityNames.CARMINITE_GOLEM, CarminiteGolem::new, MobCategory.MONSTER, 1.4F, 2.9F, 0x6b3d20, 0xe2ddda); + public static final RegistryObject> CHAIN_BLOCK = buildNoEgg(TFEntityNames.CHAIN_BLOCK, makeCastedBuilder(ChainBlock.class, ChainBlock::new, 0.6F, 0.6F, 80, 1), true); + public static final RegistryObject> CHARM_EFFECT = make(TFEntityNames.CHARM_EFFECT, CharmEffect::new, MobCategory.MISC, 0.25F, 0.25F, 0, 0); + public static final RegistryObject> CHEST_BOAT = buildNoEgg(TFEntityNames.CHEST_BOAT, makeCastedBuilder(TwilightChestBoat.class, TwilightChestBoat::new, 1.375F, 0.5625F, 10, 3), false); + public static final RegistryObject> CUBE_OF_ANNIHILATION = buildNoEgg(TFEntityNames.CUBE_OF_ANNIHILATION, makeCastedBuilder(CubeOfAnnihilation.class, CubeOfAnnihilation::new, 1.0F, 1.0F, 80, 1), true); + public static final RegistryObject> DEATH_TOME = make(TFEntityNames.DEATH_TOME, DeathTome::new, MobCategory.MONSTER, 0.6F, 1.1F, 0x774e22, 0xdbcdbe); + public static final RegistryObject> DEER = make(TFEntityNames.DEER, Deer::new, MobCategory.CREATURE, 0.7F, 1.8F, 0x7b4d2e, 0x4b241d); + public static final RegistryObject> DWARF_RABBIT = make(TFEntityNames.DWARF_RABBIT, DwarfRabbit::new, MobCategory.CREATURE, 0.4F, 0.4F, 0xfefeee, 0xccaa99); + public static final RegistryObject> FALLING_ICE = make(TFEntityNames.FALLING_ICE, FallingIce::new, MobCategory.MISC, 1.0F, 1.0F, true, 0, 0); + public static final RegistryObject> FIRE_BEETLE = make(TFEntityNames.FIRE_BEETLE, FireBeetle::new, MobCategory.MONSTER, 1.1F, 0.5F, true, 0x1d0b00, 0xcb6f25); + public static final RegistryObject> GIANT_MINER = make(TFEntityNames.GIANT_MINER, GiantMiner::new, MobCategory.MONSTER, 2.4F, 7.2F, 0x211b52, 0x9a9a9a); + public static final RegistryObject> HARBINGER_CUBE = make(TFEntityNames.HARBINGER_CUBE, HarbingerCube::new, MobCategory.MONSTER, 1.9F, 2.4F, true, 0x00000a, 0x8b0000); + public static final RegistryObject> HEDGE_SPIDER = make(TFEntityNames.HEDGE_SPIDER, HedgeSpider::new, MobCategory.MONSTER, 1.4F, 0.9F, 0x235f13, 0x562653); + public static final RegistryObject> HELMET_CRAB = make(TFEntityNames.HELMET_CRAB, HelmetCrab::new, MobCategory.MONSTER, 0.8F, 1.1F, 0xfb904b, 0xd3e7bc); + public static final RegistryObject> HOSTILE_WOLF = make(TFEntityNames.HOSTILE_WOLF, HostileWolf::new, MobCategory.MONSTER, 0.6F, 0.85F, 0xd7d3d3, 0xab1e14); + public static final RegistryObject> HYDRA = make(TFEntityNames.HYDRA, Hydra::new, MobCategory.MONSTER, 16.0F, 12.0F, true, 0x142940, 0x29806b); + public static final RegistryObject> HYDRA_MORTAR = buildNoEgg(TFEntityNames.HYDRA_MORTAR, makeCastedBuilder(HydraMortar.class, HydraMortar::new, 0.75F, 0.75F, 150, 3), true); + public static final RegistryObject> ICE_ARROW = buildNoEgg(TFEntityNames.ICE_ARROW, makeCastedBuilder(IceArrow.class, IceArrow::new, 0.5F, 0.5F, 150, 1), false); + public static final RegistryObject> THROWN_ICE = buildNoEgg(TFEntityNames.THROWN_ICE, makeCastedBuilder(IceBomb.class, IceBomb::new, 1.0F, 1.0F, 80, 2), true); + public static final RegistryObject> ICE_CRYSTAL = make(TFEntityNames.ICE_CRYSTAL, IceCrystal::new, MobCategory.MONSTER, 0.6F, 1.8F, 0xdce9fe, 0xadcafb); + public static final RegistryObject> ICE_SNOWBALL = buildNoEgg(TFEntityNames.ICE_SNOWBALL, makeCastedBuilder(IceSnowball.class, IceSnowball::new, 0.25F, 0.25F, 150, 3), false); + public static final RegistryObject> KING_SPIDER = make(TFEntityNames.KING_SPIDER, KingSpider::new, MobCategory.MONSTER, 1.6F, 1.6F, 0x2c1a0e, 0xffc017); + public static final RegistryObject> KNIGHT_PHANTOM = make(TFEntityNames.KNIGHT_PHANTOM, KnightPhantom::new, MobCategory.MONSTER, 1.5F, 3.0F, 0xa6673b, 0xd3e7bc); + public static final RegistryObject> KOBOLD = make(TFEntityNames.KOBOLD, Kobold::new, MobCategory.MONSTER, 0.8F, 1.1F, 0x372096, 0x895d1b); + public static final RegistryObject> LICH = make(TFEntityNames.LICH, Lich::new, MobCategory.MONSTER, 1.1F, 2.1F, 0xaca489, 0x360472); + public static final RegistryObject> LICH_BOLT = buildNoEgg(TFEntityNames.LICH_BOLT, makeCastedBuilder(LichBolt.class, LichBolt::new, 0.25F, 0.25F, 150, 2), false); + public static final RegistryObject> LICH_BOMB = buildNoEgg(TFEntityNames.LICH_BOMB, makeCastedBuilder(LichBomb.class, LichBomb::new, 0.25F, 0.25F, 150, 3), false); + public static final RegistryObject> LICH_MINION = make(TFEntityNames.LICH_MINION, LichMinion::new, MobCategory.MONSTER, 0.6F, 1.95F, 0, 0); + public static final RegistryObject> LOWER_GOBLIN_KNIGHT = make(TFEntityNames.LOWER_GOBLIN_KNIGHT, LowerGoblinKnight::new, MobCategory.MONSTER, 0.7F, 1.1F, 0x566055, 0xd3e7bc); + public static final RegistryObject> LOYAL_ZOMBIE = make(TFEntityNames.LOYAL_ZOMBIE, LoyalZombie::new, MobCategory.MONSTER, 0.6F, 1.8F, 0, 0); + public static final RegistryObject> MAZE_SLIME = make(TFEntityNames.MAZE_SLIME, MazeSlime::new, MobCategory.MONSTER, 2.04F, 2.04F, 0xa3a3a3, 0x2a3b17); + public static final RegistryObject> MINOSHROOM = make(TFEntityNames.MINOSHROOM, Minoshroom::new, MobCategory.MONSTER, 1.49F, 2.5F, 0xa81012, 0xaa7d66); + public static final RegistryObject> MINOTAUR = make(TFEntityNames.MINOTAUR, Minotaur::new, MobCategory.MONSTER, 0.6F, 2.1F, 0x3f3024, 0xaa7d66); + public static final RegistryObject> MIST_WOLF = make(TFEntityNames.MIST_WOLF, MistWolf::new, MobCategory.MONSTER, 1.4F, 1.9F, 0x3a1411, 0xe2c88a); + public static final RegistryObject> MOONWORM_SHOT = buildNoEgg(TFEntityNames.MOONWORM_SHOT, makeCastedBuilder(MoonwormShot.class, MoonwormShot::new, 0.25F, 0.25F, 150, 3), false); + public static final RegistryObject> MOSQUITO_SWARM = make(TFEntityNames.MOSQUITO_SWARM, MosquitoSwarm::new, MobCategory.MONSTER, 0.7F, 1.9F, 0x080904, 0x2d2f21); + public static final RegistryObject> NAGA = make(TFEntityNames.NAGA, Naga::new, MobCategory.MONSTER, 1.75f, 3.0f, true, 0xa4d316, 0x1b380b); + public static final RegistryObject> NATURE_BOLT = buildNoEgg(TFEntityNames.NATURE_BOLT, makeCastedBuilder(NatureBolt.class, NatureBolt::new, 0.25F, 0.25F, 150, 5), false); + public static final RegistryObject> PENGUIN = make(TFEntityNames.PENGUIN, Penguin::new, MobCategory.CREATURE, 0.5F, 0.9F, 0x12151b, 0xf9edd2); + public static final RegistryObject> PINCH_BEETLE = make(TFEntityNames.PINCH_BEETLE, PinchBeetle::new, MobCategory.MONSTER, 1.2F, 0.5F, 0xbc9327, 0x241609); + public static final RegistryObject> PLATEAU_BOSS = make(TFEntityNames.PLATEAU_BOSS, PlateauBoss::new, MobCategory.MONSTER, 1F, 1F, true, 0, 0); + public static final RegistryObject> PROTECTION_BOX = buildNoEgg(TFEntityNames.PROTECTION_BOX, makeCastedBuilder(ProtectionBox.class, ProtectionBox::new, 0, 0, 80, 3).noSave().noSummon(), true); + public static final RegistryObject> QUEST_RAM = make(TFEntityNames.QUEST_RAM, QuestRam::new, MobCategory.CREATURE, 1.25F, 2.9F, 0xfefeee, 0x33aadd); + public static final RegistryObject> RAVEN = make(TFEntityNames.RAVEN, Raven::new, MobCategory.CREATURE, 0.3F, 0.5F, 0x000011, 0x222233); + public static final RegistryObject> REDCAP = make(TFEntityNames.REDCAP, Redcap::new, MobCategory.MONSTER, 0.9F, 1.4F, 0x3b3a6c, 0xab1e14); + public static final RegistryObject> REDCAP_SAPPER = make(TFEntityNames.REDCAP_SAPPER, RedcapSapper::new, MobCategory.MONSTER, 0.9F, 1.4F, 0x575d21, 0xab1e14); + public static final RegistryObject> RISING_ZOMBIE = make(TFEntityNames.RISING_ZOMBIE, RisingZombie::new, MobCategory.MONSTER, 0.6F, 1.95F, 0, 0); + public static final RegistryObject> ROVING_CUBE = make(TFEntityNames.ROVING_CUBE, RovingCube::new, MobCategory.MONSTER, 1.2F, 2.1F, 0, 0); + public static final RegistryObject> SEEKER_ARROW = buildNoEgg(TFEntityNames.SEEKER_ARROW, makeCastedBuilder(SeekerArrow.class, SeekerArrow::new, 0.5F, 0.5F, 150, 1), false); + public static final RegistryObject> SKELETON_DRUID = make(TFEntityNames.SKELETON_DRUID, SkeletonDruid::new, MobCategory.MONSTER, 0.6F, 1.99F, 0xa3a3a3, 0x2a3b17); + public static final RegistryObject> SLIDER = buildNoEgg(TFEntityNames.SLIDER, makeCastedBuilder(SlideBlock.class, SlideBlock::new, 0.98F, 0.98F, 80, 1), false); + public static final RegistryObject> SLIME_BEETLE = make(TFEntityNames.SLIME_BEETLE, SlimeBeetle::new, MobCategory.MONSTER, 0.9F, 0.5F, 0x0c1606, 0x60a74c); + public static final RegistryObject> SLIME_BLOB = buildNoEgg(TFEntityNames.SLIME_BLOB, makeCastedBuilder(SlimeProjectile.class, SlimeProjectile::new, 0.25F, 0.25F, 150, 3), false); + public static final RegistryObject> SNOW_GUARDIAN = make(TFEntityNames.SNOW_GUARDIAN, SnowGuardian::new, MobCategory.MONSTER, 0.6F, 1.8F, 0xd3e7bc, 0xfefefe); + public static final RegistryObject> SNOW_QUEEN = make(TFEntityNames.SNOW_QUEEN, SnowQueen::new, MobCategory.MONSTER, 0.7F, 2.2F, 0xb1b2d4, 0x87006e); + public static final RegistryObject> SQUIRREL = make(TFEntityNames.SQUIRREL, Squirrel::new, MobCategory.CREATURE, 0.3F, 0.5F, 0x904f12, 0xeeeeee); + public static final RegistryObject> STABLE_ICE_CORE = make(TFEntityNames.STABLE_ICE_CORE, StableIceCore::new, MobCategory.MONSTER, 0.8F, 1.8F, 0xa1bff3, 0x7000f8); + public static final RegistryObject> SWARM_SPIDER = make(TFEntityNames.SWARM_SPIDER, SwarmSpider::new, MobCategory.MONSTER, 0.8F, 0.4F, 0x32022e, 0x17251e); + public static final RegistryObject> THROWN_BLOCK = buildNoEgg(TFEntityNames.THROWN_BLOCK, makeCastedBuilder(ThrownBlock.class, ThrownBlock::new, 1.0F, 1.0F, 80, 2), true); + public static final RegistryObject> THROWN_WEP = make(TFEntityNames.THROWN_WEP, ThrownWep::new, MobCategory.MISC, 0.5F, 0.5F, 0, 0); + public static final RegistryObject> TINY_BIRD = make(TFEntityNames.TINY_BIRD, TinyBird::new, MobCategory.CREATURE, 0.3F, 0.3F, 0x33aadd, 0x1188ee); + public static final RegistryObject> TOME_BOLT = buildNoEgg(TFEntityNames.TOME_BOLT, makeCastedBuilder(TomeBolt.class, TomeBolt::new, 0.25F, 0.25F, 150, 5), false); + public static final RegistryObject> TOWERWOOD_BORER = make(TFEntityNames.TOWERWOOD_BORER, TowerwoodBorer::new, MobCategory.MONSTER, 0.4F, 0.3F, 0x5d2b21, 0xaca03a); + public static final RegistryObject> TROLL = make(TFEntityNames.TROLL, Troll::new, MobCategory.MONSTER, 1.4F, 2.4F, 0x9ea98f, 0xb0948e); + public static final RegistryObject> WAND_BOLT = buildNoEgg(TFEntityNames.WAND_BOLT, makeCastedBuilder(TwilightWandBolt.class, TwilightWandBolt::new, 0.25F, 0.25F, 150, 5), false); + public static final RegistryObject> UNSTABLE_ICE_CORE = make(TFEntityNames.UNSTABLE_ICE_CORE, UnstableIceCore::new, MobCategory.MONSTER, 0.8F, 1.8F, 0x9aacf5, 0x9b0fa5); + public static final RegistryObject> UPPER_GOBLIN_KNIGHT = make(TFEntityNames.UPPER_GOBLIN_KNIGHT, UpperGoblinKnight::new, MobCategory.MONSTER, 1.1F, 1.3F, 0, 0); + public static final RegistryObject> UR_GHAST = make(TFEntityNames.UR_GHAST, UrGhast::new, MobCategory.MONSTER, 14.0F, 18.0F, true, 0xbcbcbc, 0xb77878); + public static final RegistryObject> WINTER_WOLF = make(TFEntityNames.WINTER_WOLF, WinterWolf::new, MobCategory.MONSTER, 1.4F, 1.9F, 0xdfe3e5, 0xb2bcca); + public static final RegistryObject> WRAITH = make(TFEntityNames.WRAITH, Wraith::new, MobCategory.MONSTER, 0.6F, 1.8F, true, 0x505050, 0x838383); + public static final RegistryObject> YETI = make(TFEntityNames.YETI, Yeti::new, MobCategory.MONSTER, 1.4F, 2.4F, 0xdedede, 0x4675bb); + + private static RegistryObject> make(ResourceLocation id, EntityType.EntityFactory factory, MobCategory classification, float width, float height, int primary, int secondary) { + return make(id, factory, classification, width, height, false, primary, secondary); + } + + private static RegistryObject> make(ResourceLocation id, EntityType.EntityFactory factory, MobCategory classification, float width, float height, boolean fireproof, int primary, int secondary) { + return build(id, makeBuilder(factory, classification, width, height, 80, 3), fireproof, primary, secondary); + } + + private static RegistryObject> buildNoEgg(ResourceLocation id, EntityType.Builder builder, boolean fireproof) { + if (fireproof) builder.fireImmune(); + return ENTITIES.register(id.getPath(), () -> builder.build(id.toString())); + } + + @SuppressWarnings("unchecked") + private static RegistryObject> build(ResourceLocation id, EntityType.Builder builder, boolean fireproof, int primary, int secondary) { + if (fireproof) builder.fireImmune(); + RegistryObject> ret = ENTITIES.register(id.getPath(), () -> builder.build(id.toString())); + if (primary != 0 && secondary != 0) { + SPAWN_EGGS.register(id.getPath() + "_spawn_egg", () -> new ForgeSpawnEggItem(() -> (EntityType) ret.get(), primary, secondary, new Item.Properties())); + } + return ret; + } + + private static EntityType.Builder makeCastedBuilder(@SuppressWarnings("unused") Class cast, EntityType.EntityFactory factory, float width, float height, int range, int interval) { + return makeBuilder(factory, MobCategory.MISC, width, height, range, interval); + } + + private static EntityType.Builder makeBuilder(EntityType.EntityFactory factory, MobCategory classification, float width, float height, int range, int interval) { + return EntityType.Builder.of(factory, classification). + sized(width, height). + setTrackingRange(range). + setUpdateInterval(interval). + setShouldReceiveVelocityUpdates(true); + } + + @SubscribeEvent + public static void registerSpawnPlacements(SpawnPlacementRegisterEvent event) { + event.register(BOAR.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Animal::checkAnimalSpawnRules, SpawnPlacementRegisterEvent.Operation.REPLACE); + event.register(BIGHORN_SHEEP.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Animal::checkAnimalSpawnRules, SpawnPlacementRegisterEvent.Operation.REPLACE); + event.register(DEER.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Animal::checkAnimalSpawnRules, SpawnPlacementRegisterEvent.Operation.REPLACE); + event.register(REDCAP.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Monster::checkMonsterSpawnRules, SpawnPlacementRegisterEvent.Operation.REPLACE); + event.register(SKELETON_DRUID.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, SkeletonDruid::checkDruidSpawnRules, SpawnPlacementRegisterEvent.Operation.REPLACE); + event.register(WRAITH.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Wraith::checkMonsterSpawnRules, SpawnPlacementRegisterEvent.Operation.REPLACE); + event.register(HOSTILE_WOLF.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, HostileWolf::checkWolfSpawnRules, SpawnPlacementRegisterEvent.Operation.REPLACE); + event.register(HYDRA.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Mob::checkMobSpawnRules, SpawnPlacementRegisterEvent.Operation.REPLACE); + event.register(LICH.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Monster::checkMonsterSpawnRules, SpawnPlacementRegisterEvent.Operation.REPLACE); + event.register(PENGUIN.get(), SpawnPlacements.Type.NO_RESTRICTIONS, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Penguin::canSpawn, SpawnPlacementRegisterEvent.Operation.REPLACE); + event.register(LICH_MINION.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Monster::checkMonsterSpawnRules, SpawnPlacementRegisterEvent.Operation.REPLACE); + event.register(LOYAL_ZOMBIE.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Mob::checkMobSpawnRules, SpawnPlacementRegisterEvent.Operation.REPLACE); + event.register(TINY_BIRD.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Animal::checkAnimalSpawnRules, SpawnPlacementRegisterEvent.Operation.REPLACE); + event.register(SQUIRREL.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Animal::checkAnimalSpawnRules, SpawnPlacementRegisterEvent.Operation.REPLACE); + event.register(DWARF_RABBIT.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Animal::checkAnimalSpawnRules, SpawnPlacementRegisterEvent.Operation.REPLACE); + event.register(RAVEN.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Animal::checkAnimalSpawnRules, SpawnPlacementRegisterEvent.Operation.REPLACE); + event.register(QUEST_RAM.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Animal::checkAnimalSpawnRules, SpawnPlacementRegisterEvent.Operation.REPLACE); + event.register(KOBOLD.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Monster::checkMonsterSpawnRules, SpawnPlacementRegisterEvent.Operation.REPLACE); + event.register(MOSQUITO_SWARM.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Monster::checkMonsterSpawnRules, SpawnPlacementRegisterEvent.Operation.REPLACE); + event.register(DEATH_TOME.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Monster::checkMonsterSpawnRules, SpawnPlacementRegisterEvent.Operation.REPLACE); + event.register(MINOTAUR.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Monster::checkMonsterSpawnRules, SpawnPlacementRegisterEvent.Operation.REPLACE); + event.register(MINOSHROOM.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Monster::checkMonsterSpawnRules, SpawnPlacementRegisterEvent.Operation.REPLACE); + event.register(FIRE_BEETLE.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Monster::checkMonsterSpawnRules, SpawnPlacementRegisterEvent.Operation.REPLACE); + event.register(SLIME_BEETLE.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Monster::checkMonsterSpawnRules, SpawnPlacementRegisterEvent.Operation.REPLACE); + event.register(PINCH_BEETLE.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Monster::checkMonsterSpawnRules, SpawnPlacementRegisterEvent.Operation.REPLACE); + event.register(MIST_WOLF.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Monster::checkMonsterSpawnRules, SpawnPlacementRegisterEvent.Operation.REPLACE); + event.register(CARMINITE_GHASTLING.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, CarminiteGhastling::canSpawnHere, SpawnPlacementRegisterEvent.Operation.REPLACE); + event.register(CARMINITE_GOLEM.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Monster::checkMonsterSpawnRules, SpawnPlacementRegisterEvent.Operation.REPLACE); + event.register(TOWERWOOD_BORER.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Monster::checkMonsterSpawnRules, SpawnPlacementRegisterEvent.Operation.REPLACE); + event.register(CARMINITE_GHASTGUARD.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, CarminiteGhastguard::ghastSpawnHandler, SpawnPlacementRegisterEvent.Operation.REPLACE); + event.register(UR_GHAST.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, CarminiteGhastguard::ghastSpawnHandler, SpawnPlacementRegisterEvent.Operation.REPLACE); + event.register(BLOCKCHAIN_GOBLIN.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Monster::checkMonsterSpawnRules, SpawnPlacementRegisterEvent.Operation.REPLACE); + event.register(UPPER_GOBLIN_KNIGHT.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Monster::checkMonsterSpawnRules, SpawnPlacementRegisterEvent.Operation.REPLACE); + event.register(LOWER_GOBLIN_KNIGHT.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Monster::checkMonsterSpawnRules, SpawnPlacementRegisterEvent.Operation.REPLACE); + event.register(HELMET_CRAB.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Monster::checkMonsterSpawnRules, SpawnPlacementRegisterEvent.Operation.REPLACE); + event.register(KNIGHT_PHANTOM.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Mob::checkMobSpawnRules, SpawnPlacementRegisterEvent.Operation.REPLACE); + event.register(NAGA.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Monster::checkMonsterSpawnRules, SpawnPlacementRegisterEvent.Operation.REPLACE); + event.register(SWARM_SPIDER.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, SwarmSpider::getCanSpawnHere, SpawnPlacementRegisterEvent.Operation.REPLACE); + event.register(KING_SPIDER.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Monster::checkMonsterSpawnRules, SpawnPlacementRegisterEvent.Operation.REPLACE); + event.register(CARMINITE_BROODLING.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Monster::checkMonsterSpawnRules, SpawnPlacementRegisterEvent.Operation.REPLACE); + event.register(HEDGE_SPIDER.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, HedgeSpider::canSpawn, SpawnPlacementRegisterEvent.Operation.REPLACE); + event.register(REDCAP_SAPPER.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Monster::checkMonsterSpawnRules, SpawnPlacementRegisterEvent.Operation.REPLACE); + event.register(MAZE_SLIME.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, MazeSlime::getCanSpawnHere, SpawnPlacementRegisterEvent.Operation.REPLACE); + event.register(YETI.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Yeti::yetiSnowyForestSpawnHandler, SpawnPlacementRegisterEvent.Operation.REPLACE); + event.register(ALPHA_YETI.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Monster::checkMonsterSpawnRules, SpawnPlacementRegisterEvent.Operation.REPLACE); + event.register(WINTER_WOLF.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, WinterWolf::canSpawnHere, SpawnPlacementRegisterEvent.Operation.REPLACE); + event.register(SNOW_GUARDIAN.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Monster::checkMonsterSpawnRules, SpawnPlacementRegisterEvent.Operation.REPLACE); + event.register(STABLE_ICE_CORE.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Monster::checkMonsterSpawnRules, SpawnPlacementRegisterEvent.Operation.REPLACE); + event.register(UNSTABLE_ICE_CORE.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Monster::checkMonsterSpawnRules, SpawnPlacementRegisterEvent.Operation.REPLACE); + event.register(SNOW_QUEEN.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Monster::checkMonsterSpawnRules, SpawnPlacementRegisterEvent.Operation.REPLACE); + event.register(TROLL.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Monster::checkMonsterSpawnRules, SpawnPlacementRegisterEvent.Operation.REPLACE); + event.register(GIANT_MINER.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, GiantMiner::canSpawn, SpawnPlacementRegisterEvent.Operation.REPLACE); + event.register(ARMORED_GIANT.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, GiantMiner::canSpawn, SpawnPlacementRegisterEvent.Operation.REPLACE); + event.register(ICE_CRYSTAL.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Monster::checkMonsterSpawnRules, SpawnPlacementRegisterEvent.Operation.REPLACE); + event.register(HARBINGER_CUBE.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Monster::checkMonsterSpawnRules, SpawnPlacementRegisterEvent.Operation.REPLACE); + event.register(ADHERENT.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Monster::checkMonsterSpawnRules, SpawnPlacementRegisterEvent.Operation.REPLACE); + event.register(ROVING_CUBE.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Monster::checkMonsterSpawnRules, SpawnPlacementRegisterEvent.Operation.REPLACE); + event.register(RISING_ZOMBIE.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Monster::checkMonsterSpawnRules, SpawnPlacementRegisterEvent.Operation.REPLACE); + } + + @SubscribeEvent + public static void addEntityAttributes(EntityAttributeCreationEvent event) { + event.put(BOAR.get(), Boar.registerAttributes().build()); + event.put(BIGHORN_SHEEP.get(), Sheep.createAttributes().build()); + event.put(DEER.get(), Deer.registerAttributes().build()); + event.put(REDCAP.get(), Redcap.registerAttributes().build()); + event.put(SWARM_SPIDER.get(), SwarmSpider.registerAttributes().build()); + event.put(NAGA.get(), Naga.registerAttributes().build()); + event.put(SKELETON_DRUID.get(), AbstractSkeleton.createAttributes().build()); + event.put(HOSTILE_WOLF.get(), HostileWolf.registerAttributes().build()); + event.put(WRAITH.get(), Wraith.registerAttributes().build()); + event.put(HEDGE_SPIDER.get(), Spider.createAttributes().build()); + event.put(HYDRA.get(), Hydra.registerAttributes().build()); + event.put(LICH.get(), Lich.registerAttributes().build()); + event.put(PENGUIN.get(), Penguin.registerAttributes().build()); + event.put(LICH_MINION.get(), Zombie.createAttributes().build()); + event.put(LOYAL_ZOMBIE.get(), LoyalZombie.registerAttributes().build()); + event.put(TINY_BIRD.get(), TinyBird.registerAttributes().build()); + event.put(SQUIRREL.get(), Squirrel.registerAttributes().build()); + event.put(DWARF_RABBIT.get(), DwarfRabbit.registerAttributes().build()); + event.put(RAVEN.get(), Raven.registerAttributes().build()); + event.put(QUEST_RAM.get(), QuestRam.registerAttributes().build()); + event.put(KOBOLD.get(), Kobold.registerAttributes().build()); + event.put(MOSQUITO_SWARM.get(), MosquitoSwarm.registerAttributes().build()); + event.put(DEATH_TOME.get(), DeathTome.registerAttributes().build()); + event.put(MINOTAUR.get(), Minotaur.registerAttributes().build()); + event.put(MINOSHROOM.get(), Minoshroom.registerAttributes().build()); + event.put(FIRE_BEETLE.get(), FireBeetle.registerAttributes().build()); + event.put(SLIME_BEETLE.get(), SlimeBeetle.registerAttributes().build()); + event.put(PINCH_BEETLE.get(), PinchBeetle.registerAttributes().build()); + event.put(MAZE_SLIME.get(), MazeSlime.registerAttributes().build()); + event.put(REDCAP_SAPPER.get(), RedcapSapper.registerAttributes().build()); + event.put(MIST_WOLF.get(), MistWolf.registerAttributes().build()); + event.put(KING_SPIDER.get(), KingSpider.registerAttributes().build()); + event.put(CARMINITE_GHASTLING.get(), CarminiteGhastling.registerAttributes().build()); + event.put(CARMINITE_GHASTGUARD.get(), CarminiteGhastguard.registerAttributes().build()); + event.put(CARMINITE_GOLEM.get(), CarminiteGolem.registerAttributes().build()); + event.put(TOWERWOOD_BORER.get(), TowerwoodBorer.registerAttributes().build()); + event.put(CARMINITE_BROODLING.get(), TowerBroodling.registerAttributes().build()); + event.put(UR_GHAST.get(), UrGhast.registerAttributes().build()); + event.put(BLOCKCHAIN_GOBLIN.get(), BlockChainGoblin.registerAttributes().build()); + event.put(UPPER_GOBLIN_KNIGHT.get(), UpperGoblinKnight.registerAttributes().build()); + event.put(LOWER_GOBLIN_KNIGHT.get(), LowerGoblinKnight.registerAttributes().build()); + event.put(HELMET_CRAB.get(), HelmetCrab.registerAttributes().build()); + event.put(KNIGHT_PHANTOM.get(), KnightPhantom.registerAttributes().build()); + event.put(YETI.get(), Yeti.registerAttributes().build()); + event.put(ALPHA_YETI.get(), AlphaYeti.registerAttributes().build()); + event.put(WINTER_WOLF.get(), WinterWolf.registerAttributes().build()); + event.put(SNOW_GUARDIAN.get(), SnowGuardian.registerAttributes().build()); + event.put(STABLE_ICE_CORE.get(), StableIceCore.registerAttributes().build()); + event.put(UNSTABLE_ICE_CORE.get(), UnstableIceCore.registerAttributes().build()); + event.put(SNOW_QUEEN.get(), SnowQueen.registerAttributes().build()); + event.put(TROLL.get(), Troll.registerAttributes().build()); + event.put(GIANT_MINER.get(), GiantMiner.registerAttributes().build()); + event.put(ARMORED_GIANT.get(), GiantMiner.registerAttributes().build()); + event.put(ICE_CRYSTAL.get(), IceCrystal.registerAttributes().build()); + event.put(HARBINGER_CUBE.get(), HarbingerCube.registerAttributes().build()); + event.put(ADHERENT.get(), Adherent.registerAttributes().build()); + event.put(ROVING_CUBE.get(), RovingCube.registerAttributes().build()); + event.put(PLATEAU_BOSS.get(), PlateauBoss.registerAttributes().build()); + + //event.put(BOGGARD.get(), Boggard.registerAttributes().create()); + event.put(RISING_ZOMBIE.get(), Zombie.createAttributes().build()); + } +} diff --git a/src/main/java/twilightforest/init/TFFeatureModifiers.java b/src/main/java/twilightforest/init/TFFeatureModifiers.java new file mode 100644 index 0000000000..9776133fb3 --- /dev/null +++ b/src/main/java/twilightforest/init/TFFeatureModifiers.java @@ -0,0 +1,45 @@ +package twilightforest.init; + +import net.minecraft.core.registries.Registries; +import net.minecraft.world.level.levelgen.feature.foliageplacers.FoliagePlacerType; +import net.minecraft.world.level.levelgen.feature.treedecorators.TreeDecoratorType; +import net.minecraft.world.level.levelgen.feature.trunkplacers.TrunkPlacerType; +import net.minecraft.world.level.levelgen.placement.PlacementModifier; +import net.minecraft.world.level.levelgen.placement.PlacementModifierType; +import net.minecraftforge.registries.DeferredRegister; +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.registries.RegistryObject; +import twilightforest.TwilightForestMod; +import twilightforest.world.components.feature.trees.treeplacers.*; +import twilightforest.world.components.placements.AvoidLandmarkModifier; +import twilightforest.world.components.placements.ChunkBlanketingModifier; +import twilightforest.world.components.placements.ChunkCenterModifier; + +import java.util.function.Supplier; + +public final class TFFeatureModifiers { + + public static final DeferredRegister> FOLIAGE_PLACERS = DeferredRegister.create(ForgeRegistries.FOLIAGE_PLACER_TYPES, TwilightForestMod.ID); + public static final DeferredRegister> TREE_DECORATORS = DeferredRegister.create(ForgeRegistries.TREE_DECORATOR_TYPES, TwilightForestMod.ID); + public static final DeferredRegister> PLACEMENT_MODIFIERS = DeferredRegister.create(Registries.PLACEMENT_MODIFIER_TYPE, TwilightForestMod.ID); + public static final DeferredRegister> TRUNK_PLACERS = DeferredRegister.create(Registries.TRUNK_PLACER_TYPE, TwilightForestMod.ID); + + public static final RegistryObject> TRUNK_BRANCHING = TRUNK_PLACERS.register("branching_trunk_placer", () -> new TrunkPlacerType<>(BranchingTrunkPlacer.CODEC)); + public static final RegistryObject> TRUNK_RISER = TRUNK_PLACERS.register("trunk_mover_upper", () -> new TrunkPlacerType<>(TrunkRiser.CODEC)); + + public static final RegistryObject> FOLIAGE_SPHEROID = FOLIAGE_PLACERS.register("spheroid_foliage_placer", () -> new FoliagePlacerType<>(LeafSpheroidFoliagePlacer.CODEC)); + + public static final RegistryObject> CORE_PLACER = TREE_DECORATORS.register("core_placer", () -> new TreeDecoratorType<>(TreeCorePlacer.CODEC)); + public static final RegistryObject> TRUNKSIDE_DECORATOR = TREE_DECORATORS.register("trunkside_decorator", () -> new TreeDecoratorType<>(TrunkSideDecorator.CODEC)); + public static final RegistryObject> TREE_ROOTS = TREE_DECORATORS.register("tree_roots", () -> new TreeDecoratorType<>(TreeRootsDecorator.CODEC)); + public static final RegistryObject> DANGLING_DECORATOR = TREE_DECORATORS.register("dangle_from_tree_decorator", () -> new TreeDecoratorType<>(DangleFromTreeDecorator.CODEC)); + + public static final RegistryObject> NO_STRUCTURE = registerPlacer("no_structure", () -> () -> AvoidLandmarkModifier.CODEC); + public static final RegistryObject> CHUNK_CENTERER = registerPlacer("chunk_centerer", () -> () -> ChunkCenterModifier.CODEC); + public static final RegistryObject> CHUNK_BLANKETING = registerPlacer("chunk_blanketing", () -> () -> ChunkBlanketingModifier.CODEC); + + //goofy but needed + private static

RegistryObject> registerPlacer(String name, Supplier> factory) { + return PLACEMENT_MODIFIERS.register(name, factory); + } +} diff --git a/src/main/java/twilightforest/init/TFFeatures.java b/src/main/java/twilightforest/init/TFFeatures.java new file mode 100644 index 0000000000..538316687a --- /dev/null +++ b/src/main/java/twilightforest/init/TFFeatures.java @@ -0,0 +1,55 @@ +package twilightforest.init; + +import net.minecraft.world.level.levelgen.feature.Feature; +import net.minecraft.world.level.levelgen.feature.configurations.*; +import net.minecraftforge.registries.DeferredRegister; +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.registries.RegistryObject; +import twilightforest.TwilightForestMod; +import twilightforest.world.components.feature.*; +import twilightforest.world.components.feature.config.*; +import twilightforest.world.components.feature.templates.*; +import twilightforest.world.components.feature.trees.*; +import twilightforest.world.components.feature.trees.SnowTreeFeature; +import twilightforest.world.components.feature.trees.SnowUnderTreeFeature; + +public class TFFeatures { + + public static final DeferredRegister> FEATURES = DeferredRegister.create(ForgeRegistries.FEATURES, TwilightForestMod.ID); + + public static final RegistryObject> BIG_MUSHGLOOM = FEATURES.register("big_mushgloom", () -> new BigMushgloomFeature(HugeMushroomFeatureConfiguration.CODEC)); + public static final RegistryObject> CANOPY_BROWN_MUSHROOM = FEATURES.register("canopy_brown_mushroom", () -> new BrownCanopyMushroomFeature(HugeMushroomFeatureConfiguration.CODEC)); + public static final RegistryObject> CANOPY_RED_MUSHROOM = FEATURES.register("canopy_red_mushroom", () -> new RedCanopyMushroomFeature(HugeMushroomFeatureConfiguration.CODEC)); + public static final RegistryObject> CANOPY_OAK = FEATURES.register("canopy_oak", () -> new OakCanopyTreeFeature(TFTreeFeatureConfig.codecTFTreeConfig)); + public static final RegistryObject> CAVE_STALACTITE = FEATURES.register("block_spike", () -> new BlockSpikeFeature(NoneFeatureConfiguration.CODEC)); + public static final RegistryObject> DARK_CANOPY_TREE = FEATURES.register("dark_canopy_tree", () -> new DarkCanopyTreeFeature(TreeConfiguration.CODEC)); + public static final RegistryObject> DRUID_HUT = FEATURES.register("druid_hut", () -> new DruidHutFeature(SwizzleConfig.CODEC)); + public static final RegistryObject> FALLEN_HOLLOW_LOG = FEATURES.register("fallen_hollow_log", () -> new FallenHollowLogFeature(NoneFeatureConfiguration.CODEC)); + public static final RegistryObject> FALLEN_LEAVES = FEATURES.register("fallen_leaves", () -> new FallenLeavesFeature(NoneFeatureConfiguration.CODEC)); + public static final RegistryObject> FALLEN_SMALL_LOG = FEATURES.register("fallen_small_log", () -> new SmallFallenLogFeature(HollowLogConfig.CODEC)); + public static final RegistryObject> FIRE_JET = FEATURES.register("fire_jet", () -> new FireJetFeature(BlockStateConfiguration.CODEC)); + public static final RegistryObject> FOUNDATION = FEATURES.register("foundation", () -> new FoundationFeature(NoneFeatureConfiguration.CODEC)); + public static final RegistryObject> GRAVEYARD = FEATURES.register("graveyard", () -> new GraveyardFeature(NoneFeatureConfiguration.CODEC)); + public static final RegistryObject> GROVE_RUINS = FEATURES.register("grove_ruins", () -> new GroveRuinsFeature(NoneFeatureConfiguration.CODEC)); + public static final RegistryObject> HOLLOW_STUMP = FEATURES.register("hollow_stump", () -> new HollowStumpFeature(TFTreeFeatureConfig.codecTFTreeConfig)); + public static final RegistryObject> HOLLOW_TREE = FEATURES.register("hollow_tree", () -> new HollowTreeFeature(TFTreeFeatureConfig.codecTFTreeConfig)); + public static final RegistryObject> HUGE_LILY_PAD = FEATURES.register("huge_lily_pad", () -> new HugeLilypadFeature(NoneFeatureConfiguration.CODEC)); + public static final RegistryObject> HUGE_WATER_LILY = FEATURES.register("huge_water_lily", () -> new HugeWaterLilyFeature(NoneFeatureConfiguration.CODEC)); + public static final RegistryObject> LAMPPOSTS = FEATURES.register("lampposts", () -> new LampostFeature(BlockStateConfiguration.CODEC)); + public static final RegistryObject> LARGE_WINTER_TREE = FEATURES.register("large_winter_tree", () -> new LargeWinterTreeFeature(TFTreeFeatureConfig.codecTFTreeConfig)); + public static final RegistryObject> MINERS_TREE = FEATURES.register("miners_tree", () -> new MiningTreeFeature(TFTreeFeatureConfig.codecTFTreeConfig)); + public static final RegistryObject> MONOLITH = FEATURES.register("monolith", () -> new MonolithFeature(NoneFeatureConfiguration.CODEC)); + public static final RegistryObject> MYCELIUM_BLOB = FEATURES.register("mycelium_blob", () -> new CheckAbovePatchFeature(DiskConfiguration.CODEC)); + public static final RegistryObject> UNDERGROUND_PLANTS = FEATURES.register("underground_plants", () -> new UndergroundPlantFeature(BlockStateConfiguration.CODEC)); + public static final RegistryObject> TROLL_VINES = FEATURES.register("troll_vines", () -> new UndergroundPlantFeature(BlockStateConfiguration.CODEC)); + public static final RegistryObject> STONE_CIRCLE = FEATURES.register("stone_circle", () -> new StoneCircleFeature(NoneFeatureConfiguration.CODEC)); + public static final RegistryObject> THORNS = FEATURES.register("thorns", () -> new ThornFeature(ThornsConfig.CODEC)); + public static final RegistryObject> TREE_OF_TIME = FEATURES.register("tree_of_time", () -> new TimeTreeFeature(TFTreeFeatureConfig.codecTFTreeConfig)); + public static final RegistryObject> WEBS = FEATURES.register("webs", () -> new WebFeature(NoneFeatureConfiguration.CODEC)); + public static final RegistryObject> SIMPLE_WELL = FEATURES.register("simple_well", () -> new SimpleWellFeature(SwizzleConfig.CODEC)); + public static final RegistryObject> FANCY_WELL = FEATURES.register("fancy_well", () -> new FancyWellFeature(SwizzleConfig.CODEC)); + public static final RegistryObject> WOOD_ROOTS = FEATURES.register("wood_roots", () -> new WoodRootFeature(RootConfig.CODEC)); + public static final RegistryObject> SNOW_UNDER_TREES = FEATURES.register("snow_under_trees", () -> new SnowUnderTreeFeature(NoneFeatureConfiguration.CODEC)); + public static final RegistryObject> SNOW_TREE = FEATURES.register("anywhere_tree", () -> new SnowTreeFeature(TreeConfiguration.CODEC)); + public static final RegistryObject> DARK_FOREST_PLACER = FEATURES.register("dark_forest_placer", () -> new DarkForestFeature(RandomPatchConfiguration.CODEC)); +} diff --git a/src/main/java/twilightforest/init/TFItems.java b/src/main/java/twilightforest/init/TFItems.java new file mode 100644 index 0000000000..b44959c212 --- /dev/null +++ b/src/main/java/twilightforest/init/TFItems.java @@ -0,0 +1,301 @@ +package twilightforest.init; + +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.renderer.item.ItemProperties; +import net.minecraft.client.renderer.item.ItemPropertyFunction; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.food.FoodProperties; +import net.minecraft.world.item.*; +import net.minecraft.world.level.Level; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.registries.DeferredRegister; +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.registries.RegistryObject; +import org.jetbrains.annotations.Nullable; +import twilightforest.TwilightForestMod; +import twilightforest.data.tags.CustomTagGenerator; +import twilightforest.entity.TwilightBoat; +import twilightforest.enums.TwilightArmorMaterial; +import twilightforest.item.*; +import twilightforest.util.TwilightItemTier; + +public class TFItems { + public static final DeferredRegister ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, TwilightForestMod.ID); + + public static final RegistryObject NAGA_SCALE = ITEMS.register("naga_scale", () -> new Item(new Item.Properties().rarity(Rarity.UNCOMMON))); + public static final RegistryObject NAGA_CHESTPLATE = ITEMS.register("naga_chestplate", () -> new NagaArmorItem(TwilightArmorMaterial.ARMOR_NAGA, ArmorItem.Type.CHESTPLATE, new Item.Properties().rarity(Rarity.UNCOMMON))); + public static final RegistryObject NAGA_LEGGINGS = ITEMS.register("naga_leggings", () -> new NagaArmorItem(TwilightArmorMaterial.ARMOR_NAGA, ArmorItem.Type.LEGGINGS, new Item.Properties().rarity(Rarity.UNCOMMON))); + public static final RegistryObject TWILIGHT_SCEPTER = ITEMS.register("twilight_scepter", () -> new TwilightWandItem(new Item.Properties().durability(99).rarity(Rarity.UNCOMMON))); + public static final RegistryObject LIFEDRAIN_SCEPTER = ITEMS.register("lifedrain_scepter", () -> new LifedrainScepterItem(new Item.Properties().durability(99).rarity(Rarity.UNCOMMON))); + public static final RegistryObject ZOMBIE_SCEPTER = ITEMS.register("zombie_scepter", () -> new ZombieWandItem(new Item.Properties().durability(9).rarity(Rarity.UNCOMMON))); + public static final RegistryObject FORTIFICATION_SCEPTER = ITEMS.register("fortification_scepter", () -> new FortificationWandItem(new Item.Properties().durability(9).rarity(Rarity.UNCOMMON))); + //items.register("Wand of Pacification [NYI]", new Item().setIconIndex(6).setTranslationKey("wandPacification").setMaxStackSize(1)); + public static final RegistryObject ORE_METER = ITEMS.register("ore_meter", () -> new OreMeterItem(new Item.Properties())); + public static final RegistryObject FILLED_MAGIC_MAP = ITEMS.register("filled_magic_map", () -> new MagicMapItem(new Item.Properties())); + public static final RegistryObject FILLED_MAZE_MAP = ITEMS.register("filled_maze_map", () -> new MazeMapItem(false, new Item.Properties())); + public static final RegistryObject FILLED_ORE_MAP = ITEMS.register("filled_ore_map", () -> new MazeMapItem(true, new Item.Properties())); + public static final RegistryObject RAVEN_FEATHER = ITEMS.register("raven_feather", () -> new Item(new Item.Properties())); + public static final RegistryObject MAGIC_MAP_FOCUS = ITEMS.register("magic_map_focus", () -> new Item(new Item.Properties())); + public static final RegistryObject MAZE_MAP_FOCUS = ITEMS.register("maze_map_focus", () -> new Item(new Item.Properties())); + public static final RegistryObject MAGIC_MAP = ITEMS.register("magic_map", () -> new EmptyMagicMapItem(new Item.Properties())); + public static final RegistryObject MAZE_MAP = ITEMS.register("maze_map", () -> new EmptyMazeMapItem(false, new Item.Properties())); + public static final RegistryObject ORE_MAP = ITEMS.register("ore_map", () -> new EmptyMazeMapItem(true, new Item.Properties())); + public static final RegistryObject LIVEROOT = ITEMS.register("liveroot", () -> new Item(new Item.Properties())); + public static final RegistryObject RAW_IRONWOOD = ITEMS.register("raw_ironwood", () -> new Item(new Item.Properties())); + public static final RegistryObject IRONWOOD_INGOT = ITEMS.register("ironwood_ingot", () -> new Item(new Item.Properties())); + public static final RegistryObject IRONWOOD_HELMET = ITEMS.register("ironwood_helmet", () -> new IronwoodArmorItem(TwilightArmorMaterial.ARMOR_IRONWOOD, ArmorItem.Type.HELMET, new Item.Properties())); + public static final RegistryObject IRONWOOD_CHESTPLATE = ITEMS.register("ironwood_chestplate", () -> new IronwoodArmorItem(TwilightArmorMaterial.ARMOR_IRONWOOD, ArmorItem.Type.CHESTPLATE, new Item.Properties())); + public static final RegistryObject IRONWOOD_LEGGINGS = ITEMS.register("ironwood_leggings", () -> new IronwoodArmorItem(TwilightArmorMaterial.ARMOR_IRONWOOD, ArmorItem.Type.LEGGINGS, new Item.Properties())); + public static final RegistryObject IRONWOOD_BOOTS = ITEMS.register("ironwood_boots", () -> new IronwoodArmorItem(TwilightArmorMaterial.ARMOR_IRONWOOD, ArmorItem.Type.BOOTS, new Item.Properties())); + public static final RegistryObject IRONWOOD_SWORD = ITEMS.register("ironwood_sword", () -> new SwordItem(TwilightItemTier.IRONWOOD, 3, -2.4F, new Item.Properties())); + public static final RegistryObject IRONWOOD_SHOVEL = ITEMS.register("ironwood_shovel", () -> new ShovelItem(TwilightItemTier.IRONWOOD, 1.5F, -3.0F, new Item.Properties())); + public static final RegistryObject IRONWOOD_PICKAXE = ITEMS.register("ironwood_pickaxe", () -> new PickaxeItem(TwilightItemTier.IRONWOOD, 1, -2.8F, new Item.Properties())); + public static final RegistryObject IRONWOOD_AXE = ITEMS.register("ironwood_axe", () -> new AxeItem(TwilightItemTier.IRONWOOD, 6.0F, -3.1F, new Item.Properties())); + public static final RegistryObject IRONWOOD_HOE = ITEMS.register("ironwood_hoe", () -> new HoeItem(TwilightItemTier.IRONWOOD, -2, -1.0F, new Item.Properties())); + public static final RegistryObject TORCHBERRIES = ITEMS.register("torchberries", () -> new Item(new Item.Properties().food(new FoodProperties.Builder().alwaysEat().effect(() -> new MobEffectInstance(MobEffects.GLOWING, 100, 0), 0.75F).build()))); + public static final RegistryObject RAW_VENISON = ITEMS.register("raw_venison", () -> new Item(new Item.Properties().food(new FoodProperties.Builder().nutrition(3).saturationMod(0.3F).meat().build()))); + public static final RegistryObject COOKED_VENISON = ITEMS.register("cooked_venison", () -> new Item(new Item.Properties().food(new FoodProperties.Builder().nutrition(8).saturationMod(0.8F).meat().build()))); + public static final RegistryObject HYDRA_CHOP = ITEMS.register("hydra_chop", () -> new HydraChopItem(new Item.Properties().fireResistant().food(new FoodProperties.Builder().nutrition(18).saturationMod(2.0F).meat().effect(() -> new MobEffectInstance(MobEffects.REGENERATION, 100, 0), 1.0F).build()).rarity(Rarity.UNCOMMON))); + public static final RegistryObject FIERY_BLOOD = ITEMS.register("fiery_blood", () -> new Item(new Item.Properties().rarity(Rarity.UNCOMMON))); + public static final RegistryObject FIERY_TEARS = ITEMS.register("fiery_tears", () -> new Item(new Item.Properties().rarity(Rarity.UNCOMMON))); + public static final RegistryObject FIERY_INGOT = ITEMS.register("fiery_ingot", () -> new Item(new Item.Properties().fireResistant().rarity(Rarity.UNCOMMON))); + public static final RegistryObject FIERY_HELMET = ITEMS.register("fiery_helmet", () -> new FieryArmorItem(TwilightArmorMaterial.ARMOR_FIERY, ArmorItem.Type.HELMET, new Item.Properties().fireResistant().rarity(Rarity.UNCOMMON))); + public static final RegistryObject FIERY_CHESTPLATE = ITEMS.register("fiery_chestplate", () -> new FieryArmorItem(TwilightArmorMaterial.ARMOR_FIERY, ArmorItem.Type.CHESTPLATE, new Item.Properties().fireResistant().rarity(Rarity.UNCOMMON))); + public static final RegistryObject FIERY_LEGGINGS = ITEMS.register("fiery_leggings", () -> new FieryArmorItem(TwilightArmorMaterial.ARMOR_FIERY, ArmorItem.Type.LEGGINGS, new Item.Properties().fireResistant().rarity(Rarity.UNCOMMON))); + public static final RegistryObject FIERY_BOOTS = ITEMS.register("fiery_boots", () -> new FieryArmorItem(TwilightArmorMaterial.ARMOR_FIERY, ArmorItem.Type.BOOTS, new Item.Properties().fireResistant().rarity(Rarity.UNCOMMON))); + public static final RegistryObject FIERY_SWORD = ITEMS.register("fiery_sword", () -> new FierySwordItem(TwilightItemTier.FIERY, new Item.Properties().fireResistant().rarity(Rarity.UNCOMMON))); + public static final RegistryObject FIERY_PICKAXE = ITEMS.register("fiery_pickaxe", () -> new FieryPickItem(TwilightItemTier.FIERY, new Item.Properties().fireResistant().rarity(Rarity.UNCOMMON))); + public static final RegistryObject STEELEAF_INGOT = ITEMS.register("steeleaf_ingot", () -> new Item(new Item.Properties())); + public static final RegistryObject STEELEAF_HELMET = ITEMS.register("steeleaf_helmet", () -> new SteeleafArmorItem(TwilightArmorMaterial.ARMOR_STEELEAF, ArmorItem.Type.HELMET, new Item.Properties())); + public static final RegistryObject STEELEAF_CHESTPLATE = ITEMS.register("steeleaf_chestplate", () -> new SteeleafArmorItem(TwilightArmorMaterial.ARMOR_STEELEAF, ArmorItem.Type.CHESTPLATE, new Item.Properties())); + public static final RegistryObject STEELEAF_LEGGINGS = ITEMS.register("steeleaf_leggings", () -> new SteeleafArmorItem(TwilightArmorMaterial.ARMOR_STEELEAF, ArmorItem.Type.LEGGINGS, new Item.Properties())); + public static final RegistryObject STEELEAF_BOOTS = ITEMS.register("steeleaf_boots", () -> new SteeleafArmorItem(TwilightArmorMaterial.ARMOR_STEELEAF, ArmorItem.Type.BOOTS, new Item.Properties())); + public static final RegistryObject STEELEAF_SWORD = ITEMS.register("steeleaf_sword", () -> new SwordItem(TwilightItemTier.STEELEAF, 3, -2.4F, new Item.Properties())); + public static final RegistryObject STEELEAF_SHOVEL = ITEMS.register("steeleaf_shovel", () -> new ShovelItem(TwilightItemTier.STEELEAF, 1.5F, -3.0F, new Item.Properties())); + public static final RegistryObject STEELEAF_PICKAXE = ITEMS.register("steeleaf_pickaxe", () -> new PickaxeItem(TwilightItemTier.STEELEAF, 1, -2.8F, new Item.Properties())); + public static final RegistryObject STEELEAF_AXE = ITEMS.register("steeleaf_axe", () -> new AxeItem(TwilightItemTier.STEELEAF, 6.0F, -3.0F, new Item.Properties())); + public static final RegistryObject STEELEAF_HOE = ITEMS.register("steeleaf_hoe", () -> new HoeItem(TwilightItemTier.STEELEAF, -3, -0.5F, new Item.Properties())); + public static final RegistryObject GOLDEN_MINOTAUR_AXE = ITEMS.register("gold_minotaur_axe", () -> new MinotaurAxeItem(Tiers.GOLD, new Item.Properties().rarity(Rarity.COMMON))); + public static final RegistryObject DIAMOND_MINOTAUR_AXE = ITEMS.register("diamond_minotaur_axe", () -> new MinotaurAxeItem(Tiers.DIAMOND, new Item.Properties().rarity(Rarity.UNCOMMON))); + public static final RegistryObject MAZEBREAKER_PICKAXE = ITEMS.register("mazebreaker_pickaxe", () -> new MazebreakerPickItem(Tiers.DIAMOND, new Item.Properties().setNoRepair().rarity(Rarity.RARE))); + public static final RegistryObject RED_THREAD = ITEMS.register("red_thread", () -> new BlockItem(TFBlocks.RED_THREAD.get(), new Item.Properties())); + public static final RegistryObject TRANSFORMATION_POWDER = ITEMS.register("transformation_powder", () -> new TransformPowderItem(new Item.Properties())); + public static final RegistryObject RAW_MEEF = ITEMS.register("raw_meef", () -> new Item(new Item.Properties().food(new FoodProperties.Builder().nutrition(2).saturationMod(0.3F).meat().build()))); + public static final RegistryObject COOKED_MEEF = ITEMS.register("cooked_meef", () -> new Item(new Item.Properties().food(new FoodProperties.Builder().nutrition(6).saturationMod(0.6F).meat().build()))); + public static final RegistryObject MEEF_STROGANOFF = ITEMS.register("meef_stroganoff", () -> new BowlFoodItem(new Item.Properties().stacksTo(1).fireResistant().food(new FoodProperties.Builder().nutrition(8).saturationMod(0.6F).alwaysEat().build()))); + public static final RegistryObject MAZE_WAFER = ITEMS.register("maze_wafer", () -> new Item(new Item.Properties().food(new FoodProperties.Builder().nutrition(4).saturationMod(0.6F).build()))); + public static final RegistryObject ORE_MAGNET = ITEMS.register("ore_magnet", () -> new OreMagnetItem(new Item.Properties().durability(64))); + public static final RegistryObject CRUMBLE_HORN = ITEMS.register("crumble_horn", () -> new CrumbleHornItem(new Item.Properties().durability(1024).rarity(Rarity.RARE))); + public static final RegistryObject PEACOCK_FEATHER_FAN = ITEMS.register("peacock_feather_fan", () -> new PeacockFanItem(new Item.Properties().durability(1024).rarity(Rarity.RARE))); + public static final RegistryObject MOONWORM_QUEEN = ITEMS.register("moonworm_queen", () -> new MoonwormQueenItem(new Item.Properties().setNoRepair().durability(256).rarity(Rarity.RARE))); + public static final RegistryObject BRITTLE_FLASK = ITEMS.register("brittle_potion_flask", () -> new BrittleFlaskItem(new Item.Properties().stacksTo(1))); + public static final RegistryObject GREATER_FLASK = ITEMS.register("greater_potion_flask", () -> new GreaterFlaskItem(new Item.Properties().stacksTo(1).rarity(Rarity.UNCOMMON).fireResistant())); + public static final RegistryObject CHARM_OF_LIFE_1 = ITEMS.register("charm_of_life_1", () -> new CuriosCharmItem(new Item.Properties().rarity(Rarity.UNCOMMON))); + public static final RegistryObject CHARM_OF_LIFE_2 = ITEMS.register("charm_of_life_2", () -> new CuriosCharmItem(new Item.Properties().rarity(Rarity.UNCOMMON))); + public static final RegistryObject CHARM_OF_KEEPING_1 = ITEMS.register("charm_of_keeping_1", () -> new CuriosCharmItem(new Item.Properties().rarity(Rarity.UNCOMMON))); + public static final RegistryObject CHARM_OF_KEEPING_2 = ITEMS.register("charm_of_keeping_2", () -> new CuriosCharmItem(new Item.Properties().rarity(Rarity.UNCOMMON))); + public static final RegistryObject CHARM_OF_KEEPING_3 = ITEMS.register("charm_of_keeping_3", () -> new CuriosCharmItem(new Item.Properties().rarity(Rarity.UNCOMMON))); + public static final RegistryObject TOWER_KEY = ITEMS.register("tower_key", () -> new Item(new Item.Properties().fireResistant().rarity(Rarity.UNCOMMON))); + public static final RegistryObject BORER_ESSENCE = ITEMS.register("borer_essence", () -> new Item(new Item.Properties())); + public static final RegistryObject CARMINITE = ITEMS.register("carminite", () -> new Item(new Item.Properties())); + public static final RegistryObject EXPERIMENT_115 = ITEMS.register("experiment_115", () -> new Experiment115Item(TFBlocks.EXPERIMENT_115.get(), new Item.Properties().food(new FoodProperties.Builder().nutrition(4).saturationMod(0.3F).build()))); + public static final RegistryObject ARMOR_SHARD = ITEMS.register("armor_shard", () -> new Item(new Item.Properties())); + public static final RegistryObject ARMOR_SHARD_CLUSTER = ITEMS.register("armor_shard_cluster", () -> new Item(new Item.Properties())); + public static final RegistryObject KNIGHTMETAL_INGOT = ITEMS.register("knightmetal_ingot", () -> new Item(new Item.Properties())); + public static final RegistryObject KNIGHTMETAL_HELMET = ITEMS.register("knightmetal_helmet", () -> new KnightmetalArmorItem(TwilightArmorMaterial.ARMOR_KNIGHTLY, ArmorItem.Type.HELMET, new Item.Properties())); + public static final RegistryObject KNIGHTMETAL_CHESTPLATE = ITEMS.register("knightmetal_chestplate", () -> new KnightmetalArmorItem(TwilightArmorMaterial.ARMOR_KNIGHTLY, ArmorItem.Type.CHESTPLATE, new Item.Properties())); + public static final RegistryObject KNIGHTMETAL_LEGGINGS = ITEMS.register("knightmetal_leggings", () -> new KnightmetalArmorItem(TwilightArmorMaterial.ARMOR_KNIGHTLY, ArmorItem.Type.LEGGINGS, new Item.Properties())); + public static final RegistryObject KNIGHTMETAL_BOOTS = ITEMS.register("knightmetal_boots", () -> new KnightmetalArmorItem(TwilightArmorMaterial.ARMOR_KNIGHTLY, ArmorItem.Type.BOOTS, new Item.Properties())); + public static final RegistryObject KNIGHTMETAL_SWORD = ITEMS.register("knightmetal_sword", () -> new KnightmetalSwordItem(TwilightItemTier.KNIGHTMETAL, new Item.Properties())); + public static final RegistryObject KNIGHTMETAL_PICKAXE = ITEMS.register("knightmetal_pickaxe", () -> new KnightmetalPickItem(TwilightItemTier.KNIGHTMETAL, new Item.Properties())); + public static final RegistryObject KNIGHTMETAL_AXE = ITEMS.register("knightmetal_axe", () -> new KnightmetalAxeItem(TwilightItemTier.KNIGHTMETAL, new Item.Properties())); + public static final RegistryObject KNIGHTMETAL_RING = ITEMS.register("knightmetal_ring", () -> new Item(new Item.Properties())); + public static final RegistryObject KNIGHTMETAL_SHIELD = ITEMS.register("knightmetal_shield", () -> new KnightmetalShieldItem(new Item.Properties().durability(1024))); + public static final RegistryObject BLOCK_AND_CHAIN = ITEMS.register("block_and_chain", () -> new ChainBlockItem(new Item.Properties().durability(99))); + public static final RegistryObject PHANTOM_HELMET = ITEMS.register("phantom_helmet", () -> new PhantomArmorItem(TwilightArmorMaterial.ARMOR_PHANTOM, ArmorItem.Type.HELMET, new Item.Properties().rarity(Rarity.UNCOMMON))); + public static final RegistryObject PHANTOM_CHESTPLATE = ITEMS.register("phantom_chestplate", () -> new PhantomArmorItem(TwilightArmorMaterial.ARMOR_PHANTOM, ArmorItem.Type.CHESTPLATE, new Item.Properties().rarity(Rarity.UNCOMMON))); + public static final RegistryObject ICE_BOMB = ITEMS.register("ice_bomb", () -> new IceBombItem(new Item.Properties().stacksTo(16))); + public static final RegistryObject ARCTIC_FUR = ITEMS.register("arctic_fur", () -> new Item(new Item.Properties())); + public static final RegistryObject ARCTIC_HELMET = ITEMS.register("arctic_helmet", () -> new ArcticArmorItem(TwilightArmorMaterial.ARMOR_ARCTIC, ArmorItem.Type.HELMET, new Item.Properties())); + public static final RegistryObject ARCTIC_CHESTPLATE = ITEMS.register("arctic_chestplate", () -> new ArcticArmorItem(TwilightArmorMaterial.ARMOR_ARCTIC, ArmorItem.Type.CHESTPLATE, new Item.Properties())); + public static final RegistryObject ARCTIC_LEGGINGS = ITEMS.register("arctic_leggings", () -> new ArcticArmorItem(TwilightArmorMaterial.ARMOR_ARCTIC, ArmorItem.Type.LEGGINGS, new Item.Properties())); + public static final RegistryObject ARCTIC_BOOTS = ITEMS.register("arctic_boots", () -> new ArcticArmorItem(TwilightArmorMaterial.ARMOR_ARCTIC, ArmorItem.Type.BOOTS, new Item.Properties())); + public static final RegistryObject ALPHA_YETI_FUR = ITEMS.register("alpha_yeti_fur", () -> new Item(new Item.Properties().rarity(Rarity.UNCOMMON))); + public static final RegistryObject YETI_HELMET = ITEMS.register("yeti_helmet", () -> new YetiArmorItem(TwilightArmorMaterial.ARMOR_YETI, ArmorItem.Type.HELMET, new Item.Properties().rarity(Rarity.UNCOMMON))); + public static final RegistryObject YETI_CHESTPLATE = ITEMS.register("yeti_chestplate", () -> new YetiArmorItem(TwilightArmorMaterial.ARMOR_YETI, ArmorItem.Type.CHESTPLATE, new Item.Properties().rarity(Rarity.UNCOMMON))); + public static final RegistryObject YETI_LEGGINGS = ITEMS.register("yeti_leggings", () -> new YetiArmorItem(TwilightArmorMaterial.ARMOR_YETI, ArmorItem.Type.LEGGINGS, new Item.Properties().rarity(Rarity.UNCOMMON))); + public static final RegistryObject YETI_BOOTS = ITEMS.register("yeti_boots", () -> new YetiArmorItem(TwilightArmorMaterial.ARMOR_YETI, ArmorItem.Type.BOOTS, new Item.Properties().rarity(Rarity.UNCOMMON))); + public static final RegistryObject TRIPLE_BOW = ITEMS.register("triple_bow", () -> new TripleBowItem(new Item.Properties().rarity(Rarity.UNCOMMON).durability(384))); + public static final RegistryObject SEEKER_BOW = ITEMS.register("seeker_bow", () -> new SeekerBowItem(new Item.Properties().rarity(Rarity.UNCOMMON).durability(384))); + public static final RegistryObject ICE_BOW = ITEMS.register("ice_bow", () -> new IceBowItem(new Item.Properties().rarity(Rarity.UNCOMMON).durability(384))); + public static final RegistryObject ENDER_BOW = ITEMS.register("ender_bow", () -> new EnderBowItem(new Item.Properties().rarity(Rarity.UNCOMMON).durability(384))); + public static final RegistryObject ICE_SWORD = ITEMS.register("ice_sword", () -> new IceSwordItem(TwilightItemTier.ICE, new Item.Properties())); + public static final RegistryObject GLASS_SWORD = ITEMS.register("glass_sword", () -> new GlassSwordItem(TwilightItemTier.GLASS, new Item.Properties().setNoRepair().rarity(Rarity.RARE))); + public static final RegistryObject MAGIC_BEANS = ITEMS.register("magic_beans", () -> new MagicBeansItem(new Item.Properties())); + public static final RegistryObject GIANT_PICKAXE = ITEMS.register("giant_pickaxe", () -> new GiantPickItem(TwilightItemTier.GIANT, new Item.Properties())); + public static final RegistryObject GIANT_SWORD = ITEMS.register("giant_sword", () -> new GiantSwordItem(TwilightItemTier.GIANT, new Item.Properties())); + public static final RegistryObject LAMP_OF_CINDERS = ITEMS.register("lamp_of_cinders", () -> new LampOfCindersItem(new Item.Properties().fireResistant().durability(1024).rarity(Rarity.UNCOMMON))); + public static final RegistryObject CUBE_TALISMAN = ITEMS.register("cube_talisman", () -> new Item(new Item.Properties().fireResistant().rarity(Rarity.UNCOMMON))); + public static final RegistryObject CUBE_OF_ANNIHILATION = ITEMS.register("cube_of_annihilation", () -> new CubeOfAnnihilationItem(new Item.Properties().stacksTo(1).fireResistant().rarity(Rarity.UNCOMMON))); + public static final RegistryObject MOON_DIAL = ITEMS.register("moon_dial", () -> new MoonDialItem(new Item.Properties())); + + public static final RegistryObject TWILIGHT_OAK_BOAT = ITEMS.register("twilight_oak_boat", () -> new TwilightBoatItem(false, TwilightBoat.Type.TWILIGHT_OAK, new Item.Properties().stacksTo(1))); + public static final RegistryObject TWILIGHT_OAK_CHEST_BOAT = ITEMS.register("twilight_oak_chest_boat", () -> new TwilightBoatItem(true, TwilightBoat.Type.TWILIGHT_OAK, new Item.Properties().stacksTo(1))); + public static final RegistryObject CANOPY_BOAT = ITEMS.register("canopy_boat", () -> new TwilightBoatItem(false, TwilightBoat.Type.CANOPY, new Item.Properties().stacksTo(1))); + public static final RegistryObject CANOPY_CHEST_BOAT = ITEMS.register("canopy_chest_boat", () -> new TwilightBoatItem(true, TwilightBoat.Type.CANOPY, new Item.Properties().stacksTo(1))); + public static final RegistryObject MANGROVE_BOAT = ITEMS.register("mangrove_boat", () -> new TwilightBoatItem(false, TwilightBoat.Type.MANGROVE, new Item.Properties().stacksTo(1))); + public static final RegistryObject MANGROVE_CHEST_BOAT = ITEMS.register("mangrove_chest_boat", () -> new TwilightBoatItem(true, TwilightBoat.Type.MANGROVE, new Item.Properties().stacksTo(1))); + public static final RegistryObject DARKWOOD_BOAT = ITEMS.register("dark_boat", () -> new TwilightBoatItem(false, TwilightBoat.Type.DARKWOOD, new Item.Properties().stacksTo(1))); + public static final RegistryObject DARKWOOD_CHEST_BOAT = ITEMS.register("dark_chest_boat", () -> new TwilightBoatItem(true, TwilightBoat.Type.DARKWOOD, new Item.Properties().stacksTo(1))); + public static final RegistryObject TIME_BOAT = ITEMS.register("time_boat", () -> new TwilightBoatItem(false, TwilightBoat.Type.TIME, new Item.Properties().stacksTo(1))); + public static final RegistryObject TIME_CHEST_BOAT = ITEMS.register("time_chest_boat", () -> new TwilightBoatItem(true, TwilightBoat.Type.TIME, new Item.Properties().stacksTo(1))); + public static final RegistryObject TRANSFORMATION_BOAT = ITEMS.register("transformation_boat", () -> new TwilightBoatItem(false, TwilightBoat.Type.TRANSFORMATION, new Item.Properties().stacksTo(1))); + public static final RegistryObject TRANSFORMATION_CHEST_BOAT = ITEMS.register("transformation_chest_boat", () -> new TwilightBoatItem(true, TwilightBoat.Type.TRANSFORMATION, new Item.Properties().stacksTo(1))); + public static final RegistryObject MINING_BOAT = ITEMS.register("mining_boat", () -> new TwilightBoatItem(false, TwilightBoat.Type.MINING, new Item.Properties().stacksTo(1))); + public static final RegistryObject MINING_CHEST_BOAT = ITEMS.register("mining_chest_boat", () -> new TwilightBoatItem(true, TwilightBoat.Type.MINING, new Item.Properties().stacksTo(1))); + public static final RegistryObject SORTING_BOAT = ITEMS.register("sorting_boat", () -> new TwilightBoatItem(false, TwilightBoat.Type.SORTING, new Item.Properties().stacksTo(1))); + public static final RegistryObject SORTING_CHEST_BOAT = ITEMS.register("sorting_chest_boat", () -> new TwilightBoatItem(true, TwilightBoat.Type.SORTING, new Item.Properties().stacksTo(1))); + + public static final RegistryObject MUSIC_DISC_RADIANCE = ITEMS.register("music_disc_radiance", () -> new RecordItem(15, TFSounds.MUSIC_DISC_RADIANCE, new Item.Properties().stacksTo(1).rarity(Rarity.RARE), 123 * 20)); + public static final RegistryObject MUSIC_DISC_STEPS = ITEMS.register("music_disc_steps", () -> new RecordItem(15, TFSounds.MUSIC_DISC_STEPS, new Item.Properties().stacksTo(1).rarity(Rarity.RARE), 195 * 20)); + public static final RegistryObject MUSIC_DISC_SUPERSTITIOUS = ITEMS.register("music_disc_superstitious", () -> new RecordItem(15, TFSounds.MUSIC_DISC_SUPERSTITIOUS, new Item.Properties().stacksTo(1).rarity(Rarity.RARE), 192 * 20)); + public static final RegistryObject MUSIC_DISC_HOME = ITEMS.register("music_disc_home", () -> new RecordItem(15, TFSounds.MUSIC_DISC_HOME, new Item.Properties().stacksTo(1).rarity(Rarity.RARE), 215 * 20)); + public static final RegistryObject MUSIC_DISC_WAYFARER = ITEMS.register("music_disc_wayfarer", () -> new RecordItem(15, TFSounds.MUSIC_DISC_WAYFARER, new Item.Properties().stacksTo(1).rarity(Rarity.RARE), 173 * 20)); + public static final RegistryObject MUSIC_DISC_FINDINGS = ITEMS.register("music_disc_findings", () -> new RecordItem(15, TFSounds.MUSIC_DISC_FINDINGS, new Item.Properties().stacksTo(1).rarity(Rarity.RARE), 196 * 20)); + public static final RegistryObject MUSIC_DISC_MAKER = ITEMS.register("music_disc_maker", () -> new RecordItem(15, TFSounds.MUSIC_DISC_MAKER, new Item.Properties().stacksTo(1).rarity(Rarity.RARE), 207 * 20)); + public static final RegistryObject MUSIC_DISC_THREAD = ITEMS.register("music_disc_thread", () -> new RecordItem(15, TFSounds.MUSIC_DISC_THREAD, new Item.Properties().stacksTo(1).rarity(Rarity.RARE), 201 * 20)); + public static final RegistryObject MUSIC_DISC_MOTION = ITEMS.register("music_disc_motion", () -> new RecordItem(15, TFSounds.MUSIC_DISC_MOTION, new Item.Properties().stacksTo(1).rarity(Rarity.RARE), 169 * 20)); + + public static final RegistryObject NAGA_BANNER_PATTERN = ITEMS.register("naga_banner_pattern", () -> new BannerPatternItem(CustomTagGenerator.BannerPatternTagGenerator.NAGA_BANNER_PATTERN, new Item.Properties().stacksTo(1).rarity(TwilightForestMod.getRarity()))); + public static final RegistryObject LICH_BANNER_PATTERN = ITEMS.register("lich_banner_pattern", () -> new BannerPatternItem(CustomTagGenerator.BannerPatternTagGenerator.LICH_BANNER_PATTERN, new Item.Properties().stacksTo(1).rarity(TwilightForestMod.getRarity()))); + public static final RegistryObject MINOSHROOM_BANNER_PATTERN = ITEMS.register("minoshroom_banner_pattern", () -> new BannerPatternItem(CustomTagGenerator.BannerPatternTagGenerator.MINOSHROOM_BANNER_PATTERN, new Item.Properties().stacksTo(1).rarity(TwilightForestMod.getRarity()))); + public static final RegistryObject HYDRA_BANNER_PATTERN = ITEMS.register("hydra_banner_pattern", () -> new BannerPatternItem(CustomTagGenerator.BannerPatternTagGenerator.HYDRA_BANNER_PATTERN, new Item.Properties().stacksTo(1).rarity(TwilightForestMod.getRarity()))); + public static final RegistryObject KNIGHT_PHANTOM_BANNER_PATTERN = ITEMS.register("knight_phantom_banner_pattern", () -> new BannerPatternItem(CustomTagGenerator.BannerPatternTagGenerator.KNIGHT_PHANTOM_BANNER_PATTERN, new Item.Properties().stacksTo(1).rarity(TwilightForestMod.getRarity()))); + public static final RegistryObject UR_GHAST_BANNER_PATTERN = ITEMS.register("ur_ghast_banner_pattern", () -> new BannerPatternItem(CustomTagGenerator.BannerPatternTagGenerator.UR_GHAST_BANNER_PATTERN, new Item.Properties().stacksTo(1).rarity(TwilightForestMod.getRarity()))); + public static final RegistryObject ALPHA_YETI_BANNER_PATTERN = ITEMS.register("alpha_yeti_banner_pattern", () -> new BannerPatternItem(CustomTagGenerator.BannerPatternTagGenerator.ALPHA_YETI_BANNER_PATTERN, new Item.Properties().stacksTo(1).rarity(TwilightForestMod.getRarity()))); + public static final RegistryObject SNOW_QUEEN_BANNER_PATTERN = ITEMS.register("snow_queen_banner_pattern", () -> new BannerPatternItem(CustomTagGenerator.BannerPatternTagGenerator.SNOW_QUEEN_BANNER_PATTERN, new Item.Properties().stacksTo(1).rarity(TwilightForestMod.getRarity()))); + public static final RegistryObject QUEST_RAM_BANNER_PATTERN = ITEMS.register("quest_ram_banner_pattern", () -> new BannerPatternItem(CustomTagGenerator.BannerPatternTagGenerator.QUEST_RAM_BANNER_PATTERN, new Item.Properties().stacksTo(1).rarity(TwilightForestMod.getRarity()))); + + @OnlyIn(Dist.CLIENT) + public static void addItemModelProperties() { + ItemProperties.register(CUBE_OF_ANNIHILATION.get(), TwilightForestMod.prefix("thrown"), (stack, world, entity, idk) -> + CubeOfAnnihilationItem.getThrownUuid(stack) != null ? 1 : 0); + + ItemProperties.register(TFItems.KNIGHTMETAL_SHIELD.get(), new ResourceLocation("blocking"), (stack, world, entity, idk) -> + entity != null && entity.isUsingItem() && entity.getUseItem() == stack ? 1.0F : 0.0F); + + ItemProperties.register(MOON_DIAL.get(), new ResourceLocation("phase"), new ItemPropertyFunction() { + @Override + public float call(ItemStack stack, @Nullable ClientLevel world, @Nullable LivingEntity entityBase, int idk) { + boolean flag = entityBase != null; + Entity entity = flag ? entityBase : stack.getFrame(); + + if (world == null && entity != null) world = (ClientLevel) entity.level; + + return world == null ? 0.0F : (float) (world.dimensionType().natural() ? Mth.frac(world.getMoonPhase() / 8.0f) : this.wobble(world, Math.random())); + } + + @OnlyIn(Dist.CLIENT) + double rotation; + @OnlyIn(Dist.CLIENT) + double rota; + @OnlyIn(Dist.CLIENT) + long lastUpdateTick; + + @OnlyIn(Dist.CLIENT) + private double wobble(Level world, double rotation) { + if (world.getGameTime() != this.lastUpdateTick) { + this.lastUpdateTick = world.getGameTime(); + double delta = rotation - this.rotation; + delta = Mth.positiveModulo(delta + 0.5D, 1.0D) - 0.5D; + this.rota += delta * 0.1D; + this.rota *= 0.9D; + this.rotation = Mth.positiveModulo(this.rotation + this.rota, 1.0D); + } + return this.rotation; + } + }); + + ItemProperties.register(MOONWORM_QUEEN.get(), TwilightForestMod.prefix("alt"), (stack, world, entity, idk) -> { + if (entity != null && entity.getUseItem() == stack) { + int useTime = stack.getUseDuration() - entity.getUseItemRemainingTicks(); + if (useTime >= MoonwormQueenItem.FIRING_TIME && (useTime >>> 1) % 2 == 0) { + return 1; + } + } + return 0; + }); + + ItemProperties.register(TFItems.ENDER_BOW.get(), new ResourceLocation("pull"), (stack, world, entity, idk) -> { + if (entity == null) return 0.0F; + else + return entity.getUseItem() != stack ? 0.0F : (stack.getUseDuration() - entity.getUseItemRemainingTicks()) / 20.0F; + }); + + ItemProperties.register(TFItems.ENDER_BOW.get(), new ResourceLocation("pulling"), (stack, world, entity, idk) -> + entity != null && entity.isUsingItem() && entity.getUseItem() == stack ? 1.0F : 0.0F); + + ItemProperties.register(TFItems.ICE_BOW.get(), new ResourceLocation("pull"), (stack, world, entity, idk) -> { + if (entity == null) return 0.0F; + else + return entity.getUseItem() != stack ? 0.0F : (stack.getUseDuration() - entity.getUseItemRemainingTicks()) / 20.0F; + }); + + ItemProperties.register(TFItems.ICE_BOW.get(), new ResourceLocation("pulling"), (stack, world, entity, idk) -> + entity != null && entity.isUsingItem() && entity.getUseItem() == stack ? 1.0F : 0.0F); + + ItemProperties.register(TFItems.SEEKER_BOW.get(), new ResourceLocation("pull"), (stack, world, entity, idk) -> { + if (entity == null) return 0.0F; + else + return entity.getUseItem() != stack ? 0.0F : (stack.getUseDuration() - entity.getUseItemRemainingTicks()) / 20.0F; + }); + + ItemProperties.register(TFItems.SEEKER_BOW.get(), new ResourceLocation("pulling"), (stack, world, entity, idk) -> + entity != null && entity.isUsingItem() && entity.getUseItem() == stack ? 1.0F : 0.0F); + + ItemProperties.register(TFItems.TRIPLE_BOW.get(), new ResourceLocation("pull"), (stack, world, entity, idk) -> { + if (entity == null) return 0.0F; + else + return entity.getUseItem() != stack ? 0.0F : (stack.getUseDuration() - entity.getUseItemRemainingTicks()) / 20.0F; + }); + + ItemProperties.register(TFItems.TRIPLE_BOW.get(), new ResourceLocation("pulling"), (stack, world, entity, idk) -> + entity != null && entity.isUsingItem() && entity.getUseItem() == stack ? 1.0F : 0.0F); + + ItemProperties.register(ORE_MAGNET.get(), new ResourceLocation("pull"), (stack, world, entity, idk) -> { + if (entity == null) return 0.0F; + else { + ItemStack itemstack = entity.getUseItem(); + return !itemstack.isEmpty() ? (stack.getUseDuration() - entity.getUseItemRemainingTicks()) / 20.0F : 0.0F; + } + }); + + ItemProperties.register(ORE_MAGNET.get(), new ResourceLocation("pulling"), (stack, world, entity, idk) -> + entity != null && entity.isUsingItem() && entity.getUseItem() == stack ? 1.0F : 0.0F); + + ItemProperties.register(BLOCK_AND_CHAIN.get(), TwilightForestMod.prefix("thrown"), (stack, world, entity, idk) -> + ChainBlockItem.getThrownUuid(stack) != null ? 1 : 0); + + ItemProperties.register(EXPERIMENT_115.get(), Experiment115Item.THINK, (stack, world, entity, idk) -> + stack.hasTag() && stack.getTag().contains("think") ? 1 : 0); + + ItemProperties.register(EXPERIMENT_115.get(), Experiment115Item.FULL, (stack, world, entity, idk) -> + stack.hasTag() && stack.getTag().contains("full") ? 1 : 0); + + ItemProperties.register(TFItems.BRITTLE_FLASK.get(), TwilightForestMod.prefix("breakage"), (stack, world, entity, i) -> + stack.getOrCreateTag().getInt("Breakage")); + + ItemProperties.register(TFItems.BRITTLE_FLASK.get(), TwilightForestMod.prefix("potion_level"), (stack, world, entity, i) -> + stack.getOrCreateTag().getInt("Uses")); + + ItemProperties.register(TFItems.GREATER_FLASK.get(), TwilightForestMod.prefix("potion_level"), (stack, world, entity, i) -> + stack.getOrCreateTag().getInt("Uses")); + } +} diff --git a/src/main/java/twilightforest/init/TFLandmark.java b/src/main/java/twilightforest/init/TFLandmark.java new file mode 100644 index 0000000000..9cd225b4e0 --- /dev/null +++ b/src/main/java/twilightforest/init/TFLandmark.java @@ -0,0 +1,210 @@ +package twilightforest.init; + +import com.google.common.collect.ImmutableMap; +import com.mojang.serialization.Codec; +import com.mojang.serialization.DataResult; +import net.minecraft.Util; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplateManager; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import twilightforest.world.components.structures.*; +import twilightforest.world.components.structures.courtyard.CourtyardMain; +import twilightforest.world.components.structures.darktower.DarkTowerMainComponent; +import twilightforest.world.components.structures.finalcastle.FinalCastleMainComponent; +import twilightforest.world.components.structures.icetower.IceTowerMainComponent; +import twilightforest.world.components.structures.lichtower.TowerMainComponent; +import twilightforest.world.components.structures.minotaurmaze.MazeRuinsComponent; +import twilightforest.world.components.structures.mushroomtower.MushroomTowerMainComponent; +import twilightforest.world.components.structures.stronghold.StrongholdEntranceComponent; +import twilightforest.world.components.structures.trollcave.TrollCaveMainComponent; + +public class TFLandmark { + public static final TFLandmark NOTHING = new TFLandmark( 0, "no_feature", false, false); + public static final TFLandmark SMALL_HILL = new TFLandmark( 1, "small_hollow_hill", true, true) { + @Override + public StructurePiece provideFirstPiece(StructureTemplateManager structureManager, ChunkGenerator chunkGenerator, RandomSource rand, int x, int y, int z) { + return new HollowHillComponent(TFStructurePieceTypes.TFHill.get(), 0, size, x - 3, y - 2, z - 3); + } + }; + public static final TFLandmark MEDIUM_HILL = new TFLandmark( 2, "medium_hollow_hill", true, true) { + @Override + public StructurePiece provideFirstPiece(StructureTemplateManager structureManager, ChunkGenerator chunkGenerator, RandomSource rand, int x, int y, int z) { + return new HollowHillComponent(TFStructurePieceTypes.TFHill.get(), 0, size, x - 7, y - 5, z - 7); + } + }; + public static final TFLandmark LARGE_HILL = new TFLandmark( 3, "large_hollow_hill", true, true) { + @Override + public StructurePiece provideFirstPiece(StructureTemplateManager structureManager, ChunkGenerator chunkGenerator, RandomSource rand, int x, int y, int z) { + return new HollowHillComponent(TFStructurePieceTypes.TFHill.get(), 0, size, x - 11, y - 5, z - 11); + } + }; + public static final TFLandmark HEDGE_MAZE = new TFLandmark( 2, "hedge_maze", true, true) { + @Override + public StructurePiece provideFirstPiece(StructureTemplateManager structureManager, ChunkGenerator chunkGenerator, RandomSource rand, int x, int y, int z) { + return new HedgeMazeComponent(0, x + 1, chunkGenerator.getSeaLevel() + 8, z + 1); + } + }; + public static final TFLandmark QUEST_GROVE = new TFLandmark( 1, "quest_grove", true, true) { + @Override + public StructurePiece provideFirstPiece(StructureTemplateManager structureManager, ChunkGenerator chunkGenerator, RandomSource rand, int x, int y, int z) { + return new QuestGrove(structureManager, new BlockPos(x - 12, chunkGenerator.getSeaLevel() + 5, z - 12)); + } + }; + public static final TFLandmark NAGA_COURTYARD = new TFLandmark( 3, "naga_courtyard", true, true) { + @Override + public StructurePiece provideFirstPiece(StructureTemplateManager structureManager, ChunkGenerator chunkGenerator, RandomSource rand, int x, int y, int z) { + return new CourtyardMain(rand, 0, x + 1, chunkGenerator.getSeaLevel() + 5, z + 1, structureManager); + } + }; + public static final TFLandmark LICH_TOWER = new TFLandmark( 1, "lich_tower" ) { + @Override + public StructurePiece provideFirstPiece(StructureTemplateManager structureManager, ChunkGenerator chunkGenerator, RandomSource rand, int x, int y, int z) { + return new TowerMainComponent(rand, 0, x, y, z); + } + }; + public static final TFLandmark HYDRA_LAIR = new TFLandmark( 2, "hydra_lair", true, true) { + @Override + public StructurePiece provideFirstPiece(StructureTemplateManager structureManager, ChunkGenerator chunkGenerator, RandomSource rand, int x, int y, int z) { + return new HydraLairComponent(0, x - 7, y, z - 7); + } + }; + public static final TFLandmark LABYRINTH = new TFLandmark( 3, "labyrinth" ) { + @Override + public StructurePiece provideFirstPiece(StructureTemplateManager structureManager, ChunkGenerator chunkGenerator, RandomSource rand, int x, int y, int z) { + return new MazeRuinsComponent(0, x, y, z); + } + + }; + public static final TFLandmark DARK_TOWER = new TFLandmark( 1, "dark_tower" ) { + @Override + public StructurePiece provideFirstPiece(StructureTemplateManager structureManager, ChunkGenerator chunkGenerator, RandomSource rand, int x, int y, int z) { + return new DarkTowerMainComponent(rand, 0, x, y, z); + } + }; + public static final TFLandmark KNIGHT_STRONGHOLD = new TFLandmark( 3, "knight_stronghold" ) { + @Override + public StructurePiece provideFirstPiece(StructureTemplateManager structureManager, ChunkGenerator chunkGenerator, RandomSource rand, int x, int y, int z) { + return new StrongholdEntranceComponent(0, x, y + 5, z); + } + + }; + public static final TFLandmark YETI_CAVE = new TFLandmark( 2, "yeti_lairs", true, true) { + @Override + public StructurePiece provideFirstPiece(StructureTemplateManager structureManager, ChunkGenerator chunkGenerator, RandomSource rand, int x, int y, int z) { + return new YetiCaveComponent(0, x, y, z); + } + }; + public static final TFLandmark ICE_TOWER = new TFLandmark( 2, "ice_tower" ) { + @Override + public StructurePiece provideFirstPiece(StructureTemplateManager structureManager, ChunkGenerator chunkGenerator, RandomSource rand, int x, int y, int z) { + return new IceTowerMainComponent(rand, 0, x, y, z); + } + }; + // TODO split cloud giants from this + public static final TFLandmark TROLL_CAVE = new TFLandmark( 4, "troll_lairs", true, true) { + @Override + public StructurePiece provideFirstPiece(StructureTemplateManager structureManager, ChunkGenerator chunkGenerator, RandomSource rand, int x, int y, int z) { + return new TrollCaveMainComponent(TFStructurePieceTypes.TFTCMai.get(), 0, x, y, z); + } + }; + public static final TFLandmark FINAL_CASTLE = new TFLandmark( 4, "final_castle") { + @Override + public StructurePiece provideFirstPiece(StructureTemplateManager structureManager, ChunkGenerator chunkGenerator, RandomSource rand, int x, int y, int z) { + return new FinalCastleMainComponent(0, x, y, z); + } + }; + public static final TFLandmark MUSHROOM_TOWER = new TFLandmark( 2, "mushroom_tower", false, false) { + @Override + public StructurePiece provideFirstPiece(StructureTemplateManager structureManager, ChunkGenerator chunkGenerator, RandomSource rand, int x, int y, int z) { + return new MushroomTowerMainComponent(rand, 0, x, y, z); + } + }; + public static final TFLandmark QUEST_ISLAND = new TFLandmark( 1, "quest_island", false, false); + //public static final TFLandmark DRUID_GROVE = new TFLandmark( 1, "druid_grove" , false, false); + //public static final TFLandmark FLOATING_RUINS = new TFLandmark( 3, "floating_ruins", false, false); + //public static final TFLandmark WORLD_TREE = new TFLandmark( 3, "world_tree", false, false); + + public final int size; + public final String name; + // Tells the chunkgenerator if there's an associated structure. + public final boolean isStructureEnabled; + // Tells the chunkgenerator the terrain changes around the structure. + public final boolean requiresTerraforming; + + private static int maxPossibleSize; + + private TFLandmark(int size, String name) { + this(size, name, true, false); + } + + private TFLandmark(int size, String name, boolean isStructureEnabled, boolean requiresTerraforming) { + this.size = size; + this.name = name; + this.isStructureEnabled = isStructureEnabled; + this.requiresTerraforming = requiresTerraforming; + + maxPossibleSize = Math.max(this.size, maxPossibleSize); + } + + @Deprecated // Not good practice - TODO The root need for this method can be fixed + public static int getMaxSearchSize() { + return maxPossibleSize; + } + + @Deprecated // TODO Deleting this method will break maps - best to wait until new MC version before committing to it. + @Nullable + public StructurePiece provideFirstPiece(StructureTemplateManager structureManager, ChunkGenerator chunkGenerator, RandomSource rand, int x, int y, int z) { + return null; + } + + @NotNull + public static BoundingBox getComponentToAddBoundingBox(int x, int y, int z, int minX, int minY, int minZ, int spanX, int spanY, int spanZ, @Nullable Direction dir, boolean centerBounds) { + // CenterBounds is true for ONLY Hollow Hills, Hydra Lair, & Yeti Caves + if(centerBounds) { + x += (spanX + minX) / 4; + y += (spanY + minY) / 4; + z += (spanZ + minZ) / 4; + } + return switch (dir) { + case WEST -> // '\001' + new BoundingBox(x - spanZ + minZ, y + minY, z + minX, x + minZ, y + spanY + minY, z + spanX + minX); + case NORTH -> // '\002' + new BoundingBox(x - spanX - minX, y + minY, z - spanZ - minZ, x - minX, y + spanY + minY, z - minZ); + case EAST -> // '\003' + new BoundingBox(x + minZ, y + minY, z - spanX, x + spanZ + minZ, y + spanY + minY, z + minX); + default -> // '\0' + new BoundingBox(x + minX, y + minY, z + minZ, x + spanX + minX, y + spanY + minY, z + spanZ + minZ); + }; + } + + private static final ImmutableMap NAME_2_TYPE = Util.make(() -> ImmutableMap.builder() + .put("mushroom_tower", TFLandmark.MUSHROOM_TOWER) + .put("small_hollow_hill", TFLandmark.SMALL_HILL) + .put("medium_hollow_hill", TFLandmark.MEDIUM_HILL) + .put("large_hollow_hill", TFLandmark.LARGE_HILL) + .put("hedge_maze", TFLandmark.HEDGE_MAZE) + .put("quest_grove", TFLandmark.QUEST_GROVE) + .put("quest_island", TFLandmark.QUEST_ISLAND) + .put("naga_courtyard", TFLandmark.NAGA_COURTYARD) + .put("lich_tower", TFLandmark.LICH_TOWER) + .put("hydra_lair", TFLandmark.HYDRA_LAIR) + .put("labyrinth", TFLandmark.LABYRINTH) + .put("dark_tower", TFLandmark.DARK_TOWER) + .put("knight_stronghold", TFLandmark.KNIGHT_STRONGHOLD) + .put("yeti_lairs", TFLandmark.YETI_CAVE) + .put("ice_tower", TFLandmark.ICE_TOWER) + .put("troll_lairs", TFLandmark.TROLL_CAVE) + .put("final_castle", TFLandmark.FINAL_CASTLE) + .build()); + + public static final Codec CODEC = Codec.STRING.comapFlatMap( + name -> TFLandmark.NAME_2_TYPE.containsKey(name) ? DataResult.success(TFLandmark.NAME_2_TYPE.get(name)) : DataResult.error(() -> "Landmark " + name + " not recognized!"), + tfFeature -> tfFeature.name + ); +} diff --git a/src/main/java/twilightforest/init/TFLoot.java b/src/main/java/twilightforest/init/TFLoot.java new file mode 100644 index 0000000000..f2c43664ed --- /dev/null +++ b/src/main/java/twilightforest/init/TFLoot.java @@ -0,0 +1,23 @@ +package twilightforest.init; + +import net.minecraft.core.registries.Registries; +import net.minecraft.world.level.storage.loot.functions.LootItemFunctionType; +import net.minecraft.world.level.storage.loot.predicates.LootItemConditionType; +import net.minecraftforge.registries.DeferredRegister; +import net.minecraftforge.registries.RegistryObject; +import twilightforest.TwilightForestMod; +import twilightforest.loot.conditions.IsMinion; +import twilightforest.loot.conditions.ModExists; +import twilightforest.loot.functions.ModItemSwap; + +public class TFLoot { + + public static final DeferredRegister CONDITIONS = DeferredRegister.create(Registries.LOOT_CONDITION_TYPE, TwilightForestMod.ID); + public static final DeferredRegister FUNCTIONS = DeferredRegister.create(Registries.LOOT_FUNCTION_TYPE, TwilightForestMod.ID); + + public static final RegistryObject ITEM_OR_DEFAULT = FUNCTIONS.register("item_or_default", () -> new LootItemFunctionType(new ModItemSwap.Serializer())); + + public static final RegistryObject IS_MINION = CONDITIONS.register("is_minion", () -> new LootItemConditionType(new IsMinion.ConditionSerializer())); + public static final RegistryObject MOD_EXISTS = CONDITIONS.register("mod_exists", () -> new LootItemConditionType(new ModExists.ConditionSerializer())); + +} diff --git a/src/main/java/twilightforest/init/TFLootModifiers.java b/src/main/java/twilightforest/init/TFLootModifiers.java new file mode 100644 index 0000000000..cc7498c9e6 --- /dev/null +++ b/src/main/java/twilightforest/init/TFLootModifiers.java @@ -0,0 +1,18 @@ +package twilightforest.init; + +import com.mojang.serialization.Codec; +import net.minecraftforge.common.loot.IGlobalLootModifier; +import net.minecraftforge.registries.DeferredRegister; +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.registries.RegistryObject; +import twilightforest.TwilightForestMod; +import twilightforest.loot.modifiers.FieryToolSmeltingModifier; +import twilightforest.loot.modifiers.GiantToolGroupingModifier; + +public class TFLootModifiers { + + public static final DeferredRegister> LOOT_MODIFIERS = DeferredRegister.create(ForgeRegistries.Keys.GLOBAL_LOOT_MODIFIER_SERIALIZERS, TwilightForestMod.ID); + + public static final RegistryObject> FIERY_PICK_SMELTING = LOOT_MODIFIERS.register("fiery_pick_smelting", () -> FieryToolSmeltingModifier.CODEC); + public static final RegistryObject> GIANT_PICK_GROUPING = LOOT_MODIFIERS.register("giant_block_grouping", () -> GiantToolGroupingModifier.CODEC); +} diff --git a/src/main/java/twilightforest/init/TFMenuTypes.java b/src/main/java/twilightforest/init/TFMenuTypes.java new file mode 100644 index 0000000000..693520bec0 --- /dev/null +++ b/src/main/java/twilightforest/init/TFMenuTypes.java @@ -0,0 +1,26 @@ +package twilightforest.init; + +import net.minecraft.client.gui.screens.MenuScreens; +import net.minecraft.world.flag.FeatureFlags; +import net.minecraft.world.inventory.MenuType; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.registries.DeferredRegister; +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.registries.RegistryObject; +import twilightforest.TwilightForestMod; +import twilightforest.client.UncraftingScreen; +import twilightforest.inventory.UncraftingMenu; + +public class TFMenuTypes { + + public static final DeferredRegister> CONTAINERS = DeferredRegister.create(ForgeRegistries.MENU_TYPES, TwilightForestMod.ID); + + public static final RegistryObject> UNCRAFTING = CONTAINERS.register("uncrafting", + () -> new MenuType<>(UncraftingMenu::fromNetwork, FeatureFlags.REGISTRY.allFlags())); + + @OnlyIn(Dist.CLIENT) + public static void renderScreens() { + MenuScreens.register(UNCRAFTING.get(), UncraftingScreen::new); + } +} diff --git a/src/main/java/twilightforest/init/TFMobEffects.java b/src/main/java/twilightforest/init/TFMobEffects.java new file mode 100644 index 0000000000..786562c112 --- /dev/null +++ b/src/main/java/twilightforest/init/TFMobEffects.java @@ -0,0 +1,15 @@ +package twilightforest.init; + +import net.minecraft.world.effect.MobEffect; +import net.minecraftforge.registries.DeferredRegister; +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.registries.RegistryObject; +import twilightforest.TwilightForestMod; +import twilightforest.potions.FrostedEffect; + +public class TFMobEffects { + + public static final DeferredRegister MOB_EFFECTS = DeferredRegister.create(ForgeRegistries.MOB_EFFECTS, TwilightForestMod.ID); + + public static final RegistryObject FROSTY = MOB_EFFECTS.register("frosted", FrostedEffect::new); +} diff --git a/src/main/java/twilightforest/init/TFPOITypes.java b/src/main/java/twilightforest/init/TFPOITypes.java new file mode 100644 index 0000000000..0cd9d5c8a6 --- /dev/null +++ b/src/main/java/twilightforest/init/TFPOITypes.java @@ -0,0 +1,16 @@ +package twilightforest.init; + +import com.google.common.collect.ImmutableSet; +import net.minecraft.world.entity.ai.village.poi.PoiType; +import net.minecraftforge.registries.DeferredRegister; +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.registries.RegistryObject; +import twilightforest.TwilightForestMod; + +public class TFPOITypes { + + public static final DeferredRegister POIS = DeferredRegister.create(ForgeRegistries.POI_TYPES, TwilightForestMod.ID); + + public static final RegistryObject GHAST_TRAP = POIS.register("ghast_trap", () -> new PoiType(ImmutableSet.copyOf(TFBlocks.GHAST_TRAP.get().getStateDefinition().getPossibleStates()), 0, 1)); + +} diff --git a/src/main/java/twilightforest/init/TFParticleType.java b/src/main/java/twilightforest/init/TFParticleType.java new file mode 100644 index 0000000000..5fea740a92 --- /dev/null +++ b/src/main/java/twilightforest/init/TFParticleType.java @@ -0,0 +1,80 @@ +package twilightforest.init; + +import com.mojang.serialization.Codec; +import net.minecraft.client.Minecraft; +import net.minecraft.client.particle.FlameParticle; +import net.minecraft.client.particle.ParticleEngine; +import net.minecraft.core.particles.ParticleType; +import net.minecraft.core.particles.SimpleParticleType; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.client.event.RegisterParticleProvidersEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.registries.DeferredRegister; +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.registries.RegistryObject; +import twilightforest.TwilightForestMod; +import twilightforest.client.particle.*; +import twilightforest.client.particle.data.LeafParticleData; +import twilightforest.client.particle.data.PinnedFireflyData; + +@Mod.EventBusSubscriber(modid = TwilightForestMod.ID, bus = Mod.EventBusSubscriber.Bus.MOD, value = Dist.CLIENT) +public class TFParticleType { + + public static final DeferredRegister> PARTICLE_TYPES = DeferredRegister.create(ForgeRegistries.PARTICLE_TYPES, TwilightForestMod.ID); + + public static final RegistryObject LARGE_FLAME = PARTICLE_TYPES.register("large_flame", () -> new SimpleParticleType(false)); + public static final RegistryObject LEAF_RUNE = PARTICLE_TYPES.register("leaf_rune", () -> new SimpleParticleType(false)); + public static final RegistryObject BOSS_TEAR = PARTICLE_TYPES.register("boss_tear", () -> new SimpleParticleType(false)); + public static final RegistryObject GHAST_TRAP = PARTICLE_TYPES.register("ghast_trap", () -> new SimpleParticleType(false)); + public static final RegistryObject PROTECTION = PARTICLE_TYPES.register("protection", () -> new SimpleParticleType(true)); + public static final RegistryObject SNOW = PARTICLE_TYPES.register("snow", () -> new SimpleParticleType(false)); + public static final RegistryObject SNOW_WARNING = PARTICLE_TYPES.register("snow_warning", () -> new SimpleParticleType(false)); + public static final RegistryObject EXTENDED_SNOW_WARNING = PARTICLE_TYPES.register("extended_snow_warning", () -> new SimpleParticleType(false)); + public static final RegistryObject SNOW_GUARDIAN = PARTICLE_TYPES.register("snow_guardian", () -> new SimpleParticleType(false)); + public static final RegistryObject ICE_BEAM = PARTICLE_TYPES.register("ice_beam", () -> new SimpleParticleType(false)); + public static final RegistryObject ANNIHILATE = PARTICLE_TYPES.register("annihilate", () -> new SimpleParticleType(false)); + public static final RegistryObject HUGE_SMOKE = PARTICLE_TYPES.register("huge_smoke", () -> new SimpleParticleType(false)); + public static final RegistryObject FIREFLY = PARTICLE_TYPES.register("firefly", () -> new SimpleParticleType(false)); + public static final RegistryObject WANDERING_FIREFLY = PARTICLE_TYPES.register("wandering_firefly", () -> new SimpleParticleType(false)); + public static final RegistryObject JAR_WANDERING_FIREFLY = PARTICLE_TYPES.register("jar_wandering_firefly", () -> new SimpleParticleType(false)); + public static final RegistryObject> FIREFLY_PINNED = PARTICLE_TYPES.register("firefly_pinned", () -> new ParticleType(false, new PinnedFireflyData.Deserializer()) { + @Override + public Codec codec() { + return PinnedFireflyData.codecFirefly(); + } + }); + public static final RegistryObject> FALLEN_LEAF = PARTICLE_TYPES.register("fallen_leaf", () -> new ParticleType(false, new LeafParticleData.Deserializer()) { + @Override + public Codec codec() { + return LeafParticleData.codecLeaf(); + } + }); + public static final RegistryObject OMINOUS_FLAME = PARTICLE_TYPES.register("ominous_flame", () -> new SimpleParticleType(false)); + public static final RegistryObject SORTING_PARTICLE = PARTICLE_TYPES.register("sorting_particle", () -> new SimpleParticleType(false)); + + @OnlyIn(Dist.CLIENT) + @SubscribeEvent + public static void registerFactories(RegisterParticleProvidersEvent event) { + event.registerSpriteSet(TFParticleType.LARGE_FLAME.get(), LargeFlameParticle.Factory::new); + event.registerSpriteSet(TFParticleType.LEAF_RUNE.get(), LeafRuneParticle.Factory::new); + event.registerSpecial(TFParticleType.BOSS_TEAR.get(), new GhastTearParticle.Factory()); + event.registerSpriteSet(TFParticleType.GHAST_TRAP.get(), GhastTrapParticle.Factory::new); + event.registerSpriteSet(TFParticleType.PROTECTION.get(), ProtectionParticle.Factory::new); //probably not a good idea, but worth a shot + event.registerSpriteSet(TFParticleType.SNOW.get(), SnowParticle.Factory::new); + event.registerSpriteSet(TFParticleType.SNOW_GUARDIAN.get(), SnowGuardianParticle.Factory::new); + event.registerSpriteSet(TFParticleType.SNOW_WARNING.get(), SnowWarningParticle.SimpleFactory::new); + event.registerSpriteSet(TFParticleType.EXTENDED_SNOW_WARNING.get(), SnowWarningParticle.ExtendedFactory::new); + event.registerSpriteSet(TFParticleType.ICE_BEAM.get(), IceBeamParticle.Factory::new); + event.registerSpriteSet(TFParticleType.ANNIHILATE.get(), AnnihilateParticle.Factory::new); + event.registerSpriteSet(TFParticleType.HUGE_SMOKE.get(), SmokeScaleParticle.Factory::new); + event.registerSpriteSet(TFParticleType.FIREFLY.get(), FireflyParticle.Factory::new); + event.registerSpriteSet(TFParticleType.WANDERING_FIREFLY.get(), WanderingFireflyParticle.Factory::new); + event.registerSpriteSet(TFParticleType.JAR_WANDERING_FIREFLY.get(), WanderingFireflyParticle.FromJarFactory::new); + event.registerSpriteSet(TFParticleType.FIREFLY_PINNED.get(), PinnedFireflyParticle.Factory::new); + event.registerSpriteSet(TFParticleType.FALLEN_LEAF.get(), LeafParticle.Factory::new); + event.registerSpriteSet(TFParticleType.OMINOUS_FLAME.get(), FlameParticle.SmallFlameProvider::new); + event.registerSpriteSet(TFParticleType.SORTING_PARTICLE.get(), SortingParticle.Factory::new); + } +} diff --git a/src/main/java/twilightforest/init/TFPlacedFeatures.java b/src/main/java/twilightforest/init/TFPlacedFeatures.java new file mode 100644 index 0000000000..9107df96c3 --- /dev/null +++ b/src/main/java/twilightforest/init/TFPlacedFeatures.java @@ -0,0 +1,232 @@ +package twilightforest.init; + +import com.google.common.collect.ImmutableList; +import net.minecraft.core.Direction; +import net.minecraft.core.Holder; +import net.minecraft.core.HolderGetter; +import net.minecraft.core.registries.Registries; +import net.minecraft.data.worldgen.BootstapContext; +import net.minecraft.data.worldgen.placement.PlacementUtils; +import net.minecraft.data.worldgen.placement.TreePlacements; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.VerticalAnchor; +import net.minecraft.world.level.levelgen.blockpredicates.BlockPredicate; +import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; +import net.minecraft.world.level.levelgen.feature.Feature; +import net.minecraft.world.level.levelgen.feature.WeightedPlacedFeature; +import net.minecraft.world.level.levelgen.feature.configurations.RandomFeatureConfiguration; +import net.minecraft.world.level.levelgen.placement.*; +import twilightforest.TwilightForestMod; +import twilightforest.world.components.placements.ChunkBlanketingModifier; +import twilightforest.world.components.placements.ChunkCenterModifier; +import twilightforest.world.components.placements.AvoidLandmarkModifier; + +import java.util.List; + +public class TFPlacedFeatures { + + public static final ResourceKey PLACED_LAKE_LAVA = registerKey("lava_lake"); + public static final ResourceKey PLACED_LAKE_WATER = registerKey("water_lake"); + public static final ResourceKey PLACED_DRUID_HUT = registerKey("druid_hut"); + public static final ResourceKey PLACED_GRAVEYARD = registerKey("graveyard"); + public static final ResourceKey PLACED_BIG_MUSHGLOOM = registerKey("big_mushgloom"); + public static final ResourceKey PLACED_FALLEN_LEAVES = registerKey("fallen_leaves"); + public static final ResourceKey PLACED_FIDDLEHEAD = registerKey("fiddlehead"); + public static final ResourceKey PLACED_FIRE_JET = registerKey("fire_jet"); + public static final ResourceKey PLACED_FOUNDATION = registerKey("foundation"); + public static final ResourceKey PLACED_GROVE_RUINS = registerKey("grove_ruins"); + public static final ResourceKey PLACED_HOLLOW_LOG = registerKey("hollow_log"); + public static final ResourceKey PLACED_HOLLOW_STUMP = registerKey("hollow_stump"); + public static final ResourceKey PLACED_HUGE_LILY_PAD = registerKey("huge_lily_pad"); + public static final ResourceKey PLACED_HUGE_WATER_LILY = registerKey("huge_water_lily"); + public static final ResourceKey PLACED_MAYAPPLE = registerKey("mayapple"); + public static final ResourceKey PLACED_MONOLITH = registerKey("monolith"); + public static final ResourceKey PLACED_MUSHGLOOM_CLUSTER = registerKey("mushgloom_cluster"); + public static final ResourceKey PLACED_MYCELIUM_BLOB = registerKey("mycelium_blob"); + public static final ResourceKey PLACED_OUTSIDE_STALAGMITE = registerKey("outside_stalagmite"); + public static final ResourceKey PLACED_PLANT_ROOTS = registerKey("plant_roots"); + public static final ResourceKey PLACED_PUMPKIN_LAMPPOST = registerKey("pumpkin_lamppost"); + public static final ResourceKey PLACED_SMOKER = registerKey("smoker"); + public static final ResourceKey PLACED_STONE_CIRCLE = registerKey("stone_circle"); + public static final ResourceKey PLACED_THORNS = registerKey("thorns"); + public static final ResourceKey PLACED_TORCH_BERRIES = registerKey("torch_berries"); + public static final ResourceKey PLACED_TROLL_ROOTS = registerKey("troll_roots"); + public static final ResourceKey PLACED_VANILLA_ROOTS = registerKey("vanilla_roots"); + public static final ResourceKey PLACED_WEBS = registerKey("webs"); + public static final ResourceKey PLACED_WOOD_ROOTS_SPREAD = registerKey("wood_roots"); + public static final ResourceKey PLACED_SNOW_UNDER_TREES = registerKey("snow_under_trees"); + public static final ResourceKey PLACED_TF_OAK_FALLEN_LOG = registerKey("tf_oak_fallen_log"); + public static final ResourceKey PLACED_CANOPY_FALLEN_LOG = registerKey("canopy_fallen_log"); + public static final ResourceKey PLACED_MANGROVE_FALLEN_LOG = registerKey("mangrove_fallen_log"); + public static final ResourceKey PLACED_SPRUCE_FALLEN_LOG = registerKey("spruce_fallen_log"); + public static final ResourceKey PLACED_SMALL_GRANITE = registerKey("small_granite"); + public static final ResourceKey PLACED_SMALL_DIORITE = registerKey("small_diorite"); + public static final ResourceKey PLACED_SMALL_ANDESITE = registerKey("small_andesite"); + public static final ResourceKey PLACED_DARK_MUSHGLOOMS = registerKey("dark_mushglooms"); + public static final ResourceKey PLACED_DARK_PUMPKINS = registerKey("dark_pumpkins"); + public static final ResourceKey PLACED_DARK_GRASS = registerKey("dark_grass"); + public static final ResourceKey PLACED_DARK_FERNS = registerKey("dark_ferns"); + public static final ResourceKey PLACED_DARK_MUSHROOMS = registerKey("dark_mushrooms"); + public static final ResourceKey PLACED_DARK_DEAD_BUSHES = registerKey("dark_dead_bushes"); + + //Ores! + public static final ResourceKey PLACED_LEGACY_COAL_ORE = registerKey("legacy_coal_ore"); + public static final ResourceKey PLACED_LEGACY_IRON_ORE = registerKey("legacy_iron_ore"); + public static final ResourceKey PLACED_LEGACY_GOLD_ORE = registerKey("legacy_gold_ore"); + public static final ResourceKey PLACED_LEGACY_REDSTONE_ORE = registerKey("legacy_redstone_ore"); + public static final ResourceKey PLACED_LEGACY_DIAMOND_ORE = registerKey("legacy_diamond_ore"); + public static final ResourceKey PLACED_LEGACY_LAPIS_ORE = registerKey("legacy_lapis_ore"); + public static final ResourceKey PLACED_LEGACY_COPPER_ORE = registerKey("legacy_copper_ore"); + + public static final ResourceKey PLACED_WELL_PLACER = registerKey("well_placer"); + public static final ResourceKey PLACED_LAMPPOST_PLACER = registerKey("lamppost_placer"); + public static final ResourceKey PLACED_DEFAULT_FALLEN_LOGS = registerKey("default_fallen_logs"); + + public static final ResourceKey PLACED_FLOWER_PLACER = registerKey("flower_placer"); + public static final ResourceKey PLACED_FLOWER_PLACER_ALT = registerKey("flower_placer_alt"); + + //Trees! + public static final ResourceKey PLACED_DEAD_CANOPY_TREE = registerKey("tree/dead_canopy_tree"); + public static final ResourceKey PLACED_MANGROVE_TREE = registerKey("tree/mangrove_tree"); + public static final ResourceKey PLACED_TWILIGHT_OAK_TREE = registerKey("tree/twilight_oak_tree"); + public static final ResourceKey PLACED_LARGE_TWILIGHT_OAK_TREE = registerKey("tree/large_twilight_oak_tree"); + public static final ResourceKey PLACED_FOREST_CANOPY_OAK_TREE = registerKey("tree/forest_canopy_oak_tree"); + public static final ResourceKey PLACED_SAVANNAH_OAK_TREE = registerKey("tree/savannah_oak_tree"); + public static final ResourceKey PLACED_SAVANNAH_CANOPY_OAK_TREE = registerKey("tree/savannah_canopy_oak_tree"); + public static final ResourceKey PLACED_SWAMPY_OAK_TREE = registerKey("tree/swampy_oak_tree"); + public static final ResourceKey PLACED_DARKWOOD_TREE = registerKey("tree/darkwood_tree"); + public static final ResourceKey PLACED_HOLLOW_OAK_TREE = registerKey("tree/hollow_oak"); + + public static final ResourceKey PLACED_CANOPY_TREES = registerKey("tree/selector/canopy_trees"); + public static final ResourceKey PLACED_DENSE_CANOPY_TREES = registerKey("tree/selector/dense_canopy_trees"); + public static final ResourceKey PLACED_FIREFLY_FOREST_TREES = registerKey("tree/selector/firefly_forest_trees"); + public static final ResourceKey PLACED_DARK_FOREST_TREES = registerKey("tree/selector/dark_forest_trees"); + public static final ResourceKey PLACED_DARK_FOREST_TREE_MIX = registerKey("tree/selector/dark_forest_tree_mix"); + public static final ResourceKey PLACED_HIGHLANDS_TREES = registerKey("tree/selector/highlands_trees"); + public static final ResourceKey PLACED_ENCHANTED_FOREST_TREES = registerKey("tree/selector/enchanted_forest_trees"); + public static final ResourceKey PLACED_SNOWY_FOREST_TREES = registerKey("tree/selector/snowy_forest_trees"); + public static final ResourceKey PLACED_VANILLA_TF_TREES = registerKey("tree/selector/vanilla_trees"); + public static final ResourceKey PLACED_VANILLA_TF_BIG_MUSH = registerKey("tree/selector/vanilla_mushrooms"); + + public static final ResourceKey PLACED_CANOPY_MUSHROOMS_SPARSE = registerKey("mushroom/canopy_mushrooms_sparse"); + public static final ResourceKey PLACED_CANOPY_MUSHROOMS_DENSE = registerKey("mushroom/canopy_mushrooms_dense"); + + private static List tfTreeCheckArea(BlockState sapling) { + return List.of(InSquarePlacement.spread(), SurfaceWaterDepthFilter.forMaxDepth(0), PlacementUtils.HEIGHTMAP_OCEAN_FLOOR, AvoidLandmarkModifier.checkSurface(), PlacementUtils.filteredByBlockSurvival(sapling.getBlock()), BiomeFilter.biome()); + } + + private static List tfTreeCheckArea(PlacementModifier count, BlockState sapling) { + return ImmutableList.of(count, InSquarePlacement.spread(), SurfaceWaterDepthFilter.forMaxDepth(0), PlacementUtils.HEIGHTMAP_OCEAN_FLOOR, AvoidLandmarkModifier.checkSurface(), PlacementUtils.filteredByBlockSurvival(sapling.getBlock()), BiomeFilter.biome()); + } + + private static List darkForestTreeCheck(PlacementModifier count) { + return ImmutableList.of(count, InSquarePlacement.spread(), SurfaceWaterDepthFilter.forMaxDepth(0), PlacementUtils.HEIGHTMAP_OCEAN_FLOOR, new AvoidLandmarkModifier(true, false, 10), BiomeFilter.biome()); + } + + private static ImmutableList.Builder tfFeatureCheckArea(AvoidLandmarkModifier filter, int rarity) { + return ImmutableList.builder().add(RarityFilter.onAverageOnceEvery(rarity), InSquarePlacement.spread(), PlacementUtils.HEIGHTMAP_OCEAN_FLOOR, filter, BiomeFilter.biome()); + } + + private static ImmutableList.Builder tfFeatureCheckArea(AvoidLandmarkModifier filter, int rarity, PlacementModifier... extra) { + return ImmutableList.builder().add(extra).add(filter, RarityFilter.onAverageOnceEvery(rarity), InSquarePlacement.spread(), PlacementUtils.HEIGHTMAP, BiomeFilter.biome()); + } + + private static ImmutableList.Builder hollowLog(AvoidLandmarkModifier filter) { + return ImmutableList.builder().add(RarityFilter.onAverageOnceEvery(40), InSquarePlacement.spread(), PlacementUtils.HEIGHTMAP_OCEAN_FLOOR, filter); + } + + public static ResourceKey registerKey(String name) { + return ResourceKey.create(Registries.PLACED_FEATURE, TwilightForestMod.prefix(name)); + } + + public static void bootstrap(BootstapContext context) { + HolderGetter> features = context.lookup(Registries.CONFIGURED_FEATURE); + context.register(PLACED_LAKE_LAVA, new PlacedFeature(features.getOrThrow(TFConfiguredFeatures.LAKE_LAVA), tfFeatureCheckArea(AvoidLandmarkModifier.checkBoth(), 10).build())); + context.register(PLACED_LAKE_WATER, new PlacedFeature(features.getOrThrow(TFConfiguredFeatures.LAKE_WATER), tfFeatureCheckArea(AvoidLandmarkModifier.checkBoth(), 4).build())); + context.register(PLACED_DRUID_HUT, new PlacedFeature(features.getOrThrow(TFConfiguredFeatures.DRUID_HUT), tfFeatureCheckArea(AvoidLandmarkModifier.checkBoth(), 105).build())); + context.register(PLACED_GRAVEYARD, new PlacedFeature(features.getOrThrow(TFConfiguredFeatures.GRAVEYARD), tfFeatureCheckArea(AvoidLandmarkModifier.checkSurface(), 70).build())); + context.register(PLACED_BIG_MUSHGLOOM, new PlacedFeature(features.getOrThrow(TFConfiguredFeatures.BIG_MUSHGLOOM), tfFeatureCheckArea(AvoidLandmarkModifier.checkSurface(), 1).build())); + context.register(PLACED_FALLEN_LEAVES, new PlacedFeature(features.getOrThrow(TFConfiguredFeatures.FALLEN_LEAVES), tfFeatureCheckArea(AvoidLandmarkModifier.checkSurface(), 1).build())); + context.register(PLACED_FIDDLEHEAD, new PlacedFeature(features.getOrThrow(TFConfiguredFeatures.FIDDLEHEAD), ImmutableList.builder().add(PlacementUtils.HEIGHTMAP_WORLD_SURFACE, BiomeFilter.biome()).build())); + context.register(PLACED_FIRE_JET, new PlacedFeature(features.getOrThrow(TFConfiguredFeatures.FIRE_JET), ImmutableList.builder().add(PlacementUtils.HEIGHTMAP_WORLD_SURFACE, InSquarePlacement.spread(), BiomeFilter.biome()).build())); + context.register(PLACED_FOUNDATION, new PlacedFeature(features.getOrThrow(TFConfiguredFeatures.FOUNDATION), tfFeatureCheckArea(AvoidLandmarkModifier.checkSurface(), 90).build())); + context.register(PLACED_GROVE_RUINS, new PlacedFeature(features.getOrThrow(TFConfiguredFeatures.GROVE_RUINS), tfFeatureCheckArea(AvoidLandmarkModifier.checkSurface(), 110).build())); + context.register(PLACED_HOLLOW_LOG, new PlacedFeature(features.getOrThrow(TFConfiguredFeatures.HOLLOW_LOG), tfFeatureCheckArea(AvoidLandmarkModifier.checkSurface(), 85).build())); + context.register(PLACED_HOLLOW_STUMP, new PlacedFeature(features.getOrThrow(TFConfiguredFeatures.HOLLOW_STUMP), tfFeatureCheckArea(AvoidLandmarkModifier.checkSurface(), 80).build())); + context.register(PLACED_HUGE_LILY_PAD, new PlacedFeature(features.getOrThrow(TFConfiguredFeatures.HUGE_LILY_PAD), ImmutableList.builder().add(PlacementUtils.HEIGHTMAP_WORLD_SURFACE, RarityFilter.onAverageOnceEvery(20), InSquarePlacement.spread(), CountPlacement.of(10), BiomeFilter.biome()).build())); + context.register(PLACED_HUGE_WATER_LILY, new PlacedFeature(features.getOrThrow(TFConfiguredFeatures.HUGE_WATER_LILY), ImmutableList.builder().add(PlacementUtils.HEIGHTMAP_WORLD_SURFACE, RarityFilter.onAverageOnceEvery(25), InSquarePlacement.spread(), CountPlacement.of(5), BiomeFilter.biome()).build())); + context.register(PLACED_MAYAPPLE, new PlacedFeature(features.getOrThrow(TFConfiguredFeatures.MAYAPPLE), ImmutableList.builder().add(PlacementUtils.HEIGHTMAP_WORLD_SURFACE, BiomeFilter.biome()).build())); + context.register(PLACED_MONOLITH, new PlacedFeature(features.getOrThrow(TFConfiguredFeatures.MONOLITH), tfFeatureCheckArea(AvoidLandmarkModifier.checkSurface(), 90).build())); + context.register(PLACED_MUSHGLOOM_CLUSTER, new PlacedFeature(features.getOrThrow(TFConfiguredFeatures.MUSHGLOOM_CLUSTER), ImmutableList.builder().add(PlacementUtils.HEIGHTMAP_WORLD_SURFACE, RarityFilter.onAverageOnceEvery(5), InSquarePlacement.spread(), BiomeFilter.biome()).build())); + context.register(PLACED_MYCELIUM_BLOB, new PlacedFeature(features.getOrThrow(TFConfiguredFeatures.MYCELIUM_BLOB), tfFeatureCheckArea(AvoidLandmarkModifier.checkSurface(), 3).build())); + context.register(PLACED_OUTSIDE_STALAGMITE, new PlacedFeature(features.getOrThrow(TFConfiguredFeatures.OUTSIDE_STALAGMITE), tfFeatureCheckArea(AvoidLandmarkModifier.checkSurface(), 77).build())); + context.register(PLACED_PLANT_ROOTS, new PlacedFeature(features.getOrThrow(TFConfiguredFeatures.PLANT_ROOTS), tfFeatureCheckArea(AvoidLandmarkModifier.checkUnderground(), 1, CountPlacement.of(4), HeightRangePlacement.uniform(VerticalAnchor.bottom(), VerticalAnchor.absolute(10))).build())); + context.register(PLACED_PUMPKIN_LAMPPOST, new PlacedFeature(features.getOrThrow(TFConfiguredFeatures.PUMPKIN_LAMPPOST), tfFeatureCheckArea(AvoidLandmarkModifier.checkSurface(), 10).build())); + context.register(PLACED_SMOKER, new PlacedFeature(features.getOrThrow(TFConfiguredFeatures.SMOKER), ImmutableList.builder().add(PlacementUtils.HEIGHTMAP_WORLD_SURFACE, InSquarePlacement.spread(), BiomeFilter.biome()).build())); + context.register(PLACED_STONE_CIRCLE, new PlacedFeature(features.getOrThrow(TFConfiguredFeatures.STONE_CIRCLE), tfFeatureCheckArea(AvoidLandmarkModifier.checkSurface(), 105).build())); + context.register(PLACED_THORNS, new PlacedFeature(features.getOrThrow(TFConfiguredFeatures.THORNS), ImmutableList.builder().add(ChunkBlanketingModifier.addThorns(), BiomeFilter.biome()).build())); + context.register(PLACED_TORCH_BERRIES, new PlacedFeature(features.getOrThrow(TFConfiguredFeatures.TORCH_BERRIES), ImmutableList.builder().add(PlacementUtils.HEIGHTMAP_WORLD_SURFACE, HeightRangePlacement.uniform(VerticalAnchor.bottom(), VerticalAnchor.absolute(60)), CountPlacement.of(8), AvoidLandmarkModifier.checkUnderground(), BiomeFilter.biome()).build())); + context.register(PLACED_TROLL_ROOTS, new PlacedFeature(features.getOrThrow(TFConfiguredFeatures.TROLL_ROOTS), ImmutableList.builder().add(PlacementUtils.HEIGHTMAP_WORLD_SURFACE, HeightRangePlacement.uniform(VerticalAnchor.bottom(), VerticalAnchor.absolute(60)), CountPlacement.of(8), BiomeFilter.biome()).build())); + context.register(PLACED_VANILLA_ROOTS, new PlacedFeature(features.getOrThrow(TFConfiguredFeatures.VANILLA_ROOTS), tfFeatureCheckArea(AvoidLandmarkModifier.checkUnderground(), 1, CountPlacement.of(16), HeightRangePlacement.uniform(VerticalAnchor.bottom(), VerticalAnchor.absolute(0)), PlacementUtils.filteredByBlockSurvival(TFBlocks.TORCHBERRY_PLANT.get())).build())); + context.register(PLACED_WEBS, new PlacedFeature(features.getOrThrow(TFConfiguredFeatures.WEBS), ImmutableList.builder().add(PlacementUtils.HEIGHTMAP_WORLD_SURFACE, CountPlacement.of(60), InSquarePlacement.spread(), BiomeFilter.biome()).build())); + context.register(PLACED_WOOD_ROOTS_SPREAD, new PlacedFeature(features.getOrThrow(TFConfiguredFeatures.WOOD_ROOTS_SPREAD), tfFeatureCheckArea(AvoidLandmarkModifier.checkUnderground(), 40, HeightRangePlacement.uniform(VerticalAnchor.bottom(), VerticalAnchor.absolute(0))).build())); + + context.register(PLACED_SNOW_UNDER_TREES, new PlacedFeature(features.getOrThrow(TFConfiguredFeatures.SNOW_UNDER_TREES), ImmutableList.builder().add(BiomeFilter.biome()).build())); + context.register(PLACED_TF_OAK_FALLEN_LOG, new PlacedFeature(features.getOrThrow(TFConfiguredFeatures.TF_OAK_FALLEN_LOG), hollowLog(AvoidLandmarkModifier.checkSurface()).build())); + context.register(PLACED_CANOPY_FALLEN_LOG, new PlacedFeature(features.getOrThrow(TFConfiguredFeatures.CANOPY_FALLEN_LOG), hollowLog(AvoidLandmarkModifier.checkSurface()).build())); + context.register(PLACED_MANGROVE_FALLEN_LOG, new PlacedFeature(features.getOrThrow(TFConfiguredFeatures.MANGROVE_FALLEN_LOG), hollowLog(AvoidLandmarkModifier.checkSurface()).build())); + context.register(PLACED_SPRUCE_FALLEN_LOG, new PlacedFeature(features.getOrThrow(TFConfiguredFeatures.SPRUCE_FALLEN_LOG), hollowLog(AvoidLandmarkModifier.checkSurface()).build())); + context.register(PLACED_SMALL_GRANITE, new PlacedFeature(features.getOrThrow(TFConfiguredFeatures.SMALL_GRANITE), ImmutableList.builder().add(HeightRangePlacement.triangle(VerticalAnchor.absolute(-64), VerticalAnchor.absolute(64)), RarityFilter.onAverageOnceEvery(10), InSquarePlacement.spread(), CountPlacement.of(5)).build())); + context.register(PLACED_SMALL_DIORITE, new PlacedFeature(features.getOrThrow(TFConfiguredFeatures.SMALL_DIORITE), ImmutableList.builder().add(HeightRangePlacement.triangle(VerticalAnchor.absolute(-64), VerticalAnchor.absolute(64)), RarityFilter.onAverageOnceEvery(10), InSquarePlacement.spread(), CountPlacement.of(5)).build())); + context.register(PLACED_SMALL_ANDESITE, new PlacedFeature(features.getOrThrow(TFConfiguredFeatures.SMALL_ANDESITE), ImmutableList.builder().add(HeightRangePlacement.triangle(VerticalAnchor.absolute(-64), VerticalAnchor.absolute(64)), RarityFilter.onAverageOnceEvery(10), InSquarePlacement.spread(), CountPlacement.of(5)).build())); + + context.register(PLACED_DARK_MUSHGLOOMS, new PlacedFeature(features.getOrThrow(TFConfiguredFeatures.DARK_MUSHGLOOMS), ImmutableList.builder().add(RarityFilter.onAverageOnceEvery(30), PlacementUtils.HEIGHTMAP_WORLD_SURFACE, BiomeFilter.biome()).build())); + context.register(PLACED_DARK_PUMPKINS, new PlacedFeature(features.getOrThrow(TFConfiguredFeatures.DARK_PUMPKINS), ImmutableList.builder().add(RarityFilter.onAverageOnceEvery(30), PlacementUtils.HEIGHTMAP_WORLD_SURFACE, BiomeFilter.biome()).build())); + context.register(PLACED_DARK_GRASS, new PlacedFeature(features.getOrThrow(TFConfiguredFeatures.DARK_GRASS), ImmutableList.builder().add(RarityFilter.onAverageOnceEvery(4), PlacementUtils.HEIGHTMAP_WORLD_SURFACE, BiomeFilter.biome()).build())); + context.register(PLACED_DARK_FERNS, new PlacedFeature(features.getOrThrow(TFConfiguredFeatures.DARK_FERNS), ImmutableList.builder().add(RarityFilter.onAverageOnceEvery(4), PlacementUtils.HEIGHTMAP_WORLD_SURFACE, BiomeFilter.biome()).build())); + context.register(PLACED_DARK_MUSHROOMS, new PlacedFeature(features.getOrThrow(TFConfiguredFeatures.DARK_MUSHROOMS), ImmutableList.builder().add(PlacementUtils.HEIGHTMAP_WORLD_SURFACE, BiomeFilter.biome()).build())); + context.register(PLACED_DARK_DEAD_BUSHES, new PlacedFeature(features.getOrThrow(TFConfiguredFeatures.DARK_DEAD_BUSHES), ImmutableList.builder().add(RarityFilter.onAverageOnceEvery(15), PlacementUtils.HEIGHTMAP_WORLD_SURFACE, BiomeFilter.biome()).build())); + + context.register(PLACED_LEGACY_COAL_ORE, new PlacedFeature(features.getOrThrow(TFConfiguredFeatures.LEGACY_COAL_ORE), ImmutableList.builder().add(HeightRangePlacement.uniform(VerticalAnchor.bottom(), VerticalAnchor.absolute(127)), InSquarePlacement.spread(), CountPlacement.of(20)).build())); + context.register(PLACED_LEGACY_IRON_ORE, new PlacedFeature(features.getOrThrow(TFConfiguredFeatures.LEGACY_IRON_ORE), ImmutableList.builder().add(HeightRangePlacement.uniform(VerticalAnchor.bottom(), VerticalAnchor.absolute(63)), InSquarePlacement.spread(), CountPlacement.of(20)).build())); + context.register(PLACED_LEGACY_GOLD_ORE, new PlacedFeature(features.getOrThrow(TFConfiguredFeatures.LEGACY_GOLD_ORE), ImmutableList.builder().add(HeightRangePlacement.uniform(VerticalAnchor.bottom(), VerticalAnchor.absolute(31)), InSquarePlacement.spread(), CountPlacement.of(2)).build())); + context.register(PLACED_LEGACY_REDSTONE_ORE, new PlacedFeature(features.getOrThrow(TFConfiguredFeatures.LEGACY_REDSTONE_ORE), ImmutableList.builder().add(HeightRangePlacement.uniform(VerticalAnchor.bottom(), VerticalAnchor.absolute(15)), InSquarePlacement.spread(), CountPlacement.of(8)).build())); + context.register(PLACED_LEGACY_DIAMOND_ORE, new PlacedFeature(features.getOrThrow(TFConfiguredFeatures.LEGACY_DIAMOND_ORE), ImmutableList.builder().add(HeightRangePlacement.uniform(VerticalAnchor.bottom(), VerticalAnchor.absolute(15)), InSquarePlacement.spread()).build())); + context.register(PLACED_LEGACY_LAPIS_ORE, new PlacedFeature(features.getOrThrow(TFConfiguredFeatures.LEGACY_LAPIS_ORE), ImmutableList.builder().add(HeightRangePlacement.uniform(VerticalAnchor.bottom(), VerticalAnchor.absolute(30)), InSquarePlacement.spread(), CountPlacement.of(2)).build())); + context.register(PLACED_LEGACY_COPPER_ORE, new PlacedFeature(features.getOrThrow(TFConfiguredFeatures.LEGACY_COPPER_ORE), ImmutableList.builder().add(HeightRangePlacement.uniform(VerticalAnchor.bottom(), VerticalAnchor.absolute(96)), InSquarePlacement.spread(), CountPlacement.of(6)).build())); + + context.register(PLACED_WELL_PLACER, new PlacedFeature(features.getOrThrow(TFConfiguredFeatures.WELL_PLACER), tfFeatureCheckArea(AvoidLandmarkModifier.checkBoth(), 80).build())); + context.register(PLACED_LAMPPOST_PLACER, new PlacedFeature(features.getOrThrow(TFConfiguredFeatures.LAMPPOST_PLACER), tfFeatureCheckArea(AvoidLandmarkModifier.checkBoth(), 2).build())); + context.register(PLACED_DEFAULT_FALLEN_LOGS, new PlacedFeature(features.getOrThrow(TFConfiguredFeatures.DEFAULT_FALLEN_LOGS), tfFeatureCheckArea(AvoidLandmarkModifier.checkBoth(), 40).build())); + + context.register(PLACED_FLOWER_PLACER, new PlacedFeature(features.getOrThrow(TFConfiguredFeatures.FLOWER_PLACER), ImmutableList.builder().add(PlacementUtils.HEIGHTMAP_WORLD_SURFACE, CountPlacement.of(3), InSquarePlacement.spread(), RarityFilter.onAverageOnceEvery(2), BiomeFilter.biome()).build())); + context.register(PLACED_FLOWER_PLACER_ALT, new PlacedFeature(features.getOrThrow(TFConfiguredFeatures.FLOWER_PLACER_ALT), ImmutableList.builder().add(PlacementUtils.HEIGHTMAP_WORLD_SURFACE, CountPlacement.of(3), InSquarePlacement.spread(), RarityFilter.onAverageOnceEvery(2), BiomeFilter.biome()).build())); + + context.register(PLACED_DEAD_CANOPY_TREE, new PlacedFeature(features.getOrThrow(TFConfiguredFeatures.DEAD_CANOPY_TREE), tfTreeCheckArea(PlacementUtils.countExtra(2, 0.1F, 1), TFBlocks.CANOPY_SAPLING.get().defaultBlockState()))); + context.register(PLACED_MANGROVE_TREE, new PlacedFeature(features.getOrThrow(TFConfiguredFeatures.MANGROVE_TREE), List.of(PlacementUtils.countExtra(3, 0.1F, 1), InSquarePlacement.spread(), SurfaceWaterDepthFilter.forMaxDepth(6), PlacementUtils.HEIGHTMAP_OCEAN_FLOOR, AvoidLandmarkModifier.checkSurface(), PlacementUtils.filteredByBlockSurvival(TFBlocks.MANGROVE_SAPLING.get()), BiomeFilter.biome()))); + context.register(PLACED_TWILIGHT_OAK_TREE, new PlacedFeature(features.getOrThrow(TFConfiguredFeatures.TWILIGHT_OAK_TREE), tfTreeCheckArea(PlacementUtils.countExtra(1, 0.1F, 1), TFBlocks.TWILIGHT_OAK_SAPLING.get().defaultBlockState()))); + context.register(PLACED_LARGE_TWILIGHT_OAK_TREE, new PlacedFeature(features.getOrThrow(TFConfiguredFeatures.LARGE_TWILIGHT_OAK_TREE), tfTreeCheckArea(PlacementUtils.countExtra(1, 0.1F, 1), TFBlocks.TWILIGHT_OAK_SAPLING.get().defaultBlockState()))); + context.register(PLACED_FOREST_CANOPY_OAK_TREE, new PlacedFeature(features.getOrThrow(TFConfiguredFeatures.FOREST_CANOPY_OAK_TREE), tfTreeCheckArea(PlacementUtils.countExtra(7, 0.1F, 1), TFBlocks.TWILIGHT_OAK_SAPLING.get().defaultBlockState()))); + context.register(PLACED_SAVANNAH_CANOPY_OAK_TREE, new PlacedFeature(features.getOrThrow(TFConfiguredFeatures.SAVANNAH_CANOPY_OAK_TREE), tfTreeCheckArea(PlacementUtils.countExtra(0, 0.1F, 1), TFBlocks.TWILIGHT_OAK_SAPLING.get().defaultBlockState()))); + context.register(PLACED_SAVANNAH_OAK_TREE, new PlacedFeature(features.getOrThrow(TFConfiguredFeatures.TWILIGHT_OAK_TREE), tfTreeCheckArea(PlacementUtils.countExtra(1, 0.1F, 1), TFBlocks.TWILIGHT_OAK_SAPLING.get().defaultBlockState()))); + context.register(PLACED_SWAMPY_OAK_TREE, new PlacedFeature(features.getOrThrow(TFConfiguredFeatures.SWAMPY_OAK_TREE), tfTreeCheckArea(PlacementUtils.countExtra(4, 0.1F, 1), TFBlocks.TWILIGHT_OAK_SAPLING.get().defaultBlockState()))); + context.register(PLACED_DARKWOOD_TREE, new PlacedFeature(features.getOrThrow(TFConfiguredFeatures.DARKWOOD_TREE), List.of(PlacementUtils.countExtra(5, 0.1F, 1), InSquarePlacement.spread(), SurfaceWaterDepthFilter.forMaxDepth(0), PlacementUtils.HEIGHTMAP_OCEAN_FLOOR, new AvoidLandmarkModifier(true, false, 16), PlacementUtils.filteredByBlockSurvival(TFBlocks.DARKWOOD_SAPLING.get()), BiomeFilter.biome()))); + context.register(PLACED_HOLLOW_OAK_TREE, new PlacedFeature(features.getOrThrow(TFConfiguredFeatures.HOLLOW_TREE), List.of(SurfaceWaterDepthFilter.forMaxDepth(0), RarityFilter.onAverageOnceEvery(35), PlacementUtils.HEIGHTMAP_OCEAN_FLOOR, ChunkCenterModifier.center(), new AvoidLandmarkModifier(true, false, 32), PlacementUtils.filteredByBlockSurvival(TFBlocks.HOLLOW_OAK_SAPLING.get()), BiomeFilter.biome()))); + + context.register(PLACED_CANOPY_TREES, new PlacedFeature(features.getOrThrow(TFConfiguredFeatures.CANOPY_TREES), tfTreeCheckArea(TFBlocks.CANOPY_SAPLING.get().defaultBlockState()))); + context.register(PLACED_DENSE_CANOPY_TREES, new PlacedFeature(features.getOrThrow(TFConfiguredFeatures.DENSE_CANOPY_TREES), tfTreeCheckArea(PlacementUtils.countExtra(5, 0.1F, 1), TFBlocks.CANOPY_SAPLING.get().defaultBlockState()))); + context.register(PLACED_FIREFLY_FOREST_TREES, new PlacedFeature(features.getOrThrow(TFConfiguredFeatures.FIREFLY_FOREST_TREES), tfTreeCheckArea(PlacementUtils.countExtra(3, 0.1F, 1), TFBlocks.CANOPY_SAPLING.get().defaultBlockState()))); + context.register(PLACED_DARK_FOREST_TREES, new PlacedFeature(features.getOrThrow(TFConfiguredFeatures.DARKWOOD_TREE), darkForestTreeCheck(PlacementUtils.countExtra(8, 0.1F, 1)))); + context.register(PLACED_DARK_FOREST_TREE_MIX, new PlacedFeature(features.getOrThrow(TFConfiguredFeatures.DARK_FOREST_TREES), darkForestTreeCheck(PlacementUtils.countExtra(3, 0.1F, 1)))); + context.register(PLACED_HIGHLANDS_TREES, new PlacedFeature(features.getOrThrow(TFConfiguredFeatures.HIGHLANDS_TREES), tfTreeCheckArea(PlacementUtils.countExtra(3, 0.1F, 1), Blocks.SPRUCE_SAPLING.defaultBlockState()))); + context.register(PLACED_ENCHANTED_FOREST_TREES, new PlacedFeature(features.getOrThrow(TFConfiguredFeatures.ENCHANTED_FOREST_TREES), tfTreeCheckArea(PlacementUtils.countExtra(5, 0.1F, 1), TFBlocks.RAINBOW_OAK_SAPLING.get().defaultBlockState()))); + context.register(PLACED_SNOWY_FOREST_TREES, new PlacedFeature(features.getOrThrow(TFConfiguredFeatures.SNOWY_FOREST_TREES), List.of(PlacementUtils.countExtra(10, 0.1F, 1), InSquarePlacement.spread(), SurfaceWaterDepthFilter.forMaxDepth(0), PlacementUtils.HEIGHTMAP_OCEAN_FLOOR, AvoidLandmarkModifier.checkSurface(), EnvironmentScanPlacement.scanningFor(Direction.UP, BlockPredicate.not(BlockPredicate.matchesBlocks(Blocks.POWDER_SNOW)), 8), BlockPredicateFilter.forPredicate(BlockPredicate.matchesBlocks(Direction.DOWN.getNormal(), Blocks.SNOW_BLOCK, Blocks.POWDER_SNOW)), BiomeFilter.biome()))); + context.register(PLACED_VANILLA_TF_TREES, new PlacedFeature(features.getOrThrow(TFConfiguredFeatures.VANILLA_TF_TREES), tfTreeCheckArea(TFBlocks.TWILIGHT_OAK_SAPLING.get().defaultBlockState()))); + context.register(PLACED_VANILLA_TF_BIG_MUSH, new PlacedFeature(features.getOrThrow(TFConfiguredFeatures.VANILLA_TF_BIG_MUSH), tfTreeCheckArea(TFBlocks.CANOPY_SAPLING.get().defaultBlockState()))); + + context.register(PLACED_CANOPY_MUSHROOMS_SPARSE, new PlacedFeature(features.getOrThrow(TFConfiguredFeatures.CANOPY_MUSHROOMS_SPARSE), tfTreeCheckArea(PlacementUtils.countExtra(3, 0.1F, 1), TFBlocks.CANOPY_SAPLING.get().defaultBlockState()))); + context.register(PLACED_CANOPY_MUSHROOMS_DENSE, new PlacedFeature(features.getOrThrow(TFConfiguredFeatures.CANOPY_MUSHROOMS_DENSE), tfTreeCheckArea(PlacementUtils.countExtra(5, 0.1F, 1), TFBlocks.CANOPY_SAPLING.get().defaultBlockState()))); + } +} diff --git a/src/main/java/twilightforest/init/TFRecipes.java b/src/main/java/twilightforest/init/TFRecipes.java new file mode 100644 index 0000000000..63eeed1042 --- /dev/null +++ b/src/main/java/twilightforest/init/TFRecipes.java @@ -0,0 +1,42 @@ +package twilightforest.init; + +import net.minecraft.core.registries.Registries; +import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.item.crafting.SimpleCraftingRecipeSerializer; +import net.minecraftforge.registries.DeferredRegister; +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.registries.RegistryObject; +import twilightforest.TwilightForestMod; +import twilightforest.item.recipe.*; + +public class TFRecipes { + public static final DeferredRegister> RECIPE_SERIALIZERS = DeferredRegister.create(ForgeRegistries.RECIPE_SERIALIZERS, TwilightForestMod.ID); + public static final DeferredRegister> RECIPE_TYPES = DeferredRegister.create(ForgeRegistries.RECIPE_TYPES, TwilightForestMod.ID); + + public static final RegistryObject> MAGIC_MAP_CLONING_RECIPE = RECIPE_SERIALIZERS.register("magic_map_cloning_recipe", () -> new SimpleCraftingRecipeSerializer<>(MagicMapCloningRecipe::new)); + public static final RegistryObject> MAZE_MAP_CLONING_RECIPE = RECIPE_SERIALIZERS.register("maze_map_cloning_recipe", () -> new SimpleCraftingRecipeSerializer<>(MazeMapCloningRecipe::new)); + public static final RegistryObject> MOONWORM_QUEEN_REPAIR_RECIPE = RECIPE_SERIALIZERS.register("moonworm_queen_repair_recipe", () -> new SimpleCraftingRecipeSerializer<>(MoonwormQueenRepairRecipe::new)); + public static final RegistryObject> UNCRAFTING_SERIALIZER = RECIPE_SERIALIZERS.register("uncrafting", UncraftingRecipe.Serializer::new); + public static final RegistryObject> CRUMBLE_SERIALIZER = RECIPE_SERIALIZERS.register("crumble_horn", CrumbleRecipe.Serializer::new); + public static final RegistryObject> TRANSFORMATION_SERIALIZER = RECIPE_SERIALIZERS.register("transformation_powder", TransformPowderRecipe.Serializer::new); + + public static final RegistryObject> UNCRAFTING_RECIPE = RECIPE_TYPES.register("uncrafting", () -> new RecipeType<>() { + @Override + public String toString() { + return "twilightforest:unique_uncrafting"; + } + }); + public static final RegistryObject> CRUMBLE_RECIPE = RECIPE_TYPES.register("crumble_horn", () -> new RecipeType<>() { + @Override + public String toString() { + return "twilightforest:crumble_horn"; + } + }); + public static final RegistryObject> TRANSFORM_POWDER_RECIPE = RECIPE_TYPES.register("transformation_powder", () -> new RecipeType<>() { + @Override + public String toString() { + return "twilightforest:transformation_powder"; + } + }); +} diff --git a/src/main/java/twilightforest/init/TFSounds.java b/src/main/java/twilightforest/init/TFSounds.java new file mode 100644 index 0000000000..8e70a14ac2 --- /dev/null +++ b/src/main/java/twilightforest/init/TFSounds.java @@ -0,0 +1,343 @@ +package twilightforest.init; + +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.world.entity.animal.Parrot; +import net.minecraftforge.registries.DeferredRegister; +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.registries.RegistryObject; +import twilightforest.TwilightForestMod; + +public final class TFSounds { + + public static final DeferredRegister SOUNDS = DeferredRegister.create(ForgeRegistries.SOUND_EVENTS, TwilightForestMod.ID); + + public static final RegistryObject ACID_RAIN_BURNS = createEvent("environment.twilightforest.acid_rain"); + public static final RegistryObject ALPHA_YETI_ALERT = createEvent("entity.twilightforest.alpha_yeti.alert"); + public static final RegistryObject ALPHA_YETI_DEATH = createEvent("entity.twilightforest.alpha_yeti.death"); + public static final RegistryObject ALPHA_YETI_GRAB = createEvent("entity.twilightforest.alpha_yeti.grab"); + public static final RegistryObject ALPHA_YETI_GROWL = createEvent("entity.twilightforest.alpha_yeti.growl"); + public static final RegistryObject ALPHA_YETI_HURT = createEvent("entity.twilightforest.alpha_yeti.hurt"); + public static final RegistryObject ALPHA_YETI_ICE = createEvent("entity.twilightforest.alpha_yeti.ice"); + public static final RegistryObject ALPHA_YETI_PANT = createEvent("entity.twilightforest.alpha_yeti.pant"); + public static final RegistryObject ALPHA_YETI_ROAR = createEvent("entity.twilightforest.alpha_yeti.roar"); + public static final RegistryObject ALPHA_YETI_THROW = createEvent("entity.twilightforest.alpha_yeti.throw"); + public static final RegistryObject BEANSTALK_GROWTH = createEvent("block.twilightforest.beanstalk.grow"); + public static final RegistryObject BIGHORN_SHEEP_AMBIENT = createEvent("entity.twilightforest.bighorn_sheep.ambient"); + public static final RegistryObject BIGHORN_SHEEP_DEATH = createEvent("entity.twilightforest.bighorn_sheep.death"); + public static final RegistryObject BIGHORN_SHEEP_HURT = createEvent("entity.twilightforest.bighorn_sheep.hurt"); + public static final RegistryObject BIGHORN_SHEEP_STEP = createEvent("entity.twilightforest.bighorn_sheep.step"); + public static final RegistryObject BLOCKCHAIN_GOBLIN_AMBIENT = createEvent("entity.twilightforest.blockchain_goblin.ambient"); + public static final RegistryObject BLOCKCHAIN_GOBLIN_DEATH = createEvent("entity.twilightforest.blockchain_goblin.death"); + public static final RegistryObject BLOCKCHAIN_GOBLIN_HURT = createEvent("entity.twilightforest.blockchain_goblin.hurt"); + public static final RegistryObject BLOCK_AND_CHAIN_COLLIDE = createEvent("item.twilightforest.block_and_chain.collide"); + public static final RegistryObject BLOCK_AND_CHAIN_FIRED = createEvent("item.twilightforest.block_and_chain.fire"); + public static final RegistryObject BLOCK_AND_CHAIN_HIT = createEvent("item.twilightforest.block_and_chain.hit"); + public static final RegistryObject BLOCK_ANNIHILATED = createEvent("block.twilightforest.generic.annihilation"); + public static final RegistryObject BOAR_AMBIENT = createEvent("entity.twilightforest.boar.ambient"); + public static final RegistryObject BOAR_DEATH = createEvent("entity.twilightforest.boar.death"); + public static final RegistryObject BOAR_HURT = createEvent("entity.twilightforest.boar.hurt"); + public static final RegistryObject BOAR_STEP = createEvent("entity.twilightforest.boar.step"); + public static final RegistryObject BOSS_CHEST_APPEAR = createEvent("block.twilightforest.boss_chest.appear"); + public static final RegistryObject BRITTLE_FLASK_BREAK = createEvent("item.twilightforest.flask.break"); + public static final RegistryObject BRITTLE_FLASK_CRACK = createEvent("item.twilightforest.flask.crack"); + public static final RegistryObject BUG_SQUISH = createEvent("block.twilightforest.bug.squish"); + public static final RegistryObject BUILDER_CREATE = createEvent("block.twilightforest.builder.create"); + public static final RegistryObject BUILDER_OFF = createEvent("block.twilightforest.builder.off"); + public static final RegistryObject BUILDER_ON = createEvent("block.twilightforest.builder.on"); + public static final RegistryObject BUILDER_REPLACE = createEvent("block.twilightforest.builder.replace"); + public static final RegistryObject CARMINITE_BROODLING_AMBIENT = createEvent("entity.twilightforest.carminite_broodling.ambient"); + public static final RegistryObject CARMINITE_BROODLING_DEATH = createEvent("entity.twilightforest.carminite_broodling.death"); + public static final RegistryObject CARMINITE_BROODLING_HURT = createEvent("entity.twilightforest.carminite_broodling.hurt"); + public static final RegistryObject CARMINITE_BROODLING_STEP = createEvent("entity.twilightforest.carminite_broodling.step"); + public static final RegistryObject CARMINITE_GHASTGUARD_AMBIENT = createEvent("entity.twilightforest.carminite_ghastguard.ambient"); + public static final RegistryObject CARMINITE_GHASTGUARD_DEATH = createEvent("entity.twilightforest.carminite_ghastguard.death"); + public static final RegistryObject CARMINITE_GHASTGUARD_HURT = createEvent("entity.twilightforest.carminite_ghastguard.hurt"); + public static final RegistryObject CARMINITE_GHASTGUARD_SHOOT = createEvent("entity.twilightforest.carminite_ghastguard.shoot"); + public static final RegistryObject CARMINITE_GHASTGUARD_WARN = createEvent("entity.twilightforest.carminite_ghastguard.warn"); + public static final RegistryObject CARMINITE_GHASTLING_AMBIENT = createEvent("entity.twilightforest.carminite_ghastling.ambient"); + public static final RegistryObject CARMINITE_GHASTLING_DEATH = createEvent("entity.twilightforest.carminite_ghastling.death"); + public static final RegistryObject CARMINITE_GHASTLING_HURT = createEvent("entity.twilightforest.carminite_ghastling.hurt"); + public static final RegistryObject CARMINITE_GHASTLING_SHOOT = createEvent("entity.twilightforest.carminite_ghastling.shoot"); + public static final RegistryObject CARMINITE_GHASTLING_WARN = createEvent("entity.twilightforest.carminite_ghastling.warn"); + public static final RegistryObject CARMINITE_GOLEM_ATTACK = createEvent("entity.twilightforest.carminite_golem.attack"); + public static final RegistryObject CARMINITE_GOLEM_DEATH = createEvent("entity.twilightforest.carminite_golem.death"); + public static final RegistryObject CARMINITE_GOLEM_HURT = createEvent("entity.twilightforest.carminite_golem.hurt"); + public static final RegistryObject CARMINITE_GOLEM_STEP = createEvent("entity.twilightforest.carminite_golem.step"); + public static final RegistryObject CASKET_CLOSE = createEvent("block.twilightforest.casket.close"); + public static final RegistryObject CASKET_LOCKED = createEvent("block.twilightforest.casket.locked"); + public static final RegistryObject CASKET_OPEN = createEvent("block.twilightforest.casket.open"); + public static final RegistryObject CASKET_REPAIR = createEvent("block.twilightforest.casket.repair"); + public static final RegistryObject CHARM_KEEP = createEvent("item.twilightforest.charm.keep"); + public static final RegistryObject CHARM_LIFE = createEvent("item.twilightforest.charm.life"); + public static final RegistryObject CICADA = createEvent("block.twilightforest.cicada"); + public static final RegistryObject DEATH_TOME_AMBIENT = createEvent("entity.twilightforest.death_tome.ambient"); + public static final RegistryObject DEATH_TOME_DEATH = createEvent("entity.twilightforest.death_tome.death"); + public static final RegistryObject DEATH_TOME_HURT = createEvent("entity.twilightforest.death_tome.hurt"); + public static final RegistryObject DEER_AMBIENT = createEvent("entity.twilightforest.deer.ambient"); + public static final RegistryObject DEER_DEATH = createEvent("entity.twilightforest.deer.death"); + public static final RegistryObject DEER_HURT = createEvent("entity.twilightforest.deer.hurt"); + public static final RegistryObject DOOR_ACTIVATED = createEvent("block.twilightforest.door.activate"); + public static final RegistryObject DOOR_REAPPEAR = createEvent("block.twilightforest.door.reappear"); + public static final RegistryObject DOOR_VANISH = createEvent("block.twilightforest.door.vanish"); + public static final RegistryObject DWARF_RABBIT_AMBIENT = createEvent("entity.twilightforest.dwarf_rabbit.ambient"); + public static final RegistryObject DWARF_RABBIT_DEATH = createEvent("entity.twilightforest.dwarf_rabbit.death"); + public static final RegistryObject DWARF_RABBIT_HURT = createEvent("entity.twilightforest.dwarf_rabbit.hurt"); + public static final RegistryObject FAN_WHOOSH = createEvent("item.twilightforest.fan.whoosh"); + public static final RegistryObject FIRE_BEETLE_DEATH = createEvent("entity.twilightforest.fire_beetle.death"); + public static final RegistryObject FIRE_BEETLE_HURT = createEvent("entity.twilightforest.fire_beetle.hurt"); + public static final RegistryObject FIRE_BEETLE_SHOOT = createEvent("entity.twilightforest.fire_beetle.shoot"); + public static final RegistryObject FIRE_BEETLE_STEP = createEvent("entity.twilightforest.fire_beetle.step"); + public static final RegistryObject FLASK_FILL = createEvent("item.twilightforest.flask.fill"); + //public static final RegistryObject GHAST_TRAP_ACTIVE = createEvent("block.twilightforest.ghast_trap.active"); + public static final RegistryObject GHAST_TRAP_AMBIENT = createEvent("block.twilightforest.ghast_trap.ambient"); + public static final RegistryObject GHAST_TRAP_ON = createEvent("block.twilightforest.ghast_trap.on"); + public static final RegistryObject GHAST_TRAP_SPINDOWN = createEvent("block.twilightforest.ghast_trap.spindown"); + public static final RegistryObject GHAST_TRAP_WARMUP = createEvent("block.twilightforest.ghast_trap.warmup"); + public static final RegistryObject GLASS_SWORD_BREAK = createEvent("item.twilightforest.glass_sword.break"); + public static final RegistryObject GOBLIN_KNIGHT_AMBIENT = createEvent("entity.twilightforest.goblin_knight.ambient"); + public static final RegistryObject GOBLIN_KNIGHT_DEATH = createEvent("entity.twilightforest.goblin_knight.death"); + public static final RegistryObject GOBLIN_KNIGHT_HURT = createEvent("entity.twilightforest.goblin_knight.hurt"); + public static final RegistryObject GOBLIN_KNIGHT_MUFFLED_AMBIENT = createEvent("entity.twilightforest.goblin_knight.muffled.ambient"); + public static final RegistryObject GOBLIN_KNIGHT_MUFFLED_DEATH = createEvent("entity.twilightforest.goblin_knight.muffled.death"); + public static final RegistryObject GOBLIN_KNIGHT_MUFFLED_HURT = createEvent("entity.twilightforest.goblin_knight.muffled.hurt"); + public static final RegistryObject HEDGE_SPIDER_AMBIENT = createEvent("entity.twilightforest.hedge_spider.ambient"); + public static final RegistryObject HEDGE_SPIDER_DEATH = createEvent("entity.twilightforest.hedge_spider.death"); + public static final RegistryObject HEDGE_SPIDER_HURT = createEvent("entity.twilightforest.hedge_spider.hurt"); + public static final RegistryObject HEDGE_SPIDER_STEP = createEvent("entity.twilightforest.hedge_spider.step"); + public static final RegistryObject HELMET_CRAB_DEATH = createEvent("entity.twilightforest.helmet_crab.death"); + public static final RegistryObject HELMET_CRAB_HURT = createEvent("entity.twilightforest.helmet_crab.hurt"); + public static final RegistryObject HELMET_CRAB_STEP = createEvent("entity.twilightforest.helmet_crab.step"); + public static final RegistryObject HOSTILE_WOLF_AMBIENT = createEvent("entity.twilightforest.hostile_wolf.ambient"); + public static final RegistryObject HOSTILE_WOLF_DEATH = createEvent("entity.twilightforest.hostile_wolf.death"); + public static final RegistryObject HOSTILE_WOLF_HURT = createEvent("entity.twilightforest.hostile_wolf.hurt"); + public static final RegistryObject HOSTILE_WOLF_TARGET = createEvent("entity.twilightforest.hostile_wolf.target"); + public static final RegistryObject HYDRA_DEATH = createEvent("entity.twilightforest.hydra.death"); + public static final RegistryObject HYDRA_GROWL = createEvent("entity.twilightforest.hydra.growl"); + public static final RegistryObject HYDRA_HURT = createEvent("entity.twilightforest.hydra.hurt"); + public static final RegistryObject HYDRA_ROAR = createEvent("entity.twilightforest.hydra.roar"); + public static final RegistryObject HYDRA_SHOOT = createEvent("entity.twilightforest.hydra.shoot"); + public static final RegistryObject HYDRA_SHOOT_FIRE = createEvent("entity.twilightforest.hydra.shoot_fire"); + public static final RegistryObject HYDRA_WARN = createEvent("entity.twilightforest.hydra.warn"); + public static final RegistryObject ICE_BOMB_FIRED = createEvent("item.twilightforest.ice_bomb.fired"); + public static final RegistryObject ICE_CORE_AMBIENT = createEvent("entity.twilightforest.ice.ambient"); + public static final RegistryObject ICE_CORE_DEATH = createEvent("entity.twilightforest.ice.death"); + public static final RegistryObject ICE_CORE_HURT = createEvent("entity.twilightforest.ice.hurt"); + public static final RegistryObject ICE_CORE_SHOOT = createEvent("entity.twilightforest.ice.shoot"); + public static final RegistryObject JET_ACTIVE = createEvent("block.twilightforest.jet.active"); + public static final RegistryObject JET_POP = createEvent("block.twilightforest.jet.pop"); + public static final RegistryObject JET_START = createEvent("block.twilightforest.jet.start"); + public static final RegistryObject KING_SPIDER_AMBIENT = createEvent("entity.twilightforest.king_spider.ambient"); + public static final RegistryObject KING_SPIDER_DEATH = createEvent("entity.twilightforest.king_spider.death"); + public static final RegistryObject KING_SPIDER_HURT = createEvent("entity.twilightforest.king_spider.hurt"); + public static final RegistryObject KING_SPIDER_STEP = createEvent("entity.twilightforest.king_spider.step"); + public static final RegistryObject KNIGHTMETAL_EQUIP = createEvent("item.twilightforest.knightmetal_armor.equip"); + public static final RegistryObject KNIGHT_PHANTOM_AMBIENT = createEvent("entity.twilightforest.knight_phantom.ambient"); + public static final RegistryObject KNIGHT_PHANTOM_DEATH = createEvent("entity.twilightforest.knight_phantom.death"); + public static final RegistryObject KNIGHT_PHANTOM_HURT = createEvent("entity.twilightforest.knight_phantom.hurt"); + public static final RegistryObject KNIGHT_PHANTOM_THROW_AXE = createEvent("entity.twilightforest.knight_phantom.axe"); + public static final RegistryObject KNIGHT_PHANTOM_THROW_PICK = createEvent("entity.twilightforest.knight_phantom.pickaxe"); + public static final RegistryObject KOBOLD_AMBIENT = createEvent("entity.twilightforest.kobold.ambient"); + public static final RegistryObject KOBOLD_DEATH = createEvent("entity.twilightforest.kobold.death"); + public static final RegistryObject KOBOLD_HURT = createEvent("entity.twilightforest.kobold.hurt"); + public static final RegistryObject KOBOLD_MUNCH = createEvent("entity.twilightforest.kobold.munch"); + public static final RegistryObject LAMP_BURN = createEvent("item.twilightforest.lamp.burn"); + public static final RegistryObject LICH_AMBIENT = createEvent("entity.twilightforest.lich.ambient"); + public static final RegistryObject LICH_CLONE_HURT = createEvent("entity.twilightforest.lich_clone.hurt"); + public static final RegistryObject LICH_DEATH = createEvent("entity.twilightforest.lich.death"); + public static final RegistryObject LICH_HURT = createEvent("entity.twilightforest.lich.hurt"); + public static final RegistryObject LICH_POP_MOB = createEvent("entity.twilightforest.lich.pop_mob"); + public static final RegistryObject LICH_SHOOT = createEvent("entity.twilightforest.lich.shoot"); + public static final RegistryObject LICH_TELEPORT = createEvent("entity.twilightforest.lich.teleport"); + public static final RegistryObject LOCKED_VANISHING_BLOCK = createEvent("block.twilightforest.vanish.locked"); + public static final RegistryObject LOYAL_ZOMBIE_AMBIENT = createEvent("entity.twilightforest.loyal_zombie.ambient"); + public static final RegistryObject LOYAL_ZOMBIE_DEATH = createEvent("entity.twilightforest.loyal_zombie.death"); + public static final RegistryObject LOYAL_ZOMBIE_HURT = createEvent("entity.twilightforest.loyal_zombie.hurt"); + public static final RegistryObject LOYAL_ZOMBIE_STEP = createEvent("entity.twilightforest.loyal_zombie.step"); + public static final RegistryObject LOYAL_ZOMBIE_SUMMON = createEvent("entity.twilightforest.loyal_zombie.summon"); + public static final RegistryObject MAGNET_GRAB = createEvent("item.twilightforest.magnet.grab"); + public static final RegistryObject MAZE_SLIME_DEATH = createEvent("entity.twilightforest.maze_slime.death"); + public static final RegistryObject MAZE_SLIME_DEATH_SMALL = createEvent("entity.twilightforest.maze_slime_small.death"); + public static final RegistryObject MAZE_SLIME_HURT = createEvent("entity.twilightforest.maze_slime.hurt"); + public static final RegistryObject MAZE_SLIME_HURT_SMALL = createEvent("entity.twilightforest.maze_slime_small.hurt"); + public static final RegistryObject MAZE_SLIME_SQUISH = createEvent("entity.twilightforest.maze_slime.squish"); + public static final RegistryObject MAZE_SLIME_SQUISH_SMALL = createEvent("entity.twilightforest.maze_slime_small.squish"); + public static final RegistryObject METAL_SHIELD_SHATTERS = createEvent("item.twilightforest.knightmetal_shield.shatter"); + public static final RegistryObject MINION_AMBIENT = createEvent("entity.twilightforest.minion.ambient"); + public static final RegistryObject MINION_DEATH = createEvent("entity.twilightforest.minion.death"); + public static final RegistryObject MINION_HURT = createEvent("entity.twilightforest.minion.hurt"); + public static final RegistryObject MINION_STEP = createEvent("entity.twilightforest.minion.step"); + public static final RegistryObject MINION_SUMMON = createEvent("entity.twilightforest.minion.summon"); + public static final RegistryObject MINOSHROOM_AMBIENT = createEvent("entity.twilightforest.minoshroom.ambient"); + public static final RegistryObject MINOSHROOM_ATTACK = createEvent("entity.twilightforest.minoshroom.attack"); + public static final RegistryObject MINOSHROOM_DEATH = createEvent("entity.twilightforest.minoshroom.death"); + public static final RegistryObject MINOSHROOM_HURT = createEvent("entity.twilightforest.minoshroom.hurt"); + public static final RegistryObject MINOSHROOM_SLAM = createEvent("entity.twilightforest.minoshroom.slam"); + public static final RegistryObject MINOSHROOM_STEP = createEvent("entity.twilightforest.minoshroom.step"); + public static final RegistryObject MINOTAUR_AMBIENT = createEvent("entity.twilightforest.minotaur.ambient"); + public static final RegistryObject MINOTAUR_ATTACK = createEvent("entity.twilightforest.minotaur.attack"); + public static final RegistryObject MINOTAUR_DEATH = createEvent("entity.twilightforest.minotaur.death"); + public static final RegistryObject MINOTAUR_HURT = createEvent("entity.twilightforest.minotaur.hurt"); + public static final RegistryObject MINOTAUR_STEP = createEvent("entity.twilightforest.minotaur.step"); + public static final RegistryObject MIST_WOLF_AMBIENT = createEvent("entity.twilightforest.mist_wolf.ambient"); + public static final RegistryObject MIST_WOLF_DEATH = createEvent("entity.twilightforest.mist_wolf.death"); + public static final RegistryObject MIST_WOLF_HURT = createEvent("entity.twilightforest.mist_wolf.hurt"); + public static final RegistryObject MIST_WOLF_TARGET = createEvent("entity.twilightforest.mist_wolf.target"); + public static final RegistryObject MOONWORM_SQUISH = createEvent("item.twilightforest.moonworm.squish"); + public static final RegistryObject MOSQUITO = createEvent("entity.twilightforest.mosquito.ambient"); + public static final RegistryObject NAGA_HISS = createEvent("entity.twilightforest.naga.hiss"); + public static final RegistryObject NAGA_HURT = createEvent("entity.twilightforest.naga.hurt"); + public static final RegistryObject NAGA_RATTLE = createEvent("entity.twilightforest.naga.rattle"); + public static final RegistryObject PEDESTAL_ACTIVATE = createEvent("block.twilightforest.trophy_pedestal.activate"); + public static final RegistryObject PICKED_TORCHBERRIES = createEvent("block.twilightforest.torchberry.harvest"); + public static final RegistryObject PINCH_BEETLE_DEATH = createEvent("entity.twilightforest.pinch_beetle.death"); + public static final RegistryObject PINCH_BEETLE_HURT = createEvent("entity.twilightforest.pinch_beetle.hurt"); + public static final RegistryObject PINCH_BEETLE_STEP = createEvent("entity.twilightforest.pinch_beetle.step"); + public static final RegistryObject PORTAL_WHOOSH = createEvent("block.twilightforest.portal.whoosh"); + public static final RegistryObject POWDER_USE = createEvent("item.twilightforest.transformation_powder.use"); + public static final RegistryObject QUEST_RAM_AMBIENT = createEvent("entity.twilightforest.quest_ram.ambient"); + public static final RegistryObject QUEST_RAM_DEATH = createEvent("entity.twilightforest.quest_ram.death"); + public static final RegistryObject QUEST_RAM_HURT = createEvent("entity.twilightforest.quest_ram.hurt"); + public static final RegistryObject QUEST_RAM_STEP = createEvent("entity.twilightforest.quest_ram.step"); + public static final RegistryObject RAVEN_CAW = createEvent("entity.twilightforest.raven.caw"); + public static final RegistryObject RAVEN_SQUAWK = createEvent("entity.twilightforest.raven.squawk"); + public static final RegistryObject REACTOR_AMBIENT = createEvent("block.twilightforest.reactor.ambient"); + public static final RegistryObject REAPPEAR_BLOCK = createEvent("block.twilightforest.reappearing_block.reappear"); + public static final RegistryObject REAPPEAR_POOF = createEvent("block.twilightforest.reappearing_block.vanish"); + public static final RegistryObject REDCAP_AMBIENT = createEvent("entity.twilightforest.redcap.ambient"); + public static final RegistryObject REDCAP_DEATH = createEvent("entity.twilightforest.redcap.death"); + public static final RegistryObject REDCAP_HURT = createEvent("entity.twilightforest.redcap.hurt"); + public static final RegistryObject SCEPTER_DRAIN = createEvent("item.twilightforest.scepter.drain"); + public static final RegistryObject SCEPTER_PEARL = createEvent("item.twilightforest.scepter.pearl"); + //public static final RegistryObject SCEPTER_USE = createEvent("item.twilightforest.scepter.use"); + public static final RegistryObject SHIELD_ADD = createEvent("entity.twilightforest.shield.add"); + public static final RegistryObject SHIELD_BREAK = createEvent("entity.twilightforest.shield.break"); + public static final RegistryObject SKELETON_DRUID_AMBIENT = createEvent("entity.twilightforest.skeleton_druid.ambient"); + public static final RegistryObject SKELETON_DRUID_DEATH = createEvent("entity.twilightforest.skeleton_druid.death"); + public static final RegistryObject SKELETON_DRUID_HURT = createEvent("entity.twilightforest.skeleton_druid.hurt"); + public static final RegistryObject SKELETON_DRUID_SHOOT = createEvent("entity.twilightforest.skeleton_druid.shoot"); + public static final RegistryObject SKELETON_DRUID_STEP = createEvent("entity.twilightforest.skeleton_druid.step"); + public static final RegistryObject SLIDER = createEvent("block.twilightforest.slider.move"); + public static final RegistryObject SLIME_BEETLE_DEATH = createEvent("entity.twilightforest.slime_beetle.death"); + public static final RegistryObject SLIME_BEETLE_HURT = createEvent("entity.twilightforest.slime_beetle.hurt"); + public static final RegistryObject SLIME_BEETLE_SQUISH = createEvent("entity.twilightforest.slime_beetle.squish"); + public static final RegistryObject SLIME_BEETLE_STEP = createEvent("entity.twilightforest.slime_beetle.step"); + public static final RegistryObject SMOKER_START = createEvent("block.twilightforest.smoker.start"); + public static final RegistryObject SNOW_GUARDIAN_AMBIENT = createEvent("entity.twilightforest.snow_guardian.ambient"); + public static final RegistryObject SNOW_GUARDIAN_DEATH = createEvent("entity.twilightforest.snow_guardian.death"); + public static final RegistryObject SNOW_GUARDIAN_HURT = createEvent("entity.twilightforest.snow_guardian.hurt"); + public static final RegistryObject SNOW_QUEEN_AMBIENT = createEvent("entity.twilightforest.snow_queen.ambient"); + public static final RegistryObject SNOW_QUEEN_ATTACK = createEvent("entity.twilightforest.snow_queen.attack"); + public static final RegistryObject SNOW_QUEEN_BREAK = createEvent("entity.twilightforest.snow_queen.break"); + public static final RegistryObject SNOW_QUEEN_DEATH = createEvent("entity.twilightforest.snow_queen.death"); + public static final RegistryObject SNOW_QUEEN_HURT = createEvent("entity.twilightforest.snow_queen.hurt"); + public static final RegistryObject SWARM_SPIDER_AMBIENT = createEvent("entity.twilightforest.swarm_spider.ambient"); + public static final RegistryObject SWARM_SPIDER_DEATH = createEvent("entity.twilightforest.swarm_spider.death"); + public static final RegistryObject SWARM_SPIDER_HURT = createEvent("entity.twilightforest.swarm_spider.hurt"); + public static final RegistryObject SWARM_SPIDER_STEP = createEvent("entity.twilightforest.swarm_spider.step"); + public static final RegistryObject TEAR_BREAK = createEvent("entity.twilightforest.tear.break"); + public static final RegistryObject TIME_CORE = createEvent("block.twilightforest.core.time"); + public static final RegistryObject TINY_BIRD_CHIRP = createEvent("entity.twilightforest.tiny_bird.chirp"); + public static final RegistryObject TINY_BIRD_HURT = createEvent("entity.twilightforest.tiny_bird.hurt"); + public static final RegistryObject TINY_BIRD_SONG = createEvent("entity.twilightforest.tiny_bird.song"); + public static final RegistryObject TINY_BIRD_TAKEOFF = createEvent("entity.twilightforest.tiny_bird.takeoff"); + public static final RegistryObject TOWERWOOD_BORER_AMBIENT = createEvent("entity.twilightforest.towerwood_borer.ambient"); + public static final RegistryObject TOWERWOOD_BORER_DEATH = createEvent("entity.twilightforest.towerwood_borer.death"); + public static final RegistryObject TOWERWOOD_BORER_HURT = createEvent("entity.twilightforest.towerwood_borer.hurt"); + public static final RegistryObject TOWERWOOD_BORER_STEP = createEvent("entity.twilightforest.towerwood_borer.step"); + public static final RegistryObject TRANSFORMATION_CORE = createEvent("block.twilightforest.core.transformation"); + public static final RegistryObject TROLL_THROWS_ROCK = createEvent("entity.twilightforest.troll.throw_rock"); + public static final RegistryObject UNCRAFTING_TABLE_ACTIVATE = createEvent("block.twilightforest.uncrafting_table.activate"); + public static final RegistryObject UNLOCK_VANISHING_BLOCK = createEvent("block.twilightforest.vanish.unlock"); + public static final RegistryObject UR_GHAST_AMBIENT = createEvent("entity.twilightforest.ur_ghast.ambient"); + public static final RegistryObject UR_GHAST_DEATH = createEvent("entity.twilightforest.ur_ghast.death"); + public static final RegistryObject UR_GHAST_HURT = createEvent("entity.twilightforest.ur_ghast.hurt"); + public static final RegistryObject UR_GHAST_SHOOT = createEvent("entity.twilightforest.ur_ghast.shoot"); + public static final RegistryObject UR_GHAST_TANTRUM = createEvent("entity.twilightforest.ur_ghast.tantrum"); + public static final RegistryObject UR_GHAST_WARN = createEvent("entity.twilightforest.ur_ghast.warn"); + public static final RegistryObject VANISHING_BLOCK = createEvent("block.twilightforest.vanish.vanish"); + public static final RegistryObject WINTER_WOLF_AMBIENT = createEvent("entity.twilightforest.winter_wolf.ambient"); + public static final RegistryObject WINTER_WOLF_DEATH = createEvent("entity.twilightforest.winter_wolf.death"); + public static final RegistryObject WINTER_WOLF_HURT = createEvent("entity.twilightforest.winter_wolf.hurt"); + public static final RegistryObject WINTER_WOLF_SHOOT = createEvent("entity.twilightforest.winter_wolf.shoot"); + public static final RegistryObject WINTER_WOLF_TARGET = createEvent("entity.twilightforest.winter_wolf.target"); + public static final RegistryObject WOOD_SHIELD_SHATTERS = createEvent("item.twilightforest.shield.shatter"); + public static final RegistryObject WRAITH_AMBIENT = createEvent("entity.twilightforest.wraith.ambient"); + public static final RegistryObject WRAITH_DEATH = createEvent("entity.twilightforest.wraith.death"); + public static final RegistryObject WRAITH_HURT = createEvent("entity.twilightforest.wraith.hurt"); + public static final RegistryObject YETI_DEATH = createEvent("entity.twilightforest.yeti.death"); + public static final RegistryObject YETI_GRAB = createEvent("entity.twilightforest.yeti.grab"); + public static final RegistryObject YETI_GROWL = createEvent("entity.twilightforest.yeti.growl"); + public static final RegistryObject YETI_HURT = createEvent("entity.twilightforest.yeti.hurt"); + public static final RegistryObject YETI_THROW = createEvent("entity.twilightforest.yeti.throw"); + + //Parrot sounds + public static final RegistryObject ALPHA_YETI_PARROT = createEvent("entity.twilightforest.parrot.imitate.alpha_yeti"); + public static final RegistryObject CARMINITE_GOLEM_PARROT = createEvent("entity.twilightforest.parrot.imitate.carminite_golem"); + public static final RegistryObject DEATH_TOME_PARROT = createEvent("entity.twilightforest.parrot.imitate.death_tome"); + public static final RegistryObject HOSTILE_WOLF_PARROT = createEvent("entity.twilightforest.parrot.imitate.hostile_wolf"); + public static final RegistryObject HYDRA_PARROT = createEvent("entity.twilightforest.parrot.imitate.hydra"); + public static final RegistryObject ICE_CORE_PARROT = createEvent("entity.twilightforest.parrot.imitate.ice_core"); + public static final RegistryObject KOBOLD_PARROT = createEvent("entity.twilightforest.parrot.imitate.kobold"); + public static final RegistryObject MINOTAUR_PARROT = createEvent("entity.twilightforest.parrot.imitate.minotaur"); + public static final RegistryObject MOSQUITO_PARROT = createEvent("entity.twilightforest.parrot.imitate.mosquito"); + public static final RegistryObject NAGA_PARROT = createEvent("entity.twilightforest.parrot.imitate.naga"); + public static final RegistryObject REDCAP_PARROT = createEvent("entity.twilightforest.parrot.imitate.redcap"); + public static final RegistryObject WRAITH_PARROT = createEvent("entity.twilightforest.parrot.imitate.wraith"); + + public static final RegistryObject MUSIC = createEvent("music.twilightforest.twilight_forest"); + + public static final RegistryObject MUSIC_DISC_RADIANCE = createEvent("music_disc.twilightforest.radiance"); + public static final RegistryObject MUSIC_DISC_STEPS = createEvent("music_disc.twilightforest.steps"); + public static final RegistryObject MUSIC_DISC_SUPERSTITIOUS = createEvent("music_disc.twilightforest.superstitious"); + public static final RegistryObject MUSIC_DISC_HOME = createEvent("music_disc.twilightforest.home"); + public static final RegistryObject MUSIC_DISC_WAYFARER = createEvent("music_disc.twilightforest.wayfarer"); + public static final RegistryObject MUSIC_DISC_FINDINGS = createEvent("music_disc.twilightforest.findings"); + public static final RegistryObject MUSIC_DISC_MAKER = createEvent("music_disc.twilightforest.maker"); + public static final RegistryObject MUSIC_DISC_THREAD = createEvent("music_disc.twilightforest.thread"); + public static final RegistryObject MUSIC_DISC_MOTION = createEvent("music_disc.twilightforest.motion"); + + private static RegistryObject createEvent(String sound) { + return SOUNDS.register(sound, () -> SoundEvent.createVariableRangeEvent(TwilightForestMod.prefix(sound))); + } + + public static void registerParrotSounds() { + Parrot.MOB_SOUND_MAP.put(TFEntities.ALPHA_YETI.get(), ALPHA_YETI_PARROT.get()); + Parrot.MOB_SOUND_MAP.put(TFEntities.BLOCKCHAIN_GOBLIN.get(), REDCAP_PARROT.get()); + Parrot.MOB_SOUND_MAP.put(TFEntities.CARMINITE_BROODLING.get(), SoundEvents.PARROT_IMITATE_SPIDER); + Parrot.MOB_SOUND_MAP.put(TFEntities.CARMINITE_GOLEM.get(), CARMINITE_GOLEM_PARROT.get()); + Parrot.MOB_SOUND_MAP.put(TFEntities.FIRE_BEETLE.get(), SoundEvents.PARROT_IMITATE_SPIDER); + Parrot.MOB_SOUND_MAP.put(TFEntities.CARMINITE_GHASTLING.get(), SoundEvents.PARROT_IMITATE_GHAST); + Parrot.MOB_SOUND_MAP.put(TFEntities.CARMINITE_GHASTGUARD.get(), SoundEvents.PARROT_IMITATE_GHAST); + Parrot.MOB_SOUND_MAP.put(TFEntities.HEDGE_SPIDER.get(), SoundEvents.PARROT_IMITATE_SPIDER); + Parrot.MOB_SOUND_MAP.put(TFEntities.HELMET_CRAB.get(), SoundEvents.PARROT_IMITATE_SPIDER); + Parrot.MOB_SOUND_MAP.put(TFEntities.HOSTILE_WOLF.get(), HOSTILE_WOLF_PARROT.get()); + Parrot.MOB_SOUND_MAP.put(TFEntities.HYDRA.get(), HYDRA_PARROT.get()); + Parrot.MOB_SOUND_MAP.put(TFEntities.STABLE_ICE_CORE.get(), ICE_CORE_PARROT.get()); + Parrot.MOB_SOUND_MAP.put(TFEntities.KING_SPIDER.get(), SoundEvents.PARROT_IMITATE_SPIDER); + Parrot.MOB_SOUND_MAP.put(TFEntities.KOBOLD.get(), KOBOLD_PARROT.get()); + Parrot.MOB_SOUND_MAP.put(TFEntities.LICH.get(), SoundEvents.PARROT_IMITATE_BLAZE); + Parrot.MOB_SOUND_MAP.put(TFEntities.MAZE_SLIME.get(), SoundEvents.PARROT_IMITATE_SLIME); + Parrot.MOB_SOUND_MAP.put(TFEntities.LICH_MINION.get(), SoundEvents.PARROT_IMITATE_ZOMBIE); + Parrot.MOB_SOUND_MAP.put(TFEntities.MINOSHROOM.get(), MINOTAUR_PARROT.get()); + Parrot.MOB_SOUND_MAP.put(TFEntities.MINOTAUR.get(), MINOTAUR_PARROT.get()); + Parrot.MOB_SOUND_MAP.put(TFEntities.MIST_WOLF.get(), HOSTILE_WOLF_PARROT.get()); + Parrot.MOB_SOUND_MAP.put(TFEntities.MOSQUITO_SWARM.get(), MOSQUITO_PARROT.get()); + Parrot.MOB_SOUND_MAP.put(TFEntities.NAGA.get(), NAGA_PARROT.get()); + Parrot.MOB_SOUND_MAP.put(TFEntities.KNIGHT_PHANTOM.get(), WRAITH_PARROT.get()); + Parrot.MOB_SOUND_MAP.put(TFEntities.PINCH_BEETLE.get(), SoundEvents.PARROT_IMITATE_SPIDER); + Parrot.MOB_SOUND_MAP.put(TFEntities.REDCAP.get(), REDCAP_PARROT.get()); + Parrot.MOB_SOUND_MAP.put(TFEntities.REDCAP_SAPPER.get(), REDCAP_PARROT.get()); + Parrot.MOB_SOUND_MAP.put(TFEntities.SKELETON_DRUID.get(), SoundEvents.PARROT_IMITATE_SKELETON); + Parrot.MOB_SOUND_MAP.put(TFEntities.SLIME_BEETLE.get(), SoundEvents.PARROT_IMITATE_SLIME); + Parrot.MOB_SOUND_MAP.put(TFEntities.SNOW_GUARDIAN.get(), ICE_CORE_PARROT.get()); + Parrot.MOB_SOUND_MAP.put(TFEntities.SNOW_QUEEN.get(), ICE_CORE_PARROT.get()); + Parrot.MOB_SOUND_MAP.put(TFEntities.SWARM_SPIDER.get(), SoundEvents.PARROT_IMITATE_SPIDER); + Parrot.MOB_SOUND_MAP.put(TFEntities.TOWERWOOD_BORER.get(), SoundEvents.PARROT_IMITATE_SILVERFISH); + Parrot.MOB_SOUND_MAP.put(TFEntities.DEATH_TOME.get(), DEATH_TOME_PARROT.get()); + Parrot.MOB_SOUND_MAP.put(TFEntities.UR_GHAST.get(), SoundEvents.PARROT_IMITATE_GHAST); + Parrot.MOB_SOUND_MAP.put(TFEntities.WINTER_WOLF.get(), HOSTILE_WOLF_PARROT.get()); + Parrot.MOB_SOUND_MAP.put(TFEntities.WRAITH.get(), WRAITH_PARROT.get()); + Parrot.MOB_SOUND_MAP.put(TFEntities.YETI.get(), ALPHA_YETI_PARROT.get()); + } +} diff --git a/src/main/java/twilightforest/init/TFStats.java b/src/main/java/twilightforest/init/TFStats.java new file mode 100644 index 0000000000..52fb95e80e --- /dev/null +++ b/src/main/java/twilightforest/init/TFStats.java @@ -0,0 +1,41 @@ +package twilightforest.init; + + +import net.minecraft.core.Registry; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.stats.StatFormatter; +import net.minecraft.stats.Stats; +import net.minecraftforge.registries.DeferredRegister; +import net.minecraftforge.registries.RegistryObject; +import twilightforest.TwilightForestMod; + +import java.util.ArrayList; +import java.util.List; + +public class TFStats { + + public static final DeferredRegister STATS = DeferredRegister.create(Registries.CUSTOM_STAT, TwilightForestMod.ID); + private static final List STAT_SETUP = new ArrayList<>(); + + public static final RegistryObject BUGS_SQUISHED = makeTFStat("bugs_squished"); + public static final RegistryObject UNCRAFTING_TABLE_INTERACTIONS = makeTFStat("uncrafting_table_interactions"); + public static final RegistryObject TROPHY_PEDESTALS_ACTIVATED = makeTFStat("trophy_pedestals_activated"); + public static final RegistryObject E115_SLICES_EATEN = makeTFStat("e115_slices_eaten"); + public static final RegistryObject TORCHBERRIES_HARVESTED = makeTFStat("torchberries_harvested"); + public static final RegistryObject BLOCKS_CRUMBLED = makeTFStat("blocks_crumbled"); + public static final RegistryObject LIFE_CHARMS_ACTIVATED = makeTFStat("life_charms_activated"); + public static final RegistryObject KEEPING_CHARMS_ACTIVATED = makeTFStat("keeping_charms_activated"); + public static final RegistryObject SKULL_CANDLES_MADE = makeTFStat("skull_candles_made"); + public static final RegistryObject TF_SHIELDS_BROKEN = makeTFStat("tf_shields_broken"); + + private static RegistryObject makeTFStat(String key) { + ResourceLocation resourcelocation = TwilightForestMod.prefix(key); + STAT_SETUP.add(() -> Stats.CUSTOM.get(resourcelocation, StatFormatter.DEFAULT)); + return STATS.register(key, () -> resourcelocation); + } + + public static void init() { + STAT_SETUP.forEach(Runnable::run); + } +} diff --git a/src/main/java/twilightforest/init/TFStructurePieceTypes.java b/src/main/java/twilightforest/init/TFStructurePieceTypes.java new file mode 100644 index 0000000000..11d52f3750 --- /dev/null +++ b/src/main/java/twilightforest/init/TFStructurePieceTypes.java @@ -0,0 +1,213 @@ +package twilightforest.init; + +import net.minecraft.core.Registry; +import net.minecraft.core.registries.Registries; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; +import net.minecraftforge.registries.DeferredRegister; +import net.minecraftforge.registries.RegistryObject; +import twilightforest.TwilightForestMod; +import twilightforest.world.components.structures.*; +import twilightforest.world.components.structures.courtyard.*; +import twilightforest.world.components.structures.darktower.*; +import twilightforest.world.components.structures.finalcastle.*; +import twilightforest.world.components.structures.icetower.*; +import twilightforest.world.components.structures.lichtower.*; +import twilightforest.world.components.structures.lichtowerrevamp.*; +import twilightforest.world.components.structures.minotaurmaze.*; +import twilightforest.world.components.structures.mushroomtower.*; +import twilightforest.world.components.structures.stronghold.*; +import twilightforest.world.components.structures.trollcave.*; + +import java.util.Locale; + +public class TFStructurePieceTypes { + public static final DeferredRegister STRUCTURE_PIECE_TYPES = DeferredRegister.create(Registries.STRUCTURE_PIECE, TwilightForestMod.ID); + + // Single-Piece Structures + //IStructurePieceTypes that can be referred to + public static final RegistryObject TFHill = registerPieceType("TFHill", HollowHillComponent::new); + public static final RegistryObject TFHedge = registerPieceType("TFHedge", HedgeMazeComponent::new); + public static final RegistryObject TFQuestGrove = registerPieceType("TFQuest1", QuestGrove::new); + public static final RegistryObject TFHydra = registerPieceType("TFHydra", HydraLairComponent::new); + public static final RegistryObject TFYeti = registerPieceType("TFYeti", YetiCaveComponent::new); + + // Mushroom Castle + //public static final RegistryObject TFMT = registerPieceType("TFMT", StructureStartMushroomTower::new); + public static final RegistryObject TFMTMai = registerPieceType("TFMTMai", MushroomTowerMainComponent::new); + public static final RegistryObject TFMTWin = registerPieceType("TFMTWin", MushroomTowerWingComponent::new); + public static final RegistryObject TFMTBri = registerPieceType("TFMTBri", MushroomTowerBridgeComponent::new); + public static final RegistryObject TFMTMB = registerPieceType("TFMTMB", MushroomTowerMainBridgeComponent::new); + public static final RegistryObject TFMTRoofMush = registerPieceType("TFMTRoofMush", TowerRoofMushroomComponent::new); + + // Naga Courtyard + //public static final RegistryObject TFNC = registerPieceType("TFNC", StructureStartCourtyard::new); + public static final RegistryObject TFNCMn = registerPieceType("TFNCMn", CourtyardMain::new); + public static final RegistryObject TFNCCp = registerPieceType("TFNCCp", NagaCourtyardHedgeCapComponent::new); + public static final RegistryObject TFNCCpP = registerPieceType("TFNCCpP", NagaCourtyardHedgeCapPillarComponent::new); + public static final RegistryObject TFNCCr = registerPieceType("TFNCCr", NagaCourtyardHedgeCornerComponent::new); + public static final RegistryObject TFNCLn = registerPieceType("TFNCLn", NagaCourtyardHedgeLineComponent::new); + public static final RegistryObject TFNCT = registerPieceType("TFNCT", NagaCourtyardHedgeTJunctionComponent::new); + public static final RegistryObject TFNCIs = registerPieceType("TFNCIs", NagaCourtyardHedgeIntersectionComponent::new); + public static final RegistryObject TFNCPd = registerPieceType("TFNCPd", NagaCourtyardHedgePadderComponent::new); + public static final RegistryObject TFNCTr = registerPieceType("TFNCTr", CourtyardTerraceBrazier::new); + public static final RegistryObject TFNCDu = registerPieceType("TFNCDu", CourtyardTerraceDuct::new); + public static final RegistryObject TFNCSt = registerPieceType("TFNCSt", CourtyardTerraceStatue::new); + public static final RegistryObject TFNCPa = registerPieceType("TFNCPa", CourtyardPathPiece::new); + public static final RegistryObject TFNCWl = registerPieceType("TFNCWl", CourtyardWall::new); + public static final RegistryObject TFNCWP = registerPieceType("TFNCWP", CourtyardWallPadder::new); + public static final RegistryObject TFNCWC = registerPieceType("TFNCWC", CourtyardWallCornerOuter::new); + public static final RegistryObject TFNCWA = registerPieceType("TFNCWA", CourtyardWallCornerInner::new); + + // Old Lich Tower + //public static final IStructurePieceType TFLT = TFFeature.registerPiece("TFLT", StructureStartLichTower::new); + public static final RegistryObject TFLTBea = registerPieceType("TFLTBea", TowerBeardComponent::new); + public static final RegistryObject TFLTBA = registerPieceType("TFLTBA", TowerBeardAttachedComponent::new); + public static final RegistryObject TFLTBri = registerPieceType("TFLTBri", TowerBridgeComponent::new); + public static final RegistryObject TFLTMai = registerPieceType("TFLTMai", TowerMainComponent::new); + public static final RegistryObject TFLTOut = registerPieceType("TFLTOut", TowerOutbuildingComponent::new); + public static final RegistryObject TFLTRoo = registerPieceType("TFLTRoo", TowerRoofComponent::new); + public static final RegistryObject TFLTRAS = registerPieceType("TFLTRAS", TowerRoofAttachedSlabComponent::new); + public static final RegistryObject TFLTRF = registerPieceType("TFLTRF", TowerRoofFenceComponent::new); + public static final RegistryObject TFLTRGF = registerPieceType("TFLTRGF", TowerRoofGableForwardsComponent::new); + public static final RegistryObject TFLTRP = registerPieceType("TFLTRP", TowerRoofPointyComponent::new); + public static final RegistryObject TFLTRPO = registerPieceType("TFLTRPO", TowerRoofPointyOverhangComponent::new); + public static final RegistryObject TFLTRS = registerPieceType("TFLTRS", TowerRoofSlabComponent::new); + public static final RegistryObject TFLTRSF = registerPieceType("TFLTRSF", TowerRoofSlabForwardsComponent::new); + public static final RegistryObject TFLTRSt = registerPieceType("TFLTRSt", TowerRoofStairsComponent::new); + public static final RegistryObject TFLTRStO = registerPieceType("TFLTRStO", TowerRoofStairsOverhangComponent::new); + public static final RegistryObject TFLTWin = registerPieceType("TFLTWin", TowerWingComponent::new); + + // New Lich Tower + public static final RegistryObject TOWER_FOYER = registerPieceType("TFLT" + "TFoy", TowerFoyer::new); + public static final RegistryObject CENTRAL_TOWER = registerPieceType("TFLT" + "CTSeg", CentralTowerSegment::new); + public static final RegistryObject CENTRAL_TO_SIDE_TOWER = registerPieceType("TFLT" + "C2ST", CentralTowerAttachment::new); + public static final RegistryObject SIDE_TOWER_ROOM = registerPieceType("TFLT" + "STRm", SideTowerRoom::new); + + // Labyrinth + //public static final RegistryObject TFLr = registerPieceType("TFLr", StructureStartLabyrinth::new); + public static final RegistryObject TFMMC = registerPieceType("TFMMC", MazeCorridorComponent::new); + public static final RegistryObject TFMMCIF = registerPieceType("TFMMCIF", MazeCorridorIronFenceComponent::new); + public static final RegistryObject TFMMCR = registerPieceType("TFMMCR", MazeCorridorRootsComponent::new); + public static final RegistryObject TFMMCS = registerPieceType("TFMMCS", MazeCorridorShroomsComponent::new); + public static final RegistryObject TFMMDE = registerPieceType("TFMMDE", MazeDeadEndComponent::new); + public static final RegistryObject TFMMDEC = registerPieceType("TFMMDEC", MazeDeadEndChestComponent::new); + public static final RegistryObject TFMMDEF = registerPieceType("TFMMDEF", MazeDeadEndFountainComponent::new); + public static final RegistryObject TFMMDEFL = registerPieceType("TFMMDEFL", MazeDeadEndFountainLavaComponent::new); + public static final RegistryObject TFMMDEP = registerPieceType("TFMMDEP", MazeDeadEndPaintingComponent::new); + public static final RegistryObject TFMMDER = registerPieceType("TFMMDER", MazeDeadEndRootsComponent::new); + public static final RegistryObject TFMMDES = registerPieceType("TFMMDES", MazeDeadEndShroomsComponent::new); + public static final RegistryObject TFMMDET = registerPieceType("TFMMDET", MazeDeadEndTorchesComponent::new); + public static final RegistryObject TFMMDETrC = registerPieceType("TFMMDETrC", MazeDeadEndTrappedChestComponent::new); + public static final RegistryObject TFMMDETC = registerPieceType("TFMMDETC", MazeDeadEndTripwireChestComponent::new); + public static final RegistryObject TFMMES = registerPieceType("TFMMES", MazeEntranceShaftComponent::new); + public static final RegistryObject TFMMMound = registerPieceType("TFMMMound", MazeMoundComponent::new); + public static final RegistryObject TFMMMR = registerPieceType("TFMMMR", MazeMushRoomComponent::new); + public static final RegistryObject TFMMR = registerPieceType("TFMMR", MazeRoomComponent::new); + public static final RegistryObject TFMMRB = registerPieceType("TFMMRB", MazeRoomBossComponent::new); + public static final RegistryObject TFMMRC = registerPieceType("TFMMRC", MazeRoomCollapseComponent::new); + public static final RegistryObject TFMMRE = registerPieceType("TFMMRE", MazeRoomExitComponent::new); + public static final RegistryObject TFMMRF = registerPieceType("TFMMRF", MazeRoomFountainComponent::new); + public static final RegistryObject TFMMRSC = registerPieceType("TFMMRSC", MazeRoomSpawnerChestsComponent::new); + public static final RegistryObject TFMMRV = registerPieceType("TFMMRV", MazeRoomVaultComponent::new); + public static final RegistryObject TFMMRuins = registerPieceType("TFMMRuins", MazeRuinsComponent::new); + public static final RegistryObject TFMMUE = registerPieceType("TFMMUE", MazeUpperEntranceComponent::new); + public static final RegistryObject TFMMaze = registerPieceType("TFMMaze", MinotaurMazeComponent::new); + + // Knight Stronghold + //public static final RegistryObject TFKSt = registerPieceType("TFKSt", StructureStartKnightStronghold::new); + public static final RegistryObject TFSSH = registerPieceType("TFSSH", StrongholdSmallHallwayComponent::new); + public static final RegistryObject TFSLT = registerPieceType("TFSLT", StrongholdLeftTurnComponent::new); + public static final RegistryObject TFSCr = registerPieceType("TFSCr", StrongholdCrossingComponent::new); + public static final RegistryObject TFSRT = registerPieceType("TFSRT", StrongholdRightTurnComponent::new); + public static final RegistryObject TFSDE = registerPieceType("TFSDE", StrongholdDeadEndComponent::new); + public static final RegistryObject TFSBalR = registerPieceType("TFSBalR", StrongholdBalconyRoomComponent::new); + public static final RegistryObject TFSTR = registerPieceType("TFSTR", StrongholdTrainingRoomComponent::new); + public static final RegistryObject TFSSS = registerPieceType("TFSSS", StrongholdSmallStairsComponent::new); + public static final RegistryObject TFSTC = registerPieceType("TFSTC", StrongholdTreasureCorridorComponent::new); + public static final RegistryObject TFSAt = registerPieceType("TFSAt", StrongholdAtriumComponent::new); + public static final RegistryObject TFSFo = registerPieceType("TFSFo", StrongholdFoundryComponent::new); + public static final RegistryObject TFTreaR = registerPieceType("TFTreaR", StrongholdTreasureRoomComponent::new); + public static final RegistryObject TFSBR = registerPieceType("TFSBR", StrongholdBossRoomComponent::new); + public static final RegistryObject TFSAC = registerPieceType("TFSAC", StrongholdAccessChamberComponent::new); + public static final RegistryObject TFSEnter = registerPieceType("TFSEnter", StrongholdEntranceComponent::new); + public static final RegistryObject TFSUA = registerPieceType("TFSUA", StrongholdUpperAscenderComponent::new); + public static final RegistryObject TFSULT = registerPieceType("TFSULT", StrongholdUpperLeftTurnComponent::new); + public static final RegistryObject TFSURT = registerPieceType("TFSURT", StrongholdUpperRightTurnComponent::new); + public static final RegistryObject TFSUCo = registerPieceType("TFSUCo", StrongholdUpperCorridorComponent::new); + public static final RegistryObject TFSUTI = registerPieceType("TFSUTI", StrongholdUpperTIntersectionComponent::new); + public static final RegistryObject TFSShield = registerPieceType("TFSShield", StrongholdShieldStructure::new); + + // Dark Tower + //public static final RegistryObject TFDT = registerPieceType("TFDT", StructureStartDarkTower::new); + public static final RegistryObject TFDTBal = registerPieceType("TFDTBal", DarkTowerBalconyComponent::new); + public static final RegistryObject TFDTBea = registerPieceType("TFDTBea", DarkTowerBeardComponent::new); + public static final RegistryObject TFDTBB = registerPieceType("TFDTBB", DarkTowerBossBridgeComponent::new); + public static final RegistryObject TFDTBT = registerPieceType("TFDTBT", DarkTowerBossTrapComponent::new); + public static final RegistryObject TFDTBri = registerPieceType("TFDTBri", DarkTowerBridgeComponent::new); + public static final RegistryObject TFDTEnt = registerPieceType("TFDTEnt", DarkTowerEntranceComponent::new); + public static final RegistryObject TFDTEB = registerPieceType("TFDTEB", DarkTowerEntranceBridgeComponent::new); + public static final RegistryObject TFDTMai = registerPieceType("TFDTMai", DarkTowerMainComponent::new); + public static final RegistryObject TFDTMB = registerPieceType("TFDTMB", DarkTowerMainBridgeComponent::new); + public static final RegistryObject TFDTRooS = registerPieceType("TFDTRooS", DarkTowerRoofComponent::new); + public static final RegistryObject TFDTRA = registerPieceType("TFDTRA", DarkTowerRoofAntennaComponent::new); + public static final RegistryObject TFDTRC = registerPieceType("TFDTRC", DarkTowerRoofCactusComponent::new); + public static final RegistryObject TFDTRFP = registerPieceType("TFDTRFP", DarkTowerRoofFourPostComponent::new); + public static final RegistryObject TFDTRR = registerPieceType("TFDTRR", DarkTowerRoofRingsComponent::new); + public static final RegistryObject TFDTWin = registerPieceType("TFDTWin", DarkTowerWingComponent::new); + + // Aurora Palace + //public static final RegistryObject TFAP = registerPieceType("TFAP", StructureStartAuroraPalace::new); + public static final RegistryObject TFITMai = registerPieceType("TFITMai", IceTowerMainComponent::new); + public static final RegistryObject TFITWin = registerPieceType("TFITWin", IceTowerWingComponent::new); + public static final RegistryObject TFITRoof = registerPieceType("TFITRoof", IceTowerRoofComponent::new); + public static final RegistryObject TFITBea = registerPieceType("TFITBea", IceTowerBeardComponent::new); + public static final RegistryObject TFITBoss = registerPieceType("TFITBoss", IceTowerBossWingComponent::new); + public static final RegistryObject TFITEnt = registerPieceType("TFITEnt", IceTowerEntranceComponent::new); + public static final RegistryObject TFITBri = registerPieceType("TFITBri", IceTowerBridgeComponent::new); + public static final RegistryObject TFITSt = registerPieceType("TFITSt", IceTowerStairsComponent::new); + + // Troll Cave + //public static final RegistryObject TFTC = registerPieceType("TFTC", StructureStartTrollCave::new); + public static final RegistryObject TFTCMai = registerPieceType("TFTCMai", TrollCaveMainComponent::new); + public static final RegistryObject TFTCCon = registerPieceType("TFTCCon", TrollCaveConnectComponent::new); + public static final RegistryObject TFTCGard = registerPieceType("TFTCGard", TrollCaveGardenComponent::new); + public static final RegistryObject TFTCloud = registerPieceType("TFTCloud", TrollCloudComponent::new); + public static final RegistryObject TFClCa = registerPieceType("TFClCa", CloudCastleComponent::new); + public static final RegistryObject TFClTr = registerPieceType("TFClTr", CloudTreeComponent::new); + public static final RegistryObject TFTCVa = registerPieceType("TFTCVa", TrollVaultComponent::new); + + // Final Castle + //public static final RegistryObject TFFC = registerPieceType("TFFC", StructureStartFinalCastle::new); + public static final RegistryObject TFFCMain = registerPieceType("TFFCMain", FinalCastleMainComponent::new); + public static final RegistryObject TFFCStTo = registerPieceType("TFFCStTo", FinalCastleStairTowerComponent::new); + public static final RegistryObject TFFCLaTo = registerPieceType("TFFCLaTo", FinalCastleLargeTowerComponent::new); + public static final RegistryObject TFFCMur = registerPieceType("TFFCMur", FinalCastleMuralComponent::new); + public static final RegistryObject TFFCToF48 = registerPieceType("TFFCToF48", FinalCastleFoundation48Component::new); + public static final RegistryObject TFFCRo48Cr = registerPieceType("TFFCRo48Cr", FinalCastleRoof48CrenellatedComponent::new); + public static final RegistryObject TFFCBoGaz = registerPieceType("TFFCBoGaz", FinalCastleBossGazeboComponent::new); + public static final RegistryObject TFFCSiTo = registerPieceType("TFFCSiTo", FinalCastleMazeTower13Component::new); + public static final RegistryObject TFFCDunSt = registerPieceType("TFFCDunSt", FinalCastleDungeonStepsComponent::new); + public static final RegistryObject TFFCDunEn = registerPieceType("TFFCDunEn", FinalCastleDungeonEntranceComponent::new); + public static final RegistryObject TFFCDunR31 = registerPieceType("TFFCDunR31", FinalCastleDungeonRoom31Component::new); + public static final RegistryObject TFFCDunEx = registerPieceType("TFFCDunEx", FinalCastleDungeonExitComponent::new); + public static final RegistryObject TFFCDunBoR = registerPieceType("TFFCDunBoR", FinalCastleDungeonForgeRoomComponent::new); + public static final RegistryObject TFFCRo9Cr = registerPieceType("TFFCRo9Cr", FinalCastleRoof9CrenellatedComponent::new); + public static final RegistryObject TFFCRo13Cr = registerPieceType("TFFCRo13Cr", FinalCastleRoof13CrenellatedComponent::new); + public static final RegistryObject TFFCRo13Con = registerPieceType("TFFCRo13Con", FinalCastleRoof13ConicalComponent::new); + public static final RegistryObject TFFCRo13Pk = registerPieceType("TFFCRo13Pk", FinalCastleRoof13PeakedComponent::new); + public static final RegistryObject TFFCEnTo = registerPieceType("TFFCEnTo", FinalCastleEntranceTowerComponent::new); + public static final RegistryObject TFFCEnSiTo = registerPieceType("TFFCEnSiTo", FinalCastleEntranceSideTowerComponent::new); + public static final RegistryObject TFFCEnBoTo = registerPieceType("TFFCEnBoTo", FinalCastleEntranceBottomTowerComponent::new); + public static final RegistryObject TFFCEnSt = registerPieceType("TFFCEnSt", FinalCastleEntranceStairsComponent::new); + public static final RegistryObject TFFCBelTo = registerPieceType("TFFCBelTo", FinalCastleBellTower21Component::new); + public static final RegistryObject TFFCBri = registerPieceType("TFFCBri", FinalCastleBridgeComponent::new); + public static final RegistryObject TFFCToF13 = registerPieceType("TFFCToF13", FinalCastleFoundation13Component::new); + public static final RegistryObject TFFCBeF21 = registerPieceType("TFFCBeF21", FinalCastleBellFoundation21Component::new); + public static final RegistryObject TFFCFTh21 = registerPieceType("TFFCFTh21", FinalCastleFoundation13ComponentThorns::new); + public static final RegistryObject TFFCDamT = registerPieceType("TFFCDamT", FinalCastleDamagedTowerComponent::new); + public static final RegistryObject TFFCWrT = registerPieceType("TFFCWrT", FinalCastleWreckedTowerComponent::new); + + private static RegistryObject registerPieceType(String name, StructurePieceType structurePieceType) { + return TFStructurePieceTypes.STRUCTURE_PIECE_TYPES.register(name.toLowerCase(Locale.ROOT), () -> structurePieceType); + } +} diff --git a/src/main/java/twilightforest/init/TFStructurePlacementTypes.java b/src/main/java/twilightforest/init/TFStructurePlacementTypes.java new file mode 100644 index 0000000000..aaac281dfe --- /dev/null +++ b/src/main/java/twilightforest/init/TFStructurePlacementTypes.java @@ -0,0 +1,23 @@ +package twilightforest.init; + +import net.minecraft.core.registries.Registries; +import net.minecraft.world.level.levelgen.placement.PlacementModifier; +import net.minecraft.world.level.levelgen.placement.PlacementModifierType; +import net.minecraft.world.level.levelgen.structure.placement.StructurePlacement; +import net.minecraft.world.level.levelgen.structure.placement.StructurePlacementType; +import net.minecraftforge.registries.DeferredRegister; +import net.minecraftforge.registries.RegistryObject; +import twilightforest.TwilightForestMod; +import twilightforest.world.components.structures.placements.BiomeForcedLandmarkPlacement; + +import java.util.function.Supplier; + +public class TFStructurePlacementTypes { + public static final DeferredRegister> STRUCTURE_PLACEMENT_TYPES = DeferredRegister.create(Registries.STRUCTURE_PLACEMENT, TwilightForestMod.ID); + + public static final RegistryObject> FORCED_LANDMARK_PLACEMENT_TYPE = registerPlacer("forced_landmark", () -> () -> BiomeForcedLandmarkPlacement.CODEC); + + private static

RegistryObject> registerPlacer(String name, Supplier> factory) { + return STRUCTURE_PLACEMENT_TYPES.register(name, factory); + } +} diff --git a/src/main/java/twilightforest/init/TFStructureProcessors.java b/src/main/java/twilightforest/init/TFStructureProcessors.java new file mode 100644 index 0000000000..2628a620a0 --- /dev/null +++ b/src/main/java/twilightforest/init/TFStructureProcessors.java @@ -0,0 +1,41 @@ +package twilightforest.init; + +import net.minecraft.core.registries.Registries; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureProcessor; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureProcessorType; +import net.minecraftforge.registries.DeferredRegister; +import net.minecraftforge.registries.RegistryObject; +import twilightforest.TwilightForestMod; +import twilightforest.world.components.feature.templates.GraveyardFeature; +import twilightforest.world.components.processors.*; +import twilightforest.world.components.structures.courtyard.CourtyardTerraceTemplateProcessor; + +import java.util.function.Supplier; + +/** + * Class for registering IStructureProcessorTypes. These are just used for StructureProcessor.getType() + */ +public class TFStructureProcessors { + + public static final DeferredRegister> STRUCTURE_PROCESSORS = DeferredRegister.create(Registries.STRUCTURE_PROCESSOR, TwilightForestMod.ID); + + public static final RegistryObject> COBBLE_VARIANTS = registerProcessor("cobble_variants", () -> () -> CobbleVariants.CODEC); + public static final RegistryObject> SMOOTH_STONE_VARIANTS = registerProcessor("smooth_stone_variants", () -> () -> SmoothStoneVariants.CODEC); + public static final RegistryObject> STONE_BRICK_VARIANTS = registerProcessor("stone_brick_variants", () -> () -> StoneBricksVariants.CODEC); + public static final RegistryObject> NAGASTONE_VARIANTS = registerProcessor("nagastone_variants", () -> () -> NagastoneVariants.CODEC); + + public static final RegistryObject> STATE_TRANSFIGURING = registerProcessor("state_transfiguring", () -> () -> StateTransfiguringProcessor.CODEC); + + public static final RegistryObject> PLANK_SWIZZLE = registerProcessor("wood_swizzle", () -> () -> WoodPaletteSwizzle.CODEC); + public static final RegistryObject> SMART_GRASS = registerProcessor("smart_grass", () -> () -> SmartGrassProcessor.CODEC); + public static final RegistryObject> BOX_CUTTING_PROCESSOR = registerProcessor("box_cutting", () -> () -> BoxCuttingProcessor.CODEC); + public static final RegistryObject> TARGETED_ROT = registerProcessor("targeted_rot", () -> () -> TargetedRotProcessor.CODEC); + + public static final RegistryObject> WEB = registerProcessor("web", () -> () -> GraveyardFeature.WebTemplateProcessor.CODEC); + public static final RegistryObject> COURTYARD_TERRACE = registerProcessor("courtyard_terrace", () -> () -> CourtyardTerraceTemplateProcessor.CODEC); + + //goofy but needed + public static

RegistryObject> registerProcessor(String name, Supplier> processor) { + return STRUCTURE_PROCESSORS.register(name, processor); + } +} diff --git a/src/main/java/twilightforest/init/TFStructureSets.java b/src/main/java/twilightforest/init/TFStructureSets.java new file mode 100644 index 0000000000..3b5c9a2918 --- /dev/null +++ b/src/main/java/twilightforest/init/TFStructureSets.java @@ -0,0 +1,55 @@ +package twilightforest.init; + +import net.minecraft.core.HolderGetter; +import net.minecraft.core.registries.Registries; +import net.minecraft.data.worldgen.BootstapContext; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.levelgen.structure.Structure; +import net.minecraft.world.level.levelgen.structure.StructureSet; +import twilightforest.TwilightForestMod; +import twilightforest.world.components.structures.placements.BiomeForcedLandmarkPlacement; + +public class TFStructureSets { + + public static final ResourceKey HEDGE_MAZE = registerKey("hedge_maze"); + public static final ResourceKey QUEST_GROVE = registerKey("quest_grove"); + public static final ResourceKey MUSHROOM_TOWER = registerKey("mushroom_tower"); + public static final ResourceKey HOLLOW_HILL_SMALL = registerKey("small_hollow_hill"); + public static final ResourceKey HOLLOW_HILL_MEDIUM = registerKey("medium_hollow_hill"); + public static final ResourceKey HOLLOW_HILL_LARGE = registerKey("large_hollow_hill"); + public static final ResourceKey NAGA_COURTYARD = registerKey("naga_courtyard"); + public static final ResourceKey LICH_TOWER = registerKey("lich_tower"); + public static final ResourceKey LABYRINTH = registerKey("labyrinth"); + public static final ResourceKey HYDRA_LAIR = registerKey("hydra_lair"); + public static final ResourceKey KNIGHT_STRONGHOLD = registerKey("knight_stronghold"); + public static final ResourceKey DARK_TOWER = registerKey("dark_tower"); + public static final ResourceKey YETI_CAVE = registerKey("yeti_cave"); + public static final ResourceKey AURORA_PALACE = registerKey("aurora_palace"); + public static final ResourceKey TROLL_CAVE = registerKey("troll_cave"); + public static final ResourceKey FINAL_CASTLE = registerKey("final_castle"); + + + private static ResourceKey registerKey(String name) { + return ResourceKey.create(Registries.STRUCTURE_SET, TwilightForestMod.prefix(name)); + } + + public static void bootstrap(BootstapContext context) { + HolderGetter structures = context.lookup(Registries.STRUCTURE); + context.register(HEDGE_MAZE, new StructureSet(structures.getOrThrow(TFStructures.HEDGE_MAZE), new BiomeForcedLandmarkPlacement(TFLandmark.HEDGE_MAZE, 256))); + context.register(QUEST_GROVE, new StructureSet(structures.getOrThrow(TFStructures.QUEST_GROVE), new BiomeForcedLandmarkPlacement(TFLandmark.QUEST_GROVE, 256))); + context.register(MUSHROOM_TOWER, new StructureSet(structures.getOrThrow(TFStructures.MUSHROOM_TOWER), new BiomeForcedLandmarkPlacement(TFLandmark.MUSHROOM_TOWER, 256))); + context.register(HOLLOW_HILL_SMALL, new StructureSet(structures.getOrThrow(TFStructures.HOLLOW_HILL_SMALL), new BiomeForcedLandmarkPlacement(TFLandmark.SMALL_HILL, 256))); + context.register(HOLLOW_HILL_MEDIUM, new StructureSet(structures.getOrThrow(TFStructures.HOLLOW_HILL_MEDIUM), new BiomeForcedLandmarkPlacement(TFLandmark.MEDIUM_HILL, 256))); + context.register(HOLLOW_HILL_LARGE, new StructureSet(structures.getOrThrow(TFStructures.HOLLOW_HILL_LARGE), new BiomeForcedLandmarkPlacement(TFLandmark.LARGE_HILL, 256))); + context.register(NAGA_COURTYARD, new StructureSet(structures.getOrThrow(TFStructures.NAGA_COURTYARD), new BiomeForcedLandmarkPlacement(TFLandmark.NAGA_COURTYARD, 256))); + context.register(LICH_TOWER, new StructureSet(structures.getOrThrow(TFStructures.LICH_TOWER), new BiomeForcedLandmarkPlacement(TFLandmark.LICH_TOWER, 256))); + context.register(LABYRINTH, new StructureSet(structures.getOrThrow(TFStructures.LABYRINTH), new BiomeForcedLandmarkPlacement(TFLandmark.LABYRINTH, 256))); + context.register(HYDRA_LAIR, new StructureSet(structures.getOrThrow(TFStructures.HYDRA_LAIR), new BiomeForcedLandmarkPlacement(TFLandmark.HYDRA_LAIR, 256))); + context.register(KNIGHT_STRONGHOLD, new StructureSet(structures.getOrThrow(TFStructures.KNIGHT_STRONGHOLD), new BiomeForcedLandmarkPlacement(TFLandmark.KNIGHT_STRONGHOLD, 256))); + context.register(DARK_TOWER, new StructureSet(structures.getOrThrow(TFStructures.DARK_TOWER), new BiomeForcedLandmarkPlacement(TFLandmark.DARK_TOWER, 256))); + context.register(YETI_CAVE, new StructureSet(structures.getOrThrow(TFStructures.YETI_CAVE), new BiomeForcedLandmarkPlacement(TFLandmark.YETI_CAVE, 256))); + context.register(AURORA_PALACE, new StructureSet(structures.getOrThrow(TFStructures.AURORA_PALACE), new BiomeForcedLandmarkPlacement(TFLandmark.ICE_TOWER, 256))); + context.register(TROLL_CAVE, new StructureSet(structures.getOrThrow(TFStructures.TROLL_CAVE), new BiomeForcedLandmarkPlacement(TFLandmark.TROLL_CAVE, 256))); + context.register(FINAL_CASTLE, new StructureSet(structures.getOrThrow(TFStructures.FINAL_CASTLE), new BiomeForcedLandmarkPlacement(TFLandmark.FINAL_CASTLE, 256))); + } +} diff --git a/src/main/java/twilightforest/init/TFStructureTypes.java b/src/main/java/twilightforest/init/TFStructureTypes.java new file mode 100644 index 0000000000..01f0acf2f7 --- /dev/null +++ b/src/main/java/twilightforest/init/TFStructureTypes.java @@ -0,0 +1,36 @@ +package twilightforest.init; + +import net.minecraft.core.registries.Registries; +import net.minecraft.world.level.levelgen.structure.Structure; +import net.minecraft.world.level.levelgen.structure.StructureType; +import net.minecraftforge.registries.DeferredRegister; +import net.minecraftforge.registries.RegistryObject; +import twilightforest.TwilightForestMod; +import twilightforest.world.components.structures.type.*; + +import java.util.function.Supplier; + +public class TFStructureTypes { + public static final DeferredRegister> STRUCTURE_TYPES = DeferredRegister.create(Registries.STRUCTURE_TYPE, TwilightForestMod.ID); + + public static final RegistryObject> LEGACY_LANDMARK = registerType("legacy_landmark", () -> () -> LegacyStructure.CODEC); + + public static final RegistryObject> HEDGE_MAZE = registerType("hedge_maze", () -> () -> HedgeMazeStructure.CODEC); + public static final RegistryObject> HOLLOW_HILL = registerType("hollow_hill", () -> () -> HollowHillStructure.CODEC); + public static final RegistryObject> QUEST_GROVE = registerType("quest_grove", () -> () -> QuestGroveStructure.CODEC); + public static final RegistryObject> MUSHROOM_TOWER = registerType("mushroom_tower", () -> () -> MushroomTowerStructure.CODEC); + public static final RegistryObject> NAGA_COURTYARD = registerType("naga_courtyard", () -> () -> NagaCourtyardStructure.CODEC); + public static final RegistryObject> LICH_TOWER = registerType("lich_tower", () -> () -> LichTowerStructure.CODEC); + public static final RegistryObject> LABYRINTH = registerType("labyrinth", () -> () -> LabyrinthStructure.CODEC); + public static final RegistryObject> HYDRA_LAIR = registerType("hydra_lair", () -> () -> HydraLairStructure.CODEC); + public static final RegistryObject> KNIGHT_STRONGHOLD = registerType("knight_stronghold", () -> () -> KnightStrongholdStructure.CODEC); + public static final RegistryObject> DARK_TOWER = registerType("dark_tower", () -> () -> DarkTowerStructure.CODEC); + public static final RegistryObject> YETI_CAVE = registerType("yeti_cave", () -> () -> YetiCaveStructure.CODEC); + public static final RegistryObject> AURORA_PALACE = registerType("aurora_palace", () -> () -> AuroraPalaceStructure.CODEC); + public static final RegistryObject> TROLL_CAVE = registerType("troll_cave", () -> () -> TrollCaveStructure.CODEC); + public static final RegistryObject> FINAL_CASTLE = registerType("final_castle", () -> () -> FinalCastleStructure.CODEC); + + private static

RegistryObject> registerType(String name, Supplier> factory) { + return STRUCTURE_TYPES.register(name, factory); + } +} diff --git a/src/main/java/twilightforest/init/TFStructures.java b/src/main/java/twilightforest/init/TFStructures.java new file mode 100644 index 0000000000..1ec16abfd6 --- /dev/null +++ b/src/main/java/twilightforest/init/TFStructures.java @@ -0,0 +1,52 @@ +package twilightforest.init; + +import net.minecraft.core.registries.Registries; +import net.minecraft.data.worldgen.BootstapContext; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.levelgen.structure.Structure; +import twilightforest.TwilightForestMod; +import twilightforest.world.components.structures.type.*; + +public class TFStructures { + + public static final ResourceKey HEDGE_MAZE = registerKey("hedge_maze"); + public static final ResourceKey QUEST_GROVE = registerKey("quest_grove"); + public static final ResourceKey MUSHROOM_TOWER = registerKey("mushroom_tower"); + public static final ResourceKey HOLLOW_HILL_SMALL = registerKey("small_hollow_hill"); + public static final ResourceKey HOLLOW_HILL_MEDIUM = registerKey("medium_hollow_hill"); + public static final ResourceKey HOLLOW_HILL_LARGE = registerKey("large_hollow_hill"); + public static final ResourceKey NAGA_COURTYARD = registerKey("naga_courtyard"); + public static final ResourceKey LICH_TOWER = registerKey("lich_tower"); + public static final ResourceKey LABYRINTH = registerKey("labyrinth"); + public static final ResourceKey HYDRA_LAIR = registerKey("hydra_lair"); + public static final ResourceKey KNIGHT_STRONGHOLD = registerKey("knight_stronghold"); + public static final ResourceKey DARK_TOWER = registerKey("dark_tower"); + public static final ResourceKey YETI_CAVE = registerKey("yeti_cave"); + public static final ResourceKey AURORA_PALACE = registerKey("aurora_palace"); + public static final ResourceKey TROLL_CAVE = registerKey("troll_cave"); + public static final ResourceKey FINAL_CASTLE = registerKey("final_castle"); + + public static ResourceKey registerKey(String name) { + return ResourceKey.create(Registries.STRUCTURE, TwilightForestMod.prefix(name)); + } + + @SuppressWarnings("deprecation") + public static void bootstrap(BootstapContext context) { + context.register(HEDGE_MAZE, HedgeMazeStructure.buildStructureConfig(context)); + context.register(QUEST_GROVE, QuestGroveStructure.buildStructureConfig(context)); + context.register(MUSHROOM_TOWER, MushroomTowerStructure.buildStructureConfig(context)); + context.register(HOLLOW_HILL_SMALL, HollowHillStructure.buildSmallHillConfig(context)); + context.register(HOLLOW_HILL_MEDIUM, HollowHillStructure.buildMediumHillConfig(context)); + context.register(HOLLOW_HILL_LARGE, HollowHillStructure.buildLargeHillConfig(context)); + context.register(NAGA_COURTYARD, NagaCourtyardStructure.buildStructureConfig(context)); + context.register(LICH_TOWER, LichTowerStructure.buildLichTowerConfig(context)); + context.register(LABYRINTH, LabyrinthStructure.buildLabyrinthConfig(context)); + context.register(HYDRA_LAIR, HydraLairStructure.buildHydraLairConfig(context)); + context.register(KNIGHT_STRONGHOLD, KnightStrongholdStructure.buildKnightStrongholdConfig(context)); + context.register(DARK_TOWER, DarkTowerStructure.buildDarkTowerConfig(context)); + context.register(YETI_CAVE, YetiCaveStructure.buildYetiCaveConfig(context)); + context.register(AURORA_PALACE, AuroraPalaceStructure.buildAuroraPalaceConfig(context)); + context.register(TROLL_CAVE, TrollCaveStructure.buildTrollCaveConfig(context)); + context.register(FINAL_CASTLE, FinalCastleStructure.buildFinalCastleConfig(context)); + } +} diff --git a/src/main/java/twilightforest/init/custom/BiomeLayerStack.java b/src/main/java/twilightforest/init/custom/BiomeLayerStack.java new file mode 100644 index 0000000000..5c909ba893 --- /dev/null +++ b/src/main/java/twilightforest/init/custom/BiomeLayerStack.java @@ -0,0 +1,132 @@ +package twilightforest.init.custom; + +import com.google.common.collect.ImmutableList; +import com.mojang.datafixers.util.Pair; +import com.mojang.serialization.Codec; +import net.minecraft.core.Holder; +import net.minecraft.core.Registry; +import net.minecraft.data.worldgen.BootstapContext; +import net.minecraft.resources.RegistryFileCodec; +import net.minecraft.resources.ResourceKey; +import net.minecraftforge.registries.DeferredRegister; +import twilightforest.TwilightForestMod; +import twilightforest.init.TFBiomes; +import twilightforest.world.components.layer.*; +import twilightforest.world.components.layer.vanillalegacy.BiomeLayerFactory; +import twilightforest.world.components.layer.vanillalegacy.BiomeLayerType; +import twilightforest.world.components.layer.vanillalegacy.SmoothLayer; +import twilightforest.world.components.layer.vanillalegacy.ZoomLayer; + +import java.util.List; + + +public class BiomeLayerStack { + public static final ResourceKey> BIOME_STACK_KEY = ResourceKey.createRegistryKey(TwilightForestMod.namedRegistry("biome_layer_stack")); + public static final DeferredRegister BIOME_LAYER_STACKS = DeferredRegister.create(BIOME_STACK_KEY, TwilightForestMod.ID); + public static final Codec DISPATCH_CODEC = BiomeLayerTypes.CODEC.dispatch("layer_type", BiomeLayerFactory::getType, BiomeLayerType::getCodec); + public static final Codec> HOLDER_CODEC = RegistryFileCodec.create(BiomeLayerStack.BIOME_STACK_KEY, BiomeLayerStack.DISPATCH_CODEC, true); + + public static final ResourceKey RANDOM_FOREST_BIOMES = registerKey("random_forest_biomes"); + public static final ResourceKey BIOMES_ALONG_STREAMS = registerKey("biomes_along_streams"); + + public static ResourceKey registerKey(String name) { + return ResourceKey.create(BIOME_STACK_KEY, TwilightForestMod.prefix(name)); + } + + public static void bootstrap(BootstapContext context) { + BiomeLayerFactory biomes = new RandomBiomeLayer.Factory(1L, 15, ImmutableList.of( + TFBiomes.FOREST, + TFBiomes.DENSE_FOREST, + TFBiomes.MUSHROOM_FOREST, + TFBiomes.OAK_SAVANNAH, + TFBiomes.FIREFLY_FOREST + ), ImmutableList.of( + TFBiomes.LAKE, + TFBiomes.DENSE_MUSHROOM_FOREST, + TFBiomes.ENCHANTED_FOREST, + TFBiomes.CLEARING, + TFBiomes.SPOOKY_FOREST + )); + + biomes = new KeyBiomesLayer.Factory(1000L, List.of(TFBiomes.GLACIER, TFBiomes.FIRE_SWAMP, TFBiomes.DARK_FOREST_CENTER, TFBiomes.FINAL_PLATEAU), Holder.direct(biomes)); + biomes = new CompanionBiomesLayer.Factory(1000L, List.of( + Pair.of(TFBiomes.FIRE_SWAMP, TFBiomes.SWAMP), + Pair.of(TFBiomes.GLACIER, TFBiomes.SNOWY_FOREST), + Pair.of(TFBiomes.DARK_FOREST_CENTER, TFBiomes.DARK_FOREST), + Pair.of(TFBiomes.FINAL_PLATEAU, TFBiomes.HIGHLANDS) + ), Holder.direct(biomes)); + + biomes = new ZoomLayer.Factory(1000L, false, Holder.direct(biomes)); + biomes = new ZoomLayer.Factory(1001L, false, Holder.direct(biomes)); + + biomes = new StabilizeLayer.Factory(700L, Holder.direct(biomes)); + + biomes = new BorderLayer.Factory(500L, TFBiomes.FINAL_PLATEAU, TFBiomes.THORNLANDS, Holder.direct(biomes)); + + biomes = new ZoomLayer.Factory(1002L, false, Holder.direct(biomes)); + biomes = new ZoomLayer.Factory(1003L, false, Holder.direct(biomes)); + biomes = new ZoomLayer.Factory(1004L, false, Holder.direct(biomes)); + biomes = new ZoomLayer.Factory(1005L, false, Holder.direct(biomes)); + + Holder.Reference randomBiomes = context.register(RANDOM_FOREST_BIOMES, biomes); + + BiomeLayerFactory riverLayer = new SeamLayer.Factory(1L, TFBiomes.STREAM, List.of(TFBiomes.LAKE, TFBiomes.THORNLANDS, TFBiomes.CLEARING, TFBiomes.OAK_SAVANNAH), List.of( + Pair.of(TFBiomes.SNOWY_FOREST, TFBiomes.GLACIER), + Pair.of(TFBiomes.MUSHROOM_FOREST, TFBiomes.DENSE_MUSHROOM_FOREST), + Pair.of(TFBiomes.SWAMP, TFBiomes.FIRE_SWAMP), + Pair.of(TFBiomes.DARK_FOREST, TFBiomes.DARK_FOREST_CENTER), + Pair.of(TFBiomes.HIGHLANDS, TFBiomes.FINAL_PLATEAU) + ), randomBiomes); + riverLayer = new SmoothLayer.Factory(7000L, Holder.direct(riverLayer)); + + context.register(BIOMES_ALONG_STREAMS, new FilteredBiomeLayer.Factory(100L, TFBiomes.STREAM, Holder.direct(riverLayer), randomBiomes)); + } + + @Deprecated // Needed for older worlds - It is otherwise literally same as above minus the registering + public static Holder buildDefault() { + BiomeLayerFactory biomes = new RandomBiomeLayer.Factory(1L, 15, ImmutableList.of( + TFBiomes.FOREST, + TFBiomes.DENSE_FOREST, + TFBiomes.MUSHROOM_FOREST, + TFBiomes.OAK_SAVANNAH, + TFBiomes.FIREFLY_FOREST + ), ImmutableList.of( + TFBiomes.LAKE, + TFBiomes.DENSE_MUSHROOM_FOREST, + TFBiomes.ENCHANTED_FOREST, + TFBiomes.CLEARING, + TFBiomes.SPOOKY_FOREST + )); + + biomes = new KeyBiomesLayer.Factory(1000L, List.of(TFBiomes.GLACIER, TFBiomes.FIRE_SWAMP, TFBiomes.DARK_FOREST_CENTER, TFBiomes.FINAL_PLATEAU), Holder.direct(biomes)); + biomes = new CompanionBiomesLayer.Factory(1000L, List.of( + Pair.of(TFBiomes.FIRE_SWAMP, TFBiomes.SWAMP), + Pair.of(TFBiomes.GLACIER, TFBiomes.SNOWY_FOREST), + Pair.of(TFBiomes.DARK_FOREST_CENTER, TFBiomes.DARK_FOREST), + Pair.of(TFBiomes.FINAL_PLATEAU, TFBiomes.HIGHLANDS) + ), Holder.direct(biomes)); + + biomes = new ZoomLayer.Factory(1000L, false, Holder.direct(biomes)); + biomes = new ZoomLayer.Factory(1001L, false, Holder.direct(biomes)); + + biomes = new StabilizeLayer.Factory(700L, Holder.direct(biomes)); + + biomes = new BorderLayer.Factory(500L, TFBiomes.FINAL_PLATEAU, TFBiomes.THORNLANDS, Holder.direct(biomes)); + + biomes = new ZoomLayer.Factory(1002L, false, Holder.direct(biomes)); + biomes = new ZoomLayer.Factory(1003L, false, Holder.direct(biomes)); + biomes = new ZoomLayer.Factory(1004L, false, Holder.direct(biomes)); + biomes = new ZoomLayer.Factory(1005L, false, Holder.direct(biomes)); + + BiomeLayerFactory riverLayer = new SeamLayer.Factory(1L, TFBiomes.STREAM, List.of(TFBiomes.LAKE, TFBiomes.THORNLANDS, TFBiomes.CLEARING, TFBiomes.OAK_SAVANNAH), List.of( + Pair.of(TFBiomes.SNOWY_FOREST, TFBiomes.GLACIER), + Pair.of(TFBiomes.MUSHROOM_FOREST, TFBiomes.DENSE_MUSHROOM_FOREST), + Pair.of(TFBiomes.SWAMP, TFBiomes.FIRE_SWAMP), + Pair.of(TFBiomes.DARK_FOREST, TFBiomes.DARK_FOREST_CENTER), + Pair.of(TFBiomes.HIGHLANDS, TFBiomes.FINAL_PLATEAU) + ), Holder.direct(biomes)); + riverLayer = new SmoothLayer.Factory(7000L, Holder.direct(riverLayer)); + + return Holder.direct(new FilteredBiomeLayer.Factory(100L, TFBiomes.STREAM, Holder.direct(riverLayer), Holder.direct(biomes))); + } +} diff --git a/src/main/java/twilightforest/init/custom/BiomeLayerTypes.java b/src/main/java/twilightforest/init/custom/BiomeLayerTypes.java new file mode 100644 index 0000000000..a3ca185ec5 --- /dev/null +++ b/src/main/java/twilightforest/init/custom/BiomeLayerTypes.java @@ -0,0 +1,39 @@ +package twilightforest.init.custom; + +import com.mojang.serialization.Codec; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceKey; +import net.minecraft.util.ExtraCodecs; +import net.minecraftforge.registries.DeferredRegister; +import net.minecraftforge.registries.IForgeRegistry; +import net.minecraftforge.registries.RegistryBuilder; +import net.minecraftforge.registries.RegistryObject; +import twilightforest.TwilightForestMod; +import twilightforest.world.components.layer.*; +import twilightforest.world.components.layer.vanillalegacy.BiomeLayerType; +import twilightforest.world.components.layer.vanillalegacy.SmoothLayer; +import twilightforest.world.components.layer.vanillalegacy.ZoomLayer; + +import java.util.function.Supplier; + +public class BiomeLayerTypes { + public static final ResourceKey> BIOME_LAYER_TYPE_KEY = ResourceKey.createRegistryKey(TwilightForestMod.namedRegistry("biome_layer_type")); + public static final DeferredRegister BIOME_LAYER_TYPES = DeferredRegister.create(BIOME_LAYER_TYPE_KEY, TwilightForestMod.ID); + public static final Supplier> REGISTRY = BIOME_LAYER_TYPES.makeRegistry(() -> new RegistryBuilder().allowModification().disableSync()); + public static final Codec CODEC = ExtraCodecs.lazyInitializedCodec(() -> REGISTRY.get().getCodec()); + + public static final RegistryObject RANDOM_BIOMES = registerType("random_biomes", () -> () -> RandomBiomeLayer.Factory.CODEC); + public static final RegistryObject KEY_BIOMES = registerType("key_biomes", () -> () -> KeyBiomesLayer.Factory.CODEC); + public static final RegistryObject COMPANION_BIOMES = registerType("companion_biomes", () -> () -> CompanionBiomesLayer.Factory.CODEC); + public static final RegistryObject ZOOM = registerType("zoom", () -> () -> ZoomLayer.Factory.CODEC); + public static final RegistryObject STABILIZE = registerType("stabilize", () -> () -> StabilizeLayer.Factory.CODEC); + public static final RegistryObject BORDER = registerType("border", () -> () -> BorderLayer.Factory.CODEC); + public static final RegistryObject SEAM = registerType("seam", () -> () -> SeamLayer.Factory.CODEC); + public static final RegistryObject SMOOTH = registerType("smooth", () -> () -> SmoothLayer.Factory.CODEC); + public static final RegistryObject FILTERED = registerType("filtered", () -> () -> FilteredBiomeLayer.Factory.CODEC); + public static final RegistryObject MEDIAN = registerType("median", () -> () -> MedianLayer.Factory.CODEC); + + private static RegistryObject registerType(String name, Supplier factory) { + return BIOME_LAYER_TYPES.register(name, factory); + } +} diff --git a/src/main/java/twilightforest/init/custom/DwarfRabbitVariant.java b/src/main/java/twilightforest/init/custom/DwarfRabbitVariant.java new file mode 100644 index 0000000000..d7379eb419 --- /dev/null +++ b/src/main/java/twilightforest/init/custom/DwarfRabbitVariant.java @@ -0,0 +1,38 @@ +package twilightforest.init.custom; + +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.RandomSource; +import net.minecraftforge.registries.DeferredRegister; +import net.minecraftforge.registries.IForgeRegistry; +import net.minecraftforge.registries.RegistryBuilder; +import net.minecraftforge.registries.RegistryObject; +import twilightforest.TwilightForestMod; + +import java.util.Objects; +import java.util.Optional; +import java.util.function.Supplier; + +public record DwarfRabbitVariant(ResourceLocation texture) { + + public static final ResourceKey> DWARF_RABBIT_TYPE_KEY = ResourceKey.createRegistryKey(TwilightForestMod.prefix("dwarf_rabbit_variant")); + public static final DeferredRegister DWARF_RABBITS = DeferredRegister.create(DWARF_RABBIT_TYPE_KEY, TwilightForestMod.ID); + public static final Supplier> DWARF_RABBIT_REGISTRY = DWARF_RABBITS.makeRegistry(RegistryBuilder::new); + + public static final RegistryObject BROWN = DWARF_RABBITS.register("brown", () -> new DwarfRabbitVariant(TwilightForestMod.getModelTexture("bunnybrown.png"))); + public static final RegistryObject DUTCH = DWARF_RABBITS.register("dutch", () -> new DwarfRabbitVariant(TwilightForestMod.getModelTexture("bunnydutch.png"))); + public static final RegistryObject WHITE = DWARF_RABBITS.register("white", () -> new DwarfRabbitVariant(TwilightForestMod.getModelTexture("bunnywhite.png"))); + + public static DwarfRabbitVariant getRandomVariant(RandomSource random) { + return DwarfRabbitVariant.DWARF_RABBIT_REGISTRY.get().getValues().toArray(DwarfRabbitVariant[]::new)[random.nextInt(DwarfRabbitVariant.DWARF_RABBIT_REGISTRY.get().getValues().size())]; + } + + public static Optional getVariant(String id) { + return Optional.ofNullable(DWARF_RABBIT_REGISTRY.get().getValue(new ResourceLocation(id))); + } + + public static String getVariantId(DwarfRabbitVariant variant) { + return Objects.requireNonNull(DWARF_RABBIT_REGISTRY.get().getKey(variant)).toString(); + } +} diff --git a/src/main/java/twilightforest/init/custom/TinyBirdVariant.java b/src/main/java/twilightforest/init/custom/TinyBirdVariant.java new file mode 100644 index 0000000000..ac2710d665 --- /dev/null +++ b/src/main/java/twilightforest/init/custom/TinyBirdVariant.java @@ -0,0 +1,38 @@ +package twilightforest.init.custom; + +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.RandomSource; +import net.minecraftforge.registries.DeferredRegister; +import net.minecraftforge.registries.IForgeRegistry; +import net.minecraftforge.registries.RegistryBuilder; +import net.minecraftforge.registries.RegistryObject; +import twilightforest.TwilightForestMod; + +import java.util.Objects; +import java.util.Optional; +import java.util.function.Supplier; + +public record TinyBirdVariant(ResourceLocation texture) { + public static final ResourceKey> TINY_BIRD_TYPE_KEY = ResourceKey.createRegistryKey(TwilightForestMod.prefix("tiny_bird_variant")); + public static final DeferredRegister TINY_BIRDS = DeferredRegister.create(TINY_BIRD_TYPE_KEY, TwilightForestMod.ID); + public static final Supplier> TINY_BIRD_REGISTRY = TINY_BIRDS.makeRegistry(RegistryBuilder::new); + + public static final RegistryObject BLUE = TINY_BIRDS.register("blue", () -> new TinyBirdVariant(TwilightForestMod.getModelTexture("tinybirdblue.png"))); + public static final RegistryObject BROWN = TINY_BIRDS.register("brown", () -> new TinyBirdVariant(TwilightForestMod.getModelTexture("tinybirdbrown.png"))); + public static final RegistryObject GOLD = TINY_BIRDS.register("gold", () -> new TinyBirdVariant(TwilightForestMod.getModelTexture("tinybirdgold.png"))); + public static final RegistryObject RED = TINY_BIRDS.register("red", () -> new TinyBirdVariant(TwilightForestMod.getModelTexture("tinybirdred.png"))); + + public static TinyBirdVariant getRandomVariant(RandomSource random) { + return TINY_BIRD_REGISTRY.get().getValues().toArray(TinyBirdVariant[]::new)[random.nextInt(TINY_BIRD_REGISTRY.get().getValues().size())]; + } + + public static Optional getVariant(String id) { + return Optional.ofNullable(TINY_BIRD_REGISTRY.get().getValue(new ResourceLocation(id))); + } + + public static String getVariantId(TinyBirdVariant variant) { + return Objects.requireNonNull(TINY_BIRD_REGISTRY.get().getKey(variant)).toString(); + } +} diff --git a/src/main/java/twilightforest/init/custom/WoodPalettes.java b/src/main/java/twilightforest/init/custom/WoodPalettes.java new file mode 100644 index 0000000000..9b74ba2755 --- /dev/null +++ b/src/main/java/twilightforest/init/custom/WoodPalettes.java @@ -0,0 +1,70 @@ +package twilightforest.init.custom; + +import com.mojang.serialization.Codec; +import net.minecraft.core.Holder; +import net.minecraft.core.Registry; +import net.minecraft.data.worldgen.BootstapContext; +import net.minecraft.resources.RegistryFileCodec; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.Blocks; +import net.minecraftforge.registries.DeferredRegister; +import twilightforest.TwilightForestMod; +import twilightforest.init.TFBlocks; +import twilightforest.util.WoodPalette; + +import java.util.Locale; + +public class WoodPalettes { + public static final ResourceKey> WOOD_PALETTE_TYPE_KEY = ResourceKey.createRegistryKey(TwilightForestMod.namedRegistry("wood_palettes")); + public static final DeferredRegister WOOD_PALETTES = DeferredRegister.create(WOOD_PALETTE_TYPE_KEY, TwilightForestMod.ID); + public static final Codec> CODEC = RegistryFileCodec.create(WoodPalettes.WOOD_PALETTE_TYPE_KEY, WoodPalette.CODEC, false); + + public static final ResourceKey OAK = makeKey(new ResourceLocation("oak")); + public static final ResourceKey SPRUCE = makeKey(new ResourceLocation("spruce")); + public static final ResourceKey BIRCH = makeKey(new ResourceLocation("birch")); + public static final ResourceKey JUNGLE = makeKey(new ResourceLocation("jungle")); + public static final ResourceKey ACACIA = makeKey(new ResourceLocation("acacia")); + public static final ResourceKey DARK_OAK = makeKey(new ResourceLocation("dark_oak")); + public static final ResourceKey CRIMSON = makeKey(new ResourceLocation("crimson")); + public static final ResourceKey WARPED = makeKey(new ResourceLocation("warped")); + public static final ResourceKey VANGROVE = makeKey(new ResourceLocation("mangrove")); + + public static final ResourceKey TWILIGHT_OAK = makeKey("twilight_oak"); + public static final ResourceKey CANOPY = makeKey("canopy"); + public static final ResourceKey MANGROVE = makeKey("mangrove"); + public static final ResourceKey DARKWOOD = makeKey("darkwood"); + public static final ResourceKey TIMEWOOD = makeKey("timewood"); + public static final ResourceKey TRANSWOOD = makeKey("transwood"); + public static final ResourceKey MINEWOOD = makeKey("minewood"); + public static final ResourceKey SORTWOOD = makeKey("sortwood"); + + private static ResourceKey makeKey(String name) { + return makeKey(TwilightForestMod.prefix(name.toLowerCase(Locale.ROOT))); + } + + private static ResourceKey makeKey(ResourceLocation name) { + return ResourceKey.create(WOOD_PALETTE_TYPE_KEY, name); + } + + public static void bootstrap(BootstapContext context) { + context.register(OAK, new WoodPalette(Blocks.OAK_PLANKS, Blocks.OAK_STAIRS, Blocks.OAK_SLAB, Blocks.OAK_BUTTON, Blocks.OAK_FENCE, Blocks.OAK_FENCE_GATE, Blocks.OAK_PRESSURE_PLATE, TFBlocks.OAK_BANISTER.get())); + context.register(SPRUCE, new WoodPalette(Blocks.SPRUCE_PLANKS, Blocks.SPRUCE_STAIRS, Blocks.SPRUCE_SLAB, Blocks.SPRUCE_BUTTON, Blocks.SPRUCE_FENCE, Blocks.SPRUCE_FENCE_GATE, Blocks.SPRUCE_PRESSURE_PLATE, TFBlocks.SPRUCE_BANISTER.get())); + context.register(BIRCH, new WoodPalette(Blocks.BIRCH_PLANKS, Blocks.BIRCH_STAIRS, Blocks.BIRCH_SLAB, Blocks.BIRCH_BUTTON, Blocks.BIRCH_FENCE, Blocks.BIRCH_FENCE_GATE, Blocks.BIRCH_PRESSURE_PLATE, TFBlocks.BIRCH_BANISTER.get())); + context.register(JUNGLE, new WoodPalette(Blocks.JUNGLE_PLANKS, Blocks.JUNGLE_STAIRS, Blocks.JUNGLE_SLAB, Blocks.JUNGLE_BUTTON, Blocks.JUNGLE_FENCE, Blocks.JUNGLE_FENCE_GATE, Blocks.JUNGLE_PRESSURE_PLATE, TFBlocks.JUNGLE_BANISTER.get())); + context.register(ACACIA, new WoodPalette(Blocks.ACACIA_PLANKS, Blocks.ACACIA_STAIRS, Blocks.ACACIA_SLAB, Blocks.ACACIA_BUTTON, Blocks.ACACIA_FENCE, Blocks.ACACIA_FENCE_GATE, Blocks.ACACIA_PRESSURE_PLATE, TFBlocks.ACACIA_BANISTER.get())); + context.register(DARK_OAK, new WoodPalette(Blocks.DARK_OAK_PLANKS, Blocks.DARK_OAK_STAIRS, Blocks.DARK_OAK_SLAB, Blocks.DARK_OAK_BUTTON, Blocks.DARK_OAK_FENCE, Blocks.DARK_OAK_FENCE_GATE, Blocks.DARK_OAK_PRESSURE_PLATE, TFBlocks.DARK_OAK_BANISTER.get())); + context.register(CRIMSON, new WoodPalette(Blocks.CRIMSON_PLANKS, Blocks.CRIMSON_STAIRS, Blocks.CRIMSON_SLAB, Blocks.CRIMSON_BUTTON, Blocks.CRIMSON_FENCE, Blocks.CRIMSON_FENCE_GATE, Blocks.CRIMSON_PRESSURE_PLATE, TFBlocks.CRIMSON_BANISTER.get())); + context.register(WARPED, new WoodPalette(Blocks.WARPED_PLANKS, Blocks.WARPED_STAIRS, Blocks.WARPED_SLAB, Blocks.WARPED_BUTTON, Blocks.WARPED_FENCE, Blocks.WARPED_FENCE_GATE, Blocks.WARPED_PRESSURE_PLATE, TFBlocks.WARPED_BANISTER.get())); + context.register(VANGROVE, new WoodPalette(Blocks.MANGROVE_PLANKS, Blocks.MANGROVE_STAIRS, Blocks.MANGROVE_SLAB, Blocks.MANGROVE_BUTTON, Blocks.MANGROVE_FENCE, Blocks.MANGROVE_FENCE_GATE, Blocks.MANGROVE_PRESSURE_PLATE, TFBlocks.VANGROVE_BANISTER.get())); + + context.register(TWILIGHT_OAK, new WoodPalette(TFBlocks.TWILIGHT_OAK_PLANKS, TFBlocks.TWILIGHT_OAK_STAIRS, TFBlocks.TWILIGHT_OAK_SLAB, TFBlocks.TWILIGHT_OAK_BUTTON, TFBlocks.TWILIGHT_OAK_FENCE, TFBlocks.TWILIGHT_OAK_GATE, TFBlocks.TWILIGHT_OAK_PLATE, TFBlocks.TWILIGHT_OAK_BANISTER)); + context.register(CANOPY, new WoodPalette(TFBlocks.CANOPY_PLANKS, TFBlocks.CANOPY_STAIRS, TFBlocks.CANOPY_SLAB, TFBlocks.CANOPY_BUTTON, TFBlocks.CANOPY_FENCE, TFBlocks.CANOPY_GATE, TFBlocks.CANOPY_PLATE, TFBlocks.CANOPY_BANISTER)); + context.register(MANGROVE, new WoodPalette(TFBlocks.MANGROVE_PLANKS, TFBlocks.MANGROVE_STAIRS, TFBlocks.MANGROVE_SLAB, TFBlocks.MANGROVE_BUTTON, TFBlocks.MANGROVE_FENCE, TFBlocks.MANGROVE_GATE, TFBlocks.MANGROVE_PLATE, TFBlocks.MANGROVE_BANISTER)); + context.register(DARKWOOD, new WoodPalette(TFBlocks.DARK_PLANKS, TFBlocks.DARK_STAIRS, TFBlocks.DARK_SLAB, TFBlocks.DARK_BUTTON, TFBlocks.DARK_FENCE, TFBlocks.DARK_GATE, TFBlocks.DARK_PLATE, TFBlocks.DARK_BANISTER)); + context.register(TIMEWOOD, new WoodPalette(TFBlocks.TIME_PLANKS, TFBlocks.TIME_STAIRS, TFBlocks.TIME_SLAB, TFBlocks.TIME_BUTTON, TFBlocks.TIME_FENCE, TFBlocks.TIME_GATE, TFBlocks.TIME_PLATE, TFBlocks.TIME_BANISTER)); + context.register(TRANSWOOD, new WoodPalette(TFBlocks.TRANSFORMATION_PLANKS, TFBlocks.TRANSFORMATION_STAIRS, TFBlocks.TRANSFORMATION_SLAB, TFBlocks.TRANSFORMATION_BUTTON, TFBlocks.TRANSFORMATION_FENCE, TFBlocks.TRANSFORMATION_GATE, TFBlocks.TRANSFORMATION_PLATE, TFBlocks.TRANSFORMATION_BANISTER)); + context.register(MINEWOOD, new WoodPalette(TFBlocks.MINING_PLANKS, TFBlocks.MINING_STAIRS, TFBlocks.MINING_SLAB, TFBlocks.MINING_BUTTON, TFBlocks.MINING_FENCE, TFBlocks.MINING_GATE, TFBlocks.MINING_PLATE, TFBlocks.MINING_BANISTER)); + context.register(SORTWOOD, new WoodPalette(TFBlocks.SORTING_PLANKS, TFBlocks.SORTING_STAIRS, TFBlocks.SORTING_SLAB, TFBlocks.SORTING_BUTTON, TFBlocks.SORTING_FENCE, TFBlocks.SORTING_GATE, TFBlocks.SORTING_PLATE, TFBlocks.SORTING_BANISTER)); + } +} diff --git a/src/main/java/twilightforest/init/package-info.java b/src/main/java/twilightforest/init/package-info.java new file mode 100644 index 0000000000..70b3d88646 --- /dev/null +++ b/src/main/java/twilightforest/init/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.init; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/inventory/ContainerTFCinderFurnace.java b/src/main/java/twilightforest/inventory/ContainerTFCinderFurnace.java deleted file mode 100644 index aff42cbc71..0000000000 --- a/src/main/java/twilightforest/inventory/ContainerTFCinderFurnace.java +++ /dev/null @@ -1,188 +0,0 @@ -package twilightforest.inventory; - -import twilightforest.tileentity.TileEntityTFCinderFurnace; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.InventoryPlayer; -import net.minecraft.inventory.Container; -import net.minecraft.inventory.ICrafting; -import net.minecraft.inventory.Slot; -import net.minecraft.inventory.SlotFurnace; -import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.FurnaceRecipes; -import net.minecraft.tileentity.TileEntityFurnace; -import net.minecraft.world.World; - -public class ContainerTFCinderFurnace extends Container -{ - private TileEntityTFCinderFurnace tileFurnace; - private int lastCookTime; - private int lastBurnTime; - private int lastItemBurnTime; - - public ContainerTFCinderFurnace(InventoryPlayer inventory, World world, int x, int y, int z) { - this(inventory, (TileEntityTFCinderFurnace)world.getTileEntity(x, y, z)); - } - - public ContainerTFCinderFurnace(InventoryPlayer p_i1812_1_, TileEntityTFCinderFurnace p_i1812_2_) - { - this.tileFurnace = p_i1812_2_; - this.addSlotToContainer(new Slot(p_i1812_2_, 0, 56, 17)); - this.addSlotToContainer(new Slot(p_i1812_2_, 1, 56, 53)); - this.addSlotToContainer(new SlotFurnace(p_i1812_1_.player, p_i1812_2_, 2, 116, 35)); - int i; - - for (i = 0; i < 3; ++i) - { - for (int j = 0; j < 9; ++j) - { - this.addSlotToContainer(new Slot(p_i1812_1_, j + i * 9 + 9, 8 + j * 18, 84 + i * 18)); - } - } - - for (i = 0; i < 9; ++i) - { - this.addSlotToContainer(new Slot(p_i1812_1_, i, 8 + i * 18, 142)); - } - } - - public void addCraftingToCrafters(ICrafting p_75132_1_) - { - super.addCraftingToCrafters(p_75132_1_); - p_75132_1_.sendProgressBarUpdate(this, 0, this.tileFurnace.furnaceCookTime); - p_75132_1_.sendProgressBarUpdate(this, 1, this.tileFurnace.furnaceBurnTime); - p_75132_1_.sendProgressBarUpdate(this, 2, this.tileFurnace.currentItemBurnTime); - } - - /** - * Looks for changes made in the container, sends them to every listener. - */ - public void detectAndSendChanges() - { - super.detectAndSendChanges(); - - for (int i = 0; i < this.crafters.size(); ++i) - { - ICrafting icrafting = (ICrafting)this.crafters.get(i); - - if (this.lastCookTime != this.tileFurnace.furnaceCookTime) - { - icrafting.sendProgressBarUpdate(this, 0, this.tileFurnace.furnaceCookTime); - } - - if (this.lastBurnTime != this.tileFurnace.furnaceBurnTime) - { - icrafting.sendProgressBarUpdate(this, 1, this.tileFurnace.furnaceBurnTime); - } - - if (this.lastItemBurnTime != this.tileFurnace.currentItemBurnTime) - { - icrafting.sendProgressBarUpdate(this, 2, this.tileFurnace.currentItemBurnTime); - } - } - - this.lastCookTime = this.tileFurnace.furnaceCookTime; - this.lastBurnTime = this.tileFurnace.furnaceBurnTime; - this.lastItemBurnTime = this.tileFurnace.currentItemBurnTime; - } - - @SideOnly(Side.CLIENT) - public void updateProgressBar(int p_75137_1_, int p_75137_2_) - { - if (p_75137_1_ == 0) - { - this.tileFurnace.furnaceCookTime = p_75137_2_; - } - - if (p_75137_1_ == 1) - { - this.tileFurnace.furnaceBurnTime = p_75137_2_; - } - - if (p_75137_1_ == 2) - { - this.tileFurnace.currentItemBurnTime = p_75137_2_; - } - } - - public boolean canInteractWith(EntityPlayer p_75145_1_) - { - return this.tileFurnace.isUseableByPlayer(p_75145_1_); - } - - /** - * Called when a player shift-clicks on a slot. You must override this or you will crash when someone does that. - */ - public ItemStack transferStackInSlot(EntityPlayer p_82846_1_, int p_82846_2_) - { - ItemStack itemstack = null; - Slot slot = (Slot)this.inventorySlots.get(p_82846_2_); - - if (slot != null && slot.getHasStack()) - { - ItemStack itemstack1 = slot.getStack(); - itemstack = itemstack1.copy(); - - if (p_82846_2_ == 2) - { - if (!this.mergeItemStack(itemstack1, 3, 39, true)) - { - return null; - } - - slot.onSlotChange(itemstack1, itemstack); - } - else if (p_82846_2_ != 1 && p_82846_2_ != 0) - { - if (FurnaceRecipes.smelting().getSmeltingResult(itemstack1) != null) - { - if (!this.mergeItemStack(itemstack1, 0, 1, false)) - { - return null; - } - } - else if (TileEntityFurnace.isItemFuel(itemstack1)) - { - if (!this.mergeItemStack(itemstack1, 1, 2, false)) - { - return null; - } - } - else if (p_82846_2_ >= 3 && p_82846_2_ < 30) - { - if (!this.mergeItemStack(itemstack1, 30, 39, false)) - { - return null; - } - } - else if (p_82846_2_ >= 30 && p_82846_2_ < 39 && !this.mergeItemStack(itemstack1, 3, 30, false)) - { - return null; - } - } - else if (!this.mergeItemStack(itemstack1, 3, 39, false)) - { - return null; - } - - if (itemstack1.stackSize == 0) - { - slot.putStack((ItemStack)null); - } - else - { - slot.onSlotChanged(); - } - - if (itemstack1.stackSize == itemstack.stackSize) - { - return null; - } - - slot.onPickupFromSlot(p_82846_1_, itemstack1); - } - - return itemstack; - } -} \ No newline at end of file diff --git a/src/main/java/twilightforest/inventory/ContainerTFUncrafting.java b/src/main/java/twilightforest/inventory/ContainerTFUncrafting.java deleted file mode 100644 index f4f922dbd0..0000000000 --- a/src/main/java/twilightforest/inventory/ContainerTFUncrafting.java +++ /dev/null @@ -1,869 +0,0 @@ -package twilightforest.inventory; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import net.minecraft.enchantment.Enchantment; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.InventoryPlayer; -import net.minecraft.init.Items; -import net.minecraft.inventory.Container; -import net.minecraft.inventory.IInventory; -import net.minecraft.inventory.InventoryCraftResult; -import net.minecraft.inventory.InventoryCrafting; -import net.minecraft.inventory.Slot; -import net.minecraft.item.ItemArmor; -import net.minecraft.item.ItemAxe; -import net.minecraft.item.ItemBow; -import net.minecraft.item.ItemHoe; -import net.minecraft.item.ItemPickaxe; -import net.minecraft.item.ItemSpade; -import net.minecraft.item.ItemStack; -import net.minecraft.item.ItemSword; -import net.minecraft.item.crafting.CraftingManager; -import net.minecraft.item.crafting.IRecipe; -import net.minecraft.item.crafting.ShapedRecipes; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.world.World; -import net.minecraftforge.oredict.ShapedOreRecipe; -import twilightforest.TwilightForestMod; -import cpw.mods.fml.common.ObfuscationReflectionHelper; - - - -public class ContainerTFUncrafting extends Container { - - /** The crafting matrix inventory (3x3). */ - public InventoryTFGoblinUncrafting uncraftingMatrix = new InventoryTFGoblinUncrafting(this); - public InventoryCrafting assemblyMatrix = new InventoryCrafting(this, 3, 3); - public InventoryCrafting combineMatrix = new InventoryCrafting(this, 3, 3); - public IInventory tinkerInput = new InventoryTFGoblinInput(this); - public IInventory tinkerResult = new InventoryCraftResult(); - private World worldObj; - - public ContainerTFUncrafting(InventoryPlayer inventory, World world, int x, int y, int z) { - this.worldObj = world; - this.addSlotToContainer(new Slot(this.tinkerInput, 0, 13, 35)); - this.addSlotToContainer(new SlotTFGoblinCraftResult(inventory.player, this.tinkerInput, this.uncraftingMatrix, this.assemblyMatrix, this.tinkerResult, 0, 147, 35)); - - int invX; - int invY; - - for (invX = 0; invX < 3; ++invX) - { - for (invY = 0; invY < 3; ++invY) - { - this.addSlotToContainer(new SlotTFGoblinUncrafting(inventory.player, this.tinkerInput, this.uncraftingMatrix, this.assemblyMatrix, invY + invX * 3, 300000 + invY * 18, 17 + invX * 18)); - } - } - for (invX = 0; invX < 3; ++invX) - { - for (invY = 0; invY < 3; ++invY) - { - this.addSlotToContainer(new SlotTFGoblinAssembly(inventory.player, this.tinkerInput, this.assemblyMatrix, this.uncraftingMatrix, invY + invX * 3, 62 + invY * 18, 17 + invX * 18)); - } - } - - for (invX = 0; invX < 3; ++invX) - { - for (invY = 0; invY < 9; ++invY) - { - this.addSlotToContainer(new Slot(inventory, invY + invX * 9 + 9, 8 + invY * 18, 84 + invX * 18)); - } - } - - for (invX = 0; invX < 9; ++invX) - { - this.addSlotToContainer(new Slot(inventory, invX, 8 + invX * 18, 142)); - } - - this.onCraftMatrixChanged(this.assemblyMatrix); - } - - /** - * Callback for when the crafting matrix is changed. - */ - @SuppressWarnings("rawtypes") - @Override - public void onCraftMatrixChanged(IInventory par1IInventory) - { - // we need to see what inventory is calling this, and update appropriately - if (par1IInventory == this.tinkerInput) { - // see if there is a recipe for the input - ItemStack inputStack = tinkerInput.getStackInSlot(0); - IRecipe recipe = getRecipeFor(inputStack); - - if (recipe != null) { - int recipeWidth = getRecipeWidth(recipe); - int recipeHeight = getRecipeHeight(recipe); - ItemStack[] recipeItems = getRecipeItems(recipe); - - // empty whole grid to start with - // let's not get leftovers if something changes like the recipe size - for (int i = 0; i < this.uncraftingMatrix.getSizeInventory(); i++) - { - this.uncraftingMatrix.setInventorySlotContents(i, null); - } - - // set uncrafting grid - for (int invY = 0; invY < recipeHeight; invY++) { - for (int invX = 0; invX < recipeWidth; invX++) { - ItemStack ingredient = ItemStack.copyItemStack(recipeItems[invX + invY * recipeWidth]); - // fix weird recipe for diamond/ingot blocks - if (ingredient != null && ingredient.stackSize > 1) - { - ingredient.stackSize = 1; - } - if (ingredient != null && (ingredient.getItemDamageForDisplay() == -1 || ingredient.getItemDamageForDisplay() == Short.MAX_VALUE)) - { - ingredient.setItemDamage(0); - } - this.uncraftingMatrix.setInventorySlotContents(invX + invY * 3, ingredient); - } - } - - // mark the appropriate number of components damaged - if (inputStack.isItemDamaged()) { - int damagedParts = countDamagedParts(inputStack); - - for (int i = 0; i < 9 && damagedParts > 0; i++) { - if (isDamageableComponent(this.uncraftingMatrix.getStackInSlot(i))) { - this.uncraftingMatrix.getStackInSlot(i).stackSize = 0; - damagedParts--; - } - } - } - - // mark banned items damaged - for (int i = 0; i < 9; i++) - { - ItemStack ingredient = this.uncraftingMatrix.getStackInSlot(i); - - if (isIngredientProblematic(ingredient)) - { - ingredient.stackSize = 0; - } - } - - // store number of items this recipe produces (and thus how many input items are required for uncrafting) - this.uncraftingMatrix.numberOfInputItems = recipe.getRecipeOutput().stackSize; - this.uncraftingMatrix.uncraftingCost = calculateUncraftingCost(); - this.uncraftingMatrix.recraftingCost = 0; - } - else { - //System.out.println("Could not find a recipe for input " + this.tinkerInput.getStackInSlot(0)); - - for (int i = 0; i < 9; i++) { - this.uncraftingMatrix.setInventorySlotContents(i, null); - } - this.uncraftingMatrix.numberOfInputItems = 0; - this.uncraftingMatrix.uncraftingCost = 0; - } - } - - if (par1IInventory == this.assemblyMatrix || par1IInventory == this.tinkerInput) { - if (isMatrixEmpty(this.tinkerInput)) { - // display the output - this.tinkerResult.setInventorySlotContents(0, CraftingManager.getInstance().findMatchingRecipe(this.assemblyMatrix, this.worldObj)); - this.uncraftingMatrix.recraftingCost = 0; - } - else { -// if (isMatrixEmpty(this.assemblyMatrix)) { -// // we just emptied the assembly matrix and need to re-prepare for uncrafting -// this.tinkerResult.setInventorySlotContents(0, null); -// this.uncraftingMatrix.uncraftingCost = calculateUncraftingCost(); -// this.uncraftingMatrix.recraftingCost = 0; -// } -// else { - // we placed an item in the assembly matrix, the next step will re-initialize these with correct values - this.tinkerResult.setInventorySlotContents(0, null); - this.uncraftingMatrix.uncraftingCost = calculateUncraftingCost(); - this.uncraftingMatrix.recraftingCost = 0; -// } - } - } - - // repairing / recrafting: if there is an input item, and items in both grids, can we combine them to produce an output item that is the same type as the input item? - if (par1IInventory != this.combineMatrix && !isMatrixEmpty(this.uncraftingMatrix) && !isMatrixEmpty(this.assemblyMatrix)) { - // combine the two matrixen - for (int i = 0; i < 9; i++) { - if (this.assemblyMatrix.getStackInSlot(i) != null) { - this.combineMatrix.setInventorySlotContents(i, this.assemblyMatrix.getStackInSlot(i)); - } - else if (this.uncraftingMatrix.getStackInSlot(i) != null && this.uncraftingMatrix.getStackInSlot(i).stackSize > 0) { - this.combineMatrix.setInventorySlotContents(i, this.uncraftingMatrix.getStackInSlot(i)); - } - else { - this.combineMatrix.setInventorySlotContents(i, null); - } - } - // is there a result from this combined thing? - ItemStack result = CraftingManager.getInstance().findMatchingRecipe(this.combineMatrix, this.worldObj); - ItemStack input = this.tinkerInput.getStackInSlot(0); - - if (result != null && isValidMatchForInput(input, result)) { - // copy the tag compound - // or should we only copy enchantments? - NBTTagCompound inputTags = input.getTagCompound(); - if (inputTags != null) - { - inputTags = (NBTTagCompound) inputTags.copy(); - } - - // if the result has innate enchantments, add them on to our enchantment map - Map resultInnateEnchantments = null; - if (result.isItemEnchanted()) - { - resultInnateEnchantments = EnchantmentHelper.getEnchantments(result); - } - - // check if the input enchantments can even go onto the result item - Map inputEnchantments = null; - if (input.isItemEnchanted()) - { - inputEnchantments = EnchantmentHelper.getEnchantments(input); - for (Object key : inputEnchantments.keySet()) - { - int enchID = ((Integer)key).intValue(); - //int level = ((Integer)inputEnchantments.get(key)).intValue(); - Enchantment ench = Enchantment.enchantmentsList[enchID]; - - // remove enchantments that won't work - if (!ench.canApply(result)) - { - inputEnchantments.remove(key); - } - } - } - - if (inputTags != null) { - // remove enchantments, copy tags, re-add filtered enchantments - inputTags.removeTag("ench"); - result.setTagCompound((NBTTagCompound) inputTags.copy()); - if (inputEnchantments != null) - { - EnchantmentHelper.setEnchantments(inputEnchantments, result); - } - } - - - this.tinkerResult.setInventorySlotContents(0, result); - this.uncraftingMatrix.uncraftingCost = 0; - this.uncraftingMatrix.recraftingCost = calculateRecraftingCost(); - - // if there is a recrafting cost, increment the repair cost of the output - if (this.uncraftingMatrix.recraftingCost > 0 && !result.hasDisplayName()) - { - result.setRepairCost(input.getRepairCost() + 2); - } - - // finally, add any innate enchantments back onto the result - if (resultInnateEnchantments != null && resultInnateEnchantments.size() > 0) - { - for (Object key : resultInnateEnchantments.keySet()) - { - int enchID = ((Integer)key).intValue(); - int level = ((Integer)resultInnateEnchantments.get(key)).intValue(); - Enchantment ench = Enchantment.enchantmentsList[enchID]; - - if (EnchantmentHelper.getEnchantmentLevel(enchID, result) > level) - { - level = EnchantmentHelper.getEnchantmentLevel(enchID, result); - } - - if (EnchantmentHelper.getEnchantmentLevel(enchID, result) < level) - { - result.addEnchantment(ench, level); - } - } - } - } - } - } - - /** - * Problematic ingredients are not allowed to be uncrafted in the uncrafting table. - */ - protected boolean isIngredientProblematic(ItemStack ingredient) { - return ingredient != null && (ingredient.getItem().hasContainerItem(ingredient) || ingredient.getUnlocalizedName().contains("itemMatter")); - } - - /** - * Get the first valid shaped recipe for the item in the input - * - * @param inputStack - * @return - */ - @SuppressWarnings("unchecked") - public IRecipe getRecipeFor(ItemStack inputStack) { - if (inputStack != null) { - for (IRecipe recipe : (List)(CraftingManager.getInstance().getRecipeList())) { - if ((recipe instanceof ShapedRecipes || recipe instanceof ShapedOreRecipe) - && recipe.getRecipeOutput().getItem() == inputStack.getItem() && inputStack.stackSize >= recipe.getRecipeOutput().stackSize - && (!recipe.getRecipeOutput().getHasSubtypes() || recipe.getRecipeOutput().getItemDamage() == inputStack.getItemDamage())) { - return recipe; - } - } - } - return null; - } - - /** - * Checks if the result is a valid match for the input. Currently only accepts armor or tools that are the same type as the input - * - * @param resultStack - */ - public boolean isValidMatchForInput(ItemStack inputStack, ItemStack resultStack) { - if (inputStack.getItem() instanceof ItemPickaxe && resultStack.getItem() instanceof ItemPickaxe) { - return true; - } - if (inputStack.getItem() instanceof ItemAxe && resultStack.getItem() instanceof ItemAxe) { - return true; - } - if (inputStack.getItem() instanceof ItemSpade && resultStack.getItem() instanceof ItemSpade) { - return true; - } - if (inputStack.getItem() instanceof ItemHoe && resultStack.getItem() instanceof ItemHoe) { - return true; - } - if (inputStack.getItem() instanceof ItemSword && resultStack.getItem() instanceof ItemSword) { - return true; - } - if (inputStack.getItem() instanceof ItemBow && resultStack.getItem() instanceof ItemBow) { - return true; - } - - if (inputStack.getItem() instanceof ItemArmor && resultStack.getItem() instanceof ItemArmor) { - ItemArmor inputArmor = (ItemArmor)inputStack.getItem(); - ItemArmor resultArmor = (ItemArmor)resultStack.getItem(); - - return inputArmor.armorType == resultArmor.armorType; - } - - // nope! - return false; - } - - public int getUncraftingCost() { - return this.uncraftingMatrix.uncraftingCost; - } - - public int getRecraftingCost() { - return this.uncraftingMatrix.recraftingCost; - } - - - /** - * Calculate the cost of uncrafting, if any. Return 0 if uncrafting is not available at this time - * - * @return - */ - public int calculateUncraftingCost() { - // we don't want to display anything if there is anything in the assembly grid - if (!isMatrixEmpty(this.assemblyMatrix)) { - return 0; - } - else { - return countDamageableParts(this.uncraftingMatrix); - } - } - - - /** - * Return the cost of recrafting, if any. Return 0 if recrafting is not available at this time - * - * @return - */ - public int calculateRecraftingCost() { - if (tinkerInput.getStackInSlot(0) == null || !tinkerInput.getStackInSlot(0).isItemEnchanted() || tinkerResult.getStackInSlot(0) == null) { - return 0; - } - else { - // okay, if we're here the input item must be enchanted, and we are repairing or recrafting it - ItemStack input = tinkerInput.getStackInSlot(0); - ItemStack output = tinkerResult.getStackInSlot(0); - - int cost = 0; - - // add innate repair cost - //System.out.println("Innate repair cost is " + input.getRepairCost()); - cost += input.getRepairCost(); - - // look at the input's enchantments and total them up - int enchantCost = countTotalEnchantmentCost(input); - //System.out.println("Enchantment cost is " + enchantCost); - cost += enchantCost; - - // broken pieces cost - int damagedCost = (1 + countDamagedParts(input)) * EnchantmentHelper.getEnchantments(output).size(); - //System.out.println("damagedCost is " + damagedCost); - cost += damagedCost; - - // factor in enchantibility difference - int enchantabilityDifference = input.getItem().getItemEnchantability() - output.getItem().getItemEnchantability(); - //System.out.println("enchantabilityDifference cost is " + enchantabilityDifference); - cost += enchantabilityDifference; - - // minimum cost of 1 if we're even calling this part - cost = Math.max(1, cost); - - return cost; - } - } - - /** - * - * - * @param itemStack - * @return - */ - public int countHighestEnchantmentCost(ItemStack itemStack) { - int count = 0; - - // go through all 256 enchantment IDs, and see if the item has that enchantment, and at what level - for (Enchantment ench : Enchantment.enchantmentsList) { - if (ench != null) { - int level = EnchantmentHelper.getEnchantmentLevel(ench.effectId, itemStack); - if (level > count) { - //count = ench.getMinEnchantability(level); OLD - count += getWeightModifier(ench) * level; - } - } - } - - return count; - } - /** - * - * - * @param itemStack - * @return - */ - public int countTotalEnchantmentCost(ItemStack itemStack) { - int count = 0; - - // go through all 256 enchantment IDs, and see if the item has that enchantment, and at what level - for (Enchantment ench : Enchantment.enchantmentsList) { - if (ench != null) { - int level = EnchantmentHelper.getEnchantmentLevel(ench.effectId, itemStack); - if (level > 0) { - //count = ench.getMinEnchantability(level); OLD - count += getWeightModifier(ench) * level; - count += 1; - } - } - } - - return count; - } - - public int getWeightModifier(Enchantment ench) - { - switch (ench.getWeight()) - { - case 1: - return 8; - case 2: - return 4; - case 3: - case 4: - case 5: - return 2; - case 6: - case 7: - case 8: - case 9: - default: - case 10: - return 1; - } - } - - - /** - * Override the SlotClick method to get what we want - */ - @Override - public ItemStack slotClick(int slotNum, int mouseButton, int shiftHeld, EntityPlayer par4EntityPlayer) { - - // if the player is trying to take an item out of the assembly grid, and the assembly grid is empty, take the item from the uncrafting grid. - if (slotNum > 0 && par4EntityPlayer.inventory.getItemStack() == null && ((Slot)this.inventorySlots.get(slotNum)).inventory == this.assemblyMatrix && !((Slot)this.inventorySlots.get(slotNum)).getHasStack()) { - // is the assembly matrix empty? - if(isMatrixEmpty(this.assemblyMatrix)) { - slotNum -= 9; - } - } - - // if the player is trying to take the result item and they don't have the XP to pay for it, reject them - if (slotNum > 0 &&((Slot)this.inventorySlots.get(slotNum)).inventory == this.tinkerResult - && calculateRecraftingCost() > par4EntityPlayer.experienceLevel && !par4EntityPlayer.capabilities.isCreativeMode) { - return null; - } - - // similarly, reject uncrafting if they can't do that either - if (slotNum > 0 &&((Slot)this.inventorySlots.get(slotNum)).inventory == this.uncraftingMatrix - && calculateUncraftingCost() > par4EntityPlayer.experienceLevel && !par4EntityPlayer.capabilities.isCreativeMode) { - return null; - } - - // don't allow uncrafting if the server option is turned off - if (slotNum > 0 &&((Slot)this.inventorySlots.get(slotNum)).inventory == this.uncraftingMatrix && TwilightForestMod.disableUncrafting) { - // send the player a message - //par4EntityPlayer.sendChatToPlayer("Uncrafting is disabled in the server configuration."); - return null; - } - - // finally, don't give them damaged goods - if (slotNum > 0 &&((Slot)this.inventorySlots.get(slotNum)).inventory == this.uncraftingMatrix - && (((Slot)this.inventorySlots.get(slotNum)).getStack() == null || ((Slot)this.inventorySlots.get(slotNum)).getStack().stackSize == 0)) { - return null; - } - - // also we may need to detect here when the player is increasing the stack size of the input slot - ItemStack ret = super.slotClick(slotNum, mouseButton, shiftHeld, par4EntityPlayer); - - // just trigger this event whenever the input slot is clicked for any reason - if (slotNum > 0 && ((Slot)this.inventorySlots.get(slotNum)).inventory instanceof InventoryTFGoblinInput) { - this.onCraftMatrixChanged(this.tinkerInput); - } - - return ret; - } - - @Override - protected void retrySlotClick(int slotNum, int mouseButton, boolean par3, EntityPlayer par4EntityPlayer) - { - // if they are taking something out of the uncrafting matrix, bump the slot number back to the assembly matrix - // otherwise we lose the stuff in the uncrafting matrix when we shift-click to take multiple things - if (((Slot)this.inventorySlots.get(slotNum)).inventory == this.uncraftingMatrix) - { - slotNum += 9; - } - - this.slotClick(slotNum, mouseButton, 1, par4EntityPlayer); - } - - /** - * Checks if an inventory has any items in it - * @param matrix - * @return - */ - private boolean isMatrixEmpty(IInventory matrix) { - boolean matrixEmpty = true; - for (int i = 0; i < matrix.getSizeInventory(); i++) { - if (matrix.getStackInSlot(i) != null) { - matrixEmpty = false; - } - } - return matrixEmpty; - } - - - /** - * Should the specified item count for taking damage? - * - * @param itemStack - * @return - */ - public boolean isDamageableComponent(ItemStack itemStack) { - return itemStack != null && itemStack.getItem() != Items.stick; - } - - /** - * Count how many items in an inventory can take damage - * - * @param matrix - * @return - */ - public int countDamageableParts(IInventory matrix) { - int count = 0; - for (int i = 0; i < matrix.getSizeInventory(); i++) { - if (isDamageableComponent(matrix.getStackInSlot(i))) { - count++; - } - } - return count; - } - - /** - * Determine, based on the item damage, how many parts are damaged. We're already - * assuming that the item is loaded into the uncrafing matrix. - */ - public int countDamagedParts(ItemStack input) { - int totalMax4 = Math.max(4, countDamageableParts(this.uncraftingMatrix)); - float damage = (float)input.getItemDamage() / (float)input.getMaxDamage(); - int damagedParts = (int) Math.ceil(totalMax4 * damage); - return damagedParts; - } - - /** - * Called to transfer a stack from one inventory to the other eg. when shift clicking. - */ - @Override - public ItemStack transferStackInSlot(EntityPlayer player, int slotNum) - { - ItemStack copyItem = null; - Slot transferSlot = (Slot)this.inventorySlots.get(slotNum); - - if (transferSlot != null && transferSlot.getHasStack()) - { - ItemStack transferStack = transferSlot.getStack(); - copyItem = transferStack.copy(); - - if (slotNum == 0 || slotNum == 1) - { - // result or input goes to inventory or hotbar - if (!this.mergeItemStack(transferStack, 20, 56, true)) - { - return null; - } - - transferSlot.onSlotChange(transferStack, copyItem); // what does this do? - } - else if (slotNum >= 20 && slotNum < 47) - { - // inventory goes to hotbar - if (!this.mergeItemStack(transferStack, 47, 56, false)) - { - return null; - } - } - else if (slotNum >= 47 && slotNum < 56) - { - // hotbar goes to inventory - if (!this.mergeItemStack(transferStack, 20, 47, false)) - { - return null; - } - } - else if (!this.mergeItemStack(transferStack, 20, 56, false)) - { - // crafting area goes to inventory or hotbar - return null; - } - - if (transferStack.stackSize == 0) - { - transferSlot.putStack((ItemStack)null); - } - else - { - transferSlot.onSlotChanged(); - } - - if (transferStack.stackSize == copyItem.stackSize) - { - return null; - } - - transferSlot.onPickupFromSlot(player, transferStack); - } - - return copyItem; - } - - - - - /** - * Callback for when the crafting gui is closed. - */ - @Override - public void onContainerClosed(EntityPlayer par1EntityPlayer) - { - super.onContainerClosed(par1EntityPlayer); - - if (!this.worldObj.isRemote) - { - // drop items in assembly grid - for (int i = 0; i < 9; ++i) - { - ItemStack assemblyStack = this.assemblyMatrix.getStackInSlotOnClosing(i); - - if (assemblyStack != null) - { - par1EntityPlayer.dropPlayerItemWithRandomChoice(assemblyStack, false); - } - } - - // drop input - ItemStack inputStack = this.tinkerInput.getStackInSlotOnClosing(0); - if (inputStack != null) - { - par1EntityPlayer.dropPlayerItemWithRandomChoice(inputStack, false); - } - } - } - - /** - * If we can determine this recipe's items, return it. - */ - public ItemStack[] getRecipeItems(IRecipe recipe) { - if (recipe instanceof ShapedRecipes) - { - return getRecipeItemsShaped((ShapedRecipes) recipe); - } - if (recipe instanceof ShapedOreRecipe) - { - return getRecipeItemsOre((ShapedOreRecipe) recipe); - } - return null; - } - - /** - * Uses ModLoader.getPrivateValue to get the items associated with a recipe. - * @param shaped - * @return - */ - public ItemStack[] getRecipeItemsShaped(ShapedRecipes shaped) { - return shaped.recipeItems; - -// try { -// return (ItemStack[])(ObfuscationReflectionHelper.getPrivateValue(ShapedRecipes.class, shaped, 2)); -// } catch (IllegalArgumentException e) { -// e.printStackTrace(); -// } catch (SecurityException e) { -// e.printStackTrace(); -// } -// return null; - } - - /** - * Uses ModLoader.getPrivateValue to get the items associated with a recipe. - * @param shaped - * @return - */ - @SuppressWarnings("unchecked") - public ItemStack[] getRecipeItemsOre(ShapedOreRecipe shaped) { - try { - // ShapedOreRecipes can have either an ItemStack or an ArrayList of ItemStacks - Object[] objects = ObfuscationReflectionHelper.getPrivateValue(ShapedOreRecipe.class, shaped, 3); - ItemStack[] items = new ItemStack[objects.length]; - - for (int i = 0; i < objects.length; i++) - { - if (objects[i] instanceof ItemStack) - { - items[i] = (ItemStack)objects[i]; - } - if (objects[i] instanceof ArrayList && ((ArrayList)objects[i]).size() > 0) - { - items[i] = ((ArrayList)objects[i]).get(0); - } - } - - return items; - } catch (IllegalArgumentException e) { - e.printStackTrace(); - } catch (SecurityException e) { - e.printStackTrace(); - } - return null; - } - - /** - * If we can determine this recipe's width, return it. - */ - public int getRecipeWidth(IRecipe recipe) { - if (recipe instanceof ShapedRecipes) - { - return getRecipeWidthShaped((ShapedRecipes) recipe); - } - if (recipe instanceof ShapedOreRecipe) - { - return getRecipeWidthOre((ShapedOreRecipe) recipe); - } - return -1; - } - - /** - * Uses ModLoader.getPrivateValue to get the recipe width - * @param shaped - * @return - */ - public int getRecipeWidthShaped(ShapedRecipes shaped) { - return shaped.recipeWidth; - -// try { -// return ((Integer)(ObfuscationReflectionHelper.getPrivateValue(ShapedRecipes.class, shaped, 0))).intValue(); -// } catch (IllegalArgumentException e) { -// e.printStackTrace(); -// } catch (SecurityException e) { -// e.printStackTrace(); -// } -// return 0; - } - - /** - * Uses ModLoader.getPrivateValue to get the recipe width - * @param shaped - * @return - */ - public int getRecipeWidthOre(ShapedOreRecipe shaped) { - try { - return ((Integer)(ObfuscationReflectionHelper.getPrivateValue(ShapedOreRecipe.class, shaped, 4))).intValue(); - } catch (IllegalArgumentException e) { - e.printStackTrace(); - } catch (SecurityException e) { - e.printStackTrace(); - } - return 0; - } - - /** - * If we can determine this recipe's width, return it. - */ - public int getRecipeHeight(IRecipe recipe) { - if (recipe instanceof ShapedRecipes) - { - return getRecipeHeightShaped((ShapedRecipes) recipe); - } - if (recipe instanceof ShapedOreRecipe) - { - return getRecipeHeightOre((ShapedOreRecipe) recipe); - } - return -1; - } - - /** - * Uses ModLoader.getPrivateValue to get the recipe height - * @param shaped - * @return - */ - public int getRecipeHeightShaped(ShapedRecipes shaped) { - return shaped.recipeHeight; -// try { -// return ((Integer)(ObfuscationReflectionHelper.getPrivateValue(ShapedRecipes.class, shaped, 1))).intValue(); -// } catch (IllegalArgumentException e) { -// e.printStackTrace(); -// } catch (SecurityException e) { -// e.printStackTrace(); -// } -// return 0; - } - - /** - * Uses ModLoader.getPrivateValue to get the recipe height - * @param shaped - * @return - */ - public int getRecipeHeightOre(ShapedOreRecipe shaped) { - try { - return ((Integer)(ObfuscationReflectionHelper.getPrivateValue(ShapedOreRecipe.class, shaped, 5))).intValue(); - } catch (IllegalArgumentException e) { - e.printStackTrace(); - } catch (SecurityException e) { - e.printStackTrace(); - } - return 0; - } - - - @Override - public boolean canInteractWith(EntityPlayer var1) { - return true; - } - -} diff --git a/src/main/java/twilightforest/inventory/InventoryTFGoblinInput.java b/src/main/java/twilightforest/inventory/InventoryTFGoblinInput.java deleted file mode 100644 index 2e48d0aa8e..0000000000 --- a/src/main/java/twilightforest/inventory/InventoryTFGoblinInput.java +++ /dev/null @@ -1,159 +0,0 @@ -package twilightforest.inventory; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.IInventory; -import net.minecraft.item.ItemStack; - - -public class InventoryTFGoblinInput implements IInventory { - - private ItemStack[] stackInput = new ItemStack[1]; - private ContainerTFUncrafting craftingContainer; - - public InventoryTFGoblinInput(ContainerTFUncrafting containerTFGoblinCrafting) { - this.craftingContainer = containerTFGoblinCrafting; - } - - /** - * Returns the number of slots in the inventory. - */ - @Override - public int getSizeInventory() - { - return 1; - } - - /** - * Returns the stack in slot i - */ - @Override - public ItemStack getStackInSlot(int par1) - { - return this.stackInput[par1]; - } - - /** - * Returns the name of the inventory. - */ - @Override - public String getInventoryName() - { - return "Input"; - } - - /** - * Decrease the size of the stack in slot (first int arg) by the amount of the second int arg. Returns the new - * stack. - */ - @Override - public ItemStack decrStackSize(int slotNum, int amount) - { - - if (this.stackInput[slotNum] != null) - { - ItemStack takenStack; - - if (this.stackInput[slotNum].stackSize <= amount) - { - takenStack = this.stackInput[slotNum]; - this.stackInput[slotNum] = null; - this.craftingContainer.onCraftMatrixChanged(this); - return takenStack; - } - else - { - takenStack = this.stackInput[slotNum].splitStack(amount); - - if (this.stackInput[slotNum].stackSize == 0) - { - this.stackInput[slotNum] = null; - } - - this.craftingContainer.onCraftMatrixChanged(this); - return takenStack; - } - } - else - { - return null; - } - } - - /** - * When some containers are closed they call this on each slot, then drop whatever it returns as an EntityItem - - * like when you close a workbench GUI. - */ - @Override - public ItemStack getStackInSlotOnClosing(int par1) - { - if (this.stackInput[par1] != null) - { - ItemStack var2 = this.stackInput[par1]; - this.stackInput[par1] = null; - return var2; - } - else - { - return null; - } - } - - /** - * Sets the given item stack to the specified slot in the inventory (can be crafting or armor sections). - */ - @Override - public void setInventorySlotContents(int par1, ItemStack par2ItemStack) - { - this.stackInput[par1] = par2ItemStack; - this.craftingContainer.onCraftMatrixChanged(this); - } - - /** - * Returns the maximum stack size for a inventory slot. Seems to always be 64, possibly will be extended. *Isn't - * this more of a set than a get?* - */ - @Override - public int getInventoryStackLimit() - { - return 64; - } - - /** - * Called when an the contents of an Inventory change, usually - */ - @Override - public void markDirty() { - this.craftingContainer.onCraftMatrixChanged(this); - } - - /** - * Do not make give this method the name canInteractWith because it clashes with Container - */ - @Override - public boolean isUseableByPlayer(EntityPlayer par1EntityPlayer) - { - return true; - } - - @Override - public void openInventory() {} - - @Override - public void closeInventory() {} - - /** - * Returns true if automation is allowed to insert the given stack (ignoring stack size) into the given slot. - */ - @Override - public boolean isItemValidForSlot(int par1, ItemStack par2ItemStack) - { - return true; - } - - @Override - public boolean hasCustomInventoryName() { - return false; - } - - -} diff --git a/src/main/java/twilightforest/inventory/InventoryTFGoblinUncrafting.java b/src/main/java/twilightforest/inventory/InventoryTFGoblinUncrafting.java deleted file mode 100644 index 172b10f975..0000000000 --- a/src/main/java/twilightforest/inventory/InventoryTFGoblinUncrafting.java +++ /dev/null @@ -1,134 +0,0 @@ -package twilightforest.inventory; - -import twilightforest.TwilightForestMod; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.IInventory; -import net.minecraft.item.ItemStack; - - -public class InventoryTFGoblinUncrafting implements IInventory { - - private ItemStack[] contents = new ItemStack[9]; - public int numberOfInputItems; - public int uncraftingCost; - public int recraftingCost; - - - public InventoryTFGoblinUncrafting(ContainerTFUncrafting containerTFGoblinCrafting) { - // TODO Auto-generated constructor stub - } - - - - @Override - public int getSizeInventory() { - return 9; - } - - @Override - public ItemStack getStackInSlot(int var1) { - return contents[var1]; - } - - @Override - public ItemStack decrStackSize(int slotNum, int amount) { - if (this.contents[slotNum] != null) - { - ItemStack takenStack; - - if (this.contents[slotNum].stackSize <= amount) - { - takenStack = this.contents[slotNum]; - this.contents[slotNum] = null; - - //this.eventHandler.onCraftMatrixChanged(this); - return takenStack; - } - else - { - takenStack = this.contents[slotNum].splitStack(amount); - - //System.out.println("Stack size in slot " + slotNum + " is now " + this.contents[slotNum].stackSize); - - if (this.contents[slotNum].stackSize == 0) - { - this.contents[slotNum] = null; - } - - //this.eventHandler.onCraftMatrixChanged(this); - return takenStack; - } - } - else - { - return null; - } - - } - - @Override - public ItemStack getStackInSlotOnClosing(int par1) { - if (this.contents[par1] != null) - { - ItemStack var2 = this.contents[par1]; - this.contents[par1] = null; - return var2; - } - else - { - return null; - } - } - - @Override - public void setInventorySlotContents(int par1, ItemStack par2ItemStack) { - this.contents[par1] = par2ItemStack; - - if (par2ItemStack != null && par2ItemStack.stackSize > this.getInventoryStackLimit()) - { - par2ItemStack.stackSize = this.getInventoryStackLimit(); - } - - this.markDirty(); - } - - @Override - public String getInventoryName() { - // TODO Auto-generated method stub - return "twilightforest.goblincrafting"; - } - - @Override - public int getInventoryStackLimit() { - return 64; - } - - @Override - public void markDirty() { } - - @Override - public boolean isUseableByPlayer(EntityPlayer var1) { - return !TwilightForestMod.disableUncrafting; - } - - @Override - public void openInventory() { } - - @Override - public void closeInventory() { } - - /** - * Returns true if automation is allowed to insert the given stack (ignoring stack size) into the given slot. - */ - @Override - public boolean isItemValidForSlot(int par1, ItemStack par2ItemStack) - { - return false; - } - - @Override - public boolean hasCustomInventoryName() { - return false; - } - -} diff --git a/src/main/java/twilightforest/inventory/SlotTFGoblinAssembly.java b/src/main/java/twilightforest/inventory/SlotTFGoblinAssembly.java deleted file mode 100644 index 8f71a97e2c..0000000000 --- a/src/main/java/twilightforest/inventory/SlotTFGoblinAssembly.java +++ /dev/null @@ -1,19 +0,0 @@ -package twilightforest.inventory; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.IInventory; -import net.minecraft.inventory.Slot; - - -public class SlotTFGoblinAssembly extends Slot { - - - public SlotTFGoblinAssembly(EntityPlayer par1EntityPlayer, IInventory inputSlot, IInventory assemblyMatrix, IInventory uncraftingMatrix, int slotNum, int x, int y) - { - super(assemblyMatrix, slotNum, x, y); - } - - - - -} diff --git a/src/main/java/twilightforest/inventory/SlotTFGoblinCraftResult.java b/src/main/java/twilightforest/inventory/SlotTFGoblinCraftResult.java deleted file mode 100644 index c2189e77a9..0000000000 --- a/src/main/java/twilightforest/inventory/SlotTFGoblinCraftResult.java +++ /dev/null @@ -1,61 +0,0 @@ -package twilightforest.inventory; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.IInventory; -import net.minecraft.inventory.InventoryCrafting; -import net.minecraft.inventory.SlotCrafting; -import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.CraftingManager; - - -public class SlotTFGoblinCraftResult extends SlotCrafting { - - /** The player that is using the GUI where this slot resides. */ - protected EntityPlayer thePlayer; - protected IInventory inputSlot; - protected InventoryTFGoblinUncrafting uncraftingMatrix; - protected InventoryCrafting assemblyMatrix; - protected IInventory resultSlot; - - public SlotTFGoblinCraftResult(EntityPlayer player, IInventory input, IInventory uncraftingMatrix, IInventory assemblyMatrix, IInventory result, int slotIndex, int x, int y) { - super(player, assemblyMatrix, result, slotIndex, x, y); - this.thePlayer = player; - this.inputSlot = input; - this.uncraftingMatrix = (InventoryTFGoblinUncrafting) uncraftingMatrix; - this.assemblyMatrix = (InventoryCrafting) assemblyMatrix; - } - - /** - * Called when the player picks up an item from an inventory slot - */ - @Override - public void onPickupFromSlot(EntityPlayer par1EntityPlayer, ItemStack par1ItemStack) { - // let's see, if the assembly matrix can produce this item, then it's a normal recipe, if not, it's combined. Will that work? - boolean combined = true; - - if (ItemStack.areItemStacksEqual(CraftingManager.getInstance().findMatchingRecipe(this.assemblyMatrix, this.thePlayer.worldObj), par1ItemStack)) { - combined = false; - } - - if (combined) { - // charge the player before the stacks empty - if (this.uncraftingMatrix.recraftingCost > 0) { - this.thePlayer.addExperienceLevel(-this.uncraftingMatrix.recraftingCost); - - //System.out.println("Charging the player " + this.uncraftingMatrix.recraftingCost + " experience for recrafting"); - } - - // if we are using a combined recipe, wipe the uncrafting matrix and decrement the input appropriately - for (int i = 0; i < uncraftingMatrix.getSizeInventory(); i++) { - this.uncraftingMatrix.setInventorySlotContents(i, null); - this.inputSlot.decrStackSize(0, this.uncraftingMatrix.numberOfInputItems); - } - } - - super.onPickupFromSlot(par1EntityPlayer, par1ItemStack); - } - - - - -} diff --git a/src/main/java/twilightforest/inventory/SlotTFGoblinUncrafting.java b/src/main/java/twilightforest/inventory/SlotTFGoblinUncrafting.java deleted file mode 100644 index 44d4f4970f..0000000000 --- a/src/main/java/twilightforest/inventory/SlotTFGoblinUncrafting.java +++ /dev/null @@ -1,102 +0,0 @@ -package twilightforest.inventory; - -import twilightforest.TwilightForestMod; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.IInventory; -import net.minecraft.inventory.Slot; -import net.minecraft.item.ItemStack; - - -public class SlotTFGoblinUncrafting extends Slot { - - - protected EntityPlayer thePlayer; - protected IInventory inputSlot; - protected InventoryTFGoblinUncrafting uncraftingMatrix; - protected IInventory assemblyMatrix; - - public SlotTFGoblinUncrafting(EntityPlayer par1EntityPlayer, IInventory inputSlot, InventoryTFGoblinUncrafting uncraftingMatrix, IInventory assemblyMatrix, int slotNum, int x, int y) - { - super(uncraftingMatrix, slotNum, x, y); - this.thePlayer = par1EntityPlayer; - this.inputSlot = inputSlot; - this.uncraftingMatrix = uncraftingMatrix; - this.assemblyMatrix = assemblyMatrix; - } - - - /** - * Check if the stack is a valid item for this slot. Always true beside for the armor slots. - */ - @Override - public boolean isItemValid(ItemStack par1ItemStack) - { - // don't put things in this matrix - return false; - } - - /** - * Return whether this slot's stack can be taken from this slot. - */ - public boolean canTakeStack(EntityPlayer par1EntityPlayer) - { - // if there is anything in the assembly matrix, then you cannot have these items - for (int i = 0; i < this.assemblyMatrix.getSizeInventory(); i++) - { - if (this.assemblyMatrix.getStackInSlot(i) != null) - { - return false; - } - } - - // if uncrafting is disabled, no! - if (TwilightForestMod.disableUncrafting) { - return false; - } - - // if you don't have enough XP, no - if (this.uncraftingMatrix.uncraftingCost > par1EntityPlayer.experienceLevel && !par1EntityPlayer.capabilities.isCreativeMode) { - return false; - } - - return true; - } - - /** - * Called when the player picks up an item from an inventory slot - */ - @Override - public void onPickupFromSlot(EntityPlayer par1EntityPlayer, ItemStack par1ItemStack) { - super.onPickupFromSlot(par1EntityPlayer, par1ItemStack); - - // charge the player for this - if (this.uncraftingMatrix.uncraftingCost > 0) { - this.thePlayer.addExperienceLevel(-this.uncraftingMatrix.uncraftingCost); - - //System.out.println("Charging the player " + this.uncraftingMatrix.uncraftingCost + " experience for uncrafting"); - } - - - // move all remaining items from the uncrafting grid to the assembly grid - // the assembly grid should be empty for this to even happen, so just plop the items right in - for (int i = 0; i < 9; i++) { - ItemStack transferStack = this.uncraftingMatrix.getStackInSlot(i); - if (transferStack != null && transferStack.stackSize > 0) { - this.assemblyMatrix.setInventorySlotContents(i, transferStack.copy()); - } - } - - // decrement the inputslot by 1 - // do this second so that it doesn't change the contents of the uncrafting grid - ItemStack inputStack = this.inputSlot.getStackInSlot(0); - if (inputStack != null) - { - this.inputSlot.decrStackSize(0, uncraftingMatrix.numberOfInputItems); - } - - - - } - - -} diff --git a/src/main/java/twilightforest/inventory/UncraftingContainer.java b/src/main/java/twilightforest/inventory/UncraftingContainer.java new file mode 100644 index 0000000000..a6705068b3 --- /dev/null +++ b/src/main/java/twilightforest/inventory/UncraftingContainer.java @@ -0,0 +1,99 @@ +package twilightforest.inventory; + +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.Container; +import net.minecraft.world.item.ItemStack; +import net.minecraft.core.NonNullList; +import twilightforest.TFConfig; + +public class UncraftingContainer implements Container { + + private final NonNullList contents = NonNullList.withSize(9, ItemStack.EMPTY); + + public int numberOfInputItems; + public int uncraftingCost; + public int recraftingCost; + + @Override + public int getContainerSize() { + return 9; + } + + @Override + public boolean isEmpty() { + for (ItemStack stack : this.contents) { + if (!stack.isEmpty()) { + return false; + } + } + return true; + } + + @Override + public ItemStack getItem(int index) { + return contents.get(index); + } + + @Override + public ItemStack removeItem(int index, int amount) { + ItemStack stack = this.contents.get(index); + if (stack.isEmpty()) return ItemStack.EMPTY; + if (stack.getCount() <= amount) { + this.contents.set(index, ItemStack.EMPTY); + return stack; + } else { + return stack.split(amount); + } + } + + @Override + public ItemStack removeItemNoUpdate(int index) { + ItemStack stack = this.contents.get(index); + if (stack.isEmpty()) return ItemStack.EMPTY; + this.contents.set(index, ItemStack.EMPTY); + return stack; + } + + @Override + public void setItem(int index, ItemStack stack) { + this.contents.set(index, stack); + + if (!stack.isEmpty() && stack.getCount() > this.getMaxStackSize()) { + stack.setCount(this.getMaxStackSize()); + } + + this.setChanged(); + } + + @Override + public int getMaxStackSize() { + return 64; + } + + @Override + public void setChanged() { + } + + @Override + public boolean stillValid(Player player) { + return !TFConfig.COMMON_CONFIG.UNCRAFTING_STUFFS.disableUncrafting.get(); + } + + @Override + public void startOpen(Player player) { + } + + @Override + public void stopOpen(Player player) { + } + + @Override + public boolean canPlaceItem(int index, ItemStack stack) { + return false; + } + + @Override + public void clearContent() { + this.contents.clear(); + } +} diff --git a/src/main/java/twilightforest/inventory/UncraftingInputContainer.java b/src/main/java/twilightforest/inventory/UncraftingInputContainer.java new file mode 100644 index 0000000000..d18ae4b321 --- /dev/null +++ b/src/main/java/twilightforest/inventory/UncraftingInputContainer.java @@ -0,0 +1,84 @@ +package twilightforest.inventory; + +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.Container; +import net.minecraft.world.item.ItemStack; + +public class UncraftingInputContainer implements Container { + + private ItemStack stack = ItemStack.EMPTY; + private final UncraftingMenu container; + + public UncraftingInputContainer(UncraftingMenu containerTFGoblinCrafting) { + this.container = containerTFGoblinCrafting; + } + + @Override + public int getContainerSize() { + return 1; + } + + @Override + public boolean isEmpty() { + return this.stack.isEmpty(); + } + + @Override + public ItemStack getItem(int index) { + return index == 0 ? this.stack : ItemStack.EMPTY; + } + + @Override + public ItemStack removeItem(int index, int amount) { + if (index == 0 && !this.stack.isEmpty()) { + ItemStack takenStack; + + if (this.stack.getCount() <= amount) { + takenStack = this.stack; + this.stack = ItemStack.EMPTY; + this.container.slotsChanged(this); + return takenStack; + } else { + takenStack = this.stack.split(amount); + this.container.slotsChanged(this); + return takenStack; + } + } else { + return ItemStack.EMPTY; + } + } + + @Override + public ItemStack removeItemNoUpdate(int index) { + if (index == 0 && !this.stack.isEmpty()) { + ItemStack stack = this.stack; + this.stack = ItemStack.EMPTY; + return stack; + } else { + return ItemStack.EMPTY; + } + } + + @Override + public void setItem(int index, ItemStack stack) { + if (index == 0) { + this.stack = stack; + this.container.slotsChanged(this); + } + } + + @Override + public void setChanged() { + this.container.slotsChanged(this); + } + + @Override + public boolean stillValid(Player player) { + return true; + } + + @Override + public void clearContent() { + this.stack = ItemStack.EMPTY; + } +} diff --git a/src/main/java/twilightforest/inventory/UncraftingMenu.java b/src/main/java/twilightforest/inventory/UncraftingMenu.java new file mode 100644 index 0000000000..479d8dbbef --- /dev/null +++ b/src/main/java/twilightforest/inventory/UncraftingMenu.java @@ -0,0 +1,625 @@ +package twilightforest.inventory; + +import net.minecraft.nbt.ByteTag; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.tags.ItemTags; +import net.minecraft.world.Container; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.*; +import net.minecraft.world.item.*; +import net.minecraft.world.item.crafting.CraftingRecipe; +import net.minecraft.world.item.crafting.Recipe; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.item.crafting.ShapedRecipe; +import net.minecraft.world.item.enchantment.Enchantment; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.level.GameRules; +import net.minecraft.world.level.Level; +import net.minecraftforge.common.Tags; +import net.minecraftforge.common.crafting.IShapedRecipe; +import org.jetbrains.annotations.Nullable; +import twilightforest.TFConfig; +import twilightforest.data.tags.ItemTagGenerator; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFMenuTypes; +import twilightforest.init.TFRecipes; +import twilightforest.inventory.slot.AssemblySlot; +import twilightforest.inventory.slot.UncraftingResultSlot; +import twilightforest.inventory.slot.UncraftingSlot; +import twilightforest.item.recipe.UncraftingRecipe; +import twilightforest.util.TFItemStackUtils; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +public class UncraftingMenu extends AbstractContainerMenu { + + private static final String TAG_MARKER = "TwilightForestMarker"; + + // Inaccessible grid, for uncrafting logic + private final UncraftingContainer uncraftingMatrix = new UncraftingContainer(); + // Accessible grid, for actual crafting + public final CraftingContainer assemblyMatrix = new CraftingContainer(this, 3, 3); + // Inaccessible grid, for recrafting logic + private final CraftingContainer combineMatrix = new CraftingContainer(this, 3, 3); + + // Input slot for uncrafting + public final Container tinkerInput = new UncraftingInputContainer(this); + // Crafting Output + private final ResultContainer tinkerResult = new ResultContainer(); + + private final ContainerLevelAccess positionData; + private final Level level; + private final Player player; + + // Conflict resolution + public int unrecipeInCycle = 0; + public int ingredientsInCycle = 0; + public int recipeInCycle = 0; + + // Need to store potential custom cost. If set to -1, will calculate uncrafting cost normally. + private int customCost; + + public static UncraftingMenu fromNetwork(int id, Inventory inventory) { + return new UncraftingMenu(id, inventory, inventory.player.getLevel(), ContainerLevelAccess.NULL); + } + + public UncraftingMenu(int id, Inventory inventory, Level level, ContainerLevelAccess positionData) { + super(TFMenuTypes.UNCRAFTING.get(), id); + + this.positionData = positionData; + this.level = level; + this.player = inventory.player; + + this.addSlot(new Slot(this.tinkerInput, 0, 13, 35)); + this.addSlot(new UncraftingResultSlot(inventory.player, this.tinkerInput, this.uncraftingMatrix, this.assemblyMatrix, this.tinkerResult, 0, 147, 35)); + + int invX; + int invY; + + for (invX = 0; invX < 3; ++invX) { + for (invY = 0; invY < 3; ++invY) { + this.addSlot(new UncraftingSlot(inventory.player, this.tinkerInput, this.uncraftingMatrix, this.assemblyMatrix, invY + invX * 3, 300000 + invY * 18, 17 + invX * 18)); + } + } + for (invX = 0; invX < 3; ++invX) { + for (invY = 0; invY < 3; ++invY) { + this.addSlot(new AssemblySlot(this.assemblyMatrix, invY + invX * 3, 62 + invY * 18, 17 + invX * 18)); + } + } + + for (invX = 0; invX < 3; ++invX) { + for (invY = 0; invY < 9; ++invY) { + this.addSlot(new Slot(inventory, invY + invX * 9 + 9, 8 + invY * 18, 84 + invX * 18)); + } + } + + for (invX = 0; invX < 9; ++invX) { + this.addSlot(new Slot(inventory, invX, 8 + invX * 18, 142)); + } + + this.slotsChanged(this.assemblyMatrix); + } + + @Override + public void slotsChanged(Container inventory) { + // we need to see what inventory is calling this, and update appropriately + if (inventory == this.tinkerInput) { + + // empty whole grid to start with + this.uncraftingMatrix.clearContent(); + + // see if there is a recipe for the input + ItemStack inputStack = tinkerInput.getItem(0); + Recipe[] recipes = getRecipesFor(inputStack, this.level); + + int size = recipes.length; + + if (size > 0 && !inputStack.is(ItemTagGenerator.BANNED_UNCRAFTABLES)) { + + Recipe recipe = recipes[Math.floorMod(this.unrecipeInCycle, size)]; + this.customCost = recipe instanceof UncraftingRecipe uncraftingRecipe ? uncraftingRecipe.getCost() : -1; + ItemStack[] recipeItems = getIngredients(recipe); + + if (recipe instanceof IShapedRecipe rec) { + + int recipeWidth = rec.getRecipeWidth(); + int recipeHeight = rec.getRecipeHeight(); + + // set uncrafting grid + for (int invY = 0; invY < recipeHeight; invY++) { + for (int invX = 0; invX < recipeWidth; invX++) { + + int index = invX + invY * recipeWidth; + if (index >= recipeItems.length) continue; + + ItemStack ingredient = normalizeIngredient(recipeItems[index].copy()); + this.uncraftingMatrix.setItem(invX + invY * 3, ingredient); + } + } + } else { + for (int i = 0; i < this.uncraftingMatrix.getContainerSize(); i++) { + if (i < recipeItems.length) { + ItemStack ingredient = normalizeIngredient(recipeItems[i].copy()); + this.uncraftingMatrix.setItem(i, ingredient); + } + } + } + + + // mark the appropriate number of damaged components + if (inputStack.isDamaged()) { + int damagedParts = this.countDamagedParts(inputStack); + + for (int i = 0; i < 9 && damagedParts > 0; i++) { + ItemStack stack = this.uncraftingMatrix.getItem(i); + if (isDamageableComponent(stack)) { + markStack(stack); + damagedParts--; + } + } + } + + // mark banned items + for (int i = 0; i < 9; i++) { + ItemStack ingredient = this.uncraftingMatrix.getItem(i); + if (isIngredientProblematic(ingredient)) { + markStack(ingredient); + } + } + + // store number of items this recipe produces (and thus how many input items are required for uncrafting) + this.uncraftingMatrix.numberOfInputItems = recipe instanceof UncraftingRecipe uncraftingRecipe ? uncraftingRecipe.getCount() : recipe.getResultItem(this.level.registryAccess()).getCount();//Uncrafting recipes need this method call + this.uncraftingMatrix.uncraftingCost = this.calculateUncraftingCost(); + this.uncraftingMatrix.recraftingCost = 0; + + } else { + this.customCost = -1; + this.uncraftingMatrix.numberOfInputItems = 0; + this.uncraftingMatrix.uncraftingCost = 0; + } + } + // Now we've got the uncrafting logic set in, currently we don't modify the uncraftingMatrix. That's fine. + if (inventory == this.assemblyMatrix || inventory == this.tinkerInput) { + if (this.tinkerInput.isEmpty()) { + // display the output + this.chooseRecipe(this.assemblyMatrix); + } else { + // we placed an item in the assembly matrix, the next step will re-initialize these with correct values + this.tinkerResult.setItem(0, ItemStack.EMPTY); + this.uncraftingMatrix.uncraftingCost = this.calculateUncraftingCost(); + } + this.uncraftingMatrix.recraftingCost = 0; + } + + // repairing / recrafting: if there is an input item, and items in both grids, can we combine them to produce an output item that is the same type as the input item? + if (inventory != this.combineMatrix && !this.uncraftingMatrix.isEmpty() && !this.assemblyMatrix.isEmpty()) { + // combine the two matrices + for (int i = 0; i < 9; i++) { + + ItemStack assembly = this.assemblyMatrix.getItem(i); + ItemStack uncrafting = this.uncraftingMatrix.getItem(i); + + if (!assembly.isEmpty()) { + this.combineMatrix.setItem(i, assembly); + } else if (!uncrafting.isEmpty() && !isMarked(uncrafting)) { + this.combineMatrix.setItem(i, uncrafting); + } else { + this.combineMatrix.setItem(i, ItemStack.EMPTY); + } + } + // is there a result from this combined thing? + this.chooseRecipe(this.combineMatrix); + + ItemStack input = this.tinkerInput.getItem(0); + ItemStack result = this.tinkerResult.getItem(0); + + if (!result.isEmpty() && isValidMatchForInput(input, result)) { + // copy the tag compound + // or should we only copy enchantments? + CompoundTag inputTags = null; + if (input.getTag() != null) { + inputTags = input.getTag().copy(); + } + + // if the result has innate enchantments, add them on to our enchantment map + Map resultInnateEnchantments = EnchantmentHelper.getEnchantments(result); + + Map inputEnchantments = EnchantmentHelper.getEnchantments(input); + // check if the input enchantments can even go onto the result item + inputEnchantments.keySet().removeIf(enchantment -> enchantment == null || !enchantment.canEnchant(result)); + + if (inputTags != null) { + // remove enchantments and damage, copy tags, re-add filtered enchantments + inputTags.remove("ench"); + inputTags.remove("Damage"); + result.setTag(inputTags); + EnchantmentHelper.setEnchantments(inputEnchantments, result); + } + + // finally, add any innate enchantments back onto the result + for (Map.Entry entry : resultInnateEnchantments.entrySet()) { + + Enchantment ench = entry.getKey(); + int level = entry.getValue(); + + // only apply enchants that are better than what we already have + // also don't add enchantments if they aren't compatible with already existing ones, we don't want cursed armor sets + if (EnchantmentHelper.isEnchantmentCompatible(EnchantmentHelper.getEnchantments(result).keySet(), ench) && EnchantmentHelper.getTagEnchantmentLevel(ench, result) < level) { + result.enchant(ench, level); + } + } + + this.tinkerResult.setItem(0, result); + this.uncraftingMatrix.uncraftingCost = 0; + this.uncraftingMatrix.recraftingCost = this.calculateRecraftingCost(); + + // if there is a recrafting cost, increment the repair cost of the output + if (this.uncraftingMatrix.recraftingCost > 0 && !result.hasCustomHoverName()) { + result.setRepairCost(input.getBaseRepairCost() + 2); + } + } + } + } + + public static void markStack(ItemStack stack) { + stack.addTagElement(TAG_MARKER, ByteTag.valueOf((byte) 1)); + } + + public static boolean isMarked(ItemStack stack) { + CompoundTag stackTag = stack.getTag(); + return stackTag != null && stackTag.getBoolean(TAG_MARKER); + } + + //might be handy one day + @SuppressWarnings("unused") + public static void unmarkStack(ItemStack stack) { + TFItemStackUtils.clearInfoTag(stack, TAG_MARKER); + } + + private static boolean isIngredientProblematic(ItemStack ingredient) { + return (!ingredient.isEmpty() && ingredient.getItem().hasCraftingRemainingItem(ingredient)) || ingredient.is(Items.BARRIER); + } + + private static ItemStack normalizeIngredient(ItemStack ingredient) { + if (ingredient.getCount() > 1) { + ingredient.setCount(1); + } + return ingredient; + } + + private static Recipe[] getRecipesFor(ItemStack inputStack, Level world) { + + List> recipes = new ArrayList<>(); + + if (!inputStack.isEmpty()) { + for (Recipe recipe : world.getRecipeManager().getRecipes()) { + if (isRecipeSupported(recipe) && + !recipe.isIncomplete() && + recipe.canCraftInDimensions(3, 3) && + !recipe.getIngredients().isEmpty() && + matches(inputStack, recipe.getResultItem(world.registryAccess())) && + TFConfig.COMMON_CONFIG.UNCRAFTING_STUFFS.reverseRecipeBlacklist.get() == TFConfig.COMMON_CONFIG.UNCRAFTING_STUFFS.disableUncraftingRecipes.get().contains(recipe.getId().toString())) { + if (TFConfig.COMMON_CONFIG.UNCRAFTING_STUFFS.flipUncraftingModIdList.get() == TFConfig.COMMON_CONFIG.UNCRAFTING_STUFFS.blacklistedUncraftingModIds.get().contains(recipe.getId().getNamespace())) { + recipes.add(recipe); + } + } + } + for (UncraftingRecipe uncraftingRecipe : world.getRecipeManager().getAllRecipesFor(TFRecipes.UNCRAFTING_RECIPE.get())) { + if (uncraftingRecipe.isItemStackAnIngredient(inputStack)) recipes.add(uncraftingRecipe); + } + } + + return recipes.toArray(new Recipe[0]); + } + + private static boolean isRecipeSupported(Recipe recipe) { + return TFConfig.COMMON_CONFIG.UNCRAFTING_STUFFS.allowShapelessUncrafting.get() ? recipe instanceof CraftingRecipe : recipe instanceof ShapedRecipe; + } + + private static boolean matches(ItemStack input, ItemStack output) { + return input.is(output.getItem()) && input.getCount() >= output.getCount(); + } + + private static CraftingRecipe[] getRecipesFor(CraftingContainer matrix, Level world) { + return world.getRecipeManager().getRecipesFor(RecipeType.CRAFTING, matrix, world).toArray(new CraftingRecipe[0]); + } + + private void chooseRecipe(CraftingContainer inventory) { + + CraftingRecipe[] recipes = getRecipesFor(inventory, this.level); + + if (recipes.length == 0) { + this.tinkerResult.setItem(0, ItemStack.EMPTY); + return; + } + + CraftingRecipe recipe = recipes[Math.floorMod(this.recipeInCycle, recipes.length)]; + + if (recipe != null && (recipe.isSpecial() || !this.level.getGameRules().getBoolean(GameRules.RULE_LIMITED_CRAFTING) || ((ServerPlayer) this.player).getRecipeBook().contains(recipe))) { + this.tinkerResult.setRecipeUsed(recipe); + this.tinkerResult.setItem(0, recipe.assemble(inventory, this.level.registryAccess())); + } else { + this.tinkerResult.setItem(0, ItemStack.EMPTY); + } + } + + /** + * Checks if the result is a valid match for the input. Currently, only accepts armor or tools that are the same type as the input + */ + private static boolean isValidMatchForInput(ItemStack inputStack, ItemStack resultStack) { + if (inputStack.is(ItemTags.PICKAXES) && resultStack.is(ItemTags.PICKAXES)) { + return true; + } + if (inputStack.is(ItemTags.AXES) && resultStack.is(ItemTags.AXES)) { + return true; + } + if (inputStack.is(ItemTags.SHOVELS) && resultStack.is(ItemTags.SHOVELS)) { + return true; + } + if (inputStack.is(ItemTags.HOES) && resultStack.is(ItemTags.HOES)) { + return true; + } + if (inputStack.is(ItemTags.SWORDS) && resultStack.is(ItemTags.SWORDS)) { + return true; + } + if (inputStack.is(Tags.Items.TOOLS_BOWS) && resultStack.is(Tags.Items.TOOLS_BOWS)) { + return true; + } + if (inputStack.is(Tags.Items.TOOLS_CROSSBOWS) && resultStack.is(Tags.Items.TOOLS_CROSSBOWS)) { + return true; + } + if (inputStack.is(Tags.Items.TOOLS_FISHING_RODS) && resultStack.is(Tags.Items.TOOLS_FISHING_RODS)) { + return true; + } + + if (inputStack.is(Tags.Items.ARMORS) && resultStack.is(Tags.Items.ARMORS)) { + return inputStack.getEquipmentSlot() == resultStack.getEquipmentSlot(); + } + + return false; + } + + public int getUncraftingCost() { + return this.uncraftingMatrix.uncraftingCost; + } + + public int getRecraftingCost() { + return this.uncraftingMatrix.recraftingCost; + } + + /** + * Calculate the cost of uncrafting, if any. Return 0 if uncrafting is not available at this time + */ + private int calculateUncraftingCost() { + // we don't want to display anything if there is anything in the assembly grid + if (this.assemblyMatrix.isEmpty()) { + return this.customCost >= 0 ? this.customCost : (int) Math.round(countDamageableParts(this.uncraftingMatrix) * TFConfig.COMMON_CONFIG.UNCRAFTING_STUFFS.uncraftingXpCostMultiplier.get()); + } else return 0; + } + + /** + * Return the cost of recrafting, if any. Return 0 if recrafting is not available at this time + */ + private int calculateRecraftingCost() { + + ItemStack input = this.tinkerInput.getItem(0); + ItemStack output = this.tinkerResult.getItem(0); + + if (input.isEmpty() || !input.isEnchanted() || output.isEmpty()) { + return 0; + } + + // okay, if we're here the input item must be enchanted, and we are repairing or recrafting it + int cost = 0; + + // add innate repair cost + cost += input.getBaseRepairCost(); + + // look at the input's enchantments and total them up + int enchantCost = countTotalEnchantmentCost(input); + cost += enchantCost; + + // broken pieces cost + int damagedCost = (1 + this.countDamagedParts(input)) * EnchantmentHelper.getEnchantments(output).size(); + cost += damagedCost; + + // factor in enchantability difference + int enchantabilityDifference = input.getItem().getEnchantmentValue(input) - output.getItem().getEnchantmentValue(output); + cost += enchantabilityDifference; + + // minimum cost of 1 if we're even calling this part + cost = Math.max(1, cost); + + return (int) Math.round(cost * TFConfig.COMMON_CONFIG.UNCRAFTING_STUFFS.repairingXpCostMultiplier.get()); + } + + private static int countTotalEnchantmentCost(ItemStack stack) { + + int count = 0; + + for (Map.Entry entry : EnchantmentHelper.getEnchantments(stack).entrySet()) { + + Enchantment ench = entry.getKey(); + int level = entry.getValue(); + + if (ench != null && level > 0) { + count += getWeightModifier(ench) * level; + count += 1; + } + } + + return count; + } + + private static int getWeightModifier(Enchantment ench) { + return switch (ench.getRarity().getWeight()) { + case 1 -> 8; + case 2 -> 4; + case 3, 4, 5 -> 2; + default -> 1; + }; + } + + @Override + public void clicked(int slotNum, int mouseButton, ClickType clickType, Player player) { + + // if the player is trying to take an item out of the assembly grid, and the assembly grid is empty, take the item from the uncrafting grid. + if (slotNum > 0 && this.slots.get(slotNum).container == this.assemblyMatrix + && player.containerMenu.getCarried().isEmpty() && !this.slots.get(slotNum).hasItem()) { + + // is the assembly matrix empty? + if (this.assemblyMatrix.isEmpty()) { + slotNum -= 9; + } + } + + // if the player is trying to take the result item and they don't have the XP to pay for it, reject them + if (slotNum > 0 && this.slots.get(slotNum).container == this.tinkerResult + && this.calculateRecraftingCost() > player.experienceLevel && !player.getAbilities().instabuild) { + + return; + } + + if (slotNum > 0 && this.slots.get(slotNum).container == this.uncraftingMatrix) { + + // similarly, reject uncrafting if they can't do that either + if (this.calculateUncraftingCost() > player.experienceLevel && !player.getAbilities().instabuild) { + return; + } + + // don't allow uncrafting if the server option is turned off + if (TFConfig.COMMON_CONFIG.UNCRAFTING_STUFFS.disableUncrafting.get()) { + return; + } + + // finally, don't give them damaged goods + ItemStack stackInSlot = this.slots.get(slotNum).getItem(); + if (stackInSlot.isEmpty() || isMarked(stackInSlot)) { + return; + } + } + + super.clicked(slotNum, mouseButton, clickType, player); + + // just trigger this event whenever the input slot is clicked for any reason + if (slotNum > 0 && this.slots.get(slotNum).container == this.tinkerInput) { + this.slotsChanged(this.tinkerInput); + } + } + + /** + * Should the specified item count for taking damage? + */ + private static boolean isDamageableComponent(ItemStack itemStack) { + return !itemStack.is(ItemTagGenerator.UNCRAFTING_IGNORES_COST); + } + + /** + * Count how many items in an inventory can take damage + */ + private static int countDamageableParts(Container matrix) { + int count = 0; + for (int i = 0; i < matrix.getContainerSize(); i++) { + if (!matrix.getItem(i).isEmpty()) { + count++; + } + if (isIngredientProblematic(matrix.getItem(i)) || isMarked(matrix.getItem(i)) || !isDamageableComponent(matrix.getItem(i))) { + count--; + } + } + return count; + } + + /** + * Determine, based on the item damage, how many parts are damaged. We're already + * assuming that the item is loaded into the uncrafting matrix. + */ + private int countDamagedParts(ItemStack input) { + int totalMax4 = Math.max(4, countDamageableParts(this.uncraftingMatrix)); + float damage = (float) input.getDamageValue() / (float) input.getMaxDamage(); + return (int) Math.ceil(totalMax4 * damage); + } + + /** + * Called to transfer a stack from one inventory to the other e.g. when shift clicking. + */ + @Override + public ItemStack quickMoveStack(Player player, int slotNum) { + ItemStack itemstack = ItemStack.EMPTY; + Slot slot = this.slots.get(slotNum); + //noinspection ConstantConditions + if (slot != null && slot.hasItem()) { + ItemStack itemstack1 = slot.getItem(); + itemstack = itemstack1.copy(); + if (slotNum == 0) { + if (!this.moveItemStackTo(itemstack1, 20, 56, false)) { + return ItemStack.EMPTY; + } + slot.onQuickCraft(itemstack1, itemstack); + } else if (slotNum == 1) { + this.positionData.execute((p_39378_, p_39379_) -> itemstack1.getItem().onCraftedBy(itemstack1, p_39378_, player)); + if (!this.moveItemStackTo(itemstack1, 20, 56, true)) { + return ItemStack.EMPTY; + } + slot.onQuickCraft(itemstack1, itemstack); + } else if (slotNum >= 20 && slotNum < 56) { + if (!this.moveItemStackTo(itemstack1, 0, 1, false)) { + return ItemStack.EMPTY; + } + } else if (slot.container == this.assemblyMatrix) { + if (!this.moveItemStackTo(itemstack1, 20, 56, false)) { + return ItemStack.EMPTY; + } + } else { + if (this.moveItemStackTo(itemstack1, 20, 56, false)) { + slot.onTake(player, itemstack1); + return ItemStack.EMPTY; + } + } + if (itemstack1.isEmpty()) { + slot.set(ItemStack.EMPTY); + } else { + slot.setChanged(); + } + if (itemstack1.getCount() == itemstack.getCount()) { + return ItemStack.EMPTY; + } + slot.onTake(player, itemstack1); + if (slotNum == 1) { + player.drop(itemstack1, false); + } + } + return itemstack; + } + + @Override + public void removed(Player player) { + super.removed(player); + this.positionData.execute((world, pos) -> { + this.clearContainer(player, this.assemblyMatrix); + this.clearContainer(player, this.tinkerInput); + }); + } + + private ItemStack[] getIngredients(Recipe recipe) { + ItemStack[] stacks = new ItemStack[recipe.getIngredients().size()]; + + for (int i = 0; i < recipe.getIngredients().size(); i++) { + ItemStack[] matchingStacks = Arrays.stream(recipe.getIngredients().get(i).getItems()).filter(s -> !s.is(ItemTagGenerator.BANNED_UNCRAFTING_INGREDIENTS)).toArray(ItemStack[]::new); + stacks[i] = matchingStacks.length > 0 ? matchingStacks[Math.floorMod(this.ingredientsInCycle, matchingStacks.length)] : ItemStack.EMPTY; + } + + return stacks; + } + + @Override + public boolean stillValid(Player player) { + return stillValid(this.positionData, player, TFBlocks.UNCRAFTING_TABLE.get()); + } +} diff --git a/src/main/java/twilightforest/inventory/package-info.java b/src/main/java/twilightforest/inventory/package-info.java new file mode 100644 index 0000000000..f8a864b1e3 --- /dev/null +++ b/src/main/java/twilightforest/inventory/package-info.java @@ -0,0 +1,6 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.inventory; + +import net.minecraft.MethodsReturnNonnullByDefault; +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/inventory/slot/AssemblySlot.java b/src/main/java/twilightforest/inventory/slot/AssemblySlot.java new file mode 100644 index 0000000000..165b739bd5 --- /dev/null +++ b/src/main/java/twilightforest/inventory/slot/AssemblySlot.java @@ -0,0 +1,11 @@ +package twilightforest.inventory.slot; + +import net.minecraft.world.Container; +import net.minecraft.world.inventory.Slot; + +public class AssemblySlot extends Slot { + + public AssemblySlot(Container assemblyMatrix, int slotNum, int x, int y) { + super(assemblyMatrix, slotNum, x, y); + } +} diff --git a/src/main/java/twilightforest/inventory/slot/UncraftingResultSlot.java b/src/main/java/twilightforest/inventory/slot/UncraftingResultSlot.java new file mode 100644 index 0000000000..67efc52677 --- /dev/null +++ b/src/main/java/twilightforest/inventory/slot/UncraftingResultSlot.java @@ -0,0 +1,77 @@ +package twilightforest.inventory.slot; + +import net.minecraft.core.NonNullList; +import net.minecraft.world.Container; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.CraftingContainer; +import net.minecraft.world.inventory.ResultSlot; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Recipe; +import net.minecraft.world.item.crafting.RecipeType; +import twilightforest.inventory.UncraftingContainer; + +public class UncraftingResultSlot extends ResultSlot { + + private final Player player; + private final Container inputSlot; + private final UncraftingContainer uncraftingMatrix; + private final CraftingContainer assemblyMatrix; + + public UncraftingResultSlot(Player player, Container input, Container uncraftingMatrix, Container assemblyMatrix, Container result, int slotIndex, int x, int y) { + super(player, (CraftingContainer) assemblyMatrix, result, slotIndex, x, y); + this.player = player; + this.inputSlot = input; + this.uncraftingMatrix = (UncraftingContainer) uncraftingMatrix; + this.assemblyMatrix = (CraftingContainer) assemblyMatrix; + } + + @Override + public void onTake(Player player, ItemStack stack) { + // let's see, if the assembly matrix can produce this item, then it's a normal recipe, if not, it's combined. Will that work? + boolean combined = true; + + for (Recipe recipe : player.getLevel().getRecipeManager().getRecipesFor(RecipeType.CRAFTING, this.assemblyMatrix, this.player.getLevel())) { + if (ItemStack.isSameItemSameTags(recipe.getResultItem(player.getLevel().registryAccess()), stack)) { + combined = false; + break; + } + } + + if (combined) { + // charge the player before the stacks empty + if (this.uncraftingMatrix.recraftingCost > 0) { + this.player.giveExperienceLevels(-this.uncraftingMatrix.recraftingCost); + } + + // if we are using a combined recipe, wipe the uncrafting matrix and decrement the input appropriately + for (int i = 0; i < uncraftingMatrix.getContainerSize(); i++) { + this.uncraftingMatrix.setItem(i, ItemStack.EMPTY); + } + this.inputSlot.removeItem(0, this.uncraftingMatrix.numberOfInputItems); + } + + //VanillaCopy of the super method, but altered to work with the assembly matrix + this.checkTakeAchievements(stack); + + net.minecraftforge.common.ForgeHooks.setCraftingPlayer(player); + NonNullList remainingItems = player.level.getRecipeManager().getRemainingItemsFor(RecipeType.CRAFTING, this.assemblyMatrix, player.level); + net.minecraftforge.common.ForgeHooks.setCraftingPlayer(null); + + for(int i = 0; i < remainingItems.size(); ++i) { + ItemStack currentStack = this.assemblyMatrix.getItem(i); + ItemStack remainingStack = remainingItems.get(i); + if (!currentStack.isEmpty()) { + this.assemblyMatrix.removeItem(i, 1); + currentStack = this.assemblyMatrix.getItem(i); + } + + if (!remainingStack.isEmpty()) { + if (currentStack.isEmpty()) { + this.assemblyMatrix.setItem(i, remainingStack); + } else if (!ItemStack.isSameItemSameTags(currentStack, remainingStack) && !this.player.getInventory().add(remainingStack)) { + this.player.drop(remainingStack, false); + } + } + } + } +} diff --git a/src/main/java/twilightforest/inventory/slot/UncraftingSlot.java b/src/main/java/twilightforest/inventory/slot/UncraftingSlot.java new file mode 100644 index 0000000000..9e00936afb --- /dev/null +++ b/src/main/java/twilightforest/inventory/slot/UncraftingSlot.java @@ -0,0 +1,95 @@ +package twilightforest.inventory.slot; + +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.Container; +import net.minecraft.world.inventory.Slot; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import twilightforest.TFConfig; +import twilightforest.inventory.UncraftingMenu; +import twilightforest.inventory.UncraftingContainer; + +public class UncraftingSlot extends Slot { + + protected final Player player; + protected final Container inputSlot; + protected final UncraftingContainer uncraftingMatrix; + protected final Container assemblyMatrix; + + public UncraftingSlot(Player player, Container inputSlot, UncraftingContainer uncraftingMatrix, Container assemblyMatrix, int slotNum, int x, int y) { + super(uncraftingMatrix, slotNum, x, y); + this.player = player; + this.inputSlot = inputSlot; + this.uncraftingMatrix = uncraftingMatrix; + this.assemblyMatrix = assemblyMatrix; + } + + /** + * Check if the stack is a valid item for this slot. Always true beside for the armor slots. + */ + @Override + public boolean mayPlace(ItemStack stack) { + // don't put things in this matrix + return false; + } + + /** + * Return whether this slot's stack can be taken from this slot. + */ + @Override + public boolean mayPickup(Player player) { + // if there is anything in the assembly matrix, then you cannot have these items + if (!this.assemblyMatrix.isEmpty()) { + return false; + } + + // can't take a marked stack + if (UncraftingMenu.isMarked(this.getItem())) { + return false; + } + + // if uncrafting is disabled, no! + if (TFConfig.COMMON_CONFIG.UNCRAFTING_STUFFS.disableUncrafting.get()) { + return false; + } + + // if you don't have enough XP, no + return this.uncraftingMatrix.uncraftingCost <= player.experienceLevel || player.getAbilities().instabuild; + } + + /** + * Called when the player picks up an item from an inventory slot + */ + @Override + public void onTake(Player player, ItemStack stack) { + // charge the player for this + if (this.uncraftingMatrix.uncraftingCost > 0) { + this.player.giveExperienceLevels(-this.uncraftingMatrix.uncraftingCost); + } + + // move all remaining items from the uncrafting grid to the assembly grid + // the assembly grid should be empty for this to even happen, so just plop the items right in + for (int i = 0; i < 9; i++) { + ItemStack transferStack = this.uncraftingMatrix.getItem(i); + if (!transferStack.isEmpty() && !UncraftingMenu.isMarked(transferStack)) { + this.assemblyMatrix.setItem(i, transferStack.copy()); + } + } + + // decrement the inputslot by 1 + // do this second so that it doesn't change the contents of the uncrafting grid + ItemStack inputStack = this.inputSlot.getItem(0); + if (!inputStack.isEmpty()) { + this.inputSlot.removeItem(0, this.uncraftingMatrix.numberOfInputItems); + } + + super.onTake(player, stack); + } + + @Override + @OnlyIn(Dist.CLIENT) + public boolean isActive() { + return false; + } +} diff --git a/src/main/java/twilightforest/inventory/slot/package-info.java b/src/main/java/twilightforest/inventory/slot/package-info.java new file mode 100644 index 0000000000..c57a553e2c --- /dev/null +++ b/src/main/java/twilightforest/inventory/slot/package-info.java @@ -0,0 +1,6 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.inventory.slot; + +import net.minecraft.MethodsReturnNonnullByDefault; +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/item/ArcticArmorItem.java b/src/main/java/twilightforest/item/ArcticArmorItem.java new file mode 100644 index 0000000000..1f000c5cde --- /dev/null +++ b/src/main/java/twilightforest/item/ArcticArmorItem.java @@ -0,0 +1,146 @@ +package twilightforest.item; + +import net.minecraft.ChatFormatting; +import net.minecraft.client.Minecraft; +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.model.geom.EntityModelSet; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.network.chat.Style; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.*; +import net.minecraft.world.level.Level; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.client.extensions.common.IClientItemExtensions; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import twilightforest.TwilightForestMod; +import twilightforest.client.model.TFModelLayers; +import twilightforest.client.model.armor.TFArmorModel; +import twilightforest.init.TFItems; + +import java.util.List; +import java.util.function.Consumer; + +public class ArcticArmorItem extends ArmorItem implements DyeableLeatherItem { + private static final MutableComponent TOOLTIP = Component.translatable("item.twilightforest.arctic_armor.desc").setStyle(Style.EMPTY.withColor(ChatFormatting.GRAY)); + + public ArcticArmorItem(ArmorMaterial armorMaterial, Type type, Properties properties) { + super(armorMaterial, type, properties); + } + + @Override + public String getArmorTexture(ItemStack itemstack, Entity entity, EquipmentSlot slot, @Nullable String layer) { + if (slot == EquipmentSlot.LEGS) { + return TwilightForestMod.ARMOR_DIR + "arcticarmor_2" + (layer == null ? "_dyed" : "_overlay") + ".png"; + } else { + return TwilightForestMod.ARMOR_DIR + "arcticarmor_1" + (layer == null ? "_dyed" : "_overlay") + ".png"; + } + } + + @Override + public boolean hasCustomColor(ItemStack stack) { + CompoundTag CompoundNBT = stack.getTag(); + return (CompoundNBT != null && CompoundNBT.contains("display", 10)) && CompoundNBT.getCompound("display").contains("color", 3); + } + + @Override + public int getColor(ItemStack stack) { + return this.getColor(stack, 1); + } + + @Override + public void clearColor(ItemStack stack) { + this.removeColor(stack, 1); + } + + @Override + public void setColor(ItemStack stack, int color) { + this.setColor(stack, color, 1); + } + + public int getColor(ItemStack stack, int type) { + String string = "";//type == 0 ? "" : ("" + type); + CompoundTag stackTagCompound = stack.getTag(); + + int color = 0xBDCFD9; + + if (stackTagCompound != null) { + CompoundTag displayCompound = stackTagCompound.getCompound("display"); + + if (displayCompound.contains("color" + string, 3)) + color = displayCompound.getInt("color" + string); + } + + if (type == 0) { + return 0xFFFFFF; + } + return color; + } + + public void removeColor(ItemStack stack, int type) { + String string = ""; + CompoundTag stackTagCompound = stack.getTag(); + + if (stackTagCompound != null) { + CompoundTag displayCompound = stackTagCompound.getCompound("display"); + + if (displayCompound.contains("color" + string)) + displayCompound.remove("color" + string); + + if (displayCompound.contains("hasColor")) + displayCompound.putBoolean("hasColor", false); + } + } + + public void setColor(ItemStack stack, int color, int type) { + String string = ""; + CompoundTag stackTagCompound = stack.getTag(); + + if (stackTagCompound == null) { + stackTagCompound = new CompoundTag(); + stack.setTag(stackTagCompound); + } + + CompoundTag displayCompound = stackTagCompound.getCompound("display"); + + if (!stackTagCompound.contains("display", 10)) + stackTagCompound.put("display", displayCompound); + + displayCompound.putInt("color" + string, color); + displayCompound.putBoolean("hasColor", true); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void appendHoverText(ItemStack stack, @Nullable Level level, List tooltip, TooltipFlag flagIn) { + super.appendHoverText(stack, level, tooltip, flagIn); + tooltip.add(TOOLTIP); + } + + @Override + public boolean canWalkOnPowderedSnow(ItemStack stack, LivingEntity wearer) { + return stack.is(TFItems.ARCTIC_BOOTS.get()); + } + + @Override + public void initializeClient(Consumer consumer) { + consumer.accept(ArmorRender.INSTANCE); + } + + private static final class ArmorRender implements IClientItemExtensions { + private static final ArmorRender INSTANCE = new ArmorRender(); + + @Override + public @NotNull HumanoidModel getHumanoidArmorModel(LivingEntity living, ItemStack stack, EquipmentSlot slot, HumanoidModel model) { + EntityModelSet models = Minecraft.getInstance().getEntityModels(); + ModelPart root = models.bakeLayer(slot == EquipmentSlot.LEGS ? TFModelLayers.ARCTIC_ARMOR_INNER : TFModelLayers.ARCTIC_ARMOR_OUTER); + return new TFArmorModel(root); + } + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/item/BehaviorTFMobEggDispense.java b/src/main/java/twilightforest/item/BehaviorTFMobEggDispense.java deleted file mode 100644 index 33d4a1dfd2..0000000000 --- a/src/main/java/twilightforest/item/BehaviorTFMobEggDispense.java +++ /dev/null @@ -1,32 +0,0 @@ -package twilightforest.item; - -import net.minecraft.dispenser.BehaviorDefaultDispenseItem; -import net.minecraft.dispenser.IBlockSource; -import net.minecraft.item.ItemStack; -import net.minecraft.server.MinecraftServer; -import net.minecraft.util.EnumFacing; - -public class BehaviorTFMobEggDispense extends BehaviorDefaultDispenseItem -{ - /** Reference to the MinecraftServer object. */ - final MinecraftServer mcServer; - - public BehaviorTFMobEggDispense(MinecraftServer par1) - { - this.mcServer = par1; - } - - /** - * Dispense the specified stack, play the dispense sound and spawn particles. - */ - public ItemStack dispenseStack(IBlockSource par1IBlockSource, ItemStack par2ItemStack) - { - EnumFacing facing = EnumFacing.getFront(par1IBlockSource.getBlockMetadata()); - double x = par1IBlockSource.getX() + (double)facing.getFrontOffsetX(); - double y = (double)((float)par1IBlockSource.getYInt() + 0.2F); - double z = par1IBlockSource.getZ() + (double)facing.getFrontOffsetZ(); - ItemTFSpawnEgg.spawnCreature(par1IBlockSource.getWorld(), par2ItemStack.getItemDamage(), x, y, z); - par2ItemStack.splitStack(1); - return par2ItemStack; - } -} diff --git a/src/main/java/twilightforest/item/BrittleFlaskItem.java b/src/main/java/twilightforest/item/BrittleFlaskItem.java new file mode 100644 index 0000000000..e7c3878f5c --- /dev/null +++ b/src/main/java/twilightforest/item/BrittleFlaskItem.java @@ -0,0 +1,212 @@ +package twilightforest.item; + +import net.minecraft.ChatFormatting; +import net.minecraft.core.NonNullList; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.stats.Stats; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.SlotAccess; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.ClickAction; +import net.minecraft.world.inventory.Slot; +import net.minecraft.world.item.*; +import net.minecraft.world.item.alchemy.Potion; +import net.minecraft.world.item.alchemy.PotionUtils; +import net.minecraft.world.item.alchemy.Potions; +import net.minecraft.world.level.Level; +import org.jetbrains.annotations.Nullable; +import twilightforest.advancements.TFAdvancements; +import twilightforest.init.TFSounds; + +import java.util.List; + +public class BrittleFlaskItem extends Item { + + private static Potion lastUsedPotion; + private static int timesUsed; + private static boolean advancementWindow; + public static int seconds; + + public BrittleFlaskItem(Properties properties) { + super(properties); + } + + @Override + public ItemStack getDefaultInstance() { + ItemStack stack = new ItemStack(this); + stack.getOrCreateTag().putInt("Uses", 0); + stack.getOrCreateTag().putInt("Breakage", 0); + stack.getOrCreateTag().putBoolean("Refillable", true); + PotionUtils.setPotion(stack, Potions.EMPTY); + return stack; + } + + @Override + public boolean isBarVisible(ItemStack stack) { + return PotionUtils.getPotion(stack) != Potions.EMPTY; + } + + @Override + public int getBarColor(ItemStack stack) { + return PotionUtils.getColor(stack); + } + + @Override + public boolean overrideOtherStackedOnMe(ItemStack stack, ItemStack other, Slot slot, ClickAction action, Player player, SlotAccess access) { + CompoundTag flaskTag = stack.getTag(); + CompoundTag potionTag = other.getTag(); + + if (flaskTag != null && potionTag != null) { + if (action == ClickAction.SECONDARY && other.is(Items.POTION)) { + if (potionTag.contains("Potion") && this.canBeRefilled(stack)) { + if (flaskTag.contains("Potion") && flaskTag.getString("Potion").equals(potionTag.getString("Potion")) && flaskTag.getInt("Uses") < 4) { + if (!player.getAbilities().instabuild) { + other.shrink(1); + player.getInventory().add(new ItemStack(Items.GLASS_BOTTLE)); + } + flaskTag.putInt("Uses", flaskTag.getInt("Uses") + 1); + player.playSound(TFSounds.FLASK_FILL.get(), flaskTag.getInt("Uses") * 0.25F, player.getLevel().getRandom().nextFloat() * 0.1F + 0.9F); + return true; + } else if (!flaskTag.contains("Potion")) { + if (!player.getAbilities().instabuild) { + other.shrink(1); + player.getInventory().add(new ItemStack(Items.GLASS_BOTTLE)); + } + flaskTag.putString("Potion", potionTag.getString("Potion")); + flaskTag.putInt("Uses", flaskTag.getInt("Uses") + 1); + player.playSound(TFSounds.FLASK_FILL.get(), flaskTag.getInt("Uses") * 0.25F, player.getLevel().getRandom().nextFloat() * 0.1F + 0.9F); + return true; + } + } + } + } + return false; + } + + @Override + public InteractionResultHolder use(Level level, Player player, InteractionHand hand) { + ItemStack stack = player.getItemInHand(hand); + CompoundTag tag = stack.getTag(); + + if (tag != null && tag.contains("Potion") && tag.getString("Potion").equals(Potions.EMPTY.toString())) { + return InteractionResultHolder.fail(player.getItemInHand(hand)); + } + + if (tag != null && tag.contains("Uses") && tag.getInt("Uses") > 0) { + return ItemUtils.startUsingInstantly(level, player, hand); + } + + return InteractionResultHolder.fail(player.getItemInHand(hand)); + } + + public int getUseDuration(ItemStack stack) { + return 32; + } + + public UseAnim getUseAnimation(ItemStack stack) { + return UseAnim.DRINK; + } + + @Override + public ItemStack finishUsingItem(ItemStack stack, Level level, LivingEntity entity) { + CompoundTag tag = stack.getTag(); + if (tag != null) { + if (entity instanceof Player player) { + if (!level.isClientSide()) { + if (!player.isCreative()) addTowardsAdvancement(Potion.byName(tag.getString("Potion")), player); + for (MobEffectInstance mobeffectinstance : PotionUtils.getMobEffects(stack)) { + if (mobeffectinstance.getEffect().isInstantenous()) { + mobeffectinstance.getEffect().applyInstantenousEffect(player, player, player, mobeffectinstance.getAmplifier(), 1.0D); + } else { + player.addEffect(new MobEffectInstance(mobeffectinstance)); + } + } + } + player.awardStat(Stats.ITEM_USED.get(this)); + if (!player.getAbilities().instabuild) { + tag.putInt("Uses", tag.getInt("Uses") - 1); + } + + if (tag.getInt("Uses") <= 0) { + tag.remove("Potion"); + } + + if (this.canBreak() && !player.getAbilities().instabuild) { + if (tag.getInt("Uses") <= 0) { + stack.shrink(1); + level.playSound(null, player, TFSounds.BRITTLE_FLASK_BREAK.get(), player.getSoundSource(), 1.5F, 0.7F); + } else { + tag.putInt("Breakage", tag.getInt("Breakage") + 1); + tag.putBoolean("Refillable", false); + level.playSound(null, player, TFSounds.BRITTLE_FLASK_CRACK.get(), player.getSoundSource(), 1.5F, 2.0F); + } + } + } + } + return super.finishUsingItem(stack, level, entity); + } + + private void addTowardsAdvancement(Potion potionDrank, Player drinker) { + if (lastUsedPotion == null) { + lastUsedPotion = Potions.EMPTY; + } + + if (!lastUsedPotion.equals(potionDrank)) { + timesUsed = 1; + lastUsedPotion = potionDrank; + advancementWindow = true; + } else { + timesUsed++; + } + + if (drinker instanceof ServerPlayer player && drinker.isAlive() && advancementWindow) { + TFAdvancements.DRINK_FROM_FLASK.trigger(player, timesUsed, lastUsedPotion); + } + } + + public static void ticker() { + if (advancementWindow) seconds++; + + if (seconds == 8) { + advancementWindow = false; + timesUsed = 0; + lastUsedPotion = null; + seconds = 0; + } + } + + public boolean canBreak() { + return true; + } + + public boolean canBeRefilled(ItemStack stack) { + if (stack.getTag() != null && stack.getTag().contains("Refillable")) { + return stack.getTag() != null && stack.getTag().getBoolean("Refillable"); + } + return true; + } + + @Override + public void appendHoverText(ItemStack stack, @Nullable Level level, List tooltip, TooltipFlag flag) { + PotionUtils.addPotionTooltip(stack, tooltip, 1.0F); + if (stack.getTag() != null) { + tooltip.add(Component.translatable("item.twilightforest.flask.doses", stack.getTag().getInt("Uses"), 4).withStyle(ChatFormatting.GRAY)); + if (stack.getTag().contains("Refillable") && !stack.getTag().getBoolean("Refillable")) + tooltip.add(Component.translatable("item.twilightforest.flask_no_refill").withStyle(ChatFormatting.RED)); + } + } + + //copied from Item.getBarWidth, but reversed the "durability" check so it increments up, not down + @Override + public int getBarWidth(ItemStack stack) { + if (stack.getTag() != null) { + return Math.round(13.0F - Math.abs(stack.getTag().getInt("Uses") - 4) * 13.0F / 4); + } + return 0; + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/item/ChainBlockItem.java b/src/main/java/twilightforest/item/ChainBlockItem.java new file mode 100644 index 0000000000..e7923d25f2 --- /dev/null +++ b/src/main/java/twilightforest/item/ChainBlockItem.java @@ -0,0 +1,143 @@ +package twilightforest.item; + +import net.minecraft.server.level.ServerLevel; +import net.minecraft.tags.BlockTags; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.*; +import net.minecraft.world.item.enchantment.Enchantment; +import net.minecraft.world.item.enchantment.EnchantmentCategory; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.common.TierSortingRegistry; +import org.jetbrains.annotations.Nullable; +import twilightforest.data.tags.ItemTagGenerator; +import twilightforest.entity.ChainBlock; +import twilightforest.init.TFEnchantments; +import twilightforest.init.TFEntities; +import twilightforest.init.TFSounds; + +import java.util.UUID; + +public class ChainBlockItem extends Item { + + private static final String THROWN_UUID_KEY = "chainEntity"; + + public ChainBlockItem(Properties properties) { + super(properties); + } + + @Override + public boolean isBookEnchantable(ItemStack stack, ItemStack book) { + return this.canApplyEnchantment(EnchantmentHelper.getEnchantments(stack).keySet().toArray(new Enchantment[0])) || super.isBookEnchantable(stack, book); + } + + @Override + public boolean canApplyAtEnchantingTable(ItemStack stack, Enchantment enchantment) { + return this.canApplyEnchantment(enchantment) || super.canApplyAtEnchantingTable(stack, enchantment); + } + + private boolean canApplyEnchantment(Enchantment... enchantments) { + for (Enchantment enchantment : enchantments) { + if (enchantment.category == EnchantmentCategory.DIGGER || enchantment.canEnchant(Items.IRON_AXE.getDefaultInstance())) + return true; + } + return false; + } + + @Override + public void inventoryTick(ItemStack stack, Level level, Entity holder, int slot, boolean isSelected) { + if (!level.isClientSide() && getThrownUuid(stack) != null && this.getThrownEntity(level, stack) == null) { + stack.getTag().remove(THROWN_UUID_KEY); + } + } + + @Override + public InteractionResultHolder use(Level level, Player player, InteractionHand hand) { + ItemStack stack = player.getItemInHand(hand); + + if (getThrownUuid(stack) != null) + return new InteractionResultHolder<>(InteractionResult.PASS, stack); + + player.playSound(TFSounds.BLOCK_AND_CHAIN_FIRED.get(), 0.5F, 1.0F / (level.getRandom().nextFloat() * 0.4F + 1.2F)); + + if (!level.isClientSide()) { + ChainBlock launchedBlock = new ChainBlock(TFEntities.CHAIN_BLOCK.get(), level, player, hand, stack); + level.addFreshEntity(launchedBlock); + this.setThrownEntity(stack, launchedBlock); + } + + player.startUsingItem(hand); + return new InteractionResultHolder<>(InteractionResult.SUCCESS, stack); + } + + @Nullable + public static UUID getThrownUuid(ItemStack stack) { + if (stack.hasTag() && stack.getTag().hasUUID(THROWN_UUID_KEY)) { + return stack.getTag().getUUID(THROWN_UUID_KEY); + } + + return null; + } + + @Nullable + private ChainBlock getThrownEntity(Level level, ItemStack stack) { + if (level instanceof ServerLevel server) { + UUID id = getThrownUuid(stack); + if (id != null) { + Entity e = server.getEntity(id); + if (e instanceof ChainBlock) { + return (ChainBlock) e; + } + } + } + + return null; + } + + private void setThrownEntity(ItemStack stack, ChainBlock cube) { + stack.getOrCreateTag().putUUID(THROWN_UUID_KEY, cube.getUUID()); + } + + @Override + public int getUseDuration(ItemStack stack) { + return 72000; + } + + @Override + public UseAnim getUseAnimation(ItemStack stack) { + return UseAnim.BLOCK; + } + + @Override + public boolean isValidRepairItem(ItemStack stack, ItemStack repairItem) { + return repairItem.is(ItemTagGenerator.KNIGHTMETAL_INGOTS); + } + + @Override + public boolean isCorrectToolForDrops(ItemStack stack, BlockState state) { + //dont try to check harvest level if we arent thrown + if (stack.getTag() == null || !stack.getTag().contains(THROWN_UUID_KEY)) return false; + if (EnchantmentHelper.getTagEnchantmentLevel(TFEnchantments.DESTRUCTION.get(), stack) > 0) { + if (state.is(BlockTags.MINEABLE_WITH_PICKAXE) || state.is(BlockTags.MINEABLE_WITH_HOE) + || state.is(BlockTags.MINEABLE_WITH_SHOVEL) || state.is(BlockTags.MINEABLE_WITH_AXE)) + return TierSortingRegistry.isCorrectTierForDrops(this.getHarvestLevel(stack), state); + } + return false; + } + + public Tier getHarvestLevel(ItemStack stack) { + int enchantLevel = EnchantmentHelper.getTagEnchantmentLevel(TFEnchantments.DESTRUCTION.get(), stack); + if (enchantLevel == 2) { + return Tiers.STONE; + } else if (enchantLevel >= 3) { + return Tiers.IRON; + } else { + return Tiers.WOOD; + } + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/item/CreativeTabTwilightForest.java b/src/main/java/twilightforest/item/CreativeTabTwilightForest.java deleted file mode 100644 index 1342446be5..0000000000 --- a/src/main/java/twilightforest/item/CreativeTabTwilightForest.java +++ /dev/null @@ -1,22 +0,0 @@ -package twilightforest.item; - -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.item.Item; -import twilightforest.block.TFBlocks; - -public class CreativeTabTwilightForest extends CreativeTabs -{ - - public CreativeTabTwilightForest(String label) { - super(label); - } - - /** - * Get the ItemStack that will be rendered to the tab. - */ - @Override - public Item getTabIconItem() - { - return Item.getItemFromBlock(TFBlocks.fireflyJar); - } -} diff --git a/src/main/java/twilightforest/item/CrumbleHornItem.java b/src/main/java/twilightforest/item/CrumbleHornItem.java new file mode 100644 index 0000000000..bf3d0d4f8a --- /dev/null +++ b/src/main/java/twilightforest/item/CrumbleHornItem.java @@ -0,0 +1,159 @@ +package twilightforest.item; + +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.stats.Stats; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.UseAnim; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.event.ForgeEventFactory; +import net.minecraftforge.event.level.BlockEvent; +import twilightforest.init.TFRecipes; +import twilightforest.init.TFSounds; +import twilightforest.init.TFStats; +import twilightforest.util.WorldUtil; + +import java.util.concurrent.atomic.AtomicBoolean; + +public class CrumbleHornItem extends Item { + + private static final int CHANCE_HARVEST = 20; + private static final int CHANCE_CRUMBLE = 5; + + public CrumbleHornItem(Properties properties) { + super(properties); + } + + @Override + public InteractionResultHolder use(Level level, Player player, InteractionHand hand) { + player.startUsingItem(hand); + player.playSound(TFSounds.QUEST_RAM_AMBIENT.get(), 1.0F, 0.8F); + return new InteractionResultHolder<>(InteractionResult.SUCCESS, player.getItemInHand(hand)); + } + + @Override + public void onUseTick(Level level, LivingEntity living, ItemStack stack, int count) { + if (count > 10 && count % 5 == 0 && !living.getLevel().isClientSide()) { + int crumbled = doCrumble(living.getLevel(), living); + + if (crumbled > 0) { + stack.hurtAndBreak(crumbled, living, (user) -> user.broadcastBreakEvent(living.getUsedItemHand())); + } + + living.getLevel().playSound(null, living.getX(), living.getY(), living.getZ(), TFSounds.QUEST_RAM_AMBIENT.get(), living.getSoundSource(), 1.0F, 0.8F); + } + } + + @Override + public UseAnim getUseAnimation(ItemStack stack) { + return UseAnim.BOW; + } + + @Override + public int getUseDuration(ItemStack stack) { + return 72000; + } + + @Override + public boolean canContinueUsing(ItemStack oldStack, ItemStack newStack) { + return oldStack.getItem() == newStack.getItem(); + } + + @Override + public boolean shouldCauseReequipAnimation(ItemStack oldStack, ItemStack newStack, boolean slotChanged) { + return slotChanged || newStack.getItem() != oldStack.getItem(); + } + + private int doCrumble(Level world, LivingEntity living) { + + final double range = 3.0D; + final double radius = 2.0D; + + Vec3 srcVec = new Vec3(living.getX(), living.getY() + living.getEyeHeight(), living.getZ()); + Vec3 lookVec = living.getLookAngle().scale(range); + Vec3 destVec = srcVec.add(lookVec); + + AABB crumbleBox = new AABB(destVec.x() - radius, destVec.y() - radius, destVec.z() - radius, destVec.x() + radius, destVec.y() + radius, destVec.z() + radius); + + return crumbleBlocksInAABB(world, living, crumbleBox); + } + + private int crumbleBlocksInAABB(Level world, LivingEntity living, AABB box) { + int crumbled = 0; + for (BlockPos pos : WorldUtil.getAllInBB(box)) { + if (crumbleBlock(world, living, pos)) { + crumbled++; + if (living instanceof Player player && player instanceof ServerPlayer) { + player.awardStat(TFStats.BLOCKS_CRUMBLED.get()); + } + } + } + return crumbled; + } + + private boolean crumbleBlock(Level world, LivingEntity living, BlockPos pos) { + + BlockState state = world.getBlockState(pos); + Block block = state.getBlock(); + AtomicBoolean flag = new AtomicBoolean(false); + + if (state.isAir()) return false; + + if (living instanceof Player) { + if (MinecraftForge.EVENT_BUS.post(new BlockEvent.BreakEvent(world, pos, state, (Player) living))) + return false; + } + + if (world instanceof ServerLevel level) { + level.getRecipeManager().getAllRecipesFor(TFRecipes.CRUMBLE_RECIPE.get()).forEach(recipe -> { + if (flag.get()) return; + if (recipe.result().is(Blocks.AIR)) { + if (recipe.input().is(block) && world.getRandom().nextInt(CHANCE_HARVEST) == 0 && !flag.get()) { + if (living instanceof Player) { + if (block.canHarvestBlock(state, world, pos, (Player) living)) { + world.removeBlock(pos, false); + block.playerDestroy(world, (Player) living, pos, state, world.getBlockEntity(pos), ItemStack.EMPTY); + world.levelEvent(2001, pos, Block.getId(state)); + postTrigger(living); + flag.set(true); + } + } else if (ForgeEventFactory.getMobGriefingEvent(world, living)) { + world.destroyBlock(pos, true); + postTrigger(living); + flag.set(true); + } + } + } else { + if (recipe.input().is(block) && world.getRandom().nextInt(CHANCE_CRUMBLE) == 0 && !flag.get()) { + world.setBlock(pos, recipe.result().getBlock().withPropertiesOf(state), 3); + world.levelEvent(2001, pos, Block.getId(state)); + postTrigger(living); + flag.set(true); + } + } + }); + } + + return flag.get(); + } + + private void postTrigger(LivingEntity living) { + if (living instanceof ServerPlayer) { + Player player = (Player) living; + player.awardStat(Stats.ITEM_USED.get(this)); + } + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/item/CubeOfAnnihilationItem.java b/src/main/java/twilightforest/item/CubeOfAnnihilationItem.java new file mode 100644 index 0000000000..981f756701 --- /dev/null +++ b/src/main/java/twilightforest/item/CubeOfAnnihilationItem.java @@ -0,0 +1,98 @@ +package twilightforest.item; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.UseAnim; +import net.minecraft.world.level.Level; +import org.jetbrains.annotations.Nullable; +import twilightforest.entity.CubeOfAnnihilation; +import twilightforest.init.TFEntities; + +import java.util.UUID; + +public class CubeOfAnnihilationItem extends Item { + + private static final String THROWN_UUID_KEY = "cubeEntity"; + + public CubeOfAnnihilationItem(Properties properties) { + super(properties); + } + + @Override + public void inventoryTick(ItemStack stack, Level level, Entity holder, int slot, boolean isSelected) { + if (!level.isClientSide() && getThrownUuid(stack) != null && getThrownEntity(level, stack) == null) { + stack.getTag().remove(THROWN_UUID_KEY); + } + } + + @Override + public InteractionResultHolder use(Level level, Player player, InteractionHand hand) { + ItemStack stack = player.getItemInHand(hand); + + if (getThrownUuid(stack) != null) + return new InteractionResultHolder<>(InteractionResult.PASS, stack); + + if (!level.isClientSide()) { + CubeOfAnnihilation launchedCube = new CubeOfAnnihilation(TFEntities.CUBE_OF_ANNIHILATION.get(), level, player); + level.addFreshEntity(launchedCube); + setThrownEntity(stack, launchedCube); + } + + player.startUsingItem(hand); + return new InteractionResultHolder<>(InteractionResult.SUCCESS, stack); + } + + @Nullable + public static UUID getThrownUuid(ItemStack stack) { + if (stack.hasTag() && stack.getTag().hasUUID(THROWN_UUID_KEY)) { + return stack.getTag().getUUID(THROWN_UUID_KEY); + } + + return null; + } + + @Nullable + private static CubeOfAnnihilation getThrownEntity(Level level, ItemStack stack) { + if (level instanceof ServerLevel server) { + UUID id = getThrownUuid(stack); + if (id != null) { + Entity e = server.getEntity(id); + if (e instanceof CubeOfAnnihilation) { + return (CubeOfAnnihilation) e; + } + } + } + + return null; + } + + private static void setThrownEntity(ItemStack stack, CubeOfAnnihilation cube) { + if (!stack.hasTag()) { + stack.setTag(new CompoundTag()); + } + stack.getTag().putUUID(THROWN_UUID_KEY, cube.getUUID()); + } + + @Override + public int getUseDuration(ItemStack stack) { + return 72000; + } + + @Override + public UseAnim getUseAnimation(ItemStack stack) { + return UseAnim.BLOCK; + } + + @Override + public boolean canDisableShield(ItemStack stack, ItemStack shield, LivingEntity entity, LivingEntity attacker) { + return true; + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/item/CuriosCharmItem.java b/src/main/java/twilightforest/item/CuriosCharmItem.java new file mode 100644 index 0000000000..051c056d4c --- /dev/null +++ b/src/main/java/twilightforest/item/CuriosCharmItem.java @@ -0,0 +1,27 @@ +package twilightforest.item; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.common.capabilities.ICapabilityProvider; +import net.minecraftforge.fml.ModList; +import org.jetbrains.annotations.Nullable; +import twilightforest.compat.curios.CuriosCompat; + +public class CuriosCharmItem extends Item { + + public CuriosCharmItem(Properties props) { + super(props); + } + + @Nullable + @Override + public ICapabilityProvider initCapabilities(ItemStack stack, @Nullable CompoundTag nbt) { + if (ModList.get().isLoaded("curios")) { + //the only reason we do this is because we get a NoClassDefFoundError if curios isnt installed since the class is loaded for some reason. + //Since CuriosCompat is only loaded when the mod is available this works fine. + return CuriosCompat.setupCuriosCapability(stack); + } + return super.initCapabilities(stack, nbt); + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/item/EmptyMagicMapItem.java b/src/main/java/twilightforest/item/EmptyMagicMapItem.java new file mode 100644 index 0000000000..b539ece69d --- /dev/null +++ b/src/main/java/twilightforest/item/EmptyMagicMapItem.java @@ -0,0 +1,50 @@ +package twilightforest.item; + +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.stats.Stats; +import net.minecraft.util.Mth; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ComplexItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import twilightforest.TwilightForestMod; +import twilightforest.world.registration.TFGenerationSettings; + +public class EmptyMagicMapItem extends ComplexItem { + public EmptyMagicMapItem(Properties properties) { + super(properties); + } + + // [VanillaCopy] ItemEmptyMap.onItemRightClick, edits noted + @Override + public InteractionResultHolder use(Level level, Player player, InteractionHand hand) { + ItemStack emptyMapStack = player.getItemInHand(hand); + if (level.isClientSide()) + return InteractionResultHolder.pass(emptyMapStack); + if(level instanceof ServerLevel server && !TFGenerationSettings.usesTwilightChunkGenerator(server)) { + player.displayClientMessage(Component.translatable("misc.twilightforest.magic_map_fail"), true); + return InteractionResultHolder.fail(emptyMapStack); + } + // TF - scale at 4 + ItemStack newMapStack = MagicMapItem.setupNewMap(level, Mth.floor(player.getX()), Mth.floor(player.getZ()), (byte) 4, true, false); + if (!player.getAbilities().instabuild) { + emptyMapStack.shrink(1); + } + + if (emptyMapStack.isEmpty()) { + return InteractionResultHolder.success(newMapStack); + } else { + if (!player.getInventory().add(newMapStack.copy())) { + player.drop(newMapStack, false); + } + + player.awardStat(Stats.ITEM_USED.get(this)); + player.getLevel().playSound(null, player, SoundEvents.UI_CARTOGRAPHY_TABLE_TAKE_RESULT, player.getSoundSource(), 1.0F, 1.0F); + return InteractionResultHolder.success(emptyMapStack); + } + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/item/EmptyMazeMapItem.java b/src/main/java/twilightforest/item/EmptyMazeMapItem.java new file mode 100644 index 0000000000..db23be3ca9 --- /dev/null +++ b/src/main/java/twilightforest/item/EmptyMazeMapItem.java @@ -0,0 +1,42 @@ +package twilightforest.item; + +import net.minecraft.sounds.SoundEvents; +import net.minecraft.stats.Stats; +import net.minecraft.util.Mth; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ComplexItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; + +public class EmptyMazeMapItem extends ComplexItem { + final boolean mapOres; + + public EmptyMazeMapItem(boolean mapOres, Properties properties) { + super(properties); + this.mapOres = mapOres; + } + + // [VanillaCopy] MapItem.onItemRightClick calling own setup method + @Override + public InteractionResultHolder use(Level level, Player player, InteractionHand hand) { + ItemStack itemstack = MazeMapItem.setupNewMap(level, Mth.floor(player.getX()), Mth.floor(player.getZ()), (byte) 0, true, false, Mth.floor(player.getY()), this.mapOres); + ItemStack itemstack1 = player.getItemInHand(hand); + if (!player.getAbilities().instabuild) { + itemstack1.shrink(1); + } + + if (itemstack1.isEmpty()) { + return InteractionResultHolder.success(itemstack); + } else { + if (!player.getInventory().add(itemstack.copy())) { + player.drop(itemstack, false); + } + + player.awardStat(Stats.ITEM_USED.get(this)); + player.getLevel().playSound(null, player, SoundEvents.UI_CARTOGRAPHY_TABLE_TAKE_RESULT, player.getSoundSource(), 1.0F, 1.0F); + return InteractionResultHolder.success(itemstack1); + } + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/item/EnderBowItem.java b/src/main/java/twilightforest/item/EnderBowItem.java new file mode 100644 index 0000000000..84a9728dfe --- /dev/null +++ b/src/main/java/twilightforest/item/EnderBowItem.java @@ -0,0 +1,18 @@ +package twilightforest.item; + +import net.minecraft.world.entity.projectile.AbstractArrow; +import net.minecraft.world.item.BowItem; + +public class EnderBowItem extends BowItem { + public static final String KEY = "twilightforest:ender"; + + public EnderBowItem(Properties properties) { + super(properties); + } + + @Override + public AbstractArrow customArrow(AbstractArrow arrow) { + arrow.getPersistentData().putBoolean(KEY, true); + return arrow; + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/item/Experiment115Item.java b/src/main/java/twilightforest/item/Experiment115Item.java new file mode 100644 index 0000000000..1fc33182cd --- /dev/null +++ b/src/main/java/twilightforest/item/Experiment115Item.java @@ -0,0 +1,43 @@ +package twilightforest.item; + +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import twilightforest.init.TFStats; + +import static twilightforest.TwilightForestMod.prefix; + +public class Experiment115Item extends BlockItem { + public static final ResourceLocation THINK = prefix("think"); + public static final ResourceLocation FULL = prefix("full"); + + public Experiment115Item(Block block, Properties properties) { + super(block, properties); + } + + @Override + public InteractionResult useOn(UseOnContext context) { + Player player = context.getPlayer(); + if (!player.isShiftKeyDown()) { + InteractionResult actionresulttype = this.place(new BlockPlaceContext(context)); + return !actionresulttype.consumesAction() && this.isEdible() ? this.use(context.getLevel(), context.getPlayer(), context.getHand()).getResult() : actionresulttype; + } + return InteractionResult.PASS; + } + + @Override + public ItemStack finishUsingItem(ItemStack stack, Level level, LivingEntity entity) { + if (entity instanceof ServerPlayer player) { + player.awardStat(TFStats.E115_SLICES_EATEN.get()); + } + return super.finishUsingItem(stack, level, entity); + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/item/FieryArmorItem.java b/src/main/java/twilightforest/item/FieryArmorItem.java new file mode 100644 index 0000000000..791b87a832 --- /dev/null +++ b/src/main/java/twilightforest/item/FieryArmorItem.java @@ -0,0 +1,98 @@ +package twilightforest.item; + +import net.minecraft.ChatFormatting; +import net.minecraft.client.Minecraft; +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.model.geom.EntityModelSet; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.network.chat.Style; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ArmorItem; +import net.minecraft.world.item.ArmorMaterial; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.item.enchantment.Enchantment; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.level.Level; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.client.extensions.common.IClientItemExtensions; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import twilightforest.TwilightForestMod; +import twilightforest.client.model.TFModelLayers; +import twilightforest.client.model.armor.FieryArmorModel; +import twilightforest.init.TFEnchantments; + +import java.util.List; +import java.util.Objects; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.function.Consumer; + +public class FieryArmorItem extends ArmorItem { + private static final MutableComponent TOOLTIP = Component.translatable("item.twilightforest.fiery_armor.desc").setStyle(Style.EMPTY.withColor(ChatFormatting.GRAY)); + + public FieryArmorItem(ArmorMaterial material, Type type, Properties properties) { + super(material, type, properties); + } + + @Override + public boolean isBookEnchantable(ItemStack stack, ItemStack book) { + AtomicBoolean badEnchant = new AtomicBoolean(); + EnchantmentHelper.getEnchantments(book).forEach((enchantment, integer) -> { + if (Objects.equals(Enchantments.THORNS, enchantment) || Objects.equals(TFEnchantments.CHILL_AURA.get(), enchantment) + || Objects.equals(TFEnchantments.FIRE_REACT.get(), enchantment) + || Objects.equals(Enchantments.FROST_WALKER, enchantment)) { + badEnchant.set(true); + } + }); + + return !badEnchant.get(); + } + + @Override + public boolean canApplyAtEnchantingTable(ItemStack stack, Enchantment enchantment) { + return !TFEnchantments.FIRE_REACT.get().equals(enchantment) && + !Enchantments.THORNS.equals(enchantment) && + !TFEnchantments.CHILL_AURA.get().equals(enchantment) && + !Enchantments.FROST_WALKER.equals(enchantment) && + super.canApplyAtEnchantingTable(stack, enchantment); + } + + @Override + public String getArmorTexture(ItemStack stack, Entity entity, EquipmentSlot slot, String layer) { + if (slot == EquipmentSlot.LEGS) { + return TwilightForestMod.ARMOR_DIR + "fiery_2.png"; + } else { + return TwilightForestMod.ARMOR_DIR + "fiery_1.png"; + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void appendHoverText(ItemStack stack, @Nullable Level level, List tooltip, TooltipFlag flags) { + super.appendHoverText(stack, level, tooltip, flags); + tooltip.add(TOOLTIP); + } + + @Override + public void initializeClient(Consumer consumer) { + consumer.accept(ArmorRender.INSTANCE); + } + + private static final class ArmorRender implements IClientItemExtensions { + private static final ArmorRender INSTANCE = new ArmorRender(); + + @Override + public @NotNull HumanoidModel getHumanoidArmorModel(LivingEntity living, ItemStack stack, EquipmentSlot slot, HumanoidModel model) { + EntityModelSet models = Minecraft.getInstance().getEntityModels(); + ModelPart root = models.bakeLayer(slot == EquipmentSlot.LEGS ? TFModelLayers.FIERY_ARMOR_INNER : TFModelLayers.FIERY_ARMOR_OUTER); + return new FieryArmorModel(root); + } + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/item/FieryPickItem.java b/src/main/java/twilightforest/item/FieryPickItem.java new file mode 100644 index 0000000000..02e7227d85 --- /dev/null +++ b/src/main/java/twilightforest/item/FieryPickItem.java @@ -0,0 +1,45 @@ +package twilightforest.item; + +import net.minecraft.ChatFormatting; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.PickaxeItem; +import net.minecraft.world.item.Tier; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public class FieryPickItem extends PickaxeItem { + + public FieryPickItem(Tier toolMaterial, Properties properties) { + super(toolMaterial, 1, -2.8F, properties); + } + + @Override + public boolean hurtEnemy(ItemStack stack, LivingEntity target, LivingEntity attacker) { + boolean result = super.hurtEnemy(stack, target, attacker); + + if (result && !target.fireImmune()) { + if (!target.getLevel().isClientSide()) { + target.setSecondsOnFire(15); + } else { + target.getLevel().addParticle(ParticleTypes.FLAME, target.getX(), target.getY() + target.getBbHeight() * 0.5, target.getZ(), target.getBbWidth() * 0.5, target.getBbHeight() * 0.5, target.getBbWidth() * 0.5); + } + } + + return result; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void appendHoverText(ItemStack stack, @Nullable Level level, List tooltip, TooltipFlag flags) { + super.appendHoverText(stack, level, tooltip, flags); + tooltip.add(Component.translatable(getDescriptionId() + ".desc").withStyle(ChatFormatting.GRAY)); + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/item/FierySwordItem.java b/src/main/java/twilightforest/item/FierySwordItem.java new file mode 100644 index 0000000000..a72afd2d98 --- /dev/null +++ b/src/main/java/twilightforest/item/FierySwordItem.java @@ -0,0 +1,64 @@ +package twilightforest.item; + +import net.minecraft.ChatFormatting; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.SwordItem; +import net.minecraft.world.item.Tier; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.item.enchantment.Enchantment; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.level.Level; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.fml.common.Mod; +import org.jetbrains.annotations.Nullable; +import twilightforest.TwilightForestMod; + +import java.util.List; + +@Mod.EventBusSubscriber(modid = TwilightForestMod.ID) +public class FierySwordItem extends SwordItem { + + public FierySwordItem(Tier toolMaterial, Properties properties) { + super(toolMaterial, 3, -2.4F, properties); + } + + @Override + public boolean canApplyAtEnchantingTable(ItemStack stack, Enchantment enchantment) { + return enchantment != Enchantments.FIRE_ASPECT && super.canApplyAtEnchantingTable(stack, enchantment); + } + + @Override + public boolean isBookEnchantable(ItemStack stack, ItemStack book) { + return !EnchantmentHelper.getEnchantments(book).containsKey(Enchantments.FIRE_ASPECT) && super.isBookEnchantable(stack, book); + } + + @Override + public boolean hurtEnemy(ItemStack stack, LivingEntity target, LivingEntity attacker) { + boolean result = super.hurtEnemy(stack, target, attacker); + + if (result && !target.getLevel().isClientSide() && !target.fireImmune()) { + target.setSecondsOnFire(15); + } else { + for (int var1 = 0; var1 < 20; ++var1) { + double px = target.getX() + target.getLevel().getRandom().nextFloat() * target.getBbWidth() * 2.0F - target.getBbWidth(); + double py = target.getY() + target.getLevel().getRandom().nextFloat() * target.getBbHeight(); + double pz = target.getZ() + target.getLevel().getRandom().nextFloat() * target.getBbWidth() * 2.0F - target.getBbWidth(); + target.getLevel().addParticle(ParticleTypes.FLAME, px, py, pz, 0.02, 0.02, 0.02); + } + } + + return result; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void appendHoverText(ItemStack stack, @Nullable Level level, List tooltip, TooltipFlag flag) { + super.appendHoverText(stack, level, tooltip, flag); + tooltip.add(Component.translatable(getDescriptionId() + ".desc").withStyle(ChatFormatting.GRAY)); + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/item/FortificationWandItem.java b/src/main/java/twilightforest/item/FortificationWandItem.java new file mode 100644 index 0000000000..d3f99515bf --- /dev/null +++ b/src/main/java/twilightforest/item/FortificationWandItem.java @@ -0,0 +1,70 @@ +package twilightforest.item; + +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.item.enchantment.Enchantment; +import net.minecraft.world.level.Level; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import org.jetbrains.annotations.Nullable; +import twilightforest.capabilities.CapabilityList; + +import javax.annotation.Nonnull; +import java.util.List; + +public class FortificationWandItem extends Item { + + public FortificationWandItem(Properties properties) { + super(properties); + } + + @Nonnull + @Override + public InteractionResultHolder use(Level level, Player player, @Nonnull InteractionHand hand) { + ItemStack stack = player.getItemInHand(hand); + + if (stack.getDamageValue() == stack.getMaxDamage()) { + return InteractionResultHolder.fail(stack); + } + + if (!level.isClientSide()) { + player.getCapability(CapabilityList.SHIELDS).ifPresent(cap -> { + cap.replenishShields(); + stack.hurt(1, level.getRandom(), null); + }); + } + + if (!player.isCreative()) + player.getCooldowns().addCooldown(this, 1200); + + return InteractionResultHolder.success(stack); + } + + @Override + public boolean isEnchantable(ItemStack stack) { + return false; + } + + @Override + public boolean isBookEnchantable(ItemStack stack, ItemStack book) { + return false; + } + + @Override + public boolean canApplyAtEnchantingTable(ItemStack stack, Enchantment enchantment) { + return false; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void appendHoverText(ItemStack stack, @Nullable Level level, List tooltip, TooltipFlag flags) { + super.appendHoverText(stack, level, tooltip, flags); + tooltip.add(Component.translatable("item.twilightforest.scepter.desc", stack.getMaxDamage() - stack.getDamageValue()).withStyle(ChatFormatting.GRAY)); + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/item/FurnaceFuelItem.java b/src/main/java/twilightforest/item/FurnaceFuelItem.java new file mode 100644 index 0000000000..85c980b328 --- /dev/null +++ b/src/main/java/twilightforest/item/FurnaceFuelItem.java @@ -0,0 +1,24 @@ +package twilightforest.item; + +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.ItemStack; + +import net.minecraft.world.item.Item.Properties; + +import org.jetbrains.annotations.Nullable; + +public class FurnaceFuelItem extends BlockItem { + private final int burntime; + + public FurnaceFuelItem(Block block, Properties properties, int burn) { + super(block, properties); + this.burntime = burn; + } + + @Override + public int getBurnTime(ItemStack stack, @Nullable RecipeType recipeType) { + return this.burntime; + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/item/GiantItem.java b/src/main/java/twilightforest/item/GiantItem.java new file mode 100644 index 0000000000..44d686ec04 --- /dev/null +++ b/src/main/java/twilightforest/item/GiantItem.java @@ -0,0 +1,8 @@ +package twilightforest.item; + +import java.util.UUID; + +public interface GiantItem { + UUID GIANT_REACH_MODIFIER = UUID.fromString("7f10172d-de69-49d7-81bd-9594286a6827"); + UUID GIANT_RANGE_MODIFIER = UUID.fromString("cafc02ed-392f-4bf4-b745-42beff107ec4"); +} diff --git a/src/main/java/twilightforest/item/GiantItemIcon.java b/src/main/java/twilightforest/item/GiantItemIcon.java deleted file mode 100644 index fc81cdb39d..0000000000 --- a/src/main/java/twilightforest/item/GiantItemIcon.java +++ /dev/null @@ -1,67 +0,0 @@ -package twilightforest.item; - -import net.minecraft.util.IIcon; - -public class GiantItemIcon implements IIcon { - - private IIcon baseIcon; - private float myX; - private float myY; - - public GiantItemIcon(IIcon blockIcon, float x, float y) { - this.baseIcon = blockIcon; - this.myX = x; - this.myY = y; - } - - @Override - public int getIconWidth() { - return this.baseIcon.getIconWidth() / 2; - } - - @Override - public int getIconHeight() { - return this.baseIcon.getIconHeight() / 2; - } - - @Override - public float getMinU() { - float f = this.baseIcon.getMaxU() - this.baseIcon.getMinU(); - return this.baseIcon.getMinU() + (f * myX); - } - - @Override - public float getMaxU() { - float f = this.baseIcon.getMaxU() - this.baseIcon.getMinU(); - return this.baseIcon.getMinU() + (f * (myX + 0.5F)); - } - - @Override - public float getInterpolatedU(double par1) { - float f = this.getMaxU() - this.getMinU(); - return this.getMinU() + f * (float)par1 / 16.0F; - } - - @Override - public float getMinV() { - float f = this.baseIcon.getMaxV() - this.baseIcon.getMinV(); - return this.baseIcon.getMinV() + (f * myY); - } - - @Override - public float getMaxV() { - float f = this.baseIcon.getMaxV() - this.baseIcon.getMinV(); - return this.baseIcon.getMinV() + (f * (myY + 0.5F)); - } - - @Override - public float getInterpolatedV(double par1) { - float f = this.getMaxV() - this.getMinV(); - return this.getMinV() + f * ((float)par1 / 16.0F); - } - - @Override - public String getIconName() { - return this.baseIcon.getIconName(); - } -} diff --git a/src/main/java/twilightforest/item/GiantPickItem.java b/src/main/java/twilightforest/item/GiantPickItem.java new file mode 100644 index 0000000000..4012e6e55b --- /dev/null +++ b/src/main/java/twilightforest/item/GiantPickItem.java @@ -0,0 +1,67 @@ +package twilightforest.item; + +import com.google.common.collect.ImmutableMultimap; +import com.google.common.collect.Multimap; +import net.minecraft.ChatFormatting; +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.ai.attributes.Attribute; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.PickaxeItem; +import net.minecraft.world.item.Tier; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.common.ForgeMod; +import org.jetbrains.annotations.Nullable; +import twilightforest.block.GiantBlock; +import twilightforest.capabilities.CapabilityList; +import twilightforest.init.TFBlocks; + +import java.util.List; + +public class GiantPickItem extends PickaxeItem implements GiantItem { + + public GiantPickItem(Tier material, Properties properties) { + super(material, 8, -3.5F, properties); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void appendHoverText(ItemStack stack, @Nullable Level level, List tooltip, TooltipFlag flags) { + super.appendHoverText(stack, level, tooltip, flags); + tooltip.add(Component.translatable(getDescriptionId() + ".desc").withStyle(ChatFormatting.GRAY)); + } + + @Override + public Multimap getDefaultAttributeModifiers(EquipmentSlot slot) { + ImmutableMultimap.Builder attributeBuilder = ImmutableMultimap.builder(); + attributeBuilder.putAll(super.getDefaultAttributeModifiers(slot)); + attributeBuilder.put(ForgeMod.BLOCK_REACH.get(), new AttributeModifier(GIANT_REACH_MODIFIER, "Reach modifier", 2.5, AttributeModifier.Operation.ADDITION)); + attributeBuilder.put(ForgeMod.ENTITY_REACH.get(), new AttributeModifier(GIANT_RANGE_MODIFIER, "Range modifier", 2.5, AttributeModifier.Operation.ADDITION)); + return slot == EquipmentSlot.MAINHAND ? attributeBuilder.build() : super.getDefaultAttributeModifiers(slot); + } + + @Override + public float getDestroySpeed(ItemStack stack, BlockState state) { + float destroySpeed = super.getDestroySpeed(stack, state); + // extra 64X strength vs giant obsidian + destroySpeed *= (state.getBlock() == TFBlocks.GIANT_OBSIDIAN.get()) ? 64 : 1; + // 64x strength vs giant blocks + return state.getBlock() instanceof GiantBlock ? destroySpeed * 64 : destroySpeed; + } + + @Override + public boolean canAttackBlock(BlockState pState, Level pLevel, BlockPos pPos, Player pPlayer) { + ItemStack stack = pPlayer.getMainHandItem(); + if (stack.is(this)) { + pPlayer.getCapability(CapabilityList.GIANT_PICK_MINE).ifPresent(cap -> cap.setMining(pLevel.getGameTime())); + } + return super.canAttackBlock(pState, pLevel, pPos, pPlayer); + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/item/GiantSwordItem.java b/src/main/java/twilightforest/item/GiantSwordItem.java new file mode 100644 index 0000000000..2436889bcf --- /dev/null +++ b/src/main/java/twilightforest/item/GiantSwordItem.java @@ -0,0 +1,33 @@ +package twilightforest.item; + +import com.google.common.collect.ImmutableMultimap; +import com.google.common.collect.Multimap; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.ai.attributes.Attribute; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.SwordItem; +import net.minecraft.world.item.Tier; +import net.minecraftforge.common.ForgeMod; +import twilightforest.init.TFItems; + +public class GiantSwordItem extends SwordItem implements GiantItem { + + public GiantSwordItem(Tier material, Properties props) { + super(material, 10, -3.5F, props); + } + + @Override + public Multimap getDefaultAttributeModifiers(EquipmentSlot slot) { + ImmutableMultimap.Builder attributeBuilder = ImmutableMultimap.builder(); + attributeBuilder.putAll(super.getDefaultAttributeModifiers(slot)); + attributeBuilder.put(ForgeMod.BLOCK_REACH.get(), new AttributeModifier(GIANT_REACH_MODIFIER, "Reach modifier", 2.5, AttributeModifier.Operation.ADDITION)); + attributeBuilder.put(ForgeMod.ENTITY_REACH.get(), new AttributeModifier(GIANT_RANGE_MODIFIER, "Range modifier", 2.5, AttributeModifier.Operation.ADDITION)); + return slot == EquipmentSlot.MAINHAND ? attributeBuilder.build() : super.getDefaultAttributeModifiers(slot); + } + + @Override + public boolean isValidRepairItem(ItemStack stack, ItemStack material) { + return material.getItem() == TFItems.IRONWOOD_INGOT.get() || super.isValidRepairItem(stack, material); + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/item/GlassSwordItem.java b/src/main/java/twilightforest/item/GlassSwordItem.java new file mode 100644 index 0000000000..9320f09fba --- /dev/null +++ b/src/main/java/twilightforest/item/GlassSwordItem.java @@ -0,0 +1,40 @@ +package twilightforest.item; + +import net.minecraft.core.particles.BlockParticleOption; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.SwordItem; +import net.minecraft.world.item.Tier; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.gameevent.GameEvent; +import twilightforest.init.TFSounds; + +public class GlassSwordItem extends SwordItem { + protected BlockParticleOption whiteGlass = new BlockParticleOption(ParticleTypes.BLOCK, Blocks.WHITE_STAINED_GLASS.defaultBlockState()); + + public GlassSwordItem(Tier toolMaterial, Properties properties) { + super(toolMaterial, 3, -2.4F, properties); + } + + @Override + public boolean hurtEnemy(ItemStack stack, LivingEntity target, LivingEntity attacker) { + if(target.getLevel() instanceof ServerLevel server) { + for (int i = 0; i < 20; i++) { + double px = target.getX() + target.getRandom().nextFloat() * target.getBbWidth() * 2.0F - target.getBbWidth(); + double py = target.getY() + target.getRandom().nextFloat() * target.getBbHeight(); + double pz = target.getZ() + target.getRandom().nextFloat() * target.getBbWidth() * 2.0F - target.getBbWidth(); + server.sendParticles(whiteGlass, px, py, pz, 1, 0, 0, 0, 0); + } + } + + stack.hurtAndBreak(stack.getMaxDamage() + 1, attacker, (user) -> { + user.getLevel().playSound(null, attacker.getX(), attacker.getY(), attacker.getZ(), TFSounds.GLASS_SWORD_BREAK.get(), attacker.getSoundSource(), 1F, 0.5F); + user.broadcastBreakEvent(InteractionHand.MAIN_HAND); + user.gameEvent(GameEvent.ITEM_INTERACT_FINISH); + }); + return true; + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/item/GreaterFlaskItem.java b/src/main/java/twilightforest/item/GreaterFlaskItem.java new file mode 100644 index 0000000000..34d9707f91 --- /dev/null +++ b/src/main/java/twilightforest/item/GreaterFlaskItem.java @@ -0,0 +1,48 @@ +package twilightforest.item; + +import net.minecraft.ChatFormatting; +import net.minecraft.core.NonNullList; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.CreativeModeTab; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Rarity; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.item.alchemy.PotionUtils; +import net.minecraft.world.item.alchemy.Potions; +import net.minecraft.world.level.Level; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public class GreaterFlaskItem extends BrittleFlaskItem { + + public GreaterFlaskItem(Properties properties) { + super(properties); + } + + @Override + public ItemStack getDefaultInstance() { + ItemStack stack = new ItemStack(this); + stack.getOrCreateTag().putInt("Uses", 0); + PotionUtils.setPotion(stack, Potions.EMPTY); + return stack; + } + + @Override + public Rarity getRarity(ItemStack stack) { + return PotionUtils.getMobEffects(stack).isEmpty() ? Rarity.UNCOMMON : Rarity.RARE; + } + + //no breaking + @Override + public boolean canBreak() { + return false; + } + + @Override + public void appendHoverText(ItemStack stack, @Nullable Level level, List tooltip, TooltipFlag flag) { + PotionUtils.addPotionTooltip(stack, tooltip, 1.0F); + if (stack.getTag() != null) + tooltip.add(Component.translatable("item.twilightforest.flask.doses", stack.getTag().getInt("Uses"), 4).withStyle(ChatFormatting.GRAY)); + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/item/HollowLogItem.java b/src/main/java/twilightforest/item/HollowLogItem.java new file mode 100644 index 0000000000..e92aa62ea3 --- /dev/null +++ b/src/main/java/twilightforest/item/HollowLogItem.java @@ -0,0 +1,59 @@ +package twilightforest.item; + +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.registries.RegistryObject; +import twilightforest.block.HollowLogClimbable; +import twilightforest.block.HollowLogHorizontal; +import twilightforest.block.HollowLogVertical; + +import org.jetbrains.annotations.Nullable; +import java.util.Map; + +public class HollowLogItem extends BlockItem { + private final HollowLogHorizontal horizontalLog; + private final HollowLogVertical verticalLog; + private final HollowLogClimbable climbable; + + public HollowLogItem(RegistryObject horizontalLog, RegistryObject verticalLog, RegistryObject climbable, Properties properties) { + super(verticalLog.get(), properties); + this.horizontalLog = horizontalLog.get(); + this.verticalLog = verticalLog.get(); + this.climbable = climbable.get(); + } + + @Nullable + @Override + protected BlockState getPlacementState(BlockPlaceContext context) { + return switch (context.getClickedFace().getAxis()) { + case Y -> this.verticalLog.getStateForPlacement(context); + case X, Z -> this.horizontalLog.getStateForPlacement(context); + }; + } + + @Override + public void registerBlocks(Map blockItemMap, Item item) { + super.registerBlocks(blockItemMap, item); + blockItemMap.put(this.horizontalLog, item); + blockItemMap.put(this.verticalLog, item); + blockItemMap.put(this.climbable, item); + } + + @Override + public void removeFromBlockToItemMap(Map blockItemMap, Item item) { + super.removeFromBlockToItemMap(blockItemMap, item); + blockItemMap.remove(this.horizontalLog); + blockItemMap.remove(this.verticalLog); + blockItemMap.remove(this.climbable); + } + + @Override + public int getBurnTime(ItemStack itemStack, @Nullable RecipeType recipeType) { + return 300; + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/item/HugeLilyPadItem.java b/src/main/java/twilightforest/item/HugeLilyPadItem.java new file mode 100644 index 0000000000..d87d07f45f --- /dev/null +++ b/src/main/java/twilightforest/item/HugeLilyPadItem.java @@ -0,0 +1,91 @@ +package twilightforest.item; + +import net.minecraft.advancements.CriteriaTriggers; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.stats.Stats; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.PlaceOnWaterBlockItem; +import net.minecraft.world.level.ClipContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.level.material.Fluids; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.HitResult; +import twilightforest.block.HugeLilyPadBlock; + +import static twilightforest.block.HugeLilyPadBlock.FACING; +import static twilightforest.block.HugeLilyPadBlock.PIECE; +import static twilightforest.enums.HugeLilypadPiece.*; + +public class HugeLilyPadItem extends PlaceOnWaterBlockItem { + + public HugeLilyPadItem(HugeLilyPadBlock block, Properties properties) { + super(block, properties); + } + + @Override + public InteractionResultHolder use(Level level, Player player, InteractionHand hand) { + ItemStack itemstack = player.getItemInHand(hand); + BlockHitResult raytraceresult = getPlayerPOVHitResult(level, player, ClipContext.Fluid.SOURCE_ONLY); + if (raytraceresult.getType() == HitResult.Type.MISS) { + return InteractionResultHolder.pass(itemstack); + } else { + if (raytraceresult.getType() == HitResult.Type.BLOCK) { + BlockPos blockpos = raytraceresult.getBlockPos(); + Direction direction = raytraceresult.getDirection(); + if (!level.mayInteract(player, blockpos) || !player.mayUseItemAt(blockpos.relative(direction), direction, itemstack) + // TF - check east, south, southeast as well + || !level.mayInteract(player, blockpos.east()) || !player.mayUseItemAt(blockpos.relative(direction).east(), direction, itemstack) + || !level.mayInteract(player, blockpos.south()) || !player.mayUseItemAt(blockpos.relative(direction).south(), direction, itemstack) + || !level.mayInteract(player, blockpos.east().south()) || !player.mayUseItemAt(blockpos.relative(direction).east().south(), direction, itemstack) + ) { + return InteractionResultHolder.fail(itemstack); + } + + BlockPos blockpos1 = blockpos.above(); + BlockState blockstate = level.getBlockState(blockpos); + Material material = blockstate.getMaterial(); + FluidState ifluidstate = level.getFluidState(blockpos); + if ((ifluidstate.getType() == Fluids.WATER || material == Material.ICE) && level.isEmptyBlock(blockpos1) + // TF - check east, south, southeast as well + && (level.getFluidState(blockpos.east()).getType() == Fluids.WATER || level.getBlockState(blockpos.east()).getMaterial() == Material.ICE) && level.isEmptyBlock(blockpos1.east()) + && (level.getFluidState(blockpos.south()).getType() == Fluids.WATER || level.getBlockState(blockpos.south()).getMaterial() == Material.ICE) && level.isEmptyBlock(blockpos1.south()) + && (level.getFluidState(blockpos.east().south()).getType() == Fluids.WATER || level.getBlockState(blockpos.east().south()).getMaterial() == Material.ICE) && level.isEmptyBlock(blockpos1.east().south()) + ) { + // TF - use our own block. dispense with the blocksnapshot stuff for now due to complexity. FIXME: Implement it + final BlockState lilypad = getBlock().defaultBlockState().setValue(FACING, player.getDirection()); + level.setBlock(blockpos1, lilypad.setValue(PIECE, NW), 11); + level.setBlock(blockpos1.east(), lilypad.setValue(PIECE, NE), 11); + level.setBlock(blockpos1.east().south(), lilypad.setValue(PIECE, SE), 11); + level.setBlock(blockpos1.south(), lilypad.setValue(PIECE, SW), 11); + + if (player instanceof ServerPlayer) { + CriteriaTriggers.PLACED_BLOCK.trigger((ServerPlayer) player, blockpos1, itemstack); + CriteriaTriggers.PLACED_BLOCK.trigger((ServerPlayer) player, blockpos1.east(), itemstack); + CriteriaTriggers.PLACED_BLOCK.trigger((ServerPlayer) player, blockpos1.east().south(), itemstack); + CriteriaTriggers.PLACED_BLOCK.trigger((ServerPlayer) player, blockpos1.south(), itemstack); + } + + if (!player.getAbilities().instabuild) { + itemstack.shrink(1); + } + + player.awardStat(Stats.ITEM_USED.get(this)); + level.playSound(player, blockpos, SoundEvents.LILY_PAD_PLACE, SoundSource.BLOCKS, 1.0F, 1.0F); + return InteractionResultHolder.success(itemstack); + } + } + + return InteractionResultHolder.fail(itemstack); + } + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/item/HugeWaterLilyItem.java b/src/main/java/twilightforest/item/HugeWaterLilyItem.java new file mode 100644 index 0000000000..ac076c9f55 --- /dev/null +++ b/src/main/java/twilightforest/item/HugeWaterLilyItem.java @@ -0,0 +1,79 @@ +package twilightforest.item; + +import net.minecraft.advancements.CriteriaTriggers; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.stats.Stats; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.PlaceOnWaterBlockItem; +import net.minecraft.world.level.ClipContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.level.material.Fluids; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.HitResult; +import net.minecraftforge.common.util.BlockSnapshot; + +public class HugeWaterLilyItem extends PlaceOnWaterBlockItem { + + public HugeWaterLilyItem(Block block, Properties props) { + super(block, props); + } + + // [VanillaCopy] ItemLilyPad.onItemRightClick, edits noted + @Override + public InteractionResultHolder use(Level level, Player player, InteractionHand hand) { + ItemStack itemstack = player.getItemInHand(hand); + BlockHitResult raytraceresult = getPlayerPOVHitResult(level, player, ClipContext.Fluid.SOURCE_ONLY); + if (raytraceresult.getType() == HitResult.Type.MISS) { + return InteractionResultHolder.pass(itemstack); + } else { + if (raytraceresult.getType() == HitResult.Type.BLOCK) { + BlockPos blockpos = raytraceresult.getBlockPos(); + Direction direction = raytraceresult.getDirection(); + if (!level.mayInteract(player, blockpos) || !player.mayUseItemAt(blockpos.relative(direction), direction, itemstack)) { + return InteractionResultHolder.fail(itemstack); + } + + BlockPos blockpos1 = blockpos.above(); + BlockState blockstate = level.getBlockState(blockpos); + Material material = blockstate.getMaterial(); + FluidState ifluidstate = level.getFluidState(blockpos); + if ((ifluidstate.getType() == Fluids.WATER || material == Material.ICE) && level.isEmptyBlock(blockpos1)) { + + // special case for handling block placement with water lilies + BlockSnapshot blocksnapshot = BlockSnapshot.create(level.dimension(), level, blockpos1); + // TF - getBlock() instead of hardcoded lilypad + level.setBlock(blockpos1, getBlock().defaultBlockState(), 11); + if (net.minecraftforge.event.ForgeEventFactory.onBlockPlace(player, blocksnapshot, net.minecraft.core.Direction.UP)) { + blocksnapshot.restore(true, false); + return InteractionResultHolder.fail(itemstack); + } + + if (player instanceof ServerPlayer) { + CriteriaTriggers.PLACED_BLOCK.trigger((ServerPlayer) player, blockpos1, itemstack); + } + + if (!player.getAbilities().instabuild) { + itemstack.shrink(1); + } + + player.awardStat(Stats.ITEM_USED.get(this)); + level.playSound(player, blockpos, SoundEvents.LILY_PAD_PLACE, SoundSource.BLOCKS, 1.0F, 1.0F); + return InteractionResultHolder.success(itemstack); + } + } + + return InteractionResultHolder.fail(itemstack); + } + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/item/HydraChopItem.java b/src/main/java/twilightforest/item/HydraChopItem.java new file mode 100644 index 0000000000..e1e4e1680e --- /dev/null +++ b/src/main/java/twilightforest/item/HydraChopItem.java @@ -0,0 +1,25 @@ +package twilightforest.item; + +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import twilightforest.advancements.TFAdvancements; + +public class HydraChopItem extends Item { + + public HydraChopItem(Properties properties) { + super(properties); + } + + @Override + public ItemStack finishUsingItem(ItemStack stack, Level level, LivingEntity living) { + // if the player is at zero food, achievements + if (living instanceof ServerPlayer player && player.getFoodData().getFoodLevel() <= 0) { + TFAdvancements.CONSUME_HYDRA_CHOP.trigger(player); + } + // then normal effects + return super.finishUsingItem(stack, level, living); + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/item/IceBombItem.java b/src/main/java/twilightforest/item/IceBombItem.java new file mode 100644 index 0000000000..56a86f8346 --- /dev/null +++ b/src/main/java/twilightforest/item/IceBombItem.java @@ -0,0 +1,35 @@ +package twilightforest.item; + +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import twilightforest.entity.projectile.IceBomb; +import twilightforest.init.TFEntities; +import twilightforest.init.TFSounds; + +public class IceBombItem extends Item { + + public IceBombItem(Properties props) { + super(props); + } + + @Override + public InteractionResultHolder use(Level level, Player player, InteractionHand hand) { + player.playSound(TFSounds.ICE_BOMB_FIRED.get(), 0.5F, 0.4F / (level.getRandom().nextFloat() * 0.4F + 0.8F)); + + if (!level.isClientSide()) { + if (!player.getAbilities().instabuild) { + player.getItemInHand(hand).shrink(1); + } + IceBomb ice = new IceBomb(TFEntities.THROWN_ICE.get(), level, player); + ice.shootFromRotation(player, player.getXRot(), player.getYRot(), -20.0F, 0.75F, 1.0F); + level.addFreshEntity(ice); + } + + return new InteractionResultHolder<>(InteractionResult.SUCCESS, player.getItemInHand(hand)); + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/item/IceBowItem.java b/src/main/java/twilightforest/item/IceBowItem.java new file mode 100644 index 0000000000..78a1f24e78 --- /dev/null +++ b/src/main/java/twilightforest/item/IceBowItem.java @@ -0,0 +1,48 @@ +package twilightforest.item; + +import net.minecraft.tags.BlockTags; +import net.minecraft.world.entity.projectile.AbstractArrow; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.BowItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.Enchantment; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; +import twilightforest.entity.projectile.IceArrow; + +import java.util.Objects; +import java.util.concurrent.atomic.AtomicBoolean; + +public class IceBowItem extends BowItem { + + public IceBowItem(Properties props) { + super(props); + } + + @Override + public boolean isBookEnchantable(ItemStack stack, ItemStack book) { + AtomicBoolean badEnchant = new AtomicBoolean(); + EnchantmentHelper.getEnchantments(book).forEach((enchantment, integer) -> { + if (Objects.equals(Enchantments.FLAMING_ARROWS, enchantment)) { + badEnchant.set(true); + } + }); + + return !badEnchant.get(); + } + + @Override + public boolean canApplyAtEnchantingTable(ItemStack stack, Enchantment enchantment) { + return !Enchantments.FLAMING_ARROWS.equals(enchantment) && super.canApplyAtEnchantingTable(stack, enchantment); + } + + @Override + public AbstractArrow customArrow(AbstractArrow arrow) { + return new IceArrow(arrow.getLevel(), arrow.getOwner()); + } + + @Override + public boolean isValidRepairItem(ItemStack toRepair, ItemStack repairWith) { + return repairWith.getItem() instanceof BlockItem blockItem && blockItem.getBlock().defaultBlockState().is(BlockTags.ICE) || super.isValidRepairItem(toRepair, repairWith); + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/item/IceSwordItem.java b/src/main/java/twilightforest/item/IceSwordItem.java new file mode 100644 index 0000000000..39a2b7f9c5 --- /dev/null +++ b/src/main/java/twilightforest/item/IceSwordItem.java @@ -0,0 +1,53 @@ +package twilightforest.item; + +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.SwordItem; +import net.minecraft.world.item.Tier; +import net.minecraft.world.item.enchantment.Enchantment; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; +import twilightforest.enchantment.ChillAuraEnchantment; +import twilightforest.init.TFParticleType; + +import java.util.Objects; +import java.util.concurrent.atomic.AtomicBoolean; + +public class IceSwordItem extends SwordItem { + + public IceSwordItem(Tier toolMaterial, Properties properties) { + super(toolMaterial, 3, -2.4F, properties); + } + + @Override + public boolean isBookEnchantable(ItemStack stack, ItemStack book) { + AtomicBoolean badEnchant = new AtomicBoolean(); + EnchantmentHelper.getEnchantments(book).forEach((enchantment, integer) -> { + if (Objects.equals(Enchantments.FIRE_ASPECT, enchantment)) { + badEnchant.set(true); + } + }); + + return !badEnchant.get(); + } + + @Override + public boolean canApplyAtEnchantingTable(ItemStack stack, Enchantment enchantment) { + return !Enchantments.FIRE_ASPECT.equals(enchantment) && super.canApplyAtEnchantingTable(stack, enchantment); + } + + @Override + public boolean hurtEnemy(ItemStack stack, LivingEntity target, LivingEntity attacker) { + boolean result = super.hurtEnemy(stack, target, attacker); + + if (result) { + ChillAuraEnchantment.doChillAuraEffect(target, 200, 2, true); + for (int i = 0; i < 20; i++) { + ((ServerLevel) target.getLevel()).sendParticles(TFParticleType.SNOW.get(), target.getX(), target.getY() + target.getBbHeight() * 0.5F, target.getZ(), 1, target.getBbWidth() * 0.5, target.getBbHeight() * 0.5, target.getBbWidth() * 0.5, 0); + } + } + + return result; + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/item/IronwoodArmorItem.java b/src/main/java/twilightforest/item/IronwoodArmorItem.java new file mode 100644 index 0000000000..472dfd32b7 --- /dev/null +++ b/src/main/java/twilightforest/item/IronwoodArmorItem.java @@ -0,0 +1,24 @@ +package twilightforest.item; + +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.item.ArmorItem; +import net.minecraft.world.item.ArmorMaterial; +import net.minecraft.world.item.ItemStack; +import twilightforest.TwilightForestMod; + +public class IronwoodArmorItem extends ArmorItem { + + public IronwoodArmorItem(ArmorMaterial armorMaterial, Type type, Properties properties) { + super(armorMaterial, type, properties); + } + + @Override + public String getArmorTexture(ItemStack stack, Entity entity, EquipmentSlot slot, String layer) { + if (slot == EquipmentSlot.LEGS) { + return TwilightForestMod.ARMOR_DIR + "ironwood_2.png"; + } else { + return TwilightForestMod.ARMOR_DIR + "ironwood_1.png"; + } + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/item/ItemBlockNagastone.java b/src/main/java/twilightforest/item/ItemBlockNagastone.java deleted file mode 100644 index ef98b2fbe5..0000000000 --- a/src/main/java/twilightforest/item/ItemBlockNagastone.java +++ /dev/null @@ -1,38 +0,0 @@ -package twilightforest.item; - -import net.minecraft.block.Block; -import net.minecraft.item.ItemBlock; -import net.minecraft.item.ItemStack; -import net.minecraft.util.IIcon; -import net.minecraft.util.MathHelper; -import twilightforest.block.TFBlocks; - -public class ItemBlockNagastone extends ItemBlock { - - public ItemBlockNagastone(Block block) { - super(block); - setHasSubtypes(true); - setMaxDamage(0); - } - - @Override - public IIcon getIconFromDamage(int i) - { - int j = MathHelper.clamp_int(i, 0, 15); - return TFBlocks.nagastone.getIcon(2, j); - - } - - @Override - public String getUnlocalizedName(ItemStack itemstack) - { - int meta = itemstack.getItemDamage(); - return (new StringBuilder()).append(super.getUnlocalizedName()).append(".").append(meta).toString(); - } - - @Override - public int getMetadata(int i) - { - return i; - } -} diff --git a/src/main/java/twilightforest/item/ItemBlockTFAuroraSlab.java b/src/main/java/twilightforest/item/ItemBlockTFAuroraSlab.java deleted file mode 100644 index ee1bc90a26..0000000000 --- a/src/main/java/twilightforest/item/ItemBlockTFAuroraSlab.java +++ /dev/null @@ -1,12 +0,0 @@ -package twilightforest.item; - -import net.minecraft.block.Block; -import twilightforest.block.BlockTFAuroraSlab; - -public class ItemBlockTFAuroraSlab extends net.minecraft.item.ItemSlab { - - public ItemBlockTFAuroraSlab(Block block, BlockTFAuroraSlab singleSlab, BlockTFAuroraSlab doubleSlab, Boolean isDouble) { - super(block, singleSlab, doubleSlab, isDouble); - } - -} diff --git a/src/main/java/twilightforest/item/ItemBlockTFDeadrock.java b/src/main/java/twilightforest/item/ItemBlockTFDeadrock.java deleted file mode 100644 index 0e3390048f..0000000000 --- a/src/main/java/twilightforest/item/ItemBlockTFDeadrock.java +++ /dev/null @@ -1,13 +0,0 @@ -package twilightforest.item; - -import net.minecraft.block.Block; -import net.minecraft.item.ItemMultiTexture; -import twilightforest.block.BlockTFDeadrock; - -public class ItemBlockTFDeadrock extends ItemMultiTexture { - - public ItemBlockTFDeadrock(Block p_i45346_1_, BlockTFDeadrock p_i45346_2_, String[] p_i45346_3_) { - super(p_i45346_1_, p_i45346_2_, p_i45346_3_); - } - -} diff --git a/src/main/java/twilightforest/item/ItemBlockTFHugeLilyPad.java b/src/main/java/twilightforest/item/ItemBlockTFHugeLilyPad.java deleted file mode 100644 index 80ec19f5ee..0000000000 --- a/src/main/java/twilightforest/item/ItemBlockTFHugeLilyPad.java +++ /dev/null @@ -1,84 +0,0 @@ -package twilightforest.item; - -import java.util.Random; - -import twilightforest.block.TFBlocks; -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.item.ItemBlock; -import net.minecraft.item.ItemLilyPad; -import net.minecraft.item.ItemStack; -import net.minecraft.util.MovingObjectPosition; -import net.minecraft.world.World; - - -public class ItemBlockTFHugeLilyPad extends ItemLilyPad { - - Random rand = new Random(); - - public ItemBlockTFHugeLilyPad(Block block) { - super(block); - } - - - /** - * Called whenever this item is equipped and the right mouse button is pressed. Args: itemStack, world, entityPlayer - */ - public ItemStack onItemRightClick(ItemStack itemStack, World world, EntityPlayer player) { - MovingObjectPosition movingobjectposition = this.getMovingObjectPositionFromPlayer(world, player, true); - - if (movingobjectposition == null) { - return itemStack; - } else { - if (movingobjectposition.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) - { - int x = movingobjectposition.blockX; - int y = movingobjectposition.blockY; - int z = movingobjectposition.blockZ; - - // 2x2 lily pads go in a larger grid - int bx = (x >> 1) << 1; - int by = y; - int bz = (z >> 1) << 1; - - if (this.canPlacePadOn(itemStack, world, player, bx, by, bz) && this.canPlacePadOn(itemStack, world, player, bx + 1, by, bz) - && this.canPlacePadOn(itemStack, world, player, bx, by, bz + 1) && this.canPlacePadOn(itemStack, world, player, bx + 1, by, bz + 1)) { - - // this seems like a difficult way to generate 2 pseudorandom bits - rand.setSeed(8890919293L); - rand.setSeed((bx * rand.nextLong()) ^ (bz * rand.nextLong()) ^ 8890919293L); - int orient = rand.nextInt(4) << 2; - - world.setBlock(bx, by + 1, bz, TFBlocks.hugeLilyPad, 0 | orient, 2); - world.setBlock(bx + 1, by + 1, bz, TFBlocks.hugeLilyPad, 1 | orient, 2); - world.setBlock(bx + 1, by + 1, bz + 1, TFBlocks.hugeLilyPad, 2 | orient, 2); - world.setBlock(bx, by + 1, bz + 1, TFBlocks.hugeLilyPad, 3 | orient, 2); - - if (!player.capabilities.isCreativeMode) - { - --itemStack.stackSize; - } - - } - } - - return itemStack; - } - } - - public boolean canPlacePadOn(ItemStack itemStack, World world, EntityPlayer player, int x, int y, int z) { - if (!world.canMineBlock(player, x, y, z)) { - return false; - } - - if (!player.canPlayerEdit(x, y, z, 1, itemStack)) { - return false; - } - - return world.getBlock(x, y, z).getMaterial() == Material.water && world.getBlockMetadata(x, y, z) == 0 && world.isAirBlock(x, y + 1, z); - - } - -} diff --git a/src/main/java/twilightforest/item/ItemBlockTFHugeWaterLily.java b/src/main/java/twilightforest/item/ItemBlockTFHugeWaterLily.java deleted file mode 100644 index ec005d7fe0..0000000000 --- a/src/main/java/twilightforest/item/ItemBlockTFHugeWaterLily.java +++ /dev/null @@ -1,72 +0,0 @@ -package twilightforest.item; - -import twilightforest.block.TFBlocks; -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.item.ItemBlock; -import net.minecraft.item.ItemStack; -import net.minecraft.util.MovingObjectPosition; -import net.minecraft.world.World; - -public class ItemBlockTFHugeWaterLily extends ItemBlock { - - public ItemBlockTFHugeWaterLily(Block block) { - super(block); - } - - /** - * Called whenever this item is equipped and the right mouse button is pressed. Args: itemStack, world, entityPlayer - * - * Copied from ItemWaterlily - */ - public ItemStack onItemRightClick(ItemStack p_77659_1_, World p_77659_2_, EntityPlayer p_77659_3_) - { - MovingObjectPosition movingobjectposition = this.getMovingObjectPositionFromPlayer(p_77659_2_, p_77659_3_, true); - - if (movingobjectposition == null) - { - return p_77659_1_; - } - else - { - if (movingobjectposition.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) - { - int i = movingobjectposition.blockX; - int j = movingobjectposition.blockY; - int k = movingobjectposition.blockZ; - - if (!p_77659_2_.canMineBlock(p_77659_3_, i, j, k)) - { - return p_77659_1_; - } - - if (!p_77659_3_.canPlayerEdit(i, j, k, movingobjectposition.sideHit, p_77659_1_)) - { - return p_77659_1_; - } - - if (p_77659_2_.getBlock(i, j, k).getMaterial() == Material.water && p_77659_2_.getBlockMetadata(i, j, k) == 0 && p_77659_2_.isAirBlock(i, j + 1, k)) - { - // special case for handling block placement with water lilies - net.minecraftforge.common.util.BlockSnapshot blocksnapshot = net.minecraftforge.common.util.BlockSnapshot.getBlockSnapshot(p_77659_2_, i, j + 1, k); - p_77659_2_.setBlock(i, j + 1, k, TFBlocks.hugeWaterLily); - if (net.minecraftforge.event.ForgeEventFactory.onPlayerBlockPlace(p_77659_3_, blocksnapshot, net.minecraftforge.common.util.ForgeDirection.UP).isCanceled()) - { - blocksnapshot.restore(true, false); - return p_77659_1_; - } - - if (!p_77659_3_.capabilities.isCreativeMode) - { - --p_77659_1_.stackSize; - } - } - } - - return p_77659_1_; - } - } - -} diff --git a/src/main/java/twilightforest/item/ItemBlockTFLeaves.java b/src/main/java/twilightforest/item/ItemBlockTFLeaves.java deleted file mode 100644 index 32531c4a24..0000000000 --- a/src/main/java/twilightforest/item/ItemBlockTFLeaves.java +++ /dev/null @@ -1,38 +0,0 @@ -package twilightforest.item; - -import net.minecraft.block.Block; -import net.minecraft.item.ItemBlock; -import net.minecraft.item.ItemStack; -import net.minecraft.util.IIcon; -import twilightforest.block.TFBlocks; - -public class ItemBlockTFLeaves extends ItemBlock { - - public ItemBlockTFLeaves(Block par1) { - super(par1); - setHasSubtypes(true); - setMaxDamage(0); - } - - /** - * Gets an icon index based on an item's damage value - */ - @Override - public IIcon getIconFromDamage(int par1) - { - return TFBlocks.leaves.getIcon(2, par1); - } - - @Override - public String getUnlocalizedName(ItemStack itemstack) - { - int meta = itemstack.getItemDamage(); - return (new StringBuilder()).append(super.getUnlocalizedName()).append(".").append(meta).toString(); - } - - @Override - public int getMetadata(int i) - { - return i; - } -} diff --git a/src/main/java/twilightforest/item/ItemBlockTFLog.java b/src/main/java/twilightforest/item/ItemBlockTFLog.java deleted file mode 100644 index 76110a4472..0000000000 --- a/src/main/java/twilightforest/item/ItemBlockTFLog.java +++ /dev/null @@ -1,67 +0,0 @@ -package twilightforest.item; - -import net.minecraft.block.Block; -import net.minecraft.item.ItemBlock; -import net.minecraft.item.ItemStack; -import net.minecraft.util.IIcon; -import net.minecraft.util.MathHelper; -import twilightforest.block.TFBlocks; - - - -public class ItemBlockTFLog extends ItemBlock { - - public static final String woodNames[] = { - "oak", "canopy", "mangrove", "darkwood", "x", "root", "oreroot", "rotten" - }; - - public ItemBlockTFLog(Block log) - { - super(log); - setHasSubtypes(true); - setMaxDamage(0); - } - - /** - * Gets an icon index based on an item's damage value - */ - @Override - public IIcon getIconFromDamage(int par1) - { - return TFBlocks.log.getIcon(2, par1); - } - - @Override - public String getUnlocalizedName(ItemStack itemstack) - { - int meta = itemstack.getItemDamage(); - if ((meta & 8) == 0) { - // wood - int i = MathHelper.clamp_int(meta, 0, 7); - return (new StringBuilder()).append(super.getUnlocalizedName()).append(".").append(woodNames[i]).toString(); - } - else { - // log - meta &= 7; - int i = MathHelper.clamp_int(meta, 0, 7); - return (new StringBuilder()).append(super.getUnlocalizedName()).append(".").append(woodNames[i]).append(".log").toString(); - } - } - - @Override - public int getMetadata(int i) - { - return i; - } - - -// /** -// * Display meta in tooltip -// */ -// @Override -// public void addInformation(ItemStack par1ItemStack, List par2List) { -// par2List.add("Meta = " + par1ItemStack.getItemDamage()); -// } - - -} diff --git a/src/main/java/twilightforest/item/ItemBlockTFMeta.java b/src/main/java/twilightforest/item/ItemBlockTFMeta.java deleted file mode 100644 index 2d25a68d51..0000000000 --- a/src/main/java/twilightforest/item/ItemBlockTFMeta.java +++ /dev/null @@ -1,74 +0,0 @@ -package twilightforest.item; - -import java.util.List; - -import net.minecraft.block.Block; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemBlock; -import net.minecraft.item.ItemStack; -import net.minecraft.util.IIcon; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public class ItemBlockTFMeta extends ItemBlock { - - private final Block myBlock; - - - public ItemBlockTFMeta(Block block) { - super(block); - setHasSubtypes(true); - setMaxDamage(0); - - this.myBlock = block; - } - - @Override - public int getMetadata(int i) - { - return i; - } - - - @Override - public String getUnlocalizedName(ItemStack itemstack) - { - int meta = itemstack.getItemDamage(); - return (new StringBuilder()).append(super.getUnlocalizedName()).append(".").append(meta).toString(); - } - - /** - * Gets an icon index based on an item's damage value - */ - @Override - public IIcon getIconFromDamage(int par1) - { - return this.myBlock.getIcon(2, par1); - } - - /** - * allows items to add custom lines of information to the mouseover description - */ - @SuppressWarnings({ "rawtypes", "unchecked" }) - @Override - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) - { - super.addInformation(par1ItemStack, par2EntityPlayer, par3List, par4); - - // add warning for [WIP] tag - if (par1ItemStack.getDisplayName().contains("[WIP]")) - { - par3List.add("This block is a work in progress"); - par3List.add("and may have bugs or unintended"); - par3List.add("effects that may damage your world."); - par3List.add("Use with caution."); - } - // add warning for [NYI] tag - if (par1ItemStack.getDisplayName().contains("[NYI]")) - { - par3List.add("This block has effects"); - par3List.add("that are not yet implemented."); - } - } -} diff --git a/src/main/java/twilightforest/item/ItemBlockTFPlant.java b/src/main/java/twilightforest/item/ItemBlockTFPlant.java deleted file mode 100644 index b4e7418989..0000000000 --- a/src/main/java/twilightforest/item/ItemBlockTFPlant.java +++ /dev/null @@ -1,140 +0,0 @@ -package twilightforest.item; - -import net.minecraft.block.Block; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.item.ItemBlock; -import net.minecraft.item.ItemStack; -import net.minecraft.util.Facing; -import net.minecraft.util.IIcon; -import net.minecraft.world.World; -import twilightforest.block.BlockTFPlant; -import twilightforest.block.TFBlocks; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public class ItemBlockTFPlant extends ItemBlock { - - public ItemBlockTFPlant(Block block) { - super(block); - setHasSubtypes(true); - setMaxDamage(0); - } - - /** - * Gets an icon index based on an item's damage value - */ - @Override - public IIcon getIconFromDamage(int par1) - { - return TFBlocks.plant.getIcon(2, par1); - } - - @SideOnly(Side.CLIENT) - @Override - public int getColorFromItemStack(ItemStack par1ItemStack, int par2) - { - return TFBlocks.plant.getRenderColor(par1ItemStack.getItemDamage()); - } - - @Override - public String getUnlocalizedName(ItemStack itemstack) { - int meta = itemstack.getItemDamage(); - return (new StringBuilder()).append(super.getUnlocalizedName()).append(".").append(meta).toString(); - } - - /** - * Returns the metadata of the block which this Item (ItemBlock) can place - */ - @Override - public int getMetadata(int i) { - return i; - } - - @SideOnly(Side.CLIENT) - - /** - * Returns true if the given ItemBlock can be placed on the given side of the given block position. - */ - @Override - public boolean func_150936_a(World par1World, int x, int y, int z, int direction, EntityPlayer par6EntityPlayer, ItemStack par7ItemStack) - { - int meta = par7ItemStack.getItemDamage(); - - if ((meta == BlockTFPlant.META_ROOT_STRAND || meta == BlockTFPlant.META_TORCHBERRY) - && direction == 0 && BlockTFPlant.canPlaceRootBelow(par1World, x, y, z)) - { - return true; - } - else - { - return super.func_150936_a(par1World, x, y, z, direction, par6EntityPlayer, par7ItemStack); - } - } - - /** - * Callback for item usage. If the item does something special on right clicking, he will have one of those. Return - * True if something happen and false if it don't. This is for ITEMS, not BLOCKS ! - */ - @Override - public boolean onItemUse(ItemStack itemStack, EntityPlayer player, World world, int x, int y, int z, int direction, float par8, float par9, float par10) - { - int meta = itemStack.getItemDamage(); - - if (meta == BlockTFPlant.META_ROOT_STRAND || meta == BlockTFPlant.META_TORCHBERRY) { - // hanging - return onItemUseRoot(itemStack, player, world, x, y, z, direction); - } - else { - // regular flower type behavior - return super.onItemUse(itemStack, player, world, x, y, z, direction, par8, par9, par10); - } - } - - /** - * Callback for item usage. If the item does something special on right clicking, he will have one of those. Return - * True if something happen and false if it don't. This is for ITEMS, not BLOCKS ! - */ - public boolean onItemUseRoot(ItemStack itemStack, EntityPlayer player, World world, int x, int y, int z, int direction) - { - Block blockThereId = world.getBlock(x, y, z); - - if (blockThereId == Blocks.snow) { - direction = 1; - } - else if (!blockThereId.getMaterial().isReplaceable()) { - //int var11 = par3World.getBlockId(par4, par5, par6); - x += Facing.offsetsXForSide[direction]; - y += Facing.offsetsYForSide[direction]; - z += Facing.offsetsZForSide[direction]; - } - - if (!player.canPlayerEdit(x, y, z, direction, itemStack)) { - return false; - } - else if (itemStack.stackSize == 0) - { - return false; - } - else - { - if (BlockTFPlant.canPlaceRootBelow(world, x, y + 1, z)) { - Block plantBlock = TFBlocks.plant; - - if (world.setBlock(x, y, z, plantBlock, itemStack.getItem().getMetadata(itemStack.getItemDamage()), 3)) { - if (world.getBlock(x, y, z) == plantBlock) - { -// plantBlock.onBlockPlaced(world, x, y, z, direction); - plantBlock.onBlockPlacedBy(world, x, y, z, player, itemStack); - } - - world.playSoundEffect((double)(x + 0.5F), (double)(y + 0.5F), (double)(z + 0.5F), plantBlock.stepSound.getBreakSound(), (plantBlock.stepSound.getVolume() + 1.0F) / 2.0F, plantBlock.stepSound.getPitch() * 0.8F); - --itemStack.stackSize; - } - } - - return true; - } - } - -} diff --git a/src/main/java/twilightforest/item/ItemBlockTFThorns.java b/src/main/java/twilightforest/item/ItemBlockTFThorns.java deleted file mode 100644 index fdaf5c602c..0000000000 --- a/src/main/java/twilightforest/item/ItemBlockTFThorns.java +++ /dev/null @@ -1,13 +0,0 @@ -package twilightforest.item; - -import net.minecraft.block.Block; -import net.minecraft.item.ItemMultiTexture; -import twilightforest.block.BlockTFThorns; - -public class ItemBlockTFThorns extends ItemMultiTexture { - - public ItemBlockTFThorns(Block p_i45346_1_, BlockTFThorns p_i45346_2_, String[] p_i45346_3_) { - super(p_i45346_1_, p_i45346_2_, p_i45346_3_); - } - -} diff --git a/src/main/java/twilightforest/item/ItemTF.java b/src/main/java/twilightforest/item/ItemTF.java deleted file mode 100644 index cb1b2b00f4..0000000000 --- a/src/main/java/twilightforest/item/ItemTF.java +++ /dev/null @@ -1,49 +0,0 @@ -package twilightforest.item; - -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.item.EnumRarity; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import twilightforest.TwilightForestMod; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public class ItemTF extends Item { - - private boolean isRare = false; - - protected ItemTF() { - super(); - this.setCreativeTab(TFItems.creativeTab); - } - - /** - * Return an item rarity from EnumRarity - * - * This is automatically uncommon - */ - @Override - @SideOnly(Side.CLIENT) - public EnumRarity getRarity(ItemStack par1ItemStack) { - return isRare ? EnumRarity.rare : EnumRarity.uncommon; - } - - /** - * Set rarity during creation - */ - public ItemTF makeRare() - { - this.isRare = true; - return this; - } - - /** - * Properly register icon source - */ - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister par1IconRegister) - { - this.itemIcon = par1IconRegister.registerIcon(TwilightForestMod.ID + ":" + this.getUnlocalizedName().substring(5)); - } -} diff --git a/src/main/java/twilightforest/item/ItemTFArcticArmor.java b/src/main/java/twilightforest/item/ItemTFArcticArmor.java deleted file mode 100644 index 118534ff31..0000000000 --- a/src/main/java/twilightforest/item/ItemTFArcticArmor.java +++ /dev/null @@ -1,104 +0,0 @@ -package twilightforest.item; - -import java.util.List; - -import net.minecraft.client.model.ModelBiped; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.item.EnumRarity; -import net.minecraft.item.Item; -import net.minecraft.item.ItemArmor; -import net.minecraft.item.ItemStack; -import twilightforest.TwilightForestMod; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public class ItemTFArcticArmor extends ItemArmor { - - public ItemTFArcticArmor(ItemArmor.ArmorMaterial par2EnumArmorMaterial, int renderIndex, int armorType) { - super(par2EnumArmorMaterial, renderIndex, armorType); - this.setCreativeTab(TFItems.creativeTab); - } - - /** - * Return an item rarity from EnumRarity - */ - @Override - public EnumRarity getRarity(ItemStack par1ItemStack) { - return EnumRarity.uncommon; - } - - /** - * Called by RenderBiped and RenderPlayer to determine the armor texture that - * should be use for the currently equiped item. - * This will only be called on instances of ItemArmor. - * - * Returning null from this function will use the default value. - * - * @param stack ItemStack for the equpt armor - * @param entity The entity wearing the armor - * @param slot The slot the armor is in - * @param layer The render layer, either 1 or 2, 2 is only used for CLOTH armor by default - * @return Path of texture to bind, or null to use default - */ - public String getArmorTexture(ItemStack itemstack, Entity entity, int slot, String layer) { - switch (slot) { - case 0 : - case 1 : - case 3 : - default : - return TwilightForestMod.ARMOR_DIR + "arcticarmor_1.png"; - case 2 : - return TwilightForestMod.ARMOR_DIR + "arcticarmor_2.png"; - - } - } - - /** - * returns a list of items with the same ID, but different meta (eg: dye returns 16 items) - */ - @SuppressWarnings({ "rawtypes", "unchecked" }) - @Override - public void getSubItems(Item par1, CreativeTabs par2CreativeTabs, List par3List) { - ItemStack istack = new ItemStack(par1, 1, 0); - //istack.addEnchantment(TFEnchantment.reactFire, 2); - par3List.add(istack); - } - - /** - * Return whether this item is repairable in an anvil. - */ - @Override - public boolean getIsRepairable(ItemStack par1ItemStack, ItemStack par2ItemStack) - { - // repair with ????? - return par2ItemStack.getItem() == TFItems.arcticFur ? true : super.getIsRepairable(par1ItemStack, par2ItemStack); - } - - /** - * Properly register icon source - */ - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister par1IconRegister) - { - this.itemIcon = par1IconRegister.registerIcon(TwilightForestMod.ID + ":" + this.getUnlocalizedName().substring(5)); - } - - /** - * Override this method to have an item handle its own armor rendering. - * - * @param entityLiving The entity wearing the armor - * @param itemStack The itemStack to render the model of - * @param armorSlot 0=head, 1=torso, 2=legs, 3=feet - * - * @return A ModelBiped to render instead of the default - */ - @SideOnly(Side.CLIENT) - public ModelBiped getArmorModel(EntityLivingBase entityLiving, ItemStack itemStack, int armorSlot) - { - return TwilightForestMod.proxy.getArcticArmorModel(armorSlot); - } -} diff --git a/src/main/java/twilightforest/item/ItemTFBowBase.java b/src/main/java/twilightforest/item/ItemTFBowBase.java deleted file mode 100644 index ba922428ee..0000000000 --- a/src/main/java/twilightforest/item/ItemTFBowBase.java +++ /dev/null @@ -1,154 +0,0 @@ -package twilightforest.item; - -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.enchantment.Enchantment; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.projectile.EntityArrow; -import net.minecraft.init.Items; -import net.minecraft.item.ItemBow; -import net.minecraft.item.ItemStack; -import net.minecraft.util.IIcon; -import net.minecraft.world.World; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.event.entity.player.ArrowLooseEvent; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public abstract class ItemTFBowBase extends ItemBow { - - private IIcon[] iconArray; - - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister par1IconRegister) { - this.itemIcon = par1IconRegister.registerIcon(this.getIconString() + "_standby"); - this.iconArray = new IIcon[bowPullIconNameArray.length]; - - for (int i = 0; i < this.iconArray.length; ++i) - { - this.iconArray[i] = par1IconRegister.registerIcon(this.getIconString() + "_" + bowPullIconNameArray[i]); - } - } - - /** - * used to cycle through icons based on their used duration, i.e. for the bow - */ - @SideOnly(Side.CLIENT) - public IIcon getItemIconForUseDuration(int par1) { - return this.iconArray[par1]; - } - - /** - * Player, Render pass, and item usage sensitive version of getIconIndex. - * - * @param stack The item stack to get the icon for. (Usually this, and usingItem will be the same if usingItem is not null) - * @param renderPass The pass to get the icon for, 0 is default. - * @param player The player holding the item - * @param usingItem The item the player is actively using. Can be null if not using anything. - * @param useRemaining The ticks remaining for the active item. - * @return The icon index - */ - public IIcon getIcon(ItemStack stack, int renderPass, EntityPlayer player, ItemStack usingItem, int useRemaining) { - if (usingItem != null) { - int j = usingItem.getMaxItemUseDuration() - useRemaining; - - if (j >= 18) - { - return this.getItemIconForUseDuration(2); - } - - if (j > 13) - { - return this.getItemIconForUseDuration(1); - } - - if (j > 0) - { - return this.getItemIconForUseDuration(0); - } - } - - return getIcon(stack, renderPass); - } - - /** - * called when the player releases the use item button. Args: itemstack, world, entityplayer, itemInUseCount - */ - public void onPlayerStoppedUsing(ItemStack itemstack, World world, EntityPlayer entityPlayer, int itemInUseCount) { - int charge = this.getMaxItemUseDuration(itemstack) - itemInUseCount; - - ArrowLooseEvent event = new ArrowLooseEvent(entityPlayer, itemstack, charge); - MinecraftForge.EVENT_BUS.post(event); - if (event.isCanceled()) - { - return; - } - charge = event.charge; - - boolean isNoPickup = entityPlayer.capabilities.isCreativeMode || EnchantmentHelper.getEnchantmentLevel(Enchantment.infinity.effectId, itemstack) > 0; - - if (isNoPickup || entityPlayer.inventory.hasItem(Items.arrow)) - { - float velocity = (float)charge / 20.0F; - velocity = (velocity * velocity + velocity * 2.0F) / 3.0F; - - if ((double)velocity < 0.1D) - { - return; - } - - if (velocity > 1.0F) - { - velocity = 1.0F; - } - - EntityArrow entityarrow = getArrow(world, entityPlayer, velocity * 2.0F); - - if (velocity == 1.0F) - { - entityarrow.setIsCritical(true); - } - - int powerLevel = EnchantmentHelper.getEnchantmentLevel(Enchantment.power.effectId, itemstack); - - if (powerLevel > 0) - { - entityarrow.setDamage(entityarrow.getDamage() + (double)powerLevel * 0.5D + 0.5D); - } - - int punchLevel = EnchantmentHelper.getEnchantmentLevel(Enchantment.punch.effectId, itemstack); - - if (punchLevel > 0) - { - entityarrow.setKnockbackStrength(punchLevel); - } - - if (EnchantmentHelper.getEnchantmentLevel(Enchantment.flame.effectId, itemstack) > 0) - { - entityarrow.setFire(100); - } - - itemstack.damageItem(1, entityPlayer); - world.playSoundAtEntity(entityPlayer, "random.bow", 1.0F, 1.0F / (itemRand.nextFloat() * 0.4F + 1.2F) + velocity * 0.5F); - - if (isNoPickup) - { - entityarrow.canBePickedUp = 2; - } - else - { - entityPlayer.inventory.consumeInventoryItem(Items.arrow); - } - - if (!world.isRemote) - { - world.spawnEntityInWorld(entityarrow); - } - } - } - - protected EntityArrow getArrow(World world, EntityPlayer entityPlayer, float velocity) { - return new EntityArrow(world, entityPlayer, velocity); - } - -} diff --git a/src/main/java/twilightforest/item/ItemTFChainBlock.java b/src/main/java/twilightforest/item/ItemTFChainBlock.java deleted file mode 100644 index 7b7efbf78a..0000000000 --- a/src/main/java/twilightforest/item/ItemTFChainBlock.java +++ /dev/null @@ -1,201 +0,0 @@ -package twilightforest.item; - -import java.util.HashMap; - -import com.google.common.collect.Sets; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import twilightforest.TwilightForestMod; -import twilightforest.entity.EntityTFChainBlock; -import twilightforest.entity.EntityTFCubeOfAnnihilation; -import twilightforest.entity.EntityTFTwilightWandBolt; -import net.minecraft.block.Block; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.item.EnumAction; -import net.minecraft.item.ItemStack; -import net.minecraft.item.ItemTool; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.IIcon; -import net.minecraft.world.World; - -public class ItemTFChainBlock extends ItemTool { - - // which items have launched which blocks? - private HashMap launchedBlocksMap = new HashMap(); - - protected ItemTFChainBlock() { - super(6, TFItems.TOOL_KNIGHTLY, Sets.newHashSet(new Block[] {Blocks.stone})); - this.maxStackSize = 1; - this.setMaxDamage(99); - this.setCreativeTab(TFItems.creativeTab); - - } - - @Override - public ItemStack onItemRightClick(ItemStack stack, World worldObj, EntityPlayer player) { - player.setItemInUse(stack, this.getMaxItemUseDuration(stack)); - - if (!worldObj.isRemote && !this.hasLaunchedBlock(stack)) { - - worldObj.playSoundAtEntity(player, "random.bow", 1.0F, 1.0F / (itemRand.nextFloat() * 0.4F + 1.2F)); - - - EntityTFChainBlock launchedBlock = new EntityTFChainBlock(worldObj, player); - worldObj.spawnEntityInWorld(launchedBlock); - this.setLaunchedBlock(stack, launchedBlock); - - setChainAsThrown(stack); - - stack.damageItem(1, player); - - } - return stack; - } - - /** - * Set this item as having been thrown - * @param stack - */ - public static void setChainAsThrown(ItemStack stack) { - // set NBT tag for stack - if (stack.getTagCompound() == null) { - stack.setTagCompound(new NBTTagCompound()); - } - stack.getTagCompound().setBoolean("thrown", true); - } - - /** - * Set the spike block for this item as returned to the player - * @param stack - */ - public static void setChainAsReturned(ItemStack stack) { - // set NBT tag for stack - if (stack.getTagCompound() == null) { - stack.setTagCompound(new NBTTagCompound()); - } - stack.getTagCompound().setBoolean("thrown", false); - } - - - /** - * Method for the client to determine if the block has been thrown or not. Not as accurate as server method due to lag, etc. - * @param stack - */ - public static boolean doesChainHaveBlock(ItemStack stack) { - if (stack.getTagCompound() == null) { - return true; - } else { - return !stack.getTagCompound().getBoolean("thrown"); - } - } - - - /** - * Set the spike block belonging to the player as returned - * @param player - */ - public static void setChainAsReturned(EntityPlayer player) { - if (player != null && player.getCurrentEquippedItem() != null && player.getCurrentEquippedItem().getItem() == TFItems.chainBlock) { - setChainAsReturned(player.getCurrentEquippedItem()); - } - } - - /** - * Method on the server that determines definitively if the item has been thrown or not - */ - public boolean hasLaunchedBlock(ItemStack stack) { - Entity cube = this.launchedBlocksMap.get(stack); - - return cube != null && !cube.isDead; - } - - public void setLaunchedBlock(ItemStack stack, EntityTFChainBlock launchedCube) { - this.launchedBlocksMap.put(stack, launchedCube); - } - - /** - * Properly register icon source - */ - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister par1IconRegister) - { - this.itemIcon = par1IconRegister.registerIcon(TwilightForestMod.ID + ":" + this.getUnlocalizedName().substring(5)); - } - - /** - * Player, Render pass, and item usage sensitive version of getIconIndex. - * - * @param stack The item stack to get the icon for. (Usually this, and usingItem will be the same if usingItem is not null) - * @param renderPass The pass to get the icon for, 0 is default. - * @param player The player holding the item - * @param usingItem The item the player is actively using. Can be null if not using anything. - * @param useRemaining The ticks remaining for the active item. - * @return The icon index - */ - public IIcon getIcon(ItemStack stack, int renderPass, EntityPlayer player, ItemStack usingItem, int useRemaining) { - - if (this.doesChainHaveBlock(stack)) { - return this.itemIcon; - } else { - return TFItems.knightmetalRing.getIconIndex(stack); - } - } - - /** - * How long it takes to use or consume an item - */ - @Override - public int getMaxItemUseDuration(ItemStack par1ItemStack) - { - return 72000; - } - - /** - * returns the action that specifies what animation to play when the items is being used - */ - @Override - public EnumAction getItemUseAction(ItemStack par1ItemStack) - { - return EnumAction.block; - } - - - /** - * Called when a entity tries to play the 'swing' animation. - * - * @param entityLiving The entity swinging the item. - * @param stack The Item stack - * @return True to cancel any further processing by EntityLiving - */ - @Override - public boolean onEntitySwing(EntityLivingBase entityLiving, ItemStack stack) { - return false; - } - - - @Override - public int getHarvestLevel(ItemStack stack, String toolClass) - { - if (toolClass != null && toolClass.equals("pickaxe")) { - return 2; - } else { - return -1; - } - } - - /** - * Return whether this item is repairable in an anvil. - */ - @Override - public boolean getIsRepairable(ItemStack par1ItemStack, ItemStack par2ItemStack) - { - // repair with knightmetal ingots - return par2ItemStack.getItem() == TFItems.knightMetal ? true : super.getIsRepairable(par1ItemStack, par2ItemStack); - } -} diff --git a/src/main/java/twilightforest/item/ItemTFCharm.java b/src/main/java/twilightforest/item/ItemTFCharm.java deleted file mode 100644 index 30118c876d..0000000000 --- a/src/main/java/twilightforest/item/ItemTFCharm.java +++ /dev/null @@ -1,25 +0,0 @@ -package twilightforest.item; - -import net.minecraft.client.renderer.texture.IIconRegister; -import twilightforest.TwilightForestMod; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public class ItemTFCharm extends ItemTF -{ - - protected ItemTFCharm() { - super(); - this.setCreativeTab(TFItems.creativeTab); - } - - /** - * Properly register icon source - */ - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister par1IconRegister) - { - this.itemIcon = par1IconRegister.registerIcon(TwilightForestMod.ID + ":" + this.getUnlocalizedName().substring(5)); - } -} diff --git a/src/main/java/twilightforest/item/ItemTFCrumbleHorn.java b/src/main/java/twilightforest/item/ItemTFCrumbleHorn.java deleted file mode 100644 index d0a39ba1d3..0000000000 --- a/src/main/java/twilightforest/item/ItemTFCrumbleHorn.java +++ /dev/null @@ -1,198 +0,0 @@ -package twilightforest.item; - -import net.minecraft.block.Block; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.item.EnumAction; -import net.minecraft.item.ItemStack; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.MathHelper; -import net.minecraft.util.Vec3; -import net.minecraft.world.World; -import twilightforest.TwilightForestMod; -import twilightforest.block.TFBlocks; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public class ItemTFCrumbleHorn extends ItemTF -{ - private static final int CHANCE_HARVEST = 20; - private static final int CHANCE_CRUMBLE = 5; - - protected ItemTFCrumbleHorn() { - super(); - this.setCreativeTab(TFItems.creativeTab); - this.maxStackSize = 1; - this.setMaxDamage(1024); - } - - @Override - public ItemStack onItemRightClick(ItemStack par1ItemStack, World world, EntityPlayer player) { - - player.setItemInUse(par1ItemStack, this.getMaxItemUseDuration(par1ItemStack)); - - world.playSoundAtEntity(player, "mob.sheep.say", 1.0F, 0.8F); - - return par1ItemStack; - } - - - /** - * Called each tick while using an item. - * @param stack The Item being used - * @param player The Player using the item - * @param count The amount of time in tick the item has been used for continuously - */ - @Override - public void onUsingTick(ItemStack stack, EntityPlayer player, int count) - { - if (count > 10 && count % 5 == 0 && !player.worldObj.isRemote) - { - int crumbled = doCrumble(player.worldObj, player); - - if (crumbled > 0) - { - stack.damageItem(crumbled, player); - - } - - player.worldObj.playSoundAtEntity(player, "mob.sheep.say", 1.0F, 0.8F); - - } - - } - - /** - * returns the action that specifies what animation to play when the items is being used - */ - @Override - public EnumAction getItemUseAction(ItemStack par1ItemStack) - { - return EnumAction.bow; - } - - /** - * How long it takes to use or consume an item - */ - @Override - public int getMaxItemUseDuration(ItemStack par1ItemStack) - { - return 72000; - } - - /** - * Bleeeat! - */ - private int doCrumble(World world, EntityPlayer player) - { - double range = 3.0D; - double radius = 2.0D; - Vec3 srcVec = Vec3.createVectorHelper(player.posX, player.posY + player.getEyeHeight(), player.posZ); - Vec3 lookVec = player.getLookVec(); - Vec3 destVec = srcVec.addVector(lookVec.xCoord * range, lookVec.yCoord * range, lookVec.zCoord * range); - - AxisAlignedBB crumbleBox = AxisAlignedBB.getBoundingBox(destVec.xCoord - radius, destVec.yCoord - radius, destVec.zCoord - radius, destVec.xCoord + radius, destVec.yCoord + radius, destVec.zCoord + radius); - - return crumbleBlocksInAABB(world, player, crumbleBox); - } - - - /** - * Crumble block in the box - */ - private int crumbleBlocksInAABB(World world, EntityPlayer player, AxisAlignedBB par1AxisAlignedBB) - { - //System.out.println("Destroying blocks in " + par1AxisAlignedBB); - - int minX = MathHelper.floor_double(par1AxisAlignedBB.minX); - int minY = MathHelper.floor_double(par1AxisAlignedBB.minY); - int minZ = MathHelper.floor_double(par1AxisAlignedBB.minZ); - int maxX = MathHelper.floor_double(par1AxisAlignedBB.maxX); - int maxY = MathHelper.floor_double(par1AxisAlignedBB.maxY); - int maxZ = MathHelper.floor_double(par1AxisAlignedBB.maxZ); - - int crumbled = 0; - - for (int dx = minX; dx <= maxX; ++dx) - { - for (int dy = minY; dy <= maxY; ++dy) - { - for (int dz = minZ; dz <= maxZ; ++dz) - { - crumbled += crumbleBlock(world, player, dx, dy, dz); - } - } - } - - - - return crumbled; - } - - /** - * Crumble a specific block. - */ - private int crumbleBlock(World world, EntityPlayer player, int dx, int dy, int dz) { - int cost = 0; - - Block currentID = world.getBlock(dx, dy, dz); - - if (currentID != Blocks.air) - { - int currentMeta = world.getBlockMetadata(dx, dy, dz); - - if (currentID == Blocks.stone && world.rand.nextInt(CHANCE_CRUMBLE) == 0) - { - world.setBlock(dx, dy, dz, Blocks.cobblestone, 0, 3); - world.playAuxSFX(2001, dx, dy, dz, Block.getIdFromBlock(currentID) + (currentMeta << 12)); - cost++; - } - - if (currentID == Blocks.stonebrick && currentMeta == 0 && world.rand.nextInt(CHANCE_CRUMBLE) == 0) - { - world.setBlock(dx, dy, dz, Blocks.stonebrick, 2, 3); - world.playAuxSFX(2001, dx, dy, dz, Block.getIdFromBlock(currentID) + (currentMeta << 12)); - cost++; - } - - if (currentID == TFBlocks.mazestone && currentMeta == 1 && world.rand.nextInt(CHANCE_CRUMBLE) == 0) - { - world.setBlock(dx, dy, dz, TFBlocks.mazestone, 4, 3); - world.playAuxSFX(2001, dx, dy, dz, Block.getIdFromBlock(currentID) + (currentMeta << 12)); - cost++; - } - - if (currentID == Blocks.cobblestone && world.rand.nextInt(CHANCE_CRUMBLE) == 0) - { - world.setBlock(dx, dy, dz, Blocks.gravel, 0, 3); - world.playAuxSFX(2001, dx, dy, dz, Block.getIdFromBlock(currentID) + (currentMeta << 12)); - cost++; - } - - if (currentID == Blocks.gravel || currentID == Blocks.dirt) - { - if (currentID.canHarvestBlock(player, currentMeta) && world.rand.nextInt(CHANCE_HARVEST) == 0) - { - world.setBlock(dx, dy, dz, Blocks.air, 0, 3); - currentID.harvestBlock(world, player, dx, dy, dz, currentMeta); - world.playAuxSFX(2001, dx, dy, dz, Block.getIdFromBlock(currentID) + (currentMeta << 12)); - cost++; - } - } - - } - - return cost; - } - - /** - * Properly register icon source - */ - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister par1IconRegister) - { - this.itemIcon = par1IconRegister.registerIcon(TwilightForestMod.ID + ":" + this.getUnlocalizedName().substring(5)); - } -} diff --git a/src/main/java/twilightforest/item/ItemTFCubeOfAnnihilation.java b/src/main/java/twilightforest/item/ItemTFCubeOfAnnihilation.java deleted file mode 100644 index 6c100a217f..0000000000 --- a/src/main/java/twilightforest/item/ItemTFCubeOfAnnihilation.java +++ /dev/null @@ -1,192 +0,0 @@ -package twilightforest.item; - -import java.util.HashMap; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import twilightforest.TwilightForestMod; -import twilightforest.entity.EntityTFChainBlock; -import twilightforest.entity.EntityTFCubeOfAnnihilation; -import twilightforest.entity.EntityTFTwilightWandBolt; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.InventoryPlayer; -import net.minecraft.item.EnumAction; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.IIcon; -import net.minecraft.world.World; - -public class ItemTFCubeOfAnnihilation extends ItemTF { - - private IIcon annihilateIcon; - - - private HashMap launchedCubesMap = new HashMap(); - - protected ItemTFCubeOfAnnihilation() { - super(); - this.maxStackSize = 1; - this.setCreativeTab(TFItems.creativeTab); - - } - - /** - * Callback for item usage. If the item does something special on right clicking, he will have one of those. Return - * True if something happen and false if it don't. This is for ITEMS, not BLOCKS - */ - @Override - public boolean onItemUse(ItemStack par1ItemStack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ) - { - return false; - } - - @Override - public ItemStack onItemRightClick(ItemStack stack, World worldObj, EntityPlayer player) { - player.setItemInUse(stack, this.getMaxItemUseDuration(stack)); - - if (!worldObj.isRemote && !this.hasLaunchedCube(stack)) { - EntityTFCubeOfAnnihilation launchedCube = new EntityTFCubeOfAnnihilation(worldObj, player); - - worldObj.spawnEntityInWorld(launchedCube); - - this.setLaunchedCube(stack, launchedCube); - setCubeAsThrown(stack); - } - - - return stack; - } - - /** - * Set this item as having been thrown - * @param stack - */ - public static void setCubeAsThrown(ItemStack stack) { - // set NBT tag for stack - if (stack.getTagCompound() == null) { - stack.setTagCompound(new NBTTagCompound()); - } - stack.getTagCompound().setBoolean("thrown", true); - } - - /** - * Set the cube for this item as returned to the player - * @param stack - */ - public static void setCubeAsReturned(ItemStack stack) { - // set NBT tag for stack - if (stack.getTagCompound() == null) { - stack.setTagCompound(new NBTTagCompound()); - } - stack.getTagCompound().setBoolean("thrown", false); - } - - - /** - * Method for the client to determine if the cube has been thrown or not. Not as accurate as server method due to lag, etc. - * @param stack - */ - public static boolean doesTalismanHaveCube(ItemStack stack) { - if (stack.getTagCompound() == null) { - return true; - } else { - return !stack.getTagCompound().getBoolean("thrown"); - } - } - - - /** - * Set the cube belonging to the player as returned - * @param player - */ - public static void setCubeAsReturned(EntityPlayer player) { - if (player != null && player.getCurrentEquippedItem() != null && player.getCurrentEquippedItem().getItem() == TFItems.cubeOfAnnihilation) { - setCubeAsReturned(player.getCurrentEquippedItem()); - } - } - - /** - * Player, Render pass, and item usage sensitive version of getIconIndex. - * - * @param stack The item stack to get the icon for. (Usually this, and usingItem will be the same if usingItem is not null) - * @param renderPass The pass to get the icon for, 0 is default. - * @param player The player holding the item - * @param usingItem The item the player is actively using. Can be null if not using anything. - * @param useRemaining The ticks remaining for the active item. - * @return The icon index - */ - public IIcon getIcon(ItemStack stack, int renderPass, EntityPlayer player, ItemStack usingItem, int useRemaining) { - - if (this.doesTalismanHaveCube(stack)) { - return this.itemIcon; - } else { - return TFItems.cubeTalisman.getIconIndex(stack); - } - } - - public boolean hasLaunchedCube(ItemStack stack) { - Entity cube = this.launchedCubesMap.get(stack); - - return cube != null && !cube.isDead; - } - - public void setLaunchedCube(ItemStack stack, EntityTFCubeOfAnnihilation launchedCube) { - this.launchedCubesMap.put(stack, launchedCube); - } - - /** - * Called each tick while using an item. - * @param stack The Item being used - * @param player The Player using the item - * @param count The amount of time in tick the item has been used for continuously - */ - @Override - public void onUsingTick(ItemStack stack, EntityPlayer player, int count) { -// if (stack.getItemDamage() >= this.getMaxDamage()) { -// // do not use -// player.stopUsingItem(); -// return; -// } - - - - } - - /** - * How long it takes to use or consume an item - */ - @Override - public int getMaxItemUseDuration(ItemStack par1ItemStack) - { - return 72000; - } - - /** - * returns the action that specifies what animation to play when the items is being used - */ - @Override - public EnumAction getItemUseAction(ItemStack par1ItemStack) - { - return EnumAction.block; - } - - - /** - * Properly register icon source - */ - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister par1IconRegister) - { - this.itemIcon = par1IconRegister.registerIcon(TwilightForestMod.ID + ":" + this.getUnlocalizedName().substring(5)); - this.annihilateIcon = par1IconRegister.registerIcon(TwilightForestMod.ID + ":annihilate_particle"); - } - - public IIcon getAnnihilateIcon() { - return this.annihilateIcon; - } - -} diff --git a/src/main/java/twilightforest/item/ItemTFEmptyMagicMap.java b/src/main/java/twilightforest/item/ItemTFEmptyMagicMap.java deleted file mode 100644 index dfc17835f4..0000000000 --- a/src/main/java/twilightforest/item/ItemTFEmptyMagicMap.java +++ /dev/null @@ -1,70 +0,0 @@ -package twilightforest.item; - -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemMapBase; -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; -import net.minecraft.world.storage.MapData; -import twilightforest.TFAchievementPage; -import twilightforest.TFMagicMapData; -import twilightforest.TwilightForestMod; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public class ItemTFEmptyMagicMap extends ItemMapBase -{ - protected ItemTFEmptyMagicMap() - { - super(); - this.setCreativeTab(TFItems.creativeTab); - } - - /** - * Called whenever this item is equipped and the right mouse button is pressed. Args: itemStack, world, entityPlayer - */ - @Override - public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) - { - ItemStack mapItem = new ItemStack(TFItems.magicMap, 1, par2World.getUniqueDataId(ItemTFMagicMap.STR_ID)); - String mapName = ItemTFMagicMap.STR_ID + "_" + mapItem.getItemDamage(); - MapData mapData = new TFMagicMapData(mapName); - par2World.setItemData(mapName, mapData); - mapData.scale = 4; - int step = 128 * (1 << mapData.scale); - mapData.xCenter = (int)(Math.round(par3EntityPlayer.posX / step) * step); - mapData.zCenter = (int)(Math.round(par3EntityPlayer.posZ / step) * step); - mapData.dimension = (byte)par2World.provider.dimensionId; - mapData.markDirty(); - --par1ItemStack.stackSize; - - //cheevo - if (mapItem.getItem() == TFItems.magicMap) { - par3EntityPlayer.triggerAchievement(TFAchievementPage.twilightMagicMap); - } - - if (par1ItemStack.stackSize <= 0) - { - return mapItem; - } - else - { - if (!par3EntityPlayer.inventory.addItemStackToInventory(mapItem.copy())) - { - par3EntityPlayer.dropPlayerItemWithRandomChoice(mapItem, false); - } - - return par1ItemStack; - } - } - - /** - * Properly register icon source - */ - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister par1IconRegister) - { - this.itemIcon = par1IconRegister.registerIcon(TwilightForestMod.ID + ":" + this.getUnlocalizedName().substring(5)); - } -} diff --git a/src/main/java/twilightforest/item/ItemTFEmptyMazeMap.java b/src/main/java/twilightforest/item/ItemTFEmptyMazeMap.java deleted file mode 100644 index 8274bb0f2e..0000000000 --- a/src/main/java/twilightforest/item/ItemTFEmptyMazeMap.java +++ /dev/null @@ -1,88 +0,0 @@ -package twilightforest.item; - -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemMapBase; -import net.minecraft.item.ItemStack; -import net.minecraft.util.ChunkCoordinates; -import net.minecraft.util.MathHelper; -import net.minecraft.world.World; -import twilightforest.TFAchievementPage; -import twilightforest.TFFeature; -import twilightforest.TFMazeMapData; -import twilightforest.TwilightForestMod; -import twilightforest.world.WorldProviderTwilightForest; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public class ItemTFEmptyMazeMap extends ItemMapBase -{ - boolean mapOres; - - protected ItemTFEmptyMazeMap(boolean mapOres) - { - super(); - this.setCreativeTab(TFItems.creativeTab); - this.mapOres = mapOres; - } - - /** - * Called whenever this item is equipped and the right mouse button is pressed. Args: itemStack, world, entityPlayer - */ - @Override - public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) - { - ItemStack mapItem = new ItemStack(mapOres ? TFItems.oreMap : TFItems.mazeMap, 1, par2World.getUniqueDataId(ItemTFMazeMap.STR_ID)); - String var5 = "mazemap_" + mapItem.getItemDamage(); - TFMazeMapData mapData = new TFMazeMapData(var5); - par2World.setItemData(var5, mapData); - mapData.scale = 0; - int step = 128 * (1 << mapData.scale); - // need to fix center for feature offset - if (par2World.provider instanceof WorldProviderTwilightForest && TFFeature.getFeatureForRegion(MathHelper.floor_double(par3EntityPlayer.posX) >> 4, MathHelper.floor_double(par3EntityPlayer.posZ) >> 4, par2World) == TFFeature.labyrinth) { - ChunkCoordinates mc = TFFeature.getNearestCenterXYZ(MathHelper.floor_double(par3EntityPlayer.posX) >> 4, MathHelper.floor_double(par3EntityPlayer.posZ) >> 4, par2World); - mapData.xCenter = mc.posX; - mapData.zCenter = mc.posZ; - mapData.yCenter = MathHelper.floor_double(par3EntityPlayer.posY); - } else { - mapData.xCenter = (int)(Math.round(par3EntityPlayer.posX / step) * step) + 10; // mazes are offset slightly - mapData.zCenter = (int)(Math.round(par3EntityPlayer.posZ / step) * step) + 10; // mazes are offset slightly - mapData.yCenter = MathHelper.floor_double(par3EntityPlayer.posY); - } - mapData.dimension = par2World.provider.dimensionId; - mapData.markDirty(); - --par1ItemStack.stackSize; - - //cheevos - if (mapItem.getItem() == TFItems.mazeMap) { - par3EntityPlayer.triggerAchievement(TFAchievementPage.twilightMazeMap); - } - if (mapItem.getItem() == TFItems.oreMap) { - par3EntityPlayer.triggerAchievement(TFAchievementPage.twilightOreMap); - } - - if (par1ItemStack.stackSize <= 0) - { - return mapItem; - } - else - { - if (!par3EntityPlayer.inventory.addItemStackToInventory(mapItem.copy())) - { - par3EntityPlayer.dropPlayerItemWithRandomChoice(mapItem, false); - } - - return par1ItemStack; - } - } - - /** - * Properly register icon source - */ - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister par1IconRegister) - { - this.itemIcon = par1IconRegister.registerIcon(TwilightForestMod.ID + ":" + this.getUnlocalizedName().substring(5)); - } -} diff --git a/src/main/java/twilightforest/item/ItemTFEnderBow.java b/src/main/java/twilightforest/item/ItemTFEnderBow.java deleted file mode 100644 index 026d30420c..0000000000 --- a/src/main/java/twilightforest/item/ItemTFEnderBow.java +++ /dev/null @@ -1,14 +0,0 @@ -package twilightforest.item; - -import twilightforest.TwilightForestMod; - -public class ItemTFEnderBow extends ItemTFBowBase { - - - public ItemTFEnderBow() { - this.setTextureName(TwilightForestMod.ID + ":enderbow"); - this.setCreativeTab(TFItems.creativeTab); - } - - -} diff --git a/src/main/java/twilightforest/item/ItemTFFieryArmor.java b/src/main/java/twilightforest/item/ItemTFFieryArmor.java deleted file mode 100644 index dc8b6cee93..0000000000 --- a/src/main/java/twilightforest/item/ItemTFFieryArmor.java +++ /dev/null @@ -1,106 +0,0 @@ -package twilightforest.item; - -import java.util.List; - -import net.minecraft.client.model.ModelBiped; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.EnumRarity; -import net.minecraft.item.Item; -import net.minecraft.item.ItemArmor; -import net.minecraft.item.ItemStack; -import net.minecraft.util.StatCollector; -import twilightforest.TwilightForestMod; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public class ItemTFFieryArmor extends ItemArmor { - - public ItemTFFieryArmor(ItemArmor.ArmorMaterial par2EnumArmorMaterial, int renderIndex, int armorType) { - super(par2EnumArmorMaterial, renderIndex, armorType); - this.setCreativeTab(TFItems.creativeTab); - } - - /** - * Return an item rarity from EnumRarity - */ - @Override - public EnumRarity getRarity(ItemStack par1ItemStack) { - return EnumRarity.epic; - } - - @Override - public String getArmorTexture(ItemStack itemstack, Entity entity, int slot, String layer) { - - - if(itemstack.getItem() == TFItems.fieryPlate || itemstack.getItem() == TFItems.fieryHelm || itemstack.getItem() == TFItems.fieryBoots) - { - return TwilightForestMod.ARMOR_DIR + "fiery_1.png"; - } - if(itemstack.getItem() == TFItems.fieryLegs) - { - return TwilightForestMod.ARMOR_DIR + "fiery_2.png"; - } - return TwilightForestMod.ARMOR_DIR + "fiery_1.png"; - } - - /** - * returns a list of items with the same ID, but different meta (eg: dye returns 16 items) - */ - @SuppressWarnings({ "unchecked", "rawtypes" }) - @Override - public void getSubItems(Item par1, CreativeTabs par2CreativeTabs, List par3List) - { - ItemStack istack = new ItemStack(par1, 1, 0); - //istack.addEnchantment(TFEnchantment.fieryAura, 2); - par3List.add(istack); - } - - /** - * Return whether this item is repairable in an anvil. - */ - @Override - public boolean getIsRepairable(ItemStack par1ItemStack, ItemStack par2ItemStack) - { - // repair with fiery ingots - return par2ItemStack.getItem() == TFItems.fieryIngot ? true : super.getIsRepairable(par1ItemStack, par2ItemStack); - } - - /** - * Properly register icon source - */ - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister par1IconRegister) - { - this.itemIcon = par1IconRegister.registerIcon(TwilightForestMod.ID + ":" + this.getUnlocalizedName().substring(5)); - } - - /** - * allows items to add custom lines of information to the mouseover description - */ - @Override - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) { - super.addInformation(par1ItemStack, par2EntityPlayer, par3List, par4); - par3List.add(StatCollector.translateToLocal(getUnlocalizedName() + ".tooltip")); - } - - /** - * Override this method to have an item handle its own armor rendering. - * - * @param entityLiving The entity wearing the armor - * @param itemStack The itemStack to render the model of - * @param armorSlot 0=head, 1=torso, 2=legs, 3=feet - * - * @return A ModelBiped to render instead of the default - */ - @SideOnly(Side.CLIENT) - public ModelBiped getArmorModel(EntityLivingBase entityLiving, ItemStack itemStack, int armorSlot) - { - return TwilightForestMod.proxy.getFieryArmorModel(armorSlot); - } -} diff --git a/src/main/java/twilightforest/item/ItemTFFieryPick.java b/src/main/java/twilightforest/item/ItemTFFieryPick.java deleted file mode 100644 index 16e528cac2..0000000000 --- a/src/main/java/twilightforest/item/ItemTFFieryPick.java +++ /dev/null @@ -1,150 +0,0 @@ -package twilightforest.item; - -import java.util.ArrayList; -import java.util.List; - -import net.minecraft.block.Block; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.item.EnumRarity; -import net.minecraft.item.Item; -import net.minecraft.item.ItemPickaxe; -import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.FurnaceRecipes; -import net.minecraft.util.StatCollector; -import net.minecraft.world.World; -import twilightforest.TwilightForestMod; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public class ItemTFFieryPick extends ItemPickaxe { - - protected ItemTFFieryPick(Item.ToolMaterial par2EnumToolMaterial) { - super(par2EnumToolMaterial); - this.setCreativeTab(TFItems.creativeTab); - } - - @Override - public boolean onBlockDestroyed(ItemStack par1ItemStack, World par2World, Block blockID, int x, int y, int z, EntityLivingBase par7EntityLiving) { - if (super.onBlockDestroyed(par1ItemStack, par2World, blockID, x, y, z, par7EntityLiving) && this.func_150897_b(blockID)) - { - // we are just displaying the fire animation here, so check if we're on the client - if (par2World.isRemote) - { - int meta = par2World.getBlockMetadata(x, y, z); // I guess the block is still there at this point - - ArrayList items = blockID.getDrops(par2World, x, y, z, meta, 0); - - for (ItemStack input : items) - { - // does it smelt? - ItemStack result = FurnaceRecipes.smelting().getSmeltingResult(input); - if (result != null) - { - - // display fire animation - for (int var1 = 0; var1 < 5; ++var1) - { - double rx = itemRand.nextGaussian() * 0.02D; - double ry = itemRand.nextGaussian() * 0.02D; - double rz = itemRand.nextGaussian() * 0.02D; - double magnitude = 20.0; - par2World.spawnParticle("flame", x + 0.5 + (rx * magnitude), y + 0.5 + (ry * magnitude), z + 0.5 + (rz * magnitude), -rx, -ry, -rz); - } - - } - - } - } - - - return true; - } - else - { - return false; - } - } - - /** - * Current implementations of this method in child classes do not use the entry argument beside ev. They just raise - * the damage on the stack. - */ - @Override - public boolean hitEntity(ItemStack par1ItemStack, EntityLivingBase par2EntityLiving, EntityLivingBase par3EntityLiving) { - boolean result = super.hitEntity(par1ItemStack, par2EntityLiving, par3EntityLiving); - - if (result && !par2EntityLiving.isImmuneToFire()) - { - if (par2EntityLiving.worldObj.isRemote) - { - // fire animation! - for (int var1 = 0; var1 < 20; ++var1) - { - double var2 = itemRand.nextGaussian() * 0.02D; - double var4 = itemRand.nextGaussian() * 0.02D; - double var6 = itemRand.nextGaussian() * 0.02D; - double var8 = 10.0D; - par2EntityLiving.worldObj.spawnParticle("flame", par2EntityLiving.posX + itemRand.nextFloat() * par2EntityLiving.width * 2.0F - par2EntityLiving.width - var2 * var8, par2EntityLiving.posY + itemRand.nextFloat() * par2EntityLiving.height - var4 * var8, par2EntityLiving.posZ + itemRand.nextFloat() * par2EntityLiving.width * 2.0F - par2EntityLiving.width - var6 * var8, var2, var4, var6); - } - } - else - { - par2EntityLiving.setFire(15); - } - } - - return result; - } - - /** - * Return an item rarity from EnumRarity - * - * This is automatically rare - */ - @Override - public EnumRarity getRarity(ItemStack par1ItemStack) { - return EnumRarity.rare; - } - - /** - * allows items to add custom lines of information to the mouseover description - */ - @Override - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) { - super.addInformation(par1ItemStack, par2EntityPlayer, par3List, par4); - par3List.add(StatCollector.translateToLocal(getUnlocalizedName() + ".tooltip")); - } - - /** - * Return whether this item is repairable in an anvil. - */ - @Override - public boolean getIsRepairable(ItemStack par1ItemStack, ItemStack par2ItemStack) - { - // repair with fiery ingots - return par2ItemStack.getItem() == TFItems.fieryIngot ? true : super.getIsRepairable(par1ItemStack, par2ItemStack); - } - - - /** - * Returns if the item (tool) can harvest results from the block type. (canHarvestBlock) - */ - public boolean func_150897_b(Block par1Block) - { - return par1Block == Blocks.obsidian ? true : super.func_150897_b(par1Block); - } - - /** - * Properly register icon source - */ - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister par1IconRegister) - { - this.itemIcon = par1IconRegister.registerIcon(TwilightForestMod.ID + ":" + this.getUnlocalizedName().substring(5)); - } -} diff --git a/src/main/java/twilightforest/item/ItemTFFierySword.java b/src/main/java/twilightforest/item/ItemTFFierySword.java deleted file mode 100644 index 8ca74f136a..0000000000 --- a/src/main/java/twilightforest/item/ItemTFFierySword.java +++ /dev/null @@ -1,108 +0,0 @@ -package twilightforest.item; - -import java.util.List; - -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.EnumRarity; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.item.ItemSword; -import net.minecraft.util.StatCollector; -import twilightforest.TwilightForestMod; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public class ItemTFFierySword extends ItemSword { - - public ItemTFFierySword(Item.ToolMaterial par2EnumToolMaterial) { - super(par2EnumToolMaterial); - this.setCreativeTab(TFItems.creativeTab); - } - - /** - * returns a list of items with the same ID, but different meta (eg: dye returns 16 items) - */ - @SuppressWarnings({ "unchecked", "rawtypes" }) - @Override - public void getSubItems(Item par1, CreativeTabs par2CreativeTabs, List par3List) - { - ItemStack istack = new ItemStack(par1, 1, 0); - //istack.addEnchantment(Enchantment.fireAspect, 1); - par3List.add(istack); - } - - /** - * Return an item rarity from EnumRarity - * - * This is automatically rare - */ - @Override - public EnumRarity getRarity(ItemStack par1ItemStack) { - return EnumRarity.rare; - } - - - /** - * Return whether this item is repairable in an anvil. - */ - @Override - public boolean getIsRepairable(ItemStack par1ItemStack, ItemStack par2ItemStack) - { - // repair with fiery ingots - return par2ItemStack.getItem() == TFItems.fieryIngot ? true : super.getIsRepairable(par1ItemStack, par2ItemStack); - } - - /** - * Properly register icon source - */ - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister par1IconRegister) - { - this.itemIcon = par1IconRegister.registerIcon(TwilightForestMod.ID + ":" + this.getUnlocalizedName().substring(5)); - } - - /** - * Current implementations of this method in child classes do not use the entry argument beside ev. They just raise - * the damage on the stack. - */ - @Override - public boolean hitEntity(ItemStack par1ItemStack, EntityLivingBase par2EntityLiving, EntityLivingBase par3EntityLiving) { - boolean result = super.hitEntity(par1ItemStack, par2EntityLiving, par3EntityLiving); - - if (result && !par2EntityLiving.isImmuneToFire()) - { - if (par2EntityLiving.worldObj.isRemote) - { - // fire animation! - for (int var1 = 0; var1 < 20; ++var1) - { - double var2 = itemRand.nextGaussian() * 0.02D; - double var4 = itemRand.nextGaussian() * 0.02D; - double var6 = itemRand.nextGaussian() * 0.02D; - double var8 = 10.0D; - par2EntityLiving.worldObj.spawnParticle("flame", par2EntityLiving.posX + itemRand.nextFloat() * par2EntityLiving.width * 2.0F - par2EntityLiving.width - var2 * var8, par2EntityLiving.posY + itemRand.nextFloat() * par2EntityLiving.height - var4 * var8, par2EntityLiving.posZ + itemRand.nextFloat() * par2EntityLiving.width * 2.0F - par2EntityLiving.width - var6 * var8, var2, var4, var6); - } - } - else - { - par2EntityLiving.setFire(15); - } - } - - return result; - } - - /** - * allows items to add custom lines of information to the mouseover description - */ - @Override - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) { - super.addInformation(par1ItemStack, par2EntityPlayer, par3List, par4); - par3List.add(StatCollector.translateToLocal(getUnlocalizedName() + ".tooltip")); - } -} diff --git a/src/main/java/twilightforest/item/ItemTFFood.java b/src/main/java/twilightforest/item/ItemTFFood.java deleted file mode 100644 index 928b161563..0000000000 --- a/src/main/java/twilightforest/item/ItemTFFood.java +++ /dev/null @@ -1,109 +0,0 @@ -package twilightforest.item; - -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Items; -import net.minecraft.item.Item; -import net.minecraft.item.ItemFood; -import net.minecraft.item.ItemStack; -import net.minecraft.util.IIcon; -import net.minecraft.world.World; -import twilightforest.TwilightForestMod; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public class ItemTFFood extends ItemFood { - - protected Item looksLike; - protected boolean isSoup; - - - /** - * Soup constructor - */ - public ItemTFFood(int par2) - { - super(par2, false); - this.setCreativeTab(TFItems.creativeTab); - this.setSoup(true); - } - - public ItemTFFood(int par2, float par3, boolean par4) - { - super(par2, par3, par4); - this.setCreativeTab(TFItems.creativeTab); - } - - - - public Item getLooksLike() { - return looksLike; - } - - /** - * Set this food to look like the specified item - */ - public ItemTFFood setLooksLike(Item itemLike) { - this.looksLike = itemLike; - return this; - } - - /** - * Gets an icon index based on an item's damage value and the given render pass - */ - public IIcon getIconFromDamage(int par1) - { - if (this.looksLike != null) - { - return looksLike.getIconFromDamage(0); - } - else - { - return super.getIconFromDamage(par1); - } - } - - - /** - * Properly register icon source - */ - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister par1IconRegister) - { - // only try to load if we don't have a lookalike - if (this.looksLike == null) - { - this.itemIcon = par1IconRegister.registerIcon(TwilightForestMod.ID + ":" + this.getUnlocalizedName().substring(5)); - } - } - - - public boolean isSoup() { - return isSoup; - } - - public void setSoup(boolean isSoup) { - this.isSoup = isSoup; - this.setMaxStackSize(1); - } - - /** - * Give a bowl back if we are soup - */ - public ItemStack onEaten(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) - { - super.onEaten(par1ItemStack, par2World, par3EntityPlayer); - - if (isSoup) - { - return new ItemStack(Items.bowl); - } - else - { - return par1ItemStack; - } - } - - -} diff --git a/src/main/java/twilightforest/item/ItemTFGiantPick.java b/src/main/java/twilightforest/item/ItemTFGiantPick.java deleted file mode 100644 index a58de5d9c8..0000000000 --- a/src/main/java/twilightforest/item/ItemTFGiantPick.java +++ /dev/null @@ -1,127 +0,0 @@ -package twilightforest.item; - -import java.util.List; - -import twilightforest.block.BlockTFGiantBlock; -import twilightforest.block.TFBlocks; -import net.minecraft.block.Block; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.ai.attributes.AttributeModifier; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Items; -import net.minecraft.item.EnumRarity; -import net.minecraft.item.Item; -import net.minecraft.item.ItemPickaxe; -import net.minecraft.item.ItemStack; -import net.minecraft.util.IIcon; -import net.minecraft.util.StatCollector; - -import com.google.common.collect.Multimap; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public class ItemTFGiantPick extends ItemPickaxe { - - private float damageVsEntity; - private GiantItemIcon giantIcon; - - protected ItemTFGiantPick(Item.ToolMaterial par2EnumToolMaterial) { - super(par2EnumToolMaterial); - this.setCreativeTab(TFItems.creativeTab); - this.damageVsEntity = 4 + par2EnumToolMaterial.getDamageVsEntity(); - - } - - /** - * Return an item rarity from EnumRarity - * - * This is automatically rare - */ - @Override - public EnumRarity getRarity(ItemStack par1ItemStack) { - return EnumRarity.rare; - } - - /** - * Return whether this item is repairable in an anvil. - */ - @Override - public boolean getIsRepairable(ItemStack par1ItemStack, ItemStack par2ItemStack) - { - // repair with knightmetal ingots - return par2ItemStack.getItem() == TFItems.knightMetal ? true : super.getIsRepairable(par1ItemStack, par2ItemStack); - } - - /** - * Properly register icon source - */ - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister par1IconRegister) - { - this.itemIcon = Items.stone_pickaxe.getIconFromDamage(0); - this.giantIcon = new GiantItemIcon(this.itemIcon, 0.0625F * 7F, 0.0625F * 2F); - - } - - /** - * Return the correct icon for rendering based on the supplied ItemStack and render pass. - * - * Defers to {@link #getIconFromDamageForRenderPass(int, int)} - * @param stack to render for - * @param pass the multi-render pass - * @return the icon - */ - public IIcon getIcon(ItemStack stack, int pass) - { - // render pass 1 gives the giant Icon - if (pass == -1) { - return this.giantIcon; - } else { - return super.getIcon(stack, pass); - } - } - - /** - * allows items to add custom lines of information to the mouseover description - */ - @SuppressWarnings({ "unchecked", "rawtypes" }) - @Override - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) { - super.addInformation(par1ItemStack, par2EntityPlayer, par3List, par4); - par3List.add(StatCollector.translateToLocal(getUnlocalizedName() + ".tooltip")); - } - - /** - * Gets a map of item attribute modifiers, used by ItemSword to increase hit damage. - */ - @SuppressWarnings({ "rawtypes", "unchecked" }) - public Multimap getItemAttributeModifiers() - { - Multimap multimap = super.getItemAttributeModifiers(); - // remove old damage value - multimap.removeAll(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName()); - // add new one - multimap.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), new AttributeModifier(field_111210_e, "Tool modifier", (double)this.damageVsEntity, 0)); - return multimap; - } - - - @Override - public float func_150893_a(ItemStack par1ItemStack, Block par2Block) { - float strVsBlock = super.func_150893_a(par1ItemStack, par2Block); - // extra 64X strength vs giant obsidian - strVsBlock *= (par2Block == TFBlocks.giantObsidian) ? 64 : 1; - // 64x strength vs giant blocks - return isGiantBlock(par2Block) ? strVsBlock * 64 : strVsBlock; - } - - private boolean isGiantBlock(Block block) { - return block instanceof BlockTFGiantBlock; - } - - -} diff --git a/src/main/java/twilightforest/item/ItemTFGiantSword.java b/src/main/java/twilightforest/item/ItemTFGiantSword.java deleted file mode 100644 index 400966faf5..0000000000 --- a/src/main/java/twilightforest/item/ItemTFGiantSword.java +++ /dev/null @@ -1,60 +0,0 @@ -package twilightforest.item; - -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.init.Items; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.item.ItemSword; -import net.minecraft.util.IIcon; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public class ItemTFGiantSword extends ItemSword { - - private GiantItemIcon giantIcon; - - public ItemTFGiantSword(Item.ToolMaterial par2EnumToolMaterial) { - super(par2EnumToolMaterial); - this.setCreativeTab(TFItems.creativeTab); - } - - /** - * Return whether this item is repairable in an anvil. - */ - @Override - public boolean getIsRepairable(ItemStack par1ItemStack, ItemStack par2ItemStack) - { - // repair with ironwood ingots - return par2ItemStack.getItem() == TFItems.ironwoodIngot ? true : super.getIsRepairable(par1ItemStack, par2ItemStack); - } - - /** - * Properly register icon source - */ - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister par1IconRegister) - { - this.itemIcon = Items.stone_sword.getIconFromDamage(0); - this.giantIcon = new GiantItemIcon(this.itemIcon, 0.0625F * 3F, 0.0625F * 5F); - - } - - /** - * Return the correct icon for rendering based on the supplied ItemStack and render pass. - * - * Defers to {@link #getIconFromDamageForRenderPass(int, int)} - * @param stack to render for - * @param pass the multi-render pass - * @return the icon - */ - public IIcon getIcon(ItemStack stack, int pass) - { - // render pass 1 gives the giant Icon - if (pass == -1) { - return this.giantIcon; - } else { - return super.getIcon(stack, pass); - } - } -} diff --git a/src/main/java/twilightforest/item/ItemTFGlassSword.java b/src/main/java/twilightforest/item/ItemTFGlassSword.java deleted file mode 100644 index 5dade14c95..0000000000 --- a/src/main/java/twilightforest/item/ItemTFGlassSword.java +++ /dev/null @@ -1,69 +0,0 @@ -package twilightforest.item; - -import twilightforest.TwilightForestMod; -import net.minecraft.block.Block; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.item.ItemSword; - -public class ItemTFGlassSword extends ItemSword { - - public ItemTFGlassSword(Item.ToolMaterial par2EnumToolMaterial) { - super(par2EnumToolMaterial); - this.setCreativeTab(TFItems.creativeTab); - this.setTextureName(TwilightForestMod.ID + ":glassSword"); - } - - /** - * Return whether this item is repairable in an anvil. - */ - @Override - public boolean getIsRepairable(ItemStack par1ItemStack, ItemStack par2ItemStack) { - return false; - } - - /** - * Current implementations of this method in child classes do not use the entry argument beside ev. They just raise - * the damage on the stack. - */ - @Override - public boolean hitEntity(ItemStack par1ItemStack, EntityLivingBase par2EntityLiving, EntityLivingBase par3EntityLiving) { - boolean result = super.hitEntity(par1ItemStack, par2EntityLiving, par3EntityLiving); - if (result) { - par1ItemStack.damageItem(1000, par3EntityLiving); - } - - return result; - } - - /** - * Called when the player Left Clicks (attacks) an entity. - * Processed before damage is done, if return value is true further processing is canceled - * and the entity is not attacked. - * - * @param stack The Item being used - * @param player The player that is attacking - * @param entity The entity being attacked - * @return True to cancel the rest of the interaction. - */ - public boolean onLeftClickEntity(ItemStack stack, EntityPlayer player, Entity entity) - { - if (player.worldObj.isRemote) { - // snow animation! - for (int var1 = 0; var1 < 20; ++var1) { - double px = entity.posX + itemRand.nextFloat() * entity.width * 2.0F - entity.width; - double py = entity.posY + itemRand.nextFloat() * entity.height; - double pz = entity.posZ + itemRand.nextFloat() * entity.width * 2.0F - entity.width; - entity.worldObj.spawnParticle("blockcrack_" + Block.getIdFromBlock(Blocks.stained_glass) + "_" + 0, px, py, pz, 0, 0, 0); - } - - player.playSound(Blocks.glass.stepSound.getBreakSound(), 1F, 0.5F); - } - return false; - } - -} \ No newline at end of file diff --git a/src/main/java/twilightforest/item/ItemTFHydraChops.java b/src/main/java/twilightforest/item/ItemTFHydraChops.java deleted file mode 100644 index cd0e94a633..0000000000 --- a/src/main/java/twilightforest/item/ItemTFHydraChops.java +++ /dev/null @@ -1,24 +0,0 @@ -package twilightforest.item; - -import twilightforest.TFAchievementPage; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.potion.PotionEffect; -import net.minecraft.world.World; - -public class ItemTFHydraChops extends ItemTFFood { - - public ItemTFHydraChops(int par2, float par3, boolean par4) { - super(par2, par3, par4); - } - - - public ItemStack onEaten(ItemStack itemStack, World world, EntityPlayer player) { - // if the player is at zero food, achievements - if (player.getFoodStats().getFoodLevel() <= 0) { - player.triggerAchievement(TFAchievementPage.twilightHydraChop); - } - // then normal effects - return super.onEaten(itemStack, world, player); - } -} diff --git a/src/main/java/twilightforest/item/ItemTFIceBomb.java b/src/main/java/twilightforest/item/ItemTFIceBomb.java deleted file mode 100644 index c5c9df6dbb..0000000000 --- a/src/main/java/twilightforest/item/ItemTFIceBomb.java +++ /dev/null @@ -1,57 +0,0 @@ -package twilightforest.item; - -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.util.IIcon; -import net.minecraft.world.World; -import twilightforest.TwilightForestMod; -import twilightforest.entity.boss.EntityTFIceBomb; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public class ItemTFIceBomb extends ItemTF { - - - private IIcon[] snowIcon = new IIcon[4]; - - - public ItemTFIceBomb() { - super(); - this.setMaxStackSize(16); - } - - /** - * Properly register icon source - */ - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister par1IconRegister) - { - this.itemIcon = par1IconRegister.registerIcon(TwilightForestMod.ID + ":" + this.getUnlocalizedName().substring(5)); - for (int i = 0; i < 4; i++) { - this.snowIcon[i] = par1IconRegister.registerIcon(TwilightForestMod.ID + ":snow_" + i); - } - } - - public IIcon getSnowIcon(int i) { - return snowIcon[i]; - } - - /** - * Called whenever this item is equipped and the right mouse button is pressed. Args: itemStack, world, entityPlayer - */ - public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) { - if (!par3EntityPlayer.capabilities.isCreativeMode) { - --par1ItemStack.stackSize; - } - - par2World.playSoundAtEntity(par3EntityPlayer, "random.bow", 0.5F, 0.4F / (itemRand.nextFloat() * 0.4F + 0.8F)); - - if (!par2World.isRemote) { - par2World.spawnEntityInWorld(new EntityTFIceBomb(par2World, par3EntityPlayer)); - } - - return par1ItemStack; - } -} diff --git a/src/main/java/twilightforest/item/ItemTFIceBow.java b/src/main/java/twilightforest/item/ItemTFIceBow.java deleted file mode 100644 index d5b3138ae2..0000000000 --- a/src/main/java/twilightforest/item/ItemTFIceBow.java +++ /dev/null @@ -1,37 +0,0 @@ -package twilightforest.item; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.projectile.EntityArrow; -import net.minecraft.init.Blocks; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; -import twilightforest.TwilightForestMod; -import twilightforest.entity.EntityIceArrow; - -public class ItemTFIceBow extends ItemTFBowBase { - - - public ItemTFIceBow() { - this.setTextureName(TwilightForestMod.ID + ":icebow"); - this.setCreativeTab(TFItems.creativeTab); - } - - /** - * Get the arrow for this specific bow - */ - @Override - protected EntityArrow getArrow(World world, EntityPlayer entityPlayer, float velocity) { - return new EntityIceArrow(world, entityPlayer, velocity); - } - - /** - * Return whether this item is repairable in an anvil. - */ - @Override - public boolean getIsRepairable(ItemStack par1ItemStack, ItemStack par2ItemStack) - { - // repair with ice blocks - return par2ItemStack.getItem() == Item.getItemFromBlock(Blocks.ice) ? true : super.getIsRepairable(par1ItemStack, par2ItemStack); - } -} diff --git a/src/main/java/twilightforest/item/ItemTFIceSword.java b/src/main/java/twilightforest/item/ItemTFIceSword.java deleted file mode 100644 index 11e4f7aa0b..0000000000 --- a/src/main/java/twilightforest/item/ItemTFIceSword.java +++ /dev/null @@ -1,72 +0,0 @@ -package twilightforest.item; - -import twilightforest.TwilightForestMod; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.item.ItemSword; -import net.minecraft.potion.Potion; -import net.minecraft.potion.PotionEffect; - -public class ItemTFIceSword extends ItemSword { - - public ItemTFIceSword(Item.ToolMaterial par2EnumToolMaterial) { - super(par2EnumToolMaterial); - this.setCreativeTab(TFItems.creativeTab); - this.setTextureName(TwilightForestMod.ID + ":iceSword"); - } - - /** - * Return whether this item is repairable in an anvil. - */ - @Override - public boolean getIsRepairable(ItemStack par1ItemStack, ItemStack par2ItemStack) - { - // repair with packed ice - return par2ItemStack.getItem() == Item.getItemFromBlock(Blocks.packed_ice) ? true : super.getIsRepairable(par1ItemStack, par2ItemStack); - } - - /** - * Current implementations of this method in child classes do not use the entry argument beside ev. They just raise - * the damage on the stack. - */ - @Override - public boolean hitEntity(ItemStack par1ItemStack, EntityLivingBase par2EntityLiving, EntityLivingBase par3EntityLiving) { - boolean result = super.hitEntity(par1ItemStack, par2EntityLiving, par3EntityLiving); - - if (result) { - int chillLevel = 2; - par2EntityLiving.addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 20 * 10, chillLevel, true)); - } - - return result; - } - - - /** - * Called when the player Left Clicks (attacks) an entity. - * Processed before damage is done, if return value is true further processing is canceled - * and the entity is not attacked. - * - * @param stack The Item being used - * @param player The player that is attacking - * @param entity The entity being attacked - * @return True to cancel the rest of the interaction. - */ - public boolean onLeftClickEntity(ItemStack stack, EntityPlayer player, Entity entity) - { - if (player.worldObj.isRemote) { - // snow animation! - for (int var1 = 0; var1 < 20; ++var1) { - double px = entity.posX + itemRand.nextFloat() * entity.width * 2.0F - entity.width; - double py = entity.posY + itemRand.nextFloat() * entity.height; - double pz = entity.posZ + itemRand.nextFloat() * entity.width * 2.0F - entity.width; - TwilightForestMod.proxy.spawnParticle(entity.worldObj, "snowstuff", px, py, pz, 0, 0, 0); - } - } - return false; - } -} diff --git a/src/main/java/twilightforest/item/ItemTFIronwoodArmor.java b/src/main/java/twilightforest/item/ItemTFIronwoodArmor.java deleted file mode 100644 index ede394840f..0000000000 --- a/src/main/java/twilightforest/item/ItemTFIronwoodArmor.java +++ /dev/null @@ -1,91 +0,0 @@ -package twilightforest.item; - -import java.util.List; - -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.enchantment.Enchantment; -import net.minecraft.entity.Entity; -import net.minecraft.item.EnumRarity; -import net.minecraft.item.Item; -import net.minecraft.item.ItemArmor; -import net.minecraft.item.ItemStack; -import twilightforest.TwilightForestMod; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public class ItemTFIronwoodArmor extends ItemArmor { - - public ItemTFIronwoodArmor(ItemArmor.ArmorMaterial par2EnumArmorMaterial, int renderIndex, int armorType) { - super(par2EnumArmorMaterial, renderIndex, armorType); - this.setCreativeTab(TFItems.creativeTab); - } - - /** - * Return an item rarity from EnumRarity - */ - @Override - public EnumRarity getRarity(ItemStack par1ItemStack) { - return EnumRarity.uncommon; - } - - @Override - public String getArmorTexture(ItemStack itemstack, Entity entity, int slot, String layer) { - - - if(itemstack.getItem() == TFItems.ironwoodPlate || itemstack.getItem() == TFItems.ironwoodHelm || itemstack.getItem() == TFItems.ironwoodBoots) - { - return TwilightForestMod.ARMOR_DIR + "ironwood_1.png"; - } - if(itemstack.getItem() == TFItems.ironwoodLegs) - { - return TwilightForestMod.ARMOR_DIR + "ironwood_2.png"; - } - return TwilightForestMod.ARMOR_DIR + "ironwood_1.png"; - } - - - /** - * returns a list of items with the same ID, but different meta (eg: dye returns 16 items) - */ - @SuppressWarnings({ "rawtypes", "unchecked" }) - @Override - public void getSubItems(Item par1, CreativeTabs par2CreativeTabs, List par3List) - { - ItemStack istack = new ItemStack(par1, 1, 0); - switch (this.armorType) - { - case 0: - istack.addEnchantment(Enchantment.aquaAffinity, 1); - break; - case 1: - istack.addEnchantment(Enchantment.protection, 1); - break; - case 2: - istack.addEnchantment(Enchantment.protection, 1); - break; - case 3: - istack.addEnchantment(Enchantment.featherFalling, 1); - break; - } - par3List.add(istack); - } - - /** - * Return whether this item is repairable in an anvil. - */ - @Override - public boolean getIsRepairable(ItemStack par1ItemStack, ItemStack par2ItemStack) - { - // repair with ironwood ingots - return par2ItemStack.getItem() == TFItems.ironwoodIngot ? true : super.getIsRepairable(par1ItemStack, par2ItemStack); - } - - - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister par1IconRegister) - { - this.itemIcon = par1IconRegister.registerIcon(TwilightForestMod.ID + ":" + this.getUnlocalizedName().substring(5)); - } -} diff --git a/src/main/java/twilightforest/item/ItemTFIronwoodAxe.java b/src/main/java/twilightforest/item/ItemTFIronwoodAxe.java deleted file mode 100644 index 71da9efc40..0000000000 --- a/src/main/java/twilightforest/item/ItemTFIronwoodAxe.java +++ /dev/null @@ -1,52 +0,0 @@ -package twilightforest.item; - -import java.util.List; - -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.enchantment.Enchantment; -import net.minecraft.item.Item; -import net.minecraft.item.ItemAxe; -import net.minecraft.item.ItemStack; -import twilightforest.TwilightForestMod; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public class ItemTFIronwoodAxe extends ItemAxe { - - protected ItemTFIronwoodAxe(Item.ToolMaterial par2EnumToolMaterial) { - super(par2EnumToolMaterial); - this.setCreativeTab(TFItems.creativeTab); - } - - /** - * returns a list of items with the same ID, but different meta (eg: dye returns 16 items) - */ - @Override - public void getSubItems(Item par1, CreativeTabs par2CreativeTabs, List par3List) - { - ItemStack istack = new ItemStack(par1, 1, 0); - istack.addEnchantment(Enchantment.fortune, 1); - par3List.add(istack); - } - - /** - * Return whether this item is repairable in an anvil. - */ - @Override - public boolean getIsRepairable(ItemStack par1ItemStack, ItemStack par2ItemStack) - { - // repair with ironwood ingots - return par2ItemStack.getItem() == TFItems.ironwoodIngot ? true : super.getIsRepairable(par1ItemStack, par2ItemStack); - } - - /** - * Properly register icon source - */ - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister par1IconRegister) - { - this.itemIcon = par1IconRegister.registerIcon(TwilightForestMod.ID + ":" + this.getUnlocalizedName().substring(5)); - } -} diff --git a/src/main/java/twilightforest/item/ItemTFIronwoodHoe.java b/src/main/java/twilightforest/item/ItemTFIronwoodHoe.java deleted file mode 100644 index 30bb13b9fa..0000000000 --- a/src/main/java/twilightforest/item/ItemTFIronwoodHoe.java +++ /dev/null @@ -1,37 +0,0 @@ -package twilightforest.item; - -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.item.Item; -import net.minecraft.item.ItemHoe; -import net.minecraft.item.ItemStack; -import twilightforest.TwilightForestMod; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public class ItemTFIronwoodHoe extends ItemHoe { - - public ItemTFIronwoodHoe(Item.ToolMaterial par2EnumToolMaterial) { - super(par2EnumToolMaterial); - this.setCreativeTab(TFItems.creativeTab); - } - - /** - * Return whether this item is repairable in an anvil. - */ - @Override - public boolean getIsRepairable(ItemStack par1ItemStack, ItemStack par2ItemStack) - { - // repair with ironwood ingots - return par2ItemStack.getItem() == TFItems.ironwoodIngot ? true : super.getIsRepairable(par1ItemStack, par2ItemStack); - } - - /** - * Properly register icon source - */ - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister par1IconRegister) - { - this.itemIcon = par1IconRegister.registerIcon(TwilightForestMod.ID + ":" + this.getUnlocalizedName().substring(5)); - } -} diff --git a/src/main/java/twilightforest/item/ItemTFIronwoodPick.java b/src/main/java/twilightforest/item/ItemTFIronwoodPick.java deleted file mode 100644 index 7a8d6bef03..0000000000 --- a/src/main/java/twilightforest/item/ItemTFIronwoodPick.java +++ /dev/null @@ -1,52 +0,0 @@ -package twilightforest.item; - -import java.util.List; - -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.enchantment.Enchantment; -import net.minecraft.item.Item; -import net.minecraft.item.ItemPickaxe; -import net.minecraft.item.ItemStack; -import twilightforest.TwilightForestMod; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public class ItemTFIronwoodPick extends ItemPickaxe { - - protected ItemTFIronwoodPick(Item.ToolMaterial par2EnumToolMaterial) { - super(par2EnumToolMaterial); - this.setCreativeTab(TFItems.creativeTab); - } - - /** - * returns a list of items with the same ID, but different meta (eg: dye returns 16 items) - */ - @Override - public void getSubItems(Item par1, CreativeTabs par2CreativeTabs, List par3List) - { - ItemStack istack = new ItemStack(par1, 1, 0); - istack.addEnchantment(Enchantment.efficiency, 1); - par3List.add(istack); - } - - /** - * Return whether this item is repairable in an anvil. - */ - @Override - public boolean getIsRepairable(ItemStack par1ItemStack, ItemStack par2ItemStack) - { - // repair with ironwood ingots - return par2ItemStack.getItem() == TFItems.ironwoodIngot ? true : super.getIsRepairable(par1ItemStack, par2ItemStack); - } - - /** - * Properly register icon source - */ - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister par1IconRegister) - { - this.itemIcon = par1IconRegister.registerIcon(TwilightForestMod.ID + ":" + this.getUnlocalizedName().substring(5)); - } -} diff --git a/src/main/java/twilightforest/item/ItemTFIronwoodShovel.java b/src/main/java/twilightforest/item/ItemTFIronwoodShovel.java deleted file mode 100644 index 6255799ab6..0000000000 --- a/src/main/java/twilightforest/item/ItemTFIronwoodShovel.java +++ /dev/null @@ -1,53 +0,0 @@ -package twilightforest.item; - -import java.util.List; - -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.enchantment.Enchantment; -import net.minecraft.item.Item; -import net.minecraft.item.ItemSpade; -import net.minecraft.item.ItemStack; -import twilightforest.TwilightForestMod; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - - -public class ItemTFIronwoodShovel extends ItemSpade { - - public ItemTFIronwoodShovel(Item.ToolMaterial par2EnumToolMaterial) { - super(par2EnumToolMaterial); - this.setCreativeTab(TFItems.creativeTab); - } - - /** - * returns a list of items with the same ID, but different meta (eg: dye returns 16 items) - */ - @Override - public void getSubItems(Item par1, CreativeTabs par2CreativeTabs, List par3List) - { - ItemStack istack = new ItemStack(par1, 1, 0); - istack.addEnchantment(Enchantment.unbreaking, 1); - par3List.add(istack); - } - - /** - * Return whether this item is repairable in an anvil. - */ - @Override - public boolean getIsRepairable(ItemStack par1ItemStack, ItemStack par2ItemStack) - { - // repair with ironwood ingots - return par2ItemStack.getItem() == TFItems.ironwoodIngot ? true : super.getIsRepairable(par1ItemStack, par2ItemStack); - } - - /** - * Properly register icon source - */ - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister par1IconRegister) - { - this.itemIcon = par1IconRegister.registerIcon(TwilightForestMod.ID + ":" + this.getUnlocalizedName().substring(5)); - } -} diff --git a/src/main/java/twilightforest/item/ItemTFIronwoodSword.java b/src/main/java/twilightforest/item/ItemTFIronwoodSword.java deleted file mode 100644 index 66d3ff08fa..0000000000 --- a/src/main/java/twilightforest/item/ItemTFIronwoodSword.java +++ /dev/null @@ -1,52 +0,0 @@ -package twilightforest.item; - -import java.util.List; - -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.enchantment.Enchantment; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.item.ItemSword; -import twilightforest.TwilightForestMod; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public class ItemTFIronwoodSword extends ItemSword { - - public ItemTFIronwoodSword(Item.ToolMaterial par2EnumToolMaterial) { - super(par2EnumToolMaterial); - this.setCreativeTab(TFItems.creativeTab); - } - - /** - * returns a list of items with the same ID, but different meta (eg: dye returns 16 items) - */ - @Override - public void getSubItems(Item par1, CreativeTabs par2CreativeTabs, List par3List) - { - ItemStack istack = new ItemStack(par1, 1, 0); - istack.addEnchantment(Enchantment.knockback, 1); - par3List.add(istack); - } - - /** - * Return whether this item is repairable in an anvil. - */ - @Override - public boolean getIsRepairable(ItemStack par1ItemStack, ItemStack par2ItemStack) - { - // repair with ironwood ingots - return par2ItemStack.getItem() == TFItems.ironwoodIngot ? true : super.getIsRepairable(par1ItemStack, par2ItemStack); - } - - /** - * Properly register icon source - */ - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister par1IconRegister) - { - this.itemIcon = par1IconRegister.registerIcon(TwilightForestMod.ID + ":" + this.getUnlocalizedName().substring(5)); - } -} diff --git a/src/main/java/twilightforest/item/ItemTFKnightlyArmor.java b/src/main/java/twilightforest/item/ItemTFKnightlyArmor.java deleted file mode 100644 index 3856f814a1..0000000000 --- a/src/main/java/twilightforest/item/ItemTFKnightlyArmor.java +++ /dev/null @@ -1,105 +0,0 @@ -package twilightforest.item; - -import java.util.List; - -import net.minecraft.client.model.ModelBiped; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.item.EnumRarity; -import net.minecraft.item.Item; -import net.minecraft.item.ItemArmor; -import net.minecraft.item.ItemStack; -import twilightforest.TwilightForestMod; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public class ItemTFKnightlyArmor extends ItemArmor { - - public ItemTFKnightlyArmor(ItemArmor.ArmorMaterial par2EnumArmorMaterial, int renderIndex, int armorType) { - super(par2EnumArmorMaterial, renderIndex, armorType); - this.setCreativeTab(TFItems.creativeTab); - } - - /** - * Return an item rarity from EnumRarity - */ - @Override - public EnumRarity getRarity(ItemStack par1ItemStack) { - return EnumRarity.rare; - } - - /** - * Called by RenderBiped and RenderPlayer to determine the armor texture that - * should be use for the currently equiped item. - * This will only be called on instances of ItemArmor. - * - * Returning null from this function will use the default value. - * - * @param stack ItemStack for the equpt armor - * @param entity The entity wearing the armor - * @param slot The slot the armor is in - * @param layer The render layer, either 1 or 2, 2 is only used for CLOTH armor by default - * @return Path of texture to bind, or null to use default - */ - public String getArmorTexture(ItemStack itemstack, Entity entity, int slot, String layer) - { - - if (slot == 2) - { - return TwilightForestMod.ARMOR_DIR + "knightly_2.png"; - } - else - { - return TwilightForestMod.ARMOR_DIR + "knightly_1.png"; - } - } - - /** - * returns a list of items with the same ID, but different meta (eg: dye returns 16 items) - */ - @SuppressWarnings({ "unchecked", "rawtypes" }) - @Override - public void getSubItems(Item par1, CreativeTabs par2CreativeTabs, List par3List) - { - ItemStack istack = new ItemStack(par1, 1, 0); - //istack.addEnchantment(TFEnchantment.reactFire, 2); - par3List.add(istack); - } - - /** - * Return whether this item is repairable in an anvil. - */ - @Override - public boolean getIsRepairable(ItemStack par1ItemStack, ItemStack par2ItemStack) - { - // repair with knightmetal ingots - return par2ItemStack.getItem() == TFItems.knightMetal ? true : super.getIsRepairable(par1ItemStack, par2ItemStack); - } - - /** - * Properly register icon source - */ - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister par1IconRegister) - { - this.itemIcon = par1IconRegister.registerIcon(TwilightForestMod.ID + ":" + this.getUnlocalizedName().substring(5)); - } - - /** - * Override this method to have an item handle its own armor rendering. - * - * @param entityLiving The entity wearing the armor - * @param itemStack The itemStack to render the model of - * @param armorSlot 0=head, 1=torso, 2=legs, 3=feet - * - * @return A ModelBiped to render instead of the default - */ - @SideOnly(Side.CLIENT) - public ModelBiped getArmorModel(EntityLivingBase entityLiving, ItemStack itemStack, int armorSlot) - { - return TwilightForestMod.proxy.getKnightlyArmorModel(armorSlot); - } -} diff --git a/src/main/java/twilightforest/item/ItemTFKnightlyAxe.java b/src/main/java/twilightforest/item/ItemTFKnightlyAxe.java deleted file mode 100644 index 929897713f..0000000000 --- a/src/main/java/twilightforest/item/ItemTFKnightlyAxe.java +++ /dev/null @@ -1,132 +0,0 @@ -package twilightforest.item; - -import java.util.List; - -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.ai.attributes.AttributeModifier; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.EnumRarity; -import net.minecraft.item.Item; -import net.minecraft.item.ItemAxe; -import net.minecraft.item.ItemStack; -import net.minecraft.util.StatCollector; -import twilightforest.TwilightForestMod; - -import com.google.common.collect.Multimap; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public class ItemTFKnightlyAxe extends ItemAxe { - - private static final int BONUS_DAMAGE = 2; - private EntityPlayer bonusDamagePlayer; - private Entity bonusDamageEntity; - private float damageVsEntity; - - protected ItemTFKnightlyAxe(Item.ToolMaterial par2EnumToolMaterial) { - super(par2EnumToolMaterial); - this.setCreativeTab(TFItems.creativeTab); - this.damageVsEntity = 4 + par2EnumToolMaterial.getDamageVsEntity(); - - } - - /** - * Return an item rarity from EnumRarity - * - * This is automatically rare - */ - @Override - public EnumRarity getRarity(ItemStack par1ItemStack) { - return EnumRarity.rare; - } - - /** - * Return whether this item is repairable in an anvil. - */ - @Override - public boolean getIsRepairable(ItemStack par1ItemStack, ItemStack par2ItemStack) - { - // repair with knightmetal ingots - return par2ItemStack.getItem() == TFItems.knightMetal ? true : super.getIsRepairable(par1ItemStack, par2ItemStack); - } - - /** - * Called when the player Left Clicks (attacks) an entity. - * Processed before damage is done, if return value is true further processing is canceled - * and the entity is not attacked. - * - * @param stack The Item being used - * @param player The player that is attacking - * @param entity The entity being attacked - * @return True to cancel the rest of the interaction. - */ - @Override - public boolean onLeftClickEntity(ItemStack stack, EntityPlayer player, Entity entity) - { - // extra damage to unarmored target - if (entity instanceof EntityLivingBase && ((EntityLivingBase)entity).getTotalArmorValue() == 0) - { - this.bonusDamageEntity = entity; - this.bonusDamagePlayer = player; - } - - return false; - } - -// /** -// * Returns the damage against a given entity. -// */ -// @Override -// public float getDamageVsEntity(Entity par1Entity, ItemStack itemStack) -// { -// if (this.bonusDamagePlayer != null && this.bonusDamageEntity != null && par1Entity == this.bonusDamageEntity) -// { -// this.bonusDamagePlayer.onEnchantmentCritical(par1Entity); -// this.bonusDamagePlayer = null; -// this.bonusDamageEntity = null; -// return this.damageVsEntity + BONUS_DAMAGE; -// } -// else -// { -// return super.getDamageVsEntity(par1Entity, itemStack); -// } -// } - - /** - * Properly register icon source - */ - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister par1IconRegister) - { - this.itemIcon = par1IconRegister.registerIcon(TwilightForestMod.ID + ":" + this.getUnlocalizedName().substring(5)); - } - - /** - * allows items to add custom lines of information to the mouseover description - */ - @Override - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) { - super.addInformation(par1ItemStack, par2EntityPlayer, par3List, par4); - par3List.add(StatCollector.translateToLocal(getUnlocalizedName() + ".tooltip")); - } - - - /** - * Gets a map of item attribute modifiers, used by ItemSword to increase hit damage. - */ - public Multimap getItemAttributeModifiers() - { - Multimap multimap = super.getItemAttributeModifiers(); - // remove old damage value - multimap.removeAll(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName()); - // add new one - multimap.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), new AttributeModifier(field_111210_e, "Tool modifier", (double)this.damageVsEntity, 0)); - return multimap; - } -} diff --git a/src/main/java/twilightforest/item/ItemTFKnightlyPick.java b/src/main/java/twilightforest/item/ItemTFKnightlyPick.java deleted file mode 100644 index 38bbe6dd46..0000000000 --- a/src/main/java/twilightforest/item/ItemTFKnightlyPick.java +++ /dev/null @@ -1,132 +0,0 @@ -package twilightforest.item; - -import java.util.List; - -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.ai.attributes.AttributeModifier; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.EnumRarity; -import net.minecraft.item.Item; -import net.minecraft.item.ItemPickaxe; -import net.minecraft.item.ItemStack; -import net.minecraft.util.StatCollector; -import twilightforest.TwilightForestMod; - -import com.google.common.collect.Multimap; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public class ItemTFKnightlyPick extends ItemPickaxe { - - private static final int BONUS_DAMAGE = 2; - private EntityPlayer bonusDamagePlayer; - private Entity bonusDamageEntity; - private float damageVsEntity; - - protected ItemTFKnightlyPick(Item.ToolMaterial par2EnumToolMaterial) { - super(par2EnumToolMaterial); - this.setCreativeTab(TFItems.creativeTab); - this.damageVsEntity = 4 + par2EnumToolMaterial.getDamageVsEntity(); - - } - - /** - * Return an item rarity from EnumRarity - * - * This is automatically rare - */ - @Override - public EnumRarity getRarity(ItemStack par1ItemStack) { - return EnumRarity.rare; - } - - /** - * Return whether this item is repairable in an anvil. - */ - @Override - public boolean getIsRepairable(ItemStack par1ItemStack, ItemStack par2ItemStack) - { - // repair with knightmetal ingots - return par2ItemStack.getItem() == TFItems.knightMetal ? true : super.getIsRepairable(par1ItemStack, par2ItemStack); - } - - /** - * Called when the player Left Clicks (attacks) an entity. - * Processed before damage is done, if return value is true further processing is canceled - * and the entity is not attacked. - * - * @param stack The Item being used - * @param player The player that is attacking - * @param entity The entity being attacked - * @return True to cancel the rest of the interaction. - */ - @Override - public boolean onLeftClickEntity(ItemStack stack, EntityPlayer player, Entity entity) - { - // extra damage to armored targets - if (entity instanceof EntityLivingBase && ((EntityLivingBase)entity).getTotalArmorValue() > 0) - { - this.bonusDamageEntity = entity; - this.bonusDamagePlayer = player; - } - - return false; - } - -// /** -// * Returns the damage against a given entity. -// */ -// @Override -// public float getDamageVsEntity(Entity par1Entity, ItemStack itemStack) -// { -// if (this.bonusDamagePlayer != null && this.bonusDamageEntity != null && par1Entity == this.bonusDamageEntity) -// { -// this.bonusDamagePlayer.onEnchantmentCritical(par1Entity); -// this.bonusDamagePlayer = null; -// this.bonusDamageEntity = null; -// return this.damageVsEntity + BONUS_DAMAGE; -// } -// else -// { -// return super.getDamageVsEntity(par1Entity, itemStack); -// } -// } - - - /** - * Properly register icon source - */ - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister par1IconRegister) - { - this.itemIcon = par1IconRegister.registerIcon(TwilightForestMod.ID + ":" + this.getUnlocalizedName().substring(5)); - } - - /** - * allows items to add custom lines of information to the mouseover description - */ - @Override - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) { - super.addInformation(par1ItemStack, par2EntityPlayer, par3List, par4); - par3List.add(StatCollector.translateToLocal(getUnlocalizedName() + ".tooltip")); - } - - /** - * Gets a map of item attribute modifiers, used by ItemSword to increase hit damage. - */ - public Multimap getItemAttributeModifiers() - { - Multimap multimap = super.getItemAttributeModifiers(); - // remove old damage value - multimap.removeAll(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName()); - // add new one - multimap.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), new AttributeModifier(field_111210_e, "Tool modifier", (double)this.damageVsEntity, 0)); - return multimap; - } -} diff --git a/src/main/java/twilightforest/item/ItemTFKnightlySword.java b/src/main/java/twilightforest/item/ItemTFKnightlySword.java deleted file mode 100644 index 2b13ef6b0c..0000000000 --- a/src/main/java/twilightforest/item/ItemTFKnightlySword.java +++ /dev/null @@ -1,113 +0,0 @@ -package twilightforest.item; - -import java.util.List; - -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.EnumRarity; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.item.ItemSword; -import net.minecraft.util.StatCollector; -import twilightforest.TwilightForestMod; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public class ItemTFKnightlySword extends ItemSword { - - private static final int BONUS_DAMAGE = 2; - private Entity bonusDamageEntity; - private EntityPlayer bonusDamagePlayer; - - public ItemTFKnightlySword(Item.ToolMaterial par2EnumToolMaterial) { - super(par2EnumToolMaterial); - this.setCreativeTab(TFItems.creativeTab); - } - - /** - * Return an item rarity from EnumRarity - * - * This is automatically rare - */ - @Override - public EnumRarity getRarity(ItemStack par1ItemStack) { - return EnumRarity.rare; - } - - - /** - * Return whether this item is repairable in an anvil. - */ - @Override - public boolean getIsRepairable(ItemStack par1ItemStack, ItemStack par2ItemStack) - { - // repair with knightmetal ingots - return par2ItemStack.getItem() == TFItems.knightMetal ? true : super.getIsRepairable(par1ItemStack, par2ItemStack); - } - - /** - * Called when the player Left Clicks (attacks) an entity. - * Processed before damage is done, if return value is true further processing is canceled - * and the entity is not attacked. - * - * @param stack The Item being used - * @param player The player that is attacking - * @param entity The entity being attacked - * @return True to cancel the rest of the interaction. - */ - @Override - public boolean onLeftClickEntity(ItemStack stack, EntityPlayer player, Entity entity) - { - // extra damage to armored targets - if (entity instanceof EntityLivingBase && ((EntityLivingBase)entity).getTotalArmorValue() > 0) - { - this.bonusDamageEntity = entity; - this.bonusDamagePlayer = player; - } - - return false; - } - -// /** -// * Returns the damage against a given entity. -// */ -// @Override -// public float getDamageVsEntity(Entity par1Entity, ItemStack itemStack) -// { -// if (this.bonusDamagePlayer != null && this.bonusDamageEntity != null && par1Entity == this.bonusDamageEntity) -// { -// //System.out.println("Minotaur Axe extra damage!"); -// this.bonusDamagePlayer.onEnchantmentCritical(par1Entity); -// this.bonusDamagePlayer = null; -// this.bonusDamageEntity = null; -// return super.getDamageVsEntity(par1Entity, itemStack) + BONUS_DAMAGE; -// } -// else -// { -// return super.getDamageVsEntity(par1Entity, itemStack); -// } -// } - - - /** - * Properly register icon source - */ - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister par1IconRegister) - { - this.itemIcon = par1IconRegister.registerIcon(TwilightForestMod.ID + ":" + this.getUnlocalizedName().substring(5)); - } - - /** - * allows items to add custom lines of information to the mouseover description - */ - @Override - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) { - super.addInformation(par1ItemStack, par2EntityPlayer, par3List, par4); - par3List.add(StatCollector.translateToLocal(getUnlocalizedName() + ".tooltip")); - } -} diff --git a/src/main/java/twilightforest/item/ItemTFLampOfCinders.java b/src/main/java/twilightforest/item/ItemTFLampOfCinders.java deleted file mode 100644 index cf56478822..0000000000 --- a/src/main/java/twilightforest/item/ItemTFLampOfCinders.java +++ /dev/null @@ -1,160 +0,0 @@ -package twilightforest.item; - -import net.minecraft.block.Block; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.EnumAction; -import net.minecraft.item.ItemStack; -import net.minecraft.util.MathHelper; -import net.minecraft.world.World; -import twilightforest.TFAchievementPage; -import twilightforest.TwilightForestMod; -import twilightforest.block.TFBlocks; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public class ItemTFLampOfCinders extends ItemTF { - - private static final int FIRING_TIME = 12; - - public ItemTFLampOfCinders() { - super(); - this.setCreativeTab(TFItems.creativeTab); - this.maxStackSize = 1; - this.setMaxDamage(1024); - } - - /** - * Properly register icon source - */ - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister par1IconRegister) - { - this.itemIcon = par1IconRegister.registerIcon(TwilightForestMod.ID + ":" + this.getUnlocalizedName().substring(5)); - } - - @Override - public ItemStack onItemRightClick(ItemStack par1ItemStack, World world, EntityPlayer player) { - if (par1ItemStack.getItemDamage() < this.getMaxDamage()) - { - player.setItemInUse(par1ItemStack, this.getMaxItemUseDuration(par1ItemStack)); - } - else - { - player.stopUsingItem(); - } - return par1ItemStack; - } - - - /** - * Callback for item usage. If the item does something special on right clicking, he will have one of those. Return - * True if something happen and false if it don't. This is for ITEMS, not BLOCKS - */ - @Override - public boolean onItemUse(ItemStack par1ItemStack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ) - { - if (burnBlock(player, world, x, y, z)) { - world.playSoundAtEntity(player, this.getSound(), 0.5F, 1.5F); - - // spawn flame particles - for (int i = 0; i < 10; i++) { - float dx = x + 0.5F + (itemRand.nextFloat() - itemRand.nextFloat()) * 0.75F; - float dy = y + 0.5F + (itemRand.nextFloat() - itemRand.nextFloat()) * 0.75F; - float dz = z + 0.5F + (itemRand.nextFloat() - itemRand.nextFloat()) * 0.75F; - - world.spawnParticle("smoke", dx, dy, dz, 0.0D, 0.0D, 0.0D); - world.spawnParticle("flame", dx, dy, dz, 0.0D, 0.0D, 0.0D); - } - - return true; - } else { - return false; - } - - } - - private boolean burnBlock(EntityPlayer player, World world, int x, int y, int z) { - Block block = world.getBlock(x, y, z); - if (block == TFBlocks.thorns) { - world.setBlock(x, y, z, TFBlocks.burntThorns, world.getBlockMetadata(x, y, z) & 12, 2); - return true; - } else { - return false; - } - } - - - /** - * called when the player releases the use item button. Args: itemstack, world, entityplayer, itemInUseCount - */ - @Override - public void onPlayerStoppedUsing(ItemStack par1ItemStack, World world, EntityPlayer player, int useRemaining) - { - int useTime = this.getMaxItemUseDuration(par1ItemStack) - useRemaining; - - - if (useTime > FIRING_TIME && (par1ItemStack.getItemDamage() + 1) < this.getMaxDamage()) - { - doBurnEffect(world, player); - - // trigger achievement - player.triggerAchievement(TFAchievementPage.twilightProgressTroll); - } - - } - - private void doBurnEffect(World world, EntityPlayer player) { - int px = MathHelper.floor_double(player.lastTickPosX); - int py = MathHelper.floor_double(player.lastTickPosY + player.getEyeHeight()); - int pz = MathHelper.floor_double(player.lastTickPosZ); - - int range = 4; - - if (!world.isRemote) { - world.playSoundAtEntity(player, this.getSound(), 1.5F, 0.8F); - - // set nearby thorns to burnt - for (int dx = -range; dx <=range; dx++) { - for (int dy = -range; dy <=range; dy++) { - for (int dz = -range; dz <=range; dz++) { - this.burnBlock(player, world, px + dx, py + dy, pz + dz); - } - } - } - } - - for (int i = 0; i < 6; i++) { - int rx = px + itemRand.nextInt(range) - itemRand.nextInt(range); - int ry = py + itemRand.nextInt(2); - int rz = pz + itemRand.nextInt(range) - itemRand.nextInt(range); - - world.playAuxSFXAtEntity(player, 2004, rx, ry, rz, 0); - } - } - - - public String getSound() - { - return "mob.ghast.fireball"; - } - - /** - * returns the action that specifies what animation to play when the items is being used - */ - @Override - public EnumAction getItemUseAction(ItemStack par1ItemStack) - { - return EnumAction.bow; - } - - /** - * How long it takes to use or consume an item - */ - @Override - public int getMaxItemUseDuration(ItemStack par1ItemStack) - { - return 72000; - } -} diff --git a/src/main/java/twilightforest/item/ItemTFMagicBeans.java b/src/main/java/twilightforest/item/ItemTFMagicBeans.java deleted file mode 100644 index 0514b2bbe9..0000000000 --- a/src/main/java/twilightforest/item/ItemTFMagicBeans.java +++ /dev/null @@ -1,167 +0,0 @@ -package twilightforest.item; - -import twilightforest.block.TFBlocks; -import twilightforest.world.WorldProviderTwilightForest; -import net.minecraft.block.Block; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.item.ItemStack; -import net.minecraft.util.MathHelper; -import net.minecraft.world.World; - -public class ItemTFMagicBeans extends ItemTF { - - public ItemTFMagicBeans() { - this.makeRare(); - } - - - /** - * Callback for item usage. If the item does something special on right clicking, he will have one of those. Return - * True if something happen and false if it don't. This is for ITEMS, not BLOCKS - */ - public boolean onItemUse(ItemStack par1ItemStack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ) - { - Block blockAt = world.getBlock(x, y, z); - - int minY = y + 1; - int maxY = Math.max(y + 100, (int) (getCloudHeight(world) + 25)); - if (y < maxY && blockAt == TFBlocks.uberousSoil) { - - if (!world.isRemote) { - makeHugeStalk(world, x, z, minY, maxY); - } - - return true; - } else { - return false; - } - } - - /** - * Try to find the given world's cloud height - * @param world - * @return - */ - private float getCloudHeight(World world) { - - if (world.provider instanceof WorldProviderTwilightForest) { - // WorldProviderTwilightForest has this method on both server and client - return ((WorldProviderTwilightForest)world.provider).getCloudHeight(); - } else { - // are we on a dedicated server - //TODO: don't use exceptions for program flow? - try { - return world.provider.getCloudHeight(); - } catch (NoSuchMethodError nsme) { - // this method exists even on a dedicated server - return world.provider.terrainType.getCloudHeight(); - } - } - } - - - private void makeHugeStalk(World world, int x, int z, int minY, int maxY) { - int yOffset = world.rand.nextInt(100); - - float cScale = world.rand.nextFloat() * 0.25F + 0.125F; // spiral tightness scaling - float rScale = world.rand.nextFloat() * 0.25F + 0.125F; // radius change scaling - - // offset x and z to make stalk start at origin - float radius = 4F + MathHelper.sin((minY + yOffset) * rScale) * 3F; // make radius a little wavy - x -= MathHelper.sin((minY + yOffset) * cScale) * radius; - z -= MathHelper.cos((minY + yOffset) * cScale) * radius; - - // leaves! - int nextLeafY = minY + 10 + world.rand.nextInt(20); - - // make stalk - boolean isClear = true; - for (int dy = minY; dy < maxY && isClear; dy++) { - // make radius a little wavy - radius = 5F + MathHelper.sin((dy + yOffset) * rScale) * 2.5F; - - // find center of stalk - float cx = x + MathHelper.sin((dy + yOffset) * cScale) * radius; - float cz = z + MathHelper.cos((dy + yOffset) * cScale) * radius; - - - float stalkThickness = 2.5F; - - // reduce thickness near top - if (maxY - dy < 5) { - stalkThickness *= (maxY - dy) / 5F; - } - - int minX = MathHelper.floor_float(x - radius - stalkThickness); - int maxX = MathHelper.ceiling_float_int(x + radius + stalkThickness); - int minZ = MathHelper.floor_float(z - radius - stalkThickness); - int maxZ = MathHelper.ceiling_float_int(z + radius + stalkThickness); - - // generate stalk - for (int dx = minX; dx < maxX; dx++) { - for (int dz = minZ; dz < maxZ; dz++) { - if ((dx - cx) * (dx - cx) + (dz - cz) * (dz - cz) < stalkThickness * stalkThickness) { - isClear &= this.tryToPlaceStalk(world, dx, dy, dz); - } - } - } - - // leaves? - if (dy == nextLeafY) { - // make leaf blob - - int lx = (int) (x + MathHelper.sin((dy + yOffset) * cScale) * (radius + stalkThickness)); - int lz = (int) (z + MathHelper.cos((dy + yOffset) * cScale) * (radius + stalkThickness)); - - this.placeLeaves(world, lx, dy, lz); - - nextLeafY = dy + 5 + world.rand.nextInt(10); - } - } - } - - private void placeLeaves(World world, int x, int y, int z) { - // stalk at center - world.setBlock(x, y, z, TFBlocks.hugeStalk); - - // small squares - for (int dx = -1; dx <= 1; dx++) { - for (int dz = -1; dz <= 1; dz++) { - this.tryToPlaceLeaves(world, x + dx, y - 1, z + dz); - this.tryToPlaceLeaves(world, x + dx, y + 1, z + dz); - } - } - // larger square - for (int dx = -2; dx <= 2; dx++) { - for (int dz = -2; dz <= 2; dz++) { - if (!((dx == 2 || dx == -2) && (dz == 2 || dz == -2))) { - this.tryToPlaceLeaves(world, x + dx, y + 0, z + dz); - } - } - } - } - - - /** - * Place the stalk block only if the destination is clear. Return false if blocked. - */ - private boolean tryToPlaceStalk(World world, int x, int y, int z) { - Block blockThere = world.getBlock(x, y, z); - if (blockThere == Blocks.air || blockThere.isReplaceable(world, x, y, z) || blockThere.canBeReplacedByLeaves(world, x, y, z) || blockThere.isLeaves(world, x, y, z) || blockThere.canSustainLeaves(world, x, y, z)) { - world.setBlock(x, y, z, TFBlocks.hugeStalk); - return true; - } else { - return false; - } - } - - - private void tryToPlaceLeaves(World world, int x, int y, int z) { - Block blockThere = world.getBlock(x, y, z); - if (blockThere == Blocks.air || blockThere.canBeReplacedByLeaves(world, x, y, z)) { - world.setBlock(x, y, z, TFBlocks.leaves3, 1, 2); - } - } - -} diff --git a/src/main/java/twilightforest/item/ItemTFMagicMap.java b/src/main/java/twilightforest/item/ItemTFMagicMap.java deleted file mode 100644 index 567ffb11b3..0000000000 --- a/src/main/java/twilightforest/item/ItemTFMagicMap.java +++ /dev/null @@ -1,290 +0,0 @@ -package twilightforest.item; - -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.entity.Entity; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.EnumRarity; -import net.minecraft.item.ItemMap; -import net.minecraft.item.ItemStack; -import net.minecraft.network.Packet; -import net.minecraft.util.MathHelper; -import net.minecraft.util.StatCollector; -import net.minecraft.world.World; -import net.minecraft.world.biome.BiomeGenBase; -import net.minecraft.world.storage.MapData.MapInfo; -import twilightforest.TFFeature; -import twilightforest.TFMagicMapData; -import twilightforest.TFMapPacketHandler; -import twilightforest.TwilightForestMod; -import twilightforest.biomes.TFBiomeBase; -import twilightforest.world.TFWorldChunkManager; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public class ItemTFMagicMap extends ItemMap -{ - public static final String STR_ID = "magicmap"; - - protected ItemTFMagicMap() - { - super(); - } - - @SideOnly(Side.CLIENT) - public static TFMagicMapData getMPMapData(int par0, World par1World) - { - String mapName = STR_ID + "_" + par0; - TFMagicMapData mapData = (TFMagicMapData)par1World.loadItemData(TFMagicMapData.class, mapName); - - if (mapData == null) - { - mapData = new TFMagicMapData(mapName); - par1World.setItemData(mapName, mapData); - } - - return mapData; - } - - @Override - public TFMagicMapData getMapData(ItemStack par1ItemStack, World par2World) - { - String mapName = STR_ID + "_" + par1ItemStack.getItemDamage(); - TFMagicMapData mapData = (TFMagicMapData)par2World.loadItemData(TFMagicMapData.class, mapName); - - if (mapData == null && !par2World.isRemote) - { - par1ItemStack.setItemDamage(par2World.getUniqueDataId(STR_ID)); - mapName = STR_ID + "_" + par1ItemStack.getItemDamage(); - mapData = new TFMagicMapData(mapName); - mapData.xCenter = par2World.getWorldInfo().getSpawnX(); - mapData.zCenter = par2World.getWorldInfo().getSpawnZ(); - mapData.scale = 4; - mapData.dimension = par2World.provider.dimensionId; - mapData.markDirty(); - par2World.setItemData(mapName, mapData); - } - - return mapData; - } - - public void updateMapData(World par1World, Entity par2Entity, TFMagicMapData par3MapData) - { - if (par1World.provider.dimensionId == par3MapData.dimension && par2Entity instanceof EntityPlayer) - { - short xSize = 128; - short zSize = 128; - int scaleFactor = 1 << par3MapData.scale; - int xCenter = par3MapData.xCenter; - int zCenter = par3MapData.zCenter; - int xDraw = MathHelper.floor_double(par2Entity.posX - (double)xCenter) / scaleFactor + xSize / 2; - int zDraw = MathHelper.floor_double(par2Entity.posZ - (double)zCenter) / scaleFactor + zSize / 2; - int drawSize = 512 / scaleFactor; -// int drawSize = 1024 / scaleFactor; - - MapInfo mapInfo = par3MapData.func_82568_a((EntityPlayer)par2Entity); - ++mapInfo.field_82569_d; - - for (int xStep = xDraw - drawSize + 1; xStep < xDraw + drawSize; ++xStep) - { - if ((xStep & 15) == (mapInfo.field_82569_d & 15)) - { - int highNumber = 255; - int lowNumber = 0; - - for (int zStep = zDraw - drawSize - 1; zStep < zDraw + drawSize; ++zStep) - { - if (xStep >= 0 && zStep >= -1 && xStep < xSize && zStep < zSize) - { - int xOffset = xStep - xDraw; - int zOffset = zStep - zDraw; - boolean var20 = xOffset * xOffset + zOffset * zOffset > (drawSize - 2) * (drawSize - 2); - int xDraw2 = (xCenter / scaleFactor + xStep - xSize / 2) * scaleFactor; - int zDraw2 = (zCenter / scaleFactor + zStep - zSize / 2) * scaleFactor; - int[] biomeFrequencies = new int[256]; - int zStep2; - int xStep2; - - - int biomeID; - - - for (xStep2 = 0; xStep2 < scaleFactor; ++xStep2) - { - for (zStep2 = 0; zStep2 < scaleFactor; ++zStep2) - { - biomeID = par1World.getBiomeGenForCoords(xDraw2 + xStep2, zDraw2 + zStep2).biomeID; - - biomeFrequencies[biomeID]++; - - // make rivers and streams 3x more prominent - if (biomeID == BiomeGenBase.river.biomeID || biomeID == TFBiomeBase.stream.biomeID) { - biomeFrequencies[biomeID] += 2; - } - // add in TF features - if (par1World.getWorldChunkManager() instanceof TFWorldChunkManager) - { - TFWorldChunkManager tfManager = (TFWorldChunkManager) par1World.getWorldChunkManager(); - - if (tfManager.isInFeatureChunk(par1World, xDraw2 + xStep2, zDraw2 + zStep2) && zStep >= 0 && xOffset * xOffset + zOffset * zOffset < drawSize * drawSize) - { - par3MapData.addFeatureToMap(TFFeature.getNearestFeature((xDraw2 + xStep2) >> 4, (zDraw2 + zStep2) >> 4, par1World), xDraw2, zDraw2); - } - } - -// // mark features we find into the mapdata, provided they are within our draw area -// if (biomeID == TFBiomeBase.majorFeature.biomeID && zStep >= 0 && xOffset * xOffset + zOffset * zOffset < drawSize * drawSize) { -// par3MapData.addFeatureToMap(TFFeature.getNearestFeature((xDraw2 + xStep2) >> 4, (zDraw2 + zStep2) >> 4, par1World), xDraw2, zDraw2); -//// biomeFrequencies[biomeID] += 4096; // don't bother, now the icon will show -// } - -// // mark features we find into the mapdata, provided they are within our draw area -// if (biomeID == TFBiomeBase.minorFeature.biomeID) { -// biomeFrequencies[biomeID] += 4096; // don't bother, now the icon will show -// } - } - } - - // figure out which color is the most prominent and make that one appear on the map - byte biomeIDToShow = 0; - int highestFrequency = 0; - - for (int i = 0; i < 256; i++) { - if (biomeFrequencies[i] > highestFrequency) - { - biomeIDToShow = (byte)i; - highestFrequency = biomeFrequencies[i]; - } - } - - // increase biomeID by one so we can properly show oceans - biomeIDToShow++; - - if (zStep >= 0 && xOffset * xOffset + zOffset * zOffset < drawSize * drawSize && (!var20 || (xStep + zStep & 1) != 0)) - { - byte existingColor = par3MapData.colors[xStep + zStep * xSize]; - - if (existingColor != biomeIDToShow) - { - if (highNumber > zStep) - { - highNumber = zStep; - } - - if (lowNumber < zStep) - { - lowNumber = zStep; - } - - par3MapData.colors[xStep + zStep * xSize] = biomeIDToShow; - } - } - } - } - - if (highNumber <= lowNumber) - { - par3MapData.setColumnDirty(xStep, highNumber, lowNumber); - } - } - } - } - } - - /** - * Called each tick as long the item is on a player inventory. Uses by maps to check if is on a player hand and - * update it's contents. - */ - public void onUpdate(ItemStack par1ItemStack, World par2World, Entity par3Entity, int par4, boolean par5) - { - if (!par2World.isRemote) - { - TFMagicMapData mapData = this.getMapData(par1ItemStack, par2World); - - if (par3Entity instanceof EntityPlayer) - { - EntityPlayer var7 = (EntityPlayer)par3Entity; - mapData.updateVisiblePlayers(var7, par1ItemStack); - } - - if (par5) - { - this.updateMapData(par2World, par3Entity, mapData); - } - } - } - - /** - * Called when item is crafted/smelted. Used only by maps so far. - */ - @Override - public void onCreated(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) - { - // we don't need to do anything here, I think - } - - /** - * Return an item rarity from EnumRarity - */ - @Override - public EnumRarity getRarity(ItemStack par1ItemStack) { - return EnumRarity.uncommon; - } - - /** - * Do the enchanted shimmer thing - */ - @Override - public boolean hasEffect(ItemStack par1ItemStack) - { - return false; - } - - /** - * returns null if no update is to be sent - * - * We have re-written this to provide a Packet250CustomPayload to be sent, since the map data packet is only for the actual map map. - * - * Also every 4 player update packets we send is actually a feature icon update packet. - */ - @Override - public Packet func_150911_c(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) - { -// System.out.println("Getting magic map packet"); - - byte[] mapBytes = this.getMapData(par1ItemStack, par2World).getUpdatePacketData(par1ItemStack, par2World, par3EntityPlayer); - - if (mapBytes == null) { - return null; - } - else { - // hijack random player data packets for our feature data packets? - if (mapBytes[0] == 1 && par2World.rand.nextInt(4) == 0) { - this.getMapData(par1ItemStack, par2World).checkExistingFeatures(par2World); - mapBytes = this.getMapData(par1ItemStack, par2World).makeFeatureStorageArray(); - } - - //short mapItemID = (short) TFItems.magicMap; - short uniqueID = (short)par1ItemStack.getItemDamage(); - - return TFMapPacketHandler.makeMagicMapPacket(ItemTFMagicMap.STR_ID, uniqueID, mapBytes); - } - } - - /** - * Add the map number to the tooltip - */ - public String getItemStackDisplayName(ItemStack par1ItemStack) - { - return ("" + StatCollector.translateToLocal(this.getUnlocalizedNameInefficiently(par1ItemStack) + ".name") + " #" + par1ItemStack.getItemDamage()).trim(); - } - - /** - * Properly register icon source - */ - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister par1IconRegister) - { - this.itemIcon = par1IconRegister.registerIcon(TwilightForestMod.ID + ":" + this.getUnlocalizedName().substring(5)); - } -} diff --git a/src/main/java/twilightforest/item/ItemTFMazeMap.java b/src/main/java/twilightforest/item/ItemTFMazeMap.java deleted file mode 100644 index f22afdc804..0000000000 --- a/src/main/java/twilightforest/item/ItemTFMazeMap.java +++ /dev/null @@ -1,326 +0,0 @@ -package twilightforest.item; - -import net.minecraft.block.Block; -import net.minecraft.block.material.MapColor; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.entity.Entity; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.item.EnumRarity; -import net.minecraft.item.ItemMap; -import net.minecraft.item.ItemStack; -import net.minecraft.network.Packet; -import net.minecraft.util.MathHelper; -import net.minecraft.util.StatCollector; -import net.minecraft.world.World; -import net.minecraft.world.chunk.Chunk; -import net.minecraft.world.storage.MapData.MapCoord; -import net.minecraft.world.storage.MapData.MapInfo; -import twilightforest.TFMapPacketHandler; -import twilightforest.TFMazeMapData; -import twilightforest.TwilightForestMod; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public class ItemTFMazeMap extends ItemMap -{ - public static final String STR_ID = "mazemap"; - private static final int YSEARCH = 3; - protected boolean mapOres; - - protected ItemTFMazeMap(boolean par2MapOres) - { - super(); - this.mapOres = par2MapOres; - //this.setCreativeTab(TFItems.creativeTab); - } - - @SideOnly(Side.CLIENT) - public static TFMazeMapData getMPMapData(int par0, World par1World) - { - String mapName = STR_ID + "_" + par0; - - TFMazeMapData mapData = (TFMazeMapData)par1World.loadItemData(TFMazeMapData.class, mapName); - - //System.out.println("Incoming maze data! = " + mapData); - - if (mapData == null) - { - mapData = new TFMazeMapData(mapName); - par1World.setItemData(mapName, mapData); - } - - return mapData; - } - - @Override - public TFMazeMapData getMapData(ItemStack par1ItemStack, World par2World) - { - TFMazeMapData mapData = (TFMazeMapData)par2World.loadItemData(TFMazeMapData.class, STR_ID + "_" + par1ItemStack.getItemDamage()); - - if (mapData == null && !par2World.isRemote) - { - par1ItemStack.setItemDamage(par2World.getUniqueDataId(STR_ID)); - String mapName = STR_ID + "_" + par1ItemStack.getItemDamage(); - mapData = new TFMazeMapData(mapName); - mapData.xCenter = par2World.getWorldInfo().getSpawnX(); - mapData.zCenter = par2World.getWorldInfo().getSpawnZ(); - mapData.scale = 0; - mapData.dimension = par2World.provider.dimensionId; - mapData.markDirty(); - par2World.setItemData(mapName, mapData); - } - - return mapData; - } - - /** - * Maze map update data. Look at scale 0 for walls, and maybe ores. - */ - public void updateMapData(World par1World, Entity par2Entity, TFMazeMapData par3MapData) - { - int yDraw = MathHelper.floor_double(par2Entity.posY - (double)par3MapData.yCenter); - - if (par1World.provider.dimensionId == par3MapData.dimension && yDraw > -YSEARCH && yDraw < YSEARCH) - { - short xSize = 128; - short zSize = 128; - int xCenter = par3MapData.xCenter; - int zCenter = par3MapData.zCenter; - int xDraw = MathHelper.floor_double(par2Entity.posX - (double)xCenter) + xSize / 2; - int zDraw = MathHelper.floor_double(par2Entity.posZ - (double)zCenter) + zSize / 2; - int drawSize = 16; - - MapInfo mapInfo = par3MapData.func_82568_a((EntityPlayer)par2Entity); - ++mapInfo.field_82569_d; - - for (int xStep = xDraw - drawSize + 1; xStep < xDraw + drawSize; ++xStep) - { - if ((xStep & 15) == (mapInfo.field_82569_d & 15)) - { - int highNumber = 255; - int lowNumber = 0; - - for (int zStep = zDraw - drawSize - 1; zStep < zDraw + drawSize; ++zStep) - { - if (xStep >= 0 && zStep >= -1 && xStep < xSize && zStep < zSize) - { - int xOffset = xStep - xDraw; - int zOffset = zStep - zDraw; - boolean var20 = xOffset * xOffset + zOffset * zOffset > (drawSize - 2) * (drawSize - 2); - int xDraw2 = (xCenter + xStep - xSize / 2); - int zDraw2 = (zCenter + zStep - zSize / 2); - Chunk chunk = par1World.getChunkFromBlockCoords(xDraw2, zDraw2); - int x15 = xDraw2 & 15; - int z15 = zDraw2 & 15; - int heightValue; - int colorIndex; - - heightValue = par3MapData.yCenter; - Block blockID = chunk.getBlock(x15, heightValue, z15); - - byte tint = 1; - - colorIndex = 0; - - // for stone, search up and down for ores - - if (blockID == Blocks.stone && mapOres) { - for (int i = -YSEARCH; i <= YSEARCH; i++) { - Block searchID = chunk.getBlock(x15, heightValue + i, z15); - if (searchID != Blocks.stone) { - blockID = searchID; - if (i > 0) { - tint = 2; - } - if (i < 0) { - tint = 0; - } - // stop searching - break; - } - } - - - } - - - if (blockID != Blocks.air) - { - MapColor mapColor = blockID.getMaterial().getMaterialMapColor(); - colorIndex = mapColor.colorIndex; - } - - if (mapOres) { - // need to reobfuscate - // recolor ores - if (blockID == Blocks.coal_ore) { - colorIndex = MapColor.obsidianColor.colorIndex; - } - else if (blockID == Blocks.gold_ore) { - colorIndex = MapColor.goldColor.colorIndex; - } - else if (blockID == Blocks.iron_ore) { - colorIndex = MapColor.ironColor.colorIndex; - } - else if (blockID == Blocks.lapis_ore) { - colorIndex = MapColor.lapisColor.colorIndex; - } - else if (blockID == Blocks.redstone_ore || blockID == Blocks.lit_redstone_ore) { - colorIndex = MapColor.redColor.colorIndex; - } - else if (blockID == Blocks.diamond_ore) { - colorIndex = MapColor.diamondColor.colorIndex; - } - else if (blockID == Blocks.emerald_ore) { - colorIndex = MapColor.emeraldColor.colorIndex; - } - else if (blockID != Blocks.air && blockID.getUnlocalizedName().toLowerCase().contains("ore")) - { - // any other ore, catchall - colorIndex = MapColor.pinkColor.colorIndex; - } - } - - if (zStep >= 0 && xOffset * xOffset + zOffset * zOffset < drawSize * drawSize && (!var20 || (xStep + zStep & 1) != 0)) - { - byte existingColor = par3MapData.colors[xStep + zStep * xSize]; - byte tintedColor = (byte)(colorIndex * 4 + tint); - - if (existingColor != tintedColor) - { - if (highNumber > zStep) - { - highNumber = zStep; - } - - if (lowNumber < zStep) - { - lowNumber = zStep; - } - - par3MapData.colors[xStep + zStep * xSize] = tintedColor; - } - } - } - } - - if (highNumber <= lowNumber) - { - par3MapData.setColumnDirty(xStep, highNumber, lowNumber); - } - } - } - } - } - - /** - * Called each tick as long the item is on a player inventory. Uses by maps to check if is on a player hand and - * update it's contents. - */ - public void onUpdate(ItemStack par1ItemStack, World par2World, Entity par3Entity, int par4, boolean isActiveItem) - { - if (!par2World.isRemote) - { - TFMazeMapData mapData = this.getMapData(par1ItemStack, par2World); - - if (par3Entity instanceof EntityPlayer) - { - EntityPlayer player = (EntityPlayer)par3Entity; - mapData.updateVisiblePlayers(player, par1ItemStack); - - int yProximity = MathHelper.floor_double(player.posY - mapData.yCenter); - if (yProximity < -YSEARCH || yProximity > YSEARCH) { - // fix player icon so that it's a dot - - MapCoord mapCoord = (MapCoord) mapData.playersVisibleOnMap.get(player.getCommandSenderName()); - if (mapCoord != null) - { - mapCoord.iconSize = 6; - } - } - } - - if (isActiveItem) - { - this.updateMapData(par2World, par3Entity, mapData); - } - } - } - - /** - * Called when item is crafted/smelted. Used only by maps so far. - */ - @Override - public void onCreated(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) - { - par1ItemStack.setItemDamage(par2World.getUniqueDataId(STR_ID)); - String mapName = STR_ID + "_" + par1ItemStack.getItemDamage(); - TFMazeMapData mapData = new TFMazeMapData(mapName); - par2World.setItemData(mapName, mapData); - mapData.xCenter = MathHelper.floor_double(par3EntityPlayer.posX); - mapData.yCenter = MathHelper.floor_double(par3EntityPlayer.posY); - mapData.zCenter = MathHelper.floor_double(par3EntityPlayer.posZ); - mapData.scale = 0; - mapData.dimension = par2World.provider.dimensionId; - mapData.markDirty(); - } - - /** - * Return an item rarity from EnumRarity - */ - @Override - public EnumRarity getRarity(ItemStack par1ItemStack) { - return mapOres ? EnumRarity.epic : EnumRarity.uncommon; - } - - /** - * Do the enchanted shimmer thing - */ - @Override - public boolean hasEffect(ItemStack par1ItemStack) - { - return false; - } - - /** - * returns null if no update is to be sent - * - * We have re-written this to provide a Packet250CustomPayload to be sent, since the map data packet is only for the actual map map. - */ - @Override - public Packet func_150911_c(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) - { - //System.out.println("Making maze map packet"); - //System.out.println("yCenter = " + this.getMapData(par1ItemStack, par2World).yCenter); - - byte[] mapBytes = this.getMapData(par1ItemStack, par2World).getUpdatePacketData(par1ItemStack, par2World, par3EntityPlayer); - - if (mapBytes == null) { - return null; - } - else { - short uniqueID = (short)par1ItemStack.getItemDamage(); - - return TFMapPacketHandler.makeMagicMapPacket(ItemTFMazeMap.STR_ID, uniqueID, mapBytes); - } - } - - /** - * Add the map number to the tooltip - */ - public String getItemStackDisplayName(ItemStack par1ItemStack) - { - return ("" + StatCollector.translateToLocal(this.getUnlocalizedNameInefficiently(par1ItemStack) + ".name") + " #" + par1ItemStack.getItemDamage()).trim(); - } - - /** - * Properly register icon source - */ - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister par1IconRegister) - { - this.itemIcon = par1IconRegister.registerIcon(TwilightForestMod.ID + ":" + this.getUnlocalizedName().substring(5)); - } -} diff --git a/src/main/java/twilightforest/item/ItemTFMazebreakerPick.java b/src/main/java/twilightforest/item/ItemTFMazebreakerPick.java deleted file mode 100644 index 8b57ecbd22..0000000000 --- a/src/main/java/twilightforest/item/ItemTFMazebreakerPick.java +++ /dev/null @@ -1,54 +0,0 @@ -package twilightforest.item; - -import java.util.List; - -import net.minecraft.block.Block; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.enchantment.Enchantment; -import net.minecraft.item.Item; -import net.minecraft.item.ItemPickaxe; -import net.minecraft.item.ItemStack; -import twilightforest.TwilightForestMod; -import twilightforest.block.TFBlocks; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public class ItemTFMazebreakerPick extends ItemPickaxe { - - protected ItemTFMazebreakerPick(Item.ToolMaterial par2EnumToolMaterial) { - super(par2EnumToolMaterial); - this.setCreativeTab(TFItems.creativeTab); - } - - /** - * returns a list of items with the same ID, but different meta (eg: dye returns 16 items) - */ - @SuppressWarnings({ "unchecked", "rawtypes" }) - @Override - public void getSubItems(Item par1, CreativeTabs par2CreativeTabs, List par3List) - { - ItemStack istack = new ItemStack(par1, 1, 0); - istack.addEnchantment(Enchantment.efficiency, 4); - istack.addEnchantment(Enchantment.unbreaking, 3); - istack.addEnchantment(Enchantment.fortune, 2); - par3List.add(istack); - } - - @Override - public float func_150893_a(ItemStack par1ItemStack, Block par2Block) { - float strVsBlock = super.func_150893_a(par1ItemStack, par2Block); - // 16x strength vs mazestone - return par2Block == TFBlocks.mazestone ? strVsBlock * 16F : strVsBlock; - } - - /** - * Properly register icon source - */ - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister par1IconRegister) - { - this.itemIcon = par1IconRegister.registerIcon(TwilightForestMod.ID + ":" + this.getUnlocalizedName().substring(5)); - } -} diff --git a/src/main/java/twilightforest/item/ItemTFMinotaurAxe.java b/src/main/java/twilightforest/item/ItemTFMinotaurAxe.java deleted file mode 100644 index 191f21380b..0000000000 --- a/src/main/java/twilightforest/item/ItemTFMinotaurAxe.java +++ /dev/null @@ -1,130 +0,0 @@ -package twilightforest.item; - -import java.util.List; - -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.entity.Entity; -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.ai.attributes.AttributeModifier; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.Item; -import net.minecraft.item.ItemAxe; -import net.minecraft.item.ItemStack; -import net.minecraft.util.StatCollector; -import twilightforest.TwilightForestMod; - -import com.google.common.collect.Multimap; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public class ItemTFMinotaurAxe extends ItemAxe { - - public static final int BONUS_CHARGING_DAMAGE = 7; - private Entity bonusDamageEntity; - private EntityPlayer bonusDamagePlayer; - private float damageVsEntity; - - protected ItemTFMinotaurAxe(Item.ToolMaterial par2EnumToolMaterial) { - super(par2EnumToolMaterial); - this.damageVsEntity = 4 + par2EnumToolMaterial.getDamageVsEntity(); - this.setCreativeTab(TFItems.creativeTab); - } - - /** - * returns a list of items with the same ID, but different meta (eg: dye returns 16 items) - */ - @Override - public void getSubItems(Item par1, CreativeTabs par2CreativeTabs, List par3List) - { - ItemStack istack = new ItemStack(par1, 1, 0); - //istack.addEnchantment(Enchantment.efficiency, 2); - par3List.add(istack); - } - - /** - * Called when the player Left Clicks (attacks) an entity. - * Processed before damage is done, if return value is true further processing is canceled - * and the entity is not attacked. - * - * @param stack The Item being used - * @param player The player that is attacking - * @param entity The entity being attacked - * @return True to cancel the rest of the interaction. - */ - @Override - public boolean onLeftClickEntity(ItemStack stack, EntityPlayer player, Entity entity) - { - // if the player is sprinting, keep the entity, we will do extra damage to it - if (player.isSprinting()) - { - this.bonusDamageEntity = entity; - this.bonusDamagePlayer = player; - } - - return false; - } - - /** - * Returns the damage against a given entity. - */ - public float getDamageVsEntity(Entity par1Entity, ItemStack itemStack) - { - if (this.bonusDamagePlayer != null && this.bonusDamageEntity != null && par1Entity == this.bonusDamageEntity) - { - //System.out.println("Minotaur Axe extra damage!"); - this.bonusDamagePlayer.onEnchantmentCritical(par1Entity); - this.bonusDamagePlayer = null; - this.bonusDamageEntity = null; - return damageVsEntity + BONUS_CHARGING_DAMAGE; - } - else - { - return damageVsEntity; - } - } - - /** - * Return the enchantability factor of the item, most of the time is based on material. - */ - @Override - public int getItemEnchantability() - { - return Item.ToolMaterial.GOLD.getEnchantability(); - } - - /** - * allows items to add custom lines of information to the mouseover description - */ - @Override - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) { - super.addInformation(par1ItemStack, par2EntityPlayer, par3List, par4); - par3List.add(StatCollector.translateToLocal(getUnlocalizedName() + ".tooltip")); - } - - /** - * Properly register icon source - */ - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister par1IconRegister) - { - this.itemIcon = par1IconRegister.registerIcon(TwilightForestMod.ID + ":" + this.getUnlocalizedName().substring(5)); - } - - /** - * Gets a map of item attribute modifiers, used by ItemSword to increase hit damage. - */ - public Multimap getItemAttributeModifiers() - { - Multimap multimap = super.getItemAttributeModifiers(); - // remove old damage value - multimap.removeAll(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName()); - // add new one - multimap.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), new AttributeModifier(field_111210_e, "Tool modifier", (double)this.damageVsEntity, 0)); - return multimap; - } -} - diff --git a/src/main/java/twilightforest/item/ItemTFMoonwormQueen.java b/src/main/java/twilightforest/item/ItemTFMoonwormQueen.java deleted file mode 100644 index c392f7d030..0000000000 --- a/src/main/java/twilightforest/item/ItemTFMoonwormQueen.java +++ /dev/null @@ -1,217 +0,0 @@ -package twilightforest.item; - -import net.minecraft.block.Block; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.item.EnumAction; -import net.minecraft.item.ItemStack; -import net.minecraft.util.IIcon; -import net.minecraft.world.World; -import twilightforest.TwilightForestMod; -import twilightforest.block.TFBlocks; -import twilightforest.entity.EntityTFMoonwormShot; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public class ItemTFMoonwormQueen extends ItemTF -{ - - private static final int FIRING_TIME = 12; - - private IIcon[] icons; - private String[] iconNames = new String[] {"moonwormQueen", "moonwormQueenAlt"}; - - protected ItemTFMoonwormQueen() { - super(); - this.setCreativeTab(TFItems.creativeTab); - this.maxStackSize = 1; - this.setMaxDamage(256); - } - - @Override - public ItemStack onItemRightClick(ItemStack par1ItemStack, World world, EntityPlayer player) { - if (par1ItemStack.getItemDamage() < this.getMaxDamage()) - { - player.setItemInUse(par1ItemStack, this.getMaxItemUseDuration(par1ItemStack)); - } - else - { - player.stopUsingItem(); - } - return par1ItemStack; - } - - /** - * Callback for item usage. If the item does something special on right clicking, he will have one of those. Return - * True if something happen and false if it don't. This is for ITEMS, not BLOCKS - */ - @Override - public boolean onItemUse(ItemStack par1ItemStack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ) - { - // adjust x, y, z for which block we're placing onto - Block currentBlockID = world.getBlock(x, y, z); - - if (currentBlockID == TFBlocks.moonworm) - { - return false; - } - - // don't wear item out, leave it at 0 uses left so that it can be recharged - if (par1ItemStack != null && par1ItemStack.getItemDamage() == this.getMaxDamage()) - { - return false; - } - - if (currentBlockID == Blocks.snow) - { - side = 1; - } - else if (currentBlockID != Blocks.vine && currentBlockID != Blocks.tallgrass && currentBlockID != Blocks.deadbush - && (currentBlockID == Blocks.air || !currentBlockID.isReplaceable(world, x, y, z))) - { - if (side == 0) - { - --y; - } - - if (side == 1) - { - ++y; - } - - if (side == 2) - { - --z; - } - - if (side == 3) - { - ++z; - } - - if (side == 4) - { - --x; - } - - if (side == 5) - { - ++x; - } - } - - // try to place firefly - if (world.canPlaceEntityOnSide(TFBlocks.moonworm, x, y, z, false, side, player, par1ItemStack)) - { - int placementMeta = TFBlocks.moonworm.onBlockPlaced(world, x, y, z, side, hitX, hitY, hitZ, 0); - if (world.setBlock(x, y, z, TFBlocks.moonworm, placementMeta, 3)) - { - if (world.getBlock(x, y, z) == TFBlocks.moonworm) - { - //((BlockTFMoonworm) TFBlocks.moonworm).updateBlockMetadata(world, x, y, z, side, hitX, hitY, hitZ); - TFBlocks.moonworm.onBlockPlacedBy(world, x, y, z, player, par1ItemStack); - } - - world.playSoundEffect((double)(x + 0.5F), (double)(y + 0.5F), (double)(z + 0.5F), this.getSound(), TFBlocks.moonworm.stepSound.getVolume() / 2.0F, TFBlocks.moonworm.stepSound.getPitch() * 0.8F); - - if (par1ItemStack != null) - { - par1ItemStack.damageItem(1, player); - player.stopUsingItem(); - } - } - - - return true; - } - else - { - return false; - } - } - - public String getSound() - { - return "mob.slime.big"; - } - - /** - * called when the player releases the use item button. Args: itemstack, world, entityplayer, itemInUseCount - */ - @Override - public void onPlayerStoppedUsing(ItemStack par1ItemStack, World world, EntityPlayer player, int useRemaining) - { - int useTime = this.getMaxItemUseDuration(par1ItemStack) - useRemaining; - - - if (!world.isRemote && useTime > FIRING_TIME && (par1ItemStack.getItemDamage() + 1) < this.getMaxDamage()) - { - boolean fired = world.spawnEntityInWorld(new EntityTFMoonwormShot(world, player)); - - if (fired) - { - par1ItemStack.damageItem(2, player); - - world.playSoundAtEntity(player, this.getSound(), 1.0F, 1.0F); - } - } - - } - - /** - * Player, Render pass, and item usage sensitive version of getIconIndex. - * - * @param stack The item stack to get the icon for. (Usually this, and usingItem will be the same if usingItem is not null) - * @param renderPass The pass to get the icon for, 0 is default. - * @param player The player holding the item - * @param usingItem The item the player is actively using. Can be null if not using anything. - * @param useRemaining The ticks remaining for the active item. - * @return The icon index - */ - @Override - public IIcon getIcon(ItemStack stack, int renderPass, EntityPlayer player, ItemStack usingItem, int useRemaining) { - if (usingItem != null && usingItem.getItem() == this) - { - int useTime = usingItem.getMaxItemUseDuration() - useRemaining; - if (useTime >= FIRING_TIME) - { - return (useTime >> 1) % 2 == 0 ? this.icons[0] : this.icons[1]; - } - } - return this.icons[0]; - - } - - - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister par1IconRegister) - { - super.registerIcons(par1IconRegister); - this.icons = new IIcon[iconNames.length]; - - for (int i = 0; i < this.iconNames.length; ++i) - { - this.icons[i] = par1IconRegister.registerIcon(TwilightForestMod.ID + ":" + iconNames[i]); - } - } - - /** - * returns the action that specifies what animation to play when the items is being used - */ - @Override - public EnumAction getItemUseAction(ItemStack par1ItemStack) - { - return EnumAction.bow; - } - - /** - * How long it takes to use or consume an item - */ - @Override - public int getMaxItemUseDuration(ItemStack par1ItemStack) - { - return 72000; - } - -} diff --git a/src/main/java/twilightforest/item/ItemTFNagaArmor.java b/src/main/java/twilightforest/item/ItemTFNagaArmor.java deleted file mode 100644 index d8fa0624fe..0000000000 --- a/src/main/java/twilightforest/item/ItemTFNagaArmor.java +++ /dev/null @@ -1,52 +0,0 @@ -package twilightforest.item; - -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.entity.Entity; -import net.minecraft.item.ItemArmor; -import net.minecraft.item.ItemStack; -import twilightforest.TwilightForestMod; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public class ItemTFNagaArmor extends ItemArmor { - - public ItemTFNagaArmor(ItemArmor.ArmorMaterial par2EnumArmorMaterial, int par3, int par4) { - super(par2EnumArmorMaterial, par3, par4); - this.setCreativeTab(TFItems.creativeTab); - } - - @Override - public String getArmorTexture(ItemStack itemstack, Entity entity, int slot, String layer) { - - - if(itemstack.getItem() == TFItems.plateNaga) - { - return TwilightForestMod.ARMOR_DIR + "naga_scale_1.png"; - } - if(itemstack.getItem() == TFItems.legsNaga) - { - return TwilightForestMod.ARMOR_DIR + "naga_scale_2.png"; - } - return TwilightForestMod.ARMOR_DIR + "naga_scale_1.png"; - } - - /** - * Return whether this item is repairable in an anvil. - */ - @Override - public boolean getIsRepairable(ItemStack par1ItemStack, ItemStack par2ItemStack) - { - // repair with naga scale - return par2ItemStack.getItem() == TFItems.nagaScale ? true : super.getIsRepairable(par1ItemStack, par2ItemStack); - } - - /** - * Properly register icon source - */ - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister par1IconRegister) - { - this.itemIcon = par1IconRegister.registerIcon(TwilightForestMod.ID + ":" + this.getUnlocalizedName().substring(5)); - } -} diff --git a/src/main/java/twilightforest/item/ItemTFOreMagnet.java b/src/main/java/twilightforest/item/ItemTFOreMagnet.java deleted file mode 100644 index 178a68bfc1..0000000000 --- a/src/main/java/twilightforest/item/ItemTFOreMagnet.java +++ /dev/null @@ -1,432 +0,0 @@ -package twilightforest.item; - -import java.util.ArrayList; - -import net.minecraft.block.Block; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.item.EnumAction; -import net.minecraft.item.ItemStack; -import net.minecraft.util.ChunkCoordinates; -import net.minecraft.util.IIcon; -import net.minecraft.util.MathHelper; -import net.minecraft.util.Vec3; -import net.minecraft.world.World; -import twilightforest.TwilightForestMod; -import twilightforest.block.BlockTFRoots; -import twilightforest.block.TFBlocks; -import twilightforest.world.TFGenerator; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public class ItemTFOreMagnet extends ItemTF -{ - - private static final float WIGGLE = 10F; - - private IIcon[] icons; - private String[] iconNames = new String[] {"oreMagnet", "oreMagnet1", "oreMagnet2"}; - - protected ItemTFOreMagnet() { - super(); - this.setCreativeTab(TFItems.creativeTab); - this.maxStackSize = 1; - this.setMaxDamage(12); - } - - @Override - public ItemStack onItemRightClick(ItemStack par1ItemStack, World world, EntityPlayer player) { - player.setItemInUse(par1ItemStack, this.getMaxItemUseDuration(par1ItemStack)); - return par1ItemStack; - } - - - /** - * called when the player releases the use item button. Args: itemstack, world, entityplayer, itemInUseCount - */ - @Override - public void onPlayerStoppedUsing(ItemStack par1ItemStack, World world, EntityPlayer player, int useRemaining) - { - int useTime = this.getMaxItemUseDuration(par1ItemStack) - useRemaining; - - if (!world.isRemote && useTime > 10) - { - //player.addChatMessage("Ore Magnet!"); - - int moved = doMagnet(world, player, 0, 0); - - if (moved == 0) - { - moved = doMagnet(world, player, WIGGLE, 0); - } - if (moved == 0) - { - moved = doMagnet(world, player, WIGGLE, WIGGLE); - } - if (moved == 0) - { - moved = doMagnet(world, player, 0, WIGGLE); - } - if (moved == 0) - { - moved = doMagnet(world, player, -WIGGLE, WIGGLE); - } - if (moved == 0) - { - moved = doMagnet(world, player, -WIGGLE, 0); - } - if (moved == 0) - { - moved = doMagnet(world, player, -WIGGLE, -WIGGLE); - } - if (moved == 0) - { - moved = doMagnet(world, player, 0, -WIGGLE); - } - if (moved == 0) - { - moved = doMagnet(world, player, WIGGLE, -WIGGLE); - } - - //player.addChatMessage("Cost: " + moved); - - if (moved > 0) - { - par1ItemStack.damageItem(moved, player); - - if (par1ItemStack.stackSize == 0) - { - player.destroyCurrentEquippedItem(); - } - - world.playSoundAtEntity(player, "mob.endermen.portal", 1.0F, 1.0F); - } - } - - } - - /** - * Player, Render pass, and item usage sensitive version of getIconIndex. - * - * @param stack The item stack to get the icon for. (Usually this, and usingItem will be the same if usingItem is not null) - * @param renderPass The pass to get the icon for, 0 is default. - * @param player The player holding the item - * @param usingItem The item the player is actively using. Can be null if not using anything. - * @param useRemaining The ticks remaining for the active item. - * @return The icon index - */ - @Override - public IIcon getIcon(ItemStack stack, int renderPass, EntityPlayer player, ItemStack usingItem, int useRemaining) { - if (usingItem != null && usingItem.getItem() == this) - { - int useTime = usingItem.getMaxItemUseDuration() - useRemaining; - if (useTime >= 20) - { - return (useTime >> 2) % 2 == 0 ? this.icons[2] : this.icons[1]; - - } - if (useTime > 10) - { - return this.icons[1]; - } - } - return this.icons[0]; - - } - - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister par1IconRegister) - { - super.registerIcons(par1IconRegister); - this.icons = new IIcon[iconNames.length]; - - for (int i = 0; i < this.iconNames.length; ++i) - { - this.icons[i] = par1IconRegister.registerIcon(TwilightForestMod.ID + ":" + iconNames[i]); - } - } - - /** - * returns the action that specifies what animation to play when the items is being used - */ - @Override - public EnumAction getItemUseAction(ItemStack par1ItemStack) - { - return EnumAction.bow; - } - - /** - * How long it takes to use or consume an item - */ - @Override - public int getMaxItemUseDuration(ItemStack par1ItemStack) - { - return 72000; - } - - /** - * Magnet from the player's position and facing to the specified offset - */ - protected int doMagnet(World world, EntityPlayer player, float yawOffset, float pitchOffset) { - - // find vector 32 blocks from look - double range = 32.0D; - Vec3 srcVec = Vec3.createVectorHelper(player.posX, player.posY + player.getEyeHeight(), player.posZ); - Vec3 lookVec = getOffsetLook(player, yawOffset, pitchOffset); - Vec3 destVec = srcVec.addVector(lookVec.xCoord * range, lookVec.yCoord * range, lookVec.zCoord * range); - - int useX = MathHelper.floor_double(srcVec.xCoord); - int useY = MathHelper.floor_double(srcVec.yCoord); - int useZ = MathHelper.floor_double(srcVec.zCoord); - - int destX = MathHelper.floor_double(destVec.xCoord); - int destY = MathHelper.floor_double(destVec.yCoord); - int destZ = MathHelper.floor_double(destVec.zCoord); - - int blocksMoved = doMagnet(world, useX, useY, useZ, destX, destY, destZ); - - return blocksMoved; - } - - /** - * This function makes the magnet work - */ - public static int doMagnet(World world, int useX, int useY, int useZ, int destX, int destY, int destZ) { - int blocksMoved = 0; - // get blocks in line from src to dest - ChunkCoordinates[] lineArray = TFGenerator.getBresehnamArrayCoords(useX, useY, useZ, destX, destY, destZ); - - //System.out.println("Searching from " + useX + ", " + useY + ", " + useZ + " to " + destX + ", " + destY + ", " + destZ); - - // find some ore? - Block foundID = Blocks.air; - int foundMeta = -1; - int foundX = -1; - int foundY = -1; - int foundZ = -1; - int baseX = -1; - int baseY = -1; - int baseZ = -1; - - boolean isNetherrack = false; - - for (ChunkCoordinates coord : lineArray) - { - Block searchID = world.getBlock(coord.posX, coord.posY, coord.posZ); - int searchMeta = world.getBlockMetadata(coord.posX, coord.posY, coord.posZ); - - // keep track of where the dirt/stone we first find is.s - if (baseY == -1) - { - if (isReplaceable(world, searchID, searchMeta, coord.posX, coord.posY, coord.posZ)) - { - baseX = coord.posX; - baseY = coord.posY; - baseZ = coord.posZ; - - } - else if (isNetherReplaceable(world, searchID, searchMeta, coord.posX, coord.posY, coord.posZ)) - { - isNetherrack = true; - baseX = coord.posX; - baseY = coord.posY; - baseZ = coord.posZ; - } - } - - if (searchID != Blocks.air && isOre(searchID, searchMeta)) - { - //System.out.println("I found ore: " + searchID + " at " + coord.PosX + ", " + coord.PosY + ", " + coord.PosZ); - - foundID = searchID; - foundMeta = searchMeta; - foundX = coord.posX; - foundY = coord.posY; - foundZ = coord.posZ; - - break; - } - } - - //System.out.println("I found ground at " + baseX + ", " + baseY + ", " + baseZ); - - - if (baseY != -1 && foundID != Blocks.air) - { - // find the whole vein - ArrayList veinBlocks = new ArrayList(); - findVein(world, foundX, foundY, foundZ, foundID, foundMeta, veinBlocks); - - // move it up into minable blocks or dirt - int offX = baseX - foundX; - int offY = baseY - foundY; - int offZ = baseZ - foundZ; - - for (ChunkCoordinates coord : veinBlocks) - { - int replaceX = coord.posX + offX; - int replaceY = coord.posY + offY; - int replaceZ = coord.posZ + offZ; - - Block replaceID = world.getBlock(replaceX, replaceY, replaceZ); - int replaceMeta = world.getBlockMetadata(replaceX, replaceY, replaceZ); - - if ((isNetherrack ? isNetherReplaceable(world, replaceID, replaceMeta, replaceX, replaceY, replaceZ) : isReplaceable(world, replaceID, replaceMeta, replaceX, replaceY, replaceZ)) || replaceID == Blocks.air) - { - // set vein to stone / netherrack - world.setBlock(coord.posX, coord.posY, coord.posZ, isNetherrack ? Blocks.netherrack : Blocks.stone, 0, 2); - - // set close to ore material - world.setBlock(replaceX, replaceY, replaceZ, foundID, foundMeta, 2); - blocksMoved++; - } - else - { - //System.out.println("Not moving a block because we did not find a replaceable block to move to"); - } - } - -// player.addChatMessage("Moved blocks! " + blocksMoved); - } - return blocksMoved; - } - - /** - * Get the player look vector, but offset by the specified parameters. We use to scan the area around where the player is looking - * in the likely case there's no ore in the exact look direction. - */ - private Vec3 getOffsetLook(EntityPlayer player, float yawOffset, float pitchOffset) { - float var2 = MathHelper.cos(-(player.rotationYaw + yawOffset) * 0.017453292F - (float)Math.PI); - float var3 = MathHelper.sin(-(player.rotationYaw + yawOffset) * 0.017453292F - (float)Math.PI); - float var4 = -MathHelper.cos(-(player.rotationPitch + pitchOffset) * 0.017453292F); - float var5 = MathHelper.sin(-(player.rotationPitch + pitchOffset) * 0.017453292F); - return Vec3.createVectorHelper(var3 * var4, var5, var2 * var4); - } - - private static boolean isReplaceable(World world, Block replaceID, int replaceMeta, int x, int y, int z) - { - if (replaceID == Blocks.dirt) - { - return true; - } - if (replaceID == Blocks.grass) - { - return true; - } - if (replaceID == Blocks.gravel) - { - return true; - } - if (replaceID != Blocks.air && replaceID.isReplaceableOreGen(world, x, y, z, Blocks.stone)) - { - return true; - } - - return false; - } - - private static boolean isNetherReplaceable(World world, Block replaceID, int replaceMeta, int x, int y, int z) - { - if (replaceID == Blocks.netherrack) - { - return true; - } - if (replaceID != Blocks.air && replaceID.isReplaceableOreGen(world, x, y, z, Blocks.netherrack)) - { - return true; - } - - return false; - } - - private static boolean findVein(World world, int x, int y, int z, Block oreID, int oreMeta, ArrayList veinBlocks) - { - ChunkCoordinates here = new ChunkCoordinates(x, y, z); - - // is this already on the list? - if (veinBlocks.contains(here)) - { - return false; - } - - // let's limit it to 24 blocks at a time - if (veinBlocks.size() >= 24) - { - return false; - } - - // otherwise, check if we're still in the vein - if (world.getBlock(x, y, z) == oreID && world.getBlockMetadata(x, y, z) == oreMeta) - { - veinBlocks.add(here); - - // recurse in 6 directions - findVein(world, x + 1, y, z, oreID, oreMeta, veinBlocks); - findVein(world, x - 1, y, z, oreID, oreMeta, veinBlocks); - findVein(world, x, y + 1, z, oreID, oreMeta, veinBlocks); - findVein(world, x, y - 1, z, oreID, oreMeta, veinBlocks); - findVein(world, x, y, z + 1, oreID, oreMeta, veinBlocks); - findVein(world, x, y, z - 1, oreID, oreMeta, veinBlocks); - - return true; - } - else - { - return false; - } - } - - - public static boolean isOre(Block blockID, int meta) { - - if (blockID == Blocks.coal_ore) - { - return false; - } - if (blockID == Blocks.iron_ore) - { - return true; - } - if (blockID == Blocks.diamond_ore) - { - return true; - } - if (blockID == Blocks.emerald_ore) - { - return true; - } - if (blockID == Blocks.gold_ore) - { - return true; - } - if (blockID == Blocks.lapis_ore) - { - return true; - } - if (blockID == Blocks.redstone_ore) - { - return true; - } - if (blockID == Blocks.lit_redstone_ore) - { - return true; - } - if (blockID == Blocks.quartz_ore) - { - return true; - } - if (blockID == TFBlocks.root && meta == BlockTFRoots.OREROOT_META) - { - return true; - } - if (blockID.getUnlocalizedName().toLowerCase().contains("ore")) - { - return true; - } - - return false; - } - - -} diff --git a/src/main/java/twilightforest/item/ItemTFOreMeter.java b/src/main/java/twilightforest/item/ItemTFOreMeter.java deleted file mode 100644 index e3a75067a3..0000000000 --- a/src/main/java/twilightforest/item/ItemTFOreMeter.java +++ /dev/null @@ -1,225 +0,0 @@ -package twilightforest.item; - -import java.util.List; - -import net.minecraft.block.Block; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.item.ItemStack; -import net.minecraft.util.MathHelper; -import net.minecraft.world.World; -import net.minecraft.world.chunk.Chunk; -import twilightforest.TwilightForestMod; -import twilightforest.block.BlockTFRoots; -import twilightforest.block.TFBlocks; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - - - -public class ItemTFOreMeter extends ItemTF { - - protected ItemTFOreMeter() { - super(); - this.setCreativeTab(TFItems.creativeTab); - } - - - - @Override - public ItemStack onItemRightClick(ItemStack par1ItemStack, World world, EntityPlayer player) { - - int useX = MathHelper.floor_double(player.posX); - int useZ = MathHelper.floor_double(player.posZ); - - if (!world.isRemote) { - countOreInArea(player, world, useX, useZ, 3); - } - -// player.addChatMessage("func_72971_b = " + player.worldObj.func_72971_b(1.0f)); -// player.addChatMessage("calculateSkylightSubtracted = " + player.worldObj.calculateSkylightSubtracted(1.0f)); - -// player.addChatMessage("player health =" + player.getHealth()); - - - return super.onItemRightClick(par1ItemStack, world, player); - } - - private void countOreInChunk(EntityPlayer player, World world, int useX, int useZ) { - int chunkX = useX >> 4; - int chunkZ = useZ >> 4; - - int countStone = countBlockInChunk(world, Blocks.stone, chunkX, chunkZ); - int countDirt = countBlockInChunk(world, Blocks.dirt, chunkX, chunkZ); - int countGravel = countBlockInChunk(world, Blocks.gravel, chunkX, chunkZ); - - int countCoal = countBlockInChunk(world, Blocks.coal_ore, chunkX, chunkZ); - int countIron = countBlockInChunk(world, Blocks.iron_ore, chunkX, chunkZ); - int countGold = countBlockInChunk(world, Blocks.gold_ore, chunkX, chunkZ); - int countDiamond = countBlockInChunk(world, Blocks.diamond_ore, chunkX, chunkZ); - int countLapis = countBlockInChunk(world, Blocks.lapis_ore, chunkX, chunkZ); - int countRedstone = countBlockInChunk(world, Blocks.redstone_ore, chunkX, chunkZ); - - int countRoots = countBlockInChunk(world, TFBlocks.root, BlockTFRoots.ROOT_META, chunkX, chunkZ); - int countOreRoots = countBlockInChunk(world, TFBlocks.root, BlockTFRoots.OREROOT_META, chunkX, chunkZ); - - int total = countStone + countDirt + countGravel + countCoal + countIron + countGold + countDiamond + countLapis + countRedstone + countRoots + countOreRoots; - - -// player.addChatMessage("Ore Meter!"); -// player.addChatMessage("Metering chunk [" + chunkX + ", " + chunkZ + "]"); -// player.addChatMessage("Coal - " + countCoal + " " + percent(countCoal, total)); -// player.addChatMessage("Iron - " + countIron + " " + percent(countIron, total)); -// player.addChatMessage("Gold - " + countGold + " " + percent(countGold, total)); -// player.addChatMessage("Diamond - " + countDiamond + " " + percent(countDiamond, total)); -// player.addChatMessage("Lapis - " + countLapis + " " + percent(countLapis, total)); -// player.addChatMessage("Redstone - " + countRedstone + " " + percent(countRedstone, total)); -// player.addChatMessage("Roots - " + countRoots + " " + percent(countRoots, total)); -// player.addChatMessage("Ore Roots - " + countOreRoots + " " + percent(countOreRoots, total)); - } - - private void countOreInArea(EntityPlayer player, World world, int useX, int useZ, int radius) { - int chunkX = useX >> 4; - int chunkZ = useZ >> 4; - - - int countStone = 0; - int countDirt = 0; - int countGravel = 0; - - int countCoal = 0; - int countIron = 0; - int countGold = 0; - int countDiamond = 0; - int countLapis = 0; - int countRedstone = 0; - int countExposedDiamond = 0; - - int countRoots = 0; - int countOreRoots = 0; - - int total = 0; - - - for (int cx = chunkX - radius; cx <= chunkX + radius; cx++) { - for (int cz = chunkZ - radius; cz <= chunkZ + radius; cz++) { - - countStone += countBlockInChunk(world, Blocks.stone, cx, cz); - countDirt += countBlockInChunk(world, Blocks.dirt, cx, cz); - countGravel += countBlockInChunk(world, Blocks.gravel, cx, cz); - - countCoal += countBlockInChunk(world, Blocks.coal_ore, cx, cz); - countIron += countBlockInChunk(world, Blocks.iron_ore, cx, cz); - countGold += countBlockInChunk(world, Blocks.gold_ore, cx, cz); - countDiamond += countBlockInChunk(world, Blocks.diamond_ore, cx, cz); - countLapis += countBlockInChunk(world, Blocks.lapis_ore, cx, cz); - countRedstone += countBlockInChunk(world, Blocks.redstone_ore, cx, cz); - countExposedDiamond += countExposedBlockInChunk(world, Blocks.diamond_ore, cx, cz); - - - countRoots += countBlockInChunk(world, TFBlocks.root, BlockTFRoots.ROOT_META, cx, cz); - countOreRoots += countBlockInChunk(world, TFBlocks.root, BlockTFRoots.OREROOT_META, cx, cz); - - - } - } - - total = countStone + countDirt + countGravel + countCoal + countIron + countGold + countDiamond + countLapis + countRedstone + countRoots + countOreRoots; - - -// player.addChatMessage("Ore Meter!"); -// player.addChatMessage("Metering chunks in radius " + radius + " around chunk [" + chunkX + ", " + chunkZ + "]"); -// player.addChatMessage("Coal - " + countCoal + " " + percent(countCoal, total)); -// player.addChatMessage("Iron - " + countIron + " " + percent(countIron, total)); -// player.addChatMessage("Gold - " + countGold + " " + percent(countGold, total)); -// player.addChatMessage("Diamond - " + countDiamond + " " + percent(countDiamond, total) + ", exposed - " + countExposedDiamond); -// player.addChatMessage("Lapis - " + countLapis + " " + percent(countLapis, total)); -// player.addChatMessage("Redstone - " + countRedstone + " " + percent(countRedstone, total)); -// player.addChatMessage("Roots - " + countRoots + " " + percent(countRoots, total)); -// player.addChatMessage("Ore Roots - " + countOreRoots + " " + percent(countOreRoots, total)); - } - - public float percent(int count, int total) { - return (float)count / (float)total * 100F; - } - - public int countBlockInChunk(World world, Block stone, int cx, int cz) { - - Chunk chunk = world.getChunkFromChunkCoords(cx, cz); - - int count = 0; - - for (int x = 0; x < 16; x++) { - for (int z = 0; z < 16; z++) { - for (int y = 0; y < 256; y++) { - if (chunk.getBlock(x, y, z) == stone) { - count++; - } - } - } - } - - return count; - } - - public int countBlockInChunk(World world, Block blockID, int meta, int cx, int cz) { - - Chunk chunk = world.getChunkFromChunkCoords(cx, cz); - - int count = 0; - - for (int x = 0; x < 16; x++) { - for (int z = 0; z < 16; z++) { - for (int y = 0; y < 256; y++) { - if (chunk.getBlock(x, y, z) == blockID && chunk.getBlockMetadata(x, y, z) == meta) { - count++; - } - } - } - } - - return count; - } - - private int countExposedBlockInChunk(World world, Block blockID, int cx, int cz) { - - int count = 0; - - for (int x = cx << 4; x < (cx << 4) + 16; x++) { - for (int z = cz << 4; z < (cz << 4) + 16; z++) { - for (int y = 0; y < 256; y++) { - if (world.getBlock(x, y, z) == blockID) { - // check if exposed - if (world.isAirBlock(x + 1, y, z) || world.isAirBlock(x - 1, y, z) - ||world.isAirBlock(x, y + 1, z) || world.isAirBlock(x, y - 1, z) - ||world.isAirBlock(x, y + 1, z) || world.isAirBlock(x, y - 1, z)) - { - count++; - } - } - } - } - } - - return count; - - } - - - - @Override - public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) { - super.addInformation(par1ItemStack, par2EntityPlayer, par3List, par4); - } - - /** - * Properly register icon source - */ - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister par1IconRegister) - { - this.itemIcon = par1IconRegister.registerIcon(TwilightForestMod.ID + ":" + this.getUnlocalizedName().substring(5)); - } -} diff --git a/src/main/java/twilightforest/item/ItemTFPeacockFan.java b/src/main/java/twilightforest/item/ItemTFPeacockFan.java deleted file mode 100644 index a48ef6f5da..0000000000 --- a/src/main/java/twilightforest/item/ItemTFPeacockFan.java +++ /dev/null @@ -1,235 +0,0 @@ -package twilightforest.item; - -import java.util.List; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockFlower; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.entity.Entity; -import net.minecraft.entity.item.EntityItem; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.item.EnumAction; -import net.minecraft.item.ItemStack; -import net.minecraft.potion.Potion; -import net.minecraft.potion.PotionEffect; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.MathHelper; -import net.minecraft.util.Vec3; -import net.minecraft.world.World; -import twilightforest.TwilightForestMod; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public class ItemTFPeacockFan extends ItemTF -{ - protected ItemTFPeacockFan() { - super(); - this.setCreativeTab(TFItems.creativeTab); - this.maxStackSize = 1; - this.setMaxDamage(1024); - } - - @Override - public ItemStack onItemRightClick(ItemStack par1ItemStack, World world, EntityPlayer player) { - - if (!world.isRemote) - { - if (!player.onGround) - { - player.addPotionEffect(new PotionEffect(Potion.jump.id, 45, 0)); - } - else - { - int fanned = 0; - - fanned = doFan(world, player); - - if (fanned > 0) - { - par1ItemStack.damageItem(fanned, player); - - } - } - - } - else - { - - - // jump if the player is in the air - //TODO: only one extra jump per jump - if (!player.onGround && !player.isPotionActive(Potion.jump.id)) - { - player.motionX *= 3F; - player.motionY = 1.5F; - player.motionZ *= 3F; - player.fallDistance = 0.0F; - } - else - { - AxisAlignedBB fanBox = getEffectAABB(world, player); - Vec3 lookVec = player.getLookVec(); - - // particle effect - for (int i = 0; i < 30; i++) - { - world.spawnParticle("cloud", fanBox.minX + world.rand.nextFloat() * (fanBox.maxX - fanBox.minX), - fanBox.minY + world.rand.nextFloat() * (fanBox.maxY - fanBox.minY), - fanBox.minZ + world.rand.nextFloat() * (fanBox.maxZ - fanBox.minZ), - lookVec.xCoord, lookVec.yCoord, lookVec.zCoord); - } - - } - - world.playSound(player.posX + 0.5D, player.posY + 0.5D, player.posZ + 0.5D, "random.breath", 1.0F + itemRand.nextFloat(), itemRand.nextFloat() * 0.7F + 0.3F, false); - - } - - player.setItemInUse(par1ItemStack, this.getMaxItemUseDuration(par1ItemStack)); - - return par1ItemStack; - } - - /** - * returns the action that specifies what animation to play when the items is being used - */ - @Override - public EnumAction getItemUseAction(ItemStack par1ItemStack) - { - return EnumAction.block; - } - - /** - * How long it takes to use or consume an item - */ - @Override - public int getMaxItemUseDuration(ItemStack par1ItemStack) - { - return 20; - } - - /** - * Returns True is the item is renderer in full 3D when hold. - */ - @Override - public boolean isFull3D() - { - return true; - } - - /** - * Fannnn - */ - private int doFan(World world, EntityPlayer player) - { - AxisAlignedBB fanBox = getEffectAABB(world, player); - - fanBlocksInAABB(world, player, fanBox); - - fanEntitiesInAABB(world, player, fanBox); - - return 1; - } - - /** - * Move entities in the box - */ - private void fanEntitiesInAABB(World world, EntityPlayer player, AxisAlignedBB fanBox) - { - Vec3 moveVec = player.getLookVec(); - - List inBox = world.getEntitiesWithinAABB(Entity.class, fanBox); - - float force = 2.0F; - - for (Entity entity : inBox) - { - if (entity.canBePushed() || entity instanceof EntityItem) - { - entity.motionX = moveVec.xCoord * force; - entity.motionY = moveVec.yCoord * force; - entity.motionZ = moveVec.zCoord * force; - } - } - - } - - private AxisAlignedBB getEffectAABB(World world, EntityPlayer player) { - double range = 3.0D; - double radius = 2.0D; - Vec3 srcVec = Vec3.createVectorHelper(player.posX, player.posY + player.getEyeHeight(), player.posZ); - Vec3 lookVec = player.getLookVec(); - Vec3 destVec = srcVec.addVector(lookVec.xCoord * range, lookVec.yCoord * range, lookVec.zCoord * range); - - AxisAlignedBB crumbleBox = AxisAlignedBB.getBoundingBox(destVec.xCoord - radius, destVec.yCoord - radius, destVec.zCoord - radius, destVec.xCoord + radius, destVec.yCoord + radius, destVec.zCoord + radius); - return crumbleBox; - } - - - /** - * Do fan effects on blocks in the bounding box - * @param player - */ - private int fanBlocksInAABB(World world, EntityPlayer player, AxisAlignedBB par1AxisAlignedBB) - { - - int minX = MathHelper.floor_double(par1AxisAlignedBB.minX); - int minY = MathHelper.floor_double(par1AxisAlignedBB.minY); - int minZ = MathHelper.floor_double(par1AxisAlignedBB.minZ); - int maxX = MathHelper.floor_double(par1AxisAlignedBB.maxX); - int maxY = MathHelper.floor_double(par1AxisAlignedBB.maxY); - int maxZ = MathHelper.floor_double(par1AxisAlignedBB.maxZ); - - int fan = 0; - - for (int dx = minX; dx <= maxX; ++dx) - { - for (int dy = minY; dy <= maxY; ++dy) - { - for (int dz = minZ; dz <= maxZ; ++dz) - { - fan += fanBlock(world, player, dx, dy, dz); - } - } - } - - - - return fan; - } - - private int fanBlock(World world, EntityPlayer player, int dx, int dy, int dz) { - int cost = 0; - - Block currentID = world.getBlock(dx, dy, dz); - - if (currentID != Blocks.air) - { - int currentMeta = world.getBlockMetadata(dx, dy, dz); - - if (currentID instanceof BlockFlower) - { - if(currentID.canHarvestBlock(player, currentMeta) && itemRand.nextInt(3) == 0) - { - currentID.harvestBlock(world, player, dx, dy, dz, currentMeta); - world.setBlock(dx, dy, dz, Blocks.air, 0, 3); - world.playAuxSFX(2001, dx, dy, dz, Block.getIdFromBlock(currentID) + (currentMeta << 12)); - } - } - - } - - return cost; - } - - /** - * Properly register icon source - */ - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister par1IconRegister) - { - this.itemIcon = par1IconRegister.registerIcon(TwilightForestMod.ID + ":" + this.getUnlocalizedName().substring(5)); - } -} diff --git a/src/main/java/twilightforest/item/ItemTFPhantomArmor.java b/src/main/java/twilightforest/item/ItemTFPhantomArmor.java deleted file mode 100644 index 236c398464..0000000000 --- a/src/main/java/twilightforest/item/ItemTFPhantomArmor.java +++ /dev/null @@ -1,98 +0,0 @@ -package twilightforest.item; - -import java.util.List; - -import net.minecraft.client.model.ModelBiped; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.item.EnumRarity; -import net.minecraft.item.Item; -import net.minecraft.item.ItemArmor; -import net.minecraft.item.ItemStack; -import twilightforest.TwilightForestMod; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public class ItemTFPhantomArmor extends ItemArmor { - - public ItemTFPhantomArmor(ItemArmor.ArmorMaterial par2EnumArmorMaterial, int renderIndex, int armorType) { - super(par2EnumArmorMaterial, renderIndex, armorType); - this.setCreativeTab(TFItems.creativeTab); - } - - /** - * Return an item rarity from EnumRarity - */ - @Override - public EnumRarity getRarity(ItemStack par1ItemStack) { - return EnumRarity.epic; - } - - /** - * Called by RenderBiped and RenderPlayer to determine the armor texture that - * should be use for the currently equiped item. - * This will only be called on instances of ItemArmor. - * - * Returning null from this function will use the default value. - * - * @param stack ItemStack for the equpt armor - * @param entity The entity wearing the armor - * @param slot The slot the armor is in - * @param layer The render layer, either 1 or 2, 2 is only used for CLOTH armor by default - * @return Path of texture to bind, or null to use default - */ - public String getArmorTexture(ItemStack itemstack, Entity entity, int slot, String layer) - { - // there's no legs, so let's not worry about them - return TwilightForestMod.ARMOR_DIR + "phantom_1.png"; - } - - /** - * returns a list of items with the same ID, but different meta (eg: dye returns 16 items) - */ - @SuppressWarnings({ "unchecked", "rawtypes" }) - @Override - public void getSubItems(Item par1, CreativeTabs par2CreativeTabs, List par3List) - { - ItemStack istack = new ItemStack(par1, 1, 0); - //istack.addEnchantment(TFEnchantment.reactFire, 2); - par3List.add(istack); - } - - /** - * Return whether this item is repairable in an anvil. - */ - @Override - public boolean getIsRepairable(ItemStack par1ItemStack, ItemStack par2ItemStack) - { - // repair with knightmetal ingots - return par2ItemStack.getItem() == TFItems.knightMetal ? true : super.getIsRepairable(par1ItemStack, par2ItemStack); - } - - /** - * Properly register icon source - */ - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister par1IconRegister) - { - this.itemIcon = par1IconRegister.registerIcon(TwilightForestMod.ID + ":" + this.getUnlocalizedName().substring(5)); - } - - /** - * Override this method to have an item handle its own armor rendering. - * - * @param entityLiving The entity wearing the armor - * @param itemStack The itemStack to render the model of - * @param armorSlot 0=head, 1=torso, 2=legs, 3=feet - * - * @return A ModelBiped to render instead of the default - */ - @SideOnly(Side.CLIENT) - public ModelBiped getArmorModel(EntityLivingBase entityLiving, ItemStack itemStack, int armorSlot) - { - return TwilightForestMod.proxy.getPhantomArmorModel(armorSlot); - } -} diff --git a/src/main/java/twilightforest/item/ItemTFScepterLifeDrain.java b/src/main/java/twilightforest/item/ItemTFScepterLifeDrain.java deleted file mode 100644 index 464116dd49..0000000000 --- a/src/main/java/twilightforest/item/ItemTFScepterLifeDrain.java +++ /dev/null @@ -1,277 +0,0 @@ -package twilightforest.item; - -import java.util.List; - -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLiving; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Items; -import net.minecraft.item.EnumAction; -import net.minecraft.item.EnumRarity; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.potion.Potion; -import net.minecraft.potion.PotionEffect; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.DamageSource; -import net.minecraft.util.MovingObjectPosition; -import net.minecraft.util.Vec3; -import net.minecraft.world.World; -import twilightforest.TwilightForestMod; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - - -public class ItemTFScepterLifeDrain extends ItemTF { - - protected ItemTFScepterLifeDrain() { - super(); - this.maxStackSize = 1; - this.setMaxDamage(99); - this.setCreativeTab(TFItems.creativeTab); - - } - - @Override - public ItemStack onItemRightClick(ItemStack par1ItemStack, World worldObj, EntityPlayer player) { - if (par1ItemStack.getItemDamage() < this.getMaxDamage()) { - player.setItemInUse(par1ItemStack, this.getMaxItemUseDuration(par1ItemStack)); - } - else { - player.stopUsingItem(); - } - - return par1ItemStack; - } - - /** - * Animates the target falling apart into a rain of shatter particles - */ - public static void animateTargetShatter(World worldObj, EntityLivingBase target) { - for (int var1 = 0; var1 < 50; ++var1) - { - double gaussX = itemRand.nextGaussian() * 0.02D; - double gaussY = itemRand.nextGaussian() * 0.02D; - double gaussZ = itemRand.nextGaussian() * 0.02D; - double gaussFactor = 10.0D; - - Item popItem = getTargetDropItemId(target) != null ? getTargetDropItemId(target) : Items.rotten_flesh; - - worldObj.spawnParticle("iconcrack_" + Item.getIdFromItem(popItem), target.posX + itemRand.nextFloat() * target.width * 2.0F - target.width - gaussX * gaussFactor, target.posY + itemRand.nextFloat() * target.height - gaussY * gaussFactor, target.posZ + itemRand.nextFloat() * target.width * 2.0F - target.width - gaussZ * gaussFactor, gaussX, gaussY, gaussZ); - } - } - - public static Item getTargetDropItemId(EntityLivingBase target) { - //TODO: make this actually work - return Items.rotten_flesh; - } - - /** - * What, if anything, is the player currently looking at? - */ - private Entity getPlayerLookTarget(World worldObj, EntityPlayer player) { - Entity pointedEntity = null; - double range = 20.0D; - Vec3 srcVec = Vec3.createVectorHelper(player.posX, player.posY + player.getEyeHeight(), player.posZ); - Vec3 lookVec = player.getLook(1.0F); - Vec3 destVec = srcVec.addVector(lookVec.xCoord * range, lookVec.yCoord * range, lookVec.zCoord * range); - float var9 = 1.0F; - List possibleList = worldObj.getEntitiesWithinAABBExcludingEntity(player, player.boundingBox.addCoord(lookVec.xCoord * range, lookVec.yCoord * range, lookVec.zCoord * range).expand(var9, var9, var9)); - double hitDist = 0; - - for (Entity possibleEntity : possibleList) - { - - - if (possibleEntity.canBeCollidedWith()) - { - float borderSize = possibleEntity.getCollisionBorderSize(); - AxisAlignedBB collisionBB = possibleEntity.boundingBox.expand((double)borderSize, (double)borderSize, (double)borderSize); - MovingObjectPosition interceptPos = collisionBB.calculateIntercept(srcVec, destVec); - - if (collisionBB.isVecInside(srcVec)) - { - if (0.0D < hitDist || hitDist == 0.0D) - { - pointedEntity = possibleEntity; - hitDist = 0.0D; - } - } - else if (interceptPos != null) - { - double possibleDist = srcVec.distanceTo(interceptPos.hitVec); - - if (possibleDist < hitDist || hitDist == 0.0D) - { - pointedEntity = possibleEntity; - hitDist = possibleDist; - } - } - } - } - return pointedEntity; - } - - - @Override - public void onUsingTick(ItemStack stack, EntityPlayer player, int count) { - World worldObj = player.worldObj; - - if (stack.getItemDamage() >= this.getMaxDamage()) { - // do not use - player.stopUsingItem(); - return; - } - - if (count % 5 == 0) { - - // is the player looking at an entity - Entity pointedEntity = getPlayerLookTarget(worldObj, player); - - if (pointedEntity != null && pointedEntity instanceof EntityLivingBase) { - EntityLivingBase target = (EntityLivingBase)pointedEntity; - - if (target.getActivePotionEffect(Potion.moveSlowdown) != null || target.getHealth() < 1) { - - if (target.getHealth() <= 3) { - // make it explode - - makeRedMagicTrail(worldObj, player.posX, player.posY + player.getEyeHeight(), player.posZ, target.posX, target.posY + target.getEyeHeight(), target.posZ); - if (target instanceof EntityLiving) - { - ((EntityLiving) target).spawnExplosionParticle(); - } - worldObj.playSoundAtEntity(target, "game.player.hurt.fall.big", 1.0F, ((itemRand.nextFloat() - itemRand.nextFloat()) * 0.7F + 1.0F) * 2.0F); - animateTargetShatter(worldObj, (EntityLivingBase) target); - if (!worldObj.isRemote) { - target.setDead(); - target.onDeath(DamageSource.causeIndirectMagicDamage(player, player)); - } - player.stopUsingItem(); - } - else { - // we have hit this creature recently - if (!worldObj.isRemote) { - target.attackEntityFrom(DamageSource.causeIndirectMagicDamage(player, player), 3); - - // only do lifting effect on creatures weaker than the player - if (getMaxHealth(target) <= getMaxHealth(player)) { - target.motionX = 0; - target.motionY = 0.2; - target.motionZ = 0; - } - - target.addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 20, 2)); - - if (count % 10 == 0) { - // heal the player - player.heal(1); - // and give foods - player.getFoodStats().addStats(1, 0.1F); - } - } - } - } - else { - // this is a new creature to start draining - makeRedMagicTrail(worldObj, player.posX, player.posY + player.getEyeHeight(), player.posZ, target.posX, target.posY + target.getEyeHeight(), target.posZ); - - worldObj.playSoundAtEntity(player, "fire.ignite", 1.0F, (worldObj.rand.nextFloat() - worldObj.rand.nextFloat()) * 0.2F + 1.0F); - - if (!worldObj.isRemote) { - target.attackEntityFrom(DamageSource.causeIndirectMagicDamage(player, player), 1); - - // only do lifting effect on creatures weaker than the player - if (getMaxHealth(target) <= getMaxHealth(player)) { - target.motionX = 0; - target.motionY = 0.2; - target.motionZ = 0; - } - - target.addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 20, 2)); - } - } - - if (!worldObj.isRemote) { - stack.damageItem(1, player); - } - - } - } - - } - - private float getMaxHealth(EntityLivingBase target) - { - return (float) target.getEntityAttribute(SharedMonsterAttributes.maxHealth).getBaseValue(); - } - - /** - * Make a trail of particles from one point to another - */ - protected void makeRedMagicTrail(World worldObj, double srcX, double srcY, double srcZ, double destX, double destY, double destZ) { - // make particle trail - int particles = 32; - for (int i = 0; i < particles; i++) - { - double trailFactor = i / (particles - 1.0D); - float f = 1.0F; - float f1 = 0.5F; - float f2 = 0.5F; - double tx = srcX + (destX - srcX) * trailFactor + worldObj.rand.nextGaussian() * 0.005; - double ty = srcY + (destY - srcY) * trailFactor + worldObj.rand.nextGaussian() * 0.005; - double tz = srcZ + (destZ - srcZ) * trailFactor + worldObj.rand.nextGaussian() * 0.005; - worldObj.spawnParticle("mobSpell", tx, ty, tz, f, f1, f2); - } - } - - /** - * How long it takes to use or consume an item - */ - @Override - public int getMaxItemUseDuration(ItemStack par1ItemStack) - { - return 72000; - } - - /** - * returns the action that specifies what animation to play when the items is being used - */ - @Override - public EnumAction getItemUseAction(ItemStack par1ItemStack) - { - return EnumAction.bow; - } - - - /** - * Return an item rarity from EnumRarity - */ - @Override - public EnumRarity getRarity(ItemStack par1ItemStack) { - return EnumRarity.rare; - } - - /** - * Display charges left in tooltip - */ - @Override - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) { - super.addInformation(par1ItemStack, par2EntityPlayer, par3List, par4); - par3List.add((par1ItemStack.getMaxDamage() - par1ItemStack.getItemDamage()) + " charges left"); - } - - /** - * Properly register icon source - */ - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister par1IconRegister) - { - this.itemIcon = par1IconRegister.registerIcon(TwilightForestMod.ID + ":" + this.getUnlocalizedName().substring(5)); - } -} diff --git a/src/main/java/twilightforest/item/ItemTFSeekerBow.java b/src/main/java/twilightforest/item/ItemTFSeekerBow.java deleted file mode 100644 index 7bb86c6fc0..0000000000 --- a/src/main/java/twilightforest/item/ItemTFSeekerBow.java +++ /dev/null @@ -1,25 +0,0 @@ -package twilightforest.item; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.projectile.EntityArrow; -import net.minecraft.world.World; -import twilightforest.TwilightForestMod; -import twilightforest.entity.EntitySeekerArrow; - -public class ItemTFSeekerBow extends ItemTFBowBase { - - - public ItemTFSeekerBow() { - this.setTextureName(TwilightForestMod.ID + ":seekerbow"); - this.setCreativeTab(TFItems.creativeTab); - } - - /** - * Get the arrow for this specific bow - */ - @Override - protected EntityArrow getArrow(World world, EntityPlayer entityPlayer, float velocity) { - return new EntitySeekerArrow(world, entityPlayer, velocity * 0.5F); - } - -} diff --git a/src/main/java/twilightforest/item/ItemTFSpawnEgg.java b/src/main/java/twilightforest/item/ItemTFSpawnEgg.java deleted file mode 100644 index 4249fa115d..0000000000 --- a/src/main/java/twilightforest/item/ItemTFSpawnEgg.java +++ /dev/null @@ -1,167 +0,0 @@ -package twilightforest.item; - -import java.util.Iterator; -import java.util.List; - -import net.minecraft.block.Block; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLiving; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.IEntityLivingData; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.init.Items; -import net.minecraft.item.Item; -import net.minecraft.item.ItemMonsterPlacer; -import net.minecraft.item.ItemStack; -import net.minecraft.util.Facing; -import net.minecraft.util.IIcon; -import net.minecraft.util.StatCollector; -import net.minecraft.world.World; -import twilightforest.TwilightForestMod; -import twilightforest.entity.TFCreatures; -import twilightforest.entity.TFEntityEggInfo; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public class ItemTFSpawnEgg extends ItemMonsterPlacer { - - protected ItemTFSpawnEgg() { - super(); - this.setHasSubtypes(true); - this.setCreativeTab(TFItems.creativeTab); - } - - @SideOnly(Side.CLIENT) - @Override - public int getColorFromItemStack(ItemStack par1ItemStack, int par2) - { - TFEntityEggInfo info = (TFEntityEggInfo)TFCreatures.entityEggs.get(Integer.valueOf(par1ItemStack.getItemDamage())); - return info != null ? (par2 == 0 ? info.primaryColor : info.secondaryColor) : 16777215; - } - - - @Override - @SideOnly(Side.CLIENT) - public String getItemStackDisplayName(ItemStack par1ItemStack) - { - String prefix = ("" + StatCollector.translateToLocal(this.getUnlocalizedName() + ".name")).trim(); - String entityname = TFCreatures.getStringFromID(par1ItemStack.getItemDamage()); - - if (entityname != null) - { - prefix = prefix + " " + StatCollector.translateToLocal(String.format("entity.%s.%s.name", TwilightForestMod.ID, entityname)); - } - - return prefix; - } - - /** - * Callback for item usage. If the item does something special on right clicking, he will have one of those. Return - * True if something happen and false if it don't. This is for ITEMS, not BLOCKS - */ - @Override - public boolean onItemUse(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, World par3World, int par4, int par5, int par6, int par7, float par8, float par9, float par10) - { - if (par3World.isRemote) - { - return true; - } - else - { - Block var11 = par3World.getBlock(par4, par5, par6); - par4 += Facing.offsetsXForSide[par7]; - par5 += Facing.offsetsYForSide[par7]; - par6 += Facing.offsetsZForSide[par7]; - double var12 = 0.0D; - - if (par7 == 1 && var11 == Blocks.fence || var11 == Blocks.nether_brick_fence) - { - var12 = 0.5D; - } - - Entity entity = spawnCreature(par3World, par1ItemStack.getItemDamage(), (double)par4 + 0.5D, (double)par5 + var12, (double)par6 + 0.5D); - - if (entity != null) - { - if (entity instanceof EntityLiving && par1ItemStack.hasDisplayName()) - { - ((EntityLiving)entity).setCustomNameTag(par1ItemStack.getDisplayName()); - } - - if (!par2EntityPlayer.capabilities.isCreativeMode) - { - --par1ItemStack.stackSize; - } - } - - return true; - } - } - - /** - * Spawns the creature specified by the egg's type in the location specified by the last three parameters. - * Parameters: world, entityID, x, y, z. - */ - public static Entity spawnCreature(World par0World, int par1, double par2, double par4, double par6) - { - //System.out.println("Trying to spawn twilight egg"); - - if (!TFCreatures.entityEggs.containsKey(Integer.valueOf(par1))) - { - return null; - } - else - { - Entity entityToSpawn = TFCreatures.createEntityByID(par1, par0World); - - if (entityToSpawn != null && entityToSpawn instanceof EntityLivingBase) - { - EntityLiving entityliving = (EntityLiving)entityToSpawn; - - entityToSpawn.setLocationAndAngles(par2, par4, par6, par0World.rand.nextFloat() * 360.0F, 0.0F); - entityliving.onSpawnWithEgg((IEntityLivingData)null); - par0World.spawnEntityInWorld(entityToSpawn); - ((EntityLiving)entityToSpawn).playLivingSound(); - } - - return entityToSpawn; - } - } - - /** - * returns a list of items with the same ID, but different meta (eg: dye returns 16 items) - */ - @Override - public void getSubItems(Item par1, CreativeTabs par2CreativeTabs, List par3List) - { - Iterator var4 = TFCreatures.entityEggs.values().iterator(); - - while (var4.hasNext()) - { - TFEntityEggInfo var5 = (TFEntityEggInfo)var4.next(); - par3List.add(new ItemStack(par1, 1, var5.spawnedID)); - } - } - - /** - * Gets an icon index based on an item's damage value and the given render pass - */ - public IIcon getIconFromDamageForRenderPass(int par1, int par2) - { - return Items.spawn_egg.getIconFromDamageForRenderPass(par1, par2); - } - - - /** - * Properly register icon source - */ - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister par1IconRegister) - { - ; // don't load anything - } -} diff --git a/src/main/java/twilightforest/item/ItemTFSteeleafArmor.java b/src/main/java/twilightforest/item/ItemTFSteeleafArmor.java deleted file mode 100644 index fa2afda64a..0000000000 --- a/src/main/java/twilightforest/item/ItemTFSteeleafArmor.java +++ /dev/null @@ -1,89 +0,0 @@ -package twilightforest.item; - -import java.util.List; - -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.enchantment.Enchantment; -import net.minecraft.entity.Entity; -import net.minecraft.item.EnumRarity; -import net.minecraft.item.Item; -import net.minecraft.item.ItemArmor; -import net.minecraft.item.ItemStack; -import twilightforest.TwilightForestMod; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public class ItemTFSteeleafArmor extends ItemArmor { - - public ItemTFSteeleafArmor(ItemArmor.ArmorMaterial par2EnumArmorMaterial, int renderIndex, int armorType) { - super(par2EnumArmorMaterial, renderIndex, armorType); - this.setCreativeTab(TFItems.creativeTab); - } - - /** - * Return an item rarity from EnumRarity - */ - @Override - public EnumRarity getRarity(ItemStack par1ItemStack) { - return EnumRarity.uncommon; - } - - @Override - public String getArmorTexture(ItemStack itemstack, Entity entity, int slot, String layer) { - if(itemstack.getItem() == TFItems.steeleafPlate || itemstack.getItem() == TFItems.steeleafHelm || itemstack.getItem() == TFItems.steeleafBoots) - { - return TwilightForestMod.ARMOR_DIR + "steeleaf_1.png"; - } - if(itemstack.getItem() == TFItems.steeleafLegs) - { - return TwilightForestMod.ARMOR_DIR + "steeleaf_2.png"; - } - return TwilightForestMod.ARMOR_DIR + "steeleaf_1.png"; - } - - /** - * returns a list of items with the same ID, but different meta (eg: dye returns 16 items) - */ - @SuppressWarnings({ "rawtypes", "unchecked" }) - @Override - public void getSubItems(Item par1, CreativeTabs par2CreativeTabs, List par3List) { - ItemStack istack = new ItemStack(par1, 1, 0); - switch (this.armorType) { - case 0: - istack.addEnchantment(Enchantment.projectileProtection, 2); - break; - case 1: - istack.addEnchantment(Enchantment.blastProtection, 2); - break; - case 2: - istack.addEnchantment(Enchantment.fireProtection, 2); - break; - case 3: - istack.addEnchantment(Enchantment.featherFalling, 2); - break; - } - par3List.add(istack); - } - - - /** - * Return whether this item is repairable in an anvil. - */ - @Override - public boolean getIsRepairable(ItemStack par1ItemStack, ItemStack par2ItemStack) - { - // repair with steeleaf ingots - return par2ItemStack.getItem() == TFItems.steeleafIngot ? true : super.getIsRepairable(par1ItemStack, par2ItemStack); - } - - /** - * Properly register icon source - */ - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister par1IconRegister) - { - this.itemIcon = par1IconRegister.registerIcon(TwilightForestMod.ID + ":" + this.getUnlocalizedName().substring(5)); - } -} diff --git a/src/main/java/twilightforest/item/ItemTFSteeleafAxe.java b/src/main/java/twilightforest/item/ItemTFSteeleafAxe.java deleted file mode 100644 index 7e93828a2d..0000000000 --- a/src/main/java/twilightforest/item/ItemTFSteeleafAxe.java +++ /dev/null @@ -1,52 +0,0 @@ -package twilightforest.item; - -import java.util.List; - -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.enchantment.Enchantment; -import net.minecraft.item.Item; -import net.minecraft.item.ItemAxe; -import net.minecraft.item.ItemStack; -import twilightforest.TwilightForestMod; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public class ItemTFSteeleafAxe extends ItemAxe { - - protected ItemTFSteeleafAxe(Item.ToolMaterial par2EnumToolMaterial) { - super(par2EnumToolMaterial); - this.setCreativeTab(TFItems.creativeTab); - } - - /** - * returns a list of items with the same ID, but different meta (eg: dye returns 16 items) - */ - @Override - public void getSubItems(Item par1, CreativeTabs par2CreativeTabs, List par3List) - { - ItemStack istack = new ItemStack(par1, 1, 0); - istack.addEnchantment(Enchantment.efficiency, 2); - par3List.add(istack); - } - - /** - * Return whether this item is repairable in an anvil. - */ - @Override - public boolean getIsRepairable(ItemStack par1ItemStack, ItemStack par2ItemStack) - { - // repair with steeleaf ingots - return par2ItemStack.getItem() == TFItems.steeleafIngot ? true : super.getIsRepairable(par1ItemStack, par2ItemStack); - } - - /** - * Properly register icon source - */ - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister par1IconRegister) - { - this.itemIcon = par1IconRegister.registerIcon(TwilightForestMod.ID + ":" + this.getUnlocalizedName().substring(5)); - } -} diff --git a/src/main/java/twilightforest/item/ItemTFSteeleafHoe.java b/src/main/java/twilightforest/item/ItemTFSteeleafHoe.java deleted file mode 100644 index 7bf34a8e0f..0000000000 --- a/src/main/java/twilightforest/item/ItemTFSteeleafHoe.java +++ /dev/null @@ -1,37 +0,0 @@ -package twilightforest.item; - -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.item.Item; -import net.minecraft.item.ItemHoe; -import net.minecraft.item.ItemStack; -import twilightforest.TwilightForestMod; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public class ItemTFSteeleafHoe extends ItemHoe { - - public ItemTFSteeleafHoe(Item.ToolMaterial par2EnumToolMaterial) { - super(par2EnumToolMaterial); - this.setCreativeTab(TFItems.creativeTab); - } - - /** - * Return whether this item is repairable in an anvil. - */ - @Override - public boolean getIsRepairable(ItemStack par1ItemStack, ItemStack par2ItemStack) - { - // repair with steeleaf ingots - return par2ItemStack.getItem() == TFItems.steeleafIngot ? true : super.getIsRepairable(par1ItemStack, par2ItemStack); - } - - /** - * Properly register icon source - */ - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister par1IconRegister) - { - this.itemIcon = par1IconRegister.registerIcon(TwilightForestMod.ID + ":" + this.getUnlocalizedName().substring(5)); - } -} diff --git a/src/main/java/twilightforest/item/ItemTFSteeleafPick.java b/src/main/java/twilightforest/item/ItemTFSteeleafPick.java deleted file mode 100644 index 6a75cb32c0..0000000000 --- a/src/main/java/twilightforest/item/ItemTFSteeleafPick.java +++ /dev/null @@ -1,53 +0,0 @@ -package twilightforest.item; - -import java.util.List; - -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.enchantment.Enchantment; -import net.minecraft.item.Item; -import net.minecraft.item.ItemPickaxe; -import net.minecraft.item.ItemStack; -import twilightforest.TwilightForestMod; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public class ItemTFSteeleafPick extends ItemPickaxe { - - protected ItemTFSteeleafPick(Item.ToolMaterial par2EnumToolMaterial) { - super(par2EnumToolMaterial); - this.setCreativeTab(TFItems.creativeTab); - } - - /** - * returns a list of items with the same ID, but different meta (eg: dye returns 16 items) - */ - @SuppressWarnings({ "rawtypes", "unchecked" }) - @Override - public void getSubItems(Item par1, CreativeTabs par2CreativeTabs, List par3List) - { - ItemStack istack = new ItemStack(par1, 1, 0); - istack.addEnchantment(Enchantment.fortune, 2); - par3List.add(istack); - } - - /** - * Return whether this item is repairable in an anvil. - */ - @Override - public boolean getIsRepairable(ItemStack par1ItemStack, ItemStack par2ItemStack) - { - // repair with steeleaf ingots - return par2ItemStack.getItem() == TFItems.steeleafIngot ? true : super.getIsRepairable(par1ItemStack, par2ItemStack); - } - - /** - * Properly register icon source - */ - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister par1IconRegister) - { - this.itemIcon = par1IconRegister.registerIcon(TwilightForestMod.ID + ":" + this.getUnlocalizedName().substring(5)); - } -} diff --git a/src/main/java/twilightforest/item/ItemTFSteeleafShovel.java b/src/main/java/twilightforest/item/ItemTFSteeleafShovel.java deleted file mode 100644 index f5b8c6244d..0000000000 --- a/src/main/java/twilightforest/item/ItemTFSteeleafShovel.java +++ /dev/null @@ -1,54 +0,0 @@ -package twilightforest.item; - -import java.util.List; - -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.enchantment.Enchantment; -import net.minecraft.item.Item; -import net.minecraft.item.ItemSpade; -import net.minecraft.item.ItemStack; -import twilightforest.TwilightForestMod; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - - -public class ItemTFSteeleafShovel extends ItemSpade { - - public ItemTFSteeleafShovel(Item.ToolMaterial par2EnumToolMaterial) { - super(par2EnumToolMaterial); - this.setCreativeTab(TFItems.creativeTab); - } - - /** - * returns a list of items with the same ID, but different meta (eg: dye returns 16 items) - */ - @Override - @SuppressWarnings({ "rawtypes", "unchecked" }) - public void getSubItems(Item par1, CreativeTabs par2CreativeTabs, List par3List) - { - ItemStack istack = new ItemStack(par1, 1, 0); - istack.addEnchantment(Enchantment.efficiency, 2); - par3List.add(istack); - } - - /** - * Return whether this item is repairable in an anvil. - */ - @Override - public boolean getIsRepairable(ItemStack par1ItemStack, ItemStack par2ItemStack) - { - // repair with steeleaf ingots - return par2ItemStack.getItem() == TFItems.steeleafIngot ? true : super.getIsRepairable(par1ItemStack, par2ItemStack); - } - - /** - * Properly register icon source - */ - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister par1IconRegister) - { - this.itemIcon = par1IconRegister.registerIcon(TwilightForestMod.ID + ":" + this.getUnlocalizedName().substring(5)); - } -} diff --git a/src/main/java/twilightforest/item/ItemTFSteeleafSword.java b/src/main/java/twilightforest/item/ItemTFSteeleafSword.java deleted file mode 100644 index 5dd41cad6f..0000000000 --- a/src/main/java/twilightforest/item/ItemTFSteeleafSword.java +++ /dev/null @@ -1,53 +0,0 @@ -package twilightforest.item; - -import java.util.List; - -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.enchantment.Enchantment; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.item.ItemSword; -import twilightforest.TwilightForestMod; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public class ItemTFSteeleafSword extends ItemSword { - - public ItemTFSteeleafSword(Item.ToolMaterial par2EnumToolMaterial) { - super(par2EnumToolMaterial); - this.setCreativeTab(TFItems.creativeTab); - } - - /** - * returns a list of items with the same ID, but different meta (eg: dye returns 16 items) - */ - @Override - @SuppressWarnings({ "rawtypes", "unchecked" }) - public void getSubItems(Item par1, CreativeTabs par2CreativeTabs, List par3List) - { - ItemStack istack = new ItemStack(par1, 1, 0); - istack.addEnchantment(Enchantment.looting, 2); - par3List.add(istack); - } - - /** - * Return whether this item is repairable in an anvil. - */ - @Override - public boolean getIsRepairable(ItemStack par1ItemStack, ItemStack par2ItemStack) - { - // repair with steeleaf ingots - return par2ItemStack.getItem() == TFItems.steeleafIngot ? true : super.getIsRepairable(par1ItemStack, par2ItemStack); - } - - /** - * Properly register icon source - */ - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister par1IconRegister) - { - this.itemIcon = par1IconRegister.registerIcon(TwilightForestMod.ID + ":" + this.getUnlocalizedName().substring(5)); - } -} diff --git a/src/main/java/twilightforest/item/ItemTFTowerKey.java b/src/main/java/twilightforest/item/ItemTFTowerKey.java deleted file mode 100644 index b14ccc354a..0000000000 --- a/src/main/java/twilightforest/item/ItemTFTowerKey.java +++ /dev/null @@ -1,46 +0,0 @@ -package twilightforest.item; - -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; -import twilightforest.TwilightForestMod; -import twilightforest.block.BlockTFTowerDevice; -import twilightforest.block.TFBlocks; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public class ItemTFTowerKey extends ItemTF -{ - - protected ItemTFTowerKey() { - super(); - } - - /** - * Callback for item usage. If the item does something special on right clicking, he will have one of those. Return - * True if something happen and false if it don't. This is for ITEMS, not BLOCKS - */ - public boolean onItemUse(ItemStack itemStack, EntityPlayer player, World world, int x, int y, int z, int side, float fx, float fy, float fz) - { - if (!world.isRemote && world.getBlock(x, y, z) == TFBlocks.towerDevice && world.getBlockMetadata(x, y, z) == BlockTFTowerDevice.META_VANISH_LOCKED) - { - BlockTFTowerDevice.unlockBlock(world, x, y, z); - --itemStack.stackSize; - - return true; - } - - return false; - } - - /** - * Properly register icon source - */ - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister par1IconRegister) - { - this.itemIcon = par1IconRegister.registerIcon(TwilightForestMod.ID + ":" + this.getUnlocalizedName().substring(5)); - } -} diff --git a/src/main/java/twilightforest/item/ItemTFTransformPowder.java b/src/main/java/twilightforest/item/ItemTFTransformPowder.java deleted file mode 100644 index 6283b44206..0000000000 --- a/src/main/java/twilightforest/item/ItemTFTransformPowder.java +++ /dev/null @@ -1,190 +0,0 @@ -package twilightforest.item; - -import java.util.HashMap; - -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.entity.EntityLiving; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.monster.EntityBlaze; -import net.minecraft.entity.monster.EntityCaveSpider; -import net.minecraft.entity.monster.EntityPigZombie; -import net.minecraft.entity.monster.EntitySpider; -import net.minecraft.entity.monster.EntityWitch; -import net.minecraft.entity.passive.EntityBat; -import net.minecraft.entity.passive.EntityChicken; -import net.minecraft.entity.passive.EntityCow; -import net.minecraft.entity.passive.EntityPig; -import net.minecraft.entity.passive.EntitySheep; -import net.minecraft.entity.passive.EntityVillager; -import net.minecraft.entity.passive.EntityWolf; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.Vec3; -import net.minecraft.world.World; -import twilightforest.TwilightForestMod; -import twilightforest.entity.EntityTFHedgeSpider; -import twilightforest.entity.EntityTFHostileWolf; -import twilightforest.entity.EntityTFMinotaur; -import twilightforest.entity.EntityTFRedcap; -import twilightforest.entity.EntityTFSkeletonDruid; -import twilightforest.entity.EntityTFSwarmSpider; -import twilightforest.entity.EntityTFWraith; -import twilightforest.entity.passive.EntityTFBighorn; -import twilightforest.entity.passive.EntityTFBoar; -import twilightforest.entity.passive.EntityTFDeer; -import twilightforest.entity.passive.EntityTFPenguin; -import twilightforest.entity.passive.EntityTFRaven; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public class ItemTFTransformPowder extends ItemTF -{ - - HashMap, Class> transformMap; - - protected ItemTFTransformPowder() - { - super(); - this.maxStackSize = 64; - this.setCreativeTab(TFItems.creativeTab); - - transformMap = new HashMap, Class>(); - - - addTwoWayTransformation(EntityTFMinotaur.class, EntityPigZombie.class); - addTwoWayTransformation(EntityTFDeer.class, EntityCow.class); - addTwoWayTransformation(EntityTFBighorn.class, EntitySheep.class); - addTwoWayTransformation(EntityTFBoar.class, EntityPig.class); - addTwoWayTransformation(EntityTFRaven.class, EntityBat.class); - addTwoWayTransformation(EntityTFHostileWolf.class, EntityWolf.class); - addTwoWayTransformation(EntityTFPenguin.class, EntityChicken.class); - addTwoWayTransformation(EntityTFHedgeSpider.class, EntitySpider.class); - addTwoWayTransformation(EntityTFSwarmSpider.class, EntityCaveSpider.class); - addTwoWayTransformation(EntityTFWraith.class, EntityBlaze.class); - addTwoWayTransformation(EntityTFRedcap.class, EntityVillager.class); - addTwoWayTransformation(EntityTFSkeletonDruid.class, EntityWitch.class); - } - - public void addTwoWayTransformation(Class class1, Class class2) { - - transformMap.put(class1, class2); - transformMap.put(class2, class1); - } - - /** - * dye sheep, place saddles, etc ... - */ - @Override - public boolean itemInteractionForEntity(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, EntityLivingBase target) - { - // this is where we transform normal entities into twilight entities and vice versa - - Class transformClass = getMonsterTransform(target.getClass()); - - if (transformClass != null) - { - if (target.worldObj.isRemote) - { - // particles, sound - if (target instanceof EntityLiving) - { - ((EntityLiving) target).spawnExplosionParticle(); - ((EntityLiving) target).spawnExplosionParticle(); - } - - target.worldObj.playSound(target.posX + 0.5D, target.posY + 0.5D, target.posZ + 0.5D, "mob.zombie.remedy", 1.0F + itemRand.nextFloat(), itemRand.nextFloat() * 0.7F + 0.3F, false); - } - else - { - // add new monster with old monster's attributes - EntityLivingBase newMonster = null; - try - { - newMonster = (EntityLivingBase)transformClass.getConstructor(new Class[] {World.class}).newInstance(new Object[] {target.worldObj}); - } - catch (Exception e) - { - e.printStackTrace(); - } - - if (newMonster == null) - { - return false; - } - else - { - newMonster.setPositionAndRotation(target.posX, target.posY, target.posZ, target.rotationYaw, target.rotationPitch); - //newMonster.initCreature(); - - target.worldObj.spawnEntityInWorld(newMonster); - - // remove original monster - target.setDead(); - } - } - - --par1ItemStack.stackSize; - - return true; - } - else - { - return false; - } - } - - /** - * Callback for item usage. If the item does something special on right clicking, he will have one of those. Return - * True if something happen and false if it don't. This is for ITEMS, not BLOCKS - */ - @Override - public ItemStack onItemRightClick(ItemStack par1ItemStack, World world, EntityPlayer player) - { - if (world.isRemote) - { - AxisAlignedBB fanBox = getEffectAABB(world, player); - - // particle effect - for (int i = 0; i < 30; i++) - { - world.spawnParticle("magicCrit", fanBox.minX + world.rand.nextFloat() * (fanBox.maxX - fanBox.minX), - fanBox.minY + world.rand.nextFloat() * (fanBox.maxY - fanBox.minY), - fanBox.minZ + world.rand.nextFloat() * (fanBox.maxZ - fanBox.minZ), - 0, 0, 0); - } - - } - - - return par1ItemStack; - } - - private AxisAlignedBB getEffectAABB(World world, EntityPlayer player) { - double range = 2.0D; - double radius = 1.0D; - Vec3 srcVec = Vec3.createVectorHelper(player.posX, player.posY + player.getEyeHeight(), player.posZ); - Vec3 lookVec = player.getLookVec(); - Vec3 destVec = srcVec.addVector(lookVec.xCoord * range, lookVec.yCoord * range, lookVec.zCoord * range); - - return AxisAlignedBB.getBoundingBox(destVec.xCoord - radius, destVec.yCoord - radius, destVec.zCoord - radius, destVec.xCoord + radius, destVec.yCoord + radius, destVec.zCoord + radius); - } - - /** - * Which class should the specified monster class transform into? - */ - public Class getMonsterTransform(Class originalMonster) - { - return transformMap.get(originalMonster); - } - - /** - * Properly register icon source - */ - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister par1IconRegister) - { - this.itemIcon = par1IconRegister.registerIcon(TwilightForestMod.ID + ":" + this.getUnlocalizedName().substring(5)); - } -} \ No newline at end of file diff --git a/src/main/java/twilightforest/item/ItemTFTripleBow.java b/src/main/java/twilightforest/item/ItemTFTripleBow.java deleted file mode 100644 index a08ca72d37..0000000000 --- a/src/main/java/twilightforest/item/ItemTFTripleBow.java +++ /dev/null @@ -1,119 +0,0 @@ -package twilightforest.item; - -import net.minecraft.enchantment.Enchantment; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.projectile.EntityArrow; -import net.minecraft.init.Items; -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.event.entity.player.ArrowLooseEvent; -import twilightforest.TwilightForestMod; - -public class ItemTFTripleBow extends ItemTFBowBase { - - - public ItemTFTripleBow() { - this.setTextureName(TwilightForestMod.ID + ":triplebow"); - this.setCreativeTab(TFItems.creativeTab); - } - - /** - * called when the player releases the use item button. Args: itemstack, world, entityplayer, itemInUseCount - */ - public void onPlayerStoppedUsing(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer, int par4) - { - int j = this.getMaxItemUseDuration(par1ItemStack) - par4; - - ArrowLooseEvent event = new ArrowLooseEvent(par3EntityPlayer, par1ItemStack, j); - MinecraftForge.EVENT_BUS.post(event); - if (event.isCanceled()) - { - return; - } - j = event.charge; - - boolean flag = par3EntityPlayer.capabilities.isCreativeMode || EnchantmentHelper.getEnchantmentLevel(Enchantment.infinity.effectId, par1ItemStack) > 0; - - if (flag || par3EntityPlayer.inventory.hasItem(Items.arrow)) - { - float f = (float)j / 20.0F; - f = (f * f + f * 2.0F) / 3.0F; - - if ((double)f < 0.1D) - { - return; - } - - if (f > 1.0F) - { - f = 1.0F; - } - - EntityArrow entityarrow = new EntityArrow(par2World, par3EntityPlayer, f * 2.0F); - // other arrows with slight deviation - EntityArrow entityarrow1 = new EntityArrow(par2World, par3EntityPlayer, f * 2.0F); - entityarrow1.motionY += 0.007499999832361937D * 20F; - entityarrow1.posY += 0.025F; - EntityArrow entityarrow2 = new EntityArrow(par2World, par3EntityPlayer, f * 2.0F); - entityarrow2.motionY -= 0.007499999832361937D * 20F; - entityarrow2.posY -= 0.025F; - - if (f == 1.0F) - { - entityarrow.setIsCritical(true); - entityarrow1.setIsCritical(true); - entityarrow2.setIsCritical(true); - } - - int k = EnchantmentHelper.getEnchantmentLevel(Enchantment.power.effectId, par1ItemStack); - - if (k > 0) - { - entityarrow.setDamage(entityarrow.getDamage() + (double)k * 0.5D + 0.5D); - entityarrow1.setDamage(entityarrow.getDamage() + (double)k * 0.5D + 0.5D); - entityarrow2.setDamage(entityarrow.getDamage() + (double)k * 0.5D + 0.5D); - } - - int l = EnchantmentHelper.getEnchantmentLevel(Enchantment.punch.effectId, par1ItemStack); - - if (l > 0) - { - entityarrow.setKnockbackStrength(l); - entityarrow1.setKnockbackStrength(l); - entityarrow2.setKnockbackStrength(l); - } - - if (EnchantmentHelper.getEnchantmentLevel(Enchantment.flame.effectId, par1ItemStack) > 0) - { - entityarrow.setFire(100); - entityarrow1.setFire(100); - entityarrow2.setFire(100); - } - - par1ItemStack.damageItem(1, par3EntityPlayer); - par2World.playSoundAtEntity(par3EntityPlayer, "random.bow", 1.0F, 1.0F / (itemRand.nextFloat() * 0.4F + 1.2F) + f * 0.5F); - - if (flag) - { - entityarrow.canBePickedUp = 2; - } - else - { - par3EntityPlayer.inventory.consumeInventoryItem(Items.arrow); - } - entityarrow1.canBePickedUp = 2; - entityarrow2.canBePickedUp = 2; - - - if (!par2World.isRemote) - { - par2World.spawnEntityInWorld(entityarrow); - par2World.spawnEntityInWorld(entityarrow1); - par2World.spawnEntityInWorld(entityarrow2); - } - } - } - -} diff --git a/src/main/java/twilightforest/item/ItemTFTrophy.java b/src/main/java/twilightforest/item/ItemTFTrophy.java deleted file mode 100644 index e32019b33a..0000000000 --- a/src/main/java/twilightforest/item/ItemTFTrophy.java +++ /dev/null @@ -1,192 +0,0 @@ -package twilightforest.item; - -import java.util.List; - -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.EnumRarity; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.tileentity.TileEntitySkull; -import net.minecraft.util.IIcon; -import net.minecraft.util.MathHelper; -import net.minecraft.world.World; -import twilightforest.TwilightForestMod; -import twilightforest.block.TFBlocks; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public class ItemTFTrophy extends ItemTF -{ - private static final String[] trophyTypes = new String[] {"hydra", "naga", "lich", "ur-ghast", "snowQueen"}; - public static final String[] trophyTextures = new String[] {"hydraTrophy", "nagaTrophy", "lichTrophy", "urGhastTrophy", "snowQueenTrophy"}; - public IIcon[] trophyIcons; - - - public ItemTFTrophy() - { - super(); - this.setCreativeTab(TFItems.creativeTab); - this.setMaxDamage(0); - this.setHasSubtypes(true); - } - - /** - * returns a list of items with the same ID, but different meta (eg: dye returns 16 items) - */ - @SuppressWarnings({ "rawtypes", "unchecked" }) - public void getSubItems(Item par1, CreativeTabs par2CreativeTabs, List par3List) { - for (int j = 0; j < trophyTypes.length; ++j) { - par3List.add(new ItemStack(par1, 1, j)); - } - } - - - /** - * Return an item rarity from EnumRarity - * - * This is automatically uncommon - */ - @Override - @SideOnly(Side.CLIENT) - public EnumRarity getRarity(ItemStack par1ItemStack) { - return EnumRarity.rare; - } - - /** - * Callback for item usage. If the item does something special on right clicking, he will have one of those. Return - * True if something happen and false if it don't. This is for ITEMS, not BLOCKS - */ - public boolean onItemUse(ItemStack itemStack, EntityPlayer player, World world, int x, int y, int z, int direction, float par8, float par9, float par10) - { - if (direction == 0) - { - return false; - } - else if (!world.getBlock(x, y, z).getMaterial().isSolid()) - { - return false; - } - else - { - if (direction == 1) - { - ++y; - } - - if (direction == 2) - { - --z; - } - - if (direction == 3) - { - ++z; - } - - if (direction == 4) - { - --x; - } - - if (direction == 5) - { - ++x; - } - - if (!player.canPlayerEdit(x, y, z, direction, itemStack)) - { - return false; - } - else if (!TFBlocks.trophy.canPlaceBlockAt(world, x, y, z)) - { - return false; - } - else - { - world.setBlock(x, y, z, TFBlocks.trophy, direction, 3); - int skullRotate = 0; - - if (direction == 1) - { - skullRotate = MathHelper.floor_double((double)(player.rotationYaw * 16.0F / 360.0F) + 0.5D) & 15; - } - - TileEntity tileEntity = world.getTileEntity(x, y, z); - - if (tileEntity != null && tileEntity instanceof TileEntitySkull) - { - TileEntitySkull skull = ((TileEntitySkull)tileEntity); - - // use NBT method to set skulltype in order to have 1.7.10 compatibility - NBTTagCompound tags = new NBTTagCompound(); - skull.writeToNBT(tags); - tags.setByte("SkullType", (byte)(itemStack.getItemDamage() & 255)); - skull.readFromNBT(tags); - -// try { -// String skullName = ""; -// ((TileEntitySkull)tileEntity).func_145905_a(itemStack.getItemDamage(), skullName); -// } catch (NoSuchMethodError ex) { -// // stop checking admin -// FMLLog.warning("[TwilightForest] Could not determine op status for adminOnlyPortals option, ignoring option."); -// TwilightForestMod.adminOnlyPortals = false; -// } - skull.func_145903_a(skullRotate); - } - - --itemStack.stackSize; - return true; - } - } - } - - /** - * Returns the unlocalized name of this item. This version accepts an ItemStack so different stacks can have - * different names based on their damage or NBT. - */ - public String getUnlocalizedName(ItemStack par1ItemStack) - { - int i = par1ItemStack.getItemDamage(); - - if (i < 0 || i >= trophyTypes.length) - { - i = 0; - } - - return super.getUnlocalizedName() + "." + trophyTypes[i]; - } - - /** - * Properly register icon source - */ - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister par1IconRegister) - { - this.trophyIcons = new IIcon[trophyTextures.length]; - - for (int i = 0; i < trophyTextures.length; ++i) - { - this.trophyIcons[i] = par1IconRegister.registerIcon(TwilightForestMod.ID + ":" + trophyTextures[i]); - } - } - - - /** - * Gets an icon index based on an item's damage value - */ - @SideOnly(Side.CLIENT) - public IIcon getIconFromDamage(int par1) - { - if (par1 < 0 || par1 >= trophyTypes.length) - { - par1 = 0; - } - - return this.trophyIcons[par1]; - } -} diff --git a/src/main/java/twilightforest/item/ItemTFTwilightWand.java b/src/main/java/twilightforest/item/ItemTFTwilightWand.java deleted file mode 100644 index 3033fb3dfa..0000000000 --- a/src/main/java/twilightforest/item/ItemTFTwilightWand.java +++ /dev/null @@ -1,117 +0,0 @@ -package twilightforest.item; - -import java.util.List; - -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.EnumAction; -import net.minecraft.item.EnumRarity; -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; -import twilightforest.TwilightForestMod; -import twilightforest.entity.EntityTFTwilightWandBolt; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - - - -public class ItemTFTwilightWand extends ItemTF { - - protected ItemTFTwilightWand() { - super(); - this.maxStackSize = 1; - this.setMaxDamage(99); - this.setCreativeTab(TFItems.creativeTab); - - } - - @Override - public ItemStack onItemRightClick(ItemStack par1ItemStack, World worldObj, EntityPlayer player) { - if (par1ItemStack.getItemDamage() < this.getMaxDamage()) - { - player.setItemInUse(par1ItemStack, this.getMaxItemUseDuration(par1ItemStack)); - } - else - { - player.stopUsingItem(); - } - - return par1ItemStack; - } - - /** - * Called each tick while using an item. - * @param stack The Item being used - * @param player The Player using the item - * @param count The amount of time in tick the item has been used for continuously - */ - @Override - public void onUsingTick(ItemStack stack, EntityPlayer player, int count) { - if (stack.getItemDamage() >= this.getMaxDamage()) { - // do not use - player.stopUsingItem(); - return; - } - - if (count % 6 == 0) { - World worldObj = player.worldObj; - - worldObj.playSoundAtEntity(player, "mob.ghast.fireball", 1.0F, (worldObj.rand.nextFloat() - worldObj.rand.nextFloat()) * 0.2F + 1.0F); - - if (!worldObj.isRemote) { - worldObj.spawnEntityInWorld(new EntityTFTwilightWandBolt(worldObj, player)); - - stack.damageItem(1, player); - } - } - - - } - - /** - * How long it takes to use or consume an item - */ - @Override - public int getMaxItemUseDuration(ItemStack par1ItemStack) - { - return 72000; - } - - /** - * returns the action that specifies what animation to play when the items is being used - */ - @Override - public EnumAction getItemUseAction(ItemStack par1ItemStack) - { - return EnumAction.bow; - } - - /** - * Return an item rarity from EnumRarity - */ - @Override - public EnumRarity getRarity(ItemStack par1ItemStack) { - return EnumRarity.rare; - } - - /** - * Display charges left in tooltip - */ - @SuppressWarnings({ "rawtypes", "unchecked" }) - @Override - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) { - super.addInformation(par1ItemStack, par2EntityPlayer, par3List, par4); - par3List.add((par1ItemStack.getMaxDamage() - par1ItemStack.getItemDamage()) + " charges left"); - } - - /** - * Properly register icon source - */ - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister par1IconRegister) - { - this.itemIcon = par1IconRegister.registerIcon(TwilightForestMod.ID + ":" + this.getUnlocalizedName().substring(5)); - } -} diff --git a/src/main/java/twilightforest/item/ItemTFYetiArmor.java b/src/main/java/twilightforest/item/ItemTFYetiArmor.java deleted file mode 100644 index 509d38a6e2..0000000000 --- a/src/main/java/twilightforest/item/ItemTFYetiArmor.java +++ /dev/null @@ -1,132 +0,0 @@ -package twilightforest.item; - -import java.util.List; - -import net.minecraft.client.model.ModelBiped; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.enchantment.Enchantment; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.EnumRarity; -import net.minecraft.item.Item; -import net.minecraft.item.ItemArmor; -import net.minecraft.item.ItemStack; -import net.minecraft.util.StatCollector; -import twilightforest.TwilightForestMod; -import twilightforest.enchantment.TFEnchantment; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public class ItemTFYetiArmor extends ItemArmor { - - public ItemTFYetiArmor(ItemArmor.ArmorMaterial par2EnumArmorMaterial, int renderIndex, int armorType) { - super(par2EnumArmorMaterial, renderIndex, armorType); - this.setCreativeTab(TFItems.creativeTab); - } - - /** - * Return an item rarity from EnumRarity - */ - @Override - public EnumRarity getRarity(ItemStack par1ItemStack) { - return EnumRarity.epic; - } - - /** - * Called by RenderBiped and RenderPlayer to determine the armor texture that - * should be use for the currently equiped item. - * This will only be called on instances of ItemArmor. - * - * Returning null from this function will use the default value. - * - * @param stack ItemStack for the equpt armor - * @param entity The entity wearing the armor - * @param slot The slot the armor is in - * @param layer The render layer, either 1 or 2, 2 is only used for CLOTH armor by default - * @return Path of texture to bind, or null to use default - */ - public String getArmorTexture(ItemStack itemstack, Entity entity, int slot, String layer) { - switch (slot) { - case 0 : - case 3 : - default : - return TwilightForestMod.ARMOR_DIR + "yetiarmor_1.png"; - case 1 : - case 2 : - return TwilightForestMod.ARMOR_DIR + "yetiarmor_2.png"; - - } - } - - /** - * returns a list of items with the same ID, but different meta (eg: dye returns 16 items) - */ - @SuppressWarnings({ "rawtypes", "unchecked" }) - @Override - public void getSubItems(Item par1, CreativeTabs par2CreativeTabs, List par3List) { - ItemStack istack = new ItemStack(par1, 1, 0); - switch (this.armorType) { - case 0: - istack.addEnchantment(Enchantment.protection, 2); - break; - case 1: - istack.addEnchantment(Enchantment.protection, 2); - break; - case 2: - istack.addEnchantment(Enchantment.protection, 2); - break; - case 3: - istack.addEnchantment(Enchantment.protection, 2); - istack.addEnchantment(Enchantment.featherFalling, 4); - break; - } - par3List.add(istack); - } - - /** - * Return whether this item is repairable in an anvil. - */ - @Override - public boolean getIsRepairable(ItemStack par1ItemStack, ItemStack par2ItemStack) - { - // repair with ????? - return par2ItemStack.getItem() == TFItems.alphaFur ? true : super.getIsRepairable(par1ItemStack, par2ItemStack); - } - - /** - * Properly register icon source - */ - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister par1IconRegister) - { - this.itemIcon = par1IconRegister.registerIcon(TwilightForestMod.ID + ":" + this.getUnlocalizedName().substring(5)); - } - - /** - * Override this method to have an item handle its own armor rendering. - * - * @param entityLiving The entity wearing the armor - * @param itemStack The itemStack to render the model of - * @param armorSlot 0=head, 1=torso, 2=legs, 3=feet - * - * @return A ModelBiped to render instead of the default - */ - @SideOnly(Side.CLIENT) - public ModelBiped getArmorModel(EntityLivingBase entityLiving, ItemStack itemStack, int armorSlot) - { - return TwilightForestMod.proxy.getYetiArmorModel(armorSlot); - } - - /** - * allows items to add custom lines of information to the mouseover description - */ - @Override - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) { - super.addInformation(par1ItemStack, par2EntityPlayer, par3List, par4); - par3List.add(StatCollector.translateToLocal(getUnlocalizedName() + ".tooltip")); - } -} diff --git a/src/main/java/twilightforest/item/ItemTFZombieWand.java b/src/main/java/twilightforest/item/ItemTFZombieWand.java deleted file mode 100644 index fa38748a37..0000000000 --- a/src/main/java/twilightforest/item/ItemTFZombieWand.java +++ /dev/null @@ -1,127 +0,0 @@ -package twilightforest.item; - -import java.util.List; - -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.EnumAction; -import net.minecraft.item.EnumRarity; -import net.minecraft.item.ItemStack; -import net.minecraft.potion.Potion; -import net.minecraft.potion.PotionEffect; -import net.minecraft.util.MovingObjectPosition; -import net.minecraft.util.Vec3; -import net.minecraft.world.World; -import twilightforest.TwilightForestMod; -import twilightforest.entity.EntityTFLoyalZombie; -import cpw.mods.fml.common.FMLLog; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - - - -public class ItemTFZombieWand extends ItemTF { - - protected ItemTFZombieWand() { - super(); - this.maxStackSize = 1; - this.setMaxDamage(9); - this.setCreativeTab(TFItems.creativeTab); - } - - @Override - public ItemStack onItemRightClick(ItemStack par1ItemStack, World worldObj, EntityPlayer player) { - - if (par1ItemStack.getItemDamage() < this.getMaxDamage()) { - player.setItemInUse(par1ItemStack, this.getMaxItemUseDuration(par1ItemStack)); - - if (!worldObj.isRemote) { - // what block is the player pointing at? - MovingObjectPosition mop = getPlayerPointVec(worldObj, player, 20.0F); - - if (mop != null) { - // make a zombie there - EntityTFLoyalZombie zombie = new EntityTFLoyalZombie(worldObj); - zombie.setPositionAndRotation(mop.hitVec.xCoord, mop.hitVec.yCoord, mop.hitVec.zCoord, 1.0F, 1.0F); /// NPE here needs to be fixed - zombie.setTamed(true); - try { - zombie.func_152115_b(player.getUniqueID().toString()); - //zombie.setOwner(player.getCommandSenderName()); - } catch (NoSuchMethodError ex) { - // ignore? - FMLLog.warning("[TwilightForest] Could not determine player name for loyal zombie, ignoring error."); - } - zombie.addPotionEffect(new PotionEffect(Potion.damageBoost.id, 1200, 1)); - worldObj.spawnEntityInWorld(zombie); - - par1ItemStack.damageItem(1, player); - } - } - } - else { - player.stopUsingItem(); - } - - return par1ItemStack; - } - - /** - * What block is the player pointing the wand at? - * - * This very similar to player.rayTrace, but that method is not available on the server. - * - * @return - */ - private MovingObjectPosition getPlayerPointVec(World worldObj, EntityPlayer player, float range) { - Vec3 position = Vec3.createVectorHelper(player.posX, player.posY + player.getEyeHeight(), player.posZ); - Vec3 look = player.getLook(1.0F); - Vec3 dest = position.addVector(look.xCoord * range, look.yCoord * range, look.zCoord * range); - return worldObj.rayTraceBlocks(position, dest); - } - - - /** - * How long it takes to use or consume an item - */ - @Override - public int getMaxItemUseDuration(ItemStack par1ItemStack) - { - return 30; - } - - /** - * returns the action that specifies what animation to play when the items is being used - */ - @Override - public EnumAction getItemUseAction(ItemStack par1ItemStack) - { - return EnumAction.bow; - } - - /** - * Return an item rarity from EnumRarity - */ - @Override - public EnumRarity getRarity(ItemStack par1ItemStack) { - return EnumRarity.rare; - } - - /** - * Display charges left in tooltip - */ - @SuppressWarnings({ "unchecked", "rawtypes" }) - @Override - public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) { - par3List.add((par1ItemStack.getMaxDamage() - par1ItemStack.getItemDamage()) + " charges left"); - } - - /** - * Properly register icon source - */ - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister par1IconRegister) - { - this.itemIcon = par1IconRegister.registerIcon(TwilightForestMod.ID + ":" + this.getUnlocalizedName().substring(5)); - } -} diff --git a/src/main/java/twilightforest/item/KnightmetalArmorItem.java b/src/main/java/twilightforest/item/KnightmetalArmorItem.java new file mode 100644 index 0000000000..85bcd46b85 --- /dev/null +++ b/src/main/java/twilightforest/item/KnightmetalArmorItem.java @@ -0,0 +1,51 @@ +package twilightforest.item; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.model.geom.EntityModelSet; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ArmorItem; +import net.minecraft.world.item.ArmorMaterial; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.client.extensions.common.IClientItemExtensions; +import org.jetbrains.annotations.NotNull; +import twilightforest.TwilightForestMod; +import twilightforest.client.model.TFModelLayers; +import twilightforest.client.model.armor.TFArmorModel; + +import java.util.function.Consumer; + +public class KnightmetalArmorItem extends ArmorItem { + + public KnightmetalArmorItem(ArmorMaterial material, Type type, Properties properties) { + super(material, type, properties); + } + + @Override + public String getArmorTexture(ItemStack stack, Entity entity, EquipmentSlot slot, String layer) { + if (slot == EquipmentSlot.LEGS) { + return TwilightForestMod.ARMOR_DIR + "knightly_2.png"; + } else { + return TwilightForestMod.ARMOR_DIR + "knightly_1.png"; + } + } + + @Override + public void initializeClient(Consumer consumer) { + consumer.accept(ArmorRender.INSTANCE); + } + + private static final class ArmorRender implements IClientItemExtensions { + private static final ArmorRender INSTANCE = new ArmorRender(); + + @Override + public @NotNull HumanoidModel getHumanoidArmorModel(LivingEntity living, ItemStack stack, EquipmentSlot slot, HumanoidModel model) { + EntityModelSet models = Minecraft.getInstance().getEntityModels(); + ModelPart root = models.bakeLayer(slot == EquipmentSlot.LEGS ? TFModelLayers.KNIGHTMETAL_ARMOR_INNER : TFModelLayers.KNIGHTMETAL_ARMOR_OUTER); + return new TFArmorModel(root); + } + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/item/KnightmetalAxeItem.java b/src/main/java/twilightforest/item/KnightmetalAxeItem.java new file mode 100644 index 0000000000..da43e58e96 --- /dev/null +++ b/src/main/java/twilightforest/item/KnightmetalAxeItem.java @@ -0,0 +1,28 @@ +package twilightforest.item; + +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.AxeItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Tier; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public class KnightmetalAxeItem extends AxeItem { + + public KnightmetalAxeItem(Tier material, Properties properties) { + super(material, 6F, material.getSpeed() * 0.05f - 3.4f, properties); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void appendHoverText(ItemStack stack, @Nullable Level world, List tooltips, TooltipFlag flags) { + super.appendHoverText(stack, world, tooltips, flags); + tooltips.add(Component.translatable(this.getDescriptionId() + ".desc").withStyle(ChatFormatting.GRAY)); + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/item/KnightmetalPickItem.java b/src/main/java/twilightforest/item/KnightmetalPickItem.java new file mode 100644 index 0000000000..7efcfae38c --- /dev/null +++ b/src/main/java/twilightforest/item/KnightmetalPickItem.java @@ -0,0 +1,28 @@ +package twilightforest.item; + +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.PickaxeItem; +import net.minecraft.world.item.Tier; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public class KnightmetalPickItem extends PickaxeItem { + + public KnightmetalPickItem(Tier material, Properties properties) { + super(material, 1, -2.8F, properties); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void appendHoverText(ItemStack stack, @Nullable Level level, List list, TooltipFlag flags) { + super.appendHoverText(stack, level, list, flags); + list.add(Component.translatable(getDescriptionId() + ".desc").withStyle(ChatFormatting.GRAY)); + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/item/KnightmetalShieldItem.java b/src/main/java/twilightforest/item/KnightmetalShieldItem.java new file mode 100644 index 0000000000..16aecd0db3 --- /dev/null +++ b/src/main/java/twilightforest/item/KnightmetalShieldItem.java @@ -0,0 +1,52 @@ +package twilightforest.item; + +import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer; +import net.minecraft.network.chat.Component; +import net.minecraft.tags.ItemTags; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.ShieldItem; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.client.extensions.common.IClientItemExtensions; +import net.minecraftforge.common.ToolAction; +import net.minecraftforge.common.ToolActions; +import org.jetbrains.annotations.Nullable; +import twilightforest.client.ISTER; +import twilightforest.data.tags.ItemTagGenerator; + +import java.util.List; +import java.util.function.Consumer; + +public class KnightmetalShieldItem extends ShieldItem { + + public KnightmetalShieldItem(Properties properties) { + super(properties); + } + + @OnlyIn(Dist.CLIENT) + @Override + public void appendHoverText(ItemStack stack, @Nullable Level level, List tooltip, TooltipFlag flag) { + } + + @Override + public boolean isValidRepairItem(ItemStack toRepair, ItemStack repair) { + return repair.is(ItemTagGenerator.KNIGHTMETAL_INGOTS) || !repair.is(ItemTags.PLANKS) && super.isValidRepairItem(toRepair, repair); + } + + @Override + public boolean canPerformAction(ItemStack stack, ToolAction toolAction) { + return ToolActions.DEFAULT_SHIELD_ACTIONS.contains(toolAction) || super.canPerformAction(stack, toolAction); + } + + @Override + public void initializeClient(Consumer consumer) { + consumer.accept(new IClientItemExtensions() { + @Override + public BlockEntityWithoutLevelRenderer getCustomRenderer() { + return new ISTER(); + } + }); + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/item/KnightmetalSwordItem.java b/src/main/java/twilightforest/item/KnightmetalSwordItem.java new file mode 100644 index 0000000000..0f0c46be87 --- /dev/null +++ b/src/main/java/twilightforest/item/KnightmetalSwordItem.java @@ -0,0 +1,28 @@ +package twilightforest.item; + +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.SwordItem; +import net.minecraft.world.item.Tier; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public class KnightmetalSwordItem extends SwordItem { + + public KnightmetalSwordItem(Tier material, Properties properties) { + super(material, 3, -2.4F, properties); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void appendHoverText(ItemStack stack, @Nullable Level level, List list, TooltipFlag flags) { + super.appendHoverText(stack, level, list, flags); + list.add(Component.translatable(getDescriptionId() + ".desc").withStyle(ChatFormatting.GRAY)); + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/item/LampOfCindersItem.java b/src/main/java/twilightforest/item/LampOfCindersItem.java new file mode 100644 index 0000000000..fd1dc4de71 --- /dev/null +++ b/src/main/java/twilightforest/item/LampOfCindersItem.java @@ -0,0 +1,150 @@ +package twilightforest.item; + +import net.minecraft.advancements.CriteriaTriggers; +import net.minecraft.core.BlockPos; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.util.Mth; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.UseAnim; +import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.item.enchantment.Enchantment; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.AABB; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFSounds; + +import javax.annotation.Nonnull; + +public class LampOfCindersItem extends Item { + + private static final int FIRING_TIME = 12; + + public LampOfCindersItem(Properties props) { + super(props); + } + + @Override + public boolean isEnchantable(ItemStack pStack) { + return false; + } + + @Override + public boolean isBookEnchantable(ItemStack stack, ItemStack book) { + return false; + } + + @Override + public boolean canApplyAtEnchantingTable(ItemStack stack, Enchantment enchantment) { + return false; + } + + @Nonnull + @Override + public InteractionResultHolder use(Level level, Player player, @Nonnull InteractionHand hand) { + player.startUsingItem(hand); + return new InteractionResultHolder<>(InteractionResult.SUCCESS, player.getItemInHand(hand)); + } + + @Nonnull + @Override + public InteractionResult useOn(UseOnContext context) { + Level world = context.getLevel(); + BlockPos pos = context.getClickedPos(); + Player player = context.getPlayer(); + + if (this.burnBlock(world, pos)) { + if (player instanceof ServerPlayer) + CriteriaTriggers.PLACED_BLOCK.trigger((ServerPlayer) player, pos, player.getItemInHand(context.getHand())); + + if (player != null) player.playSound(TFSounds.LAMP_BURN.get(), 0.5F, 1.5F); + + // spawn flame particles + for (int i = 0; i < 10; i++) { + float dx = pos.getX() + 0.5F + (world.getRandom().nextFloat() - world.getRandom().nextFloat()) * 0.75F; + float dy = pos.getY() + 0.5F + (world.getRandom().nextFloat() - world.getRandom().nextFloat()) * 0.75F; + float dz = pos.getZ() + 0.5F + (world.getRandom().nextFloat() - world.getRandom().nextFloat()) * 0.75F; + world.addParticle(ParticleTypes.SMOKE, dx, dy, dz, 0.0D, 0.0D, 0.0D); + world.addParticle(ParticleTypes.FLAME, dx, dy, dz, 0.0D, 0.0D, 0.0D); + } + + return InteractionResult.SUCCESS; + } else return InteractionResult.PASS; + } + + private boolean burnBlock(Level level, BlockPos pos) { + BlockState state = level.getBlockState(pos); + if (state.is(TFBlocks.BROWN_THORNS.get()) || state.is(TFBlocks.GREEN_THORNS.get())) { + level.setBlockAndUpdate(pos, TFBlocks.BURNT_THORNS.get().withPropertiesOf(state)); + return true; + } else return false; + } + + @Override + public void releaseUsing(ItemStack stack, Level level, LivingEntity living, int useRemaining) { + int useTime = this.getUseDuration(stack) - useRemaining; + + if (useTime > FIRING_TIME && (stack.getDamageValue() + 1) < this.getMaxDamage(stack)) { + this.doBurnEffect(level, living); + } + } + + private void doBurnEffect(Level level, LivingEntity living) { + BlockPos pos = new BlockPos( + Mth.floor(living.xOld), + Mth.floor(living.yOld + living.getEyeHeight()), + Mth.floor(living.zOld) + ); + + int range = 4; + + if (!level.isClientSide()) { + level.playSound(null, living.getX(), living.getY(), living.getZ(), TFSounds.LAMP_BURN.get(), living.getSoundSource(), 1.5F, 0.8F); + + // set nearby thorns to burnt + for (int dx = -range; dx <= range; dx++) { + for (int dy = -range; dy <= range; dy++) { + for (int dz = -range; dz <= range; dz++) { + this.burnBlock(level, pos.offset(dx, dy, dz)); + } + } + } + } + + if (living instanceof Player) { + for (int i = 0; i < 6; i++) { + BlockPos rPos = pos.offset( + level.getRandom().nextInt(range) - level.getRandom().nextInt(range), + level.getRandom().nextInt(2), + level.getRandom().nextInt(range) - level.getRandom().nextInt(range) + ); + + level.levelEvent((Player) living, 2004, rPos, 0); + } + + //burn mobs! + for (LivingEntity targets : level.getEntitiesOfClass(LivingEntity.class, new AABB(living.blockPosition()).inflate(4.0D))) { + if (!(targets instanceof Player)) { + targets.setSecondsOnFire(5); + } + } + } + } + + @Override + public UseAnim getUseAnimation(ItemStack stack) { + return UseAnim.BOW; + } + + @Override + public int getUseDuration(ItemStack stack) { + return 72000; + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/item/LifedrainScepterItem.java b/src/main/java/twilightforest/item/LifedrainScepterItem.java new file mode 100644 index 0000000000..aec87602d5 --- /dev/null +++ b/src/main/java/twilightforest/item/LifedrainScepterItem.java @@ -0,0 +1,238 @@ +package twilightforest.item; + +import net.minecraft.ChatFormatting; +import net.minecraft.core.Direction; +import net.minecraft.core.particles.ItemParticleOption; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.decoration.ArmorStand; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.*; +import net.minecraft.world.item.enchantment.Enchantment; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import org.jetbrains.annotations.Nullable; +import twilightforest.data.tags.EntityTagGenerator; +import twilightforest.init.TFDamageTypes; +import twilightforest.init.TFSounds; +import twilightforest.util.EntityUtil; + +import java.util.List; +import java.util.Optional; + +public class LifedrainScepterItem extends Item { + + public LifedrainScepterItem(Properties properties) { + super(properties); + } + + @Override + public InteractionResultHolder use(Level level, Player player, InteractionHand hand) { + ItemStack stack = player.getItemInHand(hand); + + if (stack.getDamageValue() == stack.getMaxDamage()) { + return InteractionResultHolder.fail(player.getItemInHand(hand)); + } else { + player.startUsingItem(hand); + return InteractionResultHolder.success(player.getItemInHand(hand)); + } + } + + @Override + public boolean isEnchantable(ItemStack stack) { + return false; + } + + @Override + public boolean isBookEnchantable(ItemStack stack, ItemStack book) { + return false; + } + + @Override + public boolean canApplyAtEnchantingTable(ItemStack stack, Enchantment enchantment) { + return false; + } + + /** + * Animates the target falling apart into a rain of shatter particles + */ + public static void animateTargetShatter(ServerLevel level, LivingEntity target) { + ItemStack itemId = Items.ROTTEN_FLESH.getDefaultInstance(); + // 1 in 100 chance of a big pop, you're welcome KD + double explosionPower = level.getRandom().nextInt(100) == 0 ? 0.5D : 0.15D; + + for (int i = 0; i < 50 + ((int) target.dimensions.width * 75); ++i) { + double gaussX = level.getRandom().nextGaussian() * 0.01D; + double gaussY = level.getRandom().nextGaussian() * 0.01D; + double gaussZ = level.getRandom().nextGaussian() * 0.01D; + double gaussFactor = 5.0D; + level.sendParticles(new ItemParticleOption(ParticleTypes.ITEM, itemId), + target.getX() + level.getRandom().nextFloat() * target.getBbWidth() * 1.5F - target.getBbWidth() - gaussX * gaussFactor, + target.getY() + level.getRandom().nextFloat() * target.getBbHeight() - gaussY * gaussFactor, + target.getZ() + level.getRandom().nextFloat() * target.getBbWidth() * 1.5F - target.getBbWidth() - gaussZ * gaussFactor, + 1, gaussX, gaussY, gaussZ, level.getRandom().nextGaussian() * explosionPower); + } + } + + /** + * What, if anything, is the player currently looking at? + */ + @Nullable + private Entity getPlayerLookTarget(Level level, LivingEntity living) { + Entity pointedEntity = null; + double range = 20.0D; + Vec3 srcVec = living.getEyePosition(); + Vec3 lookVec = living.getViewVector(1.0F); + Vec3 destVec = srcVec.add(lookVec.x() * range, lookVec.y() * range, lookVec.z() * range); + float var9 = 1.0F; + List possibleList = level.getEntities(living, living.getBoundingBox().expandTowards(lookVec.x() * range, lookVec.y() * range, lookVec.z() * range).inflate(var9, var9, var9)); + double hitDist = 0; + + for (Entity possibleEntity : possibleList) { + + if (possibleEntity.isPickable()) { + float borderSize = possibleEntity.getPickRadius(); + AABB collisionBB = possibleEntity.getBoundingBox().inflate(borderSize, borderSize, borderSize); + Optional interceptPos = collisionBB.clip(srcVec, destVec); + + if (collisionBB.contains(srcVec)) { + if (0.0D < hitDist || hitDist == 0.0D) { + pointedEntity = possibleEntity; + hitDist = 0.0D; + } + } else if (interceptPos.isPresent()) { + double possibleDist = srcVec.distanceTo(interceptPos.get()); + + if (possibleDist < hitDist || hitDist == 0.0D) { + pointedEntity = possibleEntity; + hitDist = possibleDist; + } + } + } + } + return pointedEntity; + } + + @Override + public void onUseTick(Level level, LivingEntity living, ItemStack stack, int count) { + if (stack.getDamageValue() == this.getMaxDamage(stack)) { + // do not use + living.stopUsingItem(); + return; + } + + if (count % 5 == 0) { + + // is the player looking at an entity + Entity pointedEntity = getPlayerLookTarget(level, living); + + if (pointedEntity instanceof LivingEntity target && !(target instanceof ArmorStand)) { + if (level.isClientSide()) { + this.makeRedMagicTrail(level, living, target.getEyePosition()); + } + + if (target.hurt(TFDamageTypes.getEntityDamageSource(level, TFDamageTypes.LIFEDRAIN, living), 1)) { + // make it explode + if (!level.isClientSide()) { + if (target.getHealth() <= 1) { + if (!target.getType().is(EntityTagGenerator.LIFEDRAIN_DROPS_NO_FLESH)) { + target.spawnAtLocation(new ItemStack(Items.ROTTEN_FLESH, level.getRandom().nextInt(3))); + animateTargetShatter((ServerLevel) level, target); + } + if (target instanceof Mob mob) { + mob.spawnAnim(); + } + target.playSound(TFSounds.SCEPTER_DRAIN.get(), 1.0F, living.getVoicePitch()); + SoundEvent deathSound = EntityUtil.getDeathSound(target); + if (deathSound != null) { + level.playSound(null, target.blockPosition(), deathSound, SoundSource.HOSTILE, 1.0F, target.getVoicePitch()); + } + if (!target.isDeadOrDying()) { + if (target instanceof Player) { + target.hurt(TFDamageTypes.getEntityDamageSource(level, TFDamageTypes.LIFEDRAIN, living), Float.MAX_VALUE); + } else { + target.die(TFDamageTypes.getEntityDamageSource(level, TFDamageTypes.LIFEDRAIN, living)); + target.discard(); + } + } + } else { + target.addEffect(new MobEffectInstance(MobEffects.MOVEMENT_SLOWDOWN, 20, 2)); + if (count % 10 == 0) { + // heal the player + living.heal(1.0F); + // and give foods + if (living instanceof Player player) + player.getFoodData().eat(1, 0.1F); + } + } + + if (living instanceof Player player && !player.isCreative()) { + stack.hurt(1, level.getRandom(), null); + } + } + } + + if (!level.isClientSide() && target.getHealth() <= living.getHealth()) { + // only do lifting effect on creatures weaker than the player + target.setDeltaMovement(0, 0.15D, 0); + } + } + } + } + + private void makeRedMagicTrail(Level level, LivingEntity source, Vec3 target) { + // make particle trail + int particles = 32; + for (int i = 0; i < particles; i++) { + double trailFactor = i / (particles - 1.0D); + float f = 1.0F; + float f1 = 0.5F; + float f2 = 0.5F; + double handOffset = source.getItemInHand(InteractionHand.OFF_HAND).is(this) ? -0.35D : 0.35D; + double tx = source.getX() + (target.x() - source.getX()) * trailFactor + level.getRandom().nextGaussian() * 0.005D + (handOffset * Direction.fromYRot(source.yBodyRot).get2DDataValue()); + double ty = source.getEyeY() - 0.1D + (target.y() - source.getEyeY()) * trailFactor + level.getRandom().nextGaussian() * 0.005D - 0.1D; + double tz = source.getZ() + (target.z() - source.getZ()) * trailFactor + level.getRandom().nextGaussian() * 0.005D + (handOffset * Direction.fromYRot(source.yBodyRot).get2DDataValue()); + level.addParticle(ParticleTypes.ENTITY_EFFECT, tx, ty, tz, f, f1, f2); + } + } + + @Override + public int getUseDuration(ItemStack stack) { + return 72000; + } + + @Override + public UseAnim getUseAnimation(ItemStack stack) { + return UseAnim.BOW; + } + + @Override + public boolean canContinueUsing(ItemStack oldStack, ItemStack newStack) { + return oldStack.getItem() == newStack.getItem(); + } + + @Override + public boolean shouldCauseReequipAnimation(ItemStack oldStack, ItemStack newStack, boolean slotChanged) { + return slotChanged || newStack.getItem() != oldStack.getItem(); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void appendHoverText(ItemStack stack, @Nullable Level level, List tooltip, TooltipFlag flags) { + super.appendHoverText(stack, level, tooltip, flags); + tooltip.add(Component.translatable("item.twilightforest.scepter.desc", stack.getMaxDamage() - stack.getDamageValue()).withStyle(ChatFormatting.GRAY)); + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/item/MagicBeansItem.java b/src/main/java/twilightforest/item/MagicBeansItem.java new file mode 100644 index 0000000000..d9ebf97c8b --- /dev/null +++ b/src/main/java/twilightforest/item/MagicBeansItem.java @@ -0,0 +1,61 @@ +package twilightforest.item; + +import net.minecraft.advancements.Advancement; +import net.minecraft.core.BlockPos; +import net.minecraft.server.PlayerAdvancements; +import net.minecraft.server.ServerAdvancementManager; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundSource; +import net.minecraft.stats.Stats; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.level.Level; +import twilightforest.TwilightForestMod; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFSounds; + +import javax.annotation.Nonnull; + +public class MagicBeansItem extends Item { + + public MagicBeansItem(Properties properties) { + super(properties); + } + + @Nonnull + @Override + public InteractionResult useOn(UseOnContext context) { + Level level = context.getLevel(); + BlockPos pos = context.getClickedPos(); + Player player = context.getPlayer(); + ItemStack stack = context.getItemInHand(); + + int maxY = Math.max(pos.getY() + 100, 175); + if (pos.getY() < maxY && level.getBlockState(pos).is(TFBlocks.UBEROUS_SOIL.get()) && level.getBlockState(pos.above()).isAir()) { + if (!level.isClientSide()) { + stack.shrink(1); + level.setBlockAndUpdate(pos.above(), TFBlocks.BEANSTALK_GROWER.get().defaultBlockState()); + level.playSound(null, pos, TFSounds.BEANSTALK_GROWTH.get(), SoundSource.BLOCKS, 4.0F, 1.0F); + if (player instanceof ServerPlayer) { + player.awardStat(Stats.ITEM_USED.get(this)); + + //fallback if the other part doesnt work since its inconsistent + PlayerAdvancements advancements = ((ServerPlayer) player).getAdvancements(); + ServerAdvancementManager manager = ((ServerLevel) player.getCommandSenderWorld()).getServer().getAdvancements(); + Advancement advancement = manager.getAdvancement(TwilightForestMod.prefix("beanstalk")); + if (advancement != null && !manager.getAllAdvancements().contains(advancement)) { + advancements.award(advancement, "use_beans"); + } + } + } + + return InteractionResult.SUCCESS; + } else { + return InteractionResult.PASS; + } + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/item/MagicMapItem.java b/src/main/java/twilightforest/item/MagicMapItem.java new file mode 100644 index 0000000000..13ce4d7d98 --- /dev/null +++ b/src/main/java/twilightforest/item/MagicMapItem.java @@ -0,0 +1,280 @@ +package twilightforest.item; + +import net.minecraft.ChatFormatting; +import net.minecraft.core.BlockPos; +import net.minecraft.core.registries.Registries; +import net.minecraft.network.chat.Component; +import net.minecraft.network.protocol.Packet; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ColumnPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.MapItem; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.material.MaterialColor; +import net.minecraft.world.level.saveddata.maps.MapItemSavedData; +import org.jetbrains.annotations.Nullable; +import twilightforest.TFMagicMapData; +import twilightforest.init.TFBiomes; +import twilightforest.init.TFItems; +import twilightforest.init.TFLandmark; +import twilightforest.util.LegacyLandmarkPlacements; +import twilightforest.world.registration.TFGenerationSettings; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +// [VanillaCopy] super everything, but with appropriate redirections to our own datastructures. finer details noted + +public class MagicMapItem extends MapItem { + + public static final String STR_ID = "magicmap"; + private static final Map BIOME_COLORS = new HashMap<>(); + + public MagicMapItem(Properties properties) { + super(properties); + } + + private static class MapColorBrightness { + public final MaterialColor color; + public final int brightness; + + public MapColorBrightness(MaterialColor color, int brightness) { + this.color = color; + this.brightness = brightness; + } + + public MapColorBrightness(MaterialColor color) { + this.color = color; + this.brightness = 1; + } + } + + public static ItemStack setupNewMap(Level level, int worldX, int worldZ, byte scale, boolean trackingPosition, boolean unlimitedTracking) { + ItemStack itemstack = new ItemStack(TFItems.FILLED_MAGIC_MAP.get()); + createMapData(itemstack, level, worldX, worldZ, scale, trackingPosition, unlimitedTracking, level.dimension()); + return itemstack; + } + + @Nullable + public static TFMagicMapData getData(ItemStack stack, Level level) { + Integer id = getMapId(stack); + return id == null ? null : TFMagicMapData.getMagicMapData(level, getMapName(id)); + } + + @Nullable + @Override + protected TFMagicMapData getCustomMapData(ItemStack stack, Level level) { + TFMagicMapData mapdata = getData(stack, level); + if (mapdata == null && !level.isClientSide()) { + mapdata = MagicMapItem.createMapData(stack, level, level.getLevelData().getXSpawn(), level.getLevelData().getZSpawn(), 3, false, false, level.dimension()); + } + + return mapdata; + } + + public static ColumnPos getMagicMapCenter(int x, int z) { + // magic maps are aligned to the key biome grid so that 0,0 -> 2048,2048 is the covered area + int mapSize = 2048; + int roundX = (int) Math.round((double) (x - 1024) / mapSize); + int roundZ = (int) Math.round((double) (z - 1024) / mapSize); + int scaledX = roundX * mapSize + 1024; + int scaledZ = roundZ * mapSize + 1024; + return new ColumnPos(scaledX, scaledZ); + } + + private static TFMagicMapData createMapData(ItemStack stack, Level level, int x, int z, int scale, boolean trackingPosition, boolean unlimitedTracking, ResourceKey dimension) { + int i = level.getFreeMapId(); + ColumnPos pos = getMagicMapCenter(x, z); + + TFMagicMapData mapdata = new TFMagicMapData(pos.x(), pos.z(), (byte) scale, trackingPosition, unlimitedTracking, false, dimension); + TFMagicMapData.registerMagicMapData(level, mapdata, getMapName(i)); // call our own register method + stack.getOrCreateTag().putInt("map", i); + return mapdata; + } + + public static String getMapName(int id) { + return STR_ID + "_" + id; + } + + private static final Map CACHE = new HashMap<>(); + private static final ResourceLocation NULL_BIOME = new ResourceLocation("null"); + + @Override + public void update(Level level, Entity viewer, MapItemSavedData data) { + if (level.dimension() == data.dimension && viewer instanceof Player && level instanceof ServerLevel serverLevel && TFGenerationSettings.usesTwilightChunkGenerator(serverLevel)) { + int biomesPerPixel = 4; + int blocksPerPixel = 16; // don't even bother with the scale, just hardcode it + int centerX = data.centerX; + int centerZ = data.centerZ; + int viewerX = Mth.floor(viewer.getX() - centerX) / blocksPerPixel + 64; + int viewerZ = Mth.floor(viewer.getZ() - centerZ) / blocksPerPixel + 64; + int viewRadiusPixels = 512 / blocksPerPixel; + + int startX = (centerX / blocksPerPixel - 64) * biomesPerPixel; + int startZ = (centerZ / blocksPerPixel - 64) * biomesPerPixel; + ResourceLocation[] biomes = CACHE.computeIfAbsent(new ChunkPos(startX, startZ), pos -> { + ResourceLocation[] array = new ResourceLocation[128 * biomesPerPixel * 128 * biomesPerPixel]; + for (int l = 0; l < 128 * biomesPerPixel; ++l) { + for (int i1 = 0; i1 < 128 * biomesPerPixel; ++i1) { + array[l * 128 * biomesPerPixel + i1] = level + .getBiome(new BlockPos(startX * biomesPerPixel + i1 * biomesPerPixel, 0, startZ * biomesPerPixel + l * biomesPerPixel)) + .unwrapKey() + .map(ResourceKey::location) + .orElse(NULL_BIOME); + } + } + return array; + }); + + for (int xPixel = viewerX - viewRadiusPixels + 1; xPixel < viewerX + viewRadiusPixels; ++xPixel) { + for (int zPixel = viewerZ - viewRadiusPixels - 1; zPixel < viewerZ + viewRadiusPixels; ++zPixel) { + if (xPixel >= 0 && zPixel >= 0 && xPixel < 128 && zPixel < 128) { + int xPixelDist = xPixel - viewerX; + int zPixelDist = zPixel - viewerZ; + boolean shouldFuzz = xPixelDist * xPixelDist + zPixelDist * zPixelDist > (viewRadiusPixels - 2) * (viewRadiusPixels - 2); + + ResourceLocation biome = biomes[xPixel * biomesPerPixel + zPixel * biomesPerPixel * 128 * biomesPerPixel]; + + // make streams more visible + ResourceLocation overBiome = biomes[xPixel * biomesPerPixel + zPixel * biomesPerPixel * 128 * biomesPerPixel + 1]; + ResourceLocation downBiome = biomes[xPixel * biomesPerPixel + (zPixel * biomesPerPixel + 1) * 128 * biomesPerPixel]; + biome = overBiome != null && TFBiomes.STREAM.location().equals(overBiome) ? overBiome : downBiome != null && TFBiomes.STREAM.location().equals(downBiome) ? downBiome : biome; + + MapColorBrightness colorBrightness = this.getMapColorPerBiome(level, biome); + + MaterialColor mapcolor = colorBrightness.color; + int brightness = colorBrightness.brightness; + + if (xPixelDist * xPixelDist + zPixelDist * zPixelDist < viewRadiusPixels * viewRadiusPixels && (!shouldFuzz || (xPixel + zPixel & 1) != 0)) { + byte orgPixel = data.colors[xPixel + zPixel * 128]; + byte ourPixel = (byte) (mapcolor.id * 4 + brightness); + + if (orgPixel != ourPixel) { + data.setColor(xPixel, zPixel, ourPixel); + data.setDirty(); + } + + // look for TF features + int worldX = (centerX / blocksPerPixel + xPixel - 64) * blocksPerPixel; + int worldZ = (centerZ / blocksPerPixel + zPixel - 64) * blocksPerPixel; + if (LegacyLandmarkPlacements.blockIsInLandmarkCenter(worldX, worldZ)) { + byte mapX = (byte) ((worldX - centerX) / (float) blocksPerPixel * 2F); + byte mapZ = (byte) ((worldZ - centerZ) / (float) blocksPerPixel * 2F); + TFLandmark feature = LegacyLandmarkPlacements.pickLandmarkAtBlock(worldX, worldZ, (ServerLevel) level); + TFMagicMapData tfData = (TFMagicMapData) data; + tfData.tfDecorations.add(new TFMagicMapData.TFMapDecoration(feature, mapX, mapZ, (byte) 8)); + //TwilightForestMod.LOGGER.info("Found feature at {}, {}. Placing it on the map at {}, {}", worldX, worldZ, mapX, mapZ); + } + } + } + } + } + } + } + + private MapColorBrightness getMapColorPerBiome(Level level, ResourceLocation biome) { + if (BIOME_COLORS.isEmpty()) { + setupBiomeColors(); + } + if (biome == NULL_BIOME) + return new MapColorBrightness(MaterialColor.COLOR_BLACK); + MapColorBrightness color = BIOME_COLORS.get(biome); + if (color != null) { + return color; + } + return new MapColorBrightness(MaterialColor.COLOR_MAGENTA); + } + + private static void setupBiomeColors() { + putBiomeColor(TFBiomes.FOREST, new MapColorBrightness(MaterialColor.PLANT, 1)); + putBiomeColor(TFBiomes.DENSE_FOREST, new MapColorBrightness(MaterialColor.PLANT, 0)); + putBiomeColor(TFBiomes.LAKE, new MapColorBrightness(MaterialColor.WATER, 3)); + putBiomeColor(TFBiomes.STREAM, new MapColorBrightness(MaterialColor.WATER, 1)); + putBiomeColor(TFBiomes.SWAMP, new MapColorBrightness(MaterialColor.DIAMOND, 3)); + putBiomeColor(TFBiomes.FIRE_SWAMP, new MapColorBrightness(MaterialColor.NETHER, 1)); + putBiomeColor(TFBiomes.CLEARING, new MapColorBrightness(MaterialColor.GRASS, 2)); + putBiomeColor(TFBiomes.OAK_SAVANNAH, new MapColorBrightness(MaterialColor.GRASS, 0)); + putBiomeColor(TFBiomes.HIGHLANDS, new MapColorBrightness(MaterialColor.DIRT, 0)); + putBiomeColor(TFBiomes.THORNLANDS, new MapColorBrightness(MaterialColor.WOOD, 3)); + putBiomeColor(TFBiomes.FINAL_PLATEAU, new MapColorBrightness(MaterialColor.COLOR_LIGHT_GRAY, 2)); + putBiomeColor(TFBiomes.FIREFLY_FOREST, new MapColorBrightness(MaterialColor.EMERALD, 1)); + putBiomeColor(TFBiomes.DARK_FOREST, new MapColorBrightness(MaterialColor.COLOR_GREEN, 3)); + putBiomeColor(TFBiomes.DARK_FOREST_CENTER, new MapColorBrightness(MaterialColor.COLOR_ORANGE, 3)); + putBiomeColor(TFBiomes.SNOWY_FOREST, new MapColorBrightness(MaterialColor.SNOW, 1)); + putBiomeColor(TFBiomes.GLACIER, new MapColorBrightness(MaterialColor.ICE, 1)); + putBiomeColor(TFBiomes.MUSHROOM_FOREST, new MapColorBrightness(MaterialColor.COLOR_ORANGE, 0)); + putBiomeColor(TFBiomes.DENSE_MUSHROOM_FOREST, new MapColorBrightness(MaterialColor.COLOR_PINK, 0)); + putBiomeColor(TFBiomes.ENCHANTED_FOREST, new MapColorBrightness(MaterialColor.COLOR_CYAN, 2)); + putBiomeColor(TFBiomes.SPOOKY_FOREST, new MapColorBrightness(MaterialColor.COLOR_PURPLE, 0)); + } + + private static void putBiomeColor(ResourceKey biome, MapColorBrightness color) { + BIOME_COLORS.put(biome.location(), color); + } + + public static int getBiomeColor(Level level, Biome biome) { + if (BIOME_COLORS.isEmpty()) { + setupBiomeColors(); + } + + MapColorBrightness c = BIOME_COLORS.get(level.registryAccess().registryOrThrow(Registries.BIOME).getKey(biome)); + + return c != null ? getMapColor(c) : 0xFF000000; + } + + public static int getMapColor(MapColorBrightness mcb) { + int i = switch (mcb.color.id) { + case 3 -> 135; + case 2 -> 255; + case 0 -> 180; + default -> 220; + }; + + int j = (mcb.color.col >> 16 & 255) * i / 255; + int k = (mcb.color.col >> 8 & 255) * i / 255; + int l = (mcb.color.col & 255) * i / 255; + return 0xFF000000 | l << 16 | k << 8 | j; + } + + @Override + public void onCraftedBy(ItemStack stack, Level world, Player player) { + // disable zooming + } + + @Override + @Nullable + public Packet getUpdatePacket(ItemStack stack, Level world, Player player) { + Integer id = getMapId(stack); + TFMagicMapData mapdata = getCustomMapData(stack, world); + return id == null || mapdata == null ? null : mapdata.getUpdatePacket(id, player); + } + + @Override + public void appendHoverText(ItemStack stack, @Nullable Level level, List tooltip, TooltipFlag flag) { + Integer integer = getMapId(stack); + TFMagicMapData mapitemsaveddata = level == null ? null : getData(stack, level); + if (flag.isAdvanced()) { + if (mapitemsaveddata != null) { + tooltip.add((Component.translatable("filled_map.id", integer)).withStyle(ChatFormatting.GRAY)); + tooltip.add((Component.translatable("filled_map.scale", 1 << mapitemsaveddata.scale)).withStyle(ChatFormatting.GRAY)); + tooltip.add((Component.translatable("filled_map.level", mapitemsaveddata.scale, 4)).withStyle(ChatFormatting.GRAY)); + } else { + tooltip.add((Component.translatable("filled_map.unknown")).withStyle(ChatFormatting.GRAY)); + } + } else { + if (integer != null) { + tooltip.add(Component.literal("#" + integer).withStyle(ChatFormatting.GRAY)); + } + } + + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/item/MazeMapItem.java b/src/main/java/twilightforest/item/MazeMapItem.java new file mode 100644 index 0000000000..988c40b1b5 --- /dev/null +++ b/src/main/java/twilightforest/item/MazeMapItem.java @@ -0,0 +1,243 @@ +package twilightforest.item; + +import com.google.common.collect.HashMultiset; +import com.google.common.collect.Iterables; +import com.google.common.collect.Multiset; +import com.google.common.collect.Multisets; +import net.minecraft.core.BlockPos; +import net.minecraft.network.protocol.Packet; +import net.minecraft.resources.ResourceKey; +import net.minecraft.tags.BlockTags; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.MapItem; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.LevelChunk; +import net.minecraft.world.level.material.MaterialColor; +import net.minecraft.world.level.saveddata.maps.MapDecoration; +import net.minecraft.world.level.saveddata.maps.MapItemSavedData; +import net.minecraftforge.common.Tags; +import org.jetbrains.annotations.Nullable; +import twilightforest.TFMazeMapData; +import twilightforest.init.TFItems; + +// [VanillaCopy] super everything, but with appropriate redirections to our own datastructures. finer details noted + +public class MazeMapItem extends MapItem { + + public static final String STR_ID = "mazemap"; + private static final int YSEARCH = 3; + + protected final boolean mapOres; + + public MazeMapItem(boolean mapOres, Properties properties) { + super(properties); + this.mapOres = mapOres; + } + + public static ItemStack setupNewMap(Level level, int worldX, int worldZ, byte scale, boolean trackingPosition, boolean unlimitedTracking, int worldY, boolean mapOres) { + ItemStack itemstack = new ItemStack(mapOres ? TFItems.FILLED_ORE_MAP.get() : TFItems.FILLED_MAZE_MAP.get()); + createMapData(itemstack, level, worldX, worldZ, scale, trackingPosition, unlimitedTracking, level.dimension(), worldY); + return itemstack; + } + + @Nullable + public static TFMazeMapData getData(ItemStack stack, Level level) { + Integer id = getMapId(stack); + return id == null ? null : TFMazeMapData.getMazeMapData(level, getMapName(id)); + } + + @Nullable + @Override + protected TFMazeMapData getCustomMapData(ItemStack stack, Level level) { + TFMazeMapData mapdata = getData(stack, level); + if (mapdata == null && !level.isClientSide()) { + mapdata = MazeMapItem.createMapData(stack, level, level.getLevelData().getXSpawn(), level.getLevelData().getZSpawn(), 0, false, false, level.dimension(), level.getLevelData().getYSpawn()); + } + + return mapdata; + } + + private static TFMazeMapData createMapData(ItemStack stack, Level level, int x, int z, int scale, boolean trackingPosition, boolean unlimitedTracking, ResourceKey dimension, int y) { + int i = level.getFreeMapId(); + + int mapSize = 128 * (1 << scale); + int roundX = Mth.floor((x + 64.0D) / (double) mapSize); + int roundZ = Mth.floor((z + 64.0D) / (double) mapSize); + int scaledX = roundX * mapSize + mapSize / 2 - 64; + int scaledZ = roundZ * mapSize + mapSize / 2 - 64; + + TFMazeMapData mapdata = new TFMazeMapData(scaledX, scaledZ, (byte) scale, trackingPosition, unlimitedTracking, false, dimension); + mapdata.calculateMapCenter(level, x, y, z); // call our own map center calculation + TFMazeMapData.registerMazeMapData(level, mapdata, getMapName(i)); // call our own register method + stack.getOrCreateTag().putInt("map", i); + return mapdata; + } + + public static String getMapName(int id) { + return STR_ID + "_" + id; + } + + // [VanillaCopy] of superclass, with sane variable names and noted changes + @Override + public void update(Level level, Entity viewer, MapItemSavedData data) { + if (level.dimension() == data.dimension && viewer instanceof Player) { + int blocksPerPixel = 1 << data.scale; + int centerX = data.centerX; + int centerZ = data.centerZ; + int viewerX = Mth.floor(viewer.getX() - centerX) / blocksPerPixel + 64; + int viewerZ = Mth.floor(viewer.getZ() - centerZ) / blocksPerPixel + 64; + int viewRadiusPixels = 16; // TF this is smaller on the maze map + + if (level.dimensionType().hasCeiling()) { + viewRadiusPixels /= 2; + } + + MapItemSavedData.HoldingPlayer mapdata$mapinfo = data.getHoldingPlayer((Player) viewer); + ++mapdata$mapinfo.step; + boolean flag = false; + + for (int xPixel = viewerX - viewRadiusPixels + 1; xPixel < viewerX + viewRadiusPixels; ++xPixel) { + if ((xPixel & 15) == (mapdata$mapinfo.step & 15) || flag) { + flag = false; + + for (int zPixel = viewerZ - viewRadiusPixels - 1; zPixel < viewerZ + viewRadiusPixels; ++zPixel) { + if (xPixel >= 0 && zPixel >= -1 && xPixel < 128 && zPixel < 128) { + int xPixelDist = xPixel - viewerX; + int zPixelDist = zPixel - viewerZ; + boolean shouldFuzz = xPixelDist * xPixelDist + zPixelDist * zPixelDist > (viewRadiusPixels - 2) * (viewRadiusPixels - 2); + int worldX = (centerX / blocksPerPixel + xPixel - 64) * blocksPerPixel; + int worldZ = (centerZ / blocksPerPixel + zPixel - 64) * blocksPerPixel; + Multiset multiset = HashMultiset.create(); + LevelChunk chunk = level.getChunkAt(new BlockPos(worldX, 0, worldZ)); + + int brightness = 1; + if (!chunk.isEmpty()) { + int worldXRounded = worldX & 15; + int worldZRounded = worldZ & 15; + + if (level.dimensionType().hasCeiling()) { + int l3 = worldX + worldZ * 231871; + l3 = l3 * l3 * 31287121 + l3 * 11; + + if ((l3 >> 20 & 1) == 0) { + multiset.add(Blocks.DIRT.defaultBlockState().getMapColor(level, BlockPos.ZERO), 10); + } else { + multiset.add(Blocks.STONE.defaultBlockState().getMapColor(level, BlockPos.ZERO), 100); + } + + } else { + // TF - remove extra 2 levels of loops + // maze maps are always 0 scale, which is 1 pixel = 1 block, so the loops are unneeded + int yCenter = ((TFMazeMapData) data).yCenter; + BlockPos.MutableBlockPos blockpos$mutableblockpos = new BlockPos.MutableBlockPos(worldXRounded, yCenter, worldZRounded); + BlockState state = chunk.getBlockState(blockpos$mutableblockpos); + + multiset.add(state.getMapColor(level, blockpos$mutableblockpos)); + + if (state.is(Blocks.STONE) || state.isAir()) { + for (int i = -YSEARCH; i <= YSEARCH; i++) { + blockpos$mutableblockpos.setY(yCenter + i); + BlockState searchID = chunk.getBlockState(blockpos$mutableblockpos); + if (searchID.is(Blocks.STONE) && !searchID.isAir()) { + state = searchID; + if (i > 0) { + brightness = 2; + } + if (i < 0) { + brightness = 0; + } + + break; + } + } + } + + if (mapOres) { + // recolor ores + if (state.is(BlockTags.COAL_ORES)) { + multiset.add(MaterialColor.COLOR_BLACK, 1000); + } else if (state.is(BlockTags.GOLD_ORES)) { + multiset.add(MaterialColor.GOLD, 1000); + } else if (state.is(BlockTags.IRON_ORES)) { + multiset.add(MaterialColor.METAL, 1000); + } else if (state.is(BlockTags.LAPIS_ORES)) { + multiset.add(MaterialColor.LAPIS, 1000); + } else if (state.is(BlockTags.REDSTONE_ORES)) { + multiset.add(MaterialColor.COLOR_RED, 1000); + } else if (state.is(BlockTags.DIAMOND_ORES)) { + multiset.add(MaterialColor.DIAMOND, 1000); + } else if (state.is(BlockTags.EMERALD_ORES)) { + multiset.add(MaterialColor.EMERALD, 1000); + } else if (state.is(BlockTags.COPPER_ORES)) { + multiset.add(MaterialColor.COLOR_ORANGE, 1000); + } else if (state.getBlock() != Blocks.AIR && state.is(Tags.Blocks.ORES)) { + multiset.add(MaterialColor.COLOR_PINK, 1000); + } + } + } + + MaterialColor mapcolor = Iterables.getFirst(Multisets.copyHighestCountFirst(multiset), MaterialColor.NONE); + + if (zPixel >= 0 && xPixelDist * xPixelDist + zPixelDist * zPixelDist < viewRadiusPixels * viewRadiusPixels && (!shouldFuzz || (xPixel + zPixel & 1) != 0)) { + byte b0 = data.colors[xPixel + zPixel * 128]; + byte b1 = (byte) (mapcolor.id * 4 + brightness); + + if (b0 != b1) { + data.setColor(xPixel, zPixel, b1); + data.setDirty(); + flag = true; + } + } + } + } + } + } + } + } + } + + // [VanillaCopy] super but shows a dot if player is too far in the vertical direction as well + @Override + public void inventoryTick(ItemStack stack, Level level, Entity entity, int slot, boolean isSelected) { + if (!level.isClientSide()) { + TFMazeMapData mapdata = this.getCustomMapData(stack, level); + + if (mapdata != null) { + if (entity instanceof Player entityplayer) { + mapdata.tickCarriedBy(entityplayer, stack); + + // TF - if player is far away vertically, show a dot + int yProximity = Mth.floor(entityplayer.getY() - mapdata.yCenter); + if (yProximity < -YSEARCH || yProximity > YSEARCH) { + MapDecoration decoration = mapdata.decorations.get(entityplayer.getName().getString()); + if (decoration != null) { + mapdata.decorations.put(entityplayer.getName().getString(), new MapDecoration(MapDecoration.Type.PLAYER_OFF_MAP, decoration.getX(), decoration.getY(), decoration.getRot(), null)); + } + } + } + + if (!mapdata.locked && (isSelected || entity instanceof Player player && player.getOffhandItem() == stack)) { + this.update(level, entity, mapdata); + } + } + } + } + + @Override + public void onCraftedBy(ItemStack stack, Level level, Player player) { + // disable zooming + } + + @Override + @Nullable + public Packet getUpdatePacket(ItemStack stack, Level level, Player player) { + Integer id = getMapId(stack); + TFMazeMapData mapdata = getCustomMapData(stack, level); + return id == null || mapdata == null ? null : mapdata.getUpdatePacket(id, player); + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/item/MazebreakerPickItem.java b/src/main/java/twilightforest/item/MazebreakerPickItem.java new file mode 100644 index 0000000000..ba5a9ade16 --- /dev/null +++ b/src/main/java/twilightforest/item/MazebreakerPickItem.java @@ -0,0 +1,26 @@ +package twilightforest.item; + +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.PickaxeItem; +import net.minecraft.world.item.Tier; +import net.minecraft.world.level.block.state.BlockState; +import twilightforest.data.tags.BlockTagGenerator; + +import javax.annotation.Nonnull; + +public class MazebreakerPickItem extends PickaxeItem { + public MazebreakerPickItem(Tier material, Properties properties) { + super(material, 1, -2.8F, properties); + } + + @Override + public float getDestroySpeed(@Nonnull ItemStack stack, BlockState state) { + float destroySpeed = super.getDestroySpeed(stack, state); + return state.is(BlockTagGenerator.MAZEBREAKER_ACCELERATED) ? destroySpeed * 16.0F : destroySpeed; + } + + @Override + public boolean isValidRepairItem(ItemStack stack, ItemStack otherStack) { + return false; + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/item/MinotaurAxeItem.java b/src/main/java/twilightforest/item/MinotaurAxeItem.java new file mode 100644 index 0000000000..5ba92888be --- /dev/null +++ b/src/main/java/twilightforest/item/MinotaurAxeItem.java @@ -0,0 +1,32 @@ +package twilightforest.item; + +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.*; +import net.minecraft.world.level.Level; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.fml.common.Mod; +import twilightforest.TwilightForestMod; + +import org.jetbrains.annotations.Nullable; +import java.util.List; + +public class MinotaurAxeItem extends AxeItem { + + public MinotaurAxeItem(Tier material, Properties properties) { + super(material, 6F, material.getSpeed() * 0.05f - 3.4f, properties); + } + + @Override + public int getEnchantmentValue() { + return Tiers.GOLD.getEnchantmentValue(); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void appendHoverText(ItemStack stack, @Nullable Level level, List tooltip, TooltipFlag flags) { + super.appendHoverText(stack, level, tooltip, flags); + tooltip.add(Component.translatable("item.twilightforest.minotaur_axe.desc").withStyle(ChatFormatting.GRAY)); + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/item/MoonDialItem.java b/src/main/java/twilightforest/item/MoonDialItem.java new file mode 100644 index 0000000000..84be886369 --- /dev/null +++ b/src/main/java/twilightforest/item/MoonDialItem.java @@ -0,0 +1,25 @@ +package twilightforest.item; + +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; +import org.jetbrains.annotations.Nullable; + +import java.time.LocalDate; +import java.util.List; + +public class MoonDialItem extends Item { + public MoonDialItem(Properties properties) { + super(properties); + } + + @Override + public void appendHoverText(ItemStack stack, @Nullable Level level, List tooltip, TooltipFlag flag) { + super.appendHoverText(stack, level, tooltip, flag); + boolean aprilFools = LocalDate.of(LocalDate.now().getYear(), 4, 1).equals(LocalDate.now()); + tooltip.add(Component.translatable("item.twilightforest.moon_dial.phase_" + (level != null && level.dimensionType().natural() ? level.getMoonPhase() : aprilFools ? "unknown_fools" : "unknown")).withStyle(ChatFormatting.GRAY)); + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/item/MoonwormQueenItem.java b/src/main/java/twilightforest/item/MoonwormQueenItem.java new file mode 100644 index 0000000000..73cf113946 --- /dev/null +++ b/src/main/java/twilightforest/item/MoonwormQueenItem.java @@ -0,0 +1,224 @@ +package twilightforest.item; + +import net.minecraft.advancements.CriteriaTriggers; +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.UseAnim; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.item.enchantment.Enchantment; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.Property; +import net.minecraft.world.phys.shapes.CollisionContext; +import org.jetbrains.annotations.Nullable; +import twilightforest.entity.projectile.MoonwormShot; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFEntities; +import twilightforest.init.TFSounds; + +import javax.annotation.Nonnull; +import java.util.Objects; + +public class MoonwormQueenItem extends Item { + + public static final int FIRING_TIME = 12; + + public MoonwormQueenItem(Properties properties) { + super(properties); + } + + @Override + public boolean isEnchantable(ItemStack stack) { + return false; + } + + @Override + public boolean isBookEnchantable(ItemStack stack, ItemStack book) { + return false; + } + + @Override + public boolean canApplyAtEnchantingTable(ItemStack stack, Enchantment enchantment) { + return false; + } + + @Override + public InteractionResultHolder use(Level level, Player player, InteractionHand hand) { + ItemStack stack = player.getItemInHand(hand); + if (stack.getDamageValue() + 1 >= this.getMaxDamage(stack)) { + return InteractionResultHolder.fail(stack); + } else { + player.startUsingItem(hand); + return InteractionResultHolder.success(player.getItemInHand(hand)); + } + } + + // [VanillaCopy] ItemBlock.onItemUse, harcoding the block + @Override + public InteractionResult useOn(UseOnContext context) { + Level level = context.getLevel(); + BlockPos pos = context.getClickedPos(); + BlockState state = level.getBlockState(pos); + Player player = context.getPlayer(); + BlockPlaceContext blockItemUseContext = new BlockPlaceContext(context); + + if (!state.getMaterial().isReplaceable()) { + pos = pos.relative(context.getClickedFace()); + } + + ItemStack itemstack = player.getItemInHand(context.getHand()); + + if (itemstack.getDamageValue() < itemstack.getMaxDamage() && player.mayUseItemAt(pos, context.getClickedFace(), itemstack) && level.isUnobstructed(TFBlocks.MOONWORM.get().defaultBlockState(), pos, CollisionContext.empty())) { + if (this.tryPlace(blockItemUseContext).shouldSwing()) { + SoundType soundtype = level.getBlockState(pos).getBlock().getSoundType(level.getBlockState(pos), level, pos, player); + level.playSound(player, pos, soundtype.getPlaceSound(), SoundSource.BLOCKS, (soundtype.getVolume() + 1.0F) / 2.0F, soundtype.getPitch() * 0.8F); + // TF - damage stack instead of shrinking + player.stopUsingItem(); + } + + return InteractionResult.SUCCESS; + } else { + return InteractionResult.FAIL; + } + } + + + @Override + public void releaseUsing(ItemStack stack, Level level, LivingEntity living, int useRemaining) { + int useTime = this.getUseDuration(stack) - useRemaining; + + if (!level.isClientSide() && useTime > FIRING_TIME && (stack.getDamageValue() + 1) < stack.getMaxDamage()) { + + if (level.addFreshEntity(new MoonwormShot(TFEntities.MOONWORM_SHOT.get(), level, living))) { + if (living instanceof Player player && !player.getAbilities().instabuild) stack.hurt(2, level.getRandom(), null); + + level.playSound(null, living.getX(), living.getY(), living.getZ(), TFSounds.MOONWORM_SQUISH.get(), living instanceof Player ? SoundSource.PLAYERS : SoundSource.NEUTRAL, 1.0F, 1.0F); + } + } + + } + + @Nonnull + @Override + public UseAnim getUseAnimation(ItemStack stack) { + return UseAnim.BOW; + } + + @Override + public int getUseDuration(ItemStack stack) { + return 72000; + } + + //everything from this point on is a [VanillaCopy] of BlockItem, since extending the class doesnt work for this + public InteractionResult tryPlace(BlockPlaceContext context) { + if (!context.canPlace()) { + return InteractionResult.FAIL; + } else { + BlockPlaceContext blockitemusecontext = this.getBlockItemUseContext(context); + if (blockitemusecontext == null) { + return InteractionResult.FAIL; + } else { + BlockState blockstate = this.getStateForPlacement(blockitemusecontext); + if (blockstate == null) { + return InteractionResult.FAIL; + } else if (!this.placeBlock(blockitemusecontext, blockstate)) { + return InteractionResult.FAIL; + } else { + BlockPos blockpos = blockitemusecontext.getClickedPos(); + Level world = blockitemusecontext.getLevel(); + Player playerentity = blockitemusecontext.getPlayer(); + ItemStack itemstack = blockitemusecontext.getItemInHand(); + BlockState blockstate1 = world.getBlockState(blockpos); + Block block = blockstate1.getBlock(); + if (block == blockstate.getBlock()) { + blockstate1 = this.updateBlockStateFromTag(blockpos, world, itemstack, blockstate1); + this.onBlockPlaced(blockpos, world, playerentity, itemstack); + block.setPlacedBy(world, blockpos, blockstate1, playerentity, itemstack); + if (playerentity instanceof ServerPlayer) { + CriteriaTriggers.PLACED_BLOCK.trigger((ServerPlayer) playerentity, blockpos, itemstack); + } + } + + SoundType soundtype = blockstate1.getSoundType(world, blockpos, context.getPlayer()); + world.playSound(playerentity, blockpos, this.getPlaceSound(blockstate1, world, blockpos, Objects.requireNonNull(context.getPlayer())), SoundSource.BLOCKS, (soundtype.getVolume() + 1.0F) / 2.0F, soundtype.getPitch() * 0.8F); + if (playerentity == null || !playerentity.getAbilities().instabuild) { + itemstack.hurt(1, world.random, null); + } + + return InteractionResult.SUCCESS; + } + } + } + } + + protected SoundEvent getPlaceSound(BlockState state, Level level, BlockPos pos, Player entity) { + return state.getSoundType(level, pos, entity).getPlaceSound(); + } + + @Nullable + public BlockPlaceContext getBlockItemUseContext(BlockPlaceContext context) { + return context; + } + + protected boolean onBlockPlaced(BlockPos pos, Level level, @Nullable Player player, ItemStack stack) { + return BlockItem.updateCustomBlockEntityTag(level, player, pos, stack); + } + + @Nullable + protected BlockState getStateForPlacement(BlockPlaceContext context) { + BlockState blockstate = TFBlocks.MOONWORM.get().getStateForPlacement(context); + return blockstate != null && this.canPlace(context, blockstate) ? blockstate : null; + } + + protected boolean canPlace(BlockPlaceContext context, BlockState state) { + Player player = context.getPlayer(); + CollisionContext collision = player == null ? CollisionContext.empty() : CollisionContext.of(player); + return (state.canSurvive(context.getLevel(), context.getClickedPos())) && context.getLevel().isUnobstructed(state, context.getClickedPos(), collision); + } + + private BlockState updateBlockStateFromTag(BlockPos pos, Level level, ItemStack stack, BlockState state) { + BlockState blockstate = state; + CompoundTag compoundnbt = stack.getTag(); + if (compoundnbt != null) { + CompoundTag compoundnbt1 = compoundnbt.getCompound("BlockStateTag"); + StateDefinition statecontainer = state.getBlock().getStateDefinition(); + + for (String s : compoundnbt1.getAllKeys()) { + Property property = statecontainer.getProperty(s); + if (property != null) { + String s1 = compoundnbt1.get(s).getAsString(); + blockstate = updateState(blockstate, property, s1); + } + } + } + + if (blockstate != state) { + level.setBlock(pos, blockstate, 2); + } + + return blockstate; + } + + private static > BlockState updateState(BlockState state, Property property, String name) { + return property.getValue(name).map(value -> state.setValue(property, value)).orElse(state); + } + + protected boolean placeBlock(BlockPlaceContext context, BlockState state) { + return context.getLevel().setBlock(context.getClickedPos(), state, 11); + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/item/NagaArmorItem.java b/src/main/java/twilightforest/item/NagaArmorItem.java new file mode 100644 index 0000000000..cf3a1673db --- /dev/null +++ b/src/main/java/twilightforest/item/NagaArmorItem.java @@ -0,0 +1,23 @@ +package twilightforest.item; + +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.item.ArmorItem; +import net.minecraft.world.item.ArmorMaterial; +import net.minecraft.world.item.ItemStack; +import twilightforest.TwilightForestMod; + +public class NagaArmorItem extends ArmorItem { + public NagaArmorItem(ArmorMaterial material, Type type, Properties properties) { + super(material, type, properties); + } + + @Override + public String getArmorTexture(ItemStack stack, Entity entity, EquipmentSlot slot, String layer) { + if (slot == EquipmentSlot.LEGS) { + return TwilightForestMod.ARMOR_DIR + "naga_scale_2.png"; + } else { + return TwilightForestMod.ARMOR_DIR + "naga_scale_1.png"; + } + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/item/OreMagnetItem.java b/src/main/java/twilightforest/item/OreMagnetItem.java new file mode 100644 index 0000000000..0a350e8d8e --- /dev/null +++ b/src/main/java/twilightforest/item/OreMagnetItem.java @@ -0,0 +1,291 @@ +package twilightforest.item; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Registry; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.TagKey; +import net.minecraft.util.Mth; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.UseAnim; +import net.minecraft.world.item.enchantment.Enchantment; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.event.AddReloadListenerEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.registries.ForgeRegistries; +import twilightforest.TwilightForestMod; +import twilightforest.data.tags.BlockTagGenerator; +import twilightforest.init.TFSounds; +import twilightforest.util.VoxelBresenhamIterator; + +import javax.annotation.Nonnull; +import java.util.*; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.stream.Collectors; + +@Mod.EventBusSubscriber(modid = TwilightForestMod.ID) +public class OreMagnetItem extends Item { + + private static final float WIGGLE = 10F; + + public OreMagnetItem(Properties properties) { + super(properties); + } + + @Override + public boolean isEnchantable(ItemStack stack) { + return false; + } + + @Override + public boolean isBookEnchantable(ItemStack stack, ItemStack book) { + AtomicBoolean badEnchant = new AtomicBoolean(); + EnchantmentHelper.getEnchantments(book).forEach((enchantment, integer) -> { + if (!Objects.equals(Enchantments.UNBREAKING, enchantment)) { + badEnchant.set(true); + } + }); + + return !badEnchant.get() && super.isBookEnchantable(stack, book); + } + + @Override + public boolean canApplyAtEnchantingTable(ItemStack stack, Enchantment enchantment) { + return false; + } + + @Nonnull + @Override + public InteractionResultHolder use(Level level, Player player, @Nonnull InteractionHand hand) { + player.startUsingItem(hand); + return new InteractionResultHolder<>(InteractionResult.SUCCESS, player.getItemInHand(hand)); + } + + @Override + public void releaseUsing(ItemStack stack, Level level, LivingEntity living, int useRemaining) { + int useTime = this.getUseDuration(stack) - useRemaining; + + if (!level.isClientSide() && useTime > 10) { + int moved = this.doMagnet(level, living, 0, 0); + + if (moved == 0) { + moved = this.doMagnet(level, living, WIGGLE, 0); + } + if (moved == 0) { + moved = this.doMagnet(level, living, WIGGLE, WIGGLE); + } + if (moved == 0) { + moved = this.doMagnet(level, living, 0, WIGGLE); + } + if (moved == 0) { + moved = this.doMagnet(level, living, -WIGGLE, WIGGLE); + } + if (moved == 0) { + moved = this.doMagnet(level, living, -WIGGLE, 0); + } + if (moved == 0) { + moved = this.doMagnet(level, living, -WIGGLE, -WIGGLE); + } + if (moved == 0) { + moved = this.doMagnet(level, living, 0, -WIGGLE); + } + if (moved == 0) { + moved = this.doMagnet(level, living, WIGGLE, -WIGGLE); + } + + if (moved > 0) { + stack.hurtAndBreak(moved, living, user -> user.broadcastBreakEvent(living.getUsedItemHand())); + level.playSound(null, living.getX(), living.getY(), living.getZ(), TFSounds.MAGNET_GRAB.get(), living.getSoundSource(), 1.0F, 1.0F); + } + } + } + + @Nonnull + @Override + public UseAnim getUseAnimation(ItemStack stack) { + return UseAnim.BOW; + } + + @Override + public int getUseDuration(ItemStack stack) { + return 72000; + } + + /** + * Magnet from the player's position and facing to the specified offset + */ + private int doMagnet(Level level, LivingEntity living, float yawOffset, float pitchOffset) { + // find vector 32 blocks from look + double range = 32.0D; + Vec3 srcVec = new Vec3(living.getX(), living.getY() + living.getEyeHeight(), living.getZ()); + Vec3 lookVec = getOffsetLook(living, yawOffset, pitchOffset); + Vec3 destVec = srcVec.add(lookVec.x() * range, lookVec.y() * range, lookVec.z() * range); + + return doMagnet(level, BlockPos.containing(srcVec), BlockPos.containing(destVec)); + } + + public static int doMagnet(Level level, BlockPos usePos, BlockPos destPos) { + // FIXME Find a better place to invoke this! + initOre2BlockMap(); + + int blocksMoved = 0; + + // find some ore? + BlockState attactedOreBlock = Blocks.AIR.defaultBlockState(); + BlockState replacementBlock = Blocks.AIR.defaultBlockState(); + BlockPos foundPos = null; + BlockPos basePos = null; + + for (BlockPos coord : new VoxelBresenhamIterator(usePos, destPos)) { + BlockState searchState = level.getBlockState(coord); + + // keep track of where the dirt/stone we first find is. + if (basePos == null) { + if (isReplaceable(searchState)) { + basePos = coord; + } + // This ordering is so that the base pos is found first before we pull ores - pushing ores away is a baaaaad idea! + } else if (foundPos == null && searchState.getBlock() != Blocks.AIR && isOre(searchState.getBlock()) && level.getBlockEntity(coord) == null) { + attactedOreBlock = searchState; + replacementBlock = ORE_TO_BLOCK_REPLACEMENTS.getOrDefault(attactedOreBlock.getBlock(), Blocks.STONE).defaultBlockState(); + foundPos = coord; + } + } + + if (basePos != null && foundPos != null && attactedOreBlock.getBlock() != Blocks.AIR) { + // find the whole vein + Set veinBlocks = new HashSet<>(); + findVein(level, foundPos, attactedOreBlock, veinBlocks); + + // move it up into minable blocks or dirt + int offX = basePos.getX() - foundPos.getX(); + int offY = basePos.getY() - foundPos.getY(); + int offZ = basePos.getZ() - foundPos.getZ(); + + for (BlockPos coord : veinBlocks) { + BlockPos replacePos = coord.offset(offX, offY, offZ); + BlockState replaceState = level.getBlockState(replacePos); + + if (isReplaceable(replaceState) || replaceState.getMaterial().isReplaceable() || replaceState.isAir()) { + level.setBlock(coord, replacementBlock, 2); + + // set close to ore material + level.setBlock(replacePos, attactedOreBlock, 2); + blocksMoved++; + } + } + } + + return blocksMoved; + } + + /** + * Get the player look vector, but offset by the specified parameters. We use to scan the area around where the player is looking + * in the likely case there's no ore in the exact look direction. + */ + private Vec3 getOffsetLook(LivingEntity living, float yawOffset, float pitchOffset) { + float var2 = Mth.cos(-(living.getYRot() + yawOffset) * 0.017453292F - (float) Math.PI); + float var3 = Mth.sin(-(living.getYRot() + yawOffset) * 0.017453292F - (float) Math.PI); + float var4 = -Mth.cos(-(living.getXRot() + pitchOffset) * 0.017453292F); + float var5 = Mth.sin(-(living.getXRot() + pitchOffset) * 0.017453292F); + return new Vec3(var3 * var4, var5, var2 * var4); + } + + @Deprecated + private static boolean isReplaceable(BlockState state) { + return state.is(BlockTagGenerator.ORE_MAGNET_SAFE_REPLACE_BLOCK); + } + + private static boolean findVein(Level level, BlockPos here, BlockState oreState, Set veinBlocks) { + // is this already on the list? + if (veinBlocks.contains(here)) { + return false; + } + + // let's limit it to 24 blocks at a time + if (veinBlocks.size() >= 24) { + return false; + } + + // otherwise, check if we're still in the vein + if (level.getBlockState(here) == oreState) { + veinBlocks.add(here); + + // recurse in 6 directions + for (Direction e : Direction.values()) { + findVein(level, here.relative(e), oreState, veinBlocks); + } + + return true; + } else { + return false; + } + } + + private static boolean isOre(Block ore) { + return ORE_TO_BLOCK_REPLACEMENTS.containsKey(ore); + } + + // So it looks like we can't really access BlockTag contents until Datapack loading is complete (see `buildOreMagnetCache` method below) + // Instead let's opt for only clearing that particular cache on reload, and lazy-init the map when the magnet is used + + // Switch over to ConcurrentHashMap if we run into any concurrency problems + private static boolean cacheNeedsBuild = true; + private static final HashMap ORE_TO_BLOCK_REPLACEMENTS = new HashMap<>(); + + private static void initOre2BlockMap() { + if (!cacheNeedsBuild) + return; + + TwilightForestMod.LOGGER.info("GENERATING ORE TO BLOCK MAPPING"); + + //collect all tags + for (TagKey tag : Objects.requireNonNull(ForgeRegistries.BLOCKS.tags()).getTagNames().filter(location -> location.location().getNamespace().equals("forge")).collect(Collectors.toList())) { + //check if the tag is a valid ore tag + if (tag.location().getPath().contains("ores_in_ground/")) { + //grab the part after the slash for use later + String oreground = tag.location().getPath().substring(15); + //check if a tag for ore grounds matches up with our ores in ground tag + if (Objects.requireNonNull(ForgeRegistries.BLOCKS.tags()).getTagNames().filter(location -> location.location().getNamespace().equals("forge")).anyMatch(blockTagKey -> blockTagKey.location().getPath().equals("ore_bearing_ground/" + oreground))) { + //add each ground type to each ore + Objects.requireNonNull(ForgeRegistries.BLOCKS.tags()).getTag(TagKey.create(Registries.BLOCK, new ResourceLocation("forge", "ore_bearing_ground/" + oreground))).forEach(ground -> + Objects.requireNonNull(ForgeRegistries.BLOCKS.tags()).getTag(tag).forEach(ore -> { + //exclude ignored ores + if (!ore.defaultBlockState().is(BlockTagGenerator.ORE_MAGNET_IGNORE)) { + ORE_TO_BLOCK_REPLACEMENTS.put(ore, ground); + } + })); + } + } + } + + cacheNeedsBuild = false; + } + + @SubscribeEvent + public static void buildOreMagnetCache(AddReloadListenerEvent event) { + event.addListener((stage, resourceManager, preparationsProfiler, reloadProfiler, backgroundExecutor, gameExecutor) -> { + if (!cacheNeedsBuild) { + ORE_TO_BLOCK_REPLACEMENTS.clear(); + cacheNeedsBuild = true; + } + + return stage.wait(null).thenRun(() -> { + }); // Nothing to do here + }); + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/item/OreMeterItem.java b/src/main/java/twilightforest/item/OreMeterItem.java new file mode 100644 index 0000000000..998f4ecc3c --- /dev/null +++ b/src/main/java/twilightforest/item/OreMeterItem.java @@ -0,0 +1,132 @@ +package twilightforest.item; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.network.chat.Component; +import net.minecraft.util.Mth; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import twilightforest.TwilightForestMod; +import twilightforest.init.TFBlocks; + +import javax.annotation.Nonnull; +import java.util.IdentityHashMap; +import java.util.Map; + +public class OreMeterItem extends Item { + + public OreMeterItem(Properties properties) { + super(properties); + } + + @Nonnull + @Override + public InteractionResultHolder use(Level level, Player player, @Nonnull InteractionHand hand) { + int useX = Mth.floor(player.getX()); + int useZ = Mth.floor(player.getZ()); + + if (!level.isClientSide()) { + this.countOreInArea(player, level, useX, useZ, 3); + } + + return InteractionResultHolder.sidedSuccess(player.getItemInHand(hand), level.isClientSide()); + } + + private void countOreInArea(Player player, Level world, int useX, int useZ, int radius) { + int chunkX = useX >> 4; + int chunkZ = useZ >> 4; + + int countStone = 0; + int countDirt = 0; + int countGravel = 0; + + int countCoal = 0; + int countIron = 0; + int countGold = 0; + int countDiamond = 0; + int countLapis = 0; + int countRedstone = 0; + int countCopper = 0; + int countExposedDiamond = 0; + + int countRoots = 0; + int countOreRoots = 0; + + int total; + + ScanResult dummy = new ScanResult(); + for (int cx = chunkX - radius; cx <= chunkX + radius; cx++) { + for (int cz = chunkZ - radius; cz <= chunkZ + radius; cz++) { + Map results = countBlocksInChunk(world, chunkX, chunkZ); + + countStone += results.entrySet().stream().filter(e -> e.getKey().getBlock() == Blocks.STONE).mapToInt(e -> e.getValue().count).sum(); + countDirt += results.entrySet().stream().filter(e -> e.getKey().getBlock() == Blocks.DIRT).mapToInt(e -> e.getValue().count).sum(); + countGravel += results.getOrDefault(Blocks.GRAVEL.defaultBlockState(), dummy).count; + + countCoal += results.getOrDefault(Blocks.COAL_ORE.defaultBlockState(), dummy).count; + countIron += results.getOrDefault(Blocks.IRON_ORE.defaultBlockState(), dummy).count; + countGold += results.getOrDefault(Blocks.GOLD_ORE.defaultBlockState(), dummy).count; + countDiamond += results.getOrDefault(Blocks.DIAMOND_ORE.defaultBlockState(), dummy).count; + countLapis += results.getOrDefault(Blocks.LAPIS_ORE.defaultBlockState(), dummy).count; + countRedstone += results.getOrDefault(Blocks.REDSTONE_ORE.defaultBlockState(), dummy).count; + countCopper += results.getOrDefault(Blocks.COPPER_ORE.defaultBlockState(), dummy).count; + countExposedDiamond += results.getOrDefault(Blocks.DIAMOND_ORE.defaultBlockState(), dummy).exposedCount; + + countRoots += results.getOrDefault(TFBlocks.ROOT_BLOCK.get().defaultBlockState(), dummy).count; + countOreRoots += results.getOrDefault(TFBlocks.LIVEROOT_BLOCK.get().defaultBlockState(), dummy).count; + } + } + + total = countStone + countDirt + countGravel + countCoal + countIron + countGold + countDiamond + countLapis + countRedstone + countCopper + countRoots + countOreRoots; + + player.sendSystemMessage(Component.translatable(this.getDescriptionId()).append("!")); + player.sendSystemMessage(Component.translatable("misc.twilightforest.ore_meter_range", radius, chunkX, chunkZ)); + player.sendSystemMessage(Component.translatable(Blocks.COAL_ORE.getDescriptionId()).append(" - " + countCoal + " " + percent(countCoal, total))); + player.sendSystemMessage(Component.translatable(Blocks.IRON_ORE.getDescriptionId()).append(" - " + countIron + " " + percent(countIron, total))); + player.sendSystemMessage(Component.translatable(Blocks.GOLD_ORE.getDescriptionId()).append(" - " + countGold + " " + percent(countGold, total))); + player.sendSystemMessage(Component.translatable(Blocks.DIAMOND_ORE.getDescriptionId()).append(" - " + countDiamond + " " + percent(countDiamond, total) + ", ").append(Component.translatable("misc.twilightforest.ore_meter_exposed", countExposedDiamond))); + player.sendSystemMessage(Component.translatable(Blocks.LAPIS_ORE.getDescriptionId()).append(" - " + countLapis + " " + percent(countLapis, total))); + player.sendSystemMessage(Component.translatable(Blocks.REDSTONE_ORE.getDescriptionId()).append(" - " + countRedstone + " " + percent(countRedstone, total))); + player.sendSystemMessage(Component.translatable(Blocks.COPPER_ORE.getDescriptionId()).append(" - " + countCopper + " " + percent(countCopper, total))); + player.sendSystemMessage(Component.translatable(TFBlocks.ROOT_BLOCK.get().getDescriptionId()).append(" - " + countRoots + " " + percent(countRoots, total))); + player.sendSystemMessage(Component.translatable(TFBlocks.LIVEROOT_BLOCK.get().getDescriptionId()).append(" - " + countOreRoots + " " + percent(countOreRoots, total))); + } + + private String percent(int count, int total) { + return (float) count / (float) total * 100F + "%"; + } + + private Map countBlocksInChunk(Level level, int cx, int cz) { + Map ret = new IdentityHashMap<>(); + BlockPos.MutableBlockPos pos = new BlockPos.MutableBlockPos(); + for (int x = cx << 4; x < (cx << 4) + 16; x++) { + for (int z = cz << 4; z < (cz << 4) + 16; z++) { + for (int y = 0; y < 256; y++) { + BlockState state = level.getBlockState(pos.set(x, y, z)); + ScanResult res = ret.computeIfAbsent(state, s -> new ScanResult()); + res.count++; + + for (Direction e : Direction.values()) { + if (level.isEmptyBlock(pos.set(x, y, z).move(e))) { + res.exposedCount++; + break; + } + } + } + } + } + + return ret; + } + + private static class ScanResult { + int count; + int exposedCount; + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/item/PeacockFanItem.java b/src/main/java/twilightforest/item/PeacockFanItem.java new file mode 100644 index 0000000000..373e8f72f3 --- /dev/null +++ b/src/main/java/twilightforest/item/PeacockFanItem.java @@ -0,0 +1,164 @@ +package twilightforest.item; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.entity.projectile.Projectile; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.UseAnim; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.AbstractCandleBlock; +import net.minecraft.world.level.block.FlowerBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.event.level.BlockEvent; +import net.minecraftforge.network.PacketDistributor; +import twilightforest.block.AbstractLightableBlock; +import twilightforest.block.AbstractSkullCandleBlock; +import twilightforest.capabilities.CapabilityList; +import twilightforest.capabilities.fan.FeatherFanFallCapability; +import twilightforest.init.TFSounds; +import twilightforest.network.TFPacketHandler; +import twilightforest.network.ThrowPlayerPacket; +import twilightforest.util.WorldUtil; + +import javax.annotation.Nonnull; + +public class PeacockFanItem extends Item { + + public PeacockFanItem(Properties properties) { + super(properties); + } + + @Nonnull + @Override + public InteractionResultHolder use(Level level, Player player, @Nonnull InteractionHand hand) { + ItemStack stack = player.getItemInHand(hand); + + boolean flag = !player.isOnGround() && !player.isSwimming() && !player.getCapability(CapabilityList.FEATHER_FAN_FALLING).map(FeatherFanFallCapability::getFalling).orElse(true); + + if (!level.isClientSide()) { + int fanned = this.doFan(level, player); + stack.hurtAndBreak(fanned + 1, player, (user) -> user.broadcastBreakEvent(hand)); + if (flag) player.getCapability(CapabilityList.FEATHER_FAN_FALLING).ifPresent(cap -> cap.setFalling(true)); + } else { + if (player.isFallFlying()) { + Vec3 look = player.getLookAngle(); + Vec3 movement = player.getDeltaMovement(); + //add a directional boost similar to the rocket, but slightly faster and always add a little more upwards + player.setDeltaMovement(movement.add( + look.x() * 0.1D + (look.x() * 2.0D - movement.x()) * 0.5D, + (look.y() * 0.1D + (look.y() * 2.0D - movement.y()) * 0.5D) + 1.25D, + look.z() * 0.1D + (look.z() * 2.0D - movement.z()) * 0.5D)); + } + // jump if the player is in the air + if (flag) { + player.setDeltaMovement(new Vec3( + player.getDeltaMovement().x() * 1.05F, + 1.5F, + player.getDeltaMovement().z() * 1.05F + )); + } else { + AABB fanBox = this.getEffectAABB(player); + Vec3 lookVec = player.getLookAngle(); + + // particle effect + for (int i = 0; i < 30; i++) { + level.addParticle(ParticleTypes.CLOUD, fanBox.minX + level.getRandom().nextFloat() * (fanBox.maxX - fanBox.minX), + fanBox.minY + level.getRandom().nextFloat() * (fanBox.maxY - fanBox.minY), + fanBox.minZ + level.getRandom().nextFloat() * (fanBox.maxZ - fanBox.minZ), + lookVec.x(), lookVec.y(), lookVec.z()); + } + } + player.playSound(TFSounds.FAN_WHOOSH.get(), 1.0F + level.getRandom().nextFloat(), level.getRandom().nextFloat() * 0.7F + 0.3F); + return new InteractionResultHolder<>(InteractionResult.SUCCESS, stack); + } + + player.startUsingItem(hand); + + return new InteractionResultHolder<>(InteractionResult.PASS, stack); + } + + @Nonnull + @Override + public UseAnim getUseAnimation(ItemStack stack) { + return UseAnim.BLOCK; + } + + @Override + public int getUseDuration(ItemStack stack) { + return 20; + } + + private int doFan(Level level, Player player) { + AABB fanBox = this.getEffectAABB(player); + return this.fanBlocksInAABB(level, fanBox, player) + this.fanEntitiesInAABB(level, player, fanBox); + } + + private int fanEntitiesInAABB(Level level, Player player, AABB fanBox) { + Vec3 moveVec = player.getLookAngle().scale(2); + Item fan = player.getUseItem().getItem(); + int fannedEntities = 0; + + for (Entity entity : level.getEntitiesOfClass(Entity.class, fanBox)) { + if (entity.isPushable() || entity instanceof ItemEntity || entity instanceof Projectile) { + entity.setDeltaMovement(moveVec.x(), moveVec.y(), moveVec.z()); + fannedEntities++; + } + + if (entity instanceof ServerPlayer pushedPlayer && pushedPlayer != player && !pushedPlayer.isShiftKeyDown()) { + TFPacketHandler.CHANNEL.send(PacketDistributor.PLAYER.with(() -> pushedPlayer), new ThrowPlayerPacket(moveVec.x(), moveVec.y(), moveVec.z())); + player.getCooldowns().addCooldown(fan, 40); + fannedEntities += 2; + } + } + return fannedEntities; + } + + private AABB getEffectAABB(Player player) { + double range = 3.0D; + double radius = 2.0D; + Vec3 srcVec = new Vec3(player.getX(), player.getY() + player.getEyeHeight(), player.getZ()); + Vec3 lookVec = player.getLookAngle().scale(range); + Vec3 destVec = srcVec.add(lookVec.x(), lookVec.y(), lookVec.z()); + + return new AABB(destVec.x() - radius, destVec.y() - radius, destVec.z() - radius, destVec.x() + radius, destVec.y() + radius, destVec.z() + radius); + } + + private int fanBlocksInAABB(Level level, AABB box, Player player) { + int fan = 0; + for (BlockPos pos : WorldUtil.getAllInBB(box)) { + fan += this.fanBlock(level, pos, player); + } + return fan; + } + + private int fanBlock(Level level, BlockPos pos, Player player) { + int cost = 0; + + BlockState state = level.getBlockState(pos); + if (state.getBlock() instanceof FlowerBlock) { + if (level.getRandom().nextInt(3) == 0) { + if (!MinecraftForge.EVENT_BUS.post(new BlockEvent.BreakEvent(level, pos, state, player))) { + level.destroyBlock(pos, true); + cost++; + } + } + } else if (state.getBlock() instanceof AbstractCandleBlock && state.getValue(AbstractCandleBlock.LIT)) { + AbstractCandleBlock.extinguish(null, state, level, pos); + } else if (state.getBlock() instanceof AbstractSkullCandleBlock && state.getValue(AbstractSkullCandleBlock.LIGHTING) != AbstractLightableBlock.Lighting.NONE) { + AbstractSkullCandleBlock.extinguish(null, state, level, pos); + } + + return cost; + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/item/PhantomArmorItem.java b/src/main/java/twilightforest/item/PhantomArmorItem.java new file mode 100644 index 0000000000..24a090635a --- /dev/null +++ b/src/main/java/twilightforest/item/PhantomArmorItem.java @@ -0,0 +1,91 @@ +package twilightforest.item; + +import net.minecraft.ChatFormatting; +import net.minecraft.client.Minecraft; +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.model.geom.EntityModelSet; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.network.chat.Style; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ArmorItem; +import net.minecraft.world.item.ArmorMaterial; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.item.enchantment.Enchantment; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.level.Level; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.client.extensions.common.IClientItemExtensions; +import net.minecraftforge.registries.ForgeRegistries; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import twilightforest.TwilightForestMod; +import twilightforest.client.model.TFModelLayers; +import twilightforest.client.model.armor.TFArmorModel; +import twilightforest.data.tags.CustomTagGenerator; + +import java.util.List; +import java.util.Objects; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.function.Consumer; + +public class PhantomArmorItem extends ArmorItem { + private static final MutableComponent TOOLTIP = Component.translatable("item.twilightforest.phantom_armor.desc").setStyle(Style.EMPTY.withColor(ChatFormatting.GRAY)); + + public PhantomArmorItem(ArmorMaterial material, Type type, Properties properties) { + super(material, type, properties); + } + + @Override + public String getArmorTexture(ItemStack stack, Entity entity, EquipmentSlot slot, String layer) { + // there's no legs, so let's not worry about them + return TwilightForestMod.ARMOR_DIR + "phantom_1.png"; + } + + @Override + public boolean canApplyAtEnchantingTable(ItemStack stack, Enchantment enchantment) { + return !ForgeRegistries.ENCHANTMENTS.tags().getTag(CustomTagGenerator.EnchantmentTagGenerator.PHANTOM_ARMOR_BANNED_ENCHANTS).contains(enchantment) && super.canApplyAtEnchantingTable(stack, enchantment); + } + + @Override + public boolean isBookEnchantable(ItemStack stack, ItemStack book) { + AtomicBoolean badEnchant = new AtomicBoolean(); + EnchantmentHelper.getEnchantments(book).forEach((enchantment, integer) -> { + for (Enchantment banned : ForgeRegistries.ENCHANTMENTS.tags().getTag(CustomTagGenerator.EnchantmentTagGenerator.PHANTOM_ARMOR_BANNED_ENCHANTS)) { + if (Objects.equals(banned, enchantment)) { + badEnchant.set(true); + break; + } + } + }); + + return !badEnchant.get(); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void appendHoverText(ItemStack stack, @Nullable Level level, List tooltip, TooltipFlag flag) { + tooltip.add(TOOLTIP); + } + + @Override + public void initializeClient(Consumer consumer) { + consumer.accept(ArmorRender.INSTANCE); + } + + private static final class ArmorRender implements IClientItemExtensions { + private static final ArmorRender INSTANCE = new ArmorRender(); + + @Override + public @NotNull HumanoidModel getHumanoidArmorModel(LivingEntity living, ItemStack stack, EquipmentSlot slot, HumanoidModel model) { + EntityModelSet models = Minecraft.getInstance().getEntityModels(); + ModelPart root = models.bakeLayer(slot == EquipmentSlot.LEGS ? TFModelLayers.PHANTOM_ARMOR_INNER : TFModelLayers.PHANTOM_ARMOR_OUTER); + return new TFArmorModel(root); + } + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/item/SeekerBowItem.java b/src/main/java/twilightforest/item/SeekerBowItem.java new file mode 100644 index 0000000000..73a823d331 --- /dev/null +++ b/src/main/java/twilightforest/item/SeekerBowItem.java @@ -0,0 +1,17 @@ +package twilightforest.item; + +import net.minecraft.world.entity.projectile.AbstractArrow; +import net.minecraft.world.item.BowItem; +import twilightforest.entity.projectile.SeekerArrow; + +public class SeekerBowItem extends BowItem { + + public SeekerBowItem(Properties properties) { + super(properties); + } + + @Override + public AbstractArrow customArrow(AbstractArrow arrow) { + return new SeekerArrow(arrow.getLevel(), arrow.getOwner()); + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/item/SkullCandleItem.java b/src/main/java/twilightforest/item/SkullCandleItem.java new file mode 100644 index 0000000000..e8caf2241b --- /dev/null +++ b/src/main/java/twilightforest/item/SkullCandleItem.java @@ -0,0 +1,127 @@ +package twilightforest.item; + +import com.mojang.authlib.GameProfile; +import net.minecraft.ChatFormatting; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtUtils; +import net.minecraft.network.chat.Component; +import net.minecraft.stats.Stats; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.StandingAndWallBlockItem; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; +import net.minecraftforge.common.capabilities.ICapabilityProvider; +import net.minecraftforge.fml.ModList; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.text.WordUtils; +import org.jetbrains.annotations.Nullable; +import twilightforest.block.AbstractSkullCandleBlock; +import twilightforest.block.entity.SkullCandleBlockEntity; +import twilightforest.compat.curios.CuriosCompat; +import twilightforest.init.TFBlocks; + +import java.util.List; + +public class SkullCandleItem extends StandingAndWallBlockItem { + + public SkullCandleItem(AbstractSkullCandleBlock floor, AbstractSkullCandleBlock wall, Properties properties) { + super(floor, wall, properties, Direction.DOWN); + } + + @Override + public void appendHoverText(ItemStack stack, @Nullable Level level, List tooltip, TooltipFlag flag) { + if (stack.hasTag()) { + CompoundTag tag = stack.getTagElement("BlockEntityTag"); + if (tag != null) { + if (tag.contains("CandleColor") && tag.contains("CandleAmount")) { + tooltip.add( + Component.translatable(tag.getInt("CandleAmount") > 1 ? + "item.twilightforest.skull_candle.desc.multiple" : + "item.twilightforest.skull_candle.desc", + String.valueOf(tag.getInt("CandleAmount")), + WordUtils.capitalize(AbstractSkullCandleBlock.CandleColors.colorFromInt(tag.getInt("CandleColor")).getSerializedName() + .replace("\"", "").replace("_", " "))) + .withStyle(ChatFormatting.GRAY)); + } + } + } + } + + @Override + public Component getName(ItemStack stack) { + if (stack.is(TFBlocks.PLAYER_SKULL_CANDLE.get().asItem()) && stack.hasTag()) { + String s = null; + CompoundTag compoundtag = stack.getTag(); + if (compoundtag != null && compoundtag.contains("SkullOwner", 8)) { + s = compoundtag.getString("SkullOwner"); + } else if (compoundtag != null && compoundtag.contains("SkullOwner", 10)) { + CompoundTag compoundtag1 = compoundtag.getCompound("SkullOwner"); + if (compoundtag1.contains("Name", 8)) { + s = compoundtag1.getString("Name"); + } + } + + if (s != null) { + return Component.translatable(this.getDescriptionId() + ".named", s); + } + } + + return super.getName(stack); + } + + @Override + public void verifyTagAfterLoad(CompoundTag tag) { + super.verifyTagAfterLoad(tag); + if (tag.contains("SkullOwner", 8) && !StringUtils.isBlank(tag.getString("SkullOwner"))) { + GameProfile gameprofile = new GameProfile(null, tag.getString("SkullOwner")); + SkullCandleBlockEntity.updateGameprofile(gameprofile, (p_151177_) -> { + tag.put("SkullOwner", NbtUtils.writeGameProfile(new CompoundTag(), p_151177_)); + }); + } + + } + + @Override + public InteractionResultHolder use(Level level, Player player, InteractionHand hand) { + ItemStack itemstack = player.getItemInHand(hand); + EquipmentSlot equipmentslot = Mob.getEquipmentSlotForItem(itemstack); + ItemStack itemstack1 = player.getItemBySlot(equipmentslot); + if (itemstack1.isEmpty()) { + player.setItemSlot(equipmentslot, itemstack.split(1)); + if (!level.isClientSide()) { + player.awardStat(Stats.ITEM_USED.get(this)); + } + + return InteractionResultHolder.sidedSuccess(itemstack, level.isClientSide()); + } else { + return InteractionResultHolder.fail(itemstack); + } + } + + @Override + public boolean canEquip(ItemStack stack, EquipmentSlot slot, Entity entity) { + return slot == EquipmentSlot.HEAD; + } + + @Override + @Nullable + public EquipmentSlot getEquipmentSlot(ItemStack stack) { + return EquipmentSlot.HEAD; + } + + @Nullable + @Override + public ICapabilityProvider initCapabilities(ItemStack stack, @Nullable CompoundTag tag) { + if (ModList.get().isLoaded("curios")) { + return CuriosCompat.setupCuriosCapability(stack); + } + return super.initCapabilities(stack, tag); + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/item/SteeleafArmorItem.java b/src/main/java/twilightforest/item/SteeleafArmorItem.java new file mode 100644 index 0000000000..d924862e71 --- /dev/null +++ b/src/main/java/twilightforest/item/SteeleafArmorItem.java @@ -0,0 +1,27 @@ +package twilightforest.item; + +import net.minecraft.core.NonNullList; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.item.ArmorItem; +import net.minecraft.world.item.ArmorMaterial; +import net.minecraft.world.item.CreativeModeTab; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.Enchantments; +import twilightforest.TwilightForestMod; + +public class SteeleafArmorItem extends ArmorItem { + + public SteeleafArmorItem(ArmorMaterial material, Type type, Properties properties) { + super(material, type, properties); + } + + @Override + public String getArmorTexture(ItemStack stack, Entity entity, EquipmentSlot slot, String layer) { + if (slot == EquipmentSlot.LEGS) { + return TwilightForestMod.ARMOR_DIR + "steeleaf_2.png"; + } else { + return TwilightForestMod.ARMOR_DIR + "steeleaf_1.png"; + } + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/item/TFItems.java b/src/main/java/twilightforest/item/TFItems.java deleted file mode 100644 index e00d29f017..0000000000 --- a/src/main/java/twilightforest/item/TFItems.java +++ /dev/null @@ -1,390 +0,0 @@ -package twilightforest.item; - -import net.minecraft.item.Item; -import net.minecraft.item.ItemArmor; -import net.minecraft.potion.Potion; -import net.minecraftforge.common.util.EnumHelper; -import twilightforest.TwilightForestMod; -import cpw.mods.fml.common.registry.GameRegistry; - -public class TFItems { - - public static ItemArmor.ArmorMaterial ARMOR_NAGA = EnumHelper.addArmorMaterial("NAGA_SCALE", 21, new int[] {2, 7, 6, 3}, 15); - public static ItemArmor.ArmorMaterial ARMOR_IRONWOOD = EnumHelper.addArmorMaterial("IRONWOOD", 20, new int[] {2, 7, 5, 2}, 15); - public static ItemArmor.ArmorMaterial ARMOR_FIERY = EnumHelper.addArmorMaterial("FIERY", 25, new int[] {4, 9, 7, 4}, 10); - public static ItemArmor.ArmorMaterial ARMOR_STEELEAF = EnumHelper.addArmorMaterial("STEELEAF", 10, new int[] {3, 8, 6, 3}, 9); - public static ItemArmor.ArmorMaterial ARMOR_KNIGHTLY = EnumHelper.addArmorMaterial("KNIGHTMETAL", 20, new int[] {3, 8, 6, 3}, 8); - public static ItemArmor.ArmorMaterial ARMOR_PHANTOM = EnumHelper.addArmorMaterial("KNIGHTPHANTOM", 30, new int[] {3, 8, 6, 3}, 8); - public static ItemArmor.ArmorMaterial ARMOR_YETI = EnumHelper.addArmorMaterial("YETI", 20, new int[] {4, 7, 6, 3}, 15); - public static ItemArmor.ArmorMaterial ARMOR_ARCTIC = EnumHelper.addArmorMaterial("ARCTIC", 10, new int[] {2, 7, 5, 2}, 8); - - - public static Item.ToolMaterial TOOL_IRONWOOD = EnumHelper.addToolMaterial("IRONWOOD", 2, 512, 6.5F, 2, 25); - public static Item.ToolMaterial TOOL_FIERY = EnumHelper.addToolMaterial("FIERY", 4, 1024, 9F, 4, 10); - public static Item.ToolMaterial TOOL_STEELEAF = EnumHelper.addToolMaterial("STEELEAF", 3, 131, 8.0F, 3, 9); - public static Item.ToolMaterial TOOL_KNIGHTLY = EnumHelper.addToolMaterial("KNIGHTMETAL", 3, 512, 8.0F, 3, 8); - public static Item.ToolMaterial TOOL_GIANT = EnumHelper.addToolMaterial("GIANTSTONE", 1, 1024, 4.0F, 1.0F, 5); - public static Item.ToolMaterial TOOL_ICE = EnumHelper.addToolMaterial("TFICE", 0, 32, 1.0F, 3.5F, 5); - public static Item.ToolMaterial TOOL_GLASS = EnumHelper.addToolMaterial("TFGLASS", 0, 1, 1.0F, 36.0F, 30); - - public static Item nagaScale; - public static Item plateNaga; - public static Item legsNaga; - public static Item scepterTwilight; - public static Item scepterLifeDrain; - public static Item scepterZombie; - public static Item wandPacification; - public static Item oreMeter; - public static Item magicMap; - public static Item mazeMap; - public static Item oreMap; - public static Item feather; - public static Item magicMapFocus; - public static Item mazeMapFocus; - public static Item liveRoot; - public static Item ironwoodRaw; - public static Item ironwoodIngot; - public static Item ironwoodHelm; - public static Item ironwoodPlate; - public static Item ironwoodLegs; - public static Item ironwoodBoots; - public static Item ironwoodSword; - public static Item ironwoodShovel; - public static Item ironwoodPick; - public static Item ironwoodAxe; - public static Item ironwoodHoe; - public static Item torchberries; - public static Item spawnEgg; - public static Item venisonRaw; - public static Item venisonCooked; - public static Item hydraChop; - public static Item fieryBlood; - public static Item trophy; - public static Item fieryIngot; - public static Item fieryHelm; - public static Item fieryPlate; - public static Item fieryLegs; - public static Item fieryBoots; - public static Item fierySword; - public static Item fieryPick; - public static Item steeleafIngot; - public static Item steeleafHelm; - public static Item steeleafPlate; - public static Item steeleafLegs; - public static Item steeleafBoots; - public static Item steeleafSword; - public static Item steeleafShovel; - public static Item steeleafPick; - public static Item steeleafAxe; - public static Item steeleafHoe; - public static Item minotaurAxe; - public static Item mazebreakerPick; - public static Item transformPowder; - public static Item meefRaw; - public static Item meefSteak; - public static Item meefStroganoff; - public static Item mazeWafer; - public static Item emptyMagicMap; - public static Item emptyMazeMap; - public static Item emptyOreMap; - public static Item oreMagnet; - public static Item crumbleHorn; - public static Item peacockFan; - public static Item moonwormQueen; - public static Item charmOfLife1; - public static Item charmOfLife2; - public static Item charmOfKeeping1; - public static Item charmOfKeeping2; - public static Item charmOfKeeping3; - public static Item towerKey; - public static Item borerEssence; - public static Item carminite; - public static Item experiment115; - public static Item armorShard; - public static Item knightMetal; - public static Item shardCluster; - public static Item knightlyHelm; - public static Item knightlyPlate; - public static Item knightlyLegs; - public static Item knightlyBoots; - public static Item knightlySword; - public static Item knightlyPick; - public static Item knightlyAxe; - public static Item phantomHelm; - public static Item phantomPlate; - public static Item lampOfCinders; - public static Item fieryTears; - public static Item alphaFur; - public static Item yetiHelm; - public static Item yetiPlate; - public static Item yetiLegs; - public static Item yetiBoots; - public static Item iceBomb; - public static Item arcticFur; - public static Item arcticHelm; - public static Item arcticPlate; - public static Item arcticLegs; - public static Item arcticBoots; - public static Item magicBeans; - public static Item giantPick; - public static Item giantSword; - public static Item tripleBow; - public static Item seekerBow; - public static Item iceBow; - public static Item enderBow; - public static Item iceSword; - public static Item glassSword; - public static Item knightmetalRing; - public static Item chainBlock; - public static Item cubeTalisman; - public static Item cubeOfAnnihilation; - - public static CreativeTabTwilightForest creativeTab = new CreativeTabTwilightForest("twilightForest"); - - public static void registerItems() - { - int nagaScaleRenderID = TwilightForestMod.proxy.registerArmorRenderID("twilightforest/nagascale_"); // the prefix doesn't seem to matter - int ironwoodRenderID = TwilightForestMod.proxy.registerArmorRenderID("twilightforest/ironwood_"); // the prefix doesn't seem to matter - int fieryRenderID = TwilightForestMod.proxy.registerArmorRenderID("twilightforest/fiery_"); // the prefix doesn't seem to matter - int steeleafRenderID = TwilightForestMod.proxy.registerArmorRenderID("twilightforest/steeleaf_"); // the prefix doesn't seem to matter - int knightlyRenderID = TwilightForestMod.proxy.registerArmorRenderID("twilightforest/knightly_"); // the prefix doesn't seem to matter - int phantomRenderID = TwilightForestMod.proxy.registerArmorRenderID("twilightforest/phantom_"); // the prefix doesn't seem to matter - int yetiRenderID = TwilightForestMod.proxy.registerArmorRenderID("twilightforest/yeti_"); // the prefix doesn't seem to matter - int arcticRenderID = TwilightForestMod.proxy.registerArmorRenderID("twilightforest/arctic_"); // the prefix doesn't seem to matter - - nagaScale = new ItemTF().setUnlocalizedName("nagaScale"); - plateNaga = new ItemTFNagaArmor(ARMOR_NAGA, nagaScaleRenderID, 1).setUnlocalizedName("plateNaga").setMaxStackSize(1); - legsNaga = new ItemTFNagaArmor(ARMOR_NAGA, nagaScaleRenderID, 2).setUnlocalizedName("legsNaga").setMaxStackSize(1); - scepterTwilight = new ItemTFTwilightWand().setUnlocalizedName("scepterTwilight").setMaxStackSize(1).setFull3D(); - scepterLifeDrain = new ItemTFScepterLifeDrain().setUnlocalizedName("scepterLifeDrain").setMaxStackSize(1).setFull3D(); - scepterZombie = new ItemTFZombieWand().setUnlocalizedName("scepterZombie").setMaxStackSize(1).setFull3D(); - //wandPacification = new ItemTF().setIconIndex(6).setUnlocalizedName("wandPacification").setMaxStackSize(1).setFull3D(); - oreMeter = new ItemTFOreMeter().setUnlocalizedName("oreMeter").setMaxStackSize(1); - magicMap = new ItemTFMagicMap().setUnlocalizedName("magicMap").setMaxStackSize(1); - mazeMap = new ItemTFMazeMap(false).setUnlocalizedName("mazeMap").setMaxStackSize(1); - oreMap = new ItemTFMazeMap(true).setUnlocalizedName("oreMap").setMaxStackSize(1); - feather = new ItemTF().setUnlocalizedName("tfFeather"); - magicMapFocus = new ItemTF().setUnlocalizedName("magicMapFocus"); - mazeMapFocus = new ItemTF().setUnlocalizedName("mazeMapFocus"); - liveRoot = new ItemTF().setUnlocalizedName("liveRoot"); - ironwoodRaw = new ItemTF().setUnlocalizedName("ironwoodRaw"); - ironwoodIngot = new ItemTF().setUnlocalizedName("ironwoodIngot"); - ironwoodHelm = new ItemTFIronwoodArmor(ARMOR_IRONWOOD, ironwoodRenderID, 0).setUnlocalizedName("ironwoodHelm").setMaxStackSize(1); - ironwoodPlate = new ItemTFIronwoodArmor(ARMOR_IRONWOOD, ironwoodRenderID, 1).setUnlocalizedName("ironwoodPlate").setMaxStackSize(1); - ironwoodLegs = new ItemTFIronwoodArmor(ARMOR_IRONWOOD, ironwoodRenderID, 2).setUnlocalizedName("ironwoodLegs").setMaxStackSize(1); - ironwoodBoots = new ItemTFIronwoodArmor(ARMOR_IRONWOOD, ironwoodRenderID, 3).setUnlocalizedName("ironwoodBoots").setMaxStackSize(1); - ironwoodSword = new ItemTFIronwoodSword(TOOL_IRONWOOD).setUnlocalizedName("ironwoodSword").setMaxStackSize(1); - ironwoodShovel = new ItemTFIronwoodShovel(TOOL_IRONWOOD).setUnlocalizedName("ironwoodShovel").setMaxStackSize(1); - ironwoodPick = new ItemTFIronwoodPick(TOOL_IRONWOOD).setUnlocalizedName("ironwoodPick").setMaxStackSize(1); - ironwoodAxe = new ItemTFIronwoodAxe(TOOL_IRONWOOD).setUnlocalizedName("ironwoodAxe").setMaxStackSize(1); - ironwoodHoe = new ItemTFIronwoodHoe(TOOL_IRONWOOD).setUnlocalizedName("ironwoodHoe").setMaxStackSize(1); - torchberries = new ItemTF().setUnlocalizedName("torchberries"); - spawnEgg = new ItemTFSpawnEgg().setUnlocalizedName("tfspawnegg"); - venisonRaw = (new ItemTFFood(3, 0.3F, true)).setUnlocalizedName("venisonRaw"); - venisonCooked = (new ItemTFFood(8, 0.8F, true)).setUnlocalizedName("venisonCooked"); - hydraChop = (new ItemTFHydraChops(18, 2.0F, true)).setPotionEffect(Potion.regeneration.id, 5, 0, 1.0F).setUnlocalizedName("hydraChop"); - fieryBlood = new ItemTF().makeRare().setUnlocalizedName("fieryBlood"); - trophy = new ItemTFTrophy().setUnlocalizedName("trophy"); - fieryIngot = new ItemTF().makeRare().setUnlocalizedName("fieryIngot"); - fieryHelm = new ItemTFFieryArmor(ARMOR_FIERY, fieryRenderID, 0).setUnlocalizedName("fieryHelm").setMaxStackSize(1); - fieryPlate = new ItemTFFieryArmor(ARMOR_FIERY, fieryRenderID, 1).setUnlocalizedName("fieryPlate").setMaxStackSize(1); - fieryLegs = new ItemTFFieryArmor(ARMOR_FIERY, fieryRenderID, 2).setUnlocalizedName("fieryLegs").setMaxStackSize(1); - fieryBoots = new ItemTFFieryArmor(ARMOR_FIERY, fieryRenderID, 3).setUnlocalizedName("fieryBoots").setMaxStackSize(1); - fierySword = new ItemTFFierySword(TOOL_FIERY).setUnlocalizedName("fierySword").setMaxStackSize(1); - fieryPick = new ItemTFFieryPick(TOOL_FIERY).setUnlocalizedName("fieryPick").setMaxStackSize(1); - steeleafIngot = new ItemTF().setUnlocalizedName("steeleafIngot"); - steeleafHelm = new ItemTFSteeleafArmor(ARMOR_IRONWOOD, steeleafRenderID, 0).setUnlocalizedName("steeleafHelm").setMaxStackSize(1); - steeleafPlate = new ItemTFSteeleafArmor(ARMOR_IRONWOOD, steeleafRenderID, 1).setUnlocalizedName("steeleafPlate").setMaxStackSize(1); - steeleafLegs = new ItemTFSteeleafArmor(ARMOR_IRONWOOD, steeleafRenderID, 2).setUnlocalizedName("steeleafLegs").setMaxStackSize(1); - steeleafBoots = new ItemTFSteeleafArmor(ARMOR_IRONWOOD, steeleafRenderID, 3).setUnlocalizedName("steeleafBoots").setMaxStackSize(1); - steeleafSword = new ItemTFSteeleafSword(TOOL_STEELEAF).setUnlocalizedName("steeleafSword").setMaxStackSize(1); - steeleafShovel = new ItemTFSteeleafShovel(TOOL_STEELEAF).setUnlocalizedName("steeleafShovel").setMaxStackSize(1); - steeleafPick = new ItemTFSteeleafPick(TOOL_STEELEAF).setUnlocalizedName("steeleafPick").setMaxStackSize(1); - steeleafAxe = new ItemTFSteeleafAxe(TOOL_STEELEAF).setUnlocalizedName("steeleafAxe").setMaxStackSize(1); - steeleafHoe = new ItemTFSteeleafHoe(TOOL_STEELEAF).setUnlocalizedName("steeleafHoe").setMaxStackSize(1); - minotaurAxe = new ItemTFMinotaurAxe(Item.ToolMaterial.EMERALD).setUnlocalizedName("minotaurAxe").setMaxStackSize(1); - mazebreakerPick = new ItemTFMazebreakerPick(Item.ToolMaterial.EMERALD).setUnlocalizedName("mazebreakerPick").setMaxStackSize(1); - transformPowder = new ItemTFTransformPowder().makeRare().setUnlocalizedName("transformPowder"); - meefRaw = (new ItemTFFood(2, 0.3F, true)).setUnlocalizedName("meefRaw"); - meefSteak = (new ItemTFFood(6, 0.6F, true)).setUnlocalizedName("meefSteak"); - meefStroganoff = (new ItemTFFood(8)).setUnlocalizedName("meefStroganoff"); - mazeWafer = (new ItemTFFood(4, 0.6F, false)).setUnlocalizedName("mazeWafer"); - emptyMagicMap = (new ItemTFEmptyMagicMap()).setUnlocalizedName("emptyMagicMap"); - emptyMazeMap = (new ItemTFEmptyMazeMap(false)).setUnlocalizedName("emptyMazeMap"); - emptyOreMap = (new ItemTFEmptyMazeMap(true)).setUnlocalizedName("emptyOreMap"); - oreMagnet = (new ItemTFOreMagnet()).setUnlocalizedName("oreMagnet"); - crumbleHorn = (new ItemTFCrumbleHorn()).setUnlocalizedName("crumbleHorn"); - peacockFan = (new ItemTFPeacockFan()).setUnlocalizedName("peacockFan"); - moonwormQueen = (new ItemTFMoonwormQueen()).setUnlocalizedName("moonwormQueen"); - charmOfLife1 = new ItemTFCharm().setUnlocalizedName("charmOfLife1"); - charmOfLife2 = new ItemTFCharm().setUnlocalizedName("charmOfLife2"); - charmOfKeeping1 = new ItemTFCharm().setUnlocalizedName("charmOfKeeping1"); - charmOfKeeping2 = new ItemTFCharm().setUnlocalizedName("charmOfKeeping2"); - charmOfKeeping3 = new ItemTFCharm().setUnlocalizedName("charmOfKeeping3"); - towerKey = new ItemTFTowerKey().setUnlocalizedName("towerKey"); - borerEssence = new ItemTF().setUnlocalizedName("borerEssence"); - carminite = new ItemTF().makeRare().setUnlocalizedName("carminite"); - experiment115 = (new ItemTFFood(4, 0.3F, false)).setUnlocalizedName("experiment115"); - armorShard = new ItemTF().setUnlocalizedName("armorShards"); - knightMetal = new ItemTF().setUnlocalizedName("knightMetal"); - shardCluster = new ItemTF().setUnlocalizedName("shardCluster"); - knightlyHelm = new ItemTFKnightlyArmor(ARMOR_KNIGHTLY, knightlyRenderID, 0).setUnlocalizedName("knightlyHelm").setMaxStackSize(1); - knightlyPlate = new ItemTFKnightlyArmor(ARMOR_KNIGHTLY, knightlyRenderID, 1).setUnlocalizedName("knightlyPlate").setMaxStackSize(1); - knightlyLegs = new ItemTFKnightlyArmor(ARMOR_KNIGHTLY, knightlyRenderID, 2).setUnlocalizedName("knightlyLegs").setMaxStackSize(1); - knightlyBoots = new ItemTFKnightlyArmor(ARMOR_KNIGHTLY, knightlyRenderID, 3).setUnlocalizedName("knightlyBoots").setMaxStackSize(1); - knightlySword = new ItemTFKnightlySword(TOOL_KNIGHTLY).setUnlocalizedName("knightlySword").setMaxStackSize(1); - knightlyPick = new ItemTFKnightlyPick(TOOL_KNIGHTLY).setUnlocalizedName("knightlyPick").setMaxStackSize(1); - knightlyAxe = new ItemTFKnightlyAxe(TOOL_KNIGHTLY).setUnlocalizedName("knightlyAxe").setMaxStackSize(1); - phantomHelm = new ItemTFPhantomArmor(ARMOR_PHANTOM, phantomRenderID, 0).setUnlocalizedName("phantomHelm").setMaxStackSize(1); - phantomPlate = new ItemTFPhantomArmor(ARMOR_PHANTOM, phantomRenderID, 1).setUnlocalizedName("phantomPlate").setMaxStackSize(1); - lampOfCinders = new ItemTFLampOfCinders().setUnlocalizedName("lampOfCinders"); - fieryTears = new ItemTF().makeRare().setUnlocalizedName("fieryTears"); - alphaFur = new ItemTF().makeRare().setUnlocalizedName("alphaFur"); - yetiHelm = new ItemTFYetiArmor(ARMOR_YETI, yetiRenderID, 0).setUnlocalizedName("yetiHelm").setMaxStackSize(1); - yetiPlate = new ItemTFYetiArmor(ARMOR_YETI, yetiRenderID, 1).setUnlocalizedName("yetiPlate").setMaxStackSize(1); - yetiLegs = new ItemTFYetiArmor(ARMOR_YETI, yetiRenderID, 2).setUnlocalizedName("yetiLegs").setMaxStackSize(1); - yetiBoots = new ItemTFYetiArmor(ARMOR_YETI, yetiRenderID, 3).setUnlocalizedName("yetiBoots").setMaxStackSize(1); - iceBomb = new ItemTFIceBomb().makeRare().setUnlocalizedName("iceBomb").setMaxStackSize(16); - arcticFur = new ItemTF().setUnlocalizedName("arcticFur"); - arcticHelm = new ItemTFArcticArmor(ARMOR_ARCTIC, arcticRenderID, 0).setUnlocalizedName("arcticHelm").setMaxStackSize(1); - arcticPlate = new ItemTFArcticArmor(ARMOR_ARCTIC, arcticRenderID, 1).setUnlocalizedName("arcticPlate").setMaxStackSize(1); - arcticLegs = new ItemTFArcticArmor(ARMOR_ARCTIC, arcticRenderID, 2).setUnlocalizedName("arcticLegs").setMaxStackSize(1); - arcticBoots = new ItemTFArcticArmor(ARMOR_ARCTIC, arcticRenderID, 3).setUnlocalizedName("arcticBoots").setMaxStackSize(1); - magicBeans = new ItemTFMagicBeans().setUnlocalizedName("magicBeans"); - giantPick = new ItemTFGiantPick(TOOL_GIANT).setUnlocalizedName("giantPick").setMaxStackSize(1); - giantSword = new ItemTFGiantSword(TOOL_GIANT).setUnlocalizedName("giantSword").setMaxStackSize(1); - tripleBow = new ItemTFTripleBow().setUnlocalizedName("tripleBow").setMaxStackSize(1); - seekerBow = new ItemTFSeekerBow().setUnlocalizedName("seekerBow").setMaxStackSize(1); - iceBow = new ItemTFIceBow().setUnlocalizedName("iceBow").setMaxStackSize(1); - enderBow = new ItemTFEnderBow().setUnlocalizedName("enderBow").setMaxStackSize(1); - iceSword = new ItemTFIceSword(TOOL_ICE).setUnlocalizedName("iceSword").setMaxStackSize(1); - glassSword = new ItemTFGlassSword(TOOL_GLASS).setUnlocalizedName("glassSword").setMaxStackSize(1); - knightmetalRing = new ItemTF().setUnlocalizedName("knightmetalRing"); - chainBlock = new ItemTFChainBlock().setUnlocalizedName("chainBlock").setMaxStackSize(1); - cubeTalisman = new ItemTF().setUnlocalizedName("cubeTalisman"); - cubeOfAnnihilation = new ItemTFCubeOfAnnihilation().setUnlocalizedName("cubeOfAnnihilation").setMaxStackSize(1); - - registerTFItem(nagaScale, "Naga Scale"); - registerTFItem(plateNaga, "Naga Scale Tunic"); - registerTFItem(legsNaga, "Naga Scale Leggings"); - registerTFItem(scepterTwilight, "Scepter of Twilight"); - registerTFItem(scepterLifeDrain, "Scepter of Life Draining"); - registerTFItem(scepterZombie, "Zombie Scepter"); - //registerTFItem(wandPacification, "Wand of Pacification [NYI]"); - registerTFItem(oreMeter, "Ore Meter [WIP]"); - registerTFItem(magicMap, "Magic Map"); - registerTFItem(mazeMap, "Maze Map"); - registerTFItem(oreMap, "Maze/Ore Map"); - registerTFItem(feather, "Raven's Feather"); - registerTFItem(magicMapFocus, "Magic Map Focus"); - registerTFItem(mazeMapFocus, "Maze Map Focus"); - registerTFItem(liveRoot, "Liveroot"); - registerTFItem(ironwoodRaw, "Raw Ironwood Materials"); - registerTFItem(ironwoodIngot, "Ironwood Ingot"); - registerTFItem(ironwoodHelm, "Ironwood Helm"); - registerTFItem(ironwoodPlate, "Ironwood Plate"); - registerTFItem(ironwoodLegs, "Ironwood Legs"); - registerTFItem(ironwoodBoots, "Ironwood Boots"); - registerTFItem(ironwoodSword, "Ironwood Sword"); - registerTFItem(ironwoodShovel, "Ironwood Shovel"); - registerTFItem(ironwoodPick, "Ironwood Pick"); - registerTFItem(ironwoodAxe, "Ironwood Axe"); - registerTFItem(ironwoodHoe, "Ironwood Hoe"); - registerTFItem(torchberries, "Torchberries"); - registerTFItem(venisonRaw, "Raw Venison"); - registerTFItem(venisonCooked, "Venison Steak"); - registerTFItem(hydraChop, "Hydra Chop"); - registerTFItem(fieryBlood, "Fiery Blood"); - registerTFItem(trophy, "Hydra Trophy"); - registerTFItem(fieryIngot, "Fiery Ingot"); - registerTFItem(fieryHelm, "Fiery Helm"); - registerTFItem(fieryPlate, "Fiery Plate"); - registerTFItem(fieryLegs, "Fiery Legs"); - registerTFItem(fieryBoots, "Fiery Boots"); - registerTFItem(fierySword, "Fiery Sword"); - registerTFItem(fieryPick, "Fiery Pick"); - registerTFItem(steeleafIngot, "Steeleaf"); - registerTFItem(steeleafHelm, "Steeleaf Helm"); - registerTFItem(steeleafPlate, "Steeleaf Plate"); - registerTFItem(steeleafLegs, "Steeleaf Legs"); - registerTFItem(steeleafBoots, "Steeleaf Boots"); - registerTFItem(steeleafSword, "Steeleaf Sword"); - registerTFItem(steeleafShovel, "Steeleaf Shovel"); - registerTFItem(steeleafPick, "Steeleaf Pick"); - registerTFItem(steeleafAxe, "Steeleaf Axe"); - registerTFItem(steeleafHoe, "Steeleaf Hoe"); - registerTFItem(minotaurAxe, "Minotaur Axe"); - registerTFItem(mazebreakerPick, "Mazebreaker"); - registerTFItem(transformPowder, "Transformation Powder"); - registerTFItem(meefRaw, "Raw Meef"); - registerTFItem(meefSteak, "Meef Steak"); - registerTFItem(meefStroganoff, "Meef Stroganoff"); - registerTFItem(mazeWafer, "Maze Wafer"); - registerTFItem(emptyMagicMap, "Blank Magic Map"); - registerTFItem(emptyMazeMap, "Blank Maze Map"); - registerTFItem(emptyOreMap, "Blank Maze/Ore Map"); - registerTFItem(oreMagnet, "Ore Magnet"); - registerTFItem(crumbleHorn, "Crumble Horn"); - registerTFItem(peacockFan, "Peacock Feather Fan"); - registerTFItem(moonwormQueen, "Moonworm Queen"); - registerTFItem(charmOfLife1, "Charm of Life I"); - registerTFItem(charmOfLife2, "Charm of Life II"); - registerTFItem(charmOfKeeping1, "Charm of Keeping I"); - registerTFItem(charmOfKeeping2, "Charm of Keeping II"); - registerTFItem(charmOfKeeping3, "Charm of Keeping III"); - registerTFItem(towerKey, "Tower Key"); - registerTFItem(borerEssence, "Borer Essence"); - registerTFItem(carminite, "Carminite"); - registerTFItem(experiment115, "Experiment 115"); - registerTFItem(armorShard, "Armor Shards"); - registerTFItem(knightMetal, "Knightmetal Ingot"); - registerTFItem(shardCluster, "Shard Cluster"); - registerTFItem(knightlyHelm, "Knightly Helm"); - registerTFItem(knightlyPlate, "Knightly Plate"); - registerTFItem(knightlyLegs, "Knightly Legs"); - registerTFItem(knightlyBoots, "Knightly Boots"); - registerTFItem(knightlySword, "Knightly Sword"); - registerTFItem(knightlyPick, "Knightly Pick"); - registerTFItem(knightlyAxe, "Knightly Axe"); - registerTFItem(phantomHelm, "Phantom Helm"); - registerTFItem(phantomPlate, "Phantom Plate"); - registerTFItem(lampOfCinders); - registerTFItem(fieryTears); - registerTFItem(alphaFur); - registerTFItem(yetiHelm); - registerTFItem(yetiPlate); - registerTFItem(yetiLegs); - registerTFItem(yetiBoots); - registerTFItem(iceBomb); - registerTFItem(arcticFur); - registerTFItem(arcticHelm); - registerTFItem(arcticPlate); - registerTFItem(arcticLegs); - registerTFItem(arcticBoots); - registerTFItem(magicBeans); - registerTFItem(giantPick); - registerTFItem(giantSword); - registerTFItem(tripleBow); - registerTFItem(seekerBow); - registerTFItem(iceBow); - registerTFItem(enderBow); - registerTFItem(iceSword); - registerTFItem(glassSword); - registerTFItem(knightmetalRing); - registerTFItem(chainBlock); - registerTFItem(cubeTalisman); - registerTFItem(cubeOfAnnihilation); - - registerTFItem(spawnEgg, "Spawn"); - } - - private static void registerTFItem(Item item, String englishName) { - //LanguageRegistry.instance().addNameForObject(item, "en_US", englishName); - GameRegistry.registerItem(item, item.getUnlocalizedName(), TwilightForestMod.ID); - } - - private static void registerTFItem(Item item) { - GameRegistry.registerItem(item, item.getUnlocalizedName(), TwilightForestMod.ID); - } - -} diff --git a/src/main/java/twilightforest/item/TFMapCloningRecipe.java b/src/main/java/twilightforest/item/TFMapCloningRecipe.java deleted file mode 100644 index a79af9ef89..0000000000 --- a/src/main/java/twilightforest/item/TFMapCloningRecipe.java +++ /dev/null @@ -1,126 +0,0 @@ -package twilightforest.item; - -import net.minecraft.inventory.InventoryCrafting; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.IRecipe; -import net.minecraft.world.World; - -public class TFMapCloningRecipe implements IRecipe -{ - public Item fullMapID; - public Item blankMapID; - - public TFMapCloningRecipe(Item magicMap, Item emptyMagicMap) - { - this.fullMapID = magicMap; - this.blankMapID = emptyMagicMap; - } - - /** - * Used to check if a recipe matches current crafting inventory - */ - @Override - public boolean matches(InventoryCrafting par1InventoryCrafting, World par2World) - { - int var3 = 0; - ItemStack var4 = null; - - for (int var5 = 0; var5 < par1InventoryCrafting.getSizeInventory(); ++var5) - { - ItemStack var6 = par1InventoryCrafting.getStackInSlot(var5); - - if (var6 != null) - { - if (var6.getItem() == this.fullMapID) - { - if (var4 != null) - { - return false; - } - - var4 = var6; - } - else - { - if (var6.getItem() != this.blankMapID) - { - return false; - } - - ++var3; - } - } - } - - return var4 != null && var3 > 0; - } - - /** - * Returns an Item that is the result of this recipe - */ - @Override - public ItemStack getCraftingResult(InventoryCrafting par1InventoryCrafting) - { - int var2 = 0; - ItemStack var3 = null; - - for (int var4 = 0; var4 < par1InventoryCrafting.getSizeInventory(); ++var4) - { - ItemStack var5 = par1InventoryCrafting.getStackInSlot(var4); - - if (var5 != null) - { - if (var5.getItem() == this.fullMapID) - { - if (var3 != null) - { - return null; - } - - var3 = var5; - } - else - { - if (var5.getItem() != this.blankMapID) - { - return null; - } - - ++var2; - } - } - } - - if (var3 != null && var2 >= 1) - { - ItemStack var6 = new ItemStack(this.fullMapID, var2 + 1, var3.getItemDamage()); - - if (var3.hasDisplayName()) - { - var6.setStackDisplayName(var3.getDisplayName()); - } - - return var6; - } - else - { - return null; - } - } - - /** - * Returns the size of the recipe area - */ - @Override - public int getRecipeSize() - { - return 9; - } - - @Override - public ItemStack getRecipeOutput() - { - return null; - } -} diff --git a/src/main/java/twilightforest/item/TFRecipes.java b/src/main/java/twilightforest/item/TFRecipes.java deleted file mode 100644 index 09e60dc46b..0000000000 --- a/src/main/java/twilightforest/item/TFRecipes.java +++ /dev/null @@ -1,222 +0,0 @@ -package twilightforest.item; - - -import static net.minecraftforge.oredict.RecipeSorter.Category.SHAPELESS; -import net.minecraft.enchantment.Enchantment; -import net.minecraft.init.Blocks; -import net.minecraft.init.Items; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraftforge.oredict.OreDictionary; -import net.minecraftforge.oredict.RecipeSorter; -import twilightforest.TwilightForestMod; -import twilightforest.block.BlockTFFireJet; -import twilightforest.block.BlockTFPlant; -import twilightforest.block.BlockTFTowerDevice; -import twilightforest.block.TFBlocks; -import twilightforest.enchantment.TFEnchantment; -import cpw.mods.fml.common.registry.GameRegistry; - - -public class TFRecipes { - - public static void registerRecipes() { - - // ore dictionary - OreDictionary.registerOre("logWood", new ItemStack(TFBlocks.log, 1, OreDictionary.WILDCARD_VALUE)); - OreDictionary.registerOre("logWood", new ItemStack(TFBlocks.magicLog, 1, OreDictionary.WILDCARD_VALUE)); - OreDictionary.registerOre("treeSapling", new ItemStack(TFBlocks.sapling, 1, OreDictionary.WILDCARD_VALUE)); - OreDictionary.registerOre("treeLeaves", new ItemStack(TFBlocks.leaves, 1, OreDictionary.WILDCARD_VALUE)); - OreDictionary.registerOre("treeLeaves", new ItemStack(TFBlocks.magicLeaves, 1, OreDictionary.WILDCARD_VALUE)); - OreDictionary.registerOre("plankWood", new ItemStack(TFBlocks.towerWood, 1, OreDictionary.WILDCARD_VALUE)); - - // register my ores, just for fun - OreDictionary.registerOre("ingotFiery", new ItemStack(TFItems.fieryIngot)); - OreDictionary.registerOre("oreIronwood", new ItemStack(TFItems.ironwoodRaw)); - OreDictionary.registerOre("ingotIronwood", new ItemStack(TFItems.ironwoodIngot)); - OreDictionary.registerOre("ingotSteeleaf", new ItemStack(TFItems.steeleafIngot)); - OreDictionary.registerOre("oreKnightmetal", new ItemStack(TFItems.shardCluster)); - OreDictionary.registerOre("ingotKnightmetal", new ItemStack(TFItems.knightMetal)); - - // recipe sorter - RecipeSorter.register(TwilightForestMod.ID + ":mapcloning", TFMapCloningRecipe.class, SHAPELESS, "after:minecraft:shapeless"); - - // smelting for logs - GameRegistry.addSmelting(TFBlocks.log, new ItemStack(Items.coal, 1, 1), 0.1F); - GameRegistry.addSmelting(TFBlocks.magicLog, new ItemStack(Items.coal, 1, 1), 0.1F); - - // recipes - GameRegistry.addRecipe(new ItemStack(Blocks.planks, 4, 0), new Object[] {"w", 'w', new ItemStack(TFBlocks.log, 1, 0)}); - GameRegistry.addRecipe(new ItemStack(Blocks.planks, 4, 1), new Object[] {"w", 'w', new ItemStack(TFBlocks.log, 1, 1)}); - GameRegistry.addRecipe(new ItemStack(Blocks.planks, 4, 2), new Object[] {"w", 'w', new ItemStack(TFBlocks.log, 1, 2)}); - GameRegistry.addRecipe(new ItemStack(Blocks.planks, 4, 1), new Object[] {"w", 'w', new ItemStack(TFBlocks.log, 1, 3)}); - - addEnchantedRecipe(TFItems.plateNaga, Enchantment.fireProtection, 3, new Object[] {"# #", "###", "###", '#', TFItems.nagaScale}); - addEnchantedRecipe(TFItems.legsNaga, Enchantment.protection, 3, new Object[] {"###", "# #", "# #", '#', TFItems.nagaScale}); - - GameRegistry.addShapelessRecipe(new ItemStack(TFBlocks.fireflyJar, 1, 0), new Object[] {TFBlocks.firefly, Items.glass_bottle}); - - GameRegistry.addShapelessRecipe(new ItemStack(TFItems.scepterTwilight), new Object[] {new ItemStack(TFItems.scepterTwilight, 1, TFItems.scepterTwilight.getMaxDamage()), Items.ender_pearl}); - GameRegistry.addShapelessRecipe(new ItemStack(TFItems.scepterLifeDrain), new Object[] {new ItemStack(TFItems.scepterLifeDrain, 1, TFItems.scepterLifeDrain.getMaxDamage()), Items.fermented_spider_eye}); - // aah, why are there so many potions of strength - GameRegistry.addShapelessRecipe(new ItemStack(TFItems.scepterZombie), new Object[] {new ItemStack(TFItems.scepterZombie, 1, TFItems.scepterZombie.getMaxDamage()), new ItemStack(Items.rotten_flesh), new ItemStack(Items.potionitem, 1, 16281)}); - GameRegistry.addShapelessRecipe(new ItemStack(TFItems.scepterZombie), new Object[] {new ItemStack(TFItems.scepterZombie, 1, TFItems.scepterZombie.getMaxDamage()), new ItemStack(Items.rotten_flesh), new ItemStack(Items.potionitem, 1, 16313)}); - GameRegistry.addShapelessRecipe(new ItemStack(TFItems.scepterZombie), new Object[] {new ItemStack(TFItems.scepterZombie, 1, TFItems.scepterZombie.getMaxDamage()), new ItemStack(Items.rotten_flesh), new ItemStack(Items.potionitem, 1, 16345)}); - GameRegistry.addShapelessRecipe(new ItemStack(TFItems.scepterZombie), new Object[] {new ItemStack(TFItems.scepterZombie, 1, TFItems.scepterZombie.getMaxDamage()), new ItemStack(Items.rotten_flesh), new ItemStack(Items.potionitem, 1, 16377)}); - GameRegistry.addShapelessRecipe(new ItemStack(TFItems.scepterZombie), new Object[] {new ItemStack(TFItems.scepterZombie, 1, TFItems.scepterZombie.getMaxDamage()), new ItemStack(Items.rotten_flesh), new ItemStack(Items.potionitem, 1, 8201)}); - GameRegistry.addShapelessRecipe(new ItemStack(TFItems.scepterZombie), new Object[] {new ItemStack(TFItems.scepterZombie, 1, TFItems.scepterZombie.getMaxDamage()), new ItemStack(Items.rotten_flesh), new ItemStack(Items.potionitem, 1, 8265)}); - GameRegistry.addShapelessRecipe(new ItemStack(TFItems.scepterZombie), new Object[] {new ItemStack(TFItems.scepterZombie, 1, TFItems.scepterZombie.getMaxDamage()), new ItemStack(Items.rotten_flesh), new ItemStack(Items.potionitem, 1, 8233)}); - - GameRegistry.addShapelessRecipe(new ItemStack(TFItems.magicMapFocus), new Object[] {TFItems.feather, TFItems.torchberries, Items.glowstone_dust}); - GameRegistry.addRecipe(new ItemStack(TFItems.emptyMagicMap), new Object[] {"###", "#X#", "###", '#', Items.paper, 'X', TFItems.magicMapFocus}); - GameRegistry.addRecipe(new ItemStack(TFItems.emptyMazeMap), new Object[] {"###", "#X#", "###", '#', Items.paper, 'X', TFItems.mazeMapFocus}); - GameRegistry.addShapelessRecipe(new ItemStack(TFItems.emptyOreMap), new Object[] {new ItemStack(TFItems.mazeMap, 1, Short.MAX_VALUE), Blocks.gold_block, Blocks.diamond_block, Blocks.iron_block}); - GameRegistry.addShapelessRecipe(new ItemStack(TFItems.emptyOreMap), new Object[] {new ItemStack(TFItems.emptyMazeMap, 1, Short.MAX_VALUE), Blocks.gold_block, Blocks.diamond_block, Blocks.iron_block}); - - GameRegistry.addRecipe(new ItemStack(Items.arrow, 4), new Object[] {"X", "#", "Y", 'Y', TFItems.feather, 'X', Items.flint, '#', Items.stick}); - - GameRegistry.addShapelessRecipe(new ItemStack(Items.stick), new Object[] {new ItemStack(TFBlocks.plant, 1, BlockTFPlant.META_ROOT_STRAND)}); - GameRegistry.addRecipe(new ItemStack(Blocks.torch, 5), new Object[] {"B", "S", 'B', TFItems.torchberries, 'S', Items.stick}); - - GameRegistry.addShapelessRecipe(new ItemStack(TFItems.ironwoodRaw), new Object[] {TFItems.liveRoot, Items.iron_ingot, Items.gold_nugget}); - GameRegistry.addSmelting(TFItems.ironwoodRaw, new ItemStack(TFItems.ironwoodIngot, 2), 1.0F); - - addEnchantedRecipe(TFItems.ironwoodHelm, Enchantment.aquaAffinity, 1, new Object[] {"###", "# #", '#', TFItems.ironwoodIngot}); - addEnchantedRecipe(TFItems.ironwoodPlate, Enchantment.protection, 1, new Object[] {"# #", "###", "###", '#', TFItems.ironwoodIngot}); - addEnchantedRecipe(TFItems.ironwoodLegs, Enchantment.protection, 1, new Object[] {"###", "# #", "# #", '#', TFItems.ironwoodIngot}); - addEnchantedRecipe(TFItems.ironwoodBoots, Enchantment.featherFalling, 1, new Object[] {"# #", "# #", '#', TFItems.ironwoodIngot}); - addEnchantedRecipe(TFItems.ironwoodSword, Enchantment.knockback, 1, new Object[] {"#", "#", "X", '#', TFItems.ironwoodIngot, 'X', Items.stick}); - addEnchantedRecipe(TFItems.ironwoodShovel, Enchantment.unbreaking, 1, new Object[] {"#", "X", "X", '#', TFItems.ironwoodIngot, 'X', Items.stick}); - addEnchantedRecipe(TFItems.ironwoodPick, Enchantment.efficiency, 1, new Object[] {"###", " X ", " X ", '#', TFItems.ironwoodIngot, 'X', Items.stick}); - addEnchantedRecipe(TFItems.ironwoodAxe, Enchantment.fortune, 1, new Object[] {"##", "#X", " X", '#', TFItems.ironwoodIngot, 'X', Items.stick}); - addEnchantedRecipe(TFItems.ironwoodHoe, null, 0, new Object[] {"##", " X", " X", '#', TFItems.ironwoodIngot, 'X', Items.stick}); - - GameRegistry.addRecipe(new ItemStack(TFBlocks.uncraftingTable), new Object[] {"###", "#X#", "###", '#', Blocks.crafting_table, 'X', TFItems.mazeMapFocus}); - - GameRegistry.addSmelting(TFItems.venisonRaw, new ItemStack(TFItems.venisonCooked), 0.3F); - - GameRegistry.addShapelessRecipe(new ItemStack(TFItems.fieryIngot), new Object[] {TFItems.fieryBlood, Items.iron_ingot}); - GameRegistry.addShapelessRecipe(new ItemStack(TFItems.fieryIngot), new Object[] {TFItems.fieryTears, Items.iron_ingot}); - GameRegistry.addRecipe(new ItemStack(TFItems.fieryHelm), new Object[] {"###", "# #", '#', TFItems.fieryIngot}); - GameRegistry.addRecipe(new ItemStack(TFItems.fieryPlate), new Object[] {"# #", "###", "###", '#', TFItems.fieryIngot}); - GameRegistry.addRecipe(new ItemStack(TFItems.fieryLegs), new Object[] {"###", "# #", "# #", '#', TFItems.fieryIngot}); - GameRegistry.addRecipe(new ItemStack(TFItems.fieryBoots), new Object[] {"# #", "# #", '#', TFItems.fieryIngot}); - addEnchantedRecipe(TFItems.fierySword, Enchantment.fireAspect, 2, new Object[] {"#", "#", "X", '#', TFItems.fieryIngot, 'X', Items.blaze_rod}); - GameRegistry.addRecipe(new ItemStack(TFItems.fieryPick), new Object[] {"###", " X ", " X ", '#', TFItems.fieryIngot, 'X', Items.blaze_rod}); - - addEnchantedRecipe(TFItems.steeleafHelm, Enchantment.projectileProtection, 2, new Object[] {"###", "# #", '#', TFItems.steeleafIngot}); - addEnchantedRecipe(TFItems.steeleafPlate, Enchantment.blastProtection, 2, new Object[] {"# #", "###", "###", '#', TFItems.steeleafIngot}); - addEnchantedRecipe(TFItems.steeleafLegs, Enchantment.fireProtection, 2, new Object[] {"###", "# #", "# #", '#', TFItems.steeleafIngot}); - addEnchantedRecipe(TFItems.steeleafBoots, Enchantment.featherFalling, 2, new Object[] {"# #", "# #", '#', TFItems.steeleafIngot}); - addEnchantedRecipe(TFItems.steeleafSword, Enchantment.looting, 2, new Object[] {"#", "#", "X", '#', TFItems.steeleafIngot, 'X', Items.stick}); - addEnchantedRecipe(TFItems.steeleafShovel, Enchantment.efficiency, 2, new Object[] {"#", "X", "X", '#', TFItems.steeleafIngot, 'X', Items.stick}); - addEnchantedRecipe(TFItems.steeleafPick, Enchantment.fortune, 2, new Object[] {"###", " X ", " X ", '#', TFItems.steeleafIngot, 'X', Items.stick}); - addEnchantedRecipe(TFItems.steeleafAxe, Enchantment.efficiency, 2, new Object[] {"##", "#X", " X", '#', TFItems.steeleafIngot, 'X', Items.stick}); - addEnchantedRecipe(TFItems.steeleafHoe, null, 0, new Object[] {"##", " X", " X", '#', TFItems.steeleafIngot, 'X', Items.stick}); - - GameRegistry.addSmelting(TFItems.meefRaw, new ItemStack(TFItems.meefSteak), 0.3F); - - GameRegistry.addShapelessRecipe(new ItemStack(TFItems.moonwormQueen), new Object[] {new ItemStack(TFItems.moonwormQueen, 1, Short.MAX_VALUE), TFItems.torchberries, TFItems.torchberries, TFItems.torchberries}); - - GameRegistry.addRecipe(new ItemStack(TFItems.emptyMagicMap), new Object[] {"###", "#X#", "###", '#', Items.paper, 'X', TFItems.magicMapFocus}); - - GameRegistry.addShapelessRecipe(new ItemStack(TFItems.charmOfKeeping2), new Object[] {TFItems.charmOfKeeping1, TFItems.charmOfKeeping1, TFItems.charmOfKeeping1, TFItems.charmOfKeeping1}); - GameRegistry.addShapelessRecipe(new ItemStack(TFItems.charmOfKeeping3), new Object[] {TFItems.charmOfKeeping2, TFItems.charmOfKeeping2, TFItems.charmOfKeeping2, TFItems.charmOfKeeping2}); - - GameRegistry.addShapelessRecipe(new ItemStack(TFItems.charmOfLife2), new Object[] {TFItems.charmOfLife1, TFItems.charmOfLife1, TFItems.charmOfLife1, TFItems.charmOfLife1}); - - GameRegistry.addRecipe(new TFMapCloningRecipe(TFItems.magicMap, TFItems.emptyMagicMap)); - GameRegistry.addRecipe(new TFMapCloningRecipe(TFItems.mazeMap, TFItems.emptyMazeMap)); - GameRegistry.addRecipe(new TFMapCloningRecipe(TFItems.oreMap, TFItems.emptyOreMap)); - - // dark tower recipes - GameRegistry.addRecipe(new ItemStack(TFBlocks.towerWood, 4, 0), new Object[] {"##", "##", '#', new ItemStack(TFBlocks.log, 1, 3)}); - GameRegistry.addRecipe(new ItemStack(TFBlocks.towerWood, 3, 1), new Object[] {"#", "#", "#", '#', new ItemStack(TFBlocks.towerWood, 1, 0)}); - GameRegistry.addRecipe(new ItemStack(TFItems.carminite), new Object[] {"brb", "rgr", "brb", 'b', new ItemStack(TFItems.borerEssence), 'r', new ItemStack(Items.redstone), 'g', new ItemStack(Items.ghast_tear)}); - GameRegistry.addRecipe(new ItemStack(TFItems.carminite), new Object[] {"rbr", "bgb", "rbr", 'b', new ItemStack(TFItems.borerEssence), 'r', new ItemStack(Items.redstone), 'g', new ItemStack(Items.ghast_tear)}); - GameRegistry.addRecipe(new ItemStack(TFBlocks.towerDevice, 8, BlockTFTowerDevice.META_VANISH_INACTIVE), new Object[] {"ewe", "wcw", "ewe", 'e', new ItemStack(TFBlocks.towerWood, 1, 1), 'w', new ItemStack(TFBlocks.towerWood, 1, 0), 'c', new ItemStack(TFItems.carminite)}); - GameRegistry.addRecipe(new ItemStack(TFBlocks.towerDevice, 2, BlockTFTowerDevice.META_REAPPEARING_INACTIVE), new Object[] {"ere", "rcr", "ere", 'e', new ItemStack(TFBlocks.towerWood, 1, 1), 'r', new ItemStack(Items.redstone), 'c', new ItemStack(TFItems.carminite)}); - GameRegistry.addRecipe(new ItemStack(TFBlocks.towerDevice, 1, BlockTFTowerDevice.META_BUILDER_INACTIVE), new Object[] {"ece", "cdc", "ece", 'e', new ItemStack(TFBlocks.towerWood, 1, 1), 'd', new ItemStack(Blocks.dispenser), 'c', new ItemStack(TFItems.carminite)}); - GameRegistry.addRecipe(new ItemStack(TFBlocks.towerDevice, 1, BlockTFTowerDevice.META_REACTOR_INACTIVE), new Object[] {"ece", "coc", "ece", 'e', new ItemStack(TFBlocks.towerWood, 1, 1), 'o', new ItemStack(Blocks.redstone_ore), 'c', new ItemStack(TFItems.carminite)}); - GameRegistry.addRecipe(new ItemStack(TFBlocks.fireJet, 1, BlockTFFireJet.META_ENCASED_SMOKER_OFF), new Object[] {"ere", "rsr", "ere", 'e', new ItemStack(TFBlocks.towerWood, 1, 1), 'r', new ItemStack(Items.redstone), 's', new ItemStack(TFBlocks.fireJet, 1, BlockTFFireJet.META_SMOKER)}); - GameRegistry.addRecipe(new ItemStack(TFBlocks.fireJet, 1, BlockTFFireJet.META_ENCASED_JET_IDLE), new Object[] {"ere", "rjr", "lll", 'e', new ItemStack(TFBlocks.towerWood, 1, 1), 'r', new ItemStack(Items.redstone), 'l', new ItemStack(Items.lava_bucket), 'j', new ItemStack(TFBlocks.fireJet, 1, BlockTFFireJet.META_JET_IDLE)}); - - - GameRegistry.addRecipe(new ItemStack(TFItems.shardCluster), new Object[] {"###", "###", "###", '#', TFItems.armorShard}); - - GameRegistry.addSmelting(TFItems.shardCluster, new ItemStack(TFItems.knightMetal), 1.0F); - - GameRegistry.addRecipe(new ItemStack(TFItems.knightlyHelm), new Object[] {"###", "# #", '#', TFItems.knightMetal}); - GameRegistry.addRecipe(new ItemStack(TFItems.knightlyPlate), new Object[] {"# #", "###", "###", '#', TFItems.knightMetal}); - GameRegistry.addRecipe(new ItemStack(TFItems.knightlyLegs), new Object[] {"###", "# #", "# #", '#', TFItems.knightMetal}); - GameRegistry.addRecipe(new ItemStack(TFItems.knightlyBoots), new Object[] {"# #", "# #", '#', TFItems.knightMetal}); - - GameRegistry.addRecipe(new ItemStack(TFItems.knightlySword), new Object[] {"#", "#", "X", '#', TFItems.knightMetal, 'X', Items.stick}); - GameRegistry.addRecipe(new ItemStack(TFItems.knightlyPick), new Object[] {"###", " X ", " X ", '#', TFItems.knightMetal, 'X', Items.stick}); - GameRegistry.addRecipe(new ItemStack(TFItems.knightlyAxe), new Object[] {"##", "#X", " X", '#', TFItems.knightMetal, 'X', Items.stick}); - GameRegistry.addRecipe(new ItemStack(TFItems.knightlyAxe), new Object[] {"##", "X#", "X ", '#', TFItems.knightMetal, 'X', Items.stick}); - - addEnchantedRecipe(TFItems.yetiHelm, Enchantment.protection, 2, new Object[] {"###", "# #", '#', TFItems.alphaFur}); - addEnchantedRecipe(TFItems.yetiPlate, Enchantment.protection, 2, new Object[] {"# #", "###", "###", '#', TFItems.alphaFur}); - addEnchantedRecipe(TFItems.yetiLegs, Enchantment.protection, 2, new Object[] {"###", "# #", "# #", '#', TFItems.alphaFur}); - addEnchantedRecipe(TFItems.yetiBoots, Enchantment.protection, 2, Enchantment.featherFalling, 4, new Object[] {"# #", "# #", '#', TFItems.alphaFur}); - - GameRegistry.addRecipe(new ItemStack(TFItems.arcticHelm), new Object[] {"###", "# #", '#', TFItems.arcticFur}); - GameRegistry.addRecipe(new ItemStack(TFItems.arcticPlate), new Object[] {"# #", "###", "###", '#', TFItems.arcticFur}); - GameRegistry.addRecipe(new ItemStack(TFItems.arcticLegs), new Object[] {"###", "# #", "# #", '#', TFItems.arcticFur}); - GameRegistry.addRecipe(new ItemStack(TFItems.arcticBoots), new Object[] {"# #", "# #", '#', TFItems.arcticFur}); - - GameRegistry.addRecipe(new ItemStack(TFBlocks.auroraSlab, 6, 0), new Object[] {"###", '#', TFBlocks.auroraBlock}); - GameRegistry.addRecipe(new ItemStack(TFBlocks.auroraPillar, 2, 0), new Object[] {"#", "#", '#', TFBlocks.auroraBlock}); - - GameRegistry.addRecipe(new ItemStack(TFItems.giantPick), new Object[] {"###", " X ", " X ", '#', TFBlocks.giantCobble, 'X', TFBlocks.giantLog}); - GameRegistry.addRecipe(new ItemStack(TFItems.giantSword), new Object[] {"#", "#", "X", '#', TFBlocks.giantCobble, 'X', TFBlocks.giantLog}); - - GameRegistry.addShapelessRecipe(new ItemStack(Blocks.cobblestone, 64), new Object[] {new ItemStack(TFBlocks.giantCobble)}); - GameRegistry.addShapelessRecipe(new ItemStack(Blocks.planks, 64), new Object[] {new ItemStack(TFBlocks.giantLog)}); - GameRegistry.addShapelessRecipe(new ItemStack(Blocks.leaves, 64), new Object[] {new ItemStack(TFBlocks.giantLeaves)}); - - GameRegistry.addRecipe(new ItemStack(TFItems.knightmetalRing), new Object[] {" # ", "# #", " # ", '#', TFItems.knightMetal}); - GameRegistry.addShapelessRecipe(new ItemStack(TFItems.chainBlock), new Object[] {TFItems.knightmetalRing, TFItems.knightMetal, TFItems.knightMetal, TFItems.knightMetal, TFBlocks.knightmetalStorage}); - - GameRegistry.addShapelessRecipe(new ItemStack(TFItems.knightMetal, 9), new Object[] {new ItemStack(TFBlocks.knightmetalStorage)}); - GameRegistry.addRecipe(new ItemStack(TFBlocks.knightmetalStorage), new Object[] {"###", "###", "###", '#', TFItems.knightMetal}); - - } - - /** - * Add a recipe for an enchanted item. Always shaped. - * - * @param item - * @param enchantment - * @param enchantmentLevel - * @param ingredientArray - */ - public static void addEnchantedRecipe(Item item, Enchantment enchantment, int enchantmentLevel, Object ... ingredientArray) { - ItemStack result = new ItemStack(item); - if (enchantment != null) { - result.addEnchantment(enchantment, enchantmentLevel); - } - - GameRegistry.addRecipe(result, ingredientArray); - } - /** - * Add a recipe for an enchanted item. Always shaped. - * - * @param item - * @param enchantment - * @param enchantmentLevel - * @param ingredientArray - */ - public static void addEnchantedRecipe(Item item, Enchantment enchantment, int enchantmentLevel, Enchantment enchantment2, int enchantmentLevel2, Object ... ingredientArray) { - ItemStack result = new ItemStack(item); - if (enchantment != null) { - result.addEnchantment(enchantment, enchantmentLevel); - } - if (enchantment2 != null) { - result.addEnchantment(enchantment2, enchantmentLevel2); - } - - GameRegistry.addRecipe(result, ingredientArray); - } -} diff --git a/src/main/java/twilightforest/item/TransformPowderItem.java b/src/main/java/twilightforest/item/TransformPowderItem.java new file mode 100644 index 0000000000..42618bfca5 --- /dev/null +++ b/src/main/java/twilightforest/item/TransformPowderItem.java @@ -0,0 +1,107 @@ +package twilightforest.item; + +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.entity.*; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.ServerLevelAccessor; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.event.ForgeEventFactory; +import twilightforest.TwilightForestMod; +import twilightforest.init.TFRecipes; +import twilightforest.init.TFSounds; + +import javax.annotation.Nonnull; +import java.util.UUID; +import java.util.concurrent.atomic.AtomicBoolean; + +public class TransformPowderItem extends Item { + + public TransformPowderItem(Properties properties) { + super(properties); + } + + @Override + public InteractionResult interactLivingEntity(ItemStack stack, Player player, LivingEntity target, InteractionHand hand) { + if (!target.isAlive()) { + return InteractionResult.PASS; + } + AtomicBoolean flag = new AtomicBoolean(false); + + player.getLevel().getRecipeManager().getAllRecipesFor(TFRecipes.TRANSFORM_POWDER_RECIPE.get()).forEach((recipe) -> { + if (flag.get()) return; + if (recipe.input() == target.getType() || (recipe.isReversible() && recipe.result() == target.getType())) { + EntityType type = recipe.isReversible() && recipe.result() == target.getType() ? recipe.input() : recipe.result(); + if (type == null) { + return; + } + + Entity newEntity = type.create(player.getLevel()); + if (newEntity == null) { + return; + } + + newEntity.moveTo(target.getX(), target.getY(), target.getZ(), target.getYRot(), target.getXRot()); + if (newEntity instanceof Mob mob && target.getLevel() instanceof ServerLevelAccessor world) { + ForgeEventFactory.onFinalizeSpawn(mob, world, target.getLevel().getCurrentDifficultyAt(target.blockPosition()), MobSpawnType.CONVERSION, null, null); + } + + try { // try copying what can be copied + UUID uuid = newEntity.getUUID(); + newEntity.load(target.saveWithoutId(newEntity.saveWithoutId(new CompoundTag()))); + newEntity.setUUID(uuid); + } catch (Exception e) { + TwilightForestMod.LOGGER.warn("Couldn't transform entity NBT data", e); + } + + target.getLevel().addFreshEntity(newEntity); + target.discard(); + stack.shrink(1); + + if (target instanceof Mob mob) { + mob.spawnAnim(); + mob.spawnAnim(); + } + target.playSound(TFSounds.POWDER_USE.get(), 1.0F + target.getLevel().getRandom().nextFloat(), target.getLevel().getRandom().nextFloat() * 0.7F + 0.3F); + flag.set(true); + } + }); + return flag.get() ? InteractionResult.SUCCESS : InteractionResult.PASS; + } + + @Nonnull + @Override + public InteractionResultHolder use(Level level, Player player, @Nonnull InteractionHand hand) { + if (level.isClientSide()) { + AABB area = this.getEffectAABB(player); + + // particle effect + for (int i = 0; i < 30; i++) { + level.addParticle(ParticleTypes.CRIT, area.minX + level.getRandom().nextFloat() * (area.maxX - area.minX), + area.minY + level.getRandom().nextFloat() * (area.maxY - area.minY), + area.minZ + level.getRandom().nextFloat() * (area.maxZ - area.minZ), + 0, 0, 0); + } + + } + + return new InteractionResultHolder<>(InteractionResult.SUCCESS, player.getItemInHand(hand)); + } + + private AABB getEffectAABB(Player player) { + double range = 2.0D; + double radius = 1.0D; + Vec3 srcVec = new Vec3(player.getX(), player.getY() + player.getEyeHeight(), player.getZ()); + Vec3 lookVec = player.getLookAngle(); + Vec3 destVec = srcVec.add(lookVec.x() * range, lookVec.y() * range, lookVec.z() * range); + + return new AABB(destVec.x() - radius, destVec.y() - radius, destVec.z() - radius, destVec.x() + radius, destVec.y() + radius, destVec.z() + radius); + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/item/TripleBowItem.java b/src/main/java/twilightforest/item/TripleBowItem.java new file mode 100644 index 0000000000..00e3dc894a --- /dev/null +++ b/src/main/java/twilightforest/item/TripleBowItem.java @@ -0,0 +1,82 @@ +package twilightforest.item; + +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.stats.Stats; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.entity.projectile.AbstractArrow; +import net.minecraft.world.item.ArrowItem; +import net.minecraft.world.item.BowItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.level.Level; + +public class TripleBowItem extends BowItem { + + public TripleBowItem(Properties properties) { + super(properties); + } + + // Half [VanillaCopy]: copy of modified super to fire three arrows + @Override + public void releaseUsing(ItemStack stack, Level level, LivingEntity living, int timeLeft) { + if (living instanceof Player player) { + boolean flag = player.getAbilities().instabuild || EnchantmentHelper.getTagEnchantmentLevel(Enchantments.INFINITY_ARROWS, stack) > 0; + ItemStack itemstack = player.getProjectile(stack); + + int i = this.getUseDuration(stack) - timeLeft; + i = net.minecraftforge.event.ForgeEventFactory.onArrowLoose(stack, level, player, i, !itemstack.isEmpty() || flag); + if (i < 0) return; + + if (!itemstack.isEmpty() || flag) { + if (itemstack.isEmpty()) itemstack = new ItemStack(Items.ARROW); + + float f = getPowerForTime(i); + if (f >= 0.1D) { + boolean flag1 = player.getAbilities().instabuild || (itemstack.getItem() instanceof ArrowItem arrowItem && arrowItem.isInfinite(itemstack, stack, player)); + if (!level.isClientSide()) { + ArrowItem arrowItem = itemstack.getItem() instanceof ArrowItem arrow ? arrow : (ArrowItem) Items.ARROW; + for (int j = -1; j < 2; j++) { + AbstractArrow abstractArrow = arrowItem.createArrow(level, itemstack, player); + abstractArrow.shootFromRotation(player, player.getXRot(), player.getYRot(), 0.0F, f * (3.0F - Math.abs(j)), 1.0F); + abstractArrow.setDeltaMovement(abstractArrow.getDeltaMovement().add(0.0D, 0.0075 * 20F * j, 0.0D)); + + if (j != 0) { + abstractArrow.setPos(abstractArrow.getX(), abstractArrow.getY() + 0.025F, abstractArrow.getZ()); + abstractArrow.pickup = AbstractArrow.Pickup.CREATIVE_ONLY; + } else if (flag1 || player.getAbilities().instabuild && (itemstack.getItem() == Items.SPECTRAL_ARROW || itemstack.getItem() == Items.TIPPED_ARROW)) { + abstractArrow.pickup = AbstractArrow.Pickup.CREATIVE_ONLY; + } + + if (f == 1.0F) abstractArrow.setCritArrow(true); + + int p = EnchantmentHelper.getTagEnchantmentLevel(Enchantments.POWER_ARROWS, stack); + if (p > 0) abstractArrow.setBaseDamage(abstractArrow.getBaseDamage() + j * 0.5D + 0.5D); + + int k = EnchantmentHelper.getTagEnchantmentLevel(Enchantments.PUNCH_ARROWS, stack); + if (k > 0) abstractArrow.setKnockback(k); + + if (EnchantmentHelper.getTagEnchantmentLevel(Enchantments.FLAMING_ARROWS, stack) > 0) + abstractArrow.setSecondsOnFire(100); + + level.addFreshEntity(abstractArrow); + } + + stack.hurtAndBreak(1, player, (user) -> user.broadcastBreakEvent(player.getUsedItemHand())); + } + + level.playSound(null, player.getX(), player.getY(), player.getZ(), SoundEvents.ARROW_SHOOT, SoundSource.PLAYERS, 1.0F, 1.0F / (level.getRandom().nextFloat() * 0.4F + 1.2F) + f * 0.5F); + if (!flag1 && !player.getAbilities().instabuild) { + itemstack.shrink(1); + if (itemstack.isEmpty()) player.getInventory().removeItem(itemstack); + } + + player.awardStat(Stats.ITEM_USED.get(this)); + } + } + } + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/item/TrophyItem.java b/src/main/java/twilightforest/item/TrophyItem.java new file mode 100644 index 0000000000..81d78ac42e --- /dev/null +++ b/src/main/java/twilightforest/item/TrophyItem.java @@ -0,0 +1,63 @@ +package twilightforest.item; + +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.stats.Stats; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.StandingAndWallBlockItem; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraftforge.common.capabilities.ICapabilityProvider; +import net.minecraftforge.fml.ModList; +import org.jetbrains.annotations.Nullable; +import twilightforest.compat.curios.CuriosCompat; + +public class TrophyItem extends StandingAndWallBlockItem { + + public TrophyItem(Block floorBlock, Block wallBlock, Properties properties) { + super(floorBlock, wallBlock, properties, Direction.DOWN); + } + + @Override + public InteractionResultHolder use(Level level, Player player, InteractionHand hand) { + ItemStack itemstack = player.getItemInHand(hand); + EquipmentSlot equipmentslot = Mob.getEquipmentSlotForItem(itemstack); + ItemStack itemstack1 = player.getItemBySlot(equipmentslot); + if (itemstack1.isEmpty()) { + player.setItemSlot(equipmentslot, itemstack.split(1)); + if (!level.isClientSide()) { + player.awardStat(Stats.ITEM_USED.get(this)); + } + + return InteractionResultHolder.sidedSuccess(itemstack, level.isClientSide()); + } else { + return InteractionResultHolder.fail(itemstack); + } + } + + @Override + public boolean canEquip(ItemStack stack, EquipmentSlot slot, Entity entity) { + return slot == EquipmentSlot.HEAD; + } + + @Override + @Nullable + public EquipmentSlot getEquipmentSlot(ItemStack stack) { + return EquipmentSlot.HEAD; + } + + @Nullable + @Override + public ICapabilityProvider initCapabilities(ItemStack stack, @Nullable CompoundTag tag) { + if (ModList.get().isLoaded("curios")) { + return CuriosCompat.setupCuriosCapability(stack); + } + return super.initCapabilities(stack, tag); + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/item/TwilightBoatItem.java b/src/main/java/twilightforest/item/TwilightBoatItem.java new file mode 100644 index 0000000000..9065ea062b --- /dev/null +++ b/src/main/java/twilightforest/item/TwilightBoatItem.java @@ -0,0 +1,85 @@ +package twilightforest.item; + +import net.minecraft.stats.Stats; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntitySelector; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.ClipContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.gameevent.GameEvent; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.HitResult; +import net.minecraft.world.phys.Vec3; +import twilightforest.entity.TwilightBoat; +import twilightforest.entity.TwilightChestBoat; + +import java.util.List; +import java.util.function.Predicate; + +public class TwilightBoatItem extends Item { + + private static final Predicate ENTITY_PREDICATE = EntitySelector.NO_SPECTATORS.and(Entity::isPickable); + private final TwilightBoat.Type type; + private final boolean chest; + + public TwilightBoatItem(boolean chest, TwilightBoat.Type type, Item.Properties properties) { + super(properties); + this.chest = chest; + this.type = type; + } + + @Override + public InteractionResultHolder use(Level level, Player player, InteractionHand hand) { + ItemStack itemstack = player.getItemInHand(hand); + HitResult result = getPlayerPOVHitResult(level, player, ClipContext.Fluid.ANY); + if (result.getType() == HitResult.Type.MISS) { + return InteractionResultHolder.pass(itemstack); + } + else { + Vec3 vector3d = player.getViewVector(1.0F); + List list = level.getEntities(player, player.getBoundingBox().expandTowards(vector3d.scale(5.0D)).inflate(1.0D), ENTITY_PREDICATE); + if (!list.isEmpty()) { + Vec3 vector3d1 = player.getEyePosition(1.0F); + + for(Entity entity : list) { + AABB aabb = entity.getBoundingBox().inflate(entity.getPickRadius()); + if (aabb.contains(vector3d1)) { + return InteractionResultHolder.pass(itemstack); + } + } + } + + if (result.getType() == HitResult.Type.BLOCK) { + TwilightBoat boat = this.getBoat(level, result); + boat.setTwilightBoatType(this.type); + boat.setYRot(player.getYRot()); + if (!level.noCollision(boat, boat.getBoundingBox())) { + return InteractionResultHolder.fail(itemstack); + } + else { + if (!level.isClientSide()) { + level.addFreshEntity(boat); + level.gameEvent(player, GameEvent.ENTITY_PLACE, result.getLocation()); + if (!player.getAbilities().instabuild) { + itemstack.shrink(1); + } + } + + player.awardStat(Stats.ITEM_USED.get(this)); + return InteractionResultHolder.sidedSuccess(itemstack, level.isClientSide()); + } + } + else { + return InteractionResultHolder.pass(itemstack); + } + } + } + + private TwilightBoat getBoat(Level level, HitResult result) { + return this.chest ? new TwilightChestBoat(level, result.getLocation().x(), result.getLocation().y(), result.getLocation().z()) : new TwilightBoat(level, result.getLocation().x(), result.getLocation().y(), result.getLocation().z()); + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/item/TwilightWandItem.java b/src/main/java/twilightforest/item/TwilightWandItem.java new file mode 100644 index 0000000000..991f82b81c --- /dev/null +++ b/src/main/java/twilightforest/item/TwilightWandItem.java @@ -0,0 +1,66 @@ +package twilightforest.item; + +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.item.enchantment.Enchantment; +import net.minecraft.world.level.Level; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import org.jetbrains.annotations.Nullable; +import twilightforest.entity.projectile.TwilightWandBolt; +import twilightforest.init.TFSounds; + +import java.util.List; + +public class TwilightWandItem extends Item { + + public TwilightWandItem(Properties properties) { + super(properties); + } + + @Override + public InteractionResultHolder use(Level level, Player player, InteractionHand hand) { + ItemStack stack = player.getItemInHand(hand); + + if (stack.getDamageValue() == stack.getMaxDamage()) { + return InteractionResultHolder.fail(player.getItemInHand(hand)); + } else { + player.playSound(TFSounds.SCEPTER_PEARL.get(), 1.0F, (level.getRandom().nextFloat() - level.getRandom().nextFloat()) * 0.2F + 1.0F); + + if (!level.isClientSide()) { + level.addFreshEntity(new TwilightWandBolt(level, player)); + stack.hurt(1, level.getRandom(), null); + } + + return InteractionResultHolder.success(player.getItemInHand(hand)); + } + } + + @Override + public boolean isEnchantable(ItemStack stack) { + return false; + } + + @Override + public boolean isBookEnchantable(ItemStack stack, ItemStack book) { + return false; + } + + @Override + public boolean canApplyAtEnchantingTable(ItemStack stack, Enchantment enchantment) { + return false; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void appendHoverText(ItemStack stack, @Nullable Level level, List tooltip, TooltipFlag flag) { + super.appendHoverText(stack, level, tooltip, flag); + tooltip.add(Component.translatable("item.twilightforest.scepter.desc", stack.getMaxDamage() - stack.getDamageValue()).withStyle(ChatFormatting.GRAY)); + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/item/WearableItem.java b/src/main/java/twilightforest/item/WearableItem.java new file mode 100644 index 0000000000..9dc0f35596 --- /dev/null +++ b/src/main/java/twilightforest/item/WearableItem.java @@ -0,0 +1,62 @@ +package twilightforest.item; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.stats.Stats; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraftforge.common.capabilities.ICapabilityProvider; +import net.minecraftforge.fml.ModList; +import org.jetbrains.annotations.Nullable; +import twilightforest.block.CritterBlock; +import twilightforest.compat.curios.CuriosCompat; + +public class WearableItem extends BlockItem { + public WearableItem(Block block, Properties props) { + super(block, props); + } + + @Override + public InteractionResultHolder use(Level level, Player player, InteractionHand hand) { + ItemStack itemstack = player.getItemInHand(hand); + EquipmentSlot equipmentslot = Mob.getEquipmentSlotForItem(itemstack); + ItemStack itemstack1 = player.getItemBySlot(equipmentslot); + if (itemstack1.isEmpty()) { + player.setItemSlot(equipmentslot, itemstack.split(1)); + if (!level.isClientSide()) { + player.awardStat(Stats.ITEM_USED.get(this)); + } + + return InteractionResultHolder.sidedSuccess(itemstack, level.isClientSide()); + } else { + return InteractionResultHolder.fail(itemstack); + } + } + + @Override + public boolean canEquip(ItemStack stack, EquipmentSlot slot, Entity entity) { + return slot == EquipmentSlot.HEAD; + } + + @Override + @Nullable + public EquipmentSlot getEquipmentSlot(ItemStack stack) { + return EquipmentSlot.HEAD; + } + + @Nullable + @Override + public ICapabilityProvider initCapabilities(ItemStack stack, @Nullable CompoundTag tag) { + if (ModList.get().isLoaded("curios") && this.getBlock() instanceof CritterBlock) { + return CuriosCompat.setupCuriosCapability(stack); + } + return super.initCapabilities(stack, tag); + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/item/YetiArmorItem.java b/src/main/java/twilightforest/item/YetiArmorItem.java new file mode 100644 index 0000000000..9721aba9ca --- /dev/null +++ b/src/main/java/twilightforest/item/YetiArmorItem.java @@ -0,0 +1,98 @@ +package twilightforest.item; + +import net.minecraft.ChatFormatting; +import net.minecraft.client.Minecraft; +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.model.geom.EntityModelSet; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.network.chat.Style; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ArmorItem; +import net.minecraft.world.item.ArmorMaterial; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.item.enchantment.Enchantment; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.level.Level; +import net.minecraftforge.client.extensions.common.IClientItemExtensions; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import twilightforest.TwilightForestMod; +import twilightforest.client.model.TFModelLayers; +import twilightforest.client.model.armor.YetiArmorModel; +import twilightforest.init.TFEnchantments; +import twilightforest.init.TFItems; + +import java.util.List; +import java.util.Objects; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.function.Consumer; + +public class YetiArmorItem extends ArmorItem { + private static final MutableComponent TOOLTIP = Component.translatable("item.twilightforest.yeti_armor.desc").setStyle(Style.EMPTY.withColor(ChatFormatting.GRAY)); + + public YetiArmorItem(ArmorMaterial material, Type type, Properties properties) { + super(material, type, properties); + } + + @Override + public boolean isBookEnchantable(ItemStack stack, ItemStack book) { + AtomicBoolean badEnchant = new AtomicBoolean(); + EnchantmentHelper.getEnchantments(book).forEach((enchantment, integer) -> { + if (Objects.equals(Enchantments.THORNS, enchantment) || Objects.equals(TFEnchantments.FIRE_REACT.get(), enchantment)) { + badEnchant.set(true); + } + }); + + return !badEnchant.get(); + } + + @Override + public boolean canApplyAtEnchantingTable(ItemStack stack, Enchantment enchantment) { + return !TFEnchantments.FIRE_REACT.get().equals(enchantment) && + !Enchantments.THORNS.equals(enchantment) && + !TFEnchantments.CHILL_AURA.get().equals(enchantment) && + super.canApplyAtEnchantingTable(stack, enchantment); + } + + @Override + public String getArmorTexture(ItemStack stack, Entity entity, EquipmentSlot slot, String layer) { + if (slot == EquipmentSlot.LEGS || slot == EquipmentSlot.CHEST) { + return TwilightForestMod.ARMOR_DIR + "yetiarmor_2.png"; + } else { + return TwilightForestMod.ARMOR_DIR + "yetiarmor_1.png"; + } + } + + @Override + public void appendHoverText(ItemStack stack, @Nullable Level level, List tooltip, TooltipFlag flag) { + super.appendHoverText(stack, level, tooltip, flag); + tooltip.add(TOOLTIP); + } + + @Override + public boolean canWalkOnPowderedSnow(ItemStack stack, LivingEntity wearer) { + return stack.is(TFItems.YETI_BOOTS.get()); + } + + @Override + public void initializeClient(Consumer consumer) { + consumer.accept(ArmorRender.INSTANCE); + } + + private static final class ArmorRender implements IClientItemExtensions { + private static final ArmorRender INSTANCE = new ArmorRender(); + + @Override + public @NotNull HumanoidModel getHumanoidArmorModel(LivingEntity living, ItemStack stack, EquipmentSlot slot, HumanoidModel model) { + EntityModelSet models = Minecraft.getInstance().getEntityModels(); + ModelPart root = models.bakeLayer(slot == EquipmentSlot.LEGS ? TFModelLayers.YETI_ARMOR_INNER : TFModelLayers.YETI_ARMOR_OUTER); + return new YetiArmorModel(slot, root); + } + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/item/ZombieWandItem.java b/src/main/java/twilightforest/item/ZombieWandItem.java new file mode 100644 index 0000000000..664529c131 --- /dev/null +++ b/src/main/java/twilightforest/item/ZombieWandItem.java @@ -0,0 +1,90 @@ +package twilightforest.item; + +import net.minecraft.ChatFormatting; +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.item.enchantment.Enchantment; +import net.minecraft.world.level.ClipContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.gameevent.GameEvent; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.HitResult; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import org.jetbrains.annotations.Nullable; +import twilightforest.entity.monster.LoyalZombie; +import twilightforest.init.TFEntities; +import twilightforest.init.TFSounds; + +import java.util.List; + +public class ZombieWandItem extends Item { + + public ZombieWandItem(Properties properties) { + super(properties); + } + + @Override + public InteractionResultHolder use(Level level, Player player, InteractionHand hand) { + + ItemStack stack = player.getItemInHand(hand); + + if (stack.getDamageValue() == stack.getMaxDamage()) { + return InteractionResultHolder.fail(stack); + } + + if (!level.isClientSide()) { + // what block is the player pointing at? + BlockHitResult result = getPlayerPOVHitResult(level, player, ClipContext.Fluid.NONE); + + if (result.getType() != HitResult.Type.MISS) { + LoyalZombie zombie = TFEntities.LOYAL_ZOMBIE.get().create(level); + zombie.moveTo(result.getLocation()); + if (!level.noCollision(zombie, zombie.getBoundingBox())) { + return InteractionResultHolder.pass(stack); + } + zombie.spawnAnim(); + zombie.setTame(true); + zombie.setOwnerUUID(player.getUUID()); + zombie.addEffect(new MobEffectInstance(MobEffects.DAMAGE_BOOST, 1200, 1)); + level.addFreshEntity(zombie); + level.gameEvent(player, GameEvent.ENTITY_PLACE, result.getBlockPos()); + + stack.hurt(1, level.getRandom(), null); + zombie.playSound(TFSounds.LOYAL_ZOMBIE_SUMMON.get(), 1.0F, zombie.getVoicePitch()); + } + } + + return InteractionResultHolder.sidedSuccess(stack, level.isClientSide()); + } + + @Override + public boolean isEnchantable(ItemStack stack) { + return false; + } + + @Override + public boolean isBookEnchantable(ItemStack stack, ItemStack book) { + return false; + } + + @Override + public boolean canApplyAtEnchantingTable(ItemStack stack, Enchantment enchantment) { + return false; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void appendHoverText(ItemStack stack, @Nullable Level level, List tooltip, TooltipFlag flag) { + super.appendHoverText(stack, level, tooltip, flag); + tooltip.add(Component.translatable("item.twilightforest.scepter.desc", stack.getMaxDamage() - stack.getDamageValue()).withStyle(ChatFormatting.GRAY)); + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/item/package-info.java b/src/main/java/twilightforest/item/package-info.java new file mode 100644 index 0000000000..ad004aa3a3 --- /dev/null +++ b/src/main/java/twilightforest/item/package-info.java @@ -0,0 +1,6 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.item; + +import net.minecraft.MethodsReturnNonnullByDefault; +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/item/recipe/CrumbleRecipe.java b/src/main/java/twilightforest/item/recipe/CrumbleRecipe.java new file mode 100644 index 0000000000..baf621be47 --- /dev/null +++ b/src/main/java/twilightforest/item/recipe/CrumbleRecipe.java @@ -0,0 +1,85 @@ +package twilightforest.item.recipe; + +import com.google.gson.JsonObject; +import net.minecraft.core.RegistryAccess; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.GsonHelper; +import net.minecraft.world.Container; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Recipe; +import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.registries.ForgeRegistries; +import twilightforest.init.TFRecipes; + +import org.jetbrains.annotations.Nullable; + +public record CrumbleRecipe(ResourceLocation recipeID, BlockState input, BlockState result) implements Recipe { + + @Override + public boolean matches(Container container, Level level) { + return true; + } + + @Override + public ItemStack assemble(Container container, RegistryAccess access) { + return ItemStack.EMPTY; + } + + @Override + public boolean canCraftInDimensions(int width, int height) { + return true; + } + + @Override + public ItemStack getResultItem(RegistryAccess access) { + return ItemStack.EMPTY; + } + + @Override + public ResourceLocation getId() { + return this.recipeID; + } + + @Override + public RecipeSerializer getSerializer() { + return TFRecipes.CRUMBLE_SERIALIZER.get(); + } + + @Override + public RecipeType getType() { + return TFRecipes.CRUMBLE_RECIPE.get(); + } + + public static class Serializer implements RecipeSerializer { + + @Override + public CrumbleRecipe fromJson(ResourceLocation id, JsonObject object) { + Block input = ForgeRegistries.BLOCKS.getValue(ResourceLocation.tryParse(GsonHelper.getAsString(object, "from"))); + Block output = ForgeRegistries.BLOCKS.getValue(ResourceLocation.tryParse(GsonHelper.getAsString(object, "to"))); + if (input != null && output != null) { + return new CrumbleRecipe(id, input.defaultBlockState(), output.defaultBlockState()); + } + return new CrumbleRecipe(id, Blocks.AIR.defaultBlockState(), Blocks.AIR.defaultBlockState()); + } + + @Nullable + @Override + public CrumbleRecipe fromNetwork(ResourceLocation id, FriendlyByteBuf buffer) { + Block input = buffer.readRegistryIdUnsafe(ForgeRegistries.BLOCKS); + Block output = buffer.readRegistryIdUnsafe(ForgeRegistries.BLOCKS); + return new CrumbleRecipe(id, input.defaultBlockState(), output.defaultBlockState()); + } + + @Override + public void toNetwork(FriendlyByteBuf buffer, CrumbleRecipe recipe) { + buffer.writeRegistryIdUnsafe(ForgeRegistries.BLOCKS, recipe.input.getBlock()); + buffer.writeRegistryIdUnsafe(ForgeRegistries.BLOCKS, recipe.result.getBlock()); + } + } +} diff --git a/src/main/java/twilightforest/item/recipe/IUncraftingRecipe.java b/src/main/java/twilightforest/item/recipe/IUncraftingRecipe.java new file mode 100644 index 0000000000..992b8bfece --- /dev/null +++ b/src/main/java/twilightforest/item/recipe/IUncraftingRecipe.java @@ -0,0 +1,12 @@ +package twilightforest.item.recipe; + +import net.minecraft.world.item.crafting.CraftingRecipe; +import net.minecraft.world.item.crafting.RecipeType; +import twilightforest.init.TFRecipes; + +public interface IUncraftingRecipe extends CraftingRecipe { + @Override + default RecipeType getType() { + return TFRecipes.UNCRAFTING_RECIPE.get(); + } +} diff --git a/src/main/java/twilightforest/item/recipe/MagicMapCloningRecipe.java b/src/main/java/twilightforest/item/recipe/MagicMapCloningRecipe.java new file mode 100644 index 0000000000..19780d4fb7 --- /dev/null +++ b/src/main/java/twilightforest/item/recipe/MagicMapCloningRecipe.java @@ -0,0 +1,87 @@ +package twilightforest.item.recipe; + +import net.minecraft.core.RegistryAccess; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.inventory.CraftingContainer; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.CraftingBookCategory; +import net.minecraft.world.item.crafting.CustomRecipe; +import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraft.world.level.Level; +import twilightforest.init.TFRecipes; +import twilightforest.init.TFItems; + +public class MagicMapCloningRecipe extends CustomRecipe { + + public MagicMapCloningRecipe(ResourceLocation id, CraftingBookCategory category) { + super(id, category); + } + + @Override + public boolean matches(CraftingContainer container, Level level) { + int i = 0; + ItemStack itemstack = ItemStack.EMPTY; + + for(int j = 0; j < container.getContainerSize(); j++) { + ItemStack itemstack1 = container.getItem(j); + if (!itemstack1.isEmpty()) { + if (itemstack1.is(TFItems.FILLED_MAGIC_MAP.get())) { + if (!itemstack.isEmpty()) { + return false; + } + + itemstack = itemstack1; + } else { + if (!itemstack1.is(TFItems.MAGIC_MAP.get())) { + return false; + } + + i++; + } + } + } + + return !itemstack.isEmpty() && i > 0; + } + + @Override + public ItemStack assemble(CraftingContainer container, RegistryAccess access) { + int i = 0; + ItemStack itemstack = ItemStack.EMPTY; + + for(int j = 0; j < container.getContainerSize(); j++) { + ItemStack itemstack1 = container.getItem(j); + if (!itemstack1.isEmpty()) { + if (itemstack1.is(TFItems.FILLED_MAGIC_MAP.get())) { + if (!itemstack.isEmpty()) { + return ItemStack.EMPTY; + } + + itemstack = itemstack1; + } else { + if (!itemstack1.is(TFItems.MAGIC_MAP.get())) { + return ItemStack.EMPTY; + } + + i++; + } + } + } + + if (!itemstack.isEmpty() && i >= 1) { + ItemStack itemstack2 = itemstack.copy(); + itemstack2.setCount(i + 1); + return itemstack2; + } else { + return ItemStack.EMPTY; + } + } + + public boolean canCraftInDimensions(int x, int y) { + return x >= 3 && y >= 3; + } + + public RecipeSerializer getSerializer() { + return TFRecipes.MAGIC_MAP_CLONING_RECIPE.get(); + } +} diff --git a/src/main/java/twilightforest/item/recipe/MazeMapCloningRecipe.java b/src/main/java/twilightforest/item/recipe/MazeMapCloningRecipe.java new file mode 100644 index 0000000000..9fb309c12b --- /dev/null +++ b/src/main/java/twilightforest/item/recipe/MazeMapCloningRecipe.java @@ -0,0 +1,87 @@ +package twilightforest.item.recipe; + +import net.minecraft.core.RegistryAccess; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.inventory.CraftingContainer; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.CraftingBookCategory; +import net.minecraft.world.item.crafting.CustomRecipe; +import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraft.world.level.Level; +import twilightforest.init.TFRecipes; +import twilightforest.init.TFItems; + +public class MazeMapCloningRecipe extends CustomRecipe { + + public MazeMapCloningRecipe(ResourceLocation id, CraftingBookCategory category) { + super(id, category); + } + + @Override + public boolean matches(CraftingContainer container, Level level) { + int i = 0; + ItemStack itemstack = ItemStack.EMPTY; + + for(int j = 0; j < container.getContainerSize(); j++) { + ItemStack itemstack1 = container.getItem(j); + if (!itemstack1.isEmpty()) { + if (itemstack1.is(TFItems.FILLED_MAZE_MAP.get())) { + if (!itemstack.isEmpty()) { + return false; + } + + itemstack = itemstack1; + } else { + if (!itemstack1.is(TFItems.MAZE_MAP.get())) { + return false; + } + + i++; + } + } + } + + return !itemstack.isEmpty() && i > 0; + } + + @Override + public ItemStack assemble(CraftingContainer container, RegistryAccess access) { + int i = 0; + ItemStack itemstack = ItemStack.EMPTY; + + for(int j = 0; j < container.getContainerSize(); j++) { + ItemStack itemstack1 = container.getItem(j); + if (!itemstack1.isEmpty()) { + if (itemstack1.is(TFItems.FILLED_MAZE_MAP.get())) { + if (!itemstack.isEmpty()) { + return ItemStack.EMPTY; + } + + itemstack = itemstack1; + } else { + if (!itemstack1.is(TFItems.MAZE_MAP.get())) { + return ItemStack.EMPTY; + } + + i++; + } + } + } + + if (!itemstack.isEmpty() && i >= 1) { + ItemStack itemstack2 = itemstack.copy(); + itemstack2.setCount(i + 1); + return itemstack2; + } else { + return ItemStack.EMPTY; + } + } + + public boolean canCraftInDimensions(int x, int y) { + return x >= 3 && y >= 3; + } + + public RecipeSerializer getSerializer() { + return TFRecipes.MAZE_MAP_CLONING_RECIPE.get(); + } +} diff --git a/src/main/java/twilightforest/item/recipe/MoonwormQueenRepairRecipe.java b/src/main/java/twilightforest/item/recipe/MoonwormQueenRepairRecipe.java new file mode 100644 index 0000000000..58fe819b43 --- /dev/null +++ b/src/main/java/twilightforest/item/recipe/MoonwormQueenRepairRecipe.java @@ -0,0 +1,85 @@ +package twilightforest.item.recipe; + +import net.minecraft.core.RegistryAccess; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.inventory.CraftingContainer; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.CraftingBookCategory; +import net.minecraft.world.item.crafting.CustomRecipe; +import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraft.world.level.Level; +import twilightforest.init.TFRecipes; +import twilightforest.init.TFItems; + +import java.util.ArrayList; +import java.util.List; + +public class MoonwormQueenRepairRecipe extends CustomRecipe { + + public MoonwormQueenRepairRecipe(ResourceLocation id, CraftingBookCategory category) { + super(id, category); + } + + @Override + public boolean matches(CraftingContainer inv, Level level) { + ItemStack queen = null; + List berries = new ArrayList<>(); + + for(int i = 0; i < inv.getContainerSize(); ++i) { + ItemStack stackInQuestion = inv.getItem(i); + if (!stackInQuestion.isEmpty()) { + if (stackInQuestion.is(TFItems.MOONWORM_QUEEN.get()) && stackInQuestion.isDamaged()) { + queen = stackInQuestion; + } + if (stackInQuestion.is(TFItems.TORCHBERRIES.get())) { + berries.add(stackInQuestion); + } + } + } + return queen != null && !berries.isEmpty(); + } + + @Override + public ItemStack assemble(CraftingContainer inv, RegistryAccess access) { + List berries = new ArrayList<>(); + ItemStack queen = null; + for(int i = 0; i < inv.getContainerSize(); ++i) { + ItemStack itemstack = inv.getItem(i); + if (!itemstack.isEmpty()) { + if(itemstack.is(TFItems.MOONWORM_QUEEN.get())) { + if(queen == null) { + queen = itemstack; + } else { + //Only accept 1 queen + return ItemStack.EMPTY; + } + } + + if(itemstack.is(TFItems.TORCHBERRIES.get())) { + //add all berries in the grid to a list to determine the amount to repair + berries.add(itemstack.getItem()); + } + } + } + + if(!berries.isEmpty() && queen != null && queen.isDamaged()) { + ItemStack newQueen = TFItems.MOONWORM_QUEEN.get().getDefaultInstance(); + //each berry repairs 64 durability + newQueen.setDamageValue(queen.getDamageValue() - (berries.size() * 64)); + return newQueen; + } + + return ItemStack.EMPTY; + } + + @Override + public boolean canCraftInDimensions(int width, int height) { + return width * height >= 2; + } + + @Override + public RecipeSerializer getSerializer() { + return TFRecipes.MOONWORM_QUEEN_REPAIR_RECIPE.get(); + } +} diff --git a/src/main/java/twilightforest/item/recipe/TransformPowderRecipe.java b/src/main/java/twilightforest/item/recipe/TransformPowderRecipe.java new file mode 100644 index 0000000000..869c95a233 --- /dev/null +++ b/src/main/java/twilightforest/item/recipe/TransformPowderRecipe.java @@ -0,0 +1,86 @@ +package twilightforest.item.recipe; + +import com.google.gson.JsonObject; +import net.minecraft.core.RegistryAccess; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.GsonHelper; +import net.minecraft.world.Container; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Recipe; +import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.level.Level; +import net.minecraftforge.registries.ForgeRegistries; +import twilightforest.init.TFRecipes; + +import org.jetbrains.annotations.Nullable; + +public record TransformPowderRecipe(ResourceLocation recipeID, EntityType input, EntityType result, boolean isReversible) implements Recipe { + + @Override + public boolean matches(Container container, Level level) { + return true; + } + + @Override + public ItemStack assemble(Container container, RegistryAccess access) { + return ItemStack.EMPTY; + } + + @Override + public boolean canCraftInDimensions(int width, int height) { + return true; + } + + @Override + public ItemStack getResultItem(RegistryAccess access) { + return ItemStack.EMPTY; + } + + @Override + public ResourceLocation getId() { + return this.recipeID; + } + + @Override + public RecipeSerializer getSerializer() { + return TFRecipes.TRANSFORMATION_SERIALIZER.get(); + } + + @Override + public RecipeType getType() { + return TFRecipes.TRANSFORM_POWDER_RECIPE.get(); + } + + public static class Serializer implements RecipeSerializer { + + @Override + public TransformPowderRecipe fromJson(ResourceLocation id, JsonObject object) { + EntityType input = ForgeRegistries.ENTITY_TYPES.getValue(ResourceLocation.tryParse(GsonHelper.getAsString(object, "from"))); + EntityType output = ForgeRegistries.ENTITY_TYPES.getValue(ResourceLocation.tryParse(GsonHelper.getAsString(object, "to"))); + boolean reversible = GsonHelper.getAsBoolean(object, "reversible"); + if (input != null && output != null) { + return new TransformPowderRecipe(id, input, output, reversible); + } + return new TransformPowderRecipe(id, EntityType.PIG, EntityType.ZOMBIFIED_PIGLIN, false); + } + + @Nullable + @Override + public TransformPowderRecipe fromNetwork(ResourceLocation id, FriendlyByteBuf buffer) { + EntityType input = buffer.readRegistryIdUnsafe(ForgeRegistries.ENTITY_TYPES); + EntityType output = buffer.readRegistryIdUnsafe(ForgeRegistries.ENTITY_TYPES); + boolean reversible = buffer.readBoolean(); + return new TransformPowderRecipe(id, input, output, reversible); + } + + @Override + public void toNetwork(FriendlyByteBuf buffer, TransformPowderRecipe recipe) { + buffer.writeRegistryIdUnsafe(ForgeRegistries.ENTITY_TYPES, recipe.input()); + buffer.writeRegistryIdUnsafe(ForgeRegistries.ENTITY_TYPES, recipe.result()); + buffer.writeBoolean(recipe.isReversible()); + } + } +} diff --git a/src/main/java/twilightforest/item/recipe/UncraftingRecipe.java b/src/main/java/twilightforest/item/recipe/UncraftingRecipe.java new file mode 100644 index 0000000000..6e17aff673 --- /dev/null +++ b/src/main/java/twilightforest/item/recipe/UncraftingRecipe.java @@ -0,0 +1,249 @@ +package twilightforest.item.recipe; + +import com.google.common.collect.Maps; +import com.google.common.collect.Sets; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonSyntaxException; +import net.minecraft.core.NonNullList; +import net.minecraft.core.RegistryAccess; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.GsonHelper; +import net.minecraft.world.inventory.CraftingContainer; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.crafting.CraftingBookCategory; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.level.Level; +import net.minecraftforge.common.crafting.IShapedRecipe; +import twilightforest.init.TFRecipes; + +import org.jetbrains.annotations.Nullable; +import java.util.Arrays; +import java.util.Map; +import java.util.Set; + +public record UncraftingRecipe(ResourceLocation recipeID, int cost, int width, int height, Ingredient ingredient, int count, NonNullList resultItems) implements IUncraftingRecipe, IShapedRecipe { + + @Override //This method is never used, but it has to be implemented + public boolean matches(CraftingContainer container, Level level) { + return false; + } + + @Override //We have to implement this method, can't really be used since we have multiple outputs + public ItemStack assemble(CraftingContainer container, RegistryAccess access) { + return ItemStack.EMPTY; + } + + @Override //We have to implement this method, returns the count just in case + public ItemStack getResultItem(RegistryAccess access) { + return new ItemStack(Items.AIR, this.count); + } + + @Override //Could probably be set to return true, since the recipe serializer doesn't let a bigger number through. + public boolean canCraftInDimensions(int width, int height) { + return (width >= this.width && height >= this.height); + } + + //Checks if the itemStack is a part of the ingredient when UncraftingMenu's getRecipesFor() method iterates through all recipes. + public boolean isItemStackAnIngredient(ItemStack itemStack) { + return Arrays.stream(this.ingredient.getItems()).anyMatch(i -> (itemStack.getItem() == i.getItem() && itemStack.getCount() >= this.getCount())); + } + + @Override + public ResourceLocation getId() { + return this.recipeID; + } + + @Override + public RecipeSerializer getSerializer() { + return TFRecipes.UNCRAFTING_SERIALIZER.get(); + } + + @Override + public RecipeType getType() { + return TFRecipes.UNCRAFTING_RECIPE.get(); + } + + @Override + public CraftingBookCategory category() { + return CraftingBookCategory.MISC; + } + + public int getCost() { + return this.cost; + } + + @Override + public int getRecipeWidth() { + return this.width; + } + + @Override + public int getRecipeHeight() { + return this.height; + } + + @Override + public NonNullList getIngredients() { + return this.resultItems; + } + + public Ingredient getIngredient() { + return this.ingredient; + } + + //Since our recipe can need multiple input items for a recipe and ingredients can't directly store count, we store it separately + public int getCount() { + return this.count; + } + + public static class Serializer implements RecipeSerializer { + /** + * This is mostly vanilla's shaped recipe serializer, with some changes made to make it work with the slightly different recipe type. + * The recipe json has inputs for "cost", which determines how many levels the recipe will cost. + * "ingredient", which is made to be an ingredient instead of an itemStack, so the recipe can have multiple input options, such as any member of an item tag. + * "count" is how many of the same item are required by the recipe, since we're dealing with ingredients and not itemStacks, we get this separately. + * "key" and "pattern", which work just like vanilla except this is output and not input, since we're uncrafting. + * Width and height get assigned automatically. + */ + @Override + public UncraftingRecipe fromJson(ResourceLocation id, JsonObject json) { + int cost = GsonHelper.getAsInt(json, "cost"); + + JsonElement jsonelement = (GsonHelper.isArrayNode(json, "ingredient") ? GsonHelper.getAsJsonArray(json, "ingredient") : GsonHelper.getAsJsonObject(json, "ingredient")); + Ingredient ingredient = Ingredient.fromJson(jsonelement); + + int count = GsonHelper.getAsInt(json, "count"); + + Map key = keyFromJson(GsonHelper.getAsJsonObject(json, "key")); + String[] pattern = shrink(patternFromJson(GsonHelper.getAsJsonArray(json, "pattern"))); + + int width = pattern[0].length(); + int height = pattern.length; + + NonNullList ingredients = dissolvePattern(pattern, key, width, height); + + return new UncraftingRecipe(id, cost, width, height, ingredient, count, ingredients); + } + + private static Map keyFromJson(JsonObject json) { + Map map = Maps.newHashMap(); + for (Map.Entry entry : json.entrySet()) { + if (entry.getKey().length() != 1) + throw new JsonSyntaxException("Invalid key entry: '" + entry.getKey() + "' is an invalid symbol (must be 1 character only)."); + if (" ".equals(entry.getKey())) + throw new JsonSyntaxException("Invalid key entry: ' ' is a reserved symbol."); + map.put(entry.getKey(), Ingredient.fromJson(entry.getValue())); + } + map.put(" ", Ingredient.EMPTY); + return map; + } + + static String[] shrink(String... prePattern) { + int i = Integer.MAX_VALUE; + int j = 0; + int k = 0; + int l = 0; + + for (int i1 = 0; i1 < prePattern.length; ++i1) { + String s = prePattern[i1]; + i = Math.min(i, firstNonSpace(s)); + int j1 = lastNonSpace(s); + j = Math.max(j, j1); + if (j1 < 0) { + if (k == i1) ++k; + ++l; + } else l = 0; + } + + if (prePattern.length == l) return new String[0]; + else { + String[] shrunk = new String[prePattern.length - l - k]; + for (int k1 = 0; k1 < shrunk.length; ++k1) shrunk[k1] = prePattern[k1 + k].substring(i, j + 1); + return shrunk; + } + } + + private static int firstNonSpace(String first) { + int i; + i = 0; + while (i < first.length() && first.charAt(i) == ' ') ++i; + return i; + } + + private static int lastNonSpace(String last) { + int i; + i = last.length() - 1; + while (i >= 0 && last.charAt(i) == ' ') --i; + return i; + } + + private static String[] patternFromJson(JsonArray pattern) { + String[] stringPattern = new String[pattern.size()]; + if (stringPattern.length > 3) { + throw new JsonSyntaxException("Invalid pattern: too many rows, 3 is maximum"); + } else if (stringPattern.length == 0) { + throw new JsonSyntaxException("Invalid pattern: empty pattern not allowed"); + } else { + for (int i = 0; i < stringPattern.length; ++i) { + String s = GsonHelper.convertToString(pattern.get(i), "pattern[" + i + "]"); + if (s.length() > 3) + throw new JsonSyntaxException("Invalid pattern: too many columns, 3 is maximum"); + if (i > 0 && stringPattern[0].length() != s.length()) + throw new JsonSyntaxException("Invalid pattern: each row must be the same width"); + stringPattern[i] = s; + } + return stringPattern; + } + } + + private static NonNullList dissolvePattern(String[] pattern, Map key, int width, int height) { + NonNullList results = NonNullList.withSize(width * height, Ingredient.EMPTY); + Set set = Sets.newHashSet(key.keySet()); + set.remove(" "); + + for (int i = 0; i < pattern.length; ++i) { + for (int j = 0; j < pattern[i].length(); ++j) { + String s = pattern[i].substring(j, j + 1); + Ingredient ingredient = key.get(s); + if (ingredient == null) + throw new JsonSyntaxException("Pattern references symbol '" + s + "' but it's not defined in the key"); + set.remove(s); + results.set(j + width * i, ingredient); + } + } + + if (!set.isEmpty()) + throw new JsonSyntaxException("Key defines symbols that aren't used in pattern: " + set); + else return results; + } + + @Nullable + @Override + public UncraftingRecipe fromNetwork(ResourceLocation id, FriendlyByteBuf buffer) { + int cost = buffer.readVarInt(); + int width = buffer.readVarInt(); + int height = buffer.readVarInt(); + Ingredient result = Ingredient.fromNetwork(buffer); + int count = buffer.readVarInt(); + NonNullList ingredients = NonNullList.withSize(width * height, Ingredient.EMPTY); + for (int k = 0; k < ingredients.size(); ++k) ingredients.set(k, Ingredient.fromNetwork(buffer)); + return new UncraftingRecipe(id, cost, width, height, result, count, ingredients); + } + + @Override + public void toNetwork(FriendlyByteBuf buffer, UncraftingRecipe recipe) { + buffer.writeVarInt(recipe.cost); + buffer.writeVarInt(recipe.width); + buffer.writeVarInt(recipe.height); + recipe.ingredient.toNetwork(buffer); + buffer.writeVarInt(recipe.count); + for (Ingredient i : recipe.resultItems) i.toNetwork(buffer); + } + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/item/recipe/package-info.java b/src/main/java/twilightforest/item/recipe/package-info.java new file mode 100644 index 0000000000..294fc2c889 --- /dev/null +++ b/src/main/java/twilightforest/item/recipe/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.item.recipe; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/loot/TFLootTables.java b/src/main/java/twilightforest/loot/TFLootTables.java new file mode 100644 index 0000000000..9ff9f67dc0 --- /dev/null +++ b/src/main/java/twilightforest/loot/TFLootTables.java @@ -0,0 +1,155 @@ +package twilightforest.loot; + +import com.google.common.collect.Sets; +import it.unimi.dsi.fastutil.objects.ObjectArrayList; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.Container; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.ChestBlock; +import net.minecraft.world.level.block.entity.RandomizableContainerBlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.LootTable; +import twilightforest.TwilightForestMod; + +import java.util.Collections; +import java.util.Set; + +public class TFLootTables { + // For easy testing: + // /give @p chest{BlockEntityTag:{LootTable:"twilightforest:all_bosses",CustomName:'{"text":"Master Loot Crate"}'}} 1 + private static final Set TF_LOOT_TABLES = Sets.newHashSet(); + public static final int DEFAULT_PLACE_FLAG = 2; + + public static final TFLootTables SMALL_HOLLOW_HILL = new TFLootTables("hill_1"); + public static final TFLootTables MEDIUM_HOLLOW_HILL = new TFLootTables("hill_2"); + public static final TFLootTables LARGE_HOLLOW_HILL = new TFLootTables("hill_3"); + public static final TFLootTables HEDGE_MAZE = new TFLootTables("hedge_maze"); + public static final TFLootTables FANCY_WELL = new TFLootTables("fancy_well"); + public static final TFLootTables WELL = new TFLootTables("well"); + public static final TFLootTables LABYRINTH_ROOM = new TFLootTables("labyrinth_room"); + public static final TFLootTables LABYRINTH_DEAD_END = new TFLootTables("labyrinth_dead_end"); + public static final TFLootTables TOWER_ROOM = new TFLootTables("tower_room"); + public static final TFLootTables TOWER_LIBRARY = new TFLootTables("tower_library"); + public static final TFLootTables BASEMENT = new TFLootTables("basement"); + public static final TFLootTables FOUNDATION_BASEMENT = new TFLootTables("foundation_basement"); + public static final TFLootTables LABYRINTH_VAULT = new TFLootTables("labyrinth_vault"); + public static final TFLootTables LABYRINTH_VAULT_JACKPOT = new TFLootTables("labyrinth_vault_jackpot"); + public static final TFLootTables DARKTOWER_CACHE = new TFLootTables("darktower_cache"); + public static final TFLootTables DARKTOWER_KEY = new TFLootTables("darktower_key"); + public static final TFLootTables DARKTOWER_BOSS = new TFLootTables("darktower_boss"); + public static final TFLootTables TREE_CACHE = new TFLootTables("tree_cache"); + public static final TFLootTables STRONGHOLD_CACHE = new TFLootTables("stronghold_cache"); + public static final TFLootTables STRONGHOLD_ROOM = new TFLootTables("stronghold_room"); + public static final TFLootTables STRONGHOLD_BOSS = new TFLootTables("stronghold_boss"); + public static final TFLootTables AURORA_CACHE = new TFLootTables("aurora_cache"); + public static final TFLootTables AURORA_ROOM = new TFLootTables("aurora_room"); +// public static final TFLootTables AURORA_BOSS = new TFLootTables("aurora_boss"); //unused + public static final TFLootTables TROLL_GARDEN = new TFLootTables("troll_garden"); + public static final TFLootTables TROLL_VAULT = new TFLootTables("troll_vault"); + public static final TFLootTables TROLL_VAULT_WITH_LAMP = new TFLootTables("troll_vault_with_lamp"); + public static final TFLootTables GRAVEYARD = new TFLootTables("graveyard"); + public static final TFLootTables QUEST_GROVE = new TFLootTables("quest_grove_dropper"); + public static final TFLootTables USELESS_LOOT = new TFLootTables("useless"); + + public static final ResourceLocation BIGHORN_SHEEP_WHITE = register("entities/bighorn_sheep/white"); + public static final ResourceLocation BIGHORN_SHEEP_ORANGE = register("entities/bighorn_sheep/orange"); + public static final ResourceLocation BIGHORN_SHEEP_MAGENTA = register("entities/bighorn_sheep/magenta"); + public static final ResourceLocation BIGHORN_SHEEP_LIGHT_BLUE = register("entities/bighorn_sheep/light_blue"); + public static final ResourceLocation BIGHORN_SHEEP_YELLOW = register("entities/bighorn_sheep/yellow"); + public static final ResourceLocation BIGHORN_SHEEP_LIME = register("entities/bighorn_sheep/lime"); + public static final ResourceLocation BIGHORN_SHEEP_PINK = register("entities/bighorn_sheep/pink"); + public static final ResourceLocation BIGHORN_SHEEP_GRAY = register("entities/bighorn_sheep/gray"); + public static final ResourceLocation BIGHORN_SHEEP_LIGHT_GRAY = register("entities/bighorn_sheep/light_gray"); + public static final ResourceLocation BIGHORN_SHEEP_CYAN = register("entities/bighorn_sheep/cyan"); + public static final ResourceLocation BIGHORN_SHEEP_PURPLE = register("entities/bighorn_sheep/purple"); + public static final ResourceLocation BIGHORN_SHEEP_BLUE = register("entities/bighorn_sheep/blue"); + public static final ResourceLocation BIGHORN_SHEEP_BROWN = register("entities/bighorn_sheep/brown"); + public static final ResourceLocation BIGHORN_SHEEP_GREEN = register("entities/bighorn_sheep/green"); + public static final ResourceLocation BIGHORN_SHEEP_RED = register("entities/bighorn_sheep/red"); + public static final ResourceLocation BIGHORN_SHEEP_BLACK = register("entities/bighorn_sheep/black"); + + public static final ResourceLocation QUESTING_RAM_REWARDS = register("entities/questing_ram_rewards"); + public static final ResourceLocation DEATH_TOME_HURT = register("entities/death_tome_hurt"); + public static final ResourceLocation DEATH_TOME_BOOKS = register("entities/death_tome_books"); + + public static final ResourceLocation CICADA_SQUISH_DROPS = register("blocks/cicada_squish"); + public static final ResourceLocation FIREFLY_SQUISH_DROPS = register("blocks/firefly_squish"); + public static final ResourceLocation MOONWORM_SQUISH_DROPS = register("blocks/moonworm_squish"); + + //public static final ResourceLocation ALL_BOSSES = register("entities/all_bosses"); + + public final ResourceLocation lootTable; + + private TFLootTables(String path) { + this.lootTable = TwilightForestMod.prefix(String.format("chests/%s", path)); + } + + public void generateChest(WorldGenLevel world, BlockPos pos, Direction dir, boolean trapped) { + this.generateLootContainer(world, pos, (trapped ? Blocks.TRAPPED_CHEST : Blocks.CHEST).defaultBlockState().setValue(ChestBlock.FACING, dir), DEFAULT_PLACE_FLAG); + } + + public void generateLootContainer(WorldGenLevel world, BlockPos pos, BlockState state, int flags) { + world.setBlock(pos, state, flags); + + this.generateChestContents(world, pos); + } + + public void generateLootContainer(LevelAccessor world, BlockPos pos, BlockState state, int flags, long seed) { + world.setBlock(pos, state, flags); + + this.generateChestContents(world, pos, seed); + } + + public void generateChestContents(WorldGenLevel world, BlockPos pos) { + this.generateChestContents(world, pos, world.getSeed() * pos.getX() + pos.getY() ^ pos.getZ()); + } + + public void generateChestContents(LevelAccessor world, BlockPos pos, long seed) { + if (world.getBlockEntity(pos) instanceof RandomizableContainerBlockEntity lootContainer) + lootContainer.setLootTable(this.lootTable, seed); + } + + private static ResourceLocation register(String id) { + return register(TwilightForestMod.prefix(id)); + } + + private static ResourceLocation register(ResourceLocation id) { + if (TF_LOOT_TABLES.add(id)) { + return id; + } else { + throw new IllegalArgumentException(id + " is already a registered built-in loot table"); + } + } + + public static void entityDropsIntoContainer(LivingEntity entity, LootContext lootContext, BlockState blockContaining, BlockPos placement) { + if (entity.getLevel() instanceof ServerLevel serverLevel + && serverLevel.setBlock(placement, blockContaining, DEFAULT_PLACE_FLAG) + && serverLevel.getBlockEntity(placement) instanceof Container container) { + LootTable table = serverLevel.getServer().getLootTables().get(entity.getLootTable()); + ObjectArrayList stacks = table.getRandomItems(lootContext); + table.fill(container, lootContext); + //if our loot stack size is bigger than the chest, drop everything else outside of it. Dont want to lose any loot now do we? + if (stacks.size() > 27) { + for (ItemStack stack : stacks.subList(28, stacks.size())) { + ItemEntity item = new ItemEntity(serverLevel, placement.above().getX(), placement.above().getY(), placement.above().getZ(), stack); + item.setExtendedLifetime(); + item.setNoPickUpDelay(); + serverLevel.addFreshEntity(item); + } + } + } + } + + public static Set allBuiltin() { + return Collections.unmodifiableSet(TF_LOOT_TABLES); + } +} diff --git a/src/main/java/twilightforest/loot/conditions/IsMinion.java b/src/main/java/twilightforest/loot/conditions/IsMinion.java new file mode 100644 index 0000000000..e404dffd44 --- /dev/null +++ b/src/main/java/twilightforest/loot/conditions/IsMinion.java @@ -0,0 +1,44 @@ +package twilightforest.loot.conditions; + +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonObject; +import com.google.gson.JsonSerializationContext; +import net.minecraft.util.GsonHelper; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.Serializer; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import net.minecraft.world.level.storage.loot.predicates.LootItemCondition; +import net.minecraft.world.level.storage.loot.predicates.LootItemConditionType; +import twilightforest.entity.monster.CarminiteGhastling; +import twilightforest.init.TFLoot; + +import javax.annotation.Nonnull; + +public record IsMinion(boolean inverse) implements LootItemCondition { + + @Override + public LootItemConditionType getType() { + return TFLoot.IS_MINION.get(); + } + + @Override + public boolean test(@Nonnull LootContext context) { + return context.getParamOrNull(LootContextParams.THIS_ENTITY) instanceof CarminiteGhastling ghastling && ghastling.isMinion() == !inverse; + } + + public static Builder builder(boolean inverse) { + return () -> new IsMinion(inverse); + } + + public static class ConditionSerializer implements Serializer { + @Override + public void serialize(JsonObject json, IsMinion value, JsonSerializationContext context) { + json.addProperty("inverse", value.inverse); + } + + @Override + public IsMinion deserialize(JsonObject json, JsonDeserializationContext context) { + return new IsMinion(GsonHelper.getAsBoolean(json, "inverse", false)); + } + } +} diff --git a/src/main/java/twilightforest/loot/conditions/ModExists.java b/src/main/java/twilightforest/loot/conditions/ModExists.java new file mode 100644 index 0000000000..a8fc4bf7bf --- /dev/null +++ b/src/main/java/twilightforest/loot/conditions/ModExists.java @@ -0,0 +1,50 @@ +package twilightforest.loot.conditions; + +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonObject; +import com.google.gson.JsonSerializationContext; +import net.minecraft.util.GsonHelper; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.Serializer; +import net.minecraft.world.level.storage.loot.predicates.LootItemCondition; +import net.minecraft.world.level.storage.loot.predicates.LootItemConditionType; +import net.minecraftforge.fml.ModList; +import twilightforest.init.TFLoot; + +// Loot condition for checking if a mod exists. +public class ModExists implements LootItemCondition { + + private final boolean exists; + private final String modID; + + public ModExists(String modID) { + this.exists = ModList.get().isLoaded(modID); + this.modID = modID; + } + + @Override + public LootItemConditionType getType() { + return TFLoot.MOD_EXISTS.get(); + } + + @Override + public boolean test(LootContext context) { + return this.exists; + } + + public static LootItemCondition.Builder builder(String modid) { + return () -> new ModExists(modid); + } + + public static class ConditionSerializer implements Serializer { + @Override + public void serialize(JsonObject json, ModExists value, JsonSerializationContext context) { + json.addProperty("mod_id", value.modID); + } + + @Override + public ModExists deserialize(JsonObject json, JsonDeserializationContext context) { + return new ModExists(GsonHelper.getAsString(json, "mod_id")); + } + } +} diff --git a/src/main/java/twilightforest/loot/conditions/package-info.java b/src/main/java/twilightforest/loot/conditions/package-info.java new file mode 100644 index 0000000000..31b76204b6 --- /dev/null +++ b/src/main/java/twilightforest/loot/conditions/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.loot.conditions; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/loot/functions/ModItemSwap.java b/src/main/java/twilightforest/loot/functions/ModItemSwap.java new file mode 100644 index 0000000000..f3e81ed138 --- /dev/null +++ b/src/main/java/twilightforest/loot/functions/ModItemSwap.java @@ -0,0 +1,99 @@ +package twilightforest.loot.functions; + +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonObject; +import com.google.gson.JsonSerializationContext; +import com.google.gson.JsonSyntaxException; +import net.minecraft.util.GsonHelper; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.functions.LootItemConditionalFunction; +import net.minecraft.world.level.storage.loot.functions.LootItemFunction; +import net.minecraft.world.level.storage.loot.functions.LootItemFunctionType; +import net.minecraft.world.level.storage.loot.predicates.LootItemCondition; +import net.minecraftforge.fml.ModList; +import net.minecraftforge.registries.ForgeRegistries; +import twilightforest.init.TFLoot; + +// Loot condition for checking that if a mod exists, then swap original item with its deserialized item. +public class ModItemSwap extends LootItemConditionalFunction { + + private final Item item; + private final Item oldItem; + private final boolean success; + + protected ModItemSwap(LootItemCondition[] conditions, Item item, Item old, boolean success) { + super(conditions); + this.item = item; + this.oldItem = old; + this.success = success; + } + + @Override + public LootItemFunctionType getType() { + return TFLoot.ITEM_OR_DEFAULT.get(); + } + + @Override + public ItemStack run(ItemStack stack, LootContext context) { + ItemStack newStack = new ItemStack(this.item, stack.getCount()); + + newStack.setTag(stack.getTag()); + + return newStack; + } + + public static ModItemSwap.Builder builder() { + return new ModItemSwap.Builder(); + } + + public static class Builder extends LootItemConditionalFunction.Builder { + private String idtocheck; + private Item item; + private Item oldItem; + + protected ModItemSwap.Builder getThis() { + return this; + } + + public ModItemSwap.Builder apply(String modid, Item item, Item old) { + this.idtocheck = modid; + this.item = item; + this.oldItem = old; + return this; + } + + public LootItemFunction build() { + return new ModItemSwap(this.getConditions(), this.item, this.oldItem, ModList.get().isLoaded(this.idtocheck)); + } + } + + public static class Serializer extends LootItemConditionalFunction.Serializer { + + @Override + public void serialize(JsonObject object, ModItemSwap function, JsonSerializationContext serializationContext) { + if (function.success) + object.addProperty("item", ForgeRegistries.ITEMS.getKey(function.item).toString()); + else + object.addProperty("default", ForgeRegistries.ITEMS.getKey(function.item).toString()); + object.addProperty("default", ForgeRegistries.ITEMS.getKey(function.oldItem).toString()); + } + + @Override + public ModItemSwap deserialize(JsonObject object, JsonDeserializationContext deserializationContext, LootItemCondition[] conditions) { + Item item; + boolean success; + + try { + item = GsonHelper.getAsItem(object, "item"); + success = true; + } catch (JsonSyntaxException e) { + item = GsonHelper.getAsItem(object, "default"); + success = false; + } + + return new ModItemSwap(conditions, item, GsonHelper.getAsItem(object, "default"), success); + } + } +} diff --git a/src/main/java/twilightforest/loot/functions/package-info.java b/src/main/java/twilightforest/loot/functions/package-info.java new file mode 100644 index 0000000000..fb0d59d490 --- /dev/null +++ b/src/main/java/twilightforest/loot/functions/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.loot.functions; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/loot/modifiers/FieryToolSmeltingModifier.java b/src/main/java/twilightforest/loot/modifiers/FieryToolSmeltingModifier.java new file mode 100644 index 0000000000..e713508052 --- /dev/null +++ b/src/main/java/twilightforest/loot/modifiers/FieryToolSmeltingModifier.java @@ -0,0 +1,41 @@ +package twilightforest.loot.modifiers; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import it.unimi.dsi.fastutil.objects.ObjectArrayList; +import net.minecraft.world.SimpleContainer; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.item.crafting.SmeltingRecipe; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.predicates.LootItemCondition; +import net.minecraftforge.common.loot.IGlobalLootModifier; +import net.minecraftforge.common.loot.LootModifier; +import net.minecraftforge.items.ItemHandlerHelper; +import org.jetbrains.annotations.NotNull; + +public class FieryToolSmeltingModifier extends LootModifier { + public static final Codec CODEC = RecordCodecBuilder.create(inst -> LootModifier.codecStart(inst).apply(inst, FieryToolSmeltingModifier::new)); + + public FieryToolSmeltingModifier(LootItemCondition[] conditions) { + super(conditions); + } + + @Override + protected @NotNull ObjectArrayList doApply(ObjectArrayList generatedLoot, LootContext context) { + ObjectArrayList newLoot = new ObjectArrayList<>(); + generatedLoot.forEach((stack) -> newLoot.add( + context.getLevel().getRecipeManager() + .getRecipeFor(RecipeType.SMELTING, new SimpleContainer(stack), context.getLevel()) + .map(recipe -> recipe.getResultItem(context.getLevel().registryAccess())) + .filter(itemStack -> !itemStack.isEmpty()) + .map(itemStack -> ItemHandlerHelper.copyStackWithSize(itemStack, stack.getCount() * itemStack.getCount())) + .orElse(stack))); + return newLoot; + } + + @Override + public Codec codec() { + return FieryToolSmeltingModifier.CODEC; + } +} diff --git a/src/main/java/twilightforest/loot/modifiers/GiantToolGroupingModifier.java b/src/main/java/twilightforest/loot/modifiers/GiantToolGroupingModifier.java new file mode 100644 index 0000000000..60bb96c775 --- /dev/null +++ b/src/main/java/twilightforest/loot/modifiers/GiantToolGroupingModifier.java @@ -0,0 +1,120 @@ +package twilightforest.loot.modifiers; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import it.unimi.dsi.fastutil.objects.ObjectArrayList; +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.predicates.LootItemCondition; +import net.minecraftforge.common.ForgeHooks; +import net.minecraftforge.common.loot.IGlobalLootModifier; +import net.minecraftforge.common.loot.LootModifier; +import net.minecraftforge.event.level.BlockEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; +import org.jetbrains.annotations.NotNull; +import twilightforest.TwilightForestMod; +import twilightforest.block.GiantBlock; +import twilightforest.capabilities.CapabilityList; +import twilightforest.capabilities.giant_pick.GiantPickMineCapability; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFItems; + +//FIXME I simply migrated this out of TFEventListener, it somehow needs to be redone in a more sane way. +@Mod.EventBusSubscriber(modid = TwilightForestMod.ID) +public class GiantToolGroupingModifier extends LootModifier { + public static final Codec CODEC = RecordCodecBuilder.create(inst -> LootModifier.codecStart(inst).apply(inst, GiantToolGroupingModifier::new)); + + private static boolean isBreakingWithGiantPick = false; + private static boolean shouldMakeGiantCobble = false; + private static int amountOfCobbleToReplace = 0; + + public GiantToolGroupingModifier(LootItemCondition[] conditions) { + super(conditions); + } + + @Override + protected @NotNull ObjectArrayList doApply(ObjectArrayList generatedLoot, LootContext context) { + ObjectArrayList newLoot = new ObjectArrayList<>(); + boolean flag = false; + if (shouldMakeGiantCobble && generatedLoot.size() > 0) { + // turn the next 64 cobblestone drops into one giant cobble + if (generatedLoot.get(0).getItem() == Item.byBlock(Blocks.COBBLESTONE)) { + generatedLoot.remove(0); + if (amountOfCobbleToReplace == 64) { + newLoot.add(new ItemStack(TFBlocks.GIANT_COBBLESTONE.get())); + flag = true; + } + amountOfCobbleToReplace--; + if (amountOfCobbleToReplace <= 0) { + shouldMakeGiantCobble = false; + } + } + } + return flag ? newLoot : generatedLoot; + } + + @Override + public Codec codec() { + return GiantToolGroupingModifier.CODEC; + } + + @SubscribeEvent + public static void breakBlock(BlockEvent.BreakEvent event) { + Player player = event.getPlayer(); + BlockPos pos = event.getPos(); + BlockState state = event.getState(); + + if (!isBreakingWithGiantPick && canHarvestWithGiantPick(player, state)) { + + isBreakingWithGiantPick = true; + + // pre-check for cobble! + Item cobbleItem = Blocks.COBBLESTONE.asItem(); + boolean allCobble = state.getBlock().asItem() == cobbleItem; + + if (allCobble) { + for (BlockPos dPos : GiantBlock.getVolume(pos)) { + if (dPos.equals(pos)) + continue; + BlockState stateThere = event.getLevel().getBlockState(dPos); + if (stateThere.getBlock().asItem() != cobbleItem) { + allCobble = false; + break; + } + } + } + + if (allCobble && !player.getAbilities().instabuild) { + shouldMakeGiantCobble = true; + amountOfCobbleToReplace = 64; + } else { + shouldMakeGiantCobble = false; + amountOfCobbleToReplace = 0; + } + + // break all nearby blocks + if (player instanceof ServerPlayer playerMP) { + for (BlockPos dPos : GiantBlock.getVolume(pos)) { + if (!dPos.equals(pos) && state.getBlock() == event.getLevel().getBlockState(dPos).getBlock()) { + // try to break that block too! + playerMP.gameMode.destroyBlock(dPos); + } + } + } + + isBreakingWithGiantPick = false; + } + } + + private static boolean canHarvestWithGiantPick(Player player, BlockState state) { + return player.getMainHandItem().is(TFItems.GIANT_PICKAXE.get()) && ForgeHooks.isCorrectToolForDrops(state, player) + && player.getCapability(CapabilityList.GIANT_PICK_MINE).map(GiantPickMineCapability::getMining).orElse(1L) == player.level.getGameTime(); + } +} diff --git a/src/main/java/twilightforest/loot/modifiers/package-info.java b/src/main/java/twilightforest/loot/modifiers/package-info.java new file mode 100644 index 0000000000..3a94642b48 --- /dev/null +++ b/src/main/java/twilightforest/loot/modifiers/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.loot.modifiers; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/loot/package-info.java b/src/main/java/twilightforest/loot/package-info.java new file mode 100644 index 0000000000..9d5d82d14d --- /dev/null +++ b/src/main/java/twilightforest/loot/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.loot; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/network/AreaProtectionPacket.java b/src/main/java/twilightforest/network/AreaProtectionPacket.java new file mode 100644 index 0000000000..144088cbbd --- /dev/null +++ b/src/main/java/twilightforest/network/AreaProtectionPacket.java @@ -0,0 +1,91 @@ +package twilightforest.network; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.core.BlockPos; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraftforge.network.NetworkEvent; +import twilightforest.entity.ProtectionBox; +import twilightforest.init.TFParticleType; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Supplier; + +public class AreaProtectionPacket { + + private final List sbb; + private final BlockPos pos; + + public AreaProtectionPacket(List sbb, BlockPos pos) { + this.sbb = sbb; + this.pos = pos; + } + + public AreaProtectionPacket(FriendlyByteBuf buf) { + this.sbb = new ArrayList<>(); + int len = buf.readInt(); + for (int i = 0; i < len; i++) { + this.sbb.add(new BoundingBox(buf.readInt(), buf.readInt(), buf.readInt(), buf.readInt(), buf.readInt(), buf.readInt())); + } + this.pos = buf.readBlockPos(); + } + + public void encode(FriendlyByteBuf buf) { + buf.writeInt(this.sbb.size()); + this.sbb.forEach(box -> { + buf.writeInt(box.minX()); + buf.writeInt(box.minY()); + buf.writeInt(box.minZ()); + buf.writeInt(box.maxX()); + buf.writeInt(box.maxY()); + buf.writeInt(box.maxZ()); + }); + buf.writeBlockPos(this.pos); + } + + public static class Handler { + + @SuppressWarnings("Convert2Lambda") + public static boolean onMessage(AreaProtectionPacket message, Supplier ctx) { + ctx.get().enqueueWork(new Runnable() { + @Override + public void run() { + ClientLevel world = Minecraft.getInstance().level; + message.sbb.forEach(box -> addProtectionBox(world, box)); + + for (int i = 0; i < 20; i++) { + + double vx = world.getRandom().nextGaussian() * 0.02D; + double vy = world.getRandom().nextGaussian() * 0.02D; + double vz = world.getRandom().nextGaussian() * 0.02D; + + double x = message.pos.getX() + 0.5D + world.getRandom().nextFloat() - world.getRandom().nextFloat(); + double y = message.pos.getY() + 0.5D + world.getRandom().nextFloat() - world.getRandom().nextFloat(); + double z = message.pos.getZ() + 0.5D + world.getRandom().nextFloat() - world.getRandom().nextFloat(); + + world.addParticle(TFParticleType.PROTECTION.get(), x, y, z, vx, vy, vz); + } + } + }); + ctx.get().setPacketHandled(true); + return true; + } + + static void addProtectionBox(ClientLevel world, BoundingBox sbb) { + + for (Entity entity : world.entitiesForRendering()) { + if (entity instanceof ProtectionBox box) { + if (box.lifeTime > 0 && box.matches(sbb)) { + box.resetLifetime(); + return; + } + } + } + + world.putNonPlayerEntity(0, new ProtectionBox(world, sbb)); + } + } +} diff --git a/src/main/java/twilightforest/network/ChangeBiomePacket.java b/src/main/java/twilightforest/network/ChangeBiomePacket.java new file mode 100644 index 0000000000..606e5f735c --- /dev/null +++ b/src/main/java/twilightforest/network/ChangeBiomePacket.java @@ -0,0 +1,78 @@ +package twilightforest.network; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Holder; +import net.minecraft.core.QuartPos; +import net.minecraft.core.Registry; +import net.minecraft.core.SectionPos; +import net.minecraft.core.registries.Registries; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceKey; +import net.minecraft.util.Mth; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.chunk.LevelChunk; +import net.minecraft.world.level.chunk.LevelChunkSection; +import net.minecraft.world.level.chunk.PalettedContainer; +import net.minecraftforge.network.NetworkEvent; + +import java.util.function.Supplier; + +public class ChangeBiomePacket { + private final BlockPos pos; + private final ResourceKey biomeId; + + public ChangeBiomePacket(BlockPos pos, ResourceKey id) { + this.pos = pos; + this.biomeId = id; + } + + public ChangeBiomePacket(FriendlyByteBuf buf) { + this.pos = new BlockPos(buf.readInt(), 0, buf.readInt()); + this.biomeId = ResourceKey.create(Registries.BIOME, buf.readResourceLocation()); + } + + public void encode(FriendlyByteBuf buf) { + buf.writeInt(this.pos.getX()); + buf.writeInt(this.pos.getZ()); + buf.writeResourceLocation(this.biomeId.location()); + } + + public static class Handler { + + @SuppressWarnings("Convert2Lambda") + public static boolean onMessage(ChangeBiomePacket message, Supplier ctx) { + ctx.get().enqueueWork(new Runnable() { + @Override + public void run() { + ClientLevel world = Minecraft.getInstance().level; + LevelChunk chunkAt = (LevelChunk) world.getChunk(message.pos); + + Holder biome = world.registryAccess().registryOrThrow(Registries.BIOME).getHolderOrThrow(message.biomeId); + + int minY = QuartPos.fromBlock(world.getMinBuildHeight()); + int maxY = minY + QuartPos.fromBlock(world.getHeight()) - 1; + + int x = QuartPos.fromBlock(message.pos.getX()); + int z = QuartPos.fromBlock(message.pos.getZ()); + + for (LevelChunkSection section : chunkAt.getSections()) { + for (int sy = 0; sy < 16; sy += 4) { + int y = Mth.clamp(QuartPos.fromBlock(section.bottomBlockY() + sy), minY, maxY); + if (section.getBiomes() instanceof PalettedContainer> container) + container.set(x & 3, y & 3, z & 3, biome); + SectionPos pos = SectionPos.of(message.pos.getX() >> 4, (section.bottomBlockY() >> 4) + sy, message.pos.getZ() >> 4); + world.setSectionDirtyWithNeighbors(pos.x(), pos.y(), pos.z()); + } + } + world.onChunkLoaded(new ChunkPos(message.pos)); + } + }); + + ctx.get().setPacketHandled(true); + return true; + } + } +} diff --git a/src/main/java/twilightforest/network/CreateMovingCicadaSoundPacket.java b/src/main/java/twilightforest/network/CreateMovingCicadaSoundPacket.java new file mode 100644 index 0000000000..4900239559 --- /dev/null +++ b/src/main/java/twilightforest/network/CreateMovingCicadaSoundPacket.java @@ -0,0 +1,46 @@ +package twilightforest.network; + +import net.minecraft.client.Minecraft; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraftforge.network.NetworkEvent; +import twilightforest.client.MovingCicadaSoundInstance; + +import java.util.function.Supplier; + +public class CreateMovingCicadaSoundPacket { + + private final int entityID; + + public CreateMovingCicadaSoundPacket(int id) { + this.entityID = id; + } + + public CreateMovingCicadaSoundPacket(FriendlyByteBuf buf) { + this.entityID = buf.readInt(); + } + + public void encode(FriendlyByteBuf buf) { + buf.writeInt(this.entityID); + } + + public static class Handler { + + @SuppressWarnings("Convert2Lambda") + public static boolean onMessage(CreateMovingCicadaSoundPacket message, Supplier ctx) { + ctx.get().enqueueWork(new Runnable() { + @Override + public void run() { + Entity entity = Minecraft.getInstance().level.getEntity(message.entityID); + if (entity instanceof LivingEntity living) { + Minecraft.getInstance().getSoundManager().queueTickingSound(new MovingCicadaSoundInstance(living)); + } + } + }); + + ctx.get().setPacketHandled(true); + return true; + } + } +} diff --git a/src/main/java/twilightforest/network/EnforceProgressionStatusPacket.java b/src/main/java/twilightforest/network/EnforceProgressionStatusPacket.java new file mode 100644 index 0000000000..3bf0afaf73 --- /dev/null +++ b/src/main/java/twilightforest/network/EnforceProgressionStatusPacket.java @@ -0,0 +1,35 @@ +package twilightforest.network; + +import net.minecraft.client.Minecraft; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraftforge.network.NetworkEvent; +import twilightforest.TwilightForestMod; + +import java.util.function.Supplier; + +public class EnforceProgressionStatusPacket { + + private final boolean enforce; + + public EnforceProgressionStatusPacket(FriendlyByteBuf buf) { + this.enforce = buf.readBoolean(); + } + + public EnforceProgressionStatusPacket(boolean enforce) { + this.enforce = enforce; + } + + public void encode(FriendlyByteBuf buf) { + buf.writeBoolean(this.enforce); + } + + public static class Handler { + + public static boolean onMessage(EnforceProgressionStatusPacket message, Supplier ctx) { + ctx.get().enqueueWork(() -> + Minecraft.getInstance().level.getGameRules().getRule(TwilightForestMod.ENFORCED_PROGRESSION_RULE).set(message.enforce, null)); + ctx.get().setPacketHandled(true); + return true; + } + } +} diff --git a/src/main/java/twilightforest/network/MagicMapPacket.java b/src/main/java/twilightforest/network/MagicMapPacket.java new file mode 100644 index 0000000000..26b1cc9f9c --- /dev/null +++ b/src/main/java/twilightforest/network/MagicMapPacket.java @@ -0,0 +1,79 @@ +package twilightforest.network; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.MapRenderer; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.protocol.game.ClientboundMapItemDataPacket; +import net.minecraft.world.level.saveddata.maps.MapDecoration; +import net.minecraftforge.network.NetworkEvent; +import twilightforest.TFMagicMapData; +import twilightforest.item.MagicMapItem; + +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.function.Supplier; + +// Rewraps vanilla SPacketMaps to properly expose our custom decorations +public class MagicMapPacket { + private final byte[] featureData; + private final ClientboundMapItemDataPacket inner; + + public MagicMapPacket(TFMagicMapData mapData, ClientboundMapItemDataPacket inner) { + this.featureData = mapData.serializeFeatures(); + this.inner = inner; + } + + public MagicMapPacket(FriendlyByteBuf buf) { + this.featureData = buf.readByteArray(); + this.inner = new ClientboundMapItemDataPacket(buf); + } + + public void encode(FriendlyByteBuf buf) { + buf.writeByteArray(this.featureData); + this.inner.write(buf); + } + + public static class Handler { + + @SuppressWarnings("Convert2Lambda") + public static boolean onMessage(MagicMapPacket message, Supplier ctx) { + ctx.get().enqueueWork(new Runnable() { + @Override + public void run() { + // [VanillaCopy] ClientPlayNetHandler#handleMaps with our own mapdatas + MapRenderer mapitemrenderer = Minecraft.getInstance().gameRenderer.getMapRenderer(); + String s = MagicMapItem.getMapName(message.inner.getMapId()); + TFMagicMapData mapdata = TFMagicMapData.getMagicMapData(Minecraft.getInstance().level, s); + if (mapdata == null) { + mapdata = new TFMagicMapData(0, 0, message.inner.getScale(), false, false, message.inner.isLocked(), Minecraft.getInstance().level.dimension()); + TFMagicMapData.registerMagicMapData(Minecraft.getInstance().level, mapdata, s); + } + + message.inner.applyToMap(mapdata); + + // TF - handle custom decorations + { + mapdata.deserializeFeatures(message.featureData); + + // Cheat and put tfDecorations into main collection so they are called by renderer + // However, ensure they come before vanilla's markers, so player markers go above feature markers. + Map saveVanilla = new LinkedHashMap<>(mapdata.decorations); + mapdata.decorations.clear(); + + for (TFMagicMapData.TFMapDecoration tfDecor : mapdata.tfDecorations) { + mapdata.decorations.put(tfDecor.toString(), tfDecor); + } + + mapdata.decorations.putAll(saveVanilla); + } + + mapitemrenderer.update(message.inner.getMapId(), mapdata); + } + }); + + ctx.get().setPacketHandled(true); + return true; + } + } + +} diff --git a/src/main/java/twilightforest/network/MazeMapPacket.java b/src/main/java/twilightforest/network/MazeMapPacket.java new file mode 100644 index 0000000000..c39b5ea228 --- /dev/null +++ b/src/main/java/twilightforest/network/MazeMapPacket.java @@ -0,0 +1,57 @@ +package twilightforest.network; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.MapRenderer; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.protocol.game.ClientboundMapItemDataPacket; +import net.minecraftforge.network.NetworkEvent; +import twilightforest.TFMazeMapData; +import twilightforest.item.MazeMapItem; + +import java.util.function.Supplier; + +/** + * Vanilla's SPacketMaps handler looks for and loads the vanilla MapData instances. + * We rewrap the packet here in order to load our own MapData instances properly. + */ +public class MazeMapPacket { + + private final ClientboundMapItemDataPacket inner; + + public MazeMapPacket(ClientboundMapItemDataPacket inner) { + this.inner = inner; + } + + public MazeMapPacket(FriendlyByteBuf buf) { + this.inner = new ClientboundMapItemDataPacket(buf); + } + + public void encode(FriendlyByteBuf buf) { + this.inner.write(buf); + } + + public static class Handler { + + @SuppressWarnings("Convert2Lambda") + public static boolean onMessage(MazeMapPacket message, Supplier ctx) { + ctx.get().enqueueWork(new Runnable() { + @Override + public void run() { + // [VanillaCopy] ClientPlayNetHandler#handleMaps with our own mapdatas + MapRenderer mapitemrenderer = Minecraft.getInstance().gameRenderer.getMapRenderer(); + String s = MazeMapItem.getMapName(message.inner.getMapId()); + TFMazeMapData mapdata = TFMazeMapData.getMazeMapData(Minecraft.getInstance().level, s); + if (mapdata == null) { + mapdata = new TFMazeMapData(0, 0, message.inner.getScale(), false, false, message.inner.isLocked(), Minecraft.getInstance().level.dimension()); + TFMazeMapData.registerMazeMapData(Minecraft.getInstance().level, mapdata, s); + } + + message.inner.applyToMap(mapdata); + mapitemrenderer.update(message.inner.getMapId(), mapdata); + } + }); + ctx.get().setPacketHandled(true); + return true; + } + } +} diff --git a/src/main/java/twilightforest/network/MissingAdvancementToastPacket.java b/src/main/java/twilightforest/network/MissingAdvancementToastPacket.java new file mode 100644 index 0000000000..54e128b599 --- /dev/null +++ b/src/main/java/twilightforest/network/MissingAdvancementToastPacket.java @@ -0,0 +1,44 @@ +package twilightforest.network; + +import net.minecraft.client.Minecraft; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.network.NetworkEvent; +import twilightforest.client.MissingAdvancementToast; + +import java.util.function.Supplier; + +public class MissingAdvancementToastPacket { + private final Component title; + private final ItemStack icon; + + public MissingAdvancementToastPacket(Component title, ItemStack icon) { + this.title = title; + this.icon = icon; + } + + public MissingAdvancementToastPacket(FriendlyByteBuf buf) { + this.title = buf.readComponent(); + this.icon = buf.readItem(); + } + + public void encode(FriendlyByteBuf buf) { + buf.writeComponent(this.title); + buf.writeItem(this.icon); + } + + public static class Handler { + @SuppressWarnings("Convert2Lambda") + public static boolean onMessage(MissingAdvancementToastPacket packet, Supplier ctx) { + ctx.get().enqueueWork(new Runnable() { + @Override + public void run() { + Minecraft.getInstance().getToasts().addToast(new MissingAdvancementToast(packet.title, packet.icon)); + } + }); + ctx.get().setPacketHandled(true); + return true; + } + } +} diff --git a/src/main/java/twilightforest/network/ParticlePacket.java b/src/main/java/twilightforest/network/ParticlePacket.java new file mode 100644 index 0000000000..8a7b7870fc --- /dev/null +++ b/src/main/java/twilightforest/network/ParticlePacket.java @@ -0,0 +1,82 @@ +package twilightforest.network; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.core.Registry; +import net.minecraft.core.particles.ParticleOptions; +import net.minecraft.core.particles.ParticleType; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.core.registries.Registries; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.network.NetworkEvent; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Supplier; + +public class ParticlePacket { + private final List queuedParticles = new ArrayList<>(); + + public ParticlePacket() { + } + + @SuppressWarnings("deprecation") + public ParticlePacket(FriendlyByteBuf buf) { + int size = buf.readInt(); + for (int i = 0; i < size; i++) { + ParticleType type = BuiltInRegistries.PARTICLE_TYPE.byId(buf.readInt()); + if (type == null) + break; // Fail silently and end execution entirely. Due to Type serialization we now have completely unknown data in the pipeline without any way to safely read it all + this.queuedParticles.add(new QueuedParticle(readParticle(type, buf), buf.readBoolean(), buf.readDouble(), buf.readDouble(), buf.readDouble(), buf.readDouble(), buf.readDouble(), buf.readDouble())); + } + } + + private T readParticle(ParticleType particleType, FriendlyByteBuf buf) { + return particleType.getDeserializer().fromNetwork(particleType, buf); + } + + @SuppressWarnings("deprecation") + public void encode(FriendlyByteBuf buf) { + buf.writeInt(this.queuedParticles.size()); + for (QueuedParticle queuedParticle : this.queuedParticles) { + int d = BuiltInRegistries.PARTICLE_TYPE.getId(queuedParticle.particleOptions.getType()); + buf.writeInt(d); + queuedParticle.particleOptions.writeToNetwork(buf); + buf.writeBoolean(queuedParticle.b); + buf.writeDouble(queuedParticle.x); + buf.writeDouble(queuedParticle.y); + buf.writeDouble(queuedParticle.z); + buf.writeDouble(queuedParticle.x2); + buf.writeDouble(queuedParticle.y2); + buf.writeDouble(queuedParticle.z2); + } + } + + public void queueParticle(ParticleOptions particleOptions, boolean b, double x, double y, double z, double x2, double y2, double z2) { + this.queuedParticles.add(new QueuedParticle(particleOptions, b, x, y, z, x2, y2, z2)); + } + + public void queueParticle(ParticleOptions particleOptions, boolean b, Vec3 xyz, Vec3 xyz2) { + this.queuedParticles.add(new QueuedParticle(particleOptions, b, xyz.x, xyz.y, xyz.z, xyz2.x, xyz2.y, xyz2.z)); + } + + private record QueuedParticle(ParticleOptions particleOptions, boolean b, double x, double y, double z, double x2, + double y2, double z2) { + } + + public static class Handler { + public static boolean onMessage(ParticlePacket message, Supplier ctx) { + ctx.get().enqueueWork(() -> { + ClientLevel level = Minecraft.getInstance().level; + if (level == null) + return; + for (QueuedParticle queuedParticle : message.queuedParticles) { + level.addParticle(queuedParticle.particleOptions, queuedParticle.b, queuedParticle.x, queuedParticle.y, queuedParticle.z, queuedParticle.x2, queuedParticle.y2, queuedParticle.z2); + } + }); + ctx.get().setPacketHandled(true); + return true; + } + } +} diff --git a/src/main/java/twilightforest/network/SpawnFallenLeafFromPacket.java b/src/main/java/twilightforest/network/SpawnFallenLeafFromPacket.java new file mode 100644 index 0000000000..55bcafe97c --- /dev/null +++ b/src/main/java/twilightforest/network/SpawnFallenLeafFromPacket.java @@ -0,0 +1,66 @@ +package twilightforest.network; + +import net.minecraft.client.Minecraft; +import net.minecraft.core.BlockPos; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.util.Mth; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.network.NetworkEvent; +import twilightforest.client.particle.data.LeafParticleData; + +import java.util.Random; +import java.util.function.Supplier; + +public class SpawnFallenLeafFromPacket { + + private final BlockPos pos; + private final Vec3 motion; + + public SpawnFallenLeafFromPacket(FriendlyByteBuf buf) { + pos = buf.readBlockPos(); + motion = new Vec3(buf.readDouble(), buf.readDouble(), buf.readDouble()); + } + + public SpawnFallenLeafFromPacket(BlockPos pos, Vec3 motion) { + this.pos = pos; + this.motion = motion; + } + + public void encode(FriendlyByteBuf buf) { + buf.writeBlockPos(this.pos); + buf.writeDouble(this.motion.x); + buf.writeDouble(this.motion.y); + buf.writeDouble(this.motion.z); + } + + public static class Handler { + + @SuppressWarnings("Convert2Lambda") + public static boolean onMessage(SpawnFallenLeafFromPacket message, Supplier ctx) { + ctx.get().enqueueWork(new Runnable() { + @Override + public void run() { + Random rand = new Random(); + Level world = Minecraft.getInstance().level; + int color = Minecraft.getInstance().getBlockColors().getColor(Blocks.OAK_LEAVES.defaultBlockState(), world, message.pos, 0); + int r = Mth.clamp(((color >> 16) & 0xFF) + rand.nextInt(0x22) - 0x11, 0x00, 0xFF); + int g = Mth.clamp(((color >> 8) & 0xFF) + rand.nextInt(0x22) - 0x11, 0x00, 0xFF); + int b = Mth.clamp((color & 0xFF) + rand.nextInt(0x22) - 0x11, 0x00, 0xFF); + world.addParticle(new LeafParticleData(r, g, b), + message.pos.getX() + world.getRandom().nextFloat(), + message.pos.getY(), + message.pos.getZ() + world.getRandom().nextFloat(), + + (world.getRandom().nextFloat() * -0.5F) * message.motion.x(), + world.getRandom().nextFloat() * 0.5F + 0.25F, + (world.getRandom().nextFloat() * -0.5F) * message.motion.z() + ); + } + }); + ctx.get().setPacketHandled(true); + return true; + } + } +} diff --git a/src/main/java/twilightforest/network/StructureProtectionClearPacket.java b/src/main/java/twilightforest/network/StructureProtectionClearPacket.java new file mode 100644 index 0000000000..1e2de99996 --- /dev/null +++ b/src/main/java/twilightforest/network/StructureProtectionClearPacket.java @@ -0,0 +1,39 @@ +package twilightforest.network; + +import net.minecraft.client.renderer.DimensionSpecialEffects; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraftforge.client.DimensionSpecialEffectsManager; +import net.minecraftforge.network.NetworkEvent; +import twilightforest.TwilightForestMod; +import twilightforest.client.TwilightForestRenderInfo; +import twilightforest.client.renderer.TFWeatherRenderer; + +import java.util.function.Supplier; + +public class StructureProtectionClearPacket { + + public StructureProtectionClearPacket() { + } + + public StructureProtectionClearPacket(FriendlyByteBuf unused) { + } + + public void encode(FriendlyByteBuf unused) { + } + + public static class Handler { + public static boolean onMessage(StructureProtectionClearPacket message, Supplier ctx) { + ctx.get().enqueueWork(() -> { + DimensionSpecialEffects info = DimensionSpecialEffectsManager.getForType(TwilightForestMod.prefix("renderer")); + + // add weather box if needed + if (info instanceof TwilightForestRenderInfo) { + TFWeatherRenderer.setProtectedBox(null); + } + }); + + ctx.get().setPacketHandled(true); + return true; + } + } +} diff --git a/src/main/java/twilightforest/network/StructureProtectionPacket.java b/src/main/java/twilightforest/network/StructureProtectionPacket.java new file mode 100644 index 0000000000..b4c68e2cf6 --- /dev/null +++ b/src/main/java/twilightforest/network/StructureProtectionPacket.java @@ -0,0 +1,53 @@ +package twilightforest.network; + +import net.minecraft.client.renderer.DimensionSpecialEffects; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraftforge.client.DimensionSpecialEffectsManager; +import net.minecraftforge.network.NetworkEvent; +import twilightforest.TwilightForestMod; +import twilightforest.client.TwilightForestRenderInfo; +import twilightforest.client.renderer.TFWeatherRenderer; + +import java.util.function.Supplier; + +public class StructureProtectionPacket { + + private final BoundingBox sbb; + + public StructureProtectionPacket(BoundingBox sbb) { + this.sbb = sbb; + } + + public StructureProtectionPacket(FriendlyByteBuf buf) { + this.sbb = new BoundingBox( + buf.readInt(), buf.readInt(), buf.readInt(), + buf.readInt(), buf.readInt(), buf.readInt() + ); + } + + public void encode(FriendlyByteBuf buf) { + buf.writeInt(this.sbb.minX()); + buf.writeInt(this.sbb.minY()); + buf.writeInt(this.sbb.minZ()); + buf.writeInt(this.sbb.maxX()); + buf.writeInt(this.sbb.maxY()); + buf.writeInt(this.sbb.maxZ()); + } + + public static class Handler { + public static boolean onMessage(StructureProtectionPacket message, Supplier ctx) { + ctx.get().enqueueWork(() -> { + DimensionSpecialEffects info = DimensionSpecialEffectsManager.getForType(TwilightForestMod.prefix("renderer")); + + // add weather box if needed + if (info instanceof TwilightForestRenderInfo) { + TFWeatherRenderer.setProtectedBox(message.sbb); + } + }); + + ctx.get().setPacketHandled(true); + return true; + } + } +} diff --git a/src/main/java/twilightforest/network/SyncUncraftingTableConfigPacket.java b/src/main/java/twilightforest/network/SyncUncraftingTableConfigPacket.java new file mode 100644 index 0000000000..8fcf69907d --- /dev/null +++ b/src/main/java/twilightforest/network/SyncUncraftingTableConfigPacket.java @@ -0,0 +1,74 @@ +package twilightforest.network; + +import net.minecraft.client.Minecraft; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraftforge.network.NetworkEvent; +import twilightforest.TFConfig; + +import java.util.List; +import java.util.function.Supplier; + +public class SyncUncraftingTableConfigPacket { + + private final double uncraftingMultiplier; + private final double repairingMultiplier; + private final boolean allowShapeless; + private final boolean disabled; + private final List disabledRecipes; + private final boolean flipRecipeList; + private final List disabledModids; + private final boolean flipModidList; + + //I think casting is fine in this case. The forge config requires that entries extend string but they should always be strings + @SuppressWarnings("unchecked") + public SyncUncraftingTableConfigPacket(double uncraftingMultiplier, double repairingMultiplier, boolean allowShapeless, boolean disabled, List disabledRecipes, boolean flipRecipeList, List disabledModids, boolean flipModidList) { + this.uncraftingMultiplier = uncraftingMultiplier; + this.repairingMultiplier = repairingMultiplier; + this.allowShapeless = allowShapeless; + this.disabled = disabled; + this.disabledRecipes = (List) disabledRecipes; + this.flipRecipeList = flipRecipeList; + this.disabledModids = (List) disabledModids; + this.flipModidList = flipModidList; + } + + public SyncUncraftingTableConfigPacket(FriendlyByteBuf buf) { + this.uncraftingMultiplier = buf.readDouble(); + this.repairingMultiplier = buf.readDouble(); + this.allowShapeless = buf.readBoolean(); + this.disabled = buf.readBoolean(); + this.disabledRecipes = buf.readList(FriendlyByteBuf::readUtf); + this.flipRecipeList = buf.readBoolean(); + this.disabledModids = buf.readList(FriendlyByteBuf::readUtf); + this.flipModidList = buf.readBoolean(); + } + + public void encode(FriendlyByteBuf buf) { + buf.writeDouble(this.uncraftingMultiplier); + buf.writeDouble(this.repairingMultiplier); + buf.writeBoolean(this.allowShapeless); + buf.writeBoolean(this.disabled); + buf.writeCollection(this.disabledRecipes, FriendlyByteBuf::writeUtf); + buf.writeBoolean(this.flipRecipeList); + buf.writeCollection(this.disabledModids, FriendlyByteBuf::writeUtf); + buf.writeBoolean(this.flipModidList); + } + + public static class Handler { + + public static boolean onMessage(SyncUncraftingTableConfigPacket message, Supplier ctx) { + ctx.get().enqueueWork(() -> { + TFConfig.COMMON_CONFIG.UNCRAFTING_STUFFS.uncraftingXpCostMultiplier.set(message.uncraftingMultiplier); + TFConfig.COMMON_CONFIG.UNCRAFTING_STUFFS.repairingXpCostMultiplier.set(message.repairingMultiplier); + TFConfig.COMMON_CONFIG.UNCRAFTING_STUFFS.allowShapelessUncrafting.set(message.allowShapeless); + TFConfig.COMMON_CONFIG.UNCRAFTING_STUFFS.disableUncrafting.set(message.disabled); + TFConfig.COMMON_CONFIG.UNCRAFTING_STUFFS.disableUncraftingRecipes.set(message.disabledRecipes); + TFConfig.COMMON_CONFIG.UNCRAFTING_STUFFS.reverseRecipeBlacklist.set(message.flipRecipeList); + TFConfig.COMMON_CONFIG.UNCRAFTING_STUFFS.blacklistedUncraftingModIds.set(message.disabledModids); + TFConfig.COMMON_CONFIG.UNCRAFTING_STUFFS.flipUncraftingModIdList.set(message.flipModidList); + }); + ctx.get().setPacketHandled(true); + return true; + } + } +} diff --git a/src/main/java/twilightforest/network/TFPacketHandler.java b/src/main/java/twilightforest/network/TFPacketHandler.java new file mode 100644 index 0000000000..f5b125ab43 --- /dev/null +++ b/src/main/java/twilightforest/network/TFPacketHandler.java @@ -0,0 +1,49 @@ +package twilightforest.network; + +import net.minecraftforge.network.NetworkEvent; +import net.minecraftforge.network.NetworkRegistry; +import net.minecraftforge.network.simple.SimpleChannel; +import twilightforest.TwilightForestMod; + +import java.util.function.BiConsumer; +import java.util.function.Supplier; + +public class TFPacketHandler { + // Bump this number every time theres a breaking change, to ensure people dont mess things up when joining on the wrong version + private static final String PROTOCOL_VERSION = "2"; + public static final SimpleChannel CHANNEL = NetworkRegistry.newSimpleChannel( + TwilightForestMod.prefix("channel"), + () -> PROTOCOL_VERSION, + PROTOCOL_VERSION::equals, + PROTOCOL_VERSION::equals + ); + + @SuppressWarnings({"UnusedAssignment", "Convert2Lambda", "Anonymous2MethodRef"}) + public static void init() { + int id = 0; + //as ugly as this is compared to the rest of the packets do not change it, it crashes the server otherwise + CHANNEL.registerMessage(id++, AreaProtectionPacket.class, AreaProtectionPacket::encode, AreaProtectionPacket::new, new BiConsumer<>() { + @Override + public void accept(AreaProtectionPacket message, Supplier ctx) { + AreaProtectionPacket.Handler.onMessage(message, ctx); + } + }); + CHANNEL.registerMessage(id++, ChangeBiomePacket.class, ChangeBiomePacket::encode, ChangeBiomePacket::new, ChangeBiomePacket.Handler::onMessage); + CHANNEL.registerMessage(id++, CreateMovingCicadaSoundPacket.class, CreateMovingCicadaSoundPacket::encode, CreateMovingCicadaSoundPacket::new, CreateMovingCicadaSoundPacket.Handler::onMessage); + CHANNEL.registerMessage(id++, EnforceProgressionStatusPacket.class, EnforceProgressionStatusPacket::encode, EnforceProgressionStatusPacket::new, EnforceProgressionStatusPacket.Handler::onMessage); + CHANNEL.registerMessage(id++, MagicMapPacket.class, MagicMapPacket::encode, MagicMapPacket::new, MagicMapPacket.Handler::onMessage); + CHANNEL.registerMessage(id++, MazeMapPacket.class, MazeMapPacket::encode, MazeMapPacket::new, MazeMapPacket.Handler::onMessage); + CHANNEL.registerMessage(id++, MissingAdvancementToastPacket.class, MissingAdvancementToastPacket::encode, MissingAdvancementToastPacket::new, MissingAdvancementToastPacket.Handler::onMessage); + CHANNEL.registerMessage(id++, ParticlePacket.class, ParticlePacket::encode, ParticlePacket::new, ParticlePacket.Handler::onMessage); + CHANNEL.registerMessage(id++, SpawnFallenLeafFromPacket.class, SpawnFallenLeafFromPacket::encode, SpawnFallenLeafFromPacket::new, SpawnFallenLeafFromPacket.Handler::onMessage); + CHANNEL.registerMessage(id++, StructureProtectionClearPacket.class, StructureProtectionClearPacket::encode, StructureProtectionClearPacket::new, StructureProtectionClearPacket.Handler::onMessage); + CHANNEL.registerMessage(id++, StructureProtectionPacket.class, StructureProtectionPacket::encode, StructureProtectionPacket::new, StructureProtectionPacket.Handler::onMessage); + CHANNEL.registerMessage(id++, SyncUncraftingTableConfigPacket.class, SyncUncraftingTableConfigPacket::encode, SyncUncraftingTableConfigPacket::new, SyncUncraftingTableConfigPacket.Handler::onMessage); + CHANNEL.registerMessage(id++, ThrowPlayerPacket.class, ThrowPlayerPacket::encode, ThrowPlayerPacket::new, ThrowPlayerPacket.Handler::onMessage); + CHANNEL.registerMessage(id++, UncraftingGuiPacket.class, UncraftingGuiPacket::encode, UncraftingGuiPacket::new, UncraftingGuiPacket.Handler::onMessage); + CHANNEL.registerMessage(id++, UpdateFeatherFanFallPacket.class, UpdateFeatherFanFallPacket::encode, UpdateFeatherFanFallPacket::new, UpdateFeatherFanFallPacket.Handler::onMessage); + CHANNEL.registerMessage(id++, UpdateShieldPacket.class, UpdateShieldPacket::encode, UpdateShieldPacket::new, UpdateShieldPacket.Handler::onMessage); + CHANNEL.registerMessage(id++, UpdateTFMultipartPacket.class, UpdateTFMultipartPacket::encode, UpdateTFMultipartPacket::new, UpdateTFMultipartPacket.Handler::onMessage); + CHANNEL.registerMessage(id++, UpdateThrownPacket.class, UpdateThrownPacket::encode, UpdateThrownPacket::new, UpdateThrownPacket.Handler::onMessage); + } +} diff --git a/src/main/java/twilightforest/network/ThrowPlayerPacket.java b/src/main/java/twilightforest/network/ThrowPlayerPacket.java new file mode 100644 index 0000000000..562cd84a71 --- /dev/null +++ b/src/main/java/twilightforest/network/ThrowPlayerPacket.java @@ -0,0 +1,41 @@ +package twilightforest.network; + +import net.minecraft.client.Minecraft; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraftforge.network.NetworkEvent; + +import java.util.function.Supplier; + +public class ThrowPlayerPacket { + private final double motionX; + private final double motionY; + private final double motionZ; + + public ThrowPlayerPacket(double motionX, double motionY, double motionZ) { + this.motionX = motionX; + this.motionY = motionY; + this.motionZ = motionZ; + } + + public ThrowPlayerPacket(FriendlyByteBuf buf) { + this.motionX = buf.readDouble(); + this.motionY = buf.readDouble(); + this.motionZ = buf.readDouble(); + } + + public void encode(FriendlyByteBuf buf) { + buf.writeDouble(this.motionX); + buf.writeDouble(this.motionY); + buf.writeDouble(this.motionZ); + } + + public static class Handler { + + public static boolean onMessage(ThrowPlayerPacket message, Supplier ctx) { + ctx.get().enqueueWork(() -> + Minecraft.getInstance().player.push(message.motionX, message.motionY, message.motionZ)); + ctx.get().setPacketHandled(true); + return true; + } + } +} diff --git a/src/main/java/twilightforest/network/UncraftingGuiPacket.java b/src/main/java/twilightforest/network/UncraftingGuiPacket.java new file mode 100644 index 0000000000..d5fa5e44fe --- /dev/null +++ b/src/main/java/twilightforest/network/UncraftingGuiPacket.java @@ -0,0 +1,56 @@ +package twilightforest.network; + +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraftforge.network.NetworkEvent; +import twilightforest.inventory.UncraftingMenu; + +import java.util.function.Supplier; + +public class UncraftingGuiPacket { + private final int type; + + public UncraftingGuiPacket(int type) { + this.type = type; + } + + public UncraftingGuiPacket(FriendlyByteBuf buf) { + this.type = buf.readInt(); + } + + public void encode(FriendlyByteBuf buf) { + buf.writeInt(this.type); + } + + public static class Handler { + + public static boolean onMessage(UncraftingGuiPacket message, Supplier ctx) { + ServerPlayer player = ctx.get().getSender(); + + ctx.get().enqueueWork(() -> { + AbstractContainerMenu container = player.containerMenu; + + if (container instanceof UncraftingMenu uncrafting) { + switch (message.type) { + case 0 -> uncrafting.unrecipeInCycle++; + case 1 -> uncrafting.unrecipeInCycle--; + case 2 -> uncrafting.ingredientsInCycle++; + case 3 -> uncrafting.ingredientsInCycle--; + case 4 -> uncrafting.recipeInCycle++; + case 5 -> uncrafting.recipeInCycle--; + } + + if (message.type < 4) + uncrafting.slotsChanged(uncrafting.tinkerInput); + + if (message.type >= 4) + uncrafting.slotsChanged(uncrafting.assemblyMatrix); + } + }); + + ctx.get().setPacketHandled(true); + return true; + } + } +} diff --git a/src/main/java/twilightforest/network/UpdateFeatherFanFallPacket.java b/src/main/java/twilightforest/network/UpdateFeatherFanFallPacket.java new file mode 100644 index 0000000000..a763279b71 --- /dev/null +++ b/src/main/java/twilightforest/network/UpdateFeatherFanFallPacket.java @@ -0,0 +1,53 @@ +package twilightforest.network; + +import net.minecraft.client.Minecraft; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraftforge.network.NetworkEvent; +import twilightforest.capabilities.CapabilityList; +import twilightforest.capabilities.fan.FeatherFanCapabilityHandler; +import twilightforest.capabilities.fan.FeatherFanFallCapability; + +import java.util.function.Supplier; + +public class UpdateFeatherFanFallPacket { + private final int entityID; + private final boolean falling; + + public UpdateFeatherFanFallPacket(int id, FeatherFanFallCapability cap) { + this.entityID = id; + this.falling = cap.getFalling(); + } + + public UpdateFeatherFanFallPacket(Entity entity, FeatherFanCapabilityHandler cap) { + this(entity.getId(), cap); + } + + public UpdateFeatherFanFallPacket(FriendlyByteBuf buf) { + this.entityID = buf.readInt(); + this.falling = buf.readBoolean(); + } + + public void encode(FriendlyByteBuf buf) { + buf.writeInt(this.entityID); + buf.writeBoolean(this.falling); + } + + public static class Handler { + + public static boolean onMessage(UpdateFeatherFanFallPacket message, Supplier ctx) { + ctx.get().enqueueWork(() -> { + Entity entity = Minecraft.getInstance().level.getEntity(message.entityID); + if (entity instanceof LivingEntity) { + entity.getCapability(CapabilityList.FEATHER_FAN_FALLING).ifPresent(cap -> { + cap.setFalling(message.falling); + }); + } + }); + + ctx.get().setPacketHandled(true); + return true; + } + } +} diff --git a/src/main/java/twilightforest/network/UpdateShieldPacket.java b/src/main/java/twilightforest/network/UpdateShieldPacket.java new file mode 100644 index 0000000000..9bf14c15ec --- /dev/null +++ b/src/main/java/twilightforest/network/UpdateShieldPacket.java @@ -0,0 +1,58 @@ +package twilightforest.network; + +import net.minecraft.client.Minecraft; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraftforge.network.NetworkEvent; +import twilightforest.capabilities.CapabilityList; +import twilightforest.capabilities.shield.IShieldCapability; + +import java.util.function.Supplier; + +public class UpdateShieldPacket { + + private final int entityID; + private final int temporaryShields; + private final int permanentShields; + + public UpdateShieldPacket(int id, IShieldCapability cap) { + this.entityID = id; + this.temporaryShields = cap.temporaryShieldsLeft(); + this.permanentShields = cap.permanentShieldsLeft(); + } + + public UpdateShieldPacket(Entity entity, IShieldCapability cap) { + this(entity.getId(), cap); + } + + public UpdateShieldPacket(FriendlyByteBuf buf) { + this.entityID = buf.readInt(); + this.temporaryShields = buf.readInt(); + this.permanentShields = buf.readInt(); + } + + public void encode(FriendlyByteBuf buf) { + buf.writeInt(this.entityID); + buf.writeInt(this.temporaryShields); + buf.writeInt(this.permanentShields); + } + + public static class Handler { + + public static boolean onMessage(UpdateShieldPacket message, Supplier ctx) { + ctx.get().enqueueWork(() -> { + Entity entity = Minecraft.getInstance().level.getEntity(message.entityID); + if (entity instanceof LivingEntity) { + entity.getCapability(CapabilityList.SHIELDS).ifPresent(cap -> { + cap.setShields(message.temporaryShields, true); + cap.setShields(message.permanentShields, false); + }); + } + }); + + ctx.get().setPacketHandled(true); + return true; + } + } +} diff --git a/src/main/java/twilightforest/network/UpdateTFMultipartPacket.java b/src/main/java/twilightforest/network/UpdateTFMultipartPacket.java new file mode 100644 index 0000000000..3a4b56f0c9 --- /dev/null +++ b/src/main/java/twilightforest/network/UpdateTFMultipartPacket.java @@ -0,0 +1,145 @@ +package twilightforest.network; + +import net.minecraft.client.Minecraft; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.level.Level; +import net.minecraftforge.entity.PartEntity; +import net.minecraftforge.network.NetworkEvent; +import twilightforest.entity.TFPart; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Supplier; + +public class UpdateTFMultipartPacket { + + private int id; + private Entity entity; + private int len; + private final List data = new ArrayList<>(); + + public UpdateTFMultipartPacket(FriendlyByteBuf buf) { + this.id = buf.readInt(); + this.len = buf.readInt(); + for (int i = 0; i < len; i++) { + if (buf.readBoolean()) { + data.add(PartDataHolder.decode(buf)); + } + } + } + + public UpdateTFMultipartPacket(Entity entity) { + this.entity = entity; + } + + public void encode(FriendlyByteBuf buf) { + buf.writeInt(this.entity.getId()); + PartEntity[] parts = this.entity.getParts(); + // We assume the client and server part arrays are identical, else everything will crash and burn. Don't even bother handling it. + if (parts != null) { + buf.writeInt(parts.length); + for (PartEntity part : parts) { + if (part instanceof TFPart tfPart) { + buf.writeBoolean(true); + tfPart.writeData().encode(buf); + } else { + buf.writeBoolean(false); + } + } + } else { + buf.writeInt(0); + } + } + + public static class Handler { + + @SuppressWarnings("Convert2Lambda") + public static boolean onMessage(UpdateTFMultipartPacket message, Supplier ctx) { + ctx.get().enqueueWork(new Runnable() { + @Override + public void run() { + Level world = Minecraft.getInstance().level; + if (world == null) + return; + Entity ent = world.getEntity(message.id); + if (ent != null && ent.isMultipartEntity()) { + PartEntity[] parts = ent.getParts(); + if (parts == null) + return; + int index = 0; + for (PartEntity part : parts) { + if (part instanceof TFPart tfPart) { + tfPart.readData(message.data.get(index)); + index++; + } + } + } + } + }); + ctx.get().setPacketHandled(true); + return true; + } + } + + public record PartDataHolder(double x, + double y, + double z, + float yRot, + float xRot, + float width, + float height, + boolean fixed, + boolean dirty, + List> data) { + + + public void encode(FriendlyByteBuf buffer) { + buffer.writeDouble(this.x); + buffer.writeDouble(this.y); + buffer.writeDouble(this.z); + buffer.writeFloat(this.yRot); + buffer.writeFloat(this.xRot); + buffer.writeFloat(this.width); + buffer.writeFloat(this.height); + buffer.writeBoolean(this.fixed); + buffer.writeBoolean(this.dirty); + if (this.dirty) { + for(SynchedEntityData.DataValue datavalue : this.data) { + datavalue.write(buffer); + } + + buffer.writeByte(255); + } + } + + static PartDataHolder decode(FriendlyByteBuf buffer) { + boolean dirty; + return new PartDataHolder( + buffer.readDouble(), + buffer.readDouble(), + buffer.readDouble(), + buffer.readFloat(), + buffer.readFloat(), + buffer.readFloat(), + buffer.readFloat(), + buffer.readBoolean(), + dirty = buffer.readBoolean(), + dirty ? unpack(buffer) : null + ); + } + + private static List> unpack(FriendlyByteBuf buf) { + List> list = new ArrayList<>(); + + int i; + while((i = buf.readUnsignedByte()) != 255) { + list.add(SynchedEntityData.DataValue.read(buf, i)); + } + + return list; + } + + } +} diff --git a/src/main/java/twilightforest/network/UpdateThrownPacket.java b/src/main/java/twilightforest/network/UpdateThrownPacket.java new file mode 100644 index 0000000000..eaf21e38c6 --- /dev/null +++ b/src/main/java/twilightforest/network/UpdateThrownPacket.java @@ -0,0 +1,67 @@ +package twilightforest.network; + +import net.minecraft.client.Minecraft; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraftforge.network.NetworkEvent; +import twilightforest.capabilities.CapabilityList; +import twilightforest.capabilities.thrown.YetiThrowCapability; + +import java.util.function.Supplier; + +public class UpdateThrownPacket { + + private final int entityID; + private final boolean thrown; + private int thrower = 0; + private final int throwCooldown; + + public UpdateThrownPacket(int id, YetiThrowCapability cap) { + this.entityID = id; + this.thrown = cap.getThrown(); + this.throwCooldown = cap.getThrowCooldown(); + if(cap.getThrower() != null) { + this.thrower = cap.getThrower().getId(); + } + } + + public UpdateThrownPacket(Entity entity, YetiThrowCapability cap) { + this(entity.getId(), cap); + } + + public UpdateThrownPacket(FriendlyByteBuf buf) { + this.entityID = buf.readInt(); + this.thrown = buf.readBoolean(); + this.thrower = buf.readInt(); + this.throwCooldown = buf.readInt(); + } + + public void encode(FriendlyByteBuf buf) { + buf.writeInt(this.entityID); + buf.writeBoolean(this.thrown); + buf.writeInt(this.thrower); + buf.writeInt(this.throwCooldown); + } + + public static class Handler { + + public static boolean onMessage(UpdateThrownPacket message, Supplier ctx) { + ctx.get().enqueueWork(() -> { + Entity entity = Minecraft.getInstance().level.getEntity(message.entityID); + if (entity instanceof LivingEntity) { + entity.getCapability(CapabilityList.YETI_THROWN).ifPresent(cap -> { + LivingEntity thrower = message.thrower != 0 ? (LivingEntity) Minecraft.getInstance().level.getEntity(message.thrower) : null; + if (entity instanceof Player) + cap.setThrown(message.thrown, thrower); + cap.setThrowCooldown(message.throwCooldown); + }); + } + }); + + ctx.get().setPacketHandled(true); + return true; + } + } +} diff --git a/src/main/java/twilightforest/network/package-info.java b/src/main/java/twilightforest/network/package-info.java new file mode 100644 index 0000000000..f4e02f10a8 --- /dev/null +++ b/src/main/java/twilightforest/network/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.network; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/package-info.java b/src/main/java/twilightforest/package-info.java new file mode 100644 index 0000000000..d015c55d2b --- /dev/null +++ b/src/main/java/twilightforest/package-info.java @@ -0,0 +1,6 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest; + +import net.minecraft.MethodsReturnNonnullByDefault; +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/potions/FrostedEffect.java b/src/main/java/twilightforest/potions/FrostedEffect.java new file mode 100644 index 0000000000..57bafd5682 --- /dev/null +++ b/src/main/java/twilightforest/potions/FrostedEffect.java @@ -0,0 +1,32 @@ +package twilightforest.potions; + +import net.minecraft.world.effect.MobEffect; +import net.minecraft.world.effect.MobEffectCategory; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.entity.ai.attributes.Attributes; + +import java.util.UUID; + +public class FrostedEffect extends MobEffect { + public static final UUID MOVEMENT_SPEED_MODIFIER_UUID = UUID.fromString("CE9DBC2A-EE3F-43F5-9DF7-F7F1EE4915A9"); + public static final double FROST_MULTIPLIER = -0.15D; + + public FrostedEffect() { + super(MobEffectCategory.HARMFUL, 0x56CBFD); + this.addAttributeModifier(Attributes.MOVEMENT_SPEED, FrostedEffect.MOVEMENT_SPEED_MODIFIER_UUID.toString(), FROST_MULTIPLIER, AttributeModifier.Operation.MULTIPLY_TOTAL); + } + + @Override + public void applyEffectTick(LivingEntity living, int amplifier) { + living.setIsInPowderSnow(true); + if (amplifier > 0 && living.canFreeze()) { + living.setTicksFrozen(Math.min(living.getTicksRequiredToFreeze(), living.getTicksFrozen() + amplifier)); + } + } + + @Override + public boolean isDurationEffectTick(int duration, int amplifier) { + return true; + } +} diff --git a/src/main/java/twilightforest/potions/package-info.java b/src/main/java/twilightforest/potions/package-info.java new file mode 100644 index 0000000000..07a0d0e2f5 --- /dev/null +++ b/src/main/java/twilightforest/potions/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.potions; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/structures/ComponentTFHedgeMaze.java b/src/main/java/twilightforest/structures/ComponentTFHedgeMaze.java deleted file mode 100644 index c8154da04a..0000000000 --- a/src/main/java/twilightforest/structures/ComponentTFHedgeMaze.java +++ /dev/null @@ -1,227 +0,0 @@ -package twilightforest.structures; - -import java.util.Random; - -import net.minecraft.init.Blocks; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import twilightforest.TFTreasure; -import twilightforest.block.TFBlocks; -import twilightforest.entity.TFCreatures; - - - -public class ComponentTFHedgeMaze extends StructureTFComponent { - - static int MSIZE = 16; - static int RADIUS = (MSIZE / 2 * 3) + 1; - static int DIAMETER = 2 * RADIUS; - - static int FLOOR_LEVEL = 3; - - public ComponentTFHedgeMaze() - { - ; - } - - public ComponentTFHedgeMaze(World world, Random rand, int i, int x, int y, int z) { - super(i); - - this.setCoordBaseMode(0); - - // the maze is 50 x 50 for now - this.boundingBox = StructureTFComponent.getComponentToAddBoundingBox(x, y, z, -RADIUS, -3, -RADIUS, RADIUS * 2, 10, RADIUS * 2, 0); - - } - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - - TFMaze maze = new TFMaze(MSIZE, MSIZE); - - maze.oddBias = 2; - maze.torchBlockID = TFBlocks.firefly; - maze.wallBlockID = TFBlocks.hedge; - maze.wallBlockMeta = 0; - maze.type = 4; - maze.tall = 3; - maze.roots = 3; - - // set the seed to a fixed value based on this maze's x and z - maze.setSeed(world.getSeed() + this.boundingBox.minX * this.boundingBox.minZ); - - // just add grass below the maze for now - // grass underneath - for (int fx = 0; fx <= DIAMETER; fx++) { - for (int fz = 0; fz <= DIAMETER; fz++) { - placeBlockAtCurrentPosition(world, Blocks.grass, 0, fx, FLOOR_LEVEL - 1, fz, sbb); - } - } - - // plunk down some jack-o-lanterns outside for decoration - placeBlockAtCurrentPosition(world, Blocks.lit_pumpkin, 1, 0, FLOOR_LEVEL, 24, sbb); - placeBlockAtCurrentPosition(world, Blocks.lit_pumpkin, 1, 0, FLOOR_LEVEL, 29, sbb); - placeBlockAtCurrentPosition(world, Blocks.lit_pumpkin, 3, 50, FLOOR_LEVEL, 24, sbb); - placeBlockAtCurrentPosition(world, Blocks.lit_pumpkin, 3, 50, FLOOR_LEVEL, 29, sbb); - - placeBlockAtCurrentPosition(world, Blocks.lit_pumpkin, 2, 24, FLOOR_LEVEL, 0, sbb); - placeBlockAtCurrentPosition(world, Blocks.lit_pumpkin, 2, 29, FLOOR_LEVEL, 0, sbb); - placeBlockAtCurrentPosition(world, Blocks.lit_pumpkin, 0, 24, FLOOR_LEVEL, 50, sbb); - placeBlockAtCurrentPosition(world, Blocks.lit_pumpkin, 0, 29, FLOOR_LEVEL, 50, sbb); - - - int nrooms = MSIZE / 3; - int rcoords[] = new int[nrooms * 2]; - - for (int i = 0; i < nrooms; i++) - { - int rx, rz; - do { - rx = maze.rand.nextInt(MSIZE - 2) + 1; - rz = maze.rand.nextInt(MSIZE - 2) + 1; - } while(isNearRoom(rx, rz, rcoords)); - - maze.carveRoom1(rx, rz); - - rcoords[i * 2] = rx; - rcoords[i * 2 + 1] = rz; - } - - maze.generateRecursiveBacktracker(0, 0); - - maze.add4Exits(); - - maze.copyToStructure(world, 1, FLOOR_LEVEL, 1, this, sbb); - - decorate3x3Rooms(world, rcoords, sbb); - - - - return true; - } - - /** - * @return true if the specified dx and dz are within 3 of a room specified in rcoords - */ - protected boolean isNearRoom(int dx, int dz, int[] rcoords) { - // if proposed coordinates are covering the origin, return true to stop the room from causing the maze to fail - if (dx == 1 && dz == 1) { - return true; - } - - for (int i = 0; i < rcoords.length / 2; i++) - { - int rx = rcoords[i * 2]; - int rz = rcoords[i * 2 + 1]; - - if (rx == 0 && rz == 0) { - continue; - } - - if (Math.abs(dx - rx) < 3 && Math.abs(dz - rz) < 3) { - return true; - } - } - return false; - } - - - /** - * - * @param rand - * @param world - * @param rcoords - * @param sbb - */ - void decorate3x3Rooms(World world, int[] rcoords, StructureBoundingBox sbb) - { - for (int i = 0; i < rcoords.length / 2; i++) - { - int dx = rcoords[i * 2]; - int dz = rcoords[i * 2 + 1]; - - // MAGIC NUMBERS!!! convert the maze coordinates into coordinates for our structure - dx = dx * 3 + 3; - dz = dz * 3 + 3; - - decorate3x3Room(world, dx, dz, sbb); - } - } - - /** - * Decorates a room in the maze. Makes assumptions that the room is 3x3 cells and thus 11x11 blocks large. - * @param rand - * @param world - * @param sbb - * - * @param dx - * @param dy - */ - void decorate3x3Room(World world, int x, int z, StructureBoundingBox sbb) - { - // make a new RNG for this room! - Random roomRNG = new Random(world.getSeed() ^ x + z); - - // a few jack-o-lanterns - roomJackO(world, roomRNG, x, z, 8, sbb); - if(roomRNG.nextInt(4) == 0) { - roomJackO(world, roomRNG, x, z, 8, sbb); - } - - // all rooms should have 1 spawner - roomSpawner(world, roomRNG, x, z, 8, sbb); - - // and 1-2 chests - roomTreasure(world, roomRNG, x, z, 8, sbb); - if (roomRNG.nextInt(4) == 0) { - roomTreasure(world, roomRNG, x, z, 8, sbb); - } - } - - /** - * Place a spawner within diameter / 2 squares of the specified x and z coordinates - */ - private void roomSpawner(World world, Random rand, int x, int z, int diameter, StructureBoundingBox sbb) { - int rx = x + rand.nextInt(diameter) - (diameter / 2); - int rz = z + rand.nextInt(diameter) - (diameter / 2); - - String mobID; - - switch (rand.nextInt(3)) { - case 1 : - mobID = TFCreatures.getSpawnerNameFor("Swarm Spider"); - break; - case 2 : - mobID = TFCreatures.getSpawnerNameFor("Hostile Wolf"); - break; - case 0 : - default: - mobID = TFCreatures.getSpawnerNameFor("Hedge Spider"); - } - - placeSpawnerAtCurrentPosition(world, rand, rx, FLOOR_LEVEL, rz, mobID, sbb); - } - - /** - * Place a treasure chest within diameter / 2 squares of the specified x and z coordinates - */ - private void roomTreasure(World world, Random rand, int x, int z, int diameter, StructureBoundingBox sbb) { - int rx = x + rand.nextInt(diameter) - (diameter / 2); - int rz = z + rand.nextInt(diameter) - (diameter / 2); - - placeTreasureAtCurrentPosition(world, rand, rx, FLOOR_LEVEL, rz, TFTreasure.hedgemaze, sbb); - } - - - /** - * Place a lit pumpkin lantern within diameter / 2 squares of the specified x and z coordinates - */ - private void roomJackO(World world, Random rand, int x, int z, int diameter, StructureBoundingBox sbb) { - int rx = x + rand.nextInt(diameter) - (diameter / 2); - int rz = z + rand.nextInt(diameter) - (diameter / 2); - - placeBlockAtCurrentPosition(world, Blocks.lit_pumpkin, rand.nextInt(4), rx, FLOOR_LEVEL, rz, sbb); - } - - -} diff --git a/src/main/java/twilightforest/structures/ComponentTFHillMaze.java b/src/main/java/twilightforest/structures/ComponentTFHillMaze.java deleted file mode 100644 index fe4a1f0c0b..0000000000 --- a/src/main/java/twilightforest/structures/ComponentTFHillMaze.java +++ /dev/null @@ -1,195 +0,0 @@ -package twilightforest.structures; - -import java.util.Random; - -import net.minecraft.init.Blocks; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import twilightforest.TFTreasure; -import twilightforest.block.TFBlocks; - - - -public class ComponentTFHillMaze extends StructureTFComponent { - - public ComponentTFHillMaze() { - super(); - // TODO Auto-generated constructor stub - } - - private static final int FLOOR_LEVEL = 1; - private int hillSize; - - public ComponentTFHillMaze(int i, int x, int y, int z, int hsize) { - super(i); - this.hillSize = hsize; - - this.setCoordBaseMode(0); - - this.boundingBox = StructureTFComponent.getComponentToAddBoundingBox(x, y, z, -getRadius(), 0, -getRadius(), getRadius() * 2, 5, getRadius() * 2, 0); - - } - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - // clear the area - fillWithBlocks(world, sbb, 0, 1, 0, getDiameter(), 3, getDiameter(), Blocks.air, Blocks.air, false); - fillWithBlocks(world, sbb, 0, 0, 0, getDiameter(), 0, getDiameter(), TFBlocks.mazestone, TFBlocks.mazestone, false); - fillWithBlocks(world, sbb, 0, 4, 0, getDiameter(), 4, getDiameter(), TFBlocks.mazestone, TFBlocks.mazestone, true); - - - // make maze object - TFMaze maze = new TFMaze(getMazeSize(), getMazeSize()); - - maze.wallBlockID = TFBlocks.mazestone; - maze.wallBlockMeta = 3; - maze.torchRarity = 0.05F; - - // set the seed to a fixed value based on this maze's x and z - maze.setSeed(world.getSeed() + this.boundingBox.minX * this.boundingBox.minZ); - - - int nrooms = getMazeSize() / 3; - int rcoords[] = new int[nrooms * 2]; - - // add rooms, trying to keep them separate from existing rooms - for (int i = 0; i < nrooms; i++) - { - int rx, rz; - do { - rx = maze.rand.nextInt(getMazeSize() - 2) + 1; - rz = maze.rand.nextInt(getMazeSize() - 2) + 1; - } while(isNearRoom(rx, rz, rcoords)); - - maze.carveRoom1(rx, rz); - - rcoords[i * 2] = rx; - rcoords[i * 2 + 1] = rz; - } - - // make actual maze - maze.generateRecursiveBacktracker(0, 0); - - maze.add4Exits(); - - maze.copyToStructure(world, 0, 1, 0, this, sbb); - - - decorate3x3Rooms(world, rcoords, sbb); - - - return true; - - } - - public int getMazeSize() { - return hillSize == 1 ? 11 : hillSize == 2 ? 19 : 27; - } - - public int getRadius() { - return getMazeSize() * 2; - } - - public int getDiameter() { - return getMazeSize() * 4; - } - - /** - * @return true if the specified dx and dz are within 3 of a room specified in rcoords - */ - protected boolean isNearRoom(int dx, int dz, int[] rcoords) { - // if proposed coordinates are covering the origin, return true to stop the room from causing the maze to fail - if (dx == 1 && dz == 1) { - return true; - } - - for (int i = 0; i < rcoords.length / 2; i++) - { - int rx = rcoords[i * 2]; - int rz = rcoords[i * 2 + 1]; - - if (rx == 0 && rz == 0) { - continue; - } - - if (Math.abs(dx - rx) < 3 && Math.abs(dz - rz) < 3) { - return true; - } - } - return false; - } - - - void decorate3x3Rooms(World world, int[] rcoords, StructureBoundingBox sbb) - { - for (int i = 0; i < rcoords.length / 2; i++) - { - int dx = rcoords[i * 2]; - int dz = rcoords[i * 2 + 1]; - - // MAGIC NUMBERS!!! convert the maze coordinates into coordinates for our structure - dx = dx * 4 + 2; - dz = dz * 4 + 2; - - decorate3x3Room(world, dx, dz, sbb); - } - } - - /** - * Decorates a room in the maze. Makes assumptions that the room is 3x3 cells and thus 11x11 blocks large. - * @param rand - * @param world - * @param sbb - * - * @param dx - * @param dy - */ - void decorate3x3Room(World world, int x, int z, StructureBoundingBox sbb) - { - // make a new RNG for this room! - Random roomRNG = new Random(world.getSeed() ^ x + z); - - // all rooms should have 1 spawner - roomSpawner(world, roomRNG, x, z, 8, sbb); - - // and 1-2 chests - roomTreasure(world, roomRNG, x, z, 8, sbb); - if (roomRNG.nextInt(4) == 0) { - roomTreasure(world, roomRNG, x, z, 8, sbb); - } - } - - /** - * Place a spawner within diameter / 2 squares of the specified x and z coordinates - */ - private void roomSpawner(World world, Random rand, int x, int z, int diameter, StructureBoundingBox sbb) { - int rx = x + rand.nextInt(diameter) - (diameter / 2); - int rz = z + rand.nextInt(diameter) - (diameter / 2); - - String mobID; - - switch (rand.nextInt(3)) { - case 1 : - mobID = "Skeleton"; - break; - case 2 : - mobID = "Zombie"; - break; - case 0 : - default: - mobID = "Spider"; - } - - placeSpawnerAtCurrentPosition(world, rand, rx, FLOOR_LEVEL, rz, mobID, sbb); - } - - /** - * Place a treasure chest within diameter / 2 squares of the specified x and z coordinates - */ - private void roomTreasure(World world, Random rand, int x, int z, int diameter, StructureBoundingBox sbb) { - int rx = x + rand.nextInt(diameter) - (diameter / 2); - int rz = z + rand.nextInt(diameter) - (diameter / 2); - - placeTreasureAtCurrentPosition(world, rand, rx, FLOOR_LEVEL, rz, TFTreasure.labyrinth_room, sbb); - } -} diff --git a/src/main/java/twilightforest/structures/ComponentTFHollowHill.java b/src/main/java/twilightforest/structures/ComponentTFHollowHill.java deleted file mode 100644 index 7faed360c6..0000000000 --- a/src/main/java/twilightforest/structures/ComponentTFHollowHill.java +++ /dev/null @@ -1,370 +0,0 @@ -package twilightforest.structures; - -import java.util.List; -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.init.Blocks; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import net.minecraft.world.gen.structure.StructureComponent; -import twilightforest.TFTreasure; -import twilightforest.entity.TFCreatures; -import twilightforest.world.TFGenCaveStalactite; - - - -public class ComponentTFHollowHill extends StructureTFComponent { - - int hillSize; - int radius; - - public ComponentTFHollowHill() { - super(); - // TODO Auto-generated constructor stub - } - - - - public ComponentTFHollowHill(World world, Random rand, int i, int size, int x, int y, int z) { - super(i); - - this.setCoordBaseMode(0); - - // get the size of this hill? - this.hillSize = size; - radius = ((hillSize * 2 + 1) * 8) - 6; - - // can we determine the size here? - this.boundingBox = StructureTFComponent.getComponentToAddBoundingBox(x, y, z, -radius, -3, -radius, radius * 2, 10, radius * 2, 0); - } - - - /** - * Save to NBT - */ - @Override - protected void func_143012_a(NBTTagCompound par1NBTTagCompound) { - super.func_143012_a(par1NBTTagCompound); - - par1NBTTagCompound.setInteger("hillSize", this.hillSize); - } - - /** - * Load from NBT - */ - @Override - protected void func_143011_b(NBTTagCompound par1NBTTagCompound) { - super.func_143011_b(par1NBTTagCompound); - this.hillSize = par1NBTTagCompound.getInteger("hillSize"); - this.radius = ((hillSize * 2 + 1) * 8) - 6; - - } - - /** - * Add on any other components we need. In this case we add the maze below the hill - */ - @SuppressWarnings("rawtypes") - @Override - public void buildComponent(StructureComponent structurecomponent, List list, Random random) { - -// // add a maze -// ComponentTFHillMaze maze = new ComponentTFHillMaze(1, boundingBox.minX + ((boundingBox.maxX - boundingBox.minX) / 2), boundingBox.minY - 20, boundingBox.minZ + ((boundingBox.maxZ - boundingBox.minZ) / 2), hillSize); -// list.add(maze); -// maze.buildComponent(this, list, random); - - - } - - /** - * Add in all the blocks we're adding. - */ - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { -// int area = (int)(Math.PI * radius * radius); -// int sn = area / 16; // number of stalactites (there will actually be around twice this number) - int[] sna = {0, 128, 256, 512}; - int sn = sna[hillSize]; // number of stalactites mga = {0, 3, 9, 18} - int[] mga = {0, 1, 4, 9}; - int mg = mga[hillSize]; // number of monster generators mga = {0, 3, 9, 18} (reduced due to "natural" spawning) - int[] tca = {0, 2, 6, 12}; - int tc = tca[hillSize]; // number of treasure chests tca = {0, 2, 6, 12}; - - // fill in features - - // monster generators! - for (int i = 0; i < mg; i++) - { - int[] dest = getCoordsInHill2D(rand); - String mobID = getMobID(rand); - - placeSpawnerAtCurrentPosition(world, rand, dest[0],rand.nextInt(4), dest[1], mobID, sbb); -// placeMobSpawner(dest[0], hy + rand.nextInt(4), dest[1]); - } - // treasure chests!! - for (int i = 0; i < tc; i++) - { - int[] dest = getCoordsInHill2D(rand); - generateTreasureChest(world, dest[0], 0, dest[1], sbb); - } - - // ore or glowing stalactites! (smaller, less plentiful) - for (int i = 0; i < sn; i++) - { - int[] dest = getCoordsInHill2D(rand); - generateOreStalactite(world, dest[0], 1, dest[1], sbb); - } - // stone stalactites! - for (int i = 0; i < sn; i++) - { - int[] dest = getCoordsInHill2D(rand); - generateBlockStalactite(world, Blocks.stone, 1.0F, true, dest[0], 1, dest[1], sbb); - } - // stone stalagmites! - for (int i = 0; i < sn; i++) - { - int[] dest = getCoordsInHill2D(rand); - generateBlockStalactite(world, Blocks.stone, 0.9F, false, dest[0], 1, dest[1], sbb); - } - - // level 3 hills get 2 mid-air wraith spawners - if (hillSize == 3) - { -// int[] dest = getEmptyCoordsInHill(hy + 10, 20); -// placeWraithSpawner(dest[0], hy + 10, dest[1]); -// dest = getEmptyCoordsInHill(hy + 10, 20); -// placeWraithSpawner(dest[0], hy + 10, dest[1]); - } - - - - return true; - } - - /** - * Make an RNG and attempt to use it to place a treasure chest - */ - protected void generateTreasureChest(World world, int x, int y, int z, StructureBoundingBox sbb) { - // generate an RNG for this chest - //TODO: MOAR RANDOM! - Random chestRNG = new Random(world.getSeed() + x * z); - - // try placing it - placeTreasureAtCurrentPosition(world, chestRNG, x, y, z, this.hillSize == 3 ? TFTreasure.hill3 : (this.hillSize == 2 ? TFTreasure.hill2 : TFTreasure.hill1), sbb); - - // make something for it to stand on, if necessary - func_151554_b(world, Blocks.cobblestone, 0, x, y - 1, z, sbb); - - } - - /** - * Generate a random ore stalactite - */ - protected void generateOreStalactite(World world, int x, int y, int z, StructureBoundingBox sbb) { - // are the coordinates in our bounding box? - int dx = getXWithOffset(x, z); - int dy = getYWithOffset(y); - int dz = getZWithOffset(x, z); - if(sbb.isVecInside(dx, dy, dz) && world.getBlock(dx, dy, dz) != Blocks.mob_spawner) - { - // generate an RNG for this stalactite - //TODO: MOAR RANDOM! - Random stalRNG = new Random(world.getSeed() + dx * dz); - - // make the actual stalactite - TFGenCaveStalactite stalag = TFGenCaveStalactite.makeRandomOreStalactite(stalRNG, hillSize); - stalag.generate(world, stalRNG, dx, dy, dz); - } - } - - /** - * Make a random stone stalactite - */ - protected void generateBlockStalactite(World world, Block blockToGenerate, float length, boolean up, int x, int y, int z, StructureBoundingBox sbb) { - // are the coordinates in our bounding box? - int dx = getXWithOffset(x, z); - int dy = getYWithOffset(y); - int dz = getZWithOffset(x, z); - if(sbb.isVecInside(dx, dy, dz) && world.getBlock(dx, dy, dz) != Blocks.mob_spawner) - { - // generate an RNG for this stalactite - //TODO: MOAR RANDOM! - Random stalRNG = new Random(world.getSeed() + dx * dz); - - if (hillSize == 1) { - length *= 1.9F; - } - - // make the actual stalactite - (new TFGenCaveStalactite(blockToGenerate, length, up)).generate(world, stalRNG, dx, dy, dz); - } - } - - - /** - * - * @param cx - * @param cz - * @return true if the coordinates would be inside the hill on the "floor" of the hill - */ - boolean isInHill(int cx, int cz) - { - int dx = radius - cx; - int dz = radius - cz; - int dist = (int) Math.sqrt(dx * dx + dz * dz); - - return dist < radius; - } - - /** - * @return true if the coordinates are inside the hill in 3D - */ - boolean isInHill(int mapX, int mapY, int mapZ) - { - int dx = boundingBox.minX + radius - mapX; - int dy = (boundingBox.minY - mapY) * 2; // hill is half as high as it is wide, thus we just double y distance from center. I *think* that math works! - int dz = boundingBox.minZ + radius - mapZ; - int dist = dx * dx + dy * dy + dz * dz; - return dist < radius * radius; - } - - int[] getCoordsInHill2D(Random rand) - { - return getCoordsInHill2D(rand, radius); - } - - /** - * - * @return a two element array containing some coordinates in the hill - */ - int[] getCoordsInHill2D(Random rand, int rad) - { - int rx, rz; - do { - rx = rand.nextInt(2 * rad); - rz = rand.nextInt(2 * rad); - } while (!isInHill(rx, rz)); - - int[] coords = {rx, rz}; - return coords; - } - - /** - * Gets the id of a mob appropriate to the current hill size. - */ - protected String getMobID(Random rand) - { - return getMobID(rand, this.hillSize); - } - - - /** - * Gets the id of a mob appropriate to the specified hill size. - * - * @param level - * @return - */ - protected String getMobID(Random rand, int level) - { - if (level == 1) - { - return getLevel1Mob(rand); - } - if (level == 2) - { - return getLevel2Mob(rand); - } - if (level == 3) - { - return getLevel3Mob(rand); - } - - /// aaah, default: spider! - return "Spider"; - } - - /** - * Returns a mob string appropriate for a level 1 hill - */ - public String getLevel1Mob(Random rand) - { - switch (rand.nextInt(10)) - { - case 0: - case 1: - case 2: - return TFCreatures.getSpawnerNameFor("Swarm Spider"); - case 3: - case 4: - case 5: - return "Spider"; - case 6: - case 7: - return "Zombie"; - case 8: - return "Silverfish"; - case 9: - return TFCreatures.getSpawnerNameFor("Redcap"); - default: - return TFCreatures.getSpawnerNameFor("Swarm Spider"); - } - } - - /** - * Returns a mob string appropriate for a level 2 hill - */ - public String getLevel2Mob(Random rand) - { - switch (rand.nextInt(10)) - { - case 0: - case 1: - case 2: - return TFCreatures.getSpawnerNameFor("Redcap"); - case 3: - case 4: - case 5: - return "Zombie"; - case 6: - case 7: - return "Skeleton"; - case 8: - return TFCreatures.getSpawnerNameFor("Swarm Spider"); - case 9: - return "CaveSpider"; - default: - return TFCreatures.getSpawnerNameFor("Redcap"); - } - } - - /** - * Returns a mob string appropriate for a level 3 hill. The level 3 also has 2 mid-air wraith spawners. - */ - public String getLevel3Mob(Random rand) - { - switch (rand.nextInt(11)) - { - case 0: - return TFCreatures.getSpawnerNameFor("Slime Beetle"); - case 1: - return TFCreatures.getSpawnerNameFor("Fire Beetle"); - case 2: - return TFCreatures.getSpawnerNameFor("Pinch Beetle"); - case 3: - case 4: - case 5: - return "Skeleton"; - case 6: - case 7: - case 8: - return "CaveSpider"; - case 9: - return "Creeper"; - case 10: - default: - return TFCreatures.getSpawnerNameFor("Twilight Wraith"); - } - } - -} diff --git a/src/main/java/twilightforest/structures/ComponentTFHydraLair.java b/src/main/java/twilightforest/structures/ComponentTFHydraLair.java deleted file mode 100644 index 0ae1d7e91c..0000000000 --- a/src/main/java/twilightforest/structures/ComponentTFHydraLair.java +++ /dev/null @@ -1,66 +0,0 @@ -package twilightforest.structures; - -import java.util.List; -import java.util.Random; - -import net.minecraft.init.Blocks; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import net.minecraft.world.gen.structure.StructureComponent; -import twilightforest.block.TFBlocks; - -public class ComponentTFHydraLair extends ComponentTFHollowHill { - - public ComponentTFHydraLair() { - super(); - // TODO Auto-generated constructor stub - } - - public ComponentTFHydraLair(World world, Random rand, int i, int x, int y, int z) { - super(world, rand, i, 2, x, y + 2, z); - } - - /** - * Add on any other components we need. Override with noop since we don't need a maze - */ - @SuppressWarnings("rawtypes") - @Override - public void buildComponent(StructureComponent structurecomponent, List list, Random random) { - ; - } - - /** - * Add in all the blocks we're adding. - */ - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - int stalacts = 64; - int stalags = 8; - - // fill in features - // ore or glowing stalactites! (smaller, less plentiful) - for (int i = 0; i < stalacts; i++) - { - int[] dest = getCoordsInHill2D(rand); - generateOreStalactite(world, dest[0], 1, dest[1], sbb); - } - // stone stalactites! - for (int i = 0; i < stalacts; i++) - { - int[] dest = getCoordsInHill2D(rand); - generateBlockStalactite(world, Blocks.stone, 1.0F, true, dest[0], 1, dest[1], sbb); - } - // stone stalagmites! - for (int i = 0; i < stalags; i++) - { - int[] dest = getCoordsInHill2D(rand); - generateBlockStalactite(world, Blocks.stone, 0.9F, false, dest[0], 1, dest[1], sbb); - } - - // boss spawner seems important - placeBlockAtCurrentPosition(world, TFBlocks.bossSpawner, 2, 27, 3, 27, sbb); - - return true; - } - -} diff --git a/src/main/java/twilightforest/structures/ComponentTFNagaCourtyard.java b/src/main/java/twilightforest/structures/ComponentTFNagaCourtyard.java deleted file mode 100644 index 648cc3568d..0000000000 --- a/src/main/java/twilightforest/structures/ComponentTFNagaCourtyard.java +++ /dev/null @@ -1,374 +0,0 @@ -package twilightforest.structures; - -import java.util.Random; - -import net.minecraft.init.Blocks; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import twilightforest.block.TFBlocks; - - -public class ComponentTFNagaCourtyard extends StructureTFComponent { - - static int RADIUS = 46; - static int DIAMETER = 2 * RADIUS + 1; - - - public ComponentTFNagaCourtyard() { - super(); - // TODO Auto-generated constructor stub - } - - public ComponentTFNagaCourtyard(World world, Random rand, int i, int x, int y, int z) { - super(i); - - this.setCoordBaseMode(0); - - this.boundingBox = StructureTFComponent.getComponentToAddBoundingBox(x, y, z, -RADIUS, -1, -RADIUS, RADIUS * 2, 10, RADIUS * 2, 0); - - } - - /** - * At the moment, this just draws the whole courtyard as a giant 93x93 block every time. We may break this up properly later. - * - * TODO: what I just said - */ - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - // add a broken up courtyard - for (int fx = 0; fx <= DIAMETER; fx++) { - for (int fz = 0; fz <= DIAMETER; fz++) { - if (rand.nextInt(3) == 0) { - placeBlockAtCurrentPosition(world, Blocks.double_stone_slab, 0, fx, 0, fz, sbb); - - // put some half slabs around - if (rand.nextInt(20) == 0) { - placeBlockAtCurrentPosition(world, Blocks.stone_slab, 0, fx, 1, fz, sbb); - } - else { - placeBlockAtCurrentPosition(world, Blocks.air, 0, fx, 1, fz, sbb); // clear out grass or flowers - } - } - else { - placeBlockAtCurrentPosition(world, Blocks.grass, 0, fx, 0, fz, sbb); - } - } - } - - // fence! except not a fence, more of a wall - for (int fx = 0; fx <= DIAMETER; fx++) { - randomBrick(world, rand, fx, 0, DIAMETER, sbb); - randomBrick(world, rand, fx, 0, 0, sbb); - randomBrick(world, rand, fx, 1, DIAMETER, sbb); - randomBrick(world, rand, fx, 1, 0, sbb); - randomBrick(world, rand, fx, 2, DIAMETER, sbb); - randomBrick(world, rand, fx, 2, 0, sbb); - randomBrick(world, rand, fx, 3, DIAMETER, sbb); - randomBrick(world, rand, fx, 3, 0, sbb); - placeBlockAtCurrentPosition(world, Blocks.stone_slab, 5, fx, 4, DIAMETER, sbb); - placeBlockAtCurrentPosition(world, Blocks.stone_slab, 5, fx, 4, 0, sbb); - - - // make nagastone pattern! - switch (fx % 23) - { - case 2 : - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 7, fx, 3, DIAMETER, sbb); - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 7, fx, 3, 0, sbb); - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 14, fx, 2, DIAMETER, sbb); - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 14, fx, 2, 0, sbb); - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 11, fx, 1, DIAMETER, sbb); - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 11, fx, 1, 0, sbb); - break; - case 3 : - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 3, fx, 3, DIAMETER, sbb); - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 3, fx, 3, 0, sbb); - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 12, fx, 1, DIAMETER, sbb); - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 12, fx, 1, 0, sbb); - break; - case 4 : - case 8 : - case 16 : - case 20 : - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 12, fx, 1, DIAMETER, sbb); - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 12, fx, 1, 0, sbb); - break; - case 5 : - case 9 : - case 17 : - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 7, fx, 3, DIAMETER, sbb); - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 7, fx, 3, 0, sbb); - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 14, fx, 2, DIAMETER, sbb); - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 14, fx, 2, 0, sbb); - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 10, fx, 1, DIAMETER, sbb); - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 10, fx, 1, 0, sbb); - break; - case 6 : - case 10 : - case 14 : - case 18 : - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 12, fx, 3, DIAMETER, sbb); - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 12, fx, 3, 0, sbb); - break; - case 7 : - case 15 : - case 19 : - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 6, fx, 3, DIAMETER, sbb); - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 6, fx, 3, 0, sbb); - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 14, fx, 2, DIAMETER, sbb); - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 14, fx, 2, 0, sbb); - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 11, fx, 1, DIAMETER, sbb); - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 11, fx, 1, 0, sbb); - break; - case 11 : - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 6, fx, 3, DIAMETER, sbb); - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 6, fx, 3, 0, sbb); - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 14, fx, 2, DIAMETER, sbb); - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 14, fx, 2, 0, sbb); - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 14, fx, 1, DIAMETER, sbb); - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 14, fx, 1, 0, sbb); - break; - case 13 : - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 7, fx, 3, DIAMETER, sbb); - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 7, fx, 3, 0, sbb); - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 14, fx, 2, DIAMETER, sbb); - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 14, fx, 2, 0, sbb); - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 14, fx, 1, DIAMETER, sbb); - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 14, fx, 1, 0, sbb); - break; - case 21 : - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 2, fx, 3, DIAMETER, sbb); - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 2, fx, 3, 0, sbb); - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 12, fx, 1, DIAMETER, sbb); - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 12, fx, 1, 0, sbb); - break; - case 22 : - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 6, fx, 3, DIAMETER, sbb); - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 6, fx, 3, 0, sbb); - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 14, fx, 2, DIAMETER, sbb); - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 14, fx, 2, 0, sbb); - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 10, fx, 1, DIAMETER, sbb); - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 10, fx, 1, 0, sbb); - break; - } - -// if (fx % 2 == 0) { -// placeBlockAtCurrentPosition(world, Blocks.stone_slab, 5, fx, 4, DIAMETER, sbb); -// placeBlockAtCurrentPosition(world, Blocks.stonebrick, 0, fx, 4, 0, sbb); -// } -// else -// { -// placeBlockAtCurrentPosition(world, Blocks.stone_slab, 5, fx, 4, 0, sbb); -// placeBlockAtCurrentPosition(world, Blocks.stonebrick, 0, fx, 4, DIAMETER, sbb); -// } - } - - for (int fz = 0; fz <= DIAMETER; fz++) { - randomBrick(world, rand, DIAMETER, 0, fz, sbb); - randomBrick(world, rand, 0, 0, fz, sbb); - randomBrick(world, rand, DIAMETER, 1, fz, sbb); - randomBrick(world, rand, 0, 1, fz, sbb); - randomBrick(world, rand, DIAMETER, 2, fz, sbb); - randomBrick(world, rand, 0, 2, fz, sbb); - randomBrick(world, rand, DIAMETER, 3, fz, sbb); - randomBrick(world, rand, 0, 3, fz, sbb); - placeBlockAtCurrentPosition(world, Blocks.stone_slab, 5, DIAMETER, 4, fz, sbb); - placeBlockAtCurrentPosition(world, Blocks.stone_slab, 5, 0, 4, fz, sbb); - - // make nagastone pattern! - switch (fz % 23) - { - case 2 : - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 5, DIAMETER, 3, fz, sbb); - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 5, 0, 3, fz, sbb); - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 14, DIAMETER, 2, fz, sbb); - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 14, 0, 2, fz, sbb); - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 9, DIAMETER, 1, fz, sbb); - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 9, 0, 1, fz, sbb); - break; - case 3 : - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 1, DIAMETER, 3, fz, sbb); - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 1, 0, 3, fz, sbb); - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 13, DIAMETER, 1, fz, sbb); - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 13, 0, 1, fz, sbb); - break; - case 4 : - case 8 : - case 16 : - case 20 : - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 13, DIAMETER, 1, fz, sbb); - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 13, 0, 1, fz, sbb); - break; - case 5 : - case 9 : - case 17 : - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 5, DIAMETER, 3, fz, sbb); - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 5, 0, 3, fz, sbb); - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 14, DIAMETER, 2, fz, sbb); - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 14, 0, 2, fz, sbb); - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 8, DIAMETER, 1, fz, sbb); - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 8, 0, 1, fz, sbb); - break; - case 6 : - case 10 : - case 14 : - case 18 : - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 13, DIAMETER, 3, fz, sbb); - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 13, 0, 3, fz, sbb); - break; - case 7 : - case 15 : - case 19 : - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 4, DIAMETER, 3, fz, sbb); - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 4, 0, 3, fz, sbb); - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 14, DIAMETER, 2, fz, sbb); - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 14, 0, 2, fz, sbb); - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 9, DIAMETER, 1, fz, sbb); - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 9, 0, 1, fz, sbb); - break; - case 11 : - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 4, DIAMETER, 3, fz, sbb); - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 4, 0, 3, fz, sbb); - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 14, DIAMETER, 2, fz, sbb); - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 14, 0, 2, fz, sbb); - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 14, DIAMETER, 1, fz, sbb); - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 14, 0, 1, fz, sbb); - break; - case 13 : - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 5, DIAMETER, 3, fz, sbb); - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 5, 0, 3, fz, sbb); - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 14, DIAMETER, 2, fz, sbb); - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 14, 0, 2, fz, sbb); - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 14, DIAMETER, 1, fz, sbb); - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 14, 0, 1, fz, sbb); - break; - case 21 : - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 0, DIAMETER, 3, fz, sbb); - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 0, 0, 3, fz, sbb); - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 13, DIAMETER, 1, fz, sbb); - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 13, 0, 1, fz, sbb); - break; - case 22 : - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 4, DIAMETER, 3, fz, sbb); - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 4, 0, 3, fz, sbb); - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 14, DIAMETER, 2, fz, sbb); - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 14, 0, 2, fz, sbb); - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 8, DIAMETER, 1, fz, sbb); - placeBlockAtCurrentPosition(world, TFBlocks.nagastone, 8, 0, 1, fz, sbb); - break; - } - -// if (fz % 2 == 0) { -// placeBlockAtCurrentPosition(world, Blocks.stone_slab, 5, DIAMETER, 4, fz, sbb); -// placeBlockAtCurrentPosition(world, Blocks.stonebrick, 0, 0, 4, fz, sbb); -// } -// else -// { -// placeBlockAtCurrentPosition(world, Blocks.stone_slab, 5, 0, 4, fz, sbb); -// placeBlockAtCurrentPosition(world, Blocks.stonebrick, 0, DIAMETER, 4, fz, sbb); -// } - } - - // make a new rand here because we keep getting different results and this actually matters... or should the pillars be different StructureComponents? - Random pillarRand = new Random(world.getSeed() + this.boundingBox.minX * this.boundingBox.minZ); - - // pick a few spots and make pillars - for (int i = 0; i < 20; i++) { - int rx = 2 + pillarRand.nextInt(DIAMETER - 4); - int rz = 2 + pillarRand.nextInt(DIAMETER - 4); - - makePillar(world, pillarRand, rx, 1, rz, sbb); - } - - - - // naga spawner seems important - placeBlockAtCurrentPosition(world, TFBlocks.bossSpawner, 0, RADIUS + 1, 2, RADIUS + 1, sbb); - - return true; - } - - /** - * Make a pillar out of stone brick - */ - public boolean makePillar(World world, Random rand, int x, int y, int z, StructureBoundingBox sbb) { - int height = 8; - - // make the base - placeBlockAtCurrentPosition(world, Blocks.stone_slab, 0, x - 1, y + 0, z - 1, sbb); - placeBlockAtCurrentPosition(world, Blocks.stone_slab, 0, x + 0, y + 0, z - 1, sbb); - placeBlockAtCurrentPosition(world, Blocks.stone_slab, 0, x + 1, y + 0, z - 1, sbb); - placeBlockAtCurrentPosition(world, Blocks.stone_slab, 0, x - 1, y + 0, z + 0, sbb); - placeBlockAtCurrentPosition(world, Blocks.stone_slab, 0, x + 1, y + 0, z + 0, sbb); - placeBlockAtCurrentPosition(world, Blocks.stone_slab, 0, x - 1, y + 0, z + 1, sbb); - placeBlockAtCurrentPosition(world, Blocks.stone_slab, 0, x + 0, y + 0, z + 1, sbb); - placeBlockAtCurrentPosition(world, Blocks.stone_slab, 0, x + 1, y + 0, z + 1, sbb); - - // make the pillar - for (int i = 0; i < height; i++) { - randomBrick(world, rand, x, y + i, z, sbb); - if (i > 0 && rand.nextInt(2) == 0) { - // vines? - switch (rand.nextInt(4)) - { - case 0: - placeBlockAtCurrentPosition(world, Blocks.vine, 8, x - 1, y + i, z + 0, sbb); - break; - case 1: - placeBlockAtCurrentPosition(world, Blocks.vine, 2, x + 1, y + i, z + 0, sbb); - break; - case 2: - placeBlockAtCurrentPosition(world, Blocks.vine, 4, x + 0, y + i, z + 1, sbb); - break; - case 3: - placeBlockAtCurrentPosition(world, Blocks.vine, 1, x + 0, y + i, z - 1, sbb); - break; - } - } - else if (i > 0 && rand.nextInt(4) == 0) { - // fireflies! - switch (rand.nextInt(4)) - { - case 0: - placeBlockAtCurrentPosition(world, TFBlocks.firefly, 0, x - 1, y + i, z + 0, sbb); - break; - case 1: - placeBlockAtCurrentPosition(world, TFBlocks.firefly, 0, x + 1, y + i, z + 0, sbb); - break; - case 2: - placeBlockAtCurrentPosition(world, TFBlocks.firefly, 0, x + 0, y + i, z + 1, sbb); - break; - case 3: - placeBlockAtCurrentPosition(world, TFBlocks.firefly, 0, x + 0, y + i, z - 1, sbb); - break; - } - } - } - - // top? - if (height == 8) { - placeBlockAtCurrentPosition(world, Blocks.stone_slab, 0, x - 1, y + 8, z - 1, sbb); - placeBlockAtCurrentPosition(world, Blocks.stone_slab, 0, x + 0, y + 8, z - 1, sbb); - placeBlockAtCurrentPosition(world, Blocks.stone_slab, 0, x + 1, y + 8, z - 1, sbb); - placeBlockAtCurrentPosition(world, Blocks.stone_slab, 0, x - 1, y + 8, z + 0, sbb); - placeBlockAtCurrentPosition(world, Blocks.stone_slab, 5, x + 0, y + 8, z + 0, sbb); - placeBlockAtCurrentPosition(world, Blocks.stone_slab, 0, x + 1, y + 8, z + 0, sbb); - placeBlockAtCurrentPosition(world, Blocks.stone_slab, 0, x - 1, y + 8, z + 1, sbb); - placeBlockAtCurrentPosition(world, Blocks.stone_slab, 0, x + 0, y + 8, z + 1, sbb); - placeBlockAtCurrentPosition(world, Blocks.stone_slab, 0, x + 1, y + 8, z + 1, sbb); - - - } - - return true; - } - - /** - * Places a random stone brick at the specified location - */ - public void randomBrick(World world, Random rand, int x, int y, int z, StructureBoundingBox sbb) { - placeBlockAtCurrentPosition(world, Blocks.stonebrick, rand.nextInt(3), x, y, z, sbb); - } - - -} diff --git a/src/main/java/twilightforest/structures/ComponentTFQuestGrove.java b/src/main/java/twilightforest/structures/ComponentTFQuestGrove.java deleted file mode 100644 index 29c944440e..0000000000 --- a/src/main/java/twilightforest/structures/ComponentTFQuestGrove.java +++ /dev/null @@ -1,177 +0,0 @@ -package twilightforest.structures; - -import java.util.Random; - -import net.minecraft.init.Blocks; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntityDispenser; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import twilightforest.entity.passive.EntityTFQuestRam; - - -public class ComponentTFQuestGrove extends StructureTFComponent { - - public static final int RADIUS = 13; - - protected boolean beastPlaced = false; - protected boolean dispenserPlaced = false; - - - public ComponentTFQuestGrove() { - super(); - } - - public ComponentTFQuestGrove(World world, Random rand, int i, int x, int y, int z) { - super(i); - - this.setCoordBaseMode(0); - - // the maze is 25 x 25 for now - this.boundingBox = StructureTFComponent.getComponentToAddBoundingBox(x, y, z, -RADIUS, 0, -RADIUS, RADIUS * 2, 10, RADIUS * 2, 0); - } - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - for (int i = 0; i < 4; i++) { - // make the rings - makeWallSide(world, rand, i, sbb); - } - - // a small platform - for (int x = 10; x < 17; x++) { - for (int z = 10; z < 17; z++) { - if (x == 10 || x == 16 || z == 10 || z == 16) { - if (rand.nextInt(2) > 0) { - placeBlockAtCurrentPosition(world, Blocks.stonebrick, 1, x, -1, z, sbb); - } - } - else if (x == 11 || x == 15 || z == 11 || z == 15) { - if (rand.nextInt(3) > 0) { - placeBlockAtCurrentPosition(world, Blocks.stonebrick, 1, x, -1, z, sbb); - } - } - else { - placeBlockAtCurrentPosition(world, Blocks.stonebrick, 1, x, -1, z, sbb); - } - } - } - - // dispenser frame and button - placeBlockAtCurrentPosition(world, Blocks.stone_button, 4, 13, 5, 19, sbb); - - placeBlockAtCurrentPosition(world, Blocks.stonebrick, 1, 12, 7, 20, sbb); - placeBlockAtCurrentPosition(world, Blocks.stonebrick, 1, 13, 7, 20, sbb); - placeBlockAtCurrentPosition(world, Blocks.stonebrick, 1, 14, 7, 20, sbb); - placeBlockAtCurrentPosition(world, Blocks.stonebrick, 1, 12, 7, 21, sbb); - placeBlockAtCurrentPosition(world, Blocks.stonebrick, 1, 13, 7, 21, sbb); - placeBlockAtCurrentPosition(world, Blocks.stonebrick, 1, 14, 7, 21, sbb); - - - // the dispenser - if (!dispenserPlaced) { - int bx = this.getXWithOffset(13, 20); - int by = this.getYWithOffset(6); - int bz = this.getZWithOffset(13, 20); - - if (sbb.isVecInside(bx, by, bz)) { - dispenserPlaced = true; - - world.setBlock(bx, by, bz, Blocks.dispenser, 2, 4); - TileEntityDispenser ted = (TileEntityDispenser)world.getTileEntity(bx, by, bz); - - // add 4 random wool blocks - for (int i = 0; i < 4; i++) { - ted.setInventorySlotContents(i, new ItemStack(Blocks.wool, 1, rand.nextInt(16))); - } - - } - } - - // the quest beast! - if (!beastPlaced) { - int bx = this.getXWithOffset(13, 13); - int by = this.getYWithOffset(0); - int bz = this.getZWithOffset(13, 13); - - if (sbb.isVecInside(bx, by, bz)) { - beastPlaced = true; - - EntityTFQuestRam ram = new EntityTFQuestRam(world); - ram.setPosition(bx, by, bz); - ram.setHomeArea(bx, by, bz, 13); - - world.spawnEntityInWorld(ram); - } - } - - return true; - } - - private void makeWallSide(World world, Random rand, int direction, StructureBoundingBox sbb) { - int temp = this.getCoordBaseMode(); - this.setCoordBaseMode(direction); - - // arches - placeOuterArch(world, 3, -1, sbb); - placeOuterArch(world, 11, -1, sbb); - placeOuterArch(world, 19, -1, sbb); - - // connecting thingers - placeBlockAtCurrentPosition(world, Blocks.stonebrick, 3, 0, 0, 0, sbb); - placeBlockAtCurrentPosition(world, Blocks.stonebrick, 3, 0, 1, 0, sbb); - placeBlockAtCurrentPosition(world, Blocks.stonebrick, 3, 0, 2, 0, sbb); - - placeBlockAtCurrentPosition(world, Blocks.stonebrick, 3, 0, 3, 0, sbb); - placeBlockAtCurrentPosition(world, Blocks.stonebrick, 3, 1, 3, 0, sbb); - placeBlockAtCurrentPosition(world, Blocks.stonebrick, 3, 2, 3, 0, sbb); - - placeBlockAtCurrentPosition(world, Blocks.stonebrick, 3, 8, 3, 0, sbb); - placeBlockAtCurrentPosition(world, Blocks.stonebrick, 3, 9, 3, 0, sbb); - placeBlockAtCurrentPosition(world, Blocks.stonebrick, 3, 10, 3, 0, sbb); - - placeBlockAtCurrentPosition(world, Blocks.stonebrick, 3, 16, 3, 0, sbb); - placeBlockAtCurrentPosition(world, Blocks.stonebrick, 3, 17, 3, 0, sbb); - placeBlockAtCurrentPosition(world, Blocks.stonebrick, 3, 18, 3, 0, sbb); - - placeBlockAtCurrentPosition(world, Blocks.stonebrick, 3, 24, 3, 0, sbb); - placeBlockAtCurrentPosition(world, Blocks.stonebrick, 3, 25, 3, 0, sbb); - - // inner arch - for (int x = 0; x < 9; x++) { - for (int y = 0; y < 9; y++) { - for (int z = 0; z < 2; z++) { - if (x == 0 || x == 1 || x == 7 || x == 8 || y == 0 || y == 1 || y == 7 || y == 8) { - placeBlockAtCurrentPosition(world, Blocks.stonebrick, 1, x + 9, y - 2, z + 5, sbb); - } - } - } - } - - // connecting thingers - placeBlockAtCurrentPosition(world, Blocks.stonebrick, 3, 6, 0, 6, sbb); - placeBlockAtCurrentPosition(world, Blocks.stonebrick, 3, 6, 1, 6, sbb); - placeBlockAtCurrentPosition(world, Blocks.stonebrick, 3, 6, 2, 6, sbb); - placeBlockAtCurrentPosition(world, Blocks.stonebrick, 3, 6, 3, 6, sbb); - - placeBlockAtCurrentPosition(world, Blocks.stonebrick, 3, 6, 4, 6, sbb); - placeBlockAtCurrentPosition(world, Blocks.stonebrick, 3, 7, 4, 6, sbb); - placeBlockAtCurrentPosition(world, Blocks.stonebrick, 3, 8, 4, 6, sbb); - - placeBlockAtCurrentPosition(world, Blocks.stonebrick, 3, 18, 4, 6, sbb); - placeBlockAtCurrentPosition(world, Blocks.stonebrick, 3, 19, 4, 6, sbb); - - this.setCoordBaseMode(temp); - } - - private void placeOuterArch(World world, int ox, int oy, StructureBoundingBox sbb) { - for (int x = 0; x < 5; x++) { - for (int y = 0; y < 6; y++) { - if (x == 0 || x == 4 || y == 0 || y == 5) { - placeBlockAtCurrentPosition(world, Blocks.stonebrick, 1, x + ox, y + oy, 0, sbb); - } - } - } - } - -} diff --git a/src/main/java/twilightforest/structures/ComponentTFYetiCave.java b/src/main/java/twilightforest/structures/ComponentTFYetiCave.java deleted file mode 100644 index 2d9a8ad8b6..0000000000 --- a/src/main/java/twilightforest/structures/ComponentTFYetiCave.java +++ /dev/null @@ -1,100 +0,0 @@ -package twilightforest.structures; - -import java.util.Random; - -import net.minecraft.init.Blocks; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import twilightforest.entity.boss.EntityTFYetiAlpha; -import twilightforest.world.TFWorld; - -public class ComponentTFYetiCave extends ComponentTFHollowHill { - - private boolean yetiPlaced; - - public ComponentTFYetiCave() { - super(); - } - - public ComponentTFYetiCave(World world, Random rand, int i, int x, int y, int z) { - super(world, rand, i, 2, x, y + 2, z); - } - - /** - * - * @param cx - * @param cz - * @return true if the coordinates would be inside the hill on the "floor" of the hill - */ - boolean isInHill(int cx, int cz) - { - // yeti cave is square - return cx < this.radius * 2 && cx > 0 && cz < this.radius * 2 && cz > 0; - } - - /** - * @return true if the coordinates are inside the hill in 3D - */ - boolean isInHill(int mapX, int mapY, int mapZ) - { - // yeti cave is square and 16 blocks tall - return mapX < this.radius * 2 && mapX > 0 && mapZ < this.radius * 2 && mapZ > 0 && mapY > TFWorld.SEALEVEL && mapY < TFWorld.SEALEVEL + 20; - } - - /** - * Add in all the blocks we're adding. - */ - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - - int sn = 128; - - // fill in features - -// // ore or glowing stalactites! (smaller, less plentiful) -// for (int i = 0; i < sn; i++) -// { -// int[] dest = getCoordsInHill2D(rand); -// generateOreStalactite(world, dest[0], 1, dest[1], sbb); -// } - // stone stalactites! - for (int i = 0; i < sn; i++) - { - int[] dest = getCoordsInHill2D(rand); - generateBlockStalactite(world, Blocks.stone, 1.0F, true, dest[0], 1, dest[1], sbb); - } - // ice stalactites! - for (int i = 0; i < sn; i++) - { - int[] dest = getCoordsInHill2D(rand); - generateBlockStalactite(world, Blocks.ice, 1.0F, true, dest[0], 1, dest[1], sbb); - } - // packed ice stalactites! - for (int i = 0; i < sn; i++) - { - int[] dest = getCoordsInHill2D(rand); - generateBlockStalactite(world, Blocks.packed_ice, 0.9F, true, dest[0], 1, dest[1], sbb); - } - - // spawn alpha yeti - if (!yetiPlaced) { - int bx = this.getXWithOffset(this.radius, this.radius); - int by = this.getYWithOffset(0); - int bz = this.getZWithOffset(this.radius, this.radius); - - if (sbb.isVecInside(bx, by, bz)) { - yetiPlaced = true; - - EntityTFYetiAlpha yeti = new EntityTFYetiAlpha(world); - yeti.setPosition(bx, by, bz); - yeti.setHomeArea(bx, by, bz, 30); - - world.spawnEntityInWorld(yeti); - } - } - - - return true; - } - -} diff --git a/src/main/java/twilightforest/structures/StructureTFCastleBlocks.java b/src/main/java/twilightforest/structures/StructureTFCastleBlocks.java deleted file mode 100644 index 64670d0a9e..0000000000 --- a/src/main/java/twilightforest/structures/StructureTFCastleBlocks.java +++ /dev/null @@ -1,38 +0,0 @@ -package twilightforest.structures; - -import java.util.Random; - -import net.minecraft.init.Blocks; -import net.minecraft.world.gen.structure.StructureComponent; -import twilightforest.block.TFBlocks; - -public class StructureTFCastleBlocks extends StructureComponent.BlockSelector { - - @Override - public void selectBlocks(Random par1Random, int x, int y, int z, boolean isWall) { - if (!isWall) - { - this.field_151562_a = Blocks.air; - this.selectedBlockMetaData = 0; - } - else - { - this.field_151562_a = TFBlocks.castleBlock; - float randFloat = par1Random.nextFloat(); - - if (randFloat < 0.1F) - { - this.selectedBlockMetaData = 1; - } - else if (randFloat < 0.2F) - { - this.selectedBlockMetaData = 2; - } - else - { - this.selectedBlockMetaData = 0; - } - } - } - -} diff --git a/src/main/java/twilightforest/structures/StructureTFComponent.java b/src/main/java/twilightforest/structures/StructureTFComponent.java deleted file mode 100644 index 5e2b198f00..0000000000 --- a/src/main/java/twilightforest/structures/StructureTFComponent.java +++ /dev/null @@ -1,682 +0,0 @@ -package twilightforest.structures; - -import java.util.Iterator; -import java.util.List; -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.init.Blocks; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntityMobSpawner; -import net.minecraft.tileentity.TileEntitySign; -import net.minecraft.util.ChunkCoordinates; -import net.minecraft.world.EnumSkyBlock; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import net.minecraft.world.gen.structure.StructureComponent; -import twilightforest.TFTreasure; - - -public abstract class StructureTFComponent extends StructureComponent { - - private static final StructureTFStrongholdStones strongholdStones = new StructureTFStrongholdStones(); - - public StructureTFDecorator deco = null; - public int spawnListIndex = 0; - - public StructureTFComponent() {} - - public StructureTFComponent(int i) { - super(i); - } - - /** - * Save to NBT - */ - @Override - protected void func_143012_a(NBTTagCompound par1NBTTagCompound) - { - par1NBTTagCompound.setInteger("si", this.spawnListIndex); - par1NBTTagCompound.setString("deco", StructureTFDecorator.getDecoString(this.deco)); - } - - /** - * Load from NBT - */ - @Override - protected void func_143011_b(NBTTagCompound par1NBTTagCompound) - { - this.spawnListIndex = par1NBTTagCompound.getInteger("si"); - this.deco = StructureTFDecorator.getDecoFor(par1NBTTagCompound.getString("deco")); - } - - public static StructureBoundingBox getComponentToAddBoundingBox(int x, int y, int z, int minX, int minY, int minZ, int maxX, int maxY, int maxZ, int dir) - { - switch(dir) - { - default: - return new StructureBoundingBox(x + minX, y + minY, z + minZ, x + maxX + minX, y + maxY + minY, z + maxZ + minZ); - - case 0: // '\0' - return new StructureBoundingBox(x + minX, y + minY, z + minZ, x + maxX + minX, y + maxY + minY, z + maxZ + minZ); - - case 1: // '\001' - return new StructureBoundingBox(x - maxZ + minZ, y + minY, z + minX, x + minZ, y + maxY + minY, z + maxX + minX); - - case 2: // '\002' - return new StructureBoundingBox(x - maxX - minX, y + minY, z - maxZ - minZ, x - minX, y + maxY + minY, z - minZ); - - case 3: // '\003' - return new StructureBoundingBox(x + minZ, y + minY, z - maxX, x + maxZ + minZ, y + maxY + minY, z + minX); - } - } - - /** - * Fixed a bug with direction 1 and -z values, but I'm not sure if it'll break other things - */ - public static StructureBoundingBox getComponentToAddBoundingBox2(int x, int y, int z, int minX, int minY, int minZ, int maxX, int maxY, int maxZ, int dir) - { - switch(dir) - { - default: - return new StructureBoundingBox(x + minX, y + minY, z + minZ, x + maxX + minX, y + maxY + minY, z + maxZ + minZ); - - case 0: // '\0' - return new StructureBoundingBox(x + minX, y + minY, z + minZ, x + maxX + minX, y + maxY + minY, z + maxZ + minZ); - - case 1: // '\001' - return new StructureBoundingBox(x - maxZ - minZ, y + minY, z + minX, x - minZ, y + maxY + minY, z + maxX + minX); - - case 2: // '\002' - return new StructureBoundingBox(x - maxX - minX, y + minY, z - maxZ - minZ, x - minX, y + maxY + minY, z - minZ); - - case 3: // '\003' - return new StructureBoundingBox(x + minZ, y + minY, z - maxX, x + maxZ + minZ, y + maxY + minY, z - minX); - } - } - - /** - * Place a monster spawner at the specified coordinates - * - * @param monsterID - */ - protected TileEntityMobSpawner placeSpawnerAtCurrentPosition(World world, Random rand, int x, int y, int z, String monsterID, StructureBoundingBox sbb) - { - TileEntityMobSpawner tileEntitySpawner = null; - - int dx = getXWithOffset(x, z); - int dy = getYWithOffset(y); - int dz = getZWithOffset(x, z); - if(sbb.isVecInside(dx, dy, dz) && world.getBlock(dx, dy, dz) != Blocks.mob_spawner) - { - world.setBlock(dx, dy, dz, Blocks.mob_spawner, 0, 2); - tileEntitySpawner = (TileEntityMobSpawner)world.getTileEntity(dx, dy, dz); - if(tileEntitySpawner != null) - { - tileEntitySpawner.func_145881_a().setEntityName(monsterID); - } - } - - return tileEntitySpawner; - } - - /** - * Place a monster spawner at the specified coordinates, as if rotated - * - * @param monsterID - */ - protected TileEntityMobSpawner placeSpawnerRotated(World world, int x, int y, int z, int rotation, String monsterID, StructureBoundingBox sbb) - { - TileEntityMobSpawner tileEntitySpawner = null; - - int dx = getXWithOffsetAsIfRotated(x, z, rotation); - int dy = getYWithOffset(y); - int dz = getZWithOffsetAsIfRotated(x, z, rotation); - if(sbb.isVecInside(dx, dy, dz) && world.getBlock(dx, dy, dz) != Blocks.mob_spawner) - { - world.setBlock(dx, dy, dz, Blocks.mob_spawner, 0, 2); - tileEntitySpawner = (TileEntityMobSpawner)world.getTileEntity(dx, dy, dz); - if(tileEntitySpawner != null) - { - tileEntitySpawner.func_145881_a().setEntityName(monsterID); - } - } - - return tileEntitySpawner; - } - - - /** - * Place a treasure chest at the specified coordinates - * - * @param treasureType - */ - protected void placeTreasureAtCurrentPosition(World world, Random rand, int x, int y, int z, TFTreasure treasureType, StructureBoundingBox sbb) - { - this.placeTreasureAtCurrentPosition(world, rand, x, y, z, treasureType, false, sbb); - } - - /** - * Place a treasure chest at the specified coordinates - * - * @param treasureType - */ - protected void placeTreasureAtCurrentPosition(World world, Random rand, int x, int y, int z, TFTreasure treasureType, boolean trapped, StructureBoundingBox sbb) - { - int dx = getXWithOffset(x, z); - int dy = getYWithOffset(y); - int dz = getZWithOffset(x, z); - if(sbb.isVecInside(dx, dy, dz) && world.getBlock(dx, dy, dz) != Blocks.chest) - { - treasureType.generate(world, rand, dx, dy, dz, trapped ? Blocks.trapped_chest : Blocks.chest); - } - } - - /** - * Place a treasure chest at the specified coordinates - * - * @param treasureType - */ - protected void placeTreasureRotated(World world, int x, int y, int z, int rotation, TFTreasure treasureType, StructureBoundingBox sbb) - { - this.placeTreasureRotated(world, x, y, z, rotation, treasureType, false, sbb); - } - - /** - * Place a treasure chest at the specified coordinates - * - * @param treasureType - */ - protected void placeTreasureRotated(World world, int x, int y, int z, int rotation, TFTreasure treasureType, boolean trapped, StructureBoundingBox sbb) - { - int dx = getXWithOffsetAsIfRotated(x, z, rotation); - int dy = getYWithOffset(y); - int dz = getZWithOffsetAsIfRotated(x, z, rotation); - if(sbb.isVecInside(dx, dy, dz) && world.getBlock(dx, dy, dz) != Blocks.chest) - { - treasureType.generate(world, null, dx, dy, dz, trapped ? Blocks.trapped_chest : Blocks.chest); - } - } - - protected void placeSignAtCurrentPosition(World world, int x, int y, int z, String string0, String string1, StructureBoundingBox sbb) { - int dx = getXWithOffset(x, z); - int dy = getYWithOffset(y); - int dz = getZWithOffset(x, z); - if (sbb.isVecInside(dx, dy, dz) && world.getBlock(dx, dy, dz) != Blocks.standing_sign) - { - world.setBlock(dx, dy, dz, Blocks.standing_sign, (this.coordBaseMode * 2), 2); - - TileEntitySign teSign = (TileEntitySign)world.getTileEntity(dx, dy, dz); - if (teSign != null) - { - teSign.signText[1] = string0; - teSign.signText[2] = string1; - } - } - } - - -// -// public boolean makeTowerWing2(List list, Random rand, int index, int x, int y, int z, int size, int height, int direction) { -// -// ComponentTFTowerWing wing = new ComponentTFTowerWing(index, x, y, z, size, height, direction); -// // check to see if it intersects something already there -// StructureComponent intersect = StructureComponent.getIntersectingStructureComponent(list, wing.boundingBox); -// if (intersect == null || intersect == this) { -// list.add(wing); -// wing.buildComponent(this, list, rand); -// return true; -// } else { -// System.out.println("Planned wing intersects with " + intersect); -// return false; -// } -// } - - /** - * Provides coordinates to make a tower such that it will open into the parent tower at the provided coordinates. - */ - protected int[] offsetTowerCoords(int x, int y, int z, int towerSize, int direction) { - - int dx = getXWithOffset(x, z); - int dy = getYWithOffset(y); - int dz = getZWithOffset(x, z); - - if (direction == 0) { - return new int[] {dx + 1, dy - 1, dz - towerSize / 2}; - } - else if (direction == 1) { - return new int[] {dx + towerSize / 2, dy - 1, dz + 1}; - } - else if (direction == 2) { - return new int[] {dx - 1, dy - 1, dz + towerSize / 2}; - } - else if (direction == 3) { - return new int[] {dx - towerSize / 2, dy - 1, dz - 1}; - } - - - // ugh? - return new int[] {x, y, z}; - } - - /** - * Provides coordinates to make a tower such that it will open into the parent tower at the provided coordinates. - */ - protected ChunkCoordinates offsetTowerCCoords(int x, int y, int z, int towerSize, int direction) { - - int dx = getXWithOffset(x, z); - int dy = getYWithOffset(y); - int dz = getZWithOffset(x, z); - - if (direction == 0) { - return new ChunkCoordinates(dx + 1, dy - 1, dz - towerSize / 2); - } else if (direction == 1) { - return new ChunkCoordinates(dx + towerSize / 2, dy - 1, dz + 1); - } else if (direction == 2) { - return new ChunkCoordinates(dx - 1, dy - 1, dz + towerSize / 2); - } else if (direction == 3) { - return new ChunkCoordinates(dx - towerSize / 2, dy - 1, dz - 1); - } - - - // ugh? - return new ChunkCoordinates(x, y, z); - } - - - public int[] getOffsetAsIfRotated(int src[], int rotation) { - int temp = this.getCoordBaseMode(); - int[] dest = new int[3]; - this.setCoordBaseMode(rotation); - - dest[0] = getXWithOffset(src[0], src[2]); - dest[1] = getYWithOffset(src[1]); - dest[2] = getZWithOffset(src[0], src[2]); - - this.setCoordBaseMode(temp); - return dest; - } - - - protected int getXWithOffset(int x, int z) - { - switch(getCoordBaseMode()) - { - case 0: // '\0' - return boundingBox.minX + x; - case 1: // '\001' - return boundingBox.maxX - z; - case 2: // '\002' - return boundingBox.maxX - x; - case 3: // '\003' - return boundingBox.minX + z; - } - return x; - } - - protected int getYWithOffset(int par1) - { - return super.getYWithOffset(par1); - } - - protected int getZWithOffset(int x, int z) - { - switch(getCoordBaseMode()) - { - case 0: // '\0' - return boundingBox.minZ + z; - case 1: // '\001' - return boundingBox.minZ + x; - case 2: // '\002' - return boundingBox.maxZ - z; - case 3: // '\003' - return boundingBox.maxZ - x; - } - return z; - } - - /** - * Pretend as though the structure is rotated beyond what it already is - */ - protected int getXWithOffsetAsIfRotated(int x, int z, int rotation) - { - if (coordBaseMode < 0) - { - return x; - } - - switch((coordBaseMode + rotation) % 4) - { - case 0: - return boundingBox.minX + x; - case 1: - return boundingBox.maxX - z; - case 2: - return boundingBox.maxX - x; - case 3: - return boundingBox.minX + z; - } - return x; - } - - protected int getZWithOffsetAsIfRotated(int x, int z, int rotation) - { - if (coordBaseMode < 0) - { - return x; - } - else - { - switch((coordBaseMode + rotation) % 4) - { - case 0: - return boundingBox.minZ + z; - case 1: - return boundingBox.minZ + x; - case 2: - return boundingBox.maxZ - z; - case 3: - return boundingBox.maxZ - x; - } - return z; - } - } - - public int getCoordBaseMode() { - return coordBaseMode; - } - - public void setCoordBaseMode(int coordBaseMode) { - this.coordBaseMode = coordBaseMode; - } - - protected Block getBlockAtCurrentPosition(World par1World, int par2, int par3, int par4, StructureBoundingBox par5StructureBoundingBox) { - return super.getBlockAtCurrentPosition(par1World, par2, par3, par4, par5StructureBoundingBox); - } - - /** - * current Position depends on currently set Coordinates mode, is computed here - */ - protected void placeBlockAtCurrentPosition(World par1World, Block par2, int par3, int par4, int par5, int par6, StructureBoundingBox par7StructureBoundingBox) { - super.placeBlockAtCurrentPosition(par1World, par2, par3, par4, par5, par6, par7StructureBoundingBox); - } - - /** - * Place a block as though the entire structure were rotated the specified amount beyond what it already is - */ - protected void placeBlockRotated(World world, Block blockID, int meta, int x, int y, int z, int rotation, StructureBoundingBox sbb) - { - int dx = this.getXWithOffsetAsIfRotated(x, z, rotation); - int dy = this.getYWithOffset(y); - int dz = this.getZWithOffsetAsIfRotated(x, z, rotation); - - if (sbb.isVecInside(dx, dy, dz)) - { - world.setBlock(dx, dy, dz, blockID, meta, 2); - } - } - - /** - * Get a block ID as though the entire structure were rotated the specified amount beyond what it already is - */ - protected Block getBlockIDRotated(World world, int x, int y, int z, int rotation, StructureBoundingBox sbb) - { - int dx = this.getXWithOffsetAsIfRotated(x, z, rotation); - int dy = this.getYWithOffset(y); - int dz = this.getZWithOffsetAsIfRotated(x, z, rotation); - - if (sbb.isVecInside(dx, dy, dz)) - { - return world.getBlock(dx, dy, dz); - } - else - { - return Blocks.air; - } - } - - /** - * Fill with blocks as though rotated - */ - protected void fillBlocksRotated(World world, StructureBoundingBox sbb, int minX, int minY, int minZ, int maxX, int maxY, int maxZ, Block blockID, int meta, int rotation) - { - for (int dx = minY; dx <= maxY; ++dx) - { - for (int dy = minX; dy <= maxX; ++dy) - { - for (int dz = minZ; dz <= maxZ; ++dz) - { - this.placeBlockRotated(world, blockID, meta, dy, dx, dz, rotation, sbb); - } - } - } - } - - /** - * Fill with blocks as though rotated - */ - protected void randomlyFillBlocksRotated(World world, StructureBoundingBox sbb, Random rand, float chance, int minX, int minY, int minZ, int maxX, int maxY, int maxZ, Block blockID, int meta, Block blockID2, int meta2, int rotation) - { - for (int dx = minY; dx <= maxY; ++dx) - { - for (int dy = minX; dy <= maxX; ++dy) - { - for (int dz = minZ; dz <= maxZ; ++dz) - { - if (rand.nextFloat() < chance) { - this.placeBlockRotated(world, blockID, meta, dy, dx, dz, rotation, sbb); - } else { - this.placeBlockRotated(world, blockID2, meta2, dy, dx, dz, rotation, sbb); - } - } - } - } - } - - - public void fillToGroundRotated(World world, Block stonebrick, int meta, int x, int y, int z, int rotation, StructureBoundingBox sbb) { - int dx = this.getXWithOffsetAsIfRotated(x, z, rotation); - int dy = this.getYWithOffset(y); - int dz = this.getZWithOffsetAsIfRotated(x, z, rotation); - - if (sbb.isVecInside(dx, dy, dz)) { - while ((world.isAirBlock(dx, dy, dz) || world.getBlock(dx, dy, dz).getMaterial().isLiquid()) && dy > 1) { - world.setBlock(dx, dy, dz, stonebrick, meta, 2); - --dy; - } - } - } - - - /** - * Fill with blocks as though rotated - */ - protected void fillAirRotated(World world, StructureBoundingBox sbb, int minX, int minY, int minZ, int maxX, int maxY, int maxZ, int rotation) - { - this.fillBlocksRotated(world, sbb, minX, minY, minZ, maxX, maxY, maxZ, Blocks.air, 0, rotation); - } - - public static StructureComponent.BlockSelector getStrongholdStones() { - return strongholdStones; - } - - - - /** - * Gets the metadata necessary to make stairs facing the proper direction. - * - * @param dir - * @return - */ - protected int getStairMeta(int dir) { - switch ((this.getCoordBaseMode() + dir) % 4) { - case 0: - return 0; - case 1: - return 2; - case 2: - return 1; - case 3: - return 3; - default: - return -1; // this is impossible - } - } - - /** - * Gets the metadata necessary to stick the ladder on the specified wall. - * - * @param ladderDir - * @return - */ - protected int getLadderMeta(int ladderDir) { - // ladder data values are... dumb. - switch ((this.getCoordBaseMode() + ladderDir) % 4) { - case 0: - return 4; - case 1: - return 2; - case 2: - return 5; - case 3: - return 3; - default: - return -1; // this is impossible - } - } - - /** - * Gets the metadata necessary to stick the ladder on the specified wall. - */ - protected int getLadderMeta(int ladderDir, int rotation) { - return getLadderMeta(ladderDir + rotation); - } - - /** - * Nullify all the sky light in this component bounding box - */ - public void nullifySkyLightForBoundingBox(World world) { - this.nullifySkyLight(world, boundingBox.minX - 1, boundingBox.minY - 1, boundingBox.minZ - 1, boundingBox.maxX + 1, boundingBox.maxY + 1, boundingBox.maxZ + 1); - } - - /** - * Nullify all the sky light at the specified positions, using local coordinates - */ - public void nullifySkyLightAtCurrentPosition(World world, int sx, int sy, int sz, int dx, int dy, int dz) - { - // resolve all variables to their actual in-world positions - nullifySkyLight(world, getXWithOffset(sx, sz), getYWithOffset(sy), getZWithOffset(sx, sz), getXWithOffset(dx, dz), getYWithOffset(dy), getZWithOffset(dx, dz)); - } - - /** - * Nullify all the sky light at the specified positions, using world coordinates - */ - public void nullifySkyLight(World world, int sx, int sy, int sz, int dx, int dy, int dz) - { - for (int x = sx; x <= dx; x++) - { - for (int z = sz; z <= dz; z++) - { - for (int y = sy; y <= dy; y++) - { - world.setLightValue(EnumSkyBlock.Sky, x, y, z, 0); - } - } - } - } - - /** - * Discover the y coordinate that will serve as the ground level of the supplied BoundingBox. (A median of all the - * levels in the BB's horizontal rectangle). - * - * This is basically copied from ComponentVillage - */ - protected int getAverageGroundLevel(World world, StructureBoundingBox sbb) { - int totalHeight = 0; - int heightCount = 0; - - for (int bz = this.boundingBox.minZ; bz <= this.boundingBox.maxZ; ++bz) - { - for (int by = this.boundingBox.minX; by <= this.boundingBox.maxX; ++by) - { - if (sbb.isVecInside(by, 64, bz)) - { - totalHeight += Math.max(world.getTopSolidOrLiquidBlock(by, bz), world.provider.getAverageGroundLevel()); - ++heightCount; - } - } - } - - if (heightCount == 0) - { - return -1; - } - else - { - return totalHeight / heightCount; - } - } - - /** - * Find what y level the dirt/grass/stone is. Just check the center of the chunk we're given - */ - protected int getSampledDirtLevel(World world, StructureBoundingBox sbb) { - int dirtLevel = 256; - - for (int y = 90; y > 0; y--) // is 90 like a good place to start? :) - { - int cx = sbb.getCenterX(); - int cz = sbb.getCenterZ(); - - Material material = world.getBlock(cx, y, cz).getMaterial(); - if (material == Material.ground || material == Material.rock || material == Material.grass) - { - dirtLevel = y; - break; - } - } - - return dirtLevel; - } - - /** - * Temporary replacement - */ - protected void randomlyPlaceBlock(World world, StructureBoundingBox sbb, Random rand, float chance, int x, int y, int z, Block blockPlaced, int meta) { - this.func_151552_a(world, sbb, rand, chance, x, y, z, blockPlaced, meta); - } - - /** - * Does this component fall under block protection when progression is turned on, normally true - */ - public boolean isComponentProtected() { - return true; - } - - - /** - * Discover if bounding box can fit within the current bounding box object. - */ - public static StructureComponent findIntersectingExcluding(List list, StructureBoundingBox toCheck, StructureComponent exclude) - { - Iterator iterator = list.iterator(); - StructureComponent structurecomponent; - - do - { - if (!iterator.hasNext()) - { - return null; - } - - structurecomponent = (StructureComponent)iterator.next(); - } - while (structurecomponent == exclude || structurecomponent.getBoundingBox() == null || !structurecomponent.getBoundingBox().intersectsWith(toCheck)); - - return structurecomponent; - } - - - -} \ No newline at end of file diff --git a/src/main/java/twilightforest/structures/StructureTFDecorator.java b/src/main/java/twilightforest/structures/StructureTFDecorator.java deleted file mode 100644 index 1b577f64e8..0000000000 --- a/src/main/java/twilightforest/structures/StructureTFDecorator.java +++ /dev/null @@ -1,96 +0,0 @@ -package twilightforest.structures; - -import net.minecraft.block.Block; -import net.minecraft.init.Blocks; -import net.minecraft.world.gen.structure.StructureComponent; -import twilightforest.structures.darktower.StructureDecoratorDarkTower; -import twilightforest.structures.icetower.StructureDecoratorIceTower; -import twilightforest.structures.mushroomtower.StructureDecoratorMushroomTower; -import twilightforest.structures.stronghold.StructureTFDecoratorStronghold; - -/** - * Stores information about what blocks to use in constructing this structure - * - * @author Ben - * - */ -public class StructureTFDecorator -{ - public Block blockID = Blocks.stone; - public int blockMeta; - - public Block accentID = Blocks.cobblestone; - public int accentMeta; - - public Block stairID; - public int stairMeta; // probably not useful - - public Block fenceID; - public int fenceMeta; - - public Block pillarID; - public int pillarMeta; - - public Block platformID; - public int platformMeta; - - public Block floorID; - public int floorMeta; - - public Block roofID; - public int roofMeta; - - public StructureComponent.BlockSelector randomBlocks = new StructureTFStrongholdStones(); - - public static String getDecoString(StructureTFDecorator deco) - { - if (deco instanceof StructureDecoratorDarkTower) - { - return "DecoDarkTower"; - } - if (deco instanceof StructureDecoratorIceTower) - { - return "DecoIceTower"; - } - if (deco instanceof StructureDecoratorMushroomTower) - { - return "DecoMushroomTower"; - } - if (deco instanceof StructureTFDecoratorStronghold) - { - return "DecoStronghold"; - } - if (deco instanceof StructureTFDecoratorCastle) - { - return "DecoCastle"; - } - - return ""; - } - - public static StructureTFDecorator getDecoFor(String decoString) - { - if (decoString.equals("DecoDarkTower")) - { - return new StructureDecoratorDarkTower(); - } - if (decoString.equals("DecoIceTower")) - { - return new StructureDecoratorIceTower(); - } - if (decoString.equals("DecoMushroomTower")) - { - return new StructureDecoratorMushroomTower(); - } - if (decoString.equals("DecoStronghold")) - { - return new StructureTFDecoratorStronghold(); - } - if (decoString.equals("DecoCastle")) - { - return new StructureTFDecoratorCastle(); - } - - return new StructureTFDecorator(); - } -} diff --git a/src/main/java/twilightforest/structures/StructureTFDecoratorCastle.java b/src/main/java/twilightforest/structures/StructureTFDecoratorCastle.java deleted file mode 100644 index b8baba3c65..0000000000 --- a/src/main/java/twilightforest/structures/StructureTFDecoratorCastle.java +++ /dev/null @@ -1,32 +0,0 @@ -package twilightforest.structures; - -import net.minecraft.init.Blocks; -import twilightforest.block.TFBlocks; -import twilightforest.structures.StructureTFDecorator; - -public class StructureTFDecoratorCastle extends StructureTFDecorator -{ - - public StructureTFDecoratorCastle() - { - this.blockID = TFBlocks.castleBlock; - this.blockMeta = 0; - - this.accentID = Blocks.quartz_block; - this.accentMeta = 1; - - this.roofID = TFBlocks.castleBlock; - this.roofMeta = 3; - - this.pillarID = Blocks.quartz_block; - this.pillarMeta = 2; - - this.fenceID = Blocks.fence; - this.fenceMeta = 0; - - this.stairID = Blocks.quartz_stairs; - - this.randomBlocks = new StructureTFCastleBlocks(); - } - -} diff --git a/src/main/java/twilightforest/structures/StructureTFMajorFeatureStart.java b/src/main/java/twilightforest/structures/StructureTFMajorFeatureStart.java deleted file mode 100644 index 3cf6113a1e..0000000000 --- a/src/main/java/twilightforest/structures/StructureTFMajorFeatureStart.java +++ /dev/null @@ -1,404 +0,0 @@ -package twilightforest.structures; - -import java.util.ArrayList; -import java.util.LinkedList; -import java.util.List; -import java.util.Random; - -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.world.World; -import net.minecraft.world.biome.BiomeGenBase; -import net.minecraft.world.gen.structure.MapGenStructureIO; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import net.minecraft.world.gen.structure.StructureComponent; -import net.minecraft.world.gen.structure.StructureStart; -import net.minecraft.world.gen.structure.StructureStrongholdPieces; -import twilightforest.TFFeature; -import twilightforest.biomes.TFBiomeBase; -import twilightforest.block.TFBlocks; -import twilightforest.structures.darktower.ComponentTFDarkTowerMain; -import twilightforest.structures.darktower.TFDarkTowerPieces; -import twilightforest.structures.hollowtree.StructureTFHollowTreeStart; -import twilightforest.structures.hollowtree.TFHollowTreePieces; -import twilightforest.structures.icetower.ComponentTFIceTowerMain; -import twilightforest.structures.icetower.TFIceTowerPieces; -import twilightforest.structures.lichtower.ComponentTFTowerMain; -import twilightforest.structures.lichtower.TFLichTowerPieces; -import twilightforest.structures.minotaurmaze.ComponentTFMazeRuins; -import twilightforest.structures.minotaurmaze.TFMinotaurMazePieces; -import twilightforest.structures.mushroomtower.ComponentTFMushroomTowerMain; -import twilightforest.structures.mushroomtower.TFMushroomTowerPieces; -import twilightforest.structures.stronghold.ComponentTFStrongholdEntrance; -import twilightforest.structures.stronghold.TFStrongholdPieces; -import twilightforest.structures.trollcave.ComponentTFTrollCaveMain; -import twilightforest.structures.trollcave.TFTrollCavePieces; -import twilightforest.world.TFWorld; -import twilightforest.world.TFWorldChunkManager; - - -public class StructureTFMajorFeatureStart extends StructureStart { - - public static int NUM_LOCKS = 4; - - public TFFeature feature; - public boolean isConquered; - public byte[] lockBytes = new byte[NUM_LOCKS]; - - static - { - MapGenStructureIO.registerStructure(StructureTFMajorFeatureStart.class, "TFFeature"); - MapGenStructureIO.registerStructure(StructureTFHollowTreeStart.class, "TFHollowTree"); - - TFStrongholdPieces.registerPieces(); - TFMinotaurMazePieces.registerPieces(); - TFDarkTowerPieces.registerPieces(); - TFLichTowerPieces.registerPieces(); - TFIceTowerPieces.registerPieces(); - TFMushroomTowerPieces.registerPieces(); - TFHollowTreePieces.registerPieces(); - TFTrollCavePieces.registerPieces(); - TFFinalCastlePieces.registerFinalCastlePieces(); - - // register one-off pieces here - MapGenStructureIO.func_143031_a(ComponentTFHedgeMaze.class, "TFHedge"); - MapGenStructureIO.func_143031_a(ComponentTFHillMaze.class, "TFHillMaze"); - MapGenStructureIO.func_143031_a(ComponentTFHollowHill.class, "TFHill"); - MapGenStructureIO.func_143031_a(ComponentTFHydraLair.class, "TFHydra"); - MapGenStructureIO.func_143031_a(ComponentTFNagaCourtyard.class, "TFNaga"); - MapGenStructureIO.func_143031_a(ComponentTFQuestGrove.class, "TFQuest1"); - MapGenStructureIO.func_143031_a(ComponentTFYetiCave.class, "TFYeti"); -} - - public StructureTFMajorFeatureStart() {} - - @SuppressWarnings({ "unchecked", "rawtypes" }) - public StructureTFMajorFeatureStart(World world, Random rand, int chunkX, int chunkZ) - { - StructureStrongholdPieces.prepareStructurePieces(); - //TFStrongholdPieces.prepareStructurePieces(); - - int x = (chunkX << 4) + 8; - int z = (chunkZ << 4) + 8; - int y = TFWorld.SEALEVEL + 1; //TODO: maybe a biome-specific altitude for some of them? - - this.feature = TFFeature.getFeatureDirectlyAt(chunkX, chunkZ, world); - this.isConquered = false; - - StructureComponent firstComponent = makeFirstComponent(world, rand, feature, x, y, z); - if (firstComponent != null) { - components.add(firstComponent); - firstComponent.buildComponent(firstComponent, components, rand); - } - - updateBoundingBox(); - - if (firstComponent instanceof StructureStrongholdPieces.Stairs2) - { - List var6 = ((StructureStrongholdPieces.Stairs2) firstComponent).field_75026_c; - - while (!var6.isEmpty()) - { - int var7 = rand.nextInt(var6.size()); - StructureComponent var8 = (StructureComponent)var6.remove(var7); - var8.buildComponent(firstComponent, this.components, rand); - } - - updateBoundingBox(); - - int offY = -33; - - boundingBox.offset(0, offY, 0); - - for (StructureComponent com : (LinkedList) getComponents()) - { - com.getBoundingBox().offset(0, offY, 0); - } - - - //System.out.println("Making stronghold!"); - - } - - if (firstComponent instanceof ComponentTFTowerMain || firstComponent instanceof ComponentTFDarkTowerMain) - { - moveToAvgGroundLevel(world, x, z); - } - } - - /** - * - * @return The first component we should add to our structure - */ - public StructureComponent makeFirstComponent(World world, Random rand, TFFeature feature, int x, int y, int z) { - - if (feature == TFFeature.nagaCourtyard) { - return new ComponentTFNagaCourtyard(world, rand, 0, x, y, z); - } - if (feature == TFFeature.hedgeMaze) { - return new ComponentTFHedgeMaze(world, rand, 0, x, y, z); - } - if (feature == TFFeature.hill1) { - return new ComponentTFHollowHill(world, rand, 0, 1, x, y, z); - } - if (feature == TFFeature.hill2) { - return new ComponentTFHollowHill(world, rand, 0, 2, x, y, z); - } - if (feature == TFFeature.hill3) { - return new ComponentTFHollowHill(world, rand, 0, 3, x, y, z); - } - if (feature == TFFeature.lichTower) { - return new ComponentTFTowerMain(world, rand, 0, x, y, z); - } - if (feature == TFFeature.questGrove) { - return new ComponentTFQuestGrove(world, rand, 0, x, y, z); - } - if (feature == TFFeature.hydraLair) { - return new ComponentTFHydraLair(world, rand, 0, x, y, z); - } - if (feature == TFFeature.labyrinth) { - return new ComponentTFMazeRuins(world, rand, 0, x, y, z); - } - if (feature == TFFeature.darkTower) { - return new ComponentTFDarkTowerMain(world, rand, 0, x, y - 1, z); - } - if (feature == TFFeature.tfStronghold) { - return new ComponentTFStrongholdEntrance(world, rand, 0, x, y, z); - } - if (feature == TFFeature.iceTower) { - return new ComponentTFIceTowerMain(world, rand, 0, x, y, z); - } - if (feature == TFFeature.mushroomTower) { - return new ComponentTFMushroomTowerMain(world, rand, 0, x, y, z); - } - if (feature == TFFeature.yetiCave) { - return new ComponentTFYetiCave(world, rand, 0, x, y, z); - } - if (feature == TFFeature.trollCave) { - return new ComponentTFTrollCaveMain(world, rand, 0, x, y, z); - } - if (feature == TFFeature.finalCastle) { - return new TFFinalCastlePieces.Main(world, rand, 0, x, y, z); - } - - return null; - } - - - /** - * currently only defined for Villages, returns true if Village has more than 2 non-road components - */ - public boolean isSizeableStructure() - { - return feature.isStructureEnabled; - } - - - /** - * Move the whole structure up or down - */ - @SuppressWarnings("unchecked") - protected void moveToAvgGroundLevel(World world, int x, int z) - { - if (world.getWorldChunkManager() instanceof TFWorldChunkManager) - { - // determine the biome at the origin - BiomeGenBase biomeAt = world.getBiomeGenForCoords(x, z); - - int offY = (int) ((biomeAt.rootHeight + biomeAt.heightVariation) * 8); - - // dark forest doesn't seem to get the right value. Why is my calculation so bad? - if (biomeAt == TFBiomeBase.darkForest) - { - offY += 4; - } - - if (offY > 0) - { - //System.out.println("Moving tower, offset is " + offY + " for biome " + biomeAt.biomeName); - - boundingBox.offset(0, offY, 0); - - for (StructureComponent com : (LinkedList) getComponents()) - { - com.getBoundingBox().offset(0, offY, 0); - } - } - } - } - -// /** -// * Keeps iterating Structure Pieces and spawning them until the checks tell it to stop -// */ -// public void generateStructure(World par1World, Random par2Random, StructureBoundingBox par3StructureBoundingBox) -// { -// if (this.getComponents().getFirst() instanceof ComponentTFStrongholdEntrance) -// { -// //System.out.println("We're generating a stronghold!"); -// -// for (StructureComponent component : (LinkedList) getComponents()) -// { -// -// // TODO: we need to test the shield bounding box here, otherwise we lose shield facings across chunk boundires -// -// if (isShieldable(component) ? isIntersectingLarger(par3StructureBoundingBox, component) : isIntersectingLarger(par3StructureBoundingBox, component)) -// { -// if (isShieldable(component)) -// { -// addShieldFor(par1World, component, (LinkedList) getComponents(), par3StructureBoundingBox); -// } -// component.addComponentParts(par1World, par2Random, par3StructureBoundingBox); -// } -// } -// } -// else -// { -// super.generateStructure(par1World, par2Random, par3StructureBoundingBox); -// } -// } - - /** - * Check if the component is within the chunk bounding box, but check as if it was one larger - */ - @SuppressWarnings("unused") - private boolean isIntersectingLarger(StructureBoundingBox chunkBB, StructureComponent component) { - StructureBoundingBox compBB = component.getBoundingBox(); - - // don't bother checking Y - return (compBB.maxX + 1) >= chunkBB.minX && (compBB.minX - 1) <= chunkBB.maxX && (compBB.maxZ + 1) >= chunkBB.minZ && (compBB.minZ - 1) <= chunkBB.maxZ; - - } - - @SuppressWarnings("unused") - private boolean isShieldable(StructureComponent component) { - return component.getBoundingBox().maxY <= 32; - } - - /** - * Make the stronghold shield around a component's bounding box - */ - @SuppressWarnings("unused") - private void addShieldFor(World world, StructureComponent component, List otherComponents, StructureBoundingBox chunkBox) { - StructureBoundingBox shieldBox = new StructureBoundingBox(component.getBoundingBox()); - - shieldBox.minX--; - shieldBox.minY--; - shieldBox.minZ--; - - shieldBox.maxX++; - shieldBox.maxY++; - shieldBox.maxZ++; - - ArrayList intersecting = new ArrayList(); - - for (StructureComponent other : otherComponents) - { - if (other != component && shieldBox.intersectsWith(other.getBoundingBox())) - { - intersecting.add(other); - } - } - - // trace outline - for (int x = shieldBox.minX; x <= shieldBox.maxX; x++) - { - for (int y = shieldBox.minY; y <= shieldBox.maxY; y++) - { - for (int z = shieldBox.minZ; z <= shieldBox.maxZ; z++) - { - if (x == shieldBox.minX || x == shieldBox.maxX || y == shieldBox.minY || y == shieldBox.maxY || z == shieldBox.minZ || z == shieldBox.maxZ) - { - if (chunkBox.isVecInside(x, y, z)) - { - // test other boxes - boolean notIntersecting = true; - - for (StructureComponent other : intersecting) - { - if (other.getBoundingBox().isVecInside(x, y, z)) - { - notIntersecting = false; - } - } - - - if (notIntersecting) - { - world.setBlock(x, y, z, TFBlocks.shield, calculateShieldMeta(shieldBox, x, y, z), 2); - } - - } - } - } - } - } - } - - private int calculateShieldMeta(StructureBoundingBox shieldBox, int x, int y, int z) { - int shieldMeta = 0; - if (x == shieldBox.minX) - { - shieldMeta = 5; - } - if (x == shieldBox.maxX) - { - shieldMeta = 4; - } - if (z == shieldBox.minZ) - { - shieldMeta = 3; - } - if (z == shieldBox.maxZ) - { - shieldMeta = 2; - } - if (y == shieldBox.minY) - { - shieldMeta = 1; - } - if (y == shieldBox.maxY) - { - shieldMeta = 0; - } - return shieldMeta; - } - - public void func_143022_a(NBTTagCompound par1NBTTagCompound) - { - super.func_143022_a(par1NBTTagCompound); - par1NBTTagCompound.setBoolean("Conquered", this.isConquered); - par1NBTTagCompound.setInteger("FeatureID", this.feature.featureID); - par1NBTTagCompound.setByteArray("Locks", this.lockBytes); - - //System.out.println("Saved structure for feature " + feature.name); - } - - public void func_143017_b(NBTTagCompound nbttagcompound) - { - super.func_143017_b(nbttagcompound); - this.isConquered = nbttagcompound.getBoolean("Conquered"); - this.feature = TFFeature.featureList[nbttagcompound.getInteger("FeatureID")]; - this.lockBytes = nbttagcompound.getByteArray("Locks"); - - //System.out.println("Loaded structure"); - } - - public boolean isLocked(int lockIndex) { - if (lockIndex < this.lockBytes.length) { - - System.out.println("Checking locks for lockIndex " + lockIndex); - - for (int i = 0; i < this.lockBytes.length; i++) { - System.out.println("Lock " + i + " = " + this.lockBytes[i]); - } - - return this.lockBytes[lockIndex] != 0; - } else { - - System.out.println("Current lock index, " + lockIndex + " is beyond array bounds " + this.lockBytes.length); - - - return false; - } - } - -} diff --git a/src/main/java/twilightforest/structures/StructureTFStrongholdStones.java b/src/main/java/twilightforest/structures/StructureTFStrongholdStones.java deleted file mode 100644 index c1656aadb8..0000000000 --- a/src/main/java/twilightforest/structures/StructureTFStrongholdStones.java +++ /dev/null @@ -1,42 +0,0 @@ -package twilightforest.structures; - -import java.util.Random; - -import net.minecraft.init.Blocks; -import net.minecraft.world.gen.structure.StructureComponent; - -public class StructureTFStrongholdStones extends StructureComponent.BlockSelector { - - @Override - public void selectBlocks(Random par1Random, int par2, int par3, int par4, boolean par5) { - if (!par5) - { - this.field_151562_a = Blocks.air; - this.selectedBlockMetaData = 0; - } - else - { - this.field_151562_a = Blocks.stonebrick; - float var6 = par1Random.nextFloat(); - - if (var6 < 0.2F) - { - this.selectedBlockMetaData = 2; - } - else if (var6 < 0.5F) - { - this.selectedBlockMetaData = 1; - } - else if (var6 < 0.55F) - { - this.field_151562_a = Blocks.monster_egg; - this.selectedBlockMetaData = 2; - } - else - { - this.selectedBlockMetaData = 0; - } - } - } - -} diff --git a/src/main/java/twilightforest/structures/TFFinalCastlePieces.java b/src/main/java/twilightforest/structures/TFFinalCastlePieces.java deleted file mode 100644 index b03c0a7cca..0000000000 --- a/src/main/java/twilightforest/structures/TFFinalCastlePieces.java +++ /dev/null @@ -1,3140 +0,0 @@ -package twilightforest.structures; - -import java.awt.Rectangle; -import java.nio.IntBuffer; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; -import java.util.Random; - -import twilightforest.TFFeature; -import twilightforest.biomes.TFBiomeBase; -import twilightforest.block.BlockTFTowerDevice; -import twilightforest.block.TFBlocks; -import twilightforest.structures.TFFinalCastlePieces.EntranceTower; -import twilightforest.structures.TFFinalCastlePieces.MazeTower13; -import twilightforest.structures.icetower.ComponentTFIceTowerStairs; -import twilightforest.structures.icetower.StructureDecoratorIceTower; -import twilightforest.structures.lichtower.ComponentTFTowerBridge; -import twilightforest.structures.lichtower.ComponentTFTowerWing; -import twilightforest.structures.minotaurmaze.ComponentTFMazeUpperEntrance; -import twilightforest.structures.stronghold.StructureTFDecoratorStronghold; -import net.minecraft.block.Block; -import net.minecraft.block.BlockStainedGlassPane; -import net.minecraft.block.material.Material; -import net.minecraft.init.Blocks; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.ChunkCoordinates; -import net.minecraft.util.MathHelper; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.MapGenStructureIO; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import net.minecraft.world.gen.structure.StructureComponent; -import net.minecraft.world.gen.structure.StructureNetherBridgePieces; - -public class TFFinalCastlePieces { - - - - - public static void registerFinalCastlePieces() - { - MapGenStructureIO.func_143031_a(TFFinalCastlePieces.Main.class, "TFFCMain"); - MapGenStructureIO.func_143031_a(TFFinalCastlePieces.StairTower.class, "TFFCStTo"); - MapGenStructureIO.func_143031_a(TFFinalCastlePieces.LargeTower.class, "TFFCLaTo"); - MapGenStructureIO.func_143031_a(TFFinalCastlePieces.Mural.class, "TFFCMur"); - MapGenStructureIO.func_143031_a(TFFinalCastlePieces.Foundation48.class, "TFFCToF48"); - MapGenStructureIO.func_143031_a(TFFinalCastlePieces.Roof48Crenellated.class, "TFFCRo48Cr"); - MapGenStructureIO.func_143031_a(TFFinalCastlePieces.BossGazebo.class, "TFFCBoGaz"); - MapGenStructureIO.func_143031_a(TFFinalCastlePieces.MazeTower13.class, "TFFCSiTo"); - MapGenStructureIO.func_143031_a(TFFinalCastlePieces.DungeonSteps.class, "TFFCDunSt"); - MapGenStructureIO.func_143031_a(TFFinalCastlePieces.DungeonEntrance.class, "TFFCDunEn"); - MapGenStructureIO.func_143031_a(TFFinalCastlePieces.DungeonRoom31.class, "TFFCDunR31"); - MapGenStructureIO.func_143031_a(TFFinalCastlePieces.DungeonExit.class, "TFFCDunEx"); - MapGenStructureIO.func_143031_a(TFFinalCastlePieces.DungeonForgeRoom.class, "TFFCDunBoR"); - MapGenStructureIO.func_143031_a(TFFinalCastlePieces.Roof9Crenellated.class, "TFFCRo9Cr"); - MapGenStructureIO.func_143031_a(TFFinalCastlePieces.Roof13Crenellated.class, "TFFCRo13Cr"); - MapGenStructureIO.func_143031_a(TFFinalCastlePieces.Roof13Conical.class, "TFFCRo13Con"); - MapGenStructureIO.func_143031_a(TFFinalCastlePieces.Roof13Peaked.class, "TFFCRo13Pk"); - MapGenStructureIO.func_143031_a(TFFinalCastlePieces.EntranceTower.class, "TFFCEnTo"); - MapGenStructureIO.func_143031_a(TFFinalCastlePieces.EntranceSideTower.class, "TFFCEnSiTo"); - MapGenStructureIO.func_143031_a(TFFinalCastlePieces.EntranceBottomTower.class, "TFFCEnBoTo"); - MapGenStructureIO.func_143031_a(TFFinalCastlePieces.EntranceStairs.class, "TFFCEnSt"); - MapGenStructureIO.func_143031_a(TFFinalCastlePieces.BellTower21.class, "TFFCBelTo"); - MapGenStructureIO.func_143031_a(TFFinalCastlePieces.Bridge.class, "TFFCBri"); - MapGenStructureIO.func_143031_a(TFFinalCastlePieces.Foundation13.class, "TFFCToF13"); - MapGenStructureIO.func_143031_a(TFFinalCastlePieces.BellFoundation21.class, "TFFCBeF21"); - MapGenStructureIO.func_143031_a(TFFinalCastlePieces.Foundation13Thorns.class, "TFFCFTh21"); - MapGenStructureIO.func_143031_a(TFFinalCastlePieces.DamagedTower.class, "TFFCDamT"); - MapGenStructureIO.func_143031_a(TFFinalCastlePieces.WreckedTower.class, "TFFCWrT"); - } - - public static class Main extends StructureTFComponent { - - public Main() { - } - - public Main(World world, Random rand, int i, int x, int y, int z) { - this.setCoordBaseMode(0); - this.spawnListIndex = 1; // main monsters - - x = ((x + 127) >> 8) << 8; - z = ((z + 127) >> 8) << 8; - - this.boundingBox = StructureTFComponent.getComponentToAddBoundingBox(x, y, z, -24, 120, -24, 48, 40, 48, 0); - - ChunkCoordinates cc = TFFeature.getNearestCenterXYZ(x >> 4, z >> 4, world); - - int cx = (x >> 8) << 8; - int cz = (z >> 8) << 8; - - System.out.println("Making castle at " + x + ", " + z + ". center is " + cc.posX + ", " + cc.posZ); - System.out.println("Natural center at " + cx + ", " + cz); - - // decorator - if (this.deco == null) - { - this.deco = new StructureTFDecoratorCastle(); - } - } - - @SuppressWarnings({ "unchecked", "rawtypes" }) - @Override - public void buildComponent(StructureComponent parent, List list, Random rand) { - // add foundation - Foundation48 foundation = new Foundation48(rand, 4, this); - list.add(foundation); - foundation.buildComponent(this, list, rand); - - // add roof - StructureTFComponent roof = new Roof48Crenellated(rand, 4, this); - list.add(roof); - roof.buildComponent(this, list, rand); - - // boss gazebo on roof - StructureTFComponent gazebo = new BossGazebo(rand, 5, this); - list.add(gazebo); - gazebo.buildComponent(this, list, rand); - - - // build 4 towers on sides - StairTower tower0 = new StairTower(rand, 3, boundingBox.minX, boundingBox.minY + 3, boundingBox.minZ, 2); - list.add(tower0); - tower0.buildComponent(this, list, rand); - - LargeTower tower1 = new LargeTower(rand, 3, boundingBox.maxX, boundingBox.minY + 3, boundingBox.minZ, 3); - list.add(tower1); - tower1.buildComponent(this, list, rand); - - StairTower tower2 = new StairTower(rand, 3, boundingBox.minX, boundingBox.minY + 3, boundingBox.maxZ, 1); - list.add(tower2); - tower2.buildComponent(this, list, rand); - - StairTower tower3 = new StairTower(rand, 3, boundingBox.maxX, boundingBox.minY + 3, boundingBox.maxZ, 0); - list.add(tower3); - tower3.buildComponent(this, list, rand); - - // tower maze towards entrance - ChunkCoordinates dest = new ChunkCoordinates(boundingBox.minX - 4, boundingBox.maxY, boundingBox.minZ - 24); - buildTowerMaze(list, rand, 48, 0, 24, 60, 0, 0, dest); - - - // another tower/bridge maze towards the clock tower - dest = new ChunkCoordinates(boundingBox.maxX + 4, boundingBox.minY, boundingBox.maxZ + 24); - buildTowerMaze(list, rand, 0, 30, 24, 60, 2, 1, dest); - - - // initial stairs down towards dungeon - DungeonSteps steps0 = new DungeonSteps(rand, 5, boundingBox.minX + 18, boundingBox.minY + 1, boundingBox.minZ + 18, 0); - list.add(steps0); - steps0.buildComponent(this, list, rand); - - // continued steps - DungeonSteps steps1 = steps0.buildMoreStepsTowards(parent, list, rand, 3); - DungeonSteps steps2 = steps1.buildMoreStepsTowards(parent, list, rand, 3); - DungeonSteps steps3 = steps2.buildMoreStepsTowards(parent, list, rand, 3); - - // start dungeon - DungeonEntrance dRoom = steps3.buildLevelUnder(parent, list, rand, 1); - - // mural on front - ChunkCoordinates mc = this.offsetTowerCCoords(48, 23, 25, 1, 0); - Mural mural0 = new Mural(rand, 7, mc.posX, mc.posY, mc.posZ, 35, 30, 0); - list.add(mural0); - mural0.buildComponent(this, list, rand); - - // mural inside - ChunkCoordinates mc1 = this.offsetTowerCCoords(48, 33, 24, -1, 0); - Mural mural1 = new Mural(rand, 7, mc1.posX, mc1.posY, mc.posZ, 19, 12, 2); - list.add(mural1); - mural1.buildComponent(this, list, rand); - - } - - /** - * Build a side tower, then tell it to start building towards the destination - */ - private void buildTowerMaze(List list, Random rand, int x, int y, int z, int howFar, int direction, int type, ChunkCoordinates dest) { - // duplicate list - LinkedList before = new LinkedList(list); - - // build - ChunkCoordinates tc = this.offsetTowerCCoords(x, y, z, howFar, direction); - MazeTower13 sTower = new MazeTower13(rand, 3, tc.posX, tc.posY, tc.posZ, type, direction); - // add bridge - ChunkCoordinates bc = this.offsetTowerCCoords(x, y, z, 1, direction); - Bridge bridge = new Bridge(this.getComponentType() + 1, bc.posX, bc.posY, bc.posZ, howFar - 7, direction); - list.add(bridge); - bridge.buildComponent(this, list, rand); - - // don't check if the bounding box is clear, there's either nothing there or we've made a terrible mistake - list.add(sTower); - sTower.buildTowards(this, list, rand, dest); - - // check if we've successfully built the end tower - if (this.isMazeComplete(list, type)) { - System.out.println("Tower maze type " + type + " complete!"); - } else { - // TODO: add limit on retrying, in case of infinite loop? - System.out.println("Tower maze type " + type + " INCOMPLETE, retrying!"); - list.clear(); - list.addAll(before); - this.buildTowerMaze(list, rand, x, y, z, howFar, direction, type, dest); - } - - } - - private boolean isMazeComplete(List list, int type) { - Iterator iterator = list.iterator(); - StructureComponent structurecomponent; - - do - { - if (!iterator.hasNext()) - { - return false; - } - - structurecomponent = (StructureComponent)iterator.next(); - } - while (!((structurecomponent instanceof EntranceTower && type == 0) || (structurecomponent instanceof BellTower21 && type == 1))); - - return true; - } - - /** - * Provides coordinates to make a tower such that it will open into the parent tower at the provided coordinates. - */ - protected ChunkCoordinates offsetTowerCCoords(int x, int y, int z, int howFar, int direction) { - - int dx = getXWithOffset(x, z); - int dy = getYWithOffset(y); - int dz = getZWithOffset(x, z); - - switch (direction) { - case 0: - dx += howFar; - break; - case 1: - dz += howFar; - break; - case 2: - dx -= howFar; - break; - case 3: - dz -= howFar; - break; - } - - // ugh? - return new ChunkCoordinates(dx, dy, dz); - } - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - // walls - fillWithRandomizedBlocks(world, sbb, 0, 0, 0, 48, 40, 48, false, rand, deco.randomBlocks); - - // 2M - fillWithRandomizedBlocks(world, sbb, 13, 30, 1, 47, 30, 12, false, rand, deco.randomBlocks); - this.fillWithBlocks(world, sbb, 13, 31, 12, 36, 31, 12, deco.fenceID, deco.fenceID, false); - fillWithRandomizedBlocks(world, sbb, 13, 30, 36, 47, 30, 47, false, rand, deco.randomBlocks); - this.fillWithBlocks(world, sbb, 13, 31, 36, 36, 31, 36, deco.fenceID, deco.fenceID, false); - fillWithRandomizedBlocks(world, sbb, 1, 30, 1, 12, 30, 47, false, rand, deco.randomBlocks); - this.fillWithBlocks(world, sbb, 12, 31, 12, 12, 31, 36, deco.fenceID, deco.fenceID, false); - - // second floor stairs to mezzanine - fillWithRandomizedBlocks(world, sbb, 38, 25, 13, 47, 25, 35, false, rand, deco.randomBlocks); - - for (int i = 0; i < 5; i++) { - int y = 30 - i; - - makeMezzTopStairs(world, sbb, y, 10 + i, 3); - makeMezzTopStairs(world, sbb, y, 38 - i, 1); - - y = 25 - i; - int x = 37 - i; - this.fillWithMetadataBlocks(world, sbb, x, y, 14, x, y, 22, deco.stairID, getStairMeta(0), deco.stairID, getStairMeta(0), false); - this.fillWithMetadataBlocks(world, sbb, x, y - 1, 14, x, y - 1, 22, deco.blockID, deco.blockMeta, deco.blockID, deco.blockMeta, false); - this.fillWithMetadataBlocks(world, sbb, x, y, 26, x, y, 34, deco.stairID, getStairMeta(0), deco.stairID, getStairMeta(0), false); - this.fillWithMetadataBlocks(world, sbb, x, y - 1, 26, x, y - 1, 34, deco.blockID, deco.blockMeta, deco.blockID, deco.blockMeta, false); - } - - - // pillars - for (int x = 11; x < 47; x += 12) { - for (int z = 11; z < 47; z += 12) { - this.fillWithMetadataBlocks(world, sbb, x, 1, z, x + 2, 40, z + 2, deco.pillarID, deco.pillarMeta, deco.blockID, deco.blockMeta, false); - - makePillarBase(world, sbb, x, z, 1, 0); - makePillarBase(world, sbb, x, z, 19, 4); - makePillarBase(world, sbb, x, z, 21, 0); - makePillarBase(world, sbb, x, z, 39, 4); - - - } - } - - // side pillars - for (int rotation = 0; rotation < 4; rotation++) { - for (int z = 11; z < 47; z += 12) { - - // no middle pillars on walls with entrances - if (z == 23 && (rotation == 0 || rotation == 2)) { - continue; - } - - this.fillBlocksRotated(world, sbb, 1, 1, z, 1, 40, z + 2, deco.pillarID, deco.pillarMeta, rotation); - makeHalfPillarBase(world, sbb, rotation, 1, z, 0); - makeHalfPillarBase(world, sbb, rotation, 19, z, 4); - makeHalfPillarBase(world, sbb, rotation, 21, z, 0); - makeHalfPillarBase(world, sbb, rotation, 39, z, 4); - } - } - - // second floor - fillWithRandomizedBlocks(world, sbb, 1, 20, 1, 47, 20, 47, false, rand, deco.randomBlocks); - - // force field around dungeon stairs - Block fieldBlock = TFBlocks.forceField; - int fieldMeta = 6; - this.fillWithMetadataBlocks(world, sbb, 12, 1, 12, 24, 10, 12, fieldBlock, fieldMeta, fieldBlock, fieldMeta, false); - this.fillWithMetadataBlocks(world, sbb, 12, 1, 12, 12, 10, 24, fieldBlock, fieldMeta, fieldBlock, fieldMeta, false); - this.fillWithMetadataBlocks(world, sbb, 24, 1, 12, 24, 10, 24, fieldBlock, fieldMeta, fieldBlock, fieldMeta, false); - this.fillWithMetadataBlocks(world, sbb, 12, 1, 24, 24, 10, 24, fieldBlock, fieldMeta, fieldBlock, fieldMeta, false); - - this.fillWithMetadataBlocks(world, sbb, 12, 10, 12, 24, 10, 24, fieldBlock, fieldMeta, fieldBlock, fieldMeta, false); - - // doors in dungeon force field - this.fillWithMetadataBlocks(world, sbb, 17, 1, 12, 19, 4, 12, TFBlocks.castleDoor, 2, Blocks.air, 0, false); - this.fillWithMetadataBlocks(world, sbb, 17, 1, 24, 19, 4, 24, TFBlocks.castleDoor, 2, Blocks.air, 0, false); - - // stairs to stair towers - makeSmallTowerStairs(world, sbb, 0); - makeSmallTowerStairs(world, sbb, 1); - makeSmallTowerStairs(world, sbb, 3); - makeLargeTowerStairs(world, sbb, 2); - - // door, first floor - this.fillWithMetadataBlocks(world, sbb, 48, 1, 23, 48, 4, 25, TFBlocks.castleDoor, 0, Blocks.air, 0, false); - - // door, second floor - this.fillWithMetadataBlocks(world, sbb, 0, 31, 23, 0, 34, 25, TFBlocks.castleDoor, 1, Blocks.air, 0, false); - - return true; - } - - private void makeSmallTowerStairs(World world, StructureBoundingBox sbb, int rotation) { - for (int y = 1; y < 4; y++) { - int z = 40 + y; - this.fillBlocksRotated(world, sbb, 1, 1, z, 4, y, z, deco.blockID, deco.blockMeta, rotation); - this.fillBlocksRotated(world, sbb, 2, y, z, 3, y, z, deco.stairID, getStairMeta(1 + rotation), rotation); - } - } - - private void makeLargeTowerStairs(World world, StructureBoundingBox sbb, int rotation) { - for (int y = 1; y < 4; y++) { - int z = 38 + y; - this.fillBlocksRotated(world, sbb, 2, 1, z, 6, y, z, deco.blockID, deco.blockMeta, rotation); - this.fillBlocksRotated(world, sbb, 3, y, z, 5, y, z, deco.stairID, getStairMeta(1 + rotation), rotation); - } - } - - private void makeMezzTopStairs(World world, StructureBoundingBox sbb, int y, int z, int stairMeta) { - this.fillWithMetadataBlocks(world, sbb, 38, y, z, 46, y, z, deco.stairID, getStairMeta(stairMeta), deco.stairID, getStairMeta(stairMeta), false); - this.fillWithMetadataBlocks(world, sbb, 38, y - 1, z, 46, y - 1, z, deco.blockID, deco.blockMeta, deco.blockID, deco.blockMeta, false); - this.fillWithAir(world, sbb, 38, y + 1, z, 46, y + 3, z); - } - - private void makeHalfPillarBase(World world, StructureBoundingBox sbb, int rotation, int y, int z, int metaBit) { - this.fillBlocksRotated(world, sbb, 2, y, z - 1, 2, y, z + 3, deco.stairID, getStairMeta(2 + rotation) | metaBit, rotation); - this.placeBlockRotated(world, deco.stairID, getStairMeta(1 + rotation) | metaBit, 1, y, z - 1, rotation, sbb); - this.placeBlockRotated(world, deco.stairID, getStairMeta(3 + rotation) | metaBit, 1, y, z + 3, rotation, sbb); - } - - private void makePillarBase(World world, StructureBoundingBox sbb, int x, int z, int y, int metaBit) { - this.fillWithMetadataBlocks(world, sbb, x + 0, y, z + 3, x + 3, y, z + 3, deco.stairID, getStairMeta(3) | metaBit, Blocks.air, 0, false); - this.fillWithMetadataBlocks(world, sbb, x - 1, y, z - 1, x + 2, y, z - 1, deco.stairID, getStairMeta(1) | metaBit, Blocks.air, 0, false); - - this.fillWithMetadataBlocks(world, sbb, x + 3, y, z - 1, x + 3, y, z + 2, deco.stairID, getStairMeta(2) | metaBit, Blocks.air, 0, false); - this.fillWithMetadataBlocks(world, sbb, x - 1, y, z + 0, x - 1, y, z + 3, deco.stairID, getStairMeta(0) | metaBit, Blocks.air, 0, false); - } - - } - - public static class Roof48Crenellated extends StructureTFComponent { - public Roof48Crenellated() {} - - public Roof48Crenellated(Random rand, int i, StructureTFComponent keep) { - super(i); - - int height = 5; - - this.setCoordBaseMode(keep.getCoordBaseMode()); - this.boundingBox = new StructureBoundingBox(keep.getBoundingBox().minX - 2, keep.getBoundingBox().maxY - 1, keep.getBoundingBox().minZ - 2, keep.getBoundingBox().maxX + 2, keep.getBoundingBox().maxY + height - 1, keep.getBoundingBox().maxZ + 2); - - } - - @SuppressWarnings({ "unchecked", "rawtypes" }) - @Override - public void buildComponent(StructureComponent parent, List list, Random rand) { - if (parent != null && parent instanceof StructureTFComponent) { - this.deco = ((StructureTFComponent)parent).deco; - } - } - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - // add second layer of floor - this.fillWithMetadataBlocks(world, sbb, 2, 2, 2, 50, 2, 50, TFBlocks.castleMagic, 3, TFBlocks.castleMagic, 3, false); - - // crenellations - for (int rotation = 0; rotation < 4; rotation++) { - this.fillBlocksRotated(world, sbb, 3, 1, 1, 45, 3, 1, deco.blockID, deco.blockMeta, rotation); - - for (int i = 10; i < 41; i += 5) { - this.fillBlocksRotated(world, sbb, i, 1, 0, i + 2, 5, 2, deco.blockID, deco.blockMeta, rotation); - this.placeBlockRotated(world, deco.blockID, deco.blockMeta, i + 1, 0, 1, rotation, sbb); - } - } - - return true; - } - - } - - public static class BossGazebo extends StructureTFComponent { - - public BossGazebo() { - } - - public BossGazebo(Random rand, int i, StructureTFComponent keep) { - super(i); - this.spawnListIndex = -1; // no monsters - - this.setCoordBaseMode(keep.getCoordBaseMode()); - this.boundingBox = new StructureBoundingBox(keep.getBoundingBox().minX + 14, keep.getBoundingBox().maxY + 2, keep.getBoundingBox().minZ + 14, keep.getBoundingBox().maxX - 14, keep.getBoundingBox().maxY + 13, keep.getBoundingBox().maxZ - 14); - - } - - - @SuppressWarnings({ "unchecked", "rawtypes" }) - @Override - public void buildComponent(StructureComponent parent, List list, Random rand) { - this.deco = new StructureTFDecoratorCastle(); - this.deco.blockID = TFBlocks.castleMagic; - this.deco.blockMeta = 1; - - this.deco.fenceID = TFBlocks.forceField; - this.deco.fenceMeta = 10; - } - - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - // walls - for (int rotation = 0; rotation < 4; rotation++) { - this.fillBlocksRotated(world, sbb, 0, 0, 0, 0, 10, 20, deco.fenceID, deco.fenceMeta, rotation); - } - - // roof - this.fillWithMetadataBlocks(world, sbb, 0, 11, 0, 20, 11, 20, deco.fenceID, deco.fenceMeta, deco.fenceID, deco.fenceMeta, false); - - this.placeSignAtCurrentPosition(world, 10, 0, 10, "Final Boss Here", "You win!", sbb); - - - return true; - } - - - } - - public static class Foundation48 extends StructureTFComponent { - private int groundLevel = -1; - - public Foundation48() { - } - - public Foundation48(Random rand, int i, StructureTFComponent sideTower) { - super(i); - - this.setCoordBaseMode(sideTower.getCoordBaseMode()); - this.boundingBox = new StructureBoundingBox(sideTower.getBoundingBox().minX, sideTower.getBoundingBox().minY, sideTower.getBoundingBox().minZ, sideTower.getBoundingBox().maxX, sideTower.getBoundingBox().minY - 1, sideTower.getBoundingBox().maxZ); - - } - - @SuppressWarnings({ "unchecked", "rawtypes" }) - @Override - public void buildComponent(StructureComponent parent, List list, Random rand) { - if (parent != null && parent instanceof StructureTFComponent) { - this.deco = ((StructureTFComponent)parent).deco; - } - } - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - // foundation - for (int x = 4; x < 45; x++) - { - for (int z = 4; z < 45; z++) - { - this.func_151554_b(world, deco.blockID, deco.blockMeta, x, -1, z, sbb); - } - - } - - int mid = 16; - for (int rotation = 0; rotation < 4; rotation++) { - // do corner - this.fillToGroundRotated(world, deco.blockID, deco.blockMeta, 3, -2, 3, rotation, sbb); - - // directly under castle - this.fillBlocksRotated(world, sbb, 2, -2, 1, 46, -1, 1, deco.blockID, deco.blockMeta, rotation); - this.fillBlocksRotated(world, sbb, 2, -4, 2, 45, -1, 2, deco.blockID, deco.blockMeta, rotation); - this.fillBlocksRotated(world, sbb, 4, -6, 3, 44, -1, 3, deco.blockID, deco.blockMeta, rotation); - - // pilings - for (int i = 9; i < 45; i += 6) { - makePiling(world, sbb, mid, rotation, i); - } - - makePiling(world, sbb, mid, rotation, 4); - makePiling(world, sbb, mid, rotation, 44); - - } - - // add supports for entrance bridge - this.fillToGroundRotated(world, deco.blockID, deco.blockMeta, 21, -2, 0, 1, sbb); - this.fillToGroundRotated(world, deco.blockID, deco.blockMeta, 21, -4, 1, 1, sbb); - this.fillToGroundRotated(world, deco.blockID, deco.blockMeta, 21, -6, 2, 1, sbb); - this.fillToGroundRotated(world, deco.blockID, deco.blockMeta, 27, -2, 0, 1, sbb); - this.fillToGroundRotated(world, deco.blockID, deco.blockMeta, 27, -4, 1, 1, sbb); - this.fillToGroundRotated(world, deco.blockID, deco.blockMeta, 27, -6, 2, 1, sbb); - - return true; - } - - private void makePiling(World world, StructureBoundingBox sbb, int mid, int rotation, int i) { - this.fillToGroundRotated(world, deco.blockID, deco.blockMeta, i, -7, 3, rotation, sbb); - this.fillToGroundRotated(world, deco.blockID, deco.blockMeta, i, -mid, 2, rotation, sbb); - - this.placeBlockRotated(world, deco.blockID, deco.blockMeta, i, -1, 0, rotation, sbb); - this.placeBlockRotated(world, deco.blockID, deco.blockMeta, i, -3, 1, rotation, sbb); - this.placeBlockRotated(world, deco.blockID, deco.blockMeta, i, -5, 2, rotation, sbb); - } - - } - - public static class DungeonSteps extends StructureTFComponent { - public DungeonSteps() { } - - public DungeonSteps(Random rand, int i, int x, int y, int z, int rotation) { - this.spawnListIndex = 2; // dungeon monsters - - this.setCoordBaseMode(rotation); - this.boundingBox = StructureTFComponent.getComponentToAddBoundingBox2(x, y, z, -2, -15, -3, 5, 15, 20, rotation); - } - - @SuppressWarnings({ "unchecked", "rawtypes" }) - @Override - public void buildComponent(StructureComponent parent, List list, Random rand) { - if (parent != null && parent instanceof StructureTFComponent) { - this.deco = ((StructureTFComponent)parent).deco; - } - } - - /** - * build more steps towards the specified direction - */ - public DungeonSteps buildMoreStepsTowards(StructureComponent parent, List list, Random rand, int rotation) { - - int direction = (rotation + this.coordBaseMode) % 4; - - int sx = 2; - int sy = 0; - int sz = 17; - - switch (rotation) { - case 0: - sz -= 5; - break; - case 1: - sx -= 5; - break; - case 2: - sz += 5; - break; - case 3: - sx += 6; - break; - } - - // find center of landing - int dx = this.getXWithOffset(sx, sz); - int dy = this.getYWithOffset(sy); - int dz = this.getZWithOffset(sx, sz); - - - // build a new stairway there - DungeonSteps steps = new DungeonSteps(rand, this.componentType + 1, dx, dy, dz, direction); - list.add(steps); - steps.buildComponent(this, list, rand); - - return steps; - } - - /** - * build a new level under the exit - */ - public DungeonEntrance buildLevelUnder(StructureComponent parent, List list, Random rand, int level) { - // find center of landing - int dx = this.getXWithOffset(2, 19); - int dy = this.getYWithOffset(-7); - int dz = this.getZWithOffset(2, 19); - - // build a new dungeon level under there - DungeonEntrance room = new DungeonEntrance(rand, 8, dx, dy, dz, this.coordBaseMode, level); - list.add(room); - room.buildComponent(this, list, rand); - - return room; - } - - /** - * build the boss room - */ - public DungeonForgeRoom buildBossRoomUnder(StructureComponent parent, List list, Random rand) { - // find center of landing - int dx = this.getXWithOffset(2, 19); - int dy = this.getYWithOffset(-31); - int dz = this.getZWithOffset(2, 19); - - // build a new dungeon level under there - DungeonForgeRoom room = new DungeonForgeRoom(rand, 8, dx, dy, dz, this.coordBaseMode); - list.add(room); - room.buildComponent(this, list, rand); - - //System.out.println("Made dungeon boss room at " + dx + ", " + dy + ", " + dz + "."); - - return room; - } - - - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - for (int z = 0; z < 15; z++) { - int y = 14 - z; - this.fillWithMetadataBlocks(world, sbb, 0, y, z, 4, y, z, deco.stairID, getStairMeta(3), deco.stairID, getStairMeta(3), false); - this.fillWithAir(world, sbb, 0, y + 1, z, 4, y + 6, z); - } - this.fillWithAir(world, sbb, 0, 0, 15, 4, 5, 19); - - return true; - } - - } - - public static class DungeonEntrance extends DungeonRoom31 { - public boolean hasExit = false; - - public DungeonEntrance() { - } - - public DungeonEntrance(Random rand, int i, int x, int y, int z, int direction, int level) { - super(rand, i, x, y, z, direction, level); - } - - @SuppressWarnings({ "unchecked", "rawtypes" }) - @Override - public void buildComponent(StructureComponent parent, List list, Random rand) { - this.deco = new StructureTFDecoratorCastle(); - this.deco.blockID = TFBlocks.castleMagic; - this.deco.blockMeta = 2; - - this.deco.fenceID = TFBlocks.forceField; - this.deco.fenceMeta = 1; - - // this is going to be the parent for all rooms on this level - super.buildComponent(this, list, rand); - } - - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - super.addComponentParts(world, rand, sbb); - - // stairs - for (int y = 0; y <= this.height; y++) { - int x = (this.size / 2) - 2; - int z = (this.size / 2) - y + 2; - this.fillWithMetadataBlocks(world, sbb, x, y, z, x + 4, y, z, deco.stairID, getStairMeta(3), deco.stairID, getStairMeta(3), false); - this.fillWithMetadataBlocks(world, sbb, x, 0, z, x + 4, y - 1, z, TFBlocks.deadrock, 0, TFBlocks.deadrock, 0, false); - } - - // door - this.fillWithMetadataBlocks(world, sbb, 23, 0, 12, 23, 3, 14, TFBlocks.castleDoor, 2, Blocks.air, 0, false); - this.fillWithMetadataBlocks(world, sbb, 23, 4, 12, 23, 4, 14, deco.blockID, deco.blockMeta, deco.blockID, deco.blockMeta, false); - - - return true; - } - - protected int getForceFieldMeta(Random decoRNG) { - return 1; - } - - protected int getRuneMeta(int fieldMeta) { - return 0; - } - } - - public static class DungeonExit extends DungeonRoom31 { - public DungeonExit() { - } - - public DungeonExit(Random rand, int i, int x, int y, int z, int direction, int level) { - super(rand, i, x, y, z, direction, level); - } - - - @SuppressWarnings({ "unchecked", "rawtypes" }) - @Override - public void buildComponent(StructureComponent parent, List list, Random rand) { - if (parent != null && parent instanceof StructureTFComponent) { - this.deco = ((StructureTFComponent)parent).deco; - } - - // no need for additional rooms, we're along the outside anyways - - // add stairway down - int bestDir = this.findStairDirectionTowards(parent.getBoundingBox().minX, parent.getBoundingBox().minZ); - - DungeonSteps steps0 = new DungeonSteps(rand, 5, boundingBox.minX + 15, boundingBox.minY + 0, boundingBox.minZ + 15, bestDir); - list.add(steps0); - steps0.buildComponent(this, list, rand); - - // another level!? - if (this.level == 1) { - steps0.buildLevelUnder(parent, list, rand, this.level + 1); - } else { - steps0.buildBossRoomUnder(parent, list, rand); - } - } - - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - super.addComponentParts(world, rand, sbb); - - // door - this.fillWithMetadataBlocks(world, sbb, 7, 0, 16, 7, 3, 18, TFBlocks.castleDoor, 2, Blocks.air, 0, false); - this.fillWithMetadataBlocks(world, sbb, 7, 4, 16, 7, 4, 18, deco.blockID, deco.blockMeta, deco.blockID, deco.blockMeta, false); - - - return true; - } - - - public int findStairDirectionTowards(int x, int z) { - // center of component - int cx = this.boundingBox.getCenterX(); - int cz = this.boundingBox.getCenterZ(); - - // difference - int dx = cx - x; - int dz = cz - z; - - int absoluteDir; - if (Math.abs(dz) >= Math.abs(dx)) { - absoluteDir = (dz >= 0) ? 2 : 0; - } else { - absoluteDir = (dx >= 0) ? 3 : 1; - } - - return absoluteDir; - } - - protected int getForceFieldMeta(Random decoRNG) { - return 1; - } - - protected int getRuneMeta(int fieldMeta) { - return 0; - } - } - - public static class DungeonRoom31 extends ComponentTFTowerWing { - public int level; // this is not serialized, since it's only used during build, which should be all one step - - public DungeonRoom31() { - } - - public DungeonRoom31(Random rand, int i, int x, int y, int z, int direction, int level) { - super(i); - this.setCoordBaseMode(direction); - this.spawnListIndex = 2; // dungeon monsters - this.size = 31; - this.height = 7; - this.level = level; - this.boundingBox = StructureTFComponent.getComponentToAddBoundingBox(x, y, z, -15, 0, -15, this.size - 1, this.height - 1, this.size - 1, 0); - } - - @SuppressWarnings({ "unchecked", "rawtypes" }) - @Override - public void buildComponent(StructureComponent parent, List list, Random rand) { - if (parent != null && parent instanceof StructureTFComponent) { - this.deco = ((StructureTFComponent)parent).deco; - } - - int mySpread = this.getComponentType() - parent.getComponentType(); - int maxSpread = (this.level == 1) ? 2 : 3; - - // add exit if we're far enough away and don't have one - if (mySpread == maxSpread && !isExitBuildForLevel(parent)) { - int direction = rand.nextInt(4); - for (int i = 0; i < 8 && !isExitBuildForLevel(parent); i++) { - direction = (direction + i) % 4; - if (this.addDungeonExit(parent, list, rand, direction)) { - this.setExitBuiltForLevel(parent, true); - } - } - } - - // add other rooms - if (mySpread < maxSpread) { - int direction = rand.nextInt(4); - for (int i = 0; i < 12; i++) { - direction = (direction + i) % 4; - this.addDungeonRoom(parent, list, rand, direction, this.level); - } - } - } - - private boolean isExitBuildForLevel(StructureComponent parent) { - if (parent instanceof DungeonEntrance) { - return ((DungeonEntrance)parent).hasExit; - } else { - return false; - } - } - - private void setExitBuiltForLevel(StructureComponent parent, boolean exit) { - if (parent instanceof DungeonEntrance) { - ((DungeonEntrance)parent).hasExit = exit; - } else {} - } - - protected boolean addDungeonRoom(StructureComponent parent, List list, Random rand, int rotation, int level) { - rotation = (this.coordBaseMode + rotation) % 4; - - ChunkCoordinates rc = this.getNewRoomCoords(rand, rotation); - - DungeonRoom31 dRoom = new DungeonRoom31(rand, this.componentType + 1, rc.posX, rc.posY, rc.posZ, rotation, level); - - StructureBoundingBox largerBB = new StructureBoundingBox(dRoom.getBoundingBox()); - - int expand = 0; - largerBB.minX -= expand; - largerBB.minZ -= expand; - largerBB.maxX += expand; - largerBB.maxZ += expand; - - StructureComponent intersect = StructureTFComponent.findIntersectingExcluding(list, largerBB, this); - if (intersect == null) { - list.add(dRoom); - dRoom.buildComponent(parent, list, rand); - return true; - } else { - return false; - } - } - - protected boolean addDungeonExit(StructureComponent parent, List list, Random rand, int rotation) { - - //TODO: check if we are sufficiently near the castle center - - rotation = (this.coordBaseMode + rotation) % 4; - ChunkCoordinates rc = this.getNewRoomCoords(rand, rotation); - DungeonExit dRoom = new DungeonExit(rand, this.componentType + 1, rc.posX, rc.posY, rc.posZ, rotation, this.level); - StructureComponent intersect = StructureTFComponent.findIntersectingExcluding(list, dRoom.getBoundingBox(), this); - if (intersect == null) { - list.add(dRoom); - dRoom.buildComponent(this, list, rand); - return true; - } else { - return false; - } - } - - private ChunkCoordinates getNewRoomCoords(Random rand, int rotation) { - // make the rooms connect around the corners, not the centers - int offset = rand.nextInt(15) - 9; - if (rand.nextBoolean()) { - offset += this.size; - } - - switch (rotation) { - default: - case 0: - return new ChunkCoordinates(this.boundingBox.maxX + 9, this.boundingBox.minY, this.boundingBox.minZ + offset); - case 1: - return new ChunkCoordinates(this.boundingBox.minX + offset, this.boundingBox.minY, this.boundingBox.maxZ + 9); - case 2: - return new ChunkCoordinates(this.boundingBox.minX - 9, this.boundingBox.minY, this.boundingBox.minZ + offset); - case 3: - return new ChunkCoordinates(this.boundingBox.minX + offset, this.boundingBox.minY, this.boundingBox.minZ - 9); - } - } - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - if (this.isBoundingBoxOutOfPlateau(world, sbb)) { - return false; - } - - Random decoRNG = new Random(world.getSeed() + (this.boundingBox.minX * 321534781) ^ (this.boundingBox.minZ * 756839)); - - this.fillWithAir(world, sbb, 0, 0, 0, this.size - 1, this.height - 1, this.size - 1); - int forceFieldMeta = this.getForceFieldMeta(decoRNG); - int runeMeta = getRuneMeta(forceFieldMeta); - - for (int rotation = 0; rotation < 4; rotation++) { - int cs = 7; - this.fillBlocksRotated(world, sbb, cs, 0, cs + 1, cs, this.height - 1, this.size - 2 - cs, TFBlocks.forceField, forceFieldMeta, rotation); - // verticals - for (int z = cs; z < ((this.size - 1) - cs); z += 4) { - this.fillBlocksRotated(world, sbb, cs, 0, z, cs, this.height - 1, z, TFBlocks.castleMagic, runeMeta, rotation); - // horizontals - int y = ((z - cs) % 8 == 0) ? decoRNG.nextInt(3) + 0 : decoRNG.nextInt(3) + 4; - this.fillBlocksRotated(world, sbb, cs, y, z + 1, cs, y, z + 3, TFBlocks.castleMagic, runeMeta, rotation); - } - } - - return true; - } - - private boolean isBoundingBoxOutOfPlateau(World world, StructureBoundingBox sbb) { - int minX = this.boundingBox.minX - 1; - int minZ = this.boundingBox.minZ - 1; - int maxX = this.boundingBox.maxX + 1; - int maxZ = this.boundingBox.maxZ + 1; - - for (int x = minX; x <= maxX; x++) { - for (int z = minZ; z <= maxZ; z++) { - if (world.getBiomeGenForCoords(x, z) != TFBiomeBase.highlandsCenter && world.getBiomeGenForCoords(x, z) != TFBiomeBase.thornlands) { - return true; - } - } - } - - return false; - } - - protected int getRuneMeta(int forceFieldMeta) { - return (forceFieldMeta == 4) ? 1 : 2; - } - - protected int getForceFieldMeta(Random decoRNG) { - return decoRNG.nextInt(2) + 3; - } - - } - - public static class DungeonForgeRoom extends StructureTFComponent { - public DungeonForgeRoom() { - } - - public DungeonForgeRoom(Random rand, int i, int x, int y, int z, int direction) { - super(i); - this.spawnListIndex = 3; // forge monsters - this.setCoordBaseMode(direction); - this.boundingBox = StructureTFComponent.getComponentToAddBoundingBox2(x, y, z, -15, 0, -15, 50, 30, 50, direction); - } - - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - this.fillWithAir(world, sbb, 0, 0, 0, 50, 30, 50); - - // sign - this.placeSignAtCurrentPosition(world, 25, 0, 25, "Mini-boss 2", "Gives talisman", sbb); - - return true; - } - - } - - - public static class StairTower extends ComponentTFTowerWing { - - public StairTower() { } - - public StairTower(Random rand, int i, int x, int y, int z, int rotation) { - this.setCoordBaseMode(rotation); - this.size = 9; - this.height = 51; - this.boundingBox = StructureTFComponent.getComponentToAddBoundingBox(x, y, z, -4, 0, -4, 8, 50, 8, 0); - - } - - @SuppressWarnings({ "unchecked", "rawtypes" }) - @Override - public void buildComponent(StructureComponent parent, List list, Random rand) { - if (parent != null && parent instanceof StructureTFComponent) { - this.deco = ((StructureTFComponent)parent).deco; - } - // add crown - Roof9Crenellated roof = new Roof9Crenellated(rand, 4, this); - list.add(roof); - roof.buildComponent(this, list, rand); - } - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - Random decoRNG = new Random(world.getSeed() + (this.boundingBox.minX * 321534781) ^ (this.boundingBox.minZ * 756839)); - - fillWithRandomizedBlocks(world, sbb, 0, 0, 0, 8, 49, 8, false, rand, deco.randomBlocks); - - // add branching runes - int numBranches = 6 + decoRNG.nextInt(4); - for (int i = 0; i < numBranches; i++) { - makeGlyphBranches(world, decoRNG, this.getGlyphMeta(), sbb); - } - - // beard - for (int i = 1; i < 4; i++) { - fillWithRandomizedBlocks(world, sbb, i, 0 - (i * 2), i, 8 - i, 1 - (i * 2), 8 - i, false, rand, deco.randomBlocks); - } - this.placeBlockAtCurrentPosition(world, deco.blockID, deco.blockMeta, 4, -7, 4, sbb); - - - // door, first floor - this.fillWithMetadataBlocks(world, sbb, 0, 1, 1, 0, 3, 2, TFBlocks.castleDoor, this.getGlyphMeta(), Blocks.air, 0, false); - - // stairs - for (int f = 0; f < 5; f++) { - int rotation = (f + 2) % 4; - int y = f * 3 + 1; - for (int i = 0; i < 3; i++) { - int sx = 3 + i; - int sy = y + i; - int sz = 1; - - this.placeBlockRotated(world, deco.stairID, getStairMeta(0 + rotation), sx, sy, sz, rotation, sbb); - this.placeBlockRotated(world, deco.blockID, deco.blockMeta, sx, sy - 1, sz, rotation, sbb); - this.placeBlockRotated(world, deco.stairID, getStairMeta(0 + rotation), sx, sy, sz + 1, rotation, sbb); - this.placeBlockRotated(world, deco.blockID, deco.blockMeta, sx, sy - 1, sz + 1, rotation, sbb); - } - // landing - this.fillBlocksRotated(world, sbb, 6, y + 2, 1, 7, y + 2, 2, deco.blockID, deco.blockMeta, rotation); - } - - // door, second floor - this.fillWithMetadataBlocks(world, sbb, 1, 18, 0, 2, 20, 0, TFBlocks.castleDoor, this.getGlyphMeta(), Blocks.air, 0, false); - - // second floor landing - this.fillWithMetadataBlocks(world, sbb, 1, 17, 1, 3, 17, 3, deco.blockID, deco.blockMeta, deco.blockID, deco.blockMeta, false); - this.fillWithMetadataBlocks(world, sbb, 1, 17, 4, 2, 17, 4, deco.stairID, getStairMeta(3), deco.stairID, getStairMeta(3), false); - this.fillWithMetadataBlocks(world, sbb, 1, 16, 4, 2, 16, 4, deco.blockID, deco.blockMeta, deco.blockID, deco.blockMeta, false); - this.fillWithMetadataBlocks(world, sbb, 1, 16, 5, 2, 16, 5, deco.stairID, getStairMeta(3), deco.stairID, getStairMeta(3), false); - this.fillWithMetadataBlocks(world, sbb, 1, 15, 5, 2, 15, 5, deco.blockID, deco.blockMeta, deco.blockID, deco.blockMeta, false); - - // door, roof - this.fillWithMetadataBlocks(world, sbb, 1, 39, 0, 2, 41, 0, TFBlocks.castleDoor, this.getGlyphMeta(), Blocks.air, 0, false); - - // stairs - for (int f = 0; f < 7; f++) { - int rotation = (f + 0) % 4; - int y = f * 3 + 18; - for (int i = 0; i < 3; i++) { - int sx = 3 + i; - int sy = y + i; - int sz = 1; - - this.placeBlockRotated(world, deco.stairID, getStairMeta(0 + rotation), sx, sy, sz, rotation, sbb); - this.placeBlockRotated(world, deco.blockID, deco.blockMeta, sx, sy - 1, sz, rotation, sbb); - this.placeBlockRotated(world, deco.stairID, getStairMeta(0 + rotation), sx, sy, sz + 1, rotation, sbb); - this.placeBlockRotated(world, deco.blockID, deco.blockMeta, sx, sy - 1, sz + 1, rotation, sbb); - } - // landing - this.fillBlocksRotated(world, sbb, 6, y + 2, 1, 7, y + 2, 2, deco.blockID, deco.blockMeta, rotation); - } - - // roof access landing - this.fillWithMetadataBlocks(world, sbb, 1, 38, 1, 3, 38, 5, deco.blockID, deco.blockMeta, deco.blockID, deco.blockMeta, false); - this.fillWithMetadataBlocks(world, sbb, 3, 39, 1, 3, 39, 5, deco.fenceID, deco.fenceMeta, deco.fenceID, deco.fenceMeta, false); - - - return true; - } - - - public int getGlyphMeta() { - return 1; - } - - - } - - public static class LargeTower extends ComponentTFTowerWing { - - public LargeTower() { - } - - public LargeTower(Random rand, int i, int x, int y, int z, int rotation) { - this.setCoordBaseMode(rotation); - this.size = 13; - this.height = 61; - this.boundingBox = StructureTFComponent.getComponentToAddBoundingBox(x, y, z, -6, 0, -6, 12, 60, 12, 0); - - } - - @SuppressWarnings({ "unchecked", "rawtypes" }) - @Override - public void buildComponent(StructureComponent parent, List list, Random rand) { - if (parent != null && parent instanceof StructureTFComponent) { - this.deco = ((StructureTFComponent)parent).deco; - } - // add crown - Roof9Crenellated roof = new Roof9Crenellated(rand, 4, this); - list.add(roof); - roof.buildComponent(this, list, rand); - } - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - Random decoRNG = new Random(world.getSeed() + (this.boundingBox.minX * 321534781) ^ (this.boundingBox.minZ * 756839)); - - fillWithRandomizedBlocks(world, sbb, 0, 0, 0, 12, 59, 12, false, rand, deco.randomBlocks); - - // add branching runes - int numBranches = 6 + decoRNG.nextInt(4); - for (int i = 0; i < numBranches; i++) { - makeGlyphBranches(world, decoRNG, this.getGlyphMeta(), sbb); - } - - // beard - for (int i = 1; i < 4; i++) { - fillWithRandomizedBlocks(world, sbb, i, 0 - (i * 2), i, 8 - i, 1 - (i * 2), 8 - i, false, rand, deco.randomBlocks); - } - this.placeBlockAtCurrentPosition(world, deco.blockID, deco.blockMeta, 4, -7, 4, sbb); - - // door, first floor - this.fillWithMetadataBlocks(world, sbb, 0, 1, 1, 0, 4, 3, TFBlocks.castleDoor, 0, Blocks.air, this.getGlyphMeta(), false); - - this.placeSignAtCurrentPosition(world, 6, 1, 6, "Parkour area 1", "Unique monster?", sbb); - - return true; - } - - - public int getGlyphMeta() { - return 0; - } - - - } - - public static class Mural extends StructureTFComponent { - - private int height; - private int width; - - // we will model the mural in this byte array - private byte[][] mural; - - public Mural() {} - - public Mural(Random rand, int i, int x, int y, int z, int width, int height, int direction) { - super(i); - this.setCoordBaseMode(direction); - this.boundingBox = StructureTFComponent.getComponentToAddBoundingBox2(x, y, z, 0, -height / 2, -width / 2, 1, height - 1, width - 1, direction); - } - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - this.height = this.boundingBox.getYSize(); - this.width = (this.coordBaseMode == 0 || this.coordBaseMode == 2) ? this.boundingBox.getZSize() : this.boundingBox.getXSize(); - - Random decoRNG = new Random(world.getSeed() + (this.boundingBox.minX * 321534781) ^ (this.boundingBox.minZ * 756839)); - - if (mural == null) { - // only make it once - mural = new byte[width][height]; - - int startX = width / 2 - 1; - int startY = 2; - - // make mural, fill in dot by start - for (int x = -1; x < 2; x++) { - for (int y = -1; y < 2; y++) { - mural[startX + x][startY + y] = 1; - } - } - - // side branches - makeHorizontalTree(decoRNG, mural, startX + 1, startY, decoRNG.nextInt(width / 6) + width / 6, true); - makeHorizontalTree(decoRNG, mural, startX - 1, startY, decoRNG.nextInt(width / 6) + width / 6, false); - - // main tree - makeVerticalTree(decoRNG, mural, startX, startY + 1, decoRNG.nextInt(height / 6) + height / 6, true); - - // stripes - makeStripes(decoRNG, mural); - } - - // copy mural to world - for (int x = 0; x < width; x++) { - for (int y = 0; y < height; y++) { - if (mural[x][y] > 0) { - this.placeBlockAtCurrentPosition(world, TFBlocks.castleMagic, 1, 0, y, x, sbb); - } else { - //this.placeBlockAtCurrentPosition(world, TFBlocks.forceField, 0, 0, y, x, sbb); - } - } - } - - return true; - } - - private void makeHorizontalTree(Random decoRNG, byte[][] mural, int centerX, int centerY, int branchLength, boolean positive) { - this.fillHorizontalLine(mural, centerX, centerY, branchLength, positive); - - this.makeHorizontalBranch(mural, decoRNG, centerX, centerY, branchLength, positive, true); - this.makeHorizontalBranch(mural, decoRNG, centerX, centerY, branchLength, positive, false); - } - - private void makeVerticalTree(Random decoRNG, byte[][] mural, int centerX, int centerY, int branchLength, boolean positive) { - this.fillVerticalLine(mural, centerX, centerY, branchLength, positive); - - this.makeVerticalBranch(mural, decoRNG, centerX, centerY, branchLength, positive, true); - this.makeVerticalBranch(mural, decoRNG, centerX, centerY, branchLength, positive, false); - } - - private boolean makeHorizontalBranch(byte[][] mural, Random rand, int sx, int sy, int length, boolean plusX, boolean plusY) { - int downLine = (length / 2) + 1 + rand.nextInt(Math.max(length / 2, 2)); - int branchLength = rand.nextInt(width / 8) + width / 8; - - // check if the area is clear - boolean clear = true; - for (int i = 0; i <= branchLength; i++) { - int cx = sx + (plusX ? downLine - 1 + i : -(downLine - 1 + i)); - int cy = sy + (plusY ? 2 : -2); - if (cx < 0 || cx >= width || cy < 0 || cy >= height || mural[cx][cy] > 0) { - clear = false; - break; - } - } - if (clear) { - int bx = sx + (plusX ? downLine : -downLine); - int by = sy; - - // jag - this.fillVerticalLine(mural, bx, by, 1, plusY); - - by += (plusY ? 2 : -2); - - this.fillHorizontalLine(mural, bx, by, branchLength, plusX); - - // recurse? - if (bx > 0 && bx < width && by > 0 && by < height) { - if (!this.makeHorizontalBranch(mural, rand, bx, by, branchLength, plusX, true)) { - if (!this.makeHorizontalBranch(mural, rand, bx, by, branchLength, plusX, true)) { - if (!this.makeHorizontalBranch(mural, rand, bx, by, branchLength, plusX, true)) { - this.makeHorizontalBranch(mural, rand, bx, by, branchLength, plusX, true); - } - } - } - if (!this.makeHorizontalBranch(mural, rand, bx, by, branchLength, plusX, false)) { - if (!this.makeHorizontalBranch(mural, rand, bx, by, branchLength, plusX, false)) { - if (!this.makeHorizontalBranch(mural, rand, bx, by, branchLength, plusX, false)) { - this.makeHorizontalBranch(mural, rand, bx, by, branchLength, plusX, false); - } - } - } - } - return true; - } else { - return false; - } - } - - private boolean makeVerticalBranch(byte[][] mural, Random rand, int sx, int sy, int length, boolean plusY, boolean plusX) { - int downLine = (length / 2) + 1 + rand.nextInt(Math.max(length / 2, 2)); - int branchLength = rand.nextInt(height / 8) + height / 8; - - // check if the area is clear - boolean clear = true; - for (int i = 0; i <= branchLength; i++) { - int cx = sx + (plusX ? 2 : -2); - int cy = sy + (plusY ? downLine - 1 + i : -(downLine - 1 + i)); - if (cx < 0 || cx >= width || cy < 0 || cy >= height || mural[cx][cy] > 0) { - clear = false; - break; - } - } - if (clear) { - int bx = sx; - int by = sy + (plusY ? downLine : -downLine);; - - // jag - this.fillHorizontalLine(mural, bx, by, 1, plusX); - - bx += (plusX ? 2 : -2); - - this.fillVerticalLine(mural, bx, by, branchLength, plusY); - - // recurse? - if (bx > 0 && bx < width && by > 0 && by < height) { - if (!this.makeVerticalBranch(mural, rand, bx, by, branchLength, plusY, true)) { - if (!this.makeVerticalBranch(mural, rand, bx, by, branchLength, plusY, true)) { - if (!this.makeVerticalBranch(mural, rand, bx, by, branchLength, plusY, true)) { - this.makeVerticalBranch(mural, rand, bx, by, branchLength, plusY, true); - } - } - } - if (!this.makeVerticalBranch(mural, rand, bx, by, branchLength, plusY, false)) { - if (!this.makeVerticalBranch(mural, rand, bx, by, branchLength, plusY, false)) { - if (!this.makeVerticalBranch(mural, rand, bx, by, branchLength, plusY, false)) { - this.makeVerticalBranch(mural, rand, bx, by, branchLength, plusY, false); - } - } - } - } - return true; - } else { - return false; - } - } - - private void fillHorizontalLine(byte[][] mural, int sx, int sy, int length, boolean positive) { - int x = sx; - int y = sy; - - for (int i = 0; i <= length; i++) { - if (x >= 0 && x < width && y >= 0 && y < height) { - mural[x][y] = (byte) (positive ? 1 : 4); - - x += positive ? 1 : -1; - } - } - } - - private void fillVerticalLine(byte[][] mural, int sx, int sy, int length, boolean positive) { - int x = sx; - int y = sy; - - for (int i = 0; i <= length; i++) { - if (x >= 0 && x < width && y >= 0 && y < height) { - mural[x][y] = (byte) (positive ? 2 : 3); - - y += positive ? 1 : -1; - } - } - } - - private void makeStripes(Random decoRNG, byte[][] mural2) { - // stagger slightly on our way down - for (int y = this.height - 2; y > this.height / 3; y -= (2 + decoRNG.nextInt(2))) { - makeSingleStripe(mural2, y); - } - } - - private void makeSingleStripe(byte[][] mural2, int y) { - for (int x = 0; x < this.width - 2; x++) { - if (mural[x + 1][y] == 0 && mural[x + 1][y + 1] == 0) { - mural[x][y] = 1; - } else { - break; - } - } - for (int x = this.width - 1; x > 2; x--) { - if (mural[x - 1][y] == 0 && mural[x - 1][y + 1] == 0) { - mural[x][y] = 1; - } else { - break; - } - } - } - - } - - public static class MazeTower13 extends ComponentTFTowerWing { - - public static final int LOWEST_DOOR = 144; - public static final int HIGHEST_DOOR = 222; - - public int type; - - public MazeTower13() { - } - - public MazeTower13(Random rand, int i, int x, int y, int z, int type, int direction) { - super(i); - this.setCoordBaseMode(direction); - this.type = type; - this.size = 13; - - // decide a number of floors, 2-5 - int floors = rand.nextInt(3) + 2; - - this.height = floors * 8 + 1; - - // entrance should be on a random floor - int entranceFloor = rand.nextInt(floors); - - // rationalize entrance floor if the tower is going to be too low, put the entrance floor at bottom. Too high, put it at top - if ((y - (entranceFloor * 8)) < LOWEST_DOOR) { - //System.out.println("Tower at " + x + ", " + z + " is getting too low, setting entrance to bottom floor."); - entranceFloor = 0; - } - if ((y + ((floors - entranceFloor) * 8)) > HIGHEST_DOOR) { - //System.out.println("Tower at " + x + ", " + z + " is getting too high, setting entrance to floor " + (floors - 1) + "."); - entranceFloor = floors - 1; - } - - this.boundingBox = StructureTFComponent.getComponentToAddBoundingBox(x, y, z, -6, 0 - (entranceFloor * 8), -6, this.size - 1, this.height, this.size - 1, 0); - - // we should have a door where we started - addOpening(0, entranceFloor * 8 + 1, size / 2, 2); - - } - - public MazeTower13(Random rand, int i, int x, int y, int z, int floors, int entranceFloor, int type, int direction) { - super(i); - this.setCoordBaseMode(direction); - this.type = type; - this.size = 13; - this.height = floors * 8 + 1; - this.boundingBox = StructureTFComponent.getComponentToAddBoundingBox(x, y, z, -6, 0 - (entranceFloor * 8), -6, this.size - 1, this.height, this.size - 1, 0); - addOpening(0, entranceFloor * 8 + 1, size / 2, 2); - } - - - @SuppressWarnings({ "unchecked", "rawtypes" }) - @Override - public void buildComponent(StructureComponent parent, List list, Random rand) { - if (parent != null && parent instanceof StructureTFComponent) { - this.deco = ((StructureTFComponent)parent).deco; - } - - // add foundation - Foundation13 foundation = new Foundation13(rand, 4, this); - list.add(foundation); - foundation.buildComponent(this, list, rand); - - // add roof - StructureTFComponent roof = rand.nextBoolean() ? new Roof13Conical(rand, 4, this) : new Roof13Crenellated(rand, 4, this); - list.add(roof); - roof.buildComponent(this, list, rand); - } - - /** - * Build more components towards the destination - */ - public void buildTowards(StructureComponent parent, List list, Random rand, ChunkCoordinates dest) { - // regular building first, adds roof/foundation - this.buildComponent(parent, list, rand); - - if (this.getComponentType() < 15) { - - // are we there? - if (this.isWithinRange(dest.posX, dest.posZ, this.boundingBox.minX + 6, this.boundingBox.minZ + 6, 30)) { - //System.out.println("We are within range of our destination, building final tower"); - int howFar = 20; - if (!buildEndTowerTowards(list, rand, dest, this.findBestDirectionTowards(dest), howFar)) { - if (!buildEndTowerTowards(list, rand, dest, this.findSecondDirectionTowards(dest), howFar)) { - if (!buildEndTowerTowards(list, rand, dest, this.findThirdDirectionTowards(dest), howFar)) { - //System.out.println("Cound not build final tower"); - } - } - } - } else { - - int howFar = 14 + rand.nextInt(24); - int direction = this.findBestDirectionTowards(dest); - - // build left or right, not straight if we can help it - if (direction == 0 || !buildContinueTowerTowards(list, rand, dest, direction, howFar)) { - direction = this.findSecondDirectionTowards(dest); - if (direction == 0 || !buildContinueTowerTowards(list, rand, dest, direction, howFar)) { - direction = this.findThirdDirectionTowards(dest); - if (direction == 0 || !buildContinueTowerTowards(list, rand, dest, direction, howFar)) { - // fine, just go straight - if (!buildContinueTowerTowards(list, rand, dest, 0, howFar)) { - //System.out.println("Could not build tower randomly"); - } - } - } - } - } - } - - // finally, now that the critical path is built, let's add some other towers for atmosphere and complication - this.buildNonCriticalTowers(parent, list, rand); - - } - - protected void buildNonCriticalTowers(StructureComponent parent, List list, Random rand) { - // pick a random direction - int dir = rand.nextInt(4); - - // if there isn't something in that direction, check if we can add a wrecked tower - if (this.openingTowards[dir] == false) { - if (!buildDamagedTower(list, rand, dir)) { - dir = (dir + rand.nextInt(4)) % 4; - if (!buildDamagedTower(list, rand, dir)) { - // maybe just a balcony? - //buildBalconyTowards(list, rand, dir); - } - } - } - - - } - - private int findBestDirectionTowards(ChunkCoordinates dest) { - - // center of tower - int cx = this.boundingBox.minX + 6; - int cz = this.boundingBox.minZ + 6; - - // difference - int dx = cx - dest.posX; - int dz = cz - dest.posZ; - - int absoluteDir = 0; - if (Math.abs(dx) > Math.abs(dz)) { - absoluteDir = (dx >= 0) ? 2 : 0; - } else { - absoluteDir = (dz >= 0) ? 3 : 1; - } - - int relativeDir = (absoluteDir + 4 - this.coordBaseMode) % 4; - - //System.out.println("Determining best direction! center is at " + cx + ", " + cz + " and dest is at " + dest + " offset is " + dx + ", " + dz + " so the best absolute direction is " + absoluteDir + " and relative dir is " + relativeDir); - - // return relative dir - return relativeDir; - } - - private int findSecondDirectionTowards(ChunkCoordinates dest) { - - // center of tower - int cx = this.boundingBox.minX + 6; - int cz = this.boundingBox.minZ + 6; - - // difference - int dx = cx - dest.posX; - int dz = cz - dest.posZ; - - int absoluteDir = 0; - if (Math.abs(dx) < Math.abs(dz)) { // reversed from findBestDirectionTowards - absoluteDir = (dx >= 0) ? 2 : 0; - } else { - absoluteDir = (dz >= 0) ? 3 : 1; - } - int relativeDir = (absoluteDir + 4 - this.coordBaseMode) % 4; - - - //System.out.println("Determining second direction! center is at " + cx + ", " + cz + " and dest is at " + dest + " offset is " + dx + ", " + dz + " so the best absolute direction is " + absoluteDir + " and relative dir is " + relativeDir); - - // return offset dir - return relativeDir; - } - - private int findThirdDirectionTowards(ChunkCoordinates dest) { - int first = this.findBestDirectionTowards(dest); - int second = this.findSecondDirectionTowards(dest); - - if (first == 0 && second == 1) { - return 3; - } else if (first == 1 && second == 3) { - return 0; - } else { - return 1; - } - } - - private boolean buildContinueTowerTowards(List list, Random rand, ChunkCoordinates dest, int direction, int howFar) { - ChunkCoordinates opening = this.getValidOpeningCC(rand, direction); - - // adjust opening towards dest.posY if we are getting close to dest - int adjustmentRange = 60; - if (this.isWithinRange(dest.posX, dest.posZ, this.boundingBox.minX + 6, this.boundingBox.minZ + 6, adjustmentRange)) { - opening.posY = this.adjustOpening(opening.posY, dest); - } - - //System.out.println("original direction is " + direction); - - - direction += this.coordBaseMode; - direction %= 4; - - // build towards - ChunkCoordinates tc = this.offsetTowerCCoords(opening.posX, opening.posY, opening.posZ, howFar, direction); - - //System.out.println("Our coord mode is " + this.getCoordBaseMode() + ", and direction is " + direction + ", so our door is going to be at " + opening + " and the new tower will appear at " + tc); - - // find start - StructureComponent start = (StructureComponent)list.get(0); - - //System.out.println("Testing range, uncorrected center is at " + centerX + ", " + centerZ); - - int centerX = ((start.getBoundingBox().minX + 128) >> 8) << 8; - int centerZ = ((start.getBoundingBox().minZ + 128) >> 8) << 8; - - if (isWithinRange(centerX, centerZ, tc.posX, tc.posZ, 128)) { - - MazeTower13 sTower = new MazeTower13(rand, this.getComponentType() + 1, tc.posX, tc.posY, tc.posZ, this.type, direction); - - StructureBoundingBox largerBB = new StructureBoundingBox(sTower.getBoundingBox()); - - largerBB.minX -= 6; - largerBB.minZ -= 6; - largerBB.maxX += 6; - largerBB.maxZ += 6; - largerBB.minY = 0; - largerBB.maxY = 255; - - StructureComponent intersect = StructureComponent.findIntersecting(list, largerBB); - - if (intersect == null) { - //System.out.println("tower success!"); - list.add(sTower); - sTower.buildTowards(this, list, rand, dest); - - // add bridge - ChunkCoordinates bc = this.offsetTowerCCoords(opening.posX, opening.posY, opening.posZ, 1, direction); - Bridge bridge = new Bridge(this.getComponentType() + 1, bc.posX, bc.posY, bc.posZ, howFar - 7, direction); - list.add(bridge); - bridge.buildComponent(this, list, rand); - - // opening - addOpening(opening.posX, opening.posY + 1, opening.posZ, direction); - - return true; - } else { - //System.out.println("tower blocked"); - return false; - } - } else { - //System.out.println("tower out of range"); - return false; - } - } - - - protected boolean buildDamagedTower(List list, Random rand, int direction) { - ChunkCoordinates opening = this.getValidOpeningCC(rand, direction); - - direction += this.coordBaseMode; - direction %= 4; - - int howFar = 14 + rand.nextInt(24); - // build towards - ChunkCoordinates tc = this.offsetTowerCCoords(opening.posX, opening.posY, opening.posZ, howFar, direction); - - // what type of tower? - MazeTower13 eTower = makeNewDamagedTower(rand, direction, tc); - - StructureBoundingBox largerBB = new StructureBoundingBox(eTower.getBoundingBox()); - - largerBB.minX -= 6; - largerBB.minZ -= 6; - largerBB.maxX += 6; - largerBB.maxZ += 6; - - StructureComponent intersect = StructureComponent.findIntersecting(list, largerBB); - - if (intersect == null) { - //System.out.println("wreck tower success! tower is at " + tc.posX + ", " + tc.posY + ", " + tc.posZ); - list.add(eTower); - eTower.buildComponent(this, list, rand); - // add bridge - ChunkCoordinates bc = this.offsetTowerCCoords(opening.posX, opening.posY, opening.posZ, 1, direction); - Bridge bridge = new Bridge(this.getComponentType() + 1, bc.posX, bc.posY, bc.posZ, howFar - 7, direction); - list.add(bridge); - bridge.buildComponent(this, list, rand); - - // opening - addOpening(opening.posX, opening.posY + 1, opening.posZ, direction); - - return true; - } else { - //System.out.println("damaged tower blocked"); - return false; - } - } - - protected MazeTower13 makeNewDamagedTower(Random rand, int direction, ChunkCoordinates tc) { - return new DamagedTower(rand, this.getComponentType() + 1, tc.posX, tc.posY, tc.posZ, direction); - } - - private int adjustOpening(int posY, ChunkCoordinates dest) { - int openY = posY; - - int realOpeningY = this.getYWithOffset(openY); - if (realOpeningY - dest.posY < 12) { - // if it is too low, move it to the top floor - openY = this.height - 9; - } else if (dest.posY - realOpeningY < 12) { - // if the opening is too high, move it to the bottom floor - openY = 0; - } - - return openY; - } - - private boolean buildEndTowerTowards(List list, Random rand, ChunkCoordinates dest, int direction, int howFar) { - ChunkCoordinates opening = this.getValidOpeningCC(rand, direction); - - // adjust opening towards dest.posY - opening.posY = this.adjustOpening(opening.posY, dest); - - direction += this.coordBaseMode; - direction %= 4; - - // build towards - ChunkCoordinates tc = this.offsetTowerCCoords(opening.posX, opening.posY, opening.posZ, howFar, direction); - - //System.out.println("Our coord mode is " + this.getCoordBaseMode() + ", and direction is " + direction + ", so our door is going to be at " + opening + " and the new tower will appear at " + tc); - - // what type of tower? - MazeTower13 eTower; - if (this.type == 0) { - eTower = new EntranceTower(rand, this.getComponentType() + 1, tc.posX, tc.posY, tc.posZ, direction); - } else { - eTower = new BellTower21(rand, this.getComponentType() + 1, tc.posX, tc.posY, tc.posZ, direction); - } - - StructureBoundingBox largerBB = new StructureBoundingBox(eTower.getBoundingBox()); - - largerBB.minX -= 6; - largerBB.minZ -= 6; - largerBB.maxX += 6; - largerBB.maxZ += 6; - - StructureComponent intersect = StructureComponent.findIntersecting(list, largerBB); - - if (intersect == null) { - //System.out.println("entrance tower success! tower is at " + tc.posX + ", " + tc.posY + ", " + tc.posZ + " and dest is " + dest.posX + ", " + dest.posY + ", " + dest.posZ); - list.add(eTower); - eTower.buildComponent(this, list, rand); - // add bridge - ChunkCoordinates bc = this.offsetTowerCCoords(opening.posX, opening.posY, opening.posZ, 1, direction); - Bridge bridge = new Bridge(this.getComponentType() + 1, bc.posX, bc.posY, bc.posZ, howFar - 7, direction); - list.add(bridge); - bridge.buildComponent(this, list, rand); - - // opening - addOpening(opening.posX, opening.posY + 1, opening.posZ, direction); - - return true; - } else { - //System.out.println("end tower blocked"); - return false; - } - - } - - private boolean isWithinRange(int centerX, int centerZ, int posX, int posZ, int range) { - boolean inRange = Math.abs(centerX - posX) < range && Math.abs(centerZ - posZ) < range; - - if (!inRange) { -// System.out.println("Tested range, center is at " + centerX + ", " + centerZ + " and tower is " + posX + ", " + posZ + " so distance is " + Math.max(Math.abs(centerX - posX), Math.abs(centerZ - posZ))); - } - - return inRange; - } - - /** - * Gets a random position in the specified direction that connects to a floor currently in the tower. - */ - public ChunkCoordinates getValidOpeningCC(Random rand, int direction) { - int floors = (this.height / 8); - - // for directions 0 or 2, the wall lies along the z axis - if (direction == 0 || direction == 2) { - int rx = direction == 0 ? 12 : 0; - int rz = 6; - int ry = rand.nextInt(floors) * 8; - - return new ChunkCoordinates(rx, ry, rz); - } - - // for directions 1 or 3, the wall lies along the x axis - if (direction == 1 || direction == 3) { - int rx = 6; - int rz = direction == 1 ? 12 : 0; - int ry = rand.nextInt(floors) * 8; - - return new ChunkCoordinates(rx, ry, rz); - } - - - return new ChunkCoordinates(0, 0, 0); - } - - /** - * Provides coordinates to make a tower such that it will open into the parent tower at the provided coordinates. - */ - protected ChunkCoordinates offsetTowerCCoords(int x, int y, int z, int howFar, int direction) { - - int dx = getXWithOffset(x, z); - int dy = getYWithOffset(y); - int dz = getZWithOffset(x, z); - - switch (direction) { - case 0: - dx += howFar; - break; - case 1: - dz += howFar; - break; - case 2: - dx -= howFar; - break; - case 3: - dz -= howFar; - break; - } - - // ugh? - return new ChunkCoordinates(dx, dy, dz); - } - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - Random decoRNG = new Random(world.getSeed() + (this.boundingBox.minX * 321534781) ^ (this.boundingBox.minZ * 756839)); - - // walls - fillWithRandomizedBlocks(world, sbb, 0, 0, 0, this.size - 1, this.height - 1, this.size - 1, false, rand, deco.randomBlocks); - - // stone to ground - for (int x = 0; x < this.size; x++) - { - for (int z = 0; z < this.size; z++) - { - this.func_151554_b(world, deco.blockID, deco.blockMeta, x, -1, z, sbb); - } - - } - - // add branching runes - int numBranches = 2 + decoRNG.nextInt(4) + + decoRNG.nextInt(3); - for (int i = 0; i < numBranches; i++) { - makeGlyphBranches(world, decoRNG, this.getGlyphMeta(), sbb); - } - - // floors - addFloors(world, decoRNG, sbb); - - // openings - makeOpenings(world, sbb); - - - return true; - } - - public int getGlyphMeta() { - return type; - } - - private void addFloors(World world, Random rand, StructureBoundingBox sbb) { - // only add floors up to highest opening - int floors = (this.highestOpening / 8) + 1; - - for (int i = 1; i < floors; i++) { - this.fillWithMetadataBlocks(world, sbb, 1, i * 8, 1, 11, i * 8, 11, deco.blockID, deco.blockMeta, deco.blockID, deco.blockMeta, false); - - // stairs - addStairsDown(world, sbb, (i + 2) % 4, i * 8); - } - - if (hasAccessibleRoof()) { - // add stairs to roof - addStairsDown(world, sbb, (floors + 2) % 4, this.height - 1); - } - - } - - protected boolean hasAccessibleRoof() { - return this.height - this.highestOpening < 9; - } - - private void addStairsDown(World world, StructureBoundingBox sbb, int rotation, int y) { - // top flight - for (int i = 0; i < 4; i++) { - int sx = 8 - i; - int sy = y - i; - int sz = 9; - - this.placeBlockRotated(world, deco.stairID, getStairMeta(0 + rotation), sx, sy, sz, rotation, sbb); - this.placeBlockRotated(world, deco.blockID, deco.blockMeta, sx, sy - 1, sz, rotation, sbb); - this.placeBlockRotated(world, deco.stairID, getStairMeta(0 + rotation), sx, sy, sz - 1, rotation, sbb); - this.placeBlockRotated(world, deco.blockID, deco.blockMeta, sx, sy - 1, sz - 1, rotation, sbb); - this.fillAirRotated(world, sbb, sx, sy + 1, sz - 1, sx, sy + 3, sz, rotation); - } - // landing - this.fillBlocksRotated(world, sbb, 3, y - 4, 8, 4, y - 4, 9, deco.blockID, deco.blockMeta, rotation); - - - // bottom flight - for (int i = 0; i < 4; i++) { - int sx = 4; - int sy = y - i - 4; - int sz = 7 - i; - - this.placeBlockRotated(world, deco.stairID, getStairMeta(1 + rotation), sx, sy, sz, rotation, sbb); - this.placeBlockRotated(world, deco.blockID, deco.blockMeta, sx, sy - 1, sz, rotation, sbb); - this.placeBlockRotated(world, deco.stairID, getStairMeta(1 + rotation), sx - 1, sy, sz, rotation, sbb); - this.placeBlockRotated(world, deco.blockID, deco.blockMeta, sx - 1, sy - 1, sz, rotation, sbb); - this.fillAirRotated(world, sbb, sx, sy + 1, sz, sx - 1, sy + 3, sz, rotation); - } - - } - - /** - * Make an opening in this tower for a door. - */ - @Override - protected void makeDoorOpening(World world, int dx, int dy, int dz, StructureBoundingBox sbb) { - // nullify sky light - //nullifySkyLightAtCurrentPosition(world, dx - 3, dy - 1, dz - 3, dx + 3, dy + 3, dz + 3); - - // clear the door - if (dx == 0 || dx == size - 1) - { - this.fillWithMetadataBlocks(world, sbb, dx, dy - 1, dz - 2, dx, dy + 4, dz + 2, deco.accentID, deco.accentMeta, Blocks.air, 0, false); - //this.fillWithAir(world, sbb, dx, dy, dz - 1, dx, dy + 3, dz + 1); - this.fillWithMetadataBlocks(world, sbb, dx, dy, dz - 1, dx, dy + 3, dz + 1, TFBlocks.castleDoor, this.getGlyphMeta(), Blocks.air, 0, false); - } - if (dz == 0 || dz == size - 1) - { - this.fillWithMetadataBlocks(world, sbb, dx - 2, dy - 1, dz, dx + 2, dy + 4, dz, deco.accentID, deco.accentMeta, Blocks.air, 0, false); - //this.fillWithAir(world, sbb, dx - 1, dy, dz, dx + 1, dy + 3, dz); - this.fillWithMetadataBlocks(world, sbb, dx - 1, dy, dz, dx + 1, dy + 3, dz, TFBlocks.castleDoor, this.getGlyphMeta(), Blocks.air, 0, false); - } - } - } - - - public static class EntranceTower extends MazeTower13 { - - public EntranceTower() { } - - public EntranceTower(Random rand, int i, int x, int y, int z, int direction) { - super(rand, i, x, y, z, 3, 2, 0, direction); - } - - @SuppressWarnings({ "unchecked", "rawtypes" }) - @Override - public void buildComponent(StructureComponent parent, List list, Random rand) { - if (parent != null && parent instanceof StructureTFComponent) { - this.deco = ((StructureTFComponent)parent).deco; - } - - // add foundation - Foundation13 foundation = new Foundation13(rand, 4, this); - list.add(foundation); - foundation.buildComponent(this, list, rand); - - // add roof - StructureTFComponent roof = new Roof13Peaked(rand, 4, this); - list.add(roof); - roof.buildComponent(this, list, rand); - - // how many floors until the bottom? - int missingFloors = (this.boundingBox.minY - 127) / 8; - - // place half on the bottom - int bottomFloors = missingFloors / 2; - // how many are left for the middle? - int middleFloors = missingFloors - bottomFloors; - - // what direction can we put the side tower in, if any? - int direction = 1; - int howFar = 20; - if (!this.buildSideTower(list, rand, middleFloors + 1, direction, howFar)) { - direction = 3; - if (!this.buildSideTower(list, rand, middleFloors + 1, direction, howFar)) { - direction = 0; - if (!this.buildSideTower(list, rand, middleFloors + 1, direction, howFar)) { - // side tower no worky - } - } - } - - // add bottom tower - int brDirection = (direction + this.coordBaseMode) % 4; - EntranceBottomTower eTower = new EntranceBottomTower(rand, this.getComponentType() + 1, this.boundingBox.minX + 6, this.boundingBox.minY - (middleFloors) * 8, this.boundingBox.minZ + 6, bottomFloors + 1, bottomFloors, (brDirection + 2) % 4); - list.add(eTower); - eTower.buildComponent(this, list, rand); - - // add bridge to bottom - ChunkCoordinates opening = this.getValidOpeningCC(rand, direction); - opening.posY -= middleFloors * 8; - - ChunkCoordinates bc = this.offsetTowerCCoords(opening.posX, opening.posY, opening.posZ, 1, brDirection); - Bridge bridge = new Bridge(this.getComponentType() + 1, bc.posX, bc.posY, bc.posZ, howFar - 7, brDirection); - list.add(bridge); - bridge.buildComponent(this, list, rand); - } - - private boolean buildSideTower(List list, Random rand, int middleFloors, int direction, int howFar) { - ChunkCoordinates opening = this.getValidOpeningCC(rand, direction); - - direction += this.coordBaseMode; - direction %= 4; - - // build towards - ChunkCoordinates tc = this.offsetTowerCCoords(opening.posX, opening.posY, opening.posZ, howFar, direction); - - //System.out.println("Our coord mode is " + this.getCoordBaseMode() + ", and direction is " + direction + ", so our door is going to be at " + opening + " and the new tower will appear at " + tc); - - EntranceSideTower eTower = new EntranceSideTower(rand, this.getComponentType() + 1, tc.posX, tc.posY, tc.posZ, middleFloors, middleFloors - 1, direction); - - StructureBoundingBox largerBB = new StructureBoundingBox(eTower.getBoundingBox()); - - largerBB.minX -= 6; - largerBB.minZ -= 6; - largerBB.maxX += 6; - largerBB.maxZ += 6; - - StructureComponent intersect = StructureComponent.findIntersecting(list, largerBB); - - if (intersect == null) { - list.add(eTower); - eTower.buildComponent(this, list, rand); - // add bridge - ChunkCoordinates bc = this.offsetTowerCCoords(opening.posX, opening.posY, opening.posZ, 1, direction); - Bridge bridge = new Bridge(this.getComponentType() + 1, bc.posX, bc.posY, bc.posZ, howFar - 7, direction); - list.add(bridge); - bridge.buildComponent(this, list, rand); - - // opening - addOpening(opening.posX, opening.posY + 1, opening.posZ, direction); - - return true; - } else { - System.out.println("side entrance tower blocked"); - return false; - } - - } - - /** - * Gets a random position in the specified direction that connects to a floor currently in the tower. - */ - public ChunkCoordinates getValidOpeningCC(Random rand, int direction) { - // for directions 0 or 2, the wall lies along the z axis - if (direction == 0 || direction == 2) { - int rx = direction == 0 ? 12 : 0; - int rz = 6; - int ry = 0; - - return new ChunkCoordinates(rx, ry, rz); - } - - // for directions 1 or 3, the wall lies along the x axis - if (direction == 1 || direction == 3) { - int rx = 6; - int rz = direction == 1 ? 12 : 0; - int ry = 0; - - return new ChunkCoordinates(rx, ry, rz); - } - - - return new ChunkCoordinates(0, 0, 0); - } - - - } - - public static class EntranceSideTower extends MazeTower13 { - public EntranceSideTower() {} - - public EntranceSideTower(Random rand, int i, int x, int y, int z, int floors, int entranceFloor, int direction) { - super(rand, i, x, y, z, floors, entranceFloor, 0, direction); - - addOpening(0, 1, size / 2, 2); - } - - @SuppressWarnings({ "unchecked", "rawtypes" }) - @Override - public void buildComponent(StructureComponent parent, List list, Random rand) { - if (parent != null && parent instanceof StructureTFComponent) { - this.deco = ((StructureTFComponent)parent).deco; - } - - // add foundation - Foundation13 foundation = new Foundation13(rand, 4, this); - list.add(foundation); - foundation.buildComponent(this, list, rand); - - // add roof - StructureTFComponent roof = new Roof13Peaked(rand, 4, this); - list.add(roof); - roof.buildComponent(this, list, rand); - } - - } - - public static class EntranceBottomTower extends MazeTower13 { - public EntranceBottomTower() {} - - public EntranceBottomTower(Random rand, int i, int x, int y, int z, int floors, int entranceFloor, int direction) { - super(rand, i, x, y, z, floors, entranceFloor, 0, direction); - -// addOpening(12, 1, size / 2, 0); -// addOpening(size / 2, 1, 0, 1); -// addOpening(0, 1, size / 2, 2); -// addOpening(size / 2, 1, 12, 3); - } - - @SuppressWarnings({ "unchecked", "rawtypes" }) - @Override - public void buildComponent(StructureComponent parent, List list, Random rand) { - if (parent != null && parent instanceof StructureTFComponent) { - this.deco = ((StructureTFComponent)parent).deco; - } - - // stairs - addStairs(list, rand, this.getComponentType() + 1, this.size - 1, 1, size / 2, 0); - addStairs(list, rand, this.getComponentType() + 1, 0, 1, size / 2, 2); - addStairs(list, rand, this.getComponentType() + 1, this.size / 2, 1, 0, 3); - addStairs(list, rand, this.getComponentType() + 1, this.size / 2, 1, this.size - 1, 1); - - } - - - /** - * Add some stairs leading to this tower - */ - private boolean addStairs(List list, Random rand, int index, int x, int y, int z, int rotation) { - // add door - this.addOpening(x, y, z, rotation); - - int direction = (getCoordBaseMode() + rotation) % 4; - ChunkCoordinates dx = offsetTowerCCoords(x, y, z, 0, direction); - - EntranceStairs stairs = new EntranceStairs(index, dx.posX, dx.posY, dx.posZ, direction); - - list.add(stairs); - stairs.buildComponent(list.get(0), list, rand); - return true; - } - - protected boolean hasAccessibleRoof() { - return false; - } - - } - - /** - * Stair blocks heading to the entrance tower doors - */ - public static class EntranceStairs extends StructureTFComponent { - - public EntranceStairs() {} - - public EntranceStairs(int index, int x, int y, int z, int direction) { - this.setCoordBaseMode(direction); - this.boundingBox = StructureTFComponent.getComponentToAddBoundingBox2(x, y, z, 0, -1, -5, 12, 0, 12, direction); - } - - @SuppressWarnings({ "rawtypes" }) - @Override - public void buildComponent(StructureComponent parent, List list, Random rand) { - if (parent != null && parent instanceof StructureTFComponent) { - this.deco = ((StructureTFComponent)parent).deco; - } - } - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - - int size = 13; - - for (int x = 1; x < size; x++) { - - this.placeStairs(world, sbb, x, 1 - x, 5, 2); - - for (int z = 0; z <= x; z++) { - - if (z > 0 && z <= size / 2) { - this.placeStairs(world, sbb, x, 1 - x, 5 - z, 2); - this.placeStairs(world, sbb, x, 1 - x, 5 + z, 2); - } - - if (x <= size / 2) { - this.placeStairs(world, sbb, z, 1 - x, 5 - x, 1); - this.placeStairs(world, sbb, z, 1 - x, 5 + x, 3); - } - } - } - - this.func_151554_b(world, deco.blockID, deco.blockMeta, 0, 0, 5, sbb); - - - return true; - } - - private void placeStairs(World world, StructureBoundingBox sbb, int x, int y, int z, int stairMeta) { - if (this.getBlockAtCurrentPosition(world, x, y, z, sbb).isReplaceable(world, x, y, z)) { - //this.placeBlockAtCurrentPosition(world, deco.blockID, deco.blockMeta, x, y, z, sbb); - this.placeBlockAtCurrentPosition(world, deco.stairID, this.getStairMeta(stairMeta), x, y, z, sbb); - this.func_151554_b(world, deco.blockID, deco.blockMeta, x, y - 1, z, sbb); - } - } - - - } - - public static class BellTower21 extends MazeTower13 { - - private static final int FLOORS = 8; - - public BellTower21() { } - - public BellTower21(Random rand, int i, int x, int y, int z, int direction) { - super(rand, i, x, y, z, FLOORS, 1, 1, direction); - this.size = 21; - int floors = FLOORS; - this.height = floors * 8 + 1; - this.boundingBox = StructureTFComponent.getComponentToAddBoundingBox2(x, y, z, -6, -8, -this.size / 2, this.size - 1, this.height, this.size - 1, direction); - this.openings.clear(); - addOpening(0, 9, size / 2, 2); - } - - @SuppressWarnings({ "unchecked", "rawtypes" }) - @Override - public void buildComponent(StructureComponent parent, List list, Random rand) { - if (parent != null && parent instanceof StructureTFComponent) { - this.deco = ((StructureTFComponent)parent).deco; - } - - // add foundation - BellFoundation21 foundation = new BellFoundation21(rand, 4, this); - list.add(foundation); - foundation.buildComponent(this, list, rand); - - // add roof - StructureTFComponent roof = new Roof13Crenellated(rand, 4, this); - list.add(roof); - roof.buildComponent(this, list, rand); - } - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - super.addComponentParts(world, rand, sbb); - - // openings! - Block fieldBlock = TFBlocks.forceField; - int fieldMeta = 4; - for (int rotation = 0; rotation < 4; rotation++) { - int y = 48; - for (int x = 5; x < this.size - 4; x += 2) { -// for (int wy = 0; wy < 15; wy++) { -// fieldMeta = rand.nextInt(4) + 1; -// this.placeBlockRotated(world, fieldBlock, fieldMeta, x, y + wy, 0, rotation, sbb); -// } -// fieldMeta = rand.nextInt(5); - this.fillBlocksRotated(world, sbb, x, y, 0, x, y + 14, 0, fieldBlock, fieldMeta, rotation); - } - y = 24; - for (int x = 1; x < this.size - 1; x += 8) { -// for (int wy = 0; wy < 15; wy++) { -// fieldMeta = rand.nextInt(4) + 1; -// this.placeBlockRotated(world, fieldBlock, fieldMeta, x, y + wy, 0, rotation, sbb); -// fieldMeta = rand.nextInt(4) + 1; -// this.placeBlockRotated(world, fieldBlock, fieldMeta, x + 2, y + wy, 0, rotation, sbb); -// } -// fieldMeta = rand.nextInt(5); - this.fillBlocksRotated(world, sbb, x, y, 0, x, y + 14, 0, fieldBlock, fieldMeta, rotation); -// fieldMeta = rand.nextInt(5); - this.fillBlocksRotated(world, sbb, x + 2, y, 0, x + 2, y + 14, 0, fieldBlock, fieldMeta, rotation); - } - } - - // sign - this.placeSignAtCurrentPosition(world, 7, 9, 8, "Parkour area 2", "mini-boss 1", sbb); - - return true; - } - } - - public static class DamagedTower extends MazeTower13 { - - public DamagedTower() { } - - public DamagedTower(Random rand, int i, int x, int y, int z, int direction) { - super(rand, i, x, y, z, 2, direction); //TODO: change rune type - } - - @SuppressWarnings({ "unchecked", "rawtypes" }) - @Override - public void buildComponent(StructureComponent parent, List list, Random rand) { - if (parent != null && parent instanceof StructureTFComponent) { - this.deco = ((StructureTFComponent)parent).deco; - } - - // add foundation - Foundation13 foundation = new Foundation13(rand, 0, this); - list.add(foundation); - foundation.buildComponent(this, list, rand); - - // add thorns - Foundation13 thorns = new Foundation13Thorns(rand, 0, this); - list.add(thorns); - thorns.buildComponent(this, list, rand); - -// // add roof -// StructureTFComponent roof = rand.nextBoolean() ? new Roof13Conical(rand, 4, this) : new Roof13Crenellated(rand, 4, this); -// list.add(roof); -// roof.buildComponent(this, list, rand); - - - // keep on building? - this.buildNonCriticalTowers(parent, list, rand); - } - - - protected MazeTower13 makeNewDamagedTower(Random rand, int direction, ChunkCoordinates tc) { - return new WreckedTower(rand, this.getComponentType() + 1, tc.posX, tc.posY, tc.posZ, direction); - } - - - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - super.addComponentParts(world, rand, sbb); - Random decoRNG = new Random(world.getSeed() + (this.boundingBox.minX * 321534781) ^ (this.boundingBox.minZ * 756839)); - - this.destroyTower(world, decoRNG, sbb); - - return true; - } - - public void destroyTower(World world, Random rand, StructureBoundingBox sbb) { - - // make list of destroyed areas - ArrayList areas = makeInitialDestroyList(rand); - - boolean hitDeadRock = false; - - // go down from the top of the tower to the ground, taking out rectangular chunks - //for (int y = this.boundingBox.maxY; y > this.boundingBox.minY; y--) { - for (int y = this.boundingBox.maxY; !hitDeadRock && y > 64; y--) { - for (int x = this.boundingBox.minX - 2; x <= this.boundingBox.maxX + 2; x++) { - for (int z = this.boundingBox.minZ - 2; z <= this.boundingBox.maxZ + 2; z++) { - if (sbb.isVecInside(x, y, z)) { - if (world.getBlock(x, y, z) == TFBlocks.deadrock) { - hitDeadRock = true; - } - determineBlockDestroyed(world, areas, y, x, z); - } - } - } - - // check to see if any of our DestroyAreas are entirely above the current y value - DestroyArea removeArea = null; - - for (DestroyArea dArea : areas) { - if (dArea == null || dArea.isEntirelyAbove(y)) { - removeArea = dArea; - } - } - // if so, replace them with new ones - if (removeArea != null) { - areas.remove(removeArea); - areas.add(DestroyArea.createNonIntersecting(this.getBoundingBox(), rand, y, areas)); - - } - } - } - - protected ArrayList makeInitialDestroyList(Random rand) { - ArrayList areas = new ArrayList(2); - - areas.add(DestroyArea.createNonIntersecting(this.getBoundingBox(), rand, this.getBoundingBox().maxY - 1, areas)); - areas.add(DestroyArea.createNonIntersecting(this.getBoundingBox(), rand, this.getBoundingBox().maxY - 1, areas)); - areas.add(DestroyArea.createNonIntersecting(this.getBoundingBox(), rand, this.getBoundingBox().maxY - 1, areas)); - return areas; - } - - protected void determineBlockDestroyed(World world, ArrayList areas, int y, int x, int z) { - for (DestroyArea dArea : areas) { - if (dArea != null && dArea.isVecInside(x, y, z)) { - world.setBlockToAir(x, y, z); - } - } - } - - } - - /** - * An area that we're going to destroy. Default is just a StructureBoundingBox - */ - public static class DestroyArea { - - StructureBoundingBox destroyBox; - - public DestroyArea(StructureBoundingBox tower, Random rand, int y) { - // make a 4x4 area that's entirely within the tower bounding box - - int bx = tower.minX - 2 + rand.nextInt(tower.getXSize()); - int bz = tower.minZ - 2 + rand.nextInt(tower.getZSize()); - - this.destroyBox = new StructureBoundingBox(bx, y - 10, bz, bx + 4, y, bz + 4); - } - - public boolean isEntirelyAbove(int y) { - return this.destroyBox.minY > y; - } - - public boolean isVecInside(int x, int y, int z) { - return destroyBox.isVecInside(x, y, z); - } - - /** - * construct a new area that does not intersect any other areas in the list - */ - public static DestroyArea createNonIntersecting(StructureBoundingBox tower, Random rand, int y, ArrayList otherAreas) { - int attempts = 100; - - DestroyArea area = null; - for (int i = 0; i < attempts && area == null; i++) { - DestroyArea testArea = new DestroyArea(tower, rand, y); - - if (otherAreas.size() == 0) { - area = testArea; - } else { - for (DestroyArea otherArea : otherAreas) { - if (otherArea == null || !testArea.intersectsWith(otherArea)) { - area = testArea; - } - } - } - } - return area; - } - - /** - * We check if the box would intersect even if it was one block larger in the x and z directions - */ - private boolean intersectsWith(DestroyArea otherArea) { - return this.destroyBox.intersectsWith(otherArea.destroyBox.minX - 1, otherArea.destroyBox.minZ - 1, otherArea.destroyBox.maxX + 1, otherArea.destroyBox.maxX + 1); - } - } - - public static class WreckedTower extends DamagedTower { - - public WreckedTower() { } - - public WreckedTower(Random rand, int i, int x, int y, int z, int direction) { - super(rand, i, x, y, z, direction); - } - - @SuppressWarnings({ "unchecked", "rawtypes" }) - @Override - public void buildComponent(StructureComponent parent, List list, Random rand) { - if (parent != null && parent instanceof StructureTFComponent) { - this.deco = ((StructureTFComponent)parent).deco; - } - -// // add foundation -// Foundation13 foundation = new Foundation13(rand, 4, this); -// list.add(foundation); -// foundation.buildComponent(this, list, rand); - - - // add thorns - Foundation13 thorns = new Foundation13Thorns(rand, 0, this); - list.add(thorns); - thorns.buildComponent(this, list, rand); - - -// // add roof -// StructureTFComponent roof = rand.nextBoolean() ? new Roof13Conical(rand, 4, this) : new Roof13Crenellated(rand, 4, this); -// list.add(roof); -// roof.buildComponent(this, list, rand); - - - // keep on building? -// this.buildNonCriticalTowers(parent, list, rand); - } - - public int getGlyphMeta() { - return 1; - } - - - protected void determineBlockDestroyed(World world, ArrayList areas, int y, int x, int z) { - boolean isInside = false; - for (DestroyArea dArea : areas) { - if (dArea != null && dArea.isVecInside(x, y, z)) { - isInside = true; - } - } - - if (!isInside) { - world.setBlockToAir(x, y, z); - } - - } - - - protected ArrayList makeInitialDestroyList(Random rand) { - ArrayList areas = new ArrayList(2); - - areas.add(DestroyArea.createNonIntersecting(this.getBoundingBox(), rand, this.getBoundingBox().maxY - 1, areas)); - areas.add(DestroyArea.createNonIntersecting(this.getBoundingBox(), rand, this.getBoundingBox().maxY - 1, areas)); - areas.add(DestroyArea.createNonIntersecting(this.getBoundingBox(), rand, this.getBoundingBox().maxY - 1, areas)); - areas.add(DestroyArea.createNonIntersecting(this.getBoundingBox(), rand, this.getBoundingBox().maxY - 1, areas)); - return areas; - } - - - } - - - public static class Bridge extends StructureTFComponent { - public Bridge() {} - - public Bridge(int i, int x, int y, int z, int length, int direction) { - this.setCoordBaseMode(direction); - this.boundingBox = StructureTFComponent.getComponentToAddBoundingBox2(x, y, z, 0, -1, -3, length - 1, 5, 6, direction); - - } - - @SuppressWarnings({ "unchecked", "rawtypes" }) - @Override - public void buildComponent(StructureComponent parent, List list, Random rand) { - if (parent != null && parent instanceof StructureTFComponent) { - this.deco = ((StructureTFComponent)parent).deco; - } - } - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - int length = (this.coordBaseMode == 0 || this.coordBaseMode == 2) ? this.boundingBox.maxX - this.boundingBox.minX : this.boundingBox.maxZ - this.boundingBox.minZ; - - // span - fillWithRandomizedBlocks(world, sbb, 0, 0, 0, length, 1, 6, false, rand, deco.randomBlocks); - // rails - fillWithRandomizedBlocks(world, sbb, 0, 1, 0, length, 2, 0, false, rand, deco.randomBlocks); - fillWithRandomizedBlocks(world, sbb, 0, 1, 6, length, 2, 6, false, rand, deco.randomBlocks); - - // supports - int l3 = length / 3; - for (int i = 0; i < l3; i++) { - int sl = l3 - (int) (MathHelper.cos((float)(l3 - i) / (float)l3 * 1.6F) * (float)l3); // this could be better, maybe? - fillWithRandomizedBlocks(world, sbb, i, -sl, 0, i, 0, 0, false, rand, deco.randomBlocks); - fillWithRandomizedBlocks(world, sbb, i, -sl, 6, i, 0, 6, false, rand, deco.randomBlocks); - fillWithRandomizedBlocks(world, sbb, length - i, -sl, 0, length - i, 0, 0, false, rand, deco.randomBlocks); - fillWithRandomizedBlocks(world, sbb, length - i, -sl, 6, length - i, 0, 6, false, rand, deco.randomBlocks); - } - - // doorframes - this.fillWithMetadataBlocks(world, sbb, 0, 2, 1, 0, 7, 1, deco.pillarID, deco.pillarMeta, deco.pillarID, deco.pillarMeta, false); - this.fillWithMetadataBlocks(world, sbb, 0, 2, 5, 0, 7, 5, deco.pillarID, deco.pillarMeta, deco.pillarID, deco.pillarMeta, false); - this.fillWithMetadataBlocks(world, sbb, 0, 6, 2, 0, 6, 4, deco.accentID, deco.accentMeta, deco.accentID, deco.accentMeta, false); - this.placeBlockAtCurrentPosition(world, deco.pillarID, deco.pillarMeta, 0, 7, 3, sbb); - - this.fillWithMetadataBlocks(world, sbb, length, 2, 1, length, 7, 1, deco.pillarID, deco.pillarMeta, deco.pillarID, deco.pillarMeta, false); - this.fillWithMetadataBlocks(world, sbb, length, 2, 5, length, 7, 5, deco.pillarID, deco.pillarMeta, deco.pillarID, deco.pillarMeta, false); - this.fillWithMetadataBlocks(world, sbb, length, 6, 2, length, 6, 4, deco.accentID, deco.accentMeta, deco.accentID, deco.accentMeta, false); - this.placeBlockAtCurrentPosition(world, deco.pillarID, deco.pillarMeta, length, 7, 3, sbb); - - return true; - } - - } - - public static class Roof9Crenellated extends StructureTFComponent { - - public Roof9Crenellated() {} - - public Roof9Crenellated(Random rand, int i, StructureTFComponent sideTower) { - super(i); - - int height = 5; - - this.setCoordBaseMode(sideTower.getCoordBaseMode()); - this.boundingBox = new StructureBoundingBox(sideTower.getBoundingBox().minX - 2, sideTower.getBoundingBox().maxY - 1, sideTower.getBoundingBox().minZ - 2, sideTower.getBoundingBox().maxX + 2, sideTower.getBoundingBox().maxY + height - 1, sideTower.getBoundingBox().maxZ + 2); - - } - - @SuppressWarnings({ "unchecked", "rawtypes" }) - @Override - public void buildComponent(StructureComponent parent, List list, Random rand) { - if (parent != null && parent instanceof StructureTFComponent) { - this.deco = ((StructureTFComponent)parent).deco; - } - } - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - for (int rotation = 0; rotation < 4; rotation++) { - this.fillBlocksRotated(world, sbb, 0, -1, 0, 2, 3, 2, deco.blockID, deco.blockMeta, rotation); - this.placeBlockRotated(world, deco.blockID, deco.blockMeta, 1, -2, 2, rotation, sbb); - this.placeBlockRotated(world, deco.blockID, deco.blockMeta, 1, -2, 1, rotation, sbb); - this.placeBlockRotated(world, deco.blockID, deco.blockMeta, 2, -2, 1, rotation, sbb); - - this.placeBlockRotated(world, deco.blockID, deco.blockMeta, 3, 0, 1, rotation, sbb); - this.placeBlockRotated(world, deco.blockID, deco.blockMeta, 3, 1, 1, rotation, sbb); - - this.fillBlocksRotated(world, sbb, 4, 0, 0, 5, 3, 2, deco.blockID, deco.blockMeta, rotation); - - this.placeBlockRotated(world, deco.blockID, deco.blockMeta, 6, 0, 1, rotation, sbb); - this.placeBlockRotated(world, deco.blockID, deco.blockMeta, 6, 1, 1, rotation, sbb); - - this.fillBlocksRotated(world, sbb, 7, 0, 0, 8, 3, 2, deco.blockID, deco.blockMeta, rotation); - - this.placeBlockRotated(world, deco.blockID, deco.blockMeta, 9, 0, 1, rotation, sbb); - this.placeBlockRotated(world, deco.blockID, deco.blockMeta, 9, 1, 1, rotation, sbb); - } - - - return true; - } - - - } - - /** - * Pointy cone roof with variable height - */ - public static class Roof13Conical extends StructureTFComponent { - - public int slope; - - public Roof13Conical() {} - - public Roof13Conical(Random rand, int i, StructureTFComponent sideTower) { - super(i); - - this.slope = 2 + rand.nextInt(3) + rand.nextInt(3); - - int height = slope * 4; - - this.setCoordBaseMode(sideTower.getCoordBaseMode()); - this.boundingBox = new StructureBoundingBox(sideTower.getBoundingBox().minX - 2, sideTower.getBoundingBox().maxY - 1, sideTower.getBoundingBox().minZ - 2, sideTower.getBoundingBox().maxX + 2, sideTower.getBoundingBox().maxY + height - 1, sideTower.getBoundingBox().maxZ + 2); - - } - - /** - * Save to NBT - */ - @Override - protected void func_143012_a(NBTTagCompound par1NBTTagCompound) { - super.func_143012_a(par1NBTTagCompound); - - par1NBTTagCompound.setInteger("slope", this.slope); - } - - /** - * Load from NBT - */ - @Override - protected void func_143011_b(NBTTagCompound par1NBTTagCompound) { - super.func_143011_b(par1NBTTagCompound); - this.slope = par1NBTTagCompound.getInteger("slope"); - } - - - @SuppressWarnings({ "unchecked", "rawtypes" }) - @Override - public void buildComponent(StructureComponent parent, List list, Random rand) { - if (parent != null && parent instanceof StructureTFComponent) { - this.deco = ((StructureTFComponent)parent).deco; - } - } - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - for (int rotation = 0; rotation < 4; rotation++) { - this.fillBlocksRotated(world, sbb, 0, -1, 0, 3, 2, 3, deco.blockID, deco.blockMeta, rotation); - this.placeBlockRotated(world, deco.blockID, deco.blockMeta, 1, -2, 2, rotation, sbb); - this.placeBlockRotated(world, deco.blockID, deco.blockMeta, 1, -2, 1, rotation, sbb); - this.placeBlockRotated(world, deco.blockID, deco.blockMeta, 2, -2, 1, rotation, sbb); - - this.fillBlocksRotated(world, sbb, 4, 0, 1, 12, 1, 1, deco.blockID, deco.blockMeta, rotation); - - // more teeny crenellations - for (int i = 3; i < 13; i += 2) { - this.fillBlocksRotated(world, sbb, i, -1, 1, i, 2, 1, deco.blockID, deco.blockMeta, rotation); - } - - // cone roof - for (int i = 2; i < 9; i++) { - int base = 2 - slope; - if (i < 7) { - this.fillBlocksRotated(world, sbb, i - 1, ((i - 1) * slope) + base, i - 1, i, (i * slope) + base - 1, i, deco.blockID, deco.blockMeta, rotation); - } else { - this.fillBlocksRotated(world, sbb, 16 - i, ((i - 1) * slope) + base, i, 16 - i, (i * slope) + base - 1, i, deco.roofID, deco.roofMeta, rotation); - } - this.fillBlocksRotated(world, sbb, i + 1, ((i - 1) * slope) + base, i, 15 - i, (i * slope) + base - 1, i, deco.roofID, deco.roofMeta, rotation); - } - - // point! - this.fillBlocksRotated(world, sbb, 8, (slope * 6) + 2, 8, 8, (slope * 7) + 2, 8, deco.roofID, deco.roofMeta, rotation); - - } - - - return true; - } - } - - public static class Roof13Crenellated extends StructureTFComponent { - - public Roof13Crenellated() {} - - public Roof13Crenellated(Random rand, int i, StructureTFComponent sideTower) { - super(i); - - int height = 5; - - this.setCoordBaseMode(sideTower.getCoordBaseMode()); - this.boundingBox = new StructureBoundingBox(sideTower.getBoundingBox().minX - 2, sideTower.getBoundingBox().maxY - 1, sideTower.getBoundingBox().minZ - 2, sideTower.getBoundingBox().maxX + 2, sideTower.getBoundingBox().maxY + height - 1, sideTower.getBoundingBox().maxZ + 2); - - } - - @SuppressWarnings({ "unchecked", "rawtypes" }) - @Override - public void buildComponent(StructureComponent parent, List list, Random rand) { - if (parent != null && parent instanceof StructureTFComponent) { - this.deco = ((StructureTFComponent)parent).deco; - } - } - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - // assume square - int size = this.boundingBox.maxX - this.boundingBox.minX; - - for (int rotation = 0; rotation < 4; rotation++) { - // corner - this.fillBlocksRotated(world, sbb, 0, -1, 0, 3, 3, 3, deco.blockID, deco.blockMeta, rotation); - this.placeBlockRotated(world, deco.blockID, deco.blockMeta, 1, -2, 2, rotation, sbb); - this.placeBlockRotated(world, deco.blockID, deco.blockMeta, 1, -2, 1, rotation, sbb); - this.placeBlockRotated(world, deco.blockID, deco.blockMeta, 2, -2, 1, rotation, sbb); - - // walls - this.fillBlocksRotated(world, sbb, 4, 0, 1, size - 4, 1, 1, deco.blockID, deco.blockMeta, rotation); - - // smaller crenellations - for (int x = 5; x < size - 5; x += 4) { - this.fillBlocksRotated(world, sbb, x, 0, 0, x + 2, 3, 2, deco.blockID, deco.blockMeta, rotation); - this.placeBlockRotated(world, deco.blockID, deco.blockMeta, x + 1, -1, 1, rotation, sbb); - this.placeBlockRotated(world, deco.blockID, deco.blockMeta, x + 1, -2, 1, rotation, sbb); - } - } - - return true; - } - } - - public static class Roof13Peaked extends StructureTFComponent { - - public Roof13Peaked() {} - - public Roof13Peaked(Random rand, int i, StructureTFComponent sideTower) { - super(i); - - int height = 18; - - this.setCoordBaseMode(sideTower.getCoordBaseMode()); - this.boundingBox = new StructureBoundingBox(sideTower.getBoundingBox().minX - 2, sideTower.getBoundingBox().maxY - 1, sideTower.getBoundingBox().minZ - 2, sideTower.getBoundingBox().maxX + 2, sideTower.getBoundingBox().maxY + height - 1, sideTower.getBoundingBox().maxZ + 2); - - } - - - @SuppressWarnings({ "unchecked", "rawtypes" }) - @Override - public void buildComponent(StructureComponent parent, List list, Random rand) { - if (parent != null && parent instanceof StructureTFComponent) { - this.deco = ((StructureTFComponent)parent).deco; - } - } - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - - // peaky roof, loop unrolled as it was getting dumb - for (int i = 0; i < 3; i++) { - this.fillWithMetadataBlocks(world, sbb, 1, i, i, 15, i, i, deco.roofID, deco.roofMeta, deco.roofID, deco.roofMeta, false); - this.fillWithMetadataBlocks(world, sbb, 1, i, 16 - i, 15, i, 16 - i, deco.roofID, deco.roofMeta, deco.roofID, deco.roofMeta, false); - } - - for (int i = 0; i < 3; i++) { - int dz = 3 + i; - this.fillWithMetadataBlocks(world, sbb, 2, 5 + ((i - 1) * 2), dz, 14, 4 + (i * 2), dz, deco.roofID, deco.roofMeta, deco.roofID, deco.roofMeta, false); - this.fillWithMetadataBlocks(world, sbb, 1, 1, dz, 1, 5 + ((i - 1) * 2), dz, deco.roofID, deco.roofMeta, deco.roofID, deco.roofMeta, false); - this.fillWithMetadataBlocks(world, sbb, 1, 5 + ((i - 1) * 2), dz - 1, 1, 4 + (i * 2), dz, deco.blockID, deco.blockMeta, deco.blockID, deco.blockMeta, false); - this.fillWithMetadataBlocks(world, sbb, 15, 1, dz, 15, 5 + ((i - 1) * 2), dz, deco.roofID, deco.roofMeta, deco.roofID, deco.roofMeta, false); - this.fillWithMetadataBlocks(world, sbb, 15, 5 + ((i - 1) * 2), dz - 1, 15, 4 + (i * 2), dz, deco.blockID, deco.blockMeta, deco.blockID, deco.blockMeta, false); - - dz = 13 - i; - this.fillWithMetadataBlocks(world, sbb, 2, 5 + ((i - 1) * 2), dz, 14, 4 + (i * 2), dz, deco.roofID, deco.roofMeta, deco.roofID, deco.roofMeta, false); - this.fillWithMetadataBlocks(world, sbb, 1, 1, dz, 1, 5 + ((i - 1) * 2), dz, deco.roofID, deco.roofMeta, deco.roofID, deco.roofMeta, false); - this.fillWithMetadataBlocks(world, sbb, 1, 5 + ((i - 1) * 2), dz, 1, 4 + (i * 2), dz + 1, deco.blockID, deco.blockMeta, deco.blockID, deco.blockMeta, false); - this.fillWithMetadataBlocks(world, sbb, 15, 1, dz, 15, 5 + ((i - 1) * 2), dz, deco.roofID, deco.roofMeta, deco.roofID, deco.roofMeta, false); - this.fillWithMetadataBlocks(world, sbb, 15, 5 + ((i - 1) * 2), dz, 15, 4 + (i * 2), dz + 1, deco.blockID, deco.blockMeta, deco.blockID, deco.blockMeta, false); - } - - for (int i = 0; i < 3; i++) { - int dz = 6 + i; - this.fillWithMetadataBlocks(world, sbb, 2, 12 + ((i - 1) * 3), dz, 14, 11 + (i * 3), dz, deco.roofID, deco.roofMeta, deco.roofID, deco.roofMeta, false); - this.fillWithMetadataBlocks(world, sbb, 1, 1, dz, 1, 12 + ((i - 1) * 3), dz, deco.roofID, deco.roofMeta, deco.roofID, deco.roofMeta, false); - this.fillWithMetadataBlocks(world, sbb, 1, 12 + ((i - 1) * 3), dz - 1, 1, 11 + (i * 3), dz, deco.blockID, deco.blockMeta, deco.blockID, deco.blockMeta, false); - this.fillWithMetadataBlocks(world, sbb, 15, 1, dz, 15, 12 + ((i - 1) * 3), dz, deco.roofID, deco.roofMeta, deco.roofID, deco.roofMeta, false); - this.fillWithMetadataBlocks(world, sbb, 15, 12 + ((i - 1) * 3), dz - 1, 15, 11 + (i * 3), dz, deco.blockID, deco.blockMeta, deco.blockID, deco.blockMeta, false); - - dz = 10 - i; - this.fillWithMetadataBlocks(world, sbb, 2, 12 + ((i - 1) * 3), dz, 14, 11 + (i * 3), dz, deco.roofID, deco.roofMeta, deco.roofID, deco.roofMeta, false); - this.fillWithMetadataBlocks(world, sbb, 1, 1, dz, 1, 12 + ((i - 1) * 3), dz, deco.roofID, deco.roofMeta, deco.roofID, deco.roofMeta, false); - this.fillWithMetadataBlocks(world, sbb, 1, 12 + ((i - 1) * 3), dz, 1, 11 + (i * 3), dz + 1, deco.blockID, deco.blockMeta, deco.blockID, deco.blockMeta, false); - this.fillWithMetadataBlocks(world, sbb, 15, 1, dz, 15, 12 + ((i - 1) * 3), dz, deco.roofID, deco.roofMeta, deco.roofID, deco.roofMeta, false); - this.fillWithMetadataBlocks(world, sbb, 15, 12 + ((i - 1) * 3), dz, 15, 11 + (i * 3), dz + 1, deco.blockID, deco.blockMeta, deco.blockID, deco.blockMeta, false); - } - - // top roof bobbles - this.fillWithMetadataBlocks(world, sbb, 1, 18, 8, 5, 18, 8, deco.roofID, deco.roofMeta, deco.roofID, deco.roofMeta, false); - this.fillWithMetadataBlocks(world, sbb, 11, 18, 8, 14, 18, 8, deco.roofID, deco.roofMeta, deco.roofID, deco.roofMeta, false); - this.fillWithMetadataBlocks(world, sbb, 0, 17, 8, 1, 19, 8, deco.roofID, deco.roofMeta, deco.roofID, deco.roofMeta, false); - this.fillWithMetadataBlocks(world, sbb, 15, 17, 8, 16, 19, 8, deco.roofID, deco.roofMeta, deco.roofID, deco.roofMeta, false); - - - - for (int rotation = 1; rotation < 4; rotation += 2) { - // this might be one of my more confusing instances of code recycling - this.fillBlocksRotated(world, sbb, 4, 0, 1, 12, 1, 1, deco.blockID, deco.blockMeta, rotation); - // more teeny crenellations - for (int i = 3; i < 13; i += 2) { - this.fillBlocksRotated(world, sbb, i, -1, 1, i, 2, 1, deco.blockID, deco.blockMeta, rotation); - } - } - - // corners - for (int rotation = 0; rotation < 4; rotation++) { - this.fillBlocksRotated(world, sbb, 0, -1, 0, 3, 2, 3, deco.blockID, deco.blockMeta, rotation); - this.placeBlockRotated(world, deco.blockID, deco.blockMeta, 1, -2, 2, rotation, sbb); - this.placeBlockRotated(world, deco.blockID, deco.blockMeta, 1, -2, 1, rotation, sbb); - this.placeBlockRotated(world, deco.blockID, deco.blockMeta, 2, -2, 1, rotation, sbb); - } - - - - return true; - } - - } - - public static class Foundation13 extends StructureTFComponent { - protected int groundLevel = -1; - - public Foundation13() { - } - - public Foundation13(Random rand, int i, StructureTFComponent sideTower) { - super(i); - - this.setCoordBaseMode(sideTower.getCoordBaseMode()); - this.boundingBox = new StructureBoundingBox(sideTower.getBoundingBox().minX - 2, sideTower.getBoundingBox().minY - 1, sideTower.getBoundingBox().minZ - 2, sideTower.getBoundingBox().maxX + 2, sideTower.getBoundingBox().minY, sideTower.getBoundingBox().maxZ + 2); - - } - - @SuppressWarnings({ "unchecked", "rawtypes" }) - @Override - public void buildComponent(StructureComponent parent, List list, Random rand) { - if (parent != null && parent instanceof StructureTFComponent) { - this.deco = ((StructureTFComponent)parent).deco; - } - } - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - // offset bounding box to average ground level - if (this.groundLevel < 0) - { - this.groundLevel = this.getDeadrockLevel(world, sbb); - - if (this.groundLevel < 0) - { - return true; - } - - //System.out.println("Adjusting root bounding box to " + this.boundingBox.minY); - } - - // how tall are we - int height = this.boundingBox.maxY - this.groundLevel; - int mid = height / 2; - - // assume square - int size = this.boundingBox.maxX - this.boundingBox.minX; - - for (int rotation = 0; rotation < 4; rotation++) { - // do corner - this.fillToGroundRotated(world, deco.blockID, deco.blockMeta, 1, -1, 1, rotation, sbb); - this.fillToGroundRotated(world, deco.blockID, deco.blockMeta, 2, -1, 1, rotation, sbb); - this.fillToGroundRotated(world, deco.blockID, deco.blockMeta, 2, -mid, 0, rotation, sbb); - this.fillToGroundRotated(world, deco.blockID, deco.blockMeta, 1, -1, 2, rotation, sbb); - this.fillToGroundRotated(world, deco.blockID, deco.blockMeta, 0, -mid, 2, rotation, sbb); - - for (int x = 6; x < (size - 3); x += 4) { - this.fillToGroundRotated(world, deco.blockID, deco.blockMeta, x, -1, 1, rotation, sbb); - this.fillToGroundRotated(world, deco.blockID, deco.blockMeta, x, -mid, 0, rotation, sbb); - } - - } - - return true; - } - - /** - * Find what y level the local deadrock is. Just check the center of the chunk we're given - */ - protected int getDeadrockLevel(World world, StructureBoundingBox sbb) { - int groundLevel = 256; - - for (int y = 150; y > 0; y--) // is 150 a good place to start? :) - { - int cx = sbb.getCenterX(); - int cz = sbb.getCenterZ(); - - Block block = world.getBlock(cx, y, cz); - if (block == TFBlocks.deadrock) - { - groundLevel = y; - break; - } - } - - return groundLevel; - } - } - - /** - * Foundation that makes thorns go all through the tower - * - * @author benma_000 - * - */ - public static class Foundation13Thorns extends Foundation13 { - - public Foundation13Thorns() {} - - public Foundation13Thorns(Random rand, int i, StructureTFComponent sideTower) { - super(rand, i, sideTower); - - this.boundingBox = new StructureBoundingBox(sideTower.getBoundingBox().minX - 5, sideTower.getBoundingBox().maxY - 1, sideTower.getBoundingBox().minZ - 5, sideTower.getBoundingBox().maxX + 5, sideTower.getBoundingBox().maxY, sideTower.getBoundingBox().maxZ + 5); - - } - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - // thorns - Random decoRNG = new Random(world.getSeed() + (this.boundingBox.minX * 321534781) ^ (this.boundingBox.minZ * 756839)); - - for (int i = 0; i < 4; i++) { - this.makeThornVine(world, decoRNG, i, sbb); - } - - return true; - } - - private void makeThornVine(World world, Random decoRNG, int rotation, StructureBoundingBox sbb) { - - int x = 3 + decoRNG.nextInt(13); - int z = 3 + decoRNG.nextInt(13); - - int y = this.boundingBox.getYSize() + 5; - - int twist = decoRNG.nextInt(4); - int twistMod = 3 + decoRNG.nextInt(3); - - while (this.getBlockIDRotated(world, x, y, z, rotation, sbb) != TFBlocks.deadrock && this.getYWithOffset(y) > 60) { - this.placeBlockRotated(world, TFBlocks.thorns, 0, x, y, z, rotation, sbb); - // twist vines around the center block - switch (twist) { - case 0: - this.placeBlockRotated(world, TFBlocks.thorns, 0, x + 1, y, z, rotation, sbb); - this.placeBlockRotated(world, TFBlocks.thorns, 0, x, y, z + 1, rotation, sbb); - this.placeBlockRotated(world, TFBlocks.thorns, 0, x + 1, y, z + 1, rotation, sbb); - break; - case 1: - this.placeBlockRotated(world, TFBlocks.thorns, 0, x + 1, y, z, rotation, sbb); - this.placeBlockRotated(world, TFBlocks.thorns, 0, x, y, z - 1, rotation, sbb); - this.placeBlockRotated(world, TFBlocks.thorns, 0, x + 1, y, z - 1, rotation, sbb); - break; - case 2: - this.placeBlockRotated(world, TFBlocks.thorns, 0, x - 1, y, z, rotation, sbb); - this.placeBlockRotated(world, TFBlocks.thorns, 0, x, y, z - 1, rotation, sbb); - this.placeBlockRotated(world, TFBlocks.thorns, 0, x - 1, y, z - 1, rotation, sbb); - break; - case 3: - this.placeBlockRotated(world, TFBlocks.thorns, 0, x - 1, y, z, rotation, sbb); - this.placeBlockRotated(world, TFBlocks.thorns, 0, x, y, z + 1, rotation, sbb); - this.placeBlockRotated(world, TFBlocks.thorns, 0, x - 1, y, z + 1, rotation, sbb); - break; - } - - if (Math.abs(y % twistMod) == 1) { - // make branch - this.makeThornBranch(world, x, y, z, rotation, sbb); - } - - // twist randomly - if (y % twistMod == 0) { - twist++; - twist = twist % 4; - } - - y--; - } - } - - private void makeThornBranch(World world, int x, int y, int z, int rotation, StructureBoundingBox sbb) { - Random rand = new Random(world.getSeed() + (x * 321534781) ^ (y * 756839) + z); - - // pick a direction - int dir = rand.nextInt(4); - - // initialize direction variables - int dx = 0; - int dz = 0; - - switch (dir) { - case 0: - dx = +1; - break; - case 1: - dz = +1; - break; - case 2: - dx = -1; - break; - case 3: - dz = -1; - break; - } - - // how far do we branch? - int dist = 2 + rand.nextInt(3); - - // check to make sure there's room - int destX = x + (dist * dx); - int destZ = z + (dist * dz); - - if (destX > 0 && destX < this.boundingBox.getXSize() && destZ > 0 && destZ < this.boundingBox.getZSize()) { - for (int i = 0; i < dist; i++) { - // go out that far - int branchMeta = ((dir + rotation + this.coordBaseMode) % 2 == 0) ? 5 : 9; - if (i > 0) { - this.placeBlockRotated(world, TFBlocks.thorns, branchMeta, x + (dx * i), y, z + (dz * i), rotation, sbb); - } - // go up that far - this.placeBlockRotated(world, TFBlocks.thorns, 1, destX, y + i, destZ, rotation, sbb); - // go back half that far - if (i > (dist/ 2)) { - this.placeBlockRotated(world, TFBlocks.thorns, branchMeta, x + (dx * i), y + dist - 1, z + (dz * i), rotation, sbb); - } - - - } - - - } - - } - - - } - - /** - * A larger foundation that comes all the way from the top of a tower - * - * @author benma_000 - * - */ - public static class BellFoundation21 extends Foundation13 { - - public BellFoundation21() {} - - public BellFoundation21(Random rand, int i, StructureTFComponent sideTower) { - super(rand, i, sideTower); - - this.boundingBox = new StructureBoundingBox(sideTower.getBoundingBox().minX - 2, sideTower.getBoundingBox().maxY - 1, sideTower.getBoundingBox().minZ - 2, sideTower.getBoundingBox().maxX + 2, sideTower.getBoundingBox().maxY, sideTower.getBoundingBox().maxZ + 2); - - } - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - // find ground level - if (this.groundLevel < 0) { - this.groundLevel = this.getDeadrockLevel(world, sbb); - } - - // how tall are we? - int height = this.boundingBox.maxY - this.groundLevel; - - int mid = 16; - int low = 32; - - // assume square - int size = this.boundingBox.maxX - this.boundingBox.minX; - - for (int rotation = 0; rotation < 4; rotation++) { - // do corner - this.fillToGroundRotated(world, deco.blockID, deco.blockMeta, 2, -1, 1, rotation, sbb); - this.fillToGroundRotated(world, deco.blockID, deco.blockMeta, 2, -mid, 0, rotation, sbb); - this.fillToGroundRotated(world, deco.blockID, deco.blockMeta, 1, -1, 2, rotation, sbb); - this.fillToGroundRotated(world, deco.blockID, deco.blockMeta, 0, -mid, 2, rotation, sbb); - - this.fillToGroundRotated(world, deco.blockID, deco.blockMeta, 1, -low, 1, rotation, sbb); - this.fillToGroundRotated(world, deco.blockID, deco.blockMeta, 0, -low, 1, rotation, sbb); - this.fillToGroundRotated(world, deco.blockID, deco.blockMeta, 1, -low, 0, rotation, sbb); - this.fillToGroundRotated(world, deco.blockID, deco.blockMeta, 0, -low, 0, rotation, sbb); - - for (int x = 6; x < (size - 3); x += 4) { - this.fillToGroundRotated(world, deco.blockID, deco.blockMeta, x, -1, 1, rotation, sbb); - this.fillToGroundRotated(world, deco.blockID, deco.blockMeta, x, -mid, 0, rotation, sbb); - } - - } - - return true; - } - - - } - -} diff --git a/src/main/java/twilightforest/structures/TFMaze.java b/src/main/java/twilightforest/structures/TFMaze.java deleted file mode 100644 index bc76b5c25e..0000000000 --- a/src/main/java/twilightforest/structures/TFMaze.java +++ /dev/null @@ -1,938 +0,0 @@ -package twilightforest.structures; - -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.init.Blocks; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import twilightforest.block.TFBlocks; -import twilightforest.world.TFGenCanopyTree; - - - -/** - * This is a maze of cells and walls. - * - * The cells are at odd numbered x and y values, and the walls are at even numbered ones. This does make the storage slightly inefficient, but oh wells. - * - * @author Ben - * - */ -public class TFMaze { - - public int width; // cells wide (x) - public int depth; // cells deep (z) - - public int oddBias; // corridor thickness, default 3 - public int evenBias; // wall thickness here. NYI - - public int tall; // wall blocks tall - public int head;// blocks placed above the maze - public int roots;// blocks placed under the maze (used for hedge mazes) - - public int worldX; // set when we first copy the maze into the world - public int worldY; - public int worldZ; - - public int type; // 1-3 = various sizes hollow hills - - public Block wallBlockID; - public int wallBlockMeta; - - public Block wallVar0ID; - public int wallVar0Meta; - public float wallVarRarity; - - public Block headBlockID; - public int headBlockMeta; - - public Block rootBlockID; - public int rootBlockMeta; - - public Block pillarBlockID; - public int pillarBlockMeta; - - public Block doorBlockID; - public int doorBlockMeta; - public float doorRarity; - - public Block torchBlockID; - public int torchBlockMeta; - public float torchRarity; - - protected int rawWidth; - protected int rawDepth; - protected int[] storage; - - public static final int OUT_OF_BOUNDS = Integer.MIN_VALUE; - public static final int OOB = OUT_OF_BOUNDS; - public static final int ROOM = 5; - public static final int DOOR = 6; - - public Random rand; - - public TFMaze(int cellsWidth, int cellsDepth) - { - // default values - oddBias = 3; - evenBias = 1; - tall = 3; - head = 0; - roots = 0; - wallBlockID = TFBlocks.mazestone; - wallBlockMeta = 2; - rootBlockID = TFBlocks.mazestone; - rootBlockMeta = 0; - torchBlockID = Blocks.torch; - pillarBlockID = null; - - torchBlockMeta = 0; - torchRarity = 0.75F; - - doorRarity = 0F; - - this.width = cellsWidth; - this.depth = cellsDepth; - - this.rawWidth = width * 2 + 1; - this.rawDepth = depth * 2 + 1; - storage = new int [rawWidth * rawDepth]; - - rand = new Random(); - } - - /** - * Gets the value from a cell in the maze - */ - public int getCell(int x, int z) { - return getRaw(x * 2 + 1, z * 2 + 1); - } - - /** - * Puts a value into a cell in the maze - */ - public void putCell(int x, int z, int value) { - putRaw(x * 2 + 1, z * 2 + 1, value); - } - - /** - * Returns true if the specified cell equals the specified value - */ - public boolean cellEquals(int x, int z, int value) - { - return getCell(x, z) == value; - } - - /** - * Gets the wall value, or OUT_OF_BOUNDS if the area is out of bounds or the coordinates are not orthogonally adjacent. - */ - public int getWall(int sx, int sz, int dx, int dz) - { - if (dx == sx + 1 && dz == sz) - { - return getRaw(sx * 2 + 2, sz * 2 + 1); - } - if (dx == sx - 1 && dz == sz) - { - return getRaw(sx * 2 + 0, sz * 2 + 1); - } - if (dx == sx && dz == sz + 1) - { - return getRaw(sx * 2 + 1, sz * 2 + 2); - } - if (dx == sx && dz == sz - 1) - { - return getRaw(sx * 2 + 1, sz * 2 + 0); - } - - System.out.println("Wall check out of bounds; s = " + sx + ", " + sz + "; d = " + dx + ", " + dz); - - return OUT_OF_BOUNDS; - } - - public void putWall(int sx, int sz, int dx, int dz, int value) - { - if (dx == sx + 1 && dz == sz) - { - putRaw(sx * 2 + 2, sz * 2 + 1, value); - } - if (dx == sx - 1 && dz == sz) - { - putRaw(sx * 2 + 0, sz * 2 + 1, value); - } - if (dx == sx && dz == sz + 1) - { - putRaw(sx * 2 + 1, sz * 2 + 2, value); - } - if (dx == sx && dz == sz - 1) - { - putRaw(sx * 2 + 1, sz * 2 + 0, value); - } - } - - /** - * Returns true if there is a wall there - */ - public boolean isWall(int sx, int sz, int dx, int dz) - { - return getWall(sx, sz, dx, dz) == 0; - } - - /** - * Puts a value into the raw storage. - */ - public void putRaw(int rawx, int rawz, int value) - { - if (rawx >= 0 && rawx < rawWidth && rawz >= 0 && rawz < rawDepth) - { - storage[rawz * rawWidth + rawx] = value; - } - } - - /** - * Gets a value from raw storage - */ - protected int getRaw(int rawx, int rawz) - { - if (rawx < 0 || rawx >= rawWidth || rawz < 0 || rawz >= rawDepth) - { - return OUT_OF_BOUNDS; - } else { - return storage[rawz * rawWidth + rawx]; - } - } - - /** - * Sets the random seed to a specific value - */ - public void setSeed(long newSeed) { - rand.setSeed(newSeed); - } - - /** - * Copies the maze into the world by placing walls. - */ - public void copyToWorld(World world, int dx, int dy, int dz) - { - worldX = dx; - worldY = dy; - worldZ = dz; - - for(int x = 0; x < rawWidth; x++) - { - for(int z = 0; z < rawDepth; z++) - { - if (getRaw(x, z) == 0) - { - int mdx = dx + (x / 2 * (evenBias + oddBias)); - int mdz = dz + (z / 2 * (evenBias + oddBias)); - - if(isEven(x) && isEven(z)) - { - if (type == 4 && shouldTree(x, z)) { - // occasionally make a tree - (new TFGenCanopyTree()).generate(world, rand, mdx, dy, mdz); - } else { - // make a block! - for(int y = 0; y < head; y++) - { - putHeadBlock(world, mdx, dy + tall + y, mdz); - } - for(int y = 0; y < tall; y++) - { - putWallBlock(world, mdx, dy + y, mdz); - } - for(int y = 1; y <= roots; y++) - { - putRootBlock(world, mdx, dy - y, mdz); - } - } - } - if(isEven(x) && !isEven(z)) - { - // make a | vertical | wall! - for(int even = 0; even < evenBias; even++) - { - for(int odd = 1; odd <= oddBias; odd++) - { - for(int y = 0; y < head; y++) - { - putHeadBlock(world, mdx + even, dy + tall + y, mdz + odd); - } - for(int y = 0; y < tall; y++) - { - putWallBlock(world, mdx + even, dy + y, mdz + odd); - } - for(int y = 1; y <= roots; y++) - { - putRootBlock(world, mdx + even, dy - y, mdz + odd); - } - } - } - } - if(!isEven(x) && isEven(z)) - { - // make a - horizontal - wall! - for(int even = 0; even < evenBias; even++) - { - for(int odd = 1; odd <= oddBias; odd++) - { - for(int y = 0; y < head; y++) - { - putHeadBlock(world, mdx + odd, dy + tall + y, mdz + even); - } - for(int y = 0; y < tall; y++) - { - putWallBlock(world, mdx + odd, dy + y, mdz + even); - } - for(int y = 1; y <= roots; y++) - { - putRootBlock(world, mdx + odd, dy - y, mdz + even); - } - } - } - } - } - } - } - - placeTorches(world); - } - - /** - * Copies the maze into the world by carving out empty spaces. - */ - public void carveToWorld(World world, int dx, int dy, int dz) - { - worldX = dx; - worldY = dy; - worldZ = dz; - - for(int x = 0; x < rawWidth; x++) - { - for(int z = 0; z < rawDepth; z++) - { - if (getRaw(x, z) != 0) - { - int mdx = dx + (x / 2 * (evenBias + oddBias)); - int mdz = dz + (z / 2 * (evenBias + oddBias)); - - if (isEven(x) && isEven(z)) - { - // carve a one-block wide pillar - for(int y = 0; y < tall; y++) - { - carveBlock(world, mdx, dy + y, mdz); - } - } - else if (isEven(x) && !isEven(z)) - { - // carve a | vertical | wall - for(int i = 1; i <= oddBias; i++) - { - for(int y = 0; y < tall; y++) - { - carveBlock(world, mdx, dy + y, mdz + i); - } - } - } - else if (!isEven(x) && isEven(z)) - { - // carve a - horizontal - wall! - for(int i = 1; i <= oddBias; i++) - { - for(int y = 0; y < tall; y++) - { - carveBlock(world, mdx + i, dy + y, mdz); - } - } - } - else if (!isEven(x) && !isEven(z)) // this should always be true at this point - { - // carve an open space - for(int mx = 1; mx <= oddBias; mx++) - { - for(int mz = 1; mz <= oddBias; mz++) - { - for(int y = 0; y < tall; y++) - { - carveBlock(world, mdx + mx, dy + y, mdz + mz); - } - } - } - } - } - } - } - - placeTorches(world); - } - - - /** - * Copy the maze into a StructureTFComponent - */ - public void copyToStructure(World world, int dx, int dy, int dz, StructureTFComponent component, StructureBoundingBox sbb) { - for(int x = 0; x < rawWidth; x++) - { - for(int z = 0; z < rawDepth; z++) - { - // only draw walls. if the data is 0 the there's a wall - if (getRaw(x, z) == 0) - { - int mdx = dx + (x / 2 * (evenBias + oddBias)); - int mdz = dz + (z / 2 * (evenBias + oddBias)); - - if (evenBias > 1) - { - mdx--; - mdz--; - } - - if(isEven(x) && isEven(z)) - { - if (type == 4 && shouldTree(x, z)) { - // occasionally make a tree -// (new TFGenCanopyTree()).generate(world, rand, mdx, dy, mdz); - putCanopyTree(world, mdx, dy, mdz, component, sbb); - } else { - // make a block! - for(int even = 0; even < evenBias; even++) - { - for(int even2 = 0; even2 < evenBias; even2++) - { - for(int y = 0; y < head; y++) - { - putHeadBlock(world, mdx + even, dy + tall + y, mdz + even2, component, sbb); - } - for(int y = 0; y < tall; y++) - { - if (shouldPillar(x, z)) - { - putPillarBlock(world, mdx + even, dy + y, mdz + even2, component, sbb); - } - else - { - putWallBlock(world, mdx + even, dy + y, mdz + even2, component, sbb); - } - } - for(int y = 1; y <= roots; y++) - { - putRootBlock(world, mdx + even, dy - y, mdz + even2, component, sbb); - } - } - } - } - } - if(isEven(x) && !isEven(z)) - { - // make a | vertical | wall! - for(int even = 0; even < evenBias; even++) - { - for(int odd = 1; odd <= oddBias; odd++) - { - makeWallThing(world, dy, component, sbb, mdx, mdz, even, odd); - } - } - } - if(!isEven(x) && isEven(z)) - { - // make a - horizontal - wall! - for(int even = 0; even < evenBias; even++) - { - for(int odd = 1; odd <= oddBias; odd++) - { - makeWallThing(world, dy, component, sbb, mdx, mdz, odd, even); - } - } - } - } - else if (getRaw(x, z) == DOOR) - { - int mdx = dx + (x / 2 * (evenBias + oddBias)); - int mdz = dz + (z / 2 * (evenBias + oddBias)); - - if (evenBias > 1) - { - mdx--; - mdz--; - } - - if(isEven(x) && !isEven(z)) - { - // make a | vertical | door! - for(int even = 0; even < evenBias; even++) - { - for(int odd = 1; odd <= oddBias; odd++) - { - for(int y = 0; y < head; y++) - { - putHeadBlock(world, mdx + even, dy + tall + y, mdz + odd, component, sbb); - } - for(int y = 0; y < tall; y++) - { - putDoorBlock(world, mdx + even, dy + y, mdz + odd, component, sbb); - } - for(int y = 1; y <= roots; y++) - { - putRootBlock(world, mdx + even, dy - y, mdz + odd, component, sbb); - } - } - } - } - if(!isEven(x) && isEven(z)) - { - // make a - horizontal - door! - for(int even = 0; even < evenBias; even++) - { - for(int odd = 1; odd <= oddBias; odd++) - { - for(int y = 0; y < head; y++) - { - putHeadBlock(world, mdx + odd, dy + tall + y, mdz + even, component, sbb); - } - for(int y = 0; y < tall; y++) - { - putDoorBlock(world, mdx + odd, dy + y, mdz + even, component, sbb); - } - for(int y = 1; y <= roots; y++) - { - putRootBlock(world, mdx + odd, dy - y, mdz + even, component, sbb); - } - } - } - } - } - } - } - - // instead of putting placetorches in a seperate function, I just put it here. - for(int x = 0; x < rawWidth; x++) - { - for(int z = 0; z < rawDepth; z++) - { - if (getRaw(x, z) == 0) - { - int mdx = dx + (x / 2 * (evenBias + oddBias)); - int mdy = dy + 1; - int mdz = dz + (z / 2 * (evenBias + oddBias)); - - if(isEven(x) && isEven(z)) - { - if (shouldTorch(x, z) && component.getBlockAtCurrentPosition(world, mdx, mdy, mdz, sbb) == wallBlockID) - { - component.placeBlockAtCurrentPosition(world, torchBlockID, torchBlockMeta, mdx, mdy, mdz, sbb); - } - } - } - } - } - - } - - protected void makeWallThing(World world, int dy, StructureTFComponent component, StructureBoundingBox sbb, int mdx, int mdz, int even, int odd) { - for(int y = 0; y < head; y++) - { - putHeadBlock(world, mdx + even, dy + tall + y, mdz + odd, component, sbb); - } - for(int y = 0; y < tall; y++) - { - putWallBlock(world, mdx + even, dy + y, mdz + odd, component, sbb); - } - for(int y = 1; y <= roots; y++) - { - putRootBlock(world, mdx + even, dy - y, mdz + odd, component, sbb); - } - } - - /** - * Puts a wall block in the structure, if pillar blocks are properly specified - */ - protected void putPillarBlock(World world, int x, int y, int z, StructureTFComponent component, StructureBoundingBox sbb) - { - component.placeBlockAtCurrentPosition(world, pillarBlockID, pillarBlockMeta, x, y, z, sbb); - } - - /** - * Puts a wall block in the world, at the specified world coordinates. - */ - protected void putWallBlock(World world, int x, int y, int z) - { - world.setBlock(x, y, z, wallBlockID, wallBlockMeta, 2); - } - - /** - * Puts a wall block in the structure, at the specified structure coordinates. - */ - protected void putWallBlock(World world, int x, int y, int z, StructureTFComponent component, StructureBoundingBox sbb) - { - if (wallVarRarity > 0 && rand.nextFloat() < this.wallVarRarity) - { - component.placeBlockAtCurrentPosition(world, wallVar0ID, wallVar0Meta, x, y, z, sbb); - } - else - { - component.placeBlockAtCurrentPosition(world, wallBlockID, wallBlockMeta, x, y, z, sbb); - } - } - - /** - * Puts a wall block in the structure, at the specified structure coordinates. - */ - protected void putDoorBlock(World world, int x, int y, int z, StructureTFComponent component, StructureBoundingBox sbb) - { - component.placeBlockAtCurrentPosition(world, doorBlockID, doorBlockMeta, x, y, z, sbb); - } - - /** - * Carves a block into the world. - * TODO: check what's there? maybe only certain blocks? - */ - protected void carveBlock(World world, int x, int y, int z) - { - world.setBlock(x, y, z, Blocks.air, 0, 2); - } - - protected void putHeadBlock(World world, int x, int y, int z) - { - world.setBlock(x, y, z, headBlockID, headBlockMeta, 2); - } - - protected void putHeadBlock(World world, int x, int y, int z, StructureTFComponent component, StructureBoundingBox sbb) - { - component.placeBlockAtCurrentPosition(world, headBlockID, headBlockMeta, x, y, z, sbb); - } - - - /** - * Puts a root block in the world, at the specified world coordinates. - */ - protected void putRootBlock(World world, int x, int y, int z) - { - world.setBlock(x, y, z, rootBlockID, rootBlockMeta, 2); - } - - /** - * Puts a root block in the structure, at the specified structure coordinates. - */ - protected void putRootBlock(World world, int x, int y, int z, StructureTFComponent component, StructureBoundingBox sbb) - { - component.placeBlockAtCurrentPosition(world, rootBlockID, rootBlockMeta, x, y, z, sbb); - } - - /** - * Puts a canopy tree in the world at the specified structure coordinates. - */ - protected void putCanopyTree(World world, int x, int y, int z, StructureTFComponent component, StructureBoundingBox sbb) - { - - int wx = component.getXWithOffset(x, z); - int wy = component.getYWithOffset(y); - int wz = component.getZWithOffset(x, z); - - // only place it if we're actually generating the chunk the tree is in (or at least the middle of the tree) - if(sbb.isVecInside(wx, wy, wz)) - { - (new TFGenCanopyTree()).generate(world, rand, wx, wy, wz); - } - } - - /** - * I'm not sure why I made a function of this simple thing. Maybe I need like... a macro? - */ - public final boolean isEven(int n) { - return n % 2 == 0; - } - - /** - * Called after copyToWorld. Places torches in the maze as appropriate - * - * @param world - * @param dx - * @param dy - * @param dz - */ - public void placeTorches(World world) { - - int torchHeight = 1; - - for(int x = 0; x < rawWidth; x++) - { - for(int z = 0; z < rawDepth; z++) - { - if (getRaw(x, z) == 0) - { - int mdx = worldX + (x / 2 * (evenBias + oddBias)); - int mdy = worldY + torchHeight; - int mdz = worldZ + (z / 2 * (evenBias + oddBias)); - - if(isEven(x) && isEven(z)) - { - if (shouldTorch(x, z) && world.getBlock(mdx, mdy, mdz) == wallBlockID) - { - world.setBlock(mdx, mdy, mdz, torchBlockID, torchBlockMeta, 2); - } - } - } - } - } - } - - /** - * Should we put a torch here? Intended to be called on the in-between spots where x and y are even. - */ - public boolean shouldTorch(int rx, int rz) { - // if there is out of bounds in any direction, no - if (getRaw(rx + 1, rz) == OOB || getRaw(rx - 1, rz) == OOB || getRaw(rx, rz + 1) == OOB || getRaw(rx, rz - 1) == OOB) - { - return false; - } - - // if there are walls in two opposite directions, no - if ((getRaw(rx + 1, rz) == 0 && getRaw(rx - 1, rz) == 0) || (getRaw(rx, rz + 1) == 0 && getRaw(rx, rz - 1) == 0)) - { - return false; - } - - // otherwise, I suppose yes - - // check rarity - return rand.nextFloat() <= this.torchRarity; - } - - /** - * Should we put a torch here? Intended to be called on the in-between spots where x and y are even. - */ - public boolean shouldPillar(int rx, int rz) - { - // if the pillar block is not defined, no - if (pillarBlockID == null) - { - return false; - } - - // if there is out of bounds in any direction, no - if (getRaw(rx + 1, rz) == OOB || getRaw(rx - 1, rz) == OOB || getRaw(rx, rz + 1) == OOB || getRaw(rx, rz - 1) == OOB) - { - return false; - } - - // if there are walls in two opposite directions, no - if ((getRaw(rx + 1, rz) == 0 && getRaw(rx - 1, rz) == 0) || (getRaw(rx, rz + 1) == 0 && getRaw(rx, rz - 1) == 0)) - { - return false; - } - - // otherwise, I suppose yes - return true; - } - - /** - * Should we put a tree instead of a post? - * - * Essentially the answer is yes for the corners and the exits. - * - * @param rx - * @param ry - * @return - */ - public boolean shouldTree(int rx, int rz) { - if ((rx == 0 || rx == rawWidth - 1) && (getRaw(rx, rz + 1) != 0 || getRaw(rx, rz - 1) != 0)) { - return true; - } - if ((rz == 0 || rz == rawDepth - 1) && (getRaw(rx + 1, rz) != 0 || getRaw(rx - 1, rz) != 0)) { - return true; - } - - - return rand.nextInt(50) == 0; - } - - /** - * If the worldX is set properly, this returns where in that world the maze coordinate x lies - * - * @param x - * @return - */ - int getWorldX(int x) - { - return worldX + (x * (evenBias + oddBias)) + 1; - } - - /** - * If the worldZ is set properly, this returns where in that world the maze coordinate z lies - * - * @param z - * @return - */ - int getWorldZ(int z) - { - return worldZ + (z * (evenBias + oddBias)) + 1; - } - - - /** - * Carves a room into the maze. The coordinates given are cell coordinates. - */ - public void carveRoom0(int cx, int cz) - { - - putCell(cx, cz, 5); - - putCell(cx + 1, cz, 5); - putWall(cx, cz, cx + 1, cz, 5); - putCell(cx - 1, cz, 5); - putWall(cx, cz, cx - 1, cz, 5); - putCell(cx, cz + 1, 5); - putWall(cx, cz, cx, cz + 1, 5); - putCell(cx, cz - 1, 5); - putWall(cx, cz, cx, cz - 1, 5); - } - - /** - * This room is a 3x3 cell room with exits in every direction. - */ - public void carveRoom1(int cx, int cz) - { - int rx = cx * 2 + 1; - int rz = cz * 2 + 1; - - // remove walls and cells - for(int i = -2; i <= 2; i++) - { - for(int j = -2; j <= 2; j++) - { - putRaw(rx + i, rz + j, ROOM); - } - } - - // mark the exit areas as unmazed - putCell(rx, rz + 1, 0); - putCell(rx, rz - 1, 0); - putCell(rx + 1, rz, 0); - putCell(rx - 1, rz, 0); - - // make 4 exits (if not at the edge of the maze) - if (getRaw(rx, rz + 4) != OUT_OF_BOUNDS) { - putRaw(rx, rz + 3, ROOM); - } - if (getRaw(rx, rz - 4) != OUT_OF_BOUNDS) { - putRaw(rx, rz - 3, ROOM); - } - if (getRaw(rx + 4, rz) != OUT_OF_BOUNDS) { - putRaw(rx + 3, rz, ROOM); - } - if (getRaw(rx- 4, rz) != OUT_OF_BOUNDS) { - putRaw(rx - 3, rz, ROOM); - } - } - - - /** - * Adds four exits into the maze. - */ - public void add4Exits() - { - int hx = rawWidth / 2 + 1; - int hz = rawDepth / 2 + 1; - - putRaw(hx, 0, ROOM); - putRaw(hx, rawDepth - 1, ROOM); - putRaw(0, hz, ROOM); - putRaw(rawWidth - 1, hz, ROOM); - } - - /** - * Generates a maze using the recursive backtracking algorithm. - * - * @param sx The starting x coordinate - * @param sz The starting y coordinate - */ - public void generateRecursiveBacktracker(int sx, int sz) - { - rbGen(sx, sz); - } - - /** - * Mark the cell as visited. If we have any unvisited neighbors, pick one randomly, carve the wall between them, then call this function on that neighbor. - * - * @param sx - * @param sz - */ - public void rbGen(int sx, int sz) { - // mark cell as visited - putCell(sx, sz, 1); - - // count the unvisted neighbors - int unvisited = 0; - if (cellEquals(sx + 1, sz, 0)) { - unvisited++; - } - if (cellEquals(sx - 1, sz, 0)) { - unvisited++; - } - if (cellEquals(sx, sz + 1, 0)) { - unvisited++; - } - if (cellEquals(sx, sz - 1, 0)) { - unvisited++; - } - - // if there are no unvisited neighbors, return - if (unvisited == 0) - { - return; - } - - // otherwise, pick a random neighbor to visit - int rn = rand.nextInt(unvisited); - int dx, dz; - dx = dz = 0; - - if (cellEquals(sx + 1, sz, 0)) { - if (rn == 0) { - dx = sx + 1; - dz = sz; - } - rn--; - } - if (cellEquals(sx - 1, sz, 0)) { - if (rn == 0) { - dx = sx - 1; - dz = sz; - } - rn--; - } - if (cellEquals(sx, sz + 1, 0)) { - if (rn == 0) { - dx = sx; - dz = sz + 1; - } - rn--; - } - if (cellEquals(sx, sz - 1, 0)) { - if (rn == 0) { - dx = sx; - dz = sz - 1; - } - } - - // carve wall or door - if (rand.nextFloat() <= this.doorRarity) - { - putWall(sx, sz, dx, dz, DOOR); - } - else - { - putWall(sx, sz, dx, dz, 2); - } - - // call function recursively at the destination - rbGen(dx, dz); - - // the destination has run out of free spaces, let's try this square again, up to 2 more times - rbGen(sx, sz); - rbGen(sx, sz); - } -} diff --git a/src/main/java/twilightforest/structures/darktower/ComponentTFDarkTowerBalcony.java b/src/main/java/twilightforest/structures/darktower/ComponentTFDarkTowerBalcony.java deleted file mode 100644 index 1a719f7003..0000000000 --- a/src/main/java/twilightforest/structures/darktower/ComponentTFDarkTowerBalcony.java +++ /dev/null @@ -1,54 +0,0 @@ -package twilightforest.structures.darktower; - -import java.util.List; -import java.util.Random; - -import net.minecraft.init.Blocks; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import net.minecraft.world.gen.structure.StructureComponent; -import twilightforest.structures.StructureTFComponent; -import twilightforest.structures.lichtower.ComponentTFTowerWing; - -public class ComponentTFDarkTowerBalcony extends ComponentTFTowerWing -{ - - public ComponentTFDarkTowerBalcony() { - super(); - // TODO Auto-generated constructor stub - } - - protected ComponentTFDarkTowerBalcony(int i, int x, int y, int z, int direction) { - super(i, x, y, z, 5, 5, direction); - } - - @SuppressWarnings("rawtypes") - @Override - public void buildComponent(StructureComponent parent, List list, Random rand) - { - if (parent != null && parent instanceof StructureTFComponent) - { - this.deco = ((StructureTFComponent)parent).deco; - } - } - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - - // make floor - fillWithMetadataBlocks(world, sbb, 0, 0, 0, 2, 0, 4, deco.accentID, deco.accentMeta, Blocks.air, 0, false); - fillWithMetadataBlocks(world, sbb, 0, 0, 1, 1, 0, 3, deco.blockID, deco.blockMeta, Blocks.air, 0, false); - - fillWithMetadataBlocks(world, sbb, 0, 1, 0, 2, 1, 4, deco.fenceID, deco.fenceMeta, Blocks.air, 0, false); - - this.placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, 2, 1, 0, sbb); - this.placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, 2, 1, 4, sbb); - - // clear inside - fillWithAir(world, sbb, 0, 1, 1, 1, 1, 3); - - return true; - } - - -} diff --git a/src/main/java/twilightforest/structures/darktower/ComponentTFDarkTowerBeard.java b/src/main/java/twilightforest/structures/darktower/ComponentTFDarkTowerBeard.java deleted file mode 100644 index c5441ab71b..0000000000 --- a/src/main/java/twilightforest/structures/darktower/ComponentTFDarkTowerBeard.java +++ /dev/null @@ -1,101 +0,0 @@ -package twilightforest.structures.darktower; - -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import twilightforest.block.TFBlocks; -import twilightforest.structures.StructureTFComponent; -import twilightforest.structures.lichtower.ComponentTFTowerWing; - - -public class ComponentTFDarkTowerBeard extends StructureTFComponent { - - protected int size; - protected int height; - - public ComponentTFDarkTowerBeard() { - super(); - } - - public ComponentTFDarkTowerBeard(int i, ComponentTFTowerWing wing) { - super(i); - - this.setCoordBaseMode(wing.getCoordBaseMode()); - this.size = wing.size; - this.height = size / 2; - - // just hang out at the very bottom of the tower - this.boundingBox = new StructureBoundingBox(wing.getBoundingBox().minX, wing.getBoundingBox().minY - this.height, wing.getBoundingBox().minZ, wing.getBoundingBox().maxX, wing.getBoundingBox().minY, wing.getBoundingBox().maxZ); - - } - - /** - * Save to NBT - */ - @Override - protected void func_143012_a(NBTTagCompound par1NBTTagCompound) { - super.func_143012_a(par1NBTTagCompound); - - par1NBTTagCompound.setInteger("beardSize", this.size); - par1NBTTagCompound.setInteger("beardHeight", this.height); - } - - /** - * Load from NBT - */ - @Override - protected void func_143011_b(NBTTagCompound par1NBTTagCompound) { - super.func_143011_b(par1NBTTagCompound); - this.size = par1NBTTagCompound.getInteger("beardSize"); - this.height = par1NBTTagCompound.getInteger("beardHeight"); - } - - - /** - * Makes a dark tower type beard - */ - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) - { - makeDarkBeard(world, sbb, 0, 0, 0, size - 1, height - 1, size - 1); - - return true; - } - - - protected void makeDarkBeard(World world, StructureBoundingBox sbb, int minX, int minY, int minZ, int maxX, int maxY, int maxZ) - { - Block frameID = TFBlocks.towerWood; - int frameMeta = 1; - - for (int x = minX; x <= maxX; x++) - { - for (int z = minZ; z <= maxZ; z++) - { - if (x == minX || x == maxX || z == minZ || z == maxZ) - { - int length = Math.min(Math.abs(x - height) - 1, Math.abs(z - height) - 1) ; - - if (length == height - 1) - { - length ++; - } - - if (length == -1) - { - length = 1; - } - - for (int y = maxY; y >= height - length; y--) - { - // wall - this.placeBlockAtCurrentPosition(world, frameID, frameMeta, x, y, z, sbb); - } - } - } - } - } -} diff --git a/src/main/java/twilightforest/structures/darktower/ComponentTFDarkTowerBossBridge.java b/src/main/java/twilightforest/structures/darktower/ComponentTFDarkTowerBossBridge.java deleted file mode 100644 index 86327e2ff5..0000000000 --- a/src/main/java/twilightforest/structures/darktower/ComponentTFDarkTowerBossBridge.java +++ /dev/null @@ -1,32 +0,0 @@ -package twilightforest.structures.darktower; - -import java.util.List; -import java.util.Random; - -import net.minecraft.world.gen.structure.StructureComponent; - -public class ComponentTFDarkTowerBossBridge extends ComponentTFDarkTowerBridge { - - public ComponentTFDarkTowerBossBridge() { - super(); - // TODO Auto-generated constructor stub - } - - - protected ComponentTFDarkTowerBossBridge(int i, int x, int y, int z, int pSize, int pHeight, int direction) { - super(i, x, y, z, pSize, pHeight, direction); - } - - - public boolean makeTowerWing(List list, Random rand, int index, int x, int y, int z, int wingSize, int wingHeight, int rotation) { - // make another size 15 main tower - int direction = (getCoordBaseMode() + rotation) % 4; - int[] dx = offsetTowerCoords(x, y, z, wingSize, direction); - - ComponentTFDarkTowerBossTrap wing = new ComponentTFDarkTowerBossTrap(index, dx[0], dx[1], dx[2], wingSize, wingHeight, direction); - list.add(wing); - wing.buildComponent(this, list, rand); - addOpening(x, y, z, rotation); - return true; - } -} diff --git a/src/main/java/twilightforest/structures/darktower/ComponentTFDarkTowerBossTrap.java b/src/main/java/twilightforest/structures/darktower/ComponentTFDarkTowerBossTrap.java deleted file mode 100644 index b2c23e28a8..0000000000 --- a/src/main/java/twilightforest/structures/darktower/ComponentTFDarkTowerBossTrap.java +++ /dev/null @@ -1,122 +0,0 @@ -package twilightforest.structures.darktower; - -import java.util.List; -import java.util.Random; - -import net.minecraft.init.Blocks; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import net.minecraft.world.gen.structure.StructureComponent; -import twilightforest.block.BlockTFTowerDevice; -import twilightforest.block.TFBlocks; -import twilightforest.structures.StructureTFComponent; - -public class ComponentTFDarkTowerBossTrap extends ComponentTFDarkTowerWing -{ - - public ComponentTFDarkTowerBossTrap() { - super(); - // TODO Auto-generated constructor stub - } - - protected ComponentTFDarkTowerBossTrap(int i, int x, int y, int z, int pSize, int pHeight, int direction) { - super(i, x, y, z, pSize, pHeight, direction); - - // no spawns - this.spawnListIndex = -1; - } - - @SuppressWarnings({ "rawtypes", "unchecked" }) - @Override - public void buildComponent(StructureComponent parent, List list, Random rand) - { - if (parent != null && parent instanceof StructureTFComponent) - { - this.deco = ((StructureTFComponent)parent).deco; - } - - // we should have a door where we started - addOpening(0, 1, size / 2, 2); - - // add a beard - makeABeard(parent, list, rand); - - for (int i = 0; i < 4; i++) - { - if (i == 2 || rand.nextBoolean()) - { - continue; - } - // occasional balcony - int[] dest = getValidOpening(rand, i); - // move opening to tower base - dest[1] = 1; - makeTowerBalcony(list, rand, this.getComponentType(), dest[0], dest[1], dest[2], i); - } - } - - /** - * Attach a roof to this tower. - */ - public void makeARoof(StructureComponent parent, List list, Random rand) { - //nope; - } - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - Random decoRNG = new Random(world.getSeed() + (this.boundingBox.minX * 321534781) ^ (this.boundingBox.minZ * 756839)); - - // make walls - makeEncasedWalls(world, rand, sbb, 0, 0, 0, size - 1, height - 1, size - 1); - - // clear inside - fillWithAir(world, sbb, 1, 1, 1, size - 2, height - 2, size - 2); - - // openings - makeOpenings(world, sbb); - - // half floors, always starting at y = 4 - addBossTrapFloors(world, decoRNG, sbb, 4, height - 1); - - // demolish some - destroyTower(world, decoRNG, 5, height + 2, 5, 4, sbb); - destroyTower(world, decoRNG, 0, height, 0, 3, sbb); - destroyTower(world, decoRNG, 0, height, 8, 4, sbb); - - // hole for boss trap beam - destroyTower(world, decoRNG, 5, 6, 5, 2, sbb); - - // redraw some of the floor in case we destroyed it - this.fillWithMetadataBlocks(world, sbb, 1, 0, 1, size / 2, 0, size - 2, deco.blockID, deco.blockMeta, Blocks.air, 0, false); - this.fillWithMetadataBlocks(world, sbb, 1, 1, 1, size / 2, 1, size - 2, Blocks.air, 0, Blocks.air, 0, false); - - // add boss trap - this.placeBlockAtCurrentPosition(world, TFBlocks.towerDevice, BlockTFTowerDevice.META_GHASTTRAP_INACTIVE, 5, 1, 5, sbb); - this.placeBlockAtCurrentPosition(world, Blocks.redstone_wire, 0, 5, 1, 6, sbb); - this.placeBlockAtCurrentPosition(world, Blocks.redstone_wire, 0, 5, 1, 7, sbb); - this.placeBlockAtCurrentPosition(world, Blocks.redstone_wire, 0, 5, 1, 8, sbb); - this.placeBlockAtCurrentPosition(world, Blocks.redstone_wire, 0, 4, 1, 8, sbb); - this.placeBlockAtCurrentPosition(world, Blocks.redstone_wire, 0, 3, 1, 8, sbb); - this.placeBlockAtCurrentPosition(world, Blocks.wooden_pressure_plate, 0, 2, 1, 8, sbb); - - - return true; - } - - /** - * Add specific boss trap floors - */ - protected void addBossTrapFloors(World world, Random rand, StructureBoundingBox sbb, int bottom, int top) { - - makeFullFloor(world, sbb, 3, 4, 4); - - addStairsDown(world, sbb, 3, 4, size - 2, 4); - addStairsDown(world, sbb, 3, 4, size - 3, 4); - - // stairs to roof - addStairsDown(world, sbb, 1, this.height - 1, size - 2, 4); - addStairsDown(world, sbb, 1, this.height - 1, size - 3, 4); - } - - -} diff --git a/src/main/java/twilightforest/structures/darktower/ComponentTFDarkTowerBridge.java b/src/main/java/twilightforest/structures/darktower/ComponentTFDarkTowerBridge.java deleted file mode 100644 index 8dd3fd0b28..0000000000 --- a/src/main/java/twilightforest/structures/darktower/ComponentTFDarkTowerBridge.java +++ /dev/null @@ -1,107 +0,0 @@ -package twilightforest.structures.darktower; - -import java.util.List; -import java.util.Random; - -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import net.minecraft.world.gen.structure.StructureComponent; -import twilightforest.structures.StructureTFComponent; -import twilightforest.structures.lichtower.ComponentTFTowerWing; - -public class ComponentTFDarkTowerBridge extends ComponentTFTowerWing -{ - - public ComponentTFDarkTowerBridge() { - super(); - } - - int dSize; - int dHeight; - - protected ComponentTFDarkTowerBridge(int i, int x, int y, int z, int pSize, int pHeight, int direction) { - super(i, x, y, z, 5, 5, direction); - - this.dSize = pSize; - this.dHeight = pHeight; - } - - @SuppressWarnings({ "unchecked", "rawtypes" }) - @Override - public void buildComponent(StructureComponent parent, List list, Random rand) - { - if (parent != null && parent instanceof StructureTFComponent) - { - this.deco = ((StructureTFComponent)parent).deco; - } - makeTowerWing(list, rand, this.getComponentType(), 4, 1, 2, dSize, dHeight, 0); - } - - - public boolean makeTowerWing(List list, Random rand, int index, int x, int y, int z, int wingSize, int wingHeight, int rotation) { - // kill too-small towers - if (wingHeight < 6) { - return false; - } - - int direction = (getCoordBaseMode() + rotation) % 4; - int[] dx = offsetTowerCoords(x, y, z, wingSize, direction); - - if (dx[1] + wingHeight > 255) - { - // end of the world! - return false; - } - - ComponentTFTowerWing wing = new ComponentTFDarkTowerWing(index, dx[0], dx[1], dx[2], wingSize, wingHeight, direction); - // check to see if it intersects something already there - StructureComponent intersect = StructureComponent.findIntersecting(list, wing.getBoundingBox()); - if (intersect == null || intersect == this) - { - list.add(wing); - wing.buildComponent(this, list, rand); - addOpening(x, y, z, rotation); - return true; - } - else - { - //System.out.println("Planned wing intersects with " + intersect); - return false; - } - } - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - - // make walls - fillWithBlocks(world, sbb, 0, 0, 0, size - 1, height - 1, size - 1, deco.blockID, deco.blockID, false); - - // accents - for (int x = 0; x < size; x++) - { - this.placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, x, 0, 0, sbb); - this.placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, x, height - 1, 0, sbb); - this.placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, x, 0, size - 1, sbb); - this.placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, x, height - 1, size - 1, sbb); - } - - // nullify sky light - nullifySkyLightForBoundingBox(world); - - // clear inside - fillWithAir(world, sbb, 0, 1, 1, size - 1, height - 2, size - 2); - - - return true; - } - - /** - * Gets the bounding box of the tower wing we would like to make. - * @return - */ - public StructureBoundingBox getWingBB() { - int[] dest = offsetTowerCoords(4, 1, 2, dSize, this.getCoordBaseMode()); - return StructureTFComponent.getComponentToAddBoundingBox(dest[0], dest[1], dest[2], 0, 0, 0, dSize - 1, dHeight - 1, dSize - 1, this.getCoordBaseMode()); - } - -} diff --git a/src/main/java/twilightforest/structures/darktower/ComponentTFDarkTowerEntrance.java b/src/main/java/twilightforest/structures/darktower/ComponentTFDarkTowerEntrance.java deleted file mode 100644 index a16e483b27..0000000000 --- a/src/main/java/twilightforest/structures/darktower/ComponentTFDarkTowerEntrance.java +++ /dev/null @@ -1,76 +0,0 @@ -package twilightforest.structures.darktower; - -import java.util.List; -import java.util.Random; - -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import net.minecraft.world.gen.structure.StructureComponent; - -public class ComponentTFDarkTowerEntrance extends ComponentTFDarkTowerWing -{ - - public ComponentTFDarkTowerEntrance() { - super(); - // TODO Auto-generated constructor stub - } - - protected ComponentTFDarkTowerEntrance(int i, int x, int y, int z, int pSize, int pHeight, int direction) { - super(i, x, y, z, pSize, pHeight, direction); - } - - @SuppressWarnings("rawtypes") - @Override - public void buildComponent(StructureComponent parent, List list, Random rand) - { - super.buildComponent(parent, list, rand); - - // a few more openings - addOpening(size / 2, 1, 0, 1, EnumDarkTowerDoor.REAPPEARING); - addOpening(size / 2, 1, size - 1, 3, EnumDarkTowerDoor.REAPPEARING); - } - - - /** - * Add a beard to this structure. There is only one type of beard. - */ - public void makeABeard(StructureComponent parent, List list, Random rand) { - //nope; - } - - /** - * Attach a roof to this tower. - */ - @Override - public void makeARoof(StructureComponent parent, List list, Random rand) - { - // nope - } - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - // make walls - makeEncasedWalls(world, rand, sbb, 0, 0, 0, size - 1, height - 1, size - 1); - - // deco to ground - for (int x = 0; x < this.size; x++) - { - for (int z = 0; z < this.size; z++) - { - this.func_151554_b(world, deco.accentID, deco.accentMeta, x, -1, z, sbb); - } - } - - // clear inside - fillWithAir(world, sbb, 1, 1, 1, size - 2, height - 2, size - 2); - - // sky light - nullifySkyLightForBoundingBox(world); - - // openings - makeOpenings(world, sbb); - - return true; - } - -} diff --git a/src/main/java/twilightforest/structures/darktower/ComponentTFDarkTowerEntranceBridge.java b/src/main/java/twilightforest/structures/darktower/ComponentTFDarkTowerEntranceBridge.java deleted file mode 100644 index 83cdd183e9..0000000000 --- a/src/main/java/twilightforest/structures/darktower/ComponentTFDarkTowerEntranceBridge.java +++ /dev/null @@ -1,32 +0,0 @@ -package twilightforest.structures.darktower; - -import java.util.List; -import java.util.Random; - -import net.minecraft.world.gen.structure.StructureComponent; - -public class ComponentTFDarkTowerEntranceBridge extends ComponentTFDarkTowerBridge -{ - - public ComponentTFDarkTowerEntranceBridge() { - super(); - // TODO Auto-generated constructor stub - } - - protected ComponentTFDarkTowerEntranceBridge(int i, int x, int y, int z, int pSize, int pHeight, int direction) { - super(i, x, y, z, pSize, pHeight, direction); - } - - public boolean makeTowerWing(List list, Random rand, int index, int x, int y, int z, int wingSize, int wingHeight, int rotation) { - // make an entrance tower - int direction = (getCoordBaseMode() + rotation) % 4; - int[] dx = offsetTowerCoords(x, y, z, wingSize, direction); - - ComponentTFDarkTowerWing wing = new ComponentTFDarkTowerEntrance(index, dx[0], dx[1], dx[2], wingSize, wingHeight, direction); - - list.add(wing); - wing.buildComponent(this, list, rand); - addOpening(x, y, z, rotation); - return true; - } -} diff --git a/src/main/java/twilightforest/structures/darktower/ComponentTFDarkTowerMain.java b/src/main/java/twilightforest/structures/darktower/ComponentTFDarkTowerMain.java deleted file mode 100644 index 4a92d7821c..0000000000 --- a/src/main/java/twilightforest/structures/darktower/ComponentTFDarkTowerMain.java +++ /dev/null @@ -1,1681 +0,0 @@ -package twilightforest.structures.darktower; - -import java.util.ArrayList; -import java.util.List; -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.entity.item.EntityItemFrame; -import net.minecraft.init.Blocks; -import net.minecraft.init.Items; -import net.minecraft.inventory.IInventory; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntityMobSpawner; -import net.minecraft.util.Facing; -import net.minecraft.world.World; -import net.minecraft.world.gen.feature.WorldGenForest; -import net.minecraft.world.gen.feature.WorldGenTrees; -import net.minecraft.world.gen.feature.WorldGenerator; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import net.minecraft.world.gen.structure.StructureComponent; -import twilightforest.TFTreasure; -import twilightforest.block.BlockTFTowerDevice; -import twilightforest.block.TFBlocks; -import twilightforest.entity.TFCreatures; -import twilightforest.item.TFItems; -import twilightforest.structures.StructureTFComponent; -import twilightforest.structures.StructureTFDecorator; -import twilightforest.structures.TFMaze; -import twilightforest.world.TFGenSmallRainboak; -import twilightforest.world.TFGenSmallTwilightOak; -import cpw.mods.fml.common.FMLLog; - -public class ComponentTFDarkTowerMain extends ComponentTFDarkTowerWing -{ - private boolean placedKeys = false; - - public ComponentTFDarkTowerMain() { - super(); - // TODO Auto-generated constructor stub - } - - - public ComponentTFDarkTowerMain(World world, Random rand, int index, int x, int y, int z) { - this(world, rand, index, x + 10, y, z + 10, 2); - } - - - public ComponentTFDarkTowerMain(World world, Random rand, int index, int x, int y, int z, int rotation) { - super(index, x, y, z, 19, 56 + ((rand.nextInt(32) / 5) * 5), rotation); - - // check to make sure we can build the whole tower - if (this.boundingBox.maxY > 245) - { - int amtToLower = (((this.boundingBox.maxY - 245) / 5) * 5) + 5; - - FMLLog.info("[TwilightForest] Lowering Dark Tower max height by %d to be within world bounds", amtToLower); - - this.height -= amtToLower; - this.boundingBox.maxY -= amtToLower; - } - - // decorator - if (this.deco == null) - { - this.deco = new StructureDecoratorDarkTower(); - } - } - - - @SuppressWarnings({ "rawtypes", "unchecked", "unused" }) - @Override - public void buildComponent(StructureComponent parent, List list, Random rand) - { - if (parent != null && parent instanceof StructureTFComponent) - { - this.deco = ((StructureTFComponent)parent).deco; - } - - // if this is not the first main part, add one - if (this.getComponentType() > 0) - { - addOpening(0, 1, size / 2, 2); - } - - // one direction gets a new main tower, unless we're at tower #3 - int mainDir = -1; - - if (this.getComponentType() < 2) - { - mainDir = rand.nextInt(4); - - // make sub towers - for (int i = 0; i < 4; i++) { - if (i == mainDir) - { - continue; - } - - int[] dest = getValidOpening(rand, i); - - int childHeight = validateChildHeight(21 + rand.nextInt(10), 11); - - makeTowerWing(list, rand, this.getComponentType(), dest[0], dest[1], dest[2], 11, childHeight, i); - } - } - else - { - // make boss trap towers - for (int i = 0; i < 4; i++) { - int[] dest = getValidOpening(rand, i); - makeBossTrapWing(list, rand, this.getComponentType(), dest[0], dest[1], dest[2], i); - } - } - - if (this.getComponentType() > 0) - { - // sub towers at base of tower - for (int i = 0; i < 4; i++) { - if (i == 2) - { - continue; - } - - int[] dest = getValidOpening(rand, i); - - // move opening to tower base - dest[1] = 1; - - int childHeight = validateChildHeight(21 + rand.nextInt(10), 11); - - makeTowerWing(list, rand, this.getComponentType(), dest[0], dest[1], dest[2], 11, childHeight, i); - } - - // add a beard - makeABeard(parent, list, rand); - } - else - { - // 2 entrance towers towers at base of tower - for (int i = 0; i < 4; i += 2) { - - int[] dest = getValidOpening(rand, i); - - // move opening to tower base - dest[1] = 1; - - int childHeight = validateChildHeight(10 + rand.nextInt(5), 9); - - makeEntranceTower(list, rand, 5, dest[0], dest[1], dest[2], 9, childHeight, i); - } - } - - // actually make main tower - if (mainDir > -1) - { - int[] dest = getValidOpening(rand, mainDir); - makeNewLargeTower(list, rand, this.getComponentType() + 1, dest[0], dest[1], dest[2], mainDir); - } - - // add a roof? - makeARoof(parent, list, rand); - - // flag certain towers for keys - if (!this.placedKeys && this.getComponentType() < 2) - { - // count how many size 9 towers we have hanging off us - ArrayList possibleKeyTowers = new ArrayList(); - - int smallTowers = 0; - - for (Object piece : list) - { - if (piece instanceof ComponentTFDarkTowerWing) - { - ComponentTFDarkTowerWing wing = (ComponentTFDarkTowerWing) piece; - - if (wing.size == 9 && wing.getComponentType() == this.getComponentType()) - { - //System.out.println("I found one of my small towers! Its type is " + wing.getComponentType() + " and mine is " + this.getComponentType()); - - smallTowers++; - - possibleKeyTowers.add(wing); - } - } - } - - //System.out.println("I found " + smallTowers + " of my small towers total, with index " + this.getComponentType() + " ."); - - for (int i = 0; i < 4; i++) - { - if (possibleKeyTowers.size() < 1) - { - FMLLog.warning("[TwilightForest] Dark forest tower could not find four small towers to place keys in."); - break; - } - - int towerNum = rand.nextInt(possibleKeyTowers.size()); - - possibleKeyTowers.get(towerNum).setKeyTower(true); - possibleKeyTowers.remove(towerNum); - } - - this.placedKeys = true; - } - - } - - /** - * Make a bridge that leads to an entrance tower - */ - private boolean makeEntranceTower(List list, Random rand, int index, int x, int y, int z, int childSize, int childHeight, int rotation) - { - int direction = (getCoordBaseMode() + rotation) % 4; - int[] dx = offsetTowerCoords(x, y, z, 5, direction); - - ComponentTFDarkTowerBridge bridge = new ComponentTFDarkTowerEntranceBridge(index, dx[0], dx[1], dx[2], childSize, childHeight, direction); - // if I'm doing this right, the main towers can't intersect - list.add(bridge); - bridge.buildComponent(this, list, rand); - addOpening(x, y, z, rotation); - return true; - } - - /** - * Make a bridge that leads to a new large-size tower - */ - private boolean makeNewLargeTower(List list, Random rand, int index, int x, int y, int z, int rotation) { - - int wingSize = 15; - int wingHeight = 56; - - int direction = (getCoordBaseMode() + rotation) % 4; - int[] dx = offsetTowerCoords(x, y, z, 5, direction); - - ComponentTFDarkTowerMainBridge bridge = new ComponentTFDarkTowerMainBridge(index, dx[0], dx[1], dx[2], wingSize, wingHeight, direction); - // if I'm doing this right, the main towers can't intersect - list.add(bridge); - bridge.buildComponent(this, list, rand); - // lock the door! - addOpening(x, y, z, rotation, EnumDarkTowerDoor.LOCKED); - return true; - } - - /** - * Make a bridge that leads to a boss trap tower - */ - private boolean makeBossTrapWing(List list, Random rand, int index, int x, int y, int z, int rotation) { - - int wingSize = 11; - int wingHeight = 9; - - int direction = (getCoordBaseMode() + rotation) % 4; - int[] dx = offsetTowerCoords(x, y, z, 5, direction); - - ComponentTFDarkTowerBossBridge bridge = new ComponentTFDarkTowerBossBridge(index, dx[0], dx[1], dx[2], wingSize, wingHeight, direction); - // if I'm doing this right, the main towers can't intersect - list.add(bridge); - bridge.buildComponent(this, list, rand); - // lock the door! - addOpening(x, y, z, rotation); - return true; - } - - /** - * Attach a roof to this tower. - */ - @Override - public void makeARoof(StructureComponent parent, List list, Random rand) - { - if (this.getComponentType() < 2) - { - super.makeARoof(parent, list, rand); - } - } - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - Random decoRNG = new Random(world.getSeed() + (this.boundingBox.minX * 321534781) ^ (this.boundingBox.minZ * 756839)); - - // make walls - makeEncasedWalls(world, rand, sbb, 0, 0, 0, size - 1, height - 1, size - 1); - - // clear inside - fillWithAir(world, sbb, 1, 1, 1, size - 2, height - 2, size - 2); - - if (this.getComponentType() == 0) - { - // deco to ground - for (int x = 0; x < this.size; x++) - { - for (int z = 0; z < this.size; z++) - { - this.func_151554_b(world, deco.accentID, deco.accentMeta, x, -1, z, sbb); - } - } - } - - // nullify sky light - this.nullifySkyLightForBoundingBox(world); - - // how many total floors do we have? - int totalFloors = this.height / 5; - - // is the tower a beam maze? false = builder platforms - boolean beamMaze = decoRNG.nextBoolean(); - - // how many floors should the center occupy? - int centerFloors = beamMaze ? 4 : totalFloors / 2; - - // how many floors do we get on the top/bottom portion? - int bottomFloors = (totalFloors - centerFloors) / 2; - - // readjust center floors if we have leftover floors - centerFloors = totalFloors - (bottomFloors * 2); - - // where do the top floors start? - int topFloorsStartY = height - (bottomFloors * 5 + 1); - - // add bottom and top floors - addThreeQuarterFloors(world, decoRNG, sbb, 0, bottomFloors * 5); - if (this.getComponentType() < 2) - { - addThreeQuarterFloors(world, decoRNG, sbb, topFloorsStartY, height - 1); - } - else - { - addThreeQuarterFloorsDecorateBoss(world, decoRNG, sbb, topFloorsStartY, height - 1); - // boss destruction - - destroyTower(world, decoRNG, 12, height + 4, 3, 4, sbb); - destroyTower(world, decoRNG, 3, height + 4, 12, 4, sbb); - destroyTower(world, decoRNG, 3, height + 4, 3, 4, sbb); - destroyTower(world, decoRNG, 12, height + 4, 12, 4, sbb); - destroyTower(world, decoRNG, 8, height + 4, 8, 5, sbb); - - // make spawner where it will hopefully last - decorateBossSpawner(world, decoRNG, sbb, 0, height - 6); - - } - - if (beamMaze) - { - addTimberMaze(world, decoRNG, sbb, (bottomFloors * 5), topFloorsStartY); - } - else - { - addBuilderPlatforms(world, decoRNG, sbb, (bottomFloors * 5), topFloorsStartY); - } - - // openings - makeOpenings(world, sbb); - - - return true; - } - - - /** - * Add a bunch of 3/4 floors - */ - protected void addThreeQuarterFloors(World world, Random decoRNG, StructureBoundingBox sbb, int bottom, int top) { - - int spacing = 5; - int rotation = (this.boundingBox.minY + bottom) % 4; - if (bottom == 0) - { - makeLargeStairsUp(world, sbb, rotation, 0); - rotation += 3; - rotation %= 4; - makeBottomEntrance(world, decoRNG, sbb, rotation, bottom); - bottom += spacing; - } - - // fill with 3/4 floors - for (int y = bottom; y < top; y += spacing) - { - boolean isBottomFloor = (y == bottom && bottom != spacing); - boolean isTopFloor = (y >= top - spacing); - boolean isTowerTopFloor = (y >= height - spacing - 2); - - makeThreeQuarterFloor(world, sbb, rotation, y, isBottomFloor, isTowerTopFloor); - - if (!isTopFloor) - { - makeLargeStairsUp(world, sbb, rotation, y); - } - - if (!isTopFloor || isTowerTopFloor) - { - decorateFloor(world, decoRNG, sbb, rotation, y, isBottomFloor, isTopFloor); - } - - rotation += 3; - rotation %= 4; - - } - } - - /** - * Add a bunch of 3/4 floors - */ - protected void addThreeQuarterFloorsDecorateBoss(World world, Random decoRNG, StructureBoundingBox sbb, int bottom, int top) { - - int spacing = 5; - int rotation = (this.boundingBox.minY + bottom) % 4; - if (bottom == 0) - { - makeLargeStairsUp(world, sbb, rotation, 0); - rotation += 3; - rotation %= 4; - bottom += spacing; - } - - // fill with 3/4 floors - for (int y = bottom; y < top; y += spacing) - { - boolean isBottomFloor = (y == bottom && bottom != spacing); - boolean isTopFloor = (y >= top - spacing); - boolean isTowerTopFloor = (y >= height - spacing - 2); - - makeThreeQuarterFloor(world, sbb, rotation, y, isBottomFloor, isTowerTopFloor); - - if (!isTopFloor) - { - makeLargeStairsUp(world, sbb, rotation, y); - decorateExperiment(world, decoRNG, sbb, rotation, y); - - } - - rotation += 3; - rotation %= 4; - - } - } - - - private void decorateFloor(World world, Random decoRNG, StructureBoundingBox sbb, int rotation, int y, boolean isBottom, boolean isTop) { - // pick an appropriate decoration and use it - - if (isTop) - { - // there are a limited amount that can go at the top - switch (decoRNG.nextInt(3)) - { - default: - case 0: - decorateAquarium(world, decoRNG, sbb, rotation, y); - break; - case 1: - decorateBotanical(world, decoRNG, sbb, rotation, y); - break; - case 2: - decorateNetherwart(world, decoRNG, sbb, rotation, y, isTop); - break; - } - } - else if (isBottom) - { - // similarly some don't work on the bottom - switch (decoRNG.nextInt(4)) - { - default: - case 0: - decorateAquarium(world, decoRNG, sbb, rotation, y); - break; - case 1: - decorateBotanical(world, decoRNG, sbb, rotation, y); - break; - case 2: - if (y + this.boundingBox.minY > 64) - { - decorateNetherwart(world, decoRNG, sbb, rotation, y, isTop); - break; - } - case 3: - decorateForge(world, decoRNG, sbb, rotation, y); - break; - } - } - else - { - // but in the middle, anything goes - switch (decoRNG.nextInt(8)) - { - default: - case 0: - case 1: - decorateReappearingMaze(world, decoRNG, sbb, rotation, y); - break; - case 2: - decorateUnbuilderMaze(world, decoRNG, sbb, rotation, y); - break; - case 3: - decorateAquarium(world, decoRNG, sbb, rotation, y); - break; - case 4: - decorateBotanical(world, decoRNG, sbb, rotation, y); - break; - case 5: - if (y + this.boundingBox.minY > 64) - { - decorateNetherwart(world, decoRNG, sbb, rotation, y, isTop); - break; - } - case 6: - decorateLounge(world, decoRNG, sbb, rotation, y); - break; - case 7: - decorateForge(world, decoRNG, sbb, rotation, y); - break; - } - } - } - - - /** - * Make a single three quarter floor - * @param isTowerTopFloor - */ - protected void makeThreeQuarterFloor(World world, StructureBoundingBox sbb, int rotation, int y, boolean isBottom, boolean isTowerTopFloor) { - int half = size / 2; - // fill the floor - this.fillBlocksRotated(world, sbb, half + 1, y, 1, size - 2, y, half + 1, deco.blockID, deco.blockMeta, rotation); - this.fillBlocksRotated(world, sbb, 1, y, half + 1, size - 2, y, size - 2, deco.blockID, deco.blockMeta, rotation); - - // don't make part of the fence if we have stairs coming up - int startZ = isBottom ? 1 : 3; - - this.fillBlocksRotated(world, sbb, 1, y, half, half, y, half, deco.accentID, deco.accentMeta, rotation); - this.fillBlocksRotated(world, sbb, half, y, startZ, half, y, half, deco.accentID, deco.accentMeta, rotation); - this.fillBlocksRotated(world, sbb, 1, y + 1, half, half, y + 1, half, deco.fenceID, deco.fenceMeta, rotation); - this.fillBlocksRotated(world, sbb, half, y + 1, startZ, half, y + 1, half, deco.fenceID, deco.fenceMeta, rotation); - - // little notch if we're at the tower top - if (isTowerTopFloor) - { - this.fillBlocksRotated(world, sbb, 1, y + 0, half - 2, 3, y + 0, half, deco.accentID, deco.accentMeta, rotation); - this.fillBlocksRotated(world, sbb, 1, y + 1, half - 2, 3, y + 1, half, deco.fenceID, deco.fenceMeta, rotation); - this.fillBlocksRotated(world, sbb, 1, y + 0, half - 1, 2, y + 0, half, deco.blockID, deco.blockMeta, rotation); - this.fillBlocksRotated(world, sbb, 1, y + 1, half - 1, 2, y + 1, half, Blocks.air, 0, rotation); - } - - } - -// protected void makeLargeStairsDown(World world, StructureBoundingBox sbb, int rotation, int y) { -// // stairs! -// this.fillAirRotated(world, sbb, size / 2, y, 1, size / 2, y + 1, 2, rotation); -// -// for (int i = 0; i < 5; i++) -// { -// placeBlockRotated(world, deco.stairID, getStairMeta(0 + rotation), size / 2 - i, y - i, 1, rotation, sbb); -// placeBlockRotated(world, deco.stairID, getStairMeta(0 + rotation), size / 2 - i, y - i, 2, rotation, sbb); -// placeBlockRotated(world, deco.blockID, deco.blockMeta, size / 2 - i + 1, y - i, 1, rotation, sbb); -// placeBlockRotated(world, deco.blockID, deco.blockMeta, size / 2 - i + 1, y - i, 2, rotation, sbb); -// placeBlockRotated(world, deco.blockID, deco.blockMeta, size / 2 - i + 1, y - i, 3, rotation, sbb); -// -// if (i > 0 && i < 4) -// { -// placeBlockRotated(world, deco.accentID, deco.accentMeta, size / 2 - i, y - i, 3, rotation, sbb); -// placeBlockRotated(world, deco.fenceID, deco.fenceMeta, size / 2 - i, y - i + 1, 3, rotation, sbb); -// placeBlockRotated(world, deco.fenceID, deco.fenceMeta, size / 2 - i, y - i + 2, 3, rotation, sbb); -// } -// else if (i == 4) -// { -// placeBlockRotated(world, deco.stairID, getStairMeta(3 + rotation), size / 2 - i, y - i, 3, rotation, sbb); -// } -// } -// } - - protected void makeLargeStairsUp(World world, StructureBoundingBox sbb, int rotation, int y) { - // stairs! - //this.fillAirRotated(world, sbb, x, y, 1, x, y + 1, 2, rotation); - - for (int i = 0; i < 5; i++) - { - int z = size / 2 - i + 4; - int sy = y + i + 1; - - placeBlockRotated(world, deco.stairID, getStairMeta(3 + rotation), 1, sy, z, rotation, sbb); - placeBlockRotated(world, deco.stairID, getStairMeta(3 + rotation), 2, sy, z, rotation, sbb); - placeBlockRotated(world, deco.blockID, deco.blockMeta, 1, sy, z - 1, rotation, sbb); - placeBlockRotated(world, deco.blockID, deco.blockMeta, 2, sy, z - 1, rotation, sbb); - placeBlockRotated(world, deco.blockID, deco.blockMeta, 3, sy, z - 1, rotation, sbb); - - if (i > 0 && i < 4) - { - placeBlockRotated(world, deco.accentID, deco.accentMeta, 3, sy, z, rotation, sbb); - placeBlockRotated(world, deco.fenceID, deco.fenceMeta, 3, sy + 1, z, rotation, sbb); - placeBlockRotated(world, deco.fenceID, deco.fenceMeta, 3, sy + 2, z, rotation, sbb); - } - else if (i == 0) - { - placeBlockRotated(world, deco.stairID, getStairMeta(2 + rotation), 3, sy, z, rotation, sbb); - } - } - } - - - private void decorateReappearingMaze(World world, Random decoRNG, StructureBoundingBox sbb, int rotation, int y) { - // make maze object - int mazeSize = 6; - TFMaze maze = new TFMaze(mazeSize, mazeSize); - - // set the seed to a fixed value based on this maze's x and z - maze.setSeed(world.getSeed() + this.boundingBox.minX * 90342903 + y * 90342903 ^ this.boundingBox.minZ); - - // tell it not to make outside walls by making them "ROOMS" - for (int i = 0; i < 13; i++) - { - maze.putRaw(i, 0, TFMaze.ROOM); - maze.putRaw(i, 12, TFMaze.ROOM); - maze.putRaw(0, i, TFMaze.ROOM); - maze.putRaw(12, i, TFMaze.ROOM); - } - - // we need to set this before generation - maze.doorRarity = 0.3F; - - // set some areas out of bounds and make the maze depending on where we start - switch (rotation) - { - case 0: - for (int x = 1; x < 6; x++) - { - for (int z = 1; z < 6; z++) - { - maze.putRaw(x, z, TFMaze.ROOM); - } - } - maze.putRaw(1, 6, TFMaze.ROOM); - maze.putRaw(1, 7, TFMaze.ROOM); - maze.putRaw(1, 8, TFMaze.ROOM); - maze.putRaw(1, 9, TFMaze.ROOM); - maze.putRaw(1, 10, TFMaze.DOOR); - maze.putRaw(6, 1, TFMaze.ROOM); - maze.putRaw(7, 1, TFMaze.ROOM); - maze.putRaw(8, 1, TFMaze.DOOR); - maze.generateRecursiveBacktracker(0, 5); - break; - case 1: - for (int x = 7; x < 12; x++) - { - for (int z = 1; z < 6; z++) - { - maze.putRaw(x, z, TFMaze.ROOM); - } - } - maze.putRaw(6, 1, TFMaze.ROOM); - maze.putRaw(5, 1, TFMaze.ROOM); - maze.putRaw(4, 1, TFMaze.ROOM); - maze.putRaw(3, 1, TFMaze.ROOM); - maze.putRaw(2, 1, TFMaze.DOOR); - maze.putRaw(11, 6, TFMaze.ROOM); - maze.putRaw(11, 7, TFMaze.ROOM); - maze.putRaw(11, 8, TFMaze.DOOR); - maze.generateRecursiveBacktracker(0, 0); - break; - case 2: - for (int x = 7; x < 12; x++) - { - for (int z = 7; z < 12; z++) - { - maze.putRaw(x, z, TFMaze.ROOM); - } - } - maze.putRaw(11, 6, TFMaze.ROOM); - maze.putRaw(11, 5, TFMaze.ROOM); - maze.putRaw(11, 4, TFMaze.ROOM); - maze.putRaw(11, 3, TFMaze.ROOM); - maze.putRaw(11, 2, TFMaze.DOOR); - maze.putRaw(6, 11, TFMaze.ROOM); - maze.putRaw(5, 11, TFMaze.ROOM); - maze.putRaw(4, 11, TFMaze.DOOR); - maze.generateRecursiveBacktracker(5, 0); - break; - case 3: - for (int x = 1; x < 6; x++) - { - for (int z = 7; z < 12; z++) - { - maze.putRaw(x, z, TFMaze.ROOM); - } - } - maze.putRaw(6, 11, TFMaze.ROOM); - maze.putRaw(7, 11, TFMaze.ROOM); - maze.putRaw(8, 11, TFMaze.ROOM); - maze.putRaw(9, 11, TFMaze.ROOM); - maze.putRaw(10, 11, TFMaze.DOOR); - maze.putRaw(1, 6, TFMaze.ROOM); - maze.putRaw(1, 5, TFMaze.ROOM); - maze.putRaw(1, 4, TFMaze.DOOR); - maze.generateRecursiveBacktracker(5, 5); - break; - } - - - // copy the maze to us! - maze.wallBlockID = deco.blockID; - maze.wallBlockMeta = deco.blockMeta; - maze.headBlockID = deco.accentID; - maze.headBlockMeta = deco.accentMeta; - maze.pillarBlockID = deco.accentID; - maze.pillarBlockMeta = deco.accentMeta; - maze.doorBlockID = TFBlocks.towerDevice; - maze.doorBlockMeta = BlockTFTowerDevice.META_REAPPEARING_INACTIVE; - - maze.torchRarity = 0; - maze.tall = 3; - maze.head = 1; - maze.oddBias = 2; - - maze.copyToStructure(world, 0, y + 1, 0, this, sbb); - - decorateMazeDeadEnds(world, decoRNG, maze, y, rotation, sbb); - - } - - /** - * Find dead ends and put something there - */ - protected void decorateMazeDeadEnds(World world, Random decoRNG, TFMaze maze, int y, int rotation, StructureBoundingBox sbb) - { - for(int x = 0; x < maze.width; x++) - { - for (int z = 0; z < maze.depth; z++) - { - // dead ends - if (!maze.isWall(x, z, x - 1, z) && maze.isWall(x, z, x + 1, z) && maze.isWall(x, z, x, z - 1) && maze.isWall(x, z, x, z + 1)) { - decorateDeadEnd(world, decoRNG, maze, x, y, z, 3, rotation, sbb); - } - if (maze.isWall(x, z, x - 1, z) && !maze.isWall(x, z, x + 1, z) && maze.isWall(x, z, x, z - 1) && maze.isWall(x, z, x, z + 1)) { - decorateDeadEnd(world, decoRNG, maze, x, y, z, 1, rotation, sbb); - } - if (maze.isWall(x, z, x - 1, z) && maze.isWall(x, z, x + 1, z) && !maze.isWall(x, z, x, z - 1) && maze.isWall(x, z, x, z + 1)) { - decorateDeadEnd(world, decoRNG, maze, x, y, z, 0, rotation, sbb); - } - if (maze.isWall(x, z, x - 1, z) && maze.isWall(x, z, x + 1, z) && maze.isWall(x, z, x, z - 1) && !maze.isWall(x, z, x, z + 1)) { - decorateDeadEnd(world, decoRNG, maze, x, y, z, 2, rotation, sbb); - } - } - } - } - - /** - * Decorate a specific maze dead end - */ - private void decorateDeadEnd(World world, Random decoRNG, TFMaze maze, int mx, int y, int mz, int facing, int rotation, StructureBoundingBox sbb) { - int x = mx * 3 + 1; - int z = mz * 3 + 1; - - switch (facing) - { - case 0: - placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, x + 0, y + 1, z + 1, sbb); - placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, x + 1, y + 1, z + 1, sbb); - placeBlockAtCurrentPosition(world, Blocks.chest, 0, x + 0, y + 2, z + 1, sbb); - this.placeTreasureAtCurrentPosition(world, decoRNG, x + 1, y + 2, z + 1, TFTreasure.darktower_cache, sbb); - break; - case 1: - placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, x + 0, y + 1, z + 0, sbb); - placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, x + 0, y + 1, z + 1, sbb); - placeBlockAtCurrentPosition(world, Blocks.chest, rotation, x + 0, y + 2, z + 0, sbb); - this.placeTreasureAtCurrentPosition(world, decoRNG, x + 0, y + 2, z + 1, TFTreasure.darktower_cache, sbb); - break; - case 2: - placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, x + 0, y + 1, z + 0, sbb); - placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, x + 1, y + 1, z + 0, sbb); - placeBlockAtCurrentPosition(world, Blocks.chest, rotation, x + 0, y + 2, z + 0, sbb); - this.placeTreasureAtCurrentPosition(world, decoRNG, x + 1, y + 2, z + 0, TFTreasure.darktower_cache, sbb); - break; - case 3: - placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, x + 1, y + 1, z + 0, sbb); - placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, x + 1, y + 1, z + 1, sbb); - placeBlockAtCurrentPosition(world, Blocks.chest, rotation, x + 1, y + 2, z + 0, sbb); - this.placeTreasureAtCurrentPosition(world, decoRNG, x + 1, y + 2, z + 1, TFTreasure.darktower_cache, sbb); - break; - } - - } - - - private void decorateUnbuilderMaze(World world, Random decoRNG, StructureBoundingBox sbb, int rotation, int y) { - - // fill in posts - for (int x = size / 2; x < size - 1; x++) - { - for (int z = 3; z < size - 1; z++) - { - if (x % 2 == 1 && z % 2 == 1) - { - for (int py = 1; py < 5; py++) - { - placeBlockRotated(world, deco.pillarID, deco.pillarMeta, x, y + py, z, rotation, sbb); - } - } - else if (x % 2 == 1 || z % 2 == 1) - { - for (int py = 1; py < 5; py++) - { - placeBlockRotated(world, deco.fenceID, deco.fenceMeta, x, y + py, z, rotation, sbb); - } - - if (x != size / 2 && x != size - 2 && z != size - 2) - { - int ay = decoRNG.nextInt(4) + 1; - placeBlockRotated(world, Blocks.air, 0, x, y + ay, z, rotation, sbb); - - if (x > size - 7) - { - ay = decoRNG.nextInt(3) + 1; - placeBlockRotated(world, Blocks.air, 0, x, y + ay, z, rotation, sbb); - } - } - } - } - } - - // place unbuilders - placeBlockRotated(world, TFBlocks.towerDevice, BlockTFTowerDevice.META_ANTIBUILDER, 15, y + 2, 7, rotation, sbb); - placeBlockRotated(world, TFBlocks.towerDevice, BlockTFTowerDevice.META_ANTIBUILDER, 11, y + 3, 7, rotation, sbb); - placeBlockRotated(world, TFBlocks.towerDevice, BlockTFTowerDevice.META_ANTIBUILDER, 15, y + 2, 13, rotation, sbb); - placeBlockRotated(world, TFBlocks.towerDevice, BlockTFTowerDevice.META_ANTIBUILDER, 11, y + 3, 13, rotation, sbb); - placeBlockRotated(world, TFBlocks.towerDevice, BlockTFTowerDevice.META_ANTIBUILDER, 5, y + 3, 13, rotation, sbb); - } - - private void decorateLounge(World world, Random decoRNG, StructureBoundingBox sbb, int rotation, int y) { - // brewing area in corner - walls - this.fillBlocksRotated(world, sbb, 17, y + 1, 1, 17, y + 4, 6, deco.pillarID, deco.pillarMeta, rotation); - this.fillBlocksRotated(world, sbb, 12, y + 1, 1, 17, y + 4, 1, deco.pillarID, deco.pillarMeta, rotation); - - // floors - this.fillBlocksRotated(world, sbb, 13, y + 1, 2, 16, y + 1, 5, deco.blockID, deco.blockMeta, rotation); - this.fillBlocksRotated(world, sbb, 12, y + 1, 2, 12, y + 1, 6, deco.stairID, getStairMeta(0 + rotation), rotation); - this.fillBlocksRotated(world, sbb, 12, y + 1, 6, 16, y + 1, 6, deco.stairID, getStairMeta(3 + rotation), rotation); - - // furnaces - this.makeDispenserPillar(world, deco, 13, y, 1, getStairMeta(3 + rotation), rotation, sbb); - this.makeDispenserPillar(world, deco, 15, y, 1, getStairMeta(3 + rotation), rotation, sbb); - this.makeDispenserPillar(world, deco, 17, y, 3, getStairMeta(0 + rotation), rotation, sbb); - this.makeDispenserPillar(world, deco, 17, y, 5, getStairMeta(0 + rotation), rotation, sbb); - - // framing pillars - this.makeStonePillar(world, deco, 12, y, 1, getStairMeta(3 + rotation), rotation, sbb); - this.makeStonePillar(world, deco, 17, y, 6, getStairMeta(0 + rotation), rotation, sbb); - - // cauldron and brewing stand - this.placeBlockRotated(world, Blocks.brewing_stand, 0, 13, y + 2, 5, rotation, sbb); - this.placeBlockRotated(world, Blocks.cauldron, 3, 15, y + 2, 3, rotation, sbb); - - // bookshelves in corner - this.fillBlocksRotated(world, sbb, 10, y + 1, 17, 17, y + 4, 17, deco.blockID, deco.blockMeta, rotation); - this.fillBlocksRotated(world, sbb, 17, y + 1, 10, 17, y + 4, 17, deco.blockID, deco.blockMeta, rotation); - - this.fillBlocksRotated(world, sbb, 11, y + 1, 17, 12, y + 4, 17, Blocks.bookshelf, 0, rotation); - this.fillBlocksRotated(world, sbb, 14, y + 1, 17, 15, y + 4, 17, Blocks.bookshelf, 0, rotation); - this.fillBlocksRotated(world, sbb, 17, y + 1, 11, 17, y + 4, 12, Blocks.bookshelf, 0, rotation); - this.fillBlocksRotated(world, sbb, 17, y + 1, 14, 17, y + 4, 15, Blocks.bookshelf, 0, rotation); - - // table - this.placeBlockRotated(world, deco.stairID, getStairMeta(0 + rotation) + 4, 13, y + 1, 14, rotation, sbb); - this.placeBlockRotated(world, deco.stairID, getStairMeta(3 + rotation) + 4, 14, y + 1, 14, rotation, sbb); - this.placeBlockRotated(world, deco.stairID, getStairMeta(2 + rotation) + 4, 14, y + 1, 13, rotation, sbb); - this.placeBlockRotated(world, deco.stairID, getStairMeta(1 + rotation) + 4, 13, y + 1, 13, rotation, sbb); - - // chair 1 - this.placeBlockRotated(world, deco.stairID, getStairMeta(2 + rotation), 11, y + 1, 13, rotation, sbb); - - // chair 2 - this.placeBlockRotated(world, deco.stairID, getStairMeta(3 + rotation), 13, y + 1, 11, rotation, sbb); - - // center lamp - placeBlockRotated(world, Blocks.redstone_lamp, 0, 8, y + 3, 8, rotation, sbb); - placeBlockRotated(world, Blocks.lever, decoRNG.nextBoolean() ? 0 : 7, 8, y + 2, 8, rotation, sbb); - - // planter for trees - placeTreePlanter(world, decoRNG.nextInt(5), 6, y + 1, 12, rotation, sbb); - - } - - private void makeDispenserPillar(World world, StructureTFDecorator forgeDeco, int x, int y, int z, int stairMeta, int rotation, StructureBoundingBox sbb) { - this.placeBlockRotated(world, forgeDeco.stairID, stairMeta + 4, x, y + 2, z, rotation, sbb); - this.placeBlockRotated(world, Blocks.dispenser, stairMeta + 4, x, y + 3, z, rotation, sbb); - this.placeBlockRotated(world, forgeDeco.stairID, stairMeta, x, y + 4, z, rotation, sbb); - } - - - private void decorateBossSpawner(World world, Random rand, StructureBoundingBox sbb, int rotation, int y) { - this.placeBlockRotated(world, TFBlocks.bossSpawner, 3, 9, y + 4, 9, rotation, sbb); - } - - - private void decorateExperiment(World world, Random decoRNG, StructureBoundingBox sbb, int rotation, int y) { - // crafting area in corner - walls - this.fillBlocksRotated(world, sbb, 17, y + 1, 1, 17, y + 4, 6, deco.pillarID, deco.pillarMeta, rotation); - this.fillBlocksRotated(world, sbb, 12, y + 1, 1, 17, y + 4, 1, deco.pillarID, deco.pillarMeta, rotation); - - // floors - this.fillBlocksRotated(world, sbb, 13, y + 1, 2, 16, y + 1, 5, deco.blockID, deco.blockMeta, rotation); - this.fillBlocksRotated(world, sbb, 12, y + 1, 2, 12, y + 1, 6, deco.stairID, getStairMeta(0 + rotation), rotation); - this.fillBlocksRotated(world, sbb, 12, y + 1, 6, 16, y + 1, 6, deco.stairID, getStairMeta(3 + rotation), rotation); - - this.makeWoodPillar(world, deco, 13, y, 1, getStairMeta(3 + rotation), rotation, sbb); - this.makeWoodPillar(world, deco, 15, y, 1, getStairMeta(3 + rotation), rotation, sbb); - this.makeWoodPillar(world, deco, 17, y, 3, getStairMeta(0 + rotation), rotation, sbb); - this.makeWoodPillar(world, deco, 17, y, 5, getStairMeta(0 + rotation), rotation, sbb); - - // framing pillars - this.makeStonePillar(world, deco, 12, y, 1, getStairMeta(3 + rotation), rotation, sbb); - this.makeStonePillar(world, deco, 17, y, 6, getStairMeta(0 + rotation), rotation, sbb); - - // workbench - placeBlockRotated(world, Blocks.crafting_table, 0, 14, y + 2, 4, rotation, sbb); - - // recipes in frames? - placeItemFrameRotated(world, 13, y + 2, 1, rotation, 0, new ItemStack(TFItems.borerEssence), sbb); - placeItemFrameRotated(world, 14, y + 2, 1, rotation, 0, new ItemStack(Items.redstone), sbb); - placeItemFrameRotated(world, 15, y + 2, 1, rotation, 0, new ItemStack(TFItems.borerEssence), sbb); - placeItemFrameRotated(world, 13, y + 3, 1, rotation, 0, new ItemStack(Items.redstone), sbb); - placeItemFrameRotated(world, 14, y + 3, 1, rotation, 0, new ItemStack(Items.ghast_tear), sbb); - placeItemFrameRotated(world, 15, y + 3, 1, rotation, 0, new ItemStack(Items.redstone), sbb); - placeItemFrameRotated(world, 13, y + 4, 1, rotation, 0, new ItemStack(TFItems.borerEssence), sbb); - placeItemFrameRotated(world, 14, y + 4, 1, rotation, 0, new ItemStack(Items.redstone), sbb); - placeItemFrameRotated(world, 15, y + 4, 1, rotation, 0, new ItemStack(TFItems.borerEssence), sbb); - - placeItemFrameRotated(world, 17, y + 2, 3, rotation, 1, new ItemStack(TFBlocks.towerWood, 1, 1), sbb); - placeItemFrameRotated(world, 17, y + 2, 4, rotation, 1, new ItemStack(TFBlocks.towerWood, 1, 0), sbb); - placeItemFrameRotated(world, 17, y + 2, 5, rotation, 1, new ItemStack(TFBlocks.towerWood, 1, 1), sbb); - placeItemFrameRotated(world, 17, y + 3, 3, rotation, 1, new ItemStack(TFBlocks.towerWood, 1, 0), sbb); - placeItemFrameRotated(world, 17, y + 3, 4, rotation, 1, new ItemStack(TFItems.carminite), sbb); - placeItemFrameRotated(world, 17, y + 3, 5, rotation, 1, new ItemStack(TFBlocks.towerWood, 1, 0), sbb); - placeItemFrameRotated(world, 17, y + 4, 3, rotation, 1, new ItemStack(TFBlocks.towerWood, 1, 1), sbb); - placeItemFrameRotated(world, 17, y + 4, 4, rotation, 1, new ItemStack(TFBlocks.towerWood, 1, 0), sbb); - placeItemFrameRotated(world, 17, y + 4, 5, rotation, 1, new ItemStack(TFBlocks.towerWood, 1, 1), sbb); - - if (y < this.height - 13) - { - // device bottom - placeBlockRotated(world, Blocks.obsidian, 0, 13, y + 1, 13, rotation, sbb); - placeBlockRotated(world, Blocks.obsidian, 0, 15, y + 1, 13, rotation, sbb); - placeBlockRotated(world, Blocks.obsidian, 0, 13, y + 1, 15, rotation, sbb); - placeBlockRotated(world, Blocks.obsidian, 0, 15, y + 1, 15, rotation, sbb); - placeBlockRotated(world, Blocks.netherrack, 0, 13, y + 1, 14, rotation, sbb); - placeBlockRotated(world, Blocks.netherrack, 0, 14, y + 1, 13, rotation, sbb); - placeBlockRotated(world, Blocks.netherrack, 0, 15, y + 1, 14, rotation, sbb); - placeBlockRotated(world, Blocks.netherrack, 0, 14, y + 1, 15, rotation, sbb); - placeBlockRotated(world, Blocks.redstone_block, 0, 14, y + 1, 14, rotation, sbb); - - // middle - placeBlockRotated(world, Blocks.netherrack, 0, 13, y + 2, 13, rotation, sbb); - placeBlockRotated(world, Blocks.netherrack, 0, 15, y + 2, 13, rotation, sbb); - placeBlockRotated(world, Blocks.netherrack, 0, 13, y + 2, 15, rotation, sbb); - placeBlockRotated(world, Blocks.netherrack, 0, 15, y + 2, 15, rotation, sbb); - placeBlockRotated(world, TFBlocks.towerDevice, BlockTFTowerDevice.META_REACTOR_INACTIVE, 14, y + 2, 14, rotation, sbb); - - //device top - placeBlockRotated(world, Blocks.obsidian, 0, 13, y + 3, 13, rotation, sbb); - placeBlockRotated(world, Blocks.obsidian, 0, 15, y + 3, 13, rotation, sbb); - placeBlockRotated(world, Blocks.obsidian, 0, 13, y + 3, 15, rotation, sbb); - placeBlockRotated(world, Blocks.obsidian, 0, 15, y + 3, 15, rotation, sbb); - placeBlockRotated(world, Blocks.netherrack, 0, 13, y + 3, 14, rotation, sbb); - placeBlockRotated(world, Blocks.netherrack, 0, 14, y + 3, 13, rotation, sbb); - placeBlockRotated(world, Blocks.netherrack, 0, 15, y + 3, 14, rotation, sbb); - placeBlockRotated(world, Blocks.netherrack, 0, 14, y + 3, 15, rotation, sbb); - placeBlockRotated(world, Blocks.redstone_block, 0, 14, y + 3, 14, rotation, sbb); - } - - // short piston plunger 1 - placeBlockRotated(world, deco.accentID, deco.accentMeta, 14, y + 1, 17, rotation, sbb); - placeBlockRotated(world, Blocks.lever, getLeverMeta(rotation, 4), 13, y + 1, 17, rotation, sbb); - placeBlockRotated(world, Blocks.piston, 5 - getStairMeta(3 + rotation), 14, y + 2, 17, rotation, sbb); - placeBlockRotated(world, Blocks.redstone_block, 0, 14, y + 2, 16, rotation, sbb); - - // short piston plunger 2 - placeBlockRotated(world, deco.accentID, deco.accentMeta, 17, y + 1, 14, rotation, sbb); - placeBlockRotated(world, Blocks.lever, getLeverMeta(rotation, 2), 17, y + 1, 13, rotation, sbb); - placeBlockRotated(world, Blocks.piston, 5 - getStairMeta(2 + rotation), 17, y + 2, 14, rotation, sbb); - placeBlockRotated(world, Blocks.redstone_block, 0, 16, y + 2, 14, rotation, sbb); - - // long piston plunger 1 - placeBlockRotated(world, Blocks.redstone_block, 0, 14, y + 2, 11, rotation, sbb); - placeBlockRotated(world, deco.accentID, deco.accentMeta, 14, y + 1, 11, rotation, sbb); - placeBlockRotated(world, Blocks.lever, getLeverMeta(rotation, 4) + 8, 13, y + 1, 11, rotation, sbb); - placeBlockRotated(world, Blocks.piston, 5 - getStairMeta(1 + rotation), 14, y + 2, 10, rotation, sbb); - placeBlockRotated(world, deco.accentID, deco.accentMeta, 14, y + 1, 9, rotation, sbb); - placeBlockRotated(world, Blocks.lever, getLeverMeta(rotation, 4), 13, y + 1, 9, rotation, sbb); - placeBlockRotated(world, Blocks.sticky_piston, 5 - getStairMeta(1 + rotation), 14, y + 2, 9, rotation, sbb); - - // long piston plunger 2 - placeBlockRotated(world, Blocks.redstone_block, 0, 11, y + 2, 14, rotation, sbb); - placeBlockRotated(world, deco.accentID, deco.accentMeta, 11, y + 1, 14, rotation, sbb); - placeBlockRotated(world, Blocks.lever, getLeverMeta(rotation, 2) + 8, 11, y + 1, 13, rotation, sbb); - placeBlockRotated(world, Blocks.piston, 5 - getStairMeta(0 + rotation), 10, y + 2, 14, rotation, sbb); - placeBlockRotated(world, deco.accentID, deco.accentMeta, 9, y + 1, 14, rotation, sbb); - placeBlockRotated(world, Blocks.lever, getLeverMeta(rotation, 2), 9, y + 1, 13, rotation, sbb); - placeBlockRotated(world, Blocks.sticky_piston, 5 - getStairMeta(0 + rotation), 9, y + 2, 14, rotation, sbb); - } - - private void makeWoodPillar(World world, StructureTFDecorator forgeDeco, int x, int y, int z, int stairMeta, int rotation, StructureBoundingBox sbb) { - this.placeBlockRotated(world, TFBlocks.log, 3, x, y + 2, z, rotation, sbb); - this.placeBlockRotated(world, TFBlocks.log, 3, x, y + 3, z, rotation, sbb); - this.placeBlockRotated(world, TFBlocks.log, 3, x, y + 4, z, rotation, sbb); - } - - private void placeItemFrameRotated(World world, int x, int y, int z, int rotation, int direction, ItemStack itemStack, StructureBoundingBox sbb) { - - int dx = getXWithOffsetAsIfRotated(x, z, rotation); - int dy = getYWithOffset(y); - int dz = getZWithOffsetAsIfRotated(x, z, rotation); - if(sbb.isVecInside(dx, dy, dz)) - { - EntityItemFrame frame = new EntityItemFrame(world, dx, dy, dz, (this.getCoordBaseMode() + direction + rotation) % 4); - if (itemStack != null) - { - frame.setDisplayedItem(itemStack); - } - - // check if the frame is on a valid surface or not? The wall may not have been generated yet, on a chunk boundry - world.spawnEntityInWorld(frame); - } - } - - - private void decorateAquarium(World world, Random decoRNG, StructureBoundingBox sbb, int rotation, int y) { - // main aquarium - makePillarFrame(world, sbb, this.deco, rotation, 12, y, 3, 4, 4, 13, false); - this.fillBlocksRotated(world, sbb, 13, y + 4, 4, 14, y + 4, 14, Blocks.flowing_water, 0, rotation); - - // little one - makePillarFrame(world, sbb, this.deco, rotation, 6, y, 12, 4, 4, 4, false); - this.fillBlocksRotated(world, sbb, 6, y + 5, 12, 9, y + 5, 15, deco.accentID, deco.accentMeta, rotation); - this.fillBlocksRotated(world, sbb, 7, y + 4, 13, 8, y + 5, 14, Blocks.flowing_water, 0, rotation); - } - - private void decorateForge(World world, Random decoRNG, StructureBoundingBox sbb, int rotation, int y) { -// StructureTFDecorator forgeDeco = new StructureTFDecorator(); -// forgeDeco = Blocks.cobblestone; -// forgeDeco.pillarID = Blocks.stonebrick; -// forgeDeco.stairID = Blocks.stairCompactCobblestone; - StructureTFDecorator forgeDeco = this.deco; - - // stone walls in corner - this.fillBlocksRotated(world, sbb, 17, y + 1, 1, 17, y + 4, 6, forgeDeco.pillarID, forgeDeco.pillarMeta, rotation); - this.fillBlocksRotated(world, sbb, 12, y + 1, 1, 17, y + 4, 1, forgeDeco.pillarID, forgeDeco.pillarMeta, rotation); - - this.fillBlocksRotated(world, sbb, 12, y + 1, 17, 17, y + 4, 17, forgeDeco.pillarID, forgeDeco.pillarMeta, rotation); - this.fillBlocksRotated(world, sbb, 17, y + 1, 12, 17, y + 4, 17, forgeDeco.pillarID, forgeDeco.pillarMeta, rotation); - - // floors - this.fillBlocksRotated(world, sbb, 13, y + 1, 2, 16, y + 1, 5, forgeDeco.blockID, forgeDeco.blockMeta, rotation); - this.fillBlocksRotated(world, sbb, 12, y + 1, 2, 12, y + 1, 6, forgeDeco.stairID, getStairMeta(0 + rotation), rotation); - this.fillBlocksRotated(world, sbb, 12, y + 1, 6, 16, y + 1, 6, forgeDeco.stairID, getStairMeta(3 + rotation), rotation); - - this.fillBlocksRotated(world, sbb, 13, y + 1, 13, 16, y + 1, 16, forgeDeco.blockID, forgeDeco.blockMeta, rotation); - this.fillBlocksRotated(world, sbb, 12, y + 1, 12, 12, y + 1, 16, forgeDeco.stairID, getStairMeta(0 + rotation), rotation); - this.fillBlocksRotated(world, sbb, 12, y + 1, 12, 16, y + 1, 12, forgeDeco.stairID, getStairMeta(1 + rotation), rotation); - - // furnaces - this.makeFurnacePillar(world, forgeDeco, decoRNG, 13, y, 1, getStairMeta(3 + rotation), rotation, sbb); - this.makeFurnacePillar(world, forgeDeco, decoRNG, 15, y, 1, getStairMeta(3 + rotation), rotation, sbb); - this.makeFurnacePillar(world, forgeDeco, decoRNG, 17, y, 3, getStairMeta(0 + rotation), rotation, sbb); - this.makeFurnacePillar(world, forgeDeco, decoRNG, 17, y, 5, getStairMeta(0 + rotation), rotation, sbb); - - this.makeFurnacePillar(world, forgeDeco, decoRNG, 13, y, 17, getStairMeta(1 + rotation), rotation, sbb); - this.makeFurnacePillar(world, forgeDeco, decoRNG, 15, y, 17, getStairMeta(1 + rotation), rotation, sbb); - this.makeFurnacePillar(world, forgeDeco, decoRNG, 17, y, 13, getStairMeta(0 + rotation), rotation, sbb); - this.makeFurnacePillar(world, forgeDeco, decoRNG, 17, y, 15, getStairMeta(0 + rotation), rotation, sbb); - - // framing pillars - this.makeStonePillar(world, forgeDeco, 12, y, 1, getStairMeta(3 + rotation), rotation, sbb); - this.makeStonePillar(world, forgeDeco, 17, y, 6, getStairMeta(0 + rotation), rotation, sbb); - - this.makeStonePillar(world, forgeDeco, 12, y, 17, getStairMeta(1 + rotation), rotation, sbb); - this.makeStonePillar(world, forgeDeco, 17, y, 12, getStairMeta(0 + rotation), rotation, sbb); - - // extra pillars - this.makeStonePillar(world, forgeDeco, 17, y, 9, getStairMeta(0 + rotation), rotation, sbb); - this.makeStonePillar(world, forgeDeco, 9, y, 17, getStairMeta(1 + rotation), rotation, sbb); - - // anvils - this.placeBlockRotated(world, Blocks.anvil, decoRNG.nextInt(16), 13, y + 2, 5, rotation, sbb); - this.placeBlockRotated(world, Blocks.anvil, decoRNG.nextInt(16), 13, y + 2, 13, rotation, sbb); - - // fire pit - makeFirePit(world, forgeDeco, 6, y + 1, 12, rotation, sbb); - } - - private void makeFurnacePillar(World world, StructureTFDecorator forgeDeco, Random rand, int x, int y, int z, int stairMeta, int rotation, StructureBoundingBox sbb) { - this.placeBlockRotated(world, forgeDeco.stairID, stairMeta + 4, x, y + 2, z, rotation, sbb); - this.placeBlockRotated(world, Blocks.furnace, stairMeta + 4, x, y + 3, z, rotation, sbb); - - // randomly put some charcoal in the furnace burn slot - int amount = rand.nextBoolean() ? rand.nextInt(5) + 4 : 0; - if (amount > 0) - { - int dx = getXWithOffsetAsIfRotated(x, z, rotation); - int dy = getYWithOffset(y + 3); - int dz = getZWithOffsetAsIfRotated(x, z, rotation); - if(sbb.isVecInside(dx, dy, dz) && world.getBlock(dx, dy, dz) == Blocks.furnace) - { - // put charcoal in the oven - IInventory inv = (IInventory) world.getTileEntity(dx, dy, dz); - - inv.setInventorySlotContents(1, new ItemStack(Items.coal, amount, 1)); - } - } - - this.placeBlockRotated(world, forgeDeco.stairID, stairMeta, x, y + 4, z, rotation, sbb); - } - - - private void makeStonePillar(World world, StructureTFDecorator forgeDeco, int x, int y, int z, int stairMeta, int rotation, StructureBoundingBox sbb) { - for (int py = 1; py <= 4; py++) - { - this.placeBlockRotated(world, forgeDeco.pillarID, forgeDeco.pillarMeta, x, y + py, z, rotation, sbb); - } - - int sx = getXWithOffsetAsIfRotated(x, z, rotation); - int sy = getYWithOffset(y + 1); - int sz = getZWithOffsetAsIfRotated(x, z, rotation); - - switch (stairMeta) - { - case 0: - sx--; - break; - case 1: - sx++; - break; - case 2: - sz--; - break; - case 3: - sz++; - break; - } - - if (sbb.isVecInside(sx, sy, sz)) - { - world.setBlock(sx, sy + 0, sz, forgeDeco.stairID, stairMeta, 0); - world.setBlock(sx, sy + 3, sz, forgeDeco.stairID, stairMeta + 4, 0); - } - } - - private void makeFirePit(World world, StructureTFDecorator myDeco, int x, int y, int z, int rotation, StructureBoundingBox sbb) { - placeBlockRotated(world, myDeco.pillarID, myDeco.pillarMeta, x + 1, y, z + 1, rotation, sbb); - placeBlockRotated(world, myDeco.pillarID, myDeco.pillarMeta, x + 1, y, z - 1, rotation, sbb); - placeBlockRotated(world, myDeco.pillarID, myDeco.pillarMeta, x - 1, y, z + 1, rotation, sbb); - placeBlockRotated(world, myDeco.pillarID, myDeco.pillarMeta, x - 1, y, z - 1, rotation, sbb); - placeBlockRotated(world, myDeco.stairID, getStairMeta(0 + rotation), x - 1, y, z + 0, rotation, sbb); - placeBlockRotated(world, myDeco.stairID, getStairMeta(2 + rotation), x + 1, y, z + 0, rotation, sbb); - placeBlockRotated(world, myDeco.stairID, getStairMeta(3 + rotation), x + 0, y, z + 1, rotation, sbb); - placeBlockRotated(world, myDeco.stairID, getStairMeta(1 + rotation), x + 0, y, z - 1, rotation, sbb); - - placeBlockRotated(world, Blocks.netherrack, 0, x, y, z, rotation, sbb); - placeBlockRotated(world, Blocks.fire, 0, x, y + 1, z, rotation, sbb); - } - - - private void decorateNetherwart(World world, Random decoRNG, StructureBoundingBox sbb, int rotation, int y, boolean isTop) - { -// StructureTFDecorator netherDeco = new StructureTFDecorator(); -// netherDeco = Blocks.netherBrick; -// netherDeco.pillarID = Blocks.netherBrick; -// netherDeco.stairID = Blocks.stairsNetherBrick; -// netherDeco.fenceID = Blocks.netherFence; - StructureTFDecorator netherDeco = this.deco; - -// // lava container -// makePillarFrame(world, sbb, netherDeco, rotation, 12, y, 3, 4, 4, 4, true); -// this.fillBlocksRotated(world, sbb, 13, y + 1, 4, 14, y + 1, 5, Blocks.lavaMoving, 0, rotation); -// this.fillBlocksRotated(world, sbb, 12, y + 3, 3, 15, y + 4, 6, 0, 0, rotation); - - //makeNetherburst(world, decoRNG, 8, 100, 20, 12, y + 3, 3, rotation, sbb); - - // wart container - makePillarFrame(world, sbb, netherDeco, rotation, 12, y, 9, 4, 4, 7, true); - this.fillBlocksRotated(world, sbb, 13, y + 1, 10, 14, y + 1, 14, Blocks.soul_sand, 0, rotation); - this.fillBlocksRotated(world, sbb, 13, y + 2, 10, 14, y + 2, 14, Blocks.nether_wart, 0, rotation); - this.fillBlocksRotated(world, sbb, 13, y + 4, 10, 14, y + 4, 14, Blocks.soul_sand, 0, rotation); - - // blaze container - makePillarFrame(world, sbb, netherDeco, rotation, 5, y, 12, 3, (isTop ? 4 : 9), 3, true); - this.placeBlockRotated(world, netherDeco.blockID, netherDeco.blockMeta, 6, y + 1, 13, rotation, sbb); - this.placeBlockRotated(world, netherDeco.blockID, netherDeco.blockMeta, 6, y + (isTop ? 4 : 9), 13, rotation, sbb); - - this.placeSpawnerRotated(world, 6, y + 3, 13, rotation, "Blaze", sbb); - - - // destruction blob - destroyTower(world, decoRNG, 12, y, 3, 2, sbb); - - } - - private void decorateBotanical(World world, Random decoRNG, StructureBoundingBox sbb, int rotation, int y) { - // main part - makePillarFrame(world, sbb, this.deco, rotation, 12, y, 12, 4, 4, 4, true); - this.fillBlocksRotated(world, sbb, 13, y + 1, 13, 14, y + 1, 14, deco.blockID, deco.blockMeta, rotation); - this.fillBlocksRotated(world, sbb, 13, y + 4, 13, 14, y + 4, 14, deco.blockID, deco.blockMeta, rotation); - - placeRandomPlant(world, decoRNG, 13, y + 2, 13, rotation, sbb); - placeRandomPlant(world, decoRNG, 13, y + 2, 14, rotation, sbb); - placeRandomPlant(world, decoRNG, 14, y + 2, 13, rotation, sbb); - placeRandomPlant(world, decoRNG, 14, y + 2, 14, rotation, sbb); - - // toolbench - for (int py = 1; py <= 4; py++) - { - placeBlockRotated(world, deco.pillarID, deco.pillarMeta, 12, y + py, 4, rotation, sbb); - placeBlockRotated(world, deco.pillarID, deco.pillarMeta, 15, y + py, 4, rotation, sbb); - } - placeBlockRotated(world, deco.stairID, getStairMeta(2 + rotation) + 4, 13, y + 1, 4, rotation, sbb); - placeBlockRotated(world, deco.stairID, getStairMeta(0 + rotation) + 4, 14, y + 1, 4, rotation, sbb); - - //placeBlockRotated(world, Blocks.chest, 0, 13, y + 2, 4, rotation, sbb); - placeTreasureRotated(world, 13, y + 2, 4, rotation, TFTreasure.basement, sbb); - placeBlockRotated(world, Blocks.crafting_table, 0, 14, y + 2, 4, rotation, sbb); - - // bench 2 - placeBlockRotated(world, deco.stairID, getStairMeta(2 + rotation) + 4, 12, y + 1, 7, rotation, sbb); - placeBlockRotated(world, Blocks.wooden_slab, 1 + 8, 13, y + 1, 7, rotation, sbb); - placeBlockRotated(world, Blocks.wooden_slab, 1 + 8, 14, y + 1, 7, rotation, sbb); - placeBlockRotated(world, deco.stairID, getStairMeta(0 + rotation) + 4, 15, y + 1, 7, rotation, sbb); - - // bench 2 - placeBlockRotated(world, deco.stairID, getStairMeta(2 + rotation) + 4, 12, y + 1, 10, rotation, sbb); - placeBlockRotated(world, Blocks.wooden_slab, 1 + 8, 13, y + 1, 10, rotation, sbb); - placeBlockRotated(world, Blocks.wooden_slab, 1 + 8, 14, y + 1, 10, rotation, sbb); - placeBlockRotated(world, deco.stairID, getStairMeta(0 + rotation) + 4, 15, y + 1, 10, rotation, sbb); - - // plants on benches - for (int x = 12; x <= 15; x++) - { - placeRandomPlant(world, decoRNG, x, y + 2, 7, rotation, sbb); - placeRandomPlant(world, decoRNG, x, y + 2, 10, rotation, sbb); - } - - // planter for trees - placeTreePlanter(world, decoRNG.nextInt(5), 6, y + 1, 12, rotation, sbb); - } - - - private void placeTreePlanter(World world, int treeNum, int x, int y, int z, int rotation, StructureBoundingBox sbb) - { - placeBlockRotated(world, deco.pillarID, deco.pillarMeta, x + 1, y, z + 1, rotation, sbb); - placeBlockRotated(world, deco.pillarID, deco.pillarMeta, x + 1, y, z - 1, rotation, sbb); - placeBlockRotated(world, deco.pillarID, deco.pillarMeta, x - 1, y, z + 1, rotation, sbb); - placeBlockRotated(world, deco.pillarID, deco.pillarMeta, x - 1, y, z - 1, rotation, sbb); - placeBlockRotated(world, deco.stairID, getStairMeta(0 + rotation), x - 1, y, z + 0, rotation, sbb); - placeBlockRotated(world, deco.stairID, getStairMeta(2 + rotation), x + 1, y, z + 0, rotation, sbb); - placeBlockRotated(world, deco.stairID, getStairMeta(3 + rotation), x + 0, y, z + 1, rotation, sbb); - placeBlockRotated(world, deco.stairID, getStairMeta(1 + rotation), x + 0, y, z - 1, rotation, sbb); - - placeBlockRotated(world, Blocks.dirt, 0, x, y, z, rotation, sbb); - - - int dx = getXWithOffsetAsIfRotated(x, z, rotation); - int dy = getYWithOffset(y + 1); - int dz = getZWithOffsetAsIfRotated(x, z, rotation); - if (sbb.isVecInside(dx, dy, dz)) - { - WorldGenerator treeGen; - // grow a tree - switch (treeNum) - { - case 0: - default: - // oak tree - treeGen = new WorldGenTrees(false); - break; - case 1: - // jungle tree - treeGen = new WorldGenTrees(true, 3, 3, 3, false); - break; - case 2: - // birch - treeGen = new WorldGenForest(true, false); - break; - case 3: - treeGen = new TFGenSmallTwilightOak(false); - break; - case 4: - treeGen = new TFGenSmallRainboak(false); - break; - } - - for (int i = 0; i < 100; i++) - { - if (treeGen.generate(world, world.rand, dx, dy, dz)) - { - break; - } - -// if (i == 99) -// { -// System.out.println("Never generated " + treeGen); -// } - } - } - - } - - - private void placeRandomPlant(World world, Random decoRNG, int x, int y, int z, int rotation, StructureBoundingBox sbb) - { - int potMeta = decoRNG.nextInt(12); - placeBlockRotated(world, Blocks.flower_pot, potMeta, x, y, z, rotation, sbb); - } - - - - - private void makeBottomEntrance(World world, Random decoRNG, StructureBoundingBox sbb, int rotation, int y) { - makeFirePit(world, this.deco, 13, y + 1, 3, rotation, sbb); - makeFirePit(world, this.deco, 3, y + 1, 13, rotation, sbb); - makeFirePit(world, this.deco, 13, y + 1, 13, rotation, sbb); - - makePillarFrame(world, sbb, this.deco, rotation, 7, y, 7, 3, 4, 3, false); - - } - - - - /** - * Add a bunch of timber beams - */ - protected void addTimberMaze(World world, Random rand, StructureBoundingBox sbb, int bottom, int top) { - - int spacing = 5; - int floorside = 0; - if (bottom == 0) - { - bottom += spacing; - } - - - // fill with beam maze - for (int y = bottom; y < top; y += spacing) - { - floorside += 1; - floorside %= 4; - - makeTimberBeams(world, rand, sbb, floorside, y, y == bottom && bottom != spacing, y >= (top - spacing), top); - } - } - - - /** - * Make a lattice of log blocks - * @param top - */ - protected void makeTimberBeams(World world, Random rand, StructureBoundingBox sbb, int rotation, int y, boolean isBottom, boolean isTop, int top) - { - Block beamID = TFBlocks.log; - int beamMetaBase = 3; - - int beamMetaNS = ((this.coordBaseMode + rotation) % 2 == 0) ? 4 : 8; - int beamMetaEW = (beamMetaNS == 4) ? 8 : 4; - int beamMetaUD = 0; - - // three beams going e/w - for (int z = 1; z < size - 1; z++) - { - placeBlockRotated(world, beamID, beamMetaBase + beamMetaEW, 4, y, z, rotation, sbb); - placeBlockRotated(world, beamID, beamMetaBase + beamMetaEW, 9, y, z, rotation, sbb); - placeBlockRotated(world, beamID, beamMetaBase + beamMetaEW, 14, y, z, rotation, sbb); - } - - // a few random cross beams - int z = pickBetweenExcluding(3, size - 3, rand, 4, 9, 14); - for (int x = 5; x < 9; x++) - { - placeBlockRotated(world, beamID, beamMetaBase + beamMetaNS, x, y, z, rotation, sbb); - } - - z = pickBetweenExcluding(3, size - 3, rand, 4, 9, 14); - for (int x = 10; x < 14; x++) - { - placeBlockRotated(world, beamID, beamMetaBase + beamMetaNS, x, y, z, rotation, sbb); - } - - - // beams going down - int x1 = 4; - int z1 = pickFrom(rand, 4, 9, 14); - int x2 = 9; - int z2 = pickFrom(rand, 4, 9, 14); - int x3 = 14; - int z3 = pickFrom(rand, 4, 9, 14); - - for (int by = 1; by < 5; by++) - { - if (!isBottom || checkPost(world, x1, y - 5, z1, rotation, sbb)) - { - placeBlockRotated(world, beamID, beamMetaBase + beamMetaUD, x1, y - by, z1, rotation, sbb); - placeBlockRotated(world, Blocks.ladder, getLadderMeta(2, rotation), x1 + 1, y - by, z1, rotation, sbb); - } - if (!isBottom || checkPost(world, x2, y - 5, z2, rotation, sbb)) - { - placeBlockRotated(world, beamID, beamMetaBase + beamMetaUD, x2, y - by, z2, rotation, sbb); - } - if (!isBottom || checkPost(world, x3, y - 5, z3, rotation, sbb)) - { - placeBlockRotated(world, beamID, beamMetaBase + beamMetaUD, x3, y - by, z3, rotation, sbb); - placeBlockRotated(world, Blocks.ladder, getLadderMeta(4, rotation), x3 - 1, y - by, z3, rotation, sbb); - } - } - - // do we need a beam going up? - if (isTop) - { - int topFloorRotation = (this.boundingBox.minY + top + 1) % 4; - - int ladderX = 4; - int ladderZ = 10; - int ladderMeta = 3; - for (int by = 1; by < 5; by++) - { - placeBlockRotated(world, beamID, beamMetaBase + beamMetaUD, ladderX, y + by, 9, topFloorRotation, sbb); - placeBlockRotated(world, Blocks.ladder, getLadderMeta(ladderMeta, topFloorRotation), ladderX, y + by, ladderZ, topFloorRotation, sbb); - } - - // fence thing - placeBlockRotated(world, Blocks.air, 0, ladderX, y + 6, 9, topFloorRotation, sbb); - placeBlockRotated(world, deco.fenceID, deco.fenceMeta, ladderX + 1, y + 5, ladderZ, topFloorRotation, sbb); - placeBlockRotated(world, deco.fenceID, deco.fenceMeta, ladderX - 1, y + 5, ladderZ, topFloorRotation, sbb); - placeBlockRotated(world, deco.fenceID, deco.fenceMeta, ladderX + 1, y + 6, ladderZ, topFloorRotation, sbb); - placeBlockRotated(world, deco.fenceID, deco.fenceMeta, ladderX - 1, y + 6, ladderZ, topFloorRotation, sbb); - } - - if (!isBottom && !isTop) - { - // spawners - int sx = pickFrom(rand, 6, 7, 11); - int sz = pickFrom(rand, 6, 11, 12); - - makeMiniGhastSpawner(world, rand, y, sx, sz, sbb); - - } - - // lamps - int lx = pickFrom(rand, 2, 12, 16); - int lz = 2 + rand.nextInt(15); - - placeBlockRotated(world, Blocks.redstone_lamp, 0, lx, y + 2, lz, rotation, sbb); - placeBlockRotated(world, Blocks.lever, rand.nextBoolean() ? 0 : 7, lx, y + 1, lz, rotation, sbb); - } - - - /** - * Make a mini ghast spawner and then set the spawn range and max entities for that spawner - */ - private void makeMiniGhastSpawner(World world, Random rand, int y, int sx, int sz, StructureBoundingBox sbb) - { - TileEntityMobSpawner spawner = placeSpawnerAtCurrentPosition(world, rand, sx, y + 2, sz, TFCreatures.getSpawnerNameFor("Mini Ghast"), sbb); - - if (spawner != null) - { - // change the spawner detection range by this goofy process of writing to and reading from NBT tags - NBTTagCompound tags = new NBTTagCompound(); - spawner.writeToNBT(tags); - - tags.setShort("SpawnRange", (short) 16); - tags.setShort("MaxNearbyEntities", (short) 2);//(short) (world.difficultySetting)); - tags.setShort("SpawnCount", (short) 1); - - spawner.readFromNBT(tags); - } - } - - - /** - * Add a bunch of platforms accessible with the block builder - */ - protected void addBuilderPlatforms(World world, Random rand, StructureBoundingBox sbb, int bottom, int top) { - - int spacing = 5; - int floorside = 0; - if (bottom == 0) - { - bottom += spacing; - } - - - // fill platforms, aside from bottom and top platform - for (int y = bottom; y < (top - spacing); y += spacing) - { - makeBuilderPlatforms(world, rand, sbb, floorside, y, y == bottom && bottom != spacing, y >= (top - spacing)); - - floorside += 1 + rand.nextInt(3); - floorside %= 4; - } - - // add the bottom platforms - makeBuilderPlatform(world, rand, 1, bottom, 5, true, sbb); - makeBuilderPlatform(world, rand, 3, bottom, 5, true, sbb); - - for (int y = bottom - 4; y < bottom; y++) - { - placeBlockRotated(world, Blocks.ladder, getLadderMeta(2, 1), 1, y, 5, 1, sbb); - placeBlockRotated(world, Blocks.ladder, getLadderMeta(2, 3), 1, y, 5, 3, sbb); - } - - // top platform - addTopBuilderPlatform(world, rand, bottom, top, spacing, sbb); - - } - - - /** - * Make platform with a block builder - */ - protected void makeBuilderPlatforms(World world, Random rand, StructureBoundingBox sbb, int rotation, int y, boolean bottom, boolean top) - { - int z = size / 2 + rand.nextInt(5) - rand.nextInt(5); - - // bottom platform - makeBuilderPlatform(world, rand, rotation, y, z, false, sbb); - - // ladder - placeBlockRotated(world, Blocks.ladder, getLadderMeta(2, rotation), 1, y + 1, z, rotation, sbb); - placeBlockRotated(world, Blocks.ladder, getLadderMeta(2, rotation), 1, y + 2, z, rotation, sbb); - placeBlockRotated(world, Blocks.ladder, getLadderMeta(2, rotation), 1, y + 3, z, rotation, sbb); - placeBlockRotated(world, Blocks.ladder, getLadderMeta(2, rotation), 1, y + 4, z, rotation, sbb); - - makeBuilderPlatform(world, rand, rotation, y + 5, z, true, sbb); - - if (y % 2 == 1) - { - // reverter blocks - int sx = pickFrom(rand, 5, 9, 13); - int sz = (sx == 9) ? (rand.nextBoolean() ? 5 : 13) : 9; - - placeBlockRotated(world, TFBlocks.towerDevice, BlockTFTowerDevice.META_ANTIBUILDER, sx, y + 2, sz, rotation, sbb); - } - else - { - // lamp cluster - int sx = rand.nextBoolean() ? 5 : 13; - int sz = rand.nextBoolean() ? 5 : 13; - - makeLampCluster(world, rand, sx, y, sz, rotation, sbb); - } - } - - - /** - * Add the top floating platform in the builder platforms area - */ - private void addTopBuilderPlatform(World world, Random rand, int bottom, int top, int spacing, StructureBoundingBox sbb) { - int rotation = (this.boundingBox.minY + top + 1) % 4; - - // platform - this.fillBlocksRotated(world, sbb, 5, top - spacing, 9, 7, top - spacing, 11, deco.accentID, deco.accentMeta, rotation); - // ladder ascender - this.fillBlocksRotated(world, sbb, 6, top - spacing, 9, 6, top, 9, deco.accentID, deco.accentMeta, rotation); - this.fillBlocksRotated(world, sbb, 6, top - spacing + 1, 10, 6, top - 1, 10, Blocks.ladder, getLadderMeta(3, rotation), rotation); - placeBlockRotated(world, Blocks.air, 0, 6, top + 1, 9, rotation, sbb); - placeBlockRotated(world, deco.fenceID, deco.fenceMeta, 5, top + 0, 10, rotation, sbb); - placeBlockRotated(world, deco.fenceID, deco.fenceMeta, 7, top + 0, 10, rotation, sbb); - placeBlockRotated(world, deco.fenceID, deco.fenceMeta, 5, top + 1, 10, rotation, sbb); - placeBlockRotated(world, deco.fenceID, deco.fenceMeta, 7, top + 1, 10, rotation, sbb); - // builder & lever - placeBlockRotated(world, TFBlocks.towerDevice, BlockTFTowerDevice.META_BUILDER_INACTIVE, 7, top - spacing, 10, rotation, sbb); - placeBlockRotated(world, Blocks.lever, rand.nextBoolean() ? 5 : 6, 7, top - spacing + 1, 11, rotation, sbb); - } - - - private void makeBuilderPlatform(World world, Random rand, int rotation, int y, int z, boolean hole, StructureBoundingBox sbb) { - // top platform - placeBlockRotated(world, deco.accentID, deco.accentMeta, 1, y, z - 1, rotation, sbb); - if (!hole) - { - placeBlockRotated(world, deco.accentID, deco.accentMeta, 1, y, z - 0, rotation, sbb); - } - placeBlockRotated(world, deco.accentID, deco.accentMeta, 1, y, z + 1, rotation, sbb); - placeBlockRotated(world, deco.accentID, deco.accentMeta, 2, y, z - 1, rotation, sbb); - placeBlockRotated(world, deco.accentID, deco.accentMeta, 2, y, z - 0, rotation, sbb); - placeBlockRotated(world, deco.accentID, deco.accentMeta, 2, y, z + 1, rotation, sbb); - - // builder & lever - placeBlockRotated(world, TFBlocks.towerDevice, BlockTFTowerDevice.META_BUILDER_INACTIVE, 2, y, hole ? z + 1 : z - 1, rotation, sbb); - placeBlockRotated(world, Blocks.lever, rand.nextBoolean() ? 5 : 6, 2, y + 1, z + 0, rotation, sbb); - } - - - - - /** - * Make a cluster of redstone lamps w/ switches as decoration for the empty areas in towers - */ - private void makeLampCluster(World world, Random rand, int sx, int y, int sz, int rotation, StructureBoundingBox sbb) - { - int radius = 4; - - // make lamps - for (int i = 0; i < 5; i++) - { - int lx = sx; - int ly = y; - int lz = sz; - - for (int move = 0; move < 10; move++) - { - // place lamp - placeBlockRotated(world, Blocks.redstone_lamp, 0, lx, ly, lz, rotation, sbb); - - // move randomly - int direction = rand.nextInt(8); - - if (direction > 5) - { - direction -= 2; - } - - - lx += Facing.offsetsXForSide[direction]; - ly += Facing.offsetsYForSide[direction]; - lz += Facing.offsetsZForSide[direction]; - - // if we are out of bounds, stop iterating - if (lx > sx + radius || lx < sx - radius || ly > y + radius || ly < y - radius || lz > sz + radius || lz < sz - radius) - { - break; - } - } - } - - // make switches - for (int i = 0; i < 5; i++) - { - int lx = sx; - int ly = y; - int lz = sz; - - // we need to always call rand.nextInt the same amount of times - int[] directions = new int[10]; - for (int move = 0; move < 10; move++) - { - directions[move] = rand.nextInt(8); - - if (directions[move] > 5) - { - directions[move] -= 2; - } - - } - - for (int move = 0; move < 10; move++) - { - // move randomly - int direction = directions[move]; - - - lx += Facing.offsetsXForSide[direction]; - ly += Facing.offsetsYForSide[direction]; - lz += Facing.offsetsZForSide[direction]; - - // if we are out of bounds, stop iterating - if (lx > sx + radius || lx < sx - radius || ly > y + radius || ly < y - radius || lz > sz + radius || lz < sz - radius) - { - break; - } - - // if there is no lamp, place a switch and quit - if (getBlockIDRotated(world, lx, ly, lz, rotation, sbb) != Blocks.redstone_lamp) - { - placeBlockRotated(world, Blocks.lever, getLeverMeta(rotation, direction), lx, ly, lz, rotation, sbb); - break; - } - } - } - - } - - - - - -} diff --git a/src/main/java/twilightforest/structures/darktower/ComponentTFDarkTowerMainBridge.java b/src/main/java/twilightforest/structures/darktower/ComponentTFDarkTowerMainBridge.java deleted file mode 100644 index 94cdf91274..0000000000 --- a/src/main/java/twilightforest/structures/darktower/ComponentTFDarkTowerMainBridge.java +++ /dev/null @@ -1,33 +0,0 @@ -package twilightforest.structures.darktower; - -import java.util.List; -import java.util.Random; - -import net.minecraft.world.gen.structure.StructureComponent; - -public class ComponentTFDarkTowerMainBridge extends ComponentTFDarkTowerBridge { - - public ComponentTFDarkTowerMainBridge() { - super(); - // TODO Auto-generated constructor stub - } - - - protected ComponentTFDarkTowerMainBridge(int i, int x, int y, int z, int pSize, int pHeight, int direction) { - super(i, x, y, z, 15, pHeight, direction); - } - - - public boolean makeTowerWing(List list, Random rand, int index, int x, int y, int z, int wingSize, int wingHeight, int rotation) { - // make another size 15 main tower - int direction = (getCoordBaseMode() + rotation) % 4; - int[] dx = offsetTowerCoords(x, y, z, 19, direction); - - ComponentTFDarkTowerMain wing = new ComponentTFDarkTowerMain(null, rand, index, dx[0], dx[1], dx[2], direction); - - list.add(wing); - wing.buildComponent(this, list, rand); - addOpening(x, y, z, rotation); - return true; - } -} diff --git a/src/main/java/twilightforest/structures/darktower/ComponentTFDarkTowerRoof.java b/src/main/java/twilightforest/structures/darktower/ComponentTFDarkTowerRoof.java deleted file mode 100644 index d549f1c551..0000000000 --- a/src/main/java/twilightforest/structures/darktower/ComponentTFDarkTowerRoof.java +++ /dev/null @@ -1,69 +0,0 @@ -package twilightforest.structures.darktower; - -import java.util.List; -import java.util.Random; - -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import net.minecraft.world.gen.structure.StructureComponent; -import twilightforest.structures.StructureTFComponent; -import twilightforest.structures.lichtower.ComponentTFTowerRoof; -import twilightforest.structures.lichtower.ComponentTFTowerWing; - -public class ComponentTFDarkTowerRoof extends ComponentTFTowerRoof -{ - public ComponentTFDarkTowerRoof() { - super(); - // TODO Auto-generated constructor stub - } - - public ComponentTFDarkTowerRoof(int i, ComponentTFTowerWing wing) { - super(i, wing); - - // same alignment - this.setCoordBaseMode(wing.getCoordBaseMode()); - // same size - this.size = wing.size; // assuming only square towers and roofs right now. - this.height = 12; - - // just hang out at the very top of the tower - makeCapBB(wing); - - // spawn list! - this.spawnListIndex = 1; - } - - @SuppressWarnings("rawtypes") - @Override - public void buildComponent(StructureComponent parent, List list, Random rand) - { - if (parent != null && parent instanceof StructureTFComponent) - { - this.deco = ((StructureTFComponent)parent).deco; - } - } - - /** - * A fence around the roof! - */ - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) - { - // fence - for (int x = 0; x <= size - 1; x++) { - for (int z = 0; z <= size - 1; z++) { - if (x == 0 || x == size - 1 || z == 0 || z == size - 1) { - placeBlockAtCurrentPosition(world, deco.fenceID, deco.fenceMeta, x, 1, z, sbb); - } - } - } - - placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, 0, 1, 0, sbb); - placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, size - 1, 1, 0, sbb); - placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, 0, 1, size - 1, sbb); - placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, size - 1, 1, size - 1, sbb); - - return true; - } - -} diff --git a/src/main/java/twilightforest/structures/darktower/ComponentTFDarkTowerRoofAntenna.java b/src/main/java/twilightforest/structures/darktower/ComponentTFDarkTowerRoofAntenna.java deleted file mode 100644 index 6fe9a13be8..0000000000 --- a/src/main/java/twilightforest/structures/darktower/ComponentTFDarkTowerRoofAntenna.java +++ /dev/null @@ -1,55 +0,0 @@ -package twilightforest.structures.darktower; - -import java.util.Random; - -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import twilightforest.structures.lichtower.ComponentTFTowerWing; - - -public class ComponentTFDarkTowerRoofAntenna extends ComponentTFDarkTowerRoof { - - public ComponentTFDarkTowerRoofAntenna() { - super(); - // TODO Auto-generated constructor stub - } - - public ComponentTFDarkTowerRoofAntenna(int i, ComponentTFTowerWing wing) { - super(i, wing); - } - - /** - * Stick with a ball on top antenna - */ - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - super.addComponentParts(world, rand, sbb); - - // antenna - for (int y = 1; y < 10; y++) - { - placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, size / 2, y, size / 2, sbb); - } - - placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, size / 2 - 1, 1, size / 2, sbb); - placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, size / 2 + 1, 1, size / 2, sbb); - placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, size / 2, 1, size / 2 - 1, sbb); - placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, size / 2, 1, size / 2 + 1, sbb); - - for (int y = 7; y < 10; y++) - { - placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, size / 2 - 1, y, size / 2, sbb); - placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, size / 2 + 1, y, size / 2, sbb); - placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, size / 2, y, size / 2 - 1, sbb); - placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, size / 2, y, size / 2 + 1, sbb); - } - - placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, size / 2 - 1, 8, size / 2 - 1, sbb); - placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, size / 2 - 1, 8, size / 2 + 1, sbb); - placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, size / 2 + 1, 8, size / 2 - 1, sbb); - placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, size / 2 + 1, 8, size / 2 + 1, sbb); - - return true; - } - -} diff --git a/src/main/java/twilightforest/structures/darktower/ComponentTFDarkTowerRoofCactus.java b/src/main/java/twilightforest/structures/darktower/ComponentTFDarkTowerRoofCactus.java deleted file mode 100644 index 3ec8f33481..0000000000 --- a/src/main/java/twilightforest/structures/darktower/ComponentTFDarkTowerRoofCactus.java +++ /dev/null @@ -1,70 +0,0 @@ -package twilightforest.structures.darktower; - -import java.util.Random; - -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import twilightforest.structures.lichtower.ComponentTFTowerWing; - -public class ComponentTFDarkTowerRoofCactus extends ComponentTFDarkTowerRoof { - - public ComponentTFDarkTowerRoofCactus() { - super(); - // TODO Auto-generated constructor stub - } - - - public ComponentTFDarkTowerRoofCactus(int i, ComponentTFTowerWing wing) - { - super(i, wing); - } - - - /** - * cactussy thing - */ - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - super.addComponentParts(world, rand, sbb); - - // antenna - for (int y = 1; y < 10; y++) - { - placeBlockAtCurrentPosition(world, deco.blockID, deco.blockMeta, size / 2, y, size / 2, sbb); - } - placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, size / 2, 10, size / 2, sbb); - - placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, size / 2 - 1, 1, size / 2, sbb); - placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, size / 2 + 1, 1, size / 2, sbb); - placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, size / 2, 1, size / 2 - 1, sbb); - placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, size / 2, 1, size / 2 + 1, sbb); - - // cactus things - placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, size / 2 + 1, 7, size / 2, sbb); - placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, size / 2 + 2, 7, size / 2, sbb); - placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, size / 2 + 2, 8, size / 2, sbb); - placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, size / 2 + 2, 9, size / 2, sbb); - placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, size / 2 + 3, 9, size / 2, sbb); - - placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, size / 2, 6, size / 2 + 1, sbb); - placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, size / 2, 6, size / 2 + 2, sbb); - placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, size / 2, 7, size / 2 + 2, sbb); - placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, size / 2, 8, size / 2 + 2, sbb); - placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, size / 2, 8, size / 2 + 3, sbb); - - placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, size / 2 - 1, 5, size / 2, sbb); - placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, size / 2 - 2, 5, size / 2, sbb); - placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, size / 2 - 2, 6, size / 2, sbb); - placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, size / 2 - 2, 7, size / 2, sbb); - placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, size / 2 - 3, 7, size / 2, sbb); - - placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, size / 2, 4, size / 2 - 1, sbb); - placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, size / 2, 4, size / 2 - 2, sbb); - placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, size / 2, 5, size / 2 - 2, sbb); - placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, size / 2, 6, size / 2 - 2, sbb); - placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, size / 2, 6, size / 2 - 3, sbb); - - - return true; - } -} diff --git a/src/main/java/twilightforest/structures/darktower/ComponentTFDarkTowerRoofFourPost.java b/src/main/java/twilightforest/structures/darktower/ComponentTFDarkTowerRoofFourPost.java deleted file mode 100644 index e28fdb4403..0000000000 --- a/src/main/java/twilightforest/structures/darktower/ComponentTFDarkTowerRoofFourPost.java +++ /dev/null @@ -1,54 +0,0 @@ -package twilightforest.structures.darktower; - -import java.util.Random; - -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import twilightforest.structures.lichtower.ComponentTFTowerWing; - -public class ComponentTFDarkTowerRoofFourPost extends ComponentTFDarkTowerRoof { - - public ComponentTFDarkTowerRoofFourPost() { - super(); - // TODO Auto-generated constructor stub - } - - - public ComponentTFDarkTowerRoofFourPost(int i, ComponentTFTowerWing wing) { - super(i, wing); - } - - - /** - * four posts - */ - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - super.addComponentParts(world, rand, sbb); - - makeSmallAntenna(world, sbb, 4, size - 2, size - 2); - makeSmallAntenna(world, sbb, 5, 1, size - 2); - makeSmallAntenna(world, sbb, 6, size - 2, 1); - makeSmallAntenna(world, sbb, 7, 1, 1); - - - return true; - } - - - protected void makeSmallAntenna(World world, StructureBoundingBox sbb, int height, int x, int z) { - // antenna - for (int y = 1; y < height; y++) - { - placeBlockAtCurrentPosition(world, deco.blockID, deco.blockMeta, x, y, z, sbb); - } - placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, x, height + 0, z, sbb); - placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, x, height + 1, z, sbb); - placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, x + 1, height + 1, z, sbb); - placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, x - 1, height + 1, z, sbb); - placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, x, height + 1, z + 1, sbb); - placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, x, height + 1, z - 1, sbb); - placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, x, height + 2, z, sbb); - } - -} diff --git a/src/main/java/twilightforest/structures/darktower/ComponentTFDarkTowerRoofRings.java b/src/main/java/twilightforest/structures/darktower/ComponentTFDarkTowerRoofRings.java deleted file mode 100644 index 09512ecaa6..0000000000 --- a/src/main/java/twilightforest/structures/darktower/ComponentTFDarkTowerRoofRings.java +++ /dev/null @@ -1,66 +0,0 @@ -package twilightforest.structures.darktower; - -import java.util.Random; - -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import twilightforest.structures.lichtower.ComponentTFTowerWing; - -public class ComponentTFDarkTowerRoofRings extends ComponentTFDarkTowerRoof { - - public ComponentTFDarkTowerRoofRings() { - super(); - // TODO Auto-generated constructor stub - } - - - public ComponentTFDarkTowerRoofRings(int i, ComponentTFTowerWing wing) - { - super(i, wing); - } - - - /** - * ring a dings - */ - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - super.addComponentParts(world, rand, sbb); - - // antenna - for (int y = 1; y < 10; y++) - { - placeBlockAtCurrentPosition(world, deco.blockID, deco.blockMeta, size / 2, y, size / 2, sbb); - } - - placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, size / 2, 10, size / 2, sbb); - - - placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, size / 2 - 1, 1, size / 2, sbb); - placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, size / 2 + 1, 1, size / 2, sbb); - placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, size / 2, 1, size / 2 - 1, sbb); - placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, size / 2, 1, size / 2 + 1, sbb); - - makeARing(world, 6, sbb); - makeARing(world, 8, sbb); - - - return true; - } - - - protected void makeARing(World world, int y, StructureBoundingBox sbb) { - placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, size / 2 - 2, y, size / 2 + 1, sbb); - placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, size / 2 - 2, y, size / 2 + 0, sbb); - placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, size / 2 - 2, y, size / 2 - 1, sbb); - placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, size / 2 + 2, y, size / 2 + 1, sbb); - placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, size / 2 + 2, y, size / 2 + 0, sbb); - placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, size / 2 + 2, y, size / 2 - 1, sbb); - placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, size / 2 + 1, y, size / 2 - 2, sbb); - placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, size / 2 + 0, y, size / 2 - 2, sbb); - placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, size / 2 - 1, y, size / 2 - 2, sbb); - placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, size / 2 + 1, y, size / 2 + 2, sbb); - placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, size / 2 + 0, y, size / 2 + 2, sbb); - placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, size / 2 - 1, y, size / 2 + 2, sbb); - } -} diff --git a/src/main/java/twilightforest/structures/darktower/ComponentTFDarkTowerWing.java b/src/main/java/twilightforest/structures/darktower/ComponentTFDarkTowerWing.java deleted file mode 100644 index f5c7e1c299..0000000000 --- a/src/main/java/twilightforest/structures/darktower/ComponentTFDarkTowerWing.java +++ /dev/null @@ -1,1492 +0,0 @@ -package twilightforest.structures.darktower; - -import java.nio.IntBuffer; -import java.util.ArrayList; -import java.util.List; -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.init.Blocks; -import net.minecraft.inventory.IInventory; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.ChunkCoordinates; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import net.minecraft.world.gen.structure.StructureComponent; -import twilightforest.TFTreasure; -import twilightforest.block.BlockTFTowerDevice; -import twilightforest.block.TFBlocks; -import twilightforest.entity.TFCreatures; -import twilightforest.item.TFItems; -import twilightforest.structures.StructureTFComponent; -import twilightforest.structures.StructureTFDecorator; -import twilightforest.structures.lichtower.ComponentTFTowerRoof; -import twilightforest.structures.lichtower.ComponentTFTowerRoofAttachedSlab; -import twilightforest.structures.lichtower.ComponentTFTowerRoofFence; -import twilightforest.structures.lichtower.ComponentTFTowerRoofGableForwards; -import twilightforest.structures.lichtower.ComponentTFTowerRoofSlabForwards; -import twilightforest.structures.lichtower.ComponentTFTowerWing; - -public class ComponentTFDarkTowerWing extends ComponentTFTowerWing -{ - - protected boolean keyTower = false; - protected ArrayList openingTypes = new ArrayList(); - - public ComponentTFDarkTowerWing() { - super(); - // TODO Auto-generated constructor stub - } - - - protected ComponentTFDarkTowerWing(int i, int x, int y, int z, int pSize, int pHeight, int direction) - { - super(i, x, y, z, pSize, pHeight, direction); - } - - /** - * Save to NBT - */ - @Override - protected void func_143012_a(NBTTagCompound par1NBTTagCompound) { - super.func_143012_a(par1NBTTagCompound); - - par1NBTTagCompound.setBoolean("keyTower", this.keyTower); - - par1NBTTagCompound.setIntArray("doorTypeInts", this.getDoorsTypesAsIntArray()); - } - - - /** - * Turn the openings array into an array of ints. - */ - private int[] getDoorsTypesAsIntArray() { - IntBuffer ibuffer = IntBuffer.allocate(this.openingTypes.size()); - - for (EnumDarkTowerDoor doorType : openingTypes) - { - ibuffer.put(doorType.ordinal()); - } - - return ibuffer.array(); - } - - /** - * Load from NBT - */ - @Override - protected void func_143011_b(NBTTagCompound par1NBTTagCompound) { - super.func_143011_b(par1NBTTagCompound); - this.keyTower = par1NBTTagCompound.getBoolean("keyTower"); - - this.readDoorsTypesFromArray(par1NBTTagCompound.getIntArray("doorTypeInts")); - } - - /** - * Read in opening types from int array - */ - private void readDoorsTypesFromArray(int[] intArray) { - for (int typeInt : intArray) - { - this.openingTypes.add(EnumDarkTowerDoor.values()[typeInt]); - } - } - - - /** - * Read in openings from int array - */ - @SuppressWarnings("unused") - private void readOpeningsFromArray(int[] intArray) { - for (int i = 0; i < intArray.length; i += 3) - { - ChunkCoordinates door = new ChunkCoordinates(intArray[i], intArray[i + 1], intArray[i + 2]); - - this.openings.add(door); - } - } - - @SuppressWarnings({ "rawtypes", "unchecked" }) - @Override - public void buildComponent(StructureComponent parent, List list, Random rand) { - if (parent != null && parent instanceof StructureTFComponent) - { - this.deco = ((StructureTFComponent)parent).deco; - } - - // we should have a door where we started - addOpening(0, 1, size / 2, 2); - - // add a roof? - makeARoof(parent, list, rand); - - // add a beard - makeABeard(parent, list, rand); - - - if (size > 10) { - // sub towers - for (int direction = 0; direction < 4; direction++) { - int[] dest = getValidOpening(rand, direction); - int childSize = size - 2; - int childHeight = validateChildHeight(height - 4 + rand.nextInt(10) - rand.nextInt(10), childSize); - - boolean madeWing = makeTowerWing(list, rand, this.getComponentType(), dest[0], dest[1], dest[2], size - 2, childHeight, direction); - - // occasional balcony - if (!madeWing && (direction == 2 || rand.nextBoolean())) - { - makeTowerBalcony(list, rand, this.getComponentType(), dest[0], dest[1], dest[2], direction); - } - } - } - else if (rand.nextInt(4) == 0) - { - // occasional balcony on small towers too - int direction = rand.nextInt(4); - int[] dest = getValidOpening(rand, direction); - makeTowerBalcony(list, rand, this.getComponentType(), dest[0], dest[1], dest[2], direction); - } - - - } - - protected int validateChildHeight(int childHeight, int childSize) - { - return (childHeight / 4) * 4 + 1; - -// if (childSize > 9) -// { -// return (childHeight / 4) * 4 + 1; -// } -// else -// { -// return (childHeight / 3) * 3; -// } - } - - /** - * Attach a roof to this tower. - */ - @Override - public void makeARoof(StructureComponent parent, List list, Random rand) - { - int index = this.getComponentType(); - - ComponentTFTowerRoof roof; - - switch (rand.nextInt(5)) - { - case 0: - case 1: - default: - roof = new ComponentTFDarkTowerRoofAntenna(index, this); - break; - case 2: - roof = new ComponentTFDarkTowerRoofCactus(index, this); - break; - case 3: - roof = new ComponentTFDarkTowerRoofRings(index, this); - break; - case 4: - roof = new ComponentTFDarkTowerRoofFourPost(index, this); - break; - } - - list.add(roof); - roof.buildComponent(this, list, rand); - roofType = roof.getClass(); - } - - protected void makeAttachedRoof(List list, Random rand) { - int index = this.getComponentType(); - ComponentTFTowerRoof roof; - - // this is our preferred roof type: - if (roofType == null && rand.nextInt(32) != 0) { - tryToFitRoof(list, rand, new ComponentTFTowerRoofGableForwards(index + 1, this)); - } - - // this is for roofs that don't fit. - if (roofType == null && rand.nextInt(8) != 0) { - tryToFitRoof(list, rand, new ComponentTFTowerRoofSlabForwards(index + 1, this)); - } - - // finally, if we're cramped for space, try this - if (roofType == null && rand.nextInt(32) != 0) { - // fall through to this next roof - roof = new ComponentTFTowerRoofAttachedSlab(index + 1, this); - tryToFitRoof(list, rand, roof); - } - - // last resort - if (roofType == null) { - // fall through to this next roof - roof = new ComponentTFTowerRoofFence(index + 1, this); - tryToFitRoof(list, rand, roof); - } - } - - - /** - * Add a beard to this structure. There is only one type of beard. - */ - @Override - public void makeABeard(StructureComponent parent, List list, Random rand) { - ComponentTFDarkTowerBeard beard = new ComponentTFDarkTowerBeard(this.getComponentType() + 1, this); - list.add(beard); - beard.buildComponent(this, list, rand); - } - - /** - * Make another wing just like this one - */ - @Override - public boolean makeTowerWing(List list, Random rand, int index, int x, int y, int z, int wingSize, int wingHeight, int rotation) - { - // kill too-small towers - if (wingHeight < 8) { - return false; - } - - int direction = (getCoordBaseMode() + rotation) % 4; - int[] dx = offsetTowerCoords(x, y, z, 5, direction); - - if (dx[1] + wingHeight > 250) - { - // end of the world! - return false; - } - - ComponentTFDarkTowerBridge bridge = new ComponentTFDarkTowerBridge(index, dx[0], dx[1], dx[2], wingSize, wingHeight, direction); - // check to see if it intersects something already there - StructureComponent intersect = StructureComponent.findIntersecting(list, bridge.getBoundingBox()); - if (intersect == null || intersect == this) - { - intersect = StructureComponent.findIntersecting(list, bridge.getWingBB()); - } - else - { - return false; - } - if (intersect == null || intersect == this) { - list.add(bridge); - bridge.buildComponent(this, list, rand); - addOpening(x, y, z, rotation); - return true; - } else { -// System.out.println("Planned wing intersects with " + intersect); - return false; - } - } - - protected boolean makeTowerBalcony(List list, Random rand, int index, int x, int y, int z, int rotation) - { - int direction = (getCoordBaseMode() + rotation) % 4; - int[] dx = offsetTowerCoords(x, y, z, 5, direction); - - - ComponentTFDarkTowerBalcony balcony = new ComponentTFDarkTowerBalcony(index, dx[0], dx[1], dx[2], direction); - // check to see if it intersects something already there - StructureComponent intersect = StructureComponent.findIntersecting(list, balcony.getBoundingBox()); - if (intersect == null || intersect == this) { - list.add(balcony); - balcony.buildComponent(this, list, rand); - addOpening(x, y, z, rotation, EnumDarkTowerDoor.REAPPEARING); - return true; - } else { -// System.out.println("Planned wing intersects with " + intersect); - return false; - } - - } - - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - Random decoRNG = new Random(world.getSeed() + (this.boundingBox.minX * 321534781) ^ (this.boundingBox.minZ * 756839)); - - // make walls - makeEncasedWalls(world, rand, sbb, 0, 0, 0, size - 1, height - 1, size - 1); - - // clear inside - fillWithAir(world, sbb, 1, 1, 1, size - 2, height - 2, size - 2); - - // sky light - nullifySkyLightForBoundingBox(world); - - if (this.size > 9) - { - // half floors, always starting at y = 4 - addHalfFloors(world, decoRNG, sbb, 4, height - 1); - } - else - { - if (decoRNG.nextInt(3) == 0) - { - addSmallTimberBeams(world, decoRNG, sbb, 4, height - 1); - } - else - { - addHalfFloors(world, decoRNG, sbb, 4, height - 1); - } - } - - // openings - makeOpenings(world, sbb); - - // destroy some towers - if (decoRNG.nextBoolean() && !this.isKeyTower() && this.height > 8) - { - int blobs = 1; - - if (this.size > 9 && decoRNG.nextBoolean()) - { - blobs++; - } - - for (int i = 0; i < blobs; i++) - { - - // find a random spot in the tower - int x = decoRNG.nextInt(size); - int y = decoRNG.nextInt(height - 7) + 2; - int z = decoRNG.nextInt(size); - - destroyTower(world, decoRNG, x, y, z, 3, sbb); - } - - } - - return true; - } - - /** - * Add a destruction burst - */ - protected void destroyTower(World world, Random decoRNG, int x, int y, int z, int amount, StructureBoundingBox sbb) { - //makeNetherburst(world, decoRNG, 16, 100, 40, x, y, z, 0, sbb); - - int initialRadius = decoRNG.nextInt(amount) + amount; - - drawBlob(world, x, y, z, initialRadius, Blocks.air, 0, sbb); - - for (int i = 0; i < 3; i++) - { - int dx = x + (initialRadius - 1) * (decoRNG.nextBoolean() ? 1 : -1); - int dy = y + (initialRadius - 1) * (decoRNG.nextBoolean() ? 1 : -1); - int dz = z + (initialRadius - 1) * (decoRNG.nextBoolean() ? 1 : -1); - - netherTransformBlob(world, decoRNG, dx, dy, dz, initialRadius - 1, sbb); - drawBlob(world, dx, dy, dz, initialRadius - 2, Blocks.air, 0, sbb); - } - - } - - private void netherTransformBlob(World world, Random inRand, int sx, int sy, int sz, int rad, StructureBoundingBox sbb) { - - Random rand = new Random(inRand.nextLong()); - - // then trace out a quadrant - for (byte dx = 0; dx <= rad; dx++) - { - for (byte dy = 0; dy <= rad; dy++) - { - for (byte dz = 0; dz <= rad; dz++) - { - // determine how far we are from the center. - byte dist = 0; - if (dx >= dy && dx >= dz) - { - dist = (byte) (dx + (byte)((Math.max(dy, dz) * 0.5) + (Math.min(dy, dz) * 0.25))); - } - else if (dy >= dx && dy >= dz) - { - dist = (byte) (dy + (byte)((Math.max(dx, dz) * 0.5) + (Math.min(dx, dz) * 0.25))); - } - else - { - dist = (byte) (dz + (byte)((Math.max(dx, dy) * 0.5) + (Math.min(dx, dy) * 0.25))); - } - - - // if we're inside the blob, fill it - if (dist <= rad) { - // do eight at a time for easiness! - testAndChangeToNetherrack(world, rand, sx + dx, sy + dy, sz + dz, sbb); - testAndChangeToNetherrack(world, rand, sx + dx, sy + dy, sz + dz, sbb); - testAndChangeToNetherrack(world, rand, sx + dx, sy + dy, sz - dz, sbb); - testAndChangeToNetherrack(world, rand, sx - dx, sy + dy, sz + dz, sbb); - testAndChangeToNetherrack(world, rand, sx - dx, sy + dy, sz - dz, sbb); - testAndChangeToNetherrack(world, rand, sx + dx, sy - dy, sz + dz, sbb); - testAndChangeToNetherrack(world, rand, sx + dx, sy - dy, sz - dz, sbb); - testAndChangeToNetherrack(world, rand, sx - dx, sy - dy, sz + dz, sbb); - testAndChangeToNetherrack(world, rand, sx - dx, sy - dy, sz - dz, sbb); - } - } - } - } - } - - - private void testAndChangeToNetherrack(World world, Random rand, int x, int y, int z, StructureBoundingBox sbb) { - if (this.getBlockAtCurrentPosition(world, x, y, z, sbb) != Blocks.air) - { - this.placeBlockAtCurrentPosition(world, Blocks.netherrack, 0, x, y, z, sbb); - - if (this.getBlockAtCurrentPosition(world, x, y + 1, z, sbb) == Blocks.air && rand.nextBoolean()) - { - this.placeBlockAtCurrentPosition(world, Blocks.fire, 0, x, y + 1, z, sbb); - } - } - } - - - /** - * Draw a giant blob of whatevs (okay, it's going to be leaves). - */ - public void drawBlob(World world, int sx, int sy, int sz, int rad, Block blockValue, int metaValue, StructureBoundingBox sbb) { - // then trace out a quadrant - for (byte dx = 0; dx <= rad; dx++) - { - for (byte dy = 0; dy <= rad; dy++) - { - for (byte dz = 0; dz <= rad; dz++) - { - // determine how far we are from the center. - byte dist = 0; - if (dx >= dy && dx >= dz) - { - dist = (byte) (dx + (byte)((Math.max(dy, dz) * 0.5) + (Math.min(dy, dz) * 0.25))); - } - else if (dy >= dx && dy >= dz) - { - dist = (byte) (dy + (byte)((Math.max(dx, dz) * 0.5) + (Math.min(dx, dz) * 0.25))); - } - else - { - dist = (byte) (dz + (byte)((Math.max(dx, dy) * 0.5) + (Math.min(dx, dy) * 0.25))); - } - - - // if we're inside the blob, fill it - if (dist <= rad) { - // do eight at a time for easiness! - this.placeBlockAtCurrentPosition(world, blockValue, metaValue, sx + dx, sy + dy, sz + dz, sbb); - this.placeBlockAtCurrentPosition(world, blockValue, metaValue, sx + dx, sy + dy, sz - dz, sbb); - this.placeBlockAtCurrentPosition(world, blockValue, metaValue, sx - dx, sy + dy, sz + dz, sbb); - this.placeBlockAtCurrentPosition(world, blockValue, metaValue, sx - dx, sy + dy, sz - dz, sbb); - this.placeBlockAtCurrentPosition(world, blockValue, metaValue, sx + dx, sy - dy, sz + dz, sbb); - this.placeBlockAtCurrentPosition(world, blockValue, metaValue, sx + dx, sy - dy, sz - dz, sbb); - this.placeBlockAtCurrentPosition(world, blockValue, metaValue, sx - dx, sy - dy, sz + dz, sbb); - this.placeBlockAtCurrentPosition(world, blockValue, metaValue, sx - dx, sy - dy, sz - dz, sbb); - } - } - } - } - } - - - /** - * Add a bunch of random half floors - */ - protected void addHalfFloors(World world, Random rand, StructureBoundingBox sbb, int bottom, int top) { - - int spacing = 4;//this.size > 9 ? 4 : 3; - int rotation = (this.boundingBox.minY + bottom) % 3; - - if (bottom == 0) - { - bottom += spacing; - } - - // fill with half floors - for (int y = bottom; y < top; y += spacing) - { - rotation += 2;//rand.nextInt(3) > 0 ? 1 : 3; - rotation %= 4; - - if (y >= top - spacing) - { - makeFullFloor(world, sbb, rotation, y, spacing); - if (isDeadEnd()) - { - decorateTreasureRoom(world, sbb, rotation, y, 4, this.deco); - } - } - else - { - makeHalfFloor(world, sbb, rotation, y, spacing); - - // decorate - switch (rand.nextInt(8)) - { - case 0: - if (this.size < 11) - { - decorateReappearingFloor(world, rand, sbb, rotation, y); - break; - } - case 1: - decorateSpawner(world, rand, sbb, rotation, y); - break; - case 2: - decorateLounge(world, rand, sbb, rotation, y); - break; - case 3: - decorateLibrary(world, rand, sbb, rotation, y); - break; - case 4: - decorateExperimentPulser(world, rand, sbb, rotation, y); - break; - case 5: - decorateExperimentLamp(world, rand, sbb, rotation, y); - break; - case 6: - decoratePuzzleChest(world, rand, sbb, rotation, y); - break; - } - - } - - addStairsDown(world, sbb, rotation, y, size - 2, spacing); - if (this.size > 9) - { - // double wide staircase - addStairsDown(world, sbb, rotation, y, size - 3, spacing); - } - } - - rotation += 2;//rand.nextInt(3) > 0 ? 1 : 3; - rotation %= 4; - - // stairs to roof - addStairsDown(world, sbb, rotation, this.height - 1, size - 2, spacing); - } - - /** - * Dark tower half floors - */ - protected void makeHalfFloor(World world, StructureBoundingBox sbb, int rotation, int y, int spacing) - { - this.fillBlocksRotated(world, sbb, size / 2, y, 1, size - 2, y, size - 2, deco.blockID, deco.blockMeta, rotation); - this.fillBlocksRotated(world, sbb, size / 2 - 1, y, 1, size / 2 - 1, y, size - 2, deco.accentID, deco.accentMeta, rotation); - } - - /** - * Dark tower full floors - */ - protected void makeFullFloor(World world, StructureBoundingBox sbb, int rotation, int y, int spacing) - { - // half floor - this.fillWithMetadataBlocks(world, sbb, 1, y, 1, size - 2, y, size - 2, deco.blockID, deco.blockMeta, Blocks.air, 0, false); - this.fillWithMetadataBlocks(world, sbb, size / 2, y, 1, size / 2, y, size - 2, deco.accentID, deco.accentMeta, Blocks.air, 0, true); - } - - /** - * Dark tower treasure rooms! - * @param myDeco - */ - protected void decorateTreasureRoom(World world, StructureBoundingBox sbb, int rotation, int y, int spacing, StructureTFDecorator myDeco) - { - //treasure chest! - int x = this.size / 2; - int z = this.size / 2; - - for (int dy = 1; dy < spacing; dy++) - { - placeBlockRotated(world, myDeco.pillarID, myDeco.pillarMeta, x - 1, y + dy, z - 1, rotation, sbb); - placeBlockRotated(world, myDeco.pillarID, myDeco.pillarMeta, x + 1, y + dy, z - 1, rotation, sbb); - placeBlockRotated(world, myDeco.pillarID, myDeco.pillarMeta, x - 1, y + dy, z + 1, rotation, sbb); - placeBlockRotated(world, myDeco.pillarID, myDeco.pillarMeta, x + 1, y + dy, z + 1, rotation, sbb); - } - - placeBlockRotated(world, myDeco.stairID, getStairMeta(1 + rotation), x + 0, y + 1, z - 1, rotation, sbb); - placeBlockRotated(world, myDeco.stairID, getStairMeta(0 + rotation), x - 1, y + 1, z + 0, rotation, sbb); - placeBlockRotated(world, myDeco.stairID, getStairMeta(2 + rotation), x + 1, y + 1, z + 0, rotation, sbb); - placeBlockRotated(world, myDeco.stairID, getStairMeta(3 + rotation), x + 0, y + 1, z + 1, rotation, sbb); - - for (int dy = 2; dy < spacing - 1; dy++) - { - placeBlockRotated(world, myDeco.fenceID, myDeco.fenceMeta, x + 0, y + dy, z - 1, rotation, sbb); - placeBlockRotated(world, myDeco.fenceID, myDeco.fenceMeta, x - 1, y + dy, z + 0, rotation, sbb); - placeBlockRotated(world, myDeco.fenceID, myDeco.fenceMeta, x + 1, y + dy, z + 0, rotation, sbb); - placeBlockRotated(world, myDeco.fenceID, myDeco.fenceMeta, x + 0, y + dy, z + 1, rotation, sbb); - } - - placeBlockRotated(world, myDeco.stairID, getStairMeta(1 + rotation) + 4, x + 0, y + spacing - 1, z - 1, rotation, sbb); - placeBlockRotated(world, myDeco.stairID, getStairMeta(0 + rotation) + 4, x - 1, y + spacing - 1, z + 0, rotation, sbb); - placeBlockRotated(world, myDeco.stairID, getStairMeta(2 + rotation) + 4, x + 1, y + spacing - 1, z + 0, rotation, sbb); - placeBlockRotated(world, myDeco.stairID, getStairMeta(3 + rotation) + 4, x + 0, y + spacing - 1, z + 1, rotation, sbb); - - placeBlockRotated(world, myDeco.platformID, myDeco.platformMeta, x, y + 1, z, rotation, sbb); - - placeTreasureAtCurrentPosition(world, null, x, y + 2, z, this.isKeyTower() ? TFTreasure.darktower_key : TFTreasure.darktower_cache, sbb); - if (this.isKeyTower()) - { - putItemInTreasure(world, x, y + 2, z, new ItemStack(TFItems.towerKey), sbb); - } - } - - private void decorateSpawner(World world, Random rand, StructureBoundingBox sbb, int rotation, int y) - { - int x = this.size > 9 ? 4 : 3; - int z = this.size > 9 ? 5 : 4; - - String mobID; - - if (this.size > 9) - { - mobID = rand.nextBoolean() ? TFCreatures.getSpawnerNameFor("Tower Golem") : TFCreatures.getSpawnerNameFor("Redscale Broodling"); - } - else - { - mobID = TFCreatures.getSpawnerNameFor("Redscale Broodling"); - } - - // pillar frame - this.makePillarFrame(world, sbb, this.deco, rotation, x, y, z, true); - this.placeSpawnerRotated(world, x + 1, y + 2, z + 1, rotation, mobID, sbb); - } - - /** - * A lounge with a couch and table - */ - private void decorateLounge(World world, Random rand, StructureBoundingBox sbb, int rotation, int y) - { - int cx = this.size > 9 ? 9 : 7; - int cz = this.size > 9 ? 4 : 3; - - placeBlockRotated(world, deco.stairID, this.getStairMeta(3 + rotation), cx, y + 1, cz + 0, rotation, sbb); - placeBlockRotated(world, deco.stairID, this.getStairMeta(0 + rotation), cx, y + 1, cz + 1, rotation, sbb); - placeBlockRotated(world, deco.stairID, this.getStairMeta(1 + rotation), cx, y + 1, cz + 2, rotation, sbb); - - cx = this.size > 9 ? 5 : 3; - - placeBlockRotated(world, deco.stairID, this.getStairMeta(3 + rotation) + 4, cx, y + 1, cz + 0, rotation, sbb); - placeBlockRotated(world, Blocks.wooden_slab, 1 + 8, cx, y + 1, cz + 1, rotation, sbb); - placeBlockRotated(world, deco.stairID, this.getStairMeta(1 + rotation) + 4, cx, y + 1, cz + 2, rotation, sbb); - } - - /** - * Decorate with a pressure plate triggered reappearing floor. Only suitable for small towers - */ - private void decorateReappearingFloor(World world, Random rand, StructureBoundingBox sbb, int rotation, int y) { - // floor - this.fillBlocksRotated(world, sbb, 4, y, 3, 7, y, 5, TFBlocks.towerDevice, BlockTFTowerDevice.META_REAPPEARING_INACTIVE, rotation); - // plates - this.fillBlocksRotated(world, sbb, 4, y + 1, 2, 7, y + 1, 2, Blocks.wooden_pressure_plate, 0, rotation); - this.fillBlocksRotated(world, sbb, 4, y + 1, 6, 7, y + 1, 6, Blocks.wooden_pressure_plate, 0, rotation); - - } - - /** - * Decorate with a redstone device that turns a lamp on or off - */ - private void decorateExperimentLamp(World world, Random rand, StructureBoundingBox sbb, int rotation, int y) { - - int cx = this.size > 9 ? 5 : 3; - int cz = this.size > 9 ? 5 : 4; - - placeBlockRotated(world, Blocks.sticky_piston, 1, cx, y + 1, cz, rotation, sbb); - placeBlockRotated(world, Blocks.redstone_lamp, 0, cx, y + 2, cz, rotation, sbb); - placeBlockRotated(world, deco.accentID, deco.accentMeta, cx, y + 1, cz + 1, rotation, sbb); - placeBlockRotated(world, Blocks.lever, getLeverMeta(rotation, 3), cx, y + 1, cz + 2, rotation, sbb); - placeBlockRotated(world, deco.accentID, deco.accentMeta, cx, y + 3, cz - 1, rotation, sbb); - placeBlockRotated(world, Blocks.lever, getLeverMeta(rotation, 2) + 8, cx, y + 3, cz - 2, rotation, sbb); - } - - /** - * Decorate with a redstone device that pulses a block back and forth - */ - private void decorateExperimentPulser(World world, Random rand, StructureBoundingBox sbb, int rotation, int y) { - - int cx = this.size > 9 ? 6 : 5; - int cz = this.size > 9 ? 4 : 3; - - placeBlockRotated(world, Blocks.sticky_piston, 5 - getStairMeta(3 + rotation), cx, y + 1, cz + 1, rotation, sbb); - placeBlockRotated(world, deco.accentID, deco.accentMeta, cx, y + 1, cz, rotation, sbb); - placeBlockRotated(world, Blocks.redstone_wire, 0, cx + 1, y + 1, cz, rotation, sbb); - placeBlockRotated(world, Blocks.wooden_pressure_plate, 0, cx + 2, y + 1, cz, rotation, sbb); - placeBlockRotated(world, Blocks.unpowered_repeater, (rotation + 1) % 4 + 4, cx - 1, y + 1, cz, rotation, sbb); - placeBlockRotated(world, Blocks.redstone_wire, 0, cx - 2, y + 1, cz, rotation, sbb); - placeBlockRotated(world, Blocks.redstone_wire, 0, cx - 2, y + 1, cz + 1, rotation, sbb); - placeBlockRotated(world, Blocks.redstone_wire, 0, cx - 1, y + 1, cz + 1, rotation, sbb); - - } - - /** - * Decorate with some bookshelves - */ - private void decorateLibrary(World world, Random rand, StructureBoundingBox sbb, int rotation, int y) { - int bx = this.size > 9 ? 4 : 3; - int bz = this.size > 9 ? 3 : 2; - - makeSmallBookshelf(world, sbb, rotation, y, bx, bz); - - bx = this.size > 9 ? 9 : 7; - bz = this.size > 9 ? 3 : 2; - makeSmallBookshelf(world, sbb, rotation, y, bx, bz); - } - - protected void makeSmallBookshelf(World world, StructureBoundingBox sbb, int rotation, int y, int bx, int bz) { - placeBlockRotated(world, deco.stairID, this.getStairMeta(1 + rotation) + 0, bx, y + 1, bz + 0, rotation, sbb); - placeBlockRotated(world, deco.stairID, this.getStairMeta(1 + rotation) + 4, bx, y + 2, bz + 0, rotation, sbb); - placeBlockRotated(world, Blocks.bookshelf, 0, bx, y + 1, bz + 1, rotation, sbb); - placeBlockRotated(world, Blocks.bookshelf, 0, bx, y + 2, bz + 1, rotation, sbb); - placeBlockRotated(world, Blocks.bookshelf, 0, bx, y + 1, bz + 2, rotation, sbb); - placeBlockRotated(world, Blocks.bookshelf, 0, bx, y + 2, bz + 2, rotation, sbb); - placeBlockRotated(world, deco.stairID, this.getStairMeta(3 + rotation) + 0, bx, y + 1, bz + 3, rotation, sbb); - placeBlockRotated(world, deco.stairID, this.getStairMeta(3 + rotation) + 4, bx, y + 2, bz + 3, rotation, sbb); - } - - - /** - * A chest with an extremely simple puzzle - */ - private void decoratePuzzleChest(World world, Random rand, StructureBoundingBox sbb, int rotation, int y) { - int x = this.size > 9 ? 4 : 3; - int z = this.size > 9 ? 5 : 4; - // pillar frame - this.makePillarFrame(world, sbb, this.deco, rotation, x, y, z, true); - - // reinforce with towerwood - placeBlockRotated(world, deco.platformID, deco.platformMeta, x + 1, y + 1, z + 1, rotation, sbb); - placeBlockRotated(world, deco.blockID, deco.blockMeta, x + 2, y + 1, z + 1, rotation, sbb); - placeBlockRotated(world, deco.blockID, deco.blockMeta, x + 0, y + 1, z + 1, rotation, sbb); - placeBlockRotated(world, deco.blockID, deco.blockMeta, x + 1, y + 1, z + 2, rotation, sbb); - placeBlockRotated(world, deco.blockID, deco.blockMeta, x + 1, y + 1, z + 0, rotation, sbb); - - placeBlockRotated(world, deco.blockID, deco.blockMeta, x + 2, y + 3, z + 1, rotation, sbb); - placeBlockRotated(world, deco.blockID, deco.blockMeta, x + 0, y + 3, z + 1, rotation, sbb); - placeBlockRotated(world, deco.blockID, deco.blockMeta, x + 1, y + 3, z + 2, rotation, sbb); - placeBlockRotated(world, Blocks.air, 0, x + 1, y + 3, z + 0, rotation, sbb); - placeBlockRotated(world, deco.blockID, deco.blockMeta, x + 1, y + 3, z + 1, rotation, sbb); - placeBlockRotated(world, Blocks.sticky_piston, 5 - getStairMeta(1 + rotation), x + 1, y + 3, z - 1, rotation, sbb); - placeBlockRotated(world, deco.accentID, deco.accentMeta, x + 1, y + 3, z - 2, rotation, sbb); - placeBlockRotated(world, Blocks.lever, getLeverMeta(rotation, 5), x + 2, y + 3, z - 2, rotation, sbb); - - placeTreasureRotated(world, x + 1, y + 2, z + 1, rotation, TFTreasure.darktower_cache, sbb); - } - - - /** - * Make a 3x3x3 pillar frame - */ - protected void makePillarFrame(World world, StructureBoundingBox sbb, StructureTFDecorator myDeco, int rotation, int x, int y, int z, boolean fenced) - { - makePillarFrame(world, sbb, myDeco, rotation, x, y, z, 3, 3, 3, fenced); - } - - /** - * Place one of the architectural features that I frequently overuse in my structures - */ - protected void makePillarFrame(World world, StructureBoundingBox sbb, StructureTFDecorator myDeco, int rotation, int x, int y, int z, int width, int height, int length, boolean fenced) { - // fill in posts - for (int dx = 0; dx < width; dx++) - { - for (int dz = 0; dz < length; dz++) - { - if ((dx % 3 == 0 || dx == width - 1) && (dz % 3 == 0 || dz == length - 1)) - { - for (int py = 1; py <= height; py++) - { - placeBlockRotated(world, myDeco.pillarID, myDeco.pillarMeta, x + dx, y + py, z + dz, rotation, sbb); - } - } - else - { - if (dx == 0) - { - placeBlockRotated(world, myDeco.stairID, getStairMeta(0 + rotation), x + dx, y + 1, z + dz, rotation, sbb); - placeBlockRotated(world, myDeco.stairID, getStairMeta(0 + rotation) + 4, x + dx, y + height, z + dz, rotation, sbb); - } - else if (dx == width - 1) - { - placeBlockRotated(world, myDeco.stairID, getStairMeta(2 + rotation), x + dx, y + 1, z + dz, rotation, sbb); - placeBlockRotated(world, myDeco.stairID, getStairMeta(2 + rotation) + 4, x + dx, y + height, z + dz, rotation, sbb); - } - else if (dz == 0) - { - placeBlockRotated(world, myDeco.stairID, getStairMeta(1 + rotation), x + dx, y + 1, z + dz, rotation, sbb); - placeBlockRotated(world, myDeco.stairID, getStairMeta(1 + rotation) + 4, x + dx, y + height, z + dz, rotation, sbb); - } - else if (dz == length - 1) - { - placeBlockRotated(world, myDeco.stairID, getStairMeta(3 + rotation), x + dx, y + 1, z + dz, rotation, sbb); - placeBlockRotated(world, myDeco.stairID, getStairMeta(3 + rotation) + 4, x + dx, y + height, z + dz, rotation, sbb); - } - - if (fenced && (dx == 0 || dx == width - 1 || dz == 0 || dz == length - 1)) - { - for (int fy = 2; fy <= height - 1; fy++) - { - placeBlockRotated(world, myDeco.fenceID, myDeco.fenceMeta, x + dx, y + fy, z + dz, rotation, sbb); - } - } - } - } - } - } - - /** - * Find the treasure chest at the specified location and add the specified item to it, if it is not there already - */ - protected void putItemInTreasure(World world, int x, int y, int z, ItemStack itemToAdd, StructureBoundingBox sbb) - { - int dx = getXWithOffset(x, z); - int dy = getYWithOffset(y); - int dz = getZWithOffset(x, z); - if(sbb.isVecInside(dx, dy, dz)) - { - TileEntity tileEntity = world.getTileEntity(dx, dy, dz); - if (tileEntity != null && tileEntity instanceof IInventory) - { - IInventory inventory = (IInventory)tileEntity; - - // check to see if the item is there, also count empty slots - boolean alreadyPresent = false; - int emptySlots = 0; - - for (int i = 0; i < inventory.getSizeInventory(); i++) - { - ItemStack inSlot = inventory.getStackInSlot(i); - - if (inSlot == null) - { - emptySlots++; - } - else - { - if (ItemStack.areItemStacksEqual(inSlot, itemToAdd)) - { - alreadyPresent = true; - break; // may as we;; - } - } - } - - // okay, add it? - if (!alreadyPresent && emptySlots > 0) - { - int slotsUntilPlaced = world.rand.nextInt(emptySlots); - for (int i = 0; i < inventory.getSizeInventory(); i++) - { - ItemStack inSlot = inventory.getStackInSlot(i); - - if (inSlot == null) - { - if (slotsUntilPlaced == 0) - { - inventory.setInventorySlotContents(i, itemToAdd); - break; - } - else - { - slotsUntilPlaced--; - } - } - - } - } - - } - } - } - - - /** - * Dark tower half floors - */ - protected void addStairsDown(World world, StructureBoundingBox sbb, int rotation, int y, int sz, int spacing) { - // stairs - for (int i = 0; i < spacing; i++) - { - int sx = size - 3 - i; - - this.placeBlockRotated(world, deco.stairID, getStairMeta(0 + rotation), sx, y - i, sz, rotation, sbb); - this.placeBlockRotated(world, deco.accentID, deco.accentMeta, sx, y - 1 - i, sz, rotation, sbb); - this.placeBlockRotated(world, Blocks.air, 0, sx, y + 1 - i, sz, rotation, sbb); - this.placeBlockRotated(world, Blocks.air, 0, sx, y + 2 - i, sz, rotation, sbb); - this.placeBlockRotated(world, Blocks.air, 0, sx - 1, y + 2 - i, sz, rotation, sbb); - this.placeBlockRotated(world, Blocks.air, 0, sx, y + 3 - i, sz, rotation, sbb); - this.placeBlockRotated(world, Blocks.air, 0, sx - 1, y + 3 - i, sz, rotation, sbb); - } - } - - /** - * Add a bunch of timber beams - */ - protected void addSmallTimberBeams(World world, Random rand, StructureBoundingBox sbb, int bottom, int top) { - - int spacing = 4; - int rotation = 0; - if (bottom == 0) - { - bottom += spacing; - } - - - // fill with 3/4 floors - for (int y = bottom; y < top; y += spacing) - { - rotation += 1; - rotation %= 4; - - if (y >= top - spacing && isDeadEnd()) - { - makeTimberFloor(world, rand, sbb, rotation, y, spacing); - - StructureTFDecorator logDeco = new StructureDecoratorDarkTower(); - - logDeco.pillarID = TFBlocks.log; - logDeco.pillarMeta = 3; - - logDeco.platformID = TFBlocks.log; - logDeco.pillarMeta = 3; - - decorateTreasureRoom(world, sbb, rotation, y, 4, logDeco); - } - else - { - makeSmallTimberBeams(world, rand, sbb, rotation, y, y == bottom && bottom != spacing, y >= (top - spacing)); - } - } - - - } - - /** - * Make a mostly soid timber floor - */ - protected void makeTimberFloor(World world, Random rand, StructureBoundingBox sbb, int rotation, int y, int spacing) - { - Block beamID = TFBlocks.log; - int beamMetaBase = 3; - - int beamMetaNS = ((this.coordBaseMode + rotation) % 2 == 0) ? 4 : 8; - int beamMetaEW = (beamMetaNS == 4) ? 8 : 4; - int beamMetaUD = 0; - - for (int z = 1; z < size - 1; z++) - { - for (int x = 1; x < size - 1; x++) - { - if (x < z) - { - placeBlockRotated(world, beamID, beamMetaBase + beamMetaNS, x, y, z, rotation, sbb); - } - else - { - placeBlockRotated(world, beamID, beamMetaBase + beamMetaEW, x, y, z, rotation, sbb); - } - } - } - - // beams going down - for (int by = 1; by < 4; by++) - { - placeBlockRotated(world, beamID, beamMetaBase + beamMetaUD, 2, y - by, 2, rotation, sbb); - placeBlockRotated(world, Blocks.ladder, getLadderMeta(2 + rotation), 2 + 1, y - by, 2, rotation, sbb); - placeBlockRotated(world, beamID, beamMetaBase + beamMetaUD, 6, y - by, 6, rotation, sbb); - placeBlockRotated(world, Blocks.ladder, getLadderMeta(4 + rotation), 6 - 1, y - by, 6, rotation, sbb); - } - - // holes for entrance - placeBlockRotated(world, Blocks.air, 0, 3, y, 2, rotation, sbb); - placeBlockRotated(world, Blocks.air, 0, 5, y, 6, rotation, sbb); - } - - - /** - * Make a lattice of log blocks - */ - protected void makeSmallTimberBeams(World world, Random rand, StructureBoundingBox sbb, int rotation, int y, boolean bottom, boolean top) - { - Block beamID = TFBlocks.log; - int beamMetaBase = 3; - - int beamMetaNS = ((this.coordBaseMode + rotation) % 2 == 0) ? 4 : 8; - int beamMetaEW = (beamMetaNS == 4) ? 8 : 4; - int beamMetaUD = 0; - - // two beams going e/w - for (int z = 1; z < size - 1; z++) - { - placeBlockRotated(world, beamID, beamMetaBase + beamMetaEW, 2, y, z, rotation, sbb); - placeBlockRotated(world, beamID, beamMetaBase + beamMetaEW, 6, y, z, rotation, sbb); - } - - // a few random cross beams - int z = pickBetweenExcluding(3, size - 3, rand, 2, 2, 6); - for (int x = 3; x < 6; x++) - { - placeBlockRotated(world, beamID, beamMetaBase + beamMetaNS, x, y, z, rotation, sbb); - } - - // beams going down - int x1 = 2; - int z1 = rand.nextBoolean() ? 2 : 6; - int x3 = 6; - int z3 = rand.nextBoolean() ? 2 : 6; - - for (int by = 1; by < 4; by++) - { - if (!bottom || checkPost(world, x1, y - 4, z1, rotation, sbb)) - { - placeBlockRotated(world, beamID, beamMetaBase + beamMetaUD, x1, y - by, z1, rotation, sbb); - placeBlockRotated(world, Blocks.ladder, getLadderMeta(2 + rotation), x1 + 1, y - by, z1, rotation, sbb); - } - if (!bottom || checkPost(world, x3, y - 4, z3, rotation, sbb)) - { - placeBlockRotated(world, beamID, beamMetaBase + beamMetaUD, x3, y - by, z3, rotation, sbb); - placeBlockRotated(world, Blocks.ladder, getLadderMeta(4 + rotation), x3 - 1, y - by, z3, rotation, sbb); - } - } - -// // do we need a beam going up? -// if (top) -// { -// int ladderX = !checkPost(world, 4, y + 5, 9) ? 4 : 14; -// int ladderZ = !checkPost(world, ladderX, y + 5, 10) ? 10 : 8; -// int ladderMeta = (ladderZ == 10) ? 3 : 5; -// for (int by = 1; by < 5; by++) -// { -// placeBlockAtCurrentPosition(world, beamID, beamMetaBase + beamMetaUD, ladderX, y + by, 9, sbb); -// placeBlockAtCurrentPosition(world, Blocks.ladder, getLadderMeta(ladderMeta), ladderX, y + by, ladderZ, sbb); -// } -// -// // fence thing -// placeBlockAtCurrentPosition(world, Blocks.air, 0, ladderX, y + 6, 9, sbb); -// placeBlockAtCurrentPosition(world, deco.fenceID, deco.fenceMeta, ladderX + 1, y + 5, ladderZ, sbb); -// placeBlockAtCurrentPosition(world, deco.fenceID, deco.fenceMeta, ladderX - 1, y + 5, ladderZ, sbb); -// placeBlockAtCurrentPosition(world, deco.fenceID, deco.fenceMeta, ladderX + 1, y + 6, ladderZ, sbb); -// placeBlockAtCurrentPosition(world, deco.fenceID, deco.fenceMeta, ladderX - 1, y + 6, ladderZ, sbb); -// } -// -// if (!bottom && !top) -// { -// // spawners -// int sx = pickFrom(rand, 6, 7, 11); -// int sz = pickFrom(rand, 6, 11, 12); -// -// TileEntityMobSpawner spawner = placeSpawnerAtCurrentPosition(world, rand, sx, y + 2, sz, TFCreatures.getSpawnerNameFor("Mini Ghast"), sbb); -// -// if (spawner != null) -// { -// ; -// } -// -// } -// -// // lamps -// int lx = pickFrom(rand, 2, 12, 16); -// int lz = 2 + rand.nextInt(15); -// -// placeBlockAtCurrentPosition(world, Blocks.redstone_lamp, 0, lx, y + 2, lz, sbb); -// placeBlockAtCurrentPosition(world, Blocks.lever, 7, lx, y + 1, lz, sbb); - } - - - - /** - * Utility function to pick a random number between two values, excluding three specified values - */ - protected int pickBetweenExcluding(int low, int high, Random rand, int k, int l, int m) - { - int result; - - do - { - result = rand.nextInt(high - low) + low; - } - while (result == k || result == l || result == m); - - return result; - } - - - /** - * Pick one of the three specified values at random - */ - protected int pickFrom(Random rand, int i, int j, int k) { - switch (rand.nextInt(3)) - { - case 0: - default: - return i; - case 1 : - return j; - case 2: - return k; - } - } - - - /** - * Utility function for beam maze that checks if we should build a beam all the way down -- is there a valid spot to end it? - */ - protected boolean checkPost(World world, int x, int y, int z, int rotation, StructureBoundingBox sbb) - { - int worldX = this.getXWithOffsetAsIfRotated(x, z, rotation); - int worldY = this.getYWithOffset(y); - int worldZ = this.getZWithOffsetAsIfRotated(x, z, rotation); - - Block blockID = sbb.isVecInside(worldX, worldY, worldZ) ? world.getBlock(worldX, worldY, worldZ) : Blocks.air; - - return !(blockID == Blocks.air || (blockID == deco.accentID && world.getBlockMetadata(worldX, worldY, worldZ) == deco.accentMeta)); - } - - - /** - * Generate walls for the tower with the distinct pattern of blocks and accent blocks - * @param rand - */ - protected void makeEncasedWalls(World world, Random rand, StructureBoundingBox sbb, int minX, int minY, int minZ, int maxX, int maxY, int maxZ) - { - - for (int x = minX; x <= maxX; x++) - { - for (int y = minY; y <= maxY; y++) - { - for (int z = minZ; z <= maxZ; z++) - { - if (x != minX && x != maxX && y != minY && y != maxY && z != minZ && z != maxZ) - { - ; - } - else - { - // wall - if (((x == minY || x == maxX) && ((y == minY || y == maxY) || (z == minZ || z == maxZ))) - || ((y == minY || y == maxY) && ((x == minY || x == maxX) || (z == minZ || z == maxZ))) - || ((z == minZ || z == maxZ) && ((x == minY || x == maxX) || (y == minY || y == maxY)))) - { - this.placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, x, y, z, sbb); - } -// else if (this.isKeyTower()) -// { -// this.placeBlockAtCurrentPosition(world, Blocks.diamond_block, 0, x, y, z, sbb); -// } - else - { - StructureComponent.BlockSelector blocker = deco.randomBlocks; - - blocker.selectBlocks(rand, x, y, z, true); - this.placeBlockAtCurrentPosition(world, blocker.func_151561_a(), blocker.getSelectedBlockMetaData(), x, y, z, sbb); - - - //this.placeBlockAtCurrentPosition(world, deco.blockID, deco.blockMeta, x, y, z, sbb); - } - } - } - } - } - - // corners - this.placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, minX + 1, minY + 1, minZ, sbb); - this.placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, minX + 1, minY + 1, maxZ, sbb); - this.placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, maxX - 1, minY + 1, minZ, sbb); - this.placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, maxX - 1, minY + 1, maxZ, sbb); - this.placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, minX + 1, maxY - 1, minZ, sbb); - this.placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, minX + 1, maxY - 1, maxZ, sbb); - this.placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, maxX - 1, maxY - 1, minZ, sbb); - this.placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, maxX - 1, maxY - 1, maxZ, sbb); - - this.placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, minX, minY + 1, minZ + 1, sbb); - this.placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, minX, minY + 1, maxZ - 1, sbb); - this.placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, maxX, minY + 1, minZ + 1, sbb); - this.placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, maxX, minY + 1, maxZ - 1, sbb); - this.placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, minX, maxY - 1, minZ + 1, sbb); - this.placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, minX, maxY - 1, maxZ - 1, sbb); - this.placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, maxX, maxY - 1, minZ + 1, sbb); - this.placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, maxX, maxY - 1, maxZ - 1, sbb); - - this.placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, minX + 1, minY, minZ + 1, sbb); - this.placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, minX + 1, minY, maxZ - 1, sbb); - this.placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, maxX - 1, minY, minZ + 1, sbb); - this.placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, maxX - 1, minY, maxZ - 1, sbb); - this.placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, minX + 1, maxY, minZ + 1, sbb); - this.placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, minX + 1, maxY, maxZ - 1, sbb); - this.placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, maxX - 1, maxY, minZ + 1, sbb); - this.placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, maxX - 1, maxY, maxZ - 1, sbb); - - } - - - /** - * Gets a random position in the specified direction that connects to a floor currently in the tower. - */ - @Override - public int[] getValidOpening(Random rand, int direction) { - int verticalOffset = this.size == 19 ? 5 : 4; - - // for directions 0 or 2, the wall lies along the z axis - if (direction == 0 || direction == 2) { - int rx = direction == 0 ? size - 1 : 0; - int rz = this.size / 2; - int ry = this.height - verticalOffset; - - return new int[] {rx, ry, rz}; - } - - // for directions 1 or 3, the wall lies along the x axis - if (direction == 1 || direction == 3) { - int rx = this.size / 2; - int rz = direction == 1 ? size - 1 : 0; - int ry = this.height - verticalOffset; - - return new int[] {rx, ry, rz}; - } - - - return new int[] {0, 0, 0}; - } - - /** - * Add an opening to the outside (or another tower) in the specified direction. - */ - public void addOpening(int dx, int dy, int dz, int direction) { - this.addOpening(dx, dy, dz, direction, EnumDarkTowerDoor.VANISHING); - } - - - /** - * Add an opening where we keep track of the kind of opening - * TODO: we could make a type of object that stores all these values - * TODO: also use an Enum for the kinds of openings? - */ - protected void addOpening(int dx, int dy, int dz, int direction, EnumDarkTowerDoor type) - { - super.addOpening(dx, dy, dz, direction); - this.openingTypes.add(openings.indexOf(new ChunkCoordinates(dx, dy, dz)), type); - } - - /** - * Iterate through the openings on our list and add them to the tower - */ - @Override - protected void makeOpenings(World world, StructureBoundingBox sbb) - { - for (int i = 0; i < openings.size(); i++) - { - ChunkCoordinates doorCoords = openings.get(i); - - EnumDarkTowerDoor doorType; - if (openingTypes.size() > i) - { - doorType = openingTypes.get(i); - } - else - { - doorType = EnumDarkTowerDoor.VANISHING; - } - - switch (doorType) - { - case VANISHING : - default: - makeDoorOpening(world, doorCoords.posX, doorCoords.posY, doorCoords.posZ, sbb); - break; - case REAPPEARING : - makeReappearingDoorOpening(world, doorCoords.posX, doorCoords.posY, doorCoords.posZ, sbb); - break; - case LOCKED : - makeLockedDoorOpening(world, doorCoords.posX, doorCoords.posY, doorCoords.posZ, sbb); - break; - } - - } - } - - /** - * Make an opening in this tower for a door. - */ - @Override - protected void makeDoorOpening(World world, int dx, int dy, int dz, StructureBoundingBox sbb) { - // nullify sky light - nullifySkyLightAtCurrentPosition(world, dx - 3, dy - 1, dz - 3, dx + 3, dy + 3, dz + 3); - - // clear the door - if (dx == 0 || dx == size - 1) - { - this.fillWithMetadataBlocks(world, sbb, dx, dy - 1, dz - 2, dx, dy + 3, dz + 2, deco.accentID, deco.accentMeta, Blocks.air, 0, false); - this.fillWithMetadataBlocks(world, sbb, dx, dy, dz - 1, dx, dy + 2, dz + 1, TFBlocks.towerDevice, BlockTFTowerDevice.META_VANISH_INACTIVE, Blocks.air, 0, false); - } - if (dz == 0 || dz == size - 1) - { - this.fillWithMetadataBlocks(world, sbb, dx - 2, dy - 1, dz, dx + 2, dy + 3, dz, deco.accentID, deco.accentMeta, Blocks.air, 0, false); - this.fillWithMetadataBlocks(world, sbb, dx - 1, dy, dz, dx + 1, dy + 2, dz, TFBlocks.towerDevice, BlockTFTowerDevice.META_VANISH_INACTIVE, Blocks.air, 0, false); - } - } - - /** - * Make a 3x3 tower door that reappears - */ - protected void makeReappearingDoorOpening(World world, int dx, int dy, int dz, StructureBoundingBox sbb) - { - // nullify sky light - nullifySkyLightAtCurrentPosition(world, dx - 3, dy - 1, dz - 3, dx + 3, dy + 3, dz + 3); - - // clear the door - if (dx == 0 || dx == size - 1) - { - this.fillWithMetadataBlocks(world, sbb, dx, dy - 1, dz - 2, dx, dy + 3, dz + 2, deco.accentID, deco.accentMeta, Blocks.air, 0, false); - this.fillWithMetadataBlocks(world, sbb, dx, dy, dz - 1, dx, dy + 2, dz + 1, TFBlocks.towerDevice, BlockTFTowerDevice.META_REAPPEARING_INACTIVE, Blocks.air, 0, false); - } - if (dz == 0 || dz == size - 1) - { - this.fillWithMetadataBlocks(world, sbb, dx - 2, dy - 1, dz, dx + 2, dy + 3, dz, deco.accentID, deco.accentMeta, Blocks.air, 0, false); - this.fillWithMetadataBlocks(world, sbb, dx - 1, dy, dz, dx + 1, dy + 2, dz, TFBlocks.towerDevice, BlockTFTowerDevice.META_REAPPEARING_INACTIVE, Blocks.air, 0, false); - } - } - - - /** - * Make a 3x3 tower door that is locked - */ - protected void makeLockedDoorOpening(World world, int dx, int dy, int dz, StructureBoundingBox sbb) - { - // nullify sky light - nullifySkyLightAtCurrentPosition(world, dx - 3, dy - 1, dz - 3, dx + 3, dy + 3, dz + 3); - - // clear the door - if (dx == 0 || dx == size - 1) - { - this.fillWithMetadataBlocks(world, sbb, dx, dy - 1, dz - 2, dx, dy + 3, dz + 2, deco.accentID, deco.accentMeta, Blocks.air, 0, false); - this.fillWithMetadataBlocks(world, sbb, dx, dy, dz - 1, dx, dy + 2, dz + 1, TFBlocks.towerDevice, BlockTFTowerDevice.META_VANISH_INACTIVE, Blocks.air, 0, false); - this.placeBlockAtCurrentPosition(world, TFBlocks.towerDevice, BlockTFTowerDevice.META_VANISH_LOCKED, dx, dy + 0, dz + 1, sbb); - this.placeBlockAtCurrentPosition(world, TFBlocks.towerDevice, BlockTFTowerDevice.META_VANISH_LOCKED, dx, dy + 0, dz - 1, sbb); - this.placeBlockAtCurrentPosition(world, TFBlocks.towerDevice, BlockTFTowerDevice.META_VANISH_LOCKED, dx, dy + 2, dz + 1, sbb); - this.placeBlockAtCurrentPosition(world, TFBlocks.towerDevice, BlockTFTowerDevice.META_VANISH_LOCKED, dx, dy + 2, dz - 1, sbb); - } - if (dz == 0 || dz == size - 1) - { - this.fillWithMetadataBlocks(world, sbb, dx - 2, dy - 1, dz, dx + 2, dy + 3, dz, deco.accentID, deco.accentMeta, Blocks.air, 0, false); - this.fillWithMetadataBlocks(world, sbb, dx - 1, dy, dz, dx + 1, dy + 2, dz, TFBlocks.towerDevice, BlockTFTowerDevice.META_VANISH_INACTIVE, Blocks.air, 0, false); - this.placeBlockAtCurrentPosition(world, TFBlocks.towerDevice, BlockTFTowerDevice.META_VANISH_LOCKED, dx + 1, dy + 0, dz, sbb); - this.placeBlockAtCurrentPosition(world, TFBlocks.towerDevice, BlockTFTowerDevice.META_VANISH_LOCKED, dx - 1, dy + 0, dz, sbb); - this.placeBlockAtCurrentPosition(world, TFBlocks.towerDevice, BlockTFTowerDevice.META_VANISH_LOCKED, dx + 1, dy + 2, dz, sbb); - this.placeBlockAtCurrentPosition(world, TFBlocks.towerDevice, BlockTFTowerDevice.META_VANISH_LOCKED, dx - 1, dy + 2, dz, sbb); - } - } - - - /** - * Returns true if this tower has only one exit. - * - * TODO: is this really the best way? - */ - public boolean isDeadEnd() - { - // we have to modify this to ignore door type 2 since that leads to balconies - int nonBalconies = 0; - - for (EnumDarkTowerDoor type : openingTypes) - { - if (type != EnumDarkTowerDoor.REAPPEARING) - { - nonBalconies++; - } - } - - return nonBalconies <= 1; - } - - - public boolean isKeyTower() - { - return keyTower; - } - - - public void setKeyTower(boolean keyTower) - { - this.keyTower = keyTower; - } - - /** - * WHY ARE LEVERS SO DUMMM? - */ - protected int getLeverMeta(int rotation, int direction) - { - if (direction == 0) - { - return 0; - } - if (direction == 1) - { - return 5; - } - - rotation += this.getCoordBaseMode(); - rotation %= 4; - - if (rotation == 0) - { - switch (direction) - { - case 2: - return 4; - case 3: - return 3; - case 4: - return 2; - case 5: - return 1; - } - } - else if (rotation == 1) - { - switch (direction) - { - case 2: - return 1; - case 3: - return 2; - case 4: - return 4; - case 5: - return 3; - } - } - else if (rotation == 2) - { - switch (direction) - { - case 2: - return 3; - case 3: - return 4; - case 4: - return 1; - case 5: - return 2; - } - } - else if (rotation == 3) - { - switch (direction) - { - case 2: - return 2; - case 3: - return 1; - case 4: - return 3; - case 5: - return 4; - } - } - - return -1; // NOOO - } - - - - - - -} diff --git a/src/main/java/twilightforest/structures/darktower/EnumDarkTowerDoor.java b/src/main/java/twilightforest/structures/darktower/EnumDarkTowerDoor.java deleted file mode 100644 index e473e11318..0000000000 --- a/src/main/java/twilightforest/structures/darktower/EnumDarkTowerDoor.java +++ /dev/null @@ -1,8 +0,0 @@ -package twilightforest.structures.darktower; - -public enum EnumDarkTowerDoor -{ - VANISHING, - REAPPEARING, - LOCKED -} diff --git a/src/main/java/twilightforest/structures/darktower/StructureDecoratorDarkTower.java b/src/main/java/twilightforest/structures/darktower/StructureDecoratorDarkTower.java deleted file mode 100644 index b311459c1d..0000000000 --- a/src/main/java/twilightforest/structures/darktower/StructureDecoratorDarkTower.java +++ /dev/null @@ -1,31 +0,0 @@ -package twilightforest.structures.darktower; - -import net.minecraft.init.Blocks; -import twilightforest.block.TFBlocks; -import twilightforest.structures.StructureTFDecorator; - -public class StructureDecoratorDarkTower extends StructureTFDecorator -{ - - public StructureDecoratorDarkTower() - { - this.blockID = TFBlocks.towerWood; - this.blockMeta = 0; - - this.accentID = TFBlocks.towerWood; - this.accentMeta = 1; - - this.fenceID = Blocks.fence; - - this.stairID = Blocks.spruce_stairs; - - this.pillarID = TFBlocks.towerWood; - this.pillarMeta = 1; - - this.platformID = TFBlocks.towerWood;; - this.platformMeta = 1; - - this.randomBlocks = new StructureTFTowerWoods(); - } - -} diff --git a/src/main/java/twilightforest/structures/darktower/StructureTFTowerWoods.java b/src/main/java/twilightforest/structures/darktower/StructureTFTowerWoods.java deleted file mode 100644 index f3df540905..0000000000 --- a/src/main/java/twilightforest/structures/darktower/StructureTFTowerWoods.java +++ /dev/null @@ -1,42 +0,0 @@ -package twilightforest.structures.darktower; - -import java.util.Random; - -import net.minecraft.init.Blocks; -import net.minecraft.world.gen.structure.StructureComponent; -import twilightforest.block.TFBlocks; - -public class StructureTFTowerWoods extends StructureComponent.BlockSelector { - - @Override - public void selectBlocks(Random par1Random, int x, int y, int z, boolean isWall) { - if (!isWall) - { - this.field_151562_a = Blocks.air; - this.selectedBlockMetaData = 0; - } - else - { - this.field_151562_a = TFBlocks.towerWood; - float randFloat = par1Random.nextFloat(); - - if (randFloat < 0.1F) - { - this.selectedBlockMetaData = 2; - } - else if (randFloat < 0.2F) - { - this.selectedBlockMetaData = 3; - } - else if (randFloat < 0.225F) - { - this.selectedBlockMetaData = 4; - } - else - { - this.selectedBlockMetaData = 0; - } - } - } - -} diff --git a/src/main/java/twilightforest/structures/darktower/TFDarkTowerPieces.java b/src/main/java/twilightforest/structures/darktower/TFDarkTowerPieces.java deleted file mode 100644 index a7d6c45519..0000000000 --- a/src/main/java/twilightforest/structures/darktower/TFDarkTowerPieces.java +++ /dev/null @@ -1,28 +0,0 @@ -package twilightforest.structures.darktower; - -import net.minecraft.world.gen.structure.MapGenStructureIO; - - -public class TFDarkTowerPieces { - - public static void registerPieces() - { - MapGenStructureIO.func_143031_a(ComponentTFDarkTowerBalcony.class, "TFDTBal"); - MapGenStructureIO.func_143031_a(ComponentTFDarkTowerBeard.class, "TFDTBea"); - MapGenStructureIO.func_143031_a(ComponentTFDarkTowerBossBridge.class, "TFDTBB"); - MapGenStructureIO.func_143031_a(ComponentTFDarkTowerBossTrap.class, "TFDTBT"); - MapGenStructureIO.func_143031_a(ComponentTFDarkTowerBridge.class, "TFDTBri"); - MapGenStructureIO.func_143031_a(ComponentTFDarkTowerEntrance.class, "TFDTEnt"); - MapGenStructureIO.func_143031_a(ComponentTFDarkTowerEntranceBridge.class, "TFDTEB"); - MapGenStructureIO.func_143031_a(ComponentTFDarkTowerMain.class, "TFDTMai"); - MapGenStructureIO.func_143031_a(ComponentTFDarkTowerMainBridge.class, "TFDTMB"); - MapGenStructureIO.func_143031_a(ComponentTFDarkTowerRoof.class, "TFDTRooS"); - MapGenStructureIO.func_143031_a(ComponentTFDarkTowerRoofAntenna.class, "TFDTRA"); - MapGenStructureIO.func_143031_a(ComponentTFDarkTowerRoofCactus.class, "TFDTRC"); - MapGenStructureIO.func_143031_a(ComponentTFDarkTowerRoofFourPost.class, "TFDTRFP"); - MapGenStructureIO.func_143031_a(ComponentTFDarkTowerRoofRings.class, "TFDTRR"); - MapGenStructureIO.func_143031_a(ComponentTFDarkTowerWing.class, "TFDTWin"); - - } - -} \ No newline at end of file diff --git a/src/main/java/twilightforest/structures/hollowtree/ComponentTFHollowTreeLargeBranch.java b/src/main/java/twilightforest/structures/hollowtree/ComponentTFHollowTreeLargeBranch.java deleted file mode 100644 index 10ed21efc1..0000000000 --- a/src/main/java/twilightforest/structures/hollowtree/ComponentTFHollowTreeLargeBranch.java +++ /dev/null @@ -1,128 +0,0 @@ -package twilightforest.structures.hollowtree; - -import java.util.List; -import java.util.Random; - -import net.minecraft.util.ChunkCoordinates; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import net.minecraft.world.gen.structure.StructureComponent; -import twilightforest.block.TFBlocks; -import twilightforest.world.TFGenerator; - - -public class ComponentTFHollowTreeLargeBranch extends ComponentTFHollowTreeMedBranch { - - private static final int LEAF_DUNGEON_CHANCE = 8; - public boolean hasLeafDungeon = false; - - public ComponentTFHollowTreeLargeBranch() { - super(); - } - - protected ComponentTFHollowTreeLargeBranch(int i, int sx, int sy, int sz, double length, double angle, double tilt, boolean leafy) { - super(i, sx, sy, sz, length, angle, tilt, leafy); - } - - /** - * Add other structure components to this one if needed - */ - @Override - public void buildComponent(StructureComponent structurecomponent, List list, Random rand) { - int index = getComponentType(); - - // go about halfway out and make a few medium branches. - // the number of medium branches we can support depends on the length of the big branch - // every other branch switches sides - int numMedBranches = rand.nextInt((int)(length / 6)) + (int)(length / 8); - - for(int i = 0; i <= numMedBranches; i++) { - - double outVar = (rand.nextDouble() * 0.3) + 0.3; - double angleVar = rand.nextDouble() * 0.225 * ((i & 1) == 0 ? 1.0 : -1.0); - ChunkCoordinates bsrc = TFGenerator.translateCoords(src.posX, src.posY, src.posZ, length * outVar, angle, tilt); - - makeMedBranch(list, rand, index + 2 + i, bsrc.posX, bsrc.posY, bsrc.posZ, length * 0.6, angle + angleVar, tilt, leafy); - } - -// // make 1-2 small ones near the base -// int numSmallBranches = rand.nextInt(2) + 1; -// for(int i = 0; i <= numSmallBranches; i++) { -// -// double outVar = (rand.nextDouble() * 0.25) + 0.25; -// double angleVar = rand.nextDouble() * 0.25 * ((i & 1) == 0 ? 1.0 : -1.0); -// ChunkCoordinates bsrc = TFGenerator.translateCoords(src.posX, src.posY, src.posZ, length * outVar, angle, tilt); -// -// makeSmallBranch(list, rand, index + numMedBranches + 1 + i, bsrc.posX, bsrc.posY, bsrc.posZ, Math.max(length * 0.3, 2), angle + angleVar, tilt, leafy); -// } - - this.hasLeafDungeon = (rand.nextInt(LEAF_DUNGEON_CHANCE) == 0); - - if (this.hasLeafDungeon) - { - makeLeafDungeon(list, rand, index + 1, dest.posX, dest.posY, dest.posZ); - } - - } - - public void makeLeafDungeon(List list, Random rand, int index, int x, int y, int z) { - ComponentTFHollowTreeLeafDungeon dungeon = new ComponentTFHollowTreeLeafDungeon(index, x, y, z, 4); - list.add(dungeon); - dungeon.buildComponent(this, list, rand); - } - - public void makeMedBranch(List list, Random rand, int index, int x, int y, int z, double branchLength, double branchRotation, double branchAngle, boolean leafy) { - ComponentTFHollowTreeMedBranch branch = new ComponentTFHollowTreeMedBranch(index, x, y, z, branchLength, branchRotation, branchAngle, leafy); - list.add(branch); - branch.buildComponent(this, list, rand); - } - - -// public void makeSmallBranch(List list, Random rand, int index, int x, int y, int z, double branchLength, double branchRotation, double branchAngle, boolean leafy) { -// ComponentTFHollowTreeSmallBranch branch = new ComponentTFHollowTreeSmallBranch(index, x, y, z, branchLength, branchRotation, branchAngle, leafy); -// list.add(branch); -// branch.buildComponent(this, list, rand); -// } - - - /** - * Draw this branch - */ - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - - ChunkCoordinates rsrc = new ChunkCoordinates(src.posX - boundingBox.minX, src.posY - boundingBox.minY, src.posZ - boundingBox.minZ); - ChunkCoordinates rdest = new ChunkCoordinates(dest.posX - boundingBox.minX, dest.posY - boundingBox.minY, dest.posZ - boundingBox.minZ); - - // main branch - drawBresehnam(world, sbb, rsrc.posX, rsrc.posY, rsrc.posZ, rdest.posX, rdest.posY, rdest.posZ, TFBlocks.log, 12); - - // reinforce it - int reinforcements = 4; - for(int i = 0; i <= reinforcements; i++) { - int vx = (i & 2) == 0 ? 1 : 0; - int vy = (i & 1) == 0 ? 1 : -1; - int vz = (i & 2) == 0 ? 0 : 1; - drawBresehnam(world, sbb, rsrc.posX + vx, rsrc.posY + vy, rsrc.posZ + vz, rdest.posX, rdest.posY, rdest.posZ, TFBlocks.log, 12); - } - - // make 1-2 small branches near the base - Random decoRNG = new Random(world.getSeed() + (this.boundingBox.minX * 321534781) ^ (this.boundingBox.minZ * 756839)); - int numSmallBranches = decoRNG.nextInt(2) + 1; - for(int i = 0; i <= numSmallBranches; i++) { - - double outVar = (decoRNG.nextFloat() * 0.25F) + 0.25F; - double angleVar = decoRNG.nextFloat() * 0.25F * ((i & 1) == 0 ? 1.0F : -1.0F); - ChunkCoordinates bsrc = TFGenerator.translateCoords(rsrc.posX, rsrc.posY, rsrc.posZ, length * outVar, angle, tilt); - - drawSmallBranch(world, sbb, bsrc.posX, bsrc.posY, bsrc.posZ, Math.max(length * 0.3F, 2F), angle + angleVar, tilt, leafy); - } - - if (leafy && !this.hasLeafDungeon) { - // leaf blob at the end - makeLeafBlob(world, sbb, rdest.posX, rdest.posY, rdest.posZ, 3); - } - - return true; - } -} diff --git a/src/main/java/twilightforest/structures/hollowtree/ComponentTFHollowTreeLeafDungeon.java b/src/main/java/twilightforest/structures/hollowtree/ComponentTFHollowTreeLeafDungeon.java deleted file mode 100644 index f80c91cf1f..0000000000 --- a/src/main/java/twilightforest/structures/hollowtree/ComponentTFHollowTreeLeafDungeon.java +++ /dev/null @@ -1,178 +0,0 @@ -package twilightforest.structures.hollowtree; - -import java.util.List; -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.init.Blocks; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import net.minecraft.world.gen.structure.StructureComponent; -import twilightforest.TFTreasure; -import twilightforest.block.TFBlocks; -import twilightforest.entity.TFCreatures; -import twilightforest.structures.StructureTFComponent; - - -/** - * A blob of leaves used to make trees - * - * @author Ben - * - */ -public class ComponentTFHollowTreeLeafDungeon extends StructureTFComponent { - - int radius; // radius - - - public ComponentTFHollowTreeLeafDungeon() { - super(); - } - - /** - * Make a blob of leaves - * - * @param index - * @param x - * @param y - * @param z - * @param radius - */ - protected ComponentTFHollowTreeLeafDungeon(int index, int x, int y, int z, int radius) { - super(index); - - this.setCoordBaseMode(0); - - boundingBox = new StructureBoundingBox(x - radius, y - radius, z - radius, x + radius, y + radius, z + radius); - this.radius = radius; - } - - /** - * Save to NBT - */ - @Override - protected void func_143012_a(NBTTagCompound par1NBTTagCompound) { - super.func_143012_a(par1NBTTagCompound); - - par1NBTTagCompound.setInteger("leafRadius", this.radius); - - } - - /** - * Load from NBT - */ - @Override - protected void func_143011_b(NBTTagCompound par1NBTTagCompound) { - super.func_143011_b(par1NBTTagCompound); - - this.radius = par1NBTTagCompound.getInteger("leafRadius"); - } - - /** - * Add other structure components to this one if needed - */ - @Override - public void buildComponent(StructureComponent structurecomponent, List list, Random rand) { - // the bounding box should be cubical, so we can rotate freely - this.setCoordBaseMode(rand.nextInt(4)); - } - - /** - * Draw a giant blob of whatevs (okay, it's going to be leaves). - */ - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - - // leaves on the outside - drawBlockBlob(world, sbb, radius, radius, radius, 4, TFBlocks.leaves, 0, true); - // then wood - drawBlockBlob(world, sbb, radius, radius, radius, 3, TFBlocks.log, 12, false); - // then air - drawBlockBlob(world, sbb, radius, radius, radius, 2, Blocks.air, 0, false); - - // then treasure chest - // which direction is this chest in? - this.placeTreasureAtCurrentPosition(world, rand, radius + 2, radius - 1, radius, TFTreasure.tree_cache, sbb); - - // then spawner - placeSpawnerAtCurrentPosition(world, rand, radius, radius, radius, TFCreatures.getSpawnerNameFor("Swarm Spider"), sbb); - - return true; - } - - private void drawBlockBlob(World world, StructureBoundingBox sbb, int sx, int sy, int sz, int blobRadius, Block blockID, int metadata, boolean isLeaves) { - // then trace out a quadrant - for (byte dx = 0; dx <= blobRadius; dx++) - { - for (byte dy = 0; dy <= blobRadius; dy++) - { - for (byte dz = 0; dz <= blobRadius; dz++) - { - // determine how far we are from the center. - byte dist = 0; - - if (dx >= dy && dx >= dz) { - dist = (byte) (dx + (byte)((Math.max(dy, dz) * 0.5) + (Math.min(dy, dz) * 0.25))); - } else if (dy >= dx && dy >= dz) - { - dist = (byte) (dy + (byte)((Math.max(dx, dz) * 0.5) + (Math.min(dx, dz) * 0.25))); - } else { - dist = (byte) (dz + (byte)((Math.max(dx, dy) * 0.5) + (Math.min(dx, dy) * 0.25))); - } - - - // if we're inside the blob, fill it - if (dist <= blobRadius) { - // do eight at a time for easiness! - if (isLeaves) - { - placeLeafBlock(world, blockID, metadata, sx + dx, sy + dy, sz + dz, sbb); - placeLeafBlock(world, blockID, metadata, sx + dx, sy + dy, sz - dz, sbb); - placeLeafBlock(world, blockID, metadata, sx - dx, sy + dy, sz + dz, sbb); - placeLeafBlock(world, blockID, metadata, sx - dx, sy + dy, sz - dz, sbb); - placeLeafBlock(world, blockID, metadata, sx + dx, sy - dy, sz + dz, sbb); - placeLeafBlock(world, blockID, metadata, sx + dx, sy - dy, sz - dz, sbb); - placeLeafBlock(world, blockID, metadata, sx - dx, sy - dy, sz + dz, sbb); - placeLeafBlock(world, blockID, metadata, sx - dx, sy - dy, sz - dz, sbb); - } - else - { - this.placeBlockAtCurrentPosition(world, blockID, metadata, sx + dx, sy + dy, sz + dz, sbb); - this.placeBlockAtCurrentPosition(world, blockID, metadata, sx + dx, sy + dy, sz - dz, sbb); - this.placeBlockAtCurrentPosition(world, blockID, metadata, sx - dx, sy + dy, sz + dz, sbb); - this.placeBlockAtCurrentPosition(world, blockID, metadata, sx - dx, sy + dy, sz - dz, sbb); - this.placeBlockAtCurrentPosition(world, blockID, metadata, sx + dx, sy - dy, sz + dz, sbb); - this.placeBlockAtCurrentPosition(world, blockID, metadata, sx + dx, sy - dy, sz - dz, sbb); - this.placeBlockAtCurrentPosition(world, blockID, metadata, sx - dx, sy - dy, sz + dz, sbb); - this.placeBlockAtCurrentPosition(world, blockID, metadata, sx - dx, sy - dy, sz - dz, sbb); - - } - - } - } - } - } - } - - /** - * Puts a block only if leaves can go there. - */ - protected void placeLeafBlock(World world, Block blockID, int meta, int x, int y, int z, StructureBoundingBox sbb) { - - int offX = this.getXWithOffset(x, z); - int offY = this.getYWithOffset(y); - int offZ = this.getZWithOffset(x, z); - - if (sbb.isVecInside(offX, offY, offZ)) - { - Block whatsThere = world.getBlock(offX, offY, offZ); - - if (whatsThere == null || whatsThere.canBeReplacedByLeaves(world, offX, offY, offZ)) - { - world.setBlock(offX, offY, offZ, blockID, meta, 2); - } - } - } - -} diff --git a/src/main/java/twilightforest/structures/hollowtree/ComponentTFHollowTreeMedBranch.java b/src/main/java/twilightforest/structures/hollowtree/ComponentTFHollowTreeMedBranch.java deleted file mode 100644 index 4d13425134..0000000000 --- a/src/main/java/twilightforest/structures/hollowtree/ComponentTFHollowTreeMedBranch.java +++ /dev/null @@ -1,299 +0,0 @@ -package twilightforest.structures.hollowtree; - -import java.util.List; -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.ChunkCoordinates; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import net.minecraft.world.gen.structure.StructureComponent; -import twilightforest.block.TFBlocks; -import twilightforest.structures.StructureTFComponent; -import twilightforest.world.TFGenerator; - - -public class ComponentTFHollowTreeMedBranch extends StructureTFComponent { - - ChunkCoordinates src, dest; // source and destination of branch, array of 3 ints representing x, y, z - double length; - double angle; - double tilt; - boolean leafy; - - - public ComponentTFHollowTreeMedBranch() { - super(); - } - - protected ComponentTFHollowTreeMedBranch(int i, int sx, int sy, int sz, double length, double angle, double tilt, boolean leafy) { - super(i); - - this.src = new ChunkCoordinates(sx, sy, sz); - this.dest = TFGenerator.translateCoords(src.posX, src.posY, src.posZ, length, angle, tilt); - - this.length = length; - this.angle = angle; - this.tilt = tilt; - this.leafy = leafy; - - this.setCoordBaseMode(0); - - this.boundingBox = new StructureBoundingBox(Math.min(src.posX, dest.posX), Math.min(src.posY, dest.posY), Math.min(src.posZ, dest.posZ), Math.max(src.posX, dest.posX), Math.max(src.posY, dest.posY), Math.max(src.posZ, dest.posZ)); - - this.boundingBox.expandTo(makeExpandedBB(0.5F, length, angle, tilt)); - this.boundingBox.expandTo(makeExpandedBB(0.1F, length, 0.225, tilt)); - this.boundingBox.expandTo(makeExpandedBB(0.1F, length, -0.225, tilt)); - } - - private StructureBoundingBox makeExpandedBB(double outVar, double branchLength, double branchAngle, double branchTilt) - { - ChunkCoordinates branchSrc = TFGenerator.translateCoords(src.posX, src.posY, src.posZ, this.length * outVar, this.angle, this.tilt); - ChunkCoordinates branchDest = TFGenerator.translateCoords(branchSrc.posX, branchSrc.posY, branchSrc.posZ, branchLength, branchAngle, branchTilt); - - return new StructureBoundingBox(Math.min(branchSrc.posX, branchDest.posX), Math.min(branchSrc.posY, branchDest.posY), Math.min(branchSrc.posZ, branchDest.posZ), Math.max(branchSrc.posX, branchDest.posX), Math.max(branchSrc.posY, branchDest.posY), Math.max(branchSrc.posZ, branchDest.posZ)); - } - - - /** - * Save to NBT - */ - @Override - protected void func_143012_a(NBTTagCompound par1NBTTagCompound) { - super.func_143012_a(par1NBTTagCompound); - - par1NBTTagCompound.setInteger("srcPosX", this.src.posX); - par1NBTTagCompound.setInteger("srcPosY", this.src.posY); - par1NBTTagCompound.setInteger("srcPosZ", this.src.posZ); - par1NBTTagCompound.setInteger("destPosX", this.dest.posX); - par1NBTTagCompound.setInteger("destPosY", this.dest.posY); - par1NBTTagCompound.setInteger("destPosZ", this.dest.posZ); - par1NBTTagCompound.setDouble("branchLength", this.length); - par1NBTTagCompound.setDouble("branchAngle", this.angle); - par1NBTTagCompound.setDouble("branchTilt", this.tilt); - par1NBTTagCompound.setBoolean("branchLeafy", this.leafy); - - } - - /** - * Load from NBT - */ - @Override - protected void func_143011_b(NBTTagCompound par1NBTTagCompound) { - super.func_143011_b(par1NBTTagCompound); - - - this.src = new ChunkCoordinates(par1NBTTagCompound.getInteger("srcPosX"), par1NBTTagCompound.getInteger("srcPosY"), par1NBTTagCompound.getInteger("srcPosZ")); - this.dest = new ChunkCoordinates(par1NBTTagCompound.getInteger("destPosX"), par1NBTTagCompound.getInteger("destPosY"), par1NBTTagCompound.getInteger("destPosZ")); - - this.length = par1NBTTagCompound.getDouble("branchLength"); - this.angle = par1NBTTagCompound.getDouble("branchAngle"); - this.tilt = par1NBTTagCompound.getDouble("branchTilt"); - this.leafy = par1NBTTagCompound.getBoolean("branchLeafy"); - } - - /** - * Add a leaf ball to the end - * TODO: go back to adding more leaves if this is successful? - */ - @Override - public void buildComponent(StructureComponent structurecomponent, List list, Random rand) { - int index = getComponentType(); - -// // with leaves! -// if (leafy) { -// int numLeafBalls = Math.min(rand.nextInt(3) + 1, (int)(length / 5)); -// for(int i = 0; i < numLeafBalls; i++) { -// -// double slength = (rand.nextDouble() * 0.6 + 0.2) * length; -// int[] bdst = TFGenerator.translate(src.posX, src.posY, src.posZ, slength, angle, tilt); -// -// //drawBlob(bdst[0], bdst[1], bdst[2], 2, leafBlock, false); -// ComponentTFLeafSphere leafBlob = new ComponentTFLeafSphere(index + 1, bdst[0], bdst[1], bdst[2], 2); -// list.add(leafBlob); -// leafBlob.buildComponent(this, list, rand); // doesn't really need to be here for leaves. -// } -// -// -// ComponentTFLeafSphere leafBlob = new ComponentTFLeafSphere(index + 1, dest.posX, dest.posY, dest.posZ, 2); -// list.add(leafBlob); -// leafBlob.buildComponent(this, list, rand); // doesn't really need to be here for leaves. -// } -// -// // and several small branches -// int numShoots = Math.min(rand.nextInt(3) + 1, (int)(length / 5)); -// double angleInc, angleVar, outVar, tiltVar; -// -// angleInc = 0.8 / numShoots; -// -// for(int i = 0; i < numShoots; i++) { -// -// angleVar = (angleInc * i) - 0.4; -// outVar = (rand.nextDouble() * 0.8) + 0.2; -// tiltVar = (rand.nextDouble() * 0.75) + 0.15; -// -// ChunkCoordinates bSrc = TFGenerator.translateCoords(src.posX, src.posY, src.posZ, length * outVar, angle, tilt); -// double slength = length * 0.4; -// -// makeSmallBranch(list, rand, index + 1, bSrc.posX, bSrc.posY, bSrc.posZ, slength, angle + angleVar, tilt * tiltVar, leafy); -// } - } - - public void makeSmallBranch(List list, Random rand, int index, int x, int y, int z, double branchLength, double branchRotation, double branchAngle, boolean leafy) { - ComponentTFHollowTreeSmallBranch branch = new ComponentTFHollowTreeSmallBranch(index, x, y, z, branchLength, branchRotation, branchAngle, leafy); - list.add(branch); - branch.buildComponent(this, list, rand); - } - - - - @Override - public boolean addComponentParts(World world, Random random, StructureBoundingBox sbb) { - - ChunkCoordinates rSrc = new ChunkCoordinates(src.posX - boundingBox.minX, src.posY - boundingBox.minY, src.posZ - boundingBox.minZ); - ChunkCoordinates rDest = new ChunkCoordinates(dest.posX - boundingBox.minX, dest.posY - boundingBox.minY, dest.posZ - boundingBox.minZ); - -// placeVoid(world, sbb, boundingBox.minX, boundingBox.minY, boundingBox.minZ, boundingBox.maxX, boundingBox.maxY, boundingBox.maxZ, TFBlocks.wood, 0, false); -// System.out.println("Drawing a medium branch from " + rsrc.posX + ", " + rsrc.posY + ", " + rsrc.posZ + " to " + rdest.posX + ", " + rdest.posY + ", " + rdest.posZ); -// System.out.println("My bounding box is " + boundingBox.minX + ", " + boundingBox.minY + ", " + boundingBox.minZ + " to " + boundingBox.maxX + ", " + boundingBox.maxY + ", " + boundingBox.maxZ); -// System.out.println("Draw bounding box is " + sbb.minX + ", " + sbb.minY + ", " + sbb.minZ + " to " + sbb.maxX + ", " + sbb.maxY + ", " + sbb.maxZ); - - drawBresehnam(world, sbb, rSrc.posX, rSrc.posY, rSrc.posZ, rDest.posX, rDest.posY, rDest.posZ, TFBlocks.log, 12); - drawBresehnam(world, sbb, rSrc.posX, rSrc.posY + 1, rSrc.posZ, rDest.posX, rDest.posY, rDest.posZ, TFBlocks.log, 12); - - Random decoRNG = new Random(world.getSeed() + (this.boundingBox.minX * 321534781) ^ (this.boundingBox.minZ * 756839)); - - // and several small branches - int numShoots = Math.min(decoRNG.nextInt(3) + 1, (int)(length / 5)); - double angleInc, angleVar, outVar, tiltVar; - - angleInc = 0.8 / numShoots; - - for(int i = 0; i < numShoots; i++) { - - angleVar = (angleInc * i) - 0.4; - outVar = (decoRNG.nextDouble() * 0.8) + 0.2; - tiltVar = (decoRNG.nextDouble() * 0.75) + 0.15; - - ChunkCoordinates bSrc = TFGenerator.translateCoords(rSrc.posX, rSrc.posY, rSrc.posZ, length * outVar, angle, tilt); - double slength = length * 0.4; - - drawSmallBranch(world, sbb, bSrc.posX, bSrc.posY, bSrc.posZ, Math.max(length * 0.3F, 2F), angle + angleVar, tilt, leafy); - } - - // with leaves! - if (leafy) { - int numLeafBalls = Math.min(decoRNG.nextInt(3) + 1, (int)(length / 5)); - for(int i = 0; i < numLeafBalls; i++) { - - double slength = (decoRNG.nextFloat() * 0.6F + 0.2F) * length; - ChunkCoordinates bdst = TFGenerator.translateCoords(rSrc.posX, rSrc.posY, rSrc.posZ, slength, angle, tilt); - - makeLeafBlob(world, sbb, bdst.posX, bdst.posY, bdst.posZ, decoRNG.nextBoolean() ? 2 : 3); - - } - - makeLeafBlob(world, sbb, rDest.posX, rDest.posY, rDest.posZ, 3); - - } - - - return true; - } - - - /** - * Draws a line - */ - protected void drawBresehnam(World world, StructureBoundingBox sbb, int x1, int y1, int z1, int x2, int y2, int z2, Block blockValue, int metaValue) { - ChunkCoordinates lineCoords[] = TFGenerator.getBresehnamArrayCoords(x1, y1, z1, x2, y2, z2); - - for (ChunkCoordinates coords : lineCoords) - { - this.placeBlockAtCurrentPosition(world, blockValue, metaValue, coords.posX, coords.posY, coords.posZ, sbb); - } - } - - /** - * Make a leaf blob - */ - protected void makeLeafBlob(World world, StructureBoundingBox sbb, int sx, int sy, int sz, int radius) { - // then trace out a quadrant - for (int dx = 0; dx <= radius; dx++) - { - for (int dy = 0; dy <= radius; dy++) - { - for (int dz = 0; dz <= radius; dz++) - { - // determine how far we are from the center. - int dist = 0; - - if (dx >= dy && dx >= dz) - { - dist = (int) (dx + ((Math.max(dy, dz) * 0.5F) + (Math.min(dy, dz) * 0.25F))); - } - else if (dy >= dx && dy >= dz) - { - dist = (int) (dy + ((Math.max(dx, dz) * 0.5F) + (Math.min(dx, dz) * 0.25F))); - } - else - { - dist = (int) (dz + ((Math.max(dx, dy) * 0.5F) + (Math.min(dx, dy) * 0.25F))); - } - - - // if we're inside the blob, fill it - if (dist <= radius) { - // do eight at a time for easiness! - placeLeafBlock(world, TFBlocks.leaves, 0, sx + dx, sy + dy, sz + dz, sbb); - placeLeafBlock(world, TFBlocks.leaves, 0, sx + dx, sy + dy, sz - dz, sbb); - placeLeafBlock(world, TFBlocks.leaves, 0, sx - dx, sy + dy, sz + dz, sbb); - placeLeafBlock(world, TFBlocks.leaves, 0, sx - dx, sy + dy, sz - dz, sbb); - placeLeafBlock(world, TFBlocks.leaves, 0, sx + dx, sy - dy, sz + dz, sbb); - placeLeafBlock(world, TFBlocks.leaves, 0, sx + dx, sy - dy, sz - dz, sbb); - placeLeafBlock(world, TFBlocks.leaves, 0, sx - dx, sy - dy, sz + dz, sbb); - placeLeafBlock(world, TFBlocks.leaves, 0, sx - dx, sy - dy, sz - dz, sbb); - - } - } - } - } - } - - /** - * Puts a block only if leaves can go there. - */ - protected void placeLeafBlock(World world, Block blockID, int meta, int x, int y, int z, StructureBoundingBox sbb) { - - int offX = this.getXWithOffset(x, z); - int offY = this.getYWithOffset(y); - int offZ = this.getZWithOffset(x, z); - - if (sbb.isVecInside(offX, offY, offZ)) - { - Block whatsThere = world.getBlock(offX, offY, offZ); - - if (whatsThere == null || whatsThere.canBeReplacedByLeaves(world, offX, offY, offZ)) - { - world.setBlock(offX, offY, offZ, blockID, meta, 2); - } - } - } - - /** - * This is like the small branch component, but we're just drawing it directly into the world - */ - protected void drawSmallBranch(World world, StructureBoundingBox sbb, int sx, int sy, int sz, double branchLength, double branchAngle, double branchTilt, boolean leafy) { - // draw a line - ChunkCoordinates branchDest = TFGenerator.translateCoords(sx, sy, sz, branchLength, branchAngle, branchTilt); - - drawBresehnam(world, sbb, sx, sy, sz, branchDest.posX, branchDest.posY, branchDest.posZ, TFBlocks.log, 12); - - // leaf blob at the end - makeLeafBlob(world, sbb, branchDest.posX, branchDest.posY, branchDest.posZ, 2); - - } - - -} diff --git a/src/main/java/twilightforest/structures/hollowtree/ComponentTFHollowTreeRoot.java b/src/main/java/twilightforest/structures/hollowtree/ComponentTFHollowTreeRoot.java deleted file mode 100644 index 695aac05e9..0000000000 --- a/src/main/java/twilightforest/structures/hollowtree/ComponentTFHollowTreeRoot.java +++ /dev/null @@ -1,87 +0,0 @@ -package twilightforest.structures.hollowtree; - -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.util.ChunkCoordinates; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import twilightforest.block.TFBlocks; -import twilightforest.world.TFGenerator; - -public class ComponentTFHollowTreeRoot extends ComponentTFHollowTreeMedBranch { - - private int groundLevel = -1; - - - public ComponentTFHollowTreeRoot() { - super(); - } - - public ComponentTFHollowTreeRoot(int i, int sx, int sy, int sz, double length, double angle, double tilt, boolean leafy) { - super(i, sx, sy, sz, length, angle, tilt, leafy); - this.boundingBox = new StructureBoundingBox(Math.min(src.posX, dest.posX), Math.min(src.posY, dest.posY), Math.min(src.posZ, dest.posZ), Math.max(src.posX, dest.posX), Math.max(src.posY, dest.posY), Math.max(src.posZ, dest.posZ)); - } - - - @Override - public boolean addComponentParts(World world, Random random, StructureBoundingBox sbb) { - - // offset bounding box to average ground level - if (this.groundLevel < 0) - { - int rootHeight = this.boundingBox.maxY - this.boundingBox.minY; - - this.groundLevel = this.getSampledDirtLevel(world, sbb); - - if (this.groundLevel < 0) - { - return true; - } - - src.posY = this.groundLevel + 5; - - //System.out.println("Adjusting root bounding box to " + this.boundingBox.minY); - } - - ChunkCoordinates rSrc = new ChunkCoordinates(src.posX - boundingBox.minX, src.posY - boundingBox.minY, src.posZ - boundingBox.minZ); - ChunkCoordinates rDest = new ChunkCoordinates(dest.posX - boundingBox.minX, dest.posY - boundingBox.minY, dest.posZ - boundingBox.minZ); - - drawRootLine(world, sbb, rSrc.posX, rSrc.posY, rSrc.posZ, rDest.posX, rDest.posY, rDest.posZ, TFBlocks.root, 0); - drawRootLine(world, sbb, rSrc.posX, rSrc.posY - 1, rSrc.posZ, rDest.posX, rDest.posY - 1, rDest.posZ, TFBlocks.root, 0); - - return true; - } - - - - /** - * Draws a line - */ - protected void drawRootLine(World world, StructureBoundingBox sbb, int x1, int y1, int z1, int x2, int y2, int z2, Block blockValue, int metaValue) { - ChunkCoordinates lineCoords[] = TFGenerator.getBresehnamArrayCoords(x1, y1, z1, x2, y2, z2); - - for (ChunkCoordinates coords : lineCoords) - { - Block block = this.getBlockAtCurrentPosition(world, coords.posX, coords.posY, coords.posZ, sbb); - - // three choices here - if (!block.isNormalCube(world, coords.posX, coords.posY, coords.posZ) || (block != null && block.getMaterial() == Material.grass)) - { - // air, other non-solid, or grass, make wood block - this.placeBlockAtCurrentPosition(world, TFBlocks.log, 12, coords.posX, coords.posY, coords.posZ, sbb); - } - else if (block != null && block.getMaterial() == Material.wood) - { - // wood, do nothing - - } - else - { - // solid, make root block - this.placeBlockAtCurrentPosition(world, blockValue, metaValue, coords.posX, coords.posY, coords.posZ, sbb); - } - } - } -} diff --git a/src/main/java/twilightforest/structures/hollowtree/ComponentTFHollowTreeSmallBranch.java b/src/main/java/twilightforest/structures/hollowtree/ComponentTFHollowTreeSmallBranch.java deleted file mode 100644 index 2c902f236b..0000000000 --- a/src/main/java/twilightforest/structures/hollowtree/ComponentTFHollowTreeSmallBranch.java +++ /dev/null @@ -1,61 +0,0 @@ -package twilightforest.structures.hollowtree; - -import java.util.List; -import java.util.Random; - -import net.minecraft.util.ChunkCoordinates; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import net.minecraft.world.gen.structure.StructureComponent; -import twilightforest.block.TFBlocks; - - -public class ComponentTFHollowTreeSmallBranch extends - ComponentTFHollowTreeMedBranch { - - public ComponentTFHollowTreeSmallBranch() { - super(); - } - - protected ComponentTFHollowTreeSmallBranch(int i, int sx, int sy, int sz, - double length, double angle, double tilt, boolean leafy) { - super(i, sx, sy, sz, length, angle, tilt, leafy); - } - - /** - * Add a leaf ball to the end - */ - @Override - public void buildComponent(StructureComponent structurecomponent, List list, Random rand) { -// int index = getComponentType(); -// -// if (leafy) { -// int leafRad = rand.nextInt(2) + 1; -// ComponentTFLeafSphere leafBlob = new ComponentTFLeafSphere(index + 1, dest.posX, dest.posY, dest.posZ, leafRad); -// list.add(leafBlob); -// leafBlob.buildComponent(this, list, rand); // doesn't really need to be here for leaves. -// } - - } - - @Override - public boolean addComponentParts(World world, Random random, StructureBoundingBox sbb) { - - ChunkCoordinates rSrc = new ChunkCoordinates(src.posX - boundingBox.minX, src.posY - boundingBox.minY, src.posZ - boundingBox.minZ); - ChunkCoordinates rDest = new ChunkCoordinates(dest.posX - boundingBox.minX, dest.posY - boundingBox.minY, dest.posZ - boundingBox.minZ); - - drawBresehnam(world, sbb, rSrc.posX, rSrc.posY, rSrc.posZ, rDest.posX, rDest.posY, rDest.posZ, TFBlocks.log, 12); - - // with leaves! - if (leafy) { - int leafRad = random.nextInt(2) + 1; - makeLeafBlob(world, sbb, rDest.posX, rDest.posY, rDest.posZ, leafRad); - - } - - - return true; - } - - -} diff --git a/src/main/java/twilightforest/structures/hollowtree/ComponentTFHollowTreeTrunk.java b/src/main/java/twilightforest/structures/hollowtree/ComponentTFHollowTreeTrunk.java deleted file mode 100644 index 4910bdfe3c..0000000000 --- a/src/main/java/twilightforest/structures/hollowtree/ComponentTFHollowTreeTrunk.java +++ /dev/null @@ -1,289 +0,0 @@ -package twilightforest.structures.hollowtree; - -import java.util.List; -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.init.Blocks; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.ChunkCoordinates; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import net.minecraft.world.gen.structure.StructureComponent; -import twilightforest.block.TFBlocks; -import twilightforest.structures.StructureTFComponent; -import twilightforest.world.TFGenerator; - - -public class ComponentTFHollowTreeTrunk extends StructureTFComponent { - - int radius; - int height; - int groundLevel = -1; - - public ComponentTFHollowTreeTrunk() { - super(); - } - - public ComponentTFHollowTreeTrunk(World world, Random rand, int index, int x, int y, int z) { - super(index); - - height = rand.nextInt(64) + 32; - radius = rand.nextInt(4) + 1; - - this.setCoordBaseMode(0); - - - boundingBox = new StructureBoundingBox(x, y, z, (x + radius * 2) + 2, y + height, (z + radius * 2) + 2); - } - - /** - * Save to NBT - */ - @Override - protected void func_143012_a(NBTTagCompound par1NBTTagCompound) { - super.func_143012_a(par1NBTTagCompound); - - par1NBTTagCompound.setInteger("trunkRadius", this.radius); - par1NBTTagCompound.setInteger("trunkHeight", this.height); - par1NBTTagCompound.setInteger("trunkGroundLevel", this.groundLevel); - - } - - /** - * Load from NBT - */ - @Override - protected void func_143011_b(NBTTagCompound par1NBTTagCompound) { - super.func_143011_b(par1NBTTagCompound); - - this.radius = par1NBTTagCompound.getInteger("trunkRadius"); - this.height = par1NBTTagCompound.getInteger("trunkHeight"); - this.groundLevel = par1NBTTagCompound.getInteger("trunkGroundLevel"); - } - - /** - * Add on the various bits and doo-dads we need to succeed - */ - @Override - public void buildComponent(StructureComponent structurecomponent, List list, Random rand) { - int index = getComponentType(); - - // 3-5 couple branches on the way up... - int numBranches = rand.nextInt(3) + 3; - for (int i = 0; i <= numBranches; i++) { - int branchHeight = (int)(height * rand.nextDouble() * 0.9) + (height / 10); - double branchRotation = rand.nextDouble(); - - makeSmallBranch(list, rand, index + i + 1, branchHeight, 4, branchRotation, 0.35D, true); - } - - // build the crown - buildFullCrown(list, rand, index + numBranches + 1); - - // roots - // 3-5 roots at the bottom - buildBranchRing(list, rand, index, 3, 2, 6, 0, 0.75D, 0, 3, 5, 3, false); - - - // several more taproots - buildBranchRing(list, rand, index, 1, 2, 8, 0, 0.9D, 0, 3, 5, 3, false); - - } - - /** - * Build the crown of the tree - */ - protected void buildFullCrown(List list, Random rand, int index) { - int crownRadius = radius * 4 + 4; - int bvar = radius + 2; - - // okay, let's do 3-5 main branches starting at the bottom of the crown - index += buildBranchRing(list, rand, index, height - crownRadius, 0, crownRadius, 0, 0.35D, 0, bvar, bvar + 2, 2, true); - - // then, let's do 3-5 medium branches at the crown middle - index += buildBranchRing(list, rand, index, height - (crownRadius / 2), 0, crownRadius, 0, 0.28D, 0, bvar, bvar + 2, 1, true); - - // finally, let's do 2-4 main branches at the crown top - index += buildBranchRing(list, rand, index, height, 0, crownRadius, 0, 0.15D, 0, 2, 4, 2, true); - - // and extra finally, let's do 3-6 medium branches going straight up - index += buildBranchRing(list, rand, index, height, 0, (crownRadius / 2), 0, 0.05D, 0, bvar, bvar + 2, 1, true); - } - - /** - * Build a ring of branches around the tree - * size 0 = small, 1 = med, 2 = large, 3 = root - */ - protected int buildBranchRing(List list, Random rand, int index, int branchHeight, int heightVar, int length, int lengthVar, double tilt, double tiltVar, int minBranches, int maxBranches, int size, boolean leafy) { - //let's do this! - int numBranches = rand.nextInt(maxBranches - minBranches + 1) + minBranches; - double branchRotation = 1.0 / numBranches; - double branchOffset = rand.nextDouble(); - - for (int i = 0; i <= numBranches; i++) { - int dHeight; - if (heightVar > 0) { - dHeight = branchHeight - heightVar + rand.nextInt(2 * heightVar); - } else { - dHeight = branchHeight; - } - - if (size == 2) { - makeLargeBranch(list, rand, index, dHeight, length, i * branchRotation + branchOffset, tilt, leafy); - } else if (size == 1) { - makeMedBranch(list, rand, index, dHeight, length, i * branchRotation + branchOffset, tilt, leafy); - } else if (size == 3) { - makeRoot(list, rand, index, dHeight, length, i * branchRotation + branchOffset, tilt); - } else { - makeSmallBranch(list, rand, index, dHeight, length, i * branchRotation + branchOffset, tilt, leafy); - } - } - - return numBranches; - } - - - public void makeSmallBranch(List list, Random rand, int index, int branchHeight, int branchLength, double branchRotation, double branchAngle, boolean leafy) { - ChunkCoordinates bSrc = getBranchSrc(branchHeight, branchRotation); - ComponentTFHollowTreeSmallBranch branch = new ComponentTFHollowTreeSmallBranch(index, bSrc.posX, bSrc.posY, bSrc.posZ, branchLength, branchRotation, branchAngle, leafy); - list.add(branch); - branch.buildComponent(this, list, rand); - } - - public void makeMedBranch(List list, Random rand, int index, int branchHeight, int branchLength, double branchRotation, double branchAngle, boolean leafy) { - ChunkCoordinates bSrc = getBranchSrc(branchHeight, branchRotation); - ComponentTFHollowTreeMedBranch branch = new ComponentTFHollowTreeMedBranch(index, bSrc.posX, bSrc.posY, bSrc.posZ, branchLength, branchRotation, branchAngle, leafy); - list.add(branch); - branch.buildComponent(this, list, rand); - } - - public void makeLargeBranch(List list, Random rand, int index, int branchHeight, int branchLength, double branchRotation, double branchAngle, boolean leafy) { - ChunkCoordinates bSrc = getBranchSrc(branchHeight, branchRotation); - ComponentTFHollowTreeMedBranch branch = new ComponentTFHollowTreeLargeBranch(index, bSrc.posX, bSrc.posY, bSrc.posZ, branchLength, branchRotation, branchAngle, leafy); - list.add(branch); - branch.buildComponent(this, list, rand); - } - - - public void makeRoot(List list, Random rand, int index, int branchHeight, int branchLength, double branchRotation, double branchAngle) { - ChunkCoordinates bSrc = getBranchSrc(branchHeight, branchRotation); - ComponentTFHollowTreeRoot branch = new ComponentTFHollowTreeRoot(index, bSrc.posX, bSrc.posY, bSrc.posZ, branchLength, branchRotation, branchAngle, false); - list.add(branch); - branch.buildComponent(this, list, rand); - } - - /** - * Where should we start this branch? - */ - private ChunkCoordinates getBranchSrc(int branchHeight, double branchRotation) { - return TFGenerator.translateCoords(boundingBox.minX + radius + 1, boundingBox.minY + branchHeight, boundingBox.minZ + radius + 1, radius, branchRotation, 0.5); - } - - /** - * Generate the tree trunk - */ - @Override - public boolean addComponentParts(World world, Random random, StructureBoundingBox sbb) { - - // offset bounding box to average ground level - if (this.groundLevel < 0) - { - this.groundLevel = this.getAverageGroundLevel(world, sbb); - - if (this.groundLevel < 0) - { - return true; - } - - this.height = this.boundingBox.maxY - this.groundLevel; - this.boundingBox.minY = this.groundLevel; - } - - int hollow = radius / 2; - - for (int dx = 0; dx <= 2 * radius; dx++) - { - for (int dz = 0; dz <= 2 * radius; dz++) - { - // determine how far we are from the center. - int ax = Math.abs(dx - radius); - int az = Math.abs(dz - radius); - int dist = (int)(Math.max(ax, az) + (Math.min(ax, az) * 0.5)); - - for (int dy = 0; dy <= height; dy++) - { - // fill the body of the trunk - if (dist <= radius && dist > hollow) { - this.placeBlockAtCurrentPosition(world, TFBlocks.log, 0, dx + 1, dy, dz + 1, sbb); // offset, since our BB is slightly larger than the trunk - } - } - - // fill to ground - if (dist <= radius) { - this.func_151554_b(world, TFBlocks.log, 0, dx + 1, -1, dz + 1, sbb); - } - - // add vines - if (dist == hollow && dx == hollow + radius) { - this.func_151554_b(world, Blocks.vine, 8, dx + 1, height, dz + 1, sbb); - } - } - } - - // fireflies & cicadas - int numInsects = random.nextInt(3 * radius) + random.nextInt(3 * radius) + 10; - for (int i = 0; i <= numInsects; i++) { - int fHeight = (int)(height * random.nextDouble() * 0.9) + (height / 10); - double fAngle = random.nextDouble(); - addInsect(world, fHeight, fAngle, random, sbb); - } - - return true; - } - - /** - * Add a random insect - */ - protected void addInsect(World world, int fHeight, double fAngle, Random random, StructureBoundingBox sbb) - { - ChunkCoordinates bugSpot = TFGenerator.translateCoords(this.radius + 1, fHeight, this.radius + 1, this.radius + 1, fAngle, 0.5); - - fAngle = fAngle % 1.0; - int insectMeta = 0; - - if (fAngle > 0.875 || fAngle <= 0.125) - { - insectMeta = 3; - } - else if (fAngle > 0.125 && fAngle <= 0.375) - { - insectMeta = 1; - } - else if (fAngle > 0.375 && fAngle <= 0.625) - { - insectMeta = 4; - } - else if (fAngle > 0.625 && fAngle <= 0.875) - { - insectMeta = 2; - } - - addInsect(world, random.nextBoolean() ? TFBlocks.firefly : TFBlocks.cicada, insectMeta, bugSpot.posX, bugSpot.posY, bugSpot.posZ, sbb); - } - - /** - * Add an insect if we can at the position specified - */ - private void addInsect(World world, Block blockID, int insectMeta, int posX, int posY, int posZ, StructureBoundingBox sbb) { - int ox = this.getXWithOffset(posX, posZ); - int oy = this.getYWithOffset(posY); - int oz = this.getZWithOffset(posX, posZ); - - if (sbb.isVecInside(ox, oy, oz) && blockID != null && blockID.canPlaceBlockAt(world, ox, oy, oz)) - { - world.setBlock(ox, oy, oz, blockID, insectMeta, 2); - } - } - -} diff --git a/src/main/java/twilightforest/structures/hollowtree/ComponentTFLeafSphere.java b/src/main/java/twilightforest/structures/hollowtree/ComponentTFLeafSphere.java deleted file mode 100644 index 72b0a5ffe4..0000000000 --- a/src/main/java/twilightforest/structures/hollowtree/ComponentTFLeafSphere.java +++ /dev/null @@ -1,131 +0,0 @@ -package twilightforest.structures.hollowtree; - -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.init.Blocks; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import twilightforest.block.TFBlocks; -import twilightforest.structures.StructureTFComponent; - - -/** - * A blob of leaves used to make trees - * - * @author Ben - * - */ -public class ComponentTFLeafSphere extends StructureTFComponent { - - int radius; // radius - - - public ComponentTFLeafSphere() { - super(); - } - - /** - * Make a blob of leaves - * - * @param index - * @param x - * @param y - * @param z - * @param radius - */ - protected ComponentTFLeafSphere(int index, int x, int y, int z, int radius) { - super(index); - - this.setCoordBaseMode(0); - - boundingBox = new StructureBoundingBox(x - radius, y - radius, z - radius, x + radius, y + radius, z + radius); - this.radius = radius; - } - - /** - * Save to NBT - */ - @Override - protected void func_143012_a(NBTTagCompound par1NBTTagCompound) { - super.func_143012_a(par1NBTTagCompound); - - par1NBTTagCompound.setInteger("leafRadius", this.radius); - - } - - /** - * Load from NBT - */ - @Override - protected void func_143011_b(NBTTagCompound par1NBTTagCompound) { - super.func_143011_b(par1NBTTagCompound); - - this.radius = par1NBTTagCompound.getInteger("leafRadius"); - } - - /** - * Draw a giant blob of whatevs (okay, it's going to be leaves). - */ - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - - - - int sx = radius; - int sy = radius; - int sz = radius; - - // then trace out a quadrant - for (byte dx = 0; dx <= radius; dx++) - { - for (byte dy = 0; dy <= radius; dy++) - { - for (byte dz = 0; dz <= radius; dz++) - { - // determine how far we are from the center. - byte dist = 0; - - if (dx >= dy && dx >= dz) { - dist = (byte) (dx + (byte)((Math.max(dy, dz) * 0.5) + (Math.min(dy, dz) * 0.25))); - } else if (dy >= dx && dy >= dz) - { - dist = (byte) (dy + (byte)((Math.max(dx, dz) * 0.5) + (Math.min(dx, dz) * 0.25))); - } else { - dist = (byte) (dz + (byte)((Math.max(dx, dy) * 0.5) + (Math.min(dx, dy) * 0.25))); - } - - - // if we're inside the blob, fill it - if (dist <= radius) { - // do eight at a time for easiness! - placeBlockIfEmpty(world, TFBlocks.leaves, 0, sx + dx, sy + dy, sz + dz, sbb); - placeBlockIfEmpty(world, TFBlocks.leaves, 0, sx + dx, sy + dy, sz - dz, sbb); - placeBlockIfEmpty(world, TFBlocks.leaves, 0, sx - dx, sy + dy, sz + dz, sbb); - placeBlockIfEmpty(world, TFBlocks.leaves, 0, sx - dx, sy + dy, sz - dz, sbb); - placeBlockIfEmpty(world, TFBlocks.leaves, 0, sx + dx, sy - dy, sz + dz, sbb); - placeBlockIfEmpty(world, TFBlocks.leaves, 0, sx + dx, sy - dy, sz - dz, sbb); - placeBlockIfEmpty(world, TFBlocks.leaves, 0, sx - dx, sy - dy, sz + dz, sbb); - placeBlockIfEmpty(world, TFBlocks.leaves, 0, sx - dx, sy - dy, sz - dz, sbb); - - } - } - } - } - - return true; - } - - /** - * Puts a block only if the block that's there is air. - * - * TODO: This could be more efficient by combining the duplicate logic of the getBlockAtCurrentPosition and placeBlockAtCurrentPosition functions. - */ - protected void placeBlockIfEmpty(World world, Block blockID, int meta, int x, int y, int z, StructureBoundingBox sbb) { - if (getBlockAtCurrentPosition(world, x, y, z, sbb) == Blocks.air) { - placeBlockAtCurrentPosition(world, blockID, meta, x, y, z, sbb); - } - } - -} diff --git a/src/main/java/twilightforest/structures/hollowtree/StructureTFHollowTreeStart.java b/src/main/java/twilightforest/structures/hollowtree/StructureTFHollowTreeStart.java deleted file mode 100644 index 0b151ccb83..0000000000 --- a/src/main/java/twilightforest/structures/hollowtree/StructureTFHollowTreeStart.java +++ /dev/null @@ -1,28 +0,0 @@ -package twilightforest.structures.hollowtree; - -import java.util.Random; - -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureStart; -import twilightforest.structures.StructureTFComponent; -import twilightforest.world.TFWorld; - - - - -public class StructureTFHollowTreeStart extends StructureStart { - - public StructureTFHollowTreeStart() {} - - public StructureTFHollowTreeStart(World world, Random rand, int chunkX, int chunkZ) { - int x = (chunkX << 4) + 8; - int z = (chunkZ << 4) + 8; - int y = TFWorld.SEALEVEL + 1;;//world.getTopSolidOrLiquidBlock(x, z); - - StructureTFComponent trunk = new ComponentTFHollowTreeTrunk(world, rand, 0, x, y, z); - components.add(trunk); - trunk.buildComponent(trunk, components, rand); - updateBoundingBox(); - } - -} diff --git a/src/main/java/twilightforest/structures/hollowtree/TFHollowTreePieces.java b/src/main/java/twilightforest/structures/hollowtree/TFHollowTreePieces.java deleted file mode 100644 index 08c616cc17..0000000000 --- a/src/main/java/twilightforest/structures/hollowtree/TFHollowTreePieces.java +++ /dev/null @@ -1,18 +0,0 @@ -package twilightforest.structures.hollowtree; - -import net.minecraft.world.gen.structure.MapGenStructureIO; - -public class TFHollowTreePieces { - - public static void registerPieces() { - MapGenStructureIO.func_143031_a(ComponentTFHollowTreeLargeBranch.class, "TFHTLB"); - MapGenStructureIO.func_143031_a(ComponentTFHollowTreeMedBranch.class, "TFHTMB"); - MapGenStructureIO.func_143031_a(ComponentTFHollowTreeSmallBranch.class, "TFHTSB"); - MapGenStructureIO.func_143031_a(ComponentTFHollowTreeTrunk.class, "TFHTTr"); - MapGenStructureIO.func_143031_a(ComponentTFLeafSphere.class, "TFHTLS"); - MapGenStructureIO.func_143031_a(ComponentTFHollowTreeRoot.class, "TFHTRo"); - MapGenStructureIO.func_143031_a(StructureTFHollowTreeStart.class, "TFHTLSt"); - MapGenStructureIO.func_143031_a(ComponentTFHollowTreeLeafDungeon.class, "TFHTLD"); - - } -} diff --git a/src/main/java/twilightforest/structures/icetower/ComponentTFIceTowerBeard.java b/src/main/java/twilightforest/structures/icetower/ComponentTFIceTowerBeard.java deleted file mode 100644 index efe56e8049..0000000000 --- a/src/main/java/twilightforest/structures/icetower/ComponentTFIceTowerBeard.java +++ /dev/null @@ -1,77 +0,0 @@ -package twilightforest.structures.icetower; - -import java.util.Random; - -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.MathHelper; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import twilightforest.structures.StructureTFComponent; -import twilightforest.structures.lichtower.ComponentTFTowerWing; - -public class ComponentTFIceTowerBeard extends StructureTFComponent { - - protected int size; - protected int height; - - public ComponentTFIceTowerBeard() {} - - public ComponentTFIceTowerBeard(int i, ComponentTFTowerWing wing) { - super(i); - - // same alignment - this.setCoordBaseMode(wing.getCoordBaseMode()); - // same size - this.size = wing.size; // assuming only square towers and roofs right now. - this.height = Math.round(this.size * 1.414F); - - this.deco = wing.deco; - - // just hang out at the very bottom of the tower - this.boundingBox = new StructureBoundingBox(wing.getBoundingBox().minX, wing.getBoundingBox().minY - this.height, wing.getBoundingBox().minZ, wing.getBoundingBox().maxX, wing.getBoundingBox().minY, wing.getBoundingBox().maxZ); - } - - /** - * Save to NBT - */ - @Override - protected void func_143012_a(NBTTagCompound par1NBTTagCompound) { - super.func_143012_a(par1NBTTagCompound); - - par1NBTTagCompound.setInteger("beardSize", this.size); - par1NBTTagCompound.setInteger("beardHeight", this.height); - } - - /** - * Load from NBT - */ - @Override - protected void func_143011_b(NBTTagCompound par1NBTTagCompound) { - super.func_143011_b(par1NBTTagCompound); - this.size = par1NBTTagCompound.getInteger("beardSize"); - this.height = par1NBTTagCompound.getInteger("beardHeight"); - } - - - /** - * Makes a dark tower type beard - */ - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) - { - for (int x = 0; x < this.size; x++) { - for (int z = 0; z < this.size; z++) { - //int rHeight = this.size - (int) MathHelper.sqrt_float(x * z); // interesting office building pattern - int rHeight = Math.round(MathHelper.sqrt_float(x * x + z * z)); - //int rHeight = MathHelper.ceiling_float_int(Math.min(x * x / 9F, z * z / 9F)); - - for (int y = 0; y < rHeight; y++) { - this.placeBlockAtCurrentPosition(world, deco.blockID, deco.blockMeta, x, this.height - y, z, sbb); - - } - } - } - return true; - } - -} diff --git a/src/main/java/twilightforest/structures/icetower/ComponentTFIceTowerBossWing.java b/src/main/java/twilightforest/structures/icetower/ComponentTFIceTowerBossWing.java deleted file mode 100644 index 81035f329c..0000000000 --- a/src/main/java/twilightforest/structures/icetower/ComponentTFIceTowerBossWing.java +++ /dev/null @@ -1,97 +0,0 @@ -package twilightforest.structures.icetower; - -import java.util.Random; - -import twilightforest.block.TFBlocks; -import net.minecraft.block.Block; -import net.minecraft.init.Blocks; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; - -public class ComponentTFIceTowerBossWing extends ComponentTFIceTowerWing { - - public ComponentTFIceTowerBossWing() { - super(); - // no spawns - this.spawnListIndex = -1; - } - - public ComponentTFIceTowerBossWing(int index, int x, int y, int z, int wingSize, int wingHeight, int direction) { - super(index, x, y, z, wingSize, wingHeight, direction); - // no spawns - this.spawnListIndex = -1; - } - - protected boolean shouldHaveBase(Random rand) { - return false; - } - - - /** - * Put down planks or whatevs for a floor - */ - protected void placeFloor(World world, Random rand, StructureBoundingBox sbb, int floorHeight, int floor) { - for (int x = 1; x < size - 1; x++) { - for (int z = 1; z < size - 1; z++) { - - Block ice = rand.nextInt(4) == 0 ? Blocks.ice : Blocks.packed_ice; - int thickness = 1 + rand.nextInt(2) + rand.nextInt(2) + rand.nextInt(2); - - for (int y = 0; y < thickness; y++) { - placeBlockAtCurrentPosition(world, ice, 0, x, (floor * floorHeight) + floorHeight - y, z, sbb); - } - } - } - } - - /** - * Called to decorate each floor. This is responsible for adding a ladder up, the stub of the ladder going down, then picking a theme for each floor and executing it. - * - * @param floor - * @param bottom - * @param top - * @param ladderUpDir - * @param laddderDownDir - */ - protected void decorateFloor(World world, Random rand, int floor, int bottom, int top, int ladderUpDir, int ladderDownDir, StructureBoundingBox sbb) { - - for (int y = 0; y < 3; y++) { - int rotation = (ladderDownDir + y) % 4; - int rotation2 = (ladderDownDir + y + 2) % 4; - - placeIceStairs(world, sbb, rand, bottom + (y * 3), rotation); - placeIceStairs(world, sbb, rand, bottom + (y * 3), rotation2); - - } - - } - - private void placeIceStairs(World world, StructureBoundingBox sbb, Random rand, int y, int rotation) { - this.fillBlocksRotated(world, sbb, 8, y + 1, 1, 10, y + 1, 3, Blocks.packed_ice, 0, rotation); - if (y > 1) { - this.randomlyFillBlocksRotated(world, sbb, rand, 0.5F, 8, y + 0, 1, 10, y + 0, 3, Blocks.packed_ice, 0, Blocks.air, 0, rotation); - } - this.fillBlocksRotated(world, sbb, 11, y + 2, 1, 13, y + 2, 3, Blocks.packed_ice, 0, rotation); - this.randomlyFillBlocksRotated(world, sbb, rand, 0.5F, 11, y + 1, 1, 13, y + 1, 3, Blocks.packed_ice, 0, Blocks.air, 0, rotation); - this.fillBlocksRotated(world, sbb, 11, y + 3, 4, 13, y + 3, 6, Blocks.packed_ice, 0, rotation); - this.randomlyFillBlocksRotated(world, sbb, rand, 0.5F, 11, y + 2, 4, 13, y + 2, 6, Blocks.packed_ice, 0, Blocks.air, 0, rotation); - } - - protected void decorateTopFloor(World world, Random rand, int floor, int bottom, int top, int ladderUpDir, int ladderDownDir, StructureBoundingBox sbb) { - for (int x = 1; x < size - 1; x++) { - for (int z = 1; z < size - 1; z++) { - - Block ice = rand.nextInt(10) == 0 ? Blocks.glowstone : Blocks.packed_ice; - int thickness = rand.nextInt(2) + rand.nextInt(2); - - for (int y = 0; y < thickness; y++) { - placeBlockAtCurrentPosition(world, ice, 0, x, top - 1 - y, z, sbb); - } - } - } - - this.placeBlockRotated(world, TFBlocks.bossSpawner, 5, 7, top - 6, 7, 0, sbb); - - this.fillWithAir(world, sbb, 5, top - 3, 5, 9, top - 1, 9); - } -} diff --git a/src/main/java/twilightforest/structures/icetower/ComponentTFIceTowerBridge.java b/src/main/java/twilightforest/structures/icetower/ComponentTFIceTowerBridge.java deleted file mode 100644 index 64f6cfeff9..0000000000 --- a/src/main/java/twilightforest/structures/icetower/ComponentTFIceTowerBridge.java +++ /dev/null @@ -1,78 +0,0 @@ -package twilightforest.structures.icetower; - -import java.util.List; -import java.util.Random; - -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import net.minecraft.world.gen.structure.StructureComponent; -import twilightforest.structures.StructureTFComponent; - -public class ComponentTFIceTowerBridge extends StructureTFComponent { - - private int length; - - - public ComponentTFIceTowerBridge() { - super(); - } - - - public ComponentTFIceTowerBridge(int index, int x, int y, int z, int length, int direction) { - super(index); - this.length = length; - this.setCoordBaseMode(direction); - - this.boundingBox = StructureTFComponent.getComponentToAddBoundingBox(x, y, z, 0, 0, 0, length, 6, 5, direction); - - } - - /** - * Save to NBT - */ - @Override - protected void func_143012_a(NBTTagCompound par1NBTTagCompound) { - super.func_143012_a(par1NBTTagCompound); - - par1NBTTagCompound.setInteger("bridgeLength", this.length); - } - - /** - * Load from NBT - */ - @Override - protected void func_143011_b(NBTTagCompound par1NBTTagCompound) { - super.func_143011_b(par1NBTTagCompound); - this.length = par1NBTTagCompound.getInteger("bridgeLength"); - } - - - @SuppressWarnings({ "rawtypes" }) - @Override - public void buildComponent(StructureComponent parent, List list, Random rand) - { - if (parent != null && parent instanceof StructureTFComponent) - { - this.deco = ((StructureTFComponent)parent).deco; - } - } - - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - fillWithAir(world, sbb, 0, 1, 0, length, 5, 4); - - // make floor/ceiling - fillWithBlocks(world, sbb, 0, 0, 0, length, 0, 4, deco.blockID, deco.blockID, false); - fillWithBlocks(world, sbb, 0, 6, 0, length, 6, 4, deco.blockID, deco.blockID, false); - - // pillars - for (int x = 2; x < length; x += 3) { - fillWithMetadataBlocks(world, sbb, x, 1, 0, x, 5, 0, deco.pillarID, deco.pillarMeta, deco.pillarID, deco.pillarMeta, false); - fillWithMetadataBlocks(world, sbb, x, 1, 4, x, 5, 4, deco.pillarID, deco.pillarMeta, deco.pillarID, deco.pillarMeta, false); - } - - return true; - } -} diff --git a/src/main/java/twilightforest/structures/icetower/ComponentTFIceTowerEntrance.java b/src/main/java/twilightforest/structures/icetower/ComponentTFIceTowerEntrance.java deleted file mode 100644 index 1e00b9a5ec..0000000000 --- a/src/main/java/twilightforest/structures/icetower/ComponentTFIceTowerEntrance.java +++ /dev/null @@ -1,100 +0,0 @@ -package twilightforest.structures.icetower; - -import java.util.List; -import java.util.Random; - -import net.minecraft.util.ChunkCoordinates; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import net.minecraft.world.gen.structure.StructureComponent; -import twilightforest.structures.StructureTFComponent; - -public class ComponentTFIceTowerEntrance extends ComponentTFIceTowerWing { - - public ComponentTFIceTowerEntrance() {} - - public ComponentTFIceTowerEntrance(int i, int x, int y, int z, int pSize, int pHeight, int direction) { - super(i, x, y, z, pSize, pHeight, direction); - } - - - protected boolean shouldHaveBase(Random rand) { - return true; - } - - - @SuppressWarnings({ "rawtypes", "unchecked" }) - @Override - public void buildComponent(StructureComponent parent, List list, Random rand) { - if (parent != null && parent instanceof StructureTFComponent) - { - this.deco = ((StructureTFComponent)parent).deco; - } - - // we should have a door where we started - addOpening(0, 1, size / 2, 2); - - // stairs - addStairs(list, rand, this.getComponentType() + 1, this.size - 1, 1, size / 2, 0); - addStairs(list, rand, this.getComponentType() + 1, this.size / 2, 1, 0, 3); - addStairs(list, rand, this.getComponentType() + 1, this.size / 2, 1, this.size - 1, 1); - - // should we build a base - this.hasBase = this.shouldHaveBase(rand); - - // add a roof? - makeARoof(parent, list, rand); - } - - /** - * Add some stairs leading to this tower - */ - private boolean addStairs(List list, Random rand, int index, int x, int y, int z, int rotation) { - // add door - this.addOpening(x, y, z, rotation); - - int direction = (getCoordBaseMode() + rotation) % 4; - ChunkCoordinates dx = offsetTowerCCoords(x, y, z, this.size, direction); - - ComponentTFIceTowerStairs entrance = new ComponentTFIceTowerStairs(index, dx.posX, dx.posY, dx.posZ, this.size, this.height, direction); - - list.add(entrance); - entrance.buildComponent(list.get(0), list, rand); - return true; - } - - /** - * Make a new wing - */ - public boolean makeTowerWing(List list, Random rand, int index, int x, int y, int z, int wingSize, int wingHeight, int rotation) { - return false; - } - - /** - * No floors - */ - protected void makeFloorsForTower(World world, Random rand, StructureBoundingBox sbb) { - - decoratePillarsCornersHigh(world, rand, 0, 11, 0, sbb); - - } - - - protected void decoratePillarsCornersHigh(World world, Random rand, int bottom, int top, int rotation, StructureBoundingBox sbb) { - int beamMetaNS = ((this.coordBaseMode + rotation) % 2 == 0) ? 4 : 8; - int beamMetaEW = (beamMetaNS == 4) ? 8 : 4; - - this.fillBlocksRotated(world, sbb, 3, bottom + 5, 1, 3, bottom + 5, 9, deco.pillarID, deco.pillarMeta + beamMetaEW, rotation); - this.fillBlocksRotated(world, sbb, 7, bottom + 5, 1, 7, bottom + 5, 9, deco.pillarID, deco.pillarMeta + beamMetaEW, rotation); - this.fillBlocksRotated(world, sbb, 1, bottom + 5, 3, 9, bottom + 5, 3, deco.pillarID, deco.pillarMeta + beamMetaNS, rotation); - this.fillBlocksRotated(world, sbb, 1, bottom + 5, 7, 9, bottom + 5, 7, deco.pillarID, deco.pillarMeta + beamMetaNS, rotation); - - this.fillAirRotated(world, sbb, 3, bottom + 5, 3, 7, bottom + 5, 7, rotation); - - // pillars connected only to ceiling - this.fillBlocksRotated(world, sbb, 3, bottom + 5, 3, 3, top - 1, 3, deco.pillarID, deco.pillarMeta, rotation); - this.fillBlocksRotated(world, sbb, 7, bottom + 5, 3, 7, top - 1, 3, deco.pillarID, deco.pillarMeta, rotation); - this.fillBlocksRotated(world, sbb, 3, bottom + 5, 7, 3, top - 1, 7, deco.pillarID, deco.pillarMeta, rotation); - this.fillBlocksRotated(world, sbb, 7, bottom + 5, 7, 7, top - 1, 7, deco.pillarID, deco.pillarMeta, rotation); - } -} diff --git a/src/main/java/twilightforest/structures/icetower/ComponentTFIceTowerMain.java b/src/main/java/twilightforest/structures/icetower/ComponentTFIceTowerMain.java deleted file mode 100644 index 930fe7de80..0000000000 --- a/src/main/java/twilightforest/structures/icetower/ComponentTFIceTowerMain.java +++ /dev/null @@ -1,119 +0,0 @@ -package twilightforest.structures.icetower; - -import java.util.List; -import java.util.Random; - -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.ChunkCoordinates; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import net.minecraft.world.gen.structure.StructureComponent; - -public class ComponentTFIceTowerMain extends ComponentTFIceTowerWing -{ - public boolean hasBossWing = false; - - public ComponentTFIceTowerMain() { - super(); - } - - public ComponentTFIceTowerMain(World world, Random rand, int index, int x, int y, int z) { - this(world, rand, index, x + SIZE, y + 40, z + SIZE, 2); - } - - public ComponentTFIceTowerMain(World world, Random rand, int index, int x, int y, int z, int rotation) { - super(index, x, y, z, SIZE, 31 + (rand.nextInt(3) * 10), rotation); - - // decorator - if (this.deco == null) - { - this.deco = new StructureDecoratorIceTower(); - } - } - - - protected ComponentTFIceTowerMain(int i, int x, int y, int z, int pSize, int pHeight, int direction) - { - super(i, x, y, z, pSize, pHeight, direction); - } - - /** - * Save to NBT - */ - @Override - protected void func_143012_a(NBTTagCompound par1NBTTagCompound) { - super.func_143012_a(par1NBTTagCompound); - - par1NBTTagCompound.setBoolean("hasBossWing", this.hasBossWing); - } - - /** - * Load from NBT - */ - @Override - protected void func_143011_b(NBTTagCompound par1NBTTagCompound) { - super.func_143011_b(par1NBTTagCompound); - this.hasBossWing = par1NBTTagCompound.getBoolean("hasBossWing"); - } - - @SuppressWarnings({ "rawtypes", "unchecked" }) - @Override - public void buildComponent(StructureComponent parent, List list, Random rand) { - super.buildComponent(parent, list, rand); - - // add entrance tower - StructureBoundingBox towerBB = StructureBoundingBox.getNewBoundingBox(); - - for (StructureComponent structurecomponent : (List)list) { - towerBB.expandTo(structurecomponent.getBoundingBox()); - } - - // TODO: make this more general - ChunkCoordinates myDoor = this.openings.get(0); - ChunkCoordinates entranceDoor = new ChunkCoordinates(myDoor); - - - if (myDoor.posX == 0) { - int length = this.getBoundingBox().minX - towerBB.minX; - //System.out.println("Offset for door -x = " + length); - if (length >= 0) { - entranceDoor.posX -= length; - makeEntranceBridge(list, rand, this.getComponentType() + 1, myDoor.posX, myDoor.posY, myDoor.posZ, length, 2); - } - } - if (myDoor.posX == this.size - 1) { - entranceDoor.posX += towerBB.maxX - this.getBoundingBox().maxX; - } - if (myDoor.posZ == 0) { - entranceDoor.posZ += towerBB.minZ - this.getBoundingBox().minZ; - } - if (myDoor.posX == this.size - 1) { - entranceDoor.posZ += towerBB.maxZ - this.getBoundingBox().maxZ; - } - - makeEntranceTower(list, rand, this.getComponentType() + 1, entranceDoor.posX, entranceDoor.posY, entranceDoor.posZ, SIZE, 11, this.getCoordBaseMode()); - } - - private void makeEntranceBridge(List list, Random rand, int index, int x, int y, int z, int length, int rotation) { - int direction = (getCoordBaseMode() + rotation) % 4; - ChunkCoordinates dest = offsetTowerCCoords(x, y, z, 5, direction); - - ComponentTFIceTowerBridge bridge = new ComponentTFIceTowerBridge(index, dest.posX, dest.posY, dest.posZ, length, direction); - - list.add(bridge); - bridge.buildComponent(list.get(0), list, rand); - } - - public boolean makeEntranceTower(List list, Random rand, int index, int x, int y, int z, int wingSize, int wingHeight, int rotation) { - int direction = (getCoordBaseMode() + rotation) % 4; - int[] dx = offsetTowerCoords(x, y, z, wingSize, direction); - - ComponentTFIceTowerWing entrance = new ComponentTFIceTowerEntrance(index, dx[0], dx[1], dx[2], wingSize, wingHeight, direction); - - list.add(entrance); - entrance.buildComponent(list.get(0), list, rand); - addOpening(x, y, z, rotation); - return true; - } - -} diff --git a/src/main/java/twilightforest/structures/icetower/ComponentTFIceTowerRoof.java b/src/main/java/twilightforest/structures/icetower/ComponentTFIceTowerRoof.java deleted file mode 100644 index 5abe5ef454..0000000000 --- a/src/main/java/twilightforest/structures/icetower/ComponentTFIceTowerRoof.java +++ /dev/null @@ -1,54 +0,0 @@ -package twilightforest.structures.icetower; - -import java.util.Random; - -import net.minecraft.util.MathHelper; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import twilightforest.structures.lichtower.ComponentTFTowerRoof; -import twilightforest.structures.lichtower.ComponentTFTowerWing; - -public class ComponentTFIceTowerRoof extends ComponentTFTowerRoof { - - public ComponentTFIceTowerRoof() {} - - public ComponentTFIceTowerRoof(int i, ComponentTFTowerWing wing) { - super(i, wing); - - // same alignment - this.setCoordBaseMode(wing.getCoordBaseMode()); - // same size - this.size = wing.size; // assuming only square towers and roofs right now. - this.height = 12; - - this.deco = wing.deco; - - // just hang out at the very top of the tower - makeCapBB(wing); - } - - - /** - * Swoopy ice roof - */ - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - super.addComponentParts(world, rand, sbb); - - for (int x = 0; x < this.size; x++) { - for (int z = 0; z < this.size; z++) { - //int rHeight = this.size - (int) MathHelper.sqrt_float(x * z); // interesting office building pattern - int rHeight = Math.round(MathHelper.sqrt_float(x * x + z * z)); - //int rHeight = MathHelper.ceiling_float_int(Math.min(x * x / 9F, z * z / 9F)); - - for (int y = 0; y < rHeight; y++) { - this.placeBlockAtCurrentPosition(world, deco.blockID, deco.blockMeta, x, y, z, sbb); - - } - } - } - - return true; - } - -} diff --git a/src/main/java/twilightforest/structures/icetower/ComponentTFIceTowerStairs.java b/src/main/java/twilightforest/structures/icetower/ComponentTFIceTowerStairs.java deleted file mode 100644 index 5c1be9b017..0000000000 --- a/src/main/java/twilightforest/structures/icetower/ComponentTFIceTowerStairs.java +++ /dev/null @@ -1,65 +0,0 @@ -package twilightforest.structures.icetower; - -import java.util.List; -import java.util.Random; - -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import net.minecraft.world.gen.structure.StructureComponent; -import twilightforest.structures.StructureTFComponent; -import twilightforest.structures.lichtower.ComponentTFTowerWing; - -public class ComponentTFIceTowerStairs extends ComponentTFTowerWing { - - public ComponentTFIceTowerStairs() { } - - - public ComponentTFIceTowerStairs(int index, int x, int y, int z, int size, int height, int direction) { - super(index, x, y, z, size, height, direction); - } - - @SuppressWarnings({ "rawtypes" }) - @Override - public void buildComponent(StructureComponent parent, List list, Random rand) { - if (parent != null && parent instanceof StructureTFComponent) { - this.deco = ((StructureTFComponent)parent).deco; - } - } - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - - for (int x = 1; x < this.size; x++) { - - this.placeStairs(world, sbb, x, 1 - x, 5, 2); - - for (int z = 0; z <= x; z++) { - - if (z > 0 && z <= this.size / 2) { - this.placeStairs(world, sbb, x, 1 - x, 5 - z, 2); - this.placeStairs(world, sbb, x, 1 - x, 5 + z, 2); - } - - if (x <= this.size / 2) { - this.placeStairs(world, sbb, z, 1 - x, 5 - x, 1); - this.placeStairs(world, sbb, z, 1 - x, 5 + x, 3); - } - - } - - } - - this.func_151554_b(world, deco.blockID, deco.blockMeta, 0, 0, 5, sbb); - - - return true; - } - - private void placeStairs(World world, StructureBoundingBox sbb, int x, int y, int z, int stairMeta) { - if (this.getBlockAtCurrentPosition(world, x, y, z, sbb).isReplaceable(world, x, y, z)) { - this.placeBlockAtCurrentPosition(world, deco.blockID, deco.blockMeta, x, y, z, sbb); - //this.placeBlockAtCurrentPosition(world, deco.stairID, this.getStairMeta(stairMeta), x, y, z, sbb); - this.func_151554_b(world, deco.blockID, deco.blockMeta, x, y - 1, z, sbb); - } - } -} diff --git a/src/main/java/twilightforest/structures/icetower/ComponentTFIceTowerWing.java b/src/main/java/twilightforest/structures/icetower/ComponentTFIceTowerWing.java deleted file mode 100644 index 2098268095..0000000000 --- a/src/main/java/twilightforest/structures/icetower/ComponentTFIceTowerWing.java +++ /dev/null @@ -1,730 +0,0 @@ -package twilightforest.structures.icetower; - -import java.util.List; -import java.util.Random; - -import net.minecraft.init.Blocks; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.ChunkCoordinates; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import net.minecraft.world.gen.structure.StructureComponent; -import twilightforest.TFTreasure; -import twilightforest.structures.StructureTFComponent; -import twilightforest.structures.lichtower.ComponentTFTowerWing; - -public class ComponentTFIceTowerWing extends ComponentTFTowerWing -{ - - protected static final int SIZE = 11; - private static final int RANGE = (int) (SIZE * 1.6F); - - boolean hasBase = false; - protected int treasureFloor = -1; - - public ComponentTFIceTowerWing() { - super(); - } - - protected ComponentTFIceTowerWing(int i, int x, int y, int z, int pSize, int pHeight, int direction) { - super(i, x, y, z, pSize, pHeight, direction); - } - - /** - * Save to NBT - */ - @Override - protected void func_143012_a(NBTTagCompound par1NBTTagCompound) { - super.func_143012_a(par1NBTTagCompound); - - par1NBTTagCompound.setBoolean("hasBase", this.hasBase); - par1NBTTagCompound.setInteger("treasureFloor", this.treasureFloor); - } - - /** - * Load from NBT - */ - @Override - protected void func_143011_b(NBTTagCompound par1NBTTagCompound) { - super.func_143011_b(par1NBTTagCompound); - this.hasBase = par1NBTTagCompound.getBoolean("hasBase"); - this.treasureFloor = par1NBTTagCompound.getInteger("treasureFloor"); - } - - @SuppressWarnings({ "rawtypes", "unchecked" }) - @Override - public void buildComponent(StructureComponent parent, List list, Random rand) { - if (parent != null && parent instanceof StructureTFComponent) - { - this.deco = ((StructureTFComponent)parent).deco; - } - - // we should have a door where we started - addOpening(0, 1, size / 2, 2); - - // should we build a base - this.hasBase = this.shouldHaveBase(rand); - - // limit sprawl to a reasonable amount - if (this.getComponentType() < 5) { - - int dirOffset = rand.nextInt(4); - - // make sub towers - for (int i = 0; i < 4; i++) { - - int dir = (dirOffset + i) % 4; - -// if (rand.nextInt(6) < this.getComponentType()) -// { -// continue; -// } - - int[] dest = getValidOpening(rand, dir); - - if (this.getComponentType() == 4 && (parent instanceof ComponentTFIceTowerMain) && !((ComponentTFIceTowerMain)parent).hasBossWing) { - //System.out.println("Making boss tower"); - boolean hasBoss = makeBossTowerWing(list, rand, this.getComponentType() + 1, dest[0], dest[1], dest[2], 15, 41, dir); - ((ComponentTFIceTowerMain)parent).hasBossWing = hasBoss; - } else { - int childHeight = (rand.nextInt(2) + rand.nextInt(2) + 2) * 10 + 1; - makeTowerWing(list, rand, this.getComponentType() + 1, dest[0], dest[1], dest[2], SIZE, childHeight, dir); - } - } - } - - // figure out where the treasure goes - int floors = this.height / 10; - - // set treasure to a floor if we need to - if (this.treasureFloor == -1 && floors > 1) { - this.treasureFloor = rand.nextInt(floors - 1); - } - - // add a roof? - makeARoof(parent, list, rand); - - // beard? - if (!this.hasBase) { - makeABeard(parent, list, rand); - } - - } - - protected boolean shouldHaveBase(Random rand) { - return this.getComponentType() == 0 || rand.nextBoolean(); - } - - /** - * Have we strayed more than range blocks away from the center? - */ - private boolean isOutOfRange(StructureComponent parent, int nx, int ny, int nz, int range) { - -// System.out.println("x range is " + Math.abs(nx - parent.getBoundingBox().minX)); -// System.out.println("z range is " + Math.abs(nz - parent.getBoundingBox().minZ)); -// System.out.println("nz is " + nz + ", parent.minz is " + parent.getBoundingBox().minZ); - - return Math.abs(nx - parent.getBoundingBox().getCenterX()) > range - || Math.abs(nz - parent.getBoundingBox().getCenterZ()) > range; - } - - /** - * Make a new wing - */ - public boolean makeTowerWing(List list, Random rand, int index, int x, int y, int z, int wingSize, int wingHeight, int rotation) { - int direction = (getCoordBaseMode() + rotation) % 4; - int[] dx = offsetTowerCoords(x, y, z, wingSize, direction); - - //System.out.println("Making tower, index = " + index + ", list.size() = " + list.size()); - - // stop if out of range - if (isOutOfRange((StructureComponent) list.get(0), dx[0], dx[1], dx[2], RANGE)) - { - return false; - } - - ComponentTFIceTowerWing wing = new ComponentTFIceTowerWing(index, dx[0], dx[1], dx[2], wingSize, wingHeight, direction); - // check to see if it intersects something already there - StructureComponent intersect = StructureComponent.findIntersecting(list, wing.getBoundingBox()); - if (intersect == null || intersect == this) { - list.add(wing); - wing.buildComponent(list.get(0), list, rand); - addOpening(x, y, z, rotation); - return true; - } - else - { - return false; - } - - } - - /** - * Make a new wing - */ - public boolean makeBossTowerWing(List list, Random rand, int index, int x, int y, int z, int wingSize, int wingHeight, int rotation) { - - int direction = (getCoordBaseMode() + rotation) % 4; - int[] dx = offsetTowerCoords(x, y, z, wingSize, direction); - - ComponentTFIceTowerWing wing = new ComponentTFIceTowerBossWing(index, dx[0], dx[1], dx[2], wingSize, wingHeight, direction); - // check to see if it intersects something already there - StructureComponent intersect = StructureComponent.findIntersecting(list, wing.getBoundingBox()); - if (intersect == null || intersect == this) { - list.add(wing); - wing.buildComponent(list.get(0), list, rand); - addOpening(x, y, z, rotation); - return true; - } - else - { - return false; - } - - } - - - /** - * Gets a Y value where the stairs meet the specified X coordinate. - * Also works for Z coordinates. - */ - protected int getYByStairs(int rx, Random rand, int direction) { - - int floors = this.height / 10; - - return 11 + (rand.nextInt(floors - 1) * 10); - } - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - Random decoRNG = new Random(world.getSeed() + (this.boundingBox.minX * 321534781) ^ (this.boundingBox.minZ * 756839)); - - // make walls - //fillWithMetadataBlocks(world, sbb, 0, 0, 0, size - 1, height - 1, size - 1, deco.blockID, deco.blockMeta, Blocks.air, 0, false); - fillWithRandomizedBlocks(world, sbb, 0, 0, 0, size - 1, height - 1, size - 1, false, rand, deco.randomBlocks); - - // clear inside - fillWithAir(world, sbb, 1, 1, 1, size - 2, height - 2, size - 2); - - if (this.hasBase) - { - // deco to ground - for (int x = 0; x < this.size; x++) - { - for (int z = 0; z < this.size; z++) - { - this.func_151554_b(world, deco.blockID, deco.blockMeta, x, -1, z, sbb); - } - } - } - - // nullify sky light - this.nullifySkyLightForBoundingBox(world); - - // make floors - makeFloorsForTower(world, decoRNG, sbb); - - // openings - makeOpenings(world, sbb); - - - return true; - } - - /** - * Nullify all the sky light in this component bounding box - */ - public void nullifySkyLightForBoundingBox(World world) { - this.nullifySkyLight(world, boundingBox.minX + 1, boundingBox.minY + 1, boundingBox.minZ + 1, boundingBox.maxX - 1, boundingBox.maxY - 1, boundingBox.maxZ - 1); - } - - protected void makeFloorsForTower(World world, Random decoRNG, StructureBoundingBox sbb) { - int floors = this.height / 10; - - int ladderDir = 3; - int downLadderDir = -1; - - // divide the tower into floors - int floorHeight = 10; - for (int i = 0; i < floors - 1; i++) { - // put down a ceiling - placeFloor(world, decoRNG, sbb, floorHeight, i); - - downLadderDir = ladderDir; - ladderDir++; - ladderDir %= 4; - - decorateFloor(world, decoRNG, i, (i * floorHeight), (i * floorHeight) + floorHeight, ladderDir, downLadderDir, sbb); - - } - - int topFloor = floors - 1; - decorateTopFloor(world, decoRNG, topFloor, (topFloor * floorHeight), (topFloor * floorHeight) + floorHeight, ladderDir, downLadderDir, sbb); - - } - - /** - * Put down planks or whatevs for a floor - */ - protected void placeFloor(World world, Random rand, StructureBoundingBox sbb, int floorHeight, int floor) { - for (int x = 1; x < size - 1; x++) { - for (int z = 1; z < size - 1; z++) { - placeBlockAtCurrentPosition(world, deco.floorID, deco.floorMeta, x, (floor * floorHeight) + floorHeight, z, sbb); - } - } - } - - /** - * Make an opening in this tower for a door. This now only makes one opening, so you need two - */ - protected void makeDoorOpening(World world, int dx, int dy, int dz, StructureBoundingBox sbb) { - super.makeDoorOpening(world, dx, dy, dz, sbb); - - if (getBlockAtCurrentPosition(world, dx, dy + 2, dz, sbb) != Blocks.air) { - placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, dx, dy + 2, dz, sbb); - } - } - - /** - * Called to decorate each floor. This is responsible for adding a ladder up, the stub of the ladder going down, then picking a theme for each floor and executing it. - * - * @param floor - * @param bottom - * @param top - * @param ladderUpDir - * @param laddderDownDir - */ - protected void decorateFloor(World world, Random rand, int floor, int bottom, int top, int ladderUpDir, int ladderDownDir, StructureBoundingBox sbb) { - boolean hasTreasure = (this.treasureFloor == floor); - - switch (rand.nextInt(8)) { - case 0: - //this.fillBlocksRotated(world, sbb, 9, bottom + 5, 1, 10, top + 1, 7, Blocks.wool, ladderUpDir, ladderUpDir); - if (isNoDoorAreaRotated(9, bottom + 5, 1, 10, top + 1, 7, ladderUpDir)) { - decorateWraparoundWallSteps(world, rand, bottom, top, ladderUpDir, ladderDownDir, hasTreasure, sbb); - break; - } // fall through otherwise - case 1: - //this.fillBlocksRotated(world, sbb, 7, bottom, 0, 10, top + 1, 10, Blocks.wool, ladderUpDir, ladderUpDir); - if (isNoDoorAreaRotated(7, bottom, 0, 10, top + 1, 10, ladderUpDir)) { - decorateFarWallSteps(world, rand, bottom, top, ladderUpDir, ladderDownDir, hasTreasure, sbb); - break; - } // fall through otherwise - case 2: - if (isNoDoorAreaRotated(9, bottom + 5, 1, 10, top + 1, 7, ladderUpDir)) { - decorateWraparoundWallStepsPillars(world, rand, bottom, top, ladderUpDir, ladderDownDir, hasTreasure, sbb); - break; - } // fall through otherwise - case 3: - decoratePlatform(world, rand, bottom, top, ladderUpDir, ladderDownDir, hasTreasure, sbb); - break; - case 4: - decoratePillarParkour(world, rand, bottom, top, ladderUpDir, ladderDownDir, hasTreasure, sbb); - break; - case 5: - decoratePillarPlatforms(world, rand, bottom, top, ladderUpDir, ladderDownDir, hasTreasure, sbb); - break; - case 6: - decoratePillarPlatformsOutside(world, rand, bottom, top, ladderUpDir, ladderDownDir, hasTreasure, sbb); - break; - case 7: - default: - decorateQuadPillarStairs(world, rand, bottom, top, ladderUpDir, ladderDownDir, hasTreasure, sbb); - break; - } - - } - - private boolean isNoDoorAreaRotated(int minX, int minY, int minZ, int maxX, int maxY, int maxZ, int rotation) { - boolean isClear = true; - // make a bounding box of the area - StructureBoundingBox exclusionBox; - switch (rotation) { - case 0: - default: - exclusionBox = new StructureBoundingBox(minX, minY, minZ, maxX, maxY, maxZ); - break; - case 1: - exclusionBox = new StructureBoundingBox(this.size - 1 - maxZ, minY, minX, this.size - 1 - minZ, maxY, maxX); - break; - case 2: - exclusionBox = new StructureBoundingBox(this.size - 1 - maxX, minY, this.size - 1 - maxZ, this.size - 1 - minX, maxY, this.size - 1 - minZ); - break; - case 3: - exclusionBox = new StructureBoundingBox(minZ, minY, this.size - 1 - maxX, maxZ, maxY, this.size - 1 - minX); - break; - } - - for (ChunkCoordinates door : this.openings) { - if (exclusionBox.isVecInside(door.posX, door.posY, door.posZ)) { - isClear = false; - - //System.out.println("Found door in exclusion box, door = " + door); - } - } - - return isClear; - } - - protected void decorateTopFloor(World world, Random rand, int floor, int bottom, int top, int ladderUpDir, int ladderDownDir, StructureBoundingBox sbb) { - if (rand.nextBoolean()) { - decoratePillarsCorners(world, rand, bottom, top, ladderDownDir, sbb); - } else { - decoratePillarsGrid(world, rand, bottom, top, ladderDownDir, sbb); - } - - // generate treasure last so it doesn't get deleted - if (this.isDeadEnd()) { - decorateTopFloorTreasure(world, rand, bottom, top, ladderDownDir, sbb); - } - - } - - private void decorateTopFloorTreasure(World world, Random rand, int bottom, int top, int rotation, StructureBoundingBox sbb) { - this.fillBlocksRotated(world, sbb, 5, bottom + 1, 5, 5, bottom + 4, 5, deco.pillarID, deco.pillarMeta, rotation); - - this.placeTreasureAtCurrentPosition(world, null, 5, bottom + 5, 5, TFTreasure.aurora_room, sbb); - } - - private void decoratePillars(World world, Random rand, int bottom, int top, int rotation, StructureBoundingBox sbb) { - this.fillBlocksRotated(world, sbb, 3, bottom + 1, 3, 3, top - 1, 3, deco.pillarID, deco.pillarMeta, rotation); - this.fillBlocksRotated(world, sbb, 7, bottom + 1, 3, 7, top - 1, 3, deco.pillarID, deco.pillarMeta, rotation); - this.fillBlocksRotated(world, sbb, 3, bottom + 1, 7, 3, top - 1, 7, deco.pillarID, deco.pillarMeta, rotation); - this.fillBlocksRotated(world, sbb, 7, bottom + 1, 7, 7, top - 1, 7, deco.pillarID, deco.pillarMeta, rotation); - } - - private void decoratePillarsGrid(World world, Random rand, int bottom, int top, int rotation, StructureBoundingBox sbb) { - int beamMetaNS = ((this.coordBaseMode + rotation) % 2 == 0) ? 4 : 8; - int beamMetaEW = (beamMetaNS == 4) ? 8 : 4; - - this.fillBlocksRotated(world, sbb, 3, bottom + 5, 1, 3, bottom + 5, 9, deco.pillarID, deco.pillarMeta + beamMetaEW, rotation); - this.fillBlocksRotated(world, sbb, 7, bottom + 5, 1, 7, bottom + 5, 9, deco.pillarID, deco.pillarMeta + beamMetaEW, rotation); - this.fillBlocksRotated(world, sbb, 1, bottom + 5, 3, 9, bottom + 5, 3, deco.pillarID, deco.pillarMeta + beamMetaNS, rotation); - this.fillBlocksRotated(world, sbb, 1, bottom + 5, 7, 9, bottom + 5, 7, deco.pillarID, deco.pillarMeta + beamMetaNS, rotation); - - this.decoratePillars(world, rand, bottom, top, rotation, sbb); - } - - private void decoratePillarsCorners(World world, Random rand, int bottom, int top, int rotation, StructureBoundingBox sbb) { - int beamMetaNS = ((this.coordBaseMode + rotation) % 2 == 0) ? 4 : 8; - int beamMetaEW = (beamMetaNS == 4) ? 8 : 4; - - this.fillBlocksRotated(world, sbb, 3, bottom + 5, 1, 3, bottom + 5, 9, deco.pillarID, deco.pillarMeta + beamMetaEW, rotation); - this.fillBlocksRotated(world, sbb, 7, bottom + 5, 1, 7, bottom + 5, 9, deco.pillarID, deco.pillarMeta + beamMetaEW, rotation); - this.fillBlocksRotated(world, sbb, 1, bottom + 5, 3, 9, bottom + 5, 3, deco.pillarID, deco.pillarMeta + beamMetaNS, rotation); - this.fillBlocksRotated(world, sbb, 1, bottom + 5, 7, 9, bottom + 5, 7, deco.pillarID, deco.pillarMeta + beamMetaNS, rotation); - - this.fillAirRotated(world, sbb, 3, bottom + 5, 3, 7, bottom + 5, 7, rotation); - - this.decoratePillars(world, rand, bottom, top, rotation, sbb); - } - - private void decorateFarWallSteps(World world, Random rand, int bottom, int top, int ladderUpDir, int ladderDownDir, boolean hasTreasure, StructureBoundingBox sbb) { - - // far set of stairs - for (int z = 1; z < 10; z++) - { - int y = bottom + 10 - (z / 2); - this.placeBlockRotated(world, (z % 2 == 0) ? deco.pillarID : deco.platformID, (z % 2 == 0) ? deco.pillarMeta : deco.platformMeta, 9, y, z, ladderUpDir, sbb); - for (int by = bottom + 1; by < y; by++) - { - this.placeBlockRotated(world, deco.pillarID, deco.pillarMeta, 9, by, z, ladderUpDir, sbb); - } - } - - // near set of stairs - for (int z = 1; z < 10; z++) - { - int y = bottom + 1 + (z / 2); - this.placeBlockRotated(world, (z % 2 == 0) ? deco.platformID : deco.pillarID, (z % 2 == 0) ? deco.platformMeta : deco.pillarMeta, 8, y, z, ladderUpDir, sbb); - for (int by = bottom + 1; by < y; by++) - { - this.placeBlockRotated(world, deco.pillarID, deco.pillarMeta, 8, by, z, ladderUpDir, sbb); - } - } - - // entry stair - this.placeBlockRotated(world, deco.platformID, deco.platformMeta, 7, bottom + 1, 1, ladderUpDir, sbb); - - - // clear floor above - for (int z = 2; z < 7; z++) - { - this.placeBlockRotated(world, Blocks.air, 0, 9, top, z, ladderUpDir, sbb); - } - - // treasure! - if (hasTreasure) { - this.placeTreasureRotated(world, 1, bottom + 8, 5, ladderUpDir, TFTreasure.aurora_cache, false, sbb); - int beamMetaNS = ((this.coordBaseMode + ladderUpDir) % 2 == 0) ? 4 : 8; - this.placeBlockRotated(world, deco.pillarID, deco.pillarMeta + beamMetaNS, 1, bottom + 7, 5, ladderUpDir, sbb); - } - } - - private void decorateWraparoundWallSteps(World world, Random rand, int bottom, int top, int ladderUpDir, int ladderDownDir, boolean hasTreasure, StructureBoundingBox sbb) { - - // far set of stairs - for (int z = 1; z < 10; z++) - { - int y = bottom + 10 - (z / 2); - this.placeBlockRotated(world, deco.platformID, deco.platformMeta + ((z % 2 == 0) ? 8 : 0), 9, y, z, ladderUpDir, sbb); - } - - // right set of stairs - for (int x = 1; x < 9; x++) - { - int y = bottom + 2 + ((x - 1) / 2); - this.placeBlockRotated(world, deco.platformID, deco.platformMeta + ((x % 2 == 0) ? 8 : 0), x, y, 9, ladderUpDir, sbb); - } - - // entry stairs - this.placeBlockRotated(world, deco.platformID, deco.platformMeta + 8, 1, bottom + 1, 8, ladderUpDir, sbb); - this.placeBlockRotated(world, deco.platformID, deco.platformMeta, 1, bottom + 1, 7, ladderUpDir, sbb); - - - // clear floor above - for (int z = 2; z < 7; z++) - { - this.placeBlockRotated(world, Blocks.air, 0, 9, top, z, ladderUpDir, sbb); - } - - // treasure! - if (hasTreasure) { - this.placeTreasureRotated(world, 1, bottom + 5, 5, ladderUpDir, TFTreasure.aurora_cache, false, sbb); - int beamMetaNS = ((this.coordBaseMode + ladderUpDir) % 2 == 0) ? 4 : 8; - this.placeBlockRotated(world, deco.pillarID, deco.pillarMeta + beamMetaNS, 1, bottom + 4, 5, ladderUpDir, sbb); - } - } - - private void decorateWraparoundWallStepsPillars(World world, Random rand, int bottom, int top, int ladderUpDir, int ladderDownDir, boolean hasTreasure, StructureBoundingBox sbb) { - int rotation = ladderDownDir; - int beamMetaNS = ((this.coordBaseMode + rotation) % 2 == 0) ? 4 : 8; - int beamMetaEW = (beamMetaNS == 4) ? 8 : 4; - - this.decorateWraparoundWallSteps(world, rand, bottom, top, ladderUpDir, ladderDownDir, false, sbb); - this.decoratePillars(world, rand, bottom, top, rotation, sbb); - - this.fillBlocksRotated(world, sbb, 3, bottom + 5, 1, 3, bottom + 5, 2, deco.pillarID, deco.pillarMeta + beamMetaEW, rotation); - this.fillBlocksRotated(world, sbb, 7, bottom + 5, 1, 7, bottom + 5, 2, deco.pillarID, deco.pillarMeta + beamMetaEW, rotation); - this.fillBlocksRotated(world, sbb, 8, bottom + 5, 3, 9, bottom + 5, 3, deco.pillarID, deco.pillarMeta + beamMetaNS, rotation); - this.fillBlocksRotated(world, sbb, 8, bottom + 5, 7, 9, bottom + 5, 7, deco.pillarID, deco.pillarMeta + beamMetaNS, rotation); - - this.fillBlocksRotated(world, sbb, 1, bottom + 2, 3, 2, bottom + 2, 3, deco.pillarID, deco.pillarMeta + beamMetaNS, rotation); - this.fillBlocksRotated(world, sbb, 1, bottom + 6, 3, 2, bottom + 6, 3, deco.pillarID, deco.pillarMeta + beamMetaNS, rotation); - this.fillBlocksRotated(world, sbb, 1, bottom + 4, 7, 2, bottom + 4, 7, deco.pillarID, deco.pillarMeta + beamMetaNS, rotation); - this.fillBlocksRotated(world, sbb, 1, bottom + 8, 7, 2, bottom + 8, 7, deco.pillarID, deco.pillarMeta + beamMetaNS, rotation); - this.fillBlocksRotated(world, sbb, 3, bottom + 6, 8, 3, bottom + 6, 9, deco.pillarID, deco.pillarMeta + beamMetaEW, rotation); - this.fillBlocksRotated(world, sbb, 7, bottom + 8, 8, 7, bottom + 8, 9, deco.pillarID, deco.pillarMeta + beamMetaEW, rotation); - - // treasure! - if (hasTreasure) { - this.placeTreasureRotated(world, 7, bottom + 6, 1, ladderUpDir, TFTreasure.aurora_cache, false, sbb); - } - } - - private void decoratePlatform(World world, Random rand, int bottom, int top, int ladderUpDir, int ladderDownDir, boolean hasTreasure, StructureBoundingBox sbb) { - this.decoratePillars(world, rand, bottom, top, ladderDownDir, sbb); - this.fillBlocksRotated(world, sbb, 3, bottom + 5, 3, 7, bottom + 5, 7, deco.floorID, deco.floorMeta, ladderDownDir); - - // one flight - for (int z = 6; z < 10; z++) { - int y = bottom - 2 + (z / 2); - this.placeBlockRotated(world, deco.platformID, deco.platformMeta + ((z % 2 == 1) ? 8 : 0), 1, y, z, ladderDownDir, sbb); - } - // two flight - for (int x = 2; x < 6; x++) - { - int y = bottom + 2 + (x / 2); - this.placeBlockRotated(world, deco.platformID, deco.platformMeta + ((x % 2 == 1) ? 8 : 0), x, y, 9, ladderDownDir, sbb); - } - // connector - this.placeBlockRotated(world, deco.platformID, deco.platformMeta, 5, bottom + 5, 8, ladderDownDir, sbb); - - // connector - this.placeBlockRotated(world, deco.platformID, deco.platformMeta, 5, bottom + 6, 2, ladderUpDir, sbb); - // two flight - for (int x = 5; x < 10; x++) - { - int y = bottom + 4 + (x / 2); - this.placeBlockRotated(world, deco.platformID, deco.platformMeta + ((x % 2 == 1) ? 8 : 0), x, y, 1, ladderUpDir, sbb); - if (x > 6) { - this.placeBlockRotated(world, Blocks.air, 0, x, top, 1, ladderUpDir, sbb); - } - } - // one flight - for (int z = 2; z < 5; z++) { - int y = bottom + 8 + (z / 2); - this.placeBlockRotated(world, Blocks.air, 0, 9, top, z, ladderUpDir, sbb); - this.placeBlockRotated(world, deco.platformID, deco.platformMeta + ((z % 2 == 1) ? 8 : 0), 9, y, z, ladderUpDir, sbb); - } - - // treasure! - if (hasTreasure) { - this.placeTreasureRotated(world, 3, bottom + 6, 5, ladderDownDir, TFTreasure.aurora_cache, false, sbb); - } - } - - private void decorateQuadPillarStairs(World world, Random rand, int bottom, int top, int ladderUpDir, int ladderDownDir, boolean hasTreasure, StructureBoundingBox sbb) { - this.decoratePillars(world, rand, bottom, top, ladderDownDir, sbb); - - // one flight - for (int z = 6; z < 9; z++) { - int y = bottom - 2 + (z / 2); - this.placeBlockRotated(world, deco.platformID, deco.platformMeta + ((z % 2 == 1) ? 8 : 0), 2, y, z, ladderDownDir, sbb); - } - // two flight - for (int x = 3; x < 9; x++) - { - int y = bottom + 1 + (x / 2); - this.placeBlockRotated(world, deco.platformID, deco.platformMeta + ((x % 2 == 1) ? 8 : 0), x, y, 8, ladderDownDir, sbb); - } - // three flight - for (int z = 7; z > 1; z--) { - int y = top - 2 - ((z - 1) / 2); - if (z < 4) { - this.placeBlockRotated(world, Blocks.air, 0, 8, top, z, ladderDownDir, sbb); - } - this.placeBlockRotated(world, deco.platformID, deco.platformMeta + ((z % 2 == 1) ? 8 : 0), 8, y, z, ladderDownDir, sbb); - } - // last flight - for (int x = 7; x > 3; x--) { - int y = top + 1 - ((x - 1) / 2); - this.placeBlockRotated(world, Blocks.air, 0, x, top, 2, ladderDownDir, sbb); - this.placeBlockRotated(world, deco.platformID, deco.platformMeta + ((x % 2 == 1) ? 8 : 0), x, y, 2, ladderDownDir, sbb); - } - - // treasure! - if (hasTreasure) { - this.placeTreasureRotated(world, 3, bottom + 7, 7, ladderUpDir, TFTreasure.aurora_cache, false, sbb); - } - } - - private void decoratePillarPlatforms(World world, Random rand, int bottom, int top, int ladderUpDir, int ladderDownDir, boolean hasTreasure, StructureBoundingBox sbb) { - // platforms - for (int i = 1; i < 10; i++) { - int rotation = (ladderUpDir + i) % 4; - this.fillBlocksRotated(world, sbb, 2, bottom + i, 2, 4, bottom + i, 4, deco.floorID, deco.floorMeta, rotation); - } - - // clear - this.fillAirRotated(world, sbb, 2, top, 2, 8, top, 4, ladderUpDir); - this.fillAirRotated(world, sbb, 2, top, 2, 4, top, 6, ladderUpDir); - - // extra pillar tops - this.placeBlockRotated(world, deco.pillarID, deco.pillarMeta, 7, top, 3, ladderUpDir, sbb); - this.placeBlockRotated(world, deco.pillarID, deco.pillarMeta, 3, top, 3, ladderUpDir, sbb); - - this.decoratePillars(world, rand, bottom, top, ladderUpDir, sbb); - - // treasure! - if (hasTreasure) { - this.placeTreasureRotated(world, 3, bottom + 5, 2, ladderUpDir, TFTreasure.aurora_cache, false, sbb); - } - } - - private void decoratePillarPlatformsOutside(World world, Random rand, int bottom, int top, int ladderUpDir, int ladderDownDir, boolean hasTreasure, StructureBoundingBox sbb) { - // platforms - for (int i = 1; i < 8; i++) { - int rotation = (ladderUpDir + i) % 4; - this.fillBlocksRotated(world, sbb, 1, bottom + i, 1, 3, bottom + i, 3, deco.platformID, deco.platformMeta, rotation); - this.fillBlocksRotated(world, sbb, 4, bottom + i, 1, 6, bottom + i, 3, deco.floorID, deco.floorMeta, rotation); - } - - // stairs - int rotation = (ladderUpDir + 2) % 4; - - this.fillAirRotated(world, sbb, 5, top, 8, 9, top, 9, rotation); - this.fillAirRotated(world, sbb, 8, top, 6, 9, top, 9, rotation); - - this.fillBlocksRotated(world, sbb, 8, top - 2, 7, 9, top - 2, 7, deco.platformID, deco.platformMeta, rotation); - this.fillBlocksRotated(world, sbb, 8, top - 2, 8, 9, top - 2, 9, deco.floorID, deco.floorMeta, rotation); - this.fillBlocksRotated(world, sbb, 7, top - 1, 8, 7, top - 1, 9, deco.platformID, deco.platformMeta, rotation); - this.fillBlocksRotated(world, sbb, 6, top - 1, 8, 6, top - 1, 9, deco.platformID, deco.platformMeta | 8, rotation); - this.fillBlocksRotated(world, sbb, 5, top - 0, 8, 5, top - 0, 9, deco.platformID, deco.platformMeta, rotation); - - this.decoratePillars(world, rand, bottom, top, ladderUpDir, sbb); - - // treasure! - if (hasTreasure) { - this.placeTreasureRotated(world, 3, bottom + 5, 2, ladderUpDir, TFTreasure.aurora_cache, false, sbb); - } - } - - - private void decoratePillarParkour(World world, Random rand, int bottom, int top, int ladderUpDir, int ladderDownDir, boolean hasTreasure, StructureBoundingBox sbb) { - int rotation = ladderDownDir; - int beamMetaNS = ((this.coordBaseMode + rotation) % 2 == 0) ? 4 : 8; - int beamMetaEW = (beamMetaNS == 4) ? 8 : 4; - - // 4 pillars - this.decoratePillars(world, rand, bottom, top, rotation, sbb); - - // center pillar - this.placeBlockRotated(world, deco.pillarID, deco.pillarMeta, 5, bottom + 1, 5, rotation, sbb); - - // pillar 2 - this.fillBlocksRotated(world, sbb, 5, bottom + 2, 7, 5, bottom + 2, 9, deco.pillarID, deco.pillarMeta + beamMetaEW, rotation); - - // gap 3 - this.fillBlocksRotated(world, sbb, 1, bottom + 3, 7, 2, bottom + 3, 7, deco.pillarID, deco.pillarMeta + beamMetaNS, rotation); - this.fillBlocksRotated(world, sbb, 3, bottom + 3, 8, 3, bottom + 3, 9, deco.pillarID, deco.pillarMeta + beamMetaEW, rotation); - this.fillBlocksRotated(world, sbb, 1, bottom + 7, 7, 2, bottom + 7, 7, deco.pillarID, deco.pillarMeta + beamMetaNS, rotation); - this.fillBlocksRotated(world, sbb, 3, bottom + 7, 8, 3, bottom + 7, 9, deco.pillarID, deco.pillarMeta + beamMetaEW, rotation); - this.fillAirRotated(world, sbb, 3, bottom + 4, 7, 3, bottom + 6, 7, rotation); - - // pillar 4 - this.fillBlocksRotated(world, sbb, 1, bottom + 4, 5, 2, bottom + 4, 5, deco.pillarID, deco.pillarMeta + beamMetaNS, rotation); - - // gap 5 - this.fillBlocksRotated(world, sbb, 3, bottom + 5, 1, 3, bottom + 5, 2, deco.pillarID, deco.pillarMeta + beamMetaEW, rotation); - this.fillBlocksRotated(world, sbb, 1, bottom + 5, 3, 2, bottom + 5, 3, deco.pillarID, deco.pillarMeta + beamMetaNS, rotation); - this.fillAirRotated(world, sbb, 3, bottom + 6, 3, 3, bottom + 8, 3, rotation); - - // pillar 6 - this.fillBlocksRotated(world, sbb, 5, bottom + 6, 1, 5, bottom + 6, 2, deco.pillarID, deco.pillarMeta + beamMetaEW, rotation); - - // gap 7 - this.fillAirRotated(world, sbb, 7, bottom + 8, 3, 7, bottom + 10, 3, rotation); - this.fillBlocksRotated(world, sbb, 7, bottom + 7, 1, 7, bottom + 7, 2, deco.pillarID, deco.pillarMeta + beamMetaEW, rotation); - this.fillBlocksRotated(world, sbb, 8, bottom + 7, 3, 9, bottom + 7, 3, deco.pillarID, deco.pillarMeta + beamMetaNS, rotation); - - // pillar 8 - this.fillBlocksRotated(world, sbb, 8, bottom + 8, 5, 9, bottom + 8, 5, deco.pillarID, deco.pillarMeta + beamMetaNS, rotation); - - // gap 9 (no gap?) - //this.fillAirRotated(world, sbb, 7, bottom + 10, 7, 7, bottom + 10, 7, rotation); - this.fillBlocksRotated(world, sbb, 8, bottom + 9, 7, 9, bottom + 9, 7, deco.pillarID, deco.pillarMeta + beamMetaNS, rotation); - this.fillBlocksRotated(world, sbb, 7, bottom + 9, 8, 7, bottom + 9, 9, deco.pillarID, deco.pillarMeta + beamMetaEW, rotation); - - // holes in ceiling - this.fillAirRotated(world, sbb, 2, top, 2, 8, top, 4, ladderUpDir); - this.fillAirRotated(world, sbb, 2, top, 2, 4, top, 6, ladderUpDir); - - // treasure! - if (hasTreasure) { - this.placeTreasureRotated(world, 8, bottom + 8, 7, ladderUpDir, TFTreasure.aurora_cache, false, sbb); - } - } - - /** - * Attach a roof to this tower. - * - * This function keeps trying roofs starting with the largest and fanciest, and then keeps trying smaller and plainer ones - */ - public void makeARoof(StructureComponent parent, List list, Random rand) { - int index = this.getComponentType(); - tryToFitRoof(list, rand, new ComponentTFIceTowerRoof(index + 1, this)); - } - - /** - * Add a beard to this structure. There is only one type of beard. - */ - public void makeABeard(StructureComponent parent, List list, Random rand) { - int index = this.getComponentType(); - ComponentTFIceTowerBeard beard; - beard = new ComponentTFIceTowerBeard(index + 1, this); - list.add(beard); - beard.buildComponent(this, list, rand); - } - -} diff --git a/src/main/java/twilightforest/structures/icetower/StructureDecoratorIceTower.java b/src/main/java/twilightforest/structures/icetower/StructureDecoratorIceTower.java deleted file mode 100644 index 469f21df7a..0000000000 --- a/src/main/java/twilightforest/structures/icetower/StructureDecoratorIceTower.java +++ /dev/null @@ -1,33 +0,0 @@ -package twilightforest.structures.icetower; - -import net.minecraft.init.Blocks; -import twilightforest.block.TFBlocks; -import twilightforest.structures.StructureTFDecorator; - -public class StructureDecoratorIceTower extends StructureTFDecorator { - - public StructureDecoratorIceTower() - { - this.blockID = TFBlocks.auroraBlock; - this.blockMeta = 0; - - this.accentID = Blocks.planks; - this.accentMeta = 2; - - this.fenceID = Blocks.fence; - - this.stairID = Blocks.birch_stairs; - - this.pillarID = TFBlocks.auroraPillar; - this.pillarMeta = 0; - - this.platformID = Blocks.wooden_slab; - this.platformMeta = 2; - - this.floorID = Blocks.planks; - this.floorMeta = 2; - - this.randomBlocks = new StructureTFAuroraBricks(); - } - -} diff --git a/src/main/java/twilightforest/structures/icetower/StructureTFAuroraBricks.java b/src/main/java/twilightforest/structures/icetower/StructureTFAuroraBricks.java deleted file mode 100644 index 08c6ce7ae5..0000000000 --- a/src/main/java/twilightforest/structures/icetower/StructureTFAuroraBricks.java +++ /dev/null @@ -1,25 +0,0 @@ -package twilightforest.structures.icetower; - -import java.util.Random; - -import net.minecraft.init.Blocks; -import net.minecraft.world.gen.structure.StructureComponent; -import twilightforest.block.TFBlocks; - -public class StructureTFAuroraBricks extends StructureComponent.BlockSelector { - - @Override - public void selectBlocks(Random par1Random, int x, int y, int z, boolean wall) { - if (!wall) - { - this.field_151562_a = Blocks.air; - this.selectedBlockMetaData = 0; - } - else - { - this.field_151562_a = TFBlocks.auroraBlock; - this.selectedBlockMetaData = Math.abs(x + z) % 16; - } - } - -} diff --git a/src/main/java/twilightforest/structures/icetower/TFIceTowerPieces.java b/src/main/java/twilightforest/structures/icetower/TFIceTowerPieces.java deleted file mode 100644 index 2a4fdc9565..0000000000 --- a/src/main/java/twilightforest/structures/icetower/TFIceTowerPieces.java +++ /dev/null @@ -1,18 +0,0 @@ -package twilightforest.structures.icetower; - -import net.minecraft.world.gen.structure.MapGenStructureIO; - -public class TFIceTowerPieces { - - public static void registerPieces() - { - MapGenStructureIO.func_143031_a(ComponentTFIceTowerMain.class, "TFITMai"); - MapGenStructureIO.func_143031_a(ComponentTFIceTowerWing.class, "TFITWin"); - MapGenStructureIO.func_143031_a(ComponentTFIceTowerRoof.class, "TFITRoof"); - MapGenStructureIO.func_143031_a(ComponentTFIceTowerBeard.class, "TFITBea"); - MapGenStructureIO.func_143031_a(ComponentTFIceTowerBossWing.class, "TFITBoss"); - MapGenStructureIO.func_143031_a(ComponentTFIceTowerEntrance.class, "TFITEnt"); - MapGenStructureIO.func_143031_a(ComponentTFIceTowerBridge.class, "TFITBri"); - MapGenStructureIO.func_143031_a(ComponentTFIceTowerStairs.class, "TFITSt"); - } -} diff --git a/src/main/java/twilightforest/structures/lichtower/ComponentTFTowerBeard.java b/src/main/java/twilightforest/structures/lichtower/ComponentTFTowerBeard.java deleted file mode 100644 index e66ab85cc5..0000000000 --- a/src/main/java/twilightforest/structures/lichtower/ComponentTFTowerBeard.java +++ /dev/null @@ -1,73 +0,0 @@ -package twilightforest.structures.lichtower; - -import java.util.Random; - -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import twilightforest.structures.StructureTFComponent; - - -public class ComponentTFTowerBeard extends StructureTFComponent { - - int size; - int height; - - public ComponentTFTowerBeard() { - super(); - // TODO Auto-generated constructor stub - } - - public ComponentTFTowerBeard(int i, ComponentTFTowerWing wing) { - super(i); - - this.setCoordBaseMode(wing.getCoordBaseMode()); - this.size = wing.size - 2; - this.height = size / 2; - - // just hang out at the very bottom of the tower - this.boundingBox = new StructureBoundingBox(wing.getBoundingBox().minX + 1, wing.getBoundingBox().minY - this.height - 1, wing.getBoundingBox().minZ + 1, wing.getBoundingBox().maxX - 1, wing.getBoundingBox().minY - 1, wing.getBoundingBox().maxZ - 1); - - } - - /** - * Save to NBT - */ - @Override - protected void func_143012_a(NBTTagCompound par1NBTTagCompound) { - super.func_143012_a(par1NBTTagCompound); - - par1NBTTagCompound.setInteger("beardSize", this.size); - par1NBTTagCompound.setInteger("beardHeight", this.height); - } - - /** - * Load from NBT - */ - @Override - protected void func_143011_b(NBTTagCompound par1NBTTagCompound) { - super.func_143011_b(par1NBTTagCompound); - this.size = par1NBTTagCompound.getInteger("beardSize"); - this.height = par1NBTTagCompound.getInteger("beardHeight"); - } - - /** - * Makes a pyramid-shaped beard - */ - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - return makePyramidBeard(world, rand, sbb); - } - - private boolean makePyramidBeard(World world, Random rand, StructureBoundingBox sbb) { - for (int y = 0; y <= height ; y++) { - int min = y; - int max = size - y - 1; - - fillWithRandomizedBlocks(world, sbb, min, height - y, min, max, height - y, max, false, rand, StructureTFComponent.getStrongholdStones()); - } - return true; - } - - -} diff --git a/src/main/java/twilightforest/structures/lichtower/ComponentTFTowerBeardAttached.java b/src/main/java/twilightforest/structures/lichtower/ComponentTFTowerBeardAttached.java deleted file mode 100644 index 019721d42a..0000000000 --- a/src/main/java/twilightforest/structures/lichtower/ComponentTFTowerBeardAttached.java +++ /dev/null @@ -1,45 +0,0 @@ -package twilightforest.structures.lichtower; - -import java.util.Random; - -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import twilightforest.structures.StructureTFComponent; - - -public class ComponentTFTowerBeardAttached extends ComponentTFTowerBeard { - - public ComponentTFTowerBeardAttached() { - super(); - // TODO Auto-generated constructor stub - } - - - public ComponentTFTowerBeardAttached(int i, ComponentTFTowerWing wing) { - super(i, wing); - - // just hang out at the very bottom of the tower - this.boundingBox = new StructureBoundingBox(wing.getBoundingBox().minX, wing.getBoundingBox().minY - this.height - 1, wing.getBoundingBox().minZ, wing.getBoundingBox().maxX, wing.getBoundingBox().minY - 1, wing.getBoundingBox().maxZ); - - } - - - /** - * Makes a pyramid-shaped beard - */ - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - return makeAttachedBeard(world, rand, sbb); - } - - private boolean makeAttachedBeard(World world, Random rand, StructureBoundingBox sbb) { - for (int y = 0; y <= height ; y++) { - int min = y + 1; - int max = size - y; - - fillWithRandomizedBlocks(world, sbb, 0, height - y, min, max, height - y, max, false, rand, StructureTFComponent.getStrongholdStones()); - } - return true; - } - -} diff --git a/src/main/java/twilightforest/structures/lichtower/ComponentTFTowerBridge.java b/src/main/java/twilightforest/structures/lichtower/ComponentTFTowerBridge.java deleted file mode 100644 index 7daf3b122f..0000000000 --- a/src/main/java/twilightforest/structures/lichtower/ComponentTFTowerBridge.java +++ /dev/null @@ -1,87 +0,0 @@ -package twilightforest.structures.lichtower; - -import java.util.List; -import java.util.Random; - -import net.minecraft.init.Blocks; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import net.minecraft.world.gen.structure.StructureComponent; -import twilightforest.structures.StructureTFComponent; - - -public class ComponentTFTowerBridge extends ComponentTFTowerWing { - - - int dSize; - int dHeight; - - public ComponentTFTowerBridge() { - super(); - // TODO Auto-generated constructor stub - } - - - protected ComponentTFTowerBridge(int i, int x, int y, int z, int pSize, int pHeight, int direction) { - super(i, x, y, z, 3, 3, direction); - - this.dSize = pSize; - this.dHeight = pHeight; - } - - - @SuppressWarnings({ "rawtypes", "unchecked" }) - @Override - public void buildComponent(StructureComponent parent, List list, Random rand) { - - - int[] dest = new int[] {2, 1, 1};//getValidOpening(rand, 0); - - makeTowerWing(list, rand, 1, dest[0], dest[1], dest[2], dSize, dHeight, 0); - } - - /** - * Gets the bounding box of the tower wing we would like to make. - * @return - */ - public StructureBoundingBox getWingBB() { - int[] dest = offsetTowerCoords(2, 1, 1, dSize, this.getCoordBaseMode()); - return StructureTFComponent.getComponentToAddBoundingBox(dest[0], dest[1], dest[2], 0, 0, 0, dSize - 1, dHeight - 1, dSize - 1, this.getCoordBaseMode()); - } - - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - - // make walls - for (int x = 0; x < 3; x++) { - placeBlockAtCurrentPosition(world, Blocks.fence, 0, x, 2, 0, sbb); - placeBlockAtCurrentPosition(world, Blocks.fence, 0, x, 2, 2, sbb); - placeBlockAtCurrentPosition(world, Blocks.stonebrick, 0, x, 1, 0, sbb); - placeBlockAtCurrentPosition(world, Blocks.stonebrick, 0, x, 1, 2, sbb); - placeBlockAtCurrentPosition(world, Blocks.stonebrick, 0, x, 0, 0, sbb); - placeBlockAtCurrentPosition(world, Blocks.stonebrick, 0, x, 0, 1, sbb); - placeBlockAtCurrentPosition(world, Blocks.stonebrick, 0, x, 0, 2, sbb); - placeBlockAtCurrentPosition(world, Blocks.stonebrick, 0, x, -1, 1, sbb); - } - - // try two blocks outside the boundries - placeBlockAtCurrentPosition(world, Blocks.stonebrick, 0, -1, -1, 1, sbb); - placeBlockAtCurrentPosition(world, Blocks.stonebrick, 0, 3, -1, 1, sbb); - - // clear bridge walkway - this.fillWithAir(world, sbb, 0, 1, 1, 2, 2, 1); - - - // marker blocks -// placeBlockAtCurrentPosition(world, Blocks.wool, this.coordBaseMode, size / 2, 2, size / 2, sbb); -// placeBlockAtCurrentPosition(world, Blocks.gold_block, 0, 0, 0, 0, sbb); - - // door opening? -// makeDoorOpening(world, sbb); - - - - return true; - } -} diff --git a/src/main/java/twilightforest/structures/lichtower/ComponentTFTowerMain.java b/src/main/java/twilightforest/structures/lichtower/ComponentTFTowerMain.java deleted file mode 100644 index 947fe9229d..0000000000 --- a/src/main/java/twilightforest/structures/lichtower/ComponentTFTowerMain.java +++ /dev/null @@ -1,505 +0,0 @@ -package twilightforest.structures.lichtower; - -import java.util.List; -import java.util.Random; - -import net.minecraft.init.Blocks; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.ChunkCoordinates; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import net.minecraft.world.gen.structure.StructureComponent; -import twilightforest.block.TFBlocks; -import twilightforest.entity.TFCreatures; -import twilightforest.structures.StructureTFComponent; - - -public class ComponentTFTowerMain extends ComponentTFTowerWing { - - public ComponentTFTowerMain() { - super(); - // TODO Auto-generated constructor stub - } - - public ComponentTFTowerMain(World world, Random rand, int index, int x, int y, int z) { - // some of these are subject to change if the ground level is > 30. - super(index, x, y, z, 15, 55 + rand.nextInt(32), 0); - } - - @SuppressWarnings({ "unchecked", "rawtypes" }) - @Override - public void buildComponent(StructureComponent parent, List list, Random rand) { - // add a roof? - makeARoof(parent, list, rand); - - // sub towers - for (int i = 0; i < 4; i++) { - int[] dest = getValidOpening(rand, i); - - // adjust height if we're too low at this point - if (dest[1] < height / 2) { - dest[1] += 20; - } - - int childHeight = Math.min(21 + rand.nextInt(10), this.height - dest[1] - 3); - - if (!makeTowerWing(list, rand, 1, dest[0], dest[1], dest[2], 9, childHeight, i)) { - makeTowerWing(list, rand, 1, dest[0], dest[1], dest[2], 7, childHeight, i); - } - } - - // try one more time for large towers - for (int i = 0; i < 4; i++) { - int[] dest = getValidOpening(rand, i); - - // adjust height if we're too low at this point - if (dest[1] < height / 2) { - dest[1] += 10; - } - - int childHeight = Math.min(21 + rand.nextInt(10), this.height - dest[1] - 3); - - if (!makeTowerWing(list, rand, 1, dest[0], dest[1], dest[2], 9, childHeight, i)) { - makeTowerWing(list, rand, 1, dest[0], dest[1], dest[2], 7, childHeight, i); - } - } - - // another set, if possible - for (int i = 0; i < 4; i++) { - int[] dest = getValidOpening(rand, i); - - int childHeight = Math.min(7 + rand.nextInt(6), this.height - dest[1] - 3); - - if (!makeTowerWing(list, rand, 1, dest[0], dest[1], dest[2], 5, childHeight, i)) { - makeTowerWing(list, rand, 1, dest[0], dest[1], dest[2], 3, childHeight, i); - } - } - - // outbuildings - for (int i = 0; i < 4; i++) { - int[] dest = getOutbuildingOpening(rand, i); - - int childHeight = 11 + rand.nextInt(10); - int childSize = 7 + (rand.nextInt(2) * 2); - - makeTowerOutbuilding(list, rand, 1, dest[0], dest[1], dest[2], childSize, childHeight, i); - } - - // TINY TOWERS! - for (int i = 0; i < 16; i++) { - int[] dest = getValidOpening(rand, i % 4); - int childHeight = 6 + rand.nextInt(5); - if (rand.nextInt(3) == 0 || !makeTowerWing(list, rand, 1, dest[0], dest[1], dest[2], 5, childHeight, i % 4)) { - makeTowerWing(list, rand, 1, dest[0], dest[1], dest[2], 3, childHeight, i % 4); - } - } - - } - - /** - * Gets a random position in the specified direction that we can make an outbuilding at - */ - public int[] getOutbuildingOpening(Random rand, int rotation) { - - int rx = 0; - int ry = 1; - int rz = 0; - - switch (rotation) { - case 0: - // for directions 0 or 2, the wall lies along the z axis - rx = size -1; - rz = 6 + rand.nextInt(8); - break; - case 1: - // for directions 1 or 3, the wall lies along the x axis - rx = 1 + rand.nextInt(11); - rz = size - 1; - break; - case 2: - rx = 0; - rz = 1 + rand.nextInt(8); - break; - case 3: - rx = 3 + rand.nextInt(11); - rz = 0; - break; - } - - return new int[] {rx, ry, rz}; - } - - - public boolean makeTowerOutbuilding(List list, Random rand, int index, int x, int y, int z, int wingSize, int wingHeight, int rotation) { - int direction = (getCoordBaseMode() + rotation) % 4; - int[] dx = offsetTowerCoords(x, y, z, wingSize, direction); - ComponentTFTowerOutbuilding outbuilding = new ComponentTFTowerOutbuilding(index, dx[0], dx[1], dx[2], wingSize, wingHeight, direction); - // check to see if it intersects something already there - StructureComponent intersect = StructureComponent.findIntersecting(list, outbuilding.getBoundingBox()); - if (intersect == null || intersect == this) { - list.add(outbuilding); - outbuilding.buildComponent(this, list, rand); - addOpening(x, y, z, rotation); - return true; - } else { -// System.out.println("Planned outbuilding intersects with " + intersect); - return false; - } - } - - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - // make walls - fillWithRandomizedBlocks(world, sbb, 0, 0, 0, size - 1, height - 1, size - 1, false, rand, StructureTFComponent.getStrongholdStones()); - - // clear inside - fillWithAir(world, sbb, 1, 1, 1, size - 2, height - 2, size - 2); - - // stone to ground - for (int x = 0; x < this.size; x++) - { - for (int z = 0; z < this.size; z++) - { - this.func_151554_b(world, Blocks.cobblestone, 0, x, -1, z, sbb); - } - - } - - // nullify sky light - nullifySkyLightForBoundingBox(world); - - // fix highestOpening parameter so we don't get a ginormous lich room - if ((height - highestOpening) > 15) { - highestOpening = height - 15; - } - - - // stairs! - makeStairs(world, rand, sbb); - - // throw a bunch of opening markers in there -// makeOpeningMarkers(world, rand, 100, sbb); - - // openings - makeOpenings(world, sbb); - - // decorate? - decorateStairFloor(world, rand, sbb); - - // stairway crossings - makeStairwayCrossings(world, rand, sbb); - - // LICH TIME - makeLichRoom(world, rand, sbb); - - // extra paintings in main tower - makeTowerPaintings(world, rand, sbb); - - - - return true; - } - - /** - * Make 1-2 platforms joining the stairways - */ - protected void makeStairwayCrossings(World world, Random rand, StructureBoundingBox sbb) { - int flights = (this.highestOpening / 5) - 2; - - for (int i = 2 + rand.nextInt(2); i < flights; i += 1 + rand.nextInt(5)) { - makeStairCrossing(world, rand, i, sbb); - } - } - - protected void makeStairCrossing(World world, Random rand, int flight, StructureBoundingBox sbb) { - int temp = this.getCoordBaseMode(); - if (flight % 2 == 0) { - this.setCoordBaseMode((getCoordBaseMode() + 1) % 4); - } - - int floorMeta = rand.nextInt(2) == 0 ? 0 : 2; - int floorLevel = 0 + flight * 5; - - // place platform - for (int dx = 6; dx <= 8; dx++) { - for (int dz = 4; dz <= 10; dz++) { - placeBlockAtCurrentPosition(world, Blocks.double_stone_slab, floorMeta, dx, floorLevel, dz, sbb); - } - } - - // put fences - floorLevel++; - int dx = 6; - for (int dz = 3; dz <= 11; dz++) { - placeBlockAtCurrentPosition(world, Blocks.fence, 0, dx, floorLevel, dz, sbb); - } - dx++; - for (int dz = 3; dz <= 11; dz++) { - placeBlockAtCurrentPosition(world, Blocks.air, 0, dx, floorLevel, dz, sbb); - } - dx++; - for (int dz = 3; dz <= 11; dz++) { - placeBlockAtCurrentPosition(world, Blocks.fence, 0, dx, floorLevel, dz, sbb); - } - - // we need 2 extra blocks and 2 extra fences to look good - placeBlockAtCurrentPosition(world, Blocks.double_stone_slab, floorMeta, 6, floorLevel - 1, 11, sbb); - placeBlockAtCurrentPosition(world, Blocks.double_stone_slab, floorMeta, 8, floorLevel - 1, 3, sbb); - - placeBlockAtCurrentPosition(world, Blocks.fence, 0, 5, floorLevel, 11, sbb); - placeBlockAtCurrentPosition(world, Blocks.fence, 0, 9, floorLevel, 3, sbb); - - // place spawner in the middle - String mobID = "Skeleton"; - switch (rand.nextInt(4)) - { - case 0: - case 1: - mobID = "Skeleton"; - break; - case 2: - mobID = "Zombie"; - break; - case 3: - mobID = TFCreatures.getSpawnerNameFor("Swarm Spider"); - break; - } - placeSpawnerAtCurrentPosition(world, rand, 7, floorLevel + 2, 7, mobID, sbb); - - // make a fence arch support for the spawner - placeBlockAtCurrentPosition(world, Blocks.fence, 0, 6, floorLevel + 1, 7, sbb); - placeBlockAtCurrentPosition(world, Blocks.fence, 0, 8, floorLevel + 1, 7, sbb); - placeBlockAtCurrentPosition(world, Blocks.fence, 0, 6, floorLevel + 2, 7, sbb); - placeBlockAtCurrentPosition(world, Blocks.fence, 0, 8, floorLevel + 2, 7, sbb); - - - this.setCoordBaseMode(temp); - } - - /** - * Make a neat little room for the lich to fight in - */ - protected void makeLichRoom(World world, Random rand, StructureBoundingBox sbb) { - // figure out where the stairs end - int floorLevel = 2 + (this.highestOpening / 5) * 5; - // we need a floor - makeLichFloor(world, floorLevel, (this.highestOpening / 5) % 2, sbb); - - // now a chandelier - decorateLichChandelier(world, floorLevel, sbb); - - // make paintings - decoratePaintings(world, rand, floorLevel, sbb); - - // and wall torches - decorateTorches(world, rand, floorLevel, sbb); - - // seems like we should have a spawner - placeBlockAtCurrentPosition(world, TFBlocks.bossSpawner, 1, size / 2, floorLevel + 2, size / 2, sbb); - } - - - protected void makeTowerPaintings(World world, Random rand, StructureBoundingBox sbb) { - int howMany = 10; - - // do wall 0. - generatePaintingsOnWall(world, rand, howMany, 0, 0, 48, sbb); - generatePaintingsOnWall(world, rand, howMany, 0, 0, 32, sbb); - generatePaintingsOnWall(world, rand, howMany, 0, 0, 0, sbb); - - // do wall 1. - generatePaintingsOnWall(world, rand, howMany, 0, 1, 48, sbb); - generatePaintingsOnWall(world, rand, howMany, 0, 1, 32, sbb); - generatePaintingsOnWall(world, rand, howMany, 0, 1, 0, sbb); - // do wall 2. - generatePaintingsOnWall(world, rand, howMany, 0, 2, 48, sbb); - generatePaintingsOnWall(world, rand, howMany, 0, 2, 32, sbb); - generatePaintingsOnWall(world, rand, howMany, 0, 2, 0, sbb); - // do wall 3. - generatePaintingsOnWall(world, rand, howMany, 0, 3, 48, sbb); - generatePaintingsOnWall(world, rand, howMany, 0, 3, 32, sbb); - generatePaintingsOnWall(world, rand, howMany, 0, 3, 0, sbb); - } - - /** - * Make the floor for the liches room - */ - protected void makeLichFloor(World world, int floorLevel, int rotation, StructureBoundingBox sbb) { - int temp = this.getCoordBaseMode(); - this.setCoordBaseMode((this.getCoordBaseMode() + rotation) % 4); - - // place a platform there - for (int fx = 1; fx < 14; fx++) { - for (int fz = 1; fz < 14; fz++) { - if ((fx == 1 || fx == 2) && (fz >= 6 && fz <= 12)) { - // blank, leave room for stairs - if (fz == 6) { - // upside down plank slabs - placeBlockAtCurrentPosition(world, Blocks.wooden_slab, 10, fx, floorLevel, fz, sbb); - } - } - else if ((fx == 12 || fx == 13) && (fz >= 3 && fz <= 8)) { - // blank, leave room for stairs - if (fz == 8) { - // upside down plank slabs - placeBlockAtCurrentPosition(world, Blocks.wooden_slab, 10, fx, floorLevel, fz, sbb); - } - } - else if ((fx >= 4 && fx <= 10) && (fz >= 4 && fz <= 10)) { - // glass floor in center, aside from 2 corners - if ((fx == 4 && fz == 4) || (fx == 10 && fz == 10)) { - placeBlockAtCurrentPosition(world, Blocks.planks, 2, fx, floorLevel, fz, sbb); - } - else { - placeBlockAtCurrentPosition(world, Blocks.glass, 0, fx, floorLevel, fz, sbb); - } - } - else if ((fx == 2 || fx == 3) && (fz == 2 || fz == 3)) { - // glass blocks in the corners - placeBlockAtCurrentPosition(world, Blocks.glass, 0, fx, floorLevel, fz, sbb); - } - else if ((fx == 11 || fx == 12) && (fz == 11 || fz == 12)) { - // glass blocks in the corners - placeBlockAtCurrentPosition(world, Blocks.glass, 0, fx, floorLevel, fz, sbb); - } - else { - placeBlockAtCurrentPosition(world, Blocks.planks, 2, fx, floorLevel, fz, sbb); - } - } - } - - // eliminate the railings - placeBlockAtCurrentPosition(world, Blocks.air, 0, 3, floorLevel + 1, 11, sbb); - placeBlockAtCurrentPosition(world, Blocks.air, 0, 3, floorLevel + 1, 10, sbb); - placeBlockAtCurrentPosition(world, Blocks.air, 0, 3, floorLevel + 2, 11, sbb); - - placeBlockAtCurrentPosition(world, Blocks.air, 0, 11, floorLevel + 1, 3, sbb); - placeBlockAtCurrentPosition(world, Blocks.air, 0, 11, floorLevel + 1, 4, sbb); - placeBlockAtCurrentPosition(world, Blocks.air, 0, 11, floorLevel + 2, 3, sbb); - - this.setCoordBaseMode(temp); - - } - - /** - * Make a fancy chandelier for the lich's room - */ - protected void decorateLichChandelier(World world, int floorLevel, StructureBoundingBox sbb) { - int cx = size / 2; - int cy = floorLevel + 4; - int cz = size / 2; - - placeBlockAtCurrentPosition(world, Blocks.fence, 0, cx + 1, cy, cz + 0, sbb); - placeBlockAtCurrentPosition(world, Blocks.fence, 0, cx + 2, cy, cz + 0, sbb); - placeBlockAtCurrentPosition(world, Blocks.fence, 0, cx + 1, cy, cz + 1, sbb); - placeBlockAtCurrentPosition(world, Blocks.fence, 0, cx + 0, cy, cz + 1, sbb); - placeBlockAtCurrentPosition(world, Blocks.fence, 0, cx + 0, cy, cz + 2, sbb); - placeBlockAtCurrentPosition(world, Blocks.fence, 0, cx - 1, cy, cz + 1, sbb); - placeBlockAtCurrentPosition(world, Blocks.fence, 0, cx - 1, cy, cz + 0, sbb); - placeBlockAtCurrentPosition(world, Blocks.fence, 0, cx - 2, cy, cz + 0, sbb); - placeBlockAtCurrentPosition(world, Blocks.fence, 0, cx - 1, cy, cz - 1, sbb); - placeBlockAtCurrentPosition(world, Blocks.fence, 0, cx + 0, cy, cz - 1, sbb); - placeBlockAtCurrentPosition(world, Blocks.fence, 0, cx + 0, cy, cz - 2, sbb); - placeBlockAtCurrentPosition(world, Blocks.fence, 0, cx + 1, cy, cz - 1, sbb); - - cy++; - placeBlockAtCurrentPosition(world, Blocks.fence, 0, cx + 1, cy, cz + 0, sbb); - placeBlockAtCurrentPosition(world, Blocks.torch, 0, cx + 2, cy, cz + 0, sbb); - placeBlockAtCurrentPosition(world, Blocks.torch, 0, cx + 1, cy, cz + 1, sbb); - placeBlockAtCurrentPosition(world, Blocks.fence, 0, cx + 0, cy, cz + 1, sbb); - placeBlockAtCurrentPosition(world, Blocks.torch, 0, cx + 0, cy, cz + 2, sbb); - placeBlockAtCurrentPosition(world, Blocks.torch, 0, cx - 1, cy, cz + 1, sbb); - placeBlockAtCurrentPosition(world, Blocks.fence, 0, cx - 1, cy, cz + 0, sbb); - placeBlockAtCurrentPosition(world, Blocks.torch, 0, cx - 2, cy, cz + 0, sbb); - placeBlockAtCurrentPosition(world, Blocks.torch, 0, cx - 1, cy, cz - 1, sbb); - placeBlockAtCurrentPosition(world, Blocks.fence, 0, cx + 0, cy, cz - 1, sbb); - placeBlockAtCurrentPosition(world, Blocks.torch, 0, cx + 0, cy, cz - 2, sbb); - placeBlockAtCurrentPosition(world, Blocks.torch, 0, cx + 1, cy, cz - 1, sbb); - - cy++; - placeBlockAtCurrentPosition(world, Blocks.torch, 0, cx + 1, cy, cz + 0, sbb); - placeBlockAtCurrentPosition(world, Blocks.torch, 0, cx + 0, cy, cz + 1, sbb); - placeBlockAtCurrentPosition(world, Blocks.torch, 0, cx - 1, cy, cz + 0, sbb); - placeBlockAtCurrentPosition(world, Blocks.torch, 0, cx + 0, cy, cz - 1, sbb); - - for (int y = floorLevel + 5; y < height - 1; y++) { - placeBlockAtCurrentPosition(world, Blocks.fence, 0, cx + 0, y, cz + 0, sbb); - } - } - - /** - * Cover the walls in the lich's room with paintings. How is this going to work, chunk by chunk? - */ - protected void decoratePaintings(World world, Random rand, int floorLevel, StructureBoundingBox sbb) { - int howMany = 100; - - // do wall 0. - generatePaintingsOnWall(world, rand, howMany, floorLevel, 0, 48, sbb); - generatePaintingsOnWall(world, rand, howMany, floorLevel, 0, 32, sbb); - generatePaintingsOnWall(world, rand, howMany, floorLevel, 0, 0, sbb); - - // do wall 1. - generatePaintingsOnWall(world, rand, howMany, floorLevel, 1, 48, sbb); - generatePaintingsOnWall(world, rand, howMany, floorLevel, 1, 32, sbb); - generatePaintingsOnWall(world, rand, howMany, floorLevel, 1, 0, sbb); - // do wall 2. - generatePaintingsOnWall(world, rand, howMany, floorLevel, 2, 48, sbb); - generatePaintingsOnWall(world, rand, howMany, floorLevel, 2, 32, sbb); - generatePaintingsOnWall(world, rand, howMany, floorLevel, 2, 0, sbb); - // do wall 3. - generatePaintingsOnWall(world, rand, howMany, floorLevel, 3, 48, sbb); - generatePaintingsOnWall(world, rand, howMany, floorLevel, 3, 32, sbb); - generatePaintingsOnWall(world, rand, howMany, floorLevel, 3, 0, sbb); - - } - - /** - * Put torches on each wall - */ - protected void decorateTorches(World world, Random rand, int floorLevel, StructureBoundingBox sbb) { - generateTorchesOnWall(world, rand, floorLevel, 0, sbb); - generateTorchesOnWall(world, rand, floorLevel, 1, sbb); - generateTorchesOnWall(world, rand, floorLevel, 2, sbb); - generateTorchesOnWall(world, rand, floorLevel, 3, sbb); - } - - /** - * Place up to 10 torches (with fence holders) on the wall, checking that they don't overlap any paintings or other torches - */ - protected void generateTorchesOnWall(World world, Random rand, - int floorLevel, int direction, StructureBoundingBox sbb) { - for (int i = 0; i < 10; i++) { - // get some random coordinates on the wall in the chunk - ChunkCoordinates wCoords = getRandomWallSpot(rand, floorLevel, direction, sbb); - - // offset to see where the fence should be - ChunkCoordinates tCoords = new ChunkCoordinates(wCoords); - if (direction == 0) { - tCoords.posZ++; - } - if (direction == 1) { - tCoords.posX--; - } - if (direction == 2) { - tCoords.posZ--; - } - if (direction == 3) { - tCoords.posX++; - } - - - // is there a painting or another torch there? - AxisAlignedBB torchBox = AxisAlignedBB.getBoundingBox(tCoords.posX, tCoords.posY, tCoords.posZ, tCoords.posX + 1.0, tCoords.posY + 2.0, tCoords.posZ + 1.0); - if (world.getBlock(tCoords.posX, tCoords.posY, tCoords.posZ) == Blocks.air && world.getBlock(tCoords.posX, tCoords.posY + 1, tCoords.posZ) == Blocks.air && world.getEntitiesWithinAABBExcludingEntity(null, torchBox).size() == 0) - { - // if not, place a torch - world.setBlock(tCoords.posX, tCoords.posY, tCoords.posZ, Blocks.fence, 0, 2); - world.setBlock(tCoords.posX, tCoords.posY + 1, tCoords.posZ, Blocks.torch, 5, 2); - } - } - } - - - -} diff --git a/src/main/java/twilightforest/structures/lichtower/ComponentTFTowerOutbuilding.java b/src/main/java/twilightforest/structures/lichtower/ComponentTFTowerOutbuilding.java deleted file mode 100644 index 489745a53e..0000000000 --- a/src/main/java/twilightforest/structures/lichtower/ComponentTFTowerOutbuilding.java +++ /dev/null @@ -1,59 +0,0 @@ -package twilightforest.structures.lichtower; - -import java.util.List; -import java.util.Random; - -import net.minecraft.init.Blocks; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import net.minecraft.world.gen.structure.StructureComponent; - - -public class ComponentTFTowerOutbuilding extends ComponentTFTowerWing { - - public ComponentTFTowerOutbuilding() { - super(); - // TODO Auto-generated constructor stub - } - - protected ComponentTFTowerOutbuilding(int i, int x, int y, int z, int pSize, int pHeight, int direction) { - super(i, x, y, z, pSize, pHeight, direction); - // TODO Auto-generated constructor stub - } - - /** - * NO BEARDS! - */ - @Override - public void makeABeard(StructureComponent parent, List list, Random rand) { - return; - } - - /** - * Outbuildings should not make new wings close to the ground. - */ - @Override - public boolean makeTowerWing(List list, Random rand, int index, int x, int y, int z, int wingSize, int wingHeight, int direction) { - if (y > 7) { - return super.makeTowerWing(list, rand, index, x, y, z, wingSize, wingHeight, direction); - } - else { - return false; - } - } - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - for (int x = 0; x < this.size; x++) - { - for (int z = 0; z < this.size; z++) - { - this.func_151554_b(world, Blocks.cobblestone, 0, x, -1, z, sbb); - } - } - return super.addComponentParts(world, rand, sbb); - } - - - -} diff --git a/src/main/java/twilightforest/structures/lichtower/ComponentTFTowerRoof.java b/src/main/java/twilightforest/structures/lichtower/ComponentTFTowerRoof.java deleted file mode 100644 index 4a7672254f..0000000000 --- a/src/main/java/twilightforest/structures/lichtower/ComponentTFTowerRoof.java +++ /dev/null @@ -1,110 +0,0 @@ -package twilightforest.structures.lichtower; - -import java.util.List; -import java.util.Random; - -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import net.minecraft.world.gen.structure.StructureComponent; -import twilightforest.structures.StructureTFComponent; - - -public abstract class ComponentTFTowerRoof extends StructureTFComponent { - - protected int size; - protected int height; - - public ComponentTFTowerRoof() { - super(); - // TODO Auto-generated constructor stub - } - - public ComponentTFTowerRoof(int i, ComponentTFTowerWing wing) { - super(i); - - this.spawnListIndex = -1; - - // inheritors need to add a bounding box or die~! - } - - /** - * Save to NBT - */ - @Override - protected void func_143012_a(NBTTagCompound par1NBTTagCompound) { - super.func_143012_a(par1NBTTagCompound); - - par1NBTTagCompound.setInteger("roofSize", this.size); - par1NBTTagCompound.setInteger("roofHeight", this.height); - } - - /** - * Load from NBT - */ - @Override - protected void func_143011_b(NBTTagCompound par1NBTTagCompound) { - super.func_143011_b(par1NBTTagCompound); - this.size = par1NBTTagCompound.getInteger("roofSize"); - this.height = par1NBTTagCompound.getInteger("roofHeight"); - } - - /** - * Makes a bounding box that hangs forwards off of the tower wing we are on. This is for attached roofs. - * - * @param wing - */ - protected void makeAttachedOverhangBB(ComponentTFTowerWing wing) { - // just hang out at the very top of the tower - switch (getCoordBaseMode()) { - case 0: - this.boundingBox = new StructureBoundingBox(wing.getBoundingBox().minX, wing.getBoundingBox().maxY, wing.getBoundingBox().minZ - 1, wing.getBoundingBox().maxX + 1, wing.getBoundingBox().maxY + this.height - 1, wing.getBoundingBox().maxZ + 1); - break; - case 1: - this.boundingBox = new StructureBoundingBox(wing.getBoundingBox().minX - 1, wing.getBoundingBox().maxY, wing.getBoundingBox().minZ, wing.getBoundingBox().maxX + 1, wing.getBoundingBox().maxY + this.height - 1, wing.getBoundingBox().maxZ + 1); - break; - case 2: - this.boundingBox = new StructureBoundingBox(wing.getBoundingBox().minX - 1, wing.getBoundingBox().maxY, wing.getBoundingBox().minZ - 1, wing.getBoundingBox().maxX, wing.getBoundingBox().maxY + this.height - 1, wing.getBoundingBox().maxZ + 1); - break; - case 3: - this.boundingBox = new StructureBoundingBox(wing.getBoundingBox().minX - 1, wing.getBoundingBox().maxY, wing.getBoundingBox().minZ - 1, wing.getBoundingBox().maxX + 1, wing.getBoundingBox().maxY + this.height - 1, wing.getBoundingBox().maxZ); - break; - } - } - - - /** - * Makes a bounding box that sits at the top of the tower. Works for attached or freestanding roofs. - * - * @param wing - */ - protected void makeCapBB(ComponentTFTowerWing wing) { - this.boundingBox = new StructureBoundingBox(wing.getBoundingBox().minX, wing.getBoundingBox().maxY, wing.getBoundingBox().minZ, wing.getBoundingBox().maxX, wing.getBoundingBox().maxY + this.height, wing.getBoundingBox().maxZ); - } - - - /** - * Make a bounding box that hangs over the sides of the tower 1 block. Freestanding towers only. - * - * @param wing - */ - protected void makeOverhangBB(ComponentTFTowerWing wing) { - this.boundingBox = new StructureBoundingBox(wing.getBoundingBox().minX - 1, wing.getBoundingBox().maxY, wing.getBoundingBox().minZ - 1, wing.getBoundingBox().maxX + 1, wing.getBoundingBox().maxY + this.height - 1, wing.getBoundingBox().maxZ + 1); - } - - - - - @Override - public boolean addComponentParts(World world, Random random,StructureBoundingBox structureboundingbox) { - return false; - } - - /** - * Does this roof intersect anything except the parent tower? - */ - public boolean fits(ComponentTFTowerWing parent, List list, Random rand) { - return StructureComponent.findIntersecting(list, this.boundingBox) == parent; - } - -} diff --git a/src/main/java/twilightforest/structures/lichtower/ComponentTFTowerRoofAttachedSlab.java b/src/main/java/twilightforest/structures/lichtower/ComponentTFTowerRoofAttachedSlab.java deleted file mode 100644 index f0cc8879e5..0000000000 --- a/src/main/java/twilightforest/structures/lichtower/ComponentTFTowerRoofAttachedSlab.java +++ /dev/null @@ -1,28 +0,0 @@ -package twilightforest.structures.lichtower; - -import java.util.Random; - -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; - - -public class ComponentTFTowerRoofAttachedSlab extends ComponentTFTowerRoofSlab { - - public ComponentTFTowerRoofAttachedSlab() { - super(); - // TODO Auto-generated constructor stub - } - - public ComponentTFTowerRoofAttachedSlab(int i, ComponentTFTowerWing wing) { - super(i, wing); - } - - /** - * Makes a flat, pyramid-shaped roof that is connected to the parent tower - */ - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - int slabMeta = 2; - return makeConnectedCap(world, slabMeta, sbb); - } -} diff --git a/src/main/java/twilightforest/structures/lichtower/ComponentTFTowerRoofFence.java b/src/main/java/twilightforest/structures/lichtower/ComponentTFTowerRoofFence.java deleted file mode 100644 index 0800098c4c..0000000000 --- a/src/main/java/twilightforest/structures/lichtower/ComponentTFTowerRoofFence.java +++ /dev/null @@ -1,46 +0,0 @@ -package twilightforest.structures.lichtower; - -import java.util.Random; - -import net.minecraft.init.Blocks; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; - - -public class ComponentTFTowerRoofFence extends ComponentTFTowerRoof { - - public ComponentTFTowerRoofFence() { - super(); - // TODO Auto-generated constructor stub - } - - public ComponentTFTowerRoofFence(int i, ComponentTFTowerWing wing) { - super(i, wing); - - // same alignment - this.setCoordBaseMode(wing.getCoordBaseMode()); - // same size - this.size = wing.size; // assuming only square towers and roofs right now. - this.height = 0; - - // just hang out at the very top of the tower - makeCapBB(wing); - } - - /** - * A fence around the roof! - */ - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - int y = height + 1; - for (int x = 0; x <= size - 1; x++) { - for (int z = 0; z <= size - 1; z++) { - if (x == 0 || x == size - 1 || z == 0 || z == size - 1) { - placeBlockAtCurrentPosition(world, Blocks.fence, 0, x, y, z, sbb); - } - } - } - return true; - } - -} diff --git a/src/main/java/twilightforest/structures/lichtower/ComponentTFTowerRoofGableForwards.java b/src/main/java/twilightforest/structures/lichtower/ComponentTFTowerRoofGableForwards.java deleted file mode 100644 index 5b30c7cf08..0000000000 --- a/src/main/java/twilightforest/structures/lichtower/ComponentTFTowerRoofGableForwards.java +++ /dev/null @@ -1,88 +0,0 @@ -package twilightforest.structures.lichtower; - -import java.util.Random; - -import net.minecraft.init.Blocks; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; - - -public class ComponentTFTowerRoofGableForwards extends ComponentTFTowerRoof { - - public ComponentTFTowerRoofGableForwards() { - super(); - // TODO Auto-generated constructor stub - } - - public ComponentTFTowerRoofGableForwards(int i, ComponentTFTowerWing wing) { - super(i, wing); - - // same facing - this.setCoordBaseMode(wing.getCoordBaseMode()); - - this.size = wing.size + 2; // assuming only square towers and roofs right now. - this.height = size; - - // just hang out at the very top of the tower - this.makeAttachedOverhangBB(wing); - - } - - /** - * Makes a pointy roof out of stuff - */ - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - int slabMeta = 2; - int slopeChange = slopeChangeForSize(size); - for (int y = 0; y <= height; y++) { - int min, max; - if (y < slopeChange) { - min = y; - max = size - y - 1; - } - else { - min = (y + slopeChange) / 2; - max = size - ((y + slopeChange) / 2) - 1; - } - for (int x = 0; x <= size - 2; x++) { - for (int z = min; z <= max; z++) { - if (z == min || z == max) { - placeBlockAtCurrentPosition(world, Blocks.planks, slabMeta, x, y, z, sbb); - } - else if (x < size - 2) { - placeBlockAtCurrentPosition(world, Blocks.planks, slabMeta, x, y, z, sbb); - } - } - } - } - - // put on the little figurehead-like "cap" - - // where is even the top of our roof? - int top = (size + 1) - slopeChange; - int zMid = size / 2; - - placeBlockAtCurrentPosition(world, Blocks.wooden_slab, slabMeta | 0xA, size - 1, top - 1, zMid, sbb); - placeBlockAtCurrentPosition(world, Blocks.wooden_slab, slabMeta, 0, top, zMid, sbb); - placeBlockAtCurrentPosition(world, Blocks.wooden_slab, slabMeta, size - 3, top, zMid, sbb); - placeBlockAtCurrentPosition(world, Blocks.planks, slabMeta, size - 2, top, zMid, sbb); - placeBlockAtCurrentPosition(world, Blocks.planks, slabMeta, size - 1, top, zMid, sbb); - placeBlockAtCurrentPosition(world, Blocks.planks, slabMeta, size - 1, top + 1, zMid, sbb); - - return true; - } - - - public int slopeChangeForSize(int pSize) { - if (size > 10) { - return 3; - } - else if (size > 6) { - return 2; - } - else { - return 1; - } - } -} diff --git a/src/main/java/twilightforest/structures/lichtower/ComponentTFTowerRoofPointy.java b/src/main/java/twilightforest/structures/lichtower/ComponentTFTowerRoofPointy.java deleted file mode 100644 index 1748ffd249..0000000000 --- a/src/main/java/twilightforest/structures/lichtower/ComponentTFTowerRoofPointy.java +++ /dev/null @@ -1,79 +0,0 @@ -package twilightforest.structures.lichtower; - -import java.util.Random; - -import net.minecraft.init.Blocks; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; - - -public class ComponentTFTowerRoofPointy extends ComponentTFTowerRoof { - - public ComponentTFTowerRoofPointy() { - super(); - // TODO Auto-generated constructor stub - } - - public ComponentTFTowerRoofPointy(int i, ComponentTFTowerWing wing) { - super(i, wing); - - // same facing, but it doesn't matter - this.setCoordBaseMode(wing.getCoordBaseMode()); - - this.size = wing.size; // assuming only square towers and roofs right now. - this.height = size; - - // just hang out at the very top of the tower - makeCapBB(wing); - - } - - /** - * Makes a pointy roof out of stuff - */ - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - int slabMeta = 2; - - for (int y = 0; y <= height; y++) { - int min, mid, max; - int slopeChange = slopeChangeForSize(size); - if (y < slopeChange) { - min = y; - max = size - y - 1; - } - else { - min = (y + slopeChange) / 2; - max = size - ((y + slopeChange) / 2) - 1; - } - mid = min + ((max - min) / 2); - for (int x = min; x <= max; x++) { - for (int z = min; z <= max; z++) { - placeBlockAtCurrentPosition(world, Blocks.planks, slabMeta, x, y, z, sbb); - // some of these are unnecessary and will just be overwritten by a normal block, but whatevs. - if ((x == min && (z == min || z == max)) || (x == max && (z == min || z == max))) { - placeBlockAtCurrentPosition(world, Blocks.wooden_slab, slabMeta, x, y + 1, z, sbb); - } - // mid blocks - if (((((x == min || x == max) && z == mid) && x % 2 == 0) || (((z == min || z == max) && x == mid) && z % 2 == 0)) && mid != min + 1) { - placeBlockAtCurrentPosition(world, Blocks.wooden_slab, slabMeta, x, y + 1, z, sbb); - } - } - } - } - return true; - } - - - public int slopeChangeForSize(int pSize) { - if (size > 10) { - return 3; - } - else if (size > 6) { - return 2; - } - else { - return 1; - } - } -} diff --git a/src/main/java/twilightforest/structures/lichtower/ComponentTFTowerRoofPointyOverhang.java b/src/main/java/twilightforest/structures/lichtower/ComponentTFTowerRoofPointyOverhang.java deleted file mode 100644 index edb057d473..0000000000 --- a/src/main/java/twilightforest/structures/lichtower/ComponentTFTowerRoofPointyOverhang.java +++ /dev/null @@ -1,24 +0,0 @@ -package twilightforest.structures.lichtower; - - -public class ComponentTFTowerRoofPointyOverhang extends ComponentTFTowerRoofPointy { - - public ComponentTFTowerRoofPointyOverhang() { - super(); - // TODO Auto-generated constructor stub - } - - public ComponentTFTowerRoofPointyOverhang(int i, ComponentTFTowerWing wing) { - super(i, wing); - - // same facing, but it doesn't matter - this.setCoordBaseMode(wing.getCoordBaseMode()); - - this.size = wing.size + 2; // assuming only square towers and roofs right now. - this.height = size; - - // just hang out at the very top of the tower - makeOverhangBB(wing); - - } -} diff --git a/src/main/java/twilightforest/structures/lichtower/ComponentTFTowerRoofSlab.java b/src/main/java/twilightforest/structures/lichtower/ComponentTFTowerRoofSlab.java deleted file mode 100644 index 3d164bf16e..0000000000 --- a/src/main/java/twilightforest/structures/lichtower/ComponentTFTowerRoofSlab.java +++ /dev/null @@ -1,78 +0,0 @@ -package twilightforest.structures.lichtower; - -import java.util.Random; - -import net.minecraft.init.Blocks; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; - - -public class ComponentTFTowerRoofSlab extends ComponentTFTowerRoof { - - public ComponentTFTowerRoofSlab() { - super(); - // TODO Auto-generated constructor stub - } - - public ComponentTFTowerRoofSlab(int i, ComponentTFTowerWing wing) { - super(i, wing); - - // same alignment - this.setCoordBaseMode(wing.getCoordBaseMode()); - // same size - this.size = wing.size; // assuming only square towers and roofs right now. - this.height = size / 2; - - // just hang out at the very top of the tower - makeCapBB(wing); - - } - - /** - * Makes a flat, pyramid-shaped roof - */ - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - int slabMeta = 2; - return makePyramidCap(world, slabMeta, sbb); - } - - protected boolean makePyramidCap(World world, int slabMeta, StructureBoundingBox sbb) { - for (int y = 0; y <= height; y++) { - int min = 2 * y; - int max = size - (2 * y) - 1; - for (int x = min; x <= max; x++) { - for (int z = min; z <= max; z++) { - if (x == min || x == max || z == min || z == max) { - placeBlockAtCurrentPosition(world, Blocks.wooden_slab, slabMeta, x, y, z, sbb); - } - else - { - placeBlockAtCurrentPosition(world, Blocks.planks, slabMeta, x, y, z, sbb); - } - } - } - } - return true; - } - - protected boolean makeConnectedCap(World world, int slabMeta, StructureBoundingBox sbb) { - for (int y = 0; y < height; y++) { - int min = 2 * y; - int max = size - (2 * y) - 1; - for (int x = 0; x <= max; x++) { - for (int z = min; z <= max; z++) { - if (x == max || z == min || z == max) { - placeBlockAtCurrentPosition(world, Blocks.wooden_slab, slabMeta, x, y, z, sbb); - } - else - { - placeBlockAtCurrentPosition(world, Blocks.planks, slabMeta, x, y, z, sbb); - } - } - } - } - return true; - } - -} diff --git a/src/main/java/twilightforest/structures/lichtower/ComponentTFTowerRoofSlabForwards.java b/src/main/java/twilightforest/structures/lichtower/ComponentTFTowerRoofSlabForwards.java deleted file mode 100644 index 4d5fa47adb..0000000000 --- a/src/main/java/twilightforest/structures/lichtower/ComponentTFTowerRoofSlabForwards.java +++ /dev/null @@ -1,59 +0,0 @@ -package twilightforest.structures.lichtower; - -import java.util.Random; - -import net.minecraft.init.Blocks; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; - - -/** - * A flat tower roof using slabs that is larger than the tower under it. - * - * @author Ben - * - */ -public class ComponentTFTowerRoofSlabForwards extends ComponentTFTowerRoofSlab { - - public ComponentTFTowerRoofSlabForwards() { - super(); - // TODO Auto-generated constructor stub - } - - public ComponentTFTowerRoofSlabForwards(int i, ComponentTFTowerWing wing) { - super(i, wing); - - // same alignment - this.setCoordBaseMode(wing.getCoordBaseMode()); - // the overhang roof is like a cap roof that's 2 sizes bigger - this.size = wing.size + 2; // assuming only square towers and roofs right now. - this.height = size / 2; - - // bounding box - makeAttachedOverhangBB(wing); - - } - - /** - * Makes flat hip roof - */ - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - for (int y = 0; y <= height; y++) { - int min = 2 * y; - int max = size - (2 * y) - 1; - for (int x = 0; x <= max - 1; x++) { - for (int z = min; z <= max; z++) { - if (x == max - 1 || z == min || z == max) { - placeBlockAtCurrentPosition(world, Blocks.wooden_slab, 2, x, y, z, sbb); - } - else - { - placeBlockAtCurrentPosition(world, Blocks.double_wooden_slab, 2, x, y, z, sbb); - } - } - } - } - return true; - } -} diff --git a/src/main/java/twilightforest/structures/lichtower/ComponentTFTowerRoofStairs.java b/src/main/java/twilightforest/structures/lichtower/ComponentTFTowerRoofStairs.java deleted file mode 100644 index b75690a018..0000000000 --- a/src/main/java/twilightforest/structures/lichtower/ComponentTFTowerRoofStairs.java +++ /dev/null @@ -1,74 +0,0 @@ -package twilightforest.structures.lichtower; - -import java.util.Random; - -import net.minecraft.init.Blocks; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; - - -public class ComponentTFTowerRoofStairs extends ComponentTFTowerRoof { - - public ComponentTFTowerRoofStairs() { - super(); - // TODO Auto-generated constructor stub - } - - public ComponentTFTowerRoofStairs(int i, ComponentTFTowerWing wing) { - super(i, wing); - - // always facing = 0. This roof cannot rotate, due to stair facing issues. - this.setCoordBaseMode(0); - - this.size = wing.size; // assuming only square towers and roofs right now. - this.height = size / 2; - - // just hang out at the very top of the tower - makeCapBB(wing); - - } - - /** - * Makes a pyramid-shaped roof out of stairs - */ - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - for (int y = 0; y <= height; y++) { - int min = y; - int max = size - y - 1; - for (int x = min; x <= max; x++) { - for (int z = min; z <= max; z++) { - if (x == min) { - if (z == min || z == max) { - placeBlockAtCurrentPosition(world, Blocks.wooden_slab, 2, x, y, z, sbb); - } - else - { - placeBlockAtCurrentPosition(world, Blocks.birch_stairs, 0, x, y, z, sbb); - } - } - else if (x == max) { - if (z == min || z == max) { - placeBlockAtCurrentPosition(world, Blocks.wooden_slab, 2, x, y, z, sbb); - } - else - { - placeBlockAtCurrentPosition(world, Blocks.birch_stairs, 1, x, y, z, sbb); - } - } - else if (z == max) { - placeBlockAtCurrentPosition(world, Blocks.birch_stairs, 3, x, y, z, sbb); - } - else if (z == min) { - placeBlockAtCurrentPosition(world, Blocks.birch_stairs, 2, x, y, z, sbb); - } - else { - placeBlockAtCurrentPosition(world, Blocks.planks, 2, x, y, z, sbb); - } - } - } - } - return true; - } - -} diff --git a/src/main/java/twilightforest/structures/lichtower/ComponentTFTowerRoofStairsOverhang.java b/src/main/java/twilightforest/structures/lichtower/ComponentTFTowerRoofStairsOverhang.java deleted file mode 100644 index fc01da3313..0000000000 --- a/src/main/java/twilightforest/structures/lichtower/ComponentTFTowerRoofStairsOverhang.java +++ /dev/null @@ -1,74 +0,0 @@ -package twilightforest.structures.lichtower; - -import java.util.Random; - -import net.minecraft.init.Blocks; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; - - -public class ComponentTFTowerRoofStairsOverhang extends ComponentTFTowerRoof { - - public ComponentTFTowerRoofStairsOverhang() { - super(); - // TODO Auto-generated constructor stub - } - - public ComponentTFTowerRoofStairsOverhang(int i, ComponentTFTowerWing wing) { - super(i, wing); - - // always facing = 0. This roof cannot rotate, due to stair facing issues. - this.setCoordBaseMode(0); - - this.size = wing.size + 2; // assuming only square towers and roofs right now. - this.height = size / 2; - - // just hang out at the very top of the tower - this.boundingBox = new StructureBoundingBox(wing.getBoundingBox().minX - 1, wing.getBoundingBox().maxY, wing.getBoundingBox().minZ - 1, wing.getBoundingBox().maxX + 1, wing.getBoundingBox().maxY + this.height - 1, wing.getBoundingBox().maxZ + 1); - - } - - /** - * Makes a pyramid-shaped roof out of stairs - */ - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - for (int y = 0; y <= height; y++) { - int min = y; - int max = size - y - 1; - for (int x = min; x <= max; x++) { - for (int z = min; z <= max; z++) { - if (x == min) { - if (z == min || z == max) { - placeBlockAtCurrentPosition(world, Blocks.wooden_slab, 2, x, y, z, sbb); - } - else - { - placeBlockAtCurrentPosition(world, Blocks.birch_stairs, 0, x, y, z, sbb); - } - } - else if (x == max) { - if (z == min || z == max) { - placeBlockAtCurrentPosition(world, Blocks.wooden_slab, 2, x, y, z, sbb); - } - else - { - placeBlockAtCurrentPosition(world, Blocks.birch_stairs, 1, x, y, z, sbb); - } - } - else if (z == max) { - placeBlockAtCurrentPosition(world, Blocks.birch_stairs, 3, x, y, z, sbb); - } - else if (z == min) { - placeBlockAtCurrentPosition(world, Blocks.birch_stairs, 2, x, y, z, sbb); - } - else { - placeBlockAtCurrentPosition(world, Blocks.planks, 2, x, y, z, sbb); - } - } - } - } - return true; - } - -} diff --git a/src/main/java/twilightforest/structures/lichtower/ComponentTFTowerWing.java b/src/main/java/twilightforest/structures/lichtower/ComponentTFTowerWing.java deleted file mode 100644 index a8ab89190f..0000000000 --- a/src/main/java/twilightforest/structures/lichtower/ComponentTFTowerWing.java +++ /dev/null @@ -1,2337 +0,0 @@ -package twilightforest.structures.lichtower; - -import java.nio.IntBuffer; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockMushroom; -import net.minecraft.block.BlockSapling; -import net.minecraft.block.BlockSlab; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityHanging; -import net.minecraft.entity.item.EntityPainting; -import net.minecraft.entity.item.EntityPainting.EnumArt; -import net.minecraft.init.Blocks; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.ChunkCoordinates; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import net.minecraft.world.gen.structure.StructureComponent; -import twilightforest.TFTreasure; -import twilightforest.block.TFBlocks; -import twilightforest.entity.TFCreatures; -import twilightforest.structures.StructureTFComponent; - - - -public class ComponentTFTowerWing extends StructureTFComponent { - - public ComponentTFTowerWing() { - super(); - // TODO Auto-generated constructor stub - } - - public int size; - protected int height; - protected Class roofType; - - protected ArrayList openings = new ArrayList(); - protected int highestOpening; - protected boolean [] openingTowards = new boolean[] {false, false, true, false}; - - protected ComponentTFTowerWing(int i) { - super(i); - this.highestOpening = 0; - } - - protected ComponentTFTowerWing(int i, int x, int y, int z, int pSize, int pHeight, int direction) { - super(i); - - this.size = pSize; - this.height = pHeight; - this.setCoordBaseMode(direction); - - this.highestOpening = 0; - - this.boundingBox = StructureTFComponent.getComponentToAddBoundingBox(x, y, z, 0, 0, 0, size - 1, height - 1, size - 1, direction); - } - - /** - * Save to NBT - */ - @Override - protected void func_143012_a(NBTTagCompound par1NBTTagCompound) { - super.func_143012_a(par1NBTTagCompound); - - par1NBTTagCompound.setInteger("towerSize", this.size); - par1NBTTagCompound.setInteger("towerHeight", this.height); - - par1NBTTagCompound.setIntArray("doorInts", this.getDoorsAsIntArray()); - - par1NBTTagCompound.setInteger("highestOpening", this.highestOpening); - par1NBTTagCompound.setBoolean("openingTowards0", this.openingTowards[0]); - par1NBTTagCompound.setBoolean("openingTowards1", this.openingTowards[1]); - par1NBTTagCompound.setBoolean("openingTowards2", this.openingTowards[2]); - par1NBTTagCompound.setBoolean("openingTowards3", this.openingTowards[3]); - - } - - /** - * Turn the openings array into an array of ints. - */ - private int[] getDoorsAsIntArray() { - IntBuffer ibuffer = IntBuffer.allocate(this.openings.size() * 3); - - for (ChunkCoordinates door : openings) - { - ibuffer.put(door.posX); - ibuffer.put(door.posY); - ibuffer.put(door.posZ); - } - - return ibuffer.array(); - } - - /** - * Load from NBT - */ - @Override - protected void func_143011_b(NBTTagCompound par1NBTTagCompound) { - super.func_143011_b(par1NBTTagCompound); - this.size = par1NBTTagCompound.getInteger("towerSize"); - this.height = par1NBTTagCompound.getInteger("towerHeight"); - - this.readOpeningsFromArray(par1NBTTagCompound.getIntArray("doorInts")); - - this.highestOpening = par1NBTTagCompound.getInteger("highestOpening"); - // too lazy to do this as a loop - this.openingTowards[0] = par1NBTTagCompound.getBoolean("openingTowards0"); - this.openingTowards[1] = par1NBTTagCompound.getBoolean("openingTowards1"); - this.openingTowards[2] = par1NBTTagCompound.getBoolean("openingTowards2"); - this.openingTowards[3] = par1NBTTagCompound.getBoolean("openingTowards3"); - } - - /** - * Read in openings from int array - */ - private void readOpeningsFromArray(int[] intArray) { - for (int i = 0; i < intArray.length; i += 3) - { - ChunkCoordinates door = new ChunkCoordinates(intArray[i], intArray[i + 1], intArray[i + 2]); - - this.openings.add(door); - } - } - - @SuppressWarnings({ "rawtypes", "unchecked" }) - @Override - public void buildComponent(StructureComponent parent, List list, Random rand) { - // we should have a door where we started - addOpening(0, 1, size / 2, 2); - - // add a roof? - makeARoof(parent, list, rand); - - // add a beard - makeABeard(parent, list, rand); - - - if (size > 4) { - // sub towers - for (int i = 0; i < 4; i++) { - if (i == 2) { - // no towers behind us - continue; - } - int[] dest = getValidOpening(rand, i); - if (!makeTowerWing(list, rand, 1, dest[0], dest[1], dest[2], size - 2, height - 4, i) && this.size > 8) { - if (!makeTowerWing(list, rand, 1, dest[0], dest[1], dest[2], size - 4, height - 6, i)) { - makeTowerWing(list, rand, 1, dest[0], dest[1], dest[2], size - 6, height - 12, i); - } - } - } - } - - - } - - public boolean makeTowerWing(List list, Random rand, int index, int x, int y, int z, int wingSize, int wingHeight, int rotation) { - // kill too-small towers - if (wingHeight < 6) { - return false; - } - - int direction = (getCoordBaseMode() + rotation) % 4; - int[] dx = offsetTowerCoords(x, y, z, wingSize, direction); - - if (rand.nextInt(6) == 0) { - return makeBridge(list, rand, index, x, y, z, wingSize, wingHeight, rotation); - // or I don't know if we just want to continue instead if the bridge fails. - // I think there are very few circumstances where we can make a wing and not a bridge - } - - ComponentTFTowerWing wing = new ComponentTFTowerWing(index, dx[0], dx[1], dx[2], wingSize, wingHeight, direction); - // check to see if it intersects something already there - StructureComponent intersect = StructureComponent.findIntersecting(list, wing.boundingBox); - if (intersect == null || intersect == this) { - list.add(wing); - wing.buildComponent(this, list, rand); - addOpening(x, y, z, rotation); - return true; - } else { -// System.out.println("Planned wing intersects with " + intersect); - if (rand.nextInt(3) > 0) { - return makeBridge(list, rand, index, x, y, z, wingSize, wingHeight, rotation); - } - else { - // I guess we're done for this branch - return false; - } - } - } - - - - protected boolean makeBridge(List list, Random rand, int index, int x, int y, int z, int wingSize, int wingHeight, int rotation) { - // bridges are size 3 always - int direction = (getCoordBaseMode() + rotation) % 4; - int[] dx = offsetTowerCoords(x, y, z, 3, direction); - // adjust height for those stupid little things - if (wingSize == 3 && wingHeight > 10) { - wingHeight = 6 + rand.nextInt(5); - } - ComponentTFTowerBridge bridge = new ComponentTFTowerBridge(index, dx[0], dx[1], dx[2], wingSize, wingHeight, direction); - // check to see if it intersects something already there - StructureComponent intersect = StructureComponent.findIntersecting(list, bridge.boundingBox); - if (intersect == null || intersect == this) { - intersect = StructureComponent.findIntersecting(list, bridge.getWingBB()); - } - else { - return false; - } - // okay, I think we can actually make one, as long as we're not still intersecting something. - if (intersect == null || intersect == this) { - list.add(bridge); - bridge.buildComponent(this, list, rand); - addOpening(x, y, z, rotation); - return true; - } - else { - return false; - } - } - - /** - * Add an opening to the outside (or another tower) in the specified direction. - */ - public void addOpening(int dx, int dy, int dz, int direction) { - openingTowards[direction] = true; - if (dy > highestOpening) { - highestOpening = dy; - } - openings.add(new ChunkCoordinates(dx, dy, dz)); - } - - /** - * Add a beard to this structure. There is only one type of beard. - */ - public void makeABeard(StructureComponent parent, List list, Random rand) { - - boolean attached = parent.getBoundingBox().minY < this.boundingBox.minY; - - int index = this.getComponentType(); - ComponentTFTowerBeard beard; - if (attached) { - beard = new ComponentTFTowerBeardAttached(index + 1, this); - } - else { - beard = new ComponentTFTowerBeard(index + 1, this); - } - list.add(beard); - beard.buildComponent(this, list, rand); - } - - - - /** - * Attach a roof to this tower. - * - * This function keeps trying roofs starting with the largest and fanciest, and then keeps trying smaller and plainer ones - */ - public void makeARoof(StructureComponent parent, List list, Random rand) { - - // we are attached if our parent is taller than we are - boolean attached = parent.getBoundingBox().maxY > this.boundingBox.maxY; - - if (attached) { - makeAttachedRoof(list, rand); - } - else { - makeFreestandingRoof(list, rand); - } - - } - - - - protected void makeAttachedRoof(List list, Random rand) { - int index = this.getComponentType(); - ComponentTFTowerRoof roof; - - // this is our preferred roof type: - if (roofType == null && rand.nextInt(32) != 0) { - tryToFitRoof(list, rand, new ComponentTFTowerRoofGableForwards(index + 1, this)); - } - - // this is for roofs that don't fit. - if (roofType == null && rand.nextInt(8) != 0) { - tryToFitRoof(list, rand, new ComponentTFTowerRoofSlabForwards(index + 1, this)); - } - - // finally, if we're cramped for space, try this - if (roofType == null && rand.nextInt(32) != 0) { - // fall through to this next roof - roof = new ComponentTFTowerRoofAttachedSlab(index + 1, this); - tryToFitRoof(list, rand, roof); - } - - // last resort - if (roofType == null) { - // fall through to this next roof - roof = new ComponentTFTowerRoofFence(index + 1, this); - tryToFitRoof(list, rand, roof); - } - } - - - - /** - * Check to see if this roof fits. If it does: - * Add the specified roof to this tower and set the roofType variable. - * - * @param list - * @param rand - * @param roof - */ - protected void tryToFitRoof(List list, Random rand, ComponentTFTowerRoof roof) { - if (roof.fits(this, list, rand)) { - list.add(roof); - roof.buildComponent(this, list, rand); - roofType = roof.getClass(); - } - } - - protected void makeFreestandingRoof(List list, Random rand) { - int index = this.getComponentType(); - ComponentTFTowerRoof roof; - - // most roofs that fit fancy roofs will be this - if (roofType == null && rand.nextInt(8) != 0) { - roof = new ComponentTFTowerRoofPointyOverhang(index + 1, this); - tryToFitRoof(list, rand, roof); - } - - // don't pass by this one if it fits - if (roofType == null) { - roof = new ComponentTFTowerRoofStairsOverhang(index + 1, this); - tryToFitRoof(list, rand, roof); - } - - // don't pass by this one if it fits - if (roofType == null) { - roof = new ComponentTFTowerRoofStairs(index + 1, this); - tryToFitRoof(list, rand, roof); - } - - if (roofType == null && rand.nextInt(53) != 0) { - // fall through to this next roof - roof = new ComponentTFTowerRoofSlab(index + 1, this); - tryToFitRoof(list, rand, roof); - } - - if (roofType == null) { - // fall through to this next roof - roof = new ComponentTFTowerRoofFence(index + 1, this); - tryToFitRoof(list, rand, roof); - } - } - - - - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - - // make walls - fillWithRandomizedBlocks(world, sbb, 0, 0, 0, size - 1, height - 1, size - 1, false, rand, StructureTFComponent.getStrongholdStones()); - - // clear inside - fillWithAir(world, sbb, 1, 1, 1, size - 2, height - 2, size - 2); - - // sky light - nullifySkyLightForBoundingBox(world); - - // marker blocks -// placeBlockAtCurrentPosition(world, Blocks.wool, this.coordBaseMode, size / 2, 2, size / 2, sbb); -// placeBlockAtCurrentPosition(world, Blocks.gold_block, 0, 0, 0, 0, sbb); - - // stairs! - if (highestOpening > 1) { - makeStairs(world, rand, sbb); - } - - // decorate? - decorateThisTower(world, rand, sbb); - - - // windows - makeWindows(world, rand, sbb, size < 4); - - // throw a bunch of opening markers in there -// makeOpeningMarkers(world, rand, 100, sbb); - - // openings - makeOpenings(world, sbb); - -// // relight -// for (int lx = -1; lx < 3; lx++) { -// for (int lz = -1; lz < 3; lz++) { -// world.updateLightByType(EnumSkyBlock.Sky, sbb.minX + (lx * 16), sbb.maxY, sbb.minZ + (lx * 16)); -// } -// } - - - return true; - } - - - /** - * Puts some colorful markers by possible openings in this tower. Debug only. - * - * @param numMarkers How many markers to make - */ - protected void makeOpeningMarkers(World world, Random rand, int numMarkers, StructureBoundingBox sbb) { - if (size > 4) { - for (int i = 0; i < numMarkers; i++) { - int[] spot = getValidOpening(rand, 0); - placeBlockAtCurrentPosition(world, Blocks.wool, 0, spot[0], spot[1], spot[2], sbb); - } - for (int i = 0; i < numMarkers; i++) { - int[] spot = getValidOpening(rand, 1); - placeBlockAtCurrentPosition(world, Blocks.wool, 1, spot[0], spot[1], spot[2], sbb); - } - for (int i = 0; i < numMarkers; i++) { - int[] spot = getValidOpening(rand, 2); - placeBlockAtCurrentPosition(world, Blocks.wool, 2, spot[0], spot[1], spot[2], sbb); - } - for (int i = 0; i < numMarkers; i++) { - int[] spot = getValidOpening(rand, 3); - placeBlockAtCurrentPosition(world, Blocks.wool, 3, spot[0], spot[1], spot[2], sbb); - } - } - } - - - - /** - * Add some appropriate decorations to this tower - * - * @param world - * @param rand - * @param sbb - */ - protected void decorateThisTower(World world, Random rand, StructureBoundingBox sbb) { - Random decoRNG = new Random(world.getSeed() + (this.boundingBox.minX * 321534781) * (this.boundingBox.minZ * 756839)); - - if (size > 3) { - // only decorate towers with more than one available square inside. - if (isDeadEnd()) { - decorateDeadEnd(world, decoRNG, sbb); - } - else { - // for now we'll just assume that any tower with more than one exit is a stair tower - decorateStairTower(world, decoRNG, sbb); - } - } - } - - - /** - * Decorates a dead end tower. These towers have no stairs, and will be the focus of our interior design. - */ - protected void decorateDeadEnd(World world, Random rand, StructureBoundingBox sbb) { - int floors = (this.height - 1) / 5; - - // divide the tower into floors - int floorHeight = this.height / floors; - for (int i = 1; i < floors; i++) { - // put down a floor - for (int x = 1; x < size - 1; x++) { - for (int z = 1; z < size - 1; z++) { - placeBlockAtCurrentPosition(world, Blocks.planks, 2, x, (i * floorHeight), z, sbb); - } - } - } - - - if (floors > 1) { - int ladderDir = 3; - int downLadderDir = -1; - - // decorate bottom floor - decorateFloor(world, rand, 0, 1, floorHeight, ladderDir, -1, sbb); - - // decorate middle floors - for (int i = 1; i < floors - 1; i++) { - int bottom = 1 + floorHeight * i; - int top = floorHeight * (i + 1); - - downLadderDir = ladderDir; - ladderDir++; - ladderDir %= 4; - - decorateFloor(world, rand, i, bottom, top, ladderDir, downLadderDir, sbb); - } - - // decorate top floor - decorateFloor(world, rand, floors, 1 + floorHeight * (floors - 1), height - 1, -1, ladderDir, sbb); - } - else { - // just one floor, decorate that, no ladders - decorateFloor(world, rand, 0, 1, height - 1, -1, -1, sbb); - } - } - - /** - * Called to decorate each floor. This is responsible for adding a ladder up, the stub of the ladder going down, then picking a theme for each floor and executing it. - * - * @param floor - * @param bottom - * @param top - * @param ladderUpDir - * @param laddderDownDir - */ - protected void decorateFloor(World world, Random rand, int floor, int bottom, int top, int ladderUpDir, int ladderDownDir, StructureBoundingBox sbb) { - - if (ladderUpDir > -1) { - // add ladder going up - int meta = getLadderMeta(ladderUpDir); - int dx = getLadderX(ladderUpDir); - int dz = getLadderZ(ladderUpDir); - for (int dy = bottom; dy < top; dy++) { - placeBlockAtCurrentPosition(world, Blocks.ladder, meta, dx, dy, dz, sbb); - } - } - - if (ladderDownDir > -1) { - // add ladder going down - int meta = getLadderMeta(ladderDownDir); - int dx = getLadderX(ladderDownDir); - int dz = getLadderZ(ladderDownDir); - for (int dy = bottom - 1; dy < bottom + 2; dy++) { - placeBlockAtCurrentPosition(world, Blocks.ladder, meta, dx, dy, dz, sbb); - } - } - - // pick a decoration? - if (rand.nextInt(7) == 0 && ladderDownDir == -1) { - decorateWell(world, rand, bottom, top, ladderUpDir, ladderDownDir, sbb); - } - else if (rand.nextInt(7) == 0 && ladderDownDir == -1) { - decorateSkeletonRoom(world, rand, bottom, top, ladderUpDir, ladderDownDir, sbb); - } - else if (rand.nextInt(6) == 0 && ladderDownDir == -1) { - decorateZombieRoom(world, rand, bottom, top, ladderUpDir, ladderDownDir, sbb); - } - else if (rand.nextInt(5) == 0 && ladderDownDir == -1) { - decorateCactusRoom(world, rand, bottom, top, ladderUpDir, ladderDownDir, sbb); - } - else if (rand.nextInt(4) == 0 && ladderDownDir > -1) { - decorateTreasureChest(world, rand, bottom, top, ladderUpDir, ladderDownDir, sbb); - } - else if (rand.nextInt(5) == 0) { - decorateSpiderWebs(world, rand, bottom, top, ladderUpDir, ladderDownDir, sbb); - } - else if (rand.nextInt(12) == 0 && ladderDownDir > -1) { - // these are annoying - decorateSolidRock(world, rand, bottom, top, ladderUpDir, ladderDownDir, sbb); - } - else if (rand.nextInt(3) == 0) { - decorateFullLibrary(world, rand, bottom, top, ladderUpDir, ladderDownDir, sbb); - } - else { - decorateLibrary(world, rand, bottom, top, ladderUpDir, ladderDownDir, sbb); -// if (ladderDownDir == -1) { -// // trap it! -// decorateTrap(world, rand, bottom, top, ladderUpDir, ladderDownDir, sbb); -// } - } - } - - - - - /** - * Decorate this floor with a scenic well. - */ - protected void decorateWell(World world, Random rand, int bottom, int top, int ladderUpDir, int ladderDownDir, StructureBoundingBox sbb) { - int cx = size / 2; - int cz = cx; - int cy = bottom; - - Block waterOrLava = rand.nextInt(4) == 0 ? Blocks.lava : Blocks.water; - - if (size > 5) { - // actual well structure - placeBlockAtCurrentPosition(world, Blocks.stonebrick, 0, cx - 1, cy + 0, cz - 1, sbb); - placeBlockAtCurrentPosition(world, Blocks.stone_slab, 5, cx - 1, cy + 1, cz - 1, sbb); - placeBlockAtCurrentPosition(world, Blocks.stonebrick, 0, cx + 0, cy + 0, cz - 1, sbb); - placeBlockAtCurrentPosition(world, Blocks.stonebrick, 0, cx + 1, cy + 0, cz - 1, sbb); - placeBlockAtCurrentPosition(world, Blocks.stone_slab, 5, cx + 1, cy + 1, cz - 1, sbb); - placeBlockAtCurrentPosition(world, Blocks.stonebrick, 0, cx - 1, cy + 0, cz + 0, sbb); - placeBlockAtCurrentPosition(world, waterOrLava, 0, cx + 0, cy + 0, cz + 0, sbb); - placeBlockAtCurrentPosition(world, Blocks.stonebrick, 0, cx + 1, cy + 0, cz + 0, sbb); - placeBlockAtCurrentPosition(world, Blocks.stonebrick, 0, cx - 1, cy + 0, cz + 1, sbb); - placeBlockAtCurrentPosition(world, Blocks.stone_slab, 5, cx - 1, cy + 1, cz + 1, sbb); - placeBlockAtCurrentPosition(world, Blocks.stonebrick, 0, cx + 0, cy + 0, cz + 1, sbb); - placeBlockAtCurrentPosition(world, Blocks.stonebrick, 0, cx + 1, cy + 0, cz + 1, sbb); - placeBlockAtCurrentPosition(world, Blocks.stone_slab, 5, cx + 1, cy + 1, cz + 1, sbb); - } - - placeBlockAtCurrentPosition(world, waterOrLava, 0, cx + 0, cy - 1, cz + 0, sbb); - - } - - /** - * Add a skeleton spawner on this floor and decorate it in an appropriately scary manner. - */ - protected void decorateSkeletonRoom(World world, Random rand, int bottom, int top, int ladderUpDir, int ladderDownDir, StructureBoundingBox sbb) { - // skeleton spawner - placeSpawnerAtCurrentPosition(world, rand, size / 2, bottom + 2, size / 2, "Skeleton", sbb); - - // floor-to-ceiling chains - ArrayList chainList = new ArrayList(); - chainList.add(new ChunkCoordinates(size / 2, bottom + 2, size / 2)); // don't block the spawner - for (int i = 0; i < size + 2; i++) { - ChunkCoordinates chain = new ChunkCoordinates(2 + rand.nextInt(size - (4)), height - 2, 2 + rand.nextInt(size - (4))); - if (!chainCollides(chain, chainList)) { - // if it doesn't collide, manufacture it and add it to the list - for (int dy = bottom; dy < top; dy++) { - placeBlockAtCurrentPosition(world, Blocks.iron_bars, 0, chain.posX, dy, chain.posZ, sbb); - } - chainList.add(chain); - } - } - - - // spider webs in the corner - for (int dx = 1; dx <= size - 2; dx++) { - for (int dz = 1; dz <= size - 2; dz++) { - if (dx == 1 || dx == size - 2 || dz == 1 || dz == size -2) { - // side of the room - if (!isWindowPos(dx, dz) && !isLadderPos(dx, dz, ladderUpDir, ladderDownDir)) { - // not an occupied position - placeBlockAtCurrentPosition(world, Blocks.web, 0, dx, top - 1, dz, sbb); - } - } - } - } - - } - - - /** - * Add a zombie spawner on this floor and decorate it in an appropriately scary manner. - */ - protected void decorateZombieRoom(World world, Random rand, int bottom, int top, int ladderUpDir, int ladderDownDir, StructureBoundingBox sbb) { - // zombie spawner - placeSpawnerAtCurrentPosition(world, rand, size / 2, bottom + 2, size / 2, "Zombie", sbb); - - // random brown mushrooms - for (int dx = 1; dx <= size - 2; dx++) { - for (int dz = 1; dz <= size - 2; dz++) { - if (!isWindowPos(dx, dz) && !isLadderPos(dx, dz, ladderUpDir, ladderDownDir)) { - // not an occupied position - if (rand.nextInt(5) == 0) { - placeBlockAtCurrentPosition(world, Blocks.brown_mushroom, 0, dx, bottom, dz, sbb); - } - } - } - } - - // slab tables - ArrayList slabList = new ArrayList(); - slabList.add(new ChunkCoordinates(size / 2, bottom + 2, size / 2)); // don't block the spawner - for (int i = 0; i < size - 1; i++) { - ChunkCoordinates slab = new ChunkCoordinates(2 + rand.nextInt(size - (4)), height - 2, 2 + rand.nextInt(size - (4))); - if (!chainCollides(slab, slabList)) { - // if it doesn't collide, manufacture it and add it to the list - placeBlockAtCurrentPosition(world, Blocks.iron_bars, 0, slab.posX, bottom + 0, slab.posZ, sbb); - placeBlockAtCurrentPosition(world, Blocks.wooden_slab, 2, slab.posX, bottom + 1, slab.posZ, sbb); - placeBlockAtCurrentPosition(world, Blocks.soul_sand, 0, slab.posX, bottom + 2, slab.posZ, sbb); - slabList.add(slab); - } - } - } - - /** - * Fill this room with sand and floor-to-ceiling cacti - */ - protected void decorateCactusRoom(World world, Random rand, int bottom, int top, int ladderUpDir, int ladderDownDir, StructureBoundingBox sbb) { - // sand & random dead bush - for (int dx = 1; dx <= size - 2; dx++) { - for (int dz = 1; dz <= size - 2; dz++) { - // sand - placeBlockAtCurrentPosition(world, Blocks.sand, 0, dx, bottom - 1, dz, sbb); - if (!isWindowPos(dx, dz) && !isLadderPos(dx, dz, ladderUpDir, ladderDownDir)) { - // not an occupied position - if (rand.nextInt(4) == 0) { - placeBlockAtCurrentPosition(world, Blocks.deadbush, 0, dx, bottom, dz, sbb); - } - } - } - } - - // cacti - ArrayList cactusList = new ArrayList(); - cactusList.add(new ChunkCoordinates(size / 2, bottom + 2, size / 2)); // don't block the spawner - for (int i = 0; i < size + 12; i++) { - ChunkCoordinates cactus = new ChunkCoordinates(2 + rand.nextInt(size - (4)), height - 2, 2 + rand.nextInt(size - (4))); - if (!chainCollides(cactus, cactusList)) { - // if it doesn't collide, manufacture it and add it to the list - for (int dy = bottom; dy < top; dy++) { - placeBlockAtCurrentPosition(world, Blocks.cactus, 0, cactus.posX, dy, cactus.posZ, sbb); - } - cactusList.add(cactus); - } - } - } - - - - - /** - * Decorate this floor with an enticing treasure chest. - */ - protected void decorateTreasureChest(World world, Random rand, int bottom, int top, int ladderUpDir, int ladderDownDir, StructureBoundingBox sbb) { - int cx = size / 2; - int cz = cx; - - // bottom decoration - placeBlockAtCurrentPosition(world, Blocks.stone_brick_stairs, getStairMeta(1), cx + 0, bottom, cz - 1, sbb); - placeBlockAtCurrentPosition(world, Blocks.stone_brick_stairs, getStairMeta(0), cx - 1, bottom, cz + 0, sbb); - placeBlockAtCurrentPosition(world, Blocks.stone_brick_stairs, getStairMeta(2), cx + 1, bottom, cz + 0, sbb); - placeBlockAtCurrentPosition(world, Blocks.stone_brick_stairs, getStairMeta(3), cx + 0, bottom, cz + 1, sbb); - placeBlockAtCurrentPosition(world, Blocks.stonebrick, 0, cx + 0, bottom, cz + 0, sbb); - - if (size > 5) - { - placeBlockAtCurrentPosition(world, Blocks.stonebrick, 0, cx - 1, bottom, cz - 1, sbb); - placeBlockAtCurrentPosition(world, Blocks.stonebrick, 0, cx + 1, bottom, cz - 1, sbb); - placeBlockAtCurrentPosition(world, Blocks.stonebrick, 0, cx - 1, bottom, cz + 1, sbb); - placeBlockAtCurrentPosition(world, Blocks.stonebrick, 0, cx + 1, bottom, cz + 1, sbb); - } - - // top decoration - placeBlockAtCurrentPosition(world, Blocks.stone_brick_stairs, getStairMeta(1) + 4, cx + 0, top - 1, cz - 1, sbb); - placeBlockAtCurrentPosition(world, Blocks.stone_brick_stairs, getStairMeta(0) + 4, cx - 1, top - 1, cz + 0, sbb); - placeBlockAtCurrentPosition(world, Blocks.stone_brick_stairs, getStairMeta(2) + 4, cx + 1, top - 1, cz + 0, sbb); - placeBlockAtCurrentPosition(world, Blocks.stone_brick_stairs, getStairMeta(3) + 4, cx + 0, top - 1, cz + 1, sbb); - placeBlockAtCurrentPosition(world, Blocks.stonebrick, 0, cx + 0, top - 1, cz + 0, sbb); - - if (size > 5) - { - placeBlockAtCurrentPosition(world, Blocks.stonebrick, 0, cx - 1, top - 1, cz - 1, sbb); - placeBlockAtCurrentPosition(world, Blocks.stonebrick, 0, cx + 1, top - 1, cz - 1, sbb); - placeBlockAtCurrentPosition(world, Blocks.stonebrick, 0, cx - 1, top - 1, cz + 1, sbb); - placeBlockAtCurrentPosition(world, Blocks.stonebrick, 0, cx + 1, top - 1, cz + 1, sbb); - } - - if (size > 5) - { - // pillars - for (int cy = bottom + 1; cy < top - 1; cy++) { - placeBlockAtCurrentPosition(world, Blocks.stonebrick, 5, cx - 1, cy, cz - 1, sbb); - placeBlockAtCurrentPosition(world, Blocks.stonebrick, 5, cx + 1, cy, cz - 1, sbb); - placeBlockAtCurrentPosition(world, Blocks.stonebrick, 5, cx - 1, cy, cz + 1, sbb); - placeBlockAtCurrentPosition(world, Blocks.stonebrick, 5, cx + 1, cy, cz + 1, sbb); - } - } - - placeTreasureAtCurrentPosition(world, rand, cx + 0, bottom + 1, cz + 0, TFTreasure.tower_room, sbb); - - for (int i = 0; i < 4; i++) { - //TODO if there is no ladder or window in the specified direction, put a painting - - // surrounded by torches - - } - - } - - - /** - * Decorate this floor with a mass of messy spider webs. - */ - protected void decorateSpiderWebs(World world, Random rand, int bottom, int top, int ladderUpDir, int ladderDownDir, StructureBoundingBox sbb) { - for (int dy = bottom; dy < top; dy++) { - int chance = (top - dy + 2); - for (int dx = 1; dx <= size - 2; dx++) { - for (int dz = 1; dz <= size - 2; dz++) { - if (!isLadderPos(dx, dz, ladderUpDir, ladderDownDir) && rand.nextInt(chance) == 0) { - placeBlockAtCurrentPosition(world, Blocks.web, 0, dx, dy, dz, sbb); - } - } - } - } - - // 20% chance of a spider spawner! - if (rand.nextInt(5) == 0) { - String spiderName; - switch(rand.nextInt(4)) { - case 3: - spiderName = "CaveSpider"; - break; - case 2: - spiderName = TFCreatures.getSpawnerNameFor("Swarm Spider"); - break; - case 1: - spiderName = TFCreatures.getSpawnerNameFor("Hedge Spider"); - break; - case 0: - default: - spiderName = "Spider"; - break; - } - - placeSpawnerAtCurrentPosition(world, rand, size / 2, bottom + 2, size / 2, spiderName, sbb); - - - } - else { - decorateFurniture(world, rand, bottom, size - 2, sbb); - } - } - - - /** - * Place some furniture around the room. This should probably only be called on larger towers. - */ - protected void decorateFurniture(World world, Random rand, int bottom, int freeSpace, StructureBoundingBox sbb) { - // 66% chance of a table - if (rand.nextInt(3) > 0) { - placeBlockAtCurrentPosition(world, Blocks.fence, 0, size / 2, bottom, size / 2, sbb); - placeBlockAtCurrentPosition(world, Blocks.wooden_pressure_plate, 0, size / 2, bottom + 1, size / 2, sbb); - } - - // chairs! - if (rand.nextInt(3) == 0 && freeSpace > 1) { - placeBlockAtCurrentPosition(world, Blocks.spruce_stairs, getStairMeta(0), size / 2 + 1, bottom, size / 2, sbb); - } - if (rand.nextInt(3) == 0 && freeSpace > 1) { - placeBlockAtCurrentPosition(world, Blocks.spruce_stairs, getStairMeta(1), size / 2, bottom, size / 2 + 1, sbb); - } - if (rand.nextInt(3) == 0 && freeSpace > 1) { - placeBlockAtCurrentPosition(world, Blocks.spruce_stairs, getStairMeta(2), size / 2 - 1, bottom, size / 2, sbb); - } - if (rand.nextInt(3) == 0 && freeSpace > 1) { - placeBlockAtCurrentPosition(world, Blocks.spruce_stairs, getStairMeta(3), size / 2, bottom, size / 2 - 1, sbb); - } - } - - - /** - * Decorate this floor with solid rock - */ - protected void decorateSolidRock(World world, Random rand, int bottom, int top, int ladderUpDir, int ladderDownDir, StructureBoundingBox sbb) { - for (int dy = bottom; dy < top; dy++) { - for (int dx = 1; dx <= size - 2; dx++) { - for (int dz = 1; dz <= size - 2; dz++) { - if (!isLadderPos(dx, dz, ladderUpDir, ladderDownDir) && rand.nextInt(9) != 0) { - placeBlockAtCurrentPosition(world, Blocks.stone, 0, dx, dy, dz, sbb); - } - } - } - } - - //TODO: maybe seed a few ores in there. - } - - - - /** - * Decorate this floor with an orderly library - */ - protected void decorateLibrary(World world, Random rand, int bottom, int top, int ladderUpDir, int ladderDownDir, StructureBoundingBox sbb) { - // put some bookshelves around the room - for (int dx = 1; dx <= size - 2; dx++) { - for (int dz = 1; dz <= size - 2; dz++) { - for (int dy = bottom; dy < top -1; dy++) { - if (dx == 1 || dx == size - 2 || dz == 1 || dz == size -2) { - // side of the room - if (!isWindowPos(dx, dz) && !isLadderPos(dx, dz, ladderUpDir, ladderDownDir)) { - // not an occupied position - placeBlockAtCurrentPosition(world, Blocks.bookshelf, 0, dx, dy, dz, sbb); - } - } - } - } - } - // treasure?!?! - if (rand.nextInt(2) == 0 && this.size > 5) { - decorateLibraryTreasure(world, rand, bottom, top, ladderUpDir, ladderDownDir, sbb); - } - - if (rand.nextInt(2) == 0 && this.size > 5) { - decorateFurniture(world, rand, bottom, size - 2, sbb); - } - - } - - - - /** - * Place a library treasure chest somewhere in the library - */ - protected void decorateLibraryTreasure(World world, Random rand, int bottom, int top, int ladderUpDir, int ladderDownDir, StructureBoundingBox sbb) { - switch (rand.nextInt(4)) { - case 0: - default: - if (!isLadderPos(2, 1, ladderUpDir, ladderDownDir)) { - placeTreasureAtCurrentPosition(world, rand, 2, top - 2, 1, TFTreasure.tower_library, sbb); - break; - } - case 1: - if (!isLadderPos(size - 2, 2, ladderUpDir, ladderDownDir)) { - placeTreasureAtCurrentPosition(world, rand, size - 2, top - 2, 2, TFTreasure.tower_library, sbb); - break; - } - case 2: - if (!isLadderPos(size - 3, size - 2, ladderUpDir, ladderDownDir)) { - placeTreasureAtCurrentPosition(world, rand, size - 3, top - 2, size - 2, TFTreasure.tower_library, sbb); - break; - } - case 3: - if (!isLadderPos(1, size - 3, ladderUpDir, ladderDownDir)) { - placeTreasureAtCurrentPosition(world, rand, 1, top - 2, size - 3, TFTreasure.tower_library, sbb); - break; - } - } - } - - /** - * Decorate this floor with an overflowing library - */ - protected void decorateFullLibrary(World world, Random rand, int bottom, int top, int ladderUpDir, int ladderDownDir, StructureBoundingBox sbb) { - // put some bookshelves around the room - for (int dx = 1; dx <= size - 2; dx++) { - for (int dz = 1; dz <= size - 2; dz++) { - for (int dy = bottom; dy < top; dy++) { - if (dx % 2 != 0 && ((dz >= dx && dz <= size - dx - 1) || (dz >= size - dx - 1 && dz <= dx)) - || dz % 2 != 0 && ((dx >= dz && dx <= size - dz - 1) || (dx >= size - dz - 1 && dx <= dz))) { - // concentric rings - if (!isWindowPos(dx, dy, dz) && !isOpeningPos(dx, dy, dz) && !isLadderPos(dx, dz, ladderUpDir, ladderDownDir)) { - // not an occupied position - placeBlockAtCurrentPosition(world, Blocks.bookshelf, 0, dx, dy, dz, sbb); - } - } - } - } - } - // treasure?!?! - if (rand.nextInt(2) == 0 && this.size > 5) { - decorateLibraryTreasure(world, rand, bottom, top, ladderUpDir, ladderDownDir, sbb); - } - } - - /** - * "Decorate" with a lot of TNT. - * - * This is not called at the moment, since I added monsters and the monsters set off the trap. Perhaps I need a better way of activating it. - * - */ - protected void decorateTrap(World world, Random rand, int bottom, int top, int ladderUpDir, int ladderDownDir, StructureBoundingBox sbb) { - for (int dx = 2; dx <= size - 3; dx++) { - for (int dz = 2; dz <= size - 3; dz++) { - if (dx == 2 || dx == size - 3 || dz == 2 || dz == size -3) { - placeBlockAtCurrentPosition(world, Blocks.tnt, 0, dx, -1, dz, sbb); - } - } - } - for (int dy = bottom - 2; dy < top - 2; dy++) { - placeBlockAtCurrentPosition(world, Blocks.tnt, 0, 1, dy, 1, sbb); - placeBlockAtCurrentPosition(world, Blocks.tnt, 0, 1, dy, size - 2, sbb); - placeBlockAtCurrentPosition(world, Blocks.tnt, 0, size - 2, dy, 1, sbb); - placeBlockAtCurrentPosition(world, Blocks.tnt, 0, size - 2, dy, size - 2, sbb); - } - } - - - - - /** - * Checks if there is a window at the specified x and z. Does not check the Y. - */ - protected boolean isWindowPos(int x, int z) { - if (x == 1 && z == size / 2) { - return true; - } - if (x == size - 2 && z == size / 2) { - return true; - } - if (x == size / 2 && z == 1) { - return true; - } - if (x == size / 2 && z == size - 2) { - return true; - } - - // okay, looks good - return false; - } - - /** - * Checks if there is a window at the specified x, y, and z. - */ - protected boolean isWindowPos(int x, int y, int z) { - int checkYDir = -1; - - if (x == 1 && z == size / 2) { - checkYDir = 2; - } - else if (x == size - 2 && z == size / 2) { - checkYDir = 0; - } - else if (x == size / 2 && z == 1) { - checkYDir = 3; - } - else if (x == size / 2 && z == size - 2) { - checkYDir = 1; - } - - if (checkYDir > -1) { - // check if we are at one of the Y positions with a window. - return !openingTowards[checkYDir] && (y == 2 || y == 3 || (height > 8 && (y == height - 3 || y == height - 4))); - } - else { - // okay, looks good - return false; - } - } - - /** - * Checks if putting a block at the specified x, y, and z would block an opening. - * TODO: this could be much smarter. Although since there's usually only one opening, I guess it's not bad. - */ - protected boolean isOpeningPos(int x, int y, int z) { - Iterator itr = openings.iterator(); - while(itr.hasNext()){ - ChunkCoordinates door = itr.next(); - // determine which wall we're at - ChunkCoordinates inside = new ChunkCoordinates(door); - if (inside.posX == 0) { - inside.posX++; - } - else if (inside.posX == size - 1) { - inside.posX--; - } - else if (inside.posZ == 0) { - inside.posZ++; - } - else if (inside.posZ == size - 1) { - inside.posZ--; - } - // check the block - if (inside.posX == x && inside.posZ == z && (inside.posY == y || inside.posY + 1 == y)) { - return true; - } - } - // guess not! - return false; - } - - - - protected boolean isLadderPos(int x, int z, int ladderUpDir, int ladderDownDir) { - if (x == getLadderX(ladderUpDir) && z == getLadderZ(ladderUpDir)) { - return true; - } - if (x == getLadderX(ladderDownDir) && z == getLadderZ(ladderDownDir)) { - return true; - } - - // okay, looks good - return false; - } - - /** - * Gets the X coordinate of the ladder on the specified wall. - * - * @param ladderDir - * @return - */ - protected int getLadderX(int ladderDir) { - switch (ladderDir) { - case 0: - return size - 2; - case 1: - return size / 2 + 1; - case 2: - return 1; - case 3: - return size / 2 - 1; - default: - return size / 2; - } - } - - /** - * Gets the Z coordinate of the ladder on the specified wall. - * - * @param ladderDir - * @return - */ - protected int getLadderZ(int ladderDir) { - - switch (ladderDir) { - case 0: - return size / 2 - 1; - case 1: - return size - 2; - case 2: - return size / 2 + 1; - case 3: - return 1; - default: - return size / 2; - } - } - - /** - * Decorate a tower with stairs. - * - * We have two schemes here. We can either decorate the whole tower with a - * decoration that rises the entire height of the tower (such as a pillar) - * or we can divide the tower into the "stair" section on the bottom and the - * "attic" section at the top and decorate those seperately. - * - */ - protected void decorateStairTower(World world, Random rand, StructureBoundingBox sbb) { - // if it's tall enough, consider adding extra floors onto the top. - if (height - highestOpening > 8) { - int base = highestOpening + 3; - int floors = (this.height - base) / 5; - - // divide the tower into floors - int floorHeight = (this.height - base) / floors; - for (int i = 0; i < floors; i++) { - // put down a floor - for (int x = 1; x < size - 1; x++) { - for (int z = 1; z < size - 1; z++) { - placeBlockAtCurrentPosition(world, Blocks.planks, 2, x, (i * floorHeight + base), z, sbb); - } - } - } - - - int ladderDir = 3; - int downLadderDir = -1; - - // place a ladder going up - //TODO: make this ladder connect better to the stairs - int meta = getLadderMeta(ladderDir); - int dx = getLadderX(ladderDir); - int dz = getLadderZ(ladderDir); - for (int dy = 1; dy < 3; dy++) { - placeBlockAtCurrentPosition(world, Blocks.ladder, meta, dx, base - dy, dz, sbb); - } - - // decorate middle floors - for (int i = 0; i < floors - 1; i++) { - int bottom = base + 1 + floorHeight * i; - int top = base + floorHeight * (i + 1); - - downLadderDir = ladderDir; - ladderDir++; - ladderDir %= 4; - - decorateFloor(world, rand, i, bottom, top, ladderDir, downLadderDir, sbb); - } - - // decorate top floor - decorateFloor(world, rand, floors, base + 1 + floorHeight * (floors - 1), height - 1, -1, ladderDir, sbb); - - // decorate below the bottom floor, into the stairs - if (base > 8) - { - switch (rand.nextInt(4)) { - case 0: - decorateChandelier(world, rand, base + 1, sbb); - break; - case 1: - decorateHangingChains(world, rand, base + 1, sbb); - break; - case 2: - decorateFloatingBooks(world, rand, base + 1, sbb); - break; - case 3: - decorateFloatingVines(world, rand, base + 1, sbb); - break; - } - } - } - else { - // decorate the top normally - if (size > 5) { - switch (rand.nextInt(4)) { - case 0: - decorateChandelier(world, rand, height, sbb); - break; - case 1: - decorateHangingChains(world, rand, height, sbb); - break; - case 2: - decorateFloatingBooks(world, rand, height, sbb); - break; - case 3: - decorateFloatingVines(world, rand, height, sbb); - break; - } - } - else if (size > 3) - { - switch (rand.nextInt(3)) { - case 0: - decorateHangingChains(world, rand, height, sbb); - break; - case 1: - decorateFloatingBooks(world, rand, height, sbb); - break; - case 2: - decorateFloatingVines(world, rand, height, sbb); - break; - } - } - } - - decorateStairFloor(world, rand, sbb); - } - - - /** - * Decorate the bottom floor of this tower. - * - * This is for towers with stairs at the bottom, not towers divided into floors - */ - protected void decorateStairFloor(World world, Random rand, StructureBoundingBox sbb) { - // decorate the bottom - if (size > 5) { - if (rand.nextInt(3) == 0) { - decorateStairWell(world, rand, sbb); - } - else if (rand.nextInt(3) > 0 || this.size >= 15) { - // a few empty bottoms - decoratePlanter(world, rand, sbb); - } - } - } - - - - - - /** - * Make a chandelier. The chandelier hangs down a random amount between the top of the tower and the highest opening. - */ - protected void decorateChandelier(World world, Random rand, int decoTop, StructureBoundingBox sbb) { - if (decoTop < 8 || size < 8) - { - //System.out.println("Trying to put a chandelier in a size " + decoTop + " space. FAIL!"); - return; - } - - int cx = size / 2; - int cy = decoTop - rand.nextInt(decoTop - 7) - 2; - int cz = size / 2; - - placeBlockAtCurrentPosition(world, Blocks.fence, 0, cx + 0, cy + 0, cz + 0, sbb); - placeBlockAtCurrentPosition(world, Blocks.fence, 0, cx - 1, cy + 0, cz + 0, sbb); - placeBlockAtCurrentPosition(world, Blocks.fence, 0, cx + 1, cy + 0, cz + 0, sbb); - placeBlockAtCurrentPosition(world, Blocks.fence, 0, cx + 0, cy + 0, cz - 1, sbb); - placeBlockAtCurrentPosition(world, Blocks.fence, 0, cx + 0, cy + 0, cz + 1, sbb); - - placeBlockAtCurrentPosition(world, Blocks.fence, 0, cx + 0, cy + 1, cz + 0, sbb); - placeBlockAtCurrentPosition(world, Blocks.torch, 0, cx - 1, cy + 1, cz + 0, sbb); - placeBlockAtCurrentPosition(world, Blocks.torch, 0, cx + 1, cy + 1, cz + 0, sbb); - placeBlockAtCurrentPosition(world, Blocks.torch, 0, cx + 0, cy + 1, cz - 1, sbb); - placeBlockAtCurrentPosition(world, Blocks.torch, 0, cx + 0, cy + 1, cz + 1, sbb); - - for (int y = cy; y < decoTop - 1; y++) { - placeBlockAtCurrentPosition(world, Blocks.fence, 0, cx + 0, y, cz + 0, sbb); - } - } - - - - /** - * Decorates a tower with chains hanging down. - * - * The chains go from the ceiling to just above the highest doorway. - * @param decoTop - */ - protected void decorateHangingChains(World world, Random rand, int decoTop, StructureBoundingBox sbb) { - // a list of existing chains - ArrayList chainList = new ArrayList(); - // try size + 2 times to find a chain that does not collide - for (int i = 0; i < size + 2; i++) { - int filled = size < 15 ? 2 : 4; - ChunkCoordinates chain = new ChunkCoordinates(filled + rand.nextInt(size - (filled * 2)), decoTop - 2, filled + rand.nextInt(size - (filled * 2))); - if (!chainCollides(chain, chainList)) { - // if it doesn't collide, manufacture it and add it to the list - int length = 1 + rand.nextInt(decoTop - 7); - decorateOneChain(world, rand, chain.posX, decoTop, length, chain.posZ, sbb); - chainList.add(chain); - } - } - - - } - - /** - * Return true if the specified coords are orthogonally adjacent to any other coords on the list. - */ - protected boolean chainCollides(ChunkCoordinates coords, List list) { - Iterator itr = list.iterator(); - while (itr.hasNext()) { - ChunkCoordinates existing = itr.next(); - // if x is within 1 and z is equal, we collide - if (coords.posZ == existing.posZ && Math.abs(coords.posX - existing.posX) <= 1) { - return true; - } - // similarly, if z is within 1 and x is equal, we collide - if (coords.posX == existing.posX && Math.abs(coords.posZ - existing.posZ) <= 1) { - return true; - } - } - // we're good - return false; - } - - /** - * Puts one chain in a tower at the specified coordinates. - * - * @param dx - * @param length - * @param dz - * @param posZ - */ - protected void decorateOneChain(World world, Random rand, int dx, int decoTop, int length, int dz, StructureBoundingBox sbb) { - for (int y = 1; y <= length; y++) { - placeBlockAtCurrentPosition(world, Blocks.iron_bars, 0, dx, decoTop - y - 1, dz, sbb); - } - // make the "ball" at the end. - Block ballBlock; - int ballMeta; - switch (rand.nextInt(10)) { - case 0: - ballBlock = Blocks.iron_block; - ballMeta = 0; - break; - case 1: - ballBlock = Blocks.bookshelf; - ballMeta = 0; - break; - case 2: - ballBlock = Blocks.netherrack; - ballMeta = 0; - break; - case 3: - ballBlock = Blocks.soul_sand; - ballMeta = 0; - break; - case 4: - ballBlock = Blocks.glass; - ballMeta = 0; - break; - case 5: - ballBlock = Blocks.lapis_block; - ballMeta = 0; - break; - case 6: - ballBlock = Blocks.monster_egg; - ballMeta = 2; - break; - case 7: - default: - ballBlock = Blocks.glowstone; - ballMeta = 0; - break; - } - placeBlockAtCurrentPosition(world, ballBlock, ballMeta, dx, decoTop - length - 2, dz, sbb); - } - - /** - * Decorates a tower with an array of floating bookshelves. - * @param decoTop - */ - protected void decorateFloatingBooks(World world, Random rand, int decoTop, StructureBoundingBox sbb) { - // a list of existing bookshelves - ArrayList shelfList = new ArrayList(); - // try size + 2 times to find a shelf that does not collide - for (int i = 0; i < size + 2; i++) { - int filled = size < 15 ? 2 : 4; - ChunkCoordinates shelf = new ChunkCoordinates(filled + rand.nextInt(size - (filled * 2)), decoTop - 2, filled + rand.nextInt(size - (filled * 2))); - if (!chainCollides(shelf, shelfList)) { - // if it doesn't collide, manufacture it and add it to the list - int bottom = 2 + rand.nextInt(decoTop - 7); - int top = rand.nextInt(bottom - 1) + 2; - for (int y = top; y <= bottom; y++) { - placeBlockAtCurrentPosition(world, Blocks.bookshelf, 0, shelf.posX, decoTop - y, shelf.posZ, sbb); - } - shelfList.add(shelf); - } - } - } - - - /** - * Decorates a tower with an array of floating vines, attached to mossy cobblestone. - * @param decoTop - */ - protected void decorateFloatingVines(World world, Random rand, int decoTop, StructureBoundingBox sbb) { - // a list of existing blocks - ArrayList mossList = new ArrayList(); - // try size + 2 times to find a rock pillar that does not collide - for (int i = 0; i < size + 2; i++) { - int filled = size < 15 ? 2 : 4; - ChunkCoordinates moss = new ChunkCoordinates(filled + rand.nextInt(size - (filled * 2)), decoTop - 2, filled + rand.nextInt(size - (filled * 2))); - if (!chainCollides(moss, mossList)) { - // if it doesn't collide, manufacture it and add it to the list - int bottom = 2 + rand.nextInt(decoTop - 7); - int top = rand.nextInt(bottom - 1) + 2; - for (int y = top; y <= bottom; y++) { - placeBlockAtCurrentPosition(world, Blocks.mossy_cobblestone, 0, moss.posX, decoTop - y, moss.posZ, sbb); - // surround it with vines - placeBlockAtCurrentPosition(world, Blocks.vine, getVineMeta(2), moss.posX + 1, decoTop - y, moss.posZ + 0, sbb); - placeBlockAtCurrentPosition(world, Blocks.vine, getVineMeta(0), moss.posX - 1, decoTop - y, moss.posZ + 0, sbb); - placeBlockAtCurrentPosition(world, Blocks.vine, getVineMeta(3), moss.posX + 0, decoTop - y, moss.posZ + 1, sbb); - placeBlockAtCurrentPosition(world, Blocks.vine, getVineMeta(1), moss.posX + 0, decoTop - y, moss.posZ - 1, sbb); - } - mossList.add(moss); - } - } - - // put vines on the sides of the tower. - for (int y = highestOpening + 3; y < decoTop - 1; y++) { - for (int x = 1; x < size - 1; x++) { - if (rand.nextInt(3) == 0) { - placeBlockAtCurrentPosition(world, Blocks.vine, getVineMeta(3), x, y, 1, sbb); - } - if (rand.nextInt(3) == 0) { - placeBlockAtCurrentPosition(world, Blocks.vine, getVineMeta(1), x, y, size - 2, sbb); - } - } - for (int z = 1; z < size - 1; z++) { - if (rand.nextInt(3) == 0) { - placeBlockAtCurrentPosition(world, Blocks.vine, getVineMeta(2), 1, y, z, sbb); - } - if (rand.nextInt(3) == 0) { - placeBlockAtCurrentPosition(world, Blocks.vine, getVineMeta(0), size - 2, y, z, sbb); - } - } - } - } - - - /** - * Gets the metadata necessary to stick the vines on the specified wall. - * - * @param vineDir - * @return - */ - protected int getVineMeta(int vineDir) { - switch ((this.getCoordBaseMode() + vineDir) % 4) { - case 0: - return 8; - case 1: - return 1; - case 2: - return 2; - case 3: - return 4; - default: - return -1; // this is impossible - } - } - - - - /** - * Makes a planter. Depending on the situation, it can be filled with trees, flowers, or crops - */ - protected void decoratePlanter(World world, Random rand, StructureBoundingBox sbb) { - int cx = size / 2; - int cz = cx; - - placeBlockAtCurrentPosition(world, Blocks.stone_slab, 0, cx + 0, 1, cz + 1, sbb); - placeBlockAtCurrentPosition(world, Blocks.stone_slab, 0, cx + 0, 1, cz - 1, sbb); - placeBlockAtCurrentPosition(world, Blocks.stone_slab, 0, cx + 1, 1, cz + 0, sbb); - placeBlockAtCurrentPosition(world, Blocks.stone_slab, 0, cx - 1, 1, cz + 0, sbb); - - if (size > 7) - { - placeBlockAtCurrentPosition(world, Blocks.double_stone_slab, 0, cx - 1, 1, cz - 1, sbb); - placeBlockAtCurrentPosition(world, Blocks.double_stone_slab, 0, cx + 1, 1, cz - 1, sbb); - placeBlockAtCurrentPosition(world, Blocks.double_stone_slab, 0, cx + 1, 1, cz + 1, sbb); - placeBlockAtCurrentPosition(world, Blocks.double_stone_slab, 0, cx - 1, 1, cz + 1, sbb); - } - - // place a cute planted thing - placeBlockAtCurrentPosition(world, Blocks.grass, 0, cx + 0, 1, cz + 0, sbb); - - Block planterBlock; - int planterMeta; - switch (rand.nextInt(6)) { - case 0: - planterBlock = Blocks.sapling; - planterMeta = 0; - break; - case 1: - planterBlock = Blocks.sapling; - planterMeta = 1; - break; - case 2: - planterBlock = Blocks.sapling; - planterMeta = 2; - break; - case 3: - planterBlock = Blocks.sapling; - planterMeta = 3; - break; - case 4: - planterBlock = Blocks.brown_mushroom; - planterMeta = 0; - break; - case 5: - default: - planterBlock = Blocks.red_mushroom; - planterMeta = 0; - break; - } - placeBlockAtCurrentPosition(world, planterBlock, planterMeta, cx + 0, 2, cz + 0, sbb); - - // try to grow a tree - if (planterBlock == Blocks.sapling) { - int wx = getXWithOffset(cx, cz); - int wy = getYWithOffset(2); - int wz = getZWithOffset(cx, cz); - ((BlockSapling)Blocks.sapling).func_149878_d(world, wx, wy, wz, world.rand); - } - // or a mushroom - if (planterBlock == Blocks.brown_mushroom || planterBlock == Blocks.red_mushroom) { - int wx = getXWithOffset(cx, cz); - int wy = getYWithOffset(2); - int wz = getZWithOffset(cx, cz); - ((BlockMushroom)planterBlock).updateTick(world, wx, wy, wz, world.rand); - } - - // otherwise, place the block into a flowerpot - Block whatHappened = this.getBlockAtCurrentPosition(world, cx + 0, 2, cz + 0, sbb); - if (whatHappened == planterBlock || whatHappened == Blocks.air) - { - int potMeta = 0;//BlockFlowerPot.getMetaForPlant(new ItemStack(planterBlock, 1, planterMeta)); - placeBlockAtCurrentPosition(world, Blocks.flower_pot, potMeta, cx + 0, 2, cz + 0, sbb); - } - } - - /** - * Decorate the floor of this stair tower with a scenic well. - */ - protected void decorateStairWell(World world, Random rand, StructureBoundingBox sbb) { - int cx = size / 2; - int cz = cx; - int cy = 1; - - Block waterOrLava = rand.nextInt(4) == 0 ? Blocks.lava : Blocks.water; - - if (size > 7) { - // actual well structure - placeBlockAtCurrentPosition(world, Blocks.stonebrick, 0, cx - 1, cy + 0, cz - 1, sbb); - placeBlockAtCurrentPosition(world, Blocks.stone_slab, 5, cx - 1, cy + 1, cz - 1, sbb); - placeBlockAtCurrentPosition(world, Blocks.stonebrick, 0, cx + 0, cy + 0, cz - 1, sbb); - placeBlockAtCurrentPosition(world, Blocks.stonebrick, 0, cx + 1, cy + 0, cz - 1, sbb); - placeBlockAtCurrentPosition(world, Blocks.stone_slab, 5, cx + 1, cy + 1, cz - 1, sbb); - placeBlockAtCurrentPosition(world, Blocks.stonebrick, 0, cx - 1, cy + 0, cz + 0, sbb); - placeBlockAtCurrentPosition(world, waterOrLava, 0, cx + 0, cy + 0, cz + 0, sbb); - placeBlockAtCurrentPosition(world, Blocks.stonebrick, 0, cx + 1, cy + 0, cz + 0, sbb); - placeBlockAtCurrentPosition(world, Blocks.stonebrick, 0, cx - 1, cy + 0, cz + 1, sbb); - placeBlockAtCurrentPosition(world, Blocks.stone_slab, 5, cx - 1, cy + 1, cz + 1, sbb); - placeBlockAtCurrentPosition(world, Blocks.stonebrick, 0, cx + 0, cy + 0, cz + 1, sbb); - placeBlockAtCurrentPosition(world, Blocks.stonebrick, 0, cx + 1, cy + 0, cz + 1, sbb); - placeBlockAtCurrentPosition(world, Blocks.stone_slab, 5, cx + 1, cy + 1, cz + 1, sbb); - } - - placeBlockAtCurrentPosition(world, waterOrLava, 0, cx + 0, cy - 1, cz + 0, sbb); - - } - - - - - /** - * Returns true if this tower has only one exit. - */ - public boolean isDeadEnd() { - return openings.size() == 1; - } - - /** - * Returns true if this tower has four exits. - */ - public boolean hasExitsOnAllWalls() { - int exits = 0; - for (int i = 0; i < 4; i++) { - exits += this.openingTowards[i] ? 1 : 0; - } - - return exits == 4; - } - - /** - * Returns true if this tower has stairs - */ - public boolean hasStairs() { - return highestOpening > 1; - } - - /** - * Iterate through the openings on our list and add them to the tower - */ - protected void makeOpenings(World world, StructureBoundingBox sbb) { - for (ChunkCoordinates door : openings) - { - makeDoorOpening(world, door.posX, door.posY, door.posZ, sbb); - } - } - - - - - /** - * Make an opening in this tower for a door. This now only makes one opening, so you need two - */ - protected void makeDoorOpening(World world, int dx, int dy, int dz, StructureBoundingBox sbb) { - // try to add blocks outside this door -// if (dx == 0) { -// placeBlockAtCurrentPosition(world, Blocks.stone, 0, dx - 1, dy + 0, dz, sbb); -// placeBlockAtCurrentPosition(world, Blocks.stone, 0, dx - 1, dy + 1, dz, sbb); -// } -// if (dx == size - 1) { -// placeBlockAtCurrentPosition(world, Blocks.stone, 0, dx + 1, dy + 0, dz, sbb); -// placeBlockAtCurrentPosition(world, Blocks.stone, 0, dx + 1, dy + 1, dz, sbb); -// } -// if (dz == 0) { -// placeBlockAtCurrentPosition(world, Blocks.stone, 0, dx, dy + 0, dz - 1, sbb); -// placeBlockAtCurrentPosition(world, Blocks.stone, 0, dx, dy + 1, dz - 1, sbb); -// } -// if (dz == size - 1) { -// placeBlockAtCurrentPosition(world, Blocks.stone, 0, dx, dy + 0, dz + 1, sbb); -// placeBlockAtCurrentPosition(world, Blocks.stone, 0, dx, dy + 1, dz + 1, sbb); -// } -// - - placeBlockAtCurrentPosition(world, Blocks.air, 0, dx, dy + 0, dz, sbb); - placeBlockAtCurrentPosition(world, Blocks.air, 0, dx, dy + 1, dz, sbb); -// updateLight(world, dx, dy + 0, dz); -// updateLight(world, dx, dy + 1, dz); - - if (getBlockAtCurrentPosition(world, dx, dy + 2, dz, sbb) != Blocks.air) { - placeBlockAtCurrentPosition(world, Blocks.double_stone_slab, 0, dx, dy + 2, dz, sbb); - } - - // clear the door - if (dx == 0) { -// placeBlockAtCurrentPosition(world, Blocks.air, 0, dx - 1, dy + 0, dz, sbb); -// placeBlockAtCurrentPosition(world, Blocks.air, 0, dx - 1, dy + 1, dz, sbb); - updateLight(world, dx - 1, dy + 0, dz); - updateLight(world, dx - 1, dy + 1, dz); - } - if (dx == size - 1) { -// placeBlockAtCurrentPosition(world, Blocks.air, 0, dx + 1, dy + 0, dz, sbb); -// placeBlockAtCurrentPosition(world, Blocks.air, 0, dx + 1, dy + 1, dz, sbb); - updateLight(world, dx + 1, dy + 0, dz); - updateLight(world, dx + 1, dy + 1, dz); - } - if (dz == 0) { -// placeBlockAtCurrentPosition(world, Blocks.air, 0, dx, dy + 0, dz - 1, sbb); -// placeBlockAtCurrentPosition(world, Blocks.air, 0, dx, dy + 1, dz - 1, sbb); - updateLight(world, dx, dy + 0, dz - 1); - updateLight(world, dx, dy + 1, dz - 1); - } - if (dz == size - 1) { -// placeBlockAtCurrentPosition(world, Blocks.air, 0, dx, dy + 0, dz + 1, sbb); -// placeBlockAtCurrentPosition(world, Blocks.air, 0, dx, dy + 1, dz + 1, sbb); - updateLight(world, dx, dy + 0, dz + 1); - updateLight(world, dx, dy + 1, dz + 1); - } - } - - public void updateLight(World world, int dx, int dy, int dz) { - //world.updateAllLightTypes(getXWithOffset(dx, dz), getYWithOffset(dy), getZWithOffset(dx, dz)); - } - - /** - * Gets a random position in the specified direction that connects to stairs currently in the tower. - */ - public int[] getValidOpening(Random rand, int direction) { - // variables! - int wLength = size - 2; // wall length - int offset = 1; // wall thickness - - // size 15 towers have funny landings, so don't generate on the very edge - if (this.size == 15) { - wLength = 11; - offset = 2; - } - - // for directions 0 or 2, the wall lies along the z axis - if (direction == 0 || direction == 2) { - int rx = direction == 0 ? size - 1 : 0; - int rz = offset + rand.nextInt(wLength); - int ry = getYByStairs(rz, rand, direction); - - return new int[] {rx, ry, rz}; - } - - // for directions 1 or 3, the wall lies along the x axis - if (direction == 1 || direction == 3) { - int rx = offset + rand.nextInt(wLength); - int rz = direction == 1 ? size - 1 : 0; - int ry = getYByStairs(rx, rand, direction); - - return new int[] {rx, ry, rz}; - } - - - return new int[] {0, 0, 0}; - } - - - - /** - * Gets a Y value where the stairs meet the specified X coordinate. - * Also works for Z coordinates. - */ - protected int getYByStairs(int rx, Random rand, int direction) { - // initialize some variables - int rise = 1; - int base = 0; - - if (size == 15) { - rise = 10; - // we lie a little here to get the towers off the ground - base = (direction == 0 || direction == 2) ? 23 : 28; - } - if (size == 9) { - rise = 6; - base = (direction == 0 || direction == 2) ? 2 : 5; - } - if (size == 7) { - rise = 4; - base = (direction == 0 || direction == 2) ? 2 : 4; - } - if (size == 5) { - rise = 4; - // bleh, a switch. - switch (direction) { - case 0: - base = 3; - break; - case 1: - base = 2; - break; - case 2: - base = 5; - break; - case 3: - base = 4; - break; - } - } - - int flights = ((height - 6 - base) / rise) + 1; - - if (base > 0 && flights > 0) { - // pick a flight of stairs to be on - int flightChosen = rand.nextInt(flights); - // calculate where we would be if rx = 0 - int dy = (flightChosen * rise) + base; - // the staircase (a/de)scends across the room. - if (size == 15) { - // blech, another dumb kludge here - dy -= (direction == 0 || direction == 3) ? (rx - 2) / 2 : (size - rx - 3) / 2; - } - else { - // the rest are fairly normal - dy -= (direction == 0 || direction == 3) ? (rx - 1) / 2 : (size - rx - 2) / 2; - } -// // even xs can be one higher if they want. -// if (rx % 2 == 0 && size != 15) { -// dy += rand.nextInt(2); -// } - // don't go through the floor - if (dy < 1) { - dy = 1; - } - - return dy; - } - - return 0; - } - - - - /** - * Makes 3 windows outside this tower. - * - * The function currently looks "outside" to see if the window will be blocked, but it can't see into the future, so a tower built after this one may block it. - * - * Maybe this could eventually have access to the list of bounding boxes for better accuracy? - */ - protected void makeWindows(World world, Random rand, StructureBoundingBox sbb, boolean real) { - - - for (int i = 0; i < 4; i++) { - boolean realWindows = real && !openingTowards[i]; - makeWindowBlock(world, size - 1, 2, size / 2, i, sbb, realWindows); - makeWindowBlock(world, size - 1, 3, size / 2, i, sbb, realWindows); - makeWindowBase(world, size - 1, 1, size / 2, i, sbb); - if (height > 8) { - makeWindowBlock(world, size - 1, height - 3, size / 2, i, sbb, realWindows); - makeWindowBlock(world, size - 1, height - 4, size / 2, i, sbb, realWindows); - makeWindowBase(world, size - 1, height - 5, size / 2, i, sbb); - } - } - } - - - - /** - * Makes a window block. Specify a point in a wall, and this function checks to - * see if it is blocked on the inside or outside, and if not, adds a pane of glass. - */ - protected void makeWindowBlock(World world, int x, int y, int z, int rotation, StructureBoundingBox sbb, boolean realWindows) { - int temp = this.getCoordBaseMode(); - this.setCoordBaseMode((this.getCoordBaseMode() + rotation) % 4); - - // look outside - Block outside = getBlockAtCurrentPosition(world, x + 1, y, z, sbb); - - // look inside - Block inside = getBlockAtCurrentPosition(world, x - 1, y, z, sbb); - - // make a window! - if (realWindows && inside == Blocks.air && outside == Blocks.air) { - placeBlockAtCurrentPosition(world, Blocks.glass_pane, 0, x, y, z, sbb); - } - else { - // cobblestone where the window might have been - placeBlockAtCurrentPosition(world, Blocks.cobblestone, 0, x, y, z, sbb); - } - - this.setCoordBaseMode(temp); - - } - - /** - * Makes a window base - */ - protected void makeWindowBase(World world, int x, int y, int z, int rotation, StructureBoundingBox sbb) { - int temp = this.getCoordBaseMode(); - this.setCoordBaseMode((this.getCoordBaseMode() + rotation) % 4); - placeBlockAtCurrentPosition(world, Blocks.double_stone_slab, 0, x, y, z, sbb); - this.setCoordBaseMode(temp); - - } - - /** - * Add stairs to this tower. - */ - protected boolean makeStairs(World world, Random rand, StructureBoundingBox sbb) { - if (this.size == 15) { - return makeStairs15(world, rand, sbb); - } - if (this.size == 9) { - return makeStairs9(world, rand, sbb); - } - if (this.size == 7) { - return makeStairs7(world, rand, sbb); - } - if (this.size == 5) { - return makeStairs5(world, rand, sbb); - } - - return false; - } - - /** - * Stair maker for a size 5 tower - */ - protected boolean makeStairs5(World world, Random rand, StructureBoundingBox sbb) { - // staircases rotating around the tower - int rise = 1; -// int numFlights = ((this.height - 3) / rise) - 1; - int numFlights = (highestOpening / rise); - for (int i = 0; i < numFlights; i++) { - makeStairs5flight(world, rand, sbb, i * rise, 0 + (i * 3), 2); - } - - return true; - } - - /** - * Function called by makeStairs5 to place stair blocks - * - * @param height - * @param rotation - */ - protected void makeStairs5flight(World world, Random rand, StructureBoundingBox sbb, int height, int rotation, int meta) { - int temp = this.getCoordBaseMode(); - - this.setCoordBaseMode((this.getCoordBaseMode() + rotation) % 4); - - BlockSlab singleSlabBlock = meta == 0 ? Blocks.stone_slab : Blocks.wooden_slab; - Block doubleSlabBlock = meta == 0 ? Blocks.double_stone_slab : Blocks.planks; - - placeBlockAtCurrentPosition(world, singleSlabBlock, meta, 2, 1 + height, 3, sbb); - placeBlockAtCurrentPosition(world, doubleSlabBlock, meta, 3, 1 + height, 3, sbb); - - this.setCoordBaseMode(temp); - } - - /** - * Stair maker for a size 7 tower - */ - protected boolean makeStairs7(World world, Random rand, StructureBoundingBox sbb) { - // foot of stairs - placeBlockAtCurrentPosition(world, Blocks.wooden_slab, 2, 1, 1, 4, sbb); - placeBlockAtCurrentPosition(world, Blocks.planks, 2, 1, 1, 5, sbb); - - placeBlockAtCurrentPosition(world, Blocks.stone_slab, 0, 5, 1, 2, sbb); - placeBlockAtCurrentPosition(world, Blocks.double_stone_slab, 0, 5, 1, 1, sbb); - - // staircases rotating around the tower - int rise = 2; -// int numFlights = ((this.height - 3) / rise) - 1; - int numFlights = (highestOpening / rise); - for (int i = 0; i < numFlights; i++) { - makeStairs7flight(world, rand, sbb, 1 + i * rise, 0 + (i * 3), 2); - makeStairs7flight(world, rand, sbb, 1 + i * rise, 2 + (i * 3), 0); - } - - return true; - } - - /** - * Function called by makeStairs7 to place stair blocks - * - * @param height - * @param rotation - */ - protected void makeStairs7flight(World world, Random rand, StructureBoundingBox sbb, int height, int rotation, int meta) { - int temp = this.getCoordBaseMode(); - - this.setCoordBaseMode((this.getCoordBaseMode() + rotation) % 4); - - BlockSlab singleSlabBlock = meta == 0 ? Blocks.stone_slab : Blocks.wooden_slab; - Block doubleSlabBlock = meta == 0 ? Blocks.double_stone_slab : Blocks.planks; - - placeBlockAtCurrentPosition(world, singleSlabBlock, meta, 2, 1 + height, 5, sbb); - placeBlockAtCurrentPosition(world, doubleSlabBlock, meta, 3, 1 + height, 5, sbb); - placeBlockAtCurrentPosition(world, singleSlabBlock, meta, 4, 2 + height, 5, sbb); - placeBlockAtCurrentPosition(world, doubleSlabBlock, meta, 5, 2 + height, 5, sbb); - - this.setCoordBaseMode(temp); - } - - /** - * Stair maker for a size 9 tower - */ - protected boolean makeStairs9(World world, Random rand, StructureBoundingBox sbb) { - // foot of stairs - placeBlockAtCurrentPosition(world, Blocks.wooden_slab, 2, 1, 1, 6, sbb); - placeBlockAtCurrentPosition(world, Blocks.planks, 2, 1, 1, 7, sbb); - - placeBlockAtCurrentPosition(world, Blocks.stone_slab, 0, 7, 1, 2, sbb); - placeBlockAtCurrentPosition(world, Blocks.double_stone_slab, 0, 7, 1, 1, sbb); - - // staircases rotating around the tower - int rise = 3; -// int numFlights = ((this.height - 3) / rise) - 1; - int numFlights = (highestOpening / rise); - for (int i = 0; i < numFlights; i++) { - makeStairs9flight(world, rand, sbb, 1 + i * rise, 0 + (i * 3), 2); - makeStairs9flight(world, rand, sbb, 1 + i * rise, 2 + (i * 3), 0); - } - - return true; - } - - /** - * Function called by makeStairs7 to place stair blocks - * - * @param height - * @param rotation - */ - protected void makeStairs9flight(World world, Random rand, StructureBoundingBox sbb, int height, int rotation, int meta) { - int temp = this.getCoordBaseMode(); - - this.setCoordBaseMode((this.getCoordBaseMode() + rotation) % 4); - - Block singleSlabBlock = meta == 0 ? Blocks.stone_slab : Blocks.wooden_slab; - Block doubleSlabBlock = meta == 0 ? Blocks.double_stone_slab : Blocks.planks; - - placeBlockAtCurrentPosition(world, singleSlabBlock, meta, 2, 1 + height, 7, sbb); - placeBlockAtCurrentPosition(world, doubleSlabBlock, meta, 3, 1 + height, 7, sbb); - placeBlockAtCurrentPosition(world, singleSlabBlock, meta, 4, 2 + height, 7, sbb); - placeBlockAtCurrentPosition(world, doubleSlabBlock, meta, 5, 2 + height, 7, sbb); - placeBlockAtCurrentPosition(world, singleSlabBlock, meta, 6, 3 + height, 7, sbb); - placeBlockAtCurrentPosition(world, doubleSlabBlock, meta, 7, 3 + height, 7, sbb); - - this.setCoordBaseMode(temp); - } - - /** - * Stair maker for a size 15 tower - */ - protected boolean makeStairs15(World world, Random rand, StructureBoundingBox sbb) { - // foot of stairs - placeBlockAtCurrentPosition(world, Blocks.wooden_slab, 2, 1, 1, 9, sbb); - placeBlockAtCurrentPosition(world, Blocks.wooden_slab, 2, 2, 1, 9, sbb); - placeBlockAtCurrentPosition(world, Blocks.planks, 2, 1, 1, 10, sbb); - placeBlockAtCurrentPosition(world, Blocks.planks, 2, 2, 1, 10, sbb); - placeBlockAtCurrentPosition(world, Blocks.wooden_slab, 2, 1, 2, 11, sbb); - placeBlockAtCurrentPosition(world, Blocks.wooden_slab, 2, 2, 2, 11, sbb); - placeBlockAtCurrentPosition(world, Blocks.planks, 2, 1, 2, 12, sbb); - placeBlockAtCurrentPosition(world, Blocks.planks, 2, 2, 2, 12, sbb); - placeBlockAtCurrentPosition(world, Blocks.planks, 2, 1, 2, 13, sbb); - placeBlockAtCurrentPosition(world, Blocks.planks, 2, 2, 2, 13, sbb); - - placeBlockAtCurrentPosition(world, Blocks.planks, 2, 3, 2, 11, sbb); - placeBlockAtCurrentPosition(world, Blocks.fence, 0, 3, 3, 11, sbb); - placeBlockAtCurrentPosition(world, Blocks.fence, 0, 3, 4, 11, sbb); -// placeBlockAtCurrentPosition(world, Blocks.torch, 0, 3, 5, 11, sbb); - placeBlockAtCurrentPosition(world, Blocks.planks, 2, 3, 1, 10, sbb); - placeBlockAtCurrentPosition(world, Blocks.fence, 0, 3, 2, 10, sbb); - placeBlockAtCurrentPosition(world, Blocks.fence, 0, 3, 3, 10, sbb); - placeBlockAtCurrentPosition(world, Blocks.planks, 2, 3, 1, 9, sbb); - placeBlockAtCurrentPosition(world, Blocks.fence, 0, 3, 2, 9, sbb); - - placeBlockAtCurrentPosition(world, Blocks.stone_slab, 0, 13, 1, 5, sbb); - placeBlockAtCurrentPosition(world, Blocks.stone_slab, 0, 12, 1, 5, sbb); - placeBlockAtCurrentPosition(world, Blocks.double_stone_slab, 0, 13, 1, 4, sbb); - placeBlockAtCurrentPosition(world, Blocks.double_stone_slab, 0, 12, 1, 4, sbb); - placeBlockAtCurrentPosition(world, Blocks.stone_slab, 0, 13, 2, 3, sbb); - placeBlockAtCurrentPosition(world, Blocks.stone_slab, 0, 12, 2, 3, sbb); - placeBlockAtCurrentPosition(world, Blocks.double_stone_slab, 0, 13, 2, 2, sbb); - placeBlockAtCurrentPosition(world, Blocks.double_stone_slab, 0, 12, 2, 2, sbb); - placeBlockAtCurrentPosition(world, Blocks.double_stone_slab, 0, 13, 2, 1, sbb); - placeBlockAtCurrentPosition(world, Blocks.double_stone_slab, 0, 12, 2, 1, sbb); -// placeBlockAtCurrentPosition(world, Blocks.stone_slab, 0, 7, 1, 2, sbb); -// placeBlockAtCurrentPosition(world, Blocks.double_stone_slab, 0, 7, 1, 1, sbb); - placeBlockAtCurrentPosition(world, Blocks.double_stone_slab, 0, 11, 2, 3, sbb); - placeBlockAtCurrentPosition(world, Blocks.fence, 0, 11, 3, 3, sbb); - placeBlockAtCurrentPosition(world, Blocks.fence, 0, 11, 4, 3, sbb); -// placeBlockAtCurrentPosition(world, Blocks.torch, 0, 11, 5, 3, sbb); - placeBlockAtCurrentPosition(world, Blocks.double_stone_slab, 0, 11, 1, 4, sbb); - placeBlockAtCurrentPosition(world, Blocks.fence, 0, 11, 2, 4, sbb); - placeBlockAtCurrentPosition(world, Blocks.fence, 0, 11, 3, 4, sbb); - placeBlockAtCurrentPosition(world, Blocks.double_stone_slab, 0, 11, 1, 5, sbb); - placeBlockAtCurrentPosition(world, Blocks.fence, 0, 11, 2, 5, sbb); - - - // staircases rotating around the tower - int rise = 5; -// int numFlights = ((this.height - 3) / rise) - 1; - int numFlights = (highestOpening / rise); - for (int i = 0; i < numFlights; i++) { - makeStairs15flight(world, rand, sbb, 2 + i * rise, 0 + (i * 3), 2); - makeStairs15flight(world, rand, sbb, 2 + i * rise, 2 + (i * 3), 0); - } - - return true; - } - - /** - * Function called by makeStairs7 to place stair blocks - * - * @param height - * @param rotation - */ - protected void makeStairs15flight(World world, Random rand, StructureBoundingBox sbb, int height, int rotation, int meta) { - int temp = this.getCoordBaseMode(); - - this.setCoordBaseMode((this.getCoordBaseMode() + rotation) % 4); - - Block singleSlabBlock = meta == 0 ? Blocks.stone_slab : Blocks.wooden_slab; - Block doubleSlabBlock = meta == 0 ? Blocks.double_stone_slab : Blocks.planks; - - placeBlockAtCurrentPosition(world, singleSlabBlock, meta, 3, 1 + height, 13, sbb); - randomlyPlaceBlock(world, sbb, rand, 0.9F, 4, 1 + height, 13, doubleSlabBlock, meta); - placeBlockAtCurrentPosition(world, singleSlabBlock, meta, 5, 2 + height, 13, sbb); - placeBlockAtCurrentPosition(world, doubleSlabBlock, meta, 6, 2 + height, 13, sbb); - placeBlockAtCurrentPosition(world, singleSlabBlock, meta, 7, 3 + height, 13, sbb); - placeBlockAtCurrentPosition(world, doubleSlabBlock, meta, 8, 3 + height, 13, sbb); - placeBlockAtCurrentPosition(world, singleSlabBlock, meta, 9, 4 + height, 13, sbb); - randomlyPlaceBlock(world, sbb, rand, 0.9F, 10, 4 + height, 13, doubleSlabBlock, meta); - randomlyPlaceBlock(world, sbb, rand, 0.9F, 11, 5 + height, 13, singleSlabBlock, meta); - placeBlockAtCurrentPosition(world, doubleSlabBlock, meta, 12, 5 + height, 13, sbb); - placeBlockAtCurrentPosition(world, doubleSlabBlock, meta, 13, 5 + height, 13, sbb); - - randomlyPlaceBlock(world, sbb, rand, 0.9F, 3, 1 + height, 12, singleSlabBlock, meta); - placeBlockAtCurrentPosition(world, doubleSlabBlock, meta, 4, 1 + height, 12, sbb); - placeBlockAtCurrentPosition(world, singleSlabBlock, meta, 5, 2 + height, 12, sbb); - placeBlockAtCurrentPosition(world, doubleSlabBlock, meta, 6, 2 + height, 12, sbb); - randomlyPlaceBlock(world, sbb, rand, 0.9F, 7, 3 + height, 12, singleSlabBlock, meta); - placeBlockAtCurrentPosition(world, doubleSlabBlock, meta, 8, 3 + height, 12, sbb); - placeBlockAtCurrentPosition(world, singleSlabBlock, meta, 9, 4 + height, 12, sbb); - randomlyPlaceBlock(world, sbb, rand, 0.9F, 10, 4 + height, 12, doubleSlabBlock, meta); - placeBlockAtCurrentPosition(world, singleSlabBlock, meta, 11, 5 + height, 12, sbb); - placeBlockAtCurrentPosition(world, doubleSlabBlock, meta, 12, 5 + height, 12, sbb); - placeBlockAtCurrentPosition(world, doubleSlabBlock, meta, 13, 5 + height, 12, sbb); - - placeBlockAtCurrentPosition(world, doubleSlabBlock, meta, 4, 1 + height, 11, sbb); - placeBlockAtCurrentPosition(world, doubleSlabBlock, meta, 5, 2 + height, 11, sbb); - randomlyPlaceBlock(world, sbb, rand, 0.9F, 6, 2 + height, 11, doubleSlabBlock, meta); - placeBlockAtCurrentPosition(world, doubleSlabBlock, meta, 7, 3 + height, 11, sbb); - randomlyPlaceBlock(world, sbb, rand, 0.9F, 8, 3 + height, 11, doubleSlabBlock, meta); - placeBlockAtCurrentPosition(world, doubleSlabBlock, meta, 9, 4 + height, 11, sbb); - placeBlockAtCurrentPosition(world, doubleSlabBlock, meta, 10, 4 + height, 11, sbb); - placeBlockAtCurrentPosition(world, doubleSlabBlock, meta, 11, 5 + height, 11, sbb); - - placeBlockAtCurrentPosition(world, Blocks.fence, 0, 4, 2 + height, 11, sbb); - placeBlockAtCurrentPosition(world, Blocks.fence, 0, 5, 3 + height, 11, sbb); - placeBlockAtCurrentPosition(world, Blocks.fence, 0, 6, 3 + height, 11, sbb); - placeBlockAtCurrentPosition(world, Blocks.fence, 0, 7, 4 + height, 11, sbb); - placeBlockAtCurrentPosition(world, Blocks.fence, 0, 8, 4 + height, 11, sbb); - placeBlockAtCurrentPosition(world, Blocks.fence, 0, 9, 5 + height, 11, sbb); - placeBlockAtCurrentPosition(world, Blocks.fence, 0, 10, 5 + height, 11, sbb); - placeBlockAtCurrentPosition(world, Blocks.fence, 0, 11, 6 + height, 11, sbb); - - placeBlockAtCurrentPosition(world, Blocks.fence, 0, 4, 3 + height, 11, sbb); - placeBlockAtCurrentPosition(world, Blocks.fence, 0, 6, 4 + height, 11, sbb); - placeBlockAtCurrentPosition(world, Blocks.fence, 0, 8, 5 + height, 11, sbb); - placeBlockAtCurrentPosition(world, Blocks.fence, 0, 10, 6 + height, 11, sbb); - placeBlockAtCurrentPosition(world, Blocks.fence, 0, 11, 7 + height, 11, sbb); - -// placeBlockAtCurrentPosition(world, Blocks.torch, 0, 11, 8 + height, 11, sbb); - - this.setCoordBaseMode(temp); - } - - - - - - - /** - * Makes paintings of the minimum size or larger on the specified wall - */ - protected void generatePaintingsOnWall(World world, Random rand, int howMany, int floorLevel, int direction, int minSize, StructureBoundingBox sbb) { - for (int i = 0; i < howMany; i++) { - // get some random coordinates on the wall in the chunk - ChunkCoordinates pCoords = getRandomWallSpot(rand, floorLevel, direction, sbb); - - // initialize a painting object - EntityPainting painting = new EntityPainting(world, pCoords.posX, pCoords.posY, pCoords.posZ, direction); - painting.art = getPaintingOfSize(rand, minSize); - painting.setDirection(direction); - - // temporary function, make a real bounding box for the painting - - // check if we can fit a painting there - if (checkPainting(world, painting, sbb)) { - // place the painting - //System.out.println("Painting success " + painting.art.title + " at " + painting.xPosition + " , " + painting.yPosition + ", " + painting.zPosition + " : " + painting.field_82332_a); - world.spawnEntityInWorld(painting); - } - else { - //System.out.println("Painting fail!! " + painting.art.title + " at " + painting.xPosition + " , " + painting.yPosition + ", " + painting.zPosition + " : " + painting.field_82332_a); - } - } - } - - /** - * At least one of the painting's parameters must be the specified size or greater - */ - protected EnumArt getPaintingOfSize(Random rand, int minSize) { - ArrayList valid = new ArrayList(); - - for (EnumArt art : EnumArt.values()) { - if (art.sizeX >= minSize || art.sizeY >= minSize) - { - valid.add(art); - } - } - - if (valid.size() > 0) - { - return valid.get(rand.nextInt(valid.size())); - } - else { - return null; - } - } - - /** - * This is similar to EntityPainting.isOnValidSurface, except that it does not check for a solid wall behind the painting. - */ - @SuppressWarnings("unchecked") - protected boolean checkPainting(World world, EntityPainting painting, StructureBoundingBox sbb) { - - if (painting == null) { - return false; - } - - //TODO: this is a temporary workaround to fix the bad painting bounding boxes - - AxisAlignedBB largerBox; - if (painting.hangingDirection == 0 || painting.hangingDirection == 2) { - largerBox = painting.boundingBox.expand(1, 1, 0.06); - } - else { - largerBox = painting.boundingBox.expand(0.06, 1, 1); - } - - if (world.getCollidingBoundingBoxes(painting, largerBox).size() > 0) - { - return false; - } - - List collidingEntities = world.getEntitiesWithinAABBExcludingEntity(painting, largerBox); - - for (Entity entityOnList : collidingEntities) - { - if (entityOnList instanceof EntityHanging) - { - return false; - } - } - - return true; - - - } - - /** - * This returns the real-world coordinates of a possible painting or torch spot on the specified wall of this tower. - */ - protected ChunkCoordinates getRandomWallSpot(Random rand, int floorLevel, int direction, StructureBoundingBox sbb) { - int minX = this.boundingBox.minX + 2; - int maxX = this.boundingBox.maxX - 2; - - int minY = this.boundingBox.minY + floorLevel + 2; - int maxY = this.boundingBox.maxY - 2; - - int minZ = this.boundingBox.minZ + 2; - int maxZ = this.boundingBox.maxZ - 2; - - // constrain the paintings to one wall - // these directions correspond to painting facing directions, not necessarily to the structure orienting directions - if (direction == 0) { - minZ = this.boundingBox.minZ; - maxZ = this.boundingBox.minZ; - } - if (direction == 1) { - maxX = this.boundingBox.maxX; - minX = this.boundingBox.maxX; - } - if (direction == 2) { - maxZ = this.boundingBox.maxZ; - minZ = this.boundingBox.maxZ; - } - if (direction == 3) { - minX = this.boundingBox.minX; - maxX = this.boundingBox.minX; - } - - // try 30 times to get a proper result - for (int i = 0; i < 30; i++) { - int cx = minX + (maxX > minX ? rand.nextInt(maxX - minX) : 0); - int cy = minY + (maxY > minY ? rand.nextInt(maxY - minY) : 0); - int cz = minZ + (maxZ > minZ ? rand.nextInt(maxZ - minZ) : 0); - - if (sbb.isVecInside(cx, cy, cz)) { -// System.out.println("Found a valid random spot on the wall. It's " + cx + ", " + cy + ", " + cz ); - return new ChunkCoordinates(cx, cy, cz); - } - } - - // I guess we didn't get one -// System.out.println("We didn't find a valid random spot on the wall."); - return null; - } - - /** - * This method is for final castle towers actually. - * We need to break up this class into a more abstract tower class and a concrete lich tower class one day - */ - protected void makeGlyphBranches(World world, Random rand, int meta, StructureBoundingBox sbb) { - // pick a random side of the tower - int rotation = rand.nextInt(4); - - // start somewhere in the lower part - int startHeight = rand.nextInt((int) (this.height * 0.66F)); - - // near the middle - int startZ = 3 + rand.nextInt(this.size - 6); - - // make a line all the way down to the foundation - int dx = this.getXWithOffsetAsIfRotated(0, startZ, rotation); - int dz = this.getZWithOffsetAsIfRotated(0, startZ, rotation); - if (sbb.isVecInside(dx, this.boundingBox.minY + 1, dz)) { - for (int dy = this.getYWithOffset(startHeight); dy > 0; dy--) { - if (world.getBlock(dx, dy, dz) == TFBlocks.castleBlock) { - //System.out.println("placing glyph brick over " + world.getBlock(dx, dy, dz)); - world.setBlock(dx, dy, dz, TFBlocks.castleMagic, meta, 2); - } else { - //System.out.println("Stopping glyphs because block is " + world.getBlock(dx, dy, dz)); - //System.out.println("dy = " + dy + " because startHeight = " + startHeight + " and startZ = " + startZ); - break; - } - } - } - - // go left a little - int leftOffset = startZ - (1 + rand.nextInt(3)); - int leftHeight = rand.nextInt(this.height - startHeight); - if (leftOffset >= 0) { - for (int z = startZ; z > leftOffset; z--) { - this.placeBlockRotated(world, TFBlocks.castleMagic, meta, 0, startHeight, z, rotation, sbb); - } - for (int y = startHeight; y < (startHeight + leftHeight); y++) { - this.placeBlockRotated(world, TFBlocks.castleMagic, meta, 0, y, leftOffset, rotation, sbb); - } - - } - - // go right a little - int rightOffset = startZ + (1 + rand.nextInt(3)); - int rightHeight = rand.nextInt(this.height - startHeight); - if (rightOffset < this.size - 1) { - for (int z = startZ; z < rightOffset; z++) { - this.placeBlockRotated(world, TFBlocks.castleMagic, meta, 0, startHeight, z, rotation, sbb); - } - for (int y = startHeight; y < (startHeight + rightHeight); y++) { - this.placeBlockRotated(world, TFBlocks.castleMagic, meta, 0, y, rightOffset, rotation, sbb); - } - - } - } - -} diff --git a/src/main/java/twilightforest/structures/lichtower/TFLichTowerPieces.java b/src/main/java/twilightforest/structures/lichtower/TFLichTowerPieces.java deleted file mode 100644 index e75ace6d1a..0000000000 --- a/src/main/java/twilightforest/structures/lichtower/TFLichTowerPieces.java +++ /dev/null @@ -1,27 +0,0 @@ -package twilightforest.structures.lichtower; - -import net.minecraft.world.gen.structure.MapGenStructureIO; - -public class TFLichTowerPieces { - - public static void registerPieces() - { - MapGenStructureIO.func_143031_a(ComponentTFTowerBeard.class, "TFLTBea"); - MapGenStructureIO.func_143031_a(ComponentTFTowerBeardAttached.class, "TFLTBA"); - MapGenStructureIO.func_143031_a(ComponentTFTowerBridge.class, "TFLTBri"); - MapGenStructureIO.func_143031_a(ComponentTFTowerMain.class, "TFLTMai"); - MapGenStructureIO.func_143031_a(ComponentTFTowerOutbuilding.class, "TFLTOut"); - MapGenStructureIO.func_143031_a(ComponentTFTowerRoof.class, "TFLTRoo"); - MapGenStructureIO.func_143031_a(ComponentTFTowerRoofAttachedSlab.class, "TFLTRAS"); - MapGenStructureIO.func_143031_a(ComponentTFTowerRoofFence.class, "TFLTRF"); - MapGenStructureIO.func_143031_a(ComponentTFTowerRoofGableForwards.class, "TFLTRGF"); - MapGenStructureIO.func_143031_a(ComponentTFTowerRoofPointy.class, "TFLTRP"); - MapGenStructureIO.func_143031_a(ComponentTFTowerRoofPointyOverhang.class, "TFLTRPO"); - MapGenStructureIO.func_143031_a(ComponentTFTowerRoofSlab.class, "TFLTRS"); - MapGenStructureIO.func_143031_a(ComponentTFTowerRoofSlabForwards.class, "TFLTRSF"); - MapGenStructureIO.func_143031_a(ComponentTFTowerRoofStairs.class, "TFLTRSt"); - MapGenStructureIO.func_143031_a(ComponentTFTowerRoofStairsOverhang.class, "TFLTRStO"); - MapGenStructureIO.func_143031_a(ComponentTFTowerWing.class, "TFLTWin"); - - } -} diff --git a/src/main/java/twilightforest/structures/minotaurmaze/ComponentTFMazeCorridor.java b/src/main/java/twilightforest/structures/minotaurmaze/ComponentTFMazeCorridor.java deleted file mode 100644 index 4f81ef7fef..0000000000 --- a/src/main/java/twilightforest/structures/minotaurmaze/ComponentTFMazeCorridor.java +++ /dev/null @@ -1,33 +0,0 @@ -package twilightforest.structures.minotaurmaze; - -import java.util.Random; - -import net.minecraft.init.Blocks; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import twilightforest.structures.StructureTFComponent; - -public class ComponentTFMazeCorridor extends StructureTFComponent { - - public ComponentTFMazeCorridor() { - super(); - // TODO Auto-generated constructor stub - } - - public ComponentTFMazeCorridor(int i, int x, int y, int z, int rotation) { - super(i); - this.coordBaseMode = rotation; - this.boundingBox = new StructureBoundingBox(x, y, z, x + 5, y + 5, z + 5); - } - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - - //arch - this.fillWithMetadataBlocks(world, sbb, 1, 1, 2, 4, 4, 3, Blocks.fence, 0, Blocks.air, 0, false); - this.fillWithAir(world, sbb, 2, 1, 2, 3, 3, 3); - - return true; - } - -} diff --git a/src/main/java/twilightforest/structures/minotaurmaze/ComponentTFMazeCorridorIronFence.java b/src/main/java/twilightforest/structures/minotaurmaze/ComponentTFMazeCorridorIronFence.java deleted file mode 100644 index af1e50c1cb..0000000000 --- a/src/main/java/twilightforest/structures/minotaurmaze/ComponentTFMazeCorridorIronFence.java +++ /dev/null @@ -1,28 +0,0 @@ -package twilightforest.structures.minotaurmaze; - -import java.util.Random; - -import net.minecraft.init.Blocks; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import twilightforest.block.TFBlocks; - -public class ComponentTFMazeCorridorIronFence extends ComponentTFMazeCorridor { - - public ComponentTFMazeCorridorIronFence() { - super(); - // TODO Auto-generated constructor stub - } - - public ComponentTFMazeCorridorIronFence(int i, int x, int y, int z, int rotation) { - super(i, x, y, z, rotation); - } - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - this.fillWithMetadataBlocks(world, sbb, 1, 4, 2, 4, 4, 3, TFBlocks.mazestone, 3, Blocks.air, 0, false); - this.fillWithMetadataBlocks(world, sbb, 1, 1, 2, 4, 3, 3, TFBlocks.mazestone, 2, Blocks.air, 0, false); - this.fillWithBlocks(world, sbb, 2, 1, 2, 3, 3, 3, Blocks.iron_bars, Blocks.air, false); - return true; - } -} diff --git a/src/main/java/twilightforest/structures/minotaurmaze/ComponentTFMazeCorridorRoots.java b/src/main/java/twilightforest/structures/minotaurmaze/ComponentTFMazeCorridorRoots.java deleted file mode 100644 index 7be0426c4b..0000000000 --- a/src/main/java/twilightforest/structures/minotaurmaze/ComponentTFMazeCorridorRoots.java +++ /dev/null @@ -1,58 +0,0 @@ -package twilightforest.structures.minotaurmaze; - -import java.util.Random; - -import net.minecraft.init.Blocks; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import twilightforest.block.BlockTFPlant; -import twilightforest.block.TFBlocks; - -public class ComponentTFMazeCorridorRoots extends ComponentTFMazeCorridor { - - public ComponentTFMazeCorridorRoots() { - super(); - // TODO Auto-generated constructor stub - } - - public ComponentTFMazeCorridorRoots(int i, int x, int y, int z, int rotation) { - super(i, x, y, z, rotation); - } - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - for (int x = 1; x < 5; x++) - { - for (int z = 0; z < 5; z++) - { - int freq = x; - if (rand.nextInt(freq + 2) > 0) - { - int length = rand.nextInt(6); - - //place dirt above ceiling - this.placeBlockAtCurrentPosition(world, Blocks.dirt, 0, x, 6, z, sbb); - - // roots - for (int y = 6 - length; y < 6; y++) - { - this.placeBlockAtCurrentPosition(world, TFBlocks.plant, BlockTFPlant.META_ROOT_STRAND, x, y, z, sbb); - } - - // occasional gravel - if (rand.nextInt(freq + 1) > 1) - { - this.placeBlockAtCurrentPosition(world, Blocks.gravel, 0, x, 1, z, sbb); - - if (rand.nextInt(freq + 1) > 1) - { - this.placeBlockAtCurrentPosition(world, Blocks.gravel, 0, x, 2, z, sbb); - } - } - } - } - } - return true; - } - -} diff --git a/src/main/java/twilightforest/structures/minotaurmaze/ComponentTFMazeCorridorShrooms.java b/src/main/java/twilightforest/structures/minotaurmaze/ComponentTFMazeCorridorShrooms.java deleted file mode 100644 index fcfa5dc29a..0000000000 --- a/src/main/java/twilightforest/structures/minotaurmaze/ComponentTFMazeCorridorShrooms.java +++ /dev/null @@ -1,57 +0,0 @@ -package twilightforest.structures.minotaurmaze; - -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.init.Blocks; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; - -public class ComponentTFMazeCorridorShrooms extends ComponentTFMazeCorridor { - - public ComponentTFMazeCorridorShrooms() { - super(); - // TODO Auto-generated constructor stub - } - - public ComponentTFMazeCorridorShrooms(int i, int x, int y, int z, int rotation) { - super(i, x, y, z, rotation); - } - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - - // mycelium & mushrooms - for (int x = 1; x < 5; x++) - { - for (int z = 0; z < 5; z++) - { - if (rand.nextInt(2) > 0) - { - this.placeBlockAtCurrentPosition(world, Blocks.mycelium, 0, x, 0, z, sbb); - } - if (rand.nextInt(2) > 0) - { - this.placeBlockAtCurrentPosition(world, rand.nextBoolean() ? Blocks.red_mushroom : Blocks.brown_mushroom, 0, x, 1, z, sbb); - } - } - } - - // brackets? - Block mushType = rand.nextBoolean() ? Blocks.red_mushroom_block : Blocks.brown_mushroom_block; - int mushY = rand.nextInt(4) + 1; - int mushZ = rand.nextInt(4) + 1; - this.placeBlockAtCurrentPosition(world, mushType, 15, 1, mushY - 1, mushZ, sbb); - this.fillWithMetadataBlocks(world, sbb, 1, 1, mushZ, 1, mushY, mushZ, mushType, 10, Blocks.air, 0, false); - this.fillWithMetadataBlocks(world, sbb, 1, mushY, mushZ - 1, 2, mushY, mushZ + 1, mushType, 14, Blocks.air, 0, false); - - mushType = mushType == Blocks.brown_mushroom_block ? Blocks.red_mushroom_block : Blocks.brown_mushroom_block; - mushY = rand.nextInt(4) + 1; - mushZ = rand.nextInt(4) + 1; - this.fillWithMetadataBlocks(world, sbb, 4, 1, mushZ, 4, mushY, mushZ, mushType, 10, Blocks.air, 0, false); - this.fillWithMetadataBlocks(world, sbb, 3, mushY, mushZ - 1, 4, mushY, mushZ + 1, mushType, 14, Blocks.air, 0, false); - - - return true; - } -} diff --git a/src/main/java/twilightforest/structures/minotaurmaze/ComponentTFMazeDeadEnd.java b/src/main/java/twilightforest/structures/minotaurmaze/ComponentTFMazeDeadEnd.java deleted file mode 100644 index d7e2598c8a..0000000000 --- a/src/main/java/twilightforest/structures/minotaurmaze/ComponentTFMazeDeadEnd.java +++ /dev/null @@ -1,30 +0,0 @@ -package twilightforest.structures.minotaurmaze; - -import java.util.Random; - -import net.minecraft.init.Blocks; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import twilightforest.structures.StructureTFComponent; - -public class ComponentTFMazeDeadEnd extends StructureTFComponent { - - public ComponentTFMazeDeadEnd() { - super(); - // TODO Auto-generated constructor stub - } - - public ComponentTFMazeDeadEnd(int i, int x, int y, int z, int rotation) { - super(i); - this.coordBaseMode = rotation; - this.boundingBox = new StructureBoundingBox(x, y, z, x + 5, y + 5, z + 5); - - } - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - this.fillWithMetadataBlocks(world, sbb, 1, 1, 0, 4, 4, 0, Blocks.fence, 0, Blocks.air, 0, false); - this.fillWithAir(world, sbb, 2, 1, 0, 3, 3, 0); - return true; - } -} diff --git a/src/main/java/twilightforest/structures/minotaurmaze/ComponentTFMazeDeadEndChest.java b/src/main/java/twilightforest/structures/minotaurmaze/ComponentTFMazeDeadEndChest.java deleted file mode 100644 index 5c6467ae21..0000000000 --- a/src/main/java/twilightforest/structures/minotaurmaze/ComponentTFMazeDeadEndChest.java +++ /dev/null @@ -1,51 +0,0 @@ -package twilightforest.structures.minotaurmaze; - -import java.util.Random; - -import net.minecraft.init.Blocks; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import twilightforest.TFTreasure; -import twilightforest.block.TFBlocks; - -public class ComponentTFMazeDeadEndChest extends ComponentTFMazeDeadEnd { - - public ComponentTFMazeDeadEndChest() { - super(); - // TODO Auto-generated constructor stub - } - - public ComponentTFMazeDeadEndChest(int i, int x, int y, int z, int rotation) { - super(i, x, y, z, rotation); - - // specify a non-existant high spawn list value to stop actual monster spawns - this.spawnListIndex = Integer.MAX_VALUE; - } - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - //super.addComponentParts(world, rand, sbb); - - // dais - this.placeBlockAtCurrentPosition(world, Blocks.planks, 0, 2, 1, 4, sbb); - this.placeBlockAtCurrentPosition(world, Blocks.planks, 0, 3, 1, 4, sbb); - this.placeBlockAtCurrentPosition(world, Blocks.oak_stairs, getStairMeta(1), 2, 1, 3, sbb); - this.placeBlockAtCurrentPosition(world, Blocks.oak_stairs, getStairMeta(1), 3, 1, 3, sbb); - - // chest - this.placeBlockAtCurrentPosition(world, Blocks.chest, 0, 2, 2, 4, sbb); - this.placeTreasureAtCurrentPosition(world, rand, 3, 2, 4, TFTreasure.labyrinth_deadend, sbb); - -// // torches -// this.placeBlockAtCurrentPosition(world, Blocks.torch, 0, 1, 3, 4, sbb); -// this.placeBlockAtCurrentPosition(world, Blocks.torch, 0, 4, 3, 4, sbb); - - // doorway w/ bars - this.fillWithMetadataBlocks(world, sbb, 1, 1, 0, 4, 3, 1, TFBlocks.mazestone, 2, Blocks.air, 0, false); - this.fillWithMetadataBlocks(world, sbb, 1, 4, 0, 4, 4, 1, TFBlocks.mazestone, 3, Blocks.air, 0, false); - this.fillWithBlocks(world, sbb, 2, 1, 0, 3, 3, 1, Blocks.iron_bars, Blocks.air, false); - - return true; - } - -} diff --git a/src/main/java/twilightforest/structures/minotaurmaze/ComponentTFMazeDeadEndFountain.java b/src/main/java/twilightforest/structures/minotaurmaze/ComponentTFMazeDeadEndFountain.java deleted file mode 100644 index e8866299d6..0000000000 --- a/src/main/java/twilightforest/structures/minotaurmaze/ComponentTFMazeDeadEndFountain.java +++ /dev/null @@ -1,39 +0,0 @@ -package twilightforest.structures.minotaurmaze; - -import java.util.Random; - -import net.minecraft.init.Blocks; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import twilightforest.block.TFBlocks; - -public class ComponentTFMazeDeadEndFountain extends ComponentTFMazeDeadEnd { - - public ComponentTFMazeDeadEndFountain() { - super(); - // TODO Auto-generated constructor stub - } - - public ComponentTFMazeDeadEndFountain(int i, int x, int y, int z, int rotation) { - super(i, x, y, z, rotation); - } - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - // normal doorway - super.addComponentParts(world, rand, sbb); - - // back wall brick - this.fillWithMetadataBlocks(world, sbb, 1, 1, 4, 4, 4, 4, TFBlocks.mazestone, 1, Blocks.air, 0, false); - - // water - this.placeBlockAtCurrentPosition(world, Blocks.flowing_water, 0, 2, 3, 4, sbb); - this.placeBlockAtCurrentPosition(world, Blocks.flowing_water, 0, 3, 3, 4, sbb); - - // receptacle - this.placeBlockAtCurrentPosition(world, Blocks.air, 0, 2, 0, 3, sbb); - this.placeBlockAtCurrentPosition(world, Blocks.air, 0, 3, 0, 3, sbb); - - return true; - } -} diff --git a/src/main/java/twilightforest/structures/minotaurmaze/ComponentTFMazeDeadEndFountainLava.java b/src/main/java/twilightforest/structures/minotaurmaze/ComponentTFMazeDeadEndFountainLava.java deleted file mode 100644 index 26f35d70e0..0000000000 --- a/src/main/java/twilightforest/structures/minotaurmaze/ComponentTFMazeDeadEndFountainLava.java +++ /dev/null @@ -1,37 +0,0 @@ -package twilightforest.structures.minotaurmaze; - -import java.util.Random; - -import net.minecraft.init.Blocks; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; - -public class ComponentTFMazeDeadEndFountainLava extends ComponentTFMazeDeadEndFountain { - - public ComponentTFMazeDeadEndFountainLava() { - super(); - // TODO Auto-generated constructor stub - } - - public ComponentTFMazeDeadEndFountainLava(int i, int x, int y, int z, int rotation) { - super(i, x, y, z, rotation); - } - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - // normal fountain - super.addComponentParts(world, rand, sbb); - - // remove water - this.placeBlockAtCurrentPosition(world, Blocks.air, 0, 2, 3, 4, sbb); - this.placeBlockAtCurrentPosition(world, Blocks.air, 0, 3, 3, 4, sbb); - - // lava instead of water - this.placeBlockAtCurrentPosition(world, Blocks.flowing_lava, 0, 2, 3, 4, sbb); - this.placeBlockAtCurrentPosition(world, Blocks.flowing_lava, 0, 3, 3, 4, sbb); - - return true; - } - - -} diff --git a/src/main/java/twilightforest/structures/minotaurmaze/ComponentTFMazeDeadEndPainting.java b/src/main/java/twilightforest/structures/minotaurmaze/ComponentTFMazeDeadEndPainting.java deleted file mode 100644 index 9f8a4da181..0000000000 --- a/src/main/java/twilightforest/structures/minotaurmaze/ComponentTFMazeDeadEndPainting.java +++ /dev/null @@ -1,38 +0,0 @@ -package twilightforest.structures.minotaurmaze; - -import java.util.Random; - -import net.minecraft.init.Blocks; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; - -public class ComponentTFMazeDeadEndPainting extends ComponentTFMazeDeadEnd { - - public ComponentTFMazeDeadEndPainting() { - super(); - // TODO Auto-generated constructor stub - } - - public ComponentTFMazeDeadEndPainting(int i, int x, int y, int z, int rotation) { - super(i, x, y, z, rotation); - } - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - // normal doorway - super.addComponentParts(world, rand, sbb); - - // torches - this.placeBlockAtCurrentPosition(world, Blocks.torch, 0, 1, 3, 3, sbb); - this.placeBlockAtCurrentPosition(world, Blocks.torch, 0, 4, 3, 3, sbb); - -// // painting -// EntityPainting painting = new EntityPainting(world, pCoords.posX, pCoords.posY, pCoords.posZ, this.get); -// painting.art = getPaintingOfSize(rand, minSize); -// painting.setDirection(direction); -// -// world.spawnEntityInWorld(painting); - - return true; - } -} diff --git a/src/main/java/twilightforest/structures/minotaurmaze/ComponentTFMazeDeadEndRoots.java b/src/main/java/twilightforest/structures/minotaurmaze/ComponentTFMazeDeadEndRoots.java deleted file mode 100644 index 2d51e5d431..0000000000 --- a/src/main/java/twilightforest/structures/minotaurmaze/ComponentTFMazeDeadEndRoots.java +++ /dev/null @@ -1,60 +0,0 @@ -package twilightforest.structures.minotaurmaze; - -import java.util.Random; - -import net.minecraft.init.Blocks; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import twilightforest.block.BlockTFPlant; -import twilightforest.block.TFBlocks; - -public class ComponentTFMazeDeadEndRoots extends ComponentTFMazeDeadEnd { - - public ComponentTFMazeDeadEndRoots() { - super(); - // TODO Auto-generated constructor stub - } - - public ComponentTFMazeDeadEndRoots(int i, int x, int y, int z, int rotation) { - super(i, x, y, z, rotation); - } - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - // no door - for (int x = 1; x < 5; x++) - { - for (int z = 0; z < 5; z++) - { - // as we go +z, there are more vines - if (rand.nextInt(z + 2) > 0) - { - int length = rand.nextInt(6); - - //place dirt above ceiling - this.placeBlockAtCurrentPosition(world, Blocks.dirt, 0, x, 6, z, sbb); - - // roots - for (int y = 6 - length; y < 6; y++) - { - this.placeBlockAtCurrentPosition(world, TFBlocks.plant, BlockTFPlant.META_ROOT_STRAND, x, y, z, sbb); - } - - // occasional gravel - if (rand.nextInt(z + 1) > 1) - { - this.placeBlockAtCurrentPosition(world, Blocks.gravel, 0, x, 1, z, sbb); - - if (rand.nextInt(z + 1) > 1) - { - this.placeBlockAtCurrentPosition(world, Blocks.gravel, 0, x, 2, z, sbb); - } - } - } - } - } - - return true; - } -} - diff --git a/src/main/java/twilightforest/structures/minotaurmaze/ComponentTFMazeDeadEndShrooms.java b/src/main/java/twilightforest/structures/minotaurmaze/ComponentTFMazeDeadEndShrooms.java deleted file mode 100644 index f3beedb106..0000000000 --- a/src/main/java/twilightforest/structures/minotaurmaze/ComponentTFMazeDeadEndShrooms.java +++ /dev/null @@ -1,63 +0,0 @@ -package twilightforest.structures.minotaurmaze; - -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.init.Blocks; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; - -public class ComponentTFMazeDeadEndShrooms extends ComponentTFMazeDeadEndRoots { - - public ComponentTFMazeDeadEndShrooms() { - super(); - // TODO Auto-generated constructor stub - } - - public ComponentTFMazeDeadEndShrooms(int i, int x, int y, int z, int rotation) { - super(i, x, y, z, rotation); - } - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - // no door - - // mycelium & mushrooms going back - for (int x = 1; x < 5; x++) - { - for (int z = 0; z < 5; z++) - { - if (rand.nextInt(z + 2) > 0) - { - this.placeBlockAtCurrentPosition(world, Blocks.mycelium, 0, x, 0, z, sbb); - } - if (rand.nextInt(z + 2) > 0) - { - this.placeBlockAtCurrentPosition(world, rand.nextBoolean() ? Blocks.red_mushroom : Blocks.brown_mushroom, 0, x, 1, z, sbb); - } - } - } - - // brackets? - Block mushType = rand.nextBoolean() ? Blocks.red_mushroom_block : Blocks.brown_mushroom_block; - int mushY = rand.nextInt(4) + 1; - int mushZ = rand.nextInt(3) + 1; - this.placeBlockAtCurrentPosition(world, mushType, 15, 1, mushY - 1, mushZ, sbb); - this.fillWithMetadataBlocks(world, sbb, 1, 1, mushZ, 1, mushY, mushZ, mushType, 10, Blocks.air, 0, false); - this.fillWithMetadataBlocks(world, sbb, 1, mushY, mushZ - 1, 2, mushY, mushZ + 1, mushType, 14, Blocks.air, 0, false); - - mushType = mushType == Blocks.brown_mushroom_block ? Blocks.red_mushroom_block : Blocks.brown_mushroom_block; - mushY = rand.nextInt(4) + 1; - mushZ = rand.nextInt(3) + 1; - this.fillWithMetadataBlocks(world, sbb, 4, 1, mushZ, 4, mushY, mushZ, mushType, 10, Blocks.air, 0, false); - this.fillWithMetadataBlocks(world, sbb, 3, mushY, mushZ - 1, 4, mushY, mushZ + 1, mushType, 14, Blocks.air, 0, false); - - mushType = rand.nextBoolean() ? Blocks.red_mushroom_block : Blocks.brown_mushroom_block; - mushY = rand.nextInt(4) + 1; - int mushX = rand.nextInt(3) + 2; - this.fillWithMetadataBlocks(world, sbb, mushX, 1, 4, mushX, mushY, 4, mushType, 10, Blocks.air, 0, false); - this.fillWithMetadataBlocks(world, sbb, mushX - 1, mushY, 3, mushX + 1, mushY, 4, mushType, 14, Blocks.air, 0, false); - - return true; - } -} diff --git a/src/main/java/twilightforest/structures/minotaurmaze/ComponentTFMazeDeadEndTorches.java b/src/main/java/twilightforest/structures/minotaurmaze/ComponentTFMazeDeadEndTorches.java deleted file mode 100644 index 332f084168..0000000000 --- a/src/main/java/twilightforest/structures/minotaurmaze/ComponentTFMazeDeadEndTorches.java +++ /dev/null @@ -1,33 +0,0 @@ -package twilightforest.structures.minotaurmaze; - -import java.util.Random; - -import net.minecraft.init.Blocks; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; - -public class ComponentTFMazeDeadEndTorches extends ComponentTFMazeDeadEnd { - - public ComponentTFMazeDeadEndTorches() { - super(); - // TODO Auto-generated constructor stub - } - - public ComponentTFMazeDeadEndTorches(int i, int x, int y, int z, int rotation) { - super(i, x, y, z, rotation); - } - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - // normal doorway - super.addComponentParts(world, rand, sbb); - - // torches! - this.fillWithMetadataBlocks(world, sbb, 2, 1, 4, 3, 4, 4, Blocks.torch, 0, Blocks.air, 0, false); - this.fillWithMetadataBlocks(world, sbb, 1, 1, 1, 1, 4, 4, Blocks.torch, 0, Blocks.air, 0, false); - this.fillWithMetadataBlocks(world, sbb, 4, 1, 1, 4, 4, 4, Blocks.torch, 0, Blocks.air, 0, false); - - - return true; - } -} diff --git a/src/main/java/twilightforest/structures/minotaurmaze/ComponentTFMazeDeadEndTrappedChest.java b/src/main/java/twilightforest/structures/minotaurmaze/ComponentTFMazeDeadEndTrappedChest.java deleted file mode 100644 index 337f79d870..0000000000 --- a/src/main/java/twilightforest/structures/minotaurmaze/ComponentTFMazeDeadEndTrappedChest.java +++ /dev/null @@ -1,55 +0,0 @@ -package twilightforest.structures.minotaurmaze; - -import java.util.Random; - -import net.minecraft.init.Blocks; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; - -public class ComponentTFMazeDeadEndTrappedChest extends ComponentTFMazeDeadEndChest { - - public ComponentTFMazeDeadEndTrappedChest() { - super(); - // TODO Auto-generated constructor stub - } - - public ComponentTFMazeDeadEndTrappedChest(int i, int x, int y, int z, int rotation) { - super(i, x, y, z, rotation); - } - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - // normal chest room - super.addComponentParts(world, rand, sbb); - - // add tripwire hooks - this.placeBlockAtCurrentPosition(world, Blocks.tripwire_hook, getHookMeta(3), 1, 1, 2, sbb); - this.placeBlockAtCurrentPosition(world, Blocks.tripwire_hook, getHookMeta(1), 4, 1, 2, sbb); - - // add string - this.placeBlockAtCurrentPosition(world, Blocks.tripwire, 0, 2, 1, 2, sbb); - this.placeBlockAtCurrentPosition(world, Blocks.tripwire, 0, 3, 1, 2, sbb); - - // TNT! - this.placeBlockAtCurrentPosition(world, Blocks.tnt, 0, 0, 0, 2, sbb); - this.placeBlockAtCurrentPosition(world, Blocks.air, 0, 0, -1, 2, sbb); - this.placeBlockAtCurrentPosition(world, Blocks.air, 0, 1, -1, 2, sbb); - this.placeBlockAtCurrentPosition(world, Blocks.tnt, 0, 2, 0, 4, sbb); - this.placeBlockAtCurrentPosition(world, Blocks.tnt, 0, 3, 0, 4, sbb); - this.placeBlockAtCurrentPosition(world, Blocks.tnt, 0, 2, 0, 3, sbb); - this.placeBlockAtCurrentPosition(world, Blocks.tnt, 0, 3, 0, 3, sbb); - - return true; - } - - /** - * Gets the metadata necessary to make stairs facing the proper direction. - * - * @param dir - * @return - */ - protected int getHookMeta(int dir) - { - return(this.getCoordBaseMode() + dir) % 4; - } -} diff --git a/src/main/java/twilightforest/structures/minotaurmaze/ComponentTFMazeEntranceShaft.java b/src/main/java/twilightforest/structures/minotaurmaze/ComponentTFMazeEntranceShaft.java deleted file mode 100644 index e14d3b6db8..0000000000 --- a/src/main/java/twilightforest/structures/minotaurmaze/ComponentTFMazeEntranceShaft.java +++ /dev/null @@ -1,101 +0,0 @@ -package twilightforest.structures.minotaurmaze; - -import java.util.List; -import java.util.Random; - -import net.minecraft.init.Blocks; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import net.minecraft.world.gen.structure.StructureComponent; -import twilightforest.block.TFBlocks; -import twilightforest.structures.StructureTFComponent; - -public class ComponentTFMazeEntranceShaft extends StructureTFComponent { - - public ComponentTFMazeEntranceShaft() { - super(); - // TODO Auto-generated constructor stub - } - - - - private int averageGroundLevel = -1; - - public ComponentTFMazeEntranceShaft(int i, Random rand, int x, int y, int z) { - super(i); - this.coordBaseMode = rand.nextInt(4); - - this.boundingBox = new StructureBoundingBox(x, y, z, x + 6 - 1, y + 14, z + 6 - 1); - } - - /** - * Initiates construction of the Structure Component picked, at the current Location of StructGen - */ - @Override - public void buildComponent(StructureComponent structurecomponent, List list, Random random) { - ; - } - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - if (this.averageGroundLevel < 0) - { - this.averageGroundLevel = this.getAverageGroundLevel(world, sbb); - - if (this.averageGroundLevel < 0) - { - return true; - } - - this.boundingBox.offset(0, this.averageGroundLevel - this.boundingBox.maxY + 15 - 1, 0); - } - - - this.fillWithMetadataBlocks(world, sbb, 0, 0 - 10, 0, 5, 0 + 30, 5, TFBlocks.mazestone, 1, Blocks.air, 0, true); - this.fillWithAir(world, sbb, 1, 0 - 10, 1, 4, 0 + 30, 4); - - //System.out.println("Drawing entrance"); - - int var8 = this.getXWithOffset(0, 0); - int var9 = this.getYWithOffset(0); - int var10 = this.getZWithOffset(0, 0); - - //System.out.println("Drawing entrance at " + var8 + ", " + var9 + ", " + var10); - - - return true; - } - - - - /** - * Discover the y coordinate that will serve as the ground level of the supplied BoundingBox. (A median of all the - * levels in the BB's horizontal rectangle). - */ - protected int getAverageGroundLevel(World par1World, StructureBoundingBox par2StructureBoundingBox) - { - int var3 = 0; - int var4 = 0; - - for (int var5 = this.boundingBox.minZ; var5 <= this.boundingBox.maxZ; ++var5) - { - for (int var6 = this.boundingBox.minX; var6 <= this.boundingBox.maxX; ++var6) - { - if (par2StructureBoundingBox.isVecInside(var6, 64, var5)) - { - var3 += Math.max(par1World.getTopSolidOrLiquidBlock(var6, var5), par1World.provider.getAverageGroundLevel()); - ++var4; - } - } - } - - if (var4 == 0) - { - return -1; - } - else - { - return var3 / var4; - } - } -} diff --git a/src/main/java/twilightforest/structures/minotaurmaze/ComponentTFMazeMound.java b/src/main/java/twilightforest/structures/minotaurmaze/ComponentTFMazeMound.java deleted file mode 100644 index 2c1db9c4a1..0000000000 --- a/src/main/java/twilightforest/structures/minotaurmaze/ComponentTFMazeMound.java +++ /dev/null @@ -1,133 +0,0 @@ -package twilightforest.structures.minotaurmaze; - -import java.util.List; -import java.util.Random; - -import net.minecraft.init.Blocks; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import net.minecraft.world.gen.structure.StructureComponent; -import twilightforest.structures.StructureTFComponent; - -public class ComponentTFMazeMound extends StructureTFComponent { - - public ComponentTFMazeMound() { - super(); - // TODO Auto-generated constructor stub - } - - - public static final int DIAMETER = 35; - private int averageGroundLevel = -1; - - private ComponentTFMazeUpperEntrance mazeAbove; - - public ComponentTFMazeMound(int i, Random rand, int x, int y, int z) { - super(i); - this.coordBaseMode = rand.nextInt(4); - - this.boundingBox = new StructureBoundingBox(x, y, z, x + DIAMETER, y + 8, z + DIAMETER); - } - - /** - * Initiates construction of the Structure Component picked, at the current Location of StructGen - */ - @Override - public void buildComponent(StructureComponent structurecomponent, List list, Random random) { - super.buildComponent(structurecomponent, list, random); - - // add aboveground maze entrance building - mazeAbove = new ComponentTFMazeUpperEntrance(3, random, boundingBox.minX + 10, boundingBox.minY + 0, boundingBox.minZ + 10); - list.add(mazeAbove); - mazeAbove.buildComponent(this, list, random); - } - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - - if (this.averageGroundLevel < 0) - { - this.averageGroundLevel = this.getAverageGroundLevel(world, sbb); - - if (this.averageGroundLevel < 0) - { - return true; - } - - int offset = this.averageGroundLevel - this.boundingBox.maxY + 8 - 1; - - this.boundingBox.offset(0, offset, 0); - - if (this.mazeAbove != null) - { - mazeAbove.getBoundingBox().offset(0, offset, 0); - } - } - - - //this.fillWithBlocks(world, sbb, 0, 0, 0, 25, 8, 25, Blocks.dirt, 0, false); - - for (int x = 0; x < DIAMETER; x++) - { - for (int z = 0; z < DIAMETER; z++) - { - int cx = x - DIAMETER / 2; - int cz = z - DIAMETER / 2; - - int dist = (int) Math.sqrt(cx * cx + cz * cz); - int hheight = (int) (Math.cos((double)dist / DIAMETER * Math.PI) * (DIAMETER / 3)); - - // leave a hole in the middle - if (!(cx <= 2 && cx >= -1 && cz <= 2 && cz >= -1) && ((!(cx <= 2 && cx >= -1) && !(cz <= 2 && cz >= -1)) || hheight > 6)) - { - this.placeBlockAtCurrentPosition(world, Blocks.grass, 0, x, hheight, z, sbb); - - // only fill to the bottom when we're not in the entrances - if (!(cx <= 2 && cx >= -1) && !(cz <= 2 && cz >= -1)) - { - this.func_151554_b(world, Blocks.dirt, 0, x, hheight - 1, z, sbb); - } - else if (hheight > 6) - { - this.fillWithBlocks(world, sbb, x, 6, z, x, hheight - 1, z, Blocks.dirt, Blocks.air, false); - } - } - } - } - - return true; - } - - - /** - * Discover the y coordinate that will serve as the ground level of the supplied BoundingBox. (A median of all the - * levels in the BB's horizontal rectangle). - */ - protected int getAverageGroundLevel(World par1World, StructureBoundingBox par2StructureBoundingBox) - { - int totalHeight = 0; - int totalMeasures = 0; - - for (int var5 = this.boundingBox.minZ; var5 <= this.boundingBox.maxZ; ++var5) - { - for (int var6 = this.boundingBox.minX; var6 <= this.boundingBox.maxX; ++var6) - { - if (par2StructureBoundingBox.isVecInside(var6, 64, var5)) - { - totalHeight += Math.max(par1World.getTopSolidOrLiquidBlock(var6, var5), par1World.provider.getAverageGroundLevel()); - ++totalMeasures; - } - } - } - - if (totalMeasures == 0) - { - return -1; - } - else - { - return totalHeight / totalMeasures; - } - } - -} diff --git a/src/main/java/twilightforest/structures/minotaurmaze/ComponentTFMazeMushRoom.java b/src/main/java/twilightforest/structures/minotaurmaze/ComponentTFMazeMushRoom.java deleted file mode 100644 index cdd98d95f1..0000000000 --- a/src/main/java/twilightforest/structures/minotaurmaze/ComponentTFMazeMushRoom.java +++ /dev/null @@ -1,102 +0,0 @@ -package twilightforest.structures.minotaurmaze; - -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.init.Blocks; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; - -public class ComponentTFMazeMushRoom extends ComponentTFMazeRoom { - - public ComponentTFMazeMushRoom() { - super(); - // TODO Auto-generated constructor stub - } - - - public ComponentTFMazeMushRoom(int i, Random rand, int x, int y, int z) { - super(i, rand, x, y, z); - - this.coordBaseMode = 0; // let's just make this easy on us? - } - - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - super.addComponentParts(world, rand, sbb); - - for (int x = 1; x < 14; x++) - { - for (int z = 1; z < 14; z++) - { - // calculate distance from middle - int dist = (int) Math.round(7 / Math.sqrt((7.5 - x) * (7.5 - x) + (7.5 - z) * (7.5 - z))); - - // make part of the floor mycelium - if (rand.nextInt(dist + 1) > 0) - { - this.placeBlockAtCurrentPosition(world, Blocks.mycelium, 0, x, 0, z, sbb); - } - // add small mushrooms all over - if (rand.nextInt(dist) > 0) - { - this.placeBlockAtCurrentPosition(world, rand.nextBoolean() ? Blocks.red_mushroom : Blocks.brown_mushroom, 0, x, 1, z, sbb); - } - } - } - - // add our medium mushrooms - makeMediumMushroom(world, sbb, 5, 2, 9, Blocks.red_mushroom_block); - makeMediumMushroom(world, sbb, 5, 3, 9, Blocks.red_mushroom_block); - makeMediumMushroom(world, sbb, 9, 2, 5, Blocks.red_mushroom_block); - makeMediumMushroom(world, sbb, 6, 3, 4, Blocks.brown_mushroom_block); - makeMediumMushroom(world, sbb, 10, 1, 9, Blocks.brown_mushroom_block); - - // bracket mushrooms on the wall - this.placeBlockAtCurrentPosition(world, Blocks.red_mushroom_block, 15, 1, 2, 1, sbb); - this.placeBlockAtCurrentPosition(world, Blocks.red_mushroom_block, 5, 1, 3, 1, sbb); - this.placeBlockAtCurrentPosition(world, Blocks.red_mushroom_block, 9, 2, 3, 1, sbb); - this.placeBlockAtCurrentPosition(world, Blocks.red_mushroom_block, 9, 1, 3, 2, sbb); - - this.placeBlockAtCurrentPosition(world, Blocks.brown_mushroom_block, 15, 14, 3, 1, sbb); - this.placeBlockAtCurrentPosition(world, Blocks.brown_mushroom_block, 5, 14, 4, 1, sbb); - this.placeBlockAtCurrentPosition(world, Blocks.brown_mushroom_block, 7, 13, 4, 1, sbb); - this.placeBlockAtCurrentPosition(world, Blocks.brown_mushroom_block, 7, 14, 4, 2, sbb); - - this.placeBlockAtCurrentPosition(world, Blocks.brown_mushroom_block, 15, 1, 1, 14, sbb); - this.placeBlockAtCurrentPosition(world, Blocks.brown_mushroom_block, 5, 1, 2, 14, sbb); - this.placeBlockAtCurrentPosition(world, Blocks.brown_mushroom_block, 3, 2, 2, 14, sbb); - this.placeBlockAtCurrentPosition(world, Blocks.brown_mushroom_block, 3, 1, 2, 13, sbb); - - this.placeBlockAtCurrentPosition(world, Blocks.brown_mushroom_block, 5, 14, 1, 14, sbb); - this.placeBlockAtCurrentPosition(world, Blocks.brown_mushroom_block, 1, 13, 1, 14, sbb); - this.placeBlockAtCurrentPosition(world, Blocks.brown_mushroom_block, 1, 14, 1, 13, sbb); - - // mushroom ceiling spots? - - return true; - } - - /** - * Make a 3x3 square mushroom centered on the specified coords. - */ - private void makeMediumMushroom(World world, StructureBoundingBox sbb, int mx, int my, int mz, Block redMushroomBlock) { - // cap - this.placeBlockAtCurrentPosition(world, redMushroomBlock, 5, mx + 0, my, mz + 0, sbb); - this.placeBlockAtCurrentPosition(world, redMushroomBlock, 6, mx + 1, my, mz + 0, sbb); - this.placeBlockAtCurrentPosition(world, redMushroomBlock, 9, mx + 1, my, mz + 1, sbb); - this.placeBlockAtCurrentPosition(world, redMushroomBlock, 8, mx + 0, my, mz + 1, sbb); - this.placeBlockAtCurrentPosition(world, redMushroomBlock, 7, mx - 1, my, mz + 1, sbb); - this.placeBlockAtCurrentPosition(world, redMushroomBlock, 4, mx - 1, my, mz + 0, sbb); - this.placeBlockAtCurrentPosition(world, redMushroomBlock, 1, mx - 1, my, mz - 1, sbb); - this.placeBlockAtCurrentPosition(world, redMushroomBlock, 2, mx + 0, my, mz - 1, sbb); - this.placeBlockAtCurrentPosition(world, redMushroomBlock, 3, mx + 1, my, mz - 1, sbb); - - // stem - for (int y = 1; y < my; y++) - { - this.placeBlockAtCurrentPosition(world, redMushroomBlock, 10, mx + 0, y, mz + 0, sbb); - } - } -} diff --git a/src/main/java/twilightforest/structures/minotaurmaze/ComponentTFMazeRoom.java b/src/main/java/twilightforest/structures/minotaurmaze/ComponentTFMazeRoom.java deleted file mode 100644 index 89d7b84d3c..0000000000 --- a/src/main/java/twilightforest/structures/minotaurmaze/ComponentTFMazeRoom.java +++ /dev/null @@ -1,66 +0,0 @@ -package twilightforest.structures.minotaurmaze; - -import java.util.List; -import java.util.Random; - -import net.minecraft.init.Blocks; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import net.minecraft.world.gen.structure.StructureComponent; -import twilightforest.block.TFBlocks; -import twilightforest.structures.StructureTFComponent; - -public class ComponentTFMazeRoom extends StructureTFComponent { - - public ComponentTFMazeRoom() { - super(); - } - - public ComponentTFMazeRoom(int i, Random rand, int x, int y, int z) { - super(i); - this.coordBaseMode = rand.nextInt(4); - - this.boundingBox = new StructureBoundingBox(x, y, z, x + 15, y + 4, z + 15); - } - - /** - * Initiates construction of the Structure Component picked, at the current Location of StructGen - */ - @Override - public void buildComponent(StructureComponent structurecomponent, List list, Random random) { - ; - } - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - // floor border - fillWithMetadataBlocks(world, sbb, 1, 0, 1, 14, 0, 14, TFBlocks.mazestone, 7, Blocks.air, 0, true); - fillWithMetadataBlocks(world, sbb, 2, 0, 2, 13, 0, 13, TFBlocks.mazestone, 6, Blocks.air, 0, true); - - // doorways - if (this.getBlockAtCurrentPosition(world, 7, 1, 0, sbb) == Blocks.air) - { - fillWithBlocks(world, sbb, 6, 1, 0, 9, 4, 0, Blocks.fence, Blocks.air, false); - fillWithAir(world, sbb, 7, 1, 0, 8, 3, 0); - } - - if (this.getBlockAtCurrentPosition(world, 7, 1, 15, sbb) == Blocks.air) - { - fillWithBlocks(world, sbb, 6, 1, 15, 9, 4, 15, Blocks.fence, Blocks.air, false); - fillWithAir(world, sbb, 7, 1, 15, 8, 3, 15); - } - - if (this.getBlockAtCurrentPosition(world, 0, 1, 7, sbb) == Blocks.air) - { - fillWithBlocks(world, sbb, 0, 1, 6, 0, 4, 9, Blocks.fence, Blocks.air, false); - fillWithAir(world, sbb, 0, 1, 7, 0, 3, 8); - } - - if (this.getBlockAtCurrentPosition(world, 15, 1, 7, sbb) == Blocks.air) - { - fillWithBlocks(world, sbb, 15, 1, 6, 15, 4, 9, Blocks.fence, Blocks.air, false); - fillWithAir(world, sbb, 15, 1, 7, 15, 3, 8); - } - return true; - } -} diff --git a/src/main/java/twilightforest/structures/minotaurmaze/ComponentTFMazeRoomBoss.java b/src/main/java/twilightforest/structures/minotaurmaze/ComponentTFMazeRoomBoss.java deleted file mode 100644 index e117aa1e45..0000000000 --- a/src/main/java/twilightforest/structures/minotaurmaze/ComponentTFMazeRoomBoss.java +++ /dev/null @@ -1,125 +0,0 @@ -package twilightforest.structures.minotaurmaze; - -import java.util.Random; - -import net.minecraft.init.Blocks; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import twilightforest.TFTreasure; -import twilightforest.entity.boss.EntityTFMinoshroom; - -public class ComponentTFMazeRoomBoss extends ComponentTFMazeRoom { - - - public ComponentTFMazeRoomBoss() { - super(); - // TODO Auto-generated constructor stub - } - - - private boolean taurPlaced = false; - - - public ComponentTFMazeRoomBoss(int i, Random rand, int x, int y, int z) { - super(i, rand, x, y, z); - } - - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - // doorways - if (this.getBlockAtCurrentPosition(world, 7, 1, 0, sbb) == Blocks.air) - { - fillWithBlocks(world, sbb, 6, 1, 0, 9, 4, 0, Blocks.fence, Blocks.air, false); - } - - if (this.getBlockAtCurrentPosition(world, 7, 1, 15, sbb) == Blocks.air) - { - fillWithBlocks(world, sbb, 6, 1, 15, 9, 4, 15, Blocks.fence, Blocks.air, false); - } - - if (this.getBlockAtCurrentPosition(world, 0, 1, 7, sbb) == Blocks.air) - { - fillWithBlocks(world, sbb, 0, 1, 6, 0, 4, 9, Blocks.fence, Blocks.air, false); - } - - if (this.getBlockAtCurrentPosition(world, 15, 1, 7, sbb) == Blocks.air) - { - fillWithBlocks(world, sbb, 15, 1, 6, 15, 4, 9, Blocks.fence, Blocks.air, false); - } - - // mycelium / small mushrooms on floor - for (int x = 1; x < 14; x++) - { - for (int z = 1; z < 14; z++) - { - // calculate distance from middle - int dist = (int) Math.round(7 / Math.sqrt((7.5 - x) * (7.5 - x) + (7.5 - z) * (7.5 - z))); - boolean mycelium = rand.nextInt(dist + 1) > 0; - boolean mushroom = rand.nextInt(dist) > 0; - boolean mushRed = rand.nextBoolean(); - - // make part of the floor mycelium - if (mycelium) - { - this.placeBlockAtCurrentPosition(world, Blocks.mycelium, 0, x, 0, z, sbb); - } - // add small mushrooms all over - if (mushroom) - { - this.placeBlockAtCurrentPosition(world, mushRed ? Blocks.red_mushroom : Blocks.brown_mushroom, 0, x, 1, z, sbb); - } - } - } - - // mushroom chest shelves in corner - fillWithMetadataBlocks(world, sbb, 1, 1, 1, 3, 1, 3, Blocks.red_mushroom_block, 14, Blocks.air, 0, false); - fillWithMetadataBlocks(world, sbb, 1, 2, 1, 1, 3, 4, Blocks.red_mushroom_block, 14, Blocks.air, 0, false); - fillWithMetadataBlocks(world, sbb, 2, 2, 1, 4, 3, 1, Blocks.red_mushroom_block, 14, Blocks.air, 0, false); - fillWithMetadataBlocks(world, sbb, 1, 4, 1, 3, 4, 3, Blocks.red_mushroom_block, 14, Blocks.air, 0, false); - placeTreasureAtCurrentPosition(world, rand, 3, 2, 3, TFTreasure.labyrinth_room, sbb); - - fillWithMetadataBlocks(world, sbb, 12, 1, 12, 14, 1, 14, Blocks.red_mushroom_block, 14, Blocks.air, 0, false); - fillWithMetadataBlocks(world, sbb, 14, 2, 11, 14, 3, 14, Blocks.red_mushroom_block, 14, Blocks.air, 0, false); - fillWithMetadataBlocks(world, sbb, 11, 2, 14, 14, 3, 14, Blocks.red_mushroom_block, 14, Blocks.air, 0, false); - fillWithMetadataBlocks(world, sbb, 12, 4, 12, 14, 4, 14, Blocks.red_mushroom_block, 14, Blocks.air, 0, false); - placeTreasureAtCurrentPosition(world, rand, 12, 2, 12, TFTreasure.labyrinth_room, sbb); - - fillWithMetadataBlocks(world, sbb, 1, 1, 12, 3, 1, 14, Blocks.brown_mushroom_block, 14, Blocks.air, 0, false); - fillWithMetadataBlocks(world, sbb, 1, 2, 11, 1, 3, 14, Blocks.brown_mushroom_block, 14, Blocks.air, 0, false); - fillWithMetadataBlocks(world, sbb, 2, 2, 14, 4, 3, 14, Blocks.brown_mushroom_block, 14, Blocks.air, 0, false); - fillWithMetadataBlocks(world, sbb, 1, 4, 12, 3, 4, 14, Blocks.brown_mushroom_block, 14, Blocks.air, 0, false); - placeTreasureAtCurrentPosition(world, rand, 3, 2, 12, TFTreasure.labyrinth_room, sbb); - - fillWithMetadataBlocks(world, sbb, 12, 1, 1, 14, 1, 3, Blocks.brown_mushroom_block, 14, Blocks.air, 0, false); - fillWithMetadataBlocks(world, sbb, 11, 2, 1, 14, 3, 1, Blocks.brown_mushroom_block, 14, Blocks.air, 0, false); - fillWithMetadataBlocks(world, sbb, 14, 2, 2, 14, 3, 4, Blocks.brown_mushroom_block, 14, Blocks.air, 0, false); - fillWithMetadataBlocks(world, sbb, 12, 4, 1, 14, 4, 3, Blocks.brown_mushroom_block, 14, Blocks.air, 0, false); - placeTreasureAtCurrentPosition(world, rand, 12, 2, 3, TFTreasure.labyrinth_room, sbb); - - // a few more ceilingshrooms - fillWithMetadataBlocks(world, sbb, 5, 4, 5, 7, 5, 7, Blocks.brown_mushroom_block, 14, Blocks.air, 0, false); - fillWithMetadataBlocks(world, sbb, 8, 4, 8, 10, 5, 10, Blocks.red_mushroom_block, 14, Blocks.air, 0, false); - - - // the moo-cen-mino-shrom-taur! - if (!taurPlaced) { - int bx = this.getXWithOffset(7, 7); - int by = this.getYWithOffset(1); - int bz = this.getZWithOffset(7, 7); - - if (sbb.isVecInside(bx, by, bz)) { - taurPlaced = true; - - EntityTFMinoshroom taur = new EntityTFMinoshroom(world); - taur.setPosition(bx, by, bz); - taur.setHomeArea(bx, by, bz, 7); - - world.spawnEntityInWorld(taur); - } - } - - - return true; - } -} diff --git a/src/main/java/twilightforest/structures/minotaurmaze/ComponentTFMazeRoomCollapse.java b/src/main/java/twilightforest/structures/minotaurmaze/ComponentTFMazeRoomCollapse.java deleted file mode 100644 index 5091e2a8fb..0000000000 --- a/src/main/java/twilightforest/structures/minotaurmaze/ComponentTFMazeRoomCollapse.java +++ /dev/null @@ -1,59 +0,0 @@ -package twilightforest.structures.minotaurmaze; - -import java.util.Random; - -import net.minecraft.init.Blocks; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import twilightforest.block.BlockTFPlant; -import twilightforest.block.TFBlocks; - -public class ComponentTFMazeRoomCollapse extends ComponentTFMazeRoom { - - public ComponentTFMazeRoomCollapse() { - super(); - // TODO Auto-generated constructor stub - } - - - public ComponentTFMazeRoomCollapse(int i, Random rand, int x, int y, int z) { - super(i, rand, x, y, z); - } - - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - super.addComponentParts(world, rand, sbb); - - // - for (int x = 1; x < 14; x++) - { - for (int z = 1; z < 14; z++) - { - // calculate distance from middle - int dist = (int) Math.round(7 / Math.sqrt((7.5 - x) * (7.5 - x) + (7.5 - z) * (7.5 - z))); - int gravel = rand.nextInt(dist); - int root = rand.nextInt(dist); - - if (gravel > 0) - { - gravel++; // get it out of the floor - this.fillWithBlocks(world, sbb, x, 1, z, x, gravel, z, Blocks.gravel, Blocks.air, false); - this.fillWithAir(world, sbb, x, gravel, z, x, gravel + 5, z); - } - else if (root > 0) - { - this.fillWithBlocks(world, sbb, x, 5, z, x, 5 + root, z, Blocks.dirt, Blocks.air, true); - this.fillWithMetadataBlocks(world, sbb, x, 5 - rand.nextInt(5), z, x, 5, z, TFBlocks.plant, BlockTFPlant.META_ROOT_STRAND, Blocks.air, 0, false); - } - else if (rand.nextInt(dist + 1) > 0) - { - // remove ceiling - this.fillWithAir(world, sbb, x, 5, z, x, 5, z); - } - } - } - - return true; - } -} diff --git a/src/main/java/twilightforest/structures/minotaurmaze/ComponentTFMazeRoomExit.java b/src/main/java/twilightforest/structures/minotaurmaze/ComponentTFMazeRoomExit.java deleted file mode 100644 index f25beb4821..0000000000 --- a/src/main/java/twilightforest/structures/minotaurmaze/ComponentTFMazeRoomExit.java +++ /dev/null @@ -1,42 +0,0 @@ -package twilightforest.structures.minotaurmaze; - -import java.util.Random; - -import net.minecraft.init.Blocks; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import twilightforest.block.TFBlocks; - -public class ComponentTFMazeRoomExit extends ComponentTFMazeRoom { - - public ComponentTFMazeRoomExit() { - super(); - // TODO Auto-generated constructor stub - } - - public ComponentTFMazeRoomExit(int i, Random rand, int x, int y, int z) { - super(i, rand, x, y, z); - } - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - super.addComponentParts(world, rand, sbb); - - // shaft down - this.fillWithMetadataBlocks(world, sbb, 5, -5, 5, 10, 0, 10, TFBlocks.mazestone, 1, Blocks.air, 0, false); - this.fillWithMetadataBlocks(world, sbb, 5, 1, 5, 10, 1, 10, TFBlocks.mazestone, 3, Blocks.air, 0, false); - this.fillWithMetadataBlocks(world, sbb, 5, 2, 5, 10, 3, 10, Blocks.iron_bars, 0, Blocks.air, 0, false); - this.fillWithMetadataBlocks(world, sbb, 5, 4, 5, 10, 4, 10, TFBlocks.mazestone, 3, Blocks.air, 0, false); - this.fillWithAir(world, sbb, 6, -5, 6, 9, 4, 9); - -// int var8 = this.getXWithOffset(0, 0); -// int var9 = this.getYWithOffset(0); -// int var10 = this.getZWithOffset(0, 0); - - //System.out.println("Drawing exit at " + var8 + ", " + var9 + ", " + var10); - - return true; - } - - -} diff --git a/src/main/java/twilightforest/structures/minotaurmaze/ComponentTFMazeRoomFountain.java b/src/main/java/twilightforest/structures/minotaurmaze/ComponentTFMazeRoomFountain.java deleted file mode 100644 index 2c1317332b..0000000000 --- a/src/main/java/twilightforest/structures/minotaurmaze/ComponentTFMazeRoomFountain.java +++ /dev/null @@ -1,32 +0,0 @@ -package twilightforest.structures.minotaurmaze; - -import java.util.Random; - -import net.minecraft.init.Blocks; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import twilightforest.block.TFBlocks; - -public class ComponentTFMazeRoomFountain extends ComponentTFMazeRoom { - - public ComponentTFMazeRoomFountain() { - super(); - // TODO Auto-generated constructor stub - } - - - public ComponentTFMazeRoomFountain(int i, Random rand, int x, int y, int z) { - super(i, rand, x, y, z); - } - - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - super.addComponentParts(world, rand, sbb); - - this.fillWithMetadataBlocks(world, sbb, 5, 1, 5, 10, 1, 10, TFBlocks.mazestone, 3, Blocks.air, 0, false); - this.fillWithBlocks(world, sbb, 6, 1, 6, 9, 1, 9, Blocks.water, Blocks.air, false); - - return true; - } -} diff --git a/src/main/java/twilightforest/structures/minotaurmaze/ComponentTFMazeRoomSpawnerChests.java b/src/main/java/twilightforest/structures/minotaurmaze/ComponentTFMazeRoomSpawnerChests.java deleted file mode 100644 index 5432e70f44..0000000000 --- a/src/main/java/twilightforest/structures/minotaurmaze/ComponentTFMazeRoomSpawnerChests.java +++ /dev/null @@ -1,86 +0,0 @@ -package twilightforest.structures.minotaurmaze; - -import java.util.Random; - -import net.minecraft.init.Blocks; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import twilightforest.TFTreasure; -import twilightforest.block.TFBlocks; -import twilightforest.entity.TFCreatures; - -public class ComponentTFMazeRoomSpawnerChests extends ComponentTFMazeRoom { - - public ComponentTFMazeRoomSpawnerChests() { - super(); - // TODO Auto-generated constructor stub - } - - public ComponentTFMazeRoomSpawnerChests(int i, Random rand, int x, int y, int z) { - super(i, rand, x, y, z); - } - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - super.addComponentParts(world, rand, sbb); - - // 4 pillar enclosures - placePillarEnclosure(world, sbb, 3, 3); - placePillarEnclosure(world, sbb, 10, 3); - placePillarEnclosure(world, sbb, 3, 10); - placePillarEnclosure(world, sbb, 10, 10); - - // spawner - placeSpawnerAtCurrentPosition(world, rand, 4, 2, 4, TFCreatures.getSpawnerNameFor("Minotaur"), sbb); - - // treasure - this.placeTreasureAtCurrentPosition(world, rand, 4, 2, 11, TFTreasure.labyrinth_room, sbb); - - // treasure - this.placeTreasureAtCurrentPosition(world, rand, 11, 2, 4, TFTreasure.labyrinth_room, sbb); - - // trap - placeBlockAtCurrentPosition(world, Blocks.wooden_pressure_plate, 0, 11, 1, 11, sbb); - placeBlockAtCurrentPosition(world, Blocks.tnt, 0, 10, 0, 11, sbb); - placeBlockAtCurrentPosition(world, Blocks.tnt, 0, 11, 0, 10, sbb); - placeBlockAtCurrentPosition(world, Blocks.tnt, 0, 11, 0, 12, sbb); - placeBlockAtCurrentPosition(world, Blocks.tnt, 0, 12, 0, 11, sbb); - - return true; - } - - private void placePillarEnclosure(World world, StructureBoundingBox sbb, - int dx, int dz) { - for (int y = 1; y < 5; y++) - { - placeBlockAtCurrentPosition(world, TFBlocks.mazestone, 2, dx + 0, y, dz + 0, sbb); - placeBlockAtCurrentPosition(world, TFBlocks.mazestone, 2, dx + 2, y, dz + 0, sbb); - placeBlockAtCurrentPosition(world, TFBlocks.mazestone, 2, dx + 0, y, dz + 2, sbb); - placeBlockAtCurrentPosition(world, TFBlocks.mazestone, 2, dx + 2, y, dz + 2, sbb); - } - placeBlockAtCurrentPosition(world, Blocks.planks, 0, dx + 1, 1, dz + 1, sbb); - placeBlockAtCurrentPosition(world, Blocks.planks, 0, dx + 1, 4, dz + 1, sbb); - - placeBlockAtCurrentPosition(world, Blocks.oak_stairs, getStairMeta(1), dx + 1, 1, dz + 0, sbb); - placeBlockAtCurrentPosition(world, Blocks.oak_stairs, getStairMeta(0), dx + 0, 1, dz + 1, sbb); - placeBlockAtCurrentPosition(world, Blocks.oak_stairs, getStairMeta(2), dx + 2, 1, dz + 1, sbb); - placeBlockAtCurrentPosition(world, Blocks.oak_stairs, getStairMeta(3), dx + 1, 1, dz + 2, sbb); - - placeBlockAtCurrentPosition(world, Blocks.oak_stairs, getStairMeta(1) + 4, dx + 1, 4, dz + 0, sbb); - placeBlockAtCurrentPosition(world, Blocks.oak_stairs, getStairMeta(0) + 4, dx + 0, 4, dz + 1, sbb); - placeBlockAtCurrentPosition(world, Blocks.oak_stairs, getStairMeta(2) + 4, dx + 2, 4, dz + 1, sbb); - placeBlockAtCurrentPosition(world, Blocks.oak_stairs, getStairMeta(3) + 4, dx + 1, 4, dz + 2, sbb); - - placeBlockAtCurrentPosition(world, Blocks.iron_bars, 0, dx + 1, 2, dz + 0, sbb); - placeBlockAtCurrentPosition(world, Blocks.iron_bars, 0, dx + 0, 2, dz + 1, sbb); - placeBlockAtCurrentPosition(world, Blocks.iron_bars, 0, dx + 2, 2, dz + 1, sbb); - placeBlockAtCurrentPosition(world, Blocks.iron_bars, 0, dx + 1, 2, dz + 2, sbb); - placeBlockAtCurrentPosition(world, Blocks.iron_bars, 0, dx + 1, 3, dz + 0, sbb); - placeBlockAtCurrentPosition(world, Blocks.iron_bars, 0, dx + 0, 3, dz + 1, sbb); - placeBlockAtCurrentPosition(world, Blocks.iron_bars, 0, dx + 2, 3, dz + 1, sbb); - placeBlockAtCurrentPosition(world, Blocks.iron_bars, 0, dx + 1, 3, dz + 2, sbb); - - - } - -} diff --git a/src/main/java/twilightforest/structures/minotaurmaze/ComponentTFMazeRoomVault.java b/src/main/java/twilightforest/structures/minotaurmaze/ComponentTFMazeRoomVault.java deleted file mode 100644 index 9a03d53e43..0000000000 --- a/src/main/java/twilightforest/structures/minotaurmaze/ComponentTFMazeRoomVault.java +++ /dev/null @@ -1,68 +0,0 @@ -package twilightforest.structures.minotaurmaze; - -import java.util.Random; - -import net.minecraft.init.Blocks; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import twilightforest.TFTreasure; -import twilightforest.block.TFBlocks; - -public class ComponentTFMazeRoomVault extends ComponentTFMazeRoom { - public ComponentTFMazeRoomVault() { - super(); - // TODO Auto-generated constructor stub - } - - - public ComponentTFMazeRoomVault(int i, Random rand, int x, int y, int z) { - super(i, rand, x, y, z); - - // specify a non-existant high spawn list value to stop actual monster spawns - this.spawnListIndex = Integer.MAX_VALUE; - } - - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - // fill room with bricks - fillWithMetadataBlocks(world, sbb, 0, 1, 0, 15, 4, 15, TFBlocks.mazestone, 3, Blocks.air, 0, false); - fillWithMetadataBlocks(world, sbb, 0, 2, 0, 15, 3, 15, TFBlocks.mazestone, 1, Blocks.air, 0, false); - - // 4x4 room in the middle - fillWithAir(world, sbb, 6, 2, 6, 9, 3, 9); - - // pressure plates, sand & tnt - fillWithMetadataBlocks(world, sbb, 6, 2, 5, 9, 2, 5, Blocks.wooden_pressure_plate, 0, Blocks.air, 0, false); - fillWithMetadataBlocks(world, sbb, 6, 2, 10, 9, 2, 10, Blocks.wooden_pressure_plate, 0, Blocks.air, 0, false); - fillWithMetadataBlocks(world, sbb, 5, 2, 6, 5, 2, 9, Blocks.wooden_pressure_plate, 0, Blocks.air, 0, false); - fillWithMetadataBlocks(world, sbb, 10, 2, 6, 10, 2, 9, Blocks.wooden_pressure_plate, 0, Blocks.air, 0, false); - - // unfair sand - fillWithMetadataBlocks(world, sbb, 6, 4, 5, 9, 4, 5, Blocks.sand, 0, Blocks.air, 0, false); - fillWithMetadataBlocks(world, sbb, 6, 4, 10, 9, 4, 10, Blocks.sand, 0, Blocks.air, 0, false); - fillWithMetadataBlocks(world, sbb, 5, 4, 6, 5, 4, 9, Blocks.sand, 0, Blocks.air, 0, false); - fillWithMetadataBlocks(world, sbb, 10, 4, 6, 10, 4, 9, Blocks.sand, 0, Blocks.air, 0, false); - - fillWithMetadataBlocks(world, sbb, 6, 0, 5, 9, 0, 5, Blocks.tnt, 0, Blocks.air, 0, false); - fillWithMetadataBlocks(world, sbb, 6, 0, 10, 9, 0, 10, Blocks.tnt, 0, Blocks.air, 0, false); - fillWithMetadataBlocks(world, sbb, 5, 0, 6, 5, 0, 9, Blocks.tnt, 0, Blocks.air, 0, false); - fillWithMetadataBlocks(world, sbb, 10, 0, 6, 10, 0, 9, Blocks.tnt, 0, Blocks.air, 0, false); - - // LEWTZ! - this.placeBlockAtCurrentPosition(world, Blocks.chest, 0, 7, 2, 6, sbb); - this.placeTreasureAtCurrentPosition(world, rand, 8, 2, 6, TFTreasure.labyrinth_vault, sbb); - this.placeBlockAtCurrentPosition(world, Blocks.chest, 0, 8, 2, 9, sbb); - this.placeTreasureAtCurrentPosition(world, rand, 7, 2, 9, TFTreasure.labyrinth_vault, sbb); - this.placeBlockAtCurrentPosition(world, Blocks.chest, 0, 6, 2, 7, sbb); - this.placeTreasureAtCurrentPosition(world, rand, 6, 2, 8, TFTreasure.labyrinth_vault, sbb); - this.placeBlockAtCurrentPosition(world, Blocks.chest, 0, 9, 2, 8, sbb); - this.placeTreasureAtCurrentPosition(world, rand, 9, 2, 7, TFTreasure.labyrinth_vault, sbb); - - - // mazebreaker! - - - return true; - } -} diff --git a/src/main/java/twilightforest/structures/minotaurmaze/ComponentTFMazeRuins.java b/src/main/java/twilightforest/structures/minotaurmaze/ComponentTFMazeRuins.java deleted file mode 100644 index 0bd5f05cc2..0000000000 --- a/src/main/java/twilightforest/structures/minotaurmaze/ComponentTFMazeRuins.java +++ /dev/null @@ -1,68 +0,0 @@ -package twilightforest.structures.minotaurmaze; - -import java.util.List; -import java.util.Random; - -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import net.minecraft.world.gen.structure.StructureComponent; -import twilightforest.structures.StructureTFComponent; - -/** - * This component is the base for the maze/ruins combo feature. There are village-like ruins above and a maze underneath. - * - * @author Ben - * - */ -public class ComponentTFMazeRuins extends StructureTFComponent { - - public ComponentTFMazeRuins() { - super(); - // TODO Auto-generated constructor stub - } - - public ComponentTFMazeRuins(World world, Random rand, int i, int x, int y, int z) { - super(i); - this.setCoordBaseMode(0); - - // I have no bounding box - this.boundingBox = StructureTFComponent.getComponentToAddBoundingBox(x, y, z, 0, 0, 0, 0, 0, 0, 0); - - } - - /** - * Initiates construction of the Structure Component picked, at the current Location of StructGen - */ - @Override - public void buildComponent(StructureComponent structurecomponent, List list, Random random) { - super.buildComponent(structurecomponent, list, random); - - // add a maze - ComponentTFMinotaurMaze maze = new ComponentTFMinotaurMaze(1, boundingBox.minX, boundingBox.minY - 14, boundingBox.minZ, 1); - list.add(maze); - maze.buildComponent(this, list, random); - - // add maze entrance shaft - ComponentTFMazeEntranceShaft mazeEnter = new ComponentTFMazeEntranceShaft(2, random, boundingBox.minX + 1, boundingBox.minY, boundingBox.minZ + 1); - list.add(mazeEnter); - mazeEnter.buildComponent(this, list, random); - - // add aboveground maze entrance building - ComponentTFMazeMound mazeAbove = new ComponentTFMazeMound(2, random, boundingBox.minX - 14, boundingBox.minY, boundingBox.minZ - 14); - list.add(mazeAbove); - mazeAbove.buildComponent(this, list, random); - - } - - - /** - * second Part of Structure generating, this for example places Spiderwebs, Mob Spawners, it closes Mineshafts at - * the end, it adds Fences... - */ - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - // I have no components - return true; - } - -} diff --git a/src/main/java/twilightforest/structures/minotaurmaze/ComponentTFMazeUpperEntrance.java b/src/main/java/twilightforest/structures/minotaurmaze/ComponentTFMazeUpperEntrance.java deleted file mode 100644 index 03e5bd1e2e..0000000000 --- a/src/main/java/twilightforest/structures/minotaurmaze/ComponentTFMazeUpperEntrance.java +++ /dev/null @@ -1,121 +0,0 @@ -package twilightforest.structures.minotaurmaze; - -import java.util.List; -import java.util.Random; - -import net.minecraft.init.Blocks; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import net.minecraft.world.gen.structure.StructureComponent; -import twilightforest.block.TFBlocks; -import twilightforest.structures.StructureTFComponent; - -public class ComponentTFMazeUpperEntrance extends StructureTFComponent { - - private int averageGroundLevel = -1; - - - public ComponentTFMazeUpperEntrance() { - super(); - // TODO Auto-generated constructor stub - } - - - public ComponentTFMazeUpperEntrance(int i, Random rand, int x, int y, int z) { - super(i); - this.coordBaseMode = rand.nextInt(4); - - this.boundingBox = new StructureBoundingBox(x, y, z, x + 15, y + 4, z + 15); - } - - /** - * Initiates construction of the Structure Component picked, at the current Location of StructGen - */ - @Override - public void buildComponent(StructureComponent structurecomponent, List list, Random random) { - ; - } - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - - // ceiling - this.randomlyFillWithBlocks(world, sbb, rand, 0.7F, 0, 5, 0, 15, 5, 15, TFBlocks.mazestone, Blocks.air, true); - - this.fillWithMetadataBlocks(world, sbb, 0, 0, 0, 15, 0, 15, TFBlocks.mazestone, 6, Blocks.air, 0, false); - this.fillWithMetadataBlocks(world, sbb, 0, 1, 0, 15, 1, 15, TFBlocks.mazestone, 3, Blocks.air, 0, true); - this.fillWithMetadataBlocks(world, sbb, 0, 2, 0, 15, 3, 15, TFBlocks.mazestone, 1, Blocks.air, 0, true); - this.fillWithMetadataBlocks(world, sbb, 0, 4, 0, 15, 4, 15, TFBlocks.mazestone, 3, Blocks.air, 0, true); - this.randomlyFillWithBlocks(world, sbb, rand, 0.2F, 0, 0, 0, 15, 5, 15, Blocks.gravel, Blocks.air, true); - - - // doorways - fillWithBlocks(world, sbb, 6, 1, 0, 9, 4, 0, Blocks.fence, Blocks.air, false); - fillWithAir(world, sbb, 7, 1, 0, 8, 3, 0); - fillWithBlocks(world, sbb, 6, 1, 15, 9, 4, 15, Blocks.fence, Blocks.air, false); - fillWithAir(world, sbb, 7, 1, 15, 8, 3, 15); - fillWithBlocks(world, sbb, 0, 1, 6, 0, 4, 9, Blocks.fence, Blocks.air, false); - fillWithAir(world, sbb, 0, 1, 7, 0, 3, 8); - fillWithBlocks(world, sbb, 15, 1, 6, 15, 4, 9, Blocks.fence, Blocks.air, false); - fillWithAir(world, sbb, 15, 1, 7, 15, 3, 8); - - // random holes -// this.randomlyRareFillWithBlocks(world, sbb, 0, 1, 0, 15, 4, 15, 0, false); -// this.randomlyRareFillWithBlocks(world, sbb, 0, 3, 0, 15, 4, 15, 0, true); -// this.randomlyRareFillWithBlocks(world, sbb, 0, 4, 0, 15, 4, 15, 0, true); - this.fillWithAir(world, sbb, 1, 1, 1, 14, 4, 14); - - // entrance pit - this.fillWithMetadataBlocks(world, sbb, 5, 1, 5, 10, 1, 10, TFBlocks.mazestone, 3, Blocks.air, 0, false); - this.fillWithMetadataBlocks(world, sbb, 5, 4, 5, 10, 4, 10, TFBlocks.mazestone, 3, Blocks.air, 0, false); - this.randomlyFillWithBlocks(world, sbb, rand, 0.7F, 5, 2, 5, 10, 3, 10, Blocks.iron_bars, Blocks.air, false); -// this.fillWithMetadataBlocks(world, sbb, 5, 2, 5, 10, 3, 10, Blocks.iron_bars, 0, Blocks.air, 0, false); - - - - this.fillWithAir(world, sbb, 6, 0, 6, 9, 4, 9); - - -// int var8 = this.getXWithOffset(0, 0); -// int var9 = this.getYWithOffset(0); -// int var10 = this.getZWithOffset(0, 0); -// -// System.out.println("Drawing entrance at " + var8 + ", " + var9 + ", " + var10); - - - return true; - } - - - /** - * Discover the y coordinate that will serve as the ground level of the supplied BoundingBox. (A median of all the - * levels in the BB's horizontal rectangle). - */ - protected int getAverageGroundLevel(World par1World, StructureBoundingBox par2StructureBoundingBox) - { - int var3 = 0; - int var4 = 0; - - for (int var5 = this.boundingBox.minZ; var5 <= this.boundingBox.maxZ; ++var5) - { - for (int var6 = this.boundingBox.minX; var6 <= this.boundingBox.maxX; ++var6) - { - if (par2StructureBoundingBox.isVecInside(var6, 64, var5)) - { - var3 += Math.max(par1World.getTopSolidOrLiquidBlock(var6, var5), par1World.provider.getAverageGroundLevel()); - ++var4; - } - } - } - - if (var4 == 0) - { - return -1; - } - else - { - return var3 / var4; - } - } - -} diff --git a/src/main/java/twilightforest/structures/minotaurmaze/ComponentTFMinotaurMaze.java b/src/main/java/twilightforest/structures/minotaurmaze/ComponentTFMinotaurMaze.java deleted file mode 100644 index 5d7b828eb7..0000000000 --- a/src/main/java/twilightforest/structures/minotaurmaze/ComponentTFMinotaurMaze.java +++ /dev/null @@ -1,396 +0,0 @@ -package twilightforest.structures.minotaurmaze; - -import java.util.List; -import java.util.Random; - -import net.minecraft.init.Blocks; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import net.minecraft.world.gen.structure.StructureComponent; -import twilightforest.block.TFBlocks; -import twilightforest.structures.StructureTFComponent; -import twilightforest.structures.TFMaze; - - - -public class ComponentTFMinotaurMaze extends StructureTFComponent { - - private static final int FLOOR_LEVEL = 1; - TFMaze maze; - int rcoords[]; - private int level; - - public ComponentTFMinotaurMaze() { - super(); - } - - public ComponentTFMinotaurMaze(int index, int x, int y, int z, int entranceX, int entranceZ, int level) { - super(index); - this.setCoordBaseMode(0); - this.level = level; - this.boundingBox = StructureTFComponent.getComponentToAddBoundingBox(x, y, z, -getRadius(), 0, -getRadius(), getRadius() * 2, 5, getRadius() * 2, 0); - - // make maze object - maze = new TFMaze(getMazeSize(), getMazeSize()); - - // set the seed to a fixed value based on this maze's x and z - setFixedMazeSeed(); - - // rooms - int nrooms = 7; - rcoords = new int[nrooms * 2]; - - addRoomsToMaze(entranceX, entranceZ, nrooms); - - // make actual maze - maze.generateRecursiveBacktracker(0, 0); - } - - private void addRoomsToMaze(int entranceX, int entranceZ, int nrooms) { - // make one entrance room always - rcoords[0] = entranceX; - rcoords[1] = entranceZ; - maze.carveRoom1(entranceX, entranceZ); - - // add room coordinates, trying to keep them separate from existing rooms - for (int i = 1; i < nrooms; i++) - { - int rx, rz; - do { - rx = maze.rand.nextInt(getMazeSize() - 2) + 1; - rz = maze.rand.nextInt(getMazeSize() - 2) + 1; - } while(isNearRoom(rx, rz, rcoords, i == 1 ? 7 : 4)); - - maze.carveRoom1(rx, rz); - - //System.out.println("Initially carving room " + rx + ", " + rz); - - rcoords[i * 2] = rx; - rcoords[i * 2 + 1] = rz; - } - } - - private void setFixedMazeSeed() { - maze.setSeed(this.boundingBox.minX * 90342903 + this.boundingBox.minY * 90342903 ^ this.boundingBox.minZ); - } - - public ComponentTFMinotaurMaze(int index, int x, int y, int z, int level) { - this(index, x, y, z, 11, 11, level); - } - - /** - * Save to NBT - */ - @Override - protected void func_143012_a(NBTTagCompound par1NBTTagCompound) { - super.func_143012_a(par1NBTTagCompound); - - par1NBTTagCompound.setInteger("mazeLevel", this.level); - par1NBTTagCompound.setIntArray("roomCoords", this.rcoords); - } - - /** - * Load from NBT - */ - @Override - protected void func_143011_b(NBTTagCompound par1NBTTagCompound) { - super.func_143011_b(par1NBTTagCompound); - this.level = par1NBTTagCompound.getInteger("mazeLevel"); - this.rcoords = par1NBTTagCompound.getIntArray("roomCoords"); - - // recreate maze object - maze = new TFMaze(getMazeSize(), getMazeSize()); - setFixedMazeSeed(); - - // blank out rcoords above 1 so that the room generation works properly - //TODO: re-do this. :) - for (int i = 2; i < rcoords.length; i++) - { - this.rcoords[i] = 0; - } - - // recreate rooms - this.addRoomsToMaze(this.rcoords[0], this.rcoords[1], (this.rcoords.length + 1) / 2); - - // regenerate maze - maze.generateRecursiveBacktracker(0, 0); - } - - protected ComponentTFMazeRoom makeRoom(Random random, int i, int dx, int dz) { - ComponentTFMazeRoom room = null; - - int worldX = boundingBox.minX + dx * 5 - 4; - int worldY = boundingBox.minY; - int worldZ = boundingBox.minZ + dz * 5 - 4; - - if (i == 0) - { - // default room - room = new ComponentTFMazeRoom(3 + i, random, worldX, worldY, worldZ); - } - else if (i == 1) - { - if (this.level == 1) - { - // exit room - room = new ComponentTFMazeRoomExit(3 + i, random, worldX, worldY, worldZ); - } - else - { - // boss room - room = new ComponentTFMazeRoomBoss(3 + i, random, worldX, worldY, worldZ); - } - } - else if (i == 2 || i == 3) - { - if (this.level == 1) - { - // collapsed room - room = new ComponentTFMazeRoomCollapse(3 + i, random, worldX, worldY, worldZ); - } - else - { - // mush-room - room = new ComponentTFMazeMushRoom(3 + i, random, worldX, worldY, worldZ); - } - } - else if (i == 4) - { - if (this.level == 1) - { - // fountain room - room = new ComponentTFMazeRoomFountain(3 + i, random, worldX, worldY, worldZ); - } - else - { - // vault - room = new ComponentTFMazeRoomVault(3 + i, random, worldX, worldY, worldZ); - - } - } - else - { - room = new ComponentTFMazeRoomSpawnerChests(3 + i, random, worldX, worldY, worldZ); - } - - return room; - } - - /** - * Find dead ends and put something there - * @param random - * @param list - */ - protected void decorateDeadEndsCorridors(Random random, List list) - { - for(int x = 0; x < maze.width; x++) - { - for (int z = 0; z < maze.depth; z++) - { - StructureTFComponent component = null; - - // dead ends - if (!maze.isWall(x, z, x - 1, z) && maze.isWall(x, z, x + 1, z) && maze.isWall(x, z, x, z - 1) && maze.isWall(x, z, x, z + 1)) { - component = makeDeadEnd(random, x, z, 3); - } - if (maze.isWall(x, z, x - 1, z) && !maze.isWall(x, z, x + 1, z) && maze.isWall(x, z, x, z - 1) && maze.isWall(x, z, x, z + 1)) { - component = makeDeadEnd(random, x, z, 1); - } - if (maze.isWall(x, z, x - 1, z) && maze.isWall(x, z, x + 1, z) && !maze.isWall(x, z, x, z - 1) && maze.isWall(x, z, x, z + 1)) { - component = makeDeadEnd(random, x, z, 0); - } - if (maze.isWall(x, z, x - 1, z) && maze.isWall(x, z, x + 1, z) && maze.isWall(x, z, x, z - 1) && !maze.isWall(x, z, x, z + 1)) { - component = makeDeadEnd(random, x, z, 2); - } - - // corridors - if (!maze.isWall(x, z, x - 1, z) && !maze.isWall(x, z, x + 1, z) && maze.isWall(x, z, x, z - 1) && maze.isWall(x, z, x, z + 1) - && maze.isWall(x - 1, z, x - 1, z - 1) && maze.isWall(x - 1, z, x - 1, z + 1) && maze.isWall(x + 1, z, x + 1, z - 1) && maze.isWall(x + 1, z, x + 1, z + 1)) { - component = makeCorridor(random, x, z, 1); - } - if (!maze.isWall(x, z, x, z - 1) && !maze.isWall(x, z, x, z + 1) && maze.isWall(x, z, x - 1, z) && maze.isWall(x, z, x + 1, z) - && maze.isWall(x, z - 1, x - 1, z - 1) && maze.isWall(x, z - 1, x + 1, z - 1) && maze.isWall(x, z + 1, x - 1, z + 1) && maze.isWall(x, z + 1, x + 1, z + 1)) { - component = makeCorridor(random, x, z, 0); - } - - if (component != null) - { - list.add(component); - component.buildComponent(this, list, random); - } - } - } - } - - /** - * Add a dead end structure at the specified coords - */ - protected ComponentTFMazeDeadEnd makeDeadEnd(Random random, int dx, int dz, int rotation) { - int worldX = boundingBox.minX + dx * 5 + 1; - int worldY = boundingBox.minY; - int worldZ = boundingBox.minZ + dz * 5 + 1; - - int decorationType = random.nextInt(8); - - switch (decorationType) - { - default: - case 0: - // blank with fence doorway - return new ComponentTFMazeDeadEnd(4, worldX, worldY, worldZ, rotation); - case 1: - return new ComponentTFMazeDeadEndChest(4, worldX, worldY, worldZ, rotation); - case 2: - return new ComponentTFMazeDeadEndTrappedChest(4, worldX, worldY, worldZ, rotation); - case 3: - return new ComponentTFMazeDeadEndTorches(4, worldX, worldY, worldZ, rotation); - case 4: - return new ComponentTFMazeDeadEndFountain(4, worldX, worldY, worldZ, rotation); - case 5: - return new ComponentTFMazeDeadEndFountainLava(4, worldX, worldY, worldZ, rotation); - case 6: - return new ComponentTFMazeDeadEndPainting(4, worldX, worldY, worldZ, rotation); - case 7: - return this.level == 1 ? new ComponentTFMazeDeadEndRoots(4, worldX, worldY, worldZ, rotation) : new ComponentTFMazeDeadEndShrooms(4, worldX, worldY, worldZ, rotation); - - } - - } - - protected ComponentTFMazeCorridor makeCorridor(Random random, int dx, int dz, int rotation) { - int worldX = boundingBox.minX + dx * 5 + 1; - int worldY = boundingBox.minY; - int worldZ = boundingBox.minZ + dz * 5 + 1; - - int decorationType = random.nextInt(5); - - switch (decorationType) - { - default: - case 0: - return null; - case 1: - return new ComponentTFMazeCorridor(4, worldX, worldY, worldZ, rotation); - case 2: - return new ComponentTFMazeCorridorIronFence(4, worldX, worldY, worldZ, rotation); - case 3: - return null; // painting - case 4: - return this.level == 1 ? new ComponentTFMazeCorridorRoots(4, worldX, worldY, worldZ, rotation) : new ComponentTFMazeCorridorShrooms(4, worldX, worldY, worldZ, rotation); - } - - } - - /** - * Initiates construction of the Structure Component picked, at the current Location of StructGen - */ - @Override - public void buildComponent(StructureComponent structurecomponent, List list, Random random) { - super.buildComponent(structurecomponent, list, random); - - // add a second story - if (this.level == 1) - { - int centerX = boundingBox.minX + ((boundingBox.maxX - boundingBox.minX) / 2); - int centerZ = boundingBox.minZ + ((boundingBox.maxZ - boundingBox.minZ) / 2); - - ComponentTFMinotaurMaze maze = new ComponentTFMinotaurMaze(1, centerX, boundingBox.minY - 10, centerZ, rcoords[2], rcoords[3], 2); - list.add(maze); - maze.buildComponent(this, list, random); - } - - - // add rooms where we have our coordinates - for (int i = 0; i < rcoords.length / 2; i++) - { - int dx = rcoords[i * 2]; - int dz = rcoords[i * 2 + 1]; - - // add the room as a component - ComponentTFMazeRoom room = makeRoom(random, i, dx, dz); - list.add(room); - room.buildComponent(this, list, random); - } - - // find dead ends and corridors and make components for them - decorateDeadEndsCorridors(random, list); - } - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - // level 2 maze surrounded by bedrock - if (level == 2) - { - fillWithBlocks(world, sbb, 0, -1, 0, getDiameter() + 2, 6, getDiameter() + 2, Blocks.bedrock, Blocks.air, false); - } - - // clear the area - fillWithAir(world, sbb, 1, 1, 1, getDiameter(), 4, getDiameter()); -// fillWithBlocks(world, sbb, 0, 0, 0, getDiameter(), 0, getDiameter(), TFBlocks.mazestone, Blocks.stone, false); -// fillWithBlocks(world, sbb, 0, 5, 0, getDiameter(), 5, getDiameter(), TFBlocks.mazestone, Blocks.stone, true); - fillWithMetadataBlocks(world, sbb, 1, 5, 1, getDiameter(), 5, getDiameter(), TFBlocks.mazestone, 0, Blocks.stone, 0, this.level == 1); - fillWithMetadataBlocks(world, sbb, 1, 0, 1, getDiameter(), 0, getDiameter(), TFBlocks.mazestone, 6, Blocks.stone, 0, false); - - // - maze.headBlockID = TFBlocks.mazestone; - maze.headBlockMeta = 3; - maze.wallBlockID = TFBlocks.mazestone; - maze.wallBlockMeta = 1; - maze.rootBlockID = TFBlocks.mazestone; - maze.rootBlockMeta = 3; - maze.pillarBlockID = TFBlocks.mazestone; - maze.pillarBlockMeta = 2; - maze.wallVar0ID = TFBlocks.mazestone; - maze.wallVar0Meta = 4; - maze.wallVarRarity = 0.2F; - maze.torchRarity = 0.05F; - maze.tall = 2; - maze.head = 1; - maze.roots = 1; - maze.oddBias = 4; - - maze.copyToStructure(world, 1, 2, 1, this, sbb); - - return true; - - } - - public int getMazeSize() { - return 22; - } - - public int getRadius() { - return (int) (getMazeSize() * 2.5); - } - - public int getDiameter() { - return getMazeSize() * 5; - } - - /** - * @return true if the specified dx and dz are within 3 of a room specified in rcoords - */ - protected boolean isNearRoom(int dx, int dz, int[] rcoords, int range) { - // if proposed coordinates are covering the origin, return true to stop the room from causing the maze to fail - if (dx == 1 && dz == 1) { - return true; - } - - for (int i = 0; i < rcoords.length / 2; i++) - { - int rx = rcoords[i * 2]; - int rz = rcoords[i * 2 + 1]; - - if (rx == 0 && rz == 0) { - continue; - } - - if (Math.abs(dx - rx) < range && Math.abs(dz - rz) < range) { - return true; - } - } - return false; - } - -} diff --git a/src/main/java/twilightforest/structures/minotaurmaze/StructureTFMazeStones.java b/src/main/java/twilightforest/structures/minotaurmaze/StructureTFMazeStones.java deleted file mode 100644 index 6aea6095db..0000000000 --- a/src/main/java/twilightforest/structures/minotaurmaze/StructureTFMazeStones.java +++ /dev/null @@ -1,38 +0,0 @@ -package twilightforest.structures.minotaurmaze; - -import java.util.Random; - -import net.minecraft.init.Blocks; -import net.minecraft.world.gen.structure.StructureComponent; -import twilightforest.block.TFBlocks; - -public class StructureTFMazeStones extends StructureComponent.BlockSelector { - - @Override - public void selectBlocks(Random par1Random, int par2, int par3, int par4, boolean wall) { - if (!wall) - { - this.field_151562_a = Blocks.air; - this.selectedBlockMetaData = 0; - } - else - { - this.field_151562_a = TFBlocks.mazestone; - float rf = par1Random.nextFloat(); - - if (rf < 0.2F) - { - this.selectedBlockMetaData = 5; - } - else if (rf < 0.5F) - { - this.selectedBlockMetaData = 4; - } - else - { - this.selectedBlockMetaData = 1; - } - } - } - -} diff --git a/src/main/java/twilightforest/structures/minotaurmaze/TFMinotaurMazePieces.java b/src/main/java/twilightforest/structures/minotaurmaze/TFMinotaurMazePieces.java deleted file mode 100644 index 1be1b4d84d..0000000000 --- a/src/main/java/twilightforest/structures/minotaurmaze/TFMinotaurMazePieces.java +++ /dev/null @@ -1,68 +0,0 @@ -package twilightforest.structures.minotaurmaze; - -import net.minecraft.world.gen.structure.MapGenStructureIO; - - -public class TFMinotaurMazePieces { - - - public static void registerPieces() - { - MapGenStructureIO.func_143031_a(ComponentTFMazeCorridor.class, "TFMMC"); - MapGenStructureIO.func_143031_a(ComponentTFMazeCorridorIronFence.class, "TFMMCIF"); - MapGenStructureIO.func_143031_a(ComponentTFMazeCorridorRoots.class, "TFMMCR"); - MapGenStructureIO.func_143031_a(ComponentTFMazeCorridorShrooms.class, "TFMMCS"); - MapGenStructureIO.func_143031_a(ComponentTFMazeDeadEnd.class, "TFMMDE"); - MapGenStructureIO.func_143031_a(ComponentTFMazeDeadEndChest.class, "TFMMDEC"); - MapGenStructureIO.func_143031_a(ComponentTFMazeDeadEndFountain.class, "TFMMDEF"); - MapGenStructureIO.func_143031_a(ComponentTFMazeDeadEndFountainLava.class, "TFMMDEFL"); - MapGenStructureIO.func_143031_a(ComponentTFMazeDeadEndPainting.class, "TFMMDEP"); - MapGenStructureIO.func_143031_a(ComponentTFMazeDeadEndRoots.class, "TFMMDER"); - MapGenStructureIO.func_143031_a(ComponentTFMazeDeadEndShrooms.class, "TFMMDES"); - MapGenStructureIO.func_143031_a(ComponentTFMazeDeadEndTorches.class, "TFMMDET"); - MapGenStructureIO.func_143031_a(ComponentTFMazeDeadEndTrappedChest.class, "TFMMDETC"); - MapGenStructureIO.func_143031_a(ComponentTFMazeEntranceShaft.class, "TFMMES"); - MapGenStructureIO.func_143031_a(ComponentTFMazeMound.class, "TFMMMound"); - MapGenStructureIO.func_143031_a(ComponentTFMazeMushRoom.class, "TFMMMR"); - MapGenStructureIO.func_143031_a(ComponentTFMazeRoom.class, "TFMMR"); - MapGenStructureIO.func_143031_a(ComponentTFMazeRoomBoss.class, "TFMMRB"); - MapGenStructureIO.func_143031_a(ComponentTFMazeRoomCollapse.class, "TFMMRC"); - MapGenStructureIO.func_143031_a(ComponentTFMazeRoomExit.class, "TFMMRE"); - MapGenStructureIO.func_143031_a(ComponentTFMazeRoomFountain.class, "TFMMRF"); - MapGenStructureIO.func_143031_a(ComponentTFMazeRoomSpawnerChests.class, "TFMMRSC"); - MapGenStructureIO.func_143031_a(ComponentTFMazeRoomVault.class, "TFMMRV"); - MapGenStructureIO.func_143031_a(ComponentTFMazeRuins.class, "TFMMRuins"); - MapGenStructureIO.func_143031_a(ComponentTFMazeUpperEntrance.class, "TFMMUE"); - MapGenStructureIO.func_143031_a(ComponentTFMinotaurMaze.class, "TFMMaze"); -} - -} -/* -/Minecraft/src/twilightforest/structures/minotaurmaze/ComponentTFMazeCorridor.java -/Minecraft/src/twilightforest/structures/minotaurmaze/ComponentTFMazeCorridorIronFence.java -/Minecraft/src/twilightforest/structures/minotaurmaze/ComponentTFMazeCorridorRoots.java -/Minecraft/src/twilightforest/structures/minotaurmaze/ComponentTFMazeCorridorShrooms.java -/Minecraft/src/twilightforest/structures/minotaurmaze/ComponentTFMazeDeadEnd.java -/Minecraft/src/twilightforest/structures/minotaurmaze/ComponentTFMazeDeadEndChest.java -/Minecraft/src/twilightforest/structures/minotaurmaze/ComponentTFMazeDeadEndFountain.java -/Minecraft/src/twilightforest/structures/minotaurmaze/ComponentTFMazeDeadEndFountainLava.java -/Minecraft/src/twilightforest/structures/minotaurmaze/ComponentTFMazeDeadEndPainting.java -/Minecraft/src/twilightforest/structures/minotaurmaze/ComponentTFMazeDeadEndRoots.java -/Minecraft/src/twilightforest/structures/minotaurmaze/ComponentTFMazeDeadEndShrooms.java -/Minecraft/src/twilightforest/structures/minotaurmaze/ComponentTFMazeDeadEndTorches.java -/Minecraft/src/twilightforest/structures/minotaurmaze/ComponentTFMazeDeadEndTrappedChest.java -/Minecraft/src/twilightforest/structures/minotaurmaze/ComponentTFMazeEntranceShaft.java -/Minecraft/src/twilightforest/structures/minotaurmaze/ComponentTFMazeMound.java -/Minecraft/src/twilightforest/structures/minotaurmaze/ComponentTFMazeMushRoom.java -/Minecraft/src/twilightforest/structures/minotaurmaze/ComponentTFMazeRoom.java -/Minecraft/src/twilightforest/structures/minotaurmaze/ComponentTFMazeRoomBoss.java -/Minecraft/src/twilightforest/structures/minotaurmaze/ComponentTFMazeRoomCollapse.java -/Minecraft/src/twilightforest/structures/minotaurmaze/ComponentTFMazeRoomExit.java -/Minecraft/src/twilightforest/structures/minotaurmaze/ComponentTFMazeRoomFountain.java -/Minecraft/src/twilightforest/structures/minotaurmaze/ComponentTFMazeRoomSpawnerChests.java -/Minecraft/src/twilightforest/structures/minotaurmaze/ComponentTFMazeRoomVault.java -/Minecraft/src/twilightforest/structures/minotaurmaze/ComponentTFMazeRuins.java -/Minecraft/src/twilightforest/structures/minotaurmaze/ComponentTFMazeUpperEntrance.java -/Minecraft/src/twilightforest/structures/minotaurmaze/ComponentTFMinotaurMaze.java -/Minecraft/src/twilightforest/structures/minotaurmaze/TFMinotaurMazePieces.java -*/ \ No newline at end of file diff --git a/src/main/java/twilightforest/structures/mushroomtower/ComponentTFMushroomTowerBridge.java b/src/main/java/twilightforest/structures/mushroomtower/ComponentTFMushroomTowerBridge.java deleted file mode 100644 index cc8bfaee46..0000000000 --- a/src/main/java/twilightforest/structures/mushroomtower/ComponentTFMushroomTowerBridge.java +++ /dev/null @@ -1,95 +0,0 @@ -package twilightforest.structures.mushroomtower; - -import java.util.List; -import java.util.Random; - -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import net.minecraft.world.gen.structure.StructureComponent; -import twilightforest.structures.StructureTFComponent; - -public class ComponentTFMushroomTowerBridge extends ComponentTFMushroomTowerWing { - - int dSize; - int dHeight; - - public ComponentTFMushroomTowerBridge() { - super(); - // TODO Auto-generated constructor stub - } - - protected ComponentTFMushroomTowerBridge(int i, int x, int y, int z, int pSize, int pHeight, int direction) { - super(i, x, y, z, pSize, pHeight, direction); - - this.boundingBox = StructureTFComponent.getComponentToAddBoundingBox(x, y, z, 0, 0, 0, size - 1, height - 1, 3, direction); - - this.dSize = pSize; - this.dHeight = pHeight; - } - - /** - * Save to NBT - */ - @Override - protected void func_143012_a(NBTTagCompound par1NBTTagCompound) { - super.func_143012_a(par1NBTTagCompound); - - par1NBTTagCompound.setInteger("destSize", this.dSize); - par1NBTTagCompound.setInteger("destHeight", this.dHeight); - } - - /** - * Load from NBT - */ - @Override - protected void func_143011_b(NBTTagCompound par1NBTTagCompound) { - super.func_143011_b(par1NBTTagCompound); - this.dSize = par1NBTTagCompound.getInteger("destSize"); - this.dHeight = par1NBTTagCompound.getInteger("destHeight"); - } - - @Override - public void buildComponent(StructureComponent parent, List list, Random rand) { - if (parent != null && parent instanceof StructureTFComponent) - { - this.deco = ((StructureTFComponent)parent).deco; - } - - int[] dest = new int[] {dSize - 1, 1, 1}; - - boolean madeWing = makeTowerWing(list, rand, this.getComponentType(), dest[0], dest[1], dest[2], dSize, dHeight, 0); - - if (!madeWing) - { - int[] dx = offsetTowerCoords(dest[0], dest[1], dest[2], dSize, 0); - - System.out.println("Making tower wing failed when bridge was already made. Size = " + dSize + ", x = " + dx[0] + " z = " + dx[2]); - } - } - - public StructureBoundingBox getWingBB() { - int[] dest = offsetTowerCoords(dSize - 1, 1, 1, dSize, this.getCoordBaseMode()); - return StructureTFComponent.getComponentToAddBoundingBox(dest[0], dest[1], dest[2], 0, 0, 0, dSize - 1, dHeight - 1, dSize - 1, this.getCoordBaseMode()); - - } - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - - // make walls - for (int x = 0; x < dSize; x++) { - placeBlockAtCurrentPosition(world, deco.fenceID, deco.fenceMeta, x, 1, 0, sbb); - placeBlockAtCurrentPosition(world, deco.fenceID, deco.fenceMeta, x, 1, 2, sbb); - - placeBlockAtCurrentPosition(world, deco.floorID, this.isAscender ? 3 : deco.floorMeta, x, 0, 1, sbb); - } - - // clear bridge walkway - this.fillWithAir(world, sbb, 0, 1, 1, 2, 2, 1); - - - return true; - } - -} diff --git a/src/main/java/twilightforest/structures/mushroomtower/ComponentTFMushroomTowerMain.java b/src/main/java/twilightforest/structures/mushroomtower/ComponentTFMushroomTowerMain.java deleted file mode 100644 index d7607f3f0c..0000000000 --- a/src/main/java/twilightforest/structures/mushroomtower/ComponentTFMushroomTowerMain.java +++ /dev/null @@ -1,172 +0,0 @@ -package twilightforest.structures.mushroomtower; - -import java.util.List; -import java.util.Random; - -import net.minecraft.init.Blocks; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import net.minecraft.world.gen.structure.StructureComponent; -import twilightforest.structures.StructureTFComponent; -import twilightforest.structures.lichtower.ComponentTFTowerRoof; - -public class ComponentTFMushroomTowerMain extends ComponentTFMushroomTowerWing -{ - - - public ComponentTFMushroomTowerMain() { - super(); - // TODO Auto-generated constructor stub - } - - public ComponentTFMushroomTowerMain(World world, Random rand, int index, int x, int y, int z) { - this(world, rand, index, x + MAIN_SIZE, y + 4, z + MAIN_SIZE, 2); - } - - public ComponentTFMushroomTowerMain(World world, Random rand, int index, int x, int y, int z, int rotation) { - super(index, x, y, z, MAIN_SIZE, 8 + (rand.nextInt(3) * FLOOR_HEIGHT), rotation); - -// // check to make sure we can build the whole tower -// if (this.boundingBox.maxY > 245) -// { -// int amtToLower = (((this.boundingBox.maxY - 245) / 5) * 5) + 5; -// -// FMLLog.info("[TwilightForest] Lowering Dark Tower max height by %d to be within world bounds", amtToLower); -// -// this.height -= amtToLower; -// this.boundingBox.maxY -= amtToLower; -// } - - // decorator - if (this.deco == null) - { - this.deco = new StructureDecoratorMushroomTower(); - } - } - - - protected ComponentTFMushroomTowerMain(int i, int x, int y, int z, int pSize, int pHeight, int direction) - { - super(i, x, y, z, pSize, pHeight, direction); - } - - @Override - public void buildComponent(StructureComponent parent, List list, Random rand) { - if (parent != null && parent instanceof StructureTFComponent) - { - this.deco = ((StructureTFComponent)parent).deco; - } - - // we should have a door where we started - addOpening(0, 1, size / 2, 2); - - // should we build a base? - this.hasBase = true; - - int mainDir = -1; - - // limit sprawl to a reasonable amount - if (this.getComponentType() < 3) - { - // make a special sub-tower that will lead back here - // try 6 times - for (int i = 0; i < 6; i++) - { - mainDir = makeAscenderTower(list, rand); - - if (mainDir != -1) - { - break; - } - } - - // make sub towers - for (int i = 0; i < 4; i++) { - - if (i == mainDir) - { - continue; - } - - int[] dest = getValidOpening(rand, i); - - int childHeight = (rand.nextInt(2) + rand.nextInt(2) + 2) * FLOOR_HEIGHT + 1; - - makeBridge(list, rand, this.getComponentType() + 1, dest[0], dest[1], dest[2], size - 4, childHeight, i); - } - } - else - { - // add a roof? - makeARoof(parent, list, rand); - } - - } - - /** - * Make a new ascender tower. Return direction (0-4) if successful, -1 if not. - */ - private int makeAscenderTower(List list, Random rand) { - int mainDir; - int[] dest; - int childHeight; - mainDir = rand.nextInt(4); - - dest = getValidOpening(rand, mainDir); - - childHeight = (height - dest[1]) + ((rand.nextInt(2) + rand.nextInt(2) + 3) * FLOOR_HEIGHT) + 1; - - boolean madeIt = makeBridge(list, rand, this.getComponentType() + 1, dest[0], dest[1], dest[2], size - 4, childHeight, mainDir, true); - - if (madeIt) - { - System.out.println("Main tower made a bridge to another tower"); - return mainDir; - } - else - { - System.out.println("Main tower failed to branch off at index " + this.componentType); - return -1; - } - - } - - /** - * Make a mushroom roof! - */ - @Override - public void makeARoof(StructureComponent parent, List list, Random rand) { - ComponentTFTowerRoof roof = new ComponentTFTowerRoofMushroom(this.getComponentType() + 1, this, 1.6F); - list.add(roof); - roof.buildComponent(this, list, rand); - } - - - /** - * Make an opening in this tower for a door. This now only makes one opening, so you need two - */ - protected void makeDoorOpening(World world, int dx, int dy, int dz, StructureBoundingBox sbb) { - super.makeDoorOpening(world, dx, dy, dz, sbb); - - // try to remove blocks inside this door - if (dx == 0) { - placeBlockAtCurrentPosition(world, Blocks.air, 0, dx + 1, dy + 0, dz, sbb); - placeBlockAtCurrentPosition(world, Blocks.air, 0, dx + 1, dy + 1, dz, sbb); - } - if (dx == size - 1) { - placeBlockAtCurrentPosition(world, Blocks.air, 0, dx - 1, dy + 0, dz, sbb); - placeBlockAtCurrentPosition(world, Blocks.air, 0, dx - 1, dy + 1, dz, sbb); - } - if (dz == 0) { - placeBlockAtCurrentPosition(world, Blocks.air, 0, dx, dy + 0, dz + 1, sbb); - placeBlockAtCurrentPosition(world, Blocks.air, 0, dx, dy + 1, dz + 1, sbb); - } - if (dz == size - 1) { - placeBlockAtCurrentPosition(world, Blocks.air, 0, dx, dy + 0, dz - 1, sbb); - placeBlockAtCurrentPosition(world, Blocks.air, 0, dx, dy + 1, dz - 1, sbb); - } - - } - - -} diff --git a/src/main/java/twilightforest/structures/mushroomtower/ComponentTFMushroomTowerMainBridge.java b/src/main/java/twilightforest/structures/mushroomtower/ComponentTFMushroomTowerMainBridge.java deleted file mode 100644 index c171d9327f..0000000000 --- a/src/main/java/twilightforest/structures/mushroomtower/ComponentTFMushroomTowerMainBridge.java +++ /dev/null @@ -1,43 +0,0 @@ -package twilightforest.structures.mushroomtower; - -import java.util.List; -import java.util.Random; - -import net.minecraft.world.gen.structure.StructureComponent; - -public class ComponentTFMushroomTowerMainBridge extends ComponentTFMushroomTowerBridge { - - public ComponentTFMushroomTowerMainBridge() { - super(); - // TODO Auto-generated constructor stub - } - - protected ComponentTFMushroomTowerMainBridge(int i, int x, int y, int z, int pSize, int pHeight, int direction) { - // bridge only 11 long - super(i, x, y, z, 11, pHeight, direction); - } - - @Override - public boolean makeTowerWing(List list, Random rand, int index, int x, int y, int z, int wingSize, int wingHeight, int rotation) { - - // make a new size 15 main tower - int direction = (getCoordBaseMode() + rotation) % 4; - int[] dx = offsetTowerCoords(x, y, z, 15, direction); - - // adjust coordinates to fit an existing tower - dx = adjustCoordinates(dx[0], dx[1], dx[2], 15, direction, list); - - ComponentTFMushroomTowerMain wing = new ComponentTFMushroomTowerMain(index, dx[0], dx[1], dx[2], 15, wingHeight, direction); - - list.add(wing); - wing.buildComponent((StructureComponent) list.get(0), list, rand); - addOpening(x, y, z, rotation); - - return true; - } - - - - - -} diff --git a/src/main/java/twilightforest/structures/mushroomtower/ComponentTFMushroomTowerWing.java b/src/main/java/twilightforest/structures/mushroomtower/ComponentTFMushroomTowerWing.java deleted file mode 100644 index f1cc0a07e7..0000000000 --- a/src/main/java/twilightforest/structures/mushroomtower/ComponentTFMushroomTowerWing.java +++ /dev/null @@ -1,518 +0,0 @@ -package twilightforest.structures.mushroomtower; - -import java.util.List; -import java.util.Random; - -import net.minecraft.init.Blocks; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import net.minecraft.world.gen.structure.StructureComponent; -import twilightforest.structures.StructureTFComponent; -import twilightforest.structures.lichtower.ComponentTFTowerRoof; -import twilightforest.structures.lichtower.ComponentTFTowerWing; - -public class ComponentTFMushroomTowerWing extends ComponentTFTowerWing -{ - - private static final int RANGE = 200; - protected static final int FLOOR_HEIGHT = 4; - protected static final int MAIN_SIZE = 15; - - boolean hasBase = false; - public boolean isAscender = false; - - public ComponentTFMushroomTowerWing() { - super(); - } - - protected ComponentTFMushroomTowerWing(int i, int x, int y, int z, int pSize, int pHeight, int direction) { - super(i, x, y, z, pSize, pHeight, direction); - } - - /** - * Save to NBT - */ - @Override - protected void func_143012_a(NBTTagCompound par1NBTTagCompound) { - super.func_143012_a(par1NBTTagCompound); - - par1NBTTagCompound.setBoolean("hasBase", this.hasBase); - par1NBTTagCompound.setBoolean("isAscender", this.isAscender); - } - - /** - * Load from NBT - */ - @Override - protected void func_143011_b(NBTTagCompound par1NBTTagCompound) { - super.func_143011_b(par1NBTTagCompound); - this.hasBase = par1NBTTagCompound.getBoolean("hasBase"); - this.isAscender = par1NBTTagCompound.getBoolean("isAscender"); - } - - @Override - public void buildComponent(StructureComponent parent, List list, Random rand) { - if (parent != null && parent instanceof StructureTFComponent) - { - this.deco = ((StructureTFComponent)parent).deco; - } - - // we should have a door where we started - addOpening(0, 1, size / 2, 2); - - // should we build a base? - this.hasBase = size > 3; - - // if we are an acender, build the destination tower - if (this.isAscender) - { - int[] dest = getValidOpening(rand, 2); - - dest[1] = this.height - 3; - - int childHeight = (rand.nextInt(3) + rand.nextInt(3) + 2) * FLOOR_HEIGHT + 1; - - - boolean madeIt = makeMainBridge(list, rand, this.getComponentType() + 1, dest[0], dest[1], dest[2], size + 4, childHeight, 2); - - if (!madeIt) - { - System.out.println("Did not make bridge back to new main"); - } - else - { - System.out.println("Made bridge back to new main"); - } - } - - // limit sprawl to a reasonable amount - if (this.getComponentType() < 5 && this.size > 6) - { - // make sub towers - for (int i = 0; i < 4; i++) { - - if (this.size < MAIN_SIZE && i == 2) - { - continue; - } - - int[] dest = getValidOpening(rand, i); - - int childHeight = (rand.nextInt(2) + rand.nextInt(2) + 2) * FLOOR_HEIGHT + 1; - - makeBridge(list, rand, this.getComponentType() + 1, dest[0], dest[1], dest[2], size - 4, childHeight, i); - } - } - - if (this.isHighest(this.boundingBox, this.size, list) || !this.hasBase) - { - // add a roof? - makeARoof(parent, list, rand); - } - - } - - /** - * Have we strayed more than range blocks away from the center? - */ - private boolean isOutOfRange(StructureComponent parent, int nx, int ny, int nz, int range) { - -// System.out.println("x range is " + Math.abs(nx - parent.getBoundingBox().minX)); -// System.out.println("z range is " + Math.abs(nz - parent.getBoundingBox().minZ)); -// System.out.println("nz is " + nz + ", parent.minz is " + parent.getBoundingBox().minZ); - - return Math.abs(nx - parent.getBoundingBox().getCenterX()) > range - || Math.abs(nz - parent.getBoundingBox().getCenterZ()) > range; - } - - /** - * Make a new wing - */ - public boolean makeTowerWing(List list, Random rand, int index, int x, int y, int z, int wingSize, int wingHeight, int rotation) { - - int direction = (getCoordBaseMode() + rotation) % 4; - int[] dx = offsetTowerCoords(x, y, z, wingSize, direction); - - // stop if out of range - if (isOutOfRange((StructureComponent) list.get(0), dx[0], dx[1], dx[2], RANGE)) - { - return false; - } - - // adjust coordinates to fit an existing tower - if (wingSize > 3) - { - dx = adjustCoordinates(dx[0], dx[1], dx[2], wingSize, direction, list); - } - - ComponentTFMushroomTowerWing wing = new ComponentTFMushroomTowerWing(index, dx[0], dx[1], dx[2], wingSize, wingHeight, direction); - // check to see if it intersects something already there - StructureComponent intersect = StructureComponent.findIntersecting(list, wing.getBoundingBox()); - if (intersect == null || intersect == this || intersect instanceof ComponentTFTowerRoofMushroom) { - - // if we are coming from an ascender bridge, mark the destination component - if (this instanceof ComponentTFMushroomTowerBridge && this.isAscender) - { - wing.isAscender = true; - } - - list.add(wing); - wing.buildComponent((StructureComponent) list.get(0), list, rand); - addOpening(x, y, z, rotation); - - return true; - } - else - { - return false; - } - - } - - /** - * Adjust the coordinates for this tower to link up with any others within 3 - */ - protected int[] adjustCoordinates(int x, int y, int z, int wingSize, int direction, List list) { - - // go through list. if there are any same size towers within wingSize, return their xyz instead - - for (Object obj : list) - { - if (obj instanceof ComponentTFTowerWing && !(obj instanceof ComponentTFMushroomTowerBridge)) - { - ComponentTFTowerWing otherWing = (ComponentTFTowerWing)obj; - - if (wingSize == otherWing.size && otherWing.getBoundingBox().intersectsWith(x - 3, z - 3, x + 3, z + 3)) - { -// System.out.println("I found an intersecting thing : " + otherWing + ", size = " + wingSize + " direction = " + direction); -// System.out.println("x = " + x + ", z = " + z + " other.minX = " + otherWing.getBoundingBox().minX + " other.maxX = " + otherWing.getBoundingBox().maxX + " other.minZ = " + otherWing.getBoundingBox().minZ + " other.maxZ = " + otherWing.getBoundingBox().maxZ); - - switch (direction) - { - case 0: - return new int[] {otherWing.getBoundingBox().minX, y, otherWing.getBoundingBox().minZ}; - case 1: - return new int[] {otherWing.getBoundingBox().maxX, y, otherWing.getBoundingBox().minZ}; - case 2: - return new int[] {otherWing.getBoundingBox().maxX, y, otherWing.getBoundingBox().maxZ}; - case 3: - return new int[] {otherWing.getBoundingBox().minX, y, otherWing.getBoundingBox().maxZ}; - } - } - } - } - - - - return new int[] {x, y, z}; - } - - /** - * Are there (not) any other towers below this bounding box? - */ - private boolean isHighest(StructureBoundingBox boundingBox, int size, List list) { - // go through list. if there are any same size towers within wingSize, return their xyz instead - - StructureBoundingBox boxAbove = new StructureBoundingBox(boundingBox); - - boxAbove.maxY = 256; - - for (Object obj : list) - { - if (this != obj && obj instanceof ComponentTFTowerWing && !(obj instanceof ComponentTFMushroomTowerBridge)) - { - ComponentTFTowerWing otherWing = (ComponentTFTowerWing)obj; - - if (size == otherWing.size && otherWing.getBoundingBox().intersectsWith(boxAbove)) - { - //System.out.println("This tower (" + boundingBox + ") is not the highest, there is " + otherWing + " at " + otherWing.getBoundingBox()); - - return false; - } - } - } - - return true; - } - - /** - * Make a mushroom roof! - */ - @Override - public void makeARoof(StructureComponent parent, List list, Random rand) { - - ComponentTFTowerRoof roof = new ComponentTFTowerRoofMushroom(this.getComponentType() + 1, this, 1.6F); - if (StructureComponent.findIntersecting(list, roof.getBoundingBox()) instanceof ComponentTFTowerRoofMushroom) - { - list.add(roof); - roof.buildComponent(this, list, rand); - } - else - { - roof = new ComponentTFTowerRoofMushroom(this.getComponentType() + 1, this, 1.0F); - if (StructureComponent.findIntersecting(list, roof.getBoundingBox()) instanceof ComponentTFTowerRoofMushroom) - { - list.add(roof); - roof.buildComponent(this, list, rand); - } - else - { - roof = new ComponentTFTowerRoofMushroom(this.getComponentType() + 1, this, 0.6F); - list.add(roof); - roof.buildComponent(this, list, rand); - } - - } - } - - - protected boolean makeBridge(List list, Random rand, int index, int x, int y, int z, int wingSize, int wingHeight, int rotation) { - return this.makeBridge(list, rand, index, x, y, z, wingSize, wingHeight, rotation, false); - } - - protected boolean makeBridge(List list, Random rand, int index, int x, int y, int z, int wingSize, int wingHeight, int rotation, boolean ascender) { - // bridges are size always - int direction = (getCoordBaseMode() + rotation) % 4; - int[] dx = offsetTowerCoords(x, y, z, 3, direction); - - // adjust height for those stupid little things - if (wingSize == 3) { - wingHeight = 4; - } - - ComponentTFMushroomTowerBridge bridge = new ComponentTFMushroomTowerBridge(index, dx[0], dx[1], dx[2], wingSize, wingHeight, direction); - bridge.isAscender = ascender; - // check to see if it intersects something already there - StructureComponent intersect = StructureComponent.findIntersecting(list, bridge.getBoundingBox()); - if (intersect == null || intersect == this) { - intersect = StructureComponent.findIntersecting(list, bridge.getWingBB()); - } - else { - return false; - } - // okay, I think we can actually make one, as long as we're not still intersecting something. - if (intersect == null || intersect == this) { - list.add(bridge); - bridge.buildComponent(this, list, rand); - addOpening(x, y, z, rotation); - return true; - } - else { - return false; - } - } - - private boolean makeMainBridge(List list, Random rand, int index, int x, int y, int z, int wingSize, int wingHeight, int rotation) { - - int direction = (getCoordBaseMode() + rotation) % 4; - int[] dx = offsetTowerCoords(x, y, z, 3, direction); - - ComponentTFMushroomTowerMainBridge bridge = new ComponentTFMushroomTowerMainBridge(index, dx[0], dx[1], dx[2], wingSize, wingHeight, direction); - - list.add(bridge); - bridge.buildComponent(this, list, rand); - addOpening(x, y, z, rotation); - return true; - - } - - /** - * Gets a random position in the specified direction that connects to stairs currently in the tower. - */ - public int[] getValidOpening(Random rand, int direction) { - // variables! - int wLength = Math.min(size / 3, 3); // wall length - int offset = (size - wLength) / 2; // wall thickness - - // for directions 0 or 2, the wall lies along the z axis - if (direction == 0 || direction == 2) { - int rx = direction == 0 ? size - 1 : 0; - int rz = offset + rand.nextInt(wLength); - int ry = getYByStairs(rz, rand, direction); - - return new int[] {rx, ry, rz}; - } - - // for directions 1 or 3, the wall lies along the x axis - if (direction == 1 || direction == 3) { - int rx = offset + rand.nextInt(wLength); - int rz = direction == 1 ? size - 1 : 0; - int ry = getYByStairs(rx, rand, direction); - - return new int[] {rx, ry, rz}; - } - - - return new int[] {0, 0, 0}; - } - - - /** - * Gets a Y value where the stairs meet the specified X coordinate. - * Also works for Z coordinates. - */ - protected int getYByStairs(int rx, Random rand, int direction) { - - int floors = this.height / FLOOR_HEIGHT; - - return FLOOR_HEIGHT + 1 + (rand.nextInt(floors - 1) * FLOOR_HEIGHT); - } - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - Random decoRNG = new Random(world.getSeed() + (this.boundingBox.minX * 321534781) ^ (this.boundingBox.minZ * 756839)); - -// // clear inside -// fillWithAir(world, sbb, 1, 1, 1, size - 2, height - 2, size - 2); - - makeTrunk(world, sbb); - - - // make floors - makeFloorsForTower(world, decoRNG, sbb); - - - // nullify sky light - this.nullifySkyLightForBoundingBox(world); - - - - // openings - makeOpenings(world, sbb); - - - return true; - } - - private void makeTrunk(World world, StructureBoundingBox sbb) { - int diameter = this.size / 2; - int hollow = (int)(diameter * 0.8); - - int cx = diameter; - int cz = diameter; - - // build the trunk upwards - for (int dx = -diameter; dx <= diameter; dx++) - { - for (int dz = -diameter; dz <= diameter; dz++) - { - // determine how far we are from the center. - int ax = Math.abs(dx); - int az = Math.abs(dz); - int dist = (int)(Math.max(ax, az) + (Math.min(ax, az) * 0.4)); - - // make a trunk! - if (dist <= diameter) - { - // make floor/ceiling - placeBlockAtCurrentPosition(world, deco.floorID, deco.floorMeta, dx + cx, 0, dz + cz, sbb); - placeBlockAtCurrentPosition(world, deco.floorID, deco.floorMeta, dx + cx, height, dz + cz, sbb); - - // make walls - if (dist > hollow) - { - for (int dy = 0; dy <= height; dy++) - { - placeBlockAtCurrentPosition(world, deco.blockID, deco.blockMeta, dx + cx, dy, dz + cz, sbb); - } - } - else - { - for (int dy = 1; dy <= height - 1; dy++) - { - placeBlockAtCurrentPosition(world, Blocks.air, 0, dx + cx, dy, dz + cz, sbb); - } - } - - // make base - if (this.hasBase) - { - this.func_151554_b(world, deco.blockID, deco.blockMeta, dx + cx, -1, dz + cz, sbb); - } - } - } - } - } - - private void makeFloorsForTower(World world, Random decoRNG, StructureBoundingBox sbb) { - int floors = this.height / FLOOR_HEIGHT; - - int ladderDir = 3; - int downLadderDir = -1; - - // divide the tower into floors - for (int i = 0; i < floors; i++) { - - - placeFloor(world, i * FLOOR_HEIGHT, sbb); - - - - downLadderDir = ladderDir; - ladderDir++; - ladderDir %= 4; - -// decorateFloor(world, decoRNG, i, (i * floorHeight), (i * floorHeight) + floorHeight, ladderDir, downLadderDir, sbb); - - } - - - } - - private void placeFloor(World world, int dy, StructureBoundingBox sbb) { - int diameter = this.size / 2; - int hollow = (int)(diameter * 0.8); - - int cx = diameter; - int cz = diameter; - - // build the trunk upwards - for (int dx = -diameter; dx <= diameter; dx++) - { - for (int dz = -diameter; dz <= diameter; dz++) - { - // determine how far we are from the center. - int ax = Math.abs(dx); - int az = Math.abs(dz); - int dist = (int)(Math.max(ax, az) + (Math.min(ax, az) * 0.4)); - - // make a floor! - if (dist <= hollow) - { - { - placeBlockAtCurrentPosition(world, deco.floorID, this.isAscender ? 3 : deco.floorMeta, dx + cx, dy, dz + cz, sbb); - } - } - } - } - } - - /** - * Make an opening in this tower for a door. This now only makes one opening, so you need two - */ - protected void makeDoorOpening(World world, int dx, int dy, int dz, StructureBoundingBox sbb) { - super.makeDoorOpening(world, dx, dy, dz, sbb); - - if (getBlockAtCurrentPosition(world, dx, dy + 2, dz, sbb) != Blocks.air) { - placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, dx, dy + 2, dz, sbb); - } - } - - /** - * Called to decorate each floor. This is responsible for adding a ladder up, the stub of the ladder going down, then picking a theme for each floor and executing it. - * - * @param floor - * @param bottom - * @param top - * @param ladderUpDir - * @param laddderDownDir - */ - protected void decorateFloor(World world, Random rand, int floor, int bottom, int top, int ladderUpDir, int ladderDownDir, StructureBoundingBox sbb) { - //decorateWraparoundWallSteps(world, rand, bottom, top, ladderUpDir, ladderDownDir, sbb); - - } - - - -} diff --git a/src/main/java/twilightforest/structures/mushroomtower/ComponentTFTowerRoofMushroom.java b/src/main/java/twilightforest/structures/mushroomtower/ComponentTFTowerRoofMushroom.java deleted file mode 100644 index ecd8aa80d6..0000000000 --- a/src/main/java/twilightforest/structures/mushroomtower/ComponentTFTowerRoofMushroom.java +++ /dev/null @@ -1,99 +0,0 @@ -package twilightforest.structures.mushroomtower; - -import java.util.List; -import java.util.Random; - -import net.minecraft.util.MathHelper; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import net.minecraft.world.gen.structure.StructureComponent; -import twilightforest.structures.StructureTFComponent; -import twilightforest.structures.lichtower.ComponentTFTowerRoof; -import twilightforest.structures.lichtower.ComponentTFTowerWing; - -public class ComponentTFTowerRoofMushroom extends ComponentTFTowerRoof { - - public ComponentTFTowerRoofMushroom(int i, ComponentTFTowerWing wing, float pHang) { - super(i, wing); - - this.height = wing.size; - - int overhang = (int)(wing.size * pHang); - - this.size = wing.size + (overhang * 2); - - this.setCoordBaseMode(0); - - this.boundingBox = new StructureBoundingBox(wing.getBoundingBox().minX - overhang, wing.getBoundingBox().maxY + 2, wing.getBoundingBox().minZ - overhang, wing.getBoundingBox().maxX + overhang, wing.getBoundingBox().maxY + this.height + 1, wing.getBoundingBox().maxZ + overhang); - - } - - @Override - public void buildComponent(StructureComponent parent, List list, Random rand) { - if (parent != null && parent instanceof StructureTFComponent) - { - this.deco = ((StructureTFComponent)parent).deco; - } - } - - public ComponentTFTowerRoofMushroom() { - super(); - // TODO Auto-generated constructor stub - } - - /** - * Makes a pointy roof out of stuff - */ - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - - for (int y = 0; y <= height; y++) { - - int radius = (int)(MathHelper.sin((y + height/1.2F) / (height * 2.05F) * 3.14F) * this.size / 2F); - int hollow = MathHelper.floor_float(radius * .9F); - - if ((height - y) < 3) - { - hollow = -1; - } - - makeCircle(world, y, radius, hollow, sbb); - } - - return true; - } - - private void makeCircle(World world, int y, int radius, int hollow, StructureBoundingBox sbb) { - - int cx = size / 2; - int cz = size / 2; - - // build the trunk upwards - for (int dx = -radius; dx <= radius; dx++) - { - for (int dz = -radius; dz <= radius; dz++) - { - // determine how far we are from the center. -// int ax = Math.abs(dx); -// int az = Math.abs(dz); - float dist = MathHelper.sqrt_float(dx * dx + dz * dz); - - // make a trunk! - if (dist <= (radius + 0.5F)) - { - if (dist > hollow) - { - placeBlockAtCurrentPosition(world, deco.accentID, deco.accentMeta, dx + cx, y, dz + cz, sbb); - } - else - { - // spore - placeBlockAtCurrentPosition(world, deco.accentID, 0, dx + cx, y, dz + cz, sbb); - - } - } - } - } - } - -} diff --git a/src/main/java/twilightforest/structures/mushroomtower/StructureDecoratorMushroomTower.java b/src/main/java/twilightforest/structures/mushroomtower/StructureDecoratorMushroomTower.java deleted file mode 100644 index ea822b6070..0000000000 --- a/src/main/java/twilightforest/structures/mushroomtower/StructureDecoratorMushroomTower.java +++ /dev/null @@ -1,29 +0,0 @@ -package twilightforest.structures.mushroomtower; - -import net.minecraft.init.Blocks; -import twilightforest.structures.StructureTFDecorator; - -public class StructureDecoratorMushroomTower extends StructureTFDecorator { - - - - public StructureDecoratorMushroomTower() - { - this.blockID = Blocks.red_mushroom_block; - this.blockMeta = 10; - - this.accentID = Blocks.red_mushroom_block; - this.accentMeta = 14; - - this.fenceID = Blocks.fence; - - this.stairID = Blocks.spruce_stairs; - - this.pillarID = Blocks.red_mushroom_block; - this.pillarMeta = 10; - - this.floorID = Blocks.planks; - this.floorMeta = 0; - } - -} diff --git a/src/main/java/twilightforest/structures/mushroomtower/TFMushroomTowerPieces.java b/src/main/java/twilightforest/structures/mushroomtower/TFMushroomTowerPieces.java deleted file mode 100644 index 6fd211a1e3..0000000000 --- a/src/main/java/twilightforest/structures/mushroomtower/TFMushroomTowerPieces.java +++ /dev/null @@ -1,15 +0,0 @@ -package twilightforest.structures.mushroomtower; - -import net.minecraft.world.gen.structure.MapGenStructureIO; - -public class TFMushroomTowerPieces { - - public static void registerPieces() { - MapGenStructureIO.func_143031_a(ComponentTFMushroomTowerMain.class, "TFMTMai"); - MapGenStructureIO.func_143031_a(ComponentTFMushroomTowerWing.class, "TFMTWin"); - MapGenStructureIO.func_143031_a(ComponentTFMushroomTowerBridge.class, "TFMTBri"); - MapGenStructureIO.func_143031_a(ComponentTFMushroomTowerMainBridge.class, "TFMTMB"); - MapGenStructureIO.func_143031_a(ComponentTFTowerRoofMushroom.class, "TFMTRoofMush"); - } - -} diff --git a/src/main/java/twilightforest/structures/stronghold/ComponentTFStrongholdAccessChamber.java b/src/main/java/twilightforest/structures/stronghold/ComponentTFStrongholdAccessChamber.java deleted file mode 100644 index 00aca5a81c..0000000000 --- a/src/main/java/twilightforest/structures/stronghold/ComponentTFStrongholdAccessChamber.java +++ /dev/null @@ -1,86 +0,0 @@ -package twilightforest.structures.stronghold; - -import java.util.List; -import java.util.Random; - -import net.minecraft.init.Blocks; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import net.minecraft.world.gen.structure.StructureComponent; -import twilightforest.block.TFBlocks; - -public class ComponentTFStrongholdAccessChamber extends StructureTFStrongholdComponent { - - public ComponentTFStrongholdAccessChamber() { - super(); - // TODO Auto-generated constructor stub - } - - public ComponentTFStrongholdAccessChamber(int i, int facing, int x, int y, int z) { - super(i, facing, x, y, z); - } - - @Override - public StructureBoundingBox generateBoundingBox(int facing, int x, int y, int z) { - return StructureBoundingBox.getComponentToAddBoundingBox(x, y, z, -4, 1, 0, 9, 5, 9, facing); - } - - /** - * Initiates construction of the Structure Component picked, at the current Location of StructGen - */ - @Override - public void buildComponent(StructureComponent parent, List list, Random random) { - super.buildComponent(parent, list, random); - - // make a random component in each direction - addNewUpperComponent(parent, list, random, 0, 4, 1, 9); - addNewUpperComponent(parent, list, random, 1, -1, 1, 4); - addNewUpperComponent(parent, list, random, 2, 4, 1, -1); - addNewUpperComponent(parent, list, random, 3, 9, 1, 4); - - } - - - /** - * Generate the blocks that go here - */ - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - fillWithRandomizedBlocks(world, sbb, 0, 0, 0, 8, 4, 8, true, rand, deco.randomBlocks); - - // doors - placeSmallDoorwayAt(world, rand, 0, 4, 1, 8, sbb); - placeSmallDoorwayAt(world, rand, 1, 0, 1, 4, sbb); - placeSmallDoorwayAt(world, rand, 2, 4, 1, 0, sbb); - placeSmallDoorwayAt(world, rand, 3, 8, 1, 4, sbb); - - // shaft down - this.fillWithMetadataBlocks(world, sbb, 2, -2, 2, 6, 0, 6, Blocks.stonebrick, 1, Blocks.air, 0, false); - - this.fillWithAir(world, sbb, 3, -2, 3, 5, 2, 5); - - // stairs surrounding shaft - this.fillWithMetadataBlocks(world, sbb, 2, 0, 3, 2, 0, 6, deco.stairID, this.getStairMeta(2), Blocks.air, 0, false); - this.fillWithMetadataBlocks(world, sbb, 6, 0, 2, 6, 0, 6, deco.stairID, this.getStairMeta(0), Blocks.air, 0, false); - this.fillWithMetadataBlocks(world, sbb, 3, 0, 2, 5, 0, 2, deco.stairID, this.getStairMeta(3), Blocks.air, 0, false); - this.fillWithMetadataBlocks(world, sbb, 3, 0, 6, 5, 0, 6, deco.stairID, this.getStairMeta(1), Blocks.air, 0, false); - - // pillar - this.placeBlockAtCurrentPosition(world, deco.pillarID, deco.pillarMeta, 2, 0, 2, sbb); - - // pedestal - this.placeBlockAtCurrentPosition(world, TFBlocks.trophyPedestal, 15, 2, 1, 2, sbb); - - // block point - this.fillWithMetadataBlocks(world, sbb, 2, -1, 2, 6, -1, 6, TFBlocks.shield, 15, Blocks.air, 0, false); - - return true; - } - - /** - * Does this component fall under block protection when progression is turned on, normally true - */ - public boolean isComponentProtected() { - return false; - } -} diff --git a/src/main/java/twilightforest/structures/stronghold/ComponentTFStrongholdAtrium.java b/src/main/java/twilightforest/structures/stronghold/ComponentTFStrongholdAtrium.java deleted file mode 100644 index 688b7075d5..0000000000 --- a/src/main/java/twilightforest/structures/stronghold/ComponentTFStrongholdAtrium.java +++ /dev/null @@ -1,211 +0,0 @@ -package twilightforest.structures.stronghold; - -import java.util.List; -import java.util.Random; - -import net.minecraft.init.Blocks; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.world.World; -import net.minecraft.world.gen.feature.WorldGenTrees; -import net.minecraft.world.gen.feature.WorldGenerator; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import net.minecraft.world.gen.structure.StructureComponent; -import twilightforest.world.TFGenSmallRainboak; -import twilightforest.world.TFGenSmallTwilightOak; - -public class ComponentTFStrongholdAtrium extends StructureTFStrongholdComponent { - - private boolean enterBottom; - - public ComponentTFStrongholdAtrium() { - super(); - // TODO Auto-generated constructor stub - } - - public ComponentTFStrongholdAtrium(int i, int facing, int x, int y, int z) { - super(i, facing, x, y, z); - } - - /** - * Save to NBT - */ - @Override - protected void func_143012_a(NBTTagCompound par1NBTTagCompound) { - super.func_143012_a(par1NBTTagCompound); - - par1NBTTagCompound.setBoolean("enterBottom", this.enterBottom); - } - - /** - * Load from NBT - */ - @Override - protected void func_143011_b(NBTTagCompound par1NBTTagCompound) { - super.func_143011_b(par1NBTTagCompound); - this.enterBottom = par1NBTTagCompound.getBoolean("enterBottom"); - } - - /** - * Make a bounding box for this room - */ - public StructureBoundingBox generateBoundingBox(int facing, int x, int y, int z) - { - - if (y > 17) - { - this.enterBottom = false; - } - else if (y < 11) - { - this.enterBottom = true; - } - else - { - this.enterBottom = (z & 1) == 0; - } - - if (enterBottom) - { - return StructureTFStrongholdComponent.getComponentToAddBoundingBox(x, y, z, -4, -1, 0, 18, 14, 18, facing); - } - else - { - // enter on the top - return StructureTFStrongholdComponent.getComponentToAddBoundingBox(x, y, z, -13, -8, 0, 18, 14, 18, facing); - } - } - - /** - * Initiates construction of the Structure Component picked, at the current Location of StructGen - */ - @Override - public void buildComponent(StructureComponent parent, List list, Random random) { - super.buildComponent(parent, list, random); - - if (this.enterBottom) - { - this.addDoor(4, 1, 0); - addNewComponent(parent, list, random, 2, 13, 8, -1); - } - else - { - this.addDoor(13, 8, 0); - addNewComponent(parent, list, random, 2, 4, 1, -1); - } - - addNewComponent(parent, list, random, 0, 13, 1, 18); - addNewComponent(parent, list, random, 0, 4, 8, 18); - - } - - /** - * Generate the blocks that go here - */ - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - placeStrongholdWalls(world, sbb, 0, 0, 0, 17, 13, 17, rand, deco.randomBlocks); - - - // balcony - this.fillWithRandomizedBlocks(world, sbb, 1, 6, 1, 16, 7, 16, false, rand, deco.randomBlocks); - this.fillWithBlocks(world, sbb, 5, 8, 5, 12, 8, 12, deco.fenceID, Blocks.air, false); - this.fillWithAir(world, sbb, 6, 6, 6, 11, 8, 11); - - // balcony pillars - placeBalconyPillar(world, sbb, 0); - placeBalconyPillar(world, sbb, 1); - placeBalconyPillar(world, sbb, 2); - placeBalconyPillar(world, sbb, 3); - - // corner pillars - this.fillWithRandomizedBlocks(world, sbb, 1, 1, 1, 1, 12, 2, false, rand, deco.randomBlocks); - this.fillWithRandomizedBlocks(world, sbb, 2, 1, 1, 2, 12, 1, false, rand, deco.randomBlocks); - - this.fillWithRandomizedBlocks(world, sbb, 16, 1, 1, 16, 12, 2, false, rand, deco.randomBlocks); - this.fillWithRandomizedBlocks(world, sbb, 15, 1, 1, 15, 12, 1, false, rand, deco.randomBlocks); - - this.fillWithRandomizedBlocks(world, sbb, 1, 1, 15, 1, 12, 16, false, rand, deco.randomBlocks); - this.fillWithRandomizedBlocks(world, sbb, 2, 1, 16, 2, 12, 16, false, rand, deco.randomBlocks); - - this.fillWithRandomizedBlocks(world, sbb, 16, 1, 15, 16, 12, 16, false, rand, deco.randomBlocks); - this.fillWithRandomizedBlocks(world, sbb, 15, 1, 16, 15, 12, 16, false, rand, deco.randomBlocks); - - // grass - this.randomlyFillWithBlocks(world, sbb, rand, 0.5F, 6, 0, 6, 11, 0, 11, Blocks.grass, Blocks.grass, false); - this.fillWithBlocks(world, sbb, 7, 0, 7, 10, 0, 10, Blocks.grass, Blocks.air, false); - - // tree - this.spawnATree(world, rand.nextInt(5), 8, 1, 8, sbb); - - // statues - placeCornerStatue(world, 2, 8, 2, 0, sbb); - placeCornerStatue(world, 2, 1, 15, 1, sbb); - placeCornerStatue(world, 15, 1, 2, 2, sbb); - placeCornerStatue(world, 15, 8, 15, 3, sbb); - - // doors - placeDoors(world, rand, sbb); - - return true; - } - - private void spawnATree(World world, int treeNum, int x, int y, int z, StructureBoundingBox sbb) - { - int dx = getXWithOffset(x, z); - int dy = getYWithOffset(y); - int dz = getZWithOffset(x, z); - if (sbb.isVecInside(dx, dy, dz)) - { - WorldGenerator treeGen; - // grow a tree - int minHeight = 8; - - switch (treeNum) - { - case 0: - default: - // oak tree - treeGen = new WorldGenTrees(true, minHeight, 0, 0, false); - break; - case 1: - // jungle tree - treeGen = new WorldGenTrees(true, minHeight, 3, 3, false); - break; - case 2: - // birch - treeGen = new WorldGenTrees(true, minHeight, 2, 2, false); - break; - case 3: - treeGen = new TFGenSmallTwilightOak(false, minHeight); - break; - case 4: - treeGen = new TFGenSmallRainboak(false); - break; - } - - for (int i = 0; i < 100; i++) - { - if (treeGen.generate(world, world.rand, dx, dy, dz)) - { - break; - } - - if (i == 99) - { - //System.out.println("Never generated " + treeGen); - } - } - } - } - - - private void placeBalconyPillar(World world, StructureBoundingBox sbb, int rotation) { - this.fillBlocksRotated(world, sbb, 5, 1, 5, 5, 12, 5, deco.pillarID, deco.pillarMeta, rotation); - this.placeBlockRotated(world, deco.stairID, this.getStairMeta(3 + rotation), 5, 1, 6, rotation, sbb); - this.placeBlockRotated(world, deco.stairID, this.getStairMeta(2 + rotation), 6, 1, 5, rotation, sbb); - this.placeBlockRotated(world, deco.stairID, this.getStairMeta(3 + rotation) + 4, 5, 5, 6, rotation, sbb); - this.placeBlockRotated(world, deco.stairID, this.getStairMeta(2 + rotation) + 4, 6, 5, 5, rotation, sbb); - this.placeBlockRotated(world, deco.stairID, this.getStairMeta(3 + rotation) + 4, 5, 12, 6, rotation, sbb); - this.placeBlockRotated(world, deco.stairID, this.getStairMeta(2 + rotation) + 4, 6, 12, 5, rotation, sbb); - } -} diff --git a/src/main/java/twilightforest/structures/stronghold/ComponentTFStrongholdBalconyRoom.java b/src/main/java/twilightforest/structures/stronghold/ComponentTFStrongholdBalconyRoom.java deleted file mode 100644 index 2f106f9715..0000000000 --- a/src/main/java/twilightforest/structures/stronghold/ComponentTFStrongholdBalconyRoom.java +++ /dev/null @@ -1,176 +0,0 @@ -package twilightforest.structures.stronghold; - -import java.util.List; -import java.util.Random; - -import net.minecraft.init.Blocks; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import net.minecraft.world.gen.structure.StructureComponent; - -public class ComponentTFStrongholdBalconyRoom extends StructureTFStrongholdComponent { - - boolean enterBottom; - - public ComponentTFStrongholdBalconyRoom() { - super(); - // TODO Auto-generated constructor stub - } - - public ComponentTFStrongholdBalconyRoom(int i, int facing, int x, int y, int z) { - super(i, facing, x, y, z); - } - - /** - * Save to NBT - */ - @Override - protected void func_143012_a(NBTTagCompound par1NBTTagCompound) { - super.func_143012_a(par1NBTTagCompound); - - par1NBTTagCompound.setBoolean("enterBottom", this.enterBottom); - } - - /** - * Load from NBT - */ - @Override - protected void func_143011_b(NBTTagCompound par1NBTTagCompound) { - super.func_143011_b(par1NBTTagCompound); - this.enterBottom = par1NBTTagCompound.getBoolean("enterBottom"); - } - - /** - * Make a bounding box for this room - */ - public StructureBoundingBox generateBoundingBox(int facing, int x, int y, int z) - { - - if (y > 17) - { - this.enterBottom = false; - } - else if (y < 11) - { - this.enterBottom = true; - } - else - { - this.enterBottom = (z & 1) == 0; - } - - if (enterBottom) - { - return StructureTFStrongholdComponent.getComponentToAddBoundingBox(x, y, z, -4, -1, 0, 18, 14, 27, facing); - } - else - { - // enter on the top - return StructureTFStrongholdComponent.getComponentToAddBoundingBox(x, y, z, -13, -8, 0, 18, 14, 27, facing); - } - } - - /** - * Initiates construction of the Structure Component picked, at the current Location of StructGen - */ - @Override - public void buildComponent(StructureComponent parent, List list, Random random) { - super.buildComponent(parent, list, random); - - // lower left exit - addNewComponent(parent, list, random, 0, 13, 1, 27); - - // lower middle right exit - addNewComponent(parent, list, random, 1, -1, 1, 13); - - // lower middle left exit - addNewComponent(parent, list, random, 3, 18, 1, 13); - - // upper left exit - addNewComponent(parent, list, random, 0, 4, 8, 27); - - // upper close right exit - addNewComponent(parent, list, random, 1, -1, 8, 4); - - // upper far left exit - addNewComponent(parent, list, random, 3, 18, 8, 22); - - if (this.enterBottom) - { - this.addDoor(4, 1, 0); - //this.addDoor(4, 1, 1); - addNewComponent(parent, list, random, 2, 13, 8, -1); - } - else - { - this.addDoor(13, 8, 0); - //this.addDoor(13, 8, 1); - addNewComponent(parent, list, random, 2, 4, 1, -1); - } - - - } - - /** - * Generate the blocks that go here - */ - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - placeStrongholdWalls(world, sbb, 0, 0, 0, 17, 13, 26, rand, deco.randomBlocks); - - // balcony - this.fillWithRandomizedBlocks(world, sbb, 1, 6, 1, 16, 7, 25, false, rand, deco.randomBlocks); - this.fillWithBlocks(world, sbb, 4, 8, 4, 13, 8, 22, deco.fenceID, Blocks.air, false); - this.fillWithAir(world, sbb, 5, 6, 5, 12, 8, 21); - - // stairs & pillars - placeStairsAndPillars(world, sbb, 0); - placeStairsAndPillars(world, sbb, 2); - - // doors - placeDoors(world, rand, sbb); - - return true; - } - - private void placeStairsAndPillars(World world, StructureBoundingBox sbb, int rotation) { - this.fillBlocksRotated(world, sbb, 4, 1, 4, 4, 12, 4, deco.pillarID, deco.pillarMeta, rotation); - this.placeBlockRotated(world, deco.stairID, this.getStairMeta(3 + rotation), 4, 1, 5, rotation, sbb); - this.placeBlockRotated(world, deco.stairID, this.getStairMeta(2 + rotation), 5, 1, 4, rotation, sbb); - this.placeBlockRotated(world, deco.stairID, this.getStairMeta(3 + rotation) + 4, 4, 5, 5, rotation, sbb); - this.placeBlockRotated(world, deco.stairID, this.getStairMeta(2 + rotation) + 4, 5, 5, 4, rotation, sbb); - this.placeBlockRotated(world, deco.stairID, this.getStairMeta(3 + rotation) + 4, 4, 12, 5, rotation, sbb); - this.placeBlockRotated(world, deco.stairID, this.getStairMeta(2 + rotation) + 4, 5, 12, 4, rotation, sbb); - - this.fillBlocksRotated(world, sbb, 13, 1, 4, 13, 12, 4, deco.pillarID, deco.pillarMeta, rotation); - this.placeBlockRotated(world, deco.stairID, this.getStairMeta(3 + rotation), 13, 1, 5, rotation, sbb); - this.placeBlockRotated(world, deco.stairID, this.getStairMeta(0 + rotation), 12, 1, 4, rotation, sbb); - this.placeBlockRotated(world, deco.stairID, this.getStairMeta(3 + rotation) + 4, 13, 5, 5, rotation, sbb); - this.placeBlockRotated(world, deco.stairID, this.getStairMeta(0 + rotation) + 4, 12, 5, 4, rotation, sbb); - this.placeBlockRotated(world, deco.stairID, this.getStairMeta(3 + rotation) + 4, 13, 12, 5, rotation, sbb); - this.placeBlockRotated(world, deco.stairID, this.getStairMeta(0 + rotation) + 4, 12, 12, 4, rotation, sbb); - - this.fillBlocksRotated(world, sbb, 13, 1, 8, 13, 12, 8, deco.pillarID, deco.pillarMeta, rotation); - this.placeBlockRotated(world, deco.stairID, this.getStairMeta(3 + rotation), 13, 1, 9, rotation, sbb); - this.placeBlockRotated(world, deco.stairID, this.getStairMeta(1 + rotation), 13, 1, 7, rotation, sbb); - this.placeBlockRotated(world, deco.stairID, this.getStairMeta(0 + rotation), 12, 1, 8, rotation, sbb); - this.placeBlockRotated(world, deco.stairID, this.getStairMeta(3 + rotation) + 4, 13, 5, 9, rotation, sbb); - this.placeBlockRotated(world, deco.stairID, this.getStairMeta(1 + rotation) + 4, 13, 5, 7, rotation, sbb); - this.placeBlockRotated(world, deco.stairID, this.getStairMeta(3 + rotation) + 4, 13, 12, 9, rotation, sbb); - this.placeBlockRotated(world, deco.stairID, this.getStairMeta(1 + rotation) + 4, 13, 12, 7, rotation, sbb); - this.placeBlockRotated(world, deco.stairID, this.getStairMeta(0 + rotation) + 4, 12, 12, 8, rotation, sbb); - - for (int y = 1; y < 8; y++) - { - for (int z = 5; z < 8; z++) - { - this.placeBlockRotated(world, Blocks.air, 0, y + 6, y + 1, z, rotation, sbb); - this.placeBlockRotated(world, deco.stairID, this.getStairMeta(0 + rotation), y + 6, y, z, rotation, sbb); - this.placeBlockRotated(world, deco.blockID, deco.blockMeta, y + 6, y - 1, z, rotation, sbb); - } - } - } - - -} diff --git a/src/main/java/twilightforest/structures/stronghold/ComponentTFStrongholdBossRoom.java b/src/main/java/twilightforest/structures/stronghold/ComponentTFStrongholdBossRoom.java deleted file mode 100644 index 36ea2c048f..0000000000 --- a/src/main/java/twilightforest/structures/stronghold/ComponentTFStrongholdBossRoom.java +++ /dev/null @@ -1,210 +0,0 @@ -package twilightforest.structures.stronghold; - -import java.util.List; -import java.util.Random; - -import net.minecraft.init.Blocks; -import net.minecraft.tileentity.TileEntitySign; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import net.minecraft.world.gen.structure.StructureComponent; -import twilightforest.block.TFBlocks; - -public class ComponentTFStrongholdBossRoom extends StructureTFStrongholdComponent { - - public ComponentTFStrongholdBossRoom() { - super(); - // TODO Auto-generated constructor stub - } - - public ComponentTFStrongholdBossRoom(int i, int facing, int x, int y, int z) { - super(i, facing, x, y, z); - this.spawnListIndex = Integer.MAX_VALUE; - } - - /** - * Make a bounding box for this room - */ - public StructureBoundingBox generateBoundingBox(int facing, int x, int y, int z) - { - return StructureTFStrongholdComponent.getComponentToAddBoundingBox(x, y, z, -13, -1, 0, 27, 7, 27, facing); - } - - /** - * Initiates construction of the Structure Component picked, at the current Location of StructGen - */ - @Override - public void buildComponent(StructureComponent parent, List list, Random random) { - super.buildComponent(parent, list, random); - - this.addDoor(13, 1, 0); - } - - /** - * Generate the blocks that go here - */ - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - placeStrongholdWalls(world, sbb, 0, 0, 0, 26, 6, 26, rand, deco.randomBlocks); - - // inner walls - this.fillWithRandomizedBlocks(world, sbb, 1, 1, 1, 3, 5, 25, false, rand, deco.randomBlocks); - this.fillWithRandomizedBlocks(world, sbb, 23, 1, 1, 25, 5, 25, false, rand, deco.randomBlocks); - this.fillWithRandomizedBlocks(world, sbb, 4, 1, 1, 22, 5, 3, false, rand, deco.randomBlocks); - this.fillWithRandomizedBlocks(world, sbb, 4, 1, 23, 22, 5, 25, false, rand, deco.randomBlocks); - - // obsidian filler - this.fillWithMetadataBlocks(world, sbb, 1, 1, 1, 2, 5, 25, Blocks.obsidian, 0, Blocks.obsidian, 0, false); - this.fillWithMetadataBlocks(world, sbb, 24, 1, 1, 25, 5, 25, Blocks.obsidian, 0, Blocks.obsidian, 0, false); - this.fillWithMetadataBlocks(world, sbb, 4, 1, 1, 22, 5, 2, Blocks.obsidian, 0, Blocks.obsidian, 0, false); - this.fillWithMetadataBlocks(world, sbb, 4, 1, 24, 22, 5, 25, Blocks.obsidian, 0, Blocks.obsidian, 0, false); - - // corner pillars - this.fillWithRandomizedBlocks(world, sbb, 4, 1, 4, 4, 5, 7, false, rand, deco.randomBlocks); - this.fillWithRandomizedBlocks(world, sbb, 5, 1, 4, 5, 5, 5, false, rand, deco.randomBlocks); - this.fillWithRandomizedBlocks(world, sbb, 6, 1, 4, 7, 5, 4, false, rand, deco.randomBlocks); - - this.fillWithRandomizedBlocks(world, sbb, 4, 1, 19, 4, 5, 22, false, rand, deco.randomBlocks); - this.fillWithRandomizedBlocks(world, sbb, 5, 1, 21, 5, 5, 22, false, rand, deco.randomBlocks); - this.fillWithRandomizedBlocks(world, sbb, 6, 1, 22, 7, 5, 22, false, rand, deco.randomBlocks); - - this.fillWithRandomizedBlocks(world, sbb, 22, 1, 4, 22, 5, 7, false, rand, deco.randomBlocks); - this.fillWithRandomizedBlocks(world, sbb, 21, 1, 4, 21, 5, 5, false, rand, deco.randomBlocks); - this.fillWithRandomizedBlocks(world, sbb, 19, 1, 4, 20, 5, 4, false, rand, deco.randomBlocks); - - this.fillWithRandomizedBlocks(world, sbb, 22, 1, 19, 22, 5, 22, false, rand, deco.randomBlocks); - this.fillWithRandomizedBlocks(world, sbb, 21, 1, 21, 21, 5, 22, false, rand, deco.randomBlocks); - this.fillWithRandomizedBlocks(world, sbb, 19, 1, 22, 20, 5, 22, false, rand, deco.randomBlocks); - - // pillar decorations (stairs) - placePillarDecorations(world, sbb, 0); - placePillarDecorations(world, sbb, 1); - placePillarDecorations(world, sbb, 2); - placePillarDecorations(world, sbb, 3); - - // sarcophagi - placeSarcophagus(world, sbb, 8, 1, 8, 0); - placeSarcophagus(world, sbb, 13, 1, 8, 0); - placeSarcophagus(world, sbb, 18, 1, 8, 0); - - placeSarcophagus(world, sbb, 8, 1, 15, 0); - placeSarcophagus(world, sbb, 13, 1, 15, 0); - placeSarcophagus(world, sbb, 18, 1, 15, 0); - - - // doorway - this.fillWithAir(world, sbb, 12, 1, 1, 14, 4, 2); - this.fillWithBlocks(world, sbb, 12, 1, 3, 14, 4, 3, Blocks.iron_bars, Blocks.iron_bars, false); - - int var8 = this.getXWithOffset(0, 0); - int var9 = this.getYWithOffset(0); - int var10 = this.getZWithOffset(0, 0); - - //System.out.println("Drawing stronghold boss room at " + var8 + ", " + var9 + ", " + var10); - - - //spawner - placeBlockAtCurrentPosition(world, TFBlocks.bossSpawner, 4, 13, 2, 13, sbb); - - - // out of order - //this.placeSignAtCurrentPosition(world, 13, 1, 5, "Boss Room", "Out of Order", sbb); - - - // doors - placeDoors(world, rand, sbb); - - return true; - } - - - - private void placeSarcophagus(World world, StructureBoundingBox sbb, int x, int y, int z, int rotation) { - - this.placeBlockRotated(world, deco.pillarID, deco.pillarMeta, x + 1, y, z + 0, rotation, sbb); - this.placeBlockRotated(world, deco.pillarID, deco.pillarMeta, x - 1, y, z + 0, rotation, sbb); - this.placeBlockRotated(world, deco.pillarID, deco.pillarMeta, x + 1, y, z + 3, rotation, sbb); - this.placeBlockRotated(world, deco.pillarID, deco.pillarMeta, x - 1, y, z + 3, rotation, sbb); - - // make either torches or fence posts - - if (world.rand.nextInt(7) == 0) - { - this.placeBlockRotated(world, Blocks.torch, 0, x + 1, y + 1, z + 0, rotation, sbb); - } - else - { - this.placeBlockRotated(world, deco.fenceID, deco.fenceMeta, x + 1, y + 1, z + 0, rotation, sbb); - } - if (world.rand.nextInt(7) == 0) - { - this.placeBlockRotated(world, Blocks.torch, 0, x - 1, y + 1, z + 0, rotation, sbb); - } - else - { - this.placeBlockRotated(world, deco.fenceID, deco.fenceMeta, x - 1, y + 1, z + 0, rotation, sbb); - } - if (world.rand.nextInt(7) == 0) - { - this.placeBlockRotated(world, Blocks.torch, 0, x + 1, y + 1, z + 3, rotation, sbb); - } - else - { - this.placeBlockRotated(world, deco.fenceID, deco.fenceMeta, x + 1, y + 1, z + 3, rotation, sbb); - } - if (world.rand.nextInt(7) == 0) - { - this.placeBlockRotated(world, Blocks.torch, 0, x - 1, y + 1, z + 3, rotation, sbb); - } - else - { - this.placeBlockRotated(world, deco.fenceID, deco.fenceMeta, x - 1, y + 1, z + 3, rotation, sbb); - } - - this.placeBlockRotated(world, deco.stairID, this.getStairMeta(1 + rotation), x + 0, y, z + 0, rotation, sbb); - this.placeBlockRotated(world, deco.stairID, this.getStairMeta(3 + rotation), x + 0, y, z + 3, rotation, sbb); - - this.placeBlockRotated(world, deco.stairID, this.getStairMeta(2 + rotation), x + 1, y, z + 1, rotation, sbb); - this.placeBlockRotated(world, deco.stairID, this.getStairMeta(2 + rotation), x + 1, y, z + 2, rotation, sbb); - this.placeBlockRotated(world, deco.stairID, this.getStairMeta(0 + rotation), x - 1, y, z + 1, rotation, sbb); - this.placeBlockRotated(world, deco.stairID, this.getStairMeta(0 + rotation), x - 1, y, z + 2, rotation, sbb); - - this.placeBlockRotated(world, Blocks.stone_slab, 0, x + 0, y + 1, z + 1, rotation, sbb); - this.placeBlockRotated(world, Blocks.stone_slab, 0, x + 0, y + 1, z + 2, rotation, sbb); - - } - - protected void placePillarDecorations(World world, StructureBoundingBox sbb, int rotation) { - this.placeBlockRotated(world, deco.stairID, this.getStairMeta(3 + rotation), 4, 1, 8, rotation, sbb); - this.placeBlockRotated(world, deco.stairID, this.getStairMeta(2 + rotation), 8, 1, 4, rotation, sbb); - this.placeBlockRotated(world, deco.stairID, this.getStairMeta(3 + rotation) + 4, 4, 5, 8, rotation, sbb); - this.placeBlockRotated(world, deco.stairID, this.getStairMeta(2 + rotation) + 4, 8, 5, 4, rotation, sbb); - this.placeBlockRotated(world, deco.stairID, this.getStairMeta(3 + rotation), 5, 1, 6, rotation, sbb); - this.placeBlockRotated(world, deco.stairID, this.getStairMeta(2 + rotation), 6, 1, 6, rotation, sbb); - this.placeBlockRotated(world, deco.stairID, this.getStairMeta(2 + rotation), 6, 1, 5, rotation, sbb); - this.placeBlockRotated(world, deco.stairID, this.getStairMeta(3 + rotation) + 4, 5, 5, 6, rotation, sbb); - this.placeBlockRotated(world, deco.stairID, this.getStairMeta(2 + rotation) + 4, 6, 5, 6, rotation, sbb); - this.placeBlockRotated(world, deco.stairID, this.getStairMeta(2 + rotation) + 4, 6, 5, 5, rotation, sbb); - } - - /** - * Make a doorway - this is the iron fence door - */ - protected void placeDoorwayAt(World world, Random rand, int x, int y, int z, StructureBoundingBox sbb) { - if (x == 0 || x == getXSize()) - { - this.fillWithMetadataBlocks(world, sbb, x, y, z - 1, x, y + 3, z + 1, Blocks.iron_bars, 0, Blocks.air, 0, false); - } - else - { - this.fillWithMetadataBlocks(world, sbb, x - 1, y, z, x + 1, y + 3, z, Blocks.iron_bars, 0, Blocks.air, 0, false); - } - } - - /** - * Is the specified point a valid spot to break in? - */ - protected boolean isValidBreakInPoint(int wx, int wy, int wz) { - return false; - } -} diff --git a/src/main/java/twilightforest/structures/stronghold/ComponentTFStrongholdCrossing.java b/src/main/java/twilightforest/structures/stronghold/ComponentTFStrongholdCrossing.java deleted file mode 100644 index 4a66e6b920..0000000000 --- a/src/main/java/twilightforest/structures/stronghold/ComponentTFStrongholdCrossing.java +++ /dev/null @@ -1,91 +0,0 @@ -package twilightforest.structures.stronghold; - -import java.util.List; -import java.util.Random; - -import net.minecraft.init.Blocks; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import net.minecraft.world.gen.structure.StructureComponent; - -public class ComponentTFStrongholdCrossing extends StructureTFStrongholdComponent { - - public ComponentTFStrongholdCrossing() { - super(); - // TODO Auto-generated constructor stub - } - - public ComponentTFStrongholdCrossing(int i, int facing, int x, int y, int z) { - super(i, facing, x, y, z); - } - - /** - * Make a bounding box for this room - */ - public StructureBoundingBox generateBoundingBox(int facing, int x, int y, int z) - { - return StructureTFStrongholdComponent.getComponentToAddBoundingBox(x, y, z, -13, -1, 0, 18, 7, 18, facing); - } - - /** - * Initiates construction of the Structure Component picked, at the current Location of StructGen - */ - @Override - public void buildComponent(StructureComponent parent, List list, Random random) { - super.buildComponent(parent, list, random); - - this.addDoor(13, 1, 0); - addNewComponent(parent, list, random, 0, 4, 1, 18); - addNewComponent(parent, list, random, 1, -1, 1, 13); - addNewComponent(parent, list, random, 3, 18, 1, 4); - } - - /** - * Generate the blocks that go here - */ - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - placeStrongholdWalls(world, sbb, 0, 0, 0, 17, 6, 17, rand, deco.randomBlocks); - - // statues - placeCornerStatue(world, 2, 1, 2, 0, sbb); - placeCornerStatue(world, 15, 1, 15, 3, sbb); - - // center pillar - this.fillBlocksRotated(world, sbb, 8, 1, 8, 9, 5, 9, deco.pillarID, deco.pillarMeta, 0); - - // statues - placeWallStatue(world, 8, 1, 7, 0, sbb); - placeWallStatue(world, 7, 1, 9, 3, sbb); - placeWallStatue(world, 9, 1, 10, 2, sbb); - placeWallStatue(world, 10, 1, 8, 1, sbb); - - - // tables - placeTableAndChairs(world, sbb, 0); - placeTableAndChairs(world, sbb, 1); - placeTableAndChairs(world, sbb, 2); - placeTableAndChairs(world, sbb, 3); - - // doors - placeDoors(world, rand, sbb); - - return true; - } - - private void placeTableAndChairs(World world, StructureBoundingBox sbb, int rotation) { - // table - this.placeBlockRotated(world, Blocks.oak_stairs, this.getStairMeta(0 + rotation) + 4, 5, 1, 3, rotation, sbb); - this.placeBlockRotated(world, Blocks.oak_stairs, this.getStairMeta(3 + rotation) + 4, 5, 1, 4, rotation, sbb); - this.placeBlockRotated(world, Blocks.oak_stairs, this.getStairMeta(1 + rotation) + 4, 6, 1, 3, rotation, sbb); - this.placeBlockRotated(world, Blocks.oak_stairs, this.getStairMeta(2 + rotation) + 4, 6, 1, 4, rotation, sbb); - // chairs - this.placeBlockRotated(world, Blocks.spruce_stairs, this.getStairMeta(3 + rotation), 5, 1, 2, rotation, sbb); - this.placeBlockRotated(world, Blocks.spruce_stairs, this.getStairMeta(0 + rotation), 7, 1, 3, rotation, sbb); - this.placeBlockRotated(world, Blocks.spruce_stairs, this.getStairMeta(1 + rotation), 6, 1, 5, rotation, sbb); - this.placeBlockRotated(world, Blocks.spruce_stairs, this.getStairMeta(2 + rotation), 4, 1, 4, rotation, sbb); - } - - - -} diff --git a/src/main/java/twilightforest/structures/stronghold/ComponentTFStrongholdDeadEnd.java b/src/main/java/twilightforest/structures/stronghold/ComponentTFStrongholdDeadEnd.java deleted file mode 100644 index 074e09f056..0000000000 --- a/src/main/java/twilightforest/structures/stronghold/ComponentTFStrongholdDeadEnd.java +++ /dev/null @@ -1,105 +0,0 @@ -package twilightforest.structures.stronghold; - -import java.util.List; -import java.util.Random; - -import net.minecraft.init.Blocks; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import net.minecraft.world.gen.structure.StructureComponent; -import twilightforest.TFTreasure; - -public class ComponentTFStrongholdDeadEnd extends StructureTFStrongholdComponent { - - - private boolean chestTrapped; - - public ComponentTFStrongholdDeadEnd() { - super(); - // TODO Auto-generated constructor stub - } - - public ComponentTFStrongholdDeadEnd(int i, int facing, int x, int y, int z) { - super(i, facing, x, y, z); - } - - /** - * Save to NBT - */ - @Override - protected void func_143012_a(NBTTagCompound par1NBTTagCompound) { - super.func_143012_a(par1NBTTagCompound); - - par1NBTTagCompound.setBoolean("chestTrapped", this.chestTrapped); - } - - /** - * Load from NBT - */ - @Override - protected void func_143011_b(NBTTagCompound par1NBTTagCompound) { - super.func_143011_b(par1NBTTagCompound); - - this.chestTrapped = par1NBTTagCompound.getBoolean("chestTrapped"); - } - - - /** - * Make a bounding box for this room - */ - public StructureBoundingBox generateBoundingBox(int facing, int x, int y, int z) - { - return StructureTFStrongholdComponent.getComponentToAddBoundingBox(x, y, z, -4, -1, 0, 9, 6, 9, facing); - } - - /** - * Initiates construction of the Structure Component picked, at the current Location of StructGen - */ - @Override - public void buildComponent(StructureComponent parent, List list, Random random) { - super.buildComponent(parent, list, random); - - // entrance - this.addDoor(4, 1, 0); - - this.chestTrapped = random.nextInt(3) == 0; - } - - /** - * Generate the blocks that go here - */ - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - placeStrongholdWalls(world, sbb, 0, 0, 0, 8, 6, 8, rand, deco.randomBlocks); - - // statues - this.placeWallStatue(world, 1, 1, 4, 1, sbb); - this.placeWallStatue(world, 7, 1, 4, 3, sbb); - this.placeWallStatue(world, 4, 1, 7, 0, sbb); - - // doors - placeDoors(world, rand, sbb); - - // treasure - this.placeTreasureAtCurrentPosition(world, rand, 4, 1, 3, TFTreasure.stronghold_cache, this.chestTrapped, sbb); - if (this.chestTrapped) - { - this.placeBlockAtCurrentPosition(world, Blocks.tnt, 0, 4, 0, 3, sbb); - } - - for (int z = 2; z < 5; z++) - { - this.placeBlockAtCurrentPosition(world, deco.stairID, this.getStairMeta(0), 3, 1, z, sbb); - this.placeBlockAtCurrentPosition(world, deco.stairID, this.getStairMeta(2), 5, 1, z, sbb); - } - - this.placeBlockAtCurrentPosition(world, deco.stairID, this.getStairMeta(1), 4, 1, 2, sbb); - this.placeBlockAtCurrentPosition(world, deco.stairID, this.getStairMeta(3), 4, 1, 4, sbb); - this.placeBlockAtCurrentPosition(world, deco.stairID, this.getStairMeta(1), 4, 2, 3, sbb); - - return true; - } - - -} diff --git a/src/main/java/twilightforest/structures/stronghold/ComponentTFStrongholdEntrance.java b/src/main/java/twilightforest/structures/stronghold/ComponentTFStrongholdEntrance.java deleted file mode 100644 index 4025d48600..0000000000 --- a/src/main/java/twilightforest/structures/stronghold/ComponentTFStrongholdEntrance.java +++ /dev/null @@ -1,174 +0,0 @@ -package twilightforest.structures.stronghold; - -import java.util.List; -import java.util.Random; - -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import net.minecraft.world.gen.structure.StructureComponent; - -public class ComponentTFStrongholdEntrance extends StructureTFStrongholdComponent { - - public TFStrongholdPieces lowerPieces; - - public ComponentTFStrongholdEntrance() { - super(); - } - - public ComponentTFStrongholdEntrance(World world, Random rand, int i, int x, int y, int z) { - super(i, 0, x, y - 10, z); - - this.deco = new StructureTFDecoratorStronghold(); - - lowerPieces = new TFStrongholdPieces(); - } - - /** - * Initiates construction of the Structure Component picked, at the current Location of StructGen - */ - @Override - public void buildComponent(StructureComponent parent, List list, Random random) { - super.buildComponent(parent, list, random); - - // make a random component in each direction - lowerPieces.prepareStructurePieces(); - addNewComponent(parent, list, random, 0, 4, 1, 18); - lowerPieces.prepareStructurePieces(); - if (!listContainsBossRoom(list)) - { - //System.out.println("Did not find boss room from exit 0"); - } - else - { - lowerPieces.markBossRoomUsed(); - } - addNewComponent(parent, list, random, 1, -1, 1, 13); - lowerPieces.prepareStructurePieces(); - if (!listContainsBossRoom(list)) - { - //System.out.println("Did not find boss room from exit 1"); - } - else - { - lowerPieces.markBossRoomUsed(); - } - addNewComponent(parent, list, random, 2, 13, 1, -1); - lowerPieces.prepareStructurePieces(); - if (!listContainsBossRoom(list)) - { - //System.out.println("Did not find boss room from exit 2"); - } - else - { - lowerPieces.markBossRoomUsed(); - } - addNewComponent(parent, list, random, 3, 18, 1, 4); - if (!listContainsBossRoom(list)) - { - System.out.println("Did not find boss room from exit 3 - EPIC FAIL"); - } - List pieceList = (List)list; - StructureBoundingBox shieldBox = new StructureBoundingBox(this.boundingBox); - - int tStairs = 0; - int tCorridors = 0; - int deadEnd = 0; - int tRooms = 0; - int bossRooms = 0; - - // compute and generate MEGASHIELD - for (StructureTFStrongholdComponent component : pieceList) - { - shieldBox.expandTo(component.getBoundingBox()); - - - if (component instanceof ComponentTFStrongholdSmallStairs && ((ComponentTFStrongholdSmallStairs)component).hasTreasure) - { - tStairs++; - } - if (component instanceof ComponentTFStrongholdTreasureCorridor) - { - tCorridors++; - } - if (component instanceof ComponentTFStrongholdDeadEnd) - { - deadEnd++; - } - if (component instanceof ComponentTFStrongholdTreasureRoom) - { - tRooms++; - } - if (component instanceof ComponentTFStrongholdBossRoom) - { - bossRooms++; - } - } - -// System.out.printf("MEGASHIELD computed! %d, %d, %d to %d, %d, %d.\n", shieldBox.minX, shieldBox.minY, shieldBox.minZ, shieldBox.maxX, shieldBox.maxY, shieldBox.maxZ); -// System.out.printf("Stronghold at this point contains %d elements.\n", pieceList.size()); -// -// System.out.printf("Room count! TStairs = %d, TCorr = %d, Dead End = %d, TRoom = %d, Boss = %d \n", tStairs, tCorridors, deadEnd, tRooms, bossRooms); - -// StructureTFStrongholdShield shield = new StructureTFStrongholdShield(shieldBox.minX - 1, shieldBox.minY, shieldBox.minZ - 1, shieldBox.maxX, shieldBox.maxY, shieldBox.maxZ); -// list.add(shield); - - // add the upper stronghold - StructureTFStrongholdComponent accessChamber = new ComponentTFStrongholdAccessChamber(2, this.getCoordBaseMode(), boundingBox.minX + 8, boundingBox.minY + 7, boundingBox.minZ + 4); - list.add(accessChamber); - accessChamber.buildComponent(this, list, random); - - - } - - private boolean listContainsBossRoom(List list) { - for (StructureTFStrongholdComponent component : (List)list) - { - if (component instanceof ComponentTFStrongholdBossRoom) - { - return true; - } - } - - return false; - } - - /** - * Make a bounding box for this room - */ - public StructureBoundingBox generateBoundingBox(int facing, int x, int y, int z) - { - return StructureBoundingBox.getComponentToAddBoundingBox(x, y, z, -1, -1, 0, 18, 7, 18, facing); - } - - /** - * Generate the blocks that go here - */ - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - placeStrongholdWalls(world, sbb, 0, 0, 0, 17, 6, 17, rand, deco.randomBlocks); - - int var8 = this.getXWithOffset(0, 0); - int var9 = this.getYWithOffset(0); - int var10 = this.getZWithOffset(0, 0); - - //System.out.println("Drawing STRONGHOLD entrance at " + var8 + ", " + var9 + ", " + var10); - - // statues - placeCornerStatue(world, 5, 1, 5, 0, sbb); - placeCornerStatue(world, 5, 1, 12, 1, sbb); - placeCornerStatue(world, 12, 1, 5, 2, sbb); - placeCornerStatue(world, 12, 1, 12, 3, sbb); - - // statues - this.placeWallStatue(world, 9, 1, 16, 0, sbb); - this.placeWallStatue(world, 1, 1, 9, 1, sbb); - this.placeWallStatue(world, 8, 1, 1, 2, sbb); - this.placeWallStatue(world, 16, 1, 8, 3, sbb); - - // doors - this.placeDoors(world, rand, sbb); - - return true; - } - -} diff --git a/src/main/java/twilightforest/structures/stronghold/ComponentTFStrongholdFoundry.java b/src/main/java/twilightforest/structures/stronghold/ComponentTFStrongholdFoundry.java deleted file mode 100644 index a2a7b4b82b..0000000000 --- a/src/main/java/twilightforest/structures/stronghold/ComponentTFStrongholdFoundry.java +++ /dev/null @@ -1,246 +0,0 @@ -package twilightforest.structures.stronghold; - -import java.util.List; -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.init.Blocks; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import net.minecraft.world.gen.structure.StructureComponent; - -public class ComponentTFStrongholdFoundry extends StructureTFStrongholdComponent { - - int entranceLevel; - - public ComponentTFStrongholdFoundry() { - super(); - // TODO Auto-generated constructor stub - } - - public ComponentTFStrongholdFoundry(int i, int facing, int x, int y, int z) { - super(i, facing, x, y, z); - } - - /** - * Save to NBT - */ - @Override - protected void func_143012_a(NBTTagCompound par1NBTTagCompound) { - super.func_143012_a(par1NBTTagCompound); - - par1NBTTagCompound.setInteger("entranceLevel", this.entranceLevel); - } - - /** - * Load from NBT - */ - @Override - protected void func_143011_b(NBTTagCompound par1NBTTagCompound) { - super.func_143011_b(par1NBTTagCompound); - this.entranceLevel = par1NBTTagCompound.getInteger("entranceLevel"); - } - - @Override - public StructureBoundingBox generateBoundingBox(int facing, int x, int y, int z) { - if (y > 17) - { - this.entranceLevel = 3; - return StructureTFStrongholdComponent.getComponentToAddBoundingBox(x, y, z, -4, -20, 0, 18, 25, 18, facing); - } - else if (y < 11) - { - this.entranceLevel = 1; - return StructureTFStrongholdComponent.getComponentToAddBoundingBox(x, y, z, -4, -6, 0, 18, 25, 18, facing); - } - else - { - this.entranceLevel = 2; - return StructureTFStrongholdComponent.getComponentToAddBoundingBox(x, y, z, -4, -13, 0, 18, 25, 18, facing); - } - } - - /** - * Initiates construction of the Structure Component picked, at the current Location of StructGen - */ - @Override - public void buildComponent(StructureComponent parent, List list, Random random) { - super.buildComponent(parent, list, random); - - switch (this.entranceLevel) - { - case 1: - this.addDoor(4, 6, 0); - addNewComponent(parent, list, random, 1, -1, 13, 13); - addNewComponent(parent, list, random, 3, 18, 13, 4); - addNewComponent(parent, list, random, 0, 13, 20, 18); - break; - case 2: - this.addDoor(4, 13, 0); - addNewComponent(parent, list, random, 1, -1, 6, 13); - addNewComponent(parent, list, random, 3, 18, 20, 4); - addNewComponent(parent, list, random, 0, 13, 13, 18); - break; - case 3: - this.addDoor(4, 20, 0); - addNewComponent(parent, list, random, 0, 13, 6, 18); - addNewComponent(parent, list, random, 1, -1, 13, 13); - addNewComponent(parent, list, random, 3, 18, 13, 4); - } - - - } - - /** - * Generate the blocks that go here - */ - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - placeStrongholdWalls(world, sbb, 0, 0, 0, 17, 25, 17, rand, deco.randomBlocks); - - // lava bottom - this.fillWithBlocks(world, sbb, 1, 0, 1, 16, 4, 16, Blocks.lava, Blocks.lava, false); - - // top ledge - this.fillWithRandomizedBlocks(world, sbb, 1, 19, 1, 16, 19, 16, false, rand, deco.randomBlocks); - this.fillWithAir(world, sbb, 2, 19, 2, 15, 19, 15); - - // middle ledge - this.fillWithRandomizedBlocks(world, sbb, 1, 12, 1, 16, 12, 16, false, rand, deco.randomBlocks); - this.fillWithAir(world, sbb, 2, 12, 2, 15, 12, 15); - - // bottom ledge - this.fillWithRandomizedBlocks(world, sbb, 1, 5, 1, 16, 5, 16, false, rand, deco.randomBlocks); - this.fillWithAir(world, sbb, 2, 5, 2, 15, 5, 15); - - // corner pillars - this.fillWithRandomizedBlocks(world, sbb, 1, 1, 1, 1, 24, 2, false, rand, deco.randomBlocks); - this.fillWithRandomizedBlocks(world, sbb, 2, 1, 1, 2, 24, 1, false, rand, deco.randomBlocks); - - this.fillWithRandomizedBlocks(world, sbb, 16, 1, 1, 16, 24, 2, false, rand, deco.randomBlocks); - this.fillWithRandomizedBlocks(world, sbb, 15, 1, 1, 15, 24, 1, false, rand, deco.randomBlocks); - - this.fillWithRandomizedBlocks(world, sbb, 1, 1, 15, 1, 24, 16, false, rand, deco.randomBlocks); - this.fillWithRandomizedBlocks(world, sbb, 2, 1, 16, 2, 24, 16, false, rand, deco.randomBlocks); - - this.fillWithRandomizedBlocks(world, sbb, 16, 1, 15, 16, 24, 16, false, rand, deco.randomBlocks); - this.fillWithRandomizedBlocks(world, sbb, 15, 1, 16, 15, 24, 16, false, rand, deco.randomBlocks); - - // suspended mass - Random massRandom = new Random(rand.nextLong()); - - for (int x = 4; x < 14; x++) - { - for (int z = 4; z < 14; z++) - { - for (int y = 8; y < 23; y++) - { - float c = Math.abs(x - 8.5F) + Math.abs(z - 8.5F) + Math.abs(y - 18F); - float r = 5.5F + ((massRandom.nextFloat() - massRandom.nextFloat()) * 3.5F); - - if (c < r) - { - this.placeBlockAtCurrentPosition(world, Blocks.stone, 0, x, y, z, sbb); - } - } - } - } - - // drips - for (int i = 0; i < 400; i++) - { - int dx = massRandom.nextInt(9) + 5; - int dz = massRandom.nextInt(9) + 5; - int dy = massRandom.nextInt(13) + 10; - - if (this.getBlockAtCurrentPosition(world, dx, dy, dz, sbb) != Blocks.air) - { - for (int y = 0; y < 3; y++) - { - this.placeBlockAtCurrentPosition(world, Blocks.stone, 0, dx, dy - y, dz, sbb); - } - } - } - - // add some redstone ore - for (int i = 0; i < 8; i++) - { - Block blockID = Blocks.redstone_ore; - int blockMeta = 0; - - addOreToMass(world, sbb, massRandom, blockID, blockMeta); - } - - // add some iron ore - for (int i = 0; i < 8; i++) - { - Block blockID = Blocks.iron_ore; - int blockMeta = 0; - - addOreToMass(world, sbb, massRandom, blockID, blockMeta); - } - - // add some gold ore - for (int i = 0; i < 6; i++) - { - Block blockID = Blocks.gold_ore; - int blockMeta = 0; - - addOreToMass(world, sbb, massRandom, blockID, blockMeta); - } - - // add some glowstone - for (int i = 0; i < 2; i++) - { - Block blockID = Blocks.glowstone; - int blockMeta = 0; - - addOreToMass(world, sbb, massRandom, blockID, blockMeta); - } - - - // add some emerald ore - for (int i = 0; i < 2; i++) - { - Block blockID = Blocks.emerald_ore; - int blockMeta = 0; - - addOreToMass(world, sbb, massRandom, blockID, blockMeta); - } - - // add some diamond ore - for (int i = 0; i < 4; i++) - { - Block blockID = Blocks.diamond_ore; - int blockMeta = 0; - - addOreToMass(world, sbb, massRandom, blockID, blockMeta); - } - - // doors - placeDoors(world, rand, sbb); - - return true; - } - - /** - * Add a block of ore to the mass - */ - private void addOreToMass(World world, StructureBoundingBox sbb, Random massRandom, Block blockID, int blockMeta) { - for (int i = 0; i < 10; i++) - { - int dx = massRandom.nextInt(9) + 5; - int dz = massRandom.nextInt(9) + 5; - int dy = massRandom.nextInt(13) + 10; - - if (this.getBlockAtCurrentPosition(world, dx, dy, dz, sbb) != Blocks.air) - { - this.placeBlockAtCurrentPosition(world, blockID, blockMeta, dx, dy, dz, sbb); - // we have succeeded, stop looping - break; - } - } - } - -} diff --git a/src/main/java/twilightforest/structures/stronghold/ComponentTFStrongholdLeftTurn.java b/src/main/java/twilightforest/structures/stronghold/ComponentTFStrongholdLeftTurn.java deleted file mode 100644 index 8daaba9469..0000000000 --- a/src/main/java/twilightforest/structures/stronghold/ComponentTFStrongholdLeftTurn.java +++ /dev/null @@ -1,71 +0,0 @@ -package twilightforest.structures.stronghold; - -import java.util.List; -import java.util.Random; - -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import net.minecraft.world.gen.structure.StructureComponent; - -public class ComponentTFStrongholdLeftTurn extends StructureTFStrongholdComponent { - - - public ComponentTFStrongholdLeftTurn() { - super(); - // TODO Auto-generated constructor stub - } - - public ComponentTFStrongholdLeftTurn(int i, int facing, int x, int y, int z) { - super(i, facing, x, y, z); - } - - /** - * Make a bounding box for this room - */ - public StructureBoundingBox generateBoundingBox(int facing, int x, int y, int z) - { - return StructureTFStrongholdComponent.getComponentToAddBoundingBox(x, y, z, -4, -1, 0, 9, 7, 9, facing); - } - - /** - * Initiates construction of the Structure Component picked, at the current Location of StructGen - */ - @Override - public void buildComponent(StructureComponent parent, List list, Random random) { - super.buildComponent(parent, list, random); - - // entrance - this.addDoor(4, 1, 0); - - // make a random component to the left - addNewComponent(parent, list, random, 3, 9, 1, 4); - - } - - /** - * Generate the blocks that go here - */ - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - placeStrongholdWalls(world, sbb, 0, 0, 0, 8, 6, 8, rand, deco.randomBlocks); - - // clear inside - fillWithAir(world, sbb, 1, 1, 1, 7, 5, 7); - -// // entrance doorway -// placeDoorwayAt(world, rand, 2, 4, 1, 0, sbb); -// -// // left turn doorway -// placeDoorwayAt(world, rand, 1, 8, 1, 4, sbb); - - // statue - placeCornerStatue(world, 2, 1, 6, 1, sbb); - - // doors - placeDoors(world, rand, sbb); - - return true; - } - - -} diff --git a/src/main/java/twilightforest/structures/stronghold/ComponentTFStrongholdRightTurn.java b/src/main/java/twilightforest/structures/stronghold/ComponentTFStrongholdRightTurn.java deleted file mode 100644 index 2af7a8b8e0..0000000000 --- a/src/main/java/twilightforest/structures/stronghold/ComponentTFStrongholdRightTurn.java +++ /dev/null @@ -1,71 +0,0 @@ -package twilightforest.structures.stronghold; - -import java.util.List; -import java.util.Random; - -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import net.minecraft.world.gen.structure.StructureComponent; - -public class ComponentTFStrongholdRightTurn extends StructureTFStrongholdComponent { - - - public ComponentTFStrongholdRightTurn() { - super(); - // TODO Auto-generated constructor stub - } - - public ComponentTFStrongholdRightTurn(int i, int facing, int x, int y, int z) { - super(i, facing, x, y, z); - } - - /** - * Make a bounding box for this room - */ - public StructureBoundingBox generateBoundingBox(int facing, int x, int y, int z) - { - return StructureTFStrongholdComponent.getComponentToAddBoundingBox(x, y, z, -4, -1, 0, 9, 7, 9, facing); - } - - /** - * Initiates construction of the Structure Component picked, at the current Location of StructGen - */ - @Override - public void buildComponent(StructureComponent parent, List list, Random random) { - super.buildComponent(parent, list, random); - - // entrance - this.addDoor(4, 1, 0); - - // make a random component to the right - addNewComponent(parent, list, random, 1, -1, 1, 4); - - } - - /** - * Generate the blocks that go here - */ - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - placeStrongholdWalls(world, sbb, 0, 0, 0, 8, 6, 8, rand, deco.randomBlocks); - - // clear inside - fillWithAir(world, sbb, 1, 1, 1, 7, 5, 7); - -// // entrance doorway -// placeDoorwayAt(world, rand, 2, 4, 1, 0, sbb); -// -// // right turn doorway -// placeDoorwayAt(world, rand, 1, 0, 1, 4, sbb); - - // statue - placeCornerStatue(world, 6, 1, 6, 3, sbb); - - // doors - placeDoors(world, rand, sbb); - - return true; - } - - -} diff --git a/src/main/java/twilightforest/structures/stronghold/ComponentTFStrongholdSmallHallway.java b/src/main/java/twilightforest/structures/stronghold/ComponentTFStrongholdSmallHallway.java deleted file mode 100644 index c09d9a205e..0000000000 --- a/src/main/java/twilightforest/structures/stronghold/ComponentTFStrongholdSmallHallway.java +++ /dev/null @@ -1,64 +0,0 @@ -package twilightforest.structures.stronghold; - -import java.util.List; -import java.util.Random; - -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import net.minecraft.world.gen.structure.StructureComponent; - -public class ComponentTFStrongholdSmallHallway extends StructureTFStrongholdComponent { - - - public ComponentTFStrongholdSmallHallway() { - super(); - // TODO Auto-generated constructor stub - } - - public ComponentTFStrongholdSmallHallway(int i, int facing, int x, int y, int z) { - super(i, facing, x, y, z); - } - - /** - * Make a bounding box for this room - */ - public StructureBoundingBox generateBoundingBox(int facing, int x, int y, int z) - { - return StructureTFStrongholdComponent.getComponentToAddBoundingBox(x, y, z, -4, -1, 0, 9, 7, 18, facing); - } - - - /** - * Initiates construction of the Structure Component picked, at the current Location of StructGen - */ - @Override - public void buildComponent(StructureComponent parent, List list, Random random) { - super.buildComponent(parent, list, random); - - // entrance - this.addDoor(4, 1, 0); - - // make a random component at the end - addNewComponent(parent, list, random, 0, 4, 1, 18); - - } - - /** - * Generate the blocks that go here - */ - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - placeStrongholdWalls(world, sbb, 0, 0, 0, 8, 6, 17, rand, deco.randomBlocks); - - // statues - this.placeWallStatue(world, 1, 1, 9, 1, sbb); - this.placeWallStatue(world, 7, 1, 9, 3, sbb); - - // doors - placeDoors(world, rand, sbb); - - return true; - } - - -} diff --git a/src/main/java/twilightforest/structures/stronghold/ComponentTFStrongholdSmallStairs.java b/src/main/java/twilightforest/structures/stronghold/ComponentTFStrongholdSmallStairs.java deleted file mode 100644 index 1d2b0658f9..0000000000 --- a/src/main/java/twilightforest/structures/stronghold/ComponentTFStrongholdSmallStairs.java +++ /dev/null @@ -1,164 +0,0 @@ -package twilightforest.structures.stronghold; - -import java.util.List; -import java.util.Random; - -import net.minecraft.init.Blocks; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import net.minecraft.world.gen.structure.StructureComponent; -import twilightforest.TFTreasure; - -public class ComponentTFStrongholdSmallStairs extends - StructureTFStrongholdComponent { - - private boolean enterBottom; - public boolean hasTreasure; - public boolean chestTrapped; - - public ComponentTFStrongholdSmallStairs() { - super(); - // TODO Auto-generated constructor stub - } - - public ComponentTFStrongholdSmallStairs(int i, int facing, int x, int y, int z) { - super(i, facing, x, y, z); - } - - /** - * Save to NBT - */ - @Override - protected void func_143012_a(NBTTagCompound par1NBTTagCompound) { - super.func_143012_a(par1NBTTagCompound); - - par1NBTTagCompound.setBoolean("enterBottom", this.enterBottom); - par1NBTTagCompound.setBoolean("hasTreasure", this.hasTreasure); - par1NBTTagCompound.setBoolean("chestTrapped", this.chestTrapped); - } - - /** - * Load from NBT - */ - @Override - protected void func_143011_b(NBTTagCompound par1NBTTagCompound) { - super.func_143011_b(par1NBTTagCompound); - this.enterBottom = par1NBTTagCompound.getBoolean("enterBottom"); - this.hasTreasure = par1NBTTagCompound.getBoolean("hasTreasure"); - this.chestTrapped = par1NBTTagCompound.getBoolean("chestTrapped"); - } - - /** - * Make a bounding box for this room - */ - public StructureBoundingBox generateBoundingBox(int facing, int x, int y, int z) - { - - if (y > 17) - { - this.enterBottom = false; - } - else if (y < 11) - { - this.enterBottom = true; - } - else - { - this.enterBottom = (z & 1) == 0; - } - - if (enterBottom) - { - return StructureBoundingBox.getComponentToAddBoundingBox(x, y, z, -4, -1, 0, 9, 14, 9, facing); - } - else - { - // enter on the top - return StructureBoundingBox.getComponentToAddBoundingBox(x, y, z, -4, -8, 0, 9, 14, 9, facing); - } - } - - /** - * Initiates construction of the Structure Component picked, at the current Location of StructGen - */ - @Override - public void buildComponent(StructureComponent parent, List list, Random random) { - super.buildComponent(parent, list, random); - - if (this.enterBottom) - { - this.addDoor(4, 1, 0); - addNewComponent(parent, list, random, 0, 4, 8, 9); - } - else - { - this.addDoor(4, 8, 0); - addNewComponent(parent, list, random, 0, 4, 1, 9); - } - - this.hasTreasure = random.nextBoolean(); - this.chestTrapped = random.nextInt(3) == 0; - } - - /** - * Generate the blocks that go here - */ - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - placeStrongholdWalls(world, sbb, 0, 0, 0, 8, 13, 8, rand, deco.randomBlocks); - - // railing - this.fillWithMetadataBlocks(world, sbb, 1, 7, 1, 7, 7, 7, deco.platformID, deco.platformMeta, Blocks.air, 0, false); - this.fillWithAir(world, sbb, 2, 7, 2, 6, 7, 6); - - int rotation = this.enterBottom ? 0 : 2; - - // stairs - for (int y = 1; y < 8; y++) - { - for (int x = 3; x < 6; x++) - { - this.placeBlockRotated(world, Blocks.air, 0, x, y + 1, y, rotation, sbb); - this.placeBlockRotated(world, deco.stairID, this.getStairMeta(1 + rotation),x, y, y, rotation, sbb); - this.placeBlockRotated(world, deco.blockID, deco.blockMeta, x, y - 1, y, rotation, sbb); - } - } - - // treasure - if (this.hasTreasure) - { - this.placeTreasureRotated(world, 4, 1, 6, rotation, TFTreasure.stronghold_cache, this.chestTrapped, sbb); - - if (this.chestTrapped) - { - this.placeBlockRotated(world, Blocks.tnt, 0, 4, 0, 6, rotation, sbb); - } - - for (int z = 5; z < 8; z++) - { - this.placeBlockRotated(world, deco.stairID, this.getStairMeta(0 + rotation), 3, 1, z, rotation, sbb); - this.placeBlockRotated(world, deco.stairID, this.getStairMeta(2 + rotation), 5, 1, z, rotation, sbb); - } - - this.placeBlockRotated(world, deco.stairID, this.getStairMeta(1 + rotation), 4, 1, 5, rotation, sbb); - this.placeBlockRotated(world, deco.stairID, this.getStairMeta(3 + rotation), 4, 1, 7, rotation, sbb); - this.placeBlockRotated(world, deco.stairID, this.getStairMeta(1 + rotation), 4, 2, 6, rotation, sbb); - } - - if (enterBottom) - { - this.placeWallStatue(world, 4, 8, 1, 2, sbb); - } - else - { - this.placeWallStatue(world, 4, 8, 7, 0, sbb); - } - - // doors - placeDoors(world, rand, sbb); - - return true; - } - -} diff --git a/src/main/java/twilightforest/structures/stronghold/ComponentTFStrongholdTrainingRoom.java b/src/main/java/twilightforest/structures/stronghold/ComponentTFStrongholdTrainingRoom.java deleted file mode 100644 index 07a5121e14..0000000000 --- a/src/main/java/twilightforest/structures/stronghold/ComponentTFStrongholdTrainingRoom.java +++ /dev/null @@ -1,91 +0,0 @@ -package twilightforest.structures.stronghold; - -import java.util.List; -import java.util.Random; - -import net.minecraft.init.Blocks; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import net.minecraft.world.gen.structure.StructureComponent; - -public class ComponentTFStrongholdTrainingRoom extends StructureTFStrongholdComponent { - - public ComponentTFStrongholdTrainingRoom() { - super(); - // TODO Auto-generated constructor stub - } - - public ComponentTFStrongholdTrainingRoom(int i, int facing, int x, int y, int z) { - super(i, facing, x, y, z); - } - - /** - * Make a bounding box for this room - */ - public StructureBoundingBox generateBoundingBox(int facing, int x, int y, int z) - { - return StructureTFStrongholdComponent.getComponentToAddBoundingBox(x, y, z, -13, -1, 0, 18, 7, 18, facing); - } - - /** - * Initiates construction of the Structure Component picked, at the current Location of StructGen - */ - @Override - public void buildComponent(StructureComponent parent, List list, Random random) { - super.buildComponent(parent, list, random); - - this.addDoor(13, 1, 0); - addNewComponent(parent, list, random, 0, 4, 1, 18); - } - - /** - * Generate the blocks that go here - */ - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - placeStrongholdWalls(world, sbb, 0, 0, 0, 17, 6, 17, rand, deco.randomBlocks); - - // statues - placeCornerStatue(world, 2, 1, 2, 0, sbb); - placeCornerStatue(world, 15, 1, 15, 3, sbb); - - // sand floor - this.randomlyFillWithBlocks(world, sbb, rand, 0.7F, 4, 0, 4, 8, 0, 8, Blocks.sand, Blocks.sand, false); - this.randomlyFillWithBlocks(world, sbb, rand, 0.7F, 9, 0, 4, 13, 0, 8, Blocks.sand, Blocks.sand, false); - this.randomlyFillWithBlocks(world, sbb, rand, 0.7F, 9, 0, 9, 13, 0, 13, Blocks.sand, Blocks.sand, false); - - // training dummies - placeTrainingDummy(world, sbb, 0); - placeTrainingDummy(world, sbb, 1); - placeTrainingDummy(world, sbb, 2); - - // anvil pad - this.fillWithBlocks(world, sbb, 5, 0, 10, 7, 0, 12, Blocks.cobblestone, Blocks.cobblestone, false); - - this.placeBlockAtCurrentPosition(world, deco.pillarID, deco.pillarMeta, 5, 1, 12, sbb); - this.placeBlockAtCurrentPosition(world, deco.pillarID, deco.pillarMeta, 5, 2, 12, sbb); - this.placeBlockAtCurrentPosition(world, deco.pillarID, deco.pillarMeta, 6, 1, 12, sbb); - this.placeBlockAtCurrentPosition(world, deco.stairID, this.getStairMeta(2), 6, 2, 12, sbb); - this.placeBlockAtCurrentPosition(world, deco.stairID, this.getStairMeta(2), 7, 1, 12, sbb); - this.placeBlockAtCurrentPosition(world, deco.pillarID, deco.pillarMeta, 5, 1, 11, sbb); - this.placeBlockAtCurrentPosition(world, deco.stairID, this.getStairMeta(1), 5, 2, 11, sbb); - this.placeBlockAtCurrentPosition(world, deco.stairID, this.getStairMeta(1), 5, 1, 10, sbb); - - this.placeBlockAtCurrentPosition(world, Blocks.anvil, 0, 6, 1, 11, sbb); - - // doors - placeDoors(world, rand, sbb); - - return true; - } - - private void placeTrainingDummy(World world, StructureBoundingBox sbb, int rotation) { - this.fillBlocksRotated(world, sbb, 5, 0, 5, 7, 0, 7, Blocks.sand, 0, rotation); - this.placeBlockRotated(world, deco.fenceID, deco.fenceMeta, 6, 1, 6, rotation, sbb); - this.placeBlockRotated(world, Blocks.planks, 2, 6, 2, 6, rotation, sbb); - this.placeBlockRotated(world, Blocks.fence, 0, 5, 2, 6, rotation, sbb); - this.placeBlockRotated(world, Blocks.fence, 0, 7, 2, 6, rotation, sbb); - this.placeBlockRotated(world, Blocks.pumpkin, this.getStairMeta(0 + rotation), 6, 3, 6, rotation, sbb); - } - -} diff --git a/src/main/java/twilightforest/structures/stronghold/ComponentTFStrongholdTreasureCorridor.java b/src/main/java/twilightforest/structures/stronghold/ComponentTFStrongholdTreasureCorridor.java deleted file mode 100644 index 69a979976a..0000000000 --- a/src/main/java/twilightforest/structures/stronghold/ComponentTFStrongholdTreasureCorridor.java +++ /dev/null @@ -1,82 +0,0 @@ -package twilightforest.structures.stronghold; - -import java.util.List; -import java.util.Random; - -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import net.minecraft.world.gen.structure.StructureComponent; -import twilightforest.TFTreasure; - -public class ComponentTFStrongholdTreasureCorridor extends StructureTFStrongholdComponent { - - - public ComponentTFStrongholdTreasureCorridor() { - super(); - // TODO Auto-generated constructor stub - } - - public ComponentTFStrongholdTreasureCorridor(int i, int facing, int x, int y, int z) { - super(i, facing, x, y, z); - } - - /** - * Make a bounding box for this room - */ - public StructureBoundingBox generateBoundingBox(int facing, int x, int y, int z) - { - return StructureTFStrongholdComponent.getComponentToAddBoundingBox(x, y, z, -4, -1, 0, 9, 7, 27, facing); - } - - - /** - * Initiates construction of the Structure Component picked, at the current Location of StructGen - */ - @Override - public void buildComponent(StructureComponent parent, List list, Random random) { - super.buildComponent(parent, list, random); - - // entrance - this.addDoor(4, 1, 0); - - // make a random component at the end - addNewComponent(parent, list, random, 0, 4, 1, 27); - - } - - /** - * Generate the blocks that go here - */ - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - placeStrongholdWalls(world, sbb, 0, 0, 0, 8, 6, 26, rand, deco.randomBlocks); - - // statues - this.placeWallStatue(world, 1, 1, 9, 1, sbb); - this.placeWallStatue(world, 1, 1, 17, 1, sbb); - this.placeWallStatue(world, 7, 1, 9, 3, sbb); - this.placeWallStatue(world, 7, 1, 17, 3, sbb); - - int rotation = (this.boundingBox.minX ^ this.boundingBox.minZ) % 2 == 0 ? 0 : 2; - - // treasure! - this.placeTreasureRotated(world, 8, 2, 13, rotation, TFTreasure.stronghold_cache, sbb); - - // niche! - this.placeBlockRotated(world, deco.stairID, this.getStairMeta(3 + rotation) + 4, 8, 3, 12, rotation, sbb); - this.placeBlockRotated(world, deco.stairID, this.getStairMeta(0 + rotation) + 4, 8, 3, 13, rotation, sbb); - this.placeBlockRotated(world, deco.stairID, this.getStairMeta(1 + rotation) + 4, 8, 3, 14, rotation, sbb); - this.placeBlockRotated(world, deco.fenceID, deco.fenceMeta, 8, 2, 12, rotation, sbb); - this.placeBlockRotated(world, deco.fenceID, deco.fenceMeta, 8, 2, 14, rotation, sbb); - this.placeBlockRotated(world, deco.stairID, this.getStairMeta(1 + rotation), 7, 1, 12, rotation, sbb); - this.placeBlockRotated(world, deco.stairID, this.getStairMeta(0 + rotation), 7, 1, 13, rotation, sbb); - this.placeBlockRotated(world, deco.stairID, this.getStairMeta(3 + rotation), 7, 1, 14, rotation, sbb); - - // doors - placeDoors(world, rand, sbb); - - return true; - } - - -} diff --git a/src/main/java/twilightforest/structures/stronghold/ComponentTFStrongholdTreasureRoom.java b/src/main/java/twilightforest/structures/stronghold/ComponentTFStrongholdTreasureRoom.java deleted file mode 100644 index 0e159c2347..0000000000 --- a/src/main/java/twilightforest/structures/stronghold/ComponentTFStrongholdTreasureRoom.java +++ /dev/null @@ -1,113 +0,0 @@ -package twilightforest.structures.stronghold; - -import java.util.List; -import java.util.Random; - -import net.minecraft.init.Blocks; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import net.minecraft.world.gen.structure.StructureComponent; -import twilightforest.TFTreasure; -import twilightforest.entity.TFCreatures; - -public class ComponentTFStrongholdTreasureRoom extends - StructureTFStrongholdComponent { - - private boolean enterBottom; - - public ComponentTFStrongholdTreasureRoom() { - super(); - // TODO Auto-generated constructor stub - } - - public ComponentTFStrongholdTreasureRoom(int i, int facing, int x, int y, int z) { - super(i, facing, x, y, z); - // TODO Auto-generated constructor stub - } - - /** - * Save to NBT - */ - @Override - protected void func_143012_a(NBTTagCompound par1NBTTagCompound) { - super.func_143012_a(par1NBTTagCompound); - - par1NBTTagCompound.setBoolean("enterBottom", this.enterBottom); - } - - /** - * Load from NBT - */ - @Override - protected void func_143011_b(NBTTagCompound par1NBTTagCompound) { - super.func_143011_b(par1NBTTagCompound); - this.enterBottom = par1NBTTagCompound.getBoolean("enterBottom"); - } - - /** - * Make a bounding box for this room - */ - public StructureBoundingBox generateBoundingBox(int facing, int x, int y, int z) - { - return StructureBoundingBox.getComponentToAddBoundingBox(x, y, z, -4, -1, 0, 9, 7, 18, facing); - } - - /** - * Initiates construction of the Structure Component picked, at the current Location of StructGen - */ - @Override - public void buildComponent(StructureComponent parent, List list, Random random) { - super.buildComponent(parent, list, random); - - this.addDoor(4, 1, 0); - } - - /** - * Generate the blocks that go here - */ - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - placeStrongholdWalls(world, sbb, 0, 0, 0, 8, 6, 17, rand, deco.randomBlocks); - - // statues - this.placeWallStatue(world, 1, 1, 4, 1, sbb); - this.placeWallStatue(world, 1, 1, 13, 1, sbb); - this.placeWallStatue(world, 7, 1, 4, 3, sbb); - this.placeWallStatue(world, 7, 1, 13, 3, sbb); - this.placeWallStatue(world, 4, 1, 16, 0, sbb); - - this.fillWithRandomizedBlocks(world, sbb, 1, 1, 8, 7, 5, 9, false, rand, deco.randomBlocks); - this.fillWithBlocks(world, sbb, 3, 1, 8, 5, 4, 9, Blocks.iron_bars, Blocks.iron_bars, false); - - // spawnwers - this.placeSpawnerAtCurrentPosition(world, rand, 4, 1, 4, TFCreatures.getSpawnerNameFor("Helmet Crab"), sbb); - - this.placeSpawnerAtCurrentPosition(world, rand, 4, 4, 15, TFCreatures.getSpawnerNameFor("Helmet Crab"), sbb); - - // treasure! - this.placeTreasureAtCurrentPosition(world, rand, 2, 4, 13, TFTreasure.stronghold_room, sbb); - this.placeTreasureAtCurrentPosition(world, rand, 6, 4, 13, TFTreasure.stronghold_room, sbb); - - // doors - placeDoors(world, rand, sbb); - - return true; - } - - /** - * Make a doorway - */ - protected void placeDoorwayAt(World world, Random rand, int x, int y, int z, StructureBoundingBox sbb) { - if (x == 0 || x == getXSize()) - { - this.fillWithMetadataBlocks(world, sbb, x, y, z - 1, x, y + 3, z + 1, Blocks.iron_bars, 0, Blocks.air, 0, false); - } - else - { - this.fillWithMetadataBlocks(world, sbb, x - 1, y, z, x + 1, y + 3, z, Blocks.iron_bars, 0, Blocks.air, 0, false); - } - } - - -} diff --git a/src/main/java/twilightforest/structures/stronghold/ComponentTFStrongholdUpperAscender.java b/src/main/java/twilightforest/structures/stronghold/ComponentTFStrongholdUpperAscender.java deleted file mode 100644 index 22382b4342..0000000000 --- a/src/main/java/twilightforest/structures/stronghold/ComponentTFStrongholdUpperAscender.java +++ /dev/null @@ -1,150 +0,0 @@ -package twilightforest.structures.stronghold; - -import java.util.List; -import java.util.Random; - -import net.minecraft.init.Blocks; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import net.minecraft.world.gen.structure.StructureComponent; - -public class ComponentTFStrongholdUpperAscender extends StructureTFStrongholdComponent { - - boolean exitTop; - - public ComponentTFStrongholdUpperAscender() { - super(); - // TODO Auto-generated constructor stub - } - - public ComponentTFStrongholdUpperAscender(int i, int facing, int x, int y, int z) { - super(i, facing, x, y, z); - } - - /** - * Save to NBT - */ - @Override - protected void func_143012_a(NBTTagCompound par1NBTTagCompound) { - super.func_143012_a(par1NBTTagCompound); - - par1NBTTagCompound.setBoolean("exitTop", this.exitTop); - } - - /** - * Load from NBT - */ - @Override - protected void func_143011_b(NBTTagCompound par1NBTTagCompound) { - super.func_143011_b(par1NBTTagCompound); - this.exitTop = par1NBTTagCompound.getBoolean("exitTop"); - } - - - /** - * Make a bounding box for this room - */ - public StructureBoundingBox generateBoundingBox(int facing, int x, int y, int z) - { - if (y < 36) - { - this.exitTop = true; - return StructureBoundingBox.getComponentToAddBoundingBox(x, y, z, -2, -1, 0, 5, 10, 10, facing); - } - else - { - this.exitTop = false; - return StructureBoundingBox.getComponentToAddBoundingBox(x, y, z, -2, -6, 0, 5, 10, 10, facing); - } - } - - /** - * Initiates construction of the Structure Component picked, at the current Location of StructGen - */ - @Override - public void buildComponent(StructureComponent parent, List list, Random random) { - super.buildComponent(parent, list, random); - - // make a random component on the other side - addNewUpperComponent(parent, list, random, 0, 2, exitTop ? 6 : 1, 10); - } - - /** - * Generate the blocks that go here - */ - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - if (this.isLiquidInStructureBoundingBox(world, sbb)) - { - return false; - } - else - { - placeUpperStrongholdWalls(world, sbb, 0, 0, 0, 4, 9, 9, rand, deco.randomBlocks); - - // entrance doorway - placeSmallDoorwayAt(world, rand, 2, 2, exitTop ? 1 : 6, 0, sbb); - - // exit doorway - placeSmallDoorwayAt(world, rand, 0, 2, exitTop ? 6 : 1, 9, sbb); - - // steps! - if (exitTop) - { - makeStairsAt(world, 1, 3, 1, sbb); - makeStairsAt(world, 2, 4, 1, sbb); - makeStairsAt(world, 3, 5, 1, sbb); - makeStairsAt(world, 4, 6, 1, sbb); - makeStairsAt(world, 5, 7, 1, sbb); - makePlatformAt(world, 5, 8, sbb); - } - else - { - makeStairsAt(world, 1, 6, 3, sbb); - makeStairsAt(world, 2, 5, 3, sbb); - makeStairsAt(world, 3, 4, 3, sbb); - makeStairsAt(world, 4, 3, 3, sbb); - makeStairsAt(world, 5, 2, 3, sbb); - makePlatformAt(world, 5, 1, sbb); - } - return true; - } - } - - /** - * Check if we can find at least one wall, and if so, generate stairs - */ - private void makeStairsAt(World world, int y, int z, int facing, StructureBoundingBox sbb) { - // check walls - if (this.getBlockAtCurrentPosition(world, 0, y, z, sbb) != Blocks.air || this.getBlockAtCurrentPosition(world, 4, y, z, sbb) != Blocks.air) - { - for (int x = 1; x < 4; x++) - { - this.placeBlockAtCurrentPosition(world, Blocks.stone_brick_stairs, this.getStairMeta(facing), x, y, z, sbb); - } - } - } - - /** - * Check if we can find at least one wall, and if so, generate blocks - */ - private void makePlatformAt(World world, int y, int z, StructureBoundingBox sbb) { - // check walls - if (this.getBlockAtCurrentPosition(world, 0, y, z, sbb) != Blocks.air || this.getBlockAtCurrentPosition(world, 4, y, z, sbb) != Blocks.air) - { - for (int x = 1; x < 4; x++) - { - this.placeBlockAtCurrentPosition(world, Blocks.stonebrick, 0, x, y, z, sbb); - } - } - } - - /** - * Does this component fall under block protection when progression is turned on, normally true - */ - public boolean isComponentProtected() { - return false; - } - -} diff --git a/src/main/java/twilightforest/structures/stronghold/ComponentTFStrongholdUpperCorridor.java b/src/main/java/twilightforest/structures/stronghold/ComponentTFStrongholdUpperCorridor.java deleted file mode 100644 index 16f2a08d72..0000000000 --- a/src/main/java/twilightforest/structures/stronghold/ComponentTFStrongholdUpperCorridor.java +++ /dev/null @@ -1,72 +0,0 @@ -package twilightforest.structures.stronghold; - -import java.util.List; -import java.util.Random; - -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import net.minecraft.world.gen.structure.StructureComponent; - -public class ComponentTFStrongholdUpperCorridor extends StructureTFStrongholdComponent { - - - public ComponentTFStrongholdUpperCorridor() { - super(); - // TODO Auto-generated constructor stub - } - - public ComponentTFStrongholdUpperCorridor(int i, int facing, int x, int y, int z) { - super(i, facing, x, y, z); - } - - /** - * Make a bounding box for this room - */ - public StructureBoundingBox generateBoundingBox(int facing, int x, int y, int z) - { - return StructureBoundingBox.getComponentToAddBoundingBox(x, y, z, -2, -1, 0, 5, 5, 9, facing); - } - - /** - * Initiates construction of the Structure Component picked, at the current Location of StructGen - */ - @Override - public void buildComponent(StructureComponent parent, List list, Random random) { - super.buildComponent(parent, list, random); - - // make a random component at the end - addNewUpperComponent(parent, list, random, 0, 2, 1, 9); - - } - - /** - * Generate the blocks that go here - */ - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - if (this.isLiquidInStructureBoundingBox(world, sbb)) - { - return false; - } - else - { - placeUpperStrongholdWalls(world, sbb, 0, 0, 0, 4, 4, 8, rand, deco.randomBlocks); - - // entrance doorway - placeSmallDoorwayAt(world, rand, 2, 2, 1, 0, sbb); - - // end - placeSmallDoorwayAt(world, rand, 2, 2, 1, 8, sbb); - - return true; - } - } - - - /** - * Does this component fall under block protection when progression is turned on, normally true - */ - public boolean isComponentProtected() { - return false; - } -} diff --git a/src/main/java/twilightforest/structures/stronghold/ComponentTFStrongholdUpperLeftTurn.java b/src/main/java/twilightforest/structures/stronghold/ComponentTFStrongholdUpperLeftTurn.java deleted file mode 100644 index c76a63d6fd..0000000000 --- a/src/main/java/twilightforest/structures/stronghold/ComponentTFStrongholdUpperLeftTurn.java +++ /dev/null @@ -1,72 +0,0 @@ -package twilightforest.structures.stronghold; - -import java.util.List; -import java.util.Random; - -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import net.minecraft.world.gen.structure.StructureComponent; - -public class ComponentTFStrongholdUpperLeftTurn extends StructureTFStrongholdComponent { - - - public ComponentTFStrongholdUpperLeftTurn() { - super(); - // TODO Auto-generated constructor stub - } - - public ComponentTFStrongholdUpperLeftTurn(int i, int facing, int x, int y, int z) { - super(i, facing, x, y, z); - } - - /** - * Make a bounding box for this room - */ - public StructureBoundingBox generateBoundingBox(int facing, int x, int y, int z) - { - return StructureBoundingBox.getComponentToAddBoundingBox(x, y, z, -2, -1, 0, 5, 5, 5, facing); - } - - /** - * Initiates construction of the Structure Component picked, at the current Location of StructGen - */ - @Override - public void buildComponent(StructureComponent parent, List list, Random random) { - super.buildComponent(parent, list, random); - - // make a random component to the left - addNewUpperComponent(parent, list, random, 3, 5, 1, 2); - - } - - /** - * Generate the blocks that go here - */ - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - if (this.isLiquidInStructureBoundingBox(world, sbb)) - { - return false; - } - else - { - placeUpperStrongholdWalls(world, sbb, 0, 0, 0, 4, 4, 4, rand, deco.randomBlocks); - - // entrance doorway - placeSmallDoorwayAt(world, rand, 2, 2, 1, 0, sbb); - - // left turn doorway - placeSmallDoorwayAt(world, rand, 3, 4, 1, 2, sbb); - - return true; - } - } - - - /** - * Does this component fall under block protection when progression is turned on, normally true - */ - public boolean isComponentProtected() { - return false; - } -} diff --git a/src/main/java/twilightforest/structures/stronghold/ComponentTFStrongholdUpperRightTurn.java b/src/main/java/twilightforest/structures/stronghold/ComponentTFStrongholdUpperRightTurn.java deleted file mode 100644 index f5cb533d72..0000000000 --- a/src/main/java/twilightforest/structures/stronghold/ComponentTFStrongholdUpperRightTurn.java +++ /dev/null @@ -1,72 +0,0 @@ -package twilightforest.structures.stronghold; - -import java.util.List; -import java.util.Random; - -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import net.minecraft.world.gen.structure.StructureComponent; - -public class ComponentTFStrongholdUpperRightTurn extends StructureTFStrongholdComponent { - - - public ComponentTFStrongholdUpperRightTurn() { - super(); - // TODO Auto-generated constructor stub - } - - public ComponentTFStrongholdUpperRightTurn(int i, int facing, int x, int y, int z) { - super(i, facing, x, y, z); - } - - /** - * Make a bounding box for this room - */ - public StructureBoundingBox generateBoundingBox(int facing, int x, int y, int z) - { - return StructureBoundingBox.getComponentToAddBoundingBox(x, y, z, -2, -1, 0, 5, 5, 5, facing); - } - - /** - * Initiates construction of the Structure Component picked, at the current Location of StructGen - */ - @Override - public void buildComponent(StructureComponent parent, List list, Random random) { - super.buildComponent(parent, list, random); - - // make a random component to the right - addNewUpperComponent(parent, list, random, 1, -1, 1, 2); - - } - - /** - * Generate the blocks that go here - */ - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - if (this.isLiquidInStructureBoundingBox(world, sbb)) - { - return false; - } - else - { - placeUpperStrongholdWalls(world, sbb, 0, 0, 0, 4, 4, 4, rand, deco.randomBlocks); - - // entrance doorway - placeSmallDoorwayAt(world, rand, 2, 2, 1, 0, sbb); - - // right turn doorway - placeSmallDoorwayAt(world, rand, 1, 0, 1, 2, sbb); - - return true; - } - } - - /** - * Does this component fall under block protection when progression is turned on, normally true - */ - public boolean isComponentProtected() { - return false; - } - -} diff --git a/src/main/java/twilightforest/structures/stronghold/ComponentTFStrongholdUpperTIntersection.java b/src/main/java/twilightforest/structures/stronghold/ComponentTFStrongholdUpperTIntersection.java deleted file mode 100644 index 10b4bf3794..0000000000 --- a/src/main/java/twilightforest/structures/stronghold/ComponentTFStrongholdUpperTIntersection.java +++ /dev/null @@ -1,77 +0,0 @@ -package twilightforest.structures.stronghold; - -import java.util.List; -import java.util.Random; - -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import net.minecraft.world.gen.structure.StructureComponent; - -public class ComponentTFStrongholdUpperTIntersection extends StructureTFStrongholdComponent { - - - public ComponentTFStrongholdUpperTIntersection() { - super(); - // TODO Auto-generated constructor stub - } - - public ComponentTFStrongholdUpperTIntersection(int i, int facing, int x, int y, int z) { - super(i, facing, x, y, z); - } - - /** - * Make a bounding box for this room - */ - public StructureBoundingBox generateBoundingBox(int facing, int x, int y, int z) - { - return StructureBoundingBox.getComponentToAddBoundingBox(x, y, z, -2, -1, 0, 5, 5, 5, facing); - } - - /** - * Initiates construction of the Structure Component picked, at the current Location of StructGen - */ - @Override - public void buildComponent(StructureComponent parent, List list, Random random) { - super.buildComponent(parent, list, random); - - // make a random component to the left - addNewUpperComponent(parent, list, random, 3, 5, 1, 2); - - // make a random component to the right - addNewUpperComponent(parent, list, random, 1, -1, 1, 2); - } - - /** - * Generate the blocks that go here - */ - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - if (this.isLiquidInStructureBoundingBox(world, sbb)) - { - return false; - } - else - { - placeUpperStrongholdWalls(world, sbb, 0, 0, 0, 4, 4, 4, rand, deco.randomBlocks); - - // entrance doorway - placeSmallDoorwayAt(world, rand, 2, 2, 1, 0, sbb); - - // left turn doorway - placeSmallDoorwayAt(world, rand, 3, 4, 1, 2, sbb); - - // right turn doorway - placeSmallDoorwayAt(world, rand, 1, 0, 1, 2, sbb); - - return true; - } - } - - - /** - * Does this component fall under block protection when progression is turned on, normally true - */ - public boolean isComponentProtected() { - return false; - } -} diff --git a/src/main/java/twilightforest/structures/stronghold/StructureTFDecoratorStronghold.java b/src/main/java/twilightforest/structures/stronghold/StructureTFDecoratorStronghold.java deleted file mode 100644 index 9c0145edac..0000000000 --- a/src/main/java/twilightforest/structures/stronghold/StructureTFDecoratorStronghold.java +++ /dev/null @@ -1,30 +0,0 @@ -package twilightforest.structures.stronghold; - -import net.minecraft.init.Blocks; -import twilightforest.block.TFBlocks; -import twilightforest.structures.StructureTFDecorator; - -public class StructureTFDecoratorStronghold extends StructureTFDecorator { - - - public StructureTFDecoratorStronghold() - { - this.blockID = TFBlocks.underBrick; - this.blockMeta = 0; - - this.accentID = TFBlocks.underBrick; - this.accentMeta = 3; - - this.fenceID = Blocks.cobblestone_wall; - - this.stairID = Blocks.stone_brick_stairs; - - this.pillarID = Blocks.stonebrick; - this.pillarMeta = 1; - - this.platformID = Blocks.stone_slab; - this.platformMeta = 5 + 8; - - this.randomBlocks = new StructureTFKnightStones(); - } -} diff --git a/src/main/java/twilightforest/structures/stronghold/StructureTFKnightStones.java b/src/main/java/twilightforest/structures/stronghold/StructureTFKnightStones.java deleted file mode 100644 index 936ae4c6ec..0000000000 --- a/src/main/java/twilightforest/structures/stronghold/StructureTFKnightStones.java +++ /dev/null @@ -1,38 +0,0 @@ -package twilightforest.structures.stronghold; - -import java.util.Random; - -import net.minecraft.init.Blocks; -import net.minecraft.world.gen.structure.StructureComponent; -import twilightforest.block.TFBlocks; - -public class StructureTFKnightStones extends StructureComponent.BlockSelector { - - @Override - public void selectBlocks(Random par1Random, int par2, int par3, int par4, boolean par5) { - if (!par5) - { - this.field_151562_a = Blocks.air; - this.selectedBlockMetaData = 0; - } - else - { - this.field_151562_a = TFBlocks.underBrick; - float var6 = par1Random.nextFloat(); - - if (var6 < 0.2F) - { - this.selectedBlockMetaData = 2; - } - else if (var6 < 0.5F) - { - this.selectedBlockMetaData = 1; - } - else - { - this.selectedBlockMetaData = 0; - } - } - } - -} diff --git a/src/main/java/twilightforest/structures/stronghold/StructureTFStrongholdComponent.java b/src/main/java/twilightforest/structures/stronghold/StructureTFStrongholdComponent.java deleted file mode 100644 index 8c47720323..0000000000 --- a/src/main/java/twilightforest/structures/stronghold/StructureTFStrongholdComponent.java +++ /dev/null @@ -1,634 +0,0 @@ -package twilightforest.structures.stronghold; - -import java.nio.IntBuffer; -import java.util.ArrayList; -import java.util.List; -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.init.Blocks; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.ChunkCoordinates; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import net.minecraft.world.gen.structure.StructureComponent; -import twilightforest.structures.StructureTFComponent; - -public abstract class StructureTFStrongholdComponent extends StructureTFComponent { - - public List doors = new ArrayList(); - - public StructureTFStrongholdComponent() { - super(); - // TODO Auto-generated constructor stub - } - - public StructureTFStrongholdComponent(int i, int facing, int x, int y, int z) { - super(i); - this.boundingBox = generateBoundingBox(facing, x, y, z); - this.setCoordBaseMode(facing); - } - - /** - * Save to NBT - */ - @Override - protected void func_143012_a(NBTTagCompound par1NBTTagCompound) { - super.func_143012_a(par1NBTTagCompound); - - par1NBTTagCompound.setIntArray("doorInts", this.getDoorsAsIntArray()); - } - - /** - * Turn the openings array into an array of ints. - */ - private int[] getDoorsAsIntArray() { - IntBuffer ibuffer = IntBuffer.allocate(this.doors.size() * 3); - - for (ChunkCoordinates door : doors) - { - ibuffer.put(door.posX); - ibuffer.put(door.posY); - ibuffer.put(door.posZ); - } - - return ibuffer.array(); - } - - /** - * Load from NBT - */ - @Override - protected void func_143011_b(NBTTagCompound par1NBTTagCompound) { - super.func_143011_b(par1NBTTagCompound); - - // init doors - this.readOpeningsFromArray(par1NBTTagCompound.getIntArray("doorInts")); - } - - /** - * Read in openings from int array - */ - private void readOpeningsFromArray(int[] intArray) { - for (int i = 0; i < intArray.length; i += 3) - { - ChunkCoordinates door = new ChunkCoordinates(intArray[i], intArray[i + 1], intArray[i + 2]); - - this.doors.add(door); - } - } - - public abstract StructureBoundingBox generateBoundingBox(int facing, int x, int y, int z); - - /** - * used to project a possible new component Bounding Box - to check if it would cut anything already spawned - */ - public static StructureBoundingBox getComponentToAddBoundingBox(int x, int y, int z, int xOff, int yOff, int zOff, int xSize, int ySize, int zSize, int facing) - { - switch (facing) - { - case 0: - return new StructureBoundingBox(x + xOff, y + yOff, z + zOff, x + xSize - 1 + xOff, y + ySize - 1 + yOff, z + zSize - 1 + zOff); - case 1: - return new StructureBoundingBox(x - zSize + 1 + zOff, y + yOff, z + xOff, x + zOff, y + ySize - 1 + yOff, z + xSize - 1 + xOff); - case 2: - return new StructureBoundingBox(x - xSize + 1 - xOff, y + yOff, z - zSize + 1 + zOff, x - xOff, y + ySize - 1 + yOff, z + zOff); - case 3: - return new StructureBoundingBox(x + zOff, y + yOff, z - xSize + 1 - xOff, x + zSize - 1 + zOff, y + ySize - 1 + yOff, z - xOff); - default: - return new StructureBoundingBox(x + xOff, y + yOff, z + zOff, x + xSize - 1 + xOff, y + ySize - 1 + yOff, z + zSize - 1 + zOff); - } - } - - @SuppressWarnings("rawtypes") - @Override - public void buildComponent(StructureComponent parent, List list, Random rand) - { - if (parent != null && parent instanceof StructureTFComponent) - { - this.deco = ((StructureTFComponent)parent).deco; - } - } - - - - /** - * Add a new component in the specified direction - */ - @SuppressWarnings({ "rawtypes", "unchecked" }) - protected void addNewComponent(StructureComponent entrance, List list, Random random, int facing, int x, int y, int z) - { - int index = this.componentType + 1; - int nFacing = (this.coordBaseMode + facing) % 4; - int nx = this.getXWithOffset(x, z); - int ny = this.getYWithOffset(y); - int nz = this.getZWithOffset(x, z); - - // limit sprawl to a reasonable amount - if (index > 50 || isOutOfRange(entrance, nx, ny, nz, 112)) - { - return; - } - - // are we looking at a point we can possibly break in to? - StructureTFStrongholdComponent breakIn = this.findBreakInComponent(list, nx, ny, nz); - if (breakIn != null && breakIn.attemptToBreakIn(nx, ny, nz)) - { - // success! - this.addDoorwayTo(x, y, z, facing); - return; - } - - TFStrongholdPieces pieceList = ((ComponentTFStrongholdEntrance)entrance).lowerPieces; - - StructureTFStrongholdComponent nextComponent = pieceList.getNextComponent(entrance, list, random, index, nFacing, nx, ny, nz); - - // is it clear? - if (nextComponent != null) - { - // if so, add it - list.add(nextComponent); - nextComponent.buildComponent(entrance, list, random); - this.addDoorwayTo(x, y, z, facing); - } - } - - /** - * Check the list for components we can break in to at the specified point - */ - protected StructureTFStrongholdComponent findBreakInComponent(List list, int x, int y, int z) - { - for (StructureTFStrongholdComponent component : list) - { - if (component.boundingBox != null && component.boundingBox.isVecInside(x, y, z)) - { - return component; - } - } - - return null; - } - - - @SuppressWarnings({ "rawtypes", "unchecked" }) - protected void addNewUpperComponent(StructureComponent parent, List list, Random random, int facing, int x, int y, int z) - { - StructureTFStrongholdComponent attempted = null; - - int index = this.componentType + 1; - int nFacing = (this.coordBaseMode + facing) % 4; - int nx = this.getXWithOffset(x, z); - int ny = this.getYWithOffset(y); - int nz = this.getZWithOffset(x, z); - - // limit sprawl to a reasonable amount - if (index > 100 || isOutOfRange(parent, nx, ny, nz, 48)) - { - return; - } - - // find a new component - switch (random.nextInt(5)) - { - case 0: - default : - attempted = new ComponentTFStrongholdUpperTIntersection(index, nFacing, nx, ny, nz); - break; - case 1: - attempted = new ComponentTFStrongholdUpperLeftTurn(index, nFacing, nx, ny, nz); - break; - case 2: - attempted = new ComponentTFStrongholdUpperRightTurn(index, nFacing, nx, ny, nz); - break; - case 3: - attempted = new ComponentTFStrongholdUpperCorridor(index, nFacing, nx, ny, nz); - break; - case 4: - attempted = new ComponentTFStrongholdUpperAscender(index, nFacing, nx, ny, nz); - break; - } - - - // is it clear? - if (attempted != null && StructureComponent.findIntersecting(list, attempted.getBoundingBox()) == null) - { - // if so, add it - list.add(attempted); - attempted.buildComponent(parent, list, random); - - } - - - } - - /** - * Have we strayed more than range blocks away from the center? - */ - private boolean isOutOfRange(StructureComponent parent, int nx, int ny, int nz, int range) { - - return Math.abs(nx - parent.getBoundingBox().minX) > range - || Math.abs(nz - parent.getBoundingBox().minZ) > range; - } - - /** - * Make a doorway - */ - protected void placeDoorwayAt(World world, Random rand, int x, int y, int z, StructureBoundingBox sbb) { - if (x == 0 || x == this.getXSize()) - { - this.fillWithMetadataBlocks(world, sbb, x, y, z - 2, x, y + 3, z + 2, deco.fenceID, deco.fenceMeta, Blocks.air, 0, false); - this.fillWithAir(world, sbb, x, y, z - 1, x, y + 3, z + 1); - } - else - { - this.fillWithMetadataBlocks(world, sbb, x - 2, y, z, x + 2, y + 3, z, deco.fenceID, deco.fenceMeta, Blocks.air, 0, false); - this.fillWithAir(world, sbb, x - 1, y, z, x + 1, y + 3, z); - } - - //this.placeBlockAtCurrentPosition(world, Blocks.wool, this.coordBaseMode, x, y, z, sbb); - } - - protected int getXSize() { - switch (this.getCoordBaseMode()) - { - default: - case 0: - case 2: - return this.boundingBox.getXSize() - 1; - case 1: - case 3: - return this.boundingBox.getZSize() - 1; - } - } - - /** - * Make a smaller doorway - */ - protected void placeSmallDoorwayAt(World world, Random rand, int facing, int x, int y, int z, StructureBoundingBox sbb) { - if (facing == 0 || facing == 2) - { - this.fillWithMetadataBlocks(world, sbb, x - 1, y, z, x + 1, y + 1, z, Blocks.cobblestone_wall, 0, Blocks.air, 0, true); - this.fillWithAir(world, sbb, x, y, z, x, y + 1, z); - } - else - { - this.fillWithMetadataBlocks(world, sbb, x, y, z - 1, x, y + 1, z + 1, Blocks.cobblestone_wall, 0, Blocks.air, 0, true); - this.fillWithAir(world, sbb, x, y, z, x, y + 1, z); - } - - //this.placeBlockAtCurrentPosition(world, Blocks.wool, this.coordBaseMode, x, y, z, sbb); - } - - /** - * Generate a statue in the corner - */ - public void placeCornerStatue(World world, int x, int y, int z, int facing, StructureBoundingBox sbb) { - - // set offsets and stair metas - int ox = 1; - int oz = 1; - int smx = 2; - int smz = 3; - - - switch (facing) - { - case 0: - // already set up - break; - case 1: - oz = -1; - smz = 1; - break; - case 2 : - ox = -1; - smx = 0; - break; - case 3: - ox = -1; - oz = -1; - smx = 0; - smz = 1; - break; - } - - // the center is always the same - for (int sy = 0; sy < 5; sy++) - { - this.placeBlockAtCurrentPosition(world, deco.pillarID, deco.pillarMeta, x, y + sy, z, sbb); - } - - // antlers - this.placeBlockAtCurrentPosition(world, Blocks.fence, 0, x + 0, y + 4, z + oz, sbb); - this.placeBlockAtCurrentPosition(world, Blocks.fence, 0, x + ox, y + 4, z + 0, sbb); - - // arms - this.placeBlockAtCurrentPosition(world, deco.stairID, this.getStairMeta(smz), x + 0, y + 3, z + oz, sbb); - this.placeBlockAtCurrentPosition(world, deco.stairID, this.getStairMeta(smx), x + ox, y + 3, z + 0, sbb); - this.placeBlockAtCurrentPosition(world, deco.stairID, this.getStairMeta(smz) + 4, x + 0, y + 2, z + oz, sbb); - this.placeBlockAtCurrentPosition(world, deco.stairID, this.getStairMeta(smx) + 4, x + ox, y + 2, z + 0, sbb); - this.placeBlockAtCurrentPosition(world, deco.stairID, this.getStairMeta(smx) + 4, x + ox, y + 2, z + oz, sbb); - - // sword - this.placeBlockAtCurrentPosition(world, Blocks.cobblestone_wall, 0, x + ox, y + 0, z + oz, sbb); - this.placeBlockAtCurrentPosition(world, Blocks.cobblestone_wall, 0, x + ox, y + 1, z + oz, sbb); - - // feet - this.placeBlockAtCurrentPosition(world, deco.stairID, this.getStairMeta(smz), x + 0, y + 0, z + oz, sbb); - this.placeBlockAtCurrentPosition(world, deco.stairID, this.getStairMeta(smx), x + ox, y + 0, z + 0, sbb); - - } - - /** - * Make a statue that faces out from a wall - */ - public void placeWallStatue(World world, int x, int y, int z, int facing, StructureBoundingBox sbb) { - int ox = 1; - int oz = 1; - - // the center is always the same - for (int sy = 0; sy < 5; sy++) - { - this.placeBlockAtCurrentPosition(world, deco.pillarID, deco.pillarMeta, x, y + sy, z, sbb); - } - - if (facing == 0 || facing == 2) - { - if (facing == 2) - { - ox = -ox; - oz = -oz; - } - - // antlers - this.placeBlockAtCurrentPosition(world, Blocks.fence, 0, x - ox, y + 4, z, sbb); - this.placeBlockAtCurrentPosition(world, Blocks.fence, 0, x + ox, y + 4, z, sbb); - - // arms - this.placeBlockAtCurrentPosition(world, deco.stairID, this.getStairMeta(0 + facing), x - ox, y + 3, z, sbb); - this.placeBlockAtCurrentPosition(world, deco.stairID, this.getStairMeta(2 + facing), x + ox, y + 3, z, sbb); - this.placeBlockAtCurrentPosition(world, deco.stairID, this.getStairMeta(1 + facing), x - ox, y + 3, z - oz, sbb); - this.placeBlockAtCurrentPosition(world, deco.stairID, this.getStairMeta(1 + facing), x + ox, y + 3, z - oz, sbb); - - this.placeBlockAtCurrentPosition(world, deco.stairID, this.getStairMeta(0 + facing) + 4, x - ox, y + 2, z, sbb); - this.placeBlockAtCurrentPosition(world, deco.stairID, this.getStairMeta(2 + facing) + 4, x + ox, y + 2, z, sbb); - this.placeBlockAtCurrentPosition(world, deco.stairID, this.getStairMeta(1 + facing) + 4, x + 0, y + 2, z - oz, sbb); - this.placeBlockAtCurrentPosition(world, deco.stairID, this.getStairMeta(1 + facing) + 4, x - ox, y + 2, z - oz, sbb); - this.placeBlockAtCurrentPosition(world, deco.stairID, this.getStairMeta(1 + facing) + 4, x + ox, y + 2, z - oz, sbb); - - // sword - this.placeBlockAtCurrentPosition(world, Blocks.cobblestone_wall, 0, x, y + 0, z - oz, sbb); - this.placeBlockAtCurrentPosition(world, Blocks.cobblestone_wall, 0, x, y + 1, z - oz, sbb); - - // feet - this.placeBlockAtCurrentPosition(world, deco.stairID, this.getStairMeta(0 + facing), x - ox, y + 0, z + 0, sbb); - this.placeBlockAtCurrentPosition(world, deco.stairID, this.getStairMeta(2 + facing), x + ox, y + 0, z + 0, sbb); - } - else - { - if (facing == 3) - { - oz = -oz; - ox = -ox; - } - - // antlers - this.placeBlockAtCurrentPosition(world, Blocks.fence, 0, x, y + 4, z - oz, sbb); - this.placeBlockAtCurrentPosition(world, Blocks.fence, 0, x, y + 4, z + oz, sbb); - - // arms - this.placeBlockAtCurrentPosition(world, deco.stairID, this.getStairMeta(0 + facing), x, y + 3, z - oz, sbb); - this.placeBlockAtCurrentPosition(world, deco.stairID, this.getStairMeta(2 + facing), x, y + 3, z + oz, sbb); - this.placeBlockAtCurrentPosition(world, deco.stairID, this.getStairMeta(1 + facing), x + ox, y + 3, z - oz, sbb); - this.placeBlockAtCurrentPosition(world, deco.stairID, this.getStairMeta(1 + facing), x + ox, y + 3, z + oz, sbb); - - this.placeBlockAtCurrentPosition(world, deco.stairID, this.getStairMeta(0 + facing) + 4, x, y + 2, z - oz, sbb); - this.placeBlockAtCurrentPosition(world, deco.stairID, this.getStairMeta(2 + facing) + 4, x, y + 2, z + oz, sbb); - this.placeBlockAtCurrentPosition(world, deco.stairID, this.getStairMeta(1 + facing) + 4, x + oz, y + 2, z + 0, sbb); - this.placeBlockAtCurrentPosition(world, deco.stairID, this.getStairMeta(1 + facing) + 4, x + ox, y + 2, z - oz, sbb); - this.placeBlockAtCurrentPosition(world, deco.stairID, this.getStairMeta(1 + facing) + 4, x + ox, y + 2, z + oz, sbb); - - // sword - this.placeBlockAtCurrentPosition(world, Blocks.cobblestone_wall, 0, x + ox, y + 0, z, sbb); - this.placeBlockAtCurrentPosition(world, Blocks.cobblestone_wall, 0, x + ox, y + 1, z, sbb); - - // feet - this.placeBlockAtCurrentPosition(world, deco.stairID, this.getStairMeta(0 + facing), x, y + 0, z - ox, sbb); - this.placeBlockAtCurrentPosition(world, deco.stairID, this.getStairMeta(2 + facing), x, y + 0, z + ox, sbb); - } - - } - - /** - * Called curing construction. If an attempted component collides with this one, try "breaking in". - */ - public boolean attemptToBreakIn(int wx, int wy, int wz) - { - if (!isValidBreakInPoint(wx, wy, wz)) - { - //System.out.println("Break in failed because the point is invalid"); - - //System.out.printf("Break point is %d, %d, %d, bounding sides are %d-%d x %d-%d\n", wx, wy, wz, this.boundingBox.minX, this.boundingBox.maxX, this.boundingBox.minZ, this.boundingBox.maxZ); - - - return false; - } - else - { - int dx = this.getRelativeX(wx, wz); - int dy = this.getRelativeY(wy); - int dz = this.getRelativeZ(wx, wz); - - addDoor(dx, dy, dz); - - //System.out.printf("Break in success for component %s, at %d, %d, %d! Facing is %d\n", this, dx, dy, dz, this.getCoordBaseMode()); - - return true; - } - } - - /** - * Add a door to our list - */ - public void addDoorwayTo(int dx, int dy, int dz, int facing) { - switch (facing) - { - case 0: - addDoor(dx, dy, dz - 1); - break; - case 1: - addDoor(dx + 1, dy, dz); - break; - case 2: - addDoor(dx, dy, dz + 1); - break; - case 3: - addDoor(dx - 1, dy, dz); - break; - } - } - - /** - * Add a door to our list - */ - public void addDoor(int dx, int dy, int dz) { - this.doors.add(new ChunkCoordinates(dx, dy, dz)); - } - - /** - * Is the specified point a valid spot to break in? - */ - protected boolean isValidBreakInPoint(int wx, int wy, int wz) { - if (wy < this.boundingBox.minY || wy > this.boundingBox.maxY) - { - return false; - } - else if (wx == this.boundingBox.minX || wx == this.boundingBox.maxX) - { - return wz > this.boundingBox.minZ && wz < this.boundingBox.maxZ; - } - else if (wz == this.boundingBox.minZ || wz == this.boundingBox.maxZ) - { - return wx > this.boundingBox.minX && wx < this.boundingBox.maxX; - } - else - { - return false; - } - } - - protected int getRelativeX(int x, int z) - { - //this.getXWithOffset(x, z); - - switch(getCoordBaseMode()) - { - case 0: - return x - boundingBox.minX; - case 2: - return boundingBox.maxX - x; - case 1: - return z - boundingBox.minZ; - case 3: - return boundingBox.maxZ - z; - } - return x; - } - - protected int getRelativeY(int par1) - { - return par1 - this.boundingBox.minY; - } - - protected int getRelativeZ(int x, int z) - { - switch(getCoordBaseMode()) - { - case 0: - return z - boundingBox.minZ; - case 2: - return boundingBox.maxZ - z; - case 1: - return boundingBox.maxX - x; - case 3: - return x - boundingBox.minX; - } - return z; - } - - /** - * Place any doors on our list - */ - public void placeDoors(World world, Random rand, StructureBoundingBox sbb) - { - if (this.doors != null) - { - for (ChunkCoordinates doorCoords : doors) - { - this.placeDoorwayAt(world, rand, doorCoords.posX, doorCoords.posY, doorCoords.posZ, sbb); - - //this.placeBlockAtCurrentPosition(world, Blocks.wool, doorCoords.posX, doorCoords.posX, doorCoords.posY + 2, doorCoords.posZ, sbb); - } - } - } - - /** - * Place stronghold walls in every position except those filled with dirt. - */ - protected void placeStrongholdWalls(World world, StructureBoundingBox sbb, int sx, int sy, int sz, int dx, int dy, int dz, Random rand, StructureComponent.BlockSelector randomBlocks) { - for (int y = sy; y <= dy; ++y) - { - for (int x = sx; x <= dx; ++x) - { - for (int z = sz; z <= dz; ++z) - { - boolean wall = y == sy || y == dy || x == sx || x == dx || z == sz || z == dz; - Block blockID = this.getBlockAtCurrentPosition(world, x, y, z, sbb); - - if (blockID == Blocks.air) - { - // cobblestone to "fill in holes" - if (wall) - { - this.placeBlockAtCurrentPosition(world, Blocks.cobblestone, 0, x, y, z, sbb); - } - } - else if (y == sy || y == dy) - { - // do stronghold bricks for floor/ceiling - StructureComponent.BlockSelector strongBlocks = StructureTFComponent.getStrongholdStones(); - strongBlocks.selectBlocks(rand, x, y, z, wall); - this.placeBlockAtCurrentPosition(world, strongBlocks.func_151561_a(), strongBlocks.getSelectedBlockMetaData(), x, y, z, sbb); - - } - else if (!wall || blockID != Blocks.dirt) // leave dirt there - { - // and use decorator (with presumably underbricks) for walls - randomBlocks.selectBlocks(rand, x, y, z, wall); - this.placeBlockAtCurrentPosition(world, randomBlocks.func_151561_a(), randomBlocks.getSelectedBlockMetaData(), x, y, z, sbb); - } - } - } - } - } - - - /** - * Place stronghold walls on dirt/grass/stone - */ - protected void placeUpperStrongholdWalls(World world, StructureBoundingBox sbb, int sx, int sy, int sz, int dx, int dy, int dz, Random rand, StructureComponent.BlockSelector randomBlocks) { - for (int y = sy; y <= dy; ++y) - { - for (int x = sx; x <= dx; ++x) - { - for (int z = sz; z <= dz; ++z) - { - boolean wall = y == sy || y == dy || x == sx || x == dx || z == sz || z == dz; - Block blockID = this.getBlockAtCurrentPosition(world, x, y, z, sbb); - - if ((blockID != Blocks.air && (blockID.getMaterial() == Material.rock || blockID.getMaterial() == Material.grass || blockID.getMaterial() == Material.ground)) - || (blockID == Blocks.air && rand.nextInt(3) == 0) && this.getBlockAtCurrentPosition(world, x, y - 1, z, sbb) == Blocks.stonebrick) - { - if (y == sy || y == dy) - { - // do stronghold bricks for floor/ceiling - StructureComponent.BlockSelector strongBlocks = StructureTFComponent.getStrongholdStones(); - strongBlocks.selectBlocks(rand, x, y, z, wall); - this.placeBlockAtCurrentPosition(world, strongBlocks.func_151561_a(), strongBlocks.getSelectedBlockMetaData(), x, y, z, sbb); - - } - else - { - // and use decorator (with presumably underbricks) for walls - randomBlocks.selectBlocks(rand, x, y, z, wall); - this.placeBlockAtCurrentPosition(world, randomBlocks.func_151561_a(), randomBlocks.getSelectedBlockMetaData(), x, y, z, sbb); - } - } - } - } - } - } - - -} \ No newline at end of file diff --git a/src/main/java/twilightforest/structures/stronghold/StructureTFStrongholdShield.java b/src/main/java/twilightforest/structures/stronghold/StructureTFStrongholdShield.java deleted file mode 100644 index 5c3ae5912f..0000000000 --- a/src/main/java/twilightforest/structures/stronghold/StructureTFStrongholdShield.java +++ /dev/null @@ -1,52 +0,0 @@ -package twilightforest.structures.stronghold; - -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import twilightforest.block.TFBlocks; - -public class StructureTFStrongholdShield extends StructureTFStrongholdComponent { - - - - public StructureTFStrongholdShield() { - super(); - // TODO Auto-generated constructor stub - } - - public StructureTFStrongholdShield(int minX, int minY, int minZ, int maxX, int maxY, int maxZ) { - super(0, 0, minX, minY, minZ); - this.boundingBox = new StructureBoundingBox(minX, minY, minZ, maxX, maxY, maxZ); - this.spawnListIndex = -1; - } - - @Override - public StructureBoundingBox generateBoundingBox(int facing, int x, int y, int z) { - return null; - } - - @Override - public boolean addComponentParts(World world, Random random, StructureBoundingBox sbb) { - Block shieldBlock = TFBlocks.shield; - - //Facing.facings - - // +x - this.fillWithMetadataBlocks(world, sbb, this.boundingBox.getXSize(), 0, 0, this.boundingBox.getXSize(), this.boundingBox.getYSize(), this.boundingBox.getZSize(), shieldBlock, 4, shieldBlock, 4, false); - // -x - this.fillWithMetadataBlocks(world, sbb, 0, 0, 0, 0, this.boundingBox.getYSize(), this.boundingBox.getZSize(), shieldBlock, 5, shieldBlock, 5, false); - // +z - this.fillWithMetadataBlocks(world, sbb, 0, 0, this.boundingBox.getZSize(), this.boundingBox.getXSize(), this.boundingBox.getYSize(), this.boundingBox.getZSize(), shieldBlock, 2, shieldBlock, 2, false); - // -z - this.fillWithMetadataBlocks(world, sbb, 0, 0, 0, this.boundingBox.getXSize(), this.boundingBox.getYSize(), 0, shieldBlock, 3, shieldBlock, 3, false); - // top - this.fillWithMetadataBlocks(world, sbb, 0, 0, 0, this.boundingBox.getXSize(), 0, this.boundingBox.getZSize(), shieldBlock, 1, shieldBlock, 1, false); - // bottom - this.fillWithMetadataBlocks(world, sbb, 0, this.boundingBox.getYSize(), 0, this.boundingBox.getXSize(), this.boundingBox.getYSize(), this.boundingBox.getZSize(), shieldBlock, 0, shieldBlock, 0, false); - - return true; - } - -} diff --git a/src/main/java/twilightforest/structures/stronghold/TFStrongholdPieceWeight.java b/src/main/java/twilightforest/structures/stronghold/TFStrongholdPieceWeight.java deleted file mode 100644 index badb3a3208..0000000000 --- a/src/main/java/twilightforest/structures/stronghold/TFStrongholdPieceWeight.java +++ /dev/null @@ -1,40 +0,0 @@ -package twilightforest.structures.stronghold; - -import twilightforest.structures.StructureTFComponent; - -/** - * Based off StructureStrongholdPieceWeight - */ -public class TFStrongholdPieceWeight { - - public Class pieceClass; - public final int pieceWeight; - public int instancesSpawned; - - /** How many Structure Pieces of this type may spawn in a structure */ - public int instancesLimit; - public int minimumDepth; - - public TFStrongholdPieceWeight(Class par1Class, int weight, int limit) - { - this(par1Class, weight, limit, 0); - } - public TFStrongholdPieceWeight(Class par1Class, int weight, int limit, int minDepth) - { - this.pieceClass = par1Class; - this.pieceWeight = weight; - this.instancesLimit = limit; - this.minimumDepth = minDepth; - } - - public boolean isDeepEnough(int par1) - { - return canSpawnMoreStructures() && par1 >= this.minimumDepth; - } - - public boolean canSpawnMoreStructures() - { - return this.instancesLimit == 0 || this.instancesSpawned < this.instancesLimit; - } - -} diff --git a/src/main/java/twilightforest/structures/stronghold/TFStrongholdPieces.java b/src/main/java/twilightforest/structures/stronghold/TFStrongholdPieces.java deleted file mode 100644 index 741db82c6c..0000000000 --- a/src/main/java/twilightforest/structures/stronghold/TFStrongholdPieces.java +++ /dev/null @@ -1,188 +0,0 @@ -package twilightforest.structures.stronghold; - -import java.lang.reflect.InvocationTargetException; -import java.util.ArrayList; -import java.util.List; -import java.util.Random; - -import twilightforest.structures.StructureTFComponent; -import net.minecraft.world.gen.structure.MapGenStructureIO; -import net.minecraft.world.gen.structure.StructureComponent; - -public class TFStrongholdPieces { - - private static final TFStrongholdPieceWeight[] pieceWeightArray = new TFStrongholdPieceWeight[] { - new TFStrongholdPieceWeight(ComponentTFStrongholdSmallHallway.class, 40, 0), - new TFStrongholdPieceWeight(ComponentTFStrongholdLeftTurn.class, 20, 0), - new TFStrongholdPieceWeight(ComponentTFStrongholdCrossing.class, 10, 4), - new TFStrongholdPieceWeight(ComponentTFStrongholdRightTurn.class, 20, 0), - new TFStrongholdPieceWeight(ComponentTFStrongholdDeadEnd.class, 5, 0), - new TFStrongholdPieceWeight(ComponentTFStrongholdBalconyRoom.class, 10, 3, 2), - new TFStrongholdPieceWeight(ComponentTFStrongholdTrainingRoom.class, 10, 2), - new TFStrongholdPieceWeight(ComponentTFStrongholdSmallStairs.class, 10, 0), - new TFStrongholdPieceWeight(ComponentTFStrongholdTreasureCorridor.class, 5, 0), - new TFStrongholdPieceWeight(ComponentTFStrongholdAtrium.class, 5, 2, 3), - new TFStrongholdPieceWeight(ComponentTFStrongholdFoundry.class, 5, 1, 4), - new TFStrongholdPieceWeight(ComponentTFStrongholdTreasureRoom.class, 5, 1, 4), - new TFStrongholdPieceWeight(ComponentTFStrongholdBossRoom.class, 10, 1, 4)}; - - private List pieceList; - static int totalWeight = 0; - - private static Class lastPieceMade; - - public static void registerPieces() - { - MapGenStructureIO.func_143031_a(ComponentTFStrongholdSmallHallway.class, "TFSSH"); - MapGenStructureIO.func_143031_a(ComponentTFStrongholdLeftTurn.class, "TFSLT"); - MapGenStructureIO.func_143031_a(ComponentTFStrongholdCrossing.class, "TFSCr"); - MapGenStructureIO.func_143031_a(ComponentTFStrongholdRightTurn.class, "TFSRT"); - MapGenStructureIO.func_143031_a(ComponentTFStrongholdDeadEnd.class, "TFSDE"); - MapGenStructureIO.func_143031_a(ComponentTFStrongholdBalconyRoom.class, "TFSBR"); - MapGenStructureIO.func_143031_a(ComponentTFStrongholdTrainingRoom.class, "TFSTR"); - MapGenStructureIO.func_143031_a(ComponentTFStrongholdSmallStairs.class, "TFSSS"); - MapGenStructureIO.func_143031_a(ComponentTFStrongholdTreasureCorridor.class, "TFSTC"); - MapGenStructureIO.func_143031_a(ComponentTFStrongholdAtrium.class, "TFSAt"); - MapGenStructureIO.func_143031_a(ComponentTFStrongholdFoundry.class, "TFSFo"); - MapGenStructureIO.func_143031_a(ComponentTFStrongholdTreasureRoom.class, "TFTreaR"); - MapGenStructureIO.func_143031_a(ComponentTFStrongholdBossRoom.class, "TFSBR"); - MapGenStructureIO.func_143031_a(ComponentTFStrongholdAccessChamber.class, "TFSAC"); - MapGenStructureIO.func_143031_a(ComponentTFStrongholdEntrance.class, "TFSEnter"); - MapGenStructureIO.func_143031_a(ComponentTFStrongholdUpperAscender.class, "TFSUA"); - MapGenStructureIO.func_143031_a(ComponentTFStrongholdUpperLeftTurn.class, "TFSULT"); - MapGenStructureIO.func_143031_a(ComponentTFStrongholdUpperRightTurn.class, "TFSURT"); - MapGenStructureIO.func_143031_a(ComponentTFStrongholdUpperCorridor.class, "TFSUCo"); - MapGenStructureIO.func_143031_a(ComponentTFStrongholdUpperTIntersection.class, "TFSUTI"); - MapGenStructureIO.func_143031_a(StructureTFStrongholdShield.class, "TFSShield"); - } - - /** - * sets up Arrays with the Structure pieces and their weights - */ - public void prepareStructurePieces() - { - pieceList = new ArrayList(); - - for (TFStrongholdPieceWeight piece : pieceWeightArray) - { - piece.instancesSpawned = 0; - pieceList.add(piece); - } - } - - public void markBossRoomUsed() - { - // let's assume the boss room is the last one on the list - //System.out.println("Removing " + pieceList.get(pieceList.size() - 1).pieceClass); - - pieceList.remove(pieceList.size() - 1); - } - - - private boolean hasMoreLimitedPieces() - { - boolean flag = false; - totalWeight = 0; - - for (TFStrongholdPieceWeight piece : pieceList) - { - totalWeight += piece.pieceWeight; - - if (piece.instancesLimit > 0 && piece.instancesSpawned < piece.instancesLimit) - { - flag = true; - } - } - - return flag; - } - - @SuppressWarnings("rawtypes") - public StructureTFStrongholdComponent getNextComponent(StructureComponent parent, List list, Random random, int index, int facing, int x, int y, int z) - { - if (!hasMoreLimitedPieces()) - { - return null; - } - else - { - // repeat up to 5 times if we're not getting the right thing - for (int i = 0; i < 5; i++) - { - int counter = random.nextInt(totalWeight); - - for (TFStrongholdPieceWeight piece : pieceList) - { - counter -= piece.pieceWeight; - - if (counter < 0) - { - - if (!piece.isDeepEnough(index) || piece.pieceClass == lastPieceMade) - { - break; - } - - // we're here! - StructureTFStrongholdComponent component = instantiateComponent(piece.pieceClass, index, facing, x, y, z); - - if (StructureComponent.findIntersecting(list, component.getBoundingBox()) == null) - { - ++piece.instancesSpawned; - - if (!piece.canSpawnMoreStructures()) - { - pieceList.remove(piece); - } - - lastPieceMade = piece.pieceClass; - - return component; - } - } - } - } - } - - // dead end? - StructureTFStrongholdComponent deadEnd = new ComponentTFStrongholdDeadEnd(index, facing, x, y, z); - - if (StructureComponent.findIntersecting(list, deadEnd.getBoundingBox()) == null) - { - return deadEnd; - } - else - { - return null; - } - } - - private static StructureTFStrongholdComponent instantiateComponent(Class pieceClass, int index, int facing, int x, int y, int z) { - try { - return (StructureTFStrongholdComponent) pieceClass.getConstructor(int.class, int.class, int.class, int.class, int.class).newInstance(index, facing, x, y, z); - } catch (InstantiationException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (IllegalAccessException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (IllegalArgumentException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (InvocationTargetException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (NoSuchMethodException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (SecurityException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - - //// attempted = new ComponentTFStrongholdRoom(index, nFacing, nx, ny, nz); - - return null; - } - -} diff --git a/src/main/java/twilightforest/structures/trollcave/ComponentTFCloudCastle.java b/src/main/java/twilightforest/structures/trollcave/ComponentTFCloudCastle.java deleted file mode 100644 index ed140dd984..0000000000 --- a/src/main/java/twilightforest/structures/trollcave/ComponentTFCloudCastle.java +++ /dev/null @@ -1,131 +0,0 @@ -package twilightforest.structures.trollcave; - -import java.util.List; -import java.util.Random; - -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import net.minecraft.world.gen.structure.StructureComponent; -import twilightforest.block.TFBlocks; -import twilightforest.entity.EntityTFArmoredGiant; -import twilightforest.entity.EntityTFGiantMiner; -import twilightforest.structures.StructureTFComponent; - -public class ComponentTFCloudCastle extends StructureTFComponent { - - private boolean minerPlaced = false; - private boolean warriorPlaced = false; - - public ComponentTFCloudCastle() { } - - public ComponentTFCloudCastle(int index, int x, int y, int z) { - super(index); - this.setCoordBaseMode(0); - - - // adjust x, y, z - x = (x >> 2) << 2; - y = (y >> 2) << 2; - z = (z >> 2) << 2; - - // spawn list! - this.spawnListIndex = 1; - - this.boundingBox = StructureTFComponent.getComponentToAddBoundingBox(x, y, z, -8, 0, -8, 16, 16, 16, 0); - } - - /** - * Save to NBT - */ - @Override - protected void func_143012_a(NBTTagCompound par1NBTTagCompound) { - super.func_143012_a(par1NBTTagCompound); - - par1NBTTagCompound.setBoolean("minerPlaced", this.minerPlaced); - par1NBTTagCompound.setBoolean("warriorPlaced", this.warriorPlaced); - } - - /** - * Load from NBT - */ - @Override - protected void func_143011_b(NBTTagCompound par1NBTTagCompound) { - super.func_143011_b(par1NBTTagCompound); - this.minerPlaced = par1NBTTagCompound.getBoolean("minerPlaced"); - this.warriorPlaced = par1NBTTagCompound.getBoolean("warriorPlaced"); - - } - - - @SuppressWarnings({ "rawtypes", "unchecked" }) - @Override - public void buildComponent(StructureComponent parent, List list, Random rand) { - // up to two trees - // tree in x direction - boolean plus = rand.nextBoolean(); - int offset = rand.nextInt(5) - rand.nextInt(5); - ComponentTFCloudTree treeX = new ComponentTFCloudTree(this.getComponentType() + 1, boundingBox.minX + (plus ? 16 : -16), 168, boundingBox.minZ - 8 + (offset * 4)); - list.add(treeX); - treeX.buildComponent(this, list, rand); - - // tree in z direction - plus = rand.nextBoolean(); - offset = rand.nextInt(5) - rand.nextInt(5); - ComponentTFCloudTree treeZ = new ComponentTFCloudTree(this.getComponentType() + 1, boundingBox.minX - 8 + (offset * 4), 168, boundingBox.minZ + (plus ? 16 : -16)); - list.add(treeZ); - treeZ.buildComponent(this, list, rand); - - } - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - // make haus - this.fillWithMetadataBlocks(world, sbb, 0, -4, 0, 15, -1, 15, TFBlocks.fluffyCloud, 0,TFBlocks.fluffyCloud, 0, false); - this.fillWithMetadataBlocks(world, sbb, 0, 0, 0, 15, 11, 15, TFBlocks.giantCobble, 0, TFBlocks.giantCobble, 0, false); - this.fillWithMetadataBlocks(world, sbb, 0, 12, 0, 15, 15, 15, TFBlocks.giantLog, 0, TFBlocks.giantLog, 0, false); - - - // clear inside - this.fillWithAir(world, sbb, 4, 0, 4, 11, 11, 11); - - // clear door - this.fillWithAir(world, sbb, 0, 0, 4, 4, 7, 7); - - - // add giants - if (!this.minerPlaced) { - int bx = this.getXWithOffset(6, 6); - int by = this.getYWithOffset(0); - int bz = this.getZWithOffset(6, 6); - - if (sbb.isVecInside(bx, by, bz)) { - this.minerPlaced = true; - - EntityTFGiantMiner miner = new EntityTFGiantMiner(world); - miner.setPosition(bx, by, bz); - miner.makeNonDespawning(); - - world.spawnEntityInWorld(miner); - } - } - if (!this.warriorPlaced) { - int bx = this.getXWithOffset(9, 9); - int by = this.getYWithOffset(0); - int bz = this.getZWithOffset(9, 9); - - if (sbb.isVecInside(bx, by, bz)) { - this.warriorPlaced = true; - - EntityTFArmoredGiant warrior = new EntityTFArmoredGiant(world); - warrior.setPosition(bx, by, bz); - warrior.makeNonDespawning(); - - world.spawnEntityInWorld(warrior); - } - } - - return true; - } - -} diff --git a/src/main/java/twilightforest/structures/trollcave/ComponentTFCloudTree.java b/src/main/java/twilightforest/structures/trollcave/ComponentTFCloudTree.java deleted file mode 100644 index 79a158d564..0000000000 --- a/src/main/java/twilightforest/structures/trollcave/ComponentTFCloudTree.java +++ /dev/null @@ -1,48 +0,0 @@ -package twilightforest.structures.trollcave; - -import java.util.Random; - -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import twilightforest.block.TFBlocks; -import twilightforest.structures.StructureTFComponent; - - -public class ComponentTFCloudTree extends StructureTFComponent { - - public ComponentTFCloudTree() {} - - - public ComponentTFCloudTree(int index, int x, int y, int z) { - this.setCoordBaseMode(0); - - // adjust x, y, z - x = (x >> 2) << 2; - y = (y >> 2) << 2; - z = (z >> 2) << 2; - - this.boundingBox = StructureTFComponent.getComponentToAddBoundingBox(x, y, z, -8, 0, -8, 20, 28, 20, 0); - - // spawn list! - this.spawnListIndex = 1; - } - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - - // leaves - this.fillWithMetadataBlocks(world, sbb, 0, 12, 0, 19, 19, 19, TFBlocks.giantLeaves, 0,TFBlocks.giantLeaves, 0, false); - this.fillWithMetadataBlocks(world, sbb, 4, 20, 4, 15, 23, 15, TFBlocks.giantLeaves, 0,TFBlocks.giantLeaves, 0, false); - this.fillWithMetadataBlocks(world, sbb, 8, 24, 4, 11, 27, 15, TFBlocks.giantLeaves, 0,TFBlocks.giantLeaves, 0, false); - this.fillWithMetadataBlocks(world, sbb, 4, 24, 8, 15, 27, 11, TFBlocks.giantLeaves, 0,TFBlocks.giantLeaves, 0, false); - - // trunk - this.fillWithMetadataBlocks(world, sbb, 8, 0, 8, 11, 23, 11, TFBlocks.giantLog, 0,TFBlocks.giantLog, 0, false); - - // cloud base - this.fillWithMetadataBlocks(world, sbb, 8, -4, 8, 11, -1, 11, TFBlocks.fluffyCloud, 0,TFBlocks.fluffyCloud, 0, false); - - return true; - } - -} diff --git a/src/main/java/twilightforest/structures/trollcave/ComponentTFTrollCaveConnect.java b/src/main/java/twilightforest/structures/trollcave/ComponentTFTrollCaveConnect.java deleted file mode 100644 index 937a012b3b..0000000000 --- a/src/main/java/twilightforest/structures/trollcave/ComponentTFTrollCaveConnect.java +++ /dev/null @@ -1,345 +0,0 @@ -package twilightforest.structures.trollcave; - -import java.util.List; -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.init.Blocks; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.ChunkCoordinates; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import net.minecraft.world.gen.structure.StructureComponent; -import twilightforest.TFTreasure; -import twilightforest.block.TFBlocks; -import twilightforest.structures.StructureTFComponent; - - -public class ComponentTFTrollCaveConnect extends ComponentTFTrollCaveMain { - - protected boolean [] openingTowards = new boolean[] {false, false, true, false}; - - public ComponentTFTrollCaveConnect() { } - - public ComponentTFTrollCaveConnect(int index, int x, int y, int z, int caveSize, int caveHeight, int direction) { - super(index); - this.size = caveSize; - this.height = caveHeight; - this.setCoordBaseMode(direction); - this.boundingBox = StructureTFComponent.getComponentToAddBoundingBox(x, y, z, 0, 0, 0, size - 1, height - 1, size - 1, direction); - } - - /** - * Save to NBT - */ - @Override - protected void func_143012_a(NBTTagCompound par1NBTTagCompound) { - super.func_143012_a(par1NBTTagCompound); - - par1NBTTagCompound.setBoolean("openingTowards0", this.openingTowards[0]); - par1NBTTagCompound.setBoolean("openingTowards1", this.openingTowards[1]); - par1NBTTagCompound.setBoolean("openingTowards2", this.openingTowards[2]); - par1NBTTagCompound.setBoolean("openingTowards3", this.openingTowards[3]); - - } - - /** - * Load from NBT - */ - @Override - protected void func_143011_b(NBTTagCompound par1NBTTagCompound) { - super.func_143011_b(par1NBTTagCompound); - - // too lazy to do this as a loop - this.openingTowards[0] = par1NBTTagCompound.getBoolean("openingTowards0"); - this.openingTowards[1] = par1NBTTagCompound.getBoolean("openingTowards1"); - this.openingTowards[2] = par1NBTTagCompound.getBoolean("openingTowards2"); - this.openingTowards[3] = par1NBTTagCompound.getBoolean("openingTowards3"); - } - - @SuppressWarnings({ "rawtypes", "unchecked" }) - @Override - public void buildComponent(StructureComponent parent, List list, Random rand) { - // make 4 caves - if (this.getComponentType() < 3) { - - for (int i = 0; i < 4; i++) { - ChunkCoordinates dest = getValidOpening(rand, 2, i); - - if (rand.nextBoolean() || !makeGardenCave(list, rand, this.getComponentType() + 1, dest.posX, dest.posY, dest.posZ, 30, 15, i)) { - makeSmallerCave(list, rand, this.getComponentType() + 1, dest.posX, dest.posY, dest.posZ, 20, 15, i); - } - - } - } - } - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - if (this.isBoundingBoxOutOfHighlands(world, sbb)) { - return false; - } else { - // clear inside - hollowCaveMiddle(world, sbb, rand, 0, 0, 0, this.size - 1, this.height - 1, this.size - 1); - - Random decoRNG = new Random(world.getSeed() + (this.boundingBox.minX * 321534781) ^ (this.boundingBox.minZ * 756839)); - - // wall decorations - for (int i = 0; i < 4; i++) { - if (!this.openingTowards[i]) { - decorateWall(world, sbb, decoRNG, i); - } - } - - decoRNG.setSeed(world.getSeed() + (this.boundingBox.minX * 321534781) ^ (this.boundingBox.minZ * 756839)); - // stone stalactites! - for (int i = 0; i < 32; i++) - { - ChunkCoordinates dest = getCoordsInCave(decoRNG); - generateBlockStalactite(world, decoRNG, Blocks.stone, 0.5F, true, dest.posX, 3, dest.posZ, sbb); - } - // stone stalagmites! - for (int i = 0; i < 8; i++) - { - ChunkCoordinates dest = getCoordsInCave(decoRNG); - generateBlockStalactite(world, decoRNG, Blocks.stone, 0.5F, false, dest.posX, 3, dest.posZ, sbb); - } - - // possible treasure - decoRNG.setSeed(world.getSeed() + (this.boundingBox.minX * 321534781) ^ (this.boundingBox.minZ * 756839)); - if (this.countExits() == 1 && decoRNG.nextInt(3) == 0) { - // treasure! - makeTreasureCrate(world, decoRNG, sbb); - } else if (decoRNG.nextInt(3) == 0) { - // or a monolith! - makeMonolith(world, decoRNG, sbb); - } - - return true; - } - } - - protected void makeMonolith(World world, Random rand, StructureBoundingBox sbb) { - // monolith - int mid = this.size / 2; - int height = 7 + rand.nextInt(8); - int rotation = rand.nextInt(4); - - this.fillBlocksRotated(world, sbb, mid - 1, 0, mid - 1, mid - 1, height, mid - 1, Blocks.obsidian, 0, rotation); - this.fillBlocksRotated(world, sbb, mid + 0, 0, mid - 1, mid + 0, height - 2, mid - 1, Blocks.obsidian, 0, rotation); - this.fillBlocksRotated(world, sbb, mid - 1, 0, mid + 0, mid - 1, height - 2, mid + 0, Blocks.obsidian, 0, rotation); - this.fillBlocksRotated(world, sbb, mid + 0, 0, mid + 0, mid + 0, height - 4, mid + 0, Blocks.obsidian, 0, rotation); - } - - private int countExits() { - int count = 0; - for (int i = 0; i < this.openingTowards.length; i++) { - if (this.openingTowards[i] == true) { - count++; - } - } - return count; - } - - private void decorateWall(World world, StructureBoundingBox sbb, Random decoRNG, int rotation) { - - if (decoRNG.nextBoolean()) { - decorateBracketMushrooms(world, sbb, decoRNG, rotation); - } else if (decoRNG.nextBoolean()) { - decorateStoneFormation(world, sbb, decoRNG, rotation); - decorateStoneFormation(world, sbb, decoRNG, rotation); - } else { - decorateStoneProjection(world, sbb, decoRNG, rotation); - } - - } - - private void decorateStoneFormation(World world, StructureBoundingBox sbb, Random decoRNG, int rotation) { - int z = 5 + decoRNG.nextInt(7); - int startY = 1 + decoRNG.nextInt(2); - - for (int y = startY; y < this.height; y += 2) { - - int width = 1; - int depth = 1 + (decoRNG.nextInt(3) == 0 ? 1 : 0); - makeSingleStoneFormation(world, sbb, decoRNG, rotation, z, y, width, depth); - - // wiggle a little - z += decoRNG.nextInt(4) - decoRNG.nextInt(4); - if (z < 5 || z > this.size - 5) { - z = 5 + decoRNG.nextInt(7); - } - } - } - - private void makeSingleStoneFormation(World world, StructureBoundingBox sbb, Random decoRNG, int rotation, int z, int y, int width, int depth) { - if (decoRNG.nextInt(8) == 0) { - this.fillBlocksRotated(world, sbb, size - (depth + 1), y - width, z - width, size - 1, y + width, z + width, Blocks.obsidian, 0, rotation); - } else if (decoRNG.nextInt(4) == 0) { - this.fillBlocksRotated(world, sbb, size - (depth + 1), y - width, z - width, size - 1, y + width, z + width, TFBlocks.trollSteinn, 0, rotation); - } else { - // normal stone - this.fillBlocksRotated(world, sbb, size - (depth + 1), y - width, z - width, size - 1, y + width, z + width, Blocks.stone, 0, rotation); - } - //this.randomlyFillBlocksRotated(world, sbb, decoRNG, 0.5F, size - (depth + 1), y - width, z - width, size - 1, y + width, z + width, TFBlocks.trollSteinn, 0, Blocks.stone, 0, rotation); - } - - private void decorateStoneProjection(World world, StructureBoundingBox sbb, Random decoRNG, int rotation) { - int z = 7 + decoRNG.nextInt(3) - decoRNG.nextInt(3); - int y = 7 + decoRNG.nextInt(3) - decoRNG.nextInt(3); - - this.randomlyFillBlocksRotated(world, sbb, decoRNG, 0.25F, size - 9, y, z, size - 2, y + 3, z + 3, TFBlocks.trollSteinn, 0, Blocks.stone, 0, rotation); - if (decoRNG.nextBoolean()) { - // down - this.randomlyFillBlocksRotated(world, sbb, decoRNG, 0.25F, size - 9, 1, z, size - 6, y - 1, z + 3, TFBlocks.trollSteinn, 0, Blocks.stone, 0, rotation); - } else { - // up - this.randomlyFillBlocksRotated(world, sbb, decoRNG, 0.25F, size - 9, y + 4, z, size - 6, height - 2, z + 3, TFBlocks.trollSteinn, 0, Blocks.stone, 0, rotation); - } - } - - /** - * Decorate with a patch of bracket fungi - */ - private void decorateBracketMushrooms(World world, StructureBoundingBox sbb, Random decoRNG, int rotation) { - int z = 5 + decoRNG.nextInt(7); - int startY = 1 + decoRNG.nextInt(4); - - for (int y = startY; y < this.height; y += 2) { - - int width = 1 + decoRNG.nextInt(2) + decoRNG.nextInt(2); - int depth = 1 + decoRNG.nextInt(2) + decoRNG.nextInt(2); - Block mushBlock = ((decoRNG.nextInt(3) == 0) ? TFBlocks.hugeGloomBlock : (decoRNG.nextBoolean() ? Blocks.brown_mushroom_block : Blocks.red_mushroom_block)); - makeSingleBracketMushroom(world, sbb, rotation, z, y, width, depth, mushBlock); - - // wiggle a little - z += decoRNG.nextInt(4) - decoRNG.nextInt(4); - if (z < 5 || z > this.size - 5) { - z = 5 + decoRNG.nextInt(7); - } - } - } - - /** - * Make one mushroom with the specified parameters - */ - private void makeSingleBracketMushroom(World world, StructureBoundingBox sbb, int rotation, int z, int y, int width, int depth, Block mushBlock) { - - this.fillBlocksRotated(world, sbb, size - depth, y, z - (width - 1), size - 2, y, z + (width - 1), mushBlock, 5, rotation); - - this.fillBlocksRotated(world, sbb, size - (depth + 1), y, z - (width - 1), size - (depth + 1), y, z + (width - 1), mushBlock, getMushroomMetaFor(4, rotation), rotation); - - for (int d = 0; d < (depth - 1); d++) { - this.placeBlockRotated(world, mushBlock, getMushroomMetaFor(2, rotation), size - (2 + d), y, z - width, rotation, sbb); - } - this.placeBlockRotated(world, mushBlock, getMushroomMetaFor(1, rotation), size - (depth + 1), y, z - width, rotation, sbb); - - for (int d = 0; d < (depth - 1); d++) { - this.placeBlockRotated(world, mushBlock, getMushroomMetaFor(8, rotation), size - (2 + d), y, z + width, rotation, sbb); - } - this.placeBlockRotated(world, mushBlock, getMushroomMetaFor(7, rotation), size - (depth + 1), y, z + width, rotation, sbb); - - - } - - - /** - * Hacky, incomplete method to generate mushroom block metadata - */ - private int getMushroomMetaFor(int meta, int rotation) { - if (meta > 0 && meta < 10) { - - int totalRot = (coordBaseMode + rotation) % 4; - - switch (totalRot) { - case 0: - return meta; - case 1: - switch (meta) { - case 1: - return 3; - case 2: - return 6; - case 4: - return 2; - case 7: - return 1; - case 8: - return 4; - } - case 2: - return 10 - (meta % 10); - case 3: - switch (meta) { - case 1: - return 7; - case 2: - return 4; - case 4: - return 8; - case 7: - return 9; - case 8: - return 6; - } - default: - return 15; - } - } else { - return meta; - } - - } - - protected boolean makeGardenCave(List list, Random rand, int index, int x, int y, int z, int caveSize, int caveHeight, int rotation) { - int direction = (getCoordBaseMode() + rotation) % 4; - ChunkCoordinates dest = offsetTowerCCoords(x, y, z, caveSize, direction); - - ComponentTFTrollCaveMain cave = new ComponentTFTrollCaveGarden(index, dest.posX, dest.posY, dest.posZ, caveSize, caveHeight, direction); - // check to see if it intersects something already there - StructureComponent intersect = StructureComponent.findIntersecting(list, cave.getBoundingBox()); - StructureComponent otherGarden = findNearbyGarden(list, cave.getBoundingBox()); - if ((intersect == null || intersect == this) && otherGarden == null) { - list.add(cave); - cave.buildComponent(list.get(0), list, rand); - //addOpening(x, y, z, rotation); - - this.openingTowards[rotation] = true; - - return true; - } - else - { - return false; - } - } - - private StructureComponent findNearbyGarden(List list, StructureBoundingBox boundingBox) { - - StructureBoundingBox largeBox = new StructureBoundingBox(boundingBox); - largeBox.minX -= 30; - largeBox.minY -= 30; - largeBox.minZ -= 30; - largeBox.maxX += 30; - largeBox.maxY += 30; - largeBox.maxZ += 30; - - for (StructureComponent component : list) { - if (component instanceof ComponentTFTrollCaveGarden && component.getBoundingBox().intersectsWith(largeBox)) { - //System.out.println("found intersecting garden"); - return component; - } - } - - return null; - } - - protected boolean makeSmallerCave(List list, Random rand, int index, int x, int y, int z, int caveSize, int caveHeight, int rotation) { - if (super.makeSmallerCave(list, rand, index, x, y, z, caveSize, caveHeight, rotation)) { - this.openingTowards[rotation] = true; - return true; - } else { - return false; - } - } -} diff --git a/src/main/java/twilightforest/structures/trollcave/ComponentTFTrollCaveGarden.java b/src/main/java/twilightforest/structures/trollcave/ComponentTFTrollCaveGarden.java deleted file mode 100644 index 0d552f011a..0000000000 --- a/src/main/java/twilightforest/structures/trollcave/ComponentTFTrollCaveGarden.java +++ /dev/null @@ -1,120 +0,0 @@ -package twilightforest.structures.trollcave; - -import java.util.List; -import java.util.Random; - -import net.minecraft.init.Blocks; -import net.minecraft.util.ChunkCoordinates; -import net.minecraft.world.World; -import net.minecraft.world.gen.feature.WorldGenBigMushroom; -import net.minecraft.world.gen.feature.WorldGenerator; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import net.minecraft.world.gen.structure.StructureComponent; -import twilightforest.structures.StructureTFComponent; -import twilightforest.world.TFGenBigMushgloom; -import twilightforest.world.TFGenMyceliumBlob; - -public class ComponentTFTrollCaveGarden extends ComponentTFTrollCaveMain { - - TFGenMyceliumBlob myceliumBlobGen = new TFGenMyceliumBlob(5); - TFGenMyceliumBlob dirtGen = new TFGenMyceliumBlob(Blocks.dirt, 5); - WorldGenBigMushroom bigMushroomGen = new WorldGenBigMushroom(); - TFGenBigMushgloom bigMushgloomGen = new TFGenBigMushgloom(); - - - public ComponentTFTrollCaveGarden() { } - - public ComponentTFTrollCaveGarden(int index, int x, int y, int z, int caveSize, int caveHeight, int direction) { - super(index); - this.size = caveSize; - this.height = caveHeight; - this.setCoordBaseMode(direction); - this.boundingBox = StructureTFComponent.getComponentToAddBoundingBox(x, y, z, 0, 0, 0, size - 1, height - 1, size - 1, direction); - } - - @SuppressWarnings({ "rawtypes" }) - @Override - public void buildComponent(StructureComponent parent, List list, Random rand) { - // add a cloud -// ComponentTFTrollCloud cloud = new ComponentTFTrollCloud(1, boundingBox.minX + ((boundingBox.maxX - boundingBox.minX) / 2), rand.nextInt(64) + 160, boundingBox.minZ + ((boundingBox.maxZ - boundingBox.minZ) / 2)); -// list.add(cloud); -// cloud.buildComponent(this, list, rand); - } - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - if (this.isBoundingBoxOutOfHighlands(world, sbb)) { - return false; - } else { - // clear inside - hollowCaveMiddle(world, sbb, rand, 0, 0, 0, this.size - 1, this.height - 1, this.size - 1); - Random decoRNG = new Random(world.getSeed() + (this.boundingBox.minX * 321534781) ^ (this.boundingBox.minZ * 756839)); - - // treasure! - makeTreasureCrate(world, rand, sbb); - - // dirt! - for (int i = 0; i < 24; i++) - { - ChunkCoordinates dest = getCoordsInCave(decoRNG); - generate(world, dirtGen, decoRNG, dest.posX, 1, dest.posZ, sbb); - } - - // mycelium! - for (int i = 0; i < 16; i++) - { - ChunkCoordinates dest = getCoordsInCave(decoRNG); - generate(world, myceliumBlobGen, decoRNG, dest.posX, 1, dest.posZ, sbb); - } - - // uberous! - for (int i = 0; i < 16; i++) - { - ChunkCoordinates dest = getCoordsInCave(decoRNG); - generate(world, uberousGen, decoRNG, dest.posX, 1, dest.posZ, sbb); - - generateAtSurface(world, uberousGen, decoRNG, dest.posX, 60, dest.posZ, sbb); - } - - // mushglooms first - for (int i = 0; i < 32; i++) - { - ChunkCoordinates dest = getCoordsInCave(decoRNG); - generate(world, bigMushgloomGen, decoRNG, dest.posX, 1, dest.posZ, sbb); - } - - // mushrooms! - for (int i = 0; i < 64; i++) - { - ChunkCoordinates dest = getCoordsInCave(decoRNG); - generate(world, bigMushroomGen, decoRNG, dest.posX, 1, dest.posZ, sbb); - } - - // stone stalactites! - for (int i = 0; i < 128; i++) - { - ChunkCoordinates dest = getCoordsInCave(decoRNG); - generateBlockStalactite(world, decoRNG, Blocks.stone, 0.7F, true, dest.posX, 3, dest.posZ, sbb); - } - - - return true; - } - } - - /** - * Use the generator at the specified coords - */ - protected void generate(World world, WorldGenerator generator, Random rand, int x, int y, int z, StructureBoundingBox sbb) { - // are the coordinates in our bounding box? - int dx = getXWithOffset(x, z); - int dy = getYWithOffset(y); - int dz = getZWithOffset(x, z); - if(sbb.isVecInside(dx, dy, dz)) { - generator.generate(world, rand, dx, dy, dz); - } - } - - - -} diff --git a/src/main/java/twilightforest/structures/trollcave/ComponentTFTrollCaveMain.java b/src/main/java/twilightforest/structures/trollcave/ComponentTFTrollCaveMain.java deleted file mode 100644 index 6c2e6af811..0000000000 --- a/src/main/java/twilightforest/structures/trollcave/ComponentTFTrollCaveMain.java +++ /dev/null @@ -1,301 +0,0 @@ -package twilightforest.structures.trollcave; - -import java.util.List; -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.init.Blocks; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.ChunkCoordinates; -import net.minecraft.world.World; -import net.minecraft.world.gen.feature.WorldGenerator; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import net.minecraft.world.gen.structure.StructureComponent; -import twilightforest.TFTreasure; -import twilightforest.biomes.TFBiomeBase; -import twilightforest.block.TFBlocks; -import twilightforest.structures.StructureTFComponent; -import twilightforest.world.TFGenCaveStalactite; -import twilightforest.world.TFGenMyceliumBlob; - -public class ComponentTFTrollCaveMain extends StructureTFComponent { - - protected int size; - protected int height; - - public static final TFGenMyceliumBlob uberousGen = new TFGenMyceliumBlob(TFBlocks.uberousSoil, 4); - - - - public ComponentTFTrollCaveMain() { } - - public ComponentTFTrollCaveMain(int index) { - super(index); - } - - - public ComponentTFTrollCaveMain(World world, Random rand, int i, int x, int y, int z) { - this.setCoordBaseMode(0); - - // adjust y - y += 10; - - this.size = 30; - this.height = 20; - - int radius = this.size / 2; - this.boundingBox = StructureTFComponent.getComponentToAddBoundingBox(x, y, z, -radius, -this.height, -radius, this.size, this.height, this.size, 0); - - } - - /** - * Save to NBT - */ - @Override - protected void func_143012_a(NBTTagCompound par1NBTTagCompound) { - super.func_143012_a(par1NBTTagCompound); - - par1NBTTagCompound.setInteger("size", this.size); - par1NBTTagCompound.setInteger("height", this.height); - } - - /** - * Load from NBT - */ - @Override - protected void func_143011_b(NBTTagCompound par1NBTTagCompound) { - super.func_143011_b(par1NBTTagCompound); - this.size = par1NBTTagCompound.getInteger("size"); - this.height = par1NBTTagCompound.getInteger("height"); - } - - @SuppressWarnings({ "rawtypes", "unchecked" }) - @Override - public void buildComponent(StructureComponent parent, List list, Random rand) { - // make 4 caves - for (int i = 0; i < 4; i++) { - ChunkCoordinates dest = getValidOpening(rand, 5, i); - - makeSmallerCave(list, rand, this.getComponentType() + 1, dest.posX, dest.posY, dest.posZ, 18, 15, i); - - } - - // add cloud castle - ComponentTFCloudCastle castle = new ComponentTFCloudCastle(this.getComponentType() + 1, boundingBox.minX + ((boundingBox.maxX - boundingBox.minX) / 2), 168, boundingBox.minZ + ((boundingBox.maxZ - boundingBox.minZ) / 2)); - list.add(castle); - castle.buildComponent(this, list, rand); - - // add vault - ComponentTFTrollVault vault = new ComponentTFTrollVault(this.getComponentType() + 1, boundingBox.minX + ((boundingBox.maxX - boundingBox.minX) / 2), boundingBox.minY, boundingBox.minZ + ((boundingBox.maxZ - boundingBox.minZ) / 2)); - list.add(vault); - vault.buildComponent(this, list, rand); - } - - - protected boolean makeSmallerCave(List list, Random rand, int index, int x, int y, int z, int caveSize, int caveHeight, int rotation) { - int direction = (getCoordBaseMode() + rotation) % 4; - ChunkCoordinates dest = offsetTowerCCoords(x, y, z, caveSize, direction); - - ComponentTFTrollCaveConnect cave = new ComponentTFTrollCaveConnect(index, dest.posX, dest.posY, dest.posZ, caveSize, caveHeight, direction); - // check to see if it intersects something already there - StructureComponent intersect = StructureComponent.findIntersecting(list, cave.getBoundingBox()); - if (intersect == null || intersect == this) { - list.add(cave); - cave.buildComponent(list.get(0), list, rand); - //addOpening(x, y, z, rotation); - return true; - } - else - { - return false; - } - } - - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - Random decoRNG = new Random(world.getSeed() + (this.boundingBox.minX * 321534781) ^ (this.boundingBox.minZ * 756839)); - - // clear inside - hollowCaveMiddle(world, sbb, rand, 0, 0, 0, this.size - 1, this.height - 1, this.size - 1); - - // stone stalactites! - for (int i = 0; i < 128; i++) - { - ChunkCoordinates dest = getCoordsInCave(decoRNG); - generateBlockStalactite(world, decoRNG, Blocks.stone, 0.7F, true, dest.posX, 3, dest.posZ, sbb); - } - // stone stalagmites! - for (int i = 0; i < 32; i++) - { - ChunkCoordinates dest = getCoordsInCave(decoRNG); - generateBlockStalactite(world, decoRNG, Blocks.stone, 0.5F, false, dest.posX, 3, dest.posZ, sbb); - } - - - // uberous! - for (int i = 0; i < 32; i++) - { - ChunkCoordinates dest = getCoordsInCave(decoRNG); - - generateAtSurface(world, uberousGen, decoRNG, dest.posX, 60, dest.posZ, sbb); - } - - return true; - } - - - protected ChunkCoordinates getCoordsInCave(Random rand) { - return new ChunkCoordinates(rand.nextInt(this.size - 1), rand.nextInt(this.height - 1), rand.nextInt(this.size - 1)); - } - - /** - * arguments: (World worldObj, StructureBoundingBox structBB, int minX, int minY, int minZ, int maxX, int maxY, int - * maxZ) - * @param rand - */ - protected void hollowCaveMiddle(World par1World, StructureBoundingBox par2StructureBoundingBox, Random rand, int minX, int minY, int minZ, int maxX, int maxY, int maxZ) - { - int threshold = this.size / 5; - - for (int y = minY; y <= maxY; ++y) - { - for (int x = minX; x <= maxX; ++x) - { - for (int z = minZ; z <= maxZ; ++z) - { - int ex = Math.min(x - minX, maxX - x); - int ey = Math.min((y - minY) * 2, maxY - y); - int ez = Math.min(z - minZ, maxZ - z); - - double dist = Math.sqrt(ex * ey * ez); - - if (dist > threshold) { - this.placeBlockAtCurrentPosition(par1World, Blocks.air, 0, x, y, z, par2StructureBoundingBox); - } else if (dist == threshold && rand.nextInt(4) == 0 && this.getBlockAtCurrentPosition(par1World, x, y, z, par2StructureBoundingBox) == Blocks.stone) { - this.placeBlockAtCurrentPosition(par1World, TFBlocks.trollSteinn, 0, x, y, z, par2StructureBoundingBox); - } - } - } - } - } - - - /** - * Gets a random position in the specified direction that connects to stairs currently in the tower. - */ - public ChunkCoordinates getValidOpening(Random rand, int caveHeight, int direction) { - // variables! - int offset = this.size / 4; // wall thickness - int wLength = size - (offset * 2); // wall length - - // for directions 0 or 2, the wall lies along the z axis - if (direction == 0 || direction == 2) { - int rx = direction == 0 ? size - 1 : 0; - int rz = offset + rand.nextInt(wLength); - int ry = (rand.nextInt(offset) - rand.nextInt(offset)); - - return new ChunkCoordinates(rx, ry, rz); - } - - // for directions 1 or 3, the wall lies along the x axis - if (direction == 1 || direction == 3) { - int rx = offset + rand.nextInt(wLength); - int rz = direction == 1 ? size - 1 : 0; - int ry = (rand.nextInt(offset) - rand.nextInt(offset)); - - return new ChunkCoordinates(rx, ry, rz); - } - - - return null; - } - - - /** - * Provides coordinates to make a tower such that it will open into the parent tower at the provided coordinates. - */ - protected ChunkCoordinates offsetTowerCCoords(int x, int y, int z, int towerSize, int direction) { - - int dx = getXWithOffset(x, z); - int dy = getYWithOffset(y); - int dz = getZWithOffset(x, z); - - if (direction == 0) { - return new ChunkCoordinates(dx - 1, dy - 1, dz - towerSize / 2); - } else if (direction == 1) { - return new ChunkCoordinates(dx + towerSize / 2, dy - 1, dz - 1); - } else if (direction == 2) { - return new ChunkCoordinates(dx + 1, dy - 1, dz + towerSize / 2); - } else if (direction == 3) { - return new ChunkCoordinates(dx - towerSize / 2, dy - 1, dz + 1); - } - - - // ugh? - return new ChunkCoordinates(x, y, z); - } - - - public boolean isBoundingBoxOutOfHighlands(World world, StructureBoundingBox sbb) { - int minX = this.boundingBox.minX - 1; - int minZ = this.boundingBox.minZ - 1; - int maxX = this.boundingBox.maxX + 1; - int maxZ = this.boundingBox.maxZ + 1; - - for (int x = minX; x <= maxX; x++) { - for (int z = minZ; z <= maxZ; z++) { - if (world.getBiomeGenForCoords(x, z) != TFBiomeBase.highlands) { - return true; - } - } - } - - return false; - } - - - /** - * Make a random stone stalactite - */ - protected void generateBlockStalactite(World world, Random rand, Block blockToGenerate, float length, boolean up, int x, int y, int z, StructureBoundingBox sbb) { - // are the coordinates in our bounding box? - int dx = getXWithOffset(x, z); - int dy = getYWithOffset(y); - int dz = getZWithOffset(x, z); - if(sbb.isVecInside(dx, dy, dz)) { - (new TFGenCaveStalactite(blockToGenerate, length, up)).generate(world, rand, dx, dy, dz); - } - } - - /** - * Use the generator at the surface above specified coords - */ - protected void generateAtSurface(World world, WorldGenerator generator, Random rand, int x, int y, int z, StructureBoundingBox sbb) { - // are the coordinates in our bounding box? - int dx = getXWithOffset(x, z); - int dy = y; - int dz = getZWithOffset(x, z); - if(sbb.isVecInside(dx, dy, dz)) { - // find surface above the listed coords - for (dy = y; dy < y + 32; dy++) { - if (world.isAirBlock( dx, dy, dz)) { - //System.out.println("Found surface for generator. It's " + dy); - - break; - } - } - - generator.generate(world, rand, dx, dy, dz); - } - } - - protected void makeTreasureCrate(World world, Random rand, StructureBoundingBox sbb) { - // treasure! - int mid = this.size / 2; - this.fillWithBlocks(world, sbb, mid - 2, 0, mid - 2, mid + 1, 3, mid + 1, Blocks.obsidian, Blocks.obsidian, false); - this.fillWithAir(world, sbb, mid - 1, 1, mid - 1, mid + 0, 2, mid + 0); - this.placeTreasureAtCurrentPosition(world, rand, mid, 1, mid, TFTreasure.troll_garden, false, sbb); - } - -} diff --git a/src/main/java/twilightforest/structures/trollcave/ComponentTFTrollCloud.java b/src/main/java/twilightforest/structures/trollcave/ComponentTFTrollCloud.java deleted file mode 100644 index 6ed4e8c8bf..0000000000 --- a/src/main/java/twilightforest/structures/trollcave/ComponentTFTrollCloud.java +++ /dev/null @@ -1,63 +0,0 @@ -package twilightforest.structures.trollcave; - -import java.util.Random; - -import net.minecraft.init.Blocks; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import twilightforest.structures.StructureTFComponent; - -public class ComponentTFTrollCloud extends StructureTFComponent { - - private int size; - private int height; - - public ComponentTFTrollCloud() { } - - public ComponentTFTrollCloud(int index, int x, int y, int z) { - super(index); - this.setCoordBaseMode(0); - - this.size = 40; - this.height = 20; - - int radius = this.size / 2; - this.boundingBox = StructureTFComponent.getComponentToAddBoundingBox(x, y, z, -radius, -this.height, -radius, this.size, this.height, this.size, 0); - } - - /** - * Save to NBT - */ - @Override - protected void func_143012_a(NBTTagCompound par1NBTTagCompound) { - super.func_143012_a(par1NBTTagCompound); - - par1NBTTagCompound.setInteger("size", this.size); - par1NBTTagCompound.setInteger("height", this.height); - } - - /** - * Load from NBT - */ - @Override - protected void func_143011_b(NBTTagCompound par1NBTTagCompound) { - super.func_143011_b(par1NBTTagCompound); - this.size = par1NBTTagCompound.getInteger("size"); - this.height = par1NBTTagCompound.getInteger("height"); - } - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - placeCloud(world, sbb, 0, 0, 0, this.size - 1, 6, this.size - 1); - - return true; - } - - protected void placeCloud(World world, StructureBoundingBox sbb, int minX, int minY, int minZ, int maxX, int maxY, int maxZ) { - this.fillWithMetadataBlocks(world, sbb, minX, minY, minZ, maxX, maxY, maxZ, Blocks.stained_glass, 0, Blocks.stained_glass, 0, false); - this.fillWithMetadataBlocks(world, sbb, minX + 2, minY + 2, minZ + 2, maxX - 2, maxY - 1, maxZ - 2, Blocks.quartz_block, 0, Blocks.quartz_block, 0, false); - - } - -} diff --git a/src/main/java/twilightforest/structures/trollcave/ComponentTFTrollVault.java b/src/main/java/twilightforest/structures/trollcave/ComponentTFTrollVault.java deleted file mode 100644 index 27dcbac0ef..0000000000 --- a/src/main/java/twilightforest/structures/trollcave/ComponentTFTrollVault.java +++ /dev/null @@ -1,65 +0,0 @@ -package twilightforest.structures.trollcave; - -import java.util.List; -import java.util.Random; - -import net.minecraft.init.Blocks; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.world.World; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import net.minecraft.world.gen.structure.StructureComponent; -import twilightforest.TFTreasure; -import twilightforest.block.TFBlocks; -import twilightforest.entity.EntityTFArmoredGiant; -import twilightforest.entity.EntityTFGiantMiner; -import twilightforest.structures.StructureTFComponent; - -public class ComponentTFTrollVault extends StructureTFComponent { - - public ComponentTFTrollVault() { } - - public ComponentTFTrollVault(int index, int x, int y, int z) { - super(index); - this.setCoordBaseMode(0); - - - // adjust x, y, z - x = (x >> 2) << 2; - y = (y / 4) * 4; - z = (z >> 2) << 2; - - // spawn list! - this.spawnListIndex = -1; - - this.boundingBox = StructureTFComponent.getComponentToAddBoundingBox(x, y, z, -8, 0, -8, 12, 12, 12, 0); - } - - - @SuppressWarnings({ "rawtypes", "unchecked" }) - @Override - public void buildComponent(StructureComponent parent, List list, Random rand) { - ; - } - - @Override - public boolean addComponentParts(World world, Random rand, StructureBoundingBox sbb) { - // make walls - this.fillWithMetadataBlocks(world, sbb, 0, 0, 0, 11, 11, 11, TFBlocks.giantObsidian, 0, TFBlocks.giantObsidian, 0, false); - - // clear inside - this.fillWithAir(world, sbb, 4, 4, 4, 7, 7, 7); - - // cobblestone platform - this.fillWithMetadataBlocks(world, sbb, 5, 5, 5, 6, 5, 6, Blocks.cobblestone, 0, Blocks.cobblestone, 0, false); - - // chests - this.placeBlockAtCurrentPosition(world, Blocks.chest, 0, 5, 6, 5, sbb); - this.placeTreasureAtCurrentPosition(world, rand, 5, 6, 6, TFTreasure.troll_vault, false, sbb); - - this.placeTreasureAtCurrentPosition(world, rand, 6, 6, 5, TFTreasure.troll_garden, true, sbb); - this.placeBlockAtCurrentPosition(world, Blocks.trapped_chest, 0, 6, 6, 6, sbb); - - return true; - } - -} diff --git a/src/main/java/twilightforest/structures/trollcave/TFTrollCavePieces.java b/src/main/java/twilightforest/structures/trollcave/TFTrollCavePieces.java deleted file mode 100644 index 1421209e8a..0000000000 --- a/src/main/java/twilightforest/structures/trollcave/TFTrollCavePieces.java +++ /dev/null @@ -1,17 +0,0 @@ -package twilightforest.structures.trollcave; - -import net.minecraft.world.gen.structure.MapGenStructureIO; - -public class TFTrollCavePieces { - - public static void registerPieces() - { - MapGenStructureIO.func_143031_a(ComponentTFTrollCaveMain.class, "TFTCMai"); - MapGenStructureIO.func_143031_a(ComponentTFTrollCaveConnect.class, "TFTCCon"); - MapGenStructureIO.func_143031_a(ComponentTFTrollCaveGarden.class, "TFTCGard"); - MapGenStructureIO.func_143031_a(ComponentTFTrollCloud.class, "TFTCloud"); - MapGenStructureIO.func_143031_a(ComponentTFCloudCastle.class, "TFClCa"); - MapGenStructureIO.func_143031_a(ComponentTFCloudTree.class, "TFClTr"); - MapGenStructureIO.func_143031_a(ComponentTFTrollVault.class, "TFTCVa"); - } -} \ No newline at end of file diff --git a/src/main/java/twilightforest/tileentity/TileEntityTFBossSpawner.java b/src/main/java/twilightforest/tileentity/TileEntityTFBossSpawner.java deleted file mode 100644 index 6a9233f439..0000000000 --- a/src/main/java/twilightforest/tileentity/TileEntityTFBossSpawner.java +++ /dev/null @@ -1,135 +0,0 @@ -package twilightforest.tileentity; - -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityCreature; -import net.minecraft.entity.EntityList; -import net.minecraft.entity.EntityLiving; -import net.minecraft.init.Blocks; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.EnumDifficulty; - - -public abstract class TileEntityTFBossSpawner extends TileEntity { - - protected String mobID = "Pig"; - protected int counter; - - protected Entity displayCreature = null; - - - public TileEntityTFBossSpawner() { - ; - } - - /** - * Is there a player in our detection range? - */ - public boolean anyPlayerInRange() - { - return worldObj.getClosestPlayer(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D, getRange()) != null; - } - - /** - * Determines if this TileEntity requires update calls. - * @return True if you want updateEntity() to be called, false if not - */ - @Override - public boolean canUpdate() { - return true; - } - - /** - * Allows the entity to update its state. Overridden in most subclasses, e.g. the mob spawner uses this to count - * ticks and creates a new spawn inside its implementation. - */ - @Override - public void updateEntity() - { - this.counter++; - - if(anyPlayerInRange()) - { - if (worldObj.isRemote) - { - // particles - double rx = xCoord + worldObj.rand.nextFloat(); - double ry = yCoord + worldObj.rand.nextFloat(); - double rz = zCoord + worldObj.rand.nextFloat(); - worldObj.spawnParticle("smoke", rx, ry, rz, 0.0D, 0.0D, 0.0D); - worldObj.spawnParticle("flame", rx, ry, rz, 0.0D, 0.0D, 0.0D); - } - else - { - //System.out.println("Thinking about boss!"); - - - if (worldObj.difficultySetting != EnumDifficulty.PEACEFUL) - { - spawnMyBoss(); - - // destroy block - worldObj.setBlock(xCoord, yCoord, zCoord, Blocks.air, 0, 2); - - //System.out.println("Spawning boss!"); - } - } - } - - } - - /** - * Spawn the boss - */ - protected void spawnMyBoss() { - // spawn creature - EntityLiving myCreature = makeMyCreature(); - - double rx = xCoord + 0.5D; - double ry = yCoord + 0.5D; - double rz = zCoord + 0.5D; - myCreature.setLocationAndAngles(rx, ry, rz, worldObj.rand.nextFloat() * 360F, 0.0F); - - // set creature's home to this - initializeCreature(myCreature); - - // spawn it - worldObj.spawnEntityInWorld(myCreature); - } - - /** - * Get a temporary copy of the creature we're going to summon for display purposes - */ - public Entity getDisplayEntity() - { - if (this.displayCreature == null) - { - this.displayCreature = makeMyCreature(); - } - - return this.displayCreature; - } - - /** - * Any post-creation initialization goes here - */ - protected void initializeCreature(EntityLiving myCreature) { - if (myCreature instanceof EntityCreature) - { - ((EntityCreature) myCreature).setHomeArea(xCoord, yCoord, zCoord, 46); - } - } - - /** - * Range? - */ - protected int getRange() { - return 50; - } - - /** - * Create a copy of what we spawn - */ - protected EntityLiving makeMyCreature() { - return (EntityLiving)EntityList.createEntityByName(mobID, worldObj); - } -} diff --git a/src/main/java/twilightforest/tileentity/TileEntityTFCReactorActive.java b/src/main/java/twilightforest/tileentity/TileEntityTFCReactorActive.java deleted file mode 100644 index 1571a9ec53..0000000000 --- a/src/main/java/twilightforest/tileentity/TileEntityTFCReactorActive.java +++ /dev/null @@ -1,274 +0,0 @@ -package twilightforest.tileentity; - -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.init.Blocks; -import net.minecraft.tileentity.TileEntity; -import twilightforest.block.BlockTFTowerTranslucent; -import twilightforest.block.TFBlocks; -import twilightforest.entity.EntityTFMiniGhast; - -public class TileEntityTFCReactorActive extends TileEntity { - - int counter = 0; - - int secX, secY, secZ; - int terX, terY, terZ; - - - public TileEntityTFCReactorActive() { - Random rand = new Random(); - - // determine the two smaller bursts - this.secX = 3 * (rand.nextBoolean() ? 1 : -1); - this.secY = 3 * (rand.nextBoolean() ? 1 : -1); - this.secZ = 3 * (rand.nextBoolean() ? 1 : -1); - - this.terX = 3 * (rand.nextBoolean() ? 1 : -1); - this.terY = 3 * (rand.nextBoolean() ? 1 : -1); - this.terZ = 3 * (rand.nextBoolean() ? 1 : -1); - - if (secX == terX && secY == terY && secZ == terZ) - { - terX = -terX; - terY = -terY; - terZ = -terZ; - } - } - - - /** - * Allows the entity to update its state. Overridden in most subclasses, e.g. the mob spawner uses this to count - * ticks and creates a new spawn inside its implementation. - */ - @Override - public void updateEntity() - { - counter++; - - if (!worldObj.isRemote) - { - - // every 2 seconds for 10 seconds, destroy a new radius - int offset = 10; - - if (counter % 5 == 0) - { - if (counter == 5) - { - // transformation! - worldObj.setBlock(this.xCoord + 1, this.yCoord + 1, this.zCoord + 1, TFBlocks.towerTranslucent, BlockTFTowerTranslucent.META_FAKE_DIAMOND, 2); - worldObj.setBlock(this.xCoord + 1, this.yCoord + 1, this.zCoord - 1, TFBlocks.towerTranslucent, BlockTFTowerTranslucent.META_FAKE_DIAMOND, 2); - worldObj.setBlock(this.xCoord - 1, this.yCoord + 1, this.zCoord + 1, TFBlocks.towerTranslucent, BlockTFTowerTranslucent.META_FAKE_DIAMOND, 2); - worldObj.setBlock(this.xCoord - 1, this.yCoord + 1, this.zCoord - 1, TFBlocks.towerTranslucent, BlockTFTowerTranslucent.META_FAKE_DIAMOND, 2); - - worldObj.setBlock(this.xCoord + 0, this.yCoord + 1, this.zCoord + 1, TFBlocks.towerTranslucent, BlockTFTowerTranslucent.META_FAKE_GOLD, 2); - worldObj.setBlock(this.xCoord + 0, this.yCoord + 1, this.zCoord - 1, TFBlocks.towerTranslucent, BlockTFTowerTranslucent.META_FAKE_GOLD, 2); - worldObj.setBlock(this.xCoord + 1, this.yCoord + 1, this.zCoord + 0, TFBlocks.towerTranslucent, BlockTFTowerTranslucent.META_FAKE_GOLD, 2); - worldObj.setBlock(this.xCoord - 1, this.yCoord + 1, this.zCoord + 0, TFBlocks.towerTranslucent, BlockTFTowerTranslucent.META_FAKE_GOLD, 2); - - - worldObj.setBlock(this.xCoord + 1, this.yCoord + 0, this.zCoord + 1, TFBlocks.towerTranslucent, BlockTFTowerTranslucent.META_FAKE_GOLD, 2); - worldObj.setBlock(this.xCoord + 1, this.yCoord + 0, this.zCoord - 1, TFBlocks.towerTranslucent, BlockTFTowerTranslucent.META_FAKE_GOLD, 2); - worldObj.setBlock(this.xCoord - 1, this.yCoord + 0, this.zCoord + 1, TFBlocks.towerTranslucent, BlockTFTowerTranslucent.META_FAKE_GOLD, 2); - worldObj.setBlock(this.xCoord - 1, this.yCoord + 0, this.zCoord - 1, TFBlocks.towerTranslucent, BlockTFTowerTranslucent.META_FAKE_GOLD, 2); - - worldObj.setBlock(this.xCoord + 0, this.yCoord + 0, this.zCoord + 1, TFBlocks.towerTranslucent, BlockTFTowerTranslucent.META_FAKE_DIAMOND, 2); - worldObj.setBlock(this.xCoord + 0, this.yCoord + 0, this.zCoord - 1, TFBlocks.towerTranslucent, BlockTFTowerTranslucent.META_FAKE_DIAMOND, 2); - worldObj.setBlock(this.xCoord + 1, this.yCoord + 0, this.zCoord + 0, TFBlocks.towerTranslucent, BlockTFTowerTranslucent.META_FAKE_DIAMOND, 2); - worldObj.setBlock(this.xCoord - 1, this.yCoord + 0, this.zCoord + 0, TFBlocks.towerTranslucent, BlockTFTowerTranslucent.META_FAKE_DIAMOND, 2); - - - worldObj.setBlock(this.xCoord + 1, this.yCoord - 1, this.zCoord + 1, TFBlocks.towerTranslucent, BlockTFTowerTranslucent.META_FAKE_DIAMOND, 2); - worldObj.setBlock(this.xCoord + 1, this.yCoord - 1, this.zCoord - 1, TFBlocks.towerTranslucent, BlockTFTowerTranslucent.META_FAKE_DIAMOND, 2); - worldObj.setBlock(this.xCoord - 1, this.yCoord - 1, this.zCoord + 1, TFBlocks.towerTranslucent, BlockTFTowerTranslucent.META_FAKE_DIAMOND, 2); - worldObj.setBlock(this.xCoord - 1, this.yCoord - 1, this.zCoord - 1, TFBlocks.towerTranslucent, BlockTFTowerTranslucent.META_FAKE_DIAMOND, 2); - - worldObj.setBlock(this.xCoord + 0, this.yCoord - 1, this.zCoord + 1, TFBlocks.towerTranslucent, BlockTFTowerTranslucent.META_FAKE_GOLD, 2); - worldObj.setBlock(this.xCoord + 0, this.yCoord - 1, this.zCoord - 1, TFBlocks.towerTranslucent, BlockTFTowerTranslucent.META_FAKE_GOLD, 2); - worldObj.setBlock(this.xCoord + 1, this.yCoord - 1, this.zCoord + 0, TFBlocks.towerTranslucent, BlockTFTowerTranslucent.META_FAKE_GOLD, 2); - worldObj.setBlock(this.xCoord - 1, this.yCoord - 1, this.zCoord + 0, TFBlocks.towerTranslucent, BlockTFTowerTranslucent.META_FAKE_GOLD, 2); - - } - - - // primary burst - int primary = counter - 80; - - if (primary >= offset && primary <= 249) - { - drawBlob(this.xCoord, this.yCoord, this.zCoord, (primary - offset) / 40, Blocks.air, 0, primary - offset, false); - } - if (primary <= 200) - { - drawBlob(this.xCoord, this.yCoord, this.zCoord, primary / 40, TFBlocks.towerTranslucent, BlockTFTowerTranslucent.META_REACTOR_DEBRIS, counter, false); - } - - // secondary burst - int secondary = counter - 120; - - if (secondary >= offset && secondary <= 129) - { - drawBlob(this.xCoord + secX, this.yCoord + secY, this.zCoord + secZ, (secondary - offset) / 40, Blocks.air, 0, secondary - offset, false); - } - if (secondary >= 0 && secondary <= 160) - { - drawBlob(this.xCoord + secX, this.yCoord + secY, this.zCoord + secZ, secondary / 40, Blocks.air, 0, secondary, true); - } - - // tertiary burst - int tertiary = counter - 160; - - if (tertiary >= offset && tertiary <= 129) - { - drawBlob(this.xCoord + terX, this.yCoord + terY, this.zCoord + terZ, (tertiary - offset) / 40, Blocks.air, 0, tertiary - offset, false); - } - if (tertiary >= 0 && tertiary <= 160) - { - drawBlob(this.xCoord + terX, this.yCoord + terY, this.zCoord + terZ, tertiary / 40, Blocks.air, 0, tertiary, true); - } - - } - - - - - if (counter >= 350) - { - // spawn mini ghasts near the secondary & tertiary points - for (int i = 0; i < 3; i++) - { - spawnGhastNear(this.xCoord + secX, this.yCoord + secY, this.zCoord + secZ); - spawnGhastNear(this.xCoord + terX, this.yCoord + terY, this.zCoord + terZ); - } - - // deactivate & explode - worldObj.createExplosion(null, this.xCoord, this.yCoord, this.zCoord, 2.0F, true); - - worldObj.setBlock(this.xCoord, this.yCoord, this.zCoord, Blocks.air, 0, 3); - } - - } - else - { - if (counter % 5 == 0 && counter <= 250) - { - // sound - worldObj.playSound(this.xCoord + 0.5D, this.yCoord + 0.5D, this.zCoord + 0.5D, "portal.portal", counter / 100F, counter / 100F, false); - } - } - - } - - - private void spawnGhastNear(int x, int y, int z) { - EntityTFMiniGhast ghast = new EntityTFMiniGhast(worldObj); - ghast.setLocationAndAngles(x - 1.5 + worldObj.rand.nextFloat() * 3.0, y - 1.5 + worldObj.rand.nextFloat() * 3.0, z - 1.5 + worldObj.rand.nextFloat() * 3.0, worldObj.rand.nextFloat() * 360F, 0.0F); - worldObj.spawnEntityInWorld(ghast); - } - - - /** - * Draw a giant blob of whatevs (okay, it's going to be leaves). - */ - public void drawBlob(int sx, int sy, int sz, int rad, Block blockValue, int metaValue, int fuzz, boolean netherTransform) { - // then trace out a quadrant - for (byte dx = 0; dx <= rad; dx++) - { - // transform fuzz - int fuzzX = (fuzz + dx) % 8; - - for (byte dy = 0; dy <= rad; dy++) - { - int fuzzY = (fuzz + dy) % 8; - - for (byte dz = 0; dz <= rad; dz++) - { - // determine how far we are from the center. - byte dist = 0; - if (dx >= dy && dx >= dz) - { - dist = (byte) (dx + (byte)((Math.max(dy, dz) * 0.5) + (Math.min(dy, dz) * 0.25))); - } - else if (dy >= dx && dy >= dz) - { - dist = (byte) (dy + (byte)((Math.max(dx, dz) * 0.5) + (Math.min(dx, dz) * 0.25))); - } - else - { - dist = (byte) (dz + (byte)((Math.max(dx, dy) * 0.5) + (Math.min(dx, dy) * 0.25))); - } - - // if we're inside the blob, fill it - if (dist == rad && !(dx == 0 && dy == 0 && dz == 0)) { - // do eight at a time for easiness! - switch (fuzzX) - { - case 0: - transformBlock(sx + dx, sy + dy, sz + dz, blockValue, metaValue, fuzzY, netherTransform); - break; - case 1: - transformBlock(sx + dx, sy + dy, sz - dz, blockValue, metaValue, fuzzY, netherTransform); - break; - case 2: - transformBlock(sx - dx, sy + dy, sz + dz, blockValue, metaValue, fuzzY, netherTransform); - break; - case 3: - transformBlock(sx - dx, sy + dy, sz - dz, blockValue, metaValue, fuzzY, netherTransform); - break; - case 4: - transformBlock(sx + dx, sy - dy, sz + dz, blockValue, metaValue, fuzzY, netherTransform); - break; - case 5: - transformBlock(sx + dx, sy - dy, sz - dz, blockValue, metaValue, fuzzY, netherTransform); - break; - case 6: - transformBlock(sx - dx, sy - dy, sz + dz, blockValue, metaValue, fuzzY, netherTransform); - break; - case 7: - transformBlock(sx - dx, sy - dy, sz - dz, blockValue, metaValue, fuzzY, netherTransform); - break; - } - } - } - } - } - } - - /** - * - */ - protected void transformBlock(int x, int y, int z, Block blockValue, int metaValue, int fuzz, boolean netherTransform) - { - Block whatsThere = worldObj.getBlock(x, y, z); - int whatsMeta = worldObj.getBlockMetadata(x, y, z); - - if (whatsThere != Blocks.air && whatsThere.getBlockHardness(worldObj, x, y, z) == -1) - { - // don't destroy unbreakable stuff - return; - } - - if (fuzz == 0 && whatsThere != Blocks.air) - { - // make pop thing for original block - worldObj.playAuxSFX(2001, x, y, z, Block.getIdFromBlock(whatsThere) + (whatsMeta << 12)); - } - - if (netherTransform && whatsThere != Blocks.air) - { - worldObj.setBlock(x, y, z, Blocks.netherrack, 0, 3); - // fire on top? - if (worldObj.getBlock(x, y + 1, z) == Blocks.air && fuzz % 3 == 0) - { - worldObj.setBlock(x, y + 1, z, Blocks.fire, 0, 3); - } - } - else - { - worldObj.setBlock(x, y, z, blockValue, metaValue, 3); - } - } - -} diff --git a/src/main/java/twilightforest/tileentity/TileEntityTFCicada.java b/src/main/java/twilightforest/tileentity/TileEntityTFCicada.java deleted file mode 100644 index 413708b67b..0000000000 --- a/src/main/java/twilightforest/tileentity/TileEntityTFCicada.java +++ /dev/null @@ -1,113 +0,0 @@ -package twilightforest.tileentity; - -import twilightforest.TwilightForestMod; - - -public class TileEntityTFCicada extends TileEntityTFCritter { - - - public int yawDelay; - public int currentYaw; - public int desiredYaw; - - public int singDuration; - public boolean singing; - public int singDelay; - - /** - * Allows the entity to update its state. Overridden in most subclasses, e.g. the mob spawner uses this to count - * ticks and creates a new spawn inside its implementation. - */ - @Override - public void updateEntity() - { - super.updateEntity(); - -// if (worldObj.getBlockMetadata(xCoord, yCoord, zCoord) != 1) { -// //System.out.println("Cicada tile entity block has invalid metadata, fixing"); -// worldObj.setBlockMetadata(xCoord, yCoord, zCoord, 1); -// } - - if(yawDelay > 0) - { - yawDelay--; - } else { - if (currentYaw == 0 && desiredYaw == 0) - { - // make it rotate! - yawDelay = 200 + worldObj.rand.nextInt(200); - desiredYaw = worldObj.rand.nextInt(15) - worldObj.rand.nextInt(15); - } - - if (currentYaw < desiredYaw) - { - currentYaw++; - } - if (currentYaw > desiredYaw) - { - currentYaw--; - } - if (currentYaw == desiredYaw) - { - desiredYaw = 0; - } - } - - if (singDelay > 0) - { - singDelay--; - } else { - if (singing && singDuration == 0) { - playSong(); - } - if (singing && singDuration >= 100) - { - singing = false; - singDuration = 0; - } - if (singing && singDuration < 100) - { - singDuration++; - doSingAnimation(); - } - if (!singing && singDuration <= 0) - { - singing = true; - singDelay = 100 + worldObj.rand.nextInt(100); - } - } - } - -// /** -// * There seems to be a bug in the chunk placing routines which sets the tileentity metadta to 0 even if the tile shifts metadatas when placed. -// * Thus, if the metadata is 0, re-check it -// */ -// @Override -// public int getBlockMetadata() { -// if (super.getBlockMetadata() == 0) -// { -// this.blockMetadata = -1; -// } -// return super.getBlockMetadata(); -// } - - - public void doSingAnimation() - { - if (worldObj.rand.nextInt(5) == 0) - { - double rx = xCoord + worldObj.rand.nextFloat(); - double ry = yCoord + worldObj.rand.nextFloat(); - double rz = zCoord + worldObj.rand.nextFloat(); - worldObj.spawnParticle("note", rx, ry, rz, 0.0D, 0.0D, 0.0D); - } - } - - public void playSong() - { - if (!TwilightForestMod.silentCicadas) - { - worldObj.playSoundEffect(xCoord, yCoord, zCoord, TwilightForestMod.ID + ":mob.cicada", 1.0f, (worldObj.rand.nextFloat() - worldObj.rand.nextFloat()) * 0.2F + 1.0F); - } - } -} diff --git a/src/main/java/twilightforest/tileentity/TileEntityTFCinderFurnace.java b/src/main/java/twilightforest/tileentity/TileEntityTFCinderFurnace.java deleted file mode 100644 index 26eacda821..0000000000 --- a/src/main/java/twilightforest/tileentity/TileEntityTFCinderFurnace.java +++ /dev/null @@ -1,621 +0,0 @@ -package twilightforest.tileentity; - -import java.util.Random; - -import twilightforest.block.BlockTFCinderFurnace; -import twilightforest.block.TFBlocks; -import cpw.mods.fml.common.registry.GameRegistry; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import net.minecraft.block.Block; -import net.minecraft.block.BlockFurnace; -import net.minecraft.block.material.Material; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.init.Items; -import net.minecraft.inventory.ISidedInventory; -import net.minecraft.item.Item; -import net.minecraft.item.ItemBlock; -import net.minecraft.item.ItemHoe; -import net.minecraft.item.ItemStack; -import net.minecraft.item.ItemSword; -import net.minecraft.item.ItemTool; -import net.minecraft.item.crafting.FurnaceRecipes; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.nbt.NBTTagList; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.tileentity.TileEntityFurnace; -import net.minecraftforge.oredict.OreDictionary; - -public class TileEntityTFCinderFurnace extends TileEntity implements ISidedInventory { - - private static final int SMELT_LOG_FACTOR = 10; - private static final int SLOT_INPUT = 0; - private static final int SLOT_FUEL = 1; - private static final int SLOT_OUTPUT = 2; - - private static final int[] slotsTop = new int[] {SLOT_INPUT}; - private static final int[] slotsBottom = new int[] {SLOT_OUTPUT, SLOT_FUEL}; - private static final int[] slotsSides = new int[] {SLOT_FUEL}; - - /** The ItemStacks that hold the items currently being used in the furnace */ - private ItemStack[] furnaceItemStacks = new ItemStack[3]; - /** The number of ticks that the furnace will keep burning */ - public int furnaceBurnTime; - /** The number of ticks that a fresh copy of the currently-burning item would keep the furnace burning for */ - public int currentItemBurnTime; - /** The number of ticks that the current item has been cooking for */ - public int furnaceCookTime; - private String customName; - - @Override - public int getSizeInventory() { - return this.furnaceItemStacks.length; - } - - @Override - public ItemStack getStackInSlot(int slot) { - return this.furnaceItemStacks[slot]; - } - - /** - * Removes from an inventory slot (first arg) up to a specified number (second arg) of items and returns them in a - * new stack. - */ - public ItemStack decrStackSize(int slot, int amount) - { - if (this.furnaceItemStacks[slot] != null) - { - ItemStack itemstack; - - if (this.furnaceItemStacks[slot].stackSize <= amount) - { - itemstack = this.furnaceItemStacks[slot]; - this.furnaceItemStacks[slot] = null; - return itemstack; - } - else - { - itemstack = this.furnaceItemStacks[slot].splitStack(amount); - - if (this.furnaceItemStacks[slot].stackSize == 0) - { - this.furnaceItemStacks[slot] = null; - } - - return itemstack; - } - } - else - { - return null; - } - } - - /** - * When some containers are closed they call this on each slot, then drop whatever it returns as an EntityItem - - * like when you close a workbench GUI. - */ - public ItemStack getStackInSlotOnClosing(int slot) - { - if (this.furnaceItemStacks[slot] != null) - { - ItemStack itemstack = this.furnaceItemStacks[slot]; - this.furnaceItemStacks[slot] = null; - return itemstack; - } - else - { - return null; - } - } - - /** - * Sets the given item stack to the specified slot in the inventory (can be crafting or armor sections). - */ - public void setInventorySlotContents(int slot, ItemStack itemStack) - { - this.furnaceItemStacks[slot] = itemStack; - - if (itemStack != null && itemStack.stackSize > this.getInventoryStackLimit()) - { - itemStack.stackSize = this.getInventoryStackLimit(); - } - } - - /** - * Returns the name of the inventory - */ - public String getInventoryName() - { - return this.hasCustomInventoryName() ? this.customName : "twilightforest.container.furnace"; - } - - /** - * Returns if the inventory is named - */ - public boolean hasCustomInventoryName() - { - return this.customName != null && this.customName.length() > 0; - } - - - public void readFromNBT(NBTTagCompound nbtTags) - { - super.readFromNBT(nbtTags); - NBTTagList nbttaglist = nbtTags.getTagList("Items", 10); - this.furnaceItemStacks = new ItemStack[this.getSizeInventory()]; - - for (int i = 0; i < nbttaglist.tagCount(); ++i) - { - NBTTagCompound nbttagcompound1 = nbttaglist.getCompoundTagAt(i); - byte slot = nbttagcompound1.getByte("Slot"); - - if (slot >= 0 && slot < this.furnaceItemStacks.length) - { - this.furnaceItemStacks[slot] = ItemStack.loadItemStackFromNBT(nbttagcompound1); - } - } - - this.furnaceBurnTime = nbtTags.getShort("BurnTime"); - this.furnaceCookTime = nbtTags.getShort("CookTime"); - this.currentItemBurnTime = getItemBurnTime(this.furnaceItemStacks[1]); - - if (nbtTags.hasKey("CustomName", 8)) - { - this.customName = nbtTags.getString("CustomName"); - } - } - - public void writeToNBT(NBTTagCompound nbtTags) - { - super.writeToNBT(nbtTags); - nbtTags.setShort("BurnTime", (short)this.furnaceBurnTime); - nbtTags.setShort("CookTime", (short)this.furnaceCookTime); - NBTTagList nbttaglist = new NBTTagList(); - - for (int i = 0; i < this.furnaceItemStacks.length; ++i) - { - if (this.furnaceItemStacks[i] != null) - { - NBTTagCompound nbttagcompound1 = new NBTTagCompound(); - nbttagcompound1.setByte("Slot", (byte)i); - this.furnaceItemStacks[i].writeToNBT(nbttagcompound1); - nbttaglist.appendTag(nbttagcompound1); - } - } - - nbtTags.setTag("Items", nbttaglist); - - if (this.hasCustomInventoryName()) - { - nbtTags.setString("CustomName", this.customName); - } - } - - /** - * Returns an integer between 0 and the passed value representing how close the current item is to being completely - * cooked - */ - @SideOnly(Side.CLIENT) - public int getCookProgressScaled(int p_145953_1_) - { - return this.furnaceCookTime * p_145953_1_ / 200; - } - - /** - * Returns an integer between 0 and the passed value representing how much burn time is left on the current fuel - * item, where 0 means that the item is exhausted and the passed value means that the item is fresh - */ - @SideOnly(Side.CLIENT) - public int getBurnTimeRemainingScaled(int p_145955_1_) - { - if (this.currentItemBurnTime == 0) - { - this.currentItemBurnTime = 200; - } - - return this.furnaceBurnTime * p_145955_1_ / this.currentItemBurnTime; - } - - /** - * Furnace isBurning - */ - public boolean isBurning() - { - return this.furnaceBurnTime > 0; - } - - public void updateEntity() - { - boolean flag = this.furnaceBurnTime > 0; - boolean flag1 = false; - - - if (this.furnaceBurnTime > 0) - { - --this.furnaceBurnTime; - } - - if (!this.worldObj.isRemote) - { - if (this.furnaceBurnTime != 0 || this.furnaceItemStacks[1] != null && this.furnaceItemStacks[0] != null) - { - if (this.furnaceBurnTime == 0 && this.canSmelt()) - { - this.currentItemBurnTime = this.furnaceBurnTime = getItemBurnTime(this.furnaceItemStacks[1]); - - if (this.furnaceBurnTime > 0) - { - flag1 = true; - - if (this.furnaceItemStacks[1] != null) - { - --this.furnaceItemStacks[1].stackSize; - - if (this.furnaceItemStacks[1].stackSize == 0) - { - this.furnaceItemStacks[1] = furnaceItemStacks[1].getItem().getContainerItem(furnaceItemStacks[1]); - } - } - } - } - - if (this.isBurning() && this.canSmelt()) - { - int speedMultiplier = this.getCurrentSpeedMultiplier(); - - //System.out.println("cooking with cinder furnace, speed multiplier = " + speedMultiplier); - - this.furnaceCookTime += speedMultiplier; - - if (this.furnaceCookTime >= 200) - { - this.furnaceCookTime = 0; - this.smeltItem(); - flag1 = true; - } - } - else - { - this.furnaceCookTime = 0; - } - } - - // update block if needed - if (flag != this.furnaceBurnTime > 0) - { - flag1 = true; - BlockTFCinderFurnace.updateFurnaceBlockState(this.furnaceBurnTime > 0, this.worldObj, this.xCoord, this.yCoord, this.zCoord); - } - - // occasionally cinderize nearby logs - if (this.isBurning() && this.furnaceBurnTime % 5 == 0) { - this.cinderizeNearbyLog(); - } - } - - if (flag1) - { - this.markDirty(); - } - } - - /** - * Turn a nearby log into a cinder log - */ - private void cinderizeNearbyLog() { - Random rand = this.getWorldObj().rand; - - int dx = rand.nextInt(2) - rand.nextInt(2); - int dy = rand.nextInt(2) - rand.nextInt(2); - int dz = rand.nextInt(2) - rand.nextInt(2); - - if (this.worldObj.blockExists(this.xCoord + dx, this.yCoord + dy, this.zCoord + dz)) { - Block nearbyBlock = this.getWorldObj().getBlock(this.xCoord + dx, this.yCoord + dy, this.zCoord + dz); - - if (nearbyBlock != TFBlocks.cinderLog && this.isLog(nearbyBlock)) { - this.getWorldObj().setBlock(this.xCoord + dx, this.yCoord + dy, this.zCoord + dz, TFBlocks.cinderLog, getCinderMetaFor(dx, dy, dz), 2); - // special effect? - this.getWorldObj().playAuxSFX(2004, this.xCoord + dx, this.yCoord + dy, this.zCoord + dz, 0); - this.getWorldObj().playAuxSFX(2004, this.xCoord + dx, this.yCoord + dy, this.zCoord + dz, 0); - this.getWorldObj().playSoundEffect(this.xCoord + dx + 0.5F, this.yCoord + dy + 0.5F, this.zCoord + dz + 0.5F, "fire.fire", 1.0F, 1.0F); - } - } - } - - /** - * What meta should we set the log block with the specified offset to? - */ - private int getCinderMetaFor(int dx, int dy, int dz) { - if (dz == 0 && dx != 0) { - return dy == 0 ? 4 : 8; - } else if (dx == 0 && dz != 0) { - return dy == 0 ? 8 : 4; - } else if (dx == 0 && dz == 0) { - return 0; - } else { - return dy == 0 ? 0 : 12; - } - - } - - /** - * Check the ore dictionary to see if a nearby block is a wood log block - */ - private boolean isLog(Block nearbyBlock) { - int[] oreIDs = OreDictionary.getOreIDs(new ItemStack(nearbyBlock)); - for (int id : oreIDs) { - if (id == OreDictionary.getOreID("logWood")) { - return true; - } - } - - return false; - } - - /** - * What is the current speed multiplier, as an int. - */ - private int getCurrentSpeedMultiplier() { - return getCurrentMultiplier(2); - } - - /** - * Returns a number that is based on the number of nearby logs divided by the factor given. - */ - private int getCurrentMultiplier(int factor) { - int logs = this.countNearbyLogs(); - - if (logs < factor) { - return 1; - } else { - return (logs / factor) + (this.worldObj.rand.nextInt(factor) >= (logs % factor) ? 0 : 1); - } - } - - /** - * Search around the block and return how many (out of a possible 26) of the blocks nearby are cinder log blocks - */ - private int countNearbyLogs() { - int count = 0; - - for (int dx = -1; dx <= 1; dx++) { - for (int dy = -1; dy <= 1; dy++) { - for (int dz = -1; dz <= 1; dz++) { - if (this.worldObj.blockExists(this.xCoord + dx, this.yCoord + dy, this.zCoord + dz) && this.getWorldObj().getBlock(this.xCoord + dx, this.yCoord + dy, this.zCoord + dz) == TFBlocks.cinderLog) { - count++; - } - } - } - } - - //System.out.println("cooking with cinder furnace, log factor = " + count); - - - return count; - } - - /** - * Returns true if the furnace can smelt an item, i.e. has a source item, destination stack isn't full, etc. - */ - private boolean canSmelt() - { - if (this.furnaceItemStacks[SLOT_INPUT] == null) - { - return false; - } - else - { - ItemStack outputStack = FurnaceRecipes.smelting().getSmeltingResult(this.furnaceItemStacks[SLOT_INPUT]); - if (outputStack == null) { - return false; - } - if (this.furnaceItemStacks[SLOT_OUTPUT] == null) { - return true; - } - if (!this.furnaceItemStacks[SLOT_OUTPUT].isItemEqual(outputStack)) { - return false; - } - - int resultStackSize = furnaceItemStacks[SLOT_OUTPUT].stackSize + this.getMaxOutputStacks(this.furnaceItemStacks[SLOT_INPUT], outputStack); - - return resultStackSize <= getInventoryStackLimit() && resultStackSize <= this.furnaceItemStacks[2].getMaxStackSize(); - } - } - - /** - * Return the max number of items in the output stack, given our current multiplier - */ - public int getMaxOutputStacks(ItemStack input, ItemStack output) { - if (this.canMultiply(input, output)) { - return output.stackSize * this.getCurrentMaxSmeltMultiplier(); - } else { - return output.stackSize; - } - } - - /** - * Turn one item from the furnace source stack into the appropriate smelted item in the furnace result stack - */ - public void smeltItem() - { - if (this.canSmelt()) - { - ItemStack outputStack = FurnaceRecipes.smelting().getSmeltingResult(this.furnaceItemStacks[SLOT_INPUT]); - - if (this.canMultiply(this.furnaceItemStacks[SLOT_INPUT], outputStack)) { - - // multiply number of results by our current smelt factor - int smeltMultiplier = this.getCurrentSmeltMultiplier(); - - if (smeltMultiplier > 1) { - // copy output stack - outputStack = outputStack.copy(); - - // we shouldn't run into max stack size problems, since we've already checked in canSmelt() - outputStack.stackSize *= smeltMultiplier; - } - - - } - - if (this.furnaceItemStacks[SLOT_OUTPUT] == null) - { - this.furnaceItemStacks[SLOT_OUTPUT] = outputStack.copy(); - } - else if (this.furnaceItemStacks[SLOT_OUTPUT].getItem() == outputStack.getItem()) - { - this.furnaceItemStacks[SLOT_OUTPUT].stackSize += outputStack.stackSize; // Forge BugFix: Results may have multiple items - } - - --this.furnaceItemStacks[SLOT_INPUT].stackSize; - - if (this.furnaceItemStacks[SLOT_INPUT].stackSize <= 0) - { - this.furnaceItemStacks[SLOT_INPUT] = null; - } - } - } - - - /** - * Can we multiply the output? We currently multiply logs->charcoal, ore->ingots, and food - */ - public boolean canMultiply(ItemStack input, ItemStack output) { - - // check the input ore ID for ores - int[] oreIDs = OreDictionary.getOreIDs(input); - for (int id : oreIDs) { - // does the input have an oredictionary result that starts with "ore"? - if (OreDictionary.getOreName(id).startsWith("ore")) { - //System.out.println("cinder furnace cook result, ore found, name is " + OreDictionary.getOreName(id)); - - return true; - } else if (id == OreDictionary.getOreID("logWood")) { - //System.out.println("cinder furnace cook result, log found"); - return true; - } - } - - // does the in - - return false; - } - - /** - * What is the current speed multiplier, as an int. - */ - private int getCurrentSmeltMultiplier() { - return getCurrentMultiplier(SMELT_LOG_FACTOR); - } - - /** - * What is the current speed multiplier, as an int. - */ - private int getCurrentMaxSmeltMultiplier() { - return (int)Math.ceil((float)this.countNearbyLogs() / (float)SMELT_LOG_FACTOR); - } - - - /** - * Returns the number of ticks that the supplied fuel item will keep the furnace burning, or 0 if the item isn't - * fuel - */ - public static int getItemBurnTime(ItemStack p_145952_0_) - { - if (p_145952_0_ == null) - { - return 0; - } - else - { - Item item = p_145952_0_.getItem(); - - if (item instanceof ItemBlock && Block.getBlockFromItem(item) != Blocks.air) - { - Block block = Block.getBlockFromItem(item); - - if (block == Blocks.wooden_slab) - { - return 150; - } - - if (block.getMaterial() == Material.wood) - { - return 300; - } - - if (block == Blocks.coal_block) - { - return 16000; - } - } - - if (item instanceof ItemTool && ((ItemTool)item).getToolMaterialName().equals("WOOD")) return 200; - if (item instanceof ItemSword && ((ItemSword)item).getToolMaterialName().equals("WOOD")) return 200; - if (item instanceof ItemHoe && ((ItemHoe)item).getToolMaterialName().equals("WOOD")) return 200; - if (item == Items.stick) return 100; - if (item == Items.coal) return 1600; - if (item == Items.lava_bucket) return 20000; - if (item == Item.getItemFromBlock(Blocks.sapling)) return 100; - if (item == Items.blaze_rod) return 2400; - return GameRegistry.getFuelValue(p_145952_0_); - } - } - - public static boolean isItemFuel(ItemStack p_145954_0_) - { - /** - * Returns the number of ticks that the supplied fuel item will keep the furnace burning, or 0 if the item isn't - * fuel - */ - return getItemBurnTime(p_145954_0_) > 0; - } - - @Override - public int getInventoryStackLimit() { - return 64; - } - - @Override - public boolean isUseableByPlayer(EntityPlayer player) { - return this.worldObj.getTileEntity(this.xCoord, this.yCoord, this.zCoord) != this ? false : player.getDistanceSq((double)this.xCoord + 0.5D, (double)this.yCoord + 0.5D, (double)this.zCoord + 0.5D) <= 64.0D; - - } - - @Override - public void openInventory() {;} - - @Override - public void closeInventory() {;} - - @Override - public boolean isItemValidForSlot(int slot, ItemStack itemStack) { - return slot == SLOT_OUTPUT ? false : (slot == SLOT_FUEL ? TileEntityFurnace.isItemFuel(itemStack) : true); - } - - @Override - public int[] getAccessibleSlotsFromSide(int p_94128_1_) { - return p_94128_1_ == 0 ? slotsBottom : (p_94128_1_ == 1 ? slotsTop : slotsSides); - } - - /** - * Returns true if automation can insert the given item in the given slot from the given side. Args: Slot, item, - * side - */ - public boolean canInsertItem(int slot, ItemStack itemStack, int side) - { - return this.isItemValidForSlot(slot, itemStack); - } - - /** - * Returns true if automation can extract the given item in the given slot from the given side. Args: Slot, item, - * side - */ - public boolean canExtractItem(int slot, ItemStack itemStack, int side) - { - return side != SLOT_INPUT || slot != SLOT_FUEL || itemStack.getItem() == Items.bucket; - } - -} diff --git a/src/main/java/twilightforest/tileentity/TileEntityTFCritter.java b/src/main/java/twilightforest/tileentity/TileEntityTFCritter.java deleted file mode 100644 index 648e6c8883..0000000000 --- a/src/main/java/twilightforest/tileentity/TileEntityTFCritter.java +++ /dev/null @@ -1,105 +0,0 @@ -package twilightforest.tileentity; - -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; - -public abstract class TileEntityTFCritter extends TileEntity { - - public TileEntityTFCritter() { - super(); - } - - - /** - * Reads a tile entity from NBT. - */ - @Override - public void readFromNBT(NBTTagCompound par1NBTTagCompound) { - super.readFromNBT(par1NBTTagCompound); - } - - /** - * Writes a tile entity to NBT. - */ - @Override - public void writeToNBT(NBTTagCompound par1NBTTagCompound) { - super.writeToNBT(par1NBTTagCompound); - } - - /** - * Determines if this TileEntity requires update calls. - * @return True if you want updateEntity() to be called, false if not - */ - @Override - public boolean canUpdate() - { - return true; - } - - /** - * Allows the entity to update its state. Overridden in most subclasses, e.g. the mob spawner uses this to count - * ticks and creates a new spawn inside its implementation. - */ - @Override - public void updateEntity() - { - - } - - -// /** -// * Fix imported tileentities from version 1.9 -// */ -// private void fixFacing() { -// // we get called here if our facing is -1. Let's see what we can do. -// //System.out.println("Trying to fix critter tile entity facing..."); -// -// // look in all directions for a surface to face -// if (TFBlocks.firefly.canPlaceBlockAt(worldObj, xCoord - 1, yCoord, zCoord)) { -// setFacing(1); -// } -// else if (TFBlocks.firefly.canPlaceBlockAt(worldObj, xCoord + 1, yCoord, zCoord)) { -// setFacing(2); -// } -// else if (TFBlocks.firefly.canPlaceBlockAt(worldObj, xCoord, yCoord, zCoord - 1)) { -// setFacing(3); -// } -// else if (TFBlocks.firefly.canPlaceBlockAt(worldObj, xCoord, yCoord, zCoord + 1)) { -// setFacing(4); -// } -// else if (TFBlocks.firefly.canPlaceBlockAt(worldObj, xCoord, yCoord - 1, zCoord)) { -// setFacing(5); -// } -// else if (TFBlocks.firefly.canPlaceBlockAt(worldObj, xCoord, yCoord + 1, zCoord)) { -// setFacing(6); -// } -// -// } - -// /** -// * Called when you receive a TileEntityData packet for the location this -// * TileEntity is currently in. On the client, the NetworkManager will always -// * be the remote server. On the server, it will be whomever is responsible for -// * sending the packet. -// * -// * @param net The NetworkManager the packet originated from -// * @param pkt The data packet -// */ -// @Override -// public void onDataPacket(NetworkManager net, Packet132TileEntityData pkt) { -//// setFacing(pkt.customParam1); -// } - - - -// /** -// * Overriden in a sign to provide the text -// */ -// public Packet getDescriptionPacket() -// { -// int var1 = getFacing(); -// return new Packet132TileEntityData(this.xCoord, this.yCoord, this.zCoord, 1, var1); -// } - - -} diff --git a/src/main/java/twilightforest/tileentity/TileEntityTFFirefly.java b/src/main/java/twilightforest/tileentity/TileEntityTFFirefly.java deleted file mode 100644 index 122711c6c4..0000000000 --- a/src/main/java/twilightforest/tileentity/TileEntityTFFirefly.java +++ /dev/null @@ -1,120 +0,0 @@ -package twilightforest.tileentity; - -import twilightforest.entity.passive.EntityTFTinyFirefly; - - - -public class TileEntityTFFirefly extends TileEntityTFCritter { - - - public int yawDelay; - public int currentYaw; - public int desiredYaw; - - public float glowIntensity; - public boolean glowing; - public int glowDelay; - - /** - * Allows the entity to update its state. Overridden in most subclasses, e.g. the mob spawner uses this to count - * ticks and creates a new spawn inside its implementation. - */ - @Override - public void updateEntity() - { - super.updateEntity(); - -// if (worldObj.getBlockMetadata(xCoord, yCoord, zCoord) != 0) { -// //System.out.println("Firefly tile entity block has invalid metadata, fixing"); -// worldObj.setBlockMetadata(xCoord, yCoord, zCoord, 0); -// } - - if (anyPlayerInRange() && worldObj.rand.nextInt(20) == 0) - { - doFireflyFX(); - } - - if(yawDelay > 0) - { - yawDelay--; - } else { - if (currentYaw == 0 && desiredYaw == 0) - { - // make it rotate! - yawDelay = 200 + worldObj.rand.nextInt(200); - desiredYaw = worldObj.rand.nextInt(15) - worldObj.rand.nextInt(15); - } - - if (currentYaw < desiredYaw) - { - currentYaw++; - } - if (currentYaw > desiredYaw) - { - currentYaw--; - } - if (currentYaw == desiredYaw) - { - desiredYaw = 0; - } - } - - if (glowDelay > 0) - { - glowDelay--; - } else { - if (glowing && glowIntensity >= 1.0) - { - glowing = false; - } - if (glowing && glowIntensity < 1.0) - { - glowIntensity += 0.05; - } - if (!glowing && glowIntensity > 0) - { - glowIntensity -= 0.05; - } - if (!glowing && glowIntensity <= 0) - { - glowing = true; - glowDelay = worldObj.rand.nextInt(50); - } - } - } - - public boolean anyPlayerInRange() - { - return worldObj.getClosestPlayer(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D, 16D) != null; - } - - -// /** -// * There seems to be a bug in the chunk placing routines which sets the tileentity metadta to 0 even if the tile shifts metadatas when placed. -// * Thus, if the metadata is 0, re-check it -// */ -// @Override -// public int getBlockMetadata() { -// if (super.getBlockMetadata() == 0) -// { -// this.blockMetadata = -1; -// } -// return super.getBlockMetadata(); -// } - - /** - * Makes little fireflies float around - */ - void doFireflyFX() - { - double rx = xCoord + worldObj.rand.nextFloat(); - double ry = yCoord + worldObj.rand.nextFloat(); - double rz = zCoord + worldObj.rand.nextFloat(); -// EntityTFFireflyFX fireflyfx = new EntityTFFireflyFX(worldObj, rx, ry, rz, 0.0F, 0.0F, 0.0F); -// ModLoader.getMinecraftInstance().effectRenderer.addEffect(fireflyfx); - EntityTFTinyFirefly tinyfly = new EntityTFTinyFirefly(worldObj, rx, ry, rz); - worldObj.addWeatherEffect(tinyfly); - } - - -} diff --git a/src/main/java/twilightforest/tileentity/TileEntityTFFlameJet.java b/src/main/java/twilightforest/tileentity/TileEntityTFFlameJet.java deleted file mode 100644 index 1251e7f669..0000000000 --- a/src/main/java/twilightforest/tileentity/TileEntityTFFlameJet.java +++ /dev/null @@ -1,114 +0,0 @@ -package twilightforest.tileentity; - -import java.util.List; - -import net.minecraft.entity.Entity; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.DamageSource; -import twilightforest.TwilightForestMod; -import twilightforest.block.BlockTFFireJet; -import twilightforest.block.TFBlocks; - -public class TileEntityTFFlameJet extends TileEntity { - - int counter = 0; - private int nextMeta; - - public TileEntityTFFlameJet() { - this(BlockTFFireJet.META_JET_IDLE); - } - - public TileEntityTFFlameJet(int parNextMeta) { - this.nextMeta = parNextMeta; - } - - /** - * Allows the entity to update its state. Overridden in most subclasses, e.g. the mob spawner uses this to count - * ticks and creates a new spawn inside its implementation. - */ - @Override - public void updateEntity() - { - if (++counter > 60) - { - counter = 0; - // idle again - if (!worldObj.isRemote && worldObj.getBlock(this.xCoord, this.yCoord, this.zCoord) == TFBlocks.fireJet) - { - worldObj.setBlock(this.xCoord, this.yCoord, this.zCoord, TFBlocks.fireJet, this.nextMeta, 3); - } - this.invalidate(); - } - else if (counter % 2 == 0) - { - worldObj.spawnParticle("largesmoke", this.xCoord + 0.5, this.yCoord + 1.0, this.zCoord + 0.5, 0.0D, 0.0D, 0.0D); - TwilightForestMod.proxy.spawnParticle(this.worldObj, "largeflame", this.xCoord + 0.5, this.yCoord + 1.0, this.zCoord + 0.5, 0.0D, 0.5D, 0.0D); -// TwilightForestMod.proxy.spawnParticle("largeflame", this.xCoord + 0.5, this.yCoord + 1.0, this.zCoord + 0.5, -// Math.cos(counter / 4.0) * 0.2, 0.35D, Math.sin(counter / 4.0) * 0.2); -// TwilightForestMod.proxy.spawnParticle("largeflame", this.xCoord + 0.5, this.yCoord + 1.0, this.zCoord + 0.5, -// Math.cos(counter / 4.0 + Math.PI) * 0.2, 0.35D, Math.sin(counter / 4.0 + Math.PI) * 0.2); -// TwilightForestMod.proxy.spawnParticle("largeflame", this.xCoord + 0.5 + Math.cos(counter / 4.0), this.yCoord + 1.0, this.zCoord + 0.5 + Math.sin(counter / 4.0), -// Math.sin(counter / 4.0) * 0.05, 0.35D, Math.cos(counter / 4.0) * 0.05); -// TwilightForestMod.proxy.spawnParticle("largeflame", this.xCoord + 0.5 + Math.cos(counter / 4.0 + Math.PI), this.yCoord + 1.0, this.zCoord + 0.5 + Math.sin(counter / 4.0 + Math.PI), -// Math.sin(counter / 4.0 + Math.PI) * 0.05, 0.35D, Math.cos(counter / 4.0 + Math.PI) * 0.05); - - TwilightForestMod.proxy.spawnParticle(this.worldObj, "largeflame", this.xCoord - 0.5, this.yCoord + 1.0, this.zCoord + 0.5, 0.05D, 0.5D, 0.0D); - TwilightForestMod.proxy.spawnParticle(this.worldObj, "largeflame", this.xCoord + 0.5, this.yCoord + 1.0, this.zCoord - 0.5, 0.0D, 0.5D, 0.05D); - TwilightForestMod.proxy.spawnParticle(this.worldObj, "largeflame", this.xCoord + 1.5, this.yCoord + 1.0, this.zCoord + 0.5, -0.05D, 0.5D, 0.0D); - TwilightForestMod.proxy.spawnParticle(this.worldObj, "largeflame", this.xCoord + 0.5, this.yCoord + 1.0, this.zCoord + 1.5, 0.0D, 0.5D, -0.05D); - - } - - // sounds - if (counter % 4 == 0) - { - worldObj.playSoundEffect(this.xCoord + 0.5, this.yCoord + 0.5, this.zCoord + 0.5, "mob.ghast.fireball", 1.0F + worldObj.rand.nextFloat(), worldObj.rand.nextFloat() * 0.7F + 0.3F); - - } - else if (counter == 1) - { - worldObj.playSoundEffect(this.xCoord + 0.5, this.yCoord + 0.5, this.zCoord + 0.5, "fire.ignite", 1.0F + worldObj.rand.nextFloat(), worldObj.rand.nextFloat() * 0.7F + 0.3F); - } - - // actual fire effects - if (!worldObj.isRemote) - { - if (counter % 5 == 0) - { - // find entities in the area of effect - List entitiesInRange = worldObj.getEntitiesWithinAABB(Entity.class, - AxisAlignedBB.getBoundingBox(this.xCoord - 2, this.yCoord, this.zCoord - 2, - this.xCoord + 2, this.yCoord + 4, this.zCoord + 2)); - // fire! - for (Entity entity : entitiesInRange) - { - if (!entity.isImmuneToFire()) - { - entity.attackEntityFrom(DamageSource.inFire, 2); - entity.setFire(15); - } - } - } - } - } - - /** - * Reads a tile entity from NBT. - */ - public void readFromNBT(NBTTagCompound par1NBTTagCompound) - { - super.readFromNBT(par1NBTTagCompound); - this.nextMeta = par1NBTTagCompound.getInteger("NextMeta"); - } - - /** - * Writes a tile entity to NBT. - */ - public void writeToNBT(NBTTagCompound par1NBTTagCompound) - { - super.writeToNBT(par1NBTTagCompound); - par1NBTTagCompound.setInteger("NextMeta", this.nextMeta); - } -} diff --git a/src/main/java/twilightforest/tileentity/TileEntityTFGhastTrapActive.java b/src/main/java/twilightforest/tileentity/TileEntityTFGhastTrapActive.java deleted file mode 100644 index 4939811cba..0000000000 --- a/src/main/java/twilightforest/tileentity/TileEntityTFGhastTrapActive.java +++ /dev/null @@ -1,130 +0,0 @@ -package twilightforest.tileentity; - -import java.util.List; -import java.util.Random; - -import net.minecraft.entity.monster.EntityGhast; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.DamageSource; -import twilightforest.TwilightForestMod; -import twilightforest.block.BlockTFTowerDevice; -import twilightforest.block.TFBlocks; -import twilightforest.entity.EntityTFTowerGhast; -import twilightforest.entity.boss.EntityTFUrGhast; - -public class TileEntityTFGhastTrapActive extends TileEntity { - - public int counter = 0; - - public Random rand = new Random(); - - - public boolean canUpdate() - { - return true; - } - - /** - * Allows the entity to update its state. Overridden in most subclasses, e.g. the mob spawner uses this to count - * ticks and creates a new spawn inside its implementation. - */ - @Override - public void updateEntity() - { - - ++counter; - - if (worldObj.isRemote) - { - // smoke when done - if (counter > 100 && counter % 4 == 0) { - TwilightForestMod.proxy.spawnParticle(this.worldObj, "hugesmoke", this.xCoord + 0.5, this.yCoord + 0.95, this.zCoord + 0.5, Math.cos(counter / 10.0) * 0.05, 0.25D, Math.sin(counter / 10.0) * 0.05); - } - else if (counter < 100) - { - double dx = Math.cos(counter / 10.0) * 2.5; - double dy = 20D; - double dz = Math.sin(counter / 10.0) * 2.5; - - - TwilightForestMod.proxy.spawnParticle(this.worldObj, "ghasttrap", this.xCoord + 0.5D, this.yCoord + 1.0D, this.zCoord + 0.5D, dx, dy, dz); - TwilightForestMod.proxy.spawnParticle(this.worldObj, "ghasttrap", this.xCoord + 0.5D, this.yCoord + 1.0D, this.zCoord + 0.5D, -dx, dy, -dz); - TwilightForestMod.proxy.spawnParticle(this.worldObj, "ghasttrap", this.xCoord + 0.5D, this.yCoord + 1.0D, this.zCoord + 0.5D, -dx, dy / 2, dz); - TwilightForestMod.proxy.spawnParticle(this.worldObj, "ghasttrap", this.xCoord + 0.5D, this.yCoord + 1.0D, this.zCoord + 0.5D, dx, dy / 2, -dz); - TwilightForestMod.proxy.spawnParticle(this.worldObj, "ghasttrap", this.xCoord + 0.5D, this.yCoord + 1.0D, this.zCoord + 0.5D, dx / 2, dy / 4, dz / 2); - TwilightForestMod.proxy.spawnParticle(this.worldObj, "ghasttrap", this.xCoord + 0.5D, this.yCoord + 1.0D, this.zCoord + 0.5D, -dx / 2, dy / 4, -dz / 2); - } - - // appropriate sound - if (counter < 30) - { - worldObj.playSound(this.xCoord + 0.5D, this.yCoord + 1.5D, this.zCoord + 0.5D, TwilightForestMod.ID + ":mob.urghast.trapwarmup", 1.0F, 4.0F, false); - } - else if (counter < 80) - { - worldObj.playSound(this.xCoord + 0.5D, this.yCoord + 1.5D, this.zCoord + 0.5D, TwilightForestMod.ID + ":mob.urghast.trapon", 1.0F, 4.0F, false); - } - else - { - worldObj.playSound(this.xCoord + 0.5D, this.yCoord + 1.5D, this.zCoord + 0.5D, TwilightForestMod.ID + ":mob.urghast.trapspindown", 1.0F, 4.0F, false); - } - } - - if (!worldObj.isRemote) - { - // trap nearby ghasts - AxisAlignedBB aabb = AxisAlignedBB.getBoundingBox((double)this.xCoord, (double)this.yCoord + 16, (double)this.zCoord, (double)(this.xCoord + 1), (double)(this.yCoord + 16 + 1), (double)(this.zCoord + 1)).expand(6D, 16D, 6D); - - List nearbyGhasts = worldObj.getEntitiesWithinAABB(EntityGhast.class, aabb); - - for (EntityGhast ghast : nearbyGhasts) - { - //stop boss tantrum - if (ghast instanceof EntityTFUrGhast) - { - ((EntityTFUrGhast)ghast).stopTantrum(); - - // move boss to this point - ghast.motionX = (ghast.posX - this.xCoord - 0.5) * -0.1; - ghast.motionY = (ghast.posY - this.yCoord - 2.5) * -0.1; - ghast.motionZ = (ghast.posZ - this.zCoord - 0.5) * -0.1; - - if (rand.nextInt(10) == 0) - { - ghast.attackEntityFrom(DamageSource.generic, 3); - } - - } - else - { - // move ghasts to this point - ghast.motionX = (ghast.posX - this.xCoord - 0.5) * -0.1; - ghast.motionY = (ghast.posY - this.yCoord - 1.5) * -0.1; - ghast.motionZ = (ghast.posZ - this.zCoord - 0.5) * -0.1; - - if (rand.nextInt(10) == 0) - { - ghast.attackEntityFrom(DamageSource.generic, 10); - } - } - - if (ghast instanceof EntityTFTowerGhast) - { - ((EntityTFTowerGhast)ghast).setInTrap(); - } - - } - - - - - if (counter >= 120) - { - // deactivate - worldObj.setBlock(this.xCoord, this.yCoord, this.zCoord, TFBlocks.towerDevice, BlockTFTowerDevice.META_GHASTTRAP_INACTIVE, 3); - //worldObj.scheduleBlockUpdate(this.xCoord, this.yCoord, this.zCoord, TFBlocks.towerDevice, 4); - } - } - } -} diff --git a/src/main/java/twilightforest/tileentity/TileEntityTFGhastTrapInactive.java b/src/main/java/twilightforest/tileentity/TileEntityTFGhastTrapInactive.java deleted file mode 100644 index b7a23a9bd8..0000000000 --- a/src/main/java/twilightforest/tileentity/TileEntityTFGhastTrapInactive.java +++ /dev/null @@ -1,118 +0,0 @@ -package twilightforest.tileentity; - -import java.util.ArrayList; -import java.util.List; -import java.util.Random; - -import net.minecraft.entity.Entity; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.AxisAlignedBB; -import twilightforest.TwilightForestMod; -import twilightforest.block.BlockTFTowerDevice; -import twilightforest.block.TFBlocks; -import twilightforest.entity.EntityTFMiniGhast; - -public class TileEntityTFGhastTrapInactive extends TileEntity { - - int counter; - Random rand = new Random(); - - ArrayList dyingGhasts = new ArrayList(); - - /** - * Determines if this TileEntity requires update calls. - * @return True if you want updateEntity() to be called, false if not - */ - @Override - public boolean canUpdate() { - return true; - } - - /** - * Allows the entity to update its state. Overridden in most subclasses, e.g. the mob spawner uses this to count - * ticks and creates a new spawn inside its implementation. - */ - @Override - public void updateEntity() - { - // check to see if there are any dying mini ghasts within our scan range - AxisAlignedBB aabb = AxisAlignedBB.getBoundingBox((double)this.xCoord, (double)this.yCoord, (double)this.zCoord, (double)(this.xCoord + 1), (double)(this.yCoord + 1), (double)(this.zCoord + 1)).expand(10D, 16D, 10D); - - List nearbyGhasts = worldObj.getEntitiesWithinAABB(EntityTFMiniGhast.class, aabb); - - for (EntityTFMiniGhast ghast : nearbyGhasts) - { - if (ghast.deathTime > 0) - { - this.makeParticlesTo(ghast); - - if (!dyingGhasts.contains(ghast)) - { - dyingGhasts.add(ghast); - } - } - } - - // display charge level, up to 3 - int chargeLevel = Math.min(3, dyingGhasts.size()); - - counter++; - - if (this.worldObj.isRemote) - { - // occasionally make a redstone line to a mini ghast - if (this.counter % 20 == 0 && nearbyGhasts.size() > 0) - { - EntityTFMiniGhast highlight = nearbyGhasts.get(rand.nextInt(nearbyGhasts.size())); - - this.makeParticlesTo(highlight); - } - - if (chargeLevel >= 1 && counter % 10 == 0) - { - ((BlockTFTowerDevice)TFBlocks.towerDevice).sparkle(worldObj, this.xCoord, this.yCoord, this.zCoord, worldObj.rand); - - worldObj.playSound(this.xCoord + 0.5D, this.yCoord + 1.5D, this.zCoord + 0.5D, "note.harp", 1.0F, 1.0F, false); - } - if (chargeLevel >= 2) - { - worldObj.spawnParticle("smoke", this.xCoord + 0.1 + rand.nextFloat() * 0.8, this.yCoord + 1.05, this.zCoord + 0.1 + rand.nextFloat() * 0.8, (rand.nextFloat() - rand.nextFloat()) * 0.05, 0.00, (rand.nextFloat() - rand.nextFloat()) * 0.05); - if (counter % 10 == 0) - { - worldObj.playSound(this.xCoord + 0.5D, this.yCoord + 1.5D, this.zCoord + 0.5D, "note.harp", 1.2F, 0.8F, false); - } - } - if (chargeLevel >= 3) - { - worldObj.spawnParticle("largesmoke", this.xCoord + 0.1 + rand.nextFloat() * 0.8, this.yCoord + 1.05, this.zCoord + 0.1 + rand.nextFloat() * 0.8, (rand.nextFloat() - rand.nextFloat()) * 0.05, 0.05, (rand.nextFloat() - rand.nextFloat()) * 0.05); - ((BlockTFTowerDevice)TFBlocks.towerDevice).sparkle(worldObj, this.xCoord, this.yCoord, this.zCoord, worldObj.rand); - if (counter % 5 == 0) - { - worldObj.playSound(this.xCoord + 0.5D, this.yCoord + 1.5D, this.zCoord + 0.5D, "note.harp", 1.5F, 2F, false); - } - } - } - } - - private void makeParticlesTo(Entity highlight) { - double sx = this.xCoord + 0.5D; - double sy = this.yCoord + 1.0D; - double sz = this.zCoord + 0.5D; - - double dx = sx - highlight.posX; - double dy = sy - highlight.posY - highlight.getEyeHeight(); - double dz = sz - highlight.posZ; - - for (int i = 0; i < 5; i++) - { - TwilightForestMod.proxy.spawnParticle(this.worldObj, "ghasttrap", sx, sy, sz, -dx, -dy, -dz); - } - - } - - public boolean isCharged() - { - return dyingGhasts.size() >= 3; - } - -} diff --git a/src/main/java/twilightforest/tileentity/TileEntityTFHydraSpawner.java b/src/main/java/twilightforest/tileentity/TileEntityTFHydraSpawner.java deleted file mode 100644 index e26fd45263..0000000000 --- a/src/main/java/twilightforest/tileentity/TileEntityTFHydraSpawner.java +++ /dev/null @@ -1,26 +0,0 @@ -package twilightforest.tileentity; - -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityList; -import twilightforest.entity.TFCreatures; - - -public class TileEntityTFHydraSpawner extends TileEntityTFBossSpawner { - - public TileEntityTFHydraSpawner() { - this.mobID = TFCreatures.getSpawnerNameFor("Hydra"); - } - - /** - * Get a temporary copy of the creature we're going to summon for display purposes - */ - public Entity getDisplayEntity() - { - if (this.displayCreature == null) - { - this.displayCreature = EntityList.createEntityByName("HydraHead", worldObj); - } - - return this.displayCreature; - } -} diff --git a/src/main/java/twilightforest/tileentity/TileEntityTFKnightPhantomsSpawner.java b/src/main/java/twilightforest/tileentity/TileEntityTFKnightPhantomsSpawner.java deleted file mode 100644 index 06bc55a66e..0000000000 --- a/src/main/java/twilightforest/tileentity/TileEntityTFKnightPhantomsSpawner.java +++ /dev/null @@ -1,62 +0,0 @@ -package twilightforest.tileentity; - -import net.minecraft.entity.EntityLiving; -import net.minecraft.entity.player.EntityPlayer; -import twilightforest.entity.TFCreatures; -import twilightforest.entity.boss.EntityTFKnightPhantom; - -public class TileEntityTFKnightPhantomsSpawner extends TileEntityTFBossSpawner { - - public TileEntityTFKnightPhantomsSpawner() { - this.mobID = TFCreatures.getSpawnerNameFor("Knight Phantom"); - } - - @Override - public boolean anyPlayerInRange() - { - EntityPlayer closestPlayer = worldObj.getClosestPlayer(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D, 9D); - - return closestPlayer != null && closestPlayer.posY > yCoord - 2; - } - - /** - * Spawn the boss - */ - protected void spawnMyBoss() { - - for (int i = 0; i < 6; i++) - { - - // spawn creature - EntityLiving myCreature = makeMyCreature(); - - float angle = 60F * i; - float distance = 4F; - - double rx = xCoord + 0.5D + Math.cos((angle) * Math.PI / 180.0D) * distance; - double ry = yCoord + 0.5D; - double rz = zCoord + 0.5D + Math.sin((angle) * Math.PI / 180.0D) * distance; - - myCreature.setLocationAndAngles(rx, ry, rz, worldObj.rand.nextFloat() * 360F, 0.0F); - - // set creature's home to this - initializeCreature(myCreature); - - ((EntityTFKnightPhantom)myCreature).setNumber(i); - - // spawn it - worldObj.spawnEntityInWorld(myCreature); - } - } - - /** - * Any post-creation initialization goes here - */ - protected void initializeCreature(EntityLiving myCreature) { - if (myCreature instanceof EntityTFKnightPhantom) - { - ((EntityTFKnightPhantom) myCreature).setHomeArea(xCoord, yCoord, zCoord, 46); - } - } - -} diff --git a/src/main/java/twilightforest/tileentity/TileEntityTFLichSpawner.java b/src/main/java/twilightforest/tileentity/TileEntityTFLichSpawner.java deleted file mode 100644 index bcd3d4160b..0000000000 --- a/src/main/java/twilightforest/tileentity/TileEntityTFLichSpawner.java +++ /dev/null @@ -1,20 +0,0 @@ -package twilightforest.tileentity; - -import net.minecraft.entity.player.EntityPlayer; -import twilightforest.entity.TFCreatures; - -public class TileEntityTFLichSpawner extends TileEntityTFBossSpawner { - - public TileEntityTFLichSpawner() { - this.mobID = TFCreatures.getSpawnerNameFor("Twilight Lich"); - } - - @Override - public boolean anyPlayerInRange() - { - EntityPlayer closestPlayer = worldObj.getClosestPlayer(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D, 9D); - - return closestPlayer != null && closestPlayer.posY > yCoord - 4; - } - -} diff --git a/src/main/java/twilightforest/tileentity/TileEntityTFMoonworm.java b/src/main/java/twilightforest/tileentity/TileEntityTFMoonworm.java deleted file mode 100644 index c1d175aaa5..0000000000 --- a/src/main/java/twilightforest/tileentity/TileEntityTFMoonworm.java +++ /dev/null @@ -1,61 +0,0 @@ -package twilightforest.tileentity; - - - -public class TileEntityTFMoonworm extends TileEntityTFCritter { - - - public int yawDelay; - public int currentYaw; - public int desiredYaw; - - public TileEntityTFMoonworm() { - super(); - - currentYaw = -1; - yawDelay = 0; - desiredYaw = 0; - } - - /** - * Allows the entity to update its state. Overridden in most subclasses, e.g. the mob spawner uses this to count - * ticks and creates a new spawn inside its implementation. - */ - @Override - public void updateEntity() - { - super.updateEntity(); - - if (currentYaw == -1) - { - currentYaw = worldObj.rand.nextInt(4) * 90; - } - - if(yawDelay > 0) - { - yawDelay--; - } - else - { - if (desiredYaw == 0) - { - // make it rotate! - yawDelay = 200 + worldObj.rand.nextInt(200); - desiredYaw = worldObj.rand.nextInt(4) * 90; - } - - currentYaw++; - - if (currentYaw > 360) - { - currentYaw = 0; - } - - if (currentYaw == desiredYaw) - { - desiredYaw = 0; - } - } - } - -} diff --git a/src/main/java/twilightforest/tileentity/TileEntityTFNagaSpawner.java b/src/main/java/twilightforest/tileentity/TileEntityTFNagaSpawner.java deleted file mode 100644 index 1893becf46..0000000000 --- a/src/main/java/twilightforest/tileentity/TileEntityTFNagaSpawner.java +++ /dev/null @@ -1,35 +0,0 @@ -package twilightforest.tileentity; - -import net.minecraft.entity.EntityCreature; -import net.minecraft.entity.EntityLiving; -import twilightforest.entity.TFCreatures; - -public class TileEntityTFNagaSpawner extends TileEntityTFBossSpawner { - - public TileEntityTFNagaSpawner() { - this.mobID = TFCreatures.getSpawnerNameFor("Naga"); - } - - public boolean anyPlayerInRange() - { - return worldObj.getClosestPlayer(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D, 50D) != null; - } - - /** - * Any post-creation initialization goes here - */ - protected void initializeCreature(EntityLiving myCreature) { - - if (myCreature instanceof EntityCreature) - { - ((EntityCreature) myCreature).setHomeArea(xCoord, yCoord, zCoord, 46); - } - } - - /** - * Range? - */ - protected int getRange() { - return 50; - } -} diff --git a/src/main/java/twilightforest/tileentity/TileEntityTFPoppingJet.java b/src/main/java/twilightforest/tileentity/TileEntityTFPoppingJet.java deleted file mode 100644 index f623f717fd..0000000000 --- a/src/main/java/twilightforest/tileentity/TileEntityTFPoppingJet.java +++ /dev/null @@ -1,66 +0,0 @@ -package twilightforest.tileentity; - -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import twilightforest.block.BlockTFFireJet; -import twilightforest.block.TFBlocks; - -public class TileEntityTFPoppingJet extends TileEntity { - - int counter = 0; - int nextMeta; - - public TileEntityTFPoppingJet() { - this(BlockTFFireJet.META_JET_FLAME); - } - - public TileEntityTFPoppingJet(int parNextMeta) { - this.nextMeta = parNextMeta; - } - - /** - * Allows the entity to update its state. Overridden in most subclasses, e.g. the mob spawner uses this to count - * ticks and creates a new spawn inside its implementation. - */ - @Override - public void updateEntity() - { - if (++counter >= 80) - { - counter = 0; - // turn to flame - if (!worldObj.isRemote && worldObj.getBlock(this.xCoord, this.yCoord, this.zCoord) == TFBlocks.fireJet) - { - worldObj.setBlock(this.xCoord, this.yCoord, this.zCoord, TFBlocks.fireJet, this.nextMeta, 3); - } - this.invalidate(); - } - else - { - if (counter % 20 == 0) { - worldObj.spawnParticle("lava", this.xCoord + 0.5, this.yCoord + 1.5, this.zCoord + 0.5, 0.0D, 0.0D, 0.0D); - worldObj.playSoundEffect(this.xCoord, this.yCoord, this.zCoord, "liquid.lavapop", 0.2F + worldObj.rand.nextFloat() * 0.2F, 0.9F + worldObj.rand.nextFloat() * 0.15F); - } - - } - - } - - /** - * Reads a tile entity from NBT. - */ - public void readFromNBT(NBTTagCompound par1NBTTagCompound) - { - super.readFromNBT(par1NBTTagCompound); - this.nextMeta = par1NBTTagCompound.getInteger("NextMeta"); - } - - /** - * Writes a tile entity to NBT. - */ - public void writeToNBT(NBTTagCompound par1NBTTagCompound) - { - super.writeToNBT(par1NBTTagCompound); - par1NBTTagCompound.setInteger("NextMeta", this.nextMeta); - } -} diff --git a/src/main/java/twilightforest/tileentity/TileEntityTFReverter.java b/src/main/java/twilightforest/tileentity/TileEntityTFReverter.java deleted file mode 100644 index 72d36e08f8..0000000000 --- a/src/main/java/twilightforest/tileentity/TileEntityTFReverter.java +++ /dev/null @@ -1,380 +0,0 @@ -package twilightforest.tileentity; - -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.init.Blocks; -import net.minecraft.tileentity.TileEntity; -import twilightforest.block.BlockTFTowerTranslucent; -import twilightforest.block.TFBlocks; - -public class TileEntityTFReverter extends TileEntity -{ - private static final int REVERT_CHANCE = 10; - - public int radius = 4; - public int diameter = 2 * radius + 1; - public double requiredPlayerRange = 16; - public Random rand = new Random(); - private int tickCount; - - private boolean slowScan; - private int ticksSinceChange; - - private Block[] blockData; - private byte[] metaData; - - /** - * Determines if this TileEntity requires update calls. - * @return True if you want updateEntity() to be called, false if not - */ - @Override - public boolean canUpdate() { - return true; - } - - /** - * Allows the entity to update its state. Overridden in most subclasses, e.g. the mob spawner uses this to count - * ticks and creates a new spawn inside its implementation. - */ - @Override - public void updateEntity() - { - if (this.anyPlayerInRange()) - { - this.tickCount++; - - if (this.worldObj.isRemote) - { - double var1 = (double)((float)this.xCoord + this.worldObj.rand.nextFloat()); - double var3 = (double)((float)this.yCoord + this.worldObj.rand.nextFloat()); - double var5 = (double)((float)this.zCoord + this.worldObj.rand.nextFloat()); -// this.worldObj.spawnParticle("smoke", var1, var3, var5, 0.0D, 0.0D, 0.0D); - this.worldObj.spawnParticle("reddust", var1, var3, var5, 0.0D, 0.0D, 0.0D); - - - // occasionally make a little red dust line to outline our radius - if (this.rand.nextInt(10) == 0) - { - makeRandomOutline(); - makeRandomOutline(); - makeRandomOutline(); - } - } - else - { - - // new plan, take a snapshot of the world when we are first activated, and then rapidly revert changes - if (blockData == null || metaData == null) - { - captureBlockData(); - this.slowScan = true; - } - - if (!this.slowScan || this.tickCount % 20 == 0) - { - if (scanAndRevertChanges()) - { - this.slowScan = false; - this.ticksSinceChange = 0; - } - else - { - ticksSinceChange++; - - if (ticksSinceChange > 20) - { - this.slowScan = true; - } - } - } - } - } - else - { - // remove data - this.blockData = null; - this.metaData = null; - - this.tickCount = 0; - } - } - - - /** - * Display a random one of the 12 possible outlines - */ - private void makeRandomOutline() - { - makeOutline(this.rand.nextInt(12)); - } - - /** - * Display a specific outline - */ - private void makeOutline(int outline) - { - // src - double sx = this.xCoord; - double sy = this.yCoord; - double sz = this.zCoord; - // dest - double dx = this.xCoord; - double dy = this.yCoord; - double dz = this.zCoord; - - switch (outline) - { - case 0: - case 8: - sx -= radius; - dx += radius + 1; - sz -= radius; - dz -= radius; - break; - case 1: - case 9: - sx -= radius; - dx -= radius; - sz -= radius; - dz += radius + 1; - break; - case 2: - case 10: - sx -= radius; - dx += radius + 1; - sz += radius + 1; - dz += radius + 1; - break; - case 3: - case 11: - sx += radius + 1; - dx += radius + 1; - sz -= radius; - dz += radius + 1; - break; - case 4: - sx -= radius; - dx -= radius; - sz -= radius; - dz -= radius; - break; - case 5: - sx += radius + 1; - dx += radius + 1; - sz -= radius; - dz -= radius; - break; - case 6: - sx += radius + 1; - dx += radius + 1; - sz += radius + 1; - dz += radius + 1; - break; - case 7: - sx -= radius; - dx -= radius; - sz += radius + 1; - dz += radius + 1; - break; - } - - switch (outline) - { - case 0: - case 1: - case 2: - case 3: - sy += radius + 1; - dy += radius + 1; - break; - case 4: - case 5: - case 6: - case 7: - sy -= radius; - dy += radius + 1; - break; - case 8: - case 9: - case 10: - case 11: - sy -= radius; - dy -= radius; - break; - } - - if(rand.nextBoolean()) - { - drawParticleLine(this.xCoord + 0.5, this.yCoord + 0.5, this.zCoord + 0.5, dx, dy, dz); - } - else - { - drawParticleLine(sx, sy, sz, this.xCoord + 0.5, this.yCoord + 0.5, this.zCoord + 0.5); - } - drawParticleLine(sx, sy, sz, dx, dy, dz); - } - - /** - * Make a trail of particles from one point to another - */ - protected void drawParticleLine(double srcX, double srcY, double srcZ, double destX, double destY, double destZ) { - // make particle trail - int particles = 16; - for (int i = 0; i < particles; i++) - { - double trailFactor = i / (particles - 1.0D); - - double tx = srcX + (destX - srcX) * trailFactor + rand.nextFloat() * 0.005; - double ty = srcY + (destY - srcY) * trailFactor + rand.nextFloat() * 0.005; - double tz = srcZ + (destZ - srcZ) * trailFactor + rand.nextFloat() * 0.005; - worldObj.spawnParticle("reddust", tx, ty, tz, 0, 0, 0); - } - } - - private boolean scanAndRevertChanges() { - int index = 0; - boolean reverted = false; - - for (int x = - radius; x <= radius; x++) - { - for (int y = - radius; y <= radius; y++) - { - for (int z = - radius; z <= radius; z++) - { - Block blockID = worldObj.getBlock(this.xCoord + x, this.yCoord + y, this.zCoord + z); - byte meta = (byte) worldObj.getBlockMetadata(this.xCoord + x, this.yCoord + y, this.zCoord + z); - - if (blockData[index] != blockID) - { - if (revertBlock(this.xCoord + x, this.yCoord + y, this.zCoord + z, blockID, meta, blockData[index], metaData[index])) - { - reverted = true; - } - else - { - blockData[index] = blockID; - metaData[index] = meta; - } - } - - index++; - } - } - } - - return reverted; - } - - private boolean revertBlock(int x, int y, int z, Block thereBlockID, byte thereMeta, Block replaceBlockID, byte replaceMeta) - { - if (thereBlockID == Blocks.air && !replaceBlockID.getMaterial().blocksMovement()) - { - // do not revert - - System.out.println("Not replacing block " + replaceBlockID + " because it doesn't block movement"); - - return false; - } - if (isUnrevertable(thereBlockID, thereMeta, replaceBlockID, replaceMeta)) - { - // do not revert - return false; - } - else if (this.rand.nextInt(REVERT_CHANCE) == 0) - { - // don't revert everything instantly - if (replaceBlockID != Blocks.air) - { - replaceBlockID = TFBlocks.towerTranslucent; - replaceMeta = BlockTFTowerTranslucent.META_REVERTER_REPLACEMENT; - } - - worldObj.setBlock(x, y, z, replaceBlockID, replaceMeta, 2); - - // play a little animation - if (thereBlockID == Blocks.air) - { - worldObj.playAuxSFX(2001, x, y, z, Block.getIdFromBlock(replaceBlockID) + (replaceMeta << 12)); - } - else if (replaceBlockID == Blocks.air) - { - worldObj.playAuxSFX(2001, x, y, z, Block.getIdFromBlock(thereBlockID) + (thereMeta << 12)); - thereBlockID.dropBlockAsItem(worldObj, x, y, z, thereMeta, 0); - - } - } - - return true; - } - - private boolean isUnrevertable(Block thereBlockID, byte thereMeta, Block replaceBlockID, byte replaceMeta) - { - if (thereBlockID == TFBlocks.towerDevice || replaceBlockID == TFBlocks.towerDevice) - { - return true; - } - if ((thereBlockID == TFBlocks.towerTranslucent && thereMeta != BlockTFTowerTranslucent.META_REVERTER_REPLACEMENT) - || (replaceBlockID == TFBlocks.towerTranslucent && replaceMeta != BlockTFTowerTranslucent.META_REVERTER_REPLACEMENT)) - { - return true; - } - if (thereBlockID == Blocks.redstone_lamp && replaceBlockID == Blocks.lit_redstone_lamp) - { - return true; - } - if (thereBlockID == Blocks.lit_redstone_lamp && replaceBlockID == Blocks.redstone_lamp) - { - return true; - } - if (thereBlockID == Blocks.water || replaceBlockID == Blocks.flowing_water) - { - return true; - } - if (thereBlockID == Blocks.flowing_water || replaceBlockID == Blocks.water) - { - return true; - } - if (replaceBlockID == Blocks.tnt) - { - return true; - } - - return false; - } - - private void captureBlockData() - { - blockData = new Block[diameter * diameter * diameter]; - metaData = new byte[diameter * diameter * diameter]; - - int index = 0; - - for (int x = - radius; x <= radius; x++) - { - for (int y = - radius; y <= radius; y++) - { - for (int z = - radius; z <= radius; z++) - { - Block blockID = worldObj.getBlock(this.xCoord + x, this.yCoord + y, this.zCoord + z); - int meta = worldObj.getBlockMetadata(this.xCoord + x, this.yCoord + y, this.zCoord + z); - - blockData[index] = blockID; - metaData[index] = (byte) meta; - - index++; - } - } - } - - //System.out.println("Captured data for " + index + " blocks"); - } - - /** - * Returns true if there is a player in range (using World.getClosestPlayer) - */ - public boolean anyPlayerInRange() - { - return this.worldObj.getClosestPlayer((double)this.xCoord + 0.5D, (double)this.yCoord + 0.5D, (double)this.zCoord + 0.5D, (double)this.requiredPlayerRange ) != null; - } -} diff --git a/src/main/java/twilightforest/tileentity/TileEntityTFSmoker.java b/src/main/java/twilightforest/tileentity/TileEntityTFSmoker.java deleted file mode 100644 index f06ecb5421..0000000000 --- a/src/main/java/twilightforest/tileentity/TileEntityTFSmoker.java +++ /dev/null @@ -1,22 +0,0 @@ -package twilightforest.tileentity; - -import net.minecraft.tileentity.TileEntity; -import twilightforest.TwilightForestMod; - -public class TileEntityTFSmoker extends TileEntity { - - public long counter = 0; - - /** - * Allows the entity to update its state. Overridden in most subclasses, e.g. the mob spawner uses this to count - * ticks and creates a new spawn inside its implementation. - */ - @Override - public void updateEntity() - { - if (++counter % 4 == 0) { - TwilightForestMod.proxy.spawnParticle(this.worldObj, "hugesmoke", this.xCoord + 0.5, this.yCoord + 0.95, this.zCoord + 0.5, - Math.cos(counter / 10.0) * 0.05, 0.25D, Math.sin(counter / 10.0) * 0.05); - } - } -} diff --git a/src/main/java/twilightforest/tileentity/TileEntityTFSnowQueenSpawner.java b/src/main/java/twilightforest/tileentity/TileEntityTFSnowQueenSpawner.java deleted file mode 100644 index d05fe04505..0000000000 --- a/src/main/java/twilightforest/tileentity/TileEntityTFSnowQueenSpawner.java +++ /dev/null @@ -1,37 +0,0 @@ -package twilightforest.tileentity; - -import net.minecraft.entity.EntityLiving; -import net.minecraft.entity.player.EntityPlayer; -import twilightforest.entity.TFCreatures; - -public class TileEntityTFSnowQueenSpawner extends TileEntityTFBossSpawner { - - public TileEntityTFSnowQueenSpawner() { - this.mobID = TFCreatures.getSpawnerNameFor("Snow Queen"); - } - - @Override - public boolean anyPlayerInRange() - { - EntityPlayer closestPlayer = worldObj.getClosestPlayer(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D, 9D); - - return closestPlayer != null && closestPlayer.posY > yCoord - 4; - } - - protected void spawnMyBoss() { - // spawn creature - EntityLiving myCreature = makeMyCreature(); - - double rx = xCoord + 0.5D; - double ry = yCoord + 0.5D; - double rz = zCoord + 0.5D; - myCreature.setLocationAndAngles(rx, ry, rz, worldObj.rand.nextFloat() * 360F, 0.0F); - - // set creature's home to this - initializeCreature(myCreature); - - // spawn it - worldObj.spawnEntityInWorld(myCreature); - } - -} diff --git a/src/main/java/twilightforest/tileentity/TileEntityTFTowerBossSpawner.java b/src/main/java/twilightforest/tileentity/TileEntityTFTowerBossSpawner.java deleted file mode 100644 index 79aad70480..0000000000 --- a/src/main/java/twilightforest/tileentity/TileEntityTFTowerBossSpawner.java +++ /dev/null @@ -1,37 +0,0 @@ -package twilightforest.tileentity; - -import net.minecraft.entity.EntityLiving; -import net.minecraft.entity.player.EntityPlayer; -import twilightforest.entity.TFCreatures; - -public class TileEntityTFTowerBossSpawner extends TileEntityTFBossSpawner { - - public TileEntityTFTowerBossSpawner() { - this.mobID = TFCreatures.getSpawnerNameFor("Tower Boss"); - } - - @Override - public boolean anyPlayerInRange() - { - EntityPlayer closestPlayer = worldObj.getClosestPlayer(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D, 9D); - - return closestPlayer != null && closestPlayer.posY > yCoord - 4; - } - - protected void spawnMyBoss() { - // spawn creature - EntityLiving myCreature = makeMyCreature(); - - double rx = xCoord + 0.5D; - double ry = yCoord + 0.5D; - double rz = zCoord + 0.5D; - myCreature.setLocationAndAngles(rx, ry, rz, worldObj.rand.nextFloat() * 360F, 0.0F); - - // set creature's home to this - initializeCreature(myCreature); - - // spawn it - worldObj.spawnEntityInWorld(myCreature); - } - -} diff --git a/src/main/java/twilightforest/tileentity/TileEntityTFTowerBuilder.java b/src/main/java/twilightforest/tileentity/TileEntityTFTowerBuilder.java deleted file mode 100644 index 51e99362ff..0000000000 --- a/src/main/java/twilightforest/tileentity/TileEntityTFTowerBuilder.java +++ /dev/null @@ -1,181 +0,0 @@ -package twilightforest.tileentity; - -import net.minecraft.block.Block; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.ChunkCoordinates; -import net.minecraft.util.Facing; -import net.minecraft.util.MathHelper; -import twilightforest.block.BlockTFTowerDevice; -import twilightforest.block.BlockTFTowerTranslucent; -import twilightforest.block.TFBlocks; - -public class TileEntityTFTowerBuilder extends TileEntity -{ - private static final int RANGE = 16; - - int ticksRunning = 0; - int blockedCounter = 0; - int ticksStopped = 0; - - public boolean makingBlocks = false; - - int blocksMade = 0; - - protected ChunkCoordinates lastBlockCoords; - protected int nextFacing; - - protected EntityPlayer trackedPlayer; - - protected Block blockBuiltID = TFBlocks.towerTranslucent; - protected int blockBuiltMeta = BlockTFTowerTranslucent.META_BUILT_INACTIVE; - - public TileEntityTFTowerBuilder() - { - //System.out.println("I made a builder!"); - } - - /** - * Start building stuffs - */ - public void startBuilding() { - this.makingBlocks = true; - this.blocksMade = 0; - this.lastBlockCoords = new ChunkCoordinates(this.xCoord, this.yCoord, this.zCoord); - } - - /** - * Determines if this TileEntity requires update calls. - * @return True if you want updateEntity() to be called, false if not - */ - @Override - public boolean canUpdate() { - return true; - } - - /** - * Allows the entity to update its state. Overridden in most subclasses, e.g. the mob spawner uses this to count - * ticks and creates a new spawn inside its implementation. - */ - @Override - public void updateEntity() - { - if (!worldObj.isRemote && this.makingBlocks) - { - // if we are not tracking the nearest player, start tracking them - if (trackedPlayer == null) - { - this.trackedPlayer = findClosestValidPlayer(); - } - - // find player facing - this.nextFacing = findNextFacing(); - - ++this.ticksRunning; - - // if we are at the half second marker, make a block and advance the block cursor - if (this.ticksRunning % 10 == 0 && lastBlockCoords != null && nextFacing != -1) - { - int nextX = lastBlockCoords.posX + Facing.offsetsXForSide[nextFacing]; - int nextY = lastBlockCoords.posY + Facing.offsetsYForSide[nextFacing]; - int nextZ = lastBlockCoords.posZ + Facing.offsetsZForSide[nextFacing]; - - // make a block - if (blocksMade <= RANGE && worldObj.isAirBlock(nextX, nextY, nextZ)) - { - worldObj.setBlock(nextX, nextY, nextZ,blockBuiltID, blockBuiltMeta, 3); - - worldObj.playAuxSFX(1001, nextX, nextY, nextZ, 0); - - this.lastBlockCoords.posX = nextX; - this.lastBlockCoords.posY = nextY; - this.lastBlockCoords.posZ = nextZ; - - blockedCounter = 0; - blocksMade++; - } - else - { - blockedCounter++; - } - } - - // if we're blocked for more than a second, shut down block making - if (blockedCounter > 0) - { - this.makingBlocks = false; - this.trackedPlayer = null; - ticksStopped = 0; - } - } - else if (!worldObj.isRemote && !this.makingBlocks) - { - this.trackedPlayer = null; - if (++ticksStopped == 60) - { - // force the builder back into an inactive state - worldObj.setBlock(this.xCoord, this.yCoord, this.zCoord, TFBlocks.towerDevice, BlockTFTowerDevice.META_BUILDER_TIMEOUT, 3); - worldObj.scheduleBlockUpdate(this.xCoord, this.yCoord, this.zCoord, TFBlocks.towerDevice, 4); - } - } - } - - /** - * Are the specified destination coordinates within our build range? - */ - private boolean isInBounds(int nextX, int nextY, int nextZ) - { - return nextX > this.xCoord - RANGE && nextX < this.xCoord + RANGE - && nextY > this.yCoord - RANGE && nextY < this.yCoord + RANGE - && nextZ > this.zCoord - RANGE && nextZ < this.zCoord + RANGE; - } - - /** - * Which direction is the player facing, in terms of directions in java.util.Facing - */ - private int findNextFacing() - { - if (this.trackedPlayer != null) - { - // check up and down - int pitch = MathHelper.floor_double((double)(trackedPlayer.rotationPitch * 4.0F / 360.0F) + 1.5D) & 3; - - if (pitch == 0) - { - return 1; - } - else if (pitch == 2) - { - return 0; - } - else - { - int direction = MathHelper.floor_double((double)(trackedPlayer.rotationYaw * 4.0F / 360.0F) + 0.5D) & 3; - - switch (direction) - { - case 0: // south - return 3; - case 1: // west - return 4; - case 2: // north - return 2; - case 3: // east - return 5; - } - } - } - - return -1; - } - - /** - * Who is the closest player? Used to find which player we should track when building - */ - private EntityPlayer findClosestValidPlayer() - { - return worldObj.getClosestPlayer(this.xCoord + 0.5, this.yCoord + 0.5, this.zCoord + 0.5, 16); - } - - -} diff --git a/src/main/java/twilightforest/tileentity/TileEntityTFTrophy.java b/src/main/java/twilightforest/tileentity/TileEntityTFTrophy.java deleted file mode 100644 index 7f8aee7ef9..0000000000 --- a/src/main/java/twilightforest/tileentity/TileEntityTFTrophy.java +++ /dev/null @@ -1,21 +0,0 @@ -package twilightforest.tileentity; - -import net.minecraft.tileentity.TileEntitySkull; - -public class TileEntityTFTrophy extends TileEntitySkull -{ - - public int ticksExisted; - - /** - * Allows the entity to update its state. Overridden in most subclasses, e.g. the mob spawner uses this to count - * ticks and creates a new spawn inside its implementation. - */ - @Override - public void updateEntity() - { - super.updateEntity(); - this.ticksExisted++; - } - -} diff --git a/src/main/java/twilightforest/util/ArrayUtil.java b/src/main/java/twilightforest/util/ArrayUtil.java new file mode 100644 index 0000000000..66517d06c6 --- /dev/null +++ b/src/main/java/twilightforest/util/ArrayUtil.java @@ -0,0 +1,17 @@ +package twilightforest.util; + +import net.minecraft.util.Mth; + +// Class for handling array accesses +public final class ArrayUtil { + private ArrayUtil() { + } + + public static T clamped(T[] array, int index) { + return array[Mth.clamp(index, 0, array.length)]; + } + + public static T wrapped(T[] array, int index) { + return array[index % array.length]; + } +} diff --git a/src/main/java/twilightforest/util/AxisUtil.java b/src/main/java/twilightforest/util/AxisUtil.java new file mode 100644 index 0000000000..6395445418 --- /dev/null +++ b/src/main/java/twilightforest/util/AxisUtil.java @@ -0,0 +1,24 @@ +package twilightforest.util; + +import net.minecraft.core.Direction; + +public final class AxisUtil { + public static Direction getAxisDirectionPositive(Direction.Axis axis) { + return switch (axis) { + case X -> Direction.EAST; + case Y -> Direction.UP; + case Z -> Direction.SOUTH; + }; + } + + public static Direction getAxisDirectionNegative(Direction.Axis axis) { + return switch (axis) { + case X -> Direction.WEST; + case Y -> Direction.DOWN; + case Z -> Direction.NORTH; + }; + } + + private AxisUtil() { + } +} diff --git a/src/main/java/twilightforest/util/BoundingBoxUtils.java b/src/main/java/twilightforest/util/BoundingBoxUtils.java new file mode 100644 index 0000000000..3a1ade9e89 --- /dev/null +++ b/src/main/java/twilightforest/util/BoundingBoxUtils.java @@ -0,0 +1,65 @@ +package twilightforest.util; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.core.Vec3i; + +import org.jetbrains.annotations.Nullable; + +public class BoundingBoxUtils { + @Deprecated // Use `BoundingBox#getCenter` directly + public static Vec3i getCenter(BoundingBox sbb) { + return sbb.getCenter(); + } + + // This method has been renamed to be the intersection because it functionally is. + // If you're looking for the union equivalent, use `BoundingBox#encapsulate` + @SuppressWarnings("unused") + @Nullable + public static BoundingBox getIntersectionOfSBBs(BoundingBox box1, BoundingBox box2) { + if (!box1.intersects(box2)) + return null; + + return new BoundingBox( + Math.max(box1.minX(), box2.minX()), + Math.max(box1.minY(), box2.minY()), + Math.max(box1.minZ(), box2.minZ()), + Math.min(box1.maxX(), box2.maxX()), + Math.min(box1.maxY(), box2.maxY()), + Math.min(box1.maxZ(), box2.maxZ())); + } + + public static CompoundTag boundingBoxToNBT(BoundingBox box) { + return boundingBoxToExistingNBT(box, new CompoundTag()); + } + + public static CompoundTag boundingBoxToExistingNBT(BoundingBox box, CompoundTag tag) { + tag.putInt("minX", box.minX()); + tag.putInt("minY", box.minY()); + tag.putInt("minZ", box.minZ()); + tag.putInt("maxX", box.maxX()); + tag.putInt("maxY", box.maxY()); + tag.putInt("maxZ", box.maxZ()); + + return tag; + } + + public static BoundingBox NBTToBoundingBox(CompoundTag nbt) { + return new BoundingBox( + nbt.getInt("minX"), + nbt.getInt("minY"), + nbt.getInt("minZ"), + nbt.getInt("maxX"), + nbt.getInt("maxY"), + nbt.getInt("maxZ") + ); + } + + public static BoundingBox clone(BoundingBox box) { + return new BoundingBox(box.minX(), box.minY(), box.minZ(), box.maxX(), box.maxY(), box.maxZ()); + } + + public static BoundingBox cloneWithAdjustments(BoundingBox box, int x1, int y1, int z1, int x2, int y2, int z2) { + return new BoundingBox(box.minX() + x1, box.minY() + y1, box.minZ() + z1, box.maxX() + x2, box.maxY() + y2, box.maxZ() + z2); + } +} diff --git a/src/main/java/twilightforest/util/Codecs.java b/src/main/java/twilightforest/util/Codecs.java new file mode 100644 index 0000000000..b253ff820c --- /dev/null +++ b/src/main/java/twilightforest/util/Codecs.java @@ -0,0 +1,57 @@ +package twilightforest.util; + +import com.mojang.datafixers.util.Pair; +import com.mojang.serialization.Codec; +import com.mojang.serialization.DataResult; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import it.unimi.dsi.fastutil.floats.Float2ObjectAVLTreeMap; +import it.unimi.dsi.fastutil.floats.Float2ObjectSortedMap; +import net.minecraft.Util; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Holder; +import net.minecraft.core.Vec3i; +import net.minecraft.resources.ResourceKey; +import net.minecraft.util.ExtraCodecs; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.biome.Climate; + +import java.util.Arrays; +import java.util.List; +import java.util.function.Function; + +public final class Codecs { + public static final Codec STRING_POS = Codec.STRING.comapFlatMap(Codecs::parseString2BlockPos, Vec3i::toShortString); + public static final Codec ONLY_HORIZONTAL = Direction.CODEC.comapFlatMap(direction -> direction.getAxis() != Direction.Axis.Y ? DataResult.success(direction) : DataResult.error(() -> "Horizontal direction only!", direction), Function.identity()); + public static final Codec FLOAT_STRING = Codec.STRING.comapFlatMap(Codecs::parseString2Float, f -> Float.toString(f)); + + public static final Codec>> CLIMATE_SYSTEM = ExtraCodecs.nonEmptyList(RecordCodecBuilder.>>create((instance) -> instance.group(Climate.ParameterPoint.CODEC.fieldOf("parameters").forGetter(Pair::getFirst), Biome.CODEC.fieldOf("biome").forGetter(Pair::getSecond)).apply(instance, Pair::of)).listOf()).xmap(Climate.ParameterList::new, Climate.ParameterList::values); + + public static Codec> floatTreeCodec(Codec elementCodec) { + return Codec + .compoundList(Codecs.FLOAT_STRING, elementCodec) + .xmap(floatEList -> floatEList.stream().collect(Float2ObjectAVLTreeMap::new, (map, pair) -> map.put(pair.getFirst(), pair.getSecond()), Float2ObjectAVLTreeMap::putAll), map -> map.entrySet().stream().map(entry -> new Pair<>(entry.getKey(), entry.getValue())).toList()); + } + + private static DataResult parseString2BlockPos(String string) { + try { + return Util.fixedSize(Arrays.stream(string.split(" *, *")).mapToInt(Integer::parseInt), 3).map(arr -> new BlockPos(arr[0], arr[1], arr[2])); + } catch (Throwable e) { + return DataResult.error(e::getMessage); + } + } + + private static DataResult parseString2Float(String string) { + try { + return DataResult.success(Float.valueOf(string)); + } catch (Throwable e) { + return DataResult.error(e::getMessage); + } + } + + public static DataResult> arrayToPair(List list) { + return Util.fixedSize(list, 2).map(l -> Pair.of(l.get(0), l.get(1))); + } + + private Codecs() {} +} diff --git a/src/main/java/twilightforest/util/ColorUtil.java b/src/main/java/twilightforest/util/ColorUtil.java new file mode 100644 index 0000000000..3b2d2f3b9a --- /dev/null +++ b/src/main/java/twilightforest/util/ColorUtil.java @@ -0,0 +1,159 @@ +package twilightforest.util; + +import com.google.common.collect.ImmutableMap; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.item.DyeColor; + +import java.util.AbstractMap; +import java.util.Map; +import java.util.Random; +import java.util.function.Function; + +public record ColorUtil(Function function) { + public static final ColorUtil WOOL = new ColorUtil(color -> switch (color) { + case WHITE -> Blocks.WHITE_WOOL; + case ORANGE -> Blocks.ORANGE_WOOL; + case MAGENTA -> Blocks.MAGENTA_WOOL; + case LIGHT_BLUE -> Blocks.LIGHT_BLUE_WOOL; + case YELLOW -> Blocks.YELLOW_WOOL; + case LIME -> Blocks.LIME_WOOL; + case PINK -> Blocks.PINK_WOOL; + case GRAY -> Blocks.GRAY_WOOL; + case LIGHT_GRAY -> Blocks.LIGHT_GRAY_WOOL; + case CYAN -> Blocks.CYAN_WOOL; + case PURPLE -> Blocks.PURPLE_WOOL; + case BLUE -> Blocks.BLUE_WOOL; + case BROWN -> Blocks.BROWN_WOOL; + case GREEN -> Blocks.GREEN_WOOL; + case RED -> Blocks.RED_WOOL; + case BLACK -> Blocks.BLACK_WOOL; + }); + + public static final ColorUtil TERRACOTTA = new ColorUtil(color -> switch (color) { + case WHITE -> Blocks.WHITE_TERRACOTTA; + case ORANGE -> Blocks.ORANGE_TERRACOTTA; + case MAGENTA -> Blocks.MAGENTA_TERRACOTTA; + case LIGHT_BLUE -> Blocks.LIGHT_BLUE_TERRACOTTA; + case YELLOW -> Blocks.YELLOW_TERRACOTTA; + case LIME -> Blocks.LIME_TERRACOTTA; + case PINK -> Blocks.PINK_TERRACOTTA; + case GRAY -> Blocks.GRAY_TERRACOTTA; + case LIGHT_GRAY -> Blocks.LIGHT_GRAY_TERRACOTTA; + case CYAN -> Blocks.CYAN_TERRACOTTA; + case PURPLE -> Blocks.PURPLE_TERRACOTTA; + case BLUE -> Blocks.BLUE_TERRACOTTA; + case BROWN -> Blocks.BROWN_TERRACOTTA; + case GREEN -> Blocks.GREEN_TERRACOTTA; + case RED -> Blocks.RED_TERRACOTTA; + case BLACK -> Blocks.BLACK_TERRACOTTA; + }); + + public static final ColorUtil STAINED_GLASS = new ColorUtil(color -> switch (color) { + case WHITE -> Blocks.WHITE_STAINED_GLASS; + case ORANGE -> Blocks.ORANGE_STAINED_GLASS; + case MAGENTA -> Blocks.MAGENTA_STAINED_GLASS; + case LIGHT_BLUE -> Blocks.LIGHT_BLUE_STAINED_GLASS; + case YELLOW -> Blocks.YELLOW_STAINED_GLASS; + case LIME -> Blocks.LIME_STAINED_GLASS; + case PINK -> Blocks.PINK_STAINED_GLASS; + case GRAY -> Blocks.GRAY_STAINED_GLASS; + case LIGHT_GRAY -> Blocks.LIGHT_GRAY_STAINED_GLASS; + case CYAN -> Blocks.CYAN_STAINED_GLASS; + case PURPLE -> Blocks.PURPLE_STAINED_GLASS; + case BLUE -> Blocks.BLUE_STAINED_GLASS; + case BROWN -> Blocks.BROWN_STAINED_GLASS; + case GREEN -> Blocks.GREEN_STAINED_GLASS; + case RED -> Blocks.RED_STAINED_GLASS; + case BLACK -> Blocks.BLACK_STAINED_GLASS; + }); + + + public BlockState getColor(DyeColor color) { + return this.function.apply(color).defaultBlockState(); + } + + public Block getRandomColor(Random rand) { + DyeColor color = DyeColor.byId(rand.nextInt(16)); + return this.getColor(color).getBlock(); + } + + public static float[] rgbToHSV(int r, int g, int b) { + float h = 0; + float s; + float rabs = r / 255.0F; + float gabs = g / 255.0F; + float babs = b / 255.0F; + float v = Math.max(rabs, Math.max(gabs, babs)); + float diff = v - Math.min(rabs, Math.min(gabs, babs)); + Function diffc = c -> (v - c) / 6 / diff + 1 / 2; + if (diff == 0) { + h = s = 0; + } else { + s = diff / v; + float rr = diffc.apply(rabs); + float gg = diffc.apply(gabs); + float bb = diffc.apply(babs); + + if (rabs == v) { + h = bb - gg; + } else if (gabs == v) { + h = (1.0F / 3.0F) + rr - bb; + } else if (babs == v) { + h = (2.0F / 3.0F) + gg - rr; + } + if (h < 0) { + h += 1; + }else if (h > 1) { + h -= 1; + } + } + return new float[]{h, s, v}; + } + + public static int hsvToRGB(float hue, float saturation, float value) { + final float normaliedHue = (hue - (float) Math.floor(hue)); + final int h = (int) (normaliedHue * 6); + final float f = normaliedHue * 6 - h; + final float p = value * (1 - saturation); + final float q = value * (1 - f * saturation); + final float t = value * (1 - (1 - f) * saturation); + + return switch (h) { + case 0 -> rgb(value, t, p); + case 1 -> rgb(q, value, p); + case 2 -> rgb(p, value, t); + case 3 -> rgb(p, q, value); + case 4 -> rgb(t, p, value); + case 5 -> rgb(value, p, q); + default -> throw new RuntimeException("Something went wrong when converting from HSV to RGB. Input was " + hue + ", " + saturation + ", " + value); + }; + } + + private static int rgb(float r, float g, float b) { + return (((int)((r * 255F) + 0.5F) & 0xFF) << 16) | (((int)((g * 255F) + 0.5F) & 0xFF) << 8) | ((int)((b * 255F) + 0.5F) & 0xFF); + } + + public static int argbToABGR(int argbColor) { + int r = (argbColor >> 16) & 0xFF; + int b = argbColor & 0xFF; + return (argbColor & 0xFF00FF00) | (b << 16) | r; + } + + //We COULD use the WOOL method at the very top of this class, but then we have to use the order of the dyecolor enum, which doesnt show the wools in the order the ram displays them. + //I personally like this order better so suck it + public static final Map WOOL_TO_DYE_IN_RAM_ORDER = ImmutableMap.ofEntries( + entryOf(DyeColor.WHITE, Blocks.WHITE_WOOL), entryOf(DyeColor.LIGHT_GRAY, Blocks.LIGHT_GRAY_WOOL), + entryOf(DyeColor.GRAY, Blocks.GRAY_WOOL), entryOf(DyeColor.BLACK, Blocks.BLACK_WOOL), + entryOf(DyeColor.RED, Blocks.RED_WOOL), entryOf(DyeColor.ORANGE, Blocks.ORANGE_WOOL), + entryOf(DyeColor.YELLOW, Blocks.YELLOW_WOOL), entryOf(DyeColor.LIME, Blocks.LIME_WOOL), + entryOf(DyeColor.GREEN, Blocks.GREEN_WOOL), entryOf(DyeColor.LIGHT_BLUE, Blocks.LIGHT_BLUE_WOOL), + entryOf(DyeColor.CYAN, Blocks.CYAN_WOOL), entryOf(DyeColor.BLUE, Blocks.BLUE_WOOL), + entryOf(DyeColor.PURPLE, Blocks.PURPLE_WOOL), entryOf(DyeColor.MAGENTA, Blocks.MAGENTA_WOOL), + entryOf(DyeColor.PINK, Blocks.PINK_WOOL), entryOf(DyeColor.BROWN, Blocks.BROWN_WOOL)); + + static Map.Entry entryOf(K key, V value) { + return new AbstractMap.SimpleImmutableEntry<>(key, value); + } +} diff --git a/src/main/java/twilightforest/util/DirectionUtil.java b/src/main/java/twilightforest/util/DirectionUtil.java new file mode 100644 index 0000000000..e19e6533e8 --- /dev/null +++ b/src/main/java/twilightforest/util/DirectionUtil.java @@ -0,0 +1,12 @@ +package twilightforest.util; + +import net.minecraft.core.Direction; + +public final class DirectionUtil { + public static Direction horizontalOrElse(Direction horizontal, Direction orElse) { + return horizontal.getAxis().isHorizontal() ? horizontal : horizontalOrElse(orElse, Direction.NORTH); + } + + private DirectionUtil() { + } +} diff --git a/src/main/java/twilightforest/util/EntityExcludedDamageSource.java b/src/main/java/twilightforest/util/EntityExcludedDamageSource.java new file mode 100644 index 0000000000..c71b9fa4d1 --- /dev/null +++ b/src/main/java/twilightforest/util/EntityExcludedDamageSource.java @@ -0,0 +1,36 @@ +package twilightforest.util; + +import net.minecraft.core.Holder; +import net.minecraft.network.chat.Component; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.damagesource.DamageType; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; + +import java.util.Arrays; +import java.util.List; + +public class EntityExcludedDamageSource extends DamageSource { + + protected final List> entities; + + public EntityExcludedDamageSource(Holder type, EntityType... entities) { + super(type); + this.entities = Arrays.stream(entities).toList(); + } + + @Override + public Component getLocalizedDeathMessage(LivingEntity living) { + LivingEntity livingentity = living.getKillCredit(); + String s = "death.attack." + this.type().msgId(); + String s1 = s + ".player"; + if (livingentity != null) { + for (EntityType entity : entities) { + if (livingentity.getType() == entity) { + return Component.translatable(s, living.getDisplayName()); + } + } + } + return livingentity != null ? Component.translatable(s1, living.getDisplayName(), livingentity.getDisplayName()) : Component.translatable(s, living.getDisplayName()); + } +} diff --git a/src/main/java/twilightforest/util/EntityUtil.java b/src/main/java/twilightforest/util/EntityUtil.java new file mode 100644 index 0000000000..ec94d0213f --- /dev/null +++ b/src/main/java/twilightforest/util/EntityUtil.java @@ -0,0 +1,267 @@ +package twilightforest.util; + +import com.google.common.collect.Lists; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceKey; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.tags.PaintingVariantTags; +import net.minecraft.util.Mth; +import net.minecraft.util.RandomSource; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.damagesource.DamageType; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.decoration.HangingEntity; +import net.minecraft.world.entity.decoration.Painting; +import net.minecraft.world.entity.decoration.PaintingVariant; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.level.ClipContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.ServerLevelAccessor; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkAccess; +import net.minecraft.world.level.chunk.ChunkStatus; +import net.minecraft.world.level.chunk.ProtoChunk; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.common.ForgeMod; +import net.minecraftforge.event.ForgeEventFactory; +import net.minecraftforge.fml.util.ObfuscationReflectionHelper; +import net.minecraftforge.registries.ForgeRegistries; +import org.jetbrains.annotations.Nullable; + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.function.DoubleUnaryOperator; + +public class EntityUtil { + + public static BlockPos bossChestLocation(Mob boss) { + return boss.getRestrictCenter() == BlockPos.ZERO ? boss.blockPosition() : boss.getRestrictCenter().below(); + } + + public static boolean canDestroyBlock(Level world, BlockPos pos, Entity entity) { + return canDestroyBlock(world, pos, world.getBlockState(pos), entity); + } + + public static boolean canDestroyBlock(Level world, BlockPos pos, BlockState state, Entity entity) { + float hardness = state.getDestroySpeed(world, pos); + return hardness >= 0f && hardness < 50f && !state.isAir() + && state.getBlock().canEntityDestroy(state, world, pos, entity) + && (/* rude type limit */!(entity instanceof LivingEntity) + || ForgeEventFactory.onEntityDestroyBlock((LivingEntity) entity, pos, state)); + } + + /** + * [VanillaCopy] Entity.pick + */ + public static BlockHitResult rayTrace(Entity entity, double range) { + Vec3 position = entity.getEyePosition(1.0F); + Vec3 look = entity.getViewVector(1.0F); + Vec3 dest = position.add(look.x * range, look.y * range, look.z * range); + return entity.level.clip(new ClipContext(position, dest, ClipContext.Block.OUTLINE, ClipContext.Fluid.NONE, entity)); + } + + public static BlockHitResult rayTrace(Player player) { + return rayTrace(player, null); + } + + public static BlockHitResult rayTrace(Player player, @Nullable DoubleUnaryOperator modifier) { + double range = player.getAttribute(ForgeMod.BLOCK_REACH.get()).getValue(); + return rayTrace(player, modifier == null ? range : modifier.applyAsDouble(range)); + } + + private static final MethodHandles.Lookup LOOKUP = MethodHandles.lookup(); + private static final Method LivingEntity_getDeathSound = ObfuscationReflectionHelper.findMethod(LivingEntity.class, "m_5592_"); + private static final MethodHandle handle_LivingEntity_getDeathSound; + private static final Method HangingEntity_setDirection = ObfuscationReflectionHelper.findMethod(HangingEntity.class, "m_6022_", Direction.class); + private static final MethodHandle handle_HangingEntity_setDirection; + + static { + MethodHandle tmp_handle_LivingEntity_getDeathSound = null; + MethodHandle tmp_handle_HangingEntity_setDirection = null; + + try { + tmp_handle_LivingEntity_getDeathSound = LOOKUP.unreflect(LivingEntity_getDeathSound); + tmp_handle_HangingEntity_setDirection = LOOKUP.unreflect(HangingEntity_setDirection); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + handle_LivingEntity_getDeathSound = tmp_handle_LivingEntity_getDeathSound; + handle_HangingEntity_setDirection = tmp_handle_HangingEntity_setDirection; + } + + @Nullable + public static SoundEvent getDeathSound(LivingEntity living) { + SoundEvent sound = null; + if (handle_LivingEntity_getDeathSound != null) { + try { + sound = (SoundEvent) handle_LivingEntity_getDeathSound.invokeExact(living); + } catch (Throwable e) { + // FAIL SILENTLY + } + } + return sound; + } + + public static void killLavaAround(Entity entity) { + AABB bounds = entity.getBoundingBox().inflate(9D); + for (double x = bounds.minX; x < bounds.maxX; x++) { + for (double z = bounds.minZ; z < bounds.maxZ; z++) { + for (double y = bounds.minY; y < bounds.maxY; y++) { + BlockPos pos = BlockPos.containing(x, y, z); + BlockState state = entity.getLevel().getBlockState(pos); + if (state.is(Blocks.LAVA)) { + entity.getLevel().setBlockAndUpdate(pos, Blocks.AIR.defaultBlockState()); + } + } + } + } + } + + //copy of Mob.doHurtTarget, allows for using a custom DamageSource instead of the generic Mob Attack one + public static boolean properlyApplyCustomDamageSource(Mob entity, Entity victim, DamageSource source) { + float f = (float)entity.getAttributeValue(Attributes.ATTACK_DAMAGE); + float f1 = (float)entity.getAttributeValue(Attributes.ATTACK_KNOCKBACK); + if (victim instanceof LivingEntity) { + f += EnchantmentHelper.getDamageBonus(entity.getMainHandItem(), ((LivingEntity)victim).getMobType()); + f1 += (float)EnchantmentHelper.getKnockbackBonus(entity); + } + + int i = EnchantmentHelper.getFireAspect(entity); + if (i > 0) { + victim.setSecondsOnFire(i * 4); + } + + boolean flag = victim.hurt(source, f); + if (flag) { + if (f1 > 0.0F && victim instanceof LivingEntity) { + ((LivingEntity)victim).knockback(f1 * 0.5F, Mth.sin(entity.getYRot() * ((float)Math.PI / 180F)), -Mth.cos(entity.getYRot() * ((float)Math.PI / 180F))); + entity.setDeltaMovement(entity.getDeltaMovement().multiply(0.6D, 1.0D, 0.6D)); + } + + if (victim instanceof Player player) { + entity.maybeDisableShield(player, entity.getMainHandItem(), player.isUsingItem() ? player.getUseItem() : ItemStack.EMPTY); + } + + entity.doEnchantDamageEffects(entity, victim); + entity.setLastHurtMob(victim); + } + + return flag; + } + + // [VanillaCopy] with modifications: StructureTemplate.createEntityIgnoreException + @Nullable + private static T createEntityIgnoreException(EntityType type, ServerLevelAccessor levelAccessor) { + try { + return type.create(levelAccessor.getLevel()); + } catch (Exception exception) { + return null; + } + } + + public static void tryHangPainting(WorldGenLevel world, BlockPos pos, Direction direction, @Nullable ResourceKey chosenPainting) { + if (chosenPainting == null) return; + + Painting painting = createEntityIgnoreException(EntityType.PAINTING, world); + + painting.setPos(pos.getX(), pos.getY(), pos.getZ()); + try { + handle_HangingEntity_setDirection.invoke(painting, direction); + } catch (Throwable throwable) { + throwable.printStackTrace(); + } + painting.setVariant(ForgeRegistries.PAINTING_VARIANTS.getHolder(chosenPainting).get()); + + if (checkValidPaintingPosition(world, painting)) + world.addFreshEntity(painting); + } + @Nullable + public static ResourceKey getPaintingOfSize(RandomSource rand, int minSize) { + return getPaintingOfSize(rand, minSize, minSize, false); + } + + @Nullable + public static ResourceKey getPaintingOfSize(RandomSource rand, int width, int height, boolean exactMeasurements) { + List> valid = new ArrayList<>(); + + for (PaintingVariant art : ForgeRegistries.PAINTING_VARIANTS.tags().getTag(PaintingVariantTags.PLACEABLE)) { + if (exactMeasurements) { + if (art.getWidth() == width && art.getHeight() == height) { + valid.add(ResourceKey.create(Registries.PAINTING_VARIANT, Objects.requireNonNull(ForgeRegistries.PAINTING_VARIANTS.getKey(art)))); + } + } else { + if (art.getWidth() >= width || art.getHeight() >= height) { + valid.add(ResourceKey.create(Registries.PAINTING_VARIANT, Objects.requireNonNull(ForgeRegistries.PAINTING_VARIANTS.getKey(art)))); + } + } + } + + if (valid.size() > 0) { + return valid.get(rand.nextInt(valid.size())); + } else { + return null; + } + } + + public static boolean checkValidPaintingPosition(WorldGenLevel world, @Nullable Painting painting) { + if (painting == null) { + return false; + } + + final AABB largerBox = painting.getBoundingBox(); + + if (!world.noCollision(painting, largerBox)) { + return false; + } else { + List collidingEntities = getEntitiesInAABB(world, largerBox); + + for (Entity entityOnList : collidingEntities) { + if (entityOnList instanceof HangingEntity) { + return false; + } + } + + return true; + } + } + + public static List getEntitiesInAABB(WorldGenLevel world, AABB boundingBox) { + List list = Lists.newArrayList(); + int i = Mth.floor((boundingBox.minX - 2) / 16.0D); + int j = Mth.floor((boundingBox.maxX + 2) / 16.0D); + int k = Mth.floor((boundingBox.minZ - 2) / 16.0D); + int l = Mth.floor((boundingBox.maxZ + 2) / 16.0D); + + for (int i1 = i; i1 <= j; ++i1) { + for (int j1 = k; j1 <= l; ++j1) { + ChunkAccess chunk = world.getChunk(i1, j1, ChunkStatus.STRUCTURE_STARTS); + if (chunk instanceof ProtoChunk proto) { + proto.getEntities().forEach(nbt -> { + Entity entity = EntityType.loadEntityRecursive(nbt, world.getLevel(), e -> e); + if (entity != null && boundingBox.intersects(entity.getBoundingBox())) { + list.add(entity); + } + }); + } + } + } + + return list; + } +} diff --git a/src/main/java/twilightforest/util/FeatureLogic.java b/src/main/java/twilightforest/util/FeatureLogic.java new file mode 100644 index 0000000000..348b3c2172 --- /dev/null +++ b/src/main/java/twilightforest/util/FeatureLogic.java @@ -0,0 +1,76 @@ +package twilightforest.util; + +import net.minecraft.core.BlockPos; +import net.minecraft.tags.BlockTags; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.LevelSimulatedReader; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import twilightforest.data.tags.BlockTagGenerator; + +import java.util.Random; +import java.util.function.Predicate; + +/** + * Feature Utility methods that don't invoke placement. For placement see FeaturePlacers + */ +public final class FeatureLogic { + public static final Predicate IS_REPLACEABLE_AIR = state -> state.getMaterial().isReplaceable() || state.isAir(); + public static final Predicate ROOT_SHOULD_SKIP = state -> state.is(BlockTagGenerator.ROOT_TRACE_SKIP); + public static boolean hasEmptyHorizontalNeighbor(LevelSimulatedReader worldReader, BlockPos pos) { + return worldReader.isStateAtPosition(pos.north(), IS_REPLACEABLE_AIR) + || worldReader.isStateAtPosition(pos.south(), IS_REPLACEABLE_AIR) + || worldReader.isStateAtPosition(pos.west(), IS_REPLACEABLE_AIR) + || worldReader.isStateAtPosition(pos.east(), IS_REPLACEABLE_AIR); + } + + // Slight stretch of logic: We check if the block is completely surrounded by air. + // If it's not completely surrounded by air, then there's a solid + public static boolean hasSolidNeighbor(LevelSimulatedReader worldReader, BlockPos pos) { + return !(worldReader.isStateAtPosition(pos.below(), IS_REPLACEABLE_AIR) + && worldReader.isStateAtPosition(pos.north(), IS_REPLACEABLE_AIR) + && worldReader.isStateAtPosition(pos.south(), IS_REPLACEABLE_AIR) + && worldReader.isStateAtPosition(pos.west(), IS_REPLACEABLE_AIR) + && worldReader.isStateAtPosition(pos.east(), IS_REPLACEABLE_AIR) + && worldReader.isStateAtPosition(pos.above(), IS_REPLACEABLE_AIR)); + } + + public static boolean canRootGrowIn(LevelSimulatedReader worldReader, BlockPos pos) { + if (worldReader.isStateAtPosition(pos, IS_REPLACEABLE_AIR)) { + // roots can grow through air if they are near a solid block + return hasSolidNeighbor(worldReader, pos); + } else { + return worldReader.isStateAtPosition(pos, FeatureLogic::worldGenReplaceable); + } + } + + public static boolean worldGenReplaceable(BlockState state) { + return (state.getMaterial().isReplaceable() || state.is(BlockTagGenerator.WORLDGEN_REPLACEABLES)) && !state.is(BlockTags.FEATURES_CANNOT_REPLACE); + } + + /** + * Moves distance along the vector. + *

+ * This goofy function takes a float between 0 and 1 for the angle, where 0 is 0 degrees, .5 is 180 degrees and 1 and 360 degrees. + * For the tilt, it takes a float between 0 and 1 where 0 is straight up, 0.5 is straight out and 1 is straight down. + */ + public static BlockPos translate(BlockPos pos, double distance, double angle, double tilt) { + double rangle = angle * 2.0D * Math.PI; + double rtilt = tilt * Math.PI; + + //TODO verify if casting to int is the right play here + return pos.offset( + (int) Math.round(Math.sin(rangle) * Math.sin(rtilt) * distance), + (int) Math.round(Math.cos(rtilt) * distance), + (int) Math.round(Math.cos(rangle) * Math.sin(rtilt) * distance) + ); + } + + /** + * Gets either cobblestone or mossy cobblestone, randomly. Used for ruins. + */ + @Deprecated // Determine if we can actually remove this one and delegate to StructureProcessor + public static BlockState randStone(RandomSource rand, int howMuch) { + return rand.nextInt(howMuch) >= 1 ? Blocks.COBBLESTONE.defaultBlockState() : Blocks.MOSSY_COBBLESTONE.defaultBlockState(); + } +} diff --git a/src/main/java/twilightforest/util/FeaturePlacers.java b/src/main/java/twilightforest/util/FeaturePlacers.java new file mode 100644 index 0000000000..ff2e614e0a --- /dev/null +++ b/src/main/java/twilightforest/util/FeaturePlacers.java @@ -0,0 +1,311 @@ +package twilightforest.util; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.util.RandomSource; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.MobSpawnType; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.LevelSimulatedReader; +import net.minecraft.world.level.ServerLevelAccessor; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.DirectionalBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.Property; +import net.minecraft.world.level.levelgen.feature.TreeFeature; +import net.minecraft.world.level.levelgen.feature.foliageplacers.FoliagePlacer; +import net.minecraft.world.level.levelgen.feature.stateproviders.BlockStateProvider; +import net.minecraftforge.event.ForgeEventFactory; +import twilightforest.init.TFBlocks; + +import java.util.function.BiConsumer; +import java.util.function.BiFunction; + +/** + * Feature Utility methods that invoke placement. For non-placement see FeatureLogic + */ +public final class FeaturePlacers { + public static final BiFunction VALID_TREE_POS = TreeFeature::validTreePos; + + public static void placeEntity(EntityType entityType, BlockPos pos, ServerLevelAccessor levelAccessor) { + Mob mob = entityType.create(levelAccessor.getLevel()); + + if (mob == null) return; + + mob.setPersistenceRequired(); + mob.moveTo(pos, 0.0F, 0.0F); + ForgeEventFactory.onFinalizeSpawn(mob, levelAccessor, levelAccessor.getCurrentDifficultyAt(pos), MobSpawnType.STRUCTURE, null ,null); + levelAccessor.addFreshEntityWithPassengers(mob); + levelAccessor.setBlock(pos, Blocks.AIR.defaultBlockState(), 2); + } + + /** + * Draws a line from {x1, y1, z1} to {x2, y2, z2} + * This takes all variables for setting Branch + */ + public static void drawBresenhamBranch(LevelAccessor world, BiConsumer trunkPlacer, RandomSource random, BlockPos start, BlockPos end, BlockStateProvider config) { + for (BlockPos pixel : new VoxelBresenhamIterator(start, end)) { + placeIfValidTreePos(world, trunkPlacer, random, pixel, config); + } + } + + /** + * Build a root, but don't let it stick out too far into thin air because that's weird + */ + public static void buildRoot(LevelAccessor world, BiConsumer placer, RandomSource rand, BlockPos start, double offset, int b, BlockStateProvider config) { + BlockPos dest = FeatureLogic.translate(start.below(b + 2), 5, 0.3 * b + offset, 0.8); + + // go through block by block and stop drawing when we head too far into open air + for (BlockPos coord : new VoxelBresenhamIterator(start.below(), dest)) { + if (!placeIfValidRootPos(world, placer, rand, coord, config)) return; + } + } + + /** + * Draws a line from {x1, y1, z1} to {x2, y2, z2} + * This just takes a BlockState, used to set Trunk + */ + public static void drawBresenhamTree(LevelSimulatedReader world, BiConsumer placer, BiFunction predicate, BlockPos from, BlockPos to, BlockStateProvider config, RandomSource random) { + for (BlockPos pixel : new VoxelBresenhamIterator(from, to)) { + placeProvidedBlock(world, placer, predicate, pixel, config, random); + } + } + + public static void placeProvidedBlock(LevelSimulatedReader world, BiConsumer worldPlacer, BiFunction predicate, BlockPos pos, BlockStateProvider config, RandomSource random) { + if (predicate.apply(world, pos)) worldPlacer.accept(pos, config.getState(random, pos)); + } + + public static void placeLeaf(LevelSimulatedReader world, FoliagePlacer.FoliageSetter setter, BiFunction predicate, BlockPos pos, BlockStateProvider config, RandomSource random) { + if (predicate.apply(world, pos)) setter.set(pos, config.getState(random, pos)); + } + + // Use for trunks with Odd-count widths + public static void placeCircleOdd(LevelSimulatedReader world, BiConsumer placer, BiFunction predicate, RandomSource random, BlockPos centerPos, float radius, BlockStateProvider config) { + // Normally, I'd use mutable pos here but there are multiple bits of logic down the line that force + // the pos to be immutable causing multiple same BlockPos instances to exist. + float radiusSquared = radius * radius; + FeaturePlacers.placeProvidedBlock(world, placer, predicate, centerPos, config, random); + + // trace out a quadrant + for (int x = 0; x <= radius; x++) { + for (int z = 1; z <= radius; z++) { + // if we're inside the blob, fill it + if (x * x + z * z <= radiusSquared) { + // do four at a time for easiness! + FeaturePlacers.placeProvidedBlock(world, placer, predicate, centerPos.offset( x, 0, z), config, random); + FeaturePlacers.placeProvidedBlock(world, placer, predicate, centerPos.offset( -x, 0, -z), config, random); + FeaturePlacers.placeProvidedBlock(world, placer, predicate, centerPos.offset( -z, 0, x), config, random); + FeaturePlacers.placeProvidedBlock(world, placer, predicate, centerPos.offset( z, 0, -x), config, random); + // Confused how this circle pixel-filling algorithm works exactly? https://www.desmos.com/calculator/psqynhk21k + } + } + } + } + + // Use for trunks with Even-count widths + public static void placeCircleEven(LevelSimulatedReader world, BiConsumer placer, BiFunction predicate, RandomSource random, BlockPos centerPos, float radius, BlockStateProvider config) { + // Normally, I'd use mutable pos here but there are multiple bits of logic down the line that force + // the pos to be immutable causing multiple same BlockPos instances to exist. + float radiusSquared = radius * radius; + FeaturePlacers.placeProvidedBlock(world, placer, predicate, centerPos, config, random); + + // trace out a quadrant + for (int x = 0; x <= radius; x++) { + for (int z = 0; z <= radius; z++) { + // if we're inside the blob, fill it + if (x * x + z * z <= radiusSquared) { + // do four at a time for easiness! + FeaturePlacers.placeProvidedBlock(world, placer, predicate, centerPos.offset( 1+x, 0, 1+z), config, random); + FeaturePlacers.placeProvidedBlock(world, placer, predicate, centerPos.offset( -x, 0, -z), config, random); + FeaturePlacers.placeProvidedBlock(world, placer, predicate, centerPos.offset( -x, 0, 1+z), config, random); + FeaturePlacers.placeProvidedBlock(world, placer, predicate, centerPos.offset( 1+x, 0, -z), config, random); + // Confused how this circle pixel-filling algorithm works exactly? https://www.desmos.com/calculator/psqynhk21k + } + } + } + } + + public static void placeSpheroid(LevelSimulatedReader world, FoliagePlacer.FoliageSetter setter, BiFunction predicate, RandomSource random, BlockPos centerPos, float xzRadius, float yRadius, float verticalBias, BlockStateProvider config) { + float xzRadiusSquared = xzRadius * xzRadius; + float yRadiusSquared = yRadius * yRadius; + float superRadiusSquared = xzRadiusSquared * yRadiusSquared; + FeaturePlacers.placeLeaf(world, setter, predicate, centerPos, config, random); + + for (int y = 0; y <= yRadius; y++) { + if (y > yRadius) continue; + + FeaturePlacers.placeLeaf(world, setter, predicate, centerPos.offset( 0, y, 0), config, random); + FeaturePlacers.placeLeaf(world, setter, predicate, centerPos.offset( 0, -y, 0), config, random); + } + + for (int x = 0; x <= xzRadius; x++) { + for (int z = 1; z <= xzRadius; z++) { + if (x * x + z * z > xzRadiusSquared) continue; + + FeaturePlacers.placeLeaf(world, setter, predicate, centerPos.offset( x, 0, z), config, random); + FeaturePlacers.placeLeaf(world, setter, predicate, centerPos.offset( -x, 0, -z), config, random); + FeaturePlacers.placeLeaf(world, setter, predicate, centerPos.offset( -z, 0, x), config, random); + FeaturePlacers.placeLeaf(world, setter, predicate, centerPos.offset( z, 0, -x), config, random); + + for (int y = 1; y <= yRadius; y++) { + float xzSquare = ((x * x + z * z) * yRadiusSquared); + + if (xzSquare + (((y - verticalBias) * (y - verticalBias)) * xzRadiusSquared) <= superRadiusSquared) { + FeaturePlacers.placeLeaf(world, setter, predicate, centerPos.offset( x, y, z), config, random); + FeaturePlacers.placeLeaf(world, setter, predicate, centerPos.offset( -x, y, -z), config, random); + FeaturePlacers.placeLeaf(world, setter, predicate, centerPos.offset( -z, y, x), config, random); + FeaturePlacers.placeLeaf(world, setter, predicate, centerPos.offset( z, y, -x), config, random); + } + + if (xzSquare + (((y + verticalBias) * (y + verticalBias)) * xzRadiusSquared) <= superRadiusSquared) { + FeaturePlacers.placeLeaf(world, setter, predicate, centerPos.offset( x, -y, z), config, random); + FeaturePlacers.placeLeaf(world, setter, predicate, centerPos.offset( -x, -y, -z), config, random); + FeaturePlacers.placeLeaf(world, setter, predicate, centerPos.offset( -z, -y, x), config, random); + FeaturePlacers.placeLeaf(world, setter, predicate, centerPos.offset( z, -y, -x), config, random); + } + } + } + } + } + + // Version without the `verticalBias` unlike above + public static void placeSpheroid(LevelSimulatedReader world, BiConsumer placer, BiFunction predicate, RandomSource random, BlockPos centerPos, float xzRadius, float yRadius, BlockStateProvider config) { + float xzRadiusSquared = xzRadius * xzRadius; + float yRadiusSquared = yRadius * yRadius; + float superRadiusSquared = xzRadiusSquared * yRadiusSquared; + FeaturePlacers.placeProvidedBlock(world, placer, predicate, centerPos, config, random); + + for (int y = 0; y <= yRadius; y++) { + if (y > yRadius) continue; + + FeaturePlacers.placeProvidedBlock(world, placer, predicate, centerPos.offset( 0, y, 0), config, random); + FeaturePlacers.placeProvidedBlock(world, placer, predicate, centerPos.offset( 0, -y, 0), config, random); + } + + for (int x = 0; x <= xzRadius; x++) { + for (int z = 1; z <= xzRadius; z++) { + if (x * x + z * z > xzRadiusSquared) continue; + + FeaturePlacers.placeProvidedBlock(world, placer, predicate, centerPos.offset( x, 0, z), config, random); + FeaturePlacers.placeProvidedBlock(world, placer, predicate, centerPos.offset( -x, 0, -z), config, random); + FeaturePlacers.placeProvidedBlock(world, placer, predicate, centerPos.offset( -z, 0, x), config, random); + FeaturePlacers.placeProvidedBlock(world, placer, predicate, centerPos.offset( z, 0, -x), config, random); + + for (int y = 1; y <= yRadius; y++) { + float xzSquare = ((x * x + z * z) * yRadiusSquared); + + if (xzSquare + (y * y) * xzRadiusSquared <= superRadiusSquared) { + FeaturePlacers.placeProvidedBlock(world, placer, predicate, centerPos.offset( x, y, z), config, random); + FeaturePlacers.placeProvidedBlock(world, placer, predicate, centerPos.offset( -x, y, -z), config, random); + FeaturePlacers.placeProvidedBlock(world, placer, predicate, centerPos.offset( -z, y, x), config, random); + FeaturePlacers.placeProvidedBlock(world, placer, predicate, centerPos.offset( z, y, -x), config, random); + + FeaturePlacers.placeProvidedBlock(world, placer, predicate, centerPos.offset( x, -y, z), config, random); + FeaturePlacers.placeProvidedBlock(world, placer, predicate, centerPos.offset( -x, -y, -z), config, random); + FeaturePlacers.placeProvidedBlock(world, placer, predicate, centerPos.offset( -z, -y, x), config, random); + FeaturePlacers.placeProvidedBlock(world, placer, predicate, centerPos.offset( z, -y, -x), config, random); + } + } + } + } + } + + // [VanillaCopy] TrunkPlacer.placeLog - Swapped TreeConfiguration for BlockStateProvider + // If possible, use TrunkPlacer.placeLog instead + public static boolean placeIfValidTreePos(LevelSimulatedReader world, BiConsumer placer, RandomSource random, BlockPos pos, BlockStateProvider config) { + if (TreeFeature.validTreePos(world, pos)) { + placer.accept(pos, config.getState(random, pos)); + return true; + } else { + return false; + } + } + + public static boolean placeIfValidRootPos(LevelSimulatedReader world, BiConsumer placer, RandomSource random, BlockPos pos, BlockStateProvider config) { + if (FeatureLogic.canRootGrowIn(world, pos)) { + placer.accept(pos, config.getState(random, pos)); + return true; + } else { + return false; + } + } + + /** + * Add a firefly at the specified height and angle. + * + * @param height how far up the tree + * @param angle from 0 - 1 rotation around the tree + */ + public static void addFirefly(LevelAccessor world, BlockPos pos, int height, double angle) { + int iAngle = (int) (angle * 4.0); + if (iAngle == 0) { + setIfEmpty(world, pos.offset( 1, height, 0), TFBlocks.FIREFLY.get().defaultBlockState().setValue(DirectionalBlock.FACING, Direction.EAST)); + } else if (iAngle == 1) { + setIfEmpty(world, pos.offset(-1, height, 0), TFBlocks.FIREFLY.get().defaultBlockState().setValue(DirectionalBlock.FACING, Direction.WEST)); + } else if (iAngle == 2) { + setIfEmpty(world, pos.offset( 0, height, 1), TFBlocks.FIREFLY.get().defaultBlockState().setValue(DirectionalBlock.FACING, Direction.SOUTH)); + } else if (iAngle == 3) { + setIfEmpty(world, pos.offset( 0, height, -1), TFBlocks.FIREFLY.get().defaultBlockState().setValue(DirectionalBlock.FACING, Direction.NORTH)); + } + } + + private static void setIfEmpty(LevelAccessor world, BlockPos pos, BlockState state) { + if (world.isEmptyBlock(pos)) { + world.setBlock(pos, state,3); + } + } + + public static BlockState transferAllStateKeys(BlockState stateIn, Block blockOut) { + return transferAllStateKeys(stateIn, blockOut.defaultBlockState()); + } + + public static BlockState transferAllStateKeys(BlockState stateIn, BlockState stateOut) { + for (Property property : stateOut.getProperties()) { + stateOut = transferStateKey(stateIn, stateOut, property); + } + return stateOut; + } + + public static > BlockState transferStateKey(BlockState stateIn, BlockState stateOut, Property property) { + if(!stateIn.hasProperty(property) || !stateOut.hasProperty(property)) return stateOut; + return stateOut.setValue(property, stateIn.getValue(property)); + } + + public static void traceRoot(LevelSimulatedReader worldReader, BiConsumer worldPlacer, RandomSource random, BlockStateProvider dirtRoot, Iterable posTracer) { + // Trace block positions and stop tracing too far into open air + for (BlockPos rootPos : posTracer) { + if (worldReader.isStateAtPosition(rootPos, FeatureLogic.ROOT_SHOULD_SKIP)) + continue; // Ignore pos if this block should be checked (root, or one of the protected block IDs) + + // If the block/position cannot be replaced or is detached from ground-mass, stop + if (!FeaturePlacers.placeIfValidRootPos(worldReader, worldPlacer, random, rootPos, dirtRoot)) + return; + } + } + + public static void traceExposedRoot(LevelSimulatedReader worldReader, BiConsumer worldPlacer, RandomSource random, BlockStateProvider exposedRoot, BlockStateProvider dirtRoot, Iterable posTracer) { + // Trace block positions and alternate the root tracing once "underground" + for (BlockPos exposedPos : posTracer) { + if (worldReader.isStateAtPosition(exposedPos, FeatureLogic.ROOT_SHOULD_SKIP)) + continue; + + // Is the position considered underground? + if (!FeatureLogic.hasEmptyHorizontalNeighbor(worldReader, exposedPos)) { + // Retry placement at position as underground root. If successful, continue the tracing as regular root + if (FeaturePlacers.placeIfValidRootPos(worldReader, worldPlacer, random, exposedPos, dirtRoot)) + traceRoot(worldReader, worldPlacer, random, dirtRoot, posTracer); + // Now the outer loop can end. Goodbye! + return; + } else { // Not underground + // Check if the position is not replaceable + if (!worldReader.isStateAtPosition(exposedPos, FeatureLogic::worldGenReplaceable)) + return; // Root must stop + + // Good to go! + worldPlacer.accept(exposedPos, exposedRoot.getState(random, exposedPos)); + } + } + } +} diff --git a/src/main/java/twilightforest/util/FeatureUtil.java b/src/main/java/twilightforest/util/FeatureUtil.java new file mode 100644 index 0000000000..a5a5aa3b09 --- /dev/null +++ b/src/main/java/twilightforest/util/FeatureUtil.java @@ -0,0 +1,119 @@ +package twilightforest.util; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Material; + +// TODO Split into FeatureLogic and FeaturePlacers +@Deprecated +public final class FeatureUtil { + + public static boolean isAreaSuitable(WorldGenLevel world, BlockPos pos, int width, int height, int depth) { + return isAreaSuitable(world, pos, width, height, depth, false); + } + /** + * Checks an area to see if it consists of flat natural ground below and air above + */ + public static boolean isAreaSuitable(WorldGenLevel world, BlockPos pos, int width, int height, int depth, boolean underwaterAllowed) { + boolean flag = true; + + // check if there's anything within the diameter + for (int cx = 0; cx < width; cx++) { + for (int cz = 0; cz < depth; cz++) { + BlockPos pos_ = pos.offset(cx, 0, cz); + // check if the blocks even exist? + if (world.hasChunkAt(pos_)) { + // is there grass, dirt or stone below? + Material m = world.getBlockState(pos_.below()).getMaterial(); + if (m != Material.DIRT && m != Material.GRASS && m != Material.STONE && m != Material.SNOW && m != Material.SAND) { + if(underwaterAllowed && m == Material.WATER) { + continue; + } + flag = false; + } + + for (int cy = 0; cy < height; cy++) { + // blank space above? + if (!world.isEmptyBlock(pos_.above(cy)) && !world.getBlockState(pos_.above(cy)).getMaterial().isReplaceable()) { + if(underwaterAllowed && world.getBlockState(pos_.above(cy)).getMaterial() == Material.WATER) { + continue; + } + flag = false; + } + } + } else { + flag = false; + } + } + } + + // Okie dokie + return flag; + } + + /** + * Draw a giant blob of whatevs. + */ + public static void drawBlob(LevelAccessor world, BlockPos pos, int rad, BlockState state) { + // then trace out a quadrant + for (byte dx = 0; dx <= rad; dx++) { + for (byte dy = 0; dy <= rad; dy++) { + for (byte dz = 0; dz <= rad; dz++) { + // determine how far we are from the center. + int dist; + if (dx >= dy && dx >= dz) { + dist = dx + (Math.max(dy, dz) >> 1) + (Math.min(dy, dz) >> 2); + } else if (dy >= dx && dy >= dz) { + dist = dy + (Math.max(dx, dz) >> 1) + (Math.min(dx, dz) >> 2); + } else { + dist = dz + (Math.max(dx, dy) >> 1) + (Math.min(dx, dy) >> 2); + } + + + // if we're inside the blob, fill it + if (dist <= rad) { + // do eight at a time for easiness! + world.setBlock(pos.offset(+dx, +dy, +dz), state, 3); + world.setBlock(pos.offset(+dx, +dy, -dz), state, 3); + world.setBlock(pos.offset(-dx, +dy, +dz), state, 3); + world.setBlock(pos.offset(-dx, +dy, -dz), state, 3); + world.setBlock(pos.offset(+dx, -dy, +dz), state, 3); + world.setBlock(pos.offset(+dx, -dy, -dz), state, 3); + world.setBlock(pos.offset(-dx, -dy, +dz), state, 3); + world.setBlock(pos.offset(-dx, -dy, -dz), state, 3); + } + } + } + } + } + + /** + * Does the block have at least 1 air block adjacent + */ + private static final Direction[] directionsExceptDown = new Direction[]{Direction.UP, Direction.NORTH, Direction.SOUTH, Direction.WEST, Direction.EAST}; + + public static boolean hasAirAround(LevelAccessor world, BlockPos pos) { + for (Direction e : directionsExceptDown) { + if (world.isEmptyBlock(pos.relative(e))) { + return true; + } + } + + return false; + } + + public static boolean isNearSolid(LevelReader world, BlockPos pos) { + for (Direction e : Direction.values()) { + if (world.hasChunkAt(pos.relative(e)) + && world.getBlockState(pos.relative(e)).getMaterial().isSolid()) { + return true; + } + } + + return false; + } +} diff --git a/src/main/java/twilightforest/util/HugeMushroomUtil.java b/src/main/java/twilightforest/util/HugeMushroomUtil.java new file mode 100644 index 0000000000..06a6779a23 --- /dev/null +++ b/src/main/java/twilightforest/util/HugeMushroomUtil.java @@ -0,0 +1,47 @@ +package twilightforest.util; + +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.HugeMushroomBlock; + +/** + * Utility class for Huge Mushroom blocks. Contains presets + */ +public class HugeMushroomUtil { + public static BlockState getState(HugeMushroomType type, BlockState base) { + return base + .setValue(HugeMushroomBlock.UP, type.top) + .setValue(HugeMushroomBlock.DOWN, type.bottom) + .setValue(HugeMushroomBlock.NORTH, type.north) + .setValue(HugeMushroomBlock.SOUTH, type.south) + .setValue(HugeMushroomBlock.EAST, type.east) + .setValue(HugeMushroomBlock.WEST, type.west); + } + + public enum HugeMushroomType { + CENTER(true, false, false, false, false, false), + NORTH(true, false, true, false, false, false), + SOUTH(true, false, false, true, false, false), + EAST(true, false, false, false, true, false), + WEST(true, false, false, false, false, true), + NORTH_WEST(true, false, true, false, false, true), + NORTH_EAST(true, false, true, false, true, false), + SOUTH_WEST(true, false, false, true, false, true), + SOUTH_EAST(true, false, false, true, true, false); + + private final boolean top; + private final boolean bottom; + private final boolean north; + private final boolean south; + private final boolean east; + private final boolean west; + + HugeMushroomType(boolean t, boolean b, boolean n, boolean s, boolean e, boolean w) { + this.top = t; + this.bottom = b; + this.north = n; + this.south = s; + this.east = e; + this.west = w; + } + } +} diff --git a/src/main/java/twilightforest/util/LandmarkUtil.java b/src/main/java/twilightforest/util/LandmarkUtil.java new file mode 100644 index 0000000000..71133ea7ef --- /dev/null +++ b/src/main/java/twilightforest/util/LandmarkUtil.java @@ -0,0 +1,118 @@ +package twilightforest.util; + +import net.minecraft.core.*; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceKey; +import net.minecraft.tags.TagKey; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.chunk.ChunkAccess; +import net.minecraft.world.level.chunk.ChunkStatus; +import net.minecraft.world.level.levelgen.structure.Structure; +import net.minecraft.world.level.levelgen.structure.StructureStart; +import org.jetbrains.annotations.Nullable; +import twilightforest.TwilightForestMod; +import twilightforest.data.tags.StructureTagGenerator; +import twilightforest.entity.EnforcedHomePoint; +import twilightforest.world.components.structures.start.TFStructureStart; + +import java.util.Map; +import java.util.Optional; +import java.util.Set; +import java.util.function.Predicate; +import java.util.stream.Collectors; + +@SuppressWarnings("OptionalIsPresent") +public final class LandmarkUtil { + public static Optional locateNearestLandmarkStart(LevelAccessor level, int chunkX, int chunkZ) { + return locateNearestMatchingLandmark(level, StructureTagGenerator.LANDMARK, chunkX, chunkZ); + } + + public static Optional locateNearestMatchingLandmark(LevelAccessor level, TagKey matching, int chunkX, int chunkZ) { + var structureRegistry = level.registryAccess().registry(Registries.STRUCTURE); + if (structureRegistry.isEmpty()) return Optional.empty(); + var holders = structureRegistry.get().getTag(matching); + if (holders.isEmpty()) return Optional.empty(); + + return locateNearestMatchingLandmark(level, holders.get(), chunkX, chunkZ); + } + + public static Optional locateNearestMatchingLandmark(LevelAccessor level, HolderSet matching, int chunkX, int chunkZ) { + Set structures = matching.stream().map(Holder::get).collect(Collectors.toSet()); + return locateNearestMatchingLandmark(level, structures::contains, chunkX, chunkZ); + } + + public static Optional locateNearestMatchingLandmark(LevelAccessor level, Predicate filter, int chunkX, int chunkZ) { + BlockPos nearestFeature = LegacyLandmarkPlacements.getNearestCenterXZ(chunkX, chunkZ); + int centerX = SectionPos.blockToSectionCoord(nearestFeature.getX()); + int centerZ = SectionPos.blockToSectionCoord(nearestFeature.getZ()); + + if (!level.hasChunk(centerX, centerZ)) return Optional.empty(); + + ChunkAccess chunkAccess = level.getChunk(centerX, centerZ, ChunkStatus.STRUCTURE_STARTS); + + for (Map.Entry structureEntry : chunkAccess.getAllStarts().entrySet()) + if (filter.test(structureEntry.getKey())) + return Optional.of(structureEntry.getValue()); + + return Optional.empty(); + } + + public static void markStructureConquered(LevelAccessor level, EnforcedHomePoint mobHome, ResourceKey structureKey, boolean conquered) { + // FIXME If a boss travels to a different level, this won't take effect. Add Home dimension to EnforcedHomePoint? + markStructureConquered(level, mobHome.getRestrictionCenter(), structureKey, conquered); + } + + public static void markStructureConquered(LevelAccessor level, BlockPos pos, ResourceKey structureKey, boolean conquered) { + Optional nearStart = locateNearestLandmarkStart(level, structureKey, pos); + + if (nearStart.isEmpty() || !(nearStart.get() instanceof TFStructureStart twilightStart)) return; + + twilightStart.setConquered(conquered, level); + } + + @Nullable + public static Structure structureForKey(LevelReader level, ResourceKey structureKey) { + Optional> registry = level.registryAccess().registry(Registries.STRUCTURE); + + return registry.isPresent() ? registry.get().get(structureKey) : null; + } + + public static Optional locateNearestLandmarkStart(LevelAccessor level, ResourceKey structureKey, BlockPos pos) { + return locateNearestLandmarkStart(level, structureKey, SectionPos.blockToSectionCoord(pos.getX()), SectionPos.blockToSectionCoord(pos.getZ())); + } + + public static Optional locateNearestLandmarkStart(LevelAccessor level, ResourceKey structureKey, int chunkX, int chunkZ) { + Structure structure = structureForKey(level, structureKey); + + if (structure == null) return Optional.empty(); + + return locateNearestLandmarkStart(level, structure, chunkX, chunkZ); + } + + public static Optional locateNearestLandmarkStart(LevelAccessor level, Structure structure, int chunkX, int chunkZ) { + BlockPos nearestLandmark = LegacyLandmarkPlacements.getNearestCenterXZ(chunkX, chunkZ); + ChunkAccess chunkAccess = level.getChunk(SectionPos.blockToSectionCoord(nearestLandmark.getX()), SectionPos.blockToSectionCoord(nearestLandmark.getZ()), ChunkStatus.STRUCTURE_STARTS); + + for (Long packedChunkPos : chunkAccess.getReferencesForStructure(structure)) { + int packedX = ChunkPos.getX(packedChunkPos); + int packedZ = ChunkPos.getZ(packedChunkPos); + + if (level.hasChunk(packedX, packedZ)) { + StructureStart structureStart = level.getChunk(packedX, packedZ, ChunkStatus.STRUCTURE_STARTS).getStartForStructure(structure); + + if (structureStart != null && structureStart.isValid()) return Optional.of(structureStart); + } + } + + return Optional.empty(); + } + + public static boolean isProgressionEnforced(Level world) { + return world.getGameRules().getBoolean(TwilightForestMod.ENFORCED_PROGRESSION_RULE); + } + + private LandmarkUtil () {} +} diff --git a/src/main/java/twilightforest/util/LegacyLandmarkPlacements.java b/src/main/java/twilightforest/util/LegacyLandmarkPlacements.java new file mode 100644 index 0000000000..9fa5f4b39f --- /dev/null +++ b/src/main/java/twilightforest/util/LegacyLandmarkPlacements.java @@ -0,0 +1,268 @@ +package twilightforest.util; + +import com.google.common.collect.ImmutableMap; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Registry; +import net.minecraft.core.RegistryAccess; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.biome.Biome; +import org.jetbrains.annotations.Nullable; +import twilightforest.init.TFBiomes; +import twilightforest.init.TFLandmark; + +import java.util.Map; +import java.util.Optional; +import java.util.Random; + +public class LegacyLandmarkPlacements { + + private static final Map BIOME_FEATURES = new ImmutableMap.Builder() + //.put(TFBiomes.DENSE_MUSHROOM_FOREST.location(), MUSHROOM_TOWER) + .put(TFBiomes.ENCHANTED_FOREST.location(), TFLandmark.QUEST_GROVE) + .put(TFBiomes.LAKE.location(), TFLandmark.QUEST_ISLAND) + .put(TFBiomes.SWAMP.location(), TFLandmark.LABYRINTH) + .put(TFBiomes.FIRE_SWAMP.location(), TFLandmark.HYDRA_LAIR) + .put(TFBiomes.DARK_FOREST.location(), TFLandmark.KNIGHT_STRONGHOLD) + .put(TFBiomes.DARK_FOREST_CENTER.location(), TFLandmark.DARK_TOWER) + .put(TFBiomes.SNOWY_FOREST.location(), TFLandmark.YETI_CAVE) + .put(TFBiomes.GLACIER.location(), TFLandmark.ICE_TOWER) + .put(TFBiomes.HIGHLANDS.location(), TFLandmark.TROLL_CAVE) + .put(TFBiomes.FINAL_PLATEAU.location(), TFLandmark.FINAL_CASTLE) + .build(); + + /** + * @return The type of feature directly at the specified Chunk coordinates + */ + public static TFLandmark getLandmarkDirectlyAt(int chunkX, int chunkZ, WorldGenLevel world) { + if (blockIsInLandmarkCenter(chunkX << 4, chunkZ << 4)) { + return pickLandmarkAtBlock(chunkX << 4, chunkZ << 4, world); + } + return TFLandmark.NOTHING; + } + + public static boolean blockNearLandmarkCenter(int blockX, int blockZ, int range) { + for (int x = -range; x <= range; x++) { + for (int z = -range; z <= range; z++) { + if (LegacyLandmarkPlacements.chunkHasLandmarkCenter(blockX >> 4 + x, blockZ >> 4 + z)) + return true; + } + } + return false; + } + + public static boolean blockIsInLandmarkCenter(int blockX, int blockZ) { + return chunkHasLandmarkCenter(blockX >> 4, blockZ >> 4); + } + + public static boolean chunkHasLandmarkCenter(ChunkPos chunkPos) { + return LegacyLandmarkPlacements.chunkHasLandmarkCenter(chunkPos.x, chunkPos.z); + } + + public static boolean chunkHasLandmarkCenter(int chunkX, int chunkZ) { + BlockPos nearestCenter = getNearestCenterXZ(chunkX, chunkZ); + + return chunkX == nearestCenter.getX() >> 4 && chunkZ == nearestCenter.getZ() >> 4; + } + + // TODO For use with Hollow Hills + public static float distanceFromCenter(BlockPos posXZ, boolean euclidean) { + BlockPos nearestCenter = getNearestCenterXZ(posXZ.getX() >> 4, posXZ.getZ() >> 4); + + float dX = posXZ.getX() - nearestCenter.getX(); + float dZ = posXZ.getZ() - nearestCenter.getZ(); + + if (euclidean) return Mth.sqrt(dX * dX + dZ * dZ); + + return Mth.abs(dX) + Mth.abs(dZ); + } + + public static TFLandmark pickLandmarkAtBlock(int blockX, int blockZ, WorldGenLevel world) { + return pickLandmarkForChunk(blockX >> 4, blockZ >> 4, world); + } + + /** + * What feature would go in this chunk. Called when we know there is a feature, but there is no cache data, + * either generating this chunk for the first time, or using the magic map to forecast beyond the edge of the world. + */ + public static TFLandmark pickLandmarkForChunk(int chunkX, int chunkZ, WorldGenLevel world) { + // set the chunkX and chunkZ to the center of the biome + chunkX = Math.round(chunkX / 16F) * 16; + chunkZ = Math.round(chunkZ / 16F) * 16; + + // what biome is at the center of the chunk? + Biome biomeAt = world.getBiome(new BlockPos((chunkX << 4) + 8, 0, (chunkZ << 4) + 8)).value(); + return pickBiomeLandmarkLegacy(world.registryAccess(), chunkX, chunkZ, biomeAt, world.getSeed()); + } + + public static TFLandmark pickBiomeLandmarkLegacy(RegistryAccess access, int chunkX, int chunkZ, Biome biome, long seed) { + Optional> registryOpt = access.registry(Registries.BIOME); + + if (registryOpt.isPresent()) { + TFLandmark biomeFeature = BIOME_FEATURES.get(registryOpt.get().getKey(biome)); + + if(biomeFeature != null) + return biomeFeature; + } + + return pickVarietyLandmark(chunkX, chunkZ, seed); + } + + public static TFLandmark pickVarietyLandmark(int chunkX, int chunkZ, long seed) { + // set the chunkX and chunkZ to the center of the biome in case they arent already + chunkX = Math.round(chunkX / 16F) * 16; + chunkZ = Math.round(chunkZ / 16F) * 16; + + int regionOffsetX = Math.abs((chunkX + 64 >> 4) % 8); + int regionOffsetZ = Math.abs((chunkZ + 64 >> 4) % 8); + + // plant two lich towers near the center of each 2048x2048 map area + if ((regionOffsetX == 4 && regionOffsetZ == 5) || (regionOffsetX == 4 && regionOffsetZ == 3)) { + return TFLandmark.LICH_TOWER; + } + + // also two nagas + if ((regionOffsetX == 5 && regionOffsetZ == 4) || (regionOffsetX == 3 && regionOffsetZ == 4)) { + return TFLandmark.NAGA_COURTYARD; + } + + // get random value + // okay, well that takes care of most special cases + return switch (new Random(seed + chunkX * 25117L + chunkZ * 151121L).nextInt(16)) { + case 6, 7, 8 -> TFLandmark.MEDIUM_HILL; + case 9 -> TFLandmark.LARGE_HILL; + case 10, 11 -> TFLandmark.HEDGE_MAZE; + case 12, 13 -> TFLandmark.NAGA_COURTYARD; + case 14, 15 -> TFLandmark.LICH_TOWER; + default -> TFLandmark.SMALL_HILL; + }; + } + + /** + * Returns the feature nearest to the specified chunk coordinates. + */ + public static TFLandmark getNearestLandmark(int cx, int cz, WorldGenLevel world) { + return getNearestLandmark(cx, cz, world, null); + } + + /** + * Returns the feature nearest to the specified chunk coordinates. + * + * If a non-null {@code center} is provided and a valid feature is found, + * it will be set to relative block coordinates indicating the center of + * that feature relative to the current chunk block coordinate system. + */ + public static TFLandmark getNearestLandmark(int cx, int cz, WorldGenLevel world, @Nullable Vec2i center) { + int maxSize = TFLandmark.getMaxSearchSize(); + int diam = maxSize * 2 + 1; + TFLandmark[] features = new TFLandmark[diam * diam]; + + for (int rad = 1; rad <= maxSize; rad++) { + for (int x = -rad; x <= rad; x++) { + for (int z = -rad; z <= rad; z++) { + + int idx = (x + maxSize) * diam + (z + maxSize); + TFLandmark directlyAt = features[idx]; + if (directlyAt == null) { + features[idx] = directlyAt = getLandmarkDirectlyAt(x + cx, z + cz, world); + } + + if (directlyAt.size == rad) { + if (center != null) { + center.x = (x << 4) + 8; + center.z = (z << 4) + 8; + } + return directlyAt; + } + } + } + } + + return TFLandmark.NOTHING; + } + + /** + * @return The feature in the chunk "region" + */ + public static TFLandmark getFeatureForRegion(int chunkX, int chunkZ, WorldGenLevel world) { + //just round to the nearest multiple of 16 chunks? + int featureX = Math.round(chunkX / 16F) * 16; + int featureZ = Math.round(chunkZ / 16F) * 16; + + return pickLandmarkForChunk(featureX, featureZ, world); + } + + /** + * @return The feature in the chunk "region" + */ + public static TFLandmark getFeatureForRegionPos(int posX, int posZ, WorldGenLevel world) { + return getFeatureForRegion(posX >> 4, posZ >> 4, world); + } + + public static XZQuadrantIterator landmarkCenterScanner(BlockPos searchFocus, int gridSearchRadius) { + return new XZQuadrantIterator<>((searchFocus.getX() >> 4) & ~0b1111, (searchFocus.getZ() >> 4) & ~0b1111, false, gridSearchRadius, 16, LegacyLandmarkPlacements::getNearestCenterXZ); + } + + /** + * Given some coordinates, return the center of the nearest feature. + *

+ * At the moment, with how features are distributed, just get the closest multiple of 256 and add +8 in both directions. + *

+ * Maybe in the future we'll have to actually search for a feature chunk nearby, but for now this will work. + */ + public static BlockPos getNearestCenterXZ(int chunkX, int chunkZ) { + return getNearestCenterXZ(chunkX, chunkZ, 0); + } + + /** + * Given some coordinates, return the center of the nearest feature. + *

+ * At the moment, with how features are distributed, just get the closest multiple of 256 and add +8 in both directions. + *

+ * Maybe in the future we'll have to actually search for a feature chunk nearby, but for now this will work. + */ + public static BlockPos getNearestCenterXZ(int chunkX, int chunkZ, int height) { + // generate random number for the whole biome area + int regionX = (chunkX + 8) >> 4; + int regionZ = (chunkZ + 8) >> 4; + + long seed = regionX * 3129871 ^ regionZ * 116129781L; + seed = seed * seed * 42317861L + seed * 7L; + + int num0 = (int) (seed >> 12 & 3L); + int num1 = (int) (seed >> 15 & 3L); + int num2 = (int) (seed >> 18 & 3L); + int num3 = (int) (seed >> 21 & 3L); + + // slightly randomize center of biome (+/- 3) + int centerX = 8 + num0 - num1; + int centerZ = 8 + num2 - num3; + + // centers are offset strangely depending on +/- + int ccz; + if (regionZ >= 0) { + ccz = (regionZ * 16 + centerZ - 8) * 16 + 8; + } else { + ccz = (regionZ * 16 + (16 - centerZ) - 8) * 16 + 9; + } + + int ccx; + if (regionX >= 0) { + ccx = (regionX * 16 + centerX - 8) * 16 + 8; + } else { + ccx = (regionX * 16 + (16 - centerX) - 8) * 16 + 9; + } + + return new BlockPos(ccx, height, ccz); + } + + public static boolean isTheseFeatures(TFLandmark feature, TFLandmark... predicates) { + for (TFLandmark predicate : predicates) + if (feature == predicate) + return true; + return false; + } +} diff --git a/src/main/java/twilightforest/util/PlayerHelper.java b/src/main/java/twilightforest/util/PlayerHelper.java new file mode 100644 index 0000000000..5ad3f1d32a --- /dev/null +++ b/src/main/java/twilightforest/util/PlayerHelper.java @@ -0,0 +1,119 @@ +package twilightforest.util; + +import net.minecraft.advancements.Advancement; +import net.minecraft.advancements.AdvancementProgress; +import net.minecraft.server.PlayerAdvancements; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.client.multiplayer.ClientAdvancements; +import net.minecraft.world.entity.player.Player; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; + +import org.jetbrains.annotations.Nullable; +import java.util.List; + +public class PlayerHelper { + /** + * Fulfills all remaining criteria of the given advancement + */ + @Deprecated + public static void grantAdvancement(ServerPlayer player, ResourceLocation id) { + PlayerAdvancements advancements = player.getAdvancements(); + Advancement advancement = player.getServer().getAdvancements().getAdvancement(id); + if (advancement != null) { + for (String criterion : advancements.getOrStartProgress(advancement).getRemainingCriteria()) { + advancements.award(advancement, criterion); + } + } + } + + @Deprecated + public static void grantCriterion(ServerPlayer player, ResourceLocation id, String criterion) { + PlayerAdvancements advancements = player.getAdvancements(); + Advancement advancement = player.getServer().getAdvancements().getAdvancement(id); + if (advancement != null) { + advancements.award(advancement, criterion); + } + } + + @Nullable + public static Advancement getAdvancement(Player player, ResourceLocation advancementLocation) { + if (player.level.isClientSide() && player instanceof LocalPlayer localPlayer) { + ClientAdvancements manager = localPlayer.connection.getAdvancements(); + return manager.getAdvancements().get(advancementLocation); + } else if (player instanceof ServerPlayer serverPlayer) { + ServerLevel world = serverPlayer.getLevel(); + return world.getServer().getAdvancements().getAdvancement(advancementLocation); + } + + return null; + } + + public static boolean doesPlayerHaveRequiredAdvancement(Player player, Advancement advancement) { + if (player.level.isClientSide()) { + if (player instanceof LocalPlayer) { + ClientAdvancements manager = ((LocalPlayer) player).connection.getAdvancements(); + if (advancement == null) return false; + + AdvancementProgress progress = manager.progress.get(advancement); + return progress != null && progress.isDone(); + } + return false; + } else { + if (player instanceof ServerPlayer) { + return advancement != null && ((ServerPlayer) player).getAdvancements().getOrStartProgress(advancement).isDone(); + } + return false; + } + } + + public static boolean doesPlayerHaveRequiredAdvancement(Player player, ResourceLocation advancementLocation) { + if (player.level.isClientSide()) { + if (player instanceof LocalPlayer) { + ClientAdvancements manager = ((LocalPlayer) player).connection.getAdvancements(); + Advancement adv = manager.getAdvancements().get(advancementLocation); + if (adv == null) return false; + + AdvancementProgress progress = manager.progress.get(adv); + return progress != null && progress.isDone(); + } + return false; + } else { + if (player instanceof ServerPlayer) { + ServerLevel world = ((ServerPlayer) player).getLevel(); + Advancement adv = world.getServer().getAdvancements().getAdvancement(advancementLocation); + return adv != null && ((ServerPlayer) player).getAdvancements().getOrStartProgress(adv).isDone(); + } + return false; + } + } + + public static boolean doesPlayerHaveRequiredAdvancements(Player player, ResourceLocation... requiredAdvancements) { + return PlayerHelper.playerHasRequiredAdvancements(player, List.of(requiredAdvancements)); + } + + public static boolean playerHasRequiredAdvancements(Player player, Iterable requiredAdvancements) { + for (ResourceLocation advancementLocation : requiredAdvancements) { + if (player.level.isClientSide()) { + if (player instanceof LocalPlayer) { + ClientAdvancements manager = ((LocalPlayer) player).connection.getAdvancements(); + Advancement adv = manager.getAdvancements().get(advancementLocation); + if (adv == null) + return false; + AdvancementProgress progress = manager.progress.get(adv); + return progress != null && progress.isDone(); + } + return false; + } else { + if (player instanceof ServerPlayer) { + ServerLevel world = ((ServerPlayer) player).getLevel(); + Advancement adv = world.getServer().getAdvancements().getAdvancement(advancementLocation); + return adv != null && ((ServerPlayer) player).getAdvancements().getOrStartProgress(adv).isDone(); + } + return false; + } + } + return true; + } +} diff --git a/src/main/java/twilightforest/util/RotationUtil.java b/src/main/java/twilightforest/util/RotationUtil.java new file mode 100644 index 0000000000..c3ca1284b2 --- /dev/null +++ b/src/main/java/twilightforest/util/RotationUtil.java @@ -0,0 +1,83 @@ +package twilightforest.util; + +import net.minecraft.core.Direction; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.block.Rotation; + +import java.util.Random; + +public final class RotationUtil { + public static final Rotation[] ROTATIONS = Rotation.values(); + public static final Direction[] CARDINALS = { Direction.NORTH, Direction.SOUTH, Direction.EAST, Direction.WEST }; + + private RotationUtil() { + } + + public static Rotation getRandomRotation(RandomSource random) { + return ROTATIONS[random.nextInt(ROTATIONS.length)]; + } + + public static Rotation add(Rotation original, int rotations) { + return original.getRotated(ROTATIONS[(rotations + 4) & 3]); + } + + public static Rotation subtract(Rotation original, Rotation rotation) { + return switch (rotation) { + case CLOCKWISE_180 -> switch (original) { + case NONE -> Rotation.CLOCKWISE_180; + case CLOCKWISE_90 -> Rotation.COUNTERCLOCKWISE_90; + case CLOCKWISE_180 -> Rotation.NONE; + case COUNTERCLOCKWISE_90 -> Rotation.CLOCKWISE_90; + //default -> original; + }; + case COUNTERCLOCKWISE_90 -> switch (original) { + case NONE -> Rotation.CLOCKWISE_90; + case CLOCKWISE_90 -> Rotation.CLOCKWISE_180; + case CLOCKWISE_180 -> Rotation.COUNTERCLOCKWISE_90; + case COUNTERCLOCKWISE_90 -> Rotation.NONE; + //default -> original; + }; + case CLOCKWISE_90 -> switch (original) { + case NONE -> Rotation.COUNTERCLOCKWISE_90; + case CLOCKWISE_90 -> Rotation.NONE; + case CLOCKWISE_180 -> Rotation.CLOCKWISE_90; + case COUNTERCLOCKWISE_90 -> Rotation.CLOCKWISE_180; + //default -> original; + }; + default -> original; + }; + } + + public static Rotation getRelativeRotation(Direction original, Direction destination) { + return switch (original) { + case SOUTH -> switch (destination) { + case NORTH -> Rotation.CLOCKWISE_180; + case WEST -> Rotation.CLOCKWISE_90; + case EAST -> Rotation.COUNTERCLOCKWISE_90; + default -> Rotation.NONE; + }; + case EAST -> switch (destination) { + case WEST -> Rotation.CLOCKWISE_180; + case SOUTH -> Rotation.CLOCKWISE_90; + case NORTH -> Rotation.COUNTERCLOCKWISE_90; + default -> Rotation.NONE; + }; + case WEST -> switch (destination) { + case EAST -> Rotation.CLOCKWISE_180; + case NORTH -> Rotation.CLOCKWISE_90; + case SOUTH -> Rotation.COUNTERCLOCKWISE_90; + default -> Rotation.NONE; + }; + default -> switch (destination) { + case SOUTH -> Rotation.CLOCKWISE_180; + case EAST -> Rotation.CLOCKWISE_90; + case WEST -> Rotation.COUNTERCLOCKWISE_90; + default -> Rotation.NONE; + }; + }; + } + + public static Direction getRandomFacing(RandomSource random) { + return CARDINALS[random.nextInt(CARDINALS.length)]; + } +} diff --git a/src/main/java/twilightforest/util/TFItemStackUtils.java b/src/main/java/twilightforest/util/TFItemStackUtils.java new file mode 100644 index 0000000000..2df8cf1572 --- /dev/null +++ b/src/main/java/twilightforest/util/TFItemStackUtils.java @@ -0,0 +1,153 @@ +package twilightforest.util; + +import net.minecraft.core.NonNullList; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.*; +import net.minecraftforge.common.capabilities.ForgeCapabilities; +import twilightforest.TwilightForestMod; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.function.Predicate; + +public class TFItemStackUtils { + + public static int damage = 0; + + @Deprecated + public static boolean consumeInventoryItem(LivingEntity living, final Predicate matcher, final int count) { + TwilightForestMod.LOGGER.warn("consumeInventoryItem accessed! Forge requires the player to be alive before we can access this cap. This cap is most likely being accessed for an Afterdeath Charm!"); + + return living.getCapability(ForgeCapabilities.ITEM_HANDLER).map(inv -> { + int innerCount = count; + boolean consumedSome = false; + + for (int i = 0; i < inv.getSlots() && innerCount > 0; i++) { + ItemStack stack = inv.getStackInSlot(i); + if (matcher.test(stack)) { + ItemStack consumed = inv.extractItem(i, innerCount, false); + innerCount -= consumed.getCount(); + consumedSome = true; + } + } + + return consumedSome; + }).orElse(false); + } + + public static boolean consumeInventoryItem(final Player player, final Item item) { + return consumeInventoryItem(player.getInventory().armor, item) || consumeInventoryItem(player.getInventory().items, item) || consumeInventoryItem(player.getInventory().offhand, item); + } + + public static boolean consumeInventoryItem(final NonNullList stacks, final Item item) { + for (ItemStack stack : stacks) { + if (stack.getItem() == item) { + stack.shrink(1); + CompoundTag nbt = stack.getOrCreateTag(); + if (nbt.contains("BlockStateTag")) { + CompoundTag damageNbt = nbt.getCompound("BlockStateTag"); + if (damageNbt.contains("damage")) { + damage = damageNbt.getInt("damage"); + } + } + return true; + } + } + + return false; + } + + public static NonNullList sortArmorForCasket(Player player) { + NonNullList armor = player.getInventory().armor; + Collections.reverse(armor); + return armor; + } + + public static NonNullList sortInvForCasket(Player player) { + NonNullList inv = player.getInventory().items; + NonNullList sorted = NonNullList.create(); + //hotbar at the bottom + sorted.addAll(inv.subList(9, 36)); + sorted.addAll(inv.subList(0, 9)); + + return sorted; + } + + public static NonNullList splitToSize(ItemStack stack) { + + NonNullList result = NonNullList.create(); + + int size = stack.getMaxStackSize(); + + while (!stack.isEmpty()) { + result.add(stack.split(size)); + } + + return result; + } + + public static boolean hasToolMaterial(ItemStack stack, Tier tier) { + + Item item = stack.getItem(); + + // see TileEntityFurnace.getItemBurnTime + if (item instanceof TieredItem tieredItem && tier.equals(tieredItem.getTier())) { + return true; + } + if (item instanceof SwordItem sword && tier.equals(sword.getTier())) { + return true; + } + return item instanceof HoeItem hoe && tier.equals(hoe.getTier()); + } + + public static void clearInfoTag(ItemStack stack, String key) { + CompoundTag nbt = stack.getTag(); + if (nbt != null) { + nbt.remove(key); + if (nbt.isEmpty()) { + stack.setTag(null); + } + } + } + + //[VanillaCopy] of Inventory.load, but removed clearing all slots + //also add a handler to move items to the next available slot if the slot they want to go to isnt available + public static void loadNoClear(ListTag tag, Inventory inventory) { + + List blockedItems = new ArrayList<>(); + + for (int i = 0; i < tag.size(); ++i) { + CompoundTag compoundtag = tag.getCompound(i); + int j = compoundtag.getByte("Slot") & 255; + ItemStack itemstack = ItemStack.of(compoundtag); + if (!itemstack.isEmpty()) { + if (j < inventory.items.size()) { + if (inventory.items.get(j).isEmpty()) { + inventory.items.set(j, itemstack); + } else { + blockedItems.add(itemstack); + } + } else if (j >= 100 && j < inventory.armor.size() + 100) { + if (inventory.armor.get(j - 100).isEmpty()) { + inventory.armor.set(j - 100, itemstack); + } else { + blockedItems.add(itemstack); + } + } else if (j >= 150 && j < inventory.offhand.size() + 150) { + if (inventory.offhand.get(j - 150).isEmpty()) { + inventory.offhand.set(j - 150, itemstack); + } else { + blockedItems.add(itemstack); + } + } + } + } + + if(!blockedItems.isEmpty()) blockedItems.forEach(inventory::add); + } +} diff --git a/src/main/java/twilightforest/util/TFRemapper.java b/src/main/java/twilightforest/util/TFRemapper.java new file mode 100644 index 0000000000..9cf7489beb --- /dev/null +++ b/src/main/java/twilightforest/util/TFRemapper.java @@ -0,0 +1,281 @@ +package twilightforest.util; + +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.block.Block; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.registries.MissingMappingsEvent; +import twilightforest.TwilightForestMod; + +@Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.FORGE) +public class TFRemapper { + + @SubscribeEvent + public static void runTFRemapper(MissingMappingsEvent event) { + for (MissingMappingsEvent.Mapping mapping : event.getAllMappings(Registries.BLOCK)) { + if (mapping.getKey().getNamespace().equals(TwilightForestMod.ID)) { + remapBlock(mapping, "yeti_trophy", "alpha_yeti_trophy"); + remapBlock(mapping, "yeti_wall_trophy", "alpha_yeti_wall_trophy"); + remapBlock(mapping, "boss_spawner_naga", "naga_boss_spawner"); + remapBlock(mapping, "boss_spawner_lich", "lich_boss_spawner"); + remapBlock(mapping, "boss_spawner_minoshroom", "minoshroom_boss_spawner"); + remapBlock(mapping, "boss_spawner_hydra", "hydra_boss_spawner"); + remapBlock(mapping, "boss_spawner_knight_phantom", "knight_phantom_boss_spawner"); + remapBlock(mapping, "boss_spawner_ur_ghast", "ur_ghast_boss_spawner"); + remapBlock(mapping, "boss_spawner_alpha_yeti", "alpha_yeti_boss_spawner"); + remapBlock(mapping, "boss_spawner_snow_queen", "snow_queen_boss_spawner"); + remapBlock(mapping, "boss_spawner_final_boss", "final_boss_boss_spawner"); + + remapBlock(mapping, "etched_nagastone_weathered", "cracked_etched_nagastone"); + remapBlock(mapping, "etched_nagastone_mossy", "mossy_etched_nagastone"); + remapBlock(mapping, "nagastone_pillar_weathered", "cracked_nagastone_pillar"); + remapBlock(mapping, "nagastone_pillar_mossy", "mossy_nagastone_pillar"); + remapBlock(mapping, "nagastone_stairs_weathered_left", "cracked_nagastone_stairs_left"); + remapBlock(mapping, "nagastone_stairs_mossy_left", "mossy_nagastone_stairs_left"); + remapBlock(mapping, "nagastone_stairs_weathered_right", "cracked_nagastone_stairs_right"); + remapBlock(mapping, "nagastone_stairs_mossy_right", "mossy_nagastone_stairs_right"); + remapBlock(mapping, "naga_stone_head", "nagastone_head"); + remapBlock(mapping, "naga_stone", "nagastone"); + + remapBlock(mapping, "stone_twist", "twisted_stone"); + remapBlock(mapping, "stone_twist_thin", "twisted_stone_pillar"); + remapBlock(mapping, "stone_pillar_bold", "bold_stone_pillar"); + remapBlock(mapping, "empty_bookshelf", "empty_canopy_bookshelf"); + + remapBlock(mapping, "huge_lilypad", "huge_lily_pad"); + remapBlock(mapping, "huge_waterlily", "huge_water_lily"); + + remapBlock(mapping, "maze_stone", "mazestone"); + remapBlock(mapping, "maze_stone_brick", "mazestone_brick"); + remapBlock(mapping, "maze_stone_cracked", "cracked_mazestone"); + remapBlock(mapping, "maze_stone_mossy", "mossy_mazestone"); + remapBlock(mapping, "maze_stone_decorative", "decorative_mazestone"); + remapBlock(mapping, "maze_stone_chiseled", "cut_mazestone"); + remapBlock(mapping, "maze_stone_border", "mazestone_border"); + remapBlock(mapping, "maze_stone_mosaic", "mazestone_mosaic"); + + remapBlock(mapping, "underbrick_cracked", "cracked_underbrick"); + remapBlock(mapping, "underbrick_mossy", "mossy_underbrick"); + + remapBlock(mapping, "tower_wood", "towerwood"); + remapBlock(mapping, "tower_wood_cracked", "cracked_towerwood"); + remapBlock(mapping, "tower_wood_mossy", "mossy_towerwood"); + remapBlock(mapping, "tower_wood_infested", "infested_towerwood"); + remapBlock(mapping, "tower_wood_encased", "encased_towerwood"); + + remapBlock(mapping, "deadrock_cracked", "cracked_deadrock"); + remapBlock(mapping, "deadrock_weathered", "weathered_deadrock"); + + remapBlock(mapping, "castle_brick_worn", "worn_castle_brick"); + remapBlock(mapping, "castle_brick_cracked", "cracked_castle_brick"); + remapBlock(mapping, "castle_brick_mossy", "mossy_castle_brick"); + remapBlock(mapping, "castle_brick_frame", "thick_castle_brick"); + remapBlock(mapping, "castle_brick_roof", "castle_roof_tile"); + remapBlock(mapping, "castle_pillar_encased", "encased_castle_brick_pillar"); + remapBlock(mapping, "castle_pillar_encased_tile", "encased_castle_brick_tile"); + remapBlock(mapping, "castle_pillar_bold", "bold_castle_brick_pillar"); + remapBlock(mapping, "castle_pillar_bold_tile", "bold_castle_brick_tile"); + remapBlock(mapping, "castle_stairs_brick", "castle_brick_stairs"); + remapBlock(mapping, "castle_stairs_worn", "worn_castle_brick_stairs"); + remapBlock(mapping, "castle_stairs_cracked", "cracked_castle_brick_stairs"); + remapBlock(mapping, "castle_stairs_mossy", "mossy_castle_brick_stairs"); + remapBlock(mapping, "castle_stairs_encased", "encased_castle_brick_stairs"); + remapBlock(mapping, "castle_stairs_bold", "bold_castle_brick_stairs"); + remapBlock(mapping, "castle_rune_brick_pink", "pink_castle_rune_brick"); + remapBlock(mapping, "castle_rune_brick_yellow", "yellow_castle_rune_brick"); + remapBlock(mapping, "castle_rune_brick_blue", "blue_castle_rune_brick"); + remapBlock(mapping, "castle_rune_brick_purple", "violet_castle_rune_brick"); + remapBlock(mapping, "castle_door_pink", "pink_castle_door"); + remapBlock(mapping, "castle_door_yellow", "yellow_castle_door"); + remapBlock(mapping, "castle_door_blue", "blue_castle_door"); + remapBlock(mapping, "castle_door_purple", "violet_castle_door"); + remapBlock(mapping, "force_field_pink", "pink_force_field"); + remapBlock(mapping, "force_field_orange", "orange_force_field"); + remapBlock(mapping, "force_field_green", "green_force_field"); + remapBlock(mapping, "force_field_blue", "blue_force_field"); + remapBlock(mapping, "force_field_purple", "violet_force_field"); + + remapBlock(mapping, "rainboak_leaves", "rainbow_oak_leaves"); + remapBlock(mapping, "rainboak_sapling", "rainbow_oak_sapling"); + remapBlock(mapping, "potted_rainboak_sapling", "potted_rainbow_oak_sapling"); + + remapBlock(mapping, "darkwood_", "dark_"); + remapBlock(mapping, "trans_", "transformation_"); + remapBlock(mapping, "mine_", "mining_"); + remapBlock(mapping, "sort_", "sorting_"); + + remapBlock(mapping, "_gate", "_fence_gate"); + remapBlock(mapping, "_plate", "_pressure_plate"); + } + } + + for (MissingMappingsEvent.Mapping> mapping : event.getAllMappings(Registries.ENTITY_TYPE)) { + if (mapping.getKey().getNamespace().equals(TwilightForestMod.ID)) { + remapEntity(mapping, "wild_boar", "boar"); + remapEntity(mapping, "bunny", "dwarf_rabbit"); + remapEntity(mapping, "mini_ghast", "carminite_ghastling"); + remapEntity(mapping, "tower_ghast", "carminite_ghastguard"); + remapEntity(mapping, "tower_golem", "carminite_golem"); + remapEntity(mapping, "tower_broodling", "carminite_broodling"); + remapEntity(mapping, "tower_termite", "towerwood_borer"); + remapEntity(mapping, "goblin_knight_upper", "upper_goblin_knight"); + remapEntity(mapping, "goblin_knight_lower", "lower_goblin_knight"); + remapEntity(mapping, "yeti_alpha", "alpha_yeti"); + } + } + + for (MissingMappingsEvent.Mapping mapping : event.getAllMappings(Registries.ITEM)) { + if (mapping.getKey().getNamespace().equals(TwilightForestMod.ID)) { + remapItem(mapping, "yeti_trophy", "alpha_yeti_trophy"); + remapItem(mapping, "boss_spawner_naga", "naga_boss_spawner"); + remapItem(mapping, "boss_spawner_lich", "lich_boss_spawner"); + remapItem(mapping, "boss_spawner_minoshroom", "minoshroom_boss_spawner"); + remapItem(mapping, "boss_spawner_hydra", "hydra_boss_spawner"); + remapItem(mapping, "boss_spawner_knight_phantom", "knight_phantom_boss_spawner"); + remapItem(mapping, "boss_spawner_ur_ghast", "ur_ghast_boss_spawner"); + remapItem(mapping, "boss_spawner_alpha_yeti", "alpha_yeti_boss_spawner"); + remapItem(mapping, "boss_spawner_snow_queen", "snow_queen_boss_spawner"); + remapItem(mapping, "boss_spawner_final_boss", "final_boss_boss_spawner"); + + remapItem(mapping, "etched_nagastone_weathered", "cracked_etched_nagastone"); + remapItem(mapping, "etched_nagastone_mossy", "mossy_etched_nagastone"); + remapItem(mapping, "nagastone_pillar_weathered", "cracked_nagastone_pillar"); + remapItem(mapping, "nagastone_pillar_mossy", "mossy_nagastone_pillar"); + remapItem(mapping, "nagastone_stairs_weathered_left", "cracked_nagastone_stairs_left"); + remapItem(mapping, "nagastone_stairs_mossy_left", "mossy_nagastone_stairs_left"); + remapItem(mapping, "nagastone_stairs_weathered_right", "cracked_nagastone_stairs_right"); + remapItem(mapping, "nagastone_stairs_mossy_right", "mossy_nagastone_stairs_right"); + remapItem(mapping, "naga_stone_head", "nagastone_head"); + remapItem(mapping, "naga_stone", "nagastone"); + + remapItem(mapping, "stone_twist", "twisted_stone"); + remapItem(mapping, "stone_twist_thin", "twisted_stone_pillar"); + remapItem(mapping, "stone_pillar_bold", "bold_stone_pillar"); + remapItem(mapping, "empty_bookshelf", "empty_canopy_bookshelf"); + + remapItem(mapping, "huge_lilypad", "huge_lily_pad"); + remapItem(mapping, "huge_waterlily", "huge_water_lily"); + + remapItem(mapping, "maze_stone", "mazestone"); + remapItem(mapping, "maze_stone_brick", "mazestone_brick"); + remapItem(mapping, "maze_stone_cracked", "cracked_mazestone"); + remapItem(mapping, "maze_stone_mossy", "mossy_mazestone"); + remapItem(mapping, "maze_stone_decorative", "decorative_mazestone"); + remapItem(mapping, "maze_stone_chiseled", "cut_mazestone"); + remapItem(mapping, "maze_stone_border", "mazestone_border"); + remapItem(mapping, "maze_stone_mosaic", "mazestone_mosaic"); + + remapItem(mapping, "underbrick_cracked", "cracked_underbrick"); + remapItem(mapping, "underbrick_mossy", "mossy_underbrick"); + + remapItem(mapping, "tower_wood", "towerwood"); + remapItem(mapping, "tower_wood_cracked", "cracked_towerwood"); + remapItem(mapping, "tower_wood_mossy", "mossy_towerwood"); + remapItem(mapping, "tower_wood_infested", "infested_towerwood"); + remapItem(mapping, "tower_wood_encased", "encased_towerwood"); + + remapItem(mapping, "deadrock_cracked", "cracked_deadrock"); + remapItem(mapping, "deadrock_weathered", "weathered_deadrock"); + + remapItem(mapping, "castle_brick_worn", "worn_castle_brick"); + remapItem(mapping, "castle_brick_cracked", "cracked_castle_brick"); + remapItem(mapping, "castle_brick_mossy", "mossy_castle_brick"); + remapItem(mapping, "castle_brick_frame", "thick_castle_brick"); + remapItem(mapping, "castle_brick_roof", "castle_roof_tile"); + remapItem(mapping, "castle_pillar_encased", "encased_castle_brick_pillar"); + remapItem(mapping, "castle_pillar_encased_tile", "encased_castle_brick_tile"); + remapItem(mapping, "castle_pillar_bold", "bold_castle_brick_pillar"); + remapItem(mapping, "castle_pillar_bold_tile", "bold_castle_brick_tile"); + remapItem(mapping, "castle_stairs_brick", "castle_brick_stairs"); + remapItem(mapping, "castle_stairs_worn", "worn_castle_brick_stairs"); + remapItem(mapping, "castle_stairs_cracked", "cracked_castle_brick_stairs"); + remapItem(mapping, "castle_stairs_mossy", "mossy_castle_brick_stairs"); + remapItem(mapping, "castle_stairs_encased", "encased_castle_brick_stairs"); + remapItem(mapping, "castle_stairs_bold", "bold_castle_brick_stairs"); + remapItem(mapping, "castle_rune_brick_pink", "pink_castle_rune_brick"); + remapItem(mapping, "castle_rune_brick_yellow", "yellow_castle_rune_brick"); + remapItem(mapping, "castle_rune_brick_blue", "blue_castle_rune_brick"); + remapItem(mapping, "castle_rune_brick_purple", "violet_castle_rune_brick"); + remapItem(mapping, "castle_door_pink", "pink_castle_door"); + remapItem(mapping, "castle_door_yellow", "yellow_castle_door"); + remapItem(mapping, "castle_door_blue", "blue_castle_door"); + remapItem(mapping, "castle_door_purple", "violet_castle_door"); + remapItem(mapping, "force_field_pink", "pink_force_field"); + remapItem(mapping, "force_field_orange", "orange_force_field"); + remapItem(mapping, "force_field_green", "green_force_field"); + remapItem(mapping, "force_field_blue", "blue_force_field"); + remapItem(mapping, "force_field_purple", "violet_force_field"); + + remapItem(mapping, "rainboak_leaves", "rainbow_oak_leaves"); + remapItem(mapping, "rainboak_sapling", "rainbow_oak_sapling"); + remapItem(mapping, "potted_rainboak_sapling", "potted_rainbow_oak_sapling"); + + remapItem(mapping, "darkwood_", "dark_"); + remapItem(mapping, "trans_", "transformation_"); + remapItem(mapping, "mine_", "mining_"); + remapItem(mapping, "sort_", "sorting_"); + + remapItem(mapping, "_gate", "_fence_gate"); + remapItem(mapping, "_plate", "_pressure_plate"); + + remapItem(mapping, "shield_scepter", "fortification_scepter"); + remapItem(mapping, "magic_map", "filled_magic_map"); + remapItem(mapping, "maze_map", "filled_maze_map"); + remapItem(mapping, "ore_map", "filled_ore_map"); + remapItem(mapping, "magic_map_empty", "magic_map"); + remapItem(mapping, "maze_map_empty", "maze_map"); + remapItem(mapping, "ore_map_empty", "ore_map"); + remapItem(mapping, "ironwood_raw", "raw_ironwood"); + remapItem(mapping, "minotaur_axe_gold", "gold_minotaur_axe"); + remapItem(mapping, "minotaur_axe", "diamond_minotaur_axe"); + remapItem(mapping, "peacock_fan", "peacock_feather_fan"); + remapItem(mapping, "alpha_fur", "alpha_yeti_fur"); + remapItem(mapping, "questing_ram_banner_pattern", "quest_ram_banner_pattern"); + + remapItem(mapping, "bunny_spawn_egg", "dwarf_rabbit_spawn_egg"); + remapItem(mapping, "goblin_knight_lower_spawn_egg", "lower_goblin_knight_spawn_egg"); + remapItem(mapping, "mini_ghast_spawn_egg", "carminite_ghastling_spawn_egg"); + remapItem(mapping, "tower_ghast_spawn_egg", "carminite_ghastguard_spawn_egg"); + remapItem(mapping, "tower_golem_spawn_egg", "carminite_golem_spawn_egg"); + remapItem(mapping, "tower_broodling_spawn_egg", "carminite_broodling_spawn_egg"); + remapItem(mapping, "tower_termite_spawn_egg", "towerwood_borer_spawn_egg"); + remapItem(mapping, "wild_boar_spawn_egg", "boar_spawn_egg"); + remapItem(mapping, "yeti_alpha_spawn_egg", "alpha_yeti_spawn_egg"); + } + } + } + + private static void remapBlock(MissingMappingsEvent.Mapping mapping, String oldId, String newId) { + String oldKey = mapping.getKey().getPath(); + if (oldKey.contains(oldId)) { + String newName = oldKey.replace(oldId, newId); + ResourceLocation remap = new ResourceLocation(TwilightForestMod.ID, newName); + mapping.remap(ForgeRegistries.BLOCKS.getValue(remap)); + TwilightForestMod.LOGGER.debug("Twilight Forest successfully remapped block {} to {}!", mapping.getKey().getPath(), newName); + } + } + + private static void remapItem(MissingMappingsEvent.Mapping mapping, String oldId, String newId) { + String oldKey = mapping.getKey().getPath(); + if (oldKey.contains(oldId)) { + String newName = oldKey.replace(oldId, newId); + ResourceLocation remap = new ResourceLocation(TwilightForestMod.ID, newName); + mapping.remap(ForgeRegistries.ITEMS.getValue(remap)); + TwilightForestMod.LOGGER.debug("Twilight Forest successfully remapped item {} to {}!", mapping.getKey().getPath(), newName); + } + } + + private static void remapEntity(MissingMappingsEvent.Mapping> mapping, String oldId, String newId) { + String oldKey = mapping.getKey().getPath(); + if (oldKey.contains(oldId)) { + String newName = oldKey.replace(oldId, newId); + ResourceLocation remap = new ResourceLocation(TwilightForestMod.ID, newName); + mapping.remap(ForgeRegistries.ENTITY_TYPES.getValue(remap)); + TwilightForestMod.LOGGER.debug("Twilight Forest successfully remapped entity {} to {}!", mapping.getKey().getPath(), newName); + } + } +} diff --git a/src/main/java/twilightforest/util/TFStructureHelper.java b/src/main/java/twilightforest/util/TFStructureHelper.java new file mode 100644 index 0000000000..4da93baed9 --- /dev/null +++ b/src/main/java/twilightforest/util/TFStructureHelper.java @@ -0,0 +1,67 @@ +package twilightforest.util; + +import net.minecraft.data.worldgen.features.TreeFeatures; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.SlabBlock; +import net.minecraft.world.level.block.state.properties.SlabType; +import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; +import net.minecraft.world.level.levelgen.feature.TreeFeature; + +/** + * Created by Joseph on 7/16/2017. + */ +@Deprecated +public class TFStructureHelper { + + public static final BlockState stoneSlab = getSlab(Blocks.SMOOTH_STONE_SLAB); + public static final BlockState stoneSlabTop = getSlabTop(Blocks.SMOOTH_STONE_SLAB); + public static final BlockState stoneSlabDouble = Blocks.SMOOTH_STONE_SLAB.defaultBlockState().setValue(SlabBlock.TYPE, SlabType.DOUBLE); + + public static final BlockState birchSlab = getSlab(Blocks.BIRCH_SLAB); + public static final BlockState birchSlabTop = getSlabTop(Blocks.BIRCH_SLAB); + public static final BlockState birchPlanks = Blocks.BIRCH_PLANKS.defaultBlockState(); + + + private static BlockState getSlabType(Block type, SlabType side) { + return type.defaultBlockState().setValue(SlabBlock.TYPE, side); + } + + public static BlockState getSlab(Block type) { + return getSlabType(type, SlabType.BOTTOM); + } + + public static BlockState getSlabTop(Block type) { + return getSlabType(type, SlabType.TOP); + } + + public static BlockState randomPlant(int i) { + if(i < 4) return randomSapling(i); + else return randomMushroom(i - 4); + } + + public static BlockState randomSapling(int i) { + return switch (i) { + case 1 -> Blocks.POTTED_SPRUCE_SAPLING.defaultBlockState(); + case 2 -> Blocks.POTTED_BIRCH_SAPLING.defaultBlockState(); + case 3 -> Blocks.POTTED_JUNGLE_SAPLING.defaultBlockState(); + default -> Blocks.POTTED_OAK_SAPLING.defaultBlockState(); + }; + } + + public static ResourceKey> randomTree(int i) { + return switch (i) { + case 1 -> TreeFeatures.SPRUCE; + case 2 -> TreeFeatures.BIRCH; + case 3 -> TreeFeatures.JUNGLE_TREE_NO_VINE; + default -> TreeFeatures.OAK; + }; + } + + public static BlockState randomMushroom(int i) { + if (i == 0) return Blocks.POTTED_RED_MUSHROOM.defaultBlockState(); + else return Blocks.POTTED_BROWN_MUSHROOM.defaultBlockState(); + } +} diff --git a/src/main/java/twilightforest/util/TFWoodTypes.java b/src/main/java/twilightforest/util/TFWoodTypes.java new file mode 100644 index 0000000000..7cfbccb401 --- /dev/null +++ b/src/main/java/twilightforest/util/TFWoodTypes.java @@ -0,0 +1,26 @@ +package twilightforest.util; + +import net.minecraft.world.level.block.state.properties.BlockSetType; +import net.minecraft.world.level.block.state.properties.WoodType; +import twilightforest.TwilightForestMod; + +public class TFWoodTypes { + + public static final BlockSetType TWILIGHT_OAK_SET = new BlockSetType(TwilightForestMod.prefix("twilight_oak").toString()); + public static final BlockSetType CANOPY_WOOD_SET = new BlockSetType(TwilightForestMod.prefix("canopy").toString()); + public static final BlockSetType MANGROVE_WOOD_SET = new BlockSetType(TwilightForestMod.prefix("mangrove").toString()); + public static final BlockSetType DARKWOOD_WOOD_SET = new BlockSetType(TwilightForestMod.prefix("dark").toString()); + public static final BlockSetType TIMEWOOD_WOOD_SET = new BlockSetType(TwilightForestMod.prefix("timewood").toString()); + public static final BlockSetType TRANSFORMATION_WOOD_SET = new BlockSetType(TwilightForestMod.prefix("transformation").toString()); + public static final BlockSetType MINING_WOOD_SET = new BlockSetType(TwilightForestMod.prefix("mining").toString()); + public static final BlockSetType SORTING_WOOD_SET = new BlockSetType(TwilightForestMod.prefix("sorting").toString()); + + public static final WoodType TWILIGHT_OAK_WOOD_TYPE = WoodType.register(new WoodType(TwilightForestMod.prefix("twilight_oak").toString(), TWILIGHT_OAK_SET)); + public static final WoodType CANOPY_WOOD_TYPE = WoodType.register(new WoodType(TwilightForestMod.prefix("canopy").toString(), CANOPY_WOOD_SET)); + public static final WoodType MANGROVE_WOOD_TYPE = WoodType.register(new WoodType(TwilightForestMod.prefix("mangrove").toString(), MANGROVE_WOOD_SET)); + public static final WoodType DARKWOOD_WOOD_TYPE = WoodType.register(new WoodType(TwilightForestMod.prefix("dark").toString(), DARKWOOD_WOOD_SET)); + public static final WoodType TIMEWOOD_WOOD_TYPE = WoodType.register(new WoodType(TwilightForestMod.prefix("timewood").toString(), TIMEWOOD_WOOD_SET)); + public static final WoodType TRANSFORMATION_WOOD_TYPE = WoodType.register(new WoodType(TwilightForestMod.prefix("transformation").toString(), TRANSFORMATION_WOOD_SET)); + public static final WoodType MINING_WOOD_TYPE = WoodType.register(new WoodType(TwilightForestMod.prefix("mining").toString(), MINING_WOOD_SET)); + public static final WoodType SORTING_WOOD_TYPE = WoodType.register(new WoodType(TwilightForestMod.prefix("sorting").toString(), SORTING_WOOD_SET)); +} diff --git a/src/main/java/twilightforest/util/TwilightItemTier.java b/src/main/java/twilightforest/util/TwilightItemTier.java new file mode 100644 index 0000000000..ca5fffecb5 --- /dev/null +++ b/src/main/java/twilightforest/util/TwilightItemTier.java @@ -0,0 +1,47 @@ +package twilightforest.util; + +import net.minecraft.tags.BlockTags; +import net.minecraft.world.item.Tier; +import net.minecraft.world.item.Tiers; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.level.block.Blocks; +import net.minecraftforge.common.ForgeTier; +import net.minecraftforge.common.TierSortingRegistry; +import twilightforest.TwilightForestMod; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFItems; + +import java.util.List; + +public class TwilightItemTier { + // harvestLevel, maxUses, efficiency, damage, enchantability + + public static final Tier IRONWOOD = TierSortingRegistry.registerTier( + new ForgeTier(2, 512, 6.5F, 2, 25, BlockTags.create(TwilightForestMod.prefix("needs_ironwood_tool")), () -> Ingredient.of(TFItems.IRONWOOD_INGOT.get())), + TwilightForestMod.prefix("ironwood"), List.of(Tiers.IRON), List.of(Tiers.DIAMOND)); + + public static final Tier FIERY = TierSortingRegistry.registerTier( + new ForgeTier(4, 1024, 9F, 4, 10, BlockTags.create(TwilightForestMod.prefix("needs_fiery_tool")), () -> Ingredient.of(TFItems.FIERY_INGOT.get())), + TwilightForestMod.prefix("fiery"), List.of(Tiers.NETHERITE), List.of()); + + public static final Tier STEELEAF = TierSortingRegistry.registerTier( + new ForgeTier(3, 131, 8.0F, 3, 9, BlockTags.create(TwilightForestMod.prefix("needs_steeleaf_tool")), () -> Ingredient.of(TFItems.STEELEAF_INGOT.get())), + TwilightForestMod.prefix("steeleaf"), List.of(Tiers.DIAMOND), List.of(Tiers.NETHERITE)); + + public static final Tier KNIGHTMETAL = TierSortingRegistry.registerTier( + new ForgeTier(3, 512, 8.0F, 3, 8, BlockTags.create(TwilightForestMod.prefix("needs_knightmetal_tool")), () -> Ingredient.of(TFItems.KNIGHTMETAL_INGOT.get())), + TwilightForestMod.prefix("knightmetal"), List.of(Tiers.DIAMOND), List.of(Tiers.NETHERITE)); + + public static final Tier GIANT = TierSortingRegistry.registerTier( + new ForgeTier(1, 1024, 4.0F, 1.0F, 5, BlockTags.create(TwilightForestMod.prefix("needs_giant_tool")), () -> Ingredient.of(TFBlocks.GIANT_COBBLESTONE.get())), + TwilightForestMod.prefix("giant"), List.of(Tiers.STONE), List.of(Tiers.IRON)); + + public static final Tier ICE = TierSortingRegistry.registerTier( + new ForgeTier(0, 32, 1.0F, 3.5F, 5, BlockTags.create(TwilightForestMod.prefix("needs_ice_tool")), () -> Ingredient.of(Blocks.PACKED_ICE)), + TwilightForestMod.prefix("ice"), List.of(Tiers.WOOD), List.of()); + + public static final Tier GLASS = TierSortingRegistry.registerTier( + new ForgeTier(0, 1, 1.0F, 36.0F, 30, BlockTags.create(TwilightForestMod.prefix("needs_glass_tool")), () -> Ingredient.EMPTY), + TwilightForestMod.prefix("glass"), List.of(Tiers.WOOD), List.of()); + +} diff --git a/src/main/java/twilightforest/util/Vec2i.java b/src/main/java/twilightforest/util/Vec2i.java new file mode 100644 index 0000000000..3823a68e87 --- /dev/null +++ b/src/main/java/twilightforest/util/Vec2i.java @@ -0,0 +1,13 @@ +package twilightforest.util; + +public final class Vec2i { + public int x, z; + + public Vec2i() { + } + + public Vec2i(int x, int z) { + this.x = x; + this.z = z; + } +} diff --git a/src/main/java/twilightforest/util/VoxelBresenhamIterator.java b/src/main/java/twilightforest/util/VoxelBresenhamIterator.java new file mode 100644 index 0000000000..706a359568 --- /dev/null +++ b/src/main/java/twilightforest/util/VoxelBresenhamIterator.java @@ -0,0 +1,132 @@ +package twilightforest.util; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; + +import java.util.Iterator; + +/** Short-able voxel line placement that lazily creates BlockPos */ +public final class VoxelBresenhamIterator implements Iterator, Iterable { + private final int x_inc, y_inc, z_inc, doubleAbsDx, doubleAbsDy, doubleAbsDz, length; + private final BlockPos.MutableBlockPos voxel; + private final Direction.Axis direction; + + private int i = 0, err_1, err_2; + + public VoxelBresenhamIterator(BlockPos voxel, BlockPos towards) { + this(voxel, towards.getX(), towards.getY(), towards.getZ()); + } + + public VoxelBresenhamIterator(BlockPos voxel, final int x2, final int y2, final int z2) { + this.voxel = voxel.mutable(); + + final int x1 = this.voxel.getX(); + final int y1 = this.voxel.getY(); + final int z1 = this.voxel.getZ(); + + final int xVec = x2 - x1; + final int yVec = y2 - y1; + final int zVec = z2 - z1; + + final int absDx = Math.abs(xVec); + final int absDy = Math.abs(yVec); + final int absDz = Math.abs(zVec); + + this.x_inc = (xVec < 0) ? -1 : 1; + this.y_inc = (yVec < 0) ? -1 : 1; + this.z_inc = (zVec < 0) ? -1 : 1; + + this.doubleAbsDx = absDx << 1; + this.doubleAbsDy = absDy << 1; + this.doubleAbsDz = absDz << 1; + + if (absDx >= absDy && absDx >= absDz) { + this.err_1 = this.doubleAbsDy - absDx; + this.err_2 = this.doubleAbsDz - absDx; + + this.direction = Direction.Axis.X; + this.length = absDx + 1; + } else if (absDy >= absDx && absDy >= absDz) { + this.err_1 = this.doubleAbsDx - absDy; + this.err_2 = this.doubleAbsDz - absDy; + + this.direction = Direction.Axis.Y; + this.length = absDy + 1; + } else { + this.err_1 = this.doubleAbsDy - absDz; + this.err_2 = this.doubleAbsDx - absDz; + + this.direction = Direction.Axis.Z; + this.length = absDz + 1; + } + } + + @Override + public boolean hasNext() { + return this.i < this.length; + } + + @Override + public BlockPos next() { + final BlockPos out = this.voxel.immutable(); + + if (this.hasNext()) { + this.primeNext(); + this.i++; + } + + return out; + } + + private void primeNext() { + switch (this.direction) { + case X -> { + if (this.err_1 > 0) { + this.voxel.move(0, this.y_inc, 0); + this.err_1 -= this.doubleAbsDx; + } + if (this.err_2 > 0) { + this.voxel.move(0, 0, this.z_inc); + this.err_2 -= this.doubleAbsDx; + } + + this.err_1 += this.doubleAbsDy; + this.err_2 += this.doubleAbsDz; + this.voxel.move(this.x_inc, 0, 0); + } + case Y -> { + if (this.err_1 > 0) { + this.voxel.move(this.x_inc, 0, 0); + this.err_1 -= this.doubleAbsDy; + } + if (this.err_2 > 0) { + this.voxel.move(0, 0, this.z_inc); + this.err_2 -= this.doubleAbsDy; + } + + this.err_1 += this.doubleAbsDx; + this.err_2 += this.doubleAbsDz; + this.voxel.move(0, this.y_inc, 0); + } + case Z -> { + if (this.err_1 > 0) { + this.voxel.move(0, this.y_inc, 0); + this.err_1 -= this.doubleAbsDz; + } + if (this.err_2 > 0) { + this.voxel.move(this.x_inc, 0, 0); + this.err_2 -= this.doubleAbsDz; + } + + this.err_1 += this.doubleAbsDy; + this.err_2 += this.doubleAbsDx; + this.voxel.move(0, 0, this.z_inc); + } + } + } + + @Override + public Iterator iterator() { + return this; + } +} diff --git a/src/main/java/twilightforest/util/WoodPalette.java b/src/main/java/twilightforest/util/WoodPalette.java new file mode 100644 index 0000000000..fde3fd5dde --- /dev/null +++ b/src/main/java/twilightforest/util/WoodPalette.java @@ -0,0 +1,106 @@ +package twilightforest.util; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.StairBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; +import twilightforest.block.BanisterBlock; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.function.Supplier; + +public class WoodPalette { + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + BuiltInRegistries.BLOCK.byNameCodec().fieldOf("planks").forGetter(p -> p.planks), + BuiltInRegistries.BLOCK.byNameCodec().fieldOf("stairs").forGetter(p -> p.stairs), + BuiltInRegistries.BLOCK.byNameCodec().fieldOf("slab").forGetter(p -> p.slab), + BuiltInRegistries.BLOCK.byNameCodec().fieldOf("button").forGetter(p -> p.button), + BuiltInRegistries.BLOCK.byNameCodec().fieldOf("fence").forGetter(p -> p.fence), + BuiltInRegistries.BLOCK.byNameCodec().fieldOf("gate").forGetter(p -> p.gate), + BuiltInRegistries.BLOCK.byNameCodec().fieldOf("plate").forGetter(p -> p.plate), + BuiltInRegistries.BLOCK.byNameCodec().fieldOf("banister").forGetter(p -> p.banister) + ).apply(instance, WoodPalette::new)); + + public WoodPalette(Supplier planks, Supplier stairs, Supplier slab, Supplier button, Supplier fence, Supplier gate, Supplier plate, Supplier banister) { + this(planks.get(), stairs.get(), slab.get(), button.get(), fence.get(), gate.get(), plate.get(), banister.get()); + } + + private final Set blocks; + private final Block planks; + private final Block stairs; + private final Block slab; + private final Block button; + private final Block fence; + private final Block gate; + private final Block plate; + private final Block banister; + + public WoodPalette(Block planks, Block stairs, Block slab, Block button, Block fence, Block gate, Block plate, Block banister) { + this.planks = planks; + this.stairs = stairs; + this.slab = slab; + this.button = button; + this.fence = fence; + this.gate = gate; + this.plate = plate; + this.banister = banister; + this.blocks = new HashSet<>(List.of(this.planks, this.stairs, this.slab, this.button, this.fence, this.gate, this.plate, this.banister)); + } + + public boolean contains(Block block) { + return blocks.contains(block); + } + + public StructureTemplate.StructureBlockInfo modifyBlockWithType(WoodPalette targetPalette, StructureTemplate.StructureBlockInfo stateIn) { + BlockState state = stateIn.state; + + if (targetPalette.contains(state.getBlock())) + return new StructureTemplate.StructureBlockInfo(stateIn.pos, this.modifyBlockWithType(targetPalette, state), stateIn.nbt); + + return stateIn; + } + + public BlockState modifyBlockWithType(WoodPalette targetPalette, BlockState stateIn) { + return switch (targetPalette.getWoodShapeFromBlock(stateIn.getBlock())) { + case BLOCK -> this.planks.defaultBlockState(); + case STAIRS -> FeaturePlacers.transferAllStateKeys(stateIn, this.stairs); + case SLAB -> FeaturePlacers.transferAllStateKeys(stateIn, this.slab); + case FENCE -> FeaturePlacers.transferAllStateKeys(stateIn, this.fence); + case GATE -> FeaturePlacers.transferAllStateKeys(stateIn, this.gate); + case BUTTON -> FeaturePlacers.transferAllStateKeys(stateIn, this.button); + case PLATE -> FeaturePlacers.transferAllStateKeys(stateIn, this.plate); + case BANISTER -> FeaturePlacers.transferAllStateKeys(stateIn, this.banister); + default -> stateIn; + }; + } + + public WoodShapes getWoodShapeFromBlock(Block b) { + if (b == this.planks) return WoodShapes.BLOCK; + if (b == this.stairs) return WoodShapes.STAIRS; + if (b == this.slab) return WoodShapes.SLAB; + if (b == this.button) return WoodShapes.BUTTON; + if (b == this.fence) return WoodShapes.FENCE; + if (b == this.gate) return WoodShapes.GATE; + if (b == this.plate) return WoodShapes.PLATE; + if (b == this.banister) return WoodShapes.BANISTER; + + return WoodShapes.INVALID; + } + + public enum WoodShapes { + BLOCK, + STAIRS, + SLAB, + BUTTON, + FENCE, + GATE, + PLATE, + BANISTER, + INVALID + } +} diff --git a/src/main/java/twilightforest/util/WorldUtil.java b/src/main/java/twilightforest/util/WorldUtil.java new file mode 100644 index 0000000000..f4888ac173 --- /dev/null +++ b/src/main/java/twilightforest/util/WorldUtil.java @@ -0,0 +1,69 @@ +package twilightforest.util; + +import net.minecraft.core.BlockPos; +import net.minecraft.data.worldgen.biome.OverworldBiomes; +import net.minecraft.server.level.ServerChunkCache; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.Heightmap; +import net.minecraft.world.level.levelgen.RandomState; +import net.minecraft.world.phys.AABB; +import twilightforest.world.components.chunkgenerators.ChunkGeneratorTwilight; +import twilightforest.world.registration.TFGenerationSettings; + +import org.jetbrains.annotations.Nullable; +import java.util.Random; + +public final class WorldUtil { + private WorldUtil() {} + + /** + * Inclusive of edges + */ + public static Iterable getAllAround(BlockPos center, int range) { + return BlockPos.betweenClosed(center.offset(-range, -range, -range), center.offset(range, range, range)); + } + + /** + * Floors both corners of the bounding box to integers + * Inclusive of edges + */ + public static Iterable getAllInBB(AABB bb) { + return BlockPos.betweenClosed((int) bb.minX, (int) bb.minY, (int) bb.minZ, (int) bb.maxX, (int) bb.maxY, (int) bb.maxZ); + } + + public static BlockPos randomOffset(RandomSource random, BlockPos pos, int range) { + return randomOffset(random, pos, range, range, range); + } + + public static BlockPos randomOffset(RandomSource random, BlockPos pos, int rx, int ry, int rz) { + int dx = random.nextInt(rx * 2 + 1) - rx; + int dy = random.nextInt(ry * 2 + 1) - ry; + int dz = random.nextInt(rz * 2 + 1) - rz; + return pos.offset(dx, dy, dz); + } + + @Nullable + public static ChunkGeneratorTwilight getChunkGenerator(LevelAccessor level) { + if (level.getChunkSource() instanceof ServerChunkCache chunkSource && chunkSource.chunkMap.generator() instanceof ChunkGeneratorTwilight chunkGenerator) + return chunkGenerator; + + return null; + } + + public static int getSeaLevel(ChunkGenerator generator) { + if (generator instanceof ChunkGeneratorTwilight) { + return generator.getSeaLevel(); + } else return TFGenerationSettings.SEALEVEL; + } + + public static int getBaseHeight(LevelAccessor level, int x, int z, Heightmap.Types type) { + if (level.getChunkSource() instanceof ServerChunkCache chunkSource) { + return chunkSource.chunkMap.generator().getBaseHeight(x, z, type, level, chunkSource.randomState()); + } else { + return level.getHeight(type, x, z); + } + } +} diff --git a/src/main/java/twilightforest/util/XZQuadrantIterator.java b/src/main/java/twilightforest/util/XZQuadrantIterator.java new file mode 100644 index 0000000000..82bcdbeaba --- /dev/null +++ b/src/main/java/twilightforest/util/XZQuadrantIterator.java @@ -0,0 +1,104 @@ +package twilightforest.util; + +import org.jetbrains.annotations.NotNull; + +import java.util.Iterator; + +public class XZQuadrantIterator implements Iterator, Iterable { + private final BinaryIntegerFunction converter; + + private final int xConstant; + private final int zConstant; + private final int radius; + private final int spacing; + + private int dX = 0; + private int dZ = 1; + private int cardinal = 0; + + public XZQuadrantIterator(int xConstant, int zConstant, boolean skipCenter, int radius, int spacing, BinaryIntegerFunction converter) { + this.converter = converter; + + this.xConstant = xConstant; + this.zConstant = zConstant; + this.radius = radius; + this.spacing = spacing; + + if (!skipCenter) { + this.dZ = 0; + this.cardinal = -1; + } + } + + @Override + public boolean hasNext() { + return this.dX + 1 <= this.radius; + } + + @Override + public T next() { + if (!this.hasNext()) throw new IllegalStateException("Cannot iterate further on XZ quadrants! [" + this + "]"); + + return switch (this.cardinal) { + case 0 -> { + this.cardinal++; + yield this.generate(this.dZ * this.spacing, -this.dX * this.spacing); + } + case 1 -> { + this.cardinal++; + yield this.generate(-this.dX * this.spacing, -this.dZ * this.spacing); + } + case 2 -> { + this.cardinal++; + yield this.generate(-this.dZ * this.spacing, this.dX * this.spacing); + } + default -> { // Basically -1 or 3 + this.cardinal = 0; + T ret = this.generate(this.dX * this.spacing, this.dZ * this.spacing); + this.tickXZ(); + yield ret; + } + }; + } + + private T generate(int dX, int dZ) { + return this.converter.apply(this.xConstant + dX, this.zConstant + dZ); + } + + // Primes this iterator for next, or deadlocks its completion + private void tickXZ() { + if (!this.hasNext()) return; + + if (this.dZ < this.radius) { + this.dZ++; + } else { + this.dZ = 1; + this.dX++; + } + } + + @NotNull + @Override + public Iterator iterator() { + return this; + } + + @FunctionalInterface + public interface BinaryIntegerFunction { + T apply(int x, int z); + } + + @Override + public String toString() { + return "XZQuadrantIterator{" + + "converter=" + converter + + ", xConstant=" + xConstant + + ", zConstant=" + zConstant + + ", radius=" + radius + + ", spacing=" + spacing + + ", dX=" + dX + + ", dZ=" + dZ + + ", cardinal=" + cardinal + + '}'; + } +} diff --git a/src/main/java/twilightforest/util/package-info.java b/src/main/java/twilightforest/util/package-info.java new file mode 100644 index 0000000000..fc06d6e47b --- /dev/null +++ b/src/main/java/twilightforest/util/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.util; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/world/ChunkProviderTwilightForest.java b/src/main/java/twilightforest/world/ChunkProviderTwilightForest.java deleted file mode 100644 index f66673bf17..0000000000 --- a/src/main/java/twilightforest/world/ChunkProviderTwilightForest.java +++ /dev/null @@ -1,1137 +0,0 @@ -// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov. -// Jad home page: http://www.kpdus.com/jad.html -// Decompiler options: packimports(3) braces deadcode - -package twilightforest.world; - -import java.util.List; -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockFalling; -import net.minecraft.entity.EnumCreatureType; -import net.minecraft.init.Blocks; -import net.minecraft.util.IProgressUpdate; -import net.minecraft.util.MathHelper; -import net.minecraft.world.ChunkPosition; -import net.minecraft.world.SpawnerAnimals; -import net.minecraft.world.World; -import net.minecraft.world.WorldType; -import net.minecraft.world.biome.BiomeGenBase; -import net.minecraft.world.biome.BiomeGenBase.SpawnListEntry; -import net.minecraft.world.chunk.Chunk; -import net.minecraft.world.chunk.IChunkProvider; -import net.minecraft.world.gen.NoiseGeneratorOctaves; -import net.minecraft.world.gen.NoiseGeneratorPerlin; -import net.minecraft.world.gen.feature.WorldGenDungeons; -import net.minecraft.world.gen.feature.WorldGenLakes; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.event.terraingen.ChunkProviderEvent; -import twilightforest.TFFeature; -import twilightforest.biomes.TFBiomeBase; -import twilightforest.block.TFBlocks; -import cpw.mods.fml.common.eventhandler.Event.Result; - -// Referenced classes of package net.minecraft.src: -// IChunkProvider, MapGenCaves, MapGenStronghold, MapGenVillage, -// MapGenMineshaft, MapGenRavine, NoiseGeneratorOctaves, World, -// WorldChunkManager, Block, BiomeGenBase, Chunk, -// MapGenBase, MathHelper, BlockSand, WorldGenLakes, -// WorldGenDungeons, SpawnerAnimals, IProgressUpdate - -public class ChunkProviderTwilightForest implements IChunkProvider { - private Random rand; - //private NoiseGeneratorOctaves noiseGen1; - //private NoiseGeneratorOctaves noiseGen2; - //private NoiseGeneratorOctaves noiseGen3; - private NoiseGeneratorOctaves noiseGen4; - public NoiseGeneratorOctaves noiseGen5; - public NoiseGeneratorOctaves noiseGen6; - public NoiseGeneratorOctaves mobSpawnerNoise; - private World worldObj; - private double stoneNoise[]; - private TFGenCaves caveGenerator; - private TFGenRavine ravineGenerator; - private BiomeGenBase biomesForGeneration[]; - double noise3[]; - double noise1[]; - double noise2[]; - double noise5[]; - double noise6[]; - float squareTable[]; - int unusedIntArray32x32[][]; - - - private WorldType field_147435_p; - - private NoiseGeneratorOctaves field_147431_j; - private NoiseGeneratorOctaves field_147432_k; - private NoiseGeneratorOctaves field_147429_l; - private NoiseGeneratorPerlin field_147430_m; - - private final double[] terrainCalcs; - private final float[] parabolicField; - - double[] field_147427_d; - double[] field_147428_e; - double[] field_147425_f; - double[] field_147426_g; - int[][] field_73219_j = new int[32][32]; - - private MapGenTFMajorFeature majorFeatureGenerator; - private MapGenTFHollowTree hollowTreeGenerator; - - public ChunkProviderTwilightForest(World world, long l, boolean flag) { - stoneNoise = new double[256]; - caveGenerator = new TFGenCaves(); - - majorFeatureGenerator = new MapGenTFMajorFeature(); - hollowTreeGenerator = new MapGenTFHollowTree(); - - ravineGenerator = new TFGenRavine(); - unusedIntArray32x32 = new int[32][32]; - worldObj = world; - rand = new Random(l); - //noiseGen1 = new NoiseGeneratorOctaves(rand, 16); - //noiseGen2 = new NoiseGeneratorOctaves(rand, 16); - //noiseGen3 = new NoiseGeneratorOctaves(rand, 8); - noiseGen4 = new NoiseGeneratorOctaves(rand, 4); - noiseGen5 = new NoiseGeneratorOctaves(rand, 10); - noiseGen6 = new NoiseGeneratorOctaves(rand, 16); - mobSpawnerNoise = new NoiseGeneratorOctaves(rand, 8); - - - this.field_147435_p = world.getWorldInfo().getTerrainType(); - this.field_147431_j = new NoiseGeneratorOctaves(this.rand, 16); - this.field_147432_k = new NoiseGeneratorOctaves(this.rand, 16); - this.field_147429_l = new NoiseGeneratorOctaves(this.rand, 8); - this.field_147430_m = new NoiseGeneratorPerlin(this.rand, 4); - - this.terrainCalcs = new double[825]; - this.parabolicField = new float[25]; - - for (int j = -2; j <= 2; ++j) - { - for (int k = -2; k <= 2; ++k) - { - float f = 10.0F / MathHelper.sqrt_float((float)(j * j + k * k) + 0.2F); - this.parabolicField[j + 2 + (k + 2) * 5] = f; - } - } - } - - @Override - public Chunk provideChunk(int cx, int cz) { - rand.setSeed(cx * 0x4f9939f508L + cz * 0x1ef1565bd5L); - Block blockStorage[] = new Block[16 * 16 * TFWorld.CHUNKHEIGHT]; - byte metaStorage[] = new byte[16 * 16 * TFWorld.CHUNKHEIGHT]; - generateTerrain2(cx, cz, blockStorage); - - squishTerrain(blockStorage); - - addDarkForestCanopy2(cx, cz, blockStorage, metaStorage); - biomesForGeneration = worldObj.getWorldChunkManager().loadBlockGeneratorData(biomesForGeneration, cx * 16, cz * 16, 16, 16); - addGlaciers(cx, cz, blockStorage, metaStorage, biomesForGeneration); - deformTerrainForFeature(cx, cz, blockStorage, metaStorage); - replaceBlocksForBiome(cx, cz, blockStorage, metaStorage, biomesForGeneration); - caveGenerator.func_151539_a(this, worldObj, cx, cz, blockStorage); - ravineGenerator.func_151539_a(this, worldObj, cx, cz, blockStorage); - // fake byte array - Block[] fake = new Block[0]; - - majorFeatureGenerator.func_151539_a(this, worldObj, cx, cz, fake); - hollowTreeGenerator.func_151539_a(this, worldObj, cx, cz, fake); - - Chunk chunk = new Chunk(worldObj, blockStorage, metaStorage, cx, cz); - - // load in biomes, to prevent striping?! - byte[] chunkBiomes = chunk.getBiomeArray(); - for (int i = 0; i < chunkBiomes.length; ++i) { - chunkBiomes[i] = (byte) this.biomesForGeneration[i].biomeID; - } - - chunk.generateSkylightMap(); - - return chunk; - } - - public void generateTerrain2(int chunkX, int chunkZ, Block[] blockStorage) - { - byte seaLevel = 63; - this.biomesForGeneration = this.worldObj.getWorldChunkManager().getBiomesForGeneration(this.biomesForGeneration, chunkX * 4 - 2, chunkZ * 4 - 2, 10, 10); - this.makeLandPerBiome2(chunkX * 4, 0, chunkZ * 4); - - for (int k = 0; k < 4; ++k) - { - int l = k * 5; - int i1 = (k + 1) * 5; - - for (int j1 = 0; j1 < 4; ++j1) - { - int k1 = (l + j1) * 33; - int l1 = (l + j1 + 1) * 33; - int i2 = (i1 + j1) * 33; - int j2 = (i1 + j1 + 1) * 33; - - for (int k2 = 0; k2 < 32; ++k2) - { - double d0 = 0.125D; - double d1 = this.terrainCalcs[k1 + k2]; - double d2 = this.terrainCalcs[l1 + k2]; - double d3 = this.terrainCalcs[i2 + k2]; - double d4 = this.terrainCalcs[j2 + k2]; - double d5 = (this.terrainCalcs[k1 + k2 + 1] - d1) * d0; - double d6 = (this.terrainCalcs[l1 + k2 + 1] - d2) * d0; - double d7 = (this.terrainCalcs[i2 + k2 + 1] - d3) * d0; - double d8 = (this.terrainCalcs[j2 + k2 + 1] - d4) * d0; - - for (int l2 = 0; l2 < 8; ++l2) - { - double d9 = 0.25D; - double d10 = d1; - double d11 = d2; - double d12 = (d3 - d1) * d9; - double d13 = (d4 - d2) * d9; - - for (int i3 = 0; i3 < 4; ++i3) - { - int j3 = i3 + k * 4 << 12 | 0 + j1 * 4 << 8 | k2 * 8 + l2; - short short1 = 256; - j3 -= short1; - double d14 = 0.25D; - double d16 = (d11 - d10) * d14; - double d15 = d10 - d16; - - for (int k3 = 0; k3 < 4; ++k3) - { - if ((d15 += d16) > 0.0D) - { - blockStorage[j3 += short1] = Blocks.stone; - } - else if (k2 * 8 + l2 < seaLevel) - { - blockStorage[j3 += short1] = Blocks.water; - } - else - { - blockStorage[j3 += short1] = null; - } - } - - d10 += d12; - d11 += d13; - } - - d1 += d5; - d2 += d6; - d3 += d7; - d4 += d8; - } - } - } - } - } - - private void makeLandPerBiome2(int x, int zero, int z) - { - - this.field_147426_g = this.noiseGen6.generateNoiseOctaves(this.field_147426_g, x, z, 5, 5, 200.0D, 200.0D, 0.5D); - this.field_147427_d = this.field_147429_l.generateNoiseOctaves(this.field_147427_d, x, zero, z, 5, 33, 5, 8.555150000000001D, 4.277575000000001D, 8.555150000000001D); - this.field_147428_e = this.field_147431_j.generateNoiseOctaves(this.field_147428_e, x, zero, z, 5, 33, 5, 684.412D, 684.412D, 684.412D); - this.field_147425_f = this.field_147432_k.generateNoiseOctaves(this.field_147425_f, x, zero, z, 5, 33, 5, 684.412D, 684.412D, 684.412D); - int terrainIndex = 0; - int noiseIndex = 0; - - for (int ax = 0; ax < 5; ++ax) - { - for (int az = 0; az < 5; ++az) - { - float totalVariation = 0.0F; - float totalHeight = 0.0F; - float totalFactor = 0.0F; - byte two = 2; - BiomeGenBase biomegenbase = this.biomesForGeneration[ax + 2 + (az + 2) * 10]; - - for (int ox = -two; ox <= two; ++ox) - { - for (int oz = -two; oz <= two; ++oz) - { - BiomeGenBase biomegenbase1 = this.biomesForGeneration[ax + ox + 2 + (az + oz + 2) * 10]; - float rootHeight = biomegenbase1.rootHeight; - float heightVariation = biomegenbase1.heightVariation; - - if (this.field_147435_p == WorldType.AMPLIFIED && rootHeight > 0.0F) - { - rootHeight = 1.0F + rootHeight * 2.0F; - heightVariation = 1.0F + heightVariation * 4.0F; - } - - float heightFactor = this.parabolicField[ox + 2 + (oz + 2) * 5] / (rootHeight + 2.0F); - - if (biomegenbase1.rootHeight > biomegenbase.rootHeight) - { - heightFactor /= 2.0F; - } - - totalVariation += heightVariation * heightFactor; - totalHeight += rootHeight * heightFactor; - totalFactor += heightFactor; - } - } - - totalVariation /= totalFactor; - totalHeight /= totalFactor; - totalVariation = totalVariation * 0.9F + 0.1F; - totalHeight = (totalHeight * 4.0F - 1.0F) / 8.0F; - double terrainNoise = this.field_147426_g[noiseIndex] / 8000.0D; - - if (terrainNoise < 0.0D) - { - terrainNoise = -terrainNoise * 0.3D; - } - - terrainNoise = terrainNoise * 3.0D - 2.0D; - - if (terrainNoise < 0.0D) - { - terrainNoise /= 2.0D; - - if (terrainNoise < -1.0D) - { - terrainNoise = -1.0D; - } - - terrainNoise /= 1.4D; - terrainNoise /= 2.0D; - } - else - { - if (terrainNoise > 1.0D) - { - terrainNoise = 1.0D; - } - - terrainNoise /= 8.0D; - } - - ++noiseIndex; - double heightCalc = (double)totalHeight; - double variationCalc = (double)totalVariation; - heightCalc += terrainNoise * 0.2D; - heightCalc = heightCalc * 8.5D / 8.0D; - double d5 = 8.5D + heightCalc * 4.0D; - - for (int ay = 0; ay < 33; ++ay) - { - double d6 = ((double)ay - d5) * 12.0D * 128.0D / 256.0D / variationCalc; - - if (d6 < 0.0D) - { - d6 *= 4.0D; - } - - double d7 = this.field_147428_e[terrainIndex] / 512.0D; - double d8 = this.field_147425_f[terrainIndex] / 512.0D; - double d9 = (this.field_147427_d[terrainIndex] / 10.0D + 1.0D) / 2.0D; - double terrainCalc = MathHelper.denormalizeClamp(d7, d8, d9) - d6; - - if (ay > 29) - { - double d11 = (double)((float)(ay - 29) / 3.0F); - terrainCalc = terrainCalc * (1.0D - d11) + -10.0D * d11; - } - - this.terrainCalcs[terrainIndex] = terrainCalc; - ++terrainIndex; - } - } - } - } - - - - /** - * Crush the terrain to half the height - */ - private void squishTerrain(Block[] blockStorage) { - int squishHeight = TFWorld.MAXHEIGHT / 2; - - for (int x = 0; x < 16; x++) { - for (int z = 0; z < 16; z++) { - for (int y = 0; y < TFWorld.CHUNKHEIGHT; y++) { - int index = x * TFWorld.CHUNKHEIGHT * 16 | z * TFWorld.CHUNKHEIGHT | y; - - if (y < squishHeight) { - int twiceIndex = x * TFWorld.CHUNKHEIGHT * 16 | z * TFWorld.CHUNKHEIGHT | (y * 2 + 1); - blockStorage[index] = blockStorage[twiceIndex]; - } else { - blockStorage[index] = Blocks.air; - } - } - } - } - } - - /** - * Replaces the stone that was placed in with blocks that match the biome - */ - public void replaceBlocksForBiome(int chunkX, int chunkZ, Block[] blockStorage, byte[] metaStorage, BiomeGenBase[] biomes) - { - ChunkProviderEvent.ReplaceBiomeBlocks event = new ChunkProviderEvent.ReplaceBiomeBlocks(this, chunkX, chunkZ, blockStorage, biomes); - MinecraftForge.EVENT_BUS.post(event); - if (event.getResult() == Result.DENY) return; - - double d0 = 0.03125D; - this.stoneNoise = this.field_147430_m.func_151599_a(this.stoneNoise, (double)(chunkX * 16), (double)(chunkZ * 16), 16, 16, d0 * 2.0D, d0 * 2.0D, 1.0D); - - for (int z = 0; z < 16; ++z) - { - for (int x = 0; x < 16; ++x) - { - BiomeGenBase biomegenbase = biomes[x + z * 16]; - biomegenbase.genTerrainBlocks(this.worldObj, this.rand, blockStorage, metaStorage, chunkX * 16 + z, chunkZ * 16 + x, this.stoneNoise[x + z * 16]); - } - } - } - - @Override - public Chunk loadChunk(int i, int j) { - return provideChunk(i, j); - } - - /** - * Raises up and hollows out the hollow hills. - * - * @param cx - * @param cz - * @param blockStorage - * @param metaStorage - */ - public void deformTerrainForFeature(int cx, int cz, Block[] blockStorage, byte[] metaStorage) { - // what feature are we near? - TFFeature nearFeature = TFFeature.getNearestFeature(cx, cz, worldObj); - if (!nearFeature.isTerrainAltered) { - // well that was easy. - return; - } - - int[] nearCenter = TFFeature.getNearestCenter(cx, cz, worldObj); - - int hx = nearCenter[0]; - int hz = nearCenter[1]; - - if (nearFeature == TFFeature.trollCave) { - // troll cloud, more like - deformTerrainForTrollCloud2(blockStorage, metaStorage, nearFeature, cx, cz, hx, hz); - } - - for (int x = 0; x < 16; x++) { - for (int z = 0; z < 16; z++) { - int dx = x - hx; - int dz = z - hz; - - if (nearFeature == TFFeature.hill1 || nearFeature == TFFeature.hill2 || nearFeature == TFFeature.hill3 || nearFeature == TFFeature.hydraLair) { - // hollow hills - int hdiam = ((nearFeature.size * 2 + 1) * 16); - int dist = (int) Math.sqrt(dx * dx + dz * dz); - int hheight = (int) (Math.cos((float)dist / (float)hdiam * Math.PI) * ((float)hdiam / 3F)); - - raiseHills(blockStorage, nearFeature, hdiam, x, z, dx, dz, hheight); - } else if (nearFeature == TFFeature.hedgeMaze || nearFeature == TFFeature.nagaCourtyard || nearFeature == TFFeature.questGrove) { - // hedge mazes, naga arena - flattenTerrainForFeature(blockStorage, nearFeature, x, z, dx, dz); - } else if (nearFeature == TFFeature.yetiCave) { - // yeti lairs are square - deformTerrainForYetiLair(blockStorage, nearFeature, x, z, dx, dz); - } else if (nearFeature == TFFeature.trollCave) { - // troll cloud, more like - //deformTerrainForTrollCloud(blockStorage, metaStorage, nearFeature, x, z, dx, dz); - } - } - } - - // done! - } - - private void raiseHills(Block[] storage, TFFeature nearFeature, int hdiam, int x, int z, int dx, int dz, int hillHeight) { - int newGround = -1; - boolean foundGroundLevel = false; - - // raise the hill - for (int y = 0; y < TFWorld.CHUNKHEIGHT; y++) { - int index = x * TFWorld.CHUNKHEIGHT * 16 | z * TFWorld.CHUNKHEIGHT | y; - Block currentTerrain = storage[index]; - if (currentTerrain != Blocks.stone && !foundGroundLevel) { - // we found the top of the stone layer - newGround = y + hillHeight; - - foundGroundLevel = true; - } - if (foundGroundLevel && y <= newGround) { - storage[index] = Blocks.stone; - } - } - // add the hollow part. Also turn water into stone below that - int hollow = hillHeight - 4 - nearFeature.size; - - // hydra lair has a piece missing - if (nearFeature == TFFeature.hydraLair) { - int mx = dx + 16; - int mz = dz + 16; - int mdist = (int) Math.sqrt(mx * mx + mz * mz); - int mheight = (int) (Math.cos(mdist / (hdiam / 1.5) * Math.PI) * (hdiam / 1.5)); - - hollow = Math.max(mheight - 4, hollow); - } - - if (hollow < 0) { - hollow = 0; - } - - for (int y = 0; y < TFWorld.CHUNKHEIGHT; y++) { - int index = x * TFWorld.CHUNKHEIGHT * 16 | z * TFWorld.CHUNKHEIGHT | y; - // put a base on hills that go over open space or water - if (hillHeight > 0 && y < TFWorld.SEALEVEL && storage[index] != Blocks.stone) { - storage[index] = Blocks.stone; - } - // hollow out the hollow parts - int hollowFloor = TFWorld.SEALEVEL - 3 - (hollow / 8); - if (nearFeature == TFFeature.hydraLair) { - // different floor - hollowFloor = TFWorld.SEALEVEL; - } - if (y > hollowFloor && y < hollowFloor + hollow) { - storage[index] = Blocks.air; - } - } - } - - private void flattenTerrainForFeature(Block[] storage, TFFeature nearFeature, int x, int z, int dx, int dz) { - int oldGround; - int newGround; - float squishfactor = 0; - int mazeheight = TFWorld.SEALEVEL + 1; - int FEATUREBOUNDRY = (nearFeature.size * 2 + 1) * 8 - 8; - - if (dx <= -FEATUREBOUNDRY) { - squishfactor = (-dx - FEATUREBOUNDRY) / 8.0f; - } - - if (dx >= FEATUREBOUNDRY) { - squishfactor = (dx - FEATUREBOUNDRY) / 8.0f; - } - if (dz <= -FEATUREBOUNDRY) { - squishfactor = Math.max(squishfactor, (-dz - FEATUREBOUNDRY) / 8.0f); - } - - if (dz >= FEATUREBOUNDRY) { - squishfactor = Math.max(squishfactor, (dz - FEATUREBOUNDRY) / 8.0f); - } - - if (squishfactor > 0) { - // blend the old terrain height to arena height - newGround = -1; - - for (int y = 0; y <= 127; y++) { - int index = (x * 16 + z) * TFWorld.CHUNKHEIGHT + y; - Block currentTerrain = storage[index]; - if (currentTerrain == Blocks.stone) { - // we're still in ground - continue; - } else { - if (newGround == -1) { - // we found the lowest chunk of earth - oldGround = y; - mazeheight += ((oldGround - mazeheight) * squishfactor); - - newGround = oldGround; - } - } - } - } - - // sets the groundlevel to the mazeheight - for (int y = 0; y <= 127; y++) { - int index = (x * 16 + z) * TFWorld.CHUNKHEIGHT + y; - if (y < mazeheight && (storage[index] == Blocks.air || storage[index] == Blocks.water)) { - storage[index] = Blocks.stone; - } - if (y >= mazeheight && storage[index] != Blocks.water) { - storage[index] = Blocks.air; - } - } - } - - private void deformTerrainForYetiLair(Block[] storage, TFFeature nearFeature, int x, int z, int dx, int dz) { - int oldGround; - int newGround; - float squishfactor = 0; - int topHeight = TFWorld.SEALEVEL + 24; - int outerBoundry = (nearFeature.size * 2 + 1) * 8 - 8; - - // outer boundry - if (dx <= -outerBoundry) { - squishfactor = (-dx - outerBoundry) / 8.0f; - } - - if (dx >= outerBoundry) { - squishfactor = (dx - outerBoundry) / 8.0f; - } - if (dz <= -outerBoundry) { - squishfactor = Math.max(squishfactor, (-dz - outerBoundry) / 8.0f); - } - - if (dz >= outerBoundry) { - squishfactor = Math.max(squishfactor, (dz - outerBoundry) / 8.0f); - } - - // inner boundry - int caveBoundry = (nearFeature.size * 2) * 8 - 8; - int hollowCeiling = TFWorld.SEALEVEL + 16; - - int offset = Math.min(Math.abs(dx), Math.abs(dz)); - hollowCeiling = (TFWorld.SEALEVEL + 40) - (offset * 4); - - // center square cave - if (dx >= -caveBoundry && dz >= -caveBoundry && dx <= caveBoundry && dz <= caveBoundry) { - hollowCeiling = TFWorld.SEALEVEL + 16; - } - - // slope ceiling slightly - hollowCeiling -= (offset / 6); - - // max out ceiling 8 blocks from roof - hollowCeiling = Math.min(hollowCeiling, TFWorld.SEALEVEL + 16); - - // floor, also with slight slope - int hollowFloor = TFWorld.SEALEVEL - 1 + (offset / 6); - - if (squishfactor > 0) { - // blend the old terrain height to arena height - newGround = -1; - - for (int y = 0; y <= 127; y++) { - int index = (x * 16 + z) * TFWorld.CHUNKHEIGHT + y; - Block currentTerrain = storage[index]; - if (currentTerrain == Blocks.stone) { - // we're still in ground - continue; - } else { - if (newGround == -1) { - // we found the lowest chunk of earth - oldGround = y; - topHeight += ((oldGround - topHeight) * squishfactor); - - hollowFloor += ((oldGround - hollowFloor) * squishfactor); - - newGround = oldGround; - } - } - } - } - - // carve the cave into the stone - for (int y = 0; y <= 127; y++) { - int index = (x * 16 + z) * TFWorld.CHUNKHEIGHT + y; - - // add stone - if (y < topHeight && (storage[index] == null || storage[index] == Blocks.air || storage[index] == Blocks.water)) { - storage[index] = Blocks.stone; - } - - // hollow out inside - if (y > hollowFloor && y < hollowCeiling) { - storage[index] = Blocks.air; - } - - // ice floor - if (y == hollowFloor && y < hollowCeiling && y < TFWorld.SEALEVEL + 3) { - storage[index] = Blocks.packed_ice; - } - } - } - - private void deformTerrainForTrollCloud(Block[] storage, byte[] metaStorage, TFFeature nearFeature, int x, int z, int dx, int dz) { - int y = 164; - - int index = (x * 16 + z) * TFWorld.CHUNKHEIGHT + y; - - - // make 4x4 blocks of cloud - - int bx = dx >> 2; - int bz = dz >> 2; - - - double dist = Math.sqrt(bx * bx + bz * bz); - - float pr = pseudoRand(x >> 2, z >> 2); - - //System.out.println("pr = " + pr + ", /18 = " + (dist / 18F)); - System.out.println("pr = " + pr + ", dist = " + dist + "dx = " + dx + " dz = " + dz); - - double cv = (dist - 9F) - (pr * 4F); - - if (dist < 9 || cv < 0.05F) { - storage[index] = Blocks.stained_glass; - storage[index - 1] = Blocks.quartz_block; - storage[index - 2] = Blocks.quartz_block; - storage[index - 3] = Blocks.quartz_block; - storage[index - 4] = Blocks.stained_glass; - } else if (dist < 10 || cv < 1F) { - storage[index - 1] = Blocks.stained_glass; - storage[index - 2] = Blocks.stained_glass; - storage[index - 3] = Blocks.stained_glass; - } - - } - - - private void deformTerrainForTrollCloud2(Block[] storage, byte[] metaStorage, TFFeature nearFeature, int cx, int cz, int hx, int hz) { - for (int bx = 0; bx < 4; bx++) { - for (int bz = 0; bz < 4; bz++) { - int dx = (bx * 4) - hx - 2; - int dz = (bz * 4) - hz - 2; - - // generate several centers for other clouds - int regionX = (cx + 8) >> 4; - int regionZ = (cx + 8) >> 4; - - long seed = (long)(regionX * 3129871) ^ (long)regionZ * 116129781L; - seed = seed * seed * 42317861L + seed * 7L; - - int num0 = (int) (seed >> 12 & 3L); - int num1 = (int) (seed >> 15 & 3L); - int num2 = (int) (seed >> 18 & 3L); - int num3 = (int) (seed >> 21 & 3L); - int num4 = (int) (seed >> 9 & 3L); - int num5 = (int) (seed >> 6 & 3L); - int num6 = (int) (seed >> 3 & 3L); - int num7 = (int) (seed >> 0 & 3L); - - int dx2 = dx + (num0 * 5) - (num1 * 4); - int dz2 = dz + (num2 * 4) - (num3 * 5); - int dx3 = dx + (num4 * 5) - (num5 * 4); - int dz3 = dz + (num6 * 4) - (num7 * 5); - - // take the minimum distance to any center - double dist0 = Math.sqrt(dx * dx + dz * dz) / 4.0; - double dist2 = Math.sqrt(dx2 * dx2 + dz2 * dz2) / 3.5; - double dist3 = Math.sqrt(dx3 * dx3 + dz3 * dz3) / 4.5; - - double dist = Math.min(dist0, Math.min(dist2, dist3)); - - // make a random float - float pr = worldObj.rand.nextFloat(); - double cv = (dist - 7F) - (pr * 3.0F); - - //System.out.println("pr = " + pr + ", dist = " + dist + ", dx = " + dx + ", dz = " + dz); - - // randomize depth and height - int y = 166; - int depth = 4; - - if (pr < 0.1F) { - y++; - } - if (pr > 0.6F) { - depth++; - } - if (pr > 0.9F) { - depth++; - } - - // generate cloud - for (int sx = 0; sx < 4; sx++) { - for (int sz = 0; sz < 4; sz++) { - int index = ((bx * 4 + sx) * 16 + (bz * 4 + sz)) * TFWorld.CHUNKHEIGHT + y; - - if (dist < 7 || cv < 0.05F) { - storage[index] = TFBlocks.wispyCloud; - for (int d = 1; d < depth; d++) { - storage[index - d] = TFBlocks.fluffyCloud; - } - storage[index - depth] = TFBlocks.wispyCloud; - } else if (dist < 8 || cv < 1F) { - for (int d = 1; d < depth; d++) { - storage[index - d] = TFBlocks.wispyCloud; - } - } - } - } - } - } - } - - private float pseudoRand(int bx, int bz) { - Random rand = new Random(this.worldObj.getSeed() + (bx * 321534781) ^ (bz * 756839)); - rand.setSeed(rand.nextLong()); - return rand.nextFloat(); - } - - /** - * Adds glaciers onto the map - * - * @param chunkX - * @param chunkZ - * @param blocks - */ - public void addGlaciers(int chunkX, int chunkZ, Block blocks[], byte meta[], BiomeGenBase biomes[]) { - for (int z = 0; z < 16; z++) { - for (int x = 0; x < 16; x++) { - BiomeGenBase biome = biomes[x & 15 | (z & 15) << 4]; - if (biome == TFBiomeBase.glacier) { - // find the (current) top block - int topLevel = -1; - for (int y = 127; y >= 0; y--) { - // look at where we are - int index = x * TFWorld.CHUNKHEIGHT * 16 | z * TFWorld.CHUNKHEIGHT | y; - Block currentBlock = blocks[index]; - if (currentBlock == Blocks.stone) { - topLevel = y; - // make that block gravel - blocks[index] = Blocks.gravel; - break; - } - } - - // raise the glacier from that top block - int gHeight = 32; - int gTop = topLevel + gHeight + 1; - - for (int y = topLevel + 1; y <= gTop && y < 128; y++) { - int index = x * TFWorld.CHUNKHEIGHT * 16 | z * TFWorld.CHUNKHEIGHT | y; - blocks[index] = Blocks.ice; - } - } - } - } - } - - /** - * Adds dark forest canopy. This version uses the "unzoomed" array of biomes used in land generation to determine how many of the nearby blocks are dark forest - */ - public void addDarkForestCanopy2(int chunkX, int chunkZ, Block blocks[], byte meta[]) { - - - int[] thicks = new int[5 * 5]; - - for (int z = 0; z < 5; z++) { - for (int x = 0; x < 5; x++) { - - for (int bx = -1 ; bx <= 1; bx++) { - for (int bz = -1; bz <= 1; bz++) { - BiomeGenBase biome = biomesForGeneration[x + bx + 2 + (z + bz + 2) * (10)]; - - if (biome == TFBiomeBase.darkForest || biome == TFBiomeBase.darkForestCenter) { - thicks[x + z * 5]++; - } - } - } - } - } - - - for (int z = 0; z < 16; z++) { - for (int x = 0; x < 16; x++) { - - int qx = x / 4; - int qz = z / 4; - - float xweight = (x % 4) * 0.25F + 0.125F; - float zweight = (z % 4) * 0.25F + 0.125F; - - float thickness = 0; - - thickness += thicks[qx + (qz) * 5] * (1F - xweight) * (1F - zweight); - thickness += thicks[qx + 1 + (qz) * 5] * (xweight) * (1F - zweight); - thickness += thicks[qx + (qz + 1) * 5] * (1F - xweight) * (zweight); - thickness += thicks[qx + 1 + (qz + 1) * 5] * (xweight) * (zweight); - - thickness -= 4; - - //int thickness = thicks[qz + (qz) * 5]; - - - - - - // make sure we're not too close to the tower - TFFeature nearFeature = TFFeature.getNearestFeature(chunkX, chunkZ, worldObj); - if (nearFeature == TFFeature.darkTower) { - // check for closeness - int[] nearCenter = TFFeature.getNearestCenter(chunkX, chunkZ, worldObj); - int hx = nearCenter[0]; - int hz = nearCenter[1]; - - int dx = x - hx; - int dz = z - hz; - int dist = (int) Math.sqrt(dx * dx + dz * dz); - - if (dist < 24) { - - thickness -= (24 - dist); - } - } - - boolean generateForest = thickness > 1; - - - if (generateForest) { - double d = 0.03125D; - stoneNoise = noiseGen4.generateNoiseOctaves(stoneNoise, chunkX * 16, chunkZ * 16, 0, 16, 16, 1, d * 2D, d * 2D, d * 2D); - - // find the (current) top block - int topLevel = -1; - for (int y = 127; y >= 0; y--) { - // look at where we are - int index = x * TFWorld.CHUNKHEIGHT * 16 | z * TFWorld.CHUNKHEIGHT | y; - // int index = (x * 16 + z) * 128 + y; - Block currentBlock = blocks[index]; - if (currentBlock == Blocks.water) { - // don't generate over water - break; - } - if (currentBlock == Blocks.stone) { - topLevel = y; - break; - } - } - - if (topLevel != -1) { - // just use the same noise generator as the terrain uses - // for stones - int noise = Math.min(3, (int) (stoneNoise[z & 15 | (x & 15) << 4] / 1.25f)); - - // manipulate top and bottom - int treeBottom = topLevel + 12 - (int)(thickness * 0.5F); - int treeTop = treeBottom + (int)(thickness * 1.5F); - - treeBottom -= noise; - - for (int y = treeBottom; y < treeTop; y++) { - int index = x * TFWorld.CHUNKHEIGHT * 16 | z * TFWorld.CHUNKHEIGHT | y; - blocks[index] = TFBlocks.darkleaves; - meta[index] = (byte) 0; - } - } - } - } - } - } - - @Override - public boolean chunkExists(int i, int j) { - return true; - } - - // int chunksGenerated = 0; - // long totalTime = 0; - - @Override - public void populate(IChunkProvider ichunkprovider, int chunkX, int chunkZ) { - //long startTime = System.nanoTime(); - - BlockFalling.fallInstantly = true; - int mapX = chunkX * 16; - int mapY = chunkZ * 16; - - BiomeGenBase biomeGen = worldObj.getBiomeGenForCoords(mapX + 16, mapY + 16); - - rand.setSeed(worldObj.getSeed()); - long l1 = (rand.nextLong() / 2L) * 2L + 1L; - long l2 = (rand.nextLong() / 2L) * 2L + 1L; - rand.setSeed(chunkX * l1 + chunkZ * l2 ^ worldObj.getSeed()); - - boolean disableFeatures = false; - - disableFeatures |= this.majorFeatureGenerator.generateStructuresInChunk(worldObj, rand, chunkX, chunkZ); - disableFeatures |= !TFFeature.getNearestFeature(chunkX, chunkZ, worldObj).areChunkDecorationsEnabled; - - hollowTreeGenerator.generateStructuresInChunk(worldObj, rand, chunkX, chunkZ); - - if (!disableFeatures && rand.nextInt(4) == 0 && biomeGen.theBiomeDecorator.generateLakes) { - int i1 = mapX + rand.nextInt(16) + 8; - int i2 = rand.nextInt(TFWorld.CHUNKHEIGHT); - int i3 = mapY + rand.nextInt(16) + 8; - (new WorldGenLakes(Blocks.water)).generate(worldObj, rand, i1, i2, i3); - } - - if (!disableFeatures && rand.nextInt(32) == 0) // reduced from 8 - { - int j1 = mapX + rand.nextInt(16) + 8; - int j2 = rand.nextInt(rand.nextInt(TFWorld.CHUNKHEIGHT - 8) + 8); - int j3 = mapY + rand.nextInt(16) + 8; - if (j2 < TFWorld.SEALEVEL || rand.nextInt(10) == 0) { - (new WorldGenLakes(Blocks.lava)).generate(worldObj, rand, j1, j2, j3); - } - } - for (int k1 = 0; k1 < 8; k1++) { - int k2 = mapX + rand.nextInt(16) + 8; - int k3 = rand.nextInt(TFWorld.CHUNKHEIGHT); - int l3 = mapY + rand.nextInt(16) + 8; - (new WorldGenDungeons()).generate(worldObj, rand, k2, k3, l3); - } - - biomeGen.decorate(worldObj, rand, mapX, mapY); - SpawnerAnimals.performWorldGenSpawning(worldObj, biomeGen, mapX + 8, mapY + 8, 16, 16, rand); - mapX += 8; - mapY += 8; - for (int i2 = 0; i2 < 16; i2++) { - for (int j3 = 0; j3 < 16; j3++) { - int j4 = worldObj.getPrecipitationHeight(mapX + i2, mapY + j3); - if (worldObj.isBlockFreezable(i2 + mapX, j4 - 1, j3 + mapY)) { - worldObj.setBlock(i2 + mapX, j4 - 1, j3 + mapY, Blocks.ice, 0, 2); - } - if (worldObj.func_147478_e(i2 + mapX, j4, j3 + mapY, true)) { - worldObj.setBlock(i2 + mapX, j4, j3 + mapY, Blocks.snow_layer, 0, 2); - } - } - } - - BlockFalling.fallInstantly = false; - - // long endTime = System.nanoTime(); - // long chunkTime = (endTime - startTime); - // - // System.out.println("Generated a chunk in " + chunkTime + - // " nanoseconds."); - // - // this.totalTime += chunkTime; - // this.chunksGenerated++; - // - // System.out.println("Generated " + chunksGenerated + - // " chunks in avg. " + (totalTime / chunksGenerated) + " nanos or " + - // ((int)( (totalTime / chunksGenerated / 1000000))) + " millis."); - } - - @Override - public boolean saveChunks(boolean flag, IProgressUpdate iprogressupdate) { - return true; - } - - @Override - public boolean canSave() { - return true; - } - - @Override - public String makeString() { - return "TwilightLevelSource"; - } - - /** - * Returns a list of creatures of the specified type that can spawn at the - * given location. - * - * Twilight Forest varient! First check features, then only if we're not in - * a feature, check the biome. - */ - @SuppressWarnings("unchecked") - @Override - public List getPossibleCreatures(EnumCreatureType creatureType, int mapX, int mapY, int mapZ) { - // are the specified coordinates precicely in a feature? - TFFeature nearestFeature = TFFeature.getFeatureForRegion(mapX >> 4, mapZ >> 4, worldObj); - - if (nearestFeature != TFFeature.nothing) { - // if the feature is already conquered, no spawns - if (this.isStructureConquered(mapX, mapY, mapZ)) { - return null; - } - - // check the precise coords. - int spawnListIndex = this.majorFeatureGenerator.getSpawnListIndexAt(mapX, mapY, mapZ); - if (spawnListIndex >= 0) { - return nearestFeature.getSpawnableList(creatureType, spawnListIndex); - } - } - - BiomeGenBase biome = worldObj.getBiomeGenForCoords(mapX, mapZ); - - if (biome == null) { - return null; - } else if (mapY < TFWorld.SEALEVEL && creatureType == EnumCreatureType.monster && biome instanceof TFBiomeBase) { - // cave monsters! - return ((TFBiomeBase)biome).getUndergroundSpawnableList(); - } else { - return biome.getSpawnableList(creatureType); - } - } - - /** - * Is the block specified part of a structure bounding box? - */ - public boolean isBlockInStructureBB(int mapX, int mapY, int mapZ) { - return this.majorFeatureGenerator.hasStructureAt(mapX, mapY, mapZ); - } - - /** - * Find the structure at x, y, z, and set the "isConquered" flag - */ - public void setStructureConquered(int mapX, int mapY, int mapZ, boolean flag) { - this.majorFeatureGenerator.setStructureConquered(mapX, mapY, mapZ, flag); - } - - public StructureBoundingBox getSBBAt(int mapX, int mapY, int mapZ) { - return this.majorFeatureGenerator.getSBBAt(mapX, mapY, mapZ); - } - - public boolean isBlockProtected(int x, int y, int z) { - return this.majorFeatureGenerator.isBlockProtectedAt(x, y, z); - } - - public boolean isStructureConquered(int mapX, int mapY, int mapZ) { - return this.majorFeatureGenerator.isStructureConquered(mapX, mapY, mapZ); - } - - public boolean isStructureLocked(int mapX, int mapY, int mapZ, int lockIndex) { - return this.majorFeatureGenerator.isStructureLocked(mapX, mapY, mapZ, lockIndex); - } - - - public boolean isBlockInFullStructure(int x, int z) { - return this.majorFeatureGenerator.isBlockInFullStructure(x, z); - } - - public boolean isBlockNearFullStructure(int x, int z, int range) { - return this.majorFeatureGenerator.isBlockNearFullStructure(x, z, range); - } - - public StructureBoundingBox getFullSBBAt(int mapX, int mapZ) { - return this.majorFeatureGenerator.getFullSBBAt(mapX, mapZ); - } - - - public StructureBoundingBox getFullSBBNear(int mapX, int mapZ, int range) { - return this.majorFeatureGenerator.getFullSBBNear(mapX, mapZ, range); - - } - - @Override - public int getLoadedChunkCount() { - return 0; - } - - @Override - public void recreateStructures(int var1, int var2) { - majorFeatureGenerator.func_151539_a(this, worldObj, var1, var2, (Block[]) null); - hollowTreeGenerator.func_151539_a(this, worldObj, var1, var2, (Block[]) null); - } - - @Override - public boolean unloadQueuedChunks() { - return false; - } - - @Override - public void saveExtraData() { - } - - @Override - public ChunkPosition func_147416_a(World var1, String var2, int var3, - int var4, int var5) { - return null; - } - -} diff --git a/src/main/java/twilightforest/world/MapGenTFHollowTree.java b/src/main/java/twilightforest/world/MapGenTFHollowTree.java deleted file mode 100644 index 9da8a94a8d..0000000000 --- a/src/main/java/twilightforest/world/MapGenTFHollowTree.java +++ /dev/null @@ -1,118 +0,0 @@ -package twilightforest.world; - -import java.util.Arrays; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Random; -import java.util.concurrent.Callable; - -import net.minecraft.block.Block; -import net.minecraft.crash.CrashReport; -import net.minecraft.crash.CrashReportCategory; -import net.minecraft.util.ReportedException; -import net.minecraft.world.ChunkCoordIntPair; -import net.minecraft.world.ChunkPosition; -import net.minecraft.world.World; -import net.minecraft.world.biome.BiomeGenBase; -import net.minecraft.world.gen.MapGenBase; -import net.minecraft.world.gen.structure.MapGenStructure; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import net.minecraft.world.gen.structure.StructureComponent; -import net.minecraft.world.gen.structure.StructureStart; -import twilightforest.TFFeature; -import twilightforest.TwilightForestMod; -import twilightforest.biomes.TFBiomeBase; -import twilightforest.structures.hollowtree.StructureTFHollowTreeStart; - - -public class MapGenTFHollowTree extends MapGenBase { - - //public static final int SPAWN_CHANCE = 48; - /** - * Used to store a list of all structures that have been recursively generated. Used so that during recursive - * generation, the structure generator can avoid generating structures that intersect ones that have already been - * placed. - */ - protected Map structureMap = new HashMap(); - - /** - * Generate recursively - */ - protected void func_151538_a(World world, final int chunkX, final int chunkZ, int centerX, int centerZ, Block[] blockData) { - if (!this.structureMap.containsKey(Long.valueOf(ChunkCoordIntPair.chunkXZ2Int(chunkX, chunkZ)))){ - this.rand.nextInt(); - - try { - if (this.canSpawnStructureAtCoords(chunkX, chunkZ)){ - StructureStart structurestart = this.getStructureStart(chunkX, chunkZ); - this.structureMap.put(Long.valueOf(ChunkCoordIntPair.chunkXZ2Int(chunkX, chunkZ)), structurestart); - } - } catch (Throwable throwable) { - CrashReport crashreport = CrashReport.makeCrashReport(throwable, "Exception preparing hollow tree"); - CrashReportCategory crashreportcategory = crashreport.makeCategory("Feature being prepared"); - crashreportcategory.addCrashSectionCallable("Is feature chunk", new Callable() { - private static final String __OBFID = "CL_00000506"; - public String call() { - return MapGenTFHollowTree.this.canSpawnStructureAtCoords(chunkX, chunkZ) ? "True" : "False"; - } - }); - crashreportcategory.addCrashSection("Chunk location", String.format("%d,%d", new Object[] {Integer.valueOf(chunkX), Integer.valueOf(chunkZ)})); - crashreportcategory.addCrashSectionCallable("Chunk pos hash", new Callable() { - private static final String __OBFID = "CL_00000507"; - public String call() { - return String.valueOf(ChunkCoordIntPair.chunkXZ2Int(chunkX, chunkZ)); - } - }); - crashreportcategory.addCrashSectionCallable("Structure type", new Callable() { - private static final String __OBFID = "CL_00000508"; - public String call() { - return MapGenTFHollowTree.this.getClass().getCanonicalName(); - } - }); - throw new ReportedException(crashreport); - } - } - - - - } - - - public boolean generateStructuresInChunk(World world, Random rand, int chunkX, int chunkZ) { - int mapX = (chunkX << 4) + 8; - int mapZ = (chunkZ << 4) + 8; - boolean flag = false; - - Iterator iterator = this.structureMap.values().iterator(); - - while (iterator.hasNext()) - { - StructureStart structurestart = iterator.next(); - - if (structurestart.isSizeableStructure() && structurestart.getBoundingBox().intersectsWith(mapX, mapZ, mapX + 15, mapZ + 15)) - { - structurestart.generateStructure(world, rand, new StructureBoundingBox(mapX, mapZ, mapX + 15, mapZ + 15)); - flag = true; - } - } - - return flag; - } - - /** A list of all the biomes twilight oaks can spawn in. */ - public static List oakSpawnBiomes = Arrays.asList(new BiomeGenBase[] {TFBiomeBase.twilightForest, TFBiomeBase.twilightForest2, - TFBiomeBase.mushrooms, TFBiomeBase.tfSwamp, TFBiomeBase.clearing, TFBiomeBase.oakSavanna, - TFBiomeBase.fireflyForest, TFBiomeBase.deepMushrooms, TFBiomeBase.enchantedForest, TFBiomeBase.fireSwamp}); - - protected boolean canSpawnStructureAtCoords(int chunkX, int chunkZ) { - return rand.nextInt(TwilightForestMod.twilightOakChance) == 0 && TFFeature.getNearestFeature(chunkX, chunkZ, worldObj).areChunkDecorationsEnabled - && this.worldObj.getWorldChunkManager().areBiomesViable(chunkX * 16 + 8, chunkZ * 16 + 8, 0, oakSpawnBiomes); - } - - protected StructureStart getStructureStart(int chunkX, int chunkZ) { - return new StructureTFHollowTreeStart(worldObj, rand, chunkX, chunkZ); - } - -} diff --git a/src/main/java/twilightforest/world/MapGenTFMajorFeature.java b/src/main/java/twilightforest/world/MapGenTFMajorFeature.java deleted file mode 100644 index b08cc8371b..0000000000 --- a/src/main/java/twilightforest/world/MapGenTFMajorFeature.java +++ /dev/null @@ -1,283 +0,0 @@ -package twilightforest.world; - -import java.util.Collection; -import java.util.Iterator; - -import net.minecraft.world.gen.structure.MapGenStructure; -import net.minecraft.world.gen.structure.MapGenStructureData; -import net.minecraft.world.gen.structure.StructureBoundingBox; -import net.minecraft.world.gen.structure.StructureComponent; -import net.minecraft.world.gen.structure.StructureStart; -import twilightforest.TFFeature; -import twilightforest.structures.StructureTFComponent; -import twilightforest.structures.StructureTFMajorFeatureStart; -import cpw.mods.fml.common.ObfuscationReflectionHelper; - - -public class MapGenTFMajorFeature extends MapGenStructure { - - public MapGenTFMajorFeature() {} - - @Override - protected boolean canSpawnStructureAtCoords(int chunkX, int chunkZ) { - return TFFeature.getFeatureDirectlyAt(chunkX, chunkZ, worldObj).isStructureEnabled; - } - - @Override - protected StructureStart getStructureStart(int chunkX, int chunkZ) { - // fix rand - this.rand.setSeed(worldObj.getSeed()); - long rand1 = this.rand.nextLong(); - long rand2 = this.rand.nextLong(); - long chunkXr1 = (long)(chunkX) * rand1; - long chunkZr2 = (long)(chunkZ) * rand2; - this.rand.setSeed(chunkXr1 ^ chunkZr2 ^ worldObj.getSeed()); - this.rand.nextInt(); - - return new StructureTFMajorFeatureStart(worldObj, rand, chunkX, chunkZ); - } - - - public String func_143025_a() - { - return "TFFeature"; - } - - /** - * Returns true if the structure generator has generated a structure located at the given position tuple. - */ - @SuppressWarnings({ "rawtypes", "unchecked" }) - public int getSpawnListIndexAt(int par1, int par2, int par3) - { - int highestFoundIndex = -1; - - Iterator startIterator = this.structureMap.values().iterator(); - - while (startIterator.hasNext()) - { - StructureStart start = (StructureStart)startIterator.next(); - - if (start.isSizeableStructure() && start.getBoundingBox().intersectsWith(par1, par3, par1, par3)) - { - Iterator componentIterator = start.getComponents().iterator(); - - while (componentIterator.hasNext()) - { - StructureComponent component = (StructureComponent)componentIterator.next(); - - if (component != null && component.getBoundingBox() != null && component.getBoundingBox().isVecInside(par1, par2, par3)) - { - if (component instanceof StructureTFComponent) - { - StructureTFComponent tfComponent = (StructureTFComponent)component; - - //System.out.println("found a tfComponent at the specified coordinates. It's a " + tfComponent + ", index = " + tfComponent.spawnListIndex); - - if (tfComponent.spawnListIndex > highestFoundIndex) - { - highestFoundIndex = tfComponent.spawnListIndex; - } - } - else - { - return 0; - } - } - } - } - } - - return highestFoundIndex; - } - - /** - * Get the structure bounding box, if any, at the specified position - */ - @SuppressWarnings("unchecked") - public StructureBoundingBox getSBBAt(int mapX, int mapY, int mapZ) { - StructureBoundingBox boxFound = null; - - Iterator startIterator = this.structureMap.values().iterator(); - - while (startIterator.hasNext()) - { - StructureStart start = (StructureStart)startIterator.next(); - - if (start.isSizeableStructure() && start.getBoundingBox().intersectsWith(mapX, mapZ, mapX, mapZ)) - { - Iterator componentIterator = start.getComponents().iterator(); - - while (componentIterator.hasNext()) - { - StructureComponent component = (StructureComponent)componentIterator.next(); - - if (component.getBoundingBox().isVecInside(mapX, mapY, mapZ)) - { - boxFound = component.getBoundingBox(); - } - } - } - } - - return boxFound; - } - - /** - * Is the block at the coordinates given a protected one? - */ - @SuppressWarnings("unchecked") - public boolean isBlockProtectedAt(int mapX, int mapY, int mapZ) { - boolean blockProtected = false; - - Iterator startIterator = this.structureMap.values().iterator(); - - while (startIterator.hasNext()) { - StructureStart start = (StructureStart)startIterator.next(); - - if (start.isSizeableStructure() && start.getBoundingBox().intersectsWith(mapX, mapZ, mapX, mapZ)) { - Iterator componentIterator = start.getComponents().iterator(); - - while (componentIterator.hasNext()) { - StructureComponent component = (StructureComponent)componentIterator.next(); - - if (component.getBoundingBox().isVecInside(mapX, mapY, mapZ)) { - - if (component instanceof StructureTFComponent) { - StructureTFComponent tfComp = (StructureTFComponent)component; - - blockProtected = tfComp.isComponentProtected(); - - } else { - blockProtected = true; - } - - // check if it's a twilight forest component, then check if it's protected - } - } - } - } - - return blockProtected; - - } - - /** - * Mark the structure at the specified position as defeated - * @return - */ - @SuppressWarnings("unchecked") - public void setStructureConquered(int mapX, int mapY, int mapZ, boolean flag) { - - for (StructureStart start : (Collection)this.structureMap.values()) { - if (start.isSizeableStructure() && start.getBoundingBox().intersectsWith(mapX, mapZ, mapX, mapZ)) { - if (start instanceof StructureTFMajorFeatureStart) { - - StructureTFMajorFeatureStart featureStart =(StructureTFMajorFeatureStart)start; - - //System.out.println("The data says that the conquered flag is " + featureStart.isConquered); - - - featureStart.isConquered = flag; - - MapGenStructureData data = ObfuscationReflectionHelper.getPrivateValue(MapGenStructure.class, this, "field_143029_e"); - - data.func_143043_a(featureStart.func_143021_a(start.func_143019_e(), start.func_143018_f()), start.func_143019_e(), start.func_143018_f()); - //System.out.println("Writing data"); - - data.setDirty(true); - - //System.out.println("Set the data as dirty"); - } - } - } - } - - @SuppressWarnings("unchecked") - public boolean isStructureConquered(int mapX, int mapY, int mapZ) { - - boolean conquered = false; - - for (StructureStart start : (Collection)this.structureMap.values()) { - if (start.isSizeableStructure() && start.getBoundingBox().intersectsWith(mapX, mapZ, mapX, mapZ)) { - if (start instanceof StructureTFMajorFeatureStart) { - - conquered = ((StructureTFMajorFeatureStart)start).isConquered; - } - } - } - - return conquered; - } - - /** - * Check the lock at the specified lockIndex for the structure at the specified coords - */ - @SuppressWarnings("unchecked") - public boolean isStructureLocked(int mapX, int mapY, int mapZ, int lockIndex) { - - boolean locked = false; - - for (StructureStart start : (Collection)this.structureMap.values()) { - if (start.isSizeableStructure() && start.getBoundingBox().intersectsWith(mapX, mapZ, mapX, mapZ)) { - if (start instanceof StructureTFMajorFeatureStart) { - - locked = ((StructureTFMajorFeatureStart)start).isLocked(lockIndex); - } - } - } - - return locked; - } - - /** - * Do the specified x & z coordinates intersect the full structure? - */ - @SuppressWarnings("unchecked") - public boolean isBlockInFullStructure(int mapX, int mapZ) { - for (StructureStart start : (Collection)this.structureMap.values()) { - if (start.isSizeableStructure() && start.getBoundingBox().intersectsWith(mapX, mapZ, mapX, mapZ)) { - return true; - } - } - return false; - } - - /** - * Are the specified x & z coordinates close to a full structure? - */ - @SuppressWarnings("unchecked") - public boolean isBlockNearFullStructure(int mapX, int mapZ, int range) { - StructureBoundingBox rangeBB = new StructureBoundingBox(mapX - range, mapZ - range, mapX + range, mapZ + range); - for (StructureStart start : (Collection)this.structureMap.values()) { - if (start.isSizeableStructure() && start.getBoundingBox().intersectsWith(rangeBB)) { - return true; - } - } - return false; - } - - /** - * Get full structure bounding box at the specified x, z coordinates. - */ - @SuppressWarnings("unchecked") - public StructureBoundingBox getFullSBBAt(int mapX, int mapZ) { - for (StructureStart start : (Collection)this.structureMap.values()) { - if (start.isSizeableStructure() && start.getBoundingBox().intersectsWith(mapX, mapZ, mapX, mapZ)) { - return start.getBoundingBox(); - } - } - return null; - } - - @SuppressWarnings("unchecked") - public StructureBoundingBox getFullSBBNear(int mapX, int mapZ, int range) { - StructureBoundingBox rangeBB = new StructureBoundingBox(mapX - range, mapZ - range, mapX + range, mapZ + range); - for (StructureStart start : (Collection)this.structureMap.values()) { - if (start.isSizeableStructure() && start.getBoundingBox().intersectsWith(rangeBB)) { - return start.getBoundingBox(); - } - } - return null; - - } -} diff --git a/src/main/java/twilightforest/world/NoReturnTeleporter.java b/src/main/java/twilightforest/world/NoReturnTeleporter.java new file mode 100644 index 0000000000..d48b8be76b --- /dev/null +++ b/src/main/java/twilightforest/world/NoReturnTeleporter.java @@ -0,0 +1,15 @@ +package twilightforest.world; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Level; + +public class NoReturnTeleporter extends TFTeleporter { + public NoReturnTeleporter() { + super(false); + } + + @Override + protected BlockPos makePortalAt(Level world, BlockPos pos) { + return pos; + } +} diff --git a/src/main/java/twilightforest/world/README.md b/src/main/java/twilightforest/world/README.md new file mode 100644 index 0000000000..a3d1bc7a5c --- /dev/null +++ b/src/main/java/twilightforest/world/README.md @@ -0,0 +1,4 @@ +# Organization +Any class that accepts configurations and actively places blocks in the world should go into `components` + +Any class containing configurations for world generation components should go into `registration` diff --git a/src/main/java/twilightforest/world/TFGenBigMushgloom.java b/src/main/java/twilightforest/world/TFGenBigMushgloom.java deleted file mode 100644 index b67a3010e8..0000000000 --- a/src/main/java/twilightforest/world/TFGenBigMushgloom.java +++ /dev/null @@ -1,50 +0,0 @@ -package twilightforest.world; - -import java.util.Random; - -import twilightforest.block.TFBlocks; -import net.minecraft.block.Block; -import net.minecraft.init.Blocks; -import net.minecraft.world.World; - -public class TFGenBigMushgloom extends TFGenerator { - - @Override - public boolean generate(World world, Random rand, int x, int y, int z) { - int height = 3 + rand.nextInt(2) + rand.nextInt(2); - - if (!this.isAreaSuitable(world, rand, x - 1, y, z - 1, 3, height, 3)) { - return false; - } - - Block blockUnder = world.getBlock(x, y - 1, z); - if (blockUnder != Blocks.dirt && blockUnder != Blocks.grass && blockUnder != Blocks.mycelium) { - return false; - } - - // generate! - for (int dy = 0; dy < height - 2; dy++) { - this.setBlockAndNotifyAdequately(world, x, y + dy, z, TFBlocks.hugeGloomBlock, 10); - } - - makeMushroomCap(world, x, z, y + (height - 2)); - if (rand.nextBoolean()) { - makeMushroomCap(world, x, z, y + (height - 1)); - } - - return true; - } - - private void makeMushroomCap(World world, int x, int z, int dy) { - this.setBlockAndNotifyAdequately(world, x - 1, dy, z - 1, TFBlocks.hugeGloomBlock, 1); - this.setBlockAndNotifyAdequately(world, x + 0, dy, z - 1, TFBlocks.hugeGloomBlock, 2); - this.setBlockAndNotifyAdequately(world, x + 1, dy, z - 1, TFBlocks.hugeGloomBlock, 3); - this.setBlockAndNotifyAdequately(world, x - 1, dy, z + 0, TFBlocks.hugeGloomBlock, 4); - this.setBlockAndNotifyAdequately(world, x + 0, dy, z + 0, TFBlocks.hugeGloomBlock, 5); - this.setBlockAndNotifyAdequately(world, x + 1, dy, z + 0, TFBlocks.hugeGloomBlock, 6); - this.setBlockAndNotifyAdequately(world, x - 1, dy, z + 1, TFBlocks.hugeGloomBlock, 7); - this.setBlockAndNotifyAdequately(world, x + 0, dy, z + 1, TFBlocks.hugeGloomBlock, 8); - this.setBlockAndNotifyAdequately(world, x + 1, dy, z + 1, TFBlocks.hugeGloomBlock, 9); - } - -} diff --git a/src/main/java/twilightforest/world/TFGenCanopyMushroom.java b/src/main/java/twilightforest/world/TFGenCanopyMushroom.java deleted file mode 100644 index 8123f9b7f2..0000000000 --- a/src/main/java/twilightforest/world/TFGenCanopyMushroom.java +++ /dev/null @@ -1,216 +0,0 @@ -package twilightforest.world; - -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.init.Blocks; -import net.minecraft.util.ChunkCoordinates; -import net.minecraft.world.World; -import twilightforest.block.TFBlocks; - - -/** - * Makes large mushrooms with flat mushroom tops that provide a canopy for the forest - * - * @author Ben - * - */ -public class TFGenCanopyMushroom extends TFTreeGenerator { - - public TFGenCanopyMushroom() - { - this(false); - } - - public TFGenCanopyMushroom(boolean par1) - { - super(par1); - treeBlock = Blocks.red_mushroom_block; - treeMeta = 10; - branchMeta = 15; - leafBlock = Blocks.red_mushroom_block; - leafMeta = 5; - } - - @Override - public boolean generate(World world, Random random, int x, int y, int z) - { - // determine a height - int treeHeight = 12; - if (random.nextInt(3) == 0) { - treeHeight += random.nextInt(5); - - if (random.nextInt(8) == 0) { - treeHeight += random.nextInt(5); - } - } - - // check if we're on dirt or grass - Block blockUnder = world.getBlock(x, y - 1, z); - if(blockUnder != Blocks.grass && blockUnder != Blocks.dirt && blockUnder != Blocks.mycelium || y >= 256 - treeHeight - 1) - { - return false; - } - - - this.treeBlock = random.nextInt(3) == 0 ? Blocks.red_mushroom_block : Blocks.brown_mushroom_block; - this.leafBlock = treeBlock; - - //okay build a tree! Go up to the height - buildBranch(world, x, y, z, 0, treeHeight, 0, 0, true, random); - - // make 3-4 branches - int numBranches = 3 + random.nextInt(2); - double offset = random.nextDouble(); - for (int b = 0; b < numBranches; b++) - { - buildBranch(world, x, y, z, treeHeight - 5 + b, 9, 0.3 * b + offset, 0.2, false, random); - } - - return true; - } - - /** - * Build a branch with a flat blob of leaves at the end. - * - * @param height - * @param length - * @param angle - * @param tilt - */ - void buildBranch(World world, int x, int y, int z, int height, double length, double angle, double tilt, boolean trunk, Random treeRNG) - { - ChunkCoordinates src = new ChunkCoordinates(x, y + height, z); - ChunkCoordinates dest = translateCoords(src.posX, src.posY, src.posZ, length, angle, tilt); - - // constrain branch spread - if ((dest.posX - x) < -4) - { - dest.posX = x - 4; - } - if ((dest.posX - x) > 4) - { - dest.posX = x + 4; - } - if ((dest.posZ - z) < -4) - { - dest.posZ = z - 4; - } - if ((dest.posZ - z) > 4) - { - dest.posZ = z + 4; - } - - if (src.posX != dest.posX || src.posZ != dest.posZ) { - // branch - drawBresehnam(world, src.posX, src.posY, src.posZ, dest.posX, src.posY, dest.posZ, treeBlock, branchMeta); - drawBresehnam(world, dest.posX, src.posY + 1, dest.posZ, dest.posX, dest.posY - 1, dest.posZ, treeBlock, treeMeta); - } - else { - // trunk - drawBresehnam(world, src.posX, src.posY, src.posZ, dest.posX, dest.posY - 1, dest.posZ, treeBlock, treeMeta); - } - - // do this here until that bug with the lighting is fixed - if (trunk) { - // add a firefly (torch) to the trunk - addFirefly(world, x, y, z, 3 + treeRNG.nextInt(7), treeRNG.nextDouble()); - } - - drawMushroomCircle(world, dest.posX, dest.posY, dest.posZ, 4, leafBlock); - } - - /** - * Draw a flat blob (a circle?) of whatevs (I'm guessing... leaves). - * @param sx - * @param sy - * @param sz - * @param rad radius - * @param blockValue - * @param metaValue - * @param priority do we overwrite what's there? - */ - public void drawMushroomCircle(World world, int sx, int sy, int sz, int rad, Block blockValue) - { - // trace out a quadrant - for (byte dx = 0; dx <= rad; dx++) - { - for (byte dz = 0; dz <= rad; dz++) - { - int dist = (int)(Math.max(dx, dz) + (Math.min(dx, dz) * 0.5)); - - //hack! I keep getting failing leaves at a certain position. - if (dx == 3 && dz == 3) { - dist = 6; - } - - // if we're inside the blob, fill it - if (dx == 0) { - // two! - if (dz < rad) { - setBlockAndMetadata(world, sx + 0, sy, sz + dz, blockValue, 5); - setBlockAndMetadata(world, sx + 0, sy, sz - dz, blockValue, 5); - } - else { - setBlockAndMetadata(world, sx + 0, sy, sz + dz, blockValue, 8); - setBlockAndMetadata(world, sx + 0, sy, sz - dz, blockValue, 2); - } - } - else if (dz == 0) { - // two! - if (dx < rad) { - setBlockAndMetadata(world, sx + dx, sy, sz + 0, blockValue, 5); - setBlockAndMetadata(world, sx - dx, sy, sz + 0, blockValue, 5); - } - else { - setBlockAndMetadata(world, sx + dx, sy, sz + 0, blockValue, 6); - setBlockAndMetadata(world, sx - dx, sy, sz + 0, blockValue, 4); - } - } - else if (dist < rad) { - // do four at a time for easiness! - setBlockAndMetadata(world, sx + dx, sy, sz + dz, blockValue, 5); - setBlockAndMetadata(world, sx + dx, sy, sz - dz, blockValue, 5); - setBlockAndMetadata(world, sx - dx, sy, sz + dz, blockValue, 5); - setBlockAndMetadata(world, sx - dx, sy, sz - dz, blockValue, 5); - } - else if (dist == rad) { - // do four at a time for easiness! - setBlockAndMetadata(world, sx + dx, sy, sz + dz, blockValue, 9); - setBlockAndMetadata(world, sx + dx, sy, sz - dz, blockValue, 3); - setBlockAndMetadata(world, sx - dx, sy, sz + dz, blockValue, 7); - setBlockAndMetadata(world, sx - dx, sy, sz - dz, blockValue, 1); - } - } - } - } - - - /** - * Add a firefly at the specified height and angle. - * - * @param height how far up the tree - * @param angle from 0 - 1 rotation around the tree - */ - private void addFirefly(World world, int x, int y, int z, int height, double angle) - { - int iAngle = (int)(angle * 4.0); - if (iAngle == 0) - { - setBlockAndMetadata(world, x + 1, y + height, z, TFBlocks.firefly, 0); - } - else if (iAngle == 1) - { - setBlockAndMetadata(world, x - 1, y + height, z, TFBlocks.firefly, 0); - } - else if (iAngle == 2) - { - setBlockAndMetadata(world, x, y + height, z + 1, TFBlocks.firefly, 0); - } - else if (iAngle == 3) - { - setBlockAndMetadata(world, x, y + height, z - 1, TFBlocks.firefly, 0); - } - } - -} diff --git a/src/main/java/twilightforest/world/TFGenCanopyOak.java b/src/main/java/twilightforest/world/TFGenCanopyOak.java deleted file mode 100644 index 65cfb9ddc1..0000000000 --- a/src/main/java/twilightforest/world/TFGenCanopyOak.java +++ /dev/null @@ -1,164 +0,0 @@ -package twilightforest.world; - -import java.util.Random; - -import net.minecraft.block.material.Material; -import net.minecraft.util.ChunkCoordinates; -import net.minecraft.world.World; -import twilightforest.block.BlockTFRoots; -import twilightforest.block.TFBlocks; - -public class TFGenCanopyOak extends TFGenCanopyTree { - - public TFGenCanopyOak() - { - this(false); - } - - public TFGenCanopyOak(boolean par1) - { - super(par1); - this.treeBlock = TFBlocks.log; - this.treeMeta = 0; - this.branchMeta = 12; - this.leafBlock = TFBlocks.leaves; - this.leafMeta = 0; - this.rootBlock = TFBlocks.root; - this.rootMeta = BlockTFRoots.ROOT_META; - - } - - @Override - public boolean generate(World world, Random random, int x, int y, int z) - { - int treeHeight; - - // check if we're on dirt or grass - Material materialUnder = world.getBlock(x, y - 1, z).getMaterial(); - if ((materialUnder != Material.grass && materialUnder != Material.ground) || y >= TFWorld.MAXHEIGHT - 12) - { - return false; - } - - - // determine a height - treeHeight = minHeight; - if (random.nextInt(chanceAddFirstFive) == 0) { - treeHeight += random.nextInt(5); - - if (random.nextInt(chanceAddSecondFive) == 0) { - treeHeight += random.nextInt(5); - } - } - - //okay build a tree! Go up to the height - buildTrunk(world, x, y, z, treeHeight); - - // make 12 - 20 branches - int numBranches = 12 + random.nextInt(9); - float bangle = random.nextFloat(); - for (int b = 0; b < numBranches; b++) { - float btilt = 0.15F + (random.nextFloat() * 0.35F); - buildBranch(world, x, y, z, treeHeight - 10 + (b / 2), 5, bangle, btilt, false, random); - - bangle += (random.nextFloat() * 0.4F); - if (bangle > 1.0F) { - bangle -= 1.0F; - } - } - - makeRoots(world, random, x + 0, y, z + 0); - makeRoots(world, random, x + 1, y, z + 0); - makeRoots(world, random, x + 0, y, z + 1); - makeRoots(world, random, x + 1, y, z + 1); - - - return true; - } - - private void makeRoots(World world, Random random, int x, int y, int z) { - // root bulb - if (hasAirAround(world, x, y - 1, z)) { - this.setBlockAndMetadata(world, x, y - 1, z, treeBlock, treeMeta); - } - else { - this.setBlockAndMetadata(world, x, y - 1, z, rootBlock, rootMeta); - } - - // roots! - int numRoots = 1 + random.nextInt(2); - float offset = random.nextFloat(); - for (int b = 0; b < numRoots; b++) - { - buildRoot(world, x, y, z, offset, b); - } - } - - private void buildTrunk(World world, int sx, int sy, int sz, int treeHeight) { - for (int dy = 0; dy < treeHeight; dy++) { - this.setBlockAndMetadata(world, sx + 0, sy + dy, sz + 0, this.treeBlock, this.treeMeta); - this.setBlockAndMetadata(world, sx + 1, sy + dy, sz + 0, this.treeBlock, this.treeMeta); - this.setBlockAndMetadata(world, sx + 0, sy + dy, sz + 1, this.treeBlock, this.treeMeta); - this.setBlockAndMetadata(world, sx + 1, sy + dy, sz + 1, this.treeBlock, this.treeMeta); - } - - drawLeafBlob(world, sx + 0, sy + treeHeight, sz + 0, 3, leafBlock, leafMeta); - - } - - /** - * Build a branch with a flat blob of leaves at the end. - * - * @param height - * @param length - * @param angle - * @param tilt - */ - void buildBranch(World world, int x, int y, int z, int height, double length, double angle, double tilt, boolean trunk, Random treeRNG) - { - ChunkCoordinates src = new ChunkCoordinates(x, y + height, z); - ChunkCoordinates dest = translateCoords(src.posX, src.posY, src.posZ, length, angle, tilt); - - // constrain branch spread - int limit = 5; - if ((dest.posX - x) < -limit) - { - dest.posX = x - limit; - } - if ((dest.posX - x) > limit) - { - dest.posX = x + limit; - } - if ((dest.posZ - z) < -limit) - { - dest.posZ = z - limit; - } - if ((dest.posZ - z) > limit) - { - dest.posZ = z + limit; - } - - drawBresehnam(world, src.posX, src.posY, src.posZ, dest.posX, dest.posY, dest.posZ, treeBlock, trunk ? treeMeta : branchMeta); - - // do this here until that bug with the lighting is fixed - if (trunk) - { - // add a firefly (torch) to the trunk - addFirefly(world, x, y, z, 3 + treeRNG.nextInt(7), treeRNG.nextDouble()); - } - - int blobSize = 2;// + treeRNG.nextInt(2); - - drawLeafBlob(world, dest.posX, dest.posY, dest.posZ, blobSize, leafBlock, leafMeta); - -// makeLeafCircle(world, dest.posX, dest.posY - 1, dest.posZ, 3, leafBlock, leafMeta, true); -// makeLeafCircle(world, dest.posX, dest.posY, dest.posZ, 4, leafBlock, leafMeta, true); -// makeLeafCircle(world, dest.posX, dest.posY + 1, dest.posZ, 2, leafBlock, leafMeta, true); - - setBlockAndMetadata(world, dest.posX + 1, dest.posY, dest.posZ, treeBlock, branchMeta); - setBlockAndMetadata(world, dest.posX - 1, dest.posY, dest.posZ, treeBlock, branchMeta); - setBlockAndMetadata(world, dest.posX, dest.posY, dest.posZ + 1, treeBlock, branchMeta); - setBlockAndMetadata(world, dest.posX, dest.posY, dest.posZ - 1, treeBlock, branchMeta); - - } -} \ No newline at end of file diff --git a/src/main/java/twilightforest/world/TFGenCanopyTree.java b/src/main/java/twilightforest/world/TFGenCanopyTree.java deleted file mode 100644 index 0e3b87db1f..0000000000 --- a/src/main/java/twilightforest/world/TFGenCanopyTree.java +++ /dev/null @@ -1,180 +0,0 @@ -package twilightforest.world; - -import java.util.Random; - -import net.minecraft.block.material.Material; -import net.minecraft.util.ChunkCoordinates; -import net.minecraft.world.World; -import twilightforest.block.BlockTFRoots; -import twilightforest.block.TFBlocks; - - - - -/** - * Makes large trees with flat leaf ovals that provide a canopy for the forest - * - * @author Ben - * - */ -public class TFGenCanopyTree extends TFTreeGenerator { - - protected int minHeight = 20; - protected int chanceAddFirstFive = 3; - protected int chanceAddSecondFive = 8; - - - public TFGenCanopyTree() - { - this(false); - } - - public TFGenCanopyTree(boolean par1) - { - super(par1); - treeBlock = TFBlocks.log; - treeMeta = 1; - branchMeta = 13; - leafBlock = TFBlocks.leaves; - leafMeta = 1; - rootBlock = TFBlocks.root; - rootMeta = BlockTFRoots.ROOT_META; - - } - - @Override - public boolean generate(World world, Random random, int x, int y, int z) - { - int treeHeight; - - // check if we're on dirt or grass - Material materialUnder = world.getBlock(x, y - 1, z).getMaterial(); - if ((materialUnder != Material.grass && materialUnder != Material.ground) || y >= TFWorld.MAXHEIGHT - 12) - { - return false; - } - - - // determine a height - treeHeight = minHeight; - if (random.nextInt(chanceAddFirstFive) == 0) { - treeHeight += random.nextInt(5); - - if (random.nextInt(chanceAddSecondFive) == 0) { - treeHeight += random.nextInt(5); - } - } - - //okay build a tree! Go up to the height - buildBranch(world, x, y, z, 0, treeHeight, 0, 0, true, random); - - // make 3-4 branches - int numBranches = 3 + random.nextInt(2); - float offset = random.nextFloat(); - for (int b = 0; b < numBranches; b++) - { - buildBranch(world, x, y, z, treeHeight - 10 + b, 9, 0.3 * b + offset, 0.2, false, random); - } - - // root bulb - if (hasAirAround(world, x, y - 1, z)) { - this.setBlockAndMetadata(world, x, y - 1, z, treeBlock, treeMeta); - } - else { - this.setBlockAndMetadata(world, x, y - 1, z, rootBlock, rootMeta); - } - - // roots! - int numRoots = 3 + random.nextInt(2); - offset = random.nextFloat(); - for (int b = 0; b < numRoots; b++) - { - buildRoot(world, x, y, z, offset, b); - } - - - return true; - } - - /** - * Build a branch with a flat blob of leaves at the end. - * - * @param height - * @param length - * @param angle - * @param tilt - */ - void buildBranch(World world, int x, int y, int z, int height, double length, double angle, double tilt, boolean trunk, Random treeRNG) - { - ChunkCoordinates src = new ChunkCoordinates(x, y + height, z); - ChunkCoordinates dest = translateCoords(src.posX, src.posY, src.posZ, length, angle, tilt); - - // constrain branch spread - if ((dest.posX - x) < -4) - { - dest.posX = x - 4; - } - if ((dest.posX - x) > 4) - { - dest.posX = x + 4; - } - if ((dest.posZ - z) < -4) - { - dest.posZ = z - 4; - } - if ((dest.posZ - z) > 4) - { - dest.posZ = z + 4; - } - - drawBresehnam(world, src.posX, src.posY, src.posZ, dest.posX, dest.posY, dest.posZ, treeBlock, trunk ? treeMeta : branchMeta); - - // do this here until that bug with the lighting is fixed - if (trunk) - { - // add a firefly (torch) to the trunk - addFirefly(world, x, y, z, 3 + treeRNG.nextInt(7), treeRNG.nextDouble()); - } - - makeLeafCircle(world, dest.posX, dest.posY - 1, dest.posZ, 3, leafBlock, leafMeta, true); - makeLeafCircle(world, dest.posX, dest.posY, dest.posZ, 4, leafBlock, leafMeta, true); - makeLeafCircle(world, dest.posX, dest.posY + 1, dest.posZ, 2, leafBlock, leafMeta, true); - - setBlockAndMetadata(world, dest.posX + 1, dest.posY, dest.posZ, treeBlock, branchMeta); - setBlockAndMetadata(world, dest.posX - 1, dest.posY, dest.posZ, treeBlock, branchMeta); - setBlockAndMetadata(world, dest.posX, dest.posY, dest.posZ + 1, treeBlock, branchMeta); - setBlockAndMetadata(world, dest.posX, dest.posY, dest.posZ - 1, treeBlock, branchMeta); - - } - - /** - * Add a firefly at the specified height and angle. - * - * @param height how far up the tree - * @param angle from 0 - 1 rotation around the tree - */ - protected void addFirefly(World world, int x, int y, int z, int height, double angle) - { - int iAngle = (int)(angle * 4.0); - if (iAngle == 0) - { - setBlockAndMetadata(world, x + 1, y + height, z, TFBlocks.firefly, 0); - } - else if (iAngle == 1) - { - setBlockAndMetadata(world, x - 1, y + height, z, TFBlocks.firefly, 0); - } - else if (iAngle == 2) - { - setBlockAndMetadata(world, x, y + height, z + 1, TFBlocks.firefly, 0); - } - else if (iAngle == 3) - { - setBlockAndMetadata(world, x, y + height, z - 1, TFBlocks.firefly, 0); - } - } - - - - -} diff --git a/src/main/java/twilightforest/world/TFGenCaveStalactite.java b/src/main/java/twilightforest/world/TFGenCaveStalactite.java deleted file mode 100644 index a57e88e196..0000000000 --- a/src/main/java/twilightforest/world/TFGenCaveStalactite.java +++ /dev/null @@ -1,230 +0,0 @@ -package twilightforest.world; - -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.init.Blocks; -import net.minecraft.world.World; - - - -public class TFGenCaveStalactite extends TFGenerator { - - - public static TFGenCaveStalactite diamond = new TFGenCaveStalactite(Blocks.diamond_ore, 0.5F, 4, 16); - public static TFGenCaveStalactite lapis = new TFGenCaveStalactite(Blocks.lapis_ore, 0.8F, 8, 1); - public static TFGenCaveStalactite emerald = new TFGenCaveStalactite(Blocks.emerald_ore, 0.5F, 3, 12); - public static TFGenCaveStalactite gold = new TFGenCaveStalactite(Blocks.gold_ore, 0.6F, 6, 1); - public static TFGenCaveStalactite redstone = new TFGenCaveStalactite(Blocks.redstone_ore, 0.8F, 8, 1); - public static TFGenCaveStalactite iron = new TFGenCaveStalactite(Blocks.iron_ore, 0.7F, 8, 1); - public static TFGenCaveStalactite coal = new TFGenCaveStalactite(Blocks.coal_ore, 0.8F, 12, 1); - public static TFGenCaveStalactite glowstone = new TFGenCaveStalactite(Blocks.glowstone, 0.5F, 8, 1); - - - public Block blockID; - public boolean hang; - public float sizeFactor; - public int maxLength; - public int minHeight; - - /** - * Initializes a stalactite builder. Actually also makes stalagmites - * - * @param size - * @param stone - */ - public TFGenCaveStalactite(Block blockType, float size, boolean down) - { - this.blockID = blockType; - this.sizeFactor = size; - this.maxLength = -1; - this.minHeight = -1; - this.hang = down; - } - - /** - * Initializes a stalactite builder - */ - public TFGenCaveStalactite(Block blockType, float size, int maxLength, int minHeight) - { - this.blockID = blockType; - this.sizeFactor = size; - this.maxLength = maxLength; - this.minHeight = minHeight; - this.hang = true; - } - - /** - * Makes a random stalactite appropriate to the cave size - * - * All include iron, coal and glowstone. - * - * Gold and redstone appears in size 2 and larger caves. - * - * Diamonds and lapis only appear in size 3 and larger caves. - */ - public static TFGenCaveStalactite makeRandomOreStalactite(Random rand, int hillSize) - { - if (hillSize >= 3 || (hillSize >= 2 && rand.nextInt(5) == 0)) - { - int s3 = rand.nextInt(13); - if (s3 == 0 || s3 == 1) - { - return diamond; - } - else if (s3 == 2 || s3 == 3) - { - return lapis; - } - else if (s3 == 4) - { - return emerald; - } - } - if (hillSize >= 2 || (hillSize >= 1 && rand.nextInt(5) == 0)) - { - int s2 = rand.nextInt(6); - if (s2 == 0) - { - return gold; - } - else if (s2 == 1 || s2 == 2) - { - return redstone; - } - } - - // fall through to size 1 - int s1 = rand.nextInt(5); - if (s1 == 0 || s1 == 1) - { - return iron; - } - else if (s1 == 2 || s1 == 3) - { - return coal; - } - else - { - return glowstone; - } - } - - /** - * Generates a stalactite at the specified location. - * The coordinates should be inside a cave. - * This will return false if it can't find a valid ceiling and floor, or if there are other errors. - */ - public boolean generate(World world, Random random, int x, int y, int z) - { - int ceiling = Integer.MAX_VALUE; - int floor = -1; - - // find a ceiling - for (int ty = y; ty < TFWorld.CHUNKHEIGHT; ty++) - { - Material m = world.getBlock(x, ty, z).getMaterial(); - // if we're in air, continue - if (m == Material.air) - { - continue; - } - // if we get something that's not cave material, fail! - if (m != Material.ground && m != Material.rock) - { - return false; - } - // okay, we found a valid ceiling. - ceiling = ty; - break; - } - // if we didn't find a ceiling, fail. - if (ceiling == Integer.MAX_VALUE) - { - return false; - } - - // find a floor - for (int ty = y; ty > 4; ty--) - { - Material m = world.getBlock(x, ty, z).getMaterial(); - // if we're in air, continue - if (m == Material.air) - { - continue; - } - // if we get something that's not cave material, fail! - // actually stalactites can hang above water or lava - if (m != Material.ground && m != Material.rock && (!hang && m != Material.water) && (!hang && m != Material.lava) ) - { - return false; - } - // okay, we found a valid floor. - floor = ty; - break; - } - - int length = (int)((ceiling - floor) * this.sizeFactor * random.nextFloat()); - - // check max length - if (this.maxLength > -1 && length > this.maxLength) - { - length = this.maxLength; - } - - // check minimum height - if (this.minHeight > -1 && ceiling - floor - length < this.minHeight) - { - return false; - } - - return makeSpike(world, random, x, hang ? ceiling : floor, z, length); - } - - - public boolean makeSpike(World world, Random random, int x, int y, int z, int maxLength) - { - - int diameter = (int)(maxLength / 4.5); // diameter of the base - - // let's see... - for (int dx = -diameter; dx <= diameter; dx++) - { - for (int dz = -diameter; dz <= diameter; dz++) - { - // determine how long this spike will be. - int absx = Math.abs(dx); - int absz = Math.abs(dz); - int dist = (int)(Math.max(absx, absz) + (Math.min(absx, absz) * 0.5)); - int spikeLength = 0; - - if (dist == 0) - { - spikeLength = maxLength; - } - - if (dist > 0) - { - spikeLength = random.nextInt((int)(maxLength / (dist + 0.25))); - } - - int dir = hang ? -1 : 1; - - // check if we're generating over anything - if (!world.getBlock(x + dx, y - dir, z + dz).getMaterial().isSolid()) - { - spikeLength = 0; - } - - for (int dy = 0; dy != (spikeLength * dir); dy += dir) - { - setBlock(world, x + dx, y + dy, z + dz, blockID); - } - } - } - - return true; - } - -} diff --git a/src/main/java/twilightforest/world/TFGenCaves.java b/src/main/java/twilightforest/world/TFGenCaves.java deleted file mode 100644 index 58a9d7ab1c..0000000000 --- a/src/main/java/twilightforest/world/TFGenCaves.java +++ /dev/null @@ -1,282 +0,0 @@ -package twilightforest.world; - -import java.util.Random; - -import twilightforest.biomes.TFBiomeHighlands; -import twilightforest.block.TFBlocks; -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.init.Blocks; -import net.minecraft.util.MathHelper; -import net.minecraft.world.World; -import net.minecraft.world.gen.MapGenBase; -import net.minecraft.world.gen.MapGenCaves; - - -public class TFGenCaves extends MapGenCaves -{ - /** - * Generates a larger initial cave node than usual. Called 25% of the time. - * @param isHighlands - */ - protected void generateLargeCaveNode(long caveSeed, int centerX, int centerZ, Block[] blockStorage, double randX, double randY, double randZ, boolean isHighlands) - { - this.generateCaveNode(caveSeed, centerX, centerZ, blockStorage, randX, randY, randZ, 1.0F + this.rand.nextFloat() * 6.0F, 0.0F, 0.0F, -1, -1, 0.5D, isHighlands); - } - - /** - * Generates a node in the current cave system recursion tree. - * @param isHighlands - */ - protected void generateCaveNode(long caveSeed, int centerX, int centerZ, Block[] blockStorage, double randX, double randY, double randZ, float caveSize, float randPI, float angleToGenerate, int loopOne, int loopEnd, double yScale, boolean isHighlands) - { - double offsetCenterX = (double)(centerX * 16 + 8); - double offsetCenterZ = (double)(centerZ * 16 + 8); - float var23 = 0.0F; - float var24 = 0.0F; - Random caveRNG = new Random(caveSeed); - Random mossRNG = new Random(caveSeed); - -// if (isHighlands) { -// //System.out.println("Saying highlands and it's not"); -// isHighlands = false; -// } - - if (isHighlands && caveSize < 6F) { - caveSize *= 2.5F; - } - - if (loopEnd <= 0) - { - int rangeInBlocks = this.range * 16 - 16; - loopEnd = rangeInBlocks - caveRNG.nextInt(rangeInBlocks / 4); - } - - boolean shouldStop = false; - - if (loopOne == -1) - { - loopOne = loopEnd / 2; - shouldStop = true; - } - - int var27 = caveRNG.nextInt(loopEnd / 2) + loopEnd / 4; - - for (boolean var28 = caveRNG.nextInt(6) == 0; loopOne < loopEnd; ++loopOne) - { - double sizeVar = 1.5D + (double)(MathHelper.sin((float)loopOne * (float)Math.PI / (float)loopEnd) * caveSize * 1.0F); - double scaledSize = sizeVar * yScale; - float cosAngle = MathHelper.cos(angleToGenerate); - float sinAngle = MathHelper.sin(angleToGenerate); - randX += (double)(MathHelper.cos(randPI) * cosAngle); - randY += (double)sinAngle; - randZ += (double)(MathHelper.sin(randPI) * cosAngle); - - if (var28) - { - angleToGenerate *= 0.92F; - } - else - { - angleToGenerate *= 0.7F; - } - - angleToGenerate += var24 * 0.1F; - randPI += var23 * 0.1F; - var24 *= 0.9F; - var23 *= 0.75F; - var24 += (caveRNG.nextFloat() - caveRNG.nextFloat()) * caveRNG.nextFloat() * 2.0F; - var23 += (caveRNG.nextFloat() - caveRNG.nextFloat()) * caveRNG.nextFloat() * 4.0F; - - if (!shouldStop && loopOne == var27 && caveSize > 1.0F && loopEnd > 0) - { - this.generateCaveNode(caveRNG.nextLong(), centerX, centerZ, blockStorage, randX, randY, randZ, caveRNG.nextFloat() * 0.5F + 0.5F, randPI - ((float)Math.PI / 2F), angleToGenerate / 3.0F, loopOne, loopEnd, 1.0D, isHighlands); - this.generateCaveNode(caveRNG.nextLong(), centerX, centerZ, blockStorage, randX, randY, randZ, caveRNG.nextFloat() * 0.5F + 0.5F, randPI + ((float)Math.PI / 2F), angleToGenerate / 3.0F, loopOne, loopEnd, 1.0D, isHighlands); - return; - } - - if (shouldStop || caveRNG.nextInt(4) != 0) - { - double distX = randX - offsetCenterX; - double distZ = randZ - offsetCenterZ; - double var39 = (double)(loopEnd - loopOne); - double sizeSixteen = (double)(caveSize + 2.0F + 16.0F); - - if (distX * distX + distZ * distZ - var39 * var39 > sizeSixteen * sizeSixteen) - { - return; - } - - if (randX >= offsetCenterX - 16.0D - sizeVar * 2.0D && randZ >= offsetCenterZ - 16.0D - sizeVar * 2.0D && randX <= offsetCenterX + 16.0D + sizeVar * 2.0D && randZ <= offsetCenterZ + 16.0D + sizeVar * 2.0D) - { - int minX = MathHelper.floor_double(randX - sizeVar) - centerX * 16 - 1; - int maxX = MathHelper.floor_double(randX + sizeVar) - centerX * 16 + 1; - int maxY = MathHelper.floor_double(randY - scaledSize) - 1; - int minY = MathHelper.floor_double(randY + scaledSize) + 1; - int minZ = MathHelper.floor_double(randZ - sizeVar) - centerZ * 16 - 1; - int maxZ = MathHelper.floor_double(randZ + sizeVar) - centerZ * 16 + 1; - - if (minX < 0) - { - minX = 0; - } - - if (maxX > 16) - { - maxX = 16; - } - - if (maxY < 1) - { - maxY = 1; - } - - if (minY > 120) - { - minY = 120; - } - - if (minZ < 0) - { - minZ = 0; - } - - if (maxZ > 16) - { - maxZ = 16; - } - - boolean hasHitWater = false; - int genX; - int genZ; - - for (genX = minX; !hasHitWater && genX < maxX; ++genX) - { - for (genZ = minZ; !hasHitWater && genZ < maxZ; ++genZ) - { - for (int genY = minY + 1; !hasHitWater && genY >= maxY - 1; --genY) - { - int waterIndex = (genX * 16 + genZ) * 128 + genY; - - if (genY >= 0 && genY < 128) - { - if (isOceanBlock(blockStorage, waterIndex, genX, genY, genZ, centerX, centerZ)) - { - hasHitWater = true; - } - - if (genY != maxY - 1 && genX != minX && genX != maxX - 1 && genZ != minZ && genZ != maxZ - 1) - { - genY = maxY; - } - } - } - } - } - - if (!hasHitWater) - { - for (genX = minX; genX < maxX; ++genX) - { - double var59 = ((double)(genX + centerX * 16) + 0.5D - randX) / sizeVar; - - for (genZ = minZ; genZ < maxZ; ++genZ) - { - double var46 = ((double)(genZ + centerZ * 16) + 0.5D - randZ) / sizeVar; - int caveIndex = (genX * 16 + genZ) * TFWorld.CHUNKHEIGHT + minY; - boolean hitGrass = false; - - if (var59 * var59 + var46 * var46 < 1.0D) - { - for (int caveY = minY - 1; caveY >= maxY; --caveY) - { - double var51 = ((double)caveY + 0.5D - randY) / scaledSize; - - if (var51 > -0.7D && var59 * var59 + var51 * var51 + var46 * var46 < 20.0D) - { - Block blockAt = blockStorage[caveIndex]; - - if (blockAt == Blocks.grass) - { - hitGrass = true; - } - - if (blockAt != null && (blockAt == Blocks.stone || blockAt == TFBlocks.trollSteinn || blockAt.getMaterial() == Material.ground || blockAt.getMaterial() == Material.grass)) - { - if (var59 * var59 + var51 * var51 + var46 * var46 < 0.85D) { - blockStorage[caveIndex] = caveY < 10 ? Blocks.water : Blocks.air; - } - else { - Block localBlock = isHighlands ? (mossRNG.nextInt(6) == 0 ? TFBlocks.trollSteinn : Blocks.stone) : Blocks.dirt; - blockStorage[caveIndex] = hitGrass ? Blocks.grass : localBlock; - hitGrass = false; - } - - if (hitGrass && blockStorage[caveIndex - 1] == Blocks.dirt) - { - blockStorage[caveIndex - 1] = this.worldObj.getBiomeGenForCoords(genX + centerX * 16, genZ + centerZ * 16).topBlock; - } - } - } - - --caveIndex; - } - } - } - } - - if (shouldStop) - { - break; - } - } - } - } - } - } - - /** - * Recursively called by generate() (generate) and optionally by itself. - */ - protected void func_151538_a(World par1World, int genX, int genZ, int centerX, int centerZ, Block[] blockStorage) { - int numberOfCaves = this.rand.nextInt(this.rand.nextInt(this.rand.nextInt(40) + 1) + 1); - boolean isHighlands = par1World.getBiomeGenForCoords(genX * 16, genZ * 16) instanceof TFBiomeHighlands; - - if (this.rand.nextInt(15) != 0) - { - numberOfCaves = 0; - } - - for (int i = 0; i < numberOfCaves; ++i) - { - double randX = (double)(genX * 16 + this.rand.nextInt(16)); - double randY = (double)this.rand.nextInt(this.rand.nextInt(120) + 8); - double randZ = (double)(genZ * 16 + this.rand.nextInt(16)); - int numberOfNormalNodes = 1; - - if (this.rand.nextInt(4) == 0) - { - this.generateLargeCaveNode(this.rand.nextLong(), centerX, centerZ, blockStorage, randX, randY, randZ, isHighlands); - numberOfNormalNodes += this.rand.nextInt(4); - } - - for (int j = 0; j < numberOfNormalNodes; ++j) - { - float randPi = this.rand.nextFloat() * (float)Math.PI * 2.0F; - float randEight = (this.rand.nextFloat() - 0.5F) * 2.0F / 8.0F; - float caveSize = this.rand.nextFloat() * 2.0F + this.rand.nextFloat(); - - if (this.rand.nextInt(10) == 0){ - caveSize *= this.rand.nextFloat() * this.rand.nextFloat() * 3.0F + 1.0F; - } - - this.generateCaveNode(this.rand.nextLong(), centerX, centerZ, blockStorage, randX, randY, randZ, caveSize, randPi, randEight, 0, 0, 1.0D, isHighlands); - } - } - } - - protected boolean isOceanBlock(Block[] data, int index, int x, int y, int z, int chunkX, int chunkZ) - { - return data[index] == Blocks.flowing_water || data[index] == Blocks.water; - } -} diff --git a/src/main/java/twilightforest/world/TFGenDarkCanopyTree.java b/src/main/java/twilightforest/world/TFGenDarkCanopyTree.java deleted file mode 100644 index cdc410537b..0000000000 --- a/src/main/java/twilightforest/world/TFGenDarkCanopyTree.java +++ /dev/null @@ -1,165 +0,0 @@ -package twilightforest.world; - -import java.util.Random; - -import net.minecraft.block.material.Material; -import net.minecraft.util.ChunkCoordinates; -import net.minecraft.world.World; -import twilightforest.block.BlockTFRoots; -import twilightforest.block.TFBlocks; - - - - -/** - * Makes large trees with flat leaf ovals that provide a canopy for the forest - * - * @author Ben - * - */ -public class TFGenDarkCanopyTree extends TFTreeGenerator { - - - public TFGenDarkCanopyTree() - { - this(false); - } - - public TFGenDarkCanopyTree(boolean par1) - { - super(par1); - treeBlock = TFBlocks.log; - treeMeta = 3; - branchMeta = 15; - leafBlock = TFBlocks.darkleaves; - leafMeta = 0; - rootBlock = TFBlocks.root; - rootMeta = BlockTFRoots.ROOT_META; - } - - @Override - public boolean generate(World world, Random random, int x, int y, int z) - { - // if we are given leaves as a starting position, seek dirt or grass underneath - boolean foundDirt = false; - Material materialUnder; - for (int dy = y; dy >= TFWorld.SEALEVEL; dy--) { - materialUnder = world.getBlock(x, dy - 1, z).getMaterial(); - if (materialUnder == Material.grass || materialUnder == Material.ground) - { - // yes! - foundDirt = true; - y = dy; - break; - } - else if (materialUnder == Material.rock || materialUnder == Material.sand) { - // nope - break; - } - } - - if (!foundDirt) { - return false; - } - - // do not grow next to another tree - if (world.getBlock(x + 1, y, z + 0).getMaterial() == Material.wood || world.getBlock(x - 1, y, z + 0).getMaterial() == Material.wood - || world.getBlock(x + 0, y, z + 1).getMaterial() == Material.wood || world.getBlock(x + 0, y, z - 1).getMaterial() == Material.wood) { - return false; - } - - // determine a height - int treeHeight = 6 + random.nextInt(5); - - //okay build a tree! trunk here - drawBresehnam(world, x, y, z, x, y + treeHeight, z, treeBlock, treeMeta); - leafAround(world, x, y + treeHeight, z); - - // make 4 branches - int numBranches = 4; - double offset = random.nextFloat(); - for (int b = 0; b < numBranches; b++) - { - buildBranch(world, x, y, z, treeHeight - 3 - numBranches + (b / 2), 10 + random.nextInt(4), 0.23 * b + offset, 0.23, random); - } - - // root bulb - if (hasAirAround(world, x, y - 1, z)) { - this.setBlockAndMetadata(world, x, y - 1, z, treeBlock, treeMeta); - } - else { - this.setBlockAndMetadata(world, x, y - 1, z, rootBlock, rootMeta); - } - - // roots! - int numRoots = 3 + random.nextInt(2); - offset = random.nextDouble(); - for (int b = 0; b < numRoots; b++) - { - buildRoot(world, x, y, z, offset, b); - } - - - return true; - } - - - /** - * Build a branch with a flat blob of leaves at the end. - * - * @param height - * @param length - * @param angle - * @param tilt - */ - void buildBranch(World world, int x, int y, int z, int height, double length, double angle, double tilt, Random random) - { - ChunkCoordinates src = new ChunkCoordinates(x, y + height, z); - ChunkCoordinates dest = translateCoords(src.posX, src.posY, src.posZ, length, angle, tilt); - - // constrain branch spread - if ((dest.posX - x) < -4) - { - dest.posX = x - 4; - } - if ((dest.posX - x) > 4) - { - dest.posX = x + 4; - } - if ((dest.posZ - z) < -4) - { - dest.posZ = z - 4; - } - if ((dest.posZ - z) > 4) - { - dest.posZ = z + 4; - } - - drawBresehnam(world, src.posX, src.posY, src.posZ, dest.posX, dest.posY, dest.posZ, treeBlock, branchMeta); - - if (Math.abs(x - dest.posX) + 2 > 7 || Math.abs(z - dest.posZ) + 2 > 7 ) - { - System.out.println("getting branch too far. x = " + (x - dest.posX + 2) + ", z = " + (z - dest.posZ + 2)); - } - - leafAround(world, dest.posX, dest.posY, dest.posZ); - - } - - /** - * Make our leaf pattern - */ - private void leafAround(World world, int dx, int dy, int dz) { - int leafSize = 4; - - // only leaf if there are no leaves by where we are thinking of leafing - if (hasAirAround(world, dx, dy, dz)) - { - makeLeafCircle(world, dx, dy - 1, dz, leafSize, leafBlock, leafMeta); - makeLeafCircle(world, dx, dy, dz, leafSize + 1, leafBlock, leafMeta); - makeLeafCircle(world, dx, dy + 1, dz, leafSize, leafBlock, leafMeta); - makeLeafCircle(world, dx, dy + 2, dz, leafSize - 2, leafBlock, leafMeta); - } - } - -} diff --git a/src/main/java/twilightforest/world/TFGenFallenHollowLog.java b/src/main/java/twilightforest/world/TFGenFallenHollowLog.java deleted file mode 100644 index 2fc55d3865..0000000000 --- a/src/main/java/twilightforest/world/TFGenFallenHollowLog.java +++ /dev/null @@ -1,244 +0,0 @@ -package twilightforest.world; - -import java.util.Random; - -import net.minecraft.init.Blocks; -import net.minecraft.world.World; -import twilightforest.block.BlockTFPlant; -import twilightforest.block.TFBlocks; - - - -public class TFGenFallenHollowLog extends TFGenerator { - - @Override - public boolean generate(World world, Random rand, int x, int y, int z) { - - return rand.nextBoolean() ? makeLog4Z(world, rand, x, y, z) : makeLog4X(world, rand, x, y, z); - } - - private boolean makeLog4Z(World world, Random rand, int x, int y, int z) { - // +Z 4x4 log - if (!isAreaSuitable(world, rand, x, y, z, 9, 3, 4)) - { - return false; - } - - // jaggy parts - makeNegativeZJaggy(world, x, y, z, rand.nextInt(3), 0, 0); - makeNegativeZJaggy(world, x, y, z, rand.nextInt(3), 3, 0); - makeNegativeZJaggy(world, x, y, z, rand.nextInt(3), 0, 1); - makeNegativeZJaggy(world, x, y, z, rand.nextInt(3), 3, 1); - makeNegativeZJaggy(world, x, y, z, rand.nextInt(3), 1, 2); - makeNegativeZJaggy(world, x, y, z, rand.nextInt(3), 2, 2); - - makePositiveZJaggy(world, x, y, z, rand.nextInt(3), 0, 0); - makePositiveZJaggy(world, x, y, z, rand.nextInt(3), 3, 0); - makePositiveZJaggy(world, x, y, z, rand.nextInt(3), 0, 1); - makePositiveZJaggy(world, x, y, z, rand.nextInt(3), 3, 1); - makePositiveZJaggy(world, x, y, z, rand.nextInt(3), 1, 2); - makePositiveZJaggy(world, x, y, z, rand.nextInt(3), 2, 2); - - // center - for (int dz = 0; dz < 4; dz++) - { - // floor - if (rand.nextBoolean()) - { - this.setBlockAndMetadata(world, x + 1, y - 1, z + dz + 3, TFBlocks.log, 8); - if (rand.nextBoolean()) - { - this.setBlockAndMetadata(world, x + 1, y + 0, z + dz + 3, TFBlocks.plant, BlockTFPlant.META_MOSSPATCH); - } - } - else - { - this.setBlockAndMetadata(world, x + 1, y - 1, z + dz + 3, Blocks.dirt, 0); - this.setBlockAndMetadata(world, x + 1, y + 0, z + dz + 3, TFBlocks.plant, BlockTFPlant.META_MOSSPATCH); - } - if (rand.nextBoolean()) - { - this.setBlockAndMetadata(world, x + 2, y - 1, z + dz + 3, TFBlocks.log, 8); - if (rand.nextBoolean()) - { - this.setBlockAndMetadata(world, x + 2, y + 0, z + dz + 3, TFBlocks.plant, BlockTFPlant.META_MOSSPATCH); - } - } - else - { - this.setBlockAndMetadata(world, x + 2, y - 1, z + dz + 3, Blocks.dirt, 0); - this.setBlockAndMetadata(world, x + 2, y + 0, z + dz + 3, TFBlocks.plant, BlockTFPlant.META_MOSSPATCH); - } - - // log part - this.setBlockAndMetadata(world, x + 0, y + 0, z + dz + 3, TFBlocks.log, 8); - this.setBlockAndMetadata(world, x + 3, y + 0, z + dz + 3, TFBlocks.log, 8); - this.setBlockAndMetadata(world, x + 0, y + 1, z + dz + 3, TFBlocks.log, 8); - this.setBlockAndMetadata(world, x + 3, y + 1, z + dz + 3, TFBlocks.log, 8); - this.setBlockAndMetadata(world, x + 1, y + 2, z + dz + 3, TFBlocks.log, 8); - this.setBlockAndMetadata(world, x + 2, y + 2, z + dz + 3, TFBlocks.log, 8); - if (rand.nextBoolean()) - { - this.setBlockAndMetadata(world, x + 1, y + 3, z + dz + 3, TFBlocks.plant, BlockTFPlant.META_MOSSPATCH); - } - if (rand.nextBoolean()) - { - this.setBlockAndMetadata(world, x + 2, y + 3, z + dz + 3, TFBlocks.plant, BlockTFPlant.META_MOSSPATCH); - } - } - - // a few leaves? - int offZ = rand.nextInt(3) + 2; - boolean plusX = rand.nextBoolean(); - for (int dz = 0; dz < 3; dz++) - { - if (rand.nextBoolean()) - { - this.setBlockAndMetadata(world, x + (plusX ? 3 : 0), y + 2, z + dz + offZ, TFBlocks.leaves, 0); - if (rand.nextBoolean()) - { - this.setBlockAndMetadata(world, x + (plusX ? 3 : 0), y + 3, z + dz + offZ, TFBlocks.leaves, 0); - } - if (rand.nextBoolean()) - { - this.setBlockAndMetadata(world, x + (plusX ? 4 : -1), y + 2, z + dz + offZ, TFBlocks.leaves, 0); - } - } - } - - - // firefly - this.setBlockAndMetadata(world, x + (plusX ? 0 : 3), y + 2, z + rand.nextInt(4) + 3, TFBlocks.firefly, 0); - - - return true; - } - - private void makeNegativeZJaggy(World world, int x, int y, int z, int length, int dx, int dy) { - for (int dz = -length; dz < 0; dz++) - { - this.setBlockAndMetadata(world, x + dx, y + dy, z + dz + 3, TFBlocks.log, 8); - } - } - - private void makePositiveZJaggy(World world, int x, int y, int z, int length, int dx, int dy) { - for (int dz = 0; dz < length; dz++) - { - this.setBlockAndMetadata(world, x + dx, y + dy, z + dz + 7, TFBlocks.log, 8); - } - } - - /** - * Make a 4x4 log in the +X direction - */ - private boolean makeLog4X(World world, Random rand, int x, int y, int z) { - // +Z 4x4 log - if (!isAreaSuitable(world, rand, x, y, z, 4, 3, 9)) - { - return false; - } - - // jaggy parts - makeNegativeXJaggy(world, x, y, z, rand.nextInt(3), 0, 0); - makeNegativeXJaggy(world, x, y, z, rand.nextInt(3), 3, 0); - makeNegativeXJaggy(world, x, y, z, rand.nextInt(3), 0, 1); - makeNegativeXJaggy(world, x, y, z, rand.nextInt(3), 3, 1); - makeNegativeXJaggy(world, x, y, z, rand.nextInt(3), 1, 2); - makeNegativeXJaggy(world, x, y, z, rand.nextInt(3), 2, 2); - - makePositiveXJaggy(world, x, y, z, rand.nextInt(3), 0, 0); - makePositiveXJaggy(world, x, y, z, rand.nextInt(3), 3, 0); - makePositiveXJaggy(world, x, y, z, rand.nextInt(3), 0, 1); - makePositiveXJaggy(world, x, y, z, rand.nextInt(3), 3, 1); - makePositiveXJaggy(world, x, y, z, rand.nextInt(3), 1, 2); - makePositiveXJaggy(world, x, y, z, rand.nextInt(3), 2, 2); - - // center - for (int dx = 0; dx < 4; dx++) - { - // floor - if (rand.nextBoolean()) - { - this.setBlockAndMetadata(world, x + dx + 3, y - 1, z + 1, TFBlocks.log, 4); - if (rand.nextBoolean()) - { - this.setBlockAndMetadata(world, x + dx + 3, y, z + 1, TFBlocks.plant, BlockTFPlant.META_MOSSPATCH); - } - } - else - { - this.setBlockAndMetadata(world, x + dx + 3, y - 1, z + 1, Blocks.dirt, 0); - this.setBlockAndMetadata(world, x + dx + 3, y, z + 1, TFBlocks.plant, BlockTFPlant.META_MOSSPATCH); - } - if (rand.nextBoolean()) - { - this.setBlockAndMetadata(world, x + dx + 3, y - 1, z + 2, TFBlocks.log, 4); - if (rand.nextBoolean()) - { - this.setBlockAndMetadata(world, x + dx + 3, y, z + 2, TFBlocks.plant, BlockTFPlant.META_MOSSPATCH); - } - } - else - { - this.setBlockAndMetadata(world, x + dx + 3, y - 1, z + 2, Blocks.dirt, 0); - this.setBlockAndMetadata(world, x + dx + 3, y, z + 2, TFBlocks.plant, BlockTFPlant.META_MOSSPATCH); - } - - // log part - this.setBlockAndMetadata(world, x + dx + 3, y + 0, z + 0, TFBlocks.log, 4); - this.setBlockAndMetadata(world, x + dx + 3, y + 0, z + 3, TFBlocks.log, 4); - this.setBlockAndMetadata(world, x + dx + 3, y + 1, z + 0, TFBlocks.log, 4); - this.setBlockAndMetadata(world, x + dx + 3, y + 1, z + 3, TFBlocks.log, 4); - this.setBlockAndMetadata(world, x + dx + 3, y + 2, z + 1, TFBlocks.log, 4); - this.setBlockAndMetadata(world, x + dx + 3, y + 2, z + 2, TFBlocks.log, 4); - if (rand.nextBoolean()) - { - this.setBlockAndMetadata(world, x + dx + 3, y + 3, z + 1, TFBlocks.plant, BlockTFPlant.META_MOSSPATCH); - } - if (rand.nextBoolean()) - { - this.setBlockAndMetadata(world, x + dx + 3, y + 3, z + 2, TFBlocks.plant, BlockTFPlant.META_MOSSPATCH); - } - - } - - // a few leaves? - int offX = rand.nextInt(3) + 2; - boolean plusZ = rand.nextBoolean(); - for (int dx = 0; dx < 3; dx++) - { - if (rand.nextBoolean()) - { - this.setBlockAndMetadata(world, x + dx + offX, y + 2, z + (plusZ ? 3 : 0), TFBlocks.leaves, 0); - if (rand.nextBoolean()) - { - this.setBlockAndMetadata(world, x + dx + offX, y + 3, z + (plusZ ? 3 : 0), TFBlocks.leaves, 0); - } - if (rand.nextBoolean()) - { - this.setBlockAndMetadata(world, x + dx + offX, y + 2, z + (plusZ ? 4 : -1), TFBlocks.leaves, 0); - } - } - } - - - // firefly - this.setBlockAndMetadata(world, x + rand.nextInt(4) + 3, y + 2, z + (plusZ ? 0 : 3), TFBlocks.firefly, 0); - - return true; - } - - private void makeNegativeXJaggy(World world, int x, int y, int z, int length, int dz, int dy) { - for (int dx = -length; dx < 0; dx++) - { - this.setBlockAndMetadata(world, x + 3 + dx, y + dy, z + dz, TFBlocks.log, 4); - } - } - - private void makePositiveXJaggy(World world, int x, int y, int z, int length, int dz, int dy) { - for (int dx = 0; dx < length; dx++) - { - this.setBlockAndMetadata(world, x + dx + 7, y + dy, z + dz, TFBlocks.log, 4); - } - } -} diff --git a/src/main/java/twilightforest/world/TFGenFallenSmallLog.java b/src/main/java/twilightforest/world/TFGenFallenSmallLog.java deleted file mode 100644 index 60de90504b..0000000000 --- a/src/main/java/twilightforest/world/TFGenFallenSmallLog.java +++ /dev/null @@ -1,133 +0,0 @@ -package twilightforest.world; - -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.init.Blocks; -import net.minecraft.world.World; -import twilightforest.block.BlockTFPlant; -import twilightforest.block.TFBlocks; - -public class TFGenFallenSmallLog extends TFGenerator { - - @Override - public boolean generate(World world, Random rand, int x, int y, int z) { - - // determine direction - boolean goingX = rand.nextBoolean(); - - // length - int length = rand.nextInt(4) + 3; - - // check area clear - if (goingX) - { - if (!isAreaSuitable(world, rand, x, y, z, length, 3, 2)) - { - return false; - } - } - else - { - if (!isAreaSuitable(world, rand, x, y, z, 3, length, 2)) - { - return false; - } - } - - // determine wood type - Block logID; - int logMeta; - int logMetaBranch; - - switch (rand.nextInt(7)) - { - case 0: - default: - logID = TFBlocks.log; - logMeta = 0; - case 1: - logID = TFBlocks.log; - logMeta = 1; - case 2: - logID = TFBlocks.log; - logMeta = 2; - case 3: - logID = Blocks.log; - logMeta = 0; - case 4: - logID = Blocks.log; - logMeta = 1; - case 5: - logID = Blocks.log; - logMeta = 2; - case 6: - logID = Blocks.log; - logMeta = 3; - } - logMetaBranch = logMeta; - - // check biome - - - // make log - if (goingX) - { - logMeta |= 4; - logMetaBranch |= 8; - - for (int lx = 0; lx < length; lx++) - { - this.setBlockAndMetadata(world, x + lx, y + 0, z + 1, logID, logMeta); - if (rand.nextInt(3) > 0) - { - this.setBlockAndMetadata(world, x + lx, y + 1, z + 1, TFBlocks.plant, BlockTFPlant.META_MOSSPATCH); - } - } - } - else - { - logMeta |= 8; - logMetaBranch |= 4; - - for (int lz = 0; lz < length; lz++) - { - this.setBlockAndMetadata(world, x + 1, y + 0, z + lz, logID, logMeta); - if (rand.nextInt(3) > 0) - { - this.setBlockAndMetadata(world, x + 1, y + 1, z + lz, TFBlocks.plant, BlockTFPlant.META_MOSSPATCH); - } - } - } - - // possibly make branch - if (rand.nextInt(3) > 0) - { - if (goingX) - { - int bx = rand.nextInt(length); - int bz = rand.nextBoolean() ? 2 : 0; - - this.setBlockAndMetadata(world, x + bx, y + 0, z + bz, logID, logMetaBranch); - if (rand.nextBoolean()) - { - this.setBlockAndMetadata(world, x + bx, y + 1, z + bz, TFBlocks.plant, BlockTFPlant.META_MOSSPATCH); - } - } - else - { - int bx = rand.nextBoolean() ? 2 : 0; - int bz = rand.nextInt(length); - - this.setBlockAndMetadata(world, x + bx, y + 0, z + bz, logID, logMetaBranch); - if (rand.nextBoolean()) - { - this.setBlockAndMetadata(world, x + bx, y + 1, z + bz, TFBlocks.plant, BlockTFPlant.META_MOSSPATCH); - } - } - } - - return true; - } - -} diff --git a/src/main/java/twilightforest/world/TFGenFireJet.java b/src/main/java/twilightforest/world/TFGenFireJet.java deleted file mode 100644 index 6e96885ae6..0000000000 --- a/src/main/java/twilightforest/world/TFGenFireJet.java +++ /dev/null @@ -1,60 +0,0 @@ -package twilightforest.world; - -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.init.Blocks; -import net.minecraft.world.World; - -public class TFGenFireJet extends TFGenerator -{ - private Block plantBlockId; - private int plantBlockMeta; - - public TFGenFireJet(Block fireJet, int meta) - { - this.plantBlockId = fireJet; - this.plantBlockMeta = meta; - } - - @Override - public boolean generate(World world, Random rand, int x, int y, int z) { - for (int var6 = 0; var6 < 4; ++var6) - { - int dx = x + rand.nextInt(8) - rand.nextInt(8); - int dy = y + rand.nextInt(4) - rand.nextInt(4); - int dz = z + rand.nextInt(8) - rand.nextInt(8); - - if (world.isAirBlock(dx, dy, dz) && world.canBlockSeeTheSky(dx, dy, dz) && world.getBlock(dx, dy - 1, dz).getMaterial() == Material.grass - && world.getBlock(dx + 1, dy - 1, dz).getMaterial() == Material.grass && world.getBlock(dx - 1, dy - 1, dz).getMaterial() == Material.grass - && world.getBlock(dx, dy - 1, dz + 1).getMaterial() == Material.grass && world.getBlock(dx, dy - 1, dz - 1).getMaterial() == Material.grass) - { - // jet - world.setBlock(dx, dy - 1, dz, this.plantBlockId, this.plantBlockMeta, 0); - - // create reservoir with stone walls - for (int rx = -2; rx <= 2; rx++) - { - for (int rz = -2; rz <= 2; rz++) - { - if ((rx == 1 || rx == 0 || rx == -1) && (rz == 1 || rz == 0 || rz == -1)) - { - // lava reservoir - world.setBlock(dx + rx, dy - 2, dz + rz, Blocks.flowing_lava, 0, 0); - } - else if (world.getBlock(dx + rx, dy - 2, dz + rz).getMaterial() != Material.lava) - { - // only stone where there is no lava - world.setBlock(dx + rx, dy - 2, dz + rz, Blocks.stone, 0, 0); - } - world.setBlock(dx + rx, dy - 3, dz + rz, Blocks.stone, 0, 0); - } - } - } - } - - return true; - - } -} diff --git a/src/main/java/twilightforest/world/TFGenFoundation.java b/src/main/java/twilightforest/world/TFGenFoundation.java deleted file mode 100644 index 1c9d2dd1ea..0000000000 --- a/src/main/java/twilightforest/world/TFGenFoundation.java +++ /dev/null @@ -1,74 +0,0 @@ -package twilightforest.world; - -import java.util.Random; - -import net.minecraft.init.Blocks; -import net.minecraft.world.World; -import twilightforest.TFTreasure; - - - -public class TFGenFoundation extends TFGenerator { - - @Override - public boolean generate(World world, Random rand, int x, int y, int z) { - int sx = 5 + rand.nextInt(5); - int sz = 5 + rand.nextInt(5); - - - if (!isAreaSuitable(world, rand, x, y, z, sx, 4, sz)) - { - return false; - } - - //okay! - for (int cx = 0; cx <= sx; cx++) - { - for (int cz = 0; cz <= sz; cz++) - { - if (cx == 0 || cx == sx || cz == 0 || cz == sz) - { - // stone on the edges - int ht = rand.nextInt(4) + 1; - - for (int cy = 0; cy <= ht; cy++) - { - setBlock(world, x + cx, y + cy - 1, z + cz, randStone(rand, cy + 1)); - } - } - else - { - // destroyed wooden plank floor - if (rand.nextInt(3) != 0) { - setBlock(world, x + cx, y - 1, z + cz, Blocks.planks); - } - } - } - } - - //TODO: chimney? - - // 50% basement chance! - if (rand.nextInt(2) == 0) { - // clear basement - for (int cx = 1; cx < sx; cx++) - { - for (int cz = 1; cz < sz; cz++) - { - setBlock(world, x + cx, y - 3, z + cz, Blocks.air); - setBlock(world, x + cx, y - 4, z + cz, Blocks.air); - } - } - - // make chest - int cx = rand.nextInt(sx - 1) + 1; - int cz = rand.nextInt(sz - 1) + 1; - TFTreasure.basement.generate(world, rand, x + cx, y - 4, z + cz); - - } - - - - return true; - } -} diff --git a/src/main/java/twilightforest/world/TFGenGroveRuins.java b/src/main/java/twilightforest/world/TFGenGroveRuins.java deleted file mode 100644 index cd4007bbe3..0000000000 --- a/src/main/java/twilightforest/world/TFGenGroveRuins.java +++ /dev/null @@ -1,123 +0,0 @@ -package twilightforest.world; - -import java.util.Random; - -import net.minecraft.init.Blocks; -import net.minecraft.world.World; - - -/** - * Several ruin types that look like the quest grove - * - * @author Ben - * - */ -public class TFGenGroveRuins extends TFGenerator { - - - @Override - public boolean generate(World world, Random rand, int x, int y, int z) { - - if (rand.nextBoolean()) - { - return generateLargeArch(world, rand, x, y, z); - } - else - { - return generateSmallArch(world, rand, x, y, z); - } - } - - /** - * Generate a ruin with the larger arch - */ - private boolean generateLargeArch(World world, Random rand, int x, int y, int z) { - if (!isAreaSuitable(world, rand, x, y, z, 2, 7, 6)) - { - return false; - } - - // pillar - for (int dy = -2; dy <= 7; dy++) { - this.setBlockAndMetadata(world, x + 0, y + dy, z + 1, Blocks.stonebrick, 1); - this.setBlockAndMetadata(world, x + 1, y + dy, z + 1, Blocks.stonebrick, 1); - this.setBlockAndMetadata(world, x + 0, y + dy, z + 2, Blocks.stonebrick, 1); - this.setBlockAndMetadata(world, x + 1, y + dy, z + 2, Blocks.stonebrick, 1); - } - - // broken floor part - this.setBlockAndMetadata(world, x + 0, y - 1, z + 3, Blocks.stonebrick, 1); - this.setBlockAndMetadata(world, x + 1, y - 1, z + 3, Blocks.stonebrick, 1); - this.setBlockAndMetadata(world, x + 0, y - 2, z + 3, Blocks.stonebrick, 1); - this.setBlockAndMetadata(world, x + 1, y - 2, z + 3, Blocks.stonebrick, 1); - this.setBlockAndMetadata(world, x + 0, y - 1, z + 4, Blocks.stonebrick, 1); - this.setBlockAndMetadata(world, x + 1, y - 1, z + 4, Blocks.stonebrick, 1); - this.setBlockAndMetadata(world, x + 0, y - 2, z + 4, Blocks.stonebrick, 1); - this.setBlockAndMetadata(world, x + 1, y - 2, z + 4, Blocks.stonebrick, 1); - this.setBlockAndMetadata(world, x + 0, y - 1, z + 5, Blocks.stonebrick, 1); - this.setBlockAndMetadata(world, x + 1, y - 2, z + 5, Blocks.stonebrick, 1); - - // broken top part - this.setBlockAndMetadata(world, x + 0, y + 6, z + 3, Blocks.stonebrick, 1); - this.setBlockAndMetadata(world, x + 1, y + 6, z + 3, Blocks.stonebrick, 1); - this.setBlockAndMetadata(world, x + 0, y + 7, z + 3, Blocks.stonebrick, 1); - this.setBlockAndMetadata(world, x + 1, y + 7, z + 3, Blocks.stonebrick, 1); - this.setBlockAndMetadata(world, x + 0, y + 6, z + 4, Blocks.stonebrick, 1); - this.setBlockAndMetadata(world, x + 1, y + 6, z + 4, Blocks.stonebrick, 1); - this.setBlockAndMetadata(world, x + 0, y + 7, z + 4, Blocks.stonebrick, 1); - this.setBlockAndMetadata(world, x + 1, y + 7, z + 4, Blocks.stonebrick, 1); - this.setBlockAndMetadata(world, x + 1, y + 7, z + 5, Blocks.stonebrick, 1); - - // small piece of chiseled stone brick - this.setBlockAndMetadata(world, x + 0, y + 5, z + 0, Blocks.stonebrick, 3); - - return true; - } - - /** - * Generate a ruin with the smaller arch - */ - private boolean generateSmallArch(World world, Random rand, int x, int y, int z) { - if (!isAreaSuitable(world, rand, x, y, z, 7, 5, 9)) - { - return false; - } - - // corner - this.setBlockAndMetadata(world, x + 0, y + 4, z + 0, Blocks.stonebrick, 3); - this.setBlockAndMetadata(world, x + 0, y + 3, z + 0, Blocks.stonebrick, 3); - this.setBlockAndMetadata(world, x + 1, y + 4, z + 0, Blocks.stonebrick, 3); - this.setBlockAndMetadata(world, x + 2, y + 4, z + 0, Blocks.stonebrick, 3); - this.setBlockAndMetadata(world, x + 0, y + 4, z + 1, Blocks.stonebrick, 3); - this.setBlockAndMetadata(world, x + 0, y + 4, z + 2, Blocks.stonebrick, 3); - - // broken arch in x direction - for (int dy = -1; dy <= 5; dy++) { - this.setBlockAndMetadata(world, x + 3, y + dy, z + 0, Blocks.stonebrick, 1); - } - this.setBlockAndMetadata(world, x + 4, y - 1, z + 0, Blocks.stonebrick, 1); - this.setBlockAndMetadata(world, x + 5, y - 1, z + 0, Blocks.stonebrick, 1); - this.setBlockAndMetadata(world, x + 6, y - 1, z + 0, Blocks.stonebrick, 1); - - this.setBlockAndMetadata(world, x + 4, y + 5, z + 0, Blocks.stonebrick, 1); - this.setBlockAndMetadata(world, x + 5, y + 5, z + 0, Blocks.stonebrick, 1); - - // full arch in z direction - for (int dy = -1; dy <= 5; dy++) { - this.setBlockAndMetadata(world, x + 0, y + dy, z + 3, Blocks.stonebrick, 1); - this.setBlockAndMetadata(world, x + 0, y + dy, z + 7, Blocks.stonebrick, 1); - } - for (int dz = 4; dz < 7; dz++) { - this.setBlockAndMetadata(world, x + 0, y - 1, z + dz, Blocks.stonebrick, 1); - this.setBlockAndMetadata(world, x + 0, y + 5, z + dz, Blocks.stonebrick, 1); - } - - // small piece of chiseled stone brick - this.setBlockAndMetadata(world, x + 0, y + 4, z + 8, Blocks.stonebrick, 3); - - - return true; - } - -} - diff --git a/src/main/java/twilightforest/world/TFGenHangingLamps.java b/src/main/java/twilightforest/world/TFGenHangingLamps.java deleted file mode 100644 index 2c534b4e8b..0000000000 --- a/src/main/java/twilightforest/world/TFGenHangingLamps.java +++ /dev/null @@ -1,63 +0,0 @@ -package twilightforest.world; - -import java.util.Random; - -import twilightforest.block.TFBlocks; -import net.minecraft.block.material.Material; -import net.minecraft.init.Blocks; -import net.minecraft.world.World; - - - -public class TFGenHangingLamps extends TFGenerator -{ - private static final int MAX_HANG = 8; - - public boolean generate(World par1World, Random par2Random, int x, int y, int z) - { - // this must be an air block, surrounded by air - if (par1World.isAirBlock(x, y, z) && TFGenerator.surroundedByAir(par1World, x, y, z)) { - // there should be leaves or wood within 12 blocks above - if (areLeavesAbove(par1World, x, y, z)) { - // we need to be at least 4 above ground - if (isClearBelow(par1World, x, y, z)) { - // generate lamp - par1World.setBlock(x, y, z, TFBlocks.fireflyJar); - - for (int cy = 1; cy < MAX_HANG; cy++) { - Material above = par1World.getBlock(x, y + cy, z).getMaterial(); - if (above.isSolid() || above == Material.leaves) { - break; - } else { - par1World.setBlock(x, y + cy, z, Blocks.fence); - } - } - } - } - - } - - return false; - } - - private boolean areLeavesAbove(World par1World, int x, int y, int z) { - boolean areLeavesAbove = false; - for (int cy = 1; cy < MAX_HANG; cy++) { - Material above = par1World.getBlock(x, y + cy, z).getMaterial(); - if (above.isSolid() || above == Material.leaves) { - areLeavesAbove = true; - } - } - return areLeavesAbove; - } - - private boolean isClearBelow(World par1World, int x, int y, int z) { - boolean isClearBelow = true; - for (int cy = 1; cy < 4; cy++) { - if (World.doesBlockHaveSolidTopSurface(par1World, x, y - cy, z)) { - isClearBelow = false; - } - } - return isClearBelow; - } -} diff --git a/src/main/java/twilightforest/world/TFGenHollowStump.java b/src/main/java/twilightforest/world/TFGenHollowStump.java deleted file mode 100644 index 57288e3789..0000000000 --- a/src/main/java/twilightforest/world/TFGenHollowStump.java +++ /dev/null @@ -1,97 +0,0 @@ -package twilightforest.world; - -import java.util.Random; - -import net.minecraft.world.World; - - -/** - * A stump from a hollow tree - * - * @author Ben - * - */ -public class TFGenHollowStump extends TFGenHollowTree { - - @Override - public boolean generate(World world, Random rand, int x, int y, int z) { - - int radius = rand.nextInt(2) + 2; - - if (!isAreaSuitable(world, rand, x - radius, y, z - radius, 2 * radius, 6, 2 * radius)) - { - return false; - } - - buildTrunk(world, rand, x, y, z, radius, 6); - - // 3-5 roots at the bottom - buildBranchRing(world, rand, x, y, z, radius, 3, 2, 6, 0, 0.75D, 0, 3, 5, 3, false); - - - // several more taproots - buildBranchRing(world, rand, x, y, z, radius, 1, 2, 8, 0, 0.9D, 0, 3, 5, 3, false); - - - return true; - } - - /** - * This function builds the hollow trunk of the tree - */ - protected void buildTrunk(World world, Random random, int x, int y, int z, int diameter, int maxHeight) { - - int hollow = diameter / 2; - - - // go down 4 squares and fill in extra trunk as needed, in case we're on uneven terrain - for (int dx = -diameter; dx <= diameter; dx++) - { - for (int dz = -diameter; dz <= diameter; dz++) - { - for (int dy = -4; dy < 0; dy++) - { - // determine how far we are from the center. - int ax = Math.abs(dx); - int az = Math.abs(dz); - int dist = (int)(Math.max(ax, az) + (Math.min(ax, az) * 0.5)); - - if (dist <= diameter) { - if (hasAirAround(world, dx + x, dy + y, dz + z)) { - this.setBlockAndMetadata(world, dx + x, dy + y, dz + z, treeBlock, dist > hollow ? treeMeta : branchMeta); - } - else { - this.setBlockAndMetadata(world, dx + x, dy + y, dz + z, rootBlock, rootMeta); - } - } - } - } - } - - // build the trunk upwards - for (int dx = -diameter; dx <= diameter; dx++) - { - for (int dz = -diameter; dz <= diameter; dz++) - { - int height = 2 + random.nextInt(3) + random.nextInt(2); - - for (int dy = 0; dy <= height; dy++) - { - // determine how far we are from the center. - int ax = Math.abs(dx); - int az = Math.abs(dz); - int dist = (int)(Math.max(ax, az) + (Math.min(ax, az) * 0.5)); - - // make a trunk! - if (dist <= diameter && dist > hollow) { - setBlockAndMetadata(world, dx + x, dy + y, dz + z, treeBlock, treeMeta); - } - } - } - } - - } - - -} - diff --git a/src/main/java/twilightforest/world/TFGenHollowTree.java b/src/main/java/twilightforest/world/TFGenHollowTree.java deleted file mode 100644 index 07cd4cbc6f..0000000000 --- a/src/main/java/twilightforest/world/TFGenHollowTree.java +++ /dev/null @@ -1,568 +0,0 @@ -package twilightforest.world; - -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.init.Blocks; -import net.minecraft.tileentity.TileEntityMobSpawner; -import net.minecraft.util.ChunkCoordinates; -import net.minecraft.util.Direction; -import net.minecraft.world.World; -import twilightforest.TFTreasure; -import twilightforest.block.BlockTFRoots; -import twilightforest.block.TFBlocks; -import twilightforest.entity.TFCreatures; - - - -public class TFGenHollowTree extends TFGenerator -{ - - private static final int LEAF_DUNGEON_CHANCE = 8; - - protected Block treeBlock = TFBlocks.log; - protected int treeMeta = 0; - protected int branchMeta = 12; - protected Block leafBlock = TFBlocks.leaves; - protected int leafMeta = 0; - protected Block rootBlock = TFBlocks.root; - protected int rootMeta = BlockTFRoots.ROOT_META; - - public TFGenHollowTree() - { - this(false); - } - - public TFGenHollowTree(boolean par1) - { - super(par1); - } - - public boolean generate(World world, Random random, int x, int y, int z) { - - int height = random.nextInt(64) + 32; - int diameter = random.nextInt(4) + 1; - - - // do we have enough height? - if(y < 1 || y + height + diameter > TFWorld.MAXHEIGHT) - { -// System.out.println("Failed with hollow tree of height " + height); - return false; - } -// System.out.println("Succeeded with hollow tree of height " + height); - -// // are we going to hit something? -// for (int dx = -diameter; dx <= diameter; dx++) -// { -// for (int dz = -diameter; dz <= diameter; dz++) -// { -// for (int dy = 1; dy <= height; dy++) -// { -// int whatsThere = world.getBlock(dx + x, dy + y, dz + z); -// if(whatsThere != 0 && whatsThere != Blocks.leaves) -// { -// System.out.println("Failed tree due to things at the base at height " + dy); -// return false; -// } -// } -// } -// } - // check the top too - int crownRadius = diameter * 4 + 8; - for (int dx = -crownRadius; dx <= crownRadius; dx++) - { - for (int dz = -crownRadius; dz <= crownRadius; dz++) - { - for (int dy = height - crownRadius; dy <= height + crownRadius; dy++) - { - Block whatsThere = world.getBlock(dx + x, dy + y, dz + z); - if(whatsThere != Blocks.air && whatsThere != Blocks.leaves) - { -// System.out.println("Failed tree due to things at the top"); - return false; - } - } - } - } - - - // make a tree! - - // check if we're on dirt or grass - Block j1 = world.getBlock(x, y - 1, z); - if(j1 != Blocks.grass && j1 != Blocks.dirt) - { - return false; - } - - // build the trunk - buildTrunk(world, random, x, y, z, diameter, height); - - // fireflies - int numFireflies = random.nextInt(3 * diameter) + 5; - for (int i = 0; i <= numFireflies; i++) { - int fHeight = (int)(height * random.nextDouble() * 0.9) + (height / 10); - double fAngle = random.nextDouble(); - addFirefly(world, x, y, z, diameter, fHeight, fAngle); - } - - // cicadas - numFireflies = random.nextInt(3 * diameter) + 5; - for (int i = 0; i <= numFireflies; i++) { - int fHeight = (int)(height * random.nextDouble() * 0.9) + (height / 10); - double fAngle = random.nextDouble(); - addCicada(world, x, y, z, diameter, fHeight, fAngle); - } - - // build the crown - buildFullCrown(world, random, x, y, z, diameter, height); - - - // 3-5 couple branches on the way up... - int numBranches = random.nextInt(3) + 3; - for (int i = 0; i <= numBranches; i++) { - int branchHeight = (int)(height * random.nextDouble() * 0.9) + (height / 10); - double branchRotation = random.nextDouble(); - makeSmallBranch(world, random, x, y, z, diameter, branchHeight, 4, branchRotation, 0.35D, true); - } - - // 3-5 roots at the bottom - buildBranchRing(world, random, x, y, z, diameter, 3, 2, 6, 0, 0.75D, 0, 3, 5, 3, false); - - - // several more taproots - buildBranchRing(world, random, x, y, z, diameter, 1, 2, 8, 0, 0.9D, 0, 3, 5, 3, false); - - return true; - } - - /** - * Build the crown of the tree - * @param diameter - * @param height - */ - protected void buildFullCrown(World world, Random random, int x, int y, int z, int diameter, int height) { - int crownRadius = diameter * 4 + 4; - int bvar = diameter + 2; - - // okay, let's do 3-5 main branches starting at the bottom of the crown - buildBranchRing(world, random, x, y, z, diameter, height - crownRadius, 0, crownRadius, 0, 0.35D, 0, bvar, bvar + 2, 2, true); - - // then, let's do 3-5 medium branches at the crown middle - buildBranchRing(world, random, x, y, z, diameter, height - (crownRadius / 2), 0, crownRadius, 0, 0.28D, 0, bvar, bvar + 2, 1, true); - - // finally, let's do 2-4 main branches at the crown top - buildBranchRing(world, random, x, y, z, diameter, height, 0, crownRadius, 0, 0.15D, 0, 2, 4, 2, true); - - // and extra finally, let's do 3-6 medium branches going straight up - buildBranchRing(world, random, x, y, z, diameter, height, 0, (crownRadius / 2), 0, 0.05D, 0, bvar, bvar + 2, 1, true); - - // this glass sphere approximates where we want our crown - //drawBlob(x, y + height, z, (byte)crownRadius, (byte)Blocks.glass, false); - - } - - /** - * Build the crown of the tree. This builds a smaller crown, since the large ones were causing some performance issues - * @param height - */ - protected void buildWeakCrown(World world, Random random, int x, int y, int z, int diameter, int height) { - int crownRadius = 8; - int bvar = 2; - - // 3-5 medium branches starting at the bottom of the crown - buildBranchRing(world, random, x, y, z, diameter, height - crownRadius, 0, crownRadius, 0, 0.35D, 0, bvar, bvar + 2, 1, true); - - // 3-5 medium branches at the crown middle - buildBranchRing(world, random, x, y, z, diameter, height - (crownRadius / 2), 0, crownRadius, 0, 0.28D, 0, bvar, bvar + 2, 1, true); - - // 2-4 medium branches at the crown top - buildBranchRing(world, random, x, y, z, diameter, height, 0, crownRadius, 0, 0.15D, 0, 2, 4, 1, true); - - // 3-6 medium branches going straight up - buildBranchRing(world, random, x, y, z, diameter, height, 0, (crownRadius / 2), 0, 0.05D, 0, bvar, bvar + 2, 1, true); - } - - /** - * Build a ring of branches around the tree - * size 0 = small, 1 = med, 2 = large, 3 = root - */ - protected void buildBranchRing(World world, Random random, int x, int y, int z, int diameter, int branchHeight, int heightVar, int length, int lengthVar, double tilt, double tiltVar, int minBranches, int maxBranches, int size, boolean leafy) { - //let's do this! - int numBranches = random.nextInt(maxBranches - minBranches) + minBranches; - ; - double branchRotation = 1.0 / (numBranches + 1); - double branchOffset = random.nextDouble(); - - for (int i = 0; i <= numBranches; i++) { - int dHeight; - if (heightVar > 0) { - dHeight = branchHeight - heightVar + random.nextInt(2 * heightVar); - } else { - dHeight = branchHeight; - } - - if (size == 2) { - makeLargeBranch(world, random, x, y, z, diameter, dHeight, length, i * branchRotation + branchOffset, tilt, leafy); - } else if (size == 1) { - makeMedBranch(world, random, x, y, z, diameter, dHeight, length, i * branchRotation + branchOffset, tilt, leafy); - } else if (size == 3) { - makeRoot(world, random, x, y, z, diameter, dHeight, length, i * branchRotation + branchOffset, tilt); - } else { - makeSmallBranch(world, random, x, y, z, diameter, dHeight, length, i * branchRotation + branchOffset, tilt, leafy); - } - } - } - - - /** - * This function builds the hollow trunk of the tree - */ - protected void buildTrunk(World world, Random random, int x, int y, int z, int diameter, int height) { - - int hollow = diameter / 2; - - - // go down 4 squares and fill in extra trunk as needed, in case we're on uneven terrain - for (int dx = -diameter; dx <= diameter; dx++) - { - for (int dz = -diameter; dz <= diameter; dz++) - { - for (int dy = -4; dy < 0; dy++) - { - // determine how far we are from the center. - int ax = Math.abs(dx); - int az = Math.abs(dz); - int dist = (int)(Math.max(ax, az) + (Math.min(ax, az) * 0.5)); - - if (dist <= diameter) { - if (hasAirAround(world, dx + x, dy + y, dz + z)) { - this.setBlockAndMetadata(world, dx + x, dy + y, dz + z, treeBlock, dist > hollow ? treeMeta : branchMeta); - } - else { - this.setBlockAndMetadata(world, dx + x, dy + y, dz + z, rootBlock, rootMeta); - } - } - - } - } - } - - // build the trunk upwards - for (int dx = -diameter; dx <= diameter; dx++) - { - for (int dz = -diameter; dz <= diameter; dz++) - { - for (int dy = 0; dy <= height; dy++) - { - // determine how far we are from the center. - int ax = Math.abs(dx); - int az = Math.abs(dz); - int dist = (int)(Math.max(ax, az) + (Math.min(ax, az) * 0.5)); - - // make a trunk! - if (dist <= diameter && dist > hollow) { - setBlockAndMetadata(world, dx + x, dy + y, dz + z, treeBlock, treeMeta); - } - - - // fill it with lava! - if (dist <= hollow) { - // just kidding! - //world.setBlock(dx + x, dy + y, dz + z, Blocks.lava); - } - - // how about a ladder? is that okay? - if (dist == hollow && dx == hollow) { -// putBlockAndMetadata(dx + x, dy + y, dz + z, Blocks.ladder, 4, true); - setBlockAndMetadata(world, dx + x, dy + y, dz + z, Blocks.vine, 8); - } - } - } - } - - } - - /** - * Make a branch! - */ - protected void makeMedBranch(World world, Random random, int x, int y, int z, int diameter, int branchHeight, double length, double angle, double tilt, boolean leafy) { - int sx = x, sy = y + branchHeight, sz = z; - int[] src = translate(sx, sy, sz, diameter, angle, 0.5); - - makeMedBranch(world, random, src[0], src[1], src[2], length, angle, tilt, leafy); - - } - - /** - * Make a branch! - */ - protected void makeMedBranch(World world, Random random, int sx, int sy, int sz, double length, double angle, double tilt, boolean leafy) { - int[] src = {sx, sy, sz}; - int[] dest = translate(src[0], src[1], src[2], length, angle, tilt); - - //System.out.println("making a branch at angle " + angle); - - drawBresehnam(world, src[0], src[1], src[2], dest[0], dest[1], dest[2], treeBlock, branchMeta); - - // with leaves! - - if (leafy) { - /* - int numLeafBalls = random.nextInt(2) + 1; - for(int i = 0; i <= numLeafBalls; i++) { - - double slength = random.nextDouble() * 0.6 + 0.2; - int[] bdst = translate(src[0], src[1], src[2], slength, angle, tilt); - - - drawBlob(bdst[0], bdst[1], bdst[2], 2, leafBlock, false); - } - */ - - // and a blob at the end - drawLeafBlob(world, dest[0], dest[1], dest[2], (byte)2, leafBlock, leafMeta); - } - - - // and several small branches - - int numShoots = random.nextInt(2) + 1; - double angleInc, angleVar, outVar, tiltVar; - - angleInc = 0.8 / numShoots; - - for(int i = 0; i <= numShoots; i++) { - - angleVar = (angleInc * i) - 0.4; - outVar = (random.nextDouble() * 0.8) + 0.2; - tiltVar = (random.nextDouble() * 0.75) + 0.15; - - int[] bsrc = translate(src[0], src[1], src[2], length * outVar, angle, tilt); - double slength = length * 0.4; - - makeSmallBranch(world, random, bsrc[0], bsrc[1], bsrc[2], slength, angle + angleVar, tilt * tiltVar, leafy); - } - } - - /** - * Make a small branch with a leaf blob at the end - */ - protected void makeSmallBranch(World world, Random random, int sx, int sy, int sz, double length, double angle, double tilt, boolean leafy) { - int[] src = {sx, sy, sz}; - int[] dest = translate(src[0], src[1], src[2], length, angle, tilt); - - drawBresehnam(world, src[0], src[1], src[2], dest[0], dest[1], dest[2], treeBlock, branchMeta); - - //System.out.println("making a branch at angle " + angle); - if (leafy) { - byte leafRad = (byte) (random.nextInt(2) + 1); - drawLeafBlob(world, dest[0], dest[1] , dest[2], leafRad, leafBlock, leafMeta); - } - } - - /** - * Make a small branch at a certain height - */ - protected void makeSmallBranch(World world, Random random, int x, int y, int z, int diameter, int branchHeight, double length, double angle, double tilt, boolean leafy) { - int sx = x, sy = y + branchHeight, sz = z; - int[] src = translate(sx, sy, sz, diameter, angle, 0.5); - - makeSmallBranch(world, random, src[0], src[1], src[2], length, angle, tilt, leafy); - } - - - /** - * Make a root - */ - protected void makeRoot(World world, Random random, int x, int y, int z, int diameter, int branchHeight, double length, double angle, double tilt) { - ChunkCoordinates src = translateCoords(x, y + branchHeight, z, diameter, angle, 0.5); - ChunkCoordinates dest = translateCoords(src.posX, src.posY, src.posZ, length, angle, tilt); - - ChunkCoordinates[] lineArray = getBresehnamArrayCoords(src, dest); - boolean stillAboveGround = true; - for (ChunkCoordinates coord : lineArray) - { - if (stillAboveGround && hasAirAround(world, coord.posX, coord.posY, coord.posZ)) { - this.setBlockAndMetadata(world, coord.posX, coord.posY, coord.posZ, treeBlock, branchMeta); - this.setBlockAndMetadata(world, coord.posX, coord.posY - 1, coord.posZ, treeBlock, branchMeta); - } - else { - this.setBlockAndMetadata(world, coord.posX, coord.posY, coord.posZ, rootBlock, rootMeta); - this.setBlockAndMetadata(world, coord.posX, coord.posY - 1, coord.posZ, rootBlock, rootMeta); - stillAboveGround = false; - } - } - } - - /** - * Make a large, branching "base" branch in a specific location. - * - * The large branch will have 1-4 medium branches and several small branches too - */ - protected void makeLargeBranch(World world, Random random, int sx, int sy, int sz, double length, double angle, double tilt, boolean leafy) { - int[] src = {sx, sy, sz}; - int[] dest = translate(src[0], src[1], src[2], length, angle, tilt); - - // draw the main branch - drawBresehnam(world, src[0], src[1], src[2], dest[0], dest[1], dest[2], treeBlock, branchMeta); - - // reinforce it - //drawBresehnam(src[0], src[1] + 1, src[2], dest[0], dest[1], dest[2], treeBlock, true); - int reinforcements = random.nextInt(3); - for(int i = 0; i <= reinforcements; i++) { - int vx = (i & 2) == 0 ? 1 : 0; - int vy = (i & 1) == 0 ? 1 : -1; - int vz = (i & 2) == 0 ? 0 : 1; - drawBresehnam(world, src[0] + vx, src[1] + vy, src[2] + vz, dest[0], dest[1], dest[2], treeBlock, branchMeta); - } - - if (leafy) { - // add a leaf blob at the end - drawLeafBlob(world, dest[0], dest[1] + 1, dest[2], (byte)3, leafBlock, leafMeta); - } - - // go about halfway out and make a few medium branches. - // the number of medium branches we can support depends on the length of the big branch - // every other branch switches sides - int numMedBranches = random.nextInt((int)(length / 6)) + random.nextInt(2) + 1; - - for (int i = 0; i <= numMedBranches; i++) { - - double outVar = (random.nextDouble() * 0.3) + 0.3; - double angleVar = random.nextDouble() * 0.225 * ((i & 1) == 0 ? 1.0 : -1.0); - int[] bsrc = translate(src[0], src[1], src[2], length * outVar, angle, tilt); - - makeMedBranch(world, random, bsrc[0], bsrc[1], bsrc[2], length * 0.6, angle + angleVar, tilt, leafy); - } - - // make 1-2 small ones near the base - int numSmallBranches = random.nextInt(2) + 1; - for(int i = 0; i <= numSmallBranches; i++) { - - double outVar = (random.nextDouble() * 0.25) + 0.25; - double angleVar = random.nextDouble() * 0.25 * ((i & 1) == 0 ? 1.0 : -1.0); - int[] bsrc = translate(src[0], src[1], src[2], length * outVar, angle, tilt); - - makeSmallBranch(world, random, bsrc[0], bsrc[1], bsrc[2], Math.max(length * 0.3, 2), angle + angleVar, tilt, leafy); - } - - if (random.nextInt(LEAF_DUNGEON_CHANCE) == 0) - { - makeLeafDungeon(world, random , dest[0], dest[1] + 1, dest[2]); - } - - } - - - private void makeLeafDungeon(World world, Random random, int x, int y, int z) { - // make leaves - drawLeafBlob(world, x, y, z, 4, leafBlock, leafMeta); - // wood support - drawBlob(world, x, y, z, 3, treeBlock, branchMeta); - // air - drawBlob(world, x, y, z, 2, Blocks.air, 0); - - - // spawner - world.setBlock(x + 0, y + 1, z + 0, Blocks.mob_spawner, 0, 2); - TileEntityMobSpawner ms = (TileEntityMobSpawner)world.getTileEntity(x + 0, y + 1, z + 0); - if (ms != null) { - ms.func_145881_a().setEntityName(TFCreatures.getSpawnerNameFor("Swarm Spider")); - } - - // treasure chests? - makeLeafDungeonChest(world, random, x, y, z); - } - - private void makeLeafDungeonChest(World world, Random random, int x, int y, int z) { - // which direction is this chest in? - int dir = random.nextInt(4); - - x += Direction.offsetX[dir]; - x += Direction.offsetX[dir]; - z += Direction.offsetZ[dir]; - z += Direction.offsetZ[dir]; - - TFTreasure.tree_cache.generate(world, random, x, y - 1, z); - } - - /** - * Make a large, branching "base" branch off of the tree - */ - protected void makeLargeBranch(World world, Random random, int x, int y, int z, int diameter, int branchHeight, double length, double angle, double tilt, boolean leafy) { - int sx = x, sy = y + branchHeight, sz = z; - int[] src = translate(sx, sy, sz, diameter, angle, 0.5); - - makeLargeBranch(world, random, src[0], src[1], src[2], length, angle, tilt, leafy); - } - - /** - * Add a firefly at the specified height and angle. - * - * @param depth how far up the tree - * @param angle from 0 - 1 rotation around the tree - */ - protected void addFirefly(World world, int x, int y, int z, int diameter, int fHeight, double fAngle) - { - int[] src = translate(x, y + fHeight, z, diameter + 1, fAngle, 0.5); - - fAngle = fAngle % 1.0; - int tmeta = 0; - - if (fAngle > 0.875 || fAngle <= 0.125) - { - tmeta = 3; - } - else if (fAngle > 0.125 && fAngle <= 0.375) - { - tmeta = 1; - } - else if (fAngle > 0.375 && fAngle <= 0.625) - { - tmeta = 4; - } - else if (fAngle > 0.625 && fAngle <= 0.875) - { - tmeta = 2; - } - - if (TFBlocks.firefly.canPlaceBlockAt(world, src[0], src[1], src[2])) - { - setBlockAndMetadata(world, src[0], src[1], src[2], TFBlocks.firefly, tmeta); - } - } - - protected void addCicada(World world, int x, int y, int z, int diameter, int fHeight, double fAngle) - { - int[] src = translate(x, y + fHeight, z, diameter + 1, fAngle, 0.5); - - fAngle = fAngle % 1.0; - int tmeta = 1; - - if (fAngle > 0.875 || fAngle <= 0.125) - { - tmeta = 3; - } - else if (fAngle > 0.125 && fAngle <= 0.375) - { - tmeta = 1; - } - else if (fAngle > 0.375 && fAngle <= 0.625) - { - tmeta = 4; - } - else if (fAngle > 0.625 && fAngle <= 0.875) - { - tmeta = 2; - } - - if (TFBlocks.cicada.canPlaceBlockAt(world, src[0], src[1], src[2])) - { - setBlockAndMetadata(world, src[0], src[1], src[2], TFBlocks.cicada, tmeta); - } - } - - -} \ No newline at end of file diff --git a/src/main/java/twilightforest/world/TFGenHugeLilyPad.java b/src/main/java/twilightforest/world/TFGenHugeLilyPad.java deleted file mode 100644 index e27f885994..0000000000 --- a/src/main/java/twilightforest/world/TFGenHugeLilyPad.java +++ /dev/null @@ -1,58 +0,0 @@ -package twilightforest.world; - -import java.util.Random; - -import twilightforest.block.TFBlocks; -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.init.Blocks; -import net.minecraft.world.World; -import net.minecraft.world.gen.feature.WorldGenerator; - - -/** - * Generate huge lily pads - * - * @author Ben - * - */ -public class TFGenHugeLilyPad extends WorldGenerator -{ - - private Random rand = new Random(); - - - public boolean generate(World world, Random random, int x, int y, int z) - { - for (int i = 0; i < 10; i++) { - int dx = x + random.nextInt(8) - random.nextInt(8); - int dy = y + random.nextInt(4) - random.nextInt(4); - int dz = z + random.nextInt(8) - random.nextInt(8); - - dx = (dx >> 1) << 1; - dz = (dz >> 1) << 1; - - if (shouldPlacePadAt(world, dx, dy, dz)) { - // this seems like a difficult way to generate 2 pseudorandom bits - rand .setSeed(8890919293L); - rand.setSeed((dx * rand.nextLong()) ^ (dz * rand.nextLong()) ^ 8890919293L); - int orient = rand.nextInt(4) << 2; - - world.setBlock(dx, dy, dz, TFBlocks.hugeLilyPad, 0 | orient, 2); - world.setBlock(dx + 1, dy, dz, TFBlocks.hugeLilyPad, 1 | orient, 2); - world.setBlock(dx + 1, dy, dz + 1, TFBlocks.hugeLilyPad, 2 | orient, 2); - world.setBlock(dx, dy, dz + 1, TFBlocks.hugeLilyPad, 3 | orient, 2); - } - } - - return true; - } - - - private boolean shouldPlacePadAt(World world, int dx, int dy, int dz) { - return world.isAirBlock(dx, dy, dz) && world.getBlock(dx, dy - 1, dz).getMaterial() == Material.water - && world.isAirBlock(dx + 1, dy, dz) && world.getBlock(dx + 1, dy - 1, dz).getMaterial() == Material.water - && world.isAirBlock(dx, dy, dz + 1) && world.getBlock(dx, dy - 1, dz + 1).getMaterial() == Material.water - && world.isAirBlock(dx + 1, dy, dz + 1) && world.getBlock(dx + 1, dy - 1, dz + 1).getMaterial() == Material.water; - } -} diff --git a/src/main/java/twilightforest/world/TFGenLampposts.java b/src/main/java/twilightforest/world/TFGenLampposts.java deleted file mode 100644 index 956ffba182..0000000000 --- a/src/main/java/twilightforest/world/TFGenLampposts.java +++ /dev/null @@ -1,42 +0,0 @@ -package twilightforest.world; - -import java.util.Random; - -import twilightforest.block.TFBlocks; -import net.minecraft.block.material.Material; -import net.minecraft.init.Blocks; -import net.minecraft.world.World; - - - -public class TFGenLampposts extends TFGenerator { - private static final int MAX_HANG = 8; - - public boolean generate(World world, Random rand, int x, int y, int z) { - // we should start on a grass block - if (world.getBlock(x, y - 1, z) == Blocks.grass) { - // generate a height - int height = 1 + rand.nextInt(4); - boolean clear = true; - - // is it air or replaceable above our grass block - for (int dy = 0; dy < height; dy++) { - if (!world.isAirBlock(x, y + dy, z) && !world.getBlock(x, y + dy, z).isReplaceable(world, x, y + dy, z)) { - clear = false; - } - } - - // generate lamp - if (clear) { - for (int dy = 0; dy < height; dy++) { - world.setBlock(x, y + dy, z, Blocks.fence); - world.setBlock(x, y + height, z, TFBlocks.fireflyJar); - } - } - return clear; - } else { - return false; - } - } - -} diff --git a/src/main/java/twilightforest/world/TFGenLargeRainboak.java b/src/main/java/twilightforest/world/TFGenLargeRainboak.java deleted file mode 100644 index 3e87de971b..0000000000 --- a/src/main/java/twilightforest/world/TFGenLargeRainboak.java +++ /dev/null @@ -1,523 +0,0 @@ -package twilightforest.world; - -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.init.Blocks; -import net.minecraft.util.MathHelper; -import net.minecraft.world.World; -import twilightforest.block.TFBlocks; - -/** - * This is a lame copy of WorldGenLargeTree, since I'm too lazy to make my own tree and all the methods in WorldGenLargeTree are package-only - * - */ -public class TFGenLargeRainboak extends TFTreeGenerator -{ - /** - * Contains three sets of two values that provide complimentary indices for a given 'major' index - 1 and 2 for 0, 0 - * and 2 for 1, and 0 and 1 for 2. - */ - static final byte[] otherCoordPairs = new byte[] {(byte)2, (byte)0, (byte)0, (byte)1, (byte)2, (byte)1}; - - /** random seed for GenBigTree */ - Random rand = new Random(); - - /** Reference to the World object. */ - World worldObj; - int[] basePos = new int[] {0, 0, 0}; - int heightLimit = 0; - int height; - double heightAttenuation = 0.618D; - double branchDensity = 1.0D; - double branchSlope = 0.381D; - double scaleWidth = 1.0D; - double leafDensity = 1.0D; - - /** - * Currently always 1, can be set to 2 in the class constructor to generate a double-sized tree trunk for big trees. - */ - int trunkSize = 1; - - /** - * Sets the limit of the random value used to initialize the height limit. - */ - int heightLimitLimit = 12; - - /** - * Sets the distance limit for how far away the generator will populate leaves from the base leaf node. - */ - int leafDistanceLimit = 4; - - /** Contains a list of a points at which to generate groups of leaves. */ - int[][] leafNodes; - - public TFGenLargeRainboak(boolean par1) - { - super(par1); - } - - public TFGenLargeRainboak() { - this(false); - } - - /** - * Generates a list of leaf nodes for the tree, to be populated by generateLeaves. - */ - void generateLeafNodeList() - { - this.height = (int)((double)this.heightLimit * this.heightAttenuation); - - if (this.height >= this.heightLimit) - { - this.height = this.heightLimit - 1; - } - - int var1 = (int)(1.382D + Math.pow(this.leafDensity * (double)this.heightLimit / 13.0D, 2.0D)); - - if (var1 < 1) - { - var1 = 1; - } - - int[][] var2 = new int[var1 * this.heightLimit][4]; - int var3 = this.basePos[1] + this.heightLimit - this.leafDistanceLimit; - int var4 = 1; - int var5 = this.basePos[1] + this.height; - int var6 = var3 - this.basePos[1]; - var2[0][0] = this.basePos[0]; - var2[0][1] = var3; - var2[0][2] = this.basePos[2]; - var2[0][3] = var5; - --var3; - - while (var6 >= 0) - { - int var7 = 0; - float var8 = this.layerSize(var6); - - if (var8 < 0.0F) - { - --var3; - --var6; - } - else - { - for (double var9 = 0.5D; var7 < var1; ++var7) - { - double var11 = this.scaleWidth * (double)var8 * ((double)this.rand.nextFloat() + 0.328D); - double var13 = (double)this.rand.nextFloat() * 2.0D * Math.PI; - int var15 = MathHelper.floor_double(var11 * Math.sin(var13) + (double)this.basePos[0] + var9); - int var16 = MathHelper.floor_double(var11 * Math.cos(var13) + (double)this.basePos[2] + var9); - int[] var17 = new int[] {var15, var3, var16}; - int[] var18 = new int[] {var15, var3 + this.leafDistanceLimit, var16}; - - if (this.checkBlockLine(var17, var18) == -1) - { - int[] var19 = new int[] {this.basePos[0], this.basePos[1], this.basePos[2]}; - double var20 = Math.sqrt(Math.pow((double)Math.abs(this.basePos[0] - var17[0]), 2.0D) + Math.pow((double)Math.abs(this.basePos[2] - var17[2]), 2.0D)); - double var22 = var20 * this.branchSlope; - - if ((double)var17[1] - var22 > (double)var5) - { - var19[1] = var5; - } - else - { - var19[1] = (int)((double)var17[1] - var22); - } - - if (this.checkBlockLine(var19, var17) == -1) - { - var2[var4][0] = var15; - var2[var4][1] = var3; - var2[var4][2] = var16; - var2[var4][3] = var19[1]; - ++var4; - } - } - } - - --var3; - --var6; - } - } - - this.leafNodes = new int[var4][4]; - System.arraycopy(var2, 0, this.leafNodes, 0, var4); - } - - void genTreeLayer(int par1, int par2, int par3, float par4, byte par5, Block leaves, int meta) - { - int var7 = (int)((double)par4 + 0.618D); - byte var8 = otherCoordPairs[par5]; - byte var9 = otherCoordPairs[par5 + 3]; - int[] var10 = new int[] {par1, par2, par3}; - int[] var11 = new int[] {0, 0, 0}; - int var12 = -var7; - int var13 = -var7; - - for (var11[par5] = var10[par5]; var12 <= var7; ++var12) - { - var11[var8] = var10[var8] + var12; - var13 = -var7; - - while (var13 <= var7) - { - double var15 = Math.pow((double)Math.abs(var12) + 0.5D, 2.0D) + Math.pow((double)Math.abs(var13) + 0.5D, 2.0D); - - if (var15 > (double)(par4 * par4)) - { - ++var13; - } - else - { - var11[var9] = var10[var9] + var13; - Block var14 = this.worldObj.getBlock(var11[0], var11[1], var11[2]); - - if (var14 != Blocks.air && !var14.canBeReplacedByLeaves(this.worldObj, var11[0], var11[1], var11[2])) - { - ++var13; - } - else - { - this.setBlockAndMetadata(this.worldObj, var11[0], var11[1], var11[2], leaves, meta); - ++var13; - } - } - } - } - } - - /** - * Gets the rough size of a layer of the tree. - */ - float layerSize(int par1) - { - if ((double)par1 < (double)((float)this.heightLimit) * 0.3D) - { - return -1.618F; - } - else - { - float var2 = (float)this.heightLimit / 2.0F; - float var3 = (float)this.heightLimit / 2.0F - (float)par1; - float var4; - - if (var3 == 0.0F) - { - var4 = var2; - } - else if (Math.abs(var3) >= var2) - { - var4 = 0.0F; - } - else - { - var4 = (float)Math.sqrt(Math.pow((double)Math.abs(var2), 2.0D) - Math.pow((double)Math.abs(var3), 2.0D)); - } - - var4 *= 0.5F; - return var4; - } - } - - float leafSize(int par1) - { - return par1 >= 0 && par1 < this.leafDistanceLimit ? (par1 != 0 && par1 != this.leafDistanceLimit - 1 ? 3.0F : 2.0F) : -1.0F; - } - - /** - * Generates the leaves surrounding an individual entry in the leafNodes list. - */ - void generateLeafNode(int par1, int par2, int par3) - { - int var4 = par2; - - for (int var5 = par2 + this.leafDistanceLimit; var4 < var5; ++var4) - { - float var6 = this.leafSize(var4 - par2); - this.genTreeLayer(par1, var4, par3, var6, (byte)1, TFBlocks.leaves, 3); - } - } - - /** - * Places a line of the specified block ID into the world from the first coordinate triplet to the second. - */ - void placeBlockLine(int[] par1ArrayOfInteger, int[] par2ArrayOfInteger, Block log) - { - int[] var4 = new int[] {0, 0, 0}; - byte var5 = 0; - byte var6; - - for (var6 = 0; var5 < 3; ++var5) - { - var4[var5] = par2ArrayOfInteger[var5] - par1ArrayOfInteger[var5]; - - if (Math.abs(var4[var5]) > Math.abs(var4[var6])) - { - var6 = var5; - } - } - - if (var4[var6] != 0) - { - byte var7 = otherCoordPairs[var6]; - byte var8 = otherCoordPairs[var6 + 3]; - byte var9; - - if (var4[var6] > 0) - { - var9 = 1; - } - else - { - var9 = -1; - } - - double var10 = (double)var4[var7] / (double)var4[var6]; - double var12 = (double)var4[var8] / (double)var4[var6]; - int[] var14 = new int[] {0, 0, 0}; - int var15 = 0; - - for (int var16 = var4[var6] + var9; var15 != var16; var15 += var9) - { - var14[var6] = MathHelper.floor_double((double)(par1ArrayOfInteger[var6] + var15) + 0.5D); - var14[var7] = MathHelper.floor_double((double)par1ArrayOfInteger[var7] + (double)var15 * var10 + 0.5D); - var14[var8] = MathHelper.floor_double((double)par1ArrayOfInteger[var8] + (double)var15 * var12 + 0.5D); - byte var17 = 0; - int var18 = Math.abs(var14[0] - par1ArrayOfInteger[0]); - int var19 = Math.abs(var14[2] - par1ArrayOfInteger[2]); - int var20 = Math.max(var18, var19); - - if (var20 > 0) - { - if (var18 == var20) - { - var17 = 4; - } - else if (var19 == var20) - { - var17 = 8; - } - } - - this.setBlockAndMetadata(this.worldObj, var14[0], var14[1], var14[2], log, var17); - } - } - } - - /** - * Generates the leaf portion of the tree as specified by the leafNodes list. - */ - void generateLeaves() - { - int var1 = 0; - - for (int var2 = this.leafNodes.length; var1 < var2; ++var1) - { - int var3 = this.leafNodes[var1][0]; - int var4 = this.leafNodes[var1][1]; - int var5 = this.leafNodes[var1][2]; - this.generateLeafNode(var3, var4, var5); - } - } - - /** - * Indicates whether or not a leaf node requires additional wood to be added to preserve integrity. - */ - boolean leafNodeNeedsBase(int par1) - { - return (double)par1 >= (double)this.heightLimit * 0.2D; - } - - /** - * Places the trunk for the big tree that is being generated. Able to generate double-sized trunks by changing a - * field that is always 1 to 2. - */ - void generateTrunk() - { - int var1 = this.basePos[0]; - int var2 = this.basePos[1]; - int var3 = this.basePos[1] + this.height; - int var4 = this.basePos[2]; - int[] var5 = new int[] {var1, var2, var4}; - int[] var6 = new int[] {var1, var3, var4}; - this.placeBlockLine(var5, var6, TFBlocks.log); - - if (this.trunkSize == 2) - { - ++var5[0]; - ++var6[0]; - this.placeBlockLine(var5, var6, TFBlocks.log); - ++var5[2]; - ++var6[2]; - this.placeBlockLine(var5, var6, TFBlocks.log); - var5[0] += -1; - var6[0] += -1; - this.placeBlockLine(var5, var6, TFBlocks.log); - } - } - - /** - * Generates additional wood blocks to fill out the bases of different leaf nodes that would otherwise degrade. - */ - void generateLeafNodeBases() - { - int var1 = 0; - int var2 = this.leafNodes.length; - - for (int[] var3 = new int[] {this.basePos[0], this.basePos[1], this.basePos[2]}; var1 < var2; ++var1) - { - int[] var4 = this.leafNodes[var1]; - int[] var5 = new int[] {var4[0], var4[1], var4[2]}; - var3[1] = var4[3]; - int var6 = var3[1] - this.basePos[1]; - - if (this.leafNodeNeedsBase(var6)) - { - this.placeBlockLine(var3, var5, TFBlocks.log); - } - } - } - - /** - * Checks a line of blocks in the world from the first coordinate to triplet to the second, returning the distance - * (in blocks) before a non-air, non-leaf block is encountered and/or the end is encountered. - */ - int checkBlockLine(int[] par1ArrayOfInteger, int[] par2ArrayOfInteger) - { - int[] var3 = new int[] {0, 0, 0}; - byte var4 = 0; - byte var5; - - for (var5 = 0; var4 < 3; ++var4) - { - var3[var4] = par2ArrayOfInteger[var4] - par1ArrayOfInteger[var4]; - - if (Math.abs(var3[var4]) > Math.abs(var3[var5])) - { - var5 = var4; - } - } - - if (var3[var5] == 0) - { - return -1; - } - else - { - byte var6 = otherCoordPairs[var5]; - byte var7 = otherCoordPairs[var5 + 3]; - byte var8; - - if (var3[var5] > 0) - { - var8 = 1; - } - else - { - var8 = -1; - } - - double var9 = (double)var3[var6] / (double)var3[var5]; - double var11 = (double)var3[var7] / (double)var3[var5]; - int[] var13 = new int[] {0, 0, 0}; - int var14 = 0; - int var15; - - for (var15 = var3[var5] + var8; var14 != var15; var14 += var8) - { - var13[var5] = par1ArrayOfInteger[var5] + var14; - var13[var6] = MathHelper.floor_double((double)par1ArrayOfInteger[var6] + (double)var14 * var9); - var13[var7] = MathHelper.floor_double((double)par1ArrayOfInteger[var7] + (double)var14 * var11); - Block var16 = this.worldObj.getBlock(var13[0], var13[1], var13[2]); - - if (var16 != Blocks.air && var16 != Blocks.leaves) - { - break; - } - } - - return var14 == var15 ? -1 : Math.abs(var14); - } - } - - /** - * Returns a boolean indicating whether or not the current location for the tree, spanning basePos to to the height - * limit, is valid. - */ - boolean validTreeLocation() - { - int[] var1 = new int[] {this.basePos[0], this.basePos[1], this.basePos[2]}; - int[] var2 = new int[] {this.basePos[0], this.basePos[1] + this.heightLimit - 1, this.basePos[2]}; - Block var3 = this.worldObj.getBlock(this.basePos[0], this.basePos[1] - 1, this.basePos[2]); - - if (var3 != Blocks.dirt && var3 != Blocks.grass) - { - return false; - } - else - { - int var4 = this.checkBlockLine(var1, var2); - - if (var4 == -1) - { - return true; - } - else if (var4 < 6) - { - return false; - } - else - { - this.heightLimit = var4; - return true; - } - } - } - - /** - * Rescales the generator settings, only used in WorldGenBigTree - */ - public void setScale(double par1, double par3, double par5) - { - this.heightLimitLimit = (int)(par1 * 12.0D); - - if (par1 > 0.5D) - { - this.leafDistanceLimit = 5; - } - - this.scaleWidth = par3; - this.leafDensity = par5; - } - - public boolean generate(World par1World, Random par2Random, int par3, int par4, int par5) - { - this.worldObj = par1World; - long var6 = par2Random.nextLong(); - this.rand.setSeed(var6); - this.basePos[0] = par3; - this.basePos[1] = par4; - this.basePos[2] = par5; - - if (this.heightLimit == 0) - { - this.heightLimit = 5 + this.rand.nextInt(this.heightLimitLimit); - } - - if (!this.validTreeLocation()) - { - return false; - } - else - { - this.generateLeafNodeList(); - this.generateLeaves(); - this.generateTrunk(); - this.generateLeafNodeBases(); - return true; - } - } -} diff --git a/src/main/java/twilightforest/world/TFGenLargeWinter.java b/src/main/java/twilightforest/world/TFGenLargeWinter.java deleted file mode 100644 index e7a826e18e..0000000000 --- a/src/main/java/twilightforest/world/TFGenLargeWinter.java +++ /dev/null @@ -1,129 +0,0 @@ -package twilightforest.world; - -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.init.Blocks; -import net.minecraft.world.World; -import twilightforest.block.BlockTFRoots; -import twilightforest.block.TFBlocks; - -public class TFGenLargeWinter extends TFTreeGenerator { - - public TFGenLargeWinter() - { - this(false); - } - - public TFGenLargeWinter(boolean par1) - { - super(par1); - treeBlock = Blocks.log; - treeMeta = 1; - branchMeta = 13; - leafBlock = Blocks.leaves; - leafMeta = 1; - rootBlock = TFBlocks.root; - rootMeta = BlockTFRoots.ROOT_META; - - } - - @Override - public boolean generate(World world, Random random, int x, int y, int z) { - // determine a height - int treeHeight = 35; - if (random.nextInt(3) == 0) { - treeHeight += random.nextInt(10); - - if (random.nextInt(8) == 0) { - treeHeight += random.nextInt(10); - } - } - - // check if we're on dirt or grass - Block blockUnder = world.getBlock(x, y - 1, z); - if(blockUnder != Blocks.grass && blockUnder != Blocks.dirt || y >= TFWorld.MAXHEIGHT - treeHeight) - { - return false; - } - - - //okay build a tree! Go up to the height - buildTrunk(world, x, y, z, treeHeight); - - // make leaves - makeLeaves(world, x, y, z, treeHeight); - - // roots! - int numRoots = 4 + random.nextInt(3); - float offset = random.nextFloat(); - for (int b = 0; b < numRoots; b++) - { - buildRoot(world, x, y, z, offset, b); - } - - return true; - } - - private void makeLeaves(World world, int x, int y, int z, int treeHeight) { - int offGround = 3; - int leafType = 1; - - for (int dy = 0; dy < treeHeight; dy++) { - - int radius = leafRadius(treeHeight, dy, leafType); - - this.makeLeafCircle2(world, x, y + offGround + treeHeight - dy, z, radius, leafBlock, leafMeta, false); - this.makePineBranches(world, x, y + offGround + treeHeight - dy, z, radius); - } - } - - private void makePineBranches(World world, int x, int y, int z, int radius) { - int branchLength = radius > 4 ? radius - 1 : radius - 2; - - switch (y % 2) - { - case 0: - // branches - for (int i = 1; i <= branchLength; i++) - { - this.setBlockAndMetadata(world, x + 0 - i, y, z + 0, treeBlock, branchMeta & 3 | 4); - this.setBlockAndMetadata(world, x + 0, y, z + 1 + i, treeBlock, branchMeta & 3 | 8); - this.setBlockAndMetadata(world, x + 1 + i, y, z + 1, treeBlock, branchMeta & 3 | 4); - this.setBlockAndMetadata(world, x + 1, y, z - 0 - i, treeBlock, branchMeta & 3 | 8); - } - break; - case 1: - for (int i = 1; i <= branchLength; i++) - { - this.setBlockAndMetadata(world, x + 0 - i, y, z + 1, treeBlock, branchMeta & 3 | 4); - this.setBlockAndMetadata(world, x + 1, y, z + 1 + i, treeBlock, branchMeta & 3 | 8); - this.setBlockAndMetadata(world, x + 1 + i, y, z + 0, treeBlock, branchMeta & 3 | 4); - this.setBlockAndMetadata(world, x + 0, y, z - 0 - i, treeBlock, branchMeta & 3 | 8); - } - break; - } - } - - private int leafRadius(int treeHeight, int dy, int functionType) { - switch (functionType) { - case 0: - default: - return (dy - 1) % 4; - case 1: - return (int)(4F * (float)dy / (float)treeHeight + (0.75F * dy % 3)); - case 99: - return (treeHeight - (dy / 2) - 1) % 4; // bad - } - } - - private void buildTrunk(World world, int x, int y, int z, int treeHeight) { - for (int dy = 0; dy < treeHeight; dy++) { - this.setBlockAndMetadata(world, x + 0, y + dy, z + 0, treeBlock, treeMeta); - this.setBlockAndMetadata(world, x + 1, y + dy, z + 0, treeBlock, treeMeta); - this.setBlockAndMetadata(world, x + 0, y + dy, z + 1, treeBlock, treeMeta); - this.setBlockAndMetadata(world, x + 1, y + dy, z + 1, treeBlock, treeMeta); - } - } - -} diff --git a/src/main/java/twilightforest/world/TFGenMangroveTree.java b/src/main/java/twilightforest/world/TFGenMangroveTree.java deleted file mode 100644 index a0ef8cbc99..0000000000 --- a/src/main/java/twilightforest/world/TFGenMangroveTree.java +++ /dev/null @@ -1,180 +0,0 @@ -package twilightforest.world; - -import java.util.Random; - -import net.minecraft.init.Blocks; -import net.minecraft.util.ChunkCoordinates; -import net.minecraft.world.World; -import twilightforest.block.BlockTFRoots; -import twilightforest.block.TFBlocks; - - -public class TFGenMangroveTree extends TFTreeGenerator { - - boolean checkForWater; - - - public TFGenMangroveTree() - { - this(false); - } - - public TFGenMangroveTree(boolean par1) - { - super(par1); - - this.checkForWater = !par1; - - treeBlock = TFBlocks.log; - treeMeta = 2; - branchMeta = 14; - leafBlock = TFBlocks.leaves; - leafMeta = 2; - rootBlock = TFBlocks.root; - rootMeta = BlockTFRoots.ROOT_META; - } - - @Override - public boolean generate(World world, Random random, int x, int y, int z) - { - // we only start over water - if ((this.checkForWater && world.getBlock(x, y - 1, z) != Blocks.water) || y >= 128 - 18 - 1) - { - return false; - } - - //okay build a trunk! Start 5 squares off the ground and go up maybe 6-9 squares - buildBranch(world, random, x, y, z, 5, 6 + random.nextInt(3), 0, 0, true); - - // make 0-3 branches - int numBranches = random.nextInt(3); - double offset = random.nextDouble(); - for (int b = 0; b < numBranches; b++) - { - buildBranch(world, random, x, y, z, 7 + b, 6 + random.nextInt(2), 0.3 * b + offset, 0.25, false); - } - - // make 3-5 roots - int numRoots = 3 + random.nextInt(2); - offset = random.nextDouble(); - for (int i = 0; i < numRoots; i++) - { - double rTilt = 0.75 + (random.nextDouble() * 0.1); - buildRoot(world, x, y, z, 5, 12, 0.4 * i + offset, rTilt); - } - - // add a firefly (torch) to the trunk - addFirefly(world, x, y, z, 5 + random.nextInt(5), random.nextDouble()); - - - return true; - } - - /** - * Build a branch with a flat blob of leaves at the end. - * - * @param height - * @param length - * @param angle - * @param tilt - */ - void buildBranch(World world, Random random, int x, int y, int z, int height, double length, double angle, double tilt, boolean trunk) - { - ChunkCoordinates src = new ChunkCoordinates(x, y + height, z); - ChunkCoordinates dest = translateCoords(src.posX, src.posY, src.posZ, length, angle, tilt); - - - // constrain branch spread - if ((dest.posX - x) < -4) - { - dest.posX = x - 4; - } - if ((dest.posX - x) > 4) - { - dest.posX = x + 4; - } - if ((dest.posZ - z) < -4) - { - dest.posZ = z - 4; - } - if ((dest.posZ - z) > 4) - { - dest.posZ = z + 4; - } - - drawBresehnam(world, src.posX, src.posY, src.posZ, dest.posX, dest.posY, dest.posZ, treeBlock, trunk ? treeMeta : branchMeta); - - - // variable size leaves - int bSize = 2 + random.nextInt(3); - - // we only need these side blocks if the size is > 2 - if (bSize > 2) { - setBlockAndMetadata(world, dest.posX + 1, dest.posY, dest.posZ, treeBlock, branchMeta); - setBlockAndMetadata(world, dest.posX - 1, dest.posY, dest.posZ, treeBlock, branchMeta); - setBlockAndMetadata(world, dest.posX, dest.posY, dest.posZ + 1, treeBlock, branchMeta); - setBlockAndMetadata(world, dest.posX, dest.posY, dest.posZ - 1, treeBlock, branchMeta); - } - // leaves! - makeLeafCircle(world, dest.posX, dest.posY - 1, dest.posZ, (byte)(bSize - 1), leafBlock, leafMeta); - makeLeafCircle(world, dest.posX, dest.posY, dest.posZ, (byte)(bSize), leafBlock, leafMeta); - makeLeafCircle(world, dest.posX, dest.posY + 1, dest.posZ, (byte)(bSize - 2), leafBlock, leafMeta); - } - - /** - * Build a root. (Which is really like a branch without the leaves) - * - * @param height - * @param length - * @param angle - * @param tilt - */ - void buildRoot(World world, int x, int y, int z, int height, double length, double angle, double tilt) - { - ChunkCoordinates src = new ChunkCoordinates(x, y + height, z); - ChunkCoordinates dest = translateCoords(src.posX, src.posY, src.posZ, length, angle, tilt); - - ChunkCoordinates[] lineArray = getBresehnamArrayCoords(src, dest); - boolean stillAboveGround = true; - for (ChunkCoordinates coord : lineArray) - { - if (stillAboveGround && hasAirAround(world, coord.posX, coord.posY, coord.posZ)) { - this.setBlockAndMetadata(world, coord.posX, coord.posY, coord.posZ, treeBlock, branchMeta); - this.setBlockAndMetadata(world, coord.posX, coord.posY - 1, coord.posZ, treeBlock, branchMeta); - } - else { - this.placeRootBlock(world, coord.posX, coord.posY, coord.posZ, rootBlock, rootMeta); - this.placeRootBlock(world, coord.posX, coord.posY - 1, coord.posZ, rootBlock, rootMeta); - stillAboveGround = false; - } - } - - } - - /** - * Add a firefly at the specified height and angle. - * - * @param height how far up the tree - * @param angle from 0 - 1 rotation around the tree - */ - private void addFirefly(World world, int x, int y, int z, int height, double angle) - { - int iAngle = (int)(angle * 4.0); - if (iAngle == 0) - { - setBlockAndMetadata(world, x + 1, y + height, z, TFBlocks.firefly, 0); - } - else if (iAngle == 1) - { - setBlockAndMetadata(world, x - 1, y + height, z, TFBlocks.firefly, 0); - } - else if (iAngle == 2) - { - setBlockAndMetadata(world, x, y + height, z + 1, TFBlocks.firefly, 0); - } - else if (iAngle == 3) - { - setBlockAndMetadata(world, x, y + height, z - 1, TFBlocks.firefly, 0); - } - } -} diff --git a/src/main/java/twilightforest/world/TFGenMinersTree.java b/src/main/java/twilightforest/world/TFGenMinersTree.java deleted file mode 100644 index d5881edba6..0000000000 --- a/src/main/java/twilightforest/world/TFGenMinersTree.java +++ /dev/null @@ -1,109 +0,0 @@ -package twilightforest.world; - -import java.util.Random; - -import net.minecraft.block.material.Material; -import net.minecraft.world.World; -import twilightforest.block.BlockTFMagicLogSpecial; -import twilightforest.block.BlockTFRoots; -import twilightforest.block.TFBlocks; - - -public class TFGenMinersTree extends TFTreeGenerator -{ - - public TFGenMinersTree() - { - this(false); - } - - - public TFGenMinersTree(boolean notify) - { - super(notify); - this.treeBlock = TFBlocks.magicLog; - this.treeMeta = 2; - this.branchMeta = treeMeta | 12; - this.leafBlock = TFBlocks.magicLeaves; - this.leafMeta = 2; - this.rootBlock = TFBlocks.root; - this.rootMeta = BlockTFRoots.ROOT_META; - } - - - @Override - public boolean generate(World world, Random rand, int x, int y, int z) - { - - // check soil - Material materialUnder = world.getBlock(x, y - 1, z).getMaterial(); - if ((materialUnder != Material.grass && materialUnder != Material.ground) || y >= TFWorld.MAXHEIGHT - 12) - { - return false; - } - - // 9 block high trunk - for (int dy = 0; dy < 10; dy++) - { - setBlockAndMetadata(world, x, y + dy, z, treeBlock, branchMeta); - } - - // branches with leaf blocks - putBranchWithLeaves(world, x, y + 9, z + 1, true); - putBranchWithLeaves(world, x, y + 9, z + 2, false); - putBranchWithLeaves(world, x, y + 8, z + 3, false); - putBranchWithLeaves(world, x, y + 7, z + 4, false); - putBranchWithLeaves(world, x, y + 6, z + 5, false); - - putBranchWithLeaves(world, x, y + 9, z - 1, true); - putBranchWithLeaves(world, x, y + 9, z - 2, false); - putBranchWithLeaves(world, x, y + 8, z - 3, false); - putBranchWithLeaves(world, x, y + 7, z - 4, false); - putBranchWithLeaves(world, x, y + 6, z - 5, false); - - // place minewood core - setBlockAndMetadata(world, x, y + 1, z, TFBlocks.magicLogSpecial, BlockTFMagicLogSpecial.META_MINE); - world.scheduleBlockUpdate(x, y + 1, z, TFBlocks.magicLogSpecial, TFBlocks.magicLogSpecial.tickRate(world)); - - - // root bulb - if (hasAirAround(world, x, y - 1, z)) { - this.setBlockAndMetadata(world, x, y - 1, z, treeBlock, treeMeta); - } - else { - this.setBlockAndMetadata(world, x, y - 1, z, rootBlock, rootMeta); - } - - // roots! - int numRoots = 3 + rand.nextInt(2); - double offset = rand.nextDouble(); - for (int b = 0; b < numRoots; b++) - { - buildRoot(world, x, y, z, offset, b); - } - - return true; - } - - - protected void putBranchWithLeaves(World world, int bx, int by, int bz, boolean bushy) { - setBlockAndMetadata(world, bx, by, bz, treeBlock, branchMeta); - - for (int lx = -1; lx <= 1; lx++) - { - for (int ly = -1; ly <= 1; ly++) - { - for (int lz = -1; lz <= 1; lz++) - { - if (!bushy && Math.abs(ly) > 0 && Math.abs(lx) > 0) - { - continue; - } - putLeafBlock(world, bx + lx, by + ly, bz + lz, leafBlock, leafMeta); - } - } - } - } - - -} diff --git a/src/main/java/twilightforest/world/TFGenMonolith.java b/src/main/java/twilightforest/world/TFGenMonolith.java deleted file mode 100644 index 10bbaaca95..0000000000 --- a/src/main/java/twilightforest/world/TFGenMonolith.java +++ /dev/null @@ -1,95 +0,0 @@ -package twilightforest.world; - -import java.util.Random; - -import net.minecraft.init.Blocks; -import net.minecraft.world.World; -import twilightforest.entity.passive.EntityTFRaven; - - -/** - * A 2x2 monolith of obsidian - * - * @author Ben - * - */ -public class TFGenMonolith extends TFGenerator { - - - @Override - public boolean generate(World world, Random rand, int x, int y, int z) { - int ht = rand.nextInt(10) + 10; - int dir = rand.nextInt(4); - int h0, h1, h2, h3; - - if (!isAreaSuitable(world, rand, x, y, z, 2, ht, 2)) - { - return false; - } - - - switch (dir) - { - case 0: - h0 = ht; - h1 = (int)(ht * .75); - h2 = (int)(ht * .75); - h3 = (int)(ht * .5); - break; - case 1: - h0 = (int)(ht * .5); - h1 = ht; - h2 = (int)(ht * .75); - h3 = (int)(ht * .75); - break; - case 2: - h0 = (int)(ht * .75); - h1 = (int)(ht * .5); - h2 = ht; - h3 = (int)(ht * .75); - break; - case 3: - default: - h0 = (int)(ht * .75); - h1 = (int)(ht * .75); - h2 = (int)(ht * .5); - h3 = ht; - break; - } - - - for (int cy = 0; cy <= h0; cy++) - { - setBlock(world, x + 0, y + cy - 1, z + 0, cy == ht ? Blocks.lapis_block : Blocks.obsidian); - } - for (int cy = 0; cy <= h1; cy++) - { - setBlock(world, x + 1, y + cy - 1, z + 0, cy == ht ? Blocks.lapis_block : Blocks.obsidian); - } - for (int cy = 0; cy <= h2; cy++) - { - setBlock(world, x + 0, y + cy - 1, z + 1, cy == ht ? Blocks.lapis_block : Blocks.obsidian); - } - for (int cy = 0; cy <= h3; cy++) - { - setBlock(world, x + 1, y + cy - 1, z + 1, cy == ht ? Blocks.lapis_block : Blocks.obsidian); - } - - // spawn a few ravens nearby - for (int i = 0; i < 2; i++) - { - int dx = (x + rand.nextInt(8)) - rand.nextInt(8); - int dz = (z + rand.nextInt(8)) - rand.nextInt(8); - int dy = world.getTopSolidOrLiquidBlock(dx, dz); - - EntityTFRaven raven = new EntityTFRaven(world); - raven.setLocationAndAngles(dx, dy, dz, rand.nextFloat() * 360.0F, 0.0F); - - world.spawnEntityInWorld(raven); - - } - - return true; - } -} - diff --git a/src/main/java/twilightforest/world/TFGenMyceliumBlob.java b/src/main/java/twilightforest/world/TFGenMyceliumBlob.java deleted file mode 100644 index fd8c4fad3e..0000000000 --- a/src/main/java/twilightforest/world/TFGenMyceliumBlob.java +++ /dev/null @@ -1,65 +0,0 @@ -package twilightforest.world; - -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.init.Blocks; -import net.minecraft.world.World; -import net.minecraft.world.gen.feature.WorldGenerator; - - -/** - * This is a copypasta of the sand/gravel/clay generator that produces mycelium blobs for mushroom biomes - * - * @author Ben - * - */ -public class TFGenMyceliumBlob extends WorldGenerator -{ - private Block myceliumBlockId; - private int numberOfBlocks; - - public TFGenMyceliumBlob(int i) - { - myceliumBlockId = Blocks.mycelium; - numberOfBlocks = i; - } - - public TFGenMyceliumBlob(Block block, int i) - { - myceliumBlockId = block; - numberOfBlocks = i; - } - - public boolean generate(World world, Random random, int x, int y, int z) - { -// if (world.getBlock(i, j, k).getMaterial() != Material.water) -// { -// return false; -// } - int range = random.nextInt(numberOfBlocks - 2) + 2; - int yRange = 1; - for (int dx = x - range; dx <= x + range; dx++) - { - for (int dz = z - range; dz <= z + range; dz++) - { - int l1 = dx - x; - int i2 = dz - z; - if (l1 * l1 + i2 * i2 > range * range) - { - continue; - } - for (int dy = y - yRange; dy <= y + yRange; dy++) - { - Block blockThere = world.getBlock(dx, dy, dz); - if (blockThere == Blocks.dirt || blockThere == Blocks.grass || blockThere == Blocks.stone) - { - world.setBlock(dx, dy, dz, myceliumBlockId, 0, 2); - } - } - } - } - - return true; - } -} diff --git a/src/main/java/twilightforest/world/TFGenNoTree.java b/src/main/java/twilightforest/world/TFGenNoTree.java deleted file mode 100644 index b7c531b730..0000000000 --- a/src/main/java/twilightforest/world/TFGenNoTree.java +++ /dev/null @@ -1,24 +0,0 @@ -package twilightforest.world; - -import java.util.Random; - -import net.minecraft.world.World; - -/** - * Used to generate no particular tree - */ -public class TFGenNoTree extends TFTreeGenerator { - - public TFGenNoTree() { - } - - public TFGenNoTree(boolean par1) { - super(par1); - } - - @Override - public boolean generate(World world, Random random, int i, int j, int k) { - return false; - } - -} diff --git a/src/main/java/twilightforest/world/TFGenOutsideStalagmite.java b/src/main/java/twilightforest/world/TFGenOutsideStalagmite.java deleted file mode 100644 index 9585a47e6a..0000000000 --- a/src/main/java/twilightforest/world/TFGenOutsideStalagmite.java +++ /dev/null @@ -1,34 +0,0 @@ -package twilightforest.world; - -import java.util.Random; - -import net.minecraft.init.Blocks; -import net.minecraft.world.World; - - -/** - * Makes a Stalagmite suitable for outside appearances. - * - * @author Ben - * - */ -public class TFGenOutsideStalagmite extends TFGenCaveStalactite { - - public TFGenOutsideStalagmite() { - super(Blocks.stone, 1.0F, false); - } - - public boolean generate(World world, Random rand, int x, int y, int z) - { - int length = rand.nextInt(10) + 5; - - if (!isAreaSuitable(world, rand, x, y, z, 1, length, 1)) - { - return false; - } - - // I think we already have code for this! :D - return makeSpike(world, rand, x, y - 1, z, length); - } - -} diff --git a/src/main/java/twilightforest/world/TFGenPenguins.java b/src/main/java/twilightforest/world/TFGenPenguins.java deleted file mode 100644 index a27dc459d6..0000000000 --- a/src/main/java/twilightforest/world/TFGenPenguins.java +++ /dev/null @@ -1,32 +0,0 @@ -package twilightforest.world; - -import java.util.Random; - -import net.minecraft.world.World; -import twilightforest.entity.passive.EntityTFPenguin; - - - -public class TFGenPenguins extends TFGenerator { - - @Override - public boolean generate(World world, Random rand, int x, int y, int z) { - - for (int i = 0; i < 10; i++) - { - int dx = (x + rand.nextInt(8)) - rand.nextInt(8); - int dz = (z + rand.nextInt(8)) - rand.nextInt(8); - int dy = world.getTopSolidOrLiquidBlock(dx, dz); - - EntityTFPenguin penguin = new EntityTFPenguin(world); - penguin.setLocationAndAngles(dx, dy, dz, rand.nextFloat() * 360.0F, 0.0F); - - world.spawnEntityInWorld(penguin); - - } - - return true; - - } - -} diff --git a/src/main/java/twilightforest/world/TFGenPlantRoots.java b/src/main/java/twilightforest/world/TFGenPlantRoots.java deleted file mode 100644 index a23e64a3e9..0000000000 --- a/src/main/java/twilightforest/world/TFGenPlantRoots.java +++ /dev/null @@ -1,33 +0,0 @@ -package twilightforest.world; - -import java.util.Random; - -import net.minecraft.world.World; -import twilightforest.block.BlockTFPlant; -import twilightforest.block.TFBlocks; - - - -public class TFGenPlantRoots extends TFGenerator -{ - public boolean generate(World par1World, Random par2Random, int x, int y, int z) - { - int copyX = x; - int copyZ = z; - - for (; y > 5; --y) - { - if (par1World.isAirBlock(x, y, z) && BlockTFPlant.canPlaceRootBelow(par1World, x, y + 1, z) && par2Random.nextInt(6) > 0) - { - par1World.setBlock(x, y, z, TFBlocks.plant, BlockTFPlant.META_ROOT_STRAND, 2); - } - else - { - x = copyX + par2Random.nextInt(4) - par2Random.nextInt(4); - z = copyZ + par2Random.nextInt(4) - par2Random.nextInt(4); - } - } - - return true; - } -} diff --git a/src/main/java/twilightforest/world/TFGenRavine.java b/src/main/java/twilightforest/world/TFGenRavine.java deleted file mode 100644 index 611a7b3411..0000000000 --- a/src/main/java/twilightforest/world/TFGenRavine.java +++ /dev/null @@ -1,218 +0,0 @@ -package twilightforest.world; - -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.init.Blocks; -import net.minecraft.util.MathHelper; -import net.minecraft.world.World; -import net.minecraft.world.gen.MapGenBase; -import twilightforest.TFFeature; -import twilightforest.block.TFBlocks; - - - -public class TFGenRavine extends MapGenBase -{ - private float field_35627_a[]; - - public TFGenRavine() - { - field_35627_a = new float[1024]; - } - - protected void generateRavine(long l, int i, int j, Block blockStorage[], double d, - double d1, double d2, float f, float f1, float f2, - int k, int i1, double d3) - { - Random random = new Random(l); - double d4 = i * 16 + 8; - double d5 = j * 16 + 8; - float f3 = 0.0F; - float f4 = 0.0F; - if (i1 <= 0) - { - int j1 = range * 16 - 16; - i1 = j1 - random.nextInt(j1 / 4); - } - boolean flag = false; - if (k == -1) - { - k = i1 / 2; - flag = true; - } - float f5 = 1.0F; - for (int k1 = 0; k1 < TFWorld.CHUNKHEIGHT; k1++) - { - if (k1 == 0 || random.nextInt(3) == 0) - { - f5 = 1.0F + random.nextFloat() * random.nextFloat() * 1.0F; - } - field_35627_a[k1] = f5 * f5; - } - - for (; k < i1; k++) - { - double d6 = 1.5D + (double)(MathHelper.sin(((float)k * 3.141593F) / (float)i1) * f * 1.0F); - double d7 = d6 * d3; - d6 *= (double)random.nextFloat() * 0.25D + 0.75D; - d7 *= (double)random.nextFloat() * 0.25D + 0.75D; - float f6 = MathHelper.cos(f2); - float f7 = MathHelper.sin(f2); - d += MathHelper.cos(f1) * f6; - d1 += f7; - d2 += MathHelper.sin(f1) * f6; - f2 *= 0.7F; - f2 += f4 * 0.05F; - f1 += f3 * 0.05F; - f4 *= 0.8F; - f3 *= 0.5F; - f4 += (random.nextFloat() - random.nextFloat()) * random.nextFloat() * 2.0F; - f3 += (random.nextFloat() - random.nextFloat()) * random.nextFloat() * 4F; - if (!flag && random.nextInt(4) == 0) - { - continue; - } - double d8a = d - d4; - double d9a = d2 - d5; - double d10a = i1 - k; - double d11 = f + 2.0F + 16F; - if ((d8a * d8a + d9a * d9a) - d10a * d10a > d11 * d11) - { - return; - } - if (d < d4 - 16D - d6 * 2D || d2 < d5 - 16D - d6 * 2D || d > d4 + 16D + d6 * 2D || d2 > d5 + 16D + d6 * 2D) - { - continue; - } - int d8 = MathHelper.floor_double(d - d6) - i * 16 - 1; - int l1 = (MathHelper.floor_double(d + d6) - i * 16) + 1; - int d9 = MathHelper.floor_double(d1 - d7) - 1; - int i2 = MathHelper.floor_double(d1 + d7) + 1; - int d10 = MathHelper.floor_double(d2 - d6) - j * 16 - 1; - int j2 = (MathHelper.floor_double(d2 + d6) - j * 16) + 1; - if (d8 < 0) - { - d8 = 0; - } - if (l1 > 16) - { - l1 = 16; - } - if (d9 < 1) - { - d9 = 1; - } - if (i2 > TFWorld.CHUNKHEIGHT - 8) - { - i2 = TFWorld.CHUNKHEIGHT - 8; - } - if (d10 < 0) - { - d10 = 0; - } - if (j2 > 16) - { - j2 = 16; - } - boolean flag1 = false; - for (int k2 = d8; !flag1 && k2 < l1; k2++) - { - for (int i3 = d10; !flag1 && i3 < j2; i3++) - { - for (int j3 = i2 + 1; !flag1 && j3 >= d9 - 1; j3--) - { - int k3 = (k2 * 16 + i3) * TFWorld.CHUNKHEIGHT + j3; - if (j3 < 0 || j3 >= TFWorld.CHUNKHEIGHT) - { - continue; - } - if (blockStorage[k3] == Blocks.water || blockStorage[k3] == Blocks.water) - { - flag1 = true; - } - if (j3 != d9 - 1 && k2 != d8 && k2 != l1 - 1 && i3 != d10 && i3 != j2 - 1) - { - j3 = d9; - } - } - } - } - - if (flag1) - { - continue; - } - for (int l2 = d8; l2 < l1; l2++) - { - double d12 = (((double)(l2 + i * 16) + 0.5D) - d) / d6; - label0: - for (int l3 = d10; l3 < j2; l3++) - { - double d13 = (((double)(l3 + j * 16) + 0.5D) - d2) / d6; - int i4 = (l2 * 16 + l3) * TFWorld.CHUNKHEIGHT + i2; - boolean flag2 = false; - if (d12 * d12 + d13 * d13 >= 1.0D) - { - continue; - } - int j4 = i2 - 1; - do - { - if (j4 < d9) - { - continue label0; - } - double d14 = (((double)j4 + 0.5D) - d1) / d7; - if ((d12 * d12 + d13 * d13) * (double)field_35627_a[j4] + (d14 * d14) / 6D < 1.0D) - { - Block curentBlock = blockStorage[i4]; - if (curentBlock == Blocks.grass) - { - flag2 = true; - } - if (curentBlock == Blocks.stone || curentBlock == TFBlocks.trollSteinn || curentBlock == Blocks.dirt || curentBlock == Blocks.grass) - { - blockStorage[i4] = Blocks.air; - if (flag2 && blockStorage[i4 - 1] == Blocks.dirt) - { - blockStorage[i4 - 1] = this.worldObj.getBiomeGenForCoords(l2 + i * 16, l3 + j * 16).topBlock; - } - } - } - i4--; - j4--; - } - while (true); - } - } - - if (flag) - { - break; - } - } - } - - protected void func_151538_a(World world, int centerChunkX, int centerChunkZ, int currentChunkX, int currentChunkZ, Block shortStorage[]) - { - if (rand.nextInt(127) != 0) - { - return; - } - if (!TFFeature.getNearestFeature(currentChunkX, currentChunkZ, world).areChunkDecorationsEnabled) { - return; - } - double d = centerChunkX * 16 + rand.nextInt(16); - double d1 = rand.nextInt(rand.nextInt(40) + 8) + 20; - double d2 = centerChunkZ * 16 + rand.nextInt(16); - int i1 = 1; - for (int j1 = 0; j1 < i1; j1++) - { - float f = rand.nextFloat() * 3.141593F * 2.0F; - float f1 = ((rand.nextFloat() - 0.5F) * 2.0F) / 8F; - float f2 = (rand.nextFloat() * 2.0F + rand.nextFloat()) * 2.0F; - generateRavine(rand.nextLong(), currentChunkX, currentChunkZ, shortStorage, d, d1, d2, f2, f, f1, 0, 0, 3D); - } - } -} diff --git a/src/main/java/twilightforest/world/TFGenSmallRainboak.java b/src/main/java/twilightforest/world/TFGenSmallRainboak.java deleted file mode 100644 index e3711f63dd..0000000000 --- a/src/main/java/twilightforest/world/TFGenSmallRainboak.java +++ /dev/null @@ -1,19 +0,0 @@ -package twilightforest.world; - - -public class TFGenSmallRainboak extends TFGenSmallTwilightOak -{ - - public TFGenSmallRainboak() - { - this(false); - } - - - public TFGenSmallRainboak(boolean notify) - { - super(notify); - this.leafMeta = 3; - } - -} diff --git a/src/main/java/twilightforest/world/TFGenSmallTwilightOak.java b/src/main/java/twilightforest/world/TFGenSmallTwilightOak.java deleted file mode 100644 index 274ed33c10..0000000000 --- a/src/main/java/twilightforest/world/TFGenSmallTwilightOak.java +++ /dev/null @@ -1,154 +0,0 @@ -package twilightforest.world; - -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.init.Blocks; -import net.minecraft.world.World; -import twilightforest.block.BlockTFRoots; -import twilightforest.block.TFBlocks; - -public class TFGenSmallTwilightOak extends TFTreeGenerator -{ - /** The minimum height of a generated tree. */ - protected final int minTreeHeight; - - public TFGenSmallTwilightOak(boolean par1) - { - this(par1, 4); - } - - public TFGenSmallTwilightOak(boolean par1, int par2) - { - super(par1); - this.minTreeHeight = par2; - - treeBlock = TFBlocks.log; - treeMeta = 0; - branchMeta = treeMeta | 12; - leafBlock = TFBlocks.leaves; - leafMeta = 0; - rootBlock = TFBlocks.root; - rootMeta = BlockTFRoots.ROOT_META; - } - - public boolean generate(World par1World, Random par2Random, int x, int y, int z) - { - int height = par2Random.nextInt(3) + this.minTreeHeight; - boolean allClear = true; - - if (y >= 1 && y + height + 1 <= 256) - { - int cy; - byte width; - int cz; - Block blockID; - - for (cy = y; cy <= y + 1 + height; ++cy) - { - width = 1; - - if (cy == y) - { - width = 0; - } - - if (cy >= y + 1 + height - 2) - { - width = 2; - } - - for (int cx = x - width; cx <= x + width && allClear; ++cx) - { - for (cz = z - width; cz <= z + width && allClear; ++cz) - { - if (cy >= 0 && cy < 256) - { - blockID = par1World.getBlock(cx, cy, cz); - - Block block = blockID; - - if (blockID != Blocks.air && - !block.isLeaves(par1World, cx, cy, cz) && - blockID != Blocks.grass && - blockID != Blocks.dirt && - !block.isWood(par1World, cx, cy, cz)) - { - allClear = false; - } - } - else - { - allClear = false; - } - } - } - } - - if (!allClear) - { - return false; - } - else - { - Block blockUsing = par1World.getBlock(x, y - 1, z); - - if ((blockUsing == Blocks.grass || blockUsing == Blocks.dirt) && y < 256 - height - 1) - { - this.setBlock(par1World, x, y - 1, z, Blocks.dirt); - width = 3; - byte var18 = 0; - int treeWidth; - int tx; - int var15; - - for (cz = y - width + height; cz <= y + height; ++cz) - { - int number = cz - (y + height); - treeWidth = var18 + 1 - number / 2; - - for (tx = x - treeWidth; tx <= x + treeWidth; ++tx) - { - var15 = tx - x; - - for (int tz = z - treeWidth; tz <= z + treeWidth; ++tz) - { - int var17 = tz - z; - - Block block = par1World.getBlock(tx, cz, tz); - - if ((Math.abs(var15) != treeWidth || Math.abs(var17) != treeWidth || par2Random.nextInt(2) != 0 && number != 0) && - (block == null || block.canBeReplacedByLeaves(par1World, tx, cz, tz))) - { - this.setBlockAndMetadata(par1World, tx, cz, tz, this.leafBlock, this.leafMeta); - } - } - } - } - - for (cz = 0; cz < height; ++cz) - { - blockID = par1World.getBlock(x, y + cz, z); - - Block block = blockID; - - if (blockID == Blocks.air || block == null || block.isLeaves(par1World, x, y + cz, z)) - { - this.setBlockAndMetadata(par1World, x, y + cz, z, this.treeBlock, this.treeMeta); - } - } - - return true; - } - else - { - return false; - } - } - } - else - { - return false; - } - } -} diff --git a/src/main/java/twilightforest/world/TFGenSortingTree.java b/src/main/java/twilightforest/world/TFGenSortingTree.java deleted file mode 100644 index cc48bd95ea..0000000000 --- a/src/main/java/twilightforest/world/TFGenSortingTree.java +++ /dev/null @@ -1,79 +0,0 @@ -package twilightforest.world; - -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.world.World; -import twilightforest.block.BlockTFMagicLog; -import twilightforest.block.BlockTFMagicLogSpecial; -import twilightforest.block.BlockTFRoots; -import twilightforest.block.TFBlocks; - - -public class TFGenSortingTree extends TFGenerator -{ - protected Block treeBlock = TFBlocks.magicLog; - protected int treeMeta = BlockTFMagicLog.META_SORT; - protected int branchMeta = treeMeta | 12; - protected Block leafBlock = TFBlocks.magicLeaves; - protected int leafMeta = 3; - protected Block rootBlock = TFBlocks.root; - protected int rootMeta = BlockTFRoots.ROOT_META; - - public TFGenSortingTree() - { - this(false); - } - - - public TFGenSortingTree(boolean notify) - { - super(notify); - } - - - @Override - public boolean generate(World world, Random rand, int x, int y, int z) { - // check soil - Material materialUnder = world.getBlock(x, y - 1, z).getMaterial(); - if ((materialUnder != Material.grass && materialUnder != Material.ground) || y >= TFWorld.MAXHEIGHT - 12) - { - return false; - } - - // 3 block high trunk - for (int dy = 0; dy < 4; dy++) - { - setBlockAndMetadata(world, x, y + dy, z, treeBlock, treeMeta); - } - - // leaves - putLeaves(world, x, y + 2, z, false); - putLeaves(world, x, y + 3, z, false); - - // sorting engine - setBlockAndMetadata(world, x, y + 1, z, TFBlocks.magicLogSpecial, BlockTFMagicLogSpecial.META_SORT); - - return true; - } - - - protected void putLeaves(World world, int bx, int by, int bz, boolean bushy) { - for (int lx = -1; lx <= 1; lx++) - { - for (int ly = -1; ly <= 1; ly++) - { - for (int lz = -1; lz <= 1; lz++) - { - if (!bushy && Math.abs(ly) > 0 && (Math.abs(lx) + Math.abs(lz)) > 1) - { - continue; - } - putLeafBlock(world, bx + lx, by + ly, bz + lz, leafBlock, leafMeta); - } - } - } - } - -} diff --git a/src/main/java/twilightforest/world/TFGenStoneCircle.java b/src/main/java/twilightforest/world/TFGenStoneCircle.java deleted file mode 100644 index 66d91fc6cc..0000000000 --- a/src/main/java/twilightforest/world/TFGenStoneCircle.java +++ /dev/null @@ -1,38 +0,0 @@ -package twilightforest.world; - -import java.util.Random; - -import net.minecraft.init.Blocks; -import net.minecraft.world.World; - - -public class TFGenStoneCircle extends TFGenerator { - - - /** - * We make a stone circle, generally 3 squares in diameter - */ - public boolean generate(World world, Random rand, int x, int y, int z) { - if (!isAreaSuitable(world, rand, x - 3, y, z - 3, 6, 4, 6)) - { - return false; - } - - // okay! circle! - for (int cy = 0; cy <= 2; cy++) - { - setBlock(world, x - 3, y + cy, z, Blocks.mossy_cobblestone); - setBlock(world, x + 3, y + cy, z, Blocks.mossy_cobblestone); - setBlock(world, x, y + cy, z - 3, Blocks.mossy_cobblestone); - setBlock(world, x, y + cy, z + 3, Blocks.mossy_cobblestone); - setBlock(world, x - 2, y + cy, z - 2, Blocks.mossy_cobblestone); - setBlock(world, x + 2, y + cy, z - 2, Blocks.mossy_cobblestone); - setBlock(world, x - 2, y + cy, z + 2, Blocks.mossy_cobblestone); - setBlock(world, x + 2, y + cy, z + 2, Blocks.mossy_cobblestone); - } - - - return true; - } - -} diff --git a/src/main/java/twilightforest/world/TFGenTallGrass.java b/src/main/java/twilightforest/world/TFGenTallGrass.java deleted file mode 100644 index 0c58741eb6..0000000000 --- a/src/main/java/twilightforest/world/TFGenTallGrass.java +++ /dev/null @@ -1,50 +0,0 @@ -package twilightforest.world; - -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.world.World; -import net.minecraft.world.gen.feature.WorldGenerator; - -public class TFGenTallGrass extends WorldGenerator { - - private Block tallGrassID; - private int tallGrassMetadata; - private int amount; - - public TFGenTallGrass(Block blockID, int meta, int amount) { - this.amount = amount; - this.tallGrassID = blockID; - this.tallGrassMetadata = meta; - } - - public boolean generate(World par1World, Random par2Random, int x, int y, int z) - { - Block block = null; - do - { - block = par1World.getBlock(x, y, z); - if (block != null && !block.isLeaves(par1World, x, y, z)) - { - break; - } - y--; - } while (y > 0); - - - for (int i = 0; i < amount; ++i) - { - int dx = x + par2Random.nextInt(8) - par2Random.nextInt(8); - int dy = y + par2Random.nextInt(4) - par2Random.nextInt(4); - int dz = z + par2Random.nextInt(8) - par2Random.nextInt(8); - - if (par1World.isAirBlock(dx, dy, dz) && this.tallGrassID.canBlockStay(par1World, dx, dy, dz)) - { - par1World.setBlock(dx, dy, dz, this.tallGrassID, this.tallGrassMetadata, 2); - } - } - - return true; - } - -} diff --git a/src/main/java/twilightforest/world/TFGenThorns.java b/src/main/java/twilightforest/world/TFGenThorns.java deleted file mode 100644 index 5bc78bc5f9..0000000000 --- a/src/main/java/twilightforest/world/TFGenThorns.java +++ /dev/null @@ -1,126 +0,0 @@ -package twilightforest.world; - -import java.util.Random; - -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; -import twilightforest.block.TFBlocks; - -public class TFGenThorns extends TFGenerator { - - private static final int MAX_SPREAD = 7; - private static final int CHANCE_OF_BRANCH = 3; - private static final int CHANCE_OF_LEAF = 3; - private static final int CHANCE_LEAF_IS_ROSE = 50; - - @Override - public boolean generate(World world, Random rand, int x, int y, int z) { - - // make a 3-5 long stack going up - int nextLength = 2 + rand.nextInt(4); - int maxLength = 2 + rand.nextInt(4) + rand.nextInt(4) + rand.nextInt(4); - - placeThorns(world, rand, x, y, z, nextLength, ForgeDirection.UP, maxLength, x, y, z); - - - return true; - } - - private void placeThorns(World world, Random rand, int x, int y, int z, int length, ForgeDirection dir, int maxLength, int ox, int oy, int oz) { - boolean complete = false; - for (int i = 0; i < length; i++) { - int dx = x + (dir.offsetX * i); - int dy = y + (dir.offsetY * i); - int dz = z + (dir.offsetZ * i); - - if (Math.abs(dx - ox) < MAX_SPREAD && Math.abs(dz - oz) < MAX_SPREAD && canPlaceThorns(world, dx, dy, dz)) { - this.setBlockAndMetadata(world, dx, dy, dz, TFBlocks.thorns, getMetaFor(dir)); - - // did we make it to the end? - if (i == length - 1) { - complete = true; - // maybe a leaf? or a rose? - if (rand.nextInt(CHANCE_OF_LEAF) == 0 && world.isAirBlock(dx + dir.offsetX, dy + dir.offsetY, dz + dir.offsetZ)) { - if (rand.nextInt(CHANCE_LEAF_IS_ROSE) > 0) { - // leaf - this.setBlockAndMetadata(world, dx + dir.offsetX, dy + dir.offsetY, dz + dir.offsetZ, TFBlocks.leaves3, 0); - } else { - // rose - this.setBlock(world, dx + dir.offsetX, dy + dir.offsetY, dz + dir.offsetZ, TFBlocks.thornRose); - } - } - } - } else { - break; - } - } - - // add another off the end - if (complete && maxLength > 1) { - - ForgeDirection nextDir = ForgeDirection.VALID_DIRECTIONS[rand.nextInt(ForgeDirection.VALID_DIRECTIONS.length)]; - - int nextX = x + (dir.offsetX * (length - 1)) + nextDir.offsetX; - int nextY = y + (dir.offsetY * (length - 1)) + nextDir.offsetY; - int nextZ = z + (dir.offsetZ * (length - 1)) + nextDir.offsetZ; - - int nextLength = 1 + rand.nextInt(maxLength); - - this.placeThorns(world, rand, nextX, nextY, nextZ, nextLength, nextDir, maxLength - 1, ox, oy, oz); - } - - // maybe another branch off the middle - if (complete && length > 3 && rand.nextInt(CHANCE_OF_BRANCH) == 0) { - - int middle = rand.nextInt(length); - - ForgeDirection nextDir = ForgeDirection.VALID_DIRECTIONS[rand.nextInt(ForgeDirection.VALID_DIRECTIONS.length)]; - - int nextX = x + (dir.offsetX * middle) + nextDir.offsetX; - int nextY = y + (dir.offsetY * middle) + nextDir.offsetY; - int nextZ = z + (dir.offsetZ * middle) + nextDir.offsetZ; - - int nextLength = 1 + rand.nextInt(maxLength); - - this.placeThorns(world, rand, nextX, nextY, nextZ, nextLength, nextDir, maxLength - 1, ox, oy, oz); - } - - // maybe a leaf - if (complete && length > 3 && rand.nextInt(CHANCE_OF_LEAF) == 0) { - - int middle = rand.nextInt(length); - - ForgeDirection nextDir = ForgeDirection.VALID_DIRECTIONS[rand.nextInt(ForgeDirection.VALID_DIRECTIONS.length)]; - - int nextX = x + (dir.offsetX * middle) + nextDir.offsetX; - int nextY = y + (dir.offsetY * middle) + nextDir.offsetY; - int nextZ = z + (dir.offsetZ * middle) + nextDir.offsetZ; - - if (world.isAirBlock(nextX, nextY, nextZ)) { - this.setBlockAndMetadata(world, nextX, nextY, nextZ, TFBlocks.leaves3, 0); - } - } - - } - - private boolean canPlaceThorns(World world, int dx, int dy, int dz) { - return world.isAirBlock(dx, dy, dz) || world.getBlock(dx, dy, dz).isLeaves(world, dx, dy, dz); - } - - private int getMetaFor(ForgeDirection dir) { - switch (dir) { - case UNKNOWN: - default: - case UP: - case DOWN: - return 0; - case EAST: - case WEST: - return 4; - case NORTH: - case SOUTH: - return 8; - } - } - -} diff --git a/src/main/java/twilightforest/world/TFGenTorchBerries.java b/src/main/java/twilightforest/world/TFGenTorchBerries.java deleted file mode 100644 index 9f0af6a74d..0000000000 --- a/src/main/java/twilightforest/world/TFGenTorchBerries.java +++ /dev/null @@ -1,34 +0,0 @@ -package twilightforest.world; - -import java.util.Random; - -import net.minecraft.world.World; -import twilightforest.block.BlockTFPlant; -import twilightforest.block.TFBlocks; - - - -public class TFGenTorchBerries extends TFGenerator -{ - public boolean generate(World par1World, Random par2Random, int x, int y, int z) - { - int copyX = x; - int copyZ = z; - - for (; y > 5; --y) - { - if (par1World.isAirBlock(x, y, z) && BlockTFPlant.canPlaceRootBelow(par1World, x, y + 1, z) && par2Random.nextInt(6) > 0) - { - par1World.setBlock(x, y, z, TFBlocks.plant, 13, 2); - break; - } - else - { - x = copyX + par2Random.nextInt(4) - par2Random.nextInt(4); - z = copyZ + par2Random.nextInt(4) - par2Random.nextInt(4); - } - } - - return true; - } -} diff --git a/src/main/java/twilightforest/world/TFGenTreeOfTime.java b/src/main/java/twilightforest/world/TFGenTreeOfTime.java deleted file mode 100644 index 153e6b3c15..0000000000 --- a/src/main/java/twilightforest/world/TFGenTreeOfTime.java +++ /dev/null @@ -1,80 +0,0 @@ -package twilightforest.world; - -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.init.Blocks; -import net.minecraft.world.World; -import twilightforest.block.TFBlocks; - -public class TFGenTreeOfTime extends TFGenHollowTree { - - public TFGenTreeOfTime(boolean par1) { - super(par1); - - this.treeBlock = TFBlocks.magicLog; - this.treeMeta = 0; - this.branchMeta = treeMeta | 12; - this.leafBlock = TFBlocks.magicLeaves; - this.leafMeta = 0; - } - - public boolean generate(World world, Random random, int x, int y, int z) { - - int height = 8; - int diameter = 1; - - // do we have enough height? - if (y < 1 || y + height + diameter > TFWorld.MAXHEIGHT) { - // System.out.println("Failed with hollow tree of height " + - // height); - return false; - } - // make a tree! - - // check if we're on dirt or grass - Block j1 = world.getBlock(x, y - 1, z); - if (j1 != Blocks.grass && j1 != Blocks.dirt) { - return false; - } - - // build the trunk - buildTrunk(world, random, x, y, z, diameter, height); - - // build the crown - buildTinyCrown(world, random, x, y, z, diameter, height); - - // 3-5 roots at the bottom - buildBranchRing(world, random, x, y, z, diameter, 1, 0, 12, 0, 0.75D, 0, 3, 5, 3, false); - - // several more taproots - buildBranchRing(world, random, x, y, z, diameter, 1, 2, 18, 0, 0.9D, 0, 3, 5, 3, false); - - // add clock block - this.setBlockAndMetadata(world, x - 1, y + 2, z, TFBlocks.magicLogSpecial, 0); - - return true; - } - - /** - * Build the crown of the tree. This builds a smaller crown, since the large - * ones were causing some performance issues - */ - protected void buildTinyCrown(World world, Random random, int x, int y, int z, int diameter, int height) { - int crownRadius = 4; - int bvar = 1; - - // 3-5 medium branches starting at the bottom of the crown - buildBranchRing(world, random, x, y, z, diameter, height - crownRadius, 0, crownRadius, 0, 0.35D, 0, bvar, bvar + 2, 1, true); - - // 3-5 medium branches at the crown middle - buildBranchRing(world, random, x, y, z, diameter, height - (crownRadius / 2), 0, crownRadius, 0, 0.28D, 0, bvar, bvar + 2, 1, true); - - // 2-4 medium branches at the crown top - buildBranchRing(world, random, x, y, z, diameter, height, 0, crownRadius, 0, 0.15D, 0, 2, 4, 0, true); - - // 3-6 medium branches going straight up - buildBranchRing(world, random, x, y, z, diameter, height, 0, (crownRadius / 2), 0, 0.05D, 0, bvar, bvar + 2, 0, true); - } - -} diff --git a/src/main/java/twilightforest/world/TFGenTreeOfTransformation.java b/src/main/java/twilightforest/world/TFGenTreeOfTransformation.java deleted file mode 100644 index 028f8428fb..0000000000 --- a/src/main/java/twilightforest/world/TFGenTreeOfTransformation.java +++ /dev/null @@ -1,50 +0,0 @@ -package twilightforest.world; - -import java.util.Random; - -import net.minecraft.world.World; -import twilightforest.block.BlockTFMagicLogSpecial; -import twilightforest.block.TFBlocks; - - -public class TFGenTreeOfTransformation extends TFGenCanopyTree -{ - - public TFGenTreeOfTransformation() - { - this(false); - } - - - public TFGenTreeOfTransformation(boolean notify) - { - super(notify); - - this.treeBlock = TFBlocks.magicLog; - this.treeMeta = 1; - this.branchMeta = treeMeta | 12; - this.leafBlock = TFBlocks.magicLeaves; - this.leafMeta = 1; - - this.minHeight = 11; - this.chanceAddFirstFive = Integer.MAX_VALUE; - this.chanceAddSecondFive = Integer.MAX_VALUE; - } - - - @Override - public boolean generate(World world, Random random, int x, int y, int z) { - if(super.generate(world, random, x, y, z)) - { - // heart of transformation - setBlockAndMetadata(world, x, y + 3, z, TFBlocks.magicLogSpecial, BlockTFMagicLogSpecial.META_TRANS); - return true; - } - else - { - return false; - } - } - - -} diff --git a/src/main/java/twilightforest/world/TFGenTrollRoots.java b/src/main/java/twilightforest/world/TFGenTrollRoots.java deleted file mode 100644 index 8480aac327..0000000000 --- a/src/main/java/twilightforest/world/TFGenTrollRoots.java +++ /dev/null @@ -1,39 +0,0 @@ -package twilightforest.world; - -import java.util.Random; - -import net.minecraft.block.material.Material; -import net.minecraft.world.World; -import twilightforest.block.BlockTFPlant; -import twilightforest.block.BlockTFTrollRoot; -import twilightforest.block.TFBlocks; - - - -public class TFGenTrollRoots extends TFGenerator -{ - public boolean generate(World par1World, Random par2Random, int x, int y, int z) - { - int copyX = x; - int copyZ = z; - - for (; y > 5; --y) - { - if (par1World.isAirBlock(x, y, z) && BlockTFTrollRoot.canPlaceRootBelow(par1World, x, y + 1, z) && par2Random.nextInt(6) > 0) - { - if (par2Random.nextInt(10) == 0) { - par1World.setBlock(x, y, z, TFBlocks.unripeTrollBer); - } else { - par1World.setBlock(x, y, z, TFBlocks.trollVidr); - } - } - else - { - x = copyX + par2Random.nextInt(4) - par2Random.nextInt(4); - z = copyZ + par2Random.nextInt(4) - par2Random.nextInt(4); - } - } - - return true; - } -} diff --git a/src/main/java/twilightforest/world/TFGenWell.java b/src/main/java/twilightforest/world/TFGenWell.java deleted file mode 100644 index 271f7440cd..0000000000 --- a/src/main/java/twilightforest/world/TFGenWell.java +++ /dev/null @@ -1,201 +0,0 @@ -package twilightforest.world; - -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.init.Blocks; -import net.minecraft.world.World; -import twilightforest.TFTreasure; - - - -public class TFGenWell extends TFGenerator { - - - - public boolean generate(World world, Random rand, int x, int y, int z) - { - if (rand.nextInt(4) == 0) - { - return generate4x4Well(world, rand, x, y, z); - } - else - { - return generate3x3Well(world, rand, x, y, z); - } - } - - - /** - * make a cute little well - */ - public boolean generate3x3Well(World world, Random rand, int x, int y, int z) - { - if (!isAreaSuitable(world, rand, x, y, z, 3, 4, 3)) - { - return false; - } - - - // make a cute well! - setBlock(world, x + 0, y, z + 0, Blocks.mossy_cobblestone); - setBlock(world, x + 1, y, z + 0, Blocks.mossy_cobblestone); - setBlock(world, x + 2, y, z + 0, Blocks.mossy_cobblestone); - setBlock(world, x + 0, y, z + 2, Blocks.mossy_cobblestone); - setBlock(world, x + 1, y, z + 2, Blocks.mossy_cobblestone); - setBlock(world, x + 2, y, z + 2, Blocks.mossy_cobblestone); - setBlock(world, x + 0, y, z + 1, Blocks.mossy_cobblestone); - setBlock(world, x + 2, y, z + 1, Blocks.mossy_cobblestone); - - setBlock(world, x + 1, y, z + 1, Blocks.water); - - setBlock(world, x + 0, y + 1, z + 0, Blocks.fence); - setBlock(world, x + 2, y + 1, z + 0, Blocks.fence); - setBlock(world, x + 0, y + 1, z + 2, Blocks.fence); - setBlock(world, x + 2, y + 1, z + 2, Blocks.fence); - - setBlock(world, x + 0, y + 2, z + 0, Blocks.fence); - setBlock(world, x + 2, y + 2, z + 0, Blocks.fence); - setBlock(world, x + 0, y + 2, z + 2, Blocks.fence); - setBlock(world, x + 2, y + 2, z + 2, Blocks.fence); - - setBlockAndMetadata(world, x + 0, y + 3, z + 0, Blocks.wooden_slab, 0); - setBlockAndMetadata(world, x + 1, y + 3, z + 0, Blocks.wooden_slab, 0); - setBlockAndMetadata(world, x + 2, y + 3, z + 0, Blocks.wooden_slab, 0); - setBlockAndMetadata(world, x + 0, y + 3, z + 2, Blocks.wooden_slab, 0); - setBlockAndMetadata(world, x + 1, y + 3, z + 2, Blocks.wooden_slab, 0); - setBlockAndMetadata(world, x + 2, y + 3, z + 2, Blocks.wooden_slab, 0); - setBlockAndMetadata(world, x + 0, y + 3, z + 1, Blocks.wooden_slab, 0); - setBlockAndMetadata(world, x + 2, y + 3, z + 1, Blocks.wooden_slab, 0); - - setBlock(world, x + 1, y + 3, z + 1, Blocks.planks); - - - boolean madeTreasure = false; - // now drill each the well square down 20 squares, or until we hit something - for (int dy = -1; dy >= -20; dy--) - { - Block dblock = world.getBlock(x + 1, y + dy, z + 1); - // we only drill through dirt, grass, gravel and stone - if (dblock != Blocks.dirt && dblock != Blocks.grass && dblock != Blocks.gravel && dblock != Blocks.stone) - { - break; - } - // we also need a solid block under where we're digging - if (!world.getBlock(x + 1, y + dy - 1, z + 1).getMaterial().isSolid()) - { - break; - } - - // okay, we're good to dig. - setBlock(world, x + 1, y + dy, z + 1, Blocks.water); - - // if we're below 15 squares, there's a small chance of treasure - if (dy < -15 && madeTreasure == false && rand.nextInt(8) == 0) { - //TODO: more directions - setBlock(world, x + 2, y + dy, z + 1, Blocks.water); - setBlock(world, x + 3, y + dy + 1, z + 1, Blocks.air); - setBlock(world, x + 3, y + dy, z + 1, Blocks.air); - - //TODO: unique treasure table that is themed for underwater well exploration - TFTreasure.basement.generate(world, rand, x + 3, y + dy, z + 1); - - // set flag so we only get one chest - madeTreasure = true; - } - } - - return true; - } - - - - - /** - * Make a larger well - */ - public boolean generate4x4Well(World world, Random rand, int x, int y, int z) { - if (!isAreaSuitable(world, rand, x, y, z, 4, 4, 4)) - { - return false; - } - - // make a cute well! - setBlock(world, x + 0, y, z + 0, Blocks.mossy_cobblestone); - setBlock(world, x + 1, y, z + 0, Blocks.mossy_cobblestone); - setBlock(world, x + 2, y, z + 0, Blocks.mossy_cobblestone); - setBlock(world, x + 3, y, z + 0, Blocks.mossy_cobblestone); - setBlock(world, x + 0, y, z + 3, Blocks.mossy_cobblestone); - setBlock(world, x + 1, y, z + 3, Blocks.mossy_cobblestone); - setBlock(world, x + 2, y, z + 3, Blocks.mossy_cobblestone); - setBlock(world, x + 3, y, z + 3, Blocks.mossy_cobblestone); - setBlock(world, x + 0, y, z + 1, Blocks.mossy_cobblestone); - setBlock(world, x + 0, y, z + 2, Blocks.mossy_cobblestone); - setBlock(world, x + 3, y, z + 1, Blocks.mossy_cobblestone); - setBlock(world, x + 3, y, z + 2, Blocks.mossy_cobblestone); - - setBlock(world, x + 1, y, z + 1, Blocks.water); - setBlock(world, x + 2, y, z + 1, Blocks.water); - setBlock(world, x + 1, y, z + 2, Blocks.water); - setBlock(world, x + 2, y, z + 2, Blocks.water); - - setBlock(world, x + 0, y + 1, z + 0, Blocks.fence); - setBlock(world, x + 3, y + 1, z + 0, Blocks.fence); - setBlock(world, x + 0, y + 1, z + 3, Blocks.fence); - setBlock(world, x + 3, y + 1, z + 3, Blocks.fence); - - setBlock(world, x + 0, y + 2, z + 0, Blocks.fence); - setBlock(world, x + 3, y + 2, z + 0, Blocks.fence); - setBlock(world, x + 0, y + 2, z + 3, Blocks.fence); - setBlock(world, x + 3, y + 2, z + 3, Blocks.fence); - - setBlockAndMetadata(world, x + 0, y + 3, z + 0, Blocks.wooden_slab, 0); - setBlockAndMetadata(world, x + 1, y + 3, z + 0, Blocks.wooden_slab, 0); - setBlockAndMetadata(world, x + 2, y + 3, z + 0, Blocks.wooden_slab, 0); - setBlockAndMetadata(world, x + 3, y + 3, z + 0, Blocks.wooden_slab, 0); - setBlockAndMetadata(world, x + 0, y + 3, z + 3, Blocks.wooden_slab, 0); - setBlockAndMetadata(world, x + 1, y + 3, z + 3, Blocks.wooden_slab, 0); - setBlockAndMetadata(world, x + 2, y + 3, z + 3, Blocks.wooden_slab, 0); - setBlockAndMetadata(world, x + 3, y + 3, z + 3, Blocks.wooden_slab, 0); - setBlockAndMetadata(world, x + 0, y + 3, z + 1, Blocks.wooden_slab, 0); - setBlockAndMetadata(world, x + 0, y + 3, z + 2, Blocks.wooden_slab, 0); - setBlockAndMetadata(world, x + 3, y + 3, z + 1, Blocks.wooden_slab, 0); - setBlockAndMetadata(world, x + 3, y + 3, z + 2, Blocks.wooden_slab, 0); - - setBlock(world, x + 1, y + 3, z + 1, Blocks.planks); - setBlock(world, x + 2, y + 3, z + 1, Blocks.planks); - setBlock(world, x + 1, y + 3, z + 2, Blocks.planks); - setBlock(world, x + 2, y + 3, z + 2, Blocks.planks); - - - // now drill each of the 4 well squares down 20 squares, or until we hit something - for (int dx = 1; dx <= 2; dx++) - { - for (int dz = 1; dz <= 2; dz++) - { - for (int dy = -1; dy >= -20; dy--) - { - Block dblock = world.getBlock(x + dx, y + dy, z + dz); - // we only drill through dirt, grass, gravel and stone - if (dblock != Blocks.dirt && dblock != Blocks.grass && dblock != Blocks.gravel && dblock != Blocks.stone) - { - break; - } - // we also need a solid block under where we're digging - if (!world.getBlock(x + dx, y + dy - 1, z + dz).getMaterial().isSolid()) - { - break; - } - - // okay, we're good to dig. - setBlock(world, x + dx, y + dy, z + dz, Blocks.water); - } - - } - - } - - return true; - } - -} diff --git a/src/main/java/twilightforest/world/TFGenWitchHut.java b/src/main/java/twilightforest/world/TFGenWitchHut.java deleted file mode 100644 index 8cab2e003e..0000000000 --- a/src/main/java/twilightforest/world/TFGenWitchHut.java +++ /dev/null @@ -1,191 +0,0 @@ -package twilightforest.world; - -import java.util.Random; - -import net.minecraft.init.Blocks; -import net.minecraft.tileentity.MobSpawnerBaseLogic; -import net.minecraft.tileentity.TileEntityMobSpawner; -import net.minecraft.world.World; -import twilightforest.entity.TFCreatures; - - -public class TFGenWitchHut extends TFGenerator { - - /** - * Make a cute witch's hut - */ - public boolean generate(World world, Random rand, int x, int y, int z) - { - return generateTinyHut(world, rand, x, y, z); - } - - /** - * Make the smallest size hut - */ - public boolean generateTinyHut(World world, Random rand, int x, int y, int z) - { - if (!isAreaSuitable(world, rand, x, y, z, 5, 7, 6)) - { - return false; - } - - // walls! - - setBlock(world, x + 1, y + 0, z + 1, randStone(rand, 1)); - setBlock(world, x + 2, y + 0, z + 1, randStone(rand, 1)); - setBlock(world, x + 3, y + 0, z + 1, randStone(rand, 1)); - setBlock(world, x + 5, y + 0, z + 1, randStone(rand, 1)); - setBlock(world, x + 0, y + 0, z + 2, Blocks.brick_block); - setBlock(world, x + 1, y + 0, z + 2, Blocks.brick_block); - setBlock(world, x + 5, y + 0, z + 2, randStone(rand, 1)); - setBlock(world, x + 0, y + 0, z + 3, Blocks.brick_block); - setBlock(world, x + 5, y + 0, z + 3, randStone(rand, 1)); - setBlock(world, x + 0, y + 0, z + 4, Blocks.brick_block); - setBlock(world, x + 1, y + 0, z + 4, Blocks.brick_block); - setBlock(world, x + 5, y + 0, z + 4, randStone(rand, 1)); - setBlock(world, x + 1, y + 0, z + 5, randStone(rand, 1)); - setBlock(world, x + 2, y + 0, z + 5, randStone(rand, 1)); - setBlock(world, x + 3, y + 0, z + 5, randStone(rand, 1)); - setBlock(world, x + 5, y + 0, z + 5, randStone(rand, 1)); - - setBlock(world, x + 1, y + 1, z + 1, randStone(rand, 2)); - setBlock(world, x + 3, y + 1, z + 1, randStone(rand, 2)); - setBlock(world, x + 5, y + 1, z + 1, randStone(rand, 2)); - setBlock(world, x + 0, y + 1, z + 2, Blocks.brick_block); - setBlock(world, x + 1, y + 1, z + 2, Blocks.brick_block); - setBlock(world, x + 5, y + 1, z + 2, randStone(rand, 2)); - setBlock(world, x + 0, y + 1, z + 3, Blocks.brick_block); - setBlock(world, x + 0, y + 1, z + 4, Blocks.brick_block); - setBlock(world, x + 1, y + 1, z + 4, Blocks.brick_block); - setBlock(world, x + 5, y + 1, z + 4, randStone(rand, 2)); - setBlock(world, x + 1, y + 1, z + 5, randStone(rand, 2)); - setBlock(world, x + 3, y + 1, z + 5, randStone(rand, 2)); - setBlock(world, x + 5, y + 1, z + 5, randStone(rand, 2)); - - setBlock(world, x + 1, y + 2, z + 1, randStone(rand, 3)); - setBlock(world, x + 2, y + 2, z + 1, randStone(rand, 3)); - setBlock(world, x + 3, y + 2, z + 1, randStone(rand, 3)); - setBlock(world, x + 4, y + 2, z + 1, randStone(rand, 3)); - setBlock(world, x + 5, y + 2, z + 1, randStone(rand, 3)); - setBlock(world, x + 0, y + 2, z + 2, Blocks.brick_block); - setBlock(world, x + 1, y + 2, z + 2, Blocks.brick_block); - setBlock(world, x + 5, y + 2, z + 2, randStone(rand, 3)); - setBlock(world, x + 0, y + 2, z + 3, Blocks.brick_block); - setBlock(world, x + 5, y + 2, z + 3, randStone(rand, 3)); - setBlock(world, x + 0, y + 2, z + 4, Blocks.brick_block); - setBlock(world, x + 1, y + 2, z + 4, Blocks.brick_block); - setBlock(world, x + 5, y + 2, z + 4, randStone(rand, 1)); - setBlock(world, x + 1, y + 2, z + 5, randStone(rand, 3)); - setBlock(world, x + 2, y + 2, z + 5, randStone(rand, 3)); - setBlock(world, x + 3, y + 2, z + 5, randStone(rand, 3)); - setBlock(world, x + 4, y + 2, z + 5, randStone(rand, 3)); - setBlock(world, x + 5, y + 2, z + 5, randStone(rand, 3)); - - setBlock(world, x + 0, y + 3, z + 2, Blocks.brick_block); - setBlock(world, x + 0, y + 3, z + 3, Blocks.brick_block); - setBlock(world, x + 0, y + 3, z + 4, Blocks.brick_block); - setBlock(world, x + 2, y + 3, z + 1, randStone(rand, 4)); - setBlock(world, x + 3, y + 3, z + 1, randStone(rand, 4)); - setBlock(world, x + 4, y + 3, z + 1, randStone(rand, 4)); - setBlock(world, x + 2, y + 3, z + 5, randStone(rand, 4)); - setBlock(world, x + 3, y + 3, z + 5, randStone(rand, 4)); - setBlock(world, x + 4, y + 3, z + 5, randStone(rand, 4)); - - setBlock(world, x + 0, y + 4, z + 3, Blocks.brick_block); - setBlock(world, x + 3, y + 4, z + 1, randStone(rand, 5)); - setBlock(world, x + 3, y + 4, z + 5, randStone(rand, 5)); - - setBlock(world, x + 0, y + 5, z + 3, Blocks.brick_block); - - setBlock(world, x + 0, y + 6, z + 3, Blocks.brick_block); - - // roof! - setBlockAndMetadata(world, x + 0, y + 2, z + 0, Blocks.double_stone_slab, 2); - setBlockAndMetadata(world, x + 0, y + 2, z + 1, Blocks.double_stone_slab, 2); - setBlockAndMetadata(world, x + 0, y + 2, z + 5, Blocks.double_stone_slab, 2); - setBlockAndMetadata(world, x + 0, y + 2, z + 6, Blocks.double_stone_slab, 2); - setBlockAndMetadata(world, x + 6, y + 2, z + 0, Blocks.double_stone_slab, 2); - setBlockAndMetadata(world, x + 6, y + 2, z + 1, Blocks.double_stone_slab, 2); - setBlockAndMetadata(world, x + 6, y + 2, z + 2, Blocks.double_stone_slab, 2); - setBlockAndMetadata(world, x + 6, y + 2, z + 3, Blocks.double_stone_slab, 2); - setBlockAndMetadata(world, x + 6, y + 2, z + 4, Blocks.double_stone_slab, 2); - setBlockAndMetadata(world, x + 6, y + 2, z + 5, Blocks.double_stone_slab, 2); - setBlockAndMetadata(world, x + 6, y + 2, z + 6, Blocks.double_stone_slab, 2); - - setBlockAndMetadata(world, x + 1, y + 3, z + 0, Blocks.double_stone_slab, 2); - setBlockAndMetadata(world, x + 1, y + 3, z + 1, Blocks.double_stone_slab, 2); - setBlockAndMetadata(world, x + 1, y + 3, z + 2, Blocks.double_stone_slab, 2); - setBlockAndMetadata(world, x + 1, y + 3, z + 4, Blocks.double_stone_slab, 2); - setBlockAndMetadata(world, x + 1, y + 3, z + 5, Blocks.double_stone_slab, 2); - setBlockAndMetadata(world, x + 1, y + 3, z + 6, Blocks.double_stone_slab, 2); - setBlockAndMetadata(world, x + 5, y + 3, z + 0, Blocks.double_stone_slab, 2); - setBlockAndMetadata(world, x + 5, y + 3, z + 1, Blocks.double_stone_slab, 2); - setBlockAndMetadata(world, x + 5, y + 3, z + 2, Blocks.double_stone_slab, 2); - setBlockAndMetadata(world, x + 5, y + 3, z + 3, Blocks.double_stone_slab, 2); - setBlockAndMetadata(world, x + 5, y + 3, z + 4, Blocks.double_stone_slab, 2); - setBlockAndMetadata(world, x + 5, y + 3, z + 5, Blocks.double_stone_slab, 2); - setBlockAndMetadata(world, x + 5, y + 3, z + 6, Blocks.double_stone_slab, 2); - - setBlockAndMetadata(world, x + 1, y + 4, z + 0, Blocks.stone_slab, 2); - setBlockAndMetadata(world, x + 2, y + 4, z + 0, Blocks.double_stone_slab, 2); - setBlockAndMetadata(world, x + 2, y + 4, z + 1, Blocks.double_stone_slab, 2); - setBlockAndMetadata(world, x + 2, y + 4, z + 2, Blocks.double_stone_slab, 2); - setBlockAndMetadata(world, x + 2, y + 4, z + 3, Blocks.double_stone_slab, 2); - setBlockAndMetadata(world, x + 2, y + 4, z + 4, Blocks.double_stone_slab, 2); - setBlockAndMetadata(world, x + 2, y + 4, z + 5, Blocks.double_stone_slab, 2); - setBlockAndMetadata(world, x + 2, y + 4, z + 6, Blocks.double_stone_slab, 2); - setBlockAndMetadata(world, x + 1, y + 4, z + 6, Blocks.stone_slab, 2); - setBlockAndMetadata(world, x + 5, y + 4, z + 0, Blocks.stone_slab, 2); - setBlockAndMetadata(world, x + 4, y + 4, z + 0, Blocks.double_stone_slab, 2); - setBlockAndMetadata(world, x + 4, y + 4, z + 1, Blocks.double_stone_slab, 2); - setBlockAndMetadata(world, x + 4, y + 4, z + 2, Blocks.double_stone_slab, 2); - setBlockAndMetadata(world, x + 4, y + 4, z + 3, Blocks.double_stone_slab, 2); - setBlockAndMetadata(world, x + 4, y + 4, z + 4, Blocks.double_stone_slab, 2); - setBlockAndMetadata(world, x + 4, y + 4, z + 5, Blocks.double_stone_slab, 2); - setBlockAndMetadata(world, x + 4, y + 4, z + 6, Blocks.double_stone_slab, 2); - setBlockAndMetadata(world, x + 5, y + 4, z + 6, Blocks.stone_slab, 2); - - setBlockAndMetadata(world, x + 2, y + 5, z + 0, Blocks.stone_slab, 2); - setBlockAndMetadata(world, x + 2, y + 5, z + 1, Blocks.stone_slab, 2); - setBlockAndMetadata(world, x + 4, y + 5, z + 0, Blocks.stone_slab, 2); - setBlockAndMetadata(world, x + 4, y + 5, z + 1, Blocks.stone_slab, 2); - setBlockAndMetadata(world, x + 3, y + 5, z + 0, Blocks.double_stone_slab, 2); - setBlockAndMetadata(world, x + 3, y + 5, z + 1, Blocks.double_stone_slab, 2); - setBlockAndMetadata(world, x + 3, y + 5, z + 2, Blocks.double_stone_slab, 2); - setBlockAndMetadata(world, x + 3, y + 5, z + 3, Blocks.double_stone_slab, 2); - setBlockAndMetadata(world, x + 3, y + 5, z + 4, Blocks.double_stone_slab, 2); - setBlockAndMetadata(world, x + 3, y + 5, z + 5, Blocks.double_stone_slab, 2); - setBlockAndMetadata(world, x + 3, y + 5, z + 6, Blocks.double_stone_slab, 2); - setBlockAndMetadata(world, x + 2, y + 5, z + 5, Blocks.stone_slab, 2); - setBlockAndMetadata(world, x + 2, y + 5, z + 6, Blocks.stone_slab, 2); - setBlockAndMetadata(world, x + 4, y + 5, z + 5, Blocks.stone_slab, 2); - setBlockAndMetadata(world, x + 4, y + 5, z + 6, Blocks.stone_slab, 2); - - setBlockAndMetadata(world, x + 3, y + 6, z + 0, Blocks.double_stone_slab, 2); - setBlockAndMetadata(world, x + 3, y + 6, z + 1, Blocks.double_stone_slab, 2); - setBlockAndMetadata(world, x + 3, y + 6, z + 2, Blocks.stone_slab, 2); - setBlockAndMetadata(world, x + 3, y + 6, z + 4, Blocks.stone_slab, 2); - setBlockAndMetadata(world, x + 3, y + 6, z + 5, Blocks.double_stone_slab, 2); - setBlockAndMetadata(world, x + 3, y + 6, z + 6, Blocks.double_stone_slab, 2); - - setBlockAndMetadata(world, x + 3, y + 7, z + 0, Blocks.stone_slab, 2); - setBlockAndMetadata(world, x + 3, y + 7, z + 6, Blocks.stone_slab, 2); - - // fire in chimney! - setBlock(world, x + 1, y - 1, z + 3, Blocks.netherrack); - setBlock(world, x + 1, y + 0, z + 3, Blocks.fire); // oh god the roof! - - // skeleton spawner! - world.setBlock(x + 3, y + 1, z + 3, Blocks.mob_spawner, 0, 2); - TileEntityMobSpawner ms = (TileEntityMobSpawner)world.getTileEntity(x + 3, y + 1, z + 3); - MobSpawnerBaseLogic spawnerLogic = ms.func_145881_a(); - if (spawnerLogic != null) { - spawnerLogic.setEntityName(TFCreatures.getSpawnerNameFor("Skeleton Druid")); - } - - - - return true; - } - -} diff --git a/src/main/java/twilightforest/world/TFGenWoodRoots.java b/src/main/java/twilightforest/world/TFGenWoodRoots.java deleted file mode 100644 index 7d2f6dd2ce..0000000000 --- a/src/main/java/twilightforest/world/TFGenWoodRoots.java +++ /dev/null @@ -1,122 +0,0 @@ -package twilightforest.world; - -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.init.Blocks; -import net.minecraft.util.ChunkCoordinates; -import net.minecraft.world.World; -import twilightforest.block.BlockTFRoots; -import twilightforest.block.TFBlocks; - - -public class TFGenWoodRoots extends TFGenerator { - - private Block rootBlock = TFBlocks.root; - private int rootMeta = BlockTFRoots.ROOT_META; - private Block oreBlock = TFBlocks.root; - private int oreMeta = BlockTFRoots.OREROOT_META; - - @Override - public boolean generate(World world, Random rand, int x, int y, int z) { - // start must be in stone - if (world.getBlock(x, y, z) != Blocks.stone) { - return false; - } - - float length = rand.nextFloat() * 6.0F + rand.nextFloat() * 6.0F + 4.0F; - if (length > y) { - length = y; - } - - // tilt between 0.6 and 0.9 - float tilt = 0.6F + rand.nextFloat() * 0.3F; - - return drawRoot(world, rand, x, y, z, length, rand.nextFloat(), tilt); - } - - private boolean drawRoot(World world, Random rand, int x, int y, int z, float length, float angle, float tilt) { - // put origin at where we start - return this.drawRoot(world, rand, x, y, z, x, y, z, length, angle, tilt); - } - - - private boolean drawRoot(World world, Random rand, int ox, int oy, int oz, int x, int y, int z, float length, float angle, float tilt) { - // generate a direction and a length - int[] dest = translate(x, y, z, length, angle, tilt); - - // restrict x and z to within 7 - int limit = 6; - if (ox + limit < dest[0]) - { - dest[0] = ox + limit; - } - if (ox - limit > dest[0]) - { - dest[0] = ox - limit; - } - if (oz + limit < dest[2]) - { - dest[2] = oz + limit; - } - if (oz - limit > dest[2]) - { - dest[2] = oz - limit; - } - - // end must be in stone - if (world.getBlock(dest[0], dest[1], dest[2]) != Blocks.stone) { - return false; - } - - // if both the start and the end are in stone, put a root there - ChunkCoordinates[] lineArray = getBresehnamArrayCoords(x, y, z, dest[0], dest[1], dest[2]); - for (ChunkCoordinates coord : lineArray) { - this.placeRootBlock(world, coord.posX, coord.posY, coord.posZ, rootBlock, rootMeta); - } - - - // if we are long enough, make either another root or an oreball - if (length > 8) { - if (rand.nextInt(3) > 0) { - // length > 8, usually split off into another root half as long - int[] nextSrc = translate(x, y, z, length / 2, angle, tilt); - float nextAngle = (angle + 0.25F + (rand.nextFloat() * 0.5F)) % 1.0F; - float nextTilt = 0.6F + rand.nextFloat() * 0.3F; - drawRoot(world, rand, ox, oy, oz, nextSrc[0], nextSrc[1], nextSrc[2], length / 2.0F, nextAngle, nextTilt); - - - } - } - - if (length > 6) { - if (rand.nextInt(4) == 0) { - // length > 6, potentially make oreball - int[] ballSrc = translate(x, y, z, length / 2, angle, tilt); - int[] ballDest = translate(ballSrc[0], ballSrc[1], ballSrc[2], 1.5, (angle + 0.5F) % 1.0F, 0.75); - - this.placeRootBlock(world, ballSrc[0], ballSrc[1], ballSrc[2], oreBlock, oreMeta); - this.placeRootBlock(world, ballSrc[0], ballSrc[1], ballDest[2], oreBlock, oreMeta); - this.placeRootBlock(world, ballDest[0], ballSrc[1], ballSrc[2], oreBlock, oreMeta); - this.placeRootBlock(world, ballDest[0], ballSrc[1], ballDest[2], oreBlock, oreMeta); - this.placeRootBlock(world, ballSrc[0], ballDest[1], ballSrc[2], oreBlock, oreMeta); - this.placeRootBlock(world, ballSrc[0], ballDest[1], ballDest[2], oreBlock, oreMeta); - this.placeRootBlock(world, ballDest[0], ballDest[1], ballSrc[2], oreBlock, oreMeta); - this.placeRootBlock(world, ballDest[0], ballDest[1], ballDest[2], oreBlock, oreMeta); - } - } - - return true; - } - - /** - * Function used to actually place root blocks if they're not going to break anything important - */ - protected void placeRootBlock(World world, int x, int y, int z, Block rootBlock2, int meta) { - if (TFTreeGenerator.canRootGrowIn(world, x, y, z)) - { - this.setBlockAndMetadata(world, x, y, z, rootBlock2, meta); - } - } - -} diff --git a/src/main/java/twilightforest/world/TFGenerator.java b/src/main/java/twilightforest/world/TFGenerator.java deleted file mode 100644 index c4ada13f12..0000000000 --- a/src/main/java/twilightforest/world/TFGenerator.java +++ /dev/null @@ -1,461 +0,0 @@ -package twilightforest.world; - -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.init.Blocks; -import net.minecraft.util.ChunkCoordinates; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; -import net.minecraft.world.gen.feature.WorldGenerator; - - -public abstract class TFGenerator extends WorldGenerator { - - //protected World worldObj; - - public TFGenerator() { - this(false); - } - - public TFGenerator(boolean par1) { - super(par1); - } - - /** - * Moves distance along the vector. - * - * This goofy function takes a float between 0 and 1 for the angle, where 0 is 0 degrees, .5 is 180 degrees and 1 and 360 degrees. - * For the tilt, it takes a float between 0 and 1 where 0 is straight up, 0.5 is straight out and 1 is straight down. - */ - public static int[] translate(int sx, int sy, int sz, double distance, double angle, double tilt) { - int[] dest = {sx, sy, sz}; - - double rangle = angle * 2.0D * Math.PI; - double rtilt = tilt * Math.PI; - - - dest[0] += Math.round(Math.sin(rangle) * Math.sin(rtilt) * distance); - dest[1] += Math.round(Math.cos(rtilt) * distance); - dest[2] += Math.round(Math.cos(rangle) * Math.sin(rtilt) * distance); - - return dest; - } - - /** - * Moves distance along the vector. - * - * This goofy function takes a float between 0 and 1 for the angle, where 0 is 0 degrees, .5 is 180 degrees and 1 and 360 degrees. - * For the tilt, it takes a float between 0 and 1 where 0 is straight up, 0.5 is straight out and 1 is straight down. - */ - public static ChunkCoordinates translateCoords(int sx, int sy, int sz, double distance, double angle, double tilt) { - ChunkCoordinates dest = new ChunkCoordinates(sx, sy, sz); - - double rangle = angle * 2.0D * Math.PI; - double rtilt = tilt * Math.PI; - - - dest.posX += Math.round(Math.sin(rangle) * Math.sin(rtilt) * distance); - dest.posY += Math.round(Math.cos(rtilt) * distance); - dest.posZ += Math.round(Math.cos(rangle) * Math.sin(rtilt) * distance); - - return dest; - } - - /** - * Draws a line from {x1, y1, z1} to {x2, y2, z2} - */ - protected void drawBresehnam(World world, int x1, int y1, int z1, int x2, int y2, int z2, Block blockValue, int metaValue) - { - ChunkCoordinates[] lineArray = getBresehnamArrayCoords(x1, y1, z1, x2, y2, z2); - for (ChunkCoordinates pixel : lineArray) - { - setBlockAndMetadata(world, pixel.posX, pixel.posY, pixel.posZ, blockValue, metaValue); - } - } - - /** - * Get an array of values that represent a line from point A to point B - */ - public static ChunkCoordinates[] getBresehnamArrayCoords(ChunkCoordinates src, ChunkCoordinates dest) { - return getBresehnamArrayCoords(src.posX, src.posY, src.posZ, dest.posX, dest.posY, dest.posZ); - } - - /** - * Get an array of values that represent a line from point A to point B - */ - public static ChunkCoordinates[] getBresehnamArrayCoords(int x1, int y1, int z1, int x2, int y2, int z2) { - int i, dx, dy, dz, l, m, n, x_inc, y_inc, z_inc, err_1, err_2, dx2, dy2, dz2; - - ChunkCoordinates pixel = new ChunkCoordinates(x1, y1, z1); - ChunkCoordinates lineArray[]; - - dx = x2 - x1; - dy = y2 - y1; - dz = z2 - z1; - x_inc = (dx < 0) ? -1 : 1; - l = Math.abs(dx); - y_inc = (dy < 0) ? -1 : 1; - m = Math.abs(dy); - z_inc = (dz < 0) ? -1 : 1; - n = Math.abs(dz); - dx2 = l << 1; - dy2 = m << 1; - dz2 = n << 1; - - if ((l >= m) && (l >= n)) { - err_1 = dy2 - l; - err_2 = dz2 - l; - lineArray = new ChunkCoordinates[l + 1]; - for (i = 0; i < l; i++) { - lineArray[i] = new ChunkCoordinates (pixel); - if (err_1 > 0) { - pixel.posY += y_inc; - err_1 -= dx2; - } - if (err_2 > 0) { - pixel.posZ += z_inc; - err_2 -= dx2; - } - err_1 += dy2; - err_2 += dz2; - pixel.posX += x_inc; - } - } else if ((m >= l) && (m >= n)) { - err_1 = dx2 - m; - err_2 = dz2 - m; - lineArray = new ChunkCoordinates[m + 1]; - for (i = 0; i < m; i++) { - lineArray[i] = new ChunkCoordinates (pixel); - if (err_1 > 0) { - pixel.posX += x_inc; - err_1 -= dy2; - } - if (err_2 > 0) { - pixel.posZ += z_inc; - err_2 -= dy2; - } - err_1 += dx2; - err_2 += dz2; - pixel.posY += y_inc; - } - } else { - err_1 = dy2 - n; - err_2 = dx2 - n; - lineArray = new ChunkCoordinates[n + 1]; - for (i = 0; i < n; i++) { - lineArray[i] = new ChunkCoordinates(pixel); - if (err_1 > 0) { - pixel.posY += y_inc; - err_1 -= dz2; - } - if (err_2 > 0) { - pixel.posX += x_inc; - err_2 -= dz2; - } - err_1 += dy2; - err_2 += dx2; - pixel.posZ += z_inc; - } - } - lineArray[lineArray.length - 1] = new ChunkCoordinates(pixel); - - return lineArray; - } - - /** - * Draw a flat blob (circle) of leaves - */ - public void makeLeafCircle(World world, int sx, int sy, int sz, int rad, Block blockValue, int metaValue) - { - this.makeLeafCircle(world, sx, sy, sz, rad, blockValue, metaValue, false); - } - - /** - * Draw a flat blob (circle) of leaves - */ - public void makeLeafCircle(World world, int sx, int sy, int sz, int rad, Block blockValue, int metaValue, boolean useHack) - { - // trace out a quadrant - for (byte dx = 0; dx <= rad; dx++) - { - for (byte dz = 0; dz <= rad; dz++) - { - int dist = Math.max(dx, dz) + (Math.min(dx, dz) >> 1); - - //hack! I keep getting failing leaves at a certain position. - if (useHack && dx == 3 && dz == 3) { - dist = 6; - } - - // if we're inside the blob, fill it - if (dist <= rad) { - // do four at a time for easiness! - putLeafBlock(world, sx + dx, sy, sz + dz, blockValue, metaValue); - putLeafBlock(world, sx + dx, sy, sz - dz, blockValue, metaValue); - putLeafBlock(world, sx - dx, sy, sz + dz, blockValue, metaValue); - putLeafBlock(world, sx - dx, sy, sz - dz, blockValue, metaValue); - } - } - } - } - - /** - * Draw a flat blob (circle) of leaves. This one makes it offset to surround a 2x2 area instead of a 1 block area - */ - public void makeLeafCircle2(World world, int sx, int sy, int sz, int rad, Block blockValue, int metaValue, boolean useHack) - { - // trace out a quadrant - for (byte dx = 0; dx <= rad; dx++) - { - for (byte dz = 0; dz <= rad; dz++) - { -// int dist = Math.max(dx, dz) + (int)(Math.min(dx, dz) * 0.6F); -// -// //hack! I keep getting failing leaves at a certain position. -// if (useHack && dx == 3 && dz == 3) { -// dist = 6; -// } - - // if we're inside the blob, fill it - if (dx * dx + dz * dz <= rad * rad) { - // do four at a time for easiness! - putLeafBlock(world, sx + 1 + dx, sy, sz + 1 + dz, blockValue, metaValue); - putLeafBlock(world, sx + 1 + dx, sy, sz - dz, blockValue, metaValue); - putLeafBlock(world, sx - dx, sy, sz + 1 + dz, blockValue, metaValue); - putLeafBlock(world, sx - dx, sy, sz - dz, blockValue, metaValue); - } - } - } - } - - /** - * Put a leaf only in spots where leaves can go! - */ - public void putLeafBlock(World world, int x, int y, int z, Block blockValue, int metaValue) { - Block whatsThere = world.getBlock(x, y, z); - Block block = whatsThere; - - if (block == null || block.canBeReplacedByLeaves(world, x, y, z)) - { - this.setBlockAndMetadata(world, x, y, z, blockValue, metaValue); - } - } - - /** - * Gets either cobblestone or mossy cobblestone, randomly. Used for ruins. - * - * @param rand - * @return - */ - protected Block randStone(Random rand, int howMuch) - { - return rand.nextInt(howMuch) >= 1 ? Blocks.cobblestone : Blocks.mossy_cobblestone; - } - - /** - * Checks an area to see if it consists of flat natural ground below and air above - * - */ - protected boolean isAreaSuitable(World world, Random rand, int x, int y, int z, int width, int height, int depth) - { - boolean flag = true; - - - // check if there's anything within the diameter - for (int cx = 0; cx < width; cx++) - { - for (int cz = 0; cz < depth; cz++) - { - // check if the blocks even exist? - if (world.blockExists(x + cx, y, z + cz)) { - // is there grass, dirt or stone below? - Material m = world.getBlock(x + cx, y - 1, z + cz).getMaterial(); - if (m != Material.ground && m != Material.grass && m != Material.rock) - { - flag = false; - } - - for (int cy = 0; cy < height; cy++) - { - // blank space above? - if (!world.isAirBlock(x + cx, y + cy, z + cz)) - { - flag = false; - } - } - } else { - flag = false; - } - } - } - - // Okie dokie - return flag; - - } - - /** - * Draw a giant blob of whatevs. - */ - public void drawBlob(World world, int sx, int sy, int sz, int rad, Block blockValue, int metaValue) { - // then trace out a quadrant - for (byte dx = 0; dx <= rad; dx++) - { - for (byte dy = 0; dy <= rad; dy++) - { - for (byte dz = 0; dz <= rad; dz++) - { - // determine how far we are from the center. - int dist = 0; - if (dx >= dy && dx >= dz) { - dist = dx + (Math.max(dy, dz) >> 1) + (Math.min(dy, dz) >> 2); - } else if (dy >= dx && dy >= dz) - { - dist = dy + (Math.max(dx, dz) >> 1) + (Math.min(dx, dz) >> 2); - } else { - dist = dz + (Math.max(dx, dy) >> 1) + (Math.min(dx, dy) >> 2); - } - - - // if we're inside the blob, fill it - if (dist <= rad) { - // do eight at a time for easiness! - setBlockAndMetadata(world, sx + dx, sy + dy, sz + dz, blockValue, metaValue); - setBlockAndMetadata(world, sx + dx, sy + dy, sz - dz, blockValue, metaValue); - setBlockAndMetadata(world, sx - dx, sy + dy, sz + dz, blockValue, metaValue); - setBlockAndMetadata(world, sx - dx, sy + dy, sz - dz, blockValue, metaValue); - setBlockAndMetadata(world, sx + dx, sy - dy, sz + dz, blockValue, metaValue); - setBlockAndMetadata(world, sx + dx, sy - dy, sz - dz, blockValue, metaValue); - setBlockAndMetadata(world, sx - dx, sy - dy, sz + dz, blockValue, metaValue); - setBlockAndMetadata(world, sx - dx, sy - dy, sz - dz, blockValue, metaValue); - } - } - } - } - } - - /** - * Draw a giant blob of leaves. - */ - public void drawLeafBlob(World world, int sx, int sy, int sz, int rad, Block blockValue, int metaValue) { - // then trace out a quadrant - for (byte dx = 0; dx <= rad; dx++) - { - for (byte dy = 0; dy <= rad; dy++) - { - for (byte dz = 0; dz <= rad; dz++) - { - // determine how far we are from the center. - int dist = 0; - if (dx >= dy && dx >= dz) { - dist = dx + (Math.max(dy, dz) >> 1) + (Math.min(dy, dz) >> 2); - } else if (dy >= dx && dy >= dz) - { - dist = dy + (Math.max(dx, dz) >> 1) + (Math.min(dx, dz) >> 2); - } else { - dist = dz + (Math.max(dx, dy) >> 1) + (Math.min(dx, dy) >> 2); - } - - - // if we're inside the blob, fill it - if (dist <= rad) { - // do eight at a time for easiness! - putLeafBlock(world, sx + dx, sy + dy, sz + dz, blockValue, metaValue); - putLeafBlock(world, sx + dx, sy + dy, sz - dz, blockValue, metaValue); - putLeafBlock(world, sx - dx, sy + dy, sz + dz, blockValue, metaValue); - putLeafBlock(world, sx - dx, sy + dy, sz - dz, blockValue, metaValue); - putLeafBlock(world, sx + dx, sy - dy, sz + dz, blockValue, metaValue); - putLeafBlock(world, sx + dx, sy - dy, sz - dz, blockValue, metaValue); - putLeafBlock(world, sx - dx, sy - dy, sz + dz, blockValue, metaValue); - putLeafBlock(world, sx - dx, sy - dy, sz - dz, blockValue, metaValue); - } - } - } - } - } - - /** - * Does the block have only air blocks adjacent - */ - protected static boolean surroundedByAir(IBlockAccess world, int bx, int by, int bz) { - boolean airAround = true; - if (!world.isAirBlock(bx + 1, by, bz)) { - airAround = false; - } - if (!world.isAirBlock(bx - 1, by, bz)) { - airAround = false; - } - if (!world.isAirBlock(bx, by, bz + 1)) { - airAround = false; - } - if (!world.isAirBlock(bx, by, bz - 1)) { - airAround = false; - } - if (!world.isAirBlock(bx, by + 1, bz)) { - airAround = false; - } - if (!world.isAirBlock(bx, by - 1, bz)) { - airAround = false; - } - - return airAround; - } - - /** - * Does the block have at least 1 air block adjacent - */ - protected static boolean hasAirAround(World world, int bx, int by, int bz) { - boolean airAround = false; - if (world.blockExists(bx + 1, by, bz) && world.getBlock(bx + 1, by, bz) == Blocks.air) { - airAround = true; - } - if (world.blockExists(bx - 1, by, bz) && world.getBlock(bx - 1, by, bz) == Blocks.air) { - airAround = true; - } - if (world.blockExists(bx, by, bz + 1) && world.getBlock(bx, by, bz + 1) == Blocks.air) { - airAround = true; - } - if (world.blockExists(bx, by, bz - 1) && world.getBlock(bx, by, bz - 1) == Blocks.air) { - airAround = true; - } - if (world.getBlock(bx, by + 1, bz) == Blocks.air) { - airAround = true; - } - - return airAround; - } - - protected static boolean isNearSolid(World world, int bx, int by, int bz) { - boolean nearSolid = false; - if (world.blockExists(bx + 1, by, bz) && world.getBlock(bx + 1, by, bz).getMaterial().isSolid()) { - nearSolid = true; - } - if (world.blockExists(bx - 1, by, bz) && world.getBlock(bx - 1, by, bz).getMaterial().isSolid()) { - nearSolid = true; - } - if (world.blockExists(bx, by, bz + 1) && world.getBlock(bx, by, bz + 1).getMaterial().isSolid()) { - nearSolid = true; - } - if (world.blockExists(bx, by, bz - 1) && world.getBlock(bx, by, bz - 1).getMaterial().isSolid()) { - nearSolid = true; - } - - return nearSolid; - } - - - /** - * Temporary override - */ - protected void setBlock(World world, int x, int y, int z, Block block) { - this.func_150515_a(world, x, y, z, block); - } - /** - * Temporary override - */ - protected void setBlockAndMetadata(World world, int x, int y, int z, Block block, int meta) { - this.setBlockAndNotifyAdequately(world, x, y, z, block, meta); - } -} diff --git a/src/main/java/twilightforest/world/TFTeleporter.java b/src/main/java/twilightforest/world/TFTeleporter.java new file mode 100644 index 0000000000..1ad6f9abdb --- /dev/null +++ b/src/main/java/twilightforest/world/TFTeleporter.java @@ -0,0 +1,612 @@ +package twilightforest.world; + +import com.google.common.collect.Maps; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.SectionPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.Tag; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ChunkHolder; +import net.minecraft.server.level.ColumnPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.TicketType; +import net.minecraft.util.Mth; +import net.minecraft.util.RandomSource; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.LevelChunk; +import net.minecraft.world.level.levelgen.structure.StructureStart; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.portal.PortalInfo; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.common.util.ITeleporter; +import net.minecraftforge.registries.ForgeRegistries; +import org.apache.commons.lang3.mutable.MutableInt; +import org.jetbrains.annotations.Nullable; +import twilightforest.TFConfig; +import twilightforest.TwilightForestMod; +import twilightforest.block.TFPortalBlock; +import twilightforest.data.tags.BlockTagGenerator; +import twilightforest.init.TFBlocks; +import twilightforest.item.MagicMapItem; +import twilightforest.util.LandmarkUtil; +import twilightforest.util.LegacyLandmarkPlacements; +import twilightforest.world.registration.TFGenerationSettings; + +import java.util.*; +import java.util.function.Function; +import java.util.function.Predicate; + +public class TFTeleporter implements ITeleporter { + + // destinationCoordinateCache is (src -> dest) [DestWorld, [SrcPos, DestPos]] + private static final Map> destinationCoordinateCache = new HashMap<>(); + + private static boolean locked; + + public TFTeleporter(boolean locked) { + TFTeleporter.locked = locked; + } + + public static CompoundTag saveLinks() { + CompoundTag tag = new CompoundTag(); + ListTag dcc = new ListTag(); + destinationCoordinateCache.forEach((rl, map) -> { + CompoundTag ct = new CompoundTag(); + ListTag links = new ListTag(); + map.forEach((columnPos, portalPos) -> { + CompoundTag link = new CompoundTag(); + CompoundTag column = new CompoundTag(); + column.putInt("x", columnPos.x()); + column.putInt("z", columnPos.z()); + link.put("column", column); + CompoundTag portal = new CompoundTag(); + portal.putLong("time", portalPos.lastUpdateTime); + portal.putLong("pos", portalPos.pos.asLong()); + link.put("portal", portal); + links.add(link); + }); + ct.put("links", links); + ct.putString("name", rl.toString()); + dcc.add(ct); + }); + tag.put("dest", dcc); + return tag; + } + + public static void loadLinks(CompoundTag tag) { + tag.getList("dest", Tag.TAG_COMPOUND).stream().map(CompoundTag.class::cast).forEach(dest -> { + ResourceLocation name = new ResourceLocation(dest.getString("name")); + destinationCoordinateCache.putIfAbsent(name, Maps.newHashMapWithExpectedSize(4096)); + dest.getList("links", Tag.TAG_COMPOUND).stream().map(CompoundTag.class::cast).forEach(link -> { + CompoundTag column = link.getCompound("column"); + CompoundTag portal = link.getCompound("portal"); + destinationCoordinateCache.get(name).put(new ColumnPos(column.getInt("x"), column.getInt("z")), new PortalPosition(BlockPos.of(portal.getLong("pos")), portal.getLong("time"))); + }); + }); + } + + @Nullable + @Override + public PortalInfo getPortalInfo(Entity entity, ServerLevel dest, Function defaultPortalInfo) { + PortalInfo pos; + + // Scale the coords based on the dimension type coordinate_scale + ServerLevel tfDim = dest.getServer().getLevel(TFGenerationSettings.DIMENSION_KEY); + double scale = tfDim == null ? 0.125D : tfDim.dimensionType().coordinateScale(); + scale = dest.dimension().equals(TFGenerationSettings.DIMENSION_KEY) ? 1F / scale : scale; + BlockPos destPos = dest.getWorldBorder().clampToBounds(entity.blockPosition().getX() * scale, entity.blockPosition().getY(), entity.blockPosition().getZ() * scale); + + if ((pos = placeInExistingPortal(dest, entity, destPos)) == null) { + TwilightForestMod.LOGGER.debug("Did not find existing portal, making a new one."); + pos = moveToSafeCoords(dest, entity, destPos); + makePortal(entity, dest, pos.pos); + pos = placeInExistingPortal(dest, entity, BlockPos.containing(pos.pos)); + } + + return pos == null ? ITeleporter.super.getPortalInfo(entity, dest, defaultPortalInfo) : pos; + } + + @Nullable + private static PortalInfo placeInExistingPortal(ServerLevel destDim, Entity entity, BlockPos pos) { + boolean flag = true; + BlockPos blockpos; + ColumnPos columnPos = new ColumnPos(entity.blockPosition().getX(), entity.blockPosition().getZ()); // Must be the position from the src dim + + PortalPosition portalPosition = destinationCoordinateCache.containsKey(destDim.dimension().location()) ? destinationCoordinateCache.get(destDim.dimension().location()).get(columnPos) : null; + if (portalPosition != null) { + blockpos = portalPosition.pos; + portalPosition.lastUpdateTime = destDim.getGameTime(); + flag = false; + // Validate that the Portal still exists + TwilightForestMod.LOGGER.debug("Using cache, validating. {}", blockpos); + if (blockpos == null || !destDim.getBlockState(blockpos).is(TFBlocks.TWILIGHT_PORTAL.get())) { + // Portal was broken, we need to recreate it. + TwilightForestMod.LOGGER.debug("Portal Invalid, recreating."); + blockpos = null; + destinationCoordinateCache.get(destDim.dimension().location()).remove(columnPos); + } + } else { + //BlockPos blockpos3 = new BlockPos(entity); + blockpos = getPortalPosition(destDim, pos); + } + + if (blockpos == null) { + return null; + } else { + if (flag) { + TwilightForestMod.LOGGER.debug("Caching Src Portal Blocks to {}", blockpos); + destinationCoordinateCache.putIfAbsent(destDim.dimension().location(), Maps.newHashMapWithExpectedSize(4096)); + Map portalBlocks = new HashMap<>(); + portalBlocks.put(entity.blockPosition(), true); + TFPortalBlock.recursivelyValidatePortal(entity.getLevel(), entity.blockPosition(), portalBlocks, new MutableInt(0), entity.getLevel().getBlockState(entity.blockPosition())); + BlockPos finalBlockpos = blockpos; + portalBlocks.forEach((blockPos, b) -> { + if (b) { + TwilightForestMod.LOGGER.debug("Caching {}", blockPos); + destinationCoordinateCache.get(destDim.dimension().location()).put(new ColumnPos(blockPos.getX(), blockPos.getZ()), new PortalPosition(finalBlockpos, destDim.getGameTime())); + } + }); + // the last param is just an object for tracking, don't worry about it using columnPos instead of blockpos + destDim.getChunkSource().addRegionTicket(TicketType.PORTAL, new ChunkPos(blockpos), 3, new BlockPos(columnPos.x(), blockpos.getY(), columnPos.z())); + } + + // replace with our own placement logic + BlockPos[] portalBorder = getBoundaryPositions(destDim, blockpos).toArray(new BlockPos[0]); + BlockPos borderPos = portalBorder[0/*random.nextInt(portalBorder.length)*/]; + + double portalX = borderPos.getX() + 0.5; + double portalY = borderPos.getY() + 1.0; + double portalZ = borderPos.getZ() + 0.5; + + return makePortalInfo(entity, portalX, portalY, portalZ); + } + } + + @Nullable + private static BlockPos getPortalPosition(ServerLevel destDim, BlockPos pos) { + int i = 200; // scan radius up to 200, and also un-inline this variable back into below + double d0 = Double.MAX_VALUE; + BlockPos result = null; + + for (int i1 = -i; i1 <= i; ++i1) { + BlockPos blockpos2; + + for (int j1 = -i; j1 <= i; ++j1) { + + // skip positions outside current world border (MC-114796) + if (!destDim.getWorldBorder().isWithinBounds(pos.offset(i1, 0, j1))) { + continue; + } + + ChunkPos chunkPos = new ChunkPos(pos.offset(i1, 0, j1)); + LevelChunk chunk = destDim.getChunkSource().getChunkNow(chunkPos.x, chunkPos.z); + + // skip chunks that aren't generated + if (chunk == null || chunk.getFullStatus() == ChunkHolder.FullChunkStatus.INACCESSIBLE) { + continue; + } + + for (BlockPos blockpos1 = pos.offset(i1, getScanHeight(destDim, pos) - pos.getY(), j1); blockpos1.getY() >= 0; blockpos1 = blockpos2) { + blockpos2 = blockpos1.below(); + + // don't lookup state if inner condition would fail + if (d0 >= 0.0D && blockpos1.distSqr(pos) >= d0) { + continue; + } + + // use our portal block + if (isPortal(chunk.getBlockState(blockpos1))) { + for (blockpos2 = blockpos1.below(); isPortal(chunk.getBlockState(blockpos2)); blockpos2 = blockpos2.below()) { + blockpos1 = blockpos2; + } + + float d1 = (float) blockpos1.distSqr(pos); + if (d0 < 0.0D || d1 < d0) { + d0 = d1; + result = blockpos1; + // restrict search radius to new distance + i = Mth.ceil(Mth.sqrt(d1)); + } + } + } + + // mark unwatched chunks for unload + // if (!this.world.getPlayerChunkMap().contains(chunkPos.x, chunkPos.z)) { + // this.world.getChunkProvider().queueUnload(chunk); + // } + } + } + return result; + } + + private static int getScanHeight(ServerLevel world, BlockPos pos) { + return getScanHeight(world, pos.getX(), pos.getZ()); + } + + private static int getScanHeight(ServerLevel world, int x, int z) { + int worldHeight = world.getMaxBuildHeight() - 1; + int chunkHeight = world.getChunk(x >> 4, z >> 4).getHighestSectionPosition() + 15; + return Math.min(worldHeight, chunkHeight); + } + + private static boolean isPortal(BlockState state) { + return state.getBlock() == TFBlocks.TWILIGHT_PORTAL.get(); + } + + // from the start point, builds a set of all directly adjacent non-portal blocks + private static Set getBoundaryPositions(ServerLevel world, BlockPos start) { + Set result = new HashSet<>(), checked = new HashSet<>(); + checked.add(start); + checkAdjacent(world, start, checked, result); + return result; + } + + private static void checkAdjacent(ServerLevel world, BlockPos pos, Set checked, Set result) { + for (Direction facing : Direction.Plane.HORIZONTAL) { + BlockPos offset = pos.relative(facing); + if (!checked.add(offset)) + continue; + if (isPortalAt(world, offset)) { + checkAdjacent(world, offset, checked, result); + } else { + result.add(offset); + } + } + } + + private static boolean isPortalAt(ServerLevel world, BlockPos pos) { + return isPortal(world.getBlockState(pos)); + } + + private static PortalInfo moveToSafeCoords(ServerLevel world, Entity entity, BlockPos pos) { + // if we're in enforced progression mode, check the biomes for safety + boolean checkProgression = LandmarkUtil.isProgressionEnforced(world); + + if (isSafeAround(world, pos, entity, checkProgression)) { + TwilightForestMod.LOGGER.debug("Portal destination looks safe!"); + return makePortalInfo(entity, Vec3.atCenterOf(pos)); + } + + TwilightForestMod.LOGGER.debug("Portal destination looks unsafe, rerouting!"); + + BlockPos safeCoords = findSafeCoords(world, 200, pos, entity, checkProgression); + if (safeCoords != null) { + TwilightForestMod.LOGGER.debug("Safely rerouted!"); + return makePortalInfo(entity, safeCoords.getX(), entity.getY(), safeCoords.getZ()); + } + + TwilightForestMod.LOGGER.info("Did not find a safe portal spot first try, trying again with longer range."); + safeCoords = findSafeCoords(world, 400, pos, entity, checkProgression); + + if (safeCoords != null) { + TwilightForestMod.LOGGER.info("Safely rerouted to long range portal. Return trip not guaranteed."); + return makePortalInfo(entity, safeCoords.getX(), entity.getY(), safeCoords.getZ()); + } + + TwilightForestMod.LOGGER.info("Did not find a safe portal spot second try, trying to move slightly towards the center between key biomes."); + safeCoords = findSafeCoords(world, 400, moveTowardsCenter(pos, 0.5F), entity, checkProgression); + + if (safeCoords != null) { + TwilightForestMod.LOGGER.info("Safely rerouted to slightly centered portal. Return trip not guaranteed."); + return makePortalInfo(entity, safeCoords.getX(), entity.getY(), safeCoords.getZ()); + } + + TwilightForestMod.LOGGER.info("Did not find a safe portal spot third try, trying to move further towards the center between key biomes."); + safeCoords = findSafeCoords(world, 400, moveTowardsCenter(pos, 0.9F), entity, checkProgression); + + if (safeCoords != null) { + TwilightForestMod.LOGGER.info("Safely rerouted to very centered portal. Return trip not guaranteed."); + return makePortalInfo(entity, safeCoords.getX(), entity.getY(), safeCoords.getZ()); + } + + TwilightForestMod.LOGGER.warn("Still did not find a safe portal spot."); + + return makePortalInfo(entity, Vec3.atCenterOf(pos)); + } + + private static BlockPos moveTowardsCenter(BlockPos pos, float lerp) { + ColumnPos centerPos = MagicMapItem.getMagicMapCenter(pos.getX(), pos.getZ()); + float vx = centerPos.x() - pos.getX(); + float vz = centerPos.z() - pos.getZ(); + float nx = pos.getX() + vx * lerp; + float nz = pos.getZ() + vz * lerp; + return BlockPos.containing(nx, pos.getY(), nz); + } + + public static boolean isSafeAround(Level world, BlockPos pos, Entity entity, boolean checkProgression) { + + if (!isSafe(world, pos, entity, checkProgression)) { + return false; + } + + for (Direction facing : Direction.Plane.HORIZONTAL) { + if (!isSafe(world, pos.relative(facing, 16), entity, checkProgression)) { + return false; + } + } + + return true; + } + + private static boolean isSafe(Level world, BlockPos pos, Entity entity, boolean checkProgression) { + return !world.dimension().equals(TFGenerationSettings.DIMENSION_KEY) || (checkPos(world, pos) && (!checkProgression || checkBiome(world, pos, entity)) && checkStructure(world, pos)); + } + + private static boolean checkPos(Level world, BlockPos pos) { + return world.getWorldBorder().isWithinBounds(pos); + } + + private static boolean checkStructure(Level world, BlockPos pos) { + boolean outsideLandmarkRange = !LegacyLandmarkPlacements.blockNearLandmarkCenter(pos.getX(), pos.getZ(), 5); + if (!outsideLandmarkRange) return false; + + Optional possibleNearLandmark = LandmarkUtil.locateNearestLandmarkStart(world, SectionPos.blockToSectionCoord(pos.getX()), SectionPos.blockToSectionCoord(pos.getZ())); + return possibleNearLandmark.isEmpty() || possibleNearLandmark.get().getBoundingBox().isInside(pos); + } + + private static boolean checkBiome(Level world, BlockPos pos, Entity entity) { + return TFGenerationSettings.isBiomeSafeFor(world.getBiome(pos).value(), entity); + } + + @Nullable + private static BlockPos findSafeCoords(ServerLevel world, int range, BlockPos pos, Entity entity, boolean checkProgression) { + int attempts = range / 8; + for (int x = 0; x < attempts; x++) { + for (int z = 0; z < attempts; z++) { + BlockPos dPos = new BlockPos(pos.getX() + (x * attempts) - (range / 2), 100, pos.getZ() + (z * attempts) - (range / 2)); + + if (isSafeAround(world, dPos, entity, checkProgression)) { + return dPos; + } + } + } + return null; + } + + private void makePortal(Entity entity, ServerLevel world, Vec3 pos) { + ServerLevel src = entity.getLevel() instanceof ServerLevel serverLevel ? serverLevel : null; + + // ensure area is populated first + loadSurroundingArea(world, pos); + + BlockPos spot = findPortalCoords(world, pos, blockPos -> isPortalAt(world, blockPos)); + String name = entity.getName().getString(); + + if (spot != null) { + TwilightForestMod.LOGGER.debug("Found existing portal for {} at {}", name, spot); + cacheNewPortalCoords(src, spot, entity.blockPosition()); + return; + } + + spot = findPortalCoords(world, pos, blockpos -> isIdealForPortal(world, blockpos)); + + if (spot != null) { + TwilightForestMod.LOGGER.debug("Found ideal portal spot for {} at {}", name, spot); + cacheNewPortalCoords(src, makePortalAt(world, spot), entity.blockPosition()); + return; + } + + TwilightForestMod.LOGGER.debug("Did not find ideal portal spot, shooting for okay one for {}", name); + spot = findPortalCoords(world, pos, blockPos -> isOkayForPortal(world, blockPos)); + + if (spot != null) { + TwilightForestMod.LOGGER.debug("Found okay portal spot for {} at {}", name, spot); + cacheNewPortalCoords(src, makePortalAt(world, spot), entity.blockPosition()); + return; + } + + // well I don't think we can actually just return and fail here + TwilightForestMod.LOGGER.debug("Did not even find an okay portal spot, just making a random one for {}", name); + + // adjust the portal height based on what world we're traveling to + double yFactor = getYFactor(world); + // modified copy of base Teleporter method: + cacheNewPortalCoords(src, makePortalAt(world, BlockPos.containing(entity.getX(), (entity.getY() * yFactor) - 1.0, entity.getZ())), entity.blockPosition()); + } + + private static void loadSurroundingArea(ServerLevel world, Vec3 pos) { + + int x = Mth.floor(pos.x) >> 4; + int z = Mth.floor(pos.y) >> 4; + + for (int dx = -2; dx <= 2; dx++) { + for (int dz = -2; dz <= 2; dz++) { + world.getChunk(x + dx, z + dz); + } + } + } + + @Nullable + private static BlockPos findPortalCoords(ServerLevel world, Vec3 loc, Predicate predicate) { + // adjust the height based on what world we're traveling to + double yFactor = getYFactor(world); + // modified copy of base Teleporter method: + int entityX = Mth.floor(loc.x); + int entityZ = Mth.floor(loc.z); + + BlockPos.MutableBlockPos pos = new BlockPos.MutableBlockPos(); + + double spotWeight = -1D; + BlockPos spot = null; + + int range = 16; + for (int rx = entityX - range; rx <= entityX + range; rx++) { + double xWeight = (rx + 0.5D) - loc.x; + for (int rz = entityZ - range; rz <= entityZ + range; rz++) { + double zWeight = (rz + 0.5D) - loc.z; + + for (int ry = getScanHeight(world, rx, rz); ry >= world.getMinBuildHeight(); ry--) { + + if (!world.isEmptyBlock(pos.set(rx, ry, rz))) { + continue; + } + + while (ry > world.getMinBuildHeight() && world.isEmptyBlock(pos.set(rx, ry - 1, rz))) { + ry--; + } + + double yWeight = (ry + 0.5D) - loc.y * yFactor; + double rPosWeight = xWeight * xWeight + yWeight * yWeight + zWeight * zWeight; + + if (spotWeight < 0.0D || rPosWeight < spotWeight) { + // check from the "in ground" pos + if (predicate.test(pos)) { + spotWeight = rPosWeight; + spot = pos.immutable(); + } + } + } + } + } + + return spot; + } + + private static double getYFactor(ServerLevel world) { + return world.dimension().location().equals(Level.OVERWORLD.location()) ? 2.0 : 0.5; + } + + private static void cacheNewPortalCoords(@Nullable ServerLevel srcDim, BlockPos pos, BlockPos srcPos) { + // src/dest is backwards logic because we're caching the opposite direction + if (srcDim == null) + return; + BlockPos exitPos = getPortalPosition(srcDim, srcPos); + if (exitPos == null) + return; + TwilightForestMod.LOGGER.debug("Caching Dest Portal Blocks to {}", exitPos); + destinationCoordinateCache.putIfAbsent(srcDim.dimension().location(), Maps.newHashMapWithExpectedSize(4096)); + destinationCoordinateCache.get(srcDim.dimension().location()).put(new ColumnPos(pos.getX(), pos.getZ()), new PortalPosition(exitPos, srcDim.getGameTime())); + destinationCoordinateCache.get(srcDim.dimension().location()).put(new ColumnPos(pos.south().getX(), pos.south().getZ()), new PortalPosition(exitPos, srcDim.getGameTime())); + destinationCoordinateCache.get(srcDim.dimension().location()).put(new ColumnPos(pos.east().getX(), pos.east().getZ()), new PortalPosition(exitPos, srcDim.getGameTime())); + destinationCoordinateCache.get(srcDim.dimension().location()).put(new ColumnPos(pos.south().east().getX(), pos.south().east().getZ()), new PortalPosition(exitPos, srcDim.getGameTime())); + } + + private static boolean isIdealForPortal(ServerLevel world, BlockPos pos) { + for (int potentialZ = 0; potentialZ < 4; potentialZ++) { + for (int potentialX = 0; potentialX < 4; potentialX++) { + for (int potentialY = 0; potentialY < 4; potentialY++) { + BlockPos tPos = pos.offset(potentialX - 1, potentialY, potentialZ - 1); + Material material = world.getBlockState(tPos).getMaterial(); + if (potentialY == 0 && material != Material.GRASS || potentialY >= 1 && !material.isReplaceable()) { + return false; + } + } + } + } + return true; + } + + protected BlockPos makePortalAt(Level world, BlockPos pos) { + // grass all around it + BlockState grass = Blocks.GRASS_BLOCK.defaultBlockState(); + + world.setBlockAndUpdate(pos.west().north(), grass); + world.setBlockAndUpdate(pos.north(), grass); + world.setBlockAndUpdate(pos.east().north(), grass); + world.setBlockAndUpdate(pos.east(2).north(), grass); + + world.setBlockAndUpdate(pos.west(), grass); + world.setBlockAndUpdate(pos.east(2), grass); + + world.setBlockAndUpdate(pos.west().south(), grass); + world.setBlockAndUpdate(pos.east(2).south(), grass); + + world.setBlockAndUpdate(pos.west().south(2), grass); + world.setBlockAndUpdate(pos.south(2), grass); + world.setBlockAndUpdate(pos.east().south(2), grass); + world.setBlockAndUpdate(pos.east(2).south(2), grass); + + // dirt under it + BlockState dirt = Blocks.DIRT.defaultBlockState(); + + world.setBlockAndUpdate(pos.below(), dirt); + world.setBlockAndUpdate(pos.east().below(), dirt); + world.setBlockAndUpdate(pos.south().below(), dirt); + world.setBlockAndUpdate(pos.east().south().below(), dirt); + + // portal in it + BlockState portal = TFBlocks.TWILIGHT_PORTAL.get().defaultBlockState().setValue(TFPortalBlock.DISALLOW_RETURN, (locked || !TFConfig.COMMON_CONFIG.shouldReturnPortalBeUsable.get())); + + world.setBlock(pos, portal, 2); + world.setBlock(pos.east(), portal, 2); + world.setBlock(pos.south(), portal, 2); + world.setBlock(pos.east().south(), portal, 2); + + // meh, let's just make a bunch of air over it for 4 squares + for (int dx = -1; dx <= 2; dx++) { + for (int dz = -1; dz <= 2; dz++) { + for (int dy = 1; dy <= 5; dy++) { + world.removeBlock(pos.offset(dx, dy, dz), false); + } + } + } + + // finally, "nature decorations"! + world.setBlock(pos.west().north().above(), randNatureBlock(world.random), 2); + world.setBlock(pos.north().above(), randNatureBlock(world.random), 2); + world.setBlock(pos.east().north().above(), randNatureBlock(world.random), 2); + world.setBlock(pos.east(2).north().above(), randNatureBlock(world.random), 2); + + world.setBlock(pos.west().above(), randNatureBlock(world.random), 2); + world.setBlock(pos.east(2).above(), randNatureBlock(world.random), 2); + + world.setBlock(pos.west().south().above(), randNatureBlock(world.random), 2); + world.setBlock(pos.east(2).south().above(), randNatureBlock(world.random), 2); + + world.setBlock(pos.west().south(2).above(), randNatureBlock(world.random), 2); + world.setBlock(pos.south(2).above(), randNatureBlock(world.random), 2); + world.setBlock(pos.east().south(2).above(), randNatureBlock(world.random), 2); + world.setBlock(pos.east(2).south(2).above(), randNatureBlock(world.random), 2); + + return pos; + } + + private static BlockState randNatureBlock(RandomSource random) { + return ForgeRegistries.BLOCKS.tags().getTag(BlockTagGenerator.GENERATED_PORTAL_DECO).getRandomElement(random).get().defaultBlockState(); + } + + private static boolean isOkayForPortal(ServerLevel world, BlockPos pos) { + for (int potentialZ = 0; potentialZ < 4; potentialZ++) { + for (int potentialX = 0; potentialX < 4; potentialX++) { + for (int potentialY = 0; potentialY < 4; potentialY++) { + BlockPos tPos = pos.offset(potentialX - 1, potentialY, potentialZ - 1); + Material material = world.getBlockState(tPos).getMaterial(); + if (potentialY == 0 && !material.isSolid() && !material.isLiquid() || potentialY >= 1 && !material.isReplaceable()) { + return false; + } + } + } + } + return true; + } + + private static PortalInfo makePortalInfo(Entity entity, double x, double y, double z) { + return makePortalInfo(entity, new Vec3(x, y, z)); + } + + private static PortalInfo makePortalInfo(Entity entity, Vec3 pos) { + return new PortalInfo(pos, Vec3.ZERO, entity.getYRot(), entity.getXRot()); + } + + @Override + public Entity placeEntity(Entity entity, ServerLevel currentWorld, ServerLevel destWorld, float yaw, Function repositionEntity) { + entity.fallDistance = 0; + return repositionEntity.apply(false); + } + + static class PortalPosition { + public final BlockPos pos; + long lastUpdateTime; + + PortalPosition(BlockPos pos, long time) { + this.pos = pos; + this.lastUpdateTime = time; + } + } +} diff --git a/src/main/java/twilightforest/world/TFTreeGenerator.java b/src/main/java/twilightforest/world/TFTreeGenerator.java deleted file mode 100644 index 61fbf7b189..0000000000 --- a/src/main/java/twilightforest/world/TFTreeGenerator.java +++ /dev/null @@ -1,256 +0,0 @@ -package twilightforest.world; - -import net.minecraft.block.Block; -import net.minecraft.init.Blocks; -import net.minecraft.util.ChunkCoordinates; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; -import net.minecraft.world.gen.feature.WorldGenAbstractTree; -import twilightforest.block.BlockTFRoots; -import twilightforest.block.TFBlocks; - -public abstract class TFTreeGenerator extends WorldGenAbstractTree { - - protected Block treeBlock = TFBlocks.log; - protected int treeMeta = 3; - protected int branchMeta = 15; - protected Block leafBlock = TFBlocks.hedge; - protected int leafMeta = 1; - protected Block rootBlock = TFBlocks.root; - protected int rootMeta = BlockTFRoots.ROOT_META; - - - public TFTreeGenerator() { - this(false); - } - - public TFTreeGenerator(boolean par1) { - super(par1); - } - - /** - * Build a root, but don't let it stick out too far into thin air because that's weird - */ - protected void buildRoot(World world, int x, int y, int z, double offset, int b) { - ChunkCoordinates dest = translateCoords(x, y - b - 2, z, 5, 0.3 * b + offset, 0.8); - - // go through block by block and stop drawing when we head too far into open air - ChunkCoordinates[] lineArray = getBresehnamArrayCoords(x, y - b - 2, z, dest.posX, dest.posY, dest.posZ); - for (ChunkCoordinates coord : lineArray) - { - this.placeRootBlock(world, coord.posX, coord.posY, coord.posZ, rootBlock, rootMeta); - } - } - - /** - * Function used to actually place root blocks if they're not going to break anything important - */ - protected void placeRootBlock(World world, int x, int y, int z, Block rootBlock2, int meta) { - if (canRootGrowIn(world, x, y, z)) - { - this.setBlockAndMetadata(world, x, y, z, rootBlock2, meta); - } - } - - public static boolean canRootGrowIn(World world, int x, int y, int z) { - Block blockID = world.getBlock(x, y, z); - - if (blockID == Blocks.air) { - // roots can grow through air if they are near a solid block - return isNearSolid(world, x, y, z); - } - else - { - return blockID != Blocks.bedrock && blockID != Blocks.obsidian && blockID != TFBlocks.shield; - } - } - - - /** - * Moves distance along the vector. - * - * This goofy function takes a float between 0 and 1 for the angle, where 0 is 0 degrees, .5 is 180 degrees and 1 and 360 degrees. - * For the tilt, it takes a float between 0 and 1 where 0 is straight up, 0.5 is straight out and 1 is straight down. - */ - public static int[] translate(int sx, int sy, int sz, double distance, double angle, double tilt) { - return TFGenerator.translate(sx, sy, sz, distance, angle, tilt); - } - - protected static ChunkCoordinates translateCoords(int sx, int sy, int sz, double length, double angle, double tilt) { - return TFGenerator.translateCoords(sx, sy, sz, length, angle, tilt); - } - - /** - * Get an array of values that represent a line from point A to point B - */ - public static ChunkCoordinates[] getBresehnamArrayCoords(ChunkCoordinates src, ChunkCoordinates dest) { - return TFGenerator.getBresehnamArrayCoords(src.posX, src.posY, src.posZ, dest.posX, dest.posY, dest.posZ); - } - - /** - * Get an array of values that represent a line from point A to point B - */ - public static ChunkCoordinates[] getBresehnamArrayCoords(int x1, int y1, int z1, int x2, int y2, int z2) { - return TFGenerator.getBresehnamArrayCoords(x1, y1, z1, x2, y2, z2); - } - - - protected static boolean isNearSolid(World world, int bx, int by, int bz) { - return TFGenerator.isNearSolid(world, bx, by, bz); - } - - protected static boolean hasAirAround(World world, int bx, int by, int bz) { - return TFGenerator.hasAirAround(world, bx, by, bz); - } - - /** - * Temporary override - */ - protected void setBlock(World world, int x, int y, int z, Block block) { - this.func_150515_a(world, x, y, z, block); - } - /** - * Temporary override - */ - protected void setBlockAndMetadata(World world, int x, int y, int z, Block block, int meta) { - this.setBlockAndNotifyAdequately(world, x, y, z, block, meta); - } - - - /** - * Draw a flat blob (circle) of leaves - */ - public void makeLeafCircle(World world, int sx, int sy, int sz, int rad, Block blockValue, int metaValue) - { - this.makeLeafCircle(world, sx, sy, sz, rad, blockValue, metaValue, false); - } - - - /* - * Fully duplicated code from TFGenerator below. Where is my multiple inheritance? - */ - - - /** - * Draws a line from {x1, y1, z1} to {x2, y2, z2} - */ - protected void drawBresehnam(World world, int x1, int y1, int z1, int x2, int y2, int z2, Block blockValue, int metaValue) - { - ChunkCoordinates[] lineArray = getBresehnamArrayCoords(x1, y1, z1, x2, y2, z2); - for (ChunkCoordinates pixel : lineArray) - { - setBlockAndMetadata(world, pixel.posX, pixel.posY, pixel.posZ, blockValue, metaValue); - } - } - - /** - * Draw a flat blob (circle) of leaves - */ - public void makeLeafCircle(World world, int sx, int sy, int sz, int rad, Block blockValue, int metaValue, boolean useHack) - { - // trace out a quadrant - for (byte dx = 0; dx <= rad; dx++) - { - for (byte dz = 0; dz <= rad; dz++) - { - int dist = Math.max(dx, dz) + (Math.min(dx, dz) >> 1); - - //hack! I keep getting failing leaves at a certain position. - if (useHack && dx == 3 && dz == 3) { - dist = 6; - } - - // if we're inside the blob, fill it - if (dist <= rad) { - // do four at a time for easiness! - putLeafBlock(world, sx + dx, sy, sz + dz, blockValue, metaValue); - putLeafBlock(world, sx + dx, sy, sz - dz, blockValue, metaValue); - putLeafBlock(world, sx - dx, sy, sz + dz, blockValue, metaValue); - putLeafBlock(world, sx - dx, sy, sz - dz, blockValue, metaValue); - } - } - } - } - - /** - * Draw a flat blob (circle) of leaves. This one makes it offset to surround a 2x2 area instead of a 1 block area - */ - public void makeLeafCircle2(World world, int sx, int sy, int sz, int rad, Block blockValue, int metaValue, boolean useHack) - { - // trace out a quadrant - for (byte dx = 0; dx <= rad; dx++) - { - for (byte dz = 0; dz <= rad; dz++) - { -// int dist = Math.max(dx, dz) + (int)(Math.min(dx, dz) * 0.6F); -// -// //hack! I keep getting failing leaves at a certain position. -// if (useHack && dx == 3 && dz == 3) { -// dist = 6; -// } - - // if we're inside the blob, fill it - if (dx * dx + dz * dz <= rad * rad) { - // do four at a time for easiness! - putLeafBlock(world, sx + 1 + dx, sy, sz + 1 + dz, blockValue, metaValue); - putLeafBlock(world, sx + 1 + dx, sy, sz - dz, blockValue, metaValue); - putLeafBlock(world, sx - dx, sy, sz + 1 + dz, blockValue, metaValue); - putLeafBlock(world, sx - dx, sy, sz - dz, blockValue, metaValue); - } - } - } - } - - /** - * Draw a giant blob of leaves. - */ - public void drawLeafBlob(World world, int sx, int sy, int sz, int rad, Block blockValue, int metaValue) { - // then trace out a quadrant - for (byte dx = 0; dx <= rad; dx++) - { - for (byte dy = 0; dy <= rad; dy++) - { - for (byte dz = 0; dz <= rad; dz++) - { - // determine how far we are from the center. - int dist = 0; - if (dx >= dy && dx >= dz) { - dist = dx + (Math.max(dy, dz) >> 1) + (Math.min(dy, dz) >> 2); - } else if (dy >= dx && dy >= dz) - { - dist = dy + (Math.max(dx, dz) >> 1) + (Math.min(dx, dz) >> 2); - } else { - dist = dz + (Math.max(dx, dy) >> 1) + (Math.min(dx, dy) >> 2); - } - - - // if we're inside the blob, fill it - if (dist <= rad) { - // do eight at a time for easiness! - putLeafBlock(world, sx + dx, sy + dy, sz + dz, blockValue, metaValue); - putLeafBlock(world, sx + dx, sy + dy, sz - dz, blockValue, metaValue); - putLeafBlock(world, sx - dx, sy + dy, sz + dz, blockValue, metaValue); - putLeafBlock(world, sx - dx, sy + dy, sz - dz, blockValue, metaValue); - putLeafBlock(world, sx + dx, sy - dy, sz + dz, blockValue, metaValue); - putLeafBlock(world, sx + dx, sy - dy, sz - dz, blockValue, metaValue); - putLeafBlock(world, sx - dx, sy - dy, sz + dz, blockValue, metaValue); - putLeafBlock(world, sx - dx, sy - dy, sz - dz, blockValue, metaValue); - } - } - } - } - } - - /** - * Put a leaf only in spots where leaves can go! - */ - public void putLeafBlock(World world, int x, int y, int z, Block blockValue, int metaValue) { - Block whatsThere = world.getBlock(x, y, z); - Block block = whatsThere; - - if (block == null || block.canBeReplacedByLeaves(world, x, y, z)) - { - this.setBlockAndMetadata(world, x, y, z, blockValue, metaValue); - } - } -} \ No newline at end of file diff --git a/src/main/java/twilightforest/world/TFWorld.java b/src/main/java/twilightforest/world/TFWorld.java deleted file mode 100644 index 6d6b4fc6c4..0000000000 --- a/src/main/java/twilightforest/world/TFWorld.java +++ /dev/null @@ -1,16 +0,0 @@ -package twilightforest.world; - - - - -/** - * Currently this class just stores variables about sea level and such - * - * @author Ben - * - */ -public class TFWorld { - public static int SEALEVEL = 31; - public static int CHUNKHEIGHT = 256; // more like world generation height - public static int MAXHEIGHT = 256; // actual max height -} diff --git a/src/main/java/twilightforest/world/TFWorldChunkManager.java b/src/main/java/twilightforest/world/TFWorldChunkManager.java deleted file mode 100644 index 259a9423fa..0000000000 --- a/src/main/java/twilightforest/world/TFWorldChunkManager.java +++ /dev/null @@ -1,355 +0,0 @@ -package twilightforest.world; - -import java.util.ArrayList; -import java.util.List; -import java.util.Random; - -import net.minecraft.util.ChunkCoordinates; -import net.minecraft.world.ChunkPosition; -import net.minecraft.world.World; -import net.minecraft.world.WorldType; -import net.minecraft.world.biome.BiomeCache; -import net.minecraft.world.biome.BiomeGenBase; -import net.minecraft.world.biome.WorldChunkManager; -import net.minecraft.world.gen.layer.GenLayer; -import net.minecraft.world.gen.layer.IntCache; -import twilightforest.TFFeature; -import twilightforest.TwilightForestMod; -import twilightforest.biomes.TFBiomeBase; -import twilightforest.world.layer.GenLayerTF; - - -public class TFWorldChunkManager extends WorldChunkManager -{ - private GenLayer unzoomedBiomes; - - /** A GenLayer containing the indices into BiomeGenBase.biomeList[] */ - private GenLayer zoomedBiomes; - - /** The BiomeCache object for this world. */ - private BiomeCache myBiomeCache; - - /** A list of biomes that the player can spawn in. */ - private List myBiomesToSpawnIn; - - protected TFWorldChunkManager() - { - myBiomeCache = new BiomeCache(this); - myBiomesToSpawnIn = new ArrayList(); - myBiomesToSpawnIn.add(TFBiomeBase.twilightForest); - myBiomesToSpawnIn.add(TFBiomeBase.twilightForest2); - myBiomesToSpawnIn.add(TFBiomeBase.clearing); - myBiomesToSpawnIn.add(TFBiomeBase.tfSwamp); - myBiomesToSpawnIn.add(TFBiomeBase.mushrooms); - } - - public TFWorldChunkManager(long par1, WorldType par3WorldType) - { - this(); - GenLayer agenlayer[]; - // new world gen! - if (TwilightForestMod.oldMapGen) - { - agenlayer = GenLayerTF.makeTheWorldOldMapGen(par1); - } - else - { - agenlayer = GenLayerTF.makeTheWorld(par1); - } - unzoomedBiomes = agenlayer[0]; - zoomedBiomes = agenlayer[1]; - } - - public TFWorldChunkManager(World par1World) - { - this(par1World.getSeed(), par1World.getWorldInfo().getTerrainType()); - } - - /** - * Gets the list of valid biomes for the player to spawn in. - */ - @SuppressWarnings("rawtypes") - public List getBiomesToSpawnIn() - { - return myBiomesToSpawnIn; - } - - /** - * Returns the BiomeGenBase related to the x, z position on the world. - */ - public BiomeGenBase getBiomeGenAt(int par1, int par2) - { - BiomeGenBase biome = myBiomeCache.getBiomeGenAt(par1, par2); - if (biome == null) - { - //FMLLog.warning("[TwilightForest] Suppressing bad biome data in getBiomeGenAt, %s at %d, %d", biome, par1, par2); - - //throw new IllegalArgumentException(); - return TFBiomeBase.twilightForest; - } - else - { - return biome; - } - } - - /** - * Returns a list of rainfall values for the specified blocks. Args: listToReuse, x, z, width, length. - */ - public float[] getRainfall(float par1ArrayOfFloat[], int par2, int par3, int par4, int par5) - { - IntCache.resetIntCache(); - - if (par1ArrayOfFloat == null || par1ArrayOfFloat.length < par4 * par5) - { - par1ArrayOfFloat = new float[par4 * par5]; - } - - int ai[] = zoomedBiomes.getInts(par2, par3, par4, par5); - - for (int i = 0; i < par4 * par5; i++) - { - // this keeps NPEing, I wonder why - if (ai[i] >= 0 && BiomeGenBase.getBiome(ai[i]) != null) { - float f = (float)BiomeGenBase.getBiome(ai[i]).getIntRainfall() / 65536F; - - if (f > 1.0F) - { - f = 1.0F; - } - - par1ArrayOfFloat[i] = f; - } - else - { - // nothing - } - } - - return par1ArrayOfFloat; - } - - /** - * Return an adjusted version of a given temperature based on the y height - */ - public float getTemperatureAtHeight(float par1, int par2) - { - return par1; - } - - /** - * Returns an array of biomes for the location input. - */ - public BiomeGenBase[] getBiomesForGeneration(BiomeGenBase par1ArrayOfBiomeGenBase[], int x, int z, int length, int width) - { - IntCache.resetIntCache(); - - if (par1ArrayOfBiomeGenBase == null || par1ArrayOfBiomeGenBase.length < length * width) - { - par1ArrayOfBiomeGenBase = new BiomeGenBase[length * width]; - } - - int arrayOfInts[] = unzoomedBiomes.getInts(x, z, length, width); - - for (int i = 0; i < length * width; i++) - { - // biome validity check - if (arrayOfInts[i] >= 0) - { - par1ArrayOfBiomeGenBase[i] = BiomeGenBase.getBiome(arrayOfInts[i]); - } - else - { - //System.err.println("Got bad biome data : " + ai[i]); - par1ArrayOfBiomeGenBase[i] = TFBiomeBase.twilightForest; - } - } - - return par1ArrayOfBiomeGenBase; - } - - /** - * Returns biomes to use for the blocks and loads the other data like temperature and humidity onto the - * WorldChunkManager Args: oldBiomeList, x, z, width, depth - */ - public BiomeGenBase[] loadBlockGeneratorData(BiomeGenBase par1ArrayOfBiomeGenBase[], int par2, int par3, int par4, int par5) - { - return getBiomeGenAt(par1ArrayOfBiomeGenBase, par2, par3, par4, par5, true); - } - - /** - * Return a list of biomes for the specified blocks. Args: listToReuse, x, y, width, length, cacheFlag (if false, - * don't check biomeCache to avoid infinite loop in BiomeCacheBlock) - */ - public BiomeGenBase[] getBiomeGenAt(BiomeGenBase par1ArrayOfBiomeGenBase[], int x, int y, int width, int length, boolean cacheFlag) - { - IntCache.resetIntCache(); - - if (par1ArrayOfBiomeGenBase == null || par1ArrayOfBiomeGenBase.length < width * length) - { - par1ArrayOfBiomeGenBase = new BiomeGenBase[width * length]; - } - - if (cacheFlag && width == 16 && length == 16 && (x & 0xf) == 0 && (y & 0xf) == 0) - { - BiomeGenBase abiomegenbase[] = myBiomeCache.getCachedBiomes(x, y); - System.arraycopy(abiomegenbase, 0, par1ArrayOfBiomeGenBase, 0, width * length); - return par1ArrayOfBiomeGenBase; - } - - int ai[] = zoomedBiomes.getInts(x, y, width, length); - - for (int i = 0; i < width * length; i++) - { - // biome validity check - if (ai[i] >= 0) - { - par1ArrayOfBiomeGenBase[i] = BiomeGenBase.getBiome(ai[i]); - } - else - { - //System.err.println("Got bad biome data : " + ai[i]); - par1ArrayOfBiomeGenBase[i] = TFBiomeBase.twilightForest; - } - } - - return par1ArrayOfBiomeGenBase; - } - - /** - * checks given Chunk's Biomes against List of allowed ones - */ - @SuppressWarnings("rawtypes") - public boolean areBiomesViable(int par1, int par2, int par3, List par4List) - { - int i = par1 - par3 >> 2; - int j = par2 - par3 >> 2; - int k = par1 + par3 >> 2; - int l = par2 + par3 >> 2; - int i1 = (k - i) + 1; - int j1 = (l - j) + 1; - int ai[] = unzoomedBiomes.getInts(i, j, i1, j1); - - for (int k1 = 0; k1 < i1 * j1; k1++) - { - BiomeGenBase biomegenbase = BiomeGenBase.getBiome(ai[k1]); - - if (!par4List.contains(biomegenbase)) - { - return false; - } - } - - return true; - } - - /** - * Finds a valid position within a range, that is once of the listed biomes. - */ - @SuppressWarnings("rawtypes") - public ChunkPosition findBiomePosition(int par1, int par2, int par3, List par4List, Random par5Random) - { - int i = par1 - par3 >> 2; - int j = par2 - par3 >> 2; - int k = par1 + par3 >> 2; - int l = par2 + par3 >> 2; - int i1 = (k - i) + 1; - int j1 = (l - j) + 1; - int ai[] = unzoomedBiomes.getInts(i, j, i1, j1); - ChunkPosition chunkposition = null; - int k1 = 0; - - for (int l1 = 0; l1 < ai.length; l1++) - { - int i2 = i + l1 % i1 << 2; - int j2 = j + l1 / i1 << 2; - BiomeGenBase biomegenbase = BiomeGenBase.getBiome(ai[l1]); - - if (par4List.contains(biomegenbase) && (chunkposition == null || par5Random.nextInt(k1 + 1) == 0)) - { - chunkposition = new ChunkPosition(i2, 0, j2); - k1++; - } - } - - return chunkposition; - } - - /** - * Calls the WorldChunkManager's biomeCache.cleanupCache() - */ - public void cleanupCache() - { - myBiomeCache.cleanupCache(); - } - - /** - * Returns feature ID at the specified location - */ - public int getFeatureID(int mapX, int mapZ, World world) - { - return getFeatureAt(mapX, mapZ, world).featureID; - } - - /** - * Returns feature at the specified location - */ - public TFFeature getFeatureAt(int mapX, int mapZ, World world) - { - return TFFeature.generateFeatureFor1Point7(mapX >> 4, mapZ >> 4, world); - } - - /** - * Checks if the coordinates are in a feature chunk. - * @param world - */ - public boolean isInFeatureChunk(World world, int mapX, int mapZ) { - // legacy support - if (TwilightForestMod.oldMapGen) - { - return isInFeatureChunkOld(world, mapX, mapZ); - } - - int chunkX = mapX >> 4; - int chunkZ = mapZ >> 4; - ChunkCoordinates cc = TFFeature.getNearestCenterXYZ(chunkX, chunkZ, world); - - return chunkX == (cc.posX >> 4) && chunkZ == (cc.posZ >> 4); - -// logic moved to TFFeature.getNearestCenterXYZ : - -// int chunkX = (mapX + 128) >> 4; -// int chunkZ = (mapZ + 128) >> 4; -// -// // generate random number for the whole biome area -// int regionX = chunkX >> 4; -// int regionZ = chunkZ >> 4; -// -// long seed = (long)(regionX * 3129871) ^ (long)regionZ * 116129781L; -// seed = seed * seed * 42317861L + seed * 7L; -// -// int num0 = (int) (seed >> 12 & 3L); -// int num1 = (int) (seed >> 15 & 3L); -// int num2 = (int) (seed >> 18 & 3L); -// int num3 = (int) (seed >> 21 & 3L); -// -// // slightly randomize center of biome (+/- 3) -// int centerX = 8 + num0 - num1; -// int centerZ = 8 + num2 - num3; -// -// return Math.abs(chunkX % 16) == centerX && Math.abs(chunkZ % 16) == centerZ; - - } - - /** - * Checks if the coordinates are in a feature chunk. - * @param world - */ - public boolean isInFeatureChunkOld(World world, int mapX, int mapZ) { - int chunkX = mapX >> 4; - int chunkZ = mapZ >> 4; - - return chunkX % 16 == 0 && chunkZ % 16 == 0; - } - -} diff --git a/src/main/java/twilightforest/world/WorldProviderTwilightForest.java b/src/main/java/twilightforest/world/WorldProviderTwilightForest.java deleted file mode 100644 index 90f9cdcbe6..0000000000 --- a/src/main/java/twilightforest/world/WorldProviderTwilightForest.java +++ /dev/null @@ -1,274 +0,0 @@ -/** - * - */ -package twilightforest.world; - -import net.minecraft.entity.Entity; -import net.minecraft.util.MathHelper; -import net.minecraft.util.Vec3; -import net.minecraft.world.WorldProviderSurface; -import net.minecraft.world.biome.BiomeGenBase; -import net.minecraft.world.chunk.IChunkProvider; -import net.minecraftforge.client.IRenderHandler; -import twilightforest.TwilightForestMod; -import twilightforest.biomes.TFBiomeBase; -import twilightforest.client.renderer.TFSkyRenderer; -import twilightforest.client.renderer.TFWeatherRenderer; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - - -/** - * @author Ben - * - */ -public class WorldProviderTwilightForest extends WorldProviderSurface { - - - public final String saveFolder; - public ChunkProviderTwilightForest chunkProvider; - - public WorldProviderTwilightForest() { - setDimension(TwilightForestMod.dimensionID); - saveFolder = "DIM" + TwilightForestMod.dimensionID; - } - - /** - * Always return these colors - */ - @Override - public float[] calcSunriseSunsetColors(float celestialAngle, float f1) { - return null;//super.calcSunriseSunsetColors(celestialAngle, f1); - } - - /** - * Fog color - */ - @Override - public Vec3 getFogColor(float f, float f1) - { - float bright = MathHelper.cos(0.25f * 3.141593F * 2.0F) * 2.0F + 0.5F; - if(bright < 0.0F) - { - bright = 0.0F; - } - if(bright > 1.0F) - { - bright = 1.0F; - } - float red = 0.7529412F; - float green = 1.0F; - float blue = 0.8470588F; - red *= bright * 0.94F + 0.06F; - green *= bright * 0.94F + 0.06F; - blue *= bright * 0.91F + 0.09F; - return Vec3.createVectorHelper(red, green, blue); - } - - /** - * Calculates the angle of sun and moon in the sky relative to a specified time (usually worldTime) - */ - public float calculateCelestialAngle(long par1, float par3) - { - //return super.calculateCelestialAngle(par1, par3); - return 0.225f; - } - - - @Override - public void registerWorldChunkManager() - { - this.worldChunkMgr = new TFWorldChunkManager(worldObj); - this.dimensionId = TwilightForestMod.dimensionID; - } - - - /** - * Returns a new chunk provider which generates chunks for this world - */ - public IChunkProvider createChunkGenerator() - { - // save chunk generator? - if (this.chunkProvider == null) { - this.chunkProvider = new ChunkProviderTwilightForest(worldObj, worldObj.getSeed(), worldObj.getWorldInfo().isMapFeaturesEnabled()); - return this.chunkProvider; - } else { - return new ChunkProviderTwilightForest(worldObj, worldObj.getSeed(), worldObj.getWorldInfo().isMapFeaturesEnabled()); - } - } - - public ChunkProviderTwilightForest getChunkProvider() { - return this.chunkProvider; - } - - /** - * This seems to be a function checking whether we have an ocean. - */ - @Override - public boolean isSkyColored() - { - return false; - } - - -// -// @Override -// public float getCloudHeight() -// { -// return 64F; -// } - - public int getAverageGroundLevel() - { - return 30; - } - -// @Override -// public boolean canCoordinateBeSpawn(int i, int j) -// { -// int k = worldObj.getFirstUncoveredBlock(i, j); -// if(k == 0) -// { -// return false; -// } else -// { -// return Blocks.blocksList[k].getMaterial().isSolid(); -// } -// } - - - /** - * True if the player can respawn in this dimension (true = overworld, false = nether). - */ - @Override - public boolean canRespawnHere() - { - // lie about this until the world is initialized - // otherwise the server will try to generate enough terrain for a spawn point and that's annoying - return worldObj.getWorldInfo().isInitialized(); - } - - @Override - public String getSaveFolder() { - return this.saveFolder; - } - - @Override - public String getWelcomeMessage() { - return "Entering the Twilight Forest"; - } - - @Override - public String getDepartMessage() { - return "Leaving the Twilight Forest"; - } - - @Override - public String getDimensionName() { - return "Twilight Forest"; - } - - /** - * Sleep anytime! - */ - @Override - public boolean isDaytime() { - return false; - } - - @Override - @SideOnly(Side.CLIENT) - public Vec3 getSkyColor(Entity cameraEntity, float partialTicks) { - return Vec3.createVectorHelper(43 / 256.0, 46 / 256.0, 99 / 256.0); - } - - @Override - @SideOnly(Side.CLIENT) - public float getStarBrightness(float par1) { - return 1.0F; - } - - - @Override - public double getHorizon() { - return 32.0D; - } - - @Override - public BiomeGenBase getBiomeGenForCoords(int x, int z) { - BiomeGenBase biome = super.getBiomeGenForCoords(x, z); - if (biome == null) - { - biome = TFBiomeBase.twilightForest; - } - return biome; - } - - /** - * If there is a specific twilight forest seed set, use that. Otherwise use the world seed. - */ - @Override - public long getSeed() - { - if (TwilightForestMod.twilightForestSeed == null || TwilightForestMod.twilightForestSeed.length() == 0) - { - return super.getSeed(); - } - else - { - return TwilightForestMod.twilightForestSeed.hashCode(); - } - } - - /** - * We're just going to check here for chunks with the relight flag set and KILL THEM! - */ - @Override - public void updateWeather() - { - super.updateWeather(); - -// for (ChunkCoordIntPair coord : (HashSet)this.worldObj.activeChunkSet) -// { -// Chunk chunk = this.worldObj.getChunkFromChunkCoords(coord.chunkXPos, coord.chunkZPos); -// -// if (chunk.queuedLightChecks < 4096) -// { -// //System.out.println("Stopping light checks!"); -// chunk.queuedLightChecks = 4096; -// } -// } - } - - - @SideOnly(Side.CLIENT) - public IRenderHandler getSkyRenderer() - { - if (super.getSkyRenderer() == null) - { - this.setSkyRenderer(new TFSkyRenderer()); - } - - return super.getSkyRenderer(); - } - - @SideOnly(Side.CLIENT) - public IRenderHandler getWeatherRenderer() - { - if (super.getWeatherRenderer() == null) - { - this.setWeatherRenderer(new TFWeatherRenderer()); - } - - return super.getWeatherRenderer(); - } - - /** - * the y level at which clouds are rendered. - */ - //@SideOnly(Side.CLIENT) // need for magic beans, even on server - public float getCloudHeight() - { - return 161.0F; - } -} diff --git a/src/main/java/twilightforest/world/components/BiomeGrassColors.java b/src/main/java/twilightforest/world/components/BiomeGrassColors.java new file mode 100644 index 0000000000..97d52f47af --- /dev/null +++ b/src/main/java/twilightforest/world/components/BiomeGrassColors.java @@ -0,0 +1,66 @@ +package twilightforest.world.components; + +import net.minecraft.util.Mth; +import net.minecraft.world.level.GrassColor; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.biome.BiomeSpecialEffects.GrassColorModifier; +import twilightforest.TwilightForestMod; + +import java.util.Random; + +public class BiomeGrassColors { + + public static void init() {} + + public static int getEnchantedColor(int x, int z) { + // center of the biome is at % 256 - 8 + int cx = 256 * Math.round((x - 8) / 256F) + 8; + int cz = 256 * Math.round((z - 8) / 256F) - 8; + + int dist = (int) Mth.sqrt((cx - x) * (cx - x) + (cz - z) * (cz - z)); + int color = dist * 64; + color %= 512; + + if (color > 255) { + color = 511 - color; + } + + color = 255 - color; + + return color; + } + + public static final GrassColorModifier ENCHANTED_FOREST = make("enchanted_forest", (x, z, color) -> { + return (color & 0xFFFF00) + getEnchantedColor((int) x, (int) z); //TODO + }); + + // FIXME Flat color, resolve + public static final GrassColorModifier SWAMP = make("swamp", (x, z, color) -> ((GrassColor.get(0.8F, 0.9F) & 0xFEFEFE) + 0x4E0E4E) / 2); + // FIXME Flat color, resolve + public static final GrassColorModifier DARK_FOREST = make("dark_forest", (x, z, color) -> ((GrassColor.get(0.7F, 0.8F) & 0xFEFEFE) + 0x1E0E4E) / 2); + public static final GrassColorModifier DARK_FOREST_CENTER = make("dark_forest_center", (x, z, color) -> { + double d0 = Biome.TEMPERATURE_NOISE.getValue(x * 0.0225D, z * 0.0225D, false); //TODO: Check + return d0 < -0.2D ? 0x667540 : 0x554114; + }); + public static final GrassColorModifier SPOOKY_FOREST = make("spooky_forest", (x, z, color) -> { + double noise = (Biome.TEMPERATURE_NOISE.getValue(x * 0.0225D, z * 0.0225D, false) + 1D) / 2D; + return blendColors(0xc43323, 0x5BC423, noise > 0.6D ? noise * 0.1D : noise); + }); + + public static int blendColors(int a, int b, double ratio) { + int mask1 = 0x00FF00FF; + int mask2 = 0xFF00FF00; + + int f2 = (int)(256 * ratio); + int f1 = 256 - f2; + + return (((((a & mask1) * f1) + ((b & mask1) * f2)) >> 8) & mask1) + | (((((a & mask2) * f1) + ((b & mask2) * f2)) >> 8) & mask2); + } + + private static GrassColorModifier make(String name, GrassColorModifier.ColorModifier delegate) { + name = TwilightForestMod.prefix(name).toString(); + + return GrassColorModifier.create(name, name, delegate); + } +} diff --git a/src/main/java/twilightforest/world/components/TFCavesCarver.java b/src/main/java/twilightforest/world/components/TFCavesCarver.java new file mode 100644 index 0000000000..cb78f3ddc1 --- /dev/null +++ b/src/main/java/twilightforest/world/components/TFCavesCarver.java @@ -0,0 +1,210 @@ +package twilightforest.world.components; + +import com.google.common.collect.ImmutableSet; +import com.mojang.serialization.Codec; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Holder; +import net.minecraft.core.SectionPos; +import net.minecraft.tags.BlockTags; +import net.minecraft.tags.FluidTags; +import net.minecraft.util.Mth; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.CarvingMask; +import net.minecraft.world.level.chunk.ChunkAccess; +import net.minecraft.world.level.levelgen.Aquifer; +import net.minecraft.world.level.levelgen.carver.CarvingContext; +import net.minecraft.world.level.levelgen.carver.CaveCarverConfiguration; +import net.minecraft.world.level.levelgen.carver.WorldCarver; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.level.material.Fluids; +import org.apache.commons.lang3.mutable.MutableBoolean; +import twilightforest.init.TFBlocks; + +import java.util.Random; +import java.util.function.Function; + +//Framework taken from CaveWorldCarver, everything worth knowing is documented for easier changes in the future +public class TFCavesCarver extends WorldCarver { + + private final boolean isHighlands; + private final Random rand = new Random(); + + public TFCavesCarver(Codec codec, boolean isHighlands) { + super(codec); + this.liquids = ImmutableSet.of(Fluids.WATER, Fluids.LAVA); + this.isHighlands = isHighlands; + } + + @Override + public boolean isStartChunk(CaveCarverConfiguration config, RandomSource rand) { + return rand.nextFloat() <= config.probability; + } + + @Override + public boolean carve(CarvingContext ctx, CaveCarverConfiguration config, ChunkAccess access, Function> biomePos, RandomSource rand, Aquifer aquifer, ChunkPos accessPos, CarvingMask mask) { + int i = SectionPos.sectionToBlockCoord(this.getRange() * 2 - 1); + int j = rand.nextInt(rand.nextInt(rand.nextInt(this.getCaveBound()) + 1) + 1); + + for (int k = 0; k < j; ++k) { + double x = accessPos.getBlockX(rand.nextInt(16)); + double y = config.y.sample(rand, ctx); + double z = accessPos.getBlockZ(rand.nextInt(16)); + double horiz = config.horizontalRadiusMultiplier.sample(rand); + double vert = config.verticalRadiusMultiplier.sample(rand); + double floor = config.floorLevel.sample(rand); + WorldCarver.CarveSkipChecker checker = (p_159202_, p_159203_, p_159204_, p_159205_, p_159206_) -> shouldSkip(p_159203_, p_159204_, p_159205_, floor); + int l = 1; + if (rand.nextInt(4) == 0 && isHighlands) { + double d6 = config.yScale.sample(rand); + float f1 = 1.0F + rand.nextFloat() * 6.0F; + this.createRoom(ctx, config, access, biomePos, aquifer, x, y, z, f1, d6, mask, checker); + l += rand.nextInt(4); + } + + for (int k1 = 0; k1 < l; ++k1) { + float f = rand.nextFloat() * ((float) Math.PI * 2F); + float f3 = (rand.nextFloat() - 0.5F) / 4.0F; + float f2 = this.getThickness(rand); + int i1 = i - rand.nextInt(i / 4); + this.createTunnel(ctx, config, access, biomePos, rand.nextLong(), aquifer, x, y, z, horiz, vert, f2, f, f3, 0, i1, this.getYScale(), mask, checker); + } + } + + return true; + } + + @Override + protected boolean carveBlock(CarvingContext ctx, CaveCarverConfiguration config, ChunkAccess access, Function> biomePos, CarvingMask mask, BlockPos.MutableBlockPos pos, BlockPos.MutableBlockPos posUp, Aquifer aquifer, MutableBoolean isSurface) { + BlockState blockstate = access.getBlockState(pos); + if (blockstate.is(Blocks.GRASS_BLOCK) || blockstate.is(Blocks.MYCELIUM) || blockstate.is(Blocks.PODZOL) || blockstate.is(Blocks.DIRT_PATH)) { + isSurface.setTrue(); + } + + //We dont want caves to go so far down you can see bedrock, so lets stop them right before + if (pos.getY() < access.getMinBuildHeight() + 6) return false; + + if (!this.canReplaceBlock(config, blockstate) && !isDebugEnabled(config)) { + return false; + } else { + BlockState blockstate2 = this.getCarveState(ctx, config, pos, aquifer); + if (blockstate2 == null) { + return false; + } else { + if (aquifer.shouldScheduleFluidUpdate() && !blockstate2.getFluidState().isEmpty()) { + access.markPosForPostprocessing(pos); + } + + //here's the code for preventing floating water and making dirt roofs. Enjoy :) + for (Direction facing : Direction.values()) { + FluidState aboveSurface = access.getFluidState(posUp.offset(pos.offset(0, 1, 0))); + FluidState areaAround = access.getFluidState(posUp.relative(facing)); + FluidState areaAboveAround = access.getFluidState(posUp.offset(pos.offset(0, 1, 0).relative(facing))); + + if (areaAround.is(FluidTags.WATER) || areaAboveAround.is(FluidTags.WATER) || aboveSurface.is(FluidTags.WATER)) { + return false; + } else { + if (rand.nextInt(10) == 0 && access.getBlockState(pos).isAir() && access.getBlockState(pos.relative(facing)).is(BlockTags.BASE_STONE_OVERWORLD) && this.isHighlands) { + access.setBlockState(pos.relative(facing), TFBlocks.TROLLSTEINN.get().defaultBlockState(), false); + } + access.setBlockState(pos, CAVE_AIR, false); + + if ((access.getBlockState(pos.above()).is(BlockTags.BASE_STONE_OVERWORLD) || access.getFluidState(pos.above()).is(FluidTags.WATER)) && access.getBlockState(pos).isAir() && !this.isHighlands) { + switch (rand.nextInt(5)) { + case 0, 1, 2 -> access.setBlockState(pos.above(), Blocks.DIRT.defaultBlockState(), false); + case 3 -> access.setBlockState(pos.above(), Blocks.ROOTED_DIRT.defaultBlockState(), false); + case 4 -> access.setBlockState(pos.above(), Blocks.COARSE_DIRT.defaultBlockState(), false); + } + } + if (isSurface.isTrue()) { + BlockPos posDown = pos.setWithOffset(pos, Direction.DOWN).below(); + if (access.getBlockState(posDown).is(Blocks.DIRT)) { + ctx.topMaterial(biomePos, access, posDown, !blockstate2.getFluidState().isEmpty()).ifPresent((state -> { + access.setBlockState(posDown, state, false); + if (!state.getFluidState().isEmpty()) { + access.markPosForPostprocessing(posDown); + } + })); + } + } + + } + } + return true; + } + } + } + + protected int getCaveBound() { + return 15; + } + + protected float getThickness(RandomSource rand) { + float f = rand.nextFloat() * 2.0F + rand.nextFloat(); + if (rand.nextInt(10) == 0) { + f *= rand.nextFloat() * rand.nextFloat() * 3.0F + 1.0F; + } + + return f; + } + + protected double getYScale() { + return 1.0D; + } + + protected void createRoom(CarvingContext ctx, CaveCarverConfiguration config, ChunkAccess access, Function> biomePos, Aquifer aquifer, double posX, double posY, double posZ, float radius, double horizToVertRatio, CarvingMask mask, WorldCarver.CarveSkipChecker checker) { + double d0 = 1.5D + (double) (Mth.sin(((float) Math.PI / 2F)) * radius); + double d1 = d0 * horizToVertRatio; + this.carveEllipsoid(ctx, config, access, biomePos, aquifer, posX + 1.0D, posY, posZ, d0, d1, mask, checker); + } + + protected void createTunnel(CarvingContext ctx, CaveCarverConfiguration config, ChunkAccess access, Function> biomePos, long seed, Aquifer aquifer, double posX, double posY, double posZ, double horizMult, double vertMult, float thickness, float yaw, float pitch, int branchIndex, int branchCount, double horizToVertRatio, CarvingMask mask, WorldCarver.CarveSkipChecker checker) { + Random random = new Random(seed); + int i = random.nextInt(branchCount / 2) + branchCount / 4; + boolean flag = random.nextInt(6) == 0; + float f = 0.0F; + float f1 = 0.0F; + + for (int j = branchIndex; j < branchCount; ++j) { + double d0 = 1.5D + (double) (Mth.sin((float) Math.PI * (float) j / (float) branchCount) * thickness); + double d1 = d0 * horizToVertRatio; + float f2 = Mth.cos(pitch); + posX += Mth.cos(yaw) * f2; + posY += Mth.sin(pitch); + posZ += Mth.sin(yaw) * f2; + pitch = pitch * (flag ? 0.92F : 0.7F); + pitch = pitch + f1 * 0.1F; + yaw += f * 0.1F; + f1 = f1 * 0.9F; + f = f * 0.75F; + f1 = f1 + (random.nextFloat() - random.nextFloat()) * random.nextFloat() * 2.0F; + f = f + (random.nextFloat() - random.nextFloat()) * random.nextFloat() * 4.0F; + if (j == i && thickness > 1.0F) { + this.createTunnel(ctx, config, access, biomePos, random.nextLong(), aquifer, posX, posY, posZ, horizMult, vertMult, random.nextFloat() * 0.5F + 0.5F, yaw - ((float) Math.PI / 2F), pitch / 3.0F, j, branchCount, 1.0D, mask, checker); + this.createTunnel(ctx, config, access, biomePos, random.nextLong(), aquifer, posX, posY, posZ, horizMult, vertMult, random.nextFloat() * 0.5F + 0.5F, yaw + ((float) Math.PI / 2F), pitch / 3.0F, j, branchCount, 1.0D, mask, checker); + return; + } + + if (random.nextInt(4) != 0) { + if (!canReach(access.getPos(), posX, posZ, j, branchCount, thickness)) { + return; + } + + this.carveEllipsoid(ctx, config, access, biomePos, aquifer, posX, posY, posZ, d0 * horizMult, d1 * vertMult, mask, checker); + } + } + + } + + private static boolean shouldSkip(double posX, double posY, double posZ, double minY) { + if (posY <= minY) { + return true; + } else { + return posX * posX + posY * posY + posZ * posZ >= 1.0D; + } + } +} diff --git a/src/main/java/twilightforest/world/components/biomesources/LandmarkBiomeSource.java b/src/main/java/twilightforest/world/components/biomesources/LandmarkBiomeSource.java new file mode 100644 index 0000000000..0683459fe5 --- /dev/null +++ b/src/main/java/twilightforest/world/components/biomesources/LandmarkBiomeSource.java @@ -0,0 +1,80 @@ +package twilightforest.world.components.biomesources; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.Holder; +import net.minecraft.util.Mth; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.biome.BiomeSource; +import net.minecraft.world.level.biome.Climate; + +import java.util.stream.Stream; + +public class LandmarkBiomeSource extends BiomeSource { + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + Codec.LONG.fieldOf("seed").forGetter(o -> o.seed), + SpecialBiomePalette.CODEC.fieldOf("palette").forGetter(o -> o.palette) + ).apply(instance, LandmarkBiomeSource::new)); + + // A Landmark group is made of major biomes (Swamps, Dark Forest, Snowy Forest + Glacier, Final Plateau) + private static final int LANDMARK_POW_2 = 9; + private static final int LANDMARK_SCALE = 2 << LANDMARK_POW_2; + private static final int LANDMARK_HALF_SCALE = LANDMARK_SCALE >> 2; + // Maps show a total of 4 (all) major landmark biome groups for progression + private static final int MAP_POW_2 = LANDMARK_POW_2 + 1; + private static final int MAP_SCALE = 2 << MAP_POW_2; + + private final long seed; + private final SpecialBiomePalette palette; + + protected LandmarkBiomeSource(long seed, SpecialBiomePalette palette) { + super(); + + this.seed = seed; + this.palette = palette; + } + + @Override + protected Codec codec() { + return LandmarkBiomeSource.CODEC; + } + + @Override + protected Stream> collectPossibleBiomes() { + return this.palette.allBiomes().stream(); + } + + @Override + public Holder getNoiseBiome(int x, int y, int z, Climate.Sampler climateSampler) { + // TODO Fractal Voronoi coordinate filtering + + int mapX = x >> MAP_POW_2; + int mapZ = z >> MAP_POW_2; + long cellSeed = Mth.getSeed(mapX, (int) this.seed, mapZ); + int landmarkIndex = indexForQuadrant(x, z); + + // TODO Set up mild offsets for the centers of each landmark group, so we can move them around inside each quadrant + + // Test if we're in range of returning a biome from a landmark group + float distance = (float) Mth.length(((x) % LANDMARK_SCALE) - LANDMARK_HALF_SCALE, ((z) % LANDMARK_SCALE) - LANDMARK_HALF_SCALE); + // Multiplied the distance [ * 1.5f ] so the distance cutoff happens sooner because the algorithm thinks the position is further away than it actually is. This shrinks the Progression Landmark and allows us to move it around inside the quadrant. + var biome = this.palette.getNearestLandmark(distance * 1.5f, landmarkIndex, cellSeed); + if (biome != null) return biome; + + // We're good to place something else now! + + // TODO Determine how we're going to place a special biome (Rainbow Grove, Dense Mushroom Forest, Spooky Forest) + + // Fallback to common biomes + return this.getNoiseBiome(climateSampler.sample(x, y, z)); + // TODO Use nonzero negative offset value in the config's Climate.ParameterList to put Twilight Underground Biome + } + + public Holder getNoiseBiome(Climate.TargetPoint climateSample) { + return this.palette.regularBiomes().findValue(climateSample); + } + + private static int indexForQuadrant(int x, int z) { + return ((z >> (LANDMARK_POW_2 - 1)) & 2) + ((x >> LANDMARK_POW_2) & 1); + } +} diff --git a/src/main/java/twilightforest/world/components/biomesources/SpecialBiomePalette.java b/src/main/java/twilightforest/world/components/biomesources/SpecialBiomePalette.java new file mode 100644 index 0000000000..d232da3c79 --- /dev/null +++ b/src/main/java/twilightforest/world/components/biomesources/SpecialBiomePalette.java @@ -0,0 +1,106 @@ +package twilightforest.world.components.biomesources; + +import com.google.common.collect.ImmutableList; +import com.mojang.datafixers.util.Pair; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import it.unimi.dsi.fastutil.floats.Float2ObjectAVLTreeMap; +import it.unimi.dsi.fastutil.floats.Float2ObjectSortedMap; +import net.minecraft.Util; +import net.minecraft.core.Holder; +import net.minecraft.core.HolderSet; +import net.minecraft.core.RegistryAccess; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.core.registries.Registries; +import net.minecraft.data.worldgen.biome.OverworldBiomes; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.biome.Biomes; +import net.minecraft.world.level.biome.Climate; +import net.minecraftforge.server.ServerLifecycleHooks; +import twilightforest.util.Codecs; + +import org.jetbrains.annotations.Nullable; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.function.Function; + +/* + +So what I had planned to do was keep the same idea from our old system. The way I understood it worked seeing it on the Magic Maps, is that you subdivide each map into quarters. +In each quarter, you place the center of a *Progression Landmark*. You will need to factor in spacing centers away from centers of other quadrants, or you will see an obvious cut with Biome placement. + +*Progression Landmarks* are the Twilight Swamps, Snowy Lands, Dark Forest, and the Highlands. +Programmatically, a Progression Landmark is a system that determines biome placement as well as the required terraforming. +For the ease of logic I enforced having specifically 4 because a very nice algorithm skips needing to shuffle Progression Landmarks around. + +You will need to make a class `ProgressionLandmarkConfig` that determines the influences (most likely `Depth` and `Scale`) on noise generation that you wish for each biome. +You could also instead build an Enum for handling the noise generation influence, and each entry has their own functions implemented to handle the algorithms you want on the terrain. + +Progression Landmark systems should have a common implementation that we can worry about extending later when we REALLY wanna customize the biomes. +For now, I've made the system test for the centers, then it determines which biome to place based on distance from center. +In 3 of our cases, this is just two biomes. However our 4th case are the Highlands. These will need 3 biomes because of the Thornlands biome. + +You'll need to worry about deterministically placing the centers randomly inside the blockworld, so the systems that back the Progression Landmark systems can function with positions relative to the center of the Progression Landmark System. +*/ +public record SpecialBiomePalette(Holder river, Climate.ParameterList> regularBiomes, HolderSet specialBiomes, List>> landmarkGradients, List> allBiomes) { + public static final Codec CODEC = Util.make(() -> { + Codec codec = RecordCodecBuilder.create(instance -> instance.group( + Biome.CODEC.fieldOf("river").forGetter(SpecialBiomePalette::river), // This is so we can predictably subdivide biomes in the voronoi mesh + Codecs.CLIMATE_SYSTEM.fieldOf("common").forGetter(SpecialBiomePalette::regularBiomes), // Regular biomes like Canopy Forest, Savanna, etc. + Biome.LIST_CODEC.fieldOf("special").forGetter(SpecialBiomePalette::specialBiomes), // Special ones like Dense Mushroom Forest, Enchanted Grove, Spooky Forest, etc + Codecs.floatTreeCodec(Biome.CODEC).listOf().comapFlatMap(l -> Util.fixedSize(l, 4), Function.identity()).fieldOf("landmarks").forGetter(SpecialBiomePalette::landmarkGradients) + ).apply(instance, SpecialBiomePalette::create)); + + // Very important + return codec.orElseGet(SpecialBiomePalette::create); + }); + + private static SpecialBiomePalette create() { + // FIXME populate correct biomes + return create(ServerLifecycleHooks.getCurrentServer().registryAccess().registryOrThrow(Registries.BIOME).getHolderOrThrow(Biomes.THE_VOID), new Climate.ParameterList<>(Collections.emptyList()), HolderSet.direct(), Collections.emptyList()); + } + + private static SpecialBiomePalette create(Holder river, Climate.ParameterList> common, HolderSet rare, List>> clusters) { + return new SpecialBiomePalette(river, common, rare, clusters, ImmutableList.>builder().add(river).addAll(common.values().stream().map(Pair::getSecond).iterator()).addAll(rare).addAll(clusters.stream().flatMap(tree -> tree.float2ObjectEntrySet().stream()).map(Map.Entry::getValue).iterator()).build()); + } + + @Nullable + public Holder getNearestLandmark(float distanceRelative, int landmarkIndex, long permutation) { + if (distanceRelative > 1) return null; // Outside the gradient + + return this.getNearestLandmark(landmarkIndex, permutation).get(distanceRelative); + } + + private Float2ObjectSortedMap> getNearestLandmark(int landmarkIndex, long permutation) { + return this.landmarkGradients().get(BINARY_GRID_PERMUTATIONS[(int) (permutation % 24)][landmarkIndex]); + } + + // Precomputed cache of every single possible permutation of a binary 2x2 grid + private static final int[][] BINARY_GRID_PERMUTATIONS = new int[][] { + new int[] { 0, 1, 2, 3 }, + new int[] { 0, 1, 3, 2 }, + new int[] { 0, 2, 1, 3 }, + new int[] { 0, 2, 3, 1 }, + new int[] { 0, 3, 1, 2 }, + new int[] { 0, 3, 2, 1 }, + new int[] { 1, 0, 2, 3 }, + new int[] { 1, 0, 3, 2 }, + new int[] { 1, 2, 0, 3 }, + new int[] { 1, 2, 3, 0 }, + new int[] { 1, 3, 0, 2 }, + new int[] { 1, 3, 2, 0 }, + new int[] { 2, 0, 1, 3 }, + new int[] { 2, 0, 3, 1 }, + new int[] { 2, 1, 0, 3 }, + new int[] { 2, 1, 3, 0 }, + new int[] { 2, 3, 0, 1 }, + new int[] { 2, 3, 1, 0 }, + new int[] { 3, 0, 1, 2 }, + new int[] { 3, 0, 2, 1 }, + new int[] { 3, 1, 0, 2 }, + new int[] { 3, 1, 2, 0 }, + new int[] { 3, 2, 0, 1 }, + new int[] { 3, 2, 1, 0 } + }; +} diff --git a/src/main/java/twilightforest/world/components/biomesources/TFBiomeProvider.java b/src/main/java/twilightforest/world/components/biomesources/TFBiomeProvider.java new file mode 100644 index 0000000000..0259cbf7c5 --- /dev/null +++ b/src/main/java/twilightforest/world/components/biomesources/TFBiomeProvider.java @@ -0,0 +1,106 @@ +package twilightforest.world.components.biomesources; + +import com.google.common.base.Suppliers; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.Holder; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.biome.BiomeSource; +import net.minecraft.world.level.biome.Climate; +import twilightforest.TwilightForestMod; +import twilightforest.init.custom.BiomeLayerStack; +import twilightforest.world.components.chunkgenerators.warp.TerrainColumn; +import twilightforest.world.components.layer.vanillalegacy.BiomeLayerFactory; +import twilightforest.world.components.layer.vanillalegacy.area.LazyArea; +import twilightforest.world.components.layer.vanillalegacy.context.LazyAreaContext; + +import java.util.Comparator; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.function.Function; +import java.util.function.Supplier; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +@Deprecated // Pending rename +public class TFBiomeProvider extends BiomeSource { + public static final Codec TF_CODEC = RecordCodecBuilder.create((instance) -> instance.group( + TerrainColumn.CODEC.listOf().fieldOf("biome_landscape").xmap(l -> l.stream().collect(Collectors.toMap(TerrainColumn::getResourceKey, Function.identity())), m -> m.values().stream().sorted(Comparator.comparing(TerrainColumn::getResourceKey)).toList()).forGetter(o -> o.biomeList), + Codec.FLOAT.fieldOf("base_offset").forGetter(o -> o.baseOffset), + Codec.FLOAT.fieldOf("base_factor").forGetter(o -> o.baseFactor), + BiomeLayerStack.HOLDER_CODEC.fieldOf("biome_layer_config").orElseGet((String s) -> TwilightForestMod.LOGGER.warn(s), BiomeLayerStack::buildDefault).forGetter(TFBiomeProvider::getBiomeConfig) + ).apply(instance, instance.stable(TFBiomeProvider::new))); + + private final Map, TerrainColumn> biomeList; + private final float baseOffset; + private final float baseFactor; + + private final Holder genBiomeConfig; + private final Supplier genBiomes; + + public TFBiomeProvider(List list, float offset, float factor, Holder biomeLayerFactory) { + this(list.stream().collect(Collectors.toMap(TerrainColumn::getResourceKey, Function.identity())), offset, factor, biomeLayerFactory); + } + + public TFBiomeProvider(Map, TerrainColumn> list, float offset, float factor, Holder biomeLayerFactory) { + super(); + + //this.genBiomes = buildLayers((salt) -> new LazyAreaContext(25, salt)); + this.genBiomeConfig = biomeLayerFactory; + this.genBiomes = Suppliers.memoize(() -> this.genBiomeConfig.get().build(salt -> new LazyAreaContext(25, salt))); + + this.baseOffset = offset; + this.baseFactor = factor; + + this.biomeList = list; + } + + @Override + protected Stream> collectPossibleBiomes() { + return this.biomeList.values().stream().flatMap(TerrainColumn::getBiomes); + } + + @Override + protected Codec codec() { + return TF_CODEC; + } + + public float getBaseOffset() { + return this.baseOffset; + } + + public float getBaseFactor() { + return this.baseFactor; + } + + public float getBiomeDepth(int x, int z) { + return this.getBiomeDepth(this.genBiomes.get().getBiome(x, z)); + } + + public float getBiomeDepth(ResourceKey biome) { + return this.getBiomeValue(biome, TerrainColumn::depth, 0f); + } + + public Optional getTerrainColumn(int x, int z) { + return this.getTerrainColumn(this.genBiomes.get().getBiome(x, z)); + } + + public Optional getTerrainColumn(ResourceKey biome) { + return this.biomeList.values().stream().filter(p -> p.is(biome)).findFirst(); + } + + public T getBiomeValue(ResourceKey biome, Function function, T other) { + return this.getTerrainColumn(biome).map(function).orElse(other); + } + + @Override + public Holder getNoiseBiome(int x, int y, int z, Climate.Sampler sampler) { + return this.biomeList.get(this.genBiomes.get().getBiome(x, z)).getBiome(y); + } + + private Holder getBiomeConfig() { + return this.genBiomeConfig; + } +} diff --git a/src/main/java/twilightforest/world/components/biomesources/package-info.java b/src/main/java/twilightforest/world/components/biomesources/package-info.java new file mode 100644 index 0000000000..ccec63e38c --- /dev/null +++ b/src/main/java/twilightforest/world/components/biomesources/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.world.components.biomesources; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/world/components/chunkgenerators/ChunkGeneratorTwilight.java b/src/main/java/twilightforest/world/components/chunkgenerators/ChunkGeneratorTwilight.java new file mode 100644 index 0000000000..a4f03e0b18 --- /dev/null +++ b/src/main/java/twilightforest/world/components/chunkgenerators/ChunkGeneratorTwilight.java @@ -0,0 +1,1002 @@ +package twilightforest.world.components.chunkgenerators; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Lists; +import com.google.common.collect.Sets; +import com.mojang.datafixers.util.Pair; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap; +import it.unimi.dsi.fastutil.objects.ObjectArraySet; +import net.minecraft.Util; +import net.minecraft.core.*; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceKey; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.WorldGenRegion; +import net.minecraft.util.Mth; +import net.minecraft.util.random.WeightedRandomList; +import net.minecraft.world.entity.MobCategory; +import net.minecraft.world.level.*; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.biome.Climate; +import net.minecraft.world.level.biome.MobSpawnSettings; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.*; +import net.minecraft.world.level.levelgen.*; +import net.minecraft.world.level.levelgen.blending.Blender; +import net.minecraft.world.level.levelgen.structure.Structure; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructureSet; +import net.minecraft.world.level.levelgen.structure.StructureStart; +import net.minecraft.world.level.levelgen.structure.placement.StructurePlacement; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplateManager; +import org.jetbrains.annotations.Nullable; +import twilightforest.init.TFBiomes; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFLandmark; +import twilightforest.util.LegacyLandmarkPlacements; +import twilightforest.util.Vec2i; +import twilightforest.world.components.biomesources.TFBiomeProvider; +import twilightforest.world.components.chunkgenerators.warp.*; +import twilightforest.world.components.structures.TFStructureComponent; +import twilightforest.world.components.structures.placements.BiomeForcedLandmarkPlacement; +import twilightforest.world.components.structures.start.TFStructureStart; +import twilightforest.world.components.structures.type.HollowHillStructure; +import twilightforest.world.components.structures.util.ControlledSpawns; + +import java.util.*; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.Executor; +import java.util.function.Predicate; + +// TODO override getBaseHeight and getBaseColumn for our advanced structure terraforming +@SuppressWarnings({"OptionalUsedAsFieldOrParameterType", "SuspiciousNameCombination", "deprecation"}) +public class ChunkGeneratorTwilight extends ChunkGeneratorWrapper { + public static final Codec CODEC = RecordCodecBuilder.create((instance) -> instance.group( + ChunkGenerator.CODEC.fieldOf("wrapped_generator").forGetter(o -> o.delegate), + NoiseGeneratorSettings.CODEC.fieldOf("noise_generation_settings").forGetter(o -> o.noiseGeneratorSettings), + Codec.BOOL.fieldOf("generate_dark_forest_canopy").forGetter(o -> o.genDarkForestCanopy), + Codec.INT.optionalFieldOf("dark_forest_canopy_height").forGetter(o -> o.darkForestCanopyHeight), + Codec.unboundedMap(ResourceKey.codec(Registries.BIOME), TFLandmark.CODEC.listOf().xmap(ImmutableSet::copyOf, ImmutableList::copyOf)).fieldOf("landmark_placement_allowed_biomes").forGetter(o -> o.biomeLandmarkOverrides) + ).apply(instance, ChunkGeneratorTwilight::new)); + + private final Map, ImmutableSet> biomeLandmarkOverrides; + + private final Holder noiseGeneratorSettings; + private final boolean genDarkForestCanopy; + private final Optional darkForestCanopyHeight; + + private final BlockState defaultBlock; + private final BlockState defaultFluid; + private final Optional surfaceNoiseGetter; + private final Optional warper; + + private static final BlockState[] EMPTY_COLUMN = new BlockState[0]; + + public ChunkGeneratorTwilight(ChunkGenerator delegate, Holder noiseGenSettings, boolean genDarkForestCanopy, Optional darkForestCanopyHeight, Map, ImmutableSet> biomeLandmarkOverrides) { + super(delegate); + + this.biomeLandmarkOverrides = biomeLandmarkOverrides; + this.noiseGeneratorSettings = noiseGenSettings; + this.genDarkForestCanopy = genDarkForestCanopy; + this.darkForestCanopyHeight = darkForestCanopyHeight; + + if (delegate instanceof NoiseBasedChunkGenerator noiseGen && noiseGen.generatorSettings().isBound()) { + this.defaultBlock = noiseGen.generatorSettings().get().defaultBlock(); + this.defaultFluid = noiseGen.generatorSettings().get().defaultFluid(); + this.surfaceNoiseGetter = Optional.empty();//Optional.of(noiseGen.sampler); + } else { + this.defaultBlock = Blocks.STONE.defaultBlockState(); + this.defaultFluid = Blocks.WATER.defaultBlockState(); + this.surfaceNoiseGetter = Optional.empty(); + } + + //BIOME_FEATURES = new ImmutableMap.Builder() + // .put(TFBiomes.DARK_FOREST.location(), TFLandmark.KNIGHT_STRONGHOLD) + // .put(TFBiomes.DARK_FOREST_CENTER.location(), TFLandmark.DARK_TOWER) + // //.put(TFBiomes.DENSE_MUSHROOM_FOREST.location(), MUSHROOM_TOWER) + // .put(TFBiomes.ENCHANTED_FOREST.location(), TFLandmark.QUEST_GROVE) + // .put(TFBiomes.FINAL_PLATEAU.location(), TFLandmark.FINAL_CASTLE) + // .put(TFBiomes.FIRE_SWAMP.location(), TFLandmark.HYDRA_LAIR) + // .put(TFBiomes.GLACIER.location(), TFLandmark.ICE_TOWER) + // .put(TFBiomes.HIGHLANDS.location(), TFLandmark.TROLL_CAVE) + // .put(TFBiomes.SNOWY_FOREST.location(), TFLandmark.YETI_CAVE) + // .put(TFBiomes.SWAMP.location(), TFLandmark.LABYRINTH) + // .put(TFBiomes.LAKE.location(), TFLandmark.QUEST_ISLAND) + // .build(); + + //FIXME Watch this space, make sure it worked + if (noiseGenSettings.isBound()) { + NoiseSettings settings = noiseGenSettings.value().noiseSettings(); + if (delegate.getBiomeSource() instanceof TFBiomeProvider source) { + WorldgenRandom random = new WorldgenRandom(new LegacyRandomSource(0L)); + TFBlendedNoise blendedNoise = new TFBlendedNoise(random); + NoiseModifier modifier = NoiseModifier.PASS; + this.warper = Optional.of(new TFTerrainWarp(settings.getCellWidth(), settings.getCellHeight(), settings.height() / settings.getCellHeight(), source, new NoiseSlider(-10.0D, 3, 0), new NoiseSlider(15.0D, 3, 0), settings, blendedNoise, modifier)); + } else { + this.warper = Optional.empty(); + } + } else { + this.warper = Optional.empty(); + } + } + + @Override + protected Codec codec() { + return CODEC; + } + + @Override + public int getBaseHeight(int x, int z, Heightmap.Types heightMap, LevelHeightAccessor level, RandomState random) { + if (warper.isEmpty()) { + return super.getBaseHeight(x, z, heightMap, level, random); + } else { + NoiseSettings settings = this.noiseGeneratorSettings.value().noiseSettings(); + int minY = Math.max(settings.minY(), level.getMinBuildHeight()); + int maxY = Math.min(settings.minY() + settings.height(), level.getMaxBuildHeight()); + int minCell = Math.floorDiv(minY, settings.getCellHeight()); + int maxCell = Math.floorDiv(maxY - minY, settings.getCellHeight()); + return maxCell <= 0 ? level.getMinBuildHeight() : this.iterateNoiseColumn(random, x, z, null, heightMap.isOpaque(), minCell, maxCell).orElse(level.getMinBuildHeight()); + } + } + + @Override + public NoiseColumn getBaseColumn(int x, int z, LevelHeightAccessor level, RandomState random) { + if (warper.isEmpty()) { + return super.getBaseColumn(x, z, level, random); + } else { + NoiseSettings settings = this.noiseGeneratorSettings.value().noiseSettings(); + int minY = Math.max(settings.minY(), level.getMinBuildHeight()); + int maxY = Math.min(settings.minY() + settings.height(), level.getMaxBuildHeight()); + int minCell = Math.floorDiv(minY, settings.getCellHeight()); + int maxCell = Math.floorDiv(maxY - minY, settings.getCellHeight()); + if (maxCell <= 0) { + return new NoiseColumn(minY, EMPTY_COLUMN); + } else { + BlockState[] ablockstate = new BlockState[maxCell * settings.getCellHeight()]; + this.iterateNoiseColumn(random, x, z, ablockstate, null, minCell, maxCell); + return new NoiseColumn(minY, ablockstate); + } + } + } + + //This logic only seems to concern very specific features, but it does need the Warp + protected OptionalInt iterateNoiseColumn(RandomState random, int x, int z, BlockState[] states, @Nullable Predicate predicate, int min, int max) { + NoiseSettings settings = this.noiseGeneratorSettings.value().noiseSettings(); + int cellWidth = settings.getCellWidth(); + int cellHeight = settings.getCellHeight(); + int xDiv = Math.floorDiv(x, cellWidth); + int zDiv = Math.floorDiv(z, cellWidth); + int xMod = Math.floorMod(x, cellWidth); + int zMod = Math.floorMod(z, cellWidth); + int xMin = xMod / cellWidth; + int zMin = zMod / cellWidth; + double[][] columns = new double[][] { + this.makeAndFillNoiseColumn(random, xDiv, zDiv, min, max), + this.makeAndFillNoiseColumn(random, xDiv, zDiv + 1, min, max), + this.makeAndFillNoiseColumn(random, xDiv + 1, zDiv, min, max), + this.makeAndFillNoiseColumn(random, xDiv + 1, zDiv + 1, min, max) + }; + + for (int cell = max - 1; cell >= 0; cell--) { + double d00 = columns[0][cell]; + double d10 = columns[1][cell]; + double d20 = columns[2][cell]; + double d30 = columns[3][cell]; + double d01 = columns[0][cell + 1]; + double d11 = columns[1][cell + 1]; + double d21 = columns[2][cell + 1]; + double d31 = columns[3][cell + 1]; + + for (int height = cellHeight - 1; height >= 0; height--) { + double dcell = height / (double)cellHeight; + double lcell = Mth.lerp3(dcell, xMin, zMin, d00, d01, d20, d21, d10, d11, d30, d31); + int layer = cell * cellHeight + height; + int maxlayer = layer + min * cellHeight; + BlockState state = this.generateBaseState(lcell, layer); + + if (states != null) { + states[layer] = state; + } + + if (predicate != null && predicate.test(state)) { + return OptionalInt.of(maxlayer + 1); + } + } + } + + return OptionalInt.empty(); + } + + @Override + public CompletableFuture createBiomes(Executor executor, RandomState random, Blender blender, StructureManager manager, ChunkAccess chunkAccess) { + //Mimic behaviour of ChunkGenerator, NoiseBasedChunkGenerator does weird things + return CompletableFuture.supplyAsync(Util.wrapThreadWithTaskName("init_biomes", () -> { + chunkAccess.fillBiomesFromNoise(this.getBiomeSource(), Climate.empty()); + return chunkAccess; + }), Util.backgroundExecutor()); + } + + //VanillaCopy of NoiseBasedChunkGenerator#fillFromNoise, only so doFill can be ours + @Override + public CompletableFuture fillFromNoise(Executor executor, Blender blender, RandomState random, StructureManager structureManager, ChunkAccess chunkAccess) { + if (warper.isEmpty()) { + return super.fillFromNoise(executor, blender, random, structureManager, chunkAccess); + } else { + NoiseSettings settings = this.noiseGeneratorSettings.value().noiseSettings(); + int cellHeight = settings.getCellHeight(); + int minY = Math.max(settings.minY(), chunkAccess.getMinBuildHeight()); + int maxY = Math.min(settings.minY() + settings.height(), chunkAccess.getMaxBuildHeight()); + int mincell = Math.floorDiv(minY, cellHeight); + int maxcell = Math.floorDiv(maxY - minY, cellHeight); + + if (maxcell <= 0) { + return CompletableFuture.completedFuture(chunkAccess); + } else { + int maxIndex = chunkAccess.getSectionIndex(maxcell * cellHeight - 1 + minY); + int minIndex = chunkAccess.getSectionIndex(minY); + Set sections = Sets.newHashSet(); + + for (int index = maxIndex; index >= minIndex; index--) { + LevelChunkSection section = chunkAccess.getSection(index); + section.acquire(); + sections.add(section); + } + + return CompletableFuture.supplyAsync(() -> this.doFill(random, chunkAccess, mincell, maxcell), Util.backgroundExecutor()).whenCompleteAsync((chunk, throwable) -> { + for (LevelChunkSection section : sections) { + section.release(); + } + }, executor); + } + } + } + + private ChunkAccess doFill(RandomState random, ChunkAccess access, int min, int max) { + NoiseSettings settings = noiseGeneratorSettings.value().noiseSettings(); + int cellWidth = settings.getCellWidth(); + int cellHeight = settings.getCellHeight(); + int cellCountX = 16 / cellWidth; + int cellCountZ = 16 / cellWidth; + Heightmap oceanfloor = access.getOrCreateHeightmapUnprimed(Heightmap.Types.OCEAN_FLOOR_WG); + Heightmap surface = access.getOrCreateHeightmapUnprimed(Heightmap.Types.WORLD_SURFACE_WG); + ChunkPos chunkpos = access.getPos(); + int minX = chunkpos.getMinBlockX(); + int minZ = chunkpos.getMinBlockZ(); + TFNoiseInterpolator interpolator = new TFNoiseInterpolator(cellCountX, max, cellCountZ, chunkpos, min, (columns, x, z, min1, max1, max12) -> fillNoiseColumn(x, z, min1, max1, max12)); + List list = Lists.newArrayList(interpolator); + list.forEach(noiseint -> noiseint.initialiseFirstX(random)); + BlockPos.MutableBlockPos mutable = new BlockPos.MutableBlockPos(); + + for (int cellX = 0; cellX < cellCountX; cellX++) { + int advX = cellX; + list.forEach((noiseint) -> noiseint.advanceX(random, advX)); + + for (int cellZ = 0; cellZ < cellCountZ; cellZ++) { + LevelChunkSection section = access.getSection(access.getSectionsCount() - 1); + + for (int cellY = max - 1; cellY >= 0; cellY--) { + int advY = cellY; + int advZ = cellZ; + list.forEach((noiseint) -> noiseint.selectYZ(advY, advZ)); + + for(int height = cellHeight - 1; height >= 0; height--) { + int minheight = (min + cellY) * cellHeight + height; + int mincellY = minheight & 15; + int minindexY = access.getSectionIndex(minheight); + + if (access.getSectionIndex(section.bottomBlockY()) != minindexY) { + section = access.getSection(minindexY); + } + + double heightdiv = (double)height / (double)cellHeight; + list.forEach((noiseint) -> noiseint.updateY(heightdiv)); + + for (int widthX = 0; widthX < cellWidth; widthX++) { + int minwidthX = minX + cellX * cellWidth + widthX; + int mincellX = minwidthX & 15; + double widthdivX = (double)widthX / (double)cellWidth; + list.forEach((noiseint) -> noiseint.updateX(widthdivX)); + + for (int widthZ = 0; widthZ < cellWidth; widthZ++) { + int minwidthZ = minZ + cellZ * cellWidth + widthZ; + int mincellZ = minwidthZ & 15; + double widthdivZ = (double)widthZ / (double)cellWidth; + double noiseval = interpolator.updateZ(widthdivZ); + //BlockState state = this.updateNoiseAndGenerateBaseState(beardifier, this.emptyAquifier, NoiseModifier.PASS, minwidthX, minheight, minwidthZ, noiseval); //TODO + BlockState state = this.generateBaseState(noiseval, minheight); + + if (state != Blocks.AIR.defaultBlockState()) { + if (state.getLightEmission() != 0 && access instanceof ProtoChunk proto) { + mutable.set(minwidthX, minheight, minwidthZ); + proto.addLight(mutable); + } + + section.setBlockState(mincellX, mincellY, mincellZ, state, false); + oceanfloor.update(mincellX, minheight, mincellZ, state); + surface.update(mincellX, minheight, mincellZ, state); + } + } + } + } + } + } + + list.forEach(TFNoiseInterpolator::swapSlices); + } + + return access; + } + + private double[] makeAndFillNoiseColumn(RandomState state, int x, int z, int min, int max) { + double[] columns = new double[max + 1]; + this.fillNoiseColumn(columns, x, z, min, max); + return columns; + } + + private void fillNoiseColumn(double[] columns, int x, int z, int min, int max) { + this.warper.get().fillNoiseColumn(columns, x, z, min, max); + } + + //Logic based on 1.16. Will only ever get the default Block, Fluid, or Air + private BlockState generateBaseState(double noiseVal, double level) { + BlockState state; + + if (noiseVal > 0.0D) { + state = this.defaultBlock; + } else if (level < this.getSeaLevel()) { + state = this.defaultFluid; + } else { + state = Blocks.AIR.defaultBlockState(); + } + + return state; + } + + @Override + public void buildSurface(WorldGenRegion world, StructureManager manager, RandomState random, ChunkAccess chunk) { + this.deformTerrainForFeature(world, chunk); + + super.buildSurface(world, manager, random, chunk); + + this.darkForestCanopyHeight.ifPresent(integer -> this.addDarkForestCanopy(world, chunk, integer)); + + addGlaciers(world, chunk); + } + + private void addGlaciers(WorldGenRegion primer, ChunkAccess chunk) { + + BlockState glacierBase = Blocks.GRAVEL.defaultBlockState(); + BlockState glacierMain = Blocks.PACKED_ICE.defaultBlockState(); + BlockState glacierTop = Blocks.ICE.defaultBlockState(); + + for (int z = 0; z < 16; z++) { + for (int x = 0; x < 16; x++) { + Optional> biome = primer.getBiome(primer.getCenter().getWorldPosition().offset(x, 0, z)).unwrapKey(); + if (biome.isEmpty() || !TFBiomes.GLACIER.location().equals(biome.get().location())) continue; + + // find the (current) top block + int gBase = -1; + for (int y = 127; y >= 0; y--) { + BlockPos old1 = primer.getCenter().getWorldPosition().offset(x, 0, z); + Block currentBlock = primer.getBlockState(old1.atY(y)).getBlock(); + if (currentBlock == Blocks.STONE) { + gBase = y; + BlockPos old = primer.getCenter().getWorldPosition().offset(x, 0, z); + primer.setBlock(old.atY(y), glacierBase, 3); + break; + } + } + + // raise the glacier from that top block + int gHeight = 32; + int gTop = Math.min(gBase + gHeight, 127); + + for (int y = gBase; y < gTop; y++) { + BlockPos old = primer.getCenter().getWorldPosition().offset(x, 0, z); + primer.setBlock(old.atY(y), glacierMain, 3); + } + BlockPos old = primer.getCenter().getWorldPosition().offset(x, 0, z); + primer.setBlock(old.atY(gTop), glacierTop, 3); + } + } + } + + @Override + public void addDebugScreenInfo(List p_223175_, RandomState p_223176_, BlockPos p_223177_) { + //do we do anything with this? we need to implement it for some reason + } + + protected final void deformTerrainForFeature(WorldGenRegion primer, ChunkAccess chunk) { + Vec2i featureRelativePos = new Vec2i(); + TFLandmark nearFeature = LegacyLandmarkPlacements.getNearestLandmark(primer.getCenter().x, primer.getCenter().z, primer, featureRelativePos); + + //Optional> structureStart = TFGenerationSettings.locateTFStructureInRange(primer.getLevel(), nearFeature, chunk.getPos().getWorldPosition(), nearFeature.size + 1); + + if (!nearFeature.requiresTerraforming) { + return; + } + + final int relativeFeatureX = featureRelativePos.x; + final int relativeFeatureZ = featureRelativePos.z; + + if (LegacyLandmarkPlacements.isTheseFeatures(nearFeature, TFLandmark.SMALL_HILL, TFLandmark.MEDIUM_HILL, TFLandmark.LARGE_HILL, TFLandmark.HYDRA_LAIR)) { + int hdiam = (nearFeature.size * 2 + 1) * 16; + + for (int xInChunk = 0; xInChunk < 16; xInChunk++) { + for (int zInChunk = 0; zInChunk < 16; zInChunk++) { + int featureDX = xInChunk - relativeFeatureX; + int featureDZ = zInChunk - relativeFeatureZ; + + float dist = (int) Mth.sqrt(featureDX * featureDX + featureDZ * featureDZ); + float hheight = (int) (Mth.cos(dist / hdiam * Mth.PI) * (hdiam / 3F)); + this.raiseHills(primer, chunk, nearFeature.size, nearFeature == TFLandmark.HYDRA_LAIR, hdiam, xInChunk, zInChunk, featureDX, featureDZ, hheight); + } + } + } else if (nearFeature == TFLandmark.HEDGE_MAZE || nearFeature == TFLandmark.NAGA_COURTYARD || nearFeature == TFLandmark.QUEST_GROVE) { + for (int xInChunk = 0; xInChunk < 16; xInChunk++) { + for (int zInChunk = 0; zInChunk < 16; zInChunk++) { + int featureDX = xInChunk - relativeFeatureX; + int featureDZ = zInChunk - relativeFeatureZ; + flattenTerrainForFeature(primer, nearFeature.size, xInChunk, zInChunk, featureDX, this.getSeaLevel(), featureDZ); + } + } + } else if (nearFeature == TFLandmark.YETI_CAVE) { + for (int xInChunk = 0; xInChunk < 16; xInChunk++) { + for (int zInChunk = 0; zInChunk < 16; zInChunk++) { + int featureDX = xInChunk - relativeFeatureX; + int featureDZ = zInChunk - relativeFeatureZ; + + this.deformTerrainForYetiLair(primer, nearFeature.size, xInChunk, zInChunk, featureDX, featureDZ); + } + } + } else if (nearFeature == TFLandmark.TROLL_CAVE) { + // troll cloud, more like + deformTerrainForTrollCloud2(primer, chunk, relativeFeatureX, relativeFeatureZ, 166); + } + + // done! + } + + private static void flattenTerrainForFeature(WorldGenRegion primer, int size, int x, int z, int dx, int dy, int dz) { + + float squishFactor = 0f; + int mazeHeight = dy + 5; + final int FEATURE_BOUNDARY = (size * 2 + 1) * 8 - 8; + + if (dx <= -FEATURE_BOUNDARY) { + squishFactor = (-dx - FEATURE_BOUNDARY) / 8.0f; + } else if (dx >= FEATURE_BOUNDARY) { + squishFactor = (dx - FEATURE_BOUNDARY) / 8.0f; + } + + if (dz <= -FEATURE_BOUNDARY) { + squishFactor = Math.max(squishFactor, (-dz - FEATURE_BOUNDARY) / 8.0f); + } else if (dz >= FEATURE_BOUNDARY) { + squishFactor = Math.max(squishFactor, (dz - FEATURE_BOUNDARY) / 8.0f); + } + + if (squishFactor > 0f) { + // blend the old terrain height to arena height + for (int y = 0; y <= 127; y++) { + BlockPos old = primer.getCenter().getWorldPosition().offset(x, 0, z); + Block currentTerrain = primer.getBlockState(old.atY(y)).getBlock(); + // we're still in ground + if (currentTerrain != Blocks.STONE) { + // we found the lowest chunk of earth + mazeHeight += ((y - mazeHeight) * squishFactor); + break; + } + } + } + + // sets the ground level to the maze height, but dont move anything in rivers + for (int y = 0; y < mazeHeight; y++) { + BlockPos old2 = primer.getCenter().getWorldPosition().offset(x, 0, z); + BlockState b = primer.getBlockState(old2.atY(y)); + BlockPos old1 = primer.getCenter().getWorldPosition().offset(x, 0, z); + if(!primer.getBiome(old1.atY(y)).is(TFBiomes.STREAM)) { + if (b.isAir() || b.getMaterial().isLiquid()) { + BlockPos old = primer.getCenter().getWorldPosition().offset(x, 0, z); + primer.setBlock(old.atY(y), Blocks.STONE.defaultBlockState(), 3); + } + } + } + + for (int y = mazeHeight; y <= 127; y++) { + BlockPos old2 = primer.getCenter().getWorldPosition().offset(x, 0, z); + BlockState b = primer.getBlockState(old2.atY(y)); + BlockPos old1 = primer.getCenter().getWorldPosition().offset(x, 0, z); + if(!primer.getBiome(old1.atY(y)).is(TFBiomes.STREAM)) { + if (!b.isAir() && !b.getMaterial().isLiquid()) { + BlockPos old = primer.getCenter().getWorldPosition().offset(x, 0, z); + primer.setBlock(old.atY(y), Blocks.AIR.defaultBlockState(), 3); + } + } + } + } + + private static void deformTerrainForTrollCloud2(WorldGenRegion primer, ChunkAccess chunkAccess, int hx, int hz, int cloudHeight) { + for (int bx = 0; bx < 4; bx++) { + for (int bz = 0; bz < 4; bz++) { + int dx = bx * 4 - hx - 2; + int dz = bz * 4 - hz - 2; + + // generate several centers for other clouds + int regionX = primer.getCenter().x + 8 >> 4; + int regionZ = primer.getCenter().z + 8 >> 4; + + long seed = regionX * 3129871L ^ regionZ * 116129781L; + seed = seed * seed * 42317861L + seed * 7L; + + int num0 = (int) (seed >> 12 & 3L); + int num1 = (int) (seed >> 15 & 3L); + int num2 = (int) (seed >> 18 & 3L); + int num3 = (int) (seed >> 21 & 3L); + int num4 = (int) (seed >> 9 & 3L); + int num5 = (int) (seed >> 6 & 3L); + int num6 = (int) (seed >> 3 & 3L); + int num7 = (int) (seed & 3L); + + int dx2 = dx + num0 * 5 - num1 * 4; + int dz2 = dz + num2 * 4 - num3 * 5; + int dx3 = dx + num4 * 5 - num5 * 4; + int dz3 = dz + num6 * 4 - num7 * 5; + + // take the minimum distance to any center + float dist0 = Mth.sqrt(dx * dx + dz * dz) / 4.0f; + float dist2 = Mth.sqrt(dx2 * dx2 + dz2 * dz2) / 3.5f; + float dist3 = Mth.sqrt(dx3 * dx3 + dz3 * dz3) / 4.5f; + + double dist = Math.min(dist0, Math.min(dist2, dist3)); + + float pr = primer.getRandom().nextFloat(); + double cv = dist - 7F - pr * 3.0F; + + // randomize depth and height + int y = cloudHeight; + int depth = 4; + + if (pr < 0.1F) { + y++; + } + if (pr > 0.6F) { + depth++; + } + if (pr > 0.9F) { + depth++; + } + + // generate cloud + for (int sx = 0; sx < 4; sx++) { + for (int sz = 0; sz < 4; sz++) { + int lx = bx * 4 + sx; + int lz = bz * 4 + sz; + + BlockPos.MutableBlockPos movingPos = primer.getCenter().getWorldPosition().mutable().move(lx, 0, lz); + + final int dY = primer.getHeight(Heightmap.Types.WORLD_SURFACE_WG, movingPos.getX(), movingPos.getZ()); + final int oceanFloor = primer.getHeight(Heightmap.Types.OCEAN_FLOOR_WG, movingPos.getX(), movingPos.getZ()); + + if (dist < 7 || cv < 0.05F) { + primer.setBlock(movingPos.setY(y), TFBlocks.WISPY_CLOUD.get().defaultBlockState(), 3); + for (int d = 1; d < depth; d++) { + primer.setBlock(movingPos.setY(y - d), TFBlocks.FLUFFY_CLOUD.get().defaultBlockState(), 3); + } + primer.setBlock(movingPos.setY(y - depth), TFBlocks.WISPY_CLOUD.get().defaultBlockState(), 3); + } else if (dist < 8 || cv < 1F) { + for (int d = 1; d < depth; d++) { + primer.setBlock(movingPos.setY(y - d), TFBlocks.FLUFFY_CLOUD.get().defaultBlockState(), 3); + } + } + + // What are you gonna do, call the cops? + forceHeightMapLevel(chunkAccess, Heightmap.Types.WORLD_SURFACE_WG, movingPos, dY); + forceHeightMapLevel(chunkAccess, Heightmap.Types.WORLD_SURFACE, movingPos, dY); + forceHeightMapLevel(chunkAccess, Heightmap.Types.OCEAN_FLOOR_WG, movingPos, oceanFloor); + forceHeightMapLevel(chunkAccess, Heightmap.Types.OCEAN_FLOOR, movingPos, oceanFloor); + } + } + } + } + } + + /** + * Raises up and hollows out the hollow hills. + */ // TODO Add some surface noise + // FIXME Make this method process whole chunks instead of columns only + private void raiseHills(WorldGenRegion world, ChunkAccess chunk, int size, boolean hydraHill, int hdiam, int xInChunk, int zInChunk, int featureDX, int featureDZ, float hillHeight) { + BlockPos.MutableBlockPos movingPos = world.getCenter().getWorldPosition().offset(xInChunk, 0, zInChunk).mutable(); + + // raise the hill + int groundHeight = chunk.getHeight(Heightmap.Types.OCEAN_FLOOR_WG, movingPos.getX(), movingPos.getZ()); + float noiseRaw = this.surfaceNoiseGetter.map(ns -> { + // FIXME Once the above FIXME is done, instantiate the noise chunk and build the hill from there + + //ns.baseNoise.instantiate() + + // (movingPos.getX() / 64f, movingPos.getZ() / 64f, 1.0f, 256) * 32f) + + return 0f; + }).orElse(0f); + float totalHeightRaw = groundHeight * 0.75f + this.getSeaLevel() * 0.25f + hillHeight + noiseRaw; + int totalHeight = (int) (((int) totalHeightRaw >> 1) * 0.375f + totalHeightRaw * 0.625f); + + for (int y = groundHeight; y <= totalHeight; y++) { + world.setBlock(movingPos.setY(y), this.defaultBlock, 3); + } + + // add the hollow part. Also turn water into stone below that + int hollow = Math.min((int) hillHeight - 4 - size, totalHeight - 3); + + // hydra lair has a piece missing + if (hydraHill) { + int mx = featureDX + 16; + int mz = featureDZ + 16; + int mdist = (int) Mth.sqrt(mx * mx + mz * mz); + int mheight = (int) (Mth.cos(mdist / (hdiam / 1.5f) * Mth.PI) * (hdiam / 1.5f)); + + hollow = Math.max(mheight - 4, hollow); + } + + // hollow out the hollow parts + int hollowFloor = hydraHill ? this.getSeaLevel() : this.getSeaLevel() - 5 - (hollow >> 3); + + for (int y = hollowFloor + 1; y < hollowFloor + hollow; y++) { + world.setBlock(movingPos.setY(y), Blocks.AIR.defaultBlockState(), 3); + } + } + + private void deformTerrainForYetiLair(WorldGenRegion primer, int size, int xInChunk, int zInChunk, int featureDX, int featureDZ) { + float squishFactor = 0f; + int topHeight = this.getSeaLevel() + 24; + int outerBoundary = (size * 2 + 1) * 8 - 8; + + // outer boundary + if (featureDX <= -outerBoundary) { + squishFactor = (-featureDX - outerBoundary) / 8.0f; + } else if (featureDX >= outerBoundary) { + squishFactor = (featureDX - outerBoundary) / 8.0f; + } + + if (featureDZ <= -outerBoundary) { + squishFactor = Math.max(squishFactor, (-featureDZ - outerBoundary) / 8.0f); + } else if (featureDZ >= outerBoundary) { + squishFactor = Math.max(squishFactor, (featureDZ - outerBoundary) / 8.0f); + } + + // inner boundary + int caveBoundary = size * 2 * 8 - 8; + int hollowCeiling; + + int offset = Math.min(Math.abs(featureDX), Math.abs(featureDZ)); + hollowCeiling = this.getSeaLevel() + 40 - offset * 4; + + // center square cave + if (featureDX >= -caveBoundary && featureDZ >= -caveBoundary && featureDX <= caveBoundary && featureDZ <= caveBoundary) { + hollowCeiling = this.getSeaLevel() + 16; + } + + // slope ceiling slightly + hollowCeiling -= offset / 6; + + // max out ceiling 8 blocks from roof + hollowCeiling = Math.min(hollowCeiling, this.getSeaLevel() + 16); + + // floor, also with slight slope + int hollowFloor = this.getSeaLevel() - 4 + offset / 6; + + BlockPos.MutableBlockPos movingPos = primer.getCenter().getWorldPosition().offset(xInChunk, 0, zInChunk).mutable(); + + if (squishFactor > 0f) { + // blend the old terrain height to arena height + for (int y = primer.getMinBuildHeight(); y <= primer.getMaxBuildHeight(); y++) { + if (!this.defaultBlock.equals(primer.getBlockState(movingPos.setY(y)))) { + // we found the lowest chunk of earth + topHeight += (y - topHeight) * squishFactor; + hollowFloor += (y - hollowFloor) * squishFactor; + break; + } + } + } + + // carve the cave into the stone + + // add stone + for (int y = primer.getMinBuildHeight(); y < topHeight; y++) { + Block b = primer.getBlockState(movingPos.setY(y)).getBlock(); + if (b == Blocks.AIR || b == Blocks.WATER) { + primer.setBlock(movingPos.setY(y), this.defaultBlock, 3); + } + } + + // hollow out inside + for (int y = hollowFloor + 1; y < hollowCeiling; ++y) { + primer.setBlock(movingPos.setY(y), Blocks.AIR.defaultBlockState(), 3); + } + + // ice floor + if (hollowFloor < hollowCeiling && hollowFloor < this.getSeaLevel() + 3) { + primer.setBlock(movingPos.setY(hollowFloor), Blocks.PACKED_ICE.defaultBlockState(), 3); + } + } + + /** + * Adds dark forest canopy. This version uses the "unzoomed" array of biomes used in land generation to determine how many of the nearby blocks are dark forest + */ + private void addDarkForestCanopy(WorldGenRegion primer, ChunkAccess chunk, int height) { + BlockPos blockpos = primer.getCenter().getWorldPosition(); + int[] thicks = new int[5 * 5]; + boolean biomeFound = false; + + for (int dZ = 0; dZ < 5; dZ++) { + for (int dX = 0; dX < 5; dX++) { + for (int bx = -1; bx <= 1; bx++) { + for (int bz = -1; bz <= 1; bz++) { + BlockPos p = blockpos.offset((dX + bx) << 2, 0, (dZ + bz) << 2); + Biome biome = biomeSource.getNoiseBiome(p.getX() >> 2, 256, p.getZ() >> 2, null).value(); + if (TFBiomes.DARK_FOREST.location().equals(primer.registryAccess().registryOrThrow(Registries.BIOME).getKey(biome)) || TFBiomes.DARK_FOREST_CENTER.location().equals(primer.registryAccess().registryOrThrow(Registries.BIOME).getKey(biome))) { + thicks[dX + dZ * 5]++; + biomeFound = true; + } + } + } + } + } + + if (!biomeFound) return; + + Vec2i nearCenter = new Vec2i(); + TFLandmark nearFeature = LegacyLandmarkPlacements.getNearestLandmark(primer.getCenter().x, primer.getCenter().z, primer, nearCenter); + + double d = 0.03125D; + //depthBuffer = noiseGen4.generateNoiseOctaves(depthBuffer, chunkX * 16, chunkZ * 16, 0, 16, 16, 1, d * 2D, d * 2D, d * 2D); + + for (int dZ = 0; dZ < 16; dZ++) { + for (int dX = 0; dX < 16; dX++) { + int qx = dX >> 2; + int qz = dZ >> 2; + + float xweight = (dX % 4) * 0.25F + 0.125F; + float zweight = (dZ % 4) * 0.25F + 0.125F; + + float thickness = thicks[qx + (qz) * 5] * (1F - xweight) * (1F - zweight) + + thicks[qx + 1 + (qz) * 5] * (xweight) * (1F - zweight) + + thicks[qx + (qz + 1) * 5] * (1F - xweight) * (zweight) + + thicks[qx + 1 + (qz + 1) * 5] * (xweight) * (zweight) + - 4; + + // make sure we're not too close to the tower + if (nearFeature == TFLandmark.DARK_TOWER) { + int hx = nearCenter.x; + int hz = nearCenter.z; + + int rx = dX - hx; + int rz = dZ - hz; + int dist = (int) Mth.sqrt(rx * rx + rz * rz); + + if (dist < 24) { + thickness -= (24 - dist); + } + } + + // TODO Clean up this math + if (thickness > 1) { + // We can use the Deltas here because the methods called will just + final int dY = chunk.getHeight(Heightmap.Types.WORLD_SURFACE_WG, dX, dZ); + final int oceanFloor = chunk.getHeight(Heightmap.Types.OCEAN_FLOOR_WG, dX, dZ); + BlockPos pos = primer.getCenter().getWorldPosition().offset(dX, dY, dZ); + + // Skip any blocks over water + if (chunk.getBlockState(pos).getMaterial().isLiquid()) + continue; + + // just use the same noise generator as the terrain uses for stones + //int noise = Math.min(3, (int) (depthBuffer[dZ & 15 | (dX & 15) << 4] / 1.25f)); + int noise = 0;// FIXME [1.18] Math.min(3, (int) (this.surfaceNoiseGetter.getSurfaceNoiseValue((blockpos.getX() + dX) * 0.0625D, (blockpos.getZ() + dZ) * 0.0625D, 0.0625D, dX * 0.0625D) * 15F / 1.25F)); + + // manipulate top and bottom + int treeBottom = pos.getY() + height - (int) (thickness * 0.5F); + int treeTop = treeBottom + (int) (thickness * 1.5F); + + treeBottom -= noise; + + BlockState darkLeaves = TFBlocks.HARDENED_DARK_LEAVES.get().defaultBlockState(); + + for (int y = treeBottom; y < treeTop; y++) { + primer.setBlock(pos.atY(y), darkLeaves, 3); + } + + // What are you gonna do, call the cops? + forceHeightMapLevel(chunk, Heightmap.Types.WORLD_SURFACE_WG, pos, dY); + forceHeightMapLevel(chunk, Heightmap.Types.WORLD_SURFACE, pos, dY); + forceHeightMapLevel(chunk, Heightmap.Types.OCEAN_FLOOR_WG, pos, oceanFloor); + forceHeightMapLevel(chunk, Heightmap.Types.OCEAN_FLOOR, pos, oceanFloor); + } + } + } + } + + static void forceHeightMapLevel(ChunkAccess chunk, Heightmap.Types type, BlockPos pos, int dY) { + chunk.getOrCreateHeightmapUnprimed(type).setHeight(pos.getX() & 15, pos.getZ() & 15, dY + 1); + } + + private static int getSpawnListIndexAt(StructureStart start, BlockPos pos) { + int highestFoundIndex = -1; + for (StructurePiece component : start.getPieces()) { + if (component.getBoundingBox().isInside(pos)) { + if (component instanceof TFStructureComponent tfComponent) { + if (tfComponent.spawnListIndex > highestFoundIndex) + highestFoundIndex = tfComponent.spawnListIndex; + } else + return 0; + } + } + return highestFoundIndex; + } + + @Nullable + public static List gatherPotentialSpawns(StructureManager structureManager, MobCategory classification, BlockPos pos) { + for (Structure structure : structureManager.registryAccess().registryOrThrow(Registries.STRUCTURE)) { + if (structure instanceof ControlledSpawns landmark) { + StructureStart start = structureManager.getStructureAt(pos, structure); + if (!start.isValid()) + continue; + + if (classification != MobCategory.MONSTER) + return landmark.getSpawnableList(classification); + + if (start instanceof TFStructureStart s && s.isConquered()) + return null; + + // FIXME Make interface for this method? + if (structure instanceof HollowHillStructure hollowHill && !hollowHill.canSpawnMob(pos, start.getBoundingBox())) + return null; + + final int index = getSpawnListIndexAt(start, pos); + if (index < 0) + return null; + return landmark.getSpawnableMonsterList(index); + } + } + return null; + } + + @Override + public WeightedRandomList getMobsAt(Holder biome, StructureManager structureManager, MobCategory mobCategory, BlockPos pos) { + List potentialStructureSpawns = gatherPotentialSpawns(structureManager, mobCategory, pos); + if (potentialStructureSpawns != null) + return WeightedRandomList.create(potentialStructureSpawns); + + return super.getMobsAt(biome, structureManager, mobCategory, pos); + } + + public TFLandmark pickLandmarkForChunk(final ChunkPos chunk, final WorldGenLevel world) { + return this.pickLandmarkForChunk(chunk.x, chunk.z, world); + } + + public TFLandmark pickLandmarkForChunk(int x, int z, final WorldGenLevel world) { + return LegacyLandmarkPlacements.pickLandmarkForChunk(x, z, world); + } + + public boolean isLandmarkPickedForChunk(TFLandmark landmark, Holder biome, int chunkX, int chunkZ, long seed) { + if (!LegacyLandmarkPlacements.chunkHasLandmarkCenter(chunkX, chunkZ)) return false; + + var biomeKey = biome.unwrapKey(); + if (biomeKey.isEmpty()) return false; + + return this.biomeLandmarkOverrides.containsKey(biomeKey.get()) + ? this.biomeGuaranteedLandmark(biomeKey.get(), landmark) + : landmark == LegacyLandmarkPlacements.pickVarietyLandmark(chunkX, chunkZ, seed); + } + + public boolean biomeGuaranteedLandmark(ResourceKey biome, TFLandmark landmark) { + if (!this.biomeLandmarkOverrides.containsKey(biome)) return false; + return this.biomeLandmarkOverrides.getOrDefault(biome, ImmutableSet.of()).contains(landmark); + } + + //copy of ChunkGenerator.createStructures, we just need to allow TF structures to correctly spawn + @Override + public void createStructures(RegistryAccess access, ChunkGeneratorStructureState state, StructureManager manager, ChunkAccess chunk, StructureTemplateManager templateManager) { + ChunkPos chunkpos = chunk.getPos(); + SectionPos sectionpos = SectionPos.bottomOf(chunk); + RandomState randomstate = state.randomState(); + state.possibleStructureSets().forEach((p_255564_) -> { + StructurePlacement structureplacement = p_255564_.value().placement(); + List list = p_255564_.value().structures(); + + for(StructureSet.StructureSelectionEntry structureset$structureselectionentry : list) { + StructureStart structurestart = manager.getStartForStructure(sectionpos, structureset$structureselectionentry.structure().value(), chunk); + if (structurestart != null && structurestart.isValid()) { + return; + } + } + + //TF: check if we're trying to add a TF structure and handle that accordingly. We need to still feed the chunk generator into the placement method, so we absolutely have to do this + //stupid mojang always changing everything + if ((structureplacement instanceof BiomeForcedLandmarkPlacement forced && forced.isTFPlacementChunk(this, state, chunkpos.x, chunkpos.z)) || structureplacement.isStructureChunk(state, chunkpos.x, chunkpos.z)) { + if (list.size() == 1) { + this.tryGenerateStructure(list.get(0), manager, access, randomstate, templateManager, state.getLevelSeed(), chunk, chunkpos, sectionpos); + } else { + ArrayList arraylist = new ArrayList<>(list.size()); + arraylist.addAll(list); + WorldgenRandom worldgenrandom = new WorldgenRandom(new LegacyRandomSource(0L)); + worldgenrandom.setLargeFeatureSeed(state.getLevelSeed(), chunkpos.x, chunkpos.z); + int i = 0; + + for(StructureSet.StructureSelectionEntry structureset$structureselectionentry1 : arraylist) { + i += structureset$structureselectionentry1.weight(); + } + + while(!arraylist.isEmpty()) { + int j = worldgenrandom.nextInt(i); + int k = 0; + + for(StructureSet.StructureSelectionEntry structureset$structureselectionentry2 : arraylist) { + j -= structureset$structureselectionentry2.weight(); + if (j < 0) { + break; + } + + ++k; + } + + StructureSet.StructureSelectionEntry structureset$structureselectionentry3 = arraylist.get(k); + if (this.tryGenerateStructure(structureset$structureselectionentry3, manager, access, randomstate, templateManager, state.getLevelSeed(), chunk, chunkpos, sectionpos)) { + return; + } + + arraylist.remove(k); + i -= structureset$structureselectionentry3.weight(); + } + + } + } + }); + } + + @Nullable + @Override + public Pair> findNearestMapStructure(ServerLevel level, HolderSet targetStructures, BlockPos pos, int searchRadius, boolean skipKnownStructures) { + ChunkGeneratorStructureState state = level.getChunkSource().getGeneratorState(); + + @Nullable + Pair> nearest = super.findNearestMapStructure(level, targetStructures, pos, searchRadius, skipKnownStructures); + + Map>> placementSetMap = new Object2ObjectArrayMap<>(); + for (Holder holder : targetStructures) { + for (StructurePlacement structureplacement : state.getPlacementsForStructure(holder)) { + if (structureplacement instanceof BiomeForcedLandmarkPlacement landmarkPlacement) { + placementSetMap.computeIfAbsent(landmarkPlacement, v -> new ObjectArraySet<>()).add(holder); + } + } + } + + if (placementSetMap.isEmpty()) return nearest; + + double distance = nearest == null ? Double.MAX_VALUE : nearest.getFirst().distSqr(pos); + + for (BlockPos landmarkCenterPosition : LegacyLandmarkPlacements.landmarkCenterScanner(pos, Mth.ceil(Mth.sqrt(searchRadius)))) { + for (Map.Entry>> landmarkPlacement : placementSetMap.entrySet()) { + if (!landmarkPlacement.getKey().isTFPlacementChunk(this, state, landmarkCenterPosition.getX() >> 4, landmarkCenterPosition.getZ() >> 4)) continue; + + for (Holder targetStructure : targetStructures) { + if (landmarkPlacement.getValue().contains(targetStructure)) { + final double newDistance = landmarkCenterPosition.distToLowCornerSqr(pos.getX(), landmarkCenterPosition.getY(), pos.getZ()); + + if (newDistance < distance) { + nearest = new Pair<>(landmarkCenterPosition, targetStructure); + distance = newDistance; + } + } + } + } + } + + return nearest; + } +} diff --git a/src/main/java/twilightforest/world/components/chunkgenerators/ChunkGeneratorWrapper.java b/src/main/java/twilightforest/world/components/chunkgenerators/ChunkGeneratorWrapper.java new file mode 100644 index 0000000000..b746b690f7 --- /dev/null +++ b/src/main/java/twilightforest/world/components/chunkgenerators/ChunkGeneratorWrapper.java @@ -0,0 +1,80 @@ +package twilightforest.world.components.chunkgenerators; + +import net.minecraft.core.HolderSet; +import net.minecraft.core.Registry; +import net.minecraft.server.level.WorldGenRegion; +import net.minecraft.world.level.LevelHeightAccessor; +import net.minecraft.world.level.NoiseColumn; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.biome.BiomeManager; +import net.minecraft.world.level.chunk.ChunkAccess; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.GenerationStep; +import net.minecraft.world.level.levelgen.Heightmap; +import net.minecraft.world.level.levelgen.RandomState; +import net.minecraft.world.level.levelgen.blending.Blender; +import net.minecraft.world.level.levelgen.structure.StructureSet; + +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.Executor; + +public abstract class ChunkGeneratorWrapper extends ChunkGenerator { + public final ChunkGenerator delegate; + + public ChunkGeneratorWrapper(ChunkGenerator delegate) { + super(delegate.getBiomeSource()); + + this.delegate = delegate; + } + + @Override + public void applyCarvers(WorldGenRegion region, long seed, RandomState random, BiomeManager biomeManager, StructureManager manager, ChunkAccess chunkAccess, GenerationStep.Carving carving) { + this.delegate.applyCarvers(region, seed, random, biomeManager, manager, chunkAccess, carving); + } + + @Override + public void buildSurface(WorldGenRegion level, StructureManager manager, RandomState random, ChunkAccess chunkAccess) { + this.delegate.buildSurface(level, manager, random, chunkAccess); + } + + @Override + public void spawnOriginalMobs(WorldGenRegion region) { + this.delegate.spawnOriginalMobs(region); + } + + @Override + public int getSpawnHeight(LevelHeightAccessor level) { + return this.delegate.getSpawnHeight(level); + } + + @Override + public int getGenDepth() { + return this.delegate.getGenDepth(); + } + + @Override + public CompletableFuture fillFromNoise(Executor executor, Blender blender, RandomState random, StructureManager structureManager, ChunkAccess chunkAccess) { + return this.delegate.fillFromNoise(executor, blender, random, structureManager, chunkAccess); + } + + @Override + public int getSeaLevel() { + return this.delegate.getSeaLevel(); + } + + @Override + public int getMinY() { + return this.delegate.getMinY(); + } + + @Override + public int getBaseHeight(int x, int z, Heightmap.Types heightMap, LevelHeightAccessor level, RandomState random) { + return this.delegate.getBaseHeight(x, z, heightMap, level, random); + } + + @Override + public NoiseColumn getBaseColumn(int x, int z, LevelHeightAccessor level, RandomState random) { + return this.delegate.getBaseColumn(x, z, level, random); + } +} diff --git a/src/main/java/twilightforest/world/components/chunkgenerators/package-info.java b/src/main/java/twilightforest/world/components/chunkgenerators/package-info.java new file mode 100644 index 0000000000..b2852dfdde --- /dev/null +++ b/src/main/java/twilightforest/world/components/chunkgenerators/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.world.components.chunkgenerators; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/world/components/chunkgenerators/warp/NoiseModifier.java b/src/main/java/twilightforest/world/components/chunkgenerators/warp/NoiseModifier.java new file mode 100644 index 0000000000..0ced9b1e23 --- /dev/null +++ b/src/main/java/twilightforest/world/components/chunkgenerators/warp/NoiseModifier.java @@ -0,0 +1,10 @@ +package twilightforest.world.components.chunkgenerators.warp; + +/* + * This generally exists as it did in 1.17. Used for modifiers such as Noodle Caves + */ +public interface NoiseModifier { + NoiseModifier PASS = ((density, height, zWidth, xWidth) -> density); + + double modifyNoise(double density, int height, int zWidth, int xWidth); +} diff --git a/src/main/java/twilightforest/world/components/chunkgenerators/warp/NoiseSlider.java b/src/main/java/twilightforest/world/components/chunkgenerators/warp/NoiseSlider.java new file mode 100644 index 0000000000..992f73a20a --- /dev/null +++ b/src/main/java/twilightforest/world/components/chunkgenerators/warp/NoiseSlider.java @@ -0,0 +1,26 @@ +package twilightforest.world.components.chunkgenerators.warp; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.util.ExtraCodecs; +import net.minecraft.util.Mth; + +/* + * VanillaCopy of NoiseSlider from 1.18.2, ported into 1.19, because I said so + */ +public record NoiseSlider(double target, int size, int offset) { + public static final Codec CODEC = RecordCodecBuilder.create((instance) -> instance.group( + Codec.DOUBLE.fieldOf("target").forGetter(obj -> obj.target), + ExtraCodecs.NON_NEGATIVE_INT.fieldOf("size").forGetter(obj -> obj.size), + Codec.INT.fieldOf("offset").forGetter(obj -> obj.offset)) + .apply(instance, NoiseSlider::new)); + + public double applySlide(double density, double y) { + if (this.size <= 0) { + return density; + } else { + double slide = (y - (double)this.offset) / (double)this.size; + return Mth.clampedLerp(this.target, density, slide); + } + } +} diff --git a/src/main/java/twilightforest/world/components/chunkgenerators/warp/TFBlendedNoise.java b/src/main/java/twilightforest/world/components/chunkgenerators/warp/TFBlendedNoise.java new file mode 100644 index 0000000000..a4516f1ce3 --- /dev/null +++ b/src/main/java/twilightforest/world/components/chunkgenerators/warp/TFBlendedNoise.java @@ -0,0 +1,67 @@ +package twilightforest.world.components.chunkgenerators.warp; + +import net.minecraft.util.Mth; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.levelgen.synth.BlendedNoise; +import net.minecraft.world.level.levelgen.synth.ImprovedNoise; +import net.minecraft.world.level.levelgen.synth.PerlinNoise; + +/* + * Honestly, this just makes absolutely certain that things go the way we want it. Might not even need this? Who knows. + */ +public class TFBlendedNoise extends BlendedNoise { + + public TFBlendedNoise(RandomSource random) { + super(random, 0.9999999814507745, 0.9999999814507745, 80.0, 160.0, 0.0D); + } + + public double sampleAndClampNoise(int x, int y, int z, double scaleXZ, double scaleY, double factorXZ, double factorY) { + double d0 = 0.0D; + double d1 = 0.0D; + double d2 = 0.0D; + double scale = 1.0D; + + for(int oct = 0; oct < 8; ++oct) { + ImprovedNoise improvednoise = this.mainNoise.getOctaveNoise(oct); + if (improvednoise != null) { + d2 += improvednoise.noise( + PerlinNoise.wrap((double)x * factorXZ * scale), + PerlinNoise.wrap((double)y * factorY * scale), + PerlinNoise.wrap((double)z * factorXZ * scale), + factorY * scale, + (double)y * factorY * scale) / scale; + } + + scale /= 2.0D; + } + + double d8 = (d2 / 10.0D + 1.0D) / 2.0D; + boolean flag1 = d8 >= 1.0D; + boolean flag2 = d8 <= 0.0D; + scale = 1.0D; + + for(int j = 0; j < 16; ++j) { + double d4 = PerlinNoise.wrap((double)x * scaleXZ * scale); + double d5 = PerlinNoise.wrap((double)y * scaleY * scale); + double d6 = PerlinNoise.wrap((double)z * scaleXZ * scale); + double d7 = scaleY * scale; + if (!flag1) { + ImprovedNoise minimumOct = this.minLimitNoise.getOctaveNoise(j); + if (minimumOct != null) { + d0 += minimumOct.noise(d4, d5, d6, d7, (double)y * d7) / scale; + } + } + + if (!flag2) { + ImprovedNoise maximumOct = this.maxLimitNoise.getOctaveNoise(j); + if (maximumOct != null) { + d1 += maximumOct.noise(d4, d5, d6, d7, (double)y * d7) / scale; + } + } + + scale /= 2.0D; + } + + return Mth.clampedLerp(d0 / 512.0D, d1 / 512.0D, d8); + } +} diff --git a/src/main/java/twilightforest/world/components/chunkgenerators/warp/TFNoiseInterpolator.java b/src/main/java/twilightforest/world/components/chunkgenerators/warp/TFNoiseInterpolator.java new file mode 100644 index 0000000000..6b559920fe --- /dev/null +++ b/src/main/java/twilightforest/world/components/chunkgenerators/warp/TFNoiseInterpolator.java @@ -0,0 +1,111 @@ +package twilightforest.world.components.chunkgenerators.warp; + +import net.minecraft.util.Mth; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.levelgen.RandomState; + +//VanillaCopy of NoiseInterpolator from 1.17.1. Just easier to control than the existing NoiseInterpolator +public class TFNoiseInterpolator { + + private final int cellCountY; + private final int cellCountZ; + private final int cellMinY; + private final NoiseFiller noiseFiller; + private double[][] slice0; + private double[][] slice1; + private final int firstX; + private final int firstZ; + + private double noise000; + private double noise001; + private double noise100; + private double noise101; + private double noise010; + private double noise011; + private double noise110; + private double noise111; + + private double value; + private double valueZ0; + private double valueZ1; + private double valueXZ00; + private double valueXZ10; + private double valueXZ01; + private double valueXZ11; + + public TFNoiseInterpolator(int x, int max, int z, ChunkPos pos, int min, NoiseFiller filler) { + this.cellCountY = max; + this.cellCountZ = z; + this.cellMinY = min; + this.noiseFiller = filler; + this.slice0 = allocateSlice(max, z); + this.slice1 = allocateSlice(max, z); + this.firstX = pos.x * x; + this.firstZ = pos.z * z; + } + + private static double[][] allocateSlice(int y, int z) { + int height = y + 1; + int width = z + 1; + double[][] cells = new double[width][height]; + + for (int cell = 0; cell < width; cell++) { + cells[cell] = new double[height]; + } + + return cells; + } + + public void initialiseFirstX(RandomState random) { + this.fillSlice(random, this.slice0, this.firstX); + } + + public void advanceX(RandomState random, int advance) { + this.fillSlice(random, this.slice1, this.firstX + advance + 1); + } + + private void fillSlice(RandomState random, double[][] slices, int cell) { + for (int width = 0; width < this.cellCountZ + 1; width++) { + int cellWidth = this.firstZ + width; + this.noiseFiller.fillNoiseColumn(random, slices[width], cell, cellWidth, this.cellMinY, this.cellCountY); + } + } + + public void selectYZ(int y, int z) { + this.noise000 = this.slice0[ z ][ y ]; + this.noise001 = this.slice0[z + 1][ y ]; + this.noise100 = this.slice1[ z ][ y ]; + this.noise101 = this.slice1[z + 1][ y ]; + this.noise010 = this.slice0[ z ][y + 1]; + this.noise011 = this.slice0[z + 1][y + 1]; + this.noise110 = this.slice1[ z ][y + 1]; + this.noise111 = this.slice1[z + 1][y + 1]; + } + + public void updateX(double x) { + this.valueZ0 = Mth.lerp(x, this.valueXZ00, this.valueXZ10); + this.valueZ1 = Mth.lerp(x, this.valueXZ01, this.valueXZ11); + } + + public void updateY(double y) { + this.valueXZ00 = Mth.lerp(y, this.noise000, this.noise010); + this.valueXZ10 = Mth.lerp(y, this.noise100, this.noise110); + this.valueXZ01 = Mth.lerp(y, this.noise001, this.noise011); + this.valueXZ11 = Mth.lerp(y, this.noise101, this.noise111); + } + + public double updateZ(double z) { + this.value = Mth.lerp(z, this.valueZ0, this.valueZ1); + return this.value; + } + + public void swapSlices() { + double[][] swap = this.slice0; + this.slice0 = this.slice1; + this.slice1 = swap; + } + + public interface NoiseFiller { + void fillNoiseColumn(RandomState random, double[] columns, int x, int z, int min, int max); + } +} diff --git a/src/main/java/twilightforest/world/components/chunkgenerators/warp/TFTerrainWarp.java b/src/main/java/twilightforest/world/components/chunkgenerators/warp/TFTerrainWarp.java new file mode 100644 index 0000000000..af7400dc83 --- /dev/null +++ b/src/main/java/twilightforest/world/components/chunkgenerators/warp/TFTerrainWarp.java @@ -0,0 +1,129 @@ +package twilightforest.world.components.chunkgenerators.warp; + +import net.minecraft.Util; +import net.minecraft.util.Mth; +import net.minecraft.world.level.biome.BiomeSource; +import net.minecraft.world.level.levelgen.NoiseSettings; +import net.minecraft.world.level.levelgen.synth.BlendedNoise; +import twilightforest.world.components.biomesources.TFBiomeProvider; + +import java.util.Optional; + +/* + * This is where the magic of warping terrain with biomes happens. + * This will require having the BiomeSource be specific or at least parent the specific BiomeSource otherwise the logic can't run + */ +public class TFTerrainWarp { + + private final int cellWidth; + private final int cellHeight; + private final int cellCountY; + private final BiomeSource biomeSource; + private final NoiseSettings noiseSettings; + private final NoiseSlider topSlide; + private final NoiseSlider bottomSlide; + private final BlendedNoise blendedNoise; + private final double dimensionDensityFactor; + private final double dimensionDensityOffset; + public final NoiseModifier caveNoiseModifier; + public static final float[] BIOME_WEIGHTS = Util.make(new float[25], (afloat) -> { + for(int x = -2; x <= 2; ++x) { + for(int z = -2; z <= 2; ++z) { + float weight = 10.0F / Mth.sqrt((float)(x * x + z * z) + 0.2F); + afloat[x + 2 + (z + 2) * 5] = weight; + } + } + }); + + public TFTerrainWarp(int width, int height, int yCount, BiomeSource source, NoiseSlider topslide, NoiseSlider bottomslide, NoiseSettings settings, BlendedNoise blend, NoiseModifier modifier) { + this.cellWidth = width; + this.cellHeight = height; + this.cellCountY = yCount; + this.biomeSource = source; + this.noiseSettings = settings; + this.topSlide = topslide; + this.bottomSlide = bottomslide; + this.blendedNoise = blend; + //Fallbacks will never be met as this will crash to enforce correct source + this.dimensionDensityFactor = source instanceof TFBiomeProvider tfsource ? tfsource.getBaseFactor() : 1.0F; + this.dimensionDensityOffset = source instanceof TFBiomeProvider tfsource ? tfsource.getBaseOffset() : 0.0F; + this.caveNoiseModifier = modifier; + } + + public void fillNoiseColumn(double[] adouble, int x, int z, int min, int max) { + if (biomeSource instanceof TFBiomeProvider source) { + float totalScale = 0.0F; + float totalDepth = 0.0F; + float totalContribution = 0.0F; + float centerDepth = source.getBiomeDepth(x, z); + + for (int offX = -2; offX <= 2; ++offX) { + for (int offZ = -2; offZ <= 2; ++offZ) { + Optional terrainColumn = source.getTerrainColumn(x + offX, z + offZ); + + if (terrainColumn.isEmpty()) continue; + + float neighborDepth = terrainColumn.get().depth(); + float neighborScale = terrainColumn.get().scale(); + + // If the center column is lower than the given neighboring column, then diminish its height contribution + float topographicContribution = neighborDepth > centerDepth ? 0.5F : 1.0F; + float piecewiseInfluence = topographicContribution * BIOME_WEIGHTS[offX + 2 + (offZ + 2) * 5] / (neighborDepth + 2.0F); + totalDepth += neighborDepth * piecewiseInfluence; + totalScale += neighborScale * piecewiseInfluence; + totalContribution += piecewiseInfluence; + } + } + + float depthNormalized = totalDepth / totalContribution; + float scaleNormalized = totalScale / totalContribution; + double modifiedDepth = depthNormalized * 0.5F - 0.125F; + double modifiedScale = scaleNormalized * 0.9F + 0.1F; + double offset = modifiedDepth * 0.265625D; + double factor = 96.0D / modifiedScale; + +// double scaleXZ = 684.412D * settings.noiseSamplingSettings().xzScale(); +// double scaleY = 684.412D * settings.noiseSamplingSettings().yScale(); +// double factorXZ = scaleXZ / settings.noiseSamplingSettings().xzFactor(); +// double factorY = scaleY / settings.noiseSamplingSettings().yFactor(); +// double density = -0.46875; + + if (blendedNoise instanceof TFBlendedNoise blend) { + double scaleXZ = 684.412D * blend.xzScale; + double scaleY = 684.412D * blend.yScale; + double factorXZ = scaleXZ / blend.xzFactor; + double factorY = scaleY / blend.yFactor; + double density = -0.46875; + + for (int index = 0; index <= max; ++index) { + int y = index + min; + double noise = blend.sampleAndClampNoise(x, y, z, scaleXZ, scaleY, factorXZ, factorY); + double totaldensity = this.computeInitialDensity(y, offset, factor, density) + noise; + totaldensity = this.caveNoiseModifier.modifyNoise(totaldensity, y * this.cellHeight, z * this.cellWidth, x * this.cellWidth); + totaldensity = this.applySlide(totaldensity, y); + adouble[index] = totaldensity; + } + } else { + throw new IllegalArgumentException("BlendedNoise is not an instance of TFBlendedNoise"); + } + + } else { + throw new IllegalArgumentException("BiomeSource is not an instance of TFBiomeProvider"); + } + } + + protected double computeInitialDensity(int y, double offset, double factor, double density) { + double base = 1.0D - (double)y * 2.0D / 32.0D + density; + double factored = base * this.dimensionDensityFactor + this.dimensionDensityOffset; + double total = (factored + offset) * factor; + return total * (double)(total > 0.0D ? 4 : 1); + } + + protected double applySlide(double density, int height) { + int i = Math.floorDiv(this.noiseSettings.minY(), this.cellHeight); + int j = height - i; + density = this.topSlide.applySlide(density, this.cellCountY - j); + density = this.bottomSlide.applySlide(density, j); + return density; + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/world/components/chunkgenerators/warp/TerrainColumn.java b/src/main/java/twilightforest/world/components/chunkgenerators/warp/TerrainColumn.java new file mode 100644 index 0000000000..cb8711c205 --- /dev/null +++ b/src/main/java/twilightforest/world/components/chunkgenerators/warp/TerrainColumn.java @@ -0,0 +1,86 @@ +package twilightforest.world.components.chunkgenerators.warp; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import it.unimi.dsi.fastutil.floats.Float2ObjectAVLTreeMap; +import it.unimi.dsi.fastutil.floats.Float2ObjectMap; +import it.unimi.dsi.fastutil.floats.Float2ObjectSortedMap; +import net.minecraft.core.Holder; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.RegistryFixedCodec; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.biome.Biome; +import org.jetbrains.annotations.NotNull; +import twilightforest.util.Codecs; + +import java.util.Map; +import java.util.function.BinaryOperator; +import java.util.stream.Stream; + +public final class TerrainColumn implements Comparable { + public static final Codec CODEC = RecordCodecBuilder.create(instance -> + instance.group( + RegistryFixedCodec.create(Registries.BIOME).fieldOf("key_biome").forGetter(o -> o.keyBiome), + Codecs.floatTreeCodec(Biome.CODEC).fieldOf("biome_layers").forGetter(o -> o.biomes), + Codec.FLOAT.fieldOf("depth").forGetter(o -> o.noiseDepth), + Codec.FLOAT.fieldOf("scale").forGetter(o -> o.noiseScale) + ).apply(instance, TerrainColumn::new)); + private final ResourceKey resourceKey; + private final Holder keyBiome; + private final Float2ObjectSortedMap> biomes; + private final float noiseDepth; + private final float noiseScale; + + public TerrainColumn(Holder keyBiome, Float2ObjectSortedMap> biomes, float noiseDepth, float noiseScale) { + this.keyBiome = keyBiome; + this.resourceKey = this.keyBiome.unwrapKey().get(); + this.biomes = biomes; + this.noiseDepth = noiseDepth; + this.noiseScale = noiseScale; + + if (biomes instanceof Float2ObjectAVLTreeMap> treeMap) + treeMap.defaultReturnValue(this.keyBiome); + } + + public Stream> getBiomes() { + return this.biomes.float2ObjectEntrySet().stream().map(Map.Entry::getValue); + } + + public boolean is(Holder biome) { + return this.keyBiome.value().equals(biome.value()); + } + + public boolean is(ResourceKey biome) { + return this.keyBiome.is(biome); + } + + public Holder getBiome(int biomeElevation) { + return this.reduce((a, b) -> { + float aDelta = a.getFloatKey() - biomeElevation; + float bDelta = b.getFloatKey() - biomeElevation; + + return Math.abs(aDelta) <= Math.abs(bDelta) ? a : b; + }, this.keyBiome); + } + + private Holder reduce(BinaryOperator>> reducer, Holder other) { + return this.biomes.float2ObjectEntrySet().stream().reduce(reducer).map(Map.Entry::getValue).orElse(other); + } + + public float depth() { + return this.noiseDepth; + } + + public float scale() { + return this.noiseScale; + } + + public ResourceKey getResourceKey() { + return this.resourceKey; + } + + @Override + public int compareTo(@NotNull TerrainColumn o) { + return (int) (this.noiseDepth - o.noiseDepth); + } +} diff --git a/src/main/java/twilightforest/world/components/chunkgenerators/warp/package-info.java b/src/main/java/twilightforest/world/components/chunkgenerators/warp/package-info.java new file mode 100644 index 0000000000..c960f75835 --- /dev/null +++ b/src/main/java/twilightforest/world/components/chunkgenerators/warp/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.world.components.chunkgenerators.warp; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/world/components/feature/BigMushgloomFeature.java b/src/main/java/twilightforest/world/components/feature/BigMushgloomFeature.java new file mode 100644 index 0000000000..a5714c37c9 --- /dev/null +++ b/src/main/java/twilightforest/world/components/feature/BigMushgloomFeature.java @@ -0,0 +1,60 @@ +package twilightforest.world.components.feature; + +import com.mojang.serialization.Codec; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.block.HugeMushroomBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.levelgen.feature.AbstractHugeMushroomFeature; +import net.minecraft.world.level.levelgen.feature.configurations.HugeMushroomFeatureConfiguration; + +import javax.annotation.ParametersAreNonnullByDefault; +import java.util.Random; + +@ParametersAreNonnullByDefault +public class BigMushgloomFeature extends AbstractHugeMushroomFeature { + + public BigMushgloomFeature(Codec config) { + super(config); + } + + @Override + protected int getTreeHeight(RandomSource rand) { + return 2 + rand.nextInt(2); + } + + @Override + protected int getTreeRadiusForHeight(int i, int i1, int foliageRadius, int treeHeight) { + return treeHeight <= 2 ? 0 : foliageRadius; + } + + @Override + protected void makeCap(LevelAccessor levelAccessor, RandomSource random, BlockPos pos, int height, BlockPos.MutableBlockPos mutableBlockPos, HugeMushroomFeatureConfiguration featureConfiguration) { + int i = featureConfiguration.foliageRadius; + + int capHeight = random.nextBoolean() ? 1 : 2; + + for (int y = 0; y < capHeight; y++) { + for (int x = -i; x <= i; ++x) { + for (int z = -i; z <= i; ++z) { + mutableBlockPos.setWithOffset(pos, x, height + y, z); + if (!levelAccessor.getBlockState(mutableBlockPos).isSolidRender(levelAccessor, mutableBlockPos)) { + BlockState blockstate = featureConfiguration.capProvider.getState(random, pos); + + if (blockstate.hasProperty(HugeMushroomBlock.WEST) && blockstate.hasProperty(HugeMushroomBlock.EAST) && blockstate.hasProperty(HugeMushroomBlock.NORTH) && blockstate.hasProperty(HugeMushroomBlock.SOUTH) && blockstate.hasProperty(HugeMushroomBlock.UP)) { + blockstate = blockstate + .setValue(HugeMushroomBlock.UP, y == 1 || capHeight == 1) + .setValue(HugeMushroomBlock.WEST, x == -i) + .setValue(HugeMushroomBlock.EAST, x == i) + .setValue(HugeMushroomBlock.NORTH, z == -i) + .setValue(HugeMushroomBlock.SOUTH, z == i); + } + + this.setBlock(levelAccessor, mutableBlockPos, blockstate); + } + } + } + } + } +} diff --git a/src/main/java/twilightforest/world/components/feature/BlockSpikeFeature.java b/src/main/java/twilightforest/world/components/feature/BlockSpikeFeature.java new file mode 100644 index 0000000000..56174b4dfc --- /dev/null +++ b/src/main/java/twilightforest/world/components/feature/BlockSpikeFeature.java @@ -0,0 +1,135 @@ +package twilightforest.world.components.feature; + +import com.mojang.serialization.Codec; +import net.minecraft.core.BlockPos; +import net.minecraft.util.RandomSource; +import net.minecraft.util.valueproviders.ConstantInt; +import net.minecraft.util.valueproviders.UniformInt; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.levelgen.Heightmap; +import net.minecraft.world.level.levelgen.feature.Feature; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import twilightforest.data.custom.stalactites.entry.Stalactite; +import twilightforest.util.FeatureLogic; + +import java.util.Map; + +public class BlockSpikeFeature extends Feature { + + public static final Stalactite STONE_STALACTITE = new Stalactite(Map.of(Blocks.STONE, 1), 0.25F, 11, 1); + + public BlockSpikeFeature(Codec codec) { + super(codec); + } + + @Override + public boolean place(FeaturePlaceContext context) { + RandomSource random = context.random(); + return startSpike(context.level(), context.origin(), STONE_STALACTITE, random, false); + } + + public static boolean startSpike(WorldGenLevel level, BlockPos startPos, Stalactite config, RandomSource random, boolean hanging) { + UniformInt lengthBounds = UniformInt.of((int) (config.maxLength() * config.sizeVariation()), config.maxLength()); + + return startSpike(level, startPos, config.ores(), lengthBounds.sample(random), lengthBounds.getMinValue(), ConstantInt.of(4).sample(random), hanging, random); + } + + public static boolean startSpike(WorldGenLevel level, BlockPos startPos, Map ore, int length, int lengthMinimum, int clearance, boolean hang, RandomSource random) { + BlockPos.MutableBlockPos movingPos = startPos.mutable(); + int clearedLength = 0; + int dY = hang ? -1 : 1; + + // First find an air block + for (int i = 0; i < length; i++) { + clearedLength = i; + + if (FeatureLogic.worldGenReplaceable(level.getBlockState(movingPos))) break; + + movingPos.move(0, dY, 0); + } + + // Since this gets skipped from the previous line, we invoke it manually + movingPos.move(0, dY, 0); + + // Then find a solid block + int remainingScanLength = length - clearedLength + clearance; + int finalLength = clearedLength - clearance; + for (int i = 0; i < remainingScanLength; i++) { + finalLength = clearedLength + i; + + if (!FeatureLogic.worldGenReplaceable(level.getBlockState(movingPos))) break; + + movingPos.move(0, dY, 0); + } + + finalLength = Math.min(length, finalLength); + + if (finalLength < lengthMinimum) return false; + + return makeSpike(level, startPos, ore, finalLength, dY, random, hang); + } + + private static boolean makeSpike(WorldGenLevel level, BlockPos startPos, Map ore, int length, int dY, RandomSource random, boolean hang) { + int diameter = (int) (length / 4.5F); // diameter of the base + + //only place spikes on solid ground, not on the tops of trees + if (!hang && !FeatureLogic.worldGenReplaceable(level.getBlockState(startPos.below()))) return false; + + int highestWeight = 0; + if (ore.size() > 1) { + for (Map.Entry entry : ore.entrySet()) { + if (entry.getValue() > highestWeight) highestWeight = entry.getValue(); + } + } + + // let's see... + for (int dx = -diameter; dx <= diameter; dx++) { + for (int dz = -diameter; dz <= diameter; dz++) { + // determine how long this spike will be. + int absx = Math.abs(dx); + int absz = Math.abs(dz); + int dist = (int) (Math.max(absx, absz) + Math.min(absx, absz) * 0.5F); + int spikeLength; + + if (dist <= 0) spikeLength = length; + else spikeLength = random.nextInt((int) (length / (dist + 0.25F))); + + for (int i = -1; i < spikeLength; i++) { + BlockPos placement = startPos.offset(dx, i * dY, dz); + + if (FeatureLogic.worldGenReplaceable(level.getBlockState(placement)) && (dY > 0 || placement.getY() < level.getHeight(Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, placement.getX(), placement.getZ()) - 1)) + if (ore.size() == 1) { + level.setBlock(placement, ore.keySet().stream().toList().get(0).defaultBlockState(), 3); + } else { + for (Map.Entry entry : ore.entrySet()) { + if (random.nextInt(highestWeight) + 1 <= entry.getValue()) { + level.setBlock(placement, entry.getKey().defaultBlockState(), 3); + break; + } + } + } + } + } + } + + return true; + } + + /** + * Makes a random stalactite appropriate to the cave size + *

+ * All Stalactite configs are made through datapacks. They are found in modid:stalactites/entries + */ + public static Stalactite makeRandomOreStalactite(RandomSource rand, int hillSize) { + if (hillSize >= 3 && rand.nextInt(5) == 0) { + return Stalactite.getStalactiteConfig().getRandomStalactiteFromList(rand, Stalactite.getStalactiteConfig().getLargeStalactites()); + } + if (hillSize >= 2 && rand.nextInt(5) == 0) { + return Stalactite.getStalactiteConfig().getRandomStalactiteFromList(rand, Stalactite.getStalactiteConfig().getMediumStalactites()); + } + return Stalactite.getStalactiteConfig().getRandomStalactiteFromList(rand, Stalactite.getStalactiteConfig().getSmallStalactites()); + } +} diff --git a/src/main/java/twilightforest/world/components/feature/CheckAbovePatchFeature.java b/src/main/java/twilightforest/world/components/feature/CheckAbovePatchFeature.java new file mode 100644 index 0000000000..1d18c7f94c --- /dev/null +++ b/src/main/java/twilightforest/world/components/feature/CheckAbovePatchFeature.java @@ -0,0 +1,61 @@ +package twilightforest.world.components.feature; + +import com.mojang.serialization.Codec; +import net.minecraft.core.BlockPos; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.FallingBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.feature.Feature; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; +import net.minecraft.world.level.levelgen.feature.configurations.DiskConfiguration; + +//[VanillaCopy] of BaseDiskFeature, but we add a check to make sure the block above is air +public class CheckAbovePatchFeature extends Feature { + + public CheckAbovePatchFeature(Codec codec) { + super(codec); + } + + @Override + public boolean place(FeaturePlaceContext ctx) { + DiskConfiguration diskconfiguration = ctx.config(); + BlockPos blockpos = ctx.origin(); + WorldGenLevel worldgenlevel = ctx.level(); + RandomSource randomsource = ctx.random(); + boolean flag = false; + int i = blockpos.getY(); + int j = i + diskconfiguration.halfHeight(); + int k = i - diskconfiguration.halfHeight() - 1; + int l = diskconfiguration.radius().sample(randomsource); + BlockPos.MutableBlockPos blockpos$mutableblockpos = new BlockPos.MutableBlockPos(); + + for(BlockPos blockpos1 : BlockPos.betweenClosed(blockpos.offset(-l, 0, -l), blockpos.offset(l, 0, l))) { + int i1 = blockpos1.getX() - blockpos.getX(); + int j1 = blockpos1.getZ() - blockpos.getZ(); + if (i1 * i1 + j1 * j1 <= l * l) { + flag |= this.placeColumn(diskconfiguration, worldgenlevel, randomsource, j, k, blockpos$mutableblockpos.set(blockpos1)); + } + } + + return flag; + } + + protected boolean placeColumn(DiskConfiguration config, WorldGenLevel level, RandomSource random, int start, int end, BlockPos.MutableBlockPos mutablePos) { + boolean flag = false; + + for(int i = start; i > end; --i) { + mutablePos.setY(i); + if (config.target().test(level, mutablePos) && level.getBlockState(mutablePos.above()).getMaterial().isReplaceable()) { + BlockState blockstate1 = config.stateProvider().getState(level, random, mutablePos); + level.setBlock(mutablePos, blockstate1, 2); + this.markAboveForPostProcessing(level, mutablePos); + flag = true; + } + } + + return flag; + } +} diff --git a/src/main/java/twilightforest/world/components/feature/DarkForestFeature.java b/src/main/java/twilightforest/world/components/feature/DarkForestFeature.java new file mode 100644 index 0000000000..f624e4c9d8 --- /dev/null +++ b/src/main/java/twilightforest/world/components/feature/DarkForestFeature.java @@ -0,0 +1,64 @@ +package twilightforest.world.components.feature; + +import com.mojang.serialization.Codec; +import net.minecraft.core.BlockPos; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.levelgen.feature.Feature; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; +import net.minecraft.world.level.levelgen.feature.configurations.RandomPatchConfiguration; +import net.minecraft.world.level.material.Material; +import twilightforest.util.WorldUtil; + +import java.util.Random; + +//Places single block features in patches around the dark forest +public class DarkForestFeature extends Feature { + public DarkForestFeature(Codec codec) { + super(codec); + } + + @Override + public boolean place(FeaturePlaceContext ctx) { + WorldGenLevel reader = ctx.level(); + BlockPos pos = ctx.origin(); + RandomSource rand = ctx.random(); + RandomPatchConfiguration config = ctx.config(); + + boolean foundDirt = false; + Material materialUnder; + + if(pos.getY() <= 40) { + for (int dy = pos.getY(); dy >= WorldUtil.getSeaLevel(ctx.chunkGenerator()); dy--) { + materialUnder = reader.getBlockState(new BlockPos(pos.getX(), dy - 1, pos.getZ())).getMaterial(); + if ((materialUnder == Material.GRASS || materialUnder == Material.DIRT) && reader.getBlockState(pos) == Blocks.AIR.defaultBlockState()) { + foundDirt = true; + pos = new BlockPos(pos.getX(), dy, pos.getZ()); + break; + } else if (materialUnder == Material.STONE || materialUnder == Material.SAND) { + break; + } + } + } + + if (!foundDirt) { + return false; + } + + //RandomPatchFeature placement logic + int i = 0; + BlockPos.MutableBlockPos blockpos$mutableblockpos = new BlockPos.MutableBlockPos(); + int j = config.xzSpread() + 1; + int k = config.ySpread() + 1; + + for(int l = 0; l < config.tries(); ++l) { + blockpos$mutableblockpos.setWithOffset(pos, rand.nextInt(j) - rand.nextInt(j), rand.nextInt(k) - rand.nextInt(k), rand.nextInt(j) - rand.nextInt(j)); + if (config.feature().value().place(reader, ctx.chunkGenerator(), rand, blockpos$mutableblockpos)) { + ++i; + } + } + + return i > 0; + } +} diff --git a/src/main/java/twilightforest/world/components/feature/FallenHollowLogFeature.java b/src/main/java/twilightforest/world/components/feature/FallenHollowLogFeature.java new file mode 100644 index 0000000000..578211beea --- /dev/null +++ b/src/main/java/twilightforest/world/components/feature/FallenHollowLogFeature.java @@ -0,0 +1,242 @@ +package twilightforest.world.components.feature; + +import com.mojang.serialization.Codec; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.LeavesBlock; +import net.minecraft.world.level.block.RotatedPillarBlock; +import net.minecraft.core.Direction; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.levelgen.feature.Feature; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import twilightforest.init.TFBlocks; +import twilightforest.util.FeatureUtil; + +public class FallenHollowLogFeature extends Feature { + + final BlockState mossPatch = TFBlocks.MOSS_PATCH.get().defaultBlockState(); + final BlockState oakLeaves = TFBlocks.TWILIGHT_OAK_LEAVES.get().defaultBlockState().setValue(LeavesBlock.PERSISTENT, true); + final BlockState oakLogWithZAxis = TFBlocks.TWILIGHT_OAK_LOG.get().defaultBlockState().setValue(RotatedPillarBlock.AXIS, Direction.Axis.Z); + final BlockState oakLogWithXAxis = TFBlocks.TWILIGHT_OAK_LOG.get().defaultBlockState().setValue(RotatedPillarBlock.AXIS, Direction.Axis.X); + final BlockState grass = Blocks.GRASS_BLOCK.defaultBlockState(); + final BlockState firefly = TFBlocks.FIREFLY.get().defaultBlockState(); + + public FallenHollowLogFeature(Codec configIn) { + super(configIn); + } + + @Override + public boolean place(FeaturePlaceContext ctx) { + WorldGenLevel world = ctx.level(); + BlockPos pos = ctx.origin(); + RandomSource rand = ctx.random(); + + return rand.nextBoolean() ? makeLog4Z(world, rand, pos) : makeLog4X(world, rand, pos); + } + + private boolean makeLog4Z(WorldGenLevel world, RandomSource rand, BlockPos pos) { + // +Z 4x4 log + if (!FeatureUtil.isAreaSuitable(world, pos, 4, 3, 9)) { + return false; + } + + // jaggy parts + makeNegativeZJaggy(world, pos, rand.nextInt(3), 0, 0); + makeNegativeZJaggy(world, pos, rand.nextInt(3), 3, 0); + makeNegativeZJaggy(world, pos, rand.nextInt(3), 0, 1); + makeNegativeZJaggy(world, pos, rand.nextInt(3), 3, 1); + makeNegativeZJaggy(world, pos, rand.nextInt(3), 1, 2); + makeNegativeZJaggy(world, pos, rand.nextInt(3), 2, 2); + + makePositiveZJaggy(world, pos, rand.nextInt(3), 0, 0); + makePositiveZJaggy(world, pos, rand.nextInt(3), 3, 0); + makePositiveZJaggy(world, pos, rand.nextInt(3), 0, 1); + makePositiveZJaggy(world, pos, rand.nextInt(3), 3, 1); + makePositiveZJaggy(world, pos, rand.nextInt(3), 1, 2); + makePositiveZJaggy(world, pos, rand.nextInt(3), 2, 2); + + // center + for (int dz = 0; dz < 4; dz++) { + // floor + if (rand.nextBoolean()) { + world.setBlock(pos.offset(1, -1, dz + 3), oakLogWithZAxis, 3); + if (rand.nextBoolean()) { + world.setBlock(pos.offset(1, 0, dz + 3), mossPatch, 3); + this.markAboveForPostProcessing(world, pos.offset(1, -1, dz + 3)); + } + } else { + world.setBlock(pos.offset(1, -1, dz + 3), grass, 3); + world.setBlock(pos.offset(1, 0, dz + 3), mossPatch, 3); + this.markAboveForPostProcessing(world, pos.offset(1, -1, dz + 3)); + } + if (rand.nextBoolean()) { + world.setBlock(pos.offset(2, -1, dz + 3), oakLogWithZAxis, 3); + if (rand.nextBoolean()) { + world.setBlock(pos.offset(2, 0, dz + 3), mossPatch, 3); + this.markAboveForPostProcessing(world, pos.offset(2, -1, dz + 3)); + } + } else { + world.setBlock(pos.offset(2, -1, dz + 3), grass, 3); + world.setBlock(pos.offset(2, 0, dz + 3), mossPatch, 3); + this.markAboveForPostProcessing(world, pos.offset(2, -1, dz + 3)); + } + + // log part + world.setBlock(pos.offset(0, 0, dz + 3), oakLogWithZAxis, 3); + world.setBlock(pos.offset(3, 0, dz + 3), oakLogWithZAxis, 3); + world.setBlock(pos.offset(0, 1, dz + 3), oakLogWithZAxis, 3); + world.setBlock(pos.offset(3, 1, dz + 3), oakLogWithZAxis, 3); + world.setBlock(pos.offset(1, 2, dz + 3), oakLogWithZAxis, 3); + world.setBlock(pos.offset(2, 2, dz + 3), oakLogWithZAxis, 3); + if (rand.nextBoolean()) { + world.setBlock(pos.offset(1, 3, dz + 3), mossPatch, 3); + this.markAboveForPostProcessing(world, pos.offset(1, 2, dz + 3)); + } + if (rand.nextBoolean()) { + world.setBlock(pos.offset(2, 3, dz + 3), mossPatch, 3); + this.markAboveForPostProcessing(world, pos.offset(2, 2, dz + 3)); + } + } + + // a few leaves? + int offZ = rand.nextInt(3) + 2; + boolean plusX = rand.nextBoolean(); + for (int dz = 0; dz < 3; dz++) { + if (rand.nextBoolean()) { + world.setBlock(pos.offset(plusX ? 3 : 0, 2, dz + offZ), oakLeaves, 3); + if (rand.nextBoolean()) { + world.setBlock(pos.offset(plusX ? 3 : 0, 3, dz + offZ), oakLeaves, 3); + } + if (rand.nextBoolean()) { + world.setBlock(pos.offset(plusX ? 4 : -1, 2, dz + offZ), oakLeaves, 3); + } + } + } + + + // firefly + world.setBlock(pos.offset(plusX ? 0 : 3, 2, rand.nextInt(4) + 3), firefly, 3); + + + return true; + } + + private void makeNegativeZJaggy(LevelAccessor world, BlockPos pos, int length, int dx, int dy) { + for (int dz = -length; dz < 0; dz++) { + world.setBlock(pos.offset(dx, dy, dz + 3), oakLogWithZAxis, 3); + } + } + + private void makePositiveZJaggy(LevelAccessor world, BlockPos pos, int length, int dx, int dy) { + for (int dz = 0; dz < length; dz++) { + world.setBlock(pos.offset(dx, dy, dz + 7), oakLogWithZAxis, 3); + } + } + + /** + * Make a 4x4 log in the +X direction + */ + private boolean makeLog4X(WorldGenLevel world, RandomSource rand, BlockPos pos) { + // +Z 4x4 log + if (!FeatureUtil.isAreaSuitable(world, pos, 9, 3, 4)) { + return false; + } + + // jaggy parts + makeNegativeXJaggy(world, pos, rand.nextInt(3), 0, 0); + makeNegativeXJaggy(world, pos, rand.nextInt(3), 3, 0); + makeNegativeXJaggy(world, pos, rand.nextInt(3), 0, 1); + makeNegativeXJaggy(world, pos, rand.nextInt(3), 3, 1); + makeNegativeXJaggy(world, pos, rand.nextInt(3), 1, 2); + makeNegativeXJaggy(world, pos, rand.nextInt(3), 2, 2); + + makePositiveXJaggy(world, pos, rand.nextInt(3), 0, 0); + makePositiveXJaggy(world, pos, rand.nextInt(3), 3, 0); + makePositiveXJaggy(world, pos, rand.nextInt(3), 0, 1); + makePositiveXJaggy(world, pos, rand.nextInt(3), 3, 1); + makePositiveXJaggy(world, pos, rand.nextInt(3), 1, 2); + makePositiveXJaggy(world, pos, rand.nextInt(3), 2, 2); + + // center + for (int dx = 0; dx < 4; dx++) { + // floor + if (rand.nextBoolean()) { + world.setBlock(pos.offset(dx + 3, -1, 1), oakLogWithXAxis, 3); + if (rand.nextBoolean()) { + world.setBlock(pos.offset(dx + 3, 0, 1), mossPatch, 3); + this.markAboveForPostProcessing(world, pos.offset(dx + 3, -1, 1)); + } + } else { + world.setBlock(pos.offset(dx + 3, -1, 1), grass, 3); + world.setBlock(pos.offset(dx + 3, 0, 1), mossPatch, 3); + this.markAboveForPostProcessing(world, pos.offset(dx + 3, -1, 1)); + } + if (rand.nextBoolean()) { + world.setBlock(pos.offset(dx + 3, -1, 2), oakLogWithXAxis, 3); + if (rand.nextBoolean()) { + world.setBlock(pos.offset(dx + 3, 0, 2), mossPatch, 3); + this.markAboveForPostProcessing(world, pos.offset(dx + 3, -1, 2)); + } + } else { + world.setBlock(pos.offset(dx + 3, -1, 2), grass, 3); + world.setBlock(pos.offset(dx + 3, 0, 2), mossPatch, 3); + this.markAboveForPostProcessing(world, pos.offset(dx + 3, -1, 2)); + } + + // log part + world.setBlock(pos.offset(dx + 3, 0, 0), oakLogWithXAxis, 3); + world.setBlock(pos.offset(dx + 3, 0, 3), oakLogWithXAxis, 3); + world.setBlock(pos.offset(dx + 3, 1, 0), oakLogWithXAxis, 3); + world.setBlock(pos.offset(dx + 3, 1, 3), oakLogWithXAxis, 3); + world.setBlock(pos.offset(dx + 3, 2, 1), oakLogWithXAxis, 3); + world.setBlock(pos.offset(dx + 3, 2, 2), oakLogWithXAxis, 3); + if (rand.nextBoolean()) { + world.setBlock(pos.offset(dx + 3, 3, 1), mossPatch, 3); + this.markAboveForPostProcessing(world, pos.offset(dx + 3, 2, 1)); + } + if (rand.nextBoolean()) { + world.setBlock(pos.offset(dx + 3, 3, 2), mossPatch, 3); + this.markAboveForPostProcessing(world, pos.offset(dx + 3, 2, 2)); + } + + } + + // a few leaves? + int offX = rand.nextInt(3) + 2; + boolean plusZ = rand.nextBoolean(); + for (int dx = 0; dx < 3; dx++) { + if (rand.nextBoolean()) { + + world.setBlock(pos.offset(dx + offX, 2, plusZ ? 3 : 0), oakLeaves, 3); + if (rand.nextBoolean()) { + world.setBlock(pos.offset(dx + offX, 3, plusZ ? 3 : 0), oakLeaves, 3); + } + if (rand.nextBoolean()) { + world.setBlock(pos.offset(dx + offX, 2, plusZ ? 4 : -1), oakLeaves, 3); + } + } + } + + + // firefly + world.setBlock(pos.offset(rand.nextInt(4) + 3, 2, plusZ ? 0 : 3), firefly, 3); + + return true; + } + + private void makeNegativeXJaggy(LevelAccessor world, BlockPos pos, int length, int dz, int dy) { + for (int dx = -length; dx < 0; dx++) { + world.setBlock(pos.offset(dx + 3, dy, dz), oakLogWithXAxis, 3); + } + } + + private void makePositiveXJaggy(LevelAccessor world, BlockPos pos, int length, int dz, int dy) { + for (int dx = 0; dx < length; dx++) { + world.setBlock(pos.offset(dx + 7, dy, dz), oakLogWithXAxis, 3); + } + } +} diff --git a/src/main/java/twilightforest/world/components/feature/FallenLeavesFeature.java b/src/main/java/twilightforest/world/components/feature/FallenLeavesFeature.java new file mode 100644 index 0000000000..3c152c400a --- /dev/null +++ b/src/main/java/twilightforest/world/components/feature/FallenLeavesFeature.java @@ -0,0 +1,108 @@ +package twilightforest.world.components.feature; + +import com.mojang.serialization.Codec; +import net.minecraft.core.BlockPos; +import net.minecraft.tags.BlockTags; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.Heightmap; +import net.minecraft.world.level.levelgen.feature.Feature; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.material.Fluids; +import twilightforest.block.FallenLeavesBlock; +import twilightforest.init.TFBlocks; + +public class FallenLeavesFeature extends Feature { + + public FallenLeavesFeature(Codec config) { + super(config); + } + + private final BlockState state = TFBlocks.FALLEN_LEAVES.get().defaultBlockState(); + + @Override + public boolean place(FeaturePlaceContext ctx) { + WorldGenLevel level = ctx.level(); + BlockPos position = level.getHeightmapPos(Heightmap.Types.WORLD_SURFACE_WG, ctx.origin()); + RandomSource rand = ctx.random(); + + if (this.canPlace(position, level)) { + if (!level.getFluidState(position.below()).isEmpty()) { + return this.generateFlatPileOnWater(level, position, rand); + } else { + int startHeight = rand.nextInt(6) + 1; + level.setBlock(position, this.state.setValue(FallenLeavesBlock.LAYERS, startHeight), 16 | 2); + for (int i = 0; i < startHeight; i++) { + this.generateCircleOfLeaves(level, position, rand, i, startHeight - i - 1); + if (rand.nextInt(3) == 0) i++; + } + } + return true; + } + return false; + } + + private boolean generateFlatPileOnWater(WorldGenLevel level, BlockPos pos, RandomSource random) { + for (int x = 0; x < 5; x++) { + for (int z = 0; z < 5; z++) { + if (random.nextInt(3) != 0) + continue; + boolean flag = false; + int y = 2; + do { + if (this.canPlace(pos.offset(x, y, z), level)) { + flag = true; + break; + } + y--; + } while (y >= -2); + if (!flag) + continue; + BlockPos finalPos = pos.offset(x, y, z); + if (this.state.canSurvive(level, finalPos)) + level.setBlock(finalPos, this.state, 16 | 2); + } + } + return true; + } + + private void generateCircleOfLeaves(WorldGenLevel level, BlockPos origin, RandomSource random, int radius, int height) { + for(int i1 = origin.getX() - radius; i1 <= origin.getX() + radius; ++i1) { + for(int j1 = origin.getZ() - radius; j1 <= origin.getZ() + radius; ++j1) { + int k1 = i1 - origin.getX(); + int l1 = j1 - origin.getZ(); + if (k1 * k1 + l1 * l1 <= radius * radius) { + BlockPos newPos = new BlockPos(i1, origin.getY(), j1); + int trueHeight = height - random.nextInt(3); + if (trueHeight > 0) { + this.checkAndGenerateLeafPile(level, newPos, trueHeight); + } + } + } + } + } + + private void checkAndGenerateLeafPile(WorldGenLevel level, BlockPos pos, int pileLayer) { + boolean flag = false; + int y = 0; + do { + if (this.canPlace(pos.offset(0, y, 0), level)) { + flag = true; + break; + } + y--; + } while (y >= -2); + if (!flag) + return; + BlockPos finalPos = pos.offset(0, y, 0); + if (this.state.getBlock().canSurvive(this.state, level, finalPos)) + level.setBlock(finalPos, this.state.setValue(FallenLeavesBlock.LAYERS, pileLayer), 16 | 2); + } + + private boolean canPlace(BlockPos pos, WorldGenLevel level) { + BlockState state = level.getBlockState(pos.below()); + return !level.getBlockState(pos).is(this.state.getBlock()) && (level.isEmptyBlock(pos) || level.getBlockState(pos).is(TFBlocks.MAYAPPLE.get()) || level.getBlockState(pos).canBeReplaced()) && (state.is(BlockTags.DIRT) || level.getFluidState(pos.below()).is(Fluids.WATER)); + } +} diff --git a/src/main/java/twilightforest/world/components/feature/FireJetFeature.java b/src/main/java/twilightforest/world/components/feature/FireJetFeature.java new file mode 100644 index 0000000000..a2dd06ae18 --- /dev/null +++ b/src/main/java/twilightforest/world/components/feature/FireJetFeature.java @@ -0,0 +1,72 @@ +package twilightforest.world.components.feature; + +import com.mojang.serialization.Codec; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.levelgen.feature.configurations.BlockStateConfiguration; +import net.minecraft.world.level.levelgen.feature.Feature; +import twilightforest.util.FeatureUtil; + +import java.util.Random; + +public class FireJetFeature extends Feature { + + public FireJetFeature(Codec configIn) { + super(configIn); + } + + @Override + public boolean place(FeaturePlaceContext ctx) { + WorldGenLevel world = ctx.level(); + BlockPos pos = ctx.origin(); + RandomSource rand = ctx.random(); + BlockStateConfiguration config = ctx.config(); + + if(!FeatureUtil.isAreaSuitable(world, pos, 5, 2, 5)) return false; + + for (int i = 0; i < 4; ++i) { + BlockPos dPos = pos.offset( + rand.nextInt(8) - rand.nextInt(8), + rand.nextInt(4) - rand.nextInt(4), + rand.nextInt(8) - rand.nextInt(8) + ); + + if (world.isEmptyBlock(dPos) && world.canSeeSkyFromBelowWater(dPos) && world.getBlockState(dPos.below()).getMaterial() == Material.GRASS + && world.getBlockState(dPos.east().below()).getMaterial() == Material.GRASS && world.getBlockState(dPos.west().below()).getMaterial() == Material.GRASS + && world.getBlockState(dPos.south().below()).getMaterial() == Material.GRASS && world.getBlockState(dPos.north().below()).getMaterial() == Material.GRASS) { + + //create blocks around the jet/smoker, just in case + for (int gx = -2; gx <= 2; gx++) { + for (int gz = -2; gz <= 2; gz++) { + BlockPos grassPos = dPos.offset(gx, -1, gz); + world.setBlock(grassPos, Blocks.GRASS_BLOCK.defaultBlockState(), 0); + } + } + + // jet + world.setBlock(dPos.below(), config.state, 0); + + // create reservoir with stone walls + for (int rx = -2; rx <= 2; rx++) { + for (int rz = -2; rz <= 2; rz++) { + BlockPos dPos2 = dPos.offset(rx, -2, rz); + if ((rx == 1 || rx == 0 || rx == -1) && (rz == 1 || rz == 0 || rz == -1)) { + // lava reservoir + world.setBlock(dPos2, Blocks.LAVA.defaultBlockState(), 0); + } else if (world.getBlockState(dPos2).getMaterial() != Material.LAVA) { + // only stone where there is no lava + world.setBlock(dPos2, Blocks.STONE.defaultBlockState(), 0); + } + world.setBlock(dPos2.below(), Blocks.STONE.defaultBlockState(), 0); + } + } + } + } + + return true; + } +} diff --git a/src/main/java/twilightforest/world/components/feature/FoundationFeature.java b/src/main/java/twilightforest/world/components/feature/FoundationFeature.java new file mode 100644 index 0000000000..bdaceb83e0 --- /dev/null +++ b/src/main/java/twilightforest/world/components/feature/FoundationFeature.java @@ -0,0 +1,76 @@ +package twilightforest.world.components.feature; + +import com.mojang.serialization.Codec; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.core.Direction; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.levelgen.feature.Feature; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import twilightforest.loot.TFLootTables; +import twilightforest.util.FeatureLogic; +import twilightforest.util.FeatureUtil; + +public class FoundationFeature extends Feature { + + public FoundationFeature(Codec configIn) { + super(configIn); + } + + @Override + public boolean place(FeaturePlaceContext ctx) { + WorldGenLevel world = ctx.level(); + BlockPos pos = ctx.origin(); + RandomSource rand = ctx.random(); + + int sx = 5 + rand.nextInt(5); + int sz = 5 + rand.nextInt(5); + + + if (!FeatureUtil.isAreaSuitable(world, pos, sx + 1, 4, sz + 1)) { + return false; + } + + //okay! + for (int cx = 0; cx <= sx; cx++) { + for (int cz = 0; cz <= sz; cz++) { + if (cx == 0 || cx == sx || cz == 0 || cz == sz) { + // stone on the edges + int ht = rand.nextInt(4) + 1; + + for (int cy = 0; cy <= ht; cy++) { + world.setBlock(pos.offset(cx, cy - 1, cz), FeatureLogic.randStone(rand, cy + 1), 3); + } + } else { + // destroyed wooden plank floor + if (rand.nextInt(3) != 0) { + world.setBlock(pos.offset(cx, -1, cz), Blocks.OAK_PLANKS.defaultBlockState(), 3); + } + } + } + } + + //TODO: chimney? + + // 50% basement chance! + if (rand.nextInt(2) == 0) { + // clear basement + for (int cx = 1; cx < sx; cx++) { + for (int cz = 1; cz < sz; cz++) { + world.setBlock(pos.offset(cx, -3, cz), Blocks.AIR.defaultBlockState(), 3); + world.setBlock(pos.offset(cx, -4, cz), Blocks.AIR.defaultBlockState(), 3); + } + } + + // make chest + int cx = rand.nextInt(sx - 1) + 1; + int cz = rand.nextInt(sz - 1) + 1; + TFLootTables.FOUNDATION_BASEMENT.generateChest(world, pos.offset(cx, -4, cz), Direction.NORTH, false); + + } + + return true; + } +} diff --git a/src/main/java/twilightforest/world/components/feature/HugeLilypadFeature.java b/src/main/java/twilightforest/world/components/feature/HugeLilypadFeature.java new file mode 100644 index 0000000000..20ffc67498 --- /dev/null +++ b/src/main/java/twilightforest/world/components/feature/HugeLilypadFeature.java @@ -0,0 +1,67 @@ +package twilightforest.world.components.feature; + +import com.mojang.serialization.Codec; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.core.Direction; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.levelgen.feature.Feature; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import twilightforest.init.TFBlocks; + +import static twilightforest.block.HugeLilyPadBlock.FACING; +import static twilightforest.block.HugeLilyPadBlock.PIECE; +import static twilightforest.enums.HugeLilypadPiece.NE; +import static twilightforest.enums.HugeLilypadPiece.NW; +import static twilightforest.enums.HugeLilypadPiece.SE; +import static twilightforest.enums.HugeLilypadPiece.SW; + +/** + * Generate huge lily pads + * + * @author Ben + */ +public class HugeLilypadFeature extends Feature { + + public HugeLilypadFeature(Codec config) { + super(config); + } + + @Override + public boolean place(FeaturePlaceContext ctx) { + WorldGenLevel world = ctx.level(); + BlockPos pos = ctx.origin(); + RandomSource random = ctx.random(); + + for (int i = 0; i < 10; i++) { + BlockPos dPos = pos.offset( + random.nextInt(8) - random.nextInt(8), + random.nextInt(4) - random.nextInt(4), + random.nextInt(8) - random.nextInt(8) + ); + + if (shouldPlacePadAt(world, dPos) && world.isAreaLoaded(dPos, 1)) { + final Direction horizontal = Direction.from2DDataValue(random.nextInt(4)); + final BlockState lilypad = TFBlocks.HUGE_LILY_PAD.get().defaultBlockState().setValue(FACING, horizontal); + + world.setBlock(dPos, lilypad.setValue(PIECE, NW), 16 | 2); + world.setBlock(dPos.east(), lilypad.setValue(PIECE, NE), 16 | 2); + world.setBlock(dPos.east().south(), lilypad.setValue(PIECE, SE), 16 | 2); + world.setBlock(dPos.south(), lilypad.setValue(PIECE, SW), 16 | 2); + } + } + + return true; + } + + private boolean shouldPlacePadAt(LevelAccessor world, BlockPos pos) { + return world.isEmptyBlock(pos) && world.getBlockState(pos.below()).getMaterial() == Material.WATER + && world.isEmptyBlock(pos.east()) && world.getBlockState(pos.east().below()).getMaterial() == Material.WATER + && world.isEmptyBlock(pos.south()) && world.getBlockState(pos.south().below()).getMaterial() == Material.WATER + && world.isEmptyBlock(pos.east().south()) && world.getBlockState(pos.east().south().below()).getMaterial() == Material.WATER; + } +} diff --git a/src/main/java/twilightforest/world/components/feature/HugeWaterLilyFeature.java b/src/main/java/twilightforest/world/components/feature/HugeWaterLilyFeature.java new file mode 100644 index 0000000000..2f783f40a8 --- /dev/null +++ b/src/main/java/twilightforest/world/components/feature/HugeWaterLilyFeature.java @@ -0,0 +1,49 @@ +package twilightforest.world.components.feature; + +import com.mojang.serialization.Codec; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; +import net.minecraft.world.level.material.Material; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.levelgen.feature.Feature; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import twilightforest.init.TFBlocks; + +/** + * Generate huge lily pads + * + * @author Ben + */ +public class HugeWaterLilyFeature extends Feature { + + public HugeWaterLilyFeature(Codec config) { + super(config); + } + + @Override + public boolean place(FeaturePlaceContext ctx) { + WorldGenLevel world = ctx.level(); + BlockPos pos = ctx.origin(); + RandomSource random = ctx.random(); + + for (int i = 0; i < 4; i++) { + BlockPos pos_ = pos.offset( + random.nextInt(8) - random.nextInt(8), + random.nextInt(4) - random.nextInt(4), + random.nextInt(8) - random.nextInt(8) + ); + + if (shouldPlacePadAt(world, pos_)) { + world.setBlock(pos_, TFBlocks.HUGE_WATER_LILY.get().defaultBlockState(), 16 | 2); + } + } + + return true; + } + + private boolean shouldPlacePadAt(LevelAccessor world, BlockPos pos) { + return world.isEmptyBlock(pos) && world.getBlockState(pos.below()).getMaterial() == Material.WATER; + } +} diff --git a/src/main/java/twilightforest/world/components/feature/LampostFeature.java b/src/main/java/twilightforest/world/components/feature/LampostFeature.java new file mode 100644 index 0000000000..52d8e65c83 --- /dev/null +++ b/src/main/java/twilightforest/world/components/feature/LampostFeature.java @@ -0,0 +1,54 @@ +package twilightforest.world.components.feature; + +import com.mojang.serialization.Codec; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; +import net.minecraft.world.level.levelgen.feature.configurations.BlockStateConfiguration; +import net.minecraft.world.level.levelgen.feature.Feature; +import twilightforest.init.TFBlocks; + +public class LampostFeature extends Feature { + + private static final Rotation[] ROTATIONS = Rotation.values(); + //private final BlockState lamp; + + public LampostFeature(Codec configIn) { + super(configIn); + } + + @Override + public boolean place(FeaturePlaceContext ctx) { + WorldGenLevel world = ctx.level(); + BlockPos pos = ctx.origin(); + RandomSource rand = ctx.random(); + BlockStateConfiguration config = ctx.config(); + + // we should start on a grass block + if (world.getBlockState(pos.below()).getBlock() != Blocks.GRASS_BLOCK) { + return false; + } + + // generate a height + int height = 1 + rand.nextInt(4); + + // is it air or replaceable above our grass block + for (int dy = 0; dy <= height; dy++) { + BlockState state = world.getBlockState(pos.above(dy)); + if (!state.isAir() && !state.getMaterial().isReplaceable()) { + return false; + } + } + + // generate lamp + for (int dy = 0; dy < height; dy++) { + world.setBlock(pos.above(dy), TFBlocks.CANOPY_FENCE.get().defaultBlockState(), 16 | 2); + } + world.setBlock(pos.above(height), config.state.rotate(ROTATIONS[rand.nextInt(ROTATIONS.length)]), 16 | 2); + return true; + } +} diff --git a/src/main/java/twilightforest/world/components/feature/MonolithFeature.java b/src/main/java/twilightforest/world/components/feature/MonolithFeature.java new file mode 100644 index 0000000000..820a002db3 --- /dev/null +++ b/src/main/java/twilightforest/world/components/feature/MonolithFeature.java @@ -0,0 +1,100 @@ +package twilightforest.world.components.feature; + +import com.mojang.serialization.Codec; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.levelgen.Heightmap; +import net.minecraft.world.level.levelgen.feature.Feature; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import twilightforest.init.TFEntities; +import twilightforest.entity.passive.Raven; +import twilightforest.util.FeatureUtil; + +/** + * A 2x2 monolith of obsidian + * + * @author Ben + */ +public class MonolithFeature extends Feature { + + public MonolithFeature(Codec configIn) { + super(configIn); + } + + @Override + public boolean place(FeaturePlaceContext ctx) { + WorldGenLevel world = ctx.level(); + BlockPos pos = ctx.origin(); + RandomSource rand = ctx.random(); + + int ht = rand.nextInt(10) + 10; + int dir = rand.nextInt(4); + int h0, h1, h2, h3; + + if (!FeatureUtil.isAreaSuitable(world, pos, 2, ht, 2)) { + return false; + } + + switch (dir) { + case 0 -> { + h0 = ht; + h1 = (int) (ht * .75); + h2 = (int) (ht * .75); + h3 = (int) (ht * .5); + } + case 1 -> { + h0 = (int) (ht * .5); + h1 = ht; + h2 = (int) (ht * .75); + h3 = (int) (ht * .75); + } + case 2 -> { + h0 = (int) (ht * .75); + h1 = (int) (ht * .5); + h2 = ht; + h3 = (int) (ht * .75); + } + default -> { + h0 = (int) (ht * .75); + h1 = (int) (ht * .75); + h2 = (int) (ht * .5); + h3 = ht; + } + } + + for (int cy = 0; cy <= h0; cy++) { + world.setBlock(pos.offset(0, cy - 1, 0), cy == ht ? Blocks.LAPIS_BLOCK.defaultBlockState() : Blocks.OBSIDIAN.defaultBlockState(), 3); + } + for (int cy = 0; cy <= h1; cy++) { + world.setBlock(pos.offset(1, cy - 1, 0), cy == ht ? Blocks.LAPIS_BLOCK.defaultBlockState() : Blocks.OBSIDIAN.defaultBlockState(), 3); + } + for (int cy = 0; cy <= h2; cy++) { + world.setBlock(pos.offset(0, cy - 1, 1), cy == ht ? Blocks.LAPIS_BLOCK.defaultBlockState() : Blocks.OBSIDIAN.defaultBlockState(), 3); + } + for (int cy = 0; cy <= h3; cy++) { + world.setBlock(pos.offset(1, cy - 1, 1), cy == ht ? Blocks.LAPIS_BLOCK.defaultBlockState() : Blocks.OBSIDIAN.defaultBlockState(), 3); + } + + // spawn a few ravens nearby + for (int i = 0; i < 2; i++) { + BlockPos dPos = pos.offset( + rand.nextInt(8) - rand.nextInt(8), + 0, + rand.nextInt(8) - rand.nextInt(8) + ); + dPos = world.getHeightmapPos(Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, dPos); + + if (dPos.getY() > 0) { + Raven raven = TFEntities.RAVEN.get().create(world.getLevel()); + raven.moveTo(dPos, rand.nextFloat() * 360.0F, 0.0F); + + world.addFreshEntity(raven); + } + } + + return true; + } +} diff --git a/src/main/java/twilightforest/world/components/feature/SmallFallenLogFeature.java b/src/main/java/twilightforest/world/components/feature/SmallFallenLogFeature.java new file mode 100644 index 0000000000..9488a4847b --- /dev/null +++ b/src/main/java/twilightforest/world/components/feature/SmallFallenLogFeature.java @@ -0,0 +1,154 @@ +package twilightforest.world.components.feature; + +import com.mojang.serialization.Codec; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.tags.BlockTags; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.RotatedPillarBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.feature.Feature; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; +import net.minecraft.world.level.material.Material; +import twilightforest.block.HollowLogHorizontal; +import twilightforest.init.TFBlocks; +import twilightforest.enums.HollowLogVariants; +import twilightforest.util.FeatureUtil; +import twilightforest.world.components.feature.config.HollowLogConfig; + +import org.jetbrains.annotations.Nullable; + +public class SmallFallenLogFeature extends Feature { + + public SmallFallenLogFeature(Codec configIn) { + super(configIn); + } + + @Override + public boolean place(FeaturePlaceContext ctx) { + WorldGenLevel world = ctx.level(); + BlockPos pos = ctx.origin(); + RandomSource rand = ctx.random(); + HollowLogConfig config = ctx.config(); + boolean shouldMakeAllHollow = rand.nextBoolean(); + + // determine direction + boolean goingX = rand.nextBoolean(); + + // length + int length = rand.nextInt(4) + 3; + + // check area clear + if (goingX) { + if (!FeatureUtil.isAreaSuitable(world, pos, length, 2, 2, true)) { + return false; + } + } else { + if (!FeatureUtil.isAreaSuitable(world, pos, 2, 2, length, true)) { + return false; + } + } + + // determine wood type + BlockState logState = config.normal(); + @Nullable + BlockState hollowLogState = config.hollow(); + BlockState branchState; + + if(config.hollow().isAir()) hollowLogState = null; + + //sometimes make floating logs + if(rand.nextInt(5) == 0 && world.getBlockState(pos).getMaterial() == Material.WATER) { + BlockPos.MutableBlockPos floatingPos = pos.mutable(); + for(int i = 0; i < 10; i++) { + if(world.getBlockState(floatingPos.above()).isAir()) { + pos = floatingPos.immutable(); + break; + } else { + floatingPos.move(0, 1, 0); + } + } + } + + // make log + if (goingX) { + logState = logState.setValue(RotatedPillarBlock.AXIS, Direction.Axis.X); + if(hollowLogState != null) { + hollowLogState = hollowLogState.setValue(HollowLogHorizontal.HORIZONTAL_AXIS, Direction.Axis.X) + .setValue(HollowLogHorizontal.VARIANT, determineHollowProperties(world, pos, rand)); + } + branchState = logState.setValue(RotatedPillarBlock.AXIS, Direction.Axis.Z); + + for (int lx = 0; lx < length; lx++) { + world.setBlock(pos.offset(lx, 0, 1), hollowOrNormal(world, shouldMakeAllHollow, hollowLogState, logState), 3); + if (rand.nextInt(3) > 0) { + world.setBlock(pos.offset(lx, 1, 1), mossOrSeagrass(world, pos.offset(lx, 1, 1)), 3); + this.markAboveForPostProcessing(world, pos.offset(lx, 0, 1)); + } + } + } else { + logState = logState.setValue(RotatedPillarBlock.AXIS, Direction.Axis.Z); + if(hollowLogState != null) { + hollowLogState = hollowLogState.setValue(HollowLogHorizontal.HORIZONTAL_AXIS, Direction.Axis.Z) + .setValue(HollowLogHorizontal.VARIANT, determineHollowProperties(world, pos, rand)); + } + branchState = logState.setValue(RotatedPillarBlock.AXIS, Direction.Axis.X); + + for (int lz = 0; lz < length; lz++) { + world.setBlock(pos.offset(1, 0, lz), hollowOrNormal(world, shouldMakeAllHollow, hollowLogState, logState), 3); + if (rand.nextInt(3) > 0) { + world.setBlock(pos.offset(1, 1, lz), mossOrSeagrass(world, pos.offset(1, 1, lz)), 3); + this.markAboveForPostProcessing(world, pos.offset(1, 0, lz)); + } + } + } + + // possibly make branch + if (rand.nextInt(3) > 0) { + int bx; + int bz; + if (goingX) { + bx = rand.nextInt(length); + bz = rand.nextBoolean() ? 2 : 0; + } else { + bx = rand.nextBoolean() ? 2 : 0; + bz = rand.nextInt(length); + + } + world.setBlock(pos.offset(bx, 0, bz), branchState, 3); + if (rand.nextBoolean()) { + world.setBlock(pos.offset(bx, 1, bz), mossOrSeagrass(world, pos.offset(bx, 1, bz)), 3); + this.markAboveForPostProcessing(world, pos.offset(bx, 0, bz)); + } + } + + return true; + } + + private BlockState mossOrSeagrass(WorldGenLevel level, BlockPos pos) { + //no moss if we're cold + if(level.getBlockState(pos.below(2)).getMaterial() == Material.SNOW) { + return Blocks.AIR.defaultBlockState(); + } + return level.getBlockState(pos).getMaterial() == Material.WATER ? Blocks.SEAGRASS.defaultBlockState() : TFBlocks.MOSS_PATCH.get().defaultBlockState(); + } + + private BlockState hollowOrNormal(WorldGenLevel level, boolean shouldBeHollow, BlockState hollow, BlockState normal) { + return ((shouldBeHollow || level.getRandom().nextInt(3) == 0) && hollow != null) ? hollow : normal; + } + + private HollowLogVariants.Horizontal determineHollowProperties(WorldGenLevel world, BlockPos pos, RandomSource rand) { + return //If we're underwater, submerge in water + world.getBlockState(pos).getMaterial() == Material.WATER ? HollowLogVariants.Horizontal.WATERLOGGED : + //if we're in snow, add some snow + world.getBlockState(pos).is(BlockTags.SNOW) ? HollowLogVariants.Horizontal.SNOW : + //maybe add moss + grass + rand.nextInt(5) == 0 ? HollowLogVariants.Horizontal.MOSS_AND_GRASS : + //maybe some moss + rand.nextInt(3) == 0 ? HollowLogVariants.Horizontal.MOSS : + //or maybe nothing + HollowLogVariants.Horizontal.EMPTY; + } +} diff --git a/src/main/java/twilightforest/world/components/feature/ThornFeature.java b/src/main/java/twilightforest/world/components/feature/ThornFeature.java new file mode 100644 index 0000000000..636453a028 --- /dev/null +++ b/src/main/java/twilightforest/world/components/feature/ThornFeature.java @@ -0,0 +1,119 @@ +package twilightforest.world.components.feature; + +import com.mojang.serialization.Codec; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.tags.BlockTags; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.DirectionalBlock; +import net.minecraft.world.level.block.LeavesBlock; +import net.minecraft.world.level.block.RotatedPillarBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.Heightmap; +import net.minecraft.world.level.levelgen.feature.Feature; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; +import twilightforest.init.TFBlocks; +import twilightforest.util.WorldUtil; +import twilightforest.world.components.feature.config.ThornsConfig; + +public class ThornFeature extends Feature { + public ThornFeature(Codec config) { + super(config); + } + + @Override + public boolean place(FeaturePlaceContext ctx) { + WorldGenLevel world = ctx.level(); + BlockPos pos = ctx.origin(); + RandomSource rand = ctx.random(); + + + // make a 3-5 long stack going up + int nextLength = 2 + rand.nextInt(4); + int maxLength = 2 + rand.nextInt(4) + rand.nextInt(4) + rand.nextInt(4); + + placeThorns(world, rand, pos, nextLength, Direction.UP, maxLength, pos, ctx.config(), true); + + return true; + } + + private void placeThorns(WorldGenLevel world, RandomSource rand, BlockPos pos, int length, Direction dir, int maxLength, BlockPos oPos, ThornsConfig config, boolean avoidGiantCloud) { + boolean complete = false; + for (int i = 0; i < length; i++) { + BlockPos dPos = pos.relative(dir, i); + + // Makes it avoid the troll clouds + if (!avoidGiantCloud || dPos.getY() - 64 <= WorldUtil.getBaseHeight(world, dPos.getX(), dPos.getZ(), Heightmap.Types.MOTION_BLOCKING_NO_LEAVES)) { + if (Math.abs(dPos.getX() - oPos.getX()) < config.maxSpread() && Math.abs(dPos.getZ() - oPos.getZ()) < config.maxSpread() && canPlaceThorns(world, dPos)) { + world.setBlock(dPos, TFBlocks.BROWN_THORNS.get().defaultBlockState().setValue(RotatedPillarBlock.AXIS, dir.getAxis()), 1 | 2); + world.getChunk(dPos).markPosForPostprocessing(dPos); + + // did we make it to the end? + if (i == length - 1) { + complete = true; + // maybe a leaf? or a rose? + if (rand.nextInt(config.chanceOfLeaf()) == 0 && world.isEmptyBlock(dPos.relative(dir))) { + if (rand.nextInt(config.chanceLeafIsRose()) > 0) { + // leaf + world.setBlock(dPos.relative(dir), TFBlocks.THORN_LEAVES.get().defaultBlockState().setValue(LeavesBlock.DISTANCE, 1), 3); + } else { + // rose + world.setBlock(dPos.relative(dir), TFBlocks.THORN_ROSE.get().defaultBlockState().setValue(DirectionalBlock.FACING, dir), 3); + } + } + } + } else { + break; + } + } else { + break; + } + } + + // add another off the end + if (complete && maxLength > 1) { + + Direction nextDir = Direction.getRandom(rand); + + BlockPos nextPos = pos.relative(dir, length - 1).relative(nextDir); + int nextLength = 1 + rand.nextInt(maxLength); + + this.placeThorns(world, rand, nextPos, nextLength, nextDir, maxLength - 1, oPos, config, false); + } + + // maybe another branch off the middle + if (complete && length > 3 && rand.nextInt(config.chanceOfBranch()) == 0) { + + int middle = rand.nextInt(length); + + Direction nextDir = Direction.getRandom(rand); + + BlockPos nextPos = pos.relative(dir, middle).relative(nextDir); + int nextLength = 1 + rand.nextInt(maxLength); + + this.placeThorns(world, rand, nextPos, nextLength, nextDir, maxLength - 1, oPos, config, false); + } + + // maybe a leaf + if (complete && length > 3 && rand.nextInt(config.chanceOfLeaf()) == 0) { + + int middle = rand.nextInt(length); + + Direction nextDir = Direction.getRandom(rand); + + BlockPos nextPos = pos.relative(dir, middle).relative(nextDir); + + if (world.isEmptyBlock(nextPos)) { + world.setBlock(nextPos, TFBlocks.THORN_LEAVES.get().defaultBlockState().setValue(LeavesBlock.DISTANCE, 1), 3/*.with(LeavesBlock.CHECK_DECAY, false)*/); + } + } + } + + private boolean canPlaceThorns(LevelAccessor world, BlockPos pos) { + BlockState state = world.getBlockState(pos); + return state.isAir() + || state.is(BlockTags.LEAVES); + } +} diff --git a/src/main/java/twilightforest/world/components/feature/UndergroundPlantFeature.java b/src/main/java/twilightforest/world/components/feature/UndergroundPlantFeature.java new file mode 100644 index 0000000000..8b173d5d29 --- /dev/null +++ b/src/main/java/twilightforest/world/components/feature/UndergroundPlantFeature.java @@ -0,0 +1,46 @@ +package twilightforest.world.components.feature; + +import com.mojang.serialization.Codec; +import net.minecraft.core.BlockPos; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.levelgen.feature.Feature; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; +import net.minecraft.world.level.levelgen.feature.configurations.BlockStateConfiguration; +import twilightforest.init.TFBlocks; + +public class UndergroundPlantFeature extends Feature { + + public UndergroundPlantFeature(Codec config) { + super(config); + } + + @Override + public boolean place(FeaturePlaceContext ctx) { + WorldGenLevel world = ctx.level(); + BlockPos pos = ctx.origin(); + RandomSource random = ctx.random(); + + int copyX = pos.getX(); + int copyZ = pos.getZ(); + + for (; pos.getY() > world.getMinBuildHeight(); pos = pos.below()) { + if (world.isEmptyBlock(pos) && random.nextInt(6) > 0) { + if (ctx.config().state.canSurvive(ctx.level(), pos)) { + if (ctx.config().state.is(TFBlocks.TROLLVIDR.get()) && random.nextInt(10) == 0) { + world.setBlock(pos, TFBlocks.UNRIPE_TROLLBER.get().defaultBlockState(), 16 | 2); + } else { + world.setBlock(pos, ctx.config().state, 16 | 2); + } + } + } else { + pos = new BlockPos( + copyX + random.nextInt(4) - random.nextInt(4), + pos.getY(), + copyZ + random.nextInt(4) - random.nextInt(4) + ); + } + } + return true; + } +} diff --git a/src/main/java/twilightforest/world/components/feature/WebFeature.java b/src/main/java/twilightforest/world/components/feature/WebFeature.java new file mode 100644 index 0000000000..c8eec5b625 --- /dev/null +++ b/src/main/java/twilightforest/world/components/feature/WebFeature.java @@ -0,0 +1,40 @@ +package twilightforest.world.components.feature; + +import com.mojang.serialization.Codec; +import net.minecraft.tags.BlockTags; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.Feature; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import twilightforest.init.TFBlocks; + +public class WebFeature extends Feature { + + public WebFeature(Codec config) { + super(config); + } + + private static boolean isValidMaterial(BlockState state) { + return state.is(BlockTags.LOGS) || state.is(BlockTags.LEAVES); + } + + @Override + public boolean place(FeaturePlaceContext config) { + WorldGenLevel world = config.level(); + BlockPos pos = config.origin().above(config.random().nextInt(world.getMaxBuildHeight() - config.origin().getY())); + while (pos.getY() > config.origin().getY()) { + pos = pos.below(); + if (world.isEmptyBlock(pos.below()) && isValidMaterial(world.getBlockState(pos))) { + world.setBlock(pos.below(), Blocks.COBWEB.defaultBlockState(), 16 | 2); + return true; + } + } + + return false; + } +} diff --git a/src/main/java/twilightforest/world/components/feature/WoodRootFeature.java b/src/main/java/twilightforest/world/components/feature/WoodRootFeature.java new file mode 100644 index 0000000000..aea42639a2 --- /dev/null +++ b/src/main/java/twilightforest/world/components/feature/WoodRootFeature.java @@ -0,0 +1,110 @@ +package twilightforest.world.components.feature; + +import com.mojang.serialization.Codec; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.levelgen.feature.Feature; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; +import net.minecraft.world.level.levelgen.feature.stateproviders.BlockStateProvider; +import twilightforest.util.FeatureLogic; +import twilightforest.util.FeaturePlacers; +import twilightforest.util.VoxelBresenhamIterator; +import twilightforest.world.components.feature.config.RootConfig; + +import java.util.Random; + +public class WoodRootFeature extends Feature { + public WoodRootFeature(Codec configIn) { + super(configIn); + } + + @Override + public boolean place(FeaturePlaceContext ctx) { + WorldGenLevel world = ctx.level(); + BlockPos pos = ctx.origin(); + RandomSource rand = ctx.random(); + + // start must be in stone + if (world.getBlockState(pos).getBlock() != Blocks.STONE) { + return false; + } + + float length = rand.nextFloat() * 6.0F + rand.nextFloat() * 6.0F + 4.0F; + if (length > pos.getY()) { + length = pos.getY(); + } + + // tilt between 0.6 and 0.9 + float tilt = 0.6F + rand.nextFloat() * 0.3F; + + return drawRoot(world, rand, pos, pos, length, rand.nextFloat(), tilt, ctx.config().blockRoot(), ctx.config().oreRoot()); + } + + private boolean drawRoot(LevelAccessor world, RandomSource rand, BlockPos oPos, BlockPos pos, float length, float angle, float tilt, BlockStateProvider rootBlock, BlockStateProvider oreBlock) { + // generate a direction and a length + BlockPos dest = FeatureLogic.translate(pos, length, angle, tilt); + + // restrict x and z to within 7 + int limit = 6; + if (oPos.getX() + limit < dest.getX()) { + dest = new BlockPos(oPos.getX() + limit, dest.getY(), dest.getZ()); + } + if (oPos.getX() - limit > dest.getX()) { + dest = new BlockPos(oPos.getX() - limit, dest.getY(), dest.getZ()); + } + if (oPos.getZ() + limit < dest.getZ()) { + dest = new BlockPos(dest.getX(), dest.getY(), oPos.getZ() + limit); + } + if (oPos.getZ() - limit > dest.getZ()) { + dest = new BlockPos(dest.getX(), dest.getY(), oPos.getZ() - limit); + } + + // end must be in stone + if (world.getBlockState(dest).getBlock() != Blocks.STONE) { + return false; + } + + // if both the start and the end are in stone, put a root there + FeaturePlacers.traceRoot(world, (checkedPos, rootPlacement) -> world.setBlock(checkedPos, rootPlacement, 3), rand, rootBlock, new VoxelBresenhamIterator(pos, dest)); + + // if we are long enough, make either another root or an oreball + if (length > 8) { + if (rand.nextInt(3) > 0) { + // length > 8, usually split off into another root half as long + BlockPos nextSrc = FeatureLogic.translate(pos, length / 2, angle, tilt); + float nextAngle = (angle + 0.25F + (rand.nextFloat() * 0.5F)) % 1.0F; + float nextTilt = 0.6F + rand.nextFloat() * 0.3F; + drawRoot(world, rand, oPos, nextSrc, length / 2.0F, nextAngle, nextTilt, rootBlock, oreBlock); + } + } + + if (length > 6) { + if (rand.nextInt(4) == 0) { + // length > 6, potentially make oreball + BlockPos ballSrc = FeatureLogic.translate(pos, length / 2, angle, tilt); + BlockPos ballDest = FeatureLogic.translate(ballSrc, 1.5, (angle + 0.5F) % 1.0F, 0.75); + + this.placeRootBlock(world, ballSrc, oreBlock, rand); + this.placeRootBlock(world, new BlockPos(ballSrc.getX(), ballSrc.getY(), ballDest.getZ()), oreBlock, rand); + this.placeRootBlock(world, new BlockPos(ballDest.getX(), ballSrc.getY(), ballSrc.getZ()), oreBlock, rand); + this.placeRootBlock(world, new BlockPos(ballSrc.getX(), ballSrc.getY(), ballDest.getZ()), oreBlock, rand); + this.placeRootBlock(world, new BlockPos(ballSrc.getX(), ballDest.getY(), ballSrc.getZ()), oreBlock, rand); + this.placeRootBlock(world, new BlockPos(ballSrc.getX(), ballDest.getY(), ballDest.getZ()), oreBlock, rand); + this.placeRootBlock(world, new BlockPos(ballDest.getX(), ballDest.getY(), ballSrc.getZ()), oreBlock, rand); + this.placeRootBlock(world, ballDest, oreBlock, rand); + } + } + + return true; + } + + /** + * Function used to actually place root blocks if they're not going to break anything important + */ + protected boolean placeRootBlock(LevelAccessor world, BlockPos pos, BlockStateProvider state, RandomSource random) { + return FeatureLogic.canRootGrowIn(world, pos) && world.setBlock(pos, state.getState(random, pos), 3); + } +} diff --git a/src/main/java/twilightforest/world/components/feature/config/HollowLogConfig.java b/src/main/java/twilightforest/world/components/feature/config/HollowLogConfig.java new file mode 100644 index 0000000000..5a436bc0f8 --- /dev/null +++ b/src/main/java/twilightforest/world/components/feature/config/HollowLogConfig.java @@ -0,0 +1,25 @@ +package twilightforest.world.components.feature.config; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.feature.configurations.FeatureConfiguration; + +import org.jetbrains.annotations.Nullable; + +/** + * If a hollow version of the log you want doesnt exist, set it to Blocks.AIR and the feature will fix it up for ya + */ +public record HollowLogConfig(BlockState normal, BlockState hollow) implements FeatureConfiguration { + + public HollowLogConfig(BlockState normal, @Nullable BlockState hollow) { + this.normal = normal; + this.hollow = hollow; + } + + public static final Codec CODEC = + RecordCodecBuilder.create((p_67632_) -> p_67632_.group( + BlockState.CODEC.fieldOf("normal").forGetter((p_160757_) -> p_160757_.normal), + BlockState.CODEC.fieldOf("hollow").forGetter((p_160751_) -> p_160751_.hollow)) + .apply(p_67632_, HollowLogConfig::new)); +} diff --git a/src/main/java/twilightforest/world/components/feature/config/RootConfig.java b/src/main/java/twilightforest/world/components/feature/config/RootConfig.java new file mode 100644 index 0000000000..1cf9857d92 --- /dev/null +++ b/src/main/java/twilightforest/world/components/feature/config/RootConfig.java @@ -0,0 +1,13 @@ +package twilightforest.world.components.feature.config; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.world.level.levelgen.feature.configurations.FeatureConfiguration; +import net.minecraft.world.level.levelgen.feature.stateproviders.BlockStateProvider; + +public record RootConfig(BlockStateProvider blockRoot, BlockStateProvider oreRoot) implements FeatureConfiguration { + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + BlockStateProvider.CODEC.fieldOf("root_block").forGetter(RootConfig::blockRoot), + BlockStateProvider.CODEC.fieldOf("root_ore").forGetter(RootConfig::oreRoot) + ).apply(instance, RootConfig::new)); +} diff --git a/src/main/java/twilightforest/world/components/feature/config/SwizzleConfig.java b/src/main/java/twilightforest/world/components/feature/config/SwizzleConfig.java new file mode 100644 index 0000000000..94a17a63fa --- /dev/null +++ b/src/main/java/twilightforest/world/components/feature/config/SwizzleConfig.java @@ -0,0 +1,69 @@ +package twilightforest.world.components.feature.config; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.Holder; +import net.minecraft.core.HolderGetter; +import net.minecraft.core.HolderSet; +import net.minecraft.core.RegistryCodecs; +import net.minecraft.tags.TagKey; +import net.minecraft.util.RandomSource; +import net.minecraft.util.random.WeightedEntry; +import net.minecraft.util.random.WeightedRandomList; +import net.minecraft.world.level.levelgen.feature.configurations.FeatureConfiguration; +import net.minecraft.world.level.levelgen.structure.templatesystem.ProcessorRule; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructurePlaceSettings; +import org.jetbrains.annotations.NotNull; +import twilightforest.data.tags.CustomTagGenerator; +import twilightforest.init.custom.WoodPalettes; +import twilightforest.util.WoodPalette; +import twilightforest.world.components.processors.StateTransfiguringProcessor; +import twilightforest.world.components.processors.WoodPaletteSwizzle; + +import java.util.Collections; +import java.util.List; + +public record SwizzleConfig(HolderSet targets, WeightedRandomList>> paletteChoices, List preprocessingRules) implements FeatureConfiguration { + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + RegistryCodecs.homogeneousList(WoodPalettes.WOOD_PALETTE_TYPE_KEY).fieldOf("target_palettes").forGetter(SwizzleConfig::targets), + WeightedRandomList.codec(WeightedEntry.Wrapper.codec(RegistryCodecs.homogeneousList(WoodPalettes.WOOD_PALETTE_TYPE_KEY))).fieldOf("palette_choices").forGetter(SwizzleConfig::paletteChoices), + ProcessorRule.CODEC.listOf().fieldOf("preprocessing_rules").orElseGet(Collections::emptyList).forGetter(SwizzleConfig::preprocessingRules) + ).apply(instance, SwizzleConfig::new)); + + @NotNull + public static WeightedRandomList>> buildRarityPalette(HolderGetter paletteHolders) { + // Old code with chances: + // getRandomWeighted(RandomSource random) { + // int randomVal = random.nextInt(); + // if ((randomVal & 0b1) == 0) return ArrayUtil.wrapped(COMMON, randomVal >> 1); // 50% chance + // if ((randomVal & 0b10) == 0) return ArrayUtil.wrapped(UNCOMMON, randomVal >> 2); // 25% chance + // if ((randomVal & 0b1100) != 0) return ArrayUtil.wrapped(RARE, randomVal >> 4); // 18.75% chance + // return ArrayUtil.wrapped(TREASURE, randomVal >> 4); // 6.25% chance + // } + + WeightedEntry.Wrapper> common = // 50% chance + WeightedEntry.wrap(paletteHolders.get(CustomTagGenerator.WoodPaletteTagGenerator.COMMON_PALETTES).get(), 8); + WeightedEntry.Wrapper> uncommon = // 25% chance + WeightedEntry.wrap(paletteHolders.get(CustomTagGenerator.WoodPaletteTagGenerator.UNCOMMON_PALETTES).get(), 4); + WeightedEntry.Wrapper> rare = // 18.75% chance + WeightedEntry.wrap(paletteHolders.get(CustomTagGenerator.WoodPaletteTagGenerator.RARE_PALETTES).get(), 3); + WeightedEntry.Wrapper> treasure = // 6.25% chance + WeightedEntry.wrap(paletteHolders.get(CustomTagGenerator.WoodPaletteTagGenerator.TREASURE_PALETTES).get(), 1); + + return WeightedRandomList.create(common, uncommon, rare, treasure); + } + + public static SwizzleConfig generate(HolderGetter paletteHolders, TagKey swizzleMask, WeightedRandomList>> paletteChoices, ProcessorRule... postProcessingRules) { + return new SwizzleConfig(paletteHolders.getOrThrow(swizzleMask), paletteChoices, List.of(postProcessingRules)); + } + + public void buildAddProcessors(StructurePlaceSettings settings, RandomSource random) { + // If there's no rules then don't even bother adding the processor for them + if (!this.preprocessingRules().isEmpty()) + settings.addProcessor(new StateTransfiguringProcessor(this.preprocessingRules())); + + for (Holder targetPalette : this.targets) { + settings.addProcessor(new WoodPaletteSwizzle(targetPalette, this.paletteChoices().getRandom(random).get().getData().getRandomElement(random).get())); + } + } +} diff --git a/src/main/java/twilightforest/world/components/feature/config/TFTreeFeatureConfig.java b/src/main/java/twilightforest/world/components/feature/config/TFTreeFeatureConfig.java new file mode 100644 index 0000000000..d31d386c97 --- /dev/null +++ b/src/main/java/twilightforest/world/components/feature/config/TFTreeFeatureConfig.java @@ -0,0 +1,113 @@ +package twilightforest.world.components.feature.config; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.Lists; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.world.level.levelgen.feature.configurations.FeatureConfiguration; +import net.minecraft.world.level.levelgen.feature.stateproviders.BlockStateProvider; +import net.minecraft.world.level.levelgen.feature.treedecorators.TreeDecorator; + +import java.util.List; + +/** + * Follows similar structure to HugeTreeFeatureConfig + */ +public class TFTreeFeatureConfig implements FeatureConfiguration { + public static final Codec codecTFTreeConfig = RecordCodecBuilder.create(instance -> instance.group( + BlockStateProvider.CODEC.fieldOf("trunk_provider").forGetter(obj -> obj.trunkProvider), + BlockStateProvider.CODEC.fieldOf("leaves_provider").forGetter(obj -> obj.leavesProvider), + BlockStateProvider.CODEC.fieldOf("branch_provider").forGetter(obj -> obj.branchProvider), + BlockStateProvider.CODEC.fieldOf("roots_provider").forGetter(obj -> obj.rootsProvider), + Codec.INT.fieldOf("minimum_size").orElse(20).forGetter(obj -> obj.minHeight), + Codec.INT.fieldOf("add_first_five_chance").orElse(1).forGetter(obj -> obj.chanceAddFiveFirst), + Codec.INT.fieldOf("add_second_five_chance").orElse(1).forGetter(obj -> obj.chanceAddFiveSecond), + Codec.BOOL.fieldOf("has_leaves").orElse(true).forGetter(obj -> obj.hasLeaves), + Codec.BOOL.fieldOf("check_water").orElse(false).forGetter(obj -> obj.checkWater), + TreeDecorator.CODEC.listOf().fieldOf("decorators").orElseGet(ImmutableList::of).forGetter(obj -> obj.decorators) + ).apply(instance, TFTreeFeatureConfig::new)); + + public final BlockStateProvider trunkProvider; + public final BlockStateProvider leavesProvider; + public final BlockStateProvider branchProvider; + public final BlockStateProvider rootsProvider; + public final int minHeight; + public final int chanceAddFiveFirst; + public final int chanceAddFiveSecond; + public final boolean hasLeaves; + public final boolean checkWater; + public transient boolean forcePlacement; + public final List decorators; + + public TFTreeFeatureConfig(BlockStateProvider trunk, BlockStateProvider leaves, BlockStateProvider branch, BlockStateProvider roots, int height, int chanceFiveFirst, int chanceFiveSecond, boolean hasLeaves, boolean checkWater, List decorators) { + this.trunkProvider = trunk; + this.leavesProvider = leaves; + this.branchProvider = branch; + this.rootsProvider = roots; + this.minHeight = height; + // For some dumb reason this keeps getting -1 so you get `Math.max(x, 0)` for punishment + this.chanceAddFiveFirst = Math.max(chanceFiveFirst, 1); + this.chanceAddFiveSecond = Math.max(chanceFiveSecond, 1); + this.hasLeaves = hasLeaves; + this.checkWater = checkWater; + this.decorators = decorators; + } + + public void forcePlacement() { + this.forcePlacement = true; + } + + public static class Builder { + private final BlockStateProvider trunkProvider; + private final BlockStateProvider leavesProvider; + private final BlockStateProvider branchProvider; + private final BlockStateProvider rootsProvider; + private int baseHeight; + private int chanceFirstFive; + private int chanceSecondFive; + private boolean hasLeaves; + private boolean checkWater; + private final List decorators = Lists.newArrayList(); + + public Builder(BlockStateProvider trunk, BlockStateProvider leaves, BlockStateProvider branch, BlockStateProvider roots) { + this.trunkProvider = trunk; + this.leavesProvider = leaves; + this.branchProvider = branch; + this.rootsProvider = roots; + } + + public TFTreeFeatureConfig.Builder minHeight(int height) { + this.baseHeight = height; + return this; + } + + public TFTreeFeatureConfig.Builder chanceFirstFive(int chance) { + this.chanceFirstFive = chance; + return this; + } + + public TFTreeFeatureConfig.Builder chanceSecondFive(int chance) { + this.chanceSecondFive = chance; + return this; + } + + public TFTreeFeatureConfig.Builder noLeaves() { + this.hasLeaves = false; + return this; + } + + public TFTreeFeatureConfig.Builder checksWater() { + this.checkWater = true; + return this; + } + + public TFTreeFeatureConfig.Builder addDecorator(TreeDecorator deco) { + decorators.add(deco); + return this; + } + + public TFTreeFeatureConfig build() { + return new TFTreeFeatureConfig(trunkProvider, leavesProvider, branchProvider, rootsProvider, baseHeight, chanceFirstFive, chanceSecondFive, hasLeaves, checkWater, decorators); + } + } +} diff --git a/src/main/java/twilightforest/world/components/feature/config/ThornsConfig.java b/src/main/java/twilightforest/world/components/feature/config/ThornsConfig.java new file mode 100644 index 0000000000..8d73853c44 --- /dev/null +++ b/src/main/java/twilightforest/world/components/feature/config/ThornsConfig.java @@ -0,0 +1,14 @@ +package twilightforest.world.components.feature.config; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.world.level.levelgen.feature.configurations.FeatureConfiguration; + +public record ThornsConfig(int maxSpread, int chanceOfBranch , int chanceOfLeaf , int chanceLeafIsRose) implements FeatureConfiguration { + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + Codec.INT.fieldOf("max_spread").forGetter(ThornsConfig::maxSpread), + Codec.INT.fieldOf("chance_of_branch").forGetter(ThornsConfig::chanceOfBranch), + Codec.INT.fieldOf("chance_of_leaf").forGetter(ThornsConfig::chanceOfLeaf), + Codec.INT.fieldOf("chance_leaf_is_rose").forGetter(ThornsConfig::chanceLeafIsRose) + ).apply(instance, ThornsConfig::new)); +} diff --git a/src/main/java/twilightforest/world/components/feature/config/package-info.java b/src/main/java/twilightforest/world/components/feature/config/package-info.java new file mode 100644 index 0000000000..3679538412 --- /dev/null +++ b/src/main/java/twilightforest/world/components/feature/config/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.world.components.feature.config; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/world/components/feature/package-info.java b/src/main/java/twilightforest/world/components/feature/package-info.java new file mode 100644 index 0000000000..38d3945dbe --- /dev/null +++ b/src/main/java/twilightforest/world/components/feature/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.world.components.feature; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/world/components/feature/templates/DruidHutFeature.java b/src/main/java/twilightforest/world/components/feature/templates/DruidHutFeature.java new file mode 100644 index 0000000000..47669a8731 --- /dev/null +++ b/src/main/java/twilightforest/world/components/feature/templates/DruidHutFeature.java @@ -0,0 +1,164 @@ +package twilightforest.world.components.feature.templates; + +import com.mojang.serialization.Codec; +import net.minecraft.Util; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.*; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.SpawnerBlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.ChestType; +import net.minecraft.world.level.block.state.properties.StructureMode; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructurePlaceSettings; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplateManager; +import twilightforest.TwilightForestMod; +import twilightforest.init.TFEntities; +import twilightforest.loot.TFLootTables; +import twilightforest.util.EntityUtil; +import twilightforest.world.components.feature.config.SwizzleConfig; +import twilightforest.world.components.processors.CobbleVariants; +import twilightforest.world.components.processors.StoneBricksVariants; + +public class DruidHutFeature extends TemplateFeature { + public DruidHutFeature(Codec config) { + super(config); + } + + @Override + protected StructureTemplate getTemplate(StructureTemplateManager templateManager, RandomSource random) { + return templateManager.getOrCreate(Util.getRandom(DruidHutFeature.HutType.values(), random).resourceLocation); + } + + @Override + protected void modifySettings(StructurePlaceSettings settings, RandomSource random, SwizzleConfig config) { + config.buildAddProcessors(settings, random); + } + + @Override + protected void postPlacement(WorldGenLevel world, RandomSource random, StructureTemplateManager templateManager, Rotation rotation, Mirror mirror, StructurePlaceSettings placementSettings, BlockPos placementPos, SwizzleConfig config) { + if (random.nextBoolean()) { + StructureTemplate template = templateManager.getOrCreate(DruidHutFeature.BasementType.values()[random.nextInt(DruidHutFeature.BasementType.size)].getBasement(random.nextBoolean())); + + if(template == null) return; + + placementPos = placementPos.below(12).relative(rotation.rotate(mirror.mirror(Direction.NORTH)), 1).relative(rotation.rotate(mirror.mirror(Direction.EAST)), 1); + + placementSettings.clearProcessors(); + config.buildAddProcessors(placementSettings, random); + placementSettings.addProcessor(CobbleVariants.INSTANCE).addProcessor(StoneBricksVariants.INSTANCE); + + template.placeInWorld(world, placementPos, placementPos, placementSettings, random, 20); + + for (StructureTemplate.StructureBlockInfo info : template.filterBlocks(placementPos, placementSettings, Blocks.STRUCTURE_BLOCK)) + if (info.nbt != null && StructureMode.valueOf(info.nbt.getString("mode")) == StructureMode.DATA) + this.processMarkers(info, world, rotation, mirror, random); + } + } + + @Override + protected void processMarkers(StructureTemplate.StructureBlockInfo info, WorldGenLevel world, Rotation rotation, Mirror mirror, RandomSource random) { + String s = info.nbt.getString("metadata"); + BlockPos blockPos = info.pos; + /** + `spawner` will place a Druid spawner. + + `loot` will place a chest facing the was-North. + + `lootT` will place a trapped chest facing the was-North. + + `lootW` will place a chest facing the was-West. + `lootS` will place a chest facing the was-South. + + `lootET` will place a trapped chest facing the was-East. + `lootNT` will place a trapped chest facing the was-North. + */ + // removeBlock calls are required due to WorldGenRegion jank with cached TEs, this ensures the correct TE is used + if ("spawner".equals(s)) { + if (world.removeBlock(blockPos, false) && world.setBlock(blockPos, Blocks.SPAWNER.defaultBlockState(), 16 | 2)) { + BlockEntity tile = world.getBlockEntity(blockPos); + + if (tile instanceof SpawnerBlockEntity ms) { + ms.setEntityId(TFEntities.SKELETON_DRUID.get(), random); + } + } + } else if (s.startsWith("loot")) { + world.removeBlock(blockPos, false); + BlockState chest = s.endsWith("T") ? Blocks.TRAPPED_CHEST.defaultBlockState() : Blocks.CHEST.defaultBlockState(); + + chest = switch (s.substring(5, 6)) { + case "L" -> chest.setValue(ChestBlock.TYPE, mirror != Mirror.NONE ? ChestType.RIGHT : ChestType.LEFT); + case "R" -> chest.setValue(ChestBlock.TYPE, mirror != Mirror.NONE ? ChestType.LEFT : ChestType.RIGHT); + default -> chest.setValue(ChestBlock.TYPE, ChestType.SINGLE); + }; + + chest = switch (s.substring(4, 5)) { + case "W" -> chest.setValue(HorizontalDirectionalBlock.FACING, rotation.rotate(mirror.mirror(Direction.WEST))); + case "E" -> chest.setValue(HorizontalDirectionalBlock.FACING, rotation.rotate(mirror.mirror(Direction.EAST))); + case "S" -> chest.setValue(HorizontalDirectionalBlock.FACING, rotation.rotate(mirror.mirror(Direction.SOUTH))); + default -> chest.setValue(HorizontalDirectionalBlock.FACING, rotation.rotate(mirror.mirror(Direction.NORTH))); + }; + + TFLootTables.BASEMENT.generateLootContainer(world, blockPos, chest, 16 | 2); + } else if (s.startsWith("painting")) { + world.removeBlock(blockPos, false); + + + Direction direction = rotation.rotate(mirror.mirror(switch (s.substring(8, 9)) { + case "W" -> Direction.WEST; + case "E" -> Direction.EAST; + case "S" -> Direction.SOUTH; + default -> Direction.NORTH; + })); + + String widthS = s.substring(9, 10); + int paintingWidth = widthS.matches("\\d+") ? Integer.parseInt(widthS) << 4 : 16; + + boolean hasFlipped = mirror != Mirror.NONE; + BlockPos hangPos = hasFlipped ? blockPos.relative(direction.getClockWise()) : blockPos; + + EntityUtil.tryHangPainting(world, hangPos, direction, EntityUtil.getPaintingOfSize(random, paintingWidth, paintingWidth == 32 || paintingWidth == 64 ? 32 : 16, true)); + } + } + + private enum HutType { + REGULAR (TwilightForestMod.prefix("feature/druid_hut/druid_hut" )), + SIDEWAYS (TwilightForestMod.prefix("feature/druid_hut/druid_sideways" )), + DOUBLE_DECK(TwilightForestMod.prefix("feature/druid_hut/druid_doubledeck")); + + private final ResourceLocation resourceLocation; + + HutType(ResourceLocation rl) { + this.resourceLocation = rl; + } + } + + private enum BasementType { + STUDY (TwilightForestMod.prefix("feature/druid_hut/basement_study" ), TwilightForestMod.prefix("feature/druid_hut/basement_study_trap" )), + SHELVES(TwilightForestMod.prefix("feature/druid_hut/basement_shelves"), TwilightForestMod.prefix("feature/druid_hut/basement_shelves_trap")), + GALLERY(TwilightForestMod.prefix("feature/druid_hut/basement_gallery"), TwilightForestMod.prefix("feature/druid_hut/basement_gallery_trap")); + + private final ResourceLocation resourceLocation; + private final ResourceLocation resourceLocationTrap; + + BasementType(ResourceLocation rl, ResourceLocation rlTrap) { + this.resourceLocation = rl; + this.resourceLocationTrap = rlTrap; + increment(); + } + + private static int size; + + private static void increment() { + ++size; + } + + private ResourceLocation getBasement(boolean trapped) { + return trapped ? resourceLocationTrap : resourceLocation; + } + } +} diff --git a/src/main/java/twilightforest/world/components/feature/templates/FancyWellFeature.java b/src/main/java/twilightforest/world/components/feature/templates/FancyWellFeature.java new file mode 100644 index 0000000000..5b0893a1ba --- /dev/null +++ b/src/main/java/twilightforest/world/components/feature/templates/FancyWellFeature.java @@ -0,0 +1,68 @@ +package twilightforest.world.components.feature.templates; + +import com.mojang.serialization.Codec; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.BarrelBlock; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.Mirror; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.state.properties.StructureMode; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructurePlaceSettings; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplateManager; +import org.jetbrains.annotations.Nullable; +import twilightforest.TwilightForestMod; +import twilightforest.loot.TFLootTables; +import twilightforest.world.components.feature.config.SwizzleConfig; +import twilightforest.world.components.processors.SmartGrassProcessor; + +public class FancyWellFeature extends TemplateFeature { + private static final ResourceLocation WELL_TOP = TwilightForestMod.prefix("feature/well/fancy_well_top"); + private static final ResourceLocation WELL_BOTTOM = TwilightForestMod.prefix("feature/well/fancy_well_bottom"); + + public FancyWellFeature(Codec config) { + super(config); + } + + @Nullable + @Override + protected StructureTemplate getTemplate(StructureTemplateManager templateManager, RandomSource random) { + return templateManager.getOrCreate(WELL_TOP); + } + + @Override + protected void modifySettings(StructurePlaceSettings settings, RandomSource random, SwizzleConfig config) { + config.buildAddProcessors(settings, random); + } + + @Override + protected void postPlacement(WorldGenLevel world, RandomSource random, StructureTemplateManager templateManager, Rotation rotation, Mirror mirror, StructurePlaceSettings placementSettings, BlockPos placementPos, SwizzleConfig config) { + StructureTemplate template = templateManager.getOrCreate(WELL_BOTTOM); + + if (template == null) return; + + placementPos = placementPos.below(template.getSize().getY());//.relative(rotation.rotate(mirror.mirror(Direction.SOUTH)), 1).relative(rotation.rotate(mirror.mirror(Direction.EAST)), 1); + placementSettings.addProcessor(SmartGrassProcessor.INSTANCE); + + template.placeInWorld(world, placementPos, placementPos, placementSettings, random, 20); + + for (StructureTemplate.StructureBlockInfo info : template.filterBlocks(placementPos, placementSettings, Blocks.STRUCTURE_BLOCK)) + if (info.nbt != null && StructureMode.valueOf(info.nbt.getString("mode")) == StructureMode.DATA) + this.processMarkers(info, world, rotation, mirror, random); + } + + @Override + protected void processMarkers(StructureTemplate.StructureBlockInfo info, WorldGenLevel world, Rotation rotation, Mirror mirror, RandomSource random) { + String s = info.nbt.getString("metadata"); + + if (!s.startsWith("loot")) return; + + world.removeBlock(info.pos, false); + + TFLootTables.FANCY_WELL.generateLootContainer(world, info.pos, Blocks.BARREL.defaultBlockState().setValue(BarrelBlock.FACING, Direction.UP), 16 | 2); + } +} diff --git a/src/main/java/twilightforest/world/components/feature/templates/GraveyardFeature.java b/src/main/java/twilightforest/world/components/feature/templates/GraveyardFeature.java new file mode 100644 index 0000000000..97bbfb4b60 --- /dev/null +++ b/src/main/java/twilightforest/world/components/feature/templates/GraveyardFeature.java @@ -0,0 +1,266 @@ +package twilightforest.world.components.feature.templates; + +import com.google.common.collect.ImmutableSet; +import com.google.common.math.StatsAccumulator; +import com.mojang.serialization.Codec; +import net.minecraft.core.Vec3i; +import net.minecraft.util.RandomSource; +import net.minecraft.world.entity.MobSpawnType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.ChestBlock; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; +import net.minecraft.world.level.levelgen.structure.templatesystem.*; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.block.state.properties.StructureMode; +import net.minecraft.world.level.block.entity.SpawnerBlockEntity; +import net.minecraft.core.Direction; +import net.minecraft.world.level.block.Mirror; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.levelgen.Heightmap; +import net.minecraft.world.level.levelgen.feature.Feature; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraftforge.event.ForgeEventFactory; +import org.apache.commons.lang3.tuple.Pair; +import twilightforest.TwilightForestMod; +import twilightforest.entity.monster.Wraith; +import twilightforest.init.TFEntities; +import twilightforest.loot.TFLootTables; +import twilightforest.init.TFStructureProcessors; + +import org.jetbrains.annotations.Nullable; +import java.util.ArrayList; +import java.util.List; + +public class GraveyardFeature extends Feature { + private static final ResourceLocation GRAVEYARD = TwilightForestMod.prefix("feature/graveyard/graveyard"); + private static final ResourceLocation TRAP = TwilightForestMod.prefix("feature/graveyard/grave_trap"); + private static final ImmutableSet MATERIAL_WHITELIST = ImmutableSet.of(Material.DIRT, Material.GRASS, Material.LEAVES, Material.WOOD, Material.PLANT, Material.STONE); + + public GraveyardFeature(Codec config) { + super(config); + } + + private static boolean offsetToAverageGroundLevel(WorldGenLevel world, BlockPos.MutableBlockPos startPos, Vec3i size) { + StatsAccumulator heights = new StatsAccumulator(); + + for (int dx = 0; dx < size.getX(); dx++) { + for (int dz = 0; dz < size.getZ(); dz++) { + + int x = startPos.getX() + dx; + int z = startPos.getZ() + dz; + + int y = world.getHeight(Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, x, z); + + while (y >= 0) { + BlockState state = world.getBlockState(new BlockPos(x, y, z)); + if (isBlockNotOk(state)) + return false; + if (isBlockOk(state)) + break; + y--; + } + + if (y < 0) + return false; + + heights.add(y); + } + } + + if (heights.populationStandardDeviation() > 2.0) { + return false; + } + + int baseY = (int) Math.round(heights.mean()); + int maxY = (int) heights.max(); + + startPos.setY(baseY); + + return isAreaClear(world, startPos.above(maxY - baseY + 1), startPos.offset(size)); + } + + private static boolean isAreaClear(BlockGetter world, BlockPos min, BlockPos max) { + for (BlockPos pos : BlockPos.betweenClosed(min, max)) { + Material material = world.getBlockState(pos).getMaterial(); + if (!material.isReplaceable() && !MATERIAL_WHITELIST.contains(material) && !material.isLiquid()) { + return false; + } + } + return true; + } + + private static boolean isBlockOk(BlockState state) { + Material material = state.getMaterial(); + return material == Material.STONE || material == Material.DIRT || material == Material.GRASS || material == Material.SAND; + } + + private static boolean isBlockNotOk(BlockState state) { + Material material = state.getMaterial(); + return material == Material.WATER || material == Material.LAVA || state.getBlock() == Blocks.BEDROCK; + } + + @Override + public boolean place(FeaturePlaceContext ctx) { + WorldGenLevel world = ctx.level(); + BlockPos pos = ctx.origin(); + RandomSource rand = ctx.random(); + + int flags = 16 | 2 | 1; + + StructureTemplateManager templatemanager = world.getLevel().getServer().getStructureManager(); + StructureTemplate base = templatemanager.getOrCreate(GRAVEYARD); + if (base == null) + return false; + List> graves = new ArrayList<>(); + StructureTemplate trap = templatemanager.getOrCreate(TRAP); + if (trap == null) + return false; + for (GraveType type : GraveType.VALUES) { + StructureTemplate grave = templatemanager.getOrCreate(type.RL); + if (grave == null) + return false; + graves.add(Pair.of(type, grave)); + } + + Rotation[] rotations = Rotation.values(); + Rotation rotation = rotations[rand.nextInt(rotations.length)]; + + Mirror[] mirrors = Mirror.values(); + Mirror mirror = mirrors[rand.nextInt(mirrors.length + 1) % mirrors.length]; + + Vec3i transformedSize = base.getSize(rotation); + Vec3i transformedGraveSize = graves.get(0).getValue().getSize(rotation); + + ChunkPos chunkpos = new ChunkPos(pos.offset(-8, 0, -8)); + ChunkPos chunkendpos = new ChunkPos(pos.offset(-8, 0, -8).offset(transformedSize)); + BoundingBox structureboundingbox = new BoundingBox(chunkpos.getMinBlockX() + 8, 0, chunkpos.getMinBlockZ() + 8, chunkendpos.getMaxBlockX() + 8, 255, chunkendpos.getMaxBlockZ() + 8); + StructurePlaceSettings placementsettings = (new StructurePlaceSettings()).setMirror(mirror).setRotation(rotation).setBoundingBox(structureboundingbox).setRandom(rand); + + BlockPos posSnap = chunkpos.getWorldPosition().offset(8, pos.getY() - 1, 8); // Verify this is correct. Originally chunkpos.getBlock(8, pos.getY() - 1, 8); + BlockPos.MutableBlockPos startPos = new BlockPos.MutableBlockPos(posSnap.getX(), posSnap.getY(), posSnap.getZ()); + + if (!offsetToAverageGroundLevel(world, startPos, transformedSize)) { + return false; + } + + BlockPos placementPos = base.getZeroPositionWithTransform(startPos, mirror, rotation).offset(1, -1, 0); + Vec3i size = transformedSize.offset(-1, 0, -1); + Vec3i graveSize = transformedGraveSize.offset(-1, 0, -1); + + base.placeInWorld(world, placementPos, placementPos, placementsettings.addProcessor(new WebTemplateProcessor()), rand, flags); + List data = new ArrayList<>(base.filterBlocks(placementPos, placementsettings, Blocks.STRUCTURE_BLOCK)); + + BlockPos start = startPos.offset(1, 1, 0); + BlockPos end = start.offset(size.getX(), 0, size.getZ()); + + for (int x = 1; x <= size.getX() - 1; x++) + for (int z = 1; z <= size.getZ() - 1; z++) + if (world.isEmptyBlock(start.offset(x, 0, z)) && rand.nextInt(12) == 0) + world.setBlock(start.offset(x, 0, z), Blocks.COBWEB.defaultBlockState(), flags); + + BlockPos inner = start.offset(2, 0, 2); + BlockPos bound = end.offset(-2, 0, -2); + BlockPos innerSize = new BlockPos(bound.getX() - inner.getX(), bound.getY() - inner.getY(), bound.getZ() - inner.getZ()); + BlockPos fixed = inner.offset( + + (rotation == Rotation.CLOCKWISE_180 ? graveSize.getX() : 0) + (mirror == Mirror.FRONT_BACK ? transformedGraveSize.getX() - 1 : 0) * (rotation == Rotation.CLOCKWISE_180 ? -1 : 1), + + 0, + + (rotation == Rotation.COUNTERCLOCKWISE_90 ? graveSize.getZ() : 0) + (mirror == Mirror.FRONT_BACK ? transformedGraveSize.getZ() - 1 : 0) * (rotation == Rotation.COUNTERCLOCKWISE_90 ? -1 : 1) + + ); + BlockPos fixedSize = innerSize.offset(-graveSize.getX(), 0, -graveSize.getZ()); + BlockPos chestloc = new BlockPos(rand.nextInt(2) - (mirror == Mirror.FRONT_BACK ? 1 : 0), 1, 0).rotate(rotation); + + for (int x = 0; x <= fixedSize.getX(); x += (rotation == Rotation.CLOCKWISE_90 || rotation == Rotation.COUNTERCLOCKWISE_90 ? 2 : 5)) { + for (int z = 0; z <= fixedSize.getZ(); z += (rotation == Rotation.NONE || rotation == Rotation.CLOCKWISE_180 ? 2 : 5)) { + if (x == innerSize.getX() / 2 || z == innerSize.getZ() / 2) + continue; + BlockPos placement = fixed.offset(x, -2, z); + Pair grave = graves.get(rand.nextInt(graves.size())); + grave.getValue().placeInWorld(world, placement, placement, placementsettings, rand, flags); + data.addAll(grave.getValue().filterBlocks(placement, placementsettings, Blocks.STRUCTURE_BLOCK)); + if (grave.getKey() == GraveType.Full) { + if (rand.nextBoolean()) { + if (rand.nextInt(3) == 0) { + placement = placement.offset(new BlockPos(mirror == Mirror.FRONT_BACK ? 1 : -1, 0, mirror == Mirror.LEFT_RIGHT ? 1 : -1).rotate(rotation)); + trap.placeInWorld(world, placement, placement, placementsettings, rand, flags); + } + data.addAll(trap.filterBlocks(placementPos, placementsettings, Blocks.STRUCTURE_BLOCK)); + if (world.setBlock(placement.offset(chestloc), Blocks.TRAPPED_CHEST.defaultBlockState().setValue(ChestBlock.FACING, Direction.WEST).rotate(rotation).mirror(mirror), flags)) { + TFLootTables.GRAVEYARD.generateChestContents(world, placement.offset(chestloc)); + world.setBlock(placement.offset(chestloc).below(), Blocks.MOSSY_COBBLESTONE.defaultBlockState(), 3); + } + Wraith wraith = new Wraith(TFEntities.WRAITH.get(), world.getLevel()); + wraith.setPos(placement.getX(), placement.getY(), placement.getZ()); + ForgeEventFactory.onFinalizeSpawn(wraith, world, world.getCurrentDifficultyAt(placement), MobSpawnType.STRUCTURE, null, null); + world.addFreshEntity(wraith); + } + } + } + } + + data.forEach(info -> { + if (info.nbt != null && StructureMode.valueOf(info.nbt.getString("mode")) == StructureMode.DATA) { + String s = info.nbt.getString("metadata"); + BlockPos p = info.pos; + if ("spawner".equals(s)) { + world.removeBlock(p, false); + if (rand.nextInt(4) == 0) { + if (world.setBlock(p, Blocks.SPAWNER.defaultBlockState(), 3)) { + SpawnerBlockEntity ms = (SpawnerBlockEntity) world.getBlockEntity(p); + if (ms != null) + ms.setEntityId(TFEntities.RISING_ZOMBIE.get(), rand); + } + } + } + } + }); + + return true; + } + + private enum GraveType { + + Full(TwilightForestMod.prefix("feature/graveyard/grave_full")), + + Upper(TwilightForestMod.prefix("feature/graveyard/grave_upper")), + + Lower(TwilightForestMod.prefix("feature/graveyard/grave_lower")); + + private static final GraveType[] VALUES = values(); + private final ResourceLocation RL; + + GraveType(ResourceLocation rl) { + this.RL = rl; + } + } + + public static class WebTemplateProcessor extends StructureProcessor { + public static final WebTemplateProcessor INSTANCE = new WebTemplateProcessor(); + public static final Codec CODEC = Codec.unit(() -> INSTANCE); + + private WebTemplateProcessor() { + } + + @Override + protected StructureProcessorType getType() { + return TFStructureProcessors.WEB.get(); + } + + @Nullable + @Override + public StructureTemplate.StructureBlockInfo process(LevelReader worldIn, BlockPos pos, BlockPos piecepos, StructureTemplate.StructureBlockInfo p_process_3_, StructureTemplate.StructureBlockInfo blockInfo, StructurePlaceSettings settings, @Nullable StructureTemplate template) { + return blockInfo.state.getBlock() == Blocks.GRASS_BLOCK ? blockInfo : settings.getRandom(pos).nextInt(5) == 0 ? new StructureTemplate.StructureBlockInfo(pos, Blocks.COBWEB.defaultBlockState(), null) : blockInfo; + } + } +} diff --git a/src/main/java/twilightforest/world/components/feature/templates/GroveRuinsFeature.java b/src/main/java/twilightforest/world/components/feature/templates/GroveRuinsFeature.java new file mode 100644 index 0000000000..d37bacb9d6 --- /dev/null +++ b/src/main/java/twilightforest/world/components/feature/templates/GroveRuinsFeature.java @@ -0,0 +1,33 @@ +package twilightforest.world.components.feature.templates; + +import com.mojang.serialization.Codec; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructurePlaceSettings; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplateManager; +import twilightforest.TwilightForestMod; +import twilightforest.world.components.processors.StoneBricksVariants; + +import org.jetbrains.annotations.Nullable; + +public class GroveRuinsFeature extends TemplateFeature { + private static final ResourceLocation PILLAR = TwilightForestMod.prefix("feature/ruins/grove_pillar"); + private static final ResourceLocation ARCH = TwilightForestMod.prefix("feature/ruins/grove_arch"); + + public GroveRuinsFeature(Codec config) { + super(config); + } + + @Nullable + @Override + protected StructureTemplate getTemplate(StructureTemplateManager templateManager, RandomSource random) { + return templateManager.getOrCreate(random.nextBoolean() ? PILLAR : ARCH); + } + + @Override + protected void modifySettings(StructurePlaceSettings settings, RandomSource random, NoneFeatureConfiguration config) { + settings.addProcessor(StoneBricksVariants.INSTANCE); + } +} diff --git a/src/main/java/twilightforest/world/components/feature/templates/SimpleWellFeature.java b/src/main/java/twilightforest/world/components/feature/templates/SimpleWellFeature.java new file mode 100644 index 0000000000..46c9ccfa52 --- /dev/null +++ b/src/main/java/twilightforest/world/components/feature/templates/SimpleWellFeature.java @@ -0,0 +1,88 @@ +package twilightforest.world.components.feature.templates; + +import com.mojang.serialization.Codec; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.*; +import net.minecraft.world.level.block.state.properties.StructureMode; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructurePlaceSettings; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplateManager; +import org.jetbrains.annotations.Nullable; +import twilightforest.TwilightForestMod; +import twilightforest.loot.TFLootTables; +import twilightforest.world.components.feature.config.SwizzleConfig; +import twilightforest.world.components.processors.SmartGrassProcessor; + +public class SimpleWellFeature extends TemplateFeature { + private static final ResourceLocation WELL_TOP = TwilightForestMod.prefix("feature/well/simple_well_top"); + private static final ResourceLocation WELL_BOTTOM = TwilightForestMod.prefix("feature/well/simple_well_bottom"); + + public SimpleWellFeature(Codec config) { + super(config); + } + + @Nullable + @Override + protected StructureTemplate getTemplate(StructureTemplateManager templateManager, RandomSource random) { + return templateManager.getOrCreate(WELL_TOP); + } + + @Override + protected int yLevelOffset() { + return 1; + } + + @Override + protected void modifySettings(StructurePlaceSettings settings, RandomSource random, SwizzleConfig config) { + config.buildAddProcessors(settings, random); + } + + @Override + protected void postPlacement(WorldGenLevel world, RandomSource random, StructureTemplateManager templateManager, Rotation rotation, Mirror mirror, StructurePlaceSettings placementSettings, BlockPos placementPos, SwizzleConfig config) { + StructureTemplate template = templateManager.getOrCreate(WELL_BOTTOM); + + if (template == null) return; + + placementPos = placementPos.below(template.getSize().getY());//.relative(rotation.rotate(mirror.mirror(Direction.SOUTH)), 1).relative(rotation.rotate(mirror.mirror(Direction.EAST)), 1); + placementSettings.addProcessor(SmartGrassProcessor.INSTANCE); + + template.placeInWorld(world, placementPos, placementPos, placementSettings, random, 20); + + for (StructureTemplate.StructureBlockInfo info : template.filterBlocks(placementPos, placementSettings, Blocks.STRUCTURE_BLOCK)) + if (info.nbt != null && StructureMode.valueOf(info.nbt.getString("mode")) == StructureMode.DATA) + this.processMarkers(info, world, rotation, mirror, random); + } + + @Override + protected void processMarkers(StructureTemplate.StructureBlockInfo info, WorldGenLevel world, Rotation rotation, Mirror mirror, RandomSource random) { + String s = info.nbt.getString("metadata"); + BlockPos blockPos = info.pos; + + // removeBlock calls are required due to WorldGenRegion jank with cached TEs, this ensures the correct TE is used + if (!s.startsWith("loot")) return; + + if (random.nextBoolean()) { + world.setBlock(blockPos, random.nextBoolean() ? Blocks.COBBLESTONE.defaultBlockState() : Blocks.MOSSY_COBBLESTONE.defaultBlockState(), 16 | 2); + return; + } + + world.removeBlock(blockPos, false); + + Direction dir = switch (s.substring(4, 5)) { + case "W" -> rotation.rotate(mirror.mirror(Direction.WEST)); + case "E" -> rotation.rotate(mirror.mirror(Direction.EAST)); + case "S" -> rotation.rotate(mirror.mirror(Direction.SOUTH)); + default -> rotation.rotate(mirror.mirror(Direction.NORTH)); + }; + + TFLootTables.WELL.generateLootContainer(world, blockPos, Blocks.BARREL.defaultBlockState().setValue(BarrelBlock.FACING, dir), 16 | 2); + + if (random.nextBoolean()) return; + + world.setBlock(blockPos.relative(dir), Blocks.HOPPER.defaultBlockState().setValue(HopperBlock.FACING, dir.getOpposite()), 16 | 2); + } +} diff --git a/src/main/java/twilightforest/world/components/feature/templates/StoneCircleFeature.java b/src/main/java/twilightforest/world/components/feature/templates/StoneCircleFeature.java new file mode 100644 index 0000000000..8074d35fbe --- /dev/null +++ b/src/main/java/twilightforest/world/components/feature/templates/StoneCircleFeature.java @@ -0,0 +1,32 @@ +package twilightforest.world.components.feature.templates; + +import com.mojang.serialization.Codec; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructurePlaceSettings; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplateManager; +import twilightforest.TwilightForestMod; +import twilightforest.world.components.processors.CobbleVariants; + +import org.jetbrains.annotations.Nullable; + +public class StoneCircleFeature extends TemplateFeature { + private static final ResourceLocation STONE_CIRCLE = TwilightForestMod.prefix("feature/ruins/stone_circle"); + + public StoneCircleFeature(Codec config) { + super(config); + } + + @Nullable + @Override + protected StructureTemplate getTemplate(StructureTemplateManager templateManager, RandomSource random) { + return templateManager.getOrCreate(STONE_CIRCLE); + } + + @Override + protected void modifySettings(StructurePlaceSettings settings, RandomSource random, NoneFeatureConfiguration config) { + settings.addProcessor(CobbleVariants.INSTANCE); + } +} diff --git a/src/main/java/twilightforest/world/components/feature/templates/TemplateFeature.java b/src/main/java/twilightforest/world/components/feature/templates/TemplateFeature.java new file mode 100644 index 0000000000..7896cd3dda --- /dev/null +++ b/src/main/java/twilightforest/world/components/feature/templates/TemplateFeature.java @@ -0,0 +1,156 @@ +package twilightforest.world.components.feature.templates; + +import com.google.common.math.StatsAccumulator; +import com.mojang.serialization.Codec; +import net.minecraft.Util; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Vec3i; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.Mirror; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.StructureMode; +import net.minecraft.world.level.levelgen.Heightmap; +import net.minecraft.world.level.levelgen.feature.Feature; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; +import net.minecraft.world.level.levelgen.feature.configurations.FeatureConfiguration; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructurePlaceSettings; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplateManager; +import net.minecraft.world.level.material.Material; + +import org.jetbrains.annotations.Nullable; + +public abstract class TemplateFeature extends Feature { + public TemplateFeature(Codec config) { + super(config); + } + + @Override // Loosely based on WorldGenFossils + public final boolean place(FeaturePlaceContext ctx) { + WorldGenLevel world = ctx.level(); + BlockPos pos = ctx.origin(); + RandomSource random = world.getRandom(); + T config = ctx.config(); + + StructureTemplateManager templateManager = world.getLevel().getServer().getStructureManager(); + StructureTemplate template = this.getTemplate(templateManager, random); + + if(template == null) + return false; + + Rotation rotation = Rotation.getRandom(random); + Mirror mirror = Util.getRandom(Mirror.values(), random); + + ChunkPos chunkpos = new ChunkPos(pos); + BoundingBox structureMask = new BoundingBox(chunkpos.getMinBlockX(), world.getMinBuildHeight(), chunkpos.getMinBlockZ(), chunkpos.getMaxBlockX(), world.getMaxBuildHeight(), chunkpos.getMaxBlockZ()); + + BlockPos posSnap = chunkpos.getWorldPosition().offset(0, pos.getY(), 0); + + Vec3i transformedSize = template.getSize(rotation); + int dx = random.nextInt(16 - transformedSize.getX()); + int dz = random.nextInt(16 - transformedSize.getZ()); + posSnap = posSnap.offset(dx, 0, dz); + + BlockPos.MutableBlockPos startPos = new BlockPos.MutableBlockPos(posSnap.getX(), posSnap.getY(), posSnap.getZ()); + + if (!offsetToAverageGroundLevel(world, startPos, transformedSize)) return false; + + startPos.move(0, this.yLevelOffset(), 0); + + BlockPos placementPos = template.getZeroPositionWithTransform(startPos, mirror, rotation); + + StructurePlaceSettings placementSettings = (new StructurePlaceSettings()).setMirror(mirror).setRotation(rotation).setBoundingBox(structureMask).setRandom(random); + this.modifySettings(placementSettings.clearProcessors(), random, config); + + template.placeInWorld(world, placementPos, placementPos, placementSettings, random, 20); + + for (StructureTemplate.StructureBlockInfo info : template.filterBlocks(placementPos, placementSettings, Blocks.STRUCTURE_BLOCK)) + if (info.nbt != null && StructureMode.valueOf(info.nbt.getString("mode")) == StructureMode.DATA) + this.processMarkers(info, world, rotation, mirror, random); + + this.postPlacement(world, random, templateManager, rotation, mirror, placementSettings, placementPos, config); + + return true; + } + + @Nullable + protected abstract StructureTemplate getTemplate(StructureTemplateManager templateManager, RandomSource random); + + protected void modifySettings(StructurePlaceSettings settings, RandomSource random, T config) { + } + + protected void processMarkers(StructureTemplate.StructureBlockInfo info, WorldGenLevel world, Rotation rotation, Mirror mirror, RandomSource random) { + } + + protected void postPlacement(WorldGenLevel world, RandomSource random, StructureTemplateManager templateManager, Rotation rotation, Mirror mirror, StructurePlaceSettings placementSettings, BlockPos placementPos, T config) { + } + + protected int yLevelOffset() { + return 0; + } + + private static boolean offsetToAverageGroundLevel(WorldGenLevel world, BlockPos.MutableBlockPos startPos, Vec3i size) { + StatsAccumulator heights = new StatsAccumulator(); + + for (int dx = 0; dx < size.getX(); dx++) { + for (int dz = 0; dz < size.getZ(); dz++) { + + int x = startPos.getX() + dx; + int z = startPos.getZ() + dz; + + int y = world.getHeight(Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, x, z); + + while (y >= 0) { + BlockState state = world.getBlockState(new BlockPos(x, y, z)); + if (isBlockNotOk(state)) return false; + if (isBlockOk(state)) break; + y--; + } + + if (y < 0) return false; + + heights.add(y); + } + } + + if (heights.populationStandardDeviation() > 2.0) { + return false; + } + + int baseY = (int) (heights.mean() + 0.5); + int maxY = (int) heights.max(); + + startPos.setY(baseY); + + return isAreaClear(world, startPos.above(maxY - baseY + 1), startPos.offset(size)); + } + + private static boolean isAreaClear(LevelAccessor world, BlockPos min, BlockPos max) { + for (BlockPos pos : BlockPos.betweenClosed(min, max)) { + if (!world.getBlockState(pos).getMaterial().isReplaceable()) { + return false; + } + } + return true; + } + + private static boolean isBlockOk(BlockState state) { + Material material = state.getMaterial(); + return material == Material.STONE || material == Material.DIRT || material == Material.GRASS || material == Material.SAND; + } + + private static boolean isBlockNotOk(BlockState state) { + Material material = state.getMaterial(); + return material == Material.WATER || material == Material.LAVA || state.getBlock() == Blocks.BEDROCK; + } + + private static boolean isDataBlock(StructureTemplate.StructureBlockInfo info) { + return StructureMode.DATA.name().equals(info.nbt.getString("mode")); + } +} diff --git a/src/main/java/twilightforest/world/components/feature/templates/package-info.java b/src/main/java/twilightforest/world/components/feature/templates/package-info.java new file mode 100644 index 0000000000..5adaa287ea --- /dev/null +++ b/src/main/java/twilightforest/world/components/feature/templates/package-info.java @@ -0,0 +1,6 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.world.components.feature.templates; + +import net.minecraft.MethodsReturnNonnullByDefault; +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/world/components/feature/trees/BrownCanopyMushroomFeature.java b/src/main/java/twilightforest/world/components/feature/trees/BrownCanopyMushroomFeature.java new file mode 100644 index 0000000000..99d3210f0d --- /dev/null +++ b/src/main/java/twilightforest/world/components/feature/trees/BrownCanopyMushroomFeature.java @@ -0,0 +1,24 @@ +package twilightforest.world.components.feature.trees; + +import com.mojang.serialization.Codec; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.levelgen.feature.configurations.HugeMushroomFeatureConfiguration; + +import javax.annotation.ParametersAreNonnullByDefault; + +@ParametersAreNonnullByDefault +public class BrownCanopyMushroomFeature extends CanopyMushroomFeature { + public BrownCanopyMushroomFeature(Codec featureConfigurationCodec) { + super(featureConfigurationCodec); + } + + @Override + protected int getBranches(RandomSource random) { + return Math.max(random.nextInt(5), 3); + } + + @Override + protected double getLength(RandomSource random) { + return 9 - random.nextInt(2); + } +} diff --git a/src/main/java/twilightforest/world/components/feature/trees/CanopyMushroomFeature.java b/src/main/java/twilightforest/world/components/feature/trees/CanopyMushroomFeature.java new file mode 100644 index 0000000000..1a8258a3ff --- /dev/null +++ b/src/main/java/twilightforest/world/components/feature/trees/CanopyMushroomFeature.java @@ -0,0 +1,152 @@ +package twilightforest.world.components.feature.trees; + +import com.mojang.serialization.Codec; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.DirectionalBlock; +import net.minecraft.world.level.block.HugeMushroomBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.feature.AbstractHugeMushroomFeature; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; +import net.minecraft.world.level.levelgen.feature.configurations.HugeMushroomFeatureConfiguration; +import twilightforest.init.TFBlocks; +import twilightforest.util.FeatureLogic; +import twilightforest.util.VoxelBresenhamIterator; + +import javax.annotation.ParametersAreNonnullByDefault; + +@ParametersAreNonnullByDefault +public abstract class CanopyMushroomFeature extends AbstractHugeMushroomFeature { + private int bugsLeft; + + public CanopyMushroomFeature(Codec featureConfigurationCodec) { + super(featureConfigurationCodec); + } + + /** + * How much space our mushroom needs, this seems to be about right + */ + @Override + protected int getTreeRadiusForHeight(int i, int i1, int foliageRadius, int treeHeight) { + return treeHeight <= 3 ? 0 : (int)((float)foliageRadius * 1.5F); + } + + @Override + protected void placeTrunk(LevelAccessor levelAccessor, RandomSource random, BlockPos pos, HugeMushroomFeatureConfiguration featureConfiguration, int height, BlockPos.MutableBlockPos mutableBlockPos) { + for(int i = 0; i < height; ++i) { + mutableBlockPos.set(pos).move(Direction.UP, i); + if (!levelAccessor.getBlockState(mutableBlockPos).isSolidRender(levelAccessor, mutableBlockPos)) { + this.setBlock(levelAccessor, mutableBlockPos, featureConfiguration.stemProvider.getState(random, pos)); + + if (this.bugsLeft > 0 && i > height / 2 && random.nextInt(10) == 9) addFirefly(levelAccessor, mutableBlockPos, random); + } else { + height = i; + break; + } + } + + int numBranches = this.getBranches(random); + float offset = random.nextFloat(); + for (int b = 0; b < numBranches; b++) { + buildABranch(levelAccessor, pos, height - 6 + b, this.getLength(random), 0.3 * b + offset, random, new HugeMushroomFeatureConfiguration(featureConfiguration.capProvider, featureConfiguration.stemProvider, featureConfiguration.foliageRadius - 1)); + } + } + + /** + * Add a firefly on a RandomSource face of a block + */ + protected void addFirefly(LevelAccessor levelAccessor, BlockPos pos, RandomSource random) { + Direction direction = Direction.getRandom(random); + if (direction.getAxis() != Direction.Axis.Y) { + BlockPos.MutableBlockPos bugPos = new BlockPos.MutableBlockPos(); + bugPos.set(pos).move(direction); + if (!levelAccessor.getBlockState(bugPos).isSolidRender(levelAccessor, bugPos)) { + BlockState bugState = TFBlocks.FIREFLY.get().defaultBlockState().setValue(DirectionalBlock.FACING, direction); + this.setBlock(levelAccessor, bugPos, bugState); + this.bugsLeft--; + } + } + } + + @Override + protected int getTreeHeight(RandomSource random) { + return 9 + random.nextInt(5); + } + + protected abstract int getBranches(RandomSource random); + + protected abstract double getLength(RandomSource random); + + private void buildABranch(LevelAccessor levelAccessor, BlockPos pos, int height, double length, double angle, RandomSource random, HugeMushroomFeatureConfiguration featureConfiguration) { + BlockPos src = pos.above(height); + BlockPos dest = FeatureLogic.translate(src, length, angle, 0.2); + + for (BlockPos pixel : new VoxelBresenhamIterator(src, new BlockPos(dest.getX(), src.getY(), dest.getZ()))) { + BlockState blockstate = featureConfiguration.stemProvider.getState(random, pos); + + if (blockstate.hasProperty(HugeMushroomBlock.UP) && blockstate.hasProperty(HugeMushroomBlock.DOWN)) { + blockstate = blockstate.setValue(HugeMushroomBlock.DOWN, true).setValue(HugeMushroomBlock.UP, true);//Seal up the ups and downs + } + + this.setBlock(levelAccessor, pixel, blockstate); + } + + int max = Math.max(src.getY(), dest.getY()); + + for (int i = Math.min(src.getY(), dest.getY()); i < max + 1; i++) { + BlockState blockstate = featureConfiguration.stemProvider.getState(random, pos); + + if (blockstate.hasProperty(HugeMushroomBlock.DOWN)) { + if (i == Math.min(src.getY(), dest.getY())) blockstate = blockstate.setValue(HugeMushroomBlock.DOWN, true);//Seal up the bottom one, so it looks better + } + + BlockPos blockPos = new BlockPos(dest.getX(), i, dest.getZ()); + + this.setBlock(levelAccessor, blockPos, blockstate); + + if (this.bugsLeft > 0 && i > Math.min(src.getY(), dest.getY()) / 2 && random.nextInt(20) == 0) addFirefly(levelAccessor, blockPos, random); + } + + this.makeCap(levelAccessor, random, dest, 1, new BlockPos.MutableBlockPos(), featureConfiguration);//Branches need caps as well, height in this case is set to 1 + } + + @Override//Pretty much a 1:1 vanilla copy of the big brown mushroom cap code + protected void makeCap(LevelAccessor levelAccessor, RandomSource random, BlockPos pos, int height, BlockPos.MutableBlockPos mutableBlockPos, HugeMushroomFeatureConfiguration featureConfiguration) { + int i = featureConfiguration.foliageRadius; + + for(int x = -i; x <= i; ++x) { + for(int z = -i; z <= i; ++z) { + boolean xIsMin = x == -i; + boolean xIsMax = x == i; + boolean zIsMin = z == -i; + boolean zIsMax = z == i; + boolean xMinMax = xIsMin || xIsMax; + boolean zMinMax = zIsMin || zIsMax; + if (!xMinMax || !zMinMax) { + mutableBlockPos.setWithOffset(pos, x, height, z); + if (!levelAccessor.getBlockState(mutableBlockPos).isSolidRender(levelAccessor, mutableBlockPos)) { + boolean xMinOrZ = xIsMin || zMinMax && x == 1 - i; + boolean xMaxOrZ = xIsMax || zMinMax && x == i - 1; + boolean zMinOrX = zIsMin || xMinMax && z == 1 - i; + boolean zMaxOrX = zIsMax || xMinMax && z == i - 1; + BlockState blockstate = featureConfiguration.capProvider.getState(random, pos); + + if (blockstate.hasProperty(HugeMushroomBlock.WEST) && blockstate.hasProperty(HugeMushroomBlock.EAST) && blockstate.hasProperty(HugeMushroomBlock.NORTH) && blockstate.hasProperty(HugeMushroomBlock.SOUTH)) { + blockstate = blockstate.setValue(HugeMushroomBlock.WEST, xMinOrZ).setValue(HugeMushroomBlock.EAST, xMaxOrZ).setValue(HugeMushroomBlock.NORTH, zMinOrX).setValue(HugeMushroomBlock.SOUTH, zMaxOrX); + } + + this.setBlock(levelAccessor, mutableBlockPos, blockstate); + } + } + } + } + } + + @Override + public boolean place(FeaturePlaceContext context) { + this.bugsLeft = Math.max(0, context.random().nextInt(10) - 4) / 2; //Weird math, I know, but I like the odds (and weird math, sue me) + return super.place(context); + } +} diff --git a/src/main/java/twilightforest/world/components/feature/trees/CanopyTreeFeature.java b/src/main/java/twilightforest/world/components/feature/trees/CanopyTreeFeature.java new file mode 100644 index 0000000000..8952e94ac0 --- /dev/null +++ b/src/main/java/twilightforest/world/components/feature/trees/CanopyTreeFeature.java @@ -0,0 +1,131 @@ +package twilightforest.world.components.feature.trees; + +import com.google.common.collect.Lists; +import com.mojang.serialization.Codec; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.LevelSimulatedReader; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.state.BlockState; +import twilightforest.init.TFBlocks; +import twilightforest.util.FeatureLogic; +import twilightforest.util.FeaturePlacers; +import twilightforest.util.FeatureUtil; +import twilightforest.world.components.feature.config.TFTreeFeatureConfig; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.BiConsumer; + +/** + * Makes large trees with flat leaf ovals that provide a canopy for the forest + * + * @author Ben + */ +public class CanopyTreeFeature extends TFTreeFeature { + + public CanopyTreeFeature(Codec config) { + super(config); + } + + @Override + protected boolean generate(WorldGenLevel world, RandomSource random, BlockPos pos, BiConsumer trunkPlacer, BiConsumer leavesPlacer, BiConsumer decorationPlacer, TFTreeFeatureConfig config) { + // determine a height + List leaves = Lists.newArrayList(); + int treeHeight = config.minHeight; + if (random.nextInt(config.chanceAddFiveFirst) == 0) { + treeHeight += random.nextInt(5); + + if (random.nextInt(config.chanceAddFiveSecond) == 0) { + treeHeight += random.nextInt(5); + } + } + + if (world.isOutsideBuildHeight(pos.getY() + treeHeight)) { + return false; + } + + BlockState state = world.getBlockState(pos.below()); + if (!state.getBlock().canSustainPlant(state, world, pos.below(), Direction.UP, TFBlocks.CANOPY_SAPLING.get())) { + return false; + } + + leaves.clear(); + + //okay build a tree! Go up to the height + buildBranch(world, leaves, pos, trunkPlacer, 0, treeHeight, 0, 0, true, random, config); + + // make 3-4 branches + int numBranches = 3 + random.nextInt(2); + float offset = random.nextFloat(); + for (int b = 0; b < numBranches; b++) { + buildBranch(world, leaves, pos, trunkPlacer, treeHeight - 10 + b, 9, 0.3 * b + offset, 0.2, false, random, config); + } + + // add the actual leaves + if (config.hasLeaves) + for (BlockPos leafPos : leaves) { + makeLeafBlob(world, leavesPlacer, random, leafPos, config); + } + + // root bulb + if (FeatureUtil.hasAirAround(world, pos.below())) { + FeaturePlacers.placeIfValidTreePos(world, trunkPlacer, random, pos.below(), config.trunkProvider); + } else { + FeaturePlacers.placeIfValidRootPos(world, decorationPlacer, random, pos.below(), config.rootsProvider); + } + + // roots! + int numRoots = 3 + random.nextInt(2); + offset = random.nextFloat(); + for (int b = 0; b < numRoots; b++) { + FeaturePlacers.buildRoot(world, decorationPlacer, random, pos, offset, b, config.rootsProvider); + } + + return true; + } + + private void makeLeafBlob(LevelSimulatedReader world, BiConsumer leafPlacer, RandomSource random, BlockPos leafPos, TFTreeFeatureConfig config) { + FeaturePlacers.placeCircleOdd(world, leafPlacer, FeaturePlacers.VALID_TREE_POS, random, leafPos.below(), 3, config.leavesProvider); + FeaturePlacers.placeCircleOdd(world, leafPlacer, FeaturePlacers.VALID_TREE_POS, random, leafPos, 4, config.leavesProvider); + FeaturePlacers.placeCircleOdd(world, leafPlacer, FeaturePlacers.VALID_TREE_POS, random, leafPos.above(), 2, config.leavesProvider); + } + + /** + * Build a branch with a flat blob of leaves at the end. + */ + void buildBranch(LevelAccessor world, List leaves, BlockPos pos, BiConsumer trunkPlacer, int height, double length, double angle, double tilt, boolean trunk, RandomSource treeRNG, TFTreeFeatureConfig config) { + BlockPos src = pos.above(height); + BlockPos dest = FeatureLogic.translate(src, length, angle, tilt); + + // only actually draw the branch if it's not going to load new chunks + if (world.isAreaLoaded(dest, 5)) { + + if (trunk) { + FeaturePlacers.drawBresenhamTree(world, trunkPlacer, FeaturePlacers.VALID_TREE_POS, src, dest, config.trunkProvider, treeRNG); + } else { + FeaturePlacers.drawBresenhamBranch(world, trunkPlacer, treeRNG, src, dest, config.branchProvider); + } + + // seems to help lighting to place this firefly now + if (trunk) { + // add a firefly (torch) to the trunk + FeaturePlacers.addFirefly(world, pos, 3 + treeRNG.nextInt(7), treeRNG.nextDouble()); + } + + FeaturePlacers.placeIfValidTreePos(world, trunkPlacer, treeRNG, dest.east(), config.branchProvider); + FeaturePlacers.placeIfValidTreePos(world, trunkPlacer, treeRNG, dest.west(), config.branchProvider); + FeaturePlacers.placeIfValidTreePos(world, trunkPlacer, treeRNG, dest.south(), config.branchProvider); + FeaturePlacers.placeIfValidTreePos(world, trunkPlacer, treeRNG, dest.north(), config.branchProvider); +// setBlockAndNotifyAdequately(world, dest.east(), branchState); +// setBlockAndNotifyAdequately(world, dest.west(), branchState); +// setBlockAndNotifyAdequately(world, dest.south(), branchState); +// setBlockAndNotifyAdequately(world, dest.north(), branchState); + + // save leaf position for later + leaves.add(dest); + } + } +} diff --git a/src/main/java/twilightforest/world/components/feature/trees/DarkCanopyTreeFeature.java b/src/main/java/twilightforest/world/components/feature/trees/DarkCanopyTreeFeature.java new file mode 100644 index 0000000000..75055fa7bc --- /dev/null +++ b/src/main/java/twilightforest/world/components/feature/trees/DarkCanopyTreeFeature.java @@ -0,0 +1,289 @@ +package twilightforest.world.components.feature.trees; + +import com.google.common.collect.Iterables; +import com.google.common.collect.Lists; +import com.google.common.collect.Sets; +import com.mojang.serialization.Codec; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.tags.BlockTags; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.LevelSimulatedReader; +import net.minecraft.world.level.LevelWriter; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.levelgen.feature.Feature; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; +import net.minecraft.world.level.levelgen.feature.TreeFeature; +import net.minecraft.world.level.levelgen.feature.configurations.TreeConfiguration; +import net.minecraft.world.level.levelgen.feature.foliageplacers.FoliagePlacer; +import net.minecraft.world.level.levelgen.feature.treedecorators.TreeDecorator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.phys.shapes.BitSetDiscreteVoxelShape; +import net.minecraft.world.phys.shapes.DiscreteVoxelShape; +import twilightforest.init.TFBlocks; + +import java.util.List; +import java.util.OptionalInt; +import java.util.Set; +import java.util.function.BiConsumer; + +/** + * Makes large trees with flat leaf ovals that provide a canopy for the forest + * + * @author Ben + */ + +//Lots of things from TreeFeature, but we're checking for dirt to place on +public class DarkCanopyTreeFeature extends Feature { + + public DarkCanopyTreeFeature(Codec config) { + super(config); + } + + @Override + public boolean place(FeaturePlaceContext ctx) { + WorldGenLevel reader = ctx.level(); + BlockPos pos = ctx.origin(); + RandomSource rand = ctx.random(); + + // if we are given leaves as a starting position, seek dirt or grass underneath + boolean foundDirt = false; + BlockPos validPos = BlockPos.ZERO; + Material materialUnder; + for (int dy = pos.getY(); dy >= reader.getMinBuildHeight(); dy--) { + materialUnder = reader.getBlockState(new BlockPos(pos.getX(), dy - 1, pos.getZ())).getMaterial(); + if (materialUnder == Material.GRASS || materialUnder == Material.DIRT) { + // yes! + foundDirt = true; + pos = new BlockPos(pos.getX(), dy, pos.getZ()); + validPos = pos; + break; + } else if (materialUnder == Material.STONE || materialUnder == Material.SAND) { + // nope + break; + } + } + + if (!foundDirt) { + return false; + } + + for (int i = 0; i < 4; i ++) { + //We check against the TreeFeature's validTreePos method, to see if the tree can grow here, cuz the trunk placer uses this as well + //If we don't, some trees end up growing only one or two blocks tall + if (!TreeFeature.validTreePos(reader, pos.relative(Direction.UP, i))) return false; + } + + // do not grow next to another tree + for (Direction e : Direction.Plane.HORIZONTAL) { + if (reader.getBlockState(pos.relative(e)).getMaterial() == Material.WOOD) + return false; + } + + //Taken from TreeFeature.generate, adjusting our BoundingBox to fit where the dirt is + TreeConfiguration treeconfiguration = ctx.config(); + Set set = Sets.newHashSet(); + Set set1 = Sets.newHashSet(); + Set set2 = Sets.newHashSet(); + Set set3 = Sets.newHashSet(); + BiConsumer biconsumer = (p_160555_, p_160556_) -> { + set.add(p_160555_.immutable()); + reader.setBlock(p_160555_, p_160556_, 19); + }; + BiConsumer biconsumer1 = (p_160548_, p_160549_) -> { + set1.add(p_160548_.immutable()); + reader.setBlock(p_160548_, p_160549_, 19); + }; + FoliagePlacer.FoliageSetter setter = new FoliagePlacer.FoliageSetter() { + public void set(BlockPos pos, BlockState state) { + set2.add(pos.immutable()); + reader.setBlock(pos, state, 19); + } + + public boolean isSet(BlockPos p_272999_) { + return set2.contains(p_272999_); + } + }; + BiConsumer biconsumer3 = (p_225290_, p_225291_) -> { + set3.add(p_225290_.immutable()); + reader.setBlock(p_225290_, p_225291_, 19); + }; + boolean flag = this.doPlace(reader, rand, pos, validPos, biconsumer, biconsumer1, setter, treeconfiguration); + if (flag && (!set1.isEmpty() || !set2.isEmpty())) { + if (!treeconfiguration.decorators.isEmpty()) { + TreeDecorator.Context treedecorator$context = new TreeDecorator.Context(reader, biconsumer3, rand, set1, set2, set); + treeconfiguration.decorators.forEach((p_225282_) -> { + p_225282_.place(treedecorator$context); + }); + } + + return BoundingBox.encapsulatingPositions(Iterables.concat(set1, set2, set3)).map((p_160521_) -> { + DiscreteVoxelShape shape = updateLeaves(reader, p_160521_, set1, set3); + StructureTemplate.updateShapeAtEdge(reader, 3, shape, p_160521_.minX(), p_160521_.minY(), p_160521_.minZ()); + return true; + }).orElse(false); + } else { + return false; + } + } + + //Mostly [VanillaCopy] of TreeFeature.doPlace, edits noted + private boolean doPlace(WorldGenLevel level, RandomSource random, BlockPos pos, BlockPos validPos, BiConsumer consumer, BiConsumer consumer1, FoliagePlacer.FoliageSetter foliageSetter, TreeConfiguration config) { + //set our blockpos to the valid dirt pos, not highest ground + pos = new BlockPos(pos.getX(), validPos.getY(), pos.getZ()); + int i = config.trunkPlacer.getTreeHeight(random); + int j = config.foliagePlacer.foliageHeight(random, i, config); + int k = i - j; + int l = config.foliagePlacer.foliageRadius(random, k); + BlockPos finalPos = pos; + BlockPos blockpos = config.rootPlacer.map((placer) -> placer.getTrunkOrigin(finalPos, random)).orElse(pos); + int i1 = Math.min(pos.getY(), blockpos.getY()); + int j1 = Math.max(pos.getY(), blockpos.getY()) + i + 1; + if (i1 >= level.getMinBuildHeight() + 1 && j1 <= level.getMaxBuildHeight()) { + OptionalInt optionalint = config.minimumSize.minClippedHeight(); + int k1 = this.getMaxFreeTreeHeight(level, i, blockpos, config); + if (k1 >= i || !optionalint.isEmpty() && k1 >= optionalint.getAsInt()) { + if (config.rootPlacer.isPresent() && !config.rootPlacer.get().placeRoots(level, consumer, random, pos, blockpos, config)) { + return false; + } else { + List list = config.trunkPlacer.placeTrunk(level, consumer1, random, k1, blockpos, config); + list.forEach((attachment) -> { + config.foliagePlacer.createFoliage(level, foliageSetter, random, config, k1, attachment, j, l); + }); + return true; + } + } else { + return false; + } + } else { + return false; + } + } + + //everything beyond this point is a [VanillaCopy] of TreeFeature + private int getMaxFreeTreeHeight(LevelSimulatedReader level, int trunkHeight, BlockPos pos, TreeConfiguration config) { + BlockPos.MutableBlockPos mutable = new BlockPos.MutableBlockPos(); + + for(int i = 0; i <= trunkHeight + 1; ++i) { + int j = config.minimumSize.getSizeAtHeight(trunkHeight, i); + + for(int k = -j; k <= j; ++k) { + for(int l = -j; l <= j; ++l) { + mutable.setWithOffset(pos, k, i, l); + if (!isFree(level, mutable) || !config.ignoreVines) { + return i - 2; + } + } + } + } + + return trunkHeight; + } + + protected void setBlock(LevelWriter world, BlockPos pos, BlockState state) { + setBlockKnownShape(world, pos, state); + } + + public static void setBlockKnownShape(LevelWriter p_236408_0_, BlockPos p_236408_1_, BlockState p_236408_2_) { + p_236408_0_.setBlock(p_236408_1_, p_236408_2_, 19); + } + + private static DiscreteVoxelShape updateLeaves(LevelAccessor p_67203_, BoundingBox p_67204_, Set p_67205_, Set p_67206_) { + List> list = Lists.newArrayList(); + DiscreteVoxelShape discretevoxelshape = new BitSetDiscreteVoxelShape(p_67204_.getXSpan(), p_67204_.getYSpan(), p_67204_.getZSpan()); + int i = 6; + + for(int j = 0; j < 6; ++j) { + list.add(Sets.newHashSet()); + } + + BlockPos.MutableBlockPos blockpos$mutableblockpos = new BlockPos.MutableBlockPos(); + + for(BlockPos blockpos : Lists.newArrayList(p_67206_)) { + if (p_67204_.isInside(blockpos)) { + discretevoxelshape.fill(blockpos.getX() - p_67204_.minX(), blockpos.getY() - p_67204_.minY(), blockpos.getZ() - p_67204_.minZ()); + } + } + + for(BlockPos blockpos1 : Lists.newArrayList(p_67205_)) { + if (p_67204_.isInside(blockpos1)) { + discretevoxelshape.fill(blockpos1.getX() - p_67204_.minX(), blockpos1.getY() - p_67204_.minY(), blockpos1.getZ() - p_67204_.minZ()); + } + + for(Direction direction : Direction.values()) { + blockpos$mutableblockpos.setWithOffset(blockpos1, direction); + if (!p_67205_.contains(blockpos$mutableblockpos)) { + BlockState blockstate = p_67203_.getBlockState(blockpos$mutableblockpos); + if (blockstate.hasProperty(BlockStateProperties.DISTANCE)) { + list.get(0).add(blockpos$mutableblockpos.immutable()); + setBlockKnownShape(p_67203_, blockpos$mutableblockpos, blockstate.setValue(BlockStateProperties.DISTANCE, Integer.valueOf(1))); + if (p_67204_.isInside(blockpos$mutableblockpos)) { + discretevoxelshape.fill(blockpos$mutableblockpos.getX() - p_67204_.minX(), blockpos$mutableblockpos.getY() - p_67204_.minY(), blockpos$mutableblockpos.getZ() - p_67204_.minZ()); + } + } + } + } + } + + for(int l = 1; l < 6; ++l) { + Set set = list.get(l - 1); + Set set1 = list.get(l); + + for(BlockPos blockpos2 : set) { + if (p_67204_.isInside(blockpos2)) { + discretevoxelshape.fill(blockpos2.getX() - p_67204_.minX(), blockpos2.getY() - p_67204_.minY(), blockpos2.getZ() - p_67204_.minZ()); + } + + for(Direction direction1 : Direction.values()) { + blockpos$mutableblockpos.setWithOffset(blockpos2, direction1); + if (!set.contains(blockpos$mutableblockpos) && !set1.contains(blockpos$mutableblockpos)) { + BlockState blockstate1 = p_67203_.getBlockState(blockpos$mutableblockpos); + if (blockstate1.hasProperty(BlockStateProperties.DISTANCE)) { + int k = blockstate1.getValue(BlockStateProperties.DISTANCE); + if (k > l + 1) { + BlockState blockstate2 = blockstate1.setValue(BlockStateProperties.DISTANCE, Integer.valueOf(l + 1)); + setBlockKnownShape(p_67203_, blockpos$mutableblockpos, blockstate2); + if (p_67204_.isInside(blockpos$mutableblockpos)) { + discretevoxelshape.fill(blockpos$mutableblockpos.getX() - p_67204_.minX(), blockpos$mutableblockpos.getY() - p_67204_.minY(), blockpos$mutableblockpos.getZ() - p_67204_.minZ()); + } + + set1.add(blockpos$mutableblockpos.immutable()); + } + } + } + } + } + } + + return discretevoxelshape; + } + + public static boolean isFree(LevelSimulatedReader pLevel, BlockPos pPos) { + return validTreePos(pLevel, pPos) || pLevel.isStateAtPosition(pPos, (p_67281_) -> p_67281_.is(BlockTags.LOGS)); + } + + private static boolean isBlockWater(LevelSimulatedReader pLevel, BlockPos pPos) { + return pLevel.isStateAtPosition(pPos, (p_67271_) -> p_67271_.is(Blocks.WATER)); + } + + public static boolean isAirOrLeaves(LevelSimulatedReader pLevel, BlockPos pPos) { + return pLevel.isStateAtPosition(pPos, (p_67266_) -> p_67266_.isAir() || p_67266_.is(BlockTags.LEAVES) || p_67266_.is(TFBlocks.HARDENED_DARK_LEAVES.get())); + } + + private static boolean isReplaceablePlant(LevelSimulatedReader pLevel, BlockPos pPos) { + return pLevel.isStateAtPosition(pPos, (p_160551_) -> { + Material material = p_160551_.getMaterial(); + return material == Material.REPLACEABLE_PLANT; + }); + } + + public static boolean validTreePos(LevelSimulatedReader pLevel, BlockPos pPos) { + return isAirOrLeaves(pLevel, pPos) || isReplaceablePlant(pLevel, pPos) || isBlockWater(pLevel, pPos); + } +} diff --git a/src/main/java/twilightforest/world/components/feature/trees/HollowStumpFeature.java b/src/main/java/twilightforest/world/components/feature/trees/HollowStumpFeature.java new file mode 100644 index 0000000000..0cf1f1b16e --- /dev/null +++ b/src/main/java/twilightforest/world/components/feature/trees/HollowStumpFeature.java @@ -0,0 +1,91 @@ +package twilightforest.world.components.feature.trees; + +import com.mojang.serialization.Codec; +import net.minecraft.core.BlockPos; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.LevelAccessor; +import twilightforest.util.FeaturePlacers; +import twilightforest.util.FeatureUtil; +import twilightforest.world.components.feature.config.TFTreeFeatureConfig; + +import java.util.function.BiConsumer; + +/** + * A stump from a hollow tree + * + * @author Ben + */ +public class HollowStumpFeature extends HollowTreeFeature { + + public HollowStumpFeature(Codec config) { + super(config); + } + + @Override + public boolean generate(WorldGenLevel world, RandomSource random, BlockPos pos, BiConsumer trunkPlacer, BiConsumer leavesPlacer, BiConsumer decorationPlacer, TFTreeFeatureConfig config) { + int radius = random.nextInt(2) + 2; + + if (!FeatureUtil.isAreaSuitable(world, pos.offset(-radius, 0, -radius), 2 * radius, 6, 2 * radius)) { + return false; + } + + // Start with roots first, so they don't fail placement because they intersect the trunk shell first + // 3-5 roots at the bottom + buildBranchRing(world, trunkPlacer, leavesPlacer, random, pos, radius, 3, 2, 6, 0.75D, 3, 5, 3, false, config); + + // several more taproots + buildBranchRing(world, trunkPlacer, leavesPlacer, random, pos, radius, 1, 2, 8, 0.9D, 3, 5, 3, false, config); + + buildTrunk(world, trunkPlacer, decorationPlacer, random, pos, radius, 6, config); + + return true; + } + + @Override + protected void buildTrunk(LevelAccessor world, BiConsumer trunkPlacer, BiConsumer decoPlacer, RandomSource random, BlockPos pos, int diameter, int maxheight, TFTreeFeatureConfig config) { + int hollow = diameter >> 1; + + // go down 4 squares and fill in extra trunk as needed, in case we're on uneven terrain + for (int dx = -diameter; dx <= diameter; dx++) { + for (int dz = -diameter; dz <= diameter; dz++) { + for (int dy = -4; dy < 0; dy++) { + // determine how far we are from the center. + int ax = Math.abs(dx); + int az = Math.abs(dz); + int dist = (int) (Math.max(ax, az) + (Math.min(ax, az) * 0.5)); + + if (dist <= diameter) { + BlockPos dPos = pos.offset(dx, dy, dz); + if (FeatureUtil.hasAirAround(world, dPos)) { + FeaturePlacers.placeIfValidTreePos(world, trunkPlacer, random, dPos, config.trunkProvider); + } else { + FeaturePlacers.placeIfValidRootPos(world, decoPlacer, random, dPos, config.rootsProvider); + } + } + } + } + } + + // build the trunk upwards + for (int dx = -diameter; dx <= diameter; dx++) { + for (int dz = -diameter; dz <= diameter; dz++) { + int height = 2 + random.nextInt(3) + random.nextInt(2); + + for (int dy = 0; dy <= height; dy++) { + // determine how far we are from the center. + int ax = Math.abs(dx); + int az = Math.abs(dz); + int dist = Math.max(ax, az) + (Math.min(ax, az) >> 1); + + // make a trunk! + if (dist <= diameter && dist > hollow) { + FeaturePlacers.placeIfValidTreePos(world, trunkPlacer, random, pos.offset(dx, dy, dz), config.trunkProvider); + } + } + } + } + } +} + diff --git a/src/main/java/twilightforest/world/components/feature/trees/HollowTreeFeature.java b/src/main/java/twilightforest/world/components/feature/trees/HollowTreeFeature.java new file mode 100644 index 0000000000..a4f97db72b --- /dev/null +++ b/src/main/java/twilightforest/world/components/feature/trees/HollowTreeFeature.java @@ -0,0 +1,466 @@ +package twilightforest.world.components.feature.trees; + +import com.mojang.serialization.Codec; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.*; +import net.minecraft.world.level.block.entity.SpawnerBlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFEntities; +import twilightforest.loot.TFLootTables; +import twilightforest.util.FeatureLogic; +import twilightforest.util.FeaturePlacers; +import twilightforest.util.FeatureUtil; +import twilightforest.util.VoxelBresenhamIterator; +import twilightforest.world.components.feature.config.TFTreeFeatureConfig; + +import java.util.function.BiConsumer; + +public class HollowTreeFeature extends TFTreeFeature { + + private static final int LEAF_DUNGEON_CHANCE = 8; + + public HollowTreeFeature(Codec config) { + super(config); + } + +// public static boolean canGrowInto(Block blockType) { +// Material material = blockType.getDefaultState().getMaterial(); +// return material == Material.AIR || material == Material.LEAVES || material == Material.WATER || material == Material.LAVA || blockType instanceof IGrowable || blockType instanceof BlockDirt || blockType instanceof BlockLog || blockType instanceof BlockBush || blockType instanceof BlockVine; +// } + +// @Override +// @Deprecated +// protected void setBlockAndNotifyAdequately(World worldIn, BlockPos pos, BlockState state) { +// if (canGrowInto(worldIn.getBlockState(pos).getBlock())) +// super.setBlockAndNotifyAdequately(worldIn, pos, state); +// } + + @Override + public boolean generate(WorldGenLevel world, RandomSource random, BlockPos pos, BiConsumer trunkPlacer, BiConsumer leavesPlacer, BiConsumer decorationPlacer, TFTreeFeatureConfig config) { + int diameter = random.nextInt(3) + 2; + int height = random.nextInt(64) + (diameter * 4); + + // do we have enough height? + if (world.isOutsideBuildHeight(pos.getY()) || world.isOutsideBuildHeight(pos.getY() + height + diameter)) { + return false; + } + +// // are we going to hit something? +// for (int dx = -diameter; dx <= diameter; dx++) +// { +// for (int dz = -diameter; dz <= diameter; dz++) +// { +// for (int dy = 1; dy <= height; dy++) +// { +// int whatsThere = world.getBlock(dx + x, dy + y, dz + z); +// if(whatsThere != 0 && whatsThere != Blocks.LEAVES) +// { +// return false; +// } +// } +// } +// } + // check the top too + int crownRadius = diameter * 4 + 8; + for (int dx = -crownRadius; dx <= crownRadius; dx++) { + for (int dz = -crownRadius; dz <= crownRadius; dz++) { + for (int dy = height - crownRadius; dy <= height + crownRadius; dy++) { + Block whatsThere = world.getBlockState(pos.offset(dx, dy, dz)).getBlock(); + if (whatsThere != Blocks.AIR && !(whatsThere instanceof LeavesBlock)) { + return false; + } + } + } + } + + // check if we're on dirt or grass + BlockState state = world.getBlockState(pos.below()); + if (!state.getBlock().canSustainPlant(state, world, pos.below(), Direction.UP, TFBlocks.HOLLOW_OAK_SAPLING.get())) { + return false; + } + + // Start with roots first, so they don't fail placement because they intersect the trunk shell first + // 3-5 roots at the bottom + buildBranchRing(world, trunkPlacer, leavesPlacer, random, pos, diameter, 3, 2, 6, 0.75D, 3, 5, 3, false, config); + + // several more taproots + buildBranchRing(world, trunkPlacer, leavesPlacer, random, pos, diameter, 1, 2, 8, 0.9D, 3, 5, 3, false, config); + + // make a tree! + + // build the trunk + buildTrunk(world, trunkPlacer, decorationPlacer, random, pos, diameter, height, config); + + // fireflies + int numFireflies = random.nextInt(6 * diameter) + 5; + for (int i = 0; i <= numFireflies; i++) { + int fHeight = (int) (height * random.nextDouble() * 0.9) + (height / 10); + double fAngle = random.nextDouble(); + addFirefly(world, pos, diameter, fHeight, fAngle); + } + + // cicadas + int numCicadas = random.nextInt(3 * diameter) + 5; + for (int i = 0; i <= numCicadas; i++) { + int fHeight = (int) (height * random.nextDouble() * 0.9) + (height / 10); + double fAngle = random.nextDouble(); + addCicada(world, pos, diameter, fHeight, fAngle); + } + + // build the crown + buildFullCrown(world, trunkPlacer, leavesPlacer, random, pos, diameter, height, config); + + // 3-5 couple branches on the way up... + int numBranches = random.nextInt(3) + 3; + for (int i = 0; i <= numBranches; i++) { + int branchHeight = (int) (height * random.nextDouble() * 0.9) + (height / 10); + double branchRotation = random.nextDouble(); + makeSmallBranch(world, trunkPlacer, leavesPlacer, random, pos, diameter, branchHeight, 4, branchRotation, 0.35D, true, config); + } + + return true; + } + + /** + * Build the crown of the tree + * + * @param diameter + * @param height + */ + protected void buildFullCrown(WorldGenLevel world, BiConsumer trunkPlacer, BiConsumer leavesPlacer, RandomSource random, BlockPos pos, int diameter, int height, TFTreeFeatureConfig config) { + int crownRadius = diameter * 4 + 2; + int bvar = diameter + 2; + + // okay, let's do 3-5 main branches starting at the bottom of the crown + buildBranchRing(world, trunkPlacer, leavesPlacer, random, pos, diameter, height - crownRadius, 0, crownRadius, 0.35D, bvar, bvar + 2, 2, true, config); + + // then, let's do 3-5 medium branches at the crown middle + buildBranchRing(world, trunkPlacer, leavesPlacer, random, pos, diameter, height - (crownRadius / 2), 0, crownRadius, 0.28D, bvar, bvar + 2, 1, true, config); + + // finally, let's do 2-4 main branches at the crown top + buildBranchRing(world, trunkPlacer, leavesPlacer, random, pos, diameter, height, 0, crownRadius, 0.15D, 2, 4, 2, true, config); + + // and extra finally, let's do 3-6 medium branches going straight up + buildBranchRing(world, trunkPlacer, leavesPlacer, random, pos, diameter, height, 0, (crownRadius / 2), 0.05D, bvar, bvar + 2, 1, true, config); + + // this glass sphere approximates where we want our crown + //drawBlob(x, y + height, z, (byte)crownRadius, (byte)Blocks.GLASS, false); + } + + /** + * Build a ring of branches around the tree + * size 0 = small, 1 = med, 2 = large, 3 = root + */ + protected void buildBranchRing(WorldGenLevel world, BiConsumer trunkPlacer, BiConsumer leavesPlacer, RandomSource random, BlockPos pos, int diameter, int branchHeight, int heightVar, int length, double tilt, int minBranches, int maxBranches, int size, boolean leafy, TFTreeFeatureConfig config) { + //let's do this! + int numBranches = random.nextInt(maxBranches - minBranches) + minBranches; + double branchRotation = 1.0 / (numBranches + 1); + double branchOffset = random.nextDouble(); + + for (int i = 0; i <= numBranches; i++) { + int dHeight; + if (heightVar > 0) { + dHeight = branchHeight - heightVar + random.nextInt(2 * heightVar); + } else { + dHeight = branchHeight; + } + + if (size == 2) { + makeLargeBranch(world, trunkPlacer, leavesPlacer, random, pos, diameter, dHeight, length - 3, i * branchRotation + branchOffset, tilt, leafy, config); + } else if (size == 1) { + makeMedBranch(world, trunkPlacer, leavesPlacer, random, pos, diameter, dHeight, length - 1, i * branchRotation + branchOffset, tilt, leafy, config); + } else if (size == 3) { + makeRoot(world, random, pos, diameter, dHeight, length, i * branchRotation + branchOffset, tilt, config); + } else { + makeSmallBranch(world, trunkPlacer, leavesPlacer, random, pos, diameter, dHeight, length, i * branchRotation + branchOffset, tilt, leafy, config); + } + } + } + + /** + * This function builds the hollow trunk of the tree + */ + protected void buildTrunk(LevelAccessor world, BiConsumer trunkPlacer, BiConsumer decoPlacer, RandomSource random, BlockPos pos, int diameter, int height, TFTreeFeatureConfig config) { + final int hollow = diameter >> 1; + + // go down 4 squares and fill in extra trunk as needed, in case we're on uneven terrain + for (int dx = -diameter; dx <= diameter; dx++) { + for (int dz = -diameter; dz <= diameter; dz++) { + for (int dy = -4; dy < 0; dy++) { + // determine how far we are from the center. + int ax = Math.abs(dx); + int az = Math.abs(dz); + int dist = Math.max(ax, az) + (Math.min(ax, az) >> 1); + + if (dist <= diameter) { + BlockPos dPos = pos.offset(dx, dy, dz); + if (FeatureUtil.hasAirAround(world, dPos)) { + if (dist > hollow) { + FeaturePlacers.placeIfValidTreePos(world, trunkPlacer, random, dPos, config.trunkProvider); + } else { + FeaturePlacers.placeIfValidTreePos(world, trunkPlacer, random, dPos, config.branchProvider); + } + } else { + FeaturePlacers.placeIfValidRootPos(world, decoPlacer, random, dPos, config.rootsProvider); + } + } + } + } + } + + // build the trunk upwards + for (int dx = -diameter; dx <= diameter; dx++) { + for (int dz = -diameter; dz <= diameter; dz++) { + for (int dy = 0; dy <= height; dy++) { + BlockPos dPos = pos.offset(dx, dy, dz); + // determine how far we are from the center. + int ax = Math.abs(dx); + int az = Math.abs(dz); + int dist = (int) (Math.max(ax, az) + (Math.min(ax, az) * 0.5)); + + // make a trunk! + if (dist <= diameter && dist > hollow) { + FeaturePlacers.placeIfValidTreePos(world, trunkPlacer, random, dPos, config.trunkProvider); + } + + // fill it with lava! + if (dist <= hollow) { + // just kidding! + //world.setBlock(dx + x, dy + y, dz + z, Blocks.LAVA); + } + + // how about a ladder? is that okay? + if (dist == hollow && dx == hollow) { +// putBlockAndMetadata(dx + x, dy + y, dz + z, Blocks.LADDER, 4, true); + world.setBlock(dPos, Blocks.VINE.defaultBlockState().setValue(VineBlock.EAST, true),3); + } + } + } + } + } + + /** + * Make a branch! + */ + protected void makeMedBranch(LevelAccessor world, BiConsumer trunkPlacer, BiConsumer leavesPlacer, RandomSource random, BlockPos pos, int diameter, int branchHeight, double length, double angle, double tilt, boolean leafy, TFTreeFeatureConfig config) { + BlockPos src = FeatureLogic.translate(pos.above(branchHeight), diameter, angle, 0.5); + makeMedBranch(world, trunkPlacer, leavesPlacer, random, src, length, angle, tilt, leafy, config); + } + + /** + * Make a branch! + */ + protected void makeMedBranch(LevelAccessor world, BiConsumer trunkPlacer, BiConsumer leavesPlacer, RandomSource random, BlockPos src, double length, double angle, double tilt, boolean leafy, TFTreeFeatureConfig config) { + BlockPos dest = FeatureLogic.translate(src, length, angle, tilt); + + FeaturePlacers.drawBresenhamBranch(world, trunkPlacer, random, src, dest, config.branchProvider); + + // with leaves! + + if (leafy) { + /* + int numLeafBalls = random.nextInt(2) + 1; + for(int i = 0; i <= numLeafBalls; i++) { + + double slength = random.nextDouble() * 0.6 + 0.2; + int[] bdst = translate(src[0], src[1], src[2], slength, angle, tilt); + + drawBlob(bdst[0], bdst[1], bdst[2], 2, leafBlock, false); + } + */ + + // and a blob at the end + FeaturePlacers.placeSpheroid(world, leavesPlacer, FeaturePlacers.VALID_TREE_POS, random, dest, 2.5f, 2.5f, config.leavesProvider); + } + + // and several small branches + + int numShoots = random.nextInt(2) + 1; + double angleInc, angleVar, outVar, tiltVar; + + angleInc = 0.8 / numShoots; + + for (int i = 0; i <= numShoots; i++) { + + angleVar = (angleInc * i) - 0.4; + outVar = (random.nextDouble() * 0.8) + 0.2; + tiltVar = (random.nextDouble() * 0.75) + 0.15; + + BlockPos bsrc = FeatureLogic.translate(src, length * outVar, angle, tilt); + double slength = length * 0.4; + + makeSmallBranch(world, trunkPlacer, leavesPlacer, random, bsrc, slength, angle + angleVar, tilt * tiltVar, leafy, config); + } + } + + /** + * Make a small branch with a leaf blob at the end + */ + protected void makeSmallBranch(LevelAccessor world, BiConsumer trunkPlacer, BiConsumer leavesPlacer, RandomSource random, BlockPos src, double length, double angle, double tilt, boolean leafy, TFTreeFeatureConfig config) { + BlockPos dest = FeatureLogic.translate(src, length, angle, tilt); + + FeaturePlacers.drawBresenhamBranch(world, trunkPlacer, random, src, dest, config.branchProvider); + + if (leafy) { + float leafRad = random.nextInt(2) + 1.5f; + FeaturePlacers.placeSpheroid(world, leavesPlacer, FeaturePlacers.VALID_TREE_POS, random, dest, leafRad, leafRad, config.leavesProvider); + } + } + + /** + * Make a small branch at a certain height + */ + protected void makeSmallBranch(LevelAccessor world, BiConsumer trunkPlacer, BiConsumer leavesPlacer, RandomSource random, BlockPos pos, int diameter, int branchHeight, double length, double angle, double tilt, boolean leafy, TFTreeFeatureConfig config) { + BlockPos src = FeatureLogic.translate(pos.above(branchHeight), diameter, angle, 0.5); + makeSmallBranch(world, trunkPlacer, leavesPlacer, random, src, length, angle, tilt, leafy, config); + } + + /** + * Make a root + */ + protected void makeRoot(LevelAccessor worldReader, RandomSource random, BlockPos pos, int diameter, int branchHeight, double length, double angle, double tilt, TFTreeFeatureConfig config) { + BlockPos src = FeatureLogic.translate(pos.above(branchHeight), diameter, angle, 0.5); + BlockPos dest = FeatureLogic.translate(src, length, angle, tilt); + + FeaturePlacers.traceExposedRoot(worldReader, (checkedPos, state) -> worldReader.setBlock(checkedPos, state, 3), random, config.branchProvider, config.rootsProvider, new VoxelBresenhamIterator(src, dest)); + } + + /** + * Make a large, branching "base" branch in a specific location. + *

+ * The large branch will have 1-4 medium branches and several small branches too + */ + protected void makeLargeBranch(WorldGenLevel world, BiConsumer trunkPlacer, BiConsumer leavesPlacer, RandomSource random, BlockPos src, double length, double angle, double tilt, boolean leafy, TFTreeFeatureConfig config) { + BlockPos dest = FeatureLogic.translate(src, length, angle, tilt); + + // draw the main branch + FeaturePlacers.drawBresenhamBranch(world, trunkPlacer, random, src, dest, config.branchProvider); + + // reinforce it + //drawBresehnam(src[0], src[1] + 1, src[2], dest[0], dest[1], dest[2], treeBlock, true); + int reinforcements = random.nextInt(3); + for (int i = 0; i <= reinforcements; i++) { + int vx = (i & 2) == 0 ? 1 : 0; + int vy = (i & 1) == 0 ? 1 : -1; + int vz = (i & 2) == 0 ? 0 : 1; + FeaturePlacers.drawBresenhamBranch(world, trunkPlacer, random, src.offset(vx, vy, vz), dest, config.branchProvider); + } + + if (leafy) { + // add a leaf blob at the end + FeaturePlacers.placeSpheroid(world, leavesPlacer, FeaturePlacers.VALID_TREE_POS, random, dest.above(), 3.5f, 3.5f, config.leavesProvider); + } + + // go about halfway out and make a few medium branches. + // the number of medium branches we can support depends on the length of the big branch + // every other branch switches sides + int numMedBranches = random.nextInt((int) (length / 6)) + random.nextInt(2) + 1; + + for (int i = 0; i <= numMedBranches; i++) { + + double outVar = (random.nextDouble() * 0.3) + 0.3; + double angleVar = random.nextDouble() * 0.225 * ((i & 1) == 0 ? 1.0 : -1.0); + BlockPos bsrc = FeatureLogic.translate(src, length * outVar, angle, tilt); + + makeMedBranch(world, trunkPlacer, leavesPlacer, random, bsrc, length * 0.6, angle + angleVar, tilt, leafy, config); + } + + // make 1-2 small ones near the base + int numSmallBranches = random.nextInt(2) + 1; + for (int i = 0; i <= numSmallBranches; i++) { + + double outVar = (random.nextDouble() * 0.25) + 0.25; + double angleVar = random.nextDouble() * 0.25 * ((i & 1) == 0 ? 1.0 : -1.0); + BlockPos bsrc = FeatureLogic.translate(src, length * outVar, angle, tilt); + + makeSmallBranch(world, trunkPlacer, leavesPlacer, random, bsrc, Math.max(length * 0.3, 2), angle + angleVar, tilt, leafy, config); + } + + if (random.nextInt(LEAF_DUNGEON_CHANCE) == 0) { + makeLeafDungeon(world, leavesPlacer, random, dest.above(), config); + } + } + + private void makeLeafDungeon(WorldGenLevel world, BiConsumer leavesPlacer, RandomSource random, BlockPos pos, TFTreeFeatureConfig config) { + // make leaves + FeaturePlacers.placeSpheroid(world, leavesPlacer, FeaturePlacers.VALID_TREE_POS, random, pos, 4.5f, 4.5f, config.leavesProvider); + // wood support + FeatureUtil.drawBlob(world, pos, 3, config.branchProvider.getState(random, pos)); + // air + FeatureUtil.drawBlob(world, pos, 2, Blocks.AIR.defaultBlockState()); + + // spawner + world.setBlock(pos.above(), Blocks.SPAWNER.defaultBlockState(), 16 | 2); + SpawnerBlockEntity ms = (SpawnerBlockEntity) world.getBlockEntity(pos.above()); + if (ms != null) { + ms.setEntityId(TFEntities.SWARM_SPIDER.get(), random); + } + + // treasure chests? + makeLeafDungeonChest(world, random, pos); + } + + private void makeLeafDungeonChest(WorldGenLevel world, RandomSource random, BlockPos pos) { + Direction chestDir = Direction.Plane.HORIZONTAL.getRandomDirection(random); + pos = pos.relative(chestDir, 2); + TFLootTables.TREE_CACHE.generateChest(world, pos.below(), chestDir.getOpposite(), false); + } + + /** + * Make a large, branching "base" branch off of the tree + */ + protected void makeLargeBranch(WorldGenLevel world, BiConsumer trunkPlacer, BiConsumer leavesPlacer, RandomSource random, BlockPos pos, int diameter, int branchHeight, double length, double angle, double tilt, boolean leafy, TFTreeFeatureConfig config) { + BlockPos src = FeatureLogic.translate(pos.above(branchHeight), diameter, angle, 0.5); + makeLargeBranch(world, trunkPlacer, leavesPlacer, random, src, length, angle, tilt, leafy, config); + } + + /** + * Add a firefly at the specified height and angle. + */ + protected void addFirefly(LevelAccessor world, BlockPos pos, int diameter, int fHeight, double fAngle) { + BlockPos src = FeatureLogic.translate(pos.above(fHeight), diameter + 1, fAngle, 0.5); + + fAngle = fAngle % 1.0; + Direction facing = Direction.EAST; + + if (fAngle > 0.875 || fAngle <= 0.125) { + facing = Direction.SOUTH; + } else if (fAngle > 0.125 && fAngle <= 0.375) { + facing = Direction.EAST; + } else if (fAngle > 0.375 && fAngle <= 0.625) { + facing = Direction.NORTH; + } else if (fAngle > 0.625 && fAngle <= 0.875) { + facing = Direction.WEST; + } + + if (TFBlocks.FIREFLY.get().defaultBlockState().setValue(DirectionalBlock.FACING, facing).canSurvive(world, src)) { + world.setBlock(src, TFBlocks.FIREFLY.get().defaultBlockState().setValue(DirectionalBlock.FACING, facing), 3); + } + } + + protected void addCicada(LevelAccessor world, BlockPos pos, int diameter, int fHeight, double fAngle) { + BlockPos src = FeatureLogic.translate(pos.above(fHeight), diameter + 1, fAngle, 0.5); + + fAngle = fAngle % 1.0; + Direction facing = Direction.EAST; + + if (fAngle > 0.875 || fAngle <= 0.125) { + facing = Direction.SOUTH; + } else if (fAngle > 0.125 && fAngle <= 0.375) { + facing = Direction.EAST; + } else if (fAngle > 0.375 && fAngle <= 0.625) { + facing = Direction.NORTH; + } else if (fAngle > 0.625 && fAngle <= 0.875) { + facing = Direction.WEST; + } + + if (TFBlocks.CICADA.get().defaultBlockState().setValue(DirectionalBlock.FACING, facing).canSurvive(world, src)) { + world.setBlock(src, TFBlocks.CICADA.get().defaultBlockState().setValue(DirectionalBlock.FACING, facing), 3); + } + } +} diff --git a/src/main/java/twilightforest/world/components/feature/trees/LargeWinterTreeFeature.java b/src/main/java/twilightforest/world/components/feature/trees/LargeWinterTreeFeature.java new file mode 100644 index 0000000000..1050d3e30f --- /dev/null +++ b/src/main/java/twilightforest/world/components/feature/trees/LargeWinterTreeFeature.java @@ -0,0 +1,116 @@ +package twilightforest.world.components.feature.trees; + +import com.mojang.serialization.Codec; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.RotatedPillarBlock; +import net.minecraft.core.Direction; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.LevelAccessor; +import twilightforest.util.FeaturePlacers; +import twilightforest.world.components.feature.config.TFTreeFeatureConfig; + +import java.util.function.BiConsumer; + +public class LargeWinterTreeFeature extends TFTreeFeature { + + public LargeWinterTreeFeature(Codec config) { + super(config); + } + + @Override + protected boolean generate(WorldGenLevel world, RandomSource random, BlockPos pos, BiConsumer trunkPlacer, BiConsumer leavesPlacer, BiConsumer decorationPlacer, TFTreeFeatureConfig config) { + // determine a height + int treeHeight = 35; + if (random.nextInt(3) == 0) { + treeHeight += random.nextInt(10); + + if (random.nextInt(8) == 0) { + treeHeight += random.nextInt(10); + } + } + + if (world.isOutsideBuildHeight(pos.getY() + treeHeight)) { + return false; + } + + // check if we're on a valid block + if (!SnowTreeFeature.validTreePos(world, pos.below())) { + return false; + } + + //okay build a tree! Go up to the height + buildTrunk(world, trunkPlacer, random, pos, treeHeight, config); + + // make leaves + makeLeaves(world, trunkPlacer, leavesPlacer, random, pos, treeHeight, config); + + // roots! + int numRoots = 4 + random.nextInt(3); + float offset = random.nextFloat(); + for (int b = 0; b < numRoots; b++) { + FeaturePlacers.buildRoot(world, decorationPlacer, random, pos, offset, b, config.rootsProvider); + } + + return true; + } + + private void makeLeaves(LevelAccessor world, BiConsumer trunkPlacer, BiConsumer leavesPlacer, RandomSource random, BlockPos pos, int treeHeight, TFTreeFeatureConfig config) { + int offGround = 3; + int leafType = 1; + + for (int dy = 0; dy < treeHeight; dy++) { + + int radius = leafRadius(treeHeight, dy, leafType); + + FeaturePlacers.placeCircleEven(world, leavesPlacer, FeaturePlacers.VALID_TREE_POS, random, pos.above(offGround + treeHeight - dy), radius, config.leavesProvider); + this.makePineBranches(world, trunkPlacer, random, pos.above(offGround + treeHeight - dy), radius, config); + } + } + + private void makePineBranches(LevelAccessor world, BiConsumer trunkPlacer, RandomSource rand, BlockPos pos, int radius, TFTreeFeatureConfig config) { + int branchLength = radius > 4 ? radius - 1 : radius - 2; + + switch (pos.getY() % 2) { + case 0: + // branches + for (int i = 1; i <= branchLength; i++) { + this.placeLogAt(trunkPlacer, rand, pos.offset(-i, 0, 0), Direction.Axis.X, config); + this.placeLogAt(trunkPlacer, rand, pos.offset(0, 0, i + 1), Direction.Axis.Z, config); + this.placeLogAt(trunkPlacer, rand, pos.offset(i + 1, 0, 1), Direction.Axis.X, config); + this.placeLogAt(trunkPlacer, rand, pos.offset(1, 0, -i), Direction.Axis.Z, config); + } + break; + case 1: + for (int i = 1; i <= branchLength; i++) { + this.placeLogAt(trunkPlacer, rand, pos.offset(-1, 0, 1), Direction.Axis.X, config); + this.placeLogAt(trunkPlacer, rand, pos.offset(1, 0, i + 1), Direction.Axis.Z, config); + this.placeLogAt(trunkPlacer, rand, pos.offset(i + 1, 0, 0), Direction.Axis.X, config); + this.placeLogAt(trunkPlacer, rand, pos.offset(0, 0, -i), Direction.Axis.Z, config); + } + break; + } + } + + private void placeLogAt(BiConsumer trunkPlacer, RandomSource rand, BlockPos pos, Direction.Axis axis, TFTreeFeatureConfig config) { + trunkPlacer.accept(pos, config.trunkProvider.getState(rand, pos).setValue(RotatedPillarBlock.AXIS, axis)); + } + + private int leafRadius(int treeHeight, int dy, int functionType) { + return switch (functionType) { + case 1 -> (int) (4F * dy / treeHeight + (0.75F * dy % 3)); + case 99 -> (treeHeight - (dy / 2) - 1) % 4; // bad + default -> (dy - 1) % 4; + }; + } + + private void buildTrunk(LevelAccessor world, BiConsumer trunkPlacer, RandomSource rand, BlockPos pos, int treeHeight, TFTreeFeatureConfig config) { + for (int dy = 0; dy < treeHeight; dy++) { + FeaturePlacers.placeIfValidTreePos(world, trunkPlacer, rand, pos.offset(0, dy, 0), config.trunkProvider); + FeaturePlacers.placeIfValidTreePos(world, trunkPlacer, rand, pos.offset(1, dy, 0), config.trunkProvider); + FeaturePlacers.placeIfValidTreePos(world, trunkPlacer, rand, pos.offset(0, dy, 1), config.trunkProvider); + FeaturePlacers.placeIfValidTreePos(world, trunkPlacer, rand, pos.offset(1, dy, 1), config.trunkProvider); + } + } +} diff --git a/src/main/java/twilightforest/world/components/feature/trees/MiningTreeFeature.java b/src/main/java/twilightforest/world/components/feature/trees/MiningTreeFeature.java new file mode 100644 index 0000000000..6034c91143 --- /dev/null +++ b/src/main/java/twilightforest/world/components/feature/trees/MiningTreeFeature.java @@ -0,0 +1,89 @@ +package twilightforest.world.components.feature.trees; + +import com.mojang.serialization.Codec; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.RotatedPillarBlock; +import net.minecraft.core.Direction; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.LevelAccessor; +import twilightforest.init.TFBlocks; +import twilightforest.util.FeaturePlacers; +import twilightforest.util.FeatureUtil; +import twilightforest.world.components.feature.config.TFTreeFeatureConfig; + +import java.util.function.BiConsumer; + +public class MiningTreeFeature extends TFTreeFeature { + + public MiningTreeFeature(Codec config) { + super(config); + } + + @Override + protected boolean generate(WorldGenLevel world, RandomSource random, BlockPos pos, BiConsumer trunkPlacer, BiConsumer leavesPlacer, BiConsumer decorationPlacer, TFTreeFeatureConfig config) { + if (world.isOutsideBuildHeight(pos.getY() + 12)) { + return false; + } + + // check soil + BlockState state = world.getBlockState(pos.below()); + if (!state.getBlock().canSustainPlant(state, world, pos.below(), Direction.UP, TFBlocks.MINING_SAPLING.get())) { + return false; + } + + // 9 block high trunk + for (int dy = 0; dy <= 9; dy++) { + FeaturePlacers.placeIfValidTreePos(world, trunkPlacer, random, pos.above(dy), config.trunkProvider); + } + + // branches with leaf blocks + putBranchWithLeaves(world, trunkPlacer, leavesPlacer, random, pos.offset(0, 9, 1), true, config); + putBranchWithLeaves(world, trunkPlacer, leavesPlacer, random, pos.offset(0, 9, 2), false, config); + putBranchWithLeaves(world, trunkPlacer, leavesPlacer, random, pos.offset(0, 8, 3), false, config); + putBranchWithLeaves(world, trunkPlacer, leavesPlacer, random, pos.offset(0, 7, 4), false, config); + putBranchWithLeaves(world, trunkPlacer, leavesPlacer, random, pos.offset(0, 6, 5), false, config); + + putBranchWithLeaves(world, trunkPlacer, leavesPlacer, random, pos.offset(0, 9, -1), true, config); + putBranchWithLeaves(world, trunkPlacer, leavesPlacer, random, pos.offset(0, 9, -2), false, config); + putBranchWithLeaves(world, trunkPlacer, leavesPlacer, random, pos.offset(0, 8, -3), false, config); + putBranchWithLeaves(world, trunkPlacer, leavesPlacer, random, pos.offset(0, 7, -4), false, config); + putBranchWithLeaves(world, trunkPlacer, leavesPlacer, random, pos.offset(0, 6, -5), false, config); + + // place minewood core + world.setBlock(pos.above(), TFBlocks.MINING_LOG_CORE.get().defaultBlockState().setValue(RotatedPillarBlock.AXIS, Direction.Axis.Y), 3); + world.scheduleTick(pos.above(), TFBlocks.MINING_LOG_CORE.get(), 20); + + // root bulb + if (FeatureUtil.hasAirAround(world, pos.below())) { + FeaturePlacers.placeIfValidTreePos(world, trunkPlacer, random, pos.below(), config.trunkProvider); + } else { + FeaturePlacers.placeIfValidRootPos(world, decorationPlacer, random, pos.below(), config.rootsProvider); + } + + // roots! + int numRoots = 3 + random.nextInt(2); + float offset = random.nextFloat(); + for (int b = 0; b < numRoots; b++) { + FeaturePlacers.buildRoot(world, decorationPlacer, random, pos, offset, b, config.rootsProvider); + } + + return true; + } + + protected static void putBranchWithLeaves(LevelAccessor world, BiConsumer trunkPlacer, BiConsumer leavesPlacer, RandomSource rand, BlockPos pos, boolean bushy, TFTreeFeatureConfig config) { + FeaturePlacers.placeIfValidTreePos(world, trunkPlacer, rand, pos, config.branchProvider); + + for (int lx = -1; lx <= 1; lx++) { + for (int ly = -1; ly <= 1; ly++) { + for (int lz = -1; lz <= 1; lz++) { + if (!bushy && Math.abs(ly) > 0 && Math.abs(lx) > 0) { + continue; + } + FeaturePlacers.placeProvidedBlock(world, leavesPlacer, FeaturePlacers.VALID_TREE_POS, pos.offset(lx, ly, lz), config.leavesProvider, rand); + } + } + } + } +} diff --git a/src/main/java/twilightforest/world/components/feature/trees/OakCanopyTreeFeature.java b/src/main/java/twilightforest/world/components/feature/trees/OakCanopyTreeFeature.java new file mode 100644 index 0000000000..b18e545445 --- /dev/null +++ b/src/main/java/twilightforest/world/components/feature/trees/OakCanopyTreeFeature.java @@ -0,0 +1,165 @@ +package twilightforest.world.components.feature.trees; + +import com.google.common.collect.Lists; +import com.mojang.serialization.Codec; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.LevelSimulatedReader; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.DirectionalBlock; +import net.minecraft.world.level.block.state.BlockState; +import twilightforest.init.TFBlocks; +import twilightforest.util.FeatureLogic; +import twilightforest.util.FeaturePlacers; +import twilightforest.util.FeatureUtil; +import twilightforest.world.components.feature.config.TFTreeFeatureConfig; + +import javax.annotation.ParametersAreNonnullByDefault; +import java.util.List; +import java.util.function.BiConsumer; + +@ParametersAreNonnullByDefault +public class OakCanopyTreeFeature extends CanopyTreeFeature { + + public OakCanopyTreeFeature(Codec config) { + super(config); + } + + @Override + protected boolean generate(WorldGenLevel world, RandomSource random, BlockPos pos, BiConsumer trunkPlacer, BiConsumer leavesPlacer, BiConsumer decorationPlacer, TFTreeFeatureConfig config) { + List leaves = Lists.newArrayList(); + // determine a height + int treeHeight = config.minHeight; + if (random.nextInt(config.chanceAddFiveFirst) == 0) { + treeHeight += random.nextInt(treeHeight / 2); + + if (random.nextInt(config.chanceAddFiveSecond) == 0) { + treeHeight += random.nextInt(5); + } + } + + if (world.isOutsideBuildHeight(pos.getY() + treeHeight)) { + return false; + } + + // check if we're on dirt or grass + BlockState state = world.getBlockState(pos.below()); + if (!state.getBlock().canSustainPlant(state, world, pos.below(), Direction.UP, TFBlocks.CANOPY_SAPLING.get())) { + return false; + } + + leaves.clear(); + + //okay build a tree! Go up to the height + buildTrunk(world, leaves, trunkPlacer, random, pos, treeHeight, config); + + // make 12 - 20 branches + int numBranches = 12 + random.nextInt(9); + float bangle = random.nextFloat(); + for (int b = 0; b < numBranches; b++) { + float btilt = 0.15F + (random.nextFloat() * 0.35F); + buildBranch(world, leaves, pos, trunkPlacer, treeHeight - 10 + (b / 2), 5, bangle, btilt, false, random, config); + + bangle += (random.nextFloat() * 0.4F); + if (bangle > 1.0F) { + bangle -= 1.0F; + } + } + + // add the actual leaves + for (BlockPos leafPos : leaves) { + makeLeafBlob(world, leavesPlacer, random, leafPos, config); + } + + OakCanopyTreeFeature.makeRoots(world, trunkPlacer, decorationPlacer, random, pos, config); + OakCanopyTreeFeature.makeRoots(world, trunkPlacer, decorationPlacer, random, pos.east(), config); + OakCanopyTreeFeature.makeRoots(world, trunkPlacer, decorationPlacer, random, pos.south(), config); + OakCanopyTreeFeature.makeRoots(world, trunkPlacer, decorationPlacer, random, pos.east().south(), config); + + return true; + } + + private void makeLeafBlob(LevelSimulatedReader world, BiConsumer leafPlacer, RandomSource rand, BlockPos leafPos, TFTreeFeatureConfig config) { + FeaturePlacers.placeSpheroid(world, leafPlacer, FeaturePlacers.VALID_TREE_POS, rand, leafPos, 2.5f, 2.5f, config.leavesProvider); + } + + private static void makeRoots(LevelAccessor world, BiConsumer trunkPlacer, BiConsumer decoPlacer, RandomSource random, BlockPos pos, TFTreeFeatureConfig config) { + // root bulb + if (FeatureUtil.hasAirAround(world, pos.below())) { + FeaturePlacers.placeIfValidTreePos(world, trunkPlacer, random, pos.below(), config.trunkProvider); + } else { + FeaturePlacers.placeIfValidRootPos(world, decoPlacer, random, pos.below(), config.rootsProvider); + } + + // roots! + int numRoots = 1 + random.nextInt(2); + float offset = random.nextFloat(); + for (int b = 0; b < numRoots; b++) { + FeaturePlacers.buildRoot(world, decoPlacer, random, pos, offset, b, config.rootsProvider); + } + } + + private void buildTrunk(LevelAccessor world, List leaves, BiConsumer trunkPlacer, RandomSource rand, BlockPos pos, int treeHeight, TFTreeFeatureConfig config) { + for (int dy = 0; dy < treeHeight; dy++) { + FeaturePlacers.placeIfValidTreePos(world, trunkPlacer, rand, pos.offset(0, dy, 0), config.trunkProvider); + FeaturePlacers.placeIfValidTreePos(world, trunkPlacer, rand, pos.offset(1, dy, 0), config.trunkProvider); + FeaturePlacers.placeIfValidTreePos(world, trunkPlacer, rand, pos.offset(0, dy, 1), config.trunkProvider); + FeaturePlacers.placeIfValidTreePos(world, trunkPlacer, rand, pos.offset(1, dy, 1), config.trunkProvider); + } + + if (rand.nextInt(3) == 0) { + Direction direction = Direction.getRandom(rand); + Direction.Axis axis = direction.getAxis(); + if (axis != Direction.Axis.Y) { + BlockPos.MutableBlockPos bugPos = new BlockPos.MutableBlockPos(); + bugPos.set(pos.offset(direction == Direction.EAST ? 1 : 0, rand.nextInt(treeHeight) / 2 + 10, direction == Direction.SOUTH ? 1 : 0)); + bugPos.move(direction).move(axis == Direction.Axis.Z ? rand.nextInt(2) : 0, 0, axis == Direction.Axis.X ? rand.nextInt(2) : 0); + if (!world.getBlockState(bugPos).isSolidRender(world, bugPos)) { + BlockState bugState = TFBlocks.FIREFLY.get().defaultBlockState().setValue(DirectionalBlock.FACING, direction); + this.setBlock(world, bugPos, bugState); + } + } + } + + leaves.add(pos.offset(0, treeHeight, 0)); + } + + /** + * Build a branch with a flat blob of leaves at the end. + */ + @Override + void buildBranch(LevelAccessor world, List leaves, BlockPos pos, BiConsumer trunkPlacer, int height, double length, double angle, double tilt, boolean trunk, RandomSource treeRNG, TFTreeFeatureConfig config) { + BlockPos src = pos.above(height); + BlockPos dest = FeatureLogic.translate(src, length, angle, tilt); + + // constrain branch spread + int limit = 5; + if ((dest.getX() - pos.getX()) < -limit) { + dest = new BlockPos(pos.getX() - limit, dest.getY(), dest.getZ()); + } + if ((dest.getX() - pos.getX()) > limit) { + dest = new BlockPos(pos.getX() + limit, dest.getY(), dest.getZ()); + } + if ((dest.getZ() - pos.getZ()) < -limit) { + dest = new BlockPos(dest.getX(), dest.getY(), pos.getZ() - limit); + } + if ((dest.getZ() - pos.getZ()) > limit) { + dest = new BlockPos(dest.getX(), dest.getY(), pos.getZ() + limit); + } + + if (trunk) { + FeaturePlacers.drawBresenhamTree(world, trunkPlacer, FeaturePlacers.VALID_TREE_POS, src, dest, config.trunkProvider, treeRNG); + } else { + FeaturePlacers.drawBresenhamBranch(world, trunkPlacer, treeRNG, src, dest, config.branchProvider); + } + + FeaturePlacers.placeIfValidTreePos(world, trunkPlacer, treeRNG, dest.east(), config.branchProvider); + FeaturePlacers.placeIfValidTreePos(world, trunkPlacer, treeRNG, dest.west(), config.branchProvider); + FeaturePlacers.placeIfValidTreePos(world, trunkPlacer, treeRNG, dest.north(), config.branchProvider); + FeaturePlacers.placeIfValidTreePos(world, trunkPlacer, treeRNG, dest.south(), config.branchProvider); + + leaves.add(dest); + } +} diff --git a/src/main/java/twilightforest/world/components/feature/trees/RedCanopyMushroomFeature.java b/src/main/java/twilightforest/world/components/feature/trees/RedCanopyMushroomFeature.java new file mode 100644 index 0000000000..65cb069cd3 --- /dev/null +++ b/src/main/java/twilightforest/world/components/feature/trees/RedCanopyMushroomFeature.java @@ -0,0 +1,174 @@ +package twilightforest.world.components.feature.trees; + +import com.mojang.serialization.Codec; +import net.minecraft.core.BlockPos; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.HugeMushroomBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; +import net.minecraft.world.level.levelgen.feature.configurations.HugeMushroomFeatureConfiguration; + +import javax.annotation.ParametersAreNonnullByDefault; + +@ParametersAreNonnullByDefault +public class RedCanopyMushroomFeature extends CanopyMushroomFeature { + private int altHeads = 0; + + public RedCanopyMushroomFeature(Codec featureConfigurationCodec) { + super(featureConfigurationCodec); + } + + @Override + public boolean place(FeaturePlaceContext context) { + this.altHeads = context.random().nextInt(100) + 1; //Roll the dice on the style of cap + return super.place(context); + } + + @Override + protected int getTreeHeight(RandomSource random) { + return super.getTreeHeight(random) + 3; + } + + @Override + protected int getBranches(RandomSource random) { + return 3; + } + + @Override + protected double getLength(RandomSource random) { + return 10 + random.nextInt(2); + } + + /** + * 33% Chance to get a vanilla - styled big red mushroom cap, + * 33% chance for it to be a "smooth" cap, kinda like the ones on a mushroom castle, + * 33% chance it's the same style of cap as you'd find in TF version 1.17, for example + * 1% chance for it to be a flat cap, same as the brown mushroom one, these used to be in older versions of TF + */ + @Override + protected void makeCap(LevelAccessor levelAccessor, RandomSource random, BlockPos pos, int height, BlockPos.MutableBlockPos mutableBlockPos, HugeMushroomFeatureConfiguration featureConfiguration) { + if (this.altHeads <= 33) { + this.makeVanillaCap(levelAccessor, random, pos, height, mutableBlockPos, featureConfiguration); + } else if (this.altHeads <= 66) { + this.makeSmoothCap(levelAccessor, random, pos, height, mutableBlockPos, featureConfiguration); + } else if (this.altHeads <= 99) { + this.makeSpheroidCap(levelAccessor, random, pos, height, mutableBlockPos, featureConfiguration); + } else super.makeCap(levelAccessor, random, pos, height, mutableBlockPos, featureConfiguration); + } + + //Pretty much a 1:1 vanilla copy of the big red mushroom cap code + protected void makeVanillaCap(LevelAccessor levelAccessor, RandomSource random, BlockPos pos, int height, BlockPos.MutableBlockPos mutableBlockPos, HugeMushroomFeatureConfiguration featureConfiguration) { + for(int y = height - 3; y <= height; ++y) { + int j = y < height ? featureConfiguration.foliageRadius : featureConfiguration.foliageRadius - 1; + int k = featureConfiguration.foliageRadius - 2; + + for(int x = -j; x <= j; ++x) { + for(int z = -j; z <= j; ++z) { + boolean xIsMin = x == -j; + boolean xIsMax = x == j; + boolean zIsMin = z == -j; + boolean zIsMax = z == j; + boolean xMinMax = xIsMin || xIsMax; + boolean zMinMax = zIsMin || zIsMax; + if (y >= height || xMinMax != zMinMax) { + mutableBlockPos.setWithOffset(pos, x, y, z); + if (!levelAccessor.getBlockState(mutableBlockPos).isSolidRender(levelAccessor, mutableBlockPos)) { + BlockState blockstate = featureConfiguration.capProvider.getState(random, pos); + + if (blockstate.hasProperty(HugeMushroomBlock.WEST) && blockstate.hasProperty(HugeMushroomBlock.EAST) && blockstate.hasProperty(HugeMushroomBlock.NORTH) && blockstate.hasProperty(HugeMushroomBlock.SOUTH) && blockstate.hasProperty(HugeMushroomBlock.UP)) { + blockstate = blockstate + .setValue(HugeMushroomBlock.UP, y >= height - 1) + .setValue(HugeMushroomBlock.WEST, x < -k) + .setValue(HugeMushroomBlock.EAST, x > k) + .setValue(HugeMushroomBlock.NORTH, z < -k) + .setValue(HugeMushroomBlock.SOUTH, z > k); + } + + this.setBlock(levelAccessor, mutableBlockPos, blockstate); + } + } + } + } + } + } + + protected void makeSmoothCap(LevelAccessor levelAccessor, RandomSource random, BlockPos pos, int height, BlockPos.MutableBlockPos mutableBlockPos, HugeMushroomFeatureConfiguration featureConfiguration) { + for(int y = height - 2; y <= height + 1; ++y) { + int j = featureConfiguration.foliageRadius - Math.max(0, y - (height - 1)) + 1; + + for(int x = -j; x <= j; ++x) { + for(int z = -j; z <= j; ++z) { + if (isInsideSmoothShape(height, j, x, y, z)) { + mutableBlockPos.setWithOffset(pos, x, y, z); + if (!levelAccessor.getBlockState(mutableBlockPos).isSolidRender(levelAccessor, mutableBlockPos)) { + BlockState blockstate = featureConfiguration.capProvider.getState(random, pos); + + if (blockstate.hasProperty(HugeMushroomBlock.WEST) && blockstate.hasProperty(HugeMushroomBlock.EAST) && blockstate.hasProperty(HugeMushroomBlock.NORTH) && blockstate.hasProperty(HugeMushroomBlock.SOUTH) && blockstate.hasProperty(HugeMushroomBlock.UP)) { + blockstate = blockstate + .setValue(HugeMushroomBlock.UP, !isInsideSmoothShape(height, j - (y > height - 2 ? 1 : 0), x, y + 1, z)) + .setValue(HugeMushroomBlock.WEST, !isInsideSmoothShape(height, j, x - 1, y, z) && x < 0) + .setValue(HugeMushroomBlock.EAST, !isInsideSmoothShape(height, j, x + 1, y, z) && x > 0) + .setValue(HugeMushroomBlock.NORTH, !isInsideSmoothShape(height, j, x, y, z - 1) && z < 0) + .setValue(HugeMushroomBlock.SOUTH, !isInsideSmoothShape(height, j, x, y, z + 1) && z > 0); + } + + this.setBlock(levelAccessor, mutableBlockPos, blockstate); + } + } + } + } + } + } + + /** + * Don't know if there's a cleaner way of doing this? Feel free to try, but this works for now. + * Most of this code is just for the blockStates to be correct, this would be a lot shorter otherwise and wouldn't be a method. + */ + private static boolean isInsideSmoothShape(int height, int j, int x, int y, int z) { + int i = y - (height - 2); + if (i == 4 || Math.abs(x) > j || Math.abs(z) > j) return false; + if (i >= 2) return true; + + boolean xIsMin = x == -j; + boolean xIsMax = x == j; + boolean zIsMin = z == -j; + boolean zIsMax = z == j; + boolean xMinMax = xIsMin || xIsMax; + boolean zMinMax = zIsMin || zIsMax; + + if (i == 1 && ((xMinMax && Math.abs(z) == j - 1) || (zMinMax && Math.abs(x) == j - 1))) return false; + + return xMinMax != zMinMax || (Math.abs(x) == Math.abs(z) && Math.abs(x) == j - 1); + } + + protected void makeSpheroidCap(LevelAccessor levelAccessor, RandomSource random, BlockPos pos, int height, BlockPos.MutableBlockPos mutableBlockPos, HugeMushroomFeatureConfiguration featureConfiguration) { + for(int y = height - 2; y <= height; ++y) { + int j = y == height - 1 ? featureConfiguration.foliageRadius + 2 : featureConfiguration.foliageRadius + 1; + + for(int x = -j; x <= j; ++x) { + for(int z = -j; z <= j; ++z) { + double distance = Math.sqrt(x * x + z * z); + double maxDistance = (double)j + 0.1D; + if (distance <= maxDistance) { + mutableBlockPos.setWithOffset(pos, x, y, z); + if (!levelAccessor.getBlockState(mutableBlockPos).isSolidRender(levelAccessor, mutableBlockPos)) { + BlockState blockstate = featureConfiguration.capProvider.getState(random, pos); + + if (blockstate.hasProperty(HugeMushroomBlock.WEST) && blockstate.hasProperty(HugeMushroomBlock.EAST) && blockstate.hasProperty(HugeMushroomBlock.NORTH) && blockstate.hasProperty(HugeMushroomBlock.SOUTH) && blockstate.hasProperty(HugeMushroomBlock.UP)) { + blockstate = blockstate + .setValue(HugeMushroomBlock.UP, y > height - 2 && (y == height || distance > maxDistance - 1D)) + .setValue(HugeMushroomBlock.WEST, Math.sqrt((x - 1) * (x - 1) + z * z) > maxDistance) + .setValue(HugeMushroomBlock.EAST, Math.sqrt((x + 1) * (x + 1) + z * z) > maxDistance) + .setValue(HugeMushroomBlock.NORTH, Math.sqrt(x * x + (z - 1) * (z - 1)) > maxDistance) + .setValue(HugeMushroomBlock.SOUTH, Math.sqrt(x * x + (z + 1) * (z + 1)) > maxDistance); + } + + this.setBlock(levelAccessor, mutableBlockPos, blockstate); + } + } + } + } + } + } +} diff --git a/src/main/java/twilightforest/world/components/feature/trees/SnowTreeFeature.java b/src/main/java/twilightforest/world/components/feature/trees/SnowTreeFeature.java new file mode 100644 index 0000000000..a1355d8c45 --- /dev/null +++ b/src/main/java/twilightforest/world/components/feature/trees/SnowTreeFeature.java @@ -0,0 +1,239 @@ +package twilightforest.world.components.feature.trees; + +import com.google.common.collect.Iterables; +import com.google.common.collect.Lists; +import com.google.common.collect.Sets; +import com.mojang.serialization.Codec; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.tags.BlockTags; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.LevelSimulatedReader; +import net.minecraft.world.level.LevelWriter; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.levelgen.feature.Feature; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; +import net.minecraft.world.level.levelgen.feature.TreeFeature; +import net.minecraft.world.level.levelgen.feature.configurations.TreeConfiguration; +import net.minecraft.world.level.levelgen.feature.foliageplacers.FoliagePlacer; +import net.minecraft.world.level.levelgen.feature.treedecorators.TreeDecorator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.phys.shapes.BitSetDiscreteVoxelShape; +import net.minecraft.world.phys.shapes.DiscreteVoxelShape; + +import java.util.List; +import java.util.OptionalInt; +import java.util.Set; +import java.util.function.BiConsumer; + +//[VanillaCopy] of TreeFeature but allows trees on snow +public class SnowTreeFeature extends Feature { + public SnowTreeFeature(Codec codec) { + super(codec); + } + + private static boolean isVine(LevelSimulatedReader reader, BlockPos pos) { + return reader.isStateAtPosition(pos, (state) -> state.is(Blocks.VINE)); + } + + public static boolean isBlockWater(LevelSimulatedReader reader, BlockPos pos) { + return reader.isStateAtPosition(pos, (p_225297_) -> p_225297_.is(Blocks.WATER)); + } + + public static boolean isAirOrLeaves(LevelSimulatedReader reader, BlockPos pos) { + return reader.isStateAtPosition(pos, (p_225295_) -> p_225295_.isAir() || p_225295_.is(BlockTags.LEAVES)); + } + + private static boolean isReplaceablePlant(LevelSimulatedReader reader, BlockPos pos) { + return reader.isStateAtPosition(pos, (p_225293_) -> { + Material material = p_225293_.getMaterial(); + return material == Material.REPLACEABLE_PLANT || material == Material.REPLACEABLE_WATER_PLANT || material == Material.REPLACEABLE_FIREPROOF_PLANT; + }); + } + + private static void setBlockKnownShape(LevelWriter p_67257_, BlockPos p_67258_, BlockState p_67259_) { + p_67257_.setBlock(p_67258_, p_67259_, 19); + } + + public static boolean validTreePos(LevelSimulatedReader reader, BlockPos pos) { + return reader.isStateAtPosition(pos, state -> state.is(Blocks.SNOW_BLOCK)) || isAirOrLeaves(reader, pos) || isReplaceablePlant(reader, pos) || isBlockWater(reader, pos); + } + + private boolean doPlace(WorldGenLevel level, RandomSource random, BlockPos pos, BiConsumer consumer, BiConsumer consumer1, FoliagePlacer.FoliageSetter setter, TreeConfiguration config) { + int i = config.trunkPlacer.getTreeHeight(random); + int j = config.foliagePlacer.foliageHeight(random, i, config); + int k = i - j; + int l = config.foliagePlacer.foliageRadius(random, k); + BlockPos blockpos = config.rootPlacer.map((p_225286_) -> p_225286_.getTrunkOrigin(pos, random)).orElse(pos); + int i1 = Math.min(pos.getY(), blockpos.getY()); + int j1 = Math.max(pos.getY(), blockpos.getY()) + i + 1; + if (i1 >= level.getMinBuildHeight() + 1 && j1 <= level.getMaxBuildHeight()) { + OptionalInt optionalint = config.minimumSize.minClippedHeight(); + int k1 = this.getMaxFreeTreeHeight(level, i, blockpos, config); + if (k1 >= i || !optionalint.isEmpty() && k1 >= optionalint.getAsInt()) { + if (config.rootPlacer.isPresent() && !config.rootPlacer.get().placeRoots(level, consumer, random, pos, blockpos, config)) { + return false; + } else { + List list = config.trunkPlacer.placeTrunk(level, consumer1, random, k1, blockpos, config); + list.forEach((p_225279_) -> { + config.foliagePlacer.createFoliage(level, setter, random, config, k1, p_225279_, j, l); + }); + return true; + } + } else { + return false; + } + } else { + return false; + } + } + + private int getMaxFreeTreeHeight(LevelSimulatedReader reader, int height, BlockPos pos, TreeConfiguration config) { + BlockPos.MutableBlockPos blockpos$mutableblockpos = new BlockPos.MutableBlockPos(); + + for(int i = 0; i <= height + 1; ++i) { + int j = config.minimumSize.getSizeAtHeight(height, i); + + for(int k = -j; k <= j; ++k) { + for(int l = -j; l <= j; ++l) { + blockpos$mutableblockpos.setWithOffset(pos, k, i, l); + if (!config.trunkPlacer.isFree(reader, blockpos$mutableblockpos) || !config.ignoreVines && isVine(reader, blockpos$mutableblockpos)) { + return i - 2; + } + } + } + } + + return height; + } + + protected void setBlock(LevelWriter writer, BlockPos pos, BlockState state) { + setBlockKnownShape(writer, pos, state); + } + + public final boolean place(FeaturePlaceContext context) { + WorldGenLevel worldgenlevel = context.level(); + RandomSource randomsource = context.random(); + BlockPos blockpos = context.origin(); + TreeConfiguration treeconfiguration = context.config(); + Set set = Sets.newHashSet(); + Set set1 = Sets.newHashSet(); + Set set2 = Sets.newHashSet(); + Set set3 = Sets.newHashSet(); + BiConsumer biconsumer = (p_160555_, p_160556_) -> { + set.add(p_160555_.immutable()); + worldgenlevel.setBlock(p_160555_, p_160556_, 19); + }; + BiConsumer biconsumer1 = (p_160548_, p_160549_) -> { + set1.add(p_160548_.immutable()); + worldgenlevel.setBlock(p_160548_, p_160549_, 19); + }; + FoliagePlacer.FoliageSetter setter = new FoliagePlacer.FoliageSetter() { + public void set(BlockPos pos, BlockState state) { + set2.add(pos.immutable()); + worldgenlevel.setBlock(pos, state, 19); + } + + public boolean isSet(BlockPos p_272999_) { + return set2.contains(p_272999_); + } + }; + BiConsumer biconsumer3 = (p_225290_, p_225291_) -> { + set3.add(p_225290_.immutable()); + worldgenlevel.setBlock(p_225290_, p_225291_, 19); + }; + boolean flag = this.doPlace(worldgenlevel, randomsource, blockpos, biconsumer, biconsumer1, setter, treeconfiguration); + if (flag && (!set1.isEmpty() || !set2.isEmpty())) { + if (!treeconfiguration.decorators.isEmpty()) { + TreeDecorator.Context treedecorator$context = new TreeDecorator.Context(worldgenlevel, biconsumer3, randomsource, set1, set2, set); + treeconfiguration.decorators.forEach((p_225282_) -> { + p_225282_.place(treedecorator$context); + }); + } + + return BoundingBox.encapsulatingPositions(Iterables.concat(set, set1, set2, set3)).map((p_225270_) -> { + DiscreteVoxelShape discretevoxelshape = updateLeaves(worldgenlevel, p_225270_, set1, set3, set); + StructureTemplate.updateShapeAtEdge(worldgenlevel, 3, discretevoxelshape, p_225270_.minX(), p_225270_.minY(), p_225270_.minZ()); + return true; + }).orElse(false); + } else { + return false; + } + } + + public static DiscreteVoxelShape updateLeaves(LevelAccessor accessor, BoundingBox box, Set posSet, Set posSet1, Set posSet2) { + List> list = Lists.newArrayList(); + DiscreteVoxelShape discretevoxelshape = new BitSetDiscreteVoxelShape(box.getXSpan(), box.getYSpan(), box.getZSpan()); + int i = 6; + + for(int j = 0; j < 6; ++j) { + list.add(Sets.newHashSet()); + } + + BlockPos.MutableBlockPos blockpos$mutableblockpos = new BlockPos.MutableBlockPos(); + + for(BlockPos blockpos : Lists.newArrayList(Sets.union(posSet1, posSet2))) { + if (box.isInside(blockpos)) { + discretevoxelshape.fill(blockpos.getX() - box.minX(), blockpos.getY() - box.minY(), blockpos.getZ() - box.minZ()); + } + } + + for(BlockPos blockpos1 : Lists.newArrayList(posSet)) { + if (box.isInside(blockpos1)) { + discretevoxelshape.fill(blockpos1.getX() - box.minX(), blockpos1.getY() - box.minY(), blockpos1.getZ() - box.minZ()); + } + + for(Direction direction : Direction.values()) { + blockpos$mutableblockpos.setWithOffset(blockpos1, direction); + if (!posSet.contains(blockpos$mutableblockpos)) { + BlockState blockstate = accessor.getBlockState(blockpos$mutableblockpos); + if (blockstate.hasProperty(BlockStateProperties.DISTANCE)) { + list.get(0).add(blockpos$mutableblockpos.immutable()); + setBlockKnownShape(accessor, blockpos$mutableblockpos, blockstate.setValue(BlockStateProperties.DISTANCE, 1)); + if (box.isInside(blockpos$mutableblockpos)) { + discretevoxelshape.fill(blockpos$mutableblockpos.getX() - box.minX(), blockpos$mutableblockpos.getY() - box.minY(), blockpos$mutableblockpos.getZ() - box.minZ()); + } + } + } + } + } + + for(int l = 1; l < 6; ++l) { + Set set = list.get(l - 1); + Set set1 = list.get(l); + + for(BlockPos blockpos2 : set) { + if (box.isInside(blockpos2)) { + discretevoxelshape.fill(blockpos2.getX() - box.minX(), blockpos2.getY() - box.minY(), blockpos2.getZ() - box.minZ()); + } + + for(Direction direction1 : Direction.values()) { + blockpos$mutableblockpos.setWithOffset(blockpos2, direction1); + if (!set.contains(blockpos$mutableblockpos) && !set1.contains(blockpos$mutableblockpos)) { + BlockState blockstate1 = accessor.getBlockState(blockpos$mutableblockpos); + if (blockstate1.hasProperty(BlockStateProperties.DISTANCE)) { + int k = blockstate1.getValue(BlockStateProperties.DISTANCE); + if (k > l + 1) { + BlockState blockstate2 = blockstate1.setValue(BlockStateProperties.DISTANCE, l + 1); + setBlockKnownShape(accessor, blockpos$mutableblockpos, blockstate2); + if (box.isInside(blockpos$mutableblockpos)) { + discretevoxelshape.fill(blockpos$mutableblockpos.getX() - box.minX(), blockpos$mutableblockpos.getY() - box.minY(), blockpos$mutableblockpos.getZ() - box.minZ()); + } + + set1.add(blockpos$mutableblockpos.immutable()); + } + } + } + } + } + } + + return discretevoxelshape; + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/world/components/feature/trees/SnowUnderTreeFeature.java b/src/main/java/twilightforest/world/components/feature/trees/SnowUnderTreeFeature.java new file mode 100644 index 0000000000..64e8d0d13d --- /dev/null +++ b/src/main/java/twilightforest/world/components/feature/trees/SnowUnderTreeFeature.java @@ -0,0 +1,58 @@ +package twilightforest.world.components.feature.trees; + +import com.mojang.serialization.Codec; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.LeavesBlock; +import net.minecraft.world.level.block.SnowyDirtBlock; +import net.minecraft.core.Direction; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.levelgen.Heightmap; +import net.minecraft.world.level.levelgen.feature.Feature; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; + +public class SnowUnderTreeFeature extends Feature { + + public SnowUnderTreeFeature(Codec config) { + super(config); + } + + @Override + public boolean place(FeaturePlaceContext ctx) { + BlockPos pos = ctx.origin(); + WorldGenLevel world = ctx.level(); + BlockPos.MutableBlockPos mPos = new BlockPos.MutableBlockPos(); + BlockPos.MutableBlockPos mPosDown = new BlockPos.MutableBlockPos(); + + for (int xi = 0; xi < 16; xi++) { + for (int zi = 0; zi < 16; zi++) { + int x = pos.getX() + xi; + int z = pos.getZ() + zi; + mPos.set(x, world.getHeight(Heightmap.Types.MOTION_BLOCKING, x, z) - 1, z); + + if (world.getBlockState(mPos).getBlock() instanceof LeavesBlock) { + BlockState state; + mPos.set(x, world.getHeight(Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, x, z), z); + state = world.getBlockState(mPos); + + if (state.isAir()) { + BlockState stateBelow; + mPosDown.set(mPos).move(Direction.DOWN); + stateBelow = world.getBlockState(mPosDown); + + if (stateBelow.isFaceSturdy(world, mPosDown, Direction.UP)) { + world.setBlock(mPos, Blocks.SNOW.defaultBlockState(), 2); + + if (stateBelow.hasProperty(SnowyDirtBlock.SNOWY)) { + world.setBlock(mPosDown, stateBelow.setValue(SnowyDirtBlock.SNOWY, true), 2); + } + } + } + } + } + } + return true; + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/world/components/feature/trees/TFTreeFeature.java b/src/main/java/twilightforest/world/components/feature/trees/TFTreeFeature.java new file mode 100644 index 0000000000..78487c4cba --- /dev/null +++ b/src/main/java/twilightforest/world/components/feature/trees/TFTreeFeature.java @@ -0,0 +1,84 @@ +package twilightforest.world.components.feature.trees; + +import com.google.common.collect.Iterables; +import com.google.common.collect.Lists; +import com.google.common.collect.Sets; +import com.mojang.serialization.Codec; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Vec3i; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.feature.Feature; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; +import net.minecraft.world.level.levelgen.feature.TreeFeature; +import net.minecraft.world.level.levelgen.feature.configurations.TreeConfiguration; +import net.minecraft.world.level.levelgen.feature.treedecorators.TreeDecorator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; +import net.minecraft.world.phys.shapes.DiscreteVoxelShape; +import twilightforest.world.components.feature.config.TFTreeFeatureConfig; + +import java.util.Comparator; +import java.util.List; +import java.util.Random; +import java.util.Set; +import java.util.function.BiConsumer; + +public abstract class TFTreeFeature extends Feature { + public TFTreeFeature(Codec configIn) { + super(configIn); + } + + // [VanillaCopy] TreeFeature.place, swapped TreeConfiguration for generic . Omitted code are commented out instead of deleted + @Override + public final boolean place(FeaturePlaceContext context) { + WorldGenLevel worldgenlevel = context.level(); + RandomSource randomsource = context.random(); + BlockPos blockpos = context.origin(); + T treeconfiguration = context.config(); + Set set = Sets.newHashSet(); + Set set1 = Sets.newHashSet(); + Set set2 = Sets.newHashSet(); + Set set3 = Sets.newHashSet(); + BiConsumer biconsumer = (pos, state) -> { + set.add(pos.immutable()); + worldgenlevel.setBlock(pos, state, 19); + }; + BiConsumer biconsumer1 = (pos, state) -> { + set1.add(pos.immutable()); + worldgenlevel.setBlock(pos, state, 19); + }; + BiConsumer biconsumer2 = (pos, state) -> { + set2.add(pos.immutable()); + worldgenlevel.setBlock(pos, state, 19); + }; + BiConsumer biconsumer3 = (pos, state) -> { + set3.add(pos.immutable()); + worldgenlevel.setBlock(pos, state, 19); + }; + boolean flag = this.generate(worldgenlevel, randomsource, blockpos, biconsumer, biconsumer1, biconsumer2, treeconfiguration); + if (flag && (!set1.isEmpty() || !set2.isEmpty())) { + if (!treeconfiguration.decorators.isEmpty()) { + TreeDecorator.Context treedecorator$context = new TreeDecorator.Context(worldgenlevel, biconsumer3, randomsource, set1, set2, set); + treeconfiguration.decorators.forEach((p_225282_) -> { + p_225282_.place(treedecorator$context); + }); + } + + return BoundingBox.encapsulatingPositions(Iterables.concat(set, set1, set2, set3)).map((boundingBox) -> { + DiscreteVoxelShape discretevoxelshape = TreeFeature.updateLeaves(worldgenlevel, boundingBox, set1, set3, set); + StructureTemplate.updateShapeAtEdge(worldgenlevel, 3, discretevoxelshape, boundingBox.minX(), boundingBox.minY(), boundingBox.minZ()); + return true; + }).orElse(false); + } else { + return false; + } + } + + /** + * This works akin to the AbstractTreeFeature.generate, but put our branches and roots here + */ + protected abstract boolean generate(WorldGenLevel world, RandomSource random, BlockPos pos, BiConsumer trunkPlacer, BiConsumer leavesPlacer, BiConsumer decorationPlacer, T config); + +} diff --git a/src/main/java/twilightforest/world/components/feature/trees/TimeTreeFeature.java b/src/main/java/twilightforest/world/components/feature/trees/TimeTreeFeature.java new file mode 100644 index 0000000000..546a206c28 --- /dev/null +++ b/src/main/java/twilightforest/world/components/feature/trees/TimeTreeFeature.java @@ -0,0 +1,77 @@ +package twilightforest.world.components.feature.trees; + +import com.mojang.serialization.Codec; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.RotatedPillarBlock; +import net.minecraft.world.level.block.state.BlockState; +import twilightforest.init.TFBlocks; +import twilightforest.world.components.feature.config.TFTreeFeatureConfig; + +import java.util.function.BiConsumer; + +public class TimeTreeFeature extends HollowTreeFeature { + public TimeTreeFeature(Codec config) { + super(config); + } + + @Override + public boolean generate(WorldGenLevel world, RandomSource random, BlockPos pos, BiConsumer trunkPlacer, BiConsumer leavesPlacer, BiConsumer decorationPlacer, TFTreeFeatureConfig config) { + final int height = 8; + final int diameter = 1; + + // do we have enough height? + if (world.isOutsideBuildHeight(pos.getY() + 1) || world.isOutsideBuildHeight(pos.getY() + height + diameter)) { + return false; + } + + // check if we're on dirt or grass + BlockState state = world.getBlockState(pos.below()); + if (!state.getBlock().canSustainPlant(state, world, pos.below(), Direction.UP, TFBlocks.TIME_SAPLING.get())) { + return false; + } + + // Start with roots first, so they don't fail placement because they intersect the trunk shell first + // 3-5 roots at the bottom + buildBranchRing(world, trunkPlacer, leavesPlacer, random, pos, diameter, 1, 0, 12, 0.75D, 3, 5, 3, false, config); + + // several more taproots + buildBranchRing(world, trunkPlacer, leavesPlacer, random, pos, diameter, 1, 2, 18, 0.9D, 3, 5, 3, false, config); + + // make a tree! + + // build the trunk + buildTrunk(world, trunkPlacer, decorationPlacer, random, pos, diameter, height, config); + + // build the crown + buildTinyCrown(world, trunkPlacer, leavesPlacer, random, pos, diameter, height, config); + + // add clock block + world.setBlock(pos.offset(-1, 2, 0), TFBlocks.TIME_LOG_CORE.get().defaultBlockState().setValue(RotatedPillarBlock.AXIS, Direction.Axis.Y), 3); + + return true; + } + + /** + * Build the crown of the tree. This builds a smaller crown, since the large + * ones were causing some performance issues + */ + protected void buildTinyCrown(WorldGenLevel world, BiConsumer trunkPlacer, BiConsumer leavesPlacer, RandomSource random, BlockPos pos, int diameter, int height, TFTreeFeatureConfig config) { + final int crownRadius = 4; + final int bvar = 1; + + // 3-5 medium branches starting at the bottom of the crown + buildBranchRing(world, trunkPlacer, leavesPlacer, random, pos, diameter, height - crownRadius, 0, crownRadius, 0.35D, bvar, bvar + 2, 1, true, config); + + // 3-5 medium branches at the crown middle + buildBranchRing(world, trunkPlacer, leavesPlacer, random, pos, diameter, height - (crownRadius >> 1), 0, crownRadius, 0.28D, bvar, bvar + 2, 1, true, config); + + // 2-4 medium branches at the crown top + buildBranchRing(world, trunkPlacer, leavesPlacer, random, pos, diameter, height, 0, crownRadius, 0.15D, 2, 4, 0, true, config); + + // 3-6 medium branches going straight up + buildBranchRing(world, trunkPlacer, leavesPlacer, random, pos, diameter, height, 0, crownRadius >> 1, 0.05D, bvar, bvar + 2, 0, true, config); + } +} diff --git a/src/main/java/twilightforest/world/components/feature/trees/growers/CanopyTreeGrower.java b/src/main/java/twilightforest/world/components/feature/trees/growers/CanopyTreeGrower.java new file mode 100644 index 0000000000..30303f6d21 --- /dev/null +++ b/src/main/java/twilightforest/world/components/feature/trees/growers/CanopyTreeGrower.java @@ -0,0 +1,18 @@ +package twilightforest.world.components.feature.trees.growers; + +import net.minecraft.resources.ResourceKey; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.block.grower.AbstractTreeGrower; +import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; +import org.jetbrains.annotations.Nullable; +import twilightforest.init.TFConfiguredFeatures; + +public class CanopyTreeGrower extends AbstractTreeGrower { + + @Nullable + @Override + protected ResourceKey> getConfiguredFeature(RandomSource random, boolean makeBees) { + return TFConfiguredFeatures.CANOPY_TREE; + } + +} diff --git a/src/main/java/twilightforest/world/components/feature/trees/growers/DarkCanopyTreeGrower.java b/src/main/java/twilightforest/world/components/feature/trees/growers/DarkCanopyTreeGrower.java new file mode 100644 index 0000000000..c8e076b1fb --- /dev/null +++ b/src/main/java/twilightforest/world/components/feature/trees/growers/DarkCanopyTreeGrower.java @@ -0,0 +1,17 @@ +package twilightforest.world.components.feature.trees.growers; + +import net.minecraft.resources.ResourceKey; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.block.grower.AbstractTreeGrower; +import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; +import org.jetbrains.annotations.Nullable; +import twilightforest.init.TFConfiguredFeatures; + +public class DarkCanopyTreeGrower extends AbstractTreeGrower { + + @Nullable + @Override + protected ResourceKey> getConfiguredFeature(RandomSource random, boolean makeBees) { + return TFConfiguredFeatures.HOMEGROWN_DARKWOOD_TREE; + } +} diff --git a/src/main/java/twilightforest/world/components/feature/trees/growers/HollowTreeGrower.java b/src/main/java/twilightforest/world/components/feature/trees/growers/HollowTreeGrower.java new file mode 100644 index 0000000000..7a80b6ccac --- /dev/null +++ b/src/main/java/twilightforest/world/components/feature/trees/growers/HollowTreeGrower.java @@ -0,0 +1,17 @@ +package twilightforest.world.components.feature.trees.growers; + +import net.minecraft.resources.ResourceKey; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.block.grower.AbstractTreeGrower; +import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; +import org.jetbrains.annotations.Nullable; +import twilightforest.init.TFConfiguredFeatures; + +public class HollowTreeGrower extends AbstractTreeGrower { + + @Nullable + @Override + protected ResourceKey> getConfiguredFeature(RandomSource random, boolean makeBees) { + return TFConfiguredFeatures.HOLLOW_TREE; + } +} diff --git a/src/main/java/twilightforest/world/components/feature/trees/growers/MangroveTreeGrower.java b/src/main/java/twilightforest/world/components/feature/trees/growers/MangroveTreeGrower.java new file mode 100644 index 0000000000..a8b36e5667 --- /dev/null +++ b/src/main/java/twilightforest/world/components/feature/trees/growers/MangroveTreeGrower.java @@ -0,0 +1,18 @@ +package twilightforest.world.components.feature.trees.growers; + +import net.minecraft.core.Holder; +import net.minecraft.resources.ResourceKey; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.block.grower.AbstractTreeGrower; +import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; +import org.jetbrains.annotations.Nullable; +import twilightforest.init.TFConfiguredFeatures; + +public class MangroveTreeGrower extends AbstractTreeGrower { + + @Nullable + @Override + protected ResourceKey> getConfiguredFeature(RandomSource random, boolean makeBees) { + return TFConfiguredFeatures.MANGROVE_TREE; + } +} diff --git a/src/main/java/twilightforest/world/components/feature/trees/growers/MiningTreeGrower.java b/src/main/java/twilightforest/world/components/feature/trees/growers/MiningTreeGrower.java new file mode 100644 index 0000000000..dd78a2f78a --- /dev/null +++ b/src/main/java/twilightforest/world/components/feature/trees/growers/MiningTreeGrower.java @@ -0,0 +1,18 @@ +package twilightforest.world.components.feature.trees.growers; + +import net.minecraft.core.Holder; +import net.minecraft.resources.ResourceKey; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.block.grower.AbstractTreeGrower; +import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; +import org.jetbrains.annotations.Nullable; +import twilightforest.init.TFConfiguredFeatures; + +public class MiningTreeGrower extends AbstractTreeGrower { + + @Nullable + @Override + protected ResourceKey> getConfiguredFeature(RandomSource random, boolean makeBees) { + return TFConfiguredFeatures.MINING_TREE; + } +} diff --git a/src/main/java/twilightforest/world/components/feature/trees/growers/RainboakTreeGrower.java b/src/main/java/twilightforest/world/components/feature/trees/growers/RainboakTreeGrower.java new file mode 100644 index 0000000000..f6117cb760 --- /dev/null +++ b/src/main/java/twilightforest/world/components/feature/trees/growers/RainboakTreeGrower.java @@ -0,0 +1,17 @@ +package twilightforest.world.components.feature.trees.growers; + +import net.minecraft.resources.ResourceKey; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.block.grower.AbstractTreeGrower; +import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; +import org.jetbrains.annotations.Nullable; +import twilightforest.init.TFConfiguredFeatures; + +public class RainboakTreeGrower extends AbstractTreeGrower { + + @Nullable + @Override + protected ResourceKey> getConfiguredFeature(RandomSource random, boolean makeBees) { + return random.nextInt(10) == 0 ? TFConfiguredFeatures.LARGE_RAINBOW_OAK_TREE : TFConfiguredFeatures.RAINBOW_OAK_TREE; + } +} diff --git a/src/main/java/twilightforest/world/components/feature/trees/growers/SmallOakTreeGrower.java b/src/main/java/twilightforest/world/components/feature/trees/growers/SmallOakTreeGrower.java new file mode 100644 index 0000000000..620d74c88b --- /dev/null +++ b/src/main/java/twilightforest/world/components/feature/trees/growers/SmallOakTreeGrower.java @@ -0,0 +1,23 @@ +package twilightforest.world.components.feature.trees.growers; + +import net.minecraft.resources.ResourceKey; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.block.grower.AbstractMegaTreeGrower; +import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; +import org.jetbrains.annotations.Nullable; +import twilightforest.init.TFConfiguredFeatures; + +public class SmallOakTreeGrower extends AbstractMegaTreeGrower { + + @Nullable + @Override + protected ResourceKey> getConfiguredFeature(RandomSource random, boolean makeBees) { + return random.nextInt(10) == 0 ? TFConfiguredFeatures.LARGE_TWILIGHT_OAK_TREE : TFConfiguredFeatures.TWILIGHT_OAK_TREE; + } + + @Nullable + @Override + protected ResourceKey> getConfiguredMegaFeature(RandomSource random) { + return random.nextInt(3) == 2 ? TFConfiguredFeatures.SAVANNAH_CANOPY_OAK_TREE : TFConfiguredFeatures.FOREST_CANOPY_OAK_TREE; + } +} diff --git a/src/main/java/twilightforest/world/components/feature/trees/growers/SortingTreeGrower.java b/src/main/java/twilightforest/world/components/feature/trees/growers/SortingTreeGrower.java new file mode 100644 index 0000000000..51ec85e377 --- /dev/null +++ b/src/main/java/twilightforest/world/components/feature/trees/growers/SortingTreeGrower.java @@ -0,0 +1,17 @@ +package twilightforest.world.components.feature.trees.growers; + +import net.minecraft.resources.ResourceKey; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.block.grower.AbstractTreeGrower; +import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; +import org.jetbrains.annotations.Nullable; +import twilightforest.init.TFConfiguredFeatures; + +public class SortingTreeGrower extends AbstractTreeGrower { + + @Nullable + @Override + public ResourceKey> getConfiguredFeature(RandomSource rand, boolean makeBees) { + return TFConfiguredFeatures.SORTING_TREE; + } +} diff --git a/src/main/java/twilightforest/world/components/feature/trees/growers/TimeTreeGrower.java b/src/main/java/twilightforest/world/components/feature/trees/growers/TimeTreeGrower.java new file mode 100644 index 0000000000..3ba446c246 --- /dev/null +++ b/src/main/java/twilightforest/world/components/feature/trees/growers/TimeTreeGrower.java @@ -0,0 +1,17 @@ +package twilightforest.world.components.feature.trees.growers; + +import net.minecraft.resources.ResourceKey; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.block.grower.AbstractTreeGrower; +import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; +import org.jetbrains.annotations.Nullable; +import twilightforest.init.TFConfiguredFeatures; + +public class TimeTreeGrower extends AbstractTreeGrower { + + @Nullable + @Override + protected ResourceKey> getConfiguredFeature(RandomSource random, boolean makeBees) { + return TFConfiguredFeatures.TIME_TREE; + } +} diff --git a/src/main/java/twilightforest/world/components/feature/trees/growers/TransformationTreeGrower.java b/src/main/java/twilightforest/world/components/feature/trees/growers/TransformationTreeGrower.java new file mode 100644 index 0000000000..dfb6e3a0d9 --- /dev/null +++ b/src/main/java/twilightforest/world/components/feature/trees/growers/TransformationTreeGrower.java @@ -0,0 +1,17 @@ +package twilightforest.world.components.feature.trees.growers; + +import net.minecraft.resources.ResourceKey; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.block.grower.AbstractTreeGrower; +import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; +import org.jetbrains.annotations.Nullable; +import twilightforest.init.TFConfiguredFeatures; + +public class TransformationTreeGrower extends AbstractTreeGrower { + + @Nullable + @Override + public ResourceKey> getConfiguredFeature(RandomSource rand, boolean makeBees) { + return TFConfiguredFeatures.TRANSFORMATION_TREE; + } +} diff --git a/src/main/java/twilightforest/world/components/feature/trees/growers/package-info.java b/src/main/java/twilightforest/world/components/feature/trees/growers/package-info.java new file mode 100644 index 0000000000..d453929141 --- /dev/null +++ b/src/main/java/twilightforest/world/components/feature/trees/growers/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.world.components.feature.trees.growers; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/world/components/feature/trees/package-info.java b/src/main/java/twilightforest/world/components/feature/trees/package-info.java new file mode 100644 index 0000000000..bf2e1a10b8 --- /dev/null +++ b/src/main/java/twilightforest/world/components/feature/trees/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.world.components.feature.trees; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/world/components/feature/trees/treeplacers/BranchesConfig.java b/src/main/java/twilightforest/world/components/feature/trees/treeplacers/BranchesConfig.java new file mode 100644 index 0000000000..1bc6b953b4 --- /dev/null +++ b/src/main/java/twilightforest/world/components/feature/trees/treeplacers/BranchesConfig.java @@ -0,0 +1,68 @@ +package twilightforest.world.components.feature.trees.treeplacers; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; + +public final class BranchesConfig { + public static final Codec CODEC = RecordCodecBuilder.create(instance -> + instance.group( + Codec.intRange(0, 16).fieldOf("count_minimum").forGetter(o -> o.branchCount), + Codec.intRange(0, 16).fieldOf("random_add_count").orElse(0).forGetter(o -> o.randomAddBranches), + Codec.doubleRange(1, 24).fieldOf("length").forGetter(o -> o.length), + Codec.doubleRange(0, 16).fieldOf("random_add_length").orElse(0d).forGetter(o -> o.randomAddLength), + // Yaw - Float between 0 and 1 for the angle, where 0 is 0 degrees, .5 is 180 degrees and 1 and 360 degrees. + Codec.doubleRange(0, 0.5).fieldOf("spacing_yaw").orElse(0.3d).forGetter(o -> o.spacingYaw), + // Tilt - Float between 0 and 1 where 0 is straight up, 0.5 is straight out and 1 is straight down. + Codec.doubleRange(0, 1).fieldOf("downwards_pitch").orElse(0.2d).forGetter(o -> o.downwardsPitch) + ).apply(instance, BranchesConfig::new) + ); + + public final int branchCount; + public final int randomAddBranches; + public final double length; + public final double randomAddLength; + public final double spacingYaw; + public final double downwardsPitch; + + public BranchesConfig(int branchCount, int randomAddBranches, double length, double randomAddLength, double spacingYaw, double downwardsPitch) { + this.branchCount = branchCount; + this.randomAddBranches = randomAddBranches; + this.length = length; + this.randomAddLength = randomAddLength; + this.spacingYaw = spacingYaw; + this.downwardsPitch = downwardsPitch; + } + + public BranchesConfig(int branchCount, double length) { + this.branchCount = branchCount; + this.randomAddBranches = 0; + this.length = length; + this.randomAddLength = 0d; + this.spacingYaw = 0.3d; + this.downwardsPitch = 0.2d; + } + + /*public int getBranchCount() { + return branchCount; + } + + public int getRandomAddBranches() { + return randomAddBranches;//.orElse(0); + } + + public double getLength() { + return length; + } + + public double getRandomAddLength() { + return randomAddLength;//.orElse(0d); + } + + public double getBranchRadians() { + return branchRadians;//.orElse(0.3d); + } + + public double getBranchPitch() { + return branchPitch;//.orElse(0.2d); + }*/ +} diff --git a/src/main/java/twilightforest/world/components/feature/trees/treeplacers/BranchingTrunkPlacer.java b/src/main/java/twilightforest/world/components/feature/trees/treeplacers/BranchingTrunkPlacer.java new file mode 100644 index 0000000000..04fd7db333 --- /dev/null +++ b/src/main/java/twilightforest/world/components/feature/trees/treeplacers/BranchingTrunkPlacer.java @@ -0,0 +1,101 @@ +package twilightforest.world.components.feature.trees.treeplacers; + +import com.google.common.collect.Lists; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.BlockPos; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.LevelSimulatedReader; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.feature.configurations.TreeConfiguration; +import net.minecraft.world.level.levelgen.feature.foliageplacers.FoliagePlacer; +import net.minecraft.world.level.levelgen.feature.trunkplacers.TrunkPlacer; +import net.minecraft.world.level.levelgen.feature.trunkplacers.TrunkPlacerType; +import twilightforest.util.FeatureLogic; +import twilightforest.util.VoxelBresenhamIterator; +import twilightforest.init.TFFeatureModifiers; + +import java.util.List; +import java.util.function.BiConsumer; + +public class BranchingTrunkPlacer extends TrunkPlacer { + public static final Codec CODEC = RecordCodecBuilder.create(instance -> + trunkPlacerParts(instance).and(instance.group( + Codec.intRange(0, 24).fieldOf("branch_start_offset_down").forGetter(o -> o.branchDownwardOffset), + BranchesConfig.CODEC.fieldOf("branch_config").forGetter(o -> o.branchesConfig), + Codec.BOOL.fieldOf("perpendicular_branches").forGetter(o -> o.perpendicularBranches) + )).apply(instance, BranchingTrunkPlacer::new) + ); + + private final int branchDownwardOffset; + private final BranchesConfig branchesConfig; + private final boolean perpendicularBranches; + + public BranchingTrunkPlacer(int baseHeight, int randomHeightA, int randomHeightB, int branchDownwardOffset, BranchesConfig branchesConfig, boolean perpendicularBranches) { + super(baseHeight, randomHeightA, randomHeightB); + this.branchDownwardOffset = branchDownwardOffset; + this.branchesConfig = branchesConfig; + this.perpendicularBranches = perpendicularBranches; + } + + @Override + protected TrunkPlacerType type() { + return TFFeatureModifiers.TRUNK_BRANCHING.get(); + } + + @Override + public List placeTrunk(LevelSimulatedReader worldReader, BiConsumer worldPlacer, RandomSource random, int height, BlockPos startPos, TreeConfiguration treeConfig) { + List leafAttachments = Lists.newArrayList(); + + for (int y = 0; y <= height; y++) { // Keep building upwards until we cannot, and then adjust height if we run into something + if (!placeLog(worldReader, worldPlacer, random, startPos.above(y), treeConfig)) { + height = y; + break; + } + } + + leafAttachments.add(new FoliagePlacer.FoliageAttachment(startPos.above(height), 0, false)); + + int numBranches = this.branchesConfig.branchCount + random.nextInt(this.branchesConfig.randomAddBranches + 1); + float offset = random.nextFloat(); + for (int b = 0; b < numBranches; b++) { + buildBranch(worldReader, worldPlacer, startPos, leafAttachments, height - this.branchDownwardOffset + b, this.branchesConfig.length, this.branchesConfig.spacingYaw * b + offset, this.branchesConfig.downwardsPitch, random, treeConfig, this.perpendicularBranches); + } + + return leafAttachments; + } + + private void buildBranch(LevelSimulatedReader worldReader, BiConsumer worldPlacer, BlockPos pos, List leafBlocks, int height, double length, double angle, double tilt, RandomSource treeRNG, TreeConfiguration treeConfig, boolean perpendicularBranches) { + BlockPos src = pos.above(height); + BlockPos dest = FeatureLogic.translate(src, length, angle, tilt); + + if (perpendicularBranches) { + drawBresenhamBranch(worldReader, worldPlacer, treeRNG, src, new BlockPos(dest.getX(), src.getY(), dest.getZ()), treeConfig); + + int max = Math.max(src.getY(), dest.getY()); + + for (int i = Math.min(src.getY(), dest.getY()); i < max + 1; i++) { + placeLog(worldReader, worldPlacer, treeRNG, new BlockPos(dest.getX(), i, dest.getZ()), treeConfig); + } + } else { + drawBresenhamBranch(worldReader, worldPlacer, treeRNG, src, dest, treeConfig); + } + + placeLog(worldReader, worldPlacer, treeRNG, dest.east(), treeConfig); + placeLog(worldReader, worldPlacer, treeRNG, dest.west(), treeConfig); + placeLog(worldReader, worldPlacer, treeRNG, dest.south(), treeConfig); + placeLog(worldReader, worldPlacer, treeRNG, dest.north(), treeConfig); + + leafBlocks.add(new FoliagePlacer.FoliageAttachment(dest, 0, false)); + } + + /** + * Draws a line from {x1, y1, z1} to {x2, y2, z2} + * This takes all variables for setting Branch + */ + private void drawBresenhamBranch(LevelSimulatedReader worldReader, BiConsumer worldPlacer, RandomSource random, BlockPos from, BlockPos to, TreeConfiguration config) { + for (BlockPos pixel : new VoxelBresenhamIterator(from, to)) { + placeLog(worldReader, worldPlacer, random, pixel, config); + } + } +} diff --git a/src/main/java/twilightforest/world/components/feature/trees/treeplacers/DangleFromTreeDecorator.java b/src/main/java/twilightforest/world/components/feature/trees/treeplacers/DangleFromTreeDecorator.java new file mode 100644 index 0000000000..4e1cb6be20 --- /dev/null +++ b/src/main/java/twilightforest/world/components/feature/trees/treeplacers/DangleFromTreeDecorator.java @@ -0,0 +1,101 @@ +package twilightforest.world.components.feature.trees.treeplacers; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.feature.stateproviders.WeightedStateProvider; +import net.minecraft.world.level.levelgen.feature.treedecorators.TreeDecorator; +import net.minecraft.world.level.levelgen.feature.treedecorators.TreeDecoratorType; +import twilightforest.init.TFFeatureModifiers; + +public class DangleFromTreeDecorator extends TreeDecorator { + public static final Codec CODEC = RecordCodecBuilder.create( + instance -> instance.group( + Codec.intRange(0, 32).fieldOf("attempts_minimum").forGetter(o -> o.count), + Codec.intRange(0, 32).fieldOf("random_add_attempts").orElse(0).forGetter(o -> o.randomAddCount), + Codec.intRange(1, 24).fieldOf("minimum_required_length").forGetter(o -> o.minimumRequiredLength), + Codec.intRange(1, 24).fieldOf("base_length").forGetter(o -> o.baseLength), + Codec.intRange(0, 16).fieldOf("random_add_length").orElse(0).forGetter(o -> o.randomAddLength), + WeightedStateProvider.CODEC.fieldOf("rope_provider").forGetter(o -> o.rope), + WeightedStateProvider.CODEC.fieldOf("baggage_provider").forGetter(o -> o.baggage) + ).apply(instance, DangleFromTreeDecorator::new) + ); + private final int count; + private final int randomAddCount; + private final int minimumRequiredLength; + private final int baseLength; + private final int randomAddLength; + private final WeightedStateProvider rope; + private final WeightedStateProvider baggage; + + public DangleFromTreeDecorator(int count, int randomAddCount, int minimumRequiredLength, int baseLength, int randomAddLength, WeightedStateProvider rope, WeightedStateProvider baggage) { + this.count = count; + this.randomAddCount = randomAddCount; + this.minimumRequiredLength = minimumRequiredLength; + this.baseLength = baseLength; + this.randomAddLength = randomAddLength; + this.rope = rope; + this.baggage = baggage; + } + + @Override + protected TreeDecoratorType type() { + return TFFeatureModifiers.DANGLING_DECORATOR.get(); + } + + @Override + public void place(Context context) { + if (context.leaves().isEmpty()) + return; + + int totalTries = this.count + context.random().nextInt(this.randomAddCount + 1); + int leafTotal = context.leaves().size(); + boolean clearedOfPossibleLeaves; + boolean isAir; + int cordLength; + BlockPos pos; + + totalTries = Math.min(totalTries, leafTotal); + + for (int attempt = 0; attempt < totalTries; attempt++) { + clearedOfPossibleLeaves = false; + pos = context.leaves().get(context.random().nextInt(leafTotal)); + + //dont place a rope where the trunk is + if (pos.getX() == context.logs().get(0).getY() && pos.getZ() == context.logs().get(0).getZ()) return; + + cordLength = this.baseLength + context.random().nextInt(this.randomAddLength + 1); + + // Scan to make sure we have + for (int ropeUnrolling = 1; ropeUnrolling <= cordLength; ropeUnrolling++) { + isAir = context.level().isStateAtPosition(pos.below(ropeUnrolling), BlockBehaviour.BlockStateBase::isAir); + + if (!clearedOfPossibleLeaves && isAir) + clearedOfPossibleLeaves = true; + + if (clearedOfPossibleLeaves && !isAir) { + cordLength = ropeUnrolling; + + break; + } + } + + if (cordLength > this.minimumRequiredLength) { // We don't want no pathetic unroped baggage + BlockState rope = this.rope.getState(context.random(), pos); + for (int ropeUnrolling = 1; ropeUnrolling < cordLength; ropeUnrolling++) { + pos = pos.below(1); + + if (context.level().isStateAtPosition(pos, BlockBehaviour.BlockStateBase::isAir)) + context.setBlock(pos, rope); + } + + pos = pos.below(1); + + if (context.isAir(pos)) + context.setBlock(pos, this.baggage.getState(context.random(), pos)); + } + } + } +} diff --git a/src/main/java/twilightforest/world/components/feature/trees/treeplacers/LeafSpheroidFoliagePlacer.java b/src/main/java/twilightforest/world/components/feature/trees/treeplacers/LeafSpheroidFoliagePlacer.java new file mode 100644 index 0000000000..3e92364ef7 --- /dev/null +++ b/src/main/java/twilightforest/world/components/feature/trees/treeplacers/LeafSpheroidFoliagePlacer.java @@ -0,0 +1,99 @@ +package twilightforest.world.components.feature.trees.treeplacers; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.BlockPos; +import net.minecraft.util.Mth; +import net.minecraft.util.RandomSource; +import net.minecraft.util.valueproviders.ConstantInt; +import net.minecraft.util.valueproviders.IntProvider; +import net.minecraft.world.level.LevelSimulatedReader; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.feature.configurations.TreeConfiguration; +import net.minecraft.world.level.levelgen.feature.foliageplacers.FoliagePlacer; +import net.minecraft.world.level.levelgen.feature.foliageplacers.FoliagePlacerType; +import net.minecraft.world.level.levelgen.feature.stateproviders.BlockStateProvider; +import twilightforest.util.FeaturePlacers; +import twilightforest.init.TFFeatureModifiers; + +import java.util.function.BiConsumer; + +public class LeafSpheroidFoliagePlacer extends FoliagePlacer { + public static final Codec CODEC = RecordCodecBuilder.create( + instance -> instance.group( + Codec.floatRange(0, 16f).fieldOf("horizontal_radius").forGetter(o -> o.horizontalRadius), + Codec.floatRange(0, 16f).fieldOf("vertical_radius").forGetter(o -> o.verticalRadius), + IntProvider.codec(0, 8).fieldOf("offset").forGetter(obj -> obj.offset), + Codec.intRange(0, 16).fieldOf("random_add_horizontal").orElse(0).forGetter(o -> o.randomHorizontal), + Codec.intRange(0, 16).fieldOf("random_add_vertical").orElse(0).forGetter(o -> o.randomVertical), + Codec.floatRange(-0.5f, 0.5f).fieldOf("vertical_filler_bias").orElse(0f).forGetter(o -> o.verticalBias), + Codec.intRange(0, 256).fieldOf("shag_factor").orElse(0).forGetter(o -> o.shag_factor) // Shhh + ).apply(instance, LeafSpheroidFoliagePlacer::new) + ); + + // These two variables are floats to help round out the pixel-snapping of the sphere-filling algorithm + // n+0.5 numbers seem to work best but messing with it is encouraged to find best results + private final float horizontalRadius; + private final float verticalRadius; + private final float verticalBias; + + private final int randomHorizontal; + private final int randomVertical; + private final int shag_factor; + + public static final LeafSpheroidFoliagePlacer NO_OP = new LeafSpheroidFoliagePlacer(0, 0, ConstantInt.of(0), 0, 0, 0.0F, 0); + + public LeafSpheroidFoliagePlacer(float horizontalRadius, float verticalRadius, IntProvider yOffset, int randomHorizontal, int randomVertical, float verticalBias, int shag_factor) { + super(ConstantInt.of((int) horizontalRadius), yOffset); + + this.horizontalRadius = horizontalRadius; + this.verticalRadius = verticalRadius; + this.randomHorizontal = randomHorizontal; + this.randomVertical = randomVertical; + this.verticalBias = verticalBias; + this.shag_factor = shag_factor; + } + + @Override + protected FoliagePlacerType type() { + return TFFeatureModifiers.FOLIAGE_SPHEROID.get(); + } + + @Override + protected void createFoliage(LevelSimulatedReader worldReader, FoliageSetter setter, RandomSource random, TreeConfiguration baseTreeFeatureConfig, int trunkHeight, FoliageAttachment foliage, int foliageHeight, int radius, int offset) { + BlockPos center = foliage.pos().above(offset); // foliage.getCenter + + FeaturePlacers.placeSpheroid(worldReader, setter, FeaturePlacers.VALID_TREE_POS, random, center, foliage.radiusOffset() + this.horizontalRadius + random.nextInt(this.randomHorizontal + 1), foliage.radiusOffset() + this.verticalRadius + random.nextInt(this.randomVertical + 1), this.verticalBias, baseTreeFeatureConfig.foliageProvider); + + if (this.shag_factor > 0) { + for (int i = 0; i < this.shag_factor; i++) { + float randomYaw = random.nextFloat() * Mth.TWO_PI; + float randomPitch = random.nextFloat() * 2f - 1f; //random.nextFloat() * 0.75f + 0.25f; + float yUnit = Mth.sqrt(1 - randomPitch * randomPitch); // Inverse Trigonometry identity (sin(arcos(t)) == sqrt(1 - t*t)) + float xCircleOffset = yUnit * Mth.cos(randomYaw) * (this.horizontalRadius - 1f); // We do radius minus 1 here so the leaf 2x2 generates overlapping the existing foilage + float zCircleOffset = yUnit * Mth.sin(randomYaw) * (this.horizontalRadius - 1f); // instead of making awkward 2x2 pieces of foilage jutting out + + BlockPos placement = center.offset((int) (xCircleOffset + ((int) xCircleOffset >> 31)), (int) (randomPitch * (this.verticalRadius + 0.25f) + this.verticalBias), (int) (zCircleOffset + ((int) zCircleOffset >> 31))); + + placeLeafCluster(worldReader, setter, random, placement.immutable(), baseTreeFeatureConfig.foliageProvider); + } + } + } + + private static void placeLeafCluster(LevelSimulatedReader worldReader, FoliageSetter setter, RandomSource random, BlockPos pos, BlockStateProvider state) { + FeaturePlacers.placeLeaf(worldReader, setter, FeaturePlacers.VALID_TREE_POS, pos, state, random); + FeaturePlacers.placeLeaf(worldReader, setter, FeaturePlacers.VALID_TREE_POS, pos.east(), state, random); + FeaturePlacers.placeLeaf(worldReader, setter, FeaturePlacers.VALID_TREE_POS, pos.south(), state, random); + FeaturePlacers.placeLeaf(worldReader, setter, FeaturePlacers.VALID_TREE_POS, pos.offset(1, 0, 1), state, random); + } + + @Override // foliage Height + public int foliageHeight(RandomSource random, int i, TreeConfiguration baseTreeFeatureConfig) { + return 0; + } + + @Override + protected boolean shouldSkipLocation(RandomSource random, int i, int i1, int i2, int i3, boolean b) { + return false; + } +} diff --git a/src/main/java/twilightforest/world/components/feature/trees/treeplacers/TreeCorePlacer.java b/src/main/java/twilightforest/world/components/feature/trees/treeplacers/TreeCorePlacer.java new file mode 100644 index 0000000000..11c7e87ad9 --- /dev/null +++ b/src/main/java/twilightforest/world/components/feature/trees/treeplacers/TreeCorePlacer.java @@ -0,0 +1,37 @@ +package twilightforest.world.components.feature.trees.treeplacers; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.levelgen.feature.stateproviders.BlockStateProvider; +import net.minecraft.world.level.levelgen.feature.treedecorators.TreeDecorator; +import net.minecraft.world.level.levelgen.feature.treedecorators.TreeDecoratorType; +import twilightforest.init.TFFeatureModifiers; + +public class TreeCorePlacer extends TreeDecorator { + + public static final Codec CODEC = RecordCodecBuilder.create( + instance -> instance.group( + Codec.intRange(0, 20).fieldOf("core_position").forGetter(o -> o.corePos), + BlockStateProvider.CODEC.fieldOf("deco_provider").forGetter(o -> o.core) + ).apply(instance, TreeCorePlacer::new)); + + private final int corePos; + private final BlockStateProvider core; + + public TreeCorePlacer(int corePos, BlockStateProvider core) { + this.corePos = corePos; + this.core = core; + } + + @Override + protected TreeDecoratorType type() { + return TFFeatureModifiers.CORE_PLACER.get(); + } + + @Override + public void place(Context context) { + BlockPos pos = context.logs().get(0).offset(0, this.corePos, 0); + context.setBlock(pos, this.core.getState(context.random(), pos)); + } +} diff --git a/src/main/java/twilightforest/world/components/feature/trees/treeplacers/TreeRootsDecorator.java b/src/main/java/twilightforest/world/components/feature/trees/treeplacers/TreeRootsDecorator.java new file mode 100644 index 0000000000..b23ef03be9 --- /dev/null +++ b/src/main/java/twilightforest/world/components/feature/trees/treeplacers/TreeRootsDecorator.java @@ -0,0 +1,99 @@ +package twilightforest.world.components.feature.trees.treeplacers; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.levelgen.feature.stateproviders.BlockStateProvider; +import net.minecraft.world.level.levelgen.feature.stateproviders.SimpleStateProvider; +import net.minecraft.world.level.levelgen.feature.treedecorators.TreeDecorator; +import net.minecraft.world.level.levelgen.feature.treedecorators.TreeDecoratorType; +import twilightforest.util.FeatureLogic; +import twilightforest.util.FeaturePlacers; +import twilightforest.util.VoxelBresenhamIterator; +import twilightforest.init.TFFeatureModifiers; + +import java.util.Optional; + +public class TreeRootsDecorator extends TreeDecorator { + private static final SimpleStateProvider EMPTY = BlockStateProvider.simple(Blocks.AIR.defaultBlockState()); + + public static final Codec CODEC = RecordCodecBuilder.create( + instance -> instance.group( + Codec.intRange(0, 16).fieldOf("base_strand_count").forGetter(o -> o.strands), + Codec.intRange(0, 16).fieldOf("additional_random_strands").forGetter(o -> o.addExtraStrands), + Codec.intRange(0, 32).fieldOf("root_length").forGetter(o -> o.length), + BlockStateProvider.CODEC.optionalFieldOf("exposed_roots_provider").forGetter(o -> Optional.ofNullable(o.surfaceBlock != EMPTY ? o.surfaceBlock : null)), + BlockStateProvider.CODEC.fieldOf("ground_roots_provider").forGetter(o -> o.rootBlock) + ).apply(instance, TreeRootsDecorator::new) + ); + + private final int strands; + private final int addExtraStrands; + private final int length; + private final BlockStateProvider surfaceBlock; + private final BlockStateProvider rootBlock; + + private final boolean hasSurfaceRoots; + + private TreeRootsDecorator(int count, int addExtraStrands, int length, Optional surfaceBlock, BlockStateProvider rootBlock) { + this.strands = count; + this.addExtraStrands = addExtraStrands; + this.length = length; + this.rootBlock = rootBlock; + this.hasSurfaceRoots = surfaceBlock.isPresent(); + + if (this.hasSurfaceRoots) { + this.surfaceBlock = surfaceBlock.get(); + } else { + this.surfaceBlock = EMPTY; + } + } + + public TreeRootsDecorator(int count, int addExtraStrands, int length, BlockStateProvider rootBlock) { + this.strands = count; + this.addExtraStrands = addExtraStrands; + this.length = length; + this.rootBlock = rootBlock; + this.hasSurfaceRoots = false; + this.surfaceBlock = EMPTY; + } + + public TreeRootsDecorator(int count, int addExtraStrands, int length, BlockStateProvider surfaceBlock, BlockStateProvider rootBlock) { + this.strands = count; + this.addExtraStrands = addExtraStrands; + this.length = length; + this.rootBlock = rootBlock; + this.hasSurfaceRoots = true; + this.surfaceBlock = surfaceBlock; + } + + @Override + protected TreeDecoratorType type() { + return TFFeatureModifiers.TREE_ROOTS.get(); + } + + @Override + public void place(Context context) { + if (context.logs().isEmpty()) + return; + + int numBranches = this.strands + context.random().nextInt(this.addExtraStrands + 1); + float offset = context.random().nextFloat(); + BlockPos startPos = context.logs().get(0); + + if (this.hasSurfaceRoots) { + for (int i = 0; i < numBranches; i++) { + BlockPos dest = FeatureLogic.translate(startPos.below(i + 2), this.length, 0.3 * i + (double) offset, 0.8); + + FeaturePlacers.traceExposedRoot(context.level(), context.decorationSetter, context.random(), this.surfaceBlock, this.rootBlock, new VoxelBresenhamIterator(startPos.below(), dest)); + } + } else { + for (int i = 0; i < numBranches; i++) { + BlockPos dest = FeatureLogic.translate(startPos.below(i + 2), this.length, 0.3 * i + (double) offset, 0.8); + + FeaturePlacers.traceRoot(context.level(), context.decorationSetter, context.random(), this.rootBlock, new VoxelBresenhamIterator(startPos.below(), dest)); + } + } + } +} diff --git a/src/main/java/twilightforest/world/components/feature/trees/treeplacers/TrunkRiser.java b/src/main/java/twilightforest/world/components/feature/trees/treeplacers/TrunkRiser.java new file mode 100644 index 0000000000..53433add33 --- /dev/null +++ b/src/main/java/twilightforest/world/components/feature/trees/treeplacers/TrunkRiser.java @@ -0,0 +1,45 @@ +package twilightforest.world.components.feature.trees.treeplacers; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.BlockPos; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.LevelSimulatedReader; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.feature.configurations.TreeConfiguration; +import net.minecraft.world.level.levelgen.feature.foliageplacers.FoliagePlacer; +import net.minecraft.world.level.levelgen.feature.trunkplacers.TrunkPlacer; +import net.minecraft.world.level.levelgen.feature.trunkplacers.TrunkPlacerType; +import twilightforest.init.TFFeatureModifiers; + +import java.util.List; +import java.util.function.BiConsumer; + +public class TrunkRiser extends TrunkPlacer { + public static final Codec CODEC = RecordCodecBuilder.create(instance -> + instance.group( + Codec.intRange(0, 16).fieldOf("offset_up").forGetter(o -> o.offset), + TrunkPlacer.CODEC.fieldOf("trunk_placer").forGetter(o -> o.placer) + ).apply(instance, TrunkRiser::new) + ); + + private final int offset; + private final TrunkPlacer placer; + + public TrunkRiser(int baseHeight, TrunkPlacer placer) { + super(placer.baseHeight, placer.heightRandA, placer.heightRandB); + + this.offset = baseHeight; + this.placer = placer; + } + + @Override + protected TrunkPlacerType type() { + return TFFeatureModifiers.TRUNK_RISER.get(); + } + + @Override + public List placeTrunk(LevelSimulatedReader worldReader, BiConsumer worldPlacer, RandomSource random, int height, BlockPos startPos, TreeConfiguration treeConfig) { + return this.placer.placeTrunk(worldReader, worldPlacer, random, height, startPos.above(this.offset), treeConfig); + } +} diff --git a/src/main/java/twilightforest/world/components/feature/trees/treeplacers/TrunkSideDecorator.java b/src/main/java/twilightforest/world/components/feature/trees/treeplacers/TrunkSideDecorator.java new file mode 100644 index 0000000000..2e9deacd2b --- /dev/null +++ b/src/main/java/twilightforest/world/components/feature/trees/treeplacers/TrunkSideDecorator.java @@ -0,0 +1,68 @@ +package twilightforest.world.components.feature.trees.treeplacers; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.tags.BlockTags; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.levelgen.feature.stateproviders.BlockStateProvider; +import net.minecraft.world.level.levelgen.feature.treedecorators.TreeDecorator; +import net.minecraft.world.level.levelgen.feature.treedecorators.TreeDecoratorType; +import twilightforest.TwilightForestMod; +import twilightforest.init.TFFeatureModifiers; + +public class TrunkSideDecorator extends TreeDecorator { + public static final Codec CODEC = RecordCodecBuilder.create( + instance -> instance.group( + Codec.intRange(0, 64).fieldOf("placement_count").forGetter(o -> o.count), + Codec.floatRange(0f, 1f).fieldOf("probability_of_placement").forGetter(o -> o.probability), + BlockStateProvider.CODEC.fieldOf("deco_provider").forGetter(o -> o.decoration) + ).apply(instance, TrunkSideDecorator::new) + ); + + private final int count; + private final float probability; + private final BlockStateProvider decoration; + + public TrunkSideDecorator(int count, float probability, BlockStateProvider decorator) { + this.count = count; + this.probability = probability; + this.decoration = decorator; + } + + @Override + protected TreeDecoratorType type() { + return TFFeatureModifiers.TRUNKSIDE_DECORATOR.get(); + } + + @Override + public void place(Context context) { + int blockCount = context.logs().size(); + + if (blockCount <= 0) { + TwilightForestMod.LOGGER.error("[TrunkSideDecorator] Trunk Blocks were empty! Why?"); + return; + } + + for (int attempt = 0; attempt < this.count; attempt++) { + if (context.random().nextFloat() >= this.probability) continue; + + //initial position on the tree trunk + BlockPos logPos = context.logs().get(context.random().nextInt(blockCount)); + //pick a random direction to offset + Direction direction = Direction.Plane.HORIZONTAL.getRandomDirection(context.random()); + //commit and set our new placement position there + BlockPos newPos = logPos.offset(direction.getStepX(), 0, direction.getStepZ()); + //if we have empty space, we're golden! + if (context.isAir(newPos)) { + if (this.decoration.getState(context.random(), newPos).hasProperty(BlockStateProperties.FACING)) { + context.setBlock(newPos, this.decoration.getState(context.random(), newPos).setValue(BlockStateProperties.FACING, direction)); + } else { + context.setBlock(newPos, this.decoration.getState(context.random(), newPos)); + } + } + } + } +} diff --git a/src/main/java/twilightforest/world/components/feature/trees/treeplacers/package-info.java b/src/main/java/twilightforest/world/components/feature/trees/treeplacers/package-info.java new file mode 100644 index 0000000000..a91706e818 --- /dev/null +++ b/src/main/java/twilightforest/world/components/feature/trees/treeplacers/package-info.java @@ -0,0 +1,6 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.world.components.feature.trees.treeplacers; + +import net.minecraft.MethodsReturnNonnullByDefault; +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/world/components/layer/BorderLayer.java b/src/main/java/twilightforest/world/components/layer/BorderLayer.java new file mode 100644 index 0000000000..aae0a2d04e --- /dev/null +++ b/src/main/java/twilightforest/world/components/layer/BorderLayer.java @@ -0,0 +1,88 @@ +package twilightforest.world.components.layer; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.Holder; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.biome.Biome; +import twilightforest.init.custom.BiomeLayerStack; +import twilightforest.init.custom.BiomeLayerTypes; +import twilightforest.world.components.layer.vanillalegacy.BiomeLayerFactory; +import twilightforest.world.components.layer.vanillalegacy.BiomeLayerType; +import twilightforest.world.components.layer.vanillalegacy.area.LazyArea; +import twilightforest.world.components.layer.vanillalegacy.context.Context; +import twilightforest.world.components.layer.vanillalegacy.context.LazyAreaContext; + +import java.util.function.LongFunction; + +public record BorderLayer(ResourceKey targetBiome, ResourceKey borderBiome) implements IThornsTransformer { + @Override + public ResourceKey apply(Context noise, ResourceKey up, ResourceKey left, ResourceKey down, ResourceKey right, ResourceKey center, ResourceKey nw, ResourceKey sw, ResourceKey se, ResourceKey ne) { + + if (onBorder(this.targetBiome, center, right, left, up, down)) { + return this.borderBiome; + } else if (onBorder(this.targetBiome, center, ne, nw, se, sw)) { + return this.borderBiome; + } else { + return center; + } + } + + /** + * Returns true if the center biome is not the specified biome and any of the surrounding biomes are the specified biomes + */ + private static boolean onBorder(ResourceKey biomeID, ResourceKey center, ResourceKey right, ResourceKey left, ResourceKey up, ResourceKey down) { + return center != biomeID && (right == biomeID || left == biomeID || up == biomeID || down == biomeID); + } + + public static final class Factory implements BiomeLayerFactory { + public static final Codec CODEC = RecordCodecBuilder.create(inst -> inst.group( + Codec.LONG.fieldOf("salt").forGetter(Factory::salt), + ResourceKey.codec(Registries.BIOME).fieldOf("target_biome").forGetter(Factory::target), + ResourceKey.codec(Registries.BIOME).fieldOf("bordering_biome").forGetter(Factory::borderingBiome), + BiomeLayerStack.HOLDER_CODEC.fieldOf("parent").forGetter(Factory::parent) + ).apply(inst, Factory::new)); + private final long salt; + private final ResourceKey target; + private final ResourceKey borderingBiome; + private final Holder parent; + + private final BorderLayer instance; + + public Factory(long salt, ResourceKey centerBiome, ResourceKey borderingBiome, Holder parent) { + this.salt = salt; + this.target = centerBiome; + this.borderingBiome = borderingBiome; + this.parent = parent; + + this.instance = new BorderLayer(centerBiome, borderingBiome); + } + + @Override + public LazyArea build(LongFunction contextFactory) { + return this.instance.run(contextFactory.apply(this.salt), this.parent.get().build(contextFactory)); + } + + @Override + public BiomeLayerType getType() { + return BiomeLayerTypes.BORDER.get(); + } + + public long salt() { + return this.salt; + } + + public ResourceKey target() { + return this.target; + } + + public ResourceKey borderingBiome() { + return this.borderingBiome; + } + + public Holder parent() { + return this.parent; + } + } +} diff --git a/src/main/java/twilightforest/world/components/layer/CompanionBiomesLayer.java b/src/main/java/twilightforest/world/components/layer/CompanionBiomesLayer.java new file mode 100644 index 0000000000..3310e0a00e --- /dev/null +++ b/src/main/java/twilightforest/world/components/layer/CompanionBiomesLayer.java @@ -0,0 +1,80 @@ +package twilightforest.world.components.layer; + +import com.mojang.datafixers.util.Pair; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.Holder; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.biome.Biome; +import twilightforest.init.custom.BiomeLayerStack; +import twilightforest.init.custom.BiomeLayerTypes; +import twilightforest.world.components.layer.vanillalegacy.BiomeLayerFactory; +import twilightforest.world.components.layer.vanillalegacy.BiomeLayerType; +import twilightforest.world.components.layer.vanillalegacy.area.LazyArea; +import twilightforest.world.components.layer.vanillalegacy.context.Context; +import twilightforest.world.components.layer.vanillalegacy.context.LazyAreaContext; +import twilightforest.world.components.layer.vanillalegacy.traits.CastleTransformer; + +import java.util.List; +import java.util.function.LongFunction; + +public record CompanionBiomesLayer(List, ResourceKey>> biomeCompanions) implements CastleTransformer { + @Override + public ResourceKey apply(Context context, ResourceKey up, ResourceKey right, ResourceKey down, ResourceKey left, ResourceKey center) { + for (Pair, ResourceKey> biomeCompanion : this.biomeCompanions) + if (isKey(biomeCompanion.getFirst(), center, left, right, up, down)) + return biomeCompanion.getSecond(); + + return center; + } + + /** + * Returns true if any of the surrounding biomes is the specified biome + */ + private static boolean isKey(ResourceKey biome, ResourceKey center, ResourceKey right, ResourceKey left, ResourceKey up, ResourceKey down) { + return center != biome && (right == biome || left == biome || up == biome || down == biome); + } + + public static final class Factory implements BiomeLayerFactory { + public static final Codec CODEC = RecordCodecBuilder.create(inst -> inst.group( + Codec.LONG.fieldOf("salt").forGetter(Factory::salt), + Codec.mapPair(ResourceKey.codec(Registries.BIOME).fieldOf("key"), ResourceKey.codec(Registries.BIOME).fieldOf("companion")).codec().listOf().fieldOf("keys_to_companions").forGetter(Factory::biomeCompanions), + BiomeLayerStack.HOLDER_CODEC.fieldOf("parent").forGetter(Factory::parent) + ).apply(inst, Factory::new)); + private final long salt; + private final List, ResourceKey>> biomeCompanions; + private final Holder parent; + private final CompanionBiomesLayer instance; + + public Factory(long salt, List, ResourceKey>> biomeCompanions, Holder parent) { + this.salt = salt; + this.biomeCompanions = biomeCompanions; + this.parent = parent; + + this.instance = new CompanionBiomesLayer(biomeCompanions); + } + + @Override + public LazyArea build(LongFunction contextFactory) { + return this.instance.run(contextFactory.apply(this.salt), this.parent.get().build(contextFactory)); + } + + @Override + public BiomeLayerType getType() { + return BiomeLayerTypes.COMPANION_BIOMES.get(); + } + + public long salt() { + return this.salt; + } + + public List, ResourceKey>> biomeCompanions() { + return this.biomeCompanions; + } + + public Holder parent() { + return this.parent; + } + } +} diff --git a/src/main/java/twilightforest/world/components/layer/FilteredBiomeLayer.java b/src/main/java/twilightforest/world/components/layer/FilteredBiomeLayer.java new file mode 100644 index 0000000000..8877b098d6 --- /dev/null +++ b/src/main/java/twilightforest/world/components/layer/FilteredBiomeLayer.java @@ -0,0 +1,84 @@ +package twilightforest.world.components.layer; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.Holder; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.biome.Biome; +import twilightforest.init.custom.BiomeLayerStack; +import twilightforest.init.custom.BiomeLayerTypes; +import twilightforest.world.components.layer.vanillalegacy.Area; +import twilightforest.world.components.layer.vanillalegacy.BiomeLayerFactory; +import twilightforest.world.components.layer.vanillalegacy.BiomeLayerType; +import twilightforest.world.components.layer.vanillalegacy.area.LazyArea; +import twilightforest.world.components.layer.vanillalegacy.context.Context; +import twilightforest.world.components.layer.vanillalegacy.context.LazyAreaContext; +import twilightforest.world.components.layer.vanillalegacy.traits.AreaTransformer2; +import twilightforest.world.components.layer.vanillalegacy.traits.DimensionOffset0Transformer; + +import java.util.function.LongFunction; + +public record FilteredBiomeLayer(ResourceKey biomeFirst) implements AreaTransformer2, DimensionOffset0Transformer { + @Override + public ResourceKey applyPixel(Context context, Area area1, Area area2, int x, int z) { + ResourceKey riverInputs = area2.getBiome(this.getParentX(x), this.getParentY(z)); + + if (riverInputs == this.biomeFirst) { + return riverInputs; + } else { + return area1.getBiome(this.getParentX(x), this.getParentY(z)); + } + } + + public static final class Factory implements BiomeLayerFactory { + public static final Codec CODEC = RecordCodecBuilder.create(inst -> inst.group( + Codec.LONG.fieldOf("salt").forGetter(Factory::salt), + ResourceKey.codec(Registries.BIOME).fieldOf("keep_biome").forGetter(Factory::filterKeep), + BiomeLayerStack.HOLDER_CODEC.fieldOf("filtered_layer").forGetter(Factory::filteredLayer), + BiomeLayerStack.HOLDER_CODEC.fieldOf("fallback_layer").forGetter(Factory::fallbackLayer) + ).apply(inst, Factory::new)); + + private final long salt; + private final ResourceKey filterKeep; + private final Holder filteredLayer; + private final Holder fallbackLayer; + + private final FilteredBiomeLayer filteredBiomeLayer; + + public Factory(long salt, ResourceKey filterKeep, Holder filteredLayer, Holder fallbackLayer) { + this.salt = salt; + this.filterKeep = filterKeep; + this.filteredLayer = filteredLayer; + this.fallbackLayer = fallbackLayer; + + this.filteredBiomeLayer = new FilteredBiomeLayer(this.filterKeep); + } + + @Override + public LazyArea build(LongFunction contextFactory) { + return this.filteredBiomeLayer.run(contextFactory.apply(this.salt), this.fallbackLayer.get().build(contextFactory), this.filteredLayer.get().build(contextFactory)); + } + + @Override + public BiomeLayerType getType() { + return BiomeLayerTypes.FILTERED.get(); + } + + public long salt() { + return this.salt; + } + + public ResourceKey filterKeep() { + return this.filterKeep; + } + + public Holder fallbackLayer() { + return this.fallbackLayer; + } + + public Holder filteredLayer() { + return this.filteredLayer; + } + } +} diff --git a/src/main/java/twilightforest/world/components/layer/IThornsTransformer.java b/src/main/java/twilightforest/world/components/layer/IThornsTransformer.java new file mode 100644 index 0000000000..618ad22d5b --- /dev/null +++ b/src/main/java/twilightforest/world/components/layer/IThornsTransformer.java @@ -0,0 +1,32 @@ +package twilightforest.world.components.layer; + +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.biome.Biome; +import twilightforest.world.components.layer.vanillalegacy.Area; +import twilightforest.world.components.layer.vanillalegacy.context.BigContext; +import twilightforest.world.components.layer.vanillalegacy.context.Context; +import twilightforest.world.components.layer.vanillalegacy.traits.AreaTransformer1; +import twilightforest.world.components.layer.vanillalegacy.traits.DimensionOffset1Transformer; + +/** + * Works like ICastleTransformer, but has extra parameters for diagonal checks + * TODO: Verify the logic + */ +public interface IThornsTransformer extends AreaTransformer1, DimensionOffset1Transformer { + ResourceKey apply(Context noise, ResourceKey north, ResourceKey west, ResourceKey south, ResourceKey east, ResourceKey middle, ResourceKey nw, ResourceKey sw, ResourceKey se, ResourceKey ne); + + @Override + default ResourceKey applyPixel(BigContext context, Area layer, int x, int z) { + return this.apply(context, + layer.getBiome(this.getParentX(x + 1), this.getParentY(z)), + layer.getBiome(this.getParentX(x + 2), this.getParentY(z + 1)), + layer.getBiome(this.getParentX(x + 1), this.getParentY(z + 2)), + layer.getBiome(this.getParentX(x), this.getParentY(z + 1)), + layer.getBiome(this.getParentX(x + 1), this.getParentY(z + 1)), + layer.getBiome(this.getParentX(x + 2), this.getParentY(z)), + layer.getBiome(this.getParentX(x + 2), this.getParentY(z + 2)), + layer.getBiome(this.getParentX(x), this.getParentY(z + 2)), + layer.getBiome(this.getParentX(x), this.getParentY(z)) + ); + } +} diff --git a/src/main/java/twilightforest/world/components/layer/KeyBiomesLayer.java b/src/main/java/twilightforest/world/components/layer/KeyBiomesLayer.java new file mode 100644 index 0000000000..a08b1e5c48 --- /dev/null +++ b/src/main/java/twilightforest/world/components/layer/KeyBiomesLayer.java @@ -0,0 +1,123 @@ +package twilightforest.world.components.layer; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.Util; +import net.minecraft.core.Holder; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.biome.Biome; +import twilightforest.init.TFDimensionSettings; +import twilightforest.init.custom.BiomeLayerStack; +import twilightforest.init.custom.BiomeLayerTypes; +import twilightforest.world.components.layer.vanillalegacy.Area; +import twilightforest.world.components.layer.vanillalegacy.BiomeLayerFactory; +import twilightforest.world.components.layer.vanillalegacy.BiomeLayerType; +import twilightforest.world.components.layer.vanillalegacy.area.LazyArea; +import twilightforest.world.components.layer.vanillalegacy.context.BigContext; +import twilightforest.world.components.layer.vanillalegacy.context.LazyAreaContext; +import twilightforest.world.components.layer.vanillalegacy.traits.AreaTransformer1; + +import java.util.List; +import java.util.Random; +import java.util.function.Function; +import java.util.function.LongFunction; + +/** + * Puts key biomes in the proper positions + * + * @author Ben + */ +public record KeyBiomesLayer(List> keyBiomes) implements AreaTransformer1 { + private static final Random RANDOM = new Random(); + + @Override + public int getParentX(int x) { + return x | 3; + } + + @Override + public int getParentY(int z) { + return z | 3; + } + + @Override + public ResourceKey applyPixel(BigContext context, Area layer, int x, int z) { + RANDOM.setSeed(TFDimensionSettings.seed + (x & -4) * 25117L + (z & -4) * 151121L); + int ox = RANDOM.nextInt(2) + 1; + int oz = RANDOM.nextInt(2) + 1; + RANDOM.setSeed(TFDimensionSettings.seed + (x / 8) * 25117L + (z / 8) * 151121L); + int offset = RANDOM.nextInt(3); + if ((x & 3) == ox && (z & 3) == oz) { + // determine which of the 4 + if ((x & 4) == 0) { + if ((z & 4) == 0) { + return getKeyBiomeFor(offset); + } else { + return getKeyBiomeFor(offset + 1); + } + } else { + if ((z & 4) == 0) { + return getKeyBiomeFor(offset + 2); + } else { + return getKeyBiomeFor(offset + 3); + } + } + + } else { + return layer.getBiome(x, z); + } + } + + /** + * Determine which map "region" the specified points are in. Assign the 0-3 of the index to the key biomes based on that region. + */ + private ResourceKey getKeyBiomeFor(int index) { + // do we need to shuffle this better? + // the current version just "rotates" the 4 key biomes + return this.keyBiomes.get(index & 0b11); + } + + public static final class Factory implements BiomeLayerFactory { + public static final Codec CODEC = RecordCodecBuilder.create(inst -> inst.group( + Codec.LONG.fieldOf("salt").forGetter(Factory::salt), + ResourceKey.codec(Registries.BIOME).listOf().comapFlatMap(list -> Util.fixedSize(list, 4), Function.identity()).fieldOf("key_biomes").forGetter(Factory::keyBiomes), + BiomeLayerStack.HOLDER_CODEC.fieldOf("parent").forGetter(Factory::parent) + ).apply(inst, Factory::new)); + private final long salt; + private final List> keyBiomes; + private final Holder parent; + + private final KeyBiomesLayer instance; + + public Factory(long salt, List> keyBiomes, Holder parent) { + this.salt = salt; + this.keyBiomes = keyBiomes; + this.parent = parent; + + this.instance = new KeyBiomesLayer(keyBiomes); + } + + @Override + public LazyArea build(LongFunction contextFactory) { + return this.instance.run(contextFactory.apply(this.salt), this.parent.get().build(contextFactory)); + } + + @Override + public BiomeLayerType getType() { + return BiomeLayerTypes.KEY_BIOMES.get(); + } + + public long salt() { + return this.salt; + } + + public List> keyBiomes() { + return this.keyBiomes; + } + + public Holder parent() { + return this.parent; + } + } +} diff --git a/src/main/java/twilightforest/world/components/layer/MedianLayer.java b/src/main/java/twilightforest/world/components/layer/MedianLayer.java new file mode 100644 index 0000000000..3d2f7033e8 --- /dev/null +++ b/src/main/java/twilightforest/world/components/layer/MedianLayer.java @@ -0,0 +1,89 @@ +package twilightforest.world.components.layer; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.Holder; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.biome.Biome; +import twilightforest.init.custom.BiomeLayerStack; +import twilightforest.init.custom.BiomeLayerTypes; +import twilightforest.world.components.layer.vanillalegacy.Area; +import twilightforest.world.components.layer.vanillalegacy.BiomeLayerFactory; +import twilightforest.world.components.layer.vanillalegacy.BiomeLayerType; +import twilightforest.world.components.layer.vanillalegacy.area.LazyArea; +import twilightforest.world.components.layer.vanillalegacy.context.BigContext; +import twilightforest.world.components.layer.vanillalegacy.context.LazyAreaContext; +import twilightforest.world.components.layer.vanillalegacy.traits.AreaTransformer1; + +import java.util.function.LongFunction; + +public enum MedianLayer implements AreaTransformer1 { + INSTANCE; + + @SuppressWarnings({"rawtypes", "unchecked"}) + @Override + public ResourceKey applyPixel(BigContext context, Area layer, int x, int z) { + ResourceKey[] biomes = new ResourceKey[9]; + + for (int pos = 0; pos < 9; pos++) { + biomes[pos] = layer.getBiome(x + (pos % 3), z + (pos / 3)); + } + + int biomeRecordIndex = 0; + int biomeRecordCount = 0; + + int iterationQuantity; + for (int index = 0; index < 9; index++) { + iterationQuantity = 0; + + for (int test = 0; test < 9; test++) { + if (biomes[index] == biomes[test]) { + iterationQuantity++; + + if (iterationQuantity > 4) { // 5 out of 9 is a Home Run! Bye! + return biomes[index]; + } + } + } + + // If there are two biomes with same dominating quantity, then randomly pick unless it is the central biome. + if (biomeRecordCount == iterationQuantity && (index == 5 || (biomeRecordIndex != 5 && context.nextRandom(2) == 0))) { + biomeRecordIndex = index; + } + + if (biomeRecordCount > iterationQuantity) { + biomeRecordIndex = index; + biomeRecordCount = iterationQuantity; + } + } + + return biomes[biomeRecordIndex]; // default center biome + } + + @Override + public int getParentX(int x) { + return x; + } + + @Override + public int getParentY(int z) { + return z; + } + + public record Factory(long salt, Holder parent) implements BiomeLayerFactory { + public static final Codec CODEC = RecordCodecBuilder.create(inst -> inst.group( + Codec.LONG.fieldOf("salt").forGetter(Factory::salt), + BiomeLayerStack.HOLDER_CODEC.fieldOf("parent").forGetter(Factory::parent) + ).apply(inst, Factory::new)); + + @Override + public LazyArea build(LongFunction contextFactory) { + return INSTANCE.run(contextFactory.apply(this.salt), this.parent.get().build(contextFactory)); + } + + @Override + public BiomeLayerType getType() { + return BiomeLayerTypes.MEDIAN.get(); + } + } +} diff --git a/src/main/java/twilightforest/world/components/layer/RandomBiomeLayer.java b/src/main/java/twilightforest/world/components/layer/RandomBiomeLayer.java new file mode 100644 index 0000000000..93bcbb8723 --- /dev/null +++ b/src/main/java/twilightforest/world/components/layer/RandomBiomeLayer.java @@ -0,0 +1,96 @@ +package twilightforest.world.components.layer; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.biome.Biome; +import twilightforest.init.custom.BiomeLayerTypes; +import twilightforest.world.components.layer.vanillalegacy.BiomeLayerFactory; +import twilightforest.world.components.layer.vanillalegacy.BiomeLayerType; +import twilightforest.world.components.layer.vanillalegacy.area.LazyArea; +import twilightforest.world.components.layer.vanillalegacy.context.Context; +import twilightforest.world.components.layer.vanillalegacy.context.LazyAreaContext; +import twilightforest.world.components.layer.vanillalegacy.traits.AreaTransformer0; + +import java.util.List; +import java.util.function.LongFunction; + +/** + * Applies the twilight forest biomes to the map + * + * @author Ben + */ +public class RandomBiomeLayer implements AreaTransformer0 { + private final int rareBiomeChance; + + private final List> commonBiomes; + private final List> rareBiomes; + + public RandomBiomeLayer(int rareBiomeChance, List> commonBiomes, List> rareBiomes) { + this.rareBiomeChance = rareBiomeChance; + this.commonBiomes = commonBiomes; + this.rareBiomes = rareBiomes; + } + + @Override + public ResourceKey applyPixel(Context context, int x, int z) { + if (context.nextRandom(this.rareBiomeChance) == 0) { + // make specialBiomes biome + return this.rareBiomes.get(context.nextRandom(this.rareBiomes.size())); + } else { + // make common biome + return this.commonBiomes.get(context.nextRandom(this.commonBiomes.size())); + } + } + + public static final class Factory implements BiomeLayerFactory { + public static final Codec CODEC = RecordCodecBuilder.create(inst -> inst.group( + Codec.LONG.fieldOf("salt").forGetter(Factory::salt), + Codec.INT.fieldOf("rare_biome_chance").forGetter(Factory::rareBiomeChance), + ResourceKey.codec(Registries.BIOME).listOf().fieldOf("common_biomes").forGetter(Factory::commonBiomes), + ResourceKey.codec(Registries.BIOME).listOf().fieldOf("rare_biomes").forGetter(Factory::rareBiomes) + ).apply(inst, Factory::new)); + private final long salt; + private final int rareBiomeChance; + private final List> commonBiomes; + private final List> rareBiomes; + + private final RandomBiomeLayer instance; + + public Factory(long salt, int rareBiomeChance, List> commonBiomes, List> rareBiomes) { + this.salt = salt; + this.rareBiomeChance = rareBiomeChance; + this.commonBiomes = commonBiomes; + this.rareBiomes = rareBiomes; + + this.instance = new RandomBiomeLayer(rareBiomeChance, commonBiomes, rareBiomes); + } + + @Override + public LazyArea build(LongFunction contextFactory) { + return this.instance.run(contextFactory.apply(this.salt)); + } + + @Override + public BiomeLayerType getType() { + return BiomeLayerTypes.RANDOM_BIOMES.get(); + } + + public long salt() { + return this.salt; + } + + public int rareBiomeChance() { + return this.rareBiomeChance; + } + + public List> commonBiomes() { + return this.commonBiomes; + } + + public List> rareBiomes() { + return this.rareBiomes; + } + } +} diff --git a/src/main/java/twilightforest/world/components/layer/SeamLayer.java b/src/main/java/twilightforest/world/components/layer/SeamLayer.java new file mode 100644 index 0000000000..cd944b4e36 --- /dev/null +++ b/src/main/java/twilightforest/world/components/layer/SeamLayer.java @@ -0,0 +1,112 @@ +package twilightforest.world.components.layer; + +import com.mojang.datafixers.util.Pair; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.Holder; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.biome.Biome; +import twilightforest.init.custom.BiomeLayerStack; +import twilightforest.init.custom.BiomeLayerTypes; +import twilightforest.util.Codecs; +import twilightforest.world.components.layer.vanillalegacy.BiomeLayerFactory; +import twilightforest.world.components.layer.vanillalegacy.BiomeLayerType; +import twilightforest.world.components.layer.vanillalegacy.area.LazyArea; +import twilightforest.world.components.layer.vanillalegacy.context.Context; +import twilightforest.world.components.layer.vanillalegacy.context.LazyAreaContext; +import twilightforest.world.components.layer.vanillalegacy.traits.CastleTransformer; + +import java.util.List; +import java.util.function.LongFunction; + +public record SeamLayer(ResourceKey partitioningBiome, List> excludedBiomeNeighbors, List, ResourceKey>> excludedBiomeIntersections) implements CastleTransformer { + @Override + public ResourceKey apply(Context context, ResourceKey up, ResourceKey left, ResourceKey down, ResourceKey right, ResourceKey mid) { + if (this.shouldPartition(mid, left) || this.shouldPartition(mid, right) || this.shouldPartition(mid, down) || this.shouldPartition(mid, up)) { + return this.partitioningBiome; + } else { + return mid; + } + } + + private boolean shouldPartition(ResourceKey biome1, ResourceKey biome2) { + if (biome1 == biome2) + return false; + + for (ResourceKey excludedBiome : this.excludedBiomeNeighbors) + if (testEitherBiome(biome1, biome2, excludedBiome)) + return false; + + for (Pair, ResourceKey> excludedIntersection : this.excludedBiomeIntersections) + if (testEitherBiomeAND(biome1, biome2, excludedIntersection.getFirst(), excludedIntersection.getSecond())) + return false; + + return true; + } + + private static boolean testEitherBiomeAND(ResourceKey test1, ResourceKey test2, ResourceKey predicate1, ResourceKey predicate2) { + return (test1 == predicate1 && test2 == predicate2) || (test2 == predicate1 && test1 == predicate2); + } + + private static boolean testEitherBiome(ResourceKey test1, ResourceKey test2, ResourceKey predicate) { + return test1 == predicate || test2 == predicate; + } + + public static final class Factory implements BiomeLayerFactory { + public static final Codec CODEC = RecordCodecBuilder.create(inst -> inst.group( + Codec.LONG.fieldOf("salt").forGetter(Factory::salt), + ResourceKey.codec(Registries.BIOME).fieldOf("dividing_biome").forGetter(Factory::partitioningBiome), + ResourceKey.codec(Registries.BIOME).listOf().fieldOf("excluded_neighbor_biomes").forGetter(Factory::excludedBiomeNeighbors), + ResourceKey.codec(Registries.BIOME).listOf().comapFlatMap(Codecs::arrayToPair, p -> List.of(p.getFirst(), p.getSecond())).listOf().fieldOf("excluded_biome_intersections").forGetter(Factory::excludedBiomeIntersections), + BiomeLayerStack.HOLDER_CODEC.fieldOf("parent").forGetter(Factory::parent) + ).apply(inst, Factory::new)); + + private final long salt; + private final ResourceKey partitioningBiome; + private final List> excludedBiomeNeighbors; + private final List, ResourceKey>> excludedBiomeIntersections; + private final Holder parent; + private final SeamLayer instance; + + public Factory(long salt, ResourceKey partitioningBiome, List> excludedBiomeNeighbors, List, ResourceKey>> excludedBiomeIntersections, Holder parent) { + this.salt = salt; + this.partitioningBiome = partitioningBiome; + this.excludedBiomeNeighbors = excludedBiomeNeighbors; + this.excludedBiomeIntersections = excludedBiomeIntersections; + this.parent = parent; + + this.instance = new SeamLayer(partitioningBiome, excludedBiomeNeighbors, excludedBiomeIntersections); + } + + @Override + public LazyArea build(LongFunction contextFactory) { + return this.instance.run(contextFactory.apply(this.salt), this.parent.get().build(contextFactory)); + } + + @Override + public BiomeLayerType getType() { + return BiomeLayerTypes.SEAM.get(); + } + + public long salt() { + return this.salt; + } + + public ResourceKey partitioningBiome() { + return this.partitioningBiome; + } + + public List> excludedBiomeNeighbors() { + return this.excludedBiomeNeighbors; + } + + public List, ResourceKey>> excludedBiomeIntersections() { + return this.excludedBiomeIntersections; + } + + public Holder parent() { + return this.parent; + } + } +} diff --git a/src/main/java/twilightforest/world/components/layer/StabilizeLayer.java b/src/main/java/twilightforest/world/components/layer/StabilizeLayer.java new file mode 100644 index 0000000000..eb144971c1 --- /dev/null +++ b/src/main/java/twilightforest/world/components/layer/StabilizeLayer.java @@ -0,0 +1,110 @@ +package twilightforest.world.components.layer; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.Holder; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.biome.Biome; +import twilightforest.init.custom.BiomeLayerStack; +import twilightforest.init.custom.BiomeLayerTypes; +import twilightforest.world.components.layer.vanillalegacy.Area; +import twilightforest.world.components.layer.vanillalegacy.BiomeLayerFactory; +import twilightforest.world.components.layer.vanillalegacy.BiomeLayerType; +import twilightforest.world.components.layer.vanillalegacy.area.LazyArea; +import twilightforest.world.components.layer.vanillalegacy.context.BigContext; +import twilightforest.world.components.layer.vanillalegacy.context.LazyAreaContext; +import twilightforest.world.components.layer.vanillalegacy.traits.AreaTransformer1; + +import java.util.function.LongFunction; + +public enum StabilizeLayer implements AreaTransformer1 { + INSTANCE; + + @Override + public int getParentX(int x) { + return x & 3; + } + + @Override + public int getParentY(int z) { + return z & 3; + } + + /** + * When we are near the center of each biome, make nearby areas that biome too + */ +// @Override +// public int[] getInts(int x, int z, int width, int depth) { +// int nx = x - 1; +// int nz = z - 1; +// int nwidth = width + 2; +// int ndepth = depth + 2; +// int input[] = parent.getInts(nx, nz, nwidth, ndepth); +// int output[] = IntCache.getIntCache(width * depth); +// +// int offX = x & 3; +// int offZ = z & 3; +// +// for (int dz = 0; dz < depth; dz++) { +// for (int dx = 0; dx < width; dx++) { +// int centerX = ((dx + offX + 1) & 0xFFFFFFFC) - offX; +// int centerZ = ((dz + offZ + 1) & 0xFFFFFFFC) - offZ; +// +//// if (dx == centerX && dz == centerZ) +//// { +//// output[dx + dz * width] = input[centerX + 1 + (centerZ + 1) * nwidth]; +////// output[dx + dz * width] = BiomeLibrary.glacier.biomeID; +//// } +//// else +// if (dx <= centerX + 1 && dx >= centerX - 1 && dz <= centerZ + 1 && dz >= centerZ - 1) { +// output[dx + dz * width] = input[centerX + 1 + (centerZ + 1) * nwidth]; +//// output[dx + dz * width] = Biome.desert.biomeID; +//// output[dx + dz * width] = input[dx + 1 + (dz + 1) * nwidth]; +// } else { +// output[dx + dz * width] = input[dx + 1 + (dz + 1) * nwidth]; +// } +// } +// } +// +// return output; +// } + + @Override + public ResourceKey applyPixel(BigContext context, Area layer, int x, int z) { + int offX = getParentX(x << 4); + int offZ = getParentY(z << 4); + int centerX = ((x + offX + 1) & -4) - offX; + int centerZ = ((z + offZ + 1) & -4) - offZ; + +// if (dx == centerX && dz == centerZ) +// { +// output[dx + dz * width] = input[centerX + 1 + (centerZ + 1) * nwidth]; +//// output[dx + dz * width] = BiomeLibrary.glacier.biomeID; +// } +// else + if (x <= centerX + 1 && x >= centerX - 1 && z <= centerZ + 1 && z >= centerZ - 1) { + return layer.getBiome(centerX, centerZ); +// output[dx + dz * width] = Biome.desert.biomeID; +// output[dx + dz * width] = input[dx + 1 + (dz + 1) * nwidth]; + } else { + return layer.getBiome(x, z); + } + } + + public record Factory(long salt, Holder parent) implements BiomeLayerFactory { + public static final Codec CODEC = RecordCodecBuilder.create(inst -> inst.group( + Codec.LONG.fieldOf("salt").forGetter(Factory::salt), + BiomeLayerStack.HOLDER_CODEC.fieldOf("parent").forGetter(Factory::parent) + ).apply(inst, Factory::new)); + + @Override + public LazyArea build(LongFunction contextFactory) { + return INSTANCE.run(contextFactory.apply(this.salt), this.parent.get().build(contextFactory)); + } + + @Override + public BiomeLayerType getType() { + return BiomeLayerTypes.STABILIZE.get(); + } + } +} diff --git a/src/main/java/twilightforest/world/components/layer/package-info.java b/src/main/java/twilightforest/world/components/layer/package-info.java new file mode 100644 index 0000000000..0f930245e4 --- /dev/null +++ b/src/main/java/twilightforest/world/components/layer/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.world.components.layer; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/world/components/layer/vanillalegacy/Area.java b/src/main/java/twilightforest/world/components/layer/vanillalegacy/Area.java new file mode 100644 index 0000000000..b5fda3d8f7 --- /dev/null +++ b/src/main/java/twilightforest/world/components/layer/vanillalegacy/Area.java @@ -0,0 +1,8 @@ +package twilightforest.world.components.layer.vanillalegacy; + +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.biome.Biome; + +public interface Area { + ResourceKey getBiome(int x, int z); +} \ No newline at end of file diff --git a/src/main/java/twilightforest/world/components/layer/vanillalegacy/BiomeLayerFactory.java b/src/main/java/twilightforest/world/components/layer/vanillalegacy/BiomeLayerFactory.java new file mode 100644 index 0000000000..a26ff552c6 --- /dev/null +++ b/src/main/java/twilightforest/world/components/layer/vanillalegacy/BiomeLayerFactory.java @@ -0,0 +1,12 @@ +package twilightforest.world.components.layer.vanillalegacy; + +import twilightforest.world.components.layer.vanillalegacy.area.LazyArea; +import twilightforest.world.components.layer.vanillalegacy.context.LazyAreaContext; + +import java.util.function.LongFunction; + +public interface BiomeLayerFactory { + LazyArea build(LongFunction contextFactory); + + BiomeLayerType getType(); +} diff --git a/src/main/java/twilightforest/world/components/layer/vanillalegacy/BiomeLayerType.java b/src/main/java/twilightforest/world/components/layer/vanillalegacy/BiomeLayerType.java new file mode 100644 index 0000000000..5efa915f2e --- /dev/null +++ b/src/main/java/twilightforest/world/components/layer/vanillalegacy/BiomeLayerType.java @@ -0,0 +1,8 @@ +package twilightforest.world.components.layer.vanillalegacy; + +import com.mojang.serialization.Codec; + +@FunctionalInterface +public interface BiomeLayerType { + Codec getCodec(); +} diff --git a/src/main/java/twilightforest/world/components/layer/vanillalegacy/SmoothLayer.java b/src/main/java/twilightforest/world/components/layer/vanillalegacy/SmoothLayer.java new file mode 100644 index 0000000000..a4db00c8c6 --- /dev/null +++ b/src/main/java/twilightforest/world/components/layer/vanillalegacy/SmoothLayer.java @@ -0,0 +1,51 @@ +package twilightforest.world.components.layer.vanillalegacy; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.Holder; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.biome.Biome; +import twilightforest.init.custom.BiomeLayerStack; +import twilightforest.init.custom.BiomeLayerTypes; +import twilightforest.world.components.layer.vanillalegacy.area.LazyArea; +import twilightforest.world.components.layer.vanillalegacy.context.Context; +import twilightforest.world.components.layer.vanillalegacy.context.LazyAreaContext; +import twilightforest.world.components.layer.vanillalegacy.traits.CastleTransformer; + +import java.util.function.LongFunction; + +public enum SmoothLayer implements CastleTransformer { + INSTANCE; + + @Override + public ResourceKey apply(Context context, ResourceKey up, ResourceKey right, ResourceKey down, ResourceKey left, ResourceKey center) { + boolean xMatch = right == left; + boolean zMatch = up == down; + if (xMatch == zMatch) { + if (xMatch) { + return context.nextRandom(2) == 0 ? left : up; + } else { + return center; + } + } else { + return xMatch ? left : up; + } + } + + public record Factory(long salt, Holder parent) implements BiomeLayerFactory { + public static final Codec CODEC = RecordCodecBuilder.create(inst -> inst.group( + Codec.LONG.fieldOf("salt").forGetter(Factory::salt), + BiomeLayerStack.HOLDER_CODEC.fieldOf("parent").forGetter(Factory::parent) + ).apply(inst, Factory::new)); + + @Override + public LazyArea build(LongFunction contextFactory) { + return INSTANCE.run(contextFactory.apply(this.salt), this.parent.get().build(contextFactory)); + } + + @Override + public BiomeLayerType getType() { + return BiomeLayerTypes.SMOOTH.get(); + } + } +} diff --git a/src/main/java/twilightforest/world/components/layer/vanillalegacy/ZoomLayer.java b/src/main/java/twilightforest/world/components/layer/vanillalegacy/ZoomLayer.java new file mode 100644 index 0000000000..d4f09e3750 --- /dev/null +++ b/src/main/java/twilightforest/world/components/layer/vanillalegacy/ZoomLayer.java @@ -0,0 +1,113 @@ +package twilightforest.world.components.layer.vanillalegacy; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.Holder; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.biome.Biome; +import twilightforest.init.custom.BiomeLayerStack; +import twilightforest.init.custom.BiomeLayerTypes; +import twilightforest.world.components.layer.vanillalegacy.area.LazyArea; +import twilightforest.world.components.layer.vanillalegacy.context.BigContext; +import twilightforest.world.components.layer.vanillalegacy.context.LazyAreaContext; +import twilightforest.world.components.layer.vanillalegacy.traits.AreaTransformer1; + +import java.util.function.LongFunction; + +public enum ZoomLayer implements AreaTransformer1 { + NORMAL, + FUZZY { + @Override + protected ResourceKey modeOrRandom(BigContext context, ResourceKey p_76980_, ResourceKey p_76981_, ResourceKey p_76982_, ResourceKey p_76983_) { + return context.random(p_76980_, p_76981_, p_76982_, p_76983_); + } + }; + + private static final int ZOOM_BITS = 1; + private static final int ZOOM_MASK = 1; + + @Override + public int getParentX(int x) { + return x >> 1; + } + + @Override + public int getParentY(int z) { + return z >> 1; + } + + @Override + public ResourceKey applyPixel(BigContext context, Area layer, int x, int z) { + ResourceKey i = layer.getBiome(this.getParentX(x), this.getParentY(z)); + context.initRandom(x >> 1 << 1, z >> 1 << 1); + int j = x & 1; + int k = z & 1; + if (j == 0 && k == 0) { + return i; + } else { + ResourceKey l = layer.getBiome(this.getParentX(x), this.getParentY(z + 1)); + ResourceKey i1 = context.random(i, l); + if (j == 0 && k == 1) { + return i1; + } else { + ResourceKey j1 = layer.getBiome(this.getParentX(x + 1), this.getParentY(z)); + ResourceKey k1 = context.random(i, j1); + if (j == 1 && k == 0) { + return k1; + } else { + ResourceKey l1 = layer.getBiome(this.getParentX(x + 1), this.getParentY(z + 1)); + return this.modeOrRandom(context, i, j1, l, l1); + } + } + } + } + + protected ResourceKey modeOrRandom(BigContext p_76960_, ResourceKey p_76961_, ResourceKey p_76962_, ResourceKey p_76963_, ResourceKey p_76964_) { + if (p_76962_ == p_76963_ && p_76963_ == p_76964_) { + return p_76962_; + } else if (p_76961_ == p_76962_ && p_76961_ == p_76963_) { + return p_76961_; + } else if (p_76961_ == p_76962_ && p_76961_ == p_76964_) { + return p_76961_; + } else if (p_76961_ == p_76963_ && p_76961_ == p_76964_) { + return p_76961_; + } else if (p_76961_ == p_76962_ && p_76963_ != p_76964_) { + return p_76961_; + } else if (p_76961_ == p_76963_ && p_76962_ != p_76964_) { + return p_76961_; + } else if (p_76961_ == p_76964_ && p_76962_ != p_76963_) { + return p_76961_; + } else if (p_76962_ == p_76963_ && p_76961_ != p_76964_) { + return p_76962_; + } else if (p_76962_ == p_76964_ && p_76961_ != p_76963_) { + return p_76962_; + } else { + return p_76963_ == p_76964_ && p_76961_ != p_76962_ ? p_76963_ : p_76960_.random(p_76961_, p_76962_, p_76963_, p_76964_); + } + } + + public record Factory(long salt, boolean fuzzy, Holder parent) implements BiomeLayerFactory { + public static final Codec CODEC = RecordCodecBuilder.create(inst -> inst.group( + Codec.LONG.fieldOf("salt").forGetter(Factory::salt), + Codec.BOOL.fieldOf("fuzzy").forGetter(Factory::fuzzy), + BiomeLayerStack.HOLDER_CODEC.fieldOf("parent").forGetter(Factory::parent) + ).apply(inst, Factory::new)); + + // TODO Parameterize bit-shifting quantities + @Override + public LazyArea build(LongFunction contextFactory) { + LazyAreaContext seededContext = contextFactory.apply(this.salt); + LazyArea parentLayer = this.parent.get().build(contextFactory); + + if (this.fuzzy) + return FUZZY.run(seededContext, parentLayer); + else + return NORMAL.run(seededContext, parentLayer); + } + + @Override + public BiomeLayerType getType() { + return BiomeLayerTypes.ZOOM.get(); + } + } +} diff --git a/src/main/java/twilightforest/world/components/layer/vanillalegacy/area/LazyArea.java b/src/main/java/twilightforest/world/components/layer/vanillalegacy/area/LazyArea.java new file mode 100644 index 0000000000..fba0b41afc --- /dev/null +++ b/src/main/java/twilightforest/world/components/layer/vanillalegacy/area/LazyArea.java @@ -0,0 +1,45 @@ +package twilightforest.world.components.layer.vanillalegacy.area; + +import it.unimi.dsi.fastutil.longs.Long2ObjectLinkedOpenHashMap; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.biome.Biomes; +import twilightforest.world.components.layer.vanillalegacy.Area; + +public class LazyArea implements Area { + private final Area transformer; + private final Long2ObjectLinkedOpenHashMap> cachedSamples; + private final int maxCache; + + public LazyArea(Long2ObjectLinkedOpenHashMap> cache, int maxCache, Area transformer) { + this.cachedSamples = cache; + this.maxCache = maxCache; + this.transformer = transformer; + } + + @Override + public ResourceKey getBiome(int x, int z) { + long i = ChunkPos.asLong(x, z); + synchronized(this.cachedSamples) { + ResourceKey j = this.cachedSamples.get(i); + if (j != null && j != Biomes.THE_VOID) { + return j; + } else { + ResourceKey k = this.transformer.getBiome(x, z); + this.cachedSamples.put(i, k); + if (this.cachedSamples.size() > this.maxCache) { + for(int l = 0; l < this.maxCache / 16; ++l) { + this.cachedSamples.removeFirst(); + } + } + + return k; + } + } + } + + public int getMaxCache() { + return this.maxCache; + } +} diff --git a/src/main/java/twilightforest/world/components/layer/vanillalegacy/area/package-info.java b/src/main/java/twilightforest/world/components/layer/vanillalegacy/area/package-info.java new file mode 100644 index 0000000000..c0ae441ec3 --- /dev/null +++ b/src/main/java/twilightforest/world/components/layer/vanillalegacy/area/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.world.components.layer.vanillalegacy.area; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/world/components/layer/vanillalegacy/context/BigContext.java b/src/main/java/twilightforest/world/components/layer/vanillalegacy/context/BigContext.java new file mode 100644 index 0000000000..fb859979fe --- /dev/null +++ b/src/main/java/twilightforest/world/components/layer/vanillalegacy/context/BigContext.java @@ -0,0 +1,30 @@ +package twilightforest.world.components.layer.vanillalegacy.context; + +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.biome.Biome; +import twilightforest.world.components.layer.vanillalegacy.Area; + +public interface BigContext extends Context { + void initRandom(long x, long z); + + R createResult(Area transformer); + + R createResult(Area transformer, R layer); + + R createResult(Area transformer, R layer1, R layer2); + + default ResourceKey random(ResourceKey biome1, ResourceKey biome2) { + return this.nextRandom(2) == 0 ? biome1 : biome2; + } + + default ResourceKey random(ResourceKey biome1, ResourceKey biome2, ResourceKey biome3, ResourceKey biome4) { + int i = this.nextRandom(4); + if (i == 0) { + return biome1; + } else if (i == 1) { + return biome2; + } else { + return i == 2 ? biome3 : biome4; + } + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/world/components/layer/vanillalegacy/context/Context.java b/src/main/java/twilightforest/world/components/layer/vanillalegacy/context/Context.java new file mode 100644 index 0000000000..e85b6753e4 --- /dev/null +++ b/src/main/java/twilightforest/world/components/layer/vanillalegacy/context/Context.java @@ -0,0 +1,5 @@ +package twilightforest.world.components.layer.vanillalegacy.context; + +public interface Context { + int nextRandom(int limit); +} \ No newline at end of file diff --git a/src/main/java/twilightforest/world/components/layer/vanillalegacy/context/LazyAreaContext.java b/src/main/java/twilightforest/world/components/layer/vanillalegacy/context/LazyAreaContext.java new file mode 100644 index 0000000000..ad966950b7 --- /dev/null +++ b/src/main/java/twilightforest/world/components/layer/vanillalegacy/context/LazyAreaContext.java @@ -0,0 +1,65 @@ +package twilightforest.world.components.layer.vanillalegacy.context; + +import it.unimi.dsi.fastutil.longs.Long2ObjectLinkedOpenHashMap; +import net.minecraft.resources.ResourceKey; +import net.minecraft.util.LinearCongruentialGenerator; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.biome.Biomes; +import twilightforest.init.TFDimensionSettings; +import twilightforest.world.components.layer.vanillalegacy.area.LazyArea; +import twilightforest.world.components.layer.vanillalegacy.Area; + +public class LazyAreaContext implements BigContext { + private final Long2ObjectLinkedOpenHashMap> cache; + private final int maxCache; + private final long seed; + private long rval; + + public LazyAreaContext(int maxCache, long salt) { + this.seed = mixSeed(TFDimensionSettings.seed, salt); + this.cache = new Long2ObjectLinkedOpenHashMap<>(16, 0.25F); + this.cache.defaultReturnValue(Biomes.THE_VOID); + this.maxCache = maxCache; + } + + @Override + public LazyArea createResult(Area transformer) { + return new LazyArea(this.cache, this.maxCache, transformer); + } + + @Override + public LazyArea createResult(Area transformer, LazyArea layer) { + return new LazyArea(this.cache, Math.min(1024, layer.getMaxCache() * 4), transformer); + } + + @Override + public LazyArea createResult(Area transformer, LazyArea layer1, LazyArea layer2) { + return new LazyArea(this.cache, Math.min(1024, Math.max(layer1.getMaxCache(), layer2.getMaxCache()) * 4), transformer); + } + + @Override + public void initRandom(long x, long z) { + long i = this.seed; + i = LinearCongruentialGenerator.next(i, x); + i = LinearCongruentialGenerator.next(i, z); + i = LinearCongruentialGenerator.next(i, x); + i = LinearCongruentialGenerator.next(i, z); + this.rval = i; + } + + @Override + public int nextRandom(int limit) { + int i = Math.floorMod(this.rval >> 24, limit); + this.rval = LinearCongruentialGenerator.next(this.rval, this.seed); + return i; + } + + private static long mixSeed(long seed, long salt) { + long i = LinearCongruentialGenerator.next(salt, salt); + i = LinearCongruentialGenerator.next(i, salt); + i = LinearCongruentialGenerator.next(i, salt); + long j = LinearCongruentialGenerator.next(seed, i); + j = LinearCongruentialGenerator.next(j, i); + return LinearCongruentialGenerator.next(j, i); + } +} diff --git a/src/main/java/twilightforest/world/components/layer/vanillalegacy/context/package-info.java b/src/main/java/twilightforest/world/components/layer/vanillalegacy/context/package-info.java new file mode 100644 index 0000000000..eafaa67bb9 --- /dev/null +++ b/src/main/java/twilightforest/world/components/layer/vanillalegacy/context/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.world.components.layer.vanillalegacy.context; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/world/components/layer/vanillalegacy/package-info.java b/src/main/java/twilightforest/world/components/layer/vanillalegacy/package-info.java new file mode 100644 index 0000000000..4cd1c8ba71 --- /dev/null +++ b/src/main/java/twilightforest/world/components/layer/vanillalegacy/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.world.components.layer.vanillalegacy; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/world/components/layer/vanillalegacy/traits/AreaTransformer0.java b/src/main/java/twilightforest/world/components/layer/vanillalegacy/traits/AreaTransformer0.java new file mode 100644 index 0000000000..c0910e8693 --- /dev/null +++ b/src/main/java/twilightforest/world/components/layer/vanillalegacy/traits/AreaTransformer0.java @@ -0,0 +1,18 @@ +package twilightforest.world.components.layer.vanillalegacy.traits; + +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.biome.Biome; +import twilightforest.world.components.layer.vanillalegacy.Area; +import twilightforest.world.components.layer.vanillalegacy.context.BigContext; +import twilightforest.world.components.layer.vanillalegacy.context.Context; + +public interface AreaTransformer0 { + default R run(BigContext context) { + return context.createResult((x, z) -> { + context.initRandom(x, z); + return this.applyPixel(context, x, z); + }); + } + + ResourceKey applyPixel(Context context, int x, int z); +} diff --git a/src/main/java/twilightforest/world/components/layer/vanillalegacy/traits/AreaTransformer1.java b/src/main/java/twilightforest/world/components/layer/vanillalegacy/traits/AreaTransformer1.java new file mode 100644 index 0000000000..5c500b8eef --- /dev/null +++ b/src/main/java/twilightforest/world/components/layer/vanillalegacy/traits/AreaTransformer1.java @@ -0,0 +1,17 @@ +package twilightforest.world.components.layer.vanillalegacy.traits; + +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.biome.Biome; +import twilightforest.world.components.layer.vanillalegacy.Area; +import twilightforest.world.components.layer.vanillalegacy.context.BigContext; + +public interface AreaTransformer1 extends DimensionTransformer { + default R run(BigContext context, R area) { + return context.createResult((x, z) -> { + context.initRandom(x, z); + return this.applyPixel(context, area, x, z); + }, area); + } + + ResourceKey applyPixel(BigContext context, Area layer, int x, int z); +} \ No newline at end of file diff --git a/src/main/java/twilightforest/world/components/layer/vanillalegacy/traits/AreaTransformer2.java b/src/main/java/twilightforest/world/components/layer/vanillalegacy/traits/AreaTransformer2.java new file mode 100644 index 0000000000..9b708e4d64 --- /dev/null +++ b/src/main/java/twilightforest/world/components/layer/vanillalegacy/traits/AreaTransformer2.java @@ -0,0 +1,18 @@ +package twilightforest.world.components.layer.vanillalegacy.traits; + +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.biome.Biome; +import twilightforest.world.components.layer.vanillalegacy.Area; +import twilightforest.world.components.layer.vanillalegacy.context.BigContext; +import twilightforest.world.components.layer.vanillalegacy.context.Context; + +public interface AreaTransformer2 extends DimensionTransformer { + default R run(BigContext context, R area1, R area2) { + return context.createResult((x, z) -> { + context.initRandom(x, z); + return this.applyPixel(context, area1, area2, x, z); + }, area1, area2); + } + + ResourceKey applyPixel(Context context, Area layer1, Area layer2, int x, int z); +} diff --git a/src/main/java/twilightforest/world/components/layer/vanillalegacy/traits/CastleTransformer.java b/src/main/java/twilightforest/world/components/layer/vanillalegacy/traits/CastleTransformer.java new file mode 100644 index 0000000000..eeb5c446d9 --- /dev/null +++ b/src/main/java/twilightforest/world/components/layer/vanillalegacy/traits/CastleTransformer.java @@ -0,0 +1,16 @@ +package twilightforest.world.components.layer.vanillalegacy.traits; + +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.biome.Biome; +import twilightforest.world.components.layer.vanillalegacy.Area; +import twilightforest.world.components.layer.vanillalegacy.context.BigContext; +import twilightforest.world.components.layer.vanillalegacy.context.Context; + +public interface CastleTransformer extends AreaTransformer1, DimensionOffset1Transformer { + ResourceKey apply(Context context, ResourceKey up, ResourceKey right, ResourceKey down, ResourceKey left, ResourceKey center); + + @Override + default ResourceKey applyPixel(BigContext context, Area layer, int x, int z) { + return this.apply(context, layer.getBiome(this.getParentX(x + 1), this.getParentY(z)), layer.getBiome(this.getParentX(x + 2), this.getParentY(z + 1)), layer.getBiome(this.getParentX(x + 1), this.getParentY(z + 2)), layer.getBiome(this.getParentX(x), this.getParentY(z + 1)), layer.getBiome(this.getParentX(x + 1), this.getParentY(z + 1))); + } +} diff --git a/src/main/java/twilightforest/world/components/layer/vanillalegacy/traits/DimensionOffset0Transformer.java b/src/main/java/twilightforest/world/components/layer/vanillalegacy/traits/DimensionOffset0Transformer.java new file mode 100644 index 0000000000..d6a7ca8782 --- /dev/null +++ b/src/main/java/twilightforest/world/components/layer/vanillalegacy/traits/DimensionOffset0Transformer.java @@ -0,0 +1,13 @@ +package twilightforest.world.components.layer.vanillalegacy.traits; + +public interface DimensionOffset0Transformer extends DimensionTransformer { + @Override + default int getParentX(int x) { + return x; + } + + @Override + default int getParentY(int z) { + return z; + } +} diff --git a/src/main/java/twilightforest/world/components/layer/vanillalegacy/traits/DimensionOffset1Transformer.java b/src/main/java/twilightforest/world/components/layer/vanillalegacy/traits/DimensionOffset1Transformer.java new file mode 100644 index 0000000000..8ea030fb91 --- /dev/null +++ b/src/main/java/twilightforest/world/components/layer/vanillalegacy/traits/DimensionOffset1Transformer.java @@ -0,0 +1,13 @@ +package twilightforest.world.components.layer.vanillalegacy.traits; + +public interface DimensionOffset1Transformer extends DimensionTransformer { + @Override + default int getParentX(int x) { + return x - 1; + } + + @Override + default int getParentY(int z) { + return z - 1; + } +} diff --git a/src/main/java/twilightforest/world/components/layer/vanillalegacy/traits/DimensionTransformer.java b/src/main/java/twilightforest/world/components/layer/vanillalegacy/traits/DimensionTransformer.java new file mode 100644 index 0000000000..f2ed90e176 --- /dev/null +++ b/src/main/java/twilightforest/world/components/layer/vanillalegacy/traits/DimensionTransformer.java @@ -0,0 +1,7 @@ +package twilightforest.world.components.layer.vanillalegacy.traits; + +public interface DimensionTransformer { + int getParentX(int x); + + int getParentY(int z); +} diff --git a/src/main/java/twilightforest/world/components/layer/vanillalegacy/traits/package-info.java b/src/main/java/twilightforest/world/components/layer/vanillalegacy/traits/package-info.java new file mode 100644 index 0000000000..3b386a83ee --- /dev/null +++ b/src/main/java/twilightforest/world/components/layer/vanillalegacy/traits/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.world.components.layer.vanillalegacy.traits; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/world/components/package-info.java b/src/main/java/twilightforest/world/components/package-info.java new file mode 100644 index 0000000000..fa92aea9a1 --- /dev/null +++ b/src/main/java/twilightforest/world/components/package-info.java @@ -0,0 +1,6 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.world.components; + +import net.minecraft.MethodsReturnNonnullByDefault; +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/world/components/placements/AvoidLandmarkModifier.java b/src/main/java/twilightforest/world/components/placements/AvoidLandmarkModifier.java new file mode 100644 index 0000000000..e2029dff76 --- /dev/null +++ b/src/main/java/twilightforest/world/components/placements/AvoidLandmarkModifier.java @@ -0,0 +1,82 @@ +package twilightforest.world.components.placements; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.DataResult; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.BlockPos; +import net.minecraft.core.SectionPos; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.levelgen.placement.PlacementContext; +import net.minecraft.world.level.levelgen.placement.PlacementModifier; +import net.minecraft.world.level.levelgen.placement.PlacementModifierType; +import net.minecraft.world.level.levelgen.structure.StructureStart; +import twilightforest.init.TFFeatureModifiers; +import twilightforest.util.LandmarkUtil; +import twilightforest.util.LegacyLandmarkPlacements; +import twilightforest.world.components.chunkgenerators.ChunkGeneratorTwilight; +import twilightforest.world.components.structures.util.DecorationClearance; + +import java.util.Optional; +import java.util.stream.Stream; + +public class AvoidLandmarkModifier extends PlacementModifier { + + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + Codec.BOOL.fieldOf("occupies_surface").forGetter(o -> o.occupiesSurface), + Codec.BOOL.fieldOf("occupies_underground").forGetter(o -> o.occupiesUnderground), + Codec.INT.fieldOf("additional_clearance").forGetter(o -> o.additionalClearance) + ).apply(instance, AvoidLandmarkModifier::new)).flatXmap(AvoidLandmarkModifier::validate, AvoidLandmarkModifier::validate); + + private final boolean occupiesSurface; + private final boolean occupiesUnderground; + private final int additionalClearance; + + public AvoidLandmarkModifier(boolean occupiesSurface, boolean occupiesUnderground, int additionalClearance) { + this.occupiesSurface = occupiesSurface; + this.occupiesUnderground = occupiesUnderground; + this.additionalClearance = additionalClearance; + } + + public static AvoidLandmarkModifier checkSurface() { + return new AvoidLandmarkModifier(true, false, 0); + } + + public static AvoidLandmarkModifier checkUnderground() { + return new AvoidLandmarkModifier(false, true, 0); + } + + public static AvoidLandmarkModifier checkBoth() { + return new AvoidLandmarkModifier(true, true, 0); + } + + @Override + public Stream getPositions(PlacementContext worldDecoratingHelper, RandomSource random, BlockPos blockPos) { + if (!(worldDecoratingHelper.getLevel().getLevel().getChunkSource().getGenerator() instanceof ChunkGeneratorTwilight)) + return Stream.of(blockPos); + + // Feature Center + BlockPos.MutableBlockPos featurePos = LegacyLandmarkPlacements.getNearestCenterXZ(blockPos.getX() >> 4, blockPos.getZ() >> 4).mutable(); + + Optional possibleStructureStart = LandmarkUtil.locateNearestLandmarkStart(worldDecoratingHelper.getLevel(), SectionPos.blockToSectionCoord(featurePos.getX()), SectionPos.blockToSectionCoord(featurePos.getZ())); + if (possibleStructureStart.isEmpty() || !(possibleStructureStart.get().getStructure() instanceof DecorationClearance decorationClearance)) + return Stream.of(blockPos); + + if ((!this.occupiesSurface || decorationClearance.isSurfaceDecorationsAllowed()) && (!this.occupiesUnderground || decorationClearance.isUndergroundDecoAllowed())) + return Stream.of(blockPos); + + // Turn Feature Center into Feature Offset + featurePos.set(Math.abs(featurePos.getX() - blockPos.getX()), 0, Math.abs(featurePos.getZ() - blockPos.getZ())); + int size = decorationClearance.chunkClearanceRadius() * 16 + this.additionalClearance; + + return featurePos.getX() < size && featurePos.getZ() < size ? Stream.empty() : Stream.of(blockPos); + } + + @Override + public PlacementModifierType type() { + return TFFeatureModifiers.NO_STRUCTURE.get(); + } + + private static DataResult validate(AvoidLandmarkModifier config) { + return config.occupiesSurface || config.occupiesUnderground ? DataResult.success(config) : DataResult.error(() -> "Feature Decorator cannot occupy neither surface nor underground"); + } +} diff --git a/src/main/java/twilightforest/world/components/placements/ChunkBlanketingModifier.java b/src/main/java/twilightforest/world/components/placements/ChunkBlanketingModifier.java new file mode 100644 index 0000000000..4d2f194b7b --- /dev/null +++ b/src/main/java/twilightforest/world/components/placements/ChunkBlanketingModifier.java @@ -0,0 +1,76 @@ +package twilightforest.world.components.placements; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Registry; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.levelgen.Heightmap; +import net.minecraft.world.level.levelgen.placement.PlacementContext; +import net.minecraft.world.level.levelgen.placement.PlacementModifier; +import net.minecraft.world.level.levelgen.placement.PlacementModifierType; +import twilightforest.TwilightForestMod; +import twilightforest.init.TFFeatureModifiers; + +import java.util.ArrayList; +import java.util.Optional; +import java.util.stream.Stream; + +// Ideally, you should not be mixing this with other decorators unless you know what you're doing +// This litters memory with 64 block positions for each chunk. USE SPARINGLY +public class ChunkBlanketingModifier extends PlacementModifier { + + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + Codec.floatRange(0.0f, 1.0f).fieldOf("integrity").forGetter(o -> o.integrity), + Heightmap.Types.CODEC.fieldOf("heightmap").forGetter(o -> o.heightmap), + ResourceLocation.CODEC.optionalFieldOf("biome_lock").forGetter(o -> o.biomeRLOptional) + ).apply(instance, ChunkBlanketingModifier::new)); + + public final float integrity; + public final Heightmap.Types heightmap; + public final Optional biomeRLOptional; + + public ChunkBlanketingModifier(float integrity, Heightmap.Types heightmap, Optional biomeRLOptional) { + this.integrity = integrity; + this.heightmap = heightmap; + this.biomeRLOptional = biomeRLOptional; + } + + public static ChunkBlanketingModifier addThorns() { + return new ChunkBlanketingModifier(0.7f, Heightmap.Types.OCEAN_FLOOR_WG, Optional.of(TwilightForestMod.prefix("thornlands"))); + } + + @Override + public Stream getPositions(PlacementContext context, RandomSource random, BlockPos placement) { + int chunkOriginX = placement.getX() & 0xfffffff0; + int chunkOriginZ = placement.getZ() & 0xfffffff0; + + ArrayList coordinates = new ArrayList<>(); + + for (int zInChunk = 0; zInChunk < 16; zInChunk++) { + for (int xInChunk = 0; xInChunk < 16; xInChunk++) { + if (random.nextFloat() > integrity) + continue; + + BlockPos pos = new BlockPos(chunkOriginX + xInChunk, context.getHeight(heightmap, chunkOriginX + xInChunk, chunkOriginZ + zInChunk), chunkOriginZ + zInChunk); + + if (biomeRLOptional.isPresent()) { + if (biomeRLOptional.get().equals(context.getLevel().registryAccess().registryOrThrow(Registries.BIOME).getKey(context.getLevel().getBiome(pos).get()))) { + coordinates.add(pos); + } + } else { + coordinates.add(pos); + } + } + } + + return coordinates.stream(); + } + + @Override + public PlacementModifierType type() { + return TFFeatureModifiers.CHUNK_BLANKETING.get(); + } +} diff --git a/src/main/java/twilightforest/world/components/placements/ChunkCenterModifier.java b/src/main/java/twilightforest/world/components/placements/ChunkCenterModifier.java new file mode 100644 index 0000000000..4390cadab2 --- /dev/null +++ b/src/main/java/twilightforest/world/components/placements/ChunkCenterModifier.java @@ -0,0 +1,29 @@ +package twilightforest.world.components.placements; + +import com.mojang.serialization.Codec; +import net.minecraft.core.BlockPos; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.levelgen.placement.PlacementContext; +import net.minecraft.world.level.levelgen.placement.PlacementModifier; +import net.minecraft.world.level.levelgen.placement.PlacementModifierType; +import twilightforest.init.TFFeatureModifiers; + +import java.util.stream.Stream; + +public class ChunkCenterModifier extends PlacementModifier { + private static final ChunkCenterModifier INSTANCE = new ChunkCenterModifier(); + public static final Codec CODEC = Codec.unit(() -> INSTANCE); + + public static ChunkCenterModifier center() { + return INSTANCE; + } + @Override + public Stream getPositions(PlacementContext ctx, RandomSource random, BlockPos pos) { + return Stream.of(new BlockPos((pos.getX() & 0xfffffff0) + 8, pos.getY(), (pos.getZ() & 0xfffffff0) + 8)); + } + + @Override + public PlacementModifierType type() { + return TFFeatureModifiers.CHUNK_CENTERER.get(); + } +} diff --git a/src/main/java/twilightforest/world/components/placements/package-info.java b/src/main/java/twilightforest/world/components/placements/package-info.java new file mode 100644 index 0000000000..59d3926746 --- /dev/null +++ b/src/main/java/twilightforest/world/components/placements/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.world.components.placements; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/world/components/processors/BoxCuttingProcessor.java b/src/main/java/twilightforest/world/components/processors/BoxCuttingProcessor.java new file mode 100644 index 0000000000..667c1728ba --- /dev/null +++ b/src/main/java/twilightforest/world/components/processors/BoxCuttingProcessor.java @@ -0,0 +1,74 @@ +package twilightforest.world.components.processors; + +import com.mojang.serialization.Codec; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.Tag; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructurePlaceSettings; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureProcessor; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureProcessorType; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; +import twilightforest.TwilightForestMod; +import twilightforest.util.BoundingBoxUtils; +import twilightforest.init.TFStructureProcessors; + +import org.jetbrains.annotations.Nullable; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +// Despite the name, any facts about actual Box Cutters being involved are lies +public final class BoxCuttingProcessor extends StructureProcessor { + public static final Codec CODEC = BoundingBox.CODEC.listOf().xmap(BoxCuttingProcessor::new, p -> p.cutouts); + + public final List cutouts; + + public BoxCuttingProcessor(List cutouts) { + this.cutouts = cutouts; + } + + @Nullable + @Override + public StructureTemplate.StructureBlockInfo process(LevelReader level, BlockPos origin, BlockPos centerBottom, StructureTemplate.StructureBlockInfo originalBlockInfo, StructureTemplate.StructureBlockInfo modifiedBlockInfo, StructurePlaceSettings settings, @Nullable StructureTemplate template) { + for (BoundingBox cutout : this.cutouts) + if (cutout.isInside(modifiedBlockInfo.pos)) + return null; + + return modifiedBlockInfo; + } + + @Override + protected StructureProcessorType getType() { + return TFStructureProcessors.BOX_CUTTING_PROCESSOR.get(); + } + + public static BoxCuttingProcessor fromNBT(ListTag tag) { + List boxes = new ArrayList<>(); + + for (Tag tagElement : tag) { + if (!(tagElement instanceof CompoundTag boxCompound)) continue; + + try { + boxes.add(BoundingBoxUtils.NBTToBoundingBox(boxCompound)); + } catch (Throwable e) { + TwilightForestMod.LOGGER.error("Invalid BoundingBox found in list", e); + } + } + + return new BoxCuttingProcessor(boxes); + } + + public static BoxCuttingProcessor forLichTower(Map sideTowerStarts) { + return new BoxCuttingProcessor(sideTowerStarts + .entrySet() + .stream() + .map(e -> BoundingBox.fromCorners(e.getKey(), e.getKey().relative(e.getValue(), 1).relative(e.getValue().getClockWise(), 4).above(6))) + .collect(Collectors.toList()) + ); + } +} diff --git a/src/main/java/twilightforest/world/components/processors/CobbleVariants.java b/src/main/java/twilightforest/world/components/processors/CobbleVariants.java new file mode 100644 index 0000000000..9b466f4fd1 --- /dev/null +++ b/src/main/java/twilightforest/world/components/processors/CobbleVariants.java @@ -0,0 +1,55 @@ +package twilightforest.world.components.processors; + +import com.mojang.serialization.Codec; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureProcessor; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureProcessorType; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructurePlaceSettings; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; +import twilightforest.util.FeaturePlacers; +import twilightforest.init.TFStructureProcessors; + +import org.jetbrains.annotations.Nullable; + +public final class CobbleVariants extends StructureProcessor { + public static final CobbleVariants INSTANCE = new CobbleVariants(); + public static final Codec CODEC = Codec.unit(() -> INSTANCE); + + private CobbleVariants() { + } + + @Override + public StructureTemplate.StructureBlockInfo process(LevelReader worldReaderIn, BlockPos pos, BlockPos piecepos, StructureTemplate.StructureBlockInfo p_215194_3_, StructureTemplate.StructureBlockInfo modifiedBlockInfo, StructurePlaceSettings settings, @Nullable StructureTemplate template) { + RandomSource random = settings.getRandom(modifiedBlockInfo.pos); + + // We use nextBoolean in other processors so this lets us re-seed deterministically + random.setSeed(random.nextLong() * 2); + + BlockState state = modifiedBlockInfo.state; + Block block = state.getBlock(); + + if (block == Blocks.COBBLESTONE && random.nextBoolean()) + return new StructureTemplate.StructureBlockInfo(modifiedBlockInfo.pos, Blocks.MOSSY_COBBLESTONE.defaultBlockState(), null); + + if (block == Blocks.COBBLESTONE_STAIRS && random.nextBoolean()) + return new StructureTemplate.StructureBlockInfo(modifiedBlockInfo.pos, FeaturePlacers.transferAllStateKeys(state, Blocks.MOSSY_COBBLESTONE_STAIRS), null); + + if (block == Blocks.COBBLESTONE_SLAB && random.nextBoolean()) + return new StructureTemplate.StructureBlockInfo(modifiedBlockInfo.pos, FeaturePlacers.transferAllStateKeys(state, Blocks.MOSSY_COBBLESTONE_SLAB), null); + + if (block == Blocks.COBBLESTONE_WALL && random.nextBoolean()) + return new StructureTemplate.StructureBlockInfo(modifiedBlockInfo.pos, FeaturePlacers.transferAllStateKeys(state, Blocks.MOSSY_COBBLESTONE_WALL), null); + + return modifiedBlockInfo; + } + + @Override + protected StructureProcessorType getType() { + return TFStructureProcessors.COBBLE_VARIANTS.get(); + } +} diff --git a/src/main/java/twilightforest/world/components/processors/NagastoneVariants.java b/src/main/java/twilightforest/world/components/processors/NagastoneVariants.java new file mode 100644 index 0000000000..160a8b39e5 --- /dev/null +++ b/src/main/java/twilightforest/world/components/processors/NagastoneVariants.java @@ -0,0 +1,55 @@ +package twilightforest.world.components.processors; + +import com.mojang.serialization.Codec; +import net.minecraft.core.BlockPos; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructurePlaceSettings; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureProcessor; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureProcessorType; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; +import twilightforest.init.TFBlocks; +import twilightforest.util.FeaturePlacers; +import twilightforest.init.TFStructureProcessors; + +import org.jetbrains.annotations.Nullable; + +public final class NagastoneVariants extends StructureProcessor { + public static final NagastoneVariants INSTANCE = new NagastoneVariants(); + public static final Codec CODEC = Codec.unit(() -> INSTANCE); + + private NagastoneVariants() { + } + + @Override + public StructureTemplate.StructureBlockInfo process(LevelReader worldIn, BlockPos pos, BlockPos piecepos, StructureTemplate.StructureBlockInfo oldInfo, StructureTemplate.StructureBlockInfo modifiedBlockInfo, StructurePlaceSettings settings, @Nullable StructureTemplate template) { + RandomSource random = settings.getRandom(modifiedBlockInfo.pos); + + // We use nextBoolean in other processors so this lets us re-seed deterministically + random.setSeed(random.nextLong() * 5); + + BlockState state = modifiedBlockInfo.state; + Block block = state.getBlock(); + + if (block == TFBlocks.ETCHED_NAGASTONE.get() && random.nextBoolean()) + return new StructureTemplate.StructureBlockInfo(modifiedBlockInfo.pos, FeaturePlacers.transferAllStateKeys(state, random.nextBoolean() ? TFBlocks.MOSSY_ETCHED_NAGASTONE.get() : TFBlocks.CRACKED_ETCHED_NAGASTONE.get()), null); + + if (block == TFBlocks.NAGASTONE_PILLAR.get() && random.nextBoolean()) + return new StructureTemplate.StructureBlockInfo(modifiedBlockInfo.pos, FeaturePlacers.transferAllStateKeys(state, random.nextBoolean() ? TFBlocks.MOSSY_NAGASTONE_PILLAR.get() : TFBlocks.CRACKED_NAGASTONE_PILLAR.get()), null); + + if (block == TFBlocks.NAGASTONE_STAIRS_LEFT.get() && random.nextBoolean()) + return new StructureTemplate.StructureBlockInfo(modifiedBlockInfo.pos, FeaturePlacers.transferAllStateKeys(state, random.nextBoolean() ? TFBlocks.MOSSY_NAGASTONE_STAIRS_LEFT.get() : TFBlocks.CRACKED_NAGASTONE_STAIRS_LEFT.get()), null); + + if (block == TFBlocks.NAGASTONE_STAIRS_RIGHT.get() && random.nextBoolean()) + return new StructureTemplate.StructureBlockInfo(modifiedBlockInfo.pos, FeaturePlacers.transferAllStateKeys(state, random.nextBoolean() ? TFBlocks.MOSSY_NAGASTONE_STAIRS_RIGHT.get() : TFBlocks.CRACKED_NAGASTONE_STAIRS_RIGHT.get()), null); + + return modifiedBlockInfo; + } + + @Override + public StructureProcessorType getType() { + return TFStructureProcessors.NAGASTONE_VARIANTS.get(); + } +} diff --git a/src/main/java/twilightforest/world/components/processors/SmartGrassProcessor.java b/src/main/java/twilightforest/world/components/processors/SmartGrassProcessor.java new file mode 100644 index 0000000000..4d7f61868a --- /dev/null +++ b/src/main/java/twilightforest/world/components/processors/SmartGrassProcessor.java @@ -0,0 +1,54 @@ +package twilightforest.world.components.processors; + +import com.mojang.serialization.Codec; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.tags.BlockTags; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructurePlaceSettings; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureProcessor; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureProcessorType; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; +import twilightforest.init.TFBlocks; +import twilightforest.util.RotationUtil; +import twilightforest.init.TFStructureProcessors; + +import org.jetbrains.annotations.Nullable; + +public class SmartGrassProcessor extends StructureProcessor { + public static final SmartGrassProcessor INSTANCE = new SmartGrassProcessor(); + public static final Codec CODEC = Codec.unit(() -> INSTANCE); + + private SmartGrassProcessor() { + } + + @Nullable + @Override + public StructureTemplate.StructureBlockInfo process(LevelReader level, BlockPos origin, BlockPos centerBottom, StructureTemplate.StructureBlockInfo originalBlockInfo, StructureTemplate.StructureBlockInfo modifiedBlockInfo, StructurePlaceSettings settings, @Nullable StructureTemplate template) { + if (originalBlockInfo.state.getBlock() != Blocks.GRASS_BLOCK) + return modifiedBlockInfo; + + if (level.getBlockState(modifiedBlockInfo.pos).is(BlockTags.DIRT) || !level.isEmptyBlock(modifiedBlockInfo.pos.above())) + return null; + + for (Direction direction : RotationUtil.CARDINALS) { + BlockState stateAt = level.getBlockState(modifiedBlockInfo.pos.relative(direction)); + + if (stateAt.getBlock() == Blocks.PODZOL) return new StructureTemplate.StructureBlockInfo(modifiedBlockInfo.pos, Blocks.PODZOL.defaultBlockState(), null); + if (stateAt.getBlock() == Blocks.GRASS_BLOCK) return modifiedBlockInfo; + if (stateAt.getBlock() == Blocks.MYCELIUM) return new StructureTemplate.StructureBlockInfo(modifiedBlockInfo.pos, Blocks.MYCELIUM.defaultBlockState(), null); + if (stateAt.getBlock() == Blocks.DIRT_PATH) return new StructureTemplate.StructureBlockInfo(modifiedBlockInfo.pos, Blocks.DIRT_PATH.defaultBlockState(), null); + if (stateAt.getBlock() == Blocks.COARSE_DIRT) return new StructureTemplate.StructureBlockInfo(modifiedBlockInfo.pos, Blocks.COARSE_DIRT.defaultBlockState(), null); + if (stateAt.getBlock() == TFBlocks.UBEROUS_SOIL.get()) return new StructureTemplate.StructureBlockInfo(modifiedBlockInfo.pos, TFBlocks.UBEROUS_SOIL.get().defaultBlockState(), null); + } + + return modifiedBlockInfo; + } + + @Override + protected StructureProcessorType getType() { + return TFStructureProcessors.SMART_GRASS.get(); + } +} diff --git a/src/main/java/twilightforest/world/components/processors/SmoothStoneVariants.java b/src/main/java/twilightforest/world/components/processors/SmoothStoneVariants.java new file mode 100644 index 0000000000..d5f13e5452 --- /dev/null +++ b/src/main/java/twilightforest/world/components/processors/SmoothStoneVariants.java @@ -0,0 +1,44 @@ +package twilightforest.world.components.processors; + +import com.mojang.serialization.Codec; +import net.minecraft.core.BlockPos; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructurePlaceSettings; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureProcessor; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureProcessorType; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; +import twilightforest.util.FeaturePlacers; +import twilightforest.init.TFStructureProcessors; + +import org.jetbrains.annotations.Nullable; + +public class SmoothStoneVariants extends StructureProcessor { + public static final SmoothStoneVariants INSTANCE = new SmoothStoneVariants(); + public static final Codec CODEC = Codec.unit(() -> INSTANCE); + + private SmoothStoneVariants() { + } + + @Override + public StructureTemplate.StructureBlockInfo process(LevelReader level, BlockPos origin, BlockPos centerBottom, StructureTemplate.StructureBlockInfo originalBlockInfo, StructureTemplate.StructureBlockInfo modifiedBlockInfo, StructurePlaceSettings settings, @Nullable StructureTemplate template) { + RandomSource random = settings.getRandom(modifiedBlockInfo.pos); + + // We use nextBoolean in other processors so this lets us re-seed deterministically + random.setSeed(random.nextLong() * 4); + + if (modifiedBlockInfo.state.getBlock() == Blocks.SMOOTH_STONE_SLAB && random.nextBoolean()) + return new StructureTemplate.StructureBlockInfo(modifiedBlockInfo.pos, FeaturePlacers.transferAllStateKeys(modifiedBlockInfo.state, Blocks.COBBLESTONE_SLAB), null); + + if (modifiedBlockInfo.state.getBlock() == Blocks.SMOOTH_STONE && random.nextBoolean()) + return new StructureTemplate.StructureBlockInfo(modifiedBlockInfo.pos, Blocks.COBBLESTONE.defaultBlockState(), null); + + return modifiedBlockInfo; + } + + @Override + protected StructureProcessorType getType() { + return TFStructureProcessors.SMOOTH_STONE_VARIANTS.get(); + } +} diff --git a/src/main/java/twilightforest/world/components/processors/StateTransfiguringProcessor.java b/src/main/java/twilightforest/world/components/processors/StateTransfiguringProcessor.java new file mode 100644 index 0000000000..d33177ceaa --- /dev/null +++ b/src/main/java/twilightforest/world/components/processors/StateTransfiguringProcessor.java @@ -0,0 +1,51 @@ +package twilightforest.world.components.processors; + +import com.mojang.serialization.Codec; +import net.minecraft.core.BlockPos; +import net.minecraft.util.Mth; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.structure.templatesystem.*; +import twilightforest.init.TFStructureProcessors; +import twilightforest.util.FeaturePlacers; + +import javax.annotation.Nullable; +import java.util.Collections; +import java.util.List; + +// Similar to RuleProcessor except it uses the ProcessorRule's output state as a template for transferring BlockStates onto, with FeaturePlacers.transferAllStateKeys(...) +// Despite definitions for BlockStates being supported by the schema, they merely are defaults to be overwritten from the input block's states +public class StateTransfiguringProcessor extends StructureProcessor { + public static final Codec CODEC = ProcessorRule.CODEC.listOf().fieldOf("rules").xmap(StateTransfiguringProcessor::new, p -> p.rules).codec(); + private final List rules; + + public StateTransfiguringProcessor(List rules) { + this.rules = Collections.unmodifiableList(rules); + } + + @Nullable + @Override + public StructureTemplate.StructureBlockInfo process(LevelReader level, BlockPos origin, BlockPos centerBottom, StructureTemplate.StructureBlockInfo originalBlockInfo, StructureTemplate.StructureBlockInfo modifiedBlockInfo, StructurePlaceSettings settings, @Nullable StructureTemplate template) { + BlockState state = level.getBlockState(modifiedBlockInfo.pos); + + RandomSource random = RandomSource.create(Mth.getSeed(modifiedBlockInfo.pos)); + long i = random.nextLong(); + // Re-seed the random source for each loop iteration, the positional seed defines the initial random value + for (ProcessorRule processorRule : this.rules) { + // For better randomness while maintaining determinism, especially for 'binary' outcomes depending on 50% chances + random.setSeed(i * 3); + i += 115; + + if (processorRule.test(modifiedBlockInfo.state, state, originalBlockInfo.pos, modifiedBlockInfo.pos, centerBottom, random)) + return new StructureTemplate.StructureBlockInfo(modifiedBlockInfo.pos, FeaturePlacers.transferAllStateKeys(modifiedBlockInfo.state, processorRule.getOutputState()), processorRule.getOutputTag()); + } + + return modifiedBlockInfo; + } + + @Override + protected StructureProcessorType getType() { + return TFStructureProcessors.STATE_TRANSFIGURING.get(); + } +} diff --git a/src/main/java/twilightforest/world/components/processors/StoneBricksVariants.java b/src/main/java/twilightforest/world/components/processors/StoneBricksVariants.java new file mode 100644 index 0000000000..7566599ebe --- /dev/null +++ b/src/main/java/twilightforest/world/components/processors/StoneBricksVariants.java @@ -0,0 +1,55 @@ +package twilightforest.world.components.processors; + +import com.mojang.serialization.Codec; +import net.minecraft.core.BlockPos; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructurePlaceSettings; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureProcessor; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureProcessorType; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; +import twilightforest.util.FeaturePlacers; +import twilightforest.init.TFStructureProcessors; + +import org.jetbrains.annotations.Nullable; + +public final class StoneBricksVariants extends StructureProcessor { + public static final StoneBricksVariants INSTANCE = new StoneBricksVariants(); + public static final Codec CODEC = Codec.unit(() -> INSTANCE); + + private StoneBricksVariants() { + } + + @Override + public StructureTemplate.StructureBlockInfo process(LevelReader worldReaderIn, BlockPos pos, BlockPos piecepos, StructureTemplate.StructureBlockInfo originalBlock, StructureTemplate.StructureBlockInfo modifiedBlockInfo, StructurePlaceSettings settings, @Nullable StructureTemplate template) { + RandomSource random = settings.getRandom(modifiedBlockInfo.pos); + + // We use nextBoolean in other processors so this lets us re-seed deterministically + random.setSeed(random.nextLong() * 3); + + BlockState state = modifiedBlockInfo.state; + Block block = state.getBlock(); + + if (block == Blocks.STONE_BRICKS && random.nextBoolean()) + return new StructureTemplate.StructureBlockInfo(modifiedBlockInfo.pos, random.nextBoolean() ? Blocks.MOSSY_STONE_BRICKS.defaultBlockState() : Blocks.CRACKED_STONE_BRICKS.defaultBlockState(), null); + + if (block == Blocks.STONE_BRICK_STAIRS && random.nextBoolean()) + return new StructureTemplate.StructureBlockInfo(modifiedBlockInfo.pos, FeaturePlacers.transferAllStateKeys(state, Blocks.MOSSY_STONE_BRICK_STAIRS), null); + + if (block == Blocks.STONE_BRICK_SLAB && random.nextBoolean()) + return new StructureTemplate.StructureBlockInfo(modifiedBlockInfo.pos, FeaturePlacers.transferAllStateKeys(state, Blocks.MOSSY_STONE_BRICK_SLAB), null); + + if (block == Blocks.STONE_BRICK_WALL && random.nextBoolean()) + return new StructureTemplate.StructureBlockInfo(modifiedBlockInfo.pos, FeaturePlacers.transferAllStateKeys(state, Blocks.MOSSY_STONE_BRICK_WALL), null); + + return modifiedBlockInfo; + } + + @Override + protected StructureProcessorType getType() { + return TFStructureProcessors.STONE_BRICK_VARIANTS.get(); + } +} diff --git a/src/main/java/twilightforest/world/components/processors/TargetedRotProcessor.java b/src/main/java/twilightforest/world/components/processors/TargetedRotProcessor.java new file mode 100644 index 0000000000..b2153045c4 --- /dev/null +++ b/src/main/java/twilightforest/world/components/processors/TargetedRotProcessor.java @@ -0,0 +1,39 @@ +package twilightforest.world.components.processors; + +import com.google.common.collect.ImmutableSet; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.structure.templatesystem.*; +import twilightforest.init.TFStructureProcessors; + +import org.jetbrains.annotations.Nullable; +import java.util.ArrayList; + +public final class TargetedRotProcessor extends BlockRotProcessor { + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + BlockState.CODEC.listOf().xmap(ImmutableSet::copyOf, ArrayList::new).fieldOf("blocks_to_rot").forGetter(p -> p.blocksToRot), + Codec.FLOAT.fieldOf("integrity").orElse(1.0f).forGetter(p -> p.integrity) + ).apply(instance, TargetedRotProcessor::new)); + + private final ImmutableSet blocksToRot; + + public TargetedRotProcessor(ImmutableSet blocksToRot, float integrity) { + super(integrity); + this.blocksToRot = blocksToRot; + } + + @Nullable + @Override + public StructureTemplate.StructureBlockInfo process(LevelReader level, BlockPos origin, BlockPos centerBottom, StructureTemplate.StructureBlockInfo originalBlockInfo, StructureTemplate.StructureBlockInfo modifiedBlockInfo, StructurePlaceSettings settings, @Nullable StructureTemplate template) { + if (!this.blocksToRot.contains(modifiedBlockInfo.state)) return modifiedBlockInfo; + return super.processBlock(level, origin, centerBottom, originalBlockInfo, modifiedBlockInfo, settings); + } + + @Override + protected StructureProcessorType getType() { + return TFStructureProcessors.TARGETED_ROT.get(); + } +} diff --git a/src/main/java/twilightforest/world/components/processors/WoodPaletteSwizzle.java b/src/main/java/twilightforest/world/components/processors/WoodPaletteSwizzle.java new file mode 100644 index 0000000000..1bb9b66f7b --- /dev/null +++ b/src/main/java/twilightforest/world/components/processors/WoodPaletteSwizzle.java @@ -0,0 +1,41 @@ +package twilightforest.world.components.processors; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Holder; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructurePlaceSettings; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureProcessor; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureProcessorType; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; +import twilightforest.init.custom.WoodPalettes; +import twilightforest.util.WoodPalette; +import twilightforest.init.TFStructureProcessors; + +import org.jetbrains.annotations.Nullable; + +public final class WoodPaletteSwizzle extends StructureProcessor { + private final Holder targetPalette; + private final Holder replacementPalette; + + public static final Codec CODEC = RecordCodecBuilder.create((instance) -> instance.group( + WoodPalettes.CODEC.fieldOf("target_palette").forGetter(s -> s.targetPalette), + WoodPalettes.CODEC.fieldOf("replacement_palette").forGetter(s -> s.replacementPalette) + ).apply(instance, WoodPaletteSwizzle::new)); + + public WoodPaletteSwizzle(Holder targetPalette, Holder replacementPalette) { + this.targetPalette = targetPalette; + this.replacementPalette = replacementPalette; + } + + @Override + public StructureTemplate.StructureBlockInfo process(LevelReader worldIn, BlockPos pos, BlockPos piecepos, StructureTemplate.StructureBlockInfo p_215194_3_, StructureTemplate.StructureBlockInfo blockInfo, StructurePlaceSettings settings, @Nullable StructureTemplate template) { + return this.replacementPalette.get().modifyBlockWithType(this.targetPalette.get(), blockInfo); + } + + @Override + protected StructureProcessorType getType() { + return TFStructureProcessors.PLANK_SWIZZLE.get(); + } +} diff --git a/src/main/java/twilightforest/world/components/processors/package-info.java b/src/main/java/twilightforest/world/components/processors/package-info.java new file mode 100644 index 0000000000..acb4e7fab8 --- /dev/null +++ b/src/main/java/twilightforest/world/components/processors/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.world.components.processors; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/world/components/structures/HedgeMazeComponent.java b/src/main/java/twilightforest/world/components/structures/HedgeMazeComponent.java new file mode 100644 index 0000000000..b4250bfe46 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/HedgeMazeComponent.java @@ -0,0 +1,213 @@ +package twilightforest.world.components.structures; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.CarvedPumpkinBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFEntities; +import twilightforest.loot.TFLootTables; +import twilightforest.util.BoundingBoxUtils; +import twilightforest.init.TFLandmark; +import twilightforest.init.TFStructurePieceTypes; + + +public class HedgeMazeComponent extends TFStructureComponentOld { + + private static final int MSIZE = 16; + private static final int RADIUS = (MSIZE / 2 * 3) + 1; + private static final int DIAMETER = 2 * RADIUS; + private static final int FLOOR_LEVEL = 0; + + public HedgeMazeComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFHedge.get(), nbt); + + this.boundingBox = BoundingBoxUtils.NBTToBoundingBox(nbt); + } + + public HedgeMazeComponent(int i, int x, int y, int z) { + super(TFStructurePieceTypes.TFHedge.get(), i, x, y, z); + + this.setOrientation(Direction.SOUTH); + + // the maze is 50 x 50 for now + this.boundingBox = TFLandmark.getComponentToAddBoundingBox(x, y, z, -RADIUS, -3, -RADIUS, RADIUS * 2, 10, RADIUS * 2, Direction.SOUTH, false); + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + TFMaze maze = new TFMaze(MSIZE, MSIZE); + + maze.oddBias = 2; + maze.torchBlockState = TFBlocks.FIREFLY.get().defaultBlockState(); + maze.wallBlockState = TFBlocks.HEDGE.get().defaultBlockState(); + maze.type = 4; + maze.tall = 3; + maze.roots = 3; + + // set the seed to a fixed value based on this maze's x and z + maze.setSeed(world.getSeed() + (long) this.boundingBox.minX() * this.boundingBox.minZ()); + + // just add grass below the maze for now + // grass underneath + for (int fx = 0; fx <= DIAMETER; fx++) { + for (int fz = 0; fz <= DIAMETER; fz++) { + placeBlock(world, Blocks.GRASS_BLOCK.defaultBlockState(), fx, FLOOR_LEVEL - 1, fz, sbb); + } + } + + BlockState northJacko = Blocks.JACK_O_LANTERN.defaultBlockState().setValue(CarvedPumpkinBlock.FACING, Direction.SOUTH); + BlockState southJacko = Blocks.JACK_O_LANTERN.defaultBlockState().setValue(CarvedPumpkinBlock.FACING, Direction.NORTH); + BlockState westJacko = Blocks.JACK_O_LANTERN.defaultBlockState().setValue(CarvedPumpkinBlock.FACING, Direction.EAST); + BlockState eastJacko = Blocks.JACK_O_LANTERN.defaultBlockState().setValue(CarvedPumpkinBlock.FACING, Direction.WEST); + + // plunk down some jack-o-lanterns outside for decoration + placeBlock(world, westJacko, 0, FLOOR_LEVEL, 24, sbb); + placeBlock(world, westJacko, 0, FLOOR_LEVEL, 29, sbb); + placeBlock(world, eastJacko, 50, FLOOR_LEVEL, 24, sbb); + placeBlock(world, eastJacko, 50, FLOOR_LEVEL, 29, sbb); + + placeBlock(world, northJacko, 24, FLOOR_LEVEL, 0, sbb); + placeBlock(world, northJacko, 29, FLOOR_LEVEL, 0, sbb); + placeBlock(world, southJacko, 24, FLOOR_LEVEL, 50, sbb); + placeBlock(world, southJacko, 29, FLOOR_LEVEL, 50, sbb); + + int nrooms = MSIZE / 3; + int[] rcoords = new int[nrooms * 2]; + + for (int i = 0; i < nrooms; i++) { + int rx, rz; + do { + rx = maze.rand.nextInt(MSIZE - 2) + 1; + rz = maze.rand.nextInt(MSIZE - 2) + 1; + } while (isNearRoom(rx, rz, rcoords)); + + maze.carveRoom1(rx, rz); + + rcoords[i * 2] = rx; + rcoords[i * 2 + 1] = rz; + } + + maze.generateRecursiveBacktracker(0, 0); + + maze.add4Exits(); + + maze.copyToStructure(world, manager, generator, 1, FLOOR_LEVEL, 1, this, sbb); + + decorate3x3Rooms(world, rcoords, sbb); + } + + /** + * @return true if the specified dx and dz are within 3 of a room specified in rcoords + */ + private boolean isNearRoom(int dx, int dz, int[] rcoords) { + // if proposed coordinates are covering the origin, return true to stop the room from causing the maze to fail + if (dx == 1 && dz == 1) { + return true; + } + + for (int i = 0; i < rcoords.length / 2; i++) { + int rx = rcoords[i * 2]; + int rz = rcoords[i * 2 + 1]; + + if (rx == 0 && rz == 0) { + continue; + } + + if (Math.abs(dx - rx) < 3 && Math.abs(dz - rz) < 3) { + return true; + } + } + return false; + } + + private void decorate3x3Rooms(WorldGenLevel world, int[] rcoords, BoundingBox sbb) { + for (int i = 0; i < rcoords.length / 2; i++) { + int dx = rcoords[i * 2]; + int dz = rcoords[i * 2 + 1]; + + // MAGIC NUMBERS!!! convert the maze coordinates into coordinates for our structure + dx = dx * 3 + 3; + dz = dz * 3 + 3; + + decorate3x3Room(world, dx, dz, sbb); + } + } + + /** + * Decorates a room in the maze. Makes assumptions that the room is 3x3 cells and thus 11x11 blocks large. + */ + private void decorate3x3Room(WorldGenLevel world, int x, int z, BoundingBox sbb) { + // make a new RNG for this room! + RandomSource roomRNG = RandomSource.create(world.getSeed() ^ x + z); + + // a few jack-o-lanterns + roomJackO(world, roomRNG, x, z, 8, sbb); + if (roomRNG.nextInt(4) == 0) { + roomJackO(world, roomRNG, x, z, 8, sbb); + } + + // all rooms should have 1 spawner + roomSpawner(world, roomRNG, x, z, 8, sbb); + + // and 1-2 chests + roomTreasure(world, roomRNG, x, z, 8, sbb); + if (roomRNG.nextInt(4) == 0) { + roomTreasure(world, roomRNG, x, z, 8, sbb); + } + } + + /** + * Place a spawner within diameter / 2 squares of the specified x and z coordinates + */ + private void roomSpawner(WorldGenLevel world, RandomSource rand, int x, int z, int diameter, BoundingBox sbb) { + int rx = x + rand.nextInt(diameter) - (diameter / 2); + int rz = z + rand.nextInt(diameter) - (diameter / 2); + + EntityType mobID = switch (rand.nextInt(3)) { + case 1 -> TFEntities.SWARM_SPIDER.get(); + case 2 -> TFEntities.HOSTILE_WOLF.get(); + default -> TFEntities.HEDGE_SPIDER.get(); + }; + + setSpawner(world, rx, FLOOR_LEVEL, rz, sbb, mobID); + } + + /** + * Place a treasure chest within diameter / 2 squares of the specified x and z coordinates + */ + private void roomTreasure(WorldGenLevel world, RandomSource rand, int x, int z, int diameter, BoundingBox sbb) { + int rx = x + rand.nextInt(diameter) - (diameter / 2); + int rz = z + rand.nextInt(diameter) - (diameter / 2); + + placeTreasureAtCurrentPosition(world, rx, FLOOR_LEVEL, rz, TFLootTables.HEDGE_MAZE, sbb); + } + + /** + * Place a lit pumpkin lantern within diameter / 2 squares of the specified x and z coordinates + */ + private void roomJackO(WorldGenLevel world, RandomSource rand, int x, int z, int diameter, BoundingBox sbb) { + int rx = x + rand.nextInt(diameter) - (diameter / 2); + int rz = z + rand.nextInt(diameter) - (diameter / 2); + + placeBlock(world, Blocks.JACK_O_LANTERN.defaultBlockState().setValue(CarvedPumpkinBlock.FACING, Direction.from2DDataValue(rand.nextInt(4))), + rx, FLOOR_LEVEL, rz, sbb); + } + + @Override + protected void addAdditionalSaveData(StructurePieceSerializationContext ctx, CompoundTag tagCompound) { + super.addAdditionalSaveData(ctx, tagCompound); + + BoundingBoxUtils.boundingBoxToExistingNBT(this.boundingBox, tagCompound); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/HollowHillComponent.java b/src/main/java/twilightforest/world/components/structures/HollowHillComponent.java new file mode 100644 index 0000000000..38b412e412 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/HollowHillComponent.java @@ -0,0 +1,304 @@ +package twilightforest.world.components.structures; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Vec3i; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.Mth; +import net.minecraft.util.RandomSource; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; +import twilightforest.data.custom.stalactites.entry.Stalactite; +import twilightforest.init.TFEntities; +import twilightforest.init.TFLandmark; +import twilightforest.init.TFStructurePieceTypes; +import twilightforest.loot.TFLootTables; +import twilightforest.world.components.feature.BlockSpikeFeature; + +public class HollowHillComponent extends TFStructureComponentOld { + private final static int[] stalactitesForSizes = {0, 128, 256, 512}; + private final static int[] spawnersForSizes = {0, 1, 4, 9}; + private final static int[] chestsForSizes = {0, 2, 6, 12}; + + private final int hillSize; + final int radius; + final int hdiam; + + public HollowHillComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + this(TFStructurePieceTypes.TFHill.get(), nbt); + } + + public HollowHillComponent(StructurePieceType piece, CompoundTag nbt) { + super(piece, nbt); + hillSize = nbt.getInt("hillSize"); + this.radius = ((hillSize * 2 + 1) * 8) - 6; + this.hdiam = (hillSize * 2 + 1) * 16; + } + + public HollowHillComponent(StructurePieceType piece, int i, int size, int x, int y, int z) { + super(piece, i, x, y, z); + + this.setOrientation(Direction.SOUTH); + + // get the size of this hill? + this.hillSize = size; + this.radius = ((hillSize * 2 + 1) * 8) - 6; + this.hdiam = (hillSize * 2 + 1) * 16; + + // can we determine the size here? + this.boundingBox = TFLandmark.getComponentToAddBoundingBox(x, y, z, -radius, -(3 + hillSize), -radius, radius * 2, radius / (hillSize == 1 ? 2 : hillSize), radius * 2, Direction.SOUTH, true); + } + + @Override + protected void addAdditionalSaveData(StructurePieceSerializationContext ctx, CompoundTag tagCompound) { + super.addAdditionalSaveData(ctx, tagCompound); + tagCompound.putInt("hillSize", hillSize); + } + + /** + * Add in all the blocks we're adding. + */ + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + int stalactiteCount = stalactitesForSizes[this.hillSize]; // number of stalactites mga = {0, 3, 9, 18} + + // fill in features + + // ore or glowing stalactites! (smaller, less plentiful) + for (int i = 0; i < stalactiteCount; i++) { + BlockPos.MutableBlockPos dest = this.randomCeilingCoordinates(rand, this.radius); + this.generateOreStalactite(world, dest.move(0, 1, 0), sbb); + } + // stone stalactites! + for (int i = 0; i < stalactiteCount; i++) { + BlockPos.MutableBlockPos dest = this.randomCeilingCoordinates(rand, this.radius); + this.generateBlockSpike(world, BlockSpikeFeature.STONE_STALACTITE, dest.getX(), dest.getY(), dest.getZ(), sbb, true); + //this.setBlockStateRotated(world, Blocks.BEACON.defaultBlockState(), dest.getX(), dest.getY(), dest.getZ(), Rotation.NONE, sbb); + } + // stone stalagmites! + for (int i = 0; i < stalactiteCount; i++) { + BlockPos.MutableBlockPos dest = this.randomFloorCoordinates(rand, this.radius); + this.generateBlockSpike(world, BlockSpikeFeature.STONE_STALACTITE, dest.getX(), dest.getY(), dest.getZ(), sbb, false); + //this.setBlockStateRotated(world, Blocks.SCAFFOLDING.defaultBlockState(), dest.getX(), dest.getY(), dest.getZ(), Rotation.NONE, sbb); + } + + // Place these important blocks last so they don't get overwritten by generation + + // monster generators! + for (int i = 0; i < spawnersForSizes[this.hillSize]; i++) { + BlockPos.MutableBlockPos dest = this.randomFloorCoordinates(rand, this.radius); + EntityType mobID = this.getMobID(rand); + + this.setSpawner(world, dest.move(0, 1, 0), sbb, mobID); + } + // treasure chests!! + for (int i = 0; i < chestsForSizes[this.hillSize]; i++) { + BlockPos.MutableBlockPos dest = this.randomFloorCoordinates(rand, this.radius); + this.generateTreasureChest(world, dest.move(0, 1, 0), sbb); + } + + //DEBUG +// this.setBlockStateRotated(world, Blocks.GLOWSTONE.defaultBlockState(), this.radius, 3, this.radius, Rotation.NONE, sbb); +// this.setBlockStateRotated(world, Blocks.SEA_LANTERN.defaultBlockState(), this.boundingBox.getXSpan()/2, 4, this.boundingBox.getZSpan()/2, Rotation.NONE, sbb); +// +// for (int i = 0; i < 30; i++) { +// this.setBlockStateRotated(world, Blocks.WHITE_GLAZED_TERRACOTTA.defaultBlockState(), 0, i, 0, Rotation.NONE, sbb); +// this.setBlockStateRotated(world, Blocks.ORANGE_GLAZED_TERRACOTTA.defaultBlockState(), this.boundingBox.maxX() - this.boundingBox.minX(), i, 0, Rotation.NONE, sbb); +// this.setBlockStateRotated(world, Blocks.LIGHT_BLUE_GLAZED_TERRACOTTA.defaultBlockState(), 0, i, this.boundingBox.maxZ() - this.boundingBox.minZ(), Rotation.NONE, sbb); +// this.setBlockStateRotated(world, Blocks.MAGENTA_GLAZED_TERRACOTTA.defaultBlockState(), this.boundingBox.maxX() - this.boundingBox.minX(), i, this.boundingBox.maxZ() - this.boundingBox.minZ(), Rotation.NONE, sbb); +// } +// +// for (int i = 1; i < this.boundingBox.maxX() - this.boundingBox.minX(); i++) { +// this.setBlockStateRotated(world, Blocks.GLOWSTONE.defaultBlockState(), i, this.boundingBox.maxY(), 0, Rotation.NONE, sbb); +// this.setBlockStateRotated(world, Blocks.GLOWSTONE.defaultBlockState(), i, this.boundingBox.maxY(), this.boundingBox.maxZ() - this.boundingBox.minZ(), Rotation.NONE, sbb); +// } +// +// for (int i = 1; i < this.boundingBox.maxZ() - this.boundingBox.minZ(); i++) { +// this.setBlockStateRotated(world, Blocks.GLOWSTONE.defaultBlockState(), 0, this.boundingBox.maxY(), i, Rotation.NONE, sbb); +// this.setBlockStateRotated(world, Blocks.GLOWSTONE.defaultBlockState(), this.boundingBox.maxX() - this.boundingBox.minX(), this.boundingBox.maxY(), i, Rotation.NONE, sbb); +// } + } + + /** + * Make an RNG and attempt to use it to place a treasure chest + */ + + protected void generateTreasureChest(WorldGenLevel world, Vec3i pos, BoundingBox sbb) { + generateTreasureChest(world, pos.getX(), pos.getY(), pos.getZ(), sbb); + } + + protected void generateTreasureChest(WorldGenLevel world, int x, int y, int z, BoundingBox sbb) { + // generate an RNG for this chest + RandomSource chestRNG = RandomSource.create(world.getSeed() + (long) x * z); + + // try placing it + placeTreasureAtCurrentPosition(world, x, y, z, this.hillSize == 3 ? TFLootTables.LARGE_HOLLOW_HILL : (this.hillSize == 2 ? TFLootTables.MEDIUM_HOLLOW_HILL : TFLootTables.SMALL_HOLLOW_HILL), sbb); + + // make something for it to stand on, if necessary + placeBlock(world, Blocks.COBBLESTONE.defaultBlockState(), x, y - 1, z, sbb); + } + + protected void generateOreStalactite(WorldGenLevel world, Vec3i pos, BoundingBox sbb) { + this.generateOreStalactite(world, pos.getX(), pos.getY(), pos.getZ(), sbb); + } + + /** + * Generate a random ore stalactite + */ + protected void generateOreStalactite(WorldGenLevel world, int x, int y, int z, BoundingBox sbb) { + // are the coordinates in our bounding box? + int dx = getWorldX(x, z); + int dy = getWorldY(y); + int dz = getWorldZ(x, z); + BlockPos pos = new BlockPos(dx, dy, dz); + if (sbb.isInside(pos) && world.getBlockState(pos).getBlock() != Blocks.SPAWNER) { + // generate an RNG for this stalactite + RandomSource stalRNG = RandomSource.create(world.getSeed() + (long) dx * dz); + + // make the actual stalactite + Stalactite stalag = BlockSpikeFeature.makeRandomOreStalactite(stalRNG, this.hillSize); + BlockSpikeFeature.startSpike(world, pos, stalag, stalRNG, true); + } + } + + protected void generateBlockSpike(WorldGenLevel world, Stalactite config, int x, int y, int z, BoundingBox sbb, boolean hanging) { + // are the coordinates in our bounding box? + int dx = getWorldX(x, z); + int dy = getWorldY(y); + int dz = getWorldZ(x, z); + BlockPos pos = new BlockPos(dx, dy, dz); + if (sbb.isInside(pos) && world.getBlockState(pos).getBlock() != Blocks.SPAWNER) { + // generate an RNG for this stalactite + RandomSource stalRNG = RandomSource.create(world.getSeed() + (long) dx * dz); + + // make the actual stalactite + BlockSpikeFeature.startSpike(world, pos, config, stalRNG, hanging); + } + } + + /** + * @param cx + * @param cz + * @return true if the coordinates would be inside the hill on the "floor" of the hill + */ + boolean isInHill(int cx, int cz) { + int dx = radius - cx; + int dz = radius - cz; + + return Mth.sqrt(dx * dx + dz * dz) < radius; + } + + @Deprecated + // Use randomPolarCoordinates + int[] randomCoordinatesInHill2D(RandomSource rand) { + return this.randomCoordinatesInHill2D(rand, radius); + } + + /** + * @return a two element array containing some coordinates in the hill + */ + @Deprecated + // Use randomPolarCoordinates + int[] randomCoordinatesInHill2D(RandomSource rand, int maximumRadius) { + Vec3i pos = this.randomFloorCoordinates(rand, maximumRadius); + + return new int[]{pos.getX(), pos.getZ()}; + } + + BlockPos.MutableBlockPos randomFloorCoordinates(RandomSource rand, float maximumRadius) { + float degree = rand.nextFloat() * Mth.TWO_PI; + // The full radius isn't actually hollow. Not feeling like doing the math to find the intersections of the curves involved + float radius = rand.nextFloat() * 0.9f * maximumRadius; + // Nonetheless the floor-carving curve is one-third the top-level terrain curve + float dist = Mth.sqrt(radius * radius); + float height = (this.hillSize * 2) - Mth.cos(dist / this.hdiam * Mth.PI) * (this.hdiam / 20f) + 1; + + return new BlockPos.MutableBlockPos(maximumRadius - Mth.cos(degree) * radius, height, maximumRadius - Mth.sin(degree) * radius); + } + + BlockPos.MutableBlockPos randomCeilingCoordinates(RandomSource rand, float maximumRadius) { + float degree = rand.nextFloat() * Mth.TWO_PI; + // The full radius isn't actually hollow. Not feeling like doing the math to find the intersections of the curves involved + float radius = rand.nextFloat() * 0.9f * maximumRadius; + // Nonetheless the floor-carving curve is one-third the top-level terrain curve + float dist = Mth.sqrt(radius * radius); + float height = Mth.cos(dist / this.hdiam * Mth.PI) * (this.hdiam / 4f); + + return new BlockPos.MutableBlockPos(maximumRadius - Mth.cos(degree) * radius, height, maximumRadius - Mth.sin(degree) * radius); + } + + /** + * Gets the id of a mob appropriate to the current hill size. + */ + protected EntityType getMobID(RandomSource rand) { + return getMobID(rand, this.hillSize); + } + + /** + * Gets the id of a mob appropriate to the specified hill size. + * + * @param level + * @return + */ + protected EntityType getMobID(RandomSource rand, int level) { + if (level == 1) { + return getLevel1Mob(rand); + } + if (level == 2) { + return getLevel2Mob(rand); + } + if (level == 3) { + return getLevel3Mob(rand); + } + + return EntityType.SPIDER; + } + + /** + * Returns a mob string appropriate for a level 1 hill + */ + public EntityType getLevel1Mob(RandomSource rand) { + return switch (rand.nextInt(10)) { + case 3, 4, 5 -> EntityType.SPIDER; + case 6, 7 -> EntityType.ZOMBIE; + case 8 -> EntityType.SILVERFISH; + case 9 -> TFEntities.REDCAP.get(); + default -> TFEntities.SWARM_SPIDER.get(); + }; + } + + /** + * Returns a mob string appropriate for a level 2 hill + */ + public EntityType getLevel2Mob(RandomSource rand) { + return switch (rand.nextInt(10)) { + case 3, 4, 5 -> EntityType.ZOMBIE; + case 6, 7 -> EntityType.SKELETON; + case 8 -> TFEntities.SWARM_SPIDER.get(); + case 9 -> EntityType.CAVE_SPIDER; + default -> TFEntities.REDCAP.get(); + }; + } + + /** + * Returns a mob string appropriate for a level 3 hill. The level 3 also has 2 mid-air wraith spawners. + */ + public EntityType getLevel3Mob(RandomSource rand) { + return switch (rand.nextInt(11)) { + case 0 -> TFEntities.SLIME_BEETLE.get(); + case 1 -> TFEntities.FIRE_BEETLE.get(); + case 2 -> TFEntities.PINCH_BEETLE.get(); + case 3, 4, 5 -> EntityType.SKELETON; + case 6, 7, 8 -> EntityType.CAVE_SPIDER; + case 9 -> EntityType.CREEPER; + default -> TFEntities.WRAITH.get(); + }; + } +} diff --git a/src/main/java/twilightforest/world/components/structures/HydraLairComponent.java b/src/main/java/twilightforest/world/components/structures/HydraLairComponent.java new file mode 100644 index 0000000000..6103b594b5 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/HydraLairComponent.java @@ -0,0 +1,84 @@ +package twilightforest.world.components.structures; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.Mth; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFStructurePieceTypes; +import twilightforest.world.components.feature.BlockSpikeFeature; + + +public class HydraLairComponent extends HollowHillComponent { + + public HydraLairComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFHydra.get(), nbt); + } + + public HydraLairComponent(int i, int x, int y, int z) { + super(TFStructurePieceTypes.TFHydra.get(), i, 2, x, y + 2, z); + } + + @Override + public void addChildren(StructurePiece structurecomponent, StructurePieceAccessor accessor, RandomSource random) { + // NO-OP + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + int stalacts = 64; + int stalags = 8; + + // fill in features + // ore or glowing stalactites! (smaller, less plentiful) + for (int i = 0; i < stalacts; i++) { + BlockPos.MutableBlockPos dest = this.randomCeilingCoordinates(rand, this.radius); + this.generateOreStalactite(world, dest.move(0, 1, 0), sbb); + } + // stone stalactites! + for (int i = 0; i < stalacts; i++) { + BlockPos.MutableBlockPos dest = this.randomCeilingCoordinates(rand, this.radius); + this.generateBlockSpike(world, BlockSpikeFeature.STONE_STALACTITE, dest.getX(), dest.getY(), dest.getZ(), sbb, true); + } + // stone stalagmites! + for (int i = 0; i < stalags; i++) { + BlockPos.MutableBlockPos dest = this.randomFloorCoordinates(rand, this.radius); + this.generateBlockSpike(world, BlockSpikeFeature.STONE_STALACTITE, dest.getX(), dest.getY(), dest.getZ(), sbb, false); + } + + // boss spawner seems important + placeBlock(world, TFBlocks.HYDRA_BOSS_SPAWNER.get().defaultBlockState(), 27, 3, 27, sbb); + } + + @Override + BlockPos.MutableBlockPos randomFloorCoordinates(RandomSource rand, float maximumRadius) { + float degree = rand.nextFloat() * 4.537856f + 1.7453294f; // rand * (2pi - 5pi/9) + 5pi/9 + // The full radius isn't actually hollow. Not feeling like doing the math to find the intersections of the curves involved + float radius = maximumRadius * 0.9f * (rand.nextFloat() * 0.35f + 0.65f); // 0.9 (max width) * 0.65 minimum radius + // Nonetheless the floor-carving curve is one-third the top-level terrain curve + float dist = Mth.sqrt(radius * radius); + float height = 4 - Mth.cos(dist / this.hdiam * Mth.PI) * (this.hdiam / 20f); + + return new BlockPos.MutableBlockPos(maximumRadius - Mth.cos(degree) * radius, height, maximumRadius - Mth.sin(degree) * radius); + } + + @Override + BlockPos.MutableBlockPos randomCeilingCoordinates(RandomSource rand, float maximumRadius) { + float degree = rand.nextFloat() * 4.537856f + 1.7453294f; // rand * (2pi - 5pi/9) + 5pi/9 + // The full radius isn't actually hollow. Not feeling like doing the math to find the intersections of the curves involved + float radius = rand.nextFloat() * 0.9f * maximumRadius; + // Nonetheless the floor-carving curve is one-third the top-level terrain curve + float dist = Mth.sqrt(radius * radius); + float height = Mth.cos(dist / this.hdiam * Mth.PI) * (this.hdiam / 4f); + + return new BlockPos.MutableBlockPos(maximumRadius - Mth.cos(degree) * radius, height, maximumRadius - Mth.sin(degree) * radius); + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/world/components/structures/QuestGrove.java b/src/main/java/twilightforest/world/components/structures/QuestGrove.java new file mode 100644 index 0000000000..22acff02c0 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/QuestGrove.java @@ -0,0 +1,54 @@ +package twilightforest.world.components.structures; + +import com.google.common.collect.ImmutableSet; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.ServerLevelAccessor; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.DispenserBlock; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplateManager; +import twilightforest.TwilightForestMod; +import twilightforest.init.TFEntities; +import twilightforest.loot.TFLootTables; +import twilightforest.util.FeaturePlacers; +import twilightforest.world.components.processors.StoneBricksVariants; +import twilightforest.world.components.processors.TargetedRotProcessor; +import twilightforest.init.TFStructurePieceTypes; + + +public class QuestGrove extends TwilightTemplateStructurePiece { + private static final TargetedRotProcessor MOSSY_BRICK_DECAY = new TargetedRotProcessor(ImmutableSet.of(Blocks.MOSSY_STONE_BRICKS.defaultBlockState()), 0.5f); + + public QuestGrove(StructurePieceSerializationContext ctx, CompoundTag compoundTag) { + super(TFStructurePieceTypes.TFQuestGrove.get(), compoundTag, ctx, readSettings(compoundTag).addProcessor(StoneBricksVariants.INSTANCE)); + } + + public QuestGrove(StructureTemplateManager structureManager, BlockPos templatePosition) { + super(TFStructurePieceTypes.TFQuestGrove.get(), 0, structureManager, TwilightForestMod.prefix("quest_grove"), makeSettings(Rotation.NONE).addProcessor(MOSSY_BRICK_DECAY).addProcessor(StoneBricksVariants.INSTANCE), templatePosition); + } + + @Override + public void postProcess(WorldGenLevel level, StructureManager structureFeatureManager, ChunkGenerator chunkGenerator, RandomSource random, BoundingBox boundingBox, ChunkPos chunkPos, BlockPos pos) { + this.placePieceAdjusted(level, structureFeatureManager, chunkGenerator, random, boundingBox, chunkPos, pos, -2); + } + + @Override + protected void handleDataMarker(String name, BlockPos pos, ServerLevelAccessor levelAccessor, RandomSource random, BoundingBox boundingBox) { + if (!boundingBox.isInside(pos)) return; + + if ("quest_ram".equals(name)) { + FeaturePlacers.placeEntity(TFEntities.QUEST_RAM.get(), pos, levelAccessor); + } else if ("dispenser".equals(name)) { + TFLootTables.QUEST_GROVE.generateLootContainer(levelAccessor, pos, Blocks.DROPPER.defaultBlockState().setValue(DispenserBlock.FACING, this.placeSettings.getRotation().rotate(Direction.NORTH)), 16 | 4 | 2, random.nextLong()); + } + } +} diff --git a/src/main/java/twilightforest/world/components/structures/StrongholdStones.java b/src/main/java/twilightforest/world/components/structures/StrongholdStones.java new file mode 100644 index 0000000000..de83dcb491 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/StrongholdStones.java @@ -0,0 +1,28 @@ +package twilightforest.world.components.structures; + +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.levelgen.structure.StructurePiece; + +public class StrongholdStones extends StructurePiece.BlockSelector { + + @Override + public void next(RandomSource random, int x, int y, int z, boolean wall) { + if (!wall) { + next = Blocks.AIR.defaultBlockState(); + } else { + float f = random.nextFloat(); + + if (f < 0.2F) { + next = Blocks.CRACKED_STONE_BRICKS.defaultBlockState(); + } else if (f < 0.5F) { + next = Blocks.MOSSY_STONE_BRICKS.defaultBlockState(); + } else if (f < 0.55F) { + next = Blocks.INFESTED_STONE_BRICKS.defaultBlockState(); + } else { + next = Blocks.STONE_BRICKS.defaultBlockState(); + } + } + } + +} diff --git a/src/main/java/twilightforest/world/components/structures/TFMaze.java b/src/main/java/twilightforest/world/components/structures/TFMaze.java new file mode 100644 index 0000000000..323e30491b --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/TFMaze.java @@ -0,0 +1,566 @@ +package twilightforest.world.components.structures; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.registries.Registries; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import twilightforest.TwilightForestMod; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFConfiguredFeatures; + +/** + * This is a maze of cells and walls. + *

+ * The cells are at odd numbered x and y values, and the walls are at even numbered ones. This does make the storage slightly inefficient, but oh wells. + * + * @author Ben + */ +public class TFMaze { + + public final int width; // cells wide (x) + public final int depth; // cells deep (z) + + public int oddBias; // corridor thickness, default 3 + public final int evenBias; // wall thickness here. NYI + + public int tall; // wall blocks tall + public int head;// blocks placed above the maze + public int roots;// blocks placed under the maze (used for hedge mazes) + + public int type; // 1-3 = various sizes hollow hills + + public StructurePiece.BlockSelector wallBlocks; + + public BlockState wallBlockState; + + public BlockState headBlockState; + + public BlockState rootBlockState; + + public BlockState pillarBlockState; + + public BlockState doorBlockState; + public float doorRarity; + + public BlockState torchBlockState; + public float torchRarity; + + protected final int rawWidth; + protected final int rawDepth; + protected final int[] storage; + + public static final int OUT_OF_BOUNDS = Integer.MIN_VALUE; + public static final int OOB = OUT_OF_BOUNDS; + public static final int ROOM = 5; + public static final int DOOR = 6; + + public final RandomSource rand; + + public TFMaze(int cellsWidth, int cellsDepth) { + // default values + oddBias = 3; + evenBias = 1; + tall = 3; + head = 0; + roots = 0; + wallBlockState = TFBlocks.CUT_MAZESTONE.get().defaultBlockState(); + rootBlockState = TFBlocks.MAZESTONE.get().defaultBlockState(); + torchBlockState = Blocks.TORCH.defaultBlockState(); + pillarBlockState = null; + + torchRarity = 0.75F; + doorRarity = 0F; + + this.width = cellsWidth; + this.depth = cellsDepth; + + this.rawWidth = width * 2 + 1; + this.rawDepth = depth * 2 + 1; + storage = new int[rawWidth * rawDepth]; + + rand = RandomSource.create(); + } + + /** + * Gets the value from a cell in the maze + */ + private int getCell(int x, int z) { + return getRaw(x * 2 + 1, z * 2 + 1); + } + + /** + * Puts a value into a cell in the maze + */ + private void putCell(int x, int z, int value) { + putRaw(x * 2 + 1, z * 2 + 1, value); + } + + /** + * Returns true if the specified cell equals the specified value + */ + private boolean cellEquals(int x, int z, int value) { + return getCell(x, z) == value; + } + + /** + * Gets the wall value, or OUT_OF_BOUNDS if the area is out of bounds or the coordinates are not orthogonally adjacent. + */ + private int getWall(int sx, int sz, int dx, int dz) { + if (dx == sx + 1 && dz == sz) { + return getRaw(sx * 2 + 2, sz * 2 + 1); + } + if (dx == sx - 1 && dz == sz) { + return getRaw(sx * 2, sz * 2 + 1); + } + if (dx == sx && dz == sz + 1) { + return getRaw(sx * 2 + 1, sz * 2 + 2); + } + if (dx == sx && dz == sz - 1) { + return getRaw(sx * 2 + 1, sz * 2); + } + + TwilightForestMod.LOGGER.info("Wall check out of bounds; s = {}, {}; d = {}, {}", sx, sz, dx, dz); + + return OUT_OF_BOUNDS; + } + + public void putWall(int sx, int sz, int dx, int dz, int value) { + if (dx == sx + 1 && dz == sz) { + putRaw(sx * 2 + 2, sz * 2 + 1, value); + } + if (dx == sx - 1 && dz == sz) { + putRaw(sx * 2, sz * 2 + 1, value); + } + if (dx == sx && dz == sz + 1) { + putRaw(sx * 2 + 1, sz * 2 + 2, value); + } + if (dx == sx && dz == sz - 1) { + putRaw(sx * 2 + 1, sz * 2, value); + } + } + + /** + * Returns true if there is a wall there + */ + public boolean isWall(int sx, int sz, int dx, int dz) { + return getWall(sx, sz, dx, dz) == 0; + } + + /** + * Puts a value into the raw storage. + */ + public void putRaw(int rawx, int rawz, int value) { + if (rawx >= 0 && rawx < rawWidth && rawz >= 0 && rawz < rawDepth) { + storage[rawz * rawWidth + rawx] = value; + } + } + + /** + * Gets a value from raw storage + */ + private int getRaw(int rawx, int rawz) { + if (rawx < 0 || rawx >= rawWidth || rawz < 0 || rawz >= rawDepth) { + return OUT_OF_BOUNDS; + } else { + return storage[rawz * rawWidth + rawx]; + } + } + + /** + * Sets the random seed to a specific value + */ + public void setSeed(long newSeed) { + rand.setSeed(newSeed); + } + + /** + * Copy the maze into a StructureTFComponentOld + */ + public void copyToStructure(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, int dx, int dy, int dz, TFStructureComponentOld component, BoundingBox sbb) { + for (int x = 0; x < rawWidth; x++) { + for (int z = 0; z < rawDepth; z++) { + // only draw walls. if the data is 0 the there's a wall + if (getRaw(x, z) == 0) { + int mdx = dx + (x / 2 * (evenBias + oddBias)); + int mdz = dz + (z / 2 * (evenBias + oddBias)); + + if (evenBias > 1) { + mdx--; + mdz--; + } + + if (isEven(x) && isEven(z)) { + if (type == 4 && shouldTree(x, z)) { + // occasionally make a tree + putCanopyTree(world, generator, mdx, dy, mdz, component, sbb); + } else { + // make a block! + for (int even = 0; even < evenBias; even++) { + for (int even2 = 0; even2 < evenBias; even2++) { + for (int y = 0; y < head; y++) { + putHeadBlock(world, mdx + even, dy + tall + y, mdz + even2, component, sbb); + } + for (int y = 0; y < tall; y++) { + if (shouldPillar(x, z)) { + putPillarBlock(world, mdx + even, dy + y, mdz + even2, component, sbb); + } else { + putWallBlock(world, mdx + even, dy + y, mdz + even2, component, sbb); + } + } + for (int y = 1; y <= roots; y++) { + putRootBlock(world, mdx + even, dy - y, mdz + even2, component, sbb); + } + } + } + } + } + if (isEven(x) && !isEven(z)) { + // make a | vertical | wall! + for (int even = 0; even < evenBias; even++) { + for (int odd = 1; odd <= oddBias; odd++) { + makeWallThing(world, dy, component, sbb, mdx, mdz, even, odd); + } + } + } + if (!isEven(x) && isEven(z)) { + // make a - horizontal - wall! + for (int even = 0; even < evenBias; even++) { + for (int odd = 1; odd <= oddBias; odd++) { + makeWallThing(world, dy, component, sbb, mdx, mdz, odd, even); + } + } + } + } else if (getRaw(x, z) == DOOR) { + int mdx = dx + (x / 2 * (evenBias + oddBias)); + int mdz = dz + (z / 2 * (evenBias + oddBias)); + + if (evenBias > 1) { + mdx--; + mdz--; + } + + if (isEven(x) && !isEven(z)) { + // make a | vertical | door! + for (int even = 0; even < evenBias; even++) { + for (int odd = 1; odd <= oddBias; odd++) { + for (int y = 0; y < head; y++) { + putHeadBlock(world, mdx + even, dy + tall + y, mdz + odd, component, sbb); + } + for (int y = 0; y < tall; y++) { + putDoorBlock(world, mdx + even, dy + y, mdz + odd, component, sbb); + } + for (int y = 1; y <= roots; y++) { + putRootBlock(world, mdx + even, dy - y, mdz + odd, component, sbb); + } + } + } + } + if (!isEven(x) && isEven(z)) { + // make a - horizontal - door! + for (int even = 0; even < evenBias; even++) { + for (int odd = 1; odd <= oddBias; odd++) { + for (int y = 0; y < head; y++) { + putHeadBlock(world, mdx + odd, dy + tall + y, mdz + even, component, sbb); + } + for (int y = 0; y < tall; y++) { + putDoorBlock(world, mdx + odd, dy + y, mdz + even, component, sbb); + } + for (int y = 1; y <= roots; y++) { + putRootBlock(world, mdx + odd, dy - y, mdz + even, component, sbb); + } + } + } + } + } + } + } + + // instead of putting placetorches in a seperate function, I just put it here. + for (int x = 0; x < rawWidth; x++) { + for (int z = 0; z < rawDepth; z++) { + if (getRaw(x, z) == 0) { + int mdx = dx + (x / 2 * (evenBias + oddBias)); + int mdy = dy + 1; + int mdz = dz + (z / 2 * (evenBias + oddBias)); + + if (isEven(x) && isEven(z)) { + if (shouldTorch(x, z) && component.getBlock(world, mdx, mdy, mdz, sbb).getBlock() == wallBlockState.getBlock()) { + component.placeBlock(world, torchBlockState, mdx, mdy, mdz, sbb); + } + } + } + } + } + } + + private void makeWallThing(WorldGenLevel world, int dy, TFStructureComponentOld component, BoundingBox sbb, int mdx, int mdz, int even, int odd) { + for (int y = 0; y < head; y++) { + putHeadBlock(world, mdx + even, dy + tall + y, mdz + odd, component, sbb); + } + for (int y = 0; y < tall; y++) { + putWallBlock(world, mdx + even, dy + y, mdz + odd, component, sbb); + } + for (int y = 1; y <= roots; y++) { + putRootBlock(world, mdx + even, dy - y, mdz + odd, component, sbb); + } + } + + /** + * Puts a wall block in the structure, if pillar blocks are properly specified + */ + private void putPillarBlock(WorldGenLevel world, int x, int y, int z, TFStructureComponentOld component, BoundingBox sbb) { + component.placeBlock(world, pillarBlockState, x, y, z, sbb); + } + + /** + * Puts a wall block in the world, at the specified world coordinates. + */ + private void putWallBlock(WorldGenLevel world, int x, int y, int z) { + world.setBlock(new BlockPos(x, y, z), wallBlockState, 2); + } + + /** + * Puts a wall block in the structure, at the specified structure coordinates. + */ + private void putWallBlock(WorldGenLevel world, int x, int y, int z, TFStructureComponentOld component, BoundingBox sbb) { + if (wallBlocks != null) { + wallBlocks.next(rand, x, y, z, true); + component.placeBlock(world, wallBlocks.getNext(), x, y, z, sbb); + } else { + component.placeBlock(world, wallBlockState, x, y, z, sbb); + } + } + + /** + * Puts a wall block in the structure, at the specified structure coordinates. + */ + private void putDoorBlock(WorldGenLevel world, int x, int y, int z, TFStructureComponentOld component, BoundingBox sbb) { + component.placeBlock(world, doorBlockState, x, y, z, sbb); + } + + private void putHeadBlock(WorldGenLevel world, int x, int y, int z, TFStructureComponentOld component, BoundingBox sbb) { + component.placeBlock(world, headBlockState, x, y, z, sbb); + } + + /** + * Puts a root block in the structure, at the specified structure coordinates. + */ + private void putRootBlock(WorldGenLevel world, int x, int y, int z, TFStructureComponentOld component, BoundingBox sbb) { + component.placeBlock(world, rootBlockState, x, y, z, sbb); + } + + /** + * Puts a canopy tree in the world at the specified structure coordinates. + */ + private void putCanopyTree(WorldGenLevel world, ChunkGenerator generator, int x, int y, int z, TFStructureComponentOld component, BoundingBox sbb) { + BlockPos pos = component.getBlockPosWithOffset(x, y, z); + + // only place it if we're actually generating the chunk the tree is in (or at least the middle of the tree) + if (sbb.isInside(pos)) { + if (!world.registryAccess().registryOrThrow(Registries.CONFIGURED_FEATURE).get(TFConfiguredFeatures.CANOPY_TREE).place(world, generator, rand, pos)) { + makeWallThing(world, y, component, sbb, x, z, 0, 0); + } + } + } + + private boolean isEven(int n) { + return n % 2 == 0; + } + + /** + * Should we put a torch here? Intended to be called on the in-between spots where x and y are even. + */ + public boolean shouldTorch(int rx, int rz) { + // if there is out of bounds in any direction, no + if (getRaw(rx + 1, rz) == OOB || getRaw(rx - 1, rz) == OOB || getRaw(rx, rz + 1) == OOB || getRaw(rx, rz - 1) == OOB) { + return false; + } + + // if there are walls in two opposite directions, no + if ((getRaw(rx + 1, rz) == 0 && getRaw(rx - 1, rz) == 0) || (getRaw(rx, rz + 1) == 0 && getRaw(rx, rz - 1) == 0)) { + return false; + } + + // otherwise, I suppose yes + + // check rarity + return rand.nextFloat() <= this.torchRarity; + } + + /** + * Should we put a torch here? Intended to be called on the in-between spots where x and y are even. + */ + public boolean shouldPillar(int rx, int rz) { + // if the pillar block is not defined, no + if (pillarBlockState == null) { + return false; + } + + // if there is out of bounds in any direction, no + if (getRaw(rx + 1, rz) == OOB || getRaw(rx - 1, rz) == OOB || getRaw(rx, rz + 1) == OOB || getRaw(rx, rz - 1) == OOB) { + return false; + } + + // if there are walls in two opposite directions, no + return (getRaw(rx + 1, rz) != 0 || getRaw(rx - 1, rz) != 0) && (getRaw(rx, rz + 1) != 0 || getRaw(rx, rz - 1) != 0); + + // otherwise, I suppose yes + } + + /** + * Should we put a tree instead of a post? + * Essentially the answer is yes for the corners and the exits. + */ + public boolean shouldTree(int rx, int rz) { + if ((rx == 0 || rx == rawWidth - 1) && (getRaw(rx, rz + 1) != 0 || getRaw(rx, rz - 1) != 0)) { + return true; + } + if ((rz == 0 || rz == rawDepth - 1) && (getRaw(rx + 1, rz) != 0 || getRaw(rx - 1, rz) != 0)) { + return true; + } + + return rand.nextInt(50) == 0; + } + + /** + * This room is a 3x3 cell room with exits in every direction. + */ + public void carveRoom1(int cx, int cz) { + int rx = cx * 2 + 1; + int rz = cz * 2 + 1; + + // remove walls and cells + for (int i = -2; i <= 2; i++) { + for (int j = -2; j <= 2; j++) { + putRaw(rx + i, rz + j, ROOM); + } + } + + // mark the exit areas as unmazed + putCell(rx, rz + 1, 0); + putCell(rx, rz - 1, 0); + putCell(rx + 1, rz, 0); + putCell(rx - 1, rz, 0); + + // make 4 exits (if not at the edge of the maze) + if (getRaw(rx, rz + 4) != OUT_OF_BOUNDS) { + putRaw(rx, rz + 3, ROOM); + } + if (getRaw(rx, rz - 4) != OUT_OF_BOUNDS) { + putRaw(rx, rz - 3, ROOM); + } + if (getRaw(rx + 4, rz) != OUT_OF_BOUNDS) { + putRaw(rx + 3, rz, ROOM); + } + if (getRaw(rx - 4, rz) != OUT_OF_BOUNDS) { + putRaw(rx - 3, rz, ROOM); + } + } + + /** + * Adds four exits into the maze. + */ + public void add4Exits() { + int hx = rawWidth / 2 + 1; + int hz = rawDepth / 2 + 1; + + putRaw(hx, 0, ROOM); + putRaw(hx, rawDepth - 1, ROOM); + putRaw(0, hz, ROOM); + putRaw(rawWidth - 1, hz, ROOM); + } + + /** + * Generates a maze using the recursive backtracking algorithm. + * + * @param sx The starting x coordinate + * @param sz The starting y coordinate + */ + public void generateRecursiveBacktracker(int sx, int sz) { + rbGen(sx, sz); + } + + /** + * Mark the cell as visited. If we have any unvisited neighbors, pick one randomly, carve the wall between them, then call this function on that neighbor. + * + * @param sx + * @param sz + */ + public void rbGen(int sx, int sz) { + // mark cell as visited + putCell(sx, sz, 1); + + // count the unvisted neighbors + int unvisited = 0; + if (cellEquals(sx + 1, sz, 0)) { + unvisited++; + } + if (cellEquals(sx - 1, sz, 0)) { + unvisited++; + } + if (cellEquals(sx, sz + 1, 0)) { + unvisited++; + } + if (cellEquals(sx, sz - 1, 0)) { + unvisited++; + } + + // if there are no unvisited neighbors, return + if (unvisited == 0) { + return; + } + + // otherwise, pick a random neighbor to visit + int rn = rand.nextInt(unvisited); + int dx, dz; + dx = dz = 0; + + if (cellEquals(sx + 1, sz, 0)) { + if (rn == 0) { + dx = sx + 1; + dz = sz; + } + rn--; + } + if (cellEquals(sx - 1, sz, 0)) { + if (rn == 0) { + dx = sx - 1; + dz = sz; + } + rn--; + } + if (cellEquals(sx, sz + 1, 0)) { + if (rn == 0) { + dx = sx; + dz = sz + 1; + } + rn--; + } + if (cellEquals(sx, sz - 1, 0)) { + if (rn == 0) { + dx = sx; + dz = sz - 1; + } + } + + // carve wall or door + if (rand.nextFloat() <= this.doorRarity) { + putWall(sx, sz, dx, dz, DOOR); + } else { + putWall(sx, sz, dx, dz, 2); + } + + // call function recursively at the destination + rbGen(dx, dz); + + // the destination has run out of free spaces, let's try this square again, up to 2 more times + rbGen(sx, sz); + rbGen(sx, sz); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/TFStructureComponent.java b/src/main/java/twilightforest/world/components/structures/TFStructureComponent.java new file mode 100644 index 0000000000..ccd99fd6b4 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/TFStructureComponent.java @@ -0,0 +1,189 @@ +package twilightforest.world.components.structures; + +import com.google.common.collect.ImmutableSet; +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.animal.Sheep; +import net.minecraft.world.entity.decoration.ArmorStand; +import net.minecraft.world.item.DyeColor; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.Mirror; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; +import net.minecraft.world.level.material.FluidState; +import twilightforest.init.TFBlocks; +import twilightforest.util.ColorUtil; + +import java.util.Set; + +@Deprecated +// We keep rehashing Vanillacopies and they'll keep breaking between ports, we should be adding TwilightFeature to the +// StructurePiece classes we actually use. This class will take quite a while to dismantle +public abstract class TFStructureComponent extends StructurePiece { + + public TFStructureDecorator deco = null; + public int spawnListIndex = 0; + private static final Set BLOCKS_NEEDING_POSTPROCESSING = ImmutableSet.builder() + .add(Blocks.NETHER_BRICK_FENCE) + .add(Blocks.TORCH) + .add(Blocks.WALL_TORCH) + .add(Blocks.OAK_FENCE) + .add(Blocks.SPRUCE_FENCE) + .add(Blocks.DARK_OAK_FENCE) + .add(Blocks.ACACIA_FENCE) + .add(Blocks.BIRCH_FENCE) + .add(Blocks.JUNGLE_FENCE) + .add(Blocks.LADDER) + .add(Blocks.IRON_BARS) + .add(Blocks.GLASS_PANE) + .add(Blocks.OAK_STAIRS) + .add(Blocks.SPRUCE_STAIRS) + .add(Blocks.BIRCH_STAIRS) + .add(Blocks.COBBLESTONE_WALL) + .add(Blocks.RED_MUSHROOM_BLOCK) + .add(Blocks.BROWN_MUSHROOM_BLOCK) + .add(Blocks.REDSTONE_WIRE) + .add(Blocks.TRIPWIRE) + .add(Blocks.TRIPWIRE_HOOK) + .add(Blocks.CHEST) + .add(Blocks.TRAPPED_CHEST) + .add(Blocks.STONE_BRICK_STAIRS) + .add(Blocks.LAVA) + .add(Blocks.WATER) + .add(Blocks.QUARTZ_STAIRS) + .add(TFBlocks.CASTLE_BRICK_STAIRS.get()) + .add(TFBlocks.BLUE_FORCE_FIELD.get()) + .add(TFBlocks.GREEN_FORCE_FIELD.get()) + .add(TFBlocks.PINK_FORCE_FIELD.get()) + .add(TFBlocks.VIOLET_FORCE_FIELD.get()) + .add(TFBlocks.ORANGE_FORCE_FIELD.get()) + .add(TFBlocks.BROWN_THORNS.get()) + .add(TFBlocks.GREEN_THORNS.get()) + .build(); + + + public TFStructureComponent(StructurePieceType piece, CompoundTag nbt) { + super(piece, nbt); + this.spawnListIndex = nbt.getInt("si"); + this.deco = TFStructureDecorator.getDecoFor(nbt.getString("deco")); + this.rotation = Rotation.NONE; + this.rotation = Rotation.values()[nbt.getInt("rot") % Rotation.values().length]; + } + + public TFStructureComponent(StructurePieceType type, int i, BoundingBox boundingBox) { + super(type, i, boundingBox); + this.rotation = Rotation.NONE; + } + + @Deprecated // FIXME Boundingbox + public TFStructureComponent(StructurePieceType type, int i, int x, int y, int z) { + this(type, i, new BoundingBox(x, y, z, x, y, z)); + } + + protected static boolean shouldDebug() { + return false; + } + + @SuppressWarnings({"SameParameterValue", "unused"}) + protected void setDebugCorners(Level world) { + if (rotation == null) rotation = Rotation.NONE; + + if (shouldDebug() ) { // && rotation!= Rotation.NONE) { + int i = rotation.ordinal() * 4; + DyeColor[] colors = DyeColor.values(); + world.setBlockAndUpdate(new BlockPos(this.getBoundingBox().minX(), this.getBoundingBox().maxY() + i , this.getBoundingBox().minZ()), ColorUtil.WOOL.getColor(colors[i])); + world.setBlockAndUpdate(new BlockPos(this.getBoundingBox().maxX(), this.getBoundingBox().maxY() + i + 1, this.getBoundingBox().minZ()), ColorUtil.WOOL.getColor(colors[1 + i])); + world.setBlockAndUpdate(new BlockPos(this.getBoundingBox().minX(), this.getBoundingBox().maxY() + i + 2, this.getBoundingBox().maxZ()), ColorUtil.WOOL.getColor(colors[2 + i])); + world.setBlockAndUpdate(new BlockPos(this.getBoundingBox().maxX(), this.getBoundingBox().maxY() + i + 3, this.getBoundingBox().maxZ()), ColorUtil.WOOL.getColor(colors[3 + i])); + } + } + + @SuppressWarnings({"SameParameterValue", "unused"}) + protected void setDebugEntity(WorldGenLevel world, int x, int y, int z, BoundingBox sbb, String s) { + setInvisibleTextEntity(world, x, y, z, sbb, s, shouldDebug(), 0f); + } + + protected void setInvisibleTextEntity(WorldGenLevel world, int x, int y, int z, BoundingBox sbb, String s, boolean forcePlace, float additionalYOffset) { + if (forcePlace) { + final BlockPos pos = new BlockPos(this.getWorldX(x, z), this.getWorldY(y), this.getWorldZ(x, z)); + + if (sbb.isInside(pos)) { + final ArmorStand armorStand = new ArmorStand(EntityType.ARMOR_STAND, world.getLevel()); + armorStand.setCustomName(Component.literal(s)); + armorStand.moveTo(pos.getX() + 0.5, pos.getY() + additionalYOffset, pos.getZ() + 0.5, 0, 0); + armorStand.setInvisible(true); + armorStand.setCustomNameVisible(true); + armorStand.setSilent(true); + armorStand.setNoGravity(true); + // set marker flag + armorStand.getEntityData().set(ArmorStand.DATA_CLIENT_FLAGS, (byte) (armorStand.getEntityData().get(ArmorStand.DATA_CLIENT_FLAGS) | 16)); + world.addFreshEntity(armorStand); + } + } + } + + @Override + protected void placeBlock(WorldGenLevel worldIn, BlockState blockstateIn, int x, int y, int z, BoundingBox boundingboxIn) { + BlockPos blockpos = new BlockPos(this.getWorldX(x, z), this.getWorldY(y), this.getWorldZ(x, z)); + + if (boundingboxIn.isInside(blockpos)) { + if (this.mirror != Mirror.NONE) { + blockstateIn = blockstateIn.mirror(this.mirror); + } + + if (this.rotation != Rotation.NONE) { + blockstateIn = blockstateIn.rotate(this.rotation); + } + + worldIn.setBlock(blockpos, blockstateIn, 2); + FluidState fluidstate = worldIn.getFluidState(blockpos); + if (!fluidstate.isEmpty()) { + worldIn.scheduleTick(blockpos, fluidstate.getType(), 0); + } + + if (BLOCKS_NEEDING_POSTPROCESSING.contains(blockstateIn.getBlock())) { + worldIn.getChunk(blockpos).markPosForPostprocessing(blockpos); + } + + } + } + + @SuppressWarnings({"SameParameterValue", "unused"}) + protected void setDebugEntity(Level world, BlockPos blockpos, String s) { + if (shouldDebug()) { + final Sheep sheep = new Sheep(EntityType.SHEEP, world); + sheep.setCustomName(Component.literal(s)); + sheep.setNoAi(true); + sheep.moveTo(blockpos.getX() + 0.5, blockpos.getY() + 10, blockpos.getZ() + 0.5, 0, 0); + sheep.setInvulnerable(true); + sheep.setInvisible(true); + sheep.setCustomNameVisible(true); + sheep.setSilent(true); + sheep.setNoGravity(true); + world.addFreshEntity(sheep); + } + } + + @Override + protected void addAdditionalSaveData(StructurePieceSerializationContext ctx, CompoundTag tagCompound) { + tagCompound.putInt("si", this.spawnListIndex); + tagCompound.putString("deco", TFStructureDecorator.getDecoString(this.deco)); + tagCompound.putInt("rot", this.rotation.ordinal()); + } + + /** + * Does this component fall under block protection when progression is turned on, normally true + */ + public boolean isComponentProtected() { + return true; + } +} diff --git a/src/main/java/twilightforest/world/components/structures/TFStructureComponentOld.java b/src/main/java/twilightforest/world/components/structures/TFStructureComponentOld.java new file mode 100644 index 0000000000..0f14eb5c92 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/TFStructureComponentOld.java @@ -0,0 +1,579 @@ +package twilightforest.world.components.structures; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Vec3i; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.util.Mth; +import net.minecraft.util.RandomSource; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.block.*; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.SignBlockEntity; +import net.minecraft.world.level.block.entity.SpawnerBlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.ChestType; +import net.minecraft.world.level.block.state.properties.Half; +import net.minecraft.world.level.block.state.properties.SlabType; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.Heightmap; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; +import org.jetbrains.annotations.Nullable; +import twilightforest.TwilightForestMod; +import twilightforest.loot.TFLootTables; +import twilightforest.util.BoundingBoxUtils; + +import java.util.Iterator; +import java.util.List; +import java.util.function.Consumer; +import java.util.function.Predicate; + +@Deprecated +public abstract class TFStructureComponentOld extends TFStructureComponent { + + protected static final BlockState AIR = Blocks.AIR.defaultBlockState(); + private static final StrongholdStones strongholdStones = new StrongholdStones(); + + public TFStructureComponentOld(StructurePieceType piece, CompoundTag nbt) { + super(piece, nbt); + } + + @Deprecated // Use Below + public TFStructureComponentOld(StructurePieceType type, int i, int x, int y, int z) { + super(type, i, new BoundingBox(x, y, z, x, y, z)); + } + + public TFStructureComponentOld(StructurePieceType type, int i, BoundingBox box) { + super(type, i, box); + } + + //Let's not use vanilla's weird rotation+mirror thing... + @Override + public void setOrientation(@Nullable Direction facing) { + this.orientation = facing; + this.mirror = Mirror.NONE; + + if (facing == null) { + this.rotation = Rotation.NONE; + } else { + switch (facing) { + case SOUTH -> this.rotation = Rotation.CLOCKWISE_180; + case WEST -> this.rotation = Rotation.COUNTERCLOCKWISE_90; + case EAST -> this.rotation = Rotation.CLOCKWISE_90; + default -> this.rotation = Rotation.NONE; + } + } + } + + /** + * Fixed a bug with direction 1 and -z values, but I'm not sure if it'll break other things + */ + public static BoundingBox getComponentToAddBoundingBox2(int x, int y, int z, int minX, int minY, int minZ, int maxX, int maxY, int maxZ, Direction dir) { + return switch (dir) { + case WEST -> // '\001' + new BoundingBox(x - maxZ - minZ, y + minY, z + minX, x - minZ, y + maxY + minY, z + maxX + minX); + case NORTH -> // '\002' + new BoundingBox(x - maxX - minX, y + minY, z - maxZ - minZ, x - minX, y + maxY + minY, z - minZ); + case EAST -> // '\003' + new BoundingBox(x + minZ, y + minY, z - maxX, x + maxZ + minZ, y + maxY + minY, z - minX); + default -> // '\0' + new BoundingBox(x + minX, y + minY, z + minZ, x + maxX + minX, y + maxY + minY, z + maxZ + minZ); + }; + } + + protected void setSpawner(WorldGenLevel world, Vec3i pos, BoundingBox sbb, EntityType monsterID) { + setSpawner(world, pos.getX(), pos.getY(), pos.getZ(), sbb, monsterID, v -> {}); + } + + protected void setSpawner(WorldGenLevel world, int x, int y, int z, BoundingBox sbb, EntityType monsterID) { + setSpawner(world, x, y, z, sbb, monsterID, v -> {}); + } + + // [VanillaCopy] Keep pinned to signature of setBlockState (no state arg) + protected void setSpawner(WorldGenLevel world, int x, int y, int z, BoundingBox sbb, EntityType monsterID, Consumer spawnerModifier) { + int dx = getWorldX(x, z); + int dy = getWorldY(y); + int dz = getWorldZ(x, z); + + BlockPos pos = new BlockPos(dx, dy, dz); + + if (sbb.isInside(pos)) { + if (world.getBlockState(pos).getBlock() != Blocks.SPAWNER) + world.setBlock(pos, Blocks.SPAWNER.defaultBlockState(), 2); + + BlockEntity tileEntitySpawner = world.getBlockEntity(pos); + if (tileEntitySpawner instanceof SpawnerBlockEntity spawner) { + spawner.setEntityId(monsterID, world.getRandom()); + spawnerModifier.accept(spawner); + } + } + } + + protected void surroundBlockCardinal(WorldGenLevel world, BlockState block, int x, int y, int z, BoundingBox sbb) { + placeBlock(world, block, x, y, z - 1, sbb); + placeBlock(world, block, x, y, z + 1, sbb); + placeBlock(world, block, x - 1, y, z, sbb); + placeBlock(world, block, x + 1, y, z, sbb); + } + + protected void surroundBlockCardinalRotated(WorldGenLevel world, BlockState block, int x, int y, int z, BoundingBox sbb) { + placeBlock(world, block.setValue(StairBlock.FACING, Direction.NORTH), x, y, z - 1, sbb); + placeBlock(world, block.setValue(StairBlock.FACING, Direction.SOUTH), x, y, z + 1, sbb); + placeBlock(world, block.setValue(StairBlock.FACING, Direction.WEST), x - 1, y, z, sbb); + placeBlock(world, block.setValue(StairBlock.FACING, Direction.EAST), x + 1, y, z, sbb); + } + + protected void surroundBlockCorners(WorldGenLevel world, BlockState block, int x, int y, int z, BoundingBox sbb) { + placeBlock(world, block, x - 1, y, z - 1, sbb); + placeBlock(world, block, x - 1, y, z + 1, sbb); + placeBlock(world, block, x + 1, y, z - 1, sbb); + placeBlock(world, block, x + 1, y, z + 1, sbb); + } + + protected void setSpawnerRotated(WorldGenLevel world, int x, int y, int z, Rotation rotation, EntityType monsterID, BoundingBox sbb) { + Direction oldBase = fakeBaseMode(rotation); + setSpawner(world, x, y, z, sbb, monsterID); + setOrientation(oldBase); + } + + /** + * Place a treasure chest at the specified coordinates + * + * @param treasureType + */ + protected void placeTreasureAtCurrentPosition(WorldGenLevel world, int x, int y, int z, TFLootTables treasureType, BoundingBox sbb) { + this.placeTreasureAtCurrentPosition(world, x, y, z, treasureType, false, sbb); + } + + /** + * Place a treasure chest at the specified coordinates + * + * @param treasureType + */ + protected void placeTreasureAtCurrentPosition(WorldGenLevel world, int x, int y, int z, TFLootTables treasureType, boolean trapped, BoundingBox sbb) { + int dx = getWorldX(x, z); + int dy = getWorldY(y); + int dz = getWorldZ(x, z); + BlockPos pos = new BlockPos(dx, dy, dz); + if (sbb.isInside(pos) && world.getBlockState(pos).getBlock() != (trapped ? Blocks.TRAPPED_CHEST : Blocks.CHEST)) { + treasureType.generateChest(world, pos, getOrientation(), trapped); + } + } + + /** + * Place a treasure chest at the specified coordinates + * + * @param treasureType + */ + protected void placeTreasureRotated(WorldGenLevel world, int x, int y, int z, Direction facing, Rotation rotation, TFLootTables treasureType, BoundingBox sbb) { + this.placeTreasureRotated(world, x, y, z, facing, rotation, treasureType, false, sbb); + } + + /** + * Place a treasure chest at the specified coordinates + * + * @param treasureType + */ + protected void placeTreasureRotated(WorldGenLevel world, int x, int y, int z, Direction facing, Rotation rotation, TFLootTables treasureType, boolean trapped, BoundingBox sbb) { + if(facing == null) { + TwilightForestMod.LOGGER.error("Loot Chest at {}, {}, {} has null direction, setting it to north", x, y, z); + facing = Direction.NORTH; + } + + int dx = getXWithOffsetRotated(x, z, rotation); + int dy = getWorldY(y); + int dz = getZWithOffsetRotated(x, z, rotation); + BlockPos pos = new BlockPos(dx, dy, dz); + if (sbb.isInside(pos) && world.getBlockState(pos).getBlock() != (trapped ? Blocks.TRAPPED_CHEST : Blocks.CHEST)) { + treasureType.generateChest(world, pos, facing, trapped); + } + } + + protected void manualTreaurePlacement(WorldGenLevel world, int x, int y, int z, Direction facing, TFLootTables treasureType, boolean trapped, BoundingBox sbb) { + int lootx = getWorldX(x, z); + int looty = getWorldY(y); + int lootz = getWorldZ(x, z); + BlockPos lootPos = new BlockPos(lootx, looty, lootz); + this.placeBlock(world, (trapped ? Blocks.TRAPPED_CHEST : Blocks.CHEST).defaultBlockState().setValue(ChestBlock.TYPE, ChestType.LEFT).setValue(ChestBlock.FACING, facing), x, y, z, sbb); + treasureType.generateChestContents(world, lootPos); + } + + //when adding a loot table to a chest using this method, please be aware it places 2 of the same loot table, one for each chest + protected void setDoubleLootChest(WorldGenLevel world, int x, int y, int z, int otherx, int othery, int otherz, @Nullable Direction facing, TFLootTables treasureType, BoundingBox sbb, boolean trapped) { + this.setDoubleLootChest(world, x, y, z, otherx, othery, otherz, facing, treasureType, treasureType, sbb, trapped); + } + + protected void setDoubleLootChest(WorldGenLevel world, int x, int y, int z, int otherx, int othery, int otherz, @Nullable Direction facing, TFLootTables treasureType, TFLootTables secondaryLootType, BoundingBox sbb, boolean trapped) { + if (facing == null) { + TwilightForestMod.LOGGER.error("Loot Chest at {}, {}, {} has null direction, setting it to north", x, y, z); + facing = Direction.NORTH; + } + + boolean flipContents = world.getRandom().nextBoolean(); + BlockPos firstChestPos = new BlockPos(this.getWorldX(x, z), this.getWorldY(y), this.getWorldZ(x, z)); + BlockPos secondChestPos = new BlockPos(this.getWorldX(otherx, otherz), this.getWorldY(othery), this.getWorldZ(otherx, otherz)); + + this.placeBlock(world, (trapped ? Blocks.TRAPPED_CHEST : Blocks.CHEST).defaultBlockState().setValue(ChestBlock.TYPE, ChestType.LEFT).setValue(ChestBlock.FACING, facing), x, y, z, sbb); + this.placeBlock(world, (trapped ? Blocks.TRAPPED_CHEST : Blocks.CHEST).defaultBlockState().setValue(ChestBlock.TYPE, ChestType.RIGHT).setValue(ChestBlock.FACING, facing), otherx, othery, otherz, sbb); + treasureType.generateChestContents(world, flipContents ? secondChestPos : firstChestPos); + secondaryLootType.generateChestContents(world, flipContents ? firstChestPos : secondChestPos); + } + + /** + * Places a tripwire. + * + * Tries to delay notifying tripwire blocks of placement so they won't + * scan unloaded chunks looking for connections. + * + */ + protected void placeTripwire(WorldGenLevel world, int x, int y, int z, int size, Direction facing, BoundingBox sbb) { + + int dx = facing.getStepX(); + int dz = facing.getStepZ(); + + // add tripwire hooks + BlockState tripwireHook = Blocks.TRIPWIRE_HOOK.defaultBlockState(); + placeBlock(world, tripwireHook.setValue(TripWireHookBlock.FACING, facing.getOpposite()), x, y, z, sbb); + placeBlock(world, tripwireHook.setValue(TripWireHookBlock.FACING, facing), x + dx * size, y, z + dz * size, sbb); + + // add string + BlockState tripwire = Blocks.TRIPWIRE.defaultBlockState(); + for (int i = 1; i < size; i++) { + placeBlock(world, tripwire, x + dx * i, y, z + dz * i, sbb); + } + } + + protected void placeSignAtCurrentPosition(WorldGenLevel world, int x, int y, int z, String string0, String string1, BoundingBox sbb) { + int dx = getWorldX(x, z); + int dy = getWorldY(y); + int dz = getWorldZ(x, z); + BlockPos pos = new BlockPos(dx, dy, dz); + if (sbb.isInside(pos) && world.getBlockState(pos).getBlock() != Blocks.OAK_SIGN) { + world.setBlock(pos, Blocks.OAK_SIGN.defaultBlockState().setValue(StandingSignBlock.ROTATION, this.getOrientation().get2DDataValue() * 4), 2); + + SignBlockEntity teSign = (SignBlockEntity) world.getBlockEntity(pos); + if (teSign != null) { + teSign.setMessage(1, Component.literal(string0)); + teSign.setMessage(2, Component.literal(string1)); + } + } + } + + /** + * Provides coordinates to make a tower such that it will open into the parent tower at the provided coordinates. + */ + protected int[] offsetTowerCoords(int x, int y, int z, int towerSize, Direction direction) { + + int dx = getWorldX(x, z); + int dy = getWorldY(y); + int dz = getWorldZ(x, z); + + if (direction == Direction.SOUTH) { + return new int[]{dx + 1, dy - 1, dz - towerSize / 2}; + } else if (direction == Direction.WEST) { + return new int[]{dx + towerSize / 2, dy - 1, dz + 1}; + } else if (direction == Direction.NORTH) { + return new int[]{dx - 1, dy - 1, dz + towerSize / 2}; + } else if (direction == Direction.EAST) { + return new int[]{dx - towerSize / 2, dy - 1, dz - 1}; + } + + + // ugh? + return new int[]{x, y, z}; + } + + /** + * Provides coordinates to make a tower such that it will open into the parent tower at the provided coordinates. + */ + protected BlockPos offsetTowerCCoords(int x, int y, int z, int towerSize, Direction direction) { + + int dx = getWorldX(x, z); + int dy = getWorldY(y); + int dz = getWorldZ(x, z); + + switch (direction) { + case SOUTH: + return new BlockPos(dx + 1, dy - 1, dz - towerSize / 2); + case WEST: + return new BlockPos(dx + towerSize / 2, dy - 1, dz + 1); + case NORTH: + return new BlockPos(dx - 1, dy - 1, dz + towerSize / 2); + case EAST: + return new BlockPos(dx - towerSize / 2, dy - 1, dz - 1); + default: + break; + } + + // ugh? + return new BlockPos(x, y, z); + } + + @Override + protected int getWorldX(int x, int z) { + //return super.getXWithOffset(x, z); + // [VanillaCopy] of super, edits noted. + Direction enumfacing = this.getOrientation(); + + if (enumfacing == null) { + return x; + } else { + return switch (enumfacing) { + case SOUTH -> this.boundingBox.minX() + x; + case WEST -> this.boundingBox.maxX() - z; + case NORTH -> this.boundingBox.maxX() - x; // TF - Add case for NORTH + case EAST -> this.boundingBox.minX() + z; + default -> x; + }; + } + } + + @Override + protected int getWorldZ(int x, int z) { + //return super.getZWithOffset(x, z); + // [VanillaCopy] of super, edits noted. + Direction enumfacing = this.getOrientation(); + + if (enumfacing == null) { + return z; + } else { + return switch (enumfacing) { + case SOUTH -> this.boundingBox.minZ() + z; + case WEST -> this.boundingBox.minZ() + x; + case NORTH -> this.boundingBox.maxZ() - z; + case EAST -> this.boundingBox.maxZ() - x; + default -> z; + }; + } + } + + private Direction fakeBaseMode(Rotation rotationsCW) { + final Direction oldBaseMode = getOrientation(); + + if (oldBaseMode != null) { + Direction pretendBaseMode = oldBaseMode; + pretendBaseMode = rotationsCW.rotate(pretendBaseMode); + + setOrientation(pretendBaseMode); + } + + return oldBaseMode; + } + + // [VanillaCopy] Keep pinned to the signature of getXWithOffset + protected int getXWithOffsetRotated(int x, int z, Rotation rotationsCW) { + Direction oldMode = fakeBaseMode(rotationsCW); + int ret = getWorldX(x, z); + setOrientation(oldMode); + return ret; + } + + // [VanillaCopy] Keep pinned to the signature of getZWithOffset + protected int getZWithOffsetRotated(int x, int z, Rotation rotationsCW) { + Direction oldMode = fakeBaseMode(rotationsCW); + int ret = getWorldZ(x, z); + setOrientation(oldMode); + return ret; + } + + protected void setBlockStateRotated(WorldGenLevel world, BlockState state, int x, int y, int z, Rotation rotationsCW, BoundingBox sbb) { + Direction oldMode = fakeBaseMode(rotationsCW); + placeBlock(world, state, x, y, z, sbb); + setOrientation(oldMode); + } + + @Override + protected BlockState getBlock(BlockGetter world, int x, int y, int z, BoundingBox sbb) { + // Making public + return super.getBlock(world, x, y, z, sbb); + } + + @Override + protected void placeBlock(WorldGenLevel worldIn, BlockState blockstateIn, int x, int y, int z, BoundingBox sbb) { + // Making public + super.placeBlock(worldIn, blockstateIn, x, y, z, sbb); + } + + // [VanillaCopy] Keep pinned to the signature of getBlockStateFromPos + public BlockState getBlockStateFromPosRotated(WorldGenLevel world, int x, int y, int z, BoundingBox sbb, Rotation rotationsCW) { + Direction oldMode = fakeBaseMode(rotationsCW); + BlockState ret = getBlock(world, x, y, z, sbb); + setOrientation(oldMode); + return ret; + } + + protected void fillBlocksRotated(WorldGenLevel world, BoundingBox sbb, int minX, int minY, int minZ, int maxX, int maxY, int maxZ, BlockState state, Rotation rotation) { + Direction oldBase = fakeBaseMode(rotation); + generateBox(world, sbb, minX, minY, minZ, maxX, maxY, maxZ, state, state, false); + setOrientation(oldBase); + } + + // [VanillaCopy] Keep pinned on signature of fillWithBlocksRandomly (though passing false for excludeAir) + protected void randomlyFillBlocksRotated(WorldGenLevel worldIn, BoundingBox boundingboxIn, RandomSource rand, float chance, int minX, int minY, int minZ, int maxX, int maxY, int maxZ, BlockState blockstate1, BlockState blockstate2, Rotation rotation) { + Direction oldBase = fakeBaseMode(rotation); + final boolean minimumLightLevel = true; + generateMaybeBox(worldIn, boundingboxIn, rand, chance, minX, minY, minZ, maxX, maxY, maxZ, blockstate1, blockstate2, false, minimumLightLevel); + setOrientation(oldBase); + } + + // [VanillaCopy] Keep pinned to signature of replaceAirAndLiquidDownwards + public void replaceAirAndLiquidDownwardsRotated(WorldGenLevel world, BlockState state, int x, int y, int z, Rotation rotation, BoundingBox sbb) { + Direction oldBaseMode = fakeBaseMode(rotation); + fillColumnDown(world, state, x, y, z, sbb); + setOrientation(oldBaseMode); + } + + protected void fillAirRotated(WorldGenLevel world, BoundingBox sbb, int minX, int minY, int minZ, int maxX, int maxY, int maxZ, Rotation rotation) { + Direction oldBaseMode = fakeBaseMode(rotation); + generateAirBox(world, sbb, minX, minY, minZ, maxX, maxY, maxZ); + setOrientation(oldBaseMode); + } + + protected void fillWithAir(WorldGenLevel world, BoundingBox boundingBox, int xMin, int yMin, int zMin, int xMax, int yMax, int zMax, Predicate predicate) { + fillWithBlocks(world, boundingBox, xMin, yMin, zMin, xMax, yMax, zMax, Blocks.AIR.defaultBlockState(), predicate); + } + + protected void fillWithBlocks(WorldGenLevel world, BoundingBox boundingBox, int xMin, int yMin, int zMin, int xMax, int yMax, int zMax, BlockState state, Predicate predicate) { + fillWithBlocks(world, boundingBox, xMin, yMin, zMin, xMax, yMax, zMax, state, state, predicate); + } + + protected void fillWithBlocks(WorldGenLevel world, BoundingBox boundingBox, int xMin, int yMin, int zMin, int xMax, int yMax, int zMax, BlockState borderState, BlockState interiorState, Predicate predicate) { + for (int y = yMin; y <= yMax; ++y) { + for (int x = xMin; x <= xMax; ++x) { + for (int z = zMin; z <= zMax; ++z) { + + if (predicate.test(this.getBlock(world, x, y, z, boundingBox))) { + + boolean isBorder = yMin != yMax && (y == yMin || y == yMax) + || xMin != xMax && (x == xMin || x == xMax) + || zMin != zMax && (z == zMin || z == zMax); + + this.placeBlock(world, isBorder ? borderState : interiorState, x, y, z, boundingBox); + } + } + } + } + } + + protected static StructurePiece.BlockSelector getStrongholdStones() { + return strongholdStones; + } + + protected Direction getStructureRelativeRotation(Rotation rotationsCW) { + return rotationsCW.rotate(getOrientation()); + } + + /** + * Discover the y coordinate that will serve as the ground level of the supplied BoundingBox. (A median of all the + * levels in the BB's horizontal rectangle). + *

+ * This is basically copied from ComponentVillage + */ + protected int getAverageGroundLevel(WorldGenLevel world, ChunkGenerator generator, BoundingBox boundingBox) { + int yTotal = 0; + int count = 0; + int yStart = Mth.clamp(generator.getSeaLevel(), this.boundingBox.minY(), this.boundingBox.maxY()); + + for (int z = this.boundingBox.minZ(); z <= this.boundingBox.maxZ(); ++z) { + for (int x = this.boundingBox.minX(); x <= this.boundingBox.maxX(); ++x) { + BlockPos pos = new BlockPos(x, yStart, z); + + if (boundingBox.isInside(pos)) { + final BlockPos topPos = world.getHeightmapPos(Heightmap.Types.WORLD_SURFACE_WG, pos); + yTotal += Math.max(topPos.getY(), generator.getSpawnHeight(world)); + ++count; + } + } + } + + if (count == 0) { + return Integer.MIN_VALUE; + } else { + return yTotal / count; + } + } + + /** + * Find what y-level the ground is. Just check the center of the chunk we're given. + */ + protected int findGroundLevel(WorldGenLevel world, BoundingBox sbb, int start, Predicate predicate) { + + Vec3i center = BoundingBoxUtils.getCenter(sbb); + BlockPos.MutableBlockPos pos = new BlockPos.MutableBlockPos(center.getX(), 0, center.getZ()); + + for (int y = start; y > 0; y--) { + pos.setY(y); + if (predicate.test(world.getBlockState(pos))) { + return y; + } + } + + return 0; + } + + protected boolean isBoundingBoxOutsideBiomes(WorldGenLevel world, Predicate predicate) { + + int minX = this.boundingBox.minX() - 1; + int minZ = this.boundingBox.minZ() - 1; + int maxX = this.boundingBox.maxX() + 1; + int maxZ = this.boundingBox.maxZ() + 1; + + BlockPos.MutableBlockPos pos = new BlockPos.MutableBlockPos(); + + for (int x = minX; x <= maxX; x++) { + for (int z = minZ; z <= maxZ; z++) { + if (!predicate.test(world.getBiome(pos.set(x, 0, z)).value())) { + return true; + } + } + } + + return false; + } + + /** + * Discover if bounding box can fit within the current bounding box object. + */ + @Nullable + public static StructurePiece findIntersectingExcluding(List list, BoundingBox toCheck, StructurePiece exclude) { + Iterator iterator = list.iterator(); + StructurePiece structurecomponent; + + do { + if (!iterator.hasNext()) { + return null; + } + + structurecomponent = iterator.next(); + } + while (structurecomponent == exclude || structurecomponent.getBoundingBox() == null || !structurecomponent.getBoundingBox().intersects(toCheck)); + + return structurecomponent; + } + + public BlockPos getBlockPosWithOffset(int x, int y, int z) { + return new BlockPos( + getWorldX(x, z), + getWorldY(y), + getWorldZ(x, z) + ); + } + + /* BlockState Helpers */ + protected static BlockState getStairState(BlockState stairState, Direction direction, boolean isTopHalf) { + return stairState + .setValue(StairBlock.FACING, direction) + .setValue(StairBlock.HALF, isTopHalf ? Half.TOP : Half.BOTTOM); + } + + protected static BlockState getSlabState(BlockState inputBlockState, SlabType half) { + return inputBlockState + .setValue(SlabBlock.TYPE, half); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/TFStructureComponentTemplate.java b/src/main/java/twilightforest/world/components/structures/TFStructureComponentTemplate.java new file mode 100644 index 0000000000..8d78ed4bba --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/TFStructureComponentTemplate.java @@ -0,0 +1,141 @@ +package twilightforest.world.components.structures; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Vec3i; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.level.block.Mirror; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; +import net.minecraft.world.level.levelgen.structure.templatesystem.BlockIgnoreProcessor; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructurePlaceSettings; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplateManager; + +/** + * Copied a few things from {@link net.minecraft.world.level.levelgen.structure.TemplateStructurePiece} + */ +@Deprecated // Should extend TemplateStructurePiece instead +public abstract class TFStructureComponentTemplate extends TFStructureComponent { + + protected final StructurePlaceSettings placeSettings = new StructurePlaceSettings().addProcessor(BlockIgnoreProcessor.STRUCTURE_BLOCK); + protected BlockPos templatePosition; + protected BlockPos rotatedPosition; + protected StructureTemplate TEMPLATE; + public Runnable LAZY_TEMPLATE_LOADER; + + public TFStructureComponentTemplate(StructurePieceSerializationContext ctx, StructurePieceType piece, CompoundTag nbt) { + super(piece, nbt); + this.templatePosition = new BlockPos(nbt.getInt("TPX"), nbt.getInt("TPY"), nbt.getInt("TPZ")); + this.placeSettings.setRotation(this.rotation); + LAZY_TEMPLATE_LOADER = () -> setup(ctx.structureTemplateManager()); + } + + public TFStructureComponentTemplate(StructurePieceType type, int i, int x, int y, int z, BoundingBox boundingBox) { + super(type, i, boundingBox); + this.mirror = Mirror.NONE; + this.templatePosition = new BlockPos(x, y, z); + } + + @Deprecated + public TFStructureComponentTemplate(StructureTemplateManager manager, StructurePieceType type, int i, int x, int y, int z, Rotation rotation) { + super(type, i, new BoundingBox(x, y, z, x, y, z)); + this.rotation = rotation; + this.mirror = Mirror.NONE; + this.placeSettings.setRotation(rotation); + this.templatePosition = new BlockPos(x, y, z); + LAZY_TEMPLATE_LOADER = () -> setup(manager); + } + + public final void setup(StructureTemplateManager templateManager) { + loadTemplates(templateManager); + setModifiedTemplatePositionFromRotation(); + setBoundingBoxFromTemplate(rotatedPosition); + } + + protected abstract void loadTemplates(StructureTemplateManager templateManager); + + @Override + protected void addAdditionalSaveData(StructurePieceSerializationContext ctx, CompoundTag tagCompound) { + super.addAdditionalSaveData(ctx, tagCompound); + tagCompound.putInt("TPX", this.templatePosition.getX()); + tagCompound.putInt("TPY", this.templatePosition.getY()); + tagCompound.putInt("TPZ", this.templatePosition.getZ()); + } + + protected final void setModifiedTemplatePositionFromRotation() { + Rotation rotation = this.placeSettings.getRotation(); + Vec3i size = this.TEMPLATE.getSize(rotation); + + rotatedPosition = new BlockPos(this.templatePosition); + + if (rotation == Rotation.CLOCKWISE_90 || rotation == Rotation.CLOCKWISE_180) { + rotatedPosition = rotatedPosition.east(size.getZ() - 1); + } + + if (rotation == Rotation.CLOCKWISE_180 || rotation == Rotation.COUNTERCLOCKWISE_90) { + rotatedPosition = rotatedPosition.south(size.getX() - 1); + } + } + + protected final void setBoundingBoxFromTemplate(BlockPos pos) { + Rotation rotation = this.placeSettings.getRotation(); + Vec3i size = this.TEMPLATE.getSize(rotation); + Mirror mirror = this.placeSettings.getMirror(); + this.boundingBox = new BoundingBox(0, 0, 0, size.getX(), size.getY() - 1, size.getZ()); + + switch (rotation) { + case CLOCKWISE_90 -> this.boundingBox.move(-size.getX(), 0, 0); + case COUNTERCLOCKWISE_90 -> this.boundingBox.move(0, 0, -size.getZ()); + case CLOCKWISE_180 -> this.boundingBox.move(-size.getX(), 0, -size.getZ()); + default -> { + } + } + + switch (mirror) { + case FRONT_BACK -> { + BlockPos blockpos2 = BlockPos.ZERO; + if (rotation != Rotation.CLOCKWISE_90 && rotation != Rotation.COUNTERCLOCKWISE_90) { + if (rotation == Rotation.CLOCKWISE_180) { + blockpos2 = blockpos2.relative(Direction.EAST, size.getX()); + } else { + blockpos2 = blockpos2.relative(Direction.WEST, size.getX()); + } + } else { + blockpos2 = blockpos2.relative(rotation.rotate(Direction.WEST), size.getZ()); + } + this.boundingBox.move(blockpos2.getX(), 0, blockpos2.getZ()); + } + case LEFT_RIGHT -> { + BlockPos blockpos1 = BlockPos.ZERO; + if (rotation != Rotation.CLOCKWISE_90 && rotation != Rotation.COUNTERCLOCKWISE_90) { + if (rotation == Rotation.CLOCKWISE_180) { + blockpos1 = blockpos1.relative(Direction.SOUTH, size.getZ()); + } else { + blockpos1 = blockpos1.relative(Direction.NORTH, size.getZ()); + } + } else { + blockpos1 = blockpos1.relative(rotation.rotate(Direction.NORTH), size.getX()); + } + this.boundingBox.move(blockpos1.getX(), 0, blockpos1.getZ()); + } + default -> { } + } + + this.boundingBox.move(pos.getX(), pos.getY(), pos.getZ()); + } + + @Deprecated + protected final void setTemplatePositionFromRotation() { + Rotation rotation = this.placeSettings.getRotation(); + Vec3i size = this.TEMPLATE.getSize(rotation); + + if (rotation == Rotation.CLOCKWISE_90 || rotation == Rotation.CLOCKWISE_180) + this.templatePosition = this.templatePosition.east(size.getZ()-1); + + if (rotation == Rotation.CLOCKWISE_180 || rotation == Rotation.COUNTERCLOCKWISE_90) + this.templatePosition = this.templatePosition.south(size.getX()-1); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/TFStructureDecorator.java b/src/main/java/twilightforest/world/components/structures/TFStructureDecorator.java new file mode 100644 index 0000000000..e2e368f090 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/TFStructureDecorator.java @@ -0,0 +1,68 @@ +package twilightforest.world.components.structures; + +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import twilightforest.world.components.structures.darktower.StructureDecoratorDarkTower; +import twilightforest.world.components.structures.finalcastle.StructureTFDecoratorCastle; +import twilightforest.world.components.structures.icetower.IceTowerDecorator; +import twilightforest.world.components.structures.mushroomtower.MushroomTowerDecorator; +import twilightforest.world.components.structures.stronghold.StrongholdDecorator; + +/** + * Stores information about what blocks to use in constructing this structure + * + * @author Ben + */ +public class TFStructureDecorator { + public BlockState blockState = Blocks.STONE.defaultBlockState(); + public BlockState accentState = Blocks.COBBLESTONE.defaultBlockState(); + public BlockState stairState = Blocks.STONE_STAIRS.defaultBlockState(); + public BlockState fenceState = Blocks.OAK_FENCE.defaultBlockState(); + public BlockState pillarState = Blocks.STONE_BRICKS.defaultBlockState(); + public BlockState platformState = Blocks.STONE_SLAB.defaultBlockState(); + public BlockState floorState = Blocks.STONE_BRICKS.defaultBlockState(); + public BlockState roofState = Blocks.STONE_BRICKS.defaultBlockState(); + + public StructurePiece.BlockSelector randomBlocks = new StrongholdStones(); + + public static String getDecoString(TFStructureDecorator deco) { + if (deco instanceof StructureDecoratorDarkTower) { + return "DecoDarkTower"; + } + if (deco instanceof IceTowerDecorator) { + return "DecoIceTower"; + } + if (deco instanceof MushroomTowerDecorator) { + return "DecoMushroomTower"; + } + if (deco instanceof StrongholdDecorator) { + return "DecoStronghold"; + } + if (deco instanceof StructureTFDecoratorCastle) { + return "DecoCastle"; + } + + return ""; + } + + public static TFStructureDecorator getDecoFor(String decoString) { + if (decoString.equals("DecoDarkTower")) { + return new StructureDecoratorDarkTower(); + } + if (decoString.equals("DecoIceTower")) { + return new IceTowerDecorator(); + } + if (decoString.equals("DecoMushroomTower")) { + return new MushroomTowerDecorator(); + } + if (decoString.equals("DecoStronghold")) { + return new StrongholdDecorator(); + } + if (decoString.equals("DecoCastle")) { + return new StructureTFDecoratorCastle(); + } + + return new TFStructureDecorator(); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/TwilightDoubleTemplateStructurePiece.java b/src/main/java/twilightforest/world/components/structures/TwilightDoubleTemplateStructurePiece.java new file mode 100644 index 0000000000..3fb74d9c43 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/TwilightDoubleTemplateStructurePiece.java @@ -0,0 +1,92 @@ +package twilightforest.world.components.structures; + +import com.mojang.brigadier.StringReader; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import net.minecraft.commands.arguments.blocks.BlockStateParser; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Registry; +import net.minecraft.core.registries.Registries; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.StructureMode; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructurePlaceSettings; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplateManager; +import twilightforest.TwilightForestMod; + +public abstract class TwilightDoubleTemplateStructurePiece extends TwilightTemplateStructurePiece { + protected final ResourceLocation templateOverlayLocation; + protected StructureTemplate templateOverlay; + protected StructurePlaceSettings placeSettingsOverlay; + + public TwilightDoubleTemplateStructurePiece(StructurePieceType structurePieceType, CompoundTag compoundTag, StructurePieceSerializationContext ctx, StructurePlaceSettings rl2SettingsFunction, StructurePlaceSettings placeSettingsOverlay) { + super(structurePieceType, compoundTag, ctx, rl2SettingsFunction); + + this.templateOverlayLocation = new ResourceLocation(compoundTag.getString("TemplateOverlay")); + this.templateOverlay = this.structureManager.getOrCreate(this.templateOverlayLocation); + this.placeSettingsOverlay = placeSettingsOverlay; + } + + public TwilightDoubleTemplateStructurePiece(StructurePieceType type, int genDepth, StructureTemplateManager structureManager, ResourceLocation templateLocation, StructurePlaceSettings placeSettings, ResourceLocation templateOverlayLocation, StructurePlaceSettings placeSettingsOverlay, BlockPos startPosition) { + super(type, genDepth, structureManager, templateLocation, placeSettings, startPosition); + + this.templateOverlayLocation = templateOverlayLocation; + this.templateOverlay = this.structureManager.getOrCreate(this.templateOverlayLocation); + this.placeSettingsOverlay = placeSettingsOverlay; + } + + @Override + protected void addAdditionalSaveData(StructurePieceSerializationContext ctx, CompoundTag structureTag) { + super.addAdditionalSaveData(ctx, structureTag); + + structureTag.putString("TemplateOverlay", this.templateOverlayLocation.toString()); + } + + @Override + public void postProcess(WorldGenLevel worldGenLevel, StructureManager structureManager, ChunkGenerator chunkGenerator, RandomSource random, BoundingBox boundingBox, ChunkPos chunkPos, BlockPos blockPos) { + super.postProcess(worldGenLevel, structureManager, chunkGenerator, random, boundingBox, chunkPos, blockPos); + + // [VanillaCopy] TemplateStructurePiece.postProcess + // template -> templateOverlay + // placeSettings -> placeSettingsOverlay + if (this.templateOverlay.placeInWorld(worldGenLevel, this.templatePosition, blockPos, this.placeSettingsOverlay, random, 2)) { + for(StructureTemplate.StructureBlockInfo structureBlockInfo : this.templateOverlay.filterBlocks(this.templatePosition, this.placeSettingsOverlay, Blocks.STRUCTURE_BLOCK)) { + if (structureBlockInfo.nbt != null) { + StructureMode structureMode = StructureMode.valueOf(structureBlockInfo.nbt.getString("mode")); + + if (structureMode == StructureMode.DATA) + this.handleDataMarker(structureBlockInfo.nbt.getString("metadata"), structureBlockInfo.pos, worldGenLevel, random, boundingBox); + } + } + + for(StructureTemplate.StructureBlockInfo structureBlockInfo : this.templateOverlay.filterBlocks(this.templatePosition, this.placeSettingsOverlay, Blocks.JIGSAW)) { + if (structureBlockInfo.nbt != null) { + String s = structureBlockInfo.nbt.getString("final_state"); + BlockState blockState = Blocks.AIR.defaultBlockState(); + try { + BlockState parserState = BlockStateParser.parseForBlock(worldGenLevel.holderLookup(Registries.BLOCK), new StringReader(s), false).blockState(); + if (parserState != null) { + blockState = parserState; + } else { + TwilightForestMod.LOGGER.error("Error while parsing blockstate {} in jigsaw block @ {}", s, structureBlockInfo.pos); + } + } catch (CommandSyntaxException e) { + TwilightForestMod.LOGGER.error("Error while parsing blockstate {} in jigsaw block @ {}", s, structureBlockInfo.pos); + } + + worldGenLevel.setBlock(structureBlockInfo.pos, blockState, 3); + } + } + } + } +} diff --git a/src/main/java/twilightforest/world/components/structures/TwilightTemplateStructurePiece.java b/src/main/java/twilightforest/world/components/structures/TwilightTemplateStructurePiece.java new file mode 100644 index 0000000000..c8e0cafc22 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/TwilightTemplateStructurePiece.java @@ -0,0 +1,96 @@ +package twilightforest.world.components.structures; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Mirror; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.TemplateStructurePiece; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; +import net.minecraft.world.level.levelgen.structure.templatesystem.BlockIgnoreProcessor; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructurePlaceSettings; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplateManager; +import twilightforest.util.ArrayUtil; +import twilightforest.util.BoundingBoxUtils; + +public abstract class TwilightTemplateStructurePiece extends TemplateStructurePiece { + protected final StructureTemplateManager structureManager; + private final BlockPos originalPlacement; + private final BoundingBox originalBox; + + public TwilightTemplateStructurePiece(StructurePieceType structurePieceType, CompoundTag compoundTag, StructurePieceSerializationContext ctx, StructurePlaceSettings rl2SettingsFunction) { + super(structurePieceType, compoundTag, ctx.structureTemplateManager(), rl -> rl2SettingsFunction); + this.rotation = this.getRotation(); + this.mirror = this.getMirror(); + + this.structureManager = ctx.structureTemplateManager(); + + this.originalPlacement = this.templatePosition; + this.originalBox = BoundingBoxUtils.clone(this.boundingBox); + } + + public TwilightTemplateStructurePiece(StructurePieceType type, int genDepth, StructureTemplateManager structureManager, ResourceLocation templateLocation, StructurePlaceSettings placeSettings, BlockPos startPosition) { + super(type, genDepth, structureManager, templateLocation, templateLocation.toString(), placeSettings, startPosition); + this.rotation = this.getRotation(); + this.mirror = this.getMirror(); + + this.structureManager = structureManager; + + this.originalPlacement = this.templatePosition; + this.originalBox = BoundingBoxUtils.clone(this.boundingBox); + } + + @Override + protected void addAdditionalSaveData(StructurePieceSerializationContext ctx, CompoundTag structureTag) { + super.addAdditionalSaveData(ctx, structureTag); + + structureTag.putInt("rotation", this.placeSettings.getRotation().ordinal()); + structureTag.putInt("mirror", this.placeSettings.getMirror().ordinal()); + } + + // This will be required if you want to dig a piece into a noise beard + protected void placePieceAdjusted(WorldGenLevel level, StructureManager structureFeatureManager, ChunkGenerator chunkGenerator, RandomSource random, BoundingBox boundingBox, ChunkPos chunkPos, BlockPos pos, int dY) { + this.templatePosition = this.templatePosition.above(dY); + + super.postProcess(level, structureFeatureManager, chunkGenerator, random, boundingBox, chunkPos, pos.above(dY)); + + this.templatePosition = this.originalPlacement; + this.boundingBox = BoundingBoxUtils.clone(this.originalBox); + + this.placeSettings.setBoundingBox(this.boundingBox); + } + + public static StructurePlaceSettings readSettings(CompoundTag compoundTag) { + return new StructurePlaceSettings() + .setRotation(ArrayUtil.wrapped(Rotation.values(), compoundTag.getInt("rotation"))) + .setMirror(ArrayUtil.wrapped(Mirror.values(), compoundTag.getInt("mirror"))) + .addProcessor(BlockIgnoreProcessor.STRUCTURE_BLOCK); + } + + public static StructurePlaceSettings makeSettings(Rotation rotation) { + return new StructurePlaceSettings().setRotation(rotation).addProcessor(BlockIgnoreProcessor.STRUCTURE_BLOCK); + } + + public static StructurePlaceSettings makeSettings(Rotation rotation, Mirror mirror) { + return new StructurePlaceSettings().setRotation(rotation).setMirror(mirror).addProcessor(BlockIgnoreProcessor.STRUCTURE_BLOCK); + } + + public static StructurePlaceSettings randomRotation(RandomSource random) { + return makeSettings(Rotation.getRandom(random)); + } + + + // Worse case scenario if the terrain still isn't being risen for the Lich Tower, + // then we'll need to do via this. I still have other solutions I'd like to explore first + //@Override + //public BoundingBox getBoundingBox() { + // return this.boundingBox = StructureBoundingBoxUtils.clone(this.originalBox); + //} +} diff --git a/src/main/java/twilightforest/world/components/structures/YetiCaveComponent.java b/src/main/java/twilightforest/world/components/structures/YetiCaveComponent.java new file mode 100644 index 0000000000..e5d6523138 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/YetiCaveComponent.java @@ -0,0 +1,97 @@ +package twilightforest.world.components.structures; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.data.custom.stalactites.entry.Stalactite; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFStructurePieceTypes; +import twilightforest.world.components.feature.BlockSpikeFeature; + +import java.util.Map; + +public class YetiCaveComponent extends HollowHillComponent { + private static final Stalactite BLUE_ICE_SPIKE = new Stalactite(Map.of(Blocks.BLUE_ICE, 1), 1.0F, 8, 1); + private static final Stalactite PACKED_ICE_SPIKE = new Stalactite(Map.of(Blocks.PACKED_ICE, 1), 0.5F, 9, 1); + private static final Stalactite ICE_SPIKE = new Stalactite(Map.of(Blocks.ICE, 1), 0.6F, 10, 1); + + public YetiCaveComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFYeti.get(), nbt); + } + + public YetiCaveComponent(int i, int x, int y, int z) { + super(TFStructurePieceTypes.TFYeti.get(), i, 2, x, y, z); + } + + /** + * Add in all the blocks we're adding. + */ + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + int sn = 64; + + // fill in features + +// // ore or glowing stalactites! (smaller, less plentiful) +// for (int i = 0; i < sn; i++) +// { +// int[] dest = getCoordsInHill2D(rand); +// generateOreStalactite(world, dest[0], 1, dest[1], sbb); +// } + // blue ice stalactites! + for (int i = 0; i < sn; i++) { + BlockPos.MutableBlockPos dest = this.randomCeilingCoordinates(rand, 24); + this.generateBlockSpike(world, BLUE_ICE_SPIKE, dest.getX(), dest.getY(), dest.getZ(), sbb, true); + } + // packed ice stalactites! + for (int i = 0; i < sn; i++) { + BlockPos.MutableBlockPos dest = this.randomCeilingCoordinates(rand, 24); + this.generateBlockSpike(world, PACKED_ICE_SPIKE, dest.getX(), dest.getY(), dest.getZ(), sbb, true); + } + // ice stalactites! + for (int i = 0; i < sn; i++) { + BlockPos.MutableBlockPos dest = this.randomCeilingCoordinates(rand, 24); + this.generateBlockSpike(world, ICE_SPIKE, dest.getX(), dest.getY(), dest.getZ(), sbb, true); + } + // stone stalactites! + for (int i = 0; i < sn; i++) { + BlockPos.MutableBlockPos dest = this.randomCeilingCoordinates(rand, 24); + this.generateBlockSpike(world, BlockSpikeFeature.STONE_STALACTITE, dest.getX(), dest.getY(), dest.getZ(), sbb, true); + } + + // spawn alpha yeti + final BlockState yetiSpawner = TFBlocks.ALPHA_YETI_BOSS_SPAWNER.get().defaultBlockState(); + this.setBlockStateRotated(world, yetiSpawner, this.radius, 1, this.radius, Rotation.NONE, sbb); + } + + /** + * @param cx + * @param cz + * @return true if the coordinates would be inside the hill on the "floor" of the hill + */ + @Override + boolean isInHill(int cx, int cz) { + // yeti cave is square + return cx < this.radius * 2 && cx > 0 && cz < this.radius * 2 && cz > 0; + } + + @Override + BlockPos.MutableBlockPos randomCeilingCoordinates(RandomSource rand, float maximumRadius) { + int rad = (int) maximumRadius; + int x = rand.nextInt(rad * 2) - rad; + int z = rand.nextInt(rad * 2) - rad; + + int dist = Math.min(Math.abs(x), Math.abs(z)); + + return new BlockPos.MutableBlockPos(this.radius + x, 17 - dist / 6, this.radius + z); + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/world/components/structures/courtyard/CourtyardMain.java b/src/main/java/twilightforest/world/components/structures/courtyard/CourtyardMain.java new file mode 100644 index 0000000000..3ab899eaa7 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/courtyard/CourtyardMain.java @@ -0,0 +1,49 @@ +package twilightforest.world.components.structures.courtyard; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import net.minecraft.world.level.levelgen.structure.templatesystem.BlockRotProcessor; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplateManager; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFLandmark; +import twilightforest.init.TFStructurePieceTypes; + +public class CourtyardMain extends StructureMazeGenerator { + static final int ROW_OF_CELLS = 8; + static final int RADIUS = (int) ((((ROW_OF_CELLS - 2) / 2.0F) * 12.0F) + 8); + + static final float HEDGE_FLOOF = 0.5f; + + static final float WALL_DECAY = 0.1f; + static final float WALL_INTEGRITY = 0.95f; + + static final BlockRotProcessor WALL_INTEGRITY_PROCESSOR = new BlockRotProcessor(CourtyardMain.WALL_INTEGRITY); + static final BlockRotProcessor WALL_DECAY_PROCESSOR = new BlockRotProcessor(CourtyardMain.WALL_DECAY); + + public CourtyardMain(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(ctx.structureTemplateManager(), TFStructurePieceTypes.TFNCMn.get(), nbt); + } + + public CourtyardMain(RandomSource rand, int i, int x, int y, int z, StructureTemplateManager structureManager) { + super(TFStructurePieceTypes.TFNCMn.get(), rand, i, ROW_OF_CELLS, ROW_OF_CELLS, x, y, z, structureManager); + + this.setOrientation(Direction.NORTH); + + this.boundingBox = TFLandmark.getComponentToAddBoundingBox(x, y, z, -RADIUS/2, -1, -RADIUS/2, RADIUS, 10, RADIUS, this.getOrientation(), false); + this.sizeConstraints = TFLandmark.getComponentToAddBoundingBox(x, y, z, -RADIUS, -1, -RADIUS, RADIUS * 2, 10, RADIUS * 2, this.getOrientation(), false); + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + // naga spawner seems important + placeBlock(world, TFBlocks.NAGA_BOSS_SPAWNER.get().defaultBlockState(), RADIUS/2, 3, RADIUS/2, sbb); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/courtyard/CourtyardPathPiece.java b/src/main/java/twilightforest/world/components/structures/courtyard/CourtyardPathPiece.java new file mode 100644 index 0000000000..572126b379 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/courtyard/CourtyardPathPiece.java @@ -0,0 +1,39 @@ +package twilightforest.world.components.structures.courtyard; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.ServerLevelAccessor; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplateManager; +import twilightforest.TwilightForestMod; +import twilightforest.world.components.processors.NagastoneVariants; +import twilightforest.world.components.structures.TwilightTemplateStructurePiece; +import twilightforest.init.TFStructurePieceTypes; + +public class CourtyardPathPiece extends TwilightTemplateStructurePiece { + public CourtyardPathPiece(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFNCPa.get(), nbt, ctx, readSettings(nbt).addProcessor(NagastoneVariants.INSTANCE)); + } + + public CourtyardPathPiece(int i, int x, int y, int z, StructureTemplateManager structureManager) { + super(TFStructurePieceTypes.TFNCPa.get(), i, structureManager, TwilightForestMod.prefix("courtyard/pathway"), makeSettings(Rotation.NONE).addProcessor(NagastoneVariants.INSTANCE), new BlockPos(x, y + 1, z)); + } + + @Override + public void postProcess(WorldGenLevel level, StructureManager structureFeatureManager, ChunkGenerator chunkGenerator, RandomSource random, BoundingBox boundingBox, ChunkPos chunkPos, BlockPos pos) { + this.placePieceAdjusted(level, structureFeatureManager, chunkGenerator, random, boundingBox, chunkPos, pos, -1); + } + + + @Override + protected void handleDataMarker(String label, BlockPos pos, ServerLevelAccessor levelAccessor, RandomSource random, BoundingBox boundingBox) { + + } +} diff --git a/src/main/java/twilightforest/world/components/structures/courtyard/CourtyardTerraceBrazier.java b/src/main/java/twilightforest/world/components/structures/courtyard/CourtyardTerraceBrazier.java new file mode 100644 index 0000000000..e83de0dfa2 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/courtyard/CourtyardTerraceBrazier.java @@ -0,0 +1,39 @@ +package twilightforest.world.components.structures.courtyard; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.ServerLevelAccessor; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplateManager; +import twilightforest.TwilightForestMod; +import twilightforest.world.components.processors.NagastoneVariants; +import twilightforest.world.components.processors.StoneBricksVariants; +import twilightforest.world.components.structures.TwilightTemplateStructurePiece; +import twilightforest.init.TFStructurePieceTypes; + +public class CourtyardTerraceBrazier extends TwilightTemplateStructurePiece { + public CourtyardTerraceBrazier(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFNCTr.get(), nbt, ctx, readSettings(nbt).addProcessor(CourtyardTerraceTemplateProcessor.INSTANCE).addProcessor(NagastoneVariants.INSTANCE).addProcessor(StoneBricksVariants.INSTANCE)); + } + + public CourtyardTerraceBrazier(int i, int x, int y, int z, Rotation rotation, StructureTemplateManager structureManager) { + super(TFStructurePieceTypes.TFNCTr.get(), i, structureManager, TwilightForestMod.prefix("courtyard/terrace_fire"), makeSettings(rotation).addProcessor(CourtyardTerraceTemplateProcessor.INSTANCE).addProcessor(NagastoneVariants.INSTANCE).addProcessor(StoneBricksVariants.INSTANCE), new BlockPos(x, y + 3, z)); + } + + @Override + public void postProcess(WorldGenLevel level, StructureManager structureFeatureManager, ChunkGenerator chunkGenerator, RandomSource random, BoundingBox boundingBox, ChunkPos chunkPos, BlockPos pos) { + this.placePieceAdjusted(level, structureFeatureManager, chunkGenerator, random, boundingBox, chunkPos, pos, -3); + } + + @Override + protected void handleDataMarker(String label, BlockPos pos, ServerLevelAccessor levelAccessor, RandomSource random, BoundingBox boundingBox) { + + } +} diff --git a/src/main/java/twilightforest/world/components/structures/courtyard/CourtyardTerraceDuct.java b/src/main/java/twilightforest/world/components/structures/courtyard/CourtyardTerraceDuct.java new file mode 100644 index 0000000000..931aa6d53c --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/courtyard/CourtyardTerraceDuct.java @@ -0,0 +1,39 @@ +package twilightforest.world.components.structures.courtyard; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.ServerLevelAccessor; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplateManager; +import twilightforest.TwilightForestMod; +import twilightforest.world.components.processors.NagastoneVariants; +import twilightforest.world.components.processors.StoneBricksVariants; +import twilightforest.world.components.structures.TwilightTemplateStructurePiece; +import twilightforest.init.TFStructurePieceTypes; + +public class CourtyardTerraceDuct extends TwilightTemplateStructurePiece { + public CourtyardTerraceDuct(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFNCDu.get(), nbt, ctx, readSettings(nbt).addProcessor(CourtyardTerraceTemplateProcessor.INSTANCE).addProcessor(NagastoneVariants.INSTANCE).addProcessor(StoneBricksVariants.INSTANCE)); + } + + public CourtyardTerraceDuct(int i, int x, int y, int z, Rotation rotation, StructureTemplateManager structureManager) { + super(TFStructurePieceTypes.TFNCDu.get(), i, structureManager, TwilightForestMod.prefix("courtyard/terrace_duct"), makeSettings(rotation).addProcessor(CourtyardTerraceTemplateProcessor.INSTANCE).addProcessor(NagastoneVariants.INSTANCE).addProcessor(StoneBricksVariants.INSTANCE), new BlockPos(x, y + 3, z)); + } + + @Override + public void postProcess(WorldGenLevel level, StructureManager structureFeatureManager, ChunkGenerator chunkGenerator, RandomSource random, BoundingBox boundingBox, ChunkPos chunkPos, BlockPos pos) { + this.placePieceAdjusted(level, structureFeatureManager, chunkGenerator, random, boundingBox, chunkPos, pos, -3); + } + + @Override + protected void handleDataMarker(String label, BlockPos pos, ServerLevelAccessor levelAccessor, RandomSource random, BoundingBox boundingBox) { + + } +} diff --git a/src/main/java/twilightforest/world/components/structures/courtyard/CourtyardTerraceStatue.java b/src/main/java/twilightforest/world/components/structures/courtyard/CourtyardTerraceStatue.java new file mode 100644 index 0000000000..571e2abb49 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/courtyard/CourtyardTerraceStatue.java @@ -0,0 +1,39 @@ +package twilightforest.world.components.structures.courtyard; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.ServerLevelAccessor; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplateManager; +import twilightforest.TwilightForestMod; +import twilightforest.world.components.processors.NagastoneVariants; +import twilightforest.world.components.processors.StoneBricksVariants; +import twilightforest.world.components.structures.TwilightTemplateStructurePiece; +import twilightforest.init.TFStructurePieceTypes; + +public class CourtyardTerraceStatue extends TwilightTemplateStructurePiece { + public CourtyardTerraceStatue(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFNCSt.get(), nbt, ctx, readSettings(nbt).addProcessor(CourtyardTerraceTemplateProcessor.INSTANCE).addProcessor(NagastoneVariants.INSTANCE).addProcessor(StoneBricksVariants.INSTANCE)); + } + + public CourtyardTerraceStatue(int i, int x, int y, int z, Rotation rotation, StructureTemplateManager structureManager) { + super(TFStructurePieceTypes.TFNCSt.get(), i, structureManager, TwilightForestMod.prefix("terrace_statue/terrace_fire"), makeSettings(rotation).addProcessor(CourtyardTerraceTemplateProcessor.INSTANCE).addProcessor(NagastoneVariants.INSTANCE).addProcessor(StoneBricksVariants.INSTANCE), new BlockPos(x, y + 3, z)); + } + + @Override + public void postProcess(WorldGenLevel level, StructureManager structureFeatureManager, ChunkGenerator chunkGenerator, RandomSource random, BoundingBox boundingBox, ChunkPos chunkPos, BlockPos pos) { + this.placePieceAdjusted(level, structureFeatureManager, chunkGenerator, random, boundingBox, chunkPos, pos, -3); + } + + @Override + protected void handleDataMarker(String label, BlockPos pos, ServerLevelAccessor levelAccessor, RandomSource random, BoundingBox boundingBox) { + + } +} diff --git a/src/main/java/twilightforest/world/components/structures/courtyard/CourtyardTerraceTemplateProcessor.java b/src/main/java/twilightforest/world/components/structures/courtyard/CourtyardTerraceTemplateProcessor.java new file mode 100644 index 0000000000..57230812e3 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/courtyard/CourtyardTerraceTemplateProcessor.java @@ -0,0 +1,66 @@ +package twilightforest.world.components.structures.courtyard; + +import com.mojang.serialization.Codec; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.SlabBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.SlabType; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructurePlaceSettings; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureProcessor; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureProcessorType; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; +import twilightforest.init.TFStructureProcessors; + +import org.jetbrains.annotations.Nullable; +import java.util.HashSet; + +public final class CourtyardTerraceTemplateProcessor extends StructureProcessor { + public static final CourtyardTerraceTemplateProcessor INSTANCE = new CourtyardTerraceTemplateProcessor(); + public static final Codec CODEC = Codec.unit(() -> INSTANCE); + + private static final HashSet BLOCKS_REPLACE_TO_SLAB = new HashSet<>(); + + static { + BLOCKS_REPLACE_TO_SLAB.add(Blocks.STONE_BRICKS.defaultBlockState()); + BLOCKS_REPLACE_TO_SLAB.add(Blocks.MOSSY_STONE_BRICKS.defaultBlockState()); + BLOCKS_REPLACE_TO_SLAB.add(Blocks.CRACKED_STONE_BRICKS.defaultBlockState()); + BLOCKS_REPLACE_TO_SLAB.add(Blocks.STONE_BRICK_SLAB.defaultBlockState()); + BLOCKS_REPLACE_TO_SLAB.add(Blocks.MOSSY_STONE_BRICK_SLAB.defaultBlockState()); + } + + private CourtyardTerraceTemplateProcessor() { + } + + @Nullable + @Override + public StructureTemplate.StructureBlockInfo process(LevelReader world, BlockPos pos, BlockPos piecepos, StructureTemplate.StructureBlockInfo oldinfo, StructureTemplate.StructureBlockInfo newInfo, StructurePlaceSettings settings, @Nullable StructureTemplate template) { + BlockState newState = newInfo.state; + + if (newState.getBlock() == Blocks.SANDSTONE_SLAB) { + BlockState stateAt = world.getBlockState(newInfo.pos); + + if (newState == Blocks.SANDSTONE_SLAB.defaultBlockState().setValue(SlabBlock.TYPE, SlabType.DOUBLE)) { + if (BLOCKS_REPLACE_TO_SLAB.contains(stateAt)) + return new StructureTemplate.StructureBlockInfo(newInfo.pos, Blocks.STONE_BRICK_SLAB.defaultBlockState(), null); + else if (stateAt.isAir()) + return null; + else + return new StructureTemplate.StructureBlockInfo(newInfo.pos, Blocks.STONE_BRICKS.defaultBlockState(), null); + } + + if (stateAt.isAir()) + return null; + else + return new StructureTemplate.StructureBlockInfo(newInfo.pos, Blocks.STONE_BRICK_SLAB.defaultBlockState(), null); + } + + return newInfo; + } + + @Override + public StructureProcessorType getType() { + return TFStructureProcessors.COURTYARD_TERRACE.get(); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/courtyard/CourtyardWall.java b/src/main/java/twilightforest/world/components/structures/courtyard/CourtyardWall.java new file mode 100644 index 0000000000..16b4bfdb50 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/courtyard/CourtyardWall.java @@ -0,0 +1,45 @@ +package twilightforest.world.components.structures.courtyard; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ServerLevelAccessor; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplateManager; +import twilightforest.TwilightForestMod; +import twilightforest.world.components.processors.CobbleVariants; +import twilightforest.world.components.processors.NagastoneVariants; +import twilightforest.world.components.processors.SmoothStoneVariants; +import twilightforest.world.components.processors.StoneBricksVariants; +import twilightforest.world.components.structures.TwilightDoubleTemplateStructurePiece; +import twilightforest.init.TFStructurePieceTypes; + +public class CourtyardWall extends TwilightDoubleTemplateStructurePiece { + public CourtyardWall(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFNCWl.get(), + nbt, + ctx, + readSettings(nbt).addProcessor(CourtyardMain.WALL_INTEGRITY_PROCESSOR).addProcessor(SmoothStoneVariants.INSTANCE).addProcessor(NagastoneVariants.INSTANCE).addProcessor(StoneBricksVariants.INSTANCE).addProcessor(CobbleVariants.INSTANCE), + readSettings(nbt).addProcessor(CourtyardMain.WALL_DECAY_PROCESSOR).addProcessor(CobbleVariants.INSTANCE) + ); + } + + public CourtyardWall(int i, int x, int y, int z, Rotation rotation, StructureTemplateManager structureManager) { + super(TFStructurePieceTypes.TFNCWl.get(), + i, + structureManager, + TwilightForestMod.prefix("courtyard/courtyard_wall"), + makeSettings(rotation).addProcessor(CourtyardMain.WALL_INTEGRITY_PROCESSOR).addProcessor(SmoothStoneVariants.INSTANCE).addProcessor(NagastoneVariants.INSTANCE).addProcessor(StoneBricksVariants.INSTANCE).addProcessor(CobbleVariants.INSTANCE), + TwilightForestMod.prefix("courtyard/courtyard_wall_decayed"), + makeSettings(rotation).addProcessor(CourtyardMain.WALL_DECAY_PROCESSOR).addProcessor(CobbleVariants.INSTANCE), + new BlockPos(x, y, z) + ); + } + + @Override + protected void handleDataMarker(String label, BlockPos pos, ServerLevelAccessor levelAccessor, RandomSource random, BoundingBox boundingBox) { + + } +} diff --git a/src/main/java/twilightforest/world/components/structures/courtyard/CourtyardWallCornerInner.java b/src/main/java/twilightforest/world/components/structures/courtyard/CourtyardWallCornerInner.java new file mode 100644 index 0000000000..8b8d0be1b5 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/courtyard/CourtyardWallCornerInner.java @@ -0,0 +1,45 @@ +package twilightforest.world.components.structures.courtyard; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ServerLevelAccessor; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplateManager; +import twilightforest.TwilightForestMod; +import twilightforest.world.components.processors.CobbleVariants; +import twilightforest.world.components.processors.NagastoneVariants; +import twilightforest.world.components.processors.SmoothStoneVariants; +import twilightforest.world.components.processors.StoneBricksVariants; +import twilightforest.world.components.structures.TwilightDoubleTemplateStructurePiece; +import twilightforest.init.TFStructurePieceTypes; + +public class CourtyardWallCornerInner extends TwilightDoubleTemplateStructurePiece { + public CourtyardWallCornerInner(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFNCWA.get(), + nbt, + ctx, + readSettings(nbt).addProcessor(CourtyardMain.WALL_INTEGRITY_PROCESSOR).addProcessor(SmoothStoneVariants.INSTANCE).addProcessor(NagastoneVariants.INSTANCE).addProcessor(StoneBricksVariants.INSTANCE).addProcessor(CobbleVariants.INSTANCE), + readSettings(nbt).addProcessor(CourtyardMain.WALL_DECAY_PROCESSOR).addProcessor(CobbleVariants.INSTANCE) + ); + } + + public CourtyardWallCornerInner(int i, int x, int y, int z, Rotation rotation, StructureTemplateManager structureManager) { + super(TFStructurePieceTypes.TFNCWA.get(), + i, + structureManager, + TwilightForestMod.prefix("courtyard/courtyard_wall_corner_inner"), + makeSettings(rotation).addProcessor(CourtyardMain.WALL_INTEGRITY_PROCESSOR).addProcessor(SmoothStoneVariants.INSTANCE).addProcessor(NagastoneVariants.INSTANCE).addProcessor(StoneBricksVariants.INSTANCE).addProcessor(CobbleVariants.INSTANCE), + TwilightForestMod.prefix("courtyard/courtyard_wall_corner_inner_decayed"), + makeSettings(rotation).addProcessor(CourtyardMain.WALL_DECAY_PROCESSOR).addProcessor(CobbleVariants.INSTANCE), + new BlockPos(x, y, z) + ); + } + + @Override + protected void handleDataMarker(String label, BlockPos pos, ServerLevelAccessor levelAccessor, RandomSource random, BoundingBox boundingBox) { + + } +} diff --git a/src/main/java/twilightforest/world/components/structures/courtyard/CourtyardWallCornerOuter.java b/src/main/java/twilightforest/world/components/structures/courtyard/CourtyardWallCornerOuter.java new file mode 100644 index 0000000000..f6ba478ebf --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/courtyard/CourtyardWallCornerOuter.java @@ -0,0 +1,45 @@ +package twilightforest.world.components.structures.courtyard; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ServerLevelAccessor; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplateManager; +import twilightforest.TwilightForestMod; +import twilightforest.world.components.processors.CobbleVariants; +import twilightforest.world.components.processors.NagastoneVariants; +import twilightforest.world.components.processors.SmoothStoneVariants; +import twilightforest.world.components.processors.StoneBricksVariants; +import twilightforest.world.components.structures.TwilightDoubleTemplateStructurePiece; +import twilightforest.init.TFStructurePieceTypes; + +public class CourtyardWallCornerOuter extends TwilightDoubleTemplateStructurePiece { + public CourtyardWallCornerOuter(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFNCWC.get(), + nbt, + ctx, + readSettings(nbt).addProcessor(CourtyardMain.WALL_INTEGRITY_PROCESSOR).addProcessor(SmoothStoneVariants.INSTANCE).addProcessor(NagastoneVariants.INSTANCE).addProcessor(StoneBricksVariants.INSTANCE).addProcessor(CobbleVariants.INSTANCE), + readSettings(nbt).addProcessor(CourtyardMain.WALL_DECAY_PROCESSOR).addProcessor(CobbleVariants.INSTANCE) + ); + } + + public CourtyardWallCornerOuter(int i, int x, int y, int z, Rotation rotation, StructureTemplateManager structureManager) { + super(TFStructurePieceTypes.TFNCWC.get(), + i, + structureManager, + TwilightForestMod.prefix("courtyard/courtyard_wall_corner"), + makeSettings(rotation).addProcessor(CourtyardMain.WALL_INTEGRITY_PROCESSOR).addProcessor(SmoothStoneVariants.INSTANCE).addProcessor(NagastoneVariants.INSTANCE).addProcessor(StoneBricksVariants.INSTANCE).addProcessor(CobbleVariants.INSTANCE), + TwilightForestMod.prefix("courtyard/courtyard_wall_corner_decayed"), + makeSettings(rotation).addProcessor(CourtyardMain.WALL_DECAY_PROCESSOR).addProcessor(CobbleVariants.INSTANCE), + new BlockPos(x, y, z) + ); + } + + @Override + protected void handleDataMarker(String label, BlockPos pos, ServerLevelAccessor levelAccessor, RandomSource random, BoundingBox boundingBox) { + + } +} diff --git a/src/main/java/twilightforest/world/components/structures/courtyard/CourtyardWallPadder.java b/src/main/java/twilightforest/world/components/structures/courtyard/CourtyardWallPadder.java new file mode 100644 index 0000000000..f3267af280 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/courtyard/CourtyardWallPadder.java @@ -0,0 +1,45 @@ +package twilightforest.world.components.structures.courtyard; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ServerLevelAccessor; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplateManager; +import twilightforest.TwilightForestMod; +import twilightforest.world.components.processors.CobbleVariants; +import twilightforest.world.components.processors.NagastoneVariants; +import twilightforest.world.components.processors.SmoothStoneVariants; +import twilightforest.world.components.processors.StoneBricksVariants; +import twilightforest.world.components.structures.TwilightDoubleTemplateStructurePiece; +import twilightforest.init.TFStructurePieceTypes; + +public class CourtyardWallPadder extends TwilightDoubleTemplateStructurePiece { + public CourtyardWallPadder(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFNCWP.get(), + nbt, + ctx, + readSettings(nbt).addProcessor(CourtyardMain.WALL_INTEGRITY_PROCESSOR).addProcessor(SmoothStoneVariants.INSTANCE).addProcessor(NagastoneVariants.INSTANCE).addProcessor(StoneBricksVariants.INSTANCE).addProcessor(CobbleVariants.INSTANCE), + readSettings(nbt).addProcessor(CourtyardMain.WALL_DECAY_PROCESSOR).addProcessor(CobbleVariants.INSTANCE) + ); + } + + public CourtyardWallPadder(int i, int x, int y, int z, Rotation rotation, StructureTemplateManager structureManager) { + super(TFStructurePieceTypes.TFNCWP.get(), + i, + structureManager, + TwilightForestMod.prefix("courtyard/courtyard_wall_padding"), + makeSettings(rotation).addProcessor(CourtyardMain.WALL_INTEGRITY_PROCESSOR).addProcessor(SmoothStoneVariants.INSTANCE).addProcessor(NagastoneVariants.INSTANCE).addProcessor(StoneBricksVariants.INSTANCE).addProcessor(CobbleVariants.INSTANCE), + TwilightForestMod.prefix("courtyard/courtyard_wall_padding_decayed"), + makeSettings(rotation).addProcessor(CourtyardMain.WALL_DECAY_PROCESSOR).addProcessor(CobbleVariants.INSTANCE), + new BlockPos(x, y, z) + ); + } + + @Override + protected void handleDataMarker(String label, BlockPos pos, ServerLevelAccessor levelAccessor, RandomSource random, BoundingBox boundingBox) { + + } +} diff --git a/src/main/java/twilightforest/world/components/structures/courtyard/NagaCourtyardHedgeAbstractComponent.java b/src/main/java/twilightforest/world/components/structures/courtyard/NagaCourtyardHedgeAbstractComponent.java new file mode 100644 index 0000000000..76791b3942 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/courtyard/NagaCourtyardHedgeAbstractComponent.java @@ -0,0 +1,56 @@ +package twilightforest.world.components.structures.courtyard; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; +import net.minecraft.world.level.levelgen.structure.templatesystem.BlockIgnoreProcessor; +import net.minecraft.world.level.levelgen.structure.templatesystem.BlockRotProcessor; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplateManager; +import twilightforest.world.components.processors.NagastoneVariants; +import twilightforest.world.components.structures.TFStructureComponentTemplate; + +public abstract class NagaCourtyardHedgeAbstractComponent extends TFStructureComponentTemplate { + + private final ResourceLocation HEDGE; + private final ResourceLocation HEDGE_BIG; + + private StructureTemplate templateBig; + + public NagaCourtyardHedgeAbstractComponent(StructurePieceSerializationContext ctx, StructurePieceType piece, CompoundTag nbt, ResourceLocation hedge, ResourceLocation hedgeBig) { + super(ctx, piece, nbt); + this.HEDGE = hedge; + this.HEDGE_BIG = hedgeBig; + } + + @SuppressWarnings("WeakerAccess") + public NagaCourtyardHedgeAbstractComponent(StructureTemplateManager manager, StructurePieceType type, int i, int x, int y, int z, Rotation rotation, ResourceLocation hedge, ResourceLocation hedgeBig) { + super(manager, type, i, x, y, z, rotation); + this.HEDGE = hedge; + this.HEDGE_BIG = hedgeBig; + } + + @Override + protected void loadTemplates(StructureTemplateManager templateManager) { + TEMPLATE = templateManager.getOrCreate(HEDGE); + templateBig = templateManager.getOrCreate(HEDGE_BIG); + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource random, BoundingBox structureBoundingBox, ChunkPos chunkPosIn, BlockPos blockPos) { + placeSettings.setBoundingBox(structureBoundingBox).clearProcessors(); + if (TEMPLATE == null) // FIXME: this should never be null in the first place + LAZY_TEMPLATE_LOADER.run(); + TEMPLATE.placeInWorld(world, rotatedPosition, rotatedPosition, placeSettings.clearProcessors().addProcessor(NagastoneVariants.INSTANCE), random, 18); + templateBig.placeInWorld(world, rotatedPosition, rotatedPosition, placeSettings.addProcessor(BlockIgnoreProcessor.AIR).addProcessor(new BlockRotProcessor(CourtyardMain.HEDGE_FLOOF)), random, 18); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/courtyard/NagaCourtyardHedgeCapComponent.java b/src/main/java/twilightforest/world/components/structures/courtyard/NagaCourtyardHedgeCapComponent.java new file mode 100644 index 0000000000..d8a4cb5b38 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/courtyard/NagaCourtyardHedgeCapComponent.java @@ -0,0 +1,21 @@ +package twilightforest.world.components.structures.courtyard; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplateManager; +import twilightforest.TwilightForestMod; +import twilightforest.init.TFStructurePieceTypes; + +public class NagaCourtyardHedgeCapComponent extends NagaCourtyardHedgeAbstractComponent { + + public NagaCourtyardHedgeCapComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(ctx, TFStructurePieceTypes.TFNCCp.get(), nbt, new ResourceLocation(TwilightForestMod.ID, "courtyard/hedge_end"), new ResourceLocation(TwilightForestMod.ID, "courtyard/hedge_end_big")); + } + + @SuppressWarnings("WeakerAccess") + public NagaCourtyardHedgeCapComponent(StructureTemplateManager manager, int i, int x, int y, int z, Rotation rotation) { + super(manager, TFStructurePieceTypes.TFNCCp.get(), i, x, y, z, rotation, new ResourceLocation(TwilightForestMod.ID, "courtyard/hedge_end"), new ResourceLocation(TwilightForestMod.ID, "courtyard/hedge_end_big")); + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/world/components/structures/courtyard/NagaCourtyardHedgeCapPillarComponent.java b/src/main/java/twilightforest/world/components/structures/courtyard/NagaCourtyardHedgeCapPillarComponent.java new file mode 100644 index 0000000000..75e3ec60b9 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/courtyard/NagaCourtyardHedgeCapPillarComponent.java @@ -0,0 +1,19 @@ +package twilightforest.world.components.structures.courtyard; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplateManager; +import twilightforest.TwilightForestMod; +import twilightforest.init.TFStructurePieceTypes; + +public class NagaCourtyardHedgeCapPillarComponent extends NagaCourtyardHedgeAbstractComponent { + public NagaCourtyardHedgeCapPillarComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(ctx, TFStructurePieceTypes.TFNCCpP.get(), nbt, new ResourceLocation(TwilightForestMod.ID, "courtyard/hedge_end_pillar"), new ResourceLocation(TwilightForestMod.ID, "courtyard/hedge_end_pillar_big")); + } + + public NagaCourtyardHedgeCapPillarComponent(StructureTemplateManager manager, int i, int x, int y, int z, Rotation rotation) { + super(manager, TFStructurePieceTypes.TFNCCpP.get(), i, x, y, z, rotation, new ResourceLocation(TwilightForestMod.ID, "courtyard/hedge_end_pillar"), new ResourceLocation(TwilightForestMod.ID, "courtyard/hedge_end_pillar_big")); + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/world/components/structures/courtyard/NagaCourtyardHedgeCornerComponent.java b/src/main/java/twilightforest/world/components/structures/courtyard/NagaCourtyardHedgeCornerComponent.java new file mode 100644 index 0000000000..d74a4284c6 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/courtyard/NagaCourtyardHedgeCornerComponent.java @@ -0,0 +1,19 @@ +package twilightforest.world.components.structures.courtyard; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplateManager; +import twilightforest.TwilightForestMod; +import twilightforest.init.TFStructurePieceTypes; + +public class NagaCourtyardHedgeCornerComponent extends NagaCourtyardHedgeAbstractComponent { + public NagaCourtyardHedgeCornerComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(ctx, TFStructurePieceTypes.TFNCCr.get(), nbt, new ResourceLocation(TwilightForestMod.ID, "courtyard/hedge_corner"), new ResourceLocation(TwilightForestMod.ID, "courtyard/hedge_corner_big")); + } + + public NagaCourtyardHedgeCornerComponent(StructureTemplateManager manager, int i, int x, int y, int z, Rotation rotation) { + super(manager, TFStructurePieceTypes.TFNCCr.get(), i, x, y, z, rotation, new ResourceLocation(TwilightForestMod.ID, "courtyard/hedge_corner"), new ResourceLocation(TwilightForestMod.ID, "courtyard/hedge_corner_big")); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/courtyard/NagaCourtyardHedgeIntersectionComponent.java b/src/main/java/twilightforest/world/components/structures/courtyard/NagaCourtyardHedgeIntersectionComponent.java new file mode 100644 index 0000000000..937cdf4cfd --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/courtyard/NagaCourtyardHedgeIntersectionComponent.java @@ -0,0 +1,19 @@ +package twilightforest.world.components.structures.courtyard; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplateManager; +import twilightforest.TwilightForestMod; +import twilightforest.init.TFStructurePieceTypes; + +public class NagaCourtyardHedgeIntersectionComponent extends NagaCourtyardHedgeAbstractComponent { + public NagaCourtyardHedgeIntersectionComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(ctx, TFStructurePieceTypes.TFNCIs.get(), nbt, new ResourceLocation(TwilightForestMod.ID, "courtyard/hedge_intersection"), new ResourceLocation(TwilightForestMod.ID, "courtyard/hedge_intersection_big")); + } + + public NagaCourtyardHedgeIntersectionComponent(StructureTemplateManager manager, int i, int x, int y, int z, Rotation rotation) { + super(manager, TFStructurePieceTypes.TFNCIs.get(), i, x, y, z, rotation, new ResourceLocation(TwilightForestMod.ID, "courtyard/hedge_intersection"), new ResourceLocation(TwilightForestMod.ID, "courtyard/hedge_intersection_big")); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/courtyard/NagaCourtyardHedgeLineComponent.java b/src/main/java/twilightforest/world/components/structures/courtyard/NagaCourtyardHedgeLineComponent.java new file mode 100644 index 0000000000..233db1d058 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/courtyard/NagaCourtyardHedgeLineComponent.java @@ -0,0 +1,19 @@ +package twilightforest.world.components.structures.courtyard; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplateManager; +import twilightforest.TwilightForestMod; +import twilightforest.init.TFStructurePieceTypes; + +public class NagaCourtyardHedgeLineComponent extends NagaCourtyardHedgeAbstractComponent { + public NagaCourtyardHedgeLineComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(ctx, TFStructurePieceTypes.TFNCLn.get(), nbt, new ResourceLocation(TwilightForestMod.ID, "courtyard/hedge_line"), new ResourceLocation(TwilightForestMod.ID, "courtyard/hedge_line_big")); + } + + public NagaCourtyardHedgeLineComponent(StructureTemplateManager manager, int i, int x, int y, int z, Rotation rotation) { + super(manager, TFStructurePieceTypes.TFNCLn.get(), i, x, y, z, rotation, new ResourceLocation(TwilightForestMod.ID, "courtyard/hedge_line"), new ResourceLocation(TwilightForestMod.ID, "courtyard/hedge_line_big")); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/courtyard/NagaCourtyardHedgePadderComponent.java b/src/main/java/twilightforest/world/components/structures/courtyard/NagaCourtyardHedgePadderComponent.java new file mode 100644 index 0000000000..ebecc7e34c --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/courtyard/NagaCourtyardHedgePadderComponent.java @@ -0,0 +1,19 @@ +package twilightforest.world.components.structures.courtyard; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplateManager; +import twilightforest.TwilightForestMod; +import twilightforest.init.TFStructurePieceTypes; + +public class NagaCourtyardHedgePadderComponent extends NagaCourtyardHedgeAbstractComponent { + public NagaCourtyardHedgePadderComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(ctx, TFStructurePieceTypes.TFNCPd.get(), nbt, new ResourceLocation(TwilightForestMod.ID, "courtyard/hedge_between"), new ResourceLocation(TwilightForestMod.ID, "courtyard/hedge_between_big")); + } + + public NagaCourtyardHedgePadderComponent(StructureTemplateManager manager, int i, int x, int y, int z, Rotation rotation) { + super(manager, TFStructurePieceTypes.TFNCPd.get(), i, x, y, z, rotation, new ResourceLocation(TwilightForestMod.ID, "courtyard/hedge_between"), new ResourceLocation(TwilightForestMod.ID, "courtyard/hedge_between_big")); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/courtyard/NagaCourtyardHedgeTJunctionComponent.java b/src/main/java/twilightforest/world/components/structures/courtyard/NagaCourtyardHedgeTJunctionComponent.java new file mode 100644 index 0000000000..efa3f39549 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/courtyard/NagaCourtyardHedgeTJunctionComponent.java @@ -0,0 +1,19 @@ +package twilightforest.world.components.structures.courtyard; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplateManager; +import twilightforest.TwilightForestMod; +import twilightforest.init.TFStructurePieceTypes; + +public class NagaCourtyardHedgeTJunctionComponent extends NagaCourtyardHedgeAbstractComponent { + public NagaCourtyardHedgeTJunctionComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(ctx, TFStructurePieceTypes.TFNCT.get(), nbt, new ResourceLocation(TwilightForestMod.ID, "courtyard/hedge_t"), new ResourceLocation(TwilightForestMod.ID, "courtyard/hedge_t_big")); + } + + public NagaCourtyardHedgeTJunctionComponent(StructureTemplateManager manager, int i, int x, int y, int z, Rotation rotation) { + super(manager, TFStructurePieceTypes.TFNCT.get(), i, x, y, z, rotation, new ResourceLocation(TwilightForestMod.ID, "courtyard/hedge_t"), new ResourceLocation(TwilightForestMod.ID, "courtyard/hedge_t_big")); + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/world/components/structures/courtyard/StructureMazeGenerator.java b/src/main/java/twilightforest/world/components/structures/courtyard/StructureMazeGenerator.java new file mode 100644 index 0000000000..76c57977e6 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/courtyard/StructureMazeGenerator.java @@ -0,0 +1,635 @@ +package twilightforest.world.components.structures.courtyard; + +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.IntTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.Tag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplateManager; +import twilightforest.enums.Diagonals; +import twilightforest.util.BoundingBoxUtils; +import twilightforest.world.components.structures.TFStructureComponent; + +public abstract class StructureMazeGenerator extends TFStructureComponent { + protected int[][] maze; + private final int[][] cornerClipping = new int[4][2]; + private final int widthInCellCount; + private final int heightInCellCount; + private final StructureTemplateManager structureManager; + protected BoundingBox sizeConstraints; + + public StructureMazeGenerator(StructureTemplateManager structureManager, StructurePieceType piece, CompoundTag nbt) { + super(piece, nbt); + + this.widthInCellCount = nbt.getInt("mazeWidth"); + this.heightInCellCount = nbt.getInt("mazeHeight"); + + maze = new int[this.widthInCellCount-1][this.heightInCellCount-1]; + + ListTag mazeX = nbt.getList("maze", 9); + + for (int x = 0; x < widthInCellCount-1; x++) { + Tag mazeY = mazeX.get(x); + + if (mazeY instanceof ListTag) + for (int y = 0; y < heightInCellCount - 1; y++) maze[x][y] = ((ListTag) mazeY).getInt(y); + } + + this.sizeConstraints = BoundingBoxUtils.NBTToBoundingBox(nbt.getCompound("constraints")); + this.structureManager = structureManager; + } + + StructureMazeGenerator(StructurePieceType type, RandomSource rand, int i, int widthInCellCount, int heightInCellCount, int x, int y, int z, StructureTemplateManager structureManager) { + super(type, i, x, y, z); + this.widthInCellCount = widthInCellCount; + this.heightInCellCount = heightInCellCount; + this.structureManager = structureManager; + this.maze = new int[widthInCellCount-1][heightInCellCount-1]; + generateMaze(this.maze, this.cornerClipping, rand, this.widthInCellCount, this.heightInCellCount, 2); + this.sizeConstraints = this.getBoundingBox(); + } + + // Actually assemble maze + @Override + public void addChildren(StructurePiece structureComponent, StructurePieceAccessor list, RandomSource random) { + super.addChildren(structureComponent, list, random); + final int offset = 6; + + final Rotation[] rotations = Rotation.values(); + + this.processInnerWallsAndFloor(structureComponent, list, random, offset, rotations); + + this.processOuterWalls(structureComponent, list, random, offset, rotations); + } + + @SuppressWarnings("SameParameterValue") + private static void generateMaze(int[][] maze, int[][] cornerClippings, RandomSource random, int widthInCellCount, int heightInCellCount, int maximumClipping) { + // Trying to keep this optimized for speed I guess + + // Generates a connection map for the walls. It modifies the two-dimensional int array, inserting packed binary strings as ints. + // A One in its binary interpretation means the wall connects in this direction. + // As a result of this being a "connectome" of maze walls. It is "Size In Cell count" - 1. + + final WallFacing[][] rotations = new WallFacing[maze.length][maze[0].length]; + + for (int x = 0; x < widthInCellCount-1; x++) { + for (int y = 0; y < heightInCellCount-1; y++) { + rotations[x][y] = WallFacing.values()[random.nextInt(WallFacing.values().length)]; + // set the initial base byte + maze[x][y] |= rotations[x][y].BYTE; + } + } + + final int[][] mazeLocal = maze.clone(); + + int halfWayPointX = (widthInCellCount / 2) - 1; + int halfWayPointY = (heightInCellCount / 2) - 1; + + for (int y = 0; y < heightInCellCount-1; y++) { + for (int x = 0; x < widthInCellCount-1; x++) { + if (x == halfWayPointX && y == halfWayPointY) continue; + + // Did we pick west and will we not get an AIOOBException accessing array + if (rotations[x][y] == WallFacing.WEST && x > 0) { + // If neighbor does not connect to west, connect it to east + if (!rotations[x][y].unpackAndTest(maze[x-1][y])) + maze[x-1][y] |= rotations[x][y].OPPOSITE; + else { // else we cut the connection + // remove connection for the maze part we're looking at + maze[x][y] &= rotations[x][y].INVERTED; + // remove connection for the adjacent maze part + maze[x-1][y] &= rotations[x-1][y].INVERTED_OPPOSITE; + } + } + if (rotations[x][y] == WallFacing.NORTH && y > 0 ) { + if (!rotations[x][y].unpackAndTest(maze[x][y-1])) + maze[x][y-1] |= rotations[x][y].OPPOSITE; + else { + maze[x][y] &= rotations[x][y].INVERTED; + maze[x][y-1] &= rotations[x][y-1].INVERTED_OPPOSITE; + } + } + if (rotations[x][y] == WallFacing.EAST && x < widthInCellCount-2 ) { + if (!rotations[x][y].unpackAndTest(maze[x+1][y])) + maze[x+1][y] |= rotations[x][y].OPPOSITE; + else { + maze[x][y] &= rotations[x][y].INVERTED; + maze[x+1][y] &= rotations[x+1][y].INVERTED_OPPOSITE; + } + } + if (rotations[x][y] == WallFacing.SOUTH && y < heightInCellCount-2 ) { + if (!rotations[x][y].unpackAndTest(maze[x][y+1])) + maze[x][y+1] |= rotations[x][y].OPPOSITE; + else { + maze[x][y] &= rotations[x][y].INVERTED; + maze[x][y+1] &= rotations[x][y+1].INVERTED_OPPOSITE; + } + } + } + }//*/ + + for (WallFacing facing : WallFacing.values()) + maze[halfWayPointX + facing.xOffset][halfWayPointY + facing.zOffset] &= facing.INVERTED_OPPOSITE; + + maze[halfWayPointX][halfWayPointY] = 0b10000; + + for (int x = 1; x < maze.length; x++) { + for (int y = 1; y < maze[x].length; y++) { + if (mazeLocal[x][y] == 0) { + if (mazeLocal[x-1][y] == 0) { + maze[x][y] |= WallFacing.WEST.BYTE; + maze[x-1][y] |= WallFacing.WEST.OPPOSITE; + } + + if (mazeLocal[x][y-1] == 0) { + maze[x][y] |= WallFacing.NORTH.BYTE; + maze[x][y-1] |= WallFacing.NORTH.OPPOSITE; + } + } + } + } + + for (Diagonals diagonals : Diagonals.values()) { + cornerClippings[diagonals.ordinal()][0] = random.nextInt(maximumClipping) + 1; + cornerClippings[diagonals.ordinal()][1] = random.nextInt(maximumClipping) + 1; + + for (int y = 0; y < cornerClippings[diagonals.ordinal()][0]; y++) + for (int x = 0; x < cornerClippings[diagonals.ordinal()][1]; x++) + maze[diagonals.operationX.convert(x, widthInCellCount - 2)][diagonals.operationY.convert(y, heightInCellCount - 2)] |= 0b10000; + } + } + + @SuppressWarnings({"fallthrough"}) + private void processInnerWallsAndFloor(StructurePiece structureComponent, StructurePieceAccessor list, RandomSource random, final int offset, final Rotation[] rotations) { + for (int x = 0; x < widthInCellCount - 1; x++) { + for (int y = 0; y < heightInCellCount - 1; y++) { + final boolean xCenter = x == (widthInCellCount / 2) - 1; + final boolean yCenter = y == (heightInCellCount / 2) - 1; + // -------- HEDGE + if ((!(xCenter || yCenter)) && (maze[x][y] & 0b10000) == 0b10000) continue; + + int rotation = 0; + + int xBB = this.sizeConstraints.minX() + (x * 12) + offset; + int yBB = this.sizeConstraints.minY() + 1; + int zBB = this.sizeConstraints.minZ() + (y * 12) + offset; + + if (!(xCenter && yCenter)) { + StructurePiece structure; + + switch (maze[x][y] & 0b1111) { // These are inconsistent because I was stupid with the structures I saved to .nbt + case 0b0010: // FACE SOUTH + rotation++; // rotate 270 + case 0b0001: // FACE EAST + rotation++; // rotate 180 + case 0b1000: // FACE NORTH + rotation++; // rotate 90 + case 0b0100: // FACE WEST + final Rotation rotationCap = rotations[rotation]; + + if (random.nextBoolean()) + structure = new NagaCourtyardHedgeCapComponent(structureManager, (x * widthInCellCount) + y, xBB, yBB, zBB, rotationCap); + else + structure = new NagaCourtyardHedgeCapPillarComponent(structureManager, (x * widthInCellCount) + y, xBB, yBB, zBB, rotationCap); + + break; + case 0b1001: // NORTH EAST + rotation++; + case 0b1100: // NORTH WEST + rotation++; + case 0b0110: // SOUTH WEST + rotation++; + case 0b0011: // SOUTH EAST + final Rotation rotationCorner = rotations[rotation]; + + structure = new NagaCourtyardHedgeCornerComponent(structureManager, maze[x][y], xBB, yBB, zBB, rotationCorner); + break; + case 0b1101: // NOT SOUTH + rotation++; + case 0b1110: // NOT EAST + rotation++; + case 0b0111: // NOT NORTH + rotation++; + case 0b1011: // NOT WEST + final Rotation rotationT = rotations[rotation]; + + structure = new NagaCourtyardHedgeTJunctionComponent(structureManager, maze[x][y], xBB, yBB, zBB, rotationT); + break; + case 0b1010: // NORTH AND SOUTH + rotation++; + case 0b0101: // EAST AND WEST + final Rotation rotationLine = rotations[rotation]; + + structure = new NagaCourtyardHedgeLineComponent(structureManager, maze[x][y], xBB, yBB, zBB, rotationLine); + break; + case 0b1111: + structure = new NagaCourtyardHedgeIntersectionComponent(structureManager, maze[x][y], xBB, yBB, zBB, Rotation.NONE); + break; + default: + if (random.nextInt(150) == 0) { + structure = new CourtyardTerraceStatue(maze[x][y], xBB - 6, yBB - 3, zBB - 6, Rotation.NONE, this.structureManager); + } else if (random.nextBoolean()) + structure = new CourtyardTerraceBrazier(maze[x][y], xBB - 6, yBB - 3, zBB - 6, Rotation.NONE, this.structureManager); + else { + structure = new CourtyardTerraceDuct(maze[x][y], xBB - 6, yBB - 3, zBB - 6, Rotation.NONE, this.structureManager); + } + + break; + } + + list.addPiece(structure); + structure.addChildren(structureComponent, list, random); + } + + // -------- Hedge Connectors + + xBB = this.sizeConstraints.minX() + (x * 12) + offset; + zBB = this.sizeConstraints.minZ() + (y * 12) + offset; + + final boolean connectWest = WallFacing.WEST .unpackAndTest(maze[x][y]); + final boolean connectNorth = WallFacing.NORTH.unpackAndTest(maze[x][y]); + final boolean connectEast = WallFacing.EAST .unpackAndTest(maze[x][y]); + final boolean connectSouth = WallFacing.SOUTH.unpackAndTest(maze[x][y]); + + if (connectWest) { + NagaCourtyardHedgePadderComponent padding = new NagaCourtyardHedgePadderComponent(structureManager, maze[x][y], xBB - 1, yBB, zBB, Rotation.NONE); + list.addPiece(padding); + padding.addChildren(structureComponent, list, random); + + if (x > 0 && (maze[x-1][y] & 0b10000) != 0b10000) { + NagaCourtyardHedgePadderComponent padding2 = new NagaCourtyardHedgePadderComponent(structureManager, maze[x][y], xBB - 7, yBB, zBB, Rotation.NONE); + list.addPiece(padding2); + padding2.addChildren(structureComponent, list, random); + } + + NagaCourtyardHedgeLineComponent structureLine = new NagaCourtyardHedgeLineComponent(structureManager, maze[x][y], xBB - 6, yBB, zBB, Rotation.NONE); + list.addPiece(structureLine); + structureLine.addChildren(structureComponent, list, random); + } + + if (connectNorth) { + NagaCourtyardHedgePadderComponent padding = new NagaCourtyardHedgePadderComponent(structureManager, maze[x][y], xBB + 4, yBB, zBB - 1, Rotation.CLOCKWISE_90); + list.addPiece(padding); + padding.addChildren(structureComponent, list, random); + + if (y > 0 && (maze[x][y-1] & 0b10000) != 0b10000) { + NagaCourtyardHedgePadderComponent padding2 = new NagaCourtyardHedgePadderComponent(structureManager, maze[x][y], xBB + 4, yBB, zBB - 7, Rotation.CLOCKWISE_90); + list.addPiece(padding2); + padding2.addChildren(structureComponent, list, random); + } + + NagaCourtyardHedgeLineComponent structureLine = new NagaCourtyardHedgeLineComponent(structureManager, maze[x][y], xBB, yBB, zBB - 6, Rotation.CLOCKWISE_90); + list.addPiece(structureLine); + structureLine.addChildren(structureComponent, list, random); + } + + if ((x >= widthInCellCount - 2 || (maze[x+1][y] & 0b10000) == 0b10000) && connectEast) { + NagaCourtyardHedgePadderComponent padding = new NagaCourtyardHedgePadderComponent(structureManager, maze[x][y], xBB + 5, yBB, zBB, Rotation.NONE); + list.addPiece(padding); + padding.addChildren(structureComponent, list, random); + + NagaCourtyardHedgeLineComponent structureLine = new NagaCourtyardHedgeLineComponent(structureManager, maze[x][y], xBB + 6, yBB, zBB, Rotation.NONE); + list.addPiece(structureLine); + structureLine.addChildren(structureComponent, list, random); + } + + if ((y >= heightInCellCount - 2 || (maze[x][y+1] & 0b10000) == 0b10000) && connectSouth) { + NagaCourtyardHedgePadderComponent padding = new NagaCourtyardHedgePadderComponent(structureManager, maze[x][y], xBB + 4, yBB, zBB + 5, Rotation.CLOCKWISE_90); + list.addPiece(padding); + padding.addChildren(structureComponent, list, random); + + NagaCourtyardHedgeLineComponent structureLine = new NagaCourtyardHedgeLineComponent(structureManager, maze[x][y], xBB, yBB, zBB + 6, Rotation.CLOCKWISE_90); + list.addPiece(structureLine); + structureLine.addChildren(structureComponent, list, random); + }//*/ + + final boolean hasNoTerrace = (maze[x][y] & 0b1111) != 0; + + //final boolean westOfCenter = x == (widthInCellCount / 2) - 2; + //final boolean northOfCenter = y == (heightInCellCount / 2) - 2; + //final boolean eastOfCenter = x == widthInCellCount / 2; + //final boolean southOfCenter = y == heightInCellCount / 2; + + final boolean westHasNoTerraceOrIsSafe = /*(!(eastOfCenter && yCenter )) &&*/ (x == 0 || (maze[x-1][y] & 0b10000) == 0b10000 || (maze[x-1][y] & 0b1111) != 0); + final boolean northHasNoTerraceOrIsSafe = /*(!(xCenter && southOfCenter)) &&*/ (y == 0 || (maze[x][y-1] & 0b10000) == 0b10000 || (maze[x][y-1] & 0b1111) != 0); + final boolean eastHasNoTerraceOrIsSafe = /*(!(westOfCenter && yCenter )) &&*/ (x == widthInCellCount -2 || (maze[x+1][y] & 0b10000) == 0b10000); + final boolean southHasNoTerraceOrIsSafe = /*(!(xCenter && northOfCenter)) &&*/ (y == heightInCellCount-2 || (maze[x][y+1] & 0b10000) == 0b10000); + + final boolean westNorthHasNoTerraceOrIsSafe = /*(!(eastOfCenter && southOfCenter)) &&*/ ((x == 0 || y == 0 || maze[x - 1][y - 1] != 0)); + final boolean westSouthHasNoTerraceOrIsSafe = /*(!(eastOfCenter && northOfCenter)) &&*/ ((x == 0 || y >= heightInCellCount-2 || maze[x - 1][y + 1] != 0)); + final boolean eastNorthHasNoTerraceOrIsSafe = /*(!(westOfCenter && southOfCenter)) &&*/ ((x >= widthInCellCount -2 || y == 0 || maze[x + 1][y - 1] != 0)); + final boolean eastSouthHasNoTerraceOrIsSafe = /*(!(westOfCenter && northOfCenter)) &&*/ ((x >= widthInCellCount -2 || y >= heightInCellCount-2 || maze[x + 1][y + 1] != 0)); + + // -------- PATHS - cardinal + + if (xCenter && yCenter) { + CourtyardPathPiece path = new CourtyardPathPiece(maze[x][y], xBB - 1, yBB - 1, zBB - 1, structureManager); + list.addPiece(path); + path.addChildren(structureComponent, list, random); + } + + if (hasNoTerrace && westHasNoTerraceOrIsSafe && !connectWest) { + CourtyardPathPiece path2 = new CourtyardPathPiece(maze[x][y], xBB - 7, yBB - 1, zBB - 1, structureManager); + list.addPiece(path2); + path2.addChildren(structureComponent, list, random); + } + + if (hasNoTerrace && northHasNoTerraceOrIsSafe && !connectNorth) { + CourtyardPathPiece path2 = new CourtyardPathPiece(maze[x][y], xBB - 1, yBB - 1, zBB - 7, structureManager); + list.addPiece(path2); + path2.addChildren(structureComponent, list, random); + } + + if (hasNoTerrace && eastHasNoTerraceOrIsSafe) { + CourtyardPathPiece path2 = new CourtyardPathPiece(maze[x][y], xBB + 5, yBB - 1, zBB - 1, structureManager); + list.addPiece(path2); + path2.addChildren(structureComponent, list, random); + } + + if (hasNoTerrace && southHasNoTerraceOrIsSafe) { + CourtyardPathPiece path2 = new CourtyardPathPiece(maze[x][y], xBB - 1, yBB - 1, zBB + 5, structureManager); + list.addPiece(path2); + path2.addChildren(structureComponent, list, random); + } + + // -------- PATHS - Diagonal + + if (hasNoTerrace && westHasNoTerraceOrIsSafe && northHasNoTerraceOrIsSafe && westNorthHasNoTerraceOrIsSafe) { + CourtyardPathPiece path2 = new CourtyardPathPiece(maze[x][y], xBB - 7, yBB - 1, zBB - 7, structureManager); + list.addPiece(path2); + path2.addChildren(structureComponent, list, random); + } + + if (hasNoTerrace && westHasNoTerraceOrIsSafe && southHasNoTerraceOrIsSafe && westSouthHasNoTerraceOrIsSafe) { + CourtyardPathPiece path2 = new CourtyardPathPiece(maze[x][y], xBB - 7, yBB - 1, zBB + 5, structureManager); + list.addPiece(path2); + path2.addChildren(structureComponent, list, random); + } + + if (hasNoTerrace && eastHasNoTerraceOrIsSafe && northHasNoTerraceOrIsSafe && eastNorthHasNoTerraceOrIsSafe) { + CourtyardPathPiece path2 = new CourtyardPathPiece(maze[x][y], xBB + 5, yBB - 1, zBB - 7, structureManager); + list.addPiece(path2); + path2.addChildren(structureComponent, list, random); + } + + if (hasNoTerrace && eastHasNoTerraceOrIsSafe && southHasNoTerraceOrIsSafe && eastSouthHasNoTerraceOrIsSafe) { + CourtyardPathPiece path2 = new CourtyardPathPiece(maze[x][y], xBB + 5, yBB - 1, zBB + 5, structureManager); + list.addPiece(path2); + path2.addChildren(structureComponent, list, random); + }//*/ + } + } + } + + private void processOuterWalls(StructurePiece structureComponent, StructurePieceAccessor list, RandomSource random, final int offset, final Rotation[] rotations) { + // -------- WALLS + for (Diagonals diagonal : Diagonals.values()) { + // Walls at corner notches going with X Axis, crossing Z Axis. Sideways. + + int zBoundX = (diagonal.isTop() + ? this.sizeConstraints.minZ() + (cornerClipping[diagonal.ordinal()][0] * 12) - 3 + : this.sizeConstraints.maxZ() - (cornerClipping[diagonal.ordinal()][0] * 12) + 1 ); + + CourtyardWallPadder paddingStartX = + new CourtyardWallPadder( + ( cornerClipping[diagonal.ordinal()][1] * 2 ) + 1, + ( diagonal.isLeft() ? this.sizeConstraints.minX() + 2 : this.sizeConstraints.maxX() - 2 ), + this.sizeConstraints.minY() + 1, + zBoundX, + Rotation.NONE, + this.structureManager); + + list.addPiece(paddingStartX); + paddingStartX.addChildren(structureComponent, list, random); + + int xPadOffset = diagonal.isLeft() ? 11 : -1; + + for (int i = 0; i < cornerClipping[diagonal.ordinal()][1] - 1; i++) { + int xBound = (diagonal.isLeft() ? this.sizeConstraints.minX() + (i*12) + 3 : this.sizeConstraints.maxX() - (i*12) - 13 ); + + CourtyardWall wall = new CourtyardWall(i*2, xBound, this.sizeConstraints.minY() + 1, zBoundX, Rotation.NONE, this.structureManager); + list.addPiece(wall); + wall.addChildren(structureComponent, list, random); + + CourtyardWallPadder padding = new CourtyardWallPadder((i*2)+1, xBound + xPadOffset, this.sizeConstraints.minY() + 1, zBoundX, Rotation.NONE, this.structureManager); + list.addPiece(padding); + padding.addChildren(structureComponent, list, random); + } + + // Walls at corner notches going with Z Axis, crossing X Axis. Up/Down. + + int xBoundZ = (diagonal.isLeft() + ? this.sizeConstraints.minX() + (cornerClipping[diagonal.ordinal()][1] * 12) - 1 + : this.sizeConstraints.maxX() - (cornerClipping[diagonal.ordinal()][1] * 12) + 3 ); + + CourtyardWallPadder paddingStartZ = + new CourtyardWallPadder( + ( cornerClipping[diagonal.ordinal()][1] * 2 ) + 1, + xBoundZ, + this.sizeConstraints.minY() + 1, + ( diagonal.isTop() ? this.sizeConstraints.minZ() + 2 : this.sizeConstraints.maxZ() - 2 ), + Rotation.CLOCKWISE_90, + this.structureManager); + + list.addPiece(paddingStartZ); + paddingStartZ.addChildren(structureComponent, list, random); + + int zPadOffset = diagonal.isTop() ? 11 : -1; + + for (int i = 0; i < cornerClipping[diagonal.ordinal()][0] - 1; i++) { + int zBound = (diagonal.isTop() ? this.sizeConstraints.minZ() + (i*12) + 3 : this.sizeConstraints.maxZ() - (i*12) - 13 ); + + CourtyardWall wall = new CourtyardWall(i*2, xBoundZ, this.sizeConstraints.minY() + 1, zBound, Rotation.CLOCKWISE_90, this.structureManager); + list.addPiece(wall); + wall.addChildren(structureComponent, list, random); + + CourtyardWallPadder padding = new CourtyardWallPadder((i*2)+1, xBoundZ, this.sizeConstraints.minY() + 1, zBound + zPadOffset, Rotation.CLOCKWISE_90, this.structureManager); + list.addPiece(padding); + padding.addChildren(structureComponent, list, random); + } + + // WALL CORNERS + + int wallCornerInnerX = this.sizeConstraints.minX() + (diagonal.operationX.convert(cornerClipping[diagonal.ordinal()][1], widthInCellCount - 1) * 12);// + (diagonal.isLeft() ? -3 : 3); + int wallCornerInnerZ = this.sizeConstraints.minZ() + (diagonal.operationY.convert(cornerClipping[diagonal.ordinal()][0], heightInCellCount - 1) * 12);// + (diagonal.isTop() ? -3 : 3); + + Rotation cornerRotation = rotations[diagonal.ordinal() % rotations.length]; + + boolean shiftX = cornerRotation == Rotation.CLOCKWISE_180 || cornerRotation == Rotation.COUNTERCLOCKWISE_90; + boolean shiftZ = cornerRotation == Rotation.CLOCKWISE_90 || cornerRotation == Rotation.CLOCKWISE_180; + + // These touch upper/lower borders + + CourtyardWallCornerOuter corner1 = new CourtyardWallCornerOuter(diagonal.ordinal() * 3, + wallCornerInnerX + (shiftZ ? (shiftX ? 1 : 7) : (shiftX ? -3 : 3)), + this.sizeConstraints.minY() + 1, + (diagonal.isTop() ? this.sizeConstraints.minZ() : this.sizeConstraints.maxZ() - 1) + (shiftZ ? (shiftX ? 4 : 0) : (shiftX ? 1 : -3)), + cornerRotation, + this.structureManager); + list.addPiece(corner1); + corner1.addChildren(structureComponent, list, random); + + // These touch side borders + + CourtyardWallCornerOuter corner2 = new CourtyardWallCornerOuter((diagonal.ordinal() * 3) + 1, + (diagonal.isLeft() ? this.sizeConstraints.minX() : this.sizeConstraints.maxX() - 1) + (shiftZ ? (shiftX ? 1 : 4) : (shiftX ? -3 : 0)), + this.sizeConstraints.minY() + 1, + wallCornerInnerZ + (shiftZ ? (shiftX ? 7 : 3) : (shiftX ? 1 : -3)), + cornerRotation, + this.structureManager); + list.addPiece(corner2); + corner2.addChildren(structureComponent, list, random); + + // These are inner corners + + CourtyardWallCornerInner innerCorner = new CourtyardWallCornerInner((diagonal.ordinal() * 3) + 3, + wallCornerInnerX + (shiftZ ? (shiftX ? -1 : 13) : (shiftX ? -9 : 5)),// + (diagonal.isLeft() ? -6 : 2), + this.sizeConstraints.minY() + 1, + wallCornerInnerZ + (shiftZ ? (shiftX ? 13 : 5) : (shiftX ? -1 : -9)),// + (diagonal.isTop() ? -6 : 2), + cornerRotation, + this.structureManager); + list.addPiece(innerCorner); + innerCorner.addChildren(structureComponent, list, random); + } + + // Top / North + + for (int i = cornerClipping[3][1]; i < (widthInCellCount-1) - cornerClipping[0][1]; i++) { + CourtyardWall wall = new CourtyardWall(i, this.sizeConstraints.minX() + (i * 12) + offset - 3, this.sizeConstraints.minY() + 1, this.sizeConstraints.minZ() - 3, Rotation.NONE, this.structureManager); + list.addPiece(wall); + wall.addChildren(structureComponent, list, random); + + CourtyardWallPadder padding = new CourtyardWallPadder(i, this.sizeConstraints.minX() + (i * 12) + offset - 4, this.sizeConstraints.minY() + 1, this.sizeConstraints.minZ() - 3, Rotation.NONE, this.structureManager); + list.addPiece(padding); + padding.addChildren(structureComponent, list, random); + } + + CourtyardWallPadder padding2 = new CourtyardWallPadder((widthInCellCount-1) - cornerClipping[0][1], this.sizeConstraints.minX() + (((widthInCellCount-1) - cornerClipping[0][1]) * 12) + offset - 4, this.sizeConstraints.minY() + 1, this.sizeConstraints.minZ() - 3, Rotation.NONE, this.structureManager); + list.addPiece(padding2); + padding2.addChildren(structureComponent, list, random); + + // Bottom / South + + for (int i = cornerClipping[2][1]; i < (widthInCellCount-1) - cornerClipping[1][1]; i++) { + CourtyardWall wall = new CourtyardWall(i, this.sizeConstraints.minX() + (i * 12) + offset - 3, this.sizeConstraints.minY() + 1, this.sizeConstraints.maxZ() + 1, Rotation.NONE, this.structureManager); + list.addPiece(wall); + wall.addChildren(structureComponent, list, random); + + CourtyardWallPadder padding = new CourtyardWallPadder(i, this.sizeConstraints.minX() + (i * 12) + offset - 4, this.sizeConstraints.minY() + 1, this.sizeConstraints.maxZ() + 1, Rotation.NONE, this.structureManager); + list.addPiece(padding); + padding.addChildren(structureComponent, list, random); + } + + CourtyardWallPadder padding5 = new CourtyardWallPadder((widthInCellCount-1) - cornerClipping[1][1], this.sizeConstraints.minX() + (((widthInCellCount-1) - cornerClipping[1][1]) * 12) + offset - 4, this.sizeConstraints.minY() + 1, this.sizeConstraints.maxZ() + 1, Rotation.NONE, this.structureManager); + list.addPiece(padding5); + padding5.addChildren(structureComponent, list, random); + + // Left / West + + for (int i = cornerClipping[3][0]; i < (heightInCellCount-1) - cornerClipping[2][0]; i++) { + CourtyardWall wall = new CourtyardWall(i, this.sizeConstraints.minX() - 1, this.sizeConstraints.minY() + 1, this.sizeConstraints.minZ() + (i * 12) + offset - 3, Rotation.CLOCKWISE_90, this.structureManager); + list.addPiece(wall); + wall.addChildren(structureComponent, list, random); + + CourtyardWallPadder padding = new CourtyardWallPadder(i, this.sizeConstraints.minX() - 1, this.sizeConstraints.minY() + 1, this.sizeConstraints.minZ() + (i * 12) + offset - 4, Rotation.CLOCKWISE_90, this.structureManager); + list.addPiece(padding); + padding.addChildren(structureComponent, list, random); + } + + CourtyardWallPadder padding8 = new CourtyardWallPadder((heightInCellCount-1) - cornerClipping[2][0], this.sizeConstraints.minX() - 1, this.sizeConstraints.minY() + 1, this.sizeConstraints.minZ() + (((heightInCellCount-1) - cornerClipping[2][0]) * 12) + offset - 4, Rotation.CLOCKWISE_90, this.structureManager); + list.addPiece(padding8); + padding8.addChildren(structureComponent, list, random); + + // Right / East + + for (int i = cornerClipping[0][0]; i < (heightInCellCount-1) - cornerClipping[1][0]; i++) { + CourtyardWall wall = new CourtyardWall(i, this.sizeConstraints.maxX() + 3, this.sizeConstraints.minY() + 1, this.sizeConstraints.minZ() + (i * 12) + offset - 3, Rotation.CLOCKWISE_90, this.structureManager); + list.addPiece(wall); + wall.addChildren(structureComponent, list, random); + + CourtyardWallPadder padding = new CourtyardWallPadder(i, this.sizeConstraints.maxX() + 3, this.sizeConstraints.minY() + 1, this.sizeConstraints.minZ() + (i * 12) + offset - 4, Rotation.CLOCKWISE_90, this.structureManager); + list.addPiece(padding); + padding.addChildren(structureComponent, list, random); + } + + CourtyardWallPadder padding11 = new CourtyardWallPadder(((heightInCellCount-1) - cornerClipping[1][0]), this.sizeConstraints.maxX() + 3, this.sizeConstraints.minY() + 1, this.sizeConstraints.minZ() + (((heightInCellCount-1) - cornerClipping[1][0]) * 12) + offset - 4, Rotation.CLOCKWISE_90, this.structureManager); + list.addPiece(padding11); + padding11.addChildren(structureComponent, list, random); + } + + private static String getStringFromFacings(int directions) { + return switch (directions & 0b1111) { + case 0b0010 -> " ╷ "; + case 0b0001 -> " ╶─"; + case 0b1000 -> " ╵ "; + case 0b0100 -> "─╴ "; + case 0b1001 -> " └─"; + case 0b1100 -> "─┘ "; + case 0b0110 -> "─┐ "; + case 0b0011 -> " ┌─"; + case 0b1101 -> "─┴─"; + case 0b1110 -> "─┤ "; + case 0b0111 -> "─┬─"; + case 0b1011 -> " ├─"; + case 0b1010 -> " │ "; + case 0b0101 -> "───"; + case 0b1111 -> "─┼─"; + default -> " • "; + }; + } + + protected enum WallFacing { + EAST (0b0001, 0b0100, 0b1110, 0b1011, Direction.EAST , 1, 0), + SOUTH(0b0010, 0b1000, 0b1101, 0b0111, Direction.SOUTH, 0, 1), + WEST (0b0100, 0b0001, 0b1011, 0b1110, Direction.WEST , -1, 0), + NORTH(0b1000, 0b0010, 0b0111, 0b1101, Direction.NORTH, 0, -1); + + private final int BYTE; + private final int OPPOSITE; + private final int INVERTED; + private final int INVERTED_OPPOSITE; + private final int xOffset; + private final int zOffset; + + WallFacing(int bite, int oppositeBite, int inverted, int invertedOpposite, Direction enumFacing, int xOffset, int zOffset) { + this.BYTE = bite; + this.OPPOSITE = oppositeBite; + this.INVERTED = inverted; + this.INVERTED_OPPOSITE = invertedOpposite; + this.xOffset = xOffset; + this.zOffset = zOffset; + } + + private boolean unpackAndTest(int directions) { + return (this.BYTE & directions) == this.BYTE; + } + + } + + @Override + protected void addAdditionalSaveData(StructurePieceSerializationContext ctx, CompoundTag tagCompound) { + super.addAdditionalSaveData(ctx, tagCompound); + ListTag mazeX = new ListTag(); + + for (int x = 0; x < widthInCellCount - 1; x++) { + ListTag mazeY = new ListTag(); + + for (int y = 0; y < heightInCellCount - 1; y++) + mazeY.add(IntTag.valueOf(maze[x][y])); + + mazeX.add(mazeY); + } + + tagCompound.putInt("mazeWidth", widthInCellCount); + tagCompound.putInt("mazeHeight", heightInCellCount); + tagCompound.put("maze", mazeX); + tagCompound.put("constraints", BoundingBoxUtils.boundingBoxToNBT(this.sizeConstraints)); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/courtyard/package-info.java b/src/main/java/twilightforest/world/components/structures/courtyard/package-info.java new file mode 100644 index 0000000000..98180a63e3 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/courtyard/package-info.java @@ -0,0 +1,6 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.world.components.structures.courtyard; + +import net.minecraft.MethodsReturnNonnullByDefault; +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/world/components/structures/darktower/DarkTowerBalconyComponent.java b/src/main/java/twilightforest/world/components/structures/darktower/DarkTowerBalconyComponent.java new file mode 100644 index 0000000000..77150442a9 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/darktower/DarkTowerBalconyComponent.java @@ -0,0 +1,51 @@ +package twilightforest.world.components.structures.darktower; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFStructurePieceTypes; +import twilightforest.world.components.structures.TFStructureComponentOld; +import twilightforest.world.components.structures.lichtower.TowerWingComponent; + +public class DarkTowerBalconyComponent extends TowerWingComponent { + + public DarkTowerBalconyComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFDTBal.get(), nbt); + } + + protected DarkTowerBalconyComponent(int i, int x, int y, int z, Direction direction) { + super(TFStructurePieceTypes.TFDTBal.get(), i, x, y, z, 5, 5, direction); + } + + @Override + public void addChildren(StructurePiece parent, StructurePieceAccessor list, RandomSource rand) { + if (parent != null && parent instanceof TFStructureComponentOld) { + this.deco = ((TFStructureComponentOld) parent).deco; + } + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + // make floor + generateBox(world, sbb, 0, 0, 0, 2, 0, 4, deco.accentState, Blocks.AIR.defaultBlockState(), false); + generateBox(world, sbb, 0, 0, 1, 1, 0, 3, deco.blockState, Blocks.AIR.defaultBlockState(), false); + + generateBox(world, sbb, 0, 1, 0, 2, 1, 4, deco.fenceState, Blocks.AIR.defaultBlockState(), false); + + this.placeBlock(world, deco.accentState, 2, 1, 0, sbb); + this.placeBlock(world, deco.accentState, 2, 1, 4, sbb); + + // clear inside + generateAirBox(world, sbb, 0, 1, 1, 1, 1, 3); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/darktower/DarkTowerBeardComponent.java b/src/main/java/twilightforest/world/components/structures/darktower/DarkTowerBeardComponent.java new file mode 100644 index 0000000000..0e35c27283 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/darktower/DarkTowerBeardComponent.java @@ -0,0 +1,80 @@ +package twilightforest.world.components.structures.darktower; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFStructurePieceTypes; +import twilightforest.world.components.structures.TFStructureComponentOld; +import twilightforest.world.components.structures.lichtower.TowerWingComponent; + +public class DarkTowerBeardComponent extends TFStructureComponentOld { + + protected final int size; + protected int height; + + public DarkTowerBeardComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFDTBea.get(), nbt); + this.size = nbt.getInt("beardSize"); + this.height = nbt.getInt("beardHeight"); + } + + public DarkTowerBeardComponent(int i, TowerWingComponent wing, int x, int y, int z) { + super(TFStructurePieceTypes.TFDTBea.get(), i, x, y, z); + + this.setOrientation(wing.getOrientation()); + this.size = wing.size; + this.height = size / 2; + + // just hang out at the very bottom of the tower + this.boundingBox = new BoundingBox(wing.getBoundingBox().minX(), wing.getBoundingBox().minY() - this.height, wing.getBoundingBox().minZ(), wing.getBoundingBox().maxX(), wing.getBoundingBox().maxY(), wing.getBoundingBox().maxZ()); + } + + @Override + protected void addAdditionalSaveData(StructurePieceSerializationContext ctx, CompoundTag tagCompound) { + super.addAdditionalSaveData(ctx, tagCompound); + + tagCompound.putInt("beardSize", this.size); + tagCompound.putInt("beardHeight", this.height); + } + + /** + * Makes a dark tower type beard + */ + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + makeDarkBeard(world, sbb, 0, 0, size - 1, height - 1, size - 1); + } + + protected void makeDarkBeard(WorldGenLevel world, BoundingBox sbb, int minX, int minZ, int maxX, int maxY, int maxZ) { + BlockState frameState = TFBlocks.ENCASED_TOWERWOOD.get().defaultBlockState(); + + for (int x = minX; x <= maxX; x++) { + for (int z = minZ; z <= maxZ; z++) { + if (x == minX || x == maxX || z == minZ || z == maxZ) { + int length = Math.min(Math.abs(x - height) - 1, Math.abs(z - height) - 1); + + if (length == height - 1) { + length++; + } + + if (length == -1) { + length = 1; + } + + for (int y = maxY; y >= height - length; y--) { + // wall + this.placeBlock(world, frameState, x, y, z, sbb); + } + } + } + } + } +} diff --git a/src/main/java/twilightforest/world/components/structures/darktower/DarkTowerBossBridgeComponent.java b/src/main/java/twilightforest/world/components/structures/darktower/DarkTowerBossBridgeComponent.java new file mode 100644 index 0000000000..96cb8c8211 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/darktower/DarkTowerBossBridgeComponent.java @@ -0,0 +1,34 @@ +package twilightforest.world.components.structures.darktower; + +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFStructurePieceTypes; + +public class DarkTowerBossBridgeComponent extends DarkTowerBridgeComponent { + + public DarkTowerBossBridgeComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFDTBB.get(), nbt); + } + + protected DarkTowerBossBridgeComponent(int i, int x, int y, int z, int pSize, int pHeight, Direction direction) { + super(TFStructurePieceTypes.TFDTBB.get(), i, x, y, z, pSize, pHeight, direction); + } + + @Override + public boolean makeTowerWing(StructurePieceAccessor list, RandomSource rand, int index, int x, int y, int z, int wingSize, int wingHeight, Rotation rotation) { + // make another size 15 main tower + + Direction direction = getStructureRelativeRotation(rotation); + int[] dx = offsetTowerCoords(x, y, z, wingSize, direction); + + DarkTowerBossTrapComponent wing = new DarkTowerBossTrapComponent(index, dx[0], dx[1], dx[2], wingSize, wingHeight, direction); + list.addPiece(wing); + wing.addChildren(this, list, rand); + addOpening(x, y, z, rotation); + return true; + } +} diff --git a/src/main/java/twilightforest/world/components/structures/darktower/DarkTowerBossTrapComponent.java b/src/main/java/twilightforest/world/components/structures/darktower/DarkTowerBossTrapComponent.java new file mode 100644 index 0000000000..c005614340 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/darktower/DarkTowerBossTrapComponent.java @@ -0,0 +1,119 @@ +package twilightforest.world.components.structures.darktower; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFStructurePieceTypes; +import twilightforest.util.RotationUtil; +import twilightforest.world.components.structures.TFStructureComponentOld; + +public class DarkTowerBossTrapComponent extends DarkTowerWingComponent { + + public DarkTowerBossTrapComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFDTBT.get(), nbt); + } + + protected DarkTowerBossTrapComponent(int i, int x, int y, int z, int pSize, int pHeight, Direction direction) { + super(TFStructurePieceTypes.TFDTBT.get(), i, x, y, z, pSize, pHeight, direction); + + // no spawns + this.spawnListIndex = -1; + } + + @Override + public void addChildren(StructurePiece parent, StructurePieceAccessor list, RandomSource rand) { + if (parent != null && parent instanceof TFStructureComponentOld) { + this.deco = ((TFStructureComponentOld) parent).deco; + } + + // we should have a door where we started + addOpening(0, 1, size / 2, Rotation.CLOCKWISE_180); + + // add a beard + makeABeard(parent, list, rand); + + for (Rotation i : RotationUtil.ROTATIONS) { + if (i == Rotation.CLOCKWISE_180 || rand.nextBoolean()) { + continue; + } + // occasional balcony + int[] dest = getValidOpening(rand, i); + // move opening to tower base + dest[1] = 1; + makeTowerBalcony(list, rand, this.getGenDepth(), dest[0], dest[1], dest[2], i); + } + } + + /** + * Attach a roof to this tower. + */ + @Override + public void makeARoof(StructurePiece parent, StructurePieceAccessor list, RandomSource rand) { + //nope; + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + RandomSource decoRNG = RandomSource.create(world.getSeed() + (this.boundingBox.minX() * 321534781L) ^ (this.boundingBox.minZ() * 756839L)); + + // make walls + makeEncasedWalls(world, rand, sbb, 0, 0, 0, size - 1, height - 1, size - 1); + + // clear inside + generateAirBox(world, sbb, 1, 1, 1, size - 2, height - 2, size - 2); + + // openings + makeOpenings(world, sbb); + + // half floors, always starting at y = 4 + addBossTrapFloors(world, sbb); + + // demolish some + destroyTower(world, decoRNG, 5, height + 2, 5, 4, sbb); + destroyTower(world, decoRNG, 0, height, 0, 3, sbb); + destroyTower(world, decoRNG, 0, height, 8, 4, sbb); + + // hole for boss trap beam + destroyTower(world, decoRNG, 5, 6, 5, 2, sbb); + + // redraw some of the floor in case we destroyed it + this.generateBox(world, sbb, 1, 0, 1, size / 2, 0, size - 2, deco.blockState, Blocks.AIR.defaultBlockState(), false); + this.generateBox(world, sbb, 1, 1, 1, size / 2, 1, size - 2, Blocks.AIR.defaultBlockState(), Blocks.AIR.defaultBlockState(), false); + + // add boss trap + this.placeBlock(world, TFBlocks.GHAST_TRAP.get().defaultBlockState(), 5, 1, 5, sbb); + this.placeBlock(world, Blocks.REDSTONE_WIRE.defaultBlockState(), 5, 1, 6, sbb); + this.placeBlock(world, Blocks.REDSTONE_WIRE.defaultBlockState(), 5, 1, 7, sbb); + this.placeBlock(world, Blocks.REDSTONE_WIRE.defaultBlockState(), 5, 1, 8, sbb); + this.placeBlock(world, Blocks.REDSTONE_WIRE.defaultBlockState(), 4, 1, 8, sbb); + this.placeBlock(world, Blocks.REDSTONE_WIRE.defaultBlockState(), 3, 1, 8, sbb); + this.placeBlock(world, Blocks.OAK_PRESSURE_PLATE.defaultBlockState(), 2, 1, 8, sbb); + } + + /** + * Add specific boss trap floors + */ + protected void addBossTrapFloors(WorldGenLevel world, BoundingBox sbb) { + + makeFullFloor(world, sbb, 4); + + addStairsDown(world, sbb, Rotation.COUNTERCLOCKWISE_90, 4, size - 2, 4); + addStairsDown(world, sbb, Rotation.COUNTERCLOCKWISE_90, 4, size - 3, 4); + + // stairs to roof + addStairsDown(world, sbb, Rotation.CLOCKWISE_90, this.height - 1, size - 2, 4); + addStairsDown(world, sbb, Rotation.CLOCKWISE_90, this.height - 1, size - 3, 4); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/darktower/DarkTowerBridgeComponent.java b/src/main/java/twilightforest/world/components/structures/darktower/DarkTowerBridgeComponent.java new file mode 100644 index 0000000000..61d1d1730e --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/darktower/DarkTowerBridgeComponent.java @@ -0,0 +1,106 @@ +package twilightforest.world.components.structures.darktower; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; +import twilightforest.world.components.structures.TFStructureComponentOld; +import twilightforest.world.components.structures.lichtower.TowerWingComponent; +import twilightforest.init.TFLandmark; +import twilightforest.init.TFStructurePieceTypes; + +public class DarkTowerBridgeComponent extends TowerWingComponent { + + public DarkTowerBridgeComponent(StructurePieceType piece, CompoundTag nbt) { + super(piece, nbt); + } + + public DarkTowerBridgeComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFDTBri.get(), nbt); + } + + private int dSize; + private int dHeight; + + protected DarkTowerBridgeComponent(StructurePieceType type, int i, int x, int y, int z, int pSize, int pHeight, Direction direction) { + super(type, i, x, y, z, 5, 5, direction); + + this.dSize = pSize; + this.dHeight = pHeight; + } + + @Override + public void addChildren(StructurePiece parent, StructurePieceAccessor list, RandomSource rand) { + if (parent != null && parent instanceof TFStructureComponentOld) { + this.deco = ((TFStructureComponentOld) parent).deco; + } + makeTowerWing(list, rand, this.getGenDepth(), 4, 1, 2, dSize, dHeight, Rotation.NONE); + } + + @Override + public boolean makeTowerWing(StructurePieceAccessor list, RandomSource rand, int index, int x, int y, int z, int wingSize, int wingHeight, Rotation rotation) { + // kill too-small towers + if (wingHeight < 6) { + return false; + } + + Direction direction = getStructureRelativeRotation(rotation); + int[] dx = offsetTowerCoords(x, y, z, wingSize, direction); + + if (dx[1] + wingHeight > 255) { + // end of the world! + return false; + } + + TowerWingComponent wing = new DarkTowerWingComponent(TFStructurePieceTypes.TFDTWin.get(), index, dx[0], dx[1], dx[2], wingSize, wingHeight, direction); + // check to see if it intersects something already there + StructurePiece intersect = list.findCollisionPiece(wing.getBoundingBox()); + if (intersect == null || intersect == this) { + list.addPiece(wing); + wing.addChildren(this, list, rand); + addOpening(x, y, z, rotation); + return true; + } else { + return false; + } + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + // make walls + generateBox(world, sbb, 0, 0, 0, size - 1, height - 1, size - 1, deco.blockState, deco.blockState, false); + + // accents + for (int x = 0; x < size; x++) { + this.placeBlock(world, deco.accentState, x, 0, 0, sbb); + this.placeBlock(world, deco.accentState, x, height - 1, 0, sbb); + this.placeBlock(world, deco.accentState, x, 0, size - 1, sbb); + this.placeBlock(world, deco.accentState, x, height - 1, size - 1, sbb); + } + + // nullify sky light +// nullifySkyLightForBoundingBox(world.getWorld()); + + // clear inside + generateAirBox(world, sbb, 0, 1, 1, size - 1, height - 2, size - 2); + } + + /** + * Gets the bounding box of the tower wing we would like to make. + * + */ + public BoundingBox getWingBB() { + int[] dest = offsetTowerCoords(4, 1, 2, dSize, this.getOrientation()); + return TFLandmark.getComponentToAddBoundingBox(dest[0], dest[1], dest[2], 0, 0, 0, dSize - 1, dHeight - 1, dSize - 1, this.getOrientation(), false); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/darktower/DarkTowerEntranceBridgeComponent.java b/src/main/java/twilightforest/world/components/structures/darktower/DarkTowerEntranceBridgeComponent.java new file mode 100644 index 0000000000..8f1e0674bd --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/darktower/DarkTowerEntranceBridgeComponent.java @@ -0,0 +1,34 @@ +package twilightforest.world.components.structures.darktower; + +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFStructurePieceTypes; + +public class DarkTowerEntranceBridgeComponent extends DarkTowerBridgeComponent { + + public DarkTowerEntranceBridgeComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFDTEB.get(), nbt); + } + + protected DarkTowerEntranceBridgeComponent(int i, int x, int y, int z, int pSize, int pHeight, Direction direction) { + super(TFStructurePieceTypes.TFDTEB.get(), i, x, y, z, pSize, pHeight, direction); + } + + @Override + public boolean makeTowerWing(StructurePieceAccessor list, RandomSource rand, int index, int x, int y, int z, int wingSize, int wingHeight, Rotation rotation) { + // make an entrance tower + Direction direction = getStructureRelativeRotation(rotation); + int[] dx = offsetTowerCoords(x, y, z, wingSize, direction); + + DarkTowerWingComponent wing = new DarkTowerEntranceComponent(index, dx[0], dx[1], dx[2], wingSize, wingHeight, direction); + + list.addPiece(wing); + wing.addChildren(this, list, rand); + addOpening(x, y, z, rotation); + return true; + } +} diff --git a/src/main/java/twilightforest/world/components/structures/darktower/DarkTowerEntranceComponent.java b/src/main/java/twilightforest/world/components/structures/darktower/DarkTowerEntranceComponent.java new file mode 100644 index 0000000000..6965f989f1 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/darktower/DarkTowerEntranceComponent.java @@ -0,0 +1,66 @@ +package twilightforest.world.components.structures.darktower; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFStructurePieceTypes; + +public class DarkTowerEntranceComponent extends DarkTowerWingComponent { + + public DarkTowerEntranceComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFDTEnt.get(), nbt); + } + + protected DarkTowerEntranceComponent(int i, int x, int y, int z, int pSize, int pHeight, Direction direction) { + super(TFStructurePieceTypes.TFDTEnt.get(), i, x, y, z, pSize, pHeight, direction); + } + + @Override + public void addChildren(StructurePiece parent, StructurePieceAccessor list, RandomSource rand) { + super.addChildren(parent, list, rand); + + // a few more openings + addOpening(size / 2, 1, 0, Rotation.CLOCKWISE_90, EnumDarkTowerDoor.REAPPEARING); + addOpening(size / 2, 1, size - 1, Rotation.COUNTERCLOCKWISE_90, EnumDarkTowerDoor.REAPPEARING); + } + + @Override + public void makeABeard(StructurePiece parent, StructurePieceAccessor list, RandomSource rand) { + } + + @Override + public void makeARoof(StructurePiece parent, StructurePieceAccessor list, RandomSource rand) { + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + // make walls + makeEncasedWalls(world, rand, sbb, 0, 0, 0, size - 1, height - 1, size - 1); + + // deco to ground + for (int x = 0; x < this.size; x++) { + for (int z = 0; z < this.size; z++) { + this.placeBlock(world, deco.accentState, x, -1, z, sbb); + } + } + + // clear inside + generateAirBox(world, sbb, 1, 1, 1, size - 2, height - 2, size - 2); + + // sky light +// nullifySkyLightForBoundingBox(world); + + // openings + makeOpenings(world, sbb); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/darktower/DarkTowerMainBridgeComponent.java b/src/main/java/twilightforest/world/components/structures/darktower/DarkTowerMainBridgeComponent.java new file mode 100644 index 0000000000..0980f2e561 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/darktower/DarkTowerMainBridgeComponent.java @@ -0,0 +1,34 @@ +package twilightforest.world.components.structures.darktower; + +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFStructurePieceTypes; + +public class DarkTowerMainBridgeComponent extends DarkTowerBridgeComponent { + + public DarkTowerMainBridgeComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFDTMB.get(), nbt); + } + + protected DarkTowerMainBridgeComponent(int i, int x, int y, int z, int pSize, int pHeight, Direction direction) { + super(TFStructurePieceTypes.TFDTMB.get(), i, x, y, z, 15, pHeight, direction); + } + + @Override + public boolean makeTowerWing(StructurePieceAccessor list, RandomSource rand, int index, int x, int y, int z, int wingSize, int wingHeight, Rotation rotation) { + // make another size 15 main tower + Direction direction = getStructureRelativeRotation(rotation); + int[] dx = offsetTowerCoords(x, y, z, 19, direction); + + DarkTowerMainComponent wing = new DarkTowerMainComponent(rand, index, dx[0], dx[1], dx[2], direction); + + list.addPiece(wing); + wing.addChildren(this, list, rand); + addOpening(x, y, z, rotation); + return true; + } +} diff --git a/src/main/java/twilightforest/world/components/structures/darktower/DarkTowerMainComponent.java b/src/main/java/twilightforest/world/components/structures/darktower/DarkTowerMainComponent.java new file mode 100644 index 0000000000..00e3cdc41e --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/darktower/DarkTowerMainComponent.java @@ -0,0 +1,1443 @@ +package twilightforest.world.components.structures.darktower; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.registries.Registries; +import net.minecraft.data.worldgen.features.TreeFeatures; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceKey; +import net.minecraft.util.RandomSource; +import net.minecraft.world.Container; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.decoration.ItemFrame; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.*; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.AttachFace; +import net.minecraft.world.level.block.state.properties.SlabType; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePiecesBuilder; +import net.minecraftforge.registries.ForgeRegistries; +import twilightforest.TwilightForestMod; +import twilightforest.init.TFBlocks; +import twilightforest.data.tags.BlockTagGenerator; +import twilightforest.init.TFEntities; +import twilightforest.init.TFItems; +import twilightforest.loot.TFLootTables; +import twilightforest.util.RotationUtil; +import twilightforest.world.components.structures.TFMaze; +import twilightforest.world.components.structures.TFStructureComponentOld; +import twilightforest.world.components.structures.TFStructureDecorator; +import twilightforest.init.TFStructurePieceTypes; +import twilightforest.init.TFConfiguredFeatures; + +import java.util.ArrayList; +import java.util.List; + +public class DarkTowerMainComponent extends DarkTowerWingComponent { + private boolean placedKeys = false; + + public DarkTowerMainComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFDTMai.get(), nbt); + } + + public DarkTowerMainComponent(RandomSource rand, int index, int x, int y, int z) { + this(rand, index, x + 10, y, z + 10, Direction.NORTH); + } + + public DarkTowerMainComponent(RandomSource rand, int index, int x, int y, int z, Direction rotation) { + super(TFStructurePieceTypes.TFDTMai.get(), index, x, y, z, 19, 56 + ((rand.nextInt(32) / 5) * 5), rotation); + + // check to make sure we can build the whole tower + if (this.boundingBox.maxY() > 245) { + int amtToLower = (((this.boundingBox.maxY() - 245) / 5) * 5) + 5; + + TwilightForestMod.LOGGER.info("Lowering Dark Tower max height by {} to be within world bounds", amtToLower); + + this.height -= amtToLower; + this.boundingBox = this.boundingBox.moved(0, -amtToLower, 0); + } + + // decorator + if (this.deco == null) { + this.deco = new StructureDecoratorDarkTower(); + } + } + + @Override + public void addChildren(StructurePiece parent, StructurePieceAccessor list, RandomSource rand) { + if (parent != null && parent instanceof TFStructureComponentOld) { + this.deco = ((TFStructureComponentOld) parent).deco; + } + + // if this is not the first main part, add one + if (this.getGenDepth() > 0) { + addOpening(0, 1, size / 2, Rotation.CLOCKWISE_180); + } + + // one direction gets a new main tower, unless we're at tower #3 + Rotation mainDir = null; + + if (this.getGenDepth() < 2) { + mainDir = RotationUtil.ROTATIONS[rand.nextInt(RotationUtil.ROTATIONS.length)]; + + // make sub towers + for (Rotation rotation : RotationUtil.ROTATIONS) { + if (rotation == mainDir) { + continue; + } + + int[] dest = getValidOpening(rand, rotation); + + int childHeight = validateChildHeight(21 + rand.nextInt(10)); + + makeTowerWing(list, rand, this.getGenDepth(), dest[0], dest[1], dest[2], 11, childHeight, rotation); + } + } else { + // make boss trap towers + for (Rotation i : RotationUtil.ROTATIONS) { + int[] dest = getValidOpening(rand, i); + makeBossTrapWing(list, rand, this.getGenDepth(), dest[0], dest[1], dest[2], i); + } + } + + if (this.getGenDepth() > 0) { + // sub towers at base of tower + for (Rotation i : RotationUtil.ROTATIONS) { + if (i == Rotation.CLOCKWISE_180) { + continue; + } + + int[] dest = getValidOpening(rand, i); + + // move opening to tower base + dest[1] = 1; + + int childHeight = validateChildHeight(21 + rand.nextInt(10)); + + makeTowerWing(list, rand, this.getGenDepth(), dest[0], dest[1], dest[2], 11, childHeight, i); + } + + // add a beard + makeABeard(parent, list, rand); + } else { + // 2 entrance towers towers at base of tower + for (Rotation rotation : new Rotation[]{Rotation.NONE, Rotation.CLOCKWISE_180}) { + + int[] dest = getValidOpening(rand, rotation); + + // move opening to tower base + dest[1] = 1; + + int childHeight = validateChildHeight(10 + rand.nextInt(5)); + + makeEntranceTower(list, rand, 5, dest[0], dest[1], dest[2], 9, childHeight, rotation); + } + } + + // actually make main tower + if (mainDir != null) { + int[] dest = getValidOpening(rand, mainDir); + makeNewLargeTower(list, rand, this.getGenDepth() + 1, dest[0], dest[1], dest[2], mainDir); + } + + // add a roof? + makeARoof(parent, list, rand); + + // flag certain towers for keys + if (!this.placedKeys && this.getGenDepth() < 2) { + // count how many size 9 towers we have hanging off us + ArrayList possibleKeyTowers = new ArrayList(); + + if (list instanceof StructurePiecesBuilder start) { + for (StructurePiece piece : start.pieces) { + if (piece instanceof DarkTowerWingComponent wing && wing.size == 9 && wing.getGenDepth() == this.getGenDepth()) { + possibleKeyTowers.add(wing); + } + } + } + + for (int i = 0; i < 4; i++) { + if (possibleKeyTowers.size() < 1) { + TwilightForestMod.LOGGER.warn("Dark forest tower could not find four small towers to place keys in."); + break; + } + + int towerNum = rand.nextInt(possibleKeyTowers.size()); + + possibleKeyTowers.get(towerNum).setKeyTower(true); + possibleKeyTowers.remove(towerNum); + } + + this.placedKeys = true; + } + } + + /** + * Make a bridge that leads to an entrance tower + */ + private boolean makeEntranceTower(StructurePieceAccessor list, RandomSource rand, int index, int x, int y, int z, int childSize, int childHeight, Rotation rotation) { + Direction direction = getStructureRelativeRotation(rotation); + int[] dx = offsetTowerCoords(x, y, z, 5, direction); + + DarkTowerBridgeComponent bridge = new DarkTowerEntranceBridgeComponent(index, dx[0], dx[1], dx[2], childSize, childHeight, direction); + // if I'm doing this right, the main towers can't intersect + list.addPiece(bridge); + bridge.addChildren(this, list, rand); + addOpening(x, y, z, rotation); + return true; + } + + /** + * Make a bridge that leads to a new large-size tower + */ + private boolean makeNewLargeTower(StructurePieceAccessor list, RandomSource rand, int index, int x, int y, int z, Rotation rotation) { + + int wingSize = 15; + int wingHeight = 56; + + Direction direction = getStructureRelativeRotation(rotation); + int[] dx = offsetTowerCoords(x, y, z, 5, direction); + + DarkTowerMainBridgeComponent bridge = new DarkTowerMainBridgeComponent(index, dx[0], dx[1], dx[2], wingSize, wingHeight, direction); + // if I'm doing this right, the main towers can't intersect + list.addPiece(bridge); + bridge.addChildren(this, list, rand); + // lock the door! + addOpening(x, y, z, rotation, EnumDarkTowerDoor.LOCKED); + return true; + } + + /** + * Make a bridge that leads to a boss trap tower + */ + private boolean makeBossTrapWing(StructurePieceAccessor list, RandomSource rand, int index, int x, int y, int z, Rotation rotation) { + + int wingSize = 11; + int wingHeight = 9; + + Direction direction = getStructureRelativeRotation(rotation); + int[] dx = offsetTowerCoords(x, y, z, 5, direction); + + DarkTowerBossBridgeComponent bridge = new DarkTowerBossBridgeComponent(index, dx[0], dx[1], dx[2], wingSize, wingHeight, direction); + // if I'm doing this right, the main towers can't intersect + list.addPiece(bridge); + bridge.addChildren(this, list, rand); + // lock the door! + addOpening(x, y, z, rotation); + return true; + } + + /** + * Attach a roof to this tower. + */ + @Override + public void makeARoof(StructurePiece parent, StructurePieceAccessor list, RandomSource rand) { + if (this.getGenDepth() < 2) { + super.makeARoof(parent, list, rand); + } + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + RandomSource decoRNG = RandomSource.create(world.getSeed() + (this.boundingBox.minX() * 321534781L) ^ (this.boundingBox.minZ() * 756839L)); + + // make walls + makeEncasedWalls(world, rand, sbb, 0, 0, 0, size - 1, height - 1, size - 1); + + // clear inside + generateAirBox(world, sbb, 1, 1, 1, size - 2, height - 2, size - 2); + + if (this.getGenDepth() == 0) { + // deco to ground + for (int x = 0; x < this.size; x++) { + for (int z = 0; z < this.size; z++) { + this.placeBlock(world, deco.accentState, x, -1, z, sbb); + } + } + } + + // nullify sky light +// this.nullifySkyLightForBoundingBox(world); + + // how many total floors do we have? + int totalFloors = this.height / 5; + + // is the tower a beam maze? false = builder platforms + boolean beamMaze = decoRNG.nextBoolean(); + + // how many floors should the center occupy? + int centerFloors = beamMaze ? 4 : totalFloors / 2; + + // how many floors do we get on the top/bottom portion? + int bottomFloors = (totalFloors - centerFloors) / 2; + + // where do the top floors start? + int topFloorsStartY = height - (bottomFloors * 5 + 1); + + // add bottom and top floors + addThreeQuarterFloors(world, manager, generator, decoRNG, sbb, 0, bottomFloors * 5); + if (this.getGenDepth() < 2) { + addThreeQuarterFloors(world, manager, generator, decoRNG, sbb, topFloorsStartY, height - 1); + } else { + addThreeQuarterFloorsDecorateBoss(world, decoRNG, sbb, topFloorsStartY, height - 1); + // boss destruction + + destroyTower(world, decoRNG, 12, height + 4, 3, 4, sbb); + destroyTower(world, decoRNG, 3, height + 4, 12, 4, sbb); + destroyTower(world, decoRNG, 3, height + 4, 3, 4, sbb); + destroyTower(world, decoRNG, 12, height + 4, 12, 4, sbb); + destroyTower(world, decoRNG, 8, height + 4, 8, 5, sbb); + + // make spawner where it will hopefully last + decorateBossSpawner(world, sbb, Rotation.NONE, height - 6); + } + + if (beamMaze) { + addTimberMaze(world, decoRNG, sbb, (bottomFloors * 5), topFloorsStartY); + } else { + addBuilderPlatforms(world, decoRNG, sbb, (bottomFloors * 5), topFloorsStartY); + } + + // openings + makeOpenings(world, sbb); + } + + /** + * Add a bunch of 3/4 floors + */ + protected void addThreeQuarterFloors(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource decoRNG, BoundingBox sbb, int bottom, int top) { + + int spacing = 5; + Rotation rotation = RotationUtil.ROTATIONS[Math.abs((this.boundingBox.minY() + bottom) % 4)]; + if (bottom == 0) { + makeLargeStairsUp(world, sbb, rotation, 0); + rotation = rotation.getRotated(Rotation.COUNTERCLOCKWISE_90); + makeBottomEntrance(world, sbb, rotation, bottom); + bottom += spacing; + } + + // fill with 3/4 floors + for (int y = bottom; y < top; y += spacing) { + boolean isBottomFloor = (y == bottom && bottom != spacing); + boolean isTopFloor = (y >= top - spacing); + boolean isTowerTopFloor = (y >= height - spacing - 2); + + makeThreeQuarterFloor(world, sbb, rotation, y, isBottomFloor, isTowerTopFloor); + + if (!isTopFloor) { + makeLargeStairsUp(world, sbb, rotation, y); + } + + if (!isTopFloor || isTowerTopFloor) { + decorateFloor(world, manager, generator, decoRNG, sbb, rotation, y, isBottomFloor, isTopFloor); + } + + rotation = rotation.getRotated(Rotation.COUNTERCLOCKWISE_90); + } + } + + /** + * Add a bunch of 3/4 floors + */ + protected void addThreeQuarterFloorsDecorateBoss(WorldGenLevel world, RandomSource decoRNG, BoundingBox sbb, int bottom, int top) { + int spacing = 5; + Rotation rotation = RotationUtil.ROTATIONS[(this.boundingBox.minY() + bottom) % 4]; + if (bottom == 0) { + makeLargeStairsUp(world, sbb, rotation, 0); + rotation = rotation.getRotated(Rotation.COUNTERCLOCKWISE_90); + bottom += spacing; + } + + // fill with 3/4 floors + for (int y = bottom; y < top; y += spacing) { + boolean isBottomFloor = (y == bottom && bottom != spacing); + boolean isTopFloor = (y >= top - spacing); + boolean isTowerTopFloor = (y >= height - spacing - 2); + + makeThreeQuarterFloor(world, sbb, rotation, y, isBottomFloor, isTowerTopFloor); + + if (!isTopFloor) { + makeLargeStairsUp(world, sbb, rotation, y); + decorateExperiment(world, sbb, rotation, y); + } + + rotation = rotation.getRotated(Rotation.COUNTERCLOCKWISE_90); + } + } + + @SuppressWarnings("fallthrough") + private void decorateFloor(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource decoRNG, BoundingBox sbb, Rotation rotation, int y, boolean isBottom, boolean isTop) { + // pick an appropriate decoration and use it + // FIXME: if minY <= 64, some cases gets double weight + + if (isTop) { + // there are a limited amount that can go at the top + switch (decoRNG.nextInt(3)) { + case 1 -> decorateBotanical(world, generator, decoRNG, sbb, rotation, y); + case 2 -> decorateNetherwart(world, decoRNG, sbb, rotation, y, isTop); + default -> decorateAquarium(world, sbb, rotation, y); + } + } else if (isBottom) { + // similarly some don't work on the bottom + switch (decoRNG.nextInt(4)) { + default: + case 0: + decorateAquarium(world, sbb, rotation, y); + break; + case 1: + decorateBotanical(world, generator, decoRNG, sbb, rotation, y); + break; + case 2: + if (y + this.boundingBox.minY() > 64) { + decorateNetherwart(world, decoRNG, sbb, rotation, y, isTop); + break; + } + case 3: + decorateForge(world, decoRNG, sbb, rotation, y); + break; + } + } else { + // but in the middle, anything goes + switch (decoRNG.nextInt(8)) { + default: + case 0: + case 1: + decorateReappearingMaze(world, manager, generator, decoRNG, sbb, rotation, y); + break; + case 2: + decorateUnbuilderMaze(world, decoRNG, sbb, rotation, y); + break; + case 3: + decorateAquarium(world, sbb, rotation, y); + break; + case 4: + decorateBotanical(world, generator, decoRNG, sbb, rotation, y); + break; + case 5: + if (y + this.boundingBox.minY() > 64) { + decorateNetherwart(world, decoRNG, sbb, rotation, y, isTop); + break; + } + case 6: + decorateLounge(world, generator, decoRNG, sbb, rotation, y); + break; + case 7: + decorateForge(world, decoRNG, sbb, rotation, y); + break; + } + } + } + + /** + * Make a single three quarter floor + * + * @param isTowerTopFloor + */ + protected void makeThreeQuarterFloor(WorldGenLevel world, BoundingBox sbb, Rotation rotation, int y, boolean isBottom, boolean isTowerTopFloor) { + int half = size / 2; + // fill the floor + this.fillBlocksRotated(world, sbb, half + 1, y, 1, size - 2, y, half + 1, deco.blockState, rotation); + this.fillBlocksRotated(world, sbb, 1, y, half + 1, size - 2, y, size - 2, deco.blockState, rotation); + + // don't make part of the fence if we have stairs coming up + int startZ = isBottom ? 1 : 3; + + this.fillBlocksRotated(world, sbb, 1, y, half, half, y, half, deco.accentState, rotation); + this.fillBlocksRotated(world, sbb, half, y, startZ, half, y, half, deco.accentState, rotation); + this.fillBlocksRotated(world, sbb, 1, y + 1, half, half, y + 1, half, deco.fenceState, rotation); + this.fillBlocksRotated(world, sbb, half, y + 1, startZ, half, y + 1, half, deco.fenceState, rotation); + + // little notch if we're at the tower top + if (isTowerTopFloor) { + this.fillBlocksRotated(world, sbb, 1, y, half - 2, 3, y, half, deco.accentState, rotation); + this.fillBlocksRotated(world, sbb, 1, y + 1, half - 2, 3, y + 1, half, deco.fenceState, rotation); + this.fillBlocksRotated(world, sbb, 1, y, half - 1, 2, y, half, deco.fenceState, rotation); + this.fillBlocksRotated(world, sbb, 1, y + 1, half - 1, 2, y + 1, half, AIR, rotation); + } + } + + protected void makeLargeStairsUp(WorldGenLevel world, BoundingBox sbb, Rotation rotation, int y) { + // stairs! + //this.fillAirRotated(world, sbb, x, y, 1, x, y + 1, 2, rotation); + + for (int i = 0; i < 5; i++) { + int z = size / 2 - i + 4; + int sy = y + i + 1; + + setBlockStateRotated(world, getStairState(deco.stairState, Direction.SOUTH, false), 1, sy, z, rotation, sbb); + setBlockStateRotated(world, getStairState(deco.stairState, Direction.SOUTH, false), 2, sy, z, rotation, sbb); + setBlockStateRotated(world, deco.blockState, 1, sy, z - 1, rotation, sbb); + setBlockStateRotated(world, deco.blockState, 2, sy, z - 1, rotation, sbb); + setBlockStateRotated(world, deco.blockState, 3, sy, z - 1, rotation, sbb); + + if (i > 0 && i < 4) { + setBlockStateRotated(world, deco.accentState, 3, sy, z, rotation, sbb); + setBlockStateRotated(world, deco.fenceState, 3, sy + 1, z, rotation, sbb); + setBlockStateRotated(world, deco.fenceState, 3, sy + 2, z, rotation, sbb); + } else if (i == 0) { + setBlockStateRotated(world, getStairState(deco.stairState, Direction.EAST, false), 3, sy, z, rotation, sbb); + } + } + } + + private void decorateReappearingMaze(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource decoRNG, BoundingBox sbb, Rotation rotation, int y) { + // make maze object + int mazeSize = 6; + TFMaze maze = new TFMaze(mazeSize, mazeSize); + + // set the seed to a fixed value based on this maze's x and z + maze.setSeed(world.getSeed() + this.boundingBox.minX() * 90342903L + y * 90342903L ^ this.boundingBox.minZ()); + + // tell it not to make outside walls by making them "ROOMS" + for (int i = 0; i < 13; i++) { + maze.putRaw(i, 0, TFMaze.ROOM); + maze.putRaw(i, 12, TFMaze.ROOM); + maze.putRaw(0, i, TFMaze.ROOM); + maze.putRaw(12, i, TFMaze.ROOM); + } + + // we need to set this before generation + maze.doorRarity = 0.3F; + + // set some areas out of bounds and make the maze depending on where we start + switch (rotation) { + case NONE -> { + for (int x = 1; x < 6; x++) { + for (int z = 1; z < 6; z++) { + maze.putRaw(x, z, TFMaze.ROOM); + } + } + maze.putRaw(1, 6, TFMaze.ROOM); + maze.putRaw(1, 7, TFMaze.ROOM); + maze.putRaw(1, 8, TFMaze.ROOM); + maze.putRaw(1, 9, TFMaze.ROOM); + maze.putRaw(1, 10, TFMaze.DOOR); + maze.putRaw(6, 1, TFMaze.ROOM); + maze.putRaw(7, 1, TFMaze.ROOM); + maze.putRaw(8, 1, TFMaze.DOOR); + maze.generateRecursiveBacktracker(0, 5); + } + case CLOCKWISE_90 -> { + for (int x = 7; x < 12; x++) { + for (int z = 1; z < 6; z++) { + maze.putRaw(x, z, TFMaze.ROOM); + } + } + maze.putRaw(6, 1, TFMaze.ROOM); + maze.putRaw(5, 1, TFMaze.ROOM); + maze.putRaw(4, 1, TFMaze.ROOM); + maze.putRaw(3, 1, TFMaze.ROOM); + maze.putRaw(2, 1, TFMaze.DOOR); + maze.putRaw(11, 6, TFMaze.ROOM); + maze.putRaw(11, 7, TFMaze.ROOM); + maze.putRaw(11, 8, TFMaze.DOOR); + maze.generateRecursiveBacktracker(0, 0); + } + case CLOCKWISE_180 -> { + for (int x = 7; x < 12; x++) { + for (int z = 7; z < 12; z++) { + maze.putRaw(x, z, TFMaze.ROOM); + } + } + maze.putRaw(11, 6, TFMaze.ROOM); + maze.putRaw(11, 5, TFMaze.ROOM); + maze.putRaw(11, 4, TFMaze.ROOM); + maze.putRaw(11, 3, TFMaze.ROOM); + maze.putRaw(11, 2, TFMaze.DOOR); + maze.putRaw(6, 11, TFMaze.ROOM); + maze.putRaw(5, 11, TFMaze.ROOM); + maze.putRaw(4, 11, TFMaze.DOOR); + maze.generateRecursiveBacktracker(5, 0); + } + case COUNTERCLOCKWISE_90 -> { + for (int x = 1; x < 6; x++) { + for (int z = 7; z < 12; z++) { + maze.putRaw(x, z, TFMaze.ROOM); + } + } + maze.putRaw(6, 11, TFMaze.ROOM); + maze.putRaw(7, 11, TFMaze.ROOM); + maze.putRaw(8, 11, TFMaze.ROOM); + maze.putRaw(9, 11, TFMaze.ROOM); + maze.putRaw(10, 11, TFMaze.DOOR); + maze.putRaw(1, 6, TFMaze.ROOM); + maze.putRaw(1, 5, TFMaze.ROOM); + maze.putRaw(1, 4, TFMaze.DOOR); + maze.generateRecursiveBacktracker(5, 5); + } + } + + // copy the maze to us! + maze.wallBlockState = deco.blockState; + maze.headBlockState = deco.accentState; + maze.pillarBlockState = deco.accentState; + maze.doorBlockState = TFBlocks.REAPPEARING_BLOCK.get().defaultBlockState(); + + maze.torchRarity = 0; + maze.tall = 3; + maze.head = 1; + maze.oddBias = 2; + + maze.copyToStructure(world, manager, generator, 0, y + 1, 0, this, sbb); + + decorateMazeDeadEnds(world, decoRNG, maze, y, rotation, sbb); + } + + /** + * Find dead ends and put something there + */ + protected void decorateMazeDeadEnds(WorldGenLevel world, RandomSource decoRNG, TFMaze maze, int y, Rotation rotation, BoundingBox sbb) { + for (int x = 0; x < maze.width; x++) { + for (int z = 0; z < maze.depth; z++) { + // dead ends + if (!maze.isWall(x, z, x - 1, z) && maze.isWall(x, z, x + 1, z) && maze.isWall(x, z, x, z - 1) && maze.isWall(x, z, x, z + 1)) { + decorateDeadEnd(world, x, y, z, 3, sbb); + } + if (maze.isWall(x, z, x - 1, z) && !maze.isWall(x, z, x + 1, z) && maze.isWall(x, z, x, z - 1) && maze.isWall(x, z, x, z + 1)) { + decorateDeadEnd(world, x, y, z, 1, sbb); + } + if (maze.isWall(x, z, x - 1, z) && maze.isWall(x, z, x + 1, z) && !maze.isWall(x, z, x, z - 1) && maze.isWall(x, z, x, z + 1)) { + decorateDeadEnd(world, x, y, z, 0, sbb); + } + if (maze.isWall(x, z, x - 1, z) && maze.isWall(x, z, x + 1, z) && maze.isWall(x, z, x, z - 1) && !maze.isWall(x, z, x, z + 1)) { + decorateDeadEnd(world, x, y, z, 2, sbb); + } + } + } + } + + /** + * Decorate a specific maze dead end + */ + private void decorateDeadEnd(WorldGenLevel world, int mx, int y, int mz, int facing, BoundingBox sbb) { + int x = mx * 3 + 1; + int z = mz * 3 + 1; + + switch (facing) { + case 0 -> { + placeBlock(world, deco.accentState, x, y + 1, z + 1, sbb); + placeBlock(world, deco.accentState, x + 1, y + 1, z + 1, sbb); + this.setDoubleLootChest(world, x, y + 2, z + 1, x + 1, y + 2, z + 1, Direction.SOUTH, TFLootTables.DARKTOWER_CACHE, sbb, false); + } + case 1 -> { + placeBlock(world, deco.accentState, x, y + 1, z, sbb); + placeBlock(world, deco.accentState, x, y + 1, z + 1, sbb); + this.setDoubleLootChest(world, x, y + 2, z, x, y + 2, z + 1, Direction.WEST, TFLootTables.DARKTOWER_CACHE, sbb, false); + } + case 2 -> { + placeBlock(world, deco.accentState, x, y + 1, z, sbb); + placeBlock(world, deco.accentState, x + 1, y + 1, z, sbb); + this.setDoubleLootChest(world, x + 1, y + 2, z, x, y + 2, z, Direction.NORTH, TFLootTables.DARKTOWER_CACHE, sbb, false); + } + case 3 -> { + placeBlock(world, deco.accentState, x + 1, y + 1, z, sbb); + placeBlock(world, deco.accentState, x + 1, y + 1, z + 1, sbb); + this.setDoubleLootChest(world, x + 1, y + 2, z + 1, x + 1, y + 2, z, Direction.EAST, TFLootTables.DARKTOWER_CACHE, sbb, false); + } + } + } + + private void decorateUnbuilderMaze(WorldGenLevel world, RandomSource decoRNG, BoundingBox sbb, Rotation rotation, int y) { + + // fill in posts + for (int x = size / 2; x < size - 1; x++) { + for (int z = 3; z < size - 1; z++) { + if (x % 2 == 1 && z % 2 == 1) { + for (int py = 1; py < 5; py++) { + setBlockStateRotated(world, deco.pillarState, x, y + py, z, rotation, sbb); + } + } else if (x % 2 == 1 || z % 2 == 1) { + for (int py = 1; py < 5; py++) { + setBlockStateRotated(world, deco.fenceState, x, y + py, z, rotation, sbb); + } + + if (x != (size / 2) + 2 && x != size - 1 && z != size - 1) { + int ay = decoRNG.nextInt(4) + 1; + setBlockStateRotated(world, AIR, x, y + ay, z, rotation, sbb); + + if (x > size - 7) { + ay = decoRNG.nextInt(3) + 1; + setBlockStateRotated(world, AIR, x, y + ay, z, rotation, sbb); + } + } + } + } + } + + final BlockState antiBuilderBlockState = TFBlocks.ANTIBUILDER.get().defaultBlockState(); + + // place unbuilders + setBlockStateRotated(world, antiBuilderBlockState, 15, y + 2, 7, rotation, sbb); + setBlockStateRotated(world, antiBuilderBlockState, 11, y + 3, 7, rotation, sbb); + setBlockStateRotated(world, antiBuilderBlockState, 15, y + 2, 13, rotation, sbb); + setBlockStateRotated(world, antiBuilderBlockState, 11, y + 3, 13, rotation, sbb); + setBlockStateRotated(world, antiBuilderBlockState, 5, y + 3, 13, rotation, sbb); + } + + private void decorateLounge(WorldGenLevel world, ChunkGenerator generator, RandomSource decoRNG, BoundingBox sbb, Rotation rotation, int y) { + // brewing area in corner - walls + this.fillBlocksRotated(world, sbb, 17, y + 1, 1, 17, y + 4, 6, deco.pillarState, rotation); + this.fillBlocksRotated(world, sbb, 12, y + 1, 1, 17, y + 4, 1, deco.pillarState, rotation); + + // floors + this.fillBlocksRotated(world, sbb, 13, y + 1, 2, 16, y + 1, 5, deco.blockState, rotation); + this.fillBlocksRotated(world, sbb, 12, y + 1, 2, 12, y + 1, 6, getStairState(deco.stairState, Direction.WEST, false), rotation); + this.fillBlocksRotated(world, sbb, 12, y + 1, 6, 16, y + 1, 6, getStairState(deco.stairState, Direction.SOUTH, false), rotation); + + // furnaces + this.makeDispenserPillar(world, deco, 13, y, 1, Direction.SOUTH, rotation, sbb); + this.makeDispenserPillar(world, deco, 15, y, 1, Direction.SOUTH, rotation, sbb); + this.makeDispenserPillar(world, deco, 17, y, 3, Direction.WEST, rotation, sbb); + this.makeDispenserPillar(world, deco, 17, y, 5, Direction.WEST, rotation, sbb); + + // framing pillars + this.makeStonePillar(world, deco, 12, y, 1, rotation, sbb); + this.makeStonePillar(world, deco, 17, y, 6, rotation, sbb); + + // cauldron and brewing stand + this.setBlockStateRotated(world, Blocks.BREWING_STAND.defaultBlockState(), 13, y + 2, 5, rotation, sbb); + this.setBlockStateRotated(world, Blocks.WATER_CAULDRON.defaultBlockState().setValue(LayeredCauldronBlock.LEVEL, 3), 15, y + 2, 3, rotation, sbb); + + // bookshelves in corner + this.fillBlocksRotated(world, sbb, 10, y + 1, 17, 17, y + 4, 17, deco.blockState, rotation); + this.fillBlocksRotated(world, sbb, 17, y + 1, 10, 17, y + 4, 17, deco.blockState, rotation); + + this.fillBlocksRotated(world, sbb, 11, y + 1, 17, 12, y + 4, 17, Blocks.BOOKSHELF.defaultBlockState(), rotation); + this.fillBlocksRotated(world, sbb, 14, y + 1, 17, 15, y + 4, 17, Blocks.BOOKSHELF.defaultBlockState(), rotation); + this.fillBlocksRotated(world, sbb, 17, y + 1, 11, 17, y + 4, 12, Blocks.BOOKSHELF.defaultBlockState(), rotation); + this.fillBlocksRotated(world, sbb, 17, y + 1, 14, 17, y + 4, 15, Blocks.BOOKSHELF.defaultBlockState(), rotation); + + // table + this.setBlockStateRotated(world, getStairState(deco.stairState, Direction.SOUTH, true), 13, y + 1, 14, rotation, sbb); + this.setBlockStateRotated(world, getStairState(deco.stairState, Direction.EAST, true), 14, y + 1, 14, rotation, sbb); + this.setBlockStateRotated(world, getStairState(deco.stairState, Direction.NORTH, true), 14, y + 1, 13, rotation, sbb); + this.setBlockStateRotated(world, getStairState(deco.stairState, Direction.WEST, true), 13, y + 1, 13, rotation, sbb); + + // chair 1 + this.setBlockStateRotated(world, getStairState(deco.stairState, Direction.EAST, false), 11, y + 1, 13, rotation, sbb); + + // chair 2 + this.setBlockStateRotated(world, getStairState(deco.stairState, Direction.SOUTH, false), 13, y + 1, 11, rotation, sbb); + + // center lamp + setBlockStateRotated(world, Blocks.REDSTONE_LAMP.defaultBlockState(), 8, y + 3, 8, rotation, sbb); + setBlockStateRotated(world, getLeverState(Blocks.LEVER.defaultBlockState(), AttachFace.CEILING, decoRNG.nextBoolean() ? Direction.EAST : Direction.NORTH, false), 8, y + 2, 8, rotation, sbb); + + // planter for trees + placeTreePlanter(world, generator, decoRNG.nextInt(5), 6, y + 1, 12, rotation, sbb); + } + + private void makeDispenserPillar(WorldGenLevel world, TFStructureDecorator forgeDeco, int x, int y, int z, Direction stairMeta, Rotation rotation, BoundingBox sbb) { + this.setBlockStateRotated(world, getStairState(forgeDeco.stairState, stairMeta, true), x, y + 2, z, rotation, sbb); + this.setBlockStateRotated(world, Blocks.DISPENSER.defaultBlockState().setValue(DispenserBlock.FACING, stairMeta.getOpposite()), x, y + 3, z, rotation, sbb); + this.setBlockStateRotated(world, getStairState(forgeDeco.stairState, stairMeta, false), x, y + 4, z, rotation, sbb); + } + + private void decorateBossSpawner(WorldGenLevel world, BoundingBox sbb, Rotation rotation, int y) { + this.setBlockStateRotated(world, TFBlocks.UR_GHAST_BOSS_SPAWNER.get().defaultBlockState(), 9, y + 4, 9, rotation, sbb); + } + + private void decorateExperiment(WorldGenLevel world, BoundingBox sbb, Rotation rotation, int y) { + final BlockState obsidian = Blocks.OBSIDIAN.defaultBlockState(); + final BlockState netherrack = Blocks.NETHERRACK.defaultBlockState(); + final BlockState redstone = Blocks.REDSTONE_BLOCK.defaultBlockState(); + final BlockState inactiveReactor = TFBlocks.CARMINITE_REACTOR.get().defaultBlockState(); + + // crafting area in corner - walls + this.fillBlocksRotated(world, sbb, 17, y + 1, 1, 17, y + 4, 6, deco.pillarState, rotation); + this.fillBlocksRotated(world, sbb, 12, y + 1, 1, 17, y + 4, 1, deco.pillarState, rotation); + + // floors + this.fillBlocksRotated(world, sbb, 13, y + 1, 2, 16, y + 1, 5, deco.blockState, rotation); + this.fillBlocksRotated(world, sbb, 12, y + 1, 2, 12, y + 1, 6, getStairState(deco.stairState, Direction.WEST, false), rotation); + this.fillBlocksRotated(world, sbb, 12, y + 1, 6, 16, y + 1, 6, getStairState(deco.stairState, Direction.SOUTH, false), rotation); + + this.makeWoodPillar(world, 13, y, 1, rotation, sbb); + this.makeWoodPillar(world, 15, y, 1, rotation, sbb); + this.makeWoodPillar(world, 17, y, 3, rotation, sbb); + this.makeWoodPillar(world, 17, y, 5, rotation, sbb); + + // framing pillars + this.makeStonePillar(world, deco, 12, y, 1, rotation, sbb); + this.makeStonePillar(world, deco, 17, y, 6, rotation, sbb); + + // workbench + setBlockStateRotated(world, Blocks.CRAFTING_TABLE.defaultBlockState(), 14, y + 2, 4, rotation, sbb); + + // recipes in frames? + placeItemFrameRotated(world, 13, y + 2, 1, rotation, Direction.SOUTH, new ItemStack(TFItems.BORER_ESSENCE.get()), sbb); + placeItemFrameRotated(world, 14, y + 2, 1, rotation, Direction.SOUTH, new ItemStack(Items.REDSTONE), sbb); + placeItemFrameRotated(world, 15, y + 2, 1, rotation, Direction.SOUTH, new ItemStack(TFItems.BORER_ESSENCE.get()), sbb); + placeItemFrameRotated(world, 13, y + 3, 1, rotation, Direction.SOUTH, new ItemStack(Items.REDSTONE), sbb); + placeItemFrameRotated(world, 14, y + 3, 1, rotation, Direction.SOUTH, new ItemStack(Items.GHAST_TEAR), sbb); + placeItemFrameRotated(world, 15, y + 3, 1, rotation, Direction.SOUTH, new ItemStack(Items.REDSTONE), sbb); + placeItemFrameRotated(world, 13, y + 4, 1, rotation, Direction.SOUTH, new ItemStack(TFItems.BORER_ESSENCE.get()), sbb); + placeItemFrameRotated(world, 14, y + 4, 1, rotation, Direction.SOUTH, new ItemStack(Items.REDSTONE), sbb); + placeItemFrameRotated(world, 15, y + 4, 1, rotation, Direction.SOUTH, new ItemStack(TFItems.BORER_ESSENCE.get()), sbb); + + placeItemFrameRotated(world, 17, y + 2, 3, rotation, Direction.WEST, new ItemStack(TFBlocks.ENCASED_TOWERWOOD.get()), sbb); + placeItemFrameRotated(world, 17, y + 2, 4, rotation, Direction.WEST, new ItemStack(TFBlocks.TOWERWOOD.get()), sbb); + placeItemFrameRotated(world, 17, y + 2, 5, rotation, Direction.WEST, new ItemStack(TFBlocks.ENCASED_TOWERWOOD.get()), sbb); + placeItemFrameRotated(world, 17, y + 3, 3, rotation, Direction.WEST, new ItemStack(TFBlocks.TOWERWOOD.get()), sbb); + placeItemFrameRotated(world, 17, y + 3, 4, rotation, Direction.WEST, new ItemStack(TFItems.CARMINITE.get()), sbb); + placeItemFrameRotated(world, 17, y + 3, 5, rotation, Direction.WEST, new ItemStack(TFBlocks.TOWERWOOD.get()), sbb); + placeItemFrameRotated(world, 17, y + 4, 3, rotation, Direction.WEST, new ItemStack(TFBlocks.ENCASED_TOWERWOOD.get()), sbb); + placeItemFrameRotated(world, 17, y + 4, 4, rotation, Direction.WEST, new ItemStack(TFBlocks.TOWERWOOD.get()), sbb); + placeItemFrameRotated(world, 17, y + 4, 5, rotation, Direction.WEST, new ItemStack(TFBlocks.ENCASED_TOWERWOOD.get()), sbb); + + if (y < this.height - 13) { + // device bottom + setBlockStateRotated(world, obsidian, 13, y + 1, 13, rotation, sbb); + setBlockStateRotated(world, obsidian, 15, y + 1, 13, rotation, sbb); + setBlockStateRotated(world, obsidian, 13, y + 1, 15, rotation, sbb); + setBlockStateRotated(world, obsidian, 15, y + 1, 15, rotation, sbb); + setBlockStateRotated(world, netherrack, 13, y + 1, 14, rotation, sbb); + setBlockStateRotated(world, netherrack, 14, y + 1, 13, rotation, sbb); + setBlockStateRotated(world, netherrack, 15, y + 1, 14, rotation, sbb); + setBlockStateRotated(world, netherrack, 14, y + 1, 15, rotation, sbb); + setBlockStateRotated(world, redstone, 14, y + 1, 14, rotation, sbb); + + // middle + setBlockStateRotated(world, netherrack, 13, y + 2, 13, rotation, sbb); + setBlockStateRotated(world, netherrack, 15, y + 2, 13, rotation, sbb); + setBlockStateRotated(world, netherrack, 13, y + 2, 15, rotation, sbb); + setBlockStateRotated(world, netherrack, 15, y + 2, 15, rotation, sbb); + setBlockStateRotated(world, inactiveReactor, 14, y + 2, 14, rotation, sbb); + + //device top + setBlockStateRotated(world, obsidian, 13, y + 3, 13, rotation, sbb); + setBlockStateRotated(world, obsidian, 15, y + 3, 13, rotation, sbb); + setBlockStateRotated(world, obsidian, 13, y + 3, 15, rotation, sbb); + setBlockStateRotated(world, obsidian, 15, y + 3, 15, rotation, sbb); + setBlockStateRotated(world, netherrack, 13, y + 3, 14, rotation, sbb); + setBlockStateRotated(world, netherrack, 14, y + 3, 13, rotation, sbb); + setBlockStateRotated(world, netherrack, 15, y + 3, 14, rotation, sbb); + setBlockStateRotated(world, netherrack, 14, y + 3, 15, rotation, sbb); + setBlockStateRotated(world, redstone, 14, y + 3, 14, rotation, sbb); + } + + // short piston plunger 1 + setBlockStateRotated(world, deco.accentState, 14, y + 1, 17, rotation, sbb); + setBlockStateRotated(world, getLeverState(Blocks.LEVER.defaultBlockState(), AttachFace.WALL, Direction.EAST, false), 13, y + 1, 17, rotation, sbb); + setBlockStateRotated(world, Blocks.PISTON.defaultBlockState().setValue(DirectionalBlock.FACING, Direction.SOUTH), 14, y + 2, 17, rotation, sbb); + setBlockStateRotated(world, redstone, 14, y + 2, 16, rotation, sbb); + + // short piston plunger 2 + setBlockStateRotated(world, deco.accentState, 17, y + 1, 14, rotation, sbb); + setBlockStateRotated(world, getLeverState(Blocks.LEVER.defaultBlockState(), AttachFace.WALL, Direction.SOUTH, false), 17, y + 1, 13, rotation, sbb); + setBlockStateRotated(world, Blocks.PISTON.defaultBlockState().setValue(DirectionalBlock.FACING, Direction.EAST), 17, y + 2, 14, rotation, sbb); + setBlockStateRotated(world, redstone, 16, y + 2, 14, rotation, sbb); + + // long piston plunger 1 + setBlockStateRotated(world, redstone, 14, y + 2, 11, rotation, sbb); + setBlockStateRotated(world, deco.accentState, 14, y + 1, 11, rotation, sbb); + setBlockStateRotated(world, getLeverState(Blocks.LEVER.defaultBlockState(), AttachFace.WALL, Direction.EAST, true), 13, y + 1, 11, rotation, sbb); + setBlockStateRotated(world, Blocks.PISTON.defaultBlockState().setValue(DirectionalBlock.FACING, Direction.NORTH), 14, y + 2, 10, rotation, sbb); + setBlockStateRotated(world, deco.accentState, 14, y + 1, 9, rotation, sbb); + setBlockStateRotated(world, getLeverState(Blocks.LEVER.defaultBlockState(), AttachFace.WALL, Direction.EAST, false), 13, y + 1, 9, rotation, sbb); + setBlockStateRotated(world, Blocks.STICKY_PISTON.defaultBlockState().setValue(DirectionalBlock.FACING, Direction.NORTH), 14, y + 2, 9, rotation, sbb); + + // long piston plunger 2 + setBlockStateRotated(world, redstone, 11, y + 2, 14, rotation, sbb); + setBlockStateRotated(world, deco.accentState, 11, y + 1, 14, rotation, sbb); + setBlockStateRotated(world, getLeverState(Blocks.LEVER.defaultBlockState(), AttachFace.WALL, Direction.SOUTH, true), 11, y + 1, 13, rotation, sbb); + setBlockStateRotated(world, Blocks.PISTON.defaultBlockState().setValue(DirectionalBlock.FACING, Direction.WEST), 10, y + 2, 14, rotation, sbb); + setBlockStateRotated(world, deco.accentState, 9, y + 1, 14, rotation, sbb); + setBlockStateRotated(world, getLeverState(Blocks.LEVER.defaultBlockState(), AttachFace.WALL, Direction.SOUTH, false), 9, y + 1, 13, rotation, sbb); + setBlockStateRotated(world, Blocks.STICKY_PISTON.defaultBlockState().setValue(DirectionalBlock.FACING, Direction.WEST), 9, y + 2, 14, rotation, sbb); + } + + private void makeWoodPillar(WorldGenLevel world, int x, int y, int z, Rotation rotation, BoundingBox sbb) { + final BlockState log = TFBlocks.DARK_LOG.get().defaultBlockState(); + this.setBlockStateRotated(world, log, x, y + 2, z, rotation, sbb); + this.setBlockStateRotated(world, log, x, y + 3, z, rotation, sbb); + this.setBlockStateRotated(world, log, x, y + 4, z, rotation, sbb); + } + + private void placeItemFrameRotated(WorldGenLevel world, int x, int y, int z, Rotation rotation, Direction direction, ItemStack itemStack, BoundingBox sbb) { + + int dx = getXWithOffsetRotated(x, z, rotation); + int dy = getWorldY(y); + int dz = getZWithOffsetRotated(x, z, rotation); + Direction facing = this.rotation.getRotated(rotation).rotate(direction).getOpposite(); + final BlockPos pos = new BlockPos(dx, dy, dz).relative(facing); + if (sbb.isInside(pos)) { + ItemFrame frame = new ItemFrame(world.getLevel(), pos, facing); + if (!itemStack.isEmpty()) { + frame.setItem(itemStack, false); + } + // check if the frame is on a valid surface or not? The wall may not have been generated yet, on a chunk boundry + world.addFreshEntity(frame); + } + } + + private void decorateAquarium(WorldGenLevel world, BoundingBox sbb, Rotation rotation, int y) { + // main aquarium + makePillarFrame(world, sbb, this.deco, rotation, 12, y, 3, 4, 4, 13, false); + this.fillBlocksRotated(world, sbb, 13, y + 4, 4, 14, y + 4, 14, Blocks.WATER.defaultBlockState(), rotation); + + // little one + makePillarFrame(world, sbb, this.deco, rotation, 6, y, 12, 4, 4, 4, false); + this.fillBlocksRotated(world, sbb, 6, y + 5, 12, 9, y + 5, 15, deco.accentState, rotation); + this.fillBlocksRotated(world, sbb, 7, y + 4, 13, 8, y + 5, 14, Blocks.WATER.defaultBlockState(), rotation); + } + + private void decorateForge(WorldGenLevel world, RandomSource decoRNG, BoundingBox sbb, Rotation rotation, int y) { + TFStructureDecorator forgeDeco = this.deco; + + // stone walls in corner + this.fillBlocksRotated(world, sbb, 17, y + 1, 1, 17, y + 4, 6, forgeDeco.pillarState, rotation); + this.fillBlocksRotated(world, sbb, 12, y + 1, 1, 17, y + 4, 1, forgeDeco.pillarState, rotation); + + this.fillBlocksRotated(world, sbb, 12, y + 1, 17, 17, y + 4, 17, forgeDeco.pillarState, rotation); + this.fillBlocksRotated(world, sbb, 17, y + 1, 12, 17, y + 4, 17, forgeDeco.pillarState, rotation); + + // floors + this.fillBlocksRotated(world, sbb, 13, y + 1, 2, 16, y + 1, 5, forgeDeco.blockState, rotation); + this.fillBlocksRotated(world, sbb, 12, y + 1, 2, 12, y + 1, 6, getStairState(deco.stairState, Direction.WEST, false), rotation); + this.fillBlocksRotated(world, sbb, 12, y + 1, 6, 16, y + 1, 6, getStairState(deco.stairState, Direction.SOUTH, false), rotation); + + this.fillBlocksRotated(world, sbb, 13, y + 1, 13, 16, y + 1, 16, forgeDeco.blockState, rotation); + this.fillBlocksRotated(world, sbb, 12, y + 1, 12, 12, y + 1, 16, getStairState(deco.stairState, Direction.WEST, false), rotation); + this.fillBlocksRotated(world, sbb, 12, y + 1, 12, 16, y + 1, 12, getStairState(deco.stairState, Direction.NORTH, false), rotation); + + // furnaces + this.makeFurnacePillar(world, decoRNG, 13, y, 1, Direction.SOUTH, rotation, sbb); + this.makeFurnacePillar(world, decoRNG, 15, y, 1, Direction.SOUTH, rotation, sbb); + this.makeFurnacePillar(world, decoRNG, 17, y, 3, Direction.WEST, rotation, sbb); + this.makeFurnacePillar(world, decoRNG, 17, y, 5, Direction.WEST, rotation, sbb); + + this.makeFurnacePillar(world, decoRNG, 13, y, 17, Direction.NORTH, rotation, sbb); + this.makeFurnacePillar(world, decoRNG, 15, y, 17, Direction.NORTH, rotation, sbb); + this.makeFurnacePillar(world, decoRNG, 17, y, 13, Direction.WEST, rotation, sbb); + this.makeFurnacePillar(world, decoRNG, 17, y, 15, Direction.WEST, rotation, sbb); + + // framing pillars + //this.makeStonePillar(world, forgeDeco, 12, y, 1, Direction.SOUTH, rotation, sbb); + this.makeStonePillar(world, forgeDeco, 17, y, 6, rotation, sbb); + + this.makeStonePillar(world, forgeDeco, 12, y, 17, rotation, sbb); + this.makeStonePillar(world, forgeDeco, 17, y, 12, rotation, sbb); + + // extra pillars + this.makeStonePillar(world, forgeDeco, 17, y, 9, rotation, sbb); + this.makeStonePillar(world, forgeDeco, 9, y, 17, rotation, sbb); + + // anvils + this.setBlockStateRotated(world, List.of(Blocks.ANVIL, Blocks.CHIPPED_ANVIL, Blocks.DAMAGED_ANVIL).get(decoRNG.nextInt(3)).defaultBlockState() + .setValue(AnvilBlock.FACING, Direction.Plane.HORIZONTAL.getRandomDirection(decoRNG)), 13, y + 2, 5, rotation, sbb); + + this.setBlockStateRotated(world, List.of(Blocks.ANVIL, Blocks.CHIPPED_ANVIL, Blocks.DAMAGED_ANVIL).get(decoRNG.nextInt(3)).defaultBlockState() + .setValue(AnvilBlock.FACING, Direction.Plane.HORIZONTAL.getRandomDirection(decoRNG)), 13, y + 2, 13, rotation, sbb); + + // fire pit + makeFirePit(world, forgeDeco, 6, y + 1, 12, rotation, sbb); + } + + private void makeFurnacePillar(WorldGenLevel world, RandomSource rand, int x, int y, int z, Direction direction, Rotation rotation, BoundingBox sbb) { + + this.setBlockStateRotated(world, getStairState(deco.stairState, direction, true), x, y + 2, z, rotation, sbb); + this.setBlockStateRotated(world, Blocks.FURNACE.defaultBlockState().setValue(AbstractFurnaceBlock.FACING, direction.getOpposite()), x, y + 3, z, rotation, sbb); + + // randomly put some charcoal in the furnace burn slot + int amount = rand.nextBoolean() ? rand.nextInt(5) + 4 : 0; + if (amount > 0) { + int dx = getXWithOffsetRotated(x, z, rotation); + int dy = getWorldY(y + 3); + int dz = getZWithOffsetRotated(x, z, rotation); + + BlockPos pos = new BlockPos(dx, dy, dz); + + if (sbb.isInside(pos) && world.getBlockState(pos).getBlock() == Blocks.FURNACE) { + // put charcoal in the oven + Container inv = (Container) world.getBlockEntity(pos); + + inv.setItem(1, new ItemStack(Items.CHARCOAL, amount)); + } + } + + this.setBlockStateRotated(world, getStairState(deco.stairState, direction, false), x, y + 4, z, rotation, sbb); + } + + private void makeStonePillar(WorldGenLevel world, TFStructureDecorator forgeDeco, int x, int y, int z, Rotation rotation, BoundingBox sbb) { + for (int py = 1; py <= 4; py++) { + this.setBlockStateRotated(world, forgeDeco.pillarState, x, y + py, z, rotation, sbb); + } + // we used to have caps here, but the code was too complex to be worthwhile + } + + private void makeFirePit(WorldGenLevel world, TFStructureDecorator myDeco, int x, int y, int z, Rotation rotation, BoundingBox sbb) { + setBlockStateRotated(world, getStairState(deco.stairState, Direction.WEST, false), x - 1, y, z, rotation, sbb); + setBlockStateRotated(world, getStairState(deco.stairState, Direction.EAST, false), x + 1, y, z, rotation, sbb); + setBlockStateRotated(world, getStairState(deco.stairState, Direction.SOUTH, false), x, y, z + 1, rotation, sbb); + setBlockStateRotated(world, getStairState(deco.stairState, Direction.NORTH, false), x, y, z - 1, rotation, sbb); + setBlockStateRotated(world, myDeco.pillarState, x + 1, y, z + 1, rotation, sbb); + setBlockStateRotated(world, myDeco.pillarState, x + 1, y, z - 1, rotation, sbb); + setBlockStateRotated(world, myDeco.pillarState, x - 1, y, z + 1, rotation, sbb); + setBlockStateRotated(world, myDeco.pillarState, x - 1, y, z - 1, rotation, sbb); + + setBlockStateRotated(world, Blocks.NETHERRACK.defaultBlockState(), x, y, z, rotation, sbb); + setBlockStateRotated(world, Blocks.FIRE.defaultBlockState(), x, y + 1, z, rotation, sbb); + } + + private void decorateNetherwart(WorldGenLevel world, RandomSource decoRNG, BoundingBox sbb, Rotation rotation, int y, boolean isTop) { + TFStructureDecorator netherDeco = this.deco; + +// // lava container +// makePillarFrame(world, sbb, netherDeco, rotation, 12, y, 3, 4, 4, 4, true); +// this.fillBlocksRotated(world, sbb, 13, y + 1, 4, 14, y + 1, 5, Blocks.LAVAMOVING, 0, rotation); +// this.fillBlocksRotated(world, sbb, 12, y + 3, 3, 15, y + 4, 6, 0, 0, rotation); + + //makeNetherburst(world, decoRNG, 8, 100, 20, 12, y + 3, 3, rotation, sbb); + + // wart container + makePillarFrame(world, sbb, netherDeco, rotation, 12, y, 9, 4, 4, 7, true); + this.fillBlocksRotated(world, sbb, 13, y + 1, 10, 14, y + 1, 14, Blocks.SOUL_SAND.defaultBlockState(), rotation); + this.fillBlocksRotated(world, sbb, 13, y + 2, 10, 14, y + 2, 14, Blocks.NETHER_WART.defaultBlockState(), rotation); + this.fillBlocksRotated(world, sbb, 13, y + 4, 10, 14, y + 4, 14, Blocks.SOUL_SAND.defaultBlockState(), rotation); + + // blaze container + makePillarFrame(world, sbb, netherDeco, rotation, 5, y, 12, 3, (isTop ? 4 : 9), 3, true); + this.setBlockStateRotated(world, netherDeco.blockState, 6, y + 1, 13, rotation, sbb); + this.setBlockStateRotated(world, netherDeco.blockState, 6, y + (isTop ? 4 : 9), 13, rotation, sbb); + + this.setSpawnerRotated(world, 6, y + 3, 13, rotation, EntityType.BLAZE, sbb); + + // destruction blob + destroyTower(world, decoRNG, 12, y, 3, 2, sbb); + } + + private void decorateBotanical(WorldGenLevel world, ChunkGenerator generator, RandomSource decoRNG, BoundingBox sbb, Rotation rotation, int y) { + // main part + makePillarFrame(world, sbb, this.deco, rotation, 12, y, 12, 4, 4, 4, true); + this.fillBlocksRotated(world, sbb, 13, y + 1, 13, 14, y + 1, 14, deco.blockState, rotation); + this.fillBlocksRotated(world, sbb, 13, y + 4, 13, 14, y + 4, 14, deco.blockState, rotation); + + placeRandomPlant(world, decoRNG, 13, y + 2, 13, rotation, sbb); + placeRandomPlant(world, decoRNG, 13, y + 2, 14, rotation, sbb); + placeRandomPlant(world, decoRNG, 14, y + 2, 13, rotation, sbb); + placeRandomPlant(world, decoRNG, 14, y + 2, 14, rotation, sbb); + + // toolbench + for (int py = 1; py <= 4; py++) { + setBlockStateRotated(world, deco.pillarState, 12, y + py, 4, rotation, sbb); + setBlockStateRotated(world, deco.pillarState, 15, y + py, 4, rotation, sbb); + } + setBlockStateRotated(world, getStairState(deco.stairState, Direction.EAST, true), 13, y + 1, 4, rotation, sbb); + setBlockStateRotated(world, getStairState(deco.stairState, Direction.WEST, true), 14, y + 1, 4, rotation, sbb); + + //setBlockStateRotated(world, Blocks.CHEST, 0, 13, y + 2, 4, rotation, sbb); + placeTreasureRotated(world, 13, y + 2, 4, getOrientation(), rotation, TFLootTables.DARKTOWER_CACHE, sbb); + setBlockStateRotated(world, Blocks.CRAFTING_TABLE.defaultBlockState(), 14, y + 2, 4, rotation, sbb); + + BlockState slab = Blocks.SPRUCE_SLAB.defaultBlockState() + .setValue(SlabBlock.TYPE, SlabType.TOP); + + // bench 2 + setBlockStateRotated(world, getStairState(deco.stairState, Direction.EAST, true), 12, y + 1, 7, rotation, sbb); + setBlockStateRotated(world, slab, 13, y + 1, 7, rotation, sbb); + setBlockStateRotated(world, slab, 14, y + 1, 7, rotation, sbb); + setBlockStateRotated(world, getStairState(deco.stairState, Direction.WEST, true), 15, y + 1, 7, rotation, sbb); + + // bench 2 + setBlockStateRotated(world, getStairState(deco.stairState, Direction.EAST, true), 12, y + 1, 10, rotation, sbb); + setBlockStateRotated(world, slab, 13, y + 1, 10, rotation, sbb); + setBlockStateRotated(world, slab, 14, y + 1, 10, rotation, sbb); + setBlockStateRotated(world, getStairState(deco.stairState, Direction.WEST, true), 15, y + 1, 10, rotation, sbb); + + // plants on benches + for (int x = 12; x <= 15; x++) { + placeRandomPlant(world, decoRNG, x, y + 2, 7, rotation, sbb); + placeRandomPlant(world, decoRNG, x, y + 2, 10, rotation, sbb); + } + + // planter for trees + placeTreePlanter(world, generator, decoRNG.nextInt(5), 6, y + 1, 12, rotation, sbb); + } + + private void placeTreePlanter(WorldGenLevel world, ChunkGenerator generator, int treeNum, int x, int y, int z, Rotation rotation, BoundingBox sbb) { + setBlockStateRotated(world, deco.pillarState, x + 1, y, z + 1, rotation, sbb); + setBlockStateRotated(world, deco.pillarState, x + 1, y, z - 1, rotation, sbb); + setBlockStateRotated(world, deco.pillarState, x - 1, y, z + 1, rotation, sbb); + setBlockStateRotated(world, deco.pillarState, x - 1, y, z - 1, rotation, sbb); + setBlockStateRotated(world, getStairState(deco.stairState, Direction.WEST, false), x - 1, y, z, rotation, sbb); + setBlockStateRotated(world, getStairState(deco.stairState, Direction.EAST, false), x + 1, y, z, rotation, sbb); + setBlockStateRotated(world, getStairState(deco.stairState, Direction.SOUTH, false), x, y, z + 1, rotation, sbb); + setBlockStateRotated(world, getStairState(deco.stairState, Direction.NORTH, false), x, y, z - 1, rotation, sbb); + + setBlockStateRotated(world, Blocks.DIRT.defaultBlockState(), x, y, z, rotation, sbb); + + int dx = getXWithOffsetRotated(x, z, rotation); + int dy = getWorldY(y + 1); + int dz = getZWithOffsetRotated(x, z, rotation); + if (sbb.isInside(new BlockPos(dx, dy, dz))) { + ResourceKey> treeGen = switch (treeNum) { + case 1 -> + // jungle tree + // made a custom one so it doesnt cut through the floor + TFConfiguredFeatures.SMALLER_JUNGLE_TREE; + case 2 -> + // birch + TreeFeatures.BIRCH; + case 3 -> TFConfiguredFeatures.TWILIGHT_OAK_TREE; + case 4 -> TFConfiguredFeatures.RAINBOW_OAK_TREE; + default -> + // oak tree + TreeFeatures.OAK; + }; + // grow a tree + + for (int i = 0; i < 100; i++) { + if (world.registryAccess().registryOrThrow(Registries.CONFIGURED_FEATURE).get(treeGen).place(world, generator, world.getRandom(), new BlockPos(dx, dy, dz))) { + break; + } + } + } + } + + private void placeRandomPlant(WorldGenLevel world, RandomSource decoRNG, int x, int y, int z, Rotation rotation, BoundingBox sbb) { + BlockState flowerPot = ForgeRegistries.BLOCKS.tags().getTag(BlockTagGenerator.DARK_TOWER_ALLOWED_POTS).getRandomElement(decoRNG).get().defaultBlockState(); + setBlockStateRotated(world, decoRNG.nextInt(10) == 0 ? Blocks.FLOWER_POT.defaultBlockState() : flowerPot, x, y, z, rotation, sbb); + } + + private void makeBottomEntrance(WorldGenLevel world, BoundingBox sbb, Rotation rotation, int y) { + makeFirePit(world, this.deco, 13, y + 1, 3, rotation, sbb); + makeFirePit(world, this.deco, 3, y + 1, 13, rotation, sbb); + makeFirePit(world, this.deco, 13, y + 1, 13, rotation, sbb); + + makePillarFrame(world, sbb, this.deco, rotation, 7, y, 7, 3, 4, 3, false); + } + + /** + * Add a bunch of timber beams + */ + protected void addTimberMaze(WorldGenLevel world, RandomSource rand, BoundingBox sbb, int bottom, int top) { + + int spacing = 5; + Rotation floorside = Rotation.NONE; + if (bottom == 0) { + bottom += spacing; + } + + // fill with beam maze + for (int y = bottom; y < top; y += spacing) { + floorside = floorside.getRotated(Rotation.CLOCKWISE_90); + makeTimberBeams(world, rand, sbb, floorside, y, y == bottom && bottom != spacing, y >= (top - spacing), top); + } + } + + /** + * Make a lattice of log blocks + * + * @param top + */ + protected void makeTimberBeams(WorldGenLevel world, RandomSource rand, BoundingBox sbb, Rotation rotation, int y, boolean isBottom, boolean isTop, int top) { + BlockState beamID = TFBlocks.TWILIGHT_OAK_LOG.get().defaultBlockState(); + BlockState beamStateNS = beamID.setValue(RotatedPillarBlock.AXIS, Direction.Axis.Z); + BlockState beamStateUD = beamID.setValue(RotatedPillarBlock.AXIS, Direction.Axis.Y); + BlockState beamStateEW = beamID.setValue(RotatedPillarBlock.AXIS, Direction.Axis.X); + + // three beams going n/s + for (int z = 1; z < size - 1; z++) { + setBlockStateRotated(world, beamStateNS, 4, y, z, rotation, sbb); + setBlockStateRotated(world, beamStateNS, 9, y, z, rotation, sbb); + setBlockStateRotated(world, beamStateNS, 14, y, z, rotation, sbb); + } + + // a few random cross beams + int z = pickBetweenExcluding(3, size - 3, rand, 4, 9, 14); + for (int x = 5; x < 9; x++) { + setBlockStateRotated(world, beamStateEW, x, y, z, rotation, sbb); + } + + z = pickBetweenExcluding(3, size - 3, rand, 4, 9, 14); + for (int x = 10; x < 14; x++) { + setBlockStateRotated(world, beamStateEW, x, y, z, rotation, sbb); + } + + // beams going down + int x1 = 4; + int z1 = pickFrom(rand, 4, 9, 14); + int x2 = 9; + int z2 = pickFrom(rand, 4, 9, 14); + int x3 = 14; + int z3 = pickFrom(rand, 4, 9, 14); + + for (int by = 1; by < 5; by++) { + if (!isBottom || checkPost(world, x1, y - 5, z1, rotation, sbb)) { + setBlockStateRotated(world, beamStateUD, x1, y - by, z1, rotation, sbb); + setBlockStateRotated(world, Blocks.LADDER.defaultBlockState().setValue(LadderBlock.FACING, Direction.WEST), x1 + 1, y - by, z1, rotation, sbb); + } + if (!isBottom || checkPost(world, x2, y - 5, z2, rotation, sbb)) { + setBlockStateRotated(world, beamStateUD, x2, y - by, z2, rotation, sbb); + } + if (!isBottom || checkPost(world, x3, y - 5, z3, rotation, sbb)) { + setBlockStateRotated(world, beamStateUD, x3, y - by, z3, rotation, sbb); + setBlockStateRotated(world, Blocks.LADDER.defaultBlockState().setValue(LadderBlock.FACING, Direction.EAST), x3 - 1, y - by, z3, rotation, sbb); + } + } + + // do we need a beam going up? + if (isTop) { + Rotation topFloorRotation = RotationUtil.ROTATIONS[(this.boundingBox.minY() + top + 1) % 4]; + + int ladderX = 4; + int ladderZ = 10; + for (int by = 1; by < 5; by++) { + setBlockStateRotated(world, beamStateUD, ladderX, y + by, 9, topFloorRotation, sbb); + setBlockStateRotated(world, Blocks.LADDER.defaultBlockState().setValue(LadderBlock.FACING, Direction.NORTH), ladderX, y + by, ladderZ, topFloorRotation, sbb); + } + + // fence thing + setBlockStateRotated(world, AIR, ladderX, y + 6, 9, topFloorRotation, sbb); + setBlockStateRotated(world, deco.fenceState, ladderX + 1, y + 5, ladderZ, topFloorRotation, sbb); + setBlockStateRotated(world, deco.fenceState, ladderX - 1, y + 5, ladderZ, topFloorRotation, sbb); + setBlockStateRotated(world, deco.fenceState, ladderX + 1, y + 6, ladderZ, topFloorRotation, sbb); + setBlockStateRotated(world, deco.fenceState, ladderX - 1, y + 6, ladderZ, topFloorRotation, sbb); + } + + if (!isBottom && !isTop) { + // spawners + int sx = pickFrom(rand, 6, 7, 11); + int sz = pickFrom(rand, 6, 11, 12); + + makeMiniGhastSpawner(world, y, sx, sz, sbb); + } + + // lamps + int lx = pickFrom(rand, 2, 12, 16); + int lz = 2 + rand.nextInt(15); + + setBlockStateRotated(world, Blocks.REDSTONE_LAMP.defaultBlockState(), lx, y + 2, lz, rotation, sbb); + setBlockStateRotated(world, getLeverState(Blocks.LEVER.defaultBlockState(), AttachFace.CEILING, rand.nextBoolean() ? Direction.EAST : Direction.NORTH, false), lx, y + 1, lz, rotation, sbb); + } + + /** + * Make a mini ghast spawner and then set the spawn range and max entities for that spawner + */ + private void makeMiniGhastSpawner(WorldGenLevel world, int y, int sx, int sz, BoundingBox sbb) { + setSpawner(world, sx, y + 2, sz, sbb, TFEntities.CARMINITE_GHASTLING.get(), spawner -> { + var base = spawner.getSpawner(); + + base.spawnRange = 16; + base.maxNearbyEntities = 2; + base.spawnCount = 1; + }); + } + + /** + * Add a bunch of platforms accessible with the block builder + */ + protected void addBuilderPlatforms(WorldGenLevel world, RandomSource rand, BoundingBox sbb, int bottom, int top) { + + int spacing = 5; + Rotation floorside = Rotation.NONE; + if (bottom == 0) { + bottom += spacing; + } + + // fill platforms, aside from bottom and top platform + for (int y = bottom; y < (top - spacing); y += spacing) { + makeBuilderPlatforms(world, rand, sbb, floorside, y); + floorside = floorside.getRotated(Rotation.CLOCKWISE_90); + floorside = floorside.getRotated(RotationUtil.ROTATIONS[rand.nextInt(3)]); + } + + // add the bottom platforms + makeBuilderPlatform(world, rand, Rotation.CLOCKWISE_90, bottom, 5, true, sbb); + makeBuilderPlatform(world, rand, Rotation.COUNTERCLOCKWISE_90, bottom, 5, true, sbb); + + for (int y = bottom - 4; y < bottom; y++) { + setBlockStateRotated(world, Blocks.LADDER.defaultBlockState().setValue(LadderBlock.FACING, Direction.WEST), 1, y, 5, Rotation.CLOCKWISE_90, sbb); + setBlockStateRotated(world, Blocks.LADDER.defaultBlockState().setValue(LadderBlock.FACING, Direction.WEST), 1, y, 5, Rotation.COUNTERCLOCKWISE_90, sbb); + } + + // top platform + addTopBuilderPlatform(world, rand, top, spacing, sbb); + } + + /** + * Make platform with a block builder + */ + protected void makeBuilderPlatforms(WorldGenLevel world, RandomSource rand, BoundingBox sbb, Rotation rotation, int y) { + int z = size / 2 + rand.nextInt(5) - rand.nextInt(5); + + // bottom platform + makeBuilderPlatform(world, rand, rotation, y, z, false, sbb); + + // ladder + setBlockStateRotated(world, Blocks.LADDER.defaultBlockState().setValue(LadderBlock.FACING, Direction.WEST), 1, y + 1, z, rotation, sbb); + setBlockStateRotated(world, Blocks.LADDER.defaultBlockState().setValue(LadderBlock.FACING, Direction.WEST), 1, y + 2, z, rotation, sbb); + setBlockStateRotated(world, Blocks.LADDER.defaultBlockState().setValue(LadderBlock.FACING, Direction.WEST), 1, y + 3, z, rotation, sbb); + setBlockStateRotated(world, Blocks.LADDER.defaultBlockState().setValue(LadderBlock.FACING, Direction.WEST), 1, y + 4, z, rotation, sbb); + + makeBuilderPlatform(world, rand, rotation, y + 5, z, true, sbb); + + if (y % 2 == 1) { + // reverter blocks + int sx = pickFrom(rand, 5, 9, 13); + int sz = (sx == 9) ? (rand.nextBoolean() ? 5 : 13) : 9; + + final BlockState antibuilder = TFBlocks.ANTIBUILDER.get().defaultBlockState(); + setBlockStateRotated(world, antibuilder, sx, y + 2, sz, rotation, sbb); + } else { + // lamp cluster + int sx = rand.nextBoolean() ? 5 : 13; + int sz = rand.nextBoolean() ? 5 : 13; + + makeLampCluster(world, rand, sx, y, sz, rotation, sbb); + } + } + + /** + * Add the top floating platform in the builder platforms area + */ + private void addTopBuilderPlatform(WorldGenLevel world, RandomSource rand, int top, int spacing, BoundingBox sbb) { + Rotation rotation = RotationUtil.ROTATIONS[(this.boundingBox.minY() + top + 1) % 4]; + + // platform + this.fillBlocksRotated(world, sbb, 5, top - spacing, 9, 7, top - spacing, 11, deco.accentState, rotation); + // ladder ascender + this.fillBlocksRotated(world, sbb, 6, top - spacing, 9, 6, top, 9, deco.accentState, rotation); + this.fillBlocksRotated(world, sbb, 6, top - spacing + 1, 10, 6, top - 1, 10, Blocks.LADDER.defaultBlockState().setValue(LadderBlock.FACING, Direction.NORTH), rotation); + setBlockStateRotated(world, AIR, 6, top + 1, 9, rotation, sbb); + setBlockStateRotated(world, deco.fenceState, 5, top, 10, rotation, sbb); + setBlockStateRotated(world, deco.fenceState, 7, top, 10, rotation, sbb); + setBlockStateRotated(world, deco.fenceState, 5, top + 1, 10, rotation, sbb); + setBlockStateRotated(world, deco.fenceState, 7, top + 1, 10, rotation, sbb); + // builder & lever + final BlockState inactiveBuilder = TFBlocks.CARMINITE_BUILDER.get().defaultBlockState(); + setBlockStateRotated(world, inactiveBuilder, 7, top - spacing, 10, rotation, sbb); + setBlockStateRotated(world, getLeverState(Blocks.LEVER.defaultBlockState(), AttachFace.FLOOR, rand.nextBoolean() ? Direction.EAST : Direction.NORTH, false), 7, top - spacing + 1, 11, rotation, sbb); + } + + private void makeBuilderPlatform(WorldGenLevel world, RandomSource rand, Rotation rotation, int y, int z, boolean hole, BoundingBox sbb) { + // top platform + setBlockStateRotated(world, deco.accentState, 1, y, z - 1, rotation, sbb); + if (!hole) { + setBlockStateRotated(world, deco.accentState, 1, y, z, rotation, sbb); + } + setBlockStateRotated(world, deco.accentState, 1, y, z + 1, rotation, sbb); + setBlockStateRotated(world, deco.accentState, 2, y, z - 1, rotation, sbb); + setBlockStateRotated(world, deco.accentState, 2, y, z, rotation, sbb); + setBlockStateRotated(world, deco.accentState, 2, y, z + 1, rotation, sbb); + + // builder & lever + final BlockState inactiveBuilder = TFBlocks.CARMINITE_BUILDER.get().defaultBlockState(); + setBlockStateRotated(world, inactiveBuilder, 2, y, hole ? z + 1 : z - 1, rotation, sbb); + setBlockStateRotated(world, getLeverState(Blocks.LEVER.defaultBlockState(), AttachFace.FLOOR, rand.nextBoolean() ? Direction.EAST : Direction.NORTH, false), 2, y + 1, z, rotation, sbb); + } + + /** + * Make a cluster of redstone lamps w/ switches as decoration for the empty areas in towers + */ + private void makeLampCluster(WorldGenLevel world, RandomSource rand, int sx, int y, int sz, Rotation rotation, BoundingBox sbb) { + int radius = 4; + + // make lamps + for (int i = 0; i < 5; i++) { + int lx = sx; + int ly = y; + int lz = sz; + + for (int move = 0; move < 10; move++) { + // place lamp + setBlockStateRotated(world, Blocks.REDSTONE_LAMP.defaultBlockState(), lx, ly, lz, rotation, sbb); + + // move randomly + int direction = rand.nextInt(8); + + if (direction > 5) { + direction -= 2; + } + Direction facing = Direction.values()[direction]; + + lx += facing.getStepX(); + ly += facing.getStepY(); + lz += facing.getStepZ(); + + // if we are out of bounds, stop iterating + if (lx > sx + radius || lx < sx - radius || ly > y + radius || ly < y - radius || lz > sz + radius || lz < sz - radius) { + break; + } + } + } + + // make switches + for (int i = 0; i < 5; i++) { + int lx = sx; + int ly = y; + int lz = sz; + + // we need to always call rand.nextInt the same amount of times + Direction[] directions = new Direction[10]; + for (int move = 0; move < 10; move++) { + int direction = rand.nextInt(8); + + if (direction > 5) { + direction -= 2; + } + directions[move] = Direction.values()[direction]; + } + + for (int move = 0; move < 10; move++) { + // move randomly + Direction direction = directions[move]; + + lx += direction.getStepX(); + ly += direction.getStepY(); + lz += direction.getStepZ(); + + // if we are out of bounds, stop iterating + if (lx > sx + radius || lx < sx - radius || ly > y + radius || ly < y - radius || lz > sz + radius || lz < sz - radius) { + break; + } + + // if there is no lamp, place a switch and quit + if (getBlockStateFromPosRotated(world, lx, ly, lz, sbb, rotation).getBlock() != Blocks.REDSTONE_LAMP) { + AttachFace face; + Direction orientation; + switch (direction) { + case NORTH -> { + face = AttachFace.WALL; + orientation = Direction.SOUTH; + } + case SOUTH -> { + face = AttachFace.WALL; + orientation = Direction.NORTH; + } + case EAST -> { + face = AttachFace.WALL; + orientation = Direction.WEST; + } + case WEST -> { + face = AttachFace.WALL; + orientation = Direction.EAST; + } + case UP -> { + face = AttachFace.FLOOR; + orientation = Direction.EAST; + } + default -> { + face = AttachFace.CEILING; + orientation = Direction.NORTH; + } + } + + setBlockStateRotated(world, getLeverState(Blocks.LEVER.defaultBlockState(), face, orientation, false), lx, ly, lz, rotation, sbb); + break; + } + } + } + } +} diff --git a/src/main/java/twilightforest/world/components/structures/darktower/DarkTowerRoofAntennaComponent.java b/src/main/java/twilightforest/world/components/structures/darktower/DarkTowerRoofAntennaComponent.java new file mode 100644 index 0000000000..c4e8d1bd7e --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/darktower/DarkTowerRoofAntennaComponent.java @@ -0,0 +1,52 @@ +package twilightforest.world.components.structures.darktower; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFStructurePieceTypes; +import twilightforest.world.components.structures.lichtower.TowerWingComponent; + +public class DarkTowerRoofAntennaComponent extends DarkTowerRoofComponent { + + public DarkTowerRoofAntennaComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFDTRA.get(), nbt); + } + + public DarkTowerRoofAntennaComponent(int i, TowerWingComponent wing, int x, int y, int z) { + super(TFStructurePieceTypes.TFDTRA.get(), i, wing, x, y, z); + } + + /** + * Stick with a ball on top antenna + */ + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + // antenna + for (int y = 1; y < 10; y++) { + placeBlock(world, deco.accentState, size / 2, y, size / 2, sbb); + } + + placeBlock(world, deco.accentState, size / 2 - 1, 1, size / 2, sbb); + placeBlock(world, deco.accentState, size / 2 + 1, 1, size / 2, sbb); + placeBlock(world, deco.accentState, size / 2, 1, size / 2 - 1, sbb); + placeBlock(world, deco.accentState, size / 2, 1, size / 2 + 1, sbb); + + for (int y = 7; y < 10; y++) { + placeBlock(world, deco.accentState, size / 2 - 1, y, size / 2, sbb); + placeBlock(world, deco.accentState, size / 2 + 1, y, size / 2, sbb); + placeBlock(world, deco.accentState, size / 2, y, size / 2 - 1, sbb); + placeBlock(world, deco.accentState, size / 2, y, size / 2 + 1, sbb); + } + + placeBlock(world, deco.accentState, size / 2 - 1, 8, size / 2 - 1, sbb); + placeBlock(world, deco.accentState, size / 2 - 1, 8, size / 2 + 1, sbb); + placeBlock(world, deco.accentState, size / 2 + 1, 8, size / 2 - 1, sbb); + placeBlock(world, deco.accentState, size / 2 + 1, 8, size / 2 + 1, sbb); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/darktower/DarkTowerRoofCactusComponent.java b/src/main/java/twilightforest/world/components/structures/darktower/DarkTowerRoofCactusComponent.java new file mode 100644 index 0000000000..3032d81da0 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/darktower/DarkTowerRoofCactusComponent.java @@ -0,0 +1,63 @@ +package twilightforest.world.components.structures.darktower; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFStructurePieceTypes; +import twilightforest.world.components.structures.lichtower.TowerWingComponent; + +public class DarkTowerRoofCactusComponent extends DarkTowerRoofComponent { + + public DarkTowerRoofCactusComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFDTRC.get(), nbt); + } + + public DarkTowerRoofCactusComponent(int i, TowerWingComponent wing, int x, int y, int z) { + super(TFStructurePieceTypes.TFDTRC.get(), i, wing, x, y, z); + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + // antenna + for (int y = 1; y < 10; y++) { + placeBlock(world, deco.blockState, size / 2, y, size / 2, sbb); + } + placeBlock(world, deco.accentState, size / 2, 10, size / 2, sbb); + + placeBlock(world, deco.accentState, size / 2 - 1, 1, size / 2, sbb); + placeBlock(world, deco.accentState, size / 2 + 1, 1, size / 2, sbb); + placeBlock(world, deco.accentState, size / 2, 1, size / 2 - 1, sbb); + placeBlock(world, deco.accentState, size / 2, 1, size / 2 + 1, sbb); + + // cactus things + placeBlock(world, deco.accentState, size / 2 + 1, 7, size / 2, sbb); + placeBlock(world, deco.accentState, size / 2 + 2, 7, size / 2, sbb); + placeBlock(world, deco.accentState, size / 2 + 2, 8, size / 2, sbb); + placeBlock(world, deco.accentState, size / 2 + 2, 9, size / 2, sbb); + placeBlock(world, deco.accentState, size / 2 + 3, 9, size / 2, sbb); + + placeBlock(world, deco.accentState, size / 2, 6, size / 2 + 1, sbb); + placeBlock(world, deco.accentState, size / 2, 6, size / 2 + 2, sbb); + placeBlock(world, deco.accentState, size / 2, 7, size / 2 + 2, sbb); + placeBlock(world, deco.accentState, size / 2, 8, size / 2 + 2, sbb); + placeBlock(world, deco.accentState, size / 2, 8, size / 2 + 3, sbb); + + placeBlock(world, deco.accentState, size / 2 - 1, 5, size / 2, sbb); + placeBlock(world, deco.accentState, size / 2 - 2, 5, size / 2, sbb); + placeBlock(world, deco.accentState, size / 2 - 2, 6, size / 2, sbb); + placeBlock(world, deco.accentState, size / 2 - 2, 7, size / 2, sbb); + placeBlock(world, deco.accentState, size / 2 - 3, 7, size / 2, sbb); + + placeBlock(world, deco.accentState, size / 2, 4, size / 2 - 1, sbb); + placeBlock(world, deco.accentState, size / 2, 4, size / 2 - 2, sbb); + placeBlock(world, deco.accentState, size / 2, 5, size / 2 - 2, sbb); + placeBlock(world, deco.accentState, size / 2, 6, size / 2 - 2, sbb); + placeBlock(world, deco.accentState, size / 2, 6, size / 2 - 3, sbb); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/darktower/DarkTowerRoofComponent.java b/src/main/java/twilightforest/world/components/structures/darktower/DarkTowerRoofComponent.java new file mode 100644 index 0000000000..444fa66578 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/darktower/DarkTowerRoofComponent.java @@ -0,0 +1,72 @@ +package twilightforest.world.components.structures.darktower; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; +import twilightforest.init.TFStructurePieceTypes; +import twilightforest.world.components.structures.TFStructureComponentOld; +import twilightforest.world.components.structures.lichtower.TowerRoofComponent; +import twilightforest.world.components.structures.lichtower.TowerWingComponent; + +public class DarkTowerRoofComponent extends TowerRoofComponent { + + public DarkTowerRoofComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + this(TFStructurePieceTypes.TFDTRooS.get(), nbt); + } + + public DarkTowerRoofComponent(StructurePieceType piece, CompoundTag nbt) { + super(piece, nbt); + } + + public DarkTowerRoofComponent(StructurePieceType piece, int i, TowerWingComponent wing, int x, int y, int z) { + super(piece, i, x, y, z); + + // same alignment + this.setOrientation(wing.getOrientation()); + // same size + this.size = wing.size; // assuming only square towers and roofs right now. + this.height = 12; + + // just hang out at the very top of the tower + makeCapBB(wing); + + // spawn list! + this.spawnListIndex = 1; + } + + @Override + public void addChildren(StructurePiece parent, StructurePieceAccessor list, RandomSource rand) { + if (parent != null && parent instanceof TFStructureComponentOld) { + this.deco = ((TFStructureComponentOld) parent).deco; + } + } + + /** + * A fence around the roof! + */ + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + // fence + for (int x = 0; x <= size - 1; x++) { + for (int z = 0; z <= size - 1; z++) { + if (x == 0 || x == size - 1 || z == 0 || z == size - 1) { + placeBlock(world, deco.fenceState, x, 1, z, sbb); + } + } + } + + placeBlock(world, deco.accentState, 0, 1, 0, sbb); + placeBlock(world, deco.accentState, size - 1, 1, 0, sbb); + placeBlock(world, deco.accentState, 0, 1, size - 1, sbb); + placeBlock(world, deco.accentState, size - 1, 1, size - 1, sbb); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/darktower/DarkTowerRoofFourPostComponent.java b/src/main/java/twilightforest/world/components/structures/darktower/DarkTowerRoofFourPostComponent.java new file mode 100644 index 0000000000..fba979ea78 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/darktower/DarkTowerRoofFourPostComponent.java @@ -0,0 +1,48 @@ +package twilightforest.world.components.structures.darktower; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFStructurePieceTypes; +import twilightforest.world.components.structures.lichtower.TowerWingComponent; + +public class DarkTowerRoofFourPostComponent extends DarkTowerRoofComponent { + + public DarkTowerRoofFourPostComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFDTRFP.get(), nbt); + } + + public DarkTowerRoofFourPostComponent(int i, TowerWingComponent wing, int x, int y, int z) { + super(TFStructurePieceTypes.TFDTRFP.get(), i, wing, x, y, z); + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + super.postProcess(world, manager, generator, rand, sbb, chunkPosIn, blockPos); + + makeSmallAntenna(world, sbb, 4, size - 2, size - 2); + makeSmallAntenna(world, sbb, 5, 1, size - 2); + makeSmallAntenna(world, sbb, 6, size - 2, 1); + makeSmallAntenna(world, sbb, 7, 1, 1); + } + + private void makeSmallAntenna(WorldGenLevel world, BoundingBox sbb, int height, int x, int z) { + // antenna + for (int y = 1; y < height; y++) { + placeBlock(world, deco.blockState, x, y, z, sbb); + } + placeBlock(world, deco.accentState, x, height, z, sbb); + placeBlock(world, deco.accentState, x, height + 1, z, sbb); + placeBlock(world, deco.accentState, x + 1, height + 1, z, sbb); + placeBlock(world, deco.accentState, x - 1, height + 1, z, sbb); + placeBlock(world, deco.accentState, x, height + 1, z + 1, sbb); + placeBlock(world, deco.accentState, x, height + 1, z - 1, sbb); + placeBlock(world, deco.accentState, x, height + 2, z, sbb); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/darktower/DarkTowerRoofRingsComponent.java b/src/main/java/twilightforest/world/components/structures/darktower/DarkTowerRoofRingsComponent.java new file mode 100644 index 0000000000..db842247db --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/darktower/DarkTowerRoofRingsComponent.java @@ -0,0 +1,59 @@ +package twilightforest.world.components.structures.darktower; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFStructurePieceTypes; +import twilightforest.world.components.structures.lichtower.TowerWingComponent; + +public class DarkTowerRoofRingsComponent extends DarkTowerRoofComponent { + + public DarkTowerRoofRingsComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFDTRR.get(), nbt); + } + + public DarkTowerRoofRingsComponent(int i, TowerWingComponent wing, int x, int y, int z) { + super(TFStructurePieceTypes.TFDTRR.get(), i, wing, x, y, z); + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + super.postProcess(world, manager, generator, rand, sbb, chunkPosIn, blockPos); + + // antenna + for (int y = 1; y < 10; y++) { + placeBlock(world, deco.blockState, size / 2, y, size / 2, sbb); + } + + placeBlock(world, deco.accentState, size / 2, 10, size / 2, sbb); + + placeBlock(world, deco.accentState, size / 2 - 1, 1, size / 2, sbb); + placeBlock(world, deco.accentState, size / 2 + 1, 1, size / 2, sbb); + placeBlock(world, deco.accentState, size / 2, 1, size / 2 - 1, sbb); + placeBlock(world, deco.accentState, size / 2, 1, size / 2 + 1, sbb); + + makeARing(world, 6, sbb); + makeARing(world, 8, sbb); + } + + protected void makeARing(WorldGenLevel world, int y, BoundingBox sbb) { + placeBlock(world, deco.accentState, size / 2 - 2, y, size / 2 + 1, sbb); + placeBlock(world, deco.accentState, size / 2 - 2, y, size / 2, sbb); + placeBlock(world, deco.accentState, size / 2 - 2, y, size / 2 - 1, sbb); + placeBlock(world, deco.accentState, size / 2 + 2, y, size / 2 + 1, sbb); + placeBlock(world, deco.accentState, size / 2 + 2, y, size / 2, sbb); + placeBlock(world, deco.accentState, size / 2 + 2, y, size / 2 - 1, sbb); + placeBlock(world, deco.accentState, size / 2 + 1, y, size / 2 - 2, sbb); + placeBlock(world, deco.accentState, size / 2, y, size / 2 - 2, sbb); + placeBlock(world, deco.accentState, size / 2 - 1, y, size / 2 - 2, sbb); + placeBlock(world, deco.accentState, size / 2 + 1, y, size / 2 + 2, sbb); + placeBlock(world, deco.accentState, size / 2, y, size / 2 + 2, sbb); + placeBlock(world, deco.accentState, size / 2 - 1, y, size / 2 + 2, sbb); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/darktower/DarkTowerWingComponent.java b/src/main/java/twilightforest/world/components/structures/darktower/DarkTowerWingComponent.java new file mode 100644 index 0000000000..0a1f4cf90f --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/darktower/DarkTowerWingComponent.java @@ -0,0 +1,1071 @@ +package twilightforest.world.components.structures.darktower; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.*; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.AttachFace; +import net.minecraft.world.level.block.state.properties.Half; +import net.minecraft.world.level.block.state.properties.SlabType; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFEntities; +import twilightforest.init.TFStructurePieceTypes; +import twilightforest.loot.TFLootTables; +import twilightforest.util.RotationUtil; +import twilightforest.world.components.structures.TFStructureComponentOld; +import twilightforest.world.components.structures.TFStructureDecorator; +import twilightforest.world.components.structures.lichtower.*; + +import java.util.ArrayList; + +public class DarkTowerWingComponent extends TowerWingComponent { + protected boolean keyTower = false; + protected ArrayList openingTypes = new ArrayList<>(); + + public DarkTowerWingComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + this(TFStructurePieceTypes.TFDTWin.get(), nbt); + } + + public DarkTowerWingComponent(StructurePieceType piece, CompoundTag nbt) { + super(piece, nbt); + this.keyTower = nbt.getBoolean("keyTower"); + + this.readDoorsTypesFromArray(nbt.getIntArray("doorTypeInts")); + } + + protected DarkTowerWingComponent(StructurePieceType piece, int i, int x, int y, int z, int pSize, int pHeight, Direction direction) { + super(piece, i, x, y, z, pSize, pHeight, direction); + } + + /** + * Turn the openings array into an array of ints. + */ + private int[] getDoorsTypesAsIntArray() { + int[] ret = new int[this.openingTypes.size()]; + + int idx = 0; + + for (EnumDarkTowerDoor doorType : openingTypes) { + ret[idx++] = doorType.ordinal(); + } + + return ret; + } + + @Override + protected void addAdditionalSaveData(StructurePieceSerializationContext ctx, CompoundTag tagCompound) { + super.addAdditionalSaveData(ctx, tagCompound); + + tagCompound.putBoolean("keyTower", this.keyTower); + + tagCompound.putIntArray("doorTypeInts", this.getDoorsTypesAsIntArray()); + } + + /** + * Read in opening types from int array + */ + private void readDoorsTypesFromArray(int[] intArray) { + for (int typeInt : intArray) { + this.openingTypes.add(EnumDarkTowerDoor.values()[typeInt]); + } + } + + @Override + public void addChildren(StructurePiece parent, StructurePieceAccessor list, RandomSource rand) { + if (parent != null && parent instanceof TFStructureComponentOld) { + this.deco = ((TFStructureComponentOld) parent).deco; + } + + // we should have a door where we started + addOpening(0, 1, size / 2, Rotation.CLOCKWISE_180); + + // add a roof? + makeARoof(parent, list, rand); + + // add a beard + makeABeard(parent, list, rand); + + if (size > 10) { + // sub towers + for (Rotation direction : RotationUtil.ROTATIONS) { + int[] dest = getValidOpening(rand, direction); + int childHeight = validateChildHeight(height - 4 + rand.nextInt(10) - rand.nextInt(10)); + + boolean madeWing = makeTowerWing(list, rand, this.getGenDepth(), dest[0], dest[1], dest[2], size - 2, childHeight, direction); + + // occasional balcony + if (!madeWing && (direction == Rotation.CLOCKWISE_180 || rand.nextBoolean())) { + makeTowerBalcony(list, rand, this.getGenDepth(), dest[0], dest[1], dest[2], direction); + } + } + } else if (rand.nextInt(4) == 0) { + // occasional balcony on small towers too + Rotation direction = RotationUtil.ROTATIONS[rand.nextInt(4)]; + int[] dest = getValidOpening(rand, direction); + makeTowerBalcony(list, rand, this.getGenDepth(), dest[0], dest[1], dest[2], direction); + } + } + + protected int validateChildHeight(int childHeight) { + return (childHeight / 4) * 4 + 1; + } + + /** + * Attach a roof to this tower. + */ + @Override + public void makeARoof(StructurePiece parent, StructurePieceAccessor list, RandomSource rand) { + int index = this.getGenDepth(); + + TowerRoofComponent roof = switch (rand.nextInt(5)) { + case 2 -> new DarkTowerRoofCactusComponent(index, this, getLocatorPosition().getX(), getLocatorPosition().getY(), getLocatorPosition().getZ()); + case 3 -> new DarkTowerRoofRingsComponent(index, this, getLocatorPosition().getX(), getLocatorPosition().getY(), getLocatorPosition().getZ()); + case 4 -> new DarkTowerRoofFourPostComponent(index, this, getLocatorPosition().getX(), getLocatorPosition().getY(), getLocatorPosition().getZ()); + default -> new DarkTowerRoofAntennaComponent(index, this, getLocatorPosition().getX(), getLocatorPosition().getY(), getLocatorPosition().getZ()); + }; + + list.addPiece(roof); + roof.addChildren(this, list, rand); + roofType = roof.getClass(); + } + + @Override + protected void makeAttachedRoof(StructurePieceAccessor list, RandomSource rand) { + int index = this.getGenDepth(); + TowerRoofComponent roof; + + // this is our preferred roof type: + if (roofType == null && rand.nextInt(32) != 0) { + tryToFitRoof(list, rand, new TowerRoofGableForwardsComponent(index + 1, this, getLocatorPosition().getX(), getLocatorPosition().getY(), getLocatorPosition().getZ())); + } + + // this is for roofs that don't fit. + if (roofType == null && rand.nextInt(8) != 0) { + tryToFitRoof(list, rand, new TowerRoofSlabForwardsComponent(index + 1, this, getLocatorPosition().getX(), getLocatorPosition().getY(), getLocatorPosition().getZ())); + } + + // finally, if we're cramped for space, try this + if (roofType == null && rand.nextInt(32) != 0) { + // fall through to this next roof + roof = new TowerRoofAttachedSlabComponent(index + 1, this, getLocatorPosition().getX(), getLocatorPosition().getY(), getLocatorPosition().getZ()); + tryToFitRoof(list, rand, roof); + } + + // last resort + if (roofType == null) { + // fall through to this next roof + roof = new TowerRoofFenceComponent(index + 1, this, getLocatorPosition().getX(), getLocatorPosition().getY(), getLocatorPosition().getZ()); + tryToFitRoof(list, rand, roof); + } + } + + /** + * Add a beard to this structure. There is only one type of beard. + */ + @Override + public void makeABeard(StructurePiece parent, StructurePieceAccessor list, RandomSource rand) { + DarkTowerBeardComponent beard = new DarkTowerBeardComponent(this.getGenDepth() + 1, this, getLocatorPosition().getX(), getLocatorPosition().getY(), getLocatorPosition().getZ()); + list.addPiece(beard); + beard.addChildren(this, list, rand); + } + + /** + * Make another wing just like this one + */ + @Override + public boolean makeTowerWing(StructurePieceAccessor list, RandomSource rand, int index, int x, int y, int z, int wingSize, int wingHeight, Rotation rotation) { + // kill too-small towers + if (wingHeight < 8) { + return false; + } + + Direction direction = getStructureRelativeRotation(rotation); + int[] dx = offsetTowerCoords(x, y, z, 5, direction); + + if (dx[1] + wingHeight > 250) { + // end of the world! + return false; + } + + DarkTowerBridgeComponent bridge = new DarkTowerBridgeComponent(TFStructurePieceTypes.TFDTBri.get(), index, dx[0], dx[1], dx[2], wingSize, wingHeight, direction); + // check to see if it intersects something already there + StructurePiece intersect = list.findCollisionPiece(bridge.getBoundingBox()); + if (intersect == null || intersect == this) { + intersect = list.findCollisionPiece(bridge.getWingBB()); + } else { + return false; + } + if (intersect == null || intersect == this) { + list.addPiece(bridge); + bridge.addChildren(this, list, rand); + addOpening(x, y, z, rotation); + return true; + } else { + return false; + } + } + + protected boolean makeTowerBalcony(StructurePieceAccessor list, RandomSource rand, int index, int x, int y, int z, Rotation rotation) { + Direction direction = getStructureRelativeRotation(rotation); + int[] dx = offsetTowerCoords(x, y, z, 5, direction); + + DarkTowerBalconyComponent balcony = new DarkTowerBalconyComponent(index, dx[0], dx[1], dx[2], direction); + // check to see if it intersects something already there + StructurePiece intersect = list.findCollisionPiece(balcony.getBoundingBox()); + if (intersect == null || intersect == this) { + list.addPiece(balcony); + balcony.addChildren(this, list, rand); + addOpening(x, y, z, rotation, EnumDarkTowerDoor.REAPPEARING); + return true; + } else { + return false; + } + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + RandomSource decoRNG = RandomSource.create(world.getSeed() + (this.boundingBox.minX() * 321534781L) ^ (this.boundingBox.minZ() * 756839L)); + + // make walls + makeEncasedWalls(world, rand, sbb, 0, 0, 0, size - 1, height - 1, size - 1); + + // clear inside + generateAirBox(world, sbb, 1, 1, 1, size - 2, height - 2, size - 2); + + // sky light +// nullifySkyLightForBoundingBox(world); + + if (this.size > 9) { + // half floors, always starting at y = 4 + addHalfFloors(world, decoRNG, sbb, 4, height - 1); + } else { + if (decoRNG.nextInt(3) == 0) { + addSmallTimberBeams(world, decoRNG, sbb, 4, height - 1); + } else { + addHalfFloors(world, decoRNG, sbb, 4, height - 1); + } + } + + // openings + makeOpenings(world, sbb); + + // destroy some towers + if (decoRNG.nextBoolean() && !this.isKeyTower() && this.height > 8) { + int blobs = 1; + + if (this.size > 9 && decoRNG.nextBoolean()) { + blobs++; + } + + for (int i = 0; i < blobs; i++) { + + // find a random spot in the tower + int x = decoRNG.nextInt(size); + int y = decoRNG.nextInt(height - 7) + 2; + int z = decoRNG.nextInt(size); + + destroyTower(world, decoRNG, x, y, z, 3, sbb); + } + } + } + + /** + * Add a destruction burst + */ + protected void destroyTower(WorldGenLevel world, RandomSource decoRNG, int x, int y, int z, int amount, BoundingBox sbb) { + //makeNetherburst(world, decoRNG, 16, 100, 40, x, y, z, 0, sbb); + + int initialRadius = decoRNG.nextInt(amount) + amount; + + drawBlob(world, x, y, z, initialRadius, AIR, sbb); + + for (int i = 0; i < 3; i++) { + int dx = x + (initialRadius - 1) * (decoRNG.nextBoolean() ? 1 : -1); + int dy = y + (initialRadius - 1) * (decoRNG.nextBoolean() ? 1 : -1); + int dz = z + (initialRadius - 1) * (decoRNG.nextBoolean() ? 1 : -1); + + netherTransformBlob(world, decoRNG, dx, dy, dz, initialRadius - 1, sbb); + drawBlob(world, dx, dy, dz, initialRadius - 2, AIR, sbb); + } + } + + private void netherTransformBlob(WorldGenLevel world, RandomSource inRand, int sx, int sy, int sz, int rad, BoundingBox sbb) { + + RandomSource rand = RandomSource.create(inRand.nextLong()); + + // then trace out a quadrant + for (byte dx = 0; dx <= rad; dx++) { + for (byte dy = 0; dy <= rad; dy++) { + for (byte dz = 0; dz <= rad; dz++) { + // determine how far we are from the center. + byte dist; + if (dx >= dy && dx >= dz) { + dist = (byte) (dx + (byte) ((Math.max(dy, dz) * 0.5) + (Math.min(dy, dz) * 0.25))); + } else if (dy >= dx && dy >= dz) { + dist = (byte) (dy + (byte) ((Math.max(dx, dz) * 0.5) + (Math.min(dx, dz) * 0.25))); + } else { + dist = (byte) (dz + (byte) ((Math.max(dx, dy) * 0.5) + (Math.min(dx, dy) * 0.25))); + } + + // if we're inside the blob, fill it + if (dist <= rad) { + // do eight at a time for easiness! + testAndChangeToNetherrack(world, rand, sx + dx, sy + dy, sz + dz, sbb); + testAndChangeToNetherrack(world, rand, sx + dx, sy + dy, sz + dz, sbb); + testAndChangeToNetherrack(world, rand, sx + dx, sy + dy, sz - dz, sbb); + testAndChangeToNetherrack(world, rand, sx - dx, sy + dy, sz + dz, sbb); + testAndChangeToNetherrack(world, rand, sx - dx, sy + dy, sz - dz, sbb); + testAndChangeToNetherrack(world, rand, sx + dx, sy - dy, sz + dz, sbb); + testAndChangeToNetherrack(world, rand, sx + dx, sy - dy, sz - dz, sbb); + testAndChangeToNetherrack(world, rand, sx - dx, sy - dy, sz + dz, sbb); + testAndChangeToNetherrack(world, rand, sx - dx, sy - dy, sz - dz, sbb); + } + } + } + } + } + + private void testAndChangeToNetherrack(WorldGenLevel world, RandomSource rand, int x, int y, int z, BoundingBox sbb) { + if (this.getBlock(world, x, y, z, sbb).getBlock() != Blocks.AIR) { + this.placeBlock(world, Blocks.NETHERRACK.defaultBlockState(), x, y, z, sbb); + + if (this.getBlock(world, x, y + 1, z, sbb).getBlock() == Blocks.AIR && rand.nextBoolean()) { + this.placeBlock(world, Blocks.FIRE.defaultBlockState(), x, y + 1, z, sbb); + } + } + } + + /** + * Draw a giant blob of whatevs (okay, it's going to be leaves). + */ + private void drawBlob(WorldGenLevel world, int sx, int sy, int sz, int rad, BlockState state, BoundingBox sbb) { + // then trace out a quadrant + for (byte dx = 0; dx <= rad; dx++) { + for (byte dy = 0; dy <= rad; dy++) { + for (byte dz = 0; dz <= rad; dz++) { + // determine how far we are from the center. + byte dist; + if (dx >= dy && dx >= dz) { + dist = (byte) (dx + (byte) ((Math.max(dy, dz) * 0.5) + (Math.min(dy, dz) * 0.25))); + } else if (dy >= dx && dy >= dz) { + dist = (byte) (dy + (byte) ((Math.max(dx, dz) * 0.5) + (Math.min(dx, dz) * 0.25))); + } else { + dist = (byte) (dz + (byte) ((Math.max(dx, dy) * 0.5) + (Math.min(dx, dy) * 0.25))); + } + + // if we're inside the blob, fill it + if (dist <= rad) { + // do eight at a time for easiness! + this.placeBlock(world, state, sx + dx, sy + dy, sz + dz, sbb); + this.placeBlock(world, state, sx + dx, sy + dy, sz - dz, sbb); + this.placeBlock(world, state, sx - dx, sy + dy, sz + dz, sbb); + this.placeBlock(world, state, sx - dx, sy + dy, sz - dz, sbb); + this.placeBlock(world, state, sx + dx, sy - dy, sz + dz, sbb); + this.placeBlock(world, state, sx + dx, sy - dy, sz - dz, sbb); + this.placeBlock(world, state, sx - dx, sy - dy, sz + dz, sbb); + this.placeBlock(world, state, sx - dx, sy - dy, sz - dz, sbb); + } + } + } + } + } + + /** + * Add a bunch of random half floors + */ + @SuppressWarnings("fallthrough") + private void addHalfFloors(WorldGenLevel world, RandomSource rand, BoundingBox sbb, int bottom, int top) { + + int spacing = 4;//this.size > 9 ? 4 : 3; + Rotation rotation = RotationUtil.ROTATIONS[(this.boundingBox.minY() + bottom) % 3]; + + if (bottom == 0) { + bottom += spacing; + } + + // fill with half floors + for (int y = bottom; y < top; y += spacing) { + rotation = rotation.getRotated(Rotation.CLOCKWISE_180); + + if (y >= top - spacing) { + makeFullFloor(world, sbb, y); + if (isDeadEnd()) { + decorateTreasureRoom(world, sbb, rotation, y, 4, this.deco); + } + } else { + makeHalfFloor(world, sbb, rotation, y); + + // decorate + // FIXME: Case 1 gets double weight when size >= 11 + switch (rand.nextInt(8)) { + case 0: + if (this.size < 11) { + decorateReappearingFloor(world, sbb, rotation, y); + break; + } + case 1: + decorateSpawner(world, rand, sbb, rotation, y); + break; + case 2: + decorateLounge(world, sbb, rotation, y); + break; + case 3: + decorateLibrary(world, sbb, rotation, y); + break; + case 4: + decorateExperimentPulser(world, sbb, rotation, y); + break; + case 5: + decorateExperimentLamp(world, sbb, rotation, y); + break; + case 6: + decoratePuzzleChest(world, sbb, rotation, y); + break; + } + } + + addStairsDown(world, sbb, rotation, y, size - 2, spacing); + if (this.size > 9) { + // double wide staircase + addStairsDown(world, sbb, rotation, y, size - 3, spacing); + } + } + + rotation = rotation.getRotated(Rotation.CLOCKWISE_180); + + // stairs to roof + addStairsDown(world, sbb, rotation, this.height - 1, size - 2, spacing); + } + + /** + * Dark tower half floors + */ + protected void makeHalfFloor(WorldGenLevel world, BoundingBox sbb, Rotation rotation, int y) { + this.fillBlocksRotated(world, sbb, size / 2, y, 1, size - 2, y, size - 2, deco.blockState, rotation); + this.fillBlocksRotated(world, sbb, size / 2 - 1, y, 1, size / 2 - 1, y, size - 2, deco.accentState, rotation); + } + + /** + * Dark tower full floors + */ + protected void makeFullFloor(WorldGenLevel world, BoundingBox sbb, int y) { + // half floor + this.generateBox(world, sbb, 1, y, 1, size - 2, y, size - 2, deco.blockState, Blocks.AIR.defaultBlockState(), false); + this.generateBox(world, sbb, size / 2, y, 1, size / 2, y, size - 2, deco.accentState, Blocks.AIR.defaultBlockState(), true); + } + + /** + * Dark tower treasure rooms! + * + * @param myDeco + */ + protected void decorateTreasureRoom(WorldGenLevel world, BoundingBox sbb, Rotation rotation, int y, int spacing, TFStructureDecorator myDeco) { + //treasure chest! + int x = this.size / 2; + int z = this.size / 2; + + this.makePillarFrame(world, sbb, this.deco, rotation, x - 1, y, z - 1, true); + + setBlockStateRotated(world, myDeco.platformState, x, y + 1, z, rotation, sbb); + + placeTreasureAtCurrentPosition(world, x, y + 2, z, this.isKeyTower() ? TFLootTables.DARKTOWER_KEY : TFLootTables.DARKTOWER_CACHE, sbb); + } + + private void decorateSpawner(WorldGenLevel world, RandomSource rand, BoundingBox sbb, Rotation rotation, int y) { + int x = this.size > 9 ? 4 : 3; + int z = this.size > 9 ? 5 : 4; + + EntityType mobID; + + if (this.size > 9) { + mobID = rand.nextBoolean() ? TFEntities.CARMINITE_GOLEM.get() : TFEntities.CARMINITE_BROODLING.get(); + } else { + mobID = TFEntities.CARMINITE_BROODLING.get(); + } + + // pillar frame + this.makePillarFrame(world, sbb, this.deco, rotation, x, y, z, true); + this.setSpawnerRotated(world, x + 1, y + 2, z + 1, rotation, mobID, sbb); + } + + /** + * A lounge with a couch and table + */ + private void decorateLounge(WorldGenLevel world, BoundingBox sbb, Rotation rotation, int y) { + int cx = this.size > 9 ? 9 : 7; + int cz = this.size > 9 ? 4 : 3; + + setBlockStateRotated(world, getStairState(deco.stairState, Direction.SOUTH, false), cx, y + 1, cz, rotation, sbb); + setBlockStateRotated(world, getStairState(deco.stairState, Direction.WEST, false), cx, y + 1, cz + 1, rotation, sbb); + setBlockStateRotated(world, getStairState(deco.stairState, Direction.NORTH, false), cx, y + 1, cz + 2, rotation, sbb); + + cx = this.size > 9 ? 5 : 3; + + setBlockStateRotated(world, getStairState(deco.stairState, Direction.SOUTH, true), cx, y + 1, cz, rotation, sbb); + setBlockStateRotated(world, getSlabState(Blocks.SPRUCE_SLAB.defaultBlockState(), SlabType.TOP), cx, y + 1, cz + 1, rotation, sbb); + setBlockStateRotated(world, getStairState(deco.stairState, Direction.NORTH, true), cx, y + 1, cz + 2, rotation, sbb); + } + + /** + * Decorate with a pressure plate triggered reappearing floor. Only suitable for small towers + */ + private void decorateReappearingFloor(WorldGenLevel world, BoundingBox sbb, Rotation rotation, int y) { + final BlockState inactiveReappearing = TFBlocks.REAPPEARING_BLOCK.get().defaultBlockState(); + final BlockState woodenPressurePlate = Blocks.OAK_PRESSURE_PLATE.defaultBlockState(); + // floor + this.fillBlocksRotated(world, sbb, 4, y, 3, 7, y, 5, inactiveReappearing, rotation); + // plates + this.fillBlocksRotated(world, sbb, 4, y + 1, 2, 7, y + 1, 2, woodenPressurePlate, rotation); + this.fillBlocksRotated(world, sbb, 4, y + 1, 6, 7, y + 1, 6, woodenPressurePlate, rotation); + } + + /** + * Decorate with a redstone device that turns a lamp on or off + */ + private void decorateExperimentLamp(WorldGenLevel world, BoundingBox sbb, Rotation rotation, int y) { + + int cx = this.size > 9 ? 5 : 3; + int cz = this.size > 9 ? 5 : 4; + + final BlockState redstoneLamp = Blocks.REDSTONE_LAMP.defaultBlockState(); + + setBlockStateRotated(world, Blocks.STICKY_PISTON.defaultBlockState().setValue(DirectionalBlock.FACING, Direction.UP), cx, y + 1, cz, rotation, sbb); + setBlockStateRotated(world, redstoneLamp, cx, y + 2, cz, rotation, sbb); + setBlockStateRotated(world, deco.accentState, cx, y + 1, cz + 1, rotation, sbb); + setBlockStateRotated(world, getLeverState(Blocks.LEVER.defaultBlockState(), AttachFace.WALL, Direction.NORTH, false), cx, y + 1, cz + 2, rotation, sbb); + setBlockStateRotated(world, deco.accentState, cx, y + 3, cz - 1, rotation, sbb); + setBlockStateRotated(world, getLeverState(Blocks.LEVER.defaultBlockState(), AttachFace.WALL, Direction.SOUTH, true), cx, y + 3, cz - 2, rotation, sbb); + } + + protected static BlockState getLeverState(BlockState initialState, AttachFace face, Direction direction, boolean isPowered) { + switch (direction) { + case NORTH: + case SOUTH: + case EAST: + case WEST: + //All Horizontal facings are as they should + break; + case UP: + case DOWN: + default: + //Levers cannot face Up or Down, as it is a Horizontal Face + direction = Direction.NORTH; + } + return initialState.setValue(HorizontalDirectionalBlock.FACING, direction) + .setValue(FaceAttachedHorizontalDirectionalBlock.FACE, face) + .setValue(LeverBlock.POWERED, isPowered); + } + + /** + * Decorate with a redstone device that pulses a block back and forth + */ + private void decorateExperimentPulser(WorldGenLevel world, BoundingBox sbb, Rotation rotation, int y) { + + int cx = this.size > 9 ? 6 : 5; + int cz = this.size > 9 ? 4 : 3; + + BlockState redstoneWire = Blocks.REDSTONE_WIRE.defaultBlockState(); + BlockState woodenPressurePlate = Blocks.OAK_PRESSURE_PLATE.defaultBlockState(); + BlockState stickyPiston = Blocks.STICKY_PISTON.defaultBlockState().setValue(DirectionalBlock.FACING, Direction.SOUTH); + BlockState unpoweredRepeater = Blocks.REPEATER.defaultBlockState().setValue(DiodeBlock.POWERED, false).setValue(HorizontalDirectionalBlock.FACING, Direction.WEST).setValue(RepeaterBlock.DELAY, 2); + + setBlockStateRotated(world, stickyPiston, cx, y + 1, cz + 1, rotation, sbb); + setBlockStateRotated(world, deco.accentState, cx, y + 1, cz, rotation, sbb); + setBlockStateRotated(world, redstoneWire, cx + 1, y + 1, cz, rotation, sbb); + setBlockStateRotated(world, woodenPressurePlate, cx + 2, y + 1, cz, rotation, sbb); + setBlockStateRotated(world, unpoweredRepeater, cx - 1, y + 1, cz, rotation, sbb); + setBlockStateRotated(world, redstoneWire, cx - 2, y + 1, cz, rotation, sbb); + setBlockStateRotated(world, redstoneWire, cx - 2, y + 1, cz + 1, rotation, sbb); + setBlockStateRotated(world, redstoneWire, cx - 1, y + 1, cz + 1, rotation, sbb); + } + + /** + * Decorate with some bookshelves + */ + private void decorateLibrary(WorldGenLevel world, BoundingBox sbb, Rotation rotation, int y) { + int bx = this.size > 9 ? 4 : 3; + int bz = this.size > 9 ? 3 : 2; + + makeSmallBookshelf(world, sbb, rotation, y, bx, bz); + + bx = this.size > 9 ? 9 : 7; + bz = this.size > 9 ? 3 : 2; + makeSmallBookshelf(world, sbb, rotation, y, bx, bz); + } + + protected void makeSmallBookshelf(WorldGenLevel world, BoundingBox sbb, Rotation rotation, int y, int bx, int bz) { + setBlockStateRotated(world, getStairState(deco.stairState, Direction.NORTH, false), bx, y + 1, bz, rotation, sbb); + setBlockStateRotated(world, getStairState(deco.stairState, Direction.NORTH, true), bx, y + 2, bz, rotation, sbb); + setBlockStateRotated(world, getStairState(deco.stairState, Direction.SOUTH, false), bx, y + 1, bz + 3, rotation, sbb); + setBlockStateRotated(world, getStairState(deco.stairState, Direction.SOUTH, true), bx, y + 2, bz + 3, rotation, sbb); + final BlockState bookshelf = Blocks.BOOKSHELF.defaultBlockState(); + setBlockStateRotated(world, bookshelf, bx, y + 1, bz + 1, rotation, sbb); + setBlockStateRotated(world, bookshelf, bx, y + 2, bz + 1, rotation, sbb); + setBlockStateRotated(world, bookshelf, bx, y + 1, bz + 2, rotation, sbb); + setBlockStateRotated(world, bookshelf, bx, y + 2, bz + 2, rotation, sbb); + } + + /** + * A chest with an extremely simple puzzle + */ + private void decoratePuzzleChest(WorldGenLevel world, BoundingBox sbb, Rotation rotation, int y) { + int x = this.size > 9 ? 4 : 3; + int z = this.size > 9 ? 5 : 4; + // pillar frameframe + this.makePillarFrame(world, sbb, this.deco, rotation, x, y, z, true); + + // reinforce with towerwood + setBlockStateRotated(world, deco.platformState, x + 1, y + 1, z + 1, rotation, sbb); + setBlockStateRotated(world, deco.blockState, x + 2, y + 1, z + 1, rotation, sbb); + setBlockStateRotated(world, deco.blockState, x, y + 1, z + 1, rotation, sbb); + setBlockStateRotated(world, deco.blockState, x + 1, y + 1, z + 2, rotation, sbb); + setBlockStateRotated(world, deco.blockState, x + 1, y + 1, z, rotation, sbb); + + setBlockStateRotated(world, deco.blockState, x + 2, y + 3, z + 1, rotation, sbb); + setBlockStateRotated(world, deco.blockState, x, y + 3, z + 1, rotation, sbb); + setBlockStateRotated(world, deco.blockState, x + 1, y + 3, z + 2, rotation, sbb); + setBlockStateRotated(world, AIR, x + 1, y + 3, z, rotation, sbb); + setBlockStateRotated(world, deco.blockState, x + 1, y + 3, z + 1, rotation, sbb); + setBlockStateRotated(world, Blocks.STICKY_PISTON.defaultBlockState().setValue(DirectionalBlock.FACING, Direction.NORTH), x + 1, y + 3, z - 1, rotation, sbb); + setBlockStateRotated(world, deco.accentState, x + 1, y + 3, z - 2, rotation, sbb); + setBlockStateRotated(world, getLeverState(Blocks.LEVER.defaultBlockState(), AttachFace.WALL, Direction.WEST, false), x + 2, y + 3, z - 2, rotation, sbb); + + placeTreasureRotated(world, x + 1, y + 2, z + 1, getOrientation(), rotation, TFLootTables.DARKTOWER_CACHE, sbb); + } + + /** + * Make a 3x3x3 pillar frame + */ + protected void makePillarFrame(WorldGenLevel world, BoundingBox sbb, TFStructureDecorator myDeco, Rotation rotation, int x, int y, int z, boolean fenced) { + makePillarFrame(world, sbb, myDeco, rotation, x, y, z, 3, 3, 3, fenced); + } + + /** + * Place one of the architectural features that I frequently overuse in my structures + */ + protected void makePillarFrame(WorldGenLevel world, BoundingBox sbb, TFStructureDecorator myDeco, Rotation rotation, int x, int y, int z, int width, int height, int length, boolean fenced) { + // fill in posts + for (int dx = 0; dx < width; dx++) { + for (int dz = 0; dz < length; dz++) { + if ((dx % 3 == 0 || dx == width - 1) && (dz % 3 == 0 || dz == length - 1)) { + for (int py = 1; py <= height; py++) { + setBlockStateRotated(world, myDeco.pillarState, x + dx, y + py, z + dz, rotation, sbb); + } + } else { + if (dx == 0) { + final BlockState southStairs = getStairState(deco.stairState, Direction.WEST, false); + setBlockStateRotated(world, southStairs, x + dx, y + 1, z + dz, rotation, sbb); + setBlockStateRotated(world, southStairs.setValue(StairBlock.HALF, Half.TOP), x + dx, y + height, z + dz, rotation, sbb); + } else if (dx == width - 1) { + final BlockState northStairs = getStairState(deco.stairState, Direction.EAST, false); + setBlockStateRotated(world, northStairs, x + dx, y + 1, z + dz, rotation, sbb); + setBlockStateRotated(world, northStairs.setValue(StairBlock.HALF, Half.TOP), x + dx, y + height, z + dz, rotation, sbb); + } else if (dz == 0) { + final BlockState westStairs = getStairState(deco.stairState, Direction.NORTH, false); + setBlockStateRotated(world, westStairs, x + dx, y + 1, z + dz, rotation, sbb); + setBlockStateRotated(world, westStairs.setValue(StairBlock.HALF, Half.TOP), x + dx, y + height, z + dz, rotation, sbb); + } else if (dz == length - 1) { + final BlockState eastStairs = getStairState(deco.stairState, Direction.SOUTH, false); + setBlockStateRotated(world, eastStairs, x + dx, y + 1, z + dz, rotation, sbb); + setBlockStateRotated(world, eastStairs.setValue(StairBlock.HALF, Half.TOP), x + dx, y + height, z + dz, rotation, sbb); + } + + if (fenced && (dx == 0 || dx == width - 1 || dz == 0 || dz == length - 1)) { + for (int fy = 2; fy <= height - 1; fy++) { + setBlockStateRotated(world, myDeco.fenceState, x + dx, y + fy, z + dz, rotation, sbb); + } + } + } + } + } + } + + /** + * Dark tower half floors + */ + protected void addStairsDown(WorldGenLevel world, BoundingBox sbb, Rotation rotation, int y, int sz, int spacing) { + // stairs + for (int i = 0; i < spacing; i++) { + int sx = size - 3 - i; + + this.setBlockStateRotated(world, getStairState(deco.stairState, Direction.WEST, false), sx, y - i, sz, rotation, sbb); + this.setBlockStateRotated(world, deco.accentState, sx, y - 1 - i, sz, rotation, sbb); + this.setBlockStateRotated(world, AIR, sx, y + 1 - i, sz, rotation, sbb); + this.setBlockStateRotated(world, AIR, sx, y + 2 - i, sz, rotation, sbb); + this.setBlockStateRotated(world, AIR, sx - 1, y + 2 - i, sz, rotation, sbb); + this.setBlockStateRotated(world, AIR, sx, y + 3 - i, sz, rotation, sbb); + this.setBlockStateRotated(world, AIR, sx - 1, y + 3 - i, sz, rotation, sbb); + } + } + + /** + * Add a bunch of timber beams + */ + protected void addSmallTimberBeams(WorldGenLevel world, RandomSource rand, BoundingBox sbb, int bottom, int top) { + + int spacing = 4; + Rotation rotation = Rotation.NONE; + if (bottom == 0) { + bottom += spacing; + } + + // fill with 3/4 floors + for (int y = bottom; y < top; y += spacing) { + rotation = rotation.getRotated(Rotation.CLOCKWISE_90); + + if (y >= top - spacing && isDeadEnd()) { + makeTimberFloor(world, sbb, rotation, y); + + TFStructureDecorator logDeco = new StructureDecoratorDarkTower(); + + logDeco.pillarState = TFBlocks.DARK_LOG.get().defaultBlockState(); + logDeco.platformState = TFBlocks.DARK_LOG.get().defaultBlockState(); + + decorateTreasureRoom(world, sbb, rotation, y, 4, logDeco); + } else { + makeSmallTimberBeams(world, rand, sbb, rotation, y, y == bottom && bottom != spacing); + } + } + } + + /** + * Make a mostly soid timber floor + */ + protected void makeTimberFloor(WorldGenLevel world, BoundingBox sbb, Rotation rotation, int y) { + BlockState beamID = TFBlocks.DARK_LOG.get().defaultBlockState(); + BlockState beamStateNS = beamID.setValue(RotatedPillarBlock.AXIS, Direction.Axis.Z); + BlockState beamStateUD = beamID.setValue(RotatedPillarBlock.AXIS, Direction.Axis.Y); + BlockState beamStateEW = beamID.setValue(RotatedPillarBlock.AXIS, Direction.Axis.X); + + for (int z = 1; z < size - 1; z++) { + for (int x = 1; x < size - 1; x++) { + if (x < z) { + setBlockStateRotated(world, beamStateNS, x, y, z, rotation, sbb); + } else { + setBlockStateRotated(world, beamStateEW, x, y, z, rotation, sbb); + } + } + } + + // beams going down + for (int by = 1; by < 4; by++) { + BlockState ladder = Blocks.LADDER.defaultBlockState(); + setBlockStateRotated(world, beamStateUD, 2, y - by, 2, rotation, sbb); + setBlockStateRotated(world, ladder.setValue(LadderBlock.FACING, Direction.WEST), 2 + 1, y - by, 2, rotation, sbb); + setBlockStateRotated(world, beamStateUD, 6, y - by, 6, rotation, sbb); + setBlockStateRotated(world, ladder.setValue(LadderBlock.FACING, Direction.EAST), 6 - 1, y - by, 6, rotation, sbb); + } + + // holes for entrance + setBlockStateRotated(world, AIR, 3, y, 2, rotation, sbb); + setBlockStateRotated(world, AIR, 5, y, 6, rotation, sbb); + } + + /** + * Make a lattice of log blocks + */ + protected void makeSmallTimberBeams(WorldGenLevel world, RandomSource rand, BoundingBox sbb, Rotation rotation, int y, boolean bottom) { + BlockState beamID = TFBlocks.DARK_LOG.get().defaultBlockState(); + BlockState beamStateNS = beamID.setValue(RotatedPillarBlock.AXIS, Direction.Axis.X); + BlockState beamStateUD = beamID.setValue(RotatedPillarBlock.AXIS, Direction.Axis.Y); + BlockState beamStateEW = beamID.setValue(RotatedPillarBlock.AXIS, Direction.Axis.Z); + + // two beams going e/w + for (int z = 1; z < size - 1; z++) { + setBlockStateRotated(world, beamStateEW, 2, y, z, rotation, sbb); + setBlockStateRotated(world, beamStateEW, 6, y, z, rotation, sbb); + } + + // a few random cross beams + int z = pickBetweenExcluding(3, size - 3, rand, 2, 2, 6); + for (int x = 3; x < 6; x++) { + setBlockStateRotated(world, beamStateNS, x, y, z, rotation, sbb); + } + + // beams going down + int x1 = 2; + int z1 = rand.nextBoolean() ? 2 : 6; + int x3 = 6; + int z3 = rand.nextBoolean() ? 2 : 6; + + for (int by = 1; by < 4; by++) { + final BlockState ladder = Blocks.LADDER.defaultBlockState(); + if (!bottom || checkPost(world, x1, y - 4, z1, rotation, sbb)) { + setBlockStateRotated(world, beamStateUD, x1, y - by, z1, rotation, sbb); + setBlockStateRotated(world, ladder.setValue(LadderBlock.FACING, Direction.WEST), x1 + 1, y - by, z1, rotation, sbb); + } + if (!bottom || checkPost(world, x3, y - 4, z3, rotation, sbb)) { + setBlockStateRotated(world, beamStateUD, x3, y - by, z3, rotation, sbb); + setBlockStateRotated(world, ladder.setValue(LadderBlock.FACING, Direction.EAST), x3 - 1, y - by, z3, rotation, sbb); + } + } + } + + /** + * Utility function to pick a random number between two values, excluding three specified values + */ + protected int pickBetweenExcluding(int low, int high, RandomSource rand, int k, int l, int m) { + int result; + + do { + result = rand.nextInt(high - low) + low; + } + while (result == k || result == l || result == m); + + return result; + } + + /** + * Pick one of the three specified values at random + */ + protected int pickFrom(RandomSource rand, int i, int j, int k) { + return switch (rand.nextInt(3)) { + case 1 -> j; + case 2 -> k; + default -> i; + }; + } + + /** + * Utility function for beam maze that checks if we should build a beam all the way down -- is there a valid spot to end it? + */ + protected boolean checkPost(WorldGenLevel world, int x, int y, int z, Rotation rotation, BoundingBox sbb) { + int worldX = this.getXWithOffsetRotated(x, z, rotation); + int worldY = this.getWorldY(y); + int worldZ = this.getZWithOffsetRotated(x, z, rotation); + final BlockPos vec = new BlockPos(worldX, worldY, worldZ); + if (!sbb.isInside(vec)) return false; + BlockState blockState = world.getBlockState(vec); + return blockState.getBlock() != Blocks.AIR && blockState != deco.accentState; + } + + /** + * Generate walls for the tower with the distinct pattern of blocks and accent blocks + * + * @param rand + */ + protected void makeEncasedWalls(WorldGenLevel world, RandomSource rand, BoundingBox sbb, int minX, int minY, int minZ, int maxX, int maxY, int maxZ) { + + for (int x = minX; x <= maxX; x++) { + for (int y = minY; y <= maxY; y++) { + for (int z = minZ; z <= maxZ; z++) { + if (x != minX && x != maxX && y != minY && y != maxY && z != minZ && z != maxZ) { + } else { + // wall + if (((y == minY || y == maxY) && ((x == minY || x == maxX) || (z == minZ || z == maxZ))) + || ((z == minZ || z == maxZ) && ((x == minY || x == maxX) || (y == minY || y == maxY)))) { + this.placeBlock(world, deco.accentState, x, y, z, sbb); + } else { + StructurePiece.BlockSelector blocker = deco.randomBlocks; + + blocker.next(rand, x, y, z, true); + this.placeBlock(world, blocker.getNext(), x, y, z, sbb); + } + } + } + } + } + + // corners + this.placeBlock(world, deco.accentState, minX + 1, minY + 1, minZ, sbb); + this.placeBlock(world, deco.accentState, minX + 1, minY + 1, maxZ, sbb); + this.placeBlock(world, deco.accentState, maxX - 1, minY + 1, minZ, sbb); + this.placeBlock(world, deco.accentState, maxX - 1, minY + 1, maxZ, sbb); + this.placeBlock(world, deco.accentState, minX + 1, maxY - 1, minZ, sbb); + this.placeBlock(world, deco.accentState, minX + 1, maxY - 1, maxZ, sbb); + this.placeBlock(world, deco.accentState, maxX - 1, maxY - 1, minZ, sbb); + this.placeBlock(world, deco.accentState, maxX - 1, maxY - 1, maxZ, sbb); + + this.placeBlock(world, deco.accentState, minX, minY + 1, minZ + 1, sbb); + this.placeBlock(world, deco.accentState, minX, minY + 1, maxZ - 1, sbb); + this.placeBlock(world, deco.accentState, maxX, minY + 1, minZ + 1, sbb); + this.placeBlock(world, deco.accentState, maxX, minY + 1, maxZ - 1, sbb); + this.placeBlock(world, deco.accentState, minX, maxY - 1, minZ + 1, sbb); + this.placeBlock(world, deco.accentState, minX, maxY - 1, maxZ - 1, sbb); + this.placeBlock(world, deco.accentState, maxX, maxY - 1, minZ + 1, sbb); + this.placeBlock(world, deco.accentState, maxX, maxY - 1, maxZ - 1, sbb); + + this.placeBlock(world, deco.accentState, minX + 1, minY, minZ + 1, sbb); + this.placeBlock(world, deco.accentState, minX + 1, minY, maxZ - 1, sbb); + this.placeBlock(world, deco.accentState, maxX - 1, minY, minZ + 1, sbb); + this.placeBlock(world, deco.accentState, maxX - 1, minY, maxZ - 1, sbb); + this.placeBlock(world, deco.accentState, minX + 1, maxY, minZ + 1, sbb); + this.placeBlock(world, deco.accentState, minX + 1, maxY, maxZ - 1, sbb); + this.placeBlock(world, deco.accentState, maxX - 1, maxY, minZ + 1, sbb); + this.placeBlock(world, deco.accentState, maxX - 1, maxY, maxZ - 1, sbb); + } + + /** + * Gets a random position in the specified direction that connects to a floor currently in the tower. + */ + @Override + public int[] getValidOpening(RandomSource rand, Rotation direction) { + int verticalOffset = this.size == 19 ? 5 : 4; + + // for directions 0 or 2, the wall lies along the z axis + if (direction == Rotation.NONE || direction == Rotation.CLOCKWISE_180) { + int rx = direction == Rotation.NONE ? size - 1 : 0; + int rz = this.size / 2; + int ry = this.height - verticalOffset; + + return new int[]{rx, ry, rz}; + } + + // for directions 1 or 3, the wall lies along the x axis + if (direction == Rotation.CLOCKWISE_90 || direction == Rotation.COUNTERCLOCKWISE_90) { + int rx = this.size / 2; + int rz = direction == Rotation.CLOCKWISE_90 ? size - 1 : 0; + int ry = this.height - verticalOffset; + + return new int[]{rx, ry, rz}; + } + + return new int[]{0, 0, 0}; + } + + /** + * Add an opening to the outside (or another tower) in the specified direction. + */ + @Override + public void addOpening(int dx, int dy, int dz, Rotation direction) { + this.addOpening(dx, dy, dz, direction, EnumDarkTowerDoor.VANISHING); + } + + /** + * Add an opening where we keep track of the kind of opening + */ + protected void addOpening(int dx, int dy, int dz, Rotation direction, EnumDarkTowerDoor type) { + super.addOpening(dx, dy, dz, direction); + this.openingTypes.add(openings.indexOf(new BlockPos(dx, dy, dz)), type); + } + + /** + * Iterate through the openings on our list and add them to the tower + */ + @Override + protected void makeOpenings(WorldGenLevel world, BoundingBox sbb) { + for (int i = 0; i < openings.size(); i++) { + BlockPos doorCoords = openings.get(i); + + EnumDarkTowerDoor doorType; + if (openingTypes.size() > i) { + doorType = openingTypes.get(i); + } else { + doorType = EnumDarkTowerDoor.VANISHING; + } + + switch (doorType) { + case REAPPEARING -> makeReappearingDoorOpening(world, doorCoords.getX(), doorCoords.getY(), doorCoords.getZ(), sbb); + case LOCKED -> makeLockedDoorOpening(world, doorCoords.getX(), doorCoords.getY(), doorCoords.getZ(), sbb); + default -> makeDoorOpening(world, doorCoords.getX(), doorCoords.getY(), doorCoords.getZ(), sbb); + } + } + } + + /** + * Make an opening in this tower for a door. + */ + @Override + protected void makeDoorOpening(WorldGenLevel world, int dx, int dy, int dz, BoundingBox sbb) { + // nullify sky light +// nullifySkyLightAtCurrentPosition(world, dx - 3, dy - 1, dz - 3, dx + 3, dy + 3, dz + 3); + + final BlockState inactiveVanish = TFBlocks.VANISHING_BLOCK.get().defaultBlockState(); + + // clear the door + if (dx == 0 || dx == size - 1) { + this.generateBox(world, sbb, dx, dy - 1, dz - 2, dx, dy + 3, dz + 2, deco.accentState, AIR, false); + this.generateBox(world, sbb, dx, dy, dz - 1, dx, dy + 2, dz + 1, inactiveVanish, AIR, false); + } + if (dz == 0 || dz == size - 1) { + this.generateBox(world, sbb, dx - 2, dy - 1, dz, dx + 2, dy + 3, dz, deco.accentState, AIR, false); + this.generateBox(world, sbb, dx - 1, dy, dz, dx + 1, dy + 2, dz, inactiveVanish, AIR, false); + } + } + + /** + * Make a 3x3 tower door that reappears + */ + protected void makeReappearingDoorOpening(WorldGenLevel world, int dx, int dy, int dz, BoundingBox sbb) { + // nullify sky light +// nullifySkyLightAtCurrentPosition(world, dx - 3, dy - 1, dz - 3, dx + 3, dy + 3, dz + 3); + + final BlockState inactiveReappearing = TFBlocks.REAPPEARING_BLOCK.get().defaultBlockState(); + + // clear the door + if (dx == 0 || dx == size - 1) { + this.generateBox(world, sbb, dx, dy - 1, dz - 2, dx, dy + 3, dz + 2, deco.accentState, AIR, false); + this.generateBox(world, sbb, dx, dy, dz - 1, dx, dy + 2, dz + 1, inactiveReappearing, AIR, false); + } + if (dz == 0 || dz == size - 1) { + this.generateBox(world, sbb, dx - 2, dy - 1, dz, dx + 2, dy + 3, dz, deco.accentState, AIR, false); + this.generateBox(world, sbb, dx - 1, dy, dz, dx + 1, dy + 2, dz, inactiveReappearing, AIR, false); + } + } + + /** + * Make a 3x3 tower door that is locked + */ + protected void makeLockedDoorOpening(WorldGenLevel world, int dx, int dy, int dz, BoundingBox sbb) { + // nullify sky light +// nullifySkyLightAtCurrentPosition(world, dx - 3, dy - 1, dz - 3, dx + 3, dy + 3, dz + 3); + + // clear the door + final BlockState lockedVanish = TFBlocks.LOCKED_VANISHING_BLOCK.get().defaultBlockState(); + final BlockState inactiveVanish = TFBlocks.VANISHING_BLOCK.get().defaultBlockState(); + + if (dx == 0 || dx == size - 1) { + this.generateBox(world, sbb, dx, dy - 1, dz - 2, dx, dy + 3, dz + 2, deco.accentState, AIR, false); + this.generateBox(world, sbb, dx, dy, dz - 1, dx, dy + 2, dz + 1, inactiveVanish, AIR, false); + this.placeBlock(world, lockedVanish, dx, dy, dz + 1, sbb); + this.placeBlock(world, lockedVanish, dx, dy, dz - 1, sbb); + this.placeBlock(world, lockedVanish, dx, dy + 2, dz + 1, sbb); + this.placeBlock(world, lockedVanish, dx, dy + 2, dz - 1, sbb); + } + if (dz == 0 || dz == size - 1) { + this.generateBox(world, sbb, dx - 2, dy - 1, dz, dx + 2, dy + 3, dz, deco.accentState, AIR, false); + this.generateBox(world, sbb, dx - 1, dy, dz, dx + 1, dy + 2, dz, inactiveVanish, AIR, false); + this.placeBlock(world, lockedVanish, dx + 1, dy, dz, sbb); + this.placeBlock(world, lockedVanish, dx - 1, dy, dz, sbb); + this.placeBlock(world, lockedVanish, dx + 1, dy + 2, dz, sbb); + this.placeBlock(world, lockedVanish, dx - 1, dy + 2, dz, sbb); + } + } + + /** + * Returns true if this tower has only one exit. + */ + @Override + public boolean isDeadEnd() { + // we have to modify this to ignore door type 2 since that leads to balconies + int nonBalconies = 0; + + for (EnumDarkTowerDoor type : openingTypes) { + if (type != EnumDarkTowerDoor.REAPPEARING) { + nonBalconies++; + } + } + + return nonBalconies <= 1; + } + + public boolean isKeyTower() { + return keyTower; + } + + public void setKeyTower(boolean keyTower) { + this.keyTower = keyTower; + } +} diff --git a/src/main/java/twilightforest/world/components/structures/darktower/EnumDarkTowerDoor.java b/src/main/java/twilightforest/world/components/structures/darktower/EnumDarkTowerDoor.java new file mode 100644 index 0000000000..47d5075057 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/darktower/EnumDarkTowerDoor.java @@ -0,0 +1,7 @@ +package twilightforest.world.components.structures.darktower; + +public enum EnumDarkTowerDoor { + VANISHING, + REAPPEARING, + LOCKED +} diff --git a/src/main/java/twilightforest/world/components/structures/darktower/StructureDecoratorDarkTower.java b/src/main/java/twilightforest/world/components/structures/darktower/StructureDecoratorDarkTower.java new file mode 100644 index 0000000000..2feda5a188 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/darktower/StructureDecoratorDarkTower.java @@ -0,0 +1,19 @@ +package twilightforest.world.components.structures.darktower; + +import net.minecraft.world.level.block.Blocks; +import twilightforest.init.TFBlocks; +import twilightforest.world.components.structures.TFStructureDecorator; + +public class StructureDecoratorDarkTower extends TFStructureDecorator { + + public StructureDecoratorDarkTower() { + this.blockState = TFBlocks.TOWERWOOD.get().defaultBlockState(); + this.accentState = TFBlocks.ENCASED_TOWERWOOD.get().defaultBlockState(); + this.fenceState = Blocks.OAK_FENCE.defaultBlockState(); + this.stairState = Blocks.SPRUCE_STAIRS.defaultBlockState(); + this.pillarState = TFBlocks.ENCASED_TOWERWOOD.get().defaultBlockState(); + this.platformState = TFBlocks.ENCASED_TOWERWOOD.get().defaultBlockState(); + this.randomBlocks = new TowerwoodProcessor(); + } + +} diff --git a/src/main/java/twilightforest/world/components/structures/darktower/TowerwoodProcessor.java b/src/main/java/twilightforest/world/components/structures/darktower/TowerwoodProcessor.java new file mode 100644 index 0000000000..ca5b74765a --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/darktower/TowerwoodProcessor.java @@ -0,0 +1,29 @@ +package twilightforest.world.components.structures.darktower; + +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import twilightforest.init.TFBlocks; + +public class TowerwoodProcessor extends StructurePiece.BlockSelector { + + @Override + public void next(RandomSource random, int x, int y, int z, boolean isWall) { + if (!isWall) { + this.next = Blocks.AIR.defaultBlockState(); + } else { + float randFloat = random.nextFloat(); + + if (randFloat < 0.1F) { + this.next = TFBlocks.CRACKED_TOWERWOOD.get().defaultBlockState(); + } else if (randFloat < 0.2F) { + this.next = TFBlocks.MOSSY_TOWERWOOD.get().defaultBlockState(); + } else if (randFloat < 0.225F) { + this.next = TFBlocks.INFESTED_TOWERWOOD.get().defaultBlockState(); + } else { + this.next = TFBlocks.TOWERWOOD.get().defaultBlockState(); + } + } + } + +} diff --git a/src/main/java/twilightforest/world/components/structures/darktower/package-info.java b/src/main/java/twilightforest/world/components/structures/darktower/package-info.java new file mode 100644 index 0000000000..74c790bd5d --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/darktower/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.world.components.structures.darktower; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/world/components/structures/finalcastle/CastleBlockProcessor.java b/src/main/java/twilightforest/world/components/structures/finalcastle/CastleBlockProcessor.java new file mode 100644 index 0000000000..cc7df1c467 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/finalcastle/CastleBlockProcessor.java @@ -0,0 +1,27 @@ +package twilightforest.world.components.structures.finalcastle; + +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import twilightforest.init.TFBlocks; + +public class CastleBlockProcessor extends StructurePiece.BlockSelector { + + @Override + public void next(RandomSource random, int x, int y, int z, boolean isWall) { + if (!isWall) { + next = Blocks.AIR.defaultBlockState(); + } else { + float randFloat = random.nextFloat(); + + if (randFloat < 0.1F) { + next = TFBlocks.WORN_CASTLE_BRICK.get().defaultBlockState(); + } else if (randFloat < 0.2F) { + next = TFBlocks.CRACKED_CASTLE_BRICK.get().defaultBlockState(); + } else { + next = TFBlocks.CASTLE_BRICK.get().defaultBlockState(); + } + } + } + +} diff --git a/src/main/java/twilightforest/world/components/structures/finalcastle/DestroyArea.java b/src/main/java/twilightforest/world/components/structures/finalcastle/DestroyArea.java new file mode 100644 index 0000000000..8ddfb436a0 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/finalcastle/DestroyArea.java @@ -0,0 +1,62 @@ +package twilightforest.world.components.structures.finalcastle; + +import net.minecraft.core.BlockPos; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.levelgen.structure.BoundingBox; + +import java.util.ArrayList; + +/** + * An area that we're going to destroy. Default is just a MutableBoundingBox + */ +public class DestroyArea { + + final BoundingBox destroyBox; + + public DestroyArea(BoundingBox tower, RandomSource rand, int y) { + // make a 4x4 area that's entirely within the tower bounding box + + int bx = tower.minX() - 2 + rand.nextInt(tower.getXSpan()); + int bz = tower.minZ() - 2 + rand.nextInt(tower.getZSpan()); + + this.destroyBox = new BoundingBox(bx, y - 10, bz, bx + 4, y, bz + 4); + } + + public boolean isEntirelyAbove(int y) { + return this.destroyBox.minY() > y; + } + + public boolean isVecInside(BlockPos pos) { + return destroyBox.isInside(pos); + } + + /** + * construct a new area that does not intersect any other areas in the list + */ + public static DestroyArea createNonIntersecting(BoundingBox tower, RandomSource rand, int y, ArrayList otherAreas) { + int attempts = 100; + + DestroyArea area = null; + for (int i = 0; i < attempts && area == null; i++) { + DestroyArea testArea = new DestroyArea(tower, rand, y); + + if (otherAreas.size() == 0) { + area = testArea; + } else { + for (DestroyArea otherArea : otherAreas) { + if (otherArea == null || !testArea.intersectsWith(otherArea)) { + area = testArea; + } + } + } + } + return area; + } + + /** + * We check if the box would intersect even if it was one block larger in the x and z directions + */ + private boolean intersectsWith(DestroyArea otherArea) { + return this.destroyBox.intersects(otherArea.destroyBox.maxX() + 1, otherArea.destroyBox.minX() - 1, otherArea.destroyBox.maxZ() + 1, otherArea.destroyBox.minZ() - 1); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleBellFoundation21Component.java b/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleBellFoundation21Component.java new file mode 100644 index 0000000000..45d44de56d --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleBellFoundation21Component.java @@ -0,0 +1,60 @@ +package twilightforest.world.components.structures.finalcastle; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFStructurePieceTypes; +import twilightforest.util.RotationUtil; +import twilightforest.world.components.structures.TFStructureComponentOld; + +/** + * A larger foundation that comes all the way from the top of a tower + * + * @author benma_000 + */ +public class FinalCastleBellFoundation21Component extends FinalCastleFoundation13Component { + + public FinalCastleBellFoundation21Component(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFFCBeF21.get(), nbt); + } + + public FinalCastleBellFoundation21Component(int i, TFStructureComponentOld sideTower, int x, int y, int z) { + super(TFStructurePieceTypes.TFFCBeF21.get(), i, sideTower, x, y, z); + + this.boundingBox = new BoundingBox(sideTower.getBoundingBox().minX() - 2, sideTower.getBoundingBox().maxY() - 1, sideTower.getBoundingBox().minZ() - 2, sideTower.getBoundingBox().minX() + 2, sideTower.getBoundingBox().maxY(), sideTower.getBoundingBox().maxZ() + 2); + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + int mid = 16; + int low = 32; + + // assume square + int size = this.boundingBox.maxX() - this.boundingBox.minX(); + + for (Rotation rotation : RotationUtil.ROTATIONS) { + // do corner + this.replaceAirAndLiquidDownwardsRotated(world, deco.blockState, 2, -1, 1, rotation, sbb); + this.replaceAirAndLiquidDownwardsRotated(world, deco.blockState, 2, -mid, 0, rotation, sbb); + this.replaceAirAndLiquidDownwardsRotated(world, deco.blockState, 1, -1, 2, rotation, sbb); + this.replaceAirAndLiquidDownwardsRotated(world, deco.blockState, 0, -mid, 2, rotation, sbb); + + this.replaceAirAndLiquidDownwardsRotated(world, deco.blockState, 1, -low, 1, rotation, sbb); + this.replaceAirAndLiquidDownwardsRotated(world, deco.blockState, 0, -low, 1, rotation, sbb); + this.replaceAirAndLiquidDownwardsRotated(world, deco.blockState, 1, -low, 0, rotation, sbb); + this.replaceAirAndLiquidDownwardsRotated(world, deco.blockState, 0, -low, 0, rotation, sbb); + + for (int x = 6; x < (size - 3); x += 4) { + this.replaceAirAndLiquidDownwardsRotated(world, deco.blockState, x, -1, 1, rotation, sbb); + this.replaceAirAndLiquidDownwardsRotated(world, deco.blockState, x, -mid, 0, rotation, sbb); + } + } + } +} diff --git a/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleBellTower21Component.java b/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleBellTower21Component.java new file mode 100644 index 0000000000..ab9c8f4c31 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleBellTower21Component.java @@ -0,0 +1,79 @@ +package twilightforest.world.components.structures.finalcastle; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFStructurePieceTypes; +import twilightforest.util.RotationUtil; +import twilightforest.world.components.structures.TFStructureComponentOld; + + +public class FinalCastleBellTower21Component extends FinalCastleMazeTower13Component { + + private static final int FLOORS = 8; + + public FinalCastleBellTower21Component(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFFCBelTo.get(), nbt); + } + + public FinalCastleBellTower21Component(int i, int x, int y, int z, Direction direction) { + super(TFStructurePieceTypes.TFFCBelTo.get(), i, x, y, z, FLOORS, 1, TFBlocks.BLUE_CASTLE_RUNE_BRICK.get().defaultBlockState(), direction); + this.size = 21; + this.height = FLOORS * 8 + 1; + this.boundingBox = TFStructureComponentOld.getComponentToAddBoundingBox2(x, y, z, -6, -8, -this.size / 2, this.size - 1, this.height, this.size - 1, direction); + this.openings.clear(); + addOpening(0, 9, size / 2, Rotation.CLOCKWISE_180); + } + + @Override + public void addChildren(StructurePiece parent, StructurePieceAccessor list, RandomSource rand) { + if (parent != null && parent instanceof TFStructureComponentOld) { + this.deco = ((TFStructureComponentOld) parent).deco; + } + + // add foundation + FinalCastleBellFoundation21Component foundation = new FinalCastleBellFoundation21Component(4, this, getLocatorPosition().getX(), getLocatorPosition().getY(), getLocatorPosition().getZ()); + list.addPiece(foundation); + foundation.addChildren(this, list, rand); + + // add roof + TFStructureComponentOld roof = new FinalCastleRoof13CrenellatedComponent(4, this, getLocatorPosition().getX(), getLocatorPosition().getY(), getLocatorPosition().getZ()); + list.addPiece(roof); + roof.addChildren(this, list, rand); + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + super.postProcess(world, manager, generator, rand, sbb, chunkPosIn, blockPos); + + // openings! + BlockState fieldBlock = TFBlocks.BLUE_FORCE_FIELD.get().defaultBlockState(); + for (Rotation rotation : RotationUtil.ROTATIONS) { + int y = 48; + for (int x = 5; x < this.size - 4; x += 2) { + this.fillBlocksRotated(world, sbb, x, y, 0, x, y + 14, 0, fieldBlock, rotation); + } + y = 24; + for (int x = 1; x < this.size - 1; x += 8) { + this.fillBlocksRotated(world, sbb, x, y, 0, x, y + 14, 0, fieldBlock, rotation); +// fieldMeta = rand.nextInt(5); + this.fillBlocksRotated(world, sbb, x + 2, y, 0, x + 2, y + 14, 0, fieldBlock, rotation); + } + } + + // sign + this.placeSignAtCurrentPosition(world, 7, 9, 8, "Parkour area 2", "mini-boss 1", sbb); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleBossGazeboComponent.java b/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleBossGazeboComponent.java new file mode 100644 index 0000000000..2ac7607b6d --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleBossGazeboComponent.java @@ -0,0 +1,83 @@ +package twilightforest.world.components.structures.finalcastle; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFStructurePieceTypes; +import twilightforest.util.RotationUtil; +import twilightforest.world.components.structures.TFStructureComponentOld; + +import javax.annotation.ParametersAreNonnullByDefault; + + +@ParametersAreNonnullByDefault +public class FinalCastleBossGazeboComponent extends TFStructureComponentOld { + + @SuppressWarnings("unused") + public FinalCastleBossGazeboComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFFCBoGaz.get(), nbt); + } + + public FinalCastleBossGazeboComponent(int i, TFStructureComponentOld keep, int x, int y, int z) { + super(TFStructurePieceTypes.TFFCBoGaz.get(), i, x, y, z); + this.spawnListIndex = -1; // no monsters + + this.setOrientation(keep.getOrientation()); + this.boundingBox = new BoundingBox(keep.getBoundingBox().minX() + 14, keep.getBoundingBox().maxY() + 2, keep.getBoundingBox().minZ() + 14, keep.getBoundingBox().maxX() - 14, keep.getBoundingBox().maxY() + 13, keep.getBoundingBox().maxZ() - 14); + + } + + @Override + public void addChildren(StructurePiece parent, StructurePieceAccessor list, RandomSource rand) { + this.deco = new StructureTFDecoratorCastle(); + this.deco.blockState = TFBlocks.VIOLET_CASTLE_RUNE_BRICK.get().defaultBlockState(); + + this.deco.fenceState = TFBlocks.VIOLET_FORCE_FIELD.get().defaultBlockState(); + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource randomIn, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + BlockState state = TFBlocks.VIOLET_FORCE_FIELD.get().defaultBlockState(); + + // walls + for (Rotation rotation : RotationUtil.ROTATIONS) { + this.fillBlocksRotated(world, sbb, 0, 0, 0, 0, 10, 20, state, rotation); + } + + // roof + state = state.setValue(BlockStateProperties.AXIS, Direction.Axis.X); + this.generateBox(world, sbb, 1, 11, 0, 19, 11, 20, state, state, false); + + state = state.setValue(BlockStateProperties.AXIS, Direction.Axis.Z); + this.generateBox(world, sbb, 0, 11, 0, 0, 11, 20, state, state, false); + this.generateBox(world, sbb, 20, 11, 0, 20, 11, 20, state, state, false); + + //this.placeSignAtCurrentPosition(world, 10, 0, 10, sbb, "Final Boss Here", "You win!", "discord.gg/6v3z26B"); + + //old message - revised 9/25/2022 +// setInvisibleTextEntity(world, 10, 0, 10, sbb, "Final Boss Here", true, 2.3f); +// setInvisibleTextEntity(world, 10, 0, 10, sbb, "You win!", true, 2.0f); +// setInvisibleTextEntity(world, 10, 0, 10, sbb, "You can join the Twilight Forest Discord server to follow",true, 1.0f); +// setInvisibleTextEntity(world, 10, 0, 10, sbb, "the latest updates on this castle and other content at:",true, 0.7f); + + setInvisibleTextEntity(world, 10, 0, 10, sbb, "Final Castle WIP.", true, 2.3f); + setInvisibleTextEntity(world, 10, 0, 10, sbb, "Join our Discord server to",true, 1.3f); + setInvisibleTextEntity(world, 10, 0, 10, sbb, "follow development of the mod:",true, 1.0f); + setInvisibleTextEntity(world, 10, 0, 10, sbb, "discord.experiment115.com", true, 0.7f); + + //placeBlock(world, TFBlocks.boss_spawner_final_boss.get().defaultBlockState(), 10, 1, 10, sbb); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleBridgeComponent.java b/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleBridgeComponent.java new file mode 100644 index 0000000000..4d66d75258 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleBridgeComponent.java @@ -0,0 +1,75 @@ +package twilightforest.world.components.structures.finalcastle; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.Mth; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.RotatedPillarBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFStructurePieceTypes; +import twilightforest.world.components.structures.TFStructureComponentOld; + + +public class FinalCastleBridgeComponent extends TFStructureComponentOld { + + public FinalCastleBridgeComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFFCBri.get(), nbt); + } + + public FinalCastleBridgeComponent(int i, int x, int y, int z, int length, Direction direction) { + super(TFStructurePieceTypes.TFFCBri.get(), i, x, y, z); + this.setOrientation(direction); + this.boundingBox = TFStructureComponentOld.getComponentToAddBoundingBox2(x, y, z, 0, -1, -3, length - 1, 5, 6, direction); + } + + @Override + public void addChildren(StructurePiece parent, StructurePieceAccessor list, RandomSource rand) { + if (parent != null && parent instanceof TFStructureComponentOld) { + this.deco = ((TFStructureComponentOld) parent).deco; + } + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + int length = (this.getOrientation() == Direction.SOUTH || this.getOrientation() == Direction.NORTH) ? this.boundingBox.maxX() - this.boundingBox.minX() : this.boundingBox.maxZ() - this.boundingBox.minZ(); + + // span + generateBox(world, sbb, 0, 0, 0, length, 1, 6, false, rand, deco.randomBlocks); + // rails + BlockState castlePillar = TFBlocks.BOLD_CASTLE_BRICK_PILLAR.get().defaultBlockState().setValue(RotatedPillarBlock.AXIS, Direction.Axis.X); + + generateBox(world, sbb, 0, 2, 0, length, 2, 0, castlePillar, castlePillar, false); + generateBox(world, sbb, 0, 2, 6, length, 2, 6, castlePillar, castlePillar, false); + + // supports + int l3 = length / 3; + for (int i = 0; i < l3; i++) { + int sl = l3 - (int) (Mth.cos((float) (l3 - i) / (float) l3 * 1.6F) * l3); // this could be better, maybe? + generateBox(world, sbb, i, -sl, 0, i, 0, 0, false, rand, deco.randomBlocks); + generateBox(world, sbb, i, -sl, 6, i, 0, 6, false, rand, deco.randomBlocks); + generateBox(world, sbb, length - i, -sl, 0, length - i, 0, 0, false, rand, deco.randomBlocks); + generateBox(world, sbb, length - i, -sl, 6, length - i, 0, 6, false, rand, deco.randomBlocks); + } + + // doorframes + this.generateBox(world, sbb, 0, 2, 1, 0, 7, 1, deco.pillarState, deco.pillarState, false); + this.generateBox(world, sbb, 0, 2, 5, 0, 7, 5, deco.pillarState, deco.pillarState, false); + this.generateBox(world, sbb, 0, 6, 2, 0, 6, 4, deco.accentState, deco.accentState, false); + this.placeBlock(world, deco.pillarState, 0, 7, 3, sbb); + + this.generateBox(world, sbb, length, 2, 1, length, 7, 1, deco.pillarState, deco.pillarState, false); + this.generateBox(world, sbb, length, 2, 5, length, 7, 5, deco.pillarState, deco.pillarState, false); + this.generateBox(world, sbb, length, 6, 2, length, 6, 4, deco.accentState, deco.accentState, false); + this.placeBlock(world, deco.pillarState, length, 7, 3, sbb); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleDamagedTowerComponent.java b/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleDamagedTowerComponent.java new file mode 100644 index 0000000000..25ec6c4846 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleDamagedTowerComponent.java @@ -0,0 +1,133 @@ +package twilightforest.world.components.structures.finalcastle; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFStructurePieceTypes; +import twilightforest.world.components.structures.TFStructureComponentOld; + +import java.util.ArrayList; + + +public class FinalCastleDamagedTowerComponent extends FinalCastleMazeTower13Component { + + public FinalCastleDamagedTowerComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + this(TFStructurePieceTypes.TFFCDamT.get(), nbt); + } + + public FinalCastleDamagedTowerComponent(StructurePieceType piece, CompoundTag nbt) { + super(piece, nbt); + } + + public FinalCastleDamagedTowerComponent(StructurePieceType piece, RandomSource rand, int i, int x, int y, int z, Direction direction) { + super(piece, rand, i, x, y, z, TFBlocks.YELLOW_CASTLE_RUNE_BRICK.get().defaultBlockState(), direction); //TODO: change rune color + } + + @Override + public void addChildren(StructurePiece parent, StructurePieceAccessor list, RandomSource rand) { + if (parent != null && parent instanceof TFStructureComponentOld) { + this.deco = ((TFStructureComponentOld) parent).deco; + } + + // add foundation + FinalCastleFoundation13Component foundation = new FinalCastleFoundation13Component(TFStructurePieceTypes.TFFCToF13.get(), 0, this, getLocatorPosition().getX(), getLocatorPosition().getY(), getLocatorPosition().getZ()); + list.addPiece(foundation); + foundation.addChildren(this, list, rand); + + // add thorns + FinalCastleFoundation13Component thorns = new FinalCastleFoundation13ComponentThorns(0, this, getLocatorPosition().getX(), getLocatorPosition().getY(), getLocatorPosition().getZ()); + list.addPiece(thorns); + thorns.addChildren(this, list, rand); + +// // add roof +// StructureTFComponentOld roof = rand.nextBoolean() ? new Roof13Conical(rand, 4, this) : new Roof13Crenellated(rand, 4, this); +// list.add(roof); +// roof.buildComponent(this, list, rand); + + + // keep on building? + this.buildNonCriticalTowers(list, rand); + } + + @Override + protected FinalCastleMazeTower13Component makeNewDamagedTower(RandomSource rand, Direction facing, BlockPos tc) { + return new FinalCastleWreckedTowerComponent(rand, this.getGenDepth() + 1, tc.getX(), tc.getY(), tc.getZ(), facing); + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + super.postProcess(world, manager, generator, rand, sbb, chunkPosIn, blockPos); + RandomSource decoRNG = RandomSource.create(world.getSeed() + (this.boundingBox.minX() * 321534781L) ^ (this.boundingBox.minZ() * 756839L)); + + this.destroyTower(world, decoRNG, sbb); + } + + public void destroyTower(WorldGenLevel world, RandomSource rand, BoundingBox sbb) { + + // make list of destroyed areas + ArrayList areas = makeInitialDestroyList(rand); + + boolean hitDeadRock = false; + + // go down from the top of the tower to the ground, taking out rectangular chunks + //for (int y = this.boundingBox.maxY; y > this.boundingBox.minY; y--) { + BlockPos.MutableBlockPos pos = new BlockPos.MutableBlockPos(); + for (int y = this.boundingBox.maxY(); !hitDeadRock && y > 64; y--) { + for (int x = this.boundingBox.minX() - 2; x <= this.boundingBox.maxX() + 2; x++) { + for (int z = this.boundingBox.minZ() - 2; z <= this.boundingBox.maxZ() + 2; z++) { + pos.set(x, y, z); + if (sbb.isInside(pos)) { + if (world.getBlockState(pos).getBlock() == TFBlocks.DEADROCK.get()) { + hitDeadRock = true; + } + determineBlockDestroyed(world, areas, y, x, z); + } + } + } + + // check to see if any of our DestroyAreas are entirely above the current y value + DestroyArea removeArea = null; + + for (DestroyArea dArea : areas) { + if (dArea == null || dArea.isEntirelyAbove(y)) { + removeArea = dArea; + } + } + // if so, replace them with new ones + if (removeArea != null) { + areas.remove(removeArea); + areas.add(DestroyArea.createNonIntersecting(this.getBoundingBox(), rand, y, areas)); + + } + } + } + + protected ArrayList makeInitialDestroyList(RandomSource rand) { + ArrayList areas = new ArrayList(2); + + areas.add(DestroyArea.createNonIntersecting(this.getBoundingBox(), rand, this.getBoundingBox().maxY() - 1, areas)); + areas.add(DestroyArea.createNonIntersecting(this.getBoundingBox(), rand, this.getBoundingBox().maxY() - 1, areas)); + areas.add(DestroyArea.createNonIntersecting(this.getBoundingBox(), rand, this.getBoundingBox().maxY() - 1, areas)); + return areas; + } + + protected void determineBlockDestroyed(WorldGenLevel world, ArrayList areas, int y, int x, int z) { + BlockPos pos = new BlockPos(x, y, z); + for (DestroyArea dArea : areas) { + if (dArea != null && dArea.isVecInside(pos)) { + world.removeBlock(pos, false); + } + } + } +} diff --git a/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleDungeonEntranceComponent.java b/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleDungeonEntranceComponent.java new file mode 100644 index 0000000000..544c7b2ad8 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleDungeonEntranceComponent.java @@ -0,0 +1,75 @@ +package twilightforest.world.components.structures.finalcastle; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.StairBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFStructurePieceTypes; + + +public class FinalCastleDungeonEntranceComponent extends FinalCastleDungeonRoom31Component { + + public boolean hasExit = false; + + public FinalCastleDungeonEntranceComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFFCDunEn.get(), nbt); + } + + public FinalCastleDungeonEntranceComponent(int i, int x, int y, int z, Direction direction, int level) { + super(TFStructurePieceTypes.TFFCDunEn.get(), i, x, y, z, direction, level); + } + + @Override + public void addChildren(StructurePiece parent, StructurePieceAccessor list, RandomSource rand) { + this.deco = new StructureTFDecoratorCastle(); + this.deco.blockState = TFBlocks.PINK_CASTLE_RUNE_BRICK.get().defaultBlockState(); + this.deco.fenceState = TFBlocks.PINK_FORCE_FIELD.get().defaultBlockState(); + + // this is going to be the parent for all rooms on this level + super.addChildren(this, list, rand); + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + + super.postProcess(world, manager, generator, rand, sbb, chunkPosIn, blockPos); + + final BlockState stairs = deco.stairState.setValue(StairBlock.FACING, Direction.SOUTH); + final BlockState deadRock = TFBlocks.DEADROCK.get().defaultBlockState(); + // stairs + for (int y = 0; y <= this.height; y++) { + int x = (this.size / 2) - 2; + int z = (this.size / 2) - y + 2; + + this.generateBox(world, sbb, x, 0, z, x + 4, y - 1, z, deadRock, deadRock, false); + this.generateBox(world, sbb, x, y, z, x + 4, y, z, stairs, stairs, false); + this.generateAirBox(world, sbb, x, y + 1, z, x + 4, y + 6, z); + } + + // door + final BlockState castleDoor = TFBlocks.PINK_CASTLE_DOOR.get().defaultBlockState(); + this.generateBox(world, sbb, 23, 0, 12, 23, 3, 14, castleDoor, AIR, false); + this.generateBox(world, sbb, 23, 4, 12, 23, 4, 14, deco.blockState, deco.blockState, false); + } + + @Override + protected BlockState getForceFieldColor(RandomSource decoRNG) { + return TFBlocks.PINK_FORCE_FIELD.get().defaultBlockState(); + } + + @Override + protected BlockState getRuneColor(BlockState fieldColor) { + return TFBlocks.PINK_CASTLE_RUNE_BRICK.get().defaultBlockState(); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleDungeonExitComponent.java b/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleDungeonExitComponent.java new file mode 100644 index 0000000000..a34b4287e6 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleDungeonExitComponent.java @@ -0,0 +1,94 @@ +package twilightforest.world.components.structures.finalcastle; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Vec3i; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFStructurePieceTypes; +import twilightforest.util.BoundingBoxUtils; +import twilightforest.world.components.structures.TFStructureComponentOld; + + +public class FinalCastleDungeonExitComponent extends FinalCastleDungeonRoom31Component { + + public FinalCastleDungeonExitComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFFCDunEx.get(), nbt); + } + + public FinalCastleDungeonExitComponent(int i, int x, int y, int z, Direction direction, int level) { + super(TFStructurePieceTypes.TFFCDunEx.get(), i, x, y, z, direction, level); + } + + @Override + public void addChildren(StructurePiece parent, StructurePieceAccessor list, RandomSource rand) { + if (parent instanceof TFStructureComponentOld) { + this.deco = ((TFStructureComponentOld) parent).deco; + } + + // no need for additional rooms, we're along the outside anyways + + // add stairway down + Rotation bestDir = this.findStairDirectionTowards(parent.getBoundingBox().minX(), parent.getBoundingBox().minZ()); + + FinalCastleDungeonStepsComponent steps0 = new FinalCastleDungeonStepsComponent(5, boundingBox.minZ() + 15, boundingBox.minY(), boundingBox.minZ() + 15, bestDir.rotate(Direction.SOUTH)); + list.addPiece(steps0); + steps0.addChildren(this, list, rand); + + // another level!? + if (this.level == 1) { + steps0.buildLevelUnder(list, rand, this.level + 1); + } else { + steps0.buildBossRoomUnder(list, rand); + } + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + + super.postProcess(world, manager, generator, rand, sbb, chunkPosIn, blockPos); + + // door + final BlockState castleDoor = TFBlocks.PINK_CASTLE_DOOR.get().defaultBlockState(); + + this.generateBox(world, sbb, 7, 0, 16, 7, 3, 18, castleDoor, AIR, false); + this.generateBox(world, sbb, 7, 4, 16, 7, 4, 18, deco.blockState, deco.blockState, false); + } + + public Rotation findStairDirectionTowards(int x, int z) { + Vec3i center = BoundingBoxUtils.getCenter(this.boundingBox); + // difference + int dx = center.getX() - x; + int dz = center.getZ() - z; + + Rotation absoluteDir; + if (Math.abs(dz) >= Math.abs(dx)) { + absoluteDir = (dz >= 0) ? Rotation.CLOCKWISE_180 : Rotation.NONE; + } else { + absoluteDir = (dx >= 0) ? Rotation.COUNTERCLOCKWISE_90 : Rotation.CLOCKWISE_90; + } + + return absoluteDir; + } + + @Override + protected BlockState getForceFieldColor(RandomSource decoRNG) { + return TFBlocks.PINK_FORCE_FIELD.get().defaultBlockState(); + } + + @Override + protected BlockState getRuneColor(BlockState fieldColor) { + return TFBlocks.PINK_CASTLE_RUNE_BRICK.get().defaultBlockState(); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleDungeonForgeRoomComponent.java b/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleDungeonForgeRoomComponent.java new file mode 100644 index 0000000000..eb683ec4ea --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleDungeonForgeRoomComponent.java @@ -0,0 +1,37 @@ +package twilightforest.world.components.structures.finalcastle; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFStructurePieceTypes; +import twilightforest.world.components.structures.TFStructureComponentOld; + + +public class FinalCastleDungeonForgeRoomComponent extends TFStructureComponentOld { + + public FinalCastleDungeonForgeRoomComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFFCDunBoR.get(), nbt); + } + + public FinalCastleDungeonForgeRoomComponent(int i, int x, int y, int z, Direction direction) { + super(TFStructurePieceTypes.TFFCDunBoR.get(), i, x, y, z); + this.spawnListIndex = 3; // forge monsters + this.setOrientation(direction); + this.boundingBox = TFStructureComponentOld.getComponentToAddBoundingBox2(x, y, z, -15, 0, -15, 50, 30, 50, direction); + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + this.generateAirBox(world, sbb, 0, 0, 0, 50, 30, 50); + + // sign + this.placeSignAtCurrentPosition(world, 25, 0, 25, "Mini-boss 2", "Gives talisman", sbb); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleDungeonRoom31Component.java b/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleDungeonRoom31Component.java new file mode 100644 index 0000000000..7da3e89aac --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleDungeonRoom31Component.java @@ -0,0 +1,208 @@ +package twilightforest.world.components.structures.finalcastle; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.registries.Registries; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePiecesBuilder; +import net.minecraft.world.level.material.Material; +import twilightforest.init.TFBiomes; +import twilightforest.init.TFBlocks; +import twilightforest.util.BoundingBoxUtils; +import twilightforest.util.RotationUtil; +import twilightforest.world.components.structures.TFStructureComponentOld; +import twilightforest.world.components.structures.lichtower.TowerWingComponent; +import twilightforest.init.TFLandmark; +import twilightforest.init.TFStructurePieceTypes; + + +import java.util.function.Predicate; + +public class FinalCastleDungeonRoom31Component extends TowerWingComponent { + + public int level; // this is not serialized, since it's only used during build, which should be all one step + + public FinalCastleDungeonRoom31Component(StructurePieceSerializationContext ctx, CompoundTag nbt) { + this(TFStructurePieceTypes.TFFCDunR31.get(), nbt); + } + + public FinalCastleDungeonRoom31Component(StructurePieceType piece, CompoundTag nbt) { + super(piece, nbt); + } + + public FinalCastleDungeonRoom31Component(StructurePieceType piece, int i, int x, int y, int z, Direction direction, int level) { + super(piece, i, x, y, z); + this.setOrientation(direction); + this.spawnListIndex = 2; // dungeon monsters + this.size = 31; + this.height = 7; + this.level = level; + this.boundingBox = TFLandmark.getComponentToAddBoundingBox(x, y, z, -15, 0, -15, this.size - 1, this.height - 1, this.size - 1, Direction.SOUTH, false); + } + + @Override + public void addChildren(StructurePiece parent, StructurePieceAccessor list, RandomSource rand) { + if (parent instanceof TFStructureComponentOld) { + this.deco = ((TFStructureComponentOld) parent).deco; + } + + int mySpread = this.getGenDepth() - parent.getGenDepth(); + int maxSpread = (this.level == 1) ? 2 : 3; + + // add exit if we're far enough away and don't have one + if (mySpread == maxSpread && !isExitBuildForLevel(parent)) { + Rotation direction = RotationUtil.getRandomRotation(rand); + for (int i = 0; i < 8 && !isExitBuildForLevel(parent); i++) { + direction = direction.getRotated(RotationUtil.ROTATIONS[i & 3]); + if (this.addDungeonExit(list, rand, direction)) { + this.setExitBuiltForLevel(parent, true); + } + } + } + + // add other rooms + if (mySpread < maxSpread) { + Rotation direction = RotationUtil.getRandomRotation(rand); + for (int i = 0; i < 12; i++) { + direction = direction.getRotated(RotationUtil.ROTATIONS[i & 3]); + this.addDungeonRoom(parent, list, rand, direction, this.level); + } + } + } + + private boolean isExitBuildForLevel(StructurePiece parent) { + if (parent instanceof FinalCastleDungeonEntranceComponent) { + return ((FinalCastleDungeonEntranceComponent) parent).hasExit; + } + return false; + } + + private void setExitBuiltForLevel(StructurePiece parent, boolean exit) { + if (parent instanceof FinalCastleDungeonEntranceComponent) { + ((FinalCastleDungeonEntranceComponent) parent).hasExit = exit; + } + } + + protected boolean addDungeonRoom(StructurePiece parent, StructurePieceAccessor list, RandomSource rand, Rotation rotation, int level) { + rotation = rotation.getRotated(this.rotation); + + BlockPos rc = this.getNewRoomCoords(rand, rotation); + + FinalCastleDungeonRoom31Component dRoom = new FinalCastleDungeonRoom31Component(TFStructurePieceTypes.TFFCDunR31.get(), this.genDepth + 1, rc.getX(), rc.getY(), rc.getZ(), rotation.rotate(Direction.SOUTH), level); + + BoundingBox largerBB = BoundingBoxUtils.clone(dRoom.getBoundingBox()); + + if (list instanceof StructurePiecesBuilder start) { + StructurePiece intersect = TFStructureComponentOld.findIntersectingExcluding(start.pieces, largerBB, this); + if (intersect == null) { + list.addPiece(dRoom); + dRoom.addChildren(parent, list, rand); + return true; + } + } + return false; + } + + protected boolean addDungeonExit(StructurePieceAccessor list, RandomSource rand, Rotation rotation) { + + //TODO: check if we are sufficiently near the castle center + + rotation = rotation.getRotated(this.rotation); + BlockPos rc = this.getNewRoomCoords(rand, rotation); + FinalCastleDungeonExitComponent dRoom = new FinalCastleDungeonExitComponent(this.genDepth + 1, rc.getX(), rc.getY(), rc.getZ(), rotation.rotate(Direction.SOUTH), this.level); + if (list instanceof StructurePiecesBuilder start) { + StructurePiece intersect = TFStructureComponentOld.findIntersectingExcluding(start.pieces, dRoom.getBoundingBox(), this); + if (intersect == null) { + list.addPiece(dRoom); + dRoom.addChildren(this, list, rand); + return true; + } + } + return false; + } + + private BlockPos getNewRoomCoords(RandomSource rand, Rotation rotation) { + // make the rooms connect around the corners, not the centers + int offset = rand.nextInt(15) - 9; + if (rand.nextBoolean()) { + offset += this.size; + } + + return switch (rotation) { + case CLOCKWISE_90 -> new BlockPos(this.boundingBox.minX() + offset, this.boundingBox.minY(), this.boundingBox.maxZ() + 9); + case CLOCKWISE_180 -> new BlockPos(this.boundingBox.minX() - 9, this.boundingBox.minY(), this.boundingBox.minZ() + offset); + case COUNTERCLOCKWISE_90 -> new BlockPos(this.boundingBox.minX() + offset, this.boundingBox.minY(), this.boundingBox.minZ() - 9); + default -> new BlockPos(this.boundingBox.maxX() + 9, this.boundingBox.minY(), this.boundingBox.minZ() + offset); + }; + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + Predicate plateauBiomes = biome -> + biome == world.registryAccess().registryOrThrow(Registries.BIOME).get(TFBiomes.THORNLANDS) || + biome == world.registryAccess().registryOrThrow(Registries.BIOME).get(TFBiomes.FINAL_PLATEAU); + + if (this.isBoundingBoxOutsideBiomes(world, plateauBiomes)) { + return; + } + + RandomSource decoRNG = RandomSource.create(world.getSeed() + (this.boundingBox.minX() * 321534781L) ^ (this.boundingBox.minZ() * 756839L)); + + this.fillWithAir(world, sbb, 0, 0, 0, this.size - 1, this.height - 1, this.size - 1, state -> state.getMaterial() == Material.STONE); + + BlockState floor = TFBlocks.CASTLE_BRICK.get().defaultBlockState(); + BlockState border = TFBlocks.THICK_CASTLE_BRICK.get().defaultBlockState(); + + Predicate replacing = state -> { + Material material = state.getMaterial(); + return material == Material.STONE || material == Material.AIR; + }; + + final int cs = 7; + + this.fillWithBlocks(world, sbb, cs , -1, cs, this.size - 1 - cs, -1, this.size - 1 - cs, border, floor, replacing); + this.fillWithBlocks(world, sbb, cs , this.height, cs, this.size - 1 - cs, this.height, this.size - 1 - cs, border, floor, replacing); + + BlockState forceField = getForceFieldColor(decoRNG); + BlockState castleMagic = getRuneColor(forceField); + + for (Rotation rotation : RotationUtil.ROTATIONS) { + + this.fillBlocksRotated(world, sbb, cs, 0, cs + 1, cs, this.height - 1, this.size - 2 - cs, forceField, rotation); + // verticals + for (int z = cs; z < ((this.size - 1) - cs); z += 4) { + + this.fillBlocksRotated(world, sbb, cs, 0, z, cs, this.height - 1, z, castleMagic, rotation); + // horizontals + int y = ((z - cs) % 8 == 0) ? decoRNG.nextInt(3) : decoRNG.nextInt(3) + 4; + this.fillBlocksRotated(world, sbb, cs, y, z + 1, cs, y, z + 3, castleMagic, rotation); + } + } + } + + protected BlockState getRuneColor(BlockState forceFieldColor) { + return forceFieldColor.is(TFBlocks.GREEN_FORCE_FIELD.get()) ? TFBlocks.YELLOW_CASTLE_RUNE_BRICK.get().defaultBlockState() : TFBlocks.BLUE_CASTLE_RUNE_BRICK.get().defaultBlockState(); + } + + protected BlockState getForceFieldColor(RandomSource decoRNG) { + int i = decoRNG.nextInt(2) + 3; + + if (i == 3) + return TFBlocks.GREEN_FORCE_FIELD.get().defaultBlockState(); + else + return TFBlocks.BLUE_FORCE_FIELD.get().defaultBlockState(); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleDungeonStepsComponent.java b/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleDungeonStepsComponent.java new file mode 100644 index 0000000000..83399a3958 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleDungeonStepsComponent.java @@ -0,0 +1,120 @@ +package twilightforest.world.components.structures.finalcastle; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.StairBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFStructurePieceTypes; +import twilightforest.world.components.structures.TFStructureComponentOld; + + +public class FinalCastleDungeonStepsComponent extends TFStructureComponentOld { + + public FinalCastleDungeonStepsComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFFCDunSt.get(), nbt); + } + + public FinalCastleDungeonStepsComponent(int i, int x, int y, int z, Direction rotation) { + super(TFStructurePieceTypes.TFFCDunSt.get(), i, x, y, z); + this.spawnListIndex = 2; // dungeon monsters + + this.setOrientation(rotation); + this.boundingBox = TFStructureComponentOld.getComponentToAddBoundingBox2(x, y, z, -2, -15, -3, 5, 15, 20, rotation); + } + + @Override + public void addChildren(StructurePiece parent, StructurePieceAccessor list, RandomSource rand) { + if (parent != null && parent instanceof TFStructureComponentOld) { + this.deco = ((TFStructureComponentOld) parent).deco; + } + } + + /** + * build more steps towards the specified direction + */ + public FinalCastleDungeonStepsComponent buildMoreStepsTowards(StructurePieceAccessor list, RandomSource rand, Rotation rotation) { + + Direction direction = getStructureRelativeRotation(rotation); + + int sx = 2; + int sy = 0; + int sz = 17; + + switch (rotation) { + case NONE -> sz -= 5; + case CLOCKWISE_90 -> sx -= 5; + case CLOCKWISE_180 -> sz += 5; + case COUNTERCLOCKWISE_90 -> sx += 6; + } + + // find center of landing + int dx = this.getWorldX(sx, sz); + int dy = this.getWorldY(sy); + int dz = this.getWorldZ(sx, sz); + + + // build a new stairway there + FinalCastleDungeonStepsComponent steps = new FinalCastleDungeonStepsComponent(this.genDepth + 1, dx, dy, dz, direction); + list.addPiece(steps); + steps.addChildren(this, list, rand); + + return steps; + } + + /** + * build a new level under the exit + */ + public FinalCastleDungeonEntranceComponent buildLevelUnder(StructurePieceAccessor list, RandomSource rand, int level) { + // find center of landing + int dx = this.getWorldX(2, 19); + int dy = this.getWorldY(-7); + int dz = this.getWorldZ(2, 19); + + // build a new dungeon level under there + FinalCastleDungeonEntranceComponent room = new FinalCastleDungeonEntranceComponent(8, dx, dy, dz, getOrientation(), level); + list.addPiece(room); + room.addChildren(this, list, rand); + + return room; + } + + /** + * build the boss room + */ + public FinalCastleDungeonForgeRoomComponent buildBossRoomUnder(StructurePieceAccessor list, RandomSource rand) { + // find center of landing + int dx = this.getWorldX(2, 19); + int dy = this.getWorldY(-31); + int dz = this.getWorldZ(2, 19); + + // build a new dungeon level under there + FinalCastleDungeonForgeRoomComponent room = new FinalCastleDungeonForgeRoomComponent(8, dx, dy, dz, this.getOrientation()); + list.addPiece(room); + room.addChildren(this, list, rand); + + return room; + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + final BlockState stairState = deco.stairState.setValue(StairBlock.FACING, Direction.SOUTH); + for (int z = 0; z < 15; z++) { + int y = 14 - z; + + this.generateBox(world, sbb, 0, y, z, 4, y, z, stairState, stairState, false); + this.generateAirBox(world, sbb, 0, y + 1, z, 4, y + 6, z); + } + this.generateAirBox(world, sbb, 0, 0, 15, 4, 5, 19); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleEntranceBottomTowerComponent.java b/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleEntranceBottomTowerComponent.java new file mode 100644 index 0000000000..694edf12b3 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleEntranceBottomTowerComponent.java @@ -0,0 +1,64 @@ +package twilightforest.world.components.structures.finalcastle; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePiecesBuilder; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFStructurePieceTypes; +import twilightforest.world.components.structures.TFStructureComponentOld; + + +public class FinalCastleEntranceBottomTowerComponent extends FinalCastleMazeTower13Component { + + public FinalCastleEntranceBottomTowerComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFFCEnBoTo.get(), nbt); + } + + public FinalCastleEntranceBottomTowerComponent(int i, int x, int y, int z, int floors, int entranceFloor, Direction direction) { + super(TFStructurePieceTypes.TFFCEnBoTo.get(), i, x, y, z, floors, entranceFloor, TFBlocks.YELLOW_CASTLE_RUNE_BRICK.get().defaultBlockState(), direction); + + } + + @Override + public void addChildren(StructurePiece parent, StructurePieceAccessor list, RandomSource rand) { + if (parent != null && parent instanceof TFStructureComponentOld) { + this.deco = ((TFStructureComponentOld) parent).deco; + } + + // stairs + addStairs(list, rand, this.getGenDepth() + 1, this.size - 1, 1, size / 2, Rotation.NONE); + addStairs(list, rand, this.getGenDepth() + 1, 0, 1, size / 2, Rotation.CLOCKWISE_180); + addStairs(list, rand, this.getGenDepth() + 1, this.size / 2, 1, 0, Rotation.COUNTERCLOCKWISE_90); + addStairs(list, rand, this.getGenDepth() + 1, this.size / 2, 1, this.size - 1, Rotation.CLOCKWISE_90); + } + + /** + * Add some stairs leading to this tower + */ + private boolean addStairs(StructurePieceAccessor list, RandomSource rand, int index, int x, int y, int z, Rotation rotation) { + // add door + this.addOpening(x, y, z, rotation); + + Direction direction = getStructureRelativeRotation(rotation); + BlockPos dx = offsetTowerCCoords(x, y, z, 0, direction); + + FinalCastleEntranceStairsComponent stairs = new FinalCastleEntranceStairsComponent(index, dx.getX(), dx.getY(), dx.getZ(), direction); + + list.addPiece(stairs); + if (list instanceof StructurePiecesBuilder start) { + stairs.addChildren(start.pieces.get(0), list, rand); + } + return true; + } + + @Override + protected boolean hasAccessibleRoof() { + return false; + } +} diff --git a/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleEntranceSideTowerComponent.java b/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleEntranceSideTowerComponent.java new file mode 100644 index 0000000000..c974dbd0ab --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleEntranceSideTowerComponent.java @@ -0,0 +1,43 @@ +package twilightforest.world.components.structures.finalcastle; + +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFStructurePieceTypes; +import twilightforest.world.components.structures.TFStructureComponentOld; + + +public class FinalCastleEntranceSideTowerComponent extends FinalCastleMazeTower13Component { + + public FinalCastleEntranceSideTowerComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFFCEnSiTo.get(), nbt); + } + + public FinalCastleEntranceSideTowerComponent(int i, int x, int y, int z, int floors, int entranceFloor, Direction direction) { + super(TFStructurePieceTypes.TFFCEnSiTo.get(), i, x, y, z, floors, entranceFloor, TFBlocks.YELLOW_CASTLE_RUNE_BRICK.get().defaultBlockState(), direction); + + addOpening(0, 1, size / 2, Rotation.CLOCKWISE_180); + } + + @Override + public void addChildren(StructurePiece parent, StructurePieceAccessor list, RandomSource rand) { + if (parent != null && parent instanceof TFStructureComponentOld) { + this.deco = ((TFStructureComponentOld) parent).deco; + } + + // add foundation + FinalCastleFoundation13Component foundation = new FinalCastleFoundation13Component(TFStructurePieceTypes.TFFCToF13.get(), 4, this, getLocatorPosition().getX(), getLocatorPosition().getY(), getLocatorPosition().getZ()); + list.addPiece(foundation); + foundation.addChildren(this, list, rand); + + // add roof + TFStructureComponentOld roof = new FinalCastleRoof13PeakedComponent(4, this, getLocatorPosition().getX(), getLocatorPosition().getY(), getLocatorPosition().getZ()); + list.addPiece(roof); + roof.addChildren(this, list, rand); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleEntranceStairsComponent.java b/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleEntranceStairsComponent.java new file mode 100644 index 0000000000..040887597f --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleEntranceStairsComponent.java @@ -0,0 +1,74 @@ +package twilightforest.world.components.structures.finalcastle; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.StairBlock; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFStructurePieceTypes; +import twilightforest.world.components.structures.TFStructureComponentOld; + + +/** + * Stair blocks heading to the entrance tower doors + */ +public class FinalCastleEntranceStairsComponent extends TFStructureComponentOld { + + public FinalCastleEntranceStairsComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFFCEnSt.get(), nbt); + } + + public FinalCastleEntranceStairsComponent(int index, int x, int y, int z, Direction direction) { + super(TFStructurePieceTypes.TFFCEnSt.get(), index, x, y, z); + this.setOrientation(direction); + this.boundingBox = TFStructureComponentOld.getComponentToAddBoundingBox2(x, y, z, 0, -1, -5, 12, 0, 12, direction); + } + + @Override + public void addChildren(StructurePiece parent, StructurePieceAccessor list, RandomSource rand) { + if (parent != null && parent instanceof TFStructureComponentOld) { + this.deco = ((TFStructureComponentOld) parent).deco; + } + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource randomIn, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + int size = 13; + + for (int x = 1; x < size; x++) { + + this.placeStairs(world, sbb, x, 1 - x, 5, Direction.EAST); + + for (int z = 0; z <= x; z++) { + + if (z > 0 && z <= size / 2) { + this.placeStairs(world, sbb, x, 1 - x, 5 - z, Direction.EAST); + this.placeStairs(world, sbb, x, 1 - x, 5 + z, Direction.EAST); + } + + if (x <= size / 2) { + this.placeStairs(world, sbb, z, 1 - x, 5 - x, Direction.NORTH); + this.placeStairs(world, sbb, z, 1 - x, 5 + x, Direction.SOUTH); + } + } + } + + this.fillColumnDown(world, deco.blockState, 0, 0, 5, sbb); + } + + private void placeStairs(WorldGenLevel world, BoundingBox sbb, int x, int y, int z, Direction facing) { + if (this.getBlock(world, x, y, z, sbb).getMaterial().isReplaceable()) { //TODO: Probably doesn't support replaceable blocks + //this.setBlockState(world, deco.blockState, x, y, z, sbb); + this.placeBlock(world, deco.stairState.setValue(StairBlock.FACING, facing), x, y, z, sbb); + this.fillColumnDown(world, deco.blockState, x, y - 1, z, sbb); + } + } +} diff --git a/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleEntranceTowerComponent.java b/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleEntranceTowerComponent.java new file mode 100644 index 0000000000..e99bac5f88 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleEntranceTowerComponent.java @@ -0,0 +1,122 @@ +package twilightforest.world.components.structures.finalcastle; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFStructurePieceTypes; +import twilightforest.util.BoundingBoxUtils; +import twilightforest.world.components.structures.TFStructureComponentOld; + + +public class FinalCastleEntranceTowerComponent extends FinalCastleMazeTower13Component { + + public FinalCastleEntranceTowerComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFFCEnTo.get(), nbt); + } + + public FinalCastleEntranceTowerComponent(int i, int x, int y, int z, Direction direction) { + super(TFStructurePieceTypes.TFFCEnTo.get(), i, x, y, z, 3, 2, TFBlocks.YELLOW_CASTLE_RUNE_BRICK.get().defaultBlockState(), direction); + } + + @Override + public void addChildren(StructurePiece parent, StructurePieceAccessor list, RandomSource rand) { + if (parent != null && parent instanceof TFStructureComponentOld) { + this.deco = ((TFStructureComponentOld) parent).deco; + } + + // add foundation + FinalCastleFoundation13Component foundation = new FinalCastleFoundation13Component(TFStructurePieceTypes.TFFCToF13.get(), 4, this, getLocatorPosition().getX(), getLocatorPosition().getY(), getLocatorPosition().getZ()); + list.addPiece(foundation); + foundation.addChildren(this, list, rand); + + // add roof + TFStructureComponentOld roof = new FinalCastleRoof13PeakedComponent(4, this, getLocatorPosition().getX(), getLocatorPosition().getY(), getLocatorPosition().getZ()); + list.addPiece(roof); + roof.addChildren(this, list, rand); + + // how many floors until the bottom? + int missingFloors = (this.boundingBox.minY() - 127) / 8; + + // place half on the bottom + int bottomFloors = missingFloors / 2; + // how many are left for the middle? + int middleFloors = missingFloors - bottomFloors; + + // what direction can we put the side tower in, if any? + Direction facing = Rotation.CLOCKWISE_90.rotate(this.getOrientation()); + int howFar = 20; + if (!this.buildSideTower(list, rand, middleFloors + 1, facing, howFar)) { + facing = Rotation.COUNTERCLOCKWISE_90.rotate(this.getOrientation()); + if (!this.buildSideTower(list, rand, middleFloors + 1, facing, howFar)) { + facing = Rotation.NONE.rotate(this.getOrientation()); + if (!this.buildSideTower(list, rand, middleFloors + 1, facing, howFar)) { + // side tower no worky + } + } + } + + // add bottom tower + FinalCastleEntranceBottomTowerComponent eTower = new FinalCastleEntranceBottomTowerComponent(this.getGenDepth() + 1, this.boundingBox.minX() + 6, this.boundingBox.minY() - (middleFloors * 8), this.boundingBox.minZ() + 6, bottomFloors + 1, bottomFloors, facing.getOpposite()); + list.addPiece(eTower); + eTower.addChildren(this, list, rand); + + // add bridge to bottom + BlockPos opening = this.getValidOpeningCC(rand, facing); + opening = opening.below(middleFloors * 8); + + BlockPos bc = this.offsetTowerCCoords(opening.getX(), opening.getY(), opening.getZ(), 1, facing); + FinalCastleBridgeComponent bridge = new FinalCastleBridgeComponent(this.getGenDepth() + 1, bc.getX(), bc.getY(), bc.getZ(), howFar - 7, facing); + list.addPiece(bridge); + bridge.addChildren(this, list, rand); + } + + private boolean buildSideTower(StructurePieceAccessor list, RandomSource rand, int middleFloors, Direction facing, int howFar) { + BlockPos opening = this.getValidOpeningCC(rand, facing); + + // build towards + BlockPos tc = this.offsetTowerCCoords(opening.getX(), opening.getY(), opening.getZ(), howFar, facing); + + FinalCastleEntranceSideTowerComponent eTower = new FinalCastleEntranceSideTowerComponent(this.getGenDepth() + 1, tc.getX(), tc.getY(), tc.getZ(), middleFloors, middleFloors - 1, facing); + + BoundingBox largerBB = BoundingBoxUtils.cloneWithAdjustments(eTower.getBoundingBox(), -6, 0, -6, 6, 0, 6); + + StructurePiece intersect = list.findCollisionPiece(largerBB); + + if (intersect == null) { + list.addPiece(eTower); + eTower.addChildren(this, list, rand); + // add bridge + BlockPos bc = this.offsetTowerCCoords(opening.getX(), opening.getY(), opening.getZ(), 1, facing); + FinalCastleBridgeComponent bridge = new FinalCastleBridgeComponent(this.getGenDepth() + 1, bc.getX(), bc.getY(), bc.getZ(), howFar - 7, facing); + list.addPiece(bridge); + bridge.addChildren(this, list, rand); + + // opening + addOpening(opening.getX(), opening.getY() + 1, opening.getZ(), facing); + + return true; + } else { + //TwilightForestMod.LOGGER.info("side entrance tower blocked"); + return false; + } + + } + + /** + * Gets a random position in the specified direction that connects to a floor currently in the tower. + */ + @Override + public BlockPos getValidOpeningCC(RandomSource rand, Direction facing) { + BlockPos opening = super.getValidOpeningCC(rand, facing); + return new BlockPos(opening.getX(), 0, opening.getZ()); + } + + +} diff --git a/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleFoundation13Component.java b/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleFoundation13Component.java new file mode 100644 index 0000000000..c1728cb5f2 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleFoundation13Component.java @@ -0,0 +1,84 @@ +package twilightforest.world.components.structures.finalcastle; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFStructurePieceTypes; +import twilightforest.util.RotationUtil; +import twilightforest.world.components.structures.TFStructureComponentOld; + +import java.util.function.Predicate; + +public class FinalCastleFoundation13Component extends TFStructureComponentOld { + + protected int groundLevel = -1; + + public FinalCastleFoundation13Component(StructurePieceSerializationContext ctx, CompoundTag nbt) { + this(TFStructurePieceTypes.TFFCToF13.get(), nbt); + } + + public FinalCastleFoundation13Component(StructurePieceType piece, CompoundTag nbt) { + super(piece, nbt); + } + + public FinalCastleFoundation13Component(StructurePieceType type, int i, TFStructureComponentOld sideTower, int x, int y, int z) { + super(type, i, x, y, z); + + this.setOrientation(sideTower.getOrientation()); + this.boundingBox = new BoundingBox(sideTower.getBoundingBox().minX() - 2, sideTower.getBoundingBox().minY() - 1, sideTower.getBoundingBox().minZ() - 2, sideTower.getBoundingBox().minX() + 2, sideTower.getBoundingBox().minY(), sideTower.getBoundingBox().maxZ() + 2); + } + + @Override + public void addChildren(StructurePiece parent, StructurePieceAccessor list, RandomSource rand) { + if (parent instanceof TFStructureComponentOld) { + this.deco = ((TFStructureComponentOld) parent).deco; + } + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource randomIn, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + // offset bounding box to average ground level + if (this.groundLevel < 0) { + this.groundLevel = this.findGroundLevel(world, sbb, 150, isDeadrock); // is 150 a good place to start? :) + + if (this.groundLevel < 0) { + return; + } + } + + // how tall are we + int height = this.boundingBox.maxY() - this.groundLevel; + int mid = height / 2; + + // assume square + int size = this.boundingBox.maxX() - this.boundingBox.minX(); + + for (Rotation rotation : RotationUtil.ROTATIONS) { + // do corner + this.replaceAirAndLiquidDownwardsRotated(world, deco.blockState, 1, -1, 1, rotation, sbb); + this.replaceAirAndLiquidDownwardsRotated(world, deco.blockState, 2, -1, 1, rotation, sbb); + this.replaceAirAndLiquidDownwardsRotated(world, deco.blockState, 2, -mid, 0, rotation, sbb); + this.replaceAirAndLiquidDownwardsRotated(world, deco.blockState, 1, -1, 2, rotation, sbb); + this.replaceAirAndLiquidDownwardsRotated(world, deco.blockState, 0, -mid, 2, rotation, sbb); + + for (int x = 6; x < (size - 3); x += 4) { + this.replaceAirAndLiquidDownwardsRotated(world, deco.blockState, x, -1, 1, rotation, sbb); + this.replaceAirAndLiquidDownwardsRotated(world, deco.blockState, x, -mid, 0, rotation, sbb); + } + } + } + + protected static final Predicate isDeadrock = state -> state.getBlock() == TFBlocks.DEADROCK.get(); +} diff --git a/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleFoundation13ComponentThorns.java b/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleFoundation13ComponentThorns.java new file mode 100644 index 0000000000..dd67b895b7 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleFoundation13ComponentThorns.java @@ -0,0 +1,146 @@ +package twilightforest.world.components.structures.finalcastle; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.RotatedPillarBlock; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFStructurePieceTypes; +import twilightforest.util.RotationUtil; +import twilightforest.world.components.structures.TFStructureComponentOld; + + +/** + * Foundation that makes thorns go all through the tower + * + * @author benma_000 + */ +public class FinalCastleFoundation13ComponentThorns extends FinalCastleFoundation13Component { + + public FinalCastleFoundation13ComponentThorns(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFFCFTh21.get(), nbt); + } + + public FinalCastleFoundation13ComponentThorns(int i, TFStructureComponentOld sideTower, int x, int y, int z) { + super(TFStructurePieceTypes.TFFCFTh21.get(), i, sideTower, x, y, z); + + this.boundingBox = new BoundingBox(sideTower.getBoundingBox().minX() - 5, sideTower.getBoundingBox().maxY() - 1, sideTower.getBoundingBox().minZ() - 5, sideTower.getBoundingBox().maxX() + 5, sideTower.getBoundingBox().maxY(), sideTower.getBoundingBox().maxZ() + 5); + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + // thorns + RandomSource decoRNG = RandomSource.create(world.getSeed() + (this.getBoundingBox().minX() * 321534781L) ^ (this.getBoundingBox().minZ() * 756839L)); + + for (Rotation i : RotationUtil.ROTATIONS) { + this.makeThornVine(world, decoRNG, i, sbb); + } + } + + private void makeThornVine(WorldGenLevel world, RandomSource decoRNG, Rotation rotation, BoundingBox sbb) { + + int x = 3 + decoRNG.nextInt(13); + int z = 3 + decoRNG.nextInt(13); + + int y = this.getBoundingBox().getYSpan() + 5; + + int twist = decoRNG.nextInt(4); + int twistMod = 3 + decoRNG.nextInt(3); + + final BlockState thorns = TFBlocks.BROWN_THORNS.get().defaultBlockState(); + + while (!this.getBlockStateFromPosRotated(world, x, y, z, sbb, rotation).is(TFBlocks.DEADROCK.get()) && this.getWorldY(y) > 90) { + this.setBlockStateRotated(world, thorns, x, y, z, rotation, sbb); + // twist vines around the center block + switch (twist) { + case 0 -> { + this.setBlockStateRotated(world, thorns, x + 1, y, z, rotation, sbb); + this.setBlockStateRotated(world, thorns, x, y, z + 1, rotation, sbb); + this.setBlockStateRotated(world, thorns, x + 1, y, z + 1, rotation, sbb); + } + case 1 -> { + this.setBlockStateRotated(world, thorns, x + 1, y, z, rotation, sbb); + this.setBlockStateRotated(world, thorns, x, y, z - 1, rotation, sbb); + this.setBlockStateRotated(world, thorns, x + 1, y, z - 1, rotation, sbb); + } + case 2 -> { + this.setBlockStateRotated(world, thorns, x - 1, y, z, rotation, sbb); + this.setBlockStateRotated(world, thorns, x, y, z - 1, rotation, sbb); + this.setBlockStateRotated(world, thorns, x - 1, y, z - 1, rotation, sbb); + } + case 3 -> { + this.setBlockStateRotated(world, thorns, x - 1, y, z, rotation, sbb); + this.setBlockStateRotated(world, thorns, x, y, z + 1, rotation, sbb); + this.setBlockStateRotated(world, thorns, x - 1, y, z + 1, rotation, sbb); + } + } + + if (Math.abs(y % twistMod) == 1) { + // make branch + this.makeThornBranch(world, x, y, z, rotation, sbb); + } + + // twist randomly + if (y % twistMod == 0) { + twist++; + twist = twist % 4; + } + y--; + } + } + + private void makeThornBranch(WorldGenLevel world, int x, int y, int z, Rotation rotation, BoundingBox sbb) { + RandomSource rand = RandomSource.create(world.getSeed() + (x * 321534781L) ^ (y * 756839L) + z); + + // pick a direction + Rotation dir = RotationUtil.getRandomRotation(rand); + + // initialize direction variables + int dx = 0; + int dz = 0; + + switch (dir) { + case NONE -> dx = 1; + case CLOCKWISE_90 -> dz = 1; + case CLOCKWISE_180 -> dx = -1; + case COUNTERCLOCKWISE_90 -> dz = -1; + } + + // how far do we branch? + int dist = 2 + rand.nextInt(3); + + // check to make sure there's room + int destX = x + (dist * dx); + int destZ = z + (dist * dz); + + if (destX > 0 && destX < this.getBoundingBox().getXSpan() && destZ > 0 && destZ < this.getBoundingBox().getZSpan()) { + for (int i = 0; i < dist; i++) { + // go out that far + final Rotation add = dir.getRotated(rotation).getRotated(this.getRotation()); + BlockState thorns = TFBlocks.GREEN_THORNS.get().defaultBlockState() + .setValue( + RotatedPillarBlock.AXIS, + add == Rotation.NONE || add == Rotation.CLOCKWISE_180 ? Direction.Axis.X : Direction.Axis.Z + ); + if (i > 0) { + this.setBlockStateRotated(world, thorns, x + (dx * i), y, z + (dz * i), rotation, sbb); + } + // go up that far + this.setBlockStateRotated(world, thorns.setValue(RotatedPillarBlock.AXIS, Direction.Axis.Y), destX, y + i, destZ, rotation, sbb); + // go back half that far + if (i > (dist / 2)) { + this.setBlockStateRotated(world, thorns, x + (dx * i), y + dist - 1, z + (dz * i), rotation, sbb); + } + } + } + } +} diff --git a/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleFoundation48Component.java b/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleFoundation48Component.java new file mode 100644 index 0000000000..5516826d2f --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleFoundation48Component.java @@ -0,0 +1,85 @@ +package twilightforest.world.components.structures.finalcastle; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFStructurePieceTypes; +import twilightforest.util.RotationUtil; +import twilightforest.world.components.structures.TFStructureComponentOld; + + +public class FinalCastleFoundation48Component extends TFStructureComponentOld { + + public FinalCastleFoundation48Component(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFFCToF48.get(), nbt); + } + + public FinalCastleFoundation48Component(int i, TFStructureComponentOld sideTower, int x, int y, int z) { + super(TFStructurePieceTypes.TFFCToF48.get(), i, x, y, z); + + this.setOrientation(sideTower.getOrientation()); + this.boundingBox = new BoundingBox(sideTower.getBoundingBox().minX(), sideTower.getBoundingBox().minY(), sideTower.getBoundingBox().minZ(), sideTower.getBoundingBox().maxX(), sideTower.getBoundingBox().maxY() - 1, sideTower.getBoundingBox().maxZ()); + } + + @Override + public void addChildren(StructurePiece parent, StructurePieceAccessor list, RandomSource rand) { + if (parent != null && parent instanceof TFStructureComponentOld) { + this.deco = ((TFStructureComponentOld) parent).deco; + } + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource randomIn, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + // foundation + for (int x = 4; x < 45; x++) { + for (int z = 4; z < 45; z++) { + this.fillColumnDown(world, deco.blockState, x, -1, z, sbb); + } + } + + int mid = 16; + for (Rotation rotation : RotationUtil.ROTATIONS) { + // do corner + this.replaceAirAndLiquidDownwardsRotated(world, deco.blockState, 3, -2, 3, rotation, sbb); + + // directly under castle + this.fillBlocksRotated(world, sbb, 2, -2, 1, 46, -1, 1, deco.blockState, rotation); + this.fillBlocksRotated(world, sbb, 2, -4, 2, 45, -1, 2, deco.blockState, rotation); + this.fillBlocksRotated(world, sbb, 4, -6, 3, 44, -1, 3, deco.blockState, rotation); + + // pilings + for (int i = 9; i < 45; i += 6) { + makePiling(world, sbb, mid, rotation, i); + } + + makePiling(world, sbb, mid, rotation, 4); + makePiling(world, sbb, mid, rotation, 44); + } + + // add supports for entrance bridge + this.replaceAirAndLiquidDownwardsRotated(world, deco.blockState, 21, -2, 0, Rotation.CLOCKWISE_90, sbb); + this.replaceAirAndLiquidDownwardsRotated(world, deco.blockState, 21, -4, 1, Rotation.CLOCKWISE_90, sbb); + this.replaceAirAndLiquidDownwardsRotated(world, deco.blockState, 21, -6, 2, Rotation.CLOCKWISE_90, sbb); + this.replaceAirAndLiquidDownwardsRotated(world, deco.blockState, 27, -2, 0, Rotation.CLOCKWISE_90, sbb); + this.replaceAirAndLiquidDownwardsRotated(world, deco.blockState, 27, -4, 1, Rotation.CLOCKWISE_90, sbb); + this.replaceAirAndLiquidDownwardsRotated(world, deco.blockState, 27, -6, 2, Rotation.CLOCKWISE_90, sbb); + } + + private void makePiling(WorldGenLevel world, BoundingBox sbb, int mid, Rotation rotation, int i) { + this.replaceAirAndLiquidDownwardsRotated(world, deco.blockState, i, -7, 3, rotation, sbb); + this.replaceAirAndLiquidDownwardsRotated(world, deco.blockState, i, -mid, 2, rotation, sbb); + + this.setBlockStateRotated(world, deco.blockState, i, -1, 0, rotation, sbb); + this.setBlockStateRotated(world, deco.blockState, i, -3, 1, rotation, sbb); + this.setBlockStateRotated(world, deco.blockState, i, -5, 2, rotation, sbb); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleLargeTowerComponent.java b/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleLargeTowerComponent.java new file mode 100644 index 0000000000..14e77763b7 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleLargeTowerComponent.java @@ -0,0 +1,77 @@ +package twilightforest.world.components.structures.finalcastle; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFBlocks; +import twilightforest.world.components.structures.TFStructureComponentOld; +import twilightforest.world.components.structures.lichtower.TowerWingComponent; +import twilightforest.init.TFLandmark; +import twilightforest.init.TFStructurePieceTypes; + + +public class FinalCastleLargeTowerComponent extends TowerWingComponent { + + public FinalCastleLargeTowerComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFFCLaTo.get(), nbt); + } + + public FinalCastleLargeTowerComponent(int i, int x, int y, int z, Direction rotation) { + super(TFStructurePieceTypes.TFFCLaTo.get(), i, x, y, z); + this.setOrientation(rotation); + this.size = 13; + this.height = 61; + this.boundingBox = TFLandmark.getComponentToAddBoundingBox(x, y, z, -6, 0, -6, 12, 60, 12, Direction.SOUTH, false); + + } + + @Override + public void addChildren(StructurePiece parent, StructurePieceAccessor list, RandomSource rand) { + if (parent != null && parent instanceof TFStructureComponentOld) { + this.deco = ((TFStructureComponentOld) parent).deco; + } + // add crown + FinalCastleRoof9CrenellatedComponent roof = new FinalCastleRoof9CrenellatedComponent(4, this, getLocatorPosition().getX(), getLocatorPosition().getY(), getLocatorPosition().getZ()); + list.addPiece(roof); + roof.addChildren(this, list, rand); + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + RandomSource decoRNG = RandomSource.create(world.getSeed() + (this.boundingBox.minX() * 321534781L) ^ (this.boundingBox.minZ() * 756839L)); + + generateBox(world, sbb, 0, 0, 0, 12, 59, 12, false, rand, deco.randomBlocks); + + // add branching runes + int numBranches = 6 + decoRNG.nextInt(4); + for (int i = 0; i < numBranches; i++) { + makeGlyphBranches(world, decoRNG, this.getGlyphMeta(), sbb); + } + + // beard + for (int i = 1; i < 4; i++) { + generateBox(world, sbb, i, -(i * 2), i, 8 - i, 1 - (i * 2), 8 - i, false, rand, deco.randomBlocks); + } + this.placeBlock(world, deco.blockState, 4, -7, 4, sbb); + + // door, first floor + final BlockState castleDoor = TFBlocks.YELLOW_CASTLE_DOOR.get().defaultBlockState(); + this.generateBox(world, sbb, 0, 1, 1, 0, 4, 3, castleDoor, AIR, false); + + this.placeSignAtCurrentPosition(world, 6, 1, 6, "Parkour area 1", "Unique monster?", sbb); + } + + public BlockState getGlyphMeta() { + return TFBlocks.BLUE_CASTLE_RUNE_BRICK.get().defaultBlockState(); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleMainComponent.java b/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleMainComponent.java new file mode 100644 index 0000000000..bcc9aa339f --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleMainComponent.java @@ -0,0 +1,349 @@ +package twilightforest.world.components.structures.finalcastle; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePiecesBuilder; +import twilightforest.init.TFBlocks; +import twilightforest.util.LegacyLandmarkPlacements; +import twilightforest.util.RotationUtil; +import twilightforest.world.components.structures.TFStructureComponentOld; +import twilightforest.init.TFLandmark; +import twilightforest.init.TFStructurePieceTypes; + +import java.util.LinkedList; +import java.util.List; + + +public class FinalCastleMainComponent extends TFStructureComponentOld { + + public FinalCastleMainComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFFCMain.get(), nbt); + } + + public FinalCastleMainComponent(int i, int x, int y, int z) { + super(TFStructurePieceTypes.TFFCMain.get(), i, x, y, z); + this.setOrientation(Direction.SOUTH); + this.spawnListIndex = 1; // main monsters + + x = ((x + 127) >> 8) << 8; + z = ((z + 127) >> 8) << 8; + + this.boundingBox = TFLandmark.getComponentToAddBoundingBox(x, y, z, -24, 120, -24, 48, 40, 48, Direction.SOUTH, false); + + BlockPos cc = LegacyLandmarkPlacements.getNearestCenterXZ(x >> 4, z >> 4); + + int cx = (x >> 8) << 8; + int cz = (z >> 8) << 8; + + //TwilightForestMod.LOGGER.debug("Making castle at {}, {}. center is {}, {}", x, z, cc.getX(), cc.getZ()); + //TwilightForestMod.LOGGER.debug("Natural center at {}, {}", cx, cz); + + // decorator + if (this.deco == null) { + this.deco = new StructureTFDecoratorCastle(); + } + } + + @Override + public void addChildren(StructurePiece parent, StructurePieceAccessor list, RandomSource rand) { + // add foundation + FinalCastleFoundation48Component foundation = new FinalCastleFoundation48Component(4, this, getLocatorPosition().getX(), getLocatorPosition().getY(), getLocatorPosition().getZ()); + list.addPiece(foundation); + foundation.addChildren(this, list, rand); + + // add roof + TFStructureComponentOld roof = new FinalCastleRoof48CrenellatedComponent(4, this, getLocatorPosition().getX(), getLocatorPosition().getY(), getLocatorPosition().getZ()); + list.addPiece(roof); + roof.addChildren(this, list, rand); + + // boss gazebo on roof + TFStructureComponentOld gazebo = new FinalCastleBossGazeboComponent(5, this, getLocatorPosition().getX(), getLocatorPosition().getY(), getLocatorPosition().getZ()); + list.addPiece(gazebo); + gazebo.addChildren(this, list, rand); + + + // build 4 towers on sides + FinalCastleStairTowerComponent tower0 = new FinalCastleStairTowerComponent(3, boundingBox.minX(), boundingBox.minY() + 3, boundingBox.minZ(), Direction.NORTH); + list.addPiece(tower0); + tower0.addChildren(this, list, rand); + + FinalCastleLargeTowerComponent tower1 = new FinalCastleLargeTowerComponent(3, boundingBox.maxX(), boundingBox.minY() + 3, boundingBox.minZ(), Direction.EAST); + list.addPiece(tower1); + tower1.addChildren(this, list, rand); + + FinalCastleStairTowerComponent tower2 = new FinalCastleStairTowerComponent(3, boundingBox.minX(), boundingBox.minY() + 3, boundingBox.maxZ(), Direction.WEST); + list.addPiece(tower2); + tower2.addChildren(this, list, rand); + + FinalCastleStairTowerComponent tower3 = new FinalCastleStairTowerComponent(3, boundingBox.maxX(), boundingBox.minY() + 3, boundingBox.maxZ(), Direction.SOUTH); + list.addPiece(tower3); + tower3.addChildren(this, list, rand); + + // tower maze towards entrance + BlockPos dest = new BlockPos(boundingBox.minX() - 4, boundingBox.maxY(), boundingBox.minZ() - 24); + buildTowerMaze(list, rand, 48, 0, 24, 60, Direction.SOUTH, TFBlocks.YELLOW_CASTLE_RUNE_BRICK.get().defaultBlockState(), dest); + + + // another tower/bridge maze towards the clock tower + dest = new BlockPos(boundingBox.maxX() + 4, boundingBox.minY(), boundingBox.maxZ() + 24); + buildTowerMaze(list, rand, 0, 30, 24, 60, Direction.NORTH, TFBlocks.BLUE_CASTLE_RUNE_BRICK.get().defaultBlockState(), dest); + + + // initial stairs down towards dungeon + FinalCastleDungeonStepsComponent steps0 = new FinalCastleDungeonStepsComponent(5, boundingBox.minX() + 18, boundingBox.minY() + 1, boundingBox.minZ() + 18, Direction.SOUTH); + list.addPiece(steps0); + steps0.addChildren(this, list, rand); + + // continued steps + FinalCastleDungeonStepsComponent steps1 = steps0.buildMoreStepsTowards(list, rand, Rotation.COUNTERCLOCKWISE_90); + FinalCastleDungeonStepsComponent steps2 = steps1.buildMoreStepsTowards(list, rand, Rotation.COUNTERCLOCKWISE_90); + FinalCastleDungeonStepsComponent steps3 = steps2.buildMoreStepsTowards(list, rand, Rotation.COUNTERCLOCKWISE_90); + + // start dungeon + steps3.buildLevelUnder(list, rand, 1); + + // mural on front + BlockPos mc = this.offsetTowerCCoords(48, 23, 25, 1, Direction.SOUTH); + FinalCastleMuralComponent mural0 = new FinalCastleMuralComponent(7, mc.getX(), mc.getY(), mc.getZ(), 35, 30, Direction.SOUTH); + list.addPiece(mural0); + mural0.addChildren(this, list, rand); + + // mural inside + BlockPos mc1 = this.offsetTowerCCoords(48, 33, 24, -1, Direction.SOUTH); + FinalCastleMuralComponent mural1 = new FinalCastleMuralComponent(7, mc1.getX(), mc1.getY(), mc.getZ(), 19, 12, Direction.NORTH); + list.addPiece(mural1); + mural1.addChildren(this, list, rand); + + } + + /** + * Build a side tower, then tell it to start building towards the destination + */ + private void buildTowerMaze(StructurePieceAccessor list, RandomSource rand, int x, int y, int z, int howFar, Direction direction, BlockState type, BlockPos dest) { + if (list instanceof StructurePiecesBuilder start) { + boolean complete = false; + int iterations = 0; + while (!complete && iterations < 15) { + iterations++; + // duplicate list + List before = new LinkedList<>(start.pieces); + + // build + BlockPos tc = this.offsetTowerCCoords(x, y, z, howFar, direction); + FinalCastleMazeTower13Component sTower = new FinalCastleMazeTower13Component(TFStructurePieceTypes.TFFCSiTo.get(), rand, 3, tc.getX(), tc.getY(), tc.getZ(), type, direction); + + // add bridge + BlockPos bc = this.offsetTowerCCoords(x, y, z, 1, direction); + FinalCastleBridgeComponent bridge = new FinalCastleBridgeComponent(this.getGenDepth() + 1, bc.getX(), bc.getY(), bc.getZ(), howFar - 7, direction); + + list.addPiece(bridge); + bridge.addChildren(this, list, rand); + + // don't check if the bounding box is clear, there's either nothing there or we've made a terrible mistake + list.addPiece(sTower); + sTower.buildTowards(this, list, rand, dest); + + // check if we've successfully built the end tower + //TwilightForestMod.LOGGER.debug("Working towards {},{},{}", dest.getX(), dest.getY(), dest.getZ()); + if (this.isMazeComplete(list, type)) { + //TwilightForestMod.LOGGER.debug("Tower maze color {} complete!", type); + complete = true; + } else { + //TwilightForestMod.LOGGER.info("Tower maze color {} INCOMPLETE, retrying!", type); + start.pieces.clear(); + start.pieces.addAll(before); + } + } + } + } + + private boolean isMazeComplete(StructurePieceAccessor list, BlockState type) { + if (list instanceof StructurePiecesBuilder start) { + if (start.pieces.size() > 60) { + //TwilightForestMod.LOGGER.warn("Maze of color {} is getting a bit excessive.", ForgeRegistries.BLOCKS.getKey(type.getBlock()).toString()); + } + for (StructurePiece structurecomponent : start.pieces) { + BoundingBox boundingBox = structurecomponent.getBoundingBox(); + int x = (boundingBox.maxX() - boundingBox.minX() / 2) + boundingBox.minX(); + int y = (boundingBox.maxY() - boundingBox.minY() / 2) + boundingBox.minY(); + int z = (boundingBox.maxZ() - boundingBox.minZ() / 2) + boundingBox.minZ(); + //TwilightForestMod.LOGGER.debug("Component {} at {},{},{}", structurecomponent.getClass().getSimpleName(), x, y, z); + if (type == TFBlocks.YELLOW_CASTLE_RUNE_BRICK.get().defaultBlockState() && structurecomponent instanceof FinalCastleEntranceTowerComponent) { + return true; + } + if (type == TFBlocks.BLUE_CASTLE_RUNE_BRICK.get().defaultBlockState() && structurecomponent instanceof FinalCastleBellTower21Component) { + return true; + } + } + } + return false; + } + + /** + * Provides coordinates to make a tower such that it will open into the parent tower at the provided coordinates. + */ + @Override + protected BlockPos offsetTowerCCoords(int x, int y, int z, int howFar, Direction direction) { + + int dx = getWorldX(x, z); + int dy = getWorldY(y); + int dz = getWorldZ(x, z); + + switch (direction) { + case SOUTH -> dx += howFar; + case WEST -> dz += howFar; + case NORTH -> dx -= howFar; + case EAST -> dz -= howFar; + default -> { } + } + + // ugh? + return new BlockPos(dx, dy, dz); + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + // walls + generateBox(world, sbb, 0, 0, 0, 48, 40, 48, false, rand, deco.randomBlocks); + + // 2M + generateBox(world, sbb, 13, 30, 1, 47, 30, 12, false, rand, deco.randomBlocks); + this.generateBox(world, sbb, 13, 31, 12, 36, 31, 12, deco.fenceState, deco.fenceState, false); + generateBox(world, sbb, 13, 30, 36, 47, 30, 47, false, rand, deco.randomBlocks); + this.generateBox(world, sbb, 13, 31, 36, 36, 31, 36, deco.fenceState, deco.fenceState, false); + generateBox(world, sbb, 1, 30, 1, 12, 30, 47, false, rand, deco.randomBlocks); + this.generateBox(world, sbb, 12, 31, 12, 12, 31, 36, deco.fenceState, deco.fenceState, false); + + // second floor stairs to mezzanine + generateBox(world, sbb, 38, 25, 13, 47, 25, 35, false, rand, deco.randomBlocks); + + for (int i = 0; i < 5; i++) { + int y = 30 - i; + + makeMezzTopStairs(world, sbb, y, 10 + i, Direction.SOUTH); + makeMezzTopStairs(world, sbb, y, 38 - i, Direction.NORTH); + + y = 25 - i; + int x = 37 - i; + final BlockState stairState = getStairState(deco.stairState, Direction.WEST, false); + this.generateBox(world, sbb, x, y, 14, x, y, 22, stairState, stairState, false); + this.generateBox(world, sbb, x, y - 1, 14, x, y - 1, 22, deco.blockState, deco.blockState, false); + this.generateBox(world, sbb, x, y, 26, x, y, 34, stairState, stairState, false); + this.generateBox(world, sbb, x, y - 1, 26, x, y - 1, 34, deco.blockState, deco.blockState, false); + } + + // pillars + for (int x = 11; x < 47; x += 12) { + for (int z = 11; z < 47; z += 12) { + this.generateBox(world, sbb, x, 1, z, x + 2, 40, z + 2, deco.pillarState, deco.blockState, false); + + makePillarBase(world, sbb, x, z, 1, false); + makePillarBase(world, sbb, x, z, 19, true); + makePillarBase(world, sbb, x, z, 21, false); + makePillarBase(world, sbb, x, z, 39, true); + } + } + + // side pillars + for (Rotation rotation : RotationUtil.ROTATIONS) { + for (int z = 11; z < 47; z += 12) { + + // no middle pillars on walls with entrances + if (z == 23 && (rotation == Rotation.NONE || rotation == Rotation.CLOCKWISE_180)) { + continue; + } + + this.fillBlocksRotated(world, sbb, 1, 1, z, 1, 40, z + 2, deco.pillarState, rotation); + makeHalfPillarBase(world, sbb, rotation, 1, z, false); + makeHalfPillarBase(world, sbb, rotation, 19, z, true); + makeHalfPillarBase(world, sbb, rotation, 21, z, false); + makeHalfPillarBase(world, sbb, rotation, 39, z, true); + } + } + + // second floor + generateBox(world, sbb, 1, 20, 1, 47, 20, 47, false, rand, deco.randomBlocks); + + // force field around dungeon stairs + BlockState fieldBlock = TFBlocks.PINK_FORCE_FIELD.get().defaultBlockState(); + this.generateBox(world, sbb, 12, 1, 12, 24, 10, 12, fieldBlock, fieldBlock, false); + this.generateBox(world, sbb, 12, 1, 12, 12, 10, 24, fieldBlock, fieldBlock, false); + this.generateBox(world, sbb, 24, 1, 12, 24, 10, 24, fieldBlock, fieldBlock, false); + this.generateBox(world, sbb, 12, 1, 24, 24, 10, 24, fieldBlock, fieldBlock, false); + + fieldBlock = fieldBlock.setValue(BlockStateProperties.AXIS, Direction.Axis.X); + this.generateBox(world, sbb, 13, 10, 12, 23, 10, 24, fieldBlock, fieldBlock, false); + + fieldBlock = fieldBlock.setValue(BlockStateProperties.AXIS, Direction.Axis.Z); + this.generateBox(world, sbb, 12, 10, 12, 12, 10, 24, fieldBlock, fieldBlock, false); + this.generateBox(world, sbb, 24, 10, 12, 24, 10, 24, fieldBlock, fieldBlock, false); + + // doors in dungeon force field + this.generateBox(world, sbb, 17, 1, 12, 19, 4, 12, TFBlocks.PINK_CASTLE_DOOR.get().defaultBlockState(), AIR, false); + this.generateBox(world, sbb, 17, 1, 24, 19, 4, 24, TFBlocks.PINK_CASTLE_DOOR.get().defaultBlockState(), AIR, false); + + // stairs to stair towers + makeSmallTowerStairs(world, sbb, Rotation.NONE); + makeSmallTowerStairs(world, sbb, Rotation.CLOCKWISE_90); + makeSmallTowerStairs(world, sbb, Rotation.COUNTERCLOCKWISE_90); + makeLargeTowerStairs(world, sbb, Rotation.CLOCKWISE_180); + + // door, first floor + this.generateBox(world, sbb, 48, 1, 23, 48, 4, 25, TFBlocks.YELLOW_CASTLE_DOOR.get().defaultBlockState(), AIR, false); + + // door, second floor + this.generateBox(world, sbb, 0, 31, 23, 0, 34, 25, TFBlocks.BLUE_CASTLE_DOOR.get().defaultBlockState(), AIR, false); + } + + private void makeSmallTowerStairs(WorldGenLevel world, BoundingBox sbb, Rotation rotation) { + for (int y = 1; y < 4; y++) { + int z = 40 + y; + this.fillBlocksRotated(world, sbb, 1, 1, z, 4, y, z, deco.blockState, rotation); + + this.fillBlocksRotated(world, sbb, 2, y, z, 3, y, z, getStairState(deco.stairState, Direction.NORTH, false), rotation); + } + } + + private void makeLargeTowerStairs(WorldGenLevel world, BoundingBox sbb, Rotation rotation) { + final BlockState stairState = getStairState(deco.stairState, Direction.NORTH, false); + for (int y = 1; y < 4; y++) { + int z = 38 + y; + this.fillBlocksRotated(world, sbb, 2, 1, z, 6, y, z, deco.blockState, rotation); + this.fillBlocksRotated(world, sbb, 3, y, z, 5, y, z, stairState, rotation); + } + } + + private void makeMezzTopStairs(WorldGenLevel world, BoundingBox sbb, int y, int z, Direction stairMeta) { + final BlockState stairState = getStairState(deco.stairState, stairMeta, false); + this.generateBox(world, sbb, 38, y, z, 46, y, z, stairState, stairState, false); + this.generateBox(world, sbb, 38, y - 1, z, 46, y - 1, z, deco.blockState, deco.blockState, false); + this.generateAirBox(world, sbb, 38, y + 1, z, 46, y + 3, z); + } + + private void makeHalfPillarBase(WorldGenLevel world, BoundingBox sbb, Rotation rotation, int y, int z, boolean isFlipped) { + this.fillBlocksRotated(world, sbb, 2, y, z - 1, 2, y, z + 3, getStairState(deco.stairState, Direction.EAST, isFlipped), rotation); + this.setBlockStateRotated(world, getStairState(deco.stairState, Direction.NORTH, isFlipped), 1, y, z - 1, rotation, sbb); + this.setBlockStateRotated(world, getStairState(deco.stairState, Direction.SOUTH, isFlipped), 1, y, z + 3, rotation, sbb); + } + + private void makePillarBase(WorldGenLevel world, BoundingBox sbb, int x, int z, int y, boolean isFlipped) { + this.generateBox(world, sbb, x, y, z + 3, x + 3, y, z + 3, getStairState(deco.stairState, Direction.SOUTH, isFlipped), AIR, false); + this.generateBox(world, sbb, x - 1, y, z - 1, x + 2, y, z - 1, getStairState(deco.stairState, Direction.NORTH, isFlipped), AIR, false); + + this.generateBox(world, sbb, x + 3, y, z - 1, x + 3, y, z + 2, getStairState(deco.stairState, Direction.EAST, isFlipped), AIR, false); + this.generateBox(world, sbb, x - 1, y, z, x - 1, y, z + 3, getStairState(deco.stairState, Direction.WEST, isFlipped), AIR, false); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleMazeTower13Component.java b/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleMazeTower13Component.java new file mode 100644 index 0000000000..b416133aa6 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleMazeTower13Component.java @@ -0,0 +1,578 @@ +package twilightforest.world.components.structures.finalcastle; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.RegistryAccess; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.core.registries.Registries; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtUtils; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePiecesBuilder; +import twilightforest.TwilightForestMod; +import twilightforest.init.TFBlocks; +import twilightforest.util.BoundingBoxUtils; +import twilightforest.util.RotationUtil; +import twilightforest.world.components.structures.TFStructureComponentOld; +import twilightforest.world.components.structures.lichtower.TowerWingComponent; +import twilightforest.init.TFLandmark; +import twilightforest.init.TFStructurePieceTypes; + +public class FinalCastleMazeTower13Component extends TowerWingComponent { + + public static final int LOWEST_DOOR = 108; + public static final int HIGHEST_DOOR = 186; + + public final BlockState color; + + public FinalCastleMazeTower13Component(StructurePieceType piece, CompoundTag nbt) { + super(piece, nbt); + color = NbtUtils.readBlockState(RegistryAccess.fromRegistryOfRegistries(BuiltInRegistries.REGISTRY).lookupOrThrow(Registries.BLOCK), nbt.getCompound("color")); + } + + public FinalCastleMazeTower13Component(StructurePieceSerializationContext ctx, CompoundTag nbt) { + this(TFStructurePieceTypes.TFFCSiTo.get(), nbt); + } + + public FinalCastleMazeTower13Component(StructurePieceType piece, RandomSource rand, int i, int x, int y, int z, BlockState color, Direction direction) { + super(piece, i, x, y, z); + this.setOrientation(direction); + this.color = color; + this.size = 13; + + // decide a number of floors, 2-5 + int floors = rand.nextInt(3) + 2; + + this.height = floors * 8 + 1; + + // entrance should be on a random floor + int entranceFloor = rand.nextInt(floors); + + // rationalize entrance floor if the tower is going to be too low, put the entrance floor at bottom. Too high, put it at top + if ((y - (entranceFloor * 8)) < LOWEST_DOOR) { + //TwilightForestMod.LOGGER.info("Tower at " + x + ", " + z + " is getting too low, setting entrance to bottom floor."); + entranceFloor = 0; + } + if ((y + ((floors - entranceFloor) * 8)) > HIGHEST_DOOR) { + //TwilightForestMod.LOGGER.info("Tower at " + x + ", " + z + " is getting too high, setting entrance to floor " + (floors - 1) + "."); + entranceFloor = floors - 1; + } + + this.boundingBox = TFLandmark.getComponentToAddBoundingBox(x, y, z, -6, -(entranceFloor * 8), -6, this.size - 1, this.height, this.size - 1, Direction.SOUTH, false); + + // we should have a door where we started + addOpening(0, entranceFloor * 8 + 1, size / 2, Rotation.CLOCKWISE_180); + } + + public FinalCastleMazeTower13Component(StructurePieceType piece, int i, int x, int y, int z, int floors, int entranceFloor, BlockState color, Direction direction) { + super(piece, i, x, y, z); + this.setOrientation(direction); + this.color = color; + this.size = 13; + this.height = floors * 8 + 1; + this.boundingBox = TFLandmark.getComponentToAddBoundingBox(x, y, z, -6, -(entranceFloor * 8), -6, this.size - 1, this.height, this.size - 1, Direction.SOUTH, false); + addOpening(0, entranceFloor * 8 + 1, size / 2, Rotation.CLOCKWISE_180); + } + + @Override + protected void addAdditionalSaveData(StructurePieceSerializationContext ctx, CompoundTag tagCompound) { + super.addAdditionalSaveData(ctx, tagCompound); + tagCompound.put("color", NbtUtils.writeBlockState(color)); + } + + @Override + public void addChildren(StructurePiece parent,StructurePieceAccessor list, RandomSource rand) { + if (parent != null && parent instanceof TFStructureComponentOld) { + this.deco = ((TFStructureComponentOld) parent).deco; + } + + // add foundation + FinalCastleFoundation13Component foundation = new FinalCastleFoundation13Component(TFStructurePieceTypes.TFFCToF13.get(), 4, this, getLocatorPosition().getX(), getLocatorPosition().getY(), getLocatorPosition().getZ()); + list.addPiece(foundation); + foundation.addChildren(this, list, rand); + + // add roof + TFStructureComponentOld roof = rand.nextBoolean() ? new FinalCastleRoof13ConicalComponent(rand, 4, this, getLocatorPosition().getX(), getLocatorPosition().getY(), getLocatorPosition().getZ()) : new FinalCastleRoof13CrenellatedComponent(4, this, getLocatorPosition().getX(), getLocatorPosition().getY(), getLocatorPosition().getZ()); + list.addPiece(roof); + roof.addChildren(this, list, rand); + } + + /** + * Build more components towards the destination + */ + public void buildTowards(StructurePiece parent, StructurePieceAccessor list, RandomSource rand, BlockPos dest) { + // regular building first, adds roof/foundation + this.addChildren(parent, list, rand); + + if (this.getGenDepth() < 20) { + + // are we there? + if (this.isWithinRange(dest.getX(), dest.getZ(), this.boundingBox.minX() + 6, this.boundingBox.minZ() + 6, 30)) { + //TwilightForestMod.LOGGER.debug("We are within range of our destination, building final tower"); + int howFar = 20; + if (!buildEndTowerTowards(list, rand, dest, this.findBestDirectionTowards(dest), howFar)) { + if (!buildEndTowerTowards(list, rand, dest, this.findSecondDirectionTowards(dest), howFar)) { + buildEndTowerTowards(list, rand, dest, this.findThirdDirectionTowards(dest), howFar); + } + } + } else { + + int howFar = 14 + rand.nextInt(24); + Direction facing = this.findBestDirectionTowards(dest); + + // build left or right, not straight if we can help it + if (facing == this.getOrientation() || !buildContinueTowerTowards(list, rand, dest, facing, howFar)) { + facing = this.findSecondDirectionTowards(dest); + if (facing == this.getOrientation() || !buildContinueTowerTowards(list, rand, dest, facing, howFar)) { + facing = this.findThirdDirectionTowards(dest); + if (facing == this.getOrientation() || !buildContinueTowerTowards(list, rand, dest, facing, howFar)) { + // fine, just go straight + buildContinueTowerTowards(list, rand, dest, this.getOrientation(), howFar); + } + } + } + } + } + + // finally, now that the critical path is built, let's add some other towers for atmosphere and complication + this.buildNonCriticalTowers(list, rand); + } + + protected void buildNonCriticalTowers(StructurePieceAccessor list, RandomSource rand) { + // pick a random direction + Direction dir = RotationUtil.getRandomFacing(rand); + Rotation relativeRotation = RotationUtil.getRelativeRotation(this.getOrientation(), dir); + + // if there isn't something in that direction, check if we can add a wrecked tower + if (!this.openingTowards[relativeRotation.ordinal()]) { + if (!buildDamagedTower(list, rand, dir)) { + dir = RotationUtil.getRandomFacing(rand); + if (!buildDamagedTower(list, rand, dir)) { + // maybe just a balcony? + //buildBalconyTowards(list, rand, dir); + } + } + } + } + + private Direction findBestDirectionTowards(BlockPos dest) { + + // center of tower + int cx = this.boundingBox.minX() + 6; + int cz = this.boundingBox.minZ() + 6; + + // difference + int dx = cx - dest.getX(); + int dz = cz - dest.getZ(); + + Direction absoluteDir; + if (Math.abs(dx) > Math.abs(dz)) { + absoluteDir = (dx >= 0) ? Direction.EAST : Direction.WEST; + } else { + absoluteDir = (dz >= 0) ? Direction.SOUTH : Direction.NORTH; + } + + //TwilightForestMod.LOGGER.debug("Determining best direction! center is at {}, {} and dest is at {}. offset is {}, {} so the best absolute direction is {}", cx, cz, dest, dx, dz, absoluteDir); + + return absoluteDir; + } + + private Direction findSecondDirectionTowards(BlockPos dest) { + + // center of tower + int cx = this.boundingBox.minX() + 6; + int cz = this.boundingBox.minZ() + 6; + + // difference + int dx = cx - dest.getX(); + int dz = cz - dest.getZ(); + + Direction absoluteDir; + if (Math.abs(dx) < Math.abs(dz)) { // reversed from findBestDirectionTowards + absoluteDir = (dx >= 0) ? Direction.EAST : Direction.WEST; + } else { + absoluteDir = (dz >= 0) ? Direction.SOUTH : Direction.NORTH; + } + + //TwilightForestMod.LOGGER.debug("Determining second direction! center is at {}, {} and dest is at {}. offset is {}, {} so the best absolute direction is {}", cx, cz, dest, dx, dz, absoluteDir); + + return absoluteDir; + } + + private Direction findThirdDirectionTowards(BlockPos dest) { + Direction first = this.findBestDirectionTowards(dest); + Direction second = this.findSecondDirectionTowards(dest); + + Direction[] cardinals = {Direction.NORTH, Direction.SOUTH, Direction.EAST, Direction.WEST}; + + //TwilightForestMod.LOGGER.debug("Determining third direction! first is {}, and second is {}", first, second); + + for (Direction f : cardinals) { + if (f != first && f != second && f != Rotation.CLOCKWISE_180.rotate(this.getOrientation())) { + return f; + } + } + + // should not get here + return this.getOrientation(); + } + + private boolean buildContinueTowerTowards(StructurePieceAccessor list, RandomSource rand, BlockPos dest, Direction facing, int howFar) { + BlockPos opening = this.getValidOpeningCC(rand, facing); + + // adjust opening towards dest.getY() if we are getting close to dest + int adjustmentRange = 60; + if (this.isWithinRange(dest.getX(), dest.getZ(), this.boundingBox.minX() + 6, this.boundingBox.minZ() + 6, adjustmentRange)) { + opening = new BlockPos( + opening.getX(), + this.adjustOpening(opening.getY(), dest), + opening.getZ() + ); + } + + //TwilightForestMod.LOGGER.debug("original direction is {}", facing); + + // build towards + BlockPos tc = this.offsetTowerCCoords(opening.getX(), opening.getY(), opening.getZ(), howFar, facing); + //TwilightForestMod.LOGGER.debug("Our coord mode is {}, and direction is {}, so our door is going to be at {} and the new tower will appear at {}", this.getCoordBaseMode(), facing, opening, tc); + + // find start + if (list instanceof StructurePiecesBuilder start2) { + StructurePiece start = start2.pieces.get(0); + + int centerX = ((start.getBoundingBox().minX() + 128) >> 8) << 8; + int centerZ = ((start.getBoundingBox().minZ() + 128) >> 8) << 8; + + //TwilightForestMod.LOGGER.debug("Testing range, uncorrected center is at {}, {}", centerX, centerZ); + + if (isWithinRange(centerX, centerZ, tc.getX(), tc.getZ(), 128)) { + + FinalCastleMazeTower13Component sTower = new FinalCastleMazeTower13Component(TFStructurePieceTypes.TFFCSiTo.get(), rand, this.getGenDepth() + 1, tc.getX(), tc.getY(), tc.getZ(), this.color, facing); + + BoundingBox largerBB = new BoundingBox( + sTower.getBoundingBox().minX() - 6, 0, sTower.getBoundingBox().minZ() - 6, + sTower.getBoundingBox().maxX() + 6, 255, sTower.getBoundingBox().maxZ() + 6 + ); + + StructurePiece intersect = list.findCollisionPiece(largerBB); + + if (intersect == null) { + //TwilightForestMod.LOGGER.debug("tower success!"); + list.addPiece(sTower); + sTower.buildTowards(this, list, rand, dest); + + // add bridge + BlockPos bc = this.offsetTowerCCoords(opening.getX(), opening.getY(), opening.getZ(), 1, facing); + FinalCastleBridgeComponent bridge = new FinalCastleBridgeComponent(this.getGenDepth() + 1, bc.getX(), bc.getY(), bc.getZ(), howFar - 7, facing); + list.addPiece(bridge); + bridge.addChildren(this, list, rand); + + // opening + addOpening(opening.getX(), opening.getY() + 1, opening.getZ(), facing); + + return true; + } else { + //TwilightForestMod.LOGGER.info("tower blocked by {}", intersect); + return false; + } + } else { + //TwilightForestMod.LOGGER.info("tower out of range"); + return false; + } + } + return false; + } + + protected boolean buildDamagedTower(StructurePieceAccessor list, RandomSource rand, Direction facing) { + BlockPos opening = this.getValidOpeningCC(rand, facing); + + int howFar = 14 + rand.nextInt(24); + // build towards + BlockPos tc = this.offsetTowerCCoords(opening.getX(), opening.getY(), opening.getZ(), howFar, facing); + + // what color of tower? + FinalCastleMazeTower13Component eTower = makeNewDamagedTower(rand, facing, tc); + + BoundingBox largerBB = BoundingBoxUtils.cloneWithAdjustments(eTower.getBoundingBox(), -6, 0, -6, 6, 0, 6); + + StructurePiece intersect = list.findCollisionPiece(largerBB); + + if (intersect == null) { + //TwilightForestMod.LOGGER.info("wreck tower success! tower is at " + tc.getX() + ", " + tc.getY() + ", " + tc.getZ()); + list.addPiece(eTower); + eTower.addChildren(this, list, rand); + // add bridge + BlockPos bc = this.offsetTowerCCoords(opening.getX(), opening.getY(), opening.getZ(), 1, facing); + FinalCastleBridgeComponent bridge = new FinalCastleBridgeComponent(this.getGenDepth() + 1, bc.getX(), bc.getY(), bc.getZ(), howFar - 7, facing); + list.addPiece(bridge); + bridge.addChildren(this, list, rand); + + // opening + addOpening(opening.getX(), opening.getY() + 1, opening.getZ(), facing); + + return true; + } else { + //TwilightForestMod.LOGGER.info("damaged tower blocked"); + return false; + } + } + + protected FinalCastleMazeTower13Component makeNewDamagedTower(RandomSource rand, Direction facing, BlockPos tc) { + return new FinalCastleDamagedTowerComponent(TFStructurePieceTypes.TFFCDamT.get(), rand, this.getGenDepth() + 1, tc.getX(), tc.getY(), tc.getZ(), facing); + } + + private int adjustOpening(int posY, BlockPos dest) { + int openY = posY; + + int realOpeningY = this.getWorldY(openY); + if (realOpeningY - dest.getY() < 12) { + // if it is too low, move it to the top floor + openY = this.height - 9; + } else if (dest.getY() - realOpeningY < 12) { + // if the opening is too high, move it to the bottom floor + openY = 0; + } + + return openY; + } + + private boolean buildEndTowerTowards(StructurePieceAccessor list, RandomSource rand, BlockPos dest, Direction facing, int howFar) { + BlockPos opening = this.getValidOpeningCC(rand, facing); + opening = new BlockPos( + opening.getX(), + // adjust opening towards dest.getY() + this.adjustOpening(opening.getY(), dest), + opening.getZ() + ); + + // build towards + BlockPos tc = this.offsetTowerCCoords(opening.getX(), opening.getY(), opening.getZ(), howFar, facing); + + //TwilightForestMod.LOGGER.info("Our coord mode is " + this.getCoordBaseMode() + ", and direction is " + direction + ", so our door is going to be at " + opening + " and the new tower will appear at " + tc); + + // what color of tower? + FinalCastleMazeTower13Component eTower; + if (this.color == TFBlocks.YELLOW_CASTLE_RUNE_BRICK.get().defaultBlockState()) { + eTower = new FinalCastleEntranceTowerComponent(this.getGenDepth() + 1, tc.getX(), tc.getY(), tc.getZ(), facing); + } else { + eTower = new FinalCastleBellTower21Component(this.getGenDepth() + 1, tc.getX(), tc.getY(), tc.getZ(), facing); + } + + BoundingBox largerBB = BoundingBoxUtils.cloneWithAdjustments(eTower.getBoundingBox(), -6, 0, -6, 6, 0, 6); + + StructurePiece intersect = list.findCollisionPiece(largerBB); + + if (intersect == null) { + //TwilightForestMod.LOGGER.info("entrance tower success! tower is at " + tc.getX() + ", " + tc.getY() + ", " + tc.getZ() + " and dest is " + dest.getX() + ", " + dest.getY() + ", " + dest.getZ()); + list.addPiece(eTower); + eTower.addChildren(this, list, rand); + // add bridge + BlockPos bc = this.offsetTowerCCoords(opening.getX(), opening.getY(), opening.getZ(), 1, facing); + FinalCastleBridgeComponent bridge = new FinalCastleBridgeComponent(this.getGenDepth() + 1, bc.getX(), bc.getY(), bc.getZ(), howFar - 7, facing); + list.addPiece(bridge); + bridge.addChildren(this, list, rand); + + // opening + addOpening(opening.getX(), opening.getY() + 1, opening.getZ(), facing); + + return true; + } else { + //TwilightForestMod.LOGGER.info("end tower blocked"); + return false; + } + } + + private boolean isWithinRange(int centerX, int centerZ, int posX, int posZ, int range) { + return Math.abs(centerX - posX) < range && Math.abs(centerZ - posZ) < range; + } + + /** + * Gets a random position in the specified direction that connects to a floor currently in the tower. + */ + public BlockPos getValidOpeningCC(RandomSource rand, Direction facing) { + Rotation relative = RotationUtil.getRelativeRotation(this.getOrientation(), facing); + int floors = (this.height / 8); + + // for directions 0 or 2, the wall lies along the z axis + if (relative == Rotation.NONE || relative == Rotation.CLOCKWISE_180) { + int rx = relative == Rotation.NONE ? 12 : 0; + int rz = 6; + int ry = rand.nextInt(floors) * 8; + + return new BlockPos(rx, ry, rz); + } + + // for directions 1 or 3, the wall lies along the x axis + if (relative == Rotation.CLOCKWISE_90 || relative == Rotation.COUNTERCLOCKWISE_90) { + int rx = 6; + int rz = relative == Rotation.CLOCKWISE_90 ? 12 : 0; + int ry = rand.nextInt(floors) * 8; + + return new BlockPos(rx, ry, rz); + } + + return new BlockPos(0, 0, 0); + } + + /** + * Provides coordinates to make a tower such that it will open into the parent tower at the provided coordinates. + */ + @Override + protected BlockPos offsetTowerCCoords(int x, int y, int z, int howFar, Direction direction) { + + int dx = getWorldX(x, z); + int dy = getWorldY(y); + int dz = getWorldZ(x, z); + + switch (direction) { + case SOUTH -> dx += howFar; + case WEST -> dz += howFar; + case NORTH -> dx -= howFar; + case EAST -> dz -= howFar; + default -> { } + } + + // ugh? + return new BlockPos(dx, dy, dz); + } + + @Override + public void postProcess(WorldGenLevel worldIn, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + RandomSource decoRNG = RandomSource.create(worldIn.getSeed() + (this.boundingBox.minX() * 321534781L) ^ (this.boundingBox.minZ() * 756839L)); + + // walls + generateBox(worldIn, sbb, 0, 0, 0, this.size - 1, this.height - 1, this.size - 1, false, rand, deco.randomBlocks); + + // stone to ground + for (int x = 0; x < this.size; x++) { + for (int z = 0; z < this.size; z++) { + this.fillColumnDown(worldIn, deco.blockState, x, -1, z, sbb); + } + } + + // add branching runes + int numBranches = 2 + decoRNG.nextInt(4) + decoRNG.nextInt(3); + for (int i = 0; i < numBranches; i++) { + makeGlyphBranches(worldIn, decoRNG, this.getGlyphMeta(), sbb); + } + + // floors + addFloors(worldIn, sbb); + + // openings + makeOpenings(worldIn, sbb); + } + + public BlockState getGlyphMeta() { + if (color == null) { + TwilightForestMod.LOGGER.warn("Final Castle tower has null for glyph color, this is a bug."); + return TFBlocks.BLUE_CASTLE_RUNE_BRICK.get().defaultBlockState(); + } else { + return color; + } + } + + private void addFloors(WorldGenLevel world, BoundingBox sbb) { + // only add floors up to highest opening + int floors = (this.highestOpening / 8) + 1; + + Rotation rotation = Rotation.CLOCKWISE_90; + for (int i = 1; i < floors; i++) { + this.generateBox(world, sbb, 1, i * 8, 1, 11, i * 8, 11, deco.blockState, deco.blockState, false); + rotation = rotation.getRotated(Rotation.CLOCKWISE_180); + // stairs + addStairsDown(world, sbb, rotation, i * 8); + } + + if (hasAccessibleRoof()) { + // add stairs to roof + addStairsDown(world, sbb, RotationUtil.ROTATIONS[(floors + 2) & 3], this.height - 1); + } + } + + protected boolean hasAccessibleRoof() { + return this.height - this.highestOpening < 9; + } + + private void addStairsDown(WorldGenLevel world, BoundingBox sbb, Rotation rotation, int y) { + // top flight + for (int i = 0; i < 4; i++) { + int sx = 8 - i; + int sy = y - i; + int sz = 9; + + this.setBlockStateRotated(world, getStairState(deco.stairState, Direction.WEST, false), sx, sy, sz, rotation, sbb); + this.setBlockStateRotated(world, deco.blockState, sx, sy - 1, sz, rotation, sbb); + this.setBlockStateRotated(world, getStairState(deco.stairState, Direction.WEST, false), sx, sy, sz - 1, rotation, sbb); + this.setBlockStateRotated(world, deco.blockState, sx, sy - 1, sz - 1, rotation, sbb); + this.fillAirRotated(world, sbb, sx, sy + 1, sz - 1, sx, sy + 3, sz, rotation); + } + // landing + this.fillBlocksRotated(world, sbb, 3, y - 4, 8, 4, y - 4, 9, deco.blockState, rotation); + + // bottom flight + for (int i = 0; i < 4; i++) { + int sx = 4; + int sy = y - i - 4; + int sz = 7 - i; + + this.setBlockStateRotated(world, getStairState(deco.stairState, Direction.NORTH, false), sx, sy, sz, rotation, sbb); + this.setBlockStateRotated(world, deco.blockState, sx, sy - 1, sz, rotation, sbb); + this.setBlockStateRotated(world, getStairState(deco.stairState, Direction.NORTH, false), sx - 1, sy, sz, rotation, sbb); + this.setBlockStateRotated(world, deco.blockState, sx - 1, sy - 1, sz, rotation, sbb); + this.fillAirRotated(world, sbb, sx, sy + 1, sz, sx - 1, sy + 3, sz, rotation); + } + } + + /** + * Make an opening in this tower for a door. + */ + @Override + protected void makeDoorOpening(WorldGenLevel world, int dx, int dy, int dz, BoundingBox sbb) { + // nullify sky light + //nullifySkyLightAtCurrentPosition(world, dx - 3, dy - 1, dz - 3, dx + 3, dy + 3, dz + 3); + + final BlockState doorState = doorColor(); + + // clear the door + if (dx == 0 || dx == size - 1) { + this.generateBox(world, sbb, dx, dy - 1, dz - 2, dx, dy + 4, dz + 2, deco.accentState, AIR, false); + //this.fillWithAir(world, sbb, dx, dy, dz - 1, dx, dy + 3, dz + 1); + this.generateBox(world, sbb, dx, dy, dz - 1, dx, dy + 3, dz + 1, doorState, AIR, false); + } + if (dz == 0 || dz == size - 1) { + this.generateBox(world, sbb, dx - 2, dy - 1, dz, dx + 2, dy + 4, dz, deco.accentState, AIR, false); + //this.fillWithAir(world, sbb, dx - 1, dy, dz, dx + 1, dy + 3, dz); + this.generateBox(world, sbb, dx - 1, dy, dz, dx + 1, dy + 3, dz, doorState, AIR, false); + } + } + + public BlockState doorColor() { + if (color == TFBlocks.PINK_CASTLE_RUNE_BRICK.get().defaultBlockState()) { + return TFBlocks.PINK_CASTLE_DOOR.get().defaultBlockState(); + } + if (color == TFBlocks.BLUE_CASTLE_RUNE_BRICK.get().defaultBlockState()) { + return TFBlocks.BLUE_CASTLE_DOOR.get().defaultBlockState(); + } + if (color == TFBlocks.YELLOW_CASTLE_RUNE_BRICK.get().defaultBlockState()) { + return TFBlocks.YELLOW_CASTLE_DOOR.get().defaultBlockState(); + } + if (color == TFBlocks.VIOLET_CASTLE_RUNE_BRICK.get().defaultBlockState()) { + return TFBlocks.VIOLET_CASTLE_DOOR.get().defaultBlockState(); + } + TwilightForestMod.LOGGER.warn("Couldn't add door to tower, rune color couldn't be read"); + return Blocks.AIR.defaultBlockState(); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleMuralComponent.java b/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleMuralComponent.java new file mode 100644 index 0000000000..015edc6e06 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleMuralComponent.java @@ -0,0 +1,243 @@ +package twilightforest.world.components.structures.finalcastle; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFStructurePieceTypes; +import twilightforest.world.components.structures.TFStructureComponentOld; + + +public class FinalCastleMuralComponent extends TFStructureComponentOld { + + private int height; + private int width; + + // we will model the mural in this byte array + private byte[][] mural; + + public FinalCastleMuralComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFFCMur.get(), nbt); + } + + public FinalCastleMuralComponent(int i, int x, int y, int z, int width, int height, Direction direction) { + super(TFStructurePieceTypes.TFFCMur.get(), i, x, y, z); + this.setOrientation(direction); + this.boundingBox = TFStructureComponentOld.getComponentToAddBoundingBox2(x, y, z, 0, -height / 2, -width / 2, 1, height - 1, width - 1, direction); + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + this.height = this.boundingBox.getYSpan(); + this.width = (this.getOrientation() == Direction.SOUTH || this.getOrientation() == Direction.NORTH) ? this.boundingBox.getZSpan() : this.boundingBox.getXSpan(); + + RandomSource decoRNG = RandomSource.create(world.getSeed() + (this.boundingBox.minX() * 321534781L) ^ (this.boundingBox.minZ() * 756839L)); + + if (mural == null) { + // only make it once + mural = new byte[width][height]; + + int startX = width / 2 - 1; + int startY = 2; + + // make mural, fill in dot by start + for (int x = -1; x < 2; x++) { + for (int y = -1; y < 2; y++) { + mural[startX + x][startY + y] = 1; + } + } + + // side branches + makeHorizontalTree(decoRNG, mural, startX + 1, startY, decoRNG.nextInt(width / 6) + width / 6, true); + makeHorizontalTree(decoRNG, mural, startX - 1, startY, decoRNG.nextInt(width / 6) + width / 6, false); + + // main tree + makeVerticalTree(decoRNG, mural, startX, startY + 1, decoRNG.nextInt(height / 6) + height / 6, true); + + // stripes + makeStripes(decoRNG); + } + + final BlockState castleMagic = TFBlocks.YELLOW_CASTLE_RUNE_BRICK.get().defaultBlockState(); + + // copy mural to world + for (int x = 0; x < width; x++) { + for (int y = 0; y < height; y++) { + if (mural[x][y] > 0) { + + this.placeBlock(world, castleMagic, 0, y, x, sbb); + } else { + //this.setBlockState(world, TFBlocks.forceField, 0, 0, y, x, sbb); + } + } + } + } + + private void makeHorizontalTree(RandomSource decoRNG, byte[][] mural, int centerX, int centerY, int branchLength, boolean positive) { + this.fillHorizontalLine(mural, centerX, centerY, branchLength, positive); + + this.makeHorizontalBranch(mural, decoRNG, centerX, centerY, branchLength, positive, true); + this.makeHorizontalBranch(mural, decoRNG, centerX, centerY, branchLength, positive, false); + } + + private void makeVerticalTree(RandomSource decoRNG, byte[][] mural, int centerX, int centerY, int branchLength, boolean positive) { + this.fillVerticalLine(mural, centerX, centerY, branchLength, positive); + + this.makeVerticalBranch(mural, decoRNG, centerX, centerY, branchLength, positive, true); + this.makeVerticalBranch(mural, decoRNG, centerX, centerY, branchLength, positive, false); + } + + private boolean makeHorizontalBranch(byte[][] mural, RandomSource rand, int sx, int sy, int length, boolean plusX, boolean plusY) { + int downLine = (length / 2) + 1 + rand.nextInt(Math.max(length / 2, 2)); + int branchLength = rand.nextInt(width / 8) + width / 8; + + // check if the area is clear + boolean clear = true; + for (int i = 0; i <= branchLength; i++) { + int cx = sx + (plusX ? downLine - 1 + i : -(downLine - 1 + i)); + int cy = sy + (plusY ? 2 : -2); + if (cx < 0 || cx >= width || cy < 0 || cy >= height || mural[cx][cy] > 0) { + clear = false; + break; + } + } + if (clear) { + int bx = sx + (plusX ? downLine : -downLine); + int by = sy; + + // jag + this.fillVerticalLine(mural, bx, by, 1, plusY); + + by += (plusY ? 2 : -2); + + this.fillHorizontalLine(mural, bx, by, branchLength, plusX); + + // recurse? + if (bx > 0 && bx < width && by > 0 && by < height) { + if (!this.makeHorizontalBranch(mural, rand, bx, by, branchLength, plusX, true)) { + if (!this.makeHorizontalBranch(mural, rand, bx, by, branchLength, plusX, true)) { + if (!this.makeHorizontalBranch(mural, rand, bx, by, branchLength, plusX, true)) { + this.makeHorizontalBranch(mural, rand, bx, by, branchLength, plusX, true); + } + } + } + if (!this.makeHorizontalBranch(mural, rand, bx, by, branchLength, plusX, false)) { + if (!this.makeHorizontalBranch(mural, rand, bx, by, branchLength, plusX, false)) { + if (!this.makeHorizontalBranch(mural, rand, bx, by, branchLength, plusX, false)) { + this.makeHorizontalBranch(mural, rand, bx, by, branchLength, plusX, false); + } + } + } + } + return true; + } else { + return false; + } + } + + private boolean makeVerticalBranch(byte[][] mural, RandomSource rand, int sx, int sy, int length, boolean plusY, boolean plusX) { + int downLine = (length / 2) + 1 + rand.nextInt(Math.max(length / 2, 2)); + int branchLength = rand.nextInt(height / 8) + height / 8; + + // check if the area is clear + boolean clear = true; + for (int i = 0; i <= branchLength; i++) { + int cx = sx + (plusX ? 2 : -2); + int cy = sy + (plusY ? downLine - 1 + i : -(downLine - 1 + i)); + if (cx < 0 || cx >= width || cy < 0 || cy >= height || mural[cx][cy] > 0) { + clear = false; + break; + } + } + if (clear) { + int bx = sx; + int by = sy + (plusY ? downLine : -downLine); + + // jag + this.fillHorizontalLine(mural, bx, by, 1, plusX); + + bx += (plusX ? 2 : -2); + + this.fillVerticalLine(mural, bx, by, branchLength, plusY); + + // recurse? + if (bx > 0 && bx < width && by > 0 && by < height) { + if (!this.makeVerticalBranch(mural, rand, bx, by, branchLength, plusY, true)) { + if (!this.makeVerticalBranch(mural, rand, bx, by, branchLength, plusY, true)) { + if (!this.makeVerticalBranch(mural, rand, bx, by, branchLength, plusY, true)) { + this.makeVerticalBranch(mural, rand, bx, by, branchLength, plusY, true); + } + } + } + if (!this.makeVerticalBranch(mural, rand, bx, by, branchLength, plusY, false)) { + if (!this.makeVerticalBranch(mural, rand, bx, by, branchLength, plusY, false)) { + if (!this.makeVerticalBranch(mural, rand, bx, by, branchLength, plusY, false)) { + this.makeVerticalBranch(mural, rand, bx, by, branchLength, plusY, false); + } + } + } + } + return true; + } else { + return false; + } + } + + private void fillHorizontalLine(byte[][] mural, int sx, int sy, int length, boolean positive) { + int x = sx; + int y = sy; + + for (int i = 0; i <= length; i++) { + if (x >= 0 && x < width && y >= 0 && y < height) { + mural[x][y] = (byte) (positive ? 1 : 4); + + x += positive ? 1 : -1; + } + } + } + + private void fillVerticalLine(byte[][] mural, int sx, int sy, int length, boolean positive) { + int x = sx; + int y = sy; + + for (int i = 0; i <= length; i++) { + if (x >= 0 && x < width && y >= 0 && y < height) { + mural[x][y] = (byte) (positive ? 2 : 3); + + y += positive ? 1 : -1; + } + } + } + + private void makeStripes(RandomSource decoRNG) { + // stagger slightly on our way down + for (int y = this.height - 2; y > this.height / 3; y -= (2 + decoRNG.nextInt(2))) { + makeSingleStripe(y); + } + } + + private void makeSingleStripe(int y) { + for (int x = 0; x < this.width - 2; x++) { + if (mural[x + 1][y] == 0 && mural[x + 1][y + 1] == 0) { + mural[x][y] = 1; + } else { + break; + } + } + for (int x = this.width - 1; x > 2; x--) { + if (mural[x - 1][y] == 0 && mural[x - 1][y + 1] == 0) { + mural[x][y] = 1; + } else { + break; + } + } + } +} diff --git a/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleRoof13ConicalComponent.java b/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleRoof13ConicalComponent.java new file mode 100644 index 0000000000..05f210c37e --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleRoof13ConicalComponent.java @@ -0,0 +1,86 @@ +package twilightforest.world.components.structures.finalcastle; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFStructurePieceTypes; +import twilightforest.util.RotationUtil; +import twilightforest.world.components.structures.TFStructureComponentOld; + + +/** + * Pointy cone roof with variable height + */ +public class FinalCastleRoof13ConicalComponent extends TFStructureComponentOld { + + public final int slope; + + public FinalCastleRoof13ConicalComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFFCRo13Con.get(), nbt); + this.slope = nbt.getInt("slope"); + } + + public FinalCastleRoof13ConicalComponent(RandomSource rand, int i, TFStructureComponentOld sideTower, int x, int y, int z) { + super(TFStructurePieceTypes.TFFCRo13Con.get(), i, x, y, z); + + this.slope = 2 + rand.nextInt(3) + rand.nextInt(3); + + int height = slope * 4; + + this.setOrientation(sideTower.getOrientation()); + this.boundingBox = new BoundingBox(sideTower.getBoundingBox().minX() - 2, sideTower.getBoundingBox().maxY() - 1, sideTower.getBoundingBox().minZ() - 2, sideTower.getBoundingBox().maxX() + 2, sideTower.getBoundingBox().maxY() + height - 1, sideTower.getBoundingBox().maxZ() + 2); + } + + @Override + protected void addAdditionalSaveData(StructurePieceSerializationContext ctx, CompoundTag tagCompound) { + super.addAdditionalSaveData(ctx, tagCompound); + tagCompound.putInt("slope", this.slope); + } + + @Override + public void addChildren(StructurePiece parent, StructurePieceAccessor list, RandomSource rand) { + if (parent != null && parent instanceof TFStructureComponentOld) { + this.deco = ((TFStructureComponentOld) parent).deco; + } + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource randomIn, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + for (Rotation rotation : RotationUtil.ROTATIONS) { + this.fillBlocksRotated(world, sbb, 0, -1, 0, 3, 2, 3, deco.blockState, rotation); + this.setBlockStateRotated(world, deco.blockState, 1, -2, 2, rotation, sbb); + this.setBlockStateRotated(world, deco.blockState, 1, -2, 1, rotation, sbb); + this.setBlockStateRotated(world, deco.blockState, 2, -2, 1, rotation, sbb); + + this.fillBlocksRotated(world, sbb, 4, 0, 1, 12, 1, 1, deco.blockState, rotation); + + // more teeny crenellations + for (int i = 3; i < 13; i += 2) { + this.fillBlocksRotated(world, sbb, i, -1, 1, i, 2, 1, deco.blockState, rotation); + } + + // cone roof + for (int i = 2; i < 9; i++) { + int base = 2 - slope; + if (i < 7) { + this.fillBlocksRotated(world, sbb, i - 1, ((i - 1) * slope) + base, i - 1, i, (i * slope) + base - 1, i, deco.blockState, rotation); + } else { + this.fillBlocksRotated(world, sbb, 16 - i, ((i - 1) * slope) + base, i, 16 - i, (i * slope) + base - 1, i, deco.roofState, rotation); + } + this.fillBlocksRotated(world, sbb, i + 1, ((i - 1) * slope) + base, i, 15 - i, (i * slope) + base - 1, i, deco.roofState, rotation); + } + + // point! + this.fillBlocksRotated(world, sbb, 8, (slope * 6) + 2, 8, 8, (slope * 7) + 2, 8, deco.roofState, rotation); + } + } +} diff --git a/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleRoof13CrenellatedComponent.java b/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleRoof13CrenellatedComponent.java new file mode 100644 index 0000000000..cf1c03f1e5 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleRoof13CrenellatedComponent.java @@ -0,0 +1,65 @@ +package twilightforest.world.components.structures.finalcastle; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFStructurePieceTypes; +import twilightforest.util.RotationUtil; +import twilightforest.world.components.structures.TFStructureComponentOld; + + +public class FinalCastleRoof13CrenellatedComponent extends TFStructureComponentOld { + + public FinalCastleRoof13CrenellatedComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFFCRo13Cr.get(), nbt); + } + + public FinalCastleRoof13CrenellatedComponent(int i, TFStructureComponentOld sideTower, int x, int y, int z) { + super(TFStructurePieceTypes.TFFCRo13Cr.get(), i, x, y, z); + + int height = 5; + + this.setOrientation(sideTower.getOrientation()); + this.boundingBox = new BoundingBox(sideTower.getBoundingBox().minX() - 2, sideTower.getBoundingBox().maxY() - 1, sideTower.getBoundingBox().minZ() - 2, sideTower.getBoundingBox().maxX() + 2, sideTower.getBoundingBox().maxY() + height - 1, sideTower.getBoundingBox().maxZ() + 2); + } + + @Override + public void addChildren(StructurePiece parent, StructurePieceAccessor list, RandomSource rand) { + if (parent != null && parent instanceof TFStructureComponentOld) { + this.deco = ((TFStructureComponentOld) parent).deco; + } + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource randomIn, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + // assume square + int size = this.boundingBox.maxX() - this.boundingBox.minX(); + + for (Rotation rotation : RotationUtil.ROTATIONS) { + // corner + this.fillBlocksRotated(world, sbb, 0, -1, 0, 3, 3, 3, deco.blockState, rotation); + this.setBlockStateRotated(world, deco.blockState, 1, -2, 2, rotation, sbb); + this.setBlockStateRotated(world, deco.blockState, 1, -2, 1, rotation, sbb); + this.setBlockStateRotated(world, deco.blockState, 2, -2, 1, rotation, sbb); + + // walls + this.fillBlocksRotated(world, sbb, 4, 0, 1, size - 4, 1, 1, deco.blockState, rotation); + + // smaller crenellations + for (int x = 5; x < size - 5; x += 4) { + this.fillBlocksRotated(world, sbb, x, 0, 0, x + 2, 3, 2, deco.blockState, rotation); + this.setBlockStateRotated(world, deco.blockState, x + 1, -1, 1, rotation, sbb); + this.setBlockStateRotated(world, deco.blockState, x + 1, -2, 1, rotation, sbb); + } + } + } +} diff --git a/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleRoof13PeakedComponent.java b/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleRoof13PeakedComponent.java new file mode 100644 index 0000000000..b0013aea6d --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleRoof13PeakedComponent.java @@ -0,0 +1,105 @@ +package twilightforest.world.components.structures.finalcastle; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFStructurePieceTypes; +import twilightforest.util.RotationUtil; +import twilightforest.world.components.structures.TFStructureComponentOld; + + +public class FinalCastleRoof13PeakedComponent extends TFStructureComponentOld { + + public FinalCastleRoof13PeakedComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFFCRo13Pk.get(), nbt); + } + + public FinalCastleRoof13PeakedComponent(int i, TFStructureComponentOld sideTower, int x, int y, int z) { + super(TFStructurePieceTypes.TFFCRo13Pk.get(), i, x, y, z); + + int height = 18; + + this.setOrientation(sideTower.getOrientation()); + this.boundingBox = new BoundingBox(sideTower.getBoundingBox().minX() - 2, sideTower.getBoundingBox().maxY() - 1, sideTower.getBoundingBox().minZ() - 2, sideTower.getBoundingBox().maxX() + 2, sideTower.getBoundingBox().maxY() + height - 1, sideTower.getBoundingBox().maxZ() + 2); + } + + @Override + public void addChildren(StructurePiece parent, StructurePieceAccessor list, RandomSource rand) { + if (parent != null && parent instanceof TFStructureComponentOld) { + this.deco = ((TFStructureComponentOld) parent).deco; + } + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource randomIn, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + // peaky roof, loop unrolled as it was getting dumb + for (int i = 0; i < 3; i++) { + this.generateBox(world, sbb, 1, i, i, 15, i, i, deco.roofState, deco.roofState, false); + this.generateBox(world, sbb, 1, i, 16 - i, 15, i, 16 - i, deco.roofState, deco.roofState, false); + } + + for (int i = 0; i < 3; i++) { + int dz = 3 + i; + this.generateBox(world, sbb, 2, 5 + ((i - 1) * 2), dz, 14, 4 + (i * 2), dz, deco.roofState, deco.roofState, false); + this.generateBox(world, sbb, 1, 1, dz, 1, 5 + ((i - 1) * 2), dz, deco.roofState, deco.roofState, false); + this.generateBox(world, sbb, 1, 5 + ((i - 1) * 2), dz - 1, 1, 4 + (i * 2), dz, deco.blockState, deco.blockState, false); + this.generateBox(world, sbb, 15, 1, dz, 15, 5 + ((i - 1) * 2), dz, deco.roofState, deco.roofState, false); + this.generateBox(world, sbb, 15, 5 + ((i - 1) * 2), dz - 1, 15, 4 + (i * 2), dz, deco.blockState, deco.blockState, false); + + dz = 13 - i; + this.generateBox(world, sbb, 2, 5 + ((i - 1) * 2), dz, 14, 4 + (i * 2), dz, deco.roofState, deco.roofState, false); + this.generateBox(world, sbb, 1, 1, dz, 1, 5 + ((i - 1) * 2), dz, deco.roofState, deco.roofState, false); + this.generateBox(world, sbb, 1, 5 + ((i - 1) * 2), dz, 1, 4 + (i * 2), dz + 1, deco.blockState, deco.blockState, false); + this.generateBox(world, sbb, 15, 1, dz, 15, 5 + ((i - 1) * 2), dz, deco.roofState, deco.roofState, false); + this.generateBox(world, sbb, 15, 5 + ((i - 1) * 2), dz, 15, 4 + (i * 2), dz + 1, deco.blockState, deco.blockState, false); + } + + for (int i = 0; i < 3; i++) { + int dz = 6 + i; + this.generateBox(world, sbb, 2, 12 + ((i - 1) * 3), dz, 14, 11 + (i * 3), dz, deco.roofState, deco.roofState, false); + this.generateBox(world, sbb, 1, 1, dz, 1, 12 + ((i - 1) * 3), dz, deco.roofState, deco.roofState, false); + this.generateBox(world, sbb, 1, 12 + ((i - 1) * 3), dz - 1, 1, 11 + (i * 3), dz, deco.blockState, deco.blockState, false); + this.generateBox(world, sbb, 15, 1, dz, 15, 12 + ((i - 1) * 3), dz, deco.roofState, deco.roofState, false); + this.generateBox(world, sbb, 15, 12 + ((i - 1) * 3), dz - 1, 15, 11 + (i * 3), dz, deco.blockState, deco.blockState, false); + + dz = 10 - i; + this.generateBox(world, sbb, 2, 12 + ((i - 1) * 3), dz, 14, 11 + (i * 3), dz, deco.roofState, deco.roofState, false); + this.generateBox(world, sbb, 1, 1, dz, 1, 12 + ((i - 1) * 3), dz, deco.roofState, deco.roofState, false); + this.generateBox(world, sbb, 1, 12 + ((i - 1) * 3), dz, 1, 11 + (i * 3), dz + 1, deco.blockState, deco.blockState, false); + this.generateBox(world, sbb, 15, 1, dz, 15, 12 + ((i - 1) * 3), dz, deco.roofState, deco.roofState, false); + this.generateBox(world, sbb, 15, 12 + ((i - 1) * 3), dz, 15, 11 + (i * 3), dz + 1, deco.blockState, deco.blockState, false); + } + + // top roof bobbles + this.generateBox(world, sbb, 1, 18, 8, 5, 18, 8, deco.roofState, deco.roofState, false); + this.generateBox(world, sbb, 11, 18, 8, 14, 18, 8, deco.roofState, deco.roofState, false); + this.generateBox(world, sbb, 0, 17, 8, 1, 19, 8, deco.roofState, deco.roofState, false); + this.generateBox(world, sbb, 15, 17, 8, 16, 19, 8, deco.roofState, deco.roofState, false); + + for (Rotation rotation : new Rotation[]{Rotation.CLOCKWISE_90, Rotation.COUNTERCLOCKWISE_90}) { + // this might be one of my more confusing instances of code recycling + this.fillBlocksRotated(world, sbb, 4, 0, 1, 12, 1, 1, deco.blockState, rotation); + // more teeny crenellations + for (int i = 3; i < 13; i += 2) { + this.fillBlocksRotated(world, sbb, i, -1, 1, i, 2, 1, deco.blockState, rotation); + } + } + + // corners + for (Rotation rotation : RotationUtil.ROTATIONS) { + this.fillBlocksRotated(world, sbb, 0, -1, 0, 3, 2, 3, deco.blockState, rotation); + this.setBlockStateRotated(world, deco.blockState, 1, -2, 2, rotation, sbb); + this.setBlockStateRotated(world, deco.blockState, 1, -2, 1, rotation, sbb); + this.setBlockStateRotated(world, deco.blockState, 2, -2, 1, rotation, sbb); + } + } +} diff --git a/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleRoof48CrenellatedComponent.java b/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleRoof48CrenellatedComponent.java new file mode 100644 index 0000000000..9c50951c64 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleRoof48CrenellatedComponent.java @@ -0,0 +1,61 @@ +package twilightforest.world.components.structures.finalcastle; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFStructurePieceTypes; +import twilightforest.util.RotationUtil; +import twilightforest.world.components.structures.TFStructureComponentOld; + + +public class FinalCastleRoof48CrenellatedComponent extends TFStructureComponentOld { + + public FinalCastleRoof48CrenellatedComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFFCRo48Cr.get(), nbt); + } + + public FinalCastleRoof48CrenellatedComponent(int i, TFStructureComponentOld keep, int x, int y, int z) { + super(TFStructurePieceTypes.TFFCRo48Cr.get(), i, x, y, z); + + int height = 5; + + this.setOrientation(keep.getOrientation()); + this.boundingBox = new BoundingBox(keep.getBoundingBox().minX() - 2, keep.getBoundingBox().maxY() - 1, keep.getBoundingBox().minZ() - 2, keep.getBoundingBox().maxX() + 2, keep.getBoundingBox().maxY() + height - 1, keep.getBoundingBox().maxZ() + 2); + + } + + @Override + public void addChildren(StructurePiece parent, StructurePieceAccessor list, RandomSource rand) { + if (parent != null && parent instanceof TFStructureComponentOld) { + this.deco = ((TFStructureComponentOld) parent).deco; + } + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource randomIn, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + // add second layer of floor + final BlockState castleMagic = TFBlocks.VIOLET_CASTLE_RUNE_BRICK.get().defaultBlockState(); + this.generateBox(world, sbb, 2, 2, 2, 50, 2, 50, castleMagic, castleMagic, false); + + // crenellations + for (Rotation rotation : RotationUtil.ROTATIONS) { + this.fillBlocksRotated(world, sbb, 3, 1, 1, 45, 3, 1, deco.blockState, rotation); + + for (int i = 10; i < 41; i += 5) { + this.fillBlocksRotated(world, sbb, i, 1, 0, i + 2, 5, 2, deco.blockState, rotation); + this.setBlockStateRotated(world, deco.blockState, i + 1, 0, 1, rotation, sbb); + } + } + } +} diff --git a/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleRoof9CrenellatedComponent.java b/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleRoof9CrenellatedComponent.java new file mode 100644 index 0000000000..1d393e1cdc --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleRoof9CrenellatedComponent.java @@ -0,0 +1,64 @@ +package twilightforest.world.components.structures.finalcastle; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFStructurePieceTypes; +import twilightforest.util.RotationUtil; +import twilightforest.world.components.structures.TFStructureComponentOld; + + +public class FinalCastleRoof9CrenellatedComponent extends TFStructureComponentOld { + + public FinalCastleRoof9CrenellatedComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFFCRo9Cr.get(), nbt); + } + + public FinalCastleRoof9CrenellatedComponent(int i, TFStructureComponentOld sideTower, int x, int y, int z) { + super(TFStructurePieceTypes.TFFCRo9Cr.get(), i, x, y, z); + + int height = 5; + + this.setOrientation(sideTower.getOrientation()); + this.boundingBox = new BoundingBox(sideTower.getBoundingBox().minX() - 2, sideTower.getBoundingBox().maxY() - 1, sideTower.getBoundingBox().minZ() - 2, sideTower.getBoundingBox().maxX() + 2, sideTower.getBoundingBox().maxY() + height - 1, sideTower.getBoundingBox().maxZ() + 2); + } + + @Override + public void addChildren(StructurePiece parent, StructurePieceAccessor list, RandomSource rand) { + if (parent != null && parent instanceof TFStructureComponentOld) { + this.deco = ((TFStructureComponentOld) parent).deco; + } + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource randomIn, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + for (Rotation rotation : RotationUtil.ROTATIONS) { + this.fillBlocksRotated(world, sbb, 0, -1, 0, 2, 3, 2, deco.blockState, rotation); + this.setBlockStateRotated(world, deco.blockState, 1, -2, 2, rotation, sbb); + this.setBlockStateRotated(world, deco.blockState, 1, -2, 1, rotation, sbb); + this.setBlockStateRotated(world, deco.blockState, 2, -2, 1, rotation, sbb); + + this.setBlockStateRotated(world, deco.blockState, 3, 0, 1, rotation, sbb); + this.setBlockStateRotated(world, deco.blockState, 3, 1, 1, rotation, sbb); + + this.fillBlocksRotated(world, sbb, 4, 0, 0, 5, 3, 2, deco.blockState, rotation); + + this.setBlockStateRotated(world, deco.blockState, 6, 0, 1, rotation, sbb); + this.setBlockStateRotated(world, deco.blockState, 6, 1, 1, rotation, sbb); + + this.fillBlocksRotated(world, sbb, 7, 0, 0, 8, 3, 2, deco.blockState, rotation); + + this.setBlockStateRotated(world, deco.blockState, 9, 0, 1, rotation, sbb); + this.setBlockStateRotated(world, deco.blockState, 9, 1, 1, rotation, sbb); + } + } +} diff --git a/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleStairTowerComponent.java b/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleStairTowerComponent.java new file mode 100644 index 0000000000..dc0ff79182 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleStairTowerComponent.java @@ -0,0 +1,134 @@ +package twilightforest.world.components.structures.finalcastle; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFBlocks; +import twilightforest.world.components.structures.TFStructureComponentOld; +import twilightforest.world.components.structures.lichtower.TowerWingComponent; +import twilightforest.init.TFLandmark; +import twilightforest.init.TFStructurePieceTypes; + + +public class FinalCastleStairTowerComponent extends TowerWingComponent { + + public FinalCastleStairTowerComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFFCStTo.get(), nbt); + } + + public FinalCastleStairTowerComponent(int i, int x, int y, int z, Direction rotation) { + super(TFStructurePieceTypes.TFFCStTo.get(), i, x, y, z); + this.setOrientation(rotation); + this.size = 9; + this.height = 51; + this.boundingBox = TFLandmark.getComponentToAddBoundingBox(x, y, z, -4, 0, -4, 8, 50, 8, Direction.SOUTH, false); + } + + @Override + public void addChildren(StructurePiece parent, StructurePieceAccessor list, RandomSource rand) { + if (parent != null && parent instanceof TFStructureComponentOld) { + this.deco = ((TFStructureComponentOld) parent).deco; + } + // add crown + FinalCastleRoof9CrenellatedComponent roof = new FinalCastleRoof9CrenellatedComponent(4, this, getLocatorPosition().getX(), getLocatorPosition().getY(), getLocatorPosition().getZ()); + list.addPiece(roof); + roof.addChildren(this, list, rand); + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + RandomSource decoRNG = RandomSource.create(world.getSeed() + (this.boundingBox.minX() * 321534781L) ^ (this.boundingBox.minZ() * 756839L)); + + generateBox(world, sbb, 0, 0, 0, 8, 49, 8, false, rand, deco.randomBlocks); + + // add branching runes + int numBranches = 6 + decoRNG.nextInt(4); + for (int i = 0; i < numBranches; i++) { + makeGlyphBranches(world, decoRNG, this.getGlyphMeta(), sbb); + } + + // beard + for (int i = 1; i < 4; i++) { + generateBox(world, sbb, i, -(i * 2), i, 8 - i, 1 - (i * 2), 8 - i, false, rand, deco.randomBlocks); + } + this.placeBlock(world, deco.blockState, 4, -7, 4, sbb); + + // door, first floor + final BlockState castleDoor = TFBlocks.YELLOW_CASTLE_DOOR.get().defaultBlockState(); + this.generateBox(world, sbb, 0, 1, 1, 0, 3, 2, castleDoor, AIR, false); + + // stairs + Rotation rotation = Rotation.CLOCKWISE_90; + for (int f = 0; f < 5; f++) { + //int rotation = (f + 2) % 4; + rotation = rotation.getRotated(Rotation.CLOCKWISE_90); + int y = f * 3 + 1; + for (int i = 0; i < 3; i++) { + int sx = 3 + i; + int sy = y + i; + int sz = 1; + + this.setBlockStateRotated(world, getStairState(deco.stairState, Direction.WEST, false), sx, sy, sz, rotation, sbb); + this.setBlockStateRotated(world, deco.blockState, sx, sy - 1, sz, rotation, sbb); + this.setBlockStateRotated(world, getStairState(deco.stairState, Direction.WEST, false), sx, sy, sz + 1, rotation, sbb); + this.setBlockStateRotated(world, deco.blockState, sx, sy - 1, sz + 1, rotation, sbb); + } + // landing + this.fillBlocksRotated(world, sbb, 6, y + 2, 1, 7, y + 2, 2, deco.blockState, rotation); + } + + // door, second floor + this.generateBox(world, sbb, 1, 18, 0, 2, 20, 0, castleDoor, AIR, false); + + BlockState stairState = getStairState(deco.stairState, Direction.SOUTH, false); + + // second floor landing + this.generateBox(world, sbb, 1, 17, 1, 3, 17, 3, deco.blockState, deco.blockState, false); + this.generateBox(world, sbb, 1, 17, 4, 2, 17, 4, stairState, stairState, false); + this.generateBox(world, sbb, 1, 16, 4, 2, 16, 4, deco.blockState, deco.blockState, false); + this.generateBox(world, sbb, 1, 16, 5, 2, 16, 5, stairState, stairState, false); + this.generateBox(world, sbb, 1, 15, 5, 2, 15, 5, deco.blockState, deco.blockState, false); + + // door, roof + this.generateBox(world, sbb, 1, 39, 0, 2, 41, 0, TFBlocks.VIOLET_CASTLE_DOOR.get().defaultBlockState(), AIR, false); + + // stairs + rotation = Rotation.COUNTERCLOCKWISE_90; + for (int f = 0; f < 7; f++) { + //int rotation = (f + 0) % 4; + rotation = rotation.getRotated(Rotation.CLOCKWISE_90); + int y = f * 3 + 18; + for (int i = 0; i < 3; i++) { + int sx = 3 + i; + int sy = y + i; + int sz = 1; + + this.setBlockStateRotated(world, getStairState(deco.stairState, Direction.WEST, false), sx, sy, sz, rotation, sbb); + this.setBlockStateRotated(world, deco.blockState, sx, sy - 1, sz, rotation, sbb); + this.setBlockStateRotated(world, getStairState(deco.stairState, Direction.WEST, false), sx, sy, sz + 1, rotation, sbb); + this.setBlockStateRotated(world, deco.blockState, sx, sy - 1, sz + 1, rotation, sbb); + } + // landing + this.fillBlocksRotated(world, sbb, 6, y + 2, 1, 7, y + 2, 2, deco.blockState, rotation); + } + + // roof access landing + this.generateBox(world, sbb, 1, 38, 1, 3, 38, 5, deco.blockState, deco.blockState, false); + this.generateBox(world, sbb, 3, 39, 1, 3, 39, 5, deco.fenceState, deco.fenceState, false); + } + + public BlockState getGlyphMeta() { + return TFBlocks.YELLOW_CASTLE_RUNE_BRICK.get().defaultBlockState(); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleWreckedTowerComponent.java b/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleWreckedTowerComponent.java new file mode 100644 index 0000000000..3063e57b54 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/finalcastle/FinalCastleWreckedTowerComponent.java @@ -0,0 +1,86 @@ +package twilightforest.world.components.structures.finalcastle; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFStructurePieceTypes; +import twilightforest.world.components.structures.TFStructureComponentOld; + +import java.util.ArrayList; + + +public class FinalCastleWreckedTowerComponent extends FinalCastleDamagedTowerComponent { + + public FinalCastleWreckedTowerComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFFCWrT.get(), nbt); + } + + public FinalCastleWreckedTowerComponent(RandomSource rand, int i, int x, int y, int z, Direction direction) { + super(TFStructurePieceTypes.TFFCWrT.get(), rand, i, x, y, z, direction); + } + + @Override + public void addChildren(StructurePiece parent, StructurePieceAccessor list, RandomSource rand) { + if (parent != null && parent instanceof TFStructureComponentOld) { + this.deco = ((TFStructureComponentOld) parent).deco; + } + +// // add foundation +// Foundation13 foundation = new Foundation13(rand, 4, this); +// list.add(foundation); +// foundation.buildComponent(this, list, rand); + + // add thorns + FinalCastleFoundation13Component thorns = new FinalCastleFoundation13ComponentThorns(0, this, getLocatorPosition().getX(), getLocatorPosition().getY(), getLocatorPosition().getZ()); + list.addPiece(thorns); + thorns.addChildren(this, list, rand); + +// // add roof +// StructureTFComponentOld roof = rand.nextBoolean() ? new Roof13Conical(rand, 4, this) : new Roof13Crenellated(rand, 4, this); +// list.add(roof); +// roof.buildComponent(this, list, rand); + + // keep on building? +// this.buildNonCriticalTowers(parent, list, rand); + } + + @Override + public BlockState getGlyphMeta() { + return TFBlocks.YELLOW_CASTLE_RUNE_BRICK.get().defaultBlockState(); + } + + @Override + protected void determineBlockDestroyed(WorldGenLevel world, ArrayList areas, int y, int x, int z) { + boolean isInside = false; + + BlockPos pos = new BlockPos(x, y, z); + + for (DestroyArea dArea : areas) { + if (dArea != null && dArea.isVecInside(pos)) { + isInside = true; + } + } + + if (!isInside) { + world.removeBlock(pos, false); + } + } + + @Override + protected ArrayList makeInitialDestroyList(RandomSource rand) { + ArrayList areas = new ArrayList(2); + + areas.add(DestroyArea.createNonIntersecting(this.getBoundingBox(), rand, this.getBoundingBox().maxY() - 1, areas)); + areas.add(DestroyArea.createNonIntersecting(this.getBoundingBox(), rand, this.getBoundingBox().maxY() - 1, areas)); + areas.add(DestroyArea.createNonIntersecting(this.getBoundingBox(), rand, this.getBoundingBox().maxY() - 1, areas)); + areas.add(DestroyArea.createNonIntersecting(this.getBoundingBox(), rand, this.getBoundingBox().maxY() - 1, areas)); + return areas; + } +} diff --git a/src/main/java/twilightforest/world/components/structures/finalcastle/StructureTFDecoratorCastle.java b/src/main/java/twilightforest/world/components/structures/finalcastle/StructureTFDecoratorCastle.java new file mode 100644 index 0000000000..e740d05bd5 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/finalcastle/StructureTFDecoratorCastle.java @@ -0,0 +1,19 @@ +package twilightforest.world.components.structures.finalcastle; + +import net.minecraft.world.level.block.Blocks; +import twilightforest.init.TFBlocks; +import twilightforest.world.components.structures.TFStructureDecorator; + +public class StructureTFDecoratorCastle extends TFStructureDecorator { + + public StructureTFDecoratorCastle() { + this.blockState = TFBlocks.CASTLE_BRICK.get().defaultBlockState(); + this.accentState = Blocks.CHISELED_QUARTZ_BLOCK.defaultBlockState(); + this.roofState = TFBlocks.CASTLE_ROOF_TILE.get().defaultBlockState(); + this.pillarState = TFBlocks.BOLD_CASTLE_BRICK_PILLAR.get().defaultBlockState(); + this.fenceState = Blocks.OAK_FENCE.defaultBlockState(); + this.stairState = Blocks.QUARTZ_STAIRS.defaultBlockState(); + this.randomBlocks = new CastleBlockProcessor(); + } + +} diff --git a/src/main/java/twilightforest/world/components/structures/finalcastle/package-info.java b/src/main/java/twilightforest/world/components/structures/finalcastle/package-info.java new file mode 100644 index 0000000000..85473f2f9c --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/finalcastle/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.world.components.structures.finalcastle; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/world/components/structures/icetower/IceTowerBeardComponent.java b/src/main/java/twilightforest/world/components/structures/icetower/IceTowerBeardComponent.java new file mode 100644 index 0000000000..1cf200f38e --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/icetower/IceTowerBeardComponent.java @@ -0,0 +1,69 @@ +package twilightforest.world.components.structures.icetower; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.Mth; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFStructurePieceTypes; +import twilightforest.world.components.structures.TFStructureComponentOld; +import twilightforest.world.components.structures.lichtower.TowerWingComponent; + + +public class IceTowerBeardComponent extends TFStructureComponentOld { + + protected final int size; + protected int height; + + public IceTowerBeardComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFITBea.get(), nbt); + this.size = nbt.getInt("beardSize"); + this.height = nbt.getInt("beardHeight"); + } + + public IceTowerBeardComponent(int i, TowerWingComponent wing, int x, int y, int z) { + super(TFStructurePieceTypes.TFITBea.get(), i, x, y, z); + + // same alignment + this.setOrientation(wing.getOrientation()); + // same size + this.size = wing.size; // assuming only square towers and roofs right now. + this.height = Math.round(this.size * 1.414F); + + this.deco = wing.deco; + + // just hang out at the very bottom of the tower + this.boundingBox = new BoundingBox(wing.getBoundingBox().minX(), wing.getBoundingBox().minY() - this.height, wing.getBoundingBox().minZ(), wing.getBoundingBox().maxX(), wing.getBoundingBox().minY(), wing.getBoundingBox().maxZ()); + } + + @Override + protected void addAdditionalSaveData(StructurePieceSerializationContext ctx, CompoundTag tagCompound) { + super.addAdditionalSaveData(ctx, tagCompound); + tagCompound.putInt("beardSize", this.size); + tagCompound.putInt("beardHeight", this.height); + } + + /** + * Makes a dark tower type beard + */ + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + for (int x = 0; x < this.size; x++) { + for (int z = 0; z < this.size; z++) { + //int rHeight = this.size - (int) MathHelper.sqrt_float(x * z); // interesting office building pattern + int rHeight = Math.round(Mth.sqrt(x * x + z * z)); + //int rHeight = MathHelper.ceiling_float_int(Math.min(x * x / 9F, z * z / 9F)); + + for (int y = 0; y < rHeight; y++) { + this.placeBlock(world, deco.blockState, x, this.height - y, z, sbb); + + } + } + } + } +} diff --git a/src/main/java/twilightforest/world/components/structures/icetower/IceTowerBossWingComponent.java b/src/main/java/twilightforest/world/components/structures/icetower/IceTowerBossWingComponent.java new file mode 100644 index 0000000000..a01c09c634 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/icetower/IceTowerBossWingComponent.java @@ -0,0 +1,105 @@ +package twilightforest.world.components.structures.icetower; + +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFStructurePieceTypes; + + +public class IceTowerBossWingComponent extends IceTowerWingComponent { + + public IceTowerBossWingComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFITBoss.get(), nbt); + // no spawns + this.spawnListIndex = -1; + } + + public IceTowerBossWingComponent(int index, int x, int y, int z, int wingSize, int wingHeight, Direction direction) { + super(TFStructurePieceTypes.TFITBoss.get(), index, x, y, z, wingSize, wingHeight, direction); + // no spawns + this.spawnListIndex = -1; + } + + @Override + protected boolean shouldHaveBase(RandomSource rand) { + return false; + } + + /** + * Put down planks or whatevs for a floor + */ + @Override + protected void placeFloor(WorldGenLevel world, RandomSource rand, BoundingBox sbb, int floorHeight, int floor) { + for (int x = 1; x < size - 1; x++) { + for (int z = 1; z < size - 1; z++) { + + BlockState ice = (rand.nextInt(4) == 0 ? Blocks.ICE : Blocks.PACKED_ICE).defaultBlockState(); + int thickness = 1 + rand.nextInt(2) + rand.nextInt(2) + rand.nextInt(2); + + for (int y = 0; y < thickness; y++) { + placeBlock(world, ice, x, (floor * floorHeight) + floorHeight - y, z, sbb); + } + } + } + } + + /** + * Called to decorate each floor. This is responsible for adding a ladder up, the stub of the ladder going down, then picking a theme for each floor and executing it. + * + * @param floor + * @param bottom + * @param top + * @param ladderUpDir + * @param ladderDownDir + */ + @Override + protected void decorateFloor(WorldGenLevel world, RandomSource rand, int floor, int bottom, int top, Rotation ladderUpDir, Rotation ladderDownDir, BoundingBox sbb) { + + Rotation r = ladderDownDir; + for (int y = 0; y < 3; y++) { + placeIceStairs(world, sbb, rand, bottom + (y * 3), r); + placeIceStairs(world, sbb, rand, bottom + (y * 3), r.getRotated(Rotation.CLOCKWISE_180)); + r = r.getRotated(Rotation.CLOCKWISE_90); + } + } + + private void placeIceStairs(WorldGenLevel world, BoundingBox sbb, RandomSource rand, int y, Rotation rotation) { + final BlockState packedIce = Blocks.PACKED_ICE.defaultBlockState(); + this.fillBlocksRotated(world, sbb, 8, y + 1, 1, 10, y + 1, 3, packedIce, rotation); + if (y > 1) { + this.randomlyFillBlocksRotated(world, sbb, rand, 0.5F, 8, y, 1, 10, y, 3, packedIce, AIR, rotation); + } + this.fillBlocksRotated(world, sbb, 11, y + 2, 1, 13, y + 2, 3, packedIce, rotation); + this.randomlyFillBlocksRotated(world, sbb, rand, 0.5F, 11, y + 1, 1, 13, y + 1, 3, packedIce, AIR, rotation); + this.fillBlocksRotated(world, sbb, 11, y + 3, 4, 13, y + 3, 6, packedIce, rotation); + this.randomlyFillBlocksRotated(world, sbb, rand, 0.5F, 11, y + 2, 4, 13, y + 2, 6, packedIce, AIR, rotation); + } + + @Override + protected void decorateTopFloor(WorldGenLevel world, RandomSource rand, int floor, int bottom, int top, Rotation ladderUpDir, Rotation ladderDownDir, BoundingBox sbb) { + for (int x = 1; x < size - 1; x++) { + for (int z = 1; z < size - 1; z++) { + + BlockState ice = (rand.nextInt(10) == 0 ? Blocks.GLOWSTONE : Blocks.PACKED_ICE).defaultBlockState(); + int thickness = rand.nextInt(2) + rand.nextInt(2); + + for (int y = 0; y < thickness; y++) { + placeBlock(world, ice, x, top - 1 - y, z, sbb); + } + } + } + + final BlockState snowQueenSpawner = TFBlocks.SNOW_QUEEN_BOSS_SPAWNER.get().defaultBlockState(); + + this.setBlockStateRotated(world, snowQueenSpawner, 7, top - 6, 7, Rotation.NONE, sbb); + + this.generateAirBox(world, sbb, 5, top - 3, 5, 9, top - 1, 9); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/icetower/IceTowerBridgeComponent.java b/src/main/java/twilightforest/world/components/structures/icetower/IceTowerBridgeComponent.java new file mode 100644 index 0000000000..311590adec --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/icetower/IceTowerBridgeComponent.java @@ -0,0 +1,65 @@ +package twilightforest.world.components.structures.icetower; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.world.components.structures.TFStructureComponent; +import twilightforest.world.components.structures.TFStructureComponentOld; +import twilightforest.init.TFLandmark; +import twilightforest.init.TFStructurePieceTypes; + + +public class IceTowerBridgeComponent extends TFStructureComponentOld { + + private final int length; + + public IceTowerBridgeComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFITBri.get(), nbt); + this.length = nbt.getInt("bridgeLength"); + } + + public IceTowerBridgeComponent(int index, int x, int y, int z, int length, Direction direction) { + super(TFStructurePieceTypes.TFITBri.get(), index, x, y, z); + this.length = length; + this.setOrientation(direction); + + this.boundingBox = TFLandmark.getComponentToAddBoundingBox(x, y, z, 0, 0, 0, length, 6, 5, direction, false); + } + + @Override + protected void addAdditionalSaveData(StructurePieceSerializationContext ctx, CompoundTag tagCompound) { + super.addAdditionalSaveData(ctx, tagCompound); + tagCompound.putInt("bridgeLength", this.length); + } + + @Override + public void addChildren(StructurePiece parent, StructurePieceAccessor list, RandomSource rand) { + if (parent != null && parent instanceof TFStructureComponent tfStructureComponent) { + this.deco = tfStructureComponent.deco; + } + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + generateAirBox(world, sbb, 0, 1, 0, length, 5, 4); + + // make floor/ceiling + generateBox(world, sbb, 0, 0, 0, length, 0, 4, deco.blockState, deco.blockState, false); + generateBox(world, sbb, 0, 6, 0, length, 6, 4, deco.blockState, deco.blockState, false); + + // pillars + for (int x = 2; x < length; x += 3) { + generateBox(world, sbb, x, 1, 0, x, 5, 0, deco.pillarState, deco.pillarState, false); + generateBox(world, sbb, x, 1, 4, x, 5, 4, deco.pillarState, deco.pillarState, false); + } + } +} diff --git a/src/main/java/twilightforest/world/components/structures/icetower/IceTowerDecorator.java b/src/main/java/twilightforest/world/components/structures/icetower/IceTowerDecorator.java new file mode 100644 index 0000000000..2cfab58180 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/icetower/IceTowerDecorator.java @@ -0,0 +1,22 @@ +package twilightforest.world.components.structures.icetower; + +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.RotatedPillarBlock; +import net.minecraft.core.Direction; +import twilightforest.init.TFBlocks; +import twilightforest.world.components.structures.TFStructureDecorator; + +public class IceTowerDecorator extends TFStructureDecorator { + + public IceTowerDecorator() { + this.blockState = TFBlocks.AURORA_BLOCK.get().defaultBlockState(); + this.accentState = Blocks.BIRCH_PLANKS.defaultBlockState(); + this.fenceState = Blocks.OAK_FENCE.defaultBlockState(); + this.stairState = Blocks.BIRCH_STAIRS.defaultBlockState(); + this.pillarState = TFBlocks.AURORA_PILLAR.get().defaultBlockState().setValue(RotatedPillarBlock.AXIS, Direction.Axis.Y); + this.platformState = Blocks.BIRCH_SLAB.defaultBlockState(); + this.floorState = Blocks.BIRCH_PLANKS.defaultBlockState(); + this.randomBlocks = new IceTowerProcessor(); + } + +} diff --git a/src/main/java/twilightforest/world/components/structures/icetower/IceTowerEntranceComponent.java b/src/main/java/twilightforest/world/components/structures/icetower/IceTowerEntranceComponent.java new file mode 100644 index 0000000000..f49db1716e --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/icetower/IceTowerEntranceComponent.java @@ -0,0 +1,104 @@ +package twilightforest.world.components.structures.icetower; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.RotatedPillarBlock; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFStructurePieceTypes; +import twilightforest.world.components.structures.TFStructureComponent; + + +public class IceTowerEntranceComponent extends IceTowerWingComponent { + + public IceTowerEntranceComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFITEnt.get(), nbt); + } + + public IceTowerEntranceComponent(int i, int x, int y, int z, int pSize, int pHeight, Direction direction) { + super(TFStructurePieceTypes.TFITEnt.get(), i, x, y, z, pSize, pHeight, direction); + } + + @Override + protected boolean shouldHaveBase(RandomSource rand) { + return true; + } + + @Override + public void addChildren(StructurePiece parent, StructurePieceAccessor list, RandomSource rand) { + if (parent != null && parent instanceof TFStructureComponent tfStructureComponent) { + this.deco = tfStructureComponent.deco; + } + + // we should have a door where we started + addOpening(0, 1, size / 2, Rotation.CLOCKWISE_180); + + // stairs + addStairs(list, rand, this.getGenDepth() + 1, this.size - 1, 1, size / 2, Rotation.NONE); + addStairs(list, rand, this.getGenDepth() + 1, this.size / 2, 1, 0, Rotation.COUNTERCLOCKWISE_90); + addStairs(list, rand, this.getGenDepth() + 1, this.size / 2, 1, this.size - 1, Rotation.CLOCKWISE_90); + + // should we build a base + this.hasBase = this.shouldHaveBase(rand); + + // add a roof? + makeARoof(parent, list, rand); + } + + /** + * Add some stairs leading to this tower + */ + private boolean addStairs(StructurePieceAccessor list, RandomSource rand, int index, int x, int y, int z, Rotation rotation) { + // add door + this.addOpening(x, y, z, rotation); + + Direction direction = getStructureRelativeRotation(rotation); + BlockPos dx = offsetTowerCCoords(x, y, z, this.size, direction); + + IceTowerStairsComponent entrance = new IceTowerStairsComponent(index, dx.getX(), dx.getY(), dx.getZ(), this.size, this.height, direction); + + list.addPiece(entrance); + entrance.addChildren(this, list, rand); + return true; + } + + /** + * Make a new wing + */ + @Override + public boolean makeTowerWing(StructurePieceAccessor list, RandomSource rand, int index, int x, int y, int z, int wingSize, int wingHeight, Rotation rotation) { + return false; + } + + /** + * No floors + */ + @Override + protected void makeFloorsForTower(WorldGenLevel world, RandomSource rand, BoundingBox sbb) { + decoratePillarsCornersHigh(world, 0, 11, Rotation.NONE, sbb); + } + + protected void decoratePillarsCornersHigh(WorldGenLevel world, int bottom, int top, Rotation rotation, BoundingBox sbb) { + final BlockState pillarXAxis = deco.pillarState.setValue(RotatedPillarBlock.AXIS, Direction.Axis.X); + final BlockState pillarZAxis = deco.pillarState.setValue(RotatedPillarBlock.AXIS, Direction.Axis.Z); + this.fillBlocksRotated(world, sbb, 3, bottom + 5, 1, 3, bottom + 5, 9, pillarZAxis, rotation); + this.fillBlocksRotated(world, sbb, 7, bottom + 5, 1, 7, bottom + 5, 9, pillarZAxis, rotation); + this.fillBlocksRotated(world, sbb, 1, bottom + 5, 3, 9, bottom + 5, 3, pillarXAxis, rotation); + this.fillBlocksRotated(world, sbb, 1, bottom + 5, 7, 9, bottom + 5, 7, pillarXAxis, rotation); + + this.fillAirRotated(world, sbb, 3, bottom + 5, 3, 7, bottom + 5, 7, rotation); + + // pillars connected only to ceiling + this.fillBlocksRotated(world, sbb, 3, bottom + 5, 3, 3, top - 1, 3, deco.pillarState, rotation); + this.fillBlocksRotated(world, sbb, 7, bottom + 5, 3, 7, top - 1, 3, deco.pillarState, rotation); + this.fillBlocksRotated(world, sbb, 3, bottom + 5, 7, 3, top - 1, 7, deco.pillarState, rotation); + this.fillBlocksRotated(world, sbb, 7, bottom + 5, 7, 7, top - 1, 7, deco.pillarState, rotation); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/icetower/IceTowerMainComponent.java b/src/main/java/twilightforest/world/components/structures/icetower/IceTowerMainComponent.java new file mode 100644 index 0000000000..07dae11bb0 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/icetower/IceTowerMainComponent.java @@ -0,0 +1,106 @@ +package twilightforest.world.components.structures.icetower; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.core.Direction; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePiecesBuilder; +import twilightforest.util.BoundingBoxUtils; +import twilightforest.init.TFStructurePieceTypes; + + +public class IceTowerMainComponent extends IceTowerWingComponent { + public boolean hasBossWing = false; + + public IceTowerMainComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFITMai.get(), nbt); + this.hasBossWing = nbt.getBoolean("hasBossWing"); + } + + public IceTowerMainComponent(RandomSource rand, int index, int x, int y, int z) { + this(rand, index, x + SIZE, y + 40, z + SIZE, Direction.NORTH); + } + + public IceTowerMainComponent(RandomSource rand, int index, int x, int y, int z, Direction rotation) { + super(TFStructurePieceTypes.TFITMai.get(), index, x, y, z, SIZE, 31 + (rand.nextInt(3) * 10), rotation); + + // decorator + if (this.deco == null) { + this.deco = new IceTowerDecorator(); + } + } + + @Override + protected void addAdditionalSaveData(StructurePieceSerializationContext ctx, CompoundTag tagCompound) { + super.addAdditionalSaveData(ctx, tagCompound); + tagCompound.putBoolean("hasBossWing", this.hasBossWing); + } + + @Override + public void addChildren(StructurePiece parent, StructurePieceAccessor list, RandomSource rand) { + super.addChildren(parent, list, rand); + + // add entrance tower + BoundingBox towerBB = BoundingBoxUtils.clone(this.boundingBox); + + if (list instanceof StructurePiecesBuilder start) + for (StructurePiece structurecomponent : start.pieces) + towerBB.encapsulate(structurecomponent.getBoundingBox()); + + // TODO: make this more general + BlockPos myDoor = this.openings.get(0); + BlockPos entranceDoor = new BlockPos(myDoor); + + + if (myDoor.getX() == 0) { + int length = this.getBoundingBox().minX() - towerBB.minX(); + if (length >= 0) { + entranceDoor = entranceDoor.west(length); + makeEntranceBridge(list, rand, this.getGenDepth() + 1, myDoor.getX(), myDoor.getY(), myDoor.getZ(), length, Rotation.CLOCKWISE_180); + } + } + if (myDoor.getX() == this.size - 1) { + entranceDoor = entranceDoor.east(towerBB.maxX() - this.getBoundingBox().maxX()); + } + if (myDoor.getZ() == 0) { + entranceDoor = entranceDoor.south(towerBB.minZ() - this.getBoundingBox().minZ()); + } + //FIXME: AtomicBlom I don't get it, should this not be getZ, and entranceDoor.north? + if (myDoor.getX() == this.size - 1) { + entranceDoor = entranceDoor.south(towerBB.maxZ() - this.getBoundingBox().maxZ()); + } + + makeEntranceTower(list, rand, this.getGenDepth() + 1, entranceDoor.getX(), entranceDoor.getY(), entranceDoor.getZ(), SIZE, 11, this.rotation); + } + + private void makeEntranceBridge(StructurePieceAccessor list, RandomSource rand, int index, int x, int y, int z, int length, Rotation rotation) { + Direction direction = getStructureRelativeRotation(rotation); + BlockPos dest = offsetTowerCCoords(x, y, z, 5, direction); + + IceTowerBridgeComponent bridge = new IceTowerBridgeComponent(index, dest.getX(), dest.getY(), dest.getZ(), length, direction); + + list.addPiece(bridge); + if (list instanceof StructurePiecesBuilder start) { + bridge.addChildren(start.pieces.get(0), list, rand); + } + } + + public boolean makeEntranceTower(StructurePieceAccessor list, RandomSource rand, int index, int x, int y, int z, int wingSize, int wingHeight, Rotation rotation) { + Direction direction = getStructureRelativeRotation(rotation); + int[] dx = offsetTowerCoords(x, y, z, wingSize, direction); + + IceTowerWingComponent entrance = new IceTowerEntranceComponent(index, dx[0], dx[1], dx[2], wingSize, wingHeight, direction); + + list.addPiece(entrance); + if (list instanceof StructurePiecesBuilder start) { + entrance.addChildren(start.pieces.get(0), list, rand); + } + addOpening(x, y, z, rotation); + return true; + } +} diff --git a/src/main/java/twilightforest/world/components/structures/icetower/IceTowerProcessor.java b/src/main/java/twilightforest/world/components/structures/icetower/IceTowerProcessor.java new file mode 100644 index 0000000000..ae1cb382f5 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/icetower/IceTowerProcessor.java @@ -0,0 +1,23 @@ +package twilightforest.world.components.structures.icetower; + +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import twilightforest.block.AuroraBrickBlock; +import twilightforest.init.TFBlocks; + +public class IceTowerProcessor extends StructurePiece.BlockSelector { + + @Override + public void next(RandomSource random, int x, int y, int z, boolean wall) { + if (!wall) { + this.next = Blocks.AIR.defaultBlockState(); + } else { + this.next = TFBlocks.AURORA_BLOCK.get().defaultBlockState().setValue( + AuroraBrickBlock.VARIANT, + Math.abs(x + z) % 16 + ); + } + } + +} diff --git a/src/main/java/twilightforest/world/components/structures/icetower/IceTowerRoofComponent.java b/src/main/java/twilightforest/world/components/structures/icetower/IceTowerRoofComponent.java new file mode 100644 index 0000000000..43f31320c6 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/icetower/IceTowerRoofComponent.java @@ -0,0 +1,58 @@ +package twilightforest.world.components.structures.icetower; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.Mth; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFStructurePieceTypes; +import twilightforest.world.components.structures.lichtower.TowerRoofComponent; +import twilightforest.world.components.structures.lichtower.TowerWingComponent; + + +public class IceTowerRoofComponent extends TowerRoofComponent { + + public IceTowerRoofComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFITRoof.get(), nbt); + } + + public IceTowerRoofComponent(int i, TowerWingComponent wing, int x, int y, int z) { + super(TFStructurePieceTypes.TFITRoof.get(), i, x, y, z); + + // same alignment + this.setOrientation(wing.getOrientation()); + // same size + this.size = wing.size; // assuming only square towers and roofs right now. + this.height = 12; + + this.deco = wing.deco; + + // just hang out at the very top of the tower + makeCapBB(wing); + } + + /** + * Swoopy ice roof + */ + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + super.postProcess(world, manager, generator, rand, sbb, chunkPosIn, blockPos); + for (int x = 0; x < this.size; x++) { + for (int z = 0; z < this.size; z++) { + //int rHeight = this.size - (int) MathHelper.sqrt_float(x * z); // interesting office building pattern + int rHeight = Math.round(Mth.sqrt(x * x + z * z)); + //int rHeight = MathHelper.ceiling_float_int(Math.min(x * x / 9F, z * z / 9F)); + + for (int y = 0; y < rHeight; y++) { + this.placeBlock(world, deco.blockState, x, y, z, sbb); + + } + } + } + } +} diff --git a/src/main/java/twilightforest/world/components/structures/icetower/IceTowerStairsComponent.java b/src/main/java/twilightforest/world/components/structures/icetower/IceTowerStairsComponent.java new file mode 100644 index 0000000000..f2201bb83c --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/icetower/IceTowerStairsComponent.java @@ -0,0 +1,66 @@ +package twilightforest.world.components.structures.icetower; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFStructurePieceTypes; +import twilightforest.world.components.structures.TFStructureComponentOld; +import twilightforest.world.components.structures.lichtower.TowerWingComponent; + + +public class IceTowerStairsComponent extends TowerWingComponent { + + public IceTowerStairsComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFITSt.get(), nbt); + } + + public IceTowerStairsComponent(int index, int x, int y, int z, int size, int height, Direction direction) { + super(TFStructurePieceTypes.TFITSt.get(), index, x, y, z, size, height, direction); + } + + @Override + public void addChildren(StructurePiece parent, StructurePieceAccessor list, RandomSource rand) { + if (parent != null && parent instanceof TFStructureComponentOld) { + this.deco = ((TFStructureComponentOld) parent).deco; + } + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + for (int x = 1; x < this.size; x++) { + + this.placeStairs(world, sbb, x, 1 - x, 5); + + for (int z = 0; z <= x; z++) { + + if (z > 0 && z <= this.size / 2) { + this.placeStairs(world, sbb, x, 1 - x, 5 - z); + this.placeStairs(world, sbb, x, 1 - x, 5 + z); + } + + if (x <= this.size / 2) { + this.placeStairs(world, sbb, z, 1 - x, 5 - x); + this.placeStairs(world, sbb, z, 1 - x, 5 + x); + } + } + } + + this.placeBlock(world, deco.blockState, 0, 0, 5, sbb); + } + + private void placeStairs(WorldGenLevel world, BoundingBox sbb, int x, int y, int z) { + if (this.getBlock(world, x, y, z, sbb).getMaterial().isReplaceable()) { + this.placeBlock(world, deco.blockState, x, y, z, sbb); + this.placeBlock(world, deco.blockState, x, y - 1, z, sbb); + } + } +} diff --git a/src/main/java/twilightforest/world/components/structures/icetower/IceTowerWingComponent.java b/src/main/java/twilightforest/world/components/structures/icetower/IceTowerWingComponent.java new file mode 100644 index 0000000000..65d2664624 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/icetower/IceTowerWingComponent.java @@ -0,0 +1,702 @@ +package twilightforest.world.components.structures.icetower; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.RotatedPillarBlock; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.SlabBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.SlabType; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePiecesBuilder; +import twilightforest.init.TFStructurePieceTypes; +import twilightforest.loot.TFLootTables; +import twilightforest.util.RotationUtil; +import twilightforest.world.components.structures.TFStructureComponentOld; +import twilightforest.world.components.structures.lichtower.TowerWingComponent; + + +public class IceTowerWingComponent extends TowerWingComponent { + + protected static final int SIZE = 11; + private static final int RANGE = (int) (SIZE * 1.6F); + + boolean hasBase = false; + protected int treasureFloor = -1; + + public IceTowerWingComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + this(TFStructurePieceTypes.TFITWin.get(), nbt); + } + + public IceTowerWingComponent(StructurePieceType piece, CompoundTag nbt) { + super(piece, nbt); + this.hasBase = nbt.getBoolean("hasBase"); + this.treasureFloor = nbt.getInt("treasureFloor"); + } + + protected IceTowerWingComponent(StructurePieceType piece, int i, int x, int y, int z, int pSize, int pHeight, Direction direction) { + super(piece, i, x, y, z, pSize, pHeight, direction); + + // decorator + if (this.deco == null) { + this.deco = new IceTowerDecorator(); + } + } + + @Override + protected void addAdditionalSaveData(StructurePieceSerializationContext ctx, CompoundTag tagCompound) { + super.addAdditionalSaveData(ctx, tagCompound); + tagCompound.putBoolean("hasBase", this.hasBase); + tagCompound.putInt("treasureFloor", this.treasureFloor); + } + + @Override + public void addChildren(StructurePiece parent, StructurePieceAccessor list, RandomSource rand) { + if (parent != null && parent instanceof TFStructureComponentOld) { + this.deco = ((TFStructureComponentOld) parent).deco; + } + + // we should have a door where we started + addOpening(0, 1, size / 2, Rotation.CLOCKWISE_180); + + // should we build a base + this.hasBase = this.shouldHaveBase(rand); + + // limit sprawl to a reasonable amount + if (this.getGenDepth() < 5) { + + Rotation dirOffset = RotationUtil.ROTATIONS[rand.nextInt(RotationUtil.ROTATIONS.length)]; + + // make sub towers + for (final Rotation rotation : RotationUtil.ROTATIONS) { + + Rotation dir = dirOffset.getRotated(rotation); + + int[] dest = getValidOpening(rand, dir); + + if (this.getGenDepth() == 4 && (parent instanceof IceTowerMainComponent) && !((IceTowerMainComponent) parent).hasBossWing) { + boolean hasBoss = makeBossTowerWing(list, rand, this.getGenDepth() + 1, dest[0], dest[1], dest[2], 15, 41, dir); + ((IceTowerMainComponent) parent).hasBossWing = hasBoss; + } else { + int childHeight = (rand.nextInt(2) + rand.nextInt(2) + 2) * 10 + 1; + makeTowerWing(list, rand, this.getGenDepth() + 1, dest[0], dest[1], dest[2], SIZE, childHeight, dir); + } + } + } + + // figure out where the treasure goes + int floors = this.height / 10; + + // set treasure to a floor if we need to + if (this.treasureFloor == -1 && floors > 1) { + this.treasureFloor = rand.nextInt(floors - 1); + } + + // add a roof? + makeARoof(parent, list, rand); + + // beard? + if (!this.hasBase) { + makeABeard(parent, list, rand); + } + } + + protected boolean shouldHaveBase(RandomSource rand) { + return this.getGenDepth() == 0 || rand.nextBoolean(); + } + + /** + * Have we strayed more than range blocks away from the center? + */ + private boolean isOutOfRange(StructurePiece parent, int nx, int nz, int range) { + final BoundingBox sbb = parent.getBoundingBox(); + final int centerX = sbb.minX() + (sbb.maxX() - sbb.minX() + 1) / 2; + final int centerZ = sbb.minZ() + (sbb.maxZ() - sbb.minZ() + 1) / 2; + + return Math.abs(nx - centerX) > range + || Math.abs(nz - centerZ) > range; + } + + /** + * Make a new wing + */ + @Override + public boolean makeTowerWing(StructurePieceAccessor list, RandomSource rand, int index, int x, int y, int z, int wingSize, int wingHeight, Rotation rotation) { + Direction direction = getStructureRelativeRotation(rotation); + int[] dx = offsetTowerCoords(x, y, z, wingSize, direction); + + // stop if out of range + if (list instanceof StructurePiecesBuilder start && !start.pieces.isEmpty() && isOutOfRange(start.pieces.get(0), dx[0], dx[2], RANGE)) { + return false; + } + + IceTowerWingComponent wing = new IceTowerWingComponent(TFStructurePieceTypes.TFITWin.get(), index, dx[0], dx[1], dx[2], wingSize, wingHeight, direction); + // check to see if it intersects something already there + StructurePiece intersect = list.findCollisionPiece(wing.getBoundingBox()); + if (intersect == null || intersect == this) { + list.addPiece(wing); + if (list instanceof StructurePiecesBuilder start) { + wing.addChildren(start.pieces.get(0), list, rand); + } + addOpening(x, y, z, rotation); + return true; + } else { + return false; + } + } + + /** + * Make a new wing + */ + public boolean makeBossTowerWing(StructurePieceAccessor list, RandomSource rand, int index, int x, int y, int z, int wingSize, int wingHeight, Rotation rotation) { + + Direction direction = getStructureRelativeRotation(rotation); + int[] dx = offsetTowerCoords(x, y, z, wingSize, direction); + + IceTowerWingComponent wing = new IceTowerBossWingComponent(index, dx[0], dx[1], dx[2], wingSize, wingHeight, direction); + // check to see if it intersects something already there + StructurePiece intersect = list.findCollisionPiece(wing.getBoundingBox()); + if (intersect == null || intersect == this) { + list.addPiece(wing); + if (list instanceof StructurePiecesBuilder start) { + wing.addChildren(start.pieces.get(0), list, rand); + } + addOpening(x, y, z, rotation); + return true; + } else { + return false; + } + } + + /** + * Gets a Y value where the stairs meet the specified X coordinate. + * Also works for Z coordinates. + */ + @Override + protected int getYByStairs(int rx, RandomSource rand, Rotation direction) { + + int floors = this.height / 10; + + return 11 + (rand.nextInt(floors - 1) * 10); + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + RandomSource decoRNG = RandomSource.create(world.getSeed() + (this.boundingBox.minX() * 321534781L) ^ (this.boundingBox.minZ() * 756839L)); + + // make walls + //fillWithMetadataBlocks(world, sbb, 0, 0, 0, size - 1, height - 1, size - 1, deco.blockID, deco.blockMeta, AIR, false); + generateBox(world, sbb, 0, 0, 0, size - 1, height - 1, size - 1, false, rand, deco.randomBlocks); + + // clear inside + generateAirBox(world, sbb, 1, 1, 1, size - 2, height - 2, size - 2); + + if (this.hasBase) { + // deco to ground + for (int x = 0; x < this.size; x++) { + for (int z = 0; z < this.size; z++) { + this.fillColumnDown(world, deco.blockState, x, -1, z, sbb); + } + } + } + + // nullify sky light +// this.nullifySkyLightForBoundingBox(world); + + // make floors + makeFloorsForTower(world, decoRNG, sbb); + + // openings + makeOpenings(world, sbb); + } + + /** + * Nullify all the sky light in this component bounding box + */ + + protected void makeFloorsForTower(WorldGenLevel world, RandomSource decoRNG, BoundingBox sbb) { + int floors = this.height / 10; + + Rotation ladderDir = Rotation.COUNTERCLOCKWISE_90; + Rotation downLadderDir = null; + + // divide the tower into floors + int floorHeight = 10; + for (int i = 0; i < floors - 1; i++) { + // put down a ceiling + placeFloor(world, decoRNG, sbb, floorHeight, i); + + downLadderDir = ladderDir.getRotated(Rotation.CLOCKWISE_90); + decorateFloor(world, decoRNG, i, (i * floorHeight), (i * floorHeight) + floorHeight, ladderDir, downLadderDir, sbb); + } + + int topFloor = floors - 1; + decorateTopFloor(world, decoRNG, topFloor, (topFloor * floorHeight), (topFloor * floorHeight) + floorHeight, ladderDir, downLadderDir, sbb); + } + + /** + * Put down planks or whatevs for a floor + */ + protected void placeFloor(WorldGenLevel world, RandomSource rand, BoundingBox sbb, int floorHeight, int floor) { + for (int x = 1; x < size - 1; x++) { + for (int z = 1; z < size - 1; z++) { + placeBlock(world, deco.floorState, x, (floor * floorHeight) + floorHeight, z, sbb); + } + } + } + + /** + * Make an opening in this tower for a door. This now only makes one opening, so you need two + */ + @Override + protected void makeDoorOpening(WorldGenLevel world, int dx, int dy, int dz, BoundingBox sbb) { + super.makeDoorOpening(world, dx, dy, dz, sbb); + + if (getBlock(world, dx, dy + 2, dz, sbb).getBlock() != Blocks.AIR) { + placeBlock(world, deco.accentState, dx, dy + 2, dz, sbb); + } + } + + /** + * Called to decorate each floor. This is responsible for adding a ladder up, the stub of the ladder going down, then picking a theme for each floor and executing it. + * + * @param floor + * @param bottom + * @param top + * @param ladderUpDir + * @param ladderDownDir + */ + @Override + @SuppressWarnings("fallthrough") + protected void decorateFloor(WorldGenLevel world, RandomSource rand, int floor, int bottom, int top, Rotation ladderUpDir, Rotation ladderDownDir, BoundingBox sbb) { + boolean hasTreasure = (this.treasureFloor == floor); + + switch (rand.nextInt(8)) { + case 0: + if (isNoDoorAreaRotated(9, bottom + 5, 1, 10, top + 1, 7, ladderUpDir)) { + decorateWraparoundWallSteps(world, bottom, top, ladderUpDir, hasTreasure, sbb); + break; + } // fall through otherwise + case 1: + if (isNoDoorAreaRotated(7, bottom, 0, 10, top + 1, 10, ladderUpDir)) { + decorateFarWallSteps(world, bottom, top, ladderUpDir, hasTreasure, sbb); + break; + } // fall through otherwise + case 2: + if (isNoDoorAreaRotated(9, bottom + 5, 1, 10, top + 1, 7, ladderUpDir)) { + decorateWraparoundWallStepsPillars(world, bottom, top, ladderUpDir, ladderDownDir, hasTreasure, sbb); + break; + } // fall through otherwise + case 3: + decoratePlatform(world, rand, bottom, top, ladderUpDir, ladderDownDir, hasTreasure, sbb); + break; + case 4: + decoratePillarParkour(world, rand, bottom, top, ladderUpDir, ladderDownDir, hasTreasure, sbb); + break; + case 5: + decoratePillarPlatforms(world, bottom, top, ladderUpDir, hasTreasure, sbb); + break; + case 6: + decoratePillarPlatformsOutside(world, bottom, top, ladderUpDir, hasTreasure, sbb); + break; + case 7: + default: + decorateQuadPillarStairs(world, rand, bottom, top, ladderUpDir, ladderDownDir, hasTreasure, sbb); + break; + } + } + + private boolean isNoDoorAreaRotated(int minX, int minY, int minZ, int maxX, int maxY, int maxZ, Rotation rotation) { + boolean isClear = true; + // make a bounding box of the area + BoundingBox exclusionBox = switch (rotation) { + case CLOCKWISE_90 -> new BoundingBox(this.size - 1 - maxZ, minY, minX, this.size - 1 - minZ, maxY, maxX); + case CLOCKWISE_180 -> new BoundingBox(this.size - 1 - maxX, minY, this.size - 1 - maxZ, this.size - 1 - minX, maxY, this.size - 1 - minZ); + case COUNTERCLOCKWISE_90 -> new BoundingBox(minZ, minY, this.size - 1 - maxX, maxZ, maxY, this.size - 1 - minX); + default -> new BoundingBox(minX, minY, minZ, maxX, maxY, maxZ); + }; + + for (BlockPos door : this.openings) { + if (exclusionBox.isInside(door)) { + isClear = false; + } + } + + return isClear; + } + + protected void decorateTopFloor(WorldGenLevel world, RandomSource rand, int floor, int bottom, int top, Rotation ladderUpDir, Rotation ladderDownDir, BoundingBox sbb) { + if (rand.nextBoolean()) { + decoratePillarsCorners(world, rand, bottom, top, ladderDownDir, sbb); + } else { + decoratePillarsGrid(world, rand, bottom, top, ladderDownDir, sbb); + } + + // generate treasure last so it doesn't get deleted + if (this.isDeadEnd()) { + decorateTopFloorTreasure(world, bottom, ladderDownDir, sbb); + } + } + + private void decorateTopFloorTreasure(WorldGenLevel world, int bottom, Rotation rotation, BoundingBox sbb) { + this.fillBlocksRotated(world, sbb, 5, bottom + 1, 5, 5, bottom + 4, 5, deco.pillarState, rotation); + + this.placeTreasureAtCurrentPosition(world, 5, bottom + 5, 5, TFLootTables.AURORA_ROOM, sbb); + } + + private void decoratePillars(WorldGenLevel world, int bottom, int top, Rotation rotation, BoundingBox sbb) { + this.fillBlocksRotated(world, sbb, 3, bottom + 1, 3, 3, top - 1, 3, deco.pillarState, rotation); + this.fillBlocksRotated(world, sbb, 7, bottom + 1, 3, 7, top - 1, 3, deco.pillarState, rotation); + this.fillBlocksRotated(world, sbb, 3, bottom + 1, 7, 3, top - 1, 7, deco.pillarState, rotation); + this.fillBlocksRotated(world, sbb, 7, bottom + 1, 7, 7, top - 1, 7, deco.pillarState, rotation); + } + + private void decoratePillarsGrid(WorldGenLevel world, RandomSource rand, int bottom, int top, Rotation rotation, BoundingBox sbb) { + final BlockState pillarEW = deco.pillarState.setValue(RotatedPillarBlock.AXIS, Direction.Axis.Z); + final BlockState pillarNS = deco.pillarState.setValue(RotatedPillarBlock.AXIS, Direction.Axis.X); + + this.fillBlocksRotated(world, sbb, 3, bottom + 5, 1, 3, bottom + 5, 9, pillarEW, rotation); + this.fillBlocksRotated(world, sbb, 7, bottom + 5, 1, 7, bottom + 5, 9, pillarEW, rotation); + this.fillBlocksRotated(world, sbb, 1, bottom + 5, 3, 9, bottom + 5, 3, pillarNS, rotation); + this.fillBlocksRotated(world, sbb, 1, bottom + 5, 7, 9, bottom + 5, 7, pillarNS, rotation); + + this.decoratePillars(world, bottom, top, rotation, sbb); + } + + private void decoratePillarsCorners(WorldGenLevel world, RandomSource rand, int bottom, int top, Rotation rotation, BoundingBox sbb) { + final BlockState pillarEW = deco.pillarState.setValue(RotatedPillarBlock.AXIS, Direction.Axis.Z); + final BlockState pillarNS = deco.pillarState.setValue(RotatedPillarBlock.AXIS, Direction.Axis.X); + + this.fillBlocksRotated(world, sbb, 3, bottom + 5, 1, 3, bottom + 5, 9, pillarEW, rotation); + this.fillBlocksRotated(world, sbb, 7, bottom + 5, 1, 7, bottom + 5, 9, pillarEW, rotation); + this.fillBlocksRotated(world, sbb, 1, bottom + 5, 3, 9, bottom + 5, 3, pillarNS, rotation); + this.fillBlocksRotated(world, sbb, 1, bottom + 5, 7, 9, bottom + 5, 7, pillarNS, rotation); + + this.fillAirRotated(world, sbb, 3, bottom + 5, 3, 7, bottom + 5, 7, rotation); + + this.decoratePillars(world, bottom, top, rotation, sbb); + } + + private void decorateFarWallSteps(WorldGenLevel world, int bottom, int top, Rotation ladderUpDir, boolean hasTreasure, BoundingBox sbb) { + + // far set of stairs + for (int z = 1; z < 10; z++) { + int y = bottom + 10 - (z / 2); + this.setBlockStateRotated(world, (z % 2 == 0) ? deco.pillarState : deco.platformState, 9, y, z, ladderUpDir, sbb); + for (int by = bottom + 1; by < y; by++) { + this.setBlockStateRotated(world, deco.pillarState, 9, by, z, ladderUpDir, sbb); + } + } + + // near set of stairs + for (int z = 1; z < 10; z++) { + int y = bottom + 1 + (z / 2); + this.setBlockStateRotated(world, (z % 2 == 0) ? deco.platformState : deco.pillarState, 8, y, z, ladderUpDir, sbb); + for (int by = bottom + 1; by < y; by++) { + this.setBlockStateRotated(world, deco.pillarState, 8, by, z, ladderUpDir, sbb); + } + } + + // entry stair + this.setBlockStateRotated(world, deco.platformState, 7, bottom + 1, 1, ladderUpDir, sbb); + + // clear floor above + for (int z = 2; z < 7; z++) { + this.setBlockStateRotated(world, AIR, 9, top, z, ladderUpDir, sbb); + } + + final BlockState pillarNS = deco.pillarState.setValue(RotatedPillarBlock.AXIS, Direction.Axis.X); + // treasure! + if (hasTreasure) { + this.placeTreasureRotated(world, 1, bottom + 8, 5, getOrientation().getOpposite(), ladderUpDir, TFLootTables.AURORA_CACHE, false, sbb); + //int beamMetaNS = ((this.coordBaseMode + ladderUpDir) % 2 == 0) ? 4 : 8; + this.setBlockStateRotated(world, pillarNS, 1, bottom + 7, 5, ladderUpDir, sbb); + } + } + + private void decorateWraparoundWallSteps(WorldGenLevel world, int bottom, int top, Rotation ladderUpDir, boolean hasTreasure, BoundingBox sbb) { + BlockState topPlatform = deco.platformState.setValue(SlabBlock.TYPE, SlabType.TOP); + BlockState bottomPlatform = deco.platformState.setValue(SlabBlock.TYPE, SlabType.BOTTOM); + + // far set of stairs + for (int z = 1; z < 10; z++) { + int y = bottom + 10 - (z / 2); + this.setBlockStateRotated(world, ((z % 2 == 0) ? topPlatform : bottomPlatform), 9, y, z, ladderUpDir, sbb); + } + + // right set of stairs + for (int x = 1; x < 9; x++) { + int y = bottom + 2 + ((x - 1) / 2); + this.setBlockStateRotated(world, ((x % 2 == 0) ? topPlatform : bottomPlatform), x, y, 9, ladderUpDir, sbb); + } + + // entry stairs + this.setBlockStateRotated(world, topPlatform, 1, bottom + 1, 8, ladderUpDir, sbb); + this.setBlockStateRotated(world, deco.platformState, 1, bottom + 1, 7, ladderUpDir, sbb); + + // clear floor above + for (int z = 2; z < 7; z++) { + this.setBlockStateRotated(world, AIR, 9, top, z, ladderUpDir, sbb); + } + + // treasure! + if (hasTreasure) { + this.placeTreasureRotated(world, 1, bottom + 5, 5, getOrientation(), ladderUpDir, TFLootTables.AURORA_CACHE, false, sbb); + //int beamMetaNS = ((this.coordBaseMode + ladderUpDir) % 2 == 0) ? 4 : 8; + final BlockState pillarNS = deco.pillarState.setValue(RotatedPillarBlock.AXIS, Direction.Axis.X); + this.setBlockStateRotated(world, pillarNS, 1, bottom + 4, 5, ladderUpDir, sbb); + } + } + + private void decorateWraparoundWallStepsPillars(WorldGenLevel world, int bottom, int top, Rotation ladderUpDir, Rotation ladderDownDir, boolean hasTreasure, BoundingBox sbb) { + Rotation rotation = ladderDownDir; + final BlockState pillarEW = deco.pillarState.setValue(RotatedPillarBlock.AXIS, Direction.Axis.Z); + final BlockState pillarNS = deco.pillarState.setValue(RotatedPillarBlock.AXIS, Direction.Axis.X); + + this.decorateWraparoundWallSteps(world, bottom, top, ladderUpDir, false, sbb); + this.decoratePillars(world, bottom, top, rotation, sbb); + + this.fillBlocksRotated(world, sbb, 3, bottom + 5, 1, 3, bottom + 5, 2, pillarEW, rotation); + this.fillBlocksRotated(world, sbb, 7, bottom + 5, 1, 7, bottom + 5, 2, pillarEW, rotation); + this.fillBlocksRotated(world, sbb, 8, bottom + 5, 3, 9, bottom + 5, 3, pillarNS, rotation); + this.fillBlocksRotated(world, sbb, 8, bottom + 5, 7, 9, bottom + 5, 7, pillarNS, rotation); + + this.fillBlocksRotated(world, sbb, 1, bottom + 2, 3, 2, bottom + 2, 3, pillarNS, rotation); + this.fillBlocksRotated(world, sbb, 1, bottom + 6, 3, 2, bottom + 6, 3, pillarNS, rotation); + this.fillBlocksRotated(world, sbb, 1, bottom + 4, 7, 2, bottom + 4, 7, pillarNS, rotation); + this.fillBlocksRotated(world, sbb, 1, bottom + 8, 7, 2, bottom + 8, 7, pillarNS, rotation); + this.fillBlocksRotated(world, sbb, 3, bottom + 6, 8, 3, bottom + 6, 9, pillarEW, rotation); + this.fillBlocksRotated(world, sbb, 7, bottom + 8, 8, 7, bottom + 8, 9, pillarEW, rotation); + + // treasure! + if (hasTreasure) { + this.placeTreasureRotated(world, 7, bottom + 6, 1, getOrientation(), ladderUpDir, TFLootTables.AURORA_CACHE, false, sbb); + } + } + + private void decoratePlatform(WorldGenLevel world, RandomSource rand, int bottom, int top, Rotation ladderUpDir, Rotation ladderDownDir, boolean hasTreasure, BoundingBox sbb) { + BlockState topPlatform = deco.platformState.setValue(SlabBlock.TYPE, SlabType.TOP); + BlockState bottomPlatform = deco.platformState.setValue(SlabBlock.TYPE, SlabType.BOTTOM); + + this.decoratePillars(world, bottom, top, ladderDownDir, sbb); + this.fillBlocksRotated(world, sbb, 3, bottom + 5, 3, 7, bottom + 5, 7, deco.floorState, ladderDownDir); + + // one flight + for (int z = 6; z < 10; z++) { + int y = bottom - 2 + (z / 2); + this.setBlockStateRotated(world, ((z % 2 == 1) ? topPlatform : bottomPlatform), 1, y, z, ladderDownDir, sbb); + } + // two flight + for (int x = 2; x < 6; x++) { + int y = bottom + 2 + (x / 2); + this.setBlockStateRotated(world, ((x % 2 == 1) ? topPlatform : bottomPlatform), x, y, 9, ladderDownDir, sbb); + } + // connector + this.setBlockStateRotated(world, deco.platformState, 5, bottom + 5, 8, ladderDownDir, sbb); + + // connector + this.setBlockStateRotated(world, deco.platformState, 5, bottom + 6, 2, ladderUpDir, sbb); + // two flight + for (int x = 5; x < 10; x++) { + int y = bottom + 4 + (x / 2); + this.setBlockStateRotated(world, ((x % 2 == 1) ? topPlatform : bottomPlatform), x, y, 1, ladderUpDir, sbb); + if (x > 6) { + this.setBlockStateRotated(world, AIR, x, top, 1, ladderUpDir, sbb); + } + } + // one flight + for (int z = 2; z < 5; z++) { + int y = bottom + 8 + (z / 2); + this.setBlockStateRotated(world, AIR, 9, top, z, ladderUpDir, sbb); + this.setBlockStateRotated(world, ((z % 2 == 1) ? topPlatform : bottomPlatform), 9, y, z, ladderUpDir, sbb); + } + + // treasure! + if (hasTreasure) { + this.placeTreasureRotated(world, 3, bottom + 6, 5, getOrientation(), ladderDownDir, TFLootTables.AURORA_CACHE, false, sbb); + } + } + + private void decorateQuadPillarStairs(WorldGenLevel world, RandomSource rand, int bottom, int top, Rotation ladderUpDir, Rotation ladderDownDir, boolean hasTreasure, BoundingBox sbb) { + this.decoratePillars(world, bottom, top, ladderDownDir, sbb); + + BlockState topPlatform = deco.platformState.setValue(SlabBlock.TYPE, SlabType.TOP); + BlockState bottomPlatform = deco.platformState.setValue(SlabBlock.TYPE, SlabType.BOTTOM); + + // one flight + for (int z = 6; z < 9; z++) { + int y = bottom - 2 + (z / 2); + this.setBlockStateRotated(world, z % 2 == 1 ? topPlatform : bottomPlatform, 2, y, z, ladderDownDir, sbb); + } + // two flight + for (int x = 3; x < 9; x++) { + int y = bottom + 1 + (x / 2); + this.setBlockStateRotated(world, x % 2 == 1 ? topPlatform : bottomPlatform, x, y, 8, ladderDownDir, sbb); + } + // three flight + for (int z = 7; z > 1; z--) { + int y = top - 2 - ((z - 1) / 2); + if (z < 4) { + this.setBlockStateRotated(world, AIR, 8, top, z, ladderDownDir, sbb); + } + this.setBlockStateRotated(world, ((z % 2 == 1) ? topPlatform : bottomPlatform), 8, y, z, ladderDownDir, sbb); + } + // last flight + for (int x = 7; x > 3; x--) { + int y = top + 1 - ((x - 1) / 2); + this.setBlockStateRotated(world, AIR, x, top, 2, ladderDownDir, sbb); + this.setBlockStateRotated(world, ((x % 2 == 1) ? topPlatform : bottomPlatform), x, y, 2, ladderDownDir, sbb); + } + + // treasure! + if (hasTreasure) { + this.placeTreasureRotated(world, 3, bottom + 7, 7, getOrientation(), ladderUpDir, TFLootTables.AURORA_CACHE, false, sbb); + } + } + + private void decoratePillarPlatforms(WorldGenLevel world, int bottom, int top, Rotation ladderUpDir, boolean hasTreasure, BoundingBox sbb) { + // platforms + Rotation r = ladderUpDir; + for (int i = 1; i < 10; i++) { + r = r.getRotated(Rotation.CLOCKWISE_90); + this.fillBlocksRotated(world, sbb, 2, bottom + i, 2, 4, bottom + i, 4, deco.floorState, rotation); + } + + // clear + this.fillAirRotated(world, sbb, 2, top, 2, 8, top, 4, ladderUpDir); + this.fillAirRotated(world, sbb, 2, top, 2, 4, top, 6, ladderUpDir); + + // extra pillar tops + this.setBlockStateRotated(world, deco.platformState, 7, top, 3, ladderUpDir, sbb); + this.setBlockStateRotated(world, deco.platformState, 3, top, 3, ladderUpDir, sbb); + + this.decoratePillars(world, bottom, top, ladderUpDir, sbb); + + // treasure! + if (hasTreasure) { + this.placeTreasureRotated(world, 3, bottom + 5, 2, getOrientation(), ladderUpDir, TFLootTables.AURORA_CACHE, false, sbb); + } + } + + private void decoratePillarPlatformsOutside(WorldGenLevel world, int bottom, int top, Rotation ladderUpDir, boolean hasTreasure, BoundingBox sbb) { + // platforms + for (int i = 0; i < 2; i++) { + for (Rotation r : RotationUtil.ROTATIONS) { + if (i == 0 && r == Rotation.NONE) continue; + Rotation rotation = ladderUpDir.getRotated(r); + this.fillBlocksRotated(world, sbb, 1, bottom + i, 1, 3, bottom + i, 3, deco.platformState, rotation); + this.fillBlocksRotated(world, sbb, 4, bottom + i, 1, 6, bottom + i, 3, deco.floorState, rotation); + } + } + + // stairs + Rotation rotation = ladderUpDir.getRotated(Rotation.CLOCKWISE_180); + + this.fillAirRotated(world, sbb, 5, top, 8, 9, top, 9, rotation); + this.fillAirRotated(world, sbb, 8, top, 6, 9, top, 9, rotation); + + this.fillBlocksRotated(world, sbb, 8, top - 2, 7, 9, top - 2, 7, deco.platformState, rotation); + this.fillBlocksRotated(world, sbb, 8, top - 2, 8, 9, top - 2, 9, deco.floorState, rotation); + this.fillBlocksRotated(world, sbb, 7, top - 1, 8, 7, top - 1, 9, deco.platformState, rotation); + this.fillBlocksRotated(world, sbb, 6, top - 1, 8, 6, top - 1, 9, deco.platformState.setValue(SlabBlock.TYPE, SlabType.TOP), rotation); + this.fillBlocksRotated(world, sbb, 5, top, 8, 5, top, 9, deco.platformState, rotation); + + this.decoratePillars(world, bottom, top, ladderUpDir, sbb); + + // treasure! + if (hasTreasure) { + this.placeTreasureRotated(world, 3, bottom + 5, 2, getOrientation(), ladderUpDir, TFLootTables.AURORA_CACHE, false, sbb); + } + } + + + private void decoratePillarParkour(WorldGenLevel world, RandomSource rand, int bottom, int top, Rotation ladderUpDir, Rotation ladderDownDir, boolean hasTreasure, BoundingBox sbb) { + Rotation rotation = ladderDownDir; + + final BlockState pillarEW = deco.pillarState.setValue(RotatedPillarBlock.AXIS, Direction.Axis.Z); + final BlockState pillarNS = deco.pillarState.setValue(RotatedPillarBlock.AXIS, Direction.Axis.X); + + // 4 pillars + this.decoratePillars(world, bottom, top, rotation, sbb); + + // center pillar + this.setBlockStateRotated(world, deco.pillarState, 5, bottom + 1, 5, rotation, sbb); + + // pillar 2 + this.fillBlocksRotated(world, sbb, 5, bottom + 2, 7, 5, bottom + 2, 9, pillarEW, rotation); + + // gap 3 + this.fillBlocksRotated(world, sbb, 1, bottom + 3, 7, 2, bottom + 3, 7, pillarNS, rotation); + this.fillBlocksRotated(world, sbb, 3, bottom + 3, 8, 3, bottom + 3, 9, pillarEW, rotation); + this.fillBlocksRotated(world, sbb, 1, bottom + 7, 7, 2, bottom + 7, 7, pillarNS, rotation); + this.fillBlocksRotated(world, sbb, 3, bottom + 7, 8, 3, bottom + 7, 9, pillarEW, rotation); + this.fillAirRotated(world, sbb, 3, bottom + 4, 7, 3, bottom + 6, 7, rotation); + + // pillar 4 + this.fillBlocksRotated(world, sbb, 1, bottom + 4, 5, 2, bottom + 4, 5, pillarNS, rotation); + + // gap 5 + this.fillBlocksRotated(world, sbb, 3, bottom + 5, 1, 3, bottom + 5, 2, pillarEW, rotation); + this.fillBlocksRotated(world, sbb, 1, bottom + 5, 3, 2, bottom + 5, 3, pillarNS, rotation); + this.fillAirRotated(world, sbb, 3, bottom + 6, 3, 3, bottom + 8, 3, rotation); + + // pillar 6 + this.fillBlocksRotated(world, sbb, 5, bottom + 6, 1, 5, bottom + 6, 2, pillarEW, rotation); + + // gap 7 + this.fillAirRotated(world, sbb, 7, bottom + 8, 3, 7, bottom + 10, 3, rotation); + this.fillBlocksRotated(world, sbb, 7, bottom + 7, 1, 7, bottom + 7, 2, pillarEW, rotation); + this.fillBlocksRotated(world, sbb, 8, bottom + 7, 3, 9, bottom + 7, 3, pillarNS, rotation); + + // pillar 8 + this.fillBlocksRotated(world, sbb, 8, bottom + 8, 5, 9, bottom + 8, 5, pillarNS, rotation); + + // gap 9 (no gap?) + //this.fillAirRotated(world, sbb, 7, bottom + 10, 7, 7, bottom + 10, 7, rotation); + this.fillBlocksRotated(world, sbb, 8, bottom + 9, 7, 9, bottom + 9, 7, pillarNS, rotation); + this.fillBlocksRotated(world, sbb, 7, bottom + 9, 8, 7, bottom + 9, 9, pillarEW, rotation); + + // holes in ceiling + this.fillAirRotated(world, sbb, 2, top, 2, 8, top, 4, ladderUpDir); + this.fillAirRotated(world, sbb, 2, top, 2, 4, top, 6, ladderUpDir); + + // treasure! + if (hasTreasure) { + this.placeTreasureRotated(world, 8, bottom + 8, 7, getOrientation(), ladderUpDir, TFLootTables.AURORA_CACHE, false, sbb); + } + } + + /** + * Attach a roof to this tower. + *

+ * This function keeps trying roofs starting with the largest and fanciest, and then keeps trying smaller and plainer ones + */ + @Override + public void makeARoof(StructurePiece parent, StructurePieceAccessor list, RandomSource rand) { + int index = this.getGenDepth(); + tryToFitRoof(list, rand, new IceTowerRoofComponent(index + 1, this, getLocatorPosition().getX(), getLocatorPosition().getY(), getLocatorPosition().getZ())); + } + + /** + * Add a beard to this structure. There is only one type of beard. + */ + @Override + public void makeABeard(StructurePiece parent, StructurePieceAccessor list, RandomSource rand) { + int index = this.getGenDepth(); + IceTowerBeardComponent beard; + beard = new IceTowerBeardComponent(index + 1, this, getLocatorPosition().getX(), getLocatorPosition().getY(), getLocatorPosition().getZ()); + list.addPiece(beard); + beard.addChildren(this, list, rand); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/icetower/package-info.java b/src/main/java/twilightforest/world/components/structures/icetower/package-info.java new file mode 100644 index 0000000000..a09737a80b --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/icetower/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.world.components.structures.icetower; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/world/components/structures/lichtower/TowerBeardAttachedComponent.java b/src/main/java/twilightforest/world/components/structures/lichtower/TowerBeardAttachedComponent.java new file mode 100644 index 0000000000..3710cbf19f --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/lichtower/TowerBeardAttachedComponent.java @@ -0,0 +1,45 @@ +package twilightforest.world.components.structures.lichtower; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFStructurePieceTypes; +import twilightforest.world.components.structures.TFStructureComponentOld; + + +public class TowerBeardAttachedComponent extends TowerBeardComponent { + + public TowerBeardAttachedComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFLTBA.get(), nbt); + } + + public TowerBeardAttachedComponent(int i, TowerWingComponent wing, int x, int y, int z) { + super(TFStructurePieceTypes.TFLTBA.get(), i, wing, x, y, z); + + // just hang out at the very bottom of the tower + this.boundingBox = new BoundingBox(wing.getBoundingBox().minX(), wing.getBoundingBox().minY() - this.height - 1, wing.getBoundingBox().minZ(), wing.getBoundingBox().maxX(), wing.getBoundingBox().maxY() - 1, wing.getBoundingBox().maxZ()); + } + + /** + * Makes a pyramid-shaped beard + */ + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + makeAttachedBeard(world, rand, sbb); + } + + private void makeAttachedBeard(WorldGenLevel world, RandomSource rand, BoundingBox sbb) { + for (int y = 0; y <= height; y++) { + int min = y + 1; + int max = size - y; + + generateBox(world, sbb, 0, height - y, min, max, height - y, max, false, rand, TFStructureComponentOld.getStrongholdStones()); + } + } +} diff --git a/src/main/java/twilightforest/world/components/structures/lichtower/TowerBeardComponent.java b/src/main/java/twilightforest/world/components/structures/lichtower/TowerBeardComponent.java new file mode 100644 index 0000000000..58957d4287 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/lichtower/TowerBeardComponent.java @@ -0,0 +1,66 @@ +package twilightforest.world.components.structures.lichtower; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; +import twilightforest.init.TFStructurePieceTypes; +import twilightforest.world.components.structures.TFStructureComponentOld; + + +public class TowerBeardComponent extends TFStructureComponentOld { + + final int size; + int height; + + public TowerBeardComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + this(TFStructurePieceTypes.TFLTBea.get(), nbt); + } + + public TowerBeardComponent(StructurePieceType piece, CompoundTag nbt) { + super(piece, nbt); + this.size = nbt.getInt("beardSize"); + this.height = nbt.getInt("beardHeight"); + } + + public TowerBeardComponent(StructurePieceType piece, int i, TowerWingComponent wing, int x, int y, int z) { + super(piece, i, x, y, z); + + this.setOrientation(wing.getOrientation()); + this.size = wing.size - 2; + this.height = size / 2; + + // just hang out at the very bottom of the tower + this.boundingBox = new BoundingBox(wing.getBoundingBox().minX() + 1, wing.getBoundingBox().minY() - this.height - 1, wing.getBoundingBox().minZ() + 1, wing.getBoundingBox().maxX() - 1, wing.getBoundingBox().minY() - 1, wing.getBoundingBox().maxZ() - 1); + } + + @Override + protected void addAdditionalSaveData(StructurePieceSerializationContext ctx, CompoundTag tagCompound) { + super.addAdditionalSaveData(ctx, tagCompound); + tagCompound.putInt("beardSize", this.size); + tagCompound.putInt("beardHeight", this.height); + } + + /** + * Makes a pyramid-shaped beard + */ + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + makePyramidBeard(world, rand, sbb); + } + + private void makePyramidBeard(WorldGenLevel world, RandomSource rand, BoundingBox sbb) { + for (int y = 0; y <= height; y++) { + int min = y; + int max = size - y - 1; + + generateBox(world, sbb, min, height - y, min, max, height - y, max, false, rand, TFStructureComponentOld.getStrongholdStones()); + } + } +} diff --git a/src/main/java/twilightforest/world/components/structures/lichtower/TowerBridgeComponent.java b/src/main/java/twilightforest/world/components/structures/lichtower/TowerBridgeComponent.java new file mode 100644 index 0000000000..4a77464e53 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/lichtower/TowerBridgeComponent.java @@ -0,0 +1,81 @@ +package twilightforest.world.components.structures.lichtower; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFLandmark; +import twilightforest.init.TFStructurePieceTypes; + + +public class TowerBridgeComponent extends TowerWingComponent { + + int dSize; + int dHeight; + + public TowerBridgeComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFLTBri.get(), nbt); + } + + protected TowerBridgeComponent(int i, int x, int y, int z, int pSize, int pHeight, Direction direction) { + super(TFStructurePieceTypes.TFLTBri.get(), i, x, y, z, 3, 3, direction); + + this.dSize = pSize; + this.dHeight = pHeight; + } + + @Override + public void addChildren(StructurePiece parent, StructurePieceAccessor list, RandomSource rand) { + int[] dest = new int[]{2, 1, 1};//getValidOpening(rand, 0); + makeTowerWing(list, rand, 1, dest[0], dest[1], dest[2], dSize, dHeight, Rotation.NONE); + } + + /** + * Gets the bounding box of the tower wing we would like to make. + * + * @return + */ + public BoundingBox getWingBB() { + int[] dest = offsetTowerCoords(2, 1, 1, dSize, this.getOrientation()); + return TFLandmark.getComponentToAddBoundingBox(dest[0], dest[1], dest[2], 0, 0, 0, dSize - 1, dHeight - 1, dSize - 1, this.getOrientation(), false); + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + // make walls + for (int x = 0; x < 3; x++) { + placeBlock(world, Blocks.OAK_FENCE.defaultBlockState(), x, 2, 0, sbb); + placeBlock(world, Blocks.OAK_FENCE.defaultBlockState(), x, 2, 2, sbb); + placeBlock(world, Blocks.STONE_BRICKS.defaultBlockState(), x, 1, 0, sbb); + placeBlock(world, Blocks.STONE_BRICKS.defaultBlockState(), x, 1, 2, sbb); + placeBlock(world, Blocks.STONE_BRICKS.defaultBlockState(), x, 0, 0, sbb); + placeBlock(world, Blocks.STONE_BRICKS.defaultBlockState(), x, 0, 1, sbb); + placeBlock(world, Blocks.STONE_BRICKS.defaultBlockState(), x, 0, 2, sbb); + placeBlock(world, Blocks.STONE_BRICKS.defaultBlockState(), x, -1, 1, sbb); + } + + // try two blocks outside the boundries + placeBlock(world, Blocks.STONE_BRICKS.defaultBlockState(), -1, -1, 1, sbb); + placeBlock(world, Blocks.STONE_BRICKS.defaultBlockState(), 3, -1, 1, sbb); + + // clear bridge walkway + this.generateAirBox(world, sbb, 0, 1, 1, 2, 2, 1); + + // marker blocks +// setBlockState(world, Blocks.WOOL, this.coordBaseMode, size / 2, 2, size / 2, sbb); +// setBlockState(world, Blocks.GOLD_BLOCK, 0, 0, 0, 0, sbb); + + // door opening? +// makeDoorOpening(world, sbb); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/lichtower/TowerMainComponent.java b/src/main/java/twilightforest/world/components/structures/lichtower/TowerMainComponent.java new file mode 100644 index 0000000000..acb4c92552 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/lichtower/TowerMainComponent.java @@ -0,0 +1,471 @@ +package twilightforest.world.components.structures.lichtower; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.PipeBlock; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.SlabBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.SlabType; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.phys.AABB; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFEntities; +import twilightforest.init.TFStructurePieceTypes; +import twilightforest.util.EntityUtil; +import twilightforest.util.RotationUtil; +import twilightforest.world.components.structures.TFStructureComponentOld; + +public class TowerMainComponent extends TowerWingComponent { + + public TowerMainComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFLTMai.get(), nbt); + } + + public TowerMainComponent(RandomSource rand, int index, int x, int y, int z) { + // some of these are subject to change if the ground level is > 30. + super(TFStructurePieceTypes.TFLTMai.get(), index, x, y + 1, z, 15, 55 + rand.nextInt(32), Direction.SOUTH); + } + + @Override + public void addChildren(StructurePiece parent, StructurePieceAccessor list, RandomSource rand) { + // add a roof? + makeARoof(parent, list, rand); + + // sub towers + for (final Rotation rotation : RotationUtil.ROTATIONS) { + int[] dest = getValidOpening(rand, rotation); + + // adjust height if we're too low at this point + if (dest[1] < height / 2) { + dest[1] += 20; + } + + int childHeight = Math.min(21 + rand.nextInt(10), this.height - dest[1] - 3); + + if (!makeTowerWing(list, rand, 1, dest[0], dest[1], dest[2], 9, childHeight, rotation)) { + makeTowerWing(list, rand, 1, dest[0], dest[1], dest[2], 7, childHeight, rotation); + } + } + + // try one more time for large towers + for (final Rotation rotation : RotationUtil.ROTATIONS) { + int[] dest = getValidOpening(rand, rotation); + + // adjust height if we're too low at this point + if (dest[1] < height / 2) { + dest[1] += 10; + } + + int childHeight = Math.min(21 + rand.nextInt(10), this.height - dest[1] - 3); + + if (!makeTowerWing(list, rand, 1, dest[0], dest[1], dest[2], 9, childHeight, rotation)) { + makeTowerWing(list, rand, 1, dest[0], dest[1], dest[2], 7, childHeight, rotation); + } + } + + // another set, if possible + for (final Rotation rotation : RotationUtil.ROTATIONS) { + int[] dest = getValidOpening(rand, rotation); + + int childHeight = Math.min(7 + rand.nextInt(6), this.height - dest[1] - 3); + + if (!makeTowerWing(list, rand, 1, dest[0], dest[1], dest[2], 5, childHeight, rotation)) { + makeTowerWing(list, rand, 1, dest[0], dest[1], dest[2], 3, childHeight, rotation); + } + } + + // outbuildings + for (final Rotation rotation : RotationUtil.ROTATIONS) { + int[] dest = getOutbuildingOpening(rand, rotation); + + int childHeight = 11 + rand.nextInt(10); + int childSize = 7 + (rand.nextInt(2) * 2); + + makeTowerOutbuilding(list, rand, 1, dest[0], dest[1], dest[2], childSize, childHeight, rotation); + } + + // TINY TOWERS! + for (int i = 0; i < 4; i++) { + for (final Rotation towerRotation : RotationUtil.ROTATIONS) { + int[] dest = getValidOpening(rand, towerRotation); + int childHeight = 6 + rand.nextInt(5); + if (rand.nextInt(3) == 0 || !makeTowerWing(list, rand, 1, dest[0], dest[1], dest[2], 5, childHeight, towerRotation)) { + makeTowerWing(list, rand, 1, dest[0], dest[1], dest[2], 3, childHeight, towerRotation); + } + } + } + } + + /** + * Gets a random position in the specified direction that we can make an outbuilding at + */ + public int[] getOutbuildingOpening(RandomSource rand, Rotation rotation) { + + int rx = 0; + int ry = 1; + int rz = 0; + + switch (rotation) { + case NONE -> { + // for directions 0 or 2, the wall lies along the z axis + rx = size - 1; + rz = 6 + rand.nextInt(8); + } + case CLOCKWISE_90 -> { + // for directions 1 or 3, the wall lies along the x axis + rx = 1 + rand.nextInt(11); + rz = size - 1; + } + case CLOCKWISE_180 -> { + rx = 0; + rz = 1 + rand.nextInt(8); + } + case COUNTERCLOCKWISE_90 -> { + rx = 3 + rand.nextInt(11); + rz = 0; + } + } + + return new int[]{rx, ry, rz}; + } + + public boolean makeTowerOutbuilding(StructurePieceAccessor list, RandomSource rand, int index, int x, int y, int z, int wingSize, int wingHeight, Rotation rotation) { + Direction direction = getStructureRelativeRotation(rotation); + int[] dx = offsetTowerCoords(x, y, z, wingSize, direction); + TowerOutbuildingComponent outbuilding = new TowerOutbuildingComponent(index, dx[0], dx[1], dx[2], wingSize, wingHeight, direction); + // check to see if it intersects something already there + StructurePiece intersect = list.findCollisionPiece(outbuilding.getBoundingBox()); + if (intersect == null) { + list.addPiece(outbuilding); + outbuilding.addChildren(this, list, rand); + addOpening(x, y, z, rotation); + return true; + } else { + return false; + } + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + // make walls + generateBox(world, sbb, 0, 0, 0, size - 1, height - 1, size - 1, false, rand, TFStructureComponentOld.getStrongholdStones()); + + // clear inside + generateAirBox(world, sbb, 1, 1, 1, size - 2, height - 2, size - 2); + final BlockState defaultState = Blocks.COBBLESTONE.defaultBlockState(); + // stone to ground + for (int x = 0; x < this.size; x++) { + for (int z = 0; z < this.size; z++) { + this.fillColumnDown(world, defaultState, x, -1, z, sbb); + } + } + + // nullify sky light +// nullifySkyLightForBoundingBox(world); + + // fix highestOpening parameter so we don't get a ginormous lich room + if ((height - highestOpening) > 15) { + highestOpening = height - 15; + } + + // stairs! + makeStairs(world, rand, sbb); + + // throw a bunch of opening markers in there + //makeOpeningMarkers(world, rand, 100, sbb); + + // openings + makeOpenings(world, sbb); + + // decorate? + decorateStairFloor(world, generator, rand, sbb); + + // stairway crossings + makeStairwayCrossings(world, rand, sbb); + + // LICH TIME + makeLichRoom(world, rand, sbb); + + // extra paintings in main tower + makeTowerPaintings(world, rand, sbb); + } + + /** + * Make 1-2 platforms joining the stairways + */ + protected void makeStairwayCrossings(WorldGenLevel world, RandomSource rand, BoundingBox sbb) { + int flights = (this.highestOpening / 5) - 2; + + for (int i = 2 + rand.nextInt(2); i < flights; i += 1 + rand.nextInt(5)) { + makeStairCrossing(world, rand, i, sbb); + } + } + + protected void makeStairCrossing(WorldGenLevel world, RandomSource rand, int flight, BoundingBox sbb) { + Direction temp = this.getOrientation(); + if (flight % 2 == 0) { + this.setOrientation(getStructureRelativeRotation(Rotation.CLOCKWISE_90)); + } + + // place platform + int floorLevel = flight * 5; + BlockState crossingfloor = rand.nextBoolean() ? Blocks.SMOOTH_STONE_SLAB.defaultBlockState().setValue(SlabBlock.TYPE, SlabType.DOUBLE) : Blocks.BIRCH_PLANKS.defaultBlockState(); + for (int dx = 6; dx <= 8; dx++) { + for (int dz = 4; dz <= 10; dz++) { + placeBlock(world, crossingfloor, dx, floorLevel, dz, sbb); + } + } + + // put fences + floorLevel++; + int dx = 6; + for (int dz = 3; dz <= 11; dz++) { + placeBlock(world, Blocks.OAK_FENCE.defaultBlockState(), dx, floorLevel, dz, sbb); + } + dx++; + for (int dz = 3; dz <= 11; dz++) { + placeBlock(world, AIR, dx, floorLevel, dz, sbb); + } + dx++; + for (int dz = 3; dz <= 11; dz++) { + placeBlock(world, Blocks.OAK_FENCE.defaultBlockState(), dx, floorLevel, dz, sbb); + } + + // we need 2 extra blocks and 2 extra fences to look good + placeBlock(world, crossingfloor, 6, floorLevel - 1, 11, sbb); + placeBlock(world, crossingfloor, 8, floorLevel - 1, 3, sbb); + + placeBlock(world, Blocks.OAK_FENCE.defaultBlockState(), 5, floorLevel, 11, sbb); + placeBlock(world, Blocks.OAK_FENCE.defaultBlockState(), 9, floorLevel, 3, sbb); + + // place spawner in the middle + EntityType mobID = switch (rand.nextInt(4)) { + case 2 -> EntityType.ZOMBIE; + case 3 -> TFEntities.SWARM_SPIDER.get(); + default -> EntityType.SKELETON; + }; + setSpawner(world, 7, floorLevel + 2, 7, sbb, mobID); + + // make a fence arch support for the spawner + placeBlock(world, Blocks.OAK_FENCE.defaultBlockState(), 6, floorLevel + 1, 7, sbb); + placeBlock(world, Blocks.OAK_FENCE.defaultBlockState(), 8, floorLevel + 1, 7, sbb); + placeBlock(world, Blocks.OAK_FENCE.defaultBlockState(), 6, floorLevel + 2, 7, sbb); + placeBlock(world, Blocks.OAK_FENCE.defaultBlockState(), 8, floorLevel + 2, 7, sbb); + + this.setOrientation(temp); + } + + /** + * Make a neat little room for the lich to fight in + */ + protected void makeLichRoom(WorldGenLevel world, RandomSource rand, BoundingBox sbb) { + // figure out where the stairs end + int floorLevel = 2 + (this.highestOpening / 5) * 5; + // we need a floor + final Rotation i = (this.highestOpening / 5) % 2 == 0 ? Rotation.NONE : Rotation.CLOCKWISE_90; + makeLichFloor(world, floorLevel, i, sbb); + + // now a chandelier + decorateLichChandelier(world, floorLevel, sbb); + + // make paintings + decoratePaintings(world, rand, floorLevel, sbb); + + // and wall torches + decorateTorches(world, rand, floorLevel, sbb); + + // seems like we should have a spawner + placeBlock(world, TFBlocks.LICH_BOSS_SPAWNER.get().defaultBlockState(), size / 2, floorLevel + 2, size / 2, sbb); + } + + protected void makeTowerPaintings(WorldGenLevel world, RandomSource rand, BoundingBox sbb) { + int howMany = 10; + + // do wall 0. + generatePaintingsOnWall(world, rand, howMany, 0, Direction.WEST, 48, sbb); + generatePaintingsOnWall(world, rand, howMany, 0, Direction.WEST, 32, sbb); + generatePaintingsOnWall(world, rand, howMany, 0, Direction.WEST, 0, sbb); + + // do wall 1. + generatePaintingsOnWall(world, rand, howMany, 0, Direction.EAST, 48, sbb); + generatePaintingsOnWall(world, rand, howMany, 0, Direction.EAST, 32, sbb); + generatePaintingsOnWall(world, rand, howMany, 0, Direction.EAST, 0, sbb); + // do wall 2. + generatePaintingsOnWall(world, rand, howMany, 0, Direction.NORTH, 48, sbb); + generatePaintingsOnWall(world, rand, howMany, 0, Direction.NORTH, 32, sbb); + generatePaintingsOnWall(world, rand, howMany, 0, Direction.NORTH, 0, sbb); + // do wall 3. + generatePaintingsOnWall(world, rand, howMany, 0, Direction.SOUTH, 48, sbb); + generatePaintingsOnWall(world, rand, howMany, 0, Direction.SOUTH, 32, sbb); + generatePaintingsOnWall(world, rand, howMany, 0, Direction.SOUTH, 0, sbb); + } + + /** + * Make the floor for the liches room + */ + protected void makeLichFloor(WorldGenLevel world, int floorLevel, Rotation rotation, BoundingBox sbb) { + Direction temp = this.getOrientation(); + this.setOrientation(getStructureRelativeRotation(rotation)); + + BlockState birchSlab = Blocks.BIRCH_SLAB.defaultBlockState() + .setValue(SlabBlock.TYPE, SlabType.TOP); + BlockState birchPlank = Blocks.BIRCH_PLANKS.defaultBlockState(); + + // place a platform there + for (int fx = 1; fx < 14; fx++) { + for (int fz = 1; fz < 14; fz++) { + if ((fx == 1 || fx == 2) && (fz >= 6 && fz <= 12)) { + // blank, leave room for stairs + if (fz == 6) { + // upside down plank slabs + placeBlock(world, birchSlab, fx, floorLevel, fz, sbb); + } + } else if ((fx == 12 || fx == 13) && (fz >= 3 && fz <= 8)) { + // blank, leave room for stairs + if (fz == 8) { + // upside down plank slabs + placeBlock(world, birchSlab, fx, floorLevel, fz, sbb); + } + } else if ((fx >= 4 && fx <= 10) && (fz >= 4 && fz <= 10)) { + // glass floor in center, aside from 2 corners + if ((fx == 4 && fz == 4) || (fx == 10 && fz == 10)) { + placeBlock(world, birchPlank, fx, floorLevel, fz, sbb); + } else { + placeBlock(world, Blocks.GLASS.defaultBlockState(), fx, floorLevel, fz, sbb); + } + } else if ((fx == 2 || fx == 3) && (fz == 2 || fz == 3)) { + // glass blocks in the corners + placeBlock(world, Blocks.GLASS.defaultBlockState(), fx, floorLevel, fz, sbb); + } else if ((fx == 11 || fx == 12) && (fz == 11 || fz == 12)) { + // glass blocks in the corners + placeBlock(world, Blocks.GLASS.defaultBlockState(), fx, floorLevel, fz, sbb); + } else { + placeBlock(world, birchPlank, fx, floorLevel, fz, sbb); + } + } + } + + // eliminate the railings + placeBlock(world, AIR, 3, floorLevel + 1, 11, sbb); + placeBlock(world, AIR, 3, floorLevel + 1, 10, sbb); + placeBlock(world, AIR, 3, floorLevel + 2, 11, sbb); + + placeBlock(world, AIR, 11, floorLevel + 1, 3, sbb); + placeBlock(world, AIR, 11, floorLevel + 1, 4, sbb); + placeBlock(world, AIR, 11, floorLevel + 2, 3, sbb); + + this.setOrientation(temp); + } + + /** + * Make a fancy chandelier for the lich's room + */ + protected void decorateLichChandelier(WorldGenLevel world, int floorLevel, BoundingBox sbb) { + int cx = size / 2; + int cy = floorLevel + 4; + int cz = size / 2; + + placeBlock(world, Blocks.OAK_FENCE.defaultBlockState(), cx + 1, cy, cz, sbb); + placeBlock(world, Blocks.OAK_FENCE.defaultBlockState(), cx + 2, cy, cz, sbb); + placeBlock(world, Blocks.OAK_FENCE.defaultBlockState(), cx + 1, cy, cz + 1, sbb); + placeBlock(world, Blocks.OAK_FENCE.defaultBlockState(), cx, cy, cz + 1, sbb); + placeBlock(world, Blocks.OAK_FENCE.defaultBlockState(), cx, cy, cz + 2, sbb); + placeBlock(world, Blocks.OAK_FENCE.defaultBlockState(), cx - 1, cy, cz + 1, sbb); + placeBlock(world, Blocks.OAK_FENCE.defaultBlockState(), cx - 1, cy, cz, sbb); + placeBlock(world, Blocks.OAK_FENCE.defaultBlockState(), cx - 2, cy, cz, sbb); + placeBlock(world, Blocks.OAK_FENCE.defaultBlockState(), cx - 1, cy, cz - 1, sbb); + placeBlock(world, Blocks.OAK_FENCE.defaultBlockState(), cx, cy, cz - 1, sbb); + placeBlock(world, Blocks.OAK_FENCE.defaultBlockState(), cx, cy, cz - 2, sbb); + placeBlock(world, Blocks.OAK_FENCE.defaultBlockState(), cx + 1, cy, cz - 1, sbb); + + cy++; + placeBlock(world, Blocks.OAK_FENCE.defaultBlockState(), cx + 1, cy, cz, sbb); + placeBlock(world, Blocks.TORCH.defaultBlockState(), cx + 2, cy, cz, sbb); + placeBlock(world, Blocks.TORCH.defaultBlockState(), cx + 1, cy, cz + 1, sbb); + placeBlock(world, Blocks.OAK_FENCE.defaultBlockState(), cx, cy, cz + 1, sbb); + placeBlock(world, Blocks.TORCH.defaultBlockState(), cx, cy, cz + 2, sbb); + placeBlock(world, Blocks.TORCH.defaultBlockState(), cx - 1, cy, cz + 1, sbb); + placeBlock(world, Blocks.OAK_FENCE.defaultBlockState(), cx - 1, cy, cz, sbb); + placeBlock(world, Blocks.TORCH.defaultBlockState(), cx - 2, cy, cz, sbb); + placeBlock(world, Blocks.TORCH.defaultBlockState(), cx - 1, cy, cz - 1, sbb); + placeBlock(world, Blocks.OAK_FENCE.defaultBlockState(), cx, cy, cz - 1, sbb); + placeBlock(world, Blocks.TORCH.defaultBlockState(), cx, cy, cz - 2, sbb); + placeBlock(world, Blocks.TORCH.defaultBlockState(), cx + 1, cy, cz - 1, sbb); + + cy++; + placeBlock(world, Blocks.TORCH.defaultBlockState(), cx + 1, cy, cz, sbb); + placeBlock(world, Blocks.TORCH.defaultBlockState(), cx, cy, cz + 1, sbb); + placeBlock(world, Blocks.TORCH.defaultBlockState(), cx - 1, cy, cz, sbb); + placeBlock(world, Blocks.TORCH.defaultBlockState(), cx, cy, cz - 1, sbb); + + for (int y = floorLevel + 5; y < height - 1; y++) { + placeBlock(world, Blocks.OAK_FENCE.defaultBlockState(), cx, y, cz, sbb); + } + } + + /** + * Cover the walls in the lich's room with paintings. How is this going to work, chunk by chunk? + */ + protected void decoratePaintings(WorldGenLevel world, RandomSource rand, int floorLevel, BoundingBox sbb) { + // I reduced this number since it turns out paintings already generate in the boss room before this is called + int howMany = 25; + + for (final Direction horizontal : Direction.Plane.HORIZONTAL) { + // do wall 0. + generatePaintingsOnWall(world, rand, howMany, floorLevel, horizontal, 48, sbb); + generatePaintingsOnWall(world, rand, howMany, floorLevel, horizontal, 32, sbb); + generatePaintingsOnWall(world, rand, howMany, floorLevel, horizontal, 0, sbb); + } + } + + /** + * Put torches on each wall + */ + protected void decorateTorches(WorldGenLevel world, RandomSource rand, int floorLevel, BoundingBox sbb) { + generateTorchesOnWall(world, rand, floorLevel, Direction.SOUTH, sbb); + generateTorchesOnWall(world, rand, floorLevel, Direction.EAST, sbb); + generateTorchesOnWall(world, rand, floorLevel, Direction.NORTH, sbb); + generateTorchesOnWall(world, rand, floorLevel, Direction.WEST, sbb); + } + + /** + * Place up to 5 torches (with fence holders) on the wall, checking that they don't overlap any paintings or other torches + */ + protected void generateTorchesOnWall(WorldGenLevel world, RandomSource rand, + int floorLevel, Direction direction, BoundingBox sbb) { + for (int i = 0; i < 5; i++) { + // get some random coordinates on the wall in the chunk + BlockPos wCoords = getRandomWallSpot(rand, floorLevel, direction, sbb); + + if(wCoords == null) + continue; + + // offset to see where the fence should be + BlockPos.MutableBlockPos tCoords = new BlockPos.MutableBlockPos(wCoords.getX(), wCoords.getY(), wCoords.getZ()); + + // is there a painting or another torch there? + BlockState blockState = world.getBlockState(tCoords); + BlockState aboveBlockState = world.getBlockState(tCoords.above()); + if (blockState.getMaterial() == Material.AIR && + aboveBlockState.getMaterial() == Material.AIR && + EntityUtil.getEntitiesInAABB(world, new AABB(tCoords)).size() == 0) { + // if not, place a torch + world.setBlock(tCoords, Blocks.OAK_FENCE.defaultBlockState().setValue(PipeBlock.PROPERTY_BY_DIRECTION.get(direction.getOpposite()), true), 2); + world.setBlock(tCoords.above(), Blocks.TORCH.defaultBlockState(), 2); + } + } + } +} diff --git a/src/main/java/twilightforest/world/components/structures/lichtower/TowerOutbuildingComponent.java b/src/main/java/twilightforest/world/components/structures/lichtower/TowerOutbuildingComponent.java new file mode 100644 index 0000000000..d3b4dfc340 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/lichtower/TowerOutbuildingComponent.java @@ -0,0 +1,60 @@ +package twilightforest.world.components.structures.lichtower; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFStructurePieceTypes; + + +public class TowerOutbuildingComponent extends TowerWingComponent { + + public TowerOutbuildingComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFLTOut.get(), nbt); + } + + protected TowerOutbuildingComponent(int i, int x, int y, int z, int pSize, int pHeight, Direction direction) { + super(TFStructurePieceTypes.TFLTOut.get(), i, x, y, z, pSize, pHeight, direction); + } + + /** + * NO BEARDS! + */ + @Override + public void makeABeard(StructurePiece parent, StructurePieceAccessor list, RandomSource rand) { + } + + /** + * Outbuildings should not make new wings close to the ground. + */ + @Override + public boolean makeTowerWing(StructurePieceAccessor list, RandomSource rand, int index, int x, int y, int z, int wingSize, int wingHeight, Rotation direction) { + if (y > 7) { + return super.makeTowerWing(list, rand, index, x, y, z, wingSize, wingHeight, direction); + } else { + return false; + } + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + final BlockState cobblestone = Blocks.COBBLESTONE.defaultBlockState(); + for (int x = 0; x < this.size; x++) { + for (int z = 0; z < this.size; z++) { + this.fillColumnDown(world, cobblestone, x, -1, z, sbb); + } + } + super.postProcess(world, manager, generator, rand, sbb, chunkPosIn, blockPos); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/lichtower/TowerRoofAttachedSlabComponent.java b/src/main/java/twilightforest/world/components/structures/lichtower/TowerRoofAttachedSlabComponent.java new file mode 100644 index 0000000000..fda9061563 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/lichtower/TowerRoofAttachedSlabComponent.java @@ -0,0 +1,33 @@ +package twilightforest.world.components.structures.lichtower; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFStructurePieceTypes; + + +public class TowerRoofAttachedSlabComponent extends TowerRoofSlabComponent { + + public TowerRoofAttachedSlabComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFLTRAS.get(), nbt); + } + + public TowerRoofAttachedSlabComponent(int i, TowerWingComponent wing, int x, int y, int z) { + super(TFStructurePieceTypes.TFLTRAS.get(), i, wing, x, y, z); + } + + /** + * Makes a flat, pyramid-shaped roof that is connected to the parent tower + */ + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + makeConnectedCap(world, Blocks.BIRCH_SLAB.defaultBlockState(), Blocks.BIRCH_PLANKS.defaultBlockState(), sbb); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/lichtower/TowerRoofComponent.java b/src/main/java/twilightforest/world/components/structures/lichtower/TowerRoofComponent.java new file mode 100644 index 0000000000..441816ffbe --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/lichtower/TowerRoofComponent.java @@ -0,0 +1,92 @@ +package twilightforest.world.components.structures.lichtower; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; +import twilightforest.init.TFStructurePieceTypes; +import twilightforest.world.components.structures.TFStructureComponentOld; + +public class TowerRoofComponent extends TFStructureComponentOld { + + protected int size; + protected int height; + + public TowerRoofComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + this(TFStructurePieceTypes.TFLTRoo.get(), nbt); + } + + public TowerRoofComponent(StructurePieceType piece, CompoundTag nbt) { + super(piece, nbt); + this.size = nbt.getInt("roofSize"); + this.height = nbt.getInt("roofHeight"); + } + + public TowerRoofComponent(StructurePieceType type, int i, int x, int y, int z) { + super(type, i, x, y, z); + + this.spawnListIndex = -1; + + // inheritors need to add a bounding box or die~! + } + + @Override + protected void addAdditionalSaveData(StructurePieceSerializationContext ctx, CompoundTag tagCompound) { + super.addAdditionalSaveData(ctx, tagCompound); + tagCompound.putInt("roofSize", this.size); + tagCompound.putInt("roofHeight", this.height); + } + + /** + * Makes a bounding box that hangs forwards off of the tower wing we are on. This is for attached roofs. + * + * @param wing + */ + protected void makeAttachedOverhangBB(TowerWingComponent wing) { + // just hang out at the very top of the tower + switch (getOrientation()) { + case SOUTH -> this.boundingBox = new BoundingBox(wing.getBoundingBox().minX(), wing.getBoundingBox().maxY(), wing.getBoundingBox().minZ() - 1, wing.getBoundingBox().maxX() + 1, wing.getBoundingBox().maxY() + this.height - 1, wing.getBoundingBox().maxZ() + 1); + case WEST -> this.boundingBox = new BoundingBox(wing.getBoundingBox().minX() - 1, wing.getBoundingBox().maxY(), wing.getBoundingBox().minZ(), wing.getBoundingBox().maxX() + 1, wing.getBoundingBox().maxY() + this.height - 1, wing.getBoundingBox().maxZ() + 1); + case EAST -> this.boundingBox = new BoundingBox(wing.getBoundingBox().minX() - 1, wing.getBoundingBox().maxY(), wing.getBoundingBox().minZ() - 1, wing.getBoundingBox().maxX(), wing.getBoundingBox().maxY() + this.height - 1, wing.getBoundingBox().maxZ() + 1); + case NORTH -> this.boundingBox = new BoundingBox(wing.getBoundingBox().minX() - 1, wing.getBoundingBox().maxY(), wing.getBoundingBox().minZ() - 1, wing.getBoundingBox().maxX() + 1, wing.getBoundingBox().maxY() + this.height - 1, wing.getBoundingBox().maxZ()); + default -> { } + } + } + + /** + * Makes a bounding box that sits at the top of the tower. Works for attached or freestanding roofs. + * + * @param wing + */ + protected void makeCapBB(TowerWingComponent wing) { + this.boundingBox = new BoundingBox(wing.getBoundingBox().minX(), wing.getBoundingBox().maxY(), wing.getBoundingBox().minZ(), wing.getBoundingBox().maxX(), wing.getBoundingBox().maxY() + this.height, wing.getBoundingBox().maxZ()); + } + + /** + * Make a bounding box that hangs over the sides of the tower 1 block. Freestanding towers only. + * + * @param wing + */ + protected void makeOverhangBB(TowerWingComponent wing) { + this.boundingBox = new BoundingBox(wing.getBoundingBox().minX() - 1, wing.getBoundingBox().maxY(), wing.getBoundingBox().minZ() - 1, wing.getBoundingBox().maxX() + 1, wing.getBoundingBox().maxY() + this.height - 1, wing.getBoundingBox().maxZ() + 1); + } + + @Override + public void postProcess(WorldGenLevel worldIn, StructureManager manager, ChunkGenerator generator, RandomSource randomIn, BoundingBox structureBoundingBoxIn, ChunkPos chunkPosIn, BlockPos blockPos) { + + } + + /** + * Does this roof intersect anything except the parent tower? + */ + public boolean fits(TowerWingComponent parent, StructurePieceAccessor list) { + return list.findCollisionPiece(this.boundingBox) == parent; + } +} diff --git a/src/main/java/twilightforest/world/components/structures/lichtower/TowerRoofFenceComponent.java b/src/main/java/twilightforest/world/components/structures/lichtower/TowerRoofFenceComponent.java new file mode 100644 index 0000000000..14a8852a7d --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/lichtower/TowerRoofFenceComponent.java @@ -0,0 +1,49 @@ +package twilightforest.world.components.structures.lichtower; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFStructurePieceTypes; + + +public class TowerRoofFenceComponent extends TowerRoofComponent { + + public TowerRoofFenceComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFLTRF.get(), nbt); + } + + public TowerRoofFenceComponent(int i, TowerWingComponent wing, int x, int y, int z) { + super(TFStructurePieceTypes.TFLTRF.get(), i, x, y, z); + + // same alignment + this.setOrientation(wing.getOrientation()); + // same size + this.size = wing.size; // assuming only square towers and roofs right now. + this.height = 0; + + // just hang out at the very top of the tower + makeCapBB(wing); + } + + /** + * A fence around the roof! + */ + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + int y = height + 1; + for (int x = 0; x <= size - 1; x++) { + for (int z = 0; z <= size - 1; z++) { + if (x == 0 || x == size - 1 || z == 0 || z == size - 1) { + placeBlock(world, Blocks.OAK_FENCE.defaultBlockState(), x, y, z, sbb); + } + } + } + } +} diff --git a/src/main/java/twilightforest/world/components/structures/lichtower/TowerRoofGableForwardsComponent.java b/src/main/java/twilightforest/world/components/structures/lichtower/TowerRoofGableForwardsComponent.java new file mode 100644 index 0000000000..aa7e1d7787 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/lichtower/TowerRoofGableForwardsComponent.java @@ -0,0 +1,90 @@ +package twilightforest.world.components.structures.lichtower; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.SlabBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.SlabType; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFStructurePieceTypes; + + +public class TowerRoofGableForwardsComponent extends TowerRoofComponent { + + public TowerRoofGableForwardsComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFLTRGF.get(), nbt); + } + + public TowerRoofGableForwardsComponent(int i, TowerWingComponent wing, int x, int y, int z) { + super(TFStructurePieceTypes.TFLTRGF.get(), i, x, y, z); + + // same facing + this.setOrientation(wing.getOrientation()); + + this.size = wing.size + 2; // assuming only square towers and roofs right now. + this.height = size; + + // just hang out at the very top of the tower + this.makeAttachedOverhangBB(wing); + } + + /** + * Makes a pointy roof out of stuff + */ + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + BlockState birchSlab = Blocks.BIRCH_SLAB.defaultBlockState(); + BlockState birchPlanks = Blocks.BIRCH_PLANKS.defaultBlockState(); + + int slopeChange = slopeChangeForSize(); + for (int y = 0; y <= height; y++) { + int min, max; + if (y < slopeChange) { + min = y; + max = size - y - 1; + } else { + min = (y + slopeChange) / 2; + max = size - ((y + slopeChange) / 2) - 1; + } + for (int x = 0; x <= size - 2; x++) { + for (int z = min; z <= max; z++) { + if (z == min || z == max) { + placeBlock(world, birchPlanks, x, y, z, sbb); + } else if (x < size - 2) { + placeBlock(world, birchPlanks, x, y, z, sbb); + } + } + } + } + + // put on the little figurehead-like "cap" + + // where is even the top of our roof? + int top = (size + 1) - slopeChange; + int zMid = size / 2; + + placeBlock(world, birchSlab.setValue(SlabBlock.TYPE, SlabType.TOP), size - 1, top - 1, zMid, sbb); + placeBlock(world, birchSlab, 0, top, zMid, sbb); + placeBlock(world, birchSlab, size - 3, top, zMid, sbb); + placeBlock(world, birchPlanks, size - 2, top, zMid, sbb); + placeBlock(world, birchPlanks, size - 1, top, zMid, sbb); + placeBlock(world, birchPlanks, size - 1, top + 1, zMid, sbb); + } + + public int slopeChangeForSize() { + if (size > 10) { + return 3; + } else if (size > 6) { + return 2; + } else { + return 1; + } + } +} diff --git a/src/main/java/twilightforest/world/components/structures/lichtower/TowerRoofPointyComponent.java b/src/main/java/twilightforest/world/components/structures/lichtower/TowerRoofPointyComponent.java new file mode 100644 index 0000000000..d22c52739a --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/lichtower/TowerRoofPointyComponent.java @@ -0,0 +1,85 @@ +package twilightforest.world.components.structures.lichtower; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; +import twilightforest.init.TFStructurePieceTypes; + + +public class TowerRoofPointyComponent extends TowerRoofComponent { + + public TowerRoofPointyComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFLTRP.get(), nbt); + } + + public TowerRoofPointyComponent(StructurePieceType piece, CompoundTag nbt) { + super(piece, nbt); + } + + public TowerRoofPointyComponent(StructurePieceType piece, int i, TowerWingComponent wing, int x, int y, int z) { + super(piece, i, x, y, z); + + // same facing, but it doesn't matter + this.setOrientation(wing.getOrientation()); + + this.size = wing.size; // assuming only square towers and roofs right now. + this.height = size; + + // just hang out at the very top of the tower + makeCapBB(wing); + } + + /** + * Makes a pointy roof out of stuff + */ + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + BlockState birchSlab = Blocks.BIRCH_SLAB.defaultBlockState(); + BlockState birchPlanks = Blocks.BIRCH_PLANKS.defaultBlockState(); + + for (int y = 0; y <= height; y++) { + int min, mid, max; + int slopeChange = slopeChangeForSize(); + if (y < slopeChange) { + min = y; + max = size - y - 1; + } else { + min = (y + slopeChange) / 2; + max = size - ((y + slopeChange) / 2) - 1; + } + mid = min + ((max - min) / 2); + for (int x = min; x <= max; x++) { + for (int z = min; z <= max; z++) { + placeBlock(world, birchPlanks, x, y, z, sbb); + // some of these are unnecessary and will just be overwritten by a normal block, but whatevs. + if ((x == min && (z == min || z == max)) || (x == max && (z == min || z == max))) { + placeBlock(world, birchSlab, x, y + 1, z, sbb); + } + // mid blocks + if (((((x == min || x == max) && z == mid) && x % 2 == 0) || (((z == min || z == max) && x == mid) && z % 2 == 0)) && mid != min + 1) { + placeBlock(world, birchSlab, x, y + 1, z, sbb); + } + } + } + } + } + + public int slopeChangeForSize() { + if (size > 10) { + return 3; + } else if (size > 6) { + return 2; + } else { + return 1; + } + } +} diff --git a/src/main/java/twilightforest/world/components/structures/lichtower/TowerRoofPointyOverhangComponent.java b/src/main/java/twilightforest/world/components/structures/lichtower/TowerRoofPointyOverhangComponent.java new file mode 100644 index 0000000000..1a2fbf17a1 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/lichtower/TowerRoofPointyOverhangComponent.java @@ -0,0 +1,25 @@ +package twilightforest.world.components.structures.lichtower; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFStructurePieceTypes; + +public class TowerRoofPointyOverhangComponent extends TowerRoofPointyComponent { + + public TowerRoofPointyOverhangComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFLTRPO.get(), nbt); + } + + public TowerRoofPointyOverhangComponent(int i, TowerWingComponent wing, int x, int y, int z) { + super(TFStructurePieceTypes.TFLTRPO.get(), i, wing, x, y, z); + + // same facing, but it doesn't matter + this.setOrientation(wing.getOrientation()); + + this.size = wing.size + 2; // assuming only square towers and roofs right now. + this.height = size; + + // just hang out at the very top of the tower + makeOverhangBB(wing); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/lichtower/TowerRoofSlabComponent.java b/src/main/java/twilightforest/world/components/structures/lichtower/TowerRoofSlabComponent.java new file mode 100644 index 0000000000..9896a2055e --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/lichtower/TowerRoofSlabComponent.java @@ -0,0 +1,81 @@ +package twilightforest.world.components.structures.lichtower; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; +import twilightforest.init.TFStructurePieceTypes; + + +public class TowerRoofSlabComponent extends TowerRoofComponent { + + public TowerRoofSlabComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFLTRS.get(), nbt); + } + + public TowerRoofSlabComponent(StructurePieceType piece, CompoundTag nbt) { + super(piece, nbt); + } + + public TowerRoofSlabComponent(StructurePieceType piece, int i, TowerWingComponent wing, int x, int y, int z) { + super(piece, i, x, y, z); + + // same alignment + this.setOrientation(wing.getOrientation()); + // same size + this.size = wing.size; // assuming only square towers and roofs right now. + this.height = size / 2; + + // just hang out at the very top of the tower + makeCapBB(wing); + } + + /** + * Makes a flat, pyramid-shaped roof + */ + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + makePyramidCap(world, Blocks.BIRCH_SLAB.defaultBlockState(), Blocks.BIRCH_PLANKS.defaultBlockState(), sbb); + } + + protected void makePyramidCap(WorldGenLevel world, BlockState slabType, BlockState woodType, BoundingBox sbb) { + for (int y = 0; y <= height; y++) { + int min = 2 * y; + int max = size - (2 * y) - 1; + for (int x = min; x <= max; x++) { + for (int z = min; z <= max; z++) { + if (x == min || x == max || z == min || z == max) { + + placeBlock(world, slabType, x, y, z, sbb); + } else { + placeBlock(world, woodType, x, y, z, sbb); + } + } + } + } + } + + protected void makeConnectedCap(WorldGenLevel world, BlockState slabType, BlockState woodType, BoundingBox sbb) { + for (int y = 0; y < height; y++) { + int min = 2 * y; + int max = size - (2 * y) - 1; + for (int x = 0; x <= max; x++) { + for (int z = min; z <= max; z++) { + if (x == max || z == min || z == max) { + placeBlock(world, slabType, x, y, z, sbb); + } else { + placeBlock(world, woodType, x, y, z, sbb); + } + } + } + } + } +} diff --git a/src/main/java/twilightforest/world/components/structures/lichtower/TowerRoofSlabForwardsComponent.java b/src/main/java/twilightforest/world/components/structures/lichtower/TowerRoofSlabForwardsComponent.java new file mode 100644 index 0000000000..d8f2581bad --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/lichtower/TowerRoofSlabForwardsComponent.java @@ -0,0 +1,65 @@ +package twilightforest.world.components.structures.lichtower; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.SlabBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.SlabType; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFStructurePieceTypes; + + +/** + * A flat tower roof using slabs that is larger than the tower under it. + * + * @author Ben + */ +public class TowerRoofSlabForwardsComponent extends TowerRoofSlabComponent { + + public TowerRoofSlabForwardsComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFLTRSF.get(), nbt); + } + + public TowerRoofSlabForwardsComponent(int i, TowerWingComponent wing, int x, int y, int z) { + super(TFStructurePieceTypes.TFLTRSF.get(), i, wing, x, y, z); + + // same alignment + this.setOrientation(wing.getOrientation()); + // the overhang roof is like a cap roof that's 2 sizes bigger + this.size = wing.size + 2; // assuming only square towers and roofs right now. + this.height = size / 2; + + // bounding box + makeAttachedOverhangBB(wing); + } + + /** + * Makes flat hip roof + */ + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + BlockState birchSlab = Blocks.BIRCH_SLAB.defaultBlockState(); + BlockState birchDoubleSlab = Blocks.BIRCH_SLAB.defaultBlockState().setValue(SlabBlock.TYPE, SlabType.DOUBLE); + + for (int y = 0; y <= height; y++) { + int min = 2 * y; + int max = size - (2 * y) - 1; + for (int x = 0; x <= max - 1; x++) { + for (int z = min; z <= max; z++) { + if (x == max - 1 || z == min || z == max) { + placeBlock(world, birchSlab, x, y, z, sbb); + } else { + placeBlock(world, birchDoubleSlab, x, y, z, sbb); + } + } + } + } + } +} diff --git a/src/main/java/twilightforest/world/components/structures/lichtower/TowerRoofStairsComponent.java b/src/main/java/twilightforest/world/components/structures/lichtower/TowerRoofStairsComponent.java new file mode 100644 index 0000000000..f2e955b5b8 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/lichtower/TowerRoofStairsComponent.java @@ -0,0 +1,79 @@ +package twilightforest.world.components.structures.lichtower; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.StairBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFStructurePieceTypes; + + +public class TowerRoofStairsComponent extends TowerRoofComponent { + + public TowerRoofStairsComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFLTRSt.get(), nbt); + } + + public TowerRoofStairsComponent(int i, TowerWingComponent wing, int x, int y, int z) { + super(TFStructurePieceTypes.TFLTRSt.get(), i, x, y, z); + + // always facing = 0. This roof cannot rotate, due to stair facing issues. + this.setOrientation(Direction.SOUTH); + + this.size = wing.size; // assuming only square towers and roofs right now. + this.height = size / 2; + + // just hang out at the very top of the tower + makeCapBB(wing); + } + + /** + * Makes a pyramid-shaped roof out of stairs + */ + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + BlockState birchSlab = Blocks.BIRCH_SLAB.defaultBlockState(); + BlockState birchPlanks = Blocks.BIRCH_PLANKS.defaultBlockState(); + + BlockState birchStairsNorth = Blocks.BIRCH_STAIRS.defaultBlockState().setValue(StairBlock.FACING, Direction.NORTH); + BlockState birchStairsSouth = Blocks.BIRCH_STAIRS.defaultBlockState().setValue(StairBlock.FACING, Direction.SOUTH); + BlockState birchStairsEast = Blocks.BIRCH_STAIRS.defaultBlockState().setValue(StairBlock.FACING, Direction.EAST); + BlockState birchStairsWest = Blocks.BIRCH_STAIRS.defaultBlockState().setValue(StairBlock.FACING, Direction.WEST); + + for (int y = 0; y <= height; y++) { + int min = y; + int max = size - y - 1; + for (int x = min; x <= max; x++) { + for (int z = min; z <= max; z++) { + if (x == min) { + if (z == min || z == max) { + placeBlock(world, birchSlab, x, y, z, sbb); + } else { + placeBlock(world, birchStairsWest, x, y, z, sbb); + } + } else if (x == max) { + if (z == min || z == max) { + placeBlock(world, birchSlab, x, y, z, sbb); + } else { + placeBlock(world, birchStairsEast, x, y, z, sbb); + } + } else if (z == max) { + placeBlock(world, birchStairsSouth, x, y, z, sbb); + } else if (z == min) { + placeBlock(world, birchStairsNorth, x, y, z, sbb); + } else { + placeBlock(world, birchPlanks, x, y, z, sbb); + } + } + } + } + } +} diff --git a/src/main/java/twilightforest/world/components/structures/lichtower/TowerRoofStairsOverhangComponent.java b/src/main/java/twilightforest/world/components/structures/lichtower/TowerRoofStairsOverhangComponent.java new file mode 100644 index 0000000000..5f7c34d26e --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/lichtower/TowerRoofStairsOverhangComponent.java @@ -0,0 +1,79 @@ +package twilightforest.world.components.structures.lichtower; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.StairBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFStructurePieceTypes; + + +public class TowerRoofStairsOverhangComponent extends TowerRoofComponent { + + public TowerRoofStairsOverhangComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFLTRStO.get(), nbt); + } + + public TowerRoofStairsOverhangComponent(int i, TowerWingComponent wing, int x, int y, int z) { + super(TFStructurePieceTypes.TFLTRStO.get(), i, x, y, z); + + // always facing = 0. This roof cannot rotate, due to stair facing issues. + this.setOrientation(Direction.SOUTH); + + this.size = wing.size + 2; // assuming only square towers and roofs right now. + this.height = size / 2; + + // just hang out at the very top of the tower + this.boundingBox = new BoundingBox(wing.getBoundingBox().minX() - 1, wing.getBoundingBox().maxY(), wing.getBoundingBox().minZ() - 1, wing.getBoundingBox().maxX() + 1, wing.getBoundingBox().maxY() + this.height - 1, wing.getBoundingBox().maxZ() + 1); + } + + /** + * Makes a pyramid-shaped roof out of stairs + */ + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + BlockState woodenSlab = Blocks.BIRCH_SLAB.defaultBlockState(); + BlockState woodenPlanks = Blocks.BIRCH_PLANKS.defaultBlockState(); + + BlockState birchStairsNorth = Blocks.BIRCH_STAIRS.defaultBlockState().setValue(StairBlock.FACING, Direction.NORTH); + BlockState birchStairsSouth = Blocks.BIRCH_STAIRS.defaultBlockState().setValue(StairBlock.FACING, Direction.SOUTH); + BlockState birchStairsEast = Blocks.BIRCH_STAIRS.defaultBlockState().setValue(StairBlock.FACING, Direction.EAST); + BlockState birchStairsWest = Blocks.BIRCH_STAIRS.defaultBlockState().setValue(StairBlock.FACING, Direction.WEST); + + for (int y = 0; y <= height; y++) { + int min = y; + int max = size - y - 1; + for (int x = min; x <= max; x++) { + for (int z = min; z <= max; z++) { + if (x == min) { + if (z == min || z == max) { + placeBlock(world, woodenSlab, x, y, z, sbb); + } else { + placeBlock(world, birchStairsWest, x, y, z, sbb); + } + } else if (x == max) { + if (z == min || z == max) { + placeBlock(world, woodenSlab, x, y, z, sbb); + } else { + placeBlock(world, birchStairsEast, x, y, z, sbb); + } + } else if (z == max) { + placeBlock(world, birchStairsSouth, x, y, z, sbb); + } else if (z == min) { + placeBlock(world, birchStairsNorth, x, y, z, sbb); + } else { + placeBlock(world, woodenPlanks, x, y, z, sbb); + } + } + } + } + } +} diff --git a/src/main/java/twilightforest/world/components/structures/lichtower/TowerWingComponent.java b/src/main/java/twilightforest/world/components/structures/lichtower/TowerWingComponent.java new file mode 100644 index 0000000000..0e09f40e74 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/lichtower/TowerWingComponent.java @@ -0,0 +1,1892 @@ +package twilightforest.world.components.structures.lichtower; + +import com.google.common.collect.Lists; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.registries.Registries; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.Mth; +import net.minecraft.util.RandomSource; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.decoration.HangingEntity; +import net.minecraft.world.entity.decoration.Painting; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.*; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.Half; +import net.minecraft.world.level.chunk.ChunkAccess; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.chunk.ChunkStatus; +import net.minecraft.world.level.chunk.ProtoChunk; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; +import net.minecraft.world.phys.AABB; +import org.jetbrains.annotations.Nullable; +import twilightforest.TwilightForestMod; +import twilightforest.data.tags.BlockTagGenerator; +import twilightforest.init.TFEntities; +import twilightforest.init.TFLandmark; +import twilightforest.init.TFStructurePieceTypes; +import twilightforest.loot.TFLootTables; +import twilightforest.util.EntityUtil; +import twilightforest.util.RotationUtil; +import twilightforest.util.TFStructureHelper; +import twilightforest.world.components.structures.TFStructureComponentOld; + +import java.nio.IntBuffer; +import java.util.ArrayList; +import java.util.List; + +@SuppressWarnings({"deprecation", "unused"}) +public class TowerWingComponent extends TFStructureComponentOld { + + public TowerWingComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + this(TFStructurePieceTypes.TFLTWin.get(), nbt); + } + + public TowerWingComponent(StructurePieceType piece, CompoundTag nbt) { + super(piece, nbt); + + this.size = nbt.getInt("towerSize"); + this.height = nbt.getInt("towerHeight"); + + this.readOpeningsFromArray(nbt.getIntArray("doorInts")); + + this.highestOpening = nbt.getInt("highestOpening"); + // too lazy to do this as a loop + this.openingTowards[0] = nbt.getBoolean("openingTowards0"); + this.openingTowards[1] = nbt.getBoolean("openingTowards1"); + this.openingTowards[2] = nbt.getBoolean("openingTowards2"); + this.openingTowards[3] = nbt.getBoolean("openingTowards3"); + } + + public int size; + protected int height; + protected Class roofType; + + protected ArrayList openings = new ArrayList(); + protected int highestOpening; + protected boolean[] openingTowards = new boolean[]{false, false, true, false}; + + protected TowerWingComponent(StructurePieceType type, int i, int x, int y, int z) { + super(type, i, x, y, z); + this.highestOpening = 0; + } + + protected TowerWingComponent(StructurePieceType type, int i, int x, int y, int z, int pSize, int pHeight, Direction direction) { + super(type, i, x, y, z); + + this.size = pSize; + this.height = pHeight; + this.setOrientation(direction); + + this.highestOpening = 0; + + this.boundingBox = TFLandmark.getComponentToAddBoundingBox(x, y, z, 0, 0, 0, size - 1, height - 1, size - 1, direction, false); + } + + /** + * Turn the openings array into an array of ints. + */ + private int[] getDoorsAsIntArray() { + IntBuffer ibuffer = IntBuffer.allocate(this.openings.size() * 3); + + for (BlockPos door : openings) { + ibuffer.put(door.getX()); + ibuffer.put(door.getY()); + ibuffer.put(door.getZ()); + } + + return ibuffer.array(); + } + + @Override + protected void addAdditionalSaveData(StructurePieceSerializationContext ctx, CompoundTag tagCompound) { + super.addAdditionalSaveData(ctx, tagCompound); + + tagCompound.putInt("towerSize", this.size); + tagCompound.putInt("towerHeight", this.height); + + tagCompound.putIntArray("doorInts", this.getDoorsAsIntArray()); + + tagCompound.putInt("highestOpening", this.highestOpening); + tagCompound.putBoolean("openingTowards0", this.openingTowards[0]); + tagCompound.putBoolean("openingTowards1", this.openingTowards[1]); + tagCompound.putBoolean("openingTowards2", this.openingTowards[2]); + tagCompound.putBoolean("openingTowards3", this.openingTowards[3]); + } + + /** + * Read in openings from int array + */ + private void readOpeningsFromArray(int[] intArray) { + for (int i = 0; i < intArray.length; i += 3) { + BlockPos door = new BlockPos(intArray[i], intArray[i + 1], intArray[i + 2]); + + this.openings.add(door); + } + } + + @Override + public void addChildren(StructurePiece parent, StructurePieceAccessor list, RandomSource rand) { + // we should have a door where we started + addOpening(0, 1, size / 2, Rotation.CLOCKWISE_180); + + // add a roof? + makeARoof(parent, list, rand); + + // add a beard + makeABeard(parent, list, rand); + + + if (size > 4) { + // sub towers + for (final Rotation towerRotation : RotationUtil.ROTATIONS) { + if (towerRotation == Rotation.CLOCKWISE_180) continue; + int[] dest = getValidOpening(rand, towerRotation); + if (!makeTowerWing(list, rand, 1, dest[0], dest[1], dest[2], size - 2, height - 4, towerRotation) && this.size > 8) { + if (!makeTowerWing(list, rand, 1, dest[0], dest[1], dest[2], size - 4, height - 6, towerRotation)) { + makeTowerWing(list, rand, 1, dest[0], dest[1], dest[2], size - 6, height - 12, towerRotation); + } + } + } + } + } + + public boolean makeTowerWing(StructurePieceAccessor list, RandomSource rand, int index, int x, int y, int z, int wingSize, int wingHeight, Rotation rotation) { + // kill too-small towers + if (wingHeight < 6) { + return false; + } + + Direction direction = getStructureRelativeRotation(rotation); + int[] dx = offsetTowerCoords(x, y, z, wingSize, direction); + + if (rand.nextInt(6) == 0) { + return makeBridge(list, rand, index, x, y, z, wingSize, wingHeight, rotation); + // or I don't know if we just want to continue instead if the bridge fails. + // I think there are very few circumstances where we can make a wing and not a bridge + } + + TowerWingComponent wing = new TowerWingComponent(TFStructurePieceTypes.TFLTWin.get(), index, dx[0], dx[1], dx[2], wingSize, wingHeight, direction); + // check to see if it intersects something already there + StructurePiece intersect = list.findCollisionPiece(wing.boundingBox); + if (intersect == null || intersect == this) { + list.addPiece(wing); + wing.addChildren(this, list, rand); + addOpening(x, y, z, rotation); + return true; + } else { + if (rand.nextInt(3) > 0) { + return makeBridge(list, rand, index, x, y, z, wingSize, wingHeight, rotation); + } else { + // I guess we're done for this branch + return false; + } + } + } + + + protected boolean makeBridge(StructurePieceAccessor list, RandomSource rand, int index, int x, int y, int z, int wingSize, int wingHeight, Rotation rotation) { + // bridges are size 3 always + Direction direction = getStructureRelativeRotation(rotation); + int[] dx = offsetTowerCoords(x, y, z, 3, direction); + // adjust height for those stupid little things + if (wingSize == 3 && wingHeight > 10) { + wingHeight = 6 + rand.nextInt(5); + } + TowerBridgeComponent bridge = new TowerBridgeComponent(index, dx[0], dx[1], dx[2], wingSize, wingHeight, direction); + // check to see if it intersects something already there + StructurePiece intersect = list.findCollisionPiece(bridge.boundingBox); + if (intersect == null || intersect == this) { + intersect = list.findCollisionPiece(bridge.getWingBB()); + } else { + return false; + } + // okay, I think we can actually make one, as long as we're not still intersecting something. + if (intersect == null || intersect == this) { + list.addPiece(bridge); + bridge.addChildren(this, list, rand); + addOpening(x, y, z, rotation); + return true; + } else { + return false; + } + } + + /** + * Add an opening to the outside (or another tower) in the specified direction. + */ + public void addOpening(int dx, int dy, int dz, Rotation direction) { + openingTowards[direction.ordinal()] = true; + if (dy > highestOpening) { + highestOpening = dy; + } + openings.add(new BlockPos(dx, dy, dz)); + } + + /** + * Add an opening to the outside (or another tower) in the specified facing. + */ + public void addOpening(int dx, int dy, int dz, Direction facing) { + this.addOpening(dx, dy, dz, RotationUtil.getRelativeRotation(this.getOrientation(), facing)); + } + + /** + * Add a beard to this structure. There is only one type of beard. + */ + public void makeABeard(StructurePiece parent, StructurePieceAccessor list, RandomSource rand) { + + boolean attached = parent.getBoundingBox().minY() < this.boundingBox.minY(); + + int index = this.getGenDepth(); + TowerBeardComponent beard; + if (attached) { + beard = new TowerBeardAttachedComponent(index + 1, this, getLocatorPosition().getX(), getLocatorPosition().getY(), getLocatorPosition().getZ()); + } else { + beard = new TowerBeardComponent(TFStructurePieceTypes.TFLTBea.get(), index + 1, this, getLocatorPosition().getX(), getLocatorPosition().getY(), getLocatorPosition().getZ()); + } + list.addPiece(beard); + beard.addChildren(this, list, rand); + } + + + /** + * Attach a roof to this tower. + *

+ * This function keeps trying roofs starting with the largest and fanciest, and then keeps trying smaller and plainer ones + */ + public void makeARoof(StructurePiece parent, StructurePieceAccessor list, RandomSource rand) { + + // we are attached if our parent is taller than we are + boolean attached = parent.getBoundingBox().maxY() > this.boundingBox.maxY(); + + if (attached) { + makeAttachedRoof(list, rand); + } else { + makeFreestandingRoof(list, rand); + } + + } + + + protected void makeAttachedRoof(StructurePieceAccessor list, RandomSource rand) { + int index = this.getGenDepth(); + TowerRoofComponent roof; + + // this is our preferred roof type: + if (roofType == null && rand.nextInt(32) != 0) { + tryToFitRoof(list, rand, new TowerRoofGableForwardsComponent(index + 1, this, getLocatorPosition().getX(), getLocatorPosition().getY(), getLocatorPosition().getZ())); + } + + // this is for roofs that don't fit. + if (roofType == null && rand.nextInt(8) != 0) { + tryToFitRoof(list, rand, new TowerRoofSlabForwardsComponent(index + 1, this, getLocatorPosition().getX(), getLocatorPosition().getY(), getLocatorPosition().getZ())); + } + + // finally, if we're cramped for space, try this + if (roofType == null && rand.nextInt(32) != 0) { + // fall through to this next roof + roof = new TowerRoofAttachedSlabComponent(index + 1, this, getLocatorPosition().getX(), getLocatorPosition().getY(), getLocatorPosition().getZ()); + tryToFitRoof(list, rand, roof); + } + + // last resort + if (roofType == null) { + // fall through to this next roof + roof = new TowerRoofFenceComponent(index + 1, this, getLocatorPosition().getX(), getLocatorPosition().getY(), getLocatorPosition().getZ()); + tryToFitRoof(list, rand, roof); + } + } + + + /** + * Check to see if this roof fits. If it does: + * Add the specified roof to this tower and set the roofType variable. + */ + protected void tryToFitRoof(StructurePieceAccessor list, RandomSource rand, TowerRoofComponent roof) { + if (roof.fits(this, list)) { + list.addPiece(roof); + roof.addChildren(this, list, rand); + roofType = roof.getClass(); + } + } + + protected void makeFreestandingRoof(StructurePieceAccessor list, RandomSource rand) { + int index = this.getGenDepth(); + TowerRoofComponent roof; + + // most roofs that fit fancy roofs will be this + if (roofType == null && rand.nextInt(8) != 0) { + roof = new TowerRoofPointyOverhangComponent(index + 1, this, getLocatorPosition().getX(), getLocatorPosition().getY(), getLocatorPosition().getZ()); + tryToFitRoof(list, rand, roof); + } + + // don't pass by this one if it fits + if (roofType == null) { + roof = new TowerRoofStairsOverhangComponent(index + 1, this, getLocatorPosition().getX(), getLocatorPosition().getY(), getLocatorPosition().getZ()); + tryToFitRoof(list, rand, roof); + } + + // don't pass by this one if it fits + if (roofType == null) { + roof = new TowerRoofStairsComponent(index + 1, this, getLocatorPosition().getX(), getLocatorPosition().getY(), getLocatorPosition().getZ()); + tryToFitRoof(list, rand, roof); + } + + if (roofType == null && rand.nextInt(53) != 0) { + // fall through to this next roof + roof = new TowerRoofSlabComponent(TFStructurePieceTypes.TFLTRS.get(), index + 1, this, getLocatorPosition().getX(), getLocatorPosition().getY(), getLocatorPosition().getZ()); + tryToFitRoof(list, rand, roof); + } + + if (roofType == null) { + // fall through to this next roof + roof = new TowerRoofFenceComponent(index + 1, this, getLocatorPosition().getX(), getLocatorPosition().getY(), getLocatorPosition().getZ()); + tryToFitRoof(list, rand, roof); + } + } + + @Override + public void postProcess(WorldGenLevel worldIn, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + // make walls + generateBox(worldIn, sbb, 0, 0, 0, size - 1, height - 1, size - 1, false, rand, TFStructureComponentOld.getStrongholdStones()); + + // clear inside + generateAirBox(worldIn, sbb, 1, 1, 1, size - 2, height - 2, size - 2); + + // sky light +// nullifySkyLightForBoundingBox(world); + + // marker blocks +// setBlockState(world, Blocks.WOOL, this.coordBaseMode, size / 2, 2, size / 2, sbb); +// setBlockState(world, Blocks.GOLD_BLOCK, 0, 0, 0, 0, sbb); + + // stairs! + if (highestOpening > 1) { + makeStairs(worldIn, rand, sbb); + } + + // decorate? + decorateThisTower(worldIn, generator, sbb); + + // windows + makeWindows(worldIn, sbb, size < 4); + + // throw a bunch of opening markers in there +// makeOpeningMarkers(world, rand, 100, sbb); + + // openings + makeOpenings(worldIn, sbb); + } + + /** + * Puts some colorful markers by possible openings in this tower. Debug only. + * + * @param numMarkers How many markers to make + */ + protected void makeOpeningMarkers(WorldGenLevel world, RandomSource rand, int numMarkers, BoundingBox sbb) { + if (size > 4) { + final BlockState woolWhite = Blocks.WHITE_WOOL.defaultBlockState(); + final BlockState woolOrange = Blocks.ORANGE_WOOL.defaultBlockState(); + final BlockState woolMagenta = Blocks.MAGENTA_WOOL.defaultBlockState(); + final BlockState woolLightBlue = Blocks.LIGHT_BLUE_WOOL.defaultBlockState(); + + for (int i = 0; i < numMarkers; i++) { + int[] spot = getValidOpening(rand, Rotation.NONE); + placeBlock(world, woolWhite, spot[0], spot[1], spot[2], sbb); + } + for (int i = 0; i < numMarkers; i++) { + int[] spot = getValidOpening(rand, Rotation.CLOCKWISE_90); + placeBlock(world, woolOrange, spot[0], spot[1], spot[2], sbb); + } + for (int i = 0; i < numMarkers; i++) { + int[] spot = getValidOpening(rand, Rotation.CLOCKWISE_180); + placeBlock(world, woolMagenta, spot[0], spot[1], spot[2], sbb); + } + for (int i = 0; i < numMarkers; i++) { + int[] spot = getValidOpening(rand, Rotation.COUNTERCLOCKWISE_90); + placeBlock(world, woolLightBlue, spot[0], spot[1], spot[2], sbb); + } + } + } + + + /** + * Add some appropriate decorations to this tower + */ + protected void decorateThisTower(WorldGenLevel world, ChunkGenerator generator, BoundingBox sbb) { + RandomSource decoRNG = RandomSource.create(world.getSeed() + (this.boundingBox.minX() * 321534781L) * (this.boundingBox.minZ() * 756839L)); + + if (size > 3) { + // only decorate towers with more than one available square inside. + if (isDeadEnd()) { + decorateDeadEnd(world, decoRNG, sbb); + } else { + // for now we'll just assume that any tower with more than one exit is a stair tower + decorateStairTower(world, generator, decoRNG, sbb); + } + } + } + + /** + * Decorates a dead end tower. These towers have no stairs, and will be the focus of our interior design. + */ + protected void decorateDeadEnd(WorldGenLevel world, RandomSource rand, BoundingBox sbb) { + final BlockState birchPlanks = Blocks.BIRCH_PLANKS.defaultBlockState(); + int floors = (this.height - 1) / 5; + + // divide the tower into floors + int floorHeight = this.height / floors; + for (int i = 1; i < floors; i++) { + // put down a floor + for (int x = 1; x < size - 1; x++) { + for (int z = 1; z < size - 1; z++) { + placeBlock(world, birchPlanks, x, (i * floorHeight), z, sbb); + } + } + } + + if (floors > 1) { + Rotation ladderDir = Rotation.COUNTERCLOCKWISE_90; + Rotation downLadderDir; + + // decorate bottom floor + decorateFloor(world, rand, 0, 1, floorHeight, ladderDir, null, sbb); + + // decorate middle floors + for (int i = 1; i < floors - 1; i++) { + int bottom = 1 + floorHeight * i; + int top = floorHeight * (i + 1); + + downLadderDir = ladderDir; + ladderDir = ladderDir.getRotated(Rotation.CLOCKWISE_90); + + decorateFloor(world, rand, i, bottom, top, ladderDir, downLadderDir, sbb); + } + + // decorate top floor + decorateFloor(world, rand, floors, 1 + floorHeight * (floors - 1), height - 1, null, ladderDir, sbb); + } else { + // just one floor, decorate that, no ladders + decorateFloor(world, rand, 0, 1, height - 1, null, null, sbb); + } + } + + /** + * Called to decorate each floor. This is responsible for adding a ladder up, the stub of the ladder going down, then picking a theme for each floor and executing it. + */ + protected void decorateFloor(WorldGenLevel world, RandomSource rand, int floor, int bottom, int top, @Nullable Rotation ladderUpDir, @Nullable Rotation ladderDownDir, BoundingBox sbb) { + + final BlockState ladder = Blocks.LADDER.defaultBlockState(); + if (ladderUpDir != null) { + // add ladder going up + final BlockState ladderUp = ladder.setValue(LadderBlock.FACING, ladderUpDir.rotate(Direction.EAST)); + + int dx = getLadderX(ladderUpDir); + int dz = getLadderZ(ladderUpDir); + for (int dy = bottom; dy < top; dy++) { + placeBlock(world, ladderUp, dx, dy, dz, sbb); + } + } + + if (ladderDownDir != null) { + // add ladder going down + final BlockState ladderDown = ladder.setValue(LadderBlock.FACING, ladderDownDir.rotate(Direction.EAST)); + int dx = getLadderX(ladderDownDir); + int dz = getLadderZ(ladderDownDir); + for (int dy = bottom - 1; dy < bottom + 2; dy++) { + placeBlock(world, ladderDown, dx, dy, dz, sbb); + } + } + + // some of these go only on the bottom floor (ladderDownDir == null) and some go only on upper floors + if (rand.nextInt(7) == 0 && ladderDownDir == null) { + decorateWell(world, rand, bottom, sbb); + } else if (rand.nextInt(7) == 0 && ladderDownDir == null) { + decorateSkeletonRoom(world, rand, bottom, top, ladderUpDir, ladderDownDir, sbb); + } else if (rand.nextInt(6) == 0 && ladderDownDir == null) { + decorateZombieRoom(world, rand, bottom, ladderUpDir, ladderDownDir, sbb); + } else if (rand.nextInt(5) == 0 && ladderDownDir == null) { + decorateCactusRoom(world, rand, bottom, top, ladderUpDir, ladderDownDir, sbb); + } else if (rand.nextInt(4) == 0 && ladderDownDir != null) { + decorateTreasureChest(world, bottom, top, sbb); + } else if (rand.nextInt(5) == 0) { + decorateSpiderWebs(world, rand, bottom, top, ladderUpDir, ladderDownDir, sbb); + } else if (rand.nextInt(12) == 0 && ladderDownDir != null) { + // these are annoying + decorateSolidRock(world, rand, bottom, top, ladderUpDir, ladderDownDir, sbb); + } else if (rand.nextInt(3) == 0) { + decorateFullLibrary(world, rand, bottom, top, ladderUpDir, ladderDownDir, sbb); + } else { + decorateLibrary(world, rand, bottom, top, ladderUpDir, ladderDownDir, sbb); + } + } + + /** + * Decorate this floor with a scenic well. + */ + protected void decorateWell(WorldGenLevel world, RandomSource rand, int bottom, BoundingBox sbb) { + int cx = size / 2; + + BlockState waterOrLava = rand.nextInt(4) == 0 ? Blocks.LAVA.defaultBlockState() : Blocks.WATER.defaultBlockState(); + + if (size > 5) { + // actual well structure + final BlockState stoneBricks = Blocks.STONE_BRICKS.defaultBlockState(); + final BlockState stoneSlabs = TFStructureHelper.stoneSlab; + + placeBlock(world, stoneBricks, cx - 1, bottom, cx - 1, sbb); + placeBlock(world, stoneSlabs, cx - 1, bottom + 1, cx - 1, sbb); + placeBlock(world, stoneBricks, cx, bottom, cx - 1, sbb); + placeBlock(world, stoneBricks, cx + 1, bottom, cx - 1, sbb); + placeBlock(world, stoneSlabs, cx + 1, bottom + 1, cx - 1, sbb); + placeBlock(world, stoneBricks, cx - 1, bottom, cx, sbb); + placeBlock(world, waterOrLava, cx, bottom, cx, sbb); + placeBlock(world, stoneBricks, cx + 1, bottom, cx, sbb); + placeBlock(world, stoneBricks, cx - 1, bottom, cx + 1, sbb); + placeBlock(world, stoneSlabs, cx - 1, bottom + 1, cx + 1, sbb); + placeBlock(world, stoneBricks, cx, bottom, cx + 1, sbb); + placeBlock(world, stoneBricks, cx + 1, bottom, cx + 1, sbb); + placeBlock(world, stoneSlabs, cx + 1, bottom + 1, cx + 1, sbb); + } + + placeBlock(world, waterOrLava, cx, bottom - 1, cx, sbb); + } + + /** + * Add a skeleton spawner on this floor and decorate it in an appropriately scary manner. + */ + protected void decorateSkeletonRoom(WorldGenLevel world, RandomSource rand, int bottom, int top, Rotation ladderUpDir, Rotation ladderDownDir, BoundingBox sbb) { + // skeleton spawner + setSpawner(world, size / 2, bottom + 2, size / 2, sbb, EntityType.SKELETON); + + // floor-to-ceiling chains + ArrayList chainList = new ArrayList<>(); + chainList.add(new BlockPos(size / 2, bottom + 2, size / 2)); // don't block the spawner + for (int i = 0; i < size + 2; i++) { + BlockPos chain = new BlockPos(2 + rand.nextInt(size - (4)), height - 2, 2 + rand.nextInt(size - (4))); + if (!chainCollides(chain, chainList)) { + // if it doesn't collide, manufacture it and add it to the list + for (int dy = bottom; dy < top; dy++) { + placeBlock(world, Blocks.IRON_BARS.defaultBlockState(), chain.getX(), dy, chain.getZ(), sbb); + } + chainList.add(chain); + } + } + + // spider webs in the corner + for (int dx = 1; dx <= size - 2; dx++) { + for (int dz = 1; dz <= size - 2; dz++) { + if (dx == 1 || dx == size - 2 || dz == 1 || dz == size - 2) { + // side of the room + if (!isWindowPos(dx, dz) && !isLadderPos(dx, dz, ladderUpDir, ladderDownDir)) { + // not an occupied position + placeBlock(world, Blocks.COBWEB.defaultBlockState(), dx, top - 1, dz, sbb); + } + } + } + } + + } + + + /** + * Add a zombie spawner on this floor and decorate it in an appropriately scary manner. + */ + protected void decorateZombieRoom(WorldGenLevel world, RandomSource rand, int bottom, Rotation ladderUpDir, Rotation ladderDownDir, BoundingBox sbb) { + // zombie spawner + setSpawner(world, size / 2, bottom + 2, size / 2, sbb, EntityType.ZOMBIE); + final BlockState ironBars = Blocks.IRON_BARS.defaultBlockState(); + final BlockState soulSand = Blocks.SOUL_SAND.defaultBlockState(); + final BlockState brownMushroom = Blocks.BROWN_MUSHROOM.defaultBlockState(); + + // random brown mushrooms + for (int dx = 1; dx <= size - 2; dx++) { + for (int dz = 1; dz <= size - 2; dz++) { + if (!isWindowPos(dx, dz) && !isLadderPos(dx, dz, ladderUpDir, ladderDownDir)) { + // not an occupied position + if (rand.nextInt(5) == 0) { + placeBlock(world, brownMushroom, dx, bottom, dz, sbb); + } + } + } + } + + // slab tables + ArrayList slabList = new ArrayList<>(); + slabList.add(new BlockPos(size / 2, bottom + 2, size / 2)); // don't block the spawner + for (int i = 0; i < size - 1; i++) { + BlockPos slab = new BlockPos(2 + rand.nextInt(size - (4)), height - 2, 2 + rand.nextInt(size - (4))); + if (!chainCollides(slab, slabList)) { + // if it doesn't collide, manufacture it and add it to the list + + placeBlock(world, ironBars, slab.getX(), bottom, slab.getZ(), sbb); + placeBlock(world, TFStructureHelper.birchSlab, slab.getX(), bottom + 1, slab.getZ(), sbb); + placeBlock(world, soulSand, slab.getX(), bottom + 2, slab.getZ(), sbb); + slabList.add(slab); + } + } + } + + /** + * Fill this room with sand and floor-to-ceiling cacti + */ + protected void decorateCactusRoom(WorldGenLevel world, RandomSource rand, int bottom, int top, Rotation ladderUpDir, Rotation ladderDownDir, BoundingBox sbb) { + // sand & random dead bush + for (int dx = 1; dx <= size - 2; dx++) { + for (int dz = 1; dz <= size - 2; dz++) { + // sand + placeBlock(world, Blocks.SAND.defaultBlockState(), dx, bottom - 1, dz, sbb); + if (!isWindowPos(dx, dz) && !isLadderPos(dx, dz, ladderUpDir, ladderDownDir)) { + // not an occupied position + if (rand.nextInt(4) == 0) { + placeBlock(world, Blocks.DEAD_BUSH.defaultBlockState(), dx, bottom, dz, sbb); + } + } + } + } + + // cacti + ArrayList cactusList = new ArrayList<>(); + cactusList.add(new BlockPos(size / 2, bottom + 2, size / 2)); // don't block the spawner + for (int i = 0; i < size + 12; i++) { + BlockPos cactus = new BlockPos(2 + rand.nextInt(size - (4)), height - 2, 2 + rand.nextInt(size - (4))); + if (!chainCollides(cactus, cactusList)) { + // if it doesn't collide, manufacture it and add it to the list + for (int dy = bottom; dy < top; dy++) { + placeBlock(world, Blocks.CACTUS.defaultBlockState(), cactus.getX(), dy, cactus.getZ(), sbb); + } + cactusList.add(cactus); + } + } + } + + /** + * Decorate this floor with an enticing treasure chest. + */ + protected void decorateTreasureChest(WorldGenLevel world, int bottom, int top, BoundingBox sbb) { + int cx = size / 2; + final BlockState stoneBrick = Blocks.STONE_BRICKS.defaultBlockState(); + + // bottom decoration + final BlockState stoneBrickStairs = Blocks.STONE_BRICK_STAIRS.defaultBlockState(); + final BlockState topStoneBrickStairs = stoneBrickStairs.setValue(StairBlock.HALF, Half.TOP); + + placeBlock(world, stoneBrick, cx, bottom, cx, sbb); + placeBlock(world, stoneBrick, cx, top-1, cx, sbb); + if(size < 6) { + surroundBlockCardinalRotated(world, stoneBrickStairs, cx, bottom, cx, sbb); + + surroundBlockCardinalRotated(world, topStoneBrickStairs, cx, top-1, cx, sbb); + } else { + surroundBlockCardinalRotated(world, stoneBrickStairs, cx, bottom, cx, sbb); + surroundBlockCorners(world, stoneBrick, cx, bottom, cx, sbb); + + // pillars + for (int cy = bottom + 1; cy < top - 1; cy++) { + surroundBlockCorners(world, stoneBrick, cx, cy, cx, sbb); + } + + surroundBlockCardinalRotated(world, topStoneBrickStairs, cx, top-1, cx, sbb); + surroundBlockCorners(world, stoneBrick, cx, top-1, cx, sbb); + } + + placeTreasureAtCurrentPosition(world, cx, bottom + 1, cx, TFLootTables.TOWER_ROOM, sbb); + } + + /** + * Decorate this floor with a mass of messy spider webs. + */ + protected void decorateSpiderWebs(WorldGenLevel world, RandomSource rand, int bottom, int top, Rotation ladderUpDir, Rotation ladderDownDir, BoundingBox sbb) { + for (int dy = bottom; dy < top; dy++) { + int chance = (top - dy + 2); + for (int dx = 1; dx <= size - 2; dx++) { + for (int dz = 1; dz <= size - 2; dz++) { + if (!isLadderPos(dx, dz, ladderUpDir, ladderDownDir) && rand.nextInt(chance) == 0) { + placeBlock(world, Blocks.COBWEB.defaultBlockState(), dx, dy, dz, sbb); + } + } + } + } + + // 20% chance of a spider spawner! + if (rand.nextInt(5) == 0) { + EntityType spiderName = switch (rand.nextInt(4)) { + case 3 -> EntityType.CAVE_SPIDER; + case 2 -> TFEntities.SWARM_SPIDER.get(); + case 1 -> TFEntities.HEDGE_SPIDER.get(); + default -> EntityType.SPIDER; + }; + + setSpawner(world, size / 2, bottom + 2, size / 2, sbb, spiderName); + + } else { + decorateFurniture(world, rand, bottom, size - 2, sbb); + } + } + + /** + * Place some furniture around the room. This should probably only be called on larger towers. + */ + protected void decorateFurniture(WorldGenLevel world, RandomSource rand, int bottom, int freeSpace, BoundingBox sbb) { + // 66% chance of a table + if (rand.nextInt(3) > 0) { + placeBlock(world, Blocks.OAK_FENCE.defaultBlockState(), size / 2, bottom, size / 2, sbb); + placeBlock(world, Blocks.OAK_PRESSURE_PLATE.defaultBlockState(), size / 2, bottom + 1, size / 2, sbb); + } + + // chairs! + final BlockState spruceStairs = Blocks.SPRUCE_STAIRS.defaultBlockState(); + if (rand.nextInt(3) == 0 && freeSpace > 1) { + placeBlock(world, spruceStairs.setValue(StairBlock.FACING, Direction.WEST), size / 2 + 1, bottom, size / 2, sbb); + } + if (rand.nextInt(3) == 0 && freeSpace > 1) { + placeBlock(world, spruceStairs.setValue(StairBlock.FACING, Direction.NORTH), size / 2, bottom, size / 2 + 1, sbb); + } + if (rand.nextInt(3) == 0 && freeSpace > 1) { + placeBlock(world, spruceStairs.setValue(StairBlock.FACING, Direction.EAST), size / 2 - 1, bottom, size / 2, sbb); + } + if (rand.nextInt(3) == 0 && freeSpace > 1) { + placeBlock(world, spruceStairs.setValue(StairBlock.FACING, Direction.SOUTH), size / 2, bottom, size / 2 - 1, sbb); + } + } + + /** + * Decorate this floor with solid rock + */ + protected void decorateSolidRock(WorldGenLevel world, RandomSource rand, int bottom, int top, Rotation ladderUpDir, Rotation ladderDownDir, BoundingBox sbb) { + for (int dy = bottom; dy < top; dy++) { + for (int dx = 1; dx <= size - 2; dx++) { + for (int dz = 1; dz <= size - 2; dz++) { + if (!isLadderPos(dx, dz, ladderUpDir, ladderDownDir) && rand.nextInt(9) != 0) { + placeBlock(world, Blocks.STONE.defaultBlockState(), dx, dy, dz, sbb); + } + } + } + } + + //TODO: maybe seed a few ores in there. + } + + /** + * Decorate this floor with an orderly library + */ + protected void decorateLibrary(WorldGenLevel world, RandomSource rand, int bottom, int top, Rotation ladderUpDir, Rotation ladderDownDir, BoundingBox sbb) { + // put some bookshelves around the room + for (int dx = 1; dx <= size - 2; dx++) { + for (int dz = 1; dz <= size - 2; dz++) { + for (int dy = bottom; dy < top - 1; dy++) { + if (dx == 1 || dx == size - 2 || dz == 1 || dz == size - 2) { + // side of the room + if (!isWindowPos(dx, dz) && !isLadderPos(dx, dz, ladderUpDir, ladderDownDir)) { + // not an occupied position + placeBlock(world, Blocks.BOOKSHELF.defaultBlockState(), dx, dy, dz, sbb); + } + } + } + } + } + // treasure?!?! + if (rand.nextInt(2) == 0 && this.size > 5) { + decorateLibraryTreasure(world, rand, top, ladderUpDir, ladderDownDir, sbb); + } + + if (rand.nextInt(2) == 0 && this.size > 5) { + decorateFurniture(world, rand, bottom, size - 2, sbb); + } + } + + /** + * Place a library treasure chest somewhere in the library + */ + @SuppressWarnings("fallthrough") + protected void decorateLibraryTreasure(WorldGenLevel world, RandomSource rand, int top, Rotation ladderUpDir, Rotation ladderDownDir, BoundingBox sbb) { + // FIXME: case 3 gets slightly higher chance than others + switch (rand.nextInt(4)) { + case 0: + default: + if (!isLadderPos(2, 1, ladderUpDir, ladderDownDir)) { + placeTreasureAtCurrentPosition(world, 2, top - 2, 1, TFLootTables.TOWER_LIBRARY, sbb); + break; + } + case 1: + if (!isLadderPos(size - 2, 2, ladderUpDir, ladderDownDir)) { + placeTreasureAtCurrentPosition(world, size - 2, top - 2, 2, TFLootTables.TOWER_LIBRARY, sbb); + break; + } + case 2: + if (!isLadderPos(size - 3, size - 2, ladderUpDir, ladderDownDir)) { + placeTreasureAtCurrentPosition(world, size - 3, top - 2, size - 2, TFLootTables.TOWER_LIBRARY, sbb); + break; + } + case 3: + if (!isLadderPos(1, size - 3, ladderUpDir, ladderDownDir)) { + placeTreasureAtCurrentPosition(world, 1, top - 2, size - 3, TFLootTables.TOWER_LIBRARY, sbb); + break; + } + } + } + + /** + * Decorate this floor with an overflowing library + */ + protected void decorateFullLibrary(WorldGenLevel world, RandomSource rand, int bottom, int top, Rotation ladderUpDir, Rotation ladderDownDir, BoundingBox sbb) { + // put some bookshelves around the room + for (int dx = 1; dx <= size - 2; dx++) { + for (int dz = 1; dz <= size - 2; dz++) { + for (int dy = bottom; dy < top; dy++) { + if (dx % 2 != 0 && ((dz >= dx && dz <= size - dx - 1) || (dz >= size - dx - 1 && dz <= dx)) + || dz % 2 != 0 && ((dx >= dz && dx <= size - dz - 1) || (dx >= size - dz - 1 && dx <= dz))) { + // concentric rings + if (!isWindowPos(dx, dy, dz) && !isOpeningPos(dx, dy, dz) && !isLadderPos(dx, dz, ladderUpDir, ladderDownDir)) { + // not an occupied position + placeBlock(world, Blocks.BOOKSHELF.defaultBlockState(), dx, dy, dz, sbb); + } + } + } + } + } + // treasure?!?! + if (rand.nextInt(2) == 0 && this.size > 5) { + decorateLibraryTreasure(world, rand, top, ladderUpDir, ladderDownDir, sbb); + } + } + + /** + * "Decorate" with a lot of TNT. + *

+ * This is not called at the moment, since I added monsters and the monsters set off the trap. Perhaps I need a better way of activating it. + */ + protected void decorateTrap(WorldGenLevel world, int bottom, int top, BoundingBox sbb) { + for (int dx = 2; dx <= size - 3; dx++) { + for (int dz = 2; dz <= size - 3; dz++) { + if (dx == 2 || dx == size - 3 || dz == 2 || dz == size - 3) { + placeBlock(world, Blocks.TNT.defaultBlockState(), dx, -1, dz, sbb); + } + } + } + for (int dy = bottom - 2; dy < top - 2; dy++) { + placeBlock(world, Blocks.TNT.defaultBlockState(), 1, dy, 1, sbb); + placeBlock(world, Blocks.TNT.defaultBlockState(), 1, dy, size - 2, sbb); + placeBlock(world, Blocks.TNT.defaultBlockState(), size - 2, dy, 1, sbb); + placeBlock(world, Blocks.TNT.defaultBlockState(), size - 2, dy, size - 2, sbb); + } + } + + + /** + * Checks if there is a window at the specified x and z. Does not check the Y. + */ + protected boolean isWindowPos(int x, int z) { + if (x == 1 && z == size / 2) { + return true; + } + if (x == size - 2 && z == size / 2) { + return true; + } + if (x == size / 2 && z == 1) { + return true; + } + return x == size / 2 && z == size - 2; + + // okay, looks good + } + + /** + * Checks if there is a window at the specified x, y, and z. + */ + protected boolean isWindowPos(int x, int y, int z) { + int checkYDir = -1; + + if (x == 1 && z == size / 2) { + checkYDir = 2; + } else if (x == size - 2 && z == size / 2) { + checkYDir = 0; + } else if (x == size / 2 && z == 1) { + checkYDir = 3; + } else if (x == size / 2 && z == size - 2) { + checkYDir = 1; + } + + if (checkYDir > -1) { + // check if we are at one of the Y positions with a window. + return !openingTowards[checkYDir] && (y == 2 || y == 3 || (height > 8 && (y == height - 3 || y == height - 4))); + } else { + // okay, looks good + return false; + } + } + + /** + * Checks if putting a block at the specified x, y, and z would block an opening. + * TODO: this could be much smarter. Although since there's usually only one opening, I guess it's not bad. + */ + protected boolean isOpeningPos(int x, int y, int z) { + for (BlockPos door : openings) { + // determine which wall we're at + BlockPos.MutableBlockPos inside = new BlockPos.MutableBlockPos(door.getX(), door.getY(), door.getZ()); + if (inside.getX() == 0) { + inside.move(Direction.EAST); + } else if (inside.getX() == size - 1) { + inside.move(Direction.WEST); + } else if (inside.getZ() == 0) { + inside.move(Direction.SOUTH); + } else if (inside.getZ() == size - 1) { + inside.move(Direction.NORTH); + } + // check the block + if (inside.getX() == x && inside.getZ() == z && (inside.getY() == y || inside.getY() + 1 == y)) { + return true; + } + } + // guess not! + return false; + } + + protected boolean isLadderPos(int x, int z, Rotation ladderUpDir, Rotation ladderDownDir) { + if (ladderUpDir != null && x == getLadderX(ladderUpDir) && z == getLadderZ(ladderUpDir)) { + return true; + } + return ladderDownDir != null && x == getLadderX(ladderDownDir) && z == getLadderZ(ladderDownDir); + + // okay, looks good + } + + /** + * Gets the X coordinate of the ladder on the specified wall. + */ + protected int getLadderX(Rotation ladderDir) { + return switch (ladderDir) { + case NONE -> size - 2; + case CLOCKWISE_90 -> size / 2 + 1; + case CLOCKWISE_180 -> 1; + case COUNTERCLOCKWISE_90 -> size / 2 - 1; + //default -> size / 2; + }; + } + + /** + * Gets the Z coordinate of the ladder on the specified wall. + */ + protected int getLadderZ(Rotation ladderDir) { + return switch (ladderDir) { + case NONE -> size / 2 - 1; + case CLOCKWISE_90 -> size - 2; + case CLOCKWISE_180 -> size / 2 + 1; + case COUNTERCLOCKWISE_90 -> 1; + //default -> size / 2; + }; + } + + /** + * Decorate a tower with stairs. + *

+ * We have two schemes here. We can either decorate the whole tower with a + * decoration that rises the entire height of the tower (such as a pillar) + * or we can divide the tower into the "stair" section on the bottom and the + * "attic" section at the top and decorate those seperately. + */ + protected void decorateStairTower(WorldGenLevel world, ChunkGenerator generator, RandomSource rand, BoundingBox sbb) { + + // if it's tall enough, consider adding extra floors onto the top. + if (height - highestOpening > 8) { + int base = highestOpening + 3; + int floors = (this.height - base) / 5; + + // divide the tower into floors + int floorHeight = (this.height - base) / floors; + for (int i = 0; i < floors; i++) { + // put down a floor + for (int x = 1; x < size - 1; x++) { + for (int z = 1; z < size - 1; z++) { + placeBlock(world, TFStructureHelper.birchPlanks, x, (i * floorHeight + base), z, sbb); + } + } + } + + Rotation ladderDir = Rotation.NONE; + Rotation downLadderDir; + + // place a ladder going up + //TODO: make this ladder connect better to the stairs + int dx = getLadderX(ladderDir); + int dz = getLadderZ(ladderDir); + final BlockState defaultState = Blocks.LADDER.defaultBlockState().setValue(LadderBlock.FACING, ladderDir.rotate(Direction.EAST)); + for (int dy = 1; dy < 3; dy++) { + placeBlock(world, defaultState, dx, base - dy, dz, sbb); + } + + // decorate middle floors + for (int i = 0; i < floors - 1; i++) { + int bottom = base + 1 + floorHeight * i; + int top = base + floorHeight * (i + 1); + + downLadderDir = ladderDir; + ladderDir = ladderDir.getRotated(Rotation.CLOCKWISE_90); + + decorateFloor(world, rand, i, bottom, top, ladderDir, downLadderDir, sbb); + } + + // decorate top floor + decorateFloor(world, rand, floors, base + 1 + floorHeight * (floors - 1), height - 1, null, ladderDir, sbb); + + // decorate below the bottom floor, into the stairs + if (base > 8) { + switch (rand.nextInt(4)) { + case 0 -> decorateChandelier(world, rand, base + 1, sbb); + case 1 -> decorateHangingChains(world, rand, base + 1, sbb); + case 2 -> decorateFloatingBooks(world, rand, base + 1, sbb); + case 3 -> decorateFloatingVines(world, rand, base + 1, sbb); + } + } + } else { + // decorate the top normally + if (size > 5) { + switch (rand.nextInt(4)) { + case 0 -> decorateChandelier(world, rand, height, sbb); + case 1 -> decorateHangingChains(world, rand, height, sbb); + case 2 -> decorateFloatingBooks(world, rand, height, sbb); + case 3 -> decorateFloatingVines(world, rand, height, sbb); + } + } else if (size > 3) { + switch (rand.nextInt(3)) { + case 0 -> decorateHangingChains(world, rand, height, sbb); + case 1 -> decorateFloatingBooks(world, rand, height, sbb); + case 2 -> decorateFloatingVines(world, rand, height, sbb); + } + } + } + + decorateStairFloor(world, generator, rand, sbb); + } + + /** + * Decorate the bottom floor of this tower. + *

+ * This is for towers with stairs at the bottom, not towers divided into floors + */ + protected void decorateStairFloor(WorldGenLevel world, ChunkGenerator generator, RandomSource rand, BoundingBox sbb) { + // decorate the bottom + if (size > 5) { + if (rand.nextInt(3) == 0) { + decorateStairWell(world, rand, sbb); + } else if (rand.nextInt(3) > 0 || this.size >= 15) { + // a few empty bottoms + decoratePlanter(world, generator, rand, sbb); + } + } + } + + /** + * Make a chandelier. The chandelier hangs down a random amount between the top of the tower and the highest opening. + */ + protected void decorateChandelier(WorldGenLevel world, RandomSource rand, int decoTop, BoundingBox sbb) { + if (decoTop < 8 || size < 8) { + return; + } + + int cx = size / 2; + int cy = decoTop - rand.nextInt(decoTop - 7) - 2; + int cz = size / 2; + + final BlockState oakFence = Blocks.OAK_FENCE.defaultBlockState(); + + //setDebugEntity(world, cx, cy, cz, sbb, "TowerWing.decorateChandelier"); + surroundBlockCardinal(world, oakFence, cx, cy, cz, sbb); + surroundBlockCardinal(world, oakFence, cx, cy + 1, cz, sbb); + + for (int y = cy; y < decoTop - 1; y++) { + placeBlock(world, oakFence, cx, y, cz, sbb); + } + } + + /** + * Decorates a tower with chains hanging down. + *

+ * The chains go from the ceiling to just above the highest doorway. + */ + protected void decorateHangingChains(WorldGenLevel world, RandomSource rand, int decoTop, BoundingBox sbb) { + // a list of existing chains + ArrayList chainList = new ArrayList(); + // try size + 2 times to find a chain that does not collide + for (int i = 0; i < size + 2; i++) { + int filled = size < 15 ? 2 : 4; + BlockPos chain = new BlockPos(filled + rand.nextInt(size - (filled * 2)), decoTop - 2, filled + rand.nextInt(size - (filled * 2))); + if (!chainCollides(chain, chainList)) { + // if it doesn't collide, manufacture it and add it to the list + int length = 1 + rand.nextInt(decoTop - 7); + decorateOneChain(world, rand, chain.getX(), decoTop, length, chain.getZ(), sbb); + chainList.add(chain); + } + } + } + + /** + * Return true if the specified coords are orthogonally adjacent to any other coords on the list. + */ + protected boolean chainCollides(BlockPos coords, List list) { + for (BlockPos existing : list) { + // if x is within 1 and z is equal, we collide + if (coords.getZ() == existing.getZ() && Math.abs(coords.getX() - existing.getX()) <= 1) { + return true; + } + // similarly, if z is within 1 and x is equal, we collide + if (coords.getX() == existing.getX() && Math.abs(coords.getZ() - existing.getZ()) <= 1) { + return true; + } + } + // we're good + return false; + } + + protected void decorateOneChain(WorldGenLevel world, RandomSource rand, int dx, int decoTop, int length, int dz, BoundingBox sbb) { + for (int y = 1; y <= length; y++) { + placeBlock(world, Blocks.IRON_BARS.defaultBlockState(), dx, decoTop - y - 1, dz, sbb); + } + // make the "ball" at the end. + BlockState ballBlock = switch (rand.nextInt(10)) { + case 0 -> Blocks.IRON_BLOCK.defaultBlockState(); + case 1 -> Blocks.BOOKSHELF.defaultBlockState(); + case 2 -> Blocks.NETHERRACK.defaultBlockState(); + case 3 -> Blocks.SOUL_SAND.defaultBlockState(); + case 4 -> Blocks.GLASS.defaultBlockState(); + case 5 -> Blocks.LAPIS_BLOCK.defaultBlockState(); + case 6 -> Blocks.INFESTED_STONE_BRICKS.defaultBlockState(); + default -> Blocks.GLOWSTONE.defaultBlockState(); + }; + placeBlock(world, ballBlock, dx, decoTop - length - 2, dz, sbb); + } + + /** + * Decorates a tower with an array of floating bookshelves. + */ + protected void decorateFloatingBooks(WorldGenLevel world, RandomSource rand, int decoTop, BoundingBox sbb) { + // a list of existing bookshelves + ArrayList shelfList = new ArrayList<>(); + // try size + 2 times to find a shelf that does not collide + for (int i = 0; i < size + 2; i++) { + int filled = size < 15 ? 2 : 4; + BlockPos shelf = new BlockPos(filled + rand.nextInt(size - (filled * 2)), decoTop - 2, filled + rand.nextInt(size - (filled * 2))); + if (!chainCollides(shelf, shelfList)) { + // if it doesn't collide, manufacture it and add it to the list + int bottom = 2 + rand.nextInt(decoTop - 7); + int top = rand.nextInt(bottom - 1) + 2; + for (int y = top; y <= bottom; y++) { + placeBlock(world, Blocks.BOOKSHELF.defaultBlockState(), shelf.getX(), decoTop - y, shelf.getZ(), sbb); + } + shelfList.add(shelf); + } + } + } + + /** + * Decorates a tower with an array of floating vines, attached to mossy cobblestone. + */ + protected void decorateFloatingVines(WorldGenLevel world, RandomSource rand, int decoTop, BoundingBox sbb) { + final BlockState mossyCobbleStone = Blocks.MOSSY_COBBLESTONE.defaultBlockState(); + final BlockState vine = Blocks.VINE.defaultBlockState(); + final BlockState vineNorth = vine.setValue(VineBlock.NORTH, true); + final BlockState vineSouth = vine.setValue(VineBlock.SOUTH, true); + final BlockState vineEast = vine.setValue(VineBlock.EAST, true); + final BlockState vineWest = vine.setValue(VineBlock.WEST, true); + + // a list of existing blocks + ArrayList mossList = new ArrayList<>(); + // try size + 2 times to find a rock pillar that does not collide + for (int i = 0; i < size + 2; i++) { + int filled = size < 15 ? 2 : 4; + BlockPos moss = new BlockPos(filled + rand.nextInt(size - (filled * 2)), decoTop - 2, filled + rand.nextInt(size - (filled * 2))); + if (!chainCollides(moss, mossList)) { + // if it doesn't collide, manufacture it and add it to the list + int bottom = 2 + rand.nextInt(decoTop - 7); + int top = rand.nextInt(bottom - 1) + 2; + for (int y = top; y <= bottom; y++) { + placeBlock(world, mossyCobbleStone, moss.getX(), decoTop - y, moss.getZ(), sbb); + // surround it with vines + placeBlock(world, vineEast, moss.getX() + 1, decoTop - y, moss.getZ(), sbb); + placeBlock(world, vineWest, moss.getX() - 1, decoTop - y, moss.getZ(), sbb); + placeBlock(world, vineSouth, moss.getX(), decoTop - y, moss.getZ() + 1, sbb); + placeBlock(world, vineNorth, moss.getX(), decoTop - y, moss.getZ() - 1, sbb); + } + mossList.add(moss); + } + } + + // put vines on the sides of the tower. + for (int y = highestOpening + 3; y < decoTop - 1; y++) { + for (int x = 1; x < size - 1; x++) { + if (rand.nextInt(3) == 0) { + placeBlock(world, vineSouth, x, y, 1, sbb); + } + if (rand.nextInt(3) == 0) { + placeBlock(world, vineNorth, x, y, size - 2, sbb); + } + } + for (int z = 1; z < size - 1; z++) { + if (rand.nextInt(3) == 0) { + placeBlock(world, vineEast, 1, y, z, sbb); + } + if (rand.nextInt(3) == 0) { + placeBlock(world, vineWest, size - 2, y, z, sbb); + } + } + } + } + + /** + * Makes a planter. Depending on the situation, it can be filled with trees, flowers, or crops + */ + protected void decoratePlanter(WorldGenLevel world, ChunkGenerator generator, RandomSource rand, BoundingBox sbb) { + int cx = size / 2; + + surroundBlockCardinal(world, TFStructureHelper.stoneSlab, cx, 1, cx, sbb); + + if (size > 7) + surroundBlockCorners(world, TFStructureHelper.stoneSlabDouble, cx, 1, cx, sbb); + + + // place a cute planted thing + placeBlock(world, Blocks.GRASS_BLOCK.defaultBlockState(), cx, 1, cx, sbb); + + int i = rand.nextInt(6); + final BlockState plant = TFStructureHelper.randomPlant(i); + + final BlockPos pos = getBlockPosWithOffset(cx, 2, cx); + + if (i > 4 && !world.registryAccess().registryOrThrow(Registries.CONFIGURED_FEATURE).get(TFStructureHelper.randomTree(rand.nextInt(4))).place(world, generator, world.getRandom(), pos)) { + //if tree placement fails, place the potted sapling + this.placeBlock(world, plant, cx, 2, cx, sbb); + } else { + this.placeBlock(world, plant, cx, 2, cx, sbb); + } + } + + /** + * Decorate the floor of this stair tower with a scenic well. + */ + protected void decorateStairWell(WorldGenLevel world, RandomSource rand, BoundingBox sbb) { + int cx = size / 2; + int cy = 1; + + final BlockState waterOrLava = rand.nextInt(4) == 0 ? Blocks.LAVA.defaultBlockState() : Blocks.WATER.defaultBlockState(); + + final BlockState stoneSlab = Blocks.SMOOTH_STONE_SLAB.defaultBlockState(); + final BlockState stoneBrick = Blocks.STONE_BRICKS.defaultBlockState(); + + if (size > 7) { + // actual well structure + placeBlock(world, stoneBrick, cx - 1, cy, cx - 1, sbb); + placeBlock(world, stoneSlab, cx - 1, cy + 1, cx - 1, sbb); + placeBlock(world, stoneBrick, cx, cy, cx - 1, sbb); + placeBlock(world, stoneBrick, cx + 1, cy, cx - 1, sbb); + placeBlock(world, stoneSlab, cx + 1, cy + 1, cx - 1, sbb); + placeBlock(world, stoneBrick, cx - 1, cy, cx, sbb); + placeBlock(world, waterOrLava, cx, cy, cx, sbb); + placeBlock(world, stoneBrick, cx + 1, cy, cx, sbb); + placeBlock(world, stoneBrick, cx - 1, cy, cx + 1, sbb); + placeBlock(world, stoneSlab, cx - 1, cy + 1, cx + 1, sbb); + placeBlock(world, stoneBrick, cx, cy, cx + 1, sbb); + placeBlock(world, stoneBrick, cx + 1, cy, cx + 1, sbb); + placeBlock(world, stoneSlab, cx + 1, cy + 1, cx + 1, sbb); + } + + placeBlock(world, waterOrLava, cx, 0, cx, sbb); + } + + /** + * Returns true if this tower has only one exit. + */ + public boolean isDeadEnd() { + return openings.size() == 1; + } + + /** + * Iterate through the openings on our list and add them to the tower + */ + protected void makeOpenings(WorldGenLevel world, BoundingBox sbb) { + for (BlockPos door : openings) { + makeDoorOpening(world, door.getX(), door.getY(), door.getZ(), sbb); + } + } + + /** + * Make an opening in this tower for a door. This now only makes one opening, so you need two + */ + protected void makeDoorOpening(WorldGenLevel world, int dx, int dy, int dz, BoundingBox sbb) { + placeBlock(world, AIR, dx, dy, dz, sbb); + placeBlock(world, AIR, dx, dy + 1, dz, sbb); + + if (getBlock(world, dx, dy + 2, dz, sbb).getBlock() != Blocks.AIR) { + BlockState state = TFStructureHelper.stoneSlabDouble; + placeBlock(world, state, dx, dy + 2, dz, sbb); + } + } + + /** + * Gets a random position in the specified direction that connects to stairs currently in the tower. + */ + public int[] getValidOpening(RandomSource rand, Rotation direction) { + // variables! + int wLength = size - 2; // wall length + int offset = 1; // wall thickness + + // size 15 towers have funny landings, so don't generate on the very edge + if (this.size == 15) { + wLength = 11; + offset = 2; + } + + // for directions 0 or 2, the wall lies along the z axis + if (direction == Rotation.NONE || direction == Rotation.CLOCKWISE_180) { + int rx = direction == Rotation.NONE ? size - 1 : 0; + int rz = offset + rand.nextInt(wLength); + int ry = getYByStairs(rz, rand, direction); + + return new int[]{rx, ry, rz}; + } + + // for directions 1 or 3, the wall lies along the x axis + if (direction == Rotation.CLOCKWISE_90 || direction == Rotation.COUNTERCLOCKWISE_90) { + int rx = offset + rand.nextInt(wLength); + int rz = direction == Rotation.CLOCKWISE_90 ? size - 1 : 0; + int ry = getYByStairs(rx, rand, direction); + + return new int[]{rx, ry, rz}; + } + + return new int[]{0, 0, 0}; + } + + /** + * Gets a Y value where the stairs meet the specified X coordinate. + * Also works for Z coordinates. + */ + protected int getYByStairs(int rx, RandomSource rand, Rotation direction) { + // initialize some variables + int rise = 1; + int base = 0; + + if (size == 15) { + rise = 10; + // we lie a little here to get the towers off the ground + base = (direction == Rotation.NONE || direction == Rotation.CLOCKWISE_180) ? 23 : 28; + } + if (size == 9) { + rise = 6; + base = (direction == Rotation.NONE || direction == Rotation.CLOCKWISE_180) ? 2 : 5; + } + if (size == 7) { + rise = 4; + base = (direction == Rotation.NONE || direction == Rotation.CLOCKWISE_180) ? 2 : 4; + } + if (size == 5) { + rise = 4; + // bleh, a switch. + base = switch (direction) { + case NONE -> 3; + case CLOCKWISE_90 -> 2; + case CLOCKWISE_180 -> 5; + case COUNTERCLOCKWISE_90 -> 4; + }; + } + + int flights = ((height - 6 - base) / rise) + 1; + + if (base > 0 && flights > 0) { + // pick a flight of stairs to be on + int flightChosen = rand.nextInt(flights); + // calculate where we would be if rx = 0 + int dy = (flightChosen * rise) + base; + // the staircase (a/de)scends across the room. + if (size == 15) { + // blech, another dumb kludge here + dy -= (direction == Rotation.NONE || direction == Rotation.COUNTERCLOCKWISE_90) ? (rx - 2) / 2 : (size - rx - 3) / 2; + } else { + // the rest are fairly normal + dy -= (direction == Rotation.NONE || direction == Rotation.COUNTERCLOCKWISE_90) ? (rx - 1) / 2 : (size - rx - 2) / 2; + } +// // even xs can be one higher if they want. +// if (rx % 2 == 0 && size != 15) { +// dy += rand.nextInt(2); +// } + // don't go through the floor + if (dy < 1) { + dy = 1; + } + + return dy; + } + + return 0; + } + + /** + * Makes 3 windows outside this tower. + *

+ * The function currently looks "outside" to see if the window will be blocked, but it can't see into the future, so a tower built after this one may block it. + *

+ * Maybe this could eventually have access to the list of bounding boxes for better accuracy? + */ + protected void makeWindows(WorldGenLevel world, BoundingBox sbb, boolean real) { + + for (Rotation rotation : RotationUtil.ROTATIONS) { + boolean realWindows = real && !openingTowards[rotation.ordinal()]; + makeWindowBlock(world, size - 1, 2, size / 2, rotation, sbb, realWindows); + makeWindowBlock(world, size - 1, 3, size / 2, rotation, sbb, realWindows); + makeWindowBase(world, size - 1, 1, size / 2, rotation, sbb); + if (height > 8) { + makeWindowBlock(world, size - 1, height - 3, size / 2, rotation, sbb, realWindows); + makeWindowBlock(world, size - 1, height - 4, size / 2, rotation, sbb, realWindows); + makeWindowBase(world, size - 1, height - 5, size / 2, rotation, sbb); + } + } + } + + /** + * Makes a window block. Specify a point in a wall, and this function checks to + * see if it is blocked on the inside or outside, and if not, adds a pane of glass. + */ + protected void makeWindowBlock(WorldGenLevel world, int x, int y, int z, Rotation rotation, BoundingBox sbb, boolean realWindows) { + Direction temp = this.getOrientation(); + this.setOrientation(rotation.rotate(temp)); + + // look outside + Block outside = getBlock(world, x + 1, y, z, sbb).getBlock(); + + // look inside + Block inside = getBlock(world, x - 1, y, z, sbb).getBlock(); + + // make a window! + if (realWindows && inside == Blocks.AIR && outside == Blocks.AIR) { + placeBlock(world, Blocks.GLASS_PANE.defaultBlockState(), x, y, z, sbb); + } else { + // cobblestone where the window might have been + placeBlock(world, Blocks.COBBLESTONE.defaultBlockState(), x, y, z, sbb); + } + + this.setOrientation(temp); + } + + /** + * Makes a window base + */ + protected void makeWindowBase(WorldGenLevel world, int x, int y, int z, Rotation rotation, BoundingBox sbb) { + Direction temp = this.getOrientation(); + this.setOrientation(rotation.rotate(temp)); + BlockState state = TFStructureHelper.stoneSlabDouble; + placeBlock(world, state, x, y, z, sbb); + this.setOrientation(temp); + } + + /** + * Add stairs to this tower. + */ + protected boolean makeStairs(WorldGenLevel world, RandomSource rand, BoundingBox sbb) { + if (this.size == 15) { + return makeStairs15(world, rand, sbb); + } + if (this.size == 9) { + return makeStairs9(world, rand, sbb); + } + if (this.size == 7) { + return makeStairs7(world, rand, sbb); + } + if (this.size == 5) { + return makeStairs5(world, rand, sbb); + } + + return false; + } + + /** + * Stair maker for a size 5 tower + */ + protected boolean makeStairs5(WorldGenLevel world, RandomSource rand, BoundingBox sbb) { + // staircases rotating around the tower + int rise = 1; +// int numFlights = ((this.height - 3) / rise) - 1; + int numFlights = (highestOpening / rise); + for (int i = 0; i < numFlights; i++) { + makeStairs5flight(world, sbb, i * rise, getRotation(Rotation.NONE, i * 3), true); + } + + return true; + } + + /** + * Function called by makeStairs5 to place stair blocks + */ + protected void makeStairs5flight(WorldGenLevel world, BoundingBox sbb, int height, Rotation rotation, boolean useBirchWood) { + Direction temp = this.getOrientation(); + + this.setOrientation(rotation.rotate(temp)); + + final BlockState bottomSlab = useBirchWood ? + TFStructureHelper.birchSlab : + TFStructureHelper.stoneSlab; + final BlockState topSlab = useBirchWood ? + TFStructureHelper.birchSlabTop : + TFStructureHelper.stoneSlabTop; + + placeBlock(world, bottomSlab, 2, 1 + height, 3, sbb); + placeBlock(world, topSlab, 3, 1 + height, 3, sbb); + + this.setOrientation(temp); + } + + /** + * Stair maker for a size 7 tower + */ + protected boolean makeStairs7(WorldGenLevel world, RandomSource rand, BoundingBox sbb) { + // foot of stairs + placeBlock(world, TFStructureHelper.birchSlab, 1, 1, 4, sbb); + placeBlock(world, TFStructureHelper.birchSlabTop, 1, 1, 5, sbb); + + placeBlock(world, TFStructureHelper.stoneSlab, 5, 1, 2, sbb); + placeBlock(world, TFStructureHelper.stoneSlabTop, 5, 1, 1, sbb); + + // staircases rotating around the tower + int rise = 2; + int numFlights = (highestOpening / rise); + for (int i = 0; i < numFlights; i++) { + makeStairs7flight(world, sbb, 1 + i * rise, getRotation(Rotation.NONE, i * 3), true); + makeStairs7flight(world, sbb, 1 + i * rise, getRotation(Rotation.CLOCKWISE_180, i * 3), false); + } + + return true; + } + + /** + * Function called by makeStairs7 to place stair blocks + */ + protected void makeStairs7flight(WorldGenLevel world, BoundingBox sbb, int height, Rotation rotation, boolean useBirchWood) { + final Direction temp = this.getOrientation(); + + this.setOrientation(rotation.rotate(temp)); + final BlockState slabBottom = useBirchWood ? + TFStructureHelper.birchSlab : + TFStructureHelper.stoneSlab; + final BlockState slabTop = useBirchWood ? + TFStructureHelper.birchSlabTop : + TFStructureHelper.stoneSlabTop; + + placeBlock(world, slabBottom, 2, 1 + height, 5, sbb); + placeBlock(world, slabTop, 3, 1 + height, 5, sbb); + placeBlock(world, slabBottom, 4, 2 + height, 5, sbb); + placeBlock(world, slabTop, 5, 2 + height, 5, sbb); + + this.setOrientation(temp); + } + + /** + * Stair maker for a size 9 tower + */ + protected boolean makeStairs9(WorldGenLevel world, RandomSource rand, BoundingBox sbb) { + + // foot of stairs + placeBlock(world, TFStructureHelper.birchSlab, 1, 1, 6, sbb); + placeBlock(world, TFStructureHelper.birchSlabTop, 1, 1, 7, sbb); + + placeBlock(world, TFStructureHelper.stoneSlab, 7, 1, 2, sbb); + placeBlock(world, TFStructureHelper.stoneSlabTop, 7, 1, 1, sbb); + + // staircases rotating around the tower + int rise = 3; + int numFlights = (highestOpening / rise); + for (int i = 0; i < numFlights; i++) { + makeStairs9flight(world, sbb, 1 + i * rise, getRotation(Rotation.NONE, i * 3), true); + makeStairs9flight(world, sbb, 1 + i * rise, getRotation(Rotation.CLOCKWISE_180, i * 3), false); + } + + return true; + } + + /** + * Function called by makeStairs7 to place stair blocks + */ + protected void makeStairs9flight(WorldGenLevel world, BoundingBox sbb, int height, Rotation rotation, boolean useBirchWood) { + //TODO: Can we just... not do this? + Direction temp = this.getOrientation(); + this.setOrientation(rotation.rotate(temp)); + + final BlockState slabBot = useBirchWood ? + TFStructureHelper.birchSlab : + TFStructureHelper.stoneSlab; + final BlockState slabTop = useBirchWood ? + TFStructureHelper.birchSlabTop : + TFStructureHelper.stoneSlabTop; + + placeBlock(world, slabBot, 2, 1 + height, 7, sbb); + placeBlock(world, slabTop, 3, 1 + height, 7, sbb); + placeBlock(world, slabBot, 4, 2 + height, 7, sbb); + placeBlock(world, slabTop, 5, 2 + height, 7, sbb); + placeBlock(world, slabBot, 6, 3 + height, 7, sbb); + placeBlock(world, slabTop, 7, 3 + height, 7, sbb); + + this.setOrientation(temp); + } + + /** + * Stair maker for a size 15 tower + */ + protected boolean makeStairs15(WorldGenLevel world, RandomSource rand, BoundingBox sbb) { + final BlockState planks = Blocks.BIRCH_PLANKS.defaultBlockState(); + final BlockState oakFence = Blocks.OAK_FENCE.defaultBlockState(); + final BlockState birchSlab = TFStructureHelper.birchSlab; + final BlockState stoneSlab = TFStructureHelper.stoneSlab; + final BlockState doubleStoneSlab = TFStructureHelper.stoneSlabDouble; + + // foot of stairs + placeBlock(world, birchSlab, 1, 1, 9, sbb); + placeBlock(world, birchSlab, 2, 1, 9, sbb); + + placeBlock(world, planks, 1, 1, 10, sbb); + placeBlock(world, planks, 2, 1, 10, sbb); + placeBlock(world, birchSlab, 1, 2, 11, sbb); + placeBlock(world, birchSlab, 2, 2, 11, sbb); + placeBlock(world, planks, 1, 2, 12, sbb); + placeBlock(world, planks, 2, 2, 12, sbb); + placeBlock(world, planks, 1, 2, 13, sbb); + placeBlock(world, planks, 2, 2, 13, sbb); + + placeBlock(world, planks, 3, 2, 11, sbb); + placeBlock(world, oakFence, 3, 3, 11, sbb); + placeBlock(world, oakFence, 3, 4, 11, sbb); + placeBlock(world, planks, 3, 1, 10, sbb); + placeBlock(world, oakFence, 3, 2, 10, sbb); + placeBlock(world, oakFence, 3, 3, 10, sbb); + placeBlock(world, planks, 3, 1, 9, sbb); + placeBlock(world, oakFence, 3, 2, 9, sbb); + + placeBlock(world, stoneSlab, 13, 1, 5, sbb); + placeBlock(world, stoneSlab, 12, 1, 5, sbb); + placeBlock(world, doubleStoneSlab, 13, 1, 4, sbb); + placeBlock(world, doubleStoneSlab, 12, 1, 4, sbb); + placeBlock(world, stoneSlab, 13, 2, 3, sbb); + placeBlock(world, stoneSlab, 12, 2, 3, sbb); + placeBlock(world, doubleStoneSlab, 13, 2, 2, sbb); + placeBlock(world, doubleStoneSlab, 12, 2, 2, sbb); + placeBlock(world, doubleStoneSlab, 13, 2, 1, sbb); + placeBlock(world, doubleStoneSlab, 12, 2, 1, sbb); + placeBlock(world, doubleStoneSlab, 11, 2, 3, sbb); + placeBlock(world, oakFence, 11, 3, 3, sbb); + placeBlock(world, oakFence, 11, 4, 3, sbb); + placeBlock(world, doubleStoneSlab, 11, 1, 4, sbb); + placeBlock(world, oakFence, 11, 2, 4, sbb); + placeBlock(world, oakFence, 11, 3, 4, sbb); + placeBlock(world, doubleStoneSlab, 11, 1, 5, sbb); + placeBlock(world, oakFence, 11, 2, 5, sbb); + + + // staircases rotating around the tower + int rise = 5; + int numFlights = (highestOpening / rise); + for (int i = 0; i < numFlights; i++) { + makeStairs15flight(world, rand, sbb, 2 + i * rise, getRotation(Rotation.NONE, i * 3), true); + makeStairs15flight(world, rand, sbb, 2 + i * rise, getRotation(Rotation.CLOCKWISE_180, i * 3), false); + } + + return true; + } + + private Rotation getRotation(Rotation startRotation, int rotations) { + final int totalIncrements = startRotation.ordinal() + rotations; + return RotationUtil.ROTATIONS[totalIncrements & 3]; + } + + /** + * Function called by makeStairs7 to place stair blocks + * pretty sure this is the one that makes the main staircase + */ + protected void makeStairs15flight(WorldGenLevel world, RandomSource rand, BoundingBox sbb, int height, Rotation rotation, boolean useBirchWood) { + Direction temp = this.getOrientation(); + + this.setOrientation(rotation.rotate(temp)); + + final BlockState oakFence = Blocks.OAK_FENCE.defaultBlockState(); + + final BlockState slabBot = useBirchWood ? + TFStructureHelper.birchSlab : + TFStructureHelper.stoneSlab; + final BlockState slabTop = useBirchWood ? + TFStructureHelper.birchSlabTop : + TFStructureHelper.stoneSlabTop; + final BlockState slabDoub = useBirchWood ? + TFStructureHelper.birchPlanks : + TFStructureHelper.stoneSlabDouble; + + placeBlock(world, slabBot, 3, 1 + height, 13, sbb); + maybeGenerateBlock(world, sbb, rand, 0.9F, 4, 1 + height, 13, slabTop); + placeBlock(world, slabBot, 5, 2 + height, 13, sbb); + placeBlock(world, slabTop, 6, 2 + height, 13, sbb); + placeBlock(world, slabBot, 7, 3 + height, 13, sbb); + placeBlock(world, slabTop, 8, 3 + height, 13, sbb); + placeBlock(world, slabBot, 9, 4 + height, 13, sbb); + maybeGenerateBlock(world, sbb, rand, 0.9F, 10, 4 + height, 13, slabTop); + maybeGenerateBlock(world, sbb, rand, 0.9F, 11, 5 + height, 13, slabBot); + placeBlock(world, slabTop, 12, 5 + height, 13, sbb); + placeBlock(world, slabTop, 13, 5 + height, 13, sbb); + + maybeGenerateBlock(world, sbb, rand, 0.9F, 3, 1 + height, 12, slabBot); + placeBlock(world, slabTop, 4, 1 + height, 12, sbb); + placeBlock(world, slabBot, 5, 2 + height, 12, sbb); + placeBlock(world, slabTop, 6, 2 + height, 12, sbb); + maybeGenerateBlock(world, sbb, rand, 0.9F, 7, 3 + height, 12, slabBot); + placeBlock(world, slabTop, 8, 3 + height, 12, sbb); + placeBlock(world, slabBot, 9, 4 + height, 12, sbb); + maybeGenerateBlock(world, sbb, rand, 0.9F, 10, 4 + height, 12, slabTop); + placeBlock(world, slabBot, 11, 5 + height, 12, sbb); + placeBlock(world, slabTop, 12, 5 + height, 12, sbb); + placeBlock(world, slabTop, 13, 5 + height, 12, sbb); + + placeBlock(world, slabDoub, 4, 1 + height, 11, sbb); + placeBlock(world, slabDoub, 5, 2 + height, 11, sbb); + maybeGenerateBlock(world, sbb, rand, 0.9F, 6, 2 + height, 11, slabTop); + placeBlock(world, slabDoub, 7, 3 + height, 11, sbb); + maybeGenerateBlock(world, sbb, rand, 0.9F, 8, 3 + height, 11, slabTop); + placeBlock(world, slabDoub, 9, 4 + height, 11, sbb); + placeBlock(world, slabTop, 10, 4 + height, 11, sbb); + placeBlock(world, slabDoub, 11, 5 + height, 11, sbb); + + placeBlock(world, oakFence, 4, 2 + height, 11, sbb); + placeBlock(world, oakFence, 5, 3 + height, 11, sbb); + placeBlock(world, oakFence, 6, 3 + height, 11, sbb); + placeBlock(world, oakFence, 7, 4 + height, 11, sbb); + placeBlock(world, oakFence, 8, 4 + height, 11, sbb); + placeBlock(world, oakFence, 9, 5 + height, 11, sbb); + placeBlock(world, oakFence, 10, 5 + height, 11, sbb); + placeBlock(world, oakFence, 11, 6 + height, 11, sbb); + + placeBlock(world, oakFence, 4, 3 + height, 11, sbb); + placeBlock(world, oakFence, 6, 4 + height, 11, sbb); + placeBlock(world, oakFence, 8, 5 + height, 11, sbb); + placeBlock(world, oakFence, 10, 6 + height, 11, sbb); + placeBlock(world, oakFence, 11, 7 + height, 11, sbb); + + this.setOrientation(temp); + } + + /** + * Makes paintings of the minimum size or larger on the specified wall + */ + protected void generatePaintingsOnWall(WorldGenLevel world, RandomSource rand, int howMany, int floorLevel, Direction direction, int minSize, BoundingBox sbb) { + for (int i = 0; i < howMany; i++) { + // get some random coordinates on the wall in the chunk + BlockPos pCoords = getRandomWallSpot(rand, floorLevel, direction, sbb); + + if (pCoords == null) continue; + // initialize a painting object + EntityUtil.tryHangPainting(world, pCoords, direction, EntityUtil.getPaintingOfSize(rand, minSize)); + } + } + + /** + * This returns the real-world coordinates of a possible painting or torch spot on the specified wall of this tower. + */ + @Nullable + protected BlockPos getRandomWallSpot(RandomSource rand, int floorLevel, Direction direction, BoundingBox sbb) { + int minX = this.boundingBox.minX() + 2; + int maxX = this.boundingBox.maxX() - 2; + + int minY = this.boundingBox.minY() + floorLevel + 2; + int maxY = this.boundingBox.maxY() - 2; + + int minZ = this.boundingBox.minZ() + 2; + int maxZ = this.boundingBox.maxZ() - 2; + + // constrain the paintings to one wall + // these directions correspond to painting facing directions, not necessarily to the structure orienting directions + if (direction == Direction.SOUTH) { + minZ = this.boundingBox.minZ(); + maxZ = this.boundingBox.minZ(); + } + else if (direction == Direction.WEST) { + maxX = this.boundingBox.maxX(); + minX = this.boundingBox.maxX(); + } + else if (direction == Direction.NORTH) { + maxZ = this.boundingBox.maxZ(); + minZ = this.boundingBox.maxZ(); + } + else if (direction == Direction.EAST) { + minX = this.boundingBox.minX(); + maxX = this.boundingBox.minX(); + } + + // try 30 times to get a proper result + for (int i = 0; i < 30; i++) { + int cx = minX + (maxX > minX ? rand.nextInt(maxX - minX) : 0); + int cy = minY + (maxY > minY ? rand.nextInt(maxY - minY) : 0); + int cz = minZ + (maxZ > minZ ? rand.nextInt(maxZ - minZ) : 0); + + final BlockPos blockPos = new BlockPos(cx, cy, cz).relative(direction); + if (sbb.isInside(blockPos)) { + return blockPos; + } + } + + // I guess we didn't get one + TwilightForestMod.LOGGER.info("ComponentTFTowerWing#getRandomWallSpot - We didn't find a valid random spot on the wall."); + return null; + } + + /** + * This method is for final castle towers actually. + * We need to break up this class into a more abstract tower class and a concrete lich tower class one day + */ + protected void makeGlyphBranches(WorldGenLevel world, RandomSource rand, BlockState colour, BoundingBox sbb) { + // pick a random side of the tower + Rotation rotation = RotationUtil.ROTATIONS[rand.nextInt(4)]; + + // start somewhere in the lower part + int startHeight = this.height > 1 ? rand.nextInt((int) (this.height * 0.66F)) : this.height; + + // near the middle + int startZ = 3 + rand.nextInt(this.size - 6); + + // make a line all the way down to the foundation + int dx = this.getXWithOffsetRotated(0, startZ, rotation); + int dz = this.getZWithOffsetRotated(0, startZ, rotation); + if (sbb.isInside(new BlockPos(dx, this.boundingBox.minY() + 1, dz))) { + for (int dy = this.getWorldY(startHeight); dy > 0; dy--) { + final BlockPos pos = new BlockPos(dx, dy, dz); + if (world.getBlockState(pos).is(BlockTagGenerator.CASTLE_BLOCKS) && world.getBlockState(pos).isRedstoneConductor(world, pos)) { + world.setBlock(pos, colour, 2); + } else { + break; + } + } + } + + // go left a little + int leftOffset = startZ - (1 + rand.nextInt(3)); + int leftHeight = rand.nextInt(Math.max(this.height - startHeight, 1)); + if (leftOffset >= 0) { + for (int z = startZ; z > leftOffset; z--) { + this.setBlockStateRotated(world, colour, 0, startHeight, z, rotation, sbb); + } + for (int y = startHeight; y < (startHeight + leftHeight); y++) { + this.setBlockStateRotated(world, colour, 0, y, leftOffset, rotation, sbb); + } + } + + // go right a little + int rightOffset = startZ + (1 + rand.nextInt(3)); + int rightHeight = rand.nextInt(Math.max(this.height - startHeight, 1)); + if (rightOffset < this.size - 1) { + for (int z = startZ; z < rightOffset; z++) { + this.setBlockStateRotated(world, colour, 0, startHeight, z, rotation, sbb); + } + for (int y = startHeight; y < (startHeight + rightHeight); y++) { + this.setBlockStateRotated(world, colour, 0, y, rightOffset, rotation, sbb); + } + } + } +} diff --git a/src/main/java/twilightforest/world/components/structures/lichtower/package-info.java b/src/main/java/twilightforest/world/components/structures/lichtower/package-info.java new file mode 100644 index 0000000000..4810dbe5d7 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/lichtower/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.world.components.structures.lichtower; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/world/components/structures/lichtowerrevamp/CentralTowerAttachment.java b/src/main/java/twilightforest/world/components/structures/lichtowerrevamp/CentralTowerAttachment.java new file mode 100644 index 0000000000..b1c90799dc --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/lichtowerrevamp/CentralTowerAttachment.java @@ -0,0 +1,101 @@ +package twilightforest.world.components.structures.lichtowerrevamp; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ServerLevelAccessor; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplateManager; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructurePlaceSettings; +import twilightforest.TwilightForestMod; +import twilightforest.world.components.structures.TwilightTemplateStructurePiece; +import twilightforest.init.TFStructurePieceTypes; + + +public final class CentralTowerAttachment extends TwilightTemplateStructurePiece { + private final int width; + @SuppressWarnings("FieldCanBeLocal") // TODO Allow this to be dynamic per piece + private final int length = 2; // Determines how far out the piece should gen + + public CentralTowerAttachment(StructurePieceSerializationContext ctx, CompoundTag compoundTag) { + super(TFStructurePieceTypes.CENTRAL_TO_SIDE_TOWER.get(), compoundTag, ctx, TwilightTemplateStructurePiece.readSettings(compoundTag)); + this.width = compoundTag.getInt("width"); + } + + private CentralTowerAttachment(StructureTemplateManager structureManager, Rotation rotation, String name, BlockPos startPosition, int width) { + this(structureManager, TwilightForestMod.prefix("lich_tower/attachments/central/" + name), makeSettings(rotation), startPosition.relative(rotation.rotate(Direction.EAST), -(width - 5 >> 1)), width); + } + + private CentralTowerAttachment(StructureTemplateManager structureManager, ResourceLocation templateLocation, StructurePlaceSettings placeSettings, BlockPos startPosition, int width) { + super(TFStructurePieceTypes.CENTRAL_TO_SIDE_TOWER.get(), 0, structureManager, templateLocation, placeSettings, startPosition); + this.width = width; + } + + public static CentralTowerAttachment startRandomAttachment(StructureTemplateManager structureManager, Rotation rotation, BlockPos startPosition, RandomSource random) { + float weight = random.nextFloat() * random.nextFloat(); + + if (weight < 1/3f) + return smallAttachment(structureManager, rotation, startPosition); + + if (weight < 2/3f) + return mediumAttachment(structureManager, rotation, startPosition); + + return largeAttachment(structureManager, rotation, startPosition); + } + + public static CentralTowerAttachment smallAttachment(StructureTemplateManager structureManager, Rotation rotation, BlockPos startPosition) { + return new CentralTowerAttachment(structureManager, rotation, "central_to_small", startPosition, 5); + } + + public static CentralTowerAttachment mediumAttachment(StructureTemplateManager structureManager, Rotation rotation, BlockPos startPosition) { + return new CentralTowerAttachment(structureManager, rotation, "central_to_medium", startPosition, 7); + } + + public static CentralTowerAttachment largeAttachment(StructureTemplateManager structureManager, Rotation rotation, BlockPos startPosition) { + return new CentralTowerAttachment(structureManager, rotation, "central_to_large", startPosition, 9); + } + + @Override + public void addChildren(StructurePiece parent, StructurePieceAccessor structureStart, RandomSource random) { + super.addChildren(parent, structureStart, random); + + Direction dir = this.rotation.rotate(Direction.SOUTH); + BlockPos placement = this.templatePosition.offset(dir.getStepX() * this.length, 1, dir.getStepZ() * this.length); + + switch (this.width) { + case 9 -> { + SideTowerRoom largeRoom = SideTowerRoom.largeRoom(this.structureManager, this.rotation, placement, random); + largeRoom.addChildren(this, structureStart, random); + structureStart.addPiece(largeRoom); + } + case 7 -> { + SideTowerRoom mediumRoom = SideTowerRoom.mediumRoom(this.structureManager, this.rotation, placement, random); + mediumRoom.addChildren(this, structureStart, random); + structureStart.addPiece(mediumRoom); + } + case 5 -> { + SideTowerRoom smallRoom = SideTowerRoom.smallRoom(this.structureManager, this.rotation, placement, random); + smallRoom.addChildren(this, structureStart, random); + structureStart.addPiece(smallRoom); + } + } + } + + @Override + protected void handleDataMarker(String label, BlockPos pos, ServerLevelAccessor levelAccessor, RandomSource random, BoundingBox boundingBox) { + + } + + @Override + protected void addAdditionalSaveData(StructurePieceSerializationContext ctx, CompoundTag structureTag) { + super.addAdditionalSaveData(ctx, structureTag); + + structureTag.putInt("width", this.width); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/lichtowerrevamp/CentralTowerSegment.java b/src/main/java/twilightforest/world/components/structures/lichtowerrevamp/CentralTowerSegment.java new file mode 100644 index 0000000000..e705e9be9f --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/lichtowerrevamp/CentralTowerSegment.java @@ -0,0 +1,73 @@ +package twilightforest.world.components.structures.lichtowerrevamp; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.Tag; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ServerLevelAccessor; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplateManager; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructurePlaceSettings; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureProcessor; +import twilightforest.TwilightForestMod; +import twilightforest.util.BoundingBoxUtils; +import twilightforest.world.components.processors.BoxCuttingProcessor; +import twilightforest.world.components.structures.TwilightTemplateStructurePiece; +import twilightforest.init.TFStructurePieceTypes; + +import java.util.ArrayList; +import java.util.List; + + +public final class CentralTowerSegment extends TwilightTemplateStructurePiece { + static final int SIDE_LENGTH = 30; + static final int HEIGHT = 4; + static final int ATTACHMENT_POINT_START = 6; + static final int ATTACHMENT_POINT_RANGE = 13; + + public CentralTowerSegment(StructurePieceSerializationContext ctx, CompoundTag compoundTag) { + super(TFStructurePieceTypes.CENTRAL_TOWER.get(), compoundTag, ctx, readSettings(compoundTag).addProcessor(BoxCuttingProcessor.fromNBT(compoundTag.getList("cutouts", Tag.TAG_COMPOUND)))); + } + + public CentralTowerSegment(StructureTemplateManager structureManager, Rotation rotation, BoxCuttingProcessor sideTowerStarts, BlockPos startPosition) { + this(structureManager, TwilightForestMod.prefix("lich_tower/central_tower"), makeSettings(rotation).addProcessor(sideTowerStarts), startPosition); + } + + private CentralTowerSegment(StructureTemplateManager structureManager, ResourceLocation templateLocation, StructurePlaceSettings placeSettings, BlockPos startPosition) { + super(TFStructurePieceTypes.CENTRAL_TOWER.get(), 0, structureManager, templateLocation, placeSettings, startPosition); + } + + @Override + protected void handleDataMarker(String label, BlockPos pos, ServerLevelAccessor levelAccessor, RandomSource random, BoundingBox boundingBox) { + + } + + @Override + protected void addAdditionalSaveData(StructurePieceSerializationContext ctx, CompoundTag structureTag) { + super.addAdditionalSaveData(ctx, structureTag); + + BoxCuttingProcessor cuttingProcessor = null; + for (StructureProcessor processor : this.placeSettings.getProcessors()) { + if (processor instanceof BoxCuttingProcessor first) { + // Welcome to jank + cuttingProcessor = first; + break; + } + } + + if (cuttingProcessor == null) return; + + List filtering = new ArrayList<>(cuttingProcessor.cutouts); + filtering.removeIf(bb -> bb.maxX() < this.templatePosition.getY() || bb.minY() > this.templatePosition.getY() + CentralTowerSegment.HEIGHT); + + ListTag boxTagList = new ListTag(); + + for (BoundingBox box : filtering) boxTagList.add(BoundingBoxUtils.boundingBoxToNBT(box)); + + structureTag.put("cutouts", boxTagList); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/lichtowerrevamp/LichTowerUtil.java b/src/main/java/twilightforest/world/components/structures/lichtowerrevamp/LichTowerUtil.java new file mode 100644 index 0000000000..184f4e5884 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/lichtowerrevamp/LichTowerUtil.java @@ -0,0 +1,39 @@ +package twilightforest.world.components.structures.lichtowerrevamp; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.block.Mirror; +import twilightforest.util.Vec2i; + + + +public final class LichTowerUtil { + // Segment step refers to the stair level for a given side. Consider it almost like a min-chunk + static Vec2i yOffsetForOpening(Direction side, RandomSource random, int segmentLevel, boolean sidesFaceXAxis) { + // Each segment is a parallel set of stairs, rotating by 90 degrees. This offsetting is XORed by `sidesFaceXAxis` + int height = (side.getAxis() == Direction.Axis.X) != sidesFaceXAxis ? 4 : 0; + + // Left refers to the left side of each face, as stairs ascend + int offsetFromLeft = random.nextInt(CentralTowerSegment.ATTACHMENT_POINT_RANGE); + + // Stairs have a slope of 0.25 + height += (offsetFromLeft - 1) >> 2; + height += segmentLevel * CentralTowerSegment.HEIGHT; + + offsetFromLeft += CentralTowerSegment.ATTACHMENT_POINT_START; + + return new Vec2i(offsetFromLeft, height); + } + + static BlockPos getRandomOpeningPlacementPos(BlockPos origin, Direction side, Mirror mirror, RandomSource random, int segmentLevel, boolean sidesFaceXAxis) { + Vec2i pair = yOffsetForOpening(side, random, segmentLevel, sidesFaceXAxis); + + return switch (side) { + case EAST -> origin.offset(-1, pair.z, mirror == Mirror.FRONT_BACK ? CentralTowerSegment.SIDE_LENGTH - pair.x : pair.x); + case WEST -> origin.offset(CentralTowerSegment.SIDE_LENGTH, pair.z, mirror == Mirror.FRONT_BACK ? pair.x : CentralTowerSegment.SIDE_LENGTH - pair.x); + case SOUTH -> origin.offset(mirror == Mirror.LEFT_RIGHT ? pair.x : CentralTowerSegment.SIDE_LENGTH - pair.x, pair.z, -1); + default -> origin.offset(mirror == Mirror.LEFT_RIGHT ? CentralTowerSegment.SIDE_LENGTH - pair.x : pair.x, pair.z, CentralTowerSegment.SIDE_LENGTH); + }; + } +} diff --git a/src/main/java/twilightforest/world/components/structures/lichtowerrevamp/SideTowerCover.java b/src/main/java/twilightforest/world/components/structures/lichtowerrevamp/SideTowerCover.java new file mode 100644 index 0000000000..80b2fdead5 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/lichtowerrevamp/SideTowerCover.java @@ -0,0 +1,74 @@ +package twilightforest.world.components.structures.lichtowerrevamp; + +import com.google.common.collect.ImmutableList; +import net.minecraft.Util; +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ServerLevelAccessor; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplateManager; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructurePlaceSettings; +import twilightforest.TwilightForestMod; +import twilightforest.world.components.structures.TwilightTemplateStructurePiece; +import twilightforest.init.TFStructurePieceTypes; + +import java.util.List; + + +public final class SideTowerCover extends TwilightTemplateStructurePiece { + private static final List SMALL_COVERS = ImmutableList.of( + "cobbled_small" + ); + private static final List MEDIUM_COVERS = ImmutableList.of( + "cobbled_medium" + ); + private static final List LARGE_COVERS = ImmutableList.of( + "cobbled_large" + ); + + private final int width; + @SuppressWarnings("FieldCanBeLocal") // TODO Allow this to be dynamic per piece + private final int thickness = 2; + + public SideTowerCover(StructurePieceSerializationContext ctx, CompoundTag compoundTag) { + super(TFStructurePieceTypes.CENTRAL_TO_SIDE_TOWER.get(), compoundTag, ctx, readSettings(compoundTag)); + this.width = compoundTag.getInt("width"); + } + + private SideTowerCover(StructureTemplateManager structureManager, Rotation rotation, String name, BlockPos startPosition, int width) { + this(structureManager, TwilightForestMod.prefix("lich_tower/side_tower_covers/" + name), makeSettings(rotation), startPosition, width); + } + + private SideTowerCover(StructureTemplateManager structureManager, ResourceLocation templateLocation, StructurePlaceSettings placeSettings, BlockPos startPosition, int width) { + super(TFStructurePieceTypes.CENTRAL_TO_SIDE_TOWER.get(), 0, structureManager, templateLocation, placeSettings, startPosition); + this.width = width; + } + + public static SideTowerCover smallCover(StructureTemplateManager structureManager, Rotation rotation, BlockPos startPosition, RandomSource random) { + return new SideTowerCover(structureManager, rotation, "small/" + Util.getRandom(SMALL_COVERS, random), startPosition, 5); + } + + public static SideTowerCover mediumCover(StructureTemplateManager structureManager, Rotation rotation, BlockPos startPosition, RandomSource random) { + return new SideTowerCover(structureManager, rotation, "medium/" + Util.getRandom(MEDIUM_COVERS, random), startPosition, 7); + } + + public static SideTowerCover largeCover(StructureTemplateManager structureManager, Rotation rotation, BlockPos startPosition, RandomSource random) { + return new SideTowerCover(structureManager, rotation, "large/" + Util.getRandom(LARGE_COVERS, random), startPosition, 9); + } + + @Override + protected void handleDataMarker(String pFunction, BlockPos pPos, ServerLevelAccessor pLevel, RandomSource pRandom, BoundingBox pSbb) { + + } + + @Override + protected void addAdditionalSaveData(StructurePieceSerializationContext ctx, CompoundTag structureTag) { + super.addAdditionalSaveData(ctx, structureTag); + + structureTag.putInt("width", this.width); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/lichtowerrevamp/SideTowerRoom.java b/src/main/java/twilightforest/world/components/structures/lichtowerrevamp/SideTowerRoom.java new file mode 100644 index 0000000000..0168203af2 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/lichtowerrevamp/SideTowerRoom.java @@ -0,0 +1,141 @@ +package twilightforest.world.components.structures.lichtowerrevamp; + +import com.google.common.collect.ImmutableList; +import net.minecraft.Util; +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ServerLevelAccessor; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplateManager; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructurePlaceSettings; +import twilightforest.TwilightForestMod; +import twilightforest.util.ArrayUtil; +import twilightforest.world.components.structures.TwilightTemplateStructurePiece; +import twilightforest.init.TFStructurePieceTypes; + +import java.util.EnumMap; +import java.util.List; + + +public final class SideTowerRoom extends TwilightTemplateStructurePiece { + // TODO make more advanced, assign sided configurations of what covers can be used (walls/windows/bridges) + private static final List SMALL_ROOMS = ImmutableList.of( + "empty_small", // Remove later + "library_steps_small" + ); + private static final List MEDIUM_ROOMS = ImmutableList.of( + "empty_medium", // Remove later + "stacked_library_elbow_medium" + ); + private static final List LARGE_ROOMS = ImmutableList.of( + "empty_large", // Remove later + "illegal_blockstate_kitchen", // Remove later + "library_plus_large" + ); + + private static final EnumMap OFFSETS = new EnumMap<>(Rotation.class); + static { + OFFSETS.put(Rotation.NONE, BlockPos.ZERO); + OFFSETS.put(Rotation.CLOCKWISE_90, new BlockPos(1, 0, 0)); + OFFSETS.put(Rotation.CLOCKWISE_180, new BlockPos(1, 0, 1)); + OFFSETS.put(Rotation.COUNTERCLOCKWISE_90, new BlockPos(0, 0, 1)); + } + + private final int squareDiameter; + private final Rotation externalRotation; + + public SideTowerRoom(StructurePieceSerializationContext ctx, CompoundTag compoundTag) { + super(TFStructurePieceTypes.SIDE_TOWER_ROOM.get(), compoundTag, ctx, readSettings(compoundTag)); + this.squareDiameter = compoundTag.getInt("square_diameter"); + this.externalRotation = ArrayUtil.wrapped(Rotation.values(), compoundTag.getInt("ext_rotation")); + } + + private SideTowerRoom(StructureTemplateManager structureManager, Rotation roomRotation, Rotation exteriorRotation, String name, BlockPos startPosition, int squareDiameter) { + this( + structureManager, + TwilightForestMod.prefix("lich_tower/side_tower_rooms/" + name), + makeSettings(roomRotation), + startPosition.offset(OFFSETS.get(roomRotation).multiply(squareDiameter - 1)).offset(OFFSETS.get(exteriorRotation).multiply(1 - squareDiameter)), + squareDiameter, + exteriorRotation + ); + } + + private SideTowerRoom(StructureTemplateManager structureManager, ResourceLocation templateLocation, StructurePlaceSettings placeSettings, BlockPos startPosition, int squareDiameter, Rotation externalRotation) { + super(TFStructurePieceTypes.SIDE_TOWER_ROOM.get(), 0, structureManager, templateLocation, placeSettings, startPosition); + this.squareDiameter = squareDiameter; + this.externalRotation = externalRotation; + } + + public static SideTowerRoom smallRoom(StructureTemplateManager structureManager, Rotation exteriorRotation, BlockPos startPosition, RandomSource random) { + return new SideTowerRoom(structureManager, Rotation.getRandom(random), exteriorRotation, "small/" + Util.getRandom(SMALL_ROOMS, random), startPosition, 5); + } + + public static SideTowerRoom mediumRoom(StructureTemplateManager structureManager, Rotation exteriorRotation, BlockPos startPosition, RandomSource random) { + return new SideTowerRoom(structureManager, Rotation.getRandom(random), exteriorRotation, "medium/" + Util.getRandom(MEDIUM_ROOMS, random), startPosition, 7); + } + + public static SideTowerRoom largeRoom(StructureTemplateManager structureManager, Rotation exteriorRotation, BlockPos startPosition, RandomSource random) { + return new SideTowerRoom(structureManager, Rotation.getRandom(random), exteriorRotation, "large/" + Util.getRandom(LARGE_ROOMS, random), startPosition, 9); + } + + @Override + public void addChildren(StructurePiece parent, StructurePieceAccessor structureStart, RandomSource random) { + super.addChildren(parent, structureStart, random); + + BlockPos center = this.boundingBox.getCenter(); + BlockPos offset = new BlockPos(-(this.squareDiameter - 1 >> 1), -4, (this.squareDiameter - 1 >> 1) + 1); + + this.placeCover(structureStart, center, offset, random, Rotation.COUNTERCLOCKWISE_90); + this.placeCover(structureStart, center, offset, random, Rotation.NONE); + this.placeCover(structureStart, center, offset, random, Rotation.CLOCKWISE_90); + } + + private void placeCover(StructurePieceAccessor structureStart, BlockPos center, BlockPos offset, RandomSource random, Rotation rotation) { + Rotation relativeRotation = this.externalRotation.getRotated(rotation); + + BlockPos pos = center.offset(offset.rotate(relativeRotation)); + + switch (this.squareDiameter) { + case 9 -> { + SideTowerCover largeCover = SideTowerCover.largeCover(this.structureManager, relativeRotation, pos, random); + largeCover.addChildren(this, structureStart, random); + structureStart.addPiece(largeCover); + } + case 7 -> { + SideTowerCover mediumCover = SideTowerCover.mediumCover(this.structureManager, relativeRotation, pos, random); + mediumCover.addChildren(this, structureStart, random); + structureStart.addPiece(mediumCover); + } + case 5 -> { + SideTowerCover smallCover = SideTowerCover.smallCover(this.structureManager, relativeRotation, pos, random); + smallCover.addChildren(this, structureStart, random); + structureStart.addPiece(smallCover); + } + } + } + + @Override + protected void handleDataMarker(String label, BlockPos pPos, ServerLevelAccessor pLevel, RandomSource pRandom, BoundingBox pSbb) { + // TODO spawner + // TODO candle + // random: regular or skull + // _n / _nw / _w / _sw / _s / _se / _e / _ne + // random +1 or -1 increment of rotation + // TODO chest + } + + @Override + protected void addAdditionalSaveData(StructurePieceSerializationContext ctx, CompoundTag structureTag) { + super.addAdditionalSaveData(ctx, structureTag); + + structureTag.putInt("square_diameter", this.squareDiameter); + structureTag.putInt("ext_rotation", this.externalRotation.ordinal()); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/lichtowerrevamp/TowerFoyer.java b/src/main/java/twilightforest/world/components/structures/lichtowerrevamp/TowerFoyer.java new file mode 100644 index 0000000000..4d1664e480 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/lichtowerrevamp/TowerFoyer.java @@ -0,0 +1,129 @@ +package twilightforest.world.components.structures.lichtowerrevamp; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.util.RandomSource; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.decoration.ArmorStand; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.ServerLevelAccessor; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Mirror; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplateManager; +import twilightforest.TwilightForestMod; +import twilightforest.world.components.processors.BoxCuttingProcessor; +import twilightforest.world.components.structures.TwilightTemplateStructurePiece; +import twilightforest.init.TFStructurePieceTypes; + +import java.util.HashMap; +import java.util.Map; + + +public final class TowerFoyer extends TwilightTemplateStructurePiece { + public TowerFoyer(StructurePieceSerializationContext ctx, CompoundTag compoundTag) { + super(TFStructurePieceTypes.TOWER_FOYER.get(), compoundTag, ctx, readSettings(compoundTag)); + } + + public TowerFoyer(StructureTemplateManager structureManager, BlockPos startPosition) { + super(TFStructurePieceTypes.TOWER_FOYER.get(), 0, structureManager, TwilightForestMod.prefix("lich_tower/foyer"), makeSettings(Rotation.NONE), startPosition.above(3)); + } + + @Override + public void addChildren(StructurePiece parent, StructurePieceAccessor structureStart, RandomSource random) { + super.addChildren(parent, structureStart, random); + + int randomCountTowerSegments = random.nextInt(5) + 15; + Direction front = this.rotation.rotate(Direction.NORTH); + + BlockPos center = this.boundingBox.getCenter(); + BlockPos centralTowerOrigin = new BlockPos(center.getX() - (CentralTowerSegment.SIDE_LENGTH >> 1), this.boundingBox.maxY() - 30, center.getZ() - (CentralTowerSegment.SIDE_LENGTH >> 1)); + + // TODO Add custom processors for chopping holes into the Segments + // The sides of the segments are completely available for adding attachments + // The fronts and backs will need to wait until halfway upwards + + Map sideTowerStarts = new HashMap<>(); + int totalSegments = (randomCountTowerSegments >> 1) - 2; + + this.beginSideTowers(structureStart, random, totalSegments, 0, front, Rotation.CLOCKWISE_90, centralTowerOrigin, sideTowerStarts); + this.beginSideTowers(structureStart, random, totalSegments, 0, front, Rotation.COUNTERCLOCKWISE_90, centralTowerOrigin, sideTowerStarts); + + this.beginSideTowers(structureStart, random, totalSegments, 7, front, Rotation.NONE, centralTowerOrigin, sideTowerStarts); + this.beginSideTowers(structureStart, random, totalSegments, 7, front, Rotation.CLOCKWISE_180, centralTowerOrigin, sideTowerStarts); + + BoxCuttingProcessor cuttingProcessor = BoxCuttingProcessor.forLichTower(sideTowerStarts); + Rotation climbingRotation = this.rotation; + + for (int i = 0; i < randomCountTowerSegments; i++) { + CentralTowerSegment towerSegment = new CentralTowerSegment(this.structureManager, climbingRotation, cuttingProcessor, StructureTemplate.getZeroPositionWithTransform(centralTowerOrigin, Mirror.NONE, climbingRotation, CentralTowerSegment.SIDE_LENGTH, CentralTowerSegment.SIDE_LENGTH).above(i * 4)); + towerSegment.addChildren(this, structureStart, random); + structureStart.addPiece(towerSegment); + + // Prime for next placement + climbingRotation = climbingRotation.getRotated(this.mirror == Mirror.NONE ? Rotation.COUNTERCLOCKWISE_90 : Rotation.CLOCKWISE_90); + } + } + + private void beginSideTowers(StructurePieceAccessor structureStart, RandomSource random, int totalSegments, int segmentStart, Direction front, Rotation fromFront, BlockPos centralTowerOrigin, Map sideTowerStarts) { + // Pre-process for the side-towers to attach to the sides of the central + for (int i = segmentStart; i < totalSegments; i++) { + float weight = (float) i / totalSegments * 2; + if (random.nextFloat() < weight) { + Rotation relativeRotation = fromFront.getRotated(this.rotation); + Direction sideTowerDirection = relativeRotation.rotate(front); + + BlockPos sideTowerPos = LichTowerUtil.getRandomOpeningPlacementPos(centralTowerOrigin, + sideTowerDirection, + Mirror.NONE, + random, + i << 1, + this.rotation == Rotation.NONE || this.rotation == Rotation.CLOCKWISE_180 + ); + + // TODO if you're looking at this code because of placement oddity, be mindful this starts at the + // bottom right corner of the entrance, from the perspective of standing inside the central staircase + sideTowerStarts.put(sideTowerPos.relative(sideTowerDirection), sideTowerDirection); + + CentralTowerAttachment sideTower = CentralTowerAttachment.startRandomAttachment(this.structureManager, relativeRotation, sideTowerPos.relative(sideTowerDirection, 2), random); + sideTower.addChildren(this, structureStart, random); + structureStart.addPiece(sideTower); + } + } + } + + @Override + public void postProcess(WorldGenLevel level, StructureManager structureFeatureManager, ChunkGenerator chunkGenerator, RandomSource random, BoundingBox boundingBox, ChunkPos chunkPos, BlockPos pos) { + this.placePieceAdjusted(level, structureFeatureManager, chunkGenerator, random, boundingBox, chunkPos, pos, -3); + + BlockPos placement = new BlockPos(this.boundingBox.getCenter().getX() + 1, this.boundingBox.minY() + 7, this.boundingBox.minZ() + 16); + + if (boundingBox.isInside(placement)) { + final ArmorStand armorStand = new ArmorStand(EntityType.ARMOR_STAND, level.getLevel()); + armorStand.setCustomName(Component.literal("Welcome to the new Lich Tower! The design is heavily WIP and will be fleshed out significantly in later development builds")); + armorStand.moveTo(placement.getX(), placement.getY() + 0.5, placement.getZ() + 0.5, 0, 0); + armorStand.setInvulnerable(true); + armorStand.setInvisible(true); + armorStand.setCustomNameVisible(true); + armorStand.setSilent(true); + armorStand.setNoGravity(true); + // set marker flag + armorStand.getEntityData().set(ArmorStand.DATA_CLIENT_FLAGS, (byte) (armorStand.getEntityData().get(ArmorStand.DATA_CLIENT_FLAGS) | 16)); + level.addFreshEntity(armorStand); + } + } + + @Override + protected void handleDataMarker(String label, BlockPos pos, ServerLevelAccessor levelAccessor, RandomSource random, BoundingBox boundingBox) { + + } +} diff --git a/src/main/java/twilightforest/world/components/structures/lichtowerrevamp/package-info.java b/src/main/java/twilightforest/world/components/structures/lichtowerrevamp/package-info.java new file mode 100644 index 0000000000..8a3df407b4 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/lichtowerrevamp/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.world.components.structures.lichtowerrevamp; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/world/components/structures/minotaurmaze/MazeCorridorComponent.java b/src/main/java/twilightforest/world/components/structures/minotaurmaze/MazeCorridorComponent.java new file mode 100644 index 0000000000..2982c84474 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/minotaurmaze/MazeCorridorComponent.java @@ -0,0 +1,41 @@ +package twilightforest.world.components.structures.minotaurmaze; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; +import twilightforest.init.TFStructurePieceTypes; +import twilightforest.world.components.structures.TFStructureComponentOld; + + +public class MazeCorridorComponent extends TFStructureComponentOld { + + public MazeCorridorComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + this(TFStructurePieceTypes.TFMMC.get(), nbt); + } + + public MazeCorridorComponent(StructurePieceType piece, CompoundTag nbt) { + super(piece, nbt); + } + + public MazeCorridorComponent(StructurePieceType type, int i, int x, int y, int z, Direction rotation) { + super(type, i, x, y, z); + this.setOrientation(rotation); + this.boundingBox = new BoundingBox(x, y, z, x + 5, y + 5, z + 5); + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + //arch + this.generateBox(world, sbb, 1, 1, 2, 4, 4, 3, Blocks.OAK_FENCE.defaultBlockState(), AIR, false); + this.generateAirBox(world, sbb, 2, 1, 2, 3, 3, 3); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/minotaurmaze/MazeCorridorIronFenceComponent.java b/src/main/java/twilightforest/world/components/structures/minotaurmaze/MazeCorridorIronFenceComponent.java new file mode 100644 index 0000000000..ee5327bf2a --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/minotaurmaze/MazeCorridorIronFenceComponent.java @@ -0,0 +1,34 @@ +package twilightforest.world.components.structures.minotaurmaze; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFStructurePieceTypes; + + +public class MazeCorridorIronFenceComponent extends MazeCorridorComponent { + + public MazeCorridorIronFenceComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFMMCIF.get(), nbt); + } + + public MazeCorridorIronFenceComponent(int i, int x, int y, int z, Direction rotation) { + super(TFStructurePieceTypes.TFMMCIF.get(), i, x, y, z, rotation); + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + this.generateBox(world, sbb, 1, 4, 2, 4, 4, 3, TFBlocks.DECORATIVE_MAZESTONE.get().defaultBlockState(), AIR, false); + this.generateBox(world, sbb, 1, 1, 2, 4, 3, 3, TFBlocks.CUT_MAZESTONE.get().defaultBlockState(), AIR, false); + this.generateBox(world, sbb, 2, 1, 2, 3, 3, 3, Blocks.IRON_BARS.defaultBlockState(), Blocks.AIR.defaultBlockState(), false); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/minotaurmaze/MazeCorridorRootsComponent.java b/src/main/java/twilightforest/world/components/structures/minotaurmaze/MazeCorridorRootsComponent.java new file mode 100644 index 0000000000..96e31f8abd --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/minotaurmaze/MazeCorridorRootsComponent.java @@ -0,0 +1,56 @@ +package twilightforest.world.components.structures.minotaurmaze; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFStructurePieceTypes; + + +public class MazeCorridorRootsComponent extends MazeCorridorComponent { + + public MazeCorridorRootsComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFMMCR.get(), nbt); + } + + public MazeCorridorRootsComponent(int i, int x, int y, int z, Direction rotation) { + super(TFStructurePieceTypes.TFMMCR.get(), i, x, y, z, rotation); + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + for (int x = 1; x < 5; x++) { + for (int z = 0; z < 5; z++) { + int freq = x; + if (rand.nextInt(freq + 2) > 0) { + int length = rand.nextInt(6); + + //place dirt above ceiling + this.placeBlock(world, Blocks.DIRT.defaultBlockState(), x, 6, z, sbb); + + // roots + for (int y = 6 - length; y < 6; y++) { + this.placeBlock(world, TFBlocks.ROOT_STRAND.get().defaultBlockState(), x, y, z, sbb); + } + + // occasional gravel + if (rand.nextInt(freq + 1) > 1) { + this.placeBlock(world, Blocks.GRAVEL.defaultBlockState(), x, 1, z, sbb); + + if (rand.nextInt(freq + 1) > 1) { + this.placeBlock(world, Blocks.GRAVEL.defaultBlockState(), x, 2, z, sbb); + } + } + } + } + } + } +} diff --git a/src/main/java/twilightforest/world/components/structures/minotaurmaze/MazeCorridorShroomsComponent.java b/src/main/java/twilightforest/world/components/structures/minotaurmaze/MazeCorridorShroomsComponent.java new file mode 100644 index 0000000000..f436bda689 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/minotaurmaze/MazeCorridorShroomsComponent.java @@ -0,0 +1,62 @@ +package twilightforest.world.components.structures.minotaurmaze; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.HugeMushroomBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFStructurePieceTypes; + + +public class MazeCorridorShroomsComponent extends MazeCorridorComponent { + + public MazeCorridorShroomsComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFMMCS.get(), nbt); + } + + public MazeCorridorShroomsComponent(int i, int x, int y, int z, Direction rotation) { + super(TFStructurePieceTypes.TFMMCS.get(), i, x, y, z, rotation); + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + + // mycelium & mushrooms + for (int x = 1; x < 5; x++) { + for (int z = 0; z < 5; z++) { + if (rand.nextInt(2) > 0) { + this.placeBlock(world, Blocks.MYCELIUM.defaultBlockState(), x, 0, z, sbb); + } + if (rand.nextInt(2) > 0) { + this.placeBlock(world, rand.nextBoolean() ? Blocks.RED_MUSHROOM.defaultBlockState() : Blocks.BROWN_MUSHROOM.defaultBlockState(), x, 1, z, sbb); + } + } + } + + // brackets? + //TODO: Flatten, or at least, be more accurate to current implementation + boolean mushFlag = rand.nextBoolean(); + BlockState mushType = (mushFlag ? Blocks.RED_MUSHROOM_BLOCK : Blocks.BROWN_MUSHROOM_BLOCK).defaultBlockState(); + BlockState fullStem = Blocks.MUSHROOM_STEM.defaultBlockState(); + BlockState stem = fullStem.setValue(HugeMushroomBlock.UP, false).setValue(HugeMushroomBlock.DOWN, false); + int mushY = rand.nextInt(4) + 1; + int mushZ = rand.nextInt(4) + 1; + this.placeBlock(world, fullStem, 1, mushY - 1, mushZ, sbb); + this.generateBox(world, sbb, 1, 1, mushZ, 1, mushY, mushZ, stem, AIR, false); + this.generateBox(world, sbb, 1, mushY, mushZ - 1, 2, mushY, mushZ + 1, mushType, AIR, false); + + mushType = (mushFlag ? Blocks.BROWN_MUSHROOM_BLOCK : Blocks.RED_MUSHROOM_BLOCK).defaultBlockState(); + mushY = rand.nextInt(4) + 1; + mushZ = rand.nextInt(4) + 1; + this.generateBox(world, sbb, 4, 1, mushZ, 4, mushY, mushZ, stem, AIR, false); + this.generateBox(world, sbb, 3, mushY, mushZ - 1, 4, mushY, mushZ + 1, mushType, AIR, false); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/minotaurmaze/MazeDeadEndChestComponent.java b/src/main/java/twilightforest/world/components/structures/minotaurmaze/MazeDeadEndChestComponent.java new file mode 100644 index 0000000000..111ef3d394 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/minotaurmaze/MazeDeadEndChestComponent.java @@ -0,0 +1,60 @@ +package twilightforest.world.components.structures.minotaurmaze; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFStructurePieceTypes; +import twilightforest.loot.TFLootTables; + + +public class MazeDeadEndChestComponent extends MazeDeadEndComponent { + + public MazeDeadEndChestComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + this(TFStructurePieceTypes.TFMMDEC.get(), nbt); + } + + public MazeDeadEndChestComponent(StructurePieceType piece, CompoundTag nbt) { + super(piece, nbt); + } + + public MazeDeadEndChestComponent(StructurePieceType type, int i, int x, int y, int z, Direction rotation) { + super(type, i, x, y, z, rotation); + this.setOrientation(rotation); + + // specify a non-existant high spawn list value to stop actual monster spawns + this.spawnListIndex = Integer.MAX_VALUE; + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + //super.addComponentParts(world, rand, sbb, chunkPosIn); + + // dais + this.placeBlock(world, Blocks.OAK_PLANKS.defaultBlockState(), 2, 1, 4, sbb); + this.placeBlock(world, Blocks.OAK_PLANKS.defaultBlockState(), 3, 1, 4, sbb); + this.placeBlock(world, getStairState(Blocks.OAK_STAIRS.defaultBlockState(), Direction.NORTH, false), 2, 1, 3, sbb); + this.placeBlock(world, getStairState(Blocks.OAK_STAIRS.defaultBlockState(), Direction.NORTH, false), 3, 1, 3, sbb); + + // chest + this.setDoubleLootChest(world, 2, 2, 4, 3, 2, 4, Direction.SOUTH, TFLootTables.LABYRINTH_DEAD_END, sbb, false); + +// // torches +// this.setBlockState(world, Blocks.TORCH, 0, 1, 3, 4, sbb); +// this.setBlockState(world, Blocks.TORCH, 0, 4, 3, 4, sbb); + + // doorway w/ bars + this.generateBox(world, sbb, 1, 1, 0, 4, 3, 1, TFBlocks.CUT_MAZESTONE.get().defaultBlockState(), AIR, false); + this.generateBox(world, sbb, 1, 4, 0, 4, 4, 1, TFBlocks.DECORATIVE_MAZESTONE.get().defaultBlockState(), AIR, false); + this.generateBox(world, sbb, 2, 1, 0, 3, 3, 1, Blocks.IRON_BARS.defaultBlockState(), AIR, false); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/minotaurmaze/MazeDeadEndComponent.java b/src/main/java/twilightforest/world/components/structures/minotaurmaze/MazeDeadEndComponent.java new file mode 100644 index 0000000000..cd9b1a3254 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/minotaurmaze/MazeDeadEndComponent.java @@ -0,0 +1,40 @@ +package twilightforest.world.components.structures.minotaurmaze; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; +import twilightforest.init.TFStructurePieceTypes; +import twilightforest.world.components.structures.TFStructureComponentOld; + + +public class MazeDeadEndComponent extends TFStructureComponentOld { + + public MazeDeadEndComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + this(TFStructurePieceTypes.TFMMDE.get(), nbt); + } + + public MazeDeadEndComponent(StructurePieceType piece, CompoundTag nbt) { + super(piece, nbt); + } + + public MazeDeadEndComponent(StructurePieceType type, int i, int x, int y, int z, Direction rotation) { + super(type, i, x, y, z); + this.setOrientation(rotation); + this.boundingBox = new BoundingBox(x, y, z, x + 5, y + 5, z + 5); + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + this.generateBox(world, sbb, 1, 1, 0, 4, 4, 0, Blocks.OAK_FENCE.defaultBlockState(), AIR, false); + this.generateAirBox(world, sbb, 2, 1, 0, 3, 3, 0); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/minotaurmaze/MazeDeadEndFountainComponent.java b/src/main/java/twilightforest/world/components/structures/minotaurmaze/MazeDeadEndFountainComponent.java new file mode 100644 index 0000000000..8c2d7d64a8 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/minotaurmaze/MazeDeadEndFountainComponent.java @@ -0,0 +1,49 @@ +package twilightforest.world.components.structures.minotaurmaze; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFStructurePieceTypes; + + +public class MazeDeadEndFountainComponent extends MazeDeadEndComponent { + + public MazeDeadEndFountainComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + this(TFStructurePieceTypes.TFMMDEF.get(), nbt); + } + + public MazeDeadEndFountainComponent(StructurePieceType piece, CompoundTag nbt) { + super(piece, nbt); + } + + public MazeDeadEndFountainComponent(StructurePieceType type, int i, int x, int y, int z, Direction rotation) { + super(type, i, x, y, z, rotation); + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + // normal doorway + super.postProcess(world, manager, generator, rand, sbb, chunkPosIn, blockPos); + + // back wall brick + this.generateBox(world, sbb, 1, 1, 4, 4, 4, 4, TFBlocks.MAZESTONE_BRICK.get().defaultBlockState(), AIR, false); + + // water + this.placeBlock(world, Blocks.WATER.defaultBlockState(), 2, 3, 4, sbb); + this.placeBlock(world, Blocks.WATER.defaultBlockState(), 3, 3, 4, sbb); + + // receptacle + this.placeBlock(world, AIR, 2, 0, 3, sbb); + this.placeBlock(world, AIR, 3, 0, 3, sbb); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/minotaurmaze/MazeDeadEndFountainLavaComponent.java b/src/main/java/twilightforest/world/components/structures/minotaurmaze/MazeDeadEndFountainLavaComponent.java new file mode 100644 index 0000000000..de9e4abce1 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/minotaurmaze/MazeDeadEndFountainLavaComponent.java @@ -0,0 +1,40 @@ +package twilightforest.world.components.structures.minotaurmaze; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFStructurePieceTypes; + + +public class MazeDeadEndFountainLavaComponent extends MazeDeadEndFountainComponent { + + public MazeDeadEndFountainLavaComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFMMDEFL.get(), nbt); + } + + public MazeDeadEndFountainLavaComponent(int i, int x, int y, int z, Direction rotation) { + super(TFStructurePieceTypes.TFMMDEFL.get(), i, x, y, z, rotation); + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + // normal fountain + super.postProcess(world, manager, generator, rand, sbb, chunkPosIn, blockPos); + + // remove water + this.placeBlock(world, AIR, 2, 3, 4, sbb); + this.placeBlock(world, AIR, 3, 3, 4, sbb); + + // lava instead of water + this.placeBlock(world, Blocks.LAVA.defaultBlockState(), 2, 3, 4, sbb); + this.placeBlock(world, Blocks.LAVA.defaultBlockState(), 3, 3, 4, sbb); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/minotaurmaze/MazeDeadEndPaintingComponent.java b/src/main/java/twilightforest/world/components/structures/minotaurmaze/MazeDeadEndPaintingComponent.java new file mode 100644 index 0000000000..c5bb046111 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/minotaurmaze/MazeDeadEndPaintingComponent.java @@ -0,0 +1,44 @@ +package twilightforest.world.components.structures.minotaurmaze; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.WallTorchBlock; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFStructurePieceTypes; + + +public class MazeDeadEndPaintingComponent extends MazeDeadEndComponent { + + public MazeDeadEndPaintingComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFMMDEP.get(), nbt); + } + + public MazeDeadEndPaintingComponent(int i, int x, int y, int z, Direction rotation) { + super(TFStructurePieceTypes.TFMMDEP.get(), i, x, y, z, rotation); + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + // normal doorway + super.postProcess(world, manager, generator, rand, sbb, chunkPosIn, blockPos); + + // torches + this.placeBlock(world, Blocks.WALL_TORCH.defaultBlockState().setValue(WallTorchBlock.FACING, Direction.WEST), 1, 3, 3, sbb); + this.placeBlock(world, Blocks.WALL_TORCH.defaultBlockState().setValue(WallTorchBlock.FACING, Direction.EAST), 4, 3, 3, sbb); + +// // painting +// EntityPainting painting = new EntityPainting(world, pCoords.posX, pCoords.posY, pCoords.posZ, this.get); +// painting.art = getPaintingOfSize(rand, minSize); +// painting.setDirection(direction); +// +// world.addEntity(painting); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/minotaurmaze/MazeDeadEndRootsComponent.java b/src/main/java/twilightforest/world/components/structures/minotaurmaze/MazeDeadEndRootsComponent.java new file mode 100644 index 0000000000..4efd94e468 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/minotaurmaze/MazeDeadEndRootsComponent.java @@ -0,0 +1,63 @@ +package twilightforest.world.components.structures.minotaurmaze; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFStructurePieceTypes; + + +public class MazeDeadEndRootsComponent extends MazeDeadEndComponent { + + public MazeDeadEndRootsComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + this(TFStructurePieceTypes.TFMMDER.get(), nbt); + } + + public MazeDeadEndRootsComponent(StructurePieceType piece, CompoundTag nbt) { + super(piece, nbt); + } + + public MazeDeadEndRootsComponent(StructurePieceType type, int i, int x, int y, int z, Direction rotation) { + super(type, i, x, y, z, rotation); + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + // no door + for (int x = 1; x < 5; x++) { + for (int z = 0; z < 5; z++) { + // as we go +z, there are more vines + if (rand.nextInt(z + 2) > 0) { + int length = rand.nextInt(6); + + //place dirt above ceiling + this.placeBlock(world, Blocks.DIRT.defaultBlockState(), x, 6, z, sbb); + + // roots + for (int y = 6 - length; y < 6; y++) { + this.placeBlock(world, TFBlocks.ROOT_STRAND.get().defaultBlockState(), x, y, z, sbb); + } + + // occasional gravel + if (rand.nextInt(z + 1) > 1) { + this.placeBlock(world, Blocks.GRAVEL.defaultBlockState(), x, 1, z, sbb); + + if (rand.nextInt(z + 1) > 1) { + this.placeBlock(world, Blocks.GRAVEL.defaultBlockState(), x, 2, z, sbb); + } + } + } + } + } + } +} + diff --git a/src/main/java/twilightforest/world/components/structures/minotaurmaze/MazeDeadEndShroomsComponent.java b/src/main/java/twilightforest/world/components/structures/minotaurmaze/MazeDeadEndShroomsComponent.java new file mode 100644 index 0000000000..431ea6de8d --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/minotaurmaze/MazeDeadEndShroomsComponent.java @@ -0,0 +1,68 @@ +package twilightforest.world.components.structures.minotaurmaze; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.HugeMushroomBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFStructurePieceTypes; + + +public class MazeDeadEndShroomsComponent extends MazeDeadEndRootsComponent { + + public MazeDeadEndShroomsComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFMMDES.get(), nbt); + } + + public MazeDeadEndShroomsComponent(int i, int x, int y, int z, Direction rotation) { + super(TFStructurePieceTypes.TFMMDES.get(), i, x, y, z, rotation); + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + // no door + + // mycelium & mushrooms going back + for (int x = 1; x < 5; x++) { + for (int z = 0; z < 5; z++) { + if (rand.nextInt(z + 2) > 0) { + this.placeBlock(world, Blocks.MYCELIUM.defaultBlockState(), x, 0, z, sbb); + } + if (rand.nextInt(z + 2) > 0) { + this.placeBlock(world, rand.nextBoolean() ? Blocks.RED_MUSHROOM.defaultBlockState() : Blocks.BROWN_MUSHROOM.defaultBlockState(), x, 1, z, sbb); + } + } + } + + // brackets? + boolean mushFlag = rand.nextBoolean(); + BlockState mushType = (mushFlag ? Blocks.RED_MUSHROOM_BLOCK : Blocks.BROWN_MUSHROOM_BLOCK).defaultBlockState(); + BlockState fullStem = Blocks.MUSHROOM_STEM.defaultBlockState(); + BlockState stem = fullStem.setValue(HugeMushroomBlock.UP, false).setValue(HugeMushroomBlock.DOWN, false); + int mushY = rand.nextInt(4) + 1; + int mushZ = rand.nextInt(3) + 1; + this.placeBlock(world, fullStem, 1, mushY - 1, mushZ, sbb); + this.generateBox(world, sbb, 1, 1, mushZ, 1, mushY, mushZ, stem, AIR, false); + this.generateBox(world, sbb, 1, mushY, mushZ - 1, 2, mushY, mushZ + 1, mushType, AIR, false); + + mushType = (mushFlag ? Blocks.BROWN_MUSHROOM_BLOCK : Blocks.RED_MUSHROOM_BLOCK).defaultBlockState(); + mushY = rand.nextInt(4) + 1; + mushZ = rand.nextInt(3) + 1; + this.generateBox(world, sbb, 4, 1, mushZ, 4, mushY, mushZ, stem, AIR, false); + this.generateBox(world, sbb, 3, mushY, mushZ - 1, 4, mushY, mushZ + 1, mushType, AIR, false); + + mushType = (rand.nextBoolean() ? Blocks.RED_MUSHROOM_BLOCK : Blocks.BROWN_MUSHROOM_BLOCK).defaultBlockState(); + mushY = rand.nextInt(4) + 1; + int mushX = rand.nextInt(3) + 2; + this.generateBox(world, sbb, mushX, 1, 4, mushX, mushY, 4, stem, AIR, false); + this.generateBox(world, sbb, mushX - 1, mushY, 3, mushX + 1, mushY, 4, mushType, AIR, false); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/minotaurmaze/MazeDeadEndTorchesComponent.java b/src/main/java/twilightforest/world/components/structures/minotaurmaze/MazeDeadEndTorchesComponent.java new file mode 100644 index 0000000000..6583b5badc --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/minotaurmaze/MazeDeadEndTorchesComponent.java @@ -0,0 +1,38 @@ +package twilightforest.world.components.structures.minotaurmaze; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.WallTorchBlock; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFStructurePieceTypes; + + +public class MazeDeadEndTorchesComponent extends MazeDeadEndComponent { + + public MazeDeadEndTorchesComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFMMDET.get(), nbt); + } + + public MazeDeadEndTorchesComponent(int i, int x, int y, int z, Direction rotation) { + super(TFStructurePieceTypes.TFMMDET.get(), i, x, y, z, rotation); + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + // normal doorway + super.postProcess(world, manager, generator, rand, sbb, chunkPosIn, blockPos); + + // torches! + this.generateBox(world, sbb, 2, 1, 4, 3, 4, 4, Blocks.WALL_TORCH.defaultBlockState().setValue(WallTorchBlock.FACING, Direction.SOUTH), AIR, false); + this.generateBox(world, sbb, 1, 1, 1, 1, 4, 4, Blocks.WALL_TORCH.defaultBlockState().setValue(WallTorchBlock.FACING, Direction.WEST), AIR, false); + this.generateBox(world, sbb, 4, 1, 1, 4, 4, 4, Blocks.WALL_TORCH.defaultBlockState().setValue(WallTorchBlock.FACING, Direction.EAST), AIR, false); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/minotaurmaze/MazeDeadEndTrappedChestComponent.java b/src/main/java/twilightforest/world/components/structures/minotaurmaze/MazeDeadEndTrappedChestComponent.java new file mode 100644 index 0000000000..c1b50a7175 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/minotaurmaze/MazeDeadEndTrappedChestComponent.java @@ -0,0 +1,63 @@ +package twilightforest.world.components.structures.minotaurmaze; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFStructurePieceTypes; +import twilightforest.loot.TFLootTables; + + +public class MazeDeadEndTrappedChestComponent extends MazeDeadEndComponent { + + public MazeDeadEndTrappedChestComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFMMDETrC.get(), nbt); + } + + public MazeDeadEndTrappedChestComponent(int i, int x, int y, int z, Direction rotation) { + super(TFStructurePieceTypes.TFMMDETrC.get(), i, x, y, z, rotation); + this.setOrientation(rotation); + + // specify a non-existant high spawn list value to stop actual monster spawns + this.spawnListIndex = Integer.MAX_VALUE; + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + //super.addComponentParts(world, rand, sbb, chunkPosIn); + + // dais + this.placeBlock(world, Blocks.OAK_PLANKS.defaultBlockState(), 2, 1, 4, sbb); + this.placeBlock(world, Blocks.OAK_PLANKS.defaultBlockState(), 3, 1, 4, sbb); + this.placeBlock(world, getStairState(Blocks.OAK_STAIRS.defaultBlockState(), Direction.NORTH, false), 2, 1, 3, sbb); + this.placeBlock(world, getStairState(Blocks.OAK_STAIRS.defaultBlockState(), Direction.NORTH, false), 3, 1, 3, sbb); + + // chest + this.setDoubleLootChest(world, 2, 2, 4,3, 2, 4, Direction.SOUTH, TFLootTables.LABYRINTH_DEAD_END, sbb, true); + +// // torches +// this.setBlockState(world, Blocks.TORCH, 0, 1, 3, 4, sbb); +// this.setBlockState(world, Blocks.TORCH, 0, 4, 3, 4, sbb); + + // doorway w/ bars + this.generateBox(world, sbb, 1, 1, 0, 4, 3, 1, TFBlocks.CUT_MAZESTONE.get().defaultBlockState(), AIR, false); + this.generateBox(world, sbb, 1, 4, 0, 4, 4, 1, TFBlocks.DECORATIVE_MAZESTONE.get().defaultBlockState(), AIR, false); + this.generateBox(world, sbb, 2, 1, 0, 3, 3, 1, Blocks.IRON_BARS.defaultBlockState(), AIR, false); + + // TNT! + BlockState tnt = Blocks.TNT.defaultBlockState(); + this.placeBlock(world, tnt, 2, 0, 3, sbb); + this.placeBlock(world, tnt, 3, 0, 3, sbb); + this.placeBlock(world, tnt, 2, 0, 4, sbb); + this.placeBlock(world, tnt, 3, 0, 4, sbb); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/minotaurmaze/MazeDeadEndTripwireChestComponent.java b/src/main/java/twilightforest/world/components/structures/minotaurmaze/MazeDeadEndTripwireChestComponent.java new file mode 100644 index 0000000000..c54f914700 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/minotaurmaze/MazeDeadEndTripwireChestComponent.java @@ -0,0 +1,50 @@ +package twilightforest.world.components.structures.minotaurmaze; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.TntBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFStructurePieceTypes; + + +public class MazeDeadEndTripwireChestComponent extends MazeDeadEndChestComponent { + + public MazeDeadEndTripwireChestComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFMMDETC.get(), nbt); + } + + public MazeDeadEndTripwireChestComponent(int i, int x, int y, int z, Direction rotation) { + super(TFStructurePieceTypes.TFMMDETC.get(), i, x, y, z, rotation); + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + // normal chest room + super.postProcess(world, manager, generator, rand, sbb, chunkPosIn, blockPos); + + // add tripwire + this.placeTripwire(world, 1, 1, 2, 3, Direction.EAST, sbb); + + // TNT! Since the trap requires tripwire, we'll make punching the tnt NOT the solution + BlockState tnt = Blocks.TNT.defaultBlockState().setValue(TntBlock.UNSTABLE, true); + this.placeBlock(world, tnt, 0, 0, 2, sbb); + + // Air blocks are required underneath to maximize TNT destruction of chest + this.placeBlock(world, AIR, 0, -1, 2, sbb); + this.placeBlock(world, AIR, 1, -1, 2, sbb); + + this.placeBlock(world, tnt, 2, 0, 4, sbb); + this.placeBlock(world, tnt, 3, 0, 4, sbb); + this.placeBlock(world, tnt, 2, 0, 3, sbb); + this.placeBlock(world, tnt, 3, 0, 3, sbb); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/minotaurmaze/MazeEntranceShaftComponent.java b/src/main/java/twilightforest/world/components/structures/minotaurmaze/MazeEntranceShaftComponent.java new file mode 100644 index 0000000000..3484ea0d62 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/minotaurmaze/MazeEntranceShaftComponent.java @@ -0,0 +1,49 @@ +package twilightforest.world.components.structures.minotaurmaze; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFStructurePieceTypes; +import twilightforest.world.components.structures.TFStructureComponentOld; +import twilightforest.world.registration.TFGenerationSettings; + + +public class MazeEntranceShaftComponent extends TFStructureComponentOld { + + public MazeEntranceShaftComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFMMES.get(), nbt); + } + + public MazeEntranceShaftComponent(int i, RandomSource rand, int x, int y, int z) { + super(TFStructurePieceTypes.TFMMES.get(), i, new BoundingBox(x, y, z, x + 6 - 1, y, z + 6 - 1).encapsulate(new BlockPos(x, TFGenerationSettings.SEALEVEL, z))); + this.setOrientation(Direction.Plane.HORIZONTAL.getRandomDirection(rand)); + } + + /** + * Initiates construction of the Structure Component picked, at the current Location of StructGen + */ + @Override + public void addChildren(StructurePiece structurecomponent, StructurePieceAccessor list, RandomSource random) { + // NO-OP + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + BlockPos.MutableBlockPos pos = chunkPosIn.getWorldPosition().mutable().setX(this.boundingBox.minX()).setZ(this.boundingBox.minZ()); + + this.boundingBox.encapsulate(pos.setY(generator.getSeaLevel() - 9)); + + this.generateBox(world, sbb, 0, 0, 0, 5, this.boundingBox.getYSpan(), 5, TFBlocks.MAZESTONE_BRICK.get().defaultBlockState(), AIR, true); + this.generateAirBox(world, sbb, 1, 0, 1, 4, this.boundingBox.getYSpan(), 4); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/minotaurmaze/MazeMoundComponent.java b/src/main/java/twilightforest/world/components/structures/minotaurmaze/MazeMoundComponent.java new file mode 100644 index 0000000000..521f96a516 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/minotaurmaze/MazeMoundComponent.java @@ -0,0 +1,92 @@ +package twilightforest.world.components.structures.minotaurmaze; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.Mth; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFStructurePieceTypes; +import twilightforest.world.components.structures.TFStructureComponentOld; + + +public class MazeMoundComponent extends TFStructureComponentOld { + + public MazeMoundComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFMMMound.get(), nbt); + } + + public static final int DIAMETER = 35; + private final int averageGroundLevel = Integer.MIN_VALUE; + + private MazeUpperEntranceComponent mazeAbove; + + public MazeMoundComponent(int i, RandomSource rand, int x, int y, int z) { + super(TFStructurePieceTypes.TFMMMound.get(), i, new BoundingBox(x, y, z, x + DIAMETER, y + 12, z + DIAMETER)); + this.setOrientation(Direction.Plane.HORIZONTAL.getRandomDirection(rand)); + } + + /** + * Initiates construction of the Structure Component picked, at the current Location of StructGen + */ + @Override + public void addChildren(StructurePiece structurecomponent, StructurePieceAccessor list, RandomSource random) { + super.addChildren(structurecomponent, list, random); + + // add aboveground maze entrance building + mazeAbove = new MazeUpperEntranceComponent(3, random, boundingBox.minX() + 10, boundingBox.minY(), boundingBox.minZ() + 10); + list.addPiece(mazeAbove); + mazeAbove.addChildren(this, list, random); + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + /*if (this.averageGroundLevel < generator.getMinY()) { + this.averageGroundLevel = this.getAverageGroundLevel(world, generator, sbb); + + if (this.averageGroundLevel < generator.getMinY()) { + return true; + } + + int offset = this.averageGroundLevel - this.boundingBox.maxY() + 8 - 1; + + this.boundingBox.move(0, offset, 0); + + if (this.mazeAbove != null) { + mazeAbove.getBoundingBox().encapsulate(blockPos.atY(offset)); + } + }*/ + + //this.fillWithBlocks(world, sbb, 0, 0, 0, 25, 8, 25, Blocks.DIRT, 0, false); + + for (int x = 0; x < DIAMETER; x++) { + for (int z = 0; z < DIAMETER; z++) { + int cx = x - DIAMETER / 2; + int cz = z - DIAMETER / 2; + + int dist = (int) Mth.sqrt(cx * cx + cz * cz); + int hheight = (int) (Mth.cos((float) dist / DIAMETER * Mth.PI) * (DIAMETER / 3)); + + // leave a hole in the middle + if (!(cx <= 2 && cx >= -1 && cz <= 2 && cz >= -1) && ((!(cx <= 2 && cx >= -1) && !(cz <= 2 && cz >= -1)) || hheight > 6)) { + this.placeBlock(world, Blocks.GRASS_BLOCK.defaultBlockState(), x, hheight, z, sbb); + + // only fill to the bottom when we're not in the entrances + if (!(cx <= 2 && cx >= -1) && !(cz <= 2 && cz >= -1)) { + this.placeBlock(world, Blocks.DIRT.defaultBlockState(), x, hheight - 1, z, sbb); + } else if (hheight > 6) { + this.generateBox(world, sbb, x, 6, z, x, hheight - 1, z, Blocks.DIRT.defaultBlockState(), AIR, false); + } + } + } + } + } +} diff --git a/src/main/java/twilightforest/world/components/structures/minotaurmaze/MazeMushRoomComponent.java b/src/main/java/twilightforest/world/components/structures/minotaurmaze/MazeMushRoomComponent.java new file mode 100644 index 0000000000..6433640e3b --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/minotaurmaze/MazeMushRoomComponent.java @@ -0,0 +1,109 @@ +package twilightforest.world.components.structures.minotaurmaze; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.HugeMushroomBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFStructurePieceTypes; +import twilightforest.util.HugeMushroomUtil; + + +public class MazeMushRoomComponent extends MazeRoomComponent { + + public MazeMushRoomComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFMMMR.get(), nbt); + } + + public MazeMushRoomComponent(int i, RandomSource rand, int x, int y, int z) { + super(TFStructurePieceTypes.TFMMMR.get(), i, rand, x, y, z); + + this.setOrientation(Direction.SOUTH); // let's just make this easy on us? + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + super.postProcess(world, manager, generator, rand, sbb, chunkPosIn, blockPos); + + for (int x = 1; x < 14; x++) { + for (int z = 1; z < 14; z++) { + // calculate distance from middle + int dist = (int) Math.round(7 / Math.sqrt((7.5 - x) * (7.5 - x) + (7.5 - z) * (7.5 - z))); + + // make part of the floor mycelium + if (rand.nextInt(dist + 1) > 0) { + this.placeBlock(world, Blocks.MYCELIUM.defaultBlockState(), x, 0, z, sbb); + } + // add small mushrooms all over + if (rand.nextInt(dist) > 0) { + this.placeBlock(world, (rand.nextBoolean() ? Blocks.RED_MUSHROOM : Blocks.BROWN_MUSHROOM).defaultBlockState(), x, 1, z, sbb); + } + } + } + + final BlockState redMushroomBlock = Blocks.RED_MUSHROOM_BLOCK.defaultBlockState(); + final BlockState brownMushroomBlock = Blocks.BROWN_MUSHROOM_BLOCK.defaultBlockState(); + final BlockState stemMushroomBlock = Blocks.MUSHROOM_STEM.defaultBlockState(); + + // add our medium mushrooms + + makeMediumMushroom(world, sbb, 5, 2, 9, redMushroomBlock); + makeMediumMushroom(world, sbb, 5, 3, 9, redMushroomBlock); + makeMediumMushroom(world, sbb, 9, 2, 5, redMushroomBlock); + makeMediumMushroom(world, sbb, 6, 3, 4, brownMushroomBlock); + makeMediumMushroom(world, sbb, 10, 1, 9, brownMushroomBlock); + + // bracket mushrooms on the wall + this.placeBlock(world, stemMushroomBlock, 1, 2, 1, sbb); + this.placeBlock(world, HugeMushroomUtil.getState(HugeMushroomUtil.HugeMushroomType.CENTER, redMushroomBlock), 1, 3, 1, sbb); + this.placeBlock(world, HugeMushroomUtil.getState(HugeMushroomUtil.HugeMushroomType.NORTH_WEST, redMushroomBlock), 2, 3, 1, sbb); + this.placeBlock(world, HugeMushroomUtil.getState(HugeMushroomUtil.HugeMushroomType.NORTH_WEST, redMushroomBlock), 1, 3, 2, sbb); + + this.placeBlock(world, stemMushroomBlock, 14, 3, 1, sbb); + this.placeBlock(world, HugeMushroomUtil.getState(HugeMushroomUtil.HugeMushroomType.CENTER, brownMushroomBlock), 14, 4, 1, sbb); + this.placeBlock(world, HugeMushroomUtil.getState(HugeMushroomUtil.HugeMushroomType.NORTH_EAST, brownMushroomBlock), 13, 4, 1, sbb); + this.placeBlock(world, HugeMushroomUtil.getState(HugeMushroomUtil.HugeMushroomType.NORTH_EAST, brownMushroomBlock), 14, 4, 2, sbb); + + this.placeBlock(world, stemMushroomBlock, 1, 1, 14, sbb); + this.placeBlock(world, HugeMushroomUtil.getState(HugeMushroomUtil.HugeMushroomType.CENTER, brownMushroomBlock), 1, 2, 14, sbb); + this.placeBlock(world, HugeMushroomUtil.getState(HugeMushroomUtil.HugeMushroomType.SOUTH_WEST, brownMushroomBlock), 2, 2, 14, sbb); + this.placeBlock(world, HugeMushroomUtil.getState(HugeMushroomUtil.HugeMushroomType.SOUTH_WEST, brownMushroomBlock), 1, 2, 13, sbb); + + this.placeBlock(world, HugeMushroomUtil.getState(HugeMushroomUtil.HugeMushroomType.CENTER, brownMushroomBlock), 14, 1, 14, sbb); + this.placeBlock(world, HugeMushroomUtil.getState(HugeMushroomUtil.HugeMushroomType.SOUTH_EAST, brownMushroomBlock), 13, 1, 14, sbb); + this.placeBlock(world, HugeMushroomUtil.getState(HugeMushroomUtil.HugeMushroomType.SOUTH_EAST, brownMushroomBlock), 14, 1, 13, sbb); + + // mushroom ceiling spots? + } + + /** + * Make a 3x3 square mushroom centered on the specified coords. + */ + private void makeMediumMushroom(WorldGenLevel world, BoundingBox sbb, int mx, int my, int mz, BlockState redMushroomBlock) { + final BlockState mushroomStem = Blocks.MUSHROOM_STEM.defaultBlockState().setValue(HugeMushroomBlock.DOWN, false).setValue(HugeMushroomBlock.UP, false); + + // cap + this.placeBlock(world, HugeMushroomUtil.getState(HugeMushroomUtil.HugeMushroomType.CENTER, redMushroomBlock), mx, my, mz, sbb); + this.placeBlock(world, HugeMushroomUtil.getState(HugeMushroomUtil.HugeMushroomType.WEST, redMushroomBlock), mx + 1, my, mz, sbb); + this.placeBlock(world, HugeMushroomUtil.getState(HugeMushroomUtil.HugeMushroomType.NORTH_WEST, redMushroomBlock), mx + 1, my, mz + 1, sbb); + this.placeBlock(world, HugeMushroomUtil.getState(HugeMushroomUtil.HugeMushroomType.NORTH, redMushroomBlock), mx, my, mz + 1, sbb); + this.placeBlock(world, HugeMushroomUtil.getState(HugeMushroomUtil.HugeMushroomType.NORTH_EAST, redMushroomBlock), mx - 1, my, mz + 1, sbb); + this.placeBlock(world, HugeMushroomUtil.getState(HugeMushroomUtil.HugeMushroomType.EAST, redMushroomBlock), mx - 1, my, mz, sbb); + this.placeBlock(world, HugeMushroomUtil.getState(HugeMushroomUtil.HugeMushroomType.SOUTH_EAST, redMushroomBlock), mx - 1, my, mz - 1, sbb); + this.placeBlock(world, HugeMushroomUtil.getState(HugeMushroomUtil.HugeMushroomType.SOUTH, redMushroomBlock), mx, my, mz - 1, sbb); + this.placeBlock(world, HugeMushroomUtil.getState(HugeMushroomUtil.HugeMushroomType.SOUTH_WEST, redMushroomBlock), mx + 1, my, mz - 1, sbb); + + // stem + for (int y = 1; y < my; y++) { + this.placeBlock(world, mushroomStem, mx, y, mz, sbb); + } + } +} diff --git a/src/main/java/twilightforest/world/components/structures/minotaurmaze/MazeRoomBossComponent.java b/src/main/java/twilightforest/world/components/structures/minotaurmaze/MazeRoomBossComponent.java new file mode 100644 index 0000000000..355dc85e53 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/minotaurmaze/MazeRoomBossComponent.java @@ -0,0 +1,108 @@ +package twilightforest.world.components.structures.minotaurmaze; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFStructurePieceTypes; +import twilightforest.loot.TFLootTables; + + +public class MazeRoomBossComponent extends MazeRoomComponent { + + public MazeRoomBossComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFMMRB.get(), nbt); + } + + public MazeRoomBossComponent(int i, RandomSource rand, int x, int y, int z) { + super(TFStructurePieceTypes.TFMMRB.get(), i, rand, x, y, z); + + //get the fuck outta here + this.spawnListIndex = Integer.MAX_VALUE; + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + // doorways + if (this.getBlock(world, 7, 1, 0, sbb).getBlock() == Blocks.AIR) { + generateBox(world, sbb, 6, 1, 0, 9, 4, 0, Blocks.OAK_FENCE.defaultBlockState(), AIR, false); + } + + if (this.getBlock(world, 7, 1, 15, sbb).getBlock() == Blocks.AIR) { + generateBox(world, sbb, 6, 1, 15, 9, 4, 15, Blocks.OAK_FENCE.defaultBlockState(), AIR, false); + } + + if (this.getBlock(world, 0, 1, 7, sbb).getBlock() == Blocks.AIR) { + generateBox(world, sbb, 0, 1, 6, 0, 4, 9, Blocks.OAK_FENCE.defaultBlockState(), AIR, false); + } + + if (this.getBlock(world, 15, 1, 7, sbb).getBlock() == Blocks.AIR) { + generateBox(world, sbb, 15, 1, 6, 15, 4, 9, Blocks.OAK_FENCE.defaultBlockState(), AIR, false); + } + + // mycelium / small mushrooms on floor + for (int x = 1; x < 14; x++) { + for (int z = 1; z < 14; z++) { + // calculate distance from middle + int dist = (int) Math.round(7 / Math.sqrt((7.5 - x) * (7.5 - x) + (7.5 - z) * (7.5 - z))); + boolean mycelium = rand.nextInt(dist + 1) > 0; + boolean mushroom = rand.nextInt(dist) > 0; + boolean mushRed = rand.nextBoolean(); + + // make part of the floor mycelium + if (mycelium) { + this.placeBlock(world, Blocks.MYCELIUM.defaultBlockState(), x, 0, z, sbb); + } + // add small mushrooms all over + if (mushroom) { + this.placeBlock(world, (mushRed ? Blocks.RED_MUSHROOM : Blocks.BROWN_MUSHROOM).defaultBlockState(), x, 1, z, sbb); + } + } + } + + // mushroom chest shelves in corner + final BlockState redMushroom = Blocks.RED_MUSHROOM_BLOCK.defaultBlockState(); + final BlockState brownMushroom = Blocks.BROWN_MUSHROOM_BLOCK.defaultBlockState(); + + generateBox(world, sbb, 1, 1, 1, 3, 1, 3, redMushroom, AIR, false); + generateBox(world, sbb, 1, 2, 1, 1, 3, 4, redMushroom, AIR, false); + generateBox(world, sbb, 2, 2, 1, 4, 3, 1, redMushroom, AIR, false); + generateBox(world, sbb, 1, 4, 1, 3, 4, 3, redMushroom, AIR, false); + placeTreasureAtCurrentPosition(world, 3, 2, 3, TFLootTables.LABYRINTH_ROOM, sbb); + + generateBox(world, sbb, 12, 1, 12, 14, 1, 14, redMushroom, AIR, false); + generateBox(world, sbb, 14, 2, 11, 14, 3, 14, redMushroom, AIR, false); + generateBox(world, sbb, 11, 2, 14, 14, 3, 14, redMushroom, AIR, false); + generateBox(world, sbb, 12, 4, 12, 14, 4, 14, redMushroom, AIR, false); + placeTreasureAtCurrentPosition(world, 12, 2, 12, TFLootTables.LABYRINTH_ROOM, sbb); + + generateBox(world, sbb, 1, 1, 12, 3, 1, 14, redMushroom, AIR, false); + generateBox(world, sbb, 1, 2, 11, 1, 3, 14, redMushroom, AIR, false); + generateBox(world, sbb, 2, 2, 14, 4, 3, 14, redMushroom, AIR, false); + generateBox(world, sbb, 1, 4, 12, 3, 4, 14, redMushroom, AIR, false); + placeTreasureAtCurrentPosition(world, 3, 2, 12, TFLootTables.LABYRINTH_ROOM, sbb); + + generateBox(world, sbb, 12, 1, 1, 14, 1, 3, brownMushroom, AIR, false); + generateBox(world, sbb, 11, 2, 1, 14, 3, 1, brownMushroom, AIR, false); + generateBox(world, sbb, 14, 2, 2, 14, 3, 4, brownMushroom, AIR, false); + generateBox(world, sbb, 12, 4, 1, 14, 4, 3, brownMushroom, AIR, false); + placeTreasureAtCurrentPosition(world, 12, 2, 3, TFLootTables.LABYRINTH_ROOM, sbb); + + // a few more ceilingshrooms + generateBox(world, sbb, 5, 4, 5, 7, 5, 7, brownMushroom, AIR, false); + generateBox(world, sbb, 8, 4, 8, 10, 5, 10, redMushroom, AIR, false); + + // the moo-cen-mino-shrom-taur! + final BlockState taurSpawner = TFBlocks.MINOSHROOM_BOSS_SPAWNER.get().defaultBlockState(); + setBlockStateRotated(world, taurSpawner, 7, 2, 7, Rotation.NONE, sbb); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/minotaurmaze/MazeRoomCollapseComponent.java b/src/main/java/twilightforest/world/components/structures/minotaurmaze/MazeRoomCollapseComponent.java new file mode 100644 index 0000000000..672858072b --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/minotaurmaze/MazeRoomCollapseComponent.java @@ -0,0 +1,53 @@ +package twilightforest.world.components.structures.minotaurmaze; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFStructurePieceTypes; + + +public class MazeRoomCollapseComponent extends MazeRoomComponent { + + public MazeRoomCollapseComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFMMRC.get(), nbt); + } + + public MazeRoomCollapseComponent(int i, RandomSource rand, int x, int y, int z) { + super(TFStructurePieceTypes.TFMMRC.get(), i, rand, x, y, z); + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + super.postProcess(world, manager, generator, rand, sbb, chunkPosIn, blockPos); + + // + for (int x = 1; x < 14; x++) { + for (int z = 1; z < 14; z++) { + // calculate distance from middle + int dist = (int) Math.round(7 / Math.sqrt((7.5 - x) * (7.5 - x) + (7.5 - z) * (7.5 - z))); + int gravel = rand.nextInt(dist); + int root = rand.nextInt(dist); + + if (gravel > 0) { + gravel++; // get it out of the floor + this.generateBox(world, sbb, x, 1, z, x, gravel, z, Blocks.GRAVEL.defaultBlockState(), AIR, false); + this.generateAirBox(world, sbb, x, gravel, z, x, gravel + 5, z); + } else if (root > 0) { + this.generateBox(world, sbb, x, 5, z, x, 5 + root, z, Blocks.DIRT.defaultBlockState(), AIR, true); + this.generateBox(world, sbb, x, 5 - rand.nextInt(5), z, x, 5, z, TFBlocks.ROOT_STRAND.get().defaultBlockState(), AIR, false); + } else if (rand.nextInt(dist + 1) > 0) { + // remove ceiling + this.generateAirBox(world, sbb, x, 5, z, x, 5, z); + } + } + } + } +} diff --git a/src/main/java/twilightforest/world/components/structures/minotaurmaze/MazeRoomComponent.java b/src/main/java/twilightforest/world/components/structures/minotaurmaze/MazeRoomComponent.java new file mode 100644 index 0000000000..306de07243 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/minotaurmaze/MazeRoomComponent.java @@ -0,0 +1,73 @@ +package twilightforest.world.components.structures.minotaurmaze; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFStructurePieceTypes; +import twilightforest.world.components.structures.TFStructureComponentOld; + +public class MazeRoomComponent extends TFStructureComponentOld { + + public MazeRoomComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + this(TFStructurePieceTypes.TFMMR.get(), nbt); + } + + public MazeRoomComponent(StructurePieceType piece, CompoundTag nbt) { + super(piece, nbt); + } + + public MazeRoomComponent(StructurePieceType type, int i, RandomSource rand, int x, int y, int z) { + super(type, i, x, y, z); + this.setOrientation(Direction.Plane.HORIZONTAL.getRandomDirection(rand)); + + this.boundingBox = new BoundingBox(x, y, z, x + 15, y + 4, z + 15); + } + + /** + * Initiates construction of the Structure Component picked, at the current Location of StructGen + */ + @Override + public void addChildren(StructurePiece structurecomponent, StructurePieceAccessor list, RandomSource random) { + // NO-OP + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + // floor border + generateBox(world, sbb, 1, 0, 1, 14, 0, 14, TFBlocks.MAZESTONE_BORDER.get().defaultBlockState(), AIR, true); + generateBox(world, sbb, 2, 0, 2, 13, 0, 13, TFBlocks.MAZESTONE_MOSAIC.get().defaultBlockState(), AIR, true); + + // doorways + if (this.getBlock(world, 7, 1, 0, sbb).getBlock() == Blocks.AIR) { + generateBox(world, sbb, 6, 1, 0, 9, 4, 0, Blocks.OAK_FENCE.defaultBlockState(), AIR, false); + generateAirBox(world, sbb, 7, 1, 0, 8, 3, 0); + } + + if (this.getBlock(world, 7, 1, 15, sbb).getBlock() == Blocks.AIR) { + generateBox(world, sbb, 6, 1, 15, 9, 4, 15, Blocks.OAK_FENCE.defaultBlockState(), AIR, false); + generateAirBox(world, sbb, 7, 1, 15, 8, 3, 15); + } + + if (this.getBlock(world, 0, 1, 7, sbb).getBlock() == Blocks.AIR) { + generateBox(world, sbb, 0, 1, 6, 0, 4, 9, Blocks.OAK_FENCE.defaultBlockState(), AIR, false); + generateAirBox(world, sbb, 0, 1, 7, 0, 3, 8); + } + + if (this.getBlock(world, 15, 1, 7, sbb).getBlock() == Blocks.AIR) { + generateBox(world, sbb, 15, 1, 6, 15, 4, 9, Blocks.OAK_FENCE.defaultBlockState(), AIR, false); + generateAirBox(world, sbb, 15, 1, 7, 15, 3, 8); + } + } +} diff --git a/src/main/java/twilightforest/world/components/structures/minotaurmaze/MazeRoomExitComponent.java b/src/main/java/twilightforest/world/components/structures/minotaurmaze/MazeRoomExitComponent.java new file mode 100644 index 0000000000..ced8c17126 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/minotaurmaze/MazeRoomExitComponent.java @@ -0,0 +1,38 @@ +package twilightforest.world.components.structures.minotaurmaze; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFStructurePieceTypes; + + +public class MazeRoomExitComponent extends MazeRoomComponent { + + public MazeRoomExitComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFMMRE.get(), nbt); + } + + public MazeRoomExitComponent(int i, RandomSource rand, int x, int y, int z) { + super(TFStructurePieceTypes.TFMMRE.get(), i, rand, x, y, z); + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + super.postProcess(world, manager, generator, rand, sbb, chunkPosIn, blockPos); + + // shaft down + this.generateBox(world, sbb, 5, -5, 5, 10, 0, 10, TFBlocks.MAZESTONE_BRICK.get().defaultBlockState(), AIR, false); + this.generateBox(world, sbb, 5, 1, 5, 10, 1, 10, TFBlocks.DECORATIVE_MAZESTONE.get().defaultBlockState(), AIR, false); + this.generateBox(world, sbb, 5, 2, 5, 10, 3, 10, Blocks.IRON_BARS.defaultBlockState(), AIR, false); + this.generateBox(world, sbb, 5, 4, 5, 10, 4, 10, TFBlocks.DECORATIVE_MAZESTONE.get().defaultBlockState(), AIR, false); + this.generateAirBox(world, sbb, 6, -5, 6, 9, 4, 9); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/minotaurmaze/MazeRoomFountainComponent.java b/src/main/java/twilightforest/world/components/structures/minotaurmaze/MazeRoomFountainComponent.java new file mode 100644 index 0000000000..8d1d817011 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/minotaurmaze/MazeRoomFountainComponent.java @@ -0,0 +1,34 @@ +package twilightforest.world.components.structures.minotaurmaze; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFStructurePieceTypes; + + +public class MazeRoomFountainComponent extends MazeRoomComponent { + + public MazeRoomFountainComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFMMRF.get(), nbt); + } + + public MazeRoomFountainComponent(int i, RandomSource rand, int x, int y, int z) { + super(TFStructurePieceTypes.TFMMRF.get(), i, rand, x, y, z); + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + super.postProcess(world, manager, generator, rand, sbb, chunkPosIn, blockPos); + + this.generateBox(world, sbb, 5, 1, 5, 10, 1, 10, TFBlocks.DECORATIVE_MAZESTONE.get().defaultBlockState(), AIR, false); + this.generateBox(world, sbb, 6, 1, 6, 9, 1, 9, Blocks.WATER.defaultBlockState(), AIR, false); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/minotaurmaze/MazeRoomSpawnerChestsComponent.java b/src/main/java/twilightforest/world/components/structures/minotaurmaze/MazeRoomSpawnerChestsComponent.java new file mode 100644 index 0000000000..ae550a0f60 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/minotaurmaze/MazeRoomSpawnerChestsComponent.java @@ -0,0 +1,92 @@ +package twilightforest.world.components.structures.minotaurmaze; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFEntities; +import twilightforest.init.TFStructurePieceTypes; +import twilightforest.loot.TFLootTables; + + +public class MazeRoomSpawnerChestsComponent extends MazeRoomComponent { + + public MazeRoomSpawnerChestsComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFMMRSC.get(), nbt); + } + + public MazeRoomSpawnerChestsComponent(int i, RandomSource rand, int x, int y, int z) { + super(TFStructurePieceTypes.TFMMRSC.get(), i, rand, x, y, z); + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + super.postProcess(world, manager, generator, rand, sbb, chunkPosIn, blockPos); + + // 4 pillar enclosures + placePillarEnclosure(world, sbb, 3, 3); + placePillarEnclosure(world, sbb, 10, 3); + placePillarEnclosure(world, sbb, 3, 10); + placePillarEnclosure(world, sbb, 10, 10); + + // spawner + setSpawner(world, 4, 2, 4, sbb, TFEntities.MINOTAUR.get()); + + // treasure + this.placeTreasureAtCurrentPosition(world, 4, 2, 11, TFLootTables.LABYRINTH_ROOM, sbb); + + // treasure + this.placeTreasureAtCurrentPosition(world, 11, 2, 4, TFLootTables.LABYRINTH_ROOM, sbb); + + // trap + placeBlock(world, Blocks.OAK_PRESSURE_PLATE.defaultBlockState(), 11, 1, 11, sbb); + placeBlock(world, Blocks.TNT.defaultBlockState(), 10, 0, 11, sbb); + placeBlock(world, Blocks.TNT.defaultBlockState(), 11, 0, 10, sbb); + placeBlock(world, Blocks.TNT.defaultBlockState(), 11, 0, 12, sbb); + placeBlock(world, Blocks.TNT.defaultBlockState(), 12, 0, 11, sbb); + } + + private void placePillarEnclosure(WorldGenLevel world, BoundingBox sbb, + int dx, int dz) { + for (int y = 1; y < 5; y++) { + final BlockState chiselledMazeBlock = TFBlocks.CUT_MAZESTONE.get().defaultBlockState(); + placeBlock(world, chiselledMazeBlock, dx, y, dz, sbb); + placeBlock(world, chiselledMazeBlock, dx + 2, y, dz, sbb); + placeBlock(world, chiselledMazeBlock, dx, y, dz + 2, sbb); + placeBlock(world, chiselledMazeBlock, dx + 2, y, dz + 2, sbb); + } + placeBlock(world, Blocks.OAK_PLANKS.defaultBlockState(), dx + 1, 1, dz + 1, sbb); + placeBlock(world, Blocks.OAK_PLANKS.defaultBlockState(), dx + 1, 4, dz + 1, sbb); + + final BlockState defaultState = Blocks.OAK_STAIRS.defaultBlockState(); + + + placeBlock(world, getStairState(defaultState, Direction.NORTH, false), dx + 1, 1, dz, sbb); + placeBlock(world, getStairState(defaultState, Direction.WEST, false), dx, 1, dz + 1, sbb); + placeBlock(world, getStairState(defaultState, Direction.EAST, false), dx + 2, 1, dz + 1, sbb); + placeBlock(world, getStairState(defaultState, Direction.SOUTH, false), dx + 1, 1, dz + 2, sbb); + + placeBlock(world, getStairState(defaultState, Direction.NORTH, true), dx + 1, 4, dz, sbb); + placeBlock(world, getStairState(defaultState, Direction.WEST, true), dx, 4, dz + 1, sbb); + placeBlock(world, getStairState(defaultState, Direction.EAST, true), dx + 2, 4, dz + 1, sbb); + placeBlock(world, getStairState(defaultState, Direction.SOUTH, true), dx + 1, 4, dz + 2, sbb); + + placeBlock(world, Blocks.IRON_BARS.defaultBlockState(), dx + 1, 2, dz, sbb); + placeBlock(world, Blocks.IRON_BARS.defaultBlockState(), dx, 2, dz + 1, sbb); + placeBlock(world, Blocks.IRON_BARS.defaultBlockState(), dx + 2, 2, dz + 1, sbb); + placeBlock(world, Blocks.IRON_BARS.defaultBlockState(), dx + 1, 2, dz + 2, sbb); + placeBlock(world, Blocks.IRON_BARS.defaultBlockState(), dx + 1, 3, dz, sbb); + placeBlock(world, Blocks.IRON_BARS.defaultBlockState(), dx, 3, dz + 1, sbb); + placeBlock(world, Blocks.IRON_BARS.defaultBlockState(), dx + 2, 3, dz + 1, sbb); + placeBlock(world, Blocks.IRON_BARS.defaultBlockState(), dx + 1, 3, dz + 2, sbb); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/minotaurmaze/MazeRoomVaultComponent.java b/src/main/java/twilightforest/world/components/structures/minotaurmaze/MazeRoomVaultComponent.java new file mode 100644 index 0000000000..bd7bc1e49f --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/minotaurmaze/MazeRoomVaultComponent.java @@ -0,0 +1,71 @@ +package twilightforest.world.components.structures.minotaurmaze; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFStructurePieceTypes; +import twilightforest.loot.TFLootTables; + + +public class MazeRoomVaultComponent extends MazeRoomComponent { + + public MazeRoomVaultComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFMMRV.get(), nbt); + } + + public MazeRoomVaultComponent(int i, RandomSource rand, int x, int y, int z) { + super(TFStructurePieceTypes.TFMMRV.get(), i, rand, x, y, z); + + // specify a non-existant high spawn list value to stop actual monster spawns + this.spawnListIndex = Integer.MAX_VALUE; + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + // fill room with bricks + generateBox(world, sbb, 0, 1, 0, 15, 4, 15, TFBlocks.DECORATIVE_MAZESTONE.get().defaultBlockState(), AIR, false); + generateBox(world, sbb, 0, 2, 0, 15, 3, 15, TFBlocks.MAZESTONE_BRICK.get().defaultBlockState(), AIR, false); + + // 4x4 room in the middle + generateAirBox(world, sbb, 6, 2, 6, 9, 3, 9); + + // pressure plates, sand & tnt + generateBox(world, sbb, 6, 2, 5, 9, 2, 5, Blocks.OAK_PRESSURE_PLATE.defaultBlockState(), AIR, false); + generateBox(world, sbb, 6, 2, 10, 9, 2, 10, Blocks.OAK_PRESSURE_PLATE.defaultBlockState(), AIR, false); + generateBox(world, sbb, 5, 2, 6, 5, 2, 9, Blocks.OAK_PRESSURE_PLATE.defaultBlockState(), AIR, false); + generateBox(world, sbb, 10, 2, 6, 10, 2, 9, Blocks.OAK_PRESSURE_PLATE.defaultBlockState(), AIR, false); + + // unfair sand + generateBox(world, sbb, 6, 4, 5, 9, 4, 5, Blocks.SAND.defaultBlockState(), AIR, false); + generateBox(world, sbb, 6, 4, 10, 9, 4, 10, Blocks.SAND.defaultBlockState(), AIR, false); + generateBox(world, sbb, 5, 4, 6, 5, 4, 9, Blocks.SAND.defaultBlockState(), AIR, false); + generateBox(world, sbb, 10, 4, 6, 10, 4, 9, Blocks.SAND.defaultBlockState(), AIR, false); + + generateBox(world, sbb, 6, 0, 5, 9, 0, 5, Blocks.TNT.defaultBlockState(), AIR, false); + generateBox(world, sbb, 6, 0, 10, 9, 0, 10, Blocks.TNT.defaultBlockState(), AIR, false); + generateBox(world, sbb, 5, 0, 6, 5, 0, 9, Blocks.TNT.defaultBlockState(), AIR, false); + generateBox(world, sbb, 10, 0, 6, 10, 0, 9, Blocks.TNT.defaultBlockState(), AIR, false); + + + // LEWTZ! + int i = rand.nextInt(4); //Set the index of the jackpot chest, so it's not always the same one + + this.setVaultDoubleLootChest(world, 7, 6, 8, 6, Direction.SOUTH, sbb, i == 0); + this.setVaultDoubleLootChest(world, 8, 9, 7, 9, Direction.NORTH, sbb, i == 1); + this.setVaultDoubleLootChest(world, 6, 8, 6, 7, Direction.EAST, sbb, i == 2); + this.setVaultDoubleLootChest(world, 9, 7, 9, 8, Direction.WEST, sbb, i == 3); + } + + private void setVaultDoubleLootChest(WorldGenLevel world, int x, int z, int x2, int z2, Direction facing, BoundingBox sbb, boolean jackpot) { + this.setDoubleLootChest(world, x, 2, z, x2, 2, z2, facing, jackpot ? TFLootTables.LABYRINTH_VAULT_JACKPOT : TFLootTables.LABYRINTH_VAULT, TFLootTables.LABYRINTH_VAULT, sbb, false); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/minotaurmaze/MazeRuinsComponent.java b/src/main/java/twilightforest/world/components/structures/minotaurmaze/MazeRuinsComponent.java new file mode 100644 index 0000000000..42c6dec402 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/minotaurmaze/MazeRuinsComponent.java @@ -0,0 +1,67 @@ +package twilightforest.world.components.structures.minotaurmaze; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.world.components.structures.TFStructureComponentOld; +import twilightforest.init.TFLandmark; +import twilightforest.init.TFStructurePieceTypes; + + +/** + * This component is the base for the maze/ruins combo feature. There are village-like ruins above and a maze underneath. + * + * @author Ben + */ +public class MazeRuinsComponent extends TFStructureComponentOld { + + public MazeRuinsComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFMMRuins.get(), nbt); + } + + public MazeRuinsComponent(int i, int x, int y, int z) { + super(TFStructurePieceTypes.TFMMRuins.get(), i, TFLandmark.getComponentToAddBoundingBox(x, y, z, 0, 0, 0, 0, 0, 0, Direction.SOUTH, false)); + this.setOrientation(Direction.SOUTH); + } + + /** + * Initiates construction of the Structure Component picked, at the current Location of StructGen + */ + @Override + public void addChildren(StructurePiece structurecomponent, StructurePieceAccessor list, RandomSource random) { + super.addChildren(structurecomponent, list, random); + + // add a maze + MinotaurMazeComponent maze = new MinotaurMazeComponent(1, boundingBox.minX(), boundingBox.minY() - 14, boundingBox.minZ(), 1); + list.addPiece(maze); + maze.addChildren(this, list, random); + + // add maze entrance shaft + MazeEntranceShaftComponent mazeEnter = new MazeEntranceShaftComponent(2, random, boundingBox.minX() + 1, boundingBox.minY(), boundingBox.minZ() + 1); + list.addPiece(mazeEnter); + mazeEnter.addChildren(this, list, random); + + // add aboveground maze entrance building + MazeMoundComponent mazeAbove = new MazeMoundComponent(2, random, boundingBox.minX() - 14, boundingBox.maxY(), boundingBox.minZ() - 14); + list.addPiece(mazeAbove); + mazeAbove.addChildren(this, list, random); + } + + /** + * second Part of Structure generating, this for example places Spiderwebs, Mob Spawners, it closes Mineshafts at + * the end, it adds Fences... + */ + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + // I have no components + } +} diff --git a/src/main/java/twilightforest/world/components/structures/minotaurmaze/MazeUpperEntranceComponent.java b/src/main/java/twilightforest/world/components/structures/minotaurmaze/MazeUpperEntranceComponent.java new file mode 100644 index 0000000000..382081ed0f --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/minotaurmaze/MazeUpperEntranceComponent.java @@ -0,0 +1,74 @@ +package twilightforest.world.components.structures.minotaurmaze; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFStructurePieceTypes; +import twilightforest.world.components.structures.TFStructureComponentOld; + +public class MazeUpperEntranceComponent extends TFStructureComponentOld { + + public MazeUpperEntranceComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFMMUE.get(), nbt); + } + + public MazeUpperEntranceComponent(int i, RandomSource rand, int x, int y, int z) { + super(TFStructurePieceTypes.TFMMUE.get(), i, x, y, z); + this.setOrientation(Direction.Plane.HORIZONTAL.getRandomDirection(rand)); + + this.boundingBox = new BoundingBox(x, y, z, x + 15, y + 4, z + 15); + } + + /** + * Initiates construction of the Structure Component picked, at the current Location of StructGen + */ + @Override + public void addChildren(StructurePiece structurecomponent, StructurePieceAccessor list, RandomSource random) { + // NO-OP + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + + // ceiling + this.generateMaybeBox(world, sbb, rand, 0.7F, 0, 5, 0, 15, 5, 15, TFBlocks.MAZESTONE.get().defaultBlockState(), AIR, true, false); + + this.generateBox(world, sbb, 0, 0, 0, 15, 0, 15, TFBlocks.MAZESTONE_MOSAIC.get().defaultBlockState(), AIR, false); + this.generateBox(world, sbb, 0, 1, 0, 15, 1, 15, TFBlocks.DECORATIVE_MAZESTONE.get().defaultBlockState(), AIR, true); + this.generateBox(world, sbb, 0, 2, 0, 15, 3, 15, TFBlocks.MAZESTONE_BRICK.get().defaultBlockState(), AIR, true); + this.generateBox(world, sbb, 0, 4, 0, 15, 4, 15, TFBlocks.DECORATIVE_MAZESTONE.get().defaultBlockState(), AIR, true); + this.generateMaybeBox(world, sbb, rand, 0.2F, 0, 0, 0, 15, 5, 15, Blocks.GRAVEL.defaultBlockState(), AIR, true, false); + + // doorways + generateBox(world, sbb, 6, 1, 0, 9, 4, 0, Blocks.OAK_FENCE.defaultBlockState(), AIR, false); + generateAirBox(world, sbb, 7, 1, 0, 8, 3, 0); + generateBox(world, sbb, 6, 1, 15, 9, 4, 15, Blocks.OAK_FENCE.defaultBlockState(), AIR, false); + generateAirBox(world, sbb, 7, 1, 15, 8, 3, 15); + generateBox(world, sbb, 0, 1, 6, 0, 4, 9, Blocks.OAK_FENCE.defaultBlockState(), AIR, false); + generateAirBox(world, sbb, 0, 1, 7, 0, 3, 8); + generateBox(world, sbb, 15, 1, 6, 15, 4, 9, Blocks.OAK_FENCE.defaultBlockState(), AIR, false); + generateAirBox(world, sbb, 15, 1, 7, 15, 3, 8); + + // random holes + this.generateAirBox(world, sbb, 1, 1, 1, 14, 4, 14); + + // entrance pit + this.generateBox(world, sbb, 5, 1, 5, 10, 1, 10, TFBlocks.DECORATIVE_MAZESTONE.get().defaultBlockState(), AIR, false); + this.generateBox(world, sbb, 5, 4, 5, 10, 4, 10, TFBlocks.DECORATIVE_MAZESTONE.get().defaultBlockState(), AIR, false); + this.generateMaybeBox(world, sbb, rand, 0.7F, 5, 2, 5, 10, 3, 10, Blocks.IRON_BARS.defaultBlockState(), AIR, false, false); +// this.fillWithBlocks(world, sbb, 5, 2, 5, 10, 3, 10, Blocks.IRON_BARS, 0, AIR, false); + + this.generateAirBox(world, sbb, 6, 0, 6, 9, 4, 9); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/minotaurmaze/MazestoneProcessor.java b/src/main/java/twilightforest/world/components/structures/minotaurmaze/MazestoneProcessor.java new file mode 100644 index 0000000000..9b6db337cc --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/minotaurmaze/MazestoneProcessor.java @@ -0,0 +1,30 @@ +package twilightforest.world.components.structures.minotaurmaze; + +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import twilightforest.init.TFBlocks; + + + +public class MazestoneProcessor extends StructurePiece.BlockSelector { + + @Override + public void next(RandomSource random, int x, int y, int z, boolean wall) { + if (!wall) { + this.next = Blocks.AIR.defaultBlockState(); + } else { + this.next = TFBlocks.MAZESTONE.get().defaultBlockState(); + float rf = random.nextFloat(); + + if (rf < 0.2F) { + this.next = TFBlocks.MOSSY_MAZESTONE.get().defaultBlockState(); + } else if (rf < 0.5F) { + this.next = TFBlocks.CRACKED_MAZESTONE.get().defaultBlockState(); + } else { + this.next = TFBlocks.MAZESTONE_BRICK.get().defaultBlockState(); + } + } + } + +} diff --git a/src/main/java/twilightforest/world/components/structures/minotaurmaze/MinotaurMazeComponent.java b/src/main/java/twilightforest/world/components/structures/minotaurmaze/MinotaurMazeComponent.java new file mode 100644 index 0000000000..dffcb475f5 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/minotaurmaze/MinotaurMazeComponent.java @@ -0,0 +1,335 @@ +package twilightforest.world.components.structures.minotaurmaze; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFBlocks; +import twilightforest.world.components.structures.TFMaze; +import twilightforest.world.components.structures.TFStructureComponentOld; +import twilightforest.init.TFLandmark; +import twilightforest.init.TFStructurePieceTypes; + + +public class MinotaurMazeComponent extends TFStructureComponentOld { + + TFMaze maze; + int[] rcoords; + private final int level; + + public MinotaurMazeComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFMMaze.get(), nbt); + + this.level = nbt.getInt("mazeLevel"); + this.rcoords = nbt.getIntArray("roomCoords"); + + // recreate maze object + maze = new TFMaze(getMazeSize(), getMazeSize()); + setFixedMazeSeed(); + + // blank out rcoords above 1 so that the room generation works properly + //TODO: re-do this. :) + for (int i = 2; i < rcoords.length; i++) { + this.rcoords[i] = 0; + } + + // recreate rooms + this.addRoomsToMaze(this.rcoords[0], this.rcoords[1], (this.rcoords.length + 1) / 2); + + // regenerate maze + maze.generateRecursiveBacktracker(0, 0); + } + + public MinotaurMazeComponent(int index, int x, int y, int z, int entranceX, int entranceZ, int level) { + super(TFStructurePieceTypes.TFMMaze.get(), index, x, y, z); + this.setOrientation(Direction.SOUTH); + this.level = level; + this.boundingBox = TFLandmark.getComponentToAddBoundingBox(x, y, z, -getRadius(), 0, -getRadius(), getRadius() * 2 + 2, 5, getRadius() * 2 + 2, Direction.SOUTH, false); + + // make maze object + maze = new TFMaze(getMazeSize(), getMazeSize()); + + // set the seed to a fixed value based on this maze's x and z + setFixedMazeSeed(); + + // rooms + int nrooms = 7; + rcoords = new int[nrooms * 2]; + + addRoomsToMaze(entranceX, entranceZ, nrooms); + + // make actual maze + maze.generateRecursiveBacktracker(0, 0); + } + + private void addRoomsToMaze(int entranceX, int entranceZ, int nrooms) { + // make one entrance room always + rcoords[0] = entranceX; + rcoords[1] = entranceZ; + maze.carveRoom1(entranceX, entranceZ); + + // add room coordinates, trying to keep them separate from existing rooms + for (int i = 1; i < nrooms; i++) { + int rx, rz; + do { + rx = maze.rand.nextInt(getMazeSize() - 2) + 1; + rz = maze.rand.nextInt(getMazeSize() - 2) + 1; + } while (isNearRoom(rx, rz, rcoords, i == 1 ? 7 : 4)); + + maze.carveRoom1(rx, rz); + + rcoords[i * 2] = rx; + rcoords[i * 2 + 1] = rz; + } + } + + private void setFixedMazeSeed() { + maze.setSeed(this.boundingBox.minX() * 90342903L + this.boundingBox.minY() * 90342903L ^ this.boundingBox.minZ()); + } + + public MinotaurMazeComponent(int index, int x, int y, int z, int level) { + this(index, x, y, z, 11, 11, level); + } + + @Override + protected void addAdditionalSaveData(StructurePieceSerializationContext ctx, CompoundTag tagCompound) { + super.addAdditionalSaveData(ctx, tagCompound); + tagCompound.putInt("mazeLevel", this.level); + tagCompound.putIntArray("roomCoords", this.rcoords); + } + + protected MazeRoomComponent makeRoom(RandomSource random, int i, int dx, int dz) { + MazeRoomComponent room; + + int worldX = boundingBox.minX() + dx * 5 - 4; + int worldY = boundingBox.minY(); + int worldZ = boundingBox.minZ() + dz * 5 - 4; + + if (i == 0) { + // default room + room = new MazeRoomComponent(TFStructurePieceTypes.TFMMR.get(), 3 + i, random, worldX, worldY, worldZ); + } else if (i == 1) { + if (this.level == 1) { + // exit room + room = new MazeRoomExitComponent(3 + i, random, worldX, worldY, worldZ); + } else { + // boss room + room = new MazeRoomBossComponent(3 + i, random, worldX, worldY, worldZ); + } + } else if (i == 2 || i == 3) { + if (this.level == 1) { + // collapsed room + room = new MazeRoomCollapseComponent(3 + i, random, worldX, worldY, worldZ); + } else { + // mush-room + room = new MazeMushRoomComponent(3 + i, random, worldX, worldY, worldZ); + } + } else if (i == 4) { + if (this.level == 1) { + // fountain room + room = new MazeRoomFountainComponent(3 + i, random, worldX, worldY, worldZ); + } else { + // vault + room = new MazeRoomVaultComponent(3 + i, random, worldX, worldY, worldZ); + + } + } else { + room = new MazeRoomSpawnerChestsComponent(3 + i, random, worldX, worldY, worldZ); + } + + return room; + } + + /** + * Find dead ends and put something there + * + * @param random + * @param list + */ + protected void decorateDeadEndsCorridors(RandomSource random, StructurePieceAccessor list) { + for (int x = 0; x < maze.width; x++) { + for (int z = 0; z < maze.depth; z++) { + TFStructureComponentOld component = null; + + // dead ends + if (!maze.isWall(x, z, x - 1, z) && maze.isWall(x, z, x + 1, z) && maze.isWall(x, z, x, z - 1) && maze.isWall(x, z, x, z + 1)) { + component = makeDeadEnd(random, x, z, Direction.EAST); + } + if (maze.isWall(x, z, x - 1, z) && !maze.isWall(x, z, x + 1, z) && maze.isWall(x, z, x, z - 1) && maze.isWall(x, z, x, z + 1)) { + component = makeDeadEnd(random, x, z, Direction.WEST); + } + if (maze.isWall(x, z, x - 1, z) && maze.isWall(x, z, x + 1, z) && !maze.isWall(x, z, x, z - 1) && maze.isWall(x, z, x, z + 1)) { + component = makeDeadEnd(random, x, z, Direction.SOUTH); + } + if (maze.isWall(x, z, x - 1, z) && maze.isWall(x, z, x + 1, z) && maze.isWall(x, z, x, z - 1) && !maze.isWall(x, z, x, z + 1)) { + component = makeDeadEnd(random, x, z, Direction.NORTH); + } + + // corridors + if (!maze.isWall(x, z, x - 1, z) && !maze.isWall(x, z, x + 1, z) && maze.isWall(x, z, x, z - 1) && maze.isWall(x, z, x, z + 1) + && maze.isWall(x - 1, z, x - 1, z - 1) && maze.isWall(x - 1, z, x - 1, z + 1) && maze.isWall(x + 1, z, x + 1, z - 1) && maze.isWall(x + 1, z, x + 1, z + 1)) { + component = makeCorridor(random, x, z, Direction.WEST); + } + if (!maze.isWall(x, z, x, z - 1) && !maze.isWall(x, z, x, z + 1) && maze.isWall(x, z, x - 1, z) && maze.isWall(x, z, x + 1, z) + && maze.isWall(x, z - 1, x - 1, z - 1) && maze.isWall(x, z - 1, x + 1, z - 1) && maze.isWall(x, z + 1, x - 1, z + 1) && maze.isWall(x, z + 1, x + 1, z + 1)) { + component = makeCorridor(random, x, z, Direction.SOUTH); + } + + if (component != null) { + list.addPiece(component); + component.addChildren(this, list, random); + } + } + } + } + + /** + * Add a dead end structure at the specified coords + */ + protected MazeDeadEndComponent makeDeadEnd(RandomSource random, int dx, int dz, Direction rotation) { + int worldX = boundingBox.minX() + dx * 5 + 1; + int worldY = boundingBox.minY(); + int worldZ = boundingBox.minZ() + dz * 5 + 1; + + int decorationType = random.nextInt(8); + //tama why + //decorationType = decorationType >= 3 ? 0 : decorationType; + + return switch (decorationType) { + case 1 -> new MazeDeadEndChestComponent(TFStructurePieceTypes.TFMMDEC.get(), 4, worldX, worldY, worldZ, rotation); + case 2 -> random.nextBoolean() ? new MazeDeadEndTripwireChestComponent(4, worldX, worldY, worldZ, rotation) : new MazeDeadEndTrappedChestComponent(4, worldX, worldY, worldZ, rotation); + case 3 -> new MazeDeadEndTorchesComponent(4, worldX, worldY, worldZ, rotation); + case 4 -> new MazeDeadEndFountainComponent(TFStructurePieceTypes.TFMMDEF.get(), 4, worldX, worldY, worldZ, rotation); + case 5 -> new MazeDeadEndFountainLavaComponent(4, worldX, worldY, worldZ, rotation); + case 6 -> new MazeDeadEndPaintingComponent(4, worldX, worldY, worldZ, rotation); + case 7 -> this.level == 1 ? new MazeDeadEndRootsComponent(TFStructurePieceTypes.TFMMDER.get(), 4, worldX, worldY, worldZ, rotation) : new MazeDeadEndShroomsComponent(4, worldX, worldY, worldZ, rotation); + default -> // blank with fence doorway + new MazeDeadEndComponent(TFStructurePieceTypes.TFMMDE.get(), 4, worldX, worldY, worldZ, rotation); + }; + } + + protected MazeCorridorComponent makeCorridor(RandomSource random, int dx, int dz, Direction rotation) { + int worldX = boundingBox.minX() + dx * 5 + 1; + int worldY = boundingBox.minY(); + int worldZ = boundingBox.minZ() + dz * 5 + 1; + + int decorationType = random.nextInt(5); + + return switch (decorationType) { + case 1 -> new MazeCorridorComponent(TFStructurePieceTypes.TFMMC.get(), 4, worldX, worldY, worldZ, rotation); + case 2 -> new MazeCorridorIronFenceComponent(4, worldX, worldY, worldZ, rotation); + case 3 -> null; // painting + case 4 -> this.level == 1 ? new MazeCorridorRootsComponent(4, worldX, worldY, worldZ, rotation) : new MazeCorridorShroomsComponent(4, worldX, worldY, worldZ, rotation); + default -> null; + }; + } + + /** + * Initiates construction of the Structure Component picked, at the current Location of StructGen + */ + @Override + public void addChildren(StructurePiece structurecomponent, StructurePieceAccessor list, RandomSource random) { + super.addChildren(structurecomponent, list, random); + + // add a second story + if (this.level == 1) { + int centerX = boundingBox.minX() + ((boundingBox.maxX() - boundingBox.minX()) / 2); + int centerZ = boundingBox.minZ() + ((boundingBox.maxZ() - boundingBox.minZ()) / 2); + + MinotaurMazeComponent maze = new MinotaurMazeComponent(1, centerX, boundingBox.minY() - 10, centerZ, rcoords[2], rcoords[3], 2); + list.addPiece(maze); + maze.addChildren(this, list, random); + } + + // add rooms where we have our coordinates + for (int i = 0; i < rcoords.length / 2; i++) { + int dx = rcoords[i * 2]; + int dz = rcoords[i * 2 + 1]; + + // add the room as a component + MazeRoomComponent room = makeRoom(random, i, dx, dz); + list.addPiece(room); + room.addChildren(this, list, random); + } + + // find dead ends and corridors and make components for them + decorateDeadEndsCorridors(random, list); + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + + BlockState bedrock = Blocks.BEDROCK.defaultBlockState(); + BlockState stone = Blocks.STONE.defaultBlockState(); + + // level 2 maze surrounded by bedrock + if (level == 2) { + generateBox(world, sbb, 0, -1, 0, getDiameter() + 2, 6, getDiameter() + 2, bedrock, AIR, false); + } + + // clear the area + generateAirBox(world, sbb, 1, 1, 1, getDiameter(), 4, getDiameter()); + boolean onlyReplaceCeiling = this.level == 1; + generateBox(world, sbb, 1, 5, 1, getDiameter(), 5, getDiameter(), TFBlocks.MAZESTONE.get().defaultBlockState(), stone, onlyReplaceCeiling); + generateBox(world, sbb, 1, 0, 1, getDiameter(), 0, getDiameter(), TFBlocks.MAZESTONE_MOSAIC.get().defaultBlockState(), stone, false); + + maze.headBlockState = TFBlocks.DECORATIVE_MAZESTONE.get().defaultBlockState(); + maze.wallBlockState = TFBlocks.MAZESTONE_BRICK.get().defaultBlockState(); + maze.rootBlockState = TFBlocks.DECORATIVE_MAZESTONE.get().defaultBlockState(); + maze.pillarBlockState = TFBlocks.CUT_MAZESTONE.get().defaultBlockState(); + maze.wallBlocks = new MazestoneProcessor(); + maze.torchRarity = 0.05F; + maze.tall = 2; + maze.head = 1; + maze.roots = 1; + maze.oddBias = 4; + + maze.copyToStructure(world, manager, generator, 1, 2, 1, this, sbb); + } + + public int getMazeSize() { + return 22; + } + + public int getRadius() { + return (int) (getMazeSize() * 2.5); + } + + public int getDiameter() { + return getMazeSize() * 5; + } + + /** + * @return true if the specified dx and dz are within 3 of a room specified in rcoords + */ + protected boolean isNearRoom(int dx, int dz, int[] rcoords, int range) { + // if proposed coordinates are covering the origin, return true to stop the room from causing the maze to fail + if (dx == 1 && dz == 1) { + return true; + } + + for (int i = 0; i < rcoords.length / 2; i++) { + int rx = rcoords[i * 2]; + int rz = rcoords[i * 2 + 1]; + + if (rx == 0 && rz == 0) { + continue; + } + + if (Math.abs(dx - rx) < range && Math.abs(dz - rz) < range) { + return true; + } + } + return false; + } +} diff --git a/src/main/java/twilightforest/world/components/structures/minotaurmaze/package-info.java b/src/main/java/twilightforest/world/components/structures/minotaurmaze/package-info.java new file mode 100644 index 0000000000..83429297ca --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/minotaurmaze/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.world.components.structures.minotaurmaze; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/world/components/structures/mushroomtower/MushroomTowerBridgeComponent.java b/src/main/java/twilightforest/world/components/structures/mushroomtower/MushroomTowerBridgeComponent.java new file mode 100644 index 0000000000..1ded1ad891 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/mushroomtower/MushroomTowerBridgeComponent.java @@ -0,0 +1,89 @@ +package twilightforest.world.components.structures.mushroomtower; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; +import twilightforest.TwilightForestMod; +import twilightforest.world.components.structures.TFStructureComponentOld; +import twilightforest.init.TFLandmark; +import twilightforest.init.TFStructurePieceTypes; + + +public class MushroomTowerBridgeComponent extends MushroomTowerWingComponent { + + final int dSize; + int dHeight; + + public MushroomTowerBridgeComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + this(TFStructurePieceTypes.TFMTBri.get(), nbt); + } + + public MushroomTowerBridgeComponent(StructurePieceType piece, CompoundTag nbt) { + super(piece, nbt); + this.dSize = nbt.getInt("destSize"); + this.dHeight = nbt.getInt("destHeight"); + } + + protected MushroomTowerBridgeComponent(StructurePieceType piece, int i, int x, int y, int z, int pSize, int pHeight, Direction direction) { + super(piece, i, x, y, z, pSize, pHeight, direction); + + this.boundingBox = TFLandmark.getComponentToAddBoundingBox(x, y, z, 0, 0, 0, size - 1, height - 1, 3, direction, false); + + this.dSize = pSize; + this.dHeight = pHeight; + } + + @Override + protected void addAdditionalSaveData(StructurePieceSerializationContext ctx, CompoundTag tagCompound) { + super.addAdditionalSaveData(ctx, tagCompound); + tagCompound.putInt("destSize", this.dSize); + tagCompound.putInt("destHeight", this.dHeight); + } + + @Override + public void addChildren(StructurePiece parent, StructurePieceAccessor list, RandomSource rand) { + if (parent != null && parent instanceof TFStructureComponentOld) { + this.deco = ((TFStructureComponentOld) parent).deco; + } + + int[] dest = new int[]{dSize - 1, 1, 1}; + boolean madeWing = makeTowerWing(list, rand, this.getGenDepth(), dest[0], dest[1], dest[2], dSize, dHeight, Rotation.NONE); + + if (!madeWing) { + int[] dx = offsetTowerCoords(dest[0], dest[1], dest[2], dSize, Direction.SOUTH); + TwilightForestMod.LOGGER.info("Making tower wing failed when bridge was already made. Size = {}, x = {}, z = {}", dSize, dx[0], dx[2]); + } + } + + public BoundingBox getWingBB() { + int[] dest = offsetTowerCoords(dSize - 1, 1, 1, dSize, this.getOrientation()); + return TFLandmark.getComponentToAddBoundingBox(dest[0], dest[1], dest[2], 0, 0, 0, dSize - 1, dHeight - 1, dSize - 1, this.getOrientation(), false); + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + + // make walls + for (int x = 0; x < dSize; x++) { + placeBlock(world, deco.fenceState, x, 1, 0, sbb); + placeBlock(world, deco.fenceState, x, 1, 2, sbb); + + placeBlock(world, this.isAscender ? Blocks.JUNGLE_PLANKS.defaultBlockState() : deco.floorState, x, 0, 1, sbb); + } + + // clear bridge walkway + this.generateAirBox(world, sbb, 0, 1, 1, 2, 2, 1); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/mushroomtower/MushroomTowerDecorator.java b/src/main/java/twilightforest/world/components/structures/mushroomtower/MushroomTowerDecorator.java new file mode 100644 index 0000000000..ef45cd3ebf --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/mushroomtower/MushroomTowerDecorator.java @@ -0,0 +1,17 @@ +package twilightforest.world.components.structures.mushroomtower; + +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.HugeMushroomBlock; +import twilightforest.world.components.structures.TFStructureDecorator; + +public class MushroomTowerDecorator extends TFStructureDecorator { + + public MushroomTowerDecorator() { + this.blockState = Blocks.MUSHROOM_STEM.defaultBlockState().setValue(HugeMushroomBlock.UP, false).setValue(HugeMushroomBlock.DOWN, false); + this.accentState = Blocks.RED_MUSHROOM_BLOCK.defaultBlockState(); + this.fenceState = Blocks.OAK_FENCE.defaultBlockState(); + this.stairState = Blocks.SPRUCE_STAIRS.defaultBlockState(); + this.pillarState = Blocks.MUSHROOM_STEM.defaultBlockState().setValue(HugeMushroomBlock.UP, false).setValue(HugeMushroomBlock.DOWN, false); + this.floorState = Blocks.OAK_PLANKS.defaultBlockState(); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/mushroomtower/MushroomTowerMainBridgeComponent.java b/src/main/java/twilightforest/world/components/structures/mushroomtower/MushroomTowerMainBridgeComponent.java new file mode 100644 index 0000000000..e24a3c5a07 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/mushroomtower/MushroomTowerMainBridgeComponent.java @@ -0,0 +1,44 @@ +package twilightforest.world.components.structures.mushroomtower; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.core.Direction; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePiecesBuilder; +import twilightforest.init.TFStructurePieceTypes; + + +public class MushroomTowerMainBridgeComponent extends MushroomTowerBridgeComponent { + + public MushroomTowerMainBridgeComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFMTMB.get(), nbt); + } + + protected MushroomTowerMainBridgeComponent(int i, int x, int y, int z, int pHeight, Direction direction) { + // bridge only 11 long + super(TFStructurePieceTypes.TFMTMB.get(), i, x, y, z, 11, pHeight, direction); + } + + @Override + public boolean makeTowerWing(StructurePieceAccessor list, RandomSource rand, int index, int x, int y, int z, int wingSize, int wingHeight, Rotation rotation) { + + // make a new size 15 main tower + Direction direction = getStructureRelativeRotation(rotation); + int[] dx = offsetTowerCoords(x, y, z, 15, direction); + + // adjust coordinates to fit an existing tower + dx = adjustCoordinates(dx[0], dx[1], dx[2], 15, direction, list); + + MushroomTowerMainComponent wing = new MushroomTowerMainComponent(index, dx[0], dx[1], dx[2], 15, wingHeight, direction); + + list.addPiece(wing); + if (list instanceof StructurePiecesBuilder start) { + wing.addChildren(start.pieces.get(0), list, rand); + } + addOpening(x, y, z, rotation); + + return true; + } +} diff --git a/src/main/java/twilightforest/world/components/structures/mushroomtower/MushroomTowerMainComponent.java b/src/main/java/twilightforest/world/components/structures/mushroomtower/MushroomTowerMainComponent.java new file mode 100644 index 0000000000..fb70dbbe4e --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/mushroomtower/MushroomTowerMainComponent.java @@ -0,0 +1,153 @@ +package twilightforest.world.components.structures.mushroomtower; + +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.TwilightForestMod; +import twilightforest.init.TFStructurePieceTypes; +import twilightforest.util.RotationUtil; +import twilightforest.world.components.structures.TFStructureComponentOld; +import twilightforest.world.components.structures.lichtower.TowerRoofComponent; + + +public class MushroomTowerMainComponent extends MushroomTowerWingComponent { + + public MushroomTowerMainComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFMTMai.get(), nbt); + } + + public MushroomTowerMainComponent(RandomSource rand, int index, int x, int y, int z) { + this(rand, index, x + MAIN_SIZE, y + 4, z + MAIN_SIZE, Direction.NORTH); + } + + public MushroomTowerMainComponent(RandomSource rand, int index, int x, int y, int z, Direction rotation) { + super(TFStructurePieceTypes.TFMTMai.get(), index, x, y, z, MAIN_SIZE, 8 + (rand.nextInt(3) * FLOOR_HEIGHT), rotation); + +// // check to make sure we can build the whole tower +// if (this.boundingBox.maxY > 245) +// { +// int amtToLower = (((this.boundingBox.maxY - 245) / 5) * 5) + 5; +// +// FMLLog.info("[TwilightForest] Lowering Dark Tower max height by %d to be within world bounds", amtToLower); +// +// this.height -= amtToLower; +// this.boundingBox.maxY -= amtToLower; +// } + + // decorator + if (this.deco == null) { + this.deco = new MushroomTowerDecorator(); + } + } + + protected MushroomTowerMainComponent(int i, int x, int y, int z, int pSize, int pHeight, Direction direction) { + super(TFStructurePieceTypes.TFMTMai.get(), i, x, y, z, pSize, pHeight, direction); + } + + @Override + public void addChildren(StructurePiece parent, StructurePieceAccessor list, RandomSource rand) { + if (parent != null && parent instanceof TFStructureComponentOld) { + this.deco = ((TFStructureComponentOld) parent).deco; + } + + // we should have a door where we started + addOpening(0, 1, size / 2, Rotation.CLOCKWISE_180); + + // should we build a base? + this.hasBase = true; + + Rotation mainDir = null; + + // limit sprawl to a reasonable amount + if (this.getGenDepth() < 3) { + // make a special sub-tower that will lead back here + // try 6 times + for (int i = 0; i < 6; i++) { + mainDir = makeAscenderTower(list, rand); + + if (mainDir != null) { + break; + } + } + + // make sub towers + //for (int i = 0; i < 4; i++) { + for (Rotation i : RotationUtil.ROTATIONS) { + + if (i == mainDir) { + continue; + } + + int[] dest = getValidOpening(rand, i); + + int childHeight = (rand.nextInt(2) + rand.nextInt(2) + 2) * FLOOR_HEIGHT + 1; + + makeBridge(list, rand, this.getGenDepth() + 1, dest[0], dest[1], dest[2], size - 4, childHeight, i); + } + } else { + // add a roof? + makeARoof(parent, list, rand); + } + } + + /** + * Make a new ascender tower. Returns direction if successful, null if not. + */ + private Rotation makeAscenderTower(StructurePieceAccessor list, RandomSource rand) { + + Rotation mainDir = RotationUtil.ROTATIONS[rand.nextInt(4)]; + int[] dest = getValidOpening(rand, mainDir); + int childHeight = (height - dest[1]) + ((rand.nextInt(2) + rand.nextInt(2) + 3) * FLOOR_HEIGHT) + 1; + boolean madeIt = makeBridge(list, rand, this.getGenDepth() + 1, dest[0], dest[1], dest[2], size - 4, childHeight, mainDir, true); + + if (madeIt) { + TwilightForestMod.LOGGER.debug("Main tower made a bridge to another tower"); + return mainDir; + } else { + TwilightForestMod.LOGGER.info("Main tower failed to branch off at index {}", this.genDepth); + return null; + } + } + + /** + * Make a mushroom roof! + */ + @Override + public void makeARoof(StructurePiece parent, StructurePieceAccessor list, RandomSource rand) { + TowerRoofComponent roof = new TowerRoofMushroomComponent(this.getGenDepth() + 1, this, 1.6F, getLocatorPosition().getX(), getLocatorPosition().getY(), getLocatorPosition().getZ()); + list.addPiece(roof); + roof.addChildren(this, list, rand); + } + + /** + * Make an opening in this tower for a door. This now only makes one opening, so you need two + */ + @Override + protected void makeDoorOpening(WorldGenLevel world, int dx, int dy, int dz, BoundingBox sbb) { + super.makeDoorOpening(world, dx, dy, dz, sbb); + + // try to remove blocks inside this door + if (dx == 0) { + placeBlock(world, AIR, dx + 1, dy, dz, sbb); + placeBlock(world, AIR, dx + 1, dy + 1, dz, sbb); + } + if (dx == size - 1) { + placeBlock(world, AIR, dx - 1, dy, dz, sbb); + placeBlock(world, AIR, dx - 1, dy + 1, dz, sbb); + } + if (dz == 0) { + placeBlock(world, AIR, dx, dy, dz + 1, sbb); + placeBlock(world, AIR, dx, dy + 1, dz + 1, sbb); + } + if (dz == size - 1) { + placeBlock(world, AIR, dx, dy, dz - 1, sbb); + placeBlock(world, AIR, dx, dy + 1, dz - 1, sbb); + } + } +} diff --git a/src/main/java/twilightforest/world/components/structures/mushroomtower/MushroomTowerWingComponent.java b/src/main/java/twilightforest/world/components/structures/mushroomtower/MushroomTowerWingComponent.java new file mode 100644 index 0000000000..653e306f0d --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/mushroomtower/MushroomTowerWingComponent.java @@ -0,0 +1,423 @@ +package twilightforest.world.components.structures.mushroomtower; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePiecesBuilder; +import twilightforest.TwilightForestMod; +import twilightforest.init.TFStructurePieceTypes; +import twilightforest.util.RotationUtil; +import twilightforest.world.components.structures.TFStructureComponentOld; +import twilightforest.world.components.structures.lichtower.TowerRoofComponent; +import twilightforest.world.components.structures.lichtower.TowerWingComponent; + + +public class MushroomTowerWingComponent extends TowerWingComponent { + + private static final int RANGE = 200; + protected static final int FLOOR_HEIGHT = 4; + protected static final int MAIN_SIZE = 15; + + boolean hasBase = false; + public boolean isAscender = false; + + public MushroomTowerWingComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + this(TFStructurePieceTypes.TFMTWin.get(), nbt); + } + + public MushroomTowerWingComponent(StructurePieceType piece, CompoundTag nbt) { + super(piece, nbt); + this.hasBase = nbt.getBoolean("hasBase"); + this.isAscender = nbt.getBoolean("isAscender"); + } + + protected MushroomTowerWingComponent(StructurePieceType piece, int i, int x, int y, int z, int pSize, int pHeight, Direction direction) { + super(piece, i, x, y, z, pSize, pHeight, direction); + } + + @Override + protected void addAdditionalSaveData(StructurePieceSerializationContext ctx, CompoundTag tagCompound) { + super.addAdditionalSaveData(ctx, tagCompound); + + tagCompound.putBoolean("hasBase", this.hasBase); + tagCompound.putBoolean("isAscender", this.isAscender); + } + + @Override + public void addChildren(StructurePiece parent, StructurePieceAccessor list, RandomSource rand) { + if (parent != null && parent instanceof TFStructureComponentOld) { + this.deco = ((TFStructureComponentOld) parent).deco; + } + + // we should have a door where we started + addOpening(0, 1, size / 2, Rotation.CLOCKWISE_180); + + // should we build a base? + this.hasBase = size > 3; + + // if we are an ascender, build the destination tower + if (this.isAscender) { + + int[] dest = getValidOpening(rand, Rotation.CLOCKWISE_180); + dest[1] = this.height - 3; + int childHeight = (rand.nextInt(3) + rand.nextInt(3) + 2) * FLOOR_HEIGHT + 1; + boolean madeIt = makeMainBridge(list, rand, this.getGenDepth() + 1, dest[0], dest[1], dest[2], childHeight, Rotation.CLOCKWISE_180); + + if (!madeIt) { + TwilightForestMod.LOGGER.info("Did not make bridge back to new main"); + } else { + TwilightForestMod.LOGGER.debug("Made bridge back to new main"); + } + } + + // limit sprawl to a reasonable amount + if (this.getGenDepth() < 5 && this.size > 6) { + // make sub towers + //for (int i = 0; i < 4; i++) { + for (Rotation i : RotationUtil.ROTATIONS) { + + if (this.size < MAIN_SIZE && i == Rotation.CLOCKWISE_180) { + continue; + } + + int[] dest = getValidOpening(rand, i); + + int childHeight = (rand.nextInt(2) + rand.nextInt(2) + 2) * FLOOR_HEIGHT + 1; + + makeBridge(list, rand, this.getGenDepth() + 1, dest[0], dest[1], dest[2], size - 4, childHeight, i); + } + } + + if (this.isHighest(this.boundingBox, this.size, list) || !this.hasBase) { + // add a roof? + makeARoof(parent, list, rand); + } + } + + /** + * Have we strayed more than range blocks away from the center? + */ + private boolean isOutOfRange(StructurePiece parent, int nx, int nz, int range) { + final BoundingBox sbb = parent.getBoundingBox(); + final int centerX = sbb.minX() + (sbb.maxX() - sbb.minX() + 1) / 2; + final int centerZ = sbb.minZ() + (sbb.maxZ() - sbb.minZ() + 1) / 2; + return Math.abs(nx - centerX) > range + || Math.abs(nz - centerZ) > range; + } + + /** + * Make a new wing + */ + @Override + public boolean makeTowerWing(StructurePieceAccessor list, RandomSource rand, int index, int x, int y, int z, int wingSize, int wingHeight, Rotation rotation) { + + Direction direction = getStructureRelativeRotation(rotation); + int[] dx = offsetTowerCoords(x, y, z, wingSize, direction); + + // stop if out of range + if (isOutOfRange(this, dx[0], dx[2], RANGE)) { + return false; + } + + // adjust coordinates to fit an existing tower + if (wingSize > 3) { + dx = adjustCoordinates(dx[0], dx[1], dx[2], wingSize, direction, list); + } + + MushroomTowerWingComponent wing = new MushroomTowerWingComponent(TFStructurePieceTypes.TFMTWin.get(), index, dx[0], dx[1], dx[2], wingSize, wingHeight, direction); + // check to see if it intersects something already there + StructurePiece intersect = list.findCollisionPiece(wing.getBoundingBox()); + if (intersect == null || intersect == this || intersect instanceof TowerRoofMushroomComponent) { + + // if we are coming from an ascender bridge, mark the destination component + if (this instanceof MushroomTowerBridgeComponent && this.isAscender) { + wing.isAscender = true; + } + + list.addPiece(wing); + wing.addChildren(this, list, rand); + addOpening(x, y, z, rotation); + + return true; + } else { + return false; + } + } + + /** + * Adjust the coordinates for this tower to link up with any others within 3 + */ + protected int[] adjustCoordinates(int x, int y, int z, int wingSize, Direction direction, StructurePieceAccessor list) { + // go through list. if there are any same size towers within wingSize, return their xyz instead + if (list instanceof StructurePiecesBuilder start) { + for (StructurePiece obj : start.pieces) { + if (obj instanceof TowerWingComponent && !(obj instanceof MushroomTowerBridgeComponent)) { + TowerWingComponent otherWing = (TowerWingComponent) obj; + + if (wingSize == otherWing.size && otherWing.getBoundingBox().intersects(x - 3, z - 3, x + 3, z + 3)) { + return switch (direction) { + case SOUTH -> new int[]{otherWing.getBoundingBox().minX(), y, otherWing.getBoundingBox().minZ()}; + case WEST -> new int[]{otherWing.getBoundingBox().maxX(), y, otherWing.getBoundingBox().minZ()}; + case NORTH -> new int[]{otherWing.getBoundingBox().maxX(), y, otherWing.getBoundingBox().maxZ()}; + case EAST -> new int[]{otherWing.getBoundingBox().minX(), y, otherWing.getBoundingBox().maxZ()}; + default -> new int[]{x, y, z}; + }; + } + } + } + } + + return new int[]{x, y, z}; + } + + /** + * Are there (not) any other towers below this bounding box? + */ + private boolean isHighest(BoundingBox boundingBox, int size, StructurePieceAccessor list) { + // go through list. if there are any same size towers within wingSize, return their xyz instead + + BoundingBox boxAbove = new BoundingBox( + boundingBox.minX(), boundingBox.minY(), boundingBox.minZ(), + boundingBox.maxX(), 256, boundingBox.maxZ() + ); + + if (list instanceof StructurePiecesBuilder start) { + for (StructurePiece obj : start.pieces) { + if (this != obj && obj instanceof TowerWingComponent && !(obj instanceof MushroomTowerBridgeComponent)) { + TowerWingComponent otherWing = (TowerWingComponent) obj; + + if (size == otherWing.size && otherWing.getBoundingBox().intersects(boxAbove)) { + return false; + } + } + } + } + + return true; + } + + /** + * Make a mushroom roof! + */ + @Override + public void makeARoof(StructurePiece parent, StructurePieceAccessor list, RandomSource rand) { + + TowerRoofComponent roof = new TowerRoofMushroomComponent(this.getGenDepth() + 1, this, 1.6F, getLocatorPosition().getX(), getLocatorPosition().getY(), getLocatorPosition().getZ()); + if (!(list.findCollisionPiece(roof.getBoundingBox()) instanceof TowerRoofMushroomComponent)) { + roof = new TowerRoofMushroomComponent(this.getGenDepth() + 1, this, 1.0F, getLocatorPosition().getX(), getLocatorPosition().getY(), getLocatorPosition().getZ()); + if (!(list.findCollisionPiece(roof.getBoundingBox()) instanceof TowerRoofMushroomComponent)) { + roof = new TowerRoofMushroomComponent(this.getGenDepth() + 1, this, 0.6F, getLocatorPosition().getX(), getLocatorPosition().getY(), getLocatorPosition().getZ()); + } + } + list.addPiece(roof); + roof.addChildren(this, list, rand); + } + + @Override + protected boolean makeBridge(StructurePieceAccessor list, RandomSource rand, int index, int x, int y, int z, int wingSize, int wingHeight, Rotation rotation) { + return this.makeBridge(list, rand, index, x, y, z, wingSize, wingHeight, rotation, false); + } + + protected boolean makeBridge(StructurePieceAccessor list, RandomSource rand, int index, int x, int y, int z, int wingSize, int wingHeight, Rotation rotation, boolean ascender) { + // bridges are size always + Direction direction = getStructureRelativeRotation(rotation); + int[] dx = offsetTowerCoords(x, y, z, 3, direction); + + // adjust height for those stupid little things + if (wingSize == 3) { + wingHeight = 4; + } + + MushroomTowerBridgeComponent bridge = new MushroomTowerBridgeComponent(TFStructurePieceTypes.TFMTBri.get(), index, dx[0], dx[1], dx[2], wingSize, wingHeight, direction); + bridge.isAscender = ascender; + // check to see if it intersects something already there + StructurePiece intersect = list.findCollisionPiece(bridge.getBoundingBox()); + if (intersect == null || intersect == this) { + intersect = list.findCollisionPiece(bridge.getWingBB()); + } else { + return false; + } + // okay, I think we can actually make one, as long as we're not still intersecting something. + if (intersect == null || intersect == this) { + list.addPiece(bridge); + bridge.addChildren(this, list, rand); + addOpening(x, y, z, rotation); + return true; + } else { + return false; + } + } + + private boolean makeMainBridge(StructurePieceAccessor list, RandomSource rand, int index, int x, int y, int z, int wingHeight, Rotation rotation) { + + Direction direction = getStructureRelativeRotation(rotation); + int[] dx = offsetTowerCoords(x, y, z, 3, direction); + + MushroomTowerMainBridgeComponent bridge = new MushroomTowerMainBridgeComponent(index, dx[0], dx[1], dx[2], wingHeight, direction); + + list.addPiece(bridge); + bridge.addChildren(this, list, rand); + addOpening(x, y, z, rotation); + return true; + } + + /** + * Gets a random position in the specified direction that connects to stairs currently in the tower. + */ + @Override + public int[] getValidOpening(RandomSource rand, Rotation direction) { + // variables! + int wLength = Math.min(size / 3, 3); // wall length + int offset = (size - wLength) / 2; // wall thickness + + // for directions 0 or 2, the wall lies along the z axis + if (direction == Rotation.NONE || direction == Rotation.CLOCKWISE_180) { + int rx = direction == Rotation.NONE ? size - 1 : 0; + int rz = offset + rand.nextInt(wLength); + int ry = getYByStairs(rz, rand, direction); + + return new int[]{rx, ry, rz}; + } + + // for directions 1 or 3, the wall lies along the x axis + if (direction == Rotation.CLOCKWISE_90 || direction == Rotation.COUNTERCLOCKWISE_90) { + int rx = offset + rand.nextInt(wLength); + int rz = direction == Rotation.CLOCKWISE_90 ? size - 1 : 0; + int ry = getYByStairs(rx, rand, direction); + + return new int[]{rx, ry, rz}; + } + + return new int[]{0, 0, 0}; + } + + /** + * Gets a Y value where the stairs meet the specified X coordinate. + * Also works for Z coordinates. + */ + @Override + protected int getYByStairs(int rx, RandomSource rand, Rotation direction) { + + int floors = this.height / FLOOR_HEIGHT; + + return FLOOR_HEIGHT + 1 + (rand.nextInt(floors - 1) * FLOOR_HEIGHT); + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + + makeTrunk(world, sbb); + + // make floors + makeFloorsForTower(world, sbb); + + // openings + makeOpenings(world, sbb); + } + + private void makeTrunk(WorldGenLevel world, BoundingBox sbb) { + int diameter = this.size / 2; + int hollow = (int) (diameter * 0.8); + + // build the trunk upwards + for (int dx = -diameter; dx <= diameter; dx++) { + for (int dz = -diameter; dz <= diameter; dz++) { + // determine how far we are from the center. + int ax = Math.abs(dx); + int az = Math.abs(dz); + int dist = (int) (Math.max(ax, az) + (Math.min(ax, az) * 0.4)); + + // make a trunk! + if (dist <= diameter) { + // make floor/ceiling + placeBlock(world, deco.floorState, dx + diameter, 0, dz + diameter, sbb); + placeBlock(world, deco.floorState, dx + diameter, height, dz + diameter, sbb); + + // make walls + if (dist > hollow) { + for (int dy = 0; dy <= height; dy++) { + placeBlock(world, deco.blockState, dx + diameter, dy, dz + diameter, sbb); + } + } else { + for (int dy = 1; dy <= height - 1; dy++) { + placeBlock(world, AIR, dx + diameter, dy, dz + diameter, sbb); + } + } + + // make base + if (this.hasBase) { + this.fillColumnDown(world, deco.blockState, dx + diameter, -1, dz + diameter, sbb); + } + } + } + } + } + + private void makeFloorsForTower(WorldGenLevel world, BoundingBox sbb) { + int floors = this.height / FLOOR_HEIGHT; + + // divide the tower into floors + for (int i = 0; i < floors; i++) { + placeFloor(world, i * FLOOR_HEIGHT, sbb); + } + } + + private void placeFloor(WorldGenLevel world, int dy, BoundingBox sbb) { + int diameter = this.size / 2; + int hollow = (int) (diameter * 0.8); + + // build the trunk upwards + for (int dx = -diameter; dx <= diameter; dx++) { + for (int dz = -diameter; dz <= diameter; dz++) { + // determine how far we are from the center. + int ax = Math.abs(dx); + int az = Math.abs(dz); + int dist = (int) (Math.max(ax, az) + (Math.min(ax, az) * 0.4)); + + // make a floor! + if (dist <= hollow) { { + placeBlock(world, this.isAscender ? Blocks.JUNGLE_PLANKS.defaultBlockState() : deco.floorState, dx + diameter, dy, dz + diameter, sbb); + } + } + } + } + } + + /** + * Make an opening in this tower for a door. This now only makes one opening, so you need two + */ + @Override + protected void makeDoorOpening(WorldGenLevel world, int dx, int dy, int dz, BoundingBox sbb) { + super.makeDoorOpening(world, dx, dy, dz, sbb); + + if (getBlock(world, dx, dy + 2, dz, sbb).getBlock() != Blocks.AIR) { + placeBlock(world, deco.accentState, dx, dy + 2, dz, sbb); + } + } + + /** + * Called to decorate each floor. This is responsible for adding a ladder up, the stub of the ladder going down, then picking a theme for each floor and executing it. + * + * @param floor + * @param bottom + * @param top + * @param ladderUpDir + * @param ladderDownDir + */ + @Override + protected void decorateFloor(WorldGenLevel world, RandomSource rand, int floor, int bottom, int top, Rotation ladderUpDir, Rotation ladderDownDir, BoundingBox sbb) { + //decorateWraparoundWallSteps(world, rand, bottom, top, ladderUpDir, ladderDownDir, sbb); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/mushroomtower/TowerRoofMushroomComponent.java b/src/main/java/twilightforest/world/components/structures/mushroomtower/TowerRoofMushroomComponent.java new file mode 100644 index 0000000000..2a507e2d1b --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/mushroomtower/TowerRoofMushroomComponent.java @@ -0,0 +1,87 @@ +package twilightforest.world.components.structures.mushroomtower; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.Mth; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFStructurePieceTypes; +import twilightforest.world.components.structures.TFStructureComponentOld; +import twilightforest.world.components.structures.lichtower.TowerRoofComponent; +import twilightforest.world.components.structures.lichtower.TowerWingComponent; + + +public class TowerRoofMushroomComponent extends TowerRoofComponent { + + public TowerRoofMushroomComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFMTRoofMush.get(), nbt); + } + + public TowerRoofMushroomComponent(int i, TowerWingComponent wing, float pHang, int x, int y, int z) { + super(TFStructurePieceTypes.TFMTRoofMush.get(), i, x, y, z); + this.height = wing.size; + int overhang = (int) (height * pHang); + this.size = height + (overhang * 2); + this.setOrientation(Direction.SOUTH); + this.boundingBox = new BoundingBox(wing.getBoundingBox().minX() - overhang, wing.getBoundingBox().maxY() + 2, wing.getBoundingBox().minZ() - overhang, wing.getBoundingBox().maxX() + overhang, wing.getBoundingBox().maxY() + this.height + 1, wing.getBoundingBox().maxZ() + overhang); + } + + @Override + public void addChildren(StructurePiece parent, StructurePieceAccessor list, RandomSource rand) { + if (parent != null && parent instanceof TFStructureComponentOld) { + this.deco = ((TFStructureComponentOld) parent).deco; + } + } + + /** + * Makes a pointy roof out of stuff + */ + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + + for (int y = 0; y <= height; y++) { + + int radius = (int) (Mth.sin((y + height / 1.2F) / (height * 2.05F) * 3.14F) * this.size / 2F); + int hollow = Mth.floor(radius * .9F); + + if ((height - y) < 3) { + hollow = -1; + } + + makeCircle(world, y, radius, hollow, sbb); + } + } + + private void makeCircle(WorldGenLevel world, int y, int radius, int hollow, BoundingBox sbb) { + + int cx = size / 2; + int cz = size / 2; + + // build the trunk upwards + for (int dx = -radius; dx <= radius; dx++) { + for (int dz = -radius; dz <= radius; dz++) { + // determine how far we are from the center. + float dist = Mth.sqrt(dx * dx + dz * dz); + + // make a trunk! + if (dist <= (radius + 0.5F)) { + if (dist > hollow) { + placeBlock(world, deco.accentState, dx + cx, y, dz + cz, sbb); + } else { + // spore + placeBlock(world, deco.accentState.getBlock().defaultBlockState(), dx + cx, y, dz + cz, sbb); + + } + } + } + } + } +} diff --git a/src/main/java/twilightforest/world/components/structures/mushroomtower/package-info.java b/src/main/java/twilightforest/world/components/structures/mushroomtower/package-info.java new file mode 100644 index 0000000000..de9dc1cf34 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/mushroomtower/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.world.components.structures.mushroomtower; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/world/components/structures/package-info.java b/src/main/java/twilightforest/world/components/structures/package-info.java new file mode 100644 index 0000000000..9bd47c4020 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/package-info.java @@ -0,0 +1,6 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.world.components.structures; + +import net.minecraft.MethodsReturnNonnullByDefault; +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/world/components/structures/placements/BiomeForcedLandmarkPlacement.java b/src/main/java/twilightforest/world/components/structures/placements/BiomeForcedLandmarkPlacement.java new file mode 100644 index 0000000000..7bdc7bb95d --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/placements/BiomeForcedLandmarkPlacement.java @@ -0,0 +1,59 @@ +package twilightforest.world.components.structures.placements; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.Vec3i; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.chunk.ChunkGeneratorStructureState; +import net.minecraft.world.level.levelgen.structure.placement.StructurePlacement; +import net.minecraft.world.level.levelgen.structure.placement.StructurePlacementType; +import twilightforest.init.TFLandmark; +import twilightforest.init.TFStructurePlacementTypes; +import twilightforest.util.LegacyLandmarkPlacements; +import twilightforest.world.components.chunkgenerators.ChunkGeneratorTwilight; + +import java.util.Optional; + +public class BiomeForcedLandmarkPlacement extends StructurePlacement { + public static final Codec CODEC = RecordCodecBuilder.create(inst -> inst.group( + TFLandmark.CODEC.fieldOf("landmark_set").forGetter(p -> p.landmark), + Codec.intRange(-32, 256).fieldOf("scan_elevation").forGetter(p -> p.scanHeight) + ).apply(inst, BiomeForcedLandmarkPlacement::new)); + + private final TFLandmark landmark; + private final int scanHeight; + + public BiomeForcedLandmarkPlacement(TFLandmark landmark, int biomeScanHeight) { + super(Vec3i.ZERO, FrequencyReductionMethod.DEFAULT, 1f, 0, Optional.empty()); // None of these params matter except for possibly flat-world or whatever + + this.landmark = landmark; + this.scanHeight = biomeScanHeight; + } + + public boolean isTFPlacementChunk(ChunkGenerator chunkGen, ChunkGeneratorStructureState state, int chunkX, int chunkZ) { + if (chunkGen instanceof ChunkGeneratorTwilight twilightGenerator) + return twilightGenerator.isLandmarkPickedForChunk(this.landmark, chunkGen.getBiomeSource().getNoiseBiome(chunkX << 2, this.scanHeight, chunkZ << 2, state.randomState().sampler()), chunkX, chunkZ, state.getLevelSeed()); + + if (!LegacyLandmarkPlacements.chunkHasLandmarkCenter(chunkX, chunkZ)) + return false; + + return LegacyLandmarkPlacements.pickVarietyLandmark(chunkX, chunkZ, state.getLevelSeed()) == this.landmark; + } + + @Override + protected boolean isPlacementChunk(ChunkGeneratorStructureState state, int chunkX, int chunkZ) { + if (!LegacyLandmarkPlacements.chunkHasLandmarkCenter(chunkX, chunkZ)) + return false; + + return LegacyLandmarkPlacements.pickVarietyLandmark(chunkX, chunkZ, state.getLevelSeed()) == this.landmark; + } + + @Override + public StructurePlacementType type() { + return TFStructurePlacementTypes.FORCED_LANDMARK_PLACEMENT_TYPE.get(); + } + + public TFLandmark getLandmark() { + return this.landmark; + } +} diff --git a/src/main/java/twilightforest/world/components/structures/placements/package-info.java b/src/main/java/twilightforest/world/components/structures/placements/package-info.java new file mode 100644 index 0000000000..624c8610da --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/placements/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.world.components.structures.placements; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/world/components/structures/start/TFStructureStart.java b/src/main/java/twilightforest/world/components/structures/start/TFStructureStart.java new file mode 100644 index 0000000000..65d698517a --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/start/TFStructureStart.java @@ -0,0 +1,44 @@ +package twilightforest.world.components.structures.start; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.levelgen.structure.Structure; +import net.minecraft.world.level.levelgen.structure.StructureStart; +import net.minecraft.world.level.levelgen.structure.pieces.PiecesContainer; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; + +public class TFStructureStart extends StructureStart { + private boolean conquered = false; + + public TFStructureStart(Structure structure, ChunkPos chunkPos, int references, PiecesContainer pieces) { + super(structure, chunkPos, references, pieces); + } + + @Override + public CompoundTag createTag(StructurePieceSerializationContext level, ChunkPos chunkPos) { + CompoundTag tag = super.createTag(level, chunkPos); + + if (this.isValid()) + tag.putBoolean("conquered", this.conquered); + + return tag; + } + + public void load(CompoundTag nbt) { + this.conquered = nbt.getBoolean("conquered"); + } + + public final void setConquered(boolean flag, LevelAccessor level) { + if (this.conquered != flag) { + ChunkPos chunkPos = this.getChunkPos(); + level.getChunk(chunkPos.x, chunkPos.z).setUnsaved(true); + } + + this.conquered = flag; + } + + public final boolean isConquered() { + return this.conquered; + } +} \ No newline at end of file diff --git a/src/main/java/twilightforest/world/components/structures/start/package-info.java b/src/main/java/twilightforest/world/components/structures/start/package-info.java new file mode 100644 index 0000000000..aaf1fcc9c8 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/start/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.world.components.structures.start; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/world/components/structures/stronghold/KnightStones.java b/src/main/java/twilightforest/world/components/structures/stronghold/KnightStones.java new file mode 100644 index 0000000000..fea45de796 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/stronghold/KnightStones.java @@ -0,0 +1,27 @@ +package twilightforest.world.components.structures.stronghold; + +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import twilightforest.init.TFBlocks; + +public class KnightStones extends StructurePiece.BlockSelector { + + @Override + public void next(RandomSource random, int x, int y, int z, boolean edge) { + if (!edge) { + this.next = Blocks.AIR.defaultBlockState(); + } else { + float f = random.nextFloat(); + + if (f < 0.2F) { + this.next = TFBlocks.CRACKED_UNDERBRICK.get().defaultBlockState(); + } else if (f < 0.5F) { + this.next = TFBlocks.MOSSY_UNDERBRICK.get().defaultBlockState(); + } else { + this.next = TFBlocks.UNDERBRICK.get().defaultBlockState(); + } + } + } + +} diff --git a/src/main/java/twilightforest/world/components/structures/stronghold/StrongholdAccessChamberComponent.java b/src/main/java/twilightforest/world/components/structures/stronghold/StrongholdAccessChamberComponent.java new file mode 100644 index 0000000000..559a7cd754 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/stronghold/StrongholdAccessChamberComponent.java @@ -0,0 +1,88 @@ +package twilightforest.world.components.structures.stronghold; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFStructurePieceTypes; + + +public class StrongholdAccessChamberComponent extends StructureTFStrongholdComponent { + + public StrongholdAccessChamberComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFSAC.get(), nbt); + } + + public StrongholdAccessChamberComponent(int i, Direction facing, int x, int y, int z) { + super(TFStructurePieceTypes.TFSAC.get(), i, facing, x, y, z); + } + + @Override + public BoundingBox generateBoundingBox(Direction facing, int x, int y, int z) { + return BoundingBox.orientBox(x, y, z, -4, 1, 0, 9, 5, 9, facing); + } + + /** + * Initiates construction of the Structure Component picked, at the current Location of StructGen + */ + @Override + public void addChildren(StructurePiece parent, StructurePieceAccessor list, RandomSource random) { + super.addChildren(parent, list, random); + + // make a random component in each direction + addNewUpperComponent(parent, list, random, Rotation.NONE, 4, 1, 9); + addNewUpperComponent(parent, list, random, Rotation.CLOCKWISE_90, -1, 1, 4); + addNewUpperComponent(parent, list, random, Rotation.CLOCKWISE_180, 4, 1, -1); + addNewUpperComponent(parent, list, random, Rotation.COUNTERCLOCKWISE_90, 9, 1, 4); + + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + generateBox(world, sbb, 0, 0, 0, 8, 4, 8, true, rand, deco.randomBlocks); + + // doors + placeSmallDoorwayAt(world, 0, 4, 1, 8, sbb); + placeSmallDoorwayAt(world, 1, 0, 1, 4, sbb); + placeSmallDoorwayAt(world, 2, 4, 1, 0, sbb); + placeSmallDoorwayAt(world, 3, 8, 1, 4, sbb); + + // shaft down + final BlockState defaultState = Blocks.MOSSY_STONE_BRICKS.defaultBlockState(); + this.generateBox(world, sbb, 2, -2, 2, 6, 0, 6, defaultState, AIR, false); + + this.generateAirBox(world, sbb, 3, -2, 3, 5, 2, 5); + + // stairs surrounding shaft + this.generateBox(world, sbb, 2, 0, 3, 2, 0, 6, getStairState(deco.stairState, Rotation.CLOCKWISE_180.rotate(Direction.WEST), false), AIR, false); + this.generateBox(world, sbb, 6, 0, 2, 6, 0, 6, getStairState(deco.stairState, Rotation.NONE.rotate(Direction.WEST), false), AIR, false); + this.generateBox(world, sbb, 3, 0, 2, 5, 0, 2, getStairState(deco.stairState, Rotation.COUNTERCLOCKWISE_90.rotate(Direction.WEST), false), AIR, false); + this.generateBox(world, sbb, 3, 0, 6, 5, 0, 6, getStairState(deco.stairState, Rotation.CLOCKWISE_90.rotate(Direction.WEST), false), AIR, false); + + // pillar + this.placeBlock(world, deco.pillarState, 2, 0, 2, sbb); + + // pedestal + this.placeBlock(world, TFBlocks.TROPHY_PEDESTAL.get().defaultBlockState(), 2, 1, 2, sbb); + + // block point + this.generateBox(world, sbb, 2, -1, 2, 6, -1, 6, TFBlocks.STRONGHOLD_SHIELD.get().defaultBlockState(), AIR, false); + } + + @Override + public boolean isComponentProtected() { + return false; + } +} diff --git a/src/main/java/twilightforest/world/components/structures/stronghold/StrongholdAtriumComponent.java b/src/main/java/twilightforest/world/components/structures/stronghold/StrongholdAtriumComponent.java new file mode 100644 index 0000000000..8c4aeb453e --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/stronghold/StrongholdAtriumComponent.java @@ -0,0 +1,170 @@ +package twilightforest.world.components.structures.stronghold; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.registries.Registries; +import net.minecraft.data.worldgen.features.TreeFeatures; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceKey; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFConfiguredFeatures; +import twilightforest.init.TFStructurePieceTypes; + + + +public class StrongholdAtriumComponent extends StructureTFStrongholdComponent { + + private boolean enterBottom; + + public StrongholdAtriumComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFSAt.get(), nbt); + this.enterBottom = nbt.getBoolean("enterBottom"); + } + + public StrongholdAtriumComponent(int i, Direction facing, int x, int y, int z) { + super(TFStructurePieceTypes.TFSAt.get(), i, facing, x, y, z); + } + + @Override + protected void addAdditionalSaveData(StructurePieceSerializationContext ctx, CompoundTag tagCompound) { + super.addAdditionalSaveData(ctx, tagCompound); + tagCompound.putBoolean("enterBottom", this.enterBottom); + } + + @Override + public BoundingBox generateBoundingBox(Direction facing, int x, int y, int z) { + + if (y > -15) { + this.enterBottom = false; + } else if (y < -21) { + this.enterBottom = true; + } else { + this.enterBottom = (z & 1) == 0; + } + + if (enterBottom) { + return StructureTFStrongholdComponent.getComponentToAddBoundingBox(x, y, z, -4, -1, 0, 18, 14, 18, facing); + } else { + // enter on the top + return StructureTFStrongholdComponent.getComponentToAddBoundingBox(x, y, z, -13, -8, 0, 18, 14, 18, facing); + } + } + + /** + * Initiates construction of the Structure Component picked, at the current Location of StructGen + */ + @Override + public void addChildren(StructurePiece parent, StructurePieceAccessor list, RandomSource random) { + super.addChildren(parent, list, random); + + if (this.enterBottom) { + this.addDoor(4, 1, 0); + addNewComponent(parent, list, random, Rotation.CLOCKWISE_180, 13, 8, -1); + } else { + this.addDoor(13, 8, 0); + addNewComponent(parent, list, random, Rotation.CLOCKWISE_180, 4, 1, -1); + } + + addNewComponent(parent, list, random, Rotation.NONE, 13, 1, 18); + addNewComponent(parent, list, random, Rotation.NONE, 4, 8, 18); + } + + /** + * Generate the blocks that go here + */ + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + placeStrongholdWalls(world, sbb, 0, 0, 0, 17, 13, 17, rand, deco.randomBlocks); + + + // balcony + this.generateBox(world, sbb, 1, 6, 1, 16, 7, 16, false, rand, deco.randomBlocks); + this.generateBox(world, sbb, 5, 8, 5, 12, 8, 12, deco.fenceState, AIR, false); + this.generateAirBox(world, sbb, 6, 6, 6, 11, 8, 11); + + // balcony pillars + placeBalconyPillar(world, sbb, Rotation.NONE); + placeBalconyPillar(world, sbb, Rotation.CLOCKWISE_90); + placeBalconyPillar(world, sbb, Rotation.CLOCKWISE_180); + placeBalconyPillar(world, sbb, Rotation.COUNTERCLOCKWISE_90); + + // corner pillars + this.generateBox(world, sbb, 1, 1, 1, 1, 12, 2, false, rand, deco.randomBlocks); + this.generateBox(world, sbb, 2, 1, 1, 2, 12, 1, false, rand, deco.randomBlocks); + + this.generateBox(world, sbb, 16, 1, 1, 16, 12, 2, false, rand, deco.randomBlocks); + this.generateBox(world, sbb, 15, 1, 1, 15, 12, 1, false, rand, deco.randomBlocks); + + this.generateBox(world, sbb, 1, 1, 15, 1, 12, 16, false, rand, deco.randomBlocks); + this.generateBox(world, sbb, 2, 1, 16, 2, 12, 16, false, rand, deco.randomBlocks); + + this.generateBox(world, sbb, 16, 1, 15, 16, 12, 16, false, rand, deco.randomBlocks); + this.generateBox(world, sbb, 15, 1, 16, 15, 12, 16, false, rand, deco.randomBlocks); + + // grass + BlockState grass = Blocks.GRASS_BLOCK.defaultBlockState(); + this.generateMaybeBox(world, sbb, rand, 0.5F, 6, 0, 6, 11, 0, 11, grass, grass, false, false); + this.generateBox(world, sbb, 7, 0, 7, 10, 0, 10, grass, AIR, false); + + // tree + this.spawnATree(world, generator, rand.nextInt(5), 8, 1, 8, sbb); + + // statues + placeCornerStatue(world, 2, 8, 2, 0, sbb); + placeCornerStatue(world, 2, 1, 15, 1, sbb); + placeCornerStatue(world, 15, 1, 2, 2, sbb); + placeCornerStatue(world, 15, 8, 15, 3, sbb); + + // doors + placeDoors(world, sbb); + } + + private void spawnATree(WorldGenLevel world, ChunkGenerator generator, int treeNum, int x, int y, int z, BoundingBox sbb) { + BlockPos pos = getBlockPosWithOffset(x, y, z); + + if (sbb.isInside(pos)) { + ResourceKey> treeGen = switch (treeNum) { + case 1 -> + // jungle tree + TreeFeatures.JUNGLE_TREE; + case 2 -> + // birch + TreeFeatures.BIRCH; + case 3 -> TFConfiguredFeatures.TWILIGHT_OAK_TREE; + case 4 -> TFConfiguredFeatures.RAINBOW_OAK_TREE; + default -> + // oak tree + TreeFeatures.OAK; + }; + // grow a tree + + for (int i = 0; i < 100; i++) { + if (world.registryAccess().registryOrThrow(Registries.CONFIGURED_FEATURE).get(treeGen).place(world, generator, world.getRandom(), pos)) { + break; + } + } + } + } + + private void placeBalconyPillar(WorldGenLevel world, BoundingBox sbb, Rotation rotation) { + this.fillBlocksRotated(world, sbb, 5, 1, 5, 5, 12, 5, deco.pillarState, rotation); + this.setBlockStateRotated(world, getStairState(deco.stairState, Rotation.COUNTERCLOCKWISE_90.rotate(Direction.WEST), false), 5, 1, 6, rotation, sbb); + this.setBlockStateRotated(world, getStairState(deco.stairState, Rotation.CLOCKWISE_180.rotate(Direction.WEST), false), 6, 1, 5, rotation, sbb); + this.setBlockStateRotated(world, getStairState(deco.stairState, Rotation.COUNTERCLOCKWISE_90.rotate(Direction.WEST), true), 5, 5, 6, rotation, sbb); + this.setBlockStateRotated(world, getStairState(deco.stairState, Rotation.CLOCKWISE_180.rotate(Direction.WEST), true), 6, 5, 5, rotation, sbb); + this.setBlockStateRotated(world, getStairState(deco.stairState, Rotation.COUNTERCLOCKWISE_90.rotate(Direction.WEST), true), 5, 12, 6, rotation, sbb); + this.setBlockStateRotated(world, getStairState(deco.stairState, Rotation.CLOCKWISE_180.rotate(Direction.WEST), true), 6, 12, 5, rotation, sbb); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/stronghold/StrongholdBalconyRoomComponent.java b/src/main/java/twilightforest/world/components/structures/stronghold/StrongholdBalconyRoomComponent.java new file mode 100644 index 0000000000..010f5370b5 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/stronghold/StrongholdBalconyRoomComponent.java @@ -0,0 +1,146 @@ +package twilightforest.world.components.structures.stronghold; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFStructurePieceTypes; + + +public class StrongholdBalconyRoomComponent extends StructureTFStrongholdComponent { + + boolean enterBottom; + + public StrongholdBalconyRoomComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFSBalR.get(), nbt); + this.enterBottom = nbt.getBoolean("enterBottom"); + } + + public StrongholdBalconyRoomComponent(int i, Direction facing, int x, int y, int z) { + super(TFStructurePieceTypes.TFSBalR.get(), i, facing, x, y, z); + } + + @Override + protected void addAdditionalSaveData(StructurePieceSerializationContext ctx, CompoundTag tagCompound) { + super.addAdditionalSaveData(ctx, tagCompound); + tagCompound.putBoolean("enterBottom", this.enterBottom); + } + + @Override + public BoundingBox generateBoundingBox(Direction facing, int x, int y, int z) { + + if (y > -15) { // FIXME + this.enterBottom = false; + } else if (y < -21) { + this.enterBottom = true; + } else { + this.enterBottom = (z & 1) == 0; + } + + if (enterBottom) { + return StructureTFStrongholdComponent.getComponentToAddBoundingBox(x, y, z, -4, -1, 0, 18, 14, 27, facing); + } else { + // enter on the top + return StructureTFStrongholdComponent.getComponentToAddBoundingBox(x, y, z, -13, -8, 0, 18, 14, 27, facing); + } + } + + @Override + public void addChildren(StructurePiece parent, StructurePieceAccessor list, RandomSource random) { + super.addChildren(parent, list, random); + + // lower left exit + addNewComponent(parent, list, random, Rotation.NONE, 13, 1, 27); + + // lower middle right exit + addNewComponent(parent, list, random, Rotation.CLOCKWISE_90, -1, 1, 13); + + // lower middle left exit + addNewComponent(parent, list, random, Rotation.CLOCKWISE_180, 18, 1, 13); + + // upper left exit + addNewComponent(parent, list, random, Rotation.NONE, 4, 8, 27); + + // upper close right exit + addNewComponent(parent, list, random, Rotation.CLOCKWISE_90, -1, 8, 4); + + // upper far left exit + addNewComponent(parent, list, random, Rotation.COUNTERCLOCKWISE_90, 18, 8, 22); + + if (this.enterBottom) { + this.addDoor(4, 1, 0); + //this.addDoor(4, 1, 1); + addNewComponent(parent, list, random, Rotation.CLOCKWISE_180, 13, 8, -1); + } else { + this.addDoor(13, 8, 0); + //this.addDoor(13, 8, 1); + addNewComponent(parent, list, random, Rotation.CLOCKWISE_180, 4, 1, -1); + } + } + + /** + * Generate the blocks that go here + */ + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + placeStrongholdWalls(world, sbb, 0, 0, 0, 17, 13, 26, rand, deco.randomBlocks); + + // balcony + this.generateBox(world, sbb, 1, 6, 1, 16, 7, 25, false, rand, deco.randomBlocks); + this.generateBox(world, sbb, 4, 8, 4, 13, 8, 22, deco.fenceState, Blocks.AIR.defaultBlockState(), false); + this.generateAirBox(world, sbb, 5, 6, 5, 12, 8, 21); + + // stairs & pillars + placeStairsAndPillars(world, sbb, Rotation.NONE); + placeStairsAndPillars(world, sbb, Rotation.CLOCKWISE_180); + + // doors + placeDoors(world, sbb); + } + + private void placeStairsAndPillars(WorldGenLevel world, BoundingBox sbb, Rotation rotation) { + this.fillBlocksRotated(world, sbb, 4, 1, 4, 4, 12, 4, deco.pillarState, rotation); + this.setBlockStateRotated(world, getStairState(deco.stairState, Rotation.COUNTERCLOCKWISE_90.rotate(Direction.WEST), false), 4, 1, 5, rotation, sbb); + this.setBlockStateRotated(world, getStairState(deco.stairState, Rotation.CLOCKWISE_180.rotate(Direction.WEST), false), 5, 1, 4, rotation, sbb); + this.setBlockStateRotated(world, getStairState(deco.stairState, Rotation.COUNTERCLOCKWISE_90.rotate(Direction.WEST), true), 4, 5, 5, rotation, sbb); + this.setBlockStateRotated(world, getStairState(deco.stairState, Rotation.CLOCKWISE_180.rotate(Direction.WEST), true), 5, 5, 4, rotation, sbb); + this.setBlockStateRotated(world, getStairState(deco.stairState, Rotation.COUNTERCLOCKWISE_90.rotate(Direction.WEST), true), 4, 12, 5, rotation, sbb); + this.setBlockStateRotated(world, getStairState(deco.stairState, Rotation.CLOCKWISE_180.rotate(Direction.WEST), true), 5, 12, 4, rotation, sbb); + + this.fillBlocksRotated(world, sbb, 13, 1, 4, 13, 12, 4, deco.pillarState, rotation); + this.setBlockStateRotated(world, getStairState(deco.stairState, Rotation.COUNTERCLOCKWISE_90.rotate(Direction.WEST), false), 13, 1, 5, rotation, sbb); + this.setBlockStateRotated(world, getStairState(deco.stairState, Rotation.NONE.rotate(Direction.WEST), false), 12, 1, 4, rotation, sbb); + this.setBlockStateRotated(world, getStairState(deco.stairState, Rotation.COUNTERCLOCKWISE_90.rotate(Direction.WEST), true), 13, 5, 5, rotation, sbb); + this.setBlockStateRotated(world, getStairState(deco.stairState, Rotation.NONE.rotate(Direction.WEST), true), 12, 5, 4, rotation, sbb); + this.setBlockStateRotated(world, getStairState(deco.stairState, Rotation.COUNTERCLOCKWISE_90.rotate(Direction.WEST), true), 13, 12, 5, rotation, sbb); + this.setBlockStateRotated(world, getStairState(deco.stairState, Rotation.NONE.rotate(Direction.WEST), true), 12, 12, 4, rotation, sbb); + + this.fillBlocksRotated(world, sbb, 13, 1, 8, 13, 12, 8, deco.pillarState, rotation); + this.setBlockStateRotated(world, getStairState(deco.stairState, Rotation.COUNTERCLOCKWISE_90.rotate(Direction.WEST), false), 13, 1, 9, rotation, sbb); + this.setBlockStateRotated(world, getStairState(deco.stairState, Rotation.CLOCKWISE_90.rotate(Direction.WEST), false), 13, 1, 7, rotation, sbb); + this.setBlockStateRotated(world, getStairState(deco.stairState, Rotation.NONE.rotate(Direction.WEST), false), 12, 1, 8, rotation, sbb); + this.setBlockStateRotated(world, getStairState(deco.stairState, Rotation.COUNTERCLOCKWISE_90.rotate(Direction.WEST), true), 13, 5, 9, rotation, sbb); + this.setBlockStateRotated(world, getStairState(deco.stairState, Rotation.CLOCKWISE_90.rotate(Direction.WEST), true), 13, 5, 7, rotation, sbb); + this.setBlockStateRotated(world, getStairState(deco.stairState, Rotation.COUNTERCLOCKWISE_90.rotate(Direction.WEST), true), 13, 12, 9, rotation, sbb); + this.setBlockStateRotated(world, getStairState(deco.stairState, Rotation.CLOCKWISE_90.rotate(Direction.WEST), true), 13, 12, 7, rotation, sbb); + this.setBlockStateRotated(world, getStairState(deco.stairState, Rotation.NONE.rotate(Direction.WEST), true), 12, 12, 8, rotation, sbb); + + for (int y = 1; y < 8; y++) { + for (int z = 5; z < 8; z++) { + this.setBlockStateRotated(world, AIR, y + 6, y + 1, z, rotation, sbb); + this.setBlockStateRotated(world, getStairState(deco.stairState, Rotation.NONE.rotate(Direction.WEST), false), y + 6, y, z, rotation, sbb); + this.setBlockStateRotated(world, deco.blockState, y + 6, y - 1, z, rotation, sbb); + } + } + } +} diff --git a/src/main/java/twilightforest/world/components/structures/stronghold/StrongholdBossRoomComponent.java b/src/main/java/twilightforest/world/components/structures/stronghold/StrongholdBossRoomComponent.java new file mode 100644 index 0000000000..27494e6204 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/stronghold/StrongholdBossRoomComponent.java @@ -0,0 +1,171 @@ +package twilightforest.world.components.structures.stronghold; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFStructurePieceTypes; + + +public class StrongholdBossRoomComponent extends StructureTFStrongholdComponent { + + public StrongholdBossRoomComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFSBR.get(), nbt); + } + + public StrongholdBossRoomComponent(int i, Direction facing, int x, int y, int z) { + super(TFStructurePieceTypes.TFSBR.get(), i, facing, x, y, z); + this.spawnListIndex = Integer.MAX_VALUE; + } + + @Override + public BoundingBox generateBoundingBox(Direction facing, int x, int y, int z) { + return StructureTFStrongholdComponent.getComponentToAddBoundingBox(x, y, z, -13, -1, 0, 27, 7, 27, facing); + } + + @Override + public void addChildren(StructurePiece parent, StructurePieceAccessor list, RandomSource random) { + super.addChildren(parent, list, random); + + this.addDoor(13, 1, 0); + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + placeStrongholdWalls(world, sbb, 0, 0, 0, 26, 6, 26, rand, deco.randomBlocks); + + // inner walls + this.generateBox(world, sbb, 1, 1, 1, 3, 5, 25, false, rand, deco.randomBlocks); + this.generateBox(world, sbb, 23, 1, 1, 25, 5, 25, false, rand, deco.randomBlocks); + this.generateBox(world, sbb, 4, 1, 1, 22, 5, 3, false, rand, deco.randomBlocks); + this.generateBox(world, sbb, 4, 1, 23, 22, 5, 25, false, rand, deco.randomBlocks); + + // obsidian filler + this.generateBox(world, sbb, 1, 1, 1, 2, 5, 25, Blocks.OBSIDIAN.defaultBlockState(), Blocks.OBSIDIAN.defaultBlockState(), false); + this.generateBox(world, sbb, 24, 1, 1, 25, 5, 25, Blocks.OBSIDIAN.defaultBlockState(), Blocks.OBSIDIAN.defaultBlockState(), false); + this.generateBox(world, sbb, 4, 1, 1, 22, 5, 2, Blocks.OBSIDIAN.defaultBlockState(), Blocks.OBSIDIAN.defaultBlockState(), false); + this.generateBox(world, sbb, 4, 1, 24, 22, 5, 25, Blocks.OBSIDIAN.defaultBlockState(), Blocks.OBSIDIAN.defaultBlockState(), false); + + // corner pillars + this.generateBox(world, sbb, 4, 1, 4, 4, 5, 7, false, rand, deco.randomBlocks); + this.generateBox(world, sbb, 5, 1, 4, 5, 5, 5, false, rand, deco.randomBlocks); + this.generateBox(world, sbb, 6, 1, 4, 7, 5, 4, false, rand, deco.randomBlocks); + + this.generateBox(world, sbb, 4, 1, 19, 4, 5, 22, false, rand, deco.randomBlocks); + this.generateBox(world, sbb, 5, 1, 21, 5, 5, 22, false, rand, deco.randomBlocks); + this.generateBox(world, sbb, 6, 1, 22, 7, 5, 22, false, rand, deco.randomBlocks); + + this.generateBox(world, sbb, 22, 1, 4, 22, 5, 7, false, rand, deco.randomBlocks); + this.generateBox(world, sbb, 21, 1, 4, 21, 5, 5, false, rand, deco.randomBlocks); + this.generateBox(world, sbb, 19, 1, 4, 20, 5, 4, false, rand, deco.randomBlocks); + + this.generateBox(world, sbb, 22, 1, 19, 22, 5, 22, false, rand, deco.randomBlocks); + this.generateBox(world, sbb, 21, 1, 21, 21, 5, 22, false, rand, deco.randomBlocks); + this.generateBox(world, sbb, 19, 1, 22, 20, 5, 22, false, rand, deco.randomBlocks); + + // pillar decorations (stairs) + placePillarDecorations(world, sbb, Rotation.NONE); + placePillarDecorations(world, sbb, Rotation.CLOCKWISE_90); + placePillarDecorations(world, sbb, Rotation.CLOCKWISE_180); + placePillarDecorations(world, sbb, Rotation.COUNTERCLOCKWISE_90); + + // sarcophagi + placeSarcophagus(world, sbb, 8, 1, 8, Rotation.NONE); + placeSarcophagus(world, sbb, 13, 1, 8, Rotation.NONE); + placeSarcophagus(world, sbb, 18, 1, 8, Rotation.NONE); + + placeSarcophagus(world, sbb, 8, 1, 15, Rotation.NONE); + placeSarcophagus(world, sbb, 13, 1, 15, Rotation.NONE); + placeSarcophagus(world, sbb, 18, 1, 15, Rotation.NONE); + + // doorway + this.generateAirBox(world, sbb, 12, 1, 1, 14, 4, 2); + this.generateBox(world, sbb, 12, 1, 3, 14, 4, 3, Blocks.IRON_BARS.defaultBlockState(), Blocks.IRON_BARS.defaultBlockState(), false); + + //spawner + placeBlock(world, TFBlocks.KNIGHT_PHANTOM_BOSS_SPAWNER.get().defaultBlockState(), 13, 2, 13, sbb); + + // doors + placeDoors(world, sbb); + } + + private void placeSarcophagus(WorldGenLevel world, BoundingBox sbb, int x, int y, int z, Rotation rotation) { + + this.setBlockStateRotated(world, deco.pillarState, x - 1, y, z, rotation, sbb); + this.setBlockStateRotated(world, deco.pillarState, x + 1, y, z + 3, rotation, sbb); + this.setBlockStateRotated(world, deco.pillarState, x + 1, y, z, rotation, sbb); + this.setBlockStateRotated(world, deco.pillarState, x - 1, y, z + 3, rotation, sbb); + + // make either torches or fence posts + + if (world.getRandom().nextInt(7) == 0) { + this.setBlockStateRotated(world, Blocks.TORCH.defaultBlockState(), x + 1, y + 1, z, rotation, sbb); + } else { + this.setBlockStateRotated(world, deco.fenceState, x + 1, y + 1, z, rotation, sbb); + } + if (world.getRandom().nextInt(7) == 0) { + this.setBlockStateRotated(world, Blocks.TORCH.defaultBlockState(), x - 1, y + 1, z, rotation, sbb); + } else { + this.setBlockStateRotated(world, deco.fenceState, x - 1, y + 1, z, rotation, sbb); + } + if (world.getRandom().nextInt(7) == 0) { + this.setBlockStateRotated(world, Blocks.TORCH.defaultBlockState(), x + 1, y + 1, z + 3, rotation, sbb); + } else { + this.setBlockStateRotated(world, deco.fenceState, x + 1, y + 1, z + 3, rotation, sbb); + } + if (world.getRandom().nextInt(7) == 0) { + this.setBlockStateRotated(world, Blocks.TORCH.defaultBlockState(), x - 1, y + 1, z + 3, rotation, sbb); + } else { + this.setBlockStateRotated(world, deco.fenceState, x - 1, y + 1, z + 3, rotation, sbb); + } + + this.setBlockStateRotated(world, getStairState(deco.stairState, Rotation.CLOCKWISE_90.rotate(Direction.WEST), false), x, y, z, rotation, sbb); + this.setBlockStateRotated(world, getStairState(deco.stairState, Rotation.COUNTERCLOCKWISE_90.rotate(Direction.WEST), false), x, y, z + 3, rotation, sbb); + + this.setBlockStateRotated(world, getStairState(deco.stairState, Rotation.CLOCKWISE_180.rotate(Direction.WEST), false), x + 1, y, z + 1, rotation, sbb); + this.setBlockStateRotated(world, getStairState(deco.stairState, Rotation.CLOCKWISE_180.rotate(Direction.WEST), false), x + 1, y, z + 2, rotation, sbb); + this.setBlockStateRotated(world, getStairState(deco.stairState, Rotation.NONE.rotate(Direction.WEST), false), x - 1, y, z + 1, rotation, sbb); + this.setBlockStateRotated(world, getStairState(deco.stairState, Rotation.NONE.rotate(Direction.WEST), false), x - 1, y, z + 2, rotation, sbb); + + this.setBlockStateRotated(world, Blocks.SMOOTH_STONE_SLAB.defaultBlockState(), x, y + 1, z + 1, rotation, sbb); + this.setBlockStateRotated(world, Blocks.SMOOTH_STONE_SLAB.defaultBlockState(), x, y + 1, z + 2, rotation, sbb); + } + + protected void placePillarDecorations(WorldGenLevel world, BoundingBox sbb, Rotation rotation) { + this.setBlockStateRotated(world, getStairState(deco.stairState, Rotation.COUNTERCLOCKWISE_90.rotate(Direction.WEST), false), 4, 1, 8, rotation, sbb); + this.setBlockStateRotated(world, getStairState(deco.stairState, Rotation.CLOCKWISE_180.rotate(Direction.WEST), false), 8, 1, 4, rotation, sbb); + this.setBlockStateRotated(world, getStairState(deco.stairState, Rotation.COUNTERCLOCKWISE_90.rotate(Direction.WEST), true), 4, 5, 8, rotation, sbb); + this.setBlockStateRotated(world, getStairState(deco.stairState, Rotation.CLOCKWISE_180.rotate(Direction.WEST), true), 8, 5, 4, rotation, sbb); + this.setBlockStateRotated(world, getStairState(deco.stairState, Rotation.COUNTERCLOCKWISE_90.rotate(Direction.WEST), false), 5, 1, 6, rotation, sbb); + this.setBlockStateRotated(world, getStairState(deco.stairState, Rotation.CLOCKWISE_180.rotate(Direction.WEST), false), 6, 1, 6, rotation, sbb); + this.setBlockStateRotated(world, getStairState(deco.stairState, Rotation.CLOCKWISE_180.rotate(Direction.WEST), false), 6, 1, 5, rotation, sbb); + this.setBlockStateRotated(world, getStairState(deco.stairState, Rotation.COUNTERCLOCKWISE_90.rotate(Direction.WEST), true), 5, 5, 6, rotation, sbb); + this.setBlockStateRotated(world, getStairState(deco.stairState, Rotation.CLOCKWISE_180.rotate(Direction.WEST), true), 6, 5, 6, rotation, sbb); + this.setBlockStateRotated(world, getStairState(deco.stairState, Rotation.CLOCKWISE_180.rotate(Direction.WEST), true), 6, 5, 5, rotation, sbb); + } + + @Override + protected void placeDoorwayAt(WorldGenLevel world, int x, int y, int z, BoundingBox sbb) { + if (x == 0 || x == getXSize()) { + this.generateBox(world, sbb, x, y, z - 1, x, y + 3, z + 1, Blocks.IRON_BARS.defaultBlockState(), Blocks.AIR.defaultBlockState(), false); + } else { + this.generateBox(world, sbb, x - 1, y, z, x + 1, y + 3, z, Blocks.IRON_BARS.defaultBlockState(), Blocks.AIR.defaultBlockState(), false); + } + } + + @Override + protected boolean isValidBreakInPoint(int wx, int wy, int wz) { + return false; + } +} diff --git a/src/main/java/twilightforest/world/components/structures/stronghold/StrongholdCrossingComponent.java b/src/main/java/twilightforest/world/components/structures/stronghold/StrongholdCrossingComponent.java new file mode 100644 index 0000000000..acdc15e3d2 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/stronghold/StrongholdCrossingComponent.java @@ -0,0 +1,88 @@ +package twilightforest.world.components.structures.stronghold; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.StairBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFStructurePieceTypes; + + +public class StrongholdCrossingComponent extends StructureTFStrongholdComponent { + + public StrongholdCrossingComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFSCr.get(), nbt); + } + + public StrongholdCrossingComponent(int i, Direction facing, int x, int y, int z) { + super(TFStructurePieceTypes.TFSCr.get(), i, facing, x, y, z); + } + + @Override + public BoundingBox generateBoundingBox(Direction facing, int x, int y, int z) { + return StructureTFStrongholdComponent.getComponentToAddBoundingBox(x, y, z, -13, -1, 0, 18, 7, 18, facing); + } + + @Override + public void addChildren(StructurePiece parent, StructurePieceAccessor list, RandomSource random) { + super.addChildren(parent, list, random); + + this.addDoor(13, 1, 0); + addNewComponent(parent, list, random, Rotation.NONE, 4, 1, 18); + addNewComponent(parent, list, random, Rotation.CLOCKWISE_90, -1, 1, 13); + addNewComponent(parent, list, random, Rotation.COUNTERCLOCKWISE_90, 18, 1, 4); + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + placeStrongholdWalls(world, sbb, 0, 0, 0, 17, 6, 17, rand, deco.randomBlocks); + + // statues + placeCornerStatue(world, 2, 1, 2, 0, sbb); + placeCornerStatue(world, 15, 1, 15, 3, sbb); + + // center pillar + this.fillBlocksRotated(world, sbb, 8, 1, 8, 9, 5, 9, deco.pillarState, Rotation.NONE); + + // statues + placeWallStatue(world, 8, 1, 7, Rotation.NONE, sbb); + placeWallStatue(world, 7, 1, 9, Rotation.COUNTERCLOCKWISE_90, sbb); + placeWallStatue(world, 9, 1, 10, Rotation.CLOCKWISE_180, sbb); + placeWallStatue(world, 10, 1, 8, Rotation.CLOCKWISE_90, sbb); + + // tables + placeTableAndChairs(world, sbb, Rotation.NONE); + placeTableAndChairs(world, sbb, Rotation.CLOCKWISE_90); + placeTableAndChairs(world, sbb, Rotation.CLOCKWISE_180); + placeTableAndChairs(world, sbb, Rotation.COUNTERCLOCKWISE_90); + + // doors + placeDoors(world, sbb); + } + + private void placeTableAndChairs(WorldGenLevel world, BoundingBox sbb, Rotation rotation) { + // table + BlockState oakStairs = Blocks.OAK_STAIRS.defaultBlockState(); + + this.setBlockStateRotated(world, getStairState(oakStairs, Rotation.NONE.rotate(Direction.WEST), true), 5, 1, 3, rotation, sbb); + this.setBlockStateRotated(world, getStairState(oakStairs, Rotation.COUNTERCLOCKWISE_90.rotate(Direction.WEST), true), 5, 1, 4, rotation, sbb); + this.setBlockStateRotated(world, getStairState(oakStairs, Rotation.CLOCKWISE_90.rotate(Direction.WEST), true), 6, 1, 3, rotation, sbb); + this.setBlockStateRotated(world, getStairState(oakStairs, Rotation.CLOCKWISE_180.rotate(Direction.WEST), true), 6, 1, 4, rotation, sbb); + // chairs + this.setBlockStateRotated(world, Blocks.SPRUCE_STAIRS.defaultBlockState().setValue(StairBlock.FACING, Rotation.COUNTERCLOCKWISE_90.rotate(Direction.WEST)), 5, 1, 2, rotation, sbb); + this.setBlockStateRotated(world, Blocks.SPRUCE_STAIRS.defaultBlockState().setValue(StairBlock.FACING, Rotation.NONE.rotate(Direction.WEST)), 7, 1, 3, rotation, sbb); + this.setBlockStateRotated(world, Blocks.SPRUCE_STAIRS.defaultBlockState().setValue(StairBlock.FACING, Rotation.CLOCKWISE_90.rotate(Direction.WEST)), 6, 1, 5, rotation, sbb); + this.setBlockStateRotated(world, Blocks.SPRUCE_STAIRS.defaultBlockState().setValue(StairBlock.FACING, Rotation.CLOCKWISE_180.rotate(Direction.WEST)), 4, 1, 4, rotation, sbb); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/stronghold/StrongholdDeadEndComponent.java b/src/main/java/twilightforest/world/components/structures/stronghold/StrongholdDeadEndComponent.java new file mode 100644 index 0000000000..d826ebfdee --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/stronghold/StrongholdDeadEndComponent.java @@ -0,0 +1,83 @@ +package twilightforest.world.components.structures.stronghold; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.StairBlock; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFStructurePieceTypes; +import twilightforest.loot.TFLootTables; + + +public class StrongholdDeadEndComponent extends StructureTFStrongholdComponent { + + private boolean chestTrapped; + + public StrongholdDeadEndComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFSDE.get(), nbt); + this.chestTrapped = nbt.getBoolean("chestTrapped"); + } + + public StrongholdDeadEndComponent(int i, Direction facing, int x, int y, int z) { + super(TFStructurePieceTypes.TFSDE.get(), i, facing, x, y, z); + } + + @Override + protected void addAdditionalSaveData(StructurePieceSerializationContext ctx, CompoundTag tagCompound) { + super.addAdditionalSaveData(ctx, tagCompound); + tagCompound.putBoolean("chestTrapped", this.chestTrapped); + } + + @Override + public BoundingBox generateBoundingBox(Direction facing, int x, int y, int z) { + return StructureTFStrongholdComponent.getComponentToAddBoundingBox(x, y, z, -4, -1, 0, 9, 6, 9, facing); + } + + @Override + public void addChildren(StructurePiece parent, StructurePieceAccessor list, RandomSource random) { + super.addChildren(parent, list, random); + + // entrance + this.addDoor(4, 1, 0); + + this.chestTrapped = random.nextInt(3) == 0; + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + placeStrongholdWalls(world, sbb, 0, 0, 0, 8, 6, 8, rand, deco.randomBlocks); + + // statues + this.placeWallStatue(world, 1, 1, 4, Rotation.CLOCKWISE_90, sbb); + this.placeWallStatue(world, 7, 1, 4, Rotation.COUNTERCLOCKWISE_90, sbb); + this.placeWallStatue(world, 4, 1, 7, Rotation.NONE, sbb); + + // doors + placeDoors(world, sbb); + + // treasure + this.manualTreaurePlacement(world, 4, 1, 3, Direction.SOUTH, TFLootTables.STRONGHOLD_CACHE, this.chestTrapped, sbb); + if (this.chestTrapped) { + this.placeBlock(world, Blocks.TNT.defaultBlockState(), 4, 0, 3, sbb); + } + + for (int z = 2; z < 5; z++) { + this.placeBlock(world, deco.stairState.setValue(StairBlock.FACING, Direction.WEST), 3, 1, z, sbb); + this.placeBlock(world, deco.stairState.setValue(StairBlock.FACING, Direction.EAST), 5, 1, z, sbb); + } + + this.placeBlock(world, deco.stairState.setValue(StairBlock.FACING, Direction.NORTH), 4, 1, 2, sbb); + this.placeBlock(world, deco.stairState.setValue(StairBlock.FACING, Direction.SOUTH), 4, 1, 4, sbb); + this.placeBlock(world, deco.stairState.setValue(StairBlock.FACING, Direction.NORTH), 4, 2, 3, sbb); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/stronghold/StrongholdDecorator.java b/src/main/java/twilightforest/world/components/structures/stronghold/StrongholdDecorator.java new file mode 100644 index 0000000000..47fdbaf0a3 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/stronghold/StrongholdDecorator.java @@ -0,0 +1,20 @@ +package twilightforest.world.components.structures.stronghold; + +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.SlabBlock; +import net.minecraft.world.level.block.state.properties.SlabType; +import twilightforest.init.TFBlocks; +import twilightforest.world.components.structures.TFStructureDecorator; + +public class StrongholdDecorator extends TFStructureDecorator { + + public StrongholdDecorator() { + this.blockState = TFBlocks.UNDERBRICK.get().defaultBlockState(); + this.accentState = TFBlocks.CRACKED_UNDERBRICK.get().defaultBlockState(); + this.fenceState = Blocks.COBBLESTONE_WALL.defaultBlockState(); + this.stairState = Blocks.STONE_BRICK_STAIRS.defaultBlockState(); + this.pillarState = Blocks.MOSSY_STONE_BRICKS.defaultBlockState(); + this.platformState = Blocks.SMOOTH_STONE_SLAB.defaultBlockState().setValue(SlabBlock.TYPE, SlabType.TOP); + this.randomBlocks = new KnightStones(); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/stronghold/StrongholdEntranceComponent.java b/src/main/java/twilightforest/world/components/structures/stronghold/StrongholdEntranceComponent.java new file mode 100644 index 0000000000..370f4e6ea7 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/stronghold/StrongholdEntranceComponent.java @@ -0,0 +1,149 @@ +package twilightforest.world.components.structures.stronghold; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePiecesBuilder; +import twilightforest.TwilightForestMod; +import twilightforest.init.TFStructurePieceTypes; +import twilightforest.util.BoundingBoxUtils; + +import java.util.List; + + +public class StrongholdEntranceComponent extends StructureTFStrongholdComponent { + + public final StrongholdPieces lowerPieces; + + public StrongholdEntranceComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFSEnter.get(), nbt); + + this.deco = new StrongholdDecorator(); + + lowerPieces = new StrongholdPieces(); + } + + public StrongholdEntranceComponent(int i, int x, int y, int z) { + super(TFStructurePieceTypes.TFSEnter.get(), i, Direction.SOUTH, x, y - 10, z); + + this.deco = new StrongholdDecorator(); + + lowerPieces = new StrongholdPieces(); + } + + @Override + public void addChildren(StructurePiece parent, StructurePieceAccessor old, RandomSource random) { + super.addChildren(parent, old, random); + + if (old instanceof StructurePiecesBuilder start) { + List list = start.pieces; + + // make a random component in each direction + lowerPieces.prepareStructurePieces(); + addNewComponent(parent, old, random, Rotation.NONE, 4, 1, 18); + lowerPieces.prepareStructurePieces(); + if (listContainsBossRoom(list)) { + lowerPieces.markBossRoomUsed(); + } + addNewComponent(parent, old, random, Rotation.CLOCKWISE_90, -1, 1, 13); + lowerPieces.prepareStructurePieces(); + if (listContainsBossRoom(list)) { + lowerPieces.markBossRoomUsed(); + } + addNewComponent(parent, old, random, Rotation.CLOCKWISE_180, 13, 1, -1); + lowerPieces.prepareStructurePieces(); + if (listContainsBossRoom(list)) { + lowerPieces.markBossRoomUsed(); + } + addNewComponent(parent, old, random, Rotation.COUNTERCLOCKWISE_90, 18, 1, 4); + if (!listContainsBossRoom(list)) { + TwilightForestMod.LOGGER.fatal("Did not find boss room from exit 3 - EPIC FAIL"); + } + BoundingBox shieldBox = BoundingBoxUtils.clone(this.boundingBox); + + int tStairs = 0; + int tCorridors = 0; + int deadEnd = 0; + int tRooms = 0; + int bossRooms = 0; + + // compute and generate MEGASHIELD + for (StructurePiece component : list) { + shieldBox.encapsulate(component.getBoundingBox()); + + + if (component instanceof StrongholdSmallStairsComponent && ((StrongholdSmallStairsComponent) component).hasTreasure) { + tStairs++; + } + if (component instanceof StrongholdTreasureCorridorComponent) { + tCorridors++; + } + if (component instanceof StrongholdDeadEndComponent) { + deadEnd++; + } + if (component instanceof StrongholdTreasureRoomComponent) { + tRooms++; + } + if (component instanceof StrongholdBossRoomComponent) { + bossRooms++; + } + } + +// System.out.printf("MEGASHIELD computed! %d, %d, %d to %d, %d, %d.\n", shieldBox.minX, shieldBox.minY, shieldBox.minZ, shieldBox.maxX, shieldBox.maxY, shieldBox.maxZ); +// System.out.printf("Stronghold at this point contains %d elements.\n", pieceList.size()); +// +// StructureTFStrongholdShield shield = new StructureTFStrongholdShield(shieldBox.minX - 1, shieldBox.minY, shieldBox.minZ - 1, shieldBox.maxX, shieldBox.maxY, shieldBox.maxZ); +// list.add(shield); + + // add the upper stronghold + StructureTFStrongholdComponent accessChamber = new StrongholdAccessChamberComponent(2, this.getOrientation(), boundingBox.minX() + 8, boundingBox.minY() + 7, boundingBox.minZ() + 4); + list.add(accessChamber); + accessChamber.addChildren(this, old, random); + } + } + + private boolean listContainsBossRoom(List list) { + for (StructurePiece component : list) { + if (component instanceof StrongholdBossRoomComponent) { + return true; + } + } + + return false; + } + + @Override + public BoundingBox generateBoundingBox(Direction facing, int x, int y, int z) { + return BoundingBox.orientBox(x, y, z, -1, -1, 0, 18, 7, 18, facing); + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + placeStrongholdWalls(world, sbb, 0, 0, 0, 17, 6, 17, rand, deco.randomBlocks); + + // statues + placeCornerStatue(world, 5, 1, 5, 0, sbb); + placeCornerStatue(world, 5, 1, 12, 1, sbb); + placeCornerStatue(world, 12, 1, 5, 2, sbb); + placeCornerStatue(world, 12, 1, 12, 3, sbb); + + // statues + this.placeWallStatue(world, 9, 1, 16, Rotation.NONE, sbb); + this.placeWallStatue(world, 1, 1, 9, Rotation.CLOCKWISE_90, sbb); + this.placeWallStatue(world, 8, 1, 1, Rotation.CLOCKWISE_180, sbb); + this.placeWallStatue(world, 16, 1, 8, Rotation.COUNTERCLOCKWISE_90, sbb); + + // doors + this.placeDoors(world, sbb); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/stronghold/StrongholdFoundryComponent.java b/src/main/java/twilightforest/world/components/structures/stronghold/StrongholdFoundryComponent.java new file mode 100644 index 0000000000..fc7127acd1 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/stronghold/StrongholdFoundryComponent.java @@ -0,0 +1,200 @@ +package twilightforest.world.components.structures.stronghold; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFStructurePieceTypes; + + +public class StrongholdFoundryComponent extends StructureTFStrongholdComponent { + + int entranceLevel; + boolean deepslateVer; + + public StrongholdFoundryComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFSFo.get(), nbt); + this.deepslateVer = nbt.getBoolean("deepslateVer"); + this.entranceLevel = nbt.getInt("entranceLevel"); + } + + public StrongholdFoundryComponent(int i, Direction facing, int x, int y, int z) { + super(TFStructurePieceTypes.TFSFo.get(), i, facing, x, y, z); + } + + @Override + protected void addAdditionalSaveData(StructurePieceSerializationContext ctx, CompoundTag tagCompound) { + super.addAdditionalSaveData(ctx, tagCompound); + tagCompound.putInt("entranceLevel", this.entranceLevel); + tagCompound.putBoolean("deepslateVer", this.deepslateVer); + } + + @Override + public BoundingBox generateBoundingBox(Direction facing, int x, int y, int z) { + this.deepslateVer = RandomSource.create().nextBoolean(); + if (y > -15) { + this.entranceLevel = 3; + return StructureTFStrongholdComponent.getComponentToAddBoundingBox(x, y, z, -4, -20, 0, 18, 25, 18, facing); + } else if (y < -21) { + this.entranceLevel = 1; + return StructureTFStrongholdComponent.getComponentToAddBoundingBox(x, y, z, -4, -6, 0, 18, 25, 18, facing); + } else { + this.entranceLevel = 2; + return StructureTFStrongholdComponent.getComponentToAddBoundingBox(x, y, z, -4, -13, 0, 18, 25, 18, facing); + } + } + + @Override + public void addChildren(StructurePiece parent, StructurePieceAccessor list, RandomSource random) { + super.addChildren(parent, list, random); + + switch (this.entranceLevel) { + case 1 -> { + this.addDoor(4, 6, 0); + addNewComponent(parent, list, random, Rotation.CLOCKWISE_90, -1, 13, 13); + addNewComponent(parent, list, random, Rotation.COUNTERCLOCKWISE_90, 18, 13, 4); + addNewComponent(parent, list, random, Rotation.NONE, 13, 20, 18); + } + case 2 -> { + this.addDoor(4, 13, 0); + addNewComponent(parent, list, random, Rotation.CLOCKWISE_90, -1, 6, 13); + addNewComponent(parent, list, random, Rotation.COUNTERCLOCKWISE_90, 18, 20, 4); + addNewComponent(parent, list, random, Rotation.NONE, 13, 13, 18); + } + case 3 -> { + this.addDoor(4, 20, 0); + addNewComponent(parent, list, random, Rotation.NONE, 13, 6, 18); + addNewComponent(parent, list, random, Rotation.CLOCKWISE_90, -1, 13, 13); + addNewComponent(parent, list, random, Rotation.COUNTERCLOCKWISE_90, 18, 13, 4); + } + } + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + placeStrongholdWalls(world, sbb, 0, 0, 0, 17, 25, 17, rand, deco.randomBlocks); + + // lava bottom + this.generateBox(world, sbb, 1, 0, 1, 16, 4, 16, Blocks.LAVA.defaultBlockState(), Blocks.LAVA.defaultBlockState(), false); + + // top ledge + this.generateBox(world, sbb, 1, 19, 1, 16, 19, 16, false, rand, deco.randomBlocks); + this.generateAirBox(world, sbb, 2, 19, 2, 15, 19, 15); + + // middle ledge + this.generateBox(world, sbb, 1, 12, 1, 16, 12, 16, false, rand, deco.randomBlocks); + this.generateAirBox(world, sbb, 2, 12, 2, 15, 12, 15); + + // bottom ledge + this.generateBox(world, sbb, 1, 5, 1, 16, 5, 16, false, rand, deco.randomBlocks); + this.generateAirBox(world, sbb, 2, 5, 2, 15, 5, 15); + + // corner pillars + this.generateBox(world, sbb, 1, 1, 1, 1, 24, 2, false, rand, deco.randomBlocks); + this.generateBox(world, sbb, 2, 1, 1, 2, 24, 1, false, rand, deco.randomBlocks); + + this.generateBox(world, sbb, 16, 1, 1, 16, 24, 2, false, rand, deco.randomBlocks); + this.generateBox(world, sbb, 15, 1, 1, 15, 24, 1, false, rand, deco.randomBlocks); + + this.generateBox(world, sbb, 1, 1, 15, 1, 24, 16, false, rand, deco.randomBlocks); + this.generateBox(world, sbb, 2, 1, 16, 2, 24, 16, false, rand, deco.randomBlocks); + + this.generateBox(world, sbb, 16, 1, 15, 16, 24, 16, false, rand, deco.randomBlocks); + this.generateBox(world, sbb, 15, 1, 16, 15, 24, 16, false, rand, deco.randomBlocks); + + // suspended mass + RandomSource massRandom = RandomSource.create(rand.nextLong()); + + for (int x = 4; x < 14; x++) { + for (int z = 4; z < 14; z++) { + for (int y = 8; y < 23; y++) { + float c = Math.abs(x - 8.5F) + Math.abs(z - 8.5F) + Math.abs(y - 18F); + float r = 5.5F + ((massRandom.nextFloat() - massRandom.nextFloat()) * 3.5F); + + if (c < r) { + this.placeBlock(world, deepslateVer ? Blocks.DEEPSLATE.defaultBlockState() : Blocks.STONE.defaultBlockState(), x, y, z, sbb); + } + } + } + } + + // drips + for (int i = 0; i < 400; i++) { + int dx = massRandom.nextInt(9) + 5; + int dz = massRandom.nextInt(9) + 5; + int dy = massRandom.nextInt(13) + 10; + + if (this.getBlock(world, dx, dy, dz, sbb).getBlock() != Blocks.AIR) { + for (int y = 0; y < 3; y++) { + this.placeBlock(world, deepslateVer ? Blocks.DEEPSLATE.defaultBlockState() : Blocks.STONE.defaultBlockState(), dx, dy - y, dz, sbb); + } + } + } + + // add some redstone ore + for (int i = 0; i < 8; i++) { + addOreToMass(world, sbb, massRandom, deepslateVer ? Blocks.DEEPSLATE_REDSTONE_ORE.defaultBlockState() : Blocks.REDSTONE_ORE.defaultBlockState()); + } + + // add some iron ore + for (int i = 0; i < 8; i++) { + addOreToMass(world, sbb, massRandom, deepslateVer ? Blocks.DEEPSLATE_IRON_ORE.defaultBlockState() : Blocks.IRON_ORE.defaultBlockState()); + } + + // add some gold ore + for (int i = 0; i < 6; i++) { + addOreToMass(world, sbb, massRandom, deepslateVer ? Blocks.DEEPSLATE_GOLD_ORE.defaultBlockState() : Blocks.GOLD_ORE.defaultBlockState()); + } + + // add some glowstone + for (int i = 0; i < 2; i++) { + addOreToMass(world, sbb, massRandom, deepslateVer ? Blocks.SHROOMLIGHT.defaultBlockState() : Blocks.GLOWSTONE.defaultBlockState()); + } + + // add some emerald ore + for (int i = 0; i < 2; i++) { + addOreToMass(world, sbb, massRandom, deepslateVer ? Blocks.DEEPSLATE_EMERALD_ORE.defaultBlockState() : Blocks.EMERALD_ORE.defaultBlockState()); + } + + // add some diamond ore + for (int i = 0; i < 4; i++) { + addOreToMass(world, sbb, massRandom, deepslateVer ? Blocks.DEEPSLATE_DIAMOND_ORE.defaultBlockState() : Blocks.DIAMOND_ORE.defaultBlockState()); + } + + // add some copper ore + for (int i = 0; i < 6; i++) { + addOreToMass(world, sbb, massRandom, deepslateVer ? Blocks.DEEPSLATE_COPPER_ORE.defaultBlockState() : Blocks.COPPER_ORE.defaultBlockState()); + } + + // doors + placeDoors(world, sbb); + } + + /** + * Add a block of ore to the mass + */ + private void addOreToMass(WorldGenLevel world, BoundingBox sbb, RandomSource massRandom, BlockState state) { + for (int i = 0; i < 10; i++) { + int dx = massRandom.nextInt(9) + 5; + int dz = massRandom.nextInt(9) + 5; + int dy = massRandom.nextInt(13) + 10; + + if (this.getBlock(world, dx, dy, dz, sbb).getBlock() != Blocks.AIR) { + this.placeBlock(world, state, dx, dy, dz, sbb); + // we have succeeded, stop looping + break; + } + } + } +} diff --git a/src/main/java/twilightforest/world/components/structures/stronghold/StrongholdLeftTurnComponent.java b/src/main/java/twilightforest/world/components/structures/stronghold/StrongholdLeftTurnComponent.java new file mode 100644 index 0000000000..e2cf8d7f49 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/stronghold/StrongholdLeftTurnComponent.java @@ -0,0 +1,64 @@ +package twilightforest.world.components.structures.stronghold; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFStructurePieceTypes; + + +public class StrongholdLeftTurnComponent extends StructureTFStrongholdComponent { + + public StrongholdLeftTurnComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFSLT.get(), nbt); + } + + public StrongholdLeftTurnComponent(int i, Direction facing, int x, int y, int z) { + super(TFStructurePieceTypes.TFSLT.get(), i, facing, x, y, z); + } + + @Override + public BoundingBox generateBoundingBox(Direction facing, int x, int y, int z) { + return StructureTFStrongholdComponent.getComponentToAddBoundingBox(x, y, z, -4, -1, 0, 9, 7, 9, facing); + } + + @Override + public void addChildren(StructurePiece parent, StructurePieceAccessor list, RandomSource random) { + super.addChildren(parent, list, random); + + // entrance + this.addDoor(4, 1, 0); + + // make a random component to the left + addNewComponent(parent, list, random, Rotation.COUNTERCLOCKWISE_90, 9, 1, 4); + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + placeStrongholdWalls(world, sbb, 0, 0, 0, 8, 6, 8, rand, deco.randomBlocks); + + // clear inside + generateAirBox(world, sbb, 1, 1, 1, 7, 5, 7); + +// // entrance doorway +// placeDoorwayAt(world, rand, 2, 4, 1, 0, sbb); +// +// // left turn doorway +// placeDoorwayAt(world, rand, 1, 8, 1, 4, sbb); + + // statue + placeCornerStatue(world, 2, 1, 6, 1, sbb); + + // doors + placeDoors(world, sbb); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/stronghold/StrongholdPieceWeight.java b/src/main/java/twilightforest/world/components/structures/stronghold/StrongholdPieceWeight.java new file mode 100644 index 0000000000..099271ff90 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/stronghold/StrongholdPieceWeight.java @@ -0,0 +1,39 @@ +package twilightforest.world.components.structures.stronghold; + +import twilightforest.world.components.structures.stronghold.StructureTFStrongholdComponent.Factory; + +/** + * Based off StructureStrongholdPieceWeight + */ +public class StrongholdPieceWeight { + + public final Factory factory; + public final int pieceWeight; + public int instancesSpawned; + + /** + * How many Structure Pieces of this type may spawn in a structure + */ + public final int instancesLimit; + public final int minimumDepth; + + public StrongholdPieceWeight(Factory factory, int weight, int limit) { + this(factory, weight, limit, 0); + } + + public StrongholdPieceWeight(Factory factory, int weight, int limit, int minDepth) { + this.factory = factory; + this.pieceWeight = weight; + this.instancesLimit = limit; + this.minimumDepth = minDepth; + } + + public boolean isDeepEnough(int depth) { + return canSpawnMoreStructures() && depth >= this.minimumDepth; + } + + public boolean canSpawnMoreStructures() { + return this.instancesLimit == 0 || this.instancesSpawned < this.instancesLimit; + } + +} diff --git a/src/main/java/twilightforest/world/components/structures/stronghold/StrongholdPieces.java b/src/main/java/twilightforest/world/components/structures/stronghold/StrongholdPieces.java new file mode 100644 index 0000000000..b605679cf1 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/stronghold/StrongholdPieces.java @@ -0,0 +1,111 @@ +package twilightforest.world.components.structures.stronghold; + +import net.minecraft.core.Direction; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; + +import java.util.ArrayList; +import java.util.List; + + +public class StrongholdPieces { + + private static final StrongholdPieceWeight[] pieceWeightArray = new StrongholdPieceWeight[]{ + new StrongholdPieceWeight(StrongholdSmallHallwayComponent::new, 40, 0), + new StrongholdPieceWeight(StrongholdLeftTurnComponent::new, 20, 0), + new StrongholdPieceWeight(StrongholdCrossingComponent::new, 10, 4), + new StrongholdPieceWeight(StrongholdRightTurnComponent::new, 20, 0), + new StrongholdPieceWeight(StrongholdDeadEndComponent::new, 5, 0), + new StrongholdPieceWeight(StrongholdBalconyRoomComponent::new, 10, 3, 2), + new StrongholdPieceWeight(StrongholdTrainingRoomComponent::new, 10, 2), + new StrongholdPieceWeight(StrongholdSmallStairsComponent::new, 10, 0), + new StrongholdPieceWeight(StrongholdTreasureCorridorComponent::new, 5, 0), + new StrongholdPieceWeight(StrongholdAtriumComponent::new, 5, 2, 3), + new StrongholdPieceWeight(StrongholdFoundryComponent::new, 5, 1, 4), + new StrongholdPieceWeight(StrongholdTreasureRoomComponent::new, 5, 1, 4), + new StrongholdPieceWeight(StrongholdBossRoomComponent::new, 15, 1, 4)}; + + private List pieceList; + static int totalWeight = 0; + + private static StrongholdPieceWeight lastPieceMade; + + /** + * sets up Arrays with the Structure pieces and their weights + */ + public void prepareStructurePieces() { + pieceList = new ArrayList<>(); + + for (StrongholdPieceWeight piece : pieceWeightArray) { + piece.instancesSpawned = 0; + pieceList.add(piece); + } + } + + public void markBossRoomUsed() { + // let's assume the boss room is the last one on the list + pieceList.remove(pieceList.size() - 1); + } + + private boolean hasMoreLimitedPieces() { + boolean flag = false; + totalWeight = 0; + + for (StrongholdPieceWeight piece : pieceList) { + totalWeight += piece.pieceWeight; + + if (piece.instancesLimit > 0 && piece.instancesSpawned < piece.instancesLimit) { + flag = true; + } + } + + return flag; + } + + public StructureTFStrongholdComponent getNextComponent(StructurePiece parent, StructurePieceAccessor list, RandomSource random, int index, Direction facing, int x, int y, int z) { + if (!hasMoreLimitedPieces()) { + return null; + } else { + // repeat up to 5 times if we're not getting the right thing + for (int i = 0; i < 5; i++) { + int counter = random.nextInt(totalWeight); + + for (StrongholdPieceWeight piece : pieceList) { + counter -= piece.pieceWeight; + + if (counter < 0) { + + if (!piece.isDeepEnough(index) || piece == lastPieceMade) { + break; + } + + // we're here! + StructureTFStrongholdComponent component = piece.factory.newInstance(index, facing, x, y, z); + + if (list.findCollisionPiece(component.getBoundingBox()) == null) { + ++piece.instancesSpawned; + + if (!piece.canSpawnMoreStructures()) { + pieceList.remove(piece); + } + + lastPieceMade = piece; + + return component; + } + } + } + } + } + + // dead end? + StructureTFStrongholdComponent deadEnd = new StrongholdDeadEndComponent(index, facing, x, y, z); + + if (list.findCollisionPiece(deadEnd.getBoundingBox()) == null) { + return deadEnd; + } else { + return null; + } + } +} diff --git a/src/main/java/twilightforest/world/components/structures/stronghold/StrongholdRightTurnComponent.java b/src/main/java/twilightforest/world/components/structures/stronghold/StrongholdRightTurnComponent.java new file mode 100644 index 0000000000..c55b0bf01e --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/stronghold/StrongholdRightTurnComponent.java @@ -0,0 +1,64 @@ +package twilightforest.world.components.structures.stronghold; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFStructurePieceTypes; + + +public class StrongholdRightTurnComponent extends StructureTFStrongholdComponent { + + public StrongholdRightTurnComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFSRT.get(), nbt); + } + + public StrongholdRightTurnComponent(int i, Direction facing, int x, int y, int z) { + super(TFStructurePieceTypes.TFSRT.get(), i, facing, x, y, z); + } + + @Override + public BoundingBox generateBoundingBox(Direction facing, int x, int y, int z) { + return StructureTFStrongholdComponent.getComponentToAddBoundingBox(x, y, z, -4, -1, 0, 9, 7, 9, facing); + } + + @Override + public void addChildren(StructurePiece parent, StructurePieceAccessor list, RandomSource random) { + super.addChildren(parent, list, random); + + // entrance + this.addDoor(4, 1, 0); + + // make a random component to the right + addNewComponent(parent, list, random, Rotation.CLOCKWISE_90, -1, 1, 4); + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + placeStrongholdWalls(world, sbb, 0, 0, 0, 8, 6, 8, rand, deco.randomBlocks); + + // clear inside + generateAirBox(world, sbb, 1, 1, 1, 7, 5, 7); + +// // entrance doorway +// placeDoorwayAt(world, rand, 2, 4, 1, 0, sbb); +// +// // right turn doorway +// placeDoorwayAt(world, rand, 1, 0, 1, 4, sbb); + + // statue + placeCornerStatue(world, 6, 1, 6, 3, sbb); + + // doors + placeDoors(world, sbb); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/stronghold/StrongholdShieldStructure.java b/src/main/java/twilightforest/world/components/structures/stronghold/StrongholdShieldStructure.java new file mode 100644 index 0000000000..2bcba90b26 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/stronghold/StrongholdShieldStructure.java @@ -0,0 +1,53 @@ +package twilightforest.world.components.structures.stronghold; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.DirectionalBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFStructurePieceTypes; + + +public class StrongholdShieldStructure extends StructureTFStrongholdComponent { + + public StrongholdShieldStructure(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFSShield.get(), nbt); + this.spawnListIndex = -1; + } + + @Override + public BoundingBox generateBoundingBox(Direction facing, int x, int y, int z) { + return null; + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource randomIn, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + BlockState down = TFBlocks.STRONGHOLD_SHIELD.get().defaultBlockState().setValue(DirectionalBlock.FACING, Direction.DOWN); + BlockState up = TFBlocks.STRONGHOLD_SHIELD.get().defaultBlockState().setValue(DirectionalBlock.FACING, Direction.UP); + BlockState north = TFBlocks.STRONGHOLD_SHIELD.get().defaultBlockState().setValue(DirectionalBlock.FACING, Direction.NORTH); + BlockState south = TFBlocks.STRONGHOLD_SHIELD.get().defaultBlockState().setValue(DirectionalBlock.FACING, Direction.SOUTH); + BlockState west = TFBlocks.STRONGHOLD_SHIELD.get().defaultBlockState().setValue(DirectionalBlock.FACING, Direction.WEST); + BlockState east = TFBlocks.STRONGHOLD_SHIELD.get().defaultBlockState().setValue(DirectionalBlock.FACING, Direction.EAST); + + // +x + this.generateBox(world, sbb, this.boundingBox.getXSpan(), 0, 0, this.boundingBox.getXSpan(), this.boundingBox.getYSpan(), this.boundingBox.getZSpan(), west, west, false); + // -x + this.generateBox(world, sbb, 0, 0, 0, 0, this.boundingBox.getYSpan(), this.boundingBox.getZSpan(), east, east, false); + // +z + this.generateBox(world, sbb, 0, 0, this.boundingBox.getZSpan(), this.boundingBox.getXSpan(), this.boundingBox.getYSpan(), this.boundingBox.getZSpan(), north, north, false); + // -z + this.generateBox(world, sbb, 0, 0, 0, this.boundingBox.getXSpan(), this.boundingBox.getYSpan(), 0, south, south, false); + // top + this.generateBox(world, sbb, 0, 0, 0, this.boundingBox.getXSpan(), 0, this.boundingBox.getZSpan(), up, up, false); + // bottom + this.generateBox(world, sbb, 0, this.boundingBox.getYSpan(), 0, this.boundingBox.getXSpan(), this.boundingBox.getYSpan(), this.boundingBox.getZSpan(), down, down, false); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/stronghold/StrongholdSmallHallwayComponent.java b/src/main/java/twilightforest/world/components/structures/stronghold/StrongholdSmallHallwayComponent.java new file mode 100644 index 0000000000..28cd0ef3d4 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/stronghold/StrongholdSmallHallwayComponent.java @@ -0,0 +1,56 @@ +package twilightforest.world.components.structures.stronghold; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFStructurePieceTypes; + + +public class StrongholdSmallHallwayComponent extends StructureTFStrongholdComponent { + + public StrongholdSmallHallwayComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFSSH.get(), nbt); + } + + public StrongholdSmallHallwayComponent(int i, Direction facing, int x, int y, int z) { + super(TFStructurePieceTypes.TFSSH.get(), i, facing, x, y, z); + } + + @Override + public BoundingBox generateBoundingBox(Direction facing, int x, int y, int z) { + return StructureTFStrongholdComponent.getComponentToAddBoundingBox(x, y, z, -4, -1, 0, 9, 7, 18, facing); + } + + @Override + public void addChildren(StructurePiece parent, StructurePieceAccessor list, RandomSource random) { + super.addChildren(parent, list, random); + + // entrance + this.addDoor(4, 1, 0); + + // make a random component at the end + addNewComponent(parent, list, random, Rotation.NONE, 4, 1, 18); + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + placeStrongholdWalls(world, sbb, 0, 0, 0, 8, 6, 17, rand, deco.randomBlocks); + + // statues + this.placeWallStatue(world, 1, 1, 9, Rotation.CLOCKWISE_90, sbb); + this.placeWallStatue(world, 7, 1, 9, Rotation.COUNTERCLOCKWISE_90, sbb); + + // doors + placeDoors(world, sbb); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/stronghold/StrongholdSmallStairsComponent.java b/src/main/java/twilightforest/world/components/structures/stronghold/StrongholdSmallStairsComponent.java new file mode 100644 index 0000000000..885093da04 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/stronghold/StrongholdSmallStairsComponent.java @@ -0,0 +1,128 @@ +package twilightforest.world.components.structures.stronghold; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.StairBlock; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFStructurePieceTypes; +import twilightforest.loot.TFLootTables; + + +public class StrongholdSmallStairsComponent extends StructureTFStrongholdComponent { + + private boolean enterBottom; + public boolean hasTreasure; + public boolean chestTrapped; + + public StrongholdSmallStairsComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFSSS.get(), nbt); + this.enterBottom = nbt.getBoolean("enterBottom"); + this.hasTreasure = nbt.getBoolean("hasTreasure"); + this.chestTrapped = nbt.getBoolean("chestTrapped"); + } + + public StrongholdSmallStairsComponent(int i, Direction facing, int x, int y, int z) { + super(TFStructurePieceTypes.TFSSS.get(), i, facing, x, y, z); + } + + @Override + protected void addAdditionalSaveData(StructurePieceSerializationContext ctx, CompoundTag tagCompound) { + super.addAdditionalSaveData(ctx, tagCompound); + tagCompound.putBoolean("enterBottom", this.enterBottom); + tagCompound.putBoolean("hasTreasure", this.hasTreasure); + tagCompound.putBoolean("chestTrapped", this.chestTrapped); + } + + @Override + public BoundingBox generateBoundingBox(Direction facing, int x, int y, int z) { + + if (y > -15) { // FIXME + this.enterBottom = false; + } else if (y < -21) { + this.enterBottom = true; + } else { + this.enterBottom = (z & 1) == 0; + } + + if (enterBottom) { + return BoundingBox.orientBox(x, y, z, -4, -1, 0, 9, 14, 9, facing); + } else { + // enter on the top + return BoundingBox.orientBox(x, y, z, -4, -8, 0, 9, 14, 9, facing); + } + } + + @Override + public void addChildren(StructurePiece parent, StructurePieceAccessor list, RandomSource random) { + super.addChildren(parent, list, random); + + if (this.enterBottom) { + this.addDoor(4, 1, 0); + addNewComponent(parent, list, random, Rotation.NONE, 4, 8, 9); + } else { + this.addDoor(4, 8, 0); + addNewComponent(parent, list, random, Rotation.NONE, 4, 1, 9); + } + + this.hasTreasure = random.nextBoolean(); + this.chestTrapped = random.nextInt(3) == 0; + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + placeStrongholdWalls(world, sbb, 0, 0, 0, 8, 13, 8, rand, deco.randomBlocks); + + // railing + this.generateBox(world, sbb, 1, 7, 1, 7, 7, 7, deco.platformState, Blocks.AIR.defaultBlockState(), false); + this.generateAirBox(world, sbb, 2, 7, 2, 6, 7, 6); + + Rotation rotation = this.enterBottom ? Rotation.NONE : Rotation.CLOCKWISE_180; + + // stairs + for (int y = 1; y < 8; y++) { + for (int x = 3; x < 6; x++) { + this.setBlockStateRotated(world, Blocks.AIR.defaultBlockState(), x, y + 1, y, rotation, sbb); + this.setBlockStateRotated(world, deco.stairState.setValue(StairBlock.FACING, Direction.NORTH), x, y, y, rotation, sbb); + this.setBlockStateRotated(world, deco.blockState, x, y - 1, y, rotation, sbb); + } + } + + // treasure + if (this.hasTreasure) { + this.placeTreasureRotated(world, 4, 1, 6, getOrientation().getOpposite(), rotation, TFLootTables.STRONGHOLD_CACHE, this.chestTrapped, sbb); + + if (this.chestTrapped) { + this.setBlockStateRotated(world, Blocks.TNT.defaultBlockState(), 4, 0, 6, rotation, sbb); + } + + for (int z = 5; z < 8; z++) { + this.setBlockStateRotated(world, deco.stairState.setValue(StairBlock.FACING, Direction.WEST), 3, 1, z, rotation, sbb); + this.setBlockStateRotated(world, deco.stairState.setValue(StairBlock.FACING, Direction.EAST), 5, 1, z, rotation, sbb); + } + + this.setBlockStateRotated(world, deco.stairState.setValue(StairBlock.FACING, Direction.NORTH), 4, 1, 5, rotation, sbb); + this.setBlockStateRotated(world, deco.stairState.setValue(StairBlock.FACING, Direction.SOUTH), 4, 1, 7, rotation, sbb); + this.setBlockStateRotated(world, deco.stairState.setValue(StairBlock.FACING, Direction.NORTH), 4, 2, 6, rotation, sbb); + } + + if (enterBottom) { + this.placeWallStatue(world, 4, 8, 1, Rotation.CLOCKWISE_180, sbb); + } else { + this.placeWallStatue(world, 4, 8, 7, Rotation.NONE, sbb); + } + + // doors + placeDoors(world, sbb); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/stronghold/StrongholdTrainingRoomComponent.java b/src/main/java/twilightforest/world/components/structures/stronghold/StrongholdTrainingRoomComponent.java new file mode 100644 index 0000000000..47bd866b1a --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/stronghold/StrongholdTrainingRoomComponent.java @@ -0,0 +1,88 @@ +package twilightforest.world.components.structures.stronghold; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.CarvedPumpkinBlock; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFStructurePieceTypes; + + +public class StrongholdTrainingRoomComponent extends StructureTFStrongholdComponent { + + public StrongholdTrainingRoomComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFSTR.get(), nbt); + } + + public StrongholdTrainingRoomComponent(int i, Direction facing, int x, int y, int z) { + super(TFStructurePieceTypes.TFSTR.get(), i, facing, x, y, z); + } + + @Override + public BoundingBox generateBoundingBox(Direction facing, int x, int y, int z) { + return StructureTFStrongholdComponent.getComponentToAddBoundingBox(x, y, z, -13, -1, 0, 18, 7, 18, facing); + } + + @Override + public void addChildren(StructurePiece parent, StructurePieceAccessor list, RandomSource random) { + super.addChildren(parent, list, random); + + this.addDoor(13, 1, 0); + addNewComponent(parent, list, random, Rotation.NONE, 4, 1, 18); + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + placeStrongholdWalls(world, sbb, 0, 0, 0, 17, 6, 17, rand, deco.randomBlocks); + + // statues + placeCornerStatue(world, 2, 1, 2, 0, sbb); + placeCornerStatue(world, 15, 1, 15, 3, sbb); + + // sand floor + this.generateMaybeBox(world, sbb, rand, 0.7F, 4, 0, 4, 8, 0, 8, Blocks.SAND.defaultBlockState(), Blocks.SAND.defaultBlockState(), false, false); + this.generateMaybeBox(world, sbb, rand, 0.7F, 9, 0, 4, 13, 0, 8, Blocks.SAND.defaultBlockState(), Blocks.SAND.defaultBlockState(), false, false); + this.generateMaybeBox(world, sbb, rand, 0.7F, 9, 0, 9, 13, 0, 13, Blocks.SAND.defaultBlockState(), Blocks.SAND.defaultBlockState(), false, false); + + // training dummies + placeTrainingDummy(world, sbb, Rotation.NONE); + placeTrainingDummy(world, sbb, Rotation.CLOCKWISE_90); + placeTrainingDummy(world, sbb, Rotation.CLOCKWISE_180); + + // anvil pad + this.generateBox(world, sbb, 5, 0, 10, 7, 0, 12, Blocks.COBBLESTONE.defaultBlockState(), Blocks.COBBLESTONE.defaultBlockState(), false); + + this.placeBlock(world, deco.pillarState, 5, 1, 12, sbb); + this.placeBlock(world, deco.pillarState, 5, 2, 12, sbb); + this.placeBlock(world, deco.pillarState, 6, 1, 12, sbb); + this.placeBlock(world, deco.stairState.setValue(CarvedPumpkinBlock.FACING, Direction.EAST), 6, 2, 12, sbb); + this.placeBlock(world, deco.stairState.setValue(CarvedPumpkinBlock.FACING, Direction.EAST), 7, 1, 12, sbb); + this.placeBlock(world, deco.pillarState, 5, 1, 11, sbb); + this.placeBlock(world, deco.stairState.setValue(CarvedPumpkinBlock.FACING, Direction.NORTH), 5, 2, 11, sbb); + this.placeBlock(world, deco.stairState.setValue(CarvedPumpkinBlock.FACING, Direction.NORTH), 5, 1, 10, sbb); + + this.placeBlock(world, Blocks.ANVIL.defaultBlockState(), 6, 1, 11, sbb); + + // doors + placeDoors(world, sbb); + } + + private void placeTrainingDummy(WorldGenLevel world, BoundingBox sbb, Rotation rotation) { + this.fillBlocksRotated(world, sbb, 5, 0, 5, 7, 0, 7, Blocks.SAND.defaultBlockState(), rotation); + this.setBlockStateRotated(world, deco.fenceState, 6, 1, 6, rotation, sbb); + this.setBlockStateRotated(world, Blocks.BIRCH_PLANKS.defaultBlockState(), 6, 2, 6, rotation, sbb); + this.setBlockStateRotated(world, Blocks.OAK_FENCE.defaultBlockState(), 5, 2, 6, rotation, sbb); + this.setBlockStateRotated(world, Blocks.OAK_FENCE.defaultBlockState(), 7, 2, 6, rotation, sbb); + this.setBlockStateRotated(world, Blocks.CARVED_PUMPKIN.defaultBlockState().setValue(CarvedPumpkinBlock.FACING, getStructureRelativeRotation(rotation)), 6, 3, 6, rotation, sbb); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/stronghold/StrongholdTreasureCorridorComponent.java b/src/main/java/twilightforest/world/components/structures/stronghold/StrongholdTreasureCorridorComponent.java new file mode 100644 index 0000000000..ab40fb914d --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/stronghold/StrongholdTreasureCorridorComponent.java @@ -0,0 +1,76 @@ +package twilightforest.world.components.structures.stronghold; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.StairBlock; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFStructurePieceTypes; +import twilightforest.loot.TFLootTables; + + +public class StrongholdTreasureCorridorComponent extends StructureTFStrongholdComponent { + + public StrongholdTreasureCorridorComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFSTC.get(), nbt); + } + + public StrongholdTreasureCorridorComponent(int i, Direction facing, int x, int y, int z) { + super(TFStructurePieceTypes.TFSTC.get(), i, facing, x, y, z); + } + + @Override + public BoundingBox generateBoundingBox(Direction facing, int x, int y, int z) { + return StructureTFStrongholdComponent.getComponentToAddBoundingBox(x, y, z, -4, -1, 0, 9, 7, 27, facing); + } + + @Override + public void addChildren(StructurePiece parent, StructurePieceAccessor list, RandomSource random) { + super.addChildren(parent, list, random); + + // entrance + this.addDoor(4, 1, 0); + + // make a random component at the end + addNewComponent(parent, list, random, Rotation.NONE, 4, 1, 27); + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + placeStrongholdWalls(world, sbb, 0, 0, 0, 8, 6, 26, rand, deco.randomBlocks); + + // statues + this.placeWallStatue(world, 1, 1, 9, Rotation.CLOCKWISE_90, sbb); + this.placeWallStatue(world, 1, 1, 17, Rotation.CLOCKWISE_90, sbb); + this.placeWallStatue(world, 7, 1, 9, Rotation.COUNTERCLOCKWISE_90, sbb); + this.placeWallStatue(world, 7, 1, 17, Rotation.COUNTERCLOCKWISE_90, sbb); + + Rotation rotation = (this.boundingBox.minX() ^ this.boundingBox.minZ()) % 2 == 0 ? Rotation.NONE : Rotation.CLOCKWISE_180; + + // treasure! + this.placeTreasureRotated(world, 8, 2, 13, rotation == Rotation.NONE ? getOrientation().getClockWise() : getOrientation().getCounterClockWise(), rotation, TFLootTables.STRONGHOLD_CACHE, sbb); + + // niche! + + this.setBlockStateRotated(world, getStairState(deco.stairState, Direction.SOUTH, true), 8, 3, 12, rotation, sbb); + this.setBlockStateRotated(world, getStairState(deco.stairState, Direction.WEST, true), 8, 3, 13, rotation, sbb); + this.setBlockStateRotated(world, getStairState(deco.stairState, Direction.NORTH, true), 8, 3, 14, rotation, sbb); + this.setBlockStateRotated(world, deco.fenceState, 8, 2, 12, rotation, sbb); + this.setBlockStateRotated(world, deco.fenceState, 8, 2, 14, rotation, sbb); + this.setBlockStateRotated(world, deco.stairState.setValue(StairBlock.FACING, Direction.SOUTH), 7, 1, 12, rotation, sbb); + this.setBlockStateRotated(world, deco.stairState.setValue(StairBlock.FACING, Direction.WEST), 7, 1, 13, rotation, sbb); + this.setBlockStateRotated(world, deco.stairState.setValue(StairBlock.FACING, Direction.NORTH), 7, 1, 14, rotation, sbb); + + // doors + placeDoors(world, sbb); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/stronghold/StrongholdTreasureRoomComponent.java b/src/main/java/twilightforest/world/components/structures/stronghold/StrongholdTreasureRoomComponent.java new file mode 100644 index 0000000000..b083b27a64 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/stronghold/StrongholdTreasureRoomComponent.java @@ -0,0 +1,94 @@ +package twilightforest.world.components.structures.stronghold; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFEntities; +import twilightforest.init.TFStructurePieceTypes; +import twilightforest.loot.TFLootTables; + + +public class StrongholdTreasureRoomComponent extends StructureTFStrongholdComponent { + + private boolean enterBottom; + + public StrongholdTreasureRoomComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFTreaR.get(), nbt); + this.enterBottom = nbt.getBoolean("enterBottom"); + } + + public StrongholdTreasureRoomComponent(int i, Direction facing, int x, int y, int z) { + super(TFStructurePieceTypes.TFTreaR.get(), i, facing, x, y, z); + } + + @Override + protected void addAdditionalSaveData(StructurePieceSerializationContext ctx, CompoundTag tagCompound) { + super.addAdditionalSaveData(ctx, tagCompound); + tagCompound.putBoolean("enterBottom", this.enterBottom); + } + + @Override + public BoundingBox generateBoundingBox(Direction facing, int x, int y, int z) { + return BoundingBox.orientBox(x, y, z, -4, -1, 0, 9, 7, 18, facing); + } + + @Override + public void addChildren(StructurePiece parent, StructurePieceAccessor list, RandomSource random) { + super.addChildren(parent, list, random); + + this.addDoor(4, 1, 0); + } + + /** + * Generate the blocks that go here + */ + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + placeStrongholdWalls(world, sbb, 0, 0, 0, 8, 6, 17, rand, deco.randomBlocks); + + // statues + this.placeWallStatue(world, 1, 1, 4, Rotation.CLOCKWISE_90, sbb); + this.placeWallStatue(world, 1, 1, 13, Rotation.CLOCKWISE_90, sbb); + this.placeWallStatue(world, 7, 1, 4, Rotation.COUNTERCLOCKWISE_90, sbb); + this.placeWallStatue(world, 7, 1, 13, Rotation.COUNTERCLOCKWISE_90, sbb); + this.placeWallStatue(world, 4, 1, 16, Rotation.NONE, sbb); + + this.generateBox(world, sbb, 1, 1, 8, 7, 5, 9, false, rand, deco.randomBlocks); + this.generateBox(world, sbb, 3, 1, 8, 5, 4, 9, Blocks.IRON_BARS.defaultBlockState(), Blocks.IRON_BARS.defaultBlockState(), false); + + // spawnwers + this.setSpawner(world, 4, 1, 4, sbb, TFEntities.HELMET_CRAB.get()); + + this.setSpawner(world, 4, 4, 15, sbb, TFEntities.HELMET_CRAB.get()); + + // treasure! + this.manualTreaurePlacement(world, 2, 4, 13, Direction.WEST, TFLootTables.STRONGHOLD_ROOM, false, sbb); + this.manualTreaurePlacement(world, 6, 4, 13, Direction.EAST, TFLootTables.STRONGHOLD_ROOM, false, sbb); + + // doors + placeDoors(world, sbb); + } + + /** + * Make a doorway + */ + @Override + protected void placeDoorwayAt(WorldGenLevel world, int x, int y, int z, BoundingBox sbb) { + if (x == 0 || x == getXSize()) { + this.generateBox(world, sbb, x, y, z - 1, x, y + 3, z + 1, Blocks.IRON_BARS.defaultBlockState(), Blocks.AIR.defaultBlockState(), false); + } else { + this.generateBox(world, sbb, x - 1, y, z, x + 1, y + 3, z, Blocks.IRON_BARS.defaultBlockState(), Blocks.AIR.defaultBlockState(), false); + } + } +} diff --git a/src/main/java/twilightforest/world/components/structures/stronghold/StrongholdUpperAscenderComponent.java b/src/main/java/twilightforest/world/components/structures/stronghold/StrongholdUpperAscenderComponent.java new file mode 100644 index 0000000000..c842636daa --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/stronghold/StrongholdUpperAscenderComponent.java @@ -0,0 +1,120 @@ +package twilightforest.world.components.structures.stronghold; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.StairBlock; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFStructurePieceTypes; +import twilightforest.world.registration.TFGenerationSettings; + + +public class StrongholdUpperAscenderComponent extends StructureTFStrongholdComponent { + + boolean exitTop; + + public StrongholdUpperAscenderComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFSUA.get(), nbt); + this.exitTop = nbt.getBoolean("exitTop"); + } + + public StrongholdUpperAscenderComponent(int i, Direction facing, int x, int y, int z) { + super(TFStructurePieceTypes.TFSUA.get(), i, facing, x, y, z); + } + + @Override + protected void addAdditionalSaveData(StructurePieceSerializationContext ctx, CompoundTag tagCompound) { + super.addAdditionalSaveData(ctx, tagCompound); + tagCompound.putBoolean("exitTop", this.exitTop); + } + + @Override + public BoundingBox generateBoundingBox(Direction facing, int x, int y, int z) { + if (y < TFGenerationSettings.SEALEVEL - 7) { // FIXME Fix this when we overhaul this structure + this.exitTop = true; + return BoundingBox.orientBox(x, y, z, -2, -1, 0, 5, 10, 10, facing); + } else /*if (y < -32)*/ { // FIXME world.minBuildHeight + this.exitTop = false; + return BoundingBox.orientBox(x, y, z, -2, -6, 0, 5, 10, 10, facing); + } + } + + @Override + public void addChildren(StructurePiece parent, StructurePieceAccessor list, RandomSource random) { + super.addChildren(parent, list, random); + + // make a random component on the other side + addNewUpperComponent(parent, list, random, Rotation.NONE, 2, exitTop ? 6 : 1, 10); + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + /*if (this.edgesLiquid(world, sbb)) { + return false; + } else */{ + placeUpperStrongholdWalls(world, sbb, 0, 0, 0, 4, 9, 9, rand, deco.randomBlocks); + + // entrance doorway + placeSmallDoorwayAt(world, 2, 2, exitTop ? 1 : 6, 0, sbb); + + // exit doorway + placeSmallDoorwayAt(world, 0, 2, exitTop ? 6 : 1, 9, sbb); + + // steps! + if (exitTop) { + makeStairsAt(world, 1, 3, Direction.NORTH, sbb); + makeStairsAt(world, 2, 4, Direction.NORTH, sbb); + makeStairsAt(world, 3, 5, Direction.NORTH, sbb); + makeStairsAt(world, 4, 6, Direction.NORTH, sbb); + makeStairsAt(world, 5, 7, Direction.NORTH, sbb); + makePlatformAt(world, 5, 8, sbb); + } else { + makeStairsAt(world, 1, 6, Direction.NORTH, sbb); + makeStairsAt(world, 2, 5, Direction.NORTH, sbb); + makeStairsAt(world, 3, 4, Direction.NORTH, sbb); + makeStairsAt(world, 4, 3, Direction.NORTH, sbb); + makeStairsAt(world, 5, 2, Direction.NORTH, sbb); + makePlatformAt(world, 5, 1, sbb); + } + } + } + + /** + * Check if we can find at least one wall, and if so, generate stairs + */ + private void makeStairsAt(WorldGenLevel world, int y, int z, Direction facing, BoundingBox sbb) { + // check walls + if (this.getBlock(world, 0, y, z, sbb).getBlock() != Blocks.AIR || this.getBlock(world, 4, y, z, sbb).getBlock() != Blocks.AIR) { + for (int x = 1; x < 4; x++) { + this.placeBlock(world, Blocks.STONE_BRICK_STAIRS.defaultBlockState().setValue(StairBlock.FACING, facing.getOpposite()), x, y, z, sbb); + } + } + } + + /** + * Check if we can find at least one wall, and if so, generate blocks + */ + private void makePlatformAt(WorldGenLevel world, int y, int z, BoundingBox sbb) { + // check walls + if (this.getBlock(world, 0, y, z, sbb).getBlock() != Blocks.AIR || this.getBlock(world, 4, y, z, sbb).getBlock() != Blocks.AIR) { + for (int x = 1; x < 4; x++) { + this.placeBlock(world, Blocks.STONE_BRICKS.defaultBlockState(), x, y, z, sbb); + } + } + } + + @Override + public boolean isComponentProtected() { + return false; + } +} diff --git a/src/main/java/twilightforest/world/components/structures/stronghold/StrongholdUpperCorridorComponent.java b/src/main/java/twilightforest/world/components/structures/stronghold/StrongholdUpperCorridorComponent.java new file mode 100644 index 0000000000..98e2de7dbf --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/stronghold/StrongholdUpperCorridorComponent.java @@ -0,0 +1,61 @@ +package twilightforest.world.components.structures.stronghold; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFStructurePieceTypes; + + +public class StrongholdUpperCorridorComponent extends StructureTFStrongholdComponent { + + public StrongholdUpperCorridorComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFSUCo.get(), nbt); + } + + public StrongholdUpperCorridorComponent(int i, Direction facing, int x, int y, int z) { + super(TFStructurePieceTypes.TFSUCo.get(), i, facing, x, y, z); + } + + @Override + public BoundingBox generateBoundingBox(Direction facing, int x, int y, int z) { + return BoundingBox.orientBox(x, y, z, -2, -1, 0, 5, 5, 9, facing); + } + + @Override + public void addChildren(StructurePiece parent, StructurePieceAccessor list, RandomSource random) { + super.addChildren(parent, list, random); + + // make a random component at the end + addNewUpperComponent(parent, list, random, Rotation.NONE, 2, 1, 9); + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + /*if (this.edgesLiquid(world, sbb)) { + return false; + } else */{ + placeUpperStrongholdWalls(world, sbb, 0, 0, 0, 4, 4, 8, rand, deco.randomBlocks); + + // entrance doorway + placeSmallDoorwayAt(world, 2, 2, 1, 0, sbb); + + // end + placeSmallDoorwayAt(world, 2, 2, 1, 8, sbb); + } + } + + @Override + public boolean isComponentProtected() { + return false; + } +} diff --git a/src/main/java/twilightforest/world/components/structures/stronghold/StrongholdUpperLeftTurnComponent.java b/src/main/java/twilightforest/world/components/structures/stronghold/StrongholdUpperLeftTurnComponent.java new file mode 100644 index 0000000000..840dfb1ae0 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/stronghold/StrongholdUpperLeftTurnComponent.java @@ -0,0 +1,61 @@ +package twilightforest.world.components.structures.stronghold; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFStructurePieceTypes; + + +public class StrongholdUpperLeftTurnComponent extends StructureTFStrongholdComponent { + + public StrongholdUpperLeftTurnComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFSULT.get(), nbt); + } + + public StrongholdUpperLeftTurnComponent(int i, Direction facing, int x, int y, int z) { + super(TFStructurePieceTypes.TFSULT.get(), i, facing, x, y, z); + } + + @Override + public BoundingBox generateBoundingBox(Direction facing, int x, int y, int z) { + return BoundingBox.orientBox(x, y, z, -2, -1, 0, 5, 5, 5, facing); + } + + @Override + public void addChildren(StructurePiece parent, StructurePieceAccessor list, RandomSource random) { + super.addChildren(parent, list, random); + + // make a random component to the left + addNewUpperComponent(parent, list, random, Rotation.COUNTERCLOCKWISE_90, 5, 1, 2); + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + /*if (this.edgesLiquid(world, sbb)) { + return false; + } else */{ + placeUpperStrongholdWalls(world, sbb, 0, 0, 0, 4, 4, 4, rand, deco.randomBlocks); + + // entrance doorway + placeSmallDoorwayAt(world, 2, 2, 1, 0, sbb); + + // left turn doorway + placeSmallDoorwayAt(world, 3, 4, 1, 2, sbb); + } + } + + @Override + public boolean isComponentProtected() { + return false; + } +} diff --git a/src/main/java/twilightforest/world/components/structures/stronghold/StrongholdUpperRightTurnComponent.java b/src/main/java/twilightforest/world/components/structures/stronghold/StrongholdUpperRightTurnComponent.java new file mode 100644 index 0000000000..cac40eee66 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/stronghold/StrongholdUpperRightTurnComponent.java @@ -0,0 +1,61 @@ +package twilightforest.world.components.structures.stronghold; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFStructurePieceTypes; + + +public class StrongholdUpperRightTurnComponent extends StructureTFStrongholdComponent { + + public StrongholdUpperRightTurnComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFSURT.get(), nbt); + } + + public StrongholdUpperRightTurnComponent(int i, Direction facing, int x, int y, int z) { + super(TFStructurePieceTypes.TFSURT.get(), i, facing, x, y, z); + } + + @Override + public BoundingBox generateBoundingBox(Direction facing, int x, int y, int z) { + return BoundingBox.orientBox(x, y, z, -2, -1, 0, 5, 5, 5, facing); + } + + @Override + public void addChildren(StructurePiece parent, StructurePieceAccessor list, RandomSource random) { + super.addChildren(parent, list, random); + + // make a random component to the right + addNewUpperComponent(parent, list, random, Rotation.CLOCKWISE_90, -1, 1, 2); + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + /*if (this.edgesLiquid(world, sbb)) { + return false; + } else */{ + placeUpperStrongholdWalls(world, sbb, 0, 0, 0, 4, 4, 4, rand, deco.randomBlocks); + + // entrance doorway + placeSmallDoorwayAt(world, 2, 2, 1, 0, sbb); + + // right turn doorway + placeSmallDoorwayAt(world, 1, 0, 1, 2, sbb); + } + } + + @Override + public boolean isComponentProtected() { + return false; + } +} diff --git a/src/main/java/twilightforest/world/components/structures/stronghold/StrongholdUpperTIntersectionComponent.java b/src/main/java/twilightforest/world/components/structures/stronghold/StrongholdUpperTIntersectionComponent.java new file mode 100644 index 0000000000..36ef0457e5 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/stronghold/StrongholdUpperTIntersectionComponent.java @@ -0,0 +1,67 @@ +package twilightforest.world.components.structures.stronghold; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFStructurePieceTypes; + + +public class StrongholdUpperTIntersectionComponent extends StructureTFStrongholdComponent { + + public StrongholdUpperTIntersectionComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFSUTI.get(), nbt); + } + + public StrongholdUpperTIntersectionComponent(int i, Direction facing, int x, int y, int z) { + super(TFStructurePieceTypes.TFSUTI.get(), i, facing, x, y, z); + } + + @Override + public BoundingBox generateBoundingBox(Direction facing, int x, int y, int z) { + return BoundingBox.orientBox(x, y, z, -2, -1, 0, 5, 5, 5, facing); + } + + @Override + public void addChildren(StructurePiece parent, StructurePieceAccessor list, RandomSource random) { + super.addChildren(parent, list, random); + + // make a random component to the left + addNewUpperComponent(parent, list, random, Rotation.COUNTERCLOCKWISE_90, 5, 1, 2); + + // make a random component to the right + addNewUpperComponent(parent, list, random, Rotation.CLOCKWISE_90, -1, 1, 2); + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + /*if (this.edgesLiquid(world, sbb)) { + return false; + } else */{ + placeUpperStrongholdWalls(world, sbb, 0, 0, 0, 4, 4, 4, rand, deco.randomBlocks); + + // entrance doorway + placeSmallDoorwayAt(world, 2, 2, 1, 0, sbb); + + // left turn doorway + placeSmallDoorwayAt(world, 3, 4, 1, 2, sbb); + + // right turn doorway + placeSmallDoorwayAt(world, 1, 0, 1, 2, sbb); + } + } + + @Override + public boolean isComponentProtected() { + return false; + } +} diff --git a/src/main/java/twilightforest/world/components/structures/stronghold/StructureTFStrongholdComponent.java b/src/main/java/twilightforest/world/components/structures/stronghold/StructureTFStrongholdComponent.java new file mode 100644 index 0000000000..ab96cba4c2 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/stronghold/StructureTFStrongholdComponent.java @@ -0,0 +1,505 @@ +package twilightforest.world.components.structures.stronghold; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePiecesBuilder; +import net.minecraft.world.level.material.Material; +import twilightforest.world.components.structures.TFStructureComponentOld; + +import java.nio.IntBuffer; +import java.util.ArrayList; +import java.util.List; + + +public abstract class StructureTFStrongholdComponent extends TFStructureComponentOld { + + public List doors = new ArrayList<>(); + + public StructureTFStrongholdComponent(StructurePieceType piece, CompoundTag nbt) { + super(piece, nbt); + this.readOpeningsFromArray(nbt.getIntArray("doorInts")); + } + + public StructureTFStrongholdComponent(StructurePieceType type, int i, Direction facing, int x, int y, int z) { + super(type, i, x, y, z); + this.boundingBox = generateBoundingBox(facing, x, y, z); + this.setOrientation(facing); + } + + /** + * Turn the openings array into an array of ints. + */ + private int[] getDoorsAsIntArray() { + IntBuffer ibuffer = IntBuffer.allocate(this.doors.size() * 3); + + for (BlockPos door : doors) { + ibuffer.put(door.getX()); + ibuffer.put(door.getY()); + ibuffer.put(door.getZ()); + } + + return ibuffer.array(); + } + + @Override + protected void addAdditionalSaveData(StructurePieceSerializationContext ctx, CompoundTag tagCompound) { + super.addAdditionalSaveData(ctx, tagCompound); + tagCompound.putIntArray("doorInts", this.getDoorsAsIntArray()); + } + + /** + * Read in openings from int array + */ + private void readOpeningsFromArray(int[] intArray) { + for (int i = 0; i < intArray.length; i += 3) { + BlockPos door = new BlockPos(intArray[i], intArray[i + 1], intArray[i + 2]); + + this.doors.add(door); + } + } + + public abstract BoundingBox generateBoundingBox(Direction facing, int x, int y, int z); + + /** + * used to project a possible new component Bounding Box - to check if it would cut anything already spawned + */ + public static BoundingBox getComponentToAddBoundingBox(int x, int y, int z, int xOff, int yOff, int zOff, int xSize, int ySize, int zSize, Direction facing) { + return switch (facing) { + case WEST -> new BoundingBox(x - zSize + 1 + zOff, y + yOff, z + xOff, x + zOff, y + ySize - 1 + yOff, z + xSize - 1 + xOff); + case NORTH -> new BoundingBox(x - xSize + 1 - xOff, y + yOff, z - zSize + 1 + zOff, x - xOff, y + ySize - 1 + yOff, z + zOff); + case EAST -> new BoundingBox(x + zOff, y + yOff, z - xSize + 1 - xOff, x + zSize - 1 + zOff, y + ySize - 1 + yOff, z - xOff); + default -> new BoundingBox(x + xOff, y + yOff, z + zOff, x + xSize - 1 + xOff, y + ySize - 1 + yOff, z + zSize - 1 + zOff); + }; + } + + @Override + public void addChildren(StructurePiece parent, StructurePieceAccessor list, RandomSource rand) { + if (parent != null && parent instanceof TFStructureComponentOld) { + this.deco = ((TFStructureComponentOld) parent).deco; + } + } + + /** + * Add a new component in the specified direction + */ + protected void addNewComponent(StructurePiece entrance, StructurePieceAccessor list, RandomSource random, Rotation facing, int x, int y, int z) { + int index = this.genDepth + 1; + Direction nFacing = getStructureRelativeRotation(facing); + int nx = this.getWorldX(x, z); + int ny = this.getWorldY(y); + int nz = this.getWorldZ(x, z); + + // limit sprawl to a reasonable amount + if (index > 30 || isOutOfRange(entrance, nx, nz, 75)) { + return; + } + + // are we looking at a point we can possibly break in to? + StructureTFStrongholdComponent breakIn = (StructureTFStrongholdComponent) this.findBreakInComponent(list, nx, ny, nz); + if (breakIn != null && breakIn.attemptToBreakIn(nx, ny, nz)) { + // success! + this.addDoorwayTo(x, y, z, facing); + return; + } + + StrongholdPieces pieceList = ((StrongholdEntranceComponent) entrance).lowerPieces; + + StructurePiece nextComponent = pieceList.getNextComponent(entrance, list, random, index, nFacing, nx, ny, nz); + + // is it clear? + if (nextComponent != null) { + // if so, add it + list.addPiece(nextComponent); + nextComponent.addChildren(entrance, list, random); + this.addDoorwayTo(x, y, z, facing); + } + } + + /** + * Check the list for components we can break in to at the specified point + */ + protected StructurePiece findBreakInComponent(StructurePieceAccessor list, int x, int y, int z) { + BlockPos pos = new BlockPos(x, y, z); + if (list instanceof StructurePiecesBuilder start) { + for (StructurePiece component : start.pieces) { + if (component.getBoundingBox() != null && component.getBoundingBox().isInside(pos)) { + return component; + } + } + } + + return null; + } + + protected void addNewUpperComponent(StructurePiece parent, StructurePieceAccessor list, RandomSource random, Rotation facing, int x, int y, int z) { + StructureTFStrongholdComponent attempted; + + int index = this.genDepth + 1; + Direction nFacing = getStructureRelativeRotation(facing); + int nx = this.getWorldX(x, z); + int ny = this.getWorldY(y); + int nz = this.getWorldZ(x, z); + + // limit sprawl to a reasonable amount + if (index > 100 || isOutOfRange(parent, nx, nz, 48)) { + return; + } + + // find a new component + attempted = switch (random.nextInt(5)) { + case 1 -> new StrongholdUpperLeftTurnComponent(index, nFacing, nx, ny, nz); + case 2 -> new StrongholdUpperRightTurnComponent(index, nFacing, nx, ny, nz); + case 3 -> new StrongholdUpperCorridorComponent(index, nFacing, nx, ny, nz); + case 4 -> new StrongholdUpperAscenderComponent(index, nFacing, nx, ny, nz); + default -> new StrongholdUpperTIntersectionComponent(index, nFacing, nx, ny, nz); + }; + + // is it clear? + if (attempted != null && list.findCollisionPiece(attempted.getBoundingBox()) == null) { + // if so, add it + list.addPiece(attempted); + attempted.addChildren(parent, list, random); + + } + } + + /** + * Have we strayed more than range blocks away from the center? + */ + private boolean isOutOfRange(StructurePiece parent, int nx, int nz, int range) { + + return Math.abs(nx - parent.getBoundingBox().minX()) > range + || Math.abs(nz - parent.getBoundingBox().minZ()) > range; + } + + /** + * Make a doorway + */ + protected void placeDoorwayAt(WorldGenLevel world, int x, int y, int z, BoundingBox sbb) { + if (x == 0 || x == this.getXSize()) { + this.generateBox(world, sbb, x, y, z - 2, x, y + 3, z + 2, deco.fenceState, Blocks.AIR.defaultBlockState(), false); + this.generateAirBox(world, sbb, x, y, z - 1, x, y + 3, z + 1); + } else { + this.generateBox(world, sbb, x - 2, y, z, x + 2, y + 3, z, deco.fenceState, Blocks.AIR.defaultBlockState(), false); + this.generateAirBox(world, sbb, x - 1, y, z, x + 1, y + 3, z); + } + + //this.setBlockState(world, Blocks.WOOL, this.coordBaseMode, x, y, z, sbb); + } + + protected int getXSize() { + return switch (this.getOrientation()) { + case WEST, EAST -> this.boundingBox.getZSpan() - 1; + default -> this.boundingBox.getXSpan() - 1; + }; + } + + /** + * Make a smaller doorway + */ + protected void placeSmallDoorwayAt(WorldGenLevel world, int facing, int x, int y, int z, BoundingBox sbb) { + if (facing == 0 || facing == 2) { + this.generateBox(world, sbb, x - 1, y, z, x + 1, y + 1, z, Blocks.COBBLESTONE_WALL.defaultBlockState(), Blocks.AIR.defaultBlockState(), true); + } else { + this.generateBox(world, sbb, x, y, z - 1, x, y + 1, z + 1, Blocks.COBBLESTONE_WALL.defaultBlockState(), Blocks.AIR.defaultBlockState(), true); + } + this.generateAirBox(world, sbb, x, y, z, x, y + 1, z); + } + + /** + * Generate a statue in the corner + */ + public void placeCornerStatue(WorldGenLevel world, int x, int y, int z, int facing, BoundingBox sbb) { + + // set offsets and stair metas + int ox = 1; + int oz = 1; + Direction smx = Direction.EAST; + Direction smz = Direction.SOUTH; + + switch (facing) { + case 0: + // already set up + break; + case 1: + oz = -1; + smz = Direction.SOUTH; + break; + case 2: + ox = -1; + smx = Direction.WEST; + break; + case 3: + ox = -1; + oz = -1; + smx = Direction.WEST; + smz = Direction.NORTH; + break; + } + + // the center is always the same + for (int sy = 0; sy < 5; sy++) { + this.placeBlock(world, deco.pillarState, x, y + sy, z, sbb); + } + + // antlers + this.placeBlock(world, Blocks.OAK_FENCE.defaultBlockState(), x, y + 4, z + oz, sbb); + this.placeBlock(world, Blocks.OAK_FENCE.defaultBlockState(), x + ox, y + 4, z, sbb); + + // arms + this.placeBlock(world, getStairState(deco.stairState, smz, false), x, y + 3, z + oz, sbb); + this.placeBlock(world, getStairState(deco.stairState, smx, false), x + ox, y + 3, z, sbb); + this.placeBlock(world, getStairState(deco.stairState, smz, true), x, y + 2, z + oz, sbb); + this.placeBlock(world, getStairState(deco.stairState, smx, true), x + ox, y + 2, z, sbb); + this.placeBlock(world, getStairState(deco.stairState, smx, true), x + ox, y + 2, z + oz, sbb); + + // sword + this.placeBlock(world, Blocks.COBBLESTONE_WALL.defaultBlockState(), x + ox, y, z + oz, sbb); + this.placeBlock(world, Blocks.COBBLESTONE_WALL.defaultBlockState(), x + ox, y + 1, z + oz, sbb); + + // feet + this.placeBlock(world, getStairState(deco.stairState, smz, false), x, y, z + oz, sbb); + this.placeBlock(world, getStairState(deco.stairState, smx, false), x + ox, y, z, sbb); + } + + /** + * Make a statue that faces out from a wall + */ + public void placeWallStatue(WorldGenLevel world, int x, int y, int z, Rotation facing, BoundingBox sbb) { + int ox = 1; + int oz = 1; + + // the center is always the same + for (int sy = 0; sy < 5; sy++) { + this.placeBlock(world, deco.pillarState, x, y + sy, z, sbb); + } + + if (facing == Rotation.NONE || facing == Rotation.CLOCKWISE_180) { + if (facing == Rotation.CLOCKWISE_180) { + ox = -ox; + oz = -oz; + } + + // antlers + this.placeBlock(world, Blocks.OAK_FENCE.defaultBlockState(), x - ox, y + 4, z, sbb); + this.placeBlock(world, Blocks.OAK_FENCE.defaultBlockState(), x + ox, y + 4, z, sbb); + + // arms + + this.placeBlock(world, getStairState(deco.stairState, facing.getRotated(Rotation.NONE).rotate(Direction.WEST), false), x - ox, y + 3, z, sbb); + this.placeBlock(world, getStairState(deco.stairState, facing.getRotated(Rotation.CLOCKWISE_180).rotate(Direction.WEST), false), x + ox, y + 3, z, sbb); + this.placeBlock(world, getStairState(deco.stairState, facing.getRotated(Rotation.CLOCKWISE_90).rotate(Direction.WEST), false), x - ox, y + 3, z - oz, sbb); + this.placeBlock(world, getStairState(deco.stairState, facing.getRotated(Rotation.CLOCKWISE_90).rotate(Direction.WEST), false), x + ox, y + 3, z - oz, sbb); + + this.placeBlock(world, getStairState(deco.stairState, facing.getRotated(Rotation.NONE).rotate(Direction.WEST), true), x - ox, y + 2, z, sbb); + this.placeBlock(world, getStairState(deco.stairState, facing.getRotated(Rotation.CLOCKWISE_180).rotate(Direction.WEST), true), x + ox, y + 2, z, sbb); + this.placeBlock(world, getStairState(deco.stairState, facing.getRotated(Rotation.CLOCKWISE_90).rotate(Direction.WEST), true), x, y + 2, z - oz, sbb); + this.placeBlock(world, getStairState(deco.stairState, facing.getRotated(Rotation.CLOCKWISE_90).rotate(Direction.WEST), true), x - ox, y + 2, z - oz, sbb); + this.placeBlock(world, getStairState(deco.stairState, facing.getRotated(Rotation.CLOCKWISE_90).rotate(Direction.WEST), true), x + ox, y + 2, z - oz, sbb); + + // sword + this.placeBlock(world, Blocks.COBBLESTONE_WALL.defaultBlockState(), x, y, z - oz, sbb); + this.placeBlock(world, Blocks.COBBLESTONE_WALL.defaultBlockState(), x, y + 1, z - oz, sbb); + + // feet + this.placeBlock(world, getStairState(deco.stairState, facing.getRotated(Rotation.NONE).rotate(Direction.WEST), false), x - ox, y, z, sbb); + this.placeBlock(world, getStairState(deco.stairState, facing.getRotated(Rotation.CLOCKWISE_180).rotate(Direction.WEST), false), x + ox, y, z, sbb); + } else { + if (facing == Rotation.COUNTERCLOCKWISE_90) { + oz = -oz; + ox = -ox; + } + + // antlers + this.placeBlock(world, Blocks.OAK_FENCE.defaultBlockState(), x, y + 4, z - oz, sbb); + this.placeBlock(world, Blocks.OAK_FENCE.defaultBlockState(), x, y + 4, z + oz, sbb); + + // arms + this.placeBlock(world, getStairState(deco.stairState, facing.getRotated(Rotation.NONE).rotate(Direction.WEST), false), x, y + 3, z - oz, sbb); + this.placeBlock(world, getStairState(deco.stairState, facing.getRotated(Rotation.CLOCKWISE_180).rotate(Direction.WEST), false), x, y + 3, z + oz, sbb); + this.placeBlock(world, getStairState(deco.stairState, facing.getRotated(Rotation.CLOCKWISE_90).rotate(Direction.WEST), false), x + ox, y + 3, z - oz, sbb); + this.placeBlock(world, getStairState(deco.stairState, facing.getRotated(Rotation.CLOCKWISE_90).rotate(Direction.WEST), false), x + ox, y + 3, z + oz, sbb); + + this.placeBlock(world, getStairState(deco.stairState, facing.getRotated(Rotation.NONE).rotate(Direction.WEST), true), x, y + 2, z - oz, sbb); + this.placeBlock(world, getStairState(deco.stairState, facing.getRotated(Rotation.CLOCKWISE_180).rotate(Direction.WEST), true), x, y + 2, z + oz, sbb); + this.placeBlock(world, getStairState(deco.stairState, facing.getRotated(Rotation.CLOCKWISE_90).rotate(Direction.WEST), true), x + oz, y + 2, z, sbb); + this.placeBlock(world, getStairState(deco.stairState, facing.getRotated(Rotation.CLOCKWISE_90).rotate(Direction.WEST), true), x + ox, y + 2, z - oz, sbb); + this.placeBlock(world, getStairState(deco.stairState, facing.getRotated(Rotation.CLOCKWISE_90).rotate(Direction.WEST), true), x + ox, y + 2, z + oz, sbb); + + // sword + this.placeBlock(world, Blocks.COBBLESTONE_WALL.defaultBlockState(), x + ox, y, z, sbb); + this.placeBlock(world, Blocks.COBBLESTONE_WALL.defaultBlockState(), x + ox, y + 1, z, sbb); + + // feet + this.placeBlock(world, getStairState(deco.stairState, facing.getRotated(Rotation.NONE).rotate(Direction.WEST), false), x, y, z - ox, sbb); + this.placeBlock(world, getStairState(deco.stairState, facing.getRotated(Rotation.CLOCKWISE_180).rotate(Direction.WEST), false), x, y, z + ox, sbb); + } + } + + /** + * Called curing construction. If an attempted component collides with this one, try "breaking in". + */ + public boolean attemptToBreakIn(int wx, int wy, int wz) { + if (!isValidBreakInPoint(wx, wy, wz)) { + return false; + } else { + int dx = this.getRelativeX(wx, wz); + int dy = this.getRelativeY(wy); + int dz = this.getRelativeZ(wx, wz); + + addDoor(dx, dy, dz); + + return true; + } + } + + /** + * Add a door to our list + */ + public void addDoorwayTo(int dx, int dy, int dz, Rotation facing) { + switch (facing) { + case NONE -> addDoor(dx, dy, dz - 1); + case CLOCKWISE_90 -> addDoor(dx + 1, dy, dz); + case CLOCKWISE_180 -> addDoor(dx, dy, dz + 1); + case COUNTERCLOCKWISE_90 -> addDoor(dx - 1, dy, dz); + } + } + + /** + * Add a door to our list + */ + public void addDoor(int dx, int dy, int dz) { + this.doors.add(new BlockPos(dx, dy, dz)); + } + + /** + * Is the specified point a valid spot to break in? + */ + protected boolean isValidBreakInPoint(int wx, int wy, int wz) { + if (wy < this.boundingBox.minY() || wy > this.boundingBox.maxY()) { + return false; + } else if (wx == this.boundingBox.minX() || wx == this.boundingBox.maxX()) { + return wz > this.boundingBox.minZ() && wz < this.boundingBox.maxZ(); + } else if (wz == this.boundingBox.minZ() || wz == this.boundingBox.maxZ()) { + return wx > this.boundingBox.minX() && wx < this.boundingBox.maxX(); + } else { + return false; + } + } + + protected int getRelativeX(int x, int z) { + //this.getXWithOffset(x, z); + + return switch (getOrientation()) { + case SOUTH -> x - boundingBox.minX(); + case NORTH -> boundingBox.maxX() - x; + case WEST -> z - boundingBox.minZ(); + case EAST -> boundingBox.maxZ() - z; + default -> x; + }; + } + + protected int getRelativeY(int y) { + return y - this.boundingBox.minY(); + } + + protected int getRelativeZ(int x, int z) { + return switch (getOrientation()) { + case SOUTH -> z - boundingBox.minZ(); + case NORTH -> boundingBox.maxZ() - z; + case WEST -> boundingBox.maxX() - x; + case EAST -> x - boundingBox.minX(); + default -> z; + }; + } + + /** + * Place any doors on our list + */ + public void placeDoors(WorldGenLevel world, BoundingBox sbb) { + if (this.doors != null) { + for (BlockPos doorCoords : doors) { + this.placeDoorwayAt(world, doorCoords.getX(), doorCoords.getY(), doorCoords.getZ(), sbb); + + //this.setBlockState(world, Blocks.WOOL, doorCoords.posX, doorCoords.posX, doorCoords.posY + 2, doorCoords.posZ, sbb); + } + } + } + + /** + * Place stronghold walls in every position except those filled with dirt. + */ + protected void placeStrongholdWalls(WorldGenLevel world, BoundingBox sbb, int sx, int sy, int sz, int dx, int dy, int dz, RandomSource rand, StructurePiece.BlockSelector randomBlocks) { + for (int y = sy; y <= dy; ++y) { + for (int x = sx; x <= dx; ++x) { + for (int z = sz; z <= dz; ++z) { + boolean wall = y == sy || y == dy || x == sx || x == dx || z == sz || z == dz; + Block blockID = this.getBlock(world, x, y, z, sbb).getBlock(); + + if (blockID == Blocks.AIR) { + // cobblestone to "fill in holes" + if (wall) { + this.placeBlock(world, Blocks.COBBLESTONE.defaultBlockState(), x, y, z, sbb); + } + } else if (y == sy || y == dy) { + // do stronghold bricks for floor/ceiling + StructurePiece.BlockSelector strongBlocks = TFStructureComponentOld.getStrongholdStones(); + strongBlocks.next(rand, x, y, z, wall); + this.placeBlock(world, strongBlocks.getNext(), x, y, z, sbb); + + } else if (!wall || blockID != Blocks.DIRT) { // leave dirt there + // and use decorator (with presumably underbricks) for walls + randomBlocks.next(rand, x, y, z, wall); + this.placeBlock(world, randomBlocks.getNext(), x, y, z, sbb); + } + } + } + } + } + + /** + * Place stronghold walls on dirt/grass/stone + */ + protected void placeUpperStrongholdWalls(WorldGenLevel world, BoundingBox sbb, int sx, int sy, int sz, int dx, int dy, int dz, RandomSource rand, StructurePiece.BlockSelector randomBlocks) { + for (int y = sy; y <= dy; ++y) { + for (int x = sx; x <= dx; ++x) { + for (int z = sz; z <= dz; ++z) { + boolean wall = y == sy || y == dy || x == sx || x == dx || z == sz || z == dz; + BlockState state = this.getBlock(world, x, y, z, sbb); + Block blockID = state.getBlock(); + + if ((blockID != Blocks.AIR && (state.getMaterial() == Material.STONE || state.getMaterial() == Material.GRASS || state.getMaterial() == Material.DIRT)) + || (blockID == Blocks.AIR && rand.nextInt(3) == 0) && this.getBlock(world, x, y - 1, z, sbb).getBlock() == Blocks.STONE_BRICKS) { + if (y == sy || y == dy) { + // do stronghold bricks for floor/ceiling + StructurePiece.BlockSelector strongBlocks = TFStructureComponentOld.getStrongholdStones(); + strongBlocks.next(rand, x, y, z, wall); + this.placeBlock(world, strongBlocks.getNext(), x, y, z, sbb); + + } else { + // and use decorator (with presumably underbricks) for walls + randomBlocks.next(rand, x, y, z, wall); + this.placeBlock(world, randomBlocks.getNext(), x, y, z, sbb); + } + } + } + } + } + } + + public interface Factory { + T newInstance(int i, Direction facing, int x, int y, int z); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/stronghold/package-info.java b/src/main/java/twilightforest/world/components/structures/stronghold/package-info.java new file mode 100644 index 0000000000..cedbecfc8e --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/stronghold/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.world.components.structures.stronghold; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/world/components/structures/trollcave/CloudCastleComponent.java b/src/main/java/twilightforest/world/components/structures/trollcave/CloudCastleComponent.java new file mode 100644 index 0000000000..da956d2f13 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/trollcave/CloudCastleComponent.java @@ -0,0 +1,128 @@ +package twilightforest.world.components.structures.trollcave; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.entity.MobSpawnType; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import net.minecraftforge.event.ForgeEventFactory; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFEntities; +import twilightforest.entity.monster.ArmoredGiant; +import twilightforest.entity.monster.GiantMiner; +import twilightforest.world.components.structures.TFStructureComponentOld; +import twilightforest.init.TFLandmark; +import twilightforest.init.TFStructurePieceTypes; + + +public class CloudCastleComponent extends TFStructureComponentOld { + + private boolean minerPlaced = false; + private boolean warriorPlaced = false; + + public CloudCastleComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFClCa.get(), nbt); + this.minerPlaced = nbt.getBoolean("minerPlaced"); + this.warriorPlaced = nbt.getBoolean("warriorPlaced"); + } + + public CloudCastleComponent(int index, int x, int y, int z) { + super(TFStructurePieceTypes.TFClCa.get(), index, x, y, z); + this.setOrientation(Direction.SOUTH); + + // round to nearest mult of 4 + x &= ~0b11; + y &= ~0b11; + z &= ~0b11; + + // spawn list! + this.spawnListIndex = 1; + + this.boundingBox = TFLandmark.getComponentToAddBoundingBox(x, y, z, -8, -4, -8, 64, 16, 64, Direction.SOUTH, false); + } + + @Override + protected void addAdditionalSaveData(StructurePieceSerializationContext ctx, CompoundTag tagCompound) { + super.addAdditionalSaveData(ctx, tagCompound); + tagCompound.putBoolean("minerPlaced", this.minerPlaced); + tagCompound.putBoolean("warriorPlaced", this.warriorPlaced); + } + + @Override + public void addChildren(StructurePiece parent, StructurePieceAccessor list, RandomSource rand) { + // up to two trees + // tree in x direction + boolean plus = rand.nextBoolean(); + int offset = rand.nextInt(5) - rand.nextInt(5); + CloudTreeComponent treeX = new CloudTreeComponent(this.getGenDepth() + 1, boundingBox.minX() + 8 + (plus ? 32 : -16), 168, boundingBox.minZ() + (offset * 4)); + list.addPiece(treeX); + treeX.addChildren(this, list, rand); + + // tree in z direction + plus = rand.nextBoolean(); + offset = rand.nextInt(5) - rand.nextInt(5); + CloudTreeComponent treeZ = new CloudTreeComponent(this.getGenDepth() + 1, boundingBox.minX() + (offset * 4), 168, boundingBox.minZ() + 8 + (plus ? 32 : -16)); + list.addPiece(treeZ); + treeZ.addChildren(this, list, rand); + + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + + // make haus + this.generateBox(world, sbb, 8, 0, 8, 23, 3, 23, TFBlocks.FLUFFY_CLOUD.get().defaultBlockState(), TFBlocks.FLUFFY_CLOUD.get().defaultBlockState(), false); + this.generateBox(world, sbb, 8, 4, 8, 23, 15, 23, TFBlocks.GIANT_COBBLESTONE.get().defaultBlockState(), TFBlocks.GIANT_COBBLESTONE.get().defaultBlockState(), false); + this.generateBox(world, sbb, 8, 16, 8, 23, 19, 23, TFBlocks.GIANT_LOG.get().defaultBlockState(), TFBlocks.GIANT_LOG.get().defaultBlockState(), false); + + // clear inside + this.generateAirBox(world, sbb, 12, 4, 12, 19, 15, 19); + + // clear door + this.generateAirBox(world, sbb, 8, 4, 12, 12, 11, 15); + + // add giants + if (!this.minerPlaced) { + int bx = this.getWorldX(14, 14); + int by = this.getWorldY(4); + int bz = this.getWorldZ(14, 14); + BlockPos pos = new BlockPos(bx, by, bz); + + if (sbb.isInside(pos)) { + this.minerPlaced = true; + + GiantMiner miner = TFEntities.GIANT_MINER.get().create(world.getLevel()); + miner.setPos(bx, by, bz); + miner.setPersistenceRequired(); + ForgeEventFactory.onFinalizeSpawn(miner, world, world.getCurrentDifficultyAt(pos), MobSpawnType.STRUCTURE, null, null); + + world.addFreshEntity(miner); + } + } + if (!this.warriorPlaced) { + int bx = this.getWorldX(17, 17); + int by = this.getWorldY(4); + int bz = this.getWorldZ(17, 17); + BlockPos pos = new BlockPos(bx, by, bz); + + if (sbb.isInside(pos)) { + this.warriorPlaced = true; + + ArmoredGiant warrior = TFEntities.ARMORED_GIANT.get().create(world.getLevel()); + warrior.setPos(bx, by, bz); + warrior.setPersistenceRequired(); + ForgeEventFactory.onFinalizeSpawn(warrior, world, world.getCurrentDifficultyAt(pos), MobSpawnType.STRUCTURE, null, null); + + world.addFreshEntity(warrior); + } + } + } +} diff --git a/src/main/java/twilightforest/world/components/structures/trollcave/CloudTreeComponent.java b/src/main/java/twilightforest/world/components/structures/trollcave/CloudTreeComponent.java new file mode 100644 index 0000000000..b4cc09bc18 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/trollcave/CloudTreeComponent.java @@ -0,0 +1,56 @@ +package twilightforest.world.components.structures.trollcave; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFBlocks; +import twilightforest.world.components.structures.TFStructureComponentOld; +import twilightforest.init.TFLandmark; +import twilightforest.init.TFStructurePieceTypes; + + +public class CloudTreeComponent extends TFStructureComponentOld { + + public CloudTreeComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFClTr.get(), nbt); + } + + public CloudTreeComponent(int index, int x, int y, int z) { + super(TFStructurePieceTypes.TFClTr.get(), index, x, y, z); + + this.setOrientation(Direction.SOUTH); + + // adjust x, y, z + x = (x >> 2) << 2; + y = (y >> 2) << 2; + z = (z >> 2) << 2; + + this.boundingBox = TFLandmark.getComponentToAddBoundingBox(x, y, z, -8, 0, -8, 20, 28, 20, Direction.SOUTH, false); + + // spawn list! + this.spawnListIndex = 1; + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + + // leaves + this.generateBox(world, sbb, 0, 12, 0, 19, 19, 19, TFBlocks.GIANT_LEAVES.get().defaultBlockState(), TFBlocks.GIANT_LEAVES.get().defaultBlockState(), false); + this.generateBox(world, sbb, 4, 20, 4, 15, 23, 15, TFBlocks.GIANT_LEAVES.get().defaultBlockState(), TFBlocks.GIANT_LEAVES.get().defaultBlockState(), false); + this.generateBox(world, sbb, 8, 24, 4, 11, 27, 15, TFBlocks.GIANT_LEAVES.get().defaultBlockState(), TFBlocks.GIANT_LEAVES.get().defaultBlockState(), false); + this.generateBox(world, sbb, 4, 24, 8, 15, 27, 11, TFBlocks.GIANT_LEAVES.get().defaultBlockState(), TFBlocks.GIANT_LEAVES.get().defaultBlockState(), false); + + // trunk + this.generateBox(world, sbb, 8, 0, 8, 11, 23, 11, TFBlocks.GIANT_LOG.get().defaultBlockState(), TFBlocks.GIANT_LOG.get().defaultBlockState(), false); + + // cloud base + this.generateBox(world, sbb, 8, -4, 8, 11, -1, 11, TFBlocks.FLUFFY_CLOUD.get().defaultBlockState(), TFBlocks.FLUFFY_CLOUD.get().defaultBlockState(), false); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/trollcave/TrollCaveConnectComponent.java b/src/main/java/twilightforest/world/components/structures/trollcave/TrollCaveConnectComponent.java new file mode 100644 index 0000000000..7404649be4 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/trollcave/TrollCaveConnectComponent.java @@ -0,0 +1,287 @@ +package twilightforest.world.components.structures.trollcave; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePiecesBuilder; +import org.jetbrains.annotations.Nullable; +import twilightforest.data.custom.stalactites.entry.Stalactite; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFLandmark; +import twilightforest.init.TFStructurePieceTypes; +import twilightforest.util.HugeMushroomUtil; +import twilightforest.util.RotationUtil; + +import java.util.Map; + +public class TrollCaveConnectComponent extends TrollCaveMainComponent { + protected static final Stalactite STONE_STALACTITE_SMALL = new Stalactite(Map.of(Blocks.STONE, 1), 1.0F, 5, 1); + + protected final boolean[] openingTowards = {false, false, true, false}; + + public TrollCaveConnectComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFTCCon.get(), nbt); + this.openingTowards[0] = nbt.getBoolean("openingTowards0"); + this.openingTowards[1] = nbt.getBoolean("openingTowards1"); + this.openingTowards[2] = nbt.getBoolean("openingTowards2"); + this.openingTowards[3] = nbt.getBoolean("openingTowards3"); + } + + public TrollCaveConnectComponent(int index, int x, int y, int z, int caveSize, int caveHeight, Direction direction) { + super(TFStructurePieceTypes.TFTCCon.get(), index, x, y, z); + this.size = caveSize; + this.height = caveHeight; + this.setOrientation(direction); + this.boundingBox = TFLandmark.getComponentToAddBoundingBox(x, y, z, 0, 0, 0, size - 1, height - 1, size - 1, direction, false); + } + + @Override + protected void addAdditionalSaveData(StructurePieceSerializationContext ctx, CompoundTag tagCompound) { + super.addAdditionalSaveData(ctx, tagCompound); + // too lazy to do this as a loop + tagCompound.putBoolean("openingTowards0", this.openingTowards[0]); + tagCompound.putBoolean("openingTowards1", this.openingTowards[1]); + tagCompound.putBoolean("openingTowards2", this.openingTowards[2]); + tagCompound.putBoolean("openingTowards3", this.openingTowards[3]); + } + + @Override + public void addChildren(StructurePiece parent, StructurePieceAccessor list, RandomSource rand) { + // make 4 caves + if (this.getGenDepth() < 3) { + for (final Rotation rotation : RotationUtil.ROTATIONS) { + BlockPos dest = getValidOpening(rand, rotation); + + if (rand.nextBoolean() || !makeGardenCave(list, rand, this.getGenDepth() + 1, dest.getX(), dest.getY(), dest.getZ(), 30, 15, rotation)) { + makeSmallerCave(list, rand, this.getGenDepth() + 1, dest.getX(), dest.getY(), dest.getZ(), 20, 15, rotation); + } + } + } + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { +// if (this.isBoundingBoxOutsideBiomes(world, sbb, highlands)) { +// return false; +// } + + // clear inside + hollowCaveMiddle(world, sbb, rand, 0, 0, 0, this.size - 1, this.height - 1, this.size - 1); + + RandomSource decoRNG = RandomSource.create(world.getSeed() + (this.boundingBox.minX() * 321534781L) ^ (this.boundingBox.minZ() * 756839L)); + + // wall decorations + for (Rotation rotation : RotationUtil.ROTATIONS) { + if (!this.openingTowards[rotation.ordinal()]) { + decorateWall(world, sbb, decoRNG, rotation); + } + } + + decoRNG.setSeed(world.getSeed() + (this.boundingBox.minX() * 321534781L) ^ (this.boundingBox.minZ() * 756839L)); + // stone stalactites! + for (int i = 0; i < 32; i++) { + BlockPos dest = getCoordsInCave(decoRNG); + generateBlockSpike(world, STONE_STALACTITE_SMALL, dest.atY(this.height), sbb, true); + } + // stone stalagmites! + for (int i = 0; i < 32; i++) { + BlockPos dest = getCoordsInCave(decoRNG); + generateBlockSpike(world, STONE_STALACTITE_SMALL, dest.atY(0), sbb, false); + } + + // possible treasure + decoRNG.setSeed(world.getSeed() + (this.boundingBox.minX() * 321534781L) ^ (this.boundingBox.minZ() * 756839L)); + if (this.countExits() == 1 && decoRNG.nextInt(3) == 0) { + // treasure! + makeTreasureCrate(world, sbb); + } else if (decoRNG.nextInt(3) == 0) { + // or a monolith! + makeMonolith(world, decoRNG, sbb); + } + } + + protected void makeMonolith(WorldGenLevel world, RandomSource rand, BoundingBox sbb) { + // monolith + int mid = this.size / 2; + int height = 7 + rand.nextInt(8); + Rotation rotation = RotationUtil.ROTATIONS[rand.nextInt(4)]; + + this.fillBlocksRotated(world, sbb, mid - 1, 0, mid - 1, mid - 1, height, mid - 1, Blocks.OBSIDIAN.defaultBlockState(), rotation); + this.fillBlocksRotated(world, sbb, mid, 0, mid - 1, mid, height - 2, mid - 1, Blocks.OBSIDIAN.defaultBlockState(), rotation); + this.fillBlocksRotated(world, sbb, mid - 1, 0, mid, mid - 1, height - 2, mid, Blocks.OBSIDIAN.defaultBlockState(), rotation); + this.fillBlocksRotated(world, sbb, mid, 0, mid, mid, height - 4, mid, Blocks.OBSIDIAN.defaultBlockState(), rotation); + } + + private int countExits() { + int count = 0; + for (boolean openingToward : this.openingTowards) { + if (openingToward) { + count++; + } + } + return count; + } + + private void decorateWall(WorldGenLevel world, BoundingBox sbb, RandomSource decoRNG, Rotation rotation) { + if (decoRNG.nextBoolean()) { + //FIXME: AtomicBlom: Don't do this, bring rotation all the way through. + decorateBracketMushrooms(world, sbb, decoRNG, rotation); + } else if (decoRNG.nextBoolean()) { + decorateStoneFormation(world, sbb, decoRNG, rotation); + decorateStoneFormation(world, sbb, decoRNG, rotation); + } else { + //decorateStoneProjection(world, sbb, decoRNG, rotation); + } + } + + private void decorateStoneFormation(WorldGenLevel world, BoundingBox sbb, RandomSource decoRNG, Rotation rotation) { + int z = 5 + decoRNG.nextInt(7); + int startY = 1 + decoRNG.nextInt(2); + + for (int y = startY; y < this.height; y += 2) { + + int width = 1; + int depth = 1 + (decoRNG.nextInt(3) == 0 ? 1 : 0); + makeSingleStoneFormation(world, sbb, decoRNG, rotation, z, y, width, depth); + + // wiggle a little + z += decoRNG.nextInt(4) - decoRNG.nextInt(4); + if (z < 5 || z > this.size - 5) { + z = 5 + decoRNG.nextInt(7); + } + } + } + + private void makeSingleStoneFormation(WorldGenLevel world, BoundingBox sbb, RandomSource decoRNG, Rotation rotation, int z, int y, int width, int depth) { + if (decoRNG.nextInt(8) == 0) { + this.fillBlocksRotated(world, sbb, size - (depth + 1), y - width, z - width, size - 1, y + width, z + width, Blocks.OBSIDIAN.defaultBlockState(), rotation); + } else if (decoRNG.nextInt(4) == 0) { + this.fillBlocksRotated(world, sbb, size - (depth + 1), y - width, z - width, size - 1, y + width, z + width, TFBlocks.TROLLSTEINN.get().defaultBlockState(), rotation); + } else { + // normal stone + this.fillBlocksRotated(world, sbb, size - (depth + 1), y - width, z - width, size - 1, y + width, z + width, Blocks.STONE.defaultBlockState(), rotation); + } + //this.randomlyFillBlocksRotated(world, sbb, decoRNG, 0.5F, size - (depth + 1), y - width, z - width, size - 1, y + width, z + width, TFBlocks.trollsteinn, 0, Blocks.STONE, 0, rotation); + } + + private void decorateStoneProjection(WorldGenLevel world, BoundingBox sbb, RandomSource decoRNG, Rotation rotation) { + int z = 7 + decoRNG.nextInt(3) - decoRNG.nextInt(3); + int y = 7 + decoRNG.nextInt(3) - decoRNG.nextInt(3); + + this.randomlyFillBlocksRotated(world, sbb, decoRNG, 0.25F, size - 9, y, z, size - 2, y + 3, z + 3, TFBlocks.TROLLSTEINN.get().defaultBlockState(), Blocks.STONE.defaultBlockState(), rotation); + if (decoRNG.nextBoolean()) { + // down + this.randomlyFillBlocksRotated(world, sbb, decoRNG, 0.25F, size - 9, 1, z, size - 6, y - 1, z + 3, TFBlocks.TROLLSTEINN.get().defaultBlockState(), Blocks.STONE.defaultBlockState(), rotation); + } else { + // up + this.randomlyFillBlocksRotated(world, sbb, decoRNG, 0.25F, size - 9, y + 4, z, size - 6, height - 2, z + 3, TFBlocks.TROLLSTEINN.get().defaultBlockState(), Blocks.STONE.defaultBlockState(), rotation); + } + } + + /** + * Decorate with a patch of bracket fungi + */ + private void decorateBracketMushrooms(WorldGenLevel world, BoundingBox sbb, RandomSource decoRNG, Rotation rotation) { + int z = 5 + decoRNG.nextInt(7); + int startY = 1 + decoRNG.nextInt(4); + + for (int y = startY; y < this.height; y += 2) { + + int width = 1 + decoRNG.nextInt(2) + decoRNG.nextInt(2); + int depth = 1 + decoRNG.nextInt(2) + decoRNG.nextInt(2); + Block mushBlock = ((decoRNG.nextInt(3) == 0) ? TFBlocks.HUGE_MUSHGLOOM.get() : (decoRNG.nextBoolean() ? Blocks.BROWN_MUSHROOM_BLOCK : Blocks.RED_MUSHROOM_BLOCK)); + makeSingleBracketMushroom(world, sbb, rotation, z, y, width, depth, mushBlock.defaultBlockState()); + + // wiggle a little + z += decoRNG.nextInt(4) - decoRNG.nextInt(4); + if (z < 5 || z > this.size - 5) { + z = 5 + decoRNG.nextInt(7); + } + } + } + + /** + * Make one mushroom with the specified parameters + */ + private void makeSingleBracketMushroom(WorldGenLevel world, BoundingBox sbb, Rotation rotation, int z, int y, int width, int depth, BlockState mushBlock) { + + this.fillBlocksRotated(world, sbb, size - depth, y, z - (width - 1), size - 2, y, z + (width - 1), HugeMushroomUtil.getState(HugeMushroomUtil.HugeMushroomType.CENTER, mushBlock), rotation); + + this.fillBlocksRotated(world, sbb, size - (depth + 1), y, z - (width - 1), size - (depth + 1), y, z + (width - 1), getMushroomState(mushBlock, HugeMushroomUtil.HugeMushroomType.EAST), rotation); + + final BlockState northMushroom = getMushroomState(mushBlock, HugeMushroomUtil.HugeMushroomType.SOUTH); + for (int d = 0; d < (depth - 1); d++) { + this.setBlockStateRotated(world, northMushroom, size - (2 + d), y, z - width, rotation, sbb); + } + final BlockState northWestMushroom = getMushroomState(mushBlock, HugeMushroomUtil.HugeMushroomType.SOUTH_EAST); + this.setBlockStateRotated(world, northWestMushroom, size - (depth + 1), y, z - width, rotation, sbb); + + final BlockState southMushroom = getMushroomState(mushBlock, HugeMushroomUtil.HugeMushroomType.NORTH); + for (int d = 0; d < (depth - 1); d++) { + this.setBlockStateRotated(world, southMushroom, size - (2 + d), y, z + width, rotation, sbb); + } + final BlockState southWestMushroom = getMushroomState(mushBlock, HugeMushroomUtil.HugeMushroomType.NORTH_EAST); + this.setBlockStateRotated(world, southWestMushroom, size - (depth + 1), y, z + width, rotation, sbb); + } + + private BlockState getMushroomState(BlockState mushroomBlockState, HugeMushroomUtil.HugeMushroomType defaultRotation) { + return HugeMushroomUtil.getState(defaultRotation, mushroomBlockState); + } + + protected boolean makeGardenCave(StructurePieceAccessor list, RandomSource rand, int index, int x, int y, int z, int caveSize, int caveHeight, Rotation rotation) { + Direction direction = getStructureRelativeRotation(rotation); + BlockPos dest = offsetTowerCCoords(x, y, z, caveSize, direction); + + TrollCaveMainComponent cave = new TrollCaveGardenComponent(index, dest.getX(), dest.getY(), dest.getZ(), caveSize, caveHeight, direction); + // check to see if it intersects something already there + StructurePiece intersect = list.findCollisionPiece(cave.getBoundingBox()); + StructurePiece otherGarden = findNearbyGarden(list, cave.getBoundingBox()); + if ((intersect == null || intersect == this) && otherGarden == null) { + list.addPiece(cave); + cave.addChildren(this, list, rand); + //addOpening(x, y, z, rotation); + + this.openingTowards[rotation.ordinal()] = true; + + return true; + } + return false; + } + + @Nullable + private StructurePiece findNearbyGarden(StructurePieceAccessor list, BoundingBox boundingBox) { + BoundingBox largeBox = new BoundingBox(boundingBox.minX() - 30, boundingBox.minY() - 30, boundingBox.minZ() - 30, boundingBox.maxX() - 30, boundingBox.maxY() - 30, boundingBox.maxZ() - 30); + + if (list instanceof StructurePiecesBuilder start) { + for (StructurePiece component : start.pieces) { + if (component instanceof TrollCaveGardenComponent && component.getBoundingBox().intersects(largeBox)) { + return component; + } + } + } + + return null; + } + + @Override + protected boolean makeSmallerCave(StructurePieceAccessor list, RandomSource rand, int index, int x, int y, int z, int caveSize, int caveHeight, Rotation rotation) { + if (super.makeSmallerCave(list, rand, index, x, y, z, caveSize, caveHeight, rotation)) { + this.openingTowards[rotation.ordinal()] = true; + return true; + } + return false; + } +} diff --git a/src/main/java/twilightforest/world/components/structures/trollcave/TrollCaveGardenComponent.java b/src/main/java/twilightforest/world/components/structures/trollcave/TrollCaveGardenComponent.java new file mode 100644 index 0000000000..6db212f166 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/trollcave/TrollCaveGardenComponent.java @@ -0,0 +1,115 @@ +package twilightforest.world.components.structures.trollcave; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.registries.Registries; +import net.minecraft.data.worldgen.features.TreeFeatures; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceKey; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFBiomes; +import twilightforest.init.TFLandmark; +import twilightforest.init.TFStructurePieceTypes; +import twilightforest.init.TFConfiguredFeatures; +import twilightforest.world.components.feature.BlockSpikeFeature; + +import java.util.function.Predicate; + + +public class TrollCaveGardenComponent extends TrollCaveMainComponent { + + public TrollCaveGardenComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFTCGard.get(), nbt); + } + + public TrollCaveGardenComponent(int index, int x, int y, int z, int caveSize, int caveHeight, Direction direction) { + super(TFStructurePieceTypes.TFTCGard.get(), index, x, y, z); + this.size = caveSize; + this.height = caveHeight; + this.setOrientation(direction); + this.boundingBox = TFLandmark.getComponentToAddBoundingBox(x, y, z, 0, 0, 0, size - 1, height - 1, size - 1, direction, false); + } + + @Override + public void addChildren(StructurePiece parent, StructurePieceAccessor list, RandomSource rand) { + // add a cloud + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + Predicate highlands = biome -> biome == world.registryAccess().registryOrThrow(Registries.BIOME).get(TFBiomes.HIGHLANDS); + if (this.isBoundingBoxOutsideBiomes(world, highlands)) { + return; + } + + // clear inside + hollowCaveMiddle(world, sbb, rand, 0, 0, 0, this.size - 1, this.height - 1, this.size - 1); + RandomSource decoRNG = RandomSource.create(world.getSeed() + (this.boundingBox.minX() * 321534781L) ^ (this.boundingBox.minZ() * 756839L)); + + // treasure! + makeTreasureCrate(world, sbb); + + // dirt! + for (int i = 0; i < 24; i++) { + BlockPos dest = getCoordsInCave(decoRNG); + generate(world, generator, TFConfiguredFeatures.TROLL_CAVE_DIRT, decoRNG, dest.getX(), 0, dest.getZ(), sbb); + } + + // mycelium! + for (int i = 0; i < 16; i++) { + BlockPos dest = getCoordsInCave(decoRNG); + generate(world, generator, TFConfiguredFeatures.TROLL_CAVE_MYCELIUM, decoRNG, dest.getX(), 0, dest.getZ(), sbb); + } + + // uberous! + for (int i = 0; i < 16; i++) { + BlockPos dest = getCoordsInCave(decoRNG); + generate(world, generator, TFConfiguredFeatures.UBEROUS_SOIL_PATCH_SMALL, decoRNG, dest.getX(), 0, dest.getZ(), sbb); + + generateAtSurface(world, generator, TFConfiguredFeatures.UBEROUS_SOIL_PATCH_SMALL, decoRNG, dest.getX(), dest.getZ(), sbb); + } + + // mushglooms first + for (int i = 0; i < 8; i++) { + BlockPos.MutableBlockPos dest = getCoordsInCave(decoRNG); + setBlockStateRotated(world, Blocks.MYCELIUM.defaultBlockState(), dest.getX(), dest.setY(0).getY(), dest.getZ(), this.rotation, sbb); + generate(world, generator, TFConfiguredFeatures.BIG_MUSHGLOOM, decoRNG, dest.getX(), dest.setY(1).getY(), dest.getZ(), sbb); + } + + // mushrooms! + for (int i = 0; i < 16; i++) { + BlockPos.MutableBlockPos dest = getCoordsInCave(decoRNG); + setBlockStateRotated(world, Blocks.MYCELIUM.defaultBlockState(), dest.getX(), dest.setY(0).getY(), dest.getZ(), this.rotation, sbb); + generate(world, generator, rand.nextBoolean() ? TreeFeatures.HUGE_BROWN_MUSHROOM : TreeFeatures.HUGE_RED_MUSHROOM, decoRNG, dest.getX(), dest.setY(1).getY(), dest.getZ(), sbb); + } + + // stone stalactites! + for (int i = 0; i < 128; i++) { + BlockPos dest = getCoordsInCave(decoRNG); + generateBlockSpike(world, BlockSpikeFeature.STONE_STALACTITE, dest.atY(this.height), sbb, true); + } + } + + protected void generate(WorldGenLevel world, ChunkGenerator generator, ResourceKey> feature, RandomSource rand, int x, int y, int z, BoundingBox sbb) { + // are the coordinates in our bounding box? + int dx = getWorldX(x, z); + int dy = getWorldY(y); + int dz = getWorldZ(x, z); + + BlockPos pos = new BlockPos(dx, dy, dz); + if (sbb.isInside(pos)) { + world.registryAccess().registryOrThrow(Registries.CONFIGURED_FEATURE).get(feature).place(world, generator, rand, pos); + } + } +} diff --git a/src/main/java/twilightforest/world/components/structures/trollcave/TrollCaveMainComponent.java b/src/main/java/twilightforest/world/components/structures/trollcave/TrollCaveMainComponent.java new file mode 100644 index 0000000000..0f426e0d5c --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/trollcave/TrollCaveMainComponent.java @@ -0,0 +1,259 @@ +package twilightforest.world.components.structures.trollcave; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Vec3i; +import net.minecraft.core.registries.Registries; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceKey; +import net.minecraft.tags.BlockTags; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructurePieceAccessor; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; +import org.jetbrains.annotations.Nullable; +import twilightforest.data.custom.stalactites.entry.Stalactite; +import twilightforest.init.TFBlocks; +import twilightforest.init.TFConfiguredFeatures; +import twilightforest.init.TFLandmark; +import twilightforest.init.TFStructurePieceTypes; +import twilightforest.loot.TFLootTables; +import twilightforest.util.RotationUtil; +import twilightforest.util.WorldUtil; +import twilightforest.world.components.feature.BlockSpikeFeature; +import twilightforest.world.components.structures.TFStructureComponentOld; + +import java.util.Objects; + +public class TrollCaveMainComponent extends TFStructureComponentOld { + + protected int size; + protected int height; + + public TrollCaveMainComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + this(TFStructurePieceTypes.TFTCMai.get(), nbt); + } + + public TrollCaveMainComponent(StructurePieceType piece, CompoundTag nbt) { + super(piece, nbt); + this.size = nbt.getInt("size"); + this.height = nbt.getInt("height"); + } + + public TrollCaveMainComponent(StructurePieceType type, int i, int x, int y, int z) { + super(type, i, x, y, z); + this.setOrientation(Direction.SOUTH); // DEPTH_AVERAGE + + // adjust y + //y += 10; + + this.size = 30; + this.height = 20; + + int radius = this.size / 2; + this.boundingBox = TFLandmark.getComponentToAddBoundingBox(x, y, z, -radius, -this.height, -radius, this.size, this.height, this.size, Direction.SOUTH, false); + } + + @Override + protected void addAdditionalSaveData(StructurePieceSerializationContext ctx, CompoundTag tagCompound) { + super.addAdditionalSaveData(ctx, tagCompound); + tagCompound.putInt("size", this.size); + tagCompound.putInt("height", this.height); + } + + @Override + public void addChildren(StructurePiece parent, StructurePieceAccessor list, RandomSource rand) { + // make 4 caves + for (final Rotation caveRotation : RotationUtil.ROTATIONS) { + BlockPos dest = getValidOpening(rand, caveRotation); + makeSmallerCave(list, rand, this.getGenDepth() + 1, dest.getX(), dest.getY(), dest.getZ(), 18, 15, caveRotation); + } + + // add cloud castle + CloudCastleComponent castle = new CloudCastleComponent(this.getGenDepth() + 1, boundingBox.minX() + ((boundingBox.maxX() - boundingBox.minX()) / 2), 168, boundingBox.minZ() + ((boundingBox.maxZ() - boundingBox.minZ()) / 2)); + list.addPiece(castle); + castle.addChildren(this, list, rand); + + // add vault + TrollVaultComponent vault = new TrollVaultComponent(this.getGenDepth() + 1, boundingBox.minX() + ((boundingBox.maxX() - boundingBox.minX()) / 2), boundingBox.minY(), boundingBox.minZ() + ((boundingBox.maxZ() - boundingBox.minZ()) / 2)); + list.addPiece(vault); + vault.addChildren(this, list, rand); + } + + protected boolean makeSmallerCave(StructurePieceAccessor list, RandomSource rand, int index, int x, int y, int z, int caveSize, int caveHeight, Rotation rotation) { + Direction direction = getStructureRelativeRotation(rotation); + BlockPos dest = offsetTowerCCoords(x, y, z, caveSize, direction); + + TrollCaveConnectComponent cave = new TrollCaveConnectComponent(index, dest.getX(), dest.getY(), dest.getZ(), caveSize, caveHeight, direction); + // check to see if it intersects something already there + StructurePiece intersect = list.findCollisionPiece(cave.getBoundingBox()); + if (intersect == null || intersect == this) { + list.addPiece(cave); + cave.addChildren(this, list, rand); + //addOpening(x, y, z, rotation); + return true; + } + return false; + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + RandomSource decoRNG = RandomSource.create(world.getSeed() + (this.boundingBox.minX() * 321534781L) ^ (this.boundingBox.minZ() * 756839L)); + + // clear inside + hollowCaveMiddle(world, sbb, rand, 0, 0, 0, this.size - 1, this.height - 1, this.size - 1); + + // stone stalactites! + for (int i = 0; i < 128; i++) { + BlockPos dest = getCoordsInCave(decoRNG); + generateBlockSpike(world, BlockSpikeFeature.STONE_STALACTITE, dest.atY(this.height), sbb, true); + } + // stone stalagmites! + for (int i = 0; i < 32; i++) { + BlockPos dest = getCoordsInCave(decoRNG); + generateBlockSpike(world, BlockSpikeFeature.STONE_STALACTITE, dest.atY(0), sbb, false); + } + + // uberous! + for (int i = 0; i < 32; i++) { + BlockPos dest = getCoordsInCave(decoRNG); + generateAtSurface(world, generator, TFConfiguredFeatures.UBEROUS_SOIL_PATCH_BIG, decoRNG, dest.getX(), dest.getZ(), sbb); + } + } + + protected BlockPos.MutableBlockPos getCoordsInCave(RandomSource rand) { + return new BlockPos.MutableBlockPos(rand.nextInt(this.size - 1), rand.nextInt(this.height - 1), rand.nextInt(this.size - 1)); + } + + protected void hollowCaveMiddle(WorldGenLevel world, BoundingBox boundingBox, RandomSource rand, int minX, int minY, int minZ, int maxX, int maxY, int maxZ) { + int threshold = this.size / 5; + + for (int y = minY; y <= maxY; ++y) { + for (int x = minX; x <= maxX; ++x) { + for (int z = minZ; z <= maxZ; ++z) { + + int ex = Math.min(x - minX, maxX - x); + int ey = Math.min((y - minY) * 2, maxY - y); + int ez = Math.min(z - minZ, maxZ - z); + + double dist = Math.sqrt(ex * ey * ez); + + if (dist > threshold) { + this.placeBlock(world, Blocks.AIR.defaultBlockState(), x, y, z, boundingBox); + } else if (dist == threshold && rand.nextInt(4) == 0 && this.getBlock(world, x, y, z, boundingBox).is(BlockTags.BASE_STONE_OVERWORLD)) { + this.placeBlock(world, TFBlocks.TROLLSTEINN.get().defaultBlockState(), x, y, z, boundingBox); + } + } + } + } + } + + /** + * Gets a random position in the specified direction that connects to stairs currently in the tower. + */ + @Nullable + public BlockPos getValidOpening(RandomSource rand, Rotation direction) { + // variables! + int offset = this.size / 4; // wall thickness + int wLength = size - (offset * 2); // wall length + + // for directions 0 or 2, the wall lies along the z axis + if (direction == Rotation.NONE || direction == Rotation.CLOCKWISE_180) { + int rx = direction == Rotation.NONE ? size - 1 : 0; + int rz = offset + rand.nextInt(wLength); + int ry = 0; + + return new BlockPos(rx, ry, rz); + } + + // for directions 1 or 3, the wall lies along the x axis + if (direction == Rotation.CLOCKWISE_90 || direction == Rotation.COUNTERCLOCKWISE_90) { + int rx = offset + rand.nextInt(wLength); + int rz = direction == Rotation.CLOCKWISE_90 ? size - 1 : 0; + int ry = (rand.nextInt(offset) - rand.nextInt(offset)); + + return new BlockPos(rx, ry, rz); + } + + return null; + } + + /** + * Provides coordinates to make a tower such that it will open into the parent tower at the provided coordinates. + */ + @Override + protected BlockPos offsetTowerCCoords(int x, int y, int z, int towerSize, Direction direction) { + + int dx = getWorldX(x, z); + int dy = getWorldY(y); + int dz = getWorldZ(x, z); + + if (direction == Direction.SOUTH) { + return new BlockPos(dx - 1, dy - 1, dz - towerSize / 2); + } else if (direction == Direction.WEST) { + return new BlockPos(dx + towerSize / 2, dy - 1, dz - 1); + } else if (direction == Direction.NORTH) { + return new BlockPos(dx + 1, dy - 1, dz + towerSize / 2); + } else if (direction == Direction.EAST) { + return new BlockPos(dx - towerSize / 2, dy - 1, dz + 1); + } + + // ugh? + return new BlockPos(x, y, z); + } + + protected void generateBlockSpike(WorldGenLevel world, Stalactite config, Vec3i pos, BoundingBox sbb, boolean hanging) { + generateBlockSpike(world, config, pos.getX(), pos.getY(), pos.getZ(), sbb, hanging); + } + + protected void generateBlockSpike(WorldGenLevel world, Stalactite config, int x, int y, int z, BoundingBox sbb, boolean hanging) { + // are the coordinates in our bounding box? + int dx = getWorldX(x, z); + int dy = getWorldY(y); + int dz = getWorldZ(x, z); + BlockPos pos = new BlockPos(dx, dy, dz); + if (sbb.isInside(pos)) { + // generate an RNG for this stalactite + RandomSource stalRNG = RandomSource.create(world.getSeed() + (long) dx * dz); + + // make the actual stalactite + BlockSpikeFeature.startSpike(world, pos, config, stalRNG, hanging); + } + } + + /** + * Use the generator at the surface above specified coords + */ + protected void generateAtSurface(WorldGenLevel world, ChunkGenerator generator, ResourceKey> feature, RandomSource rand, int x, int z, BoundingBox sbb) { + // are the coordinates in our bounding box? + int dx = getWorldX(x, z); + int dz = getWorldZ(x, z); + + BlockPos.MutableBlockPos pos = new BlockPos.MutableBlockPos(dx, WorldUtil.getSeaLevel(Objects.requireNonNull(WorldUtil.getChunkGenerator(world))) + 15, dz); + + for(int i = 0; i < 15; i++) { + pos.move(0, 1, 0); + if (sbb.isInside(pos) && world.getBlockState(pos.above()).isAir()) { + world.registryAccess().registryOrThrow(Registries.CONFIGURED_FEATURE).get(feature).place(world, generator, rand, pos); + break; + } + } + } + + protected void makeTreasureCrate(WorldGenLevel world, BoundingBox sbb) { + // treasure! + int mid = this.size / 2; + this.generateBox(world, sbb, mid - 2, 0, mid - 2, mid + 1, 3, mid + 1, Blocks.OBSIDIAN.defaultBlockState(), Blocks.OBSIDIAN.defaultBlockState(), false); + this.generateAirBox(world, sbb, mid - 1, 1, mid - 1, mid, 2, mid); + this.placeTreasureAtCurrentPosition(world, mid, 1, mid, TFLootTables.TROLL_GARDEN, false, sbb); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/trollcave/TrollCloudComponent.java b/src/main/java/twilightforest/world/components/structures/trollcave/TrollCloudComponent.java new file mode 100644 index 0000000000..a4089cb33d --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/trollcave/TrollCloudComponent.java @@ -0,0 +1,45 @@ +package twilightforest.world.components.structures.trollcave; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.world.components.structures.TFStructureComponentOld; +import twilightforest.init.TFStructurePieceTypes; + + +public class TrollCloudComponent extends TFStructureComponentOld { + + private final int size; + private final int height; + + public TrollCloudComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFTCloud.get(), nbt); + this.size = nbt.getInt("size"); + this.height = nbt.getInt("height"); + } + + @Override + protected void addAdditionalSaveData(StructurePieceSerializationContext ctx, CompoundTag tagCompound) { + super.addAdditionalSaveData(ctx, tagCompound); + tagCompound.putInt("size", this.size); + tagCompound.putInt("height", this.height); + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + placeCloud(world, sbb, 0, 0, 0, this.size - 1, 6, this.size - 1); + } + + protected void placeCloud(WorldGenLevel world, BoundingBox sbb, int minX, int minY, int minZ, int maxX, int maxY, int maxZ) { + this.generateBox(world, sbb, minX, minY, minZ, maxX, maxY, maxZ, Blocks.WHITE_STAINED_GLASS.defaultBlockState(), Blocks.WHITE_STAINED_GLASS.defaultBlockState(), false); + this.generateBox(world, sbb, minX + 2, minY + 2, minZ + 2, maxX - 2, maxY - 1, maxZ - 2, Blocks.QUARTZ_BLOCK.defaultBlockState(), Blocks.QUARTZ_BLOCK.defaultBlockState(), false); + + } +} diff --git a/src/main/java/twilightforest/world/components/structures/trollcave/TrollVaultComponent.java b/src/main/java/twilightforest/world/components/structures/trollcave/TrollVaultComponent.java new file mode 100644 index 0000000000..e2e70ca195 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/trollcave/TrollVaultComponent.java @@ -0,0 +1,57 @@ +package twilightforest.world.components.structures.trollcave; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import twilightforest.init.TFBlocks; +import twilightforest.loot.TFLootTables; +import twilightforest.world.components.structures.TFStructureComponentOld; +import twilightforest.init.TFLandmark; +import twilightforest.init.TFStructurePieceTypes; + + +public class TrollVaultComponent extends TFStructureComponentOld { + + public TrollVaultComponent(StructurePieceSerializationContext ctx, CompoundTag nbt) { + super(TFStructurePieceTypes.TFTCVa.get(), nbt); + } + + public TrollVaultComponent(int index, int x, int y, int z) { + super(TFStructurePieceTypes.TFTCVa.get(), index, x, y, z); + this.setOrientation(Direction.SOUTH); + + // adjust x, y, z + x = (x >> 2) << 2; + y = (y / 4) * 4; + z = (z >> 2) << 2; + + // spawn list! + this.spawnListIndex = -1; + + this.boundingBox = TFLandmark.getComponentToAddBoundingBox(x, y, z, -8, 0, -8, 12, 12, 12, Direction.SOUTH, false); + } + + @Override + public void postProcess(WorldGenLevel world, StructureManager manager, ChunkGenerator generator, RandomSource rand, BoundingBox sbb, ChunkPos chunkPosIn, BlockPos blockPos) { + // make walls + this.generateBox(world, sbb, 0, 0, 0, 11, 11, 11, TFBlocks.GIANT_OBSIDIAN.get().defaultBlockState(), TFBlocks.GIANT_OBSIDIAN.get().defaultBlockState(), false); + + // clear inside + this.generateAirBox(world, sbb, 4, 4, 4, 7, 7, 7); + + // cobblestone platform + this.generateBox(world, sbb, 5, 5, 5, 6, 5, 6, Blocks.COBBLESTONE.defaultBlockState(), Blocks.COBBLESTONE.defaultBlockState(), false); + + // chests + this.setDoubleLootChest(world, 5, 6, 5, 5, 6, 6, getOrientation().getClockWise(), TFLootTables.TROLL_VAULT, TFLootTables.TROLL_VAULT_WITH_LAMP, sbb, false); + this.setDoubleLootChest(world, 6, 6, 5, 6, 6, 6, getOrientation().getClockWise(), TFLootTables.TROLL_GARDEN, sbb, false); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/trollcave/package-info.java b/src/main/java/twilightforest/world/components/structures/trollcave/package-info.java new file mode 100644 index 0000000000..59f49d7561 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/trollcave/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.world.components.structures.trollcave; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/world/components/structures/type/AuroraPalaceStructure.java b/src/main/java/twilightforest/world/components/structures/type/AuroraPalaceStructure.java new file mode 100644 index 0000000000..e985b628a3 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/type/AuroraPalaceStructure.java @@ -0,0 +1,63 @@ +package twilightforest.world.components.structures.type; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.registries.Registries; +import net.minecraft.data.worldgen.BootstapContext; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.biome.MobSpawnSettings; +import net.minecraft.world.level.levelgen.GenerationStep; +import net.minecraft.world.level.levelgen.structure.Structure; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructureType; +import net.minecraft.world.level.levelgen.structure.TerrainAdjustment; +import org.jetbrains.annotations.Nullable; +import twilightforest.TwilightForestMod; +import twilightforest.data.tags.BiomeTagGenerator; +import twilightforest.init.TFEntities; +import twilightforest.init.TFStructureTypes; +import twilightforest.world.components.structures.icetower.IceTowerMainComponent; +import twilightforest.world.components.structures.util.ConquerableStructure; + +import java.util.List; +import java.util.Map; + +public class AuroraPalaceStructure extends ConquerableStructure { + public static final Codec CODEC = RecordCodecBuilder.create(instance -> + conquerStatusCodec(instance).apply(instance, AuroraPalaceStructure::new) + ); + + public AuroraPalaceStructure(ControlledSpawningConfig controlledSpawningConfig, AdvancementLockConfig advancementLockConfig, HintConfig hintConfig, DecorationConfig decorationConfig, StructureSettings structureSettings) { + super(controlledSpawningConfig, advancementLockConfig, hintConfig, decorationConfig, structureSettings); + } + + @Override + protected @Nullable StructurePiece getFirstPiece(GenerationContext context, RandomSource random, ChunkPos chunkPos, int x, int y, int z) { + return new IceTowerMainComponent(random, 0, x, y, z); + } + + @Override + public StructureType type() { + return TFStructureTypes.AURORA_PALACE.get(); + } + + public static AuroraPalaceStructure buildAuroraPalaceConfig(BootstapContext context) { + return new AuroraPalaceStructure( + ControlledSpawningConfig.firstIndexMonsters( + new MobSpawnSettings.SpawnerData(TFEntities.SNOW_GUARDIAN.get(), 10, 1, 2), + new MobSpawnSettings.SpawnerData(TFEntities.STABLE_ICE_CORE.get(), 10, 1, 2), + new MobSpawnSettings.SpawnerData(TFEntities.UNSTABLE_ICE_CORE.get(), 5, 1, 2) + ), + new AdvancementLockConfig(List.of(TwilightForestMod.prefix("progress_yeti"))), + new HintConfig(HintConfig.book("icetower", 3), TFEntities.KOBOLD.get()), + new DecorationConfig(2, false, true, false), + new StructureSettings( + context.lookup(Registries.BIOME).getOrThrow(BiomeTagGenerator.VALID_AURORA_PALACE_BIOMES), + Map.of(), // Landmarks have Controlled Mob spawning + GenerationStep.Decoration.SURFACE_STRUCTURES, + TerrainAdjustment.NONE + ) + ); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/type/DarkTowerStructure.java b/src/main/java/twilightforest/world/components/structures/type/DarkTowerStructure.java new file mode 100644 index 0000000000..f62410be78 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/type/DarkTowerStructure.java @@ -0,0 +1,75 @@ +package twilightforest.world.components.structures.type; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.registries.Registries; +import net.minecraft.data.worldgen.BootstapContext; +import net.minecraft.util.RandomSource; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.biome.MobSpawnSettings; +import net.minecraft.world.level.levelgen.GenerationStep; +import net.minecraft.world.level.levelgen.structure.Structure; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructureType; +import net.minecraft.world.level.levelgen.structure.TerrainAdjustment; +import org.jetbrains.annotations.Nullable; +import twilightforest.TwilightForestMod; +import twilightforest.data.tags.BiomeTagGenerator; +import twilightforest.init.TFEntities; +import twilightforest.init.TFStructureTypes; +import twilightforest.world.components.structures.darktower.DarkTowerMainComponent; +import twilightforest.world.components.structures.util.ConquerableStructure; + +import java.util.List; +import java.util.Map; + +public class DarkTowerStructure extends ConquerableStructure { + public static final Codec CODEC = RecordCodecBuilder.create(instance -> + conquerStatusCodec(instance).apply(instance, DarkTowerStructure::new) + ); + + public DarkTowerStructure(ControlledSpawningConfig controlledSpawningConfig, AdvancementLockConfig advancementLockConfig, HintConfig hintConfig, DecorationConfig decorationConfig, StructureSettings structureSettings) { + super(controlledSpawningConfig, advancementLockConfig, hintConfig, decorationConfig, structureSettings); + } + + @Override + protected @Nullable StructurePiece getFirstPiece(GenerationContext context, RandomSource random, ChunkPos chunkPos, int x, int y, int z) { + return new DarkTowerMainComponent(random, 0, x, y, z); + } + + @Override + public StructureType type() { + return TFStructureTypes.DARK_TOWER.get(); + } + + public static DarkTowerStructure buildDarkTowerConfig(BootstapContext context) { + return new DarkTowerStructure( + ControlledSpawningConfig.create(List.of(List.of( + new MobSpawnSettings.SpawnerData(TFEntities.CARMINITE_GOLEM.get(), 10, 1, 2), + new MobSpawnSettings.SpawnerData(EntityType.SKELETON, 10, 1, 2), + new MobSpawnSettings.SpawnerData(EntityType.CREEPER, 5, 1, 1), + new MobSpawnSettings.SpawnerData(EntityType.ENDERMAN, 2, 1, 2), + new MobSpawnSettings.SpawnerData(EntityType.WITCH, 1, 1, 1), + new MobSpawnSettings.SpawnerData(TFEntities.CARMINITE_GHASTLING.get(), 10, 1, 2), + new MobSpawnSettings.SpawnerData(TFEntities.CARMINITE_BROODLING.get(), 10, 4, 4), + new MobSpawnSettings.SpawnerData(TFEntities.PINCH_BEETLE.get(), 10, 1, 1) + ), List.of( + // roof ghasts + new MobSpawnSettings.SpawnerData(TFEntities.CARMINITE_GHASTGUARD.get(), 10, 1, 2) + )), List.of(), List.of( + // aquarium squids (only in aquariums between y = 35 and y = 64. :/ + new MobSpawnSettings.SpawnerData(EntityType.SQUID, 10, 4, 4) + )), + new AdvancementLockConfig(List.of(TwilightForestMod.prefix("progress_knights"))), + new HintConfig(HintConfig.book("darktower", 3), TFEntities.KOBOLD.get()), + new DecorationConfig(1, false, true, true), + new StructureSettings( + context.lookup(Registries.BIOME).getOrThrow(BiomeTagGenerator.VALID_DARK_TOWER_BIOMES), + Map.of(), // Landmarks have Controlled Mob spawning + GenerationStep.Decoration.SURFACE_STRUCTURES, + TerrainAdjustment.BEARD_THIN + ) + ); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/type/FinalCastleStructure.java b/src/main/java/twilightforest/world/components/structures/type/FinalCastleStructure.java new file mode 100644 index 0000000000..8294e0ff79 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/type/FinalCastleStructure.java @@ -0,0 +1,76 @@ +package twilightforest.world.components.structures.type; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.registries.Registries; +import net.minecraft.data.worldgen.BootstapContext; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.levelgen.GenerationStep; +import net.minecraft.world.level.levelgen.structure.Structure; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructureType; +import net.minecraft.world.level.levelgen.structure.TerrainAdjustment; +import org.jetbrains.annotations.Nullable; +import twilightforest.TwilightForestMod; +import twilightforest.data.tags.BiomeTagGenerator; +import twilightforest.init.TFEntities; +import twilightforest.init.TFStructureTypes; +import twilightforest.world.components.structures.finalcastle.FinalCastleMainComponent; +import twilightforest.world.components.structures.util.ConquerableStructure; + +import java.util.List; +import java.util.Map; + +public class FinalCastleStructure extends ConquerableStructure { + public static final Codec CODEC = RecordCodecBuilder.create(instance -> + conquerStatusCodec(instance).apply(instance, FinalCastleStructure::new) + ); + + public FinalCastleStructure(ControlledSpawningConfig controlledSpawningConfig, AdvancementLockConfig advancementLockConfig, HintConfig hintConfig, DecorationConfig decorationConfig, StructureSettings structureSettings) { + super(controlledSpawningConfig, advancementLockConfig, hintConfig, decorationConfig, structureSettings); + } + + @Override + protected @Nullable StructurePiece getFirstPiece(GenerationContext context, RandomSource random, ChunkPos chunkPos, int x, int y, int z) { + return new FinalCastleMainComponent(0, x, y, z); + } + + @Override + public StructureType type() { + return TFStructureTypes.FINAL_CASTLE.get(); + } + + public static FinalCastleStructure buildFinalCastleConfig(BootstapContext context) { + return new FinalCastleStructure( // TODO Re-enable mob spawns + ControlledSpawningConfig.create(List.of(List.of( + // plain parts of the castle, like the tower maze + //new MobSpawnSettings.SpawnerData(TFEntities.KOBOLD.get(), 10, 1, 2), + //new MobSpawnSettings.SpawnerData(TFEntities.ADHERENT.get(), 10, 1, 1), + //new MobSpawnSettings.SpawnerData(TFEntities.HARBINGER_CUBE.get(), 10, 1, 1), + //new MobSpawnSettings.SpawnerData(EntityType.ENDERMAN, 10, 1, 1) + ), List.of( + // internal castle + //new MobSpawnSettings.SpawnerData(TFEntities.KOBOLD.get(), 10, 1, 2), + //new MobSpawnSettings.SpawnerData(TFEntities.ADHERENT.get(), 10, 1, 1), + //new MobSpawnSettings.SpawnerData(TFEntities.HARBINGER_CUBE.get(), 10, 1, 1), + //new MobSpawnSettings.SpawnerData(TFEntities.ARMORED_GIANT.get(), 10, 1, 1) + ), List.of( + // dungeons + //new MobSpawnSettings.SpawnerData(TFEntities.ADHERENT.get(), 10, 1, 1) + ), List.of( + // forge + //new MobSpawnSettings.SpawnerData(EntityType.BLAZE, 10, 1, 1) + )), List.of(), List.of()), + new AdvancementLockConfig(List.of(TwilightForestMod.prefix("progress_troll"))), + new HintConfig(HintConfig.defaultBook(), TFEntities.KOBOLD.get()), + new DecorationConfig(4, false, true, false), + new StructureSettings( + context.lookup(Registries.BIOME).getOrThrow(BiomeTagGenerator.VALID_FINAL_CASTLE_BIOMES), + Map.of(), // Landmarks have Controlled Mob spawning + GenerationStep.Decoration.SURFACE_STRUCTURES, + TerrainAdjustment.BEARD_THIN + ) + ); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/type/HedgeMazeStructure.java b/src/main/java/twilightforest/world/components/structures/type/HedgeMazeStructure.java new file mode 100644 index 0000000000..c858d7c2da --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/type/HedgeMazeStructure.java @@ -0,0 +1,50 @@ +package twilightforest.world.components.structures.type; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.registries.Registries; +import net.minecraft.data.worldgen.BootstapContext; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.levelgen.GenerationStep; +import net.minecraft.world.level.levelgen.structure.Structure; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructureType; +import net.minecraft.world.level.levelgen.structure.TerrainAdjustment; +import twilightforest.data.tags.BiomeTagGenerator; +import twilightforest.init.TFStructureTypes; +import twilightforest.world.components.structures.HedgeMazeComponent; +import twilightforest.world.components.structures.util.DecorationClearance; +import twilightforest.world.components.structures.util.LandmarkStructure; + +import java.util.Map; + +public class HedgeMazeStructure extends LandmarkStructure { + public static final Codec CODEC = RecordCodecBuilder.create(instance -> landmarkCodec(instance).apply(instance, HedgeMazeStructure::new)); + + public HedgeMazeStructure(DecorationConfig decorationConfig, StructureSettings structureSettings) { + super(decorationConfig, structureSettings); + } + + @Override + protected StructurePiece getFirstPiece(GenerationContext context, RandomSource random, ChunkPos chunkPos, int x, int y, int z) { + return new HedgeMazeComponent(0, x + 1, context.chunkGenerator().getSeaLevel() + 8, z + 1); + } + + @Override + public StructureType type() { + return TFStructureTypes.HEDGE_MAZE.get(); + } + + public static HedgeMazeStructure buildStructureConfig(BootstapContext context) { + return new HedgeMazeStructure( + new DecorationClearance.DecorationConfig(2, false, true, true), + new Structure.StructureSettings( + context.lookup(Registries.BIOME).getOrThrow(BiomeTagGenerator.VALID_HEDGE_MAZE_BIOMES), + Map.of(), // Landmarks have Controlled Mob spawning + GenerationStep.Decoration.SURFACE_STRUCTURES, + TerrainAdjustment.BEARD_THIN + ) + ); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/type/HollowHillStructure.java b/src/main/java/twilightforest/world/components/structures/type/HollowHillStructure.java new file mode 100644 index 0000000000..bef5b28a49 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/type/HollowHillStructure.java @@ -0,0 +1,144 @@ +package twilightforest.world.components.structures.type; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.BlockPos; +import net.minecraft.core.registries.Registries; +import net.minecraft.data.worldgen.BootstapContext; +import net.minecraft.util.Mth; +import net.minecraft.util.RandomSource; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.biome.MobSpawnSettings; +import net.minecraft.world.level.levelgen.GenerationStep; +import net.minecraft.world.level.levelgen.structure.*; +import twilightforest.data.tags.BiomeTagGenerator; +import twilightforest.init.TFEntities; +import twilightforest.init.TFStructurePieceTypes; +import twilightforest.init.TFStructureTypes; +import twilightforest.world.components.structures.HollowHillComponent; +import twilightforest.world.components.structures.util.ConfigurableSpawns; +import twilightforest.world.components.structures.util.LandmarkStructure; + +import java.util.List; +import java.util.Map; + +public class HollowHillStructure extends LandmarkStructure implements ConfigurableSpawns { + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance + .group( + // TODO Clean up findGenerationPoint() first before even thinking about increasing upper limit + Codec.intRange(1, 3).fieldOf("hill_size").forGetter(s -> s.size), + ControlledSpawningConfig.FLAT_CODEC.forGetter(s -> s.controlledSpawningConfig) + ) + .and(landmarkCodec(instance)) + .apply(instance, HollowHillStructure::new) + ); + + private final int size; + private final ControlledSpawningConfig controlledSpawningConfig; + + public HollowHillStructure(int size, ControlledSpawningConfig controlledSpawningConfig, DecorationConfig decorationConfig, StructureSettings structureSettings) { + super(decorationConfig, structureSettings); + this.size = size; + this.controlledSpawningConfig = controlledSpawningConfig; + } + + // "Cuts" the box into a half-dome + public boolean canSpawnMob(BlockPos spawnPos, BoundingBox structureStartBox) { + float hX = Mth.inverseLerp(spawnPos.getX(), structureStartBox.minX(), structureStartBox.maxX()) * 2 - 1; + float hY = Mth.inverseLerp(spawnPos.getY(), structureStartBox.minY(), structureStartBox.maxY()); + float hZ = Mth.inverseLerp(spawnPos.getZ(), structureStartBox.minZ(), structureStartBox.maxZ()) * 2 - 1; + + return Mth.length(hX, hY, hZ) < 0.975f; + } + + @Override + protected StructurePiece getFirstPiece(GenerationContext context, RandomSource random, ChunkPos chunkPos, int x, int y, int z) { + return switch (this.size) { // TODO Clean up once TFLandmark params are no longer necessary + case 1 -> new HollowHillComponent(TFStructurePieceTypes.TFHill.get(), 0, this.size, x - 3, y - 2, z - 3); + case 2 -> new HollowHillComponent(TFStructurePieceTypes.TFHill.get(), 0, this.size, x - 7, y - 5, z - 7); + default -> new HollowHillComponent(TFStructurePieceTypes.TFHill.get(), 0, this.size, x - 11, y - 5, z - 11); + }; + } + + @Override + public StructureType type() { + return TFStructureTypes.HOLLOW_HILL.get(); + } + + @Override + public ControlledSpawningConfig getConfig() { + return this.controlledSpawningConfig; + } + + public static HollowHillStructure buildSmallHillConfig(BootstapContext context) { + return new HollowHillStructure( + 1, + ControlledSpawningConfig.create(List.of(List.of( + new MobSpawnSettings.SpawnerData(EntityType.SPIDER, 10, 4, 4), + new MobSpawnSettings.SpawnerData(EntityType.ZOMBIE, 10, 4, 4), + new MobSpawnSettings.SpawnerData(TFEntities.REDCAP.get(), 10, 4, 4), + new MobSpawnSettings.SpawnerData(TFEntities.SWARM_SPIDER.get(), 10, 4, 4), + new MobSpawnSettings.SpawnerData(TFEntities.KOBOLD.get(), 10, 4, 8) + )), List.of(), List.of()), + new DecorationConfig(1, true, false, false), + new StructureSettings( + context.lookup(Registries.BIOME).getOrThrow(BiomeTagGenerator.VALID_HOLLOW_HILL_BIOMES), + Map.of(), // Landmarks have Controlled Mob spawning + GenerationStep.Decoration.SURFACE_STRUCTURES, + TerrainAdjustment.NONE + ) + ); + } + + public static HollowHillStructure buildMediumHillConfig(BootstapContext context) { + return new HollowHillStructure( + 2, + ControlledSpawningConfig.create(List.of(List.of( + new MobSpawnSettings.SpawnerData(TFEntities.REDCAP.get(), 10, 1, 2), + new MobSpawnSettings.SpawnerData(TFEntities.REDCAP_SAPPER.get(), 1, 1, 2), + new MobSpawnSettings.SpawnerData(TFEntities.KOBOLD.get(), 10, 2, 4), + new MobSpawnSettings.SpawnerData(EntityType.SKELETON, 10, 2, 3), + new MobSpawnSettings.SpawnerData(TFEntities.SWARM_SPIDER.get(), 10, 2, 4), + new MobSpawnSettings.SpawnerData(EntityType.SPIDER, 10, 1, 3), + new MobSpawnSettings.SpawnerData(EntityType.CREEPER, 10, 1, 2), + new MobSpawnSettings.SpawnerData(TFEntities.FIRE_BEETLE.get(), 5, 1, 1), + new MobSpawnSettings.SpawnerData(TFEntities.SLIME_BEETLE.get(), 5, 1, 1), + new MobSpawnSettings.SpawnerData(EntityType.WITCH, 1, 1, 1) + )), List.of(), List.of()), + new DecorationConfig(2, true, false, false), + new StructureSettings( + context.lookup(Registries.BIOME).getOrThrow(BiomeTagGenerator.VALID_HOLLOW_HILL_BIOMES), + Map.of(), // Landmarks have Controlled Mob spawning + GenerationStep.Decoration.SURFACE_STRUCTURES, + TerrainAdjustment.NONE + ) + ); + } + + public static HollowHillStructure buildLargeHillConfig(BootstapContext context) { + return new HollowHillStructure( + 3, + ControlledSpawningConfig.firstIndexMonsters( + new MobSpawnSettings.SpawnerData(TFEntities.REDCAP.get(), 10, 2, 4), + new MobSpawnSettings.SpawnerData(TFEntities.REDCAP_SAPPER.get(), 2, 1, 2), + new MobSpawnSettings.SpawnerData(EntityType.SKELETON, 10, 2, 3), + new MobSpawnSettings.SpawnerData(EntityType.CAVE_SPIDER, 10, 1, 2), + new MobSpawnSettings.SpawnerData(EntityType.CREEPER, 10, 1, 1), + new MobSpawnSettings.SpawnerData(EntityType.ENDERMAN, 1, 1, 1), + new MobSpawnSettings.SpawnerData(TFEntities.WRAITH.get(), 2, 1, 2), + new MobSpawnSettings.SpawnerData(TFEntities.FIRE_BEETLE.get(), 10, 1, 2), + new MobSpawnSettings.SpawnerData(TFEntities.SLIME_BEETLE.get(), 10, 1, 2), + new MobSpawnSettings.SpawnerData(TFEntities.PINCH_BEETLE.get(), 10, 1, 2), + new MobSpawnSettings.SpawnerData(EntityType.WITCH, 1, 1, 1) + ), + new DecorationConfig(3, true, false, false), + new StructureSettings( + context.lookup(Registries.BIOME).getOrThrow(BiomeTagGenerator.VALID_HOLLOW_HILL_BIOMES), + Map.of(), // Landmarks have Controlled Mob spawning + GenerationStep.Decoration.SURFACE_STRUCTURES, + TerrainAdjustment.NONE + ) + ); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/type/HydraLairStructure.java b/src/main/java/twilightforest/world/components/structures/type/HydraLairStructure.java new file mode 100644 index 0000000000..af96937956 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/type/HydraLairStructure.java @@ -0,0 +1,57 @@ +package twilightforest.world.components.structures.type; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.registries.Registries; +import net.minecraft.data.worldgen.BootstapContext; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.levelgen.GenerationStep; +import net.minecraft.world.level.levelgen.structure.Structure; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructureType; +import net.minecraft.world.level.levelgen.structure.TerrainAdjustment; +import org.jetbrains.annotations.Nullable; +import twilightforest.TwilightForestMod; +import twilightforest.data.tags.BiomeTagGenerator; +import twilightforest.init.TFEntities; +import twilightforest.init.TFStructureTypes; +import twilightforest.world.components.structures.HydraLairComponent; +import twilightforest.world.components.structures.util.ProgressionStructure; + +import java.util.List; +import java.util.Map; + +public class HydraLairStructure extends ProgressionStructure { + public static final Codec CODEC = RecordCodecBuilder.create(instance -> + progressionCodec(instance).apply(instance, HydraLairStructure::new) + ); + + public HydraLairStructure(AdvancementLockConfig advancementLockConfig, HintConfig hintConfig, DecorationConfig decorationConfig, StructureSettings structureSettings) { + super(advancementLockConfig, hintConfig, decorationConfig, structureSettings); + } + + @Override + protected @Nullable StructurePiece getFirstPiece(GenerationContext context, RandomSource random, ChunkPos chunkPos, int x, int y, int z) { + return new HydraLairComponent(0, x - 7, y, z - 7); + } + + @Override + public StructureType type() { + return TFStructureTypes.HYDRA_LAIR.get(); + } + + public static HydraLairStructure buildHydraLairConfig(BootstapContext context) { + return new HydraLairStructure( + new AdvancementLockConfig(List.of(TwilightForestMod.prefix("progress_labyrinth"))), + new HintConfig(HintConfig.book("hydralair", 4), TFEntities.KOBOLD.get()), + new DecorationConfig(2, false, false, false), + new StructureSettings( + context.lookup(Registries.BIOME).getOrThrow(BiomeTagGenerator.VALID_HYDRA_LAIR_BIOMES), + Map.of(), // Landmarks have Controlled Mob spawning + GenerationStep.Decoration.SURFACE_STRUCTURES, + TerrainAdjustment.NONE + ) + ); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/type/KnightStrongholdStructure.java b/src/main/java/twilightforest/world/components/structures/type/KnightStrongholdStructure.java new file mode 100644 index 0000000000..aba26ad9a2 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/type/KnightStrongholdStructure.java @@ -0,0 +1,69 @@ +package twilightforest.world.components.structures.type; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.registries.Registries; +import net.minecraft.data.worldgen.BootstapContext; +import net.minecraft.util.RandomSource; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.biome.MobSpawnSettings; +import net.minecraft.world.level.levelgen.GenerationStep; +import net.minecraft.world.level.levelgen.structure.Structure; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructureType; +import net.minecraft.world.level.levelgen.structure.TerrainAdjustment; +import org.jetbrains.annotations.Nullable; +import twilightforest.TwilightForestMod; +import twilightforest.data.tags.BiomeTagGenerator; +import twilightforest.init.TFEntities; +import twilightforest.init.TFStructureTypes; +import twilightforest.world.components.structures.stronghold.StrongholdEntranceComponent; +import twilightforest.world.components.structures.util.ConquerableStructure; + +import java.util.List; +import java.util.Map; + +public class KnightStrongholdStructure extends ConquerableStructure { + public static final Codec CODEC = RecordCodecBuilder.create(instance -> + conquerStatusCodec(instance).apply(instance, KnightStrongholdStructure::new) + ); + + public KnightStrongholdStructure(ControlledSpawningConfig controlledSpawningConfig, AdvancementLockConfig advancementLockConfig, HintConfig hintConfig, DecorationConfig decorationConfig, StructureSettings structureSettings) { + super(controlledSpawningConfig, advancementLockConfig, hintConfig, decorationConfig, structureSettings); + } + + @Override + protected @Nullable StructurePiece getFirstPiece(GenerationContext context, RandomSource random, ChunkPos chunkPos, int x, int y, int z) { + return new StrongholdEntranceComponent(0, x, y + 5, z); + } + + @Override + public StructureType type() { + return TFStructureTypes.KNIGHT_STRONGHOLD.get(); + } + + public static KnightStrongholdStructure buildKnightStrongholdConfig(BootstapContext context) { + return new KnightStrongholdStructure( + ControlledSpawningConfig.firstIndexMonsters( + new MobSpawnSettings.SpawnerData(TFEntities.BLOCKCHAIN_GOBLIN.get(), 10, 1, 2), + new MobSpawnSettings.SpawnerData(TFEntities.LOWER_GOBLIN_KNIGHT.get(), 5, 1, 2), + new MobSpawnSettings.SpawnerData(TFEntities.HELMET_CRAB.get(), 10, 2, 4), + new MobSpawnSettings.SpawnerData(TFEntities.SLIME_BEETLE.get(), 10, 2, 3), + new MobSpawnSettings.SpawnerData(TFEntities.REDCAP_SAPPER.get(), 2, 1, 2), + new MobSpawnSettings.SpawnerData(TFEntities.KOBOLD.get(), 10, 2, 4), + new MobSpawnSettings.SpawnerData(EntityType.CREEPER, 5, 1, 2), + new MobSpawnSettings.SpawnerData(EntityType.SLIME, 5, 4, 4) + ), + new AdvancementLockConfig(List.of(TwilightForestMod.prefix("progress_trophy_pedestal"))), + new HintConfig(HintConfig.book("tfstronghold", 4), TFEntities.KOBOLD.get()), + new DecorationConfig(3, true, false, false), + new StructureSettings( + context.lookup(Registries.BIOME).getOrThrow(BiomeTagGenerator.VALID_KNIGHT_STRONGHOLD_BIOMES), + Map.of(), // Landmarks have Controlled Mob spawning + GenerationStep.Decoration.UNDERGROUND_STRUCTURES, + TerrainAdjustment.BURY + ) + ); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/type/LabyrinthStructure.java b/src/main/java/twilightforest/world/components/structures/type/LabyrinthStructure.java new file mode 100644 index 0000000000..befaee5e53 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/type/LabyrinthStructure.java @@ -0,0 +1,75 @@ +package twilightforest.world.components.structures.type; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.registries.Registries; +import net.minecraft.data.worldgen.BootstapContext; +import net.minecraft.util.RandomSource; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.biome.MobSpawnSettings; +import net.minecraft.world.level.levelgen.GenerationStep; +import net.minecraft.world.level.levelgen.structure.Structure; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructureType; +import net.minecraft.world.level.levelgen.structure.TerrainAdjustment; +import org.jetbrains.annotations.Nullable; +import twilightforest.TwilightForestMod; +import twilightforest.data.tags.BiomeTagGenerator; +import twilightforest.init.TFEntities; +import twilightforest.init.TFStructureTypes; +import twilightforest.world.components.structures.minotaurmaze.MazeRuinsComponent; +import twilightforest.world.components.structures.util.ConfigurableSpawns; +import twilightforest.world.components.structures.util.ConquerableStructure; + +import java.util.List; +import java.util.Map; + +public class LabyrinthStructure extends ConquerableStructure implements ConfigurableSpawns { + public static final Codec CODEC = RecordCodecBuilder.create(instance -> + conquerStatusCodec(instance).apply(instance, LabyrinthStructure::new) + ); + + public LabyrinthStructure(ControlledSpawningConfig controlledSpawningConfig, AdvancementLockConfig advancementLockConfig, HintConfig hintConfig, DecorationConfig decorationConfig, StructureSettings structureSettings) { + super(controlledSpawningConfig, advancementLockConfig, hintConfig, decorationConfig, structureSettings); + } + + @Override + protected @Nullable StructurePiece getFirstPiece(GenerationContext context, RandomSource random, ChunkPos chunkPos, int x, int y, int z) { + return new MazeRuinsComponent(0, x, y, z); + } + + @Override + public ControlledSpawningConfig getConfig() { + return this.controlledSpawningConfig; + } + + @Override + public StructureType type() { + return TFStructureTypes.LABYRINTH.get(); + } + + public static LabyrinthStructure buildLabyrinthConfig(BootstapContext context) { + return new LabyrinthStructure( + ControlledSpawningConfig.firstIndexMonsters( + new MobSpawnSettings.SpawnerData(TFEntities.MINOTAUR.get(), 20, 2, 3), + new MobSpawnSettings.SpawnerData(EntityType.CAVE_SPIDER, 10, 1, 2), + new MobSpawnSettings.SpawnerData(EntityType.CREEPER, 10, 1, 2), + new MobSpawnSettings.SpawnerData(TFEntities.MAZE_SLIME.get(), 10, 2, 4), + new MobSpawnSettings.SpawnerData(EntityType.ENDERMAN, 1, 1, 2), + new MobSpawnSettings.SpawnerData(TFEntities.FIRE_BEETLE.get(), 10, 1, 2), + new MobSpawnSettings.SpawnerData(TFEntities.SLIME_BEETLE.get(), 10, 1, 2), + new MobSpawnSettings.SpawnerData(TFEntities.PINCH_BEETLE.get(), 10, 1, 1) + ), + new AdvancementLockConfig(List.of(TwilightForestMod.prefix("progress_lich"))), + new HintConfig(HintConfig.book("labyrinth", 5), TFEntities.KOBOLD.get()), + new DecorationConfig(3, true, false, false), + new StructureSettings( + context.lookup(Registries.BIOME).getOrThrow(BiomeTagGenerator.VALID_LABYRINTH_BIOMES), + Map.of(), // Landmarks have Controlled Mob spawning + GenerationStep.Decoration.UNDERGROUND_STRUCTURES, + TerrainAdjustment.BURY + ) + ); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/type/LegacyStructure.java b/src/main/java/twilightforest/world/components/structures/type/LegacyStructure.java new file mode 100644 index 0000000000..f8240fd168 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/type/LegacyStructure.java @@ -0,0 +1,48 @@ +package twilightforest.world.components.structures.type; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructureType; +import org.jetbrains.annotations.Nullable; +import twilightforest.init.TFLandmark; +import twilightforest.init.TFStructureTypes; +import twilightforest.world.components.structures.util.ConquerableStructure; + +@Deprecated +public class LegacyStructure extends ConquerableStructure { + public final TFLandmark feature; + + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance + .group(TFLandmark.CODEC.fieldOf("legacy_landmark_start").forGetter(LegacyStructure::getFeatureType)) + .and(conquerStatusCodec(instance)) + .apply(instance, LegacyStructure::new) + ); + + public LegacyStructure(TFLandmark landmark, ControlledSpawningConfig controlledSpawningConfig, AdvancementLockConfig advancementLockConfig, HintConfig hintConfig, DecorationConfig decorationConfig, StructureSettings structureSettings) { + super(controlledSpawningConfig, advancementLockConfig, hintConfig, decorationConfig, structureSettings); + this.feature = landmark; + } + + @Override + protected @Nullable StructurePiece getFirstPiece(GenerationContext context, RandomSource random, ChunkPos chunkPos, int x, int y, int z) { + return this.feature.provideFirstPiece(context.structureTemplateManager(), context.chunkGenerator(), random, x, y, z); + } + + @Override + @Deprecated + protected boolean dontCenter() { + return this.feature == TFLandmark.LICH_TOWER || this.feature == TFLandmark.TROLL_CAVE || this.feature == TFLandmark.YETI_CAVE; + } + + @Override + public StructureType type() { + return TFStructureTypes.LEGACY_LANDMARK.get(); + } + + public TFLandmark getFeatureType() { + return this.feature; + } +} diff --git a/src/main/java/twilightforest/world/components/structures/type/LichTowerStructure.java b/src/main/java/twilightforest/world/components/structures/type/LichTowerStructure.java new file mode 100644 index 0000000000..50ecddfa65 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/type/LichTowerStructure.java @@ -0,0 +1,73 @@ +package twilightforest.world.components.structures.type; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.registries.Registries; +import net.minecraft.data.worldgen.BootstapContext; +import net.minecraft.util.RandomSource; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.biome.MobSpawnSettings; +import net.minecraft.world.level.levelgen.GenerationStep; +import net.minecraft.world.level.levelgen.structure.Structure; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructureType; +import net.minecraft.world.level.levelgen.structure.TerrainAdjustment; +import org.jetbrains.annotations.Nullable; +import twilightforest.TwilightForestMod; +import twilightforest.data.tags.BiomeTagGenerator; +import twilightforest.init.TFEntities; +import twilightforest.init.TFStructureTypes; +import twilightforest.world.components.structures.lichtower.TowerMainComponent; +import twilightforest.world.components.structures.util.ConquerableStructure; + +import java.util.List; +import java.util.Map; + +public class LichTowerStructure extends ConquerableStructure { + public static final Codec CODEC = RecordCodecBuilder.create(instance -> + conquerStatusCodec(instance).apply(instance, LichTowerStructure::new) + ); + + public LichTowerStructure(ControlledSpawningConfig controlledSpawningConfig, AdvancementLockConfig advancementLockConfig, HintConfig hintConfig, DecorationConfig decorationConfig, StructureSettings structureSettings) { + super(controlledSpawningConfig, advancementLockConfig, hintConfig, decorationConfig, structureSettings); + } + + @Override + protected @Nullable StructurePiece getFirstPiece(GenerationContext context, RandomSource random, ChunkPos chunkPos, int x, int y, int z) { + return new TowerMainComponent(random, 0, x, y, z); + //return new TowerFoyer(context.structureTemplateManager(), new BlockPos(x, y + 1, z)); + } + + @Override + public StructureType type() { + return TFStructureTypes.LICH_TOWER.get(); + } + + @Override + protected boolean dontCenter() { + return true; + } + + public static LichTowerStructure buildLichTowerConfig(BootstapContext context) { + return new LichTowerStructure( + ControlledSpawningConfig.firstIndexMonsters( + new MobSpawnSettings.SpawnerData(EntityType.ZOMBIE, 10, 1, 2), + new MobSpawnSettings.SpawnerData(EntityType.SKELETON, 10, 1, 2), + new MobSpawnSettings.SpawnerData(EntityType.CREEPER, 1, 1, 1), + new MobSpawnSettings.SpawnerData(EntityType.ENDERMAN, 1, 1, 2), + new MobSpawnSettings.SpawnerData(TFEntities.DEATH_TOME.get(), 10, 2, 3), + new MobSpawnSettings.SpawnerData(EntityType.WITCH, 1, 1, 1) + ), + new AdvancementLockConfig(List.of(TwilightForestMod.prefix("progress_naga"))), + new HintConfig(HintConfig.book("lichtower", 4), TFEntities.KOBOLD.get()), + new DecorationConfig(1, false, true, true), + new StructureSettings( + context.lookup(Registries.BIOME).getOrThrow(BiomeTagGenerator.VALID_LICH_TOWER_BIOMES), + Map.of(), // Landmarks have Controlled Mob spawning + GenerationStep.Decoration.SURFACE_STRUCTURES, + TerrainAdjustment.BEARD_THIN + ) + ); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/type/MushroomTowerStructure.java b/src/main/java/twilightforest/world/components/structures/type/MushroomTowerStructure.java new file mode 100644 index 0000000000..286a3a7de2 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/type/MushroomTowerStructure.java @@ -0,0 +1,49 @@ +package twilightforest.world.components.structures.type; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.registries.Registries; +import net.minecraft.data.worldgen.BootstapContext; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.levelgen.GenerationStep; +import net.minecraft.world.level.levelgen.structure.Structure; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructureType; +import net.minecraft.world.level.levelgen.structure.TerrainAdjustment; +import twilightforest.data.tags.BiomeTagGenerator; +import twilightforest.init.TFStructureTypes; +import twilightforest.world.components.structures.mushroomtower.MushroomTowerMainComponent; +import twilightforest.world.components.structures.util.LandmarkStructure; + +import java.util.Map; + +public class MushroomTowerStructure extends LandmarkStructure { + public static final Codec CODEC = RecordCodecBuilder.create(instance -> landmarkCodec(instance).apply(instance, MushroomTowerStructure::new)); + + public MushroomTowerStructure(DecorationConfig decorationConfig, StructureSettings structureSettings) { + super(decorationConfig, structureSettings); + } + + @Override + protected StructurePiece getFirstPiece(GenerationContext context, RandomSource random, ChunkPos chunkPos, int x, int y, int z) { + return new MushroomTowerMainComponent(random, 0, x, y, z); + } + + @Override + public StructureType type() { + return TFStructureTypes.MUSHROOM_TOWER.get(); + } + + public static MushroomTowerStructure buildStructureConfig(BootstapContext context) { + return new MushroomTowerStructure( + new DecorationConfig(2, true, true, true), + new StructureSettings( + context.lookup(Registries.BIOME).getOrThrow(BiomeTagGenerator.VALID_MUSHROOM_TOWER_BIOMES), + Map.of(), // Landmarks have Controlled Mob spawning + GenerationStep.Decoration.SURFACE_STRUCTURES, + TerrainAdjustment.NONE + ) + ); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/type/NagaCourtyardStructure.java b/src/main/java/twilightforest/world/components/structures/type/NagaCourtyardStructure.java new file mode 100644 index 0000000000..cff3188697 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/type/NagaCourtyardStructure.java @@ -0,0 +1,49 @@ +package twilightforest.world.components.structures.type; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.registries.Registries; +import net.minecraft.data.worldgen.BootstapContext; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.levelgen.GenerationStep; +import net.minecraft.world.level.levelgen.structure.Structure; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructureType; +import net.minecraft.world.level.levelgen.structure.TerrainAdjustment; +import twilightforest.data.tags.BiomeTagGenerator; +import twilightforest.init.TFStructureTypes; +import twilightforest.world.components.structures.courtyard.CourtyardMain; +import twilightforest.world.components.structures.util.LandmarkStructure; + +import java.util.Map; + +public class NagaCourtyardStructure extends LandmarkStructure { + public static final Codec CODEC = RecordCodecBuilder.create(instance -> landmarkCodec(instance).apply(instance, NagaCourtyardStructure::new)); + + public NagaCourtyardStructure(DecorationConfig decorationConfig, StructureSettings structureSettings) { + super(decorationConfig, structureSettings); + } + + @Override + protected StructurePiece getFirstPiece(GenerationContext context, RandomSource random, ChunkPos chunkPos, int x, int y, int z) { + return new CourtyardMain(random, 0, x + 1, context.chunkGenerator().getSeaLevel() + 5, z + 1, context.structureTemplateManager()); + } + + @Override + public StructureType type() { + return TFStructureTypes.NAGA_COURTYARD.get(); + } + + public static NagaCourtyardStructure buildStructureConfig(BootstapContext context) { + return new NagaCourtyardStructure( + new DecorationConfig(3, false, true, true), + new StructureSettings( + context.lookup(Registries.BIOME).getOrThrow(BiomeTagGenerator.VALID_NAGA_COURTYARD_BIOMES), + Map.of(), // Landmarks have Controlled Mob spawning + GenerationStep.Decoration.SURFACE_STRUCTURES, + TerrainAdjustment.BEARD_THIN + ) + ); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/type/QuestGroveStructure.java b/src/main/java/twilightforest/world/components/structures/type/QuestGroveStructure.java new file mode 100644 index 0000000000..1e7b1283ce --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/type/QuestGroveStructure.java @@ -0,0 +1,50 @@ +package twilightforest.world.components.structures.type; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.BlockPos; +import net.minecraft.core.registries.Registries; +import net.minecraft.data.worldgen.BootstapContext; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.levelgen.GenerationStep; +import net.minecraft.world.level.levelgen.structure.Structure; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructureType; +import net.minecraft.world.level.levelgen.structure.TerrainAdjustment; +import twilightforest.data.tags.BiomeTagGenerator; +import twilightforest.init.TFStructureTypes; +import twilightforest.world.components.structures.QuestGrove; +import twilightforest.world.components.structures.util.LandmarkStructure; + +import java.util.Map; + +public class QuestGroveStructure extends LandmarkStructure { + public static final Codec CODEC = RecordCodecBuilder.create(instance -> landmarkCodec(instance).apply(instance, QuestGroveStructure::new)); + + public QuestGroveStructure(DecorationConfig decorationConfig, StructureSettings structureSettings) { + super(decorationConfig, structureSettings); + } + + @Override + protected StructurePiece getFirstPiece(GenerationContext context, RandomSource random, ChunkPos chunkPos, int x, int y, int z) { + return new QuestGrove(context.structureTemplateManager(), new BlockPos(x - 12, context.chunkGenerator().getSeaLevel() + 5, z - 12)); + } + + @Override + public StructureType type() { + return TFStructureTypes.QUEST_GROVE.get(); + } + + public static QuestGroveStructure buildStructureConfig(BootstapContext context) { + return new QuestGroveStructure( + new DecorationConfig(1, false, true, true), + new StructureSettings( + context.lookup(Registries.BIOME).getOrThrow(BiomeTagGenerator.VALID_QUEST_GROVE_BIOMES), + Map.of(), // Landmarks have Controlled Mob spawning + GenerationStep.Decoration.SURFACE_STRUCTURES, + TerrainAdjustment.BEARD_THIN + ) + ); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/type/TrollCaveStructure.java b/src/main/java/twilightforest/world/components/structures/type/TrollCaveStructure.java new file mode 100644 index 0000000000..01c4113f9a --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/type/TrollCaveStructure.java @@ -0,0 +1,86 @@ +package twilightforest.world.components.structures.type; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.registries.Registries; +import net.minecraft.data.worldgen.BootstapContext; +import net.minecraft.util.RandomSource; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.biome.MobSpawnSettings; +import net.minecraft.world.level.levelgen.GenerationStep; +import net.minecraft.world.level.levelgen.structure.Structure; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructureType; +import net.minecraft.world.level.levelgen.structure.TerrainAdjustment; +import org.jetbrains.annotations.Nullable; +import twilightforest.TwilightForestMod; +import twilightforest.data.tags.BiomeTagGenerator; +import twilightforest.init.TFEntities; +import twilightforest.init.TFStructurePieceTypes; +import twilightforest.init.TFStructureTypes; +import twilightforest.world.components.structures.trollcave.TrollCaveMainComponent; +import twilightforest.world.components.structures.util.ConfigurableSpawns; +import twilightforest.world.components.structures.util.ControlledSpawns; +import twilightforest.world.components.structures.util.ProgressionStructure; + +import java.util.List; +import java.util.Map; + +public class TrollCaveStructure extends ProgressionStructure implements ConfigurableSpawns { + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance + .group(ControlledSpawns.ControlledSpawningConfig.FLAT_CODEC.forGetter(ConfigurableSpawns::getConfig)) + .and(progressionCodec(instance)) + .apply(instance, TrollCaveStructure::new) + ); + private final ControlledSpawningConfig controlledSpawningConfig; + + public TrollCaveStructure(ControlledSpawningConfig controlledSpawningConfig, AdvancementLockConfig advancementLockConfig, HintConfig hintConfig, DecorationConfig decorationConfig, StructureSettings structureSettings) { + super(advancementLockConfig, hintConfig, decorationConfig, structureSettings); + this.controlledSpawningConfig = controlledSpawningConfig; + } + + @Override + protected @Nullable StructurePiece getFirstPiece(GenerationContext context, RandomSource random, ChunkPos chunkPos, int x, int y, int z) { + return new TrollCaveMainComponent(TFStructurePieceTypes.TFTCMai.get(), 0, x, y, z); + } + + @Override + public StructureType type() { + return TFStructureTypes.TROLL_CAVE.get(); + } + + @Override + public ControlledSpawningConfig getConfig() { + return this.controlledSpawningConfig; + } + + @Override + protected boolean dontCenter() { + return true; + } + + public static TrollCaveStructure buildTrollCaveConfig(BootstapContext context) { + return new TrollCaveStructure( + ControlledSpawningConfig.create(List.of(List.of( + new MobSpawnSettings.SpawnerData(EntityType.CREEPER, 5, 1, 2), + new MobSpawnSettings.SpawnerData(EntityType.SKELETON, 10, 1, 2), + new MobSpawnSettings.SpawnerData(TFEntities.TROLL.get(), 20, 1, 2), + new MobSpawnSettings.SpawnerData(EntityType.WITCH, 5, 1, 1) + ), List.of( + // cloud monsters + new MobSpawnSettings.SpawnerData(TFEntities.GIANT_MINER.get(), 10, 1, 1), + new MobSpawnSettings.SpawnerData(TFEntities.ARMORED_GIANT.get(), 10, 1, 1) + )), List.of(), List.of()), + new AdvancementLockConfig(List.of(TwilightForestMod.prefix("progress_merge"))), + new HintConfig(HintConfig.book("trollcave", 3), TFEntities.KOBOLD.get()), + new DecorationConfig(4, true, true, false), + new StructureSettings( + context.lookup(Registries.BIOME).getOrThrow(BiomeTagGenerator.VALID_TROLL_CAVE_BIOMES), + Map.of(), // Landmarks have Controlled Mob spawning + GenerationStep.Decoration.UNDERGROUND_STRUCTURES, + TerrainAdjustment.BURY + ) + ); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/type/YetiCaveStructure.java b/src/main/java/twilightforest/world/components/structures/type/YetiCaveStructure.java new file mode 100644 index 0000000000..7085134772 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/type/YetiCaveStructure.java @@ -0,0 +1,64 @@ +package twilightforest.world.components.structures.type; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.registries.Registries; +import net.minecraft.data.worldgen.BootstapContext; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.biome.MobSpawnSettings; +import net.minecraft.world.level.levelgen.GenerationStep; +import net.minecraft.world.level.levelgen.structure.Structure; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.StructureType; +import net.minecraft.world.level.levelgen.structure.TerrainAdjustment; +import org.jetbrains.annotations.Nullable; +import twilightforest.TwilightForestMod; +import twilightforest.data.tags.BiomeTagGenerator; +import twilightforest.init.TFEntities; +import twilightforest.init.TFStructureTypes; +import twilightforest.world.components.structures.YetiCaveComponent; +import twilightforest.world.components.structures.util.ConquerableStructure; + +import java.util.List; +import java.util.Map; + +public class YetiCaveStructure extends ConquerableStructure { + public static final Codec CODEC = RecordCodecBuilder.create(instance -> + conquerStatusCodec(instance).apply(instance, YetiCaveStructure::new) + ); + + public YetiCaveStructure(ControlledSpawningConfig controlledSpawningConfig, AdvancementLockConfig advancementLockConfig, HintConfig hintConfig, DecorationConfig decorationConfig, StructureSettings structureSettings) { + super(controlledSpawningConfig, advancementLockConfig, hintConfig, decorationConfig, structureSettings); + } + + @Override + protected @Nullable StructurePiece getFirstPiece(GenerationContext context, RandomSource random, ChunkPos chunkPos, int x, int y, int z) { + return new YetiCaveComponent(0, x, y, z); + } + + @Override + public StructureType type() { + return TFStructureTypes.YETI_CAVE.get(); + } + + @Override + protected boolean dontCenter() { + return true; + } + + public static YetiCaveStructure buildYetiCaveConfig(BootstapContext context) { + return new YetiCaveStructure( + ControlledSpawningConfig.firstIndexMonsters(new MobSpawnSettings.SpawnerData(TFEntities.YETI.get(), 5, 1, 2)), + new AdvancementLockConfig(List.of(TwilightForestMod.prefix("progress_lich"))), + new HintConfig(HintConfig.book("yeticave", 3), TFEntities.KOBOLD.get()), + new DecorationConfig(2, true, false, false), + new StructureSettings( + context.lookup(Registries.BIOME).getOrThrow(BiomeTagGenerator.VALID_YETI_CAVE_BIOMES), + Map.of(), // Landmarks have Controlled Mob spawning + GenerationStep.Decoration.SURFACE_STRUCTURES, + TerrainAdjustment.BURY + ) + ); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/type/package-info.java b/src/main/java/twilightforest/world/components/structures/type/package-info.java new file mode 100644 index 0000000000..809ae89965 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/type/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.world.components.structures.type; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/world/components/structures/util/AdvancementLockedStructure.java b/src/main/java/twilightforest/world/components/structures/util/AdvancementLockedStructure.java new file mode 100644 index 0000000000..60e4598c42 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/util/AdvancementLockedStructure.java @@ -0,0 +1,22 @@ +package twilightforest.world.components.structures.util; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; +import twilightforest.util.PlayerHelper; + +import java.util.List; + +public interface AdvancementLockedStructure { + default boolean doesPlayerHaveRequiredAdvancements(Player player) { + return PlayerHelper.playerHasRequiredAdvancements(player, this.getRequiredAdvancements()); + } + + List getRequiredAdvancements(); + + record AdvancementLockConfig(List requiredAdvancements) { + public static Codec CODEC = ResourceLocation.CODEC.listOf().xmap(AdvancementLockConfig::new, AdvancementLockConfig::requiredAdvancements); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/util/ConfigurableSpawns.java b/src/main/java/twilightforest/world/components/structures/util/ConfigurableSpawns.java new file mode 100644 index 0000000000..05af448279 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/util/ConfigurableSpawns.java @@ -0,0 +1,35 @@ +package twilightforest.world.components.structures.util; + +import net.minecraft.world.entity.MobCategory; +import net.minecraft.world.level.biome.MobSpawnSettings; + +import java.util.List; + +public interface ConfigurableSpawns extends ControlledSpawns { + ControlledSpawningConfig getConfig(); + + @Override + default List getCombinedMonsterSpawnableList() { + return this.getConfig().combinedMonsterSpawnableCache(); + } + + @Override + default List getCombinedCreatureSpawnableList() { + return this.getConfig().combinedCreatureSpawnableCache(); + } + + @Override + default List getSpawnableList(MobCategory creatureType) { + return switch (creatureType) { + case MONSTER -> this.getSpawnableMonsterList(0); + case AMBIENT -> this.getConfig().ambientCreatureList(); + case WATER_CREATURE -> this.getConfig().waterCreatureList(); + default -> List.of(); + }; + } + + @Override + default List getSpawnableMonsterList(int index) { + return this.getConfig().getForLabel("" + index); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/util/ConquerableStructure.java b/src/main/java/twilightforest/world/components/structures/util/ConquerableStructure.java new file mode 100644 index 0000000000..46e866cc34 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/util/ConquerableStructure.java @@ -0,0 +1,61 @@ +package twilightforest.world.components.structures.util; + +import com.mojang.datafixers.Products; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.Holder; +import net.minecraft.core.RegistryAccess; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.LevelHeightAccessor; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.biome.BiomeSource; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.RandomState; +import net.minecraft.world.level.levelgen.structure.StructureStart; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePiecesBuilder; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplateManager; +import twilightforest.util.LegacyLandmarkPlacements; +import twilightforest.world.components.structures.start.TFStructureStart; + +import java.util.Optional; +import java.util.function.Predicate; + +public abstract class ConquerableStructure extends ProgressionStructure implements CustomStructureData, ConfigurableSpawns { + protected static Products.P5, ControlledSpawningConfig, AdvancementLockConfig, HintConfig, DecorationConfig, StructureSettings> conquerStatusCodec(RecordCodecBuilder.Instance instance) { + return instance.group( + ControlledSpawningConfig.FLAT_CODEC.forGetter(ConquerableStructure::getConfig) + ).and(progressionCodec(instance)); + } + + protected final ControlledSpawningConfig controlledSpawningConfig; + + public ConquerableStructure(ControlledSpawningConfig controlledSpawningConfig, AdvancementLockConfig advancementLockConfig, HintConfig hintConfig, DecorationConfig decorationConfig, StructureSettings structureSettings) { + super(advancementLockConfig, hintConfig, decorationConfig, structureSettings); + this.controlledSpawningConfig = controlledSpawningConfig; + } + + @Override + public StructureStart generate(RegistryAccess registryAccess, ChunkGenerator chunkGen, BiomeSource biomeSource, RandomState randomState, StructureTemplateManager templateManager, long seed, ChunkPos chunkPos, int references, LevelHeightAccessor heightAccessor, Predicate> isValidBiome) { + return LegacyLandmarkPlacements.chunkHasLandmarkCenter(chunkPos) ? this.generateCustom(registryAccess, chunkGen, biomeSource, randomState, templateManager, seed, chunkPos, references, heightAccessor, isValidBiome) : StructureStart.INVALID_START; + } + + // [VANILLA COPY] Structure.generate + // StructureStart construction swapped for TFStructureStart construction + public StructureStart generateCustom(RegistryAccess registryAccess, ChunkGenerator chunkGen, BiomeSource biomeSource, RandomState randomState, StructureTemplateManager templateManager, long pseed, ChunkPos chunkPos, int references, LevelHeightAccessor heightAccessor, Predicate> isValidBiome) { + GenerationContext structure$generationcontext = new GenerationContext(registryAccess, chunkGen, biomeSource, randomState, templateManager, pseed, chunkPos, heightAccessor, isValidBiome); + Optional optional = this.findValidGenerationPoint(structure$generationcontext); + if (optional.isPresent()) { + StructurePiecesBuilder structurepiecesbuilder = optional.get().getPiecesBuilder(); + StructureStart structurestart = new TFStructureStart(this, chunkPos, references, structurepiecesbuilder.build()); + if (structurestart.isValid()) { + return structurestart; + } + } + + return StructureStart.INVALID_START; + } + + @Override + public ControlledSpawningConfig getConfig() { + return this.controlledSpawningConfig; + } +} diff --git a/src/main/java/twilightforest/world/components/structures/util/ControlledSpawns.java b/src/main/java/twilightforest/world/components/structures/util/ControlledSpawns.java new file mode 100644 index 0000000000..e651635c1a --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/util/ControlledSpawns.java @@ -0,0 +1,73 @@ +package twilightforest.world.components.structures.util; + +import com.google.common.collect.Streams; +import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.world.entity.MobCategory; +import net.minecraft.world.level.biome.MobSpawnSettings; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +// FIXME Using IDs to enumerate lists of mob spawn tables is a bad idea... Using String for now in the config, will transition this implementation detail later +public interface ControlledSpawns { + List getCombinedMonsterSpawnableList(); + + List getCombinedCreatureSpawnableList(); + + /** + * Returns a list of hostile monsters. Are we ever going to need passive or water creatures? + */ + List getSpawnableList(MobCategory creatureType); + + /** + * Returns a list of hostile monsters in the specified indexed category + */ + List getSpawnableMonsterList(int index); + + record ControlledSpawningConfig(Map> spawnableMonsterLists, List ambientCreatureList, List waterCreatureList, List combinedMonsterSpawnableCache, List combinedCreatureSpawnableCache) { + public static final MapCodec FLAT_CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( + Codec.unboundedMap(Codec.STRING, MobSpawnSettings.SpawnerData.CODEC.listOf()).fieldOf("labelled_monster_spawns").forGetter(ControlledSpawningConfig::spawnableMonsterLists), + MobSpawnSettings.SpawnerData.CODEC.listOf().fieldOf("ambient_spawns").forGetter(ControlledSpawningConfig::ambientCreatureList), + MobSpawnSettings.SpawnerData.CODEC.listOf().fieldOf("water_spawns").forGetter(ControlledSpawningConfig::waterCreatureList) + ).apply(instance, ControlledSpawningConfig::create)); + + public static final ControlledSpawningConfig EMPTY = create(Map.of(), List.of(), List.of()); + + public static ControlledSpawningConfig firstIndexMonsters(MobSpawnSettings.SpawnerData... spawnableMonsterList) { + return create(List.of(List.of(spawnableMonsterList)), List.of(), List.of()); + } + + public static ControlledSpawningConfig create(List> spawnableMonsterLists, List ambientCreatureList, List waterCreatureList) { + return create(convertMonsterList(spawnableMonsterLists), ambientCreatureList, waterCreatureList); + } + + public static ControlledSpawningConfig create(Map> spawnableMonsterLists, List ambientCreatureList, List waterCreatureList) { + return new ControlledSpawningConfig( + spawnableMonsterLists, + ambientCreatureList, + waterCreatureList, + spawnableMonsterLists.values().stream().flatMap(List::stream).toList(), + Streams.concat(ambientCreatureList.stream(), waterCreatureList.stream()).toList() + ); + } + + private static Map> convertMonsterList(List> lists) { + int i = 0; + Map> map = new HashMap<>(); + + for (List list : lists) { + map.put("" + i, list); + i++; + } + + return map; + } + + public List getForLabel(String index) { + return this.spawnableMonsterLists().getOrDefault(index, List.of()); + } + } +} diff --git a/src/main/java/twilightforest/world/components/structures/util/CustomStructureData.java b/src/main/java/twilightforest/world/components/structures/util/CustomStructureData.java new file mode 100644 index 0000000000..a9afc93d1c --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/util/CustomStructureData.java @@ -0,0 +1,15 @@ +package twilightforest.world.components.structures.util; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.levelgen.structure.Structure; +import net.minecraft.world.level.levelgen.structure.pieces.PiecesContainer; +import twilightforest.world.components.structures.start.TFStructureStart; + +public interface CustomStructureData { + default TFStructureStart forDeserialization(Structure structure, ChunkPos chunkPos, int references, PiecesContainer pieces, CompoundTag nbt) { + TFStructureStart start = new TFStructureStart(structure, chunkPos, references, pieces); + start.load(nbt); + return start; + } +} diff --git a/src/main/java/twilightforest/world/components/structures/util/DecorationClearance.java b/src/main/java/twilightforest/world/components/structures/util/DecorationClearance.java new file mode 100644 index 0000000000..d20180d713 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/util/DecorationClearance.java @@ -0,0 +1,35 @@ +package twilightforest.world.components.structures.util; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.util.Mth; +import net.minecraft.world.level.levelgen.Heightmap; +import net.minecraft.world.level.levelgen.structure.Structure; + +public interface DecorationClearance { + int chunkClearanceRadius(); + + boolean isSurfaceDecorationsAllowed(); + + boolean isUndergroundDecoAllowed(); + + boolean shouldAdjustToTerrain(); + + default int adjustForTerrain(Structure.GenerationContext context, int x, int z) { + return this.shouldAdjustToTerrain() + ? Mth.clamp(context.chunkGenerator().getFirstOccupiedHeight(x, z, Heightmap.Types.WORLD_SURFACE_WG, context.heightAccessor(), context.randomState()), context.chunkGenerator().getSeaLevel() + 1, context.chunkGenerator().getSeaLevel() + 7) + : context.chunkGenerator().getSeaLevel(); + } + + record DecorationConfig(int chunkClearanceRadius, boolean surfaceDecorations, boolean undergroundDecorations, @Deprecated boolean adjustElevation) { + public static MapCodec FLAT_CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( + Codec.intRange(1, 8).fieldOf("chunk_clearance_radius").orElse(1).forGetter(DecorationConfig::chunkClearanceRadius), + Codec.BOOL.fieldOf("allow_biome_surface_decorations").forGetter(DecorationConfig::surfaceDecorations), + Codec.BOOL.fieldOf("allow_biome_underground_decorations").forGetter(DecorationConfig::undergroundDecorations), + Codec.BOOL.fieldOf("adjust_structure_elevation").forGetter(DecorationConfig::adjustElevation) + ).apply(instance, DecorationConfig::new)); + + public static Codec CODEC = FLAT_CODEC.codec(); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/util/LandmarkStructure.java b/src/main/java/twilightforest/world/components/structures/util/LandmarkStructure.java new file mode 100644 index 0000000000..ee8104e2c1 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/util/LandmarkStructure.java @@ -0,0 +1,85 @@ +package twilightforest.world.components.structures.util; + +import com.mojang.datafixers.Products; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.BlockPos; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.levelgen.structure.Structure; +import net.minecraft.world.level.levelgen.structure.StructurePiece; +import org.jetbrains.annotations.Nullable; +import twilightforest.world.components.structures.TFStructureComponentTemplate; + +import java.util.Optional; + +// Landmark structure without progression lock; Hollow Hills/Hedge Maze/Naga Courtyard/Quest Grove +public abstract class LandmarkStructure extends Structure implements DecorationClearance { + protected static Products.P2, DecorationConfig, StructureSettings> landmarkCodec(RecordCodecBuilder.Instance instance) { + return instance.group( + DecorationConfig.FLAT_CODEC.forGetter(s -> s.decorationConfig), + Structure.settingsCodec(instance) + ); + } + + protected final DecorationConfig decorationConfig; + + public LandmarkStructure(DecorationConfig decorationConfig, StructureSettings structureSettings) { + super(structureSettings); + this.decorationConfig = decorationConfig; + } + + private static Structure.GenerationStub getStructurePieceGenerationStubFunction(StructurePiece startingPiece, GenerationContext context, int x, int y, int z) { + return new GenerationStub(new BlockPos(x, y, z), structurePiecesBuilder -> { + structurePiecesBuilder.addPiece(startingPiece); + startingPiece.addChildren(startingPiece, structurePiecesBuilder, context.random()); + + structurePiecesBuilder.pieces.stream() + .filter(TFStructureComponentTemplate.class::isInstance) + .map(TFStructureComponentTemplate.class::cast) + .forEach(t -> t.LAZY_TEMPLATE_LOADER.run()); + }); + } + + @Override + protected Optional findGenerationPoint(GenerationContext context) { + ChunkPos chunkPos = context.chunkPos(); + + boolean dontCenter = this.dontCenter(); + int x = (chunkPos.x << 4) + (dontCenter ? 0 : 7); + int z = (chunkPos.z << 4) + (dontCenter ? 0 : 7); + int y = this.adjustForTerrain(context, x, z); + + return Optional + .ofNullable(this.getFirstPiece(context, RandomSource.create(context.seed() + chunkPos.x * 25117L + chunkPos.z * 151121L), chunkPos, x, y, z)) + .map(piece -> getStructurePieceGenerationStubFunction(piece, context, x, y, z)) + ; + } + + @Deprecated + protected boolean dontCenter() { + return false; + } + + @Nullable + protected abstract StructurePiece getFirstPiece(GenerationContext context, RandomSource random, ChunkPos chunkPos, int x, int y, int z); + + @Override + public boolean isSurfaceDecorationsAllowed() { + return this.decorationConfig.surfaceDecorations(); + } + + @Override + public boolean isUndergroundDecoAllowed() { + return this.decorationConfig.undergroundDecorations(); + } + + @Override + public boolean shouldAdjustToTerrain() { + return this.decorationConfig.adjustElevation(); + } + + @Override + public int chunkClearanceRadius() { + return this.decorationConfig.chunkClearanceRadius(); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/util/ProgressionStructure.java b/src/main/java/twilightforest/world/components/structures/util/ProgressionStructure.java new file mode 100644 index 0000000000..0680ff7a46 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/util/ProgressionStructure.java @@ -0,0 +1,74 @@ +package twilightforest.world.components.structures.util; + +import com.mojang.datafixers.Products; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.BlockPos; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; + +import org.jetbrains.annotations.Nullable; +import java.util.List; + +// Landmark structure with a progression lock; Lich Tower/Labyrinth/Hydra Lair/Final Castle/etc +public abstract class ProgressionStructure extends LandmarkStructure implements AdvancementLockedStructure, StructureHints { + protected static Products.P4, AdvancementLockConfig, HintConfig, DecorationConfig, StructureSettings> progressionCodec(RecordCodecBuilder.Instance instance) { + return instance.group( + AdvancementLockConfig.CODEC.fieldOf("advancements_required").forGetter(s -> s.advancementLockConfig), + HintConfig.FLAT_CODEC.forGetter(s -> s.hintConfig) + ).and(landmarkCodec(instance)); + } + + protected final AdvancementLockConfig advancementLockConfig; + protected final HintConfig hintConfig; + + public ProgressionStructure(AdvancementLockConfig advancementLockConfig, HintConfig hintConfig, DecorationConfig decorationConfig, StructureSettings structureSettings) { + super(decorationConfig, structureSettings); + + this.advancementLockConfig = advancementLockConfig; + this.hintConfig = hintConfig; + } + + @Override + public List getRequiredAdvancements() { + return this.advancementLockConfig.requiredAdvancements(); + } + + /** + * Try several times to spawn a hint monster + */ + private long lastSpawnedHintMonsterTime; + @Override + public void trySpawnHintMonster(Level world, Player player, BlockPos pos) { + // check if the timer is valid + long currentTime = world.getGameTime(); + + // if someone set the time backwards, fix the spawn timer + if (currentTime < this.lastSpawnedHintMonsterTime) { + this.lastSpawnedHintMonsterTime = 0; + } + + if (currentTime - this.lastSpawnedHintMonsterTime > 1200) { + // okay, time is good, try several times to spawn one + for (int i = 0; i < 20; i++) { + if (didSpawnHintMonster(world, player, pos)) { + this.lastSpawnedHintMonsterTime = currentTime; + break; + } + } + } + } + + @Override + public ItemStack createHintBook() { + return this.hintConfig.hintItem().copy(); + } + + @Override + @Nullable + public Mob createHintMonster(Level world) { + return this.hintConfig.hintMob().create(world); + } +} diff --git a/src/main/java/twilightforest/world/components/structures/util/StructureHints.java b/src/main/java/twilightforest/world/components/structures/util/StructureHints.java new file mode 100644 index 0000000000..3f0d4ee8e4 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/util/StructureHints.java @@ -0,0 +1,146 @@ +package twilightforest.world.components.structures.util; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.DataResult; +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Registry; +import net.minecraft.core.registries.Registries; +import net.minecraft.nbt.IntTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.StringTag; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceKey; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.levelgen.structure.Structure; +import net.minecraftforge.registries.ForgeRegistries; +import org.jetbrains.annotations.Nullable; +import twilightforest.TwilightForestMod; + +import java.util.Optional; + +public interface StructureHints { + String BOOK_AUTHOR = TwilightForestMod.ID + ".book.author"; + + /** + * Create a hint book for the specified feature. Only features with block protection will need this. + */ + default ItemStack createHintBook() { + ItemStack book = new ItemStack(Items.WRITTEN_BOOK); + book.getOrCreateTag().putBoolean(TwilightForestMod.ID + ":book", true); + this.addBookInformation(book, new ListTag()); + return book; + } + + default void addBookInformation(ItemStack book, ListTag bookPages) { + addBookInformationStatic(book, bookPages, "unknown", 2); + } + + static void addBookInformationStatic(ItemStack book, ListTag bookPages, @Nullable String name, int pageCount) { + String key = name == null ? "unknown" : name; + + addTranslatedPages(bookPages, TwilightForestMod.ID + ".book." + key, pageCount); + + book.addTagElement("pages", bookPages); + book.addTagElement("generation", IntTag.valueOf(3)); + book.addTagElement("author", StringTag.valueOf(BOOK_AUTHOR)); + book.addTagElement("title", StringTag.valueOf(TwilightForestMod.ID + ".book." + key)); + } + + static void addTranslatedPages(ListTag bookPages, String translationKey, int pageCount) { + for (int i = 1; i <= pageCount; i++) + bookPages.add(StringTag.valueOf(Component.Serializer.toJson(Component.translatable(translationKey + "." + i)))); + } + + /** + * Try to spawn a hint monster near the specified player + */ + default void trySpawnHintMonster(Level world, Player player) { + this.trySpawnHintMonster(world, player, player.blockPosition()); + } + + /** + * Try several times to spawn a hint monster + */ + void trySpawnHintMonster(Level world, Player player, BlockPos pos); + + static void tryHintForStructure(Player player, ServerLevel level, ResourceKey forStructure) { + Optional> optStructureReg = level.registryAccess().registry(Registries.STRUCTURE); + + if (optStructureReg.isEmpty() || !(optStructureReg.get().get(forStructure) instanceof StructureHints structureHints)) + return; + + structureHints.trySpawnHintMonster(level, player); + } + + /** + * Try once to spawn a hint monster near the player. Return true if we did. + *

+ * We could change up the monster depending on what feature this is, but we currently are not doing that + */ + default boolean didSpawnHintMonster(Level world, Player player, BlockPos pos) { + // find a target point + int dx = world.random.nextInt(16) - world.random.nextInt(16); + int dy = world.random.nextInt( 4) - world.random.nextInt( 4); + int dz = world.random.nextInt(16) - world.random.nextInt(16); + + // make our hint monster + Mob hinty = this.createHintMonster(world); + hinty.moveTo(pos.offset(dx, dy, dz), 0f, 0f); + + // check if the bounding box is clear + if (hinty.checkSpawnObstruction(world) && hinty.getSensing().hasLineOfSight(player)) { + + // add items and hint book + ItemStack book = this.createHintBook(); + + hinty.setItemSlot(EquipmentSlot.MAINHAND, book); + hinty.setDropChance(EquipmentSlot.MAINHAND, 1.0F); + //hinty.setDropItemsWhenDead(true); + + world.addFreshEntity(hinty); + return true; + } + + return false; + } + + @Nullable + Mob createHintMonster(Level world); + + record HintConfig(ItemStack hintItem, EntityType hintMob) { + public static MapCodec FLAT_CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( + ItemStack.CODEC.fieldOf("hint_item").forGetter(HintConfig::hintItem), + ForgeRegistries.ENTITY_TYPES.getCodec().comapFlatMap(HintConfig::checkCastMob, entityType -> entityType).fieldOf("hint_mob").forGetter(HintConfig::hintMob) + ).apply(instance, HintConfig::new)); + + public static Codec CODEC = FLAT_CODEC.codec(); + + @SuppressWarnings("unchecked") + private static DataResult> checkCastMob(EntityType entityType) { + if (!entityType.getBaseClass().isAssignableFrom(Mob.class)) + return DataResult.error(() -> "Configured Hint Entity " + entityType.toShortString() + " does not have a `Mob` superclass!"); + //noinspection unchecked + return DataResult.success((EntityType) entityType); + } + + public static ItemStack defaultBook() { + return book("unknown", 2); + } + + public static ItemStack book(String name, int pageCount) { + ItemStack book = new ItemStack(Items.WRITTEN_BOOK); + book.getOrCreateTag().putBoolean(TwilightForestMod.ID + ":book", true); + StructureHints.addBookInformationStatic(book, new ListTag(), name, pageCount); + return book; + } + } +} diff --git a/src/main/java/twilightforest/world/components/structures/util/package-info.java b/src/main/java/twilightforest/world/components/structures/util/package-info.java new file mode 100644 index 0000000000..35d6d0d292 --- /dev/null +++ b/src/main/java/twilightforest/world/components/structures/util/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.world.components.structures.util; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/world/layer/GenLayerTF.java b/src/main/java/twilightforest/world/layer/GenLayerTF.java deleted file mode 100644 index 768ba01f00..0000000000 --- a/src/main/java/twilightforest/world/layer/GenLayerTF.java +++ /dev/null @@ -1,74 +0,0 @@ -package twilightforest.world.layer; - -import net.minecraft.world.gen.layer.GenLayer; -import net.minecraft.world.gen.layer.GenLayerSmooth; -import net.minecraft.world.gen.layer.GenLayerVoronoiZoom; -import net.minecraft.world.gen.layer.GenLayerZoom; - -public abstract class GenLayerTF extends GenLayer { - - public GenLayerTF(long l) { - super(l); - // TODO Auto-generated constructor stub - } - - public static GenLayer[] makeTheWorld(long l) { - GenLayer biomes = new GenLayerTFBiomes1Point7(1L); - biomes = new GenLayerTFKeyBiomes(1000L, biomes); - biomes = new GenLayerTFCompanionBiomes(1000L, biomes); - - biomes = new GenLayerZoom(1000L, biomes); - biomes = new GenLayerZoom(1001, biomes); - - biomes = new GenLayerTFBiomeStabilize(700L, biomes); - - biomes = new GenLayerTFThornBorder(500L, biomes); - - biomes = new GenLayerZoom(1002, biomes); - biomes = new GenLayerZoom(1003, biomes); - biomes = new GenLayerZoom(1004, biomes); - biomes = new GenLayerZoom(1005, biomes); - - GenLayer riverLayer = new GenLayerTFStream(1L, biomes); - riverLayer = new GenLayerSmooth(7000L, riverLayer); - biomes = new GenLayerTFRiverMix(100L, biomes, riverLayer); - - // do "voronoi" zoom - GenLayer genlayervoronoizoom = new GenLayerVoronoiZoom(10L, biomes); - - biomes.initWorldGenSeed(l); - genlayervoronoizoom.initWorldGenSeed(l); - - return (new GenLayer[] { biomes, genlayervoronoizoom }); - } - - public static GenLayer[] makeTheWorldOldMapGen(long l) { - GenLayer biomes = new GenLayerTFBiomes(1L); - - biomes = new GenLayerZoom(1000L, biomes); - biomes = new GenLayerZoom(1001, biomes); - - biomes = new GenLayerTFBiomeStabilize(700L, biomes); - - biomes = new GenLayerZoom(1002, biomes); - - biomes = new GenLayerTFBiomeBorders(500L, biomes); - - biomes = new GenLayerZoom(1003, biomes); - biomes = new GenLayerZoom(1004, biomes); - biomes = new GenLayerZoom(1005, biomes); - - GenLayer riverLayer = new GenLayerTFStream(1L, biomes); - riverLayer = new GenLayerSmooth(7000L, riverLayer); - biomes = new GenLayerTFRiverMix(100L, biomes, riverLayer); - - // do "voronoi" zoom - GenLayer genlayervoronoizoom = new GenLayerVoronoiZoom(10L, biomes); - - biomes.initWorldGenSeed(l); - genlayervoronoizoom.initWorldGenSeed(l); - - return (new GenLayer[] { biomes, genlayervoronoizoom }); - } - -} diff --git a/src/main/java/twilightforest/world/layer/GenLayerTF5x5Preset.java b/src/main/java/twilightforest/world/layer/GenLayerTF5x5Preset.java deleted file mode 100644 index 87977edc9a..0000000000 --- a/src/main/java/twilightforest/world/layer/GenLayerTF5x5Preset.java +++ /dev/null @@ -1,36 +0,0 @@ -package twilightforest.world.layer; - - -public class GenLayerTF5x5Preset extends GenLayerTF7x7Preset { - - - public GenLayerTF5x5Preset(long par1) { - super(par1); - initPresets(); - } - - - private void initPresets() - { - char[][] map = { - { 'P', 'P', 'P', 'P', 'P', 'P', 'P', 'P', 'P' }, - { 'P', 'P', 'P', 'P', 'P', 'P', 'P', 'P', 'P' }, - { 'P', 'P', 'H', 'H', 'L', 'D', 'D', 'P', 'P' }, - { 'P', 'P', 'H', 'H', 'm', 'M', 'D', 'P', 'P' }, - { 'P', 'P', 'F', 'F', 'F', 'C', 'E', 'P', 'P' }, - { 'P', 'P', 'S', 'f', 'F', 'F', 'O', 'P', 'P' }, - { 'P', 'P', 'Y', 'S', 'F', 'O', 'G', 'P', 'P' }, - { 'P', 'P', 'P', 'P', 'P', 'P', 'P', 'P', 'P' }, - { 'P', 'P', 'P', 'P', 'P', 'P', 'P', 'P', 'P' } }; - - - for (int x = 0; x < map.length; x++) - { - for (int z = 0; z < map[x].length; z++) - { - preset[x][z] = getBiomeFor(map[z][x]); - } - } - - } -} diff --git a/src/main/java/twilightforest/world/layer/GenLayerTF6x6Preset.java b/src/main/java/twilightforest/world/layer/GenLayerTF6x6Preset.java deleted file mode 100644 index 9713721ce6..0000000000 --- a/src/main/java/twilightforest/world/layer/GenLayerTF6x6Preset.java +++ /dev/null @@ -1,37 +0,0 @@ -package twilightforest.world.layer; - - -public class GenLayerTF6x6Preset extends GenLayerTF7x7Preset { - - public GenLayerTF6x6Preset(long par1) { - super(par1); - initPresets(); - } - - private void initPresets() - { - char[][] map = { - { 'P', 'P', 'P', 'P', 'P', 'P', 'P', 'P', 'P' }, - { 'P', 'P', 'P', 'P', 'P', 'P', 'P', 'P', 'P' }, - { 'P', 'P', 'H', 'H', 'H', 'D', 'D', 'D', 'P' }, - { 'P', 'P', 'H', 'H', 'H', 'M', 'D', 'D', 'P' }, - { 'P', 'P', 'F', 'F', 'C', 'm', 'm', 'D', 'P' }, - { 'P', 'P', 'f', 'f', 'F', 'E', 'F', 'O', 'P' }, - { 'P', 'P', 'S', 'S', 'f', 'f', 'O', 'G', 'P' }, - { 'P', 'P', 'Y', 'S', 'f', 'L', 'O', 'G', 'P' }, - { 'P', 'P', 'P', 'P', 'P', 'P', 'P', 'P', 'P' } }; - - - for (int x = 0; x < map.length; x++) - { - for (int z = 0; z < map[x].length; z++) - { - preset[x][z] = getBiomeFor(map[z][x]); - } - } - - } - - - -} diff --git a/src/main/java/twilightforest/world/layer/GenLayerTF7x7Preset.java b/src/main/java/twilightforest/world/layer/GenLayerTF7x7Preset.java deleted file mode 100644 index 1171a12ffc..0000000000 --- a/src/main/java/twilightforest/world/layer/GenLayerTF7x7Preset.java +++ /dev/null @@ -1,107 +0,0 @@ -package twilightforest.world.layer; - -import net.minecraft.world.biome.BiomeGenBase; -import net.minecraft.world.gen.layer.GenLayer; -import net.minecraft.world.gen.layer.IntCache; -import twilightforest.biomes.TFBiomeBase; - -public class GenLayerTF7x7Preset extends GenLayer { - - - BiomeGenBase preset[][] = new BiomeGenBase[9][9]; - - public GenLayerTF7x7Preset(long par1) { - super(par1); - initPresets(); - } - - @Override - public int[] getInts(int x, int z, int width, int depth) - { - int dest[] = IntCache.getIntCache(width * depth); - for(int dz = 0; dz < depth; dz++) - { - for(int dx = 0; dx < width; dx++) - { - int sx = x + dx + 4; - int sz = z + dz + 4; - - if (sx >= 0 && sx < 8 && sz >= 0 && sz < 8) - { - dest[dx + dz * width] = preset[sx][sz].biomeID; - } - else - { - dest[dx + dz * width] = BiomeGenBase.ocean.biomeID; - } - } - - } - - return dest; - - } - - private void initPresets() - { - char[][] map = { - { 'P', 'P', 'P', 'P', 'P', 'P', 'P', 'P', 'P' }, - { 'P', 'H', 'H', 'H', 'H', 'D', 'D', 'D', 'P' }, - { 'P', 'H', 'H', 'H', 'H', 'D', 'D', 'D', 'P' }, - { 'P', 'F', 'f', 'F', 'm', 'M', 'D', 'D', 'P' }, - { 'P', 'F', 'F', 'F', 'C', 'm', 'D', 'D', 'P' }, - { 'P', 'F', 'f', 'f', 'F', 'E', 'O', 'O', 'P' }, - { 'P', 'S', 'S', 'S', 'L', 'L', 'O', 'G', 'P' }, - { 'P', 'Y', 'S', 'S', 'L', 'L', 'O', 'G', 'P' }, - { 'P', 'P', 'P', 'P', 'P', 'P', 'P', 'P', 'P' } }; - - - for (int x = 0; x < map.length; x++) - { - for (int z = 0; z < map[x].length; z++) - { - preset[x][z] = getBiomeFor(map[z][x]); - } - } - - } - - protected BiomeGenBase getBiomeFor(char c) - { - switch (c) - { - default : - return BiomeGenBase.ocean; -// case 'P' : -// return BiomeGenBase.plains; - case 'F' : - return TFBiomeBase.twilightForest; - case 'f' : - return TFBiomeBase.twilightForest2; - case 'E' : - return TFBiomeBase.enchantedForest; - case 'm' : - return TFBiomeBase.mushrooms; - case 'M' : - return TFBiomeBase.deepMushrooms; - case 'C' : - return TFBiomeBase.clearing; - case 'S' : - return TFBiomeBase.tfSwamp; - case 'Y' : - return TFBiomeBase.fireSwamp; - case 'D' : - return TFBiomeBase.darkForest; - case 'L' : - return TFBiomeBase.tfLake; - case 'O' : - return TFBiomeBase.tfSnow; - case 'G' : - return TFBiomeBase.glacier; - case 'H' : - return TFBiomeBase.highlands; - } - } - - -} diff --git a/src/main/java/twilightforest/world/layer/GenLayerTFBiomeBorders.java b/src/main/java/twilightforest/world/layer/GenLayerTFBiomeBorders.java deleted file mode 100644 index 9f54f070f8..0000000000 --- a/src/main/java/twilightforest/world/layer/GenLayerTFBiomeBorders.java +++ /dev/null @@ -1,89 +0,0 @@ -package twilightforest.world.layer; - -import net.minecraft.world.gen.layer.GenLayer; -import net.minecraft.world.gen.layer.IntCache; -import twilightforest.biomes.TFBiomeBase; - - -public class GenLayerTFBiomeBorders extends GenLayer { - - public GenLayerTFBiomeBorders(long l, GenLayer genlayer) - { - super(l); - parent = genlayer; - } - - /** - * Turn specific biomes into other biomes along their borders - */ - @Override - public int[] getInts(int x, int z, int width, int depth) - { - int nx = x - 1; - int nz = z - 1; - int nwidth = width + 2; - int ndepth = depth + 2; - int input[] = parent.getInts(nx, nz, nwidth, ndepth); - int output[] = IntCache.getIntCache(width * depth); - for(int dz = 0; dz < depth; dz++) - { - for(int dx = 0; dx < width; dx++) - { - int right = input[dx + 0 + (dz + 1) * nwidth]; - int left = input[dx + 2 + (dz + 1) * nwidth]; - int up = input[dx + 1 + (dz + 0) * nwidth]; - int down = input[dx + 1 + (dz + 2) * nwidth]; - int center = input[dx + 1 + (dz + 1) * nwidth]; - if (onBorder(TFBiomeBase.tfLake.biomeID, center, right, left, up, down)) - { - output[dx + dz * width] = TFBiomeBase.fireflyForest.biomeID; - } - else if (onBorder(TFBiomeBase.clearing.biomeID, center, right, left, up, down)) - { - output[dx + dz * width] = TFBiomeBase.oakSavanna.biomeID; - } - else if (onBorder(TFBiomeBase.deepMushrooms.biomeID, center, right, left, up, down)) - { - output[dx + dz * width] = TFBiomeBase.mushrooms.biomeID; - } - else if (onBorder(TFBiomeBase.glacier.biomeID, center, right, left, up, down)) - { - output[dx + dz * width] = TFBiomeBase.tfSnow.biomeID; - } - else - { - output[dx + dz * width] = center; - } - } - - } - - return output; - } - - /** - * Returns true if the center biome is the specified biome and any of the surrounding biomes are not - */ - boolean onBorder(int biome, int center, int right, int left, int up, int down) { - - if (center != biome) { - return false; - } - - if (right != biome) { - return true; - } - if (left != biome) { - return true; - } - if (up != biome) { - return true; - } - if (down != biome) { - return true; - } - - return false; - } - -} diff --git a/src/main/java/twilightforest/world/layer/GenLayerTFBiomeStabilize.java b/src/main/java/twilightforest/world/layer/GenLayerTFBiomeStabilize.java deleted file mode 100644 index fc6dfe19fc..0000000000 --- a/src/main/java/twilightforest/world/layer/GenLayerTFBiomeStabilize.java +++ /dev/null @@ -1,65 +0,0 @@ -package twilightforest.world.layer; - -import net.minecraft.world.gen.layer.GenLayer; -import net.minecraft.world.gen.layer.IntCache; - - -public class GenLayerTFBiomeStabilize extends GenLayer { - - public GenLayerTFBiomeStabilize(long l, GenLayer genlayer) - { - super(l); - parent = genlayer; - } - - /** - * When we are near the center of each biome, make nearby areas that biome too - */ - @Override - public int[] getInts(int x, int z, int width, int depth) - { - int nx = x - 1; - int nz = z - 1; - int nwidth = width + 2; - int ndepth = depth + 2; - int input[] = parent.getInts(nx, nz, nwidth, ndepth); - int output[] = IntCache.getIntCache(width * depth); - - - int offX = x & 3; - int offZ = z & 3; - - for (int dz = 0; dz < depth; dz++) - { - for (int dx = 0; dx < width; dx++) - { - int centerX = ((dx + offX + 1) & 0xFFFFFFFC) - offX; - int centerZ = ((dz + offZ + 1) & 0xFFFFFFFC) - offZ; - - //System.out.println("dx = " + dx + ", centerX = " + centerX + " dz = " + dz + ", centerZ = " + centerZ); - -// if (dx == centerX && dz == centerZ) -// { -// output[dx + dz * width] = input[centerX + 1 + (centerZ + 1) * nwidth]; -//// output[dx + dz * width] = TFBiomeBase.glacier.biomeID; -// } -// else - if (dx <= centerX + 1 && dx >= centerX - 1 && dz <= centerZ + 1 && dz >= centerZ - 1) - { - output[dx + dz * width] = input[centerX + 1 + (centerZ + 1) * nwidth]; -// output[dx + dz * width] = BiomeGenBase.desert.biomeID; -// output[dx + dz * width] = input[dx + 1 + (dz + 1) * nwidth]; - } - else - { - output[dx + dz * width] = input[dx + 1 + (dz + 1) * nwidth]; - } - } - - } - - return output; - } - - -} diff --git a/src/main/java/twilightforest/world/layer/GenLayerTFBiomes.java b/src/main/java/twilightforest/world/layer/GenLayerTFBiomes.java deleted file mode 100644 index f92cee2b22..0000000000 --- a/src/main/java/twilightforest/world/layer/GenLayerTFBiomes.java +++ /dev/null @@ -1,65 +0,0 @@ -package twilightforest.world.layer; - -import net.minecraft.world.biome.BiomeGenBase; -import net.minecraft.world.gen.layer.GenLayer; -import net.minecraft.world.gen.layer.IntCache; -import twilightforest.biomes.TFBiomeBase; - - -/** - * Applies the twilight forest biomes to the map - * - * @author Ben - * - */ -public class GenLayerTFBiomes extends GenLayer -{ - - protected BiomeGenBase commonBiomes[] = (new BiomeGenBase[] { - TFBiomeBase.twilightForest, TFBiomeBase.twilightForest2, TFBiomeBase.highlands, TFBiomeBase.mushrooms, TFBiomeBase.tfSwamp, TFBiomeBase.clearing, TFBiomeBase.darkForest - }); - protected BiomeGenBase rareBiomes[] = (new BiomeGenBase[] { - TFBiomeBase.tfLake, TFBiomeBase.glacier, TFBiomeBase.deepMushrooms, TFBiomeBase.enchantedForest, TFBiomeBase.fireSwamp - }); - - public GenLayerTFBiomes(long l, GenLayer genlayer) - { - super(l); - parent = genlayer; - } - - public GenLayerTFBiomes(long l) { - super(l); - } - - public int[] getInts(int x, int z, int width, int depth) - { - int dest[] = IntCache.getIntCache(width * depth); - for(int dz = 0; dz < depth; dz++) - { - for(int dx = 0; dx < width; dx++) - { - initChunkSeed(dx + x, dz + z); - if (nextInt(15) == 0 ) { - // make rare biome - dest[dx + dz * width] = rareBiomes[nextInt(rareBiomes.length)].biomeID; - } - else { - // make common biome - dest[dx + dz * width] = commonBiomes[nextInt(commonBiomes.length)].biomeID; - } - } - - } - -// for (int i = 0; i < width * depth; i++) -// { -// if (dest[i] < 0 || dest[i] > TFBiomeBase.fireSwamp.biomeID) -// { -// System.err.printf("Made a bad ID, %d at %d, %d while generating\n", dest[i], x, z); -// } -// } - - return dest; - } -} diff --git a/src/main/java/twilightforest/world/layer/GenLayerTFBiomes1Point7.java b/src/main/java/twilightforest/world/layer/GenLayerTFBiomes1Point7.java deleted file mode 100644 index 7144be2730..0000000000 --- a/src/main/java/twilightforest/world/layer/GenLayerTFBiomes1Point7.java +++ /dev/null @@ -1,67 +0,0 @@ -package twilightforest.world.layer; - -import net.minecraft.world.biome.BiomeGenBase; -import net.minecraft.world.gen.layer.GenLayer; -import net.minecraft.world.gen.layer.IntCache; -import twilightforest.biomes.TFBiomeBase; - - -/** - * Applies the twilight forest biomes to the map - * - * @author Ben - * - */ -public class GenLayerTFBiomes1Point7 extends GenLayer -{ - - private static final int RARE_BIOME_CHANCE = 15; - protected BiomeGenBase commonBiomes[] = (new BiomeGenBase[] { - TFBiomeBase.twilightForest, TFBiomeBase.twilightForest2, TFBiomeBase.mushrooms, TFBiomeBase.oakSavanna, TFBiomeBase.fireflyForest - }); - protected BiomeGenBase rareBiomes[] = (new BiomeGenBase[] { - TFBiomeBase.tfLake, TFBiomeBase.deepMushrooms, TFBiomeBase.enchantedForest, TFBiomeBase.clearing - }); - - public GenLayerTFBiomes1Point7(long l, GenLayer genlayer) - { - super(l); - parent = genlayer; - } - - public GenLayerTFBiomes1Point7(long l) { - super(l); - } - - @Override - public int[] getInts(int x, int z, int width, int depth) - { - int dest[] = IntCache.getIntCache(width * depth); - for(int dz = 0; dz < depth; dz++) - { - for(int dx = 0; dx < width; dx++) - { - initChunkSeed(dx + x, dz + z); - if (nextInt(RARE_BIOME_CHANCE) == 0 ) { - // make rare biome - dest[dx + dz * width] = rareBiomes[nextInt(rareBiomes.length)].biomeID; - } - else { - // make common biome - dest[dx + dz * width] = commonBiomes[nextInt(commonBiomes.length)].biomeID; - } - } - - } - -// for (int i = 0; i < width * depth; i++) -// { -// if (dest[i] < 0 || dest[i] > TFBiomeBase.fireSwamp.biomeID) -// { -// System.err.printf("Made a bad ID, %d at %d, %d while generating\n", dest[i], x, z); -// } -// } - - return dest; - } -} diff --git a/src/main/java/twilightforest/world/layer/GenLayerTFCheckBad.java b/src/main/java/twilightforest/world/layer/GenLayerTFCheckBad.java deleted file mode 100644 index b34ea732e2..0000000000 --- a/src/main/java/twilightforest/world/layer/GenLayerTFCheckBad.java +++ /dev/null @@ -1,36 +0,0 @@ -package twilightforest.world.layer; - -import net.minecraft.world.gen.layer.GenLayer; -import twilightforest.biomes.TFBiomeBase; - -public class GenLayerTFCheckBad extends GenLayer { - - private String stage; - - public GenLayerTFCheckBad(long par1, GenLayer par3GenLayer, String stage) - { - super(par1); - super.parent = par3GenLayer; - - this.stage = stage; - } - - @Override - public int[] getInts(int x, int z, int width, int depth) - { - int input[] = parent.getInts(x, z, width, depth); - - - for (int i = 0; i < width * depth; i++) - { - if (input[i] < 0 || input[i] > TFBiomeBase.fireSwamp.biomeID) - { - System.err.printf("Got a bad ID, %d at %d, %d while checking during stage %s\n", input[i], x, z, this.stage); - } - } - - - return input; - } - -} diff --git a/src/main/java/twilightforest/world/layer/GenLayerTFCompanionBiomes.java b/src/main/java/twilightforest/world/layer/GenLayerTFCompanionBiomes.java deleted file mode 100644 index 4536a04275..0000000000 --- a/src/main/java/twilightforest/world/layer/GenLayerTFCompanionBiomes.java +++ /dev/null @@ -1,72 +0,0 @@ -package twilightforest.world.layer; - -import net.minecraft.world.gen.layer.GenLayer; -import net.minecraft.world.gen.layer.IntCache; -import twilightforest.biomes.TFBiomeBase; - - -public class GenLayerTFCompanionBiomes extends GenLayer { - - public GenLayerTFCompanionBiomes(long l, GenLayer genlayer) - { - super(l); - parent = genlayer; - } - - /** - * If we are next to one of the 4 "key" biomes, we randomly turn into a companion biome for that center biome - */ - @Override - public int[] getInts(int x, int z, int width, int depth) - { - int nx = x - 1; - int nz = z - 1; - int nwidth = width + 2; - int ndepth = depth + 2; - int input[] = parent.getInts(nx, nz, nwidth, ndepth); - int output[] = IntCache.getIntCache(width * depth); - for(int dz = 0; dz < depth; dz++) - { - for(int dx = 0; dx < width; dx++) - { - int right = input[dx + 0 + (dz + 1) * nwidth]; - int left = input[dx + 2 + (dz + 1) * nwidth]; - int up = input[dx + 1 + (dz + 0) * nwidth]; - int down = input[dx + 1 + (dz + 2) * nwidth]; - int center = input[dx + 1 + (dz + 1) * nwidth]; - if (isKey(TFBiomeBase.fireSwamp.biomeID, center, right, left, up, down)) - { - output[dx + dz * width] = TFBiomeBase.tfSwamp.biomeID; - } - else if (isKey(TFBiomeBase.glacier.biomeID, center, right, left, up, down)) - { - output[dx + dz * width] = TFBiomeBase.tfSnow.biomeID; - } - else if (isKey(TFBiomeBase.darkForestCenter.biomeID, center, right, left, up, down)) - { - output[dx + dz * width] = TFBiomeBase.darkForest.biomeID; - } - else if (isKey(TFBiomeBase.highlandsCenter.biomeID, center, right, left, up, down)) - { - output[dx + dz * width] = TFBiomeBase.highlands.biomeID; - } - else - { - output[dx + dz * width] = center; - } - } - - } - - return output; - } - - /** - * Returns true if any of the surrounding biomes is the specified biome - */ - boolean isKey(int biome, int center, int right, int left, int up, int down) { - - return center != biome && (right == biome || left == biome || up == biome || down == biome); - } - -} diff --git a/src/main/java/twilightforest/world/layer/GenLayerTFFeatureZoom.java b/src/main/java/twilightforest/world/layer/GenLayerTFFeatureZoom.java deleted file mode 100644 index 0b78c71fd8..0000000000 --- a/src/main/java/twilightforest/world/layer/GenLayerTFFeatureZoom.java +++ /dev/null @@ -1,56 +0,0 @@ -package twilightforest.world.layer; - -import net.minecraft.world.gen.layer.GenLayer; -import net.minecraft.world.gen.layer.IntCache; - - -public class GenLayerTFFeatureZoom extends GenLayer -{ - - public GenLayerTFFeatureZoom(long l, GenLayer genlayer) - { - super(l); - this.parent = genlayer; - } - - public int[] getInts(int x, int z, int width, int depth) - { - int sx = x >> 1; - int sz = z >> 1; - int swidth = (width >> 1) + 3; - int sdepth = (depth >> 1) + 3; - int src[] = parent.getInts(sx, sz, swidth, sdepth); - int dest[] = IntCache.getIntCache(swidth * 2 * (sdepth * 2)); - int doubleWidth = swidth << 1; - for (int dz = 0; dz < sdepth - 1; dz++) - { - for (int dx = 0; dx < swidth - 1; dx++) - { - dest[(dx * 2 + 0) + (dz * 2 + 0) * doubleWidth] = src[dx + (dz * swidth)]; - dest[(dx * 2 + 1) + (dz * 2 + 0) * doubleWidth] = 0; - dest[(dx * 2 + 0) + (dz * 2 + 1) * doubleWidth] = 0; - dest[(dx * 2 + 1) + (dz * 2 + 1) * doubleWidth] = 0; - } - } - - int output[] = IntCache.getIntCache(width * depth); - for (int copyZ = 0; copyZ < depth; copyZ++) - { - System.arraycopy(dest, (copyZ + (z & 1)) * (swidth << 1) + (x & 1), output, copyZ * width, width); - } - - return output; - } - - - public static GenLayer multipleZoom(long seed, GenLayer genlayer, int loops) - { - GenLayer layer = genlayer; - for (int i = 0; i < loops; i++) - { - layer = new GenLayerTFFeatureZoom(seed + (long)i, layer); - } - - return layer; - } -} diff --git a/src/main/java/twilightforest/world/layer/GenLayerTFKeyBiomes.java b/src/main/java/twilightforest/world/layer/GenLayerTFKeyBiomes.java deleted file mode 100644 index 6b914558fa..0000000000 --- a/src/main/java/twilightforest/world/layer/GenLayerTFKeyBiomes.java +++ /dev/null @@ -1,104 +0,0 @@ -package twilightforest.world.layer; - -import net.minecraft.world.gen.layer.GenLayer; -import net.minecraft.world.gen.layer.IntCache; -import twilightforest.biomes.TFBiomeBase; - - -/** - * Puts key biomes in the proper positions - * - * @author Ben - * - */ -public class GenLayerTFKeyBiomes extends GenLayer -{ - - public GenLayerTFKeyBiomes(long l, GenLayer genlayer) - { - super(l); - parent = genlayer; - } - - public GenLayerTFKeyBiomes(long l) { - super(l); - } - - public int[] getInts(int x, int z, int width, int depth) - { - int src[] = this.parent.getInts(x, z, width, depth); - int dest[] = IntCache.getIntCache(width * depth); - for(int dz = 0; dz < depth; dz++) - { - for(int dx = 0; dx < width; dx++) - { - // get offsets - initChunkSeed(((dx + x) | 3), ((dz + z) | 3)); - - int ox = this.nextInt(3) + 1; - int oz = this.nextInt(3) + 1; - - if (((dx + x) & 3) == ox && ((dz + z) & 3) == oz) - { - // determine which of the 4 - if (((dx + x) & 4) == 0) - { - if (((dz + z) & 4) == 0) - { - dest[dx + dz * width] = getKeyBiomeFor(dx + x, dz + z, 0); - } - else - { - dest[dx + dz * width] = getKeyBiomeFor(dx + x, dz + z, 1); - } - } - else - { - if (((dz + z) & 4) == 0) - { - dest[dx + dz * width] = getKeyBiomeFor(dx + x, dz + z, 2); - } - else - { - dest[dx + dz * width] = getKeyBiomeFor(dx + x, dz + z, 3); - } - } - - } - else - { - dest[dx + dz * width] = src[dx + dz * width]; - } - } - } - - - return dest; - } - - /** - * Determine which map "region" the specified points are in. Assign the 0-3 of the index to the key biomes based on that region. - */ - private int getKeyBiomeFor(int mapX, int mapZ, int index) { - - int regionX = (mapX + 4) >> 3; - int regionZ = (mapZ + 4) >> 3; - - this.initChunkSeed(regionX, regionZ); - int offset = this.nextInt(4); - - // do we need to shuffle this better? - // the current version just "rotates" the 4 key biomes - switch ((index + offset) % 4) { - case 0: - default: - return TFBiomeBase.glacier.biomeID; - case 1: - return TFBiomeBase.fireSwamp.biomeID; - case 2: - return TFBiomeBase.darkForestCenter.biomeID; - case 3: - return TFBiomeBase.highlandsCenter.biomeID; - } - } -} diff --git a/src/main/java/twilightforest/world/layer/GenLayerTFRiverMix.java b/src/main/java/twilightforest/world/layer/GenLayerTFRiverMix.java deleted file mode 100644 index 168bfd01f1..0000000000 --- a/src/main/java/twilightforest/world/layer/GenLayerTFRiverMix.java +++ /dev/null @@ -1,50 +0,0 @@ -package twilightforest.world.layer; - -import net.minecraft.world.gen.layer.GenLayer; -import net.minecraft.world.gen.layer.IntCache; -import twilightforest.biomes.TFBiomeBase; - -public class GenLayerTFRiverMix extends GenLayer { - - private GenLayer biomeLayer; - private GenLayer riverLayer; - - public GenLayerTFRiverMix(long par1, GenLayer par3GenLayer, GenLayer par4GenLayer) { - super(par1); - this.biomeLayer = par3GenLayer; - this.riverLayer = par4GenLayer; - } - - /** - * Initialize layer's local worldGenSeed based on its own baseSeed and the world's global seed (passed in as an - * argument). - */ - public void initWorldGenSeed(long par1) - { - this.biomeLayer.initWorldGenSeed(par1); - this.riverLayer.initWorldGenSeed(par1); - super.initWorldGenSeed(par1); - } - - /** - * Returns a list of integer values generated by this layer. These may be - * interpreted as temperatures, rainfall amounts, or biomeList[] indices - * based on the particular GenLayer subclass. - */ - public int[] getInts(int par1, int par2, int par3, int par4) { - int[] biomeInputs = this.biomeLayer.getInts(par1, par2, par3, par4); - int[] riverInputs = this.riverLayer.getInts(par1, par2, par3, par4); - int[] outputs = IntCache.getIntCache(par3 * par4); - - for (int i = 0; i < par3 * par4; ++i) { - if (riverInputs[i] == TFBiomeBase.stream.biomeID) { - outputs[i] = riverInputs[i] & 255; - } else { - outputs[i] = biomeInputs[i]; - } - } - - return outputs; - } - -} diff --git a/src/main/java/twilightforest/world/layer/GenLayerTFStream.java b/src/main/java/twilightforest/world/layer/GenLayerTFStream.java deleted file mode 100644 index 6b17da0c50..0000000000 --- a/src/main/java/twilightforest/world/layer/GenLayerTFStream.java +++ /dev/null @@ -1,141 +0,0 @@ -// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov. -// Jad home page: http://www.kpdus.com/jad.html -// Decompiler options: packimports(3) braces deadcode - -package twilightforest.world.layer; - -import net.minecraft.world.gen.layer.GenLayer; -import net.minecraft.world.gen.layer.IntCache; -import twilightforest.biomes.TFBiomeBase; - - - -// Referenced classes of package net.minecraft.src: -// GenLayer, IntCache, BiomeGenBase - -public class GenLayerTFStream extends GenLayer -{ - - public GenLayerTFStream(long l, GenLayer genlayer) - { - super(l); - super.parent = genlayer; - } - - public int[] getInts(int x, int z, int width, int depth) - { - int nx = x - 1; - int nz = z - 1; - int nwidth = width + 2; - int ndepth = depth + 2; - int input[] = parent.getInts(nx, nz, nwidth, ndepth); - int output[] = IntCache.getIntCache(width * depth); - for(int dz = 0; dz < depth; dz++) - { - for(int dx = 0; dx < width; dx++) - { - int left = input[dx + 0 + (dz + 1) * nwidth]; - int right = input[dx + 2 + (dz + 1) * nwidth]; - int down = input[dx + 1 + (dz + 0) * nwidth]; - int up = input[dx + 1 + (dz + 2) * nwidth]; - int mid = input[dx + 1 + (dz + 1) * nwidth]; -// if(mid == 0 || left == 0 || right == 0 || down == 0 || up == 0) -// { -// output[dx + dz * width] = TFBiomeBase.stream.biomeID; -// continue; -// } - if(shouldStream(mid, left, down, right, up)) - { - output[dx + dz * width] = TFBiomeBase.stream.biomeID; - } else - { - output[dx + dz * width] = -1; - } - } - - } - - return output; - } - - boolean shouldStream (int mid, int left, int down, int right, int up) { - if (shouldStream(mid, left)) { - return true; - } - else if (shouldStream(mid, right)) { - return true; - } - else if (shouldStream(mid, down)) { - return true; - } - else if (shouldStream(mid, up)) { - return true; - } - else { - return false; - } - } - - boolean shouldStream (int biome1, int biome2) { - if (biome1 == biome2) { - return false; - } - if (biome1 == -biome2) { - return false; - } - // glacier and snow have no border - if (biome1 == TFBiomeBase.glacier.biomeID && biome2 == TFBiomeBase.tfSnow.biomeID) { - return false; - } - if (biome1 == TFBiomeBase.tfSnow.biomeID && biome2 == TFBiomeBase.glacier.biomeID) { - return false; - } - // mushrooms - if (biome1 == TFBiomeBase.deepMushrooms.biomeID && biome2 == TFBiomeBase.mushrooms.biomeID) { - return false; - } - if (biome1 == TFBiomeBase.mushrooms.biomeID && biome2 == TFBiomeBase.deepMushrooms.biomeID) { - return false; - } - // fire swamp - if (biome1 == TFBiomeBase.tfSwamp.biomeID && biome2 == TFBiomeBase.fireSwamp.biomeID) { - return false; - } - if (biome1 == TFBiomeBase.fireSwamp.biomeID && biome2 == TFBiomeBase.tfSwamp.biomeID) { - return false; - } - // highlands - if (biome1 == TFBiomeBase.highlands.biomeID && biome2 == TFBiomeBase.highlandsCenter.biomeID) { - return false; - } - if (biome1 == TFBiomeBase.highlandsCenter.biomeID && biome2 == TFBiomeBase.highlands.biomeID) { - return false; - } - // dark forest - if (biome1 == TFBiomeBase.darkForest.biomeID && biome2 == TFBiomeBase.darkForestCenter.biomeID) { - return false; - } - if (biome1 == TFBiomeBase.darkForestCenter.biomeID && biome2 == TFBiomeBase.darkForest.biomeID) { - return false; - } - // no lake border - if (biome1 == TFBiomeBase.tfLake.biomeID || biome2 == TFBiomeBase.tfLake.biomeID) { - return false; - } - // clearing - if (biome1 == TFBiomeBase.clearing.biomeID || biome2 == TFBiomeBase.oakSavanna.biomeID) { - return false; - } - if (biome1 == TFBiomeBase.oakSavanna.biomeID || biome2 == TFBiomeBase.clearing.biomeID) { - return false; - } - // thorns need no stream - if (biome1 == TFBiomeBase.thornlands.biomeID || biome2 == TFBiomeBase.thornlands.biomeID) { - return false; - } - - - return true; - } - -} diff --git a/src/main/java/twilightforest/world/layer/GenLayerTFThornBorder.java b/src/main/java/twilightforest/world/layer/GenLayerTFThornBorder.java deleted file mode 100644 index 179fd65c87..0000000000 --- a/src/main/java/twilightforest/world/layer/GenLayerTFThornBorder.java +++ /dev/null @@ -1,105 +0,0 @@ -package twilightforest.world.layer; - -import net.minecraft.world.gen.layer.GenLayer; -import net.minecraft.world.gen.layer.IntCache; -import twilightforest.biomes.TFBiomeBase; - - -public class GenLayerTFThornBorder extends GenLayer { - - public GenLayerTFThornBorder(long l, GenLayer genlayer) - { - super(l); - parent = genlayer; - } - - /** - * Turn specific biomes into other biomes along their borders - */ - @Override - public int[] getInts(int x, int z, int width, int depth) - { - int nx = x - 1; - int nz = z - 1; - int nwidth = width + 2; - int ndepth = depth + 2; - int input[] = parent.getInts(nx, nz, nwidth, ndepth); - int output[] = IntCache.getIntCache(width * depth); - for(int dz = 0; dz < depth; dz++) - { - for(int dx = 0; dx < width; dx++) - { - int right = input[dx + 0 + (dz + 1) * nwidth]; - int left = input[dx + 2 + (dz + 1) * nwidth]; - int up = input[dx + 1 + (dz + 0) * nwidth]; - int down = input[dx + 1 + (dz + 2) * nwidth]; - int center = input[dx + 1 + (dz + 1) * nwidth]; - // thorn border requires also checking diagonally - int ur = input[dx + 0 + (dz + 0) * nwidth]; - int ul = input[dx + 2 + (dz + 0) * nwidth]; - int dr = input[dx + 0 + (dz + 2) * nwidth]; - int dl = input[dx + 2 + (dz + 2) * nwidth]; - if (onBorder(TFBiomeBase.highlandsCenter.biomeID, center, right, left, up, down)) - { - output[dx + dz * width] = TFBiomeBase.thornlands.biomeID; - } - else if (onBorder(TFBiomeBase.highlandsCenter.biomeID, center, ur, ul, dr, dl)) - { - output[dx + dz * width] = TFBiomeBase.thornlands.biomeID; - } - else - { - output[dx + dz * width] = center; - } - } - - } - - return output; - } - - /** - * Returns true if the center biome is the first specified biome and any of the surrounding biomes are the second bioms - */ - private boolean onBorder(int biomeID, int biomeID2, int center, int right, int left, int up, int down) { - if (center != biomeID) { - return false; - } - - if (right == biomeID2) { - return true; - } - if (left == biomeID2) { - return true; - } - if (up == biomeID2) { - return true; - } - if (down == biomeID2) { - return true; - } - - return false; - } - - /** - * Returns true if the center biome is not the specified biome and any of the surrounding biomes are the specified biomes - */ - private boolean onBorder(int biomeID, int center, int right, int left, - int up, int down) { - if (center == biomeID) { - return false; - } else if (right == biomeID) { - return true; - } else if (left == biomeID) { - return true; - } else if (up == biomeID) { - return true; - } else if (down == biomeID) { - return true; - } else { - return false; - } - } - -} diff --git a/src/main/java/twilightforest/world/package-info.java b/src/main/java/twilightforest/world/package-info.java new file mode 100644 index 0000000000..695735308a --- /dev/null +++ b/src/main/java/twilightforest/world/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.world; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/world/registration/TFGenerationSettings.java b/src/main/java/twilightforest/world/registration/TFGenerationSettings.java new file mode 100644 index 0000000000..90f5a12f77 --- /dev/null +++ b/src/main/java/twilightforest/world/registration/TFGenerationSettings.java @@ -0,0 +1,164 @@ +package twilightforest.world.registration; + +import net.minecraft.client.Minecraft; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.dimension.LevelStem; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import twilightforest.TwilightForestMod; +import twilightforest.init.TFBiomes; +import twilightforest.init.TFMobEffects; +import twilightforest.init.TFSounds; +import twilightforest.init.TFStructures; +import twilightforest.util.PlayerHelper; +import twilightforest.world.components.chunkgenerators.ChunkGeneratorTwilight; +import twilightforest.world.components.structures.util.StructureHints; + +import java.util.HashMap; +import java.util.Map; +import java.util.function.BiConsumer; + +public class TFGenerationSettings { + + private static final Map BIOME_ADVANCEMENTS = new HashMap<>(); + private static final Map> BIOME_PROGRESSION_ENFORCEMENT = new HashMap<>(); + + static { + // TODO make this data-driven + registerBiomeAdvancementRestriction(TFBiomes.DARK_FOREST, TwilightForestMod.prefix("progress_lich")); + registerBiomeAdvancementRestriction(TFBiomes.DARK_FOREST_CENTER, TwilightForestMod.prefix("progress_knights")); + registerBiomeAdvancementRestriction(TFBiomes.FINAL_PLATEAU, TwilightForestMod.prefix("progress_troll")); + registerBiomeAdvancementRestriction(TFBiomes.FIRE_SWAMP, TwilightForestMod.prefix("progress_labyrinth")); + registerBiomeAdvancementRestriction(TFBiomes.GLACIER, TwilightForestMod.prefix("progress_yeti")); + registerBiomeAdvancementRestriction(TFBiomes.HIGHLANDS, TwilightForestMod.prefix("progress_merge")); + registerBiomeAdvancementRestriction(TFBiomes.SNOWY_FOREST, TwilightForestMod.prefix("progress_lich")); + registerBiomeAdvancementRestriction(TFBiomes.SWAMP, TwilightForestMod.prefix("progress_lich")); + registerBiomeAdvancementRestriction(TFBiomes.THORNLANDS, TwilightForestMod.prefix("progress_troll")); + + registerBiomeProgressionEnforcement(TFBiomes.DARK_FOREST, (player, level) -> { + if (!level.isClientSide() && player.tickCount % 60 == 0) { + player.addEffect(new MobEffectInstance(MobEffects.DARKNESS, 200, 0, false, true)); + StructureHints.tryHintForStructure(player, level, TFStructures.KNIGHT_STRONGHOLD); + } + }); + registerBiomeProgressionEnforcement(TFBiomes.DARK_FOREST_CENTER, (player, level) -> { + if (!level.isClientSide() && player.tickCount % 60 == 0) { + player.addEffect(new MobEffectInstance(MobEffects.DARKNESS, 200, 0, false, true)); + StructureHints.tryHintForStructure(player, level, TFStructures.DARK_TOWER); + } + }); + registerBiomeProgressionEnforcement(TFBiomes.FINAL_PLATEAU, (player, level) -> { + if (!level.isClientSide() && player.tickCount % 5 == 0) { + player.hurt(level.damageSources().magic(), 1.5F); + level.playSound(null, player.getX(), player.getY(), player.getZ(), TFSounds.ACID_RAIN_BURNS.get(), SoundSource.PLAYERS, 1.0F, 1.0F); + // TODO: change this when there's a book for the castle + StructureHints.tryHintForStructure(player, level, TFStructures.TROLL_CAVE); + } + }); + registerBiomeProgressionEnforcement(TFBiomes.FIRE_SWAMP, (player, level) -> { + if (!level.isClientSide() && player.tickCount % 60 == 0) { + player.setSecondsOnFire(8); + } + StructureHints.tryHintForStructure(player, level, TFStructures.HYDRA_LAIR); + }); + registerBiomeProgressionEnforcement(TFBiomes.GLACIER, (player, level) -> { + if (!level.isClientSide() && player.tickCount % 60 == 0) { + player.addEffect(new MobEffectInstance(TFMobEffects.FROSTY.get(), 100, 3, false, true)); + } + StructureHints.tryHintForStructure(player, level, TFStructures.AURORA_PALACE); + }); + registerBiomeProgressionEnforcement(TFBiomes.HIGHLANDS, (player, level) -> { + if (!level.isClientSide() && player.tickCount % 5 == 0) { + player.hurt(level.damageSources().magic(), 0.5F); + level.playSound(null, player.getX(), player.getY(), player.getZ(), TFSounds.ACID_RAIN_BURNS.get(), SoundSource.PLAYERS, 1.0F, 1.0F); + StructureHints.tryHintForStructure(player, level, TFStructures.TROLL_CAVE); + } + }); + registerBiomeProgressionEnforcement(TFBiomes.SNOWY_FOREST, (player, level) -> { + if (!level.isClientSide() && player.tickCount % 60 == 0) { + player.addEffect(new MobEffectInstance(TFMobEffects.FROSTY.get(), 100, 2, false, true)); + StructureHints.tryHintForStructure(player, level, TFStructures.YETI_CAVE); + } + }); + registerBiomeProgressionEnforcement(TFBiomes.SWAMP, (player, level) -> { + if (!level.isClientSide() && player.tickCount % 60 == 0) { + MobEffectInstance currentHunger = player.getEffect(MobEffects.HUNGER); + + int hungerLevel = currentHunger != null ? currentHunger.getAmplifier() + 1 : 1; + + player.addEffect(new MobEffectInstance(MobEffects.HUNGER, 100, hungerLevel, false, true)); + + StructureHints.tryHintForStructure(player, level, TFStructures.LABYRINTH); + } + }); + registerBiomeProgressionEnforcement(TFBiomes.THORNLANDS, (player, level) -> { + if (!level.isClientSide() && player.tickCount % 5 == 0) { + player.hurt(level.damageSources().magic(), 1.0F); + level.playSound(null, player.getX(), player.getY(), player.getZ(), TFSounds.ACID_RAIN_BURNS.get(), SoundSource.PLAYERS, 1.0F, 1.0F); + + // hint monster? + StructureHints.tryHintForStructure(player, level, TFStructures.TROLL_CAVE); + } + }); + } + + private static void registerBiomeAdvancementRestriction(ResourceKey biome, ResourceLocation... advancements) { + BIOME_ADVANCEMENTS.put(biome.location(), advancements); + } + + private static void registerBiomeProgressionEnforcement(ResourceKey biome, BiConsumer exec) { + BIOME_PROGRESSION_ENFORCEMENT.put(biome.location(), exec); + } + + public static void enforceBiomeProgression(Player player, ServerLevel level) { + Biome currentBiome = level.getBiome(player.blockPosition()).value(); + if (isBiomeSafeFor(currentBiome, player)) + return; + BiConsumer exec = BIOME_PROGRESSION_ENFORCEMENT.get(level.registryAccess().registryOrThrow(Registries.BIOME).getKey(currentBiome)); + if (exec != null) + exec.accept(player, level); + } + + @Deprecated // Used in places where we can't access the sea level FIXME Resolve + public static final int SEALEVEL = 0; + + public static final ResourceLocation DIMENSION = TwilightForestMod.prefix("twilight_forest"); + public static final ResourceKey WORLDGEN_KEY = ResourceKey.create(Registries.LEVEL_STEM, DIMENSION); + public static final ResourceKey DIMENSION_KEY = ResourceKey.create(Registries.DIMENSION, DIMENSION); + + // Checks if the world is linked by the default Twilight Portal. + // If you want to check if the world is a Twilight world, use usesTwilightChunkGenerator instead + // Only use this method if you need to know if a world is a destination for portals! + public static boolean isTwilightPortalDestination(Level level) { + return DIMENSION.equals(level.dimension().location()); + } + + // Checks if the world is a qualified Twilight world by checking against its namespace or if it's a portal destination + @OnlyIn(Dist.CLIENT) + public static boolean isTwilightWorldOnClient(Level level) { + return TwilightForestMod.ID.equals(Minecraft.getInstance().level.dimension().location().getNamespace()) || isTwilightPortalDestination(level); + } + + // Checks if the world is *a* Twilight world on the Server side. + public static boolean usesTwilightChunkGenerator(ServerLevel level) { + return level.getChunkSource().getGenerator() instanceof ChunkGeneratorTwilight; + } + + public static boolean isBiomeSafeFor(Biome biome, Entity entity) { + ResourceLocation[] advancements = BIOME_ADVANCEMENTS.get(entity.getLevel().registryAccess().registryOrThrow(Registries.BIOME).getKey(biome)); + if (advancements != null && entity instanceof Player) + return PlayerHelper.doesPlayerHaveRequiredAdvancements((Player) entity, advancements); + return true; + } +} diff --git a/src/main/java/twilightforest/world/registration/TreeConfigurations.java b/src/main/java/twilightforest/world/registration/TreeConfigurations.java new file mode 100644 index 0000000000..b3b94dca44 --- /dev/null +++ b/src/main/java/twilightforest/world/registration/TreeConfigurations.java @@ -0,0 +1,303 @@ +package twilightforest.world.registration; + +import com.google.common.collect.ImmutableList; +import net.minecraft.core.Direction; +import net.minecraft.util.random.SimpleWeightedRandomList; +import net.minecraft.util.valueproviders.ConstantInt; +import net.minecraft.util.valueproviders.UniformInt; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.LanternBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.feature.configurations.TreeConfiguration; +import net.minecraft.world.level.levelgen.feature.featuresize.TwoLayersFeatureSize; +import net.minecraft.world.level.levelgen.feature.foliageplacers.BlobFoliagePlacer; +import net.minecraft.world.level.levelgen.feature.foliageplacers.FancyFoliagePlacer; +import net.minecraft.world.level.levelgen.feature.foliageplacers.MegaPineFoliagePlacer; +import net.minecraft.world.level.levelgen.feature.stateproviders.BlockStateProvider; +import net.minecraft.world.level.levelgen.feature.stateproviders.WeightedStateProvider; +import net.minecraft.world.level.levelgen.feature.treedecorators.CocoaDecorator; +import net.minecraft.world.level.levelgen.feature.treedecorators.LeaveVineDecorator; +import net.minecraft.world.level.levelgen.feature.treedecorators.TrunkVineDecorator; +import net.minecraft.world.level.levelgen.feature.trunkplacers.FancyTrunkPlacer; +import net.minecraft.world.level.levelgen.feature.trunkplacers.GiantTrunkPlacer; +import net.minecraft.world.level.levelgen.feature.trunkplacers.StraightTrunkPlacer; +import twilightforest.block.FireflyBlock; +import twilightforest.block.TFLogBlock; +import twilightforest.init.TFBlocks; +import twilightforest.world.components.feature.config.TFTreeFeatureConfig; +import twilightforest.world.components.feature.trees.treeplacers.*; + +import java.util.OptionalInt; + +public class TreeConfigurations { + private static final int canopyDistancing = 5; + + static SimpleWeightedRandomList.Builder createBlockList() { + return SimpleWeightedRandomList.builder(); + } + + public static final TreeConfiguration TWILIGHT_OAK = new TreeConfiguration.TreeConfigurationBuilder( + BlockStateProvider.simple(TFBlocks.TWILIGHT_OAK_LOG.get()), + new StraightTrunkPlacer(4, 2, 0), + BlockStateProvider.simple(TFBlocks.TWILIGHT_OAK_LEAVES.get()), + new BlobFoliagePlacer(ConstantInt.of(2), ConstantInt.of(0), 3), + new TwoLayersFeatureSize(1, 0, 1) + ) + .decorators(ImmutableList.of(TreeDecorators.LIVING_ROOTS)) + .build(); + + public static final TreeConfiguration LARGE_TWILIGHT_OAK = new TreeConfiguration.TreeConfigurationBuilder( + BlockStateProvider.simple(TFBlocks.TWILIGHT_OAK_LOG.get()), + new FancyTrunkPlacer(3, 11, 0), + BlockStateProvider.simple(TFBlocks.TWILIGHT_OAK_LEAVES.get()), + new FancyFoliagePlacer(ConstantInt.of(2), ConstantInt.of(4), 4), + new TwoLayersFeatureSize(4, 1, 0, OptionalInt.of(4)) + ) + .decorators(ImmutableList.of(TreeDecorators.LIVING_ROOTS)) + .build(); + + public static final TreeConfiguration SWAMPY_OAK = new TreeConfiguration.TreeConfigurationBuilder( + BlockStateProvider.simple(TFBlocks.TWILIGHT_OAK_LOG.get()), + new StraightTrunkPlacer(4, 2, 0), + BlockStateProvider.simple(TFBlocks.TWILIGHT_OAK_LEAVES.get()), + new BlobFoliagePlacer(ConstantInt.of(2), ConstantInt.of(0), 3), + new TwoLayersFeatureSize(1, 0, 1) + ) + .decorators(ImmutableList.of(TreeDecorators.LIVING_ROOTS, new LeaveVineDecorator(0.125F))) + .build(); + + private final static int LEAF_SHAG_FACTOR = 24; + public static final TreeConfiguration CANOPY_TREE = new TreeConfiguration.TreeConfigurationBuilder( + BlockStateProvider.simple(TFBlocks.CANOPY_LOG.get()), + new BranchingTrunkPlacer(20, 5, 5, 7, new BranchesConfig(3, 1, 10, 1, 0.3, 0.2), false), + BlockStateProvider.simple(TFBlocks.CANOPY_LEAVES.get()), + new LeafSpheroidFoliagePlacer(4.5f, 1.5f, ConstantInt.of(0), 1, 0, -0.25f, LEAF_SHAG_FACTOR), + new TwoLayersFeatureSize(20, 0, canopyDistancing) + ) + .decorators(ImmutableList.of(TreeDecorators.FIREFLY, TreeDecorators.LIVING_ROOTS)) + .ignoreVines() + .build(); + + public static final TreeConfiguration CANOPY_TREE_FIREFLY = new TreeConfiguration.TreeConfigurationBuilder( + BlockStateProvider.simple(TFBlocks.CANOPY_LOG.get()), + new BranchingTrunkPlacer(20, 5, 5, 7, new BranchesConfig(3, 1, 10, 1, 0.3, 0.2), false), + BlockStateProvider.simple(TFBlocks.CANOPY_LEAVES.get()), + new LeafSpheroidFoliagePlacer(4.5f, 1.5f, ConstantInt.of(0), 1, 0, -0.25f, LEAF_SHAG_FACTOR), + new TwoLayersFeatureSize(20, 1, canopyDistancing) + ) + .decorators(ImmutableList.of( + TreeDecorators.LIVING_ROOTS, + TreeDecorators.FIREFLY, + new TrunkSideDecorator( // A few more Fireflies! + 4, + 0.5f, + BlockStateProvider.simple(TFBlocks.FIREFLY.get().defaultBlockState().setValue(FireflyBlock.FACING, Direction.NORTH)) + ), + new DangleFromTreeDecorator( + 1, + 1, + 2, + 5, + 15, + new WeightedStateProvider(createBlockList() + .add(TFBlocks.CANOPY_FENCE.get().defaultBlockState(), 3) + .add(Blocks.CHAIN.defaultBlockState(), 1)), + new WeightedStateProvider(createBlockList() + .add(TFBlocks.FIREFLY_JAR.get().defaultBlockState(), 10) + .add(TFBlocks.CICADA_JAR.get().defaultBlockState(), 1)) + ) + )) + .ignoreVines() + .build(); + + public static final TreeConfiguration CANOPY_TREE_DEAD = new TreeConfiguration.TreeConfigurationBuilder( + BlockStateProvider.simple(TFBlocks.CANOPY_LOG.get()), + new BranchingTrunkPlacer(20, 5, 5, 7, new BranchesConfig(3, 1, 10, 1, 0.3, 0.2), false), + BlockStateProvider.simple(Blocks.AIR), + LeafSpheroidFoliagePlacer.NO_OP, + new TwoLayersFeatureSize(20, 0, canopyDistancing) + ) + .decorators(ImmutableList.of(TreeDecorators.FIREFLY, TreeDecorators.LIVING_ROOTS)) + .ignoreVines() + .build(); + + public static final TreeConfiguration MANGROVE_TREE = new TreeConfiguration.TreeConfigurationBuilder( + BlockStateProvider.simple(TFBlocks.MANGROVE_LOG.get()), + new TrunkRiser(5, new BranchingTrunkPlacer(6, 4, 0, 1, new BranchesConfig(0, 3, 6, 2, 0.3, 0.25), false)), + BlockStateProvider.simple(TFBlocks.MANGROVE_LEAVES.get()), + new LeafSpheroidFoliagePlacer(2.5f, 1.5f, ConstantInt.of(0), 2, 0, -0.25f, (int) (LEAF_SHAG_FACTOR * 0.666f)), + new TwoLayersFeatureSize(4, 1, 1) + ) + .decorators(ImmutableList.of( + TreeDecorators.FIREFLY, + new TreeRootsDecorator(3, 1, 12, BlockStateProvider.simple(TFBlocks.MANGROVE_ROOT.get().defaultBlockState()), (new WeightedStateProvider(SimpleWeightedRandomList.builder() + .add(TFBlocks.ROOT_BLOCK.get().defaultBlockState(), 4) + .add(TFBlocks.LIVEROOT_BLOCK.get().defaultBlockState(), 1).build()))), + new LeaveVineDecorator(0.125F) + ) + ) + .build(); + + public static final TreeConfiguration DARKWOOD_TREE = new TreeConfiguration.TreeConfigurationBuilder( + BlockStateProvider.simple(TFBlocks.DARK_LOG.get()), + new BranchingTrunkPlacer(9, 1, 1, 3, new BranchesConfig(4, 0, 8, 2, 0.23, 0.23), false), + BlockStateProvider.simple(TFBlocks.HARDENED_DARK_LEAVES.get()), + new LeafSpheroidFoliagePlacer(4.5f, 2.25f, ConstantInt.of(0), 1, 0, 0.45f, (int) (LEAF_SHAG_FACTOR * 1.5f)), + new TwoLayersFeatureSize(4, 1, 1) + ) + .decorators(ImmutableList.of(TreeDecorators.LIVING_ROOTS)) + .ignoreVines() + .build(); + + public static final TreeConfiguration HOMEGROWN_DARKWOOD_TREE = new TreeConfiguration.TreeConfigurationBuilder( + BlockStateProvider.simple(TFBlocks.DARK_LOG.get()), + new BranchingTrunkPlacer(9, 1, 1, 3, new BranchesConfig(4, 0, 8, 2, 0.23, 0.23), false), + BlockStateProvider.simple(TFBlocks.DARK_LEAVES.get()), + new LeafSpheroidFoliagePlacer(4.5f, 2.25f, ConstantInt.of(0), 1, 0, 0.45f, (int) (LEAF_SHAG_FACTOR * 1.5f)), + new TwoLayersFeatureSize(4, 1, 1) + ) + .decorators(ImmutableList.of(TreeDecorators.LIVING_ROOTS)) + .ignoreVines() + .build(); + + public static final TreeConfiguration DARKWOOD_LANTERN_TREE = new TreeConfiguration.TreeConfigurationBuilder( + BlockStateProvider.simple(TFBlocks.DARK_LOG.get()), + new BranchingTrunkPlacer(9, 1, 1, 3, new BranchesConfig(4, 0, 8, 2, 0.23, 0.23), false), + BlockStateProvider.simple(TFBlocks.DARK_LEAVES.get()), + new LeafSpheroidFoliagePlacer(4.5f, 2.25f, ConstantInt.of(0), 1, 0, 0.45f, (int) (LEAF_SHAG_FACTOR * 1.5f)), + new TwoLayersFeatureSize(4, 1, 1) + ) + .decorators(ImmutableList.of( + TreeDecorators.LIVING_ROOTS, + new DangleFromTreeDecorator( + 0, + 1, + 2, + 4, + 2, + new WeightedStateProvider(createBlockList().add(Blocks.CHAIN.defaultBlockState(), 1)), + new WeightedStateProvider(createBlockList().add(Blocks.LANTERN.defaultBlockState().setValue(LanternBlock.HANGING, true), 1)) + ) + )) + .ignoreVines() + .build(); + + public static final TreeConfiguration SMALL_JUNGLE = new TreeConfiguration.TreeConfigurationBuilder( + BlockStateProvider.simple(Blocks.JUNGLE_LOG), + new StraightTrunkPlacer(3, 2, 2), + BlockStateProvider.simple(Blocks.JUNGLE_LEAVES), + new BlobFoliagePlacer(ConstantInt.of(2), ConstantInt.of(0), 3), + new TwoLayersFeatureSize(1, 0, 1) + ) + .decorators(ImmutableList.of( + new CocoaDecorator(0.7F), + TrunkVineDecorator.INSTANCE, + new LeaveVineDecorator(0.25F))) + .ignoreVines() + .build(); + + //[VanillaCopy] of Features.MEGA_SPRUCE, just without all the nasty podzol so it fits better + public static final TreeConfiguration BIG_SPRUCE = new TreeConfiguration.TreeConfigurationBuilder( + BlockStateProvider.simple(Blocks.SPRUCE_LOG), + new GiantTrunkPlacer(13, 2, 14), + BlockStateProvider.simple(Blocks.SPRUCE_LEAVES), + new MegaPineFoliagePlacer(ConstantInt.of(0), + ConstantInt.of(0), + UniformInt.of(13, 17)), + new TwoLayersFeatureSize(4, 1, 2)) + .build(); + + // Requires Hollowtree gen + public static final TFTreeFeatureConfig TIME_TREE = new TFTreeFeatureConfig.Builder( + BlockStateProvider.simple(TFBlocks.TIME_LOG.get()), + BlockStateProvider.simple(TFBlocks.TIME_LEAVES.get()), + BlockStateProvider.simple(TFBlocks.TIME_WOOD.get()), + BlockStateProvider.simple(TFBlocks.ROOT_BLOCK.get()) + ) + .build(); + + public static final TreeConfiguration TRANSFORM_TREE = new TreeConfiguration.TreeConfigurationBuilder( + BlockStateProvider.simple(TFBlocks.TRANSFORMATION_LOG.get()), + new BranchingTrunkPlacer(6, 5, 5, 7, new BranchesConfig(3, 1, 10, 1, 0.3, 0.2), false), + BlockStateProvider.simple(TFBlocks.TRANSFORMATION_LEAVES.get()), + new LeafSpheroidFoliagePlacer(4.5f, 1.5f, ConstantInt.of(0), 1, 0, -0.25f, 0), + new TwoLayersFeatureSize(4, 1, canopyDistancing) + ) + .ignoreVines() + .decorators(ImmutableList.of(new TreeCorePlacer(3, BlockStateProvider.simple(TFBlocks.TRANSFORMATION_LOG_CORE.get().defaultBlockState().setValue(TFLogBlock.AXIS, Direction.Axis.Y))))) + .build(); + + public static final TFTreeFeatureConfig MINING_TREE = new TFTreeFeatureConfig.Builder( + BlockStateProvider.simple(TFBlocks.MINING_LOG.get()), + BlockStateProvider.simple(TFBlocks.MINING_LEAVES.get()), + BlockStateProvider.simple(TFBlocks.MINING_WOOD.get()), + BlockStateProvider.simple(TFBlocks.ROOT_BLOCK.get()) + ) + .build(); + + public static final TreeConfiguration SORT_TREE = new TreeConfiguration.TreeConfigurationBuilder( + BlockStateProvider.simple(TFBlocks.SORTING_LOG.get()), + new StraightTrunkPlacer(3, 0, 0), + BlockStateProvider.simple(TFBlocks.SORTING_LEAVES.get()), + new LeafSpheroidFoliagePlacer(1.5f, 2.25f, ConstantInt.of(0), 1, 0, 0.5f, 0), + new TwoLayersFeatureSize(1, 1, 1) + ) + .ignoreVines() + .forceDirt() + .decorators(ImmutableList.of(new TreeCorePlacer(2, BlockStateProvider.simple(TFBlocks.SORTING_LOG_CORE.get().defaultBlockState().setValue(TFLogBlock.AXIS, Direction.Axis.Y))))) + .build(); + + public static final TFTreeFeatureConfig LARGE_WINTER = new TFTreeFeatureConfig.Builder( + BlockStateProvider.simple(Blocks.SPRUCE_LOG), + BlockStateProvider.simple(Blocks.SPRUCE_LEAVES), + BlockStateProvider.simple(Blocks.SPRUCE_LOG), + BlockStateProvider.simple(TFBlocks.ROOT_BLOCK.get()) + ) + .build(); + + public static final TFTreeFeatureConfig FOREST_CANOPY_OAK = new TFTreeFeatureConfig.Builder( + BlockStateProvider.simple(TFBlocks.TWILIGHT_OAK_LOG.get()), + BlockStateProvider.simple(TFBlocks.TWILIGHT_OAK_LEAVES.get()), + BlockStateProvider.simple(TFBlocks.TWILIGHT_OAK_WOOD.get()), + BlockStateProvider.simple(TFBlocks.ROOT_BLOCK.get()) + ) + .minHeight(24) + .build(); + + public static final TFTreeFeatureConfig SAVANNAH_CANOPY_OAK = new TFTreeFeatureConfig.Builder( + BlockStateProvider.simple(TFBlocks.TWILIGHT_OAK_LOG.get()), + BlockStateProvider.simple(TFBlocks.TWILIGHT_OAK_LEAVES.get()), + BlockStateProvider.simple(TFBlocks.TWILIGHT_OAK_WOOD.get()), + BlockStateProvider.simple(TFBlocks.ROOT_BLOCK.get()) + ) + .minHeight(16) + .build(); + + public static final TFTreeFeatureConfig HOLLOW_TREE = new TFTreeFeatureConfig.Builder( + BlockStateProvider.simple(TFBlocks.TWILIGHT_OAK_LOG.get()), + BlockStateProvider.simple(TFBlocks.TWILIGHT_OAK_LEAVES.get()), + BlockStateProvider.simple(TFBlocks.TWILIGHT_OAK_WOOD.get()), + BlockStateProvider.simple(TFBlocks.ROOT_BLOCK.get()) + ) + .build(); + + public static final TreeConfiguration RAINBOAK_TREE = new TreeConfiguration.TreeConfigurationBuilder( + BlockStateProvider.simple(TFBlocks.TWILIGHT_OAK_LOG.get()), + new StraightTrunkPlacer(4, 2, 0), + BlockStateProvider.simple(TFBlocks.RAINBOW_OAK_LEAVES.get()), + new BlobFoliagePlacer(ConstantInt.of(2), ConstantInt.of(0), 3), + new TwoLayersFeatureSize(1, 1, 1) + ) + .decorators(ImmutableList.of(TreeDecorators.LIVING_ROOTS)) + .build(); + + public static final TreeConfiguration LARGE_RAINBOAK_TREE = new TreeConfiguration.TreeConfigurationBuilder( + BlockStateProvider.simple(TFBlocks.TWILIGHT_OAK_LOG.get()), + new FancyTrunkPlacer(3, 11, 0), + BlockStateProvider.simple(TFBlocks.RAINBOW_OAK_LEAVES.get()), + new FancyFoliagePlacer(ConstantInt.of(2), ConstantInt.of(4), 4), + new TwoLayersFeatureSize(4, 1, 0, OptionalInt.of(4)) + ) + .decorators(ImmutableList.of(TreeDecorators.LIVING_ROOTS)) + .build(); +} diff --git a/src/main/java/twilightforest/world/registration/TreeDecorators.java b/src/main/java/twilightforest/world/registration/TreeDecorators.java new file mode 100644 index 0000000000..de0967e007 --- /dev/null +++ b/src/main/java/twilightforest/world/registration/TreeDecorators.java @@ -0,0 +1,15 @@ +package twilightforest.world.registration; + +import net.minecraft.util.random.SimpleWeightedRandomList; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.feature.stateproviders.BlockStateProvider; +import net.minecraft.world.level.levelgen.feature.stateproviders.WeightedStateProvider; +import twilightforest.init.TFBlocks; +import twilightforest.world.components.feature.trees.treeplacers.TreeRootsDecorator; +import twilightforest.world.components.feature.trees.treeplacers.TrunkSideDecorator; + +public final class TreeDecorators { + public static final BlockStateProvider ROOT_BLEND_PROVIDER = new WeightedStateProvider(new SimpleWeightedRandomList.Builder().add(TFBlocks.ROOT_BLOCK.get().defaultBlockState(), 6).add(TFBlocks.LIVEROOT_BLOCK.get().defaultBlockState(), 1).build()); + public static final TreeRootsDecorator LIVING_ROOTS = new TreeRootsDecorator(3, 1, 5, TreeDecorators.ROOT_BLEND_PROVIDER); + public static final TrunkSideDecorator FIREFLY = new TrunkSideDecorator(2, 1.0f, BlockStateProvider.simple(TFBlocks.FIREFLY.get().defaultBlockState())); +} diff --git a/src/main/java/twilightforest/world/registration/biomes/BiomeHelper.java b/src/main/java/twilightforest/world/registration/biomes/BiomeHelper.java new file mode 100644 index 0000000000..ebc96bde8f --- /dev/null +++ b/src/main/java/twilightforest/world/registration/biomes/BiomeHelper.java @@ -0,0 +1,560 @@ +package twilightforest.world.registration.biomes; + +import net.minecraft.core.HolderGetter; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.data.worldgen.BiomeDefaultFeatures; +import net.minecraft.data.worldgen.placement.AquaticPlacements; +import net.minecraft.data.worldgen.placement.MiscOverworldPlacements; +import net.minecraft.data.worldgen.placement.TreePlacements; +import net.minecraft.data.worldgen.placement.VegetationPlacements; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.MobCategory; +import net.minecraft.world.level.biome.*; +import net.minecraft.world.level.levelgen.GenerationStep; +import net.minecraft.world.level.levelgen.carver.ConfiguredWorldCarver; +import net.minecraft.world.level.levelgen.placement.PlacedFeature; +import twilightforest.init.TFConfiguredFeatures; +import twilightforest.init.TFEntities; +import twilightforest.init.TFParticleType; +import twilightforest.init.TFPlacedFeatures; +import twilightforest.init.TFCaveCarvers; + +public abstract class BiomeHelper { + + public static BiomeGenerationSettings.Builder twilightForestGen(HolderGetter featureGetter, HolderGetter> carverGetter) { + BiomeGenerationSettings.Builder biome = defaultGenSettingBuilder(featureGetter, carverGetter); + addHollowOakTrees(biome); + addForestVegetationAlt(biome); + commonFeatures(biome); + + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, TFPlacedFeatures.PLACED_VANILLA_TF_TREES); + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, TFPlacedFeatures.PLACED_TWILIGHT_OAK_TREE); + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, TFPlacedFeatures.PLACED_LARGE_TWILIGHT_OAK_TREE); + addCanopyTrees(biome); + + return biome; + } + + public static BiomeGenerationSettings.Builder denseForestGen(HolderGetter featureGetter, HolderGetter> carverGetter) { + BiomeGenerationSettings.Builder biome = defaultGenSettingBuilder(featureGetter, carverGetter); + addHollowOakTrees(biome); + addForestVegetationAlt(biome); + commonFeatures(biome); + + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, TFPlacedFeatures.PLACED_DENSE_CANOPY_TREES); + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, TFPlacedFeatures.PLACED_VANILLA_TF_TREES); + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, TreePlacements.JUNGLE_BUSH); + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, TFPlacedFeatures.PLACED_DEFAULT_FALLEN_LOGS); + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, TFPlacedFeatures.PLACED_FOREST_CANOPY_OAK_TREE); + + return biome; + } + + public static BiomeGenerationSettings.Builder fireflyForestGen(HolderGetter featureGetter, HolderGetter> carverGetter) { + BiomeGenerationSettings.Builder biome = defaultGenSettingBuilder(featureGetter, carverGetter); + addHollowOakTrees(biome); + addForestVegetationAlt(biome); + commonFeatures(biome); + + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, TFPlacedFeatures.PLACED_FIREFLY_FOREST_TREES); + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, TFPlacedFeatures.PLACED_VANILLA_TF_TREES); + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, TFPlacedFeatures.PLACED_TWILIGHT_OAK_TREE); + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, TFPlacedFeatures.PLACED_LARGE_TWILIGHT_OAK_TREE); + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, TFPlacedFeatures.PLACED_LAMPPOST_PLACER); + + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, TFPlacedFeatures.PLACED_MUSHGLOOM_CLUSTER); + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, VegetationPlacements.PATCH_PUMPKIN); + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, VegetationPlacements.FLOWER_FOREST_FLOWERS); + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, TFPlacedFeatures.PLACED_DEFAULT_FALLEN_LOGS); + + return biome; + } + + public static BiomeGenerationSettings.Builder clearingGen(HolderGetter featureGetter, HolderGetter> carverGetter) { + BiomeGenerationSettings.Builder biome = defaultGenSettingBuilder(featureGetter, carverGetter); + addForestVegetation(biome); + commonFeatures(biome); + + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, VegetationPlacements.FLOWER_FOREST_FLOWERS); + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, TFPlacedFeatures.PLACED_DEFAULT_FALLEN_LOGS); + + return biome; + } + + public static BiomeGenerationSettings.Builder oakSavannaGen(HolderGetter featureGetter, HolderGetter> carverGetter) { + BiomeGenerationSettings.Builder biome = defaultGenSettingBuilder(featureGetter, carverGetter); + addHollowOakTrees(biome); + addForestVegetation(biome); + commonFeatures(biome); + + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, TFPlacedFeatures.PLACED_SAVANNAH_OAK_TREE); + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, TFPlacedFeatures.PLACED_LARGE_TWILIGHT_OAK_TREE); + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, TFPlacedFeatures.PLACED_DEFAULT_FALLEN_LOGS); + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, TFPlacedFeatures.PLACED_SAVANNAH_CANOPY_OAK_TREE); + + return biome; + } + + public static BiomeGenerationSettings.Builder enchantedForestGen(HolderGetter featureGetter, HolderGetter> carverGetter) { + BiomeGenerationSettings.Builder biome = defaultGenSettingBuilder(featureGetter, carverGetter); + addHollowOakTrees(biome); + addForestVegetation(biome); + commonFeatures(biome); + + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, TFPlacedFeatures.PLACED_ENCHANTED_FOREST_TREES); + + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, TFPlacedFeatures.PLACED_FIDDLEHEAD); + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, VegetationPlacements.VINES); + + addCanopyTrees(biome); + + return biome; + } + + public static BiomeGenerationSettings.Builder spookyForestGen(HolderGetter featureGetter, HolderGetter> carverGetter) { + BiomeGenerationSettings.Builder biome = defaultGenSettingBuilder(featureGetter, carverGetter); + + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, TFPlacedFeatures.PLACED_MAYAPPLE); + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, TFPlacedFeatures.PLACED_TWILIGHT_OAK_TREE); + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, TFPlacedFeatures.PLACED_LARGE_TWILIGHT_OAK_TREE); + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, TFPlacedFeatures.PLACED_DEAD_CANOPY_TREE); + + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, TFPlacedFeatures.PLACED_PUMPKIN_LAMPPOST); + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, TFPlacedFeatures.PLACED_TF_OAK_FALLEN_LOG); + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, TFPlacedFeatures.PLACED_CANOPY_FALLEN_LOG); + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, TFPlacedFeatures.PLACED_WEBS); + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, TFPlacedFeatures.PLACED_FALLEN_LEAVES); + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, VegetationPlacements.PATCH_PUMPKIN); + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, VegetationPlacements.PATCH_DEAD_BUSH); + + biome.addFeature(GenerationStep.Decoration.SURFACE_STRUCTURES, TFPlacedFeatures.PLACED_GRAVEYARD); + + return biome; + } + + public static BiomeGenerationSettings.Builder mushroomForestGen(HolderGetter featureGetter, HolderGetter> carverGetter) { + BiomeGenerationSettings.Builder biome = defaultGenSettingBuilder(featureGetter, carverGetter); + addHollowOakTrees(biome); + addForestVegetationAlt(biome); + commonFeatures(biome); + + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, TFPlacedFeatures.PLACED_MYCELIUM_BLOB); + + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, TFPlacedFeatures.PLACED_VANILLA_TF_TREES); + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, TFPlacedFeatures.PLACED_TWILIGHT_OAK_TREE); + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, TFPlacedFeatures.PLACED_LARGE_TWILIGHT_OAK_TREE); + addCanopyMushrooms(biome, false); + addCanopyTrees(biome); + + return biome; + } + + public static BiomeGenerationSettings.Builder denseMushroomForestGen(HolderGetter featureGetter, HolderGetter> carverGetter) { + BiomeGenerationSettings.Builder biome = defaultGenSettingBuilder(featureGetter, carverGetter); + addHollowOakTrees(biome); + addForestVegetationAlt(biome); + commonFeatures(biome); + + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, TFPlacedFeatures.PLACED_MYCELIUM_BLOB); + + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, TFPlacedFeatures.PLACED_VANILLA_TF_TREES); + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, TFPlacedFeatures.PLACED_TWILIGHT_OAK_TREE); + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, TFPlacedFeatures.PLACED_LARGE_TWILIGHT_OAK_TREE); + addCanopyMushrooms(biome, true); + addCanopyTrees(biome); + + return biome; + } + + public static BiomeGenerationSettings.Builder thornlandsGen(HolderGetter featureGetter, HolderGetter> carverGetter) { + BiomeGenerationSettings.Builder biome = new BiomeGenerationSettings.Builder(featureGetter, carverGetter); + + commonFeaturesWithoutBuildings(biome); + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, TFPlacedFeatures.PLACED_THORNS); + + return biome; + } + + public static BiomeGenerationSettings.Builder highlandsGen(HolderGetter featureGetter, HolderGetter> carverGetter) { + BiomeGenerationSettings.Builder biome = new BiomeGenerationSettings.Builder(featureGetter, carverGetter); + commonFeatures(biome); + + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, TFPlacedFeatures.PLACED_HIGHLANDS_TREES); + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, MiscOverworldPlacements.FOREST_ROCK); + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, VegetationPlacements.PATCH_GRASS_TAIGA); + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, TFPlacedFeatures.PLACED_SPRUCE_FALLEN_LOG); + + addHighlandCaves(biome); + addSmallStoneClusters(biome); + + return biome; + } + + public static BiomeGenerationSettings.Builder streamsAndLakes(HolderGetter featureGetter, HolderGetter> carverGetter, boolean isLake) { + BiomeGenerationSettings.Builder biome = new BiomeGenerationSettings.Builder(featureGetter, carverGetter); + + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, isLake ? AquaticPlacements.SEAGRASS_DEEP : AquaticPlacements.SEAGRASS_NORMAL); + + BiomeDefaultFeatures.addDefaultSeagrass(biome); + BiomeDefaultFeatures.addSurfaceFreezing(biome); + + addLegacyOres(biome); + addSmallStoneClusters(biome); + + return biome; + } + + public static BiomeGenerationSettings.Builder swampGen(HolderGetter featureGetter, HolderGetter> carverGetter) { + BiomeGenerationSettings.Builder biome = defaultGenSettingBuilder(featureGetter, carverGetter); + addHollowOakTrees(biome); + commonFeatures(biome); + + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, TFPlacedFeatures.PLACED_MANGROVE_TREE); + addSwampTrees(biome); + + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, VegetationPlacements.PATCH_SUGAR_CANE_SWAMP); + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, VegetationPlacements.VINES); + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, VegetationPlacements.PATCH_DEAD_BUSH); + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, TFPlacedFeatures.PLACED_MANGROVE_FALLEN_LOG); + + lilypads(biome); + + return biome; + } + + public static BiomeGenerationSettings.Builder fireSwampGen(HolderGetter featureGetter, HolderGetter> carverGetter) { + BiomeGenerationSettings.Builder biome = defaultGenSettingBuilder(featureGetter, carverGetter); + addHollowOakTrees(biome); + + commonFeaturesWithoutBuildings(biome); + addSwampTrees(biome); + + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, TFPlacedFeatures.PLACED_FIRE_JET); + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, TFPlacedFeatures.PLACED_SMOKER); + biome.addFeature(GenerationStep.Decoration.LAKES, TFPlacedFeatures.PLACED_LAKE_LAVA); + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, VegetationPlacements.PATCH_SUGAR_CANE_SWAMP); + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, VegetationPlacements.VINES); + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, VegetationPlacements.BROWN_MUSHROOM_SWAMP); + + + return biome; + } + + public static BiomeGenerationSettings.Builder darkForestGen(HolderGetter featureGetter, HolderGetter> carverGetter) { + BiomeGenerationSettings.Builder biome = new BiomeGenerationSettings.Builder(featureGetter, carverGetter); + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, TFPlacedFeatures.PLACED_FLOWER_PLACER); + + addDarkForestVegetation(biome); + addCaves(biome); + + return biome; + } + + public static BiomeGenerationSettings.Builder darkForestCenterGen(HolderGetter featureGetter, HolderGetter> carverGetter) { + BiomeGenerationSettings.Builder biome = new BiomeGenerationSettings.Builder(featureGetter, carverGetter); + + addDarkForestVegetation(biome); + addCaves(biome); + + return biome; + } + + public static BiomeGenerationSettings.Builder snowyForestGen(HolderGetter featureGetter, HolderGetter> carverGetter) { + BiomeGenerationSettings.Builder biome = new BiomeGenerationSettings.Builder(featureGetter, carverGetter); + + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, TFPlacedFeatures.PLACED_SNOWY_FOREST_TREES); + biome.addFeature(GenerationStep.Decoration.TOP_LAYER_MODIFICATION, TFPlacedFeatures.PLACED_SNOW_UNDER_TREES); + + biome.addFeature(GenerationStep.Decoration.LAKES, TFPlacedFeatures.PLACED_LAKE_WATER); + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, TFPlacedFeatures.PLACED_SPRUCE_FALLEN_LOG); + + BiomeDefaultFeatures.addSurfaceFreezing(biome); + + addCaves(biome); + + return biome; + } + + public static BiomeGenerationSettings.Builder glacierGen(HolderGetter featureGetter, HolderGetter> carverGetter) { + BiomeGenerationSettings.Builder biome = new BiomeGenerationSettings.Builder(featureGetter, carverGetter); + + BiomeDefaultFeatures.addSurfaceFreezing(biome); + + addCaves(biome); + + return biome; + } + + public static BiomeGenerationSettings.Builder undergroundGen(HolderGetter featureGetter, HolderGetter> carverGetter) { + BiomeGenerationSettings.Builder biome = new BiomeGenerationSettings.Builder(featureGetter, carverGetter); + + BiomeDefaultFeatures.addDefaultSoftDisks(biome); + BiomeDefaultFeatures.addSurfaceFreezing(biome); + withWoodRoots(biome); + addCaves(biome); + addSmallStoneClusters(biome); + return biome; + } + + public static void withWoodRoots(BiomeGenerationSettings.Builder biome) { + biome.addFeature(GenerationStep.Decoration.UNDERGROUND_ORES, TFPlacedFeatures.PLACED_WOOD_ROOTS_SPREAD); + } + + public static void commonFeatures(BiomeGenerationSettings.Builder biome) { + biome.addFeature(GenerationStep.Decoration.SURFACE_STRUCTURES, TFPlacedFeatures.PLACED_DRUID_HUT); + biome.addFeature(GenerationStep.Decoration.SURFACE_STRUCTURES, TFPlacedFeatures.PLACED_WELL_PLACER); + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, TFPlacedFeatures.PLACED_GROVE_RUINS); + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, TFPlacedFeatures.PLACED_FOUNDATION); + + commonFeaturesWithoutBuildings(biome); + } + + public static void commonFeaturesWithoutBuildings(BiomeGenerationSettings.Builder biome) { + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, TFPlacedFeatures.PLACED_STONE_CIRCLE); + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, TFPlacedFeatures.PLACED_OUTSIDE_STALAGMITE); + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, TFPlacedFeatures.PLACED_MONOLITH); + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, TFPlacedFeatures.PLACED_HOLLOW_STUMP); + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, TFPlacedFeatures.PLACED_HOLLOW_LOG); + } + + public static void lilypads(BiomeGenerationSettings.Builder biome) { + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, TFPlacedFeatures.PLACED_HUGE_LILY_PAD); + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, TFPlacedFeatures.PLACED_HUGE_WATER_LILY); + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, VegetationPlacements.PATCH_WATERLILY); + } + + public static void addForestVegetation(BiomeGenerationSettings.Builder biome) { + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, TFPlacedFeatures.PLACED_MAYAPPLE); + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, TFPlacedFeatures.PLACED_FLOWER_PLACER); + } + + public static void addForestVegetationAlt(BiomeGenerationSettings.Builder biome) { + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, TFPlacedFeatures.PLACED_MAYAPPLE); + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, TFPlacedFeatures.PLACED_FLOWER_PLACER_ALT); + } + + public static void addDarkForestVegetation(BiomeGenerationSettings.Builder biome) { + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, VegetationPlacements.PATCH_GRASS_NORMAL); + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, TFPlacedFeatures.PLACED_DARK_FOREST_TREE_MIX); + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, TFPlacedFeatures.PLACED_DARK_FOREST_TREES); + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, TFPlacedFeatures.PLACED_DARKWOOD_TREE); + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, TFPlacedFeatures.PLACED_DARK_GRASS); + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, TFPlacedFeatures.PLACED_DARK_FERNS); + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, TFPlacedFeatures.PLACED_DARK_MUSHGLOOMS); + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, TFPlacedFeatures.PLACED_DARK_DEAD_BUSHES); + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, TFPlacedFeatures.PLACED_DARK_PUMPKINS); + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, TFPlacedFeatures.PLACED_DARK_MUSHROOMS); + } + + //Canopies, trees, and anything resembling a forest thing + public static void addCanopyTrees(BiomeGenerationSettings.Builder biome) { + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, TFPlacedFeatures.PLACED_CANOPY_TREES); + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, TFPlacedFeatures.PLACED_DEFAULT_FALLEN_LOGS); + } + + public static void addCanopyMushrooms(BiomeGenerationSettings.Builder biome, boolean dense) { + BiomeDefaultFeatures.addDefaultMushrooms(biome); // Add small mushrooms + //Same config as DefaultBiomeFeatures.withMushroomBiomeVegetation, we just use our custom large mushrooms instead + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, VegetationPlacements.BROWN_MUSHROOM_TAIGA); + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, VegetationPlacements.RED_MUSHROOM_TAIGA); + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, TFPlacedFeatures.PLACED_VANILLA_TF_BIG_MUSH); + + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, dense ? TFPlacedFeatures.PLACED_CANOPY_MUSHROOMS_DENSE : TFPlacedFeatures.PLACED_CANOPY_MUSHROOMS_SPARSE); + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, TFPlacedFeatures.PLACED_MUSHGLOOM_CLUSTER); + } + + public static void addHollowOakTrees(BiomeGenerationSettings.Builder biome) { + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, TFPlacedFeatures.PLACED_HOLLOW_OAK_TREE); + } + + public static void addSwampTrees(BiomeGenerationSettings.Builder biome) { + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, TFPlacedFeatures.PLACED_SWAMPY_OAK_TREE); + } + + public static void addSmallStoneClusters(BiomeGenerationSettings.Builder biome) { + biome.addFeature(GenerationStep.Decoration.UNDERGROUND_ORES, TFPlacedFeatures.PLACED_SMALL_ANDESITE); + biome.addFeature(GenerationStep.Decoration.UNDERGROUND_ORES, TFPlacedFeatures.PLACED_SMALL_DIORITE); + biome.addFeature(GenerationStep.Decoration.UNDERGROUND_ORES, TFPlacedFeatures.PLACED_SMALL_GRANITE); + } + + public static BiomeSpecialEffects.Builder whiteAshParticles(BiomeSpecialEffects.Builder builder) { + builder.ambientParticle(new AmbientParticleSettings(ParticleTypes.WHITE_ASH, 0.05f)); + return builder; + } + + public static BiomeSpecialEffects.Builder fireflyForestParticles(BiomeSpecialEffects.Builder builder) { + builder.ambientParticle(new AmbientParticleSettings(TFParticleType.WANDERING_FIREFLY.get(), 0.001f)); + return builder; + } + + public static BiomeSpecialEffects.Builder fireflyParticles(BiomeSpecialEffects.Builder builder) { + builder.ambientParticle(new AmbientParticleSettings(TFParticleType.WANDERING_FIREFLY.get(), 0.00025f)); + return builder; + } + + //Caves! + public static void addCaves(BiomeGenerationSettings.Builder biome) { + biome.addCarver(GenerationStep.Carving.AIR, TFCaveCarvers.TFCAVES_CONFIGURED); + biome.addFeature(GenerationStep.Decoration.UNDERGROUND_DECORATION, TFPlacedFeatures.PLACED_PLANT_ROOTS); + biome.addFeature(GenerationStep.Decoration.UNDERGROUND_DECORATION, TFPlacedFeatures.PLACED_TORCH_BERRIES); + biome.addFeature(GenerationStep.Decoration.UNDERGROUND_DECORATION, TFPlacedFeatures.PLACED_VANILLA_ROOTS); + addLegacyOres(biome); + } + + public static void addHighlandCaves(BiomeGenerationSettings.Builder biome) { + biome.addCarver(GenerationStep.Carving.AIR, TFCaveCarvers.HIGHLANDCAVES_CONFIGURED); + biome.addFeature(GenerationStep.Decoration.UNDERGROUND_DECORATION, TFPlacedFeatures.PLACED_TROLL_ROOTS); + addLegacyOres(biome); + } + + public static void addLegacyOres(BiomeGenerationSettings.Builder biome) { + biome.addFeature(GenerationStep.Decoration.UNDERGROUND_ORES, TFPlacedFeatures.PLACED_LEGACY_COAL_ORE); + biome.addFeature(GenerationStep.Decoration.UNDERGROUND_ORES, TFPlacedFeatures.PLACED_LEGACY_IRON_ORE); + biome.addFeature(GenerationStep.Decoration.UNDERGROUND_ORES, TFPlacedFeatures.PLACED_LEGACY_GOLD_ORE); + biome.addFeature(GenerationStep.Decoration.UNDERGROUND_ORES, TFPlacedFeatures.PLACED_LEGACY_REDSTONE_ORE); + biome.addFeature(GenerationStep.Decoration.UNDERGROUND_ORES, TFPlacedFeatures.PLACED_LEGACY_DIAMOND_ORE); + biome.addFeature(GenerationStep.Decoration.UNDERGROUND_ORES, TFPlacedFeatures.PLACED_LEGACY_LAPIS_ORE); + biome.addFeature(GenerationStep.Decoration.UNDERGROUND_ORES, TFPlacedFeatures.PLACED_LEGACY_COPPER_ORE); + } + + //Special mob spawns + public static MobSpawnSettings.Builder penguinSpawning() { + MobSpawnSettings.Builder spawnInfo = new MobSpawnSettings.Builder(); + + spawnInfo.creatureGenerationProbability(0.2f); + spawnInfo.addSpawn(MobCategory.CREATURE, new MobSpawnSettings.SpawnerData(TFEntities.PENGUIN.get(), 10, 2, 4)); + + return spawnInfo; + } + + public static MobSpawnSettings.Builder darkForestSpawning() { + MobSpawnSettings.Builder spawnInfo = new MobSpawnSettings.Builder(); + + spawnInfo.creatureGenerationProbability(0.05f); + spawnInfo.addSpawn(MobCategory.MONSTER, new MobSpawnSettings.SpawnerData(EntityType.ENDERMAN, 2, 1, 2)).addMobCharge(EntityType.ENDERMAN, 0.75D, 0.15D); + spawnInfo.addSpawn(MobCategory.MONSTER, new MobSpawnSettings.SpawnerData(EntityType.ZOMBIE, 5, 1, 2)).addMobCharge(EntityType.ZOMBIE, 0.75D, 0.15D); + spawnInfo.addSpawn(MobCategory.MONSTER, new MobSpawnSettings.SpawnerData(EntityType.SKELETON, 5, 1, 2)).addMobCharge(EntityType.SKELETON, 0.85D, 0.15D); + spawnInfo.addSpawn(MobCategory.MONSTER, new MobSpawnSettings.SpawnerData(TFEntities.MIST_WOLF.get(), 5, 1, 1)).addMobCharge(TFEntities.MIST_WOLF.get(), 0.5D, 0.35D); + spawnInfo.addSpawn(MobCategory.MONSTER, new MobSpawnSettings.SpawnerData(TFEntities.SKELETON_DRUID.get(), 5, 1, 1)).addMobCharge(TFEntities.SKELETON_DRUID.get(), 0.85D, 0.4D); + spawnInfo.addSpawn(MobCategory.MONSTER, new MobSpawnSettings.SpawnerData(TFEntities.KING_SPIDER.get(), 1, 1, 1)).addMobCharge(TFEntities.KING_SPIDER.get(), 1.0D, 0.5D); + spawnInfo.addSpawn(MobCategory.MONSTER, new MobSpawnSettings.SpawnerData(TFEntities.KOBOLD.get(), 10, 1, 3)).addMobCharge(TFEntities.KOBOLD.get(), 0.7D, 0.11D); + spawnInfo.addSpawn(MobCategory.MONSTER, new MobSpawnSettings.SpawnerData(EntityType.WITCH, 2, 1, 1)).addMobCharge(EntityType.WITCH, 0.75D, 0.11D); + + return spawnInfo; + } + + public static MobSpawnSettings.Builder snowForestSpawning() { + MobSpawnSettings.Builder spawnInfo = new MobSpawnSettings.Builder(); + + spawnInfo.creatureGenerationProbability(0.05f); + spawnInfo.addSpawn(MobCategory.MONSTER, new MobSpawnSettings.SpawnerData(TFEntities.WINTER_WOLF.get(), 5, 1, 1)).addMobCharge(TFEntities.WINTER_WOLF.get(), 0.8D, 0.11D); + spawnInfo.addSpawn(MobCategory.MONSTER, new MobSpawnSettings.SpawnerData(TFEntities.YETI.get(), 5, 1, 1)).addMobCharge(TFEntities.YETI.get(), 0.8D, 0.11D); + + return spawnInfo; + } + + public static MobSpawnSettings.Builder ravenSpawning() { + MobSpawnSettings.Builder spawnInfo = new MobSpawnSettings.Builder(); + + spawnInfo.creatureGenerationProbability(0.3f); + spawnInfo.addSpawn(MobCategory.CREATURE, new MobSpawnSettings.SpawnerData(TFEntities.RAVEN.get(), 10, 4, 4)); + + return spawnInfo; + } + + public static MobSpawnSettings.Builder swampSpawning() { + MobSpawnSettings.Builder spawnInfo = new MobSpawnSettings.Builder(); + + spawnInfo.creatureGenerationProbability(0.1f); + spawnInfo.addSpawn(MobCategory.MONSTER, new MobSpawnSettings.SpawnerData(EntityType.ZOMBIE, 10, 1, 2)).addMobCharge(EntityType.ZOMBIE, 0.75D, 0.2D); + spawnInfo.addSpawn(MobCategory.MONSTER, new MobSpawnSettings.SpawnerData(TFEntities.MOSQUITO_SWARM.get(), 10, 1, 1)).addMobCharge(TFEntities.MOSQUITO_SWARM.get(), 0.75D, 0.2D); + + return spawnInfo; + } + + public static MobSpawnSettings.Builder spookSpawning() { + MobSpawnSettings.Builder spawnInfo = new MobSpawnSettings.Builder(); + + spawnInfo.creatureGenerationProbability(0.2f); + spawnInfo.addSpawn(MobCategory.MONSTER, new MobSpawnSettings.SpawnerData(EntityType.SPIDER, 50, 1, 2)).addMobCharge(EntityType.SPIDER, 0.75D, 0.25D); + spawnInfo.addSpawn(MobCategory.MONSTER, new MobSpawnSettings.SpawnerData(EntityType.SKELETON, 20, 1, 2)).addMobCharge(EntityType.SKELETON, 0.85D, 0.25D); + spawnInfo.addSpawn(MobCategory.MONSTER, new MobSpawnSettings.SpawnerData(TFEntities.SKELETON_DRUID.get(), 5, 1, 1)).addMobCharge(TFEntities.SKELETON_DRUID.get(), 0.95D, 0.25D); + spawnInfo.addSpawn(MobCategory.AMBIENT, new MobSpawnSettings.SpawnerData(EntityType.BAT, 20, 2, 4)); + + return spawnInfo; + } + + // Defaults + public static BiomeSpecialEffects.Builder defaultAmbientBuilder() { + return new BiomeSpecialEffects.Builder() + .fogColor(0xC0FFD8) + .waterColor(0x3F76E4) + .waterFogColor(0x050533) + .skyColor(0x20224A) + .ambientMoodSound(AmbientMoodSettings.LEGACY_CAVE_SETTINGS) // We should probably change it + .backgroundMusic(TFConfiguredFeatures.TFMUSICTYPE); + + } + + public static BiomeGenerationSettings.Builder defaultGenSettingBuilder(HolderGetter featureGetter, HolderGetter> carverGetter) { + BiomeGenerationSettings.Builder biome = new BiomeGenerationSettings.Builder(featureGetter, carverGetter); + + BiomeDefaultFeatures.addDefaultSoftDisks(biome); + BiomeDefaultFeatures.addForestGrass(biome); + BiomeDefaultFeatures.addSavannaGrass(biome); + BiomeDefaultFeatures.addDefaultGrass(biome); + BiomeDefaultFeatures.addSavannaExtraGrass(biome); + biome.addFeature(GenerationStep.Decoration.VEGETAL_DECORATION, VegetationPlacements.PATCH_SUGAR_CANE); + BiomeDefaultFeatures.addSurfaceFreezing(biome); + withWoodRoots(biome); + addCaves(biome); + addSmallStoneClusters(biome); + return biome; + } + + public static MobSpawnSettings.Builder defaultMobSpawning() { + MobSpawnSettings.Builder spawnInfo = new MobSpawnSettings.Builder(); + + spawnInfo.creatureGenerationProbability(0.1f); + + spawnInfo.addSpawn(MobCategory.CREATURE, new MobSpawnSettings.SpawnerData(TFEntities.BIGHORN_SHEEP.get(), 12, 4, 4)); + spawnInfo.addSpawn(MobCategory.CREATURE, new MobSpawnSettings.SpawnerData(TFEntities.BOAR.get(), 10, 4, 4)); + spawnInfo.addSpawn(MobCategory.CREATURE, new MobSpawnSettings.SpawnerData(EntityType.CHICKEN, 10, 4, 4)); + spawnInfo.addSpawn(MobCategory.CREATURE, new MobSpawnSettings.SpawnerData(TFEntities.DEER.get(), 15, 4, 5)); + spawnInfo.addSpawn(MobCategory.CREATURE, new MobSpawnSettings.SpawnerData(EntityType.WOLF, 5, 4, 4)); + spawnInfo.addSpawn(MobCategory.CREATURE, new MobSpawnSettings.SpawnerData(TFEntities.TINY_BIRD.get(), 15, 4, 8)); + spawnInfo.addSpawn(MobCategory.CREATURE, new MobSpawnSettings.SpawnerData(TFEntities.SQUIRREL.get(), 10, 2, 4)); + spawnInfo.addSpawn(MobCategory.CREATURE, new MobSpawnSettings.SpawnerData(TFEntities.DWARF_RABBIT.get(), 10, 4, 5)); + spawnInfo.addSpawn(MobCategory.CREATURE, new MobSpawnSettings.SpawnerData(TFEntities.RAVEN.get(), 10, 1, 2)); + + return spawnInfo; + } + + public static MobSpawnSettings.Builder undergroundMobSpawning() { + MobSpawnSettings.Builder spawnInfo = new MobSpawnSettings.Builder(); + + spawnInfo.creatureGenerationProbability(0.1f); + + spawnInfo.addSpawn(MobCategory.MONSTER, new MobSpawnSettings.SpawnerData(EntityType.SPIDER, 10, 2, 3)).addMobCharge(EntityType.SPIDER, 0.6D, 0.1D); + spawnInfo.addSpawn(MobCategory.MONSTER, new MobSpawnSettings.SpawnerData(EntityType.ZOMBIE, 10, 1, 2)).addMobCharge(EntityType.ZOMBIE, 0.7D, 0.1D); + spawnInfo.addSpawn(MobCategory.MONSTER, new MobSpawnSettings.SpawnerData(EntityType.SKELETON, 10, 1, 1)).addMobCharge(EntityType.SKELETON, 0.7D, 0.1D); + spawnInfo.addSpawn(MobCategory.MONSTER, new MobSpawnSettings.SpawnerData(EntityType.CREEPER, 1, 1, 1)).addMobCharge(EntityType.CREEPER, 0.5D, 0.1D); + spawnInfo.addSpawn(MobCategory.MONSTER, new MobSpawnSettings.SpawnerData(EntityType.SLIME, 10, 2, 4)).addMobCharge(EntityType.SLIME, 0.2D, 0.1D); + spawnInfo.addSpawn(MobCategory.MONSTER, new MobSpawnSettings.SpawnerData(EntityType.ENDERMAN, 1, 1, 2)).addMobCharge(EntityType.ENDERMAN, 0.3D, 0.1D); + spawnInfo.addSpawn(MobCategory.MONSTER, new MobSpawnSettings.SpawnerData(TFEntities.KOBOLD.get(), 10, 1, 3)).addMobCharge(TFEntities.KOBOLD.get(), 0.2D, 0.1D); + spawnInfo.addSpawn(MobCategory.AMBIENT, new MobSpawnSettings.SpawnerData(EntityType.BAT, 10, 1, 1)); + + return spawnInfo; + } + + public static Biome.BiomeBuilder biomeWithDefaults(BiomeSpecialEffects.Builder biomeAmbience, MobSpawnSettings.Builder mobSpawnInfo, BiomeGenerationSettings.Builder biomeGenerationSettings) { + return new Biome.BiomeBuilder() + .hasPrecipitation(true) + .temperature(0.5F) + .downfall(0.5F) + .specialEffects(biomeAmbience.build()) + .mobSpawnSettings(mobSpawnInfo.build()) + .generationSettings(biomeGenerationSettings.build()) + .temperatureAdjustment(Biome.TemperatureModifier.NONE); + } +} diff --git a/src/main/java/twilightforest/world/registration/biomes/BiomeMaker.java b/src/main/java/twilightforest/world/registration/biomes/BiomeMaker.java new file mode 100644 index 0000000000..55f33dceca --- /dev/null +++ b/src/main/java/twilightforest/world/registration/biomes/BiomeMaker.java @@ -0,0 +1,91 @@ +package twilightforest.world.registration.biomes; + +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; +import it.unimi.dsi.fastutil.floats.Float2ObjectAVLTreeMap; +import it.unimi.dsi.fastutil.floats.Float2ObjectSortedMap; +import net.minecraft.Util; +import net.minecraft.core.Holder; +import net.minecraft.core.HolderGetter; +import net.minecraft.core.HolderLookup; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.biome.Biome; +import twilightforest.init.TFBiomes; +import twilightforest.init.TFLandmark; +import twilightforest.world.components.chunkgenerators.warp.TerrainColumn; + +import java.util.List; +import java.util.Map; +import java.util.function.Consumer; + +public final class BiomeMaker extends BiomeHelper { + + public static final Map, ImmutableSet> BIOME_FEATURES_SETS = new ImmutableMap.Builder, ImmutableSet>() + //.put(TFBiomes.DENSE_MUSHROOM_FOREST, Set.of(MUSHROOM_TOWER)) + .put(TFBiomes.ENCHANTED_FOREST, ImmutableSet.of(TFLandmark.QUEST_GROVE)) + //.put(TFBiomes.LAKE, ImmutableSet.of(TFLandmark.QUEST_ISLAND)) + .put(TFBiomes.SWAMP, ImmutableSet.of(TFLandmark.LABYRINTH)) + .put(TFBiomes.FIRE_SWAMP, ImmutableSet.of(TFLandmark.HYDRA_LAIR)) + .put(TFBiomes.DARK_FOREST, ImmutableSet.of(TFLandmark.KNIGHT_STRONGHOLD)) + .put(TFBiomes.DARK_FOREST_CENTER, ImmutableSet.of(TFLandmark.DARK_TOWER)) + .put(TFBiomes.SNOWY_FOREST, ImmutableSet.of(TFLandmark.YETI_CAVE)) + .put(TFBiomes.GLACIER, ImmutableSet.of(TFLandmark.ICE_TOWER)) + .put(TFBiomes.HIGHLANDS, ImmutableSet.of(TFLandmark.TROLL_CAVE)) + .put(TFBiomes.FINAL_PLATEAU, ImmutableSet.of(TFLandmark.FINAL_CASTLE)) + .build(); + + public static List makeBiomeList(HolderGetter biomeRegistry, Holder undergroundBiome) { + return List.of( + biomeColumnWithUnderground(0.025F, 0.05F, biomeRegistry, TFBiomes.FOREST, undergroundBiome), + biomeColumnWithUnderground(0.1F, 0.2F, biomeRegistry, TFBiomes.DENSE_FOREST, undergroundBiome), + biomeColumnWithUnderground(0.0625F, 0.05F, biomeRegistry, TFBiomes.FIREFLY_FOREST, undergroundBiome), + biomeColumnWithUnderground(0.005F, 0.005F, biomeRegistry, TFBiomes.CLEARING, undergroundBiome), + biomeColumnWithUnderground(0.05F, 0.1F, biomeRegistry, TFBiomes.OAK_SAVANNAH, undergroundBiome), + biomeColumnWithUnderground(-1.65F, 0.25F, biomeRegistry, TFBiomes.STREAM, undergroundBiome), + biomeColumnWithUnderground(-1.97F, 0.0F, biomeRegistry, TFBiomes.LAKE, undergroundBiome), + + biomeColumnWithUnderground(0.025F, 0.05F, biomeRegistry, TFBiomes.MUSHROOM_FOREST, undergroundBiome), + biomeColumnWithUnderground(0.05F, 0.05F, biomeRegistry, TFBiomes.DENSE_MUSHROOM_FOREST, undergroundBiome), + + biomeColumnWithUnderground(0.025F, 0.05F, biomeRegistry, TFBiomes.ENCHANTED_FOREST, undergroundBiome), + biomeColumnWithUnderground(0.025F, 0.05F, biomeRegistry, TFBiomes.SPOOKY_FOREST, undergroundBiome), + + biomeColumnWithUnderground(-0.9F, 0.15F, biomeRegistry, TFBiomes.SWAMP, undergroundBiome), + biomeColumnWithUnderground(-0.2F, 0.05F, biomeRegistry, TFBiomes.FIRE_SWAMP, undergroundBiome), + + biomeColumnWithUnderground(0.025F, 0.005F, biomeRegistry, TFBiomes.DARK_FOREST, undergroundBiome), + biomeColumnWithUnderground(0.025F, 0.005F, biomeRegistry, TFBiomes.DARK_FOREST_CENTER, undergroundBiome), + + biomeColumnWithUnderground(0.05F, 0.15F, biomeRegistry, TFBiomes.SNOWY_FOREST, undergroundBiome), + biomeColumnWithUnderground(0.025F, 0.05F, biomeRegistry, TFBiomes.GLACIER, undergroundBiome), + + biomeColumnWithUnderground(3.0F, 0.25F, biomeRegistry, TFBiomes.HIGHLANDS, undergroundBiome), + biomeColumnToBedrock(7.0F, 0.1F, biomeRegistry, TFBiomes.THORNLANDS), + biomeColumnToBedrock(13.75F, 0.025F, biomeRegistry, TFBiomes.FINAL_PLATEAU) + ); + } + + private static TerrainColumn biomeColumnWithUnderground(float noiseDepth, float noiseScale, HolderGetter biomeRegistry, ResourceKey key, Holder undergroundBiome) { + Holder.Reference biomeHolder = biomeRegistry.getOrThrow(key); + + biomeHolder.bindKey(key); + + return makeColumn(noiseDepth, noiseScale, biomeHolder, treeMap -> { + // This will put the transition boundary around Y-8 + treeMap.put(Math.min(noiseDepth - 1, -1), biomeHolder); + treeMap.put(Math.min(noiseDepth - 3, -3), undergroundBiome); + }); + } + + private static TerrainColumn biomeColumnToBedrock(float noiseDepth, float noiseScale, HolderGetter biomeRegistry, ResourceKey key) { + Holder.Reference biomeHolder = biomeRegistry.getOrThrow(key); + + biomeHolder.bindKey(key); + + return makeColumn(noiseDepth, noiseScale, biomeHolder, treeMap -> treeMap.put(0, biomeHolder)); + } + + private static TerrainColumn makeColumn(float noiseDepth, float noiseScale, Holder biomeHolder, Consumer>> layerBuilder) { + return new TerrainColumn(biomeHolder, Util.make(new Float2ObjectAVLTreeMap<>(), layerBuilder), noiseDepth, noiseScale); + } +} diff --git a/src/main/java/twilightforest/world/registration/biomes/package-info.java b/src/main/java/twilightforest/world/registration/biomes/package-info.java new file mode 100644 index 0000000000..89af101159 --- /dev/null +++ b/src/main/java/twilightforest/world/registration/biomes/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.world.registration.biomes; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/world/registration/package-info.java b/src/main/java/twilightforest/world/registration/package-info.java new file mode 100644 index 0000000000..e5d2874da9 --- /dev/null +++ b/src/main/java/twilightforest/world/registration/package-info.java @@ -0,0 +1,6 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package twilightforest.world.registration; + +import net.minecraft.MethodsReturnNonnullByDefault; +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/twilightforest/world/registration/surface_rules/TFSurfaceRules.java b/src/main/java/twilightforest/world/registration/surface_rules/TFSurfaceRules.java new file mode 100644 index 0000000000..faa7b3ffb6 --- /dev/null +++ b/src/main/java/twilightforest/world/registration/surface_rules/TFSurfaceRules.java @@ -0,0 +1,150 @@ +package twilightforest.world.registration.surface_rules; + +import com.google.common.collect.ImmutableList; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.levelgen.Noises; +import net.minecraft.world.level.levelgen.SurfaceRules; +import net.minecraft.world.level.levelgen.VerticalAnchor; +import twilightforest.init.TFBiomes; +import twilightforest.init.TFBlocks; + +public class TFSurfaceRules { + + private static final SurfaceRules.RuleSource BEDROCK = makeStateRule(Blocks.BEDROCK); + private static final SurfaceRules.RuleSource GRASS_BLOCK = makeStateRule(Blocks.GRASS_BLOCK); + private static final SurfaceRules.RuleSource DIRT = makeStateRule(Blocks.DIRT); + private static final SurfaceRules.RuleSource PODZOL = makeStateRule(Blocks.PODZOL); + private static final SurfaceRules.RuleSource COARSE_DIRT = makeStateRule(Blocks.COARSE_DIRT); + private static final SurfaceRules.RuleSource GRAVEL = makeStateRule(Blocks.GRAVEL); + private static final SurfaceRules.RuleSource SAND = makeStateRule(Blocks.SAND); + private static final SurfaceRules.RuleSource SANDSTONE = makeStateRule(Blocks.SANDSTONE); + private static final SurfaceRules.RuleSource SNOW = makeStateRule(Blocks.SNOW_BLOCK); + private static final SurfaceRules.RuleSource WEATHERED_DEADROCK = makeStateRule(TFBlocks.WEATHERED_DEADROCK.get()); + private static final SurfaceRules.RuleSource CRACKED_DEADROCK = makeStateRule(TFBlocks.CRACKED_DEADROCK.get()); + private static final SurfaceRules.RuleSource DEADROCK = makeStateRule(TFBlocks.DEADROCK.get()); + + private static SurfaceRules.RuleSource makeStateRule(Block block) { + return SurfaceRules.state(block.defaultBlockState()); + } + + public static SurfaceRules.RuleSource tfSurface() { + //surface is a normal overworld surface as the base + //snowy forest is all snow on the top layers + //glacier has gravel for a few layers, then stone + //highlands has a noise-based mixture of podzol and coarse dirt + //thornlands/plateau has no caves and deadrock instead of stone + + SurfaceRules.RuleSource highlandsNoise = SurfaceRules.sequence( + //check if we're in the highlands + SurfaceRules.ifTrue( + SurfaceRules.isBiome(TFBiomes.HIGHLANDS), + SurfaceRules.ifTrue( + //check if we're on the surface + SurfaceRules.ON_FLOOR, + SurfaceRules.sequence( + //mix coarse dirt and podzol like we used to + PODZOL, + SurfaceRules.ifTrue(surfaceNoiseAbove(1.75D), COARSE_DIRT), + SurfaceRules.ifTrue(surfaceNoiseAbove(-0.95D), PODZOL))))); + + SurfaceRules.RuleSource deadrockLands = SurfaceRules.sequence( + SurfaceRules.ifTrue( + //check if we're in the deadrock biomes + SurfaceRules.isBiome(TFBiomes.THORNLANDS, TFBiomes.FINAL_PLATEAU), + //deadrock blocks replace everything + SurfaceRules.sequence( + SurfaceRules.ifTrue(SurfaceRules.ON_FLOOR, WEATHERED_DEADROCK), + SurfaceRules.ifTrue( + SurfaceRules.waterStartCheck(-6, -1), + SurfaceRules.sequence( + SurfaceRules.ifTrue( + SurfaceRules.UNDER_FLOOR, + CRACKED_DEADROCK))), + DEADROCK))); + + SurfaceRules.RuleSource snowyForest = SurfaceRules.sequence( + SurfaceRules.ifTrue( + //check if we're in the snowy forest + SurfaceRules.isBiome(TFBiomes.SNOWY_FOREST), + //surface is snow + SurfaceRules.sequence( + SurfaceRules.ifTrue(SurfaceRules.ON_FLOOR, SNOW), + SurfaceRules.ifTrue( + SurfaceRules.waterStartCheck(-6, -1), + SurfaceRules.sequence( + SurfaceRules.ifTrue( + SurfaceRules.UNDER_FLOOR, + SNOW)))))); + + SurfaceRules.RuleSource glacier = SurfaceRules.sequence( + SurfaceRules.ifTrue( + //check if we're in the glacier + SurfaceRules.isBiome(TFBiomes.GLACIER), + SurfaceRules.sequence( + //surface and under is gravel + SurfaceRules.ifTrue(SurfaceRules.ON_FLOOR, GRAVEL), + SurfaceRules.ifTrue( + SurfaceRules.waterStartCheck(-6, -1), + SurfaceRules.sequence( + SurfaceRules.ifTrue( + SurfaceRules.UNDER_FLOOR, + GRAVEL)))))); + + SurfaceRules.RuleSource overworldLike = SurfaceRules.sequence( + SurfaceRules.ifTrue(SurfaceRules.ON_FLOOR, + SurfaceRules.sequence( + SurfaceRules.ifTrue( + //lakes and rivers get sand + SurfaceRules.isBiome(TFBiomes.LAKE, TFBiomes.STREAM), + SurfaceRules.sequence( + SurfaceRules.ifTrue(SurfaceRules.ON_CEILING, SANDSTONE), + SurfaceRules.ifTrue(SurfaceRules.waterBlockCheck(-1, 0), GRASS_BLOCK), SAND)), + //make sure the swamps always get grass, they had weird stone patches sometimes + SurfaceRules.ifTrue( + SurfaceRules.isBiome(TFBiomes.SWAMP, TFBiomes.FIRE_SWAMP), + SurfaceRules.sequence( + SurfaceRules.ifTrue(SurfaceRules.waterBlockCheck(-1, 0), GRASS_BLOCK), DIRT)), + //make everything else grass + SurfaceRules.ifTrue(SurfaceRules.waterBlockCheck(-1, 0), + SurfaceRules.sequence( + SurfaceRules.ifTrue( + //check if we're above ground, so hollow hills dont have grassy floors + SurfaceRules.yStartCheck(VerticalAnchor.absolute(-4), 1), GRASS_BLOCK))), + + //if we're around the area hollow hill floors are, check if we're underwater. If so place some dirt. + //This fixes streams having weird stone patches + SurfaceRules.ifTrue( + SurfaceRules.not( + SurfaceRules.yStartCheck(VerticalAnchor.absolute(-4), 1)), + SurfaceRules.sequence( + SurfaceRules.ifTrue( + SurfaceRules.not( + SurfaceRules.waterBlockCheck(-1, 0)), DIRT))))), + //dirt goes under the grass of course! + //check if we're above ground, so hollow hills dont have dirt floors + SurfaceRules.ifTrue(SurfaceRules.waterStartCheck(-6, -1), + SurfaceRules.sequence( + SurfaceRules.ifTrue( + SurfaceRules.yStartCheck(VerticalAnchor.absolute(-4), 1), + SurfaceRules.sequence( + SurfaceRules.ifTrue(SurfaceRules.UNDER_FLOOR, DIRT)))))); + + + ImmutableList.Builder builder = ImmutableList.builder(); + builder + + .add(SurfaceRules.ifTrue(SurfaceRules.verticalGradient("bedrock_floor", VerticalAnchor.bottom(), VerticalAnchor.aboveBottom(5)), BEDROCK)) + .add(highlandsNoise) + .add(deadrockLands) + .add(snowyForest) + .add(glacier) + .add(overworldLike); + + return SurfaceRules.sequence(builder.build().toArray(SurfaceRules.RuleSource[]::new)); + } + + private static SurfaceRules.ConditionSource surfaceNoiseAbove(double p_194809_) { + return SurfaceRules.noiseCondition(Noises.SURFACE, p_194809_ / 8.25D, Double.MAX_VALUE); + } +} diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg new file mode 100644 index 0000000000..53b6d8a205 --- /dev/null +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -0,0 +1,171 @@ +# Comment each AT with where it needed to be used + +# CarminiteGhastguard +public net.minecraft.world.entity.monster.Ghast$GhastLookGoal + +# CinderFurnaceBlockEntity +protected net.minecraft.world.level.block.entity.AbstractFurnaceBlockEntity * + +# TFSkyRenderer +public net.minecraft.client.renderer.LevelRenderer f_109472_ # skyBuffer +public net.minecraft.client.renderer.LevelRenderer f_109473_ # darkBuffer + +# TFStructureComponent +protected net.minecraft.world.level.levelgen.structure.StructurePiece f_73379_ # rotation +protected net.minecraft.world.level.levelgen.structure.StructurePiece f_73378_ # mirror +protected net.minecraft.world.level.levelgen.structure.StructurePiece f_73377_ # orientation + +# PlayerHelper +public net.minecraft.client.multiplayer.ClientAdvancements f_104390_ # advancementToProgress + +# TFEventListener +public net.minecraft.world.entity.LivingEntity m_21275_(Lnet/minecraft/world/damagesource/DamageSource;)Z # isDamageSourceBlocked + +# Bighorn +protected net.minecraft.world.entity.animal.Sheep m_29823_(Lnet/minecraft/world/entity/animal/Animal;Lnet/minecraft/world/entity/animal/Animal;)Lnet/minecraft/world/item/DyeColor; # getOffspringColor + +# Entity Sizes because argh otherwise how does hydra work +public net.minecraft.world.entity.Entity f_19815_ # dimensions + +# LowerGoblinKnight and UpperGoblinKnight +public net.minecraft.world.entity.LivingEntity m_21278_(Lnet/minecraft/world/item/ItemStack;)V # breakItem + +# Knight Phantom and Minotaur/Minoshroom +public net.minecraft.world.entity.Mob m_21424_(Lnet/minecraft/world/entity/player/Player;Lnet/minecraft/world/item/ItemStack;Lnet/minecraft/world/item/ItemStack;)V # maybeDisableShield + +# MinoshroomModel +public net.minecraft.client.model.HumanoidModel m_102875_(Lnet/minecraft/world/entity/LivingEntity;)V # poseRightArm +public net.minecraft.client.model.HumanoidModel m_102878_(Lnet/minecraft/world/entity/LivingEntity;)V # poseLeftArm + +# TFClientEvents +public net.minecraft.client.gui.Gui f_92980_ # vignetteBrightness + +# ProtectionParticle +public net.minecraft.client.particle.SuspendedTownParticle (Lnet/minecraft/client/multiplayer/ClientLevel;DDDDDD)V #constructor + +# GroundAttackGoal and NoClipMoveHelper +public net.minecraft.world.entity.ai.control.MoveControl f_24981_ # operation +public net.minecraft.world.entity.ai.control.MoveControl$Operation # MoveControl.Operation + +# GoalSelector.goals so we can remove goals +public net.minecraft.world.entity.ai.goal.GoalSelector f_25345_ # availableGoals + +#GameRules.BooleanValue.create we need creatable gamerules +public net.minecraft.world.level.GameRules$BooleanValue m_46250_(Z)Lnet/minecraft/world/level/GameRules$Type; # create + +# No API yet for Trunk Placers yet +public net.minecraft.world.level.levelgen.feature.trunkplacers.TrunkPlacerType (Lcom/mojang/serialization/Codec;)V # ctor + +# Used in Trunk Mover Upper +public net.minecraft.world.level.levelgen.feature.trunkplacers.TrunkPlacer f_70263_ # baseHeight +public net.minecraft.world.level.levelgen.feature.trunkplacers.TrunkPlacer f_70264_ # heightRandA +public net.minecraft.world.level.levelgen.feature.trunkplacers.TrunkPlacer f_70265_ # heightRandB + +# Used in BlockTagGenerator +public net.minecraft.world.level.block.state.BlockBehaviour f_60442_ # material + +# Used in Parrot +public net.minecraft.world.entity.animal.Parrot f_29358_ # MOB_SOUND_MAP + +# Used in TFBlocks to allow composting +public net.minecraft.world.level.block.ComposterBlock m_51920_(FLnet/minecraft/world/level/ItemLike;)V # add + +# Used in TFBlocks to allow blocks to set fire +public net.minecraft.world.level.block.FireBlock m_53444_(Lnet/minecraft/world/level/block/Block;II)V # setFlammable + +# Used in TwilightForestMod to allow block stripping +public-f net.minecraft.world.item.AxeItem f_150683_ # STRIPPABLES + +# Used in ChunkGeneratorTFBase +public-f net.minecraft.world.level.levelgen.NoiseBasedChunkGenerator + +# Used in TFEventListener +public-f net.minecraft.world.entity.player.Inventory f_35978_ # player + +# used in TFMaze +public net.minecraft.world.level.levelgen.structure.StructurePiece$BlockSelector + +# used in RedcapModel +public net.minecraft.client.model.HumanoidModel m_102856_(Lnet/minecraft/world/entity/LivingEntity;)Lnet/minecraft/world/entity/HumanoidArm; # getAttackArm + +# MazeMapItem +public net.minecraft.world.level.saveddata.maps.MapItemSavedData f_77894_ # decorations + +# TFMazeMapData +public net.minecraft.world.level.saveddata.maps.MapItemSavedData (IIBZZZLnet/minecraft/resources/ResourceKey;)V # ctor +public-f net.minecraft.world.level.saveddata.maps.MapItemSavedData f_77885_ # x +public-f net.minecraft.world.level.saveddata.maps.MapItemSavedData f_77886_ # z +public-f net.minecraft.world.level.saveddata.maps.MapItemSavedData f_77897_ # bannerMarkers +public-f net.minecraft.world.level.saveddata.maps.MapItemSavedData f_77898_ # frameMarkers +public-f net.minecraft.world.level.saveddata.maps.MapItemSavedData f_181308_ # trackedDecorationCount + +# TreePlacer +public net.minecraft.world.level.levelgen.feature.TreeFeature m_225251_(Lnet/minecraft/world/level/LevelAccessor;Lnet/minecraft/world/level/levelgen/structure/BoundingBox;Ljava/util/Set;Ljava/util/Set;Ljava/util/Set;)Lnet/minecraft/world/phys/shapes/DiscreteVoxelShape; # updateLeaves + +# Heightmap +public net.minecraft.world.level.levelgen.Heightmap m_64245_(III)V # setHeight + +# NoiseBasedChunkGenerator +public net.minecraft.world.level.levelgen.NoiseBasedChunkGenerator f_64316_ # defaultBlock + +# Spawner +public net.minecraft.world.level.BaseSpawner f_45451_ # maxNearbyEntities +public net.minecraft.world.level.BaseSpawner f_45449_ # spawnCount +public net.minecraft.world.level.BaseSpawner f_45453_ # spawnRange + +# TFCavesCarver +public net.minecraft.world.level.levelgen.carver.CaveCarverConfiguration f_159157_ #floorLevel +public net.minecraft.world.level.levelgen.carver.WorldCarver m_159423_(Lnet/minecraft/world/level/levelgen/carver/CarverConfiguration;)Z # isDebugEnabled +public net.minecraft.world.level.levelgen.carver.WorldCarver m_159418_(Lnet/minecraft/world/level/levelgen/carver/CarvingContext;Lnet/minecraft/world/level/levelgen/carver/CarverConfiguration;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/levelgen/Aquifer;)Lnet/minecraft/world/level/block/state/BlockState; # getCarveState + +# Used in TargetedRotProcessor +protected net.minecraft.world.level.levelgen.structure.templatesystem.BlockRotProcessor f_74075_ # integrity + +# Used in ChestRenderer +public net.minecraft.client.resources.model.ModelBakery f_119234_ # UNREFERENCED_TEXTURES + +# Used in SpecialFlowerPotBlock +public net.minecraft.world.level.block.FlowerPotBlock m_153267_()Z # isEmpty + +# Used in TFBlendedNoise, derivative of above +public net.minecraft.world.level.levelgen.synth.BlendedNoise f_164290_ #mainNoise +public net.minecraft.world.level.levelgen.synth.BlendedNoise f_164289_ #maxLimitNoise +public net.minecraft.world.level.levelgen.synth.BlendedNoise f_164288_ #minLimitNoise +public net.minecraft.world.level.levelgen.synth.BlendedNoise f_192799_ # xzScale +public net.minecraft.world.level.levelgen.synth.BlendedNoise f_192800_ # yScale +public net.minecraft.world.level.levelgen.synth.BlendedNoise f_230458_ # xzFactor +public net.minecraft.world.level.levelgen.synth.BlendedNoise f_230459_ # yFactor + +# Used in WorldUtil +public net.minecraft.server.level.ChunkMap m_183719_()Lnet/minecraft/world/level/chunk/ChunkGenerator; # generator + +# Used in TFStructureStart +public-f net.minecraft.world.level.levelgen.structure.StructureStart + +# Used for leaf and grass colors +public net.minecraft.world.level.biome.Biome f_47435_ # TEMPERATURE_NOISE + +# Used in LegacyStructureFeature +public net.minecraft.world.level.levelgen.structure.pieces.StructurePiecesBuilder f_192778_ # pieces + +# Used in TowerWingComponent +public net.minecraft.world.entity.decoration.Painting m_218891_(Lnet/minecraft/core/Holder;)V # setVariant + +public net.minecraft.world.level.levelgen.feature.treedecorators.TreeDecorator$Context f_226046_ # decorationSetter +public net.minecraft.world.level.chunk.ChunkGenerator m_223138_(Lnet/minecraft/core/Holder;Lnet/minecraft/world/level/levelgen/RandomState;)Ljava/util/List; # getPlacementsForStructure + +public net.minecraft.world.level.block.DispenserBlock f_52661_ # DISPENSER_REGISTRY + +public net.minecraft.client.gui.Gui m_93024_(Lnet/minecraft/world/phys/HitResult;)Z # canRenderCrosshairForSpectator + +# Used in TFMazeMapData (we need to unfinalize x and z so we can snap the map to the labyrinth) +public-f net.minecraft.world.level.saveddata.maps.MapItemSavedData f_256718_ # centerX +public-f net.minecraft.world.level.saveddata.maps.MapItemSavedData f_256789_ # centerZ + +public net.minecraft.world.level.chunk.ChunkGenerator m_223104_(Lnet/minecraft/world/level/levelgen/structure/StructureSet$StructureSelectionEntry;Lnet/minecraft/world/level/StructureManager;Lnet/minecraft/core/RegistryAccess;Lnet/minecraft/world/level/levelgen/RandomState;Lnet/minecraft/world/level/levelgen/structure/templatesystem/StructureTemplateManager;JLnet/minecraft/world/level/chunk/ChunkAccess;Lnet/minecraft/world/level/ChunkPos;Lnet/minecraft/core/SectionPos;)Z # tryGenerateStructure + +public net.minecraft.server.level.ServerLevel m_143288_(Lnet/minecraft/core/BlockPos;)Lnet/minecraft/core/BlockPos; # findLightningTargetAround + +public net.minecraft.world.effect.MobEffectInstance f_19504_ # amplifier + +public net.minecraft.world.level.storage.loot.LootTable m_230924_(Lit/unimi/dsi/fastutil/objects/ObjectArrayList;ILnet/minecraft/util/RandomSource;)V # shuffleAndSplitItems diff --git a/src/main/resources/META-INF/asm/book.js b/src/main/resources/META-INF/asm/book.js new file mode 100644 index 0000000000..0889656922 --- /dev/null +++ b/src/main/resources/META-INF/asm/book.js @@ -0,0 +1,38 @@ +// noinspection ES6ConvertVarToLetConst + +var ASM = Java.type('net.minecraftforge.coremod.api.ASMAPI'); +var Opcodes = Java.type('org.objectweb.asm.Opcodes'); + +var MethodInsnNode = Java.type('org.objectweb.asm.tree.MethodInsnNode'); +var VarInsnNode = Java.type('org.objectweb.asm.tree.VarInsnNode'); + +// noinspection JSUnusedGlobalSymbols +function initializeCoreMod() { + return { + 'book': { + 'target': { + 'type': 'METHOD', + 'class': 'net.minecraft.world.item.WrittenBookItem', + 'methodName': ASM.mapMethod('m_7626_'), + 'methodDesc': '(Lnet/minecraft/world/item/ItemStack;)Lnet/minecraft/network/chat/Component;' + }, + 'transformer': function (/*org.objectweb.asm.tree.MethodNode*/ methodNode) { + var /*org.objectweb.asm.tree.InsnList*/ instructions = methodNode.instructions; + instructions.insertBefore( + ASM.findFirstInstruction(methodNode, Opcodes.ARETURN), + ASM.listOf( + new VarInsnNode(Opcodes.ALOAD, 2), + new MethodInsnNode( + Opcodes.INVOKESTATIC, + 'twilightforest/ASMHooks', + 'book', + '(Lnet/minecraft/network/chat/Component;Lnet/minecraft/nbt/CompoundTag;)Lnet/minecraft/network/chat/Component;', + false + ) + ) + ); + return methodNode; + } + } + } +} diff --git a/src/main/resources/META-INF/asm/conquered.js b/src/main/resources/META-INF/asm/conquered.js new file mode 100644 index 0000000000..c7605da47e --- /dev/null +++ b/src/main/resources/META-INF/asm/conquered.js @@ -0,0 +1,46 @@ +// noinspection ES6ConvertVarToLetConst + +var ASM = Java.type('net.minecraftforge.coremod.api.ASMAPI'); +var Opcodes = Java.type('org.objectweb.asm.Opcodes'); + +var MethodInsnNode = Java.type('org.objectweb.asm.tree.MethodInsnNode'); +var VarInsnNode = Java.type('org.objectweb.asm.tree.VarInsnNode'); + +// noinspection JSUnusedGlobalSymbols +function initializeCoreMod() { + return { + 'conquered': { + 'target': { + 'type': 'METHOD', + 'class': 'net.minecraft.world.level.levelgen.structure.StructureStart', + 'methodName': ASM.mapMethod('m_226857_'), // loadStaticStart + 'methodDesc': '(Lnet/minecraft/world/level/levelgen/structure/pieces/StructurePieceSerializationContext;Lnet/minecraft/nbt/CompoundTag;J)Lnet/minecraft/world/level/levelgen/structure/StructureStart;' + }, + 'transformer': function (/*org.objectweb.asm.tree.MethodNode*/ methodNode) { + var /*org.objectweb.asm.tree.InsnList*/ instructions = methodNode.instructions; + instructions.insert( + ASM.findFirstMethodCall( + methodNode, + ASM.MethodType.SPECIAL, + 'net/minecraft/world/level/levelgen/structure/StructureStart', + '', + '(Lnet/minecraft/world/level/levelgen/structure/Structure;Lnet/minecraft/world/level/ChunkPos;ILnet/minecraft/world/level/levelgen/structure/pieces/PiecesContainer;)V' + ), + ASM.listOf( + new VarInsnNode(Opcodes.ALOAD, 10), + new VarInsnNode(Opcodes.ALOAD, 1), + new MethodInsnNode( + Opcodes.INVOKESTATIC, + 'twilightforest/ASMHooks', + 'conquered', + '(Lnet/minecraft/world/level/levelgen/structure/StructureStart;Lnet/minecraft/world/level/levelgen/structure/pieces/PiecesContainer;Lnet/minecraft/nbt/CompoundTag;)Lnet/minecraft/world/level/levelgen/structure/StructureStart;', + false + ) + ) + ); + return methodNode; + } + } + } +} + diff --git a/src/main/resources/META-INF/asm/foliage.js b/src/main/resources/META-INF/asm/foliage.js new file mode 100644 index 0000000000..cf4e996c22 --- /dev/null +++ b/src/main/resources/META-INF/asm/foliage.js @@ -0,0 +1,40 @@ +// noinspection ES6ConvertVarToLetConst + +var ASM = Java.type('net.minecraftforge.coremod.api.ASMAPI'); +var Opcodes = Java.type('org.objectweb.asm.Opcodes'); + +var MethodInsnNode = Java.type('org.objectweb.asm.tree.MethodInsnNode'); +var VarInsnNode = Java.type('org.objectweb.asm.tree.VarInsnNode'); + +// noinspection JSUnusedGlobalSymbols +function initializeCoreMod() { + return { + 'dragons': { + 'target': { + 'type': 'METHOD', + 'class': 'net.minecraft.client.renderer.BiomeColors', + 'methodName': ASM.mapMethod('m_108807_'), + 'methodDesc': '(Lnet/minecraft/world/level/biome/Biome;DD)I' + }, + 'transformer': function (/*org.objectweb.asm.tree.MethodNode*/ methodNode) { + var /*org.objectweb.asm.tree.InsnList*/ instructions = methodNode.instructions; + instructions.insertBefore( + ASM.findFirstInstruction(methodNode, Opcodes.IRETURN), + ASM.listOf( + new VarInsnNode(Opcodes.ALOAD, 0), + new VarInsnNode(Opcodes.DLOAD, 1), + new VarInsnNode(Opcodes.DLOAD, 3), + new MethodInsnNode( + Opcodes.INVOKESTATIC, + 'twilightforest/ASMHooks', + 'foliage', + '(ILnet/minecraft/world/level/biome/Biome;DD)I', + false + ) + ) + ); + return methodNode; + } + } + } +} diff --git a/src/main/resources/META-INF/asm/maprendercontext.js b/src/main/resources/META-INF/asm/maprendercontext.js new file mode 100644 index 0000000000..ab823ed3eb --- /dev/null +++ b/src/main/resources/META-INF/asm/maprendercontext.js @@ -0,0 +1,202 @@ +// noinspection ES6ConvertVarToLetConst + +var ASM = Java.type('net.minecraftforge.coremod.api.ASMAPI'); +var Opcodes = Java.type('org.objectweb.asm.Opcodes'); + +var VarInsnNode = Java.type('org.objectweb.asm.tree.VarInsnNode'); +var MethodInsnNode = Java.type('org.objectweb.asm.tree.MethodInsnNode'); +var FieldInsnNode = Java.type('org.objectweb.asm.tree.FieldInsnNode'); + +// noinspection JSUnusedGlobalSymbols +function initializeCoreMod() { + return { + 'maprendercontext': { + 'target': { + 'type': 'METHOD', + 'class': 'net.minecraft.client.gui.MapRenderer$MapInstance', + 'methodName': ASM.mapMethod('m_93291_'), + 'methodDesc': '(Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;ZI)V' + }, + 'transformer': function (/*org.objectweb.asm.tree.MethodNode*/ methodNode) { + var /*org.objectweb.asm.tree.InsnList*/ instructions = methodNode.instructions; + instructions.insertBefore( + ASM.findFirstInstruction(methodNode, Opcodes.ISTORE), + ASM.listOf( + new VarInsnNode(Opcodes.ALOAD, 1), + new VarInsnNode(Opcodes.ALOAD, 2), + new VarInsnNode(Opcodes.ILOAD, 4), + new MethodInsnNode( + Opcodes.INVOKESTATIC, + 'twilightforest/ASMHooks', + 'mapRenderContext', + '(Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;I)V', + false + ) + ) + ); + return methodNode; + } + }, + 'render': { + 'target': { + 'type': 'METHOD', + 'class': 'net.minecraft.client.renderer.ItemInHandRenderer', + 'methodName': ASM.mapMethod('m_109371_'), + 'methodDesc': '(Lnet/minecraft/client/player/AbstractClientPlayer;FFLnet/minecraft/world/InteractionHand;FLnet/minecraft/world/item/ItemStack;FLcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;I)V' + }, + 'transformer': function (/*org.objectweb.asm.tree.MethodNode*/ methodNode) { + var /*org.objectweb.asm.tree.InsnList*/ instructions = methodNode.instructions; + var i = -1; + for (var index = instructions.size() - 1; index > 0; index--) { + var /*org.objectweb.asm.tree.FieldInsnNode*/ node = instructions.get(index); + if (i === -1 && + + node instanceof FieldInsnNode && + + node.getOpcode() === Opcodes.GETSTATIC && + + equate(node.owner, 'net/minecraft/world/item/Items') && + + equate(node.name, ASM.mapField('f_42573_')) + + ) + i = index + 1; + + } + + if (i === -1) { + // Must be optifine... Optifine checks for instanceof MapItem, so this patch won't be needed anyway. + return methodNode; + } + + instructions.insert( + instructions.get(i), + ASM.listOf( + new VarInsnNode(Opcodes.ALOAD, 6), + new MethodInsnNode( + Opcodes.INVOKESTATIC, + 'twilightforest/ASMHooks', + 'shouldMapRender', + '(ZLnet/minecraft/world/item/ItemStack;)Z', + false + ) + ) + ); + return methodNode; + } + }, + 'frame': { + 'target': { + 'type': 'METHOD', + 'class': 'net.minecraft.world.entity.decoration.ItemFrame', + 'methodName': ASM.mapMethod('m_218868_'), // getFramedMapId + 'methodDesc': '()Ljava/util/OptionalInt;' + }, + 'transformer': function (/*org.objectweb.asm.tree.MethodNode*/ methodNode) { + var /*org.objectweb.asm.tree.InsnList*/ instructions = methodNode.instructions; + instructions.insertBefore( + ASM.findFirstInstruction(methodNode, Opcodes.IFEQ), + ASM.listOf( + new VarInsnNode(Opcodes.ALOAD, 1), + new MethodInsnNode( + Opcodes.INVOKESTATIC, + 'twilightforest/ASMHooks', + 'shouldMapRender', + '(ZLnet/minecraft/world/item/ItemStack;)Z', + false + ) + ) + ); + return methodNode; + } + }, + 'renderdata': { + 'target': { + 'type': 'METHOD', + 'class': 'net.minecraft.client.renderer.ItemInHandRenderer', + 'methodName': ASM.mapMethod('m_109366_'), + 'methodDesc': '(Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;ILnet/minecraft/world/item/ItemStack;)V' + }, + 'transformer': function (/*org.objectweb.asm.tree.MethodNode*/ methodNode) { + var /*org.objectweb.asm.tree.InsnList*/ instructions = methodNode.instructions; + var insn = null; + for (var index = 0; index < instructions.size() - 1; index++) { + var /*org.objectweb.asm.tree.VarInsnNode*/ node = instructions.get(index); + if (insn == null && + + node instanceof VarInsnNode && + + node.getOpcode() === Opcodes.ASTORE && + + node.var === 6 + + ) + insn = node; + + } + instructions.insertBefore( + insn, + ASM.listOf( + new VarInsnNode(Opcodes.ALOAD, 4), + new VarInsnNode(Opcodes.ALOAD, 0), + new FieldInsnNode(Opcodes.GETFIELD, 'net/minecraft/client/renderer/ItemInHandRenderer', ASM.mapField('f_109299_'), 'Lnet/minecraft/client/Minecraft;'), + new FieldInsnNode(Opcodes.GETFIELD, 'net/minecraft/client/Minecraft', ASM.mapField('f_91073_'), 'Lnet/minecraft/client/multiplayer/ClientLevel;'), + new MethodInsnNode( + Opcodes.INVOKESTATIC, + 'twilightforest/ASMHooks', + 'renderMapData', + '(Lnet/minecraft/world/level/saveddata/maps/MapItemSavedData;Lnet/minecraft/world/item/ItemStack;Lnet/minecraft/world/level/Level;)Lnet/minecraft/world/level/saveddata/maps/MapItemSavedData;', + false + ) + ) + ); + return methodNode; + } + }, + 'iteminfo': { + 'target': { + 'type': 'METHOD', + 'class': 'net.minecraft.world.item.MapItem', + 'methodName': ASM.mapMethod('m_7373_'), + 'methodDesc': '(Lnet/minecraft/world/item/ItemStack;Lnet/minecraft/world/level/Level;Ljava/util/List;Lnet/minecraft/world/item/TooltipFlag;)V' + }, + 'transformer': function (/*org.objectweb.asm.tree.MethodNode*/ methodNode) { + var /*org.objectweb.asm.tree.InsnList*/ instructions = methodNode.instructions; + var insn = null; + for (var index = 0; index < instructions.size() - 1; index++) { + var /*org.objectweb.asm.tree.VarInsnNode*/ node = instructions.get(index); + if (insn == null && + + node instanceof VarInsnNode && + + node.getOpcode() === Opcodes.ASTORE && + + node.var === 6 + + ) + insn = node; + + } + instructions.insertBefore( + insn, + ASM.listOf( + new VarInsnNode(Opcodes.ALOAD, 1), + new VarInsnNode(Opcodes.ALOAD, 2), + new MethodInsnNode( + Opcodes.INVOKESTATIC, + 'twilightforest/ASMHooks', + 'renderMapData', + '(Lnet/minecraft/world/level/saveddata/maps/MapItemSavedData;Lnet/minecraft/world/item/ItemStack;Lnet/minecraft/world/level/Level;)Lnet/minecraft/world/level/saveddata/maps/MapItemSavedData;', + false + ) + ) + ); + return methodNode; + } + } + } +} + +function equate(/*java.lang.Object*/ a, b) { + return a.equals(b); +} diff --git a/src/main/resources/META-INF/asm/mount.js b/src/main/resources/META-INF/asm/mount.js new file mode 100644 index 0000000000..19e1d311e4 --- /dev/null +++ b/src/main/resources/META-INF/asm/mount.js @@ -0,0 +1,81 @@ +// noinspection ES6ConvertVarToLetConst + +var ASM = Java.type('net.minecraftforge.coremod.api.ASMAPI'); +var Opcodes = Java.type('org.objectweb.asm.Opcodes'); + +var MethodInsnNode = Java.type('org.objectweb.asm.tree.MethodInsnNode'); +var FieldInsnNode = Java.type('org.objectweb.asm.tree.FieldInsnNode'); +var VarInsnNode = Java.type('org.objectweb.asm.tree.VarInsnNode'); + +// noinspection JSUnusedGlobalSymbols +function initializeCoreMod() { + return { + 'seed': { + 'target': { + 'type': 'METHOD', + 'class': 'net.minecraft.client.player.LocalPlayer', + 'methodName': ASM.mapMethod('m_6083_'), // rideTick + 'methodDesc': '()V' + }, + 'transformer': function (/*org.objectweb.asm.tree.MethodNode*/ methodNode) { + var /*org.objectweb.asm.tree.InsnList*/ instructions = methodNode.instructions; + instructions.insert( + ASM.findFirstInstruction(methodNode, Opcodes.INVOKESPECIAL), + ASM.listOf( + new VarInsnNode(Opcodes.ALOAD, 0), + new FieldInsnNode( + Opcodes.GETFIELD, + 'net/minecraft/client/player/LocalPlayer', + ASM.mapField('f_108618_'), // input + 'Lnet/minecraft/client/player/Input;' + ), + new VarInsnNode(Opcodes.ALOAD, 0), + new FieldInsnNode( + Opcodes.GETFIELD, + 'net/minecraft/client/player/LocalPlayer', + ASM.mapField('f_108618_'), // input + 'Lnet/minecraft/client/player/Input;' + ), + new FieldInsnNode( + Opcodes.GETFIELD, + 'net/minecraft/client/player/Input', + ASM.mapField('f_108573_'), // shiftKeyDown + 'Z' + ), + new VarInsnNode(Opcodes.ALOAD, 0), + new MethodInsnNode( + Opcodes.INVOKEVIRTUAL, + 'net/minecraft/world/entity/player/Player', + ASM.mapMethod('m_36342_'), // wantsToStopRiding + '()Z', + false + ), + new VarInsnNode(Opcodes.ALOAD, 0), + new MethodInsnNode( + Opcodes.INVOKEVIRTUAL, + 'net/minecraft/world/entity/Entity', + ASM.mapMethod('m_20159_'), // isPassenger + '()Z', + false + ), + new MethodInsnNode( + Opcodes.INVOKESTATIC, + 'twilightforest/ASMHooks', + 'mountFix', + '(ZZZ)Z', + false + ), + new FieldInsnNode( + Opcodes.PUTFIELD, + 'net/minecraft/client/player/Input', + ASM.mapField('f_108573_'), // shiftKeyDown + 'Z' + ) + ) + ); + return methodNode; + } + } + } +} + diff --git a/src/main/resources/META-INF/asm/multipart.js b/src/main/resources/META-INF/asm/multipart.js new file mode 100644 index 0000000000..059650b3fb --- /dev/null +++ b/src/main/resources/META-INF/asm/multipart.js @@ -0,0 +1,147 @@ +// noinspection ES6ConvertVarToLetConst + +var ASM = Java.type('net.minecraftforge.coremod.api.ASMAPI'); +var Opcodes = Java.type('org.objectweb.asm.Opcodes'); + +var MethodInsnNode = Java.type('org.objectweb.asm.tree.MethodInsnNode'); +var VarInsnNode = Java.type('org.objectweb.asm.tree.VarInsnNode') +var InsnNode = Java.type('org.objectweb.asm.tree.InsnNode') + +// noinspection JSUnusedGlobalSymbols +function initializeCoreMod() { + return { + 'sync': { + 'target': { + 'type': 'METHOD', + 'class': 'net.minecraft.server.level.ServerEntity', + 'methodName': ASM.mapMethod('m_8543_'), + 'methodDesc': '()V' + }, + 'transformer': function (/*org.objectweb.asm.tree.MethodNode*/ methodNode) { + var /*org.objectweb.asm.tree.InsnList*/ instructions = methodNode.instructions; + instructions.insert( + ASM.findFirstInstruction(methodNode, Opcodes.GETFIELD), + ASM.listOf( + new MethodInsnNode( + Opcodes.INVOKESTATIC, + 'twilightforest/ASMHooks', + 'updateMultiparts', + '(Lnet/minecraft/world/entity/Entity;)Lnet/minecraft/world/entity/Entity;', + false + ) + ) + ); + return methodNode; + } + }, + 'bake': { + 'target': { + 'type': 'METHOD', + 'class': 'net.minecraft.client.renderer.entity.EntityRenderDispatcher', + 'methodName': ASM.mapMethod('m_6213_'), + 'methodDesc': '(Lnet/minecraft/server/packs/resources/ResourceManager;)V' + }, + 'transformer': function (/*org.objectweb.asm.tree.MethodNode*/ methodNode) { + var /*org.objectweb.asm.tree.InsnList*/ instructions = methodNode.instructions; + instructions.insert( + ASM.findFirstInstruction(methodNode, Opcodes.INVOKESPECIAL), + ASM.listOf( + new MethodInsnNode( + Opcodes.INVOKESTATIC, + 'twilightforest/ASMHooks', + 'bakeMultipartRenders', + '(Lnet/minecraft/client/renderer/entity/EntityRendererProvider$Context;)Lnet/minecraft/client/renderer/entity/EntityRendererProvider$Context;', + false + ) + ) + ); + return methodNode; + } + }, + 'renderer': { + 'target': { + 'type': 'METHOD', + 'class': 'net.minecraft.client.renderer.entity.EntityRenderDispatcher', + 'methodName': ASM.mapMethod('m_114382_'), + 'methodDesc': '(Lnet/minecraft/world/entity/Entity;)Lnet/minecraft/client/renderer/entity/EntityRenderer;' + }, + 'transformer': function (/*org.objectweb.asm.tree.MethodNode*/ methodNode) { + var /*org.objectweb.asm.tree.InsnList*/ instructions = methodNode.instructions; + var lastInstruction = null; + for (var index = instructions.size() - 1; index > 0; index--) { + var /*org.objectweb.asm.tree.AbstractInsnNode*/ node = instructions.get(index); + if (lastInstruction == null && + + node instanceof InsnNode && + + node.getOpcode() === Opcodes.ARETURN + + ) + lastInstruction = node; + + } + instructions.insertBefore( + lastInstruction, + ASM.listOf( + new VarInsnNode(Opcodes.ALOAD, 1), + new MethodInsnNode( + Opcodes.INVOKESTATIC, + 'twilightforest/ASMHooks', + 'getMultipartRenderer', + '(Lnet/minecraft/client/renderer/entity/EntityRenderer;Lnet/minecraft/world/entity/Entity;)Lnet/minecraft/client/renderer/entity/EntityRenderer;', + false + ) + ) + ); + return methodNode; + } + }, + 'render': { + 'target': { + 'type': 'METHOD', + 'class': 'net.minecraft.client.renderer.LevelRenderer', + 'methodName': ASM.mapMethod('m_109599_'), + 'methodDesc': '(Lcom/mojang/blaze3d/vertex/PoseStack;FJZLnet/minecraft/client/Camera;Lnet/minecraft/client/renderer/GameRenderer;Lnet/minecraft/client/renderer/LightTexture;Lorg/joml/Matrix4f;)V' + }, + 'transformer': function (/*org.objectweb.asm.tree.MethodNode*/ methodNode) { + var /*org.objectweb.asm.tree.InsnList*/ instructions = methodNode.instructions; + var lastInstruction = null; + for (var index = instructions.size() - 1; index > 0; index--) { + var /*org.objectweb.asm.tree.MethodInsnNode*/ node = instructions.get(index); + if (lastInstruction == null && + + node instanceof MethodInsnNode && + + node.getOpcode() === Opcodes.INVOKEVIRTUAL && + + equate(node.owner, 'net/minecraft/client/multiplayer/ClientLevel') && + + equate(node.name, ASM.mapMethod('m_104735_')) && + + equate(node.desc, '()Ljava/lang/Iterable;') + + ) + lastInstruction = node; + + } + instructions.insert( + lastInstruction, + ASM.listOf( + new MethodInsnNode( + Opcodes.INVOKESTATIC, + 'twilightforest/ASMHooks', + 'renderMutiparts', + '(Ljava/lang/Iterable;)Ljava/lang/Iterable;', + false + ) + ) + ); + return methodNode; + } + } + } +} + +function equate(/*java.lang.Object*/ a, b) { + return a.equals(b); +} diff --git a/src/main/resources/META-INF/asm/music.js b/src/main/resources/META-INF/asm/music.js new file mode 100644 index 0000000000..5817d4c1b2 --- /dev/null +++ b/src/main/resources/META-INF/asm/music.js @@ -0,0 +1,36 @@ +// noinspection ES6ConvertVarToLetConst + +var ASM = Java.type('net.minecraftforge.coremod.api.ASMAPI'); +var Opcodes = Java.type('org.objectweb.asm.Opcodes'); + +var MethodInsnNode = Java.type('org.objectweb.asm.tree.MethodInsnNode'); + +// noinspection JSUnusedGlobalSymbols +function initializeCoreMod() { + return { + 'music': { + 'target': { + 'type': 'METHOD', + 'class': 'net.minecraft.client.sounds.MusicManager', + 'methodName': ASM.mapMethod('m_120183_'), + 'methodDesc': '()V' + }, + 'transformer': function (/*org.objectweb.asm.tree.MethodNode*/ methodNode) { + var /*org.objectweb.asm.tree.InsnList*/ instructions = methodNode.instructions; + instructions.insert( + ASM.findFirstInstruction(methodNode, Opcodes.INVOKEVIRTUAL), + ASM.listOf( + new MethodInsnNode( + Opcodes.INVOKESTATIC, + 'twilightforest/ASMHooks', + 'music', + '(Lnet/minecraft/sounds/Music;)Lnet/minecraft/sounds/Music;', + false + ) + ) + ); + return methodNode; + } + } + } +} diff --git a/src/main/resources/META-INF/asm/reach.js b/src/main/resources/META-INF/asm/reach.js new file mode 100644 index 0000000000..ebc4ef15c2 --- /dev/null +++ b/src/main/resources/META-INF/asm/reach.js @@ -0,0 +1,41 @@ +// noinspection ES6ConvertVarToLetConst + +var ASM = Java.type('net.minecraftforge.coremod.api.ASMAPI'); +var Opcodes = Java.type('org.objectweb.asm.Opcodes'); + +var MethodInsnNode = Java.type('org.objectweb.asm.tree.MethodInsnNode'); +var VarInsnNode = Java.type('org.objectweb.asm.tree.VarInsnNode'); + +// noinspection JSUnusedGlobalSymbols +function initializeCoreMod() { + return { + 'reach': { + 'target': { + 'type': 'METHOD', + 'class': 'net.minecraft.world.item.Item', + 'methodName': ASM.mapMethod('m_41435_'), + 'methodDesc': '(Lnet/minecraft/world/level/Level;Lnet/minecraft/world/entity/player/Player;Lnet/minecraft/world/level/ClipContext$Fluid;)Lnet/minecraft/world/phys/BlockHitResult;' + }, + 'transformer': function (/*org.objectweb.asm.tree.MethodNode*/ methodNode) { + var /*org.objectweb.asm.tree.InsnList*/ instructions = methodNode.instructions; + instructions.insertBefore( + ASM.findFirstInstruction(methodNode, Opcodes.ARETURN), + ASM.listOf( + new VarInsnNode(Opcodes.ALOAD, 0), + new VarInsnNode(Opcodes.ALOAD, 1), + new VarInsnNode(Opcodes.ALOAD, 2), + new MethodInsnNode( + Opcodes.INVOKESTATIC, + 'twilightforest/ASMHooks', + 'reach', + '(Lnet/minecraft/world/phys/BlockHitResult;Lnet/minecraft/world/level/Level;Lnet/minecraft/world/entity/player/Player;Lnet/minecraft/world/level/ClipContext$Fluid;)Lnet/minecraft/world/phys/BlockHitResult;', + false + ) + ) + ); + return methodNode; + } + } + } +} + diff --git a/src/main/resources/META-INF/asm/seed.js b/src/main/resources/META-INF/asm/seed.js new file mode 100644 index 0000000000..7e63c15e3f --- /dev/null +++ b/src/main/resources/META-INF/asm/seed.js @@ -0,0 +1,37 @@ +// noinspection ES6ConvertVarToLetConst + +var ASM = Java.type('net.minecraftforge.coremod.api.ASMAPI'); +var Opcodes = Java.type('org.objectweb.asm.Opcodes'); + +var MethodInsnNode = Java.type('org.objectweb.asm.tree.MethodInsnNode'); + +// noinspection JSUnusedGlobalSymbols +function initializeCoreMod() { + return { + 'seed': { + 'target': { + 'type': 'METHOD', + 'class': 'net.minecraft.world.level.levelgen.WorldOptions', + 'methodName': '', + 'methodDesc': '(JZZLjava/util/Optional;)V' + }, + 'transformer': function (/*org.objectweb.asm.tree.MethodNode*/ methodNode) { + var /*org.objectweb.asm.tree.InsnList*/ instructions = methodNode.instructions; + instructions.insertBefore( + ASM.findFirstInstruction(methodNode, Opcodes.PUTFIELD), + ASM.listOf( + new MethodInsnNode( + Opcodes.INVOKESTATIC, + 'twilightforest/ASMHooks', + 'seed', + '(J)J', + false + ) + ) + ); + return methodNode; + } + } + } +} + diff --git a/src/main/resources/META-INF/asm/shroom.js b/src/main/resources/META-INF/asm/shroom.js new file mode 100644 index 0000000000..980beab765 --- /dev/null +++ b/src/main/resources/META-INF/asm/shroom.js @@ -0,0 +1,46 @@ +// noinspection ES6ConvertVarToLetConst + +var ASM = Java.type('net.minecraftforge.coremod.api.ASMAPI'); +var Opcodes = Java.type('org.objectweb.asm.Opcodes'); + +var MethodInsnNode = Java.type('org.objectweb.asm.tree.MethodInsnNode'); +var VarInsnNode = Java.type('org.objectweb.asm.tree.VarInsnNode'); + +// noinspection JSUnusedGlobalSymbols +function initializeCoreMod() { + return { + 'shroom': { + 'target': { + 'type': 'METHOD', + 'class': 'net.minecraft.world.level.block.MushroomBlock', + 'methodName': ASM.mapMethod('m_7898_'), // canSurvive + 'methodDesc': '(Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/LevelReader;Lnet/minecraft/core/BlockPos;)Z' + }, + 'transformer': function (/*org.objectweb.asm.tree.MethodNode*/ methodNode) { + var /*org.objectweb.asm.tree.InsnList*/ instructions = methodNode.instructions; + instructions.insert( + ASM.findFirstMethodCall( + methodNode, + ASM.MethodType.INTERFACE, + 'net/minecraft/world/level/LevelReader', + ASM.mapMethod('m_45524_'), // getRawBrightness + '(Lnet/minecraft/core/BlockPos;I)I' + ), + ASM.listOf( + new VarInsnNode(Opcodes.ALOAD, 2), + new VarInsnNode(Opcodes.ALOAD, 3), + new MethodInsnNode( + Opcodes.INVOKESTATIC, + 'twilightforest/ASMHooks', + 'shroom', + '(ILnet/minecraft/world/level/LevelReader;Lnet/minecraft/core/BlockPos;)I', + false + ) + ) + ); + return methodNode; + } + } + } +} + diff --git a/src/main/resources/META-INF/coremods.json b/src/main/resources/META-INF/coremods.json new file mode 100644 index 0000000000..7602a57c2b --- /dev/null +++ b/src/main/resources/META-INF/coremods.json @@ -0,0 +1,12 @@ +{ + "seed": "META-INF/asm/seed.js", + "maprendercontext": "META-INF/asm/maprendercontext.js", + "music": "META-INF/asm/music.js", + "multipart": "META-INF/asm/multipart.js", + "foliage": "META-INF/asm/foliage.js", + "mount": "META-INF/asm/mount.js", + "book": "META-INF/asm/book.js", + "conquered": "META-INF/asm/conquered.js", + "reach": "META-INF/asm/reach.js", + "shroom": "META-INF/asm/shroom.js" +} \ No newline at end of file diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml new file mode 100644 index 0000000000..afdd52fccb --- /dev/null +++ b/src/main/resources/META-INF/mods.toml @@ -0,0 +1,34 @@ +modLoader="javafml" +loaderVersion="[45,)" +issueTrackerURL="https://github.com/TeamTwilight/twilightforest/issues" +license="GNU LESSER GENERAL PUBLIC LICENSE Version 2.1" + +[[mods]] +modId="twilightforest" +version="${file.jarVersion}" +displayName="The Twilight Forest" +itemIcon="twilightforest:twilight_portal_miniature_structure" +displayURL="https://www.curseforge.com/minecraft/mc-mods/the-twilight-forest" +updateJSONURL="https://gh.tamaized.com/TeamTwilight/twilightforest/update.json" +logoFile="twilightforest_logo.png" +credits="By Benimatic (Ben Mazur)" +authors="Benimatic, AtomicBlom, Drullkus, Killer_Demon, quadraxis, Tamaized, williewillus, Andromander, GizmoTheMoonPig, Jodlodi" +description=''' +An enchanted forest dimension.''' + +[[dependencies.twilightforest]] + modId="forge" + mandatory=true + versionRange="[45.0.39,)" + ordering="NONE" + side="BOTH" + +[[dependencies.twilightforest]] + modId="minecraft" + mandatory=true + versionRange="[1.19.4]" + ordering="NONE" + side="BOTH" + +[modproperties.twilightforest] + configuredBackground="twilightforest:textures/block/mazestone_large_brick.png" \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/af_za.json b/src/main/resources/assets/twilightforest/lang/af_za.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/af_za.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/ar_sa.json b/src/main/resources/assets/twilightforest/lang/ar_sa.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/ar_sa.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/ast_es.json b/src/main/resources/assets/twilightforest/lang/ast_es.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/ast_es.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/az_az.json b/src/main/resources/assets/twilightforest/lang/az_az.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/az_az.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/ba_ru.json b/src/main/resources/assets/twilightforest/lang/ba_ru.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/ba_ru.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/be_by.json b/src/main/resources/assets/twilightforest/lang/be_by.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/be_by.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/bg_bg.json b/src/main/resources/assets/twilightforest/lang/bg_bg.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/bg_bg.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/br_fr.json b/src/main/resources/assets/twilightforest/lang/br_fr.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/br_fr.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/bs_ba.json b/src/main/resources/assets/twilightforest/lang/bs_ba.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/bs_ba.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/ca_es.json b/src/main/resources/assets/twilightforest/lang/ca_es.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/ca_es.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/cs_cz.json b/src/main/resources/assets/twilightforest/lang/cs_cz.json new file mode 100644 index 0000000000..760516ef49 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/cs_cz.json @@ -0,0 +1,595 @@ +{ + "advancement.twilightforest.arborist": "Maniakální Dendrolog", + "advancement.twilightforest.arborist.desc": "Připravte si svoje sekery a nůžky. Prohledejte každou skulinu a získejte cokoliv co jde ze stromů! Vyrobte, ulupte, získejte každý půlblok... sazenici... listí... víc... ještě víc. ÚPLNĚ VŠECHNO!", + "advancement.twilightforest.arctic_dyed": "Dostávám se do módy", + "advancement.twilightforest.arctic_dyed.desc": "Nabarvěte čtyři unikátní díly Arktického brnění", + "advancement.twilightforest.beanstalk": "Honza a fazolový stonek", + "advancement.twilightforest.beanstalk.desc": "Získejte nějaké %s v trollích jeskyních a použijte jej na svítící půdu pod mraky", + "advancement.twilightforest.experiment_115": "Tajemné maso?", + "advancement.twilightforest.experiment_115.desc": "Vypadá to však jako koláč...", + "advancement.twilightforest.experiment_115_2": "Vytváření poznámky: Obrovský úspěch!", + "advancement.twilightforest.experiment_115_2.desc": "Je to tak chutné a vlhké!", + "advancement.twilightforest.experiment_115_3": "Jím 115 každý den, 115 let, navždy", + "advancement.twilightforest.experiment_115_3.desc": "jezení experimentu sto patnáct celý den, navždy, sto patnáct krát experiment sto patnáct, experiment sto patnáct tečka com, vé vé vé tečka experiment sto patnáct tečka com, sto patnáct let, každá minuta experiment stop patnáct tečka com, vé vé vé tečka sto patnáct krát experiment stop patnáct tečka com", + "advancement.twilightforest.fiery_set": "Galony krve a slzy", + "advancement.twilightforest.fiery_set.desc": "Drž ohnivý nástroj nebo zbraň zatímco máš alespoň jeden kus ohnivého brnění ve svém inventáři", + "advancement.twilightforest.full_mettle_alchemist.desc": "Vypij čtyři dávky Zranění II z lektvarové baňky za méně než 8 sekund a přežij", + "advancement.twilightforest.ghast_trap.desc": "Zabij %s kolem %s a aktivuj pro vyklizení %s z nebe!", + "advancement.twilightforest.giants": "Jsem na oblaku devět", + "advancement.twilightforest.giants.desc": "Zabij %s v oblacích, získej %s, a vrať se zpátky do trolích jeskyní", + "advancement.twilightforest.glass_sword": "Div jednoho trefení", + "advancement.twilightforest.glass_sword.desc": "Doufáme, že jsi to dobře využil.", + "advancement.twilightforest.hedge": "Šlapač hmyzu", + "advancement.twilightforest.hill1": "Ty boty jsou moje!", + "advancement.twilightforest.hill2": "Co to bylo za zvuk?", + "advancement.twilightforest.hill3": "Vidím přes tebe", + "advancement.twilightforest.hydra_chop": "Hydří kotleta, hurá!", + "advancement.twilightforest.kill_cicada": "Ticho", + "advancement.twilightforest.kill_cicada.desc": "Zabij cikádu", + "advancement.twilightforest.kill_hydra": "Zabiják hydry", + "advancement.twilightforest.kill_lich": "Vydej své mrtvé", + "advancement.twilightforest.kill_naga": "Čas pro vyrovnání vah", + "advancement.twilightforest.lich_scepters.desc": "Získej všechy čtyři žezla moci", + "advancement.twilightforest.magic_map": "Můžu vidět navždy", + "advancement.twilightforest.magic_map.desc": "Vyrob %s", + "advancement.twilightforest.magic_map_focus": "S ohněm to píše", + "advancement.twilightforest.magic_map_focus.desc": "Vyrob %s s %s, %s, a %s", + "advancement.twilightforest.maze_map": "A teď, najít východ", + "advancement.twilightforest.mazebreaker": "Prolomení bludiště", + "advancement.twilightforest.naga_armors": "Platnéř nagy", + "advancement.twilightforest.naga_armors.desc": "Vyrob %s brnění a kalhoty", + "advancement.twilightforest.ore_map": "Jak to může stát za to?", + "advancement.twilightforest.ore_map.desc": "Vyrob %s", + "advancement.twilightforest.progress_glacier": "Jasné nebe", + "advancement.twilightforest.progress_labyrinth": "Silný Stroganov", + "advancement.twilightforest.progress_merge": "Ultimátní zůčtování", + "advancement.twilightforest.progress_troll": "Přeju si více hoření", + "advancement.twilightforest.progress_ur_ghast": "Slzy ohně", + "advancement.twilightforest.progress_yeti": "Alfa srst", + "advancement.twilightforest.quest_ram": "Naplnit bečení", + "advancement.twilightforest.troll": "Uděláme trochu trollení", + "advancement.twilightforest.troll.desc": "Najdi a zabij %s", + "advancement.twilightforest.twilight_dining": "Večeříme na večném západu slunce", + "advancement.twilightforest.twilight_hunter": "Ticho lesa", + "biome.twilightforest.clearing": "Twilightová mýtina", + "biome.twilightforest.dark_forest": "Temný les", + "biome.twilightforest.dark_forest_center": "Střed tmavého lesa", + "biome.twilightforest.dense_forest": "Hustý les", + "biome.twilightforest.dense_mushroom_forest": "Hustý houbový les", + "biome.twilightforest.enchanted_forest": "Čarovný les", + "biome.twilightforest.final_plateau": "Konečná plošina", + "biome.twilightforest.fire_swamp": "Ohnivá bažina", + "biome.twilightforest.firefly_forest": "Světluškový les", + "biome.twilightforest.forest": "Twilightový les", + "biome.twilightforest.glacier": "Twilightový ledovec", + "biome.twilightforest.highlands": "Twilightová vysočina", + "biome.twilightforest.lake": "Twilightové jezero", + "biome.twilightforest.mushroom_forest": "Houbový les", + "biome.twilightforest.oak_savannah": "Dubová savana", + "biome.twilightforest.snowy_forest": "Zasněžený les", + "biome.twilightforest.spooky_forest": "Strašidelný les", + "biome.twilightforest.stream": "Twilightový potok", + "biome.twilightforest.swamp": "Twilightová bažina", + "biome.twilightforest.thornlands": "Trnová země", + "biome.twilightforest.underground": "Podzemí", + "block.twilightforest.alpha_yeti_trophy": "Trofej alfa Yetiho", + "block.twilightforest.antibuilder": "Antistavěč", + "block.twilightforest.arctic_fur_block": "Blok arktické srsti", + "block.twilightforest.arctic_fur_block.desc": "Sníží poškození pádem o 90%", + "block.twilightforest.beanstalk_leaves": "Listy fazolového stonku", + "block.twilightforest.blue_castle_door": "Modré hradní dveře", + "block.twilightforest.blue_castle_rune_brick": "Modré hradní runové cihly", + "block.twilightforest.blue_force_field": "Modré silové pole", + "block.twilightforest.brown_thorns": "Trní", + "block.twilightforest.built_block": "Stavěný blok", + "block.twilightforest.burnt_thorns": "Spálené trní", + "block.twilightforest.canopy_bookshelf": "Klenbová knihovna", + "block.twilightforest.canopy_button": "Tlačítko z klenbového dřeva", + "block.twilightforest.canopy_chest": "Klenbová truhla", + "block.twilightforest.canopy_door": "Dveře z klenbového dřeva", + "block.twilightforest.canopy_fence": "Plot z klenbového dřeva", + "block.twilightforest.canopy_fence_gate": "Branka z klenbového dřeva", + "block.twilightforest.canopy_leaves": "Listy klenbového stromu", + "block.twilightforest.canopy_log": "Kmen klenbového stromu", + "block.twilightforest.canopy_planks": "Klenbová prkna", + "block.twilightforest.canopy_pressure_plate": "Nášlapná deska z klenbového dřeva", + "block.twilightforest.canopy_sapling": "Sazenice klenbovitého stromu", + "block.twilightforest.canopy_sign": "Cedule z klenbového dřeva", + "block.twilightforest.canopy_slab": "Půlblok klenbového dřeva", + "block.twilightforest.canopy_stairs": "Schody z klenbového dřeva", + "block.twilightforest.canopy_trapdoor": "Padací dveře z klenbového dřeva", + "block.twilightforest.canopy_wall_sign": "Nástěnná cedule z klenbového dřeva", + "block.twilightforest.canopy_wood": "Dřevo klenbového stromu", + "block.twilightforest.carminite_block": "Karminitový blok", + "block.twilightforest.carminite_builder": "Karminitový stavitel", + "block.twilightforest.carminite_reactor": "Karminitový reaktor", + "block.twilightforest.casket.locked": "Tato rakev muže být otevřena pouze pomocí %s!", + "block.twilightforest.castle_brick": "Hradní cihla", + "block.twilightforest.castle_brick_stairs": "Schody z hradních cihel", + "block.twilightforest.castle_roof_tile": "Hradní střešní taška", + "block.twilightforest.cicada": "Cikáda", + "block.twilightforest.cicada_jar": "Sklenička s cikádou", + "block.twilightforest.cinder_furnace": "Škvárová pec", + "block.twilightforest.cinder_log": "Škvárový kmen", + "block.twilightforest.cinder_wood": "Škvárové dřevo", + "block.twilightforest.clover_patch": "Jetelový porost", + "block.twilightforest.cracked_castle_brick": "Popraskaná hradní cihla", + "block.twilightforest.cracked_castle_brick_stairs": "Schody z popraskaných hradních cihel", + "block.twilightforest.cracked_deadrock": "Popraskaný mrtvý kámen", + "block.twilightforest.cracked_mazestone": "Popraskaná cihla bludištního kamene", + "block.twilightforest.cracked_underbrick": "Popraskaná podcihla", + "block.twilightforest.creeper_skull_candle": "Svička z lebky syčáka", + "block.twilightforest.cut_mazestone": "Řezaný bludištní kámen", + "block.twilightforest.dark_button": "Tlačítko z tmavého dřeva", + "block.twilightforest.dark_door": "Dveře z tmavého dřeva", + "block.twilightforest.dark_fence": "Plot z tmavého stromu", + "block.twilightforest.dark_fence_gate": "Branka z tmavého stromu", + "block.twilightforest.dark_leaves": "Listy tmavého stromu", + "block.twilightforest.dark_log": "Tmavý kmen", + "block.twilightforest.dark_planks": "Prkna tmavého stromu", + "block.twilightforest.dark_pressure_plate": "Nášlapná deska z tmavého dřeva", + "block.twilightforest.dark_slab": "Půlblok tmavého dřeva", + "block.twilightforest.dark_stairs": "Tmavé dřevené schody", + "block.twilightforest.dark_trapdoor": "Padací dveře z tmavého dřeva", + "block.twilightforest.darkwood_sapling": "Sazenice tmavého stromu", + "block.twilightforest.deadrock": "Mrtvá skála", + "block.twilightforest.decorative_mazestone": "Okrasná cihla bludištního kamene", + "block.twilightforest.empty_canopy_bookshelf": "Prázdná klenbová knihovna", + "block.twilightforest.encased_fire_jet": "Zapouzdřená ohnivá tryska", + "block.twilightforest.encased_smoker": "Zapouzdřený kuřák", + "block.twilightforest.fallen_leaves": "Opadlé listí", + "block.twilightforest.fiery_block": "Blok ohnivého kovu", + "block.twilightforest.fire_jet": "Ohnivá tryska", + "block.twilightforest.firefly": "Světluška", + "block.twilightforest.firefly_jar": "Sklenička se světluškou", + "block.twilightforest.firefly_particle_spawner": "Líheň částic světlušek", + "block.twilightforest.fluffy_cloud": "Načechraný oblak", + "block.twilightforest.ghast_trap": "Ďasová past", + "block.twilightforest.giant_cobblestone": "Obrovské kamení", + "block.twilightforest.giant_leaves": "Obrovské listy", + "block.twilightforest.giant_log": "Obrovský kmen", + "block.twilightforest.giant_obsidian": "Obrovský obsidián", + "block.twilightforest.green_force_field": "Zelené silové pole", + "block.twilightforest.green_thorns": "Zelené trní", + "block.twilightforest.hardened_dark_leaves": "Silné listy tmavého stromu", + "block.twilightforest.hedge": "Živý plot", + "block.twilightforest.hollow_acacia_log_climbable": "Dutý akáciový kmen", + "block.twilightforest.hollow_acacia_log_horizontal": "Dutý akáciový kmen", + "block.twilightforest.hollow_acacia_log_vertical": "Dutý akáciový kmen", + "block.twilightforest.hollow_birch_log_climbable": "Dutý březový kmen", + "block.twilightforest.hollow_birch_log_horizontal": "Dutý březový kmen", + "block.twilightforest.hollow_birch_log_vertical": "Dutý březový kmen", + "block.twilightforest.hollow_crimson_stem_climbable": "Dutý karmínový třeň", + "block.twilightforest.hollow_crimson_stem_horizontal": "Dutý karmínový třeň", + "block.twilightforest.hollow_crimson_stem_vertical": "Dutý karmínový třeň", + "block.twilightforest.hollow_dark_log_climbable": "Dutý tmavý kmen", + "block.twilightforest.hollow_dark_log_horizontal": "Dutý tmavý kmen", + "block.twilightforest.hollow_dark_log_vertical": "Dutý tmavý kmen", + "block.twilightforest.hollow_dark_oak_log_climbable": "Dutý kmen tmavého dubu", + "block.twilightforest.hollow_dark_oak_log_horizontal": "Dutý kmen tmavého dubu", + "block.twilightforest.hollow_dark_oak_log_vertical": "Dutý kmen tmavého dubu", + "block.twilightforest.hollow_jungle_log_climbable": "Dutý kmen tropického stromu", + "block.twilightforest.hollow_jungle_log_horizontal": "Dutý kmen tropického stromu", + "block.twilightforest.hollow_jungle_log_vertical": "Dutý kmen tropického stromu", + "block.twilightforest.hollow_mangrove_log_climbable": "Dutý mangrovový kmen", + "block.twilightforest.hollow_mangrove_log_horizontal": "Dutý mangrovový kmen", + "block.twilightforest.hollow_mangrove_log_vertical": "Dutý mangrovový kmen", + "block.twilightforest.hollow_mining_log_climbable": "Dutý kmen hornického stromu", + "block.twilightforest.hollow_mining_log_horizontal": "Dutý kmen hornického stromu", + "block.twilightforest.hollow_mining_log_vertical": "Dutý kmen hornického stromu", + "block.twilightforest.hollow_oak_log_climbable": "Dutý dubový kmen", + "block.twilightforest.hollow_oak_log_horizontal": "Dutý dubový kmen", + "block.twilightforest.hollow_oak_log_vertical": "Dutý dubový kmen", + "block.twilightforest.hollow_oak_sapling": "Sazenice silného twilightového dubu", + "block.twilightforest.hollow_sorting_log_climbable": "Dutý kmen třídícího stromu", + "block.twilightforest.hollow_sorting_log_horizontal": "Dutý kmen třídícího stromu", + "block.twilightforest.hollow_sorting_log_vertical": "Dutý kmen třídícího stromu", + "block.twilightforest.hollow_spruce_log_climbable": "Dutý smrkový kmen", + "block.twilightforest.hollow_spruce_log_horizontal": "Dutý smrkový kmen", + "block.twilightforest.hollow_spruce_log_vertical": "Dutý smrkový kmen", + "block.twilightforest.hollow_time_log_climbable": "Dutý kmen stromu časů", + "block.twilightforest.hollow_time_log_horizontal": "Dutý kmen stromu časů", + "block.twilightforest.hollow_time_log_vertical": "Dutý kmen stromu časů", + "block.twilightforest.hollow_transformation_log_climbable": "Dutý kmen stromu transformace", + "block.twilightforest.hollow_transformation_log_horizontal": "Dutý kmen stromu transformace", + "block.twilightforest.hollow_transformation_log_vertical": "Dutý kmen stromu transformace", + "block.twilightforest.hollow_twilight_oak_log_climbable": "Dutý kmen twilightového dubu", + "block.twilightforest.hollow_twilight_oak_log_horizontal": "Dutý kmen twilightového dubu", + "block.twilightforest.hollow_twilight_oak_log_vertical": "Dutý kmen twilightového dubu", + "block.twilightforest.hollow_vangrove_log_climbable": "Dutý mangrovový kmen", + "block.twilightforest.hollow_vangrove_log_horizontal": "Dutý mangrovový kmen", + "block.twilightforest.hollow_vangrove_log_vertical": "Dutý mangrovový kmen", + "block.twilightforest.hollow_warped_stem_climbable": "Dutý přízračný třeň", + "block.twilightforest.hollow_warped_stem_horizontal": "Dutý přízračný třeň", + "block.twilightforest.hollow_warped_stem_vertical": "Dutý přízračný třeň", + "block.twilightforest.huge_lily_pad": "Velký leknín", + "block.twilightforest.huge_stalk": "Velký stonek", + "block.twilightforest.huge_water_lily": "Velký květ leknínu", + "block.twilightforest.hydra_boss_spawner": "Spawner hydry", + "block.twilightforest.hydra_trophy": "Trofej hydry", + "block.twilightforest.iron_ladder": "Železný žebřík", + "block.twilightforest.ironwood_block": "Blok železného dřeva", + "block.twilightforest.knight_phantom_trophy": "Trofej rytířského fantoma", + "block.twilightforest.lich_boss_spawner": "Lichův spawner", + "block.twilightforest.lich_tower_miniature_structure": "Miniaturní lichova věž", + "block.twilightforest.lich_trophy": "Trofej licha", + "block.twilightforest.liveroot_block": "Živé kořeny", + "block.twilightforest.locked_vanishing_block": "Uzamčený mizející blok", + "block.twilightforest.mangrove_button": "Mangrovové tlačítko", + "block.twilightforest.mangrove_chest": "Mangrovová truhla", + "block.twilightforest.mangrove_door": "Mangrovové dveře", + "block.twilightforest.mangrove_fence": "Mangrovový plot", + "block.twilightforest.mangrove_fence_gate": "Mangrovová branka", + "block.twilightforest.mangrove_leaves": "Listy mangrovu", + "block.twilightforest.mangrove_log": "Mangrovový kmen", + "block.twilightforest.mangrove_planks": "Mangrovová prkna", + "block.twilightforest.mangrove_pressure_plate": "Mangrovová nášlapná deska", + "block.twilightforest.mangrove_root": "Mangrovové kořeny", + "block.twilightforest.mangrove_sapling": "Sazenice mangrovu", + "block.twilightforest.mangrove_sign": "Mangrovová cedule", + "block.twilightforest.mangrove_slab": "Mangrovový půlblok", + "block.twilightforest.mangrove_stairs": "Mangrovové schody", + "block.twilightforest.mangrove_trapdoor": "Mangrovové padací dveře", + "block.twilightforest.mangrove_wall_sign": "Mangrovová nástěnná cedule", + "block.twilightforest.mangrove_wood": "Mangrovové dřevo", + "block.twilightforest.mazestone": "Bludištní kámen", + "block.twilightforest.mazestone_border": "Okraj bludištního kamene", + "block.twilightforest.mazestone_brick": "Cihly bludištního kamene", + "block.twilightforest.mazestone_mosaic": "Mozaika bludištního kamene", + "block.twilightforest.mining_button": "Tlačítko z hornického dřeva", + "block.twilightforest.mining_chest": "Truhla z hornického dřeva", + "block.twilightforest.mining_door": "Dveře z hornického dřeva", + "block.twilightforest.mining_fence": "Plot z hornického dřeva", + "block.twilightforest.mining_fence_gate": "Branka z hornického dřeva", + "block.twilightforest.mining_leaves": "Horníkovy listy", + "block.twilightforest.mining_log": "Kmen hornického dřeva", + "block.twilightforest.mining_log_core": "Jádro těžebního dřeva", + "block.twilightforest.mining_planks": "Prkna hornického stromu", + "block.twilightforest.mining_pressure_plate": "Nášlapná deska z hornického dřeva", + "block.twilightforest.mining_sapling": "Sazenice hornického stromu", + "block.twilightforest.mining_sign": "Cedule z hornického dřeva", + "block.twilightforest.mining_slab": "Půlblok z hornického dřeva", + "block.twilightforest.mining_stairs": "Schody z hornického dřeva", + "block.twilightforest.mining_trapdoor": "Padací dveře z hornického dřeva", + "block.twilightforest.mining_wall_sign": "Nástěnná cedule z hornického dřeva", + "block.twilightforest.minoshroom_boss_spawner": "Spawner bosse minotaurské houby", + "block.twilightforest.moonworm": "Měsíční červ", + "block.twilightforest.moss_patch": "Mechový porost", + "block.twilightforest.mossy_castle_brick": "Hradní cihla porostlá mechem", + "block.twilightforest.mossy_castle_brick_stairs": "Schody z mechových hradních cihel", + "block.twilightforest.mossy_mazestone": "Cihla bludištního kamene porostlá mechem", + "block.twilightforest.mossy_nagastone_pillar": "Pilíř mechem obrostlého nagastonu", + "block.twilightforest.mossy_underbrick": "Podcihla porostlá mechem", + "block.twilightforest.naga_boss_spawner": "Spawner nagy", + "block.twilightforest.naga_courtyard_miniature_structure": "Miniaturní dvůr nagy", + "block.twilightforest.naga_trophy": "Trofej nagy", + "block.twilightforest.nagastone_pillar": "Nagastonový pilíř", + "block.twilightforest.nagastone_stairs_left": "Nagastonové schody (levé)", + "block.twilightforest.nagastone_stairs_right": "Nagastonové schody (pravé)", + "block.twilightforest.orange_force_field": "Oranžové silové pole", + "block.twilightforest.player_skull_candle.named": "Hlava %s se svíčkami", + "block.twilightforest.potted_dead_thorn": "Spálený trn v květináči", + "block.twilightforest.potted_green_thorn": "Zelený trn v květináči", + "block.twilightforest.potted_thorn": "Trn v květináči", + "block.twilightforest.quest_ram_trophy": "Trofej úlohového berana", + "block.twilightforest.rainbow_oak_leaves": "Listy duhového dubu", + "block.twilightforest.rainbow_oak_sapling": "Sazenice duhového dubu", + "block.twilightforest.reactor_debris": "Zbytky reaktoru", + "block.twilightforest.reappearing_block": "Znovu objevující blok", + "block.twilightforest.root": "Kořeny", + "block.twilightforest.root_strand": "Kořenová vlákna", + "block.twilightforest.skeleton_skull_candle": "Svička z lebky", + "block.twilightforest.slider": "Skluzavková past", + "block.twilightforest.smoker": "Kuřák", + "block.twilightforest.snow_queen_trophy": "Trofej sněhové královny", + "block.twilightforest.sorting_chest": "Truhla z třídícího dřeva", + "block.twilightforest.sorting_leaves": "Listy třídění", + "block.twilightforest.sorting_log": "Kmen třídícího dřeva", + "block.twilightforest.sorting_log_core": "Motor třídícího dřeva", + "block.twilightforest.sorting_sapling": "Sazenice třídícího stromu", + "block.twilightforest.spiral_bricks": "Spirálové cihly", + "block.twilightforest.steeleaf_block": "Blok ocelového listu", + "block.twilightforest.stripped_canopy_log": "Oloupaný kmen klenbového stromu", + "block.twilightforest.stripped_canopy_wood": "Oloupané dřevo klenbového stromu", + "block.twilightforest.stripped_dark_log": "Oloupaný tmavý kmen", + "block.twilightforest.stripped_mangrove_log": "Oloupaný mangrovový kmen", + "block.twilightforest.stripped_mangrove_wood": "Oloupané mangrovové dřevo", + "block.twilightforest.stripped_mining_log": "Oloupaný kmen hornického stromu", + "block.twilightforest.stripped_sorting_log": "Oloupaný kmen třídícího stromu", + "block.twilightforest.stripped_time_log": "Oloupaný kmen stromu časů", + "block.twilightforest.stripped_transformation_log": "Oloupaný kmen stromu transformace", + "block.twilightforest.stripped_twilight_oak_log": "Oloupaný kmen twilightového dubu", + "block.twilightforest.stripped_twilight_oak_wood": "Oloupané dřevo twilightového dubu", + "block.twilightforest.stronghold_shield": "Štít tvrze", + "block.twilightforest.thick_castle_brick": "Silná hradní cihla", + "block.twilightforest.thorn_leaves": "Trnité listy", + "block.twilightforest.thorn_rose": "Trnová růže", + "block.twilightforest.time_button": "Tlačítko ze dřeva časů", + "block.twilightforest.time_chest": "Truhla z dřeva časů", + "block.twilightforest.time_door": "Dveře ze dřeva časů", + "block.twilightforest.time_fence": "Plot ze dřeva časů", + "block.twilightforest.time_fence_gate": "Branka ze dřeva časů", + "block.twilightforest.time_leaves": "Listy dřeva časů", + "block.twilightforest.time_log": "Kmen dřeva časů", + "block.twilightforest.time_log_core": "Hodiny dřeva časů", + "block.twilightforest.time_planks": "Prkna ze dřeva časů", + "block.twilightforest.time_pressure_plate": "Nášlapná deska ze dřeva časů", + "block.twilightforest.time_sapling": "Sazenice stromu času", + "block.twilightforest.time_sign": "Cedule ze dřeva časů", + "block.twilightforest.time_slab": "Půlblok ze dřeva časů", + "block.twilightforest.time_stairs": "Schody ze dřeva časů", + "block.twilightforest.time_trapdoor": "Padací dveře ze dřeva časů", + "block.twilightforest.time_wall_sign": "Nástěnná cedule ze dřeva časů", + "block.twilightforest.torchberry_plant": "Rostlina svítící bobule", + "block.twilightforest.towerwood": "Prkna z věžového dřeva", + "block.twilightforest.transformation_button": "Tlačítko z transformačního dřeva", + "block.twilightforest.transformation_chest": "Truhla z transformačního dřeva", + "block.twilightforest.transformation_door": "Dveře z transformačního dřeva", + "block.twilightforest.transformation_fence": "Plot z transformačního dřeva", + "block.twilightforest.transformation_fence_gate": "Branka z transformačního dřeva", + "block.twilightforest.transformation_leaves": "Listy přeměny", + "block.twilightforest.transformation_log": "Kmen dřeva transformace", + "block.twilightforest.transformation_log_core": "Srdce přeměny", + "block.twilightforest.transformation_planks": "Prkna z transformačního dřeva", + "block.twilightforest.transformation_pressure_plate": "Nášlapná deska z transformačního dřeva", + "block.twilightforest.transformation_sapling": "Sazenice stromu transformace", + "block.twilightforest.transformation_sign": "Cedule z transformačního dřeva", + "block.twilightforest.transformation_slab": "Půlblok z transformačního dřeva", + "block.twilightforest.transformation_stairs": "Schody z transformačního dřeva", + "block.twilightforest.transformation_trapdoor": "Padací dveře z transformačního dřeva", + "block.twilightforest.transformation_wall_sign": "Nástěnná cedule z transformačního dřeva", + "block.twilightforest.trophy_pedestal": "Trofejový podstavec", + "block.twilightforest.twilight_oak_button": "Tlačítko z twilightového dubu", + "block.twilightforest.twilight_oak_chest": "Truhla z twilightového dubu", + "block.twilightforest.twilight_oak_door": "Dveře z twilightového dubu", + "block.twilightforest.twilight_oak_fence": "Plot z twilightového dubu", + "block.twilightforest.twilight_oak_fence_gate": "Branka z twilightového dubu", + "block.twilightforest.twilight_oak_leaves": "Listy twilightového dubu", + "block.twilightforest.twilight_oak_log": "Kmen twilightového dubu", + "block.twilightforest.twilight_oak_planks": "Twilightová dubová prkna", + "block.twilightforest.twilight_oak_pressure_plate": "Nášlapná deska z twilightového dubu", + "block.twilightforest.twilight_oak_sign": "Cedule z twilightového dubu", + "block.twilightforest.twilight_oak_slab": "Půlblok twilightového dubu", + "block.twilightforest.twilight_oak_stairs": "Twilightové dubové schody", + "block.twilightforest.twilight_oak_trapdoor": "Poklop z twilightového dubu", + "block.twilightforest.twilight_oak_wood": "Dřevo twilightového dubu", + "block.twilightforest.twilight_portal": "Portál do Twilight Forestu", + "block.twilightforest.twisted_stone": "Zkroucený kámen", + "block.twilightforest.twisted_stone_pillar": "Zkroucený kamenný pilíř", + "block.twilightforest.uncrafting_table": "Rozebírací stůl", + "block.twilightforest.underbrick": "Podcihla", + "block.twilightforest.underbrick_floor": "Podlaha z podcihel", + "block.twilightforest.vanishing_block": "Mizející blok", + "block.twilightforest.violet_castle_door": "Fialové hradní dveře", + "block.twilightforest.violet_force_field": "Fialové silové pole", + "block.twilightforest.weathered_deadrock": "Zvětralý mrtvý kámen", + "block.twilightforest.worn_castle_brick": "Opotřebená hradní cihla", + "block.twilightforest.worn_castle_brick_stairs": "Opotřebené schody z hradních cihel", + "block.twilightforest.yellow_castle_door": "Žluté hradní dveře", + "block.twilightforest.zombie_skull_candle": "Svíčka ze zombie lebky", + "commands.tffeature.center": "Střed lokace: %s", + "commands.tffeature.chunk": "Nalezeno v chunku lokace: %s", + "commands.tffeature.nearest": "Nejbližší lokace je: %s", + "commands.tffeature.none_nearby": "V okolí se nepodařilo najít žádnou lokaci!", + "commands.tffeature.not_in_twilight_forest": "Nejsi v dimenzi Twilight Forestu", + "commands.tffeature.structure.inside": "Jsi v orientačním bodu struktury", + "commands.tffeature.structure.outside": "Nejsi v orientačním bodu struktury", + "commands.tffeature.structure.required": "Nejsi ve struktuře", + "commands.tffeature.structure.spawn_info": "%s, hmotnost %s", + "commands.tffeature.structure.spawn_list": "Seznam spawnování pro tuto oblast je:", + "dimension.twilightforest.twilightforest": "Twilightový les", + "effect.twilightforest.frosted": "Zmrzlý", + "enchantment.twilightforest.chill_aura": "Studená aura", + "enchantment.twilightforest.destruction": "Destrukce", + "enchantment.twilightforest.fire_react": "Ohnivá reakce", + "entity.twilightforest.alpha_yeti": "Alfa yeti", + "entity.twilightforest.armored_giant": "Obrněný obr", + "entity.twilightforest.bighorn_sheep": "Ovce tlustorohá", + "entity.twilightforest.boat": "Loď", + "entity.twilightforest.chest_boat": "Loď s truhlou", + "entity.twilightforest.cube_of_annihilation": "Kostka zničení", + "entity.twilightforest.dwarf_rabbit": "Trpasličí králík", + "entity.twilightforest.falling_ice": "Padající led", + "entity.twilightforest.fire_beetle": "Ohnivý brouk", + "entity.twilightforest.giant_miner": "Obří horník", + "entity.twilightforest.hostile_wolf": "Zlý vlk", + "entity.twilightforest.ice_arrow": "Ledový šíp", + "entity.twilightforest.ice_crystal": "Ledový krystal", + "entity.twilightforest.ice_snowball": "Ledová sněhová koule", + "entity.twilightforest.king_spider": "Pavoučí král", + "entity.twilightforest.knight_phantom": "Fantom rytíře", + "entity.twilightforest.lower_goblin_knight": "Nižší goblinský rytíř", + "entity.twilightforest.maze_slime": "Bludištní slizoun", + "entity.twilightforest.minoshroom": "Minotauří krávomůrka", + "entity.twilightforest.minotaur": "Minotaurus", + "entity.twilightforest.mist_wolf": "Mlžný vlk", + "entity.twilightforest.moonworm_shot": "Měsíční červ", + "entity.twilightforest.penguin": "Tučňák", + "entity.twilightforest.skeleton_druid": "Kostlivecký druid", + "entity.twilightforest.slime_beetle": "Slizký brouk", + "entity.twilightforest.snow_guardian": "Sněhový strážce", + "entity.twilightforest.snow_queen": "Sněhová královna", + "entity.twilightforest.stable_ice_core": "Stabilní ledové jádro", + "entity.twilightforest.swarm_spider": "Rojící pavouk", + "entity.twilightforest.tiny_bird": "Malý pták", + "entity.twilightforest.unstable_ice_core": "Nestabilní ledové jádro", + "entity.twilightforest.upper_goblin_knight": "Vyšší goblinský rytíř", + "entity.twilightforest.winter_wolf": "Zimní vlk", + "item.twilightforest.alpha_yeti_fur": "Srst alfa yetiho", + "item.twilightforest.alpha_yeti_spawn_egg": "Vajíčko s alfa yetim", + "item.twilightforest.arctic_boots": "Arktické boty", + "item.twilightforest.arctic_chestplate": "Arktická bunda", + "item.twilightforest.arctic_fur": "Arktická srst", + "item.twilightforest.arctic_helmet": "Arktická kapuce", + "item.twilightforest.arctic_leggings": "Arktické kalhoty", + "item.twilightforest.armor_shard": "Úlomek brnění", + "item.twilightforest.armor_shard_cluster": "Shluk úlomků brnění", + "item.twilightforest.bighorn_sheep_spawn_egg": "Vajíčko s ovcí tlustorohou", + "item.twilightforest.block_and_chain": "Blok a řetěz", + "item.twilightforest.brittle_potion_flask": "Křehká lektvarová baňka", + "item.twilightforest.canopy_boat": "Klenbová loď", + "item.twilightforest.canopy_chest_boat": "Klenbová loď s truhlou", + "item.twilightforest.carminite": "Karminit", + "item.twilightforest.carminite_ghastguard_spawn_egg": "Vajíčko s karminitovým strážcem", + "item.twilightforest.carminite_ghastling_spawn_egg": "Vajíčko s malým karminitovým duchem", + "item.twilightforest.charm_of_keeping_1": "Talisman zachování I", + "item.twilightforest.charm_of_keeping_2": "Talisman zachování II", + "item.twilightforest.charm_of_keeping_3": "Talisman zachování III", + "item.twilightforest.charm_of_life_1": "Talisman života I", + "item.twilightforest.charm_of_life_2": "Talisman života II", + "item.twilightforest.cooked_venison": "Zvěřinový steak", + "item.twilightforest.cube_of_annihilation": "Kostka zničení", + "item.twilightforest.cube_talisman": "Talisman kostky", + "item.twilightforest.diamond_minotaur_axe": "Diamantová minotauří sekera", + "item.twilightforest.dwarf_rabbit_spawn_egg": "Vajíčko se zakrslým králíkem", + "item.twilightforest.ender_bow": "Endový luk", + "item.twilightforest.fiery_blood": "Ohnivá krev", + "item.twilightforest.fiery_boots": "Ohnivé boty", + "item.twilightforest.fiery_chestplate": "Ohnivý pancíř", + "item.twilightforest.fiery_helmet": "Ohnivá helma", + "item.twilightforest.fiery_ingot": "Ohnivý ingot", + "item.twilightforest.fiery_leggings": "Ohnivé kalhoty", + "item.twilightforest.fiery_pickaxe": "Ohnivý krumpáč", + "item.twilightforest.fiery_sword": "Ohnivý meč", + "item.twilightforest.fiery_tears": "Ohnivé slzy", + "item.twilightforest.filled_magic_map": "Magická mapa", + "item.twilightforest.filled_maze_map": "Bludištní mapa", + "item.twilightforest.filled_ore_map": "Bludištní/rudová mapa", + "item.twilightforest.fire_beetle_spawn_egg": "Vajíčko s ohnivým broukem", + "item.twilightforest.flask.doses": "Dávky: %s/%s", + "item.twilightforest.flask.no_refill": "Nemůže být znovu naplňena", + "item.twilightforest.fortification_scepter": "Žezlo zpevnění", + "item.twilightforest.giant_miner_spawn_egg": "Vajíčko s obrovským horníkem", + "item.twilightforest.giant_pickaxe": "Obrův krumpáč", + "item.twilightforest.giant_sword": "Obrův meč", + "item.twilightforest.glass_sword": "Skleněný meč", + "item.twilightforest.gold_minotaur_axe": "Zlatá minotauří sekera", + "item.twilightforest.greater_potion_flask": "Vetší lektvarová baňka", + "item.twilightforest.hedge_spider_spawn_egg": "Vajíčko s keřovým pavoukem", + "item.twilightforest.hostile_wolf_spawn_egg": "Vajíčko se zlým vlkem", + "item.twilightforest.hydra_chop": "Kotleta hydry", + "item.twilightforest.hydra_spawn_egg": "Vajíčko s hydrou", + "item.twilightforest.ice_bomb": "Ledová bomba", + "item.twilightforest.ice_bow": "Ledový luk", + "item.twilightforest.ice_sword": "Ledový meč", + "item.twilightforest.ironwood_axe": "Železodřevěná sekera", + "item.twilightforest.ironwood_boots": "Železodřevěné boty", + "item.twilightforest.ironwood_chestplate": "Železnodřevěný pancíř", + "item.twilightforest.ironwood_helmet": "Železodřevěná přilba", + "item.twilightforest.ironwood_hoe": "Železodřevená motyka", + "item.twilightforest.ironwood_ingot": "Železodřevený ingot", + "item.twilightforest.ironwood_leggings": "Železodřevěné kalhoty", + "item.twilightforest.ironwood_pickaxe": "Železodřevěný krumpáč", + "item.twilightforest.ironwood_shovel": "Železodřevěná lopata", + "item.twilightforest.ironwood_sword": "Železodřevěný meč", + "item.twilightforest.king_spider_spawn_egg": "Vajíčko s pavoučím králem", + "item.twilightforest.knight_phantom_spawn_egg": "Vajíčko s rytířským fantomem", + "item.twilightforest.knightmetal_axe": "Sekera z rytířského kovu", + "item.twilightforest.knightmetal_boots": "Boty z rytířského kovu", + "item.twilightforest.knightmetal_chestplate": "Pancíř z rytířského kovu", + "item.twilightforest.knightmetal_helmet": "Helma z rytířského kovu", + "item.twilightforest.knightmetal_ingot": "Ingot rytířského kovu", + "item.twilightforest.knightmetal_leggings": "Kalhoty z rytířského kovu", + "item.twilightforest.knightmetal_pickaxe": "Krumpáč z rytířského kovu", + "item.twilightforest.knightmetal_shield": "Štít z rytířského kovu", + "item.twilightforest.knightmetal_sword": "Meč z rytířského kovu", + "item.twilightforest.kobold_spawn_egg": "Vajíčko s koboldem", + "item.twilightforest.lamp_of_cinders": "Lampa škváry", + "item.twilightforest.lifedrain_scepter": "Žezlo čerpání života", + "item.twilightforest.liveroot": "Živý kořen", + "item.twilightforest.lower_goblin_knight_spawn_egg": "Vajíčko s rytířským goblinem", + "item.twilightforest.magic_beans": "Magické fazole", + "item.twilightforest.magic_map_focus": "Zaměření magické mapy", + "item.twilightforest.mangrove_boat": "Mangrovová loď", + "item.twilightforest.mangrove_chest_boat": "Mangrovová loď s truhlou", + "item.twilightforest.maze_map_focus": "Zaměření bludištní mapy", + "item.twilightforest.maze_slime_spawn_egg": "Vejce s bludištním slizem", + "item.twilightforest.mazebreaker_pickaxe": "Rozbíječ bludiště", + "item.twilightforest.minotaur_spawn_egg": "Vajíčko s minotaurem", + "item.twilightforest.mist_wolf_spawn_egg": "Vajíčko s mlžným vlkem", + "item.twilightforest.moon_dial": "Měsíční fáze", + "item.twilightforest.moon_dial.phase_0": "Úplněk", + "item.twilightforest.moon_dial.phase_1": "Couvající měsíc", + "item.twilightforest.moon_dial.phase_4": "Nový měsíc", + "item.twilightforest.moon_dial.phase_5": "Dorůstající srpek", + "item.twilightforest.moon_dial.phase_6": "První čtvrť", + "item.twilightforest.moon_dial.phase_7": "Dorůstající měsíc", + "item.twilightforest.moon_dial.phase_unknown": "Fáze měsíce je neurčitá", + "item.twilightforest.moon_dial.phase_unknown_fools": "404 měsíc nenalezen", + "item.twilightforest.moonworm_queen": "Královna měsíčního červa", + "item.twilightforest.mosquito_swarm_spawn_egg": "Vajíčko s rojem moskytů", + "item.twilightforest.music_disc_findings": "Gramofonová deska", + "item.twilightforest.music_disc_home": "Gramofonová deska", + "item.twilightforest.music_disc_maker": "Gramofonová deska", + "item.twilightforest.music_disc_motion": "Gramofonová deska", + "item.twilightforest.music_disc_radiance": "Gramofonová deska", + "item.twilightforest.music_disc_steps": "Gramofonová deska", + "item.twilightforest.music_disc_superstitious": "Gramofonová deska", + "item.twilightforest.music_disc_thread": "Gramofonová deska", + "item.twilightforest.music_disc_wayfarer": "Gramofonová deska", + "item.twilightforest.naga_chestplate": "Tunika ze šupin nagy", + "item.twilightforest.naga_leggings": "Kalhoty ze šupin nagy", + "item.twilightforest.naga_scale": "Šupina nagy", + "item.twilightforest.naga_spawn_egg": "Vajíčko s nagou", + "item.twilightforest.ore_magnet": "Rudový magnet", + "item.twilightforest.ore_meter": "Rudový měřič", + "item.twilightforest.peacock_feather_fan": "Vějíř pávích pírek", + "item.twilightforest.penguin_spawn_egg": "Vajíčko s tučňákem", + "item.twilightforest.phantom_chestplate": "Fantomovo brnění", + "item.twilightforest.phantom_helmet": "Fantomova helma", + "item.twilightforest.quest_ram_spawn_egg": "Vajíčko s beranem úloh", + "item.twilightforest.raven_feather": "Havraní pírko", + "item.twilightforest.raw_ironwood": "Surové železné dřevo", + "item.twilightforest.raw_venison": "Syrová zvěřina", + "item.twilightforest.skeleton_druid_spawn_egg": "Vajíčko s kostliveckým druidem", + "item.twilightforest.skull_candle.desc": "Má: %s %s svíčku", + "item.twilightforest.skull_candle.desc.multiple": "Má: %s %s svíčky", + "item.twilightforest.slime_beetle_spawn_egg": "Vajíčko se slizovým broukem", + "item.twilightforest.snow_guardian_spawn_egg": "Vajíčko se sněhovým strážcem", + "item.twilightforest.snow_queen_spawn_egg": "Vajíčko se sněhovou královnou", + "item.twilightforest.stable_ice_core_spawn_egg": "Vajíčko se stabilním ledovým jádrém", + "item.twilightforest.steeleaf_axe": "Sekera z ocelových listů", + "item.twilightforest.steeleaf_boots": "Boty z ocelových listů", + "item.twilightforest.steeleaf_chestplate": "Pancíř z ocelových listů", + "item.twilightforest.steeleaf_helmet": "Helma z ocelových listů", + "item.twilightforest.steeleaf_hoe": "Motyka z ocelových listů", + "item.twilightforest.steeleaf_ingot": "Ocelový list", + "item.twilightforest.steeleaf_leggings": "Kalhoty z ocelových listů", + "item.twilightforest.steeleaf_pickaxe": "Krumpáč z ocelových listů", + "item.twilightforest.steeleaf_shovel": "Lopata z ocelových listů", + "item.twilightforest.steeleaf_sword": "Meč z ocelových listů", + "item.twilightforest.swarm_spider_spawn_egg": "Vajíčko s rojícím pavoukem", + "item.twilightforest.tiny_bird_spawn_egg": "Vajíčko s malým ptákem", + "item.twilightforest.tower_key": "Věžní klíč", + "item.twilightforest.transformation_powder": "Transformační prášek", + "item.twilightforest.twilight_oak_boat": "Loď z twilightového dubu", + "item.twilightforest.twilight_oak_chest_boat": "Loď z twilightového dubu s truhlou", + "item.twilightforest.twilight_scepter": "Žezlo soumraku", + "item.twilightforest.unstable_ice_core_spawn_egg": "Vajíčko s nestabilním ledovým jádrem", + "item.twilightforest.winter_wolf_spawn_egg": "Vajíčko se zimním vlkem", + "item.twilightforest.yeti_boots": "Yetiho boty", + "item.twilightforest.yeti_chestplate": "Yetiho bunda", + "item.twilightforest.yeti_helmet": "Yetiho rohatá helma", + "item.twilightforest.yeti_leggings": "Yetiho kalhoty", + "item.twilightforest.yeti_spawn_egg": "Vajíčko s yetim", + "item.twilightforest.zombie_scepter": "Žezlo zombíků", + "itemGroup.twilightforest.blocks": "Twilight Forest: Bloky", + "itemGroup.twilightforest.equipment": "Twilight Forest: Výbava", + "itemGroup.twilightforest.items": "Twilight Forest: Předměty", + "structure.twilightforest.aurora_palace": "Polární palác", + "structure.twilightforest.dark_tower": "Temná věž", + "structure.twilightforest.hedge_maze": "Živoplotové bludiště", + "structure.twilightforest.knight_stronghold": "Rytířova pevnost", + "structure.twilightforest.labyrinth": "Minotaurův labyrint", + "structure.twilightforest.large_hollow_hill": "Velký jámový kopec", + "structure.twilightforest.lich_tower": "Lichova věž", + "structure.twilightforest.medium_hollow_hill": "Střední jámový kopec", + "structure.twilightforest.mushroom_tower": "Houbový hrad", + "structure.twilightforest.naga_courtyard": "Dvůr nagy", + "structure.twilightforest.quest_grove": "Háj úkolů", + "structure.twilightforest.small_hollow_hill": "Malý jámový kopec", + "structure.twilightforest.yeti_cave": "Yetiho jeskyně", + "subtitles.twilightforest.entity.boar.death": "Divočák umírá", + "subtitles.twilightforest.item.flask.break": "Křehká baňka se roztříští", + "subtitles.twilightforest.item.flask.crack": "Křehká baňka popraská" +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/cy_gb.json b/src/main/resources/assets/twilightforest/lang/cy_gb.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/cy_gb.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/da_dk.json b/src/main/resources/assets/twilightforest/lang/da_dk.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/da_dk.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/de_DE.lang b/src/main/resources/assets/twilightforest/lang/de_DE.lang deleted file mode 100644 index ac4044b72a..0000000000 --- a/src/main/resources/assets/twilightforest/lang/de_DE.lang +++ /dev/null @@ -1,410 +0,0 @@ -tile.TFLog.0.name=Twilight Eichenholz -tile.TFLog.1.name=Baldachin Baum-Holz -tile.TFLog.2.name=Mangroven Holz -tile.TFLog.3.name=Dunkelholz -tile.TFLeaves.0.name=Twilight Eichenlaub -tile.TFLeaves.1.name=Baldachin Bltter -tile.TFLeaves.2.name=Mangroven Bltter -tile.TFLeaves.3.name=Regenbogen Eichenlaub -tile.TFFirefly.name=Leuchtkfer -tile.TFCicada.name=Grille -tile.TFPortal.name=Twilight Wald Portal -tile.TFMazestone.0.name=Labyrinthstein -tile.TFMazestone.1.name=Labyrinthstein Ziegel -tile.TFMazestone.2.name=gemeielter Labyrinthstein -tile.TFMazestone.3.name=dekorativer Labyrinthstein Ziegel -tile.TFMazestone.4.name=rissiger Labyrinthstein Ziegel -tile.TFMazestone.5.name=mossiger Labyrinthstein Ziegel -tile.TFMazestone.6.name=Labyrinthstein Mosaik -tile.TFMazestone.7.name=Labyrinthstein Rahmen -tile.TFMazestone.8.name=Labyrinthstein Decke -tile.TFHedge.0.name=Absicherung -tile.TFHedge.1.name=Dunkelholz Bltter -tile.TFHedge.2.name=Absicherung -tile.TFBossSpawner.0.name=Naga Spawner -tile.TFBossSpawner.1.name=Lich Spawner -tile.TFBossSpawner.2.name=Hydra Spawner -tile.TFBossSpawner.3.name=Ur-Ghast Spawner -tile.TFBossSpawner.4.name=Phantom Ritter Spawner -tile.TFFireflyJar.name=Leuchtkfer Glas -tile.TFPlant.3.name=Moosflecken -tile.TFPlant.4.name=Mayapfel -tile.TFPlant.5.name=Kleeflecken [WIP] -tile.TFPlant.8.name=Farnwedel -tile.TFPlant.9.name=Dsterpilz -tile.TFPlant.10.name=Waldgrass -tile.TFPlant.11.name=getrockneter Strauch -tile.TFPlant.13.name=Leutbeeren Pflanze -tile.TFPlant.14.name=Wurzel Adern -tile.TFRoots.0.name=Wurzeln -tile.TFRoots.1.name=Lebenswurzel -tile.TFUncraftingTable.name=Uncrafting Table -tile.TFFireJet.0.name=Rauch-Block -tile.TFFireJet.1.name=Eingehllter Raucher -tile.TFFireJet.2.name=Eingehllter Raucher -tile.TFFireJet.8.name=Feuer Jet -tile.TFFireJet.9.name=knallender Feuer Jet -tile.TFFireJet.10.name=brennender Feuer Jet -tile.TFFireJet.11.name=Eingehllter Feuer Jet -tile.TFFireJet.12.name=Eingehllter knallender Feuer Jet -tile.TFFireJet.13.name=Eingehllter brennender Feuer Jet -tile.TFNagastone.0.name=Nagastein Kopf -tile.TFNagastone.1.name=Nagastein Kopf -tile.TFNagastone.2.name=Nagastein Kopf -tile.TFNagastone.3.name=Nagastein Kopf -tile.TFNagastone.4.name=Nagastein -tile.TFNagastone.5.name=Nagastein -tile.TFNagastone.6.name=Nagastein -tile.TFNagastone.7.name=Nagastein -tile.TFNagastone.8.name=Nagastein -tile.TFNagastone.9.name=Nagastein -tile.TFNagastone.10.name=Nagastein -tile.TFNagastone.11.name=Nagastein -tile.TFNagastone.12.name=Nagastein -tile.TFNagastone.13.name=Nagastein -tile.TFNagastone.14.name=Nagastein -tile.TFNagastone.15.name=Nagastein -tile.TFSapling.0.name=krnklicher Twilight Eichensetzling -tile.TFSapling.1.name=Baldachin Baumsetzling -tile.TFSapling.2.name=Twilight Mangrove Setzling -tile.TFSapling.3.name=Dunkelholz Setzling -tile.TFSapling.4.name=robuster Twilight Eichensetzling -tile.TFSapling.5.name=Baum der Zeit Setzling -tile.TFSapling.6.name=Baum der Verwandlung Setzling -tile.TFSapling.7.name=Berg-Baum Setzling -tile.TFSapling.8.name=sortierter Baum Setzling -tile.TFSapling.9.name=Regenbogen Eichen Setzling -tile.TFMoonworm.name=Mondwurm -tile.TFMagicLog.0.name=Zeitholz -tile.TFMagicLog.1.name=Wandelholz -tile.TFMagicLog.2.name=Bergholz -tile.TFMagicLog.3.name=Sorting-Holz -tile.TFMagicLogSpecial.0.name=Zeitholz Uhr -tile.TFMagicLogSpecial.1.name=Herz der Verwandlung -tile.TFMagicLogSpecial.2.name=Bergholz Kern -tile.TFMagicLogSpecial.3.name=Sorting-Holz Motor -tile.TFMagicLeaves.0.name=Zeitholz Bltter -tile.TFMagicLeaves.1.name=Bltter der Verwandlung -tile.TFMagicLeaves.2.name=Bergholz Bltter -tile.TFMagicLeaves.3.name=Sorting-Holz Bltter -tile.TFTowerStone.0.name=Turmholz Bretter -tile.TFTowerStone.1.name=eingehlltes Turmholz -tile.TFTowerStone.2.name=rissiges Turmholz -tile.TFTowerStone.3.name=mossiges Turmholz -tile.TFTowerStone.4.name=verseuchtes Turmholz -tile.TFTowerDevice.0.name=Wiedererscheinender Block -tile.TFTowerDevice.1.name=aktiver Wiedererscheinender Block -tile.TFTowerDevice.2.name=verschwindender Block -tile.TFTowerDevice.3.name=aktiver verschwindender Block -tile.TFTowerDevice.4.name=verriegelter verschwindender Block -tile.TFTowerDevice.5.name=offener verschwindender Block -tile.TFTowerDevice.6.name=Turmbauer -tile.TFTowerDevice.7.name=aktiver Turmbauer -tile.TFTowerDevice.8.name=inaktiver Turmbauer -tile.TFTowerDevice.9.name=Zerstrer -tile.TFTowerDevice.10.name=Ghast Falle -tile.TFTowerDevice.11.name=aktive Ghast Falle -tile.TFTowerDevice.12.name=Karminit Reaktor -tile.TFTowerDevice.13.name=aktiver Karminit Reaktor -tile.TFTowerTranslucent.0.name=wiedererscheinender Block -tile.TFTowerTranslucent.1.name=aktiver Wiedererscheinender Block -tile.TFTowerTranslucent.2.name=Turm-Block-Erbauer -tile.TFTowerTranslucent.3.name=aktiver Turm-Block-Erbauer -tile.TFTowerTranslucent.4.name=Zerstrer-Block -tile.TFTowerTranslucent.5.name=Karminit Reaktor Schutt -tile.TFTowerTranslucent.6.name=falsches Gold -tile.TFTowerTranslucent.7.name=falsche Diamanten -tile.TFTrophy.name=Twilight Forest Trophen -tile.TFShield.0.name=Hochburg Schild -tile.TFShield.1.name=Hochburg Schild -tile.TFShield.2.name=Hochburg Schild -tile.TFShield.3.name=Hochburg Schild -tile.TFShield.4.name=Hochburg Schild -tile.TFShield.5.name=Hochburg Schild -tile.TFShield.15.name=Hochburg Schild -tile.TFTrophyPedestal.0.name=Trophen Sulen -tile.TFTrophyPedestal.15.name=ungenutzte Trophen Sulen -tile.TFAuroraBrick.name=Aurora Block -tile.TFUnderBrick.0.name=Underbrick -tile.TFUnderBrick.1.name=mossiger Underbrick -tile.TFUnderBrick.2.name=rissiger Underbrick -tile.TFThorns.brown.name=Dornen -tile.TFThorns.green.name=grne Dornen -tile.TFBurntThorns.name=verbrannte Dornen -tile.TFThornRose.name=Dornenrose -tile.TFLeaves3.0.name=Dornenbltter -tile.TFLeaves3.1.name=Bohnenranken Bltter -tile.TFDeadrock.surface.name=verwittertes taubes Gestein -tile.TFDeadrock.cracked.name=rissiges taubes Gestein -tile.TFDeadrock.solid.name=taubes Gestein -tile.DarkLeaves.name=Dunklholz Bltter -tile.AuroraPillar.name=Aurora Sule -tile.AuroraSlab.name=Aurora Stufe -tile.TrollSteinn.name=Trollstein -tile.WispyCloud.name=Rauchige Wolke -tile.FluffyCloud.name=flaumige Wolke -tile.GiantCobble.name=Giant Pflasterstein -tile.GiantLog.name=Giant Holz -tile.GiantLeaves.name=Giant Bltter -tile.GiantObsidian.name=Giant Obsidian -tile.UberousSoil.name=Uberous Substrat -tile.HugeStalk.name=riesiger Stengel -tile.HugeGloomBlock.name=riesiger Dsterpilz -tile.TrollVidr.name=Trollvidr -tile.UnripeTrollBer.name=unreife Trollbeere -tile.TrollBer.name=Trollbeere - -item.nagaScale.name=Naga Schuppen -item.plateNaga.name=Naga Schuppen Tunika -item.legsNaga.name=Naga Schuppen Hose -item.scepterTwilight.name=Zepter des Zwielichts -item.scepterLifeDrain.name=Zepter des Lebensaugers -item.scepterZombie.name=Zombie Zepter -item.oreMeter.name=Erz Messgert [WIP] -item.magicMap.name=magische Karte -item.mazeMap.name=Labyrinth Karte -item.oreMap.name=Labyrinth/Erz Map -item.tfFeather.name=Rabenfeder -item.magicMapFocus.name=magischer Kartenfokus -item.mazeMapFocus.name=Labyrinth Kartenfokus -item.liveRoot.name=Lebenswurzel -item.ironwoodRaw.name=Rohe Eisenholz Materialien -item.ironwoodIngot.name=Eisenholz Barren -item.ironwoodHelm.name=Eisenholz Helm -item.ironwoodPlate.name=Eisenholz Rstung -item.ironwoodLegs.name=Eisenholz Hosen -item.ironwoodBoots.name=Eisenholz Stiefel -item.ironwoodSword.name=Eisenholz Schwert -item.ironwoodShovel.name=Eisenholz Schaufel -item.ironwoodPick.name=Eisenholz Spitzhacke -item.ironwoodAxe.name=Eisenholz Axt -item.ironwoodHoe.name=Eisenholz Sense -item.torchberries.name=Fackelbeeren -item.venisonRaw.name=roher Hirsch -item.venisonCooked.name=Hirsch Steak -item.hydraChop.name=Hydra Leib -item.fieryBlood.name=feuriges Blut -item.fieryIngot.name=feuriger Barren -item.fieryHelm.name=feuriger Helm -item.fieryPlate.name=feurige Rstung -item.fieryLegs.name=feurige Hosen -item.fieryBoots.name=feurige Stiefel -item.fierySword.name=feuriges Schwert -item.fieryPick.name=feurige Spitzhacke -item.steeleafIngot.name=Stahlblatt -item.steeleafHelm.name=Stahlblatt Helm -item.steeleafPlate.name=Stahlblatt Rstung -item.steeleafLegs.name=Stahlblatt Hosen -item.steeleafBoots.name=Stahlblatt Stiefel -item.steeleafSword.name=Stahlblatt Schwert -item.steeleafShovel.name=Stahlblatt Schaufel -item.steeleafPick.name=Stahlblatt Spitzhacke -item.steeleafAxe.name=Stahlblatt Axt -item.steeleafHoe.name=Stahlblatt Sense -item.minotaurAxe.name=Minotaurus Axt -item.mazebreakerPick.name=Labyrinth Brecher -item.transformPowder.name=Verwandlungs Pulver -item.meefRaw.name=rohes Meef -item.meefSteak.name=Meef Steak -item.meefStroganoff.name=Meef Stroganoff -item.mazeWafer.name=Maze Wafer -item.emptyMagicMap.name=leere magische Karte -item.emptyMazeMap.name=leere Labyrinth-Karte -item.emptyOreMap.name=leere Labyrinth/Erz Karte -item.oreMagnet.name=Erzmagnet -item.crumbleHorn.name=brckelndes Horn -item.peacockFan.name=Pfauen-Feder Ventilator -item.moonwormQueen.name=Mondwurm Knigin -item.charmOfLife1.name=Reiz des Lebens I -item.charmOfLife2.name=Reiz des Lebens II -item.charmOfKeeping1.name=Reiz des Halten I -item.charmOfKeeping2.name=Reiz des Halten II -item.charmOfKeeping3.name=Reiz des Halten III -item.towerKey.name=Turmschlssel -item.borerEssence.name=Bohrer Essenz -item.carminite.name=Karminit Mineral -item.trophy.hydra.name=Hydra Trophe -item.trophy.naga.name=Naga Trophe -item.trophy.lich.name=Lich Trophe -item.trophy.ur-ghast.name=Ur-ghast Trophe -item.trophy.snowQueen.name=Schneeknigin Trophe -item.experiment115.name=Experiment 115 -item.armorShards.name=Rstungsscherbe -item.knightMetal.name=Ritter Metallbarren -item.shardCluster.name=Rstungsscherben Cluster -item.knightlyHelm.name=ritterlicher Helm -item.knightlyPlate.name=ritterliche Rstung -item.knightlyLegs.name=ritterlicher Schuhe -item.knightlyBoots.name=ritterliche Stiefel -item.knightlySword.name=ritterliches Schwert -item.knightlyPick.name=ritterliche Spitzhacke -item.knightlyAxe.name=ritterliche Axt -item.phantomHelm.name=Phantom Helm -item.phantomPlate.name=Phantom Rstung -item.lampOfCinders.name=Lampe der Asche -item.fieryTears.name=feurige Trnen -item.iceBomb.name=Eis Bombs -item.yetiHelm.name=gehrnter Yeti-Helm -item.yetiPlate.name=Yeti Jacke -item.yetiLegs.name=Yeti Hose -item.yetiBoots.name=Yeti Schtiefel -item.alphaFur.name=Alpha Yetifell -item.arcticFur.name=Arktischer Pelz -item.arcticHelm.name=Arktische Kapuze -item.arcticPlate.name=Arktische Jacke -item.arcticLegs.name=Arktische Hose -item.arcticBoots.name=Arktische Stiefel -item.magicBeans.name=Magische Bohne -item.giantPick.name=Giant's Spitzhacke -item.giantSword.name=Giant's Schwert -item.tripleBow.name=Dreierbogen -item.seekerBow.name=Sucherbogen -item.iceBow.name=Eisbogen -item.enderBow.name=Enderbogen -item.iceSword.name=Eisschwert -item.glassSword.name=Glasschwert - -item.minotaurAxe.tooltip=Extraschaden bei der Aufladung -item.knightlySword.tooltip=Extraschaden bei gepanzerten Zielen -item.knightlyPick.tooltip=Extraschaden bei gepanzerten Zielen -item.knightlyAxe.tooltip=Extraschaden bei ungepanzerten Zielen -item.giantPick.tooltip=zum Abbauen von Giganten Blcken -item.fieryPick.tooltip=Automatisches Schmelzen -item.fierySword.tooltip=Ziele in Brand setzen -item.fieryHelm.tooltip=Ziele in Brand setzen -item.fieryPlate.tooltip=Ziele in Brand setzen -item.fieryLegs.tooltip=Ziele in Brand setzen -item.fieryBoots.tooltip=Ziele in Brand setzen -item.yetiHelm.tooltip=Ziele verlangsamen -item.yetiPlate.tooltip=Ziele verlangsamen -item.yetiLegs.tooltip=Ziele verlangsamen -item.yetiBoots.tooltip=Ziele verlangsamen - -item.tfspawnegg.name=Spawn - -itemGroup.twilightForest=Twilight Forest - -entity.TwilightForest.Wild Boar.name=Wildschwein -entity.TwilightForest.Bighorn Sheep.name=Mufflonschaf -entity.TwilightForest.Wild Deer.name=wilder Hirsch -entity.TwilightForest.Redcap.name=Rotkppchen -entity.TwilightForest.Swarm Spider.name=Schwarmspinne -entity.TwilightForest.Naga.name=Naga -entity.TwilightForest.Naga Segment.name=Naga Abschnitt -entity.TwilightForest.Skeleton Druid.name=Skelett Druide -entity.TwilightForest.Hostile Wolf.name=feindseliger Wolf -entity.TwilightForest.Twilight Wraith.name=Twilight Gespenst -entity.TwilightForest.Hedge Spider.name=Heckenspinne -entity.TwilightForest.Hydra.name=Hydra -entity.TwilightForest.HydraHead.name=Hydra Kopf -entity.TwilightForest.Twilight Lich.name=Twilight Lich -entity.TwilightForest.Glacier.Penguin.name=Pinguin -entity.TwilightForest.Tiny Bird.name=winziger Vogel -entity.TwilightForest.Forest Squirrel.name=Wald Eichhrnchen -entity.TwilightForest.Forest Bunny.name=Wald-Hschen -entity.TwilightForest.Forest Raven.name=Wald Rabe -entity.TwilightForest.Questing Ram.name=suchender Widder -entity.TwilightForest.Twilight Kobold.name=Kobold -entity.TwilightForest.Boggard.name=Boggard [NYI] -entity.TwilightForest.Lich Minion.name=Lich Diener -entity.TwilightForest.Loyal Zombie.name=loyaler Zombie -entity.TwilightForest.Mosquito Swarm.name=Mckenschwarm -entity.TwilightForest.Death Tome.name=Todwlzer -entity.TwilightForest.Minotaur.name=Minotaurus -entity.TwilightForest.Minoshroom.name=Minotauruspilz -entity.TwilightForest.Fire Beetle.name=Feuerkfer -entity.TwilightForest.Slime Beetle.name=Schleimkfer -entity.TwilightForest.Pinch Beetle.name=Zangenkfer -entity.TwilightForest.Maze Slime.name=Labyrinth Slime -entity.TwilightForest.Redcap Sapper.name=Rotkppchen Sapper -entity.TwilightForest.Mist Wolf.name=Nebelwolf -entity.TwilightForest.King Spider.name=Spinnenknig -entity.TwilightForest.Firefly.name=Leuchtkfer -entity.TwilightForest.Mini Ghast.name=Stachliger Ghastling -entity.TwilightForest.Tower Ghast.name=Stachliger Ghastwchter -entity.TwilightForest.Tower Golem.name=Stachliger Golem -entity.TwilightForest.Tower Termite.name=Turmholzwurm -entity.TwilightForest.Redscale Broodling.name=Stachliger Brtling -entity.TwilightForest.Tower Boss.name=Ur-Ghast -entity.TwilightForest.Block&Chain Goblin.name=Block und Kette Goblin -entity.TwilightForest.Upper Goblin Knight.name=Goblin Oberritter -entity.TwilightForest.Lower Goblin Knight.name=Goblin Unterritter -entity.TwilightForest.Helmet Crab.name=Helmgrabbe -entity.TwilightForest.Knight Phantom.name=Phantomritter -entity.TwilightForest.Yeti.name=Yeti -entity.TwilightForest.Yeti Boss.name=Alpha-Yeti -entity.TwilightForest.WinterWolf.name=Winter Wolf -entity.TwilightForest.SnowGuardian.name=Schneewchter -entity.TwilightForest.Stable Ice Core.name=Stabiler Eiskern -entity.TwilightForest.Unstable Ice Core.name=Instabiler Eiskern -entity.TwilightForest.Snow Queen.name=Schneeknigin -entity.TwilightForest.Troll.name=Hhlentroll -entity.TwilightForest.Giant Miner.name=Bergriese -entity.TwilightForest.Armored Giant.name=Gepanzerter Riesen -entity.TwilightForest.Ice Crystal.name=Eiskristall - -achievement.twilightPortal=Twilight Portal -achievement.twilightPortal.desc=Baue ein Portal in den Zwielicht-Wald. -achievement.twilightArrival=Zwielicht Ankunft -achievement.twilightArrival.desc=Betritt den Zwielicht-Wald. -achievement.twilightHunter=Zwielicht Jger -achievement.twilightHunter.desc=Jage in der lokalen Tierwelt. -achievement.twilightMagicMapFocus=mit Feuer geschrieben -achievement.twilightMagicMapFocus.desc=Crafte den magischen Karten-Fokus mit einer Rabenfeder, Leuchtstein-Staub und Fackelbeeren. -achievement.twilightKillNaga=Naga Jger -achievement.twilightKillNaga.desc=Ttet die Naga in seinem Waldgebiet. -achievement.twilightNagaArmors=Naga Rstung -achievement.twilightNagaArmors.desc=Crafte Naga Brust- und Beinpanzer. -achievement.twilightKillLich=Lich Jger -achievement.twilightKillLich.desc=Ttet den Lich an der Spitze seines Turms. -achievement.twilightLichScepters=Zepter Beherrschung -achievement.twilightLichScepters.desc=Erwerbe alle drei Zepter der Macht. -achievement.twilightHill1=Die Stiefel gehren mir! -achievement.twilightHill1.desc=Besiege einen Rotkppchen Kobold in einem kleinen hohlen Hgel. -achievement.twilightHill2=Was war das fr ein Gerusch? -achievement.twilightHill2.desc=Besiege einen Rotkppchen Pionier in einem mittleren hohlen Hgel. -achievement.twilightHill3=Ich sehe durch Sie hindurch -achievement.twilightHill3.desc=Besiege einen Dmmerungs Geist in einem groen hohlen Hgel. -achievement.twilightHedge=Wanzen-Stampfer -achievement.twilightHedge.desc=Besiege eine Spinne in einem Irrgarten. -achievement.twilightMagicMap=Ich kann meilenweit sehen -achievement.twilightMagicMap.desc=Crafte eine magische Karte. -achievement.twilightMazeMap=Und nun, finde zum Ausgang -achievement.twilightMazeMap.desc=Crafte das Labyrinth Karte nach Erhalt des Fokus aus dem Labyrinth. -achievement.twilightOreMap=Wie kann es das Wert sein? -achievement.twilightOreMap.desc=Crafte die Labyrinth/Erz Karte. -achievement.twilightKillHydra=Hydra Schlchter -achievement.twilightKillHydra.desc=Besiege die mchtige Hydra. -achievement.twilightHydraChop=massiver Hiebe -achievement.twilightHydraChop.desc=Esse das Fleisch der berwltigten Hydra, wenn deine Essen-Leiste leer ist. -achievement.twilightMazebreaker=Brecher des Labyrinths -achievement.twilightMazebreaker.desc=Finde die Labyrinth-Brecher-Spitzhacke im geheimen Labyrinth Gewlbe. -achievement.twilightFierySet=Liter von Blut und Trnen -achievement.twilightFierySet.desc=Nutze ein feuriges Werkzeug oder Waffe beim Tragen mindestens eines Stcks der feurigen Rstung. -achievement.twilightQuestRam=Verbrauchte Baaahs -achievement.twilightQuestRam.desc=Gieb dem Quest-Widder, was ihm fehlt. - -achievement.twilightProgressNaga=schimmernder Umfang -achievement.twilightProgressNaga.desc=Besorge Dir ein Naga-Werkzeug, mit dem die magische Barriere des Lich-Turm berwunden werden kann. -achievement.twilightProgressLich=Von Untoten berhrt -achievement.twilightProgressLich.desc=Verwenden die Magie des Lich-Zepters, um im Sumpf die giftige Mcken zu beseitigen. -achievement.twilightProgressLabyrinth=gewaltiger Stroganow -achievement.twilightProgressLabyrinth.desc=Der Fleisch- und Pilz-Eintopf im Labyrinth macht Dich bereit, den Feuersumpf zu betreten. -achievement.twilightProgressHydra=Das eine Blut -achievement.twilightProgressHydra.desc=Ein Hauch von Hydra Blut im Auge macht den Blindheits-Fluch des dunklen Wald ungeschehen. -achievement.twilightProgressTrophyPedestal=Trophen Meister -achievement.twilightProgressTrophyPedestal.desc=Stelle eine Trophe auf den Sockel in den Ruinen im dunklen Wald. -achievement.twilightProgressKnights=Carminite Eingewhnung -achievement.twilightProgressKnights.desc=Besnftige die rastlosen Gespenster im Ritter-Grab und die Teile des carminite Turms werden Dir gehorchen. -achievement.twilightProgressUrghast=Trnen des Feuers -achievement.twilightProgressUrghast.desc=Berhren die feuerroten Trnen der Ur-Ghasts, um in den Schnee-Wldern der Klte zu widerstehen. -achievement.twilightProgressYeti=Alpha Fell -achievement.twilightProgressYeti.desc=Trage Kleider aus dem weichen Fell vom Alpha Yeti. Sie halten sicher vor der Klte des Gletschers. -achievement.twilightProgressGlacier=wolkenloser Himmel -achievement.twilightProgressGlacier.desc=Besiege die Schneeknigin oben auf dem Aurora-Palast, Damit kein saurer Regen das Hochland mehr heimsucht. -achievement.twilightProgressTroll=Alles soll brennen -achievement.twilightProgressTroll.desc=Finde die Lampe der Asche in den Trollhhle und Du kannst die Dornen-Barriere berwinden. -achievement.twilightProgressThorns=Vorbei an den Dornen -achievement.twilightProgressThorns.desc=Gehe durch das Dornenland, und ffne die Tr des Schlosses. -achievement.twilightProgressCastle=So ein Schloss - Wow -achievement.twilightProgressCastle.desc=Was gibt es noch in dieser Burg?!? \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/de_at.json b/src/main/resources/assets/twilightforest/lang/de_at.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/de_at.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/de_ch.json b/src/main/resources/assets/twilightforest/lang/de_ch.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/de_ch.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/de_de.json b/src/main/resources/assets/twilightforest/lang/de_de.json new file mode 100644 index 0000000000..9beb6adb1c --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/de_de.json @@ -0,0 +1,785 @@ +{ + "advancement.twilightforest.arborist": "Wahnsinniger Dendrologe", + "advancement.twilightforest.arborist.desc": "Halt deine Äxte und Scheren bereit. Durchsuch jeden Winkel und jedes Versteck und hol dir alles, was von Bäumen kommt! Bastle, plündere, hol dir jeden Baumstamm... Schössling... Blätter... mehr... alles. ALLES!", + "advancement.twilightforest.arctic_dyed": "Einstieg in die Mode", + "advancement.twilightforest.beanstalk": "Jack und die Bohnenstange", + "advancement.twilightforest.experiment_115": "Mysteriöses Fleisch?", + "advancement.twilightforest.experiment_115.desc": "Sieht aus wie Kuchen, obwohl...", + "advancement.twilightforest.experiment_115_2": "Notiz machen: Großer Erfolg!", + "advancement.twilightforest.experiment_115_2.desc": "Es ist so lecker und feucht!", + "advancement.twilightforest.experiment_115_3": "Jeden Tag 115 essen, 115 Jahre lang, für immer", + "advancement.twilightforest.experiment_115_3.desc": "Essen Experiment einhundertfünfzehn den ganzen Tag, für immer, einhundertfünfzehn mal Experiment einhundertfünfzehn, Experiment einhundertfünfzehn Punkt com, double-u double-u double-u Punkt Experiment einhundertfünfzehn Punkt com, einhundertfünfzehn Jahre, jede Minute Experiment einhundertfünfzehn Punkt com, double-u double-u double-u Punkt einhundertfünfzehn mal Experiment einhundertfünfzehn Punkt com", + "advancement.twilightforest.fiery_set": "Literweise Blut und Tränen", + "advancement.twilightforest.full_mettle_alchemist": "Alchemist mit vollem Einsatz", + "advancement.twilightforest.ghast_trap": "Etwas Seltsames in Turmholz", + "advancement.twilightforest.ghast_trap.desc": "Töte den %ss um einen %s und aktiviere ihn, um den %s vom Himmel zu reißen.", + "advancement.twilightforest.giants": "Ich bin auf Wolke neun", + "advancement.twilightforest.glass_sword": "Ein-Hit-Wunder", + "advancement.twilightforest.glass_sword.desc": "Hast du das gut genutzt?", + "advancement.twilightforest.hedge": "Kammerjäger", + "advancement.twilightforest.hill1": "Die Stiefel gehören mir!", + "advancement.twilightforest.hill2": "Was war das für ein Geräusch?", + "advancement.twilightforest.hill3": "Ich kann dich sehen", + "advancement.twilightforest.hydra_chop": "Massive Kotletten", + "advancement.twilightforest.kill_cicada": "Geschlossen", + "advancement.twilightforest.kill_hydra": "Hydraschlächter", + "advancement.twilightforest.kill_lich": "Bringe deine Toten hervor", + "advancement.twilightforest.kill_naga": "Zeit, die Waage auszugleichen", + "advancement.twilightforest.lich_scepters": "Mit vereinten Kräften!", + "advancement.twilightforest.magic_map": "Bis zum Horizont", + "advancement.twilightforest.magic_map_focus": "Mit Feuer geschrieben", + "advancement.twilightforest.maze_map": "Nichts wie raus hier", + "advancement.twilightforest.mazebreaker": "Brecher des Labyrinths", + "advancement.twilightforest.naga_armors": "Naga Rüstungsschmied", + "advancement.twilightforest.ore_map": "Ist es das denn wert?", + "advancement.twilightforest.progress_glacier": "Klarer Himmel", + "advancement.twilightforest.progress_knights": "Karminit-Eingewöhnung", + "advancement.twilightforest.progress_labyrinth": "Gewaltiger Stroganow", + "advancement.twilightforest.progress_merge": "Ultimativer Showdown", + "advancement.twilightforest.progress_troll": "Alles soll brennen", + "advancement.twilightforest.progress_trophy_pedestal": "Trophäenchampion", + "advancement.twilightforest.progress_ur_ghast": "Tränen des Feuers", + "advancement.twilightforest.progress_yeti": "Alphafell", + "advancement.twilightforest.quest_ram": "Määhige Angelegenheit", + "advancement.twilightforest.root": "Dämmerwald", + "advancement.twilightforest.troll": "Wir machen ein bisschen Trolling", + "advancement.twilightforest.twilight_dining": "Wir speisen im ewigen Sonnenuntergang", + "advancement.twilightforest.twilight_hunter": "Das Schweigen des Waldes", + "biome.twilightforest.clearing": "Dämmerung-Lichtung", + "biome.twilightforest.dark_forest": "Dunkler Wald", + "biome.twilightforest.dark_forest_center": "Zentrum des dunklen Waldes", + "biome.twilightforest.dense_forest": "Dichter Wald", + "biome.twilightforest.dense_mushroom_forest": "Dichter Pilzwald", + "biome.twilightforest.enchanted_forest": "Verwunschener Wald", + "biome.twilightforest.final_plateau": "Letzte Hochebene", + "biome.twilightforest.fire_swamp": "Feuersumpf", + "biome.twilightforest.firefly_forest": "Leuchtkäferwald", + "biome.twilightforest.forest": "Dämmerwald", + "biome.twilightforest.glacier": "Dämmerung-Gletscher", + "biome.twilightforest.highlands": "Dämmerung-Hochland", + "biome.twilightforest.lake": "Dämmerung-See", + "biome.twilightforest.mushroom_forest": "Pilzwald", + "biome.twilightforest.oak_savannah": "Eichensavanne", + "biome.twilightforest.snowy_forest": "Verschneiter Wald", + "biome.twilightforest.spooky_forest": "Spukhafter Wald", + "biome.twilightforest.stream": "Dämmerung-Bach", + "biome.twilightforest.swamp": "Dämmerung-Sumpf", + "biome.twilightforest.thornlands": "Dornenland", + "biome.twilightforest.underground": "Untergrund", + "block.twilightforest.acacia_banister": "Akaziengeländer", + "block.twilightforest.alpha_yeti_boss_spawner": "Alpha-Yeti-Boss-Spawner", + "block.twilightforest.alpha_yeti_trophy": "Alpha-Yetitrophäe", + "block.twilightforest.arctic_fur_block": "Arktispelzblock", + "block.twilightforest.aurora_block": "Aurorablock", + "block.twilightforest.aurora_pillar": "Aurorasäule", + "block.twilightforest.aurora_slab": "Aurorastufe", + "block.twilightforest.auroralized_glass": "Aurora-Glas", + "block.twilightforest.banister.cycle": "Rechtsklick mit einer Axt zum drehen", + "block.twilightforest.beanstalk_leaves": "Bohnenrankenlaub", + "block.twilightforest.birch_banister": "Birkengeländer", + "block.twilightforest.blue_castle_door": "Blauer Burgtür", + "block.twilightforest.blue_castle_rune_brick": "Blauer Burgrunenziegel", + "block.twilightforest.blue_force_field": "Blaues Energiefeld", + "block.twilightforest.bold_castle_brick_pillar": "Fette Burgziegelsäule", + "block.twilightforest.bold_castle_brick_stairs": "Fette Burgziegeltreppe", + "block.twilightforest.bold_stone_pillar": "Kräftiger Steinpfeiler", + "block.twilightforest.brown_thorns": "Dornen", + "block.twilightforest.built_block": "Gebauter Block", + "block.twilightforest.burnt_thorns": "Verbrannte Dornen", + "block.twilightforest.candelabra": "Kandelaber", + "block.twilightforest.canopy_banister": "Baldachingeländer", + "block.twilightforest.canopy_bookshelf": "Baldachin-Bücherregal", + "block.twilightforest.canopy_button": "Baldachinknopf", + "block.twilightforest.canopy_chest": "Baldachintruhe", + "block.twilightforest.canopy_door": "Baldachin tür", + "block.twilightforest.canopy_fence": "Baldachinzaun", + "block.twilightforest.canopy_fence_gate": "Baldachinzauntor", + "block.twilightforest.canopy_leaves": "Baldachinlaub", + "block.twilightforest.canopy_log": "Baldachinbaumstamm", + "block.twilightforest.canopy_planks": "Baldachinbretter", + "block.twilightforest.canopy_pressure_plate": "Baldachindruckplatte", + "block.twilightforest.canopy_sapling": "Baldachinsetzling", + "block.twilightforest.canopy_sign": "Baldachinschild", + "block.twilightforest.canopy_slab": "Baldachinstufe", + "block.twilightforest.canopy_stairs": "Baldachintreppe", + "block.twilightforest.canopy_trapdoor": "Baldachin Trapdoor", + "block.twilightforest.canopy_wall_sign": "Baldachinwandschild", + "block.twilightforest.canopy_wood": "Baldachinholz", + "block.twilightforest.carminite_block": "Karminitblock", + "block.twilightforest.carminite_builder": "Karminit-Erbauer", + "block.twilightforest.carminite_reactor": "Karminit-Reaktor", + "block.twilightforest.casket.broken": "Dein Andenkenschatulle war zu beschädigt, um weitere Gegenstände aufzunehmen. Alle Gegenstände, die in der Schatulle aufbewahrt werden sollten, sind auf den Boden gefallen.", + "block.twilightforest.casket.locked": "Diese Schatulle wird nur von %s geöffnet!", + "block.twilightforest.castle_brick": "Burgziegel", + "block.twilightforest.castle_brick_stairs": "Burgziegeltreppe", + "block.twilightforest.castle_roof_tile": "Burgziegelkachel", + "block.twilightforest.cicada": "Zikade", + "block.twilightforest.cicada_jar": "Zikadenglas", + "block.twilightforest.cinder_furnace": "Aschenofen [Nicht Erledigt]", + "block.twilightforest.cinder_log": "Aschenstamm [Nicht Erledigt]", + "block.twilightforest.cinder_wood": "Aschenholz [Nicht Erledigt]", + "block.twilightforest.clover_patch": "Kleeflecken [WIP]", + "block.twilightforest.cracked_castle_brick": "Rissiger Burgziegel", + "block.twilightforest.cracked_castle_brick_stairs": "Rissige Burgziegeltreppe", + "block.twilightforest.cracked_deadrock": "Rissiger Totenstein", + "block.twilightforest.cracked_mazestone": "Rissiger Labyrinthsteinziegel", + "block.twilightforest.cracked_underbrick": "Rissiger Fundamentsziegelstein", + "block.twilightforest.creeper_skull_candle": "Creeper-Schädelkerze", + "block.twilightforest.creeper_wall_skull_candle": "Creeper-Wandschädelkerze", + "block.twilightforest.crimson_banister": "Karmesingeländer", + "block.twilightforest.cut_mazestone": "Gemeißelter Labyrinthstein", + "block.twilightforest.dark_button": "Dunkelholzknopf", + "block.twilightforest.dark_door": "Dunkelholztür", + "block.twilightforest.dark_fence": "Dunkelholzzaun", + "block.twilightforest.dark_fence_gate": "Dunkelholzzauntor", + "block.twilightforest.dark_leaves": "Dunklholzlaub", + "block.twilightforest.dark_log": "Dunkelbaumstamm", + "block.twilightforest.dark_oak_banister": "Schwarzeichengeländer", + "block.twilightforest.dark_planks": "Dunkelholzbretter", + "block.twilightforest.dark_pressure_plate": "Dunkelholzdruckplatte", + "block.twilightforest.dark_slab": "Dunkelholzstufe", + "block.twilightforest.dark_stairs": "Dunkelholztreppe", + "block.twilightforest.dark_trapdoor": "Dunkelholz Trapdoor", + "block.twilightforest.darkwood_sapling": "Dunkelholzsetzling", + "block.twilightforest.deadrock": "Totenstein", + "block.twilightforest.death_tome_spawner": "Todesfoliant-Spawner", + "block.twilightforest.decorative_mazestone": "Dekorativer Labyrinthsteinziegel", + "block.twilightforest.empty_canopy_bookshelf": "Leeres Baldachin-Bücherregal", + "block.twilightforest.encased_castle_brick_pillar": "Ummantelte Burgziegelsäule", + "block.twilightforest.encased_castle_brick_stairs": "Ummantelte Burgziegeltreppe", + "block.twilightforest.encased_castle_brick_tile": "Ummantelte Burgziegelkachel", + "block.twilightforest.encased_fire_jet": "Knallende Feuerdüse", + "block.twilightforest.encased_smoker": "Eingehüllter Raucher", + "block.twilightforest.etched_nagastone": "Geätzter Nagastein", + "block.twilightforest.fiery_block": "Feuereisenblock", + "block.twilightforest.final_boss_boss_spawner": "Endboss-Boss-Spawner", + "block.twilightforest.fire_jet": "Feuerdüse", + "block.twilightforest.firefly": "Leuchtkäfer", + "block.twilightforest.firefly_jar": "Glühwürmchenflasche", + "block.twilightforest.firefly_particle_spawner": "Glühwürmchen-Partikelspawner", + "block.twilightforest.fluffy_cloud": "Flaumige Wolke", + "block.twilightforest.ghast_trap": "Ghastfalle", + "block.twilightforest.giant_cobblestone": "Riesiger Pflasterstein", + "block.twilightforest.giant_leaves": "Riesenlaub", + "block.twilightforest.giant_log": "Riesenholz", + "block.twilightforest.giant_obsidian": "Riesenobsidian", + "block.twilightforest.green_force_field": "Grünes Energiefeld", + "block.twilightforest.green_thorns": "Grüne Dornen", + "block.twilightforest.hardened_dark_leaves": "Dickes Dunklholzlaub", + "block.twilightforest.hedge": "Hecke", + "block.twilightforest.hollow_oak_sapling": "Robuster Dämmerungseichensetzling", + "block.twilightforest.huge_lily_pad": "Riesenseerosenblatt", + "block.twilightforest.huge_mushgloom_stem": "Riesendüsterpilzstiel", + "block.twilightforest.huge_stalk": "Riesiger Stiel", + "block.twilightforest.huge_water_lily": "Riesenseerose", + "block.twilightforest.hydra_boss_spawner": "Hydra-Boss-Spawner", + "block.twilightforest.hydra_trophy": "Hydratrophäe", + "block.twilightforest.iron_ladder": "Eisenleiter", + "block.twilightforest.ironwood_block": "Eisenholzgitter", + "block.twilightforest.jungle_banister": "Dschungelgeländer", + "block.twilightforest.keepsake_casket": "Andenkenschatulle", + "block.twilightforest.knight_phantom_boss_spawner": "Phantomritter-Boss-Spawner", + "block.twilightforest.knight_phantom_trophy": "Phantomrittertrophäe", + "block.twilightforest.knightmetal_block": "Rittermetallblock", + "block.twilightforest.lich_boss_spawner": "Lich-Boss-Spawner", + "block.twilightforest.lich_tower_miniature_structure": "Miniature Lich Tower [NYI]", + "block.twilightforest.lich_trophy": "Lichtrophäe", + "block.twilightforest.liveroot_block": "Lebenswurzel", + "block.twilightforest.locked_vanishing_block": "Verriegelter verschwindender Block", + "block.twilightforest.mangrove_banister": "Mangrovengeländer", + "block.twilightforest.mangrove_button": "Mangrovenknopf", + "block.twilightforest.mangrove_chest": "Mangroventruhe", + "block.twilightforest.mangrove_door": "Mangroventür", + "block.twilightforest.mangrove_fence": "Mangrovenzaun", + "block.twilightforest.mangrove_fence_gate": "Mangrovenzauntor", + "block.twilightforest.mangrove_leaves": "Mangrovenlaub", + "block.twilightforest.mangrove_log": "Mangrovenstamm", + "block.twilightforest.mangrove_planks": "Mangrovenbretter", + "block.twilightforest.mangrove_pressure_plate": "Mangrovendruckplatte", + "block.twilightforest.mangrove_root": "Mangrovenwurzel", + "block.twilightforest.mangrove_sapling": "Dämmerung-Mangrovensetzling", + "block.twilightforest.mangrove_sign": "Mangrovenschild", + "block.twilightforest.mangrove_slab": "Mangrovenstufe", + "block.twilightforest.mangrove_stairs": "Mangroventreppe", + "block.twilightforest.mangrove_trapdoor": "Mangroven Trapdoor", + "block.twilightforest.mangrove_wall_sign": "Mangrovenwandschild", + "block.twilightforest.mangrove_wood": "Mangrovenholz", + "block.twilightforest.mayapple": "Fußblätter", + "block.twilightforest.mazestone": "Labyrinthstein", + "block.twilightforest.mazestone_border": "Labyrinthstein Rahmen", + "block.twilightforest.mazestone_brick": "Labyrinthsteinziegel", + "block.twilightforest.mazestone_mosaic": "Labyrinthstein Mosaik", + "block.twilightforest.mining_banister": "Bergwerksholzgeländer", + "block.twilightforest.mining_button": "Bergwerksholzknopf", + "block.twilightforest.mining_chest": "Bergwerksholztruhe", + "block.twilightforest.mining_door": "Bergwerksholztür", + "block.twilightforest.mining_fence": "Bergwerksholzzaun", + "block.twilightforest.mining_fence_gate": "Bergwerksholzzauntor", + "block.twilightforest.mining_leaves": "Bergwerkslaub", + "block.twilightforest.mining_log": "Bergwerksbaumstamm", + "block.twilightforest.mining_log_core": "Bergwerkskern", + "block.twilightforest.mining_planks": "Bergwerksholzbretter", + "block.twilightforest.mining_pressure_plate": "Bergwerksholzdruckplatte", + "block.twilightforest.mining_sapling": "Bergwerksbaumsetzling", + "block.twilightforest.mining_sign": "Bergwerksholzschild", + "block.twilightforest.mining_slab": "Bergwerksholzstufe", + "block.twilightforest.mining_stairs": "Bergwerksholztreppe", + "block.twilightforest.mining_trapdoor": "Bergwerksholz Trapdoor", + "block.twilightforest.mining_wall_sign": "Bergwerksholzwandschild", + "block.twilightforest.minoshroom_boss_spawner": "Minoschwammerl-Boss-Spawner", + "block.twilightforest.minoshroom_trophy": "Minoschwammerltrophäe", + "block.twilightforest.moonworm": "Mondwurm", + "block.twilightforest.moss_patch": "Moosflecken", + "block.twilightforest.mossy_castle_brick": "Bemooster Burgziegel", + "block.twilightforest.mossy_castle_brick_stairs": "Bemooste Burgziegeltreppe", + "block.twilightforest.mossy_etched_nagastone": "Bemooster Geätzter Nagastein", + "block.twilightforest.mossy_mazestone": "Bemooster Labyrinthsteinziegel", + "block.twilightforest.mossy_nagastone_pillar": "Bemooster Nagasteinsäule", + "block.twilightforest.mossy_nagastone_stairs_left": "Bemooste Nagasteintreppe (Left)", + "block.twilightforest.mossy_nagastone_stairs_right": "Bemooste Nagasteintreppe (Right)", + "block.twilightforest.mossy_underbrick": "Bemooster Fundamentsziegelstein", + "block.twilightforest.mushgloom": "Düsterpilz", + "block.twilightforest.naga_boss_spawner": "Naga-Boss-Spawner", + "block.twilightforest.naga_courtyard_miniature_structure": "Miniature Naga Courtyard [NYI]", + "block.twilightforest.naga_trophy": "Nagatrophäe", + "block.twilightforest.nagastone": "Nagastein", + "block.twilightforest.nagastone_head": "Nagastein-Kopf", + "block.twilightforest.nagastone_pillar": "Nagasteinsäule", + "block.twilightforest.nagastone_stairs_left": "Nagasteintreppe (Left)", + "block.twilightforest.nagastone_stairs_right": "Nagasteintreppe (Right)", + "block.twilightforest.oak_banister": "Eichengeländer", + "block.twilightforest.orange_force_field": "Orangenes Energiefeld", + "block.twilightforest.player_skull_candle": "Spielerschädelkerze", + "block.twilightforest.player_skull_candle.named": "%s's Kopf mit Kerzen", + "block.twilightforest.player_wall_skull_candle": "Schädelkerze an der Spielerwand", + "block.twilightforest.potted_canopy_sapling": "Baldachinbaumsetzling im Topf", + "block.twilightforest.potted_darkwood_sapling": "Dunkelbaumsetzling im Topf", + "block.twilightforest.potted_dead_thorn": "Verbrannter Dorn im Topf", + "block.twilightforest.potted_green_thorn": "Grüner Dorn im Topf", + "block.twilightforest.potted_hollow_oak_sapling": "Robuster Dämmerungseichensetzling im Topf", + "block.twilightforest.potted_mayapple": "Fußblätter im Topf", + "block.twilightforest.potted_mining_sapling": "Bergwerksbaumsetzling im Topf", + "block.twilightforest.potted_mushgloom": "Düsterpilz im Topf", + "block.twilightforest.potted_rainbow_oak_sapling": "Regenbogeneichensetzling im Topf", + "block.twilightforest.potted_sorting_sapling": "Sortierbaumsetzling im Topf", + "block.twilightforest.potted_thorn": "Dorn im Topf", + "block.twilightforest.potted_time_sapling": "Zeitbaumsetzling im Topf", + "block.twilightforest.potted_transformation_sapling": "Wandelbaumsetzling im Topf", + "block.twilightforest.potted_twilight_oak_sapling": "Dämmerungseichensetzling im Topf ", + "block.twilightforest.quest_ram_trophy": "Schafbock-der-Schatzsuche-Trophäe", + "block.twilightforest.rainbow_oak_leaves": "Regenbogeneichenlaub", + "block.twilightforest.rainbow_oak_sapling": "Regenbogeneichensetzling", + "block.twilightforest.reactor_debris": "Reaktortrümmer", + "block.twilightforest.reappearing_block": "Wiedererscheinender Block", + "block.twilightforest.red_thread": "Roter Faden", + "block.twilightforest.root": "Wurzeln", + "block.twilightforest.root_strand": "Wurzelstränge", + "block.twilightforest.skeleton_skull_candle": "Skelettschädelkerze", + "block.twilightforest.skeleton_wall_skull_candle": "Skelettwandschädelkerze", + "block.twilightforest.slider": "Rutschfalle", + "block.twilightforest.smoker": "Rauchblock", + "block.twilightforest.snow_queen_boss_spawner": "Schneekönigin-Boss-Spawner", + "block.twilightforest.snow_queen_trophy": "Schneekönigintrophäe", + "block.twilightforest.sorting_banister": "Sortierholzgeländer", + "block.twilightforest.sorting_button": "Sortierholzknopf", + "block.twilightforest.sorting_chest": "Sortierholztruhe", + "block.twilightforest.sorting_door": "Sortierholztür", + "block.twilightforest.sorting_fence": "Sortierholzzaun", + "block.twilightforest.sorting_fence_gate": "Sortierholzzauntor", + "block.twilightforest.sorting_leaves": "Sortierlaub", + "block.twilightforest.sorting_log": "Sortierbaumstamm", + "block.twilightforest.sorting_log_core": "Sortiermaschine", + "block.twilightforest.sorting_planks": "Sortierholzbretter", + "block.twilightforest.sorting_pressure_plate": "Sortierholzdruckplatte", + "block.twilightforest.sorting_sapling": "Sortierbaumsetzling", + "block.twilightforest.sorting_sign": "Sortierholzschild", + "block.twilightforest.sorting_slab": "Sortierholzstufe", + "block.twilightforest.sorting_stairs": "Sortierholztreppe", + "block.twilightforest.sorting_trapdoor": "Sortierholz Trapdoor", + "block.twilightforest.sorting_wall_sign": "Sortierholzwandschild", + "block.twilightforest.spiral_bricks": "Spiralförmige Ziegel", + "block.twilightforest.spruce_banister": "Fichtengeländer", + "block.twilightforest.steeleaf_block": "Stahlblattblock", + "block.twilightforest.stripped_canopy_log": "Entrindeter Baldachinbaumstamm", + "block.twilightforest.stripped_canopy_wood": "Entrindetes Baldachinholz", + "block.twilightforest.stripped_dark_log": "Entrindeter Dunkelbaumstamm", + "block.twilightforest.stripped_mangrove_log": "Entrindeter Mangrovenstamm", + "block.twilightforest.stripped_mangrove_wood": "Entrindetes Mangrovenholz", + "block.twilightforest.stripped_mining_log": "Entrindeter Bergwerksbaumsstamm", + "block.twilightforest.stripped_sorting_log": "Entrindeter Sortierbaumsstamm", + "block.twilightforest.stripped_time_log": "Entrindeter Zeitbaumsstamm", + "block.twilightforest.stripped_transformation_log": "Entrindeter Wandelbaumsstamm", + "block.twilightforest.stripped_twilight_oak_log": "Entrindeter Dämmerungseichenstamm", + "block.twilightforest.stripped_twilight_oak_wood": "Entrindetes Dämmerungseichenholz", + "block.twilightforest.stronghold_shield": "Festungsschild", + "block.twilightforest.thick_castle_brick": "Dicker Burgziegel", + "block.twilightforest.thorn_leaves": "Dornenlaub", + "block.twilightforest.thorn_rose": "Dornenrose", + "block.twilightforest.time_banister": "Zeitholzgeländer", + "block.twilightforest.time_button": "Zeitholzknopf", + "block.twilightforest.time_chest": "Zeitholztruhe", + "block.twilightforest.time_door": "Zeitholztür", + "block.twilightforest.time_fence": "Zeitholzzaun", + "block.twilightforest.time_fence_gate": "Zeitholzzauntor", + "block.twilightforest.time_leaves": "Zeitlaub", + "block.twilightforest.time_log": "Zeitbaumstamm", + "block.twilightforest.time_log_core": "Zeitholzuhr", + "block.twilightforest.time_planks": "Zeitholzbretter", + "block.twilightforest.time_pressure_plate": "Zeitholzdruckplatte", + "block.twilightforest.time_sapling": "Baum der Zeit-Setzling", + "block.twilightforest.time_sign": "Zeitholzschild", + "block.twilightforest.time_slab": "Zeitholzstufe", + "block.twilightforest.time_stairs": "Zeitholztreppe", + "block.twilightforest.time_trapdoor": "Zeitholz Trapdoor", + "block.twilightforest.time_wall_sign": "Zeitholzwandschild", + "block.twilightforest.torchberry_plant": "Fackelbeerenstrauch", + "block.twilightforest.towerwood": "Turmholzbretter", + "block.twilightforest.transformation_banister": "Wandelholzgeländer", + "block.twilightforest.transformation_button": "Wandelholzknopf", + "block.twilightforest.transformation_chest": "Wanderlholztruhe", + "block.twilightforest.transformation_door": "Wandelholztür", + "block.twilightforest.transformation_fence": "Wandelholzzaun", + "block.twilightforest.transformation_fence_gate": "Wandelholzzauntor", + "block.twilightforest.transformation_leaves": "Wandellaub", + "block.twilightforest.transformation_log": "Wandelbaumstamm", + "block.twilightforest.transformation_log_core": "Herz der Verwandlung", + "block.twilightforest.transformation_planks": "Wandelholzbretter", + "block.twilightforest.transformation_pressure_plate": "Wandelholzdruckplatte", + "block.twilightforest.transformation_sapling": "Baum der Verwandlung-Setzling", + "block.twilightforest.transformation_sign": "Wandelholzschild", + "block.twilightforest.transformation_slab": "Wandelholzstufe", + "block.twilightforest.transformation_stairs": "Wandelholztreppe", + "block.twilightforest.transformation_trapdoor": "Wandelholz Trapdoor", + "block.twilightforest.transformation_wall_sign": "Wandelholzwandschild", + "block.twilightforest.trollber": "Trollbeere", + "block.twilightforest.trollsteinn": "Trollstein", + "block.twilightforest.trollvidr": "Trollpflanze", + "block.twilightforest.trophy_pedestal": "Trophäensäule", + "block.twilightforest.twilight_oak_banister": "Dämmerungseichengeländer", + "block.twilightforest.twilight_oak_button": "DämmerungseichenButton", + "block.twilightforest.twilight_oak_chest": "Dämmerungseichentruhe", + "block.twilightforest.twilight_oak_door": "DämmerungseichenDoor", + "block.twilightforest.twilight_oak_fence": "DämmerungseichenFence", + "block.twilightforest.twilight_oak_fence_gate": "Dämmerungseichenzauntor", + "block.twilightforest.twilight_oak_leaves": "Dämmerungseichenlaub", + "block.twilightforest.twilight_oak_log": "Dämmerungseichenstamm", + "block.twilightforest.twilight_oak_planks": "Dämmerungseichenbretter", + "block.twilightforest.twilight_oak_pressure_plate": "DämmerungseichenPressure Plate", + "block.twilightforest.twilight_oak_sapling": "Kränklicher Dämmerungseichensetzling", + "block.twilightforest.twilight_oak_sign": "DämmerungseichenSign", + "block.twilightforest.twilight_oak_slab": "Dämmerungseichenstufe", + "block.twilightforest.twilight_oak_stairs": "Dämmerungseichentreppe", + "block.twilightforest.twilight_oak_trapdoor": "DämmerungseichenTrapdoor", + "block.twilightforest.twilight_oak_wood": "Dämmerungseichenholz", + "block.twilightforest.twilight_portal": "Dämmerwald-Portal", + "block.twilightforest.twisted_stone": "Stein mit Gewinde", + "block.twilightforest.twisted_stone_pillar": "Steinsäule", + "block.twilightforest.uberous_soil": "Hochwertige Erde", + "block.twilightforest.uncrafting_table": "Zerlegebank", + "block.twilightforest.underbrick": "Fundamentsziegelstein", + "block.twilightforest.underbrick_floor": "Fundamentsziegelsteinboden", + "block.twilightforest.unripe_trollber": "Unreife Trollbeere", + "block.twilightforest.ur_ghast_boss_spawner": "Ur-Ghast-Boss-Spawner", + "block.twilightforest.ur_ghast_trophy": "Ur-Ghasttrophäe", + "block.twilightforest.vangrove_banister": "Mangrovengeländer", + "block.twilightforest.vanishing_block": "Verschwindender Block", + "block.twilightforest.violet_castle_door": "Violetter Burgtür", + "block.twilightforest.violet_castle_rune_brick": "Violetter Burgrunenziegel", + "block.twilightforest.violet_force_field": "Violettes Energiefeld", + "block.twilightforest.warped_banister": "Wirrholzgeländer", + "block.twilightforest.weathered_deadrock": "Verwitterter Totenstein", + "block.twilightforest.wispy_cloud": "Dünne Wolke", + "block.twilightforest.wither_skeleton_skull_candle": "Wither-Skelettschädelkerze", + "block.twilightforest.wither_skeleton_wall_skull_candle": "Wither-Skelettwand-Schädelkerze", + "block.twilightforest.worn_castle_brick": "Alter Burgziegel", + "block.twilightforest.worn_castle_brick_stairs": "Alte Burgziegeltreppe", + "block.twilightforest.yellow_castle_door": "Gelber Burgtür", + "block.twilightforest.yellow_castle_rune_brick": "Gelber Burgrunenziegel", + "block.twilightforest.zombie_skull_candle": "Zombieschädelkerze", + "block.twilightforest.zombie_wall_skull_candle": "Zombie-Wandschädelkerze", + "commands.tffeature.center": "Zentrum des Merkmals: %s", + "commands.tffeature.chunk": "In Feature Chunk sind: %s", + "commands.tffeature.nearest": "Das nächstgelegene Merkmal ist %s", + "commands.tffeature.none_nearby": "Konnte kein Feature in der Nähe finden!", + "commands.tffeature.not_in_twilight_forest": "Du befindest dich nicht in der Dimension Dämmerwald", + "commands.tffeature.structure.conquer.status": "Struktur erobern Flagge: %s", + "commands.tffeature.structure.conquer.update": "Struktureroberungsflagge war %s, Änderung auf %s", + "commands.tffeature.structure.inside": "Sie befinden sich in einer Meilenstein-Struktur", + "commands.tffeature.structure.outside": "Sie befinden sich nicht in einer Meilenstein-Struktur", + "commands.tffeature.structure.required": "Du bist nicht in einer Struktur", + "commands.tffeature.structure.spawn_info": "%s, Gewichtung %s", + "commands.tffeature.structure.spawn_list": "Spawnliste für dieses Gebiet:", + "death.attack.twilightforest.axing": "%1$s wurde von %2$s zerhackt", + "death.attack.twilightforest.axing.item": "%1$s wurde von %2$s mit %3$s zerhackt", + "death.attack.twilightforest.chillingBreath": "%1$s wurde von der Schneekönigin zu Tode gefroren", + "death.attack.twilightforest.chillingBreath.player": "%1$s wurde von der Schneekönigin auf der Flucht vor %2$s zu Tode gefroren", + "death.attack.twilightforest.frozen": "%1$s wurde von %2$s mit einer Eisbombe eingefroren", + "death.attack.twilightforest.frozen.item": "%1$s wurde von %2$s mit %3$s eingefroren", + "death.attack.twilightforest.ghastTear": "%1$s wurde von feurigen Tränen verbrüht", + "death.attack.twilightforest.ghastTear.player": "%1$s wurde auf der Flucht vor %2$s von feurigen Tränen verbrüht", + "death.attack.twilightforest.haunt": "%1$s schloss sich dem Spuk von %2$s an", + "death.attack.twilightforest.hydraBite": "%1$s wurde die Haut von der Hydra abgezogen", + "death.attack.twilightforest.hydraBite.player": "%1$s Haut wurde von der Hydra auf der Flucht vor %2$s abgerissen", + "death.attack.twilightforest.hydraFire": "%1$s wurde bei lebendigem Leib von der Hydra geröstet", + "death.attack.twilightforest.hydraFire.player": "%1$s wurde auf der Flucht vor %2$s von der Hydra lebendig geröstet", + "death.attack.twilightforest.leafBrain": "Das Gehirn von %1$s wurde von %2$s in Blätter verwandelt", + "death.attack.twilightforest.leafBrain.item": "Das Gehirn von %1$s wurde von %2$s mit %3$s in Blätter verwandelt", + "death.attack.twilightforest.lichBolt": "Der Lich hat besser gezielt als %1$s", + "death.attack.twilightforest.lichBolt.player": "Der Lich und %2$s hatten besser gezielt als %1$s", + "death.attack.twilightforest.lichBomb": "%1$s ist der explosiven Magie des Lichs erlegen", + "death.attack.twilightforest.lichBomb.player": "%1$s ist auf der Flucht vor %2$s der explosiven Magie des Lichs erlegen", + "death.attack.twilightforest.lostWords": "%1$s wusste nicht mehr weiter, nachdem er von %2$s getötet wurde", + "death.attack.twilightforest.lostWords.item": "%1$s wusste nicht mehr weiter, nachdem er von %2$s mit %3$s getötet wurde", + "death.attack.twilightforest.moonworm": "%1$s wurde von Moonworm zerhackt", + "death.attack.twilightforest.schooled": "%1$s wurde von %2$s geschult", + "death.attack.twilightforest.schooled.item": "%1$s wurde von %2$s mit %3$s geschult", + "death.attack.twilightforest.scorched": "%1$s wurde von %2$s verbrannt", + "death.attack.twilightforest.scorched.item": "%1$s wurde von %2$s mit %3$s verbrannt", + "death.attack.twilightforest.snowballFight": "%1$s verlor eine Schneeballschlacht gegen %2$s", + "death.attack.twilightforest.snowballFight.item": "%1$s hat eine Schneeballschlacht gegen %2$s mit %3$s verloren", + "death.attack.twilightforest.squish": "%1$s wurde von der Schneekönigin zerquetscht", + "death.attack.twilightforest.squish.player": "%1$s wurde auf der Flucht vor %2$s von der Schneekönigin zerquetscht", + "death.attack.twilightforest.thorns": "%1$s ist in ein paar Dornen gelaufen", + "death.attack.twilightforest.thorns.player": "%1$s ist auf der Flucht vor %2$s in ein paar Dornen gelaufen", + "death.attack.twilightforest.thrownAxe": "%1$s wurde durch eine geworfene Axt enthauptet", + "death.attack.twilightforest.thrownAxe.player": "%1$s wurde auf der Flucht vor %2$s durch eine geworfene Axt enthauptet", + "death.attack.twilightforest.thrownPickaxe": "%1$s wurde durch eine geworfene Spitzhacke enthauptet", + "death.attack.twilightforest.thrownPickaxe.player": "%1$s wurde auf der Flucht vor %2$s durch eine geworfene Spitzhacke enthauptet", + "death.attack.twilightforest.yeeted": "%1$s wurde zum letzten Mal von %2$s geschleudert", + "death.attack.twilightforest.yeeted.item": "%1$s wurde zum letzten Mal von %2$s geschleudert, während er irgendwie %3$s hielt", + "effect.twilightforest.frosted": "Vereist", + "enchantment.twilightforest.chill_aura": "Kälte-Aura", + "enchantment.twilightforest.chill_aura.desc": "Fügt dem Angreifer eine Chance hinzu, den Frosteffekt zu erhalten, nachdem er den Träger getroffen hat.", + "enchantment.twilightforest.destruction": "Zerstörung", + "enchantment.twilightforest.destruction.desc": "Vergrößert den Zerstörungsbereich von Blöcken und Ketten.", + "enchantment.twilightforest.fire_react": "Feuerreaktion", + "enchantment.twilightforest.fire_react.desc": "Fügt eine Chance hinzu, dass der Angreifer in Brand gesteckt wird, nachdem er den Träger getroffen hat.", + "entity.twilightforest.alpha_yeti": "Alpha-Yeti", + "entity.twilightforest.armored_giant": "Gepanzerter Riese", + "entity.twilightforest.bighorn_sheep": "Dickhornschaf", + "entity.twilightforest.blockchain_goblin": "Morgenstern-Goblin", + "entity.twilightforest.carminite_broodling": "Karminitkrabbler", + "entity.twilightforest.carminite_ghastguard": "Karminit-Ghastwächter", + "entity.twilightforest.carminite_ghastling": "Karminit-Ghastling", + "entity.twilightforest.carminite_golem": "Karminit-Golem", + "entity.twilightforest.chain_block": "Kettenhammer", + "entity.twilightforest.charm_effect": "Runeneffekte", + "entity.twilightforest.cube_of_annihilation": "Würfel der Zerstörung", + "entity.twilightforest.death_tome": "Todeswälzer", + "entity.twilightforest.dwarf_rabbit": "Zwergkaninchen", + "entity.twilightforest.falling_ice": "Fallender Eis", + "entity.twilightforest.fire_beetle": "Feuerkäfer", + "entity.twilightforest.giant_miner": "Bergriese", + "entity.twilightforest.hedge_spider": "Heckenspinne", + "entity.twilightforest.helmet_crab": "Helmgrabbe", + "entity.twilightforest.hostile_wolf": "Böser Wolf", + "entity.twilightforest.hydra_mortar": "Hydramörtel", + "entity.twilightforest.ice_arrow": "Eispfeil", + "entity.twilightforest.ice_crystal": "Eiskristall", + "entity.twilightforest.ice_snowball": "Eisschneeball", + "entity.twilightforest.king_spider": "Spinnenkönig", + "entity.twilightforest.knight_phantom": "Phantomritter", + "entity.twilightforest.lich_bolt": "Strahl des Lichs", + "entity.twilightforest.lich_bomb": "Explosiver Strahl des Lichs", + "entity.twilightforest.lich_minion": "Diener des Lichs", + "entity.twilightforest.lower_goblin_knight": "Ritter-Goblin", + "entity.twilightforest.loyal_zombie": "Loyaler Zombie", + "entity.twilightforest.maze_slime": "Labyrinthschleim", + "entity.twilightforest.minoshroom": "Minoschwammerl", + "entity.twilightforest.minotaur": "Minotaurus", + "entity.twilightforest.mist_wolf": "Nebelwolf", + "entity.twilightforest.moonworm_shot": "Mondwurm", + "entity.twilightforest.mosquito_swarm": "Mückenschwarm", + "entity.twilightforest.nature_bolt": "Strahl der Natur", + "entity.twilightforest.penguin": "Pinguin", + "entity.twilightforest.pinch_beetle": "Zangenkäfer", + "entity.twilightforest.protection_box": "Fortschrittsschutz-Box", + "entity.twilightforest.quest_ram": "Schatz-Schafbock", + "entity.twilightforest.redcap_sapper": "Rotkäppchenarbeiter", + "entity.twilightforest.seeker_arrow": "Zielbogen", + "entity.twilightforest.skeleton_druid": "Skelettdruide", + "entity.twilightforest.slider": "Schiebefalle", + "entity.twilightforest.slime_beetle": "Schleimkäfer", + "entity.twilightforest.slime_blob": "Schleimklecks", + "entity.twilightforest.snow_guardian": "Schneewächter", + "entity.twilightforest.snow_queen": "Schneekönigin", + "entity.twilightforest.stable_ice_core": "Stabiler Eiskern", + "entity.twilightforest.swarm_spider": "Schwarmspinne", + "entity.twilightforest.thrown_wep": "Wurfwaffen", + "entity.twilightforest.tiny_bird": "Kleiner Vogel", + "entity.twilightforest.tome_bolt": "Strahl des Todeswälzers", + "entity.twilightforest.towerwood_borer": "Turmholzwurm", + "entity.twilightforest.unstable_ice_core": "Instabiler Eiskern", + "entity.twilightforest.upper_goblin_knight": "Oberritter-Goblin", + "entity.twilightforest.wand_bolt": "Strahl des Zepters", + "entity.twilightforest.winter_wolf": "Winterwolf", + "item.twilightforest.alpha_yeti_banner_pattern": "Bannermuster", + "item.twilightforest.alpha_yeti_banner_pattern.desc": "Alpha-Yeti-Gesicht", + "item.twilightforest.alpha_yeti_fur": "Alpha-Yetifell", + "item.twilightforest.alpha_yeti_spawn_egg": "Alpha-Yeti-Spawn-Ei", + "item.twilightforest.arctic_boots": "Arktistiefel", + "item.twilightforest.arctic_chestplate": "Arktisjacke", + "item.twilightforest.arctic_fur": "Arktispelz", + "item.twilightforest.arctic_helmet": "Arktiskapuze", + "item.twilightforest.arctic_leggings": "Arktishose", + "item.twilightforest.armor_shard": "Rüstungsscherbe", + "item.twilightforest.armor_shard_cluster": "Rüstungsscherbencluster", + "item.twilightforest.armored_giant_spawn_egg": "Gepanzerter-Riese-Spawn-Ei", + "item.twilightforest.bighorn_sheep_spawn_egg": "Dickhornschaf-Spawn-Ei", + "item.twilightforest.block_and_chain": "Morgenstern", + "item.twilightforest.blockchain_goblin_spawn_egg": "Morgenstern-Goblin-Spawn-Ei", + "item.twilightforest.borer_essence": "Wurmessenz", + "item.twilightforest.brittle_potion_flask": "Spröde Trankflasche", + "item.twilightforest.carminite": "Karminit", + "item.twilightforest.carminite_broodling_spawn_egg": "Karminitkrabbler-Spawn-Ei", + "item.twilightforest.carminite_ghastguard_spawn_egg": "Carminite Ghastwächter-Spawn-Ei", + "item.twilightforest.carminite_ghastling_spawn_egg": "Carminite Ghastling-Spawn-Ei", + "item.twilightforest.carminite_golem_spawn_egg": "Karminit-Golem-Spawn-Ei", + "item.twilightforest.charm_of_keeping_1": "Totem der Bewahrung I", + "item.twilightforest.charm_of_keeping_2": "Totem der Bewahrung II", + "item.twilightforest.charm_of_keeping_3": "Totem der Bewahrung III", + "item.twilightforest.charm_of_life_1": "Totem des Lebens I", + "item.twilightforest.charm_of_life_2": "Totem des Lebens II", + "item.twilightforest.cooked_meef": "Meefsteak", + "item.twilightforest.cooked_venison": "Hirschsteak", + "item.twilightforest.crumble_horn": "Bröckelhorn", + "item.twilightforest.cube_of_annihilation": "Würfel der Zerstörung", + "item.twilightforest.cube_talisman": "Token des Würfels der Zerstörung", + "item.twilightforest.death_tome_spawn_egg": "Todeswälzer-Spawn-Ei", + "item.twilightforest.diamond_minotaur_axe": "Diamantaxt des Minotaurus", + "item.twilightforest.dwarf_rabbit_spawn_egg": "Zwergkaninchen-Spawn-Ei", + "item.twilightforest.ender_bow": "Enderbogen", + "item.twilightforest.fiery_blood": "Feuerblut", + "item.twilightforest.fiery_boots": "Feuerstiefel", + "item.twilightforest.fiery_chestplate": "Feuerharnisch", + "item.twilightforest.fiery_helmet": "Feuerhelm", + "item.twilightforest.fiery_ingot": "Feuerbarren", + "item.twilightforest.fiery_leggings": "Feuerbeinschutz", + "item.twilightforest.fiery_pickaxe": "Feuerspitzhacke", + "item.twilightforest.fiery_sword": "Feuerschwert", + "item.twilightforest.fiery_tears": "Feuertränen", + "item.twilightforest.filled_magic_map": "Magische Karte", + "item.twilightforest.filled_maze_map": "Labyrinthkarte", + "item.twilightforest.filled_ore_map": "Labyrinth-Erzkarte", + "item.twilightforest.fire_beetle_spawn_egg": "Feuerkäfer-Spawn-Ei", + "item.twilightforest.fortification_scepter": "Zepter des Schildes", + "item.twilightforest.giant_miner_spawn_egg": "Bergriese-Spawn-Ei", + "item.twilightforest.giant_pickaxe": "Spitzhacke des Riesen", + "item.twilightforest.giant_sword": "Schwert der Riesen", + "item.twilightforest.glass_sword": "Glasschwert", + "item.twilightforest.gold_minotaur_axe": "Goldaxt des Minotaurus", + "item.twilightforest.greater_potion_flask": "Große Trankflasche", + "item.twilightforest.hedge_spider_spawn_egg": "Heckenspinne-Spawn-Ei", + "item.twilightforest.helmet_crab_spawn_egg": "Einsiedlerkrebs-Spawn-Ei", + "item.twilightforest.hostile_wolf_spawn_egg": "Böser-Wolf-Spawn-Ei", + "item.twilightforest.hydra_banner_pattern": "Bannermuster", + "item.twilightforest.hydra_banner_pattern.desc": "Hydra-Flamme", + "item.twilightforest.hydra_chop": "Hydrakotelett", + "item.twilightforest.hydra_spawn_egg": "Hydra-Spawn-Ei", + "item.twilightforest.ice_bomb": "Eisbombe", + "item.twilightforest.ice_bow": "Eisbogen", + "item.twilightforest.ice_crystal_spawn_egg": "Eiskristall-Spawn-Ei", + "item.twilightforest.ice_sword": "Eisschwert", + "item.twilightforest.ironwood_axe": "Eisenholzaxt", + "item.twilightforest.ironwood_boots": "Eisenholzstiefel", + "item.twilightforest.ironwood_chestplate": "Eisenholzharnisch", + "item.twilightforest.ironwood_helmet": "Eisenholzhelm", + "item.twilightforest.ironwood_hoe": "Eisenholzhacke", + "item.twilightforest.ironwood_ingot": "Eisenholzbarren", + "item.twilightforest.ironwood_leggings": "Eisenholzbeinschutz", + "item.twilightforest.ironwood_pickaxe": "Eisenholzspitzhacke", + "item.twilightforest.ironwood_shovel": "Eisenholzschaufel", + "item.twilightforest.ironwood_sword": "Eisenholzschwert", + "item.twilightforest.king_spider_spawn_egg": "Spinnenkönig-Spawn-Ei", + "item.twilightforest.knight_phantom_banner_pattern": "Bannermuster", + "item.twilightforest.knight_phantom_banner_pattern.desc": "Ritterhelm", + "item.twilightforest.knight_phantom_spawn_egg": "Phantomritter-Spawn-Ei", + "item.twilightforest.knightmetal_axe": "Ritterliche Axt", + "item.twilightforest.knightmetal_boots": "Ritterliche Stiefel", + "item.twilightforest.knightmetal_chestplate": "Ritterlicher Harnisch", + "item.twilightforest.knightmetal_helmet": "Ritterlicher Helm", + "item.twilightforest.knightmetal_ingot": "Rittermetallbarren", + "item.twilightforest.knightmetal_leggings": "Ritterlicher Beinschutz", + "item.twilightforest.knightmetal_pickaxe": "Ritterliche Spitzhacke", + "item.twilightforest.knightmetal_ring": "Ritermetallkettenglied", + "item.twilightforest.knightmetal_shield": "Ritterliches Schild", + "item.twilightforest.knightmetal_sword": "Ritterliches Schwert", + "item.twilightforest.kobold_spawn_egg": "Kobold-Spawn-Ei", + "item.twilightforest.lamp_of_cinders": "Lampe der Asche", + "item.twilightforest.lich_banner_pattern": "Bannermuster", + "item.twilightforest.lich_banner_pattern.desc": "Krone des Lichs", + "item.twilightforest.lifedrain_scepter": "Zepter des Lebensaugers", + "item.twilightforest.liveroot": "Lebenswurzel", + "item.twilightforest.lower_goblin_knight_spawn_egg": "Goblin-Ritter-Spawn-Ei", + "item.twilightforest.magic_beans": "Magische Bohne", + "item.twilightforest.magic_map": "Leere magische Karte", + "item.twilightforest.magic_map_focus": "Magischer Kartenfokus", + "item.twilightforest.maze_map": "Leere Labyrinthkarte", + "item.twilightforest.maze_map_focus": "Labyrinthkartenfokus", + "item.twilightforest.maze_slime_spawn_egg": "Labyrinthschleim-Spawn-Ei", + "item.twilightforest.maze_wafer": "Labyrinthwaffel", + "item.twilightforest.mazebreaker_pickaxe": "Labyrinthbrecher", + "item.twilightforest.minoshroom_banner_pattern": "Bannermuster", + "item.twilightforest.minoshroom_banner_pattern.desc": "Minoshwammerl-Äxte", + "item.twilightforest.minoshroom_spawn_egg": "Minoschwammerl-Spawn-Ei", + "item.twilightforest.minotaur_spawn_egg": "Minotaurus-Spawn-Ei", + "item.twilightforest.mist_wolf_spawn_egg": "Nebelwolf-Spawn-Ei", + "item.twilightforest.moon_dial": "Mondscheibe", + "item.twilightforest.moonworm_queen": "Mondwurmkönigin", + "item.twilightforest.mosquito_swarm_spawn_egg": "Mückenschwarm-Spawn-Ei", + "item.twilightforest.music_disc_findings": "Musik-CD", + "item.twilightforest.music_disc_home": "Musik-CD", + "item.twilightforest.music_disc_maker": "Musik-CD", + "item.twilightforest.music_disc_maker.desc": "MrCompost - MAker", + "item.twilightforest.music_disc_motion": "Musik-CD", + "item.twilightforest.music_disc_radiance": "Musik-CD", + "item.twilightforest.music_disc_steps": "Musik-CD", + "item.twilightforest.music_disc_superstitious": "Musik-CD", + "item.twilightforest.music_disc_thread": "Musik-CD", + "item.twilightforest.music_disc_wayfarer": "Musik-CD", + "item.twilightforest.naga_banner_pattern": "Bannermuster", + "item.twilightforest.naga_banner_pattern.desc": "Nagaschuppen", + "item.twilightforest.naga_chestplate": "Nagaschuppenharnisch", + "item.twilightforest.naga_leggings": "Nagaschuppenbeinschutz", + "item.twilightforest.naga_scale": "Nagaschuppe", + "item.twilightforest.naga_spawn_egg": "Naga-Spawn-Ei", + "item.twilightforest.ore_magnet": "Erzmagnet", + "item.twilightforest.ore_map": "Leere Labyrinth-Erzkarte", + "item.twilightforest.ore_meter": "Erzmessgerät [WIP]", + "item.twilightforest.peacock_feather_fan": "Pfauenfächer", + "item.twilightforest.penguin_spawn_egg": "Pinguin-Spawn-Ei", + "item.twilightforest.phantom_chestplate": "Phantomrüstung", + "item.twilightforest.phantom_helmet": "Phantomhelm", + "item.twilightforest.pinch_beetle_spawn_egg": "Zangenkäfer-Spawn-Ei", + "item.twilightforest.quest_ram_banner_pattern": "Bannermuster", + "item.twilightforest.quest_ram_banner_pattern.desc": "Schatz-Schafbock Wirbel", + "item.twilightforest.quest_ram_spawn_egg": "Schafbock-der-Schatzsuche-Spawn-Ei", + "item.twilightforest.raven_feather": "Rabenfeder", + "item.twilightforest.raw_ironwood": "Eisenholzmaterialien", + "item.twilightforest.raw_meef": "Rohes Meeffleisch", + "item.twilightforest.raw_venison": "Roher Hirsch", + "item.twilightforest.redcap_sapper_spawn_egg": "Rotkäppchenarbeiter-Spawn-Ei", + "item.twilightforest.seeker_bow": "Zielbogen", + "item.twilightforest.skeleton_druid_spawn_egg": "Skelettdruide-Spawn-Ei", + "item.twilightforest.skull_candle.desc": "Hat: %s %s Kerze", + "item.twilightforest.skull_candle.desc.multiple": "Hat: %s %s Kerzen", + "item.twilightforest.slime_beetle_spawn_egg": "Schleimkäfer-Spawn-Ei", + "item.twilightforest.snow_guardian_spawn_egg": "Schneewächter-Spawn-Ei", + "item.twilightforest.snow_queen_banner_pattern": "Bannermuster", + "item.twilightforest.snow_queen_banner_pattern.desc": "Krone der Schneekönigin", + "item.twilightforest.snow_queen_spawn_egg": "Schneekönigin-Spawn-Ei", + "item.twilightforest.stable_ice_core_spawn_egg": "Stabiler Eiskern-Spawn-Ei", + "item.twilightforest.steeleaf_axe": "Stahlblattaxt", + "item.twilightforest.steeleaf_boots": "Stahlblattstiefel", + "item.twilightforest.steeleaf_chestplate": "Stahlblattharnisch", + "item.twilightforest.steeleaf_helmet": "Stahlblatthelm", + "item.twilightforest.steeleaf_hoe": "Stahlblatthacke", + "item.twilightforest.steeleaf_ingot": "Stahlblatt", + "item.twilightforest.steeleaf_leggings": "Stahlblattbeinschutz", + "item.twilightforest.steeleaf_pickaxe": "Stahlblattspitzhacke", + "item.twilightforest.steeleaf_shovel": "Stahlblattschaufel", + "item.twilightforest.steeleaf_sword": "Stahlblattschwert", + "item.twilightforest.swarm_spider_spawn_egg": "Schwarmspinne-Spawn-Ei", + "item.twilightforest.tiny_bird_spawn_egg": "Kleiner-Vogel-Spawn-Ei", + "item.twilightforest.torchberries": "Fackelbeeren", + "item.twilightforest.tower_key": "Turmschlüssel", + "item.twilightforest.towerwood_borer_spawn_egg": "Turmholzwurm-Spawn-Ei", + "item.twilightforest.transformation_powder": "Wandelpulver", + "item.twilightforest.twilight_scepter": "Zepter des Zwielichts", + "item.twilightforest.unstable_ice_core_spawn_egg": "Unstabiler Eiskern-Spawn-Ei", + "item.twilightforest.ur_ghast_banner_pattern": "Bannermuster", + "item.twilightforest.ur_ghast_banner_pattern.desc": "Karminit Rand", + "item.twilightforest.ur_ghast_spawn_egg": "Ur-Ghast-Spawn-Ei", + "item.twilightforest.winter_wolf_spawn_egg": "Winterwolf-Spawn-Ei", + "item.twilightforest.yeti_boots": "Yetistiefel", + "item.twilightforest.yeti_chestplate": "Yetijacke", + "item.twilightforest.yeti_helmet": "Gehörnter Yetihelm", + "item.twilightforest.yeti_leggings": "Yetihose", + "item.twilightforest.yeti_spawn_egg": "Yeti-Spawn-Ei", + "item.twilightforest.zombie_scepter": "Zombiezepter", + "itemGroup.twilightforest.blocks": "Dämmerwald: Blöcke", + "itemGroup.twilightforest.equipment": "Dämmerwald: Ausrüstung", + "itemGroup.twilightforest.items": "Dämmerwald: Items", + "stat.twilightforest.e115_slices_eaten": "Experiment 115 gegessene Scheiben", + "stat.twilightforest.tf_shields_broken": "Festungsschilde gebrochen", + "stat.twilightforest.torchberries_harvested": "Fackelbeeren geerntet", + "stat.twilightforest.trophy_pedestals_activated": "Trophäensockel aktiviert", + "stat.twilightforest.uncrafting_table_interactions": "Interaktionen mit der Zerlegebank", + "structure.twilightforest.labyrinth": "Minotauruslabyrinth", + "subtitles.twilightforest.block.bug.squish": "Der Käfer wird zerquetscht :(", + "subtitles.twilightforest.block.casket.close": "Andenkenschatulle schließt", + "subtitles.twilightforest.block.casket.locked": "Andenkenschatulle klickt", + "subtitles.twilightforest.block.casket.open": "Andenkenschatulle öffnet sich", + "subtitles.twilightforest.block.core.time": "Baum der Zeit tickt", + "subtitles.twilightforest.block.core.transformation": "Baum der Transformation summt", + "subtitles.twilightforest.block.door.reappear": "Das Schlosstor erscheint wieder", + "subtitles.twilightforest.block.door.vanish": "Schlosstür verschwindet", + "subtitles.twilightforest.block.ghast_trap.ambient": "Ghastfalle dingt", + "subtitles.twilightforest.block.ghast_trap.spindown": "Ghastfalle schaltet ab", + "subtitles.twilightforest.block.ghast_trap.warmup": "Ghastfalle wärmt sich auf", + "subtitles.twilightforest.block.jet.active": "Feuerjet flackert", + "subtitles.twilightforest.block.jet.pop": "Feuerjet knallt", + "subtitles.twilightforest.block.reactor.ambient": "Karminit-Reaktor macht wuusch", + "subtitles.twilightforest.block.torchberry.harvest": "Fackelbeeren knallen", + "subtitles.twilightforest.block.vanish.unlock": "Turmholz-Tür entriegelt", + "subtitles.twilightforest.entity.boar.ambient": "Wildschwein grunzt", + "subtitles.twilightforest.entity.boar.death": "Wildschwein stirbt", + "subtitles.twilightforest.entity.boar.hurt": "Wildschwein nimmt Schaden", + "subtitles.twilightforest.entity.deer.ambient": "Hirsch muht", + "subtitles.twilightforest.entity.deer.death": "Hirsch stirbt", + "subtitles.twilightforest.entity.deer.hurt": "Hirsch nimmt Schaden", + "subtitles.twilightforest.entity.dwarf_rabbit.ambient": "Zwergkaninchen quietscht", + "subtitles.twilightforest.entity.dwarf_rabbit.death": "Zwergkaninchen stirbt", + "subtitles.twilightforest.entity.dwarf_rabbit.hurt": "Zwergkaninchen tut weh", + "subtitles.twilightforest.entity.hydra.growl": "Hydra knurrt", + "subtitles.twilightforest.entity.hydra.hurt": "Hydra nimmt Schaden", + "subtitles.twilightforest.entity.hydra.roar": "Hydra brüllt", + "subtitles.twilightforest.entity.hydra.warn": "Hydra bereitet sich auf den Biss vor", + "subtitles.twilightforest.entity.ice.death": "Eiskern stirbt", + "subtitles.twilightforest.entity.ice.hurt": "Eiskern nimmt Schaden", + "subtitles.twilightforest.entity.kobold.ambient": "Kobold murrt", + "subtitles.twilightforest.entity.kobold.death": "Kobold stirbt", + "subtitles.twilightforest.entity.kobold.hurt": "Kobold nimmt Schaden", + "subtitles.twilightforest.entity.kobold.munch": "Kobold knabbert an Essen", + "subtitles.twilightforest.entity.lich.ambient": "Lich atmet", + "subtitles.twilightforest.entity.lich.death": "Lich stirbt", + "subtitles.twilightforest.entity.lich.hurt": "Lich nimmt Schaden", + "subtitles.twilightforest.entity.lich.shoot": "Lich schießt", + "subtitles.twilightforest.entity.lich.teleport": "Lich teleportiert", + "subtitles.twilightforest.entity.minion.ambient": "Diener des Lichs murrt", + "subtitles.twilightforest.entity.minion.death": "Diener des Lichs stirbt", + "subtitles.twilightforest.entity.minion.hurt": "Diener des Lichs nimmt Schaden", + "subtitles.twilightforest.entity.minion.summon": "Lich erzeugt neuen Diener", + "subtitles.twilightforest.entity.minoshroom.ambient": "Minoschwammerl muht", + "subtitles.twilightforest.entity.minoshroom.death": "Minoschwammerl stirbt", + "subtitles.twilightforest.entity.minoshroom.hurt": "Minoschwammerl nimmt Schaden", + "subtitles.twilightforest.entity.minoshroom.slam": "Minoshroom haut auf den Boden", + "subtitles.twilightforest.entity.minotaur.ambient": "Minotaurus muht", + "subtitles.twilightforest.entity.minotaur.death": "Minotaurus stirbt", + "subtitles.twilightforest.entity.minotaur.hurt": "Minotaurus nimmt Schaden", + "subtitles.twilightforest.entity.mosquito.ambient": "Mücke summt", + "subtitles.twilightforest.entity.naga.hiss": "Naga zischt", + "subtitles.twilightforest.entity.naga.hurt": "Naga nimmt Schaden", + "subtitles.twilightforest.entity.naga.rattle": "Naga klappert", + "subtitles.twilightforest.entity.raven.caw": "Waldrabe krächzt", + "subtitles.twilightforest.entity.redcap.ambient": "Rotkäppchen kichert", + "subtitles.twilightforest.entity.redcap.death": "Rotkäppchen stöhnt in Qualen", + "subtitles.twilightforest.entity.redcap.hurt": "Rotkäppchen kreischt vor Schmerz", + "subtitles.twilightforest.entity.tear.break": "Ur-Ghasts Träne zerbricht", + "subtitles.twilightforest.entity.wraith.ambient": "Gespenst keucht", + "subtitles.twilightforest.entity.wraith.death": "Gespenst stirbt", + "subtitles.twilightforest.entity.wraith.hurt": "Gespenst nimmt Schaden", + "subtitles.twilightforest.entity.yeti.death": "Yeti stirbt", + "subtitles.twilightforest.entity.yeti.growl": "Yeti knurrt", + "subtitles.twilightforest.entity.yeti.hurt": "Yeti nimmt Schaden", + "subtitles.twilightforest.item.charm.keep": "Charme der Aufbewahrung von zurückgegebenen Gegenständen", + "subtitles.twilightforest.item.flask.break": "Spröde Flasche zerbricht", + "subtitles.twilightforest.item.flask.crack": "Spröde Flasche bricht", + "subtitles.twilightforest.item.flask.fill": "Trankfläschchen füllt sich", + "subtitles.twilightforest.item.moonworm.squish": "Mondwurm brennt", + "subtitles.twilightforest.item.scepter.drain": "Lebenszepter entleert sich", + "subtitles.twilightforest.item.scepter.pearl": "Dämmerung-Szepter wirft Perle", + "twilightforest.book.darktower.1": "§8[[Das Notizbuch eines Entdeckers, das eine Explosion überlebt zu haben scheint]]§0\n\nDieser Turm hat eindeutig Mechanismen, die nicht auf mich reagieren. Ihre Magie sehnt sich fast danach, sie anzuerkennen meine Berührung, aber es kann nicht. Es ist als die Geräte des Turms", + "twilightforest.book.darktower.2": "unterdrückt von einer mächtigen Gruppe von Wesen in der Nähe würden.\n\n§8[[Nächster Eintrag]]§0\n\nDie Magie scheint aus den Tiefen der Festungen in der Nähe zu kommen. Es kann nicht von den Goblins kommen, da ihre Magie charmant, aber unkonzentriert ist.", + "twilightforest.book.darktower.3": "Es muss immer noch eine Kraft in den Festungen aktiv sein.\n\n§8[[Nächster Eintrag]]§0\n\nMeine Analyse zeigt, dass es aus mehreren Quellen stammt und operiert als Gruppe. Ich werde zurück zur Festung gehen, nachdem ich Nachschub geleistet habe..." +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/el_gr.json b/src/main/resources/assets/twilightforest/lang/el_gr.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/el_gr.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/en_US.lang b/src/main/resources/assets/twilightforest/lang/en_US.lang deleted file mode 100644 index 85345ee007..0000000000 --- a/src/main/resources/assets/twilightforest/lang/en_US.lang +++ /dev/null @@ -1,441 +0,0 @@ - -tile.TFLog.0.name=Twilight Oak Wood -tile.TFLog.1.name=Canopy Tree Wood -tile.TFLog.2.name=Mangrove Wood -tile.TFLog.3.name=Darkwood Wood -tile.TFLeaves.0.name=Twilight Oak Leaves -tile.TFLeaves.1.name=Canopy Tree Leaves -tile.TFLeaves.2.name=Mangrove Leaves -tile.TFLeaves.3.name=Rainbow Oak Leaves -tile.TFFirefly.name=Firefly -tile.TFCicada.name=Cicada -tile.TFPortal.name=Twilight Forest Portal -tile.TFMazestone.0.name=Mazestone -tile.TFMazestone.1.name=Mazestone Brick -tile.TFMazestone.2.name=Chiseled Mazestone -tile.TFMazestone.3.name=Decorative Mazestone Brick -tile.TFMazestone.4.name=Cracked Mazestone Brick -tile.TFMazestone.5.name=Mossy Mazestone Brick -tile.TFMazestone.6.name=Mazestone Mosaic -tile.TFMazestone.7.name=Mazestone Border -tile.TFMazestone.8.name=Mazestone Ceiling -tile.TFHedge.0.name=Hedge -tile.TFHedge.1.name=Darkwood Leaves -tile.TFHedge.2.name=Hedge -tile.TFBossSpawner.0.name=Naga Spawner -tile.TFBossSpawner.1.name=Lich Spawner -tile.TFBossSpawner.2.name=Hydra Spawner -tile.TFBossSpawner.3.name=Ur-ghast Spawner -tile.TFBossSpawner.4.name=Knight Phantoms Spawner -tile.TFFireflyJar.name=Firefly Jar -tile.TFPlant.3.name=Moss Patch -tile.TFPlant.4.name=Mayapple -tile.TFPlant.5.name=Clover Patch [WIP] -tile.TFPlant.8.name=Fiddlehead -tile.TFPlant.9.name=Mushgloom -tile.TFPlant.10.name=Forest Grass -tile.TFPlant.11.name=Dried Bush -tile.TFPlant.13.name=Torchberry Plant -tile.TFPlant.14.name=Root Strands -tile.TFRoots.0.name=Roots -tile.TFRoots.1.name=Liveroots -tile.TFUncraftingTable.name=Uncrafting Table -tile.TFFireJet.0.name=Smoking block -tile.TFFireJet.1.name=Encased Smoker -tile.TFFireJet.2.name=Encased Smoker -tile.TFFireJet.8.name=Fire Jet -tile.TFFireJet.9.name=Popping Fire Jet -tile.TFFireJet.10.name=Flaming Fire Jet -tile.TFFireJet.11.name=Encased Fire Jet -tile.TFFireJet.12.name=Encased Popping Fire Jet -tile.TFFireJet.13.name=Encased Flaming Fire Jet -tile.TFNagastone.0.name=Nagastone Head -tile.TFNagastone.1.name=Nagastone Head -tile.TFNagastone.2.name=Nagastone Head -tile.TFNagastone.3.name=Nagastone Head -tile.TFNagastone.4.name=Nagastone -tile.TFNagastone.5.name=Nagastone -tile.TFNagastone.6.name=Nagastone -tile.TFNagastone.7.name=Nagastone -tile.TFNagastone.8.name=Nagastone -tile.TFNagastone.9.name=Nagastone -tile.TFNagastone.10.name=Nagastone -tile.TFNagastone.11.name=Nagastone -tile.TFNagastone.12.name=Nagastone -tile.TFNagastone.13.name=Nagastone -tile.TFNagastone.14.name=Nagastone -tile.TFNagastone.15.name=Nagastone -tile.TFSapling.0.name=Sickly Twilight Oak Sapling -tile.TFSapling.1.name=Canopy Tree Sapling -tile.TFSapling.2.name=Twilight Mangrove Sapling -tile.TFSapling.3.name=Darkwood Sapling -tile.TFSapling.4.name=Robust Twilight Oak Sapling -tile.TFSapling.5.name=Tree of Time Sapling -tile.TFSapling.6.name=Tree of Transformation Sapling -tile.TFSapling.7.name=Miner's Tree Sapling -tile.TFSapling.8.name=Sorting Tree Sapling -tile.TFSapling.9.name=Rainbow Oak Sapling -tile.TFMoonworm.name=Moonworm -tile.TFMagicLog.0.name=Timewood -tile.TFMagicLog.1.name=Transwood -tile.TFMagicLog.2.name=Minewood -tile.TFMagicLog.3.name=Sortingwood -tile.TFMagicLogSpecial.0.name=Timewood Clock -tile.TFMagicLogSpecial.1.name=Heart of Transformation -tile.TFMagicLogSpecial.2.name=Minewood Core -tile.TFMagicLogSpecial.3.name=Sortingwood Engine -tile.TFMagicLeaves.0.name=Timewood Leaves -tile.TFMagicLeaves.1.name=Leaves of Transformation -tile.TFMagicLeaves.2.name=Miner's Leaves -tile.TFMagicLeaves.3.name=Sorting Leaves -tile.TFTowerStone.0.name=Towerwood Planks -tile.TFTowerStone.1.name=Encased Towerwood -tile.TFTowerStone.2.name=Cracked Towerwood -tile.TFTowerStone.3.name=Mossy Towerwood -tile.TFTowerStone.4.name=Infested Towerwood -tile.TFTowerDevice.0.name=Reappearing Block -tile.TFTowerDevice.1.name=Active Reappearing Block -tile.TFTowerDevice.2.name=Vanishing Block -tile.TFTowerDevice.3.name=Active Vanishing Block -tile.TFTowerDevice.4.name=Locked Vanishing Block -tile.TFTowerDevice.5.name=Unlocked Vanishing Block -tile.TFTowerDevice.6.name=Carminite Builder -tile.TFTowerDevice.7.name=Active Carminite Builder -tile.TFTowerDevice.8.name=Inactive Carminite Builder -tile.TFTowerDevice.9.name=Anti-builder -tile.TFTowerDevice.10.name=Ghast Trap -tile.TFTowerDevice.11.name=Active Ghast Trap -tile.TFTowerDevice.12.name=Carminite Reactor -tile.TFTowerDevice.13.name=Active Carminite Reactor -tile.TFTowerTranslucent.0.name=Reappearing Block -tile.TFTowerTranslucent.1.name=Active Reappearing Block -tile.TFTowerTranslucent.2.name=Built Carminite Block -tile.TFTowerTranslucent.3.name=Active Built Carminite Block -tile.TFTowerTranslucent.4.name=Anti-built Block -tile.TFTowerTranslucent.5.name=Carminite Reactor Debris -tile.TFTowerTranslucent.6.name=False Gold -tile.TFTowerTranslucent.7.name=False Diamond -tile.TFTrophy.name=Twilight Forest Trophy -tile.TFShield.0.name=Stronghold Shield -tile.TFShield.1.name=Stronghold Shield -tile.TFShield.2.name=Stronghold Shield -tile.TFShield.3.name=Stronghold Shield -tile.TFShield.4.name=Stronghold Shield -tile.TFShield.5.name=Stronghold Shield -tile.TFShield.15.name=Stronghold Shield -tile.TFTrophyPedestal.0.name=Trophy Pedestal -tile.TFTrophyPedestal.15.name=Latent Trophy Pedestal -tile.TFAuroraBrick.name=Aurora Block -tile.TFUnderBrick.0.name=Underbrick -tile.TFUnderBrick.1.name=Mossy Underbrick -tile.TFUnderBrick.2.name=Cracked Underbrick -tile.TFThorns.brown.name=Thorns -tile.TFThorns.green.name=Green Thorns -tile.TFBurntThorns.name=Burnt Thorns -tile.TFThornRose.name=Thorn Rose -tile.TFLeaves3.0.name=Thorn Leaves -tile.TFLeaves3.1.name=Beanstalk Leaves -tile.TFDeadrock.surface.name=Weathered Deadrock -tile.TFDeadrock.cracked.name=Cracked Deadrock -tile.TFDeadrock.solid.name=Deadrock -tile.DarkLeaves.name=Darkwood Leaves -tile.AuroraPillar.name=Aurora Pillar -tile.AuroraSlab.name=Aurora Slab -tile.TrollSteinn.name=Trollsteinn -tile.WispyCloud.name=Wispy Cloud -tile.FluffyCloud.name=Fluffy Cloud -tile.GiantCobble.name=Giant Cobblestone -tile.GiantLog.name=Giant Log -tile.GiantLeaves.name=Giant Leaves -tile.GiantObsidian.name=Giant Obsidian -tile.UberousSoil.name=Uberous Soil -tile.HugeStalk.name=Huge Stalk -tile.HugeGloomBlock.name=Huge Mushgloom -tile.TrollVidr.name=Trollvidr -tile.UnripeTrollBer.name=Unripe Trollber -tile.TrollBer.name=Trollber -tile.TrollBer.name=Trollber -tile.KnightmetalBlock.name=Block of Knightmetal -tile.HugeLilyPad.name=Huge Lily Pad -tile.HugeWaterLily.name=Huge Water Lily -tile.Slider.0.name=Slide Trap -tile.Slider.1.name=Slide Trap 1 -tile.Slider.2.name=Slide Trap 2 -tile.Slider.3.name=Slide Trap 3 -tile.CastleBrick.0.name=Castle Brick -tile.CastleBrick.1.name=Worn Castle Brick -tile.CastleBrick.2.name=Cracked Castle Brick -tile.CastleBrick.3.name=Castle Roof Tile -tile.CastleMagic.0.name=Pink Castle Rune Brick -tile.CastleMagic.1.name=Blue Castle Rune Brick -tile.CastleMagic.2.name=Yellow Castle Rune Brick -tile.CastleMagic.3.name=Violet Castle Rune Brick -tile.ForceField.0.name=Violet Force Field -tile.ForceField.1.name=Pink Force Field -tile.ForceField.2.name=Orange Force Field -tile.ForceField.3.name=Green Force Field -tile.ForceField.4.name=Blue Force Field - -item.nagaScale.name=Naga Scale -item.plateNaga.name=Naga Scale Tunic -item.legsNaga.name=Naga Scale Leggings -item.scepterTwilight.name=Scepter of Twilight -item.scepterLifeDrain.name=Scepter of Life Draining -item.scepterZombie.name=Zombie Scepter -item.oreMeter.name=Ore Meter [WIP] -item.magicMap.name=Magic Map -item.mazeMap.name=Maze Map -item.oreMap.name=Maze/Ore Map -item.tfFeather.name=Raven's Feather -item.magicMapFocus.name=Magic Map Focus -item.mazeMapFocus.name=Maze Map Focus -item.liveRoot.name=Liveroot -item.ironwoodRaw.name=Raw Ironwood Materials -item.ironwoodIngot.name=Ironwood Ingot -item.ironwoodHelm.name=Ironwood Helm -item.ironwoodPlate.name=Ironwood Plate -item.ironwoodLegs.name=Ironwood Legs -item.ironwoodBoots.name=Ironwood Boots -item.ironwoodSword.name=Ironwood Sword -item.ironwoodShovel.name=Ironwood Shovel -item.ironwoodPick.name=Ironwood Pick -item.ironwoodAxe.name=Ironwood Axe -item.ironwoodHoe.name=Ironwood Hoe -item.torchberries.name=Torchberries -item.venisonRaw.name=Raw Venison -item.venisonCooked.name=Venison Steak -item.hydraChop.name=Hydra Chop -item.fieryBlood.name=Fiery Blood -item.fieryIngot.name=Fiery Ingot -item.fieryHelm.name=Fiery Helm -item.fieryPlate.name=Fiery Plate -item.fieryLegs.name=Fiery Legs -item.fieryBoots.name=Fiery Boots -item.fierySword.name=Fiery Sword -item.fieryPick.name=Fiery Pick -item.steeleafIngot.name=Steeleaf -item.steeleafHelm.name=Steeleaf Helm -item.steeleafPlate.name=Steeleaf Plate -item.steeleafLegs.name=Steeleaf Legs -item.steeleafBoots.name=Steeleaf Boots -item.steeleafSword.name=Steeleaf Sword -item.steeleafShovel.name=Steeleaf Shovel -item.steeleafPick.name=Steeleaf Pick -item.steeleafAxe.name=Steeleaf Axe -item.steeleafHoe.name=Steeleaf Hoe -item.minotaurAxe.name=Minotaur Axe -item.mazebreakerPick.name=Mazebreaker -item.transformPowder.name=Transformation Powder -item.meefRaw.name=Raw Meef -item.meefSteak.name=Meef Steak -item.meefStroganoff.name=Meef Stroganoff -item.mazeWafer.name=Maze Wafer -item.emptyMagicMap.name=Blank Magic Map -item.emptyMazeMap.name=Blank Maze Map -item.emptyOreMap.name=Blank Maze/Ore Map -item.oreMagnet.name=Ore Magnet -item.crumbleHorn.name=Crumble Horn -item.peacockFan.name=Peacock Feather Fan -item.moonwormQueen.name=Moonworm Queen -item.charmOfLife1.name=Charm of Life I -item.charmOfLife2.name=Charm of Life II -item.charmOfKeeping1.name=Charm of Keeping I -item.charmOfKeeping2.name=Charm of Keeping II -item.charmOfKeeping3.name=Charm of Keeping III -item.towerKey.name=Tower Key -item.borerEssence.name=Borer Essence -item.carminite.name=Carminite -item.trophy.hydra.name=Hydra Trophy -item.trophy.naga.name=Naga Trophy -item.trophy.lich.name=Lich Trophy -item.trophy.ur-ghast.name=Ur-ghast Trophy -item.trophy.snowQueen.name=Snow Queen Trophy -item.experiment115.name=Experiment 115 -item.armorShards.name=Armor Shard -item.knightMetal.name=Knightmetal Ingot -item.shardCluster.name=Armor Shard Cluster -item.knightlyHelm.name=Knightly Helm -item.knightlyPlate.name=Knightly Plate -item.knightlyLegs.name=Knightly Greaves -item.knightlyBoots.name=Knightly Boots -item.knightlySword.name=Knightly Sword -item.knightlyPick.name=Knightly Pick -item.knightlyAxe.name=Knightly Axe -item.phantomHelm.name=Phantom Helm -item.phantomPlate.name=Phantom Plate -item.lampOfCinders.name=Lamp of Cinders -item.fieryTears.name=Fiery Tears -item.iceBomb.name=Ice Bomb -item.yetiHelm.name=Yeti Horned Helm -item.yetiPlate.name=Yeti Jacket -item.yetiLegs.name=Yeti Leggings -item.yetiBoots.name=Yeti Boots -item.alphaFur.name=Alpha Yeti Fur -item.arcticFur.name=Arctic Fur -item.arcticHelm.name=Arctic Hood -item.arcticPlate.name=Arctic Jacket -item.arcticLegs.name=Arctic Leggings -item.arcticBoots.name=Arctic Boots -item.magicBeans.name=Magic Beans -item.giantPick.name=Giant's Pickaxe -item.giantSword.name=Giant's Sword -item.tripleBow.name=Tri-bow -item.seekerBow.name=Seeker Bow -item.iceBow.name=Ice Bow -item.enderBow.name=Ender Bow -item.iceSword.name=Ice Sword -item.glassSword.name=Glass Sword -item.knightmetalRing.name=Knightmetal Loop -item.chainBlock.name=Block and Chain -item.cubeTalisman.name=Talisman of the Cube -item.cubeOfAnnihilation.name=Cube of Annihilation - -item.minotaurAxe.tooltip=Extra damage while charging -item.knightlySword.tooltip=Extra damage to armored targets -item.knightlyPick.tooltip=Extra damage to armored targets -item.knightlyAxe.tooltip=Extra damage to unarmored targets -item.giantPick.tooltip=Breaks giant blocks -item.fieryPick.tooltip=Auto-smelting -item.fierySword.tooltip=Burns targets -item.fieryHelm.tooltip=Burns attackers -item.fieryPlate.tooltip=Burns attackers -item.fieryLegs.tooltip=Burns attackers -item.fieryBoots.tooltip=Burns attackers -item.yetiHelm.tooltip=Chills attackers -item.yetiPlate.tooltip=Chills attackers -item.yetiLegs.tooltip=Chills attackers -item.yetiBoots.tooltip=Chills attackers - -item.tfspawnegg.name=Spawn - -itemGroup.twilightForest=Twilight Forest - -entity.TwilightForest.Wild Boar.name=Wild Boar -entity.TwilightForest.Bighorn Sheep.name=Bighorn Sheep -entity.TwilightForest.Wild Deer.name=Wild Deer -entity.TwilightForest.Redcap.name=Redcap -entity.TwilightForest.Swarm Spider.name=Swarm Spider -entity.TwilightForest.Naga.name=Naga -entity.TwilightForest.Naga Segment.name=Naga Segment -entity.TwilightForest.Skeleton Druid.name=Skeleton Druid -entity.TwilightForest.Hostile Wolf.name=Hostile Wolf -entity.TwilightForest.Twilight Wraith.name=Twilight Wraith -entity.TwilightForest.Hedge Spider.name=Hedge Spider -entity.TwilightForest.Hydra.name=Hydra -entity.TwilightForest.HydraHead.name=Hydra Head -entity.TwilightForest.Twilight Lich.name=Twilight Lich -entity.TwilightForest.Glacier Penguin.name=Penguin -entity.TwilightForest.Tiny Bird.name=Tiny Bird -entity.TwilightForest.Forest Squirrel.name=Forest Squirrel -entity.TwilightForest.Forest Bunny.name=Forest Bunny -entity.TwilightForest.Forest Raven.name=Forest Raven -entity.TwilightForest.Questing Ram.name=Questing Ram -entity.TwilightForest.Twilight Kobold.name=Kobold -entity.TwilightForest.Boggard.name=Boggard [NYI] -entity.TwilightForest.Lich Minion.name=Lich Minion -entity.TwilightForest.Loyal Zombie.name=Loyal Zombie -entity.TwilightForest.Mosquito Swarm.name=Mosquito Swarm -entity.TwilightForest.Death Tome.name=Death Tome -entity.TwilightForest.Minotaur.name=Minotaur -entity.TwilightForest.Minoshroom.name=Minoshroom -entity.TwilightForest.Fire Beetle.name=Fire Beetle -entity.TwilightForest.Slime Beetle.name=Slime Beetle -entity.TwilightForest.Pinch Beetle.name=Pinch Beetle -entity.TwilightForest.Maze Slime.name=Maze Slime -entity.TwilightForest.Redcap Sapper.name=Redcap Sapper -entity.TwilightForest.Mist Wolf.name=Mist Wolf -entity.TwilightForest.King Spider.name=King Spider -entity.TwilightForest.Firefly.name=Firefly -entity.TwilightForest.Mini Ghast.name=Carminite Ghastling -entity.TwilightForest.Tower Ghast.name=Carminite Ghastguard -entity.TwilightForest.Tower Golem.name=Carminite Golem -entity.TwilightForest.Tower Termite.name=Towerwood Borer -entity.TwilightForest.Redscale Broodling.name=Carminite Broodling -entity.TwilightForest.Tower Boss.name=Ur-ghast -entity.TwilightForest.Block&Chain Goblin.name=Block and Chain Goblin -entity.TwilightForest.Upper Goblin Knight.name=Upper Goblin Knight -entity.TwilightForest.Lower Goblin Knight.name=Lower Goblin Knight -entity.TwilightForest.Helmet Crab.name=Helmet Crab -entity.TwilightForest.Knight Phantom.name=Knight Phantom -entity.TwilightForest.Yeti.name=Yeti -entity.TwilightForest.Yeti Boss.name=Alpha Yeti -entity.TwilightForest.WinterWolf.name=Winter Wolf -entity.TwilightForest.SnowGuardian.name=Snow Guardian -entity.TwilightForest.Stable Ice Core.name=Stable Ice Core -entity.TwilightForest.Unstable Ice Core.name=Unstable Ice Core -entity.TwilightForest.Snow Queen.name=Snow Queen -entity.TwilightForest.Troll.name=Cave Troll -entity.TwilightForest.Giant Miner.name=Giant Miner -entity.TwilightForest.Armored Giant.name=Armored Giant -entity.TwilightForest.Ice Crystal.name=Ice Crystal -entity.TwilightForest.Apocalypse Cube.name=Apocolypse Cube [NYI] -entity.TwilightForest.Adherent.name=Adherent [NYI] - -achievement.twilightPortal=Twilight Portal -achievement.twilightPortal.desc=Build a portal to the Twilight Forest. -achievement.twilightArrival=Twilight Arrival -achievement.twilightArrival.desc=Arrive in the Twilight Forest. -achievement.twilightHunter=Twilight Hunter -achievement.twilightHunter.desc=Hunt some of the local wildlife. -achievement.twilightMagicMapFocus=With Fire It Writes -achievement.twilightMagicMapFocus.desc=Craft the magic map focus with a raven's feather, glowstone dust, and torchberries. -achievement.twilightKillNaga=Naga Hunter -achievement.twilightKillNaga.desc=Slay the naga in its forest courtyard. -achievement.twilightNagaArmors=Naga Armorer -achievement.twilightNagaArmors.desc=Craft both naga scale chest and leg armor. -achievement.twilightKillLich=Lich Hunter -achievement.twilightKillLich.desc=Slay the lich at the top of his tower. -achievement.twilightLichScepters=Scepter Mastery -achievement.twilightLichScepters.desc=Acquire all three scepters of power. -achievement.twilightHill1=The Boots Are Mine! -achievement.twilightHill1.desc=Defeat a redcap goblin in a small hollow hill. -achievement.twilightHill2=What Was That Noise? -achievement.twilightHill2.desc=Defeat a redcap sapper in a medium hollow hill. -achievement.twilightHill3=I See Right Through You -achievement.twilightHill3.desc=Defeat a twilight wraith in a large hollow hill. -achievement.twilightHedge=Bug Stomper -achievement.twilightHedge.desc=Defeat a spider in a hedge maze. -achievement.twilightMagicMap=I Can See For Miles -achievement.twilightMagicMap.desc=Craft the magic map. -achievement.twilightMazeMap=And Now, to Find the Exit -achievement.twilightMazeMap.desc=Craft the maze map after obtaining the focus from the labyrinth. -achievement.twilightOreMap=How Can That Be Worth It? -achievement.twilightOreMap.desc=Craft the maze/ore map. -achievement.twilightKillHydra=Hydra Slayer -achievement.twilightKillHydra.desc=Defeat the mighty hydra. -achievement.twilightHydraChop=Massive Chops -achievement.twilightHydraChop.desc=Chow down on some overpowered hydra meat when your food bar is empty. -achievement.twilightMazebreaker=Breaking the Maze -achievement.twilightMazebreaker.desc=Find the Mazebreaker pick in the secret labyrinth vault. -achievement.twilightFierySet=Gallons of Blood and Tears -achievement.twilightFierySet.desc=Wield a fiery tool or weapon while wearing at least one piece of fiery armor. -achievement.twilightQuestRam=Consumate Baaahs -achievement.twilightQuestRam.desc=Give the Quest Ram what it is missing. - -achievement.twilightProgressNaga=Shimmering Scale -achievement.twilightProgressNaga.desc=Obtain a naga scale, allowing you to overcome the barrier magic surrounding the Lich's tower. -achievement.twilightProgressLich=Touched by Undeath -achievement.twilightProgressLich.desc=Use the magic of the the Lich's scepter to clear away poisonous mosquitoes in the swamp. -achievement.twilightProgressLabyrinth=Mighty Stroganoff -achievement.twilightProgressLabyrinth.desc=The meat-and-mushroom stew in the labyrinth makes you feel ready to enter the Fire Swamp. -achievement.twilightProgressHydra=Of One Blood -achievement.twilightProgressHydra.desc=A touch of hydra blood in your eyes makes you resist the blindness curse in the Dark Forest. -achievement.twilightProgressTrophyPedestal=Trophied Champion -achievement.twilightProgressTrophyPedestal.desc=Claim your title by placing a trophy on the pedestal in the dark forest ruins. -achievement.twilightProgressKnights=Carminite Acclimation -achievement.twilightProgressKnights.desc=Settle the restless phantoms in the Knight's Tomb and the carminite tower's devices will obey you. -achievement.twilightProgressUrghast=Tears of Fire -achievement.twilightProgressUrghast.desc=Touch the fiery red tears of the Ur-ghast, allowing you to resist the snow forest's chill. -achievement.twilightProgressYeti=Alpha Fur -achievement.twilightProgressYeti.desc=Line your garments with the soft fur from the alpha yeti, keeping you safe from the glacier's cold. -achievement.twilightProgressGlacier=Clear Skies -achievement.twilightProgressGlacier.desc=Defeat the Snow Queen atop the Aurora Palace, clearing away the acid rain from the highlands. -achievement.twilightProgressTroll=I Wish For More Burning -achievement.twilightProgressTroll.desc=Find the Lamp of Cinders in the troll caves, and you can burn away the thorn barriers. -achievement.twilightProgressThorns=Past the Thorns -achievement.twilightProgressThorns.desc=Make it past the thornlands, and unlock the door of the castle. -achievement.twilightProgressCastle=So Castle Very Wow -achievement.twilightProgressCastle.desc=What could even be in that castle?!? - - - diff --git a/src/main/resources/assets/twilightforest/lang/en_pt.json b/src/main/resources/assets/twilightforest/lang/en_pt.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/en_pt.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/en_ud.json b/src/main/resources/assets/twilightforest/lang/en_ud.json new file mode 100644 index 0000000000..faa5c76f7d --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/en_ud.json @@ -0,0 +1,1416 @@ +{ + "advancement.twilightforest.arborist": "ʇsᴉᵷoꞁoɹpuǝᗡ ꞁɐɔɐᴉuɐW", + "advancement.twilightforest.arborist.desc": "¡⟘I ℲO ꞀꞀⱯ ˙ᵷuᴉɥʇʎɹǝʌǝ ˙˙˙ǝɹoɯ ˙˙˙sǝʌɐǝꞁ ˙˙˙ᵷuᴉꞁdɐs ˙˙˙qɐꞁs ʎɹǝʌǝ uᴉɐʇqo ‘ʇooꞁ ‘ʇɟɐɹƆ ¡sǝǝɹʇ ɯoɹɟ sǝɯoɔ ʇɐɥʇ ᵷuᴉɥʇʎɹǝʌǝ puɐ ᵷuᴉɥʇʎuɐ ʇǝᵷ puɐ ʎuuɐɹɔ puɐ ʞoou ʎɹǝʌǝ ɥɔɹɐǝS ˙ʎpɐǝɹ sɹɐǝɥs puɐ sǝxɐ ɹnoʎ ʇǝ⅁", + "advancement.twilightforest.arctic_dyed": "uoᴉɥsɐℲ uᴉ ᵷuᴉʇʇǝ⅁", + "advancement.twilightforest.arctic_dyed.desc": "ɹoɯɹɐ ɔᴉʇɔɹⱯ ɟo sǝɔǝᴉd ǝnbᴉun ɹnoɟ ǝʎᗡ", + "advancement.twilightforest.beanstalk": "ʞꞁɐʇsuɐǝᗺ ǝɥʇ puɐ ʞɔɐՐ", + "advancement.twilightforest.beanstalk.desc": "spnoꞁɔ ǝɥʇ ɥʇɐǝuǝq ꞁᴉos ᵷuᴉʍoꞁᵷ ǝɥʇ uo ɯǝɥʇ ǝsn puɐ sǝʌɐɔ ꞁꞁoɹʇ ǝɥʇ uᴉ %s ǝɯos uᴉɐʇqO", + "advancement.twilightforest.experiment_115": "¿ʇɐǝW ʎɹǝʇsʎW", + "advancement.twilightforest.experiment_115.desc": "˙˙˙ɥᵷnoɥʇ ‘ǝʞɐɔ ǝʞᴉꞁ sʞooꞁ ʇI", + "advancement.twilightforest.experiment_115_2": "¡ssǝɔɔnS ǝᵷnH :ǝʇou ɐ ᵷuᴉʞɐW", + "advancement.twilightforest.experiment_115_2.desc": "¡ʇsᴉoɯ puɐ snoᴉɔᴉꞁǝp os s,ʇI", + "advancement.twilightforest.experiment_115_3": "ɹǝʌǝɹoℲ ‘sɹɐǝ⅄ ϛ⥝⥝ ‘ʎɐpʎɹǝʌƎ ϛ⥝⥝ ᵷuᴉʇɐƎ", + "advancement.twilightforest.experiment_115_3.desc": "ɯoɔ ʇop uǝǝʇɟᴉɟ-pǝɹpunɥ-ǝuo ʇuǝɯᴉɹǝdxǝ sǝɯᴉʇ uǝǝʇɟᴉɟ-pǝɹpunɥ-ǝuo ʇop n-ǝꞁqnop n-ǝꞁqnop n-ǝꞁqnop ‘ɯoɔ ʇop uǝǝʇɟᴉɟ-pǝɹpunɥ-ǝuo ʇuǝɯᴉɹǝdxǝ ǝʇnuᴉɯ ʎɹǝʌǝ ‘sɹɐǝʎ uǝǝʇɟᴉɟ-pǝɹpunɥ-ǝuo ‘ɯoɔ ʇop uǝǝʇɟᴉɟ-pǝɹpunɥ-ǝuo ʇuǝɯᴉɹǝdxǝ ʇop n-ǝꞁqnop n-ǝꞁqnop n-ǝꞁqnop ‘ɯoɔ ʇop uǝǝʇɟᴉɟ-pǝɹpunɥ-ǝuo ʇuǝɯᴉɹǝdxǝ ‘uǝǝʇɟᴉɟ-pǝɹpunɥ-ǝuo ʇuǝɯᴉɹǝdxǝ sǝɯᴉʇ uǝǝʇɟᴉɟ-pǝɹpunɥ-ǝuo ‘ɹǝʌǝɹoɟ ‘ʎɐp ꞁꞁɐ uǝǝʇɟᴉɟ-pǝɹpunɥ-ǝuo ʇuǝɯᴉɹǝdxǝ ᵷuᴉʇɐǝ", + "advancement.twilightforest.fiery_set": "sɹɐǝ⟘ puɐ pooꞁᗺ ɟo suoꞁꞁɐ⅁", + "advancement.twilightforest.fiery_set.desc": "ʎɹoʇuǝʌuᴉ ɹnoʎ uᴉ ɹoɯɹɐ ʎɹǝᴉɟ ɟo ǝɔǝᴉd ǝuo ʇsɐǝꞁ ʇɐ ᵷuᴉʌɐɥ ǝꞁᴉɥʍ uodɐǝʍ ɹo ꞁooʇ ʎɹǝᴉɟ ɐ pꞁǝᴉM", + "advancement.twilightforest.full_mettle_alchemist": "ʇsᴉɯǝɥɔꞁⱯ ǝꞁʇʇǝW ꞁꞁnℲ", + "advancement.twilightforest.full_mettle_alchemist.desc": "ǝʌᴉʌɹns puɐ spuoɔǝs 8 ɹǝpun uᴉ ʞsɐꞁɟ uoᴉʇod ɐ ɯoɹɟ II ᵷuᴉɯɹɐH ɟo sǝsop ɹnoɟ ʞuᴉɹᗡ", + "advancement.twilightforest.ghast_trap": "pooʍɹǝʍo⟘ uᴉ ǝᵷuɐɹʇS ᵷuᴉɥʇǝɯoS", + "advancement.twilightforest.ghast_trap.desc": "¡ʎʞs ǝɥʇ ɯoɹɟ %3$s ǝɥʇ ɥɔuǝɹʍ oʇ ǝʇɐʌᴉʇɔɐ puɐ %2$s ɐ punoɹɐ s%1$s ǝɥʇ ʎɐꞁS", + "advancement.twilightforest.giants": "ǝuᴉN pnoꞁƆ uo ɯ,I", + "advancement.twilightforest.giants.desc": "sǝʌɐɔ ꞁꞁoɹʇ ǝɥʇ oʇ ʞɔɐq uɹnʇǝɹ puɐ ‘%2$s ɐ ǝʌǝᴉɹʇǝɹ ‘spnoꞁɔ ǝɥʇ uᴉ %1$s ɐ ꞁꞁᴉꞰ", + "advancement.twilightforest.glass_sword": "ɹǝpuoM ʇᴉH ǝuO", + "advancement.twilightforest.glass_sword.desc": "˙ʇɐɥʇ ɟo ǝsn pooᵷ ǝpɐɯ noʎ ǝdoH", + "advancement.twilightforest.hedge": "ɹǝdɯoʇS ᵷnᗺ", + "advancement.twilightforest.hedge.desc": "ǝzɐW ǝᵷpǝH ɐ uᴉ ɹǝpᴉds ɐ ʇɐǝɟǝᗡ", + "advancement.twilightforest.hill1": "¡ǝuᴉW ǝɹⱯ sʇooᗺ ǝɥ⟘", + "advancement.twilightforest.hill1.desc": "ꞁꞁᴉH ʍoꞁꞁoH ꞁꞁɐɯS ɐ uᴉ %s ɐ ʇɐǝɟǝᗡ", + "advancement.twilightforest.hill2": "¿ǝsᴉoN ʇɐɥ⟘ sɐM ʇɐɥM", + "advancement.twilightforest.hill2.desc": "ꞁꞁᴉH ʍoꞁꞁoH ɯnᴉpǝW ɐ uᴉ %s ɐ ʇɐǝɟǝᗡ", + "advancement.twilightforest.hill3": "no⅄ ɥᵷnoɹɥ⟘ ʇɥᵷᴉᴚ ǝǝS I", + "advancement.twilightforest.hill3.desc": "ꞁꞁᴉH ʍoꞁꞁoH ǝᵷɹɐꞀ ɐ uᴉ %s ɐ ʇɐǝɟǝᗡ", + "advancement.twilightforest.hydra_chop": "¡ʎqɐᗺ ‘doɥƆ ɐɹpʎH", + "advancement.twilightforest.hydra_chop.desc": "pǝʇǝꞁdǝp sᴉ ɹɐq ɹǝᵷunɥ ɹnoʎ uǝɥʍ %s ɐ uo uʍop ʍoɥƆ", + "advancement.twilightforest.kill_cicada": "ʇnɥS", + "advancement.twilightforest.kill_cicada.desc": "ɐpɐɔᴉƆ ɐ ꞁꞁᴉꞰ", + "advancement.twilightforest.kill_hydra": "ɹǝʎɐꞁS ɐɹpʎH", + "advancement.twilightforest.kill_hydra.desc": "ɟꞁǝsɹnoʎ ɹǝʍodɯǝ puɐ %s ʎʇɥᵷᴉɯ ǝɥʇ ʇɐǝɟǝᗡ", + "advancement.twilightforest.kill_lich": "pɐǝᗡ ɹno⅄ ʇnO ᵷuᴉɹᗺ", + "advancement.twilightforest.kill_lich.desc": "ꞁꞁᴉɥɔ s,ʇsǝɹoℲ ʎʍouS ǝɥʇ ʇsᴉsǝɹ puɐ ‘ǝsɹnɔ s,ʇsǝɹoℲ ʞɹɐᗡ ǝɥʇ ɟo ssǝuʞɹɐp ᵷuᴉpuᴉꞁq ɥᵷnoɹɥʇ ǝǝs ‘dɯɐʍS ǝɥʇ ɯoɹɟ sǝoʇᴉnbsoɯ snouosᴉod ɹɐǝꞁɔ oʇ ɹǝʇdǝɔs ɐ ǝʌǝᴉɹʇǝɹ puɐ ɹǝʍoʇ sᴉɥ ɟo doʇ ʇɐ %s ǝɥʇ ʎɐꞁS", + "advancement.twilightforest.kill_naga": "sǝꞁɐɔS ǝɥ⟘ uǝʌƎ o⟘ ǝɯᴉ⟘", + "advancement.twilightforest.kill_naga.desc": "ɹǝʍoʇ s,ɥɔᴉꞀ ǝɥʇ ᵷuᴉpunoɹɹns ɔᴉᵷɐɯ ɹǝᴉɹɹɐq ǝɥʇ ǝɯoɔɹǝʌo oʇ %2$s ɐ uᴉɐʇqo puɐ pɹɐʎʇɹnoɔ ʇsǝɹoɟ sʇᴉ uᴉ %1$s ǝɥʇ ʎɐꞁS", + "advancement.twilightforest.lich_scepters": "¡pǝuᴉqɯoƆ sɹǝʍoԀ ɹnO ʎᗺ", + "advancement.twilightforest.lich_scepters.desc": "ɹǝʍod ɟo sɹǝʇdǝɔs ɹnoɟ ꞁꞁɐ ǝɹᴉnbɔⱯ", + "advancement.twilightforest.magic_map": "ɹǝʌǝɹoℲ ǝǝS uɐƆ I", + "advancement.twilightforest.magic_map.desc": "%s ǝɥʇ ʇɟɐɹƆ", + "advancement.twilightforest.magic_map_focus": "sǝʇᴉɹM ʇI ǝɹᴉℲ ɥʇᴉM", + "advancement.twilightforest.magic_map_focus.desc": "%4$s puɐ ‘%3$s ‘%2$s ɐ ɥʇᴉʍ %1$s ǝɥʇ ʇɟɐɹƆ", + "advancement.twilightforest.maze_map": "ʇᴉxƎ ǝɥʇ puᴉℲ oʇ ‘ʍoN puⱯ", + "advancement.twilightforest.maze_map.desc": "ɥʇuᴉɹʎqɐꞁ ǝɥʇ ɯoɹɟ snɔoɟ ǝɥʇ ᵷuᴉuᴉɐʇqo ɹǝʇɟɐ %s ǝɥʇ ʇɟɐɹƆ", + "advancement.twilightforest.mazebreaker": "ǝzɐW ǝɥʇ ᵷuᴉʞɐǝɹᗺ", + "advancement.twilightforest.mazebreaker.desc": "ʇꞁnɐʌ ɥʇuᴉɹʎqɐꞁ ʇǝɹɔǝs ǝɥʇ uᴉ ǝxɐʞɔᴉd %s ǝɥʇ puᴉℲ", + "advancement.twilightforest.naga_armors": "ɹǝɹoɯɹⱯ ɐᵷɐN", + "advancement.twilightforest.naga_armors.desc": "ɹoɯɹɐ ᵷǝꞁ puɐ ʇsǝɥɔ %s ɥʇoq ʇɟɐɹƆ", + "advancement.twilightforest.ore_map": "¿ʇI ɥʇɹoM ǝᗺ ʇɐɥ⟘ uɐƆ ʍoH", + "advancement.twilightforest.ore_map.desc": "%s ǝɥʇ ʇɟɐɹƆ", + "advancement.twilightforest.progress_glacier": "sǝᴉʞS ɹɐǝꞁƆ", + "advancement.twilightforest.progress_glacier.desc": "ǝɔɐꞁɐԀ ɐɹoɹnⱯ ǝɥʇ doʇɐ %s ǝɥʇ ʇɐǝɟǝᗡ", + "advancement.twilightforest.progress_knights": "uoᴉʇɐɯᴉꞁɔɔⱯ ǝʇᴉuᴉɯɹɐƆ", + "advancement.twilightforest.progress_knights.desc": "noʎ ʎǝqo ꞁꞁᴉʍ sǝɔᴉʌǝp s,ɹǝʍoʇ ǝʇᴉuᴉɯɹɐɔ ǝɥʇ puɐ qɯoʇ s,ʇɥᵷᴉuʞ ǝɥʇ uᴉ sɯoʇuɐɥd ssǝꞁʇsǝɹ ǝɥʇ ǝꞁʇʇǝS", + "advancement.twilightforest.progress_labyrinth": "ɟɟouɐᵷoɹʇS ʎʇɥᵷᴉW", + "advancement.twilightforest.progress_labyrinth.desc": "dɯɐʍS ǝɹᴉℲ ǝɥʇ ɟo ʇɐǝɥ snoɹǝᵷuɐp ǝɥʇ oʇ ʎpoq ɹnoʎ ǝzᴉʇɐɯᴉꞁɔɔɐ oʇ ɟɟouɐᵷoɹʇS ɟǝǝW ǝɥʇ ʇɐƎ", + "advancement.twilightforest.progress_merge": "uʍopʍoɥS ǝʇɐɯᴉʇꞁ∩", + "advancement.twilightforest.progress_merge.desc": "spuɐꞁɥᵷᴉH ǝɥʇ ɹoɟ ɟꞁǝsɹnoʎ uǝpꞁoqɯǝ puɐ uᴉɐɹ pᴉɔɐ ǝɥʇ ɹɐǝꞁɔ oʇ %3$s puɐ ‘%2$s ‘%1$s ǝɥʇ ʎɐꞁS", + "advancement.twilightforest.progress_troll": "ᵷuᴉuɹnᗺ ǝɹoW ɹoℲ ɥsᴉM I", + "advancement.twilightforest.progress_troll.desc": "sɹǝᴉɹɹɐq uɹoɥʇ ǝɥʇ ʎɐʍɐ uɹnq uɐɔ noʎ puɐ ‘sǝʌɐɔ ꞁꞁoɹʇ ǝɥʇ uᴉ %s ǝɥʇ puᴉℲ", + "advancement.twilightforest.progress_trophy_pedestal": "uoᴉdɯɐɥƆ pǝᴉɥdoɹ⟘", + "advancement.twilightforest.progress_trophy_pedestal.desc": "suᴉnɹ ʇsǝɹoℲ ʞɹɐᗡ ǝɥʇ uᴉ ꞁɐʇsǝpǝd ǝɥʇ uo ʎɥdoɹʇ ɐ ᵷuᴉɔɐꞁd ʎq ǝꞁʇᴉʇ ɹnoʎ ɯᴉɐꞁƆ", + "advancement.twilightforest.progress_ur_ghast": "ǝɹᴉℲ ɟo sɹɐǝ⟘", + "advancement.twilightforest.progress_ur_ghast.desc": "%s ǝɥʇ ɟo sɹɐǝʇ pǝɹ ʎɹǝᴉɟ ǝɥʇ ɥɔno⟘", + "advancement.twilightforest.progress_yeti": "ɹnℲ ɐɥdꞁⱯ", + "advancement.twilightforest.progress_yeti.desc": "pꞁoɔ s,ɹǝᴉɔɐꞁ⅁ ǝɥʇ ɯoɹɟ ǝɟɐs noʎ ᵷuᴉdǝǝʞ ‘%s ǝɥʇ ɯoɹɟ ɹnɟ ʇɟos ǝɥʇ ɥʇᴉʍ sʇuǝɯɹɐᵷ ɹnoʎ ǝuᴉꞀ", + "advancement.twilightforest.progression_end": "uoᴉssǝɹᵷoɹԀ ɟo puƎ", + "advancement.twilightforest.progression_end.desc": "ǝɹnʇnɟ ǝɥʇ uᴉ pǝɥsᴉuᴉɟ ǝq ꞁꞁᴉʍ ʇI ˙ssǝɹᵷoɹd uᴉ ʞɹoʍ ɐ sᴉ spuɐꞁɥᵷᴉH ǝɥʇ uᴉ ʇuᴉod sᴉɥʇ ʇsɐd ᵷuᴉɥʇʎuⱯ", + "advancement.twilightforest.quest_ram": "sɥɐɐɐᗺ ǝʇɐɯɯnsuoƆ", + "advancement.twilightforest.quest_ram.desc": "ᵷuᴉssᴉɯ sᴉ ʇᴉ ʇɐɥʍ %s ǝɥʇ ǝʌᴉ⅁", + "advancement.twilightforest.root": "ʇsǝɹoℲ ʇɥᵷᴉꞁᴉʍ⟘", + "advancement.twilightforest.root.desc": "ʇsǝɹoℲ ʇɥᵷᴉꞁᴉʍ⟘ ǝɥʇ :spuɐꞁpooʍ ꞁɐɔᴉᵷɐɯ ‘snoᴉɹǝʇsʎɯ ǝɥʇ ɹǝʇuƎ", + "advancement.twilightforest.troll": "ᵷuᴉꞁꞁoɹ⟘ ǝꞁʇʇᴉꞀ ɐ oᗡ ǝM", + "advancement.twilightforest.troll.desc": "%s ɐ ꞁꞁᴉʞ puɐ puᴉℲ", + "advancement.twilightforest.twilight_dining": "uʍopunS ꞁɐuɹǝʇƎ ʇⱯ ǝuᴉᗡ ǝM", + "advancement.twilightforest.twilight_dining.desc": "ʇsǝɹoℲ ʇɥᵷᴉꞁᴉʍ⟘ oʇ ǝʌᴉsnꞁɔxǝ ɯǝʇᴉ ǝꞁqᴉpǝ ʎɹǝʌǝ ʇɐƎ", + "advancement.twilightforest.twilight_hunter": "ʇsǝɹoℲ ǝɥʇ ɟo ǝɔuǝꞁᴉS ǝɥ⟘", + "advancement.twilightforest.twilight_hunter.desc": "ǝɟᴉꞁpꞁᴉʍ ꞁɐɔoꞁ ǝɥʇ ɟo ǝɯos ʇunH", + "biome.twilightforest.clearing": "ᵷuᴉɹɐǝꞁƆ ʇɥᵷᴉꞁᴉʍ⟘", + "biome.twilightforest.dark_forest": "ʇsǝɹoℲ ʞɹɐᗡ", + "biome.twilightforest.dark_forest_center": "ɹǝʇuǝƆ ʇsǝɹoℲ ʞɹɐᗡ", + "biome.twilightforest.dense_forest": "ʇsǝɹoℲ ǝsuǝᗡ", + "biome.twilightforest.dense_mushroom_forest": "ʇsǝɹoℲ ɯooɹɥsnW ǝsuǝᗡ", + "biome.twilightforest.enchanted_forest": "ʇsǝɹoℲ pǝʇuɐɥɔuƎ", + "biome.twilightforest.final_plateau": "nɐǝʇɐꞁԀ ꞁɐuᴉℲ", + "biome.twilightforest.fire_swamp": "dɯɐʍS ǝɹᴉℲ", + "biome.twilightforest.firefly_forest": "ʇsǝɹoℲ ʎꞁɟǝɹᴉℲ", + "biome.twilightforest.forest": "ʇsǝɹoℲ ʇɥᵷᴉꞁᴉʍ⟘", + "biome.twilightforest.glacier": "ɹǝᴉɔɐꞁ⅁ ʇɥᵷᴉꞁᴉʍ⟘", + "biome.twilightforest.highlands": "spuɐꞁɥᵷᴉH ʇɥᵷᴉꞁᴉʍ⟘", + "biome.twilightforest.lake": "ǝʞɐꞀ ʇɥᵷᴉꞁᴉʍ⟘", + "biome.twilightforest.mushroom_forest": "ʇsǝɹoℲ ɯooɹɥsnW", + "biome.twilightforest.oak_savannah": "ɐuuɐʌɐS ʞɐO", + "biome.twilightforest.snowy_forest": "ʇsǝɹoℲ ʎʍouS", + "biome.twilightforest.spooky_forest": "ʇsǝɹoℲ ʎʞoodS", + "biome.twilightforest.stream": "ɯɐǝɹʇS ʇɥᵷᴉꞁᴉʍ⟘", + "biome.twilightforest.swamp": "dɯɐʍS ʇɥᵷᴉꞁᴉʍ⟘", + "biome.twilightforest.thornlands": "spuɐꞁuɹoɥ⟘", + "biome.twilightforest.underground": "punoɹᵷɹǝpu∩", + "block.minecraft.banner.twilightforest.alpha_yeti.black": "ǝɔɐℲ ᴉʇǝ⅄ ɐɥdꞁⱯ ʞɔɐꞁᗺ", + "block.minecraft.banner.twilightforest.alpha_yeti.blue": "ǝɔɐℲ ᴉʇǝ⅄ ɐɥdꞁⱯ ǝnꞁᗺ", + "block.minecraft.banner.twilightforest.alpha_yeti.brown": "ǝɔɐℲ ᴉʇǝ⅄ ɐɥdꞁⱯ uʍoɹᗺ", + "block.minecraft.banner.twilightforest.alpha_yeti.cyan": "ǝɔɐℲ ᴉʇǝ⅄ ɐɥdꞁⱯ uɐʎƆ", + "block.minecraft.banner.twilightforest.alpha_yeti.gray": "ǝɔɐℲ ᴉʇǝ⅄ ɐɥdꞁⱯ ʎɐɹ⅁", + "block.minecraft.banner.twilightforest.alpha_yeti.green": "ǝɔɐℲ ᴉʇǝ⅄ ɐɥdꞁⱯ uǝǝɹ⅁", + "block.minecraft.banner.twilightforest.alpha_yeti.light_blue": "ǝɔɐℲ ᴉʇǝ⅄ ɐɥdꞁⱯ ǝnꞁᗺ ʇɥᵷᴉꞀ", + "block.minecraft.banner.twilightforest.alpha_yeti.light_gray": "ǝɔɐℲ ᴉʇǝ⅄ ɐɥdꞁⱯ ʎɐɹ⅁ ʇɥᵷᴉꞀ", + "block.minecraft.banner.twilightforest.alpha_yeti.lime": "ǝɔɐℲ ᴉʇǝ⅄ ɐɥdꞁⱯ ǝɯᴉꞀ", + "block.minecraft.banner.twilightforest.alpha_yeti.magenta": "ǝɔɐℲ ᴉʇǝ⅄ ɐɥdꞁⱯ ɐʇuǝᵷɐW", + "block.minecraft.banner.twilightforest.alpha_yeti.orange": "ǝɔɐℲ ᴉʇǝ⅄ ɐɥdꞁⱯ ǝᵷuɐɹO", + "block.minecraft.banner.twilightforest.alpha_yeti.pink": "ǝɔɐℲ ᴉʇǝ⅄ ɐɥdꞁⱯ ʞuᴉԀ", + "block.minecraft.banner.twilightforest.alpha_yeti.purple": "ǝɔɐℲ ᴉʇǝ⅄ ɐɥdꞁⱯ ǝꞁdɹnԀ", + "block.minecraft.banner.twilightforest.alpha_yeti.red": "ǝɔɐℲ ᴉʇǝ⅄ ɐɥdꞁⱯ pǝᴚ", + "block.minecraft.banner.twilightforest.alpha_yeti.white": "ǝɔɐℲ ᴉʇǝ⅄ ɐɥdꞁⱯ ǝʇᴉɥM", + "block.minecraft.banner.twilightforest.alpha_yeti.yellow": "ǝɔɐℲ ᴉʇǝ⅄ ɐɥdꞁⱯ ʍoꞁꞁǝ⅄", + "block.minecraft.banner.twilightforest.hydra.black": "ǝɯɐꞁℲ ɐɹpʎH ʞɔɐꞁᗺ", + "block.minecraft.banner.twilightforest.hydra.blue": "ǝɯɐꞁℲ ɐɹpʎH ǝnꞁᗺ", + "block.minecraft.banner.twilightforest.hydra.brown": "ǝɯɐꞁℲ ɐɹpʎH uʍoɹᗺ", + "block.minecraft.banner.twilightforest.hydra.cyan": "ǝɯɐꞁℲ ɐɹpʎH uɐʎƆ", + "block.minecraft.banner.twilightforest.hydra.gray": "ǝɯɐꞁℲ ɐɹpʎH ʎɐɹ⅁", + "block.minecraft.banner.twilightforest.hydra.green": "ǝɯɐꞁℲ ɐɹpʎH uǝǝɹ⅁", + "block.minecraft.banner.twilightforest.hydra.light_blue": "ǝɯɐꞁℲ ɐɹpʎH ǝnꞁᗺ ʇɥᵷᴉꞀ", + "block.minecraft.banner.twilightforest.hydra.light_gray": "ǝɯɐꞁℲ ɐɹpʎH ʎɐɹ⅁ ʇɥᵷᴉꞀ", + "block.minecraft.banner.twilightforest.hydra.lime": "ǝɯɐꞁℲ ɐɹpʎH ǝɯᴉꞀ", + "block.minecraft.banner.twilightforest.hydra.magenta": "ǝɯɐꞁℲ ɐɹpʎH ɐʇuǝᵷɐW", + "block.minecraft.banner.twilightforest.hydra.orange": "ǝɯɐꞁℲ ɐɹpʎH ǝᵷuɐɹO", + "block.minecraft.banner.twilightforest.hydra.pink": "ǝɯɐꞁℲ ɐɹpʎH ʞuᴉԀ", + "block.minecraft.banner.twilightforest.hydra.purple": "ǝɯɐꞁℲ ɐɹpʎH ǝꞁdɹnԀ", + "block.minecraft.banner.twilightforest.hydra.red": "ǝɯɐꞁℲ ɐɹpʎH pǝᴚ", + "block.minecraft.banner.twilightforest.hydra.white": "ǝɯɐꞁℲ ɐɹpʎH ǝʇᴉɥM", + "block.minecraft.banner.twilightforest.hydra.yellow": "ǝɯɐꞁℲ ɐɹpʎH ʍoꞁꞁǝ⅄", + "block.minecraft.banner.twilightforest.knight_phantom.black": "ʇǝɯꞁǝH ʇɥᵷᴉuꞰ ʞɔɐꞁᗺ", + "block.minecraft.banner.twilightforest.knight_phantom.blue": "ʇǝɯꞁǝH ʇɥᵷᴉuꞰ ǝnꞁᗺ", + "block.minecraft.banner.twilightforest.knight_phantom.brown": "ʇǝɯꞁǝH ʇɥᵷᴉuꞰ uʍoɹᗺ", + "block.minecraft.banner.twilightforest.knight_phantom.cyan": "ʇǝɯꞁǝH ʇɥᵷᴉuꞰ uɐʎƆ", + "block.minecraft.banner.twilightforest.knight_phantom.gray": "ʇǝɯꞁǝH ʇɥᵷᴉuꞰ ʎɐɹ⅁", + "block.minecraft.banner.twilightforest.knight_phantom.green": "ʇǝɯꞁǝH ʇɥᵷᴉuꞰ uǝǝɹ⅁", + "block.minecraft.banner.twilightforest.knight_phantom.light_blue": "ʇǝɯꞁǝH ʇɥᵷᴉuꞰ ǝnꞁᗺ ʇɥᵷᴉꞀ", + "block.minecraft.banner.twilightforest.knight_phantom.light_gray": "ʇǝɯꞁǝH ʇɥᵷᴉuꞰ ʎɐɹ⅁ ʇɥᵷᴉꞀ", + "block.minecraft.banner.twilightforest.knight_phantom.lime": "ʇǝɯꞁǝH ʇɥᵷᴉuꞰ ǝɯᴉꞀ", + "block.minecraft.banner.twilightforest.knight_phantom.magenta": "ʇǝɯꞁǝH ʇɥᵷᴉuꞰ ɐʇuǝᵷɐW", + "block.minecraft.banner.twilightforest.knight_phantom.orange": "ʇǝɯꞁǝH ʇɥᵷᴉuꞰ ǝᵷuɐɹO", + "block.minecraft.banner.twilightforest.knight_phantom.pink": "ʇǝɯꞁǝH ʇɥᵷᴉuꞰ ʞuᴉԀ", + "block.minecraft.banner.twilightforest.knight_phantom.purple": "ʇǝɯꞁǝH ʇɥᵷᴉuꞰ ǝꞁdɹnԀ", + "block.minecraft.banner.twilightforest.knight_phantom.red": "ʇǝɯꞁǝH ʇɥᵷᴉuꞰ pǝᴚ", + "block.minecraft.banner.twilightforest.knight_phantom.white": "ʇǝɯꞁǝH ʇɥᵷᴉuꞰ ǝʇᴉɥM", + "block.minecraft.banner.twilightforest.knight_phantom.yellow": "ʇǝɯꞁǝH ʇɥᵷᴉuꞰ ʍoꞁꞁǝ⅄", + "block.minecraft.banner.twilightforest.lich.black": "uʍoɹƆ ɥɔᴉꞀ ʞɔɐꞁᗺ", + "block.minecraft.banner.twilightforest.lich.blue": "uʍoɹƆ ɥɔᴉꞀ ǝnꞁᗺ", + "block.minecraft.banner.twilightforest.lich.brown": "uʍoɹƆ ɥɔᴉꞀ uʍoɹᗺ", + "block.minecraft.banner.twilightforest.lich.cyan": "uʍoɹƆ ɥɔᴉꞀ uɐʎƆ", + "block.minecraft.banner.twilightforest.lich.gray": "uʍoɹƆ ɥɔᴉꞀ ʎɐɹ⅁", + "block.minecraft.banner.twilightforest.lich.green": "uʍoɹƆ ɥɔᴉꞀ uǝǝɹ⅁", + "block.minecraft.banner.twilightforest.lich.light_blue": "uʍoɹƆ ɥɔᴉꞀ ǝnꞁᗺ ʇɥᵷᴉꞀ", + "block.minecraft.banner.twilightforest.lich.light_gray": "uʍoɹƆ ɥɔᴉꞀ ʎɐɹ⅁ ʇɥᵷᴉꞀ", + "block.minecraft.banner.twilightforest.lich.lime": "uʍoɹƆ ɥɔᴉꞀ ǝɯᴉꞀ", + "block.minecraft.banner.twilightforest.lich.magenta": "uʍoɹƆ ɥɔᴉꞀ ɐʇuǝᵷɐW", + "block.minecraft.banner.twilightforest.lich.orange": "uʍoɹƆ ɥɔᴉꞀ ǝᵷuɐɹO", + "block.minecraft.banner.twilightforest.lich.pink": "uʍoɹƆ ɥɔᴉꞀ ʞuᴉԀ", + "block.minecraft.banner.twilightforest.lich.purple": "uʍoɹƆ ɥɔᴉꞀ ǝꞁdɹnԀ", + "block.minecraft.banner.twilightforest.lich.red": "uʍoɹƆ ɥɔᴉꞀ pǝᴚ", + "block.minecraft.banner.twilightforest.lich.white": "uʍoɹƆ ɥɔᴉꞀ ǝʇᴉɥM", + "block.minecraft.banner.twilightforest.lich.yellow": "uʍoɹƆ ɥɔᴉꞀ ʍoꞁꞁǝ⅄", + "block.minecraft.banner.twilightforest.minoshroom.black": "sǝxⱯ ɯooɹɥsouᴉW ʞɔɐꞁᗺ", + "block.minecraft.banner.twilightforest.minoshroom.blue": "sǝxⱯ ɯooɹɥsouᴉW ǝnꞁᗺ", + "block.minecraft.banner.twilightforest.minoshroom.brown": "sǝxⱯ ɯooɹɥsouᴉW uʍoɹᗺ", + "block.minecraft.banner.twilightforest.minoshroom.cyan": "sǝxⱯ ɯooɹɥsouᴉW uɐʎƆ", + "block.minecraft.banner.twilightforest.minoshroom.gray": "sǝxⱯ ɯooɹɥsouᴉW ʎɐɹ⅁", + "block.minecraft.banner.twilightforest.minoshroom.green": "sǝxⱯ ɯooɹɥsouᴉW uǝǝɹ⅁", + "block.minecraft.banner.twilightforest.minoshroom.light_blue": "sǝxⱯ ɯooɹɥsouᴉW ǝnꞁᗺ ʇɥᵷᴉꞀ", + "block.minecraft.banner.twilightforest.minoshroom.light_gray": "sǝxⱯ ɯooɹɥsouᴉW ʎɐɹ⅁ ʇɥᵷᴉꞀ", + "block.minecraft.banner.twilightforest.minoshroom.lime": "sǝxⱯ ɯooɹɥsouᴉW ǝɯᴉꞀ", + "block.minecraft.banner.twilightforest.minoshroom.magenta": "sǝxⱯ ɯooɹɥsouᴉW ɐʇuǝᵷɐW", + "block.minecraft.banner.twilightforest.minoshroom.orange": "sǝxⱯ ɯooɹɥsouᴉW ǝᵷuɐɹO", + "block.minecraft.banner.twilightforest.minoshroom.pink": "sǝxⱯ ɯooɹɥsouᴉW ʞuᴉԀ", + "block.minecraft.banner.twilightforest.minoshroom.purple": "sǝxⱯ ɯooɹɥsouᴉW ǝꞁdɹnԀ", + "block.minecraft.banner.twilightforest.minoshroom.red": "sǝxⱯ ɯooɹɥsouᴉW pǝᴚ", + "block.minecraft.banner.twilightforest.minoshroom.white": "sǝxⱯ ɯooɹɥsouᴉW ǝʇᴉɥM", + "block.minecraft.banner.twilightforest.minoshroom.yellow": "sǝxⱯ ɯooɹɥsouᴉW ʍoꞁꞁǝ⅄", + "block.minecraft.banner.twilightforest.naga.black": "sǝꞁɐɔS ɐᵷɐN ʞɔɐꞁᗺ", + "block.minecraft.banner.twilightforest.naga.blue": "sǝꞁɐɔS ɐᵷɐN ǝnꞁᗺ", + "block.minecraft.banner.twilightforest.naga.brown": "sǝꞁɐɔS ɐᵷɐN uʍoɹᗺ", + "block.minecraft.banner.twilightforest.naga.cyan": "sǝꞁɐɔS ɐᵷɐN uɐʎƆ", + "block.minecraft.banner.twilightforest.naga.gray": "sǝꞁɐɔS ɐᵷɐN ʎɐɹ⅁", + "block.minecraft.banner.twilightforest.naga.green": "sǝꞁɐɔS ɐᵷɐN uǝǝɹ⅁", + "block.minecraft.banner.twilightforest.naga.light_blue": "sǝꞁɐɔS ɐᵷɐN ǝnꞁᗺ ʇɥᵷᴉꞀ", + "block.minecraft.banner.twilightforest.naga.light_gray": "sǝꞁɐɔS ɐᵷɐN ʎɐɹ⅁ ʇɥᵷᴉꞀ", + "block.minecraft.banner.twilightforest.naga.lime": "sǝꞁɐɔS ɐᵷɐN ǝɯᴉꞀ", + "block.minecraft.banner.twilightforest.naga.magenta": "sǝꞁɐɔS ɐᵷɐN ɐʇuǝᵷɐW", + "block.minecraft.banner.twilightforest.naga.orange": "sǝꞁɐɔS ɐᵷɐN ǝᵷuɐɹO", + "block.minecraft.banner.twilightforest.naga.pink": "sǝꞁɐɔS ɐᵷɐN ʞuᴉԀ", + "block.minecraft.banner.twilightforest.naga.purple": "sǝꞁɐɔS ɐᵷɐN ǝꞁdɹnԀ", + "block.minecraft.banner.twilightforest.naga.red": "sǝꞁɐɔS ɐᵷɐN pǝᴚ", + "block.minecraft.banner.twilightforest.naga.white": "sǝꞁɐɔS ɐᵷɐN ǝʇᴉɥM", + "block.minecraft.banner.twilightforest.naga.yellow": "sǝꞁɐɔS ɐᵷɐN ʍoꞁꞁǝ⅄", + "block.minecraft.banner.twilightforest.quest_ram.black": "sꞁɹᴉʍS ɯɐᴚ ʇsǝnꝹ ʞɔɐꞁᗺ", + "block.minecraft.banner.twilightforest.quest_ram.blue": "sꞁɹᴉʍS ɯɐᴚ ʇsǝnꝹ ǝnꞁᗺ", + "block.minecraft.banner.twilightforest.quest_ram.brown": "sꞁɹᴉʍS ɯɐᴚ ʇsǝnꝹ uʍoɹᗺ", + "block.minecraft.banner.twilightforest.quest_ram.cyan": "sꞁɹᴉʍS ɯɐᴚ ʇsǝnꝹ uɐʎƆ", + "block.minecraft.banner.twilightforest.quest_ram.gray": "sꞁɹᴉʍS ɯɐᴚ ʇsǝnꝹ ʎɐɹ⅁", + "block.minecraft.banner.twilightforest.quest_ram.green": "sꞁɹᴉʍS ɯɐᴚ ʇsǝnꝹ uǝǝɹ⅁", + "block.minecraft.banner.twilightforest.quest_ram.light_blue": "sꞁɹᴉʍS ɯɐᴚ ʇsǝnꝹ ǝnꞁᗺ ʇɥᵷᴉꞀ", + "block.minecraft.banner.twilightforest.quest_ram.light_gray": "sꞁɹᴉʍS ɯɐᴚ ʇsǝnꝹ ʎɐɹ⅁ ʇɥᵷᴉꞀ", + "block.minecraft.banner.twilightforest.quest_ram.lime": "sꞁɹᴉʍS ɯɐᴚ ʇsǝnꝹ ǝɯᴉꞀ", + "block.minecraft.banner.twilightforest.quest_ram.magenta": "sꞁɹᴉʍS ɯɐᴚ ʇsǝnꝹ ɐʇuǝᵷɐW", + "block.minecraft.banner.twilightforest.quest_ram.orange": "sꞁɹᴉʍS ɯɐᴚ ʇsǝnꝹ ǝᵷuɐɹO", + "block.minecraft.banner.twilightforest.quest_ram.pink": "sꞁɹᴉʍS ɯɐᴚ ʇsǝnꝹ ʞuᴉԀ", + "block.minecraft.banner.twilightforest.quest_ram.purple": "sꞁɹᴉʍS ɯɐᴚ ʇsǝnꝹ ǝꞁdɹnԀ", + "block.minecraft.banner.twilightforest.quest_ram.red": "sꞁɹᴉʍS ɯɐᴚ ʇsǝnꝹ pǝᴚ", + "block.minecraft.banner.twilightforest.quest_ram.white": "sꞁɹᴉʍS ɯɐᴚ ʇsǝnꝹ ǝʇᴉɥM", + "block.minecraft.banner.twilightforest.quest_ram.yellow": "sꞁɹᴉʍS ɯɐᴚ ʇsǝnꝹ ʍoꞁꞁǝ⅄", + "block.minecraft.banner.twilightforest.snow_queen.black": "uʍoɹƆ uǝǝnꝹ ʍouS ʞɔɐꞁᗺ", + "block.minecraft.banner.twilightforest.snow_queen.blue": "uʍoɹƆ uǝǝnꝹ ʍouS ǝnꞁᗺ", + "block.minecraft.banner.twilightforest.snow_queen.brown": "uʍoɹƆ uǝǝnꝹ ʍouS uʍoɹᗺ", + "block.minecraft.banner.twilightforest.snow_queen.cyan": "uʍoɹƆ uǝǝnꝹ ʍouS uɐʎƆ", + "block.minecraft.banner.twilightforest.snow_queen.gray": "uʍoɹƆ uǝǝnꝹ ʍouS ʎɐɹ⅁", + "block.minecraft.banner.twilightforest.snow_queen.green": "uʍoɹƆ uǝǝnꝹ ʍouS uǝǝɹ⅁", + "block.minecraft.banner.twilightforest.snow_queen.light_blue": "uʍoɹƆ uǝǝnꝹ ʍouS ǝnꞁᗺ ʇɥᵷᴉꞀ", + "block.minecraft.banner.twilightforest.snow_queen.light_gray": "uʍoɹƆ uǝǝnꝹ ʍouS ʎɐɹ⅁ ʇɥᵷᴉꞀ", + "block.minecraft.banner.twilightforest.snow_queen.lime": "uʍoɹƆ uǝǝnꝹ ʍouS ǝɯᴉꞀ", + "block.minecraft.banner.twilightforest.snow_queen.magenta": "uʍoɹƆ uǝǝnꝹ ʍouS ɐʇuǝᵷɐW", + "block.minecraft.banner.twilightforest.snow_queen.orange": "uʍoɹƆ uǝǝnꝹ ʍouS ǝᵷuɐɹO", + "block.minecraft.banner.twilightforest.snow_queen.pink": "uʍoɹƆ uǝǝnꝹ ʍouS ʞuᴉԀ", + "block.minecraft.banner.twilightforest.snow_queen.purple": "uʍoɹƆ uǝǝnꝹ ʍouS ǝꞁdɹnԀ", + "block.minecraft.banner.twilightforest.snow_queen.red": "uʍoɹƆ uǝǝnꝹ ʍouS pǝᴚ", + "block.minecraft.banner.twilightforest.snow_queen.white": "uʍoɹƆ uǝǝnꝹ ʍouS ǝʇᴉɥM", + "block.minecraft.banner.twilightforest.snow_queen.yellow": "uʍoɹƆ uǝǝnꝹ ʍouS ʍoꞁꞁǝ⅄", + "block.minecraft.banner.twilightforest.ur_ghast.black": "ɹǝpɹoᗺ ǝʇᴉuᴉɯɹɐƆ ʞɔɐꞁᗺ", + "block.minecraft.banner.twilightforest.ur_ghast.blue": "ɹǝpɹoᗺ ǝʇᴉuᴉɯɹɐƆ ǝnꞁᗺ", + "block.minecraft.banner.twilightforest.ur_ghast.brown": "ɹǝpɹoᗺ ǝʇᴉuᴉɯɹɐƆ uʍoɹᗺ", + "block.minecraft.banner.twilightforest.ur_ghast.cyan": "ɹǝpɹoᗺ ǝʇᴉuᴉɯɹɐƆ uɐʎƆ", + "block.minecraft.banner.twilightforest.ur_ghast.gray": "ɹǝpɹoᗺ ǝʇᴉuᴉɯɹɐƆ ʎɐɹ⅁", + "block.minecraft.banner.twilightforest.ur_ghast.green": "ɹǝpɹoᗺ ǝʇᴉuᴉɯɹɐƆ uǝǝɹ⅁", + "block.minecraft.banner.twilightforest.ur_ghast.light_blue": "ɹǝpɹoᗺ ǝʇᴉuᴉɯɹɐƆ ǝnꞁᗺ ʇɥᵷᴉꞀ", + "block.minecraft.banner.twilightforest.ur_ghast.light_gray": "ɹǝpɹoᗺ ǝʇᴉuᴉɯɹɐƆ ʎɐɹ⅁ ʇɥᵷᴉꞀ", + "block.minecraft.banner.twilightforest.ur_ghast.lime": "ɹǝpɹoᗺ ǝʇᴉuᴉɯɹɐƆ ǝɯᴉꞀ", + "block.minecraft.banner.twilightforest.ur_ghast.magenta": "ɹǝpɹoᗺ ǝʇᴉuᴉɯɹɐƆ ɐʇuǝᵷɐW", + "block.minecraft.banner.twilightforest.ur_ghast.orange": "ɹǝpɹoᗺ ǝʇᴉuᴉɯɹɐƆ ǝᵷuɐɹO", + "block.minecraft.banner.twilightforest.ur_ghast.pink": "ɹǝpɹoᗺ ǝʇᴉuᴉɯɹɐƆ ʞuᴉԀ", + "block.minecraft.banner.twilightforest.ur_ghast.purple": "ɹǝpɹoᗺ ǝʇᴉuᴉɯɹɐƆ ǝꞁdɹnԀ", + "block.minecraft.banner.twilightforest.ur_ghast.red": "ɹǝpɹoᗺ ǝʇᴉuᴉɯɹɐƆ pǝᴚ", + "block.minecraft.banner.twilightforest.ur_ghast.white": "ɹǝpɹoᗺ ǝʇᴉuᴉɯɹɐƆ ǝʇᴉɥM", + "block.minecraft.banner.twilightforest.ur_ghast.yellow": "ɹǝpɹoᗺ ǝʇᴉuᴉɯɹɐƆ ʍoꞁꞁǝ⅄", + "block.twilightforest.acacia_banister": "ɹǝʇsᴉuɐᗺ ɐᴉɔɐɔⱯ", + "block.twilightforest.alpha_yeti_boss_spawner": "ɹǝuʍɐdS ssoᗺ ᴉʇǝ⅄ ɐɥdꞁⱯ", + "block.twilightforest.alpha_yeti_trophy": "ʎɥdoɹ⟘ ᴉʇǝ⅄ ɐɥdꞁⱯ", + "block.twilightforest.antibuilder": "ɹǝpꞁᴉnqᴉʇuⱯ", + "block.twilightforest.antibuilt_block": "ʞɔoꞁᗺ ʇꞁᴉnqᴉʇuⱯ", + "block.twilightforest.arctic_fur_block": "ɹnℲ ɔᴉʇɔɹⱯ ɟo ʞɔoꞁᗺ", + "block.twilightforest.arctic_fur_block.desc": "%06 ʎq ǝᵷɐɯɐp ꞁꞁɐɟ sǝɔnpǝᴚ", + "block.twilightforest.aurora_block": "ʞɔoꞁᗺ ɐɹoɹnⱯ", + "block.twilightforest.aurora_pillar": "ɹɐꞁꞁᴉԀ ɐɹoɹnⱯ", + "block.twilightforest.aurora_slab": "qɐꞁS ɐɹoɹnⱯ", + "block.twilightforest.auroralized_glass": "ssɐꞁ⅁ pǝzᴉꞁɐɹoɹnⱯ", + "block.twilightforest.banister.cycle": "ǝꞁɔʎɔ oʇ ǝxɐ uɐ ɥʇᴉʍ ʞɔᴉꞁɔ ʇɥᵷᴉᴚ", + "block.twilightforest.beanstalk_leaves": "sǝʌɐǝꞀ ʞꞁɐʇsuɐǝᗺ", + "block.twilightforest.birch_banister": "ɹǝʇsᴉuɐᗺ ɥɔɹᴉᗺ", + "block.twilightforest.blue_castle_door": "ɹooᗡ ǝꞁʇsɐƆ ǝnꞁᗺ", + "block.twilightforest.blue_castle_rune_brick": "ʞɔᴉɹᗺ ǝunᴚ ǝꞁʇsɐƆ ǝnꞁᗺ", + "block.twilightforest.blue_force_field": "pꞁǝᴉℲ ǝɔɹoℲ ǝnꞁᗺ", + "block.twilightforest.bold_castle_brick_pillar": "ɹɐꞁꞁᴉԀ ʞɔᴉɹᗺ ǝꞁʇsɐƆ pꞁoᗺ", + "block.twilightforest.bold_castle_brick_stairs": "sɹᴉɐʇS ʞɔᴉɹᗺ ǝꞁʇsɐƆ pꞁoᗺ", + "block.twilightforest.bold_castle_brick_tile": "ǝꞁᴉ⟘ ʞɔᴉɹᗺ ǝꞁʇsɐƆ pꞁoᗺ", + "block.twilightforest.bold_stone_pillar": "ɹɐꞁꞁᴉԀ ǝuoʇS pꞁoᗺ", + "block.twilightforest.brown_thorns": "suɹoɥ⟘", + "block.twilightforest.built_block": "ʞɔoꞁᗺ ʇꞁᴉnᗺ", + "block.twilightforest.burnt_thorns": "suɹoɥ⟘ ʇuɹnᗺ", + "block.twilightforest.candelabra": "ɐɹqɐꞁǝpuɐƆ", + "block.twilightforest.canopy_banister": "ɹǝʇsᴉuɐᗺ ʎdouɐƆ", + "block.twilightforest.canopy_bookshelf": "ɟꞁǝɥsʞooᗺ ʎdouɐƆ", + "block.twilightforest.canopy_button": "uoʇʇnᗺ ʎdouɐƆ", + "block.twilightforest.canopy_chest": "ʇsǝɥƆ ʎdouɐƆ", + "block.twilightforest.canopy_door": "ɹooᗡ ʎdouɐƆ", + "block.twilightforest.canopy_fence": "ǝɔuǝℲ ʎdouɐƆ", + "block.twilightforest.canopy_fence_gate": "ǝʇɐ⅁ ǝɔuǝℲ ʎdouɐƆ", + "block.twilightforest.canopy_leaves": "sǝʌɐǝꞀ ǝǝɹ⟘ ʎdouɐƆ", + "block.twilightforest.canopy_log": "ᵷoꞀ ǝǝɹ⟘ ʎdouɐƆ", + "block.twilightforest.canopy_planks": "sʞuɐꞁԀ ʎdouɐƆ", + "block.twilightforest.canopy_pressure_plate": "ǝʇɐꞁԀ ǝɹnssǝɹԀ ʎdouɐƆ", + "block.twilightforest.canopy_sapling": "ᵷuᴉꞁdɐS ǝǝɹ⟘ ʎdouɐƆ", + "block.twilightforest.canopy_sign": "uᵷᴉS ʎdouɐƆ", + "block.twilightforest.canopy_slab": "qɐꞁS ʎdouɐƆ", + "block.twilightforest.canopy_stairs": "sɹᴉɐʇS ʎdouɐƆ", + "block.twilightforest.canopy_trapdoor": "ɹoopdɐɹ⟘ ʎdouɐƆ", + "block.twilightforest.canopy_wall_sign": "uᵷᴉS ꞁꞁɐM ʎdouɐƆ", + "block.twilightforest.canopy_wood": "pooM ǝǝɹ⟘ ʎdouɐƆ", + "block.twilightforest.carminite_block": "ǝʇᴉuᴉɯɹɐƆ ɟo ʞɔoꞁᗺ", + "block.twilightforest.carminite_builder": "ɹǝpꞁᴉnᗺ ǝʇᴉuᴉɯɹɐƆ", + "block.twilightforest.carminite_reactor": "ɹoʇɔɐǝᴚ ǝʇᴉuᴉɯɹɐƆ", + "block.twilightforest.casket.broken": "˙punoɹᵷ ǝɥʇ uo pǝddoɹp ǝɹǝʍ ʇǝʞsɐɔ ɹnoʎ uᴉ pǝɹoʇs ǝq pꞁnoʍ ʇɐɥʇ sɯǝʇᴉ ꞁꞁⱯ ˙sɯǝʇᴉ ǝɹoɯ ʎuɐ pꞁoɥ oʇ pǝᵷɐɯɐp ooʇ sɐʍ ʇǝʞsɐƆ ǝʞɐsdǝǝꞰ ɹno⅄", + "block.twilightforest.casket.locked": "¡%s ʎq pǝuǝdo ǝq ʎꞁuo uɐɔ ʇǝʞsɐƆ sᴉɥ⟘", + "block.twilightforest.castle_brick": "ʞɔᴉɹᗺ ǝꞁʇsɐƆ", + "block.twilightforest.castle_brick_stairs": "sɹᴉɐʇS ʞɔᴉɹᗺ ǝꞁʇsɐƆ", + "block.twilightforest.castle_roof_tile": "ǝꞁᴉ⟘ ɟooᴚ ǝꞁʇsɐƆ", + "block.twilightforest.cicada": "ɐpɐɔᴉƆ", + "block.twilightforest.cicada_jar": "ɹɐՐ ɐpɐɔᴉƆ", + "block.twilightforest.cinder_furnace": "ǝɔɐuɹnℲ ɹǝpuᴉƆ", + "block.twilightforest.cinder_log": "ᵷoꞀ ɹǝpuᴉƆ", + "block.twilightforest.cinder_wood": "pooM ɹǝpuᴉƆ", + "block.twilightforest.clover_patch": "ɥɔʇɐԀ ɹǝʌoꞁƆ", + "block.twilightforest.cracked_castle_brick": "ʞɔᴉɹᗺ ǝꞁʇsɐƆ pǝʞɔɐɹƆ", + "block.twilightforest.cracked_castle_brick_stairs": "sɹᴉɐʇS ʞɔᴉɹᗺ ǝꞁʇsɐƆ pǝʞɔɐɹƆ", + "block.twilightforest.cracked_deadrock": "ʞɔoɹpɐǝᗡ pǝʞɔɐɹƆ", + "block.twilightforest.cracked_etched_nagastone": "ǝuoʇsɐᵷɐN pǝɥɔʇƎ pǝʞɔɐɹƆ", + "block.twilightforest.cracked_mazestone": "ʞɔᴉɹᗺ ǝuoʇsǝzɐW pǝʞɔɐɹƆ", + "block.twilightforest.cracked_nagastone_pillar": "ɹɐꞁꞁᴉԀ ǝuoʇsɐᵷɐN pǝʞɔɐɹƆ", + "block.twilightforest.cracked_nagastone_stairs_left": "(ʇɟǝꞀ) sɹᴉɐʇS ǝuoʇsɐᵷɐN pǝʞɔɐɹƆ", + "block.twilightforest.cracked_nagastone_stairs_right": "(ʇɥᵷᴉᴚ) sɹᴉɐʇS ǝuoʇsɐᵷɐN pǝʞɔɐɹƆ", + "block.twilightforest.cracked_towerwood": "sʞuɐꞁԀ pooʍɹǝʍo⟘ pǝʞɔɐɹƆ", + "block.twilightforest.cracked_underbrick": "ʞɔᴉɹqɹǝpu∩ pǝʞɔɐɹƆ", + "block.twilightforest.creeper_skull_candle": "ǝꞁpuɐƆ ꞁꞁnʞS ɹǝdǝǝɹƆ", + "block.twilightforest.creeper_wall_skull_candle": "ǝꞁpuɐƆ ꞁꞁnʞS ꞁꞁɐM ɹǝdǝǝɹƆ", + "block.twilightforest.crimson_banister": "ɹǝʇsᴉuɐᗺ uosɯᴉɹƆ", + "block.twilightforest.cut_mazestone": "ǝuoʇsǝzɐW ʇnƆ", + "block.twilightforest.dark_banister": "ɹǝʇsᴉuɐᗺ pooʍʞɹɐᗡ", + "block.twilightforest.dark_button": "uoʇʇnᗺ pooʍʞɹɐᗡ", + "block.twilightforest.dark_chest": "ʇsǝɥƆ pooʍʞɹɐᗡ", + "block.twilightforest.dark_door": "ɹooᗡ pooʍʞɹɐᗡ", + "block.twilightforest.dark_fence": "ǝɔuǝℲ pooʍʞɹɐᗡ", + "block.twilightforest.dark_fence_gate": "ǝʇɐ⅁ ǝɔuǝℲ pooʍʞɹɐᗡ", + "block.twilightforest.dark_leaves": "sǝʌɐǝꞀ pooʍʞɹɐᗡ", + "block.twilightforest.dark_log": "ᵷoꞀ pooʍʞɹɐᗡ", + "block.twilightforest.dark_oak_banister": "ɹǝʇsᴉuɐᗺ ʞɐO ʞɹɐᗡ", + "block.twilightforest.dark_planks": "sʞuɐꞁԀ pooʍʞɹɐᗡ", + "block.twilightforest.dark_pressure_plate": "ǝʇɐꞁԀ ǝɹnssǝɹԀ pooʍʞɹɐᗡ", + "block.twilightforest.dark_sign": "uᵷᴉS pooʍʞɹɐᗡ", + "block.twilightforest.dark_slab": "qɐꞁS pooʍʞɹɐᗡ", + "block.twilightforest.dark_stairs": "sɹᴉɐʇS pooʍʞɹɐᗡ", + "block.twilightforest.dark_trapdoor": "ɹoopdɐɹ⟘ pooʍʞɹɐᗡ", + "block.twilightforest.dark_wall_sign": "uᵷᴉS ꞁꞁɐM pooʍʞɹɐᗡ", + "block.twilightforest.dark_wood": "pooM pooʍʞɹɐᗡ", + "block.twilightforest.darkwood_sapling": "ᵷuᴉꞁdɐS pooʍʞɹɐᗡ", + "block.twilightforest.deadrock": "ʞɔoɹpɐǝᗡ", + "block.twilightforest.death_tome_spawner": "ɹǝuʍɐdS ǝɯo⟘ ɥʇɐǝᗡ", + "block.twilightforest.decorative_mazestone": "ʞɔᴉɹᗺ ǝuoʇsǝzɐW ǝʌᴉʇɐɹoɔǝᗡ", + "block.twilightforest.empty_canopy_bookshelf": "ɟꞁǝɥsʞooᗺ ʎdouɐƆ ʎʇdɯƎ", + "block.twilightforest.encased_castle_brick_pillar": "ɹɐꞁꞁᴉԀ ʞɔᴉɹᗺ ǝꞁʇsɐƆ pǝsɐɔuƎ", + "block.twilightforest.encased_castle_brick_stairs": "sɹᴉɐʇS ʞɔᴉɹᗺ ǝꞁʇsɐƆ pǝsɐɔuƎ", + "block.twilightforest.encased_castle_brick_tile": "ǝꞁᴉ⟘ ʞɔᴉɹᗺ ǝꞁʇsɐƆ pǝsɐɔuƎ", + "block.twilightforest.encased_fire_jet": "ʇǝՐ ǝɹᴉℲ pǝsɐɔuƎ", + "block.twilightforest.encased_smoker": "ɹǝʞoɯS pǝsɐɔuƎ", + "block.twilightforest.encased_towerwood": "sʞuɐꞁԀ pooʍɹǝʍo⟘ pǝsɐɔuƎ", + "block.twilightforest.etched_nagastone": "ǝuoʇsɐᵷɐN pǝɥɔʇƎ", + "block.twilightforest.experiment_115": "ϛ⥝⥝ ʇuǝɯᴉɹǝdxƎ", + "block.twilightforest.fake_diamond": "ʞɔoꞁᗺ puoɯɐᴉᗡ", + "block.twilightforest.fake_gold": "ʞɔoꞁᗺ pꞁo⅁", + "block.twilightforest.fallen_leaves": "sǝʌɐǝꞀ uǝꞁꞁɐℲ", + "block.twilightforest.fiddlehead": "ǝꞁddɐʎɐW", + "block.twilightforest.fiery_block": "ꞁɐʇǝW ʎɹǝᴉℲ ɟo ʞɔoꞁᗺ", + "block.twilightforest.final_boss_boss_spawner": "ɹǝuʍɐdS ssoᗺ ssoᗺ ꞁɐuᴉℲ", + "block.twilightforest.fire_jet": "ʇǝՐ ǝɹᴉℲ", + "block.twilightforest.firefly": "ʎꞁɟǝɹᴉℲ", + "block.twilightforest.firefly_jar": "ɹɐՐ ʎꞁɟǝɹᴉℲ", + "block.twilightforest.firefly_particle_spawner": "ɹǝuʍɐdS ǝꞁɔᴉʇɹɐԀ ʎꞁɟǝɹᴉℲ", + "block.twilightforest.fluffy_cloud": "pnoꞁƆ ʎɟɟnꞁℲ", + "block.twilightforest.ghast_trap": "dɐɹ⟘ ʇsɐɥ⅁", + "block.twilightforest.giant_cobblestone": "ǝuoʇsǝꞁqqoƆ ʇuɐᴉ⅁", + "block.twilightforest.giant_leaves": "sǝʌɐǝꞀ ʇuɐᴉ⅁", + "block.twilightforest.giant_log": "ᵷoꞀ ʇuɐᴉ⅁", + "block.twilightforest.giant_obsidian": "uɐᴉpᴉsqO ʇuɐᴉ⅁", + "block.twilightforest.green_force_field": "pꞁǝᴉℲ ǝɔɹoℲ uǝǝɹ⅁", + "block.twilightforest.green_thorns": "suɹoɥ⟘ uǝǝɹ⅁", + "block.twilightforest.hardened_dark_leaves": "sǝʌɐǝꞀ pooʍʞɹɐᗡ ʞɔᴉɥ⟘", + "block.twilightforest.hedge": "ǝᵷpǝH", + "block.twilightforest.hollow_acacia_log_climbable": "ᵷoꞀ ɐᴉɔɐɔⱯ ʍoꞁꞁoH", + "block.twilightforest.hollow_acacia_log_horizontal": "ᵷoꞀ ɐᴉɔɐɔⱯ ʍoꞁꞁoH", + "block.twilightforest.hollow_acacia_log_vertical": "ᵷoꞀ ɐᴉɔɐɔⱯ ʍoꞁꞁoH", + "block.twilightforest.hollow_birch_log_climbable": "ᵷoꞀ ɥɔɹᴉᗺ ʍoꞁꞁoH", + "block.twilightforest.hollow_birch_log_horizontal": "ᵷoꞀ ɥɔɹᴉᗺ ʍoꞁꞁoH", + "block.twilightforest.hollow_birch_log_vertical": "ᵷoꞀ ɥɔɹᴉᗺ ʍoꞁꞁoH", + "block.twilightforest.hollow_canopy_log_climbable": "ᵷoꞀ ǝǝɹ⟘ ʎdouɐƆ ʍoꞁꞁoH", + "block.twilightforest.hollow_canopy_log_horizontal": "ᵷoꞀ ǝǝɹ⟘ ʎdouɐƆ ʍoꞁꞁoH", + "block.twilightforest.hollow_canopy_log_vertical": "ᵷoꞀ ǝǝɹ⟘ ʎdouɐƆ ʍoꞁꞁoH", + "block.twilightforest.hollow_crimson_stem_climbable": "ɯǝʇS uosɯᴉɹƆ ʍoꞁꞁoH", + "block.twilightforest.hollow_crimson_stem_horizontal": "ɯǝʇS uosɯᴉɹƆ ʍoꞁꞁoH", + "block.twilightforest.hollow_crimson_stem_vertical": "ɯǝʇS uosɯᴉɹƆ ʍoꞁꞁoH", + "block.twilightforest.hollow_dark_log_climbable": "ᵷoꞀ pooʍʞɹɐᗡ ʍoꞁꞁoH", + "block.twilightforest.hollow_dark_log_horizontal": "ᵷoꞀ pooʍʞɹɐᗡ ʍoꞁꞁoH", + "block.twilightforest.hollow_dark_log_vertical": "ᵷoꞀ pooʍʞɹɐᗡ ʍoꞁꞁoH", + "block.twilightforest.hollow_dark_oak_log_climbable": "ᵷoꞀ ʞɐO ʞɹɐᗡ ʍoꞁꞁoH", + "block.twilightforest.hollow_dark_oak_log_horizontal": "ᵷoꞀ ʞɐO ʞɹɐᗡ ʍoꞁꞁoH", + "block.twilightforest.hollow_dark_oak_log_vertical": "ᵷoꞀ ʞɐO ʞɹɐᗡ ʍoꞁꞁoH", + "block.twilightforest.hollow_jungle_log_climbable": "ᵷoꞀ ǝꞁᵷunՐ ʍoꞁꞁoH", + "block.twilightforest.hollow_jungle_log_horizontal": "ᵷoꞀ ǝꞁᵷunՐ ʍoꞁꞁoH", + "block.twilightforest.hollow_jungle_log_vertical": "ᵷoꞀ ǝꞁᵷunՐ ʍoꞁꞁoH", + "block.twilightforest.hollow_mangrove_log_climbable": "ᵷoꞀ ǝʌoɹᵷuɐW ʍoꞁꞁoH", + "block.twilightforest.hollow_mangrove_log_horizontal": "ᵷoꞀ ǝʌoɹᵷuɐW ʍoꞁꞁoH", + "block.twilightforest.hollow_mangrove_log_vertical": "ᵷoꞀ ǝʌoɹᵷuɐW ʍoꞁꞁoH", + "block.twilightforest.hollow_mining_log_climbable": "ᵷoꞀ pooʍǝuᴉW ʍoꞁꞁoH", + "block.twilightforest.hollow_mining_log_horizontal": "ᵷoꞀ pooʍǝuᴉW ʍoꞁꞁoH", + "block.twilightforest.hollow_mining_log_vertical": "ᵷoꞀ pooʍǝuᴉW ʍoꞁꞁoH", + "block.twilightforest.hollow_oak_log_climbable": "ᵷoꞀ ʞɐO ʍoꞁꞁoH", + "block.twilightforest.hollow_oak_log_horizontal": "ᵷoꞀ ʞɐO ʍoꞁꞁoH", + "block.twilightforest.hollow_oak_log_vertical": "ᵷoꞀ ʞɐO ʍoꞁꞁoH", + "block.twilightforest.hollow_oak_sapling": "ᵷuᴉꞁdɐS ʞɐO ʇɥᵷᴉꞁᴉʍ⟘ ʇsnqoᴚ", + "block.twilightforest.hollow_sorting_log_climbable": "ᵷoꞀ pooʍᵷuᴉʇɹoS ʍoꞁꞁoH", + "block.twilightforest.hollow_sorting_log_horizontal": "ᵷoꞀ pooʍᵷuᴉʇɹoS ʍoꞁꞁoH", + "block.twilightforest.hollow_sorting_log_vertical": "ᵷoꞀ pooʍᵷuᴉʇɹoS ʍoꞁꞁoH", + "block.twilightforest.hollow_spruce_log_climbable": "ᵷoꞀ ǝɔnɹdS ʍoꞁꞁoH", + "block.twilightforest.hollow_spruce_log_horizontal": "ᵷoꞀ ǝɔnɹdS ʍoꞁꞁoH", + "block.twilightforest.hollow_spruce_log_vertical": "ᵷoꞀ ǝɔnɹdS ʍoꞁꞁoH", + "block.twilightforest.hollow_time_log_climbable": "ᵷoꞀ pooʍǝɯᴉ⟘ ʍoꞁꞁoH", + "block.twilightforest.hollow_time_log_horizontal": "ᵷoꞀ pooʍǝɯᴉ⟘ ʍoꞁꞁoH", + "block.twilightforest.hollow_time_log_vertical": "ᵷoꞀ pooʍǝɯᴉ⟘ ʍoꞁꞁoH", + "block.twilightforest.hollow_transformation_log_climbable": "ᵷoꞀ pooʍsuɐɹ⟘ ʍoꞁꞁoH", + "block.twilightforest.hollow_transformation_log_horizontal": "ᵷoꞀ pooʍsuɐɹ⟘ ʍoꞁꞁoH", + "block.twilightforest.hollow_transformation_log_vertical": "ᵷoꞀ pooʍsuɐɹ⟘ ʍoꞁꞁoH", + "block.twilightforest.hollow_twilight_oak_log_climbable": "ᵷoꞀ ʞɐO ʇɥᵷᴉꞁᴉʍ⟘ ʍoꞁꞁoH", + "block.twilightforest.hollow_twilight_oak_log_horizontal": "ᵷoꞀ ʞɐO ʇɥᵷᴉꞁᴉʍ⟘ ʍoꞁꞁoH", + "block.twilightforest.hollow_twilight_oak_log_vertical": "ᵷoꞀ ʞɐO ʇɥᵷᴉꞁᴉʍ⟘ ʍoꞁꞁoH", + "block.twilightforest.hollow_vangrove_log_climbable": "ᵷoꞀ ǝʌoɹᵷuɐW ʍoꞁꞁoH", + "block.twilightforest.hollow_vangrove_log_horizontal": "ᵷoꞀ ǝʌoɹᵷuɐW ʍoꞁꞁoH", + "block.twilightforest.hollow_vangrove_log_vertical": "ᵷoꞀ ǝʌoɹᵷuɐW ʍoꞁꞁoH", + "block.twilightforest.hollow_warped_stem_climbable": "ɯǝʇS pǝdɹɐM ʍoꞁꞁoH", + "block.twilightforest.hollow_warped_stem_horizontal": "ɯǝʇS pǝdɹɐM ʍoꞁꞁoH", + "block.twilightforest.hollow_warped_stem_vertical": "ɯǝʇS pǝdɹɐM ʍoꞁꞁoH", + "block.twilightforest.huge_lily_pad": "pɐԀ ʎꞁᴉꞀ ǝᵷnH", + "block.twilightforest.huge_mushgloom": "ʞɔoꞁᗺ ɯooꞁᵷɥsnW ǝᵷnH", + "block.twilightforest.huge_mushgloom_stem": "ɯǝʇS ɯooꞁᵷɥsnW ǝᵷnH", + "block.twilightforest.huge_stalk": "ʞꞁɐʇS ǝᵷnH", + "block.twilightforest.huge_water_lily": "ʎꞁᴉꞀ ɹǝʇɐM ǝᵷnH", + "block.twilightforest.hydra_boss_spawner": "ɹǝuʍɐdS ssoᗺ ɐɹpʎH", + "block.twilightforest.hydra_trophy": "ʎɥdoɹ⟘ ɐɹpʎH", + "block.twilightforest.infested_towerwood": "sʞuɐꞁԀ pooʍɹǝʍo⟘ pǝʇsǝɟuI", + "block.twilightforest.iron_ladder": "ɹǝppɐꞀ uoɹI", + "block.twilightforest.ironwood_block": "pooʍuoɹI ɟo ʞɔoꞁᗺ", + "block.twilightforest.jungle_banister": "ɹǝʇsᴉuɐᗺ ǝꞁᵷunՐ", + "block.twilightforest.keepsake_casket": "ʇǝʞsɐƆ ǝʞɐsdǝǝꞰ", + "block.twilightforest.knight_phantom_boss_spawner": "ɹǝuʍɐdS ssoᗺ ɯoʇuɐɥԀ ʇɥᵷᴉuꞰ", + "block.twilightforest.knight_phantom_trophy": "ʎɥdoɹ⟘ ɯoʇuɐɥԀ ʇɥᵷᴉuꞰ", + "block.twilightforest.knightmetal_block": "ꞁɐʇǝɯʇɥᵷᴉuꞰ ɟo ʞɔoꞁᗺ", + "block.twilightforest.knightmetal_block.desc": "snʇɔɐɔ ɹǝᵷuoɹʇs ɐ sɐ sʞɹoM", + "block.twilightforest.lich_boss_spawner": "ɹǝuʍɐdS ssoᗺ ɥɔᴉꞀ", + "block.twilightforest.lich_tower_miniature_structure": "ɹǝʍo⟘ ɥɔᴉꞀ ǝɹnʇɐᴉuᴉW", + "block.twilightforest.lich_trophy": "ʎɥdoɹ⟘ ɥɔᴉꞀ", + "block.twilightforest.liveroot_block": "sʇooɹǝʌᴉꞀ", + "block.twilightforest.locked_vanishing_block": "ʞɔoꞁᗺ ᵷuᴉɥsᴉuɐɅ pǝʞɔoꞀ", + "block.twilightforest.mangrove_banister": "ɹǝʇsᴉuɐᗺ ǝʌoɹᵷuɐW", + "block.twilightforest.mangrove_button": "uoʇʇnᗺ ǝʌoɹᵷuɐW", + "block.twilightforest.mangrove_chest": "ʇsǝɥƆ ǝʌoɹᵷuɐW", + "block.twilightforest.mangrove_door": "ɹooᗡ ǝʌoɹᵷuɐW", + "block.twilightforest.mangrove_fence": "ǝɔuǝℲ ǝʌoɹᵷuɐW", + "block.twilightforest.mangrove_fence_gate": "ǝʇɐ⅁ ǝɔuǝℲ ǝʌoɹᵷuɐW", + "block.twilightforest.mangrove_leaves": "sǝʌɐǝꞀ ǝʌoɹᵷuɐW", + "block.twilightforest.mangrove_log": "ᵷoꞀ ǝʌoɹᵷuɐW", + "block.twilightforest.mangrove_planks": "sʞuɐꞁԀ ǝʌoɹᵷuɐW", + "block.twilightforest.mangrove_pressure_plate": "ǝʇɐꞁԀ ǝɹnssǝɹԀ ǝʌoɹᵷuɐW", + "block.twilightforest.mangrove_root": "sʇooᴚ ǝʌoɹᵷuɐW", + "block.twilightforest.mangrove_sapling": "ᵷuᴉꞁdɐS ǝʌoɹᵷuɐW", + "block.twilightforest.mangrove_sign": "uᵷᴉS ǝʌoɹᵷuɐW", + "block.twilightforest.mangrove_slab": "qɐꞁS ǝʌoɹᵷuɐW", + "block.twilightforest.mangrove_stairs": "sɹᴉɐʇS ǝʌoɹᵷuɐW", + "block.twilightforest.mangrove_trapdoor": "ɹoopdɐɹ⟘ ǝʌoɹᵷuɐW", + "block.twilightforest.mangrove_wall_sign": "uᵷᴉS ꞁꞁɐM ǝʌoɹᵷuɐW", + "block.twilightforest.mangrove_wood": "pooM ǝʌoɹᵷuɐW", + "block.twilightforest.mayapple": "ǝꞁddɐʎɐW", + "block.twilightforest.mazestone": "ǝuoʇsǝzɐW", + "block.twilightforest.mazestone_border": "ɹǝpɹoᗺ ǝuoʇsǝzɐW", + "block.twilightforest.mazestone_brick": "ʞɔᴉɹᗺ ǝuoʇsǝzɐW", + "block.twilightforest.mazestone_mosaic": "ɔᴉɐsoW ǝuoʇsǝzɐW", + "block.twilightforest.mining_banister": "ɹǝʇsᴉuɐᗺ pooʍǝuᴉW", + "block.twilightforest.mining_button": "uoʇʇnᗺ pooʍǝuᴉW", + "block.twilightforest.mining_chest": "ʇsǝɥƆ pooʍǝuᴉW", + "block.twilightforest.mining_door": "ɹooᗡ pooʍǝuᴉW", + "block.twilightforest.mining_fence": "ǝɔuǝℲ pooʍǝuᴉW", + "block.twilightforest.mining_fence_gate": "ǝʇɐ⅁ ǝɔuǝℲ pooʍǝuᴉW", + "block.twilightforest.mining_leaves": "sǝʌɐǝꞀ s,ɹǝuᴉW", + "block.twilightforest.mining_log": "ᵷoꞀ pooʍǝuᴉW", + "block.twilightforest.mining_log_core": "ǝɹoƆ pooʍǝuᴉW", + "block.twilightforest.mining_planks": "sʞuɐꞁԀ pooʍǝuᴉW", + "block.twilightforest.mining_pressure_plate": "ǝʇɐꞁԀ ǝɹnssǝɹԀ pooʍǝuᴉW", + "block.twilightforest.mining_sapling": "ᵷuᴉꞁdɐS ǝǝɹ⟘ s,ɹǝuᴉW", + "block.twilightforest.mining_sign": "uᵷᴉS pooʍǝuᴉW", + "block.twilightforest.mining_slab": "qɐꞁS pooʍǝuᴉW", + "block.twilightforest.mining_stairs": "sɹᴉɐʇS pooʍǝuᴉW", + "block.twilightforest.mining_trapdoor": "ɹoopdɐɹ⟘ pooʍǝuᴉW", + "block.twilightforest.mining_wall_sign": "uᵷᴉS ꞁꞁɐM pooʍǝuᴉW", + "block.twilightforest.mining_wood": "pooM pooʍǝuᴉW", + "block.twilightforest.minoshroom_boss_spawner": "ɹǝuʍɐdS ssoᗺ ɯooɹɥsouᴉW", + "block.twilightforest.minoshroom_trophy": "ʎɥdoɹ⟘ ɯooɹɥsouᴉW", + "block.twilightforest.moonworm": "ɯɹoʍuooW", + "block.twilightforest.moss_patch": "ɥɔʇɐԀ ssoW", + "block.twilightforest.mossy_castle_brick": "ʞɔᴉɹᗺ ǝꞁʇsɐƆ ʎssoW", + "block.twilightforest.mossy_castle_brick_stairs": "sɹᴉɐʇS ʞɔᴉɹᗺ ǝꞁʇsɐƆ ʎssoW", + "block.twilightforest.mossy_etched_nagastone": "ǝuoʇsɐᵷɐN pǝɥɔʇƎ ʎssoW", + "block.twilightforest.mossy_mazestone": "ʞɔᴉɹᗺ ǝuoʇsǝzɐW ʎssoW", + "block.twilightforest.mossy_nagastone_pillar": "ɹɐꞁꞁᴉԀ ǝuoʇsɐᵷɐN ʎssoW", + "block.twilightforest.mossy_nagastone_stairs_left": "(ʇɟǝꞀ) sɹᴉɐʇS ǝuoʇsɐᵷɐN ʎssoW", + "block.twilightforest.mossy_nagastone_stairs_right": "(ʇɥᵷᴉᴚ) sɹᴉɐʇS ǝuoʇsɐᵷɐN ʎssoW", + "block.twilightforest.mossy_towerwood": "sʞuɐꞁԀ pooʍɹǝʍo⟘ ʎssoW", + "block.twilightforest.mossy_underbrick": "ʞɔᴉɹqɹǝpu∩ ʎssoW", + "block.twilightforest.mushgloom": "ɯooꞁᵷɥsnW", + "block.twilightforest.naga_boss_spawner": "ɹǝuʍɐdS ssoᗺ ɐᵷɐN", + "block.twilightforest.naga_courtyard_miniature_structure": "pɹɐʎʇɹnoƆ ɐᵷɐN ǝɹnʇɐᴉuᴉW", + "block.twilightforest.naga_trophy": "ʎɥdoɹ⟘ ɐᵷɐN", + "block.twilightforest.nagastone": "ǝuoʇsɐᵷɐN", + "block.twilightforest.nagastone_head": "pɐǝH ǝuoʇsɐᵷɐN", + "block.twilightforest.nagastone_pillar": "ɹɐꞁꞁᴉԀ ǝuoʇsɐᵷɐN", + "block.twilightforest.nagastone_stairs_left": "(ʇɟǝꞀ) sɹᴉɐʇS ǝuoʇsɐᵷɐN", + "block.twilightforest.nagastone_stairs_right": "(ʇɥᵷᴉᴚ) sɹᴉɐʇS ǝuoʇsɐᵷɐN", + "block.twilightforest.oak_banister": "ɹǝʇsᴉuɐᗺ ʞɐO", + "block.twilightforest.orange_force_field": "pꞁǝᴉℲ ǝɔɹoℲ ǝᵷuɐɹO", + "block.twilightforest.pink_castle_door": "ɹooᗡ ǝꞁʇsɐƆ ɐʇuǝᵷɐW", + "block.twilightforest.pink_castle_rune_brick": "ʞɔᴉɹᗺ ǝunᴚ ǝꞁʇsɐƆ ɐʇuǝᵷɐW", + "block.twilightforest.pink_force_field": "pꞁǝᴉℲ ǝɔɹoℲ ɐʇuǝᵷɐW", + "block.twilightforest.player_skull_candle": "ǝꞁpuɐƆ ꞁꞁnʞS ɹǝʎɐꞁԀ", + "block.twilightforest.player_skull_candle.named": "sǝꞁpuɐƆ ɥʇᴉʍ pɐǝH s,%s", + "block.twilightforest.player_wall_skull_candle": "ǝꞁpuɐƆ ꞁꞁnʞS ꞁꞁɐM ɹǝʎɐꞁԀ", + "block.twilightforest.potted_canopy_sapling": "ᵷuᴉꞁdɐS ǝǝɹ⟘ ʎdouɐƆ pǝʇʇoԀ", + "block.twilightforest.potted_darkwood_sapling": "ᵷuᴉꞁdɐS pooʍʞɹɐᗡ pǝʇʇoԀ", + "block.twilightforest.potted_dead_thorn": "uɹoɥ⟘ ʇuɹnᗺ pǝʇʇoԀ", + "block.twilightforest.potted_fiddlehead": "ǝꞁddɐʎɐW pǝʇʇoԀ", + "block.twilightforest.potted_green_thorn": "uɹoɥ⟘ uǝǝɹ⅁ pǝʇʇoԀ", + "block.twilightforest.potted_hollow_oak_sapling": "ᵷuᴉꞁdɐS ʞɐO ʇɥᵷᴉꞁᴉʍ⟘ ʇsnqoᴚ pǝʇʇoԀ", + "block.twilightforest.potted_mangrove_sapling": "ᵷuᴉꞁdɐS ǝʌoɹᵷuɐW pǝʇʇoԀ", + "block.twilightforest.potted_mayapple": "ǝꞁddɐʎɐW pǝʇʇoԀ", + "block.twilightforest.potted_mining_sapling": "ᵷuᴉꞁdɐS ǝǝɹ⟘ s,ɹǝuᴉW pǝʇʇoԀ", + "block.twilightforest.potted_mushgloom": "ɯooꞁᵷɥsnW pǝʇʇoԀ", + "block.twilightforest.potted_rainbow_oak_sapling": "ᵷuᴉꞁdɐS ʞɐO ʍoquᴉɐᴚ pǝʇʇoԀ", + "block.twilightforest.potted_sorting_sapling": "ᵷuᴉꞁdɐS ǝǝɹ⟘ ᵷuᴉʇɹoS pǝʇʇoԀ", + "block.twilightforest.potted_thorn": "uɹoɥ⟘ pǝʇʇoԀ", + "block.twilightforest.potted_time_sapling": "ᵷuᴉꞁdɐS ǝɯᴉ⟘ ɟo ǝǝɹ⟘ pǝʇʇoԀ", + "block.twilightforest.potted_transformation_sapling": "ᵷuᴉꞁdɐS uoᴉʇɐɯɹoɟsuɐɹ⟘ ɟo ǝǝɹ⟘ pǝʇʇoԀ", + "block.twilightforest.potted_twilight_oak_sapling": "ᵷuᴉꞁdɐS ʞɐO ʇɥᵷᴉꞁᴉʍ⟘ ʎꞁʞɔᴉS pǝʇʇoԀ", + "block.twilightforest.quest_ram_trophy": "ʎɥdoɹ⟘ ɯɐᴚ ʇsǝnꝹ", + "block.twilightforest.rainbow_oak_leaves": "sǝʌɐǝꞀ ʞɐO ʍoquᴉɐᴚ", + "block.twilightforest.rainbow_oak_sapling": "ᵷuᴉꞁdɐS ʞɐO ʍoquᴉɐᴚ", + "block.twilightforest.reactor_debris": "sᴉɹqǝᗡ ɹoʇɔɐǝᴚ", + "block.twilightforest.reappearing_block": "ʞɔoꞁᗺ ᵷuᴉɹɐǝddɐǝᴚ", + "block.twilightforest.red_thread": "pɐǝɹɥ⟘ pǝᴚ", + "block.twilightforest.root": "sʇooᴚ", + "block.twilightforest.root_strand": "spuɐɹʇS ʇooᴚ", + "block.twilightforest.skeleton_skull_candle": "ǝꞁpuɐƆ ꞁꞁnʞS uoʇǝꞁǝʞS", + "block.twilightforest.skeleton_wall_skull_candle": "ǝꞁpuɐƆ ꞁꞁnʞS ꞁꞁɐM uoʇǝꞁǝʞS", + "block.twilightforest.slider": "dɐɹ⟘ ǝpᴉꞁS", + "block.twilightforest.smoker": "ɹǝʞoɯS", + "block.twilightforest.snow_queen_boss_spawner": "ɹǝuʍɐdS ssoᗺ uǝǝnꝹ ʍouS", + "block.twilightforest.snow_queen_trophy": "ʎɥdoɹ⟘ uǝǝnꝹ ʍouS", + "block.twilightforest.sorting_banister": "ɹǝʇsᴉuɐᗺ pooʍᵷuᴉʇɹoS", + "block.twilightforest.sorting_button": "uoʇʇnᗺ pooʍᵷuᴉʇɹoS", + "block.twilightforest.sorting_chest": "ʇsǝɥƆ pooʍᵷuᴉʇɹoS", + "block.twilightforest.sorting_door": "ɹooᗡ pooʍᵷuᴉʇɹoS", + "block.twilightforest.sorting_fence": "ǝɔuǝℲ pooʍᵷuᴉʇɹoS", + "block.twilightforest.sorting_fence_gate": "ǝʇɐ⅁ ǝɔuǝℲ pooʍᵷuᴉʇɹoS", + "block.twilightforest.sorting_leaves": "sǝʌɐǝꞀ ᵷuᴉʇɹoS", + "block.twilightforest.sorting_log": "ᵷoꞀ pooʍᵷuᴉʇɹoS", + "block.twilightforest.sorting_log_core": "ǝuᴉᵷuƎ pooʍᵷuᴉʇɹoS", + "block.twilightforest.sorting_planks": "sʞuɐꞁԀ pooʍᵷuᴉʇɹoS", + "block.twilightforest.sorting_pressure_plate": "ǝʇɐꞁԀ ǝɹnssǝɹԀ pooʍᵷuᴉʇɹoS", + "block.twilightforest.sorting_sapling": "ᵷuᴉꞁdɐS ǝǝɹ⟘ ᵷuᴉʇɹoS", + "block.twilightforest.sorting_sign": "uᵷᴉS pooʍᵷuᴉʇɹoS", + "block.twilightforest.sorting_slab": "qɐꞁS pooʍᵷuᴉʇɹoS", + "block.twilightforest.sorting_stairs": "sɹᴉɐʇS pooʍᵷuᴉʇɹoS", + "block.twilightforest.sorting_trapdoor": "ɹoopdɐɹ⟘ pooʍᵷuᴉʇɹoS", + "block.twilightforest.sorting_wall_sign": "uᵷᴉS ꞁꞁɐM pooʍᵷuᴉʇɹoS", + "block.twilightforest.sorting_wood": "pooM pooʍᵷuᴉʇɹoS", + "block.twilightforest.spiral_bricks": "sʞɔᴉɹᗺ ꞁɐɹᴉdS", + "block.twilightforest.spruce_banister": "ɹǝʇsᴉuɐᗺ ǝɔnɹdS", + "block.twilightforest.steeleaf_block": "ɟɐǝꞁǝǝʇS ɟo ʞɔoꞁᗺ", + "block.twilightforest.stripped_canopy_log": "ᵷoꞀ ǝǝɹ⟘ ʎdouɐƆ pǝddᴉɹʇS", + "block.twilightforest.stripped_canopy_wood": "pooM ǝǝɹ⟘ ʎdouɐƆ pǝddᴉɹʇS", + "block.twilightforest.stripped_dark_log": "ᵷoꞀ pooʍʞɹɐᗡ pǝddᴉɹʇS", + "block.twilightforest.stripped_dark_wood": "pooM pooʍʞɹɐᗡ pǝddᴉɹʇS", + "block.twilightforest.stripped_mangrove_log": "ᵷoꞀ ǝʌoɹᵷuɐW pǝddᴉɹʇS", + "block.twilightforest.stripped_mangrove_wood": "pooM ǝʌoɹᵷuɐW pǝddᴉɹʇS", + "block.twilightforest.stripped_mining_log": "ᵷoꞀ pooʍǝuᴉW pǝddᴉɹʇS", + "block.twilightforest.stripped_mining_wood": "pooM pooʍǝuᴉW pǝddᴉɹʇS", + "block.twilightforest.stripped_sorting_log": "ᵷoꞀ pooʍᵷuᴉʇɹoS pǝddᴉɹʇS", + "block.twilightforest.stripped_sorting_wood": "pooM pooʍᵷuᴉʇɹoS pǝddᴉɹʇS", + "block.twilightforest.stripped_time_log": "ᵷoꞀ pooʍǝɯᴉ⟘ pǝddᴉɹʇS", + "block.twilightforest.stripped_time_wood": "pooM pooʍǝɯᴉ⟘ pǝddᴉɹʇS", + "block.twilightforest.stripped_transformation_log": "ᵷoꞀ pooʍsuɐɹ⟘ pǝddᴉɹʇS", + "block.twilightforest.stripped_transformation_wood": "pooM pooʍsuɐɹ⟘ pǝddᴉɹʇS", + "block.twilightforest.stripped_twilight_oak_log": "ᵷoꞀ ʞɐO ʇɥᵷᴉꞁᴉʍ⟘ pǝddᴉɹʇS", + "block.twilightforest.stripped_twilight_oak_wood": "pooM ʞɐO ʇɥᵷᴉꞁᴉʍ⟘ pǝddᴉɹʇS", + "block.twilightforest.stronghold_shield": "pꞁǝᴉɥS pꞁoɥᵷuoɹʇS", + "block.twilightforest.thick_castle_brick": "ʞɔᴉɹᗺ ǝꞁʇsɐƆ ʞɔᴉɥ⟘", + "block.twilightforest.thorn_leaves": "sǝʌɐǝꞀ uɹoɥ⟘", + "block.twilightforest.thorn_rose": "ǝsoᴚ uɹoɥ⟘", + "block.twilightforest.time_banister": "ɹǝʇsᴉuɐᗺ pooʍǝɯᴉ⟘", + "block.twilightforest.time_button": "uoʇʇnᗺ pooʍǝɯᴉ⟘", + "block.twilightforest.time_chest": "ʇsǝɥƆ pooʍǝɯᴉ⟘", + "block.twilightforest.time_door": "ɹooᗡ pooʍǝɯᴉ⟘", + "block.twilightforest.time_fence": "ǝɔuǝℲ pooʍǝɯᴉ⟘", + "block.twilightforest.time_fence_gate": "ǝʇɐ⅁ ǝɔuǝℲ pooʍǝɯᴉ⟘", + "block.twilightforest.time_leaves": "sǝʌɐǝꞀ pooʍǝɯᴉ⟘", + "block.twilightforest.time_log": "ᵷoꞀ pooʍǝɯᴉ⟘", + "block.twilightforest.time_log_core": "ʞɔoꞁƆ pooʍǝɯᴉ⟘", + "block.twilightforest.time_planks": "sʞuɐꞁԀ pooʍǝɯᴉ⟘", + "block.twilightforest.time_pressure_plate": "ǝʇɐꞁԀ ǝɹnssǝɹԀ pooʍǝɯᴉ⟘", + "block.twilightforest.time_sapling": "ᵷuᴉꞁdɐS ǝɯᴉ⟘ ɟo ǝǝɹ⟘", + "block.twilightforest.time_sign": "uᵷᴉS pooʍǝɯᴉ⟘", + "block.twilightforest.time_slab": "qɐꞁS pooʍǝɯᴉ⟘", + "block.twilightforest.time_stairs": "sɹᴉɐʇS pooʍǝɯᴉ⟘", + "block.twilightforest.time_trapdoor": "ɹoopdɐɹ⟘ pooʍǝɯᴉ⟘", + "block.twilightforest.time_wall_sign": "uᵷᴉS ꞁꞁɐM pooʍǝɯᴉ⟘", + "block.twilightforest.time_wood": "pooM pooʍǝɯᴉ⟘", + "block.twilightforest.torchberry_plant": "ʇuɐꞁԀ ʎɹɹǝqɥɔɹo⟘", + "block.twilightforest.towerwood": "sʞuɐꞁԀ pooʍɹǝʍo⟘", + "block.twilightforest.transformation_banister": "ɹǝʇsᴉuɐᗺ pooʍsuɐɹ⟘", + "block.twilightforest.transformation_button": "uoʇʇnᗺ pooʍsuɐɹ⟘", + "block.twilightforest.transformation_chest": "ʇsǝɥƆ pooʍsuɐɹ⟘", + "block.twilightforest.transformation_door": "ɹooᗡ pooʍsuɐɹ⟘", + "block.twilightforest.transformation_fence": "ǝɔuǝℲ pooʍsuɐɹ⟘", + "block.twilightforest.transformation_fence_gate": "ǝʇɐ⅁ ǝɔuǝℲ pooʍsuɐɹ⟘", + "block.twilightforest.transformation_leaves": "uoᴉʇɐɯɹoɟsuɐɹ⟘ ɟo sǝʌɐǝꞀ", + "block.twilightforest.transformation_log": "ᵷoꞀ pooʍsuɐɹ⟘", + "block.twilightforest.transformation_log_core": "uoᴉʇɐɯɹoɟsuɐɹ⟘ ɟo ʇɹɐǝH", + "block.twilightforest.transformation_planks": "sʞuɐꞁԀ pooʍsuɐɹ⟘", + "block.twilightforest.transformation_pressure_plate": "ǝʇɐꞁԀ ǝɹnssǝɹԀ pooʍsuɐɹ⟘", + "block.twilightforest.transformation_sapling": "ᵷuᴉꞁdɐS uoᴉʇɐɯɹoɟsuɐɹ⟘ ɟo ǝǝɹ⟘", + "block.twilightforest.transformation_sign": "uᵷᴉS pooʍsuɐɹ⟘", + "block.twilightforest.transformation_slab": "qɐꞁS pooʍsuɐɹ⟘", + "block.twilightforest.transformation_stairs": "sɹᴉɐʇS pooʍsuɐɹ⟘", + "block.twilightforest.transformation_trapdoor": "ɹoopdɐɹ⟘ pooʍsuɐɹ⟘", + "block.twilightforest.transformation_wall_sign": "uᵷᴉS ꞁꞁɐM pooʍsuɐɹ⟘", + "block.twilightforest.transformation_wood": "pooM pooʍsuɐɹ⟘", + "block.twilightforest.trollber": "ɹǝqꞁꞁoɹ⟘", + "block.twilightforest.trollsteinn": "uuᴉǝʇsꞁꞁoɹ⟘", + "block.twilightforest.trollvidr": "ɹpᴉʌꞁꞁoɹ⟘", + "block.twilightforest.trophy_pedestal": "ꞁɐʇsǝpǝԀ ʎɥdoɹ⟘", + "block.twilightforest.twilight_oak_banister": "ɹǝʇsᴉuɐᗺ ʞɐO ʇɥᵷᴉꞁᴉʍ⟘", + "block.twilightforest.twilight_oak_button": "uoʇʇnᗺ ʞɐO ʇɥᵷᴉꞁᴉʍ⟘", + "block.twilightforest.twilight_oak_chest": "ʇsǝɥƆ ʞɐO ʇɥᵷᴉꞁᴉʍ⟘", + "block.twilightforest.twilight_oak_door": "ɹooᗡ ʞɐO ʇɥᵷᴉꞁᴉʍ⟘", + "block.twilightforest.twilight_oak_fence": "ǝɔuǝℲ ʞɐO ʇɥᵷᴉꞁᴉʍ⟘", + "block.twilightforest.twilight_oak_fence_gate": "ǝʇɐ⅁ ǝɔuǝℲ ʞɐO ʇɥᵷᴉꞁᴉʍ⟘", + "block.twilightforest.twilight_oak_leaves": "sǝʌɐǝꞀ ʞɐO ʇɥᵷᴉꞁᴉʍ⟘", + "block.twilightforest.twilight_oak_log": "ᵷoꞀ ʞɐO ʇɥᵷᴉꞁᴉʍ⟘", + "block.twilightforest.twilight_oak_planks": "sʞuɐꞁԀ ʞɐO ʇɥᵷᴉꞁᴉʍ⟘", + "block.twilightforest.twilight_oak_pressure_plate": "ǝʇɐꞁԀ ǝɹnssǝɹԀ ʞɐO ʇɥᵷᴉꞁᴉʍ⟘", + "block.twilightforest.twilight_oak_sapling": "ᵷuᴉꞁdɐS ʞɐO ʇɥᵷᴉꞁᴉʍ⟘ ʎꞁʞɔᴉS", + "block.twilightforest.twilight_oak_sign": "uᵷᴉS ʞɐO ʇɥᵷᴉꞁᴉʍ⟘", + "block.twilightforest.twilight_oak_slab": "qɐꞁS ʞɐO ʇɥᵷᴉꞁᴉʍ⟘", + "block.twilightforest.twilight_oak_stairs": "sɹᴉɐʇS ʞɐO ʇɥᵷᴉꞁᴉʍ⟘", + "block.twilightforest.twilight_oak_trapdoor": "ɹoopdɐɹ⟘ ʞɐO ʇɥᵷᴉꞁᴉʍ⟘", + "block.twilightforest.twilight_oak_wall_sign": "uᵷᴉS ꞁꞁɐM ʞɐO ʇɥᵷᴉꞁᴉʍ⟘", + "block.twilightforest.twilight_oak_wood": "pooM ʞɐO ʇɥᵷᴉꞁᴉʍ⟘", + "block.twilightforest.twilight_portal": "ꞁɐʇɹoԀ ʇsǝɹoℲ ʇɥᵷᴉꞁᴉʍ⟘", + "block.twilightforest.twilight_portal_miniature_structure": "ꞁɐʇɹoԀ ʇsǝɹoℲ ʇɥᵷᴉꞁᴉʍ⟘ ǝɹnʇɐᴉuᴉW", + "block.twilightforest.twisted_stone": "ǝuoʇS pǝʇsᴉʍ⟘", + "block.twilightforest.twisted_stone_pillar": "ɹɐꞁꞁᴉԀ ǝuoʇS pǝʇsᴉʍ⟘", + "block.twilightforest.uberous_soil": "ꞁᴉoS snoɹǝq∩", + "block.twilightforest.uncrafting_table": "ǝꞁqɐ⟘ ᵷuᴉʇɟɐɹɔu∩", + "block.twilightforest.underbrick": "ʞɔᴉɹqɹǝpu∩", + "block.twilightforest.underbrick_floor": "ɹooꞁℲ ʞɔᴉɹqɹǝpu∩", + "block.twilightforest.unripe_trollber": "ɹǝqꞁꞁoɹ⟘ ǝdᴉɹu∩", + "block.twilightforest.ur_ghast_boss_spawner": "ɹǝuʍɐdS ssoᗺ ʇsɐɥ⅁-ɹ∩", + "block.twilightforest.ur_ghast_trophy": "ʎɥdoɹ⟘ ʇsɐɥ⅁-ɹ∩", + "block.twilightforest.vangrove_banister": "ɹǝʇsᴉuɐᗺ ǝʌoɹᵷuɐW", + "block.twilightforest.vanishing_block": "ʞɔoꞁᗺ ᵷuᴉɥsᴉuɐɅ", + "block.twilightforest.violet_castle_door": "ɹooᗡ ǝꞁʇsɐƆ ʇǝꞁoᴉɅ", + "block.twilightforest.violet_castle_rune_brick": "ʞɔᴉɹᗺ ǝunᴚ ǝꞁʇsɐƆ ʇǝꞁoᴉɅ", + "block.twilightforest.violet_force_field": "pꞁǝᴉℲ ǝɔɹoℲ ʇǝꞁoᴉɅ", + "block.twilightforest.warped_banister": "ɹǝʇsᴉuɐᗺ pǝdɹɐM", + "block.twilightforest.weathered_deadrock": "ʞɔoɹpɐǝᗡ pǝɹǝɥʇɐǝM", + "block.twilightforest.wispy_cloud": "pnoꞁƆ ʎdsᴉM", + "block.twilightforest.wither_skeleton_skull_candle": "ǝꞁpuɐƆ ꞁꞁnʞS uoʇǝꞁǝʞS ɹǝɥʇᴉM", + "block.twilightforest.wither_skeleton_wall_skull_candle": "ǝꞁpuɐƆ ꞁꞁnʞS ꞁꞁɐM uoʇǝꞁǝʞS ɹǝɥʇᴉM", + "block.twilightforest.worn_castle_brick": "ʞɔᴉɹᗺ ǝꞁʇsɐƆ uɹoM", + "block.twilightforest.worn_castle_brick_stairs": "sɹᴉɐʇS ʞɔᴉɹᗺ ǝꞁʇsɐƆ uɹoM", + "block.twilightforest.yellow_castle_door": "ɹooᗡ ǝꞁʇsɐƆ ʍoꞁꞁǝ⅄", + "block.twilightforest.yellow_castle_rune_brick": "ʞɔᴉɹᗺ ǝunᴚ ǝꞁʇsɐƆ ʍoꞁꞁǝ⅄", + "block.twilightforest.zombie_skull_candle": "ǝꞁpuɐƆ ꞁꞁnʞS ǝᴉqɯoZ", + "block.twilightforest.zombie_wall_skull_candle": "ǝꞁpuɐƆ ꞁꞁnʞS ꞁꞁɐM ǝᴉqɯoZ", + "commands.tffeature.center": "%s :ǝɹnʇɐǝɟ ɟo ɹǝʇuǝƆ", + "commands.tffeature.chunk": "%s :ʞunɥɔ ǝɹnʇɐǝɟ uᴉ pǝʇɐɔoꞀ", + "commands.tffeature.nearest": "%s :sᴉ ǝɹnʇɐǝɟ ʇsǝɹɐǝu ǝɥ⟘", + "commands.tffeature.none_nearby": "¡ʎqɹɐǝu ǝɹnʇɐǝɟ ɐ puᴉɟ ʇ,upꞁnoƆ", + "commands.tffeature.not_in_twilight_forest": "uoᴉsuǝɯᴉp ʇsǝɹoℲ ʇɥᵷᴉꞁᴉʍ⟘ ǝɥʇ uᴉ ʇou ǝɹɐ no⅄", + "commands.tffeature.not_player": "¡ɹǝʎɐꞁd pᴉꞁɐʌ ɐ ʎq unɹ ǝq ʇsnɯ puɐɯɯoɔ sᴉɥ⟘", + "commands.tffeature.structure.conquer.status": "%s :ᵷɐꞁɟ ɹǝnbuoɔ ǝɹnʇɔnɹʇS", + "commands.tffeature.structure.conquer.update": "%2$s oʇ ᵷuᴉᵷuɐɥɔ ‘%1$s sɐʍ ᵷɐꞁɟ ɹǝnbuoɔ ǝɹnʇɔnɹʇS", + "commands.tffeature.structure.inside": "ǝɹnʇɔnɹʇs ʞɹɐɯpuɐꞀ ɐ uᴉ ǝɹɐ no⅄", + "commands.tffeature.structure.outside": "ǝɹnʇɔnɹʇs ʞɹɐɯpuɐꞀ ɐ uᴉ ʇou ǝɹɐ no⅄", + "commands.tffeature.structure.required": "ǝɹnʇɔnɹʇs ɐ uᴉ ʇou ǝɹɐ no⅄", + "commands.tffeature.structure.spawn_info": "%2$s ʇɥᵷᴉǝM ‘%1$s", + "commands.tffeature.structure.spawn_list": ":sᴉ ɐǝɹɐ sᴉɥʇ ɹoɟ ʇsᴉꞁ uʍɐdS", + "commands.tffeature.usage": "<ɹǝʇuǝɔ | ɹǝnbuoɔ | ǝʇɐʌᴉʇɔɐǝɹ | oɟuᴉ> %s/", + "config.jade.plugin_twilightforest.quest_ram_wool": "ꞁooM ɯɐᴚ ʇsǝnꝹ", + "container.twilightforest.uncrafting_table": "ǝꞁqɐ⟘ ᵷuᴉʇɟɐɹɔu∩", + "container.twilightforest.uncrafting_table.disabled": "ᵷᴉɟuoɔ ɐᴉʌ pǝꞁqɐsᴉp sᴉ ᵷuᴉʇɟɐɹɔu∩", + "container.twilightforest.uncrafting_table.disabled_item": "˙pǝꞁqɐsᴉp sᴉ ɯǝʇᴉ sᴉɥʇ ᵷuᴉʇɟɐɹɔu∩", + "death.attack.twilightforest.ant": "%2$s ʎq ʇuɐ uɐ ǝʞᴉꞁ pǝɥsɐnbs sɐʍ %1$s", + "death.attack.twilightforest.ant.item": "%3$s ᵷuᴉpꞁoɥ %2$s ʎq ʇuɐ uɐ ǝʞᴉꞁ pǝɥsɐnbs sɐʍ %1$s", + "death.attack.twilightforest.axing": "%2$s ʎq dn pǝddoɥɔ sɐʍ %1$s", + "death.attack.twilightforest.axing.item": "%3$s ᵷuᴉsn %2$s ʎq dn pǝddoɥɔ sɐʍ %1$s", + "death.attack.twilightforest.chillingBreath": "uǝǝnꝹ ʍouS ǝɥʇ ʎq ɥʇɐǝp oʇ uǝzoɹɟ sɐʍ %1$s", + "death.attack.twilightforest.chillingBreath.player": "%2$s ᵷuᴉdɐɔsǝ ǝꞁᴉɥʍ uǝǝnꝹ ʍouS ǝɥʇ ʎq ɥʇɐǝp oʇ uǝzoɹɟ sɐʍ %1$s", + "death.attack.twilightforest.clamped": "%2$s ʎq ɥʇɐǝp oʇ pǝzǝǝnbs sɐʍ %1$s", + "death.attack.twilightforest.clamped.item": "%3$s ᵷuᴉsn %2$s ʎq ɥʇɐǝp oʇ pǝzǝǝnbs sɐʍ %1$s", + "death.attack.twilightforest.expired": "pǝɹᴉdxǝ ǝɟᴉꞁ s,%1$s", + "death.attack.twilightforest.expired.player": "pǝɹᴉdxǝ ǝɟᴉꞁ s,%1$s", + "death.attack.twilightforest.fiery": "ʞɔoꞁq ʎɹǝᴉℲ ɐ oʇuo pǝʞꞁɐʍ %1$s", + "death.attack.twilightforest.fiery.player": "%2$s ᵷuᴉdɐɔsǝ ǝꞁᴉɥʍ ʞɔoꞁq ʎɹǝᴉℲ ɐ oʇuo pǝʞꞁɐʍ %1$s", + "death.attack.twilightforest.fireJet": "ʇǝՐ ǝɹᴉℲ ɐ oʇuᴉ pǝʞꞁɐʍ ʎꞁꞁɐʇuǝpᴉɔɔɐ %1$s", + "death.attack.twilightforest.fireJet.player": "%2$s ᵷuᴉdɐɔsǝ ǝꞁᴉɥʍ ʇǝՐ ǝɹᴉℲ ɐ oʇuᴉ pǝʞꞁɐʍ ʎꞁꞁɐʇuǝpᴉɔɔɐ %1$s", + "death.attack.twilightforest.frozen": "qɯoᗺ ǝɔI uɐ ᵷuᴉsn %2$s ʎq uǝzoɹɟ sɐʍ %1$s", + "death.attack.twilightforest.frozen.item": "%3$s ᵷuᴉsn %2$s ʎq uǝzoɹɟ sɐʍ %1$s", + "death.attack.twilightforest.ghastTear": "sɹɐǝʇ ʎɹǝᴉɟ ʎq pǝpꞁɐɔs sɐʍ %1$s", + "death.attack.twilightforest.ghastTear.player": "%2$s ᵷuᴉdɐɔsǝ ǝꞁᴉɥʍ sɹɐǝʇ ʎɹǝᴉɟ ʎq pǝpꞁɐɔs sɐʍ %1$s", + "death.attack.twilightforest.haunt": "ʇunɐɥ s,%2$s ǝɥʇ pǝuᴉoɾ %1$s", + "death.attack.twilightforest.haunt.item": "%3$s ʎq pǝꞁꞁᴉʞ ᵷuᴉǝq ɹǝʇɟɐ ʇunɐɥ s,%2$s ǝɥʇ pǝuᴉoɾ %1$s", + "death.attack.twilightforest.hydraBite": "ɐɹpʎH ǝɥʇ ʎq ɟɟo pǝddᴉɹ sɐʍ uᴉʞs s,%1$s", + "death.attack.twilightforest.hydraBite.player": "%2$s ᵷuᴉdɐɔsǝ ǝꞁᴉɥʍ ɐɹpʎH ǝɥʇ ʎq ɟɟo pǝddᴉɹ sɐʍ uᴉʞs s,%1$s", + "death.attack.twilightforest.hydraFire": "ɐɹpʎH ǝɥʇ ʎq ǝʌᴉꞁɐ pǝʇsɐoɹ sɐʍ %1$s", + "death.attack.twilightforest.hydraFire.player": "%2$s ᵷuᴉdɐɔsǝ ǝꞁᴉɥʍ ɐɹpʎH ǝɥʇ ʎq ǝʌᴉꞁɐ pǝʇsɐoɹ sɐʍ %1$s", + "death.attack.twilightforest.knightmetal": "ʞɔoꞁq ꞁɐʇǝɯʇɥᵷᴉuꞰ ɐ ʎq pǝɹǝʍǝʞs sɐʍ %1$s", + "death.attack.twilightforest.knightmetal.player": "%2$s ᵷuᴉdɐɔsǝ ǝꞁᴉɥʍ ʞɔoꞁq ꞁɐʇǝɯʇɥᵷᴉuꞰ ɐ ʎq pǝɹǝʍǝʞs sɐʍ %1$s", + "death.attack.twilightforest.leafBrain": "%2$s ʎq sǝʌɐǝꞁ oʇuᴉ pǝuɹnʇ sɐʍ uᴉɐɹq s,%1$s", + "death.attack.twilightforest.leafBrain.item": "%3$s ᵷuᴉsn %2$s ʎq sǝʌɐǝꞁ oʇuᴉ pǝuɹnʇ sɐʍ uᴉɐɹq s,%1$s", + "death.attack.twilightforest.lichBolt": "%1$s uɐɥʇ ɹǝʇʇǝq sɐʍ ɯᴉɐ s,ɥɔᴉꞀ ǝɥ⟘", + "death.attack.twilightforest.lichBolt.player": "%1$s uɐɥʇ ɯᴉɐ ɹǝʇʇǝq pɐɥ %2$s puɐ ɥɔᴉꞀ ǝɥ⟘", + "death.attack.twilightforest.lichBomb": "ɔᴉᵷɐɯ ǝʌᴉsoꞁdxǝ s,ɥɔᴉꞀ ǝɥʇ oʇ pǝqɯnɔɔns %1$s", + "death.attack.twilightforest.lichBomb.player": "%2$s ᵷuᴉdɐɔsǝ ǝꞁᴉɥʍ ɔᴉᵷɐɯ ǝʌᴉsoꞁdxǝ s,ɥɔᴉꞀ ǝɥʇ oʇ pǝqɯnɔɔns %1$s", + "death.attack.twilightforest.lifedrain": "%2$s ʎq pǝuᴉɐɹp sɐʍ ǝɟᴉꞁ s,%1$s", + "death.attack.twilightforest.lifedrain.item": "%3$s ᵷuᴉsn %2$s ʎq pǝuᴉɐɹp sɐʍ ǝɟᴉꞁ s,%1$s", + "death.attack.twilightforest.lostWords": "%2$s ʎq pǝꞁꞁᴉʞ ᵷuᴉǝq ɹǝʇɟɐ spɹoʍ ɹoɟ ssoꞁ ɐ ʇɐ sɐʍ %1$s", + "death.attack.twilightforest.lostWords.item": "%3$s ᵷuᴉsn %2$s ʎq pǝꞁꞁᴉʞ ᵷuᴉǝq ɹǝʇɟɐ spɹoʍ ɹoɟ ssoꞁ ɐ ʇɐ sɐʍ %1$s", + "death.attack.twilightforest.moonworm": "ɯɹoʍuooW ʎq ʇoɥs sɐʍ %1$s", + "death.attack.twilightforest.reactor": "ɹoʇɔɐǝᴚ ǝʇᴉuᴉɯɹɐƆ ɐ oʇ ǝsoꞁɔ ooʇ pooʇs %1$s", + "death.attack.twilightforest.reactor.player": "%2$s ᵷuᴉdɐɔsǝ ǝꞁᴉɥʍ ɹoʇɔɐǝᴚ ǝʇᴉuᴉɯɹɐƆ ɐ oʇ ǝsoꞁɔ ooʇ pooʇs %1$s", + "death.attack.twilightforest.schooled": "%2$s ʎq pǝꞁooɥɔs sɐʍ %1$s", + "death.attack.twilightforest.schooled.item": "%3$s ᵷuᴉsn %2$s ʎq pǝꞁooɥɔs sɐʍ %1$s", + "death.attack.twilightforest.scorched": "%2$s ʎq pǝɥɔɹoɔs sɐʍ %1$s", + "death.attack.twilightforest.scorched.item": "%3$s ᵷuᴉsn %2$s ʎq pǝɥɔɹoɔs sɐʍ %1$s", + "death.attack.twilightforest.slider": "dɐɹ⟘ ᵷuᴉpᴉꞁS ɐ ʎq dn pǝɔᴉꞁs sɐʍ %1$s", + "death.attack.twilightforest.slider.player": "%2$s ᵷuᴉdɐɔsǝ ǝꞁᴉɥʍ dɐɹ⟘ ᵷuᴉpᴉꞁS ɐ ʎq dn pǝɔᴉꞁs sɐʍ %1$s", + "death.attack.twilightforest.snowballFight": "%2$s oʇ ʇɥᵷᴉɟ ꞁꞁɐqʍous ɐ ʇsoꞁ %1$s", + "death.attack.twilightforest.snowballFight.item": "%3$s ᵷuᴉsn %2$s oʇ ʇɥᵷᴉɟ ꞁꞁɐqʍous ɐ ʇsoꞁ %1$s", + "death.attack.twilightforest.spiked": "%2$s ʎq pǝɹǝʍǝʞs sɐʍ %1$s", + "death.attack.twilightforest.spiked.item": "%3$s ᵷuᴉsn %2$s ʎq pǝɹǝʍǝʞs sɐʍ %1$s", + "death.attack.twilightforest.squish": "uǝǝnꝹ ʍouS ǝɥʇ ʎq pǝɥsɐnbs sɐʍ %1$s", + "death.attack.twilightforest.squish.player": "%2$s ᵷuᴉdɐɔsǝ ǝꞁᴉɥʍ uǝǝnꝹ ʍouS ǝɥʇ ʎq pǝɥsɐnbs sɐʍ %1$s", + "death.attack.twilightforest.thorns": "suɹoɥʇ ǝɯos oʇuᴉ pǝʞꞁɐʍ %1$s", + "death.attack.twilightforest.thorns.player": "%2$s ᵷuᴉdɐɔsǝ ǝꞁᴉɥʍ suɹoɥʇ ǝɯos oʇuᴉ pǝʞꞁɐʍ %1$s", + "death.attack.twilightforest.thrownAxe": "ǝxɐ uʍoɹɥʇ ɐ ʎq pǝʇɐʇᴉdɐɔǝp sɐʍ %1$s", + "death.attack.twilightforest.thrownAxe.player": "%2$s ᵷuᴉdɐɔsǝ ǝꞁᴉɥʍ ǝxɐ uʍoɹɥʇ ɐ ʎq pǝʇɐʇᴉdɐɔǝp sɐʍ %1$s", + "death.attack.twilightforest.thrownBlock": "ʞɔoꞁq uʍoɹɥʇ ɐ ʎq pǝɥsɐnbs sɐʍ %1$s", + "death.attack.twilightforest.thrownBlock.player": "%2$s ᵷuᴉdɐɔsǝ ǝꞁᴉɥʍ ʞɔoꞁq uʍoɹɥʇ ɐ ʎq pǝɥsɐnbs sɐʍ %1$s", + "death.attack.twilightforest.thrownPickaxe": "ǝxɐʞɔᴉd uʍoɹɥʇ ɐ ʎq pǝʇɐʇᴉdɐɔǝp sɐʍ %1$s", + "death.attack.twilightforest.thrownPickaxe.player": "%2$s ᵷuᴉdɐɔsǝ ǝꞁᴉɥʍ ǝxɐʞɔᴉd uʍoɹɥʇ ɐ ʎq pǝʇɐʇᴉdɐɔǝp sɐʍ %1$s", + "death.attack.twilightforest.yeeted": "ǝɯᴉʇ ʇsɐꞁ ǝɥʇ ɹoɟ pǝʇǝǝʎ sɐʍ %1$s", + "death.attack.twilightforest.yeeted.entity": "%2$s ʎq ǝɯᴉʇ ʇsɐꞁ ǝɥʇ ɹoɟ pǝʇǝǝʎ sɐʍ %1$s", + "death.attack.twilightforest.yeeted.item": "%3$s ᵷuᴉpꞁoɥ ʍoɥǝɯos ǝꞁᴉɥʍ %2$s ʎq ǝɯᴉʇ ʇsɐꞁ ǝɥʇ ɹoɟ pǝʇǝǝʎ sɐʍ %1$s", + "dimension.twilightforest.twilightforest": "ʇsǝɹoℲ ʇɥᵷᴉꞁᴉʍ⟘", + "effect.twilightforest.frosted": "pǝʇsoɹℲ", + "enchantment.twilightforest.chill_aura": "ɐɹnⱯ ꞁꞁᴉɥƆ", + "enchantment.twilightforest.chill_aura.desc": "˙ɹǝɹɐǝʍ ǝɥʇ ᵷuᴉʇʇᴉɥ ɹǝʇɟɐ ʇɔǝɟɟǝ pǝʇsoɹɟ ǝɥʇ uᴉɐᵷ oʇ ɹǝʞɔɐʇʇɐ ǝɥʇ ɹoɟ ǝɔuɐɥɔ ɐ sppⱯ", + "enchantment.twilightforest.destruction": "uoᴉʇɔnɹʇsǝᗡ", + "enchantment.twilightforest.destruction.desc": "˙ɹǝᴉʇ ᵷuᴉuᴉɯ ɹǝɥᵷᴉɥ ɐ ɥʇᴉʍ sʞɔoꞁq ʞɐǝɹq oʇ uᴉɐɥƆ puɐ ʞɔoꞁᗺ ǝɥʇ sʍoꞁꞁⱯ", + "enchantment.twilightforest.fire_react": "ʇɔɐǝᴚ ǝɹᴉℲ", + "enchantment.twilightforest.fire_react.desc": "˙ɹǝɹɐǝʍ ǝɥʇ ᵷuᴉʇʇᴉɥ ɹǝʇɟɐ ǝɹᴉɟ uo ʇǝs ǝq oʇ ɹǝʞɔɐʇʇɐ ǝɥʇ ɹoɟ ǝɔuɐɥɔ ɐ sppⱯ", + "entity.twilightforest.adherent": "ʇuǝɹǝɥpⱯ", + "entity.twilightforest.alpha_yeti": "ᴉʇǝ⅄ ɐɥdꞁⱯ", + "entity.twilightforest.armored_giant": "ʇuɐᴉ⅁ pǝɹoɯɹⱯ", + "entity.twilightforest.bighorn_sheep": "dǝǝɥS uɹoɥᵷᴉᗺ", + "entity.twilightforest.blockchain_goblin": "uᴉꞁqo⅁ uᴉɐɥƆ puɐ ʞɔoꞁᗺ", + "entity.twilightforest.boar": "ɹɐoᗺ", + "entity.twilightforest.boat": "ʇɐoᗺ", + "entity.twilightforest.carminite_broodling": "ᵷuᴉꞁpooɹᗺ ǝʇᴉuᴉɯɹɐƆ", + "entity.twilightforest.carminite_ghastguard": "pɹɐnᵷʇsɐɥ⅁ ǝʇᴉuᴉɯɹɐƆ", + "entity.twilightforest.carminite_ghastling": "ᵷuᴉꞁʇsɐɥ⅁ ǝʇᴉuᴉɯɹɐƆ", + "entity.twilightforest.carminite_golem": "ɯǝꞁo⅁ ǝʇᴉuᴉɯɹɐƆ", + "entity.twilightforest.chain_block": "uᴉɐɥƆ puɐ ʞɔoꞁᗺ", + "entity.twilightforest.charm_effect": "ʇɔǝɟɟƎ ɯɹɐɥƆ", + "entity.twilightforest.chest_boat": "ʇsǝɥƆ ɥʇᴉʍ ʇɐoᗺ", + "entity.twilightforest.cube_of_annihilation": "uoᴉʇɐꞁᴉɥᴉuuⱯ ɟo ǝqnƆ", + "entity.twilightforest.death_tome": "ǝɯo⟘ ɥʇɐǝᗡ", + "entity.twilightforest.deer": "ɹǝǝᗡ", + "entity.twilightforest.dwarf_rabbit": "ʇᴉqqɐᴚ ɟɹɐʍᗡ", + "entity.twilightforest.falling_ice": "ǝɔI ᵷuᴉꞁꞁɐℲ", + "entity.twilightforest.fire_beetle": "ǝꞁʇǝǝᗺ ǝɹᴉℲ", + "entity.twilightforest.giant_miner": "ɹǝuᴉW ʇuɐᴉ⅁", + "entity.twilightforest.harbinger_cube": "ǝqnƆ ɹǝᵷuᴉqɹɐH", + "entity.twilightforest.hedge_spider": "ɹǝpᴉdS ǝᵷpǝH", + "entity.twilightforest.helmet_crab": "qɐɹƆ ʇǝɯꞁǝH", + "entity.twilightforest.hostile_wolf": "ɟꞁoM ǝꞁᴉʇsoH", + "entity.twilightforest.hydra": "ɐɹpʎH", + "entity.twilightforest.hydra_mortar": "ɹɐʇɹoW ɐɹpʎH", + "entity.twilightforest.ice_arrow": "ʍoɹɹⱯ ǝɔI", + "entity.twilightforest.ice_crystal": "ꞁɐʇsʎɹƆ ǝɔI", + "entity.twilightforest.ice_snowball": "ꞁꞁɐqʍouS ǝɔI", + "entity.twilightforest.king_spider": "ɹǝpᴉdS ᵷuᴉꞰ", + "entity.twilightforest.knight_phantom": "ɯoʇuɐɥԀ ʇɥᵷᴉuꞰ", + "entity.twilightforest.kobold": "pꞁoqoꞰ", + "entity.twilightforest.lich": "ɥɔᴉꞀ", + "entity.twilightforest.lich_bolt": "ʇꞁoᗺ ɥɔᴉꞀ", + "entity.twilightforest.lich_bomb": "ʇꞁoᗺ ɥɔᴉꞀ ǝʌᴉsoꞁdxƎ", + "entity.twilightforest.lich_minion": "uoᴉuᴉW ɥɔᴉꞀ", + "entity.twilightforest.lower_goblin_knight": "ʇɥᵷᴉuꞰ uᴉꞁqo⅁ ɹǝʍoꞀ", + "entity.twilightforest.loyal_zombie": "ǝᴉqɯoZ ꞁɐʎoꞀ", + "entity.twilightforest.maze_slime": "ǝɯᴉꞁS ǝzɐW", + "entity.twilightforest.minoshroom": "ɯooɹɥsouᴉW", + "entity.twilightforest.minotaur": "ɹnɐʇouᴉW", + "entity.twilightforest.mist_wolf": "ɟꞁoM ʇsᴉW", + "entity.twilightforest.moonworm_shot": "ɯɹoʍuooW", + "entity.twilightforest.mosquito_swarm": "ɯɹɐʍS oʇᴉnbsoW", + "entity.twilightforest.naga": "ɐᵷɐN", + "entity.twilightforest.nature_bolt": "ʇꞁoᗺ ǝɹnʇɐN", + "entity.twilightforest.penguin": "uᴉnᵷuǝԀ", + "entity.twilightforest.pinch_beetle": "ǝꞁʇǝǝᗺ ɥɔuᴉԀ", + "entity.twilightforest.protection_box": "xoᗺ uoᴉʇɔǝʇoɹԀ uoᴉssǝɹᵷoɹԀ", + "entity.twilightforest.quest_ram": "ɯɐᴚ ʇsǝnꝹ", + "entity.twilightforest.raven": "uǝʌɐᴚ", + "entity.twilightforest.redcap": "dɐɔpǝᴚ", + "entity.twilightforest.redcap_sapper": "ɹǝddɐS dɐɔpǝᴚ", + "entity.twilightforest.rising_zombie": "ǝᴉqɯoZ", + "entity.twilightforest.roving_cube": "ǝqnƆ ᵷuᴉʌoᴚ", + "entity.twilightforest.seeker_arrow": "ʍoɹɹⱯ ɹǝʞǝǝS", + "entity.twilightforest.skeleton_druid": "pᴉnɹᗡ uoʇǝꞁǝʞS", + "entity.twilightforest.slider": "dɐɹ⟘ ǝpᴉꞁS ᵷuᴉʌoW", + "entity.twilightforest.slime_beetle": "ǝꞁʇǝǝᗺ ǝɯᴉꞁS", + "entity.twilightforest.slime_blob": "qoꞁᗺ ǝɯᴉꞁS", + "entity.twilightforest.snow_guardian": "uɐᴉpɹɐn⅁ ʍouS", + "entity.twilightforest.snow_queen": "uǝǝnꝹ ʍouS", + "entity.twilightforest.squirrel": "ꞁǝɹɹᴉnbS", + "entity.twilightforest.stable_ice_core": "ǝɹoƆ ǝɔI ǝꞁqɐʇS", + "entity.twilightforest.swarm_spider": "ɹǝpᴉdS ɯɹɐʍS", + "entity.twilightforest.thrown_block": "ʞɔoꞁᗺ uʍoɹɥ⟘", + "entity.twilightforest.thrown_wep": "uodɐǝM uʍoɹɥ⟘", + "entity.twilightforest.tiny_bird": "pɹᴉᗺ ʎuᴉ⟘", + "entity.twilightforest.tome_bolt": "ʇꞁoᗺ ǝɯo⟘ ɥʇɐǝᗡ", + "entity.twilightforest.towerwood_borer": "ɹǝɹoᗺ pooʍɹǝʍo⟘", + "entity.twilightforest.troll": "ꞁꞁoɹ⟘", + "entity.twilightforest.unstable_ice_core": "ǝɹoƆ ǝɔI ǝꞁqɐʇsu∩", + "entity.twilightforest.upper_goblin_knight": "ʇɥᵷᴉuꞰ uᴉꞁqo⅁ ɹǝdd∩", + "entity.twilightforest.ur_ghast": "ʇsɐɥ⅁-ɹ∩", + "entity.twilightforest.wand_bolt": "ʇꞁoᗺ ɹǝʇdǝɔS ʇɥᵷᴉꞁᴉʍ⟘", + "entity.twilightforest.winter_wolf": "ɟꞁoM ɹǝʇuᴉM", + "entity.twilightforest.wraith": "ɥʇᴉɐɹM", + "entity.twilightforest.yeti": "ᴉʇǝ⅄", + "gamerule.tfEnforcedProgression": "uoᴉssǝɹᵷoɹԀ pǝɔɹoɟuƎ :ʇsǝɹoℲ ʇɥᵷᴉꞁᴉʍ⟘", + "gamerule.tfEnforcedProgression.description": "(sʇuǝɯǝɔuɐʌpɐ ɹnoʎ uᴉ ɹǝpɹo uoᴉssǝɹᵷoɹd ǝɥʇ ʞɔǝɥɔ uɐɔ no⅄) ˙uoᴉsuǝɯᴉp ǝɥʇ uᴉ sǝssoq uᴉɐʇɹǝɔ ʇɐǝɟǝp noʎ ꞁᴉʇun pǝʞɔoꞁ ǝq ꞁꞁᴉʍ sǝɯoᴉq ʇsǝɹoℲ ʇɥᵷᴉꞁᴉʍ⟘ ǝɯoS", + "gui.twilightforest.crumble_horn_jei": "uɹoH ǝꞁqɯnɹƆ", + "gui.twilightforest.optifine.message": "˙ᵷᴉɟuoƆ ʇuǝᴉꞁƆ ǝɥʇ uᴉ pǝꞁqɐsᴉp ǝq ʎɐɯ uǝǝɹɔs sᴉɥ⟘\n\n¡puǝ s,ʇsǝɹoℲ ʇɥᵷᴉꞁᴉʍ⟘ uo ǝꞁqɐʌꞁos ʇou ǝɹɐ sǝnssᴉ pǝʇɐꞁǝɹ-ǝuᴉɟᴉʇdO\n\n˙ʇuǝsǝɹd ꞁꞁᴉʇs sᴉ ᵷnq ǝɥʇ ɟᴉ ǝǝs oʇ uᴉɐᵷɐ ʞɔǝɥɔ puɐ ʇsɹᴉɟ ǝuᴉɟᴉʇdO ǝʌoɯǝɹ ǝsɐǝꞁd ‘ᵷnq ɐ ᵷuᴉʇɹodǝɹ ǝɹoɟǝᗺ\n\n˙sǝnssᴉ ɹǝɥʇo ʎuɐɯ puɐ sᵷnq ꞁɐnsᴉʌ ʎʇᴉʇuǝ ʇɹɐdᴉʇꞁnɯ ‘sǝɥsɐɹɔ ǝsnɐɔ oʇ uʍouʞ sᴉ ǝuᴉɟᴉʇdO ʇɐɥʇ ǝʇou ǝsɐǝꞁd ‘ᵷuᴉpǝǝɔoɹd ǝɹoɟǝᗺ", + "gui.twilightforest.optifine.suggestions": "˙pɐǝʇsuᴉ ᵷuᴉsn puǝɯɯoɔǝɹ ǝʍ ʇɐɥʇ spoɯ ɟo uoᴉʇɔǝꞁǝs ɐ s,ǝɹǝH", + "gui.twilightforest.optifine.title": "ᗡƎ⟘ƆƎ⟘Ǝᗡ ƎNIℲI⟘ԀO :⅁NINᴚⱯM", + "gui.twilightforest.transformation_jei": "ɹǝpʍoԀ uoᴉʇɐɯɹoɟsuɐɹ⟘", + "gui.twilightforest.uncrafting_jei": "ᵷuᴉʇɟɐɹɔu∩", + "item.twilightforest.adherent_spawn_egg": "ᵷᵷƎ uʍɐdS ʇuǝɹǝɥpⱯ", + "item.twilightforest.alpha_yeti_banner_pattern": "uɹǝʇʇɐԀ ɹǝuuɐᗺ", + "item.twilightforest.alpha_yeti_banner_pattern.desc": "ǝɔɐℲ ᴉʇǝ⅄ ɐɥdꞁⱯ", + "item.twilightforest.alpha_yeti_fur": "ɹnℲ ᴉʇǝ⅄ ɐɥdꞁⱯ", + "item.twilightforest.alpha_yeti_spawn_egg": "ᵷᵷƎ uʍɐdS ᴉʇǝ⅄ ɐɥdꞁⱯ", + "item.twilightforest.arctic_armor.desc": "ǝꞁqɐǝʎᗡ", + "item.twilightforest.arctic_boots": "sʇooᗺ ɔᴉʇɔɹⱯ", + "item.twilightforest.arctic_chestplate": "ʇǝʞɔɐՐ ɔᴉʇɔɹⱯ", + "item.twilightforest.arctic_fur": "ɹnℲ ɔᴉʇɔɹⱯ", + "item.twilightforest.arctic_helmet": "pooH ɔᴉʇɔɹⱯ", + "item.twilightforest.arctic_leggings": "sᵷuᴉᵷᵷǝꞀ ɔᴉʇɔɹⱯ", + "item.twilightforest.armor_shard": "pɹɐɥS ɹoɯɹⱯ", + "item.twilightforest.armor_shard_cluster": "ɹǝʇsnꞁƆ pɹɐɥS ɹoɯɹⱯ", + "item.twilightforest.armored_giant_spawn_egg": "ᵷᵷƎ uʍɐdS ʇuɐᴉ⅁ pǝɹoɯɹⱯ", + "item.twilightforest.bighorn_sheep_spawn_egg": "ᵷᵷƎ uʍɐdS dǝǝɥS uɹoɥᵷᴉᗺ", + "item.twilightforest.block_and_chain": "uᴉɐɥƆ puɐ ʞɔoꞁᗺ", + "item.twilightforest.blockchain_goblin_spawn_egg": "ᵷᵷƎ uʍɐdS uᴉꞁqo⅁ uᴉɐɥƆ puɐ ʞɔoꞁᗺ", + "item.twilightforest.boar_spawn_egg": "ᵷᵷƎ uʍɐdS ɹɐoᗺ", + "item.twilightforest.borer_essence": "ǝɔuǝssƎ ɹǝɹoᗺ", + "item.twilightforest.brittle_potion_flask": "ʞsɐꞁℲ uoᴉʇoԀ ǝꞁʇʇᴉɹᗺ", + "item.twilightforest.canopy_boat": "ʇɐoᗺ ʎdouɐƆ", + "item.twilightforest.canopy_chest_boat": "ʇɐoᗺ ʇsǝɥƆ ʎdouɐƆ", + "item.twilightforest.carminite": "ǝʇᴉuᴉɯɹɐƆ", + "item.twilightforest.carminite_broodling_spawn_egg": "ᵷᵷƎ uʍɐdS ᵷuᴉꞁpooɹᗺ ǝʇᴉuᴉɯɹɐƆ", + "item.twilightforest.carminite_ghastguard_spawn_egg": "ᵷᵷƎ uʍɐdS pɹɐnᵷʇsɐɥ⅁ ǝʇᴉuᴉɯɹɐƆ", + "item.twilightforest.carminite_ghastling_spawn_egg": "ᵷᵷƎ uʍɐdS ᵷuᴉꞁʇsɐɥ⅁ ǝʇᴉuᴉɯɹɐƆ", + "item.twilightforest.carminite_golem_spawn_egg": "ᵷᵷƎ uʍɐdS ɯǝꞁo⅁ ǝʇᴉuᴉɯɹɐƆ", + "item.twilightforest.charm_of_keeping_1": "I ᵷuᴉdǝǝꞰ ɟo ɯɹɐɥƆ", + "item.twilightforest.charm_of_keeping_2": "II ᵷuᴉdǝǝꞰ ɟo ɯɹɐɥƆ", + "item.twilightforest.charm_of_keeping_3": "III ᵷuᴉdǝǝꞰ ɟo ɯɹɐɥƆ", + "item.twilightforest.charm_of_life_1": "I ǝɟᴉꞀ ɟo ɯɹɐɥƆ", + "item.twilightforest.charm_of_life_2": "II ǝɟᴉꞀ ɟo ɯɹɐɥƆ", + "item.twilightforest.cooked_meef": "ʞɐǝʇS ɟǝǝW", + "item.twilightforest.cooked_venison": "ʞɐǝʇS uosᴉuǝɅ", + "item.twilightforest.crumble_horn": "uɹoH ǝꞁqɯnɹƆ", + "item.twilightforest.cube_of_annihilation": "uoᴉʇɐꞁᴉɥᴉuuⱯ ɟo ǝqnƆ", + "item.twilightforest.cube_talisman": "ǝqnƆ ǝɥʇ ɟo uɐɯsᴉꞁɐ⟘", + "item.twilightforest.dark_boat": "ʇɐoᗺ pooʍʞɹɐᗡ", + "item.twilightforest.dark_chest_boat": "ʇɐoᗺ ʇsǝɥƆ pooʍʞɹɐᗡ", + "item.twilightforest.death_tome_spawn_egg": "ᵷᵷƎ uʍɐdS ǝɯo⟘ ɥʇɐǝᗡ", + "item.twilightforest.deer_spawn_egg": "ᵷᵷƎ uʍɐdS ɹǝǝᗡ", + "item.twilightforest.diamond_minotaur_axe": "ǝxⱯ ɹnɐʇouᴉW puoɯɐᴉᗡ", + "item.twilightforest.dwarf_rabbit_spawn_egg": "ᵷᵷƎ uʍɐdS ʇᴉqqɐᴚ ɟɹɐʍᗡ", + "item.twilightforest.ender_bow": "ʍoᗺ ɹǝpuƎ", + "item.twilightforest.fiery_armor.desc": "sɹǝʞɔɐʇʇɐ suɹnᗺ", + "item.twilightforest.fiery_blood": "pooꞁᗺ ʎɹǝᴉℲ", + "item.twilightforest.fiery_boots": "sʇooᗺ ʎɹǝᴉℲ", + "item.twilightforest.fiery_chestplate": "ǝʇɐꞁdʇsǝɥƆ ʎɹǝᴉℲ", + "item.twilightforest.fiery_helmet": "ʇǝɯꞁǝH ʎɹǝᴉℲ", + "item.twilightforest.fiery_ingot": "ʇoᵷuI ʎɹǝᴉℲ", + "item.twilightforest.fiery_leggings": "sᵷuᴉᵷᵷǝꞀ ʎɹǝᴉℲ", + "item.twilightforest.fiery_pickaxe": "ǝxɐʞɔᴉԀ ʎɹǝᴉℲ", + "item.twilightforest.fiery_pickaxe.desc": "ᵷuᴉʇꞁǝɯs-oʇnⱯ", + "item.twilightforest.fiery_sword": "pɹoʍS ʎɹǝᴉℲ", + "item.twilightforest.fiery_sword.desc": "sʇǝᵷɹɐʇ suɹnᗺ", + "item.twilightforest.fiery_tears": "sɹɐǝ⟘ ʎɹǝᴉℲ", + "item.twilightforest.filled_magic_map": "dɐW ɔᴉᵷɐW", + "item.twilightforest.filled_maze_map": "dɐW ǝzɐW", + "item.twilightforest.filled_ore_map": "dɐW ǝɹO/ǝzɐW", + "item.twilightforest.fire_beetle_spawn_egg": "ᵷᵷƎ uʍɐdS ǝꞁʇǝǝᗺ ǝɹᴉℲ", + "item.twilightforest.flask.doses": "%2$s/%1$s :sǝsoᗡ", + "item.twilightforest.flask.no_refill": "pǝꞁꞁᴉɟǝɹ ǝq ʇouuɐƆ", + "item.twilightforest.fortification_scepter": "uoᴉʇɐɔᴉɟᴉʇɹoℲ ɟo ɹǝʇdǝɔS", + "item.twilightforest.giant_miner_spawn_egg": "ᵷᵷƎ uʍɐdS ɹǝuᴉW ʇuɐᴉ⅁", + "item.twilightforest.giant_pickaxe": "ǝxɐʞɔᴉԀ s,ʇuɐᴉ⅁", + "item.twilightforest.giant_pickaxe.desc": "sʞɔoꞁq ʇuɐᴉᵷ sʞɐǝɹᗺ", + "item.twilightforest.giant_sword": "pɹoʍS s,ʇuɐᴉ⅁", + "item.twilightforest.glass_sword": "pɹoʍS ssɐꞁ⅁", + "item.twilightforest.glass_sword.desc": "ʎꞁuo ǝpoW ǝʌᴉʇɐǝɹƆ", + "item.twilightforest.gold_minotaur_axe": "ǝxⱯ ɹnɐʇouᴉW uǝpꞁo⅁", + "item.twilightforest.greater_potion_flask": "ʞsɐꞁℲ uoᴉʇoԀ ɹǝʇɐǝɹ⅁", + "item.twilightforest.harbinger_cube_spawn_egg": "ᵷᵷƎ uʍɐdS ǝqnƆ ɹǝᵷuᴉqɹɐH", + "item.twilightforest.hedge_spider_spawn_egg": "ᵷᵷƎ uʍɐdS ɹǝpᴉdS ǝᵷpǝH", + "item.twilightforest.helmet_crab_spawn_egg": "ᵷᵷƎ uʍɐdS qɐɹƆ ʇǝɯꞁǝH", + "item.twilightforest.hostile_wolf_spawn_egg": "ᵷᵷƎ uʍɐdS ɟꞁoM ǝꞁᴉʇsoH", + "item.twilightforest.hydra_banner_pattern": "uɹǝʇʇɐԀ ɹǝuuɐᗺ", + "item.twilightforest.hydra_banner_pattern.desc": "ǝɯɐꞁℲ ɐɹpʎH", + "item.twilightforest.hydra_chop": "doɥƆ ɐɹpʎH", + "item.twilightforest.hydra_spawn_egg": "ᵷᵷƎ uʍɐdS ɐɹpʎH", + "item.twilightforest.ice_bomb": "qɯoᗺ ǝɔI", + "item.twilightforest.ice_bow": "ʍoᗺ ǝɔI", + "item.twilightforest.ice_crystal_spawn_egg": "ᵷᵷƎ uʍɐdS ꞁɐʇsʎɹƆ ǝɔI", + "item.twilightforest.ice_sword": "pɹoʍS ǝɔI", + "item.twilightforest.ironwood_axe": "ǝxⱯ pooʍuoɹI", + "item.twilightforest.ironwood_boots": "sʇooᗺ pooʍuoɹI", + "item.twilightforest.ironwood_chestplate": "ǝʇɐꞁdʇsǝɥƆ pooʍuoɹI", + "item.twilightforest.ironwood_helmet": "ʇǝɯꞁǝH pooʍuoɹI", + "item.twilightforest.ironwood_hoe": "ǝoH pooʍuoɹI", + "item.twilightforest.ironwood_ingot": "ʇoᵷuI pooʍuoɹI", + "item.twilightforest.ironwood_leggings": "sᵷuᴉᵷᵷǝꞀ pooʍuoɹI", + "item.twilightforest.ironwood_pickaxe": "ǝxɐʞɔᴉԀ pooʍuoɹI", + "item.twilightforest.ironwood_shovel": "ꞁǝʌoɥS pooʍuoɹI", + "item.twilightforest.ironwood_sword": "pɹoʍS pooʍuoɹI", + "item.twilightforest.king_spider_spawn_egg": "ᵷᵷƎ uʍɐdS ɹǝpᴉdS ᵷuᴉꞰ", + "item.twilightforest.knight_phantom_banner_pattern": "uɹǝʇʇɐԀ ɹǝuuɐᗺ", + "item.twilightforest.knight_phantom_banner_pattern.desc": "ʇǝɯꞁǝH ʇɥᵷᴉuꞰ", + "item.twilightforest.knight_phantom_spawn_egg": "ᵷᵷƎ uʍɐdS ɯoʇuɐɥԀ ʇɥᵷᴉuꞰ", + "item.twilightforest.knightmetal_axe": "ǝxⱯ ꞁɐʇǝɯʇɥᵷᴉuꞰ", + "item.twilightforest.knightmetal_axe.desc": "sʇǝᵷɹɐʇ pǝɹoɯɹɐun oʇ ǝᵷɐɯɐp ɐɹʇxƎ", + "item.twilightforest.knightmetal_boots": "sʇooᗺ ꞁɐʇǝɯʇɥᵷᴉuꞰ", + "item.twilightforest.knightmetal_chestplate": "ǝʇɐꞁdʇsǝɥƆ ꞁɐʇǝɯʇɥᵷᴉuꞰ", + "item.twilightforest.knightmetal_helmet": "ʇǝɯꞁǝH ꞁɐʇǝɯʇɥᵷᴉuꞰ", + "item.twilightforest.knightmetal_ingot": "ʇoᵷuI ꞁɐʇǝɯʇɥᵷᴉuꞰ", + "item.twilightforest.knightmetal_leggings": "sǝʌɐǝɹ⅁ ꞁɐʇǝɯʇɥᵷᴉuꞰ", + "item.twilightforest.knightmetal_pickaxe": "ǝxɐʞɔᴉԀ ꞁɐʇǝɯʇɥᵷᴉuꞰ", + "item.twilightforest.knightmetal_pickaxe.desc": "sʇǝᵷɹɐʇ pǝɹoɯɹɐ oʇ ǝᵷɐɯɐp ɐɹʇxƎ", + "item.twilightforest.knightmetal_ring": "dooꞀ ꞁɐʇǝɯʇɥᵷᴉuꞰ", + "item.twilightforest.knightmetal_shield": "pꞁǝᴉɥS ꞁɐʇǝɯʇɥᵷᴉuꞰ", + "item.twilightforest.knightmetal_sword": "pɹoʍS ꞁɐʇǝɯʇɥᵷᴉuꞰ", + "item.twilightforest.knightmetal_sword.desc": "sʇǝᵷɹɐʇ pǝɹoɯɹɐ oʇ ǝᵷɐɯɐp ɐɹʇxƎ", + "item.twilightforest.kobold_spawn_egg": "ᵷᵷƎ uʍɐdS pꞁoqoꞰ", + "item.twilightforest.lamp_of_cinders": "sɹǝpuᴉƆ ɟo dɯɐꞀ", + "item.twilightforest.lich_banner_pattern": "uɹǝʇʇɐԀ ɹǝuuɐᗺ", + "item.twilightforest.lich_banner_pattern.desc": "uʍoɹƆ ɥɔᴉꞀ", + "item.twilightforest.lich_spawn_egg": "ᵷᵷƎ uʍɐdS ɥɔᴉꞀ", + "item.twilightforest.lifedrain_scepter": "ᵷuᴉuᴉɐɹᗡ ǝɟᴉꞀ ɟo ɹǝʇdǝɔS", + "item.twilightforest.liveroot": "ʇooɹǝʌᴉꞀ", + "item.twilightforest.lower_goblin_knight_spawn_egg": "ᵷᵷƎ uʍɐdS ʇɥᵷᴉuꞰ uᴉꞁqo⅁", + "item.twilightforest.magic_beans": "suɐǝᗺ ɔᴉᵷɐW", + "item.twilightforest.magic_map": "dɐW ɔᴉᵷɐW ʞuɐꞁᗺ", + "item.twilightforest.magic_map_focus": "snɔoℲ dɐW ɔᴉᵷɐW", + "item.twilightforest.mangrove_boat": "ʇɐoᗺ ǝʌoɹᵷuɐW", + "item.twilightforest.mangrove_chest_boat": "ʇɐoᗺ ʇsǝɥƆ ǝʌoɹᵷuɐW", + "item.twilightforest.maze_map": "dɐW ǝzɐW ʞuɐꞁᗺ", + "item.twilightforest.maze_map_focus": "snɔoℲ dɐW ǝzɐW", + "item.twilightforest.maze_slime_spawn_egg": "ᵷᵷƎ uʍɐdS ǝɯᴉꞁS ǝzɐW", + "item.twilightforest.maze_wafer": "ɹǝɟɐM ǝzɐW", + "item.twilightforest.mazebreaker_pickaxe": "ɹǝʞɐǝɹqǝzɐW", + "item.twilightforest.meef_stroganoff": "ɟɟouɐᵷoɹʇS ɟǝǝW", + "item.twilightforest.mining_boat": "ʇɐoᗺ pooʍǝuᴉW", + "item.twilightforest.mining_chest_boat": "ʇɐoᗺ ʇsǝɥƆ pooʍǝuᴉW", + "item.twilightforest.minoshroom_banner_pattern": "uɹǝʇʇɐԀ ɹǝuuɐᗺ", + "item.twilightforest.minoshroom_banner_pattern.desc": "sǝxⱯ ɯooɹɥsouᴉW", + "item.twilightforest.minoshroom_spawn_egg": "ᵷᵷƎ uʍɐdS ɯooɹɥsouᴉW", + "item.twilightforest.minotaur_axe.desc": "ᵷuᴉᵷɹɐɥɔ ǝꞁᴉɥʍ ǝᵷɐɯɐp ɐɹʇxƎ", + "item.twilightforest.minotaur_spawn_egg": "ᵷᵷƎ uʍɐdS ɹnɐʇouᴉW", + "item.twilightforest.mist_wolf_spawn_egg": "ᵷᵷƎ uʍɐdS ɟꞁoM ʇsᴉW", + "item.twilightforest.moon_dial": "ꞁɐᴉᗡ uooW", + "item.twilightforest.moon_dial.phase_0": "uooW ꞁꞁnℲ", + "item.twilightforest.moon_dial.phase_1": "snoqqᴉ⅁ ᵷuᴉuɐM", + "item.twilightforest.moon_dial.phase_2": "ɹǝʇɹɐnꝹ pɹᴉɥ⟘", + "item.twilightforest.moon_dial.phase_3": "ʇuǝɔsǝɹƆ ᵷuᴉuɐM", + "item.twilightforest.moon_dial.phase_4": "uooW ʍǝN", + "item.twilightforest.moon_dial.phase_5": "ʇuǝɔsǝɹƆ ᵷuᴉxɐM", + "item.twilightforest.moon_dial.phase_6": "ɹǝʇɹɐnꝹ ʇsɹᴉℲ", + "item.twilightforest.moon_dial.phase_7": "snoqqᴉ⅁ ᵷuᴉxɐM", + "item.twilightforest.moon_dial.phase_unknown": "ǝʇɐuᴉɯɹǝʇǝpuᴉ ǝsɐɥd uooW", + "item.twilightforest.moon_dial.phase_unknown_fools": "punoɟ ʇou uooɯ ߈0߈", + "item.twilightforest.moonworm_queen": "uǝǝnꝹ ɯɹoʍuooW", + "item.twilightforest.mosquito_swarm_spawn_egg": "ᵷᵷƎ uʍɐdS ɯɹɐʍS oʇᴉnbsoW", + "item.twilightforest.music_disc_findings": "ɔsᴉᗡ ɔᴉsnW", + "item.twilightforest.music_disc_findings.desc": "sᵷuᴉpuᴉℲ - ʇsodɯoƆɹW", + "item.twilightforest.music_disc_home": "ɔsᴉᗡ ɔᴉsnW", + "item.twilightforest.music_disc_home.desc": "ǝɯoH - ʇsodɯoƆɹW", + "item.twilightforest.music_disc_maker": "ɔsᴉᗡ ɔᴉsnW", + "item.twilightforest.music_disc_maker.desc": "ɹǝʞɐW - ʇsodɯoƆɹW", + "item.twilightforest.music_disc_motion": "ɔsᴉᗡ ɔᴉsnW", + "item.twilightforest.music_disc_motion.desc": "uoᴉʇoW - ʇsodɯoƆɹW", + "item.twilightforest.music_disc_radiance": "ɔsᴉᗡ ɔᴉsnW", + "item.twilightforest.music_disc_radiance.desc": "ǝɔuɐᴉpɐᴚ - ʇꞁʎʍ⅁ ɥɔʇoᴚ", + "item.twilightforest.music_disc_steps": "ɔsᴉᗡ ɔᴉsnW", + "item.twilightforest.music_disc_steps.desc": "sdǝʇS - ʇꞁʎʍ⅁ ɥɔʇoᴚ", + "item.twilightforest.music_disc_superstitious": "ɔsᴉᗡ ɔᴉsnW", + "item.twilightforest.music_disc_superstitious.desc": "snoᴉʇᴉʇsɹǝdnS - ʇꞁʎʍ⅁ ɥɔʇoᴚ", + "item.twilightforest.music_disc_thread": "ɔsᴉᗡ ɔᴉsnW", + "item.twilightforest.music_disc_thread.desc": "pɐǝɹɥ⟘ - ʇsodɯoƆɹW", + "item.twilightforest.music_disc_wayfarer": "ɔsᴉᗡ ɔᴉsnW", + "item.twilightforest.music_disc_wayfarer.desc": "ɹǝɹɐɟʎɐM - ʇsodɯoƆɹW", + "item.twilightforest.naga_banner_pattern": "uɹǝʇʇɐԀ ɹǝuuɐᗺ", + "item.twilightforest.naga_banner_pattern.desc": "sǝꞁɐɔS ɐᵷɐN", + "item.twilightforest.naga_chestplate": "ɔᴉun⟘ ǝꞁɐɔS ɐᵷɐN", + "item.twilightforest.naga_leggings": "sᵷuᴉᵷᵷǝꞀ ǝꞁɐɔS ɐᵷɐN", + "item.twilightforest.naga_scale": "ǝꞁɐɔS ɐᵷɐN", + "item.twilightforest.naga_spawn_egg": "ᵷᵷƎ uʍɐdS ɐᵷɐN", + "item.twilightforest.ore_magnet": "ʇǝuᵷɐW ǝɹO", + "item.twilightforest.ore_map": "dɐW ǝɹO/ǝzɐW ʞuɐꞁᗺ", + "item.twilightforest.ore_meter": "ɹǝʇǝW ǝɹO", + "item.twilightforest.peacock_feather_fan": "uɐℲ ɹǝɥʇɐǝℲ ʞɔoɔɐǝԀ", + "item.twilightforest.penguin_spawn_egg": "ᵷᵷƎ uʍɐdS uᴉnᵷuǝԀ", + "item.twilightforest.phantom_armor.desc": "ɥʇɐǝp uo ʇsoꞁ ɹǝʌǝu sI", + "item.twilightforest.phantom_chestplate": "ǝʇɐꞁdʇsǝɥƆ ɯoʇuɐɥԀ", + "item.twilightforest.phantom_helmet": "ʇǝɯꞁǝH ɯoʇuɐɥԀ", + "item.twilightforest.pinch_beetle_spawn_egg": "ᵷᵷƎ uʍɐdS ǝꞁʇǝǝᗺ ɥɔuᴉԀ", + "item.twilightforest.quest_ram_banner_pattern": "uɹǝʇʇɐԀ ɹǝuuɐᗺ", + "item.twilightforest.quest_ram_banner_pattern.desc": "sꞁɹᴉʍS ɯɐᴚ ʇsǝnꝹ", + "item.twilightforest.quest_ram_spawn_egg": "ᵷᵷƎ uʍɐdS ɯɐᴚ ʇsǝnꝹ", + "item.twilightforest.raven_feather": "ɹǝɥʇɐǝℲ uǝʌɐᴚ", + "item.twilightforest.raven_spawn_egg": "ᵷᵷƎ uʍɐdS uǝʌɐᴚ", + "item.twilightforest.raw_ironwood": "pooʍuoɹI ʍɐᴚ", + "item.twilightforest.raw_meef": "ɟǝǝW ʍɐᴚ", + "item.twilightforest.raw_venison": "uosᴉuǝɅ ʍɐᴚ", + "item.twilightforest.redcap_sapper_spawn_egg": "ᵷᵷƎ uʍɐdS ɹǝddɐS dɐɔpǝᴚ", + "item.twilightforest.redcap_spawn_egg": "ᵷᵷƎ uʍɐdS dɐɔpǝᴚ", + "item.twilightforest.scepter.desc": "ʇɟǝꞁ sǝᵷɹɐɥɔ %s", + "item.twilightforest.seeker_bow": "ʍoᗺ ɹǝʞǝǝS", + "item.twilightforest.skeleton_druid_spawn_egg": "ᵷᵷƎ uʍɐdS pᴉnɹᗡ uoʇǝꞁǝʞS", + "item.twilightforest.skull_candle.desc": "ǝꞁpuɐƆ %2$s %1$s :sɐH", + "item.twilightforest.skull_candle.desc.multiple": "sǝꞁpuɐƆ %2$s %1$s :sɐH", + "item.twilightforest.slime_beetle_spawn_egg": "ᵷᵷƎ uʍɐdS ǝꞁʇǝǝᗺ ǝɯᴉꞁS", + "item.twilightforest.snow_guardian_spawn_egg": "ᵷᵷƎ uʍɐdS uɐᴉpɹɐn⅁ ʍouS", + "item.twilightforest.snow_queen_banner_pattern": "uɹǝʇʇɐԀ ɹǝuuɐᗺ", + "item.twilightforest.snow_queen_banner_pattern.desc": "uʍoɹƆ uǝǝnꝹ ʍouS", + "item.twilightforest.snow_queen_spawn_egg": "ᵷᵷƎ uʍɐdS uǝǝnꝹ ʍouS", + "item.twilightforest.sorting_boat": "ʇɐoᗺ pooʍᵷuᴉʇɹoS", + "item.twilightforest.sorting_chest_boat": "ʇɐoᗺ ʇsǝɥƆ pooʍᵷuᴉʇɹoS", + "item.twilightforest.squirrel_spawn_egg": "ᵷᵷƎ uʍɐdS ꞁǝɹɹᴉnbS", + "item.twilightforest.stable_ice_core_spawn_egg": "ᵷᵷƎ uʍɐdS ǝɹoƆ ǝɔI ǝꞁqɐʇS", + "item.twilightforest.steeleaf_axe": "ǝxⱯ ɟɐǝꞁǝǝʇS", + "item.twilightforest.steeleaf_boots": "sʇooᗺ ɟɐǝꞁǝǝʇS", + "item.twilightforest.steeleaf_chestplate": "ǝʇɐꞁdʇsǝɥƆ ɟɐǝꞁǝǝʇS", + "item.twilightforest.steeleaf_helmet": "ʇǝɯꞁǝH ɟɐǝꞁǝǝʇS", + "item.twilightforest.steeleaf_hoe": "ǝoH ɟɐǝꞁǝǝʇS", + "item.twilightforest.steeleaf_ingot": "ɟɐǝꞁǝǝʇS", + "item.twilightforest.steeleaf_leggings": "sᵷuᴉᵷᵷǝꞀ ɟɐǝꞁǝǝʇS", + "item.twilightforest.steeleaf_pickaxe": "ǝxɐʞɔᴉԀ ɟɐǝꞁǝǝʇS", + "item.twilightforest.steeleaf_shovel": "ꞁǝʌoɥS ɟɐǝꞁǝǝʇS", + "item.twilightforest.steeleaf_sword": "pɹoʍS ɟɐǝꞁǝǝʇS", + "item.twilightforest.swarm_spider_spawn_egg": "ᵷᵷƎ uʍɐdS ɹǝpᴉdS ɯɹɐʍS", + "item.twilightforest.time_boat": "ʇɐoᗺ pooʍǝɯᴉ⟘", + "item.twilightforest.time_chest_boat": "ʇɐoᗺ ʇsǝɥƆ pooʍǝɯᴉ⟘", + "item.twilightforest.tiny_bird_spawn_egg": "ᵷᵷƎ uʍɐdS pɹᴉᗺ ʎuᴉ⟘", + "item.twilightforest.torchberries": "sǝᴉɹɹǝqɥɔɹo⟘", + "item.twilightforest.tower_key": "ʎǝꞰ ɹǝʍo⟘", + "item.twilightforest.towerwood_borer_spawn_egg": "ᵷᵷƎ uʍɐdS ɹǝɹoᗺ pooʍɹǝʍo⟘", + "item.twilightforest.transformation_boat": "ʇɐoᗺ pooʍsuɐɹ⟘", + "item.twilightforest.transformation_chest_boat": "ʇɐoᗺ ʇsǝɥƆ pooʍsuɐɹ⟘", + "item.twilightforest.transformation_powder": "ɹǝpʍoԀ uoᴉʇɐɯɹoɟsuɐɹ⟘", + "item.twilightforest.triple_bow": "ʍoᗺ-ᴉɹ⟘", + "item.twilightforest.troll_spawn_egg": "ᵷᵷƎ uʍɐdS ꞁꞁoɹ⟘", + "item.twilightforest.twilight_oak_boat": "ʇɐoᗺ ʞɐO ʇɥᵷᴉꞁᴉʍ⟘", + "item.twilightforest.twilight_oak_chest_boat": "ʇɐoᗺ ʇsǝɥƆ ʞɐO ʇɥᵷᴉꞁᴉʍ⟘", + "item.twilightforest.twilight_scepter": "ʇɥᵷᴉꞁᴉʍ⟘ ɟo ɹǝʇdǝɔS", + "item.twilightforest.unstable_ice_core_spawn_egg": "ᵷᵷƎ uʍɐdS ǝɹoƆ ǝɔI ǝꞁqɐʇsu∩", + "item.twilightforest.ur_ghast_banner_pattern": "uɹǝʇʇɐԀ ɹǝuuɐᗺ", + "item.twilightforest.ur_ghast_banner_pattern.desc": "ɹǝpɹoᗺ ǝʇᴉuᴉɯɹɐƆ", + "item.twilightforest.ur_ghast_spawn_egg": "ᵷᵷƎ uʍɐdS ʇsɐɥ⅁-ɹ∩", + "item.twilightforest.winter_wolf_spawn_egg": "ᵷᵷƎ uʍɐdS ɟꞁoM ɹǝʇuᴉM", + "item.twilightforest.wraith_spawn_egg": "ᵷᵷƎ uʍɐdS ɥʇᴉɐɹM", + "item.twilightforest.yeti_armor.desc": "sɹǝʞɔɐʇʇɐ sꞁꞁᴉɥƆ", + "item.twilightforest.yeti_boots": "sʇooᗺ ᴉʇǝ⅄", + "item.twilightforest.yeti_chestplate": "ʇǝʞɔɐՐ ᴉʇǝ⅄", + "item.twilightforest.yeti_helmet": "ɯꞁǝH pǝuɹoH ᴉʇǝ⅄", + "item.twilightforest.yeti_leggings": "sᵷuᴉᵷᵷǝꞀ ᴉʇǝ⅄", + "item.twilightforest.yeti_spawn_egg": "ᵷᵷƎ uʍɐdS ᴉʇǝ⅄", + "item.twilightforest.zombie_scepter": "ɹǝʇdǝɔS ǝᴉqɯoZ", + "itemGroup.twilightforest.blocks": "sʞɔoꞁᗺ :ʇsǝɹoℲ ʇɥᵷᴉꞁᴉʍ⟘", + "itemGroup.twilightforest.equipment": "ʇuǝɯdᴉnbƎ :ʇsǝɹoℲ ʇɥᵷᴉꞁᴉʍ⟘", + "itemGroup.twilightforest.items": "sɯǝʇI :ʇsǝɹoℲ ʇɥᵷᴉꞁᴉʍ⟘", + "misc.twilightforest.advancement_hidden": "<ʇuǝɯǝɔuɐʌpⱯ uǝppᴉH>", + "misc.twilightforest.advancement_required": ":pǝɹᴉnbǝᴚ ʇuǝɯǝɔuɐʌpⱯ", + "misc.twilightforest.biome_locked": "¡pǝʞɔoꞀ ǝɯoᴉᗺ", + "misc.twilightforest.biome_locked_2": "sʇuǝɯǝɔuɐʌpɐ ɹnoʎ ʞɔǝɥƆ", + "misc.twilightforest.core_disabled": "ᵷᴉɟuoɔ ɐᴉʌ pǝꞁqɐsᴉp sᴉ %s", + "misc.twilightforest.firefly_spawner_radius": "sʞɔoꞁᗺ %s :snᴉpɐᴚ ǝꞁɔᴉʇɹɐԀ ʎꞁɟǝɹᴉℲ", + "misc.twilightforest.magic_map_fail": "¿ǝɹǝɥ ʞɹoʍ ʇ,usǝop ʇᴉ sdɐɥɹǝԀ ˙pǝɹǝʇꞁɐɟ ɔᴉᵷɐW ǝɥ⟘", + "misc.twilightforest.nyi": "˙pǝʇuǝɯǝꞁdɯᴉ ʇǝʎ ʇou ǝɹɐ ʇɐɥʇ sʇɔǝɟɟǝ sɐɥ ǝɹnʇɐǝɟ sᴉɥ⟘", + "misc.twilightforest.ore_meter_exposed": "%s :pǝsodxƎ", + "misc.twilightforest.ore_meter_range": "[%3$s ‘%2$s] :uᴉᵷᴉɹO ‘%1$s :snᴉpɐᴚ", + "misc.twilightforest.pedestal_ineligible": "˙ʎɥʇɹoʍun ǝɹɐ no⅄", + "misc.twilightforest.portal_unsafe": "˙˙˙ǝɹǝɥ ǝɟɐs ɯǝǝs ʇ,usǝop ʇI", + "misc.twilightforest.portal_unworthy": "¿pǝʇɔǝꞁᵷǝu sɐʍ ᵷuᴉɥʇǝɯos sdɐɥɹǝԀ ˙ǝʌᴉsuodsǝɹun sᴉ ꞁood ꞁɐʇɹoԀ ǝɥ⟘", + "misc.twilightforest.wip0": "˙pꞁɹoʍ ɹnoʎ ǝᵷɐɯɐp ʎɐɯ ʇɐɥʇ sʇɔǝɟɟǝ pǝpuǝʇuᴉun ɹo sᵷnq ǝʌɐɥ ʎɐɯ puɐ ssǝɹᵷoɹd uᴉ ʞɹoʍ ɐ sᴉ ǝɹnʇɐǝɟ sᴉɥ⟘", + "misc.twilightforest.wip1": "˙uoᴉʇnɐɔ ɥʇᴉʍ ǝs∩", + "stat.twilightforest.blocks_crumbled": "pǝꞁqɯnɹƆ sʞɔoꞁᗺ", + "stat.twilightforest.bugs_squished": "pǝɥsɐnbS sᵷnᗺ", + "stat.twilightforest.e115_slices_eaten": "uǝʇɐƎ sǝɔᴉꞁS ϛ⥝⥝ ʇuǝɯᴉɹǝdxƎ", + "stat.twilightforest.keeping_charms_activated": "pǝs∩ ᵷuᴉdǝǝꞰ ɟo sɯɹɐɥƆ", + "stat.twilightforest.life_charms_activated": "pǝs∩ ǝɟᴉꞀ ɟo sɯɹɐɥƆ", + "stat.twilightforest.skull_candles_made": "pǝʇɐǝɹƆ sǝꞁpuɐƆ ꞁꞁnʞS", + "stat.twilightforest.tf_shields_broken": "uǝʞoɹᗺ spꞁǝᴉɥS uoᴉʇɐɔᴉɟᴉʇɹoℲ", + "stat.twilightforest.torchberries_harvested": "pǝʇsǝʌɹɐH sǝᴉɹɹǝqɥɔɹo⟘", + "stat.twilightforest.trophy_pedestals_activated": "pǝʇɐʌᴉʇɔⱯ sꞁɐʇsǝpǝԀ ʎɥdoɹ⟘", + "stat.twilightforest.uncrafting_table_interactions": "ǝꞁqɐ⟘ ᵷuᴉʇɟɐɹɔu∩ ɥʇᴉʍ suoᴉʇɔɐɹǝʇuI", + "structure.twilightforest.aurora_palace": "ǝɔɐꞁɐԀ ɐɹoɹnⱯ", + "structure.twilightforest.dark_tower": "ɹǝʍo⟘ ʞɹɐᗡ", + "structure.twilightforest.final_castle": "ǝꞁʇsɐƆ nɐǝʇɐꞁԀ ꞁɐuᴉℲ", + "structure.twilightforest.hedge_maze": "ǝzɐW ǝᵷpǝH", + "structure.twilightforest.hydra_lair": "ɹᴉɐꞀ s,ɐɹpʎH", + "structure.twilightforest.knight_stronghold": "pꞁoɥᵷuoɹʇS ʇɥᵷᴉuꞰ", + "structure.twilightforest.labyrinth": "ɥʇuᴉɹʎqɐꞀ ɹnɐʇouᴉW", + "structure.twilightforest.large_hollow_hill": "ꞁꞁᴉH ʍoꞁꞁoH ǝᵷɹɐꞀ", + "structure.twilightforest.lich_tower": "ɹǝʍo⟘ ɥɔᴉꞀ", + "structure.twilightforest.medium_hollow_hill": "ꞁꞁᴉH ʍoꞁꞁoH ɯnᴉpǝW", + "structure.twilightforest.mushroom_tower": "ǝꞁʇsɐƆ ɯooɹɥsnW", + "structure.twilightforest.naga_courtyard": "pɹɐʎʇɹnoƆ ɐᵷɐN", + "structure.twilightforest.quest_grove": "ǝʌoɹ⅁ ʇsǝnꝹ", + "structure.twilightforest.small_hollow_hill": "ꞁꞁᴉH ʍoꞁꞁoH ꞁꞁɐɯS", + "structure.twilightforest.troll_cave": "ǝʌɐƆ ꞁꞁoɹ⟘", + "structure.twilightforest.yeti_cave": "ǝʌɐƆ ᴉʇǝ⅄", + "subtitles.twilightforest.block.beanstalk.grow": "sǝꞁqɯnɹ punoɹ⅁", + "subtitles.twilightforest.block.boss_chest.appear": "sɹɐǝddɐ ʇsǝɥƆ ssoᗺ", + "subtitles.twilightforest.block.bug.squish": "): pǝɥsᴉnbs sʇǝᵷ ᵷnᗺ", + "subtitles.twilightforest.block.builder.create": "ʞɔoꞁq sǝʇɐǝɹɔ ɹǝpꞁᴉnᗺ ǝʇᴉuᴉɯɹɐƆ", + "subtitles.twilightforest.block.builder.off": "sǝʇɐʌᴉʇɔɐǝp ɹǝpꞁᴉnᗺ ǝʇᴉuᴉɯɹɐƆ", + "subtitles.twilightforest.block.builder.on": "sǝʇɐʌᴉʇɔɐ ɹǝpꞁᴉnᗺ ǝʇᴉuᴉɯɹɐƆ", + "subtitles.twilightforest.block.builder.replace": "sǝɹᴉdxǝ ʞɔoꞁᗺ ʇꞁᴉnᗺ", + "subtitles.twilightforest.block.casket.close": "sǝsoꞁɔ ʇǝʞsɐƆ ǝʞɐsdǝǝꞰ", + "subtitles.twilightforest.block.casket.locked": "sʞɔᴉꞁɔ ʇǝʞsɐƆ ǝʞɐsdǝǝꞰ", + "subtitles.twilightforest.block.casket.open": "suǝdo ʇǝʞsɐƆ ǝʞɐsdǝǝꞰ", + "subtitles.twilightforest.block.casket.repair": "pǝɹᴉɐdǝɹ ʇǝʞsɐƆ ǝʞɐsdǝǝꞰ", + "subtitles.twilightforest.block.cicada": "sɯɐǝɹɔs ɐpɐɔᴉƆ", + "subtitles.twilightforest.block.core.time": "sʞɔᴉʇ ǝɯᴉ⟘ ɟo ǝǝɹ⟘", + "subtitles.twilightforest.block.core.transformation": "sɯnɥ uoᴉʇɐɯɹoɟsuɐɹ⟘ ɟo ǝǝɹ⟘", + "subtitles.twilightforest.block.door.activate": "sʞɔᴉꞁɔ ɹooᗡ ǝꞁʇsɐƆ", + "subtitles.twilightforest.block.door.reappear": "sɹɐǝddɐǝɹ ɹooᗡ ǝꞁʇsɐƆ", + "subtitles.twilightforest.block.door.vanish": "sǝɥsᴉuɐʌ ɹooᗡ ǝꞁʇsɐƆ", + "subtitles.twilightforest.block.generic.annihilation": "sǝʌꞁossᴉp ʞɔoꞁᗺ", + "subtitles.twilightforest.block.ghast_trap.ambient": "sᵷuᴉp dɐɹ⟘ ʇsɐɥ⅁", + "subtitles.twilightforest.block.ghast_trap.on": "sǝzznq dɐɹ⟘ ʇsɐɥ⅁", + "subtitles.twilightforest.block.ghast_trap.spindown": "ɟɟo sʇnɥs dɐɹ⟘ ʇsɐɥ⅁", + "subtitles.twilightforest.block.ghast_trap.warmup": "dn sɯɹɐʍ dɐɹ⟘ ʇsɐɥ⅁", + "subtitles.twilightforest.block.jet.active": "sǝɹɐꞁɟ ʇǝՐ ǝɹᴉℲ", + "subtitles.twilightforest.block.jet.pop": "sdod ʇǝՐ ǝɹᴉℲ", + "subtitles.twilightforest.block.jet.start": "sǝʇɐʌᴉʇɔɐ ʇǝՐ ǝɹᴉℲ", + "subtitles.twilightforest.block.portal.whoosh": "suoʞɔǝq ꞁɐʇɹoԀ ʇsǝɹoℲ ʇɥᵷᴉꞁᴉʍ⟘", + "subtitles.twilightforest.block.reactor.ambient": "sǝɥsooɥʍ ɹoʇɔɐǝᴚ ǝʇᴉuᴉɯɹɐƆ", + "subtitles.twilightforest.block.reappearing_block.reappear": "sɹɐǝddɐǝɹ ʞɔoꞁᗺ ᵷuᴉɹɐǝddɐǝᴚ", + "subtitles.twilightforest.block.reappearing_block.vanish": "sɹɐǝddɐsᴉp ʞɔoꞁᗺ ᵷuᴉɹɐǝddɐǝᴚ", + "subtitles.twilightforest.block.slider.move": "sʞɐǝɹɔ dɐɹ⟘ ᵷuᴉpᴉꞁS", + "subtitles.twilightforest.block.smoker.start": "sǝʇɐʌᴉʇɔɐ ɹǝʞoɯS", + "subtitles.twilightforest.block.torchberry.harvest": "dod sǝᴉɹɹǝqɥɔɹo⟘", + "subtitles.twilightforest.block.trophy_pedestal.activate": "ʎɥdoɹʇ sʇdǝɔɔɐ ꞁɐʇsǝpǝԀ ʎɥdoɹ⟘", + "subtitles.twilightforest.block.vanish.locked": "sʞɔᴉꞁɔ ɹoop pooʍɹǝʍo⟘", + "subtitles.twilightforest.block.vanish.unlock": "sʞɔoꞁun ɹoop pooʍɹǝʍo⟘", + "subtitles.twilightforest.block.vanish.vanish": "sǝɥsᴉuɐʌ ʞɔoꞁᗺ ᵷuᴉɥsᴉuɐɅ", + "subtitles.twilightforest.entity.alpha_yeti.alert": "ǝɔᴉʇou sǝʞɐʇ ᴉʇǝ⅄ ɐɥdꞁⱯ", + "subtitles.twilightforest.entity.alpha_yeti.death": "sǝᴉp ᴉʇǝ⅄ ɐɥdꞁⱯ", + "subtitles.twilightforest.entity.alpha_yeti.grab": "sqɐɹᵷ ᴉʇǝ⅄ ɐɥdꞁⱯ", + "subtitles.twilightforest.entity.alpha_yeti.growl": "sꞁʍoɹᵷ ᴉʇǝ⅄ ɐɥdꞁⱯ", + "subtitles.twilightforest.entity.alpha_yeti.hurt": "sʇɹnɥ ᴉʇǝ⅄ ɐɥdꞁⱯ", + "subtitles.twilightforest.entity.alpha_yeti.ice": "ǝɔᴉ sʍoɹɥʇ ᴉʇǝ⅄ ɐɥdꞁⱯ", + "subtitles.twilightforest.entity.alpha_yeti.pant": "sʇuɐd ᴉʇǝ⅄ ɐɥdꞁⱯ", + "subtitles.twilightforest.entity.alpha_yeti.roar": "sɹɐoɹ ᴉʇǝ⅄ ɐɥdꞁⱯ", + "subtitles.twilightforest.entity.alpha_yeti.throw": "sʍoɹɥʇ ᴉʇǝ⅄ ɐɥdꞁⱯ", + "subtitles.twilightforest.entity.bighorn_sheep.ambient": "sʇɐǝꞁq dǝǝɥS uɹoɥᵷᴉᗺ", + "subtitles.twilightforest.entity.bighorn_sheep.death": "sǝᴉp dǝǝɥS uɹoɥᵷᴉᗺ", + "subtitles.twilightforest.entity.bighorn_sheep.hurt": "sʇɹnɥ dǝǝɥS uɹoɥᵷᴉᗺ", + "subtitles.twilightforest.entity.blockchain_goblin.ambient": "sǝꞁʞɔnɥɔ uᴉꞁqo⅁ uᴉɐɥƆ puɐ ʞɔoꞁᗺ", + "subtitles.twilightforest.entity.blockchain_goblin.death": "sǝᴉp uᴉꞁqo⅁ uᴉɐɥƆ puɐ ʞɔoꞁᗺ", + "subtitles.twilightforest.entity.blockchain_goblin.hurt": "sɯɐǝɹɔs uᴉꞁqo⅁ uᴉɐɥƆ puɐ ʞɔoꞁᗺ", + "subtitles.twilightforest.entity.boar.ambient": "sʞuᴉo ɹɐoᗺ", + "subtitles.twilightforest.entity.boar.death": "sǝᴉp ɹɐoᗺ", + "subtitles.twilightforest.entity.boar.hurt": "sʇɹnɥ ɹɐoᗺ", + "subtitles.twilightforest.entity.carminite_broodling.ambient": "sǝssᴉɥ ᵷuᴉꞁpooɹᗺ ǝʇᴉuᴉɯɹɐƆ", + "subtitles.twilightforest.entity.carminite_broodling.death": "sǝᴉp ᵷuᴉꞁpooɹᗺ ǝʇᴉuᴉɯɹɐƆ", + "subtitles.twilightforest.entity.carminite_broodling.hurt": "sʇɹnɥ ᵷuᴉꞁpooɹᗺ ǝʇᴉuᴉɯɹɐƆ", + "subtitles.twilightforest.entity.carminite_ghastguard.ambient": "sǝᴉɹɔ pɹɐnᵷʇsɐɥ⅁ ǝʇᴉuᴉɯɹɐƆ", + "subtitles.twilightforest.entity.carminite_ghastguard.death": "sǝᴉp pɹɐnᵷʇsɐɥ⅁ ǝʇᴉuᴉɯɹɐƆ", + "subtitles.twilightforest.entity.carminite_ghastguard.hurt": "sɯɐǝɹɔs pɹɐnᵷʇsɐɥ⅁ ǝʇᴉuᴉɯɹɐƆ", + "subtitles.twilightforest.entity.carminite_ghastguard.shoot": "sʇooɥs pɹɐnᵷʇsɐɥ⅁ ǝʇᴉuᴉɯɹɐƆ", + "subtitles.twilightforest.entity.carminite_ghastling.ambient": "sǝᴉɹɔ ᵷuᴉꞁʇsɐɥ⅁ ǝʇᴉuᴉɯɹɐƆ", + "subtitles.twilightforest.entity.carminite_ghastling.death": "sǝᴉp ᵷuᴉꞁʇsɐɥ⅁ ǝʇᴉuᴉɯɹɐƆ", + "subtitles.twilightforest.entity.carminite_ghastling.hurt": "sɯɐǝɹɔs ᵷuᴉꞁʇsɐɥ⅁ ǝʇᴉuᴉɯɹɐƆ", + "subtitles.twilightforest.entity.carminite_ghastling.shoot": "sʇooɥs ᵷuᴉꞁʇsɐɥ⅁ ǝʇᴉuᴉɯɹɐƆ", + "subtitles.twilightforest.entity.carminite_golem.attack": "sᵷuᴉʍs ɯǝꞁo⅁ ǝʇᴉuᴉɯɹɐƆ", + "subtitles.twilightforest.entity.carminite_golem.death": "sǝᴉp ɯǝꞁo⅁ ǝʇᴉuᴉɯɹɐƆ", + "subtitles.twilightforest.entity.carminite_golem.hurt": "sʇɹnɥ ɯǝꞁo⅁ ǝʇᴉuᴉɯɹɐƆ", + "subtitles.twilightforest.entity.death_tome.ambient": "sǝᵷɐd sdᴉꞁɟ ǝɯo⟘ ɥʇɐǝᗡ", + "subtitles.twilightforest.entity.death_tome.death": "ʇɹɐdɐ sꞁꞁɐɟ ǝɯo⟘ ɥʇɐǝᗡ", + "subtitles.twilightforest.entity.death_tome.hurt": "sǝsɐǝɹɔ ǝɯo⟘ ɥʇɐǝᗡ", + "subtitles.twilightforest.entity.deer.ambient": "sooɯ ɹǝǝᗡ", + "subtitles.twilightforest.entity.deer.death": "sǝᴉp ɹǝǝᗡ", + "subtitles.twilightforest.entity.deer.hurt": "sʇɹnɥ ɹǝǝᗡ", + "subtitles.twilightforest.entity.dwarf_rabbit.ambient": "sʞɐǝnbs ʇᴉqqɐᴚ ɟɹɐʍᗡ", + "subtitles.twilightforest.entity.dwarf_rabbit.death": "sǝᴉp ʇᴉqqɐᴚ ɟɹɐʍᗡ", + "subtitles.twilightforest.entity.dwarf_rabbit.hurt": "sʇɹnɥ ʇᴉqqɐᴚ ɟɹɐʍᗡ", + "subtitles.twilightforest.entity.fire_beetle.death": "sǝᴉp ǝꞁʇǝǝᗺ ǝɹᴉℲ", + "subtitles.twilightforest.entity.fire_beetle.hurt": "sʇɹnɥ ǝꞁʇǝǝᗺ ǝɹᴉℲ", + "subtitles.twilightforest.entity.fire_beetle.shoot": "sǝɯɐꞁɟ sʍǝds ǝꞁʇǝǝᗺ ǝɹᴉℲ", + "subtitles.twilightforest.entity.goblin_knight.ambient": "sǝꞁʞɔnɥɔ ʇɥᵷᴉuꞰ uᴉꞁqo⅁", + "subtitles.twilightforest.entity.goblin_knight.death": "ʎuoᵷɐ uᴉ suɐoɹᵷ ʇɥᵷᴉuꞰ uᴉꞁqo⅁", + "subtitles.twilightforest.entity.goblin_knight.hurt": "uᴉɐd uᴉ sǝɥɔǝǝɹɔs ʇɥᵷᴉuꞰ uᴉꞁqo⅁", + "subtitles.twilightforest.entity.goblin_knight.muffled.ambient": "sǝꞁʞɔnɥɔ ʇɥᵷᴉuꞰ uᴉꞁqo⅁ pǝꞁɟɟnW", + "subtitles.twilightforest.entity.goblin_knight.muffled.death": "ʎuoᵷɐ uᴉ suɐoɹᵷ ʇɥᵷᴉuꞰ uᴉꞁqo⅁ pǝꞁɟɟnW", + "subtitles.twilightforest.entity.goblin_knight.muffled.hurt": "uᴉɐd uᴉ sǝɥɔǝǝɹɔs ʇɥᵷᴉuꞰ uᴉꞁqo⅁ pǝꞁɟɟnW", + "subtitles.twilightforest.entity.hedge_spider.ambient": "sǝssᴉɥ ɹǝpᴉdS ǝᵷpǝH", + "subtitles.twilightforest.entity.hedge_spider.death": "sǝᴉp ɹǝpᴉdS ǝᵷpǝH", + "subtitles.twilightforest.entity.hedge_spider.hurt": "sʇɹnɥ ɹǝpᴉdS ǝᵷpǝH", + "subtitles.twilightforest.entity.helmet_crab.death": "sǝᴉp qɐɹƆ ʇǝɯꞁǝH", + "subtitles.twilightforest.entity.helmet_crab.hurt": "sʇɹnɥ qɐɹƆ ʇǝɯꞁǝH", + "subtitles.twilightforest.entity.hostile_wolf.ambient": "sꞁʍoɹᵷ ɟꞁoM ǝꞁᴉʇsoH", + "subtitles.twilightforest.entity.hostile_wolf.death": "sǝᴉp ɟꞁoM ǝꞁᴉʇsoH", + "subtitles.twilightforest.entity.hostile_wolf.hurt": "sʇɹnɥ ɟꞁoM ǝꞁᴉʇsoH", + "subtitles.twilightforest.entity.hostile_wolf.target": "ǝɔᴉʇou sǝʞɐʇ ɟꞁoM ǝꞁᴉʇsoH", + "subtitles.twilightforest.entity.hydra.death": "ʇɐǝɟǝp uᴉ sɹɐoɹ ɐɹpʎH", + "subtitles.twilightforest.entity.hydra.growl": "sꞁʍoɹᵷ ɐɹpʎH", + "subtitles.twilightforest.entity.hydra.hurt": "sʇɹnɥ ɐɹpʎH", + "subtitles.twilightforest.entity.hydra.roar": "sɹɐoɹ ɐɹpʎH", + "subtitles.twilightforest.entity.hydra.shoot": "ɹɐʇɹoɯ sʇooɥs ɐɹpʎH", + "subtitles.twilightforest.entity.hydra.shoot_fire": "ǝɹᴉɟ sʇooɥs ɐɹpʎH", + "subtitles.twilightforest.entity.hydra.warn": "ǝʇᴉq oʇ sǝɹɐdǝɹd ɐɹpʎH", + "subtitles.twilightforest.entity.ice.ambient": "sǝꞁʞɔɐɹɔ ǝɹoƆ ǝɔI", + "subtitles.twilightforest.entity.ice.death": "sǝᴉp ǝɹoƆ ǝɔI", + "subtitles.twilightforest.entity.ice.hurt": "sʇɹnɥ ǝɹoƆ ǝɔI", + "subtitles.twilightforest.entity.ice.shoot": "ꞁꞁɐqʍous sʇooɥs ǝɹoƆ ǝɔI", + "subtitles.twilightforest.entity.king_spider.ambient": "sǝssᴉɥ ɹǝpᴉdS ᵷuᴉꞰ", + "subtitles.twilightforest.entity.king_spider.death": "sǝᴉp ɹǝpᴉdS ᵷuᴉꞰ", + "subtitles.twilightforest.entity.king_spider.hurt": "sʇɹnɥ ɹǝpᴉdS ᵷuᴉꞰ", + "subtitles.twilightforest.entity.knight_phantom.ambient": "sdsɐᵷ ɯoʇuɐɥԀ ʇɥᵷᴉuꞰ", + "subtitles.twilightforest.entity.knight_phantom.axe": "ǝxɐʞɔᴉd sʍoɹɥʇ ɯoʇuɐɥԀ ʇɥᵷᴉuꞰ", + "subtitles.twilightforest.entity.knight_phantom.death": "sǝᴉp ɯoʇuɐɥԀ ʇɥᵷᴉuꞰ", + "subtitles.twilightforest.entity.knight_phantom.hurt": "sʇɹnɥ ɯoʇuɐɥԀ ʇɥᵷᴉuꞰ", + "subtitles.twilightforest.entity.knight_phantom.pickaxe": "ǝxɐ sʍoɹɥʇ ɯoʇuɐɥԀ ʇɥᵷᴉuꞰ", + "subtitles.twilightforest.entity.kobold.ambient": "sǝꞁqɯnɹᵷ pꞁoqoꞰ", + "subtitles.twilightforest.entity.kobold.death": "sǝᴉp pꞁoqoꞰ", + "subtitles.twilightforest.entity.kobold.hurt": "sʇɹnɥ pꞁoqoꞰ", + "subtitles.twilightforest.entity.kobold.munch": "pooɟ uo sǝɥɔunɯ pꞁoqoꞰ", + "subtitles.twilightforest.entity.lich.ambient": "sǝɥʇɐǝɹq ɥɔᴉꞀ", + "subtitles.twilightforest.entity.lich.death": "sǝᴉp ɥɔᴉꞀ", + "subtitles.twilightforest.entity.lich.hurt": "sʇɹnɥ ɥɔᴉꞀ", + "subtitles.twilightforest.entity.lich.pop_mob": "qoɯ sqɹosqɐ ɥɔᴉꞀ", + "subtitles.twilightforest.entity.lich.shoot": "sʇooɥs ɥɔᴉꞀ", + "subtitles.twilightforest.entity.lich.teleport": "sʇɹodǝꞁǝʇ ɥɔᴉꞀ", + "subtitles.twilightforest.entity.lich_clone.hurt": "ʞɔɐʇʇɐ sǝssɐdʎq ǝuoꞁɔ ʍopɐɥs ɥɔᴉꞀ", + "subtitles.twilightforest.entity.loyal_zombie.ambient": "suɐoɹᵷ ǝᴉqɯoZ ꞁɐʎoꞀ", + "subtitles.twilightforest.entity.loyal_zombie.death": "sǝᴉp ǝᴉqɯoZ ꞁɐʎoꞀ", + "subtitles.twilightforest.entity.loyal_zombie.hurt": "sʇɹnɥ ǝᴉqɯoZ ꞁɐʎoꞀ", + "subtitles.twilightforest.entity.loyal_zombie.summon": "pǝuoɯɯns ǝᴉqɯoZ ꞁɐʎoꞀ", + "subtitles.twilightforest.entity.maze_slime.death": "sǝᴉp ǝɯᴉꞁS ǝzɐW", + "subtitles.twilightforest.entity.maze_slime.hurt": "sʇɹnɥ ǝɯᴉꞁS ǝzɐW", + "subtitles.twilightforest.entity.maze_slime.squish": "sǝɥsᴉnbs ǝɯᴉꞁS ǝzɐW", + "subtitles.twilightforest.entity.minion.ambient": "suɐoɹᵷ uoᴉuᴉW ɥɔᴉꞀ", + "subtitles.twilightforest.entity.minion.death": "sǝᴉp uoᴉuᴉW ɥɔᴉꞀ", + "subtitles.twilightforest.entity.minion.hurt": "sʇɹnɥ uoᴉuᴉW ɥɔᴉꞀ", + "subtitles.twilightforest.entity.minion.summon": "uoᴉuᴉW ʍǝu suoɯɯns ɥɔᴉꞀ", + "subtitles.twilightforest.entity.minoshroom.ambient": "sooɯ ɯooɹɥsouᴉW", + "subtitles.twilightforest.entity.minoshroom.attack": "sʞɔɐʇʇɐ ɯooɹɥsouᴉW", + "subtitles.twilightforest.entity.minoshroom.death": "sǝᴉp ɯooɹɥsouᴉW", + "subtitles.twilightforest.entity.minoshroom.hurt": "sʇɹnɥ ɯooɹɥsouᴉW", + "subtitles.twilightforest.entity.minoshroom.slam": "punoɹᵷ sɯɐꞁs ɯooɹɥsouᴉW", + "subtitles.twilightforest.entity.minotaur.ambient": "sooɯ ɹnɐʇouᴉW", + "subtitles.twilightforest.entity.minotaur.attack": "sʞɔɐʇʇɐ ɹnɐʇouᴉW", + "subtitles.twilightforest.entity.minotaur.death": "sǝᴉp ɹnɐʇouᴉW", + "subtitles.twilightforest.entity.minotaur.hurt": "sʇɹnɥ ɹnɐʇouᴉW", + "subtitles.twilightforest.entity.mist_wolf.ambient": "sꞁʍoɹᵷ ɟꞁoM ʇsᴉW", + "subtitles.twilightforest.entity.mist_wolf.death": "sǝᴉp ɟꞁoM ʇsᴉW", + "subtitles.twilightforest.entity.mist_wolf.hurt": "sʇɹnɥ ɟꞁoM ʇsᴉW", + "subtitles.twilightforest.entity.mist_wolf.target": "ǝɔᴉʇou sǝʞɐʇ ɟꞁoM ʇsᴉW", + "subtitles.twilightforest.entity.mosquito.ambient": "zznq sǝoʇᴉnbsoW", + "subtitles.twilightforest.entity.naga.hiss": "sǝssᴉɥ ɐᵷɐN", + "subtitles.twilightforest.entity.naga.hurt": "sʇɹnɥ ɐᵷɐN", + "subtitles.twilightforest.entity.naga.rattle": "sǝꞁʇʇɐɹ ɐᵷɐN", + "subtitles.twilightforest.entity.parrot.imitate.alpha_yeti": "sꞁʍoɹᵷ ʎꞁpꞁoɔ ʇoɹɹɐԀ", + "subtitles.twilightforest.entity.parrot.imitate.carminite_golem": "sʞunɥʇ ʇoɹɹɐԀ", + "subtitles.twilightforest.entity.parrot.imitate.death_tome": "sǝsᴉou ʞooq sǝʞɐɯ ʇoɹɹɐԀ", + "subtitles.twilightforest.entity.parrot.imitate.hostile_wolf": "sꞁʍoɹᵷ ʇoɹɹɐԀ", + "subtitles.twilightforest.entity.parrot.imitate.hydra": "sɹɐoɹ ʇoɹɹɐԀ", + "subtitles.twilightforest.entity.parrot.imitate.ice_core": "sǝꞁʞɔɐɹɔ ʇoɹɹɐԀ", + "subtitles.twilightforest.entity.parrot.imitate.kobold": "sǝꞁqɯnɹᵷ ʇoɹɹɐԀ", + "subtitles.twilightforest.entity.parrot.imitate.minotaur": "ʎꞁᴉɹᵷuɐ sooɯ ʇoɹɹɐԀ", + "subtitles.twilightforest.entity.parrot.imitate.mosquito": "sǝzznq ʇoɹɹɐԀ", + "subtitles.twilightforest.entity.parrot.imitate.naga": "sǝꞁʇʇɐɹ ʇoɹɹɐԀ", + "subtitles.twilightforest.entity.parrot.imitate.redcap": "sǝꞁʞɔnɥɔ ʇoɹɹɐԀ", + "subtitles.twilightforest.entity.parrot.imitate.wraith": "sdsɐᵷ ʇoɹɹɐԀ", + "subtitles.twilightforest.entity.pinch_beetle.death": "sǝᴉp ǝꞁʇǝǝᗺ ɥɔuᴉԀ", + "subtitles.twilightforest.entity.pinch_beetle.hurt": "sʇɹnɥ ǝꞁʇǝǝᗺ ɥɔuᴉԀ", + "subtitles.twilightforest.entity.quest_ram.ambient": "sʇɐǝꞁq ɯɐᴚ ʇsǝnꝹ", + "subtitles.twilightforest.entity.quest_ram.death": "sǝᴉp ɯɐᴚ ʇsǝnꝹ", + "subtitles.twilightforest.entity.quest_ram.hurt": "sʇɹnɥ ɯɐᴚ ʇsǝnꝹ", + "subtitles.twilightforest.entity.raven.caw": "sʍɐɔ uǝʌɐᴚ", + "subtitles.twilightforest.entity.raven.squawk": "uᴉɐd uᴉ sʞʍɐnbs uǝʌɐᴚ", + "subtitles.twilightforest.entity.redcap.ambient": "sǝꞁʞɔnɥɔ dɐɔpǝᴚ", + "subtitles.twilightforest.entity.redcap.death": "ʎuoᵷɐ uᴉ suɐoɹᵷ dɐɔpǝᴚ", + "subtitles.twilightforest.entity.redcap.hurt": "uᴉɐd uᴉ sǝɥɔǝǝɹɔs dɐɔpǝᴚ", + "subtitles.twilightforest.entity.shield.add": "suʍɐds pꞁǝᴉɥS uoᴉʇɐɔᴉɟᴉʇɹoℲ", + "subtitles.twilightforest.entity.shield.break": "sʞɐǝɹq pꞁǝᴉɥS uoᴉʇɐɔᴉɟᴉʇɹoℲ", + "subtitles.twilightforest.entity.skeleton_druid.ambient": "sǝꞁʇʇɐɹ pᴉnɹᗡ uoʇǝꞁǝʞS", + "subtitles.twilightforest.entity.skeleton_druid.death": "sǝᴉp pᴉnɹᗡ uoʇǝꞁǝʞS", + "subtitles.twilightforest.entity.skeleton_druid.hurt": "sʇɹnɥ pᴉnɹᗡ uoʇǝꞁǝʞS", + "subtitles.twilightforest.entity.skeleton_druid.shoot": "sʇooɥs pᴉnɹᗡ uoʇǝꞁǝʞS", + "subtitles.twilightforest.entity.slime_beetle.death": "sǝᴉp ǝꞁʇǝǝᗺ ǝɯᴉꞁS", + "subtitles.twilightforest.entity.slime_beetle.hurt": "sʇɹnɥ ǝꞁʇǝǝᗺ ǝɯᴉꞁS", + "subtitles.twilightforest.entity.slime_beetle.squish": "sʇooɥs ǝꞁʇǝǝᗺ ǝɯᴉꞁS", + "subtitles.twilightforest.entity.snow_guardian.ambient": "sǝꞁʞɔɐɹɔ uɐᴉpɹɐn⅁ ʍouS", + "subtitles.twilightforest.entity.snow_guardian.death": "sǝᴉp uɐᴉpɹɐn⅁ ʍouS", + "subtitles.twilightforest.entity.snow_guardian.hurt": "sʇɹnɥ uɐᴉpɹɐn⅁ ʍouS", + "subtitles.twilightforest.entity.snow_queen.ambient": "sǝꞁʞɔɐɹɔ uǝǝnꝹ ʍouS", + "subtitles.twilightforest.entity.snow_queen.attack": "sʞɔɐʇʇɐ uǝǝnꝹ ʍouS", + "subtitles.twilightforest.entity.snow_queen.break": "ʞɔɐʇʇɐ sʇɔǝꞁɟǝp uǝǝnꝹ ʍouS", + "subtitles.twilightforest.entity.snow_queen.death": "sǝᴉp uǝǝnꝹ ʍouS", + "subtitles.twilightforest.entity.snow_queen.hurt": "sʇɹnɥ uǝǝnꝹ ʍouS", + "subtitles.twilightforest.entity.swarm_spider.ambient": "sǝssᴉɥ ɹǝpᴉdS ɯɹɐʍS", + "subtitles.twilightforest.entity.swarm_spider.death": "sǝᴉp ɹǝpᴉdS ɯɹɐʍS", + "subtitles.twilightforest.entity.swarm_spider.hurt": "sʇɹnɥ ɹǝpᴉdS ɯɹɐʍS", + "subtitles.twilightforest.entity.tear.break": "sɹǝʇʇɐɥs ɹɐǝʇ ʇsɐɥ⅁-ɹ∩", + "subtitles.twilightforest.entity.tiny_bird.chirp": "sdɹᴉɥɔ pɹᴉᗺ", + "subtitles.twilightforest.entity.tiny_bird.hurt": "uᴉɐd uᴉ sʞɐǝnbs pɹᴉᗺ", + "subtitles.twilightforest.entity.tiny_bird.song": "sᵷuᴉs pɹᴉᗺ", + "subtitles.twilightforest.entity.tiny_bird.takeoff": "ɟɟo sǝʞɐʇ pɹᴉᗺ", + "subtitles.twilightforest.entity.troll.throw_rock": "ʞɔoꞁq sʞɔnɥɔ ꞁꞁoɹ⟘", + "subtitles.twilightforest.entity.ur_ghast.ambient": "sǝᴉɹɔ ʇsɐɥ⅁-ɹ∩", + "subtitles.twilightforest.entity.ur_ghast.death": "sǝᴉp ʇsɐɥ⅁-ɹ∩", + "subtitles.twilightforest.entity.ur_ghast.hurt": "sɯɐǝɹɔs ʇsɐɥ⅁-ɹ∩", + "subtitles.twilightforest.entity.ur_ghast.shoot": "sʇooɥs ʇsɐɥ⅁-ɹ∩", + "subtitles.twilightforest.entity.ur_ghast.tantrum": "sꞁᴉɐʍ ʇsɐɥ⅁-ɹ∩", + "subtitles.twilightforest.entity.winter_wolf.ambient": "sꞁʍoɹᵷ ɟꞁoM ɹǝʇuᴉM", + "subtitles.twilightforest.entity.winter_wolf.death": "sǝᴉp ɟꞁoM ɹǝʇuᴉM", + "subtitles.twilightforest.entity.winter_wolf.hurt": "sʇɹnɥ ɟꞁoM ɹǝʇuᴉM", + "subtitles.twilightforest.entity.winter_wolf.shoot": "sʇooɥs ɟꞁoM ɹǝʇuᴉM", + "subtitles.twilightforest.entity.winter_wolf.target": "ǝɔᴉʇou sǝʞɐʇ ɟꞁoM ɹǝʇuᴉM", + "subtitles.twilightforest.entity.wraith.ambient": "sdsɐᵷ ɥʇᴉɐɹM", + "subtitles.twilightforest.entity.wraith.death": "sǝᴉp ɥʇᴉɐɹM", + "subtitles.twilightforest.entity.wraith.hurt": "sʇɹnɥ ɥʇᴉɐɹM", + "subtitles.twilightforest.entity.yeti.death": "sǝᴉp ᴉʇǝ⅄", + "subtitles.twilightforest.entity.yeti.grab": "sqɐɹᵷ ᴉʇǝ⅄", + "subtitles.twilightforest.entity.yeti.growl": "sꞁʍoɹᵷ ᴉʇǝ⅄", + "subtitles.twilightforest.entity.yeti.hurt": "sʇɹnɥ ᴉʇǝ⅄", + "subtitles.twilightforest.entity.yeti.throw": "sʍoɹɥʇ ᴉʇǝ⅄", + "subtitles.twilightforest.environment.acid_rain": "spꞁɐɔs uᴉɐɹ pᴉɔⱯ", + "subtitles.twilightforest.item.block_and_chain.collide": "ʞɔoꞁq sʇᴉɥ uᴉɐɥƆ puɐ ʞɔoꞁᗺ", + "subtitles.twilightforest.item.block_and_chain.fire": "sǝɹᴉɟ uᴉɐɥƆ puɐ ʞɔoꞁᗺ", + "subtitles.twilightforest.item.block_and_chain.hit": "ʎʇᴉʇuǝ sʇᴉɥ uᴉɐɥƆ puɐ ʞɔoꞁᗺ", + "subtitles.twilightforest.item.charm.keep": "sɯǝʇᴉ suɹnʇǝɹ ᵷuᴉdǝǝꞰ ɟo ɯɹɐɥƆ", + "subtitles.twilightforest.item.charm.life": "sǝʇɐɹǝuǝᵷǝɹ ᵷuᴉdǝǝꞰ ɟo ɯɹɐɥƆ", + "subtitles.twilightforest.item.fan.whoosh": "sʍoꞁq uɐℲ ɹǝɥʇɐǝℲ ʞɔoɔɐǝԀ", + "subtitles.twilightforest.item.flask.break": "sɹǝʇʇɐɥs ʞsɐꞁℲ ǝꞁʇʇᴉɹᗺ", + "subtitles.twilightforest.item.flask.crack": "sʞɔɐɹɔ ʞsɐꞁℲ ǝꞁʇʇᴉɹᗺ", + "subtitles.twilightforest.item.flask.fill": "sꞁꞁᴉɟ ʞsɐꞁℲ uoᴉʇoԀ", + "subtitles.twilightforest.item.glass_sword.break": "sɹǝʇʇɐɥs pɹoʍS ssɐꞁ⅁", + "subtitles.twilightforest.item.ice_bomb.fired": "uʍoɹɥʇ qɯoᗺ ǝɔI", + "subtitles.twilightforest.item.knightmetal_armor.equip": "sʞuɐꞁɔ ɹoɯɹⱯ ꞁɐʇǝɯʇɥᵷᴉuꞰ", + "subtitles.twilightforest.item.knightmetal_shield.shatter": "sɹǝʇʇɐɥs pꞁǝᴉɥS ꞁɐʇǝW", + "subtitles.twilightforest.item.lamp.burn": "ɐǝɹɐ sǝʇᴉuᵷᴉ sɹǝpuᴉƆ ɟo dɯɐꞀ", + "subtitles.twilightforest.item.magnet.grab": "ǝɹo dn sꞁꞁnd ʇǝuᵷɐW ǝɹO", + "subtitles.twilightforest.item.moonworm.squish": "sǝɹᴉɟ ɯɹoʍuooW", + "subtitles.twilightforest.item.scepter.drain": "suᴉɐɹp ɹǝʇdǝɔS ǝɟᴉꞀ", + "subtitles.twilightforest.item.scepter.pearl": "ꞁɹɐǝd sʍoɹɥʇ ɹǝʇdǝɔS ʇɥᵷᴉꞁᴉʍ⟘", + "subtitles.twilightforest.item.shield.shatter": "sɹǝʇʇɐɥs pꞁǝᴉɥS uǝpooM", + "subtitles.twilightforest.item.transformation_powder.use": "sɯɹoɟsuɐɹ⟘ qoW", + "twilightforest.book.author": "ɹǝɹoꞁdxǝ uǝʇʇoᵷɹoɟ ɐ", + "twilightforest.book.darktower": "ɹǝʍo⟘ uǝpooM ɐ uo sǝʇoN", + "twilightforest.book.darktower.1": "ᵷuᴉǝq ǝɹɐ ɹǝʍoʇ ǝɥʇ ɟo sǝɔᴉʌǝp ǝɥʇ ɟᴉ sᴉ ʇI ˙ʇouuɐɔ ʇᴉ ʇnq ‘ɥɔnoʇ ʎɯ ǝᵷpǝꞁʍouʞɔɐ oʇ suɹɐǝʎ ʇsoɯꞁɐ ɔᴉᵷɐɯ ɹᴉǝɥ⟘ ˙ǝɯ oʇ ᵷuᴉpuodsǝɹ ʇou ǝɹɐ ʇɐɥʇ sɯsᴉuɐɥɔǝɯ sɐɥ ʎꞁɹɐǝꞁɔ ɹǝʍoʇ sᴉɥ⟘\n\n§8[[uoᴉsoꞁdxǝ uɐ pǝʌᴉʌɹns ǝʌɐɥ oʇ sɯǝǝs ʇɐɥʇ ʞooqǝʇou s,ɹǝɹoꞁdxǝ uⱯ]]§0", + "twilightforest.book.darktower.2": "ǝɹǝɥ⟘ ˙pǝsnɔoɟun ʇnq ‘ᵷuᴉɯɹɐɥɔ sᴉ ɔᴉᵷɐɯ ɹᴉǝɥʇ sɐ ‘suᴉꞁqoᵷ ǝɥʇ ɯoɹɟ ǝɯoɔ ʇ,uɐɔ ʇI ˙ʎqɹɐǝu spꞁoɥᵷuoɹʇs ǝɥʇ uᴉɥʇᴉʍ dǝǝp ɯoɹɟ ǝʇɐuɐɯǝ oʇ sɯǝǝs ɔᴉᵷɐɯ ǝɥ⟘\n\n§8[[ʎɹʇuǝ ʇxǝN]]§0\n\n˙ʎqɹɐǝu sᵷuᴉǝq ɟo dnoɹᵷ ꞁnɟɹǝʍod ɐ ʎq pǝssǝɹddns", + "twilightforest.book.darktower.3": "˙˙˙ʎꞁddnsǝɹ I ɹǝʇɟɐ pꞁoɥᵷuoɹʇs ǝɥʇ oʇ ʞɔɐq pɐǝɥ ꞁꞁᴉʍ I ˙dnoɹᵷ ɐ sɐ ᵷuᴉʇɐɹǝdo ‘sǝɔɹnos ꞁɐɹǝʌǝs ɯoɹɟ sǝɯoɔ ʇᴉ ʇɐɥʇ sǝʇɐɔᴉpuᴉ sᴉsʎꞁɐuɐ ʎW\n\n§8[[ʎɹʇuǝ ʇxǝN]]§0\n\n˙spꞁoɥᵷuoɹʇs ǝɥʇ uᴉ ǝʌᴉʇɔɐ ꞁꞁᴉʇs ǝɔɹoɟ ǝɯos ǝq ꞁꞁᴉʇs ʇsnɯ", + "twilightforest.book.hydralair": "dɯɐʍS ǝɹᴉℲ ǝɥʇ uo sǝʇoN", + "twilightforest.book.hydralair.1": "ʇnq ‘uoᴉʇɐᴉɹɐʌ ᵷuᴉʇsǝɹǝʇuᴉ uɐ sᴉ ǝɹǝɥ ɹᴉɐ ᵷuᴉuɹnq ǝɥ⟘ ˙ɐʌɐꞁ ɟo suɐǝɔo ɥᵷnoɹɥʇ ɯɐʍs puɐ ‘ǝɹᴉɟ ɟo sɐǝs pǝsɹǝʌɐɹʇ ǝʌɐɥ I ˙ɟꞁǝsʎɯ sɐ ɥɔns ɹǝɹoꞁdxǝ ɹǝʇsɐɯ ɐ ɹoɟ ǝꞁɔɐʇsqo ꞁɐᴉʌᴉɹʇ ɐ sᴉ ǝɹᴉℲ\n\n§8[[ɹǝdɐd ɟooɹdǝɹᴉɟ uo uǝʇʇᴉɹʍ ‘ʞooqǝʇou s,ɹǝɹoꞁdxǝ uⱯ]]§0", + "twilightforest.book.hydralair.2": "ɯɐ I puɐ ‘pǝɹǝʇunoɔuǝ ǝʌɐɥ I ꞁꞁǝds uoᴉʇɔǝʇoɹd ʇsɹᴉɟ ǝɥʇ ʇou sᴉ sᴉɥ⟘ ˙dɯɐʍs ǝɹᴉɟ sᴉɥʇ ɟo ᵷuᴉʞ ǝq ʇsnɯ ʇɐɥʇ ǝɹnʇɐǝɹɔ ʎʇɥᵷᴉɯ ɐ ᵷuᴉpunoɹɹns ǝɯᴉʇ sᴉɥʇ ‘ꞁꞁǝds uoᴉʇɔǝʇoɹd ɹǝɥʇouɐ pǝɹǝʇunoɔuǝ ǝʌɐɥ I ʇɐɥʇ sᴉ ɥᵷnoɥʇ ǝɯ doʇs sǝop ʇɐɥM\n\n˙ǝɔuɐɹpuᴉɥ ou ʎꞁǝʇɐɯᴉʇꞁn", + "twilightforest.book.hydralair.3": "˙sɹnɐʇouᴉɯ ɟo ꞁꞁnɟ sɥʇuᴉɹʎqɐꞁ ǝɹɐ sdɯɐʍs ǝsoɥʇ ɹǝpun puɐ ‘sdɯɐʍs ʇǝʍ ꞁɐɹǝʌǝs ǝɹɐ dɯɐʍs ǝɹᴉɟ ǝɥʇ ᵷuᴉpunoɹɹnS ˙ʎqɹɐǝu ǝɹnʇɐǝɹɔ ꞁnɟɹǝʍod ɐ ʎq pǝuᴉɐʇsns ǝq ꞁꞁᴉʍ ʇᴉ ‘sɹǝɥʇo ǝɥʇ ǝʞᴉꞁ sᴉ ꞁꞁǝds sᴉɥʇ ɟI\n\n˙ʞɹoʍ ʎǝɥʇ ʍoɥ ɟo sǝᴉɹǝʇsʎɯ ǝɥʇ ꞁǝʌɐɹun oʇ ᵷuᴉuuᴉᵷǝq", + "twilightforest.book.hydralair.4": "˙˙˙ʇᴉ punoɹɹns ʇɐɥʇ sɹǝɥʇo ǝɥʇ ɯoɹɟ ʎɐʍ ǝɯos uᴉ ʇuǝɹǝɟɟᴉp ‘ɹnɐʇouᴉɯ ꞁnɟɹǝʍod ɟo ʇɹos ǝɯos ǝq pꞁnoʍ oʇ ꞁꞁǝds ɐ ɥɔns puᴉq oʇ ǝɔᴉoɥɔ ꞁɐɔᴉᵷoꞁ ǝɥ⟘", + "twilightforest.book.icetower": "uoᴉʇɐɔᴉɟᴉʇɹoℲ ꞁɐɹoɹnⱯ uo sǝʇoN", + "twilightforest.book.icetower.1": "ǝɥʇ ɟo sɹoꞁoɔ ǝɥʇ ɥʇᴉʍ ᵷuᴉuᴉɥs ‘ǝɔɐꞁɐd ǝɔᴉ uɐ ɟo ɹopuǝꞁds ǝɥʇ ǝɯ uʍoɥs ǝʌɐɥ suoᴉʇɐɹoꞁdxǝ ʎW ˙ɹǝᴉɔɐꞁᵷ ǝɥʇ doʇɐ ɯɹoʇs ǝɔᴉ ǝꞁqᴉɹɹǝʇ sᴉɥʇ oʇuᴉ unɹ oʇ ʎꞁuo ‘pɹɐzzᴉꞁq ǝuo ǝɯɐɔɹǝʌo I\n\n§8[[ǝɔᴉ uᴉ pǝʞɐɔ ‘ʞooqǝʇou s,ɹǝɹoꞁdxǝ uⱯ]]§0", + "twilightforest.book.icetower.2": "ǝɥʇ ɟo ɹǝʍod ǝɥʇ ɟɟo ʇꞁᴉnq sɐʍ dɯɐʍs ǝɹᴉɟ ǝɥʇ ᵷuᴉpunoɹɹns ǝsɹnɔ ǝɥʇ ɟo ǝsnɐɔ ǝɥ⟘ ˙ʎqɹɐǝu ǝɹnʇɐǝɹɔ ɐ ɟo ɹǝʍod ǝɥʇ ʎq pǝɟ sᴉ ǝsɹnɔ sᴉɥ⟘ ˙ǝɔᴉʌou ou ɯɐ I\n\n§8[[ʎɹʇuǝ ʇxǝN]]§0\n\n˙ǝsɹnɔ ɟo ʇɹos ǝɯos ʎq pǝʇɔǝʇoɹd sɯǝǝs ꞁꞁɐ ʇI ˙ɐɹoɹnɐ ɹɐꞁod", + "twilightforest.book.icetower.3": "˙˙˙ɹǝpɐǝꞁ ɟo ʇɹos ǝɯos ǝʌɐɥ sᴉʇǝʎ ǝɥʇ sdɐɥɹǝԀ ˙sᴉʇǝʎ ɟo sǝssɐɯ ǝɹɐ ǝɹǝɥʇ ‘ɹǝᴉɔɐꞁᵷ sᴉɥʇ ᵷuᴉpunoɹɹnS\n\n˙ʎqɹɐǝu sɹnɐʇouᴉɯ ǝɥʇ ɟo ɹǝpɐǝꞁ", + "twilightforest.book.labyrinth": "ɥʇuᴉɹʎqɐꞀ ʎdɯɐʍS ɐ uo sǝʇoN", + "twilightforest.book.labyrinth.1": "ǝɹɐ ʎǝɥʇ ʇɐɥʇ ʇɔǝdsns oʇ unᵷǝq ǝʌɐɥ I ˙ʎᵷoꞁoɔǝ ꞁɐɔoꞁ ǝɥʇ uᴉ ǝꞁoɹ ɐ ǝʌɐɥ oʇ ɯǝǝs ʎǝɥʇ op ɹou ‘ǝɔɹnos ꞁɐɹnʇɐu ou ǝʌɐɥ oʇ ɯǝǝs ɯǝɥʇ ɟo ʎʇᴉɹoɾɐɯ ʇsɐʌ ǝɥ⟘ ˙ǝᵷuɐɹʇs ʇnq ‘ᵷuᴉxǝʌ ǝɹɐ dɯɐʍs sᴉɥʇ uᴉ sǝoʇᴉnbsoɯ ǝɥ⟘\n\n§8[[ɹǝdɐd ɟooɹdɹǝʇɐʍ uo uǝʇʇᴉɹʍ ‘ʞooqǝʇou s,ɹǝɹoꞁdxǝ uⱯ]]§0", + "twilightforest.book.labyrinth.2": "ɐ ǝɹɐ sǝoʇᴉnbsoɯ ǝɥʇ puɐ ꞁꞁǝds uoᴉʇɔǝʇoɹd ǝɥʇ ɥʇoᗺ ˙pǝɯɹᴉɟuoɔ suoᴉɔᴉdsns ʎɯ ɹǝpᴉsuoɔ I ‘ǝɹǝɥ ɥʇuᴉɹʎqɐꞁ pǝuᴉnɹ ǝɥʇ uo ꞁꞁǝds uoᴉʇɔǝʇoɹd ɐ pǝɹǝʇunoɔuǝ ǝʌɐɥ I ʇɐɥʇ ʍoN\n\n§8[[ʎɹʇuǝ ʇxǝN]]§0\n\n˙ǝsɹnɔ ꞁɐɔᴉᵷɐɯ ɟo puᴉʞ ǝɯos", + "twilightforest.book.labyrinth.3": "oʇ ǝuoꞁɐ ᵷuᴉǝq ǝuo ɹoɟ ꞁnɟɹǝʍod ooʇ ǝdʎʇ ɐ ɟo ǝq oʇ sɯǝǝs ǝsɹnɔ ǝɥ⟘\n\n§8[[ʎɹʇuǝ ʇxǝN]]§0\n\n˙˙˙ɹǝɥʇɹnɟ ɥɔɹɐǝsǝɹ oʇ ǝʌɐɥ ꞁꞁᴉʍ I ˙pǝɹǝʇunoɔuǝ ǝʌɐɥ I sɹǝɥʇo ǝɥʇ ɯoɹɟ ǝɔɹnos ʇuǝɹǝɟɟᴉp ɐ ǝʌɐɥ oʇ sɯǝǝs ǝsɹnɔ sᴉɥ⟘ ˙ǝsɹnɔ", + "twilightforest.book.labyrinth.4": "˙spɹɐzᴉʍ ᵷuᴉʌᴉꞁ ʎqɹɐǝu ʎuɐ ɟo suᵷᴉs ʍoɥs ʇou op suoᴉʇɐuᴉʌᴉp ʎɯ ‘ʎꞁǝᵷuɐɹʇS ˙ꞁꞁɐɟ pꞁnoʍ dɯɐʍs ǝɹᴉʇuǝ ǝɥʇ ɹǝʌo ǝsɹnɔ ǝɥʇ ɟo ǝꞁoɥʍ ǝɥʇ ‘ᵷuᴉʇnqᴉɹʇuoɔ pǝddoʇs spɹɐzᴉʍ ǝɥʇ ɟo ǝuo ɟI\n\n˙ʎɹɐssǝɔǝu ǝq pꞁnoʍ uoᴉʇɐuᴉqɯoɔ uᴉ ᵷuᴉʞɹoʍ spɹɐzᴉʍ ꞁɐɹǝʌǝS ˙ǝɔnpoɹd", + "twilightforest.book.labyrinth.5": "˙˙˙ɥᵷnoɥʇ sɹǝʍoʇ pǝɟooɹ-ʎʇuᴉod ʎqɹɐǝu ǝɥʇ ɟo ǝuo uᴉ ᵷuᴉʇsǝɹǝʇuᴉ ᵷuᴉɥʇǝɯos ǝǝs pᴉp I", + "twilightforest.book.lichtower": "ɹǝʍo⟘ ʎʇuᴉoԀ ɐ uo sǝʇoN", + "twilightforest.book.lichtower.1": "ǝɥʇ oʇuᴉ ɟɟo ᵷuᴉꞁᴉoq sᴉ ǝsɹnɔ ǝɥʇ ɯoɹɟ ɔᴉᵷɐɯ ǝɥ⟘ ˙ǝɹoɟǝq uǝǝs ǝʌ,I ʎuɐ uɐɥʇ ɹǝᵷuoɹʇs ‘ǝsɹnɔ ɐ ʎq pǝʇɔǝʇoɹd ǝɹɐ ɹǝʍoʇ ǝɥʇ ɟo sʞɔᴉɹq ǝɥ⟘ ˙ɹǝʍoʇ sᴉɥʇ ᵷuᴉpunoɹɹns ɐɹnɐ ǝᵷuɐɹʇs ǝɥʇ ᵷuᴉuᴉɯɐxǝ unᵷǝq ǝʌɐɥ I\n\n§8[sɹǝʇsuoɯ ʎq uo pǝʍɐuᵷ ‘ʞooqǝʇou s,ɹǝɹoꞁdxǝ uⱯ]§0", + "twilightforest.book.lichtower.2": "˙˙˙ɥɔɹɐǝsǝɹ oʇ ǝʌɐɥ ꞁꞁɐɥs I ˙pǝʇᴉɯᴉꞁ ǝɹɐ sǝᴉꞁddns ʎɯ ǝɹǝɥ ʇnq ‘ɔᴉᵷɐɯ sᴉɥʇ ɥʇᴉʍ ᵷuᴉꞁɐǝp ɹoɟ suoᴉʇdo ʎuɐɯ ǝʌɐɥ pꞁnoʍ I puɐꞁǝɯoɥ ʎɯ uI\n\n˙ɐǝɹɐ ᵷuᴉpunoɹɹns", + "twilightforest.book.lichtower.3": "ᵷuᴉʞɐǝɹq-ǝsɹnɔ ǝɥʇ ǝʌɐɥ oʇ sɯǝǝs ǝꞁɐɔs ǝɥʇ uᴉ ɔᴉᵷɐɯ ǝɥ⟘\n\n˙ǝꞁɐɔs uǝǝɹᵷ pǝpɹɐɔsᴉp ‘uʍop uɹoʍ ɐ dn pǝʞɔᴉd I ‘ʎqɹɐǝN ˙pɹɐʎʇɹnoɔ pǝʇɐɹoɔǝp ɐ uᴉ ɹǝʇsuoɯ ǝʞᴉꞁ-ǝʞɐus ǝᵷnɥ ɐ pǝʇɥᵷᴉs I sʎǝuɹnoɾ ʎɯ uI ¡ɥᵷnoɹɥʇʞɐǝɹq Ɐ\n\n§8[[ɹǝʇɐꞁ sǝᴉɹʇuǝ ʎuɐW]]§0", + "twilightforest.book.lichtower.4": "˙ǝɹnʇɐǝɹɔ ǝɥʇ ɯoɹɟ ʎꞁʇɔǝɹᴉp ‘uǝɯᴉɔǝds ɹǝɥsǝɹɟ ɐ ǝɹᴉnbɔɐ oʇ pǝǝu ʎɐɯ I ˙ɯᴉp ooʇ sᴉ ɔᴉᵷɐɯ ǝɥʇ ʇnq ‘pǝǝu I sǝᴉʇɹǝdoɹd", + "twilightforest.book.tfstronghold": "pꞁoɥᵷuoɹʇS ɐ uo sǝʇoN", + "twilightforest.book.tfstronghold.1": "ꞁɐɹǝʌǝs uǝǝs ǝʌɐɥ I ˙ᵷuᴉxǝʌ ǝʇᴉnb sᴉ ɥɔᴉɥʍ ‘ssǝupuᴉꞁq sǝsnɐɔ ꞁꞁǝds ǝɥ⟘ ˙ʇsǝɹoɟ ʞɹɐp ǝɹᴉʇuǝ ǝɥʇ ɹǝʌo ꞁꞁǝds ǝʌᴉʇɔǝʇoɹd ɐ ɟo uoᴉʇɐʇsǝɟᴉuɐɯ ɐ ʇsnɾ ǝɹɐ ɐǝɹɐ sᴉɥʇ ᵷuᴉpunoɹɹns ssǝuʞɹɐp ɟo sꞁᴉɹpuǝʇ ǝɥ⟘\n\n§8[[ɹǝdɐd ᵷuᴉʍoꞁᵷ ʎꞁʇuᴉɐɟ uo uǝʇʇᴉɹʍ ‘ʞooqǝʇou s,ɹǝɹoꞁdxǝ uⱯ]]§0", + "twilightforest.book.tfstronghold.2": "ɟo ꞁꞁnɟ sᴉ pꞁoɥᵷuoɹʇs sᴉɥʇ ‘ɥᵷnoɥʇ sʇɥᵷᴉuʞ uɐɥʇ ɹǝɥʇɐᴚ ˙sʇɥᵷᴉuʞ ʎq pǝʇᴉqɐɥuᴉ ʎꞁꞁɐnsn ǝdʎʇ ɐ ɟo ‘pꞁoɥᵷuoɹʇs ɐ oʇ ᵷuoꞁǝq ʎǝɥ⟘ ˙ʇsǝɹoɟ ʞɹɐp ǝɥʇ uᴉ suᴉnɹ punoɟ ǝʌɐɥ I\n\n§8[[ʎɹʇuǝ ʇxǝN]]§0\n\n˙ᵷuᴉɹoꞁdxǝ dǝǝʞ oʇ ǝʞᴉꞁ pꞁnoʍ puɐ ɐǝɹɐ ǝɥʇ uᴉ sᵷuᴉɥʇ ᵷuᴉʇsǝɹǝʇuᴉ", + "twilightforest.book.tfstronghold.3": "˙ɥʇᵷuǝɹʇs ɹᴉǝɥʇ ǝʌoɹd oʇ uo sǝᴉɥdoɹʇ ǝɔɐꞁd pꞁnoʍ sʇɥᵷᴉuʞ ʇɐɥʇ ǝdʎʇ ɐ ɟo ǝq oʇ sɯǝǝs ꞁɐʇsǝpǝd ǝɥ⟘ ˙ꞁɐʇsǝpǝd ɐ punoɟ ǝʌɐɥ I ‘suᴉnɹ ǝɥʇ uᴉ dǝǝᗡ\n\n§8[[ʎɹʇuǝ ʇxǝN]]§0\n\n˙ʎꞁʇɥᵷᴉuʞ-un ʇsoɯ sᴉ ɹoᴉʌɐɥǝq ɹᴉǝɥʇ ʇnq ‘ɹoɯɹɐ ʎꞁʇɥᵷᴉuʞ ɹɐǝʍ ʎǝɥ⟘ ˙suᴉꞁqoᵷ", + "twilightforest.book.tfstronghold.4": "˙pꞁoɥᵷuoɹʇs ǝɥʇ ɟo ʇɹɐd uᴉɐɯ ǝɥʇ oʇuᴉ ssǝɔɔɐ ʇuɐɹᵷ ʎꞁǝʞᴉꞁ pꞁnoʍ ꞁɐʇsǝpǝd ǝɥʇ uo ǝɹnʇɐǝɹɔ ꞁnɟɹǝʍod ɐ ɥʇᴉʍ pǝʇɐᴉɔossɐ ʎɥdoɹʇ ɐ ᵷuᴉɔɐꞁd puɐ ‘ʇsǝɹoɟ ʞɹɐp ǝɥʇ uo ǝsɹnɔ ǝɥʇ uǝʞɐǝʍ oʇ ɯǝǝs pꞁnoʍ ɹǝʇdǝɔs ꞁnɟɹǝʍod ɐ ᵷuᴉuᴉɐʇqO", + "twilightforest.book.trollcave": "spuɐꞁɥᵷᴉH ǝɥʇ uo sǝʇoN", + "twilightforest.book.trollcave.1": "ǝʌɐɥ I sɹǝɥʇo ǝɥʇ oʇ ɹɐꞁᴉɯᴉs ‘ꞁꞁǝds uoᴉʇɔǝʇoɹd ɹǝɥʇouɐ pǝɹǝʇunoɔuǝ osꞁɐ ǝʌɐɥ I ‘suoᴉsɹnɔxǝ ɟǝᴉɹq ʎɯ uI ˙ɐǝɹɐ sᴉɥʇ ᵷuᴉpunoɹɹns ɯɹoʇsuᴉɐɹ ɔᴉxoʇ ǝɥʇ ɯoɹɟ ɟꞁǝsʎɯ ʇɔǝʇoɹd oʇ ʎɐʍ ou ǝq oʇ sɯǝǝs ǝɹǝɥ⟘\n\n§8[[pᴉɔɐ ʎq pǝᵷɐɯɐp ‘ʞooqǝʇou s,ɹǝɹoꞁdxǝ uⱯ]]§0", + "twilightforest.book.trollcave.2": "uᴉɐʇuoɔ sǝᴉpnʇs ʎW ˙pꞁɹoʍ sᴉɥʇ uᴉ sꞁᴉʌǝ ʇɐǝɹᵷ pǝʇɐǝɟǝpun ǝꞁdᴉʇꞁnɯ ɟo ʇꞁnsǝɹ ǝɥʇ ǝq ʇsnɯ ɔᴉᵷɐɯ ɹǝɥʇɐǝʍ ǝɯǝɹdns ɥɔnS\n\n§8[[ʎɹʇuǝ ʇxǝN]]§0\n\n˙˙˙ʍoꞁꞁoɟ oʇ ɥɔɹɐǝsǝɹ ɹǝɥʇɹnℲ ˙ʎɐʍ ǝɯos uᴉ ɯɹoʇs ɔᴉxoʇ ǝɥʇ oʇ pǝʇɔǝuuoɔ ǝq ʇsnɯ ꞁꞁǝds ǝɥ⟘ ˙pǝssǝuʇᴉʍ", + "twilightforest.book.trollcave.3": "˙ʍous uᴉ pǝʇɐoɔ ɯꞁɐǝɹ ɐ puɐ ‘ssǝuʞɹɐp dǝǝp uᴉ pǝʇɐoɔ ʇsǝɹoɟ ɐ ‘dɯɐʍs ᵷuᴉɹɐǝs ɐ ʇɐ ᵷuᴉʇuᴉod sǝnꞁɔ ꞁɐɹǝʌǝs", + "twilightforest.book.unknown": "pǝuᴉɐꞁdxǝu∩ ǝɥʇ uo sǝʇoN", + "twilightforest.book.unknown.1": "ʇɟǝꞁ ǝʌɐɥ I ᵷuᴉɥʇǝɯos sᴉ ǝɹǝɥʇ sdɐɥɹǝԀ ˙ǝɹǝɥʍǝsꞁǝ sǝᴉꞁ ʇᴉ ᵷuᴉʞɔoꞁun oʇ ɹǝʍsuɐ ǝɥʇ uǝɥʇ ‘sɹǝɥʇo ǝɥʇ ǝʞᴉꞁ sᴉ ǝsɹnɔ sᴉɥʇ ɟI ˙ꞁnɟɹǝʍod sᴉ ɔᴉᵷɐɯ ǝɥʇ ʇnq ‘ǝɹnʇɔnɹʇs sᴉɥʇ ᵷuᴉpunoɹɹns pꞁǝᴉɟ ǝɥʇ uᴉɐꞁdxǝ ʇouuɐɔ I\n\n§8[[sǝɯᴉʇ ʎuɐɯ pǝᴉdoɔ uǝǝq ᵷuᴉʌɐɥ ɟo suᵷᴉs sʍoɥs ʞooq sᴉɥ⟘]]§0", + "twilightforest.book.unknown.2": "˙pǝᵷuɐɥɔ sɐɥ ᵷuᴉɥʇʎuɐ ɟᴉ ǝǝs oʇ ‘ɹǝʇɐꞁ ǝɔɐꞁd sᴉɥʇ oʇ uɹnʇǝɹ ꞁꞁᴉʍ I ˙ʞɔɐq uɹnʇ oʇ ǝʌɐɥ ꞁꞁᴉʍ I ˙ʇɐǝɟǝp oʇ ʇǝʎ ǝʌɐɥ I ɹǝʇsuoɯ ǝɯos ɹo ‘ǝuopun", + "twilightforest.book.yeticave": "ǝʌɐƆ ʎɔI uɐ uo sǝʇoN", + "twilightforest.book.yeticave.1": "ɟo ǝꞁqɐdɐɔ sᴉ ʇɐɥʍ puᴉɟ oʇ sʇuǝɯᴉɹǝdxǝ ʇɔnpuoɔ oʇ ǝʌɐɥ ꞁꞁᴉʍ I ˙uouǝɯouǝɥd ꞁɐɔᴉᵷɐɯ ɐ sᴉ sᴉɥʇ--ꞁꞁɐɟʍous ʎɹɐuᴉpɹo ou sᴉ sᴉɥ⟘ ˙ᵷuᴉsɐǝɔun sᴉ spuɐꞁ ʎʍous ǝsǝɥʇ ᵷuᴉpunoɹɹns pɹɐzzᴉꞁq ǝɥ⟘\n\n§8[[ʇsoɹɟ uᴉ pǝɹǝʌoɔ ‘ʞooqǝʇou s,ɹǝɹoꞁdxǝ uⱯ]]§0", + "twilightforest.book.yeticave.2": "pǝddoʇs spɹɐzᴉʍ ǝɥʇ ɟo ǝuo ɟI ˙ʎɹɐssǝɔǝu ǝq pꞁnoʍ uoᴉʇɐuᴉqɯoɔ uᴉ ᵷuᴉʞɹoʍ spɹɐzᴉʍ ꞁɐɹǝʌǝS ˙ǝɔnpoɹd oʇ ǝuoꞁɐ ᵷuᴉǝq ǝuo ɹoɟ ꞁnɟɹǝʍod ooʇ ǝdʎʇ ɐ ɟo ǝq oʇ sɯǝǝs ǝsɹnɔ ǝɥ⟘\n\n§8[[ʎɹʇuǝ ʇxǝN]]§0\n\n˙ʇɔǝɟɟǝ uɐ ɥɔns ᵷuᴉsnɐɔ", + "twilightforest.book.yeticave.3": "˙˙˙ɥᵷnoɥʇ sɹǝʍoʇ pǝɟooɹ-ʎʇuᴉod ʎqɹɐǝu ǝɥʇ ɟo ǝuo uᴉ ᵷuᴉʇsǝɹǝʇuᴉ ᵷuᴉɥʇǝɯos ǝǝs pᴉp I ˙spɹɐzᴉʍ ᵷuᴉʌᴉꞁ ʎqɹɐǝu ʎuɐ ɟo suᵷᴉs ʍoɥs ʇou op suoᴉʇɐuᴉʌᴉp ʎɯ ‘ʎꞁǝᵷuɐɹʇS ˙ɯꞁɐɔ pꞁnoʍ pɹɐzzᴉꞁq ǝɥʇ ‘ᵷuᴉʇnqᴉɹʇuoɔ" +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/eo_uy.json b/src/main/resources/assets/twilightforest/lang/eo_uy.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/eo_uy.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/es_ar.json b/src/main/resources/assets/twilightforest/lang/es_ar.json new file mode 100644 index 0000000000..a0d52caef9 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/es_ar.json @@ -0,0 +1,1316 @@ +{ + "itemGroup.twilightforest": "Twilight Forest", + + // ADVANCEMENTS + "advancement.twilightforest.root.desc": "Entra en el misterioso bosque mágico: the Twilight Forest.", + + // General progression + "advancement.twilightforest.hedge": "Golpeador de Bichos", + "advancement.twilightforest.hedge.desc": "Derrota a una araña en un %s.", + + "advancement.twilightforest.hill1": "Las botas son mías!", + "advancement.twilightforest.hill1.desc": "Derrota a un %s en un pequeño %s.", + "advancement.twilightforest.hill2": "Qué fue ese ruido?", + "advancement.twilightforest.hill2.desc": "Derrota a un %s en un medio %s.", + "advancement.twilightforest.hill3": "Veo a través de ti", + "advancement.twilightforest.hill3.desc": "Derrota a un %s en un gran %s.", + + "advancement.twilightforest.quest_ram": "Consumación de Baaahs", + "advancement.twilightforest.quest_ram.desc": "Dale al %s lo que le falta.", + + // Map + "advancement.twilightforest.magic_map_focus": "Con El Fuego Se Escribe", + "advancement.twilightforest.magic_map_focus.desc": "Elabora el %s con un %s, %s, y %s.", + "advancement.twilightforest.magic_map": "Puedo Ver Para Siempre", + "advancement.twilightforest.magic_map.desc": "Haz los %s.", + "advancement.twilightforest.maze_map": "Y Ahora, a Encontrar la Salida", + "advancement.twilightforest.maze_map.desc": "Elabora los %s después de obtener el foco del laberinto.", + "advancement.twilightforest.ore_map": "Cómo puede merecer la pena?", + "advancement.twilightforest.ore_map.desc": "Haz los %s.", + + // Mainline beginning progression + "advancement.twilightforest.twilight_hunter": "El Silencio del Bosque", + "advancement.twilightforest.twilight_hunter.desc": "Cazar algo de la fauna local.", + + "advancement.twilightforest.kill_naga": "Es Hora de Igualar la Balanza", + "advancement.twilightforest.kill_naga.desc": "Mata al %s en su patio del bosque y obtén un %s para superar la barrera mágica que rodea la torre del Lich.", + "advancement.twilightforest.naga_armors": "Armero Naga", + "advancement.twilightforest.naga_armors.desc": "Crea la armadura de pecho y de piernas de %s.", + + "advancement.twilightforest.kill_lich": "Trae a tus muertos", + "advancement.twilightforest.kill_lich.desc": "Mata a los % en lo alto de su torre y recupera un cetro para eliminar los mosquitos venenosos del Pantano, ver a través de la oscuridad cegadora de la maldición del Bosque Oscuro y resistir el frío del Bosque Nevado.", + "advancement.twilightforest.lich_scepters": "Por Nuestros Poderes Combinados!", + "advancement.twilightforest.lich_scepters.desc": "Consigue los cuatro cetros de poder.", + + // Swamp Progression + "advancement.twilightforest.progress_labyrinth": "El Poderoso Stroganoff", + "advancement.twilightforest.progress_labyrinth.desc": "El guiso de carne y hongos te calienta agradablemente, lo suficiente como para que sientas que estás lo suficientemente aclimatado como para aventurarte en el Pantano del Fuego.", + "advancement.twilightforest.kill_hydra": "Cazador de Hidras", + "advancement.twilightforest.kill_hydra.desc": "Derrota a los poderosos %s y empodérate.", + "advancement.twilightforest.mazebreaker": "Rompiendo el Laberinto", + "advancement.twilightforest.mazebreaker.desc": "Encuentra el pico %s en la bóveda secreta del laberinto.", + "advancement.twilightforest.hydra_chop": "Chuleta de Hidra, Baby!", + "advancement.twilightforest.hydra_chop.desc": "Disminuye el consumo de carne de %s hydra cuando la barra de comida esté vacía.", + + // Dark Forest Progression + "advancement.twilightforest.progress_trophy_pedestal": "Trofeo de Campeón", + "advancement.twilightforest.progress_trophy_pedestal.desc": "Reclama tu título colocando un trofeo en el pedestal de las ruinas del bosque oscuro.", + "advancement.twilightforest.progress_knights": "Aclimatación de Carminita", + "advancement.twilightforest.progress_knights.desc": "Acomoda a los inquietos fantasmas en la Tumba del Caballero y los dispositivos de la torre de carminita te obedecerán.", + "advancement.twilightforest.ghast_trap": "Algo extraño en la Torre de Madera", + "advancement.twilightforest.ghast_trap.desc": "Mata a los %s alrededor de un %s y actívalo para arrancar el %s del cielo!", + "advancement.twilightforest.progress_ur_ghast": "Lágrimas de Fuego", + "advancement.twilightforest.progress_ur_ghast.desc": "Toca las lágrimas rojas y ardientes de los %s.", + + "advancement.twilightforest.experiment_115": "Carne misteriosa?", + "advancement.twilightforest.experiment_115.desc": "Parece un pastel, aunque...", + "advancement.twilightforest.experiment_115_2": "Tomar nota: ¡Un gran éxito!", + "advancement.twilightforest.experiment_115_2.desc": "Es tan delicioso y húmedo!", + + // Snow Forest Progression + "advancement.twilightforest.progress_yeti": "Pelaje Alfa", + "advancement.twilightforest.progress_yeti.desc": "Cubre tus prendas con el suave pelaje de los %s, manteniéndote a salvo del frío del Glaciar.", + "advancement.twilightforest.progress_glacier": "Cielos Despejados", + "advancement.twilightforest.progress_glacier.desc": "Derrota a los %s encima de los %s.", + "advancement.twilightforest.arctic_dyed": "Ponerse a la Moda", + "advancement.twilightforest.arctic_dyed.desc": "Tiñe las cuatro piezas de la Armadura Ártica.", + + // Mid-way Misc. Stuff + "advancement.twilightforest.glass_sword": "Una Maravilla De Un Solo Golpe", + "advancement.twilightforest.glass_sword.desc": "Espero que lo hayas aprovechado.", + + "advancement.twilightforest.fiery_set": "Galones de Sangre y Lágrimas", + "advancement.twilightforest.fiery_set.desc": "Empuña una herramienta o arma mientras tienes al menos una pieza de armadura de ardiente en tu inventario.", + + // Highlands + "advancement.twilightforest.progress_merge": "Enfrentamiento Final", + "advancement.twilightforest.progress_merge.desc": "Mata a los %s, %s y %s para eliminar la lluvia ácida y envalentonarte para las Tierras Altas.", + "advancement.twilightforest.troll": "Trolleamos un Poco", + "advancement.twilightforest.troll.desc": "Encuentra y mata a un %s.", + "advancement.twilightforest.beanstalk": "Jack y las Habichuelas", + "advancement.twilightforest.beanstalk.desc": "Consigue algunos %s en las cuevas de los trolls y úsalos en el suelo brillante bajo las nubes.", + "advancement.twilightforest.giants": "Estoy en las Nubes", + "advancement.twilightforest.giants.desc": "Mata a un %s en las nubes, recupera un %s, y vuelve a las cuevas de los trolls.", + "advancement.twilightforest.progress_troll": "Deseo Más Quemaduras", + "advancement.twilightforest.progress_troll.desc": "Encuentra los %s en las cuevas de los trolls, y podrás quemar las barreras de espinas.", + "advancement.twilightforest.progress_thorns": "Más Allá De Las Espinas [NYI]", + "advancement.twilightforest.progress_thorns.desc": "Pasa por las Tierras Espinosas y desbloquea la puerta del castillo.", + "advancement.twilightforest.progress_castle": "Wow Que Super Castillo!!! [NYI]", + "advancement.twilightforest.progress_castle.desc": "Qué podría haber en ese castillo?!?", + + // Collections + "advancement.twilightforest.twilight_dining": "Cenamos en el Eterno Atardecer", + "advancement.twilightforest.twilight_dining.desc": "Come toda la comida exclusiva de Twilight Forest.", + "advancement.twilightforest.experiment_115_3": "Comer 115 cada día, 115 años, para siempre", + "advancement.twilightforest.experiment_115_3.desc": "comer experimento ciento quince durante todo el día, para siempre, ciento quince veces experimento ciento quince, experimento ciento quince punto com, doble-u doble-u punto experimento ciento quince punto com, ciento quince años, cada minuto experimento ciento quince punto com, doble-u doble-u punto ciento quince punto com", + "advancement.twilightforest.arborist": "Dendrologista Maníaco", + "advancement.twilightforest.arborist.desc": "Prepara tus hachas y tijeras. Busca en todos los rincones y consigue todo lo que provenga de los árboles. Construye, saquea y obtén cada tabla... árbol joven... hojas... más... todo. ¡TODO!", + + "twilightforest.twilight_portal.unsafe": "No parece seguro aquí...", + "twilightforest.trophy_pedestal.ineligible": "No eres digno.", + "twilightforest.ore_meter.range": "Radio: %s, Origen: [%s, %s]", + "twilightforest.ore_meter.exposed": "Expuesto: %s", + "twilightforest.scepter_charges": "Quedan %d cargas", + + // Commands + "commands.tffeature.usage": "/tffeature ", + "commands.tffeature.not_in_twilight_forest": "You are not in the Twilight Forest dimension", + "commands.tffeature.nearest": "The nearest feature is %s", + "commands.tffeature.center": "Center of feature: %s", + "commands.tffeature.chunk": "Are in feature chunk: %s", + "commands.tffeature.structure.inside": "You are in the structure for that feature", + "commands.tffeature.structure.outside": "You are not in the structure for that feature", + "commands.tffeature.structure.required": "You are not in a structure", + "commands.tffeature.structure.conquer.status": "Structure conquer flag: %s", + "commands.tffeature.structure.conquer.update": "Structure conquer flag was %s, changing to %s", + "commands.tffeature.locate.usage": "/tffeature locate ", + "commands.tfreload.reload": "Reloading Twilight Forest Shaders!", + + // Biomes + "biome.twilightforest.forest": "Bosque Crepuscular", + "biome.twilightforest.dense_forest": "Bosque Denso", + "biome.twilightforest.firefly_forest": "Bosque de las Luciérnagas", + "biome.twilightforest.clearing": "Despeje Crepuscular", + "biome.twilightforest.oak_savannah": "Sabana de Roble", + "biome.twilightforest.stream": "Corriente Crepuscular", + "biome.twilightforest.lake": "Lago Crepuscular", + "biome.twilightforest.mushroom_forest": "Bosque de Hongos", + "biome.twilightforest.dense_mushroom_forest": "Bosque Denso de Hongos", + "biome.twilightforest.enchanted_forest": "Bosque Encantado", + "biome.twilightforest.spooky_forest": "Bosque Espeluznante", + "biome.twilightforest.swamp": "TPantano Crepuscular", + "biome.twilightforest.fire_swamp": "Pantano de Fuego", + "biome.twilightforest.dark_forest": "Bosque Oscuro", + "biome.twilightforest.dark_forest_center": "Centro del Bosque Oscuro", + "biome.twilightforest.snowy_forest": "Bosque Nevado", + "biome.twilightforest.glacier": "Glaciar Crepuscular", + "biome.twilightforest.highlands": "Tierras Altas Crepusculares", + "biome.twilightforest.thornlands": "Tierras Espinosas", + "biome.twilightforest.final_plateau": "Meseta Final", + + // Gamerules + "gamerule.tfEnforcedProgression": "Progresión de Twilight Forest", + + // Enchantments + "enchantment.twilightforest.fire_react": "Reacción al Fuego", + "enchantment.twilightforest.chill_aura": "Aura fría", + + // Effects + "effect.twilightforest.frosted": "Escarchado", + + // Blocks + "block.twilightforest.twilight_oak_log": "Tronco de Roble Crepuscular", + "block.twilightforest.canopy_log": "Tronco de Dosel Arbóreo", + "block.twilightforest.mangrove_log": "Tronco de Manglar", + "block.twilightforest.dark_log": "Tronco de Madera Oscura", + "block.twilightforest.stripped_twilight_oak_log": "Tronco de Roble Crepuscular Sin Corteza", + "block.twilightforest.stripped_canopy_log": "Tronco de Dosel Arbóreo Sin Corteza", + "block.twilightforest.stripped_mangrove_log": "Tronco de Manglar Sin Corteza", + "block.twilightforest.stripped_dark_log": "Tronco de Madera Oscura Sin Corteza", + "block.twilightforest.twilight_oak_wood": "Madera de Roble Crepuscular", + "block.twilightforest.canopy_wood": "Madera de Dosel Arbóreo", + "block.twilightforest.mangrove_wood": "Madera de Manglar", + "block.twilightforest.dark_wood": "Madera Oscura", + "block.twilightforest.stripped_twilight_oak_wood": "Madera de Roble Crepuscular Sin Corteza", + "block.twilightforest.stripped_canopy_wood": "Madera de Dosel Arbóreo Sin Corteza", + "block.twilightforest.stripped_mangrove_wood": " Madera de Manglar Despojada", + "block.twilightforest.stripped_dark_wood": " Madera oscura despojada", + "block.twilightforest.twilight_oak_leaves": "Hojas de Roble Crepuscular", + "block.twilightforest.canopy_leaves": "Hojas de Dosel Arbóreo", + "block.twilightforest.mangrove_leaves": "Hojas de Manglar", + "block.twilightforest.rainboak_leaves": "Hojas de Roble Arco Iris", + "block.twilightforest.firefly": "Luciérnaga", + "block.twilightforest.cicada": "Cigarra", + "block.twilightforest.cicada.desc": "Y si esto se pudiera lanzar contra alguien con un cañón de riel...?", + "block.twilightforest.twilight_portal": "Portal de Twilight Forest", + "block.twilightforest.maze_stone": "Piedra de Laberinto", + "block.twilightforest.maze_stone_brick": "Ladrillos de Piedra de Laberinto", + "block.twilightforest.maze_stone_chiseled": "Piedra de Laberinto Grabados", + "block.twilightforest.maze_stone_decorative": "Ladrillos de Piedra de Laberinto Decorativo", + "block.twilightforest.maze_stone_cracked": "Piedra de Laberinto Agrietada", + "block.twilightforest.maze_stone_mossy": "Piedra de Laberinto Musgosa", + "block.twilightforest.maze_stone_mosaic": "Mosaicos de Piedra del Laberinto", + "block.twilightforest.maze_stone_border": "Borde de Piedra de Laberinto", + "block.twilightforest.maze_stone_ceiling": "Techo de Piedra de Laberinto", + "block.twilightforest.spiral_bricks": "Ladrillos en Espiral", + "block.twilightforest.hedge": "Cobertura", + "block.twilightforest.boss_spawner_naga": "Generador de Jefe Naga", + "block.twilightforest.boss_spawner_lich": "Generador de Jefe Lich", + "block.twilightforest.boss_spawner_minoshroom": "Generador de Jefe Minosetauro", + "block.twilightforest.boss_spawner_hydra": "Generador de Jefe Hidra", + "block.twilightforest.boss_spawner_knight_phantom": "Generador de Jefe Caballero Fantasma", + "block.twilightforest.boss_spawner_ur_ghast": "Genrador de Jefe Ur-Ghast", + "block.twilightforest.boss_spawner_alpha_yeti": "Generador de Jefe Yeti", + "block.twilightforest.boss_spawner_snow_queen": "Generador de Jefe Reina de las Nieves", + "block.twilightforest.boss_spawner_final_boss": "Generador de Jefe Final", + "block.twilightforest.firefly_jar": "Jarra con Luciérnaga", + "block.twilightforest.cicada_jar": "Jarra con Cigarra", + "block.twilightforest.moss_patch": "Parche de Musgo [WIP]", + "block.twilightforest.mayapple": "Mayapple", + "block.twilightforest.clover_patch": "Hoja de Trébol [NYI]", + "block.twilightforest.fiddlehead": "Brotes de Helecho", + "block.twilightforest.mushgloom": "Hongo Brillante", + "block.twilightforest.torchberry_plant": "Planta de Antorcha", + "block.twilightforest.root_strand": "Hilos de raíz", + "block.twilightforest.fallen_leaves": "Montón de hojas", + "block.twilightforest.root": "Raíces", + "block.twilightforest.liveroot_block": "Raíces vivas", + "block.twilightforest.uncrafting_table": "Mesa de Desfabricación", + "block.twilightforest.smoker": "Ahumador", + "block.twilightforest.encased_smoker": "Ahumador Encapsulado", + "block.twilightforest.fire_jet": "Chorro de Fuego", + "block.twilightforest.encased_fire_jet": "Chorro de Fuego Encapsulado", + "block.twilightforest.naga_stone_head": "Cabeza de Piedra de Naga", + "block.twilightforest.naga_stone": "Piedra de Naga", + "block.twilightforest.twilight_oak_sapling": "Retoño de Roble Crepuscular Enfermizo", + "block.twilightforest.canopy_sapling": "Retoño de Dosel Arbóreo", + "block.twilightforest.mangrove_sapling": "Retoño de Manglar Crepuscular", + "block.twilightforest.darkwood_sapling": "Retoño del Árbol de Madera Oscura", + "block.twilightforest.hollow_oak_sapling": "Retoño de Roble Robusto Crepuscular", + "block.twilightforest.time_sapling": "Retoño del Árbol del Tiempo", + "block.twilightforest.transformation_sapling": "Retoño del Árbol de Transformación", + "block.twilightforest.mining_sapling": "Retoño del Árbol Minero", + "block.twilightforest.sorting_sapling": "Retoño del Árbol de Clasificación", + "block.twilightforest.rainboak_sapling": "Retoño de Roble Arcoíris", + "block.twilightforest.moonworm": "Gusano Lunar", + "block.twilightforest.time_log": "Tronco del Árbol del Tiempo", + "block.twilightforest.transformation_log": "Tronco del Árbol de Transformación", + "block.twilightforest.mining_log": "Tronco del Árbol Minero", + "block.twilightforest.sorting_log": "Tronco del Árbol de Clasificación", + "block.twilightforest.stripped_time_log": "Tronco Sin Corteza del Árbol del Tiempo", + "block.twilightforest.stripped_transformation_log": "Tronco Sin Corteza del Árbol de Transformación", + "block.twilightforest.stripped_mining_log": "Tronco Sin Corteza del Árbol Minero", + "block.twilightforest.stripped_sorting_log": "Tronco Sin Corteza del Árbol de Clasificación", + "block.twilightforest.sorting_wood": "Madera del Árbol de Clasificación", + "block.twilightforest.mining_wood": "Madera del Árbol Minero", + "block.twilightforest.transformation_wood": "Madera del Árbol de Transformación", + "block.twilightforest.time_wood": "Madera del Árbol del Tiempo", + "block.twilightforest.stripped_sorting_wood": "Madera Pelada del Árbol de Clasificación", + "block.twilightforest.stripped_mining_wood": "Madera Pelada del Árbol Minero", + "block.twilightforest.stripped_transformation_wood": "Madera Pelada del Árbol de Transformación", + "block.twilightforest.stripped_time_wood": "Madera Pelada del Árbol del Tiempo", + "block.twilightforest.time_log_core": "Reloj del Árbol del Tiempo", + "block.twilightforest.transformation_log_core": "Corazón del Árbol de Transformación", + "block.twilightforest.mining_log_core": "Núcleo del Árbol Minero", + "block.twilightforest.sorting_log_core": "Motor del Árbol de Clasificación", + "block.twilightforest.time_leaves": "Hojas del Árbol del Tiempo", + "block.twilightforest.transformation_leaves": "Hojas del Árbol de Transformación", + "block.twilightforest.mining_leaves": "Hojas del Árbol Minero", + "block.twilightforest.sorting_leaves": "Hojas del Árbol de Clasificación", + "block.twilightforest.tower_wood": "Tablones de la Torre de Madera", + "block.twilightforest.tower_wood_encased": "Madera Encapsulada de la Torre de Madera", + "block.twilightforest.tower_wood_cracked": "Madera Agrietada de la Torre de Madera", + "block.twilightforest.tower_wood_mossy": "Madera Musgosa de la Torre de Madera", + "block.twilightforest.tower_wood_infested": "Madera Infestada de la Torre de Madera", + "block.twilightforest.reappearing_block": "Bloque Reaparecedor", + "block.twilightforest.vanishing_block": "Bloque de Desaparición", + "block.twilightforest.locked_vanishing_block": "Bloque de Desaparición Bloqueado", + "block.twilightforest.carminite_builder": "Constructor de Carminita", + "block.twilightforest.antibuilder": "Anti-Construcción", + "block.twilightforest.ghast_trap": "Trampa de Ghast", + "block.twilightforest.carminite_reactor": "Reactor de Carminita", + "block.twilightforest.fake_gold": "Oro Falso", + "block.twilightforest.fake_diamond": "Diamante Falso", + "block.twilightforest.trophy": "Trofeo de Twilight Forest", + "block.twilightforest.stronghold_shield": "Escudo de la Fortaleza", + "block.twilightforest.trophy_pedestal": "Pedestal para Trofeos", + "block.twilightforest.aurora_block": "Bloque de Aurora", + "block.twilightforest.underbrick": "Subsuelo de Ladrillos", + "block.twilightforest.underbrick_mossy": "Subsuelo de Ladrillos Musgoso", + "block.twilightforest.underbrick_cracked": "Subsuelo de Ladrillos Agrietado", + "block.twilightforest.underbrick_floor": "Piso de Subsuelo de Ladrillos [NYI]", + "block.twilightforest.brown_thorns": "Espinas", + "block.twilightforest.green_thorns": "Espinas Verdes", + "block.twilightforest.burnt_thorns": "Espinas Quemadas", + "block.twilightforest.thorn_rose": "Rosa Espinosa", + "block.twilightforest.thorn_leaves": "Hojas de Espinas", + "block.twilightforest.beanstalk_leaves": "Hojas de Frijol", + "block.twilightforest.deadrock_weathered": "Roca Muerta Desgastada", + "block.twilightforest.deadrock_cracked": "Roca Muerta Agrietada", + "block.twilightforest.deadrock": "Roca Muerta", + "block.twilightforest.dark_leaves": "Hojas de Madera Oscura", + "block.twilightforest.auroralized_glass": "Vidrio Auroralizado [NYI]", + "block.twilightforest.aurora_pillar": "Pilar de Aurora", + "block.twilightforest.aurora_slab": "Losa de Aurora", + "block.twilightforest.trollsteinn": "Trollsteinn", + "block.twilightforest.wispy_cloud": "Nube de Agua", + "block.twilightforest.fluffy_cloud": "Nube Esponjosa", + "block.twilightforest.giant_cobblestone": "Piedra Labrada Gigante", + "block.twilightforest.giant_log": "Tronco Gigante", + "block.twilightforest.giant_leaves": "Hojas Gigantes", + "block.twilightforest.giant_obsidian": "Obsidiana Gigante", + "block.twilightforest.uberous_soil": "Tierra Uberous", + "block.twilightforest.huge_stalk": "Tallos Enormes", + "block.twilightforest.huge_mushgloom": "Enorme Hongo Brillante", + "block.twilightforest.huge_mushgloom_stem": "Enorme Tallo de Hongo Brillante", + "block.twilightforest.trollvidr": "Trollvidr", + "block.twilightforest.unripe_trollber": "Trollber Sin madurar", + "block.twilightforest.trollber": "Trollber", + "block.twilightforest.slider": "Trampa Deslizante [NYI]", + "block.twilightforest.knightmetal_block": "Bloque Hecho del Caballero de Metal", + "block.twilightforest.huge_lilypad": "Enorme Almohadilla de Lirio", + "block.twilightforest.huge_waterlily": "Enorme Lirio de Agua", + "block.twilightforest.castle_brick": "Ladrillos del Castillo", + "block.twilightforest.castle_brick_worn": "Ladrillos Desgastados del Castillo", + "block.twilightforest.castle_brick_cracked": "Ladrillos Agrietados del Castillo", + "block.twilightforest.castle_brick_roof": "Azulejo del Techo del Castillo", + "block.twilightforest.castle_brick_mossy": "Ladrillos Musgosos del Castillo", + "block.twilightforest.castle_brick_frame": "Ladrillos Gruesos del Castillo", + "block.twilightforest.castle_stairs_brick": "Escaleras de Ladrillo del Castillo", + "block.twilightforest.castle_stairs_worn": "Escaleras Desgastadas de Ladrillo del Castillo", + "block.twilightforest.castle_stairs_cracked": "Escaleras Agrietadas de Ladrillo del Castillo", + "block.twilightforest.castle_stairs_mossy": "Escaleras Musgosas de Ladrillo del Castillo", + "block.twilightforest.castle_door_yellow": "Puerta Amarilla del Castillo", + "block.twilightforest.castle_door_purple": "Puerta Violeta del Castillo", + "block.twilightforest.castle_door_pink": "Puerta Rosada del Castillo", + "block.twilightforest.castle_door_blue": "Puerta Azul del Castillo", + "block.twilightforest.castle_rune_brick_pink": "Ladrillo Rúnico Rosa del Castillo ", + "block.twilightforest.castle_rune_brick_blue": "Ladrillo Rúnico Azul del Castillo", + "block.twilightforest.castle_rune_brick_yellow": "Ladrillo Rúnico Amarillo del Castillo", + "block.twilightforest.castle_rune_brick_purple": "Ladrillo Rúnico Morado del Castillo", + "block.twilightforest.castle_pillar_encased": "Pilar Encapsulado de Ladrillo del Castillo ", + "block.twilightforest.castle_pillar_encased_tile": "Azulejo Encapsulado de Ladrillos del Castillo ", + "block.twilightforest.castle_pillar_bold": "Pilar Audaz de Ladrillos del Castillo", + "block.twilightforest.castle_pillar_bold_tile": "Azulejo Audaz de Ladrillo del Castillo ", + "block.twilightforest.castle_stairs_encased": "Escaleras Encapsuladas de Ladrillo del Castillo", + "block.twilightforest.castle_stairs_bold": "Escaleras Audaces de Ladrillo del Castillo", + "block.twilightforest.force_field_purple": "Campo de Fuerza Violeta", + "block.twilightforest.force_field_pink": "Campo de Fuerza Rosa", + "block.twilightforest.force_field_orange": "Campo de Fuerza Naranja", + "block.twilightforest.force_field_green": "Campo de Fuerza Verde", + "block.twilightforest.force_field_blue": "Campo de Fuerza Azul", + "block.twilightforest.ironwood_block": "Bloque de Madera de Hierro", + "block.twilightforest.fiery_block": "Bloque de Metal Ardiente", + "block.twilightforest.steeleaf_block": "Bloque de Hoja de Acero", + "block.twilightforest.arctic_fur_block": "Bloque de Pelaje Ártico", + "block.twilightforest.carminite_block": "Bloque de Carminita", + "block.twilightforest.cinder_furnace": "Horno de Ceniza [NYI]", + "block.twilightforest.cinder_log": "Tronco de Ceniza [NYI]", + "block.twilightforest.cinder_wood": "Madera de Ceniza [NYI]", + "block.twilightforest.twilight_portal_miniature_structure": "Portal Miniatura de Twilight [NYI]", + "block.twilightforest.naga_courtyard_miniature_structure": "Patio Naga Miniatura [NYI]", + "block.twilightforest.lich_tower_miniature_structure": "Torre del Lich Miniatura [NYI]", + "block.twilightforest.stone_twist": "Piedra Torcida [NYI]", + "block.twilightforest.stone_twist_thin": "Pilar de Piedra [NYI]", + "block.twilightforest.lapis_block": "Bloque de Lapislázuli [NYI]", + "block.twilightforest.etched_nagastone": "Piedra Naga Grabada", + "block.twilightforest.nagastone_pillar": "Pilar de Piedra Naga", + "block.twilightforest.nagastone_stairs_left": "Escaleras de Piedra Naga (Izquierda)", + "block.twilightforest.nagastone_stairs_right": "Escaleras de Piedra Naga (Derecha)", + "block.twilightforest.etched_nagastone_mossy": "Piedra Naga con Grabado Musgoso", + "block.twilightforest.nagastone_pillar_mossy": "Pilar de Piedra Naga Musgosa", + "block.twilightforest.nagastone_stairs_mossy_left": "Escaleras Musgosa de Piedra Naga (Izquierda)", + "block.twilightforest.nagastone_stairs_mossy_right": "Escaleras Musgosa de Piedra Naga (Derecha)", + "block.twilightforest.etched_nagastone_weathered": "Piedra Naga Grabada en Ruinas", + "block.twilightforest.nagastone_pillar_weathered": "Pilar de Piedra Naga en Ruinas", + "block.twilightforest.nagastone_stairs_weathered_left": "Escaleras de Piedra de Naga desgastadas (Izquierda)", + "block.twilightforest.nagastone_stairs_weathered_right": "Escaleras de Piedra de Naga desgastadas (Derecha)", + "block.twilightforest.iron_ladder": "Escalera de Hierro", + "block.twilightforest.terrorcotta_circle": "Terracota (Circular)", + "block.twilightforest.terrorcotta_diagonal": "Terracota (Diagonal)", + "block.twilightforest.experiment_115": "Experimento 115", + "block.twilightforest.hydra_trophy": "Trofeo de Hidra", + "block.twilightforest.naga_trophy": "Trofeo de Naga", + "block.twilightforest.minoshroom_trophy": "Trofeo de Minosetauro", + "block.twilightforest.knight_phantom_trophy": "Trofeo de Caballero Fantasma", + "block.twilightforest.lich_trophy": "Trofeo de Lich", + "block.twilightforest.ur_ghast_trophy": "Trofeo de Ur-Ghast", + "block.twilightforest.yeti_trophy": "Trofeo de Yeti Alfa", + "block.twilightforest.snow_queen_trophy": "Trofeo de Reina de las Nieves", + "block.twilightforest.quest_ram_trophy": "Trofeo del Carnero de la Búsqueda", + + "block.twilightforest.keepsake_casket": "Ataúd del recuerdo [WIP]", + "block.twilightforest.casket.broken": "Tu Ataúd está demasiado dañado para contener más objetos. Todos los artículos que se guardaron en tu ataúd se cayeron al suelo..", + "block.twilightforest.casket.locked": "¡Este Ataúd sólo puede ser abierto por %s!", + + "block.twilightforest.potted_twilight_oak_sapling": "Retoño del Árbol de Roble Crepuscular en Maceta", + "block.twilightforest.potted_canopy_sapling": "Retoño de Dosel Arbóreo en Maceta", + "block.twilightforest.potted_mangrove_sapling": "Retoño de Manglar Crepuscular en Maceta", + "block.twilightforest.potted_darkwood_sapling": "Retoño del Árbol de Madera Oscura en Maceta", + "block.twilightforest.potted_hollow_oak_sapling": "Retoño de Roble Robusto Crepuscular en Maceta", + "block.twilightforest.potted_rainboak_sapling": "Retoño del Árbol de Roble Arcoíris en Maceta", + "block.twilightforest.potted_time_sapling": "Retoño del Árbol del Tiempo en Maceta", + "block.twilightforest.potted_trans_sapling": "Retoño del Árbol de la Transformación en Maceta", + "block.twilightforest.potted_mine_sapling": "Retoño del Árbol Minero en Maceta", + "block.twilightforest.potted_sort_sapling": "Retoño del Árbol de la Clasificación en Maceta", + "block.twilightforest.potted_mayapple": "Mayapple en Maceta", + "block.twilightforest.potted_fiddlehead": "Brotes de Helecho en Maceta", + "block.twilightforest.potted_mushgloom": "Hongo Brillante en Maceta", + "block.twilightforest.potted_thorn": "Espinas en Maceta", + "block.twilightforest.potted_green_thorn": "Espinas Verdes en Maceta", + "block.twilightforest.potted_dead_thorn": "Espinas Quemadas en Maceta", + + "block.twilightforest.canopy_planks": "Tablones de Dosel Arbóreo", + "block.twilightforest.canopy_stairs": "Esquelaras de Dosel Arbóreo", + "block.twilightforest.canopy_slab": "Losa de Dosel Arbóreo", + "block.twilightforest.canopy_button": "Botón de Dosel Arbóreo", + "block.twilightforest.canopy_fence": "Valla de Dosel Arbóreo", + "block.twilightforest.canopy_gate": "Puerta de Dosel Arbóreo", + "block.twilightforest.canopy_plate": "Placa de Presión de Dosel Arbóreo", + "block.twilightforest.canopy_trapdoor": "Trampilla de Dosel Arbóreo", + "block.twilightforest.canopy_door": "Puerta de Dosel Arbóreo", + "block.twilightforest.canopy_sign": "Letrero de Dosel Arbóreo", + "block.twilightforest.canopy_wall_sign": "Cuadro de Dosel Arbóreo", + + "block.twilightforest.dark_planks": "Tablones de Madera Oscura", + "block.twilightforest.dark_stairs": "Esquelaras de Madera Oscura", + "block.twilightforest.dark_slab": "Losa de Madera Oscura", + "block.twilightforest.dark_button": "Botón de Madera Oscura", + "block.twilightforest.dark_fence": "Valla de Madera Oscura", + "block.twilightforest.dark_gate": "Puerta de Valla de Madera Oscura", + "block.twilightforest.dark_plate": "Placa de Presión de Madera Oscura", + "block.twilightforest.dark_trapdoor": "Trampilla de Madera Oscura", + "block.twilightforest.dark_door": "Puerta de Madera Oscura", + "block.twilightforest.darkwood_sign": "Letrero de Madera Oscura", + "block.twilightforest.darkwood_wall_sign": "Cuadro de Madera Oscura", + + "block.twilightforest.mangrove_planks": "Tablones de Manglar", + "block.twilightforest.mangrove_stairs": "Esquelaras de Manglar", + "block.twilightforest.mangrove_slab": "Losa de Manglar", + "block.twilightforest.mangrove_button": "Botón de Manglar", + "block.twilightforest.mangrove_fence": "Valla de Manglar", + "block.twilightforest.mangrove_gate": "Puerta de Valla de Manglar", + "block.twilightforest.mangrove_plate": "Placa de Presión de Manglar", + "block.twilightforest.mangrove_trapdoor": "Trampilla de Manglar", + "block.twilightforest.mangrove_door": "Puerta de Manglar", + "block.twilightforest.mangrove_sign": "Letrero de Manglar", + "block.twilightforest.mangrove_wall_sign": "Cuadro de Manglar", + + "block.twilightforest.twilight_oak_planks": "Tablones de Roble Crepuscular", + "block.twilightforest.twilight_oak_stairs": "Esquelaras de Roble Crepuscular", + "block.twilightforest.twilight_oak_slab": "Losa de Roble Crepuscular", + "block.twilightforest.twilight_oak_button": "Botón de Roble Crepuscular", + "block.twilightforest.twilight_oak_fence": "Valla de Roble Crepuscular", + "block.twilightforest.twilight_oak_gate": "Puerta de Valla de Roble Crepuscular", + "block.twilightforest.twilight_oak_plate": "Placa de Presión de Roble Crepuscular", + "block.twilightforest.twilight_oak_trapdoor": "Trampilla de Roble Crepuscular", + "block.twilightforest.twilight_oak_door": "Puerta de Roble Crepuscular", + "block.twilightforest.twilight_oak_sign": "Letrero de Roble Crepuscular", + "block.twilightforest.twilight_wall_sign": "Cuadro de Roble Crepuscular", + + "block.twilightforest.time_planks": "Tablones del Árbol del Tiempo", + "block.twilightforest.time_stairs": "Esquelaras del Árbol del Tiempo", + "block.twilightforest.time_slab": "Losa del Árbol del Tiempo", + "block.twilightforest.time_button": "Botón del Árbol del Tiempo", + "block.twilightforest.time_fence": "Valla del Árbol del Tiempo", + "block.twilightforest.time_gate": "Puerta de Valla del Árbol del Tiempo", + "block.twilightforest.time_plate": "Placa de Presión del Árbol del Tiempo", + "block.twilightforest.time_trapdoor": "Trampilla del Árbol del Tiempo", + "block.twilightforest.time_door": "Puerta del Árbol del Tiempo", + "block.twilightforest.time_sign": "Letrero del Árbol del Tiempo", + "block.twilightforest.time_wall_sign": "Cuadro del Árbol del Tiempo", + + "block.twilightforest.trans_planks": "Tablones del Árbol de Transformación", + "block.twilightforest.trans_stairs": "Esquelaras del Árbol de Transformación", + "block.twilightforest.trans_slab": "Losa del Árbol de Transformación", + "block.twilightforest.trans_button": "Botón del Árbol de Transformación", + "block.twilightforest.trans_fence": "Valla del Árbol de Transformación", + "block.twilightforest.trans_gate": "Puerta de Valla del Árbol de Transformación", + "block.twilightforest.trans_plate": "Placa de Presión del Árbol de Transformación", + "block.twilightforest.trans_trapdoor": "Trampilla del Árbol de Transformación", + "block.twilightforest.trans_door": "Puerta del Árbol de Transformación", + "block.twilightforest.trans_sign": "Letrero del Árbol de Transformación", + "block.twilightforest.trans_wall_sign": "Cuadro del Árbol de Transformación", + + "block.twilightforest.mine_planks": "Tablones del Árbol Minero", + "block.twilightforest.mine_stairs": "Esquelaras del Árbol Minero", + "block.twilightforest.mine_slab": "Losa del Árbol Minero", + "block.twilightforest.mine_button": "Botón del Árbol Minero", + "block.twilightforest.mine_fence": "Valla del Árbol Minero", + "block.twilightforest.mine_gate": "Puerta de Valla del Árbol Minero", + "block.twilightforest.mine_plate": "Placa de Presión del Árbol Minero", + "block.twilightforest.mine_trapdoor": "Trampilla del Árbol Minero", + "block.twilightforest.mine_door": "Puerta del Árbol Minero", + "block.twilightforest.mine_sign": "Letrero del Árbol Minero", + "block.twilightforest.mine_wall_sign": "Cuadro del Árbol Minero", + + "block.twilightforest.sort_planks": "Tablones del Árbol de Clasificación", + "block.twilightforest.sort_stairs": "Esquelaras del Árbol de Clasificación", + "block.twilightforest.sort_slab": "Losa del Árbol de Clasificación", + "block.twilightforest.sort_button": "Botón del Árbol de Clasificación", + "block.twilightforest.sort_fence": "Valla del Árbol de Clasificación", + "block.twilightforest.sort_gate": "Puerta de Valla del Árbol de Clasificación", + "block.twilightforest.sort_plate": "Placa de Presión del Árbol de Clasificación", + "block.twilightforest.sort_trapdoor": "Trampilla del Árbol de Clasificación", + "block.twilightforest.sort_door": "Puerta del Árbol de Clasificación", + "block.twilightforest.sort_sign": "Letrero del Árbol de Clasificación", + "block.twilightforest.sort_wall_sign": "Cuadro del Árbol de Clasificación", + + "block.steeleaf.tooltip": "Reduce el daño por caída en un 25%.", + "block.arctic.tooltip": "Reduce el daño por caída en un 90%", + "block.knightmetal.tooltip": "Funciona como un cactus más fuerte", + + // Structures + "structure.twilight_portal": "Portal de Twilight", + "structure.hedge_maze": "Laberinto de Setos", + "structure.hollow_hill": "Colina Hueca", + "structure.quest_grove": "Búsqueda de la Arboleda", + "structure.mushroom_tower": "Castillo de los Hongos", + "structure.naga_courtyard": "Patio Naga", + "structure.lich_tower": "Torre del Lich", + "structure.minotaur_labyrinth": "Laberinto del Minotauro", + "structure.hydra_lair": "Guarida de la Hidra", + "structure.goblin_stronghold": "Fortaleza de los Goblins", + "structure.dark_tower": "La Torre Oscura", + "structure.yeti_cave": "Cueva del Yeti", + "structure.aurora_palace": "Palacio Aurora", + "structure.troll_cave_and_cloud_castle": "Cueva de los Trolls y Casa en las Nubes", + "structure.final_castle": "Castillo Final", + + // Items + "item.twilightforest.boarkchop": "Chuleta de Boark", + "item.twilightforest.naga_scale": "Escama Naga", + "item.twilightforest.naga_chestplate": "Tunica de Escama Naga", + "item.twilightforest.naga_leggings": "Mallas de Escama Naga", + "item.twilightforest.twilight_scepter": "Cetro Crepuscular", + "item.twilightforest.lifedrain_scepter": "Cetro de Robo de Vida", + "item.twilightforest.zombie_scepter": "Cetro Zombie", + "item.twilightforest.shield_scepter": "Cetro de Fortificación", + "item.twilightforest.ore_meter": "Medidor de Minerales [NYI]", + "item.twilightforest.magic_map": "Mapa Mágico", + "item.twilightforest.maze_map": "Mapa del Laberinto", + "item.twilightforest.ore_map": "Mapa de Laberinto/Mineral", + "item.twilightforest.raven_feather": "Pluma de Cuervo", + "item.twilightforest.magic_map_focus": "Enfoque del Mapa Mágico", + "item.twilightforest.maze_map_focus": "Enfoque del Mapa del Laberinto", + "item.twilightforest.liveroot": "Raíces Vivas", + "item.twilightforest.ironwood_raw": "Materiales de Madera de Hierro en Bruto", + "item.twilightforest.ironwood_ingot": "Lingote de Madera de Hierro", + "item.twilightforest.ironwood_helmet": "Casco de Madera de Hierro", + "item.twilightforest.ironwood_chestplate": "Pechera de Madera de Hierro", + "item.twilightforest.ironwood_leggings": "Pantalones de Madera de Hierro", + "item.twilightforest.ironwood_boots": "Botas de Madera de Hierro", + "item.twilightforest.ironwood_sword": "Espada de Madera de Hierro", + "item.twilightforest.ironwood_shovel": "Pala de Madera de Hierro", + "item.twilightforest.ironwood_pickaxe": "Pico de Madera de Hierro", + "item.twilightforest.ironwood_axe": "Hacha de Madera de Hierro", + "item.twilightforest.ironwood_hoe": "Azada de Madera de Hierro", + "item.twilightforest.torchberries": "Bayas de Antorcha", + "item.twilightforest.raw_venison": "Venado Crudo", + "item.twilightforest.cooked_venison": "Filete de Venado", + "item.twilightforest.hydra_chop": "Chuleta de Hidra", + "item.twilightforest.fiery_blood": "Sangre Ardiente", + "item.twilightforest.fiery_ingot": "Lingote Ardiente", + "item.twilightforest.fiery_helmet": "Casco Ardiente", + "item.twilightforest.fiery_chestplate": "Pechera Ardiente", + "item.twilightforest.fiery_leggings": "Pantalones Ardientes", + "item.twilightforest.fiery_boots": "Botas Ardientes", + "item.twilightforest.fiery_sword": "Espada Ardiente", + "item.twilightforest.fiery_pickaxe": "Pico Ardiente", + "item.twilightforest.steeleaf_ingot": "Hoja de Acero", + "item.twilightforest.steeleaf_helmet": "Casco de Hoja de Acero", + "item.twilightforest.steeleaf_chestplate": "Pechera de Hoja de Acero", + "item.twilightforest.steeleaf_leggings": "Pantalones de de Hoja de Acero", + "item.twilightforest.steeleaf_boots": "Botas de Hoja de Acero", + "item.twilightforest.steeleaf_sword": "Espeda de Hoja de Acero", + "item.twilightforest.steeleaf_shovel": "Pala de Hoja de Acero", + "item.twilightforest.steeleaf_pickaxe": "Pico de Hoja de Acero", + "item.twilightforest.steeleaf_axe": "Hacha de Hoja de Acero", + "item.twilightforest.steeleaf_hoe": "Azada de Hoja de Acero", + "item.twilightforest.minotaur_axe": "Hacha de Diamante del Minotauro", + "item.twilightforest.minotaur_axe_gold": "Hacha de Oro del Minotauro", + "item.twilightforest.mazebreaker_pickaxe": "Rompe Laberintos", + "item.twilightforest.transformation_powder": "Polvo de Transformación", + "item.twilightforest.raw_meef": "Carne Cruda", + "item.twilightforest.cooked_meef": "Bistec de Carne", + "item.twilightforest.meef_stroganoff": "Carne Stroganoff", + "item.twilightforest.maze_wafer": "Oblea de Laberinto", + "item.twilightforest.magic_map_empty": "Mapa Mágico en Blanco", + "item.twilightforest.maze_map_empty": "Mapa del Laberinto en Blanco", + "item.twilightforest.ore_map_empty": "Mapa de Laberinto/Minerales en Blanco", + "item.twilightforest.ore_magnet": "Imán de Minerales", + "item.twilightforest.crumble_horn": "Cuerno Desmenuzado", + "item.twilightforest.peacock_fan": "Abanico de Plumas de Pavo Real", + "item.twilightforest.moonworm_queen": "Reina Gusano Lunar", + "item.twilightforest.charm_of_life_1": "Talisman de Vida I", + "item.twilightforest.charm_of_life_2": "Talisman de Vida II", + "item.twilightforest.charm_of_keeping_1": "Talisman de conservación I", + "item.twilightforest.charm_of_keeping_2": "Talisman de conservación II", + "item.twilightforest.charm_of_keeping_3": "Talisman de conservación III", + "item.twilightforest.tower_key": "Llave de la Torre", + "item.twilightforest.borer_essence": "Esencia de Barrenador", + "item.twilightforest.carminite": "Carminita", + "item.twilightforest.tf_trophy": "%s Trofeo", + "item.twilightforest.armor_shard": "Fragmento de Armadura", + "item.twilightforest.knightmetal_ingot": "Lingote Hecho del Caballero de Metal", + "item.twilightforest.armor_shard_cluster": "Grupo de Fragmentos de Armadura", + "item.twilightforest.knightmetal_helmet": "Yelmo del Caballero de Metal", + "item.twilightforest.knightmetal_chestplate": "Pechera del Caballero de Metal", + "item.twilightforest.knightmetal_leggings": "Grebas del Caballero de Metal", + "item.twilightforest.knightmetal_boots": "Botas del Caballero de Metal", + "item.twilightforest.knightmetal_sword": "Espada del Caballero de Metal", + "item.twilightforest.knightmetal_pickaxe": "Pico del Caballero de Metal", + "item.twilightforest.knightmetal_axe": "Hacha del Caballero de Metal", + "item.twilightforest.knightmetal_shield": "Escudo del Caballero de Metal", + "item.twilightforest.phantom_helmet": "Casco de Fantasma", + "item.twilightforest.phantom_chestplate": "Pechera de Fantasma", + "item.twilightforest.lamp_of_cinders": "Lámpara de Cenizas", + "item.twilightforest.fiery_tears": "Lágrimas de Fuego", + "item.twilightforest.ice_bomb": "Bomba de Hielo", + "item.twilightforest.yeti_helmet": "Casco con Cuernos del Yeti", + "item.twilightforest.yeti_chestplate": "Chaqueta del Yeti", + "item.twilightforest.yeti_leggings": "Pantalones del Yeti", + "item.twilightforest.yeti_boots": "Botas del Yeti", + "item.twilightforest.alpha_fur": "Pelaje de Yeti Alfa", + "item.twilightforest.arctic_fur": "Pelaje del Ártico", + "item.twilightforest.arctic_helmet": "Capucha del Ártico", + "item.twilightforest.arctic_chestplate": "Chaqueta Ártica", + "item.twilightforest.arctic_leggings": "Pantalones del Ártico", + "item.twilightforest.arctic_boots": "Botas del Ártico", + "item.twilightforest.magic_beans": "Frijoles Mágicos", + "item.twilightforest.giant_pickaxe": "Pico del Gigante", + "item.twilightforest.giant_sword": "Espada del Gigante", + "item.twilightforest.triple_bow": "Arco triple", + "item.twilightforest.seeker_bow": "Arco Buscador", + "item.twilightforest.ice_bow": "Arco de hielo", + "item.twilightforest.ender_bow": "Arco de Ender", + "item.twilightforest.ice_sword": "Espada de Hielo", + "item.twilightforest.glass_sword": "Espada de Vidrio", + "item.twilightforest.knightmetal_ring": "Lazo de Caballero de Metal", + "item.twilightforest.block_and_chain": "Bloque y Cadena", + "item.twilightforest.cube_talisman": "Talismán del Cubo [NYI]", + "item.twilightforest.cube_of_annihilation": "Cubo de la Aniquilación [WIP]", + "item.twilightforest.moon_dial": "Dial lunar", + + "item.twilightforest.wild_boar_spawn_egg": "Generar Jabalí", + "item.twilightforest.bighorn_sheep_spawn_egg": "Generar de Oveja Cimarrón", + "item.twilightforest.deer_spawn_egg": "Generar Ciervo Salvaje", + "item.twilightforest.redcap_spawn_egg": "Generar Goblin del Gorro Rojo", + "item.twilightforest.swarm_spider_spawn_egg": "Generar Araña de Enjambre", + "item.twilightforest.naga_spawn_egg": "Generar Naga", + "item.twilightforest.skeleton_druid_spawn_egg": "Generar Druida Esqueleto", + "item.twilightforest.hostile_wolf_spawn_egg": "Generar Lobo Hostil", + "item.twilightforest.wraith_spawn_egg": "Generar Espectro Crepuscular", + "item.twilightforest.hedge_spider_spawn_egg": "Generar Araña del Seto", + "item.twilightforest.hydra_spawn_egg": "Generar Hidra", + "item.twilightforest.lich_spawn_egg": "Generar Twilight Lich ", + "item.twilightforest.penguin_spawn_egg": "Generar Pingüino", + "item.twilightforest.tiny_bird_spawn_egg": "Generar Pájaro Pequeño", + "item.twilightforest.squirrel_spawn_egg": "Generar Ardilla de Bosque", + "item.twilightforest.bunny_spawn_egg": "Generar Conejo del Bosque", + "item.twilightforest.raven_spawn_egg": "Generar Cuervo del Bosque", + "item.twilightforest.quest_ram_spawn_egg": "Generar Carnero de la Búsqueda", + "item.twilightforest.kobold_spawn_egg": "Generar Kobold", + "item.twilightforest.mosquito_swarm_spawn_egg": "Generar Enjambre de Mosquitos", + "item.twilightforest.death_tome_spawn_egg": "Generar Tomo de la Muerte", + "item.twilightforest.minotaur_spawn_egg": "Generar Minotauro", + "item.twilightforest.minoshroom_spawn_egg": "Generar Minosetauro", + "item.twilightforest.fire_beetle_spawn_egg": "Generar Escarabajo de Fuego", + "item.twilightforest.slime_beetle_spawn_egg": "Generar Escarabajo de Slime", + "item.twilightforest.pinch_beetle_spawn_egg": "Generar Escarabajo de Pinzas", + "item.twilightforest.maze_slime_spawn_egg": "Generar Slime de Laberinto", + "item.twilightforest.redcap_sapper_spawn_egg": "Generar Zapador de Gorro Rojo", + "item.twilightforest.mist_wolf_spawn_egg": "Generar Lobo de la Niebla", + "item.twilightforest.king_spider_spawn_egg": "Generar Rey Araña", + "item.twilightforest.mini_ghast_spawn_egg": "Generar Mini Ghast de Carminita", + "item.twilightforest.tower_ghast_spawn_egg": "Generar Guardia Ghast de Carminita", + "item.twilightforest.tower_golem_spawn_egg": "Generar Golem de Carminita", + "item.twilightforest.tower_termite_spawn_egg": "Generar Barrenador de la Torre de Madera", + "item.twilightforest.tower_broodling_spawn_egg": "Generar Araña Carminita", + "item.twilightforest.ur_ghast_spawn_egg": "Generar Ur-Ghast", + "item.twilightforest.blockchain_goblin_spawn_egg": "Generar Goblin de Bloques y Cadenas", + "item.twilightforest.goblin_knight_lower_spawn_egg": "Generar Caballero Goblin", + "item.twilightforest.helmet_crab_spawn_egg": "Generar Cangrejo con Casco", + "item.twilightforest.knight_phantom_spawn_egg": "Generar Caballero Fantasma", + "item.twilightforest.yeti_spawn_egg": "Generar Yeti", + "item.twilightforest.yeti_alpha_spawn_egg": "Generar Yeti Alfa", + "item.twilightforest.winter_wolf_spawn_egg": "Generar Lobo de Invierno", + "item.twilightforest.snow_guardian_spawn_egg": "Generar Guardián de Nieve", + "item.twilightforest.stable_ice_core_spawn_egg": "Generar Núcleo de Hielo Estable", + "item.twilightforest.unstable_ice_core_spawn_egg": "Generar Núcleo de Hielo Inestable", + "item.twilightforest.snow_queen_spawn_egg": "Generar Reina de las Nieves", + "item.twilightforest.troll_spawn_egg": "Generar Troll de las Cavernas", + "item.twilightforest.giant_miner_spawn_egg": "Generar Minero Gigante", + "item.twilightforest.armored_giant_spawn_egg": "Generar Gigante Armado", + "item.twilightforest.ice_crystal_spawn_egg": "Generar Cristal de Hielo", + "item.twilightforest.harbinger_cube_spawn_egg": "Generar Cubo de los Presagios [NYI]", + "item.twilightforest.adherent_spawn_egg": "Generar Adepto [NYI]", + "item.twilightforest.roving_cube_spawn_egg": "Generar Cubo Giratorio [NYI]", + + "item.twilightforest.guide": "Cuaderno de Bitácora del Viajero [WIP]", + + "item.twilightforest.minotaur_axe.tooltip": "Daño Extra Durante la Carga", + "item.twilightforest.minotaur_axe_gold.tooltip": "Daño Extra Durante la Carga", + "item.twilightforest.knightmetal_sword.tooltip": "Daño Extra a Objetivos Blindados", + "item.twilightforest.knightmetal_pickaxe.tooltip": "Daño Extra a Objetivos Blindados", + "item.twilightforest.knightmetal_axe.tooltip": "Daño Extra a Objetivos No Blindados", + "item.twilightforest.giant_pickaxe.tooltip": "Rompe bloques gigantes", + "item.twilightforest.fiery_pickaxe.tooltip": "Autofundición", + "item.twilightforest.fiery_sword.tooltip": "Quema al objetivo ", + "item.twilightforest.fiery_helmet.tooltip": "Quema a los atacante", + "item.twilightforest.fiery_chestplate.tooltip": "Quema a los atacante", + "item.twilightforest.fiery_leggings.tooltip": "Quema a los atacante", + "item.twilightforest.fiery_boots.tooltip": "Quema a los atacante", + "item.twilightforest.phantom_helmet.tooltip": "Nunca lo pierdes aunque mueras ", + "item.twilightforest.phantom_chestplate.tooltip": "Nunca lo pierdes aunque mueras ", + "item.twilightforest.yeti_helmet.tooltip": "Enfría a los atacantes", + "item.twilightforest.yeti_chestplate.tooltip": "Enfría a los atacantes", + "item.twilightforest.yeti_leggings.tooltip": "Enfría a los atacantes", + "item.twilightforest.yeti_boots.tooltip": "Enfría a los atacantes", + + "item.twilightforest.arctic_armor.tooltip": "Teñible como la armadura de cuero", + + // Entities + "entity.twilightforest.wild_boar": "Jabalí", + "entity.twilightforest.bighorn_sheep": "Oveja Cimarrón", + "entity.twilightforest.deer": "Ciervo salvaje", + "entity.twilightforest.redcap": "Goblin del Gorro Rojo", + "entity.twilightforest.swarm_spider": "Araña de Enjambre", + "entity.twilightforest.naga": "Naga", + "entity.twilightforest.naga_segment": "Segmento Naga", + "entity.twilightforest.skeleton_druid": "Druida Esqueleto", + "entity.twilightforest.hostile_wolf": "Lobo hostil", + "entity.twilightforest.wraith": "Espectro Crepuscular", + "entity.twilightforest.hedge_spider": "Araña del Seto", + "entity.twilightforest.hydra": "Hidra", + "entity.twilightforest.hydra_head": "Cabeza de Hidra", + "entity.twilightforest.lich": "Twilight Lich", + "entity.twilightforest.penguin": "Pingüino", + "entity.twilightforest.tiny_bird": "Pájaro Pequeño", + "entity.twilightforest.squirrel": "Ardilla del Bosque", + "entity.twilightforest.bunny": "Conejo Enano", + "entity.twilightforest.raven": "Cuervo del Bosque", + "entity.twilightforest.quest_ram": "Carnero de la Búsqueda", + "entity.twilightforest.kobold": "Kobold", + "entity.twilightforest.boggard": "Boggard [NYI]", + "entity.twilightforest.lich_minion": "Lich Minion", + "entity.twilightforest.loyal_zombie": "Zombi Leal", + "entity.twilightforest.mosquito_swarm": "Enjambre de Mosquitos", + "entity.twilightforest.death_tome": "Tomo de la Muerte", + "entity.twilightforest.minotaur": "Minotauro", + "entity.twilightforest.minoshroom": "Minosetauro", + "entity.twilightforest.fire_beetle": "Escarabajo de Fuego", + "entity.twilightforest.slime_beetle": "Escarabajo de Slime", + "entity.twilightforest.pinch_beetle": "Escarabajo de Pinzas", + "entity.twilightforest.maze_slime": "Slime de Laberinto", + "entity.twilightforest.redcap_sapper": "Zapador de Gorro Rojo", + "entity.twilightforest.mist_wolf": "Lobo de la Niebla", + "entity.twilightforest.king_spider": "Rey Araña", + "entity.twilightforest.firefly": "Luciérnaga", + "entity.twilightforest.mini_ghast": "Mini Ghast de Carminita", + "entity.twilightforest.tower_ghast": "Guardia Ghast de Carminita", + "entity.twilightforest.tower_golem": "Golem de Carminita", + "entity.twilightforest.tower_termite": "Barrenador de la Madera de la Torre", + "entity.twilightforest.tower_broodling": "Araña Carminita", + "entity.twilightforest.ur_ghast": "Ur-Ghast", + "entity.twilightforest.blockchain_goblin": "Generar Goblin de Bloques y Cadenas", + "entity.twilightforest.goblin_knight_upper": "Caballero Goblin Superior", + "entity.twilightforest.goblin_knight_lower": "Caballero Goblin Inferior", + "entity.twilightforest.helmet_crab": "Cangrejo con Casco", + "entity.twilightforest.knight_phantom": "Caballero Fantasma", + "entity.twilightforest.yeti": "Yeti", + "entity.twilightforest.yeti_alpha": "Yeti Alfa", + "entity.twilightforest.winter_wolf": "Lobo de Invierno", + "entity.twilightforest.snow_guardian": "Guardián de Nieve", + "entity.twilightforest.stable_ice_core": "Núcleo de Hielo Estable", + "entity.twilightforest.unstable_ice_core": "Núcleo de Hielo Inestable", + "entity.twilightforest.snow_queen": "Reina de las Nieves", + "entity.twilightforest.troll": "Troll de las Cavernas", + "entity.twilightforest.giant_miner": "Minero Gigante", + "entity.twilightforest.armored_giant": "Gigante Armado", + "entity.twilightforest.ice_crystal": "Cristal de Hielo", + "entity.twilightforest.rising_zombie": "Zombie", + "entity.twilightforest.harbinger_cube": "Cubo de los Presagios [NYI]", + "entity.twilightforest.adherent": "Adepto [NYI]", + "entity.twilightforest.castle_guardian": "Guardián del Castillo [NYI]", + "entity.twilightforest.roving_cube": "Cubo Giratorio [NYI]", + + "entity.twilightforest.ice_snowball": "Bola de Nieve de Hielo", + "entity.twilightforest.ice_arrow": "Flecha de Hielo", + "entity.twilightforest.seeker_arrow": "Flecha Buscadora", + "entity.twilightforest.cicada_shot": "Cigarra", + "entity.twilightforest.moonworm_shot": "Gusano Lunar", + "entity.twilightforest.nature_bolt": "Perno de la Naturaleza", + "entity.twilightforest.slime_blob": "Gota de Slime", + "entity.twilightforest.tome_bolt": " Perno del Tomo de la Muerte", + "entity.twilightforest.wand_bolt": "Perno de Cetro Crepuscular", + "entity.twilightforest.lich_bolt": "Perno del Lich", + "entity.twilightforest.lich_bomb": "Perno Explosivo del Lich", + "entity.twilightforest.hydra_mortar": "Mortero Hidra", + "entity.twilightforest.falling_ice": "Caída de hielo", + "entity.twilightforest.chain_block": "Bloque y Cadena", + "entity.twilightforest.thrown_wep": "Arma Arrojadiza", + "entity.twilightforest.charm_effect": "Efecto de Talisman", + "entity.twilightforest.cube_of_annihilation": "Cubo de la Aniquilación", + "entity.twilightforest.slider": "Trampa Deslizante en Movimiento", + "entity.twilightforest.protection_box": "Caja de Protección de la Progresión", + + // Subtitles + "subtitles.twilightforest.entity.alphayeti.alert": "Yeti Alfa se dirige al jugador", + "subtitles.twilightforest.entity.alphayeti.death": "Yeti Alfa muerto", + "subtitles.twilightforest.entity.alphayeti.grab": "Yeti Alfa agarra al jugador", + "subtitles.twilightforest.entity.alphayeti.growl": "Yeti Alfa gruñe", + "subtitles.twilightforest.entity.alphayeti.hurt": "Yeti Alfa herido", + "subtitles.twilightforest.entity.alphayeti.ice": "Yeti Alfa lanza hielo", + "subtitles.twilightforest.entity.alphayeti.pant": "Pantalones del Yeti Alfa ", + "subtitles.twilightforest.entity.alphayeti.roar": "Yeti Alfa ruge", + "subtitles.twilightforest.entity.alphayeti.throw": "Yeti Alfa tira con fuerza", + "subtitles.twilightforest.entity.bighorn.ambient": "Balido de Oveja Cimarrón", + "subtitles.twilightforest.entity.bighorn.death": "Oveja Cimarrón muerta", + "subtitles.twilightforest.entity.bighorn.hurt": "Oveja Cimarrón herida", + "subtitles.twilightforest.entity.blockchain.ambient": "Goblin de Bloques y Cadenas se ríe", + "subtitles.twilightforest.entity.blockchain.death": "Goblin de Bloques y Cadenas muerto", + "subtitles.twilightforest.entity.blockchain.hurt": "Goblin de Bloques y Cadenas grita", + "subtitles.twilightforest.entity.boar.ambient": "Gruñido de Jabalí", + "subtitles.twilightforest.entity.boar.death": "Jabalí muerto", + "subtitles.twilightforest.entity.boar.hurt": "Jabalí herido", + "subtitles.twilightforest.entity.broodling.ambient": "Siseo de Araña Carminita", + "subtitles.twilightforest.entity.broodling.death": "Araña Carminita muerta", + "subtitles.twilightforest.entity.broodling.hurt": "Araña Carminita herida", + "subtitles.twilightforest.entity.carminitegolem.attack": "Golem de Carminita ataca", + "subtitles.twilightforest.entity.carminitegolem.death": "Golem de Carminita muerto", + "subtitles.twilightforest.entity.carminitegolem.hurt": "Golem de Carminita herido", + "subtitles.twilightforest.entity.cicada": "Canto de Cigarra", + "subtitles.twilightforest.entity.deer.death": "Ciervo salvaje muerto", + "subtitles.twilightforest.entity.deer.hurt": "Ciervo salvaje herido", + "subtitles.twilightforest.entity.deer.idle": "Ciervo salvaje mugido", + "subtitles.twilightforest.entity.druid.ambient": "Cascabeles del Druida Esqueleto", + "subtitles.twilightforest.entity.druid.death": "Druida Esqueleto muerto", + "subtitles.twilightforest.entity.druid.hurt": "Druida Esqueleto herido", + "subtitles.twilightforest.entity.druid.shoot": "Druida Esqueleto dispara", + "subtitles.twilightforest.entity.firebeetle.ambient": "Siseo de Escarabajo de Fuego", + "subtitles.twilightforest.entity.firebeetle.death": "Escarabajo de Fuego muerto", + "subtitles.twilightforest.entity.firebeetle.hurt": "Escarabajo de Fuego herido", + "subtitles.twilightforest.entity.firebeetle.shoot": "Escarabajo de Fuego dispara", + "subtitles.twilightforest.entity.ghastguard.ambient": "Llanto de Guardia Ghast", + "subtitles.twilightforest.entity.ghastguard.death": "Guardia Ghast muerto", + "subtitles.twilightforest.entity.ghastguard.hurt": "Guardia Ghast herido", + "subtitles.twilightforest.entity.ghastling.ambient": "Llanto de Mini Ghast", + "subtitles.twilightforest.entity.ghastling.death": "Mini Ghast muerto", + "subtitles.twilightforest.entity.ghastling.hurt": "Mini Ghast herido", + "subtitles.twilightforest.entity.goblinknight.ambient": "Risas de Caballero Goblin", + "subtitles.twilightforest.entity.goblinknight.death": "Caballero Goblin gime de agonía", + "subtitles.twilightforest.entity.goblinknight.hurt": "Caballero Goblin chilla de dolor", + "subtitles.twilightforest.entity.goblinknight.muffled.ambient": "Caballero Goblin sofocada rie", + "subtitles.twilightforest.entity.goblinknight.muffled.death": "Caballero Goblin sofocado gime de agonía", + "subtitles.twilightforest.entity.goblinknight.muffled.hurt": "Caballero Goblin sofocado chilla de dolor", + "subtitles.twilightforest.entity.hedgespider.ambient": "Siseo de Araña del Seto", + "subtitles.twilightforest.entity.hedgespider.death": "Araña del Seto muerta", + "subtitles.twilightforest.entity.hedgespider.hurt": "Araña del Seto herida", + "subtitles.twilightforest.entity.helmetcrab.death": "Cangrejo con Casco muerto", + "subtitles.twilightforest.entity.helmetcrab.hurt": "Cangrejo con Casco herido", + "subtitles.twilightforest.entity.hostilewolf.death": "Lobo hostil muerto", + "subtitles.twilightforest.entity.hostilewolf.hurt": "Lobo hostil herido", + "subtitles.twilightforest.entity.hostilewolf.idle": "Lobo hostil gruñe", + "subtitles.twilightforest.entity.hostilewolf.target": "Lobo hostil apunta a la víctima", + "subtitles.twilightforest.entity.hydra.death": "Hidra muerto", + "subtitles.twilightforest.entity.hydra.growl": "Hidra gruñe", + "subtitles.twilightforest.entity.hydra.hurt": "Hidra herido", + "subtitles.twilightforest.entity.hydra.roar": "Hidra ruge", + "subtitles.twilightforest.entity.hydra.shoot": "Hidra lanza fuego", + "subtitles.twilightforest.entity.hydra.warn": "Hidra se prepara para morder", + "subtitles.twilightforest.entity.ice.death": "Núcleo de hielo muerto", + "subtitles.twilightforest.entity.ice.hurt": "Núcleo de hielo herido", + "subtitles.twilightforest.entity.ice.noise": "Crujidos del Núcleo de hielo", + "subtitles.twilightforest.entity.ice.shoot": "Núcleo de hielo dispara una bola de nieve", + "subtitles.twilightforest.entity.iceguardian.ambient": "Crujidos del Guardián de la nieve", + "subtitles.twilightforest.entity.iceguardian.death": "Guardián de la nieve muerto", + "subtitles.twilightforest.entity.iceguardian.hurt": "Guardián de la nieve herido", + "subtitles.twilightforest.entity.kingspider.ambient": "Siseo de Rey Araña", + "subtitles.twilightforest.entity.kingspider.death": "Rey Araña muerto", + "subtitles.twilightforest.entity.kingspider.hurt": "Rey Araña herido", + "subtitles.twilightforest.entity.kobold.ambient": "Gruñidos de Kobold", + "subtitles.twilightforest.entity.kobold.death": "Kobold muerto", + "subtitles.twilightforest.entity.kobold.hurt": "Kobold herido", + "subtitles.twilightforest.entity.lich.ambient": "Lich respira", + "subtitles.twilightforest.entity.lich.death": "Lich muerto", + "subtitles.twilightforest.entity.lich.hurt": "Lich herido", + "subtitles.twilightforest.entity.lich.shoot": "Lich dispara", + "subtitles.twilightforest.entity.lich.teleport": "Lich se teletransporta", + "subtitles.twilightforest.entity.lichclone.hurt": "Clon Lich se evapora", + "subtitles.twilightforest.entity.loyalzombie.ambient": "Zombi leal gruñidos", + "subtitles.twilightforest.entity.loyalzombie.death": "Zombi leal muerto", + "subtitles.twilightforest.entity.loyalzombie.hurt": "Zombi leal herido", + "subtitles.twilightforest.entity.mazeslime.death": "Slime de Laberinto muerto", + "subtitles.twilightforest.entity.mazeslime.hurt": "Slime de Laberinto herido", + "subtitles.twilightforest.entity.mazeslime.squish": "Slime de Laberinto saltando", + "subtitles.twilightforest.entity.minion.ambient": "Lich Minion gruñidos", + "subtitles.twilightforest.entity.minion.death": "Lich Minion muerto", + "subtitles.twilightforest.entity.minion.hurt": "Lich Minion herido", + "subtitles.twilightforest.entity.minion.summon": "Lich invoca a un nuevo Minion", + "subtitles.twilightforest.entity.minoshroom.ambient": "Mugido de Minosetauro", + "subtitles.twilightforest.entity.minoshroom.attack": "Carga de Minosetauro", + "subtitles.twilightforest.entity.minoshroom.death": "Minosetauro muerto", + "subtitles.twilightforest.entity.minoshroom.hurt": "Minosetauro herido", + "subtitles.twilightforest.entity.minotaur.ambient": "Mugido de Minotauro", + "subtitles.twilightforest.entity.minotaur.attack": "Carga de Minotauro", + "subtitles.twilightforest.entity.minotaur.death": "Minotauro muerto", + "subtitles.twilightforest.entity.minotaur.hurt": "Minotauro herido", + "subtitles.twilightforest.entity.mistwolf.death": "Lobo de la Niebla muerto", + "subtitles.twilightforest.entity.mistwolf.hurt": "Lobo de la Niebla herido", + "subtitles.twilightforest.entity.mistwolf.idle": "Lobo de la Niebla gruñe", + "subtitles.twilightforest.entity.mistwolf.target": "Lobo de la Niebla apunta a la víctima", + "subtitles.twilightforest.entity.mosquito.ambient": "Zumbido de Mosquitos", + "subtitles.twilightforest.entity.naga.hiss": "Siseo de Naga", + "subtitles.twilightforest.entity.naga.hurt": "Naga herido", + "subtitles.twilightforest.entity.naga.rattle": "Naga cascabeles", + "subtitles.twilightforest.entity.kphantom.axe": "Caballero Fantasma lanza el hacha", + "subtitles.twilightforest.entity.kphantom.ambient": "Caballero Fantasma jadeos", + "subtitles.twilightforest.entity.kphantom.death": "Caballero Fantasma muerto", + "subtitles.twilightforest.entity.kphantom.hurt": "Caballero Fantasma herido", + "subtitles.twilightforest.entity.kphantom.pick": "Caballero Fantasma lanza el pico", + "subtitles.twilightforest.entity.pinchbeetle.death": "Escarabajo de pinzas muerto", + "subtitles.twilightforest.entity.pinchbeetle.hurt": "Escarabajo de pinzas herido", + "subtitles.twilightforest.entity.quest.ambient": "Balido del Carnero de la Búsqueda", + "subtitles.twilightforest.entity.quest.death": "Carnero de la Búsqueda muerto", + "subtitles.twilightforest.entity.quest.hurt": "Carnero de la Búsqueda herido", + "subtitles.twilightforest.entity.raven.caw": "Canto de Cuervo", + "subtitles.twilightforest.entity.raven.squawk": "Graznido de Cuervo", + "subtitles.twilightforest.entity.redcap.ambient": "Risas de Gorro rojo", + "subtitles.twilightforest.entity.redcap.death": "Gorro rojo gime en agonía", + "subtitles.twilightforest.entity.redcap.hurt": "Gorro rojo chilla de dolor", + "subtitles.twilightforest.entity.shield.add": "Aparece un nuevo escudo", + "subtitles.twilightforest.entity.shield.break": "Rotura del escudo", + "subtitles.twilightforest.entity.slimebeetle.death": "Escarabajo de Slime muerto", + "subtitles.twilightforest.entity.slimebeetle.hurt": "Escarabajo de Slime herido", + "subtitles.twilightforest.entity.slimebeetle.squish": "Escarabajo de Slime saltando", + "subtitles.twilightforest.entity.snowqueen.ambient": "Reina de las Nieves cruje", + "subtitles.twilightforest.entity.snowqueen.attack": "Reina de las Nieves ataca", + "subtitles.twilightforest.entity.snowqueen.break": "Reina de las Nieves el escudo desvía", + "subtitles.twilightforest.entity.snowqueen.death": "Reina de las Nieves muerto", + "subtitles.twilightforest.entity.snowqueen.hurt": "Reina de las Nieves herido", + "subtitles.twilightforest.entity.swarmspider.ambient": "Siseo de Araña de enjambre", + "subtitles.twilightforest.entity.swarmspider.death": "Araña de enjambre muerto", + "subtitles.twilightforest.entity.swarmspider.hurt": "Araña de enjambre herido", + "subtitles.twilightforest.entity.tear.break": "Lágrimas de Ur-Ghast rompiéndose", + "subtitles.twilightforest.entity.termite.ambient": "Siseo de Barrenador de la Torre de Madera", + "subtitles.twilightforest.entity.termite.death": "Barrenador de la Torre de Madera muerto", + "subtitles.twilightforest.entity.termite.hurt": "Barrenador de la Torre de Madera herido", + "subtitles.twilightforest.entity.tinybird.chirp": "Pájaro gorjea", + "subtitles.twilightforest.entity.tinybird.hurt": "Pájaro herido", + "subtitles.twilightforest.entity.tinybird.song": "Pájaro cantando", + "subtitles.twilightforest.entity.tome.death": "Tomo de la Muerte se desmorona", + "subtitles.twilightforest.entity.tome.hurt": "Pliegues del Tomo de la Muerte", + "subtitles.twilightforest.entity.tome.idle": "Tomo de la Muerte pasa las páginas", + "subtitles.twilightforest.entity.urghast.ambient": "Ur-Ghast llora", + "subtitles.twilightforest.entity.urghast.death": "Ur-Ghast muerto", + "subtitles.twilightforest.entity.urghast.hurt": "Ur-Ghast grita", + "subtitles.twilightforest.entity.urghast.trapactive": "Zumbidos de la trampa Trampa Ghast", + "subtitles.twilightforest.entity.urghast.trapon": "Trampa Ghast activa", + "subtitles.twilightforest.entity.urghast.trapspindown": "Trampa Ghast se apaga", + "subtitles.twilightforest.entity.urghast.trapwarmup": "Trampa de Ghast se calienta", + "subtitles.twilightforest.entity.winterwolf.death": "Lobo de invierno muerto", + "subtitles.twilightforest.entity.winterwolf.hurt": "Lobo de invierno herido", + "subtitles.twilightforest.entity.winterwolf.idle": "Lobo de invierno gruñe", + "subtitles.twilightforest.entity.winterwolf.shoot": "Lobo de invierno dispara", + "subtitles.twilightforest.entity.winterwolf.target": "Lobo de invierno apunta a la víctima", + "subtitles.twilightforest.entity.wraith.ambient": "Jadeos de Espectro", + "subtitles.twilightforest.entity.wraith.death": "Espectro muerto", + "subtitles.twilightforest.entity.wraith.hurt": "Espectro herido", + "subtitles.twilightforest.entity.yeti.death": "Yeti muerto", + "subtitles.twilightforest.entity.yeti.grab": "Yeti agarra al jugador", + "subtitles.twilightforest.entity.yeti.growl": "Yeti gruñe", + "subtitles.twilightforest.entity.yeti.hurt": "Yeti herido", + "subtitles.twilightforest.entity.yeti.throw": "Yeti tira con fuerza", + + "subtitles.twilightforest.entity.alphayeti.parrot": "Loro gruñe fríamente", + "subtitles.twilightforest.entity.carminitegolem.parrot": "Loro golpea", + "subtitles.twilightforest.entity.hostilewolf.parrot": "Gruñidos de Loro", + "subtitles.twilightforest.entity.hydra.parrot": "Rugidos de Loro", + "subtitles.twilightforest.entity.icecore.parrot": "Crujidos de Loro", + "subtitles.twilightforest.entity.kobold.parrot": "Loro refunfuña", + "subtitles.twilightforest.entity.minotaur.parrot": "Loro muge furiosamente", + "subtitles.twilightforest.entity.mosquito.parrot": "Zumbidos de Loro", + "subtitles.twilightforest.entity.naga.parrot": "Sonajeros de Loro", + "subtitles.twilightforest.entity.redcap.parrot": "Loro se ríe", + "subtitles.twilightforest.entity.tome.parrot": "Loro hace ruidos de libros", + "subtitles.twilightforest.entity.wraith.parrot": "Jadeos de Loro", + + "subtitles.twilightforest.block.bug.squish": "Se aplasta un bicho :(", + "subtitles.twilightforest.block.builder.on": "El constructor se activa", + "subtitles.twilightforest.block.builder.off": "El constructor se desactiva", + "subtitles.twilightforest.block.builder.replace": "El constructor sustituye el bloque", + "subtitles.twilightforest.block.door.activate": "La puerta del castillo no se desvanece", + "subtitles.twilightforest.block.door.reappear": "La puerta del castillo reaparece", + "subtitles.twilightforest.block.door.vanish": "La puerta del castillo se desvanece", + "subtitles.twilightforest.block.vanish.locked": "La puerta de la Torre de Madera no se desvanece", + "subtitles.twilightforest.block.vanish.unlock": "La puerta de la Torre de Madera se desbloquea", + "subtitles.twilightforest.block.reappear.reappear": "Reaparece el Bloque Reaparecedor", + "subtitles.twilightforest.block.reappear.vanish": "Desaparece el Bloque Reaparecedor", + "subtitles.twilightforest.block.vanish.vanish": "Bloque de desaparición se desvanece", + "subtitles.twilightforest.block.core.time": "El árbol del tiempo hace tictac", + "subtitles.twilightforest.block.core.transformation": "Árbol de la transformación emite un sonido ", + "subtitles.twilightforest.block.portal.woosh": "Portal del Bosque Twilight llama ", + "subtitles.twilightforest.block.pedestal.activate": "El pedestal de trofeos acepta el trofeo", + "subtitles.twilightforest.block.casket.open": "Se abre el ataúd del recuerdo", + "subtitles.twilightforest.block.casket.close": "Se se cierra el ataúd del recuerdo", + "subtitles.twilightforest.block.casket.repair": "El jugador repara el ataúd", + "subtitles.twilightforest.block.casket.locked": "Clics en el ataúd de recuerdo", + + "subtitles.twilightforest.item.blockchain.collide": "Bloque y Cadena golpea un bloque", + "subtitles.twilightforest.item.blockchain.hit": "Bloque y Cadena golpea a la entidad", + "subtitles.twilightforest.item.blockchain.fire": "Bloque y Cadena lanzado", + "subtitles.twilightforest.item.glasssword.break": "Espada de vidrio se rompe", + "subtitles.twilightforest.item.icebomb.fired": "Bomba de hielo lanzada", + "subtitles.twilightforest.item.lamp.burn": "Lámpara de Cenizas quema la zona", + "subtitles.twilightforest.item.moonworm.squish": "Gusano lunar disparos", + "subtitles.twilightforest.item.magnet.grab": "El imán extrae el mineral", + "subtitles.twilightforest.item.fan.woosh": "Abanico de pavo real utilizado", + "subtitles.twilightforest.item.scepter.drain": "Cetro Robó la vida del objetivo ", + "subtitles.twilightforest.item.scepter.use": "Cetro usado", + "subtitles.twilightforest.item.scepter.pearl": "Cetro Crepuscular lanza la perla", + "subtitles.twilightforest.item.powder.use": "Polvo de transformación utilizado", + "subtitles.twilightforest.item.charm.keep": "Talisman de conservación devuelve los objetos", + "subtitles.twilightforest.item.charm.life": "Talisman de Vida regenera al jugador", + + "subtitles.twilightforest.te.jet.start": "Comienza el chorro de fuego", + "subtitles.twilightforest.te.jet.active": "Llamaradas de Chorro de fuego", + "subtitles.twilightforest.te.jet.pop": "Chorro de fuego empieza a brotar", + "subtitles.twilightforest.te.smoker.start": "El ahumador comienza", + "subtitles.twilightforest.te.reactor.idle": "Reactor de Carminita hace ruido", + + "subtitles.random.slider": "Trampa Deslizante en Movimiento", + + // Death Messages + "death.attack.twilightforest.ghastTear": "%1$s fue escaldado por lágrimas de fuego", + "death.attack.twilightforest.ghastTear.player": "%1$s fue escaldado por lágrimas de fuego mientras escapaba de %2$s", + "death.attack.twilightforest.hydraFire": "%1$s fue asado vivo por la Hidra", + "death.attack.twilightforest.hydraFire.player": "%1$s fue asado vivo por la Hidra mientras escapaba de %2$s", + "death.attack.twilightforest.hydraBite": "La piel de %1$s fue arrancada por la Hidra", + "death.attack.twilightforest.hydraBite.player": "La piel de %1$s fue arrancada por la Hidra mientras escapaba de %2$s", + "death.attack.twilightforest.lichBolt": "La puntería del Lich era mejor que %1$s", + "death.attack.twilightforest.lichBolt.player": "El Lich y %2$s tenían mejor puntería que %1$s", + "death.attack.twilightforest.lichBomb": "%1$s sucumbió a la magia explosiva del Lich", + "death.attack.twilightforest.lichBomb.player": "%1$s sucumbió a la magia explosiva del Lich mientras escapaba %2$s", + "death.attack.twilightforest.chillingBreath": "%1$s fue congelado hasta la muerte por la Reina de las Nieves", + "death.attack.twilightforest.chillingBreath.player": "%1$s murió congelado por la Reina de las Nieves mientras escapaba de %2$s", + "death.attack.twilightforest.squish": "%1$s fue aplastado por la Reina de las Nieves", + "death.attack.twilightforest.squish.player": "%1$s fue triturado por la Reina de las Nieves mientras escapaba de %2$s", + "death.attack.twilightforest.thrownAxe": "%1$s fue decapitado por un hacha lanzada", + "death.attack.twilightforest.thrownAxe.player": "%1$s fue decapitado por un hacha lanzada mientras escapaba de %2$s", + "death.attack.twilightforest.thrownPickaxe": "%1$s fue decapitado por un pico lanzado", + "death.attack.twilightforest.thrownPickaxe.player": "%1$s fue decapitado por un pico lanzado mientras escapaba de %2$s", + "death.attack.twilightforest.fireJet": "%1$s caminó accidentalmente hacia un chorro de fuego", + "death.attack.twilightforest.fireJet.player": "%1$s entró accidentalmente en un chorro de fuego mientras escapaba de %2$s", + "death.attack.twilightforest.reactor": "%1$s estuvo demasiado cerca de un reactor de carminita", + "death.attack.twilightforest.reactor.player": "%1$s estuvo demasiado cerca de un reactor de carminita mientras escapaba %2$s", + "death.attack.twilightforest.slider": "%1$s fue cortado por una trampa deslizante", + "death.attack.twilightforest.slider.player": "%1$s fue cortado por una trampa deslizante mientras escapaba de %2$s", + "death.attack.twilightforest.thorns": "%1$s caminó hacia unas espinas", + "death.attack.twilightforest.thorns.player": "%1$s caminó hacia unas espinas mientras escapaba de %2$s", + "death.attack.twilightforest.knightmetal": "%1$s fue pinchado por un bloque hecho del Caballero de Metal", + "death.attack.twilightforest.knightmetal.player": "%1$s fue pinchado por un bloque hecho del Caballero de Metal mientras escapaba de %2$s", + "death.attack.twilightforest.fiery": "%1$s caminó hacia un bloque ardiente", + "death.attack.twilightforest.fiery.player": "%1$s caminó sobre un bloque ardiente mientras escapaba de %2$s", + + "death.attack.twilightforest.axing": "%1$s ha sido cortado por %2$s", + "death.attack.twilightforest.axing.item": "%1$s ha sido cortado por %2$s con %3$s", + "death.attack.twilightforest.cicada": "%1$s fue disparado por la Cigarra", + "death.attack.twilightforest.moonworm": "%1$s fue disparado por el Gusano lunar", + "death.attack.twilightforest.ant": "%1$s vivió la vida de una hormiga gracias a %2$s", + "death.attack.twilightforest.ant.item": "%1$s vivió la vida de una hormiga gracias a %2$s usando %3$s", + "death.attack.twilightforest.haunt": "%1$s entro a la guarida de %2$s", + "death.attack.twilightforest.haunt.item": "%1$s entro a la guarida de %2$s después de ser asesinado con %3$s", + "death.attack.twilightforest.clamped": "%1$s fue sujetado hasta la muerte por %2$s", + "death.attack.twilightforest.clamped.item": "%1$s fue sujetado hasta la muerte por %2$s usando %3$s", + "death.attack.twilightforest.scorched": "%1$s fue quemado por %2$s", + "death.attack.twilightforest.scorched.item": "%1$s fue quemado por %2$s usando %3$s", + "death.attack.twilightforest.frozen": "%1$s fue congelado por %2$s usando una bomba de hielo", + "death.attack.twilightforest.frozen.item": "%1$s fue congelado por %2$s usando %3$s", + "death.attack.twilightforest.spiked": "%1$s ha sido pinchado por %2$s", + "death.attack.twilightforest.spiked.item": "%1$s ha sido pinchado por %2$s utilizando %3$s", + "death.attack.twilightforest.leafBrain": "El cerebro de %1$s fue convertido en hojas por %2$s", + "death.attack.twilightforest.leafBrain.item": "El cerebro de %1$s fue convertido en hojas por %2$s usando %3$s", + "death.attack.twilightforest.lostWords": "%1$s se quedó sin palabras tras ser asesinado por %2$s", + "death.attack.twilightforest.lostWords.item": "%1$s se quedó sin palabras tras ser asesinado por %2$s con %3$s", + "death.attack.twilightforest.snowballFight": "%1$s perdió una pelea de bolas de nieve contra %2$s", + "death.attack.twilightforest.snowballFight.item": "%1$s perdió una pelea de bolas de nieve contra %2$s usando %3$s", + "death.attack.twilightforest.yeeted": "%1$s fue golpeado por última vez por %2$s", + "death.attack.twilightforest.yeeted.item": "%1$s ha sido golpeado por última vez por %2$s mientras sostenía %3$s", + + // Misc + "twilightforest.misc.wip0": "Este bloque es un trabajo en proceso y puede tener errores o efectos no deseados que pueden dañar tu mundo.", + "twilightforest.misc.wip1": "Utilizar con precaución.", + "twilightforest.misc.nyi": "Este bloque tiene efectos que aún no se han implementado.", + + "twilightforest.loading.title.enter": "Llevándote al Twilight Forest...", + "twilightforest.loading.title.leave": "Sacándote de Twilight Forest...", + + // Config + "twilightforest.config.dimension": "Ajustes de Dimensión", + "twilightforest.config.dimension.tooltip": "No podrás cambiar estas configuraciones sin que se produzca un reinicio.", + "twilightforest.config.dimension_id": "Dimension ID", + "twilightforest.config.dimension_id.tooltip": "Qué número de identificación asignar a la dimensión de Twilight Forest. Cambia si tienes conflictos con otro mod.", + "twilightforest.config.dimension_seed": "Semilla de Dimensión", + "twilightforest.config.dimension_seed.tooltip": "Si se establece, esto anulará la semilla normal del mundo cuando se generen partes de Twilight Forest Dimension.", + "twilightforest.config.spawn_in_tf": "Los nuevos jugadores aparecen en el Twilight Forest", + "twilightforest.config.spawn_in_tf.tooltip": "Si es cierto, los jugadores que aparezcan por primera vez lo harán en el Twilight Forest.", + "twilightforest.config.skylight_forest": "Bosque de Tragaluces [WIP]", + "twilightforest.config.skylight_forest.tooltip": "If true, Twilight Forest will generate as a void except for Major Structures.", + "twilightforest.config.skylight_oaks": "Tragaluz de Roble [WIP]", + "twilightforest.config.skylight_oaks.tooltip": "Si es cierto, los gigantescos Robles Crepusculares también aparecerán en los mundos vacíos.", + + "twilightforest.config.world_gen_weights": "Pesos de la generación mundial", + "twilightforest.config.world_gen_weights.tooltip": "Pesos para varias características pequeñas", + "twilightforest.config.stone_circle_weight": "Peso del círculo de piedra", + "twilightforest.config.well_weight": "Peso del pozo", + "twilightforest.config.stalagmite_weight": "Peso de la estalagmita", + "twilightforest.config.foundation_weight": "Peso de la base", + "twilightforest.config.monolith_weight": "Peso del monolito", + "twilightforest.config.grove_ruins_weight": "Peso de las ruinas de la arboleda", + "twilightforest.config.hollow_stump_weight": "Peso del muñón hueco", + "twilightforest.config.fallen_hollow_log_weight": "Peso del tronco hueco caido", + "twilightforest.config.fallen_small_log_weight": "Peso del tronco pequeño caído", + "twilightforest.config.druid_hut_weight": "Peso de la cabaña del druida", + + "twilightforest.config.hollow_hill_stalactites": "Estalactitas de la Colina Hueca personalizadas", + "twilightforest.config.hollow_hill_stalactites.tooltip": "Define estalactitas personalizadas generadas en colinas huecas.\n_Format is \\\"modid:block<:meta> size max_Length min_Height weight\\\", donde las propiedades son:\n_Size - la longitud máxima de la estalactita en relación con el espacio entre el suelo y el techo de la colina,\n_Max length - la longitud máxima de una estalactita en bloques,\n_Min height - el espacio mínimo entre el suelo de la colina y la estalactita para que se genere,\n_Weight - la frecuencia con la que se genera.\n\n_For example: \\\"minecraft:iron_ore 0.7 8 1 24\\\" añadiría una estalactita igual a la estalactita de mineral de hierro por defecto.", + "twilightforest.config.large_hill": "Grandes Colinas", + "twilightforest.config.large_hill.tooltip": "Bloques que se generan como estalactitas sólo en las grandes colinas.", + "twilightforest.config.medium_hill": "Colinas medianas y grandes", + "twilightforest.config.medium_hill.tooltip": "Bloques que se generan como estalactitas en colinas medianas y grandes.", + "twilightforest.config.small_hill": "Todas las colinas", + "twilightforest.config.small_hill.tooltip": "Bloques que generan como estalactitas en todas las colinas.", + "twilightforest.config.stalactite_config_only": "Utilice sólo la configuración de estalactitas", + "twilightforest.config.stalactite_config_only.tooltip": "Si es cierto, no se utilizarán las estalactitas por defecto ni las definidas por otros mods.", + + "twilightforest.config.compat": "Compatibilidad", + "twilightforest.config.compat.tooltip": "¿Debe cargarse la Compatibilidad de TF? Desactivar si la Compatibilidad de TF está causando caídas o si no se desea.", + + "twilightforest.config.performance": "Ajustes de rendimiento", + "twilightforest.config.performance.tooltip": "Te permite sacrificar varias cosas para mejorar el rendimiento del mundo.", + "twilightforest.config.canopy_coverage": "Cobertura del Dosel", + "twilightforest.config.canopy_coverage.tooltip": "Cantidad de cobertura del dosel. Los números más bajos mejoran la velocidad de generación de trozos a costa de un bosque más delgado.", + "twilightforest.config.twilight_oaks": "Roble Crepuscular Probabilidad", + "twilightforest.config.twilight_oaks.tooltip": "Probabilidad de que un trozo del Twilight Forest contenga un roble crepuscular. Los números más altos reducen el número de árboles, aumentando el rendimiento.", + "twilightforest.config.leaves_light_opacity": "Opacidad de las hojas crepusculares", + "twilightforest.config.leaves_light_opacity.tooltip": "Esto controla la opacidad de las hojas, cambiando la cantidad de luz bloqueada. Puede utilizarse para disminuir la complejidad en algunos controles de iluminación.", + "twilightforest.config.glacier_packed_ice": "Glaciares de hielo compacto en lugar de hielo", + "twilightforest.config.glacier_packed_ice.tooltip": "Si se establece como verdadero, los glaciares crepusculares se generarán con hielo compactado en lugar de hielo translúcido normal, lo que reducirá la cantidad de cálculos de comprobación de la luz.", + "twilightforest.config.enable_skylight": "Activar el Tragaluz", + "twilightforest.config.enable_skylight.tooltip": "Si la dimensión tiene valores de tragaluz por bloque. Desactivar esto mejorará significativamente el rendimiento de la generación de mundos, a costa de una iluminación plana en todas partes.\n_WARNING: Una vez que los trozos se cargan sin tragaluz, esos datos se pierden y no pueden ser regenerados fácilmente. Tenga cuidado.", + + "twilightforest.config.silent_cicadas": "Cigarras silenciosas", + "twilightforest.config.silent_cicadas.tooltip": "Haz que las cigarras sean silenciosas para aquellos que tengan problemas con la biblioteca de sonido o que las encuentren molestas.", + + "twilightforest.config.first_person_effects": "Renderización de efectos en 1ª persona", + "twilightforest.config.first_person_effects.tooltip": "Controla si varios efectos del mod se renderizan en la vista en primera persona. Desactívelo si los encuentra molestos.", + + "twilightforest.config.origin_dimension": "Dimensión de origen", + "twilightforest.config.origin_dimension.tooltip": "La dimensión desde la que siempre puedes viajar al Twilight Forest, así como la dimensión a la que regresarás. El valor predeterminado es el mundo exterior.", + "twilightforest.config.portals_in_other_dimensions": "Portales en otras dimensiones", + "twilightforest.config.portals_in_other_dimensions.tooltip": "Permitir que los portales al Twilight Forest se hagan fuera de la dimensión 'origen'. Puede considerarse una hazaña.", + "twilightforest.config.admin_portals": "Portales Twilight sólo para administradores", + "twilightforest.config.admin_portals.tooltip": "Permitir portales sólo para administradores (Operadores). Esto reduce severamente el rango en el que el mod suele escanear en busca de condiciones de portales válidos, y escanea cerca de los ops solamente.", + "twilightforest.config.portals": "Desactivar los portales Twilight", + "twilightforest.config.portals.tooltip": "Desactivar por completo la creación de portales en Twilight Forest. Proporcionado para los operadores de servidores que buscan restringir la acción a la dimensión.", + "twilightforest.config.portal_creator": "Objeto creador del portal", + "twilightforest.config.portal_creator.tooltip": "Cadena de registro IDs de elementos utilizados para crear el Portal de Twilight Forest. (domain:regname:meta) meta es opcional.", + "twilightforest.config.portal_lighting": "Fuego relámpago para la creación del portal", + "twilightforest.config.portal_lighting.tooltip": "Establece esta opción como verdadera si quieres que el rayo que enciende el portal no prenda fuego a las cosas. Para los que no les gusta la diversión.", + "twilightforest.config.portal_return": "Los portales deben generar como un portal de dos vías", + "twilightforest.config.portal_return.tooltip": "Si es falso, el portal de retorno requerirá el elemento de activación.", + "twilightforest.config.check_portal_destination": "Destino del Portal Pre-Check", + "twilightforest.config.check_portal_destination.tooltip": "Determina si los nuevos portales deben ser precomprobados por seguridad. Si se activa, los portales no se formarán en lugar de redirigirse a un destino alternativo seguro.\n_Note que al activar esto también se reduce la tasa de comprobación de la formación de portales.", + + "twilightforest.config.progression_default": "Regla de Progreso por Defecto", + "twilightforest.config.progression_default.tooltip": "Establece el valor por defecto de la regla de juego que controla la progresión forzada.", + + "twilightforest.config.uncrafting": "Desactivar la desfabricación en la mesa de desfabricación", + "twilightforest.config.uncrafting.tooltip": "Desactiva la función de desfabricación de la mesa de desfabricación. Se ofrece como opción cuando la interacción con otros mods produce recetas explotables.", + + "twilightforest.config.optifine": "Desactivar la pantalla de aviso cuando se instala Optifine.", + "twilightforest.config.optifine.tooltip": "Desactiva la pantalla de aviso que se muestra al inicio cuando se instala Optifine.", + + "twilightforest.config.antibuilder_blacklist": "Lista negra anti-construcción", + "twilightforest.config.antibuilder_blacklist.tooltip": "Lista negra anti-construcción. (domain:block:meta) meta es opcional.", + + "twilightforest.config.animate_trophyitem": "Girar las cabezas de los trofeos en el modelo de artículo", + "twilightforest.config.animate_trophyitem.tooltip": "Gira las cabezas de los trofeos en el modelo de artículo. No tiene ningún impacto en el rendimiento. Para aquellos que no les gusta la diversión.", + + "twilightforest.config.shield_parry": "Parada de Escudo", + "twilightforest.config.shield_parry.tooltip": "Recomendamos descargar el mod Shield Parry para realizar paradas, pero estos controles quedan para sin.", + "twilightforest.config.parry_non_twilight": "Parada de proyectiles no Twilight", + "twilightforest.config.parry_non_twilight.tooltip": "Poner en true para parar los proyectiles que no son de Twilight. Recomendamos descargar el mod Shield Parry en su lugar.", + "twilightforest.config.parry_window_arrow": "Temporización para las flechas", + "twilightforest.config.parry_window_arrow.tooltip": "La cantidad de ticks después de levantar un escudo que hace que se pueda parar una flecha. Hay 20 ticks en 1 segundo.", + "twilightforest.config.parry_window_fireball": "Temporización para las bolas de fuego", + "twilightforest.config.parry_window_fireball.tooltip": "La cantidad de ticks después de levantar un escudo que hace que se pueda parar una bola de fuego. Hay 20 ticks en 1 segundo.", + "twilightforest.config.parry_window_throwable": "Temporización de los lanzamientos", + "twilightforest.config.parry_window_throwable.tooltip": "La cantidad de ticks después de levantar un escudo que hace que se pueda parar un objeto lanzado. Hay 20 ticks en 1 segundo.", + "twilightforest.config.shield_Parry_Ticks_Beam": "Ventana de tiempo para las vigas???", + "twilightforest.config.shield_Parry_Ticks_Beam.tooltip": "???", + + "twilightforest.config.loading_screen": "Pantalla de Carga", + "twilightforest.config.loading_screen.tooltip": "Sólo para clientes: Controles de la pantalla de carga", + "twilightforest.config.loading_icon_enable": "Activar la animación del icono de carga", + "twilightforest.config.loading_icon_enable.tooltip": "Tambalea el icono de carga. No tiene ningún impacto en el rendimiento. Para los que no les gusta la diversión.", + "twilightforest.config.loading_screen_swap_frequency": "Cambio de pantalla de carga", + "twilightforest.config.loading_screen_swap_frequency.tooltip": "Cuántos ticks entre cada cambio de pantalla de carga. Poner a 0 para que no haya ningún ciclo.", + "twilightforest.config.loading_icon_wobble_bounce_frequency": "Velocidad de Animación de los Iconos", + "twilightforest.config.loading_icon_wobble_bounce_frequency.tooltip": "Frecuencia de tambaleo y rebote.", + "twilightforest.config.loading_icon_scale": "Escala del Icono", + "twilightforest.config.loading_icon_scale.tooltip": "Escala de todo el icono de carga de rebote.", + "twilightforest.config.loading_icon_bounciness": "Icono Rebotante", + "twilightforest.config.loading_icon_bounciness.tooltip": "Cuánto rebota el icono de carga.", + "twilightforest.config.loading_icon_tilting": "Icon Wobbliness", + "twilightforest.config.loading_icon_tilting.tooltip": "Hasta dónde se tambalea el icono de carga.", + "twilightforest.config.loading_icon_tilt_pushback": "Icono Desplazamiento de la inclinación", + "twilightforest.config.loading_icon_tilt_pushback.tooltip": "Valor de empuje para volver a centrar el bamboleo del icono de carga.", + "twilightforest.config.casket_uuid_locking": "Cierre del ataúd UUID", + "twilightforest.config.casket_uuid_locking.tooltip": "Si es cierto, los ataúdes de recuerdo que se generan cuando un jugador muere no serán accesibles para otros jugadores. Utiliza esta opción si no quieres que la gente coja de los ataúdes de muerte de otras personas. NOTA: los operadores del servidor seguirán pudiendo abrir los ataúdes cerrados.", + + // Books + "twilightforest.book.lichtower.1": "\u00A78[[Un cuaderno de explorador, roído por los monstruos]]\u00A70\n\n_He comenzado a examinar la extraña aura que rodea a esta torre. Los ladrillos de la torre están protegidos por una maldición, más fuerte que cualquiera que haya visto antes. La magia de la maldición", + "twilightforest.book.lichtower.2": "está hirviendo en los alrededores.\n\n_En mi tierra natal tendría muchas opciones para lidiar con esta magia, pero aquí mis suministros son limitados. En mi tierra natal tendría muchas opciones para lidiar con esta magia, pero aquí mis suministros son limitados. Tendré que investigar...", + "twilightforest.book.lichtower.3": "\u00A78[[Muchas entradas después]]\u00A70\n\n_Un avance! En mis viajes avisté un enorme monstruo con forma de serpiente en un patio decorado. Cerca, recogí una escama verde desgastada y desechada.\n\n_La magia de la escama parece tener las", + "twilightforest.book.lichtower.4": "propiedades para romper maldiciones que necesito, pero la magia es demasiado débil. Puede que necesite adquirir un espécimen más fresco, directamente de la criatura.", + + "twilightforest.book.labyrinth.1": "\u00A78[[Cuaderno de un explorador, escrito en papel impermeable]]\u00A70\n\n_Los mosquitos de este pantano son molestos, pero extraños. La gran mayoría de ellos parece no tener una fuente natural, ni parece tener un papel en la ecología local. He comenzado a", + "twilightforest.book.labyrinth.2": "sospechar que son una especie de maldición mágica.\n\n\u00A78[[Siguiente entrada]]\u00A70\n\n_Ahora que he encontrado un hechizo de protección en el laberinto en ruinas aquí, considero que mis sospechas se confirman.Tanto el hechizo de protección", + "twilightforest.book.labyrinth.3": "como los mosquitos son una maldición. Esta maldición parece tener un origen diferente a las otras que he encontrado. Tendré que investigar más...\n\n\u00A78[[Siguiente entrada]]\u00A70\n\n_La maldición parece", + "twilightforest.book.labyrinth.4": "ser de un tipo demasiado poderoso para que un solo ser la produzca. Serían necesarios varios magos trabajando en combinación.\n\n_Si uno de los magos dejara de contribuir, la maldición caería sobre todo el pantano. Extrañamente,", + "twilightforest.book.labyrinth.5": "mis adivinaciones no muestran señales de ningún mago vivo cercano. Sin embargo, vi algo interesante en una de las torres de techo puntiagudo cercanas...", + + "twilightforest.book.hydralair.1": "\u00A78[[Un cuaderno de explorador, escrito en papel ignífugo]]\u00A70\n\n_El fuego es un obstáculo trivial para un maestro explorador como yo. He atravesado mares de fuego y nadado por océanos de lava. El aire ardiente aquí es una variación interesante,", + "twilightforest.book.hydralair.2": "pero, en definitiva, no es un obstáculo.\n\n_Sin embargo, lo que me detiene es que me he encontrado con otro hechizo de protección, esta vez rodeando a una poderosa criatura que debe ser el rey de este pantano de fuego. Este no es el primer hechizo de protección que", + "twilightforest.book.hydralair.3": "encuentro, y estoy comenzando a desentrañar los misterios de cómo funcionan.\n\n_Si este hechizo es como los otros, será sostenido por una poderosa criatura cercana. Alrededor del pantano de fuego hay varios pantanos húmedos, y bajo esos", + "twilightforest.book.hydralair.4": "pantanos hay laberintos llenos de minotauros. La elección lógica para atar tal hechizo sería algún tipo de minotauro poderoso, diferente de alguna manera de los otros que lo rodean...", + + "twilightforest.book.tfstronghold.1": "\u00A78[[Un cuaderno de explorador, escrito en un papel débilmente brillante]\u00A70\n\n_Los tallos de oscuridad que rodean esta zona no son más que la manifestación de un hechizo protector sobre todo el bosque oscuro. El hechizo causa ceguera, lo cual es bastante molesto. He visto", + "twilightforest.book.tfstronghold.2": "varias cosas interesantes en la zona y me gustaría seguir explorando.\n\n\u00A78[[Entrada siguiente]]\u00A70\n\n_He encontrado unas ruinas en el bosque oscuro. Pertenecen a una fortaleza, del tipo que suelen habitar los caballeros. Sin embargo", + "twilightforest.book.tfstronghold.3": "más que de caballeros, esta fortaleza está llena de goblins. Llevan armadura de caballero, pero su comportamiento es muy poco caballeroso.\n\n\u00A78[[Entrada siguiente]]\u00A70\n\n_En lo profundo de las ruinas, he encontrado un pedestal. El pedestal parece ser del tipo en el que", + "twilightforest.book.tfstronghold.4": "los caballeros colocarían los trofeos para demostrar su fuerza.\n\\La obtención de un cetro poderoso parece debilitar la maldición del bosque oscuro, y la colocación de un trofeo asociado a una criatura poderosa en el pedestal probablemente concedería el acceso a la", + "twilightforest.book.tfstronghold.5": "parte principal de la fortaleza.", + + "twilightforest.book.darktower.1": "\u00A78[[Un cuaderno de explorador que parece haber sobrevivido a una explosión]]\u00A70\n\n_Esta torre tiene claramente mecanismos que no me responden. Su magia casi anhela reconocer mi toque, pero no puede. Es como si los dispositivos de la torre estuvieran siendo", + "twilightforest.book.darktower.2": "suprimida por un poderoso grupo de seres cercanos.\n\n\u00A78[[Entrada siguiente]]\u00A70\n\n_La magia parece emanar de lo más profundo de las fortalezas cercanas. No puede venir de los goblins, ya que su magia es encantadora, pero desenfocada. Allí", + "twilightforest.book.darktower.3": "debe haber alguna fuerza aún activa en los bastiones.\n\n\u00A78[[Entrada siguiente]]\u00A70\n\n_Mi análisis indica que proviene de varias fuentes, operando como un grupo. Volveré a la fortaleza después de reabastecerme...", + + "twilightforest.book.yeticave.1": "\u00A78[[Un cuaderno de explorador, cubierto de escarcha]]\u00A70\n\n_La ventisca que rodea estas tierras nevadas es incesante. No se trata de una nevada ordinaria: es un fenómeno mágico. Tendré que realizar experimentos para encontrar", + "twilightforest.book.yeticave.2": "lo que es capaz de causar tal efecto.\n\n\u00A78[[Entrada siguiente]]\u00A70\n\n_La maldición parece ser de un tipo demasiado poderoso para que un solo ser la produzca. Serían necesarios varios magos trabajando en combinación.", + "twilightforest.book.yeticave.3": "Si uno de los magos dejara de contribuir, la ventisca se calmaría. Extrañamente, mis adivinaciones no muestran señales de ningún mago vivo cercano. Sin embargo, vi algo interesante en una de las torres de techo puntiagudo cercanas...", + + "twilightforest.book.icetower.1": "\u00A78[[El cuaderno de un explorador, cubierto de hielo]]\u00A70\n\n_He superado una ventisca, sólo para encontrarme con esta terrible tormenta de hielo en la cima del glaciar. Mis exploraciones me han mostrado el esplendor de un palacio de hielo, que brilla con los colores de la aurora polar. Todo", + "twilightforest.book.icetower.2": "parece protegido por una especie de maldición.\n\n\u00A78[[Entrada siguiente]]\u00A70\n\n_No soy un novato. Esta maldición es alimentada por el poder de una criatura cercana. La causa de la maldición que rodea el pantano de fuego se construyó a partir del poder del líder de los", + "twilightforest.book.icetower.3": "minotauros de las cercanías.\n\n_Alrededor de este glaciar, hay masas de yetis. Quizás los yetis tengan algún tipo de líder...", + + "twilightforest.book.trollcave.1": "\u00A78[[Un cuaderno de explorador, dañado por el ácido]]\u00A70\n\n_Parece que no hay forma de protegerme de la tormenta tóxica que rodea esta zona. En mis breves excursiones, también he encontrado otro hechizo de protección, similar a los", + "twilightforest.book.trollcave.2": "otros que he presenciado. El hechizo debe estar conectado a la tormenta tóxica de alguna manera. Más investigación para seguir...\n\n\u00A78[[Entrada siguiente]]\u00A70\n\n_Tal magia climática suprema debe ser el resultado de", + "twilightforest.book.trollcave.3": "múltiples e invictos grandes males en este mundo. Mis estudios contienen varias pistas que apuntan a un pantano abrasador, un bosque cubierto de profunda oscuridad y un reino cubierto de nieve.", + + "twilightforest.book.unknown.1": "\u00A78[[Este libro muestra signos de haber sido copiado muchas veces]]\u00A70\n\n_No puedo explicar el campo que rodea esta estructura, pero la magia es poderosa. Si esta maldición es como las otras, entonces la respuesta para desbloquearla está en otra parte. Tal vez hay", + "twilightforest.book.unknown.2": "algo que he dejado sin hacer, o algún monstruo que aún no he vencido. Tendré que regresar. Volveré a este lugar más tarde, para ver si algo ha cambiado.", + + // Fluid + + "fluid.fierymetal": "Fierro fundido", + "fluid.knightmetal": "Caballero de Metal Fundido", + "fluid.fiery_essence": "Esencia ardiente", + + // TCon + + "material.nagascale": "Escama Naga", + "material.steeleaf": "Hoja de Acero", + "material.fierymetal": "Ardiente", + "material.knightmetal": "Caballero", + "material.raven_feather": "Pluma de Cuervo", + + "modifier.twilit": "Twilit", + "modifier.twilit.desc": "§oLa bendición iluminadora del Twilight Forest§r.\nMás rápido en el Twilight Forest.\nMás daños fuera del Twilight Forest.", + "modifier.twilit.extra.speed": "Velocidad de extracción en Twilight Forest: +%s", + "modifier.twilit.extra.damage": "Daños fuera del Twilight Forest: +%s", + "modifier.precipitate": "Precipitate", + "modifier.precipitate.desc": "§oEl último plan de escape en pie.§r\nCuanto menos salud tenga, más rápido será.", + "modifier.synergy": "Sinergia", + "modifier.synergy.desc": "§oMira mamá, no hay musgo!§r\nSe reparará por sí mismo si tienes Hoja de Acero en tu barra de acceso.", + "modifier.stalwart": "Incondicional", + "modifier.stalwart.desc": "§o_Los valientes y audaces.§r\nGolpear a una entidad puede hacer que te sientas envalentonado.", + "modifier.veiled": "Velada", + "modifier.veiled.desc": "§oComo un espectro!§r\nEl proyectil será invisible.", + + // Immersive Engineering + "desc.immersiveengineering.info.shader.rarity.twilight": "Twilight", + + "item.twilightforest.shader": "Twilit Shader: %s", + "item.twilightforest.shader_bag": "Twilit %s Shader Bag", + + "item.twilightforest.shader.name.twilight": "Twilight", + "item.twilightforest.shader.name.firefly": "Luciérnaga", + "item.twilightforest.shader.name.questing_ram": "Carnero de la Búsqueda", + "item.twilightforest.shader.name.ironwood": "Madera de Hierro", + "item.twilightforest.shader.name.steeleaf": "Hoja de Acero", + "item.twilightforest.shader.name.knightly": "Caballero de Metal", + "item.twilightforest.shader.name.fiery": "Ardiente", + "item.twilightforest.shader.name.snakestone": "Piedra de la Serpiente", + "item.twilightforest.shader.name.naga": "Naga", + "item.twilightforest.shader.name.lich": "Lich", + "item.twilightforest.shader.name.mazestone": "Piedra de Laberinto", + "item.twilightforest.shader.name.pinch_beetle": "Escarabajo de Pinzas", + "item.twilightforest.shader.name.minoshroom": "Minosetauro", + "item.twilightforest.shader.name.hydra": "Hidra", + "item.twilightforest.shader.name.underbrick": "Subsuelo de Ladrillos", + "item.twilightforest.shader.name.knight_phantom": "Caballero Fantasma", + "item.twilightforest.shader.name.towerwood": "Torre de Madera", + "item.twilightforest.shader.name.carminite": "Carminita", + "item.twilightforest.shader.name.ur-ghast": "Ur-Ghast", + "item.twilightforest.shader.name.alpha_yeti": "Yeti Alfa", + "item.twilightforest.shader.name.auroralized": "Auroralizado", + "item.twilightforest.shader.name.snow_queen": "Reina de las Nieves", + "item.twilightforest.shader.name.cube_of_annihilation": "Cubo de la Aniquilación", + "item.twilightforest.shader.name.final_castle": "Castillo Final", + + // Optifine + "twilightforest.gui.optifine.title": "AVISO: OPTIFINE DETECTADO", + "twilightforest.gui.optifine.message": "Antes de continuar, por favor, tenga en cuenta que Optifine es conocido por causar fallos, errores visuales de entidades multiparte y muchos otros problemas.\n\nAntes de informar de un error, por favor, elimine Optifine primero y compruebe de nuevo si el error sigue presente.\n\nLos problemas relacionados con Optifine no pueden ser resueltos por Twilight Forest!\n\nEsta pantalla puede ser desactivada en la configuración del cliente." +} diff --git a/src/main/resources/assets/twilightforest/lang/es_cl.json b/src/main/resources/assets/twilightforest/lang/es_cl.json new file mode 100644 index 0000000000..a0d52caef9 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/es_cl.json @@ -0,0 +1,1316 @@ +{ + "itemGroup.twilightforest": "Twilight Forest", + + // ADVANCEMENTS + "advancement.twilightforest.root.desc": "Entra en el misterioso bosque mágico: the Twilight Forest.", + + // General progression + "advancement.twilightforest.hedge": "Golpeador de Bichos", + "advancement.twilightforest.hedge.desc": "Derrota a una araña en un %s.", + + "advancement.twilightforest.hill1": "Las botas son mías!", + "advancement.twilightforest.hill1.desc": "Derrota a un %s en un pequeño %s.", + "advancement.twilightforest.hill2": "Qué fue ese ruido?", + "advancement.twilightforest.hill2.desc": "Derrota a un %s en un medio %s.", + "advancement.twilightforest.hill3": "Veo a través de ti", + "advancement.twilightforest.hill3.desc": "Derrota a un %s en un gran %s.", + + "advancement.twilightforest.quest_ram": "Consumación de Baaahs", + "advancement.twilightforest.quest_ram.desc": "Dale al %s lo que le falta.", + + // Map + "advancement.twilightforest.magic_map_focus": "Con El Fuego Se Escribe", + "advancement.twilightforest.magic_map_focus.desc": "Elabora el %s con un %s, %s, y %s.", + "advancement.twilightforest.magic_map": "Puedo Ver Para Siempre", + "advancement.twilightforest.magic_map.desc": "Haz los %s.", + "advancement.twilightforest.maze_map": "Y Ahora, a Encontrar la Salida", + "advancement.twilightforest.maze_map.desc": "Elabora los %s después de obtener el foco del laberinto.", + "advancement.twilightforest.ore_map": "Cómo puede merecer la pena?", + "advancement.twilightforest.ore_map.desc": "Haz los %s.", + + // Mainline beginning progression + "advancement.twilightforest.twilight_hunter": "El Silencio del Bosque", + "advancement.twilightforest.twilight_hunter.desc": "Cazar algo de la fauna local.", + + "advancement.twilightforest.kill_naga": "Es Hora de Igualar la Balanza", + "advancement.twilightforest.kill_naga.desc": "Mata al %s en su patio del bosque y obtén un %s para superar la barrera mágica que rodea la torre del Lich.", + "advancement.twilightforest.naga_armors": "Armero Naga", + "advancement.twilightforest.naga_armors.desc": "Crea la armadura de pecho y de piernas de %s.", + + "advancement.twilightforest.kill_lich": "Trae a tus muertos", + "advancement.twilightforest.kill_lich.desc": "Mata a los % en lo alto de su torre y recupera un cetro para eliminar los mosquitos venenosos del Pantano, ver a través de la oscuridad cegadora de la maldición del Bosque Oscuro y resistir el frío del Bosque Nevado.", + "advancement.twilightforest.lich_scepters": "Por Nuestros Poderes Combinados!", + "advancement.twilightforest.lich_scepters.desc": "Consigue los cuatro cetros de poder.", + + // Swamp Progression + "advancement.twilightforest.progress_labyrinth": "El Poderoso Stroganoff", + "advancement.twilightforest.progress_labyrinth.desc": "El guiso de carne y hongos te calienta agradablemente, lo suficiente como para que sientas que estás lo suficientemente aclimatado como para aventurarte en el Pantano del Fuego.", + "advancement.twilightforest.kill_hydra": "Cazador de Hidras", + "advancement.twilightforest.kill_hydra.desc": "Derrota a los poderosos %s y empodérate.", + "advancement.twilightforest.mazebreaker": "Rompiendo el Laberinto", + "advancement.twilightforest.mazebreaker.desc": "Encuentra el pico %s en la bóveda secreta del laberinto.", + "advancement.twilightforest.hydra_chop": "Chuleta de Hidra, Baby!", + "advancement.twilightforest.hydra_chop.desc": "Disminuye el consumo de carne de %s hydra cuando la barra de comida esté vacía.", + + // Dark Forest Progression + "advancement.twilightforest.progress_trophy_pedestal": "Trofeo de Campeón", + "advancement.twilightforest.progress_trophy_pedestal.desc": "Reclama tu título colocando un trofeo en el pedestal de las ruinas del bosque oscuro.", + "advancement.twilightforest.progress_knights": "Aclimatación de Carminita", + "advancement.twilightforest.progress_knights.desc": "Acomoda a los inquietos fantasmas en la Tumba del Caballero y los dispositivos de la torre de carminita te obedecerán.", + "advancement.twilightforest.ghast_trap": "Algo extraño en la Torre de Madera", + "advancement.twilightforest.ghast_trap.desc": "Mata a los %s alrededor de un %s y actívalo para arrancar el %s del cielo!", + "advancement.twilightforest.progress_ur_ghast": "Lágrimas de Fuego", + "advancement.twilightforest.progress_ur_ghast.desc": "Toca las lágrimas rojas y ardientes de los %s.", + + "advancement.twilightforest.experiment_115": "Carne misteriosa?", + "advancement.twilightforest.experiment_115.desc": "Parece un pastel, aunque...", + "advancement.twilightforest.experiment_115_2": "Tomar nota: ¡Un gran éxito!", + "advancement.twilightforest.experiment_115_2.desc": "Es tan delicioso y húmedo!", + + // Snow Forest Progression + "advancement.twilightforest.progress_yeti": "Pelaje Alfa", + "advancement.twilightforest.progress_yeti.desc": "Cubre tus prendas con el suave pelaje de los %s, manteniéndote a salvo del frío del Glaciar.", + "advancement.twilightforest.progress_glacier": "Cielos Despejados", + "advancement.twilightforest.progress_glacier.desc": "Derrota a los %s encima de los %s.", + "advancement.twilightforest.arctic_dyed": "Ponerse a la Moda", + "advancement.twilightforest.arctic_dyed.desc": "Tiñe las cuatro piezas de la Armadura Ártica.", + + // Mid-way Misc. Stuff + "advancement.twilightforest.glass_sword": "Una Maravilla De Un Solo Golpe", + "advancement.twilightforest.glass_sword.desc": "Espero que lo hayas aprovechado.", + + "advancement.twilightforest.fiery_set": "Galones de Sangre y Lágrimas", + "advancement.twilightforest.fiery_set.desc": "Empuña una herramienta o arma mientras tienes al menos una pieza de armadura de ardiente en tu inventario.", + + // Highlands + "advancement.twilightforest.progress_merge": "Enfrentamiento Final", + "advancement.twilightforest.progress_merge.desc": "Mata a los %s, %s y %s para eliminar la lluvia ácida y envalentonarte para las Tierras Altas.", + "advancement.twilightforest.troll": "Trolleamos un Poco", + "advancement.twilightforest.troll.desc": "Encuentra y mata a un %s.", + "advancement.twilightforest.beanstalk": "Jack y las Habichuelas", + "advancement.twilightforest.beanstalk.desc": "Consigue algunos %s en las cuevas de los trolls y úsalos en el suelo brillante bajo las nubes.", + "advancement.twilightforest.giants": "Estoy en las Nubes", + "advancement.twilightforest.giants.desc": "Mata a un %s en las nubes, recupera un %s, y vuelve a las cuevas de los trolls.", + "advancement.twilightforest.progress_troll": "Deseo Más Quemaduras", + "advancement.twilightforest.progress_troll.desc": "Encuentra los %s en las cuevas de los trolls, y podrás quemar las barreras de espinas.", + "advancement.twilightforest.progress_thorns": "Más Allá De Las Espinas [NYI]", + "advancement.twilightforest.progress_thorns.desc": "Pasa por las Tierras Espinosas y desbloquea la puerta del castillo.", + "advancement.twilightforest.progress_castle": "Wow Que Super Castillo!!! [NYI]", + "advancement.twilightforest.progress_castle.desc": "Qué podría haber en ese castillo?!?", + + // Collections + "advancement.twilightforest.twilight_dining": "Cenamos en el Eterno Atardecer", + "advancement.twilightforest.twilight_dining.desc": "Come toda la comida exclusiva de Twilight Forest.", + "advancement.twilightforest.experiment_115_3": "Comer 115 cada día, 115 años, para siempre", + "advancement.twilightforest.experiment_115_3.desc": "comer experimento ciento quince durante todo el día, para siempre, ciento quince veces experimento ciento quince, experimento ciento quince punto com, doble-u doble-u punto experimento ciento quince punto com, ciento quince años, cada minuto experimento ciento quince punto com, doble-u doble-u punto ciento quince punto com", + "advancement.twilightforest.arborist": "Dendrologista Maníaco", + "advancement.twilightforest.arborist.desc": "Prepara tus hachas y tijeras. Busca en todos los rincones y consigue todo lo que provenga de los árboles. Construye, saquea y obtén cada tabla... árbol joven... hojas... más... todo. ¡TODO!", + + "twilightforest.twilight_portal.unsafe": "No parece seguro aquí...", + "twilightforest.trophy_pedestal.ineligible": "No eres digno.", + "twilightforest.ore_meter.range": "Radio: %s, Origen: [%s, %s]", + "twilightforest.ore_meter.exposed": "Expuesto: %s", + "twilightforest.scepter_charges": "Quedan %d cargas", + + // Commands + "commands.tffeature.usage": "/tffeature ", + "commands.tffeature.not_in_twilight_forest": "You are not in the Twilight Forest dimension", + "commands.tffeature.nearest": "The nearest feature is %s", + "commands.tffeature.center": "Center of feature: %s", + "commands.tffeature.chunk": "Are in feature chunk: %s", + "commands.tffeature.structure.inside": "You are in the structure for that feature", + "commands.tffeature.structure.outside": "You are not in the structure for that feature", + "commands.tffeature.structure.required": "You are not in a structure", + "commands.tffeature.structure.conquer.status": "Structure conquer flag: %s", + "commands.tffeature.structure.conquer.update": "Structure conquer flag was %s, changing to %s", + "commands.tffeature.locate.usage": "/tffeature locate ", + "commands.tfreload.reload": "Reloading Twilight Forest Shaders!", + + // Biomes + "biome.twilightforest.forest": "Bosque Crepuscular", + "biome.twilightforest.dense_forest": "Bosque Denso", + "biome.twilightforest.firefly_forest": "Bosque de las Luciérnagas", + "biome.twilightforest.clearing": "Despeje Crepuscular", + "biome.twilightforest.oak_savannah": "Sabana de Roble", + "biome.twilightforest.stream": "Corriente Crepuscular", + "biome.twilightforest.lake": "Lago Crepuscular", + "biome.twilightforest.mushroom_forest": "Bosque de Hongos", + "biome.twilightforest.dense_mushroom_forest": "Bosque Denso de Hongos", + "biome.twilightforest.enchanted_forest": "Bosque Encantado", + "biome.twilightforest.spooky_forest": "Bosque Espeluznante", + "biome.twilightforest.swamp": "TPantano Crepuscular", + "biome.twilightforest.fire_swamp": "Pantano de Fuego", + "biome.twilightforest.dark_forest": "Bosque Oscuro", + "biome.twilightforest.dark_forest_center": "Centro del Bosque Oscuro", + "biome.twilightforest.snowy_forest": "Bosque Nevado", + "biome.twilightforest.glacier": "Glaciar Crepuscular", + "biome.twilightforest.highlands": "Tierras Altas Crepusculares", + "biome.twilightforest.thornlands": "Tierras Espinosas", + "biome.twilightforest.final_plateau": "Meseta Final", + + // Gamerules + "gamerule.tfEnforcedProgression": "Progresión de Twilight Forest", + + // Enchantments + "enchantment.twilightforest.fire_react": "Reacción al Fuego", + "enchantment.twilightforest.chill_aura": "Aura fría", + + // Effects + "effect.twilightforest.frosted": "Escarchado", + + // Blocks + "block.twilightforest.twilight_oak_log": "Tronco de Roble Crepuscular", + "block.twilightforest.canopy_log": "Tronco de Dosel Arbóreo", + "block.twilightforest.mangrove_log": "Tronco de Manglar", + "block.twilightforest.dark_log": "Tronco de Madera Oscura", + "block.twilightforest.stripped_twilight_oak_log": "Tronco de Roble Crepuscular Sin Corteza", + "block.twilightforest.stripped_canopy_log": "Tronco de Dosel Arbóreo Sin Corteza", + "block.twilightforest.stripped_mangrove_log": "Tronco de Manglar Sin Corteza", + "block.twilightforest.stripped_dark_log": "Tronco de Madera Oscura Sin Corteza", + "block.twilightforest.twilight_oak_wood": "Madera de Roble Crepuscular", + "block.twilightforest.canopy_wood": "Madera de Dosel Arbóreo", + "block.twilightforest.mangrove_wood": "Madera de Manglar", + "block.twilightforest.dark_wood": "Madera Oscura", + "block.twilightforest.stripped_twilight_oak_wood": "Madera de Roble Crepuscular Sin Corteza", + "block.twilightforest.stripped_canopy_wood": "Madera de Dosel Arbóreo Sin Corteza", + "block.twilightforest.stripped_mangrove_wood": " Madera de Manglar Despojada", + "block.twilightforest.stripped_dark_wood": " Madera oscura despojada", + "block.twilightforest.twilight_oak_leaves": "Hojas de Roble Crepuscular", + "block.twilightforest.canopy_leaves": "Hojas de Dosel Arbóreo", + "block.twilightforest.mangrove_leaves": "Hojas de Manglar", + "block.twilightforest.rainboak_leaves": "Hojas de Roble Arco Iris", + "block.twilightforest.firefly": "Luciérnaga", + "block.twilightforest.cicada": "Cigarra", + "block.twilightforest.cicada.desc": "Y si esto se pudiera lanzar contra alguien con un cañón de riel...?", + "block.twilightforest.twilight_portal": "Portal de Twilight Forest", + "block.twilightforest.maze_stone": "Piedra de Laberinto", + "block.twilightforest.maze_stone_brick": "Ladrillos de Piedra de Laberinto", + "block.twilightforest.maze_stone_chiseled": "Piedra de Laberinto Grabados", + "block.twilightforest.maze_stone_decorative": "Ladrillos de Piedra de Laberinto Decorativo", + "block.twilightforest.maze_stone_cracked": "Piedra de Laberinto Agrietada", + "block.twilightforest.maze_stone_mossy": "Piedra de Laberinto Musgosa", + "block.twilightforest.maze_stone_mosaic": "Mosaicos de Piedra del Laberinto", + "block.twilightforest.maze_stone_border": "Borde de Piedra de Laberinto", + "block.twilightforest.maze_stone_ceiling": "Techo de Piedra de Laberinto", + "block.twilightforest.spiral_bricks": "Ladrillos en Espiral", + "block.twilightforest.hedge": "Cobertura", + "block.twilightforest.boss_spawner_naga": "Generador de Jefe Naga", + "block.twilightforest.boss_spawner_lich": "Generador de Jefe Lich", + "block.twilightforest.boss_spawner_minoshroom": "Generador de Jefe Minosetauro", + "block.twilightforest.boss_spawner_hydra": "Generador de Jefe Hidra", + "block.twilightforest.boss_spawner_knight_phantom": "Generador de Jefe Caballero Fantasma", + "block.twilightforest.boss_spawner_ur_ghast": "Genrador de Jefe Ur-Ghast", + "block.twilightforest.boss_spawner_alpha_yeti": "Generador de Jefe Yeti", + "block.twilightforest.boss_spawner_snow_queen": "Generador de Jefe Reina de las Nieves", + "block.twilightforest.boss_spawner_final_boss": "Generador de Jefe Final", + "block.twilightforest.firefly_jar": "Jarra con Luciérnaga", + "block.twilightforest.cicada_jar": "Jarra con Cigarra", + "block.twilightforest.moss_patch": "Parche de Musgo [WIP]", + "block.twilightforest.mayapple": "Mayapple", + "block.twilightforest.clover_patch": "Hoja de Trébol [NYI]", + "block.twilightforest.fiddlehead": "Brotes de Helecho", + "block.twilightforest.mushgloom": "Hongo Brillante", + "block.twilightforest.torchberry_plant": "Planta de Antorcha", + "block.twilightforest.root_strand": "Hilos de raíz", + "block.twilightforest.fallen_leaves": "Montón de hojas", + "block.twilightforest.root": "Raíces", + "block.twilightforest.liveroot_block": "Raíces vivas", + "block.twilightforest.uncrafting_table": "Mesa de Desfabricación", + "block.twilightforest.smoker": "Ahumador", + "block.twilightforest.encased_smoker": "Ahumador Encapsulado", + "block.twilightforest.fire_jet": "Chorro de Fuego", + "block.twilightforest.encased_fire_jet": "Chorro de Fuego Encapsulado", + "block.twilightforest.naga_stone_head": "Cabeza de Piedra de Naga", + "block.twilightforest.naga_stone": "Piedra de Naga", + "block.twilightforest.twilight_oak_sapling": "Retoño de Roble Crepuscular Enfermizo", + "block.twilightforest.canopy_sapling": "Retoño de Dosel Arbóreo", + "block.twilightforest.mangrove_sapling": "Retoño de Manglar Crepuscular", + "block.twilightforest.darkwood_sapling": "Retoño del Árbol de Madera Oscura", + "block.twilightforest.hollow_oak_sapling": "Retoño de Roble Robusto Crepuscular", + "block.twilightforest.time_sapling": "Retoño del Árbol del Tiempo", + "block.twilightforest.transformation_sapling": "Retoño del Árbol de Transformación", + "block.twilightforest.mining_sapling": "Retoño del Árbol Minero", + "block.twilightforest.sorting_sapling": "Retoño del Árbol de Clasificación", + "block.twilightforest.rainboak_sapling": "Retoño de Roble Arcoíris", + "block.twilightforest.moonworm": "Gusano Lunar", + "block.twilightforest.time_log": "Tronco del Árbol del Tiempo", + "block.twilightforest.transformation_log": "Tronco del Árbol de Transformación", + "block.twilightforest.mining_log": "Tronco del Árbol Minero", + "block.twilightforest.sorting_log": "Tronco del Árbol de Clasificación", + "block.twilightforest.stripped_time_log": "Tronco Sin Corteza del Árbol del Tiempo", + "block.twilightforest.stripped_transformation_log": "Tronco Sin Corteza del Árbol de Transformación", + "block.twilightforest.stripped_mining_log": "Tronco Sin Corteza del Árbol Minero", + "block.twilightforest.stripped_sorting_log": "Tronco Sin Corteza del Árbol de Clasificación", + "block.twilightforest.sorting_wood": "Madera del Árbol de Clasificación", + "block.twilightforest.mining_wood": "Madera del Árbol Minero", + "block.twilightforest.transformation_wood": "Madera del Árbol de Transformación", + "block.twilightforest.time_wood": "Madera del Árbol del Tiempo", + "block.twilightforest.stripped_sorting_wood": "Madera Pelada del Árbol de Clasificación", + "block.twilightforest.stripped_mining_wood": "Madera Pelada del Árbol Minero", + "block.twilightforest.stripped_transformation_wood": "Madera Pelada del Árbol de Transformación", + "block.twilightforest.stripped_time_wood": "Madera Pelada del Árbol del Tiempo", + "block.twilightforest.time_log_core": "Reloj del Árbol del Tiempo", + "block.twilightforest.transformation_log_core": "Corazón del Árbol de Transformación", + "block.twilightforest.mining_log_core": "Núcleo del Árbol Minero", + "block.twilightforest.sorting_log_core": "Motor del Árbol de Clasificación", + "block.twilightforest.time_leaves": "Hojas del Árbol del Tiempo", + "block.twilightforest.transformation_leaves": "Hojas del Árbol de Transformación", + "block.twilightforest.mining_leaves": "Hojas del Árbol Minero", + "block.twilightforest.sorting_leaves": "Hojas del Árbol de Clasificación", + "block.twilightforest.tower_wood": "Tablones de la Torre de Madera", + "block.twilightforest.tower_wood_encased": "Madera Encapsulada de la Torre de Madera", + "block.twilightforest.tower_wood_cracked": "Madera Agrietada de la Torre de Madera", + "block.twilightforest.tower_wood_mossy": "Madera Musgosa de la Torre de Madera", + "block.twilightforest.tower_wood_infested": "Madera Infestada de la Torre de Madera", + "block.twilightforest.reappearing_block": "Bloque Reaparecedor", + "block.twilightforest.vanishing_block": "Bloque de Desaparición", + "block.twilightforest.locked_vanishing_block": "Bloque de Desaparición Bloqueado", + "block.twilightforest.carminite_builder": "Constructor de Carminita", + "block.twilightforest.antibuilder": "Anti-Construcción", + "block.twilightforest.ghast_trap": "Trampa de Ghast", + "block.twilightforest.carminite_reactor": "Reactor de Carminita", + "block.twilightforest.fake_gold": "Oro Falso", + "block.twilightforest.fake_diamond": "Diamante Falso", + "block.twilightforest.trophy": "Trofeo de Twilight Forest", + "block.twilightforest.stronghold_shield": "Escudo de la Fortaleza", + "block.twilightforest.trophy_pedestal": "Pedestal para Trofeos", + "block.twilightforest.aurora_block": "Bloque de Aurora", + "block.twilightforest.underbrick": "Subsuelo de Ladrillos", + "block.twilightforest.underbrick_mossy": "Subsuelo de Ladrillos Musgoso", + "block.twilightforest.underbrick_cracked": "Subsuelo de Ladrillos Agrietado", + "block.twilightforest.underbrick_floor": "Piso de Subsuelo de Ladrillos [NYI]", + "block.twilightforest.brown_thorns": "Espinas", + "block.twilightforest.green_thorns": "Espinas Verdes", + "block.twilightforest.burnt_thorns": "Espinas Quemadas", + "block.twilightforest.thorn_rose": "Rosa Espinosa", + "block.twilightforest.thorn_leaves": "Hojas de Espinas", + "block.twilightforest.beanstalk_leaves": "Hojas de Frijol", + "block.twilightforest.deadrock_weathered": "Roca Muerta Desgastada", + "block.twilightforest.deadrock_cracked": "Roca Muerta Agrietada", + "block.twilightforest.deadrock": "Roca Muerta", + "block.twilightforest.dark_leaves": "Hojas de Madera Oscura", + "block.twilightforest.auroralized_glass": "Vidrio Auroralizado [NYI]", + "block.twilightforest.aurora_pillar": "Pilar de Aurora", + "block.twilightforest.aurora_slab": "Losa de Aurora", + "block.twilightforest.trollsteinn": "Trollsteinn", + "block.twilightforest.wispy_cloud": "Nube de Agua", + "block.twilightforest.fluffy_cloud": "Nube Esponjosa", + "block.twilightforest.giant_cobblestone": "Piedra Labrada Gigante", + "block.twilightforest.giant_log": "Tronco Gigante", + "block.twilightforest.giant_leaves": "Hojas Gigantes", + "block.twilightforest.giant_obsidian": "Obsidiana Gigante", + "block.twilightforest.uberous_soil": "Tierra Uberous", + "block.twilightforest.huge_stalk": "Tallos Enormes", + "block.twilightforest.huge_mushgloom": "Enorme Hongo Brillante", + "block.twilightforest.huge_mushgloom_stem": "Enorme Tallo de Hongo Brillante", + "block.twilightforest.trollvidr": "Trollvidr", + "block.twilightforest.unripe_trollber": "Trollber Sin madurar", + "block.twilightforest.trollber": "Trollber", + "block.twilightforest.slider": "Trampa Deslizante [NYI]", + "block.twilightforest.knightmetal_block": "Bloque Hecho del Caballero de Metal", + "block.twilightforest.huge_lilypad": "Enorme Almohadilla de Lirio", + "block.twilightforest.huge_waterlily": "Enorme Lirio de Agua", + "block.twilightforest.castle_brick": "Ladrillos del Castillo", + "block.twilightforest.castle_brick_worn": "Ladrillos Desgastados del Castillo", + "block.twilightforest.castle_brick_cracked": "Ladrillos Agrietados del Castillo", + "block.twilightforest.castle_brick_roof": "Azulejo del Techo del Castillo", + "block.twilightforest.castle_brick_mossy": "Ladrillos Musgosos del Castillo", + "block.twilightforest.castle_brick_frame": "Ladrillos Gruesos del Castillo", + "block.twilightforest.castle_stairs_brick": "Escaleras de Ladrillo del Castillo", + "block.twilightforest.castle_stairs_worn": "Escaleras Desgastadas de Ladrillo del Castillo", + "block.twilightforest.castle_stairs_cracked": "Escaleras Agrietadas de Ladrillo del Castillo", + "block.twilightforest.castle_stairs_mossy": "Escaleras Musgosas de Ladrillo del Castillo", + "block.twilightforest.castle_door_yellow": "Puerta Amarilla del Castillo", + "block.twilightforest.castle_door_purple": "Puerta Violeta del Castillo", + "block.twilightforest.castle_door_pink": "Puerta Rosada del Castillo", + "block.twilightforest.castle_door_blue": "Puerta Azul del Castillo", + "block.twilightforest.castle_rune_brick_pink": "Ladrillo Rúnico Rosa del Castillo ", + "block.twilightforest.castle_rune_brick_blue": "Ladrillo Rúnico Azul del Castillo", + "block.twilightforest.castle_rune_brick_yellow": "Ladrillo Rúnico Amarillo del Castillo", + "block.twilightforest.castle_rune_brick_purple": "Ladrillo Rúnico Morado del Castillo", + "block.twilightforest.castle_pillar_encased": "Pilar Encapsulado de Ladrillo del Castillo ", + "block.twilightforest.castle_pillar_encased_tile": "Azulejo Encapsulado de Ladrillos del Castillo ", + "block.twilightforest.castle_pillar_bold": "Pilar Audaz de Ladrillos del Castillo", + "block.twilightforest.castle_pillar_bold_tile": "Azulejo Audaz de Ladrillo del Castillo ", + "block.twilightforest.castle_stairs_encased": "Escaleras Encapsuladas de Ladrillo del Castillo", + "block.twilightforest.castle_stairs_bold": "Escaleras Audaces de Ladrillo del Castillo", + "block.twilightforest.force_field_purple": "Campo de Fuerza Violeta", + "block.twilightforest.force_field_pink": "Campo de Fuerza Rosa", + "block.twilightforest.force_field_orange": "Campo de Fuerza Naranja", + "block.twilightforest.force_field_green": "Campo de Fuerza Verde", + "block.twilightforest.force_field_blue": "Campo de Fuerza Azul", + "block.twilightforest.ironwood_block": "Bloque de Madera de Hierro", + "block.twilightforest.fiery_block": "Bloque de Metal Ardiente", + "block.twilightforest.steeleaf_block": "Bloque de Hoja de Acero", + "block.twilightforest.arctic_fur_block": "Bloque de Pelaje Ártico", + "block.twilightforest.carminite_block": "Bloque de Carminita", + "block.twilightforest.cinder_furnace": "Horno de Ceniza [NYI]", + "block.twilightforest.cinder_log": "Tronco de Ceniza [NYI]", + "block.twilightforest.cinder_wood": "Madera de Ceniza [NYI]", + "block.twilightforest.twilight_portal_miniature_structure": "Portal Miniatura de Twilight [NYI]", + "block.twilightforest.naga_courtyard_miniature_structure": "Patio Naga Miniatura [NYI]", + "block.twilightforest.lich_tower_miniature_structure": "Torre del Lich Miniatura [NYI]", + "block.twilightforest.stone_twist": "Piedra Torcida [NYI]", + "block.twilightforest.stone_twist_thin": "Pilar de Piedra [NYI]", + "block.twilightforest.lapis_block": "Bloque de Lapislázuli [NYI]", + "block.twilightforest.etched_nagastone": "Piedra Naga Grabada", + "block.twilightforest.nagastone_pillar": "Pilar de Piedra Naga", + "block.twilightforest.nagastone_stairs_left": "Escaleras de Piedra Naga (Izquierda)", + "block.twilightforest.nagastone_stairs_right": "Escaleras de Piedra Naga (Derecha)", + "block.twilightforest.etched_nagastone_mossy": "Piedra Naga con Grabado Musgoso", + "block.twilightforest.nagastone_pillar_mossy": "Pilar de Piedra Naga Musgosa", + "block.twilightforest.nagastone_stairs_mossy_left": "Escaleras Musgosa de Piedra Naga (Izquierda)", + "block.twilightforest.nagastone_stairs_mossy_right": "Escaleras Musgosa de Piedra Naga (Derecha)", + "block.twilightforest.etched_nagastone_weathered": "Piedra Naga Grabada en Ruinas", + "block.twilightforest.nagastone_pillar_weathered": "Pilar de Piedra Naga en Ruinas", + "block.twilightforest.nagastone_stairs_weathered_left": "Escaleras de Piedra de Naga desgastadas (Izquierda)", + "block.twilightforest.nagastone_stairs_weathered_right": "Escaleras de Piedra de Naga desgastadas (Derecha)", + "block.twilightforest.iron_ladder": "Escalera de Hierro", + "block.twilightforest.terrorcotta_circle": "Terracota (Circular)", + "block.twilightforest.terrorcotta_diagonal": "Terracota (Diagonal)", + "block.twilightforest.experiment_115": "Experimento 115", + "block.twilightforest.hydra_trophy": "Trofeo de Hidra", + "block.twilightforest.naga_trophy": "Trofeo de Naga", + "block.twilightforest.minoshroom_trophy": "Trofeo de Minosetauro", + "block.twilightforest.knight_phantom_trophy": "Trofeo de Caballero Fantasma", + "block.twilightforest.lich_trophy": "Trofeo de Lich", + "block.twilightforest.ur_ghast_trophy": "Trofeo de Ur-Ghast", + "block.twilightforest.yeti_trophy": "Trofeo de Yeti Alfa", + "block.twilightforest.snow_queen_trophy": "Trofeo de Reina de las Nieves", + "block.twilightforest.quest_ram_trophy": "Trofeo del Carnero de la Búsqueda", + + "block.twilightforest.keepsake_casket": "Ataúd del recuerdo [WIP]", + "block.twilightforest.casket.broken": "Tu Ataúd está demasiado dañado para contener más objetos. Todos los artículos que se guardaron en tu ataúd se cayeron al suelo..", + "block.twilightforest.casket.locked": "¡Este Ataúd sólo puede ser abierto por %s!", + + "block.twilightforest.potted_twilight_oak_sapling": "Retoño del Árbol de Roble Crepuscular en Maceta", + "block.twilightforest.potted_canopy_sapling": "Retoño de Dosel Arbóreo en Maceta", + "block.twilightforest.potted_mangrove_sapling": "Retoño de Manglar Crepuscular en Maceta", + "block.twilightforest.potted_darkwood_sapling": "Retoño del Árbol de Madera Oscura en Maceta", + "block.twilightforest.potted_hollow_oak_sapling": "Retoño de Roble Robusto Crepuscular en Maceta", + "block.twilightforest.potted_rainboak_sapling": "Retoño del Árbol de Roble Arcoíris en Maceta", + "block.twilightforest.potted_time_sapling": "Retoño del Árbol del Tiempo en Maceta", + "block.twilightforest.potted_trans_sapling": "Retoño del Árbol de la Transformación en Maceta", + "block.twilightforest.potted_mine_sapling": "Retoño del Árbol Minero en Maceta", + "block.twilightforest.potted_sort_sapling": "Retoño del Árbol de la Clasificación en Maceta", + "block.twilightforest.potted_mayapple": "Mayapple en Maceta", + "block.twilightforest.potted_fiddlehead": "Brotes de Helecho en Maceta", + "block.twilightforest.potted_mushgloom": "Hongo Brillante en Maceta", + "block.twilightforest.potted_thorn": "Espinas en Maceta", + "block.twilightforest.potted_green_thorn": "Espinas Verdes en Maceta", + "block.twilightforest.potted_dead_thorn": "Espinas Quemadas en Maceta", + + "block.twilightforest.canopy_planks": "Tablones de Dosel Arbóreo", + "block.twilightforest.canopy_stairs": "Esquelaras de Dosel Arbóreo", + "block.twilightforest.canopy_slab": "Losa de Dosel Arbóreo", + "block.twilightforest.canopy_button": "Botón de Dosel Arbóreo", + "block.twilightforest.canopy_fence": "Valla de Dosel Arbóreo", + "block.twilightforest.canopy_gate": "Puerta de Dosel Arbóreo", + "block.twilightforest.canopy_plate": "Placa de Presión de Dosel Arbóreo", + "block.twilightforest.canopy_trapdoor": "Trampilla de Dosel Arbóreo", + "block.twilightforest.canopy_door": "Puerta de Dosel Arbóreo", + "block.twilightforest.canopy_sign": "Letrero de Dosel Arbóreo", + "block.twilightforest.canopy_wall_sign": "Cuadro de Dosel Arbóreo", + + "block.twilightforest.dark_planks": "Tablones de Madera Oscura", + "block.twilightforest.dark_stairs": "Esquelaras de Madera Oscura", + "block.twilightforest.dark_slab": "Losa de Madera Oscura", + "block.twilightforest.dark_button": "Botón de Madera Oscura", + "block.twilightforest.dark_fence": "Valla de Madera Oscura", + "block.twilightforest.dark_gate": "Puerta de Valla de Madera Oscura", + "block.twilightforest.dark_plate": "Placa de Presión de Madera Oscura", + "block.twilightforest.dark_trapdoor": "Trampilla de Madera Oscura", + "block.twilightforest.dark_door": "Puerta de Madera Oscura", + "block.twilightforest.darkwood_sign": "Letrero de Madera Oscura", + "block.twilightforest.darkwood_wall_sign": "Cuadro de Madera Oscura", + + "block.twilightforest.mangrove_planks": "Tablones de Manglar", + "block.twilightforest.mangrove_stairs": "Esquelaras de Manglar", + "block.twilightforest.mangrove_slab": "Losa de Manglar", + "block.twilightforest.mangrove_button": "Botón de Manglar", + "block.twilightforest.mangrove_fence": "Valla de Manglar", + "block.twilightforest.mangrove_gate": "Puerta de Valla de Manglar", + "block.twilightforest.mangrove_plate": "Placa de Presión de Manglar", + "block.twilightforest.mangrove_trapdoor": "Trampilla de Manglar", + "block.twilightforest.mangrove_door": "Puerta de Manglar", + "block.twilightforest.mangrove_sign": "Letrero de Manglar", + "block.twilightforest.mangrove_wall_sign": "Cuadro de Manglar", + + "block.twilightforest.twilight_oak_planks": "Tablones de Roble Crepuscular", + "block.twilightforest.twilight_oak_stairs": "Esquelaras de Roble Crepuscular", + "block.twilightforest.twilight_oak_slab": "Losa de Roble Crepuscular", + "block.twilightforest.twilight_oak_button": "Botón de Roble Crepuscular", + "block.twilightforest.twilight_oak_fence": "Valla de Roble Crepuscular", + "block.twilightforest.twilight_oak_gate": "Puerta de Valla de Roble Crepuscular", + "block.twilightforest.twilight_oak_plate": "Placa de Presión de Roble Crepuscular", + "block.twilightforest.twilight_oak_trapdoor": "Trampilla de Roble Crepuscular", + "block.twilightforest.twilight_oak_door": "Puerta de Roble Crepuscular", + "block.twilightforest.twilight_oak_sign": "Letrero de Roble Crepuscular", + "block.twilightforest.twilight_wall_sign": "Cuadro de Roble Crepuscular", + + "block.twilightforest.time_planks": "Tablones del Árbol del Tiempo", + "block.twilightforest.time_stairs": "Esquelaras del Árbol del Tiempo", + "block.twilightforest.time_slab": "Losa del Árbol del Tiempo", + "block.twilightforest.time_button": "Botón del Árbol del Tiempo", + "block.twilightforest.time_fence": "Valla del Árbol del Tiempo", + "block.twilightforest.time_gate": "Puerta de Valla del Árbol del Tiempo", + "block.twilightforest.time_plate": "Placa de Presión del Árbol del Tiempo", + "block.twilightforest.time_trapdoor": "Trampilla del Árbol del Tiempo", + "block.twilightforest.time_door": "Puerta del Árbol del Tiempo", + "block.twilightforest.time_sign": "Letrero del Árbol del Tiempo", + "block.twilightforest.time_wall_sign": "Cuadro del Árbol del Tiempo", + + "block.twilightforest.trans_planks": "Tablones del Árbol de Transformación", + "block.twilightforest.trans_stairs": "Esquelaras del Árbol de Transformación", + "block.twilightforest.trans_slab": "Losa del Árbol de Transformación", + "block.twilightforest.trans_button": "Botón del Árbol de Transformación", + "block.twilightforest.trans_fence": "Valla del Árbol de Transformación", + "block.twilightforest.trans_gate": "Puerta de Valla del Árbol de Transformación", + "block.twilightforest.trans_plate": "Placa de Presión del Árbol de Transformación", + "block.twilightforest.trans_trapdoor": "Trampilla del Árbol de Transformación", + "block.twilightforest.trans_door": "Puerta del Árbol de Transformación", + "block.twilightforest.trans_sign": "Letrero del Árbol de Transformación", + "block.twilightforest.trans_wall_sign": "Cuadro del Árbol de Transformación", + + "block.twilightforest.mine_planks": "Tablones del Árbol Minero", + "block.twilightforest.mine_stairs": "Esquelaras del Árbol Minero", + "block.twilightforest.mine_slab": "Losa del Árbol Minero", + "block.twilightforest.mine_button": "Botón del Árbol Minero", + "block.twilightforest.mine_fence": "Valla del Árbol Minero", + "block.twilightforest.mine_gate": "Puerta de Valla del Árbol Minero", + "block.twilightforest.mine_plate": "Placa de Presión del Árbol Minero", + "block.twilightforest.mine_trapdoor": "Trampilla del Árbol Minero", + "block.twilightforest.mine_door": "Puerta del Árbol Minero", + "block.twilightforest.mine_sign": "Letrero del Árbol Minero", + "block.twilightforest.mine_wall_sign": "Cuadro del Árbol Minero", + + "block.twilightforest.sort_planks": "Tablones del Árbol de Clasificación", + "block.twilightforest.sort_stairs": "Esquelaras del Árbol de Clasificación", + "block.twilightforest.sort_slab": "Losa del Árbol de Clasificación", + "block.twilightforest.sort_button": "Botón del Árbol de Clasificación", + "block.twilightforest.sort_fence": "Valla del Árbol de Clasificación", + "block.twilightforest.sort_gate": "Puerta de Valla del Árbol de Clasificación", + "block.twilightforest.sort_plate": "Placa de Presión del Árbol de Clasificación", + "block.twilightforest.sort_trapdoor": "Trampilla del Árbol de Clasificación", + "block.twilightforest.sort_door": "Puerta del Árbol de Clasificación", + "block.twilightforest.sort_sign": "Letrero del Árbol de Clasificación", + "block.twilightforest.sort_wall_sign": "Cuadro del Árbol de Clasificación", + + "block.steeleaf.tooltip": "Reduce el daño por caída en un 25%.", + "block.arctic.tooltip": "Reduce el daño por caída en un 90%", + "block.knightmetal.tooltip": "Funciona como un cactus más fuerte", + + // Structures + "structure.twilight_portal": "Portal de Twilight", + "structure.hedge_maze": "Laberinto de Setos", + "structure.hollow_hill": "Colina Hueca", + "structure.quest_grove": "Búsqueda de la Arboleda", + "structure.mushroom_tower": "Castillo de los Hongos", + "structure.naga_courtyard": "Patio Naga", + "structure.lich_tower": "Torre del Lich", + "structure.minotaur_labyrinth": "Laberinto del Minotauro", + "structure.hydra_lair": "Guarida de la Hidra", + "structure.goblin_stronghold": "Fortaleza de los Goblins", + "structure.dark_tower": "La Torre Oscura", + "structure.yeti_cave": "Cueva del Yeti", + "structure.aurora_palace": "Palacio Aurora", + "structure.troll_cave_and_cloud_castle": "Cueva de los Trolls y Casa en las Nubes", + "structure.final_castle": "Castillo Final", + + // Items + "item.twilightforest.boarkchop": "Chuleta de Boark", + "item.twilightforest.naga_scale": "Escama Naga", + "item.twilightforest.naga_chestplate": "Tunica de Escama Naga", + "item.twilightforest.naga_leggings": "Mallas de Escama Naga", + "item.twilightforest.twilight_scepter": "Cetro Crepuscular", + "item.twilightforest.lifedrain_scepter": "Cetro de Robo de Vida", + "item.twilightforest.zombie_scepter": "Cetro Zombie", + "item.twilightforest.shield_scepter": "Cetro de Fortificación", + "item.twilightforest.ore_meter": "Medidor de Minerales [NYI]", + "item.twilightforest.magic_map": "Mapa Mágico", + "item.twilightforest.maze_map": "Mapa del Laberinto", + "item.twilightforest.ore_map": "Mapa de Laberinto/Mineral", + "item.twilightforest.raven_feather": "Pluma de Cuervo", + "item.twilightforest.magic_map_focus": "Enfoque del Mapa Mágico", + "item.twilightforest.maze_map_focus": "Enfoque del Mapa del Laberinto", + "item.twilightforest.liveroot": "Raíces Vivas", + "item.twilightforest.ironwood_raw": "Materiales de Madera de Hierro en Bruto", + "item.twilightforest.ironwood_ingot": "Lingote de Madera de Hierro", + "item.twilightforest.ironwood_helmet": "Casco de Madera de Hierro", + "item.twilightforest.ironwood_chestplate": "Pechera de Madera de Hierro", + "item.twilightforest.ironwood_leggings": "Pantalones de Madera de Hierro", + "item.twilightforest.ironwood_boots": "Botas de Madera de Hierro", + "item.twilightforest.ironwood_sword": "Espada de Madera de Hierro", + "item.twilightforest.ironwood_shovel": "Pala de Madera de Hierro", + "item.twilightforest.ironwood_pickaxe": "Pico de Madera de Hierro", + "item.twilightforest.ironwood_axe": "Hacha de Madera de Hierro", + "item.twilightforest.ironwood_hoe": "Azada de Madera de Hierro", + "item.twilightforest.torchberries": "Bayas de Antorcha", + "item.twilightforest.raw_venison": "Venado Crudo", + "item.twilightforest.cooked_venison": "Filete de Venado", + "item.twilightforest.hydra_chop": "Chuleta de Hidra", + "item.twilightforest.fiery_blood": "Sangre Ardiente", + "item.twilightforest.fiery_ingot": "Lingote Ardiente", + "item.twilightforest.fiery_helmet": "Casco Ardiente", + "item.twilightforest.fiery_chestplate": "Pechera Ardiente", + "item.twilightforest.fiery_leggings": "Pantalones Ardientes", + "item.twilightforest.fiery_boots": "Botas Ardientes", + "item.twilightforest.fiery_sword": "Espada Ardiente", + "item.twilightforest.fiery_pickaxe": "Pico Ardiente", + "item.twilightforest.steeleaf_ingot": "Hoja de Acero", + "item.twilightforest.steeleaf_helmet": "Casco de Hoja de Acero", + "item.twilightforest.steeleaf_chestplate": "Pechera de Hoja de Acero", + "item.twilightforest.steeleaf_leggings": "Pantalones de de Hoja de Acero", + "item.twilightforest.steeleaf_boots": "Botas de Hoja de Acero", + "item.twilightforest.steeleaf_sword": "Espeda de Hoja de Acero", + "item.twilightforest.steeleaf_shovel": "Pala de Hoja de Acero", + "item.twilightforest.steeleaf_pickaxe": "Pico de Hoja de Acero", + "item.twilightforest.steeleaf_axe": "Hacha de Hoja de Acero", + "item.twilightforest.steeleaf_hoe": "Azada de Hoja de Acero", + "item.twilightforest.minotaur_axe": "Hacha de Diamante del Minotauro", + "item.twilightforest.minotaur_axe_gold": "Hacha de Oro del Minotauro", + "item.twilightforest.mazebreaker_pickaxe": "Rompe Laberintos", + "item.twilightforest.transformation_powder": "Polvo de Transformación", + "item.twilightforest.raw_meef": "Carne Cruda", + "item.twilightforest.cooked_meef": "Bistec de Carne", + "item.twilightforest.meef_stroganoff": "Carne Stroganoff", + "item.twilightforest.maze_wafer": "Oblea de Laberinto", + "item.twilightforest.magic_map_empty": "Mapa Mágico en Blanco", + "item.twilightforest.maze_map_empty": "Mapa del Laberinto en Blanco", + "item.twilightforest.ore_map_empty": "Mapa de Laberinto/Minerales en Blanco", + "item.twilightforest.ore_magnet": "Imán de Minerales", + "item.twilightforest.crumble_horn": "Cuerno Desmenuzado", + "item.twilightforest.peacock_fan": "Abanico de Plumas de Pavo Real", + "item.twilightforest.moonworm_queen": "Reina Gusano Lunar", + "item.twilightforest.charm_of_life_1": "Talisman de Vida I", + "item.twilightforest.charm_of_life_2": "Talisman de Vida II", + "item.twilightforest.charm_of_keeping_1": "Talisman de conservación I", + "item.twilightforest.charm_of_keeping_2": "Talisman de conservación II", + "item.twilightforest.charm_of_keeping_3": "Talisman de conservación III", + "item.twilightforest.tower_key": "Llave de la Torre", + "item.twilightforest.borer_essence": "Esencia de Barrenador", + "item.twilightforest.carminite": "Carminita", + "item.twilightforest.tf_trophy": "%s Trofeo", + "item.twilightforest.armor_shard": "Fragmento de Armadura", + "item.twilightforest.knightmetal_ingot": "Lingote Hecho del Caballero de Metal", + "item.twilightforest.armor_shard_cluster": "Grupo de Fragmentos de Armadura", + "item.twilightforest.knightmetal_helmet": "Yelmo del Caballero de Metal", + "item.twilightforest.knightmetal_chestplate": "Pechera del Caballero de Metal", + "item.twilightforest.knightmetal_leggings": "Grebas del Caballero de Metal", + "item.twilightforest.knightmetal_boots": "Botas del Caballero de Metal", + "item.twilightforest.knightmetal_sword": "Espada del Caballero de Metal", + "item.twilightforest.knightmetal_pickaxe": "Pico del Caballero de Metal", + "item.twilightforest.knightmetal_axe": "Hacha del Caballero de Metal", + "item.twilightforest.knightmetal_shield": "Escudo del Caballero de Metal", + "item.twilightforest.phantom_helmet": "Casco de Fantasma", + "item.twilightforest.phantom_chestplate": "Pechera de Fantasma", + "item.twilightforest.lamp_of_cinders": "Lámpara de Cenizas", + "item.twilightforest.fiery_tears": "Lágrimas de Fuego", + "item.twilightforest.ice_bomb": "Bomba de Hielo", + "item.twilightforest.yeti_helmet": "Casco con Cuernos del Yeti", + "item.twilightforest.yeti_chestplate": "Chaqueta del Yeti", + "item.twilightforest.yeti_leggings": "Pantalones del Yeti", + "item.twilightforest.yeti_boots": "Botas del Yeti", + "item.twilightforest.alpha_fur": "Pelaje de Yeti Alfa", + "item.twilightforest.arctic_fur": "Pelaje del Ártico", + "item.twilightforest.arctic_helmet": "Capucha del Ártico", + "item.twilightforest.arctic_chestplate": "Chaqueta Ártica", + "item.twilightforest.arctic_leggings": "Pantalones del Ártico", + "item.twilightforest.arctic_boots": "Botas del Ártico", + "item.twilightforest.magic_beans": "Frijoles Mágicos", + "item.twilightforest.giant_pickaxe": "Pico del Gigante", + "item.twilightforest.giant_sword": "Espada del Gigante", + "item.twilightforest.triple_bow": "Arco triple", + "item.twilightforest.seeker_bow": "Arco Buscador", + "item.twilightforest.ice_bow": "Arco de hielo", + "item.twilightforest.ender_bow": "Arco de Ender", + "item.twilightforest.ice_sword": "Espada de Hielo", + "item.twilightforest.glass_sword": "Espada de Vidrio", + "item.twilightforest.knightmetal_ring": "Lazo de Caballero de Metal", + "item.twilightforest.block_and_chain": "Bloque y Cadena", + "item.twilightforest.cube_talisman": "Talismán del Cubo [NYI]", + "item.twilightforest.cube_of_annihilation": "Cubo de la Aniquilación [WIP]", + "item.twilightforest.moon_dial": "Dial lunar", + + "item.twilightforest.wild_boar_spawn_egg": "Generar Jabalí", + "item.twilightforest.bighorn_sheep_spawn_egg": "Generar de Oveja Cimarrón", + "item.twilightforest.deer_spawn_egg": "Generar Ciervo Salvaje", + "item.twilightforest.redcap_spawn_egg": "Generar Goblin del Gorro Rojo", + "item.twilightforest.swarm_spider_spawn_egg": "Generar Araña de Enjambre", + "item.twilightforest.naga_spawn_egg": "Generar Naga", + "item.twilightforest.skeleton_druid_spawn_egg": "Generar Druida Esqueleto", + "item.twilightforest.hostile_wolf_spawn_egg": "Generar Lobo Hostil", + "item.twilightforest.wraith_spawn_egg": "Generar Espectro Crepuscular", + "item.twilightforest.hedge_spider_spawn_egg": "Generar Araña del Seto", + "item.twilightforest.hydra_spawn_egg": "Generar Hidra", + "item.twilightforest.lich_spawn_egg": "Generar Twilight Lich ", + "item.twilightforest.penguin_spawn_egg": "Generar Pingüino", + "item.twilightforest.tiny_bird_spawn_egg": "Generar Pájaro Pequeño", + "item.twilightforest.squirrel_spawn_egg": "Generar Ardilla de Bosque", + "item.twilightforest.bunny_spawn_egg": "Generar Conejo del Bosque", + "item.twilightforest.raven_spawn_egg": "Generar Cuervo del Bosque", + "item.twilightforest.quest_ram_spawn_egg": "Generar Carnero de la Búsqueda", + "item.twilightforest.kobold_spawn_egg": "Generar Kobold", + "item.twilightforest.mosquito_swarm_spawn_egg": "Generar Enjambre de Mosquitos", + "item.twilightforest.death_tome_spawn_egg": "Generar Tomo de la Muerte", + "item.twilightforest.minotaur_spawn_egg": "Generar Minotauro", + "item.twilightforest.minoshroom_spawn_egg": "Generar Minosetauro", + "item.twilightforest.fire_beetle_spawn_egg": "Generar Escarabajo de Fuego", + "item.twilightforest.slime_beetle_spawn_egg": "Generar Escarabajo de Slime", + "item.twilightforest.pinch_beetle_spawn_egg": "Generar Escarabajo de Pinzas", + "item.twilightforest.maze_slime_spawn_egg": "Generar Slime de Laberinto", + "item.twilightforest.redcap_sapper_spawn_egg": "Generar Zapador de Gorro Rojo", + "item.twilightforest.mist_wolf_spawn_egg": "Generar Lobo de la Niebla", + "item.twilightforest.king_spider_spawn_egg": "Generar Rey Araña", + "item.twilightforest.mini_ghast_spawn_egg": "Generar Mini Ghast de Carminita", + "item.twilightforest.tower_ghast_spawn_egg": "Generar Guardia Ghast de Carminita", + "item.twilightforest.tower_golem_spawn_egg": "Generar Golem de Carminita", + "item.twilightforest.tower_termite_spawn_egg": "Generar Barrenador de la Torre de Madera", + "item.twilightforest.tower_broodling_spawn_egg": "Generar Araña Carminita", + "item.twilightforest.ur_ghast_spawn_egg": "Generar Ur-Ghast", + "item.twilightforest.blockchain_goblin_spawn_egg": "Generar Goblin de Bloques y Cadenas", + "item.twilightforest.goblin_knight_lower_spawn_egg": "Generar Caballero Goblin", + "item.twilightforest.helmet_crab_spawn_egg": "Generar Cangrejo con Casco", + "item.twilightforest.knight_phantom_spawn_egg": "Generar Caballero Fantasma", + "item.twilightforest.yeti_spawn_egg": "Generar Yeti", + "item.twilightforest.yeti_alpha_spawn_egg": "Generar Yeti Alfa", + "item.twilightforest.winter_wolf_spawn_egg": "Generar Lobo de Invierno", + "item.twilightforest.snow_guardian_spawn_egg": "Generar Guardián de Nieve", + "item.twilightforest.stable_ice_core_spawn_egg": "Generar Núcleo de Hielo Estable", + "item.twilightforest.unstable_ice_core_spawn_egg": "Generar Núcleo de Hielo Inestable", + "item.twilightforest.snow_queen_spawn_egg": "Generar Reina de las Nieves", + "item.twilightforest.troll_spawn_egg": "Generar Troll de las Cavernas", + "item.twilightforest.giant_miner_spawn_egg": "Generar Minero Gigante", + "item.twilightforest.armored_giant_spawn_egg": "Generar Gigante Armado", + "item.twilightforest.ice_crystal_spawn_egg": "Generar Cristal de Hielo", + "item.twilightforest.harbinger_cube_spawn_egg": "Generar Cubo de los Presagios [NYI]", + "item.twilightforest.adherent_spawn_egg": "Generar Adepto [NYI]", + "item.twilightforest.roving_cube_spawn_egg": "Generar Cubo Giratorio [NYI]", + + "item.twilightforest.guide": "Cuaderno de Bitácora del Viajero [WIP]", + + "item.twilightforest.minotaur_axe.tooltip": "Daño Extra Durante la Carga", + "item.twilightforest.minotaur_axe_gold.tooltip": "Daño Extra Durante la Carga", + "item.twilightforest.knightmetal_sword.tooltip": "Daño Extra a Objetivos Blindados", + "item.twilightforest.knightmetal_pickaxe.tooltip": "Daño Extra a Objetivos Blindados", + "item.twilightforest.knightmetal_axe.tooltip": "Daño Extra a Objetivos No Blindados", + "item.twilightforest.giant_pickaxe.tooltip": "Rompe bloques gigantes", + "item.twilightforest.fiery_pickaxe.tooltip": "Autofundición", + "item.twilightforest.fiery_sword.tooltip": "Quema al objetivo ", + "item.twilightforest.fiery_helmet.tooltip": "Quema a los atacante", + "item.twilightforest.fiery_chestplate.tooltip": "Quema a los atacante", + "item.twilightforest.fiery_leggings.tooltip": "Quema a los atacante", + "item.twilightforest.fiery_boots.tooltip": "Quema a los atacante", + "item.twilightforest.phantom_helmet.tooltip": "Nunca lo pierdes aunque mueras ", + "item.twilightforest.phantom_chestplate.tooltip": "Nunca lo pierdes aunque mueras ", + "item.twilightforest.yeti_helmet.tooltip": "Enfría a los atacantes", + "item.twilightforest.yeti_chestplate.tooltip": "Enfría a los atacantes", + "item.twilightforest.yeti_leggings.tooltip": "Enfría a los atacantes", + "item.twilightforest.yeti_boots.tooltip": "Enfría a los atacantes", + + "item.twilightforest.arctic_armor.tooltip": "Teñible como la armadura de cuero", + + // Entities + "entity.twilightforest.wild_boar": "Jabalí", + "entity.twilightforest.bighorn_sheep": "Oveja Cimarrón", + "entity.twilightforest.deer": "Ciervo salvaje", + "entity.twilightforest.redcap": "Goblin del Gorro Rojo", + "entity.twilightforest.swarm_spider": "Araña de Enjambre", + "entity.twilightforest.naga": "Naga", + "entity.twilightforest.naga_segment": "Segmento Naga", + "entity.twilightforest.skeleton_druid": "Druida Esqueleto", + "entity.twilightforest.hostile_wolf": "Lobo hostil", + "entity.twilightforest.wraith": "Espectro Crepuscular", + "entity.twilightforest.hedge_spider": "Araña del Seto", + "entity.twilightforest.hydra": "Hidra", + "entity.twilightforest.hydra_head": "Cabeza de Hidra", + "entity.twilightforest.lich": "Twilight Lich", + "entity.twilightforest.penguin": "Pingüino", + "entity.twilightforest.tiny_bird": "Pájaro Pequeño", + "entity.twilightforest.squirrel": "Ardilla del Bosque", + "entity.twilightforest.bunny": "Conejo Enano", + "entity.twilightforest.raven": "Cuervo del Bosque", + "entity.twilightforest.quest_ram": "Carnero de la Búsqueda", + "entity.twilightforest.kobold": "Kobold", + "entity.twilightforest.boggard": "Boggard [NYI]", + "entity.twilightforest.lich_minion": "Lich Minion", + "entity.twilightforest.loyal_zombie": "Zombi Leal", + "entity.twilightforest.mosquito_swarm": "Enjambre de Mosquitos", + "entity.twilightforest.death_tome": "Tomo de la Muerte", + "entity.twilightforest.minotaur": "Minotauro", + "entity.twilightforest.minoshroom": "Minosetauro", + "entity.twilightforest.fire_beetle": "Escarabajo de Fuego", + "entity.twilightforest.slime_beetle": "Escarabajo de Slime", + "entity.twilightforest.pinch_beetle": "Escarabajo de Pinzas", + "entity.twilightforest.maze_slime": "Slime de Laberinto", + "entity.twilightforest.redcap_sapper": "Zapador de Gorro Rojo", + "entity.twilightforest.mist_wolf": "Lobo de la Niebla", + "entity.twilightforest.king_spider": "Rey Araña", + "entity.twilightforest.firefly": "Luciérnaga", + "entity.twilightforest.mini_ghast": "Mini Ghast de Carminita", + "entity.twilightforest.tower_ghast": "Guardia Ghast de Carminita", + "entity.twilightforest.tower_golem": "Golem de Carminita", + "entity.twilightforest.tower_termite": "Barrenador de la Madera de la Torre", + "entity.twilightforest.tower_broodling": "Araña Carminita", + "entity.twilightforest.ur_ghast": "Ur-Ghast", + "entity.twilightforest.blockchain_goblin": "Generar Goblin de Bloques y Cadenas", + "entity.twilightforest.goblin_knight_upper": "Caballero Goblin Superior", + "entity.twilightforest.goblin_knight_lower": "Caballero Goblin Inferior", + "entity.twilightforest.helmet_crab": "Cangrejo con Casco", + "entity.twilightforest.knight_phantom": "Caballero Fantasma", + "entity.twilightforest.yeti": "Yeti", + "entity.twilightforest.yeti_alpha": "Yeti Alfa", + "entity.twilightforest.winter_wolf": "Lobo de Invierno", + "entity.twilightforest.snow_guardian": "Guardián de Nieve", + "entity.twilightforest.stable_ice_core": "Núcleo de Hielo Estable", + "entity.twilightforest.unstable_ice_core": "Núcleo de Hielo Inestable", + "entity.twilightforest.snow_queen": "Reina de las Nieves", + "entity.twilightforest.troll": "Troll de las Cavernas", + "entity.twilightforest.giant_miner": "Minero Gigante", + "entity.twilightforest.armored_giant": "Gigante Armado", + "entity.twilightforest.ice_crystal": "Cristal de Hielo", + "entity.twilightforest.rising_zombie": "Zombie", + "entity.twilightforest.harbinger_cube": "Cubo de los Presagios [NYI]", + "entity.twilightforest.adherent": "Adepto [NYI]", + "entity.twilightforest.castle_guardian": "Guardián del Castillo [NYI]", + "entity.twilightforest.roving_cube": "Cubo Giratorio [NYI]", + + "entity.twilightforest.ice_snowball": "Bola de Nieve de Hielo", + "entity.twilightforest.ice_arrow": "Flecha de Hielo", + "entity.twilightforest.seeker_arrow": "Flecha Buscadora", + "entity.twilightforest.cicada_shot": "Cigarra", + "entity.twilightforest.moonworm_shot": "Gusano Lunar", + "entity.twilightforest.nature_bolt": "Perno de la Naturaleza", + "entity.twilightforest.slime_blob": "Gota de Slime", + "entity.twilightforest.tome_bolt": " Perno del Tomo de la Muerte", + "entity.twilightforest.wand_bolt": "Perno de Cetro Crepuscular", + "entity.twilightforest.lich_bolt": "Perno del Lich", + "entity.twilightforest.lich_bomb": "Perno Explosivo del Lich", + "entity.twilightforest.hydra_mortar": "Mortero Hidra", + "entity.twilightforest.falling_ice": "Caída de hielo", + "entity.twilightforest.chain_block": "Bloque y Cadena", + "entity.twilightforest.thrown_wep": "Arma Arrojadiza", + "entity.twilightforest.charm_effect": "Efecto de Talisman", + "entity.twilightforest.cube_of_annihilation": "Cubo de la Aniquilación", + "entity.twilightforest.slider": "Trampa Deslizante en Movimiento", + "entity.twilightforest.protection_box": "Caja de Protección de la Progresión", + + // Subtitles + "subtitles.twilightforest.entity.alphayeti.alert": "Yeti Alfa se dirige al jugador", + "subtitles.twilightforest.entity.alphayeti.death": "Yeti Alfa muerto", + "subtitles.twilightforest.entity.alphayeti.grab": "Yeti Alfa agarra al jugador", + "subtitles.twilightforest.entity.alphayeti.growl": "Yeti Alfa gruñe", + "subtitles.twilightforest.entity.alphayeti.hurt": "Yeti Alfa herido", + "subtitles.twilightforest.entity.alphayeti.ice": "Yeti Alfa lanza hielo", + "subtitles.twilightforest.entity.alphayeti.pant": "Pantalones del Yeti Alfa ", + "subtitles.twilightforest.entity.alphayeti.roar": "Yeti Alfa ruge", + "subtitles.twilightforest.entity.alphayeti.throw": "Yeti Alfa tira con fuerza", + "subtitles.twilightforest.entity.bighorn.ambient": "Balido de Oveja Cimarrón", + "subtitles.twilightforest.entity.bighorn.death": "Oveja Cimarrón muerta", + "subtitles.twilightforest.entity.bighorn.hurt": "Oveja Cimarrón herida", + "subtitles.twilightforest.entity.blockchain.ambient": "Goblin de Bloques y Cadenas se ríe", + "subtitles.twilightforest.entity.blockchain.death": "Goblin de Bloques y Cadenas muerto", + "subtitles.twilightforest.entity.blockchain.hurt": "Goblin de Bloques y Cadenas grita", + "subtitles.twilightforest.entity.boar.ambient": "Gruñido de Jabalí", + "subtitles.twilightforest.entity.boar.death": "Jabalí muerto", + "subtitles.twilightforest.entity.boar.hurt": "Jabalí herido", + "subtitles.twilightforest.entity.broodling.ambient": "Siseo de Araña Carminita", + "subtitles.twilightforest.entity.broodling.death": "Araña Carminita muerta", + "subtitles.twilightforest.entity.broodling.hurt": "Araña Carminita herida", + "subtitles.twilightforest.entity.carminitegolem.attack": "Golem de Carminita ataca", + "subtitles.twilightforest.entity.carminitegolem.death": "Golem de Carminita muerto", + "subtitles.twilightforest.entity.carminitegolem.hurt": "Golem de Carminita herido", + "subtitles.twilightforest.entity.cicada": "Canto de Cigarra", + "subtitles.twilightforest.entity.deer.death": "Ciervo salvaje muerto", + "subtitles.twilightforest.entity.deer.hurt": "Ciervo salvaje herido", + "subtitles.twilightforest.entity.deer.idle": "Ciervo salvaje mugido", + "subtitles.twilightforest.entity.druid.ambient": "Cascabeles del Druida Esqueleto", + "subtitles.twilightforest.entity.druid.death": "Druida Esqueleto muerto", + "subtitles.twilightforest.entity.druid.hurt": "Druida Esqueleto herido", + "subtitles.twilightforest.entity.druid.shoot": "Druida Esqueleto dispara", + "subtitles.twilightforest.entity.firebeetle.ambient": "Siseo de Escarabajo de Fuego", + "subtitles.twilightforest.entity.firebeetle.death": "Escarabajo de Fuego muerto", + "subtitles.twilightforest.entity.firebeetle.hurt": "Escarabajo de Fuego herido", + "subtitles.twilightforest.entity.firebeetle.shoot": "Escarabajo de Fuego dispara", + "subtitles.twilightforest.entity.ghastguard.ambient": "Llanto de Guardia Ghast", + "subtitles.twilightforest.entity.ghastguard.death": "Guardia Ghast muerto", + "subtitles.twilightforest.entity.ghastguard.hurt": "Guardia Ghast herido", + "subtitles.twilightforest.entity.ghastling.ambient": "Llanto de Mini Ghast", + "subtitles.twilightforest.entity.ghastling.death": "Mini Ghast muerto", + "subtitles.twilightforest.entity.ghastling.hurt": "Mini Ghast herido", + "subtitles.twilightforest.entity.goblinknight.ambient": "Risas de Caballero Goblin", + "subtitles.twilightforest.entity.goblinknight.death": "Caballero Goblin gime de agonía", + "subtitles.twilightforest.entity.goblinknight.hurt": "Caballero Goblin chilla de dolor", + "subtitles.twilightforest.entity.goblinknight.muffled.ambient": "Caballero Goblin sofocada rie", + "subtitles.twilightforest.entity.goblinknight.muffled.death": "Caballero Goblin sofocado gime de agonía", + "subtitles.twilightforest.entity.goblinknight.muffled.hurt": "Caballero Goblin sofocado chilla de dolor", + "subtitles.twilightforest.entity.hedgespider.ambient": "Siseo de Araña del Seto", + "subtitles.twilightforest.entity.hedgespider.death": "Araña del Seto muerta", + "subtitles.twilightforest.entity.hedgespider.hurt": "Araña del Seto herida", + "subtitles.twilightforest.entity.helmetcrab.death": "Cangrejo con Casco muerto", + "subtitles.twilightforest.entity.helmetcrab.hurt": "Cangrejo con Casco herido", + "subtitles.twilightforest.entity.hostilewolf.death": "Lobo hostil muerto", + "subtitles.twilightforest.entity.hostilewolf.hurt": "Lobo hostil herido", + "subtitles.twilightforest.entity.hostilewolf.idle": "Lobo hostil gruñe", + "subtitles.twilightforest.entity.hostilewolf.target": "Lobo hostil apunta a la víctima", + "subtitles.twilightforest.entity.hydra.death": "Hidra muerto", + "subtitles.twilightforest.entity.hydra.growl": "Hidra gruñe", + "subtitles.twilightforest.entity.hydra.hurt": "Hidra herido", + "subtitles.twilightforest.entity.hydra.roar": "Hidra ruge", + "subtitles.twilightforest.entity.hydra.shoot": "Hidra lanza fuego", + "subtitles.twilightforest.entity.hydra.warn": "Hidra se prepara para morder", + "subtitles.twilightforest.entity.ice.death": "Núcleo de hielo muerto", + "subtitles.twilightforest.entity.ice.hurt": "Núcleo de hielo herido", + "subtitles.twilightforest.entity.ice.noise": "Crujidos del Núcleo de hielo", + "subtitles.twilightforest.entity.ice.shoot": "Núcleo de hielo dispara una bola de nieve", + "subtitles.twilightforest.entity.iceguardian.ambient": "Crujidos del Guardián de la nieve", + "subtitles.twilightforest.entity.iceguardian.death": "Guardián de la nieve muerto", + "subtitles.twilightforest.entity.iceguardian.hurt": "Guardián de la nieve herido", + "subtitles.twilightforest.entity.kingspider.ambient": "Siseo de Rey Araña", + "subtitles.twilightforest.entity.kingspider.death": "Rey Araña muerto", + "subtitles.twilightforest.entity.kingspider.hurt": "Rey Araña herido", + "subtitles.twilightforest.entity.kobold.ambient": "Gruñidos de Kobold", + "subtitles.twilightforest.entity.kobold.death": "Kobold muerto", + "subtitles.twilightforest.entity.kobold.hurt": "Kobold herido", + "subtitles.twilightforest.entity.lich.ambient": "Lich respira", + "subtitles.twilightforest.entity.lich.death": "Lich muerto", + "subtitles.twilightforest.entity.lich.hurt": "Lich herido", + "subtitles.twilightforest.entity.lich.shoot": "Lich dispara", + "subtitles.twilightforest.entity.lich.teleport": "Lich se teletransporta", + "subtitles.twilightforest.entity.lichclone.hurt": "Clon Lich se evapora", + "subtitles.twilightforest.entity.loyalzombie.ambient": "Zombi leal gruñidos", + "subtitles.twilightforest.entity.loyalzombie.death": "Zombi leal muerto", + "subtitles.twilightforest.entity.loyalzombie.hurt": "Zombi leal herido", + "subtitles.twilightforest.entity.mazeslime.death": "Slime de Laberinto muerto", + "subtitles.twilightforest.entity.mazeslime.hurt": "Slime de Laberinto herido", + "subtitles.twilightforest.entity.mazeslime.squish": "Slime de Laberinto saltando", + "subtitles.twilightforest.entity.minion.ambient": "Lich Minion gruñidos", + "subtitles.twilightforest.entity.minion.death": "Lich Minion muerto", + "subtitles.twilightforest.entity.minion.hurt": "Lich Minion herido", + "subtitles.twilightforest.entity.minion.summon": "Lich invoca a un nuevo Minion", + "subtitles.twilightforest.entity.minoshroom.ambient": "Mugido de Minosetauro", + "subtitles.twilightforest.entity.minoshroom.attack": "Carga de Minosetauro", + "subtitles.twilightforest.entity.minoshroom.death": "Minosetauro muerto", + "subtitles.twilightforest.entity.minoshroom.hurt": "Minosetauro herido", + "subtitles.twilightforest.entity.minotaur.ambient": "Mugido de Minotauro", + "subtitles.twilightforest.entity.minotaur.attack": "Carga de Minotauro", + "subtitles.twilightforest.entity.minotaur.death": "Minotauro muerto", + "subtitles.twilightforest.entity.minotaur.hurt": "Minotauro herido", + "subtitles.twilightforest.entity.mistwolf.death": "Lobo de la Niebla muerto", + "subtitles.twilightforest.entity.mistwolf.hurt": "Lobo de la Niebla herido", + "subtitles.twilightforest.entity.mistwolf.idle": "Lobo de la Niebla gruñe", + "subtitles.twilightforest.entity.mistwolf.target": "Lobo de la Niebla apunta a la víctima", + "subtitles.twilightforest.entity.mosquito.ambient": "Zumbido de Mosquitos", + "subtitles.twilightforest.entity.naga.hiss": "Siseo de Naga", + "subtitles.twilightforest.entity.naga.hurt": "Naga herido", + "subtitles.twilightforest.entity.naga.rattle": "Naga cascabeles", + "subtitles.twilightforest.entity.kphantom.axe": "Caballero Fantasma lanza el hacha", + "subtitles.twilightforest.entity.kphantom.ambient": "Caballero Fantasma jadeos", + "subtitles.twilightforest.entity.kphantom.death": "Caballero Fantasma muerto", + "subtitles.twilightforest.entity.kphantom.hurt": "Caballero Fantasma herido", + "subtitles.twilightforest.entity.kphantom.pick": "Caballero Fantasma lanza el pico", + "subtitles.twilightforest.entity.pinchbeetle.death": "Escarabajo de pinzas muerto", + "subtitles.twilightforest.entity.pinchbeetle.hurt": "Escarabajo de pinzas herido", + "subtitles.twilightforest.entity.quest.ambient": "Balido del Carnero de la Búsqueda", + "subtitles.twilightforest.entity.quest.death": "Carnero de la Búsqueda muerto", + "subtitles.twilightforest.entity.quest.hurt": "Carnero de la Búsqueda herido", + "subtitles.twilightforest.entity.raven.caw": "Canto de Cuervo", + "subtitles.twilightforest.entity.raven.squawk": "Graznido de Cuervo", + "subtitles.twilightforest.entity.redcap.ambient": "Risas de Gorro rojo", + "subtitles.twilightforest.entity.redcap.death": "Gorro rojo gime en agonía", + "subtitles.twilightforest.entity.redcap.hurt": "Gorro rojo chilla de dolor", + "subtitles.twilightforest.entity.shield.add": "Aparece un nuevo escudo", + "subtitles.twilightforest.entity.shield.break": "Rotura del escudo", + "subtitles.twilightforest.entity.slimebeetle.death": "Escarabajo de Slime muerto", + "subtitles.twilightforest.entity.slimebeetle.hurt": "Escarabajo de Slime herido", + "subtitles.twilightforest.entity.slimebeetle.squish": "Escarabajo de Slime saltando", + "subtitles.twilightforest.entity.snowqueen.ambient": "Reina de las Nieves cruje", + "subtitles.twilightforest.entity.snowqueen.attack": "Reina de las Nieves ataca", + "subtitles.twilightforest.entity.snowqueen.break": "Reina de las Nieves el escudo desvía", + "subtitles.twilightforest.entity.snowqueen.death": "Reina de las Nieves muerto", + "subtitles.twilightforest.entity.snowqueen.hurt": "Reina de las Nieves herido", + "subtitles.twilightforest.entity.swarmspider.ambient": "Siseo de Araña de enjambre", + "subtitles.twilightforest.entity.swarmspider.death": "Araña de enjambre muerto", + "subtitles.twilightforest.entity.swarmspider.hurt": "Araña de enjambre herido", + "subtitles.twilightforest.entity.tear.break": "Lágrimas de Ur-Ghast rompiéndose", + "subtitles.twilightforest.entity.termite.ambient": "Siseo de Barrenador de la Torre de Madera", + "subtitles.twilightforest.entity.termite.death": "Barrenador de la Torre de Madera muerto", + "subtitles.twilightforest.entity.termite.hurt": "Barrenador de la Torre de Madera herido", + "subtitles.twilightforest.entity.tinybird.chirp": "Pájaro gorjea", + "subtitles.twilightforest.entity.tinybird.hurt": "Pájaro herido", + "subtitles.twilightforest.entity.tinybird.song": "Pájaro cantando", + "subtitles.twilightforest.entity.tome.death": "Tomo de la Muerte se desmorona", + "subtitles.twilightforest.entity.tome.hurt": "Pliegues del Tomo de la Muerte", + "subtitles.twilightforest.entity.tome.idle": "Tomo de la Muerte pasa las páginas", + "subtitles.twilightforest.entity.urghast.ambient": "Ur-Ghast llora", + "subtitles.twilightforest.entity.urghast.death": "Ur-Ghast muerto", + "subtitles.twilightforest.entity.urghast.hurt": "Ur-Ghast grita", + "subtitles.twilightforest.entity.urghast.trapactive": "Zumbidos de la trampa Trampa Ghast", + "subtitles.twilightforest.entity.urghast.trapon": "Trampa Ghast activa", + "subtitles.twilightforest.entity.urghast.trapspindown": "Trampa Ghast se apaga", + "subtitles.twilightforest.entity.urghast.trapwarmup": "Trampa de Ghast se calienta", + "subtitles.twilightforest.entity.winterwolf.death": "Lobo de invierno muerto", + "subtitles.twilightforest.entity.winterwolf.hurt": "Lobo de invierno herido", + "subtitles.twilightforest.entity.winterwolf.idle": "Lobo de invierno gruñe", + "subtitles.twilightforest.entity.winterwolf.shoot": "Lobo de invierno dispara", + "subtitles.twilightforest.entity.winterwolf.target": "Lobo de invierno apunta a la víctima", + "subtitles.twilightforest.entity.wraith.ambient": "Jadeos de Espectro", + "subtitles.twilightforest.entity.wraith.death": "Espectro muerto", + "subtitles.twilightforest.entity.wraith.hurt": "Espectro herido", + "subtitles.twilightforest.entity.yeti.death": "Yeti muerto", + "subtitles.twilightforest.entity.yeti.grab": "Yeti agarra al jugador", + "subtitles.twilightforest.entity.yeti.growl": "Yeti gruñe", + "subtitles.twilightforest.entity.yeti.hurt": "Yeti herido", + "subtitles.twilightforest.entity.yeti.throw": "Yeti tira con fuerza", + + "subtitles.twilightforest.entity.alphayeti.parrot": "Loro gruñe fríamente", + "subtitles.twilightforest.entity.carminitegolem.parrot": "Loro golpea", + "subtitles.twilightforest.entity.hostilewolf.parrot": "Gruñidos de Loro", + "subtitles.twilightforest.entity.hydra.parrot": "Rugidos de Loro", + "subtitles.twilightforest.entity.icecore.parrot": "Crujidos de Loro", + "subtitles.twilightforest.entity.kobold.parrot": "Loro refunfuña", + "subtitles.twilightforest.entity.minotaur.parrot": "Loro muge furiosamente", + "subtitles.twilightforest.entity.mosquito.parrot": "Zumbidos de Loro", + "subtitles.twilightforest.entity.naga.parrot": "Sonajeros de Loro", + "subtitles.twilightforest.entity.redcap.parrot": "Loro se ríe", + "subtitles.twilightforest.entity.tome.parrot": "Loro hace ruidos de libros", + "subtitles.twilightforest.entity.wraith.parrot": "Jadeos de Loro", + + "subtitles.twilightforest.block.bug.squish": "Se aplasta un bicho :(", + "subtitles.twilightforest.block.builder.on": "El constructor se activa", + "subtitles.twilightforest.block.builder.off": "El constructor se desactiva", + "subtitles.twilightforest.block.builder.replace": "El constructor sustituye el bloque", + "subtitles.twilightforest.block.door.activate": "La puerta del castillo no se desvanece", + "subtitles.twilightforest.block.door.reappear": "La puerta del castillo reaparece", + "subtitles.twilightforest.block.door.vanish": "La puerta del castillo se desvanece", + "subtitles.twilightforest.block.vanish.locked": "La puerta de la Torre de Madera no se desvanece", + "subtitles.twilightforest.block.vanish.unlock": "La puerta de la Torre de Madera se desbloquea", + "subtitles.twilightforest.block.reappear.reappear": "Reaparece el Bloque Reaparecedor", + "subtitles.twilightforest.block.reappear.vanish": "Desaparece el Bloque Reaparecedor", + "subtitles.twilightforest.block.vanish.vanish": "Bloque de desaparición se desvanece", + "subtitles.twilightforest.block.core.time": "El árbol del tiempo hace tictac", + "subtitles.twilightforest.block.core.transformation": "Árbol de la transformación emite un sonido ", + "subtitles.twilightforest.block.portal.woosh": "Portal del Bosque Twilight llama ", + "subtitles.twilightforest.block.pedestal.activate": "El pedestal de trofeos acepta el trofeo", + "subtitles.twilightforest.block.casket.open": "Se abre el ataúd del recuerdo", + "subtitles.twilightforest.block.casket.close": "Se se cierra el ataúd del recuerdo", + "subtitles.twilightforest.block.casket.repair": "El jugador repara el ataúd", + "subtitles.twilightforest.block.casket.locked": "Clics en el ataúd de recuerdo", + + "subtitles.twilightforest.item.blockchain.collide": "Bloque y Cadena golpea un bloque", + "subtitles.twilightforest.item.blockchain.hit": "Bloque y Cadena golpea a la entidad", + "subtitles.twilightforest.item.blockchain.fire": "Bloque y Cadena lanzado", + "subtitles.twilightforest.item.glasssword.break": "Espada de vidrio se rompe", + "subtitles.twilightforest.item.icebomb.fired": "Bomba de hielo lanzada", + "subtitles.twilightforest.item.lamp.burn": "Lámpara de Cenizas quema la zona", + "subtitles.twilightforest.item.moonworm.squish": "Gusano lunar disparos", + "subtitles.twilightforest.item.magnet.grab": "El imán extrae el mineral", + "subtitles.twilightforest.item.fan.woosh": "Abanico de pavo real utilizado", + "subtitles.twilightforest.item.scepter.drain": "Cetro Robó la vida del objetivo ", + "subtitles.twilightforest.item.scepter.use": "Cetro usado", + "subtitles.twilightforest.item.scepter.pearl": "Cetro Crepuscular lanza la perla", + "subtitles.twilightforest.item.powder.use": "Polvo de transformación utilizado", + "subtitles.twilightforest.item.charm.keep": "Talisman de conservación devuelve los objetos", + "subtitles.twilightforest.item.charm.life": "Talisman de Vida regenera al jugador", + + "subtitles.twilightforest.te.jet.start": "Comienza el chorro de fuego", + "subtitles.twilightforest.te.jet.active": "Llamaradas de Chorro de fuego", + "subtitles.twilightforest.te.jet.pop": "Chorro de fuego empieza a brotar", + "subtitles.twilightforest.te.smoker.start": "El ahumador comienza", + "subtitles.twilightforest.te.reactor.idle": "Reactor de Carminita hace ruido", + + "subtitles.random.slider": "Trampa Deslizante en Movimiento", + + // Death Messages + "death.attack.twilightforest.ghastTear": "%1$s fue escaldado por lágrimas de fuego", + "death.attack.twilightforest.ghastTear.player": "%1$s fue escaldado por lágrimas de fuego mientras escapaba de %2$s", + "death.attack.twilightforest.hydraFire": "%1$s fue asado vivo por la Hidra", + "death.attack.twilightforest.hydraFire.player": "%1$s fue asado vivo por la Hidra mientras escapaba de %2$s", + "death.attack.twilightforest.hydraBite": "La piel de %1$s fue arrancada por la Hidra", + "death.attack.twilightforest.hydraBite.player": "La piel de %1$s fue arrancada por la Hidra mientras escapaba de %2$s", + "death.attack.twilightforest.lichBolt": "La puntería del Lich era mejor que %1$s", + "death.attack.twilightforest.lichBolt.player": "El Lich y %2$s tenían mejor puntería que %1$s", + "death.attack.twilightforest.lichBomb": "%1$s sucumbió a la magia explosiva del Lich", + "death.attack.twilightforest.lichBomb.player": "%1$s sucumbió a la magia explosiva del Lich mientras escapaba %2$s", + "death.attack.twilightforest.chillingBreath": "%1$s fue congelado hasta la muerte por la Reina de las Nieves", + "death.attack.twilightforest.chillingBreath.player": "%1$s murió congelado por la Reina de las Nieves mientras escapaba de %2$s", + "death.attack.twilightforest.squish": "%1$s fue aplastado por la Reina de las Nieves", + "death.attack.twilightforest.squish.player": "%1$s fue triturado por la Reina de las Nieves mientras escapaba de %2$s", + "death.attack.twilightforest.thrownAxe": "%1$s fue decapitado por un hacha lanzada", + "death.attack.twilightforest.thrownAxe.player": "%1$s fue decapitado por un hacha lanzada mientras escapaba de %2$s", + "death.attack.twilightforest.thrownPickaxe": "%1$s fue decapitado por un pico lanzado", + "death.attack.twilightforest.thrownPickaxe.player": "%1$s fue decapitado por un pico lanzado mientras escapaba de %2$s", + "death.attack.twilightforest.fireJet": "%1$s caminó accidentalmente hacia un chorro de fuego", + "death.attack.twilightforest.fireJet.player": "%1$s entró accidentalmente en un chorro de fuego mientras escapaba de %2$s", + "death.attack.twilightforest.reactor": "%1$s estuvo demasiado cerca de un reactor de carminita", + "death.attack.twilightforest.reactor.player": "%1$s estuvo demasiado cerca de un reactor de carminita mientras escapaba %2$s", + "death.attack.twilightforest.slider": "%1$s fue cortado por una trampa deslizante", + "death.attack.twilightforest.slider.player": "%1$s fue cortado por una trampa deslizante mientras escapaba de %2$s", + "death.attack.twilightforest.thorns": "%1$s caminó hacia unas espinas", + "death.attack.twilightforest.thorns.player": "%1$s caminó hacia unas espinas mientras escapaba de %2$s", + "death.attack.twilightforest.knightmetal": "%1$s fue pinchado por un bloque hecho del Caballero de Metal", + "death.attack.twilightforest.knightmetal.player": "%1$s fue pinchado por un bloque hecho del Caballero de Metal mientras escapaba de %2$s", + "death.attack.twilightforest.fiery": "%1$s caminó hacia un bloque ardiente", + "death.attack.twilightforest.fiery.player": "%1$s caminó sobre un bloque ardiente mientras escapaba de %2$s", + + "death.attack.twilightforest.axing": "%1$s ha sido cortado por %2$s", + "death.attack.twilightforest.axing.item": "%1$s ha sido cortado por %2$s con %3$s", + "death.attack.twilightforest.cicada": "%1$s fue disparado por la Cigarra", + "death.attack.twilightforest.moonworm": "%1$s fue disparado por el Gusano lunar", + "death.attack.twilightforest.ant": "%1$s vivió la vida de una hormiga gracias a %2$s", + "death.attack.twilightforest.ant.item": "%1$s vivió la vida de una hormiga gracias a %2$s usando %3$s", + "death.attack.twilightforest.haunt": "%1$s entro a la guarida de %2$s", + "death.attack.twilightforest.haunt.item": "%1$s entro a la guarida de %2$s después de ser asesinado con %3$s", + "death.attack.twilightforest.clamped": "%1$s fue sujetado hasta la muerte por %2$s", + "death.attack.twilightforest.clamped.item": "%1$s fue sujetado hasta la muerte por %2$s usando %3$s", + "death.attack.twilightforest.scorched": "%1$s fue quemado por %2$s", + "death.attack.twilightforest.scorched.item": "%1$s fue quemado por %2$s usando %3$s", + "death.attack.twilightforest.frozen": "%1$s fue congelado por %2$s usando una bomba de hielo", + "death.attack.twilightforest.frozen.item": "%1$s fue congelado por %2$s usando %3$s", + "death.attack.twilightforest.spiked": "%1$s ha sido pinchado por %2$s", + "death.attack.twilightforest.spiked.item": "%1$s ha sido pinchado por %2$s utilizando %3$s", + "death.attack.twilightforest.leafBrain": "El cerebro de %1$s fue convertido en hojas por %2$s", + "death.attack.twilightforest.leafBrain.item": "El cerebro de %1$s fue convertido en hojas por %2$s usando %3$s", + "death.attack.twilightforest.lostWords": "%1$s se quedó sin palabras tras ser asesinado por %2$s", + "death.attack.twilightforest.lostWords.item": "%1$s se quedó sin palabras tras ser asesinado por %2$s con %3$s", + "death.attack.twilightforest.snowballFight": "%1$s perdió una pelea de bolas de nieve contra %2$s", + "death.attack.twilightforest.snowballFight.item": "%1$s perdió una pelea de bolas de nieve contra %2$s usando %3$s", + "death.attack.twilightforest.yeeted": "%1$s fue golpeado por última vez por %2$s", + "death.attack.twilightforest.yeeted.item": "%1$s ha sido golpeado por última vez por %2$s mientras sostenía %3$s", + + // Misc + "twilightforest.misc.wip0": "Este bloque es un trabajo en proceso y puede tener errores o efectos no deseados que pueden dañar tu mundo.", + "twilightforest.misc.wip1": "Utilizar con precaución.", + "twilightforest.misc.nyi": "Este bloque tiene efectos que aún no se han implementado.", + + "twilightforest.loading.title.enter": "Llevándote al Twilight Forest...", + "twilightforest.loading.title.leave": "Sacándote de Twilight Forest...", + + // Config + "twilightforest.config.dimension": "Ajustes de Dimensión", + "twilightforest.config.dimension.tooltip": "No podrás cambiar estas configuraciones sin que se produzca un reinicio.", + "twilightforest.config.dimension_id": "Dimension ID", + "twilightforest.config.dimension_id.tooltip": "Qué número de identificación asignar a la dimensión de Twilight Forest. Cambia si tienes conflictos con otro mod.", + "twilightforest.config.dimension_seed": "Semilla de Dimensión", + "twilightforest.config.dimension_seed.tooltip": "Si se establece, esto anulará la semilla normal del mundo cuando se generen partes de Twilight Forest Dimension.", + "twilightforest.config.spawn_in_tf": "Los nuevos jugadores aparecen en el Twilight Forest", + "twilightforest.config.spawn_in_tf.tooltip": "Si es cierto, los jugadores que aparezcan por primera vez lo harán en el Twilight Forest.", + "twilightforest.config.skylight_forest": "Bosque de Tragaluces [WIP]", + "twilightforest.config.skylight_forest.tooltip": "If true, Twilight Forest will generate as a void except for Major Structures.", + "twilightforest.config.skylight_oaks": "Tragaluz de Roble [WIP]", + "twilightforest.config.skylight_oaks.tooltip": "Si es cierto, los gigantescos Robles Crepusculares también aparecerán en los mundos vacíos.", + + "twilightforest.config.world_gen_weights": "Pesos de la generación mundial", + "twilightforest.config.world_gen_weights.tooltip": "Pesos para varias características pequeñas", + "twilightforest.config.stone_circle_weight": "Peso del círculo de piedra", + "twilightforest.config.well_weight": "Peso del pozo", + "twilightforest.config.stalagmite_weight": "Peso de la estalagmita", + "twilightforest.config.foundation_weight": "Peso de la base", + "twilightforest.config.monolith_weight": "Peso del monolito", + "twilightforest.config.grove_ruins_weight": "Peso de las ruinas de la arboleda", + "twilightforest.config.hollow_stump_weight": "Peso del muñón hueco", + "twilightforest.config.fallen_hollow_log_weight": "Peso del tronco hueco caido", + "twilightforest.config.fallen_small_log_weight": "Peso del tronco pequeño caído", + "twilightforest.config.druid_hut_weight": "Peso de la cabaña del druida", + + "twilightforest.config.hollow_hill_stalactites": "Estalactitas de la Colina Hueca personalizadas", + "twilightforest.config.hollow_hill_stalactites.tooltip": "Define estalactitas personalizadas generadas en colinas huecas.\n_Format is \\\"modid:block<:meta> size max_Length min_Height weight\\\", donde las propiedades son:\n_Size - la longitud máxima de la estalactita en relación con el espacio entre el suelo y el techo de la colina,\n_Max length - la longitud máxima de una estalactita en bloques,\n_Min height - el espacio mínimo entre el suelo de la colina y la estalactita para que se genere,\n_Weight - la frecuencia con la que se genera.\n\n_For example: \\\"minecraft:iron_ore 0.7 8 1 24\\\" añadiría una estalactita igual a la estalactita de mineral de hierro por defecto.", + "twilightforest.config.large_hill": "Grandes Colinas", + "twilightforest.config.large_hill.tooltip": "Bloques que se generan como estalactitas sólo en las grandes colinas.", + "twilightforest.config.medium_hill": "Colinas medianas y grandes", + "twilightforest.config.medium_hill.tooltip": "Bloques que se generan como estalactitas en colinas medianas y grandes.", + "twilightforest.config.small_hill": "Todas las colinas", + "twilightforest.config.small_hill.tooltip": "Bloques que generan como estalactitas en todas las colinas.", + "twilightforest.config.stalactite_config_only": "Utilice sólo la configuración de estalactitas", + "twilightforest.config.stalactite_config_only.tooltip": "Si es cierto, no se utilizarán las estalactitas por defecto ni las definidas por otros mods.", + + "twilightforest.config.compat": "Compatibilidad", + "twilightforest.config.compat.tooltip": "¿Debe cargarse la Compatibilidad de TF? Desactivar si la Compatibilidad de TF está causando caídas o si no se desea.", + + "twilightforest.config.performance": "Ajustes de rendimiento", + "twilightforest.config.performance.tooltip": "Te permite sacrificar varias cosas para mejorar el rendimiento del mundo.", + "twilightforest.config.canopy_coverage": "Cobertura del Dosel", + "twilightforest.config.canopy_coverage.tooltip": "Cantidad de cobertura del dosel. Los números más bajos mejoran la velocidad de generación de trozos a costa de un bosque más delgado.", + "twilightforest.config.twilight_oaks": "Roble Crepuscular Probabilidad", + "twilightforest.config.twilight_oaks.tooltip": "Probabilidad de que un trozo del Twilight Forest contenga un roble crepuscular. Los números más altos reducen el número de árboles, aumentando el rendimiento.", + "twilightforest.config.leaves_light_opacity": "Opacidad de las hojas crepusculares", + "twilightforest.config.leaves_light_opacity.tooltip": "Esto controla la opacidad de las hojas, cambiando la cantidad de luz bloqueada. Puede utilizarse para disminuir la complejidad en algunos controles de iluminación.", + "twilightforest.config.glacier_packed_ice": "Glaciares de hielo compacto en lugar de hielo", + "twilightforest.config.glacier_packed_ice.tooltip": "Si se establece como verdadero, los glaciares crepusculares se generarán con hielo compactado en lugar de hielo translúcido normal, lo que reducirá la cantidad de cálculos de comprobación de la luz.", + "twilightforest.config.enable_skylight": "Activar el Tragaluz", + "twilightforest.config.enable_skylight.tooltip": "Si la dimensión tiene valores de tragaluz por bloque. Desactivar esto mejorará significativamente el rendimiento de la generación de mundos, a costa de una iluminación plana en todas partes.\n_WARNING: Una vez que los trozos se cargan sin tragaluz, esos datos se pierden y no pueden ser regenerados fácilmente. Tenga cuidado.", + + "twilightforest.config.silent_cicadas": "Cigarras silenciosas", + "twilightforest.config.silent_cicadas.tooltip": "Haz que las cigarras sean silenciosas para aquellos que tengan problemas con la biblioteca de sonido o que las encuentren molestas.", + + "twilightforest.config.first_person_effects": "Renderización de efectos en 1ª persona", + "twilightforest.config.first_person_effects.tooltip": "Controla si varios efectos del mod se renderizan en la vista en primera persona. Desactívelo si los encuentra molestos.", + + "twilightforest.config.origin_dimension": "Dimensión de origen", + "twilightforest.config.origin_dimension.tooltip": "La dimensión desde la que siempre puedes viajar al Twilight Forest, así como la dimensión a la que regresarás. El valor predeterminado es el mundo exterior.", + "twilightforest.config.portals_in_other_dimensions": "Portales en otras dimensiones", + "twilightforest.config.portals_in_other_dimensions.tooltip": "Permitir que los portales al Twilight Forest se hagan fuera de la dimensión 'origen'. Puede considerarse una hazaña.", + "twilightforest.config.admin_portals": "Portales Twilight sólo para administradores", + "twilightforest.config.admin_portals.tooltip": "Permitir portales sólo para administradores (Operadores). Esto reduce severamente el rango en el que el mod suele escanear en busca de condiciones de portales válidos, y escanea cerca de los ops solamente.", + "twilightforest.config.portals": "Desactivar los portales Twilight", + "twilightforest.config.portals.tooltip": "Desactivar por completo la creación de portales en Twilight Forest. Proporcionado para los operadores de servidores que buscan restringir la acción a la dimensión.", + "twilightforest.config.portal_creator": "Objeto creador del portal", + "twilightforest.config.portal_creator.tooltip": "Cadena de registro IDs de elementos utilizados para crear el Portal de Twilight Forest. (domain:regname:meta) meta es opcional.", + "twilightforest.config.portal_lighting": "Fuego relámpago para la creación del portal", + "twilightforest.config.portal_lighting.tooltip": "Establece esta opción como verdadera si quieres que el rayo que enciende el portal no prenda fuego a las cosas. Para los que no les gusta la diversión.", + "twilightforest.config.portal_return": "Los portales deben generar como un portal de dos vías", + "twilightforest.config.portal_return.tooltip": "Si es falso, el portal de retorno requerirá el elemento de activación.", + "twilightforest.config.check_portal_destination": "Destino del Portal Pre-Check", + "twilightforest.config.check_portal_destination.tooltip": "Determina si los nuevos portales deben ser precomprobados por seguridad. Si se activa, los portales no se formarán en lugar de redirigirse a un destino alternativo seguro.\n_Note que al activar esto también se reduce la tasa de comprobación de la formación de portales.", + + "twilightforest.config.progression_default": "Regla de Progreso por Defecto", + "twilightforest.config.progression_default.tooltip": "Establece el valor por defecto de la regla de juego que controla la progresión forzada.", + + "twilightforest.config.uncrafting": "Desactivar la desfabricación en la mesa de desfabricación", + "twilightforest.config.uncrafting.tooltip": "Desactiva la función de desfabricación de la mesa de desfabricación. Se ofrece como opción cuando la interacción con otros mods produce recetas explotables.", + + "twilightforest.config.optifine": "Desactivar la pantalla de aviso cuando se instala Optifine.", + "twilightforest.config.optifine.tooltip": "Desactiva la pantalla de aviso que se muestra al inicio cuando se instala Optifine.", + + "twilightforest.config.antibuilder_blacklist": "Lista negra anti-construcción", + "twilightforest.config.antibuilder_blacklist.tooltip": "Lista negra anti-construcción. (domain:block:meta) meta es opcional.", + + "twilightforest.config.animate_trophyitem": "Girar las cabezas de los trofeos en el modelo de artículo", + "twilightforest.config.animate_trophyitem.tooltip": "Gira las cabezas de los trofeos en el modelo de artículo. No tiene ningún impacto en el rendimiento. Para aquellos que no les gusta la diversión.", + + "twilightforest.config.shield_parry": "Parada de Escudo", + "twilightforest.config.shield_parry.tooltip": "Recomendamos descargar el mod Shield Parry para realizar paradas, pero estos controles quedan para sin.", + "twilightforest.config.parry_non_twilight": "Parada de proyectiles no Twilight", + "twilightforest.config.parry_non_twilight.tooltip": "Poner en true para parar los proyectiles que no son de Twilight. Recomendamos descargar el mod Shield Parry en su lugar.", + "twilightforest.config.parry_window_arrow": "Temporización para las flechas", + "twilightforest.config.parry_window_arrow.tooltip": "La cantidad de ticks después de levantar un escudo que hace que se pueda parar una flecha. Hay 20 ticks en 1 segundo.", + "twilightforest.config.parry_window_fireball": "Temporización para las bolas de fuego", + "twilightforest.config.parry_window_fireball.tooltip": "La cantidad de ticks después de levantar un escudo que hace que se pueda parar una bola de fuego. Hay 20 ticks en 1 segundo.", + "twilightforest.config.parry_window_throwable": "Temporización de los lanzamientos", + "twilightforest.config.parry_window_throwable.tooltip": "La cantidad de ticks después de levantar un escudo que hace que se pueda parar un objeto lanzado. Hay 20 ticks en 1 segundo.", + "twilightforest.config.shield_Parry_Ticks_Beam": "Ventana de tiempo para las vigas???", + "twilightforest.config.shield_Parry_Ticks_Beam.tooltip": "???", + + "twilightforest.config.loading_screen": "Pantalla de Carga", + "twilightforest.config.loading_screen.tooltip": "Sólo para clientes: Controles de la pantalla de carga", + "twilightforest.config.loading_icon_enable": "Activar la animación del icono de carga", + "twilightforest.config.loading_icon_enable.tooltip": "Tambalea el icono de carga. No tiene ningún impacto en el rendimiento. Para los que no les gusta la diversión.", + "twilightforest.config.loading_screen_swap_frequency": "Cambio de pantalla de carga", + "twilightforest.config.loading_screen_swap_frequency.tooltip": "Cuántos ticks entre cada cambio de pantalla de carga. Poner a 0 para que no haya ningún ciclo.", + "twilightforest.config.loading_icon_wobble_bounce_frequency": "Velocidad de Animación de los Iconos", + "twilightforest.config.loading_icon_wobble_bounce_frequency.tooltip": "Frecuencia de tambaleo y rebote.", + "twilightforest.config.loading_icon_scale": "Escala del Icono", + "twilightforest.config.loading_icon_scale.tooltip": "Escala de todo el icono de carga de rebote.", + "twilightforest.config.loading_icon_bounciness": "Icono Rebotante", + "twilightforest.config.loading_icon_bounciness.tooltip": "Cuánto rebota el icono de carga.", + "twilightforest.config.loading_icon_tilting": "Icon Wobbliness", + "twilightforest.config.loading_icon_tilting.tooltip": "Hasta dónde se tambalea el icono de carga.", + "twilightforest.config.loading_icon_tilt_pushback": "Icono Desplazamiento de la inclinación", + "twilightforest.config.loading_icon_tilt_pushback.tooltip": "Valor de empuje para volver a centrar el bamboleo del icono de carga.", + "twilightforest.config.casket_uuid_locking": "Cierre del ataúd UUID", + "twilightforest.config.casket_uuid_locking.tooltip": "Si es cierto, los ataúdes de recuerdo que se generan cuando un jugador muere no serán accesibles para otros jugadores. Utiliza esta opción si no quieres que la gente coja de los ataúdes de muerte de otras personas. NOTA: los operadores del servidor seguirán pudiendo abrir los ataúdes cerrados.", + + // Books + "twilightforest.book.lichtower.1": "\u00A78[[Un cuaderno de explorador, roído por los monstruos]]\u00A70\n\n_He comenzado a examinar la extraña aura que rodea a esta torre. Los ladrillos de la torre están protegidos por una maldición, más fuerte que cualquiera que haya visto antes. La magia de la maldición", + "twilightforest.book.lichtower.2": "está hirviendo en los alrededores.\n\n_En mi tierra natal tendría muchas opciones para lidiar con esta magia, pero aquí mis suministros son limitados. En mi tierra natal tendría muchas opciones para lidiar con esta magia, pero aquí mis suministros son limitados. Tendré que investigar...", + "twilightforest.book.lichtower.3": "\u00A78[[Muchas entradas después]]\u00A70\n\n_Un avance! En mis viajes avisté un enorme monstruo con forma de serpiente en un patio decorado. Cerca, recogí una escama verde desgastada y desechada.\n\n_La magia de la escama parece tener las", + "twilightforest.book.lichtower.4": "propiedades para romper maldiciones que necesito, pero la magia es demasiado débil. Puede que necesite adquirir un espécimen más fresco, directamente de la criatura.", + + "twilightforest.book.labyrinth.1": "\u00A78[[Cuaderno de un explorador, escrito en papel impermeable]]\u00A70\n\n_Los mosquitos de este pantano son molestos, pero extraños. La gran mayoría de ellos parece no tener una fuente natural, ni parece tener un papel en la ecología local. He comenzado a", + "twilightforest.book.labyrinth.2": "sospechar que son una especie de maldición mágica.\n\n\u00A78[[Siguiente entrada]]\u00A70\n\n_Ahora que he encontrado un hechizo de protección en el laberinto en ruinas aquí, considero que mis sospechas se confirman.Tanto el hechizo de protección", + "twilightforest.book.labyrinth.3": "como los mosquitos son una maldición. Esta maldición parece tener un origen diferente a las otras que he encontrado. Tendré que investigar más...\n\n\u00A78[[Siguiente entrada]]\u00A70\n\n_La maldición parece", + "twilightforest.book.labyrinth.4": "ser de un tipo demasiado poderoso para que un solo ser la produzca. Serían necesarios varios magos trabajando en combinación.\n\n_Si uno de los magos dejara de contribuir, la maldición caería sobre todo el pantano. Extrañamente,", + "twilightforest.book.labyrinth.5": "mis adivinaciones no muestran señales de ningún mago vivo cercano. Sin embargo, vi algo interesante en una de las torres de techo puntiagudo cercanas...", + + "twilightforest.book.hydralair.1": "\u00A78[[Un cuaderno de explorador, escrito en papel ignífugo]]\u00A70\n\n_El fuego es un obstáculo trivial para un maestro explorador como yo. He atravesado mares de fuego y nadado por océanos de lava. El aire ardiente aquí es una variación interesante,", + "twilightforest.book.hydralair.2": "pero, en definitiva, no es un obstáculo.\n\n_Sin embargo, lo que me detiene es que me he encontrado con otro hechizo de protección, esta vez rodeando a una poderosa criatura que debe ser el rey de este pantano de fuego. Este no es el primer hechizo de protección que", + "twilightforest.book.hydralair.3": "encuentro, y estoy comenzando a desentrañar los misterios de cómo funcionan.\n\n_Si este hechizo es como los otros, será sostenido por una poderosa criatura cercana. Alrededor del pantano de fuego hay varios pantanos húmedos, y bajo esos", + "twilightforest.book.hydralair.4": "pantanos hay laberintos llenos de minotauros. La elección lógica para atar tal hechizo sería algún tipo de minotauro poderoso, diferente de alguna manera de los otros que lo rodean...", + + "twilightforest.book.tfstronghold.1": "\u00A78[[Un cuaderno de explorador, escrito en un papel débilmente brillante]\u00A70\n\n_Los tallos de oscuridad que rodean esta zona no son más que la manifestación de un hechizo protector sobre todo el bosque oscuro. El hechizo causa ceguera, lo cual es bastante molesto. He visto", + "twilightforest.book.tfstronghold.2": "varias cosas interesantes en la zona y me gustaría seguir explorando.\n\n\u00A78[[Entrada siguiente]]\u00A70\n\n_He encontrado unas ruinas en el bosque oscuro. Pertenecen a una fortaleza, del tipo que suelen habitar los caballeros. Sin embargo", + "twilightforest.book.tfstronghold.3": "más que de caballeros, esta fortaleza está llena de goblins. Llevan armadura de caballero, pero su comportamiento es muy poco caballeroso.\n\n\u00A78[[Entrada siguiente]]\u00A70\n\n_En lo profundo de las ruinas, he encontrado un pedestal. El pedestal parece ser del tipo en el que", + "twilightforest.book.tfstronghold.4": "los caballeros colocarían los trofeos para demostrar su fuerza.\n\\La obtención de un cetro poderoso parece debilitar la maldición del bosque oscuro, y la colocación de un trofeo asociado a una criatura poderosa en el pedestal probablemente concedería el acceso a la", + "twilightforest.book.tfstronghold.5": "parte principal de la fortaleza.", + + "twilightforest.book.darktower.1": "\u00A78[[Un cuaderno de explorador que parece haber sobrevivido a una explosión]]\u00A70\n\n_Esta torre tiene claramente mecanismos que no me responden. Su magia casi anhela reconocer mi toque, pero no puede. Es como si los dispositivos de la torre estuvieran siendo", + "twilightforest.book.darktower.2": "suprimida por un poderoso grupo de seres cercanos.\n\n\u00A78[[Entrada siguiente]]\u00A70\n\n_La magia parece emanar de lo más profundo de las fortalezas cercanas. No puede venir de los goblins, ya que su magia es encantadora, pero desenfocada. Allí", + "twilightforest.book.darktower.3": "debe haber alguna fuerza aún activa en los bastiones.\n\n\u00A78[[Entrada siguiente]]\u00A70\n\n_Mi análisis indica que proviene de varias fuentes, operando como un grupo. Volveré a la fortaleza después de reabastecerme...", + + "twilightforest.book.yeticave.1": "\u00A78[[Un cuaderno de explorador, cubierto de escarcha]]\u00A70\n\n_La ventisca que rodea estas tierras nevadas es incesante. No se trata de una nevada ordinaria: es un fenómeno mágico. Tendré que realizar experimentos para encontrar", + "twilightforest.book.yeticave.2": "lo que es capaz de causar tal efecto.\n\n\u00A78[[Entrada siguiente]]\u00A70\n\n_La maldición parece ser de un tipo demasiado poderoso para que un solo ser la produzca. Serían necesarios varios magos trabajando en combinación.", + "twilightforest.book.yeticave.3": "Si uno de los magos dejara de contribuir, la ventisca se calmaría. Extrañamente, mis adivinaciones no muestran señales de ningún mago vivo cercano. Sin embargo, vi algo interesante en una de las torres de techo puntiagudo cercanas...", + + "twilightforest.book.icetower.1": "\u00A78[[El cuaderno de un explorador, cubierto de hielo]]\u00A70\n\n_He superado una ventisca, sólo para encontrarme con esta terrible tormenta de hielo en la cima del glaciar. Mis exploraciones me han mostrado el esplendor de un palacio de hielo, que brilla con los colores de la aurora polar. Todo", + "twilightforest.book.icetower.2": "parece protegido por una especie de maldición.\n\n\u00A78[[Entrada siguiente]]\u00A70\n\n_No soy un novato. Esta maldición es alimentada por el poder de una criatura cercana. La causa de la maldición que rodea el pantano de fuego se construyó a partir del poder del líder de los", + "twilightforest.book.icetower.3": "minotauros de las cercanías.\n\n_Alrededor de este glaciar, hay masas de yetis. Quizás los yetis tengan algún tipo de líder...", + + "twilightforest.book.trollcave.1": "\u00A78[[Un cuaderno de explorador, dañado por el ácido]]\u00A70\n\n_Parece que no hay forma de protegerme de la tormenta tóxica que rodea esta zona. En mis breves excursiones, también he encontrado otro hechizo de protección, similar a los", + "twilightforest.book.trollcave.2": "otros que he presenciado. El hechizo debe estar conectado a la tormenta tóxica de alguna manera. Más investigación para seguir...\n\n\u00A78[[Entrada siguiente]]\u00A70\n\n_Tal magia climática suprema debe ser el resultado de", + "twilightforest.book.trollcave.3": "múltiples e invictos grandes males en este mundo. Mis estudios contienen varias pistas que apuntan a un pantano abrasador, un bosque cubierto de profunda oscuridad y un reino cubierto de nieve.", + + "twilightforest.book.unknown.1": "\u00A78[[Este libro muestra signos de haber sido copiado muchas veces]]\u00A70\n\n_No puedo explicar el campo que rodea esta estructura, pero la magia es poderosa. Si esta maldición es como las otras, entonces la respuesta para desbloquearla está en otra parte. Tal vez hay", + "twilightforest.book.unknown.2": "algo que he dejado sin hacer, o algún monstruo que aún no he vencido. Tendré que regresar. Volveré a este lugar más tarde, para ver si algo ha cambiado.", + + // Fluid + + "fluid.fierymetal": "Fierro fundido", + "fluid.knightmetal": "Caballero de Metal Fundido", + "fluid.fiery_essence": "Esencia ardiente", + + // TCon + + "material.nagascale": "Escama Naga", + "material.steeleaf": "Hoja de Acero", + "material.fierymetal": "Ardiente", + "material.knightmetal": "Caballero", + "material.raven_feather": "Pluma de Cuervo", + + "modifier.twilit": "Twilit", + "modifier.twilit.desc": "§oLa bendición iluminadora del Twilight Forest§r.\nMás rápido en el Twilight Forest.\nMás daños fuera del Twilight Forest.", + "modifier.twilit.extra.speed": "Velocidad de extracción en Twilight Forest: +%s", + "modifier.twilit.extra.damage": "Daños fuera del Twilight Forest: +%s", + "modifier.precipitate": "Precipitate", + "modifier.precipitate.desc": "§oEl último plan de escape en pie.§r\nCuanto menos salud tenga, más rápido será.", + "modifier.synergy": "Sinergia", + "modifier.synergy.desc": "§oMira mamá, no hay musgo!§r\nSe reparará por sí mismo si tienes Hoja de Acero en tu barra de acceso.", + "modifier.stalwart": "Incondicional", + "modifier.stalwart.desc": "§o_Los valientes y audaces.§r\nGolpear a una entidad puede hacer que te sientas envalentonado.", + "modifier.veiled": "Velada", + "modifier.veiled.desc": "§oComo un espectro!§r\nEl proyectil será invisible.", + + // Immersive Engineering + "desc.immersiveengineering.info.shader.rarity.twilight": "Twilight", + + "item.twilightforest.shader": "Twilit Shader: %s", + "item.twilightforest.shader_bag": "Twilit %s Shader Bag", + + "item.twilightforest.shader.name.twilight": "Twilight", + "item.twilightforest.shader.name.firefly": "Luciérnaga", + "item.twilightforest.shader.name.questing_ram": "Carnero de la Búsqueda", + "item.twilightforest.shader.name.ironwood": "Madera de Hierro", + "item.twilightforest.shader.name.steeleaf": "Hoja de Acero", + "item.twilightforest.shader.name.knightly": "Caballero de Metal", + "item.twilightforest.shader.name.fiery": "Ardiente", + "item.twilightforest.shader.name.snakestone": "Piedra de la Serpiente", + "item.twilightforest.shader.name.naga": "Naga", + "item.twilightforest.shader.name.lich": "Lich", + "item.twilightforest.shader.name.mazestone": "Piedra de Laberinto", + "item.twilightforest.shader.name.pinch_beetle": "Escarabajo de Pinzas", + "item.twilightforest.shader.name.minoshroom": "Minosetauro", + "item.twilightforest.shader.name.hydra": "Hidra", + "item.twilightforest.shader.name.underbrick": "Subsuelo de Ladrillos", + "item.twilightforest.shader.name.knight_phantom": "Caballero Fantasma", + "item.twilightforest.shader.name.towerwood": "Torre de Madera", + "item.twilightforest.shader.name.carminite": "Carminita", + "item.twilightforest.shader.name.ur-ghast": "Ur-Ghast", + "item.twilightforest.shader.name.alpha_yeti": "Yeti Alfa", + "item.twilightforest.shader.name.auroralized": "Auroralizado", + "item.twilightforest.shader.name.snow_queen": "Reina de las Nieves", + "item.twilightforest.shader.name.cube_of_annihilation": "Cubo de la Aniquilación", + "item.twilightforest.shader.name.final_castle": "Castillo Final", + + // Optifine + "twilightforest.gui.optifine.title": "AVISO: OPTIFINE DETECTADO", + "twilightforest.gui.optifine.message": "Antes de continuar, por favor, tenga en cuenta que Optifine es conocido por causar fallos, errores visuales de entidades multiparte y muchos otros problemas.\n\nAntes de informar de un error, por favor, elimine Optifine primero y compruebe de nuevo si el error sigue presente.\n\nLos problemas relacionados con Optifine no pueden ser resueltos por Twilight Forest!\n\nEsta pantalla puede ser desactivada en la configuración del cliente." +} diff --git a/src/main/resources/assets/twilightforest/lang/es_ec.json b/src/main/resources/assets/twilightforest/lang/es_ec.json new file mode 100644 index 0000000000..a0d52caef9 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/es_ec.json @@ -0,0 +1,1316 @@ +{ + "itemGroup.twilightforest": "Twilight Forest", + + // ADVANCEMENTS + "advancement.twilightforest.root.desc": "Entra en el misterioso bosque mágico: the Twilight Forest.", + + // General progression + "advancement.twilightforest.hedge": "Golpeador de Bichos", + "advancement.twilightforest.hedge.desc": "Derrota a una araña en un %s.", + + "advancement.twilightforest.hill1": "Las botas son mías!", + "advancement.twilightforest.hill1.desc": "Derrota a un %s en un pequeño %s.", + "advancement.twilightforest.hill2": "Qué fue ese ruido?", + "advancement.twilightforest.hill2.desc": "Derrota a un %s en un medio %s.", + "advancement.twilightforest.hill3": "Veo a través de ti", + "advancement.twilightforest.hill3.desc": "Derrota a un %s en un gran %s.", + + "advancement.twilightforest.quest_ram": "Consumación de Baaahs", + "advancement.twilightforest.quest_ram.desc": "Dale al %s lo que le falta.", + + // Map + "advancement.twilightforest.magic_map_focus": "Con El Fuego Se Escribe", + "advancement.twilightforest.magic_map_focus.desc": "Elabora el %s con un %s, %s, y %s.", + "advancement.twilightforest.magic_map": "Puedo Ver Para Siempre", + "advancement.twilightforest.magic_map.desc": "Haz los %s.", + "advancement.twilightforest.maze_map": "Y Ahora, a Encontrar la Salida", + "advancement.twilightforest.maze_map.desc": "Elabora los %s después de obtener el foco del laberinto.", + "advancement.twilightforest.ore_map": "Cómo puede merecer la pena?", + "advancement.twilightforest.ore_map.desc": "Haz los %s.", + + // Mainline beginning progression + "advancement.twilightforest.twilight_hunter": "El Silencio del Bosque", + "advancement.twilightforest.twilight_hunter.desc": "Cazar algo de la fauna local.", + + "advancement.twilightforest.kill_naga": "Es Hora de Igualar la Balanza", + "advancement.twilightforest.kill_naga.desc": "Mata al %s en su patio del bosque y obtén un %s para superar la barrera mágica que rodea la torre del Lich.", + "advancement.twilightforest.naga_armors": "Armero Naga", + "advancement.twilightforest.naga_armors.desc": "Crea la armadura de pecho y de piernas de %s.", + + "advancement.twilightforest.kill_lich": "Trae a tus muertos", + "advancement.twilightforest.kill_lich.desc": "Mata a los % en lo alto de su torre y recupera un cetro para eliminar los mosquitos venenosos del Pantano, ver a través de la oscuridad cegadora de la maldición del Bosque Oscuro y resistir el frío del Bosque Nevado.", + "advancement.twilightforest.lich_scepters": "Por Nuestros Poderes Combinados!", + "advancement.twilightforest.lich_scepters.desc": "Consigue los cuatro cetros de poder.", + + // Swamp Progression + "advancement.twilightforest.progress_labyrinth": "El Poderoso Stroganoff", + "advancement.twilightforest.progress_labyrinth.desc": "El guiso de carne y hongos te calienta agradablemente, lo suficiente como para que sientas que estás lo suficientemente aclimatado como para aventurarte en el Pantano del Fuego.", + "advancement.twilightforest.kill_hydra": "Cazador de Hidras", + "advancement.twilightforest.kill_hydra.desc": "Derrota a los poderosos %s y empodérate.", + "advancement.twilightforest.mazebreaker": "Rompiendo el Laberinto", + "advancement.twilightforest.mazebreaker.desc": "Encuentra el pico %s en la bóveda secreta del laberinto.", + "advancement.twilightforest.hydra_chop": "Chuleta de Hidra, Baby!", + "advancement.twilightforest.hydra_chop.desc": "Disminuye el consumo de carne de %s hydra cuando la barra de comida esté vacía.", + + // Dark Forest Progression + "advancement.twilightforest.progress_trophy_pedestal": "Trofeo de Campeón", + "advancement.twilightforest.progress_trophy_pedestal.desc": "Reclama tu título colocando un trofeo en el pedestal de las ruinas del bosque oscuro.", + "advancement.twilightforest.progress_knights": "Aclimatación de Carminita", + "advancement.twilightforest.progress_knights.desc": "Acomoda a los inquietos fantasmas en la Tumba del Caballero y los dispositivos de la torre de carminita te obedecerán.", + "advancement.twilightforest.ghast_trap": "Algo extraño en la Torre de Madera", + "advancement.twilightforest.ghast_trap.desc": "Mata a los %s alrededor de un %s y actívalo para arrancar el %s del cielo!", + "advancement.twilightforest.progress_ur_ghast": "Lágrimas de Fuego", + "advancement.twilightforest.progress_ur_ghast.desc": "Toca las lágrimas rojas y ardientes de los %s.", + + "advancement.twilightforest.experiment_115": "Carne misteriosa?", + "advancement.twilightforest.experiment_115.desc": "Parece un pastel, aunque...", + "advancement.twilightforest.experiment_115_2": "Tomar nota: ¡Un gran éxito!", + "advancement.twilightforest.experiment_115_2.desc": "Es tan delicioso y húmedo!", + + // Snow Forest Progression + "advancement.twilightforest.progress_yeti": "Pelaje Alfa", + "advancement.twilightforest.progress_yeti.desc": "Cubre tus prendas con el suave pelaje de los %s, manteniéndote a salvo del frío del Glaciar.", + "advancement.twilightforest.progress_glacier": "Cielos Despejados", + "advancement.twilightforest.progress_glacier.desc": "Derrota a los %s encima de los %s.", + "advancement.twilightforest.arctic_dyed": "Ponerse a la Moda", + "advancement.twilightforest.arctic_dyed.desc": "Tiñe las cuatro piezas de la Armadura Ártica.", + + // Mid-way Misc. Stuff + "advancement.twilightforest.glass_sword": "Una Maravilla De Un Solo Golpe", + "advancement.twilightforest.glass_sword.desc": "Espero que lo hayas aprovechado.", + + "advancement.twilightforest.fiery_set": "Galones de Sangre y Lágrimas", + "advancement.twilightforest.fiery_set.desc": "Empuña una herramienta o arma mientras tienes al menos una pieza de armadura de ardiente en tu inventario.", + + // Highlands + "advancement.twilightforest.progress_merge": "Enfrentamiento Final", + "advancement.twilightforest.progress_merge.desc": "Mata a los %s, %s y %s para eliminar la lluvia ácida y envalentonarte para las Tierras Altas.", + "advancement.twilightforest.troll": "Trolleamos un Poco", + "advancement.twilightforest.troll.desc": "Encuentra y mata a un %s.", + "advancement.twilightforest.beanstalk": "Jack y las Habichuelas", + "advancement.twilightforest.beanstalk.desc": "Consigue algunos %s en las cuevas de los trolls y úsalos en el suelo brillante bajo las nubes.", + "advancement.twilightforest.giants": "Estoy en las Nubes", + "advancement.twilightforest.giants.desc": "Mata a un %s en las nubes, recupera un %s, y vuelve a las cuevas de los trolls.", + "advancement.twilightforest.progress_troll": "Deseo Más Quemaduras", + "advancement.twilightforest.progress_troll.desc": "Encuentra los %s en las cuevas de los trolls, y podrás quemar las barreras de espinas.", + "advancement.twilightforest.progress_thorns": "Más Allá De Las Espinas [NYI]", + "advancement.twilightforest.progress_thorns.desc": "Pasa por las Tierras Espinosas y desbloquea la puerta del castillo.", + "advancement.twilightforest.progress_castle": "Wow Que Super Castillo!!! [NYI]", + "advancement.twilightforest.progress_castle.desc": "Qué podría haber en ese castillo?!?", + + // Collections + "advancement.twilightforest.twilight_dining": "Cenamos en el Eterno Atardecer", + "advancement.twilightforest.twilight_dining.desc": "Come toda la comida exclusiva de Twilight Forest.", + "advancement.twilightforest.experiment_115_3": "Comer 115 cada día, 115 años, para siempre", + "advancement.twilightforest.experiment_115_3.desc": "comer experimento ciento quince durante todo el día, para siempre, ciento quince veces experimento ciento quince, experimento ciento quince punto com, doble-u doble-u punto experimento ciento quince punto com, ciento quince años, cada minuto experimento ciento quince punto com, doble-u doble-u punto ciento quince punto com", + "advancement.twilightforest.arborist": "Dendrologista Maníaco", + "advancement.twilightforest.arborist.desc": "Prepara tus hachas y tijeras. Busca en todos los rincones y consigue todo lo que provenga de los árboles. Construye, saquea y obtén cada tabla... árbol joven... hojas... más... todo. ¡TODO!", + + "twilightforest.twilight_portal.unsafe": "No parece seguro aquí...", + "twilightforest.trophy_pedestal.ineligible": "No eres digno.", + "twilightforest.ore_meter.range": "Radio: %s, Origen: [%s, %s]", + "twilightforest.ore_meter.exposed": "Expuesto: %s", + "twilightforest.scepter_charges": "Quedan %d cargas", + + // Commands + "commands.tffeature.usage": "/tffeature ", + "commands.tffeature.not_in_twilight_forest": "You are not in the Twilight Forest dimension", + "commands.tffeature.nearest": "The nearest feature is %s", + "commands.tffeature.center": "Center of feature: %s", + "commands.tffeature.chunk": "Are in feature chunk: %s", + "commands.tffeature.structure.inside": "You are in the structure for that feature", + "commands.tffeature.structure.outside": "You are not in the structure for that feature", + "commands.tffeature.structure.required": "You are not in a structure", + "commands.tffeature.structure.conquer.status": "Structure conquer flag: %s", + "commands.tffeature.structure.conquer.update": "Structure conquer flag was %s, changing to %s", + "commands.tffeature.locate.usage": "/tffeature locate ", + "commands.tfreload.reload": "Reloading Twilight Forest Shaders!", + + // Biomes + "biome.twilightforest.forest": "Bosque Crepuscular", + "biome.twilightforest.dense_forest": "Bosque Denso", + "biome.twilightforest.firefly_forest": "Bosque de las Luciérnagas", + "biome.twilightforest.clearing": "Despeje Crepuscular", + "biome.twilightforest.oak_savannah": "Sabana de Roble", + "biome.twilightforest.stream": "Corriente Crepuscular", + "biome.twilightforest.lake": "Lago Crepuscular", + "biome.twilightforest.mushroom_forest": "Bosque de Hongos", + "biome.twilightforest.dense_mushroom_forest": "Bosque Denso de Hongos", + "biome.twilightforest.enchanted_forest": "Bosque Encantado", + "biome.twilightforest.spooky_forest": "Bosque Espeluznante", + "biome.twilightforest.swamp": "TPantano Crepuscular", + "biome.twilightforest.fire_swamp": "Pantano de Fuego", + "biome.twilightforest.dark_forest": "Bosque Oscuro", + "biome.twilightforest.dark_forest_center": "Centro del Bosque Oscuro", + "biome.twilightforest.snowy_forest": "Bosque Nevado", + "biome.twilightforest.glacier": "Glaciar Crepuscular", + "biome.twilightforest.highlands": "Tierras Altas Crepusculares", + "biome.twilightforest.thornlands": "Tierras Espinosas", + "biome.twilightforest.final_plateau": "Meseta Final", + + // Gamerules + "gamerule.tfEnforcedProgression": "Progresión de Twilight Forest", + + // Enchantments + "enchantment.twilightforest.fire_react": "Reacción al Fuego", + "enchantment.twilightforest.chill_aura": "Aura fría", + + // Effects + "effect.twilightforest.frosted": "Escarchado", + + // Blocks + "block.twilightforest.twilight_oak_log": "Tronco de Roble Crepuscular", + "block.twilightforest.canopy_log": "Tronco de Dosel Arbóreo", + "block.twilightforest.mangrove_log": "Tronco de Manglar", + "block.twilightforest.dark_log": "Tronco de Madera Oscura", + "block.twilightforest.stripped_twilight_oak_log": "Tronco de Roble Crepuscular Sin Corteza", + "block.twilightforest.stripped_canopy_log": "Tronco de Dosel Arbóreo Sin Corteza", + "block.twilightforest.stripped_mangrove_log": "Tronco de Manglar Sin Corteza", + "block.twilightforest.stripped_dark_log": "Tronco de Madera Oscura Sin Corteza", + "block.twilightforest.twilight_oak_wood": "Madera de Roble Crepuscular", + "block.twilightforest.canopy_wood": "Madera de Dosel Arbóreo", + "block.twilightforest.mangrove_wood": "Madera de Manglar", + "block.twilightforest.dark_wood": "Madera Oscura", + "block.twilightforest.stripped_twilight_oak_wood": "Madera de Roble Crepuscular Sin Corteza", + "block.twilightforest.stripped_canopy_wood": "Madera de Dosel Arbóreo Sin Corteza", + "block.twilightforest.stripped_mangrove_wood": " Madera de Manglar Despojada", + "block.twilightforest.stripped_dark_wood": " Madera oscura despojada", + "block.twilightforest.twilight_oak_leaves": "Hojas de Roble Crepuscular", + "block.twilightforest.canopy_leaves": "Hojas de Dosel Arbóreo", + "block.twilightforest.mangrove_leaves": "Hojas de Manglar", + "block.twilightforest.rainboak_leaves": "Hojas de Roble Arco Iris", + "block.twilightforest.firefly": "Luciérnaga", + "block.twilightforest.cicada": "Cigarra", + "block.twilightforest.cicada.desc": "Y si esto se pudiera lanzar contra alguien con un cañón de riel...?", + "block.twilightforest.twilight_portal": "Portal de Twilight Forest", + "block.twilightforest.maze_stone": "Piedra de Laberinto", + "block.twilightforest.maze_stone_brick": "Ladrillos de Piedra de Laberinto", + "block.twilightforest.maze_stone_chiseled": "Piedra de Laberinto Grabados", + "block.twilightforest.maze_stone_decorative": "Ladrillos de Piedra de Laberinto Decorativo", + "block.twilightforest.maze_stone_cracked": "Piedra de Laberinto Agrietada", + "block.twilightforest.maze_stone_mossy": "Piedra de Laberinto Musgosa", + "block.twilightforest.maze_stone_mosaic": "Mosaicos de Piedra del Laberinto", + "block.twilightforest.maze_stone_border": "Borde de Piedra de Laberinto", + "block.twilightforest.maze_stone_ceiling": "Techo de Piedra de Laberinto", + "block.twilightforest.spiral_bricks": "Ladrillos en Espiral", + "block.twilightforest.hedge": "Cobertura", + "block.twilightforest.boss_spawner_naga": "Generador de Jefe Naga", + "block.twilightforest.boss_spawner_lich": "Generador de Jefe Lich", + "block.twilightforest.boss_spawner_minoshroom": "Generador de Jefe Minosetauro", + "block.twilightforest.boss_spawner_hydra": "Generador de Jefe Hidra", + "block.twilightforest.boss_spawner_knight_phantom": "Generador de Jefe Caballero Fantasma", + "block.twilightforest.boss_spawner_ur_ghast": "Genrador de Jefe Ur-Ghast", + "block.twilightforest.boss_spawner_alpha_yeti": "Generador de Jefe Yeti", + "block.twilightforest.boss_spawner_snow_queen": "Generador de Jefe Reina de las Nieves", + "block.twilightforest.boss_spawner_final_boss": "Generador de Jefe Final", + "block.twilightforest.firefly_jar": "Jarra con Luciérnaga", + "block.twilightforest.cicada_jar": "Jarra con Cigarra", + "block.twilightforest.moss_patch": "Parche de Musgo [WIP]", + "block.twilightforest.mayapple": "Mayapple", + "block.twilightforest.clover_patch": "Hoja de Trébol [NYI]", + "block.twilightforest.fiddlehead": "Brotes de Helecho", + "block.twilightforest.mushgloom": "Hongo Brillante", + "block.twilightforest.torchberry_plant": "Planta de Antorcha", + "block.twilightforest.root_strand": "Hilos de raíz", + "block.twilightforest.fallen_leaves": "Montón de hojas", + "block.twilightforest.root": "Raíces", + "block.twilightforest.liveroot_block": "Raíces vivas", + "block.twilightforest.uncrafting_table": "Mesa de Desfabricación", + "block.twilightforest.smoker": "Ahumador", + "block.twilightforest.encased_smoker": "Ahumador Encapsulado", + "block.twilightforest.fire_jet": "Chorro de Fuego", + "block.twilightforest.encased_fire_jet": "Chorro de Fuego Encapsulado", + "block.twilightforest.naga_stone_head": "Cabeza de Piedra de Naga", + "block.twilightforest.naga_stone": "Piedra de Naga", + "block.twilightforest.twilight_oak_sapling": "Retoño de Roble Crepuscular Enfermizo", + "block.twilightforest.canopy_sapling": "Retoño de Dosel Arbóreo", + "block.twilightforest.mangrove_sapling": "Retoño de Manglar Crepuscular", + "block.twilightforest.darkwood_sapling": "Retoño del Árbol de Madera Oscura", + "block.twilightforest.hollow_oak_sapling": "Retoño de Roble Robusto Crepuscular", + "block.twilightforest.time_sapling": "Retoño del Árbol del Tiempo", + "block.twilightforest.transformation_sapling": "Retoño del Árbol de Transformación", + "block.twilightforest.mining_sapling": "Retoño del Árbol Minero", + "block.twilightforest.sorting_sapling": "Retoño del Árbol de Clasificación", + "block.twilightforest.rainboak_sapling": "Retoño de Roble Arcoíris", + "block.twilightforest.moonworm": "Gusano Lunar", + "block.twilightforest.time_log": "Tronco del Árbol del Tiempo", + "block.twilightforest.transformation_log": "Tronco del Árbol de Transformación", + "block.twilightforest.mining_log": "Tronco del Árbol Minero", + "block.twilightforest.sorting_log": "Tronco del Árbol de Clasificación", + "block.twilightforest.stripped_time_log": "Tronco Sin Corteza del Árbol del Tiempo", + "block.twilightforest.stripped_transformation_log": "Tronco Sin Corteza del Árbol de Transformación", + "block.twilightforest.stripped_mining_log": "Tronco Sin Corteza del Árbol Minero", + "block.twilightforest.stripped_sorting_log": "Tronco Sin Corteza del Árbol de Clasificación", + "block.twilightforest.sorting_wood": "Madera del Árbol de Clasificación", + "block.twilightforest.mining_wood": "Madera del Árbol Minero", + "block.twilightforest.transformation_wood": "Madera del Árbol de Transformación", + "block.twilightforest.time_wood": "Madera del Árbol del Tiempo", + "block.twilightforest.stripped_sorting_wood": "Madera Pelada del Árbol de Clasificación", + "block.twilightforest.stripped_mining_wood": "Madera Pelada del Árbol Minero", + "block.twilightforest.stripped_transformation_wood": "Madera Pelada del Árbol de Transformación", + "block.twilightforest.stripped_time_wood": "Madera Pelada del Árbol del Tiempo", + "block.twilightforest.time_log_core": "Reloj del Árbol del Tiempo", + "block.twilightforest.transformation_log_core": "Corazón del Árbol de Transformación", + "block.twilightforest.mining_log_core": "Núcleo del Árbol Minero", + "block.twilightforest.sorting_log_core": "Motor del Árbol de Clasificación", + "block.twilightforest.time_leaves": "Hojas del Árbol del Tiempo", + "block.twilightforest.transformation_leaves": "Hojas del Árbol de Transformación", + "block.twilightforest.mining_leaves": "Hojas del Árbol Minero", + "block.twilightforest.sorting_leaves": "Hojas del Árbol de Clasificación", + "block.twilightforest.tower_wood": "Tablones de la Torre de Madera", + "block.twilightforest.tower_wood_encased": "Madera Encapsulada de la Torre de Madera", + "block.twilightforest.tower_wood_cracked": "Madera Agrietada de la Torre de Madera", + "block.twilightforest.tower_wood_mossy": "Madera Musgosa de la Torre de Madera", + "block.twilightforest.tower_wood_infested": "Madera Infestada de la Torre de Madera", + "block.twilightforest.reappearing_block": "Bloque Reaparecedor", + "block.twilightforest.vanishing_block": "Bloque de Desaparición", + "block.twilightforest.locked_vanishing_block": "Bloque de Desaparición Bloqueado", + "block.twilightforest.carminite_builder": "Constructor de Carminita", + "block.twilightforest.antibuilder": "Anti-Construcción", + "block.twilightforest.ghast_trap": "Trampa de Ghast", + "block.twilightforest.carminite_reactor": "Reactor de Carminita", + "block.twilightforest.fake_gold": "Oro Falso", + "block.twilightforest.fake_diamond": "Diamante Falso", + "block.twilightforest.trophy": "Trofeo de Twilight Forest", + "block.twilightforest.stronghold_shield": "Escudo de la Fortaleza", + "block.twilightforest.trophy_pedestal": "Pedestal para Trofeos", + "block.twilightforest.aurora_block": "Bloque de Aurora", + "block.twilightforest.underbrick": "Subsuelo de Ladrillos", + "block.twilightforest.underbrick_mossy": "Subsuelo de Ladrillos Musgoso", + "block.twilightforest.underbrick_cracked": "Subsuelo de Ladrillos Agrietado", + "block.twilightforest.underbrick_floor": "Piso de Subsuelo de Ladrillos [NYI]", + "block.twilightforest.brown_thorns": "Espinas", + "block.twilightforest.green_thorns": "Espinas Verdes", + "block.twilightforest.burnt_thorns": "Espinas Quemadas", + "block.twilightforest.thorn_rose": "Rosa Espinosa", + "block.twilightforest.thorn_leaves": "Hojas de Espinas", + "block.twilightforest.beanstalk_leaves": "Hojas de Frijol", + "block.twilightforest.deadrock_weathered": "Roca Muerta Desgastada", + "block.twilightforest.deadrock_cracked": "Roca Muerta Agrietada", + "block.twilightforest.deadrock": "Roca Muerta", + "block.twilightforest.dark_leaves": "Hojas de Madera Oscura", + "block.twilightforest.auroralized_glass": "Vidrio Auroralizado [NYI]", + "block.twilightforest.aurora_pillar": "Pilar de Aurora", + "block.twilightforest.aurora_slab": "Losa de Aurora", + "block.twilightforest.trollsteinn": "Trollsteinn", + "block.twilightforest.wispy_cloud": "Nube de Agua", + "block.twilightforest.fluffy_cloud": "Nube Esponjosa", + "block.twilightforest.giant_cobblestone": "Piedra Labrada Gigante", + "block.twilightforest.giant_log": "Tronco Gigante", + "block.twilightforest.giant_leaves": "Hojas Gigantes", + "block.twilightforest.giant_obsidian": "Obsidiana Gigante", + "block.twilightforest.uberous_soil": "Tierra Uberous", + "block.twilightforest.huge_stalk": "Tallos Enormes", + "block.twilightforest.huge_mushgloom": "Enorme Hongo Brillante", + "block.twilightforest.huge_mushgloom_stem": "Enorme Tallo de Hongo Brillante", + "block.twilightforest.trollvidr": "Trollvidr", + "block.twilightforest.unripe_trollber": "Trollber Sin madurar", + "block.twilightforest.trollber": "Trollber", + "block.twilightforest.slider": "Trampa Deslizante [NYI]", + "block.twilightforest.knightmetal_block": "Bloque Hecho del Caballero de Metal", + "block.twilightforest.huge_lilypad": "Enorme Almohadilla de Lirio", + "block.twilightforest.huge_waterlily": "Enorme Lirio de Agua", + "block.twilightforest.castle_brick": "Ladrillos del Castillo", + "block.twilightforest.castle_brick_worn": "Ladrillos Desgastados del Castillo", + "block.twilightforest.castle_brick_cracked": "Ladrillos Agrietados del Castillo", + "block.twilightforest.castle_brick_roof": "Azulejo del Techo del Castillo", + "block.twilightforest.castle_brick_mossy": "Ladrillos Musgosos del Castillo", + "block.twilightforest.castle_brick_frame": "Ladrillos Gruesos del Castillo", + "block.twilightforest.castle_stairs_brick": "Escaleras de Ladrillo del Castillo", + "block.twilightforest.castle_stairs_worn": "Escaleras Desgastadas de Ladrillo del Castillo", + "block.twilightforest.castle_stairs_cracked": "Escaleras Agrietadas de Ladrillo del Castillo", + "block.twilightforest.castle_stairs_mossy": "Escaleras Musgosas de Ladrillo del Castillo", + "block.twilightforest.castle_door_yellow": "Puerta Amarilla del Castillo", + "block.twilightforest.castle_door_purple": "Puerta Violeta del Castillo", + "block.twilightforest.castle_door_pink": "Puerta Rosada del Castillo", + "block.twilightforest.castle_door_blue": "Puerta Azul del Castillo", + "block.twilightforest.castle_rune_brick_pink": "Ladrillo Rúnico Rosa del Castillo ", + "block.twilightforest.castle_rune_brick_blue": "Ladrillo Rúnico Azul del Castillo", + "block.twilightforest.castle_rune_brick_yellow": "Ladrillo Rúnico Amarillo del Castillo", + "block.twilightforest.castle_rune_brick_purple": "Ladrillo Rúnico Morado del Castillo", + "block.twilightforest.castle_pillar_encased": "Pilar Encapsulado de Ladrillo del Castillo ", + "block.twilightforest.castle_pillar_encased_tile": "Azulejo Encapsulado de Ladrillos del Castillo ", + "block.twilightforest.castle_pillar_bold": "Pilar Audaz de Ladrillos del Castillo", + "block.twilightforest.castle_pillar_bold_tile": "Azulejo Audaz de Ladrillo del Castillo ", + "block.twilightforest.castle_stairs_encased": "Escaleras Encapsuladas de Ladrillo del Castillo", + "block.twilightforest.castle_stairs_bold": "Escaleras Audaces de Ladrillo del Castillo", + "block.twilightforest.force_field_purple": "Campo de Fuerza Violeta", + "block.twilightforest.force_field_pink": "Campo de Fuerza Rosa", + "block.twilightforest.force_field_orange": "Campo de Fuerza Naranja", + "block.twilightforest.force_field_green": "Campo de Fuerza Verde", + "block.twilightforest.force_field_blue": "Campo de Fuerza Azul", + "block.twilightforest.ironwood_block": "Bloque de Madera de Hierro", + "block.twilightforest.fiery_block": "Bloque de Metal Ardiente", + "block.twilightforest.steeleaf_block": "Bloque de Hoja de Acero", + "block.twilightforest.arctic_fur_block": "Bloque de Pelaje Ártico", + "block.twilightforest.carminite_block": "Bloque de Carminita", + "block.twilightforest.cinder_furnace": "Horno de Ceniza [NYI]", + "block.twilightforest.cinder_log": "Tronco de Ceniza [NYI]", + "block.twilightforest.cinder_wood": "Madera de Ceniza [NYI]", + "block.twilightforest.twilight_portal_miniature_structure": "Portal Miniatura de Twilight [NYI]", + "block.twilightforest.naga_courtyard_miniature_structure": "Patio Naga Miniatura [NYI]", + "block.twilightforest.lich_tower_miniature_structure": "Torre del Lich Miniatura [NYI]", + "block.twilightforest.stone_twist": "Piedra Torcida [NYI]", + "block.twilightforest.stone_twist_thin": "Pilar de Piedra [NYI]", + "block.twilightforest.lapis_block": "Bloque de Lapislázuli [NYI]", + "block.twilightforest.etched_nagastone": "Piedra Naga Grabada", + "block.twilightforest.nagastone_pillar": "Pilar de Piedra Naga", + "block.twilightforest.nagastone_stairs_left": "Escaleras de Piedra Naga (Izquierda)", + "block.twilightforest.nagastone_stairs_right": "Escaleras de Piedra Naga (Derecha)", + "block.twilightforest.etched_nagastone_mossy": "Piedra Naga con Grabado Musgoso", + "block.twilightforest.nagastone_pillar_mossy": "Pilar de Piedra Naga Musgosa", + "block.twilightforest.nagastone_stairs_mossy_left": "Escaleras Musgosa de Piedra Naga (Izquierda)", + "block.twilightforest.nagastone_stairs_mossy_right": "Escaleras Musgosa de Piedra Naga (Derecha)", + "block.twilightforest.etched_nagastone_weathered": "Piedra Naga Grabada en Ruinas", + "block.twilightforest.nagastone_pillar_weathered": "Pilar de Piedra Naga en Ruinas", + "block.twilightforest.nagastone_stairs_weathered_left": "Escaleras de Piedra de Naga desgastadas (Izquierda)", + "block.twilightforest.nagastone_stairs_weathered_right": "Escaleras de Piedra de Naga desgastadas (Derecha)", + "block.twilightforest.iron_ladder": "Escalera de Hierro", + "block.twilightforest.terrorcotta_circle": "Terracota (Circular)", + "block.twilightforest.terrorcotta_diagonal": "Terracota (Diagonal)", + "block.twilightforest.experiment_115": "Experimento 115", + "block.twilightforest.hydra_trophy": "Trofeo de Hidra", + "block.twilightforest.naga_trophy": "Trofeo de Naga", + "block.twilightforest.minoshroom_trophy": "Trofeo de Minosetauro", + "block.twilightforest.knight_phantom_trophy": "Trofeo de Caballero Fantasma", + "block.twilightforest.lich_trophy": "Trofeo de Lich", + "block.twilightforest.ur_ghast_trophy": "Trofeo de Ur-Ghast", + "block.twilightforest.yeti_trophy": "Trofeo de Yeti Alfa", + "block.twilightforest.snow_queen_trophy": "Trofeo de Reina de las Nieves", + "block.twilightforest.quest_ram_trophy": "Trofeo del Carnero de la Búsqueda", + + "block.twilightforest.keepsake_casket": "Ataúd del recuerdo [WIP]", + "block.twilightforest.casket.broken": "Tu Ataúd está demasiado dañado para contener más objetos. Todos los artículos que se guardaron en tu ataúd se cayeron al suelo..", + "block.twilightforest.casket.locked": "¡Este Ataúd sólo puede ser abierto por %s!", + + "block.twilightforest.potted_twilight_oak_sapling": "Retoño del Árbol de Roble Crepuscular en Maceta", + "block.twilightforest.potted_canopy_sapling": "Retoño de Dosel Arbóreo en Maceta", + "block.twilightforest.potted_mangrove_sapling": "Retoño de Manglar Crepuscular en Maceta", + "block.twilightforest.potted_darkwood_sapling": "Retoño del Árbol de Madera Oscura en Maceta", + "block.twilightforest.potted_hollow_oak_sapling": "Retoño de Roble Robusto Crepuscular en Maceta", + "block.twilightforest.potted_rainboak_sapling": "Retoño del Árbol de Roble Arcoíris en Maceta", + "block.twilightforest.potted_time_sapling": "Retoño del Árbol del Tiempo en Maceta", + "block.twilightforest.potted_trans_sapling": "Retoño del Árbol de la Transformación en Maceta", + "block.twilightforest.potted_mine_sapling": "Retoño del Árbol Minero en Maceta", + "block.twilightforest.potted_sort_sapling": "Retoño del Árbol de la Clasificación en Maceta", + "block.twilightforest.potted_mayapple": "Mayapple en Maceta", + "block.twilightforest.potted_fiddlehead": "Brotes de Helecho en Maceta", + "block.twilightforest.potted_mushgloom": "Hongo Brillante en Maceta", + "block.twilightforest.potted_thorn": "Espinas en Maceta", + "block.twilightforest.potted_green_thorn": "Espinas Verdes en Maceta", + "block.twilightforest.potted_dead_thorn": "Espinas Quemadas en Maceta", + + "block.twilightforest.canopy_planks": "Tablones de Dosel Arbóreo", + "block.twilightforest.canopy_stairs": "Esquelaras de Dosel Arbóreo", + "block.twilightforest.canopy_slab": "Losa de Dosel Arbóreo", + "block.twilightforest.canopy_button": "Botón de Dosel Arbóreo", + "block.twilightforest.canopy_fence": "Valla de Dosel Arbóreo", + "block.twilightforest.canopy_gate": "Puerta de Dosel Arbóreo", + "block.twilightforest.canopy_plate": "Placa de Presión de Dosel Arbóreo", + "block.twilightforest.canopy_trapdoor": "Trampilla de Dosel Arbóreo", + "block.twilightforest.canopy_door": "Puerta de Dosel Arbóreo", + "block.twilightforest.canopy_sign": "Letrero de Dosel Arbóreo", + "block.twilightforest.canopy_wall_sign": "Cuadro de Dosel Arbóreo", + + "block.twilightforest.dark_planks": "Tablones de Madera Oscura", + "block.twilightforest.dark_stairs": "Esquelaras de Madera Oscura", + "block.twilightforest.dark_slab": "Losa de Madera Oscura", + "block.twilightforest.dark_button": "Botón de Madera Oscura", + "block.twilightforest.dark_fence": "Valla de Madera Oscura", + "block.twilightforest.dark_gate": "Puerta de Valla de Madera Oscura", + "block.twilightforest.dark_plate": "Placa de Presión de Madera Oscura", + "block.twilightforest.dark_trapdoor": "Trampilla de Madera Oscura", + "block.twilightforest.dark_door": "Puerta de Madera Oscura", + "block.twilightforest.darkwood_sign": "Letrero de Madera Oscura", + "block.twilightforest.darkwood_wall_sign": "Cuadro de Madera Oscura", + + "block.twilightforest.mangrove_planks": "Tablones de Manglar", + "block.twilightforest.mangrove_stairs": "Esquelaras de Manglar", + "block.twilightforest.mangrove_slab": "Losa de Manglar", + "block.twilightforest.mangrove_button": "Botón de Manglar", + "block.twilightforest.mangrove_fence": "Valla de Manglar", + "block.twilightforest.mangrove_gate": "Puerta de Valla de Manglar", + "block.twilightforest.mangrove_plate": "Placa de Presión de Manglar", + "block.twilightforest.mangrove_trapdoor": "Trampilla de Manglar", + "block.twilightforest.mangrove_door": "Puerta de Manglar", + "block.twilightforest.mangrove_sign": "Letrero de Manglar", + "block.twilightforest.mangrove_wall_sign": "Cuadro de Manglar", + + "block.twilightforest.twilight_oak_planks": "Tablones de Roble Crepuscular", + "block.twilightforest.twilight_oak_stairs": "Esquelaras de Roble Crepuscular", + "block.twilightforest.twilight_oak_slab": "Losa de Roble Crepuscular", + "block.twilightforest.twilight_oak_button": "Botón de Roble Crepuscular", + "block.twilightforest.twilight_oak_fence": "Valla de Roble Crepuscular", + "block.twilightforest.twilight_oak_gate": "Puerta de Valla de Roble Crepuscular", + "block.twilightforest.twilight_oak_plate": "Placa de Presión de Roble Crepuscular", + "block.twilightforest.twilight_oak_trapdoor": "Trampilla de Roble Crepuscular", + "block.twilightforest.twilight_oak_door": "Puerta de Roble Crepuscular", + "block.twilightforest.twilight_oak_sign": "Letrero de Roble Crepuscular", + "block.twilightforest.twilight_wall_sign": "Cuadro de Roble Crepuscular", + + "block.twilightforest.time_planks": "Tablones del Árbol del Tiempo", + "block.twilightforest.time_stairs": "Esquelaras del Árbol del Tiempo", + "block.twilightforest.time_slab": "Losa del Árbol del Tiempo", + "block.twilightforest.time_button": "Botón del Árbol del Tiempo", + "block.twilightforest.time_fence": "Valla del Árbol del Tiempo", + "block.twilightforest.time_gate": "Puerta de Valla del Árbol del Tiempo", + "block.twilightforest.time_plate": "Placa de Presión del Árbol del Tiempo", + "block.twilightforest.time_trapdoor": "Trampilla del Árbol del Tiempo", + "block.twilightforest.time_door": "Puerta del Árbol del Tiempo", + "block.twilightforest.time_sign": "Letrero del Árbol del Tiempo", + "block.twilightforest.time_wall_sign": "Cuadro del Árbol del Tiempo", + + "block.twilightforest.trans_planks": "Tablones del Árbol de Transformación", + "block.twilightforest.trans_stairs": "Esquelaras del Árbol de Transformación", + "block.twilightforest.trans_slab": "Losa del Árbol de Transformación", + "block.twilightforest.trans_button": "Botón del Árbol de Transformación", + "block.twilightforest.trans_fence": "Valla del Árbol de Transformación", + "block.twilightforest.trans_gate": "Puerta de Valla del Árbol de Transformación", + "block.twilightforest.trans_plate": "Placa de Presión del Árbol de Transformación", + "block.twilightforest.trans_trapdoor": "Trampilla del Árbol de Transformación", + "block.twilightforest.trans_door": "Puerta del Árbol de Transformación", + "block.twilightforest.trans_sign": "Letrero del Árbol de Transformación", + "block.twilightforest.trans_wall_sign": "Cuadro del Árbol de Transformación", + + "block.twilightforest.mine_planks": "Tablones del Árbol Minero", + "block.twilightforest.mine_stairs": "Esquelaras del Árbol Minero", + "block.twilightforest.mine_slab": "Losa del Árbol Minero", + "block.twilightforest.mine_button": "Botón del Árbol Minero", + "block.twilightforest.mine_fence": "Valla del Árbol Minero", + "block.twilightforest.mine_gate": "Puerta de Valla del Árbol Minero", + "block.twilightforest.mine_plate": "Placa de Presión del Árbol Minero", + "block.twilightforest.mine_trapdoor": "Trampilla del Árbol Minero", + "block.twilightforest.mine_door": "Puerta del Árbol Minero", + "block.twilightforest.mine_sign": "Letrero del Árbol Minero", + "block.twilightforest.mine_wall_sign": "Cuadro del Árbol Minero", + + "block.twilightforest.sort_planks": "Tablones del Árbol de Clasificación", + "block.twilightforest.sort_stairs": "Esquelaras del Árbol de Clasificación", + "block.twilightforest.sort_slab": "Losa del Árbol de Clasificación", + "block.twilightforest.sort_button": "Botón del Árbol de Clasificación", + "block.twilightforest.sort_fence": "Valla del Árbol de Clasificación", + "block.twilightforest.sort_gate": "Puerta de Valla del Árbol de Clasificación", + "block.twilightforest.sort_plate": "Placa de Presión del Árbol de Clasificación", + "block.twilightforest.sort_trapdoor": "Trampilla del Árbol de Clasificación", + "block.twilightforest.sort_door": "Puerta del Árbol de Clasificación", + "block.twilightforest.sort_sign": "Letrero del Árbol de Clasificación", + "block.twilightforest.sort_wall_sign": "Cuadro del Árbol de Clasificación", + + "block.steeleaf.tooltip": "Reduce el daño por caída en un 25%.", + "block.arctic.tooltip": "Reduce el daño por caída en un 90%", + "block.knightmetal.tooltip": "Funciona como un cactus más fuerte", + + // Structures + "structure.twilight_portal": "Portal de Twilight", + "structure.hedge_maze": "Laberinto de Setos", + "structure.hollow_hill": "Colina Hueca", + "structure.quest_grove": "Búsqueda de la Arboleda", + "structure.mushroom_tower": "Castillo de los Hongos", + "structure.naga_courtyard": "Patio Naga", + "structure.lich_tower": "Torre del Lich", + "structure.minotaur_labyrinth": "Laberinto del Minotauro", + "structure.hydra_lair": "Guarida de la Hidra", + "structure.goblin_stronghold": "Fortaleza de los Goblins", + "structure.dark_tower": "La Torre Oscura", + "structure.yeti_cave": "Cueva del Yeti", + "structure.aurora_palace": "Palacio Aurora", + "structure.troll_cave_and_cloud_castle": "Cueva de los Trolls y Casa en las Nubes", + "structure.final_castle": "Castillo Final", + + // Items + "item.twilightforest.boarkchop": "Chuleta de Boark", + "item.twilightforest.naga_scale": "Escama Naga", + "item.twilightforest.naga_chestplate": "Tunica de Escama Naga", + "item.twilightforest.naga_leggings": "Mallas de Escama Naga", + "item.twilightforest.twilight_scepter": "Cetro Crepuscular", + "item.twilightforest.lifedrain_scepter": "Cetro de Robo de Vida", + "item.twilightforest.zombie_scepter": "Cetro Zombie", + "item.twilightforest.shield_scepter": "Cetro de Fortificación", + "item.twilightforest.ore_meter": "Medidor de Minerales [NYI]", + "item.twilightforest.magic_map": "Mapa Mágico", + "item.twilightforest.maze_map": "Mapa del Laberinto", + "item.twilightforest.ore_map": "Mapa de Laberinto/Mineral", + "item.twilightforest.raven_feather": "Pluma de Cuervo", + "item.twilightforest.magic_map_focus": "Enfoque del Mapa Mágico", + "item.twilightforest.maze_map_focus": "Enfoque del Mapa del Laberinto", + "item.twilightforest.liveroot": "Raíces Vivas", + "item.twilightforest.ironwood_raw": "Materiales de Madera de Hierro en Bruto", + "item.twilightforest.ironwood_ingot": "Lingote de Madera de Hierro", + "item.twilightforest.ironwood_helmet": "Casco de Madera de Hierro", + "item.twilightforest.ironwood_chestplate": "Pechera de Madera de Hierro", + "item.twilightforest.ironwood_leggings": "Pantalones de Madera de Hierro", + "item.twilightforest.ironwood_boots": "Botas de Madera de Hierro", + "item.twilightforest.ironwood_sword": "Espada de Madera de Hierro", + "item.twilightforest.ironwood_shovel": "Pala de Madera de Hierro", + "item.twilightforest.ironwood_pickaxe": "Pico de Madera de Hierro", + "item.twilightforest.ironwood_axe": "Hacha de Madera de Hierro", + "item.twilightforest.ironwood_hoe": "Azada de Madera de Hierro", + "item.twilightforest.torchberries": "Bayas de Antorcha", + "item.twilightforest.raw_venison": "Venado Crudo", + "item.twilightforest.cooked_venison": "Filete de Venado", + "item.twilightforest.hydra_chop": "Chuleta de Hidra", + "item.twilightforest.fiery_blood": "Sangre Ardiente", + "item.twilightforest.fiery_ingot": "Lingote Ardiente", + "item.twilightforest.fiery_helmet": "Casco Ardiente", + "item.twilightforest.fiery_chestplate": "Pechera Ardiente", + "item.twilightforest.fiery_leggings": "Pantalones Ardientes", + "item.twilightforest.fiery_boots": "Botas Ardientes", + "item.twilightforest.fiery_sword": "Espada Ardiente", + "item.twilightforest.fiery_pickaxe": "Pico Ardiente", + "item.twilightforest.steeleaf_ingot": "Hoja de Acero", + "item.twilightforest.steeleaf_helmet": "Casco de Hoja de Acero", + "item.twilightforest.steeleaf_chestplate": "Pechera de Hoja de Acero", + "item.twilightforest.steeleaf_leggings": "Pantalones de de Hoja de Acero", + "item.twilightforest.steeleaf_boots": "Botas de Hoja de Acero", + "item.twilightforest.steeleaf_sword": "Espeda de Hoja de Acero", + "item.twilightforest.steeleaf_shovel": "Pala de Hoja de Acero", + "item.twilightforest.steeleaf_pickaxe": "Pico de Hoja de Acero", + "item.twilightforest.steeleaf_axe": "Hacha de Hoja de Acero", + "item.twilightforest.steeleaf_hoe": "Azada de Hoja de Acero", + "item.twilightforest.minotaur_axe": "Hacha de Diamante del Minotauro", + "item.twilightforest.minotaur_axe_gold": "Hacha de Oro del Minotauro", + "item.twilightforest.mazebreaker_pickaxe": "Rompe Laberintos", + "item.twilightforest.transformation_powder": "Polvo de Transformación", + "item.twilightforest.raw_meef": "Carne Cruda", + "item.twilightforest.cooked_meef": "Bistec de Carne", + "item.twilightforest.meef_stroganoff": "Carne Stroganoff", + "item.twilightforest.maze_wafer": "Oblea de Laberinto", + "item.twilightforest.magic_map_empty": "Mapa Mágico en Blanco", + "item.twilightforest.maze_map_empty": "Mapa del Laberinto en Blanco", + "item.twilightforest.ore_map_empty": "Mapa de Laberinto/Minerales en Blanco", + "item.twilightforest.ore_magnet": "Imán de Minerales", + "item.twilightforest.crumble_horn": "Cuerno Desmenuzado", + "item.twilightforest.peacock_fan": "Abanico de Plumas de Pavo Real", + "item.twilightforest.moonworm_queen": "Reina Gusano Lunar", + "item.twilightforest.charm_of_life_1": "Talisman de Vida I", + "item.twilightforest.charm_of_life_2": "Talisman de Vida II", + "item.twilightforest.charm_of_keeping_1": "Talisman de conservación I", + "item.twilightforest.charm_of_keeping_2": "Talisman de conservación II", + "item.twilightforest.charm_of_keeping_3": "Talisman de conservación III", + "item.twilightforest.tower_key": "Llave de la Torre", + "item.twilightforest.borer_essence": "Esencia de Barrenador", + "item.twilightforest.carminite": "Carminita", + "item.twilightforest.tf_trophy": "%s Trofeo", + "item.twilightforest.armor_shard": "Fragmento de Armadura", + "item.twilightforest.knightmetal_ingot": "Lingote Hecho del Caballero de Metal", + "item.twilightforest.armor_shard_cluster": "Grupo de Fragmentos de Armadura", + "item.twilightforest.knightmetal_helmet": "Yelmo del Caballero de Metal", + "item.twilightforest.knightmetal_chestplate": "Pechera del Caballero de Metal", + "item.twilightforest.knightmetal_leggings": "Grebas del Caballero de Metal", + "item.twilightforest.knightmetal_boots": "Botas del Caballero de Metal", + "item.twilightforest.knightmetal_sword": "Espada del Caballero de Metal", + "item.twilightforest.knightmetal_pickaxe": "Pico del Caballero de Metal", + "item.twilightforest.knightmetal_axe": "Hacha del Caballero de Metal", + "item.twilightforest.knightmetal_shield": "Escudo del Caballero de Metal", + "item.twilightforest.phantom_helmet": "Casco de Fantasma", + "item.twilightforest.phantom_chestplate": "Pechera de Fantasma", + "item.twilightforest.lamp_of_cinders": "Lámpara de Cenizas", + "item.twilightforest.fiery_tears": "Lágrimas de Fuego", + "item.twilightforest.ice_bomb": "Bomba de Hielo", + "item.twilightforest.yeti_helmet": "Casco con Cuernos del Yeti", + "item.twilightforest.yeti_chestplate": "Chaqueta del Yeti", + "item.twilightforest.yeti_leggings": "Pantalones del Yeti", + "item.twilightforest.yeti_boots": "Botas del Yeti", + "item.twilightforest.alpha_fur": "Pelaje de Yeti Alfa", + "item.twilightforest.arctic_fur": "Pelaje del Ártico", + "item.twilightforest.arctic_helmet": "Capucha del Ártico", + "item.twilightforest.arctic_chestplate": "Chaqueta Ártica", + "item.twilightforest.arctic_leggings": "Pantalones del Ártico", + "item.twilightforest.arctic_boots": "Botas del Ártico", + "item.twilightforest.magic_beans": "Frijoles Mágicos", + "item.twilightforest.giant_pickaxe": "Pico del Gigante", + "item.twilightforest.giant_sword": "Espada del Gigante", + "item.twilightforest.triple_bow": "Arco triple", + "item.twilightforest.seeker_bow": "Arco Buscador", + "item.twilightforest.ice_bow": "Arco de hielo", + "item.twilightforest.ender_bow": "Arco de Ender", + "item.twilightforest.ice_sword": "Espada de Hielo", + "item.twilightforest.glass_sword": "Espada de Vidrio", + "item.twilightforest.knightmetal_ring": "Lazo de Caballero de Metal", + "item.twilightforest.block_and_chain": "Bloque y Cadena", + "item.twilightforest.cube_talisman": "Talismán del Cubo [NYI]", + "item.twilightforest.cube_of_annihilation": "Cubo de la Aniquilación [WIP]", + "item.twilightforest.moon_dial": "Dial lunar", + + "item.twilightforest.wild_boar_spawn_egg": "Generar Jabalí", + "item.twilightforest.bighorn_sheep_spawn_egg": "Generar de Oveja Cimarrón", + "item.twilightforest.deer_spawn_egg": "Generar Ciervo Salvaje", + "item.twilightforest.redcap_spawn_egg": "Generar Goblin del Gorro Rojo", + "item.twilightforest.swarm_spider_spawn_egg": "Generar Araña de Enjambre", + "item.twilightforest.naga_spawn_egg": "Generar Naga", + "item.twilightforest.skeleton_druid_spawn_egg": "Generar Druida Esqueleto", + "item.twilightforest.hostile_wolf_spawn_egg": "Generar Lobo Hostil", + "item.twilightforest.wraith_spawn_egg": "Generar Espectro Crepuscular", + "item.twilightforest.hedge_spider_spawn_egg": "Generar Araña del Seto", + "item.twilightforest.hydra_spawn_egg": "Generar Hidra", + "item.twilightforest.lich_spawn_egg": "Generar Twilight Lich ", + "item.twilightforest.penguin_spawn_egg": "Generar Pingüino", + "item.twilightforest.tiny_bird_spawn_egg": "Generar Pájaro Pequeño", + "item.twilightforest.squirrel_spawn_egg": "Generar Ardilla de Bosque", + "item.twilightforest.bunny_spawn_egg": "Generar Conejo del Bosque", + "item.twilightforest.raven_spawn_egg": "Generar Cuervo del Bosque", + "item.twilightforest.quest_ram_spawn_egg": "Generar Carnero de la Búsqueda", + "item.twilightforest.kobold_spawn_egg": "Generar Kobold", + "item.twilightforest.mosquito_swarm_spawn_egg": "Generar Enjambre de Mosquitos", + "item.twilightforest.death_tome_spawn_egg": "Generar Tomo de la Muerte", + "item.twilightforest.minotaur_spawn_egg": "Generar Minotauro", + "item.twilightforest.minoshroom_spawn_egg": "Generar Minosetauro", + "item.twilightforest.fire_beetle_spawn_egg": "Generar Escarabajo de Fuego", + "item.twilightforest.slime_beetle_spawn_egg": "Generar Escarabajo de Slime", + "item.twilightforest.pinch_beetle_spawn_egg": "Generar Escarabajo de Pinzas", + "item.twilightforest.maze_slime_spawn_egg": "Generar Slime de Laberinto", + "item.twilightforest.redcap_sapper_spawn_egg": "Generar Zapador de Gorro Rojo", + "item.twilightforest.mist_wolf_spawn_egg": "Generar Lobo de la Niebla", + "item.twilightforest.king_spider_spawn_egg": "Generar Rey Araña", + "item.twilightforest.mini_ghast_spawn_egg": "Generar Mini Ghast de Carminita", + "item.twilightforest.tower_ghast_spawn_egg": "Generar Guardia Ghast de Carminita", + "item.twilightforest.tower_golem_spawn_egg": "Generar Golem de Carminita", + "item.twilightforest.tower_termite_spawn_egg": "Generar Barrenador de la Torre de Madera", + "item.twilightforest.tower_broodling_spawn_egg": "Generar Araña Carminita", + "item.twilightforest.ur_ghast_spawn_egg": "Generar Ur-Ghast", + "item.twilightforest.blockchain_goblin_spawn_egg": "Generar Goblin de Bloques y Cadenas", + "item.twilightforest.goblin_knight_lower_spawn_egg": "Generar Caballero Goblin", + "item.twilightforest.helmet_crab_spawn_egg": "Generar Cangrejo con Casco", + "item.twilightforest.knight_phantom_spawn_egg": "Generar Caballero Fantasma", + "item.twilightforest.yeti_spawn_egg": "Generar Yeti", + "item.twilightforest.yeti_alpha_spawn_egg": "Generar Yeti Alfa", + "item.twilightforest.winter_wolf_spawn_egg": "Generar Lobo de Invierno", + "item.twilightforest.snow_guardian_spawn_egg": "Generar Guardián de Nieve", + "item.twilightforest.stable_ice_core_spawn_egg": "Generar Núcleo de Hielo Estable", + "item.twilightforest.unstable_ice_core_spawn_egg": "Generar Núcleo de Hielo Inestable", + "item.twilightforest.snow_queen_spawn_egg": "Generar Reina de las Nieves", + "item.twilightforest.troll_spawn_egg": "Generar Troll de las Cavernas", + "item.twilightforest.giant_miner_spawn_egg": "Generar Minero Gigante", + "item.twilightforest.armored_giant_spawn_egg": "Generar Gigante Armado", + "item.twilightforest.ice_crystal_spawn_egg": "Generar Cristal de Hielo", + "item.twilightforest.harbinger_cube_spawn_egg": "Generar Cubo de los Presagios [NYI]", + "item.twilightforest.adherent_spawn_egg": "Generar Adepto [NYI]", + "item.twilightforest.roving_cube_spawn_egg": "Generar Cubo Giratorio [NYI]", + + "item.twilightforest.guide": "Cuaderno de Bitácora del Viajero [WIP]", + + "item.twilightforest.minotaur_axe.tooltip": "Daño Extra Durante la Carga", + "item.twilightforest.minotaur_axe_gold.tooltip": "Daño Extra Durante la Carga", + "item.twilightforest.knightmetal_sword.tooltip": "Daño Extra a Objetivos Blindados", + "item.twilightforest.knightmetal_pickaxe.tooltip": "Daño Extra a Objetivos Blindados", + "item.twilightforest.knightmetal_axe.tooltip": "Daño Extra a Objetivos No Blindados", + "item.twilightforest.giant_pickaxe.tooltip": "Rompe bloques gigantes", + "item.twilightforest.fiery_pickaxe.tooltip": "Autofundición", + "item.twilightforest.fiery_sword.tooltip": "Quema al objetivo ", + "item.twilightforest.fiery_helmet.tooltip": "Quema a los atacante", + "item.twilightforest.fiery_chestplate.tooltip": "Quema a los atacante", + "item.twilightforest.fiery_leggings.tooltip": "Quema a los atacante", + "item.twilightforest.fiery_boots.tooltip": "Quema a los atacante", + "item.twilightforest.phantom_helmet.tooltip": "Nunca lo pierdes aunque mueras ", + "item.twilightforest.phantom_chestplate.tooltip": "Nunca lo pierdes aunque mueras ", + "item.twilightforest.yeti_helmet.tooltip": "Enfría a los atacantes", + "item.twilightforest.yeti_chestplate.tooltip": "Enfría a los atacantes", + "item.twilightforest.yeti_leggings.tooltip": "Enfría a los atacantes", + "item.twilightforest.yeti_boots.tooltip": "Enfría a los atacantes", + + "item.twilightforest.arctic_armor.tooltip": "Teñible como la armadura de cuero", + + // Entities + "entity.twilightforest.wild_boar": "Jabalí", + "entity.twilightforest.bighorn_sheep": "Oveja Cimarrón", + "entity.twilightforest.deer": "Ciervo salvaje", + "entity.twilightforest.redcap": "Goblin del Gorro Rojo", + "entity.twilightforest.swarm_spider": "Araña de Enjambre", + "entity.twilightforest.naga": "Naga", + "entity.twilightforest.naga_segment": "Segmento Naga", + "entity.twilightforest.skeleton_druid": "Druida Esqueleto", + "entity.twilightforest.hostile_wolf": "Lobo hostil", + "entity.twilightforest.wraith": "Espectro Crepuscular", + "entity.twilightforest.hedge_spider": "Araña del Seto", + "entity.twilightforest.hydra": "Hidra", + "entity.twilightforest.hydra_head": "Cabeza de Hidra", + "entity.twilightforest.lich": "Twilight Lich", + "entity.twilightforest.penguin": "Pingüino", + "entity.twilightforest.tiny_bird": "Pájaro Pequeño", + "entity.twilightforest.squirrel": "Ardilla del Bosque", + "entity.twilightforest.bunny": "Conejo Enano", + "entity.twilightforest.raven": "Cuervo del Bosque", + "entity.twilightforest.quest_ram": "Carnero de la Búsqueda", + "entity.twilightforest.kobold": "Kobold", + "entity.twilightforest.boggard": "Boggard [NYI]", + "entity.twilightforest.lich_minion": "Lich Minion", + "entity.twilightforest.loyal_zombie": "Zombi Leal", + "entity.twilightforest.mosquito_swarm": "Enjambre de Mosquitos", + "entity.twilightforest.death_tome": "Tomo de la Muerte", + "entity.twilightforest.minotaur": "Minotauro", + "entity.twilightforest.minoshroom": "Minosetauro", + "entity.twilightforest.fire_beetle": "Escarabajo de Fuego", + "entity.twilightforest.slime_beetle": "Escarabajo de Slime", + "entity.twilightforest.pinch_beetle": "Escarabajo de Pinzas", + "entity.twilightforest.maze_slime": "Slime de Laberinto", + "entity.twilightforest.redcap_sapper": "Zapador de Gorro Rojo", + "entity.twilightforest.mist_wolf": "Lobo de la Niebla", + "entity.twilightforest.king_spider": "Rey Araña", + "entity.twilightforest.firefly": "Luciérnaga", + "entity.twilightforest.mini_ghast": "Mini Ghast de Carminita", + "entity.twilightforest.tower_ghast": "Guardia Ghast de Carminita", + "entity.twilightforest.tower_golem": "Golem de Carminita", + "entity.twilightforest.tower_termite": "Barrenador de la Madera de la Torre", + "entity.twilightforest.tower_broodling": "Araña Carminita", + "entity.twilightforest.ur_ghast": "Ur-Ghast", + "entity.twilightforest.blockchain_goblin": "Generar Goblin de Bloques y Cadenas", + "entity.twilightforest.goblin_knight_upper": "Caballero Goblin Superior", + "entity.twilightforest.goblin_knight_lower": "Caballero Goblin Inferior", + "entity.twilightforest.helmet_crab": "Cangrejo con Casco", + "entity.twilightforest.knight_phantom": "Caballero Fantasma", + "entity.twilightforest.yeti": "Yeti", + "entity.twilightforest.yeti_alpha": "Yeti Alfa", + "entity.twilightforest.winter_wolf": "Lobo de Invierno", + "entity.twilightforest.snow_guardian": "Guardián de Nieve", + "entity.twilightforest.stable_ice_core": "Núcleo de Hielo Estable", + "entity.twilightforest.unstable_ice_core": "Núcleo de Hielo Inestable", + "entity.twilightforest.snow_queen": "Reina de las Nieves", + "entity.twilightforest.troll": "Troll de las Cavernas", + "entity.twilightforest.giant_miner": "Minero Gigante", + "entity.twilightforest.armored_giant": "Gigante Armado", + "entity.twilightforest.ice_crystal": "Cristal de Hielo", + "entity.twilightforest.rising_zombie": "Zombie", + "entity.twilightforest.harbinger_cube": "Cubo de los Presagios [NYI]", + "entity.twilightforest.adherent": "Adepto [NYI]", + "entity.twilightforest.castle_guardian": "Guardián del Castillo [NYI]", + "entity.twilightforest.roving_cube": "Cubo Giratorio [NYI]", + + "entity.twilightforest.ice_snowball": "Bola de Nieve de Hielo", + "entity.twilightforest.ice_arrow": "Flecha de Hielo", + "entity.twilightforest.seeker_arrow": "Flecha Buscadora", + "entity.twilightforest.cicada_shot": "Cigarra", + "entity.twilightforest.moonworm_shot": "Gusano Lunar", + "entity.twilightforest.nature_bolt": "Perno de la Naturaleza", + "entity.twilightforest.slime_blob": "Gota de Slime", + "entity.twilightforest.tome_bolt": " Perno del Tomo de la Muerte", + "entity.twilightforest.wand_bolt": "Perno de Cetro Crepuscular", + "entity.twilightforest.lich_bolt": "Perno del Lich", + "entity.twilightforest.lich_bomb": "Perno Explosivo del Lich", + "entity.twilightforest.hydra_mortar": "Mortero Hidra", + "entity.twilightforest.falling_ice": "Caída de hielo", + "entity.twilightforest.chain_block": "Bloque y Cadena", + "entity.twilightforest.thrown_wep": "Arma Arrojadiza", + "entity.twilightforest.charm_effect": "Efecto de Talisman", + "entity.twilightforest.cube_of_annihilation": "Cubo de la Aniquilación", + "entity.twilightforest.slider": "Trampa Deslizante en Movimiento", + "entity.twilightforest.protection_box": "Caja de Protección de la Progresión", + + // Subtitles + "subtitles.twilightforest.entity.alphayeti.alert": "Yeti Alfa se dirige al jugador", + "subtitles.twilightforest.entity.alphayeti.death": "Yeti Alfa muerto", + "subtitles.twilightforest.entity.alphayeti.grab": "Yeti Alfa agarra al jugador", + "subtitles.twilightforest.entity.alphayeti.growl": "Yeti Alfa gruñe", + "subtitles.twilightforest.entity.alphayeti.hurt": "Yeti Alfa herido", + "subtitles.twilightforest.entity.alphayeti.ice": "Yeti Alfa lanza hielo", + "subtitles.twilightforest.entity.alphayeti.pant": "Pantalones del Yeti Alfa ", + "subtitles.twilightforest.entity.alphayeti.roar": "Yeti Alfa ruge", + "subtitles.twilightforest.entity.alphayeti.throw": "Yeti Alfa tira con fuerza", + "subtitles.twilightforest.entity.bighorn.ambient": "Balido de Oveja Cimarrón", + "subtitles.twilightforest.entity.bighorn.death": "Oveja Cimarrón muerta", + "subtitles.twilightforest.entity.bighorn.hurt": "Oveja Cimarrón herida", + "subtitles.twilightforest.entity.blockchain.ambient": "Goblin de Bloques y Cadenas se ríe", + "subtitles.twilightforest.entity.blockchain.death": "Goblin de Bloques y Cadenas muerto", + "subtitles.twilightforest.entity.blockchain.hurt": "Goblin de Bloques y Cadenas grita", + "subtitles.twilightforest.entity.boar.ambient": "Gruñido de Jabalí", + "subtitles.twilightforest.entity.boar.death": "Jabalí muerto", + "subtitles.twilightforest.entity.boar.hurt": "Jabalí herido", + "subtitles.twilightforest.entity.broodling.ambient": "Siseo de Araña Carminita", + "subtitles.twilightforest.entity.broodling.death": "Araña Carminita muerta", + "subtitles.twilightforest.entity.broodling.hurt": "Araña Carminita herida", + "subtitles.twilightforest.entity.carminitegolem.attack": "Golem de Carminita ataca", + "subtitles.twilightforest.entity.carminitegolem.death": "Golem de Carminita muerto", + "subtitles.twilightforest.entity.carminitegolem.hurt": "Golem de Carminita herido", + "subtitles.twilightforest.entity.cicada": "Canto de Cigarra", + "subtitles.twilightforest.entity.deer.death": "Ciervo salvaje muerto", + "subtitles.twilightforest.entity.deer.hurt": "Ciervo salvaje herido", + "subtitles.twilightforest.entity.deer.idle": "Ciervo salvaje mugido", + "subtitles.twilightforest.entity.druid.ambient": "Cascabeles del Druida Esqueleto", + "subtitles.twilightforest.entity.druid.death": "Druida Esqueleto muerto", + "subtitles.twilightforest.entity.druid.hurt": "Druida Esqueleto herido", + "subtitles.twilightforest.entity.druid.shoot": "Druida Esqueleto dispara", + "subtitles.twilightforest.entity.firebeetle.ambient": "Siseo de Escarabajo de Fuego", + "subtitles.twilightforest.entity.firebeetle.death": "Escarabajo de Fuego muerto", + "subtitles.twilightforest.entity.firebeetle.hurt": "Escarabajo de Fuego herido", + "subtitles.twilightforest.entity.firebeetle.shoot": "Escarabajo de Fuego dispara", + "subtitles.twilightforest.entity.ghastguard.ambient": "Llanto de Guardia Ghast", + "subtitles.twilightforest.entity.ghastguard.death": "Guardia Ghast muerto", + "subtitles.twilightforest.entity.ghastguard.hurt": "Guardia Ghast herido", + "subtitles.twilightforest.entity.ghastling.ambient": "Llanto de Mini Ghast", + "subtitles.twilightforest.entity.ghastling.death": "Mini Ghast muerto", + "subtitles.twilightforest.entity.ghastling.hurt": "Mini Ghast herido", + "subtitles.twilightforest.entity.goblinknight.ambient": "Risas de Caballero Goblin", + "subtitles.twilightforest.entity.goblinknight.death": "Caballero Goblin gime de agonía", + "subtitles.twilightforest.entity.goblinknight.hurt": "Caballero Goblin chilla de dolor", + "subtitles.twilightforest.entity.goblinknight.muffled.ambient": "Caballero Goblin sofocada rie", + "subtitles.twilightforest.entity.goblinknight.muffled.death": "Caballero Goblin sofocado gime de agonía", + "subtitles.twilightforest.entity.goblinknight.muffled.hurt": "Caballero Goblin sofocado chilla de dolor", + "subtitles.twilightforest.entity.hedgespider.ambient": "Siseo de Araña del Seto", + "subtitles.twilightforest.entity.hedgespider.death": "Araña del Seto muerta", + "subtitles.twilightforest.entity.hedgespider.hurt": "Araña del Seto herida", + "subtitles.twilightforest.entity.helmetcrab.death": "Cangrejo con Casco muerto", + "subtitles.twilightforest.entity.helmetcrab.hurt": "Cangrejo con Casco herido", + "subtitles.twilightforest.entity.hostilewolf.death": "Lobo hostil muerto", + "subtitles.twilightforest.entity.hostilewolf.hurt": "Lobo hostil herido", + "subtitles.twilightforest.entity.hostilewolf.idle": "Lobo hostil gruñe", + "subtitles.twilightforest.entity.hostilewolf.target": "Lobo hostil apunta a la víctima", + "subtitles.twilightforest.entity.hydra.death": "Hidra muerto", + "subtitles.twilightforest.entity.hydra.growl": "Hidra gruñe", + "subtitles.twilightforest.entity.hydra.hurt": "Hidra herido", + "subtitles.twilightforest.entity.hydra.roar": "Hidra ruge", + "subtitles.twilightforest.entity.hydra.shoot": "Hidra lanza fuego", + "subtitles.twilightforest.entity.hydra.warn": "Hidra se prepara para morder", + "subtitles.twilightforest.entity.ice.death": "Núcleo de hielo muerto", + "subtitles.twilightforest.entity.ice.hurt": "Núcleo de hielo herido", + "subtitles.twilightforest.entity.ice.noise": "Crujidos del Núcleo de hielo", + "subtitles.twilightforest.entity.ice.shoot": "Núcleo de hielo dispara una bola de nieve", + "subtitles.twilightforest.entity.iceguardian.ambient": "Crujidos del Guardián de la nieve", + "subtitles.twilightforest.entity.iceguardian.death": "Guardián de la nieve muerto", + "subtitles.twilightforest.entity.iceguardian.hurt": "Guardián de la nieve herido", + "subtitles.twilightforest.entity.kingspider.ambient": "Siseo de Rey Araña", + "subtitles.twilightforest.entity.kingspider.death": "Rey Araña muerto", + "subtitles.twilightforest.entity.kingspider.hurt": "Rey Araña herido", + "subtitles.twilightforest.entity.kobold.ambient": "Gruñidos de Kobold", + "subtitles.twilightforest.entity.kobold.death": "Kobold muerto", + "subtitles.twilightforest.entity.kobold.hurt": "Kobold herido", + "subtitles.twilightforest.entity.lich.ambient": "Lich respira", + "subtitles.twilightforest.entity.lich.death": "Lich muerto", + "subtitles.twilightforest.entity.lich.hurt": "Lich herido", + "subtitles.twilightforest.entity.lich.shoot": "Lich dispara", + "subtitles.twilightforest.entity.lich.teleport": "Lich se teletransporta", + "subtitles.twilightforest.entity.lichclone.hurt": "Clon Lich se evapora", + "subtitles.twilightforest.entity.loyalzombie.ambient": "Zombi leal gruñidos", + "subtitles.twilightforest.entity.loyalzombie.death": "Zombi leal muerto", + "subtitles.twilightforest.entity.loyalzombie.hurt": "Zombi leal herido", + "subtitles.twilightforest.entity.mazeslime.death": "Slime de Laberinto muerto", + "subtitles.twilightforest.entity.mazeslime.hurt": "Slime de Laberinto herido", + "subtitles.twilightforest.entity.mazeslime.squish": "Slime de Laberinto saltando", + "subtitles.twilightforest.entity.minion.ambient": "Lich Minion gruñidos", + "subtitles.twilightforest.entity.minion.death": "Lich Minion muerto", + "subtitles.twilightforest.entity.minion.hurt": "Lich Minion herido", + "subtitles.twilightforest.entity.minion.summon": "Lich invoca a un nuevo Minion", + "subtitles.twilightforest.entity.minoshroom.ambient": "Mugido de Minosetauro", + "subtitles.twilightforest.entity.minoshroom.attack": "Carga de Minosetauro", + "subtitles.twilightforest.entity.minoshroom.death": "Minosetauro muerto", + "subtitles.twilightforest.entity.minoshroom.hurt": "Minosetauro herido", + "subtitles.twilightforest.entity.minotaur.ambient": "Mugido de Minotauro", + "subtitles.twilightforest.entity.minotaur.attack": "Carga de Minotauro", + "subtitles.twilightforest.entity.minotaur.death": "Minotauro muerto", + "subtitles.twilightforest.entity.minotaur.hurt": "Minotauro herido", + "subtitles.twilightforest.entity.mistwolf.death": "Lobo de la Niebla muerto", + "subtitles.twilightforest.entity.mistwolf.hurt": "Lobo de la Niebla herido", + "subtitles.twilightforest.entity.mistwolf.idle": "Lobo de la Niebla gruñe", + "subtitles.twilightforest.entity.mistwolf.target": "Lobo de la Niebla apunta a la víctima", + "subtitles.twilightforest.entity.mosquito.ambient": "Zumbido de Mosquitos", + "subtitles.twilightforest.entity.naga.hiss": "Siseo de Naga", + "subtitles.twilightforest.entity.naga.hurt": "Naga herido", + "subtitles.twilightforest.entity.naga.rattle": "Naga cascabeles", + "subtitles.twilightforest.entity.kphantom.axe": "Caballero Fantasma lanza el hacha", + "subtitles.twilightforest.entity.kphantom.ambient": "Caballero Fantasma jadeos", + "subtitles.twilightforest.entity.kphantom.death": "Caballero Fantasma muerto", + "subtitles.twilightforest.entity.kphantom.hurt": "Caballero Fantasma herido", + "subtitles.twilightforest.entity.kphantom.pick": "Caballero Fantasma lanza el pico", + "subtitles.twilightforest.entity.pinchbeetle.death": "Escarabajo de pinzas muerto", + "subtitles.twilightforest.entity.pinchbeetle.hurt": "Escarabajo de pinzas herido", + "subtitles.twilightforest.entity.quest.ambient": "Balido del Carnero de la Búsqueda", + "subtitles.twilightforest.entity.quest.death": "Carnero de la Búsqueda muerto", + "subtitles.twilightforest.entity.quest.hurt": "Carnero de la Búsqueda herido", + "subtitles.twilightforest.entity.raven.caw": "Canto de Cuervo", + "subtitles.twilightforest.entity.raven.squawk": "Graznido de Cuervo", + "subtitles.twilightforest.entity.redcap.ambient": "Risas de Gorro rojo", + "subtitles.twilightforest.entity.redcap.death": "Gorro rojo gime en agonía", + "subtitles.twilightforest.entity.redcap.hurt": "Gorro rojo chilla de dolor", + "subtitles.twilightforest.entity.shield.add": "Aparece un nuevo escudo", + "subtitles.twilightforest.entity.shield.break": "Rotura del escudo", + "subtitles.twilightforest.entity.slimebeetle.death": "Escarabajo de Slime muerto", + "subtitles.twilightforest.entity.slimebeetle.hurt": "Escarabajo de Slime herido", + "subtitles.twilightforest.entity.slimebeetle.squish": "Escarabajo de Slime saltando", + "subtitles.twilightforest.entity.snowqueen.ambient": "Reina de las Nieves cruje", + "subtitles.twilightforest.entity.snowqueen.attack": "Reina de las Nieves ataca", + "subtitles.twilightforest.entity.snowqueen.break": "Reina de las Nieves el escudo desvía", + "subtitles.twilightforest.entity.snowqueen.death": "Reina de las Nieves muerto", + "subtitles.twilightforest.entity.snowqueen.hurt": "Reina de las Nieves herido", + "subtitles.twilightforest.entity.swarmspider.ambient": "Siseo de Araña de enjambre", + "subtitles.twilightforest.entity.swarmspider.death": "Araña de enjambre muerto", + "subtitles.twilightforest.entity.swarmspider.hurt": "Araña de enjambre herido", + "subtitles.twilightforest.entity.tear.break": "Lágrimas de Ur-Ghast rompiéndose", + "subtitles.twilightforest.entity.termite.ambient": "Siseo de Barrenador de la Torre de Madera", + "subtitles.twilightforest.entity.termite.death": "Barrenador de la Torre de Madera muerto", + "subtitles.twilightforest.entity.termite.hurt": "Barrenador de la Torre de Madera herido", + "subtitles.twilightforest.entity.tinybird.chirp": "Pájaro gorjea", + "subtitles.twilightforest.entity.tinybird.hurt": "Pájaro herido", + "subtitles.twilightforest.entity.tinybird.song": "Pájaro cantando", + "subtitles.twilightforest.entity.tome.death": "Tomo de la Muerte se desmorona", + "subtitles.twilightforest.entity.tome.hurt": "Pliegues del Tomo de la Muerte", + "subtitles.twilightforest.entity.tome.idle": "Tomo de la Muerte pasa las páginas", + "subtitles.twilightforest.entity.urghast.ambient": "Ur-Ghast llora", + "subtitles.twilightforest.entity.urghast.death": "Ur-Ghast muerto", + "subtitles.twilightforest.entity.urghast.hurt": "Ur-Ghast grita", + "subtitles.twilightforest.entity.urghast.trapactive": "Zumbidos de la trampa Trampa Ghast", + "subtitles.twilightforest.entity.urghast.trapon": "Trampa Ghast activa", + "subtitles.twilightforest.entity.urghast.trapspindown": "Trampa Ghast se apaga", + "subtitles.twilightforest.entity.urghast.trapwarmup": "Trampa de Ghast se calienta", + "subtitles.twilightforest.entity.winterwolf.death": "Lobo de invierno muerto", + "subtitles.twilightforest.entity.winterwolf.hurt": "Lobo de invierno herido", + "subtitles.twilightforest.entity.winterwolf.idle": "Lobo de invierno gruñe", + "subtitles.twilightforest.entity.winterwolf.shoot": "Lobo de invierno dispara", + "subtitles.twilightforest.entity.winterwolf.target": "Lobo de invierno apunta a la víctima", + "subtitles.twilightforest.entity.wraith.ambient": "Jadeos de Espectro", + "subtitles.twilightforest.entity.wraith.death": "Espectro muerto", + "subtitles.twilightforest.entity.wraith.hurt": "Espectro herido", + "subtitles.twilightforest.entity.yeti.death": "Yeti muerto", + "subtitles.twilightforest.entity.yeti.grab": "Yeti agarra al jugador", + "subtitles.twilightforest.entity.yeti.growl": "Yeti gruñe", + "subtitles.twilightforest.entity.yeti.hurt": "Yeti herido", + "subtitles.twilightforest.entity.yeti.throw": "Yeti tira con fuerza", + + "subtitles.twilightforest.entity.alphayeti.parrot": "Loro gruñe fríamente", + "subtitles.twilightforest.entity.carminitegolem.parrot": "Loro golpea", + "subtitles.twilightforest.entity.hostilewolf.parrot": "Gruñidos de Loro", + "subtitles.twilightforest.entity.hydra.parrot": "Rugidos de Loro", + "subtitles.twilightforest.entity.icecore.parrot": "Crujidos de Loro", + "subtitles.twilightforest.entity.kobold.parrot": "Loro refunfuña", + "subtitles.twilightforest.entity.minotaur.parrot": "Loro muge furiosamente", + "subtitles.twilightforest.entity.mosquito.parrot": "Zumbidos de Loro", + "subtitles.twilightforest.entity.naga.parrot": "Sonajeros de Loro", + "subtitles.twilightforest.entity.redcap.parrot": "Loro se ríe", + "subtitles.twilightforest.entity.tome.parrot": "Loro hace ruidos de libros", + "subtitles.twilightforest.entity.wraith.parrot": "Jadeos de Loro", + + "subtitles.twilightforest.block.bug.squish": "Se aplasta un bicho :(", + "subtitles.twilightforest.block.builder.on": "El constructor se activa", + "subtitles.twilightforest.block.builder.off": "El constructor se desactiva", + "subtitles.twilightforest.block.builder.replace": "El constructor sustituye el bloque", + "subtitles.twilightforest.block.door.activate": "La puerta del castillo no se desvanece", + "subtitles.twilightforest.block.door.reappear": "La puerta del castillo reaparece", + "subtitles.twilightforest.block.door.vanish": "La puerta del castillo se desvanece", + "subtitles.twilightforest.block.vanish.locked": "La puerta de la Torre de Madera no se desvanece", + "subtitles.twilightforest.block.vanish.unlock": "La puerta de la Torre de Madera se desbloquea", + "subtitles.twilightforest.block.reappear.reappear": "Reaparece el Bloque Reaparecedor", + "subtitles.twilightforest.block.reappear.vanish": "Desaparece el Bloque Reaparecedor", + "subtitles.twilightforest.block.vanish.vanish": "Bloque de desaparición se desvanece", + "subtitles.twilightforest.block.core.time": "El árbol del tiempo hace tictac", + "subtitles.twilightforest.block.core.transformation": "Árbol de la transformación emite un sonido ", + "subtitles.twilightforest.block.portal.woosh": "Portal del Bosque Twilight llama ", + "subtitles.twilightforest.block.pedestal.activate": "El pedestal de trofeos acepta el trofeo", + "subtitles.twilightforest.block.casket.open": "Se abre el ataúd del recuerdo", + "subtitles.twilightforest.block.casket.close": "Se se cierra el ataúd del recuerdo", + "subtitles.twilightforest.block.casket.repair": "El jugador repara el ataúd", + "subtitles.twilightforest.block.casket.locked": "Clics en el ataúd de recuerdo", + + "subtitles.twilightforest.item.blockchain.collide": "Bloque y Cadena golpea un bloque", + "subtitles.twilightforest.item.blockchain.hit": "Bloque y Cadena golpea a la entidad", + "subtitles.twilightforest.item.blockchain.fire": "Bloque y Cadena lanzado", + "subtitles.twilightforest.item.glasssword.break": "Espada de vidrio se rompe", + "subtitles.twilightforest.item.icebomb.fired": "Bomba de hielo lanzada", + "subtitles.twilightforest.item.lamp.burn": "Lámpara de Cenizas quema la zona", + "subtitles.twilightforest.item.moonworm.squish": "Gusano lunar disparos", + "subtitles.twilightforest.item.magnet.grab": "El imán extrae el mineral", + "subtitles.twilightforest.item.fan.woosh": "Abanico de pavo real utilizado", + "subtitles.twilightforest.item.scepter.drain": "Cetro Robó la vida del objetivo ", + "subtitles.twilightforest.item.scepter.use": "Cetro usado", + "subtitles.twilightforest.item.scepter.pearl": "Cetro Crepuscular lanza la perla", + "subtitles.twilightforest.item.powder.use": "Polvo de transformación utilizado", + "subtitles.twilightforest.item.charm.keep": "Talisman de conservación devuelve los objetos", + "subtitles.twilightforest.item.charm.life": "Talisman de Vida regenera al jugador", + + "subtitles.twilightforest.te.jet.start": "Comienza el chorro de fuego", + "subtitles.twilightforest.te.jet.active": "Llamaradas de Chorro de fuego", + "subtitles.twilightforest.te.jet.pop": "Chorro de fuego empieza a brotar", + "subtitles.twilightforest.te.smoker.start": "El ahumador comienza", + "subtitles.twilightforest.te.reactor.idle": "Reactor de Carminita hace ruido", + + "subtitles.random.slider": "Trampa Deslizante en Movimiento", + + // Death Messages + "death.attack.twilightforest.ghastTear": "%1$s fue escaldado por lágrimas de fuego", + "death.attack.twilightforest.ghastTear.player": "%1$s fue escaldado por lágrimas de fuego mientras escapaba de %2$s", + "death.attack.twilightforest.hydraFire": "%1$s fue asado vivo por la Hidra", + "death.attack.twilightforest.hydraFire.player": "%1$s fue asado vivo por la Hidra mientras escapaba de %2$s", + "death.attack.twilightforest.hydraBite": "La piel de %1$s fue arrancada por la Hidra", + "death.attack.twilightforest.hydraBite.player": "La piel de %1$s fue arrancada por la Hidra mientras escapaba de %2$s", + "death.attack.twilightforest.lichBolt": "La puntería del Lich era mejor que %1$s", + "death.attack.twilightforest.lichBolt.player": "El Lich y %2$s tenían mejor puntería que %1$s", + "death.attack.twilightforest.lichBomb": "%1$s sucumbió a la magia explosiva del Lich", + "death.attack.twilightforest.lichBomb.player": "%1$s sucumbió a la magia explosiva del Lich mientras escapaba %2$s", + "death.attack.twilightforest.chillingBreath": "%1$s fue congelado hasta la muerte por la Reina de las Nieves", + "death.attack.twilightforest.chillingBreath.player": "%1$s murió congelado por la Reina de las Nieves mientras escapaba de %2$s", + "death.attack.twilightforest.squish": "%1$s fue aplastado por la Reina de las Nieves", + "death.attack.twilightforest.squish.player": "%1$s fue triturado por la Reina de las Nieves mientras escapaba de %2$s", + "death.attack.twilightforest.thrownAxe": "%1$s fue decapitado por un hacha lanzada", + "death.attack.twilightforest.thrownAxe.player": "%1$s fue decapitado por un hacha lanzada mientras escapaba de %2$s", + "death.attack.twilightforest.thrownPickaxe": "%1$s fue decapitado por un pico lanzado", + "death.attack.twilightforest.thrownPickaxe.player": "%1$s fue decapitado por un pico lanzado mientras escapaba de %2$s", + "death.attack.twilightforest.fireJet": "%1$s caminó accidentalmente hacia un chorro de fuego", + "death.attack.twilightforest.fireJet.player": "%1$s entró accidentalmente en un chorro de fuego mientras escapaba de %2$s", + "death.attack.twilightforest.reactor": "%1$s estuvo demasiado cerca de un reactor de carminita", + "death.attack.twilightforest.reactor.player": "%1$s estuvo demasiado cerca de un reactor de carminita mientras escapaba %2$s", + "death.attack.twilightforest.slider": "%1$s fue cortado por una trampa deslizante", + "death.attack.twilightforest.slider.player": "%1$s fue cortado por una trampa deslizante mientras escapaba de %2$s", + "death.attack.twilightforest.thorns": "%1$s caminó hacia unas espinas", + "death.attack.twilightforest.thorns.player": "%1$s caminó hacia unas espinas mientras escapaba de %2$s", + "death.attack.twilightforest.knightmetal": "%1$s fue pinchado por un bloque hecho del Caballero de Metal", + "death.attack.twilightforest.knightmetal.player": "%1$s fue pinchado por un bloque hecho del Caballero de Metal mientras escapaba de %2$s", + "death.attack.twilightforest.fiery": "%1$s caminó hacia un bloque ardiente", + "death.attack.twilightforest.fiery.player": "%1$s caminó sobre un bloque ardiente mientras escapaba de %2$s", + + "death.attack.twilightforest.axing": "%1$s ha sido cortado por %2$s", + "death.attack.twilightforest.axing.item": "%1$s ha sido cortado por %2$s con %3$s", + "death.attack.twilightforest.cicada": "%1$s fue disparado por la Cigarra", + "death.attack.twilightforest.moonworm": "%1$s fue disparado por el Gusano lunar", + "death.attack.twilightforest.ant": "%1$s vivió la vida de una hormiga gracias a %2$s", + "death.attack.twilightforest.ant.item": "%1$s vivió la vida de una hormiga gracias a %2$s usando %3$s", + "death.attack.twilightforest.haunt": "%1$s entro a la guarida de %2$s", + "death.attack.twilightforest.haunt.item": "%1$s entro a la guarida de %2$s después de ser asesinado con %3$s", + "death.attack.twilightforest.clamped": "%1$s fue sujetado hasta la muerte por %2$s", + "death.attack.twilightforest.clamped.item": "%1$s fue sujetado hasta la muerte por %2$s usando %3$s", + "death.attack.twilightforest.scorched": "%1$s fue quemado por %2$s", + "death.attack.twilightforest.scorched.item": "%1$s fue quemado por %2$s usando %3$s", + "death.attack.twilightforest.frozen": "%1$s fue congelado por %2$s usando una bomba de hielo", + "death.attack.twilightforest.frozen.item": "%1$s fue congelado por %2$s usando %3$s", + "death.attack.twilightforest.spiked": "%1$s ha sido pinchado por %2$s", + "death.attack.twilightforest.spiked.item": "%1$s ha sido pinchado por %2$s utilizando %3$s", + "death.attack.twilightforest.leafBrain": "El cerebro de %1$s fue convertido en hojas por %2$s", + "death.attack.twilightforest.leafBrain.item": "El cerebro de %1$s fue convertido en hojas por %2$s usando %3$s", + "death.attack.twilightforest.lostWords": "%1$s se quedó sin palabras tras ser asesinado por %2$s", + "death.attack.twilightforest.lostWords.item": "%1$s se quedó sin palabras tras ser asesinado por %2$s con %3$s", + "death.attack.twilightforest.snowballFight": "%1$s perdió una pelea de bolas de nieve contra %2$s", + "death.attack.twilightforest.snowballFight.item": "%1$s perdió una pelea de bolas de nieve contra %2$s usando %3$s", + "death.attack.twilightforest.yeeted": "%1$s fue golpeado por última vez por %2$s", + "death.attack.twilightforest.yeeted.item": "%1$s ha sido golpeado por última vez por %2$s mientras sostenía %3$s", + + // Misc + "twilightforest.misc.wip0": "Este bloque es un trabajo en proceso y puede tener errores o efectos no deseados que pueden dañar tu mundo.", + "twilightforest.misc.wip1": "Utilizar con precaución.", + "twilightforest.misc.nyi": "Este bloque tiene efectos que aún no se han implementado.", + + "twilightforest.loading.title.enter": "Llevándote al Twilight Forest...", + "twilightforest.loading.title.leave": "Sacándote de Twilight Forest...", + + // Config + "twilightforest.config.dimension": "Ajustes de Dimensión", + "twilightforest.config.dimension.tooltip": "No podrás cambiar estas configuraciones sin que se produzca un reinicio.", + "twilightforest.config.dimension_id": "Dimension ID", + "twilightforest.config.dimension_id.tooltip": "Qué número de identificación asignar a la dimensión de Twilight Forest. Cambia si tienes conflictos con otro mod.", + "twilightforest.config.dimension_seed": "Semilla de Dimensión", + "twilightforest.config.dimension_seed.tooltip": "Si se establece, esto anulará la semilla normal del mundo cuando se generen partes de Twilight Forest Dimension.", + "twilightforest.config.spawn_in_tf": "Los nuevos jugadores aparecen en el Twilight Forest", + "twilightforest.config.spawn_in_tf.tooltip": "Si es cierto, los jugadores que aparezcan por primera vez lo harán en el Twilight Forest.", + "twilightforest.config.skylight_forest": "Bosque de Tragaluces [WIP]", + "twilightforest.config.skylight_forest.tooltip": "If true, Twilight Forest will generate as a void except for Major Structures.", + "twilightforest.config.skylight_oaks": "Tragaluz de Roble [WIP]", + "twilightforest.config.skylight_oaks.tooltip": "Si es cierto, los gigantescos Robles Crepusculares también aparecerán en los mundos vacíos.", + + "twilightforest.config.world_gen_weights": "Pesos de la generación mundial", + "twilightforest.config.world_gen_weights.tooltip": "Pesos para varias características pequeñas", + "twilightforest.config.stone_circle_weight": "Peso del círculo de piedra", + "twilightforest.config.well_weight": "Peso del pozo", + "twilightforest.config.stalagmite_weight": "Peso de la estalagmita", + "twilightforest.config.foundation_weight": "Peso de la base", + "twilightforest.config.monolith_weight": "Peso del monolito", + "twilightforest.config.grove_ruins_weight": "Peso de las ruinas de la arboleda", + "twilightforest.config.hollow_stump_weight": "Peso del muñón hueco", + "twilightforest.config.fallen_hollow_log_weight": "Peso del tronco hueco caido", + "twilightforest.config.fallen_small_log_weight": "Peso del tronco pequeño caído", + "twilightforest.config.druid_hut_weight": "Peso de la cabaña del druida", + + "twilightforest.config.hollow_hill_stalactites": "Estalactitas de la Colina Hueca personalizadas", + "twilightforest.config.hollow_hill_stalactites.tooltip": "Define estalactitas personalizadas generadas en colinas huecas.\n_Format is \\\"modid:block<:meta> size max_Length min_Height weight\\\", donde las propiedades son:\n_Size - la longitud máxima de la estalactita en relación con el espacio entre el suelo y el techo de la colina,\n_Max length - la longitud máxima de una estalactita en bloques,\n_Min height - el espacio mínimo entre el suelo de la colina y la estalactita para que se genere,\n_Weight - la frecuencia con la que se genera.\n\n_For example: \\\"minecraft:iron_ore 0.7 8 1 24\\\" añadiría una estalactita igual a la estalactita de mineral de hierro por defecto.", + "twilightforest.config.large_hill": "Grandes Colinas", + "twilightforest.config.large_hill.tooltip": "Bloques que se generan como estalactitas sólo en las grandes colinas.", + "twilightforest.config.medium_hill": "Colinas medianas y grandes", + "twilightforest.config.medium_hill.tooltip": "Bloques que se generan como estalactitas en colinas medianas y grandes.", + "twilightforest.config.small_hill": "Todas las colinas", + "twilightforest.config.small_hill.tooltip": "Bloques que generan como estalactitas en todas las colinas.", + "twilightforest.config.stalactite_config_only": "Utilice sólo la configuración de estalactitas", + "twilightforest.config.stalactite_config_only.tooltip": "Si es cierto, no se utilizarán las estalactitas por defecto ni las definidas por otros mods.", + + "twilightforest.config.compat": "Compatibilidad", + "twilightforest.config.compat.tooltip": "¿Debe cargarse la Compatibilidad de TF? Desactivar si la Compatibilidad de TF está causando caídas o si no se desea.", + + "twilightforest.config.performance": "Ajustes de rendimiento", + "twilightforest.config.performance.tooltip": "Te permite sacrificar varias cosas para mejorar el rendimiento del mundo.", + "twilightforest.config.canopy_coverage": "Cobertura del Dosel", + "twilightforest.config.canopy_coverage.tooltip": "Cantidad de cobertura del dosel. Los números más bajos mejoran la velocidad de generación de trozos a costa de un bosque más delgado.", + "twilightforest.config.twilight_oaks": "Roble Crepuscular Probabilidad", + "twilightforest.config.twilight_oaks.tooltip": "Probabilidad de que un trozo del Twilight Forest contenga un roble crepuscular. Los números más altos reducen el número de árboles, aumentando el rendimiento.", + "twilightforest.config.leaves_light_opacity": "Opacidad de las hojas crepusculares", + "twilightforest.config.leaves_light_opacity.tooltip": "Esto controla la opacidad de las hojas, cambiando la cantidad de luz bloqueada. Puede utilizarse para disminuir la complejidad en algunos controles de iluminación.", + "twilightforest.config.glacier_packed_ice": "Glaciares de hielo compacto en lugar de hielo", + "twilightforest.config.glacier_packed_ice.tooltip": "Si se establece como verdadero, los glaciares crepusculares se generarán con hielo compactado en lugar de hielo translúcido normal, lo que reducirá la cantidad de cálculos de comprobación de la luz.", + "twilightforest.config.enable_skylight": "Activar el Tragaluz", + "twilightforest.config.enable_skylight.tooltip": "Si la dimensión tiene valores de tragaluz por bloque. Desactivar esto mejorará significativamente el rendimiento de la generación de mundos, a costa de una iluminación plana en todas partes.\n_WARNING: Una vez que los trozos se cargan sin tragaluz, esos datos se pierden y no pueden ser regenerados fácilmente. Tenga cuidado.", + + "twilightforest.config.silent_cicadas": "Cigarras silenciosas", + "twilightforest.config.silent_cicadas.tooltip": "Haz que las cigarras sean silenciosas para aquellos que tengan problemas con la biblioteca de sonido o que las encuentren molestas.", + + "twilightforest.config.first_person_effects": "Renderización de efectos en 1ª persona", + "twilightforest.config.first_person_effects.tooltip": "Controla si varios efectos del mod se renderizan en la vista en primera persona. Desactívelo si los encuentra molestos.", + + "twilightforest.config.origin_dimension": "Dimensión de origen", + "twilightforest.config.origin_dimension.tooltip": "La dimensión desde la que siempre puedes viajar al Twilight Forest, así como la dimensión a la que regresarás. El valor predeterminado es el mundo exterior.", + "twilightforest.config.portals_in_other_dimensions": "Portales en otras dimensiones", + "twilightforest.config.portals_in_other_dimensions.tooltip": "Permitir que los portales al Twilight Forest se hagan fuera de la dimensión 'origen'. Puede considerarse una hazaña.", + "twilightforest.config.admin_portals": "Portales Twilight sólo para administradores", + "twilightforest.config.admin_portals.tooltip": "Permitir portales sólo para administradores (Operadores). Esto reduce severamente el rango en el que el mod suele escanear en busca de condiciones de portales válidos, y escanea cerca de los ops solamente.", + "twilightforest.config.portals": "Desactivar los portales Twilight", + "twilightforest.config.portals.tooltip": "Desactivar por completo la creación de portales en Twilight Forest. Proporcionado para los operadores de servidores que buscan restringir la acción a la dimensión.", + "twilightforest.config.portal_creator": "Objeto creador del portal", + "twilightforest.config.portal_creator.tooltip": "Cadena de registro IDs de elementos utilizados para crear el Portal de Twilight Forest. (domain:regname:meta) meta es opcional.", + "twilightforest.config.portal_lighting": "Fuego relámpago para la creación del portal", + "twilightforest.config.portal_lighting.tooltip": "Establece esta opción como verdadera si quieres que el rayo que enciende el portal no prenda fuego a las cosas. Para los que no les gusta la diversión.", + "twilightforest.config.portal_return": "Los portales deben generar como un portal de dos vías", + "twilightforest.config.portal_return.tooltip": "Si es falso, el portal de retorno requerirá el elemento de activación.", + "twilightforest.config.check_portal_destination": "Destino del Portal Pre-Check", + "twilightforest.config.check_portal_destination.tooltip": "Determina si los nuevos portales deben ser precomprobados por seguridad. Si se activa, los portales no se formarán en lugar de redirigirse a un destino alternativo seguro.\n_Note que al activar esto también se reduce la tasa de comprobación de la formación de portales.", + + "twilightforest.config.progression_default": "Regla de Progreso por Defecto", + "twilightforest.config.progression_default.tooltip": "Establece el valor por defecto de la regla de juego que controla la progresión forzada.", + + "twilightforest.config.uncrafting": "Desactivar la desfabricación en la mesa de desfabricación", + "twilightforest.config.uncrafting.tooltip": "Desactiva la función de desfabricación de la mesa de desfabricación. Se ofrece como opción cuando la interacción con otros mods produce recetas explotables.", + + "twilightforest.config.optifine": "Desactivar la pantalla de aviso cuando se instala Optifine.", + "twilightforest.config.optifine.tooltip": "Desactiva la pantalla de aviso que se muestra al inicio cuando se instala Optifine.", + + "twilightforest.config.antibuilder_blacklist": "Lista negra anti-construcción", + "twilightforest.config.antibuilder_blacklist.tooltip": "Lista negra anti-construcción. (domain:block:meta) meta es opcional.", + + "twilightforest.config.animate_trophyitem": "Girar las cabezas de los trofeos en el modelo de artículo", + "twilightforest.config.animate_trophyitem.tooltip": "Gira las cabezas de los trofeos en el modelo de artículo. No tiene ningún impacto en el rendimiento. Para aquellos que no les gusta la diversión.", + + "twilightforest.config.shield_parry": "Parada de Escudo", + "twilightforest.config.shield_parry.tooltip": "Recomendamos descargar el mod Shield Parry para realizar paradas, pero estos controles quedan para sin.", + "twilightforest.config.parry_non_twilight": "Parada de proyectiles no Twilight", + "twilightforest.config.parry_non_twilight.tooltip": "Poner en true para parar los proyectiles que no son de Twilight. Recomendamos descargar el mod Shield Parry en su lugar.", + "twilightforest.config.parry_window_arrow": "Temporización para las flechas", + "twilightforest.config.parry_window_arrow.tooltip": "La cantidad de ticks después de levantar un escudo que hace que se pueda parar una flecha. Hay 20 ticks en 1 segundo.", + "twilightforest.config.parry_window_fireball": "Temporización para las bolas de fuego", + "twilightforest.config.parry_window_fireball.tooltip": "La cantidad de ticks después de levantar un escudo que hace que se pueda parar una bola de fuego. Hay 20 ticks en 1 segundo.", + "twilightforest.config.parry_window_throwable": "Temporización de los lanzamientos", + "twilightforest.config.parry_window_throwable.tooltip": "La cantidad de ticks después de levantar un escudo que hace que se pueda parar un objeto lanzado. Hay 20 ticks en 1 segundo.", + "twilightforest.config.shield_Parry_Ticks_Beam": "Ventana de tiempo para las vigas???", + "twilightforest.config.shield_Parry_Ticks_Beam.tooltip": "???", + + "twilightforest.config.loading_screen": "Pantalla de Carga", + "twilightforest.config.loading_screen.tooltip": "Sólo para clientes: Controles de la pantalla de carga", + "twilightforest.config.loading_icon_enable": "Activar la animación del icono de carga", + "twilightforest.config.loading_icon_enable.tooltip": "Tambalea el icono de carga. No tiene ningún impacto en el rendimiento. Para los que no les gusta la diversión.", + "twilightforest.config.loading_screen_swap_frequency": "Cambio de pantalla de carga", + "twilightforest.config.loading_screen_swap_frequency.tooltip": "Cuántos ticks entre cada cambio de pantalla de carga. Poner a 0 para que no haya ningún ciclo.", + "twilightforest.config.loading_icon_wobble_bounce_frequency": "Velocidad de Animación de los Iconos", + "twilightforest.config.loading_icon_wobble_bounce_frequency.tooltip": "Frecuencia de tambaleo y rebote.", + "twilightforest.config.loading_icon_scale": "Escala del Icono", + "twilightforest.config.loading_icon_scale.tooltip": "Escala de todo el icono de carga de rebote.", + "twilightforest.config.loading_icon_bounciness": "Icono Rebotante", + "twilightforest.config.loading_icon_bounciness.tooltip": "Cuánto rebota el icono de carga.", + "twilightforest.config.loading_icon_tilting": "Icon Wobbliness", + "twilightforest.config.loading_icon_tilting.tooltip": "Hasta dónde se tambalea el icono de carga.", + "twilightforest.config.loading_icon_tilt_pushback": "Icono Desplazamiento de la inclinación", + "twilightforest.config.loading_icon_tilt_pushback.tooltip": "Valor de empuje para volver a centrar el bamboleo del icono de carga.", + "twilightforest.config.casket_uuid_locking": "Cierre del ataúd UUID", + "twilightforest.config.casket_uuid_locking.tooltip": "Si es cierto, los ataúdes de recuerdo que se generan cuando un jugador muere no serán accesibles para otros jugadores. Utiliza esta opción si no quieres que la gente coja de los ataúdes de muerte de otras personas. NOTA: los operadores del servidor seguirán pudiendo abrir los ataúdes cerrados.", + + // Books + "twilightforest.book.lichtower.1": "\u00A78[[Un cuaderno de explorador, roído por los monstruos]]\u00A70\n\n_He comenzado a examinar la extraña aura que rodea a esta torre. Los ladrillos de la torre están protegidos por una maldición, más fuerte que cualquiera que haya visto antes. La magia de la maldición", + "twilightforest.book.lichtower.2": "está hirviendo en los alrededores.\n\n_En mi tierra natal tendría muchas opciones para lidiar con esta magia, pero aquí mis suministros son limitados. En mi tierra natal tendría muchas opciones para lidiar con esta magia, pero aquí mis suministros son limitados. Tendré que investigar...", + "twilightforest.book.lichtower.3": "\u00A78[[Muchas entradas después]]\u00A70\n\n_Un avance! En mis viajes avisté un enorme monstruo con forma de serpiente en un patio decorado. Cerca, recogí una escama verde desgastada y desechada.\n\n_La magia de la escama parece tener las", + "twilightforest.book.lichtower.4": "propiedades para romper maldiciones que necesito, pero la magia es demasiado débil. Puede que necesite adquirir un espécimen más fresco, directamente de la criatura.", + + "twilightforest.book.labyrinth.1": "\u00A78[[Cuaderno de un explorador, escrito en papel impermeable]]\u00A70\n\n_Los mosquitos de este pantano son molestos, pero extraños. La gran mayoría de ellos parece no tener una fuente natural, ni parece tener un papel en la ecología local. He comenzado a", + "twilightforest.book.labyrinth.2": "sospechar que son una especie de maldición mágica.\n\n\u00A78[[Siguiente entrada]]\u00A70\n\n_Ahora que he encontrado un hechizo de protección en el laberinto en ruinas aquí, considero que mis sospechas se confirman.Tanto el hechizo de protección", + "twilightforest.book.labyrinth.3": "como los mosquitos son una maldición. Esta maldición parece tener un origen diferente a las otras que he encontrado. Tendré que investigar más...\n\n\u00A78[[Siguiente entrada]]\u00A70\n\n_La maldición parece", + "twilightforest.book.labyrinth.4": "ser de un tipo demasiado poderoso para que un solo ser la produzca. Serían necesarios varios magos trabajando en combinación.\n\n_Si uno de los magos dejara de contribuir, la maldición caería sobre todo el pantano. Extrañamente,", + "twilightforest.book.labyrinth.5": "mis adivinaciones no muestran señales de ningún mago vivo cercano. Sin embargo, vi algo interesante en una de las torres de techo puntiagudo cercanas...", + + "twilightforest.book.hydralair.1": "\u00A78[[Un cuaderno de explorador, escrito en papel ignífugo]]\u00A70\n\n_El fuego es un obstáculo trivial para un maestro explorador como yo. He atravesado mares de fuego y nadado por océanos de lava. El aire ardiente aquí es una variación interesante,", + "twilightforest.book.hydralair.2": "pero, en definitiva, no es un obstáculo.\n\n_Sin embargo, lo que me detiene es que me he encontrado con otro hechizo de protección, esta vez rodeando a una poderosa criatura que debe ser el rey de este pantano de fuego. Este no es el primer hechizo de protección que", + "twilightforest.book.hydralair.3": "encuentro, y estoy comenzando a desentrañar los misterios de cómo funcionan.\n\n_Si este hechizo es como los otros, será sostenido por una poderosa criatura cercana. Alrededor del pantano de fuego hay varios pantanos húmedos, y bajo esos", + "twilightforest.book.hydralair.4": "pantanos hay laberintos llenos de minotauros. La elección lógica para atar tal hechizo sería algún tipo de minotauro poderoso, diferente de alguna manera de los otros que lo rodean...", + + "twilightforest.book.tfstronghold.1": "\u00A78[[Un cuaderno de explorador, escrito en un papel débilmente brillante]\u00A70\n\n_Los tallos de oscuridad que rodean esta zona no son más que la manifestación de un hechizo protector sobre todo el bosque oscuro. El hechizo causa ceguera, lo cual es bastante molesto. He visto", + "twilightforest.book.tfstronghold.2": "varias cosas interesantes en la zona y me gustaría seguir explorando.\n\n\u00A78[[Entrada siguiente]]\u00A70\n\n_He encontrado unas ruinas en el bosque oscuro. Pertenecen a una fortaleza, del tipo que suelen habitar los caballeros. Sin embargo", + "twilightforest.book.tfstronghold.3": "más que de caballeros, esta fortaleza está llena de goblins. Llevan armadura de caballero, pero su comportamiento es muy poco caballeroso.\n\n\u00A78[[Entrada siguiente]]\u00A70\n\n_En lo profundo de las ruinas, he encontrado un pedestal. El pedestal parece ser del tipo en el que", + "twilightforest.book.tfstronghold.4": "los caballeros colocarían los trofeos para demostrar su fuerza.\n\\La obtención de un cetro poderoso parece debilitar la maldición del bosque oscuro, y la colocación de un trofeo asociado a una criatura poderosa en el pedestal probablemente concedería el acceso a la", + "twilightforest.book.tfstronghold.5": "parte principal de la fortaleza.", + + "twilightforest.book.darktower.1": "\u00A78[[Un cuaderno de explorador que parece haber sobrevivido a una explosión]]\u00A70\n\n_Esta torre tiene claramente mecanismos que no me responden. Su magia casi anhela reconocer mi toque, pero no puede. Es como si los dispositivos de la torre estuvieran siendo", + "twilightforest.book.darktower.2": "suprimida por un poderoso grupo de seres cercanos.\n\n\u00A78[[Entrada siguiente]]\u00A70\n\n_La magia parece emanar de lo más profundo de las fortalezas cercanas. No puede venir de los goblins, ya que su magia es encantadora, pero desenfocada. Allí", + "twilightforest.book.darktower.3": "debe haber alguna fuerza aún activa en los bastiones.\n\n\u00A78[[Entrada siguiente]]\u00A70\n\n_Mi análisis indica que proviene de varias fuentes, operando como un grupo. Volveré a la fortaleza después de reabastecerme...", + + "twilightforest.book.yeticave.1": "\u00A78[[Un cuaderno de explorador, cubierto de escarcha]]\u00A70\n\n_La ventisca que rodea estas tierras nevadas es incesante. No se trata de una nevada ordinaria: es un fenómeno mágico. Tendré que realizar experimentos para encontrar", + "twilightforest.book.yeticave.2": "lo que es capaz de causar tal efecto.\n\n\u00A78[[Entrada siguiente]]\u00A70\n\n_La maldición parece ser de un tipo demasiado poderoso para que un solo ser la produzca. Serían necesarios varios magos trabajando en combinación.", + "twilightforest.book.yeticave.3": "Si uno de los magos dejara de contribuir, la ventisca se calmaría. Extrañamente, mis adivinaciones no muestran señales de ningún mago vivo cercano. Sin embargo, vi algo interesante en una de las torres de techo puntiagudo cercanas...", + + "twilightforest.book.icetower.1": "\u00A78[[El cuaderno de un explorador, cubierto de hielo]]\u00A70\n\n_He superado una ventisca, sólo para encontrarme con esta terrible tormenta de hielo en la cima del glaciar. Mis exploraciones me han mostrado el esplendor de un palacio de hielo, que brilla con los colores de la aurora polar. Todo", + "twilightforest.book.icetower.2": "parece protegido por una especie de maldición.\n\n\u00A78[[Entrada siguiente]]\u00A70\n\n_No soy un novato. Esta maldición es alimentada por el poder de una criatura cercana. La causa de la maldición que rodea el pantano de fuego se construyó a partir del poder del líder de los", + "twilightforest.book.icetower.3": "minotauros de las cercanías.\n\n_Alrededor de este glaciar, hay masas de yetis. Quizás los yetis tengan algún tipo de líder...", + + "twilightforest.book.trollcave.1": "\u00A78[[Un cuaderno de explorador, dañado por el ácido]]\u00A70\n\n_Parece que no hay forma de protegerme de la tormenta tóxica que rodea esta zona. En mis breves excursiones, también he encontrado otro hechizo de protección, similar a los", + "twilightforest.book.trollcave.2": "otros que he presenciado. El hechizo debe estar conectado a la tormenta tóxica de alguna manera. Más investigación para seguir...\n\n\u00A78[[Entrada siguiente]]\u00A70\n\n_Tal magia climática suprema debe ser el resultado de", + "twilightforest.book.trollcave.3": "múltiples e invictos grandes males en este mundo. Mis estudios contienen varias pistas que apuntan a un pantano abrasador, un bosque cubierto de profunda oscuridad y un reino cubierto de nieve.", + + "twilightforest.book.unknown.1": "\u00A78[[Este libro muestra signos de haber sido copiado muchas veces]]\u00A70\n\n_No puedo explicar el campo que rodea esta estructura, pero la magia es poderosa. Si esta maldición es como las otras, entonces la respuesta para desbloquearla está en otra parte. Tal vez hay", + "twilightforest.book.unknown.2": "algo que he dejado sin hacer, o algún monstruo que aún no he vencido. Tendré que regresar. Volveré a este lugar más tarde, para ver si algo ha cambiado.", + + // Fluid + + "fluid.fierymetal": "Fierro fundido", + "fluid.knightmetal": "Caballero de Metal Fundido", + "fluid.fiery_essence": "Esencia ardiente", + + // TCon + + "material.nagascale": "Escama Naga", + "material.steeleaf": "Hoja de Acero", + "material.fierymetal": "Ardiente", + "material.knightmetal": "Caballero", + "material.raven_feather": "Pluma de Cuervo", + + "modifier.twilit": "Twilit", + "modifier.twilit.desc": "§oLa bendición iluminadora del Twilight Forest§r.\nMás rápido en el Twilight Forest.\nMás daños fuera del Twilight Forest.", + "modifier.twilit.extra.speed": "Velocidad de extracción en Twilight Forest: +%s", + "modifier.twilit.extra.damage": "Daños fuera del Twilight Forest: +%s", + "modifier.precipitate": "Precipitate", + "modifier.precipitate.desc": "§oEl último plan de escape en pie.§r\nCuanto menos salud tenga, más rápido será.", + "modifier.synergy": "Sinergia", + "modifier.synergy.desc": "§oMira mamá, no hay musgo!§r\nSe reparará por sí mismo si tienes Hoja de Acero en tu barra de acceso.", + "modifier.stalwart": "Incondicional", + "modifier.stalwart.desc": "§o_Los valientes y audaces.§r\nGolpear a una entidad puede hacer que te sientas envalentonado.", + "modifier.veiled": "Velada", + "modifier.veiled.desc": "§oComo un espectro!§r\nEl proyectil será invisible.", + + // Immersive Engineering + "desc.immersiveengineering.info.shader.rarity.twilight": "Twilight", + + "item.twilightforest.shader": "Twilit Shader: %s", + "item.twilightforest.shader_bag": "Twilit %s Shader Bag", + + "item.twilightforest.shader.name.twilight": "Twilight", + "item.twilightforest.shader.name.firefly": "Luciérnaga", + "item.twilightforest.shader.name.questing_ram": "Carnero de la Búsqueda", + "item.twilightforest.shader.name.ironwood": "Madera de Hierro", + "item.twilightforest.shader.name.steeleaf": "Hoja de Acero", + "item.twilightforest.shader.name.knightly": "Caballero de Metal", + "item.twilightforest.shader.name.fiery": "Ardiente", + "item.twilightforest.shader.name.snakestone": "Piedra de la Serpiente", + "item.twilightforest.shader.name.naga": "Naga", + "item.twilightforest.shader.name.lich": "Lich", + "item.twilightforest.shader.name.mazestone": "Piedra de Laberinto", + "item.twilightforest.shader.name.pinch_beetle": "Escarabajo de Pinzas", + "item.twilightforest.shader.name.minoshroom": "Minosetauro", + "item.twilightforest.shader.name.hydra": "Hidra", + "item.twilightforest.shader.name.underbrick": "Subsuelo de Ladrillos", + "item.twilightforest.shader.name.knight_phantom": "Caballero Fantasma", + "item.twilightforest.shader.name.towerwood": "Torre de Madera", + "item.twilightforest.shader.name.carminite": "Carminita", + "item.twilightforest.shader.name.ur-ghast": "Ur-Ghast", + "item.twilightforest.shader.name.alpha_yeti": "Yeti Alfa", + "item.twilightforest.shader.name.auroralized": "Auroralizado", + "item.twilightforest.shader.name.snow_queen": "Reina de las Nieves", + "item.twilightforest.shader.name.cube_of_annihilation": "Cubo de la Aniquilación", + "item.twilightforest.shader.name.final_castle": "Castillo Final", + + // Optifine + "twilightforest.gui.optifine.title": "AVISO: OPTIFINE DETECTADO", + "twilightforest.gui.optifine.message": "Antes de continuar, por favor, tenga en cuenta que Optifine es conocido por causar fallos, errores visuales de entidades multiparte y muchos otros problemas.\n\nAntes de informar de un error, por favor, elimine Optifine primero y compruebe de nuevo si el error sigue presente.\n\nLos problemas relacionados con Optifine no pueden ser resueltos por Twilight Forest!\n\nEsta pantalla puede ser desactivada en la configuración del cliente." +} diff --git a/src/main/resources/assets/twilightforest/lang/es_es.json b/src/main/resources/assets/twilightforest/lang/es_es.json new file mode 100644 index 0000000000..7900a4d5fb --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/es_es.json @@ -0,0 +1,47 @@ +{ + "advancement.twilightforest.arctic_dyed": "Ponerse a la moda", + "advancement.twilightforest.beanstalk": "Jack y las habichuelas mágicas", + "advancement.twilightforest.experiment_115": "¿Carne misteriosa?", + "advancement.twilightforest.experiment_115.desc": "Parece tarta, aunque...", + "advancement.twilightforest.experiment_115_2": "Toma nota: ¡Gran éxito!", + "advancement.twilightforest.experiment_115_2.desc": "¡Es tan delicioso y húmedo!", + "advancement.twilightforest.fiery_set": "Galones de sangre y lágrimas", + "advancement.twilightforest.full_mettle_alchemist": "Alquimista de pleno valor", + "advancement.twilightforest.ghast_trap": "Algo extraño en la torremadera", + "advancement.twilightforest.ghast_trap.desc": "¡Elimina a los %s alrededor de un %s y activa para arrancar el %s del cielo!", + "advancement.twilightforest.giants": "Estoy en las nubes", + "advancement.twilightforest.glass_sword": "Maravilla de un solo golpe", + "advancement.twilightforest.glass_sword.desc": "Espero que lo hayas aprovechado bien.", + "advancement.twilightforest.hedge": "Machacabichos", + "advancement.twilightforest.hill1": "¡Las botas son mías!", + "advancement.twilightforest.hill2": "¿Qué fue ese ruido?", + "advancement.twilightforest.hill3": "Veo a través de ti", + "advancement.twilightforest.hydra_chop": "¡Chuleta de hidra, cariño!", + "advancement.twilightforest.kill_cicada": "Silencio", + "advancement.twilightforest.kill_hydra": "Cazador de hidras", + "advancement.twilightforest.kill_lich": "Saca a tus muertos", + "advancement.twilightforest.kill_naga": "Hora de igualar la balanza", + "advancement.twilightforest.lich_scepters": "¡Por nuestros poderes combinados!", + "advancement.twilightforest.magic_map": "Puedo ver para siempre", + "advancement.twilightforest.magic_map_focus": "Con fuego se escribe", + "advancement.twilightforest.maze_map": "Y ahora, a encontrar la salida", + "advancement.twilightforest.mazebreaker": "Rompiendo el laberinto", + "advancement.twilightforest.naga_armors": "Armero naga", + "advancement.twilightforest.ore_map": "¿Cómo puede valer la pena?", + "advancement.twilightforest.progress_glacier": "Cielos despejados", + "advancement.twilightforest.progress_knights": "Aclimatación de carminita", + "advancement.twilightforest.progress_labyrinth": "Poderoso Stroganoff", + "advancement.twilightforest.progress_merge": "Enfrentamiento definitivo", + "advancement.twilightforest.progress_troll": "Deseo más quemaduras", + "advancement.twilightforest.progress_trophy_pedestal": "Campeón trofeado", + "advancement.twilightforest.progress_ur_ghast": "Lágrimas de fuego", + "advancement.twilightforest.progress_yeti": "Pelaje alfa", + "advancement.twilightforest.quest_ram": "Baaahs consumados", + "advancement.twilightforest.root": "Bosque crepuscular", + "advancement.twilightforest.root.desc": "Adéntrate al misterioso bosque mágico: el bosque crepuscular", + "advancement.twilightforest.troll": "Trolleando un poco", + "advancement.twilightforest.twilight_hunter": "El silencio del bosque", + "itemGroup.twilightforest.blocks": "Bosque crepuscular: Bloques", + "itemGroup.twilightforest.equipment": "Bosque crepuscular: Equipamiento", + "itemGroup.twilightforest.items": "Bosque crepuscular: Objetos" +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/es_mx.json b/src/main/resources/assets/twilightforest/lang/es_mx.json new file mode 100644 index 0000000000..a0d52caef9 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/es_mx.json @@ -0,0 +1,1316 @@ +{ + "itemGroup.twilightforest": "Twilight Forest", + + // ADVANCEMENTS + "advancement.twilightforest.root.desc": "Entra en el misterioso bosque mágico: the Twilight Forest.", + + // General progression + "advancement.twilightforest.hedge": "Golpeador de Bichos", + "advancement.twilightforest.hedge.desc": "Derrota a una araña en un %s.", + + "advancement.twilightforest.hill1": "Las botas son mías!", + "advancement.twilightforest.hill1.desc": "Derrota a un %s en un pequeño %s.", + "advancement.twilightforest.hill2": "Qué fue ese ruido?", + "advancement.twilightforest.hill2.desc": "Derrota a un %s en un medio %s.", + "advancement.twilightforest.hill3": "Veo a través de ti", + "advancement.twilightforest.hill3.desc": "Derrota a un %s en un gran %s.", + + "advancement.twilightforest.quest_ram": "Consumación de Baaahs", + "advancement.twilightforest.quest_ram.desc": "Dale al %s lo que le falta.", + + // Map + "advancement.twilightforest.magic_map_focus": "Con El Fuego Se Escribe", + "advancement.twilightforest.magic_map_focus.desc": "Elabora el %s con un %s, %s, y %s.", + "advancement.twilightforest.magic_map": "Puedo Ver Para Siempre", + "advancement.twilightforest.magic_map.desc": "Haz los %s.", + "advancement.twilightforest.maze_map": "Y Ahora, a Encontrar la Salida", + "advancement.twilightforest.maze_map.desc": "Elabora los %s después de obtener el foco del laberinto.", + "advancement.twilightforest.ore_map": "Cómo puede merecer la pena?", + "advancement.twilightforest.ore_map.desc": "Haz los %s.", + + // Mainline beginning progression + "advancement.twilightforest.twilight_hunter": "El Silencio del Bosque", + "advancement.twilightforest.twilight_hunter.desc": "Cazar algo de la fauna local.", + + "advancement.twilightforest.kill_naga": "Es Hora de Igualar la Balanza", + "advancement.twilightforest.kill_naga.desc": "Mata al %s en su patio del bosque y obtén un %s para superar la barrera mágica que rodea la torre del Lich.", + "advancement.twilightforest.naga_armors": "Armero Naga", + "advancement.twilightforest.naga_armors.desc": "Crea la armadura de pecho y de piernas de %s.", + + "advancement.twilightforest.kill_lich": "Trae a tus muertos", + "advancement.twilightforest.kill_lich.desc": "Mata a los % en lo alto de su torre y recupera un cetro para eliminar los mosquitos venenosos del Pantano, ver a través de la oscuridad cegadora de la maldición del Bosque Oscuro y resistir el frío del Bosque Nevado.", + "advancement.twilightforest.lich_scepters": "Por Nuestros Poderes Combinados!", + "advancement.twilightforest.lich_scepters.desc": "Consigue los cuatro cetros de poder.", + + // Swamp Progression + "advancement.twilightforest.progress_labyrinth": "El Poderoso Stroganoff", + "advancement.twilightforest.progress_labyrinth.desc": "El guiso de carne y hongos te calienta agradablemente, lo suficiente como para que sientas que estás lo suficientemente aclimatado como para aventurarte en el Pantano del Fuego.", + "advancement.twilightforest.kill_hydra": "Cazador de Hidras", + "advancement.twilightforest.kill_hydra.desc": "Derrota a los poderosos %s y empodérate.", + "advancement.twilightforest.mazebreaker": "Rompiendo el Laberinto", + "advancement.twilightforest.mazebreaker.desc": "Encuentra el pico %s en la bóveda secreta del laberinto.", + "advancement.twilightforest.hydra_chop": "Chuleta de Hidra, Baby!", + "advancement.twilightforest.hydra_chop.desc": "Disminuye el consumo de carne de %s hydra cuando la barra de comida esté vacía.", + + // Dark Forest Progression + "advancement.twilightforest.progress_trophy_pedestal": "Trofeo de Campeón", + "advancement.twilightforest.progress_trophy_pedestal.desc": "Reclama tu título colocando un trofeo en el pedestal de las ruinas del bosque oscuro.", + "advancement.twilightforest.progress_knights": "Aclimatación de Carminita", + "advancement.twilightforest.progress_knights.desc": "Acomoda a los inquietos fantasmas en la Tumba del Caballero y los dispositivos de la torre de carminita te obedecerán.", + "advancement.twilightforest.ghast_trap": "Algo extraño en la Torre de Madera", + "advancement.twilightforest.ghast_trap.desc": "Mata a los %s alrededor de un %s y actívalo para arrancar el %s del cielo!", + "advancement.twilightforest.progress_ur_ghast": "Lágrimas de Fuego", + "advancement.twilightforest.progress_ur_ghast.desc": "Toca las lágrimas rojas y ardientes de los %s.", + + "advancement.twilightforest.experiment_115": "Carne misteriosa?", + "advancement.twilightforest.experiment_115.desc": "Parece un pastel, aunque...", + "advancement.twilightforest.experiment_115_2": "Tomar nota: ¡Un gran éxito!", + "advancement.twilightforest.experiment_115_2.desc": "Es tan delicioso y húmedo!", + + // Snow Forest Progression + "advancement.twilightforest.progress_yeti": "Pelaje Alfa", + "advancement.twilightforest.progress_yeti.desc": "Cubre tus prendas con el suave pelaje de los %s, manteniéndote a salvo del frío del Glaciar.", + "advancement.twilightforest.progress_glacier": "Cielos Despejados", + "advancement.twilightforest.progress_glacier.desc": "Derrota a los %s encima de los %s.", + "advancement.twilightforest.arctic_dyed": "Ponerse a la Moda", + "advancement.twilightforest.arctic_dyed.desc": "Tiñe las cuatro piezas de la Armadura Ártica.", + + // Mid-way Misc. Stuff + "advancement.twilightforest.glass_sword": "Una Maravilla De Un Solo Golpe", + "advancement.twilightforest.glass_sword.desc": "Espero que lo hayas aprovechado.", + + "advancement.twilightforest.fiery_set": "Galones de Sangre y Lágrimas", + "advancement.twilightforest.fiery_set.desc": "Empuña una herramienta o arma mientras tienes al menos una pieza de armadura de ardiente en tu inventario.", + + // Highlands + "advancement.twilightforest.progress_merge": "Enfrentamiento Final", + "advancement.twilightforest.progress_merge.desc": "Mata a los %s, %s y %s para eliminar la lluvia ácida y envalentonarte para las Tierras Altas.", + "advancement.twilightforest.troll": "Trolleamos un Poco", + "advancement.twilightforest.troll.desc": "Encuentra y mata a un %s.", + "advancement.twilightforest.beanstalk": "Jack y las Habichuelas", + "advancement.twilightforest.beanstalk.desc": "Consigue algunos %s en las cuevas de los trolls y úsalos en el suelo brillante bajo las nubes.", + "advancement.twilightforest.giants": "Estoy en las Nubes", + "advancement.twilightforest.giants.desc": "Mata a un %s en las nubes, recupera un %s, y vuelve a las cuevas de los trolls.", + "advancement.twilightforest.progress_troll": "Deseo Más Quemaduras", + "advancement.twilightforest.progress_troll.desc": "Encuentra los %s en las cuevas de los trolls, y podrás quemar las barreras de espinas.", + "advancement.twilightforest.progress_thorns": "Más Allá De Las Espinas [NYI]", + "advancement.twilightforest.progress_thorns.desc": "Pasa por las Tierras Espinosas y desbloquea la puerta del castillo.", + "advancement.twilightforest.progress_castle": "Wow Que Super Castillo!!! [NYI]", + "advancement.twilightforest.progress_castle.desc": "Qué podría haber en ese castillo?!?", + + // Collections + "advancement.twilightforest.twilight_dining": "Cenamos en el Eterno Atardecer", + "advancement.twilightforest.twilight_dining.desc": "Come toda la comida exclusiva de Twilight Forest.", + "advancement.twilightforest.experiment_115_3": "Comer 115 cada día, 115 años, para siempre", + "advancement.twilightforest.experiment_115_3.desc": "comer experimento ciento quince durante todo el día, para siempre, ciento quince veces experimento ciento quince, experimento ciento quince punto com, doble-u doble-u punto experimento ciento quince punto com, ciento quince años, cada minuto experimento ciento quince punto com, doble-u doble-u punto ciento quince punto com", + "advancement.twilightforest.arborist": "Dendrologista Maníaco", + "advancement.twilightforest.arborist.desc": "Prepara tus hachas y tijeras. Busca en todos los rincones y consigue todo lo que provenga de los árboles. Construye, saquea y obtén cada tabla... árbol joven... hojas... más... todo. ¡TODO!", + + "twilightforest.twilight_portal.unsafe": "No parece seguro aquí...", + "twilightforest.trophy_pedestal.ineligible": "No eres digno.", + "twilightforest.ore_meter.range": "Radio: %s, Origen: [%s, %s]", + "twilightforest.ore_meter.exposed": "Expuesto: %s", + "twilightforest.scepter_charges": "Quedan %d cargas", + + // Commands + "commands.tffeature.usage": "/tffeature ", + "commands.tffeature.not_in_twilight_forest": "You are not in the Twilight Forest dimension", + "commands.tffeature.nearest": "The nearest feature is %s", + "commands.tffeature.center": "Center of feature: %s", + "commands.tffeature.chunk": "Are in feature chunk: %s", + "commands.tffeature.structure.inside": "You are in the structure for that feature", + "commands.tffeature.structure.outside": "You are not in the structure for that feature", + "commands.tffeature.structure.required": "You are not in a structure", + "commands.tffeature.structure.conquer.status": "Structure conquer flag: %s", + "commands.tffeature.structure.conquer.update": "Structure conquer flag was %s, changing to %s", + "commands.tffeature.locate.usage": "/tffeature locate ", + "commands.tfreload.reload": "Reloading Twilight Forest Shaders!", + + // Biomes + "biome.twilightforest.forest": "Bosque Crepuscular", + "biome.twilightforest.dense_forest": "Bosque Denso", + "biome.twilightforest.firefly_forest": "Bosque de las Luciérnagas", + "biome.twilightforest.clearing": "Despeje Crepuscular", + "biome.twilightforest.oak_savannah": "Sabana de Roble", + "biome.twilightforest.stream": "Corriente Crepuscular", + "biome.twilightforest.lake": "Lago Crepuscular", + "biome.twilightforest.mushroom_forest": "Bosque de Hongos", + "biome.twilightforest.dense_mushroom_forest": "Bosque Denso de Hongos", + "biome.twilightforest.enchanted_forest": "Bosque Encantado", + "biome.twilightforest.spooky_forest": "Bosque Espeluznante", + "biome.twilightforest.swamp": "TPantano Crepuscular", + "biome.twilightforest.fire_swamp": "Pantano de Fuego", + "biome.twilightforest.dark_forest": "Bosque Oscuro", + "biome.twilightforest.dark_forest_center": "Centro del Bosque Oscuro", + "biome.twilightforest.snowy_forest": "Bosque Nevado", + "biome.twilightforest.glacier": "Glaciar Crepuscular", + "biome.twilightforest.highlands": "Tierras Altas Crepusculares", + "biome.twilightforest.thornlands": "Tierras Espinosas", + "biome.twilightforest.final_plateau": "Meseta Final", + + // Gamerules + "gamerule.tfEnforcedProgression": "Progresión de Twilight Forest", + + // Enchantments + "enchantment.twilightforest.fire_react": "Reacción al Fuego", + "enchantment.twilightforest.chill_aura": "Aura fría", + + // Effects + "effect.twilightforest.frosted": "Escarchado", + + // Blocks + "block.twilightforest.twilight_oak_log": "Tronco de Roble Crepuscular", + "block.twilightforest.canopy_log": "Tronco de Dosel Arbóreo", + "block.twilightforest.mangrove_log": "Tronco de Manglar", + "block.twilightforest.dark_log": "Tronco de Madera Oscura", + "block.twilightforest.stripped_twilight_oak_log": "Tronco de Roble Crepuscular Sin Corteza", + "block.twilightforest.stripped_canopy_log": "Tronco de Dosel Arbóreo Sin Corteza", + "block.twilightforest.stripped_mangrove_log": "Tronco de Manglar Sin Corteza", + "block.twilightforest.stripped_dark_log": "Tronco de Madera Oscura Sin Corteza", + "block.twilightforest.twilight_oak_wood": "Madera de Roble Crepuscular", + "block.twilightforest.canopy_wood": "Madera de Dosel Arbóreo", + "block.twilightforest.mangrove_wood": "Madera de Manglar", + "block.twilightforest.dark_wood": "Madera Oscura", + "block.twilightforest.stripped_twilight_oak_wood": "Madera de Roble Crepuscular Sin Corteza", + "block.twilightforest.stripped_canopy_wood": "Madera de Dosel Arbóreo Sin Corteza", + "block.twilightforest.stripped_mangrove_wood": " Madera de Manglar Despojada", + "block.twilightforest.stripped_dark_wood": " Madera oscura despojada", + "block.twilightforest.twilight_oak_leaves": "Hojas de Roble Crepuscular", + "block.twilightforest.canopy_leaves": "Hojas de Dosel Arbóreo", + "block.twilightforest.mangrove_leaves": "Hojas de Manglar", + "block.twilightforest.rainboak_leaves": "Hojas de Roble Arco Iris", + "block.twilightforest.firefly": "Luciérnaga", + "block.twilightforest.cicada": "Cigarra", + "block.twilightforest.cicada.desc": "Y si esto se pudiera lanzar contra alguien con un cañón de riel...?", + "block.twilightforest.twilight_portal": "Portal de Twilight Forest", + "block.twilightforest.maze_stone": "Piedra de Laberinto", + "block.twilightforest.maze_stone_brick": "Ladrillos de Piedra de Laberinto", + "block.twilightforest.maze_stone_chiseled": "Piedra de Laberinto Grabados", + "block.twilightforest.maze_stone_decorative": "Ladrillos de Piedra de Laberinto Decorativo", + "block.twilightforest.maze_stone_cracked": "Piedra de Laberinto Agrietada", + "block.twilightforest.maze_stone_mossy": "Piedra de Laberinto Musgosa", + "block.twilightforest.maze_stone_mosaic": "Mosaicos de Piedra del Laberinto", + "block.twilightforest.maze_stone_border": "Borde de Piedra de Laberinto", + "block.twilightforest.maze_stone_ceiling": "Techo de Piedra de Laberinto", + "block.twilightforest.spiral_bricks": "Ladrillos en Espiral", + "block.twilightforest.hedge": "Cobertura", + "block.twilightforest.boss_spawner_naga": "Generador de Jefe Naga", + "block.twilightforest.boss_spawner_lich": "Generador de Jefe Lich", + "block.twilightforest.boss_spawner_minoshroom": "Generador de Jefe Minosetauro", + "block.twilightforest.boss_spawner_hydra": "Generador de Jefe Hidra", + "block.twilightforest.boss_spawner_knight_phantom": "Generador de Jefe Caballero Fantasma", + "block.twilightforest.boss_spawner_ur_ghast": "Genrador de Jefe Ur-Ghast", + "block.twilightforest.boss_spawner_alpha_yeti": "Generador de Jefe Yeti", + "block.twilightforest.boss_spawner_snow_queen": "Generador de Jefe Reina de las Nieves", + "block.twilightforest.boss_spawner_final_boss": "Generador de Jefe Final", + "block.twilightforest.firefly_jar": "Jarra con Luciérnaga", + "block.twilightforest.cicada_jar": "Jarra con Cigarra", + "block.twilightforest.moss_patch": "Parche de Musgo [WIP]", + "block.twilightforest.mayapple": "Mayapple", + "block.twilightforest.clover_patch": "Hoja de Trébol [NYI]", + "block.twilightforest.fiddlehead": "Brotes de Helecho", + "block.twilightforest.mushgloom": "Hongo Brillante", + "block.twilightforest.torchberry_plant": "Planta de Antorcha", + "block.twilightforest.root_strand": "Hilos de raíz", + "block.twilightforest.fallen_leaves": "Montón de hojas", + "block.twilightforest.root": "Raíces", + "block.twilightforest.liveroot_block": "Raíces vivas", + "block.twilightforest.uncrafting_table": "Mesa de Desfabricación", + "block.twilightforest.smoker": "Ahumador", + "block.twilightforest.encased_smoker": "Ahumador Encapsulado", + "block.twilightforest.fire_jet": "Chorro de Fuego", + "block.twilightforest.encased_fire_jet": "Chorro de Fuego Encapsulado", + "block.twilightforest.naga_stone_head": "Cabeza de Piedra de Naga", + "block.twilightforest.naga_stone": "Piedra de Naga", + "block.twilightforest.twilight_oak_sapling": "Retoño de Roble Crepuscular Enfermizo", + "block.twilightforest.canopy_sapling": "Retoño de Dosel Arbóreo", + "block.twilightforest.mangrove_sapling": "Retoño de Manglar Crepuscular", + "block.twilightforest.darkwood_sapling": "Retoño del Árbol de Madera Oscura", + "block.twilightforest.hollow_oak_sapling": "Retoño de Roble Robusto Crepuscular", + "block.twilightforest.time_sapling": "Retoño del Árbol del Tiempo", + "block.twilightforest.transformation_sapling": "Retoño del Árbol de Transformación", + "block.twilightforest.mining_sapling": "Retoño del Árbol Minero", + "block.twilightforest.sorting_sapling": "Retoño del Árbol de Clasificación", + "block.twilightforest.rainboak_sapling": "Retoño de Roble Arcoíris", + "block.twilightforest.moonworm": "Gusano Lunar", + "block.twilightforest.time_log": "Tronco del Árbol del Tiempo", + "block.twilightforest.transformation_log": "Tronco del Árbol de Transformación", + "block.twilightforest.mining_log": "Tronco del Árbol Minero", + "block.twilightforest.sorting_log": "Tronco del Árbol de Clasificación", + "block.twilightforest.stripped_time_log": "Tronco Sin Corteza del Árbol del Tiempo", + "block.twilightforest.stripped_transformation_log": "Tronco Sin Corteza del Árbol de Transformación", + "block.twilightforest.stripped_mining_log": "Tronco Sin Corteza del Árbol Minero", + "block.twilightforest.stripped_sorting_log": "Tronco Sin Corteza del Árbol de Clasificación", + "block.twilightforest.sorting_wood": "Madera del Árbol de Clasificación", + "block.twilightforest.mining_wood": "Madera del Árbol Minero", + "block.twilightforest.transformation_wood": "Madera del Árbol de Transformación", + "block.twilightforest.time_wood": "Madera del Árbol del Tiempo", + "block.twilightforest.stripped_sorting_wood": "Madera Pelada del Árbol de Clasificación", + "block.twilightforest.stripped_mining_wood": "Madera Pelada del Árbol Minero", + "block.twilightforest.stripped_transformation_wood": "Madera Pelada del Árbol de Transformación", + "block.twilightforest.stripped_time_wood": "Madera Pelada del Árbol del Tiempo", + "block.twilightforest.time_log_core": "Reloj del Árbol del Tiempo", + "block.twilightforest.transformation_log_core": "Corazón del Árbol de Transformación", + "block.twilightforest.mining_log_core": "Núcleo del Árbol Minero", + "block.twilightforest.sorting_log_core": "Motor del Árbol de Clasificación", + "block.twilightforest.time_leaves": "Hojas del Árbol del Tiempo", + "block.twilightforest.transformation_leaves": "Hojas del Árbol de Transformación", + "block.twilightforest.mining_leaves": "Hojas del Árbol Minero", + "block.twilightforest.sorting_leaves": "Hojas del Árbol de Clasificación", + "block.twilightforest.tower_wood": "Tablones de la Torre de Madera", + "block.twilightforest.tower_wood_encased": "Madera Encapsulada de la Torre de Madera", + "block.twilightforest.tower_wood_cracked": "Madera Agrietada de la Torre de Madera", + "block.twilightforest.tower_wood_mossy": "Madera Musgosa de la Torre de Madera", + "block.twilightforest.tower_wood_infested": "Madera Infestada de la Torre de Madera", + "block.twilightforest.reappearing_block": "Bloque Reaparecedor", + "block.twilightforest.vanishing_block": "Bloque de Desaparición", + "block.twilightforest.locked_vanishing_block": "Bloque de Desaparición Bloqueado", + "block.twilightforest.carminite_builder": "Constructor de Carminita", + "block.twilightforest.antibuilder": "Anti-Construcción", + "block.twilightforest.ghast_trap": "Trampa de Ghast", + "block.twilightforest.carminite_reactor": "Reactor de Carminita", + "block.twilightforest.fake_gold": "Oro Falso", + "block.twilightforest.fake_diamond": "Diamante Falso", + "block.twilightforest.trophy": "Trofeo de Twilight Forest", + "block.twilightforest.stronghold_shield": "Escudo de la Fortaleza", + "block.twilightforest.trophy_pedestal": "Pedestal para Trofeos", + "block.twilightforest.aurora_block": "Bloque de Aurora", + "block.twilightforest.underbrick": "Subsuelo de Ladrillos", + "block.twilightforest.underbrick_mossy": "Subsuelo de Ladrillos Musgoso", + "block.twilightforest.underbrick_cracked": "Subsuelo de Ladrillos Agrietado", + "block.twilightforest.underbrick_floor": "Piso de Subsuelo de Ladrillos [NYI]", + "block.twilightforest.brown_thorns": "Espinas", + "block.twilightforest.green_thorns": "Espinas Verdes", + "block.twilightforest.burnt_thorns": "Espinas Quemadas", + "block.twilightforest.thorn_rose": "Rosa Espinosa", + "block.twilightforest.thorn_leaves": "Hojas de Espinas", + "block.twilightforest.beanstalk_leaves": "Hojas de Frijol", + "block.twilightforest.deadrock_weathered": "Roca Muerta Desgastada", + "block.twilightforest.deadrock_cracked": "Roca Muerta Agrietada", + "block.twilightforest.deadrock": "Roca Muerta", + "block.twilightforest.dark_leaves": "Hojas de Madera Oscura", + "block.twilightforest.auroralized_glass": "Vidrio Auroralizado [NYI]", + "block.twilightforest.aurora_pillar": "Pilar de Aurora", + "block.twilightforest.aurora_slab": "Losa de Aurora", + "block.twilightforest.trollsteinn": "Trollsteinn", + "block.twilightforest.wispy_cloud": "Nube de Agua", + "block.twilightforest.fluffy_cloud": "Nube Esponjosa", + "block.twilightforest.giant_cobblestone": "Piedra Labrada Gigante", + "block.twilightforest.giant_log": "Tronco Gigante", + "block.twilightforest.giant_leaves": "Hojas Gigantes", + "block.twilightforest.giant_obsidian": "Obsidiana Gigante", + "block.twilightforest.uberous_soil": "Tierra Uberous", + "block.twilightforest.huge_stalk": "Tallos Enormes", + "block.twilightforest.huge_mushgloom": "Enorme Hongo Brillante", + "block.twilightforest.huge_mushgloom_stem": "Enorme Tallo de Hongo Brillante", + "block.twilightforest.trollvidr": "Trollvidr", + "block.twilightforest.unripe_trollber": "Trollber Sin madurar", + "block.twilightforest.trollber": "Trollber", + "block.twilightforest.slider": "Trampa Deslizante [NYI]", + "block.twilightforest.knightmetal_block": "Bloque Hecho del Caballero de Metal", + "block.twilightforest.huge_lilypad": "Enorme Almohadilla de Lirio", + "block.twilightforest.huge_waterlily": "Enorme Lirio de Agua", + "block.twilightforest.castle_brick": "Ladrillos del Castillo", + "block.twilightforest.castle_brick_worn": "Ladrillos Desgastados del Castillo", + "block.twilightforest.castle_brick_cracked": "Ladrillos Agrietados del Castillo", + "block.twilightforest.castle_brick_roof": "Azulejo del Techo del Castillo", + "block.twilightforest.castle_brick_mossy": "Ladrillos Musgosos del Castillo", + "block.twilightforest.castle_brick_frame": "Ladrillos Gruesos del Castillo", + "block.twilightforest.castle_stairs_brick": "Escaleras de Ladrillo del Castillo", + "block.twilightforest.castle_stairs_worn": "Escaleras Desgastadas de Ladrillo del Castillo", + "block.twilightforest.castle_stairs_cracked": "Escaleras Agrietadas de Ladrillo del Castillo", + "block.twilightforest.castle_stairs_mossy": "Escaleras Musgosas de Ladrillo del Castillo", + "block.twilightforest.castle_door_yellow": "Puerta Amarilla del Castillo", + "block.twilightforest.castle_door_purple": "Puerta Violeta del Castillo", + "block.twilightforest.castle_door_pink": "Puerta Rosada del Castillo", + "block.twilightforest.castle_door_blue": "Puerta Azul del Castillo", + "block.twilightforest.castle_rune_brick_pink": "Ladrillo Rúnico Rosa del Castillo ", + "block.twilightforest.castle_rune_brick_blue": "Ladrillo Rúnico Azul del Castillo", + "block.twilightforest.castle_rune_brick_yellow": "Ladrillo Rúnico Amarillo del Castillo", + "block.twilightforest.castle_rune_brick_purple": "Ladrillo Rúnico Morado del Castillo", + "block.twilightforest.castle_pillar_encased": "Pilar Encapsulado de Ladrillo del Castillo ", + "block.twilightforest.castle_pillar_encased_tile": "Azulejo Encapsulado de Ladrillos del Castillo ", + "block.twilightforest.castle_pillar_bold": "Pilar Audaz de Ladrillos del Castillo", + "block.twilightforest.castle_pillar_bold_tile": "Azulejo Audaz de Ladrillo del Castillo ", + "block.twilightforest.castle_stairs_encased": "Escaleras Encapsuladas de Ladrillo del Castillo", + "block.twilightforest.castle_stairs_bold": "Escaleras Audaces de Ladrillo del Castillo", + "block.twilightforest.force_field_purple": "Campo de Fuerza Violeta", + "block.twilightforest.force_field_pink": "Campo de Fuerza Rosa", + "block.twilightforest.force_field_orange": "Campo de Fuerza Naranja", + "block.twilightforest.force_field_green": "Campo de Fuerza Verde", + "block.twilightforest.force_field_blue": "Campo de Fuerza Azul", + "block.twilightforest.ironwood_block": "Bloque de Madera de Hierro", + "block.twilightforest.fiery_block": "Bloque de Metal Ardiente", + "block.twilightforest.steeleaf_block": "Bloque de Hoja de Acero", + "block.twilightforest.arctic_fur_block": "Bloque de Pelaje Ártico", + "block.twilightforest.carminite_block": "Bloque de Carminita", + "block.twilightforest.cinder_furnace": "Horno de Ceniza [NYI]", + "block.twilightforest.cinder_log": "Tronco de Ceniza [NYI]", + "block.twilightforest.cinder_wood": "Madera de Ceniza [NYI]", + "block.twilightforest.twilight_portal_miniature_structure": "Portal Miniatura de Twilight [NYI]", + "block.twilightforest.naga_courtyard_miniature_structure": "Patio Naga Miniatura [NYI]", + "block.twilightforest.lich_tower_miniature_structure": "Torre del Lich Miniatura [NYI]", + "block.twilightforest.stone_twist": "Piedra Torcida [NYI]", + "block.twilightforest.stone_twist_thin": "Pilar de Piedra [NYI]", + "block.twilightforest.lapis_block": "Bloque de Lapislázuli [NYI]", + "block.twilightforest.etched_nagastone": "Piedra Naga Grabada", + "block.twilightforest.nagastone_pillar": "Pilar de Piedra Naga", + "block.twilightforest.nagastone_stairs_left": "Escaleras de Piedra Naga (Izquierda)", + "block.twilightforest.nagastone_stairs_right": "Escaleras de Piedra Naga (Derecha)", + "block.twilightforest.etched_nagastone_mossy": "Piedra Naga con Grabado Musgoso", + "block.twilightforest.nagastone_pillar_mossy": "Pilar de Piedra Naga Musgosa", + "block.twilightforest.nagastone_stairs_mossy_left": "Escaleras Musgosa de Piedra Naga (Izquierda)", + "block.twilightforest.nagastone_stairs_mossy_right": "Escaleras Musgosa de Piedra Naga (Derecha)", + "block.twilightforest.etched_nagastone_weathered": "Piedra Naga Grabada en Ruinas", + "block.twilightforest.nagastone_pillar_weathered": "Pilar de Piedra Naga en Ruinas", + "block.twilightforest.nagastone_stairs_weathered_left": "Escaleras de Piedra de Naga desgastadas (Izquierda)", + "block.twilightforest.nagastone_stairs_weathered_right": "Escaleras de Piedra de Naga desgastadas (Derecha)", + "block.twilightforest.iron_ladder": "Escalera de Hierro", + "block.twilightforest.terrorcotta_circle": "Terracota (Circular)", + "block.twilightforest.terrorcotta_diagonal": "Terracota (Diagonal)", + "block.twilightforest.experiment_115": "Experimento 115", + "block.twilightforest.hydra_trophy": "Trofeo de Hidra", + "block.twilightforest.naga_trophy": "Trofeo de Naga", + "block.twilightforest.minoshroom_trophy": "Trofeo de Minosetauro", + "block.twilightforest.knight_phantom_trophy": "Trofeo de Caballero Fantasma", + "block.twilightforest.lich_trophy": "Trofeo de Lich", + "block.twilightforest.ur_ghast_trophy": "Trofeo de Ur-Ghast", + "block.twilightforest.yeti_trophy": "Trofeo de Yeti Alfa", + "block.twilightforest.snow_queen_trophy": "Trofeo de Reina de las Nieves", + "block.twilightforest.quest_ram_trophy": "Trofeo del Carnero de la Búsqueda", + + "block.twilightforest.keepsake_casket": "Ataúd del recuerdo [WIP]", + "block.twilightforest.casket.broken": "Tu Ataúd está demasiado dañado para contener más objetos. Todos los artículos que se guardaron en tu ataúd se cayeron al suelo..", + "block.twilightforest.casket.locked": "¡Este Ataúd sólo puede ser abierto por %s!", + + "block.twilightforest.potted_twilight_oak_sapling": "Retoño del Árbol de Roble Crepuscular en Maceta", + "block.twilightforest.potted_canopy_sapling": "Retoño de Dosel Arbóreo en Maceta", + "block.twilightforest.potted_mangrove_sapling": "Retoño de Manglar Crepuscular en Maceta", + "block.twilightforest.potted_darkwood_sapling": "Retoño del Árbol de Madera Oscura en Maceta", + "block.twilightforest.potted_hollow_oak_sapling": "Retoño de Roble Robusto Crepuscular en Maceta", + "block.twilightforest.potted_rainboak_sapling": "Retoño del Árbol de Roble Arcoíris en Maceta", + "block.twilightforest.potted_time_sapling": "Retoño del Árbol del Tiempo en Maceta", + "block.twilightforest.potted_trans_sapling": "Retoño del Árbol de la Transformación en Maceta", + "block.twilightforest.potted_mine_sapling": "Retoño del Árbol Minero en Maceta", + "block.twilightforest.potted_sort_sapling": "Retoño del Árbol de la Clasificación en Maceta", + "block.twilightforest.potted_mayapple": "Mayapple en Maceta", + "block.twilightforest.potted_fiddlehead": "Brotes de Helecho en Maceta", + "block.twilightforest.potted_mushgloom": "Hongo Brillante en Maceta", + "block.twilightforest.potted_thorn": "Espinas en Maceta", + "block.twilightforest.potted_green_thorn": "Espinas Verdes en Maceta", + "block.twilightforest.potted_dead_thorn": "Espinas Quemadas en Maceta", + + "block.twilightforest.canopy_planks": "Tablones de Dosel Arbóreo", + "block.twilightforest.canopy_stairs": "Esquelaras de Dosel Arbóreo", + "block.twilightforest.canopy_slab": "Losa de Dosel Arbóreo", + "block.twilightforest.canopy_button": "Botón de Dosel Arbóreo", + "block.twilightforest.canopy_fence": "Valla de Dosel Arbóreo", + "block.twilightforest.canopy_gate": "Puerta de Dosel Arbóreo", + "block.twilightforest.canopy_plate": "Placa de Presión de Dosel Arbóreo", + "block.twilightforest.canopy_trapdoor": "Trampilla de Dosel Arbóreo", + "block.twilightforest.canopy_door": "Puerta de Dosel Arbóreo", + "block.twilightforest.canopy_sign": "Letrero de Dosel Arbóreo", + "block.twilightforest.canopy_wall_sign": "Cuadro de Dosel Arbóreo", + + "block.twilightforest.dark_planks": "Tablones de Madera Oscura", + "block.twilightforest.dark_stairs": "Esquelaras de Madera Oscura", + "block.twilightforest.dark_slab": "Losa de Madera Oscura", + "block.twilightforest.dark_button": "Botón de Madera Oscura", + "block.twilightforest.dark_fence": "Valla de Madera Oscura", + "block.twilightforest.dark_gate": "Puerta de Valla de Madera Oscura", + "block.twilightforest.dark_plate": "Placa de Presión de Madera Oscura", + "block.twilightforest.dark_trapdoor": "Trampilla de Madera Oscura", + "block.twilightforest.dark_door": "Puerta de Madera Oscura", + "block.twilightforest.darkwood_sign": "Letrero de Madera Oscura", + "block.twilightforest.darkwood_wall_sign": "Cuadro de Madera Oscura", + + "block.twilightforest.mangrove_planks": "Tablones de Manglar", + "block.twilightforest.mangrove_stairs": "Esquelaras de Manglar", + "block.twilightforest.mangrove_slab": "Losa de Manglar", + "block.twilightforest.mangrove_button": "Botón de Manglar", + "block.twilightforest.mangrove_fence": "Valla de Manglar", + "block.twilightforest.mangrove_gate": "Puerta de Valla de Manglar", + "block.twilightforest.mangrove_plate": "Placa de Presión de Manglar", + "block.twilightforest.mangrove_trapdoor": "Trampilla de Manglar", + "block.twilightforest.mangrove_door": "Puerta de Manglar", + "block.twilightforest.mangrove_sign": "Letrero de Manglar", + "block.twilightforest.mangrove_wall_sign": "Cuadro de Manglar", + + "block.twilightforest.twilight_oak_planks": "Tablones de Roble Crepuscular", + "block.twilightforest.twilight_oak_stairs": "Esquelaras de Roble Crepuscular", + "block.twilightforest.twilight_oak_slab": "Losa de Roble Crepuscular", + "block.twilightforest.twilight_oak_button": "Botón de Roble Crepuscular", + "block.twilightforest.twilight_oak_fence": "Valla de Roble Crepuscular", + "block.twilightforest.twilight_oak_gate": "Puerta de Valla de Roble Crepuscular", + "block.twilightforest.twilight_oak_plate": "Placa de Presión de Roble Crepuscular", + "block.twilightforest.twilight_oak_trapdoor": "Trampilla de Roble Crepuscular", + "block.twilightforest.twilight_oak_door": "Puerta de Roble Crepuscular", + "block.twilightforest.twilight_oak_sign": "Letrero de Roble Crepuscular", + "block.twilightforest.twilight_wall_sign": "Cuadro de Roble Crepuscular", + + "block.twilightforest.time_planks": "Tablones del Árbol del Tiempo", + "block.twilightforest.time_stairs": "Esquelaras del Árbol del Tiempo", + "block.twilightforest.time_slab": "Losa del Árbol del Tiempo", + "block.twilightforest.time_button": "Botón del Árbol del Tiempo", + "block.twilightforest.time_fence": "Valla del Árbol del Tiempo", + "block.twilightforest.time_gate": "Puerta de Valla del Árbol del Tiempo", + "block.twilightforest.time_plate": "Placa de Presión del Árbol del Tiempo", + "block.twilightforest.time_trapdoor": "Trampilla del Árbol del Tiempo", + "block.twilightforest.time_door": "Puerta del Árbol del Tiempo", + "block.twilightforest.time_sign": "Letrero del Árbol del Tiempo", + "block.twilightforest.time_wall_sign": "Cuadro del Árbol del Tiempo", + + "block.twilightforest.trans_planks": "Tablones del Árbol de Transformación", + "block.twilightforest.trans_stairs": "Esquelaras del Árbol de Transformación", + "block.twilightforest.trans_slab": "Losa del Árbol de Transformación", + "block.twilightforest.trans_button": "Botón del Árbol de Transformación", + "block.twilightforest.trans_fence": "Valla del Árbol de Transformación", + "block.twilightforest.trans_gate": "Puerta de Valla del Árbol de Transformación", + "block.twilightforest.trans_plate": "Placa de Presión del Árbol de Transformación", + "block.twilightforest.trans_trapdoor": "Trampilla del Árbol de Transformación", + "block.twilightforest.trans_door": "Puerta del Árbol de Transformación", + "block.twilightforest.trans_sign": "Letrero del Árbol de Transformación", + "block.twilightforest.trans_wall_sign": "Cuadro del Árbol de Transformación", + + "block.twilightforest.mine_planks": "Tablones del Árbol Minero", + "block.twilightforest.mine_stairs": "Esquelaras del Árbol Minero", + "block.twilightforest.mine_slab": "Losa del Árbol Minero", + "block.twilightforest.mine_button": "Botón del Árbol Minero", + "block.twilightforest.mine_fence": "Valla del Árbol Minero", + "block.twilightforest.mine_gate": "Puerta de Valla del Árbol Minero", + "block.twilightforest.mine_plate": "Placa de Presión del Árbol Minero", + "block.twilightforest.mine_trapdoor": "Trampilla del Árbol Minero", + "block.twilightforest.mine_door": "Puerta del Árbol Minero", + "block.twilightforest.mine_sign": "Letrero del Árbol Minero", + "block.twilightforest.mine_wall_sign": "Cuadro del Árbol Minero", + + "block.twilightforest.sort_planks": "Tablones del Árbol de Clasificación", + "block.twilightforest.sort_stairs": "Esquelaras del Árbol de Clasificación", + "block.twilightforest.sort_slab": "Losa del Árbol de Clasificación", + "block.twilightforest.sort_button": "Botón del Árbol de Clasificación", + "block.twilightforest.sort_fence": "Valla del Árbol de Clasificación", + "block.twilightforest.sort_gate": "Puerta de Valla del Árbol de Clasificación", + "block.twilightforest.sort_plate": "Placa de Presión del Árbol de Clasificación", + "block.twilightforest.sort_trapdoor": "Trampilla del Árbol de Clasificación", + "block.twilightforest.sort_door": "Puerta del Árbol de Clasificación", + "block.twilightforest.sort_sign": "Letrero del Árbol de Clasificación", + "block.twilightforest.sort_wall_sign": "Cuadro del Árbol de Clasificación", + + "block.steeleaf.tooltip": "Reduce el daño por caída en un 25%.", + "block.arctic.tooltip": "Reduce el daño por caída en un 90%", + "block.knightmetal.tooltip": "Funciona como un cactus más fuerte", + + // Structures + "structure.twilight_portal": "Portal de Twilight", + "structure.hedge_maze": "Laberinto de Setos", + "structure.hollow_hill": "Colina Hueca", + "structure.quest_grove": "Búsqueda de la Arboleda", + "structure.mushroom_tower": "Castillo de los Hongos", + "structure.naga_courtyard": "Patio Naga", + "structure.lich_tower": "Torre del Lich", + "structure.minotaur_labyrinth": "Laberinto del Minotauro", + "structure.hydra_lair": "Guarida de la Hidra", + "structure.goblin_stronghold": "Fortaleza de los Goblins", + "structure.dark_tower": "La Torre Oscura", + "structure.yeti_cave": "Cueva del Yeti", + "structure.aurora_palace": "Palacio Aurora", + "structure.troll_cave_and_cloud_castle": "Cueva de los Trolls y Casa en las Nubes", + "structure.final_castle": "Castillo Final", + + // Items + "item.twilightforest.boarkchop": "Chuleta de Boark", + "item.twilightforest.naga_scale": "Escama Naga", + "item.twilightforest.naga_chestplate": "Tunica de Escama Naga", + "item.twilightforest.naga_leggings": "Mallas de Escama Naga", + "item.twilightforest.twilight_scepter": "Cetro Crepuscular", + "item.twilightforest.lifedrain_scepter": "Cetro de Robo de Vida", + "item.twilightforest.zombie_scepter": "Cetro Zombie", + "item.twilightforest.shield_scepter": "Cetro de Fortificación", + "item.twilightforest.ore_meter": "Medidor de Minerales [NYI]", + "item.twilightforest.magic_map": "Mapa Mágico", + "item.twilightforest.maze_map": "Mapa del Laberinto", + "item.twilightforest.ore_map": "Mapa de Laberinto/Mineral", + "item.twilightforest.raven_feather": "Pluma de Cuervo", + "item.twilightforest.magic_map_focus": "Enfoque del Mapa Mágico", + "item.twilightforest.maze_map_focus": "Enfoque del Mapa del Laberinto", + "item.twilightforest.liveroot": "Raíces Vivas", + "item.twilightforest.ironwood_raw": "Materiales de Madera de Hierro en Bruto", + "item.twilightforest.ironwood_ingot": "Lingote de Madera de Hierro", + "item.twilightforest.ironwood_helmet": "Casco de Madera de Hierro", + "item.twilightforest.ironwood_chestplate": "Pechera de Madera de Hierro", + "item.twilightforest.ironwood_leggings": "Pantalones de Madera de Hierro", + "item.twilightforest.ironwood_boots": "Botas de Madera de Hierro", + "item.twilightforest.ironwood_sword": "Espada de Madera de Hierro", + "item.twilightforest.ironwood_shovel": "Pala de Madera de Hierro", + "item.twilightforest.ironwood_pickaxe": "Pico de Madera de Hierro", + "item.twilightforest.ironwood_axe": "Hacha de Madera de Hierro", + "item.twilightforest.ironwood_hoe": "Azada de Madera de Hierro", + "item.twilightforest.torchberries": "Bayas de Antorcha", + "item.twilightforest.raw_venison": "Venado Crudo", + "item.twilightforest.cooked_venison": "Filete de Venado", + "item.twilightforest.hydra_chop": "Chuleta de Hidra", + "item.twilightforest.fiery_blood": "Sangre Ardiente", + "item.twilightforest.fiery_ingot": "Lingote Ardiente", + "item.twilightforest.fiery_helmet": "Casco Ardiente", + "item.twilightforest.fiery_chestplate": "Pechera Ardiente", + "item.twilightforest.fiery_leggings": "Pantalones Ardientes", + "item.twilightforest.fiery_boots": "Botas Ardientes", + "item.twilightforest.fiery_sword": "Espada Ardiente", + "item.twilightforest.fiery_pickaxe": "Pico Ardiente", + "item.twilightforest.steeleaf_ingot": "Hoja de Acero", + "item.twilightforest.steeleaf_helmet": "Casco de Hoja de Acero", + "item.twilightforest.steeleaf_chestplate": "Pechera de Hoja de Acero", + "item.twilightforest.steeleaf_leggings": "Pantalones de de Hoja de Acero", + "item.twilightforest.steeleaf_boots": "Botas de Hoja de Acero", + "item.twilightforest.steeleaf_sword": "Espeda de Hoja de Acero", + "item.twilightforest.steeleaf_shovel": "Pala de Hoja de Acero", + "item.twilightforest.steeleaf_pickaxe": "Pico de Hoja de Acero", + "item.twilightforest.steeleaf_axe": "Hacha de Hoja de Acero", + "item.twilightforest.steeleaf_hoe": "Azada de Hoja de Acero", + "item.twilightforest.minotaur_axe": "Hacha de Diamante del Minotauro", + "item.twilightforest.minotaur_axe_gold": "Hacha de Oro del Minotauro", + "item.twilightforest.mazebreaker_pickaxe": "Rompe Laberintos", + "item.twilightforest.transformation_powder": "Polvo de Transformación", + "item.twilightforest.raw_meef": "Carne Cruda", + "item.twilightforest.cooked_meef": "Bistec de Carne", + "item.twilightforest.meef_stroganoff": "Carne Stroganoff", + "item.twilightforest.maze_wafer": "Oblea de Laberinto", + "item.twilightforest.magic_map_empty": "Mapa Mágico en Blanco", + "item.twilightforest.maze_map_empty": "Mapa del Laberinto en Blanco", + "item.twilightforest.ore_map_empty": "Mapa de Laberinto/Minerales en Blanco", + "item.twilightforest.ore_magnet": "Imán de Minerales", + "item.twilightforest.crumble_horn": "Cuerno Desmenuzado", + "item.twilightforest.peacock_fan": "Abanico de Plumas de Pavo Real", + "item.twilightforest.moonworm_queen": "Reina Gusano Lunar", + "item.twilightforest.charm_of_life_1": "Talisman de Vida I", + "item.twilightforest.charm_of_life_2": "Talisman de Vida II", + "item.twilightforest.charm_of_keeping_1": "Talisman de conservación I", + "item.twilightforest.charm_of_keeping_2": "Talisman de conservación II", + "item.twilightforest.charm_of_keeping_3": "Talisman de conservación III", + "item.twilightforest.tower_key": "Llave de la Torre", + "item.twilightforest.borer_essence": "Esencia de Barrenador", + "item.twilightforest.carminite": "Carminita", + "item.twilightforest.tf_trophy": "%s Trofeo", + "item.twilightforest.armor_shard": "Fragmento de Armadura", + "item.twilightforest.knightmetal_ingot": "Lingote Hecho del Caballero de Metal", + "item.twilightforest.armor_shard_cluster": "Grupo de Fragmentos de Armadura", + "item.twilightforest.knightmetal_helmet": "Yelmo del Caballero de Metal", + "item.twilightforest.knightmetal_chestplate": "Pechera del Caballero de Metal", + "item.twilightforest.knightmetal_leggings": "Grebas del Caballero de Metal", + "item.twilightforest.knightmetal_boots": "Botas del Caballero de Metal", + "item.twilightforest.knightmetal_sword": "Espada del Caballero de Metal", + "item.twilightforest.knightmetal_pickaxe": "Pico del Caballero de Metal", + "item.twilightforest.knightmetal_axe": "Hacha del Caballero de Metal", + "item.twilightforest.knightmetal_shield": "Escudo del Caballero de Metal", + "item.twilightforest.phantom_helmet": "Casco de Fantasma", + "item.twilightforest.phantom_chestplate": "Pechera de Fantasma", + "item.twilightforest.lamp_of_cinders": "Lámpara de Cenizas", + "item.twilightforest.fiery_tears": "Lágrimas de Fuego", + "item.twilightforest.ice_bomb": "Bomba de Hielo", + "item.twilightforest.yeti_helmet": "Casco con Cuernos del Yeti", + "item.twilightforest.yeti_chestplate": "Chaqueta del Yeti", + "item.twilightforest.yeti_leggings": "Pantalones del Yeti", + "item.twilightforest.yeti_boots": "Botas del Yeti", + "item.twilightforest.alpha_fur": "Pelaje de Yeti Alfa", + "item.twilightforest.arctic_fur": "Pelaje del Ártico", + "item.twilightforest.arctic_helmet": "Capucha del Ártico", + "item.twilightforest.arctic_chestplate": "Chaqueta Ártica", + "item.twilightforest.arctic_leggings": "Pantalones del Ártico", + "item.twilightforest.arctic_boots": "Botas del Ártico", + "item.twilightforest.magic_beans": "Frijoles Mágicos", + "item.twilightforest.giant_pickaxe": "Pico del Gigante", + "item.twilightforest.giant_sword": "Espada del Gigante", + "item.twilightforest.triple_bow": "Arco triple", + "item.twilightforest.seeker_bow": "Arco Buscador", + "item.twilightforest.ice_bow": "Arco de hielo", + "item.twilightforest.ender_bow": "Arco de Ender", + "item.twilightforest.ice_sword": "Espada de Hielo", + "item.twilightforest.glass_sword": "Espada de Vidrio", + "item.twilightforest.knightmetal_ring": "Lazo de Caballero de Metal", + "item.twilightforest.block_and_chain": "Bloque y Cadena", + "item.twilightforest.cube_talisman": "Talismán del Cubo [NYI]", + "item.twilightforest.cube_of_annihilation": "Cubo de la Aniquilación [WIP]", + "item.twilightforest.moon_dial": "Dial lunar", + + "item.twilightforest.wild_boar_spawn_egg": "Generar Jabalí", + "item.twilightforest.bighorn_sheep_spawn_egg": "Generar de Oveja Cimarrón", + "item.twilightforest.deer_spawn_egg": "Generar Ciervo Salvaje", + "item.twilightforest.redcap_spawn_egg": "Generar Goblin del Gorro Rojo", + "item.twilightforest.swarm_spider_spawn_egg": "Generar Araña de Enjambre", + "item.twilightforest.naga_spawn_egg": "Generar Naga", + "item.twilightforest.skeleton_druid_spawn_egg": "Generar Druida Esqueleto", + "item.twilightforest.hostile_wolf_spawn_egg": "Generar Lobo Hostil", + "item.twilightforest.wraith_spawn_egg": "Generar Espectro Crepuscular", + "item.twilightforest.hedge_spider_spawn_egg": "Generar Araña del Seto", + "item.twilightforest.hydra_spawn_egg": "Generar Hidra", + "item.twilightforest.lich_spawn_egg": "Generar Twilight Lich ", + "item.twilightforest.penguin_spawn_egg": "Generar Pingüino", + "item.twilightforest.tiny_bird_spawn_egg": "Generar Pájaro Pequeño", + "item.twilightforest.squirrel_spawn_egg": "Generar Ardilla de Bosque", + "item.twilightforest.bunny_spawn_egg": "Generar Conejo del Bosque", + "item.twilightforest.raven_spawn_egg": "Generar Cuervo del Bosque", + "item.twilightforest.quest_ram_spawn_egg": "Generar Carnero de la Búsqueda", + "item.twilightforest.kobold_spawn_egg": "Generar Kobold", + "item.twilightforest.mosquito_swarm_spawn_egg": "Generar Enjambre de Mosquitos", + "item.twilightforest.death_tome_spawn_egg": "Generar Tomo de la Muerte", + "item.twilightforest.minotaur_spawn_egg": "Generar Minotauro", + "item.twilightforest.minoshroom_spawn_egg": "Generar Minosetauro", + "item.twilightforest.fire_beetle_spawn_egg": "Generar Escarabajo de Fuego", + "item.twilightforest.slime_beetle_spawn_egg": "Generar Escarabajo de Slime", + "item.twilightforest.pinch_beetle_spawn_egg": "Generar Escarabajo de Pinzas", + "item.twilightforest.maze_slime_spawn_egg": "Generar Slime de Laberinto", + "item.twilightforest.redcap_sapper_spawn_egg": "Generar Zapador de Gorro Rojo", + "item.twilightforest.mist_wolf_spawn_egg": "Generar Lobo de la Niebla", + "item.twilightforest.king_spider_spawn_egg": "Generar Rey Araña", + "item.twilightforest.mini_ghast_spawn_egg": "Generar Mini Ghast de Carminita", + "item.twilightforest.tower_ghast_spawn_egg": "Generar Guardia Ghast de Carminita", + "item.twilightforest.tower_golem_spawn_egg": "Generar Golem de Carminita", + "item.twilightforest.tower_termite_spawn_egg": "Generar Barrenador de la Torre de Madera", + "item.twilightforest.tower_broodling_spawn_egg": "Generar Araña Carminita", + "item.twilightforest.ur_ghast_spawn_egg": "Generar Ur-Ghast", + "item.twilightforest.blockchain_goblin_spawn_egg": "Generar Goblin de Bloques y Cadenas", + "item.twilightforest.goblin_knight_lower_spawn_egg": "Generar Caballero Goblin", + "item.twilightforest.helmet_crab_spawn_egg": "Generar Cangrejo con Casco", + "item.twilightforest.knight_phantom_spawn_egg": "Generar Caballero Fantasma", + "item.twilightforest.yeti_spawn_egg": "Generar Yeti", + "item.twilightforest.yeti_alpha_spawn_egg": "Generar Yeti Alfa", + "item.twilightforest.winter_wolf_spawn_egg": "Generar Lobo de Invierno", + "item.twilightforest.snow_guardian_spawn_egg": "Generar Guardián de Nieve", + "item.twilightforest.stable_ice_core_spawn_egg": "Generar Núcleo de Hielo Estable", + "item.twilightforest.unstable_ice_core_spawn_egg": "Generar Núcleo de Hielo Inestable", + "item.twilightforest.snow_queen_spawn_egg": "Generar Reina de las Nieves", + "item.twilightforest.troll_spawn_egg": "Generar Troll de las Cavernas", + "item.twilightforest.giant_miner_spawn_egg": "Generar Minero Gigante", + "item.twilightforest.armored_giant_spawn_egg": "Generar Gigante Armado", + "item.twilightforest.ice_crystal_spawn_egg": "Generar Cristal de Hielo", + "item.twilightforest.harbinger_cube_spawn_egg": "Generar Cubo de los Presagios [NYI]", + "item.twilightforest.adherent_spawn_egg": "Generar Adepto [NYI]", + "item.twilightforest.roving_cube_spawn_egg": "Generar Cubo Giratorio [NYI]", + + "item.twilightforest.guide": "Cuaderno de Bitácora del Viajero [WIP]", + + "item.twilightforest.minotaur_axe.tooltip": "Daño Extra Durante la Carga", + "item.twilightforest.minotaur_axe_gold.tooltip": "Daño Extra Durante la Carga", + "item.twilightforest.knightmetal_sword.tooltip": "Daño Extra a Objetivos Blindados", + "item.twilightforest.knightmetal_pickaxe.tooltip": "Daño Extra a Objetivos Blindados", + "item.twilightforest.knightmetal_axe.tooltip": "Daño Extra a Objetivos No Blindados", + "item.twilightforest.giant_pickaxe.tooltip": "Rompe bloques gigantes", + "item.twilightforest.fiery_pickaxe.tooltip": "Autofundición", + "item.twilightforest.fiery_sword.tooltip": "Quema al objetivo ", + "item.twilightforest.fiery_helmet.tooltip": "Quema a los atacante", + "item.twilightforest.fiery_chestplate.tooltip": "Quema a los atacante", + "item.twilightforest.fiery_leggings.tooltip": "Quema a los atacante", + "item.twilightforest.fiery_boots.tooltip": "Quema a los atacante", + "item.twilightforest.phantom_helmet.tooltip": "Nunca lo pierdes aunque mueras ", + "item.twilightforest.phantom_chestplate.tooltip": "Nunca lo pierdes aunque mueras ", + "item.twilightforest.yeti_helmet.tooltip": "Enfría a los atacantes", + "item.twilightforest.yeti_chestplate.tooltip": "Enfría a los atacantes", + "item.twilightforest.yeti_leggings.tooltip": "Enfría a los atacantes", + "item.twilightforest.yeti_boots.tooltip": "Enfría a los atacantes", + + "item.twilightforest.arctic_armor.tooltip": "Teñible como la armadura de cuero", + + // Entities + "entity.twilightforest.wild_boar": "Jabalí", + "entity.twilightforest.bighorn_sheep": "Oveja Cimarrón", + "entity.twilightforest.deer": "Ciervo salvaje", + "entity.twilightforest.redcap": "Goblin del Gorro Rojo", + "entity.twilightforest.swarm_spider": "Araña de Enjambre", + "entity.twilightforest.naga": "Naga", + "entity.twilightforest.naga_segment": "Segmento Naga", + "entity.twilightforest.skeleton_druid": "Druida Esqueleto", + "entity.twilightforest.hostile_wolf": "Lobo hostil", + "entity.twilightforest.wraith": "Espectro Crepuscular", + "entity.twilightforest.hedge_spider": "Araña del Seto", + "entity.twilightforest.hydra": "Hidra", + "entity.twilightforest.hydra_head": "Cabeza de Hidra", + "entity.twilightforest.lich": "Twilight Lich", + "entity.twilightforest.penguin": "Pingüino", + "entity.twilightforest.tiny_bird": "Pájaro Pequeño", + "entity.twilightforest.squirrel": "Ardilla del Bosque", + "entity.twilightforest.bunny": "Conejo Enano", + "entity.twilightforest.raven": "Cuervo del Bosque", + "entity.twilightforest.quest_ram": "Carnero de la Búsqueda", + "entity.twilightforest.kobold": "Kobold", + "entity.twilightforest.boggard": "Boggard [NYI]", + "entity.twilightforest.lich_minion": "Lich Minion", + "entity.twilightforest.loyal_zombie": "Zombi Leal", + "entity.twilightforest.mosquito_swarm": "Enjambre de Mosquitos", + "entity.twilightforest.death_tome": "Tomo de la Muerte", + "entity.twilightforest.minotaur": "Minotauro", + "entity.twilightforest.minoshroom": "Minosetauro", + "entity.twilightforest.fire_beetle": "Escarabajo de Fuego", + "entity.twilightforest.slime_beetle": "Escarabajo de Slime", + "entity.twilightforest.pinch_beetle": "Escarabajo de Pinzas", + "entity.twilightforest.maze_slime": "Slime de Laberinto", + "entity.twilightforest.redcap_sapper": "Zapador de Gorro Rojo", + "entity.twilightforest.mist_wolf": "Lobo de la Niebla", + "entity.twilightforest.king_spider": "Rey Araña", + "entity.twilightforest.firefly": "Luciérnaga", + "entity.twilightforest.mini_ghast": "Mini Ghast de Carminita", + "entity.twilightforest.tower_ghast": "Guardia Ghast de Carminita", + "entity.twilightforest.tower_golem": "Golem de Carminita", + "entity.twilightforest.tower_termite": "Barrenador de la Madera de la Torre", + "entity.twilightforest.tower_broodling": "Araña Carminita", + "entity.twilightforest.ur_ghast": "Ur-Ghast", + "entity.twilightforest.blockchain_goblin": "Generar Goblin de Bloques y Cadenas", + "entity.twilightforest.goblin_knight_upper": "Caballero Goblin Superior", + "entity.twilightforest.goblin_knight_lower": "Caballero Goblin Inferior", + "entity.twilightforest.helmet_crab": "Cangrejo con Casco", + "entity.twilightforest.knight_phantom": "Caballero Fantasma", + "entity.twilightforest.yeti": "Yeti", + "entity.twilightforest.yeti_alpha": "Yeti Alfa", + "entity.twilightforest.winter_wolf": "Lobo de Invierno", + "entity.twilightforest.snow_guardian": "Guardián de Nieve", + "entity.twilightforest.stable_ice_core": "Núcleo de Hielo Estable", + "entity.twilightforest.unstable_ice_core": "Núcleo de Hielo Inestable", + "entity.twilightforest.snow_queen": "Reina de las Nieves", + "entity.twilightforest.troll": "Troll de las Cavernas", + "entity.twilightforest.giant_miner": "Minero Gigante", + "entity.twilightforest.armored_giant": "Gigante Armado", + "entity.twilightforest.ice_crystal": "Cristal de Hielo", + "entity.twilightforest.rising_zombie": "Zombie", + "entity.twilightforest.harbinger_cube": "Cubo de los Presagios [NYI]", + "entity.twilightforest.adherent": "Adepto [NYI]", + "entity.twilightforest.castle_guardian": "Guardián del Castillo [NYI]", + "entity.twilightforest.roving_cube": "Cubo Giratorio [NYI]", + + "entity.twilightforest.ice_snowball": "Bola de Nieve de Hielo", + "entity.twilightforest.ice_arrow": "Flecha de Hielo", + "entity.twilightforest.seeker_arrow": "Flecha Buscadora", + "entity.twilightforest.cicada_shot": "Cigarra", + "entity.twilightforest.moonworm_shot": "Gusano Lunar", + "entity.twilightforest.nature_bolt": "Perno de la Naturaleza", + "entity.twilightforest.slime_blob": "Gota de Slime", + "entity.twilightforest.tome_bolt": " Perno del Tomo de la Muerte", + "entity.twilightforest.wand_bolt": "Perno de Cetro Crepuscular", + "entity.twilightforest.lich_bolt": "Perno del Lich", + "entity.twilightforest.lich_bomb": "Perno Explosivo del Lich", + "entity.twilightforest.hydra_mortar": "Mortero Hidra", + "entity.twilightforest.falling_ice": "Caída de hielo", + "entity.twilightforest.chain_block": "Bloque y Cadena", + "entity.twilightforest.thrown_wep": "Arma Arrojadiza", + "entity.twilightforest.charm_effect": "Efecto de Talisman", + "entity.twilightforest.cube_of_annihilation": "Cubo de la Aniquilación", + "entity.twilightforest.slider": "Trampa Deslizante en Movimiento", + "entity.twilightforest.protection_box": "Caja de Protección de la Progresión", + + // Subtitles + "subtitles.twilightforest.entity.alphayeti.alert": "Yeti Alfa se dirige al jugador", + "subtitles.twilightforest.entity.alphayeti.death": "Yeti Alfa muerto", + "subtitles.twilightforest.entity.alphayeti.grab": "Yeti Alfa agarra al jugador", + "subtitles.twilightforest.entity.alphayeti.growl": "Yeti Alfa gruñe", + "subtitles.twilightforest.entity.alphayeti.hurt": "Yeti Alfa herido", + "subtitles.twilightforest.entity.alphayeti.ice": "Yeti Alfa lanza hielo", + "subtitles.twilightforest.entity.alphayeti.pant": "Pantalones del Yeti Alfa ", + "subtitles.twilightforest.entity.alphayeti.roar": "Yeti Alfa ruge", + "subtitles.twilightforest.entity.alphayeti.throw": "Yeti Alfa tira con fuerza", + "subtitles.twilightforest.entity.bighorn.ambient": "Balido de Oveja Cimarrón", + "subtitles.twilightforest.entity.bighorn.death": "Oveja Cimarrón muerta", + "subtitles.twilightforest.entity.bighorn.hurt": "Oveja Cimarrón herida", + "subtitles.twilightforest.entity.blockchain.ambient": "Goblin de Bloques y Cadenas se ríe", + "subtitles.twilightforest.entity.blockchain.death": "Goblin de Bloques y Cadenas muerto", + "subtitles.twilightforest.entity.blockchain.hurt": "Goblin de Bloques y Cadenas grita", + "subtitles.twilightforest.entity.boar.ambient": "Gruñido de Jabalí", + "subtitles.twilightforest.entity.boar.death": "Jabalí muerto", + "subtitles.twilightforest.entity.boar.hurt": "Jabalí herido", + "subtitles.twilightforest.entity.broodling.ambient": "Siseo de Araña Carminita", + "subtitles.twilightforest.entity.broodling.death": "Araña Carminita muerta", + "subtitles.twilightforest.entity.broodling.hurt": "Araña Carminita herida", + "subtitles.twilightforest.entity.carminitegolem.attack": "Golem de Carminita ataca", + "subtitles.twilightforest.entity.carminitegolem.death": "Golem de Carminita muerto", + "subtitles.twilightforest.entity.carminitegolem.hurt": "Golem de Carminita herido", + "subtitles.twilightforest.entity.cicada": "Canto de Cigarra", + "subtitles.twilightforest.entity.deer.death": "Ciervo salvaje muerto", + "subtitles.twilightforest.entity.deer.hurt": "Ciervo salvaje herido", + "subtitles.twilightforest.entity.deer.idle": "Ciervo salvaje mugido", + "subtitles.twilightforest.entity.druid.ambient": "Cascabeles del Druida Esqueleto", + "subtitles.twilightforest.entity.druid.death": "Druida Esqueleto muerto", + "subtitles.twilightforest.entity.druid.hurt": "Druida Esqueleto herido", + "subtitles.twilightforest.entity.druid.shoot": "Druida Esqueleto dispara", + "subtitles.twilightforest.entity.firebeetle.ambient": "Siseo de Escarabajo de Fuego", + "subtitles.twilightforest.entity.firebeetle.death": "Escarabajo de Fuego muerto", + "subtitles.twilightforest.entity.firebeetle.hurt": "Escarabajo de Fuego herido", + "subtitles.twilightforest.entity.firebeetle.shoot": "Escarabajo de Fuego dispara", + "subtitles.twilightforest.entity.ghastguard.ambient": "Llanto de Guardia Ghast", + "subtitles.twilightforest.entity.ghastguard.death": "Guardia Ghast muerto", + "subtitles.twilightforest.entity.ghastguard.hurt": "Guardia Ghast herido", + "subtitles.twilightforest.entity.ghastling.ambient": "Llanto de Mini Ghast", + "subtitles.twilightforest.entity.ghastling.death": "Mini Ghast muerto", + "subtitles.twilightforest.entity.ghastling.hurt": "Mini Ghast herido", + "subtitles.twilightforest.entity.goblinknight.ambient": "Risas de Caballero Goblin", + "subtitles.twilightforest.entity.goblinknight.death": "Caballero Goblin gime de agonía", + "subtitles.twilightforest.entity.goblinknight.hurt": "Caballero Goblin chilla de dolor", + "subtitles.twilightforest.entity.goblinknight.muffled.ambient": "Caballero Goblin sofocada rie", + "subtitles.twilightforest.entity.goblinknight.muffled.death": "Caballero Goblin sofocado gime de agonía", + "subtitles.twilightforest.entity.goblinknight.muffled.hurt": "Caballero Goblin sofocado chilla de dolor", + "subtitles.twilightforest.entity.hedgespider.ambient": "Siseo de Araña del Seto", + "subtitles.twilightforest.entity.hedgespider.death": "Araña del Seto muerta", + "subtitles.twilightforest.entity.hedgespider.hurt": "Araña del Seto herida", + "subtitles.twilightforest.entity.helmetcrab.death": "Cangrejo con Casco muerto", + "subtitles.twilightforest.entity.helmetcrab.hurt": "Cangrejo con Casco herido", + "subtitles.twilightforest.entity.hostilewolf.death": "Lobo hostil muerto", + "subtitles.twilightforest.entity.hostilewolf.hurt": "Lobo hostil herido", + "subtitles.twilightforest.entity.hostilewolf.idle": "Lobo hostil gruñe", + "subtitles.twilightforest.entity.hostilewolf.target": "Lobo hostil apunta a la víctima", + "subtitles.twilightforest.entity.hydra.death": "Hidra muerto", + "subtitles.twilightforest.entity.hydra.growl": "Hidra gruñe", + "subtitles.twilightforest.entity.hydra.hurt": "Hidra herido", + "subtitles.twilightforest.entity.hydra.roar": "Hidra ruge", + "subtitles.twilightforest.entity.hydra.shoot": "Hidra lanza fuego", + "subtitles.twilightforest.entity.hydra.warn": "Hidra se prepara para morder", + "subtitles.twilightforest.entity.ice.death": "Núcleo de hielo muerto", + "subtitles.twilightforest.entity.ice.hurt": "Núcleo de hielo herido", + "subtitles.twilightforest.entity.ice.noise": "Crujidos del Núcleo de hielo", + "subtitles.twilightforest.entity.ice.shoot": "Núcleo de hielo dispara una bola de nieve", + "subtitles.twilightforest.entity.iceguardian.ambient": "Crujidos del Guardián de la nieve", + "subtitles.twilightforest.entity.iceguardian.death": "Guardián de la nieve muerto", + "subtitles.twilightforest.entity.iceguardian.hurt": "Guardián de la nieve herido", + "subtitles.twilightforest.entity.kingspider.ambient": "Siseo de Rey Araña", + "subtitles.twilightforest.entity.kingspider.death": "Rey Araña muerto", + "subtitles.twilightforest.entity.kingspider.hurt": "Rey Araña herido", + "subtitles.twilightforest.entity.kobold.ambient": "Gruñidos de Kobold", + "subtitles.twilightforest.entity.kobold.death": "Kobold muerto", + "subtitles.twilightforest.entity.kobold.hurt": "Kobold herido", + "subtitles.twilightforest.entity.lich.ambient": "Lich respira", + "subtitles.twilightforest.entity.lich.death": "Lich muerto", + "subtitles.twilightforest.entity.lich.hurt": "Lich herido", + "subtitles.twilightforest.entity.lich.shoot": "Lich dispara", + "subtitles.twilightforest.entity.lich.teleport": "Lich se teletransporta", + "subtitles.twilightforest.entity.lichclone.hurt": "Clon Lich se evapora", + "subtitles.twilightforest.entity.loyalzombie.ambient": "Zombi leal gruñidos", + "subtitles.twilightforest.entity.loyalzombie.death": "Zombi leal muerto", + "subtitles.twilightforest.entity.loyalzombie.hurt": "Zombi leal herido", + "subtitles.twilightforest.entity.mazeslime.death": "Slime de Laberinto muerto", + "subtitles.twilightforest.entity.mazeslime.hurt": "Slime de Laberinto herido", + "subtitles.twilightforest.entity.mazeslime.squish": "Slime de Laberinto saltando", + "subtitles.twilightforest.entity.minion.ambient": "Lich Minion gruñidos", + "subtitles.twilightforest.entity.minion.death": "Lich Minion muerto", + "subtitles.twilightforest.entity.minion.hurt": "Lich Minion herido", + "subtitles.twilightforest.entity.minion.summon": "Lich invoca a un nuevo Minion", + "subtitles.twilightforest.entity.minoshroom.ambient": "Mugido de Minosetauro", + "subtitles.twilightforest.entity.minoshroom.attack": "Carga de Minosetauro", + "subtitles.twilightforest.entity.minoshroom.death": "Minosetauro muerto", + "subtitles.twilightforest.entity.minoshroom.hurt": "Minosetauro herido", + "subtitles.twilightforest.entity.minotaur.ambient": "Mugido de Minotauro", + "subtitles.twilightforest.entity.minotaur.attack": "Carga de Minotauro", + "subtitles.twilightforest.entity.minotaur.death": "Minotauro muerto", + "subtitles.twilightforest.entity.minotaur.hurt": "Minotauro herido", + "subtitles.twilightforest.entity.mistwolf.death": "Lobo de la Niebla muerto", + "subtitles.twilightforest.entity.mistwolf.hurt": "Lobo de la Niebla herido", + "subtitles.twilightforest.entity.mistwolf.idle": "Lobo de la Niebla gruñe", + "subtitles.twilightforest.entity.mistwolf.target": "Lobo de la Niebla apunta a la víctima", + "subtitles.twilightforest.entity.mosquito.ambient": "Zumbido de Mosquitos", + "subtitles.twilightforest.entity.naga.hiss": "Siseo de Naga", + "subtitles.twilightforest.entity.naga.hurt": "Naga herido", + "subtitles.twilightforest.entity.naga.rattle": "Naga cascabeles", + "subtitles.twilightforest.entity.kphantom.axe": "Caballero Fantasma lanza el hacha", + "subtitles.twilightforest.entity.kphantom.ambient": "Caballero Fantasma jadeos", + "subtitles.twilightforest.entity.kphantom.death": "Caballero Fantasma muerto", + "subtitles.twilightforest.entity.kphantom.hurt": "Caballero Fantasma herido", + "subtitles.twilightforest.entity.kphantom.pick": "Caballero Fantasma lanza el pico", + "subtitles.twilightforest.entity.pinchbeetle.death": "Escarabajo de pinzas muerto", + "subtitles.twilightforest.entity.pinchbeetle.hurt": "Escarabajo de pinzas herido", + "subtitles.twilightforest.entity.quest.ambient": "Balido del Carnero de la Búsqueda", + "subtitles.twilightforest.entity.quest.death": "Carnero de la Búsqueda muerto", + "subtitles.twilightforest.entity.quest.hurt": "Carnero de la Búsqueda herido", + "subtitles.twilightforest.entity.raven.caw": "Canto de Cuervo", + "subtitles.twilightforest.entity.raven.squawk": "Graznido de Cuervo", + "subtitles.twilightforest.entity.redcap.ambient": "Risas de Gorro rojo", + "subtitles.twilightforest.entity.redcap.death": "Gorro rojo gime en agonía", + "subtitles.twilightforest.entity.redcap.hurt": "Gorro rojo chilla de dolor", + "subtitles.twilightforest.entity.shield.add": "Aparece un nuevo escudo", + "subtitles.twilightforest.entity.shield.break": "Rotura del escudo", + "subtitles.twilightforest.entity.slimebeetle.death": "Escarabajo de Slime muerto", + "subtitles.twilightforest.entity.slimebeetle.hurt": "Escarabajo de Slime herido", + "subtitles.twilightforest.entity.slimebeetle.squish": "Escarabajo de Slime saltando", + "subtitles.twilightforest.entity.snowqueen.ambient": "Reina de las Nieves cruje", + "subtitles.twilightforest.entity.snowqueen.attack": "Reina de las Nieves ataca", + "subtitles.twilightforest.entity.snowqueen.break": "Reina de las Nieves el escudo desvía", + "subtitles.twilightforest.entity.snowqueen.death": "Reina de las Nieves muerto", + "subtitles.twilightforest.entity.snowqueen.hurt": "Reina de las Nieves herido", + "subtitles.twilightforest.entity.swarmspider.ambient": "Siseo de Araña de enjambre", + "subtitles.twilightforest.entity.swarmspider.death": "Araña de enjambre muerto", + "subtitles.twilightforest.entity.swarmspider.hurt": "Araña de enjambre herido", + "subtitles.twilightforest.entity.tear.break": "Lágrimas de Ur-Ghast rompiéndose", + "subtitles.twilightforest.entity.termite.ambient": "Siseo de Barrenador de la Torre de Madera", + "subtitles.twilightforest.entity.termite.death": "Barrenador de la Torre de Madera muerto", + "subtitles.twilightforest.entity.termite.hurt": "Barrenador de la Torre de Madera herido", + "subtitles.twilightforest.entity.tinybird.chirp": "Pájaro gorjea", + "subtitles.twilightforest.entity.tinybird.hurt": "Pájaro herido", + "subtitles.twilightforest.entity.tinybird.song": "Pájaro cantando", + "subtitles.twilightforest.entity.tome.death": "Tomo de la Muerte se desmorona", + "subtitles.twilightforest.entity.tome.hurt": "Pliegues del Tomo de la Muerte", + "subtitles.twilightforest.entity.tome.idle": "Tomo de la Muerte pasa las páginas", + "subtitles.twilightforest.entity.urghast.ambient": "Ur-Ghast llora", + "subtitles.twilightforest.entity.urghast.death": "Ur-Ghast muerto", + "subtitles.twilightforest.entity.urghast.hurt": "Ur-Ghast grita", + "subtitles.twilightforest.entity.urghast.trapactive": "Zumbidos de la trampa Trampa Ghast", + "subtitles.twilightforest.entity.urghast.trapon": "Trampa Ghast activa", + "subtitles.twilightforest.entity.urghast.trapspindown": "Trampa Ghast se apaga", + "subtitles.twilightforest.entity.urghast.trapwarmup": "Trampa de Ghast se calienta", + "subtitles.twilightforest.entity.winterwolf.death": "Lobo de invierno muerto", + "subtitles.twilightforest.entity.winterwolf.hurt": "Lobo de invierno herido", + "subtitles.twilightforest.entity.winterwolf.idle": "Lobo de invierno gruñe", + "subtitles.twilightforest.entity.winterwolf.shoot": "Lobo de invierno dispara", + "subtitles.twilightforest.entity.winterwolf.target": "Lobo de invierno apunta a la víctima", + "subtitles.twilightforest.entity.wraith.ambient": "Jadeos de Espectro", + "subtitles.twilightforest.entity.wraith.death": "Espectro muerto", + "subtitles.twilightforest.entity.wraith.hurt": "Espectro herido", + "subtitles.twilightforest.entity.yeti.death": "Yeti muerto", + "subtitles.twilightforest.entity.yeti.grab": "Yeti agarra al jugador", + "subtitles.twilightforest.entity.yeti.growl": "Yeti gruñe", + "subtitles.twilightforest.entity.yeti.hurt": "Yeti herido", + "subtitles.twilightforest.entity.yeti.throw": "Yeti tira con fuerza", + + "subtitles.twilightforest.entity.alphayeti.parrot": "Loro gruñe fríamente", + "subtitles.twilightforest.entity.carminitegolem.parrot": "Loro golpea", + "subtitles.twilightforest.entity.hostilewolf.parrot": "Gruñidos de Loro", + "subtitles.twilightforest.entity.hydra.parrot": "Rugidos de Loro", + "subtitles.twilightforest.entity.icecore.parrot": "Crujidos de Loro", + "subtitles.twilightforest.entity.kobold.parrot": "Loro refunfuña", + "subtitles.twilightforest.entity.minotaur.parrot": "Loro muge furiosamente", + "subtitles.twilightforest.entity.mosquito.parrot": "Zumbidos de Loro", + "subtitles.twilightforest.entity.naga.parrot": "Sonajeros de Loro", + "subtitles.twilightforest.entity.redcap.parrot": "Loro se ríe", + "subtitles.twilightforest.entity.tome.parrot": "Loro hace ruidos de libros", + "subtitles.twilightforest.entity.wraith.parrot": "Jadeos de Loro", + + "subtitles.twilightforest.block.bug.squish": "Se aplasta un bicho :(", + "subtitles.twilightforest.block.builder.on": "El constructor se activa", + "subtitles.twilightforest.block.builder.off": "El constructor se desactiva", + "subtitles.twilightforest.block.builder.replace": "El constructor sustituye el bloque", + "subtitles.twilightforest.block.door.activate": "La puerta del castillo no se desvanece", + "subtitles.twilightforest.block.door.reappear": "La puerta del castillo reaparece", + "subtitles.twilightforest.block.door.vanish": "La puerta del castillo se desvanece", + "subtitles.twilightforest.block.vanish.locked": "La puerta de la Torre de Madera no se desvanece", + "subtitles.twilightforest.block.vanish.unlock": "La puerta de la Torre de Madera se desbloquea", + "subtitles.twilightforest.block.reappear.reappear": "Reaparece el Bloque Reaparecedor", + "subtitles.twilightforest.block.reappear.vanish": "Desaparece el Bloque Reaparecedor", + "subtitles.twilightforest.block.vanish.vanish": "Bloque de desaparición se desvanece", + "subtitles.twilightforest.block.core.time": "El árbol del tiempo hace tictac", + "subtitles.twilightforest.block.core.transformation": "Árbol de la transformación emite un sonido ", + "subtitles.twilightforest.block.portal.woosh": "Portal del Bosque Twilight llama ", + "subtitles.twilightforest.block.pedestal.activate": "El pedestal de trofeos acepta el trofeo", + "subtitles.twilightforest.block.casket.open": "Se abre el ataúd del recuerdo", + "subtitles.twilightforest.block.casket.close": "Se se cierra el ataúd del recuerdo", + "subtitles.twilightforest.block.casket.repair": "El jugador repara el ataúd", + "subtitles.twilightforest.block.casket.locked": "Clics en el ataúd de recuerdo", + + "subtitles.twilightforest.item.blockchain.collide": "Bloque y Cadena golpea un bloque", + "subtitles.twilightforest.item.blockchain.hit": "Bloque y Cadena golpea a la entidad", + "subtitles.twilightforest.item.blockchain.fire": "Bloque y Cadena lanzado", + "subtitles.twilightforest.item.glasssword.break": "Espada de vidrio se rompe", + "subtitles.twilightforest.item.icebomb.fired": "Bomba de hielo lanzada", + "subtitles.twilightforest.item.lamp.burn": "Lámpara de Cenizas quema la zona", + "subtitles.twilightforest.item.moonworm.squish": "Gusano lunar disparos", + "subtitles.twilightforest.item.magnet.grab": "El imán extrae el mineral", + "subtitles.twilightforest.item.fan.woosh": "Abanico de pavo real utilizado", + "subtitles.twilightforest.item.scepter.drain": "Cetro Robó la vida del objetivo ", + "subtitles.twilightforest.item.scepter.use": "Cetro usado", + "subtitles.twilightforest.item.scepter.pearl": "Cetro Crepuscular lanza la perla", + "subtitles.twilightforest.item.powder.use": "Polvo de transformación utilizado", + "subtitles.twilightforest.item.charm.keep": "Talisman de conservación devuelve los objetos", + "subtitles.twilightforest.item.charm.life": "Talisman de Vida regenera al jugador", + + "subtitles.twilightforest.te.jet.start": "Comienza el chorro de fuego", + "subtitles.twilightforest.te.jet.active": "Llamaradas de Chorro de fuego", + "subtitles.twilightforest.te.jet.pop": "Chorro de fuego empieza a brotar", + "subtitles.twilightforest.te.smoker.start": "El ahumador comienza", + "subtitles.twilightforest.te.reactor.idle": "Reactor de Carminita hace ruido", + + "subtitles.random.slider": "Trampa Deslizante en Movimiento", + + // Death Messages + "death.attack.twilightforest.ghastTear": "%1$s fue escaldado por lágrimas de fuego", + "death.attack.twilightforest.ghastTear.player": "%1$s fue escaldado por lágrimas de fuego mientras escapaba de %2$s", + "death.attack.twilightforest.hydraFire": "%1$s fue asado vivo por la Hidra", + "death.attack.twilightforest.hydraFire.player": "%1$s fue asado vivo por la Hidra mientras escapaba de %2$s", + "death.attack.twilightforest.hydraBite": "La piel de %1$s fue arrancada por la Hidra", + "death.attack.twilightforest.hydraBite.player": "La piel de %1$s fue arrancada por la Hidra mientras escapaba de %2$s", + "death.attack.twilightforest.lichBolt": "La puntería del Lich era mejor que %1$s", + "death.attack.twilightforest.lichBolt.player": "El Lich y %2$s tenían mejor puntería que %1$s", + "death.attack.twilightforest.lichBomb": "%1$s sucumbió a la magia explosiva del Lich", + "death.attack.twilightforest.lichBomb.player": "%1$s sucumbió a la magia explosiva del Lich mientras escapaba %2$s", + "death.attack.twilightforest.chillingBreath": "%1$s fue congelado hasta la muerte por la Reina de las Nieves", + "death.attack.twilightforest.chillingBreath.player": "%1$s murió congelado por la Reina de las Nieves mientras escapaba de %2$s", + "death.attack.twilightforest.squish": "%1$s fue aplastado por la Reina de las Nieves", + "death.attack.twilightforest.squish.player": "%1$s fue triturado por la Reina de las Nieves mientras escapaba de %2$s", + "death.attack.twilightforest.thrownAxe": "%1$s fue decapitado por un hacha lanzada", + "death.attack.twilightforest.thrownAxe.player": "%1$s fue decapitado por un hacha lanzada mientras escapaba de %2$s", + "death.attack.twilightforest.thrownPickaxe": "%1$s fue decapitado por un pico lanzado", + "death.attack.twilightforest.thrownPickaxe.player": "%1$s fue decapitado por un pico lanzado mientras escapaba de %2$s", + "death.attack.twilightforest.fireJet": "%1$s caminó accidentalmente hacia un chorro de fuego", + "death.attack.twilightforest.fireJet.player": "%1$s entró accidentalmente en un chorro de fuego mientras escapaba de %2$s", + "death.attack.twilightforest.reactor": "%1$s estuvo demasiado cerca de un reactor de carminita", + "death.attack.twilightforest.reactor.player": "%1$s estuvo demasiado cerca de un reactor de carminita mientras escapaba %2$s", + "death.attack.twilightforest.slider": "%1$s fue cortado por una trampa deslizante", + "death.attack.twilightforest.slider.player": "%1$s fue cortado por una trampa deslizante mientras escapaba de %2$s", + "death.attack.twilightforest.thorns": "%1$s caminó hacia unas espinas", + "death.attack.twilightforest.thorns.player": "%1$s caminó hacia unas espinas mientras escapaba de %2$s", + "death.attack.twilightforest.knightmetal": "%1$s fue pinchado por un bloque hecho del Caballero de Metal", + "death.attack.twilightforest.knightmetal.player": "%1$s fue pinchado por un bloque hecho del Caballero de Metal mientras escapaba de %2$s", + "death.attack.twilightforest.fiery": "%1$s caminó hacia un bloque ardiente", + "death.attack.twilightforest.fiery.player": "%1$s caminó sobre un bloque ardiente mientras escapaba de %2$s", + + "death.attack.twilightforest.axing": "%1$s ha sido cortado por %2$s", + "death.attack.twilightforest.axing.item": "%1$s ha sido cortado por %2$s con %3$s", + "death.attack.twilightforest.cicada": "%1$s fue disparado por la Cigarra", + "death.attack.twilightforest.moonworm": "%1$s fue disparado por el Gusano lunar", + "death.attack.twilightforest.ant": "%1$s vivió la vida de una hormiga gracias a %2$s", + "death.attack.twilightforest.ant.item": "%1$s vivió la vida de una hormiga gracias a %2$s usando %3$s", + "death.attack.twilightforest.haunt": "%1$s entro a la guarida de %2$s", + "death.attack.twilightforest.haunt.item": "%1$s entro a la guarida de %2$s después de ser asesinado con %3$s", + "death.attack.twilightforest.clamped": "%1$s fue sujetado hasta la muerte por %2$s", + "death.attack.twilightforest.clamped.item": "%1$s fue sujetado hasta la muerte por %2$s usando %3$s", + "death.attack.twilightforest.scorched": "%1$s fue quemado por %2$s", + "death.attack.twilightforest.scorched.item": "%1$s fue quemado por %2$s usando %3$s", + "death.attack.twilightforest.frozen": "%1$s fue congelado por %2$s usando una bomba de hielo", + "death.attack.twilightforest.frozen.item": "%1$s fue congelado por %2$s usando %3$s", + "death.attack.twilightforest.spiked": "%1$s ha sido pinchado por %2$s", + "death.attack.twilightforest.spiked.item": "%1$s ha sido pinchado por %2$s utilizando %3$s", + "death.attack.twilightforest.leafBrain": "El cerebro de %1$s fue convertido en hojas por %2$s", + "death.attack.twilightforest.leafBrain.item": "El cerebro de %1$s fue convertido en hojas por %2$s usando %3$s", + "death.attack.twilightforest.lostWords": "%1$s se quedó sin palabras tras ser asesinado por %2$s", + "death.attack.twilightforest.lostWords.item": "%1$s se quedó sin palabras tras ser asesinado por %2$s con %3$s", + "death.attack.twilightforest.snowballFight": "%1$s perdió una pelea de bolas de nieve contra %2$s", + "death.attack.twilightforest.snowballFight.item": "%1$s perdió una pelea de bolas de nieve contra %2$s usando %3$s", + "death.attack.twilightforest.yeeted": "%1$s fue golpeado por última vez por %2$s", + "death.attack.twilightforest.yeeted.item": "%1$s ha sido golpeado por última vez por %2$s mientras sostenía %3$s", + + // Misc + "twilightforest.misc.wip0": "Este bloque es un trabajo en proceso y puede tener errores o efectos no deseados que pueden dañar tu mundo.", + "twilightforest.misc.wip1": "Utilizar con precaución.", + "twilightforest.misc.nyi": "Este bloque tiene efectos que aún no se han implementado.", + + "twilightforest.loading.title.enter": "Llevándote al Twilight Forest...", + "twilightforest.loading.title.leave": "Sacándote de Twilight Forest...", + + // Config + "twilightforest.config.dimension": "Ajustes de Dimensión", + "twilightforest.config.dimension.tooltip": "No podrás cambiar estas configuraciones sin que se produzca un reinicio.", + "twilightforest.config.dimension_id": "Dimension ID", + "twilightforest.config.dimension_id.tooltip": "Qué número de identificación asignar a la dimensión de Twilight Forest. Cambia si tienes conflictos con otro mod.", + "twilightforest.config.dimension_seed": "Semilla de Dimensión", + "twilightforest.config.dimension_seed.tooltip": "Si se establece, esto anulará la semilla normal del mundo cuando se generen partes de Twilight Forest Dimension.", + "twilightforest.config.spawn_in_tf": "Los nuevos jugadores aparecen en el Twilight Forest", + "twilightforest.config.spawn_in_tf.tooltip": "Si es cierto, los jugadores que aparezcan por primera vez lo harán en el Twilight Forest.", + "twilightforest.config.skylight_forest": "Bosque de Tragaluces [WIP]", + "twilightforest.config.skylight_forest.tooltip": "If true, Twilight Forest will generate as a void except for Major Structures.", + "twilightforest.config.skylight_oaks": "Tragaluz de Roble [WIP]", + "twilightforest.config.skylight_oaks.tooltip": "Si es cierto, los gigantescos Robles Crepusculares también aparecerán en los mundos vacíos.", + + "twilightforest.config.world_gen_weights": "Pesos de la generación mundial", + "twilightforest.config.world_gen_weights.tooltip": "Pesos para varias características pequeñas", + "twilightforest.config.stone_circle_weight": "Peso del círculo de piedra", + "twilightforest.config.well_weight": "Peso del pozo", + "twilightforest.config.stalagmite_weight": "Peso de la estalagmita", + "twilightforest.config.foundation_weight": "Peso de la base", + "twilightforest.config.monolith_weight": "Peso del monolito", + "twilightforest.config.grove_ruins_weight": "Peso de las ruinas de la arboleda", + "twilightforest.config.hollow_stump_weight": "Peso del muñón hueco", + "twilightforest.config.fallen_hollow_log_weight": "Peso del tronco hueco caido", + "twilightforest.config.fallen_small_log_weight": "Peso del tronco pequeño caído", + "twilightforest.config.druid_hut_weight": "Peso de la cabaña del druida", + + "twilightforest.config.hollow_hill_stalactites": "Estalactitas de la Colina Hueca personalizadas", + "twilightforest.config.hollow_hill_stalactites.tooltip": "Define estalactitas personalizadas generadas en colinas huecas.\n_Format is \\\"modid:block<:meta> size max_Length min_Height weight\\\", donde las propiedades son:\n_Size - la longitud máxima de la estalactita en relación con el espacio entre el suelo y el techo de la colina,\n_Max length - la longitud máxima de una estalactita en bloques,\n_Min height - el espacio mínimo entre el suelo de la colina y la estalactita para que se genere,\n_Weight - la frecuencia con la que se genera.\n\n_For example: \\\"minecraft:iron_ore 0.7 8 1 24\\\" añadiría una estalactita igual a la estalactita de mineral de hierro por defecto.", + "twilightforest.config.large_hill": "Grandes Colinas", + "twilightforest.config.large_hill.tooltip": "Bloques que se generan como estalactitas sólo en las grandes colinas.", + "twilightforest.config.medium_hill": "Colinas medianas y grandes", + "twilightforest.config.medium_hill.tooltip": "Bloques que se generan como estalactitas en colinas medianas y grandes.", + "twilightforest.config.small_hill": "Todas las colinas", + "twilightforest.config.small_hill.tooltip": "Bloques que generan como estalactitas en todas las colinas.", + "twilightforest.config.stalactite_config_only": "Utilice sólo la configuración de estalactitas", + "twilightforest.config.stalactite_config_only.tooltip": "Si es cierto, no se utilizarán las estalactitas por defecto ni las definidas por otros mods.", + + "twilightforest.config.compat": "Compatibilidad", + "twilightforest.config.compat.tooltip": "¿Debe cargarse la Compatibilidad de TF? Desactivar si la Compatibilidad de TF está causando caídas o si no se desea.", + + "twilightforest.config.performance": "Ajustes de rendimiento", + "twilightforest.config.performance.tooltip": "Te permite sacrificar varias cosas para mejorar el rendimiento del mundo.", + "twilightforest.config.canopy_coverage": "Cobertura del Dosel", + "twilightforest.config.canopy_coverage.tooltip": "Cantidad de cobertura del dosel. Los números más bajos mejoran la velocidad de generación de trozos a costa de un bosque más delgado.", + "twilightforest.config.twilight_oaks": "Roble Crepuscular Probabilidad", + "twilightforest.config.twilight_oaks.tooltip": "Probabilidad de que un trozo del Twilight Forest contenga un roble crepuscular. Los números más altos reducen el número de árboles, aumentando el rendimiento.", + "twilightforest.config.leaves_light_opacity": "Opacidad de las hojas crepusculares", + "twilightforest.config.leaves_light_opacity.tooltip": "Esto controla la opacidad de las hojas, cambiando la cantidad de luz bloqueada. Puede utilizarse para disminuir la complejidad en algunos controles de iluminación.", + "twilightforest.config.glacier_packed_ice": "Glaciares de hielo compacto en lugar de hielo", + "twilightforest.config.glacier_packed_ice.tooltip": "Si se establece como verdadero, los glaciares crepusculares se generarán con hielo compactado en lugar de hielo translúcido normal, lo que reducirá la cantidad de cálculos de comprobación de la luz.", + "twilightforest.config.enable_skylight": "Activar el Tragaluz", + "twilightforest.config.enable_skylight.tooltip": "Si la dimensión tiene valores de tragaluz por bloque. Desactivar esto mejorará significativamente el rendimiento de la generación de mundos, a costa de una iluminación plana en todas partes.\n_WARNING: Una vez que los trozos se cargan sin tragaluz, esos datos se pierden y no pueden ser regenerados fácilmente. Tenga cuidado.", + + "twilightforest.config.silent_cicadas": "Cigarras silenciosas", + "twilightforest.config.silent_cicadas.tooltip": "Haz que las cigarras sean silenciosas para aquellos que tengan problemas con la biblioteca de sonido o que las encuentren molestas.", + + "twilightforest.config.first_person_effects": "Renderización de efectos en 1ª persona", + "twilightforest.config.first_person_effects.tooltip": "Controla si varios efectos del mod se renderizan en la vista en primera persona. Desactívelo si los encuentra molestos.", + + "twilightforest.config.origin_dimension": "Dimensión de origen", + "twilightforest.config.origin_dimension.tooltip": "La dimensión desde la que siempre puedes viajar al Twilight Forest, así como la dimensión a la que regresarás. El valor predeterminado es el mundo exterior.", + "twilightforest.config.portals_in_other_dimensions": "Portales en otras dimensiones", + "twilightforest.config.portals_in_other_dimensions.tooltip": "Permitir que los portales al Twilight Forest se hagan fuera de la dimensión 'origen'. Puede considerarse una hazaña.", + "twilightforest.config.admin_portals": "Portales Twilight sólo para administradores", + "twilightforest.config.admin_portals.tooltip": "Permitir portales sólo para administradores (Operadores). Esto reduce severamente el rango en el que el mod suele escanear en busca de condiciones de portales válidos, y escanea cerca de los ops solamente.", + "twilightforest.config.portals": "Desactivar los portales Twilight", + "twilightforest.config.portals.tooltip": "Desactivar por completo la creación de portales en Twilight Forest. Proporcionado para los operadores de servidores que buscan restringir la acción a la dimensión.", + "twilightforest.config.portal_creator": "Objeto creador del portal", + "twilightforest.config.portal_creator.tooltip": "Cadena de registro IDs de elementos utilizados para crear el Portal de Twilight Forest. (domain:regname:meta) meta es opcional.", + "twilightforest.config.portal_lighting": "Fuego relámpago para la creación del portal", + "twilightforest.config.portal_lighting.tooltip": "Establece esta opción como verdadera si quieres que el rayo que enciende el portal no prenda fuego a las cosas. Para los que no les gusta la diversión.", + "twilightforest.config.portal_return": "Los portales deben generar como un portal de dos vías", + "twilightforest.config.portal_return.tooltip": "Si es falso, el portal de retorno requerirá el elemento de activación.", + "twilightforest.config.check_portal_destination": "Destino del Portal Pre-Check", + "twilightforest.config.check_portal_destination.tooltip": "Determina si los nuevos portales deben ser precomprobados por seguridad. Si se activa, los portales no se formarán en lugar de redirigirse a un destino alternativo seguro.\n_Note que al activar esto también se reduce la tasa de comprobación de la formación de portales.", + + "twilightforest.config.progression_default": "Regla de Progreso por Defecto", + "twilightforest.config.progression_default.tooltip": "Establece el valor por defecto de la regla de juego que controla la progresión forzada.", + + "twilightforest.config.uncrafting": "Desactivar la desfabricación en la mesa de desfabricación", + "twilightforest.config.uncrafting.tooltip": "Desactiva la función de desfabricación de la mesa de desfabricación. Se ofrece como opción cuando la interacción con otros mods produce recetas explotables.", + + "twilightforest.config.optifine": "Desactivar la pantalla de aviso cuando se instala Optifine.", + "twilightforest.config.optifine.tooltip": "Desactiva la pantalla de aviso que se muestra al inicio cuando se instala Optifine.", + + "twilightforest.config.antibuilder_blacklist": "Lista negra anti-construcción", + "twilightforest.config.antibuilder_blacklist.tooltip": "Lista negra anti-construcción. (domain:block:meta) meta es opcional.", + + "twilightforest.config.animate_trophyitem": "Girar las cabezas de los trofeos en el modelo de artículo", + "twilightforest.config.animate_trophyitem.tooltip": "Gira las cabezas de los trofeos en el modelo de artículo. No tiene ningún impacto en el rendimiento. Para aquellos que no les gusta la diversión.", + + "twilightforest.config.shield_parry": "Parada de Escudo", + "twilightforest.config.shield_parry.tooltip": "Recomendamos descargar el mod Shield Parry para realizar paradas, pero estos controles quedan para sin.", + "twilightforest.config.parry_non_twilight": "Parada de proyectiles no Twilight", + "twilightforest.config.parry_non_twilight.tooltip": "Poner en true para parar los proyectiles que no son de Twilight. Recomendamos descargar el mod Shield Parry en su lugar.", + "twilightforest.config.parry_window_arrow": "Temporización para las flechas", + "twilightforest.config.parry_window_arrow.tooltip": "La cantidad de ticks después de levantar un escudo que hace que se pueda parar una flecha. Hay 20 ticks en 1 segundo.", + "twilightforest.config.parry_window_fireball": "Temporización para las bolas de fuego", + "twilightforest.config.parry_window_fireball.tooltip": "La cantidad de ticks después de levantar un escudo que hace que se pueda parar una bola de fuego. Hay 20 ticks en 1 segundo.", + "twilightforest.config.parry_window_throwable": "Temporización de los lanzamientos", + "twilightforest.config.parry_window_throwable.tooltip": "La cantidad de ticks después de levantar un escudo que hace que se pueda parar un objeto lanzado. Hay 20 ticks en 1 segundo.", + "twilightforest.config.shield_Parry_Ticks_Beam": "Ventana de tiempo para las vigas???", + "twilightforest.config.shield_Parry_Ticks_Beam.tooltip": "???", + + "twilightforest.config.loading_screen": "Pantalla de Carga", + "twilightforest.config.loading_screen.tooltip": "Sólo para clientes: Controles de la pantalla de carga", + "twilightforest.config.loading_icon_enable": "Activar la animación del icono de carga", + "twilightforest.config.loading_icon_enable.tooltip": "Tambalea el icono de carga. No tiene ningún impacto en el rendimiento. Para los que no les gusta la diversión.", + "twilightforest.config.loading_screen_swap_frequency": "Cambio de pantalla de carga", + "twilightforest.config.loading_screen_swap_frequency.tooltip": "Cuántos ticks entre cada cambio de pantalla de carga. Poner a 0 para que no haya ningún ciclo.", + "twilightforest.config.loading_icon_wobble_bounce_frequency": "Velocidad de Animación de los Iconos", + "twilightforest.config.loading_icon_wobble_bounce_frequency.tooltip": "Frecuencia de tambaleo y rebote.", + "twilightforest.config.loading_icon_scale": "Escala del Icono", + "twilightforest.config.loading_icon_scale.tooltip": "Escala de todo el icono de carga de rebote.", + "twilightforest.config.loading_icon_bounciness": "Icono Rebotante", + "twilightforest.config.loading_icon_bounciness.tooltip": "Cuánto rebota el icono de carga.", + "twilightforest.config.loading_icon_tilting": "Icon Wobbliness", + "twilightforest.config.loading_icon_tilting.tooltip": "Hasta dónde se tambalea el icono de carga.", + "twilightforest.config.loading_icon_tilt_pushback": "Icono Desplazamiento de la inclinación", + "twilightforest.config.loading_icon_tilt_pushback.tooltip": "Valor de empuje para volver a centrar el bamboleo del icono de carga.", + "twilightforest.config.casket_uuid_locking": "Cierre del ataúd UUID", + "twilightforest.config.casket_uuid_locking.tooltip": "Si es cierto, los ataúdes de recuerdo que se generan cuando un jugador muere no serán accesibles para otros jugadores. Utiliza esta opción si no quieres que la gente coja de los ataúdes de muerte de otras personas. NOTA: los operadores del servidor seguirán pudiendo abrir los ataúdes cerrados.", + + // Books + "twilightforest.book.lichtower.1": "\u00A78[[Un cuaderno de explorador, roído por los monstruos]]\u00A70\n\n_He comenzado a examinar la extraña aura que rodea a esta torre. Los ladrillos de la torre están protegidos por una maldición, más fuerte que cualquiera que haya visto antes. La magia de la maldición", + "twilightforest.book.lichtower.2": "está hirviendo en los alrededores.\n\n_En mi tierra natal tendría muchas opciones para lidiar con esta magia, pero aquí mis suministros son limitados. En mi tierra natal tendría muchas opciones para lidiar con esta magia, pero aquí mis suministros son limitados. Tendré que investigar...", + "twilightforest.book.lichtower.3": "\u00A78[[Muchas entradas después]]\u00A70\n\n_Un avance! En mis viajes avisté un enorme monstruo con forma de serpiente en un patio decorado. Cerca, recogí una escama verde desgastada y desechada.\n\n_La magia de la escama parece tener las", + "twilightforest.book.lichtower.4": "propiedades para romper maldiciones que necesito, pero la magia es demasiado débil. Puede que necesite adquirir un espécimen más fresco, directamente de la criatura.", + + "twilightforest.book.labyrinth.1": "\u00A78[[Cuaderno de un explorador, escrito en papel impermeable]]\u00A70\n\n_Los mosquitos de este pantano son molestos, pero extraños. La gran mayoría de ellos parece no tener una fuente natural, ni parece tener un papel en la ecología local. He comenzado a", + "twilightforest.book.labyrinth.2": "sospechar que son una especie de maldición mágica.\n\n\u00A78[[Siguiente entrada]]\u00A70\n\n_Ahora que he encontrado un hechizo de protección en el laberinto en ruinas aquí, considero que mis sospechas se confirman.Tanto el hechizo de protección", + "twilightforest.book.labyrinth.3": "como los mosquitos son una maldición. Esta maldición parece tener un origen diferente a las otras que he encontrado. Tendré que investigar más...\n\n\u00A78[[Siguiente entrada]]\u00A70\n\n_La maldición parece", + "twilightforest.book.labyrinth.4": "ser de un tipo demasiado poderoso para que un solo ser la produzca. Serían necesarios varios magos trabajando en combinación.\n\n_Si uno de los magos dejara de contribuir, la maldición caería sobre todo el pantano. Extrañamente,", + "twilightforest.book.labyrinth.5": "mis adivinaciones no muestran señales de ningún mago vivo cercano. Sin embargo, vi algo interesante en una de las torres de techo puntiagudo cercanas...", + + "twilightforest.book.hydralair.1": "\u00A78[[Un cuaderno de explorador, escrito en papel ignífugo]]\u00A70\n\n_El fuego es un obstáculo trivial para un maestro explorador como yo. He atravesado mares de fuego y nadado por océanos de lava. El aire ardiente aquí es una variación interesante,", + "twilightforest.book.hydralair.2": "pero, en definitiva, no es un obstáculo.\n\n_Sin embargo, lo que me detiene es que me he encontrado con otro hechizo de protección, esta vez rodeando a una poderosa criatura que debe ser el rey de este pantano de fuego. Este no es el primer hechizo de protección que", + "twilightforest.book.hydralair.3": "encuentro, y estoy comenzando a desentrañar los misterios de cómo funcionan.\n\n_Si este hechizo es como los otros, será sostenido por una poderosa criatura cercana. Alrededor del pantano de fuego hay varios pantanos húmedos, y bajo esos", + "twilightforest.book.hydralair.4": "pantanos hay laberintos llenos de minotauros. La elección lógica para atar tal hechizo sería algún tipo de minotauro poderoso, diferente de alguna manera de los otros que lo rodean...", + + "twilightforest.book.tfstronghold.1": "\u00A78[[Un cuaderno de explorador, escrito en un papel débilmente brillante]\u00A70\n\n_Los tallos de oscuridad que rodean esta zona no son más que la manifestación de un hechizo protector sobre todo el bosque oscuro. El hechizo causa ceguera, lo cual es bastante molesto. He visto", + "twilightforest.book.tfstronghold.2": "varias cosas interesantes en la zona y me gustaría seguir explorando.\n\n\u00A78[[Entrada siguiente]]\u00A70\n\n_He encontrado unas ruinas en el bosque oscuro. Pertenecen a una fortaleza, del tipo que suelen habitar los caballeros. Sin embargo", + "twilightforest.book.tfstronghold.3": "más que de caballeros, esta fortaleza está llena de goblins. Llevan armadura de caballero, pero su comportamiento es muy poco caballeroso.\n\n\u00A78[[Entrada siguiente]]\u00A70\n\n_En lo profundo de las ruinas, he encontrado un pedestal. El pedestal parece ser del tipo en el que", + "twilightforest.book.tfstronghold.4": "los caballeros colocarían los trofeos para demostrar su fuerza.\n\\La obtención de un cetro poderoso parece debilitar la maldición del bosque oscuro, y la colocación de un trofeo asociado a una criatura poderosa en el pedestal probablemente concedería el acceso a la", + "twilightforest.book.tfstronghold.5": "parte principal de la fortaleza.", + + "twilightforest.book.darktower.1": "\u00A78[[Un cuaderno de explorador que parece haber sobrevivido a una explosión]]\u00A70\n\n_Esta torre tiene claramente mecanismos que no me responden. Su magia casi anhela reconocer mi toque, pero no puede. Es como si los dispositivos de la torre estuvieran siendo", + "twilightforest.book.darktower.2": "suprimida por un poderoso grupo de seres cercanos.\n\n\u00A78[[Entrada siguiente]]\u00A70\n\n_La magia parece emanar de lo más profundo de las fortalezas cercanas. No puede venir de los goblins, ya que su magia es encantadora, pero desenfocada. Allí", + "twilightforest.book.darktower.3": "debe haber alguna fuerza aún activa en los bastiones.\n\n\u00A78[[Entrada siguiente]]\u00A70\n\n_Mi análisis indica que proviene de varias fuentes, operando como un grupo. Volveré a la fortaleza después de reabastecerme...", + + "twilightforest.book.yeticave.1": "\u00A78[[Un cuaderno de explorador, cubierto de escarcha]]\u00A70\n\n_La ventisca que rodea estas tierras nevadas es incesante. No se trata de una nevada ordinaria: es un fenómeno mágico. Tendré que realizar experimentos para encontrar", + "twilightforest.book.yeticave.2": "lo que es capaz de causar tal efecto.\n\n\u00A78[[Entrada siguiente]]\u00A70\n\n_La maldición parece ser de un tipo demasiado poderoso para que un solo ser la produzca. Serían necesarios varios magos trabajando en combinación.", + "twilightforest.book.yeticave.3": "Si uno de los magos dejara de contribuir, la ventisca se calmaría. Extrañamente, mis adivinaciones no muestran señales de ningún mago vivo cercano. Sin embargo, vi algo interesante en una de las torres de techo puntiagudo cercanas...", + + "twilightforest.book.icetower.1": "\u00A78[[El cuaderno de un explorador, cubierto de hielo]]\u00A70\n\n_He superado una ventisca, sólo para encontrarme con esta terrible tormenta de hielo en la cima del glaciar. Mis exploraciones me han mostrado el esplendor de un palacio de hielo, que brilla con los colores de la aurora polar. Todo", + "twilightforest.book.icetower.2": "parece protegido por una especie de maldición.\n\n\u00A78[[Entrada siguiente]]\u00A70\n\n_No soy un novato. Esta maldición es alimentada por el poder de una criatura cercana. La causa de la maldición que rodea el pantano de fuego se construyó a partir del poder del líder de los", + "twilightforest.book.icetower.3": "minotauros de las cercanías.\n\n_Alrededor de este glaciar, hay masas de yetis. Quizás los yetis tengan algún tipo de líder...", + + "twilightforest.book.trollcave.1": "\u00A78[[Un cuaderno de explorador, dañado por el ácido]]\u00A70\n\n_Parece que no hay forma de protegerme de la tormenta tóxica que rodea esta zona. En mis breves excursiones, también he encontrado otro hechizo de protección, similar a los", + "twilightforest.book.trollcave.2": "otros que he presenciado. El hechizo debe estar conectado a la tormenta tóxica de alguna manera. Más investigación para seguir...\n\n\u00A78[[Entrada siguiente]]\u00A70\n\n_Tal magia climática suprema debe ser el resultado de", + "twilightforest.book.trollcave.3": "múltiples e invictos grandes males en este mundo. Mis estudios contienen varias pistas que apuntan a un pantano abrasador, un bosque cubierto de profunda oscuridad y un reino cubierto de nieve.", + + "twilightforest.book.unknown.1": "\u00A78[[Este libro muestra signos de haber sido copiado muchas veces]]\u00A70\n\n_No puedo explicar el campo que rodea esta estructura, pero la magia es poderosa. Si esta maldición es como las otras, entonces la respuesta para desbloquearla está en otra parte. Tal vez hay", + "twilightforest.book.unknown.2": "algo que he dejado sin hacer, o algún monstruo que aún no he vencido. Tendré que regresar. Volveré a este lugar más tarde, para ver si algo ha cambiado.", + + // Fluid + + "fluid.fierymetal": "Fierro fundido", + "fluid.knightmetal": "Caballero de Metal Fundido", + "fluid.fiery_essence": "Esencia ardiente", + + // TCon + + "material.nagascale": "Escama Naga", + "material.steeleaf": "Hoja de Acero", + "material.fierymetal": "Ardiente", + "material.knightmetal": "Caballero", + "material.raven_feather": "Pluma de Cuervo", + + "modifier.twilit": "Twilit", + "modifier.twilit.desc": "§oLa bendición iluminadora del Twilight Forest§r.\nMás rápido en el Twilight Forest.\nMás daños fuera del Twilight Forest.", + "modifier.twilit.extra.speed": "Velocidad de extracción en Twilight Forest: +%s", + "modifier.twilit.extra.damage": "Daños fuera del Twilight Forest: +%s", + "modifier.precipitate": "Precipitate", + "modifier.precipitate.desc": "§oEl último plan de escape en pie.§r\nCuanto menos salud tenga, más rápido será.", + "modifier.synergy": "Sinergia", + "modifier.synergy.desc": "§oMira mamá, no hay musgo!§r\nSe reparará por sí mismo si tienes Hoja de Acero en tu barra de acceso.", + "modifier.stalwart": "Incondicional", + "modifier.stalwart.desc": "§o_Los valientes y audaces.§r\nGolpear a una entidad puede hacer que te sientas envalentonado.", + "modifier.veiled": "Velada", + "modifier.veiled.desc": "§oComo un espectro!§r\nEl proyectil será invisible.", + + // Immersive Engineering + "desc.immersiveengineering.info.shader.rarity.twilight": "Twilight", + + "item.twilightforest.shader": "Twilit Shader: %s", + "item.twilightforest.shader_bag": "Twilit %s Shader Bag", + + "item.twilightforest.shader.name.twilight": "Twilight", + "item.twilightforest.shader.name.firefly": "Luciérnaga", + "item.twilightforest.shader.name.questing_ram": "Carnero de la Búsqueda", + "item.twilightforest.shader.name.ironwood": "Madera de Hierro", + "item.twilightforest.shader.name.steeleaf": "Hoja de Acero", + "item.twilightforest.shader.name.knightly": "Caballero de Metal", + "item.twilightforest.shader.name.fiery": "Ardiente", + "item.twilightforest.shader.name.snakestone": "Piedra de la Serpiente", + "item.twilightforest.shader.name.naga": "Naga", + "item.twilightforest.shader.name.lich": "Lich", + "item.twilightforest.shader.name.mazestone": "Piedra de Laberinto", + "item.twilightforest.shader.name.pinch_beetle": "Escarabajo de Pinzas", + "item.twilightforest.shader.name.minoshroom": "Minosetauro", + "item.twilightforest.shader.name.hydra": "Hidra", + "item.twilightforest.shader.name.underbrick": "Subsuelo de Ladrillos", + "item.twilightforest.shader.name.knight_phantom": "Caballero Fantasma", + "item.twilightforest.shader.name.towerwood": "Torre de Madera", + "item.twilightforest.shader.name.carminite": "Carminita", + "item.twilightforest.shader.name.ur-ghast": "Ur-Ghast", + "item.twilightforest.shader.name.alpha_yeti": "Yeti Alfa", + "item.twilightforest.shader.name.auroralized": "Auroralizado", + "item.twilightforest.shader.name.snow_queen": "Reina de las Nieves", + "item.twilightforest.shader.name.cube_of_annihilation": "Cubo de la Aniquilación", + "item.twilightforest.shader.name.final_castle": "Castillo Final", + + // Optifine + "twilightforest.gui.optifine.title": "AVISO: OPTIFINE DETECTADO", + "twilightforest.gui.optifine.message": "Antes de continuar, por favor, tenga en cuenta que Optifine es conocido por causar fallos, errores visuales de entidades multiparte y muchos otros problemas.\n\nAntes de informar de un error, por favor, elimine Optifine primero y compruebe de nuevo si el error sigue presente.\n\nLos problemas relacionados con Optifine no pueden ser resueltos por Twilight Forest!\n\nEsta pantalla puede ser desactivada en la configuración del cliente." +} diff --git a/src/main/resources/assets/twilightforest/lang/et_ee.json b/src/main/resources/assets/twilightforest/lang/et_ee.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/et_ee.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/eu_es.json b/src/main/resources/assets/twilightforest/lang/eu_es.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/eu_es.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/fa_ir.json b/src/main/resources/assets/twilightforest/lang/fa_ir.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/fa_ir.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/fi_fi.json b/src/main/resources/assets/twilightforest/lang/fi_fi.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/fi_fi.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/fil_ph.json b/src/main/resources/assets/twilightforest/lang/fil_ph.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/fil_ph.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/fo_fo.json b/src/main/resources/assets/twilightforest/lang/fo_fo.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/fo_fo.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/fr_fr.json b/src/main/resources/assets/twilightforest/lang/fr_fr.json new file mode 100644 index 0000000000..f5ad798f23 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/fr_fr.json @@ -0,0 +1,460 @@ +{ + "advancement.twilightforest.arborist": "Dendrologue maniaque", + "advancement.twilightforest.arborist.desc": "Préparez vos haches et cisailles. Fouiller chaque coin et recoin et récupérer tout ce qui provient des arbres ! Fabriquez, récupérez, obtenez chaque dalle... pousse... feuilles.... plus… TOUT. TOUT !", + "advancement.twilightforest.arctic_dyed": "Être à la mode", + "advancement.twilightforest.beanstalk": "Jack et le Haricot Magique", + "advancement.twilightforest.experiment_115": "Viande mystère ?", + "advancement.twilightforest.experiment_115.desc": "Ça ressemble à du gâteau par contre...", + "advancement.twilightforest.experiment_115_2": "Faire une note : énorme succès !", + "advancement.twilightforest.experiment_115_2.desc": "C'est tellement délicieux et humide !", + "advancement.twilightforest.experiment_115_3": "Manger 115 tous les jours, pendant 115 ans", + "advancement.twilightforest.experiment_115_3.desc": "manger l'expérience cent quinze toute la journée, pour toujours, cent quinze fois l'expérience cent quinze, expérience cent quinze point com, double-v double-v double-v point expérience cent quinze point com, cent quinze ans, chaque minute expérience cent quinze point com, double-v double-v double-v point cent quinze", + "advancement.twilightforest.fiery_set": "Des litres de sang et de larmes", + "advancement.twilightforest.ghast_trap": "Quelque chose d'étrange", + "advancement.twilightforest.ghast_trap.desc": "Tuer les %s autour d'un %s et l'activer pour torturer l'%s depuis le ciel !", + "advancement.twilightforest.giants": "Je suis sur le neuvième nuage", + "advancement.twilightforest.glass_sword": "Un coup étonnant", + "advancement.twilightforest.glass_sword.desc": "J'espère que tu as fait bon usage de cela.", + "advancement.twilightforest.hedge": "Écraseur de bugs", + "advancement.twilightforest.hill1": "Ces bottes sont les miennes !", + "advancement.twilightforest.hill2": "Quel était ce bruit ?", + "advancement.twilightforest.hill3": "Je te vois", + "advancement.twilightforest.hydra_chop": "Tranche d'Hydre !", + "advancement.twilightforest.kill_cicada": "Arrêter", + "advancement.twilightforest.kill_hydra": "Tueur d'Hydre", + "advancement.twilightforest.kill_lich": "Faire sortir vos morts", + "advancement.twilightforest.kill_naga": "Il est temps de niveler les écailles", + "advancement.twilightforest.lich_scepters": "Par nos pouvoirs combinés !", + "advancement.twilightforest.magic_map": "Je peux voir pour toujours", + "advancement.twilightforest.magic_map_focus": "Il écrit avec du feu", + "advancement.twilightforest.maze_map": "Trouver la sortie", + "advancement.twilightforest.mazebreaker": "Casser le labyrinthe", + "advancement.twilightforest.naga_armors": "Armurier du Nâga", + "advancement.twilightforest.ore_map": "Comment cela peut-il en valoir la peine ?", + "advancement.twilightforest.progress_glacier": "Cieux clairs", + "advancement.twilightforest.progress_knights": "Acclimatation à la carminite", + "advancement.twilightforest.progress_labyrinth": "Puissant Stroganoff", + "advancement.twilightforest.progress_merge": "Épreuve de force ultime", + "advancement.twilightforest.progress_troll": "Je souhaite plus de brûlures", + "advancement.twilightforest.progress_trophy_pedestal": "Champion de trophée", + "advancement.twilightforest.progress_ur_ghast": "Larmes de feu", + "advancement.twilightforest.progress_yeti": "Fourrure d'Alpha", + "advancement.twilightforest.quest_ram": "Consomme des bêêê !", + "advancement.twilightforest.root": "Forêt du Crépuscule", + "advancement.twilightforest.troll": "Nous faisons un petit troll", + "advancement.twilightforest.twilight_dining": "Dînons au coucher du soleil", + "advancement.twilightforest.twilight_hunter": "Le silence de la forêt", + "biome.twilightforest.clearing": "Clairière du Crépuscule", + "biome.twilightforest.dark_forest": "Forêt Sombre", + "biome.twilightforest.dark_forest_center": "Centre de la Forêt Sombre", + "biome.twilightforest.dense_forest": "Forêt dense", + "biome.twilightforest.dense_mushroom_forest": "Forêt de Champignons Dense", + "biome.twilightforest.enchanted_forest": "Forêt Enchantée", + "biome.twilightforest.final_plateau": "Plateau Final", + "biome.twilightforest.fire_swamp": "Marécage de Feu", + "biome.twilightforest.firefly_forest": "Forêt des Lucioles", + "biome.twilightforest.forest": "Forêt du Crépuscule", + "biome.twilightforest.glacier": "Glacier du Crépuscule", + "biome.twilightforest.highlands": "Hauts plateaux du crépuscule", + "biome.twilightforest.lake": "Lac du Crépuscule", + "biome.twilightforest.mushroom_forest": "Forêt de Champignons", + "biome.twilightforest.oak_savannah": "Savane de chêne", + "biome.twilightforest.snowy_forest": "Forêt Enneigé", + "biome.twilightforest.spooky_forest": "Forêt effrayante", + "biome.twilightforest.stream": "Rivière du Crépuscule", + "biome.twilightforest.swamp": "Marécage du Crépuscule", + "biome.twilightforest.thornlands": "Terres épineuses", + "biome.twilightforest.underground": "Souterrain", + "block.twilightforest.arctic_fur_block": "Bloc de fourrure arctique", + "block.twilightforest.aurora_block": "Bloc d'aurore", + "block.twilightforest.aurora_pillar": "Pilier auroralisé", + "block.twilightforest.aurora_slab": "Dalle auroralisée", + "block.twilightforest.auroralized_glass": "Verre auroralisé", + "block.twilightforest.beanstalk_leaves": "Feuilles d'haricot magique", + "block.twilightforest.blue_castle_door": "Porte de château bleue", + "block.twilightforest.blue_castle_rune_brick": "Rune de brique de château bleue", + "block.twilightforest.blue_force_field": "Champ de force bleu", + "block.twilightforest.bold_castle_brick_pillar": "Pilier épais de brique de château", + "block.twilightforest.bold_castle_brick_stairs": "Escaliers épais en brique de château", + "block.twilightforest.brown_thorns": "Épines", + "block.twilightforest.burnt_thorns": "Épines brûlées", + "block.twilightforest.canopy_button": "Bouton en canopée", + "block.twilightforest.canopy_door": "Porte en canopée", + "block.twilightforest.canopy_fence": "Barrière en canopée", + "block.twilightforest.canopy_fence_gate": "Portillon en canopée", + "block.twilightforest.canopy_leaves": "Feuilles d'arbre canopée", + "block.twilightforest.canopy_log": "Bûche d'arbre canopée", + "block.twilightforest.canopy_planks": "Planches de canopée", + "block.twilightforest.canopy_pressure_plate": "Plaque de pression en canopée", + "block.twilightforest.canopy_sapling": "Pousse d'arbre de canopée", + "block.twilightforest.canopy_slab": "Dalle en canopée", + "block.twilightforest.canopy_stairs": "Escaliers en canopée", + "block.twilightforest.canopy_trapdoor": "Trappe en canopée", + "block.twilightforest.canopy_wood": "Bois d'arbre canopée", + "block.twilightforest.carminite_block": "Bloc de carminite", + "block.twilightforest.carminite_builder": "Constructeur carminite", + "block.twilightforest.carminite_reactor": "Réacteur carminite", + "block.twilightforest.castle_brick": "Brique de château", + "block.twilightforest.castle_brick_stairs": "Escaliers en pierre de château", + "block.twilightforest.castle_roof_tile": "Tuile de toit de château", + "block.twilightforest.cicada": "Cigale", + "block.twilightforest.cinder_furnace": "Four à cendres [NYI]", + "block.twilightforest.cinder_log": "Bois de cendres [NYI]", + "block.twilightforest.clover_patch": "Trèfle à quatre feuilles [WIP]", + "block.twilightforest.cracked_castle_brick": "Brique de château craquelée", + "block.twilightforest.cracked_castle_brick_stairs": "Escaliers en pierre de château craquelée", + "block.twilightforest.cracked_deadrock": "Deadrock craquelée", + "block.twilightforest.cracked_mazestone": "Brique de pierre craquelée du labyrinthe", + "block.twilightforest.cracked_underbrick": "Brique des dessous craquelée", + "block.twilightforest.cut_mazestone": "Pierre du labyrinthe polie", + "block.twilightforest.dark_button": "Bouton en bois sombre", + "block.twilightforest.dark_door": "Porte en bois sombre", + "block.twilightforest.dark_fence": "Barrière en bois sombre", + "block.twilightforest.dark_fence_gate": "Portillon en bois sombre", + "block.twilightforest.dark_leaves": "Feuilles de Deadrock", + "block.twilightforest.dark_log": "Bûche de bois sombre", + "block.twilightforest.dark_planks": "Planches de bois sombre", + "block.twilightforest.dark_pressure_plate": "Plaque de pression en bois sombre", + "block.twilightforest.dark_slab": "Dalle en bois sombre", + "block.twilightforest.dark_stairs": "Escaliers en bois sombre", + "block.twilightforest.dark_trapdoor": "Trappe en bois sombre", + "block.twilightforest.darkwood_sapling": "Pousse d'arbre sombre", + "block.twilightforest.decorative_mazestone": "Brique de pierre décorée du labyrinthe", + "block.twilightforest.encased_castle_brick_pillar": "Pilier de brique de château recouvert", + "block.twilightforest.encased_castle_brick_stairs": "Escaliers en brique de château recouverts", + "block.twilightforest.encased_castle_brick_tile": "Tuille de brique de château recouverte", + "block.twilightforest.encased_fire_jet": "Jet de feu recouvert", + "block.twilightforest.encased_smoker": "Fumeur recouvert", + "block.twilightforest.etched_nagastone": "Nâgastone gravée", + "block.twilightforest.experiment_115": "Expérience 115", + "block.twilightforest.fiery_block": "Bloc de métal ardent", + "block.twilightforest.fire_jet": "Jet de feu", + "block.twilightforest.firefly": "Luciole", + "block.twilightforest.firefly_jar": "Bocal à luciole", + "block.twilightforest.fluffy_cloud": "Nuage moelleux", + "block.twilightforest.ghast_trap": "Piège à Ghast", + "block.twilightforest.giant_cobblestone": "Pierre géante", + "block.twilightforest.giant_leaves": "Feuilles géantes", + "block.twilightforest.giant_log": "Bois géant", + "block.twilightforest.giant_obsidian": "Obsidienne géante", + "block.twilightforest.green_force_field": "Champ de force vert", + "block.twilightforest.green_thorns": "Épines vertes", + "block.twilightforest.hedge": "Haie", + "block.twilightforest.hollow_oak_sapling": "Pousse de chêne de la Twilight robuste", + "block.twilightforest.huge_lily_pad": "Énorme nénuphar", + "block.twilightforest.huge_stalk": "Énorme tige", + "block.twilightforest.huge_water_lily": "Énorme fleur à nénuphar", + "block.twilightforest.hydra_trophy": "Trophée d'Hydre", + "block.twilightforest.iron_ladder": "Échelle en fer", + "block.twilightforest.ironwood_block": "Bloc de bois de fer", + "block.twilightforest.knightmetal_block": "Bloc de métal de chevalier", + "block.twilightforest.lich_trophy": "Trophée de Liche", + "block.twilightforest.liveroot_block": "Racines vivantes", + "block.twilightforest.locked_vanishing_block": "Bloc de disparition verrouillé", + "block.twilightforest.mangrove_button": "Bouton en mangrove", + "block.twilightforest.mangrove_door": "Porte en mangrove", + "block.twilightforest.mangrove_fence": "Barrière en mangrove", + "block.twilightforest.mangrove_fence_gate": "Portillon en mangrove", + "block.twilightforest.mangrove_leaves": "Feuilles de mangrove", + "block.twilightforest.mangrove_log": "Bûche de Mangrove", + "block.twilightforest.mangrove_planks": "Planches de mangrove", + "block.twilightforest.mangrove_pressure_plate": "Plaque de pression en mangrove", + "block.twilightforest.mangrove_sapling": "Pousse de mangrove de la Twilight", + "block.twilightforest.mangrove_slab": "Dalle en mangrove", + "block.twilightforest.mangrove_stairs": "Escaliers en mangrove", + "block.twilightforest.mangrove_trapdoor": "Trappe en mangrove", + "block.twilightforest.mangrove_wood": "Bois de mangrove", + "block.twilightforest.mayapple": "Podophyllum", + "block.twilightforest.mazestone": "Pierre du labyrinthe", + "block.twilightforest.mazestone_border": "Bordure de pierre du labyrinthe", + "block.twilightforest.mazestone_brick": "Brique du labyrinthe", + "block.twilightforest.mazestone_mosaic": "Mosaïque de pierre du labyrinthe", + "block.twilightforest.mining_button": "Bouton en bois de mine", + "block.twilightforest.mining_door": "Porte en bois de mine", + "block.twilightforest.mining_fence": "Barrière en bois de mine", + "block.twilightforest.mining_fence_gate": "Portillon", + "block.twilightforest.mining_leaves": "Feuilles d'arbre du mineur", + "block.twilightforest.mining_log_core": "Coeur du mineur", + "block.twilightforest.mining_planks": "Planches de bois de mine", + "block.twilightforest.mining_pressure_plate": "Plaque de pression en bois de mine", + "block.twilightforest.mining_sapling": "Pousse d'arbre du mineur", + "block.twilightforest.mining_slab": "Dalle en bois de mine", + "block.twilightforest.mining_stairs": "Escaliers en bois de mine", + "block.twilightforest.mining_trapdoor": "Trappe en bois de mine", + "block.twilightforest.moonworm": "Ver de lune", + "block.twilightforest.moss_patch": "Mousse", + "block.twilightforest.mossy_castle_brick": "Brique de château moussue", + "block.twilightforest.mossy_castle_brick_stairs": "Escaliers en pierre de château moussue", + "block.twilightforest.mossy_etched_nagastone": "Nâgastone gravée moussue", + "block.twilightforest.mossy_mazestone": "Brique de pierre moussue du labyrinthe", + "block.twilightforest.mossy_nagastone_pillar": "Pilier de nâgastone moussue", + "block.twilightforest.mossy_nagastone_stairs_left": "Escaliers de nâgastone moussue (gauche)", + "block.twilightforest.mossy_nagastone_stairs_right": "Escaliers de nâgastone moussue (droite)", + "block.twilightforest.mossy_underbrick": "Brique des dessous moussue", + "block.twilightforest.mushgloom": "Champignon lumineux", + "block.twilightforest.naga_trophy": "Trophée de Nâga", + "block.twilightforest.nagastone": "Nâgastone", + "block.twilightforest.nagastone_head": "Tête de nâgastone", + "block.twilightforest.nagastone_pillar": "Pilier de nâgastone", + "block.twilightforest.nagastone_stairs_left": "Escaliers en nâgastone (gauche)", + "block.twilightforest.nagastone_stairs_right": "Escaliers en nâgastone (droite)", + "block.twilightforest.orange_force_field": "Champ de force orange", + "block.twilightforest.rainbow_oak_leaves": "Feuilles de chêne arc-en-ciel", + "block.twilightforest.rainbow_oak_sapling": "Pousse de chêne arc-en-ciel", + "block.twilightforest.reappearing_block": "Bloc de réapparition", + "block.twilightforest.root": "Racines", + "block.twilightforest.root_strand": "Brins de racine", + "block.twilightforest.slider": "Piège à glissière", + "block.twilightforest.smoker": "Bloc fumant", + "block.twilightforest.snow_queen_trophy": "Trophée de la Reine des Neiges", + "block.twilightforest.sorting_button": "Bouton en Sortingwood", + "block.twilightforest.sorting_door": "Porte en Sortingwood", + "block.twilightforest.sorting_fence": "Barrière en Sortingwood", + "block.twilightforest.sorting_fence_gate": "Portillon en Sortingwood", + "block.twilightforest.sorting_leaves": "Feuilles d'arbre de Sorting", + "block.twilightforest.sorting_log_core": "Moteur du bois de Sorting", + "block.twilightforest.sorting_planks": "Planches de Sortingwood", + "block.twilightforest.sorting_pressure_plate": "Plaque de pression en Sortingwood", + "block.twilightforest.sorting_sapling": "Pousse d'arbre de Sorting", + "block.twilightforest.sorting_slab": "Dalle en Sortingwood", + "block.twilightforest.sorting_stairs": "Escaliers en Sortingwood", + "block.twilightforest.sorting_trapdoor": "Trappe en Sortingwood", + "block.twilightforest.spiral_bricks": "Pierre taillée en spirale", + "block.twilightforest.steeleaf_block": "Bloc de Stealeaf", + "block.twilightforest.stripped_canopy_log": "Bûche de chêne canopée écorcée", + "block.twilightforest.stripped_mangrove_log": "Bûche de Mangrove écorcée", + "block.twilightforest.stripped_twilight_oak_log": "Bûche de chêne du Crépuscule écorcée", + "block.twilightforest.stronghold_shield": "Bouclier stronghold", + "block.twilightforest.thick_castle_brick": "Brique de château épaisse", + "block.twilightforest.thorn_leaves": "Feuilles d'épines", + "block.twilightforest.thorn_rose": "Rose d'épines", + "block.twilightforest.time_button": "Bouton en bois du temps", + "block.twilightforest.time_door": "Porte en bois du temps", + "block.twilightforest.time_fence": "Barrière en bois du temps", + "block.twilightforest.time_fence_gate": "Portillon en bois du temps", + "block.twilightforest.time_leaves": "Feuilles d'arbre du temps", + "block.twilightforest.time_log_core": "Horloge de bois du temps", + "block.twilightforest.time_planks": "Planches de bois du temps", + "block.twilightforest.time_pressure_plate": "Plaque de pression en bois du temps", + "block.twilightforest.time_sapling": "Pousse d'arbre du temps", + "block.twilightforest.time_slab": "Dalle en bois du temps", + "block.twilightforest.time_stairs": "Escaliers en bois du temps", + "block.twilightforest.time_trapdoor": "Trappe en bois du temps", + "block.twilightforest.torchberry_plant": "Plante de torche des baies", + "block.twilightforest.towerwood": "Planches de Towerwood", + "block.twilightforest.transformation_button": "Bouton en bois de transformation", + "block.twilightforest.transformation_door": "Porte en bois de transformation", + "block.twilightforest.transformation_fence": "Barrière en bois de transformation", + "block.twilightforest.transformation_fence_gate": "Portillon en bois de transformation", + "block.twilightforest.transformation_leaves": "Feuilles d'arbre de transformation", + "block.twilightforest.transformation_log_core": "Coeur de transformation", + "block.twilightforest.transformation_planks": "Planches de bois de transformation", + "block.twilightforest.transformation_pressure_plate": "Plaque de pression en bois de transformation", + "block.twilightforest.transformation_sapling": "Pousse d'arbre de transformation", + "block.twilightforest.transformation_slab": "Dalle en bois de transformation", + "block.twilightforest.transformation_stairs": "Escaliers en bois de transformation", + "block.twilightforest.transformation_trapdoor": "Trappe en bois de transformation", + "block.twilightforest.trophy_pedestal": "Piédestal à trophée", + "block.twilightforest.twilight_oak_button": "Bouton en bois de chêne Twilight", + "block.twilightforest.twilight_oak_door": "Porte en bois de chêne Twilight", + "block.twilightforest.twilight_oak_fence": "Barrière en bois de chêne Twilight", + "block.twilightforest.twilight_oak_fence_gate": "Portillon en bois de chêne Twilight", + "block.twilightforest.twilight_oak_leaves": "Feuilles de chêne Twilight", + "block.twilightforest.twilight_oak_log": "Bûche de bois du Crépuscule", + "block.twilightforest.twilight_oak_planks": "Planches de bois de chêne Twilight", + "block.twilightforest.twilight_oak_pressure_plate": "Plaque de pression en bois de chêne Twilight", + "block.twilightforest.twilight_oak_sapling": "Pousse de chêne de la Twilight faible", + "block.twilightforest.twilight_oak_slab": "Dalle en bois de chêne Twilight", + "block.twilightforest.twilight_oak_stairs": "Escaliers en bois de chêne Twilight", + "block.twilightforest.twilight_oak_trapdoor": "Trappe en bois de chêne Twilight", + "block.twilightforest.twilight_oak_wood": "Bois de chêne Twilight", + "block.twilightforest.twilight_portal": "Portail de la Twilight Forest", + "block.twilightforest.uberous_soil": "Sol herbeux", + "block.twilightforest.uncrafting_table": "Établi de défabrication", + "block.twilightforest.underbrick": "Brique des dessous", + "block.twilightforest.underbrick_floor": "Sol de brique des dessous", + "block.twilightforest.unripe_trollber": "Trollber verte", + "block.twilightforest.ur_ghast_trophy": "Trophée d'Ur-Ghast", + "block.twilightforest.vanishing_block": "Bloc de disparition", + "block.twilightforest.violet_castle_door": "Porte de château violette", + "block.twilightforest.violet_castle_rune_brick": "Rune de brique de château violette", + "block.twilightforest.violet_force_field": "Champ de force violet", + "block.twilightforest.weathered_deadrock": "Deadrock altérée", + "block.twilightforest.wispy_cloud": "Nuage vaporeux", + "block.twilightforest.worn_castle_brick": "Brique de château usée", + "block.twilightforest.worn_castle_brick_stairs": "Escaliers en pierre de château usée", + "block.twilightforest.yellow_castle_door": "Porte de château jaune", + "block.twilightforest.yellow_castle_rune_brick": "Rune de brique de château jaune", + "commands.tffeature.center": "Centre de la fonctionnalité : %s", + "commands.tffeature.chunk": "Être dans le chunk de la fonctionnalité : %s", + "commands.tffeature.nearest": "La structure la plus proche est %s", + "commands.tffeature.none_nearby": "Impossible de trouver une fonctionnalité à proximité !", + "commands.tffeature.not_in_twilight_forest": "Vous n'êtes pas dans la dimension Twilight Forest", + "commands.tffeature.structure.conquer.status": "Drapeau de conquête de structure : %s", + "commands.tffeature.structure.conquer.update": "Le drapeau de conquête de structure était %s, changé pour %s", + "commands.tffeature.structure.inside": "Vous êtes dans une structure repère", + "commands.tffeature.structure.outside": "Vous n'êtes pas dans une structure repère", + "commands.tffeature.structure.required": "Vous n'êtes pas dans une structure", + "commands.tffeature.structure.spawn_info": "%s, Poids %s", + "commands.tffeature.structure.spawn_list": "La liste d'apparition pour cette zone est :", + "effect.twilightforest.frosted": "Givré", + "enchantment.twilightforest.chill_aura": "Aura de froid", + "enchantment.twilightforest.chill_aura.desc": "Ajoute une chance pour l'attaquant t'obtenir l'effet givré après avoir touché le porteur.", + "enchantment.twilightforest.destruction.desc": "Permet au bloc et à la chaîne de casser des blocs avec un niveau de minage supérieur.", + "enchantment.twilightforest.fire_react": "Réaction de Feu", + "enchantment.twilightforest.fire_react.desc": "Ajoute une chance pour l'attaquant d'être mis en feu après avoir touché le porteur.", + "entity.twilightforest.alpha_yeti": "Yéti Alpha", + "entity.twilightforest.armored_giant": "Géant en armure", + "entity.twilightforest.bighorn_sheep": "Mouflon d'Amérique", + "entity.twilightforest.blockchain_goblin": "Goblin de bloc et chaîne", + "entity.twilightforest.carminite_broodling": "Carminite couveuse", + "entity.twilightforest.carminite_golem": "Golem Carminite", + "entity.twilightforest.death_tome": "Tome de mort", + "entity.twilightforest.dwarf_rabbit": "Lapin nain", + "entity.twilightforest.fire_beetle": "Coléoptère de feu", + "entity.twilightforest.giant_miner": "Mineur géant", + "entity.twilightforest.hedge_spider": "Araignée des haies", + "entity.twilightforest.helmet_crab": "Casque crabe", + "entity.twilightforest.hostile_wolf": "Loup hostile", + "entity.twilightforest.hydra": "Hydre", + "entity.twilightforest.ice_crystal": "Cristal de glace", + "entity.twilightforest.king_spider": "Reine des araignées", + "entity.twilightforest.knight_phantom": "Chevalier fantôme", + "entity.twilightforest.lich_minion": "Serviteur du Liche", + "entity.twilightforest.lower_goblin_knight": "Chevalier goblin inférieur", + "entity.twilightforest.loyal_zombie": "Zombie loyal", + "entity.twilightforest.maze_slime": "Slime du labyrinthe", + "entity.twilightforest.minotaur": "Minotaure", + "entity.twilightforest.mist_wolf": "Loup de la brume", + "entity.twilightforest.mosquito_swarm": "Essaim de moustiques", + "entity.twilightforest.naga": "Nâga", + "entity.twilightforest.penguin": "Manchot", + "entity.twilightforest.pinch_beetle": "Coléoptère", + "entity.twilightforest.quest_ram": "Bélier de quête", + "entity.twilightforest.redcap_sapper": "Sapeur à casquette rouge", + "entity.twilightforest.skeleton_druid": "Squelette de druide", + "entity.twilightforest.slime_beetle": "Coléoptère visqueux", + "entity.twilightforest.snow_guardian": "Gardin de la neige", + "entity.twilightforest.snow_queen": "Reine des Neiges", + "entity.twilightforest.stable_ice_core": "Coeur de glace stable", + "entity.twilightforest.swarm_spider": "Essaim d'araignées", + "entity.twilightforest.tiny_bird": "Petit oiseau", + "entity.twilightforest.towerwood_borer": "Foreur de la Towerwood", + "entity.twilightforest.unstable_ice_core": "Coeur de glace instable", + "entity.twilightforest.upper_goblin_knight": "Chevalier goblin supérieur", + "entity.twilightforest.winter_wolf": "Loup d'hiver", + "entity.twilightforest.yeti": "Yéti", + "item.twilightforest.alpha_yeti_fur": "Fourrure de Yéti Alpha", + "item.twilightforest.arctic_boots": "Bottes arctiques", + "item.twilightforest.arctic_chestplate": "Manteau arctique", + "item.twilightforest.arctic_fur": "Fourrure arctique", + "item.twilightforest.arctic_helmet": "Capuche arctique", + "item.twilightforest.arctic_leggings": "Jambières arctiques", + "item.twilightforest.armor_shard": "Fragment d'armure", + "item.twilightforest.armor_shard_cluster": "Amas de fragments d'armure", + "item.twilightforest.block_and_chain": "Bloc et chaîne", + "item.twilightforest.borer_essence": "Essence de foreur", + "item.twilightforest.charm_of_keeping_1": "Charme de Keeping I", + "item.twilightforest.charm_of_keeping_2": "Charme de Keeping II", + "item.twilightforest.charm_of_keeping_3": "Charme de Keeping III", + "item.twilightforest.charm_of_life_1": "Charme de la vie I", + "item.twilightforest.charm_of_life_2": "Charme de la vie II", + "item.twilightforest.cooked_meef": "Steak de Meef", + "item.twilightforest.cooked_venison": "Steak de chevreuil", + "item.twilightforest.crumble_horn": "Corne en ruine", + "item.twilightforest.cube_of_annihilation": "Cube d'annihilation", + "item.twilightforest.cube_talisman": "Talisman du cube", + "item.twilightforest.diamond_minotaur_axe": "Hache en diamant du Minotaure", + "item.twilightforest.ender_bow": "Arc de l'Ender", + "item.twilightforest.fiery_blood": "Sang ardent", + "item.twilightforest.fiery_boots": "Bottes ardentes", + "item.twilightforest.fiery_chestplate": "Plastron ardent", + "item.twilightforest.fiery_helmet": "Casque ardent", + "item.twilightforest.fiery_ingot": "Lingot ardent", + "item.twilightforest.fiery_leggings": "Jambières ardentes", + "item.twilightforest.fiery_pickaxe": "Pioche ardente", + "item.twilightforest.fiery_sword": "Épée ardente", + "item.twilightforest.fiery_tears": "Larmes ardentes", + "item.twilightforest.filled_magic_map": "Carte magique", + "item.twilightforest.filled_maze_map": "Carte de labyrinthe", + "item.twilightforest.filled_ore_map": "Carte du labyrinthe/minerai", + "item.twilightforest.fortification_scepter": "Sceptre de fortification", + "item.twilightforest.giant_pickaxe": "Pioche de géant", + "item.twilightforest.giant_sword": "Épée de géant", + "item.twilightforest.glass_sword": "Épée en verre", + "item.twilightforest.gold_minotaur_axe": "Hache en or du Minotaure", + "item.twilightforest.hydra_chop": "Tranche d'Hydre", + "item.twilightforest.ice_bomb": "Bombe glacée", + "item.twilightforest.ice_bow": "Arc gelé", + "item.twilightforest.ice_sword": "Épée gelée", + "item.twilightforest.ironwood_axe": "Hache en bois de fer", + "item.twilightforest.ironwood_boots": "Bottes en bois de fer", + "item.twilightforest.ironwood_chestplate": "Plastron en bois de fer", + "item.twilightforest.ironwood_helmet": "Casque en bois de fer", + "item.twilightforest.ironwood_hoe": "Houe en bois de fer", + "item.twilightforest.ironwood_ingot": "Lingot en bois de fer", + "item.twilightforest.ironwood_leggings": "Jambières en bois de fer", + "item.twilightforest.ironwood_pickaxe": "Pioche en bois de fer", + "item.twilightforest.ironwood_shovel": "Pelle en bois de fer", + "item.twilightforest.ironwood_sword": "Épée en bois de fer", + "item.twilightforest.knightmetal_axe": "Hache chevaleresque", + "item.twilightforest.knightmetal_boots": "Bottes chevaleresques", + "item.twilightforest.knightmetal_chestplate": "Plastron chevaleresque", + "item.twilightforest.knightmetal_helmet": "Casque chevaleresque", + "item.twilightforest.knightmetal_ingot": "Lingot de métal de chevalier", + "item.twilightforest.knightmetal_leggings": "Jambières chevaleresques", + "item.twilightforest.knightmetal_pickaxe": "Pioche chevaleresque", + "item.twilightforest.knightmetal_ring": "Boucle de métal de chevalier", + "item.twilightforest.knightmetal_shield": "Bouclier chevaleresque", + "item.twilightforest.knightmetal_sword": "Épée chevaleresque", + "item.twilightforest.lamp_of_cinders": "Lampe de cendres", + "item.twilightforest.lifedrain_scepter": "Sceptre du drainage de vie", + "item.twilightforest.liveroot": "Racine vivante", + "item.twilightforest.magic_beans": "Haricots magiques", + "item.twilightforest.magic_map": "Carte magique vierge", + "item.twilightforest.magic_map_focus": "Foyer de carte magique", + "item.twilightforest.maze_map": "Carte de labyrinthe vierge", + "item.twilightforest.maze_map_focus": "Foyer de carte de labyrinthe", + "item.twilightforest.maze_wafer": "Tranche de labyrinthe", + "item.twilightforest.meef_stroganoff": "Stroganoff de Meef", + "item.twilightforest.moon_dial": "Cadran lunaire", + "item.twilightforest.moonworm_queen": "Reine du ver de lune", + "item.twilightforest.naga_chestplate": "Plastron en écailles de Nâga", + "item.twilightforest.naga_leggings": "Jambières en écailles de Nâga", + "item.twilightforest.naga_scale": "Écailles de Nâga", + "item.twilightforest.ore_magnet": "Aimant à minerais", + "item.twilightforest.ore_map": "Carte du labyrinthe/minerai vierge", + "item.twilightforest.ore_meter": "Mètre de minerai [WIP]", + "item.twilightforest.peacock_feather_fan": "Éventail de plumes de paon", + "item.twilightforest.phantom_chestplate": "Plastron de fantôme", + "item.twilightforest.phantom_helmet": "Casque de fantôme", + "item.twilightforest.raven_feather": "Plume de corbeau", + "item.twilightforest.raw_ironwood": "Matériaux en bois de fer bruts", + "item.twilightforest.raw_meef": "Viande de Meef crue", + "item.twilightforest.raw_venison": "Chevreuil cru", + "item.twilightforest.seeker_bow": "Arc du chercheur", + "item.twilightforest.steeleaf_axe": "Hache en Stealeaf", + "item.twilightforest.steeleaf_boots": "Bottes en Stealeaf", + "item.twilightforest.steeleaf_chestplate": "Plastron en Stealeaf", + "item.twilightforest.steeleaf_helmet": "Casque en Stealeaf", + "item.twilightforest.steeleaf_hoe": "Houe en Stealeaf", + "item.twilightforest.steeleaf_leggings": "Jambières en Stealeaf", + "item.twilightforest.steeleaf_pickaxe": "Pioche en Stealeaf", + "item.twilightforest.steeleaf_shovel": "Pelle en Stealeaf", + "item.twilightforest.steeleaf_sword": "Épée en Stealeaf", + "item.twilightforest.torchberries": "Torche des baies", + "item.twilightforest.tower_key": "Clé de la tour", + "item.twilightforest.transformation_powder": "Poudre de transformation", + "item.twilightforest.twilight_scepter": "Sceptre de la Twilight", + "item.twilightforest.yeti_boots": "Bottes de Yéti", + "item.twilightforest.yeti_chestplate": "Veste de Yéti", + "item.twilightforest.yeti_helmet": "Casque orné de Yéti", + "item.twilightforest.yeti_leggings": "Jambières de Yéti", + "item.twilightforest.zombie_scepter": "Sceptre du zombie", + "itemGroup.twilightforest.blocks": "Forêt du crépuscule : Blocs", + "itemGroup.twilightforest.equipment": "Forêt du crépuscule : Équipement", + "itemGroup.twilightforest.items": "Forêt du crépuscule : Objets", + "twilightforest.book.darktower.1": "§8[[Un carnet d'explorateur qui semble avoir résisté à une explosion]]§0\n\n_Cette tour a clairement des mécanismes qui ne me répondent pas. Leur magie aspire preque à reconnaître mon contact, mais elle ne le peut pas. C'est comme si les", + "twilightforest.book.darktower.2": "dispositifs de la tour étaient en train d'être supprimés par un groupe d'être-vivants environnant.\n\n§8[[Texte suivant]]§0\n\n_La magie semble émaner des profondeurs des forteresses proches. Elle ne peut pas", + "twilightforest.book.darktower.3": "provenir des goblins, puisque leur magie est séduisante mais floue.\n\n§8[[Texte suivant]]§0\n\n_Mon analyse indique qu'elle vient de plusieurs sources, opérant comme un groupe. J'y retournerai plus tard." +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/fra_de.json b/src/main/resources/assets/twilightforest/lang/fra_de.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/fra_de.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/fur_it.json b/src/main/resources/assets/twilightforest/lang/fur_it.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/fur_it.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/fy_nl.json b/src/main/resources/assets/twilightforest/lang/fy_nl.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/fy_nl.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/ga_ie.json b/src/main/resources/assets/twilightforest/lang/ga_ie.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/ga_ie.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/gd_gb.json b/src/main/resources/assets/twilightforest/lang/gd_gb.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/gd_gb.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/gl_es.json b/src/main/resources/assets/twilightforest/lang/gl_es.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/gl_es.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/haw_us.json b/src/main/resources/assets/twilightforest/lang/haw_us.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/haw_us.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/he_il.json b/src/main/resources/assets/twilightforest/lang/he_il.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/he_il.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/hi_in.json b/src/main/resources/assets/twilightforest/lang/hi_in.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/hi_in.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/hr_hr.json b/src/main/resources/assets/twilightforest/lang/hr_hr.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/hr_hr.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/hu_hu.json b/src/main/resources/assets/twilightforest/lang/hu_hu.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/hu_hu.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/hy_am.json b/src/main/resources/assets/twilightforest/lang/hy_am.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/hy_am.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/id_id.json b/src/main/resources/assets/twilightforest/lang/id_id.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/id_id.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/ig_ng.json b/src/main/resources/assets/twilightforest/lang/ig_ng.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/ig_ng.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/io_en.json b/src/main/resources/assets/twilightforest/lang/io_en.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/io_en.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/is_is.json b/src/main/resources/assets/twilightforest/lang/is_is.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/is_is.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/it_it.json b/src/main/resources/assets/twilightforest/lang/it_it.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/it_it.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/ja_jp.json b/src/main/resources/assets/twilightforest/lang/ja_jp.json new file mode 100644 index 0000000000..2c4c0e1f2a --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/ja_jp.json @@ -0,0 +1,1010 @@ +{ + "advancement.twilightforest.arborist": "狂気の樹木学者", + "advancement.twilightforest.arborist.desc": "斧とハサミを用意する。黄昏の森を隅々まで探索し、ここで手に入る樹木に関する全てのアイテムを手に入れる。クラフト又は戦利品チェストから、ハーフブロック、苗木、葉、もっともっと。全てを。", + "advancement.twilightforest.arctic_dyed": "最新ファッション", + "advancement.twilightforest.beanstalk": "ジャックと豆の木", + "advancement.twilightforest.experiment_115": "不思議な肉?", + "advancement.twilightforest.experiment_115.desc": "ケーキのように見えるが、これは...", + "advancement.twilightforest.experiment_115_2": "メモ: 大成功!", + "advancement.twilightforest.experiment_115_2.desc": "しっとりとしていてデリシャス!", + "advancement.twilightforest.experiment_115_3": "いつも、いつまでも、115", + "advancement.twilightforest.experiment_115_3.desc": "一日中食べよう エクスペリメント115♪ 115回食べよう エクスペリメント115♪ エクスペリメント115 ドットコム♪ ダブリューダブリューダブリュー ドット エクスペリメント115 ドットコム♪ 115年、いつでも食べよう エクスペリメント115 ドットコム♪ ダブリューダブリューダブリュー ドット エクスペリメント115 エクスペリメント115 (115回繰り返し) ドットコム♪", + "advancement.twilightforest.fiery_set": "血と涙の結晶", + "advancement.twilightforest.full_mettle_alchemist": "鋼の回復術師", + "advancement.twilightforest.ghast_trap": "タワーウッドの不思議な装置", + "advancement.twilightforest.ghast_trap.desc": "%2$sの近くで%1$sを倒して起動させ、%3$sを降下させる。", + "advancement.twilightforest.giants": "天にも昇る心地", + "advancement.twilightforest.glass_sword": "一撃必殺", + "advancement.twilightforest.glass_sword.desc": "この武器をうまく使いこなしてほしい。", + "advancement.twilightforest.hedge": "虫を踏みつける者", + "advancement.twilightforest.hill1": "ブーツをよこせ!", + "advancement.twilightforest.hill2": "何の騒音だ?", + "advancement.twilightforest.hill3": "私にはお見通しだ", + "advancement.twilightforest.hydra_chop": "ヒドラの肉だ!", + "advancement.twilightforest.kill_cicada": "静かに!", + "advancement.twilightforest.kill_hydra": "ヒドラスレイヤー", + "advancement.twilightforest.kill_lich": "死者を差し出せ", + "advancement.twilightforest.kill_naga": "やられたらやり返す!", + "advancement.twilightforest.lich_scepters": "力を合わせて!", + "advancement.twilightforest.magic_map": "何マイル先も見える", + "advancement.twilightforest.magic_map_focus": "火で書き込む", + "advancement.twilightforest.maze_map": "出口はどこだ", + "advancement.twilightforest.mazebreaker": "迷宮を砕く者", + "advancement.twilightforest.naga_armors": "ナーガの甲冑士", + "advancement.twilightforest.ore_map": "そんなに価値があるのか?", + "advancement.twilightforest.progress_glacier": "晴天", + "advancement.twilightforest.progress_knights": "カーミナイトの知識", + "advancement.twilightforest.progress_labyrinth": "極上のストロガノフ", + "advancement.twilightforest.progress_merge": "究極の対決", + "advancement.twilightforest.progress_troll": "もっと炎を", + "advancement.twilightforest.progress_trophy_pedestal": "資格を持つもの", + "advancement.twilightforest.progress_ur_ghast": "炎の涙", + "advancement.twilightforest.progress_yeti": "アルファの毛皮", + "advancement.twilightforest.quest_ram": "完璧なもこもこ", + "advancement.twilightforest.root": "黄昏の森", + "advancement.twilightforest.troll": "我々は少しトローリングをする", + "advancement.twilightforest.twilight_dining": "黄昏の晩餐", + "advancement.twilightforest.twilight_hunter": "森の静寂", + "biome.twilightforest.clearing": "黄昏の平地", + "biome.twilightforest.dark_forest": "闇の森", + "biome.twilightforest.dark_forest_center": "闇の森の中央", + "biome.twilightforest.dense_forest": "深い森", + "biome.twilightforest.dense_mushroom_forest": "深いキノコの森", + "biome.twilightforest.enchanted_forest": "神秘の森", + "biome.twilightforest.final_plateau": "最後の地", + "biome.twilightforest.fire_swamp": "焼け沼", + "biome.twilightforest.firefly_forest": "ホタルの森", + "biome.twilightforest.forest": "黄昏の森", + "biome.twilightforest.glacier": "黄昏の氷河", + "biome.twilightforest.highlands": "黄昏の高地", + "biome.twilightforest.lake": "黄昏の湖", + "biome.twilightforest.mushroom_forest": "キノコの森", + "biome.twilightforest.oak_savannah": "オークのサバンナ", + "biome.twilightforest.snowy_forest": "雪の森", + "biome.twilightforest.spooky_forest": "不気味な森", + "biome.twilightforest.stream": "黄昏の川", + "biome.twilightforest.swamp": "黄昏の沼地", + "biome.twilightforest.thornlands": "茨の大地", + "biome.twilightforest.underground": "地下", + "block.minecraft.banner.twilightforest.alpha_yeti.black": "黒色のアルファイエティの顔", + "block.minecraft.banner.twilightforest.alpha_yeti.blue": "青色のアルファイエティの顔", + "block.minecraft.banner.twilightforest.alpha_yeti.brown": "茶色のアルファイエティの顔", + "block.minecraft.banner.twilightforest.alpha_yeti.cyan": "青緑色のアルファイエティの顔", + "block.minecraft.banner.twilightforest.alpha_yeti.gray": "灰色のアルファイエティの顔", + "block.minecraft.banner.twilightforest.alpha_yeti.green": "緑色のアルファイエティの顔", + "block.minecraft.banner.twilightforest.alpha_yeti.light_blue": "空色のアルファイエティの顔", + "block.minecraft.banner.twilightforest.alpha_yeti.light_gray": "薄灰色のアルファイエティの顔", + "block.minecraft.banner.twilightforest.alpha_yeti.lime": "黄緑色のアルファイエティの顔", + "block.minecraft.banner.twilightforest.alpha_yeti.magenta": "赤紫色のアルファイエティの顔", + "block.minecraft.banner.twilightforest.alpha_yeti.orange": "橙色のアルファイエティの顔", + "block.minecraft.banner.twilightforest.alpha_yeti.pink": "桃色のアルファイエティの顔", + "block.minecraft.banner.twilightforest.alpha_yeti.purple": "紫色のアルファイエティの顔", + "block.minecraft.banner.twilightforest.alpha_yeti.red": "赤色のアルファイエティの顔", + "block.minecraft.banner.twilightforest.alpha_yeti.white": "白色のアルファイエティの顔", + "block.minecraft.banner.twilightforest.alpha_yeti.yellow": "黄色のアルファイエティの顔", + "block.minecraft.banner.twilightforest.hydra.black": "黒色のヒドラの炎", + "block.minecraft.banner.twilightforest.hydra.blue": "青色のヒドラの炎", + "block.minecraft.banner.twilightforest.hydra.brown": "茶色のヒドラの炎", + "block.minecraft.banner.twilightforest.hydra.cyan": "青緑色のヒドラの炎", + "block.minecraft.banner.twilightforest.hydra.gray": "灰色のヒドラの炎", + "block.minecraft.banner.twilightforest.hydra.green": "緑色のヒドラの炎", + "block.minecraft.banner.twilightforest.hydra.light_blue": "空色のヒドラの炎", + "block.minecraft.banner.twilightforest.hydra.light_gray": "薄灰色のヒドラの炎", + "block.minecraft.banner.twilightforest.hydra.lime": "黄緑色のヒドラの炎", + "block.minecraft.banner.twilightforest.hydra.magenta": "赤紫色のヒドラの炎", + "block.minecraft.banner.twilightforest.hydra.orange": "橙色のヒドラの炎", + "block.minecraft.banner.twilightforest.hydra.pink": "桃色のヒドラの炎", + "block.minecraft.banner.twilightforest.hydra.purple": "紫色のヒドラの炎", + "block.minecraft.banner.twilightforest.hydra.red": "赤色のヒドラの炎", + "block.minecraft.banner.twilightforest.hydra.white": "白色のヒドラの炎", + "block.minecraft.banner.twilightforest.hydra.yellow": "黄色のヒドラの炎", + "block.minecraft.banner.twilightforest.knight_phantom.black": "黒色の騎士のヘルム", + "block.minecraft.banner.twilightforest.knight_phantom.blue": "青色の騎士のヘルム", + "block.minecraft.banner.twilightforest.knight_phantom.brown": "茶色の騎士のヘルム", + "block.minecraft.banner.twilightforest.knight_phantom.cyan": "青緑色の騎士のヘルム", + "block.minecraft.banner.twilightforest.knight_phantom.gray": "灰色の騎士のヘルム", + "block.minecraft.banner.twilightforest.knight_phantom.green": "緑色の騎士のヘルム", + "block.minecraft.banner.twilightforest.knight_phantom.light_blue": "空色の騎士のヘルム", + "block.minecraft.banner.twilightforest.knight_phantom.light_gray": "薄灰色の騎士のヘルム", + "block.minecraft.banner.twilightforest.knight_phantom.lime": "黄緑色の騎士のヘルム", + "block.minecraft.banner.twilightforest.knight_phantom.magenta": "赤紫色の騎士のヘルム", + "block.minecraft.banner.twilightforest.knight_phantom.orange": "橙色の騎士のヘルム", + "block.minecraft.banner.twilightforest.knight_phantom.pink": "桃色の騎士のヘルム", + "block.minecraft.banner.twilightforest.knight_phantom.purple": "紫色の騎士のヘルム", + "block.minecraft.banner.twilightforest.knight_phantom.red": "赤色の騎士のヘルム", + "block.minecraft.banner.twilightforest.knight_phantom.white": "白色の騎士のヘルム", + "block.minecraft.banner.twilightforest.knight_phantom.yellow": "黄色の騎士のヘルム", + "block.minecraft.banner.twilightforest.lich.black": "黒色のリッチの王冠", + "block.minecraft.banner.twilightforest.lich.blue": "青色のリッチの王冠", + "block.minecraft.banner.twilightforest.lich.brown": "茶色のリッチの王冠", + "block.minecraft.banner.twilightforest.lich.cyan": "青緑色のリッチの王冠", + "block.minecraft.banner.twilightforest.lich.gray": "灰色のリッチの王冠", + "block.minecraft.banner.twilightforest.lich.green": "緑色のリッチの王冠", + "block.minecraft.banner.twilightforest.lich.light_blue": "空色のリッチの王冠", + "block.minecraft.banner.twilightforest.lich.light_gray": "薄灰色のリッチの王冠", + "block.minecraft.banner.twilightforest.lich.lime": "黄緑色のリッチの王冠", + "block.minecraft.banner.twilightforest.lich.magenta": "赤紫色のリッチの王冠", + "block.minecraft.banner.twilightforest.lich.orange": "橙色のリッチの王冠", + "block.minecraft.banner.twilightforest.lich.pink": "桃色のリッチの王冠", + "block.minecraft.banner.twilightforest.lich.purple": "紫色のリッチの王冠", + "block.minecraft.banner.twilightforest.lich.red": "赤色のリッチの王冠", + "block.minecraft.banner.twilightforest.lich.white": "白色のリッチの王冠", + "block.minecraft.banner.twilightforest.lich.yellow": "黄色のリッチの王冠", + "block.minecraft.banner.twilightforest.minoshroom.black": "黒色のミノッシュルームの斧", + "block.minecraft.banner.twilightforest.minoshroom.blue": "青色のミノッシュルームの斧", + "block.minecraft.banner.twilightforest.minoshroom.brown": "茶色のミノッシュルームの斧", + "block.minecraft.banner.twilightforest.minoshroom.cyan": "青緑色のミノッシュルームの斧", + "block.minecraft.banner.twilightforest.minoshroom.gray": "灰色のミノッシュルームの斧", + "block.minecraft.banner.twilightforest.minoshroom.green": "緑色のミノッシュルームの斧", + "block.minecraft.banner.twilightforest.minoshroom.light_blue": "空色のミノッシュルームの斧", + "block.minecraft.banner.twilightforest.minoshroom.light_gray": "薄灰色のミノッシュルームの斧", + "block.minecraft.banner.twilightforest.minoshroom.lime": "黄緑色のミノッシュルームの斧", + "block.minecraft.banner.twilightforest.minoshroom.magenta": "赤紫色のミノッシュルームの斧", + "block.minecraft.banner.twilightforest.minoshroom.orange": "橙色のミノッシュルームの斧", + "block.minecraft.banner.twilightforest.minoshroom.pink": "桃色のミノッシュルームの斧", + "block.minecraft.banner.twilightforest.minoshroom.purple": "紫色のミノッシュルームの斧", + "block.minecraft.banner.twilightforest.minoshroom.red": "赤色のミノッシュルームの斧", + "block.minecraft.banner.twilightforest.minoshroom.white": "白色のミノッシュルームの斧", + "block.minecraft.banner.twilightforest.minoshroom.yellow": "黄色のミノッシュルームの斧", + "block.minecraft.banner.twilightforest.naga.black": "黒色のナーガの鱗", + "block.minecraft.banner.twilightforest.naga.blue": "青色のナーガの鱗", + "block.minecraft.banner.twilightforest.naga.brown": "茶色のナーガの鱗", + "block.minecraft.banner.twilightforest.naga.cyan": "青緑色のナーガの鱗", + "block.minecraft.banner.twilightforest.naga.gray": "灰色のナーガの鱗", + "block.minecraft.banner.twilightforest.naga.green": "緑色のナーガの鱗", + "block.minecraft.banner.twilightforest.naga.light_blue": "空色のナーガの鱗", + "block.minecraft.banner.twilightforest.naga.light_gray": "薄灰色のナーガの鱗", + "block.minecraft.banner.twilightforest.naga.lime": "黄緑色のナーガの鱗", + "block.minecraft.banner.twilightforest.naga.magenta": "赤紫色のナーガの鱗", + "block.minecraft.banner.twilightforest.naga.orange": "橙色のナーガの鱗", + "block.minecraft.banner.twilightforest.naga.pink": "桃色のナーガの鱗", + "block.minecraft.banner.twilightforest.naga.purple": "紫色のナーガの鱗", + "block.minecraft.banner.twilightforest.naga.red": "赤色のナーガの鱗", + "block.minecraft.banner.twilightforest.naga.white": "白色のナーガの鱗", + "block.minecraft.banner.twilightforest.naga.yellow": "黄色のナーガの鱗", + "block.minecraft.banner.twilightforest.quest_ram.black": "黒色の色食みの羊の螺旋模様", + "block.minecraft.banner.twilightforest.quest_ram.blue": "青色の色食みの羊の螺旋模様", + "block.minecraft.banner.twilightforest.quest_ram.brown": "茶色の色食みの羊の螺旋模様", + "block.minecraft.banner.twilightforest.quest_ram.cyan": "青緑色の色食みの羊の螺旋模様", + "block.minecraft.banner.twilightforest.quest_ram.gray": "灰色の色食みの羊の螺旋模様", + "block.minecraft.banner.twilightforest.quest_ram.green": "緑色の色食みの羊の螺旋模様", + "block.minecraft.banner.twilightforest.quest_ram.light_blue": "空色の色食みの羊の螺旋模様", + "block.minecraft.banner.twilightforest.quest_ram.light_gray": "薄灰色の色食みの羊の螺旋模様", + "block.minecraft.banner.twilightforest.quest_ram.lime": "黄緑色の色食みの羊の螺旋模様", + "block.minecraft.banner.twilightforest.quest_ram.magenta": "赤紫色の色食みの羊の螺旋模様", + "block.minecraft.banner.twilightforest.quest_ram.orange": "橙色の色食みの羊の螺旋模様", + "block.minecraft.banner.twilightforest.quest_ram.pink": "桃色の色食みの羊の螺旋模様", + "block.minecraft.banner.twilightforest.quest_ram.purple": "紫色の色食みの羊の螺旋模様", + "block.minecraft.banner.twilightforest.quest_ram.red": "赤色の色食みの羊の螺旋模様", + "block.minecraft.banner.twilightforest.quest_ram.white": "白色の色食みの羊の螺旋模様", + "block.minecraft.banner.twilightforest.quest_ram.yellow": "黄色の色食みの羊の螺旋模様", + "block.minecraft.banner.twilightforest.snow_queen.black": "黒色の雪の女王の王冠", + "block.minecraft.banner.twilightforest.snow_queen.blue": "青色の雪の女王の王冠", + "block.minecraft.banner.twilightforest.snow_queen.brown": "茶色の雪の女王の王冠", + "block.minecraft.banner.twilightforest.snow_queen.cyan": "青緑色の雪の女王の王冠", + "block.minecraft.banner.twilightforest.snow_queen.gray": "灰色の雪の女王の王冠", + "block.minecraft.banner.twilightforest.snow_queen.green": "緑色の雪の女王の王冠", + "block.minecraft.banner.twilightforest.snow_queen.light_blue": "空色の雪の女王の王冠", + "block.minecraft.banner.twilightforest.snow_queen.light_gray": "薄灰色の雪の女王の王冠", + "block.minecraft.banner.twilightforest.snow_queen.lime": "黄緑色の雪の女王の王冠", + "block.minecraft.banner.twilightforest.snow_queen.magenta": "赤紫色の雪の女王の王冠", + "block.minecraft.banner.twilightforest.snow_queen.orange": "橙色の雪の女王の王冠", + "block.minecraft.banner.twilightforest.snow_queen.pink": "桃色の雪の女王の王冠", + "block.minecraft.banner.twilightforest.snow_queen.purple": "紫色の雪の女王の王冠", + "block.minecraft.banner.twilightforest.snow_queen.red": "赤色の雪の女王の王冠", + "block.minecraft.banner.twilightforest.snow_queen.white": "白色の雪の女王の王冠", + "block.minecraft.banner.twilightforest.snow_queen.yellow": "黄色の雪の女王の王冠", + "block.minecraft.banner.twilightforest.ur_ghast.black": "黒色のカーミナイトボーダー", + "block.minecraft.banner.twilightforest.ur_ghast.blue": "青色のカーミナイトボーダー", + "block.minecraft.banner.twilightforest.ur_ghast.brown": "茶色のカーミナイトボーダー", + "block.minecraft.banner.twilightforest.ur_ghast.cyan": "青緑色のカーミナイトボーダー", + "block.minecraft.banner.twilightforest.ur_ghast.gray": "灰色のカーミナイトボーダー", + "block.minecraft.banner.twilightforest.ur_ghast.green": "緑色のカーミナイトボーダー", + "block.minecraft.banner.twilightforest.ur_ghast.light_blue": "空色のカーミナイトボーダー", + "block.minecraft.banner.twilightforest.ur_ghast.light_gray": "薄灰色のカーミナイトボーダー", + "block.minecraft.banner.twilightforest.ur_ghast.lime": "黄緑色のカーミナイトボーダー", + "block.minecraft.banner.twilightforest.ur_ghast.magenta": "赤紫色のカーミナイトボーダー", + "block.minecraft.banner.twilightforest.ur_ghast.orange": "橙色のカーミナイトボーダー", + "block.minecraft.banner.twilightforest.ur_ghast.pink": "桃色のカーミナイトボーダー", + "block.minecraft.banner.twilightforest.ur_ghast.purple": "紫色のカーミナイトボーダー", + "block.minecraft.banner.twilightforest.ur_ghast.red": "赤色のカーミナイトボーダー", + "block.minecraft.banner.twilightforest.ur_ghast.white": "白色のカーミナイトボーダー", + "block.minecraft.banner.twilightforest.ur_ghast.yellow": "黄色のカーミナイトボーダー", + "block.twilightforest.acacia_banister": "アカシアの手すり", + "block.twilightforest.alpha_yeti_boss_spawner": "アルファイエティのボススポナー", + "block.twilightforest.alpha_yeti_trophy": "アルファイエティのトロフィー", + "block.twilightforest.arctic_fur_block": "防寒毛皮ブロック", + "block.twilightforest.aurora_block": "オーロラブロック", + "block.twilightforest.aurora_pillar": "オーロラの柱", + "block.twilightforest.aurora_slab": "オーロラのハーフブロック", + "block.twilightforest.auroralized_glass": "オーロラのガラス", + "block.twilightforest.banister.cycle": "斧で右クリックして形状を変更", + "block.twilightforest.beanstalk_leaves": "豆の木の葉", + "block.twilightforest.birch_banister": "シラカバの手すり", + "block.twilightforest.blue_castle_door": "キャッスルドア(青)", + "block.twilightforest.blue_castle_rune_brick": "ルーンレンガ(青)", + "block.twilightforest.blue_force_field": "フォースフィールド(青)", + "block.twilightforest.bold_castle_brick_pillar": "太いキャッスルレンガの柱", + "block.twilightforest.bold_castle_brick_stairs": "太いキャッスルレンガの階段", + "block.twilightforest.bold_stone_pillar": "太い石の柱", + "block.twilightforest.brown_thorns": "茨", + "block.twilightforest.built_block": "構築済みブロック", + "block.twilightforest.burnt_thorns": "焦げた茨", + "block.twilightforest.candelabra": "枝付き燭台", + "block.twilightforest.canopy_banister": "林冠木の手すり", + "block.twilightforest.canopy_bookshelf": "林冠木の本棚", + "block.twilightforest.canopy_button": "林冠木のボタン", + "block.twilightforest.canopy_chest": "林冠木のチェスト", + "block.twilightforest.canopy_door": "林冠木のドア", + "block.twilightforest.canopy_fence": "林冠木のフェンス", + "block.twilightforest.canopy_fence_gate": "林冠木のフェンスゲート", + "block.twilightforest.canopy_leaves": "林冠木の葉", + "block.twilightforest.canopy_log": "林冠木の原木", + "block.twilightforest.canopy_planks": "林冠木の板材", + "block.twilightforest.canopy_pressure_plate": "林冠木の感圧板", + "block.twilightforest.canopy_sapling": "林冠木の苗木", + "block.twilightforest.canopy_sign": "林冠木の看板", + "block.twilightforest.canopy_slab": "林冠木のハーフブロック", + "block.twilightforest.canopy_stairs": "林冠木の階段", + "block.twilightforest.canopy_trapdoor": "林冠木のトラップドア", + "block.twilightforest.canopy_wall_sign": "壁に付けられた林冠木の看板", + "block.twilightforest.canopy_wood": "林冠木の木", + "block.twilightforest.carminite_block": "カーミナイトブロック", + "block.twilightforest.carminite_builder": "カーミナイトビルダー", + "block.twilightforest.carminite_reactor": "カーミナイトリアクター", + "block.twilightforest.casket.broken": "あなたの形見の棺は大きなダメージを受けたため、これ以上アイテムを保持できません。棺の中のアイテムは地面に散らばりました。", + "block.twilightforest.casket.locked": "この棺は%sのみ開くことができます!", + "block.twilightforest.castle_brick": "キャッスルレンガ", + "block.twilightforest.castle_brick_stairs": "キャッスルレンガの階段", + "block.twilightforest.castle_roof_tile": "キャッスルルーフ", + "block.twilightforest.cicada": "セミ", + "block.twilightforest.cicada_jar": "瓶詰めセミ", + "block.twilightforest.cinder_furnace": "灰のかまど", + "block.twilightforest.cinder_log": "灰の原木 [未実装]", + "block.twilightforest.cinder_wood": "灰の板材", + "block.twilightforest.clover_patch": "クローバーパッチ", + "block.twilightforest.cracked_castle_brick": "ひび割れたキャッスルレンガ", + "block.twilightforest.cracked_castle_brick_stairs": "ひび割れたキャッスレンガの階段", + "block.twilightforest.cracked_deadrock": "ひび割れたデッドロック", + "block.twilightforest.cracked_mazestone": "ひび割れたメイズレンガ", + "block.twilightforest.cracked_underbrick": "ひび割れたアンダーブリック", + "block.twilightforest.creeper_skull_candle": "ろうそく付きのクリーパーの頭", + "block.twilightforest.creeper_wall_skull_candle": "壁に掛けたろうそく付きのクリーパーの頭", + "block.twilightforest.crimson_banister": "真紅の手すり", + "block.twilightforest.cut_mazestone": "彫刻されたメイズストーン", + "block.twilightforest.dark_button": "ダークウッドのボタン", + "block.twilightforest.dark_door": "ダークウッドのドア", + "block.twilightforest.dark_fence": "ダークウッドのフェンス", + "block.twilightforest.dark_fence_gate": "ダークウッドのフェンスゲート", + "block.twilightforest.dark_leaves": "ダークウッドの葉", + "block.twilightforest.dark_log": "ダークウッドの原木", + "block.twilightforest.dark_oak_banister": "ダークオークの手すり", + "block.twilightforest.dark_planks": "ダークウッドの板材", + "block.twilightforest.dark_pressure_plate": "ダークウッドの感圧板", + "block.twilightforest.dark_slab": "ダークウッドのハーフブロック", + "block.twilightforest.dark_stairs": "ダークウッドの階段", + "block.twilightforest.dark_trapdoor": "ダークウッドのトラップドア", + "block.twilightforest.darkwood_sapling": "ダークウッドの苗木", + "block.twilightforest.deadrock": "デッドロック", + "block.twilightforest.death_tome_spawner": "死者の書 スポナー", + "block.twilightforest.decorative_mazestone": "装飾されたメイズレンガ", + "block.twilightforest.empty_canopy_bookshelf": "空っぽの林冠木の本棚", + "block.twilightforest.encased_castle_brick_pillar": "覆われたキャッスルレンガの柱", + "block.twilightforest.encased_castle_brick_stairs": "覆われたキャッスルレンガの階段", + "block.twilightforest.encased_castle_brick_tile": "覆われたキャッスルレンガのタイル", + "block.twilightforest.encased_fire_jet": "間欠炎装置", + "block.twilightforest.encased_smoker": "噴煙装置", + "block.twilightforest.etched_nagastone": "エッチングナーガストーン", + "block.twilightforest.experiment_115": "エクスペリメント115", + "block.twilightforest.fiery_block": "灼熱鋼ブロック", + "block.twilightforest.final_boss_boss_spawner": "最後のボスのボススポナー", + "block.twilightforest.fire_jet": "間欠炎", + "block.twilightforest.firefly": "ホタル", + "block.twilightforest.firefly_jar": "瓶詰めホタル", + "block.twilightforest.firefly_particle_spawner": "ホタルの光 スポナー", + "block.twilightforest.fluffy_cloud": "ふわふわ雲", + "block.twilightforest.ghast_trap": "ガストトラップ", + "block.twilightforest.giant_cobblestone": "巨人の丸石", + "block.twilightforest.giant_leaves": "巨人の葉", + "block.twilightforest.giant_log": "巨人の原木", + "block.twilightforest.giant_obsidian": "巨人の黒曜石", + "block.twilightforest.green_force_field": "フォースフィールド(緑)", + "block.twilightforest.green_thorns": "緑の茨", + "block.twilightforest.hardened_dark_leaves": "厚みのあるダークウッドの葉", + "block.twilightforest.hedge": "生垣ブロック", + "block.twilightforest.hollow_acacia_log_climbable": "アカシアの原木の樹洞", + "block.twilightforest.hollow_acacia_log_horizontal": "アカシアの原木の樹洞", + "block.twilightforest.hollow_acacia_log_vertical": "アカシアの原木の樹洞", + "block.twilightforest.hollow_birch_log_climbable": "シラカバの原木の樹洞", + "block.twilightforest.hollow_birch_log_horizontal": "シラカバの原木の樹洞", + "block.twilightforest.hollow_birch_log_vertical": "シラカバの原木の樹洞", + "block.twilightforest.hollow_crimson_stem_climbable": "真紅の幹の樹洞", + "block.twilightforest.hollow_crimson_stem_horizontal": "真紅の幹の樹洞", + "block.twilightforest.hollow_crimson_stem_vertical": "真紅の幹の樹洞", + "block.twilightforest.hollow_dark_log_climbable": "ダークウッドの原木の樹洞", + "block.twilightforest.hollow_dark_log_horizontal": "ダークウッドの原木の樹洞", + "block.twilightforest.hollow_dark_log_vertical": "ダークウッドの原木の樹洞", + "block.twilightforest.hollow_dark_oak_log_climbable": "ダークオークの原木の樹洞", + "block.twilightforest.hollow_dark_oak_log_horizontal": "ダークオークの原木の樹洞", + "block.twilightforest.hollow_dark_oak_log_vertical": "ダークオークの原木の樹洞", + "block.twilightforest.hollow_jungle_log_climbable": "ジャングルの原木の樹洞", + "block.twilightforest.hollow_jungle_log_horizontal": "ジャングルの原木の樹洞", + "block.twilightforest.hollow_jungle_log_vertical": "ジャングルの原木の樹洞", + "block.twilightforest.hollow_mangrove_log_climbable": "マングローブの原木の樹洞", + "block.twilightforest.hollow_mangrove_log_horizontal": "マングローブの原木の樹洞", + "block.twilightforest.hollow_mangrove_log_vertical": "マングローブの原木の樹洞", + "block.twilightforest.hollow_mining_log_climbable": "採掘の木の原木の樹洞", + "block.twilightforest.hollow_mining_log_horizontal": "採掘の木の原木の樹洞", + "block.twilightforest.hollow_mining_log_vertical": "採掘の木の原木の樹洞", + "block.twilightforest.hollow_oak_log_climbable": "オークの原木の樹洞", + "block.twilightforest.hollow_oak_log_horizontal": "オークの原木の樹洞", + "block.twilightforest.hollow_oak_log_vertical": "オークの原木の樹洞", + "block.twilightforest.hollow_oak_sapling": "丈夫なトワイライトオークの苗木", + "block.twilightforest.hollow_sorting_log_climbable": "分類の木の原木の樹洞", + "block.twilightforest.hollow_sorting_log_horizontal": "分類の木の原木の樹洞", + "block.twilightforest.hollow_sorting_log_vertical": "分類の木の原木の樹洞", + "block.twilightforest.hollow_spruce_log_climbable": "トウヒの原木の樹洞", + "block.twilightforest.hollow_spruce_log_horizontal": "トウヒの原木の樹洞", + "block.twilightforest.hollow_spruce_log_vertical": "トウヒの原木の樹洞", + "block.twilightforest.hollow_time_log_climbable": "刻の木の原木の樹洞", + "block.twilightforest.hollow_time_log_horizontal": "刻の木の原木の樹洞", + "block.twilightforest.hollow_time_log_vertical": "刻の木の原木の樹洞", + "block.twilightforest.hollow_transformation_log_climbable": "変化の木の原木の樹洞", + "block.twilightforest.hollow_transformation_log_horizontal": "変化の木の原木の樹洞", + "block.twilightforest.hollow_transformation_log_vertical": "変化の木の原木の樹洞", + "block.twilightforest.hollow_twilight_oak_log_climbable": "トワイライトオークの原木の樹洞", + "block.twilightforest.hollow_twilight_oak_log_horizontal": "トワイライトオークの原木の樹洞", + "block.twilightforest.hollow_twilight_oak_log_vertical": "トワイライトオークの原木の樹洞", + "block.twilightforest.hollow_vangrove_log_climbable": "マングローブの原木の樹洞", + "block.twilightforest.hollow_vangrove_log_horizontal": "マングローブの原木の樹洞", + "block.twilightforest.hollow_vangrove_log_vertical": "マングローブの原木の樹洞", + "block.twilightforest.hollow_warped_stem_climbable": "歪んだ幹の樹洞", + "block.twilightforest.hollow_warped_stem_horizontal": "歪んだ幹の樹洞", + "block.twilightforest.hollow_warped_stem_vertical": "歪んだ幹の樹洞", + "block.twilightforest.huge_lily_pad": "巨大なスイレンの葉", + "block.twilightforest.huge_mushgloom_stem": "巨大ヒカリダケの幹", + "block.twilightforest.huge_stalk": "巨大な茎", + "block.twilightforest.huge_water_lily": "巨大なスイレン", + "block.twilightforest.hydra_boss_spawner": "ヒドラのボススポナー", + "block.twilightforest.hydra_trophy": "ヒドラのトロフィー", + "block.twilightforest.iron_ladder": "鉄のはしご", + "block.twilightforest.ironwood_block": "樹鉄ブロック", + "block.twilightforest.jungle_banister": "ジャングルの手すり", + "block.twilightforest.keepsake_casket": "形見の棺", + "block.twilightforest.knight_phantom_boss_spawner": "ナイトファントムのボススポナー", + "block.twilightforest.knight_phantom_trophy": "ナイトファントムのトロフィー", + "block.twilightforest.knightmetal_block": "ナイトメタルブロック", + "block.twilightforest.lich_boss_spawner": "リッチのボススポナー", + "block.twilightforest.lich_tower_miniature_structure": "リッチタワーのミニチュア", + "block.twilightforest.lich_trophy": "リッチのトロフィー", + "block.twilightforest.liveroot_block": "生きている根ブロック", + "block.twilightforest.locked_vanishing_block": "鍵付き扉ブロック", + "block.twilightforest.mangrove_banister": "マングローブの手すり", + "block.twilightforest.mangrove_button": "マングローブのボタン", + "block.twilightforest.mangrove_chest": "マングローブのチェスト", + "block.twilightforest.mangrove_door": "マングローブのドア", + "block.twilightforest.mangrove_fence": "マングローブのフェンス", + "block.twilightforest.mangrove_fence_gate": "マングローブのフェンスゲート", + "block.twilightforest.mangrove_leaves": "マングローブの葉", + "block.twilightforest.mangrove_log": "マングローブの原木", + "block.twilightforest.mangrove_planks": "マングローブの板材", + "block.twilightforest.mangrove_pressure_plate": "マングローブの感圧板", + "block.twilightforest.mangrove_root": "マングローブの根ブロック", + "block.twilightforest.mangrove_sapling": "トワイライトマングローブの苗木", + "block.twilightforest.mangrove_sign": "マングローブの看板", + "block.twilightforest.mangrove_slab": "マングローブのハーフブロック", + "block.twilightforest.mangrove_stairs": "マングローブの階段", + "block.twilightforest.mangrove_trapdoor": "マングローブのトラップドア", + "block.twilightforest.mangrove_wall_sign": "壁に付けられたマングローブの看板", + "block.twilightforest.mangrove_wood": "マングローブの木", + "block.twilightforest.mayapple": "メイアップル", + "block.twilightforest.mazestone": "メイズストーン", + "block.twilightforest.mazestone_border": "ボーダー柄のメイズストーン", + "block.twilightforest.mazestone_brick": "メイズレンガ", + "block.twilightforest.mazestone_mosaic": "モザイク柄のメイズストーン", + "block.twilightforest.mining_banister": "採掘の木の手すり", + "block.twilightforest.mining_button": "採掘の木のボタン", + "block.twilightforest.mining_chest": "採掘の木のチェスト", + "block.twilightforest.mining_door": "採掘の木のドア", + "block.twilightforest.mining_fence": "採掘の木のフェンス", + "block.twilightforest.mining_fence_gate": "採掘の木のフェンスゲート", + "block.twilightforest.mining_leaves": "採掘の木の葉", + "block.twilightforest.mining_log": "採掘の木の原木", + "block.twilightforest.mining_log_core": "採掘コア", + "block.twilightforest.mining_planks": "採掘の木の板材", + "block.twilightforest.mining_pressure_plate": "採掘の木の感圧板", + "block.twilightforest.mining_sapling": "採掘の木の苗木", + "block.twilightforest.mining_sign": "採掘の木の看板", + "block.twilightforest.mining_slab": "採掘の木のハーフブロック", + "block.twilightforest.mining_stairs": "採掘の木の階段", + "block.twilightforest.mining_trapdoor": "採掘の木のトラップドア", + "block.twilightforest.mining_wall_sign": "壁に付けられた採掘の木の看板", + "block.twilightforest.minoshroom_boss_spawner": "ミノッシュルームのボススポナー", + "block.twilightforest.minoshroom_trophy": "ミノッシュルームトロフィー", + "block.twilightforest.moonworm": "月光虫", + "block.twilightforest.moss_patch": "苔", + "block.twilightforest.mossy_castle_brick": "苔むしたキャッスルレンガ", + "block.twilightforest.mossy_castle_brick_stairs": "苔むしたキャッスルレンガの階段", + "block.twilightforest.mossy_etched_nagastone": "苔むしたエッチングナーガストーン", + "block.twilightforest.mossy_mazestone": "苔むしたメイズレンガ", + "block.twilightforest.mossy_nagastone_pillar": "苔むしたナーガストーンの柱", + "block.twilightforest.mossy_nagastone_stairs_left": "苔むしたナーガストーンの階段(左)", + "block.twilightforest.mossy_nagastone_stairs_right": "苔むしたナーガストーンの階段(右)", + "block.twilightforest.mossy_underbrick": "苔むしたアンダーブリック", + "block.twilightforest.mushgloom": "ヒカリダケ", + "block.twilightforest.naga_boss_spawner": "ナーガのボススポナー", + "block.twilightforest.naga_courtyard_miniature_structure": "ナーガ神殿のミニチュア", + "block.twilightforest.naga_trophy": "ナーガのトロフィー", + "block.twilightforest.nagastone": "ナーガストーン", + "block.twilightforest.nagastone_head": "ナーガストーン(頭)", + "block.twilightforest.nagastone_pillar": "ナーガストーンの柱", + "block.twilightforest.nagastone_stairs_left": "ナーガストーンの階段(左)", + "block.twilightforest.nagastone_stairs_right": "ナーガストーンの階段(右)", + "block.twilightforest.oak_banister": "オークの手すり", + "block.twilightforest.orange_force_field": "フォースフィールド(橙)", + "block.twilightforest.player_skull_candle": "ろうそく付きのプレイヤーの頭", + "block.twilightforest.player_skull_candle.named": "ろうそく付きの%sの頭", + "block.twilightforest.player_wall_skull_candle": "壁に掛けたろうそく付きのプレイヤーの頭", + "block.twilightforest.potted_canopy_sapling": "植えられた林冠木の苗木", + "block.twilightforest.potted_darkwood_sapling": "植えられたダークウッドの苗木", + "block.twilightforest.potted_dead_thorn": "植えられた焦げた茨", + "block.twilightforest.potted_green_thorn": "植えられた緑の茨", + "block.twilightforest.potted_hollow_oak_sapling": "植えられた丈夫なトワイライトオークの苗木", + "block.twilightforest.potted_mayapple": "植えられたメイアップル", + "block.twilightforest.potted_mining_sapling": "植えられた採掘の木の苗木", + "block.twilightforest.potted_mushgloom": "植えられたヒカリダケ", + "block.twilightforest.potted_rainbow_oak_sapling": "植えられたレインボーオークの苗木", + "block.twilightforest.potted_sorting_sapling": "植えられた分類の木の苗木", + "block.twilightforest.potted_thorn": "植えられた茨", + "block.twilightforest.potted_time_sapling": "植えられた刻の木の苗木", + "block.twilightforest.potted_transformation_sapling": "植えられた変化の木の苗木", + "block.twilightforest.potted_twilight_oak_sapling": "植えられたひ弱なトワイライトオークの苗木", + "block.twilightforest.quest_ram_trophy": "色食みの羊のトロフィー", + "block.twilightforest.rainbow_oak_leaves": "レインボーオークの葉", + "block.twilightforest.rainbow_oak_sapling": "レインボーオークの苗木", + "block.twilightforest.reactor_debris": "リアクターの残骸", + "block.twilightforest.reappearing_block": "扉ブロック", + "block.twilightforest.red_thread": "赤い糸", + "block.twilightforest.root": "根ブロック", + "block.twilightforest.root_strand": "ひげ根", + "block.twilightforest.skeleton_skull_candle": "ろうそく付きのスケルトンの頭蓋骨", + "block.twilightforest.skeleton_wall_skull_candle": "壁に掛けたろうそく付きのスケルトンの頭蓋骨", + "block.twilightforest.slider": "滑走トラップ", + "block.twilightforest.smoker": "噴煙", + "block.twilightforest.snow_queen_boss_spawner": "雪の女王のボススポナー", + "block.twilightforest.snow_queen_trophy": "雪の女王のトロフィー", + "block.twilightforest.sorting_banister": "分類の木の手すり", + "block.twilightforest.sorting_button": "分類の木のボタン", + "block.twilightforest.sorting_chest": "分類の木のチェスト", + "block.twilightforest.sorting_door": "分類の木のドア", + "block.twilightforest.sorting_fence": "分類の木のフェンス", + "block.twilightforest.sorting_fence_gate": "分類の木のフェンスゲート", + "block.twilightforest.sorting_leaves": "分類の木の葉", + "block.twilightforest.sorting_log": "分類の木の原木", + "block.twilightforest.sorting_log_core": "分類エンジン", + "block.twilightforest.sorting_planks": "分類の木の板材", + "block.twilightforest.sorting_pressure_plate": "分類の木の感圧板", + "block.twilightforest.sorting_sapling": "分類の木の苗木", + "block.twilightforest.sorting_sign": "分類の木の看板", + "block.twilightforest.sorting_slab": "分類の木のハーフブロック", + "block.twilightforest.sorting_stairs": "分類の木の階段", + "block.twilightforest.sorting_trapdoor": "分類の木のトラップドア", + "block.twilightforest.sorting_wall_sign": "壁に付けられた分類の木の看板", + "block.twilightforest.spiral_bricks": "螺旋状の石レンガ", + "block.twilightforest.spruce_banister": "トウヒの手すり", + "block.twilightforest.steeleaf_block": "葉鋼ブロック", + "block.twilightforest.stripped_canopy_log": "樹皮を剥いだ林冠木の原木", + "block.twilightforest.stripped_canopy_wood": "樹皮を剥いだ林冠木の木", + "block.twilightforest.stripped_dark_log": "樹皮を剥いだダークウッドの原木", + "block.twilightforest.stripped_mangrove_log": "樹皮を剥いだマングローブの原木", + "block.twilightforest.stripped_mangrove_wood": "樹皮を剥いだマングローブの木", + "block.twilightforest.stripped_mining_log": "樹皮を剥いだ採掘の木の原木", + "block.twilightforest.stripped_sorting_log": "樹皮を剥いだ分類の木の原木", + "block.twilightforest.stripped_time_log": "樹皮を剥いだ刻の木の原木", + "block.twilightforest.stripped_transformation_log": "樹皮を剥いだ変化の木の原木", + "block.twilightforest.stripped_twilight_oak_log": "樹皮を剥いだトワイライトオークの原木", + "block.twilightforest.stripped_twilight_oak_wood": "樹皮を剥いだトワイライトオークの木", + "block.twilightforest.stronghold_shield": "拠点の防壁", + "block.twilightforest.thick_castle_brick": "厚みのあるキャッスルレンガ", + "block.twilightforest.thorn_leaves": "茨の葉", + "block.twilightforest.thorn_rose": "茨の薔薇", + "block.twilightforest.time_banister": "刻の木の手すり", + "block.twilightforest.time_button": "刻の木のボタン", + "block.twilightforest.time_chest": "刻の木のチェスト", + "block.twilightforest.time_door": "刻の木のドア", + "block.twilightforest.time_fence": "刻の木のフェンス", + "block.twilightforest.time_fence_gate": "刻の木のフェンスゲート", + "block.twilightforest.time_leaves": "刻の木の葉", + "block.twilightforest.time_log": "刻の木の原木", + "block.twilightforest.time_log_core": "刻の時辰儀", + "block.twilightforest.time_planks": "刻の木の板材", + "block.twilightforest.time_pressure_plate": "刻の木の感圧板", + "block.twilightforest.time_sapling": "刻の木の苗木", + "block.twilightforest.time_sign": "刻の木の看板", + "block.twilightforest.time_slab": "刻の木のハーフブロック", + "block.twilightforest.time_stairs": "刻の木の階段", + "block.twilightforest.time_trapdoor": "刻の木のトラップドア", + "block.twilightforest.time_wall_sign": "壁に付けられた刻の木の看板", + "block.twilightforest.torchberry_plant": "トーチベリー", + "block.twilightforest.towerwood": "タワーウッド", + "block.twilightforest.transformation_banister": "変化の木の手すり", + "block.twilightforest.transformation_button": "変化の木のボタン", + "block.twilightforest.transformation_chest": "変化の木のチェスト", + "block.twilightforest.transformation_door": "変化の木のドア", + "block.twilightforest.transformation_fence": "変化の木のフェンス", + "block.twilightforest.transformation_fence_gate": "変化の木のフェンスゲート", + "block.twilightforest.transformation_leaves": "変化の木の葉", + "block.twilightforest.transformation_log": "変化の木の原木", + "block.twilightforest.transformation_log_core": "変化の心", + "block.twilightforest.transformation_planks": "変化の木の板材", + "block.twilightforest.transformation_pressure_plate": "変化の木の感圧板", + "block.twilightforest.transformation_sapling": "変化の木の苗木", + "block.twilightforest.transformation_sign": "変化の木の看板", + "block.twilightforest.transformation_slab": "変化の木のハーフブロック", + "block.twilightforest.transformation_stairs": "変化の木の階段", + "block.twilightforest.transformation_trapdoor": "変化の木のトラップドア", + "block.twilightforest.transformation_wall_sign": "壁に付けられた変化の木の看板", + "block.twilightforest.trollber": "トロールベリー", + "block.twilightforest.trollsteinn": "トロール石", + "block.twilightforest.trollvidr": "トロールベリーのツタ", + "block.twilightforest.trophy_pedestal": "トロフィーの台座", + "block.twilightforest.twilight_oak_banister": "トワイライトオークの手すり", + "block.twilightforest.twilight_oak_button": "トワイライトオークのボタン", + "block.twilightforest.twilight_oak_chest": "トワイライトオークのチェスト", + "block.twilightforest.twilight_oak_door": "トワイライトオークのドア", + "block.twilightforest.twilight_oak_fence": "トワイライトオークのフェンス", + "block.twilightforest.twilight_oak_fence_gate": "トワイライトオークのフェンスゲート", + "block.twilightforest.twilight_oak_leaves": "トワイライトオークの葉", + "block.twilightforest.twilight_oak_log": "トワイライトオークの原木", + "block.twilightforest.twilight_oak_planks": "トワイライトオークの板材", + "block.twilightforest.twilight_oak_pressure_plate": "トワイライトオークの感圧板", + "block.twilightforest.twilight_oak_sapling": "ひ弱なトワイライトオークの苗木", + "block.twilightforest.twilight_oak_sign": "トワイライトオークの看板", + "block.twilightforest.twilight_oak_slab": "トワイライトオークのハーフブロック", + "block.twilightforest.twilight_oak_stairs": "トワイライトオークの階段", + "block.twilightforest.twilight_oak_trapdoor": "トワイライトオークのトラップドア", + "block.twilightforest.twilight_oak_wood": "トワイライトオークの木", + "block.twilightforest.twilight_portal": "黄昏の森ポータル", + "block.twilightforest.twisted_stone": "ねじれ模様の石", + "block.twilightforest.twisted_stone_pillar": "ねじれ模様の石の柱", + "block.twilightforest.uberous_soil": "培養土", + "block.twilightforest.uncrafting_table": "解体作業台", + "block.twilightforest.underbrick": "アンダーブリック", + "block.twilightforest.underbrick_floor": "アンダーブリックの床", + "block.twilightforest.unripe_trollber": "未熟なトロールベリー", + "block.twilightforest.ur_ghast_boss_spawner": "ウルガストのボススポナー", + "block.twilightforest.ur_ghast_trophy": "ウルガストのトロフィー", + "block.twilightforest.vangrove_banister": "マングローブの手すり", + "block.twilightforest.vanishing_block": "消失扉ブロック", + "block.twilightforest.violet_castle_door": "キャッスルドア(紫)", + "block.twilightforest.violet_castle_rune_brick": "ルーンレンガ(紫)", + "block.twilightforest.violet_force_field": "フォースフィールド(紫)", + "block.twilightforest.warped_banister": "歪んだ手すり", + "block.twilightforest.weathered_deadrock": "風化したデッドロック", + "block.twilightforest.wispy_cloud": "薄雲", + "block.twilightforest.wither_skeleton_skull_candle": "ろうそく付きのウィザースケルトンの頭蓋骨", + "block.twilightforest.wither_skeleton_wall_skull_candle": "壁に掛けたろうそく付きのウィザースケルトンの頭蓋骨", + "block.twilightforest.worn_castle_brick": "かすれたキャッスルレンガ", + "block.twilightforest.worn_castle_brick_stairs": "かすれたキャッスルレンガの階段", + "block.twilightforest.yellow_castle_door": "キャッスルドア(黄)", + "block.twilightforest.yellow_castle_rune_brick": "ルーンレンガ(黄)", + "block.twilightforest.zombie_skull_candle": "ろうそく付きのゾンビの頭", + "block.twilightforest.zombie_wall_skull_candle": "壁に掛けたろうそく付きのゾンビの頭", + "commands.tffeature.center": "ダンジョンの中心: %s", + "commands.tffeature.chunk": "チャンクにいるか: %s", + "commands.tffeature.nearest": "一番近いダンジョンは%sです", + "commands.tffeature.not_in_twilight_forest": "ここは黄昏の森ディメンジョンではありません", + "commands.tffeature.structure.conquer.status": "構造物の攻略済みフラグ: %s", + "commands.tffeature.structure.conquer.update": "構造物の攻略済みフラグを、%sから%sに変更しました", + "commands.tffeature.structure.required": "あなたは構造物の中にいません", + "commands.tffeature.structure.spawn_info": "%s, 重量 %s", + "death.attack.twilightforest.axing": "%1$sは%2$sにみじん切りにされた", + "death.attack.twilightforest.axing.item": "%1$sは%2$sの%3$sによってみじん切りにされた", + "death.attack.twilightforest.chillingBreath": "%1$sは雪の女王に氷漬けにされた", + "death.attack.twilightforest.chillingBreath.player": "%1$sは%2$sから逃げようとして雪の女王に氷漬けにされた", + "death.attack.twilightforest.frozen": "%1$sは%2$sのアイスボムによって氷漬けにされた", + "death.attack.twilightforest.frozen.item": "%1$sは%2$sの%3$sによって氷漬けにされた", + "death.attack.twilightforest.ghastTear": "%1$sは炎の涙に焼かれた", + "death.attack.twilightforest.ghastTear.player": "%1$sは%2$sから逃げようとして炎の涙に焼かれた", + "death.attack.twilightforest.haunt": "%1$sは%2$sの巣窟に参加した", + "death.attack.twilightforest.hydraBite": "%1$sの皮膚はヒドラによって引き裂かれた", + "death.attack.twilightforest.hydraBite.player": "%1$sの皮膚は%2$sから逃げようとしてヒドラによって引き裂かれた", + "death.attack.twilightforest.hydraFire": "%1$sはヒドラに生きながら燃やされた", + "death.attack.twilightforest.hydraFire.player": "%1$sは%2$sから逃げようとして生きながら燃やされた", + "death.attack.twilightforest.leafBrain": "%1$sの脳は%2$sによって葉っぱにされた", + "death.attack.twilightforest.leafBrain.item": "%1$sの脳は%2$sの%3$sによって葉っぱにされた", + "death.attack.twilightforest.lichBolt": "リッチの狙いは%1$sを上回った", + "death.attack.twilightforest.lichBolt.player": "リッチと%2$sの狙いは%1$sを上回った", + "death.attack.twilightforest.lichBomb": "%1$sはリッチの爆発魔法に倒された", + "death.attack.twilightforest.lichBomb.player": "%1$sは%2$sから逃げようとしてリッチの爆発魔法に倒された", + "death.attack.twilightforest.lostWords": "%1$sは%2$sに殺された後に言葉を失った", + "death.attack.twilightforest.lostWords.item": "%1$sは%2$sの%3$sによって殺された後に言葉を失った", + "death.attack.twilightforest.moonworm": "%1$sは月光虫で撃たれた", + "death.attack.twilightforest.scorched": "%1$sは%2$sに燃やされた", + "death.attack.twilightforest.scorched.item": "%1$sは%2$sの%3$sによって燃やされた", + "death.attack.twilightforest.snowballFight": "%1$sは%2$sとの雪合戦に負けた", + "death.attack.twilightforest.snowballFight.item": "%1$sは%3$sを使う%2$sとの雪合戦に負けた", + "death.attack.twilightforest.squish": "%1$sは雪の女王に押しつぶされた", + "death.attack.twilightforest.squish.player": "%1$sは%2$sから逃げようとして雪の女王に押しつぶされた", + "death.attack.twilightforest.thorns": "%1$sは茨の中に足を踏み入れた", + "death.attack.twilightforest.thorns.player": "%1$sは%2$sから逃げようとして茨の中に足を踏み入れた", + "death.attack.twilightforest.thrownAxe": "%1$sは投げられた斧で斬首された", + "death.attack.twilightforest.thrownAxe.player": "%1$sは%2$sから逃げようとして投げられた斧で斬首された", + "death.attack.twilightforest.thrownPickaxe": "%1$sは投げられたツルハシで斬首された", + "death.attack.twilightforest.thrownPickaxe.player": "%1$sは%2$sから逃げようとして投げられたツルハシで斬首された", + "death.attack.twilightforest.yeeted": "%1$sは最後に%2$sに投げ捨てられた", + "death.attack.twilightforest.yeeted.item": "%1$sは最後に%3$sを持つ%2$sに投げ捨てられた", + "dimension.twilightforest.twilightforest": "黄昏の森", + "effect.twilightforest.frosted": "凍結", + "enchantment.twilightforest.chill_aura": "凍えるオーラ", + "enchantment.twilightforest.chill_aura.desc": "着用者を攻撃してきた者に対して凍結させる確率を上げる。", + "enchantment.twilightforest.destruction": "破壊衝動", + "enchantment.twilightforest.destruction.desc": "モーニングスターが迅速かつ広い範囲でブロックを破壊できるようにします。", + "enchantment.twilightforest.fire_react": "炎のオーラ", + "enchantment.twilightforest.fire_react.desc": "着用者を攻撃してきた者に対して発火させる確率を上げる。", + "entity.twilightforest.alpha_yeti": "アルファイエティ", + "entity.twilightforest.armored_giant": "巨人(剣)", + "entity.twilightforest.bighorn_sheep": "オオツノヒツジ", + "entity.twilightforest.blockchain_goblin": "鉄球使いゴブリン", + "entity.twilightforest.boat": "ボート", + "entity.twilightforest.carminite_broodling": "カーミナイトブルードリング", + "entity.twilightforest.carminite_ghastguard": "カーミナイトガスト(守護兵)", + "entity.twilightforest.carminite_ghastling": "カーミナイトガスト", + "entity.twilightforest.carminite_golem": "カーミナイトゴーレム", + "entity.twilightforest.chain_block": "モーニングスター", + "entity.twilightforest.charm_effect": "護石の効果", + "entity.twilightforest.chest_boat": "チェスト付きのボート", + "entity.twilightforest.cube_of_annihilation": "破滅のキューブ", + "entity.twilightforest.death_tome": "死者の書", + "entity.twilightforest.dwarf_rabbit": "黄昏ウサギ", + "entity.twilightforest.falling_ice": "落下する氷", + "entity.twilightforest.fire_beetle": "ファイアビートル", + "entity.twilightforest.giant_miner": "巨人(ツルハシ)", + "entity.twilightforest.hedge_spider": "生垣蜘蛛", + "entity.twilightforest.helmet_crab": "カブトヤドカリ", + "entity.twilightforest.hostile_wolf": "凶暴なオオカミ", + "entity.twilightforest.hydra": "ヒドラ", + "entity.twilightforest.hydra_mortar": "ヒドラの強打", + "entity.twilightforest.ice_arrow": "氷の矢", + "entity.twilightforest.ice_crystal": "アイスクリスタル", + "entity.twilightforest.ice_snowball": "氷の雪玉", + "entity.twilightforest.king_spider": "キングスパイダー", + "entity.twilightforest.knight_phantom": "ナイトファントム", + "entity.twilightforest.kobold": "コボルト", + "entity.twilightforest.lich_bolt": "リッチの攻撃", + "entity.twilightforest.lich_bomb": "爆発するリッチの攻撃", + "entity.twilightforest.lich_minion": "リッチのしもべ", + "entity.twilightforest.lower_goblin_knight": "ゴブリン騎士(下)", + "entity.twilightforest.loyal_zombie": "ロイヤルゾンビ", + "entity.twilightforest.maze_slime": "迷宮スライム", + "entity.twilightforest.minoshroom": "ミノッシュルーム", + "entity.twilightforest.minotaur": "ミノタウロス", + "entity.twilightforest.mist_wolf": "ミストウルフ", + "entity.twilightforest.moonworm_shot": "月光虫", + "entity.twilightforest.mosquito_swarm": "空腹蚊柱", + "entity.twilightforest.naga": "ナーガ", + "entity.twilightforest.nature_bolt": "自然の攻撃", + "entity.twilightforest.penguin": "ペンギン", + "entity.twilightforest.pinch_beetle": "ピンチビートル", + "entity.twilightforest.protection_box": "進捗保護の箱", + "entity.twilightforest.quest_ram": "色食みの羊", + "entity.twilightforest.redcap_sapper": "レッドキャップ工兵", + "entity.twilightforest.rising_zombie": "ゾンビ", + "entity.twilightforest.seeker_arrow": "シーカーの矢", + "entity.twilightforest.skeleton_druid": "スケルトンドルイド", + "entity.twilightforest.slider": "動く滑走トラップ", + "entity.twilightforest.slime_beetle": "スライムビートル", + "entity.twilightforest.slime_blob": "スライムの弾", + "entity.twilightforest.snow_guardian": "スノーガーディアン", + "entity.twilightforest.snow_queen": "雪の女王", + "entity.twilightforest.stable_ice_core": "安定したアイスコア", + "entity.twilightforest.swarm_spider": "群れ蜘蛛", + "entity.twilightforest.thrown_wep": "投げられた武器", + "entity.twilightforest.tiny_bird": "小鳥", + "entity.twilightforest.tome_bolt": "死者の書の攻撃", + "entity.twilightforest.towerwood_borer": "タワーウッドボーラー", + "entity.twilightforest.unstable_ice_core": "不安定なアイスコア", + "entity.twilightforest.upper_goblin_knight": "ゴブリン騎士(上)", + "entity.twilightforest.ur_ghast": "ウルガスト", + "entity.twilightforest.wand_bolt": "黄昏の杖の攻撃", + "entity.twilightforest.winter_wolf": "ウィンターウルフ", + "entity.twilightforest.yeti": "イエティ", + "item.twilightforest.alpha_yeti_banner_pattern": "旗の模様", + "item.twilightforest.alpha_yeti_banner_pattern.desc": "アルファイエティの顔", + "item.twilightforest.alpha_yeti_fur": "アルファイエティの毛皮", + "item.twilightforest.alpha_yeti_spawn_egg": "アルファイエティのスポーンエッグ", + "item.twilightforest.arctic_boots": "防寒ブーツ", + "item.twilightforest.arctic_chestplate": "防寒ジャケット", + "item.twilightforest.arctic_fur": "防寒毛皮", + "item.twilightforest.arctic_helmet": "防寒フード", + "item.twilightforest.arctic_leggings": "防寒レギンス", + "item.twilightforest.armor_shard": "アーマーシャード", + "item.twilightforest.armor_shard_cluster": "アーマーシャードのクラスター", + "item.twilightforest.armored_giant_spawn_egg": "巨人(剣)のスポーンエッグ", + "item.twilightforest.bighorn_sheep_spawn_egg": "オオツノヒツジのスポーンエッグ", + "item.twilightforest.block_and_chain": "モーニングスター", + "item.twilightforest.blockchain_goblin_spawn_egg": "鉄球使いゴブリンのスポーンエッグ", + "item.twilightforest.borer_essence": "ボーラーエッセンス", + "item.twilightforest.brittle_potion_flask": "割れやすいポーションフラスコ", + "item.twilightforest.canopy_boat": "林冠木のボート", + "item.twilightforest.canopy_chest_boat": "チェスト付きの林冠木のボート", + "item.twilightforest.carminite": "カーミナイト", + "item.twilightforest.carminite_broodling_spawn_egg": "カーミナイトブルードリングのスポーンエッグ", + "item.twilightforest.carminite_ghastguard_spawn_egg": "カーミナイトガスト(守護兵)のスポーンエッグ", + "item.twilightforest.carminite_ghastling_spawn_egg": "カーミナイトガストのスポーンエッグ", + "item.twilightforest.carminite_golem_spawn_egg": "カーミナイトゴーレムのスポーンエッグ", + "item.twilightforest.charm_of_keeping_1": "保護の護石Lv1", + "item.twilightforest.charm_of_keeping_2": "保護の護石Lv2", + "item.twilightforest.charm_of_keeping_3": "保護の護石Lv3", + "item.twilightforest.charm_of_life_1": "命の護石Lv1", + "item.twilightforest.charm_of_life_2": "命の護石Lv2", + "item.twilightforest.cooked_meef": "ミーフステーキ", + "item.twilightforest.cooked_venison": "黄昏鹿肉ステーキ", + "item.twilightforest.crumble_horn": "山鳴りの角笛", + "item.twilightforest.cube_of_annihilation": "破滅のキューブ", + "item.twilightforest.cube_talisman": "キューブのお守り", + "item.twilightforest.death_tome_spawn_egg": "死者の書のスポーンエッグ", + "item.twilightforest.diamond_minotaur_axe": "ダイヤモンドのミノタウロスの斧", + "item.twilightforest.dwarf_rabbit_spawn_egg": "黄昏ウサギのスポーンエッグ", + "item.twilightforest.ender_bow": "エンダーボウ", + "item.twilightforest.fiery_blood": "灼熱の血", + "item.twilightforest.fiery_boots": "灼熱のブーツ", + "item.twilightforest.fiery_chestplate": "灼熱のプレート", + "item.twilightforest.fiery_helmet": "灼熱のヘルム", + "item.twilightforest.fiery_ingot": "灼熱鋼インゴット", + "item.twilightforest.fiery_leggings": "灼熱のレギンス", + "item.twilightforest.fiery_pickaxe": "灼熱のツルハシ", + "item.twilightforest.fiery_sword": "灼熱の剣", + "item.twilightforest.fiery_tears": "灼熱の涙", + "item.twilightforest.filled_magic_map": "魔法の地図", + "item.twilightforest.filled_maze_map": "迷宮の地図", + "item.twilightforest.filled_ore_map": "迷宮/鉱石の地図", + "item.twilightforest.fire_beetle_spawn_egg": "ファイアビートルのスポーンエッグ", + "item.twilightforest.fortification_scepter": "守りの杖", + "item.twilightforest.giant_miner_spawn_egg": "巨人(ツルハシ)のスポーンエッグ", + "item.twilightforest.giant_pickaxe": "巨人のツルハシ", + "item.twilightforest.giant_sword": "巨人の剣", + "item.twilightforest.glass_sword": "ガラスの剣", + "item.twilightforest.gold_minotaur_axe": "金のミノタウロスの斧", + "item.twilightforest.greater_potion_flask": "優れたポーションフラスコ", + "item.twilightforest.hedge_spider_spawn_egg": "生垣蜘蛛のスポーンエッグ", + "item.twilightforest.helmet_crab_spawn_egg": "カブトヤドカリのスポーンエッグ", + "item.twilightforest.hostile_wolf_spawn_egg": "凶暴な狼のスポーンエッグ", + "item.twilightforest.hydra_banner_pattern": "旗の模様", + "item.twilightforest.hydra_banner_pattern.desc": "ヒドラの炎", + "item.twilightforest.hydra_chop": "ヒドラ肉", + "item.twilightforest.hydra_spawn_egg": "ヒドラのスポーンエッグ", + "item.twilightforest.ice_bomb": "アイスボム", + "item.twilightforest.ice_bow": "アイスボウ", + "item.twilightforest.ice_crystal_spawn_egg": "アイスクリスタルのスポーンエッグ", + "item.twilightforest.ice_sword": "アイスソード", + "item.twilightforest.ironwood_axe": "樹鉄の斧", + "item.twilightforest.ironwood_boots": "樹鉄ブーツ", + "item.twilightforest.ironwood_chestplate": "樹鉄プレート", + "item.twilightforest.ironwood_helmet": "樹鉄ヘルム", + "item.twilightforest.ironwood_hoe": "樹鉄のクワ", + "item.twilightforest.ironwood_ingot": "樹鉄インゴット", + "item.twilightforest.ironwood_leggings": "樹鉄レギンス", + "item.twilightforest.ironwood_pickaxe": "樹鉄のツルハシ", + "item.twilightforest.ironwood_shovel": "樹鉄のシャベル", + "item.twilightforest.ironwood_sword": "樹鉄の剣", + "item.twilightforest.king_spider_spawn_egg": "キングスパイダーのスポーンエッグ", + "item.twilightforest.knight_phantom_banner_pattern": "旗の模様", + "item.twilightforest.knight_phantom_banner_pattern.desc": "騎士のヘルム", + "item.twilightforest.knight_phantom_spawn_egg": "ナイトファントムのスポーンエッグ", + "item.twilightforest.knightmetal_axe": "騎士の斧", + "item.twilightforest.knightmetal_boots": "騎士のブーツ", + "item.twilightforest.knightmetal_chestplate": "騎士のプレート", + "item.twilightforest.knightmetal_helmet": "騎士のヘルム", + "item.twilightforest.knightmetal_ingot": "ナイトメタルインゴット", + "item.twilightforest.knightmetal_leggings": "騎士のグリーヴ", + "item.twilightforest.knightmetal_pickaxe": "騎士のツルハシ", + "item.twilightforest.knightmetal_ring": "ナイトメタルの輪", + "item.twilightforest.knightmetal_shield": "騎士の盾", + "item.twilightforest.knightmetal_sword": "騎士の剣", + "item.twilightforest.kobold_spawn_egg": "コボルトのスポーンエッグ", + "item.twilightforest.lamp_of_cinders": "灰のランプ", + "item.twilightforest.lich_banner_pattern": "旗の模様", + "item.twilightforest.lich_banner_pattern.desc": "リッチの王冠", + "item.twilightforest.lifedrain_scepter": "吸精の杖", + "item.twilightforest.liveroot": "生きている根", + "item.twilightforest.lower_goblin_knight_spawn_egg": "ゴブリン騎士のスポーンエッグ", + "item.twilightforest.magic_beans": "魔法の豆", + "item.twilightforest.magic_map": "白紙の魔法の地図", + "item.twilightforest.magic_map_focus": "魔法の地図の核", + "item.twilightforest.mangrove_boat": "マングローブのボート", + "item.twilightforest.mangrove_chest_boat": "チェスト付きのマングローブのボート", + "item.twilightforest.maze_map": "白紙の迷宮の地図", + "item.twilightforest.maze_map_focus": "迷宮の地図の核", + "item.twilightforest.maze_slime_spawn_egg": "迷宮スライムのスポーンエッグ", + "item.twilightforest.maze_wafer": "迷宮ウエハース", + "item.twilightforest.mazebreaker_pickaxe": "メイズブレイカー", + "item.twilightforest.meef_stroganoff": "ミーフストロガノフ", + "item.twilightforest.minoshroom_banner_pattern": "旗の模様", + "item.twilightforest.minoshroom_banner_pattern.desc": "ミノッシュルームの斧", + "item.twilightforest.minoshroom_spawn_egg": "ミノッシュルームのスポーンエッグ", + "item.twilightforest.minotaur_spawn_egg": "ミノタウロスのスポーンエッグ", + "item.twilightforest.mist_wolf_spawn_egg": "ミストウルフのスポーンエッグ", + "item.twilightforest.moon_dial": "月齢計", + "item.twilightforest.moon_dial.phase_0": "満月", + "item.twilightforest.moon_dial.phase_1": "更待月", + "item.twilightforest.moon_dial.phase_2": "下弦の月", + "item.twilightforest.moon_dial.phase_3": "有明月", + "item.twilightforest.moon_dial.phase_4": "新月", + "item.twilightforest.moon_dial.phase_5": "三日月", + "item.twilightforest.moon_dial.phase_6": "上弦の月", + "item.twilightforest.moon_dial.phase_7": "十日夜の月", + "item.twilightforest.moon_dial.phase_unknown": "月の満ち欠けにおける不確かさ", + "item.twilightforest.moonworm_queen": "女王月光虫", + "item.twilightforest.mosquito_swarm_spawn_egg": "空腹蚊柱のスポーンエッグ", + "item.twilightforest.music_disc_findings": "レコード", + "item.twilightforest.music_disc_home": "レコード", + "item.twilightforest.music_disc_maker": "レコード", + "item.twilightforest.music_disc_motion": "レコード", + "item.twilightforest.music_disc_radiance": "レコード", + "item.twilightforest.music_disc_steps": "レコード", + "item.twilightforest.music_disc_superstitious": "レコード", + "item.twilightforest.music_disc_thread": "レコード", + "item.twilightforest.music_disc_wayfarer": "レコード", + "item.twilightforest.naga_banner_pattern": "旗の模様", + "item.twilightforest.naga_banner_pattern.desc": "ナーガの鱗", + "item.twilightforest.naga_chestplate": "ナーガアーマー(胴)", + "item.twilightforest.naga_leggings": "ナーガアーマー(脚)", + "item.twilightforest.naga_scale": "ナーガの鱗", + "item.twilightforest.naga_spawn_egg": "ナーガのスポーンエッグ", + "item.twilightforest.ore_magnet": "鉱石磁石", + "item.twilightforest.ore_map": "白紙の迷宮/鉱石の地図", + "item.twilightforest.ore_meter": "鉱石メーター", + "item.twilightforest.peacock_feather_fan": "孔雀扇", + "item.twilightforest.penguin_spawn_egg": "ペンギンのスポーンエッグ", + "item.twilightforest.phantom_chestplate": "ファントムプレート", + "item.twilightforest.phantom_helmet": "ファントムヘルム", + "item.twilightforest.pinch_beetle_spawn_egg": "ピンチビートルのスポーンエッグ", + "item.twilightforest.quest_ram_banner_pattern": "旗の模様", + "item.twilightforest.quest_ram_banner_pattern.desc": "色食みの羊の螺旋模様", + "item.twilightforest.quest_ram_spawn_egg": "色食みの羊のスポーンエッグ", + "item.twilightforest.raven_feather": "カラスの羽根", + "item.twilightforest.raw_ironwood": "樹鉄の素", + "item.twilightforest.raw_meef": "生のミーフ", + "item.twilightforest.raw_venison": "生の黄昏鹿肉", + "item.twilightforest.redcap_sapper_spawn_egg": "レッドキャップ工兵のスポーンエッグ", + "item.twilightforest.seeker_bow": "シーカーボウ", + "item.twilightforest.skeleton_druid_spawn_egg": "スケルトンドルイドのスポーンエッグ", + "item.twilightforest.skull_candle.desc": "数量: %s本の %s Candle", + "item.twilightforest.skull_candle.desc.multiple": "数量: %s本の %s Candles", + "item.twilightforest.slime_beetle_spawn_egg": "スライムビートルのスポーンエッグ", + "item.twilightforest.snow_guardian_spawn_egg": "スノーガーディアンのスポーンエッグ", + "item.twilightforest.snow_queen_banner_pattern": "旗の模様", + "item.twilightforest.snow_queen_banner_pattern.desc": "雪の女王の王冠", + "item.twilightforest.snow_queen_spawn_egg": "雪の女王のスポーンエッグ", + "item.twilightforest.stable_ice_core_spawn_egg": "安定したアイスコアのスポーンエッグ", + "item.twilightforest.steeleaf_axe": "葉鋼の斧", + "item.twilightforest.steeleaf_boots": "葉鋼のブーツ", + "item.twilightforest.steeleaf_chestplate": "葉鋼のプレート", + "item.twilightforest.steeleaf_helmet": "葉鋼のヘルム", + "item.twilightforest.steeleaf_hoe": "葉鋼のクワ", + "item.twilightforest.steeleaf_ingot": "葉鋼", + "item.twilightforest.steeleaf_leggings": "葉鋼のレギンス", + "item.twilightforest.steeleaf_pickaxe": "葉鋼のツルハシ", + "item.twilightforest.steeleaf_shovel": "葉鋼のシャベル", + "item.twilightforest.steeleaf_sword": "葉鋼の剣", + "item.twilightforest.swarm_spider_spawn_egg": "群れ蜘蛛のスポーンエッグ", + "item.twilightforest.tiny_bird_spawn_egg": "小鳥のスポーンエッグ", + "item.twilightforest.torchberries": "トーチベリーの実", + "item.twilightforest.tower_key": "タワーキー", + "item.twilightforest.towerwood_borer_spawn_egg": "タワーウッドボーラーのスポーンエッグ", + "item.twilightforest.transformation_powder": "変化の粉", + "item.twilightforest.twilight_oak_boat": "トワイライトオークのボート", + "item.twilightforest.twilight_oak_chest_boat": "チェスト付きのトワイライトオークのボート", + "item.twilightforest.twilight_scepter": "黄昏の杖", + "item.twilightforest.unstable_ice_core_spawn_egg": "不安定なアイスコアのスポーンエッグ", + "item.twilightforest.ur_ghast_banner_pattern": "旗の模様", + "item.twilightforest.ur_ghast_banner_pattern.desc": "カーミナイトボーダー", + "item.twilightforest.ur_ghast_spawn_egg": "ウルガストのスポーンエッグ", + "item.twilightforest.winter_wolf_spawn_egg": "ウィンターウルフのスポーンエッグ", + "item.twilightforest.yeti_boots": "イエティブーツ", + "item.twilightforest.yeti_chestplate": "イエティジャケット", + "item.twilightforest.yeti_helmet": "イエティの角兜", + "item.twilightforest.yeti_leggings": "イエティレギンス", + "item.twilightforest.yeti_spawn_egg": "イエティのスポーンエッグ", + "item.twilightforest.zombie_scepter": "ゾンビの杖", + "itemGroup.twilightforest.blocks": "黄昏の森: ブロック", + "itemGroup.twilightforest.equipment": "黄昏の森: 装備", + "itemGroup.twilightforest.items": "黄昏の森: アイテム", + "stat.twilightforest.e115_slices_eaten": "エクスペリメント115の一切れを食べた回数", + "stat.twilightforest.tf_shields_broken": "守りの盾が破壊された回数", + "stat.twilightforest.torchberries_harvested": "トーチベリーの実を収穫した回数", + "stat.twilightforest.trophy_pedestals_activated": "トロフィーの台座が作動した回数", + "stat.twilightforest.uncrafting_table_interactions": "解体作業台を使用した回数", + "structure.twilightforest.aurora_palace": "オーロラの宮殿", + "structure.twilightforest.dark_tower": "ダークタワー", + "structure.twilightforest.hedge_maze": "生垣迷路", + "structure.twilightforest.hydra_lair": "ヒドラの巣", + "structure.twilightforest.knight_stronghold": "騎士の拠点", + "structure.twilightforest.labyrinth": "ミノタウロスの迷宮", + "structure.twilightforest.large_hollow_hill": "亡霊鉱山(大)", + "structure.twilightforest.lich_tower": "リッチタワー", + "structure.twilightforest.medium_hollow_hill": "亡霊鉱山(中)", + "structure.twilightforest.mushroom_tower": "キノコタワー", + "structure.twilightforest.naga_courtyard": "ナーガ神殿", + "structure.twilightforest.quest_grove": "霊羊の遺跡", + "structure.twilightforest.small_hollow_hill": "亡霊鉱山(小)", + "structure.twilightforest.yeti_cave": "イエティの洞穴", + "subtitles.twilightforest.block.beanstalk.grow": "地響き", + "subtitles.twilightforest.block.bug.squish": "虫が押しつぶされる :(", + "subtitles.twilightforest.block.casket.close": "形見の棺が閉じられる", + "subtitles.twilightforest.block.casket.locked": "形見の棺がクリックされる", + "subtitles.twilightforest.block.casket.open": "形見の棺が開く", + "subtitles.twilightforest.block.core.time": "刻の木が時間を刻む", + "subtitles.twilightforest.block.core.transformation": "変化の木が音を立てる", + "subtitles.twilightforest.block.door.reappear": "キャッスルドアが再生する", + "subtitles.twilightforest.block.door.vanish": "キャッスルドアが消える", + "subtitles.twilightforest.block.ghast_trap.ambient": "ガストトラップが繰り返し鳴る", + "subtitles.twilightforest.block.ghast_trap.spindown": "ガストトラップが停止する", + "subtitles.twilightforest.block.ghast_trap.warmup": "ガストトラップが動く", + "subtitles.twilightforest.block.jet.active": "間欠炎が炎を放つ", + "subtitles.twilightforest.block.jet.pop": "間欠炎が発射される", + "subtitles.twilightforest.block.torchberry.harvest": "トーチベリーの実がポンと音を立てる", + "subtitles.twilightforest.block.vanish.unlock": "タワーウッドのドアがアンロックされる", + "subtitles.twilightforest.entity.boar.ambient": "黄昏イノシシが鳴く", + "subtitles.twilightforest.entity.boar.death": "黄昏イノシシが死ぬ", + "subtitles.twilightforest.entity.boar.hurt": "黄昏イノシシがダメージを受ける", + "subtitles.twilightforest.entity.deer.ambient": "黄昏鹿が鳴く", + "subtitles.twilightforest.entity.deer.death": "黄昏鹿が死ぬ", + "subtitles.twilightforest.entity.deer.hurt": "黄昏鹿がダメージを受ける", + "subtitles.twilightforest.entity.dwarf_rabbit.ambient": "黄昏ウサギが鳴く", + "subtitles.twilightforest.entity.dwarf_rabbit.death": "黄昏ウサギが死ぬ", + "subtitles.twilightforest.entity.dwarf_rabbit.hurt": "黄昏ウサギがダメージを受ける", + "subtitles.twilightforest.entity.hydra.growl": "ヒドラが唸る", + "subtitles.twilightforest.entity.hydra.hurt": "ヒドラがダメージを受ける", + "subtitles.twilightforest.entity.hydra.roar": "ヒドラが雄叫びを上げる", + "subtitles.twilightforest.entity.hydra.shoot_fire": "ヒドラが炎を吐く", + "subtitles.twilightforest.entity.hydra.warn": "ヒドラが噛み付こうとする", + "subtitles.twilightforest.entity.ice.death": "アイスコアが死ぬ", + "subtitles.twilightforest.entity.ice.hurt": "アイスコアがダメージを受ける", + "subtitles.twilightforest.entity.kobold.ambient": "コボルトがぶつぶつ言う", + "subtitles.twilightforest.entity.kobold.death": "コボルトが死ぬ", + "subtitles.twilightforest.entity.kobold.hurt": "コボルトがダメージを受ける", + "subtitles.twilightforest.entity.kobold.munch": "コボルトが食べ物をむしゃむしゃ食べる", + "subtitles.twilightforest.entity.lich.ambient": "トワイライトリッチが呼吸をする", + "subtitles.twilightforest.entity.lich.death": "トワイライトリッチが死ぬ", + "subtitles.twilightforest.entity.lich.hurt": "トワイライトリッチがダメージを受ける", + "subtitles.twilightforest.entity.lich.shoot": "トワイライトリッチが弾を放つ", + "subtitles.twilightforest.entity.lich.teleport": "トワイライトリッチがテレポートする", + "subtitles.twilightforest.entity.minion.ambient": "リッチのしもべがうめく", + "subtitles.twilightforest.entity.minion.death": "リッチのしもべが死ぬ", + "subtitles.twilightforest.entity.minion.hurt": "リッチのしもべがダメージを受ける", + "subtitles.twilightforest.entity.minion.summon": "リッチが新たなしもべを召喚する", + "subtitles.twilightforest.entity.minoshroom.ambient": "ミノッシュルームが鳴く", + "subtitles.twilightforest.entity.minoshroom.death": "ミノッシュルームが死ぬ", + "subtitles.twilightforest.entity.minoshroom.hurt": "ミノッシュルームがダメージを受ける", + "subtitles.twilightforest.entity.minotaur.ambient": "ミノタウロスが鳴く", + "subtitles.twilightforest.entity.minotaur.death": "ミノタウロスが死ぬ", + "subtitles.twilightforest.entity.minotaur.hurt": "ミノタウロスがダメージを受ける", + "subtitles.twilightforest.entity.mosquito.ambient": "空腹蚊柱が羽音を立てる", + "subtitles.twilightforest.entity.naga.hiss": "ナーガが鳴く", + "subtitles.twilightforest.entity.naga.hurt": "ナーガがダメージを受ける", + "subtitles.twilightforest.entity.naga.rattle": "ナーガがガラガラ音を立てる", + "subtitles.twilightforest.entity.raven.caw": "黄昏カラスが鳴く", + "subtitles.twilightforest.entity.redcap.ambient": "レッドキャップゴブリンがけらけら笑う", + "subtitles.twilightforest.entity.redcap.death": "レッドキャップゴブリンが苦しみうめく", + "subtitles.twilightforest.entity.redcap.hurt": "レッドキャップゴブリンが悲鳴を上げる", + "subtitles.twilightforest.entity.tear.break": "ウルガストの涙が砕ける", + "subtitles.twilightforest.entity.troll.throw_rock": "トロールがブロックを放り投げる", + "subtitles.twilightforest.entity.wraith.ambient": "トワイライトレイスがあえぐ", + "subtitles.twilightforest.entity.wraith.death": "トワイライトレイスが死ぬ", + "subtitles.twilightforest.entity.wraith.hurt": "トワイライトレイスがダメージを受ける", + "subtitles.twilightforest.entity.yeti.death": "イエティが死ぬ", + "subtitles.twilightforest.entity.yeti.growl": "イエティが唸る", + "subtitles.twilightforest.entity.yeti.hurt": "イエティがダメージを受ける", + "subtitles.twilightforest.item.charm.keep": "保護の護石がアイテムを守る", + "subtitles.twilightforest.item.flask.break": "割れやすいフラスコが粉々になる", + "subtitles.twilightforest.item.flask.crack": "割れやすいフラスコにひびが入る", + "subtitles.twilightforest.item.flask.fill": "ポーションフラスコに注ぐ", + "subtitles.twilightforest.item.moonworm.squish": "月光虫を打つ", + "subtitles.twilightforest.item.scepter.drain": "吸精の杖が体力を奪う", + "subtitles.twilightforest.item.scepter.pearl": "黄昏の杖がパールを放つ", + "twilightforest.book.darktower.1": "§8[[冒険者のノート]]\n爆発に耐えたようだ§0\n\nこの塔の装置は、私には反応しない。魔法は反応しているようだが、駄目だ。塔の装置が近くの強力なグループによって抑制されているようだ。", + "twilightforest.book.darktower.2": "§8[[次のページ]]§0\n\n近くの拠点の奥から魔力が供給されているようだ。それはゴブリンのものではなく、強力だが焦点が合っていないようだ。拠点にはまだ何かいるようだ。", + "twilightforest.book.darktower.3": "§8[[次のページ]]§0\n\n私の分析では、この魔力は何らかのグループから発せられているようだ。補給をして、拠点に戻ることにしよう..." +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/jbo_en.json b/src/main/resources/assets/twilightforest/lang/jbo_en.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/jbo_en.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/ka_ge.json b/src/main/resources/assets/twilightforest/lang/ka_ge.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/ka_ge.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/kk_kz.json b/src/main/resources/assets/twilightforest/lang/kk_kz.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/kk_kz.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/kn_in.json b/src/main/resources/assets/twilightforest/lang/kn_in.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/kn_in.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/ko_kr.json b/src/main/resources/assets/twilightforest/lang/ko_kr.json new file mode 100644 index 0000000000..da3a6bb2a7 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/ko_kr.json @@ -0,0 +1,702 @@ +{ + "advancement.twilightforest.arborist": "미친 듯한 산림학자", + "advancement.twilightforest.arborist.desc": "도끼와 가위를 준비하세요. 구석구석을 뒤지고 나무에서 나오는 모든 것을 얻으세요!", + "advancement.twilightforest.arctic_dyed": "패션의 완성", + "advancement.twilightforest.beanstalk": "잭과 콩나무", + "advancement.twilightforest.experiment_115": "케이크?", + "advancement.twilightforest.experiment_115.desc": "케이크 맞지??", + "advancement.twilightforest.experiment_115_2": "오늘의 일기: 대성공!", + "advancement.twilightforest.experiment_115_2.desc": "이처럼 맛있고 촉촉할 수가!", + "advancement.twilightforest.experiment_115_3": "115년 동안 매일 No.115를 먹을거야", + "advancement.twilightforest.experiment_115_3.desc": "No.115를 115개 먹어야지~", + "advancement.twilightforest.fiery_set": "피와 눈물", + "advancement.twilightforest.full_mettle_alchemist": "강력한 헌신의 연금술사", + "advancement.twilightforest.ghast_trap": "기묘한 것들", + "advancement.twilightforest.ghast_trap.desc": "%s 주위의 %s들을 해치우고 %s를 약화시키세요.", + "advancement.twilightforest.giants": "구름에 있어요!", + "advancement.twilightforest.glass_sword": "잘 사용해봐", + "advancement.twilightforest.glass_sword.desc": "쓸모가 있기를 빕니다...", + "advancement.twilightforest.hedge": "밟아버리기!", + "advancement.twilightforest.hill1": "그거 내 부츠야!", + "advancement.twilightforest.hill2": "무슨 소리였지?", + "advancement.twilightforest.hill3": "아이 씨 유", + "advancement.twilightforest.hydra_chop": "만화고기!?", + "advancement.twilightforest.kill_cicada": "정적", + "advancement.twilightforest.kill_hydra": "히드라 사냥꾼", + "advancement.twilightforest.kill_lich": "리치 사냥꾼", + "advancement.twilightforest.kill_naga": "나가 사냥꾼", + "advancement.twilightforest.lich_scepters": "우리의 힘을 합친다면!", + "advancement.twilightforest.magic_map": "기나긴 모험", + "advancement.twilightforest.magic_map_focus": "여정의 시작", + "advancement.twilightforest.maze_map": "미로는 지긋지긋해", + "advancement.twilightforest.mazebreaker": "미로 부수기", + "advancement.twilightforest.naga_armors": "네 비늘 좋더라", + "advancement.twilightforest.ore_map": "가치있는 것", + "advancement.twilightforest.progress_glacier": "맑은 하늘", + "advancement.twilightforest.progress_knights": "카미나이트 적응", + "advancement.twilightforest.progress_labyrinth": "강력한 스트로가노프!", + "advancement.twilightforest.progress_merge": "쇼다운", + "advancement.twilightforest.progress_troll": "불타오르네", + "advancement.twilightforest.progress_trophy_pedestal": "트로피 챔피언", + "advancement.twilightforest.progress_ur_ghast": "불의 눈물", + "advancement.twilightforest.progress_yeti": "알파의 모피", + "advancement.twilightforest.quest_ram": "바아아~", + "advancement.twilightforest.root": "황혼의 숲", + "advancement.twilightforest.troll": "한탕해보자", + "advancement.twilightforest.twilight_dining": "진정한 여행의 목적", + "advancement.twilightforest.twilight_hunter": "고요함", + "biome.twilightforest.clearing": "황혼의 평원", + "biome.twilightforest.dark_forest": "어둠의 숲", + "biome.twilightforest.dark_forest_center": "어둠의 숲 중앙", + "biome.twilightforest.dense_forest": "울창한 숲", + "biome.twilightforest.dense_mushroom_forest": "울창한 버섯 숲", + "biome.twilightforest.enchanted_forest": "마법에 걸린 숲", + "biome.twilightforest.final_plateau": "마지막 고원", + "biome.twilightforest.fire_swamp": "불타는 늪지", + "biome.twilightforest.firefly_forest": "반딧불이 숲", + "biome.twilightforest.forest": "황혼의 숲", + "biome.twilightforest.glacier": "황혼의 빙하", + "biome.twilightforest.highlands": "황혼의 고원", + "biome.twilightforest.lake": "황혼의 호수", + "biome.twilightforest.mushroom_forest": "버섯 숲", + "biome.twilightforest.oak_savannah": "참나무 사바나", + "biome.twilightforest.snowy_forest": "눈덮인 숲", + "biome.twilightforest.spooky_forest": "무서운 숲", + "biome.twilightforest.stream": "황혼 개울", + "biome.twilightforest.swamp": "황혼의 늪지", + "biome.twilightforest.thornlands": "가시 고원", + "biome.twilightforest.underground": "지하철", + "block.twilightforest.alpha_yeti_boss_spawner": "우두머리 예티 보스 생성기", + "block.twilightforest.alpha_yeti_trophy": "우두머리 예티 트로피", + "block.twilightforest.arctic_fur_block": "극지동물의 털 블록", + "block.twilightforest.aurora_block": "오로라 블록", + "block.twilightforest.aurora_pillar": "오로라 기둥", + "block.twilightforest.aurora_slab": "오로라 반 블록", + "block.twilightforest.auroralized_glass": "오로라 유리", + "block.twilightforest.beanstalk_leaves": "콩나무 줄기 잎", + "block.twilightforest.blue_castle_door": "파란색 성 문", + "block.twilightforest.blue_castle_rune_brick": "파란색 성 룬 석재 벽돌", + "block.twilightforest.blue_force_field": "파란색 역장", + "block.twilightforest.bold_castle_brick_pillar": "굵은 성 석재 벽돌 기둥", + "block.twilightforest.bold_castle_brick_stairs": "굵은 성 석재 벽돌 계단", + "block.twilightforest.bold_stone_pillar": "굵은 돌기둥", + "block.twilightforest.brown_thorns": "가시", + "block.twilightforest.built_block": "구축 블럭", + "block.twilightforest.burnt_thorns": "타버린 가시", + "block.twilightforest.candelabra": "촛대", + "block.twilightforest.canopy_button": "캐노피나무 버튼", + "block.twilightforest.canopy_door": "캐노피나무 문", + "block.twilightforest.canopy_fence": "캐노피나무 울타리", + "block.twilightforest.canopy_fence_gate": "캐노피나무 울타리 문", + "block.twilightforest.canopy_leaves": "캐노피나무 잎", + "block.twilightforest.canopy_log": "캐노피나무 원목", + "block.twilightforest.canopy_planks": "캐노피나무 판자", + "block.twilightforest.canopy_pressure_plate": "캐노피나무 압력판", + "block.twilightforest.canopy_sapling": "캐노피나무 묘목", + "block.twilightforest.canopy_sign": "캐노피나무 표지판", + "block.twilightforest.canopy_slab": "캐노피나무 반 블록", + "block.twilightforest.canopy_stairs": "캐노피나무 계단", + "block.twilightforest.canopy_trapdoor": "캐노피나무 다락문", + "block.twilightforest.canopy_wall_sign": "캐노피나무 벽 표지판", + "block.twilightforest.canopy_wood": "캐노피나무", + "block.twilightforest.carminite_block": "카미나이트 블록", + "block.twilightforest.carminite_builder": "카미나이트 구축기", + "block.twilightforest.carminite_reactor": "카미나이트 반응기", + "block.twilightforest.casket.broken": "기념품 상자가 심하게 손상되어 더 이상 아이템을 보관할 수 없습니다. 당신의 장식함에 보관될 모든 아이템들이 땅에 떨어졌습니다.", + "block.twilightforest.casket.locked": "이 장식함은 %s만 열 수 있습니다!", + "block.twilightforest.castle_brick": "성 석재 벽돌", + "block.twilightforest.castle_brick_stairs": "성 석재 벽돌 계단", + "block.twilightforest.castle_roof_tile": "성 지붕 타일", + "block.twilightforest.cicada": "매미", + "block.twilightforest.cicada_jar": "매미 병", + "block.twilightforest.cinder_furnace": "타버린 화로", + "block.twilightforest.cinder_log": "타버린 원목", + "block.twilightforest.cinder_wood": "타버린 나무", + "block.twilightforest.clover_patch": "클로버 조각", + "block.twilightforest.cracked_castle_brick": "금 간 성 석재 벽돌", + "block.twilightforest.cracked_castle_brick_stairs": "금 간 성 석재 벽돌 계단", + "block.twilightforest.cracked_deadrock": "금 간 데드락", + "block.twilightforest.cracked_mazestone": "금 간 미로 석재 벽돌", + "block.twilightforest.cracked_underbrick": "금 간 언더 석재 벽돌", + "block.twilightforest.cut_mazestone": "조각된 미로석", + "block.twilightforest.dark_button": "다크우드나무 버튼", + "block.twilightforest.dark_door": "다크우드나무 문", + "block.twilightforest.dark_fence": "다크우드나무 울타리", + "block.twilightforest.dark_fence_gate": "다크우드나무 울타리 문", + "block.twilightforest.dark_leaves": "다크우드나무 잎", + "block.twilightforest.dark_log": "다크우드나무 원목", + "block.twilightforest.dark_planks": "다크우드나무 판자", + "block.twilightforest.dark_pressure_plate": "다크우드나무 압력판", + "block.twilightforest.dark_slab": "다크우드나무 반 블록", + "block.twilightforest.dark_stairs": "다크우드나무 계단", + "block.twilightforest.dark_trapdoor": "다크우드나무 다락문", + "block.twilightforest.darkwood_sapling": "다크우드나무 묘목", + "block.twilightforest.deadrock": "데드락", + "block.twilightforest.death_tome_spawner": "데스 토메 스포너", + "block.twilightforest.decorative_mazestone": "장식된 미로 석재 벽돌", + "block.twilightforest.empty_canopy_bookshelf": "비어 있는 캐노피 책장", + "block.twilightforest.encased_castle_brick_pillar": "감싸진 성 석재 벽돌 기둥", + "block.twilightforest.encased_castle_brick_stairs": "감싸진 성 석재 벽돌 계단", + "block.twilightforest.encased_castle_brick_tile": "감싸진 성 석재 벽돌 타일", + "block.twilightforest.encased_fire_jet": "감싸진 화염 분출기", + "block.twilightforest.encased_smoker": "감싸진 연기 블록", + "block.twilightforest.etched_nagastone": "조각된 나가석", + "block.twilightforest.experiment_115": "115번 실험물", + "block.twilightforest.fiery_block": "화염석 블록", + "block.twilightforest.final_boss_boss_spawner": "최종 보스 보스 생성기", + "block.twilightforest.fire_jet": "화염 분출기", + "block.twilightforest.firefly": "반딧불이", + "block.twilightforest.firefly_jar": "반딧불이 병", + "block.twilightforest.firefly_particle_spawner": "반딧불 입자 스포너", + "block.twilightforest.fluffy_cloud": "솜털 구름", + "block.twilightforest.ghast_trap": "가스트 함정", + "block.twilightforest.giant_cobblestone": "거대 조약돌", + "block.twilightforest.giant_leaves": "거대 잎", + "block.twilightforest.giant_log": "거대 원목", + "block.twilightforest.giant_obsidian": "거대 흑요석", + "block.twilightforest.green_force_field": "초록색 역장", + "block.twilightforest.green_thorns": "녹색 가시", + "block.twilightforest.hardened_dark_leaves": "두꺼운 다크우드 잎", + "block.twilightforest.hedge": "생울타리", + "block.twilightforest.hollow_oak_sapling": "튼튼한 황혼 참나무 묘목", + "block.twilightforest.huge_lily_pad": "거대한 수련 잎", + "block.twilightforest.huge_mushgloom_stem": "거대한 머쉬그룸 줄기", + "block.twilightforest.huge_stalk": "거대한 줄기", + "block.twilightforest.huge_water_lily": "거대한 수련", + "block.twilightforest.hydra_boss_spawner": "히드라 보스 생성기", + "block.twilightforest.hydra_trophy": "히드라 트로피", + "block.twilightforest.iron_ladder": "철 사다리", + "block.twilightforest.ironwood_block": "아이언우드 블록", + "block.twilightforest.keepsake_casket": "기념품 상자", + "block.twilightforest.knight_phantom_boss_spawner": "유령 기사 보스 생성기", + "block.twilightforest.knight_phantom_trophy": "유령 기사 트로피", + "block.twilightforest.knightmetal_block": "나이트메탈 블록", + "block.twilightforest.lich_boss_spawner": "리치 보스 생성기", + "block.twilightforest.lich_tower_miniature_structure": "미니어처 리치의 탑", + "block.twilightforest.lich_trophy": "리치 트로피", + "block.twilightforest.liveroot_block": "생뿌리", + "block.twilightforest.locked_vanishing_block": "봉인된 점멸 블록", + "block.twilightforest.mangrove_button": "맹그로브나무 버튼", + "block.twilightforest.mangrove_door": "맹그로브나무 문", + "block.twilightforest.mangrove_fence": "맹그로브나무 울타리", + "block.twilightforest.mangrove_fence_gate": "맹그로브나무 울타리 문", + "block.twilightforest.mangrove_leaves": "맹그로브나무 잎", + "block.twilightforest.mangrove_log": "맹그로브나무 원목", + "block.twilightforest.mangrove_planks": "맹그로브나무 판자", + "block.twilightforest.mangrove_pressure_plate": "맹그로브나무 압력판", + "block.twilightforest.mangrove_root": "맹그로브 뿌리", + "block.twilightforest.mangrove_sapling": "황혼의 맹그로브나무 묘목", + "block.twilightforest.mangrove_sign": "맹그로브나무 표지판", + "block.twilightforest.mangrove_slab": "맹그로브나무 반 블록", + "block.twilightforest.mangrove_stairs": "맹그로브나무 계단", + "block.twilightforest.mangrove_trapdoor": "맹그로브나무 다락문", + "block.twilightforest.mangrove_wall_sign": "맹그로브나무 벽 표지판", + "block.twilightforest.mangrove_wood": "맹그로브나무", + "block.twilightforest.mayapple": "매야플", + "block.twilightforest.mazestone": "미로석", + "block.twilightforest.mazestone_border": "미로석 테두리", + "block.twilightforest.mazestone_brick": "미로 석재 벽돌", + "block.twilightforest.mazestone_mosaic": "미로석 모자이크", + "block.twilightforest.mining_button": "광부나무 버튼", + "block.twilightforest.mining_door": "광부나무 문", + "block.twilightforest.mining_fence": "광부나무 울타리", + "block.twilightforest.mining_fence_gate": "광부나무 울타리 문", + "block.twilightforest.mining_leaves": "광부나무 잎", + "block.twilightforest.mining_log": "광부나무 원목", + "block.twilightforest.mining_log_core": "광부나무 핵", + "block.twilightforest.mining_planks": "광부나무 판자", + "block.twilightforest.mining_pressure_plate": "광부나무 압력판", + "block.twilightforest.mining_sapling": "광부나무 묘목", + "block.twilightforest.mining_sign": "광부나무 표지판", + "block.twilightforest.mining_slab": "광부나무 반 블록", + "block.twilightforest.mining_stairs": "광부나무 계단", + "block.twilightforest.mining_trapdoor": "광부나무 다락문", + "block.twilightforest.mining_wall_sign": "광부나무 벽 표지판", + "block.twilightforest.minoshroom_boss_spawner": "미노쉬룸 보스 생성기", + "block.twilightforest.minoshroom_trophy": "미노쉬룸 트로피", + "block.twilightforest.moonworm": "월충", + "block.twilightforest.moss_patch": "이끼 조각", + "block.twilightforest.mossy_castle_brick": "이끼 낀 성 석재 벽돌", + "block.twilightforest.mossy_castle_brick_stairs": "이끼 낀 성 석재 벽돌 계단", + "block.twilightforest.mossy_etched_nagastone": "이끼 낀 조각된 나가석", + "block.twilightforest.mossy_mazestone": "이끼 낀 미로 석재 벽돌", + "block.twilightforest.mossy_nagastone_pillar": "이끼 낀 나가석 기둥", + "block.twilightforest.mossy_nagastone_stairs_left": "이끼 낀 나가석 계단 (왼쪽)", + "block.twilightforest.mossy_nagastone_stairs_right": "이끼 낀 나가석 계단 (오른쪽)", + "block.twilightforest.mossy_underbrick": "이끼 낀 언더 석재 벽돌", + "block.twilightforest.mushgloom": "머쉬그룸", + "block.twilightforest.naga_boss_spawner": "나가 보스 생성기", + "block.twilightforest.naga_courtyard_miniature_structure": "미니어처 나가의 정원", + "block.twilightforest.naga_trophy": "나가 트로피", + "block.twilightforest.nagastone": "나가석", + "block.twilightforest.nagastone_head": "나가석 머리", + "block.twilightforest.nagastone_pillar": "나가석 기둥", + "block.twilightforest.nagastone_stairs_left": "나가석 계단 (왼쪽)", + "block.twilightforest.nagastone_stairs_right": "나가석 계단 (오른쪽)", + "block.twilightforest.orange_force_field": "주황색 역장", + "block.twilightforest.potted_canopy_sapling": "화분에 심은 캐노피나무 묘목", + "block.twilightforest.potted_darkwood_sapling": "화분에 심은 다크우드나무 묘목", + "block.twilightforest.potted_dead_thorn": "화분에 심은 타버린 가시", + "block.twilightforest.potted_green_thorn": "화분에 심은 녹색 가시", + "block.twilightforest.potted_hollow_oak_sapling": "화분에 심은 튼튼한 황혼 참나무 묘목", + "block.twilightforest.potted_mayapple": "화분에 심은 매야플", + "block.twilightforest.potted_mining_sapling": "화분에 심은 광부나무 묘목", + "block.twilightforest.potted_mushgloom": "화분에 심은 머쉬그룸", + "block.twilightforest.potted_rainbow_oak_sapling": "화분에 심은 무지개 참나무 묘목", + "block.twilightforest.potted_sorting_sapling": "화분에 심은 분류나무 묘목", + "block.twilightforest.potted_thorn": "화분에 심은 가시", + "block.twilightforest.potted_time_sapling": "화분에 심은 시간나무 묘목", + "block.twilightforest.potted_transformation_sapling": "화분에 심은 변화나무 묘목", + "block.twilightforest.potted_twilight_oak_sapling": "화분에 심은 병든 황혼 참나무 묘목", + "block.twilightforest.quest_ram_trophy": "퀘스트 양 트로피", + "block.twilightforest.rainbow_oak_leaves": "무지개 참나무 잎", + "block.twilightforest.rainbow_oak_sapling": "무지개 참나무 묘목", + "block.twilightforest.reactor_debris": "원자로 잔해", + "block.twilightforest.reappearing_block": "구현 블록", + "block.twilightforest.red_thread": "붉은 실", + "block.twilightforest.root": "뿌리", + "block.twilightforest.root_strand": "뿌리가닥", + "block.twilightforest.slider": "미끄럼 함정", + "block.twilightforest.smoker": "연기 블록", + "block.twilightforest.snow_queen_boss_spawner": "눈의 여왕 보스 생성기", + "block.twilightforest.snow_queen_trophy": "눈의 여왕 트로피", + "block.twilightforest.sorting_button": "분류나무 버튼", + "block.twilightforest.sorting_door": "분류나무 문", + "block.twilightforest.sorting_fence": "분류나무 울타리", + "block.twilightforest.sorting_fence_gate": "분류나무 울타리 문", + "block.twilightforest.sorting_leaves": "분류나무 잎", + "block.twilightforest.sorting_log": "분류나무 원목", + "block.twilightforest.sorting_log_core": "분류나무 엔진", + "block.twilightforest.sorting_planks": "분류나무 판자", + "block.twilightforest.sorting_pressure_plate": "분류나무 압력판", + "block.twilightforest.sorting_sapling": "분류나무 묘목", + "block.twilightforest.sorting_sign": "분류나무 표지판", + "block.twilightforest.sorting_slab": "분류나무 반 블록", + "block.twilightforest.sorting_stairs": "분류나무 계단", + "block.twilightforest.sorting_trapdoor": "분류나무 다락문", + "block.twilightforest.sorting_wall_sign": "분류나무 벽 표지판", + "block.twilightforest.spiral_bricks": "나선형 벽돌", + "block.twilightforest.steeleaf_block": "강철잎사귀 블록", + "block.twilightforest.stripped_canopy_log": "껍질 벗긴 캐노피나무 원목", + "block.twilightforest.stripped_canopy_wood": "껍질 벗긴 캐노피나무", + "block.twilightforest.stripped_dark_log": "껍질 벗긴 다크우드나무 원목", + "block.twilightforest.stripped_mangrove_log": "껍질 벗긴 맹그로브나무 원목", + "block.twilightforest.stripped_mangrove_wood": "껍질 벗긴 맹그로브나무", + "block.twilightforest.stripped_mining_log": "껍질 벗긴 광부나무 원목", + "block.twilightforest.stripped_sorting_log": "껍질 벗긴 분류나무 원목", + "block.twilightforest.stripped_time_log": "껍질 벗긴 시간나무 원목", + "block.twilightforest.stripped_transformation_log": "껍질 벗긴 변화나무 원목", + "block.twilightforest.stripped_twilight_oak_log": "껍질 벗긴 황혼 참나무 원목", + "block.twilightforest.stripped_twilight_oak_wood": "껍질 벗긴 황혼 참나무", + "block.twilightforest.stronghold_shield": "성채의 방패", + "block.twilightforest.thick_castle_brick": "두꺼운 성 석재 벽돌", + "block.twilightforest.thorn_leaves": "가시장미 잎", + "block.twilightforest.thorn_rose": "가시장미", + "block.twilightforest.time_button": "시간나무 버튼", + "block.twilightforest.time_door": "시간나무 문", + "block.twilightforest.time_fence": "시간나무 울타리", + "block.twilightforest.time_fence_gate": "시간나무 울타리 문", + "block.twilightforest.time_leaves": "시간나무 잎", + "block.twilightforest.time_log": "시간나무 원목", + "block.twilightforest.time_log_core": "시간나무 시계", + "block.twilightforest.time_planks": "시간나무 판자", + "block.twilightforest.time_pressure_plate": "시간나무 압력판", + "block.twilightforest.time_sapling": "시간나무 묘목", + "block.twilightforest.time_sign": "시간나무 표지판", + "block.twilightforest.time_slab": "시간나무 반 블록", + "block.twilightforest.time_stairs": "시간나무 계단", + "block.twilightforest.time_trapdoor": "시간나무 다락문", + "block.twilightforest.time_wall_sign": "시간나무 벽 표지판", + "block.twilightforest.torchberry_plant": "토치베리 가지", + "block.twilightforest.towerwood": "탑나무 판자", + "block.twilightforest.transformation_button": "변화나무 버튼", + "block.twilightforest.transformation_door": "변화나무 문", + "block.twilightforest.transformation_fence": "변화나무 울타리", + "block.twilightforest.transformation_fence_gate": "변화나무 울타리 문", + "block.twilightforest.transformation_leaves": "전환나무 잎", + "block.twilightforest.transformation_log": "변화나무 원목", + "block.twilightforest.transformation_log_core": "전환나무의 심장", + "block.twilightforest.transformation_planks": "변화나무 판자", + "block.twilightforest.transformation_pressure_plate": "변화나무 압력판", + "block.twilightforest.transformation_sapling": "변화나무 묘목", + "block.twilightforest.transformation_sign": "변화나무 표지판", + "block.twilightforest.transformation_slab": "변화나무 반 블록", + "block.twilightforest.transformation_stairs": "변화나무 계단", + "block.twilightforest.transformation_trapdoor": "변화나무 다락문", + "block.twilightforest.transformation_wall_sign": "변화나무 벽 표지판", + "block.twilightforest.trollber": "트롤버", + "block.twilightforest.trollsteinn": "트롤스테인", + "block.twilightforest.trollvidr": "트롤비드르", + "block.twilightforest.trophy_pedestal": "트로피 받침대", + "block.twilightforest.twilight_oak_button": "황혼 참나무 버튼", + "block.twilightforest.twilight_oak_door": "황혼 참나무 문", + "block.twilightforest.twilight_oak_fence": "황혼 참나무 울타리", + "block.twilightforest.twilight_oak_fence_gate": "황혼 참나무 울타리 문", + "block.twilightforest.twilight_oak_leaves": "황혼 참나무 잎", + "block.twilightforest.twilight_oak_log": "황혼 참나무 원목", + "block.twilightforest.twilight_oak_planks": "황혼 참나무 판자", + "block.twilightforest.twilight_oak_pressure_plate": "황혼 참나무 압력판", + "block.twilightforest.twilight_oak_sapling": "병든 황혼 참나무 묘목", + "block.twilightforest.twilight_oak_sign": "황혼 참나무 표지판", + "block.twilightforest.twilight_oak_slab": "황혼 참나무 반 블록", + "block.twilightforest.twilight_oak_stairs": "황혼 참나무 계단", + "block.twilightforest.twilight_oak_trapdoor": "황혼 참나무 다락문", + "block.twilightforest.twilight_oak_wood": "황혼 참나무", + "block.twilightforest.twilight_portal": "황혼의 숲 포탈", + "block.twilightforest.twisted_stone": "돌 트위스트", + "block.twilightforest.twisted_stone_pillar": "돌 기둥", + "block.twilightforest.uberous_soil": "양질의 흙", + "block.twilightforest.uncrafting_table": "역제작대", + "block.twilightforest.underbrick": "언더 석재 벽돌", + "block.twilightforest.underbrick_floor": "언더 석재 벽돌 바닥", + "block.twilightforest.unripe_trollber": "덜익은 트롤버", + "block.twilightforest.ur_ghast_boss_spawner": "유어 가스트 보스 생성기", + "block.twilightforest.ur_ghast_trophy": "유어 가스트 트로피", + "block.twilightforest.vanishing_block": "점멸 블록", + "block.twilightforest.violet_castle_door": "보라색 성 문", + "block.twilightforest.violet_castle_rune_brick": "보라색 성 룬 석재 벽돌", + "block.twilightforest.violet_force_field": "보라색 역장", + "block.twilightforest.weathered_deadrock": "풍화된 데드락", + "block.twilightforest.wispy_cloud": "몇 줄기 구름", + "block.twilightforest.worn_castle_brick": "해진 성 석재 벽돌", + "block.twilightforest.worn_castle_brick_stairs": "해진 성 석재 벽돌 계단", + "block.twilightforest.yellow_castle_door": "노란색 성 문", + "block.twilightforest.yellow_castle_rune_brick": "노란색 성 룬 석재 벽돌", + "block.twilightforest.zombie_skull_candle": "좀비 스컬 캔들", + "commands.tffeature.center": "특징의 중심: %s", + "commands.tffeature.chunk": "특징 청크: %s", + "commands.tffeature.nearest": "가장 가까운 특징은 %s입니다.", + "commands.tffeature.none_nearby": "주변 기능을 찾을 수 없습니다!", + "commands.tffeature.not_in_twilight_forest": "황혼의 숲 차원에 없습니다.", + "commands.tffeature.structure.conquer.status": "구조물 정복기: %s", + "commands.tffeature.structure.conquer.update": "구조물 정복기가 %s이었고, %s로 변경되었습니다.", + "commands.tffeature.structure.inside": "당신은 구조 내부에 존재 합니다", + "commands.tffeature.structure.outside": "당신은 구조물 외부에 존재합니다", + "commands.tffeature.structure.required": "구조물에 없습니다.", + "commands.tffeature.structure.spawn_info": "%s 무게 %s", + "commands.tffeature.structure.spawn_list": "이 지역의 스폰 목록은 다음과 같습니다:", + "death.attack.twilightforest.axing": "%1$s이(가) %2$s에 의해 잘게 썰렸습니다.", + "death.attack.twilightforest.axing.item": "%1$s이(가) %3$s을(를) 사용한 %2$s에 의해 잘게 썰렸습니다.", + "death.attack.twilightforest.chillingBreath": "%1$s이(가) 눈의 여왕에 의해 얼어 죽었습니다.", + "death.attack.twilightforest.chillingBreath.player": "%2$s을(를) 탈출하는 동안 %1$s이(가) 눈의 여왕에 의해 얼어 죽었습니다.", + "death.attack.twilightforest.frozen": "%1$s이(가) 얼음 폭탄을 사용한 %2$s에 의해 얼려졌습니다.", + "death.attack.twilightforest.frozen.item": "%1$s이(가) %3$s을(를) 사용한 %2$s에 의해 얼려졌습니다.", + "death.attack.twilightforest.ghastTear": "%1$s이(가) 불타는 눈물에 데었습니다.", + "death.attack.twilightforest.ghastTear.player": "%2$s을(를) 탈출하는 동안 %1$s이(가) 불타는 눈물에 데었습니다.", + "death.attack.twilightforest.haunt": "%1$s이(가) %2$s의 소굴에 들어갔습니다.", + "death.attack.twilightforest.hydraBite": "%1$s의 피부가 히드라에 의해 뜯겼습니다.", + "death.attack.twilightforest.hydraBite.player": "%2$s을(를) 탈출하는 동안 %1$s의 피부가 히드라에 의해 뜯겼습니다.", + "death.attack.twilightforest.hydraFire": "%1$s이(가) 히드라에 의해 산 채로 구워졌습니다.", + "death.attack.twilightforest.hydraFire.player": "%2$s을(를) 탈출하는 동안 %1$s이(가) 히드라에 의해 산 채로 구워졌습니다.", + "death.attack.twilightforest.leafBrain": "%1$s의 뇌가 %2$s에 의해 잎으로 변했습니다.", + "death.attack.twilightforest.leafBrain.item": "%1$s의 뇌가 %3$s을(를) 사용한 %2$s에 의해 잎으로 변했습니다.", + "death.attack.twilightforest.lichBolt": "리치의 조준은 %1$s보다 나았습니다.", + "death.attack.twilightforest.lichBolt.player": "%1$s보다 리치와 %2$s을(를) 조준하는 것이 나았습니다.", + "death.attack.twilightforest.lichBomb": "%1$s이(가) 리치의 폭발 마법에 굴복했습니다.", + "death.attack.twilightforest.lichBomb.player": "%2$s을(를) 탈출하는 동안 %1$s이(가) 리치의 폭발 마법에 굴복했습니다.", + "death.attack.twilightforest.lostWords": "%1$s이(가) %2$s에 의해 살해된 후 말을 할 수 없습니다.", + "death.attack.twilightforest.lostWords.item": "%1$s이(가) %3$s을(를) 사용한 %2$s에 의해 살해된 후 말을 할 수 없습니다.", + "death.attack.twilightforest.moonworm": "%1$s은(는) 월충에게 저격당했습니다.", + "death.attack.twilightforest.snowballFight": "%1$s이(가) %2$s에게 눈덩이를 잃었습니다.", + "death.attack.twilightforest.snowballFight.item": "%1$s이(가) %3$s을(를) 사용한 %2$s에게 눈덩이를 잃었습니다.", + "death.attack.twilightforest.squish": "%1$s이(가) 눈의 여왕에 의해 으깨졌습니다.", + "death.attack.twilightforest.squish.player": "%2$s을(를) 탈출하는 동안 %1$s이(가) 눈의 여왕에 의해 으깨졌습니다.", + "death.attack.twilightforest.thorns": "%1$s이(가) 가시 속으로 걸어 들어갔습니다.", + "death.attack.twilightforest.thorns.player": "%2$s을(를) 탈출하는 동안 %1$s이(가) 가시에 걸어 들어갔습니다.", + "death.attack.twilightforest.thrownAxe": "던져진 도끼에 의해 %1$s이(가) 참수되었습니다.", + "death.attack.twilightforest.thrownAxe.player": "%2$s을(를) 탈출하는 동안 던져진 도끼에 의해 %1$s이(가) 참수되었습니다.", + "death.attack.twilightforest.thrownPickaxe": "던져진 곡괭이에 의해 %1$s이(가) 참수되었습니다.", + "death.attack.twilightforest.thrownPickaxe.player": "%2$s을(를) 탈출하는 동안 던져진 곡괭이에 의해 %1$s이(가) 참수되었습니다.", + "death.attack.twilightforest.yeeted": "%1$s이(가) %2$s에 의해 마지막으로 멀리 던져졌습니다.", + "death.attack.twilightforest.yeeted.item": "%1$s이(가) %3$s을(를) 쥐고 있는 %2$s에 의해 마지막으로 멀리 던져졌습니다.", + "effect.twilightforest.frosted": "서리", + "enchantment.twilightforest.chill_aura": "차가운 기운", + "enchantment.twilightforest.chill_aura.desc": "공격후 대상에게 서리효과가 붙을수 있습니다.", + "enchantment.twilightforest.destruction": "파괴", + "enchantment.twilightforest.destruction.desc": "블록과 체인이 신속과 넒은 범위로 블록을 부술 수 있도록 합니다.", + "enchantment.twilightforest.fire_react": "뜨거운 반응", + "enchantment.twilightforest.fire_react.desc": "피격후 대상에게 불이 붙을 확율이 증가합니다.", + "entity.twilightforest.alpha_yeti": "우두머리 예티", + "entity.twilightforest.armored_giant": "장갑한 거인", + "entity.twilightforest.bighorn_sheep": "큰뿔양", + "entity.twilightforest.blockchain_goblin": "블록과 사슬 고블린", + "entity.twilightforest.carminite_broodling": "카미나이트 새끼 거미", + "entity.twilightforest.carminite_ghastguard": "카미나이트 가스트경비병", + "entity.twilightforest.carminite_ghastling": "카미나이트 가스트유체", + "entity.twilightforest.carminite_golem": "카미나이트 골렘", + "entity.twilightforest.chain_block": "블록과 사슬", + "entity.twilightforest.charm_effect": "매력 효과", + "entity.twilightforest.cube_of_annihilation": "소멸의 정육면체", + "entity.twilightforest.death_tome": "죽음의 서", + "entity.twilightforest.dwarf_rabbit": "난쟁이 토끼", + "entity.twilightforest.falling_ice": "떨어지는 얼음", + "entity.twilightforest.fire_beetle": "화염벌레", + "entity.twilightforest.giant_miner": "거인 광부", + "entity.twilightforest.hedge_spider": "울타리 거미", + "entity.twilightforest.helmet_crab": "투구게", + "entity.twilightforest.hostile_wolf": "사나운 늑대", + "entity.twilightforest.hydra": "히드라", + "entity.twilightforest.hydra_mortar": "히드라 박격포", + "entity.twilightforest.ice_arrow": "얼음 화살", + "entity.twilightforest.ice_crystal": "얼음 수정", + "entity.twilightforest.ice_snowball": "얼음 눈덩이", + "entity.twilightforest.king_spider": "왕거미", + "entity.twilightforest.knight_phantom": "유령 기사", + "entity.twilightforest.kobold": "코볼트", + "entity.twilightforest.lich_bolt": "리치 볼트", + "entity.twilightforest.lich_bomb": "폭발성 리치 볼트", + "entity.twilightforest.lich_minion": "리치의 수하", + "entity.twilightforest.lower_goblin_knight": "하부 고블린 기사", + "entity.twilightforest.loyal_zombie": "로얄 좀비", + "entity.twilightforest.maze_slime": "미로 슬라임", + "entity.twilightforest.minoshroom": "미노쉬룸", + "entity.twilightforest.minotaur": "미노타우르스", + "entity.twilightforest.mist_wolf": "안개 늑대", + "entity.twilightforest.moonworm_shot": "월충", + "entity.twilightforest.mosquito_swarm": "모기 무리", + "entity.twilightforest.naga": "나가", + "entity.twilightforest.nature_bolt": "자연 볼트", + "entity.twilightforest.penguin": "펭귄", + "entity.twilightforest.pinch_beetle": "집게벌레", + "entity.twilightforest.protection_box": "진행 보호 상자", + "entity.twilightforest.quest_ram": "퀘스트 양", + "entity.twilightforest.redcap_sapper": "붉은모자 공병", + "entity.twilightforest.rising_zombie": "좀비", + "entity.twilightforest.seeker_arrow": "유도 화살", + "entity.twilightforest.skeleton_druid": "스켈레톤 드루이드", + "entity.twilightforest.slider": "움직이는 미끄럼 함정", + "entity.twilightforest.slime_beetle": "슬라임벌레", + "entity.twilightforest.slime_blob": "슬라임 방울", + "entity.twilightforest.snow_guardian": "눈의 수호자", + "entity.twilightforest.snow_queen": "눈의 여왕", + "entity.twilightforest.stable_ice_core": "안정한 얼음 코어", + "entity.twilightforest.swarm_spider": "무리 거미", + "entity.twilightforest.thrown_wep": "투척된 무기", + "entity.twilightforest.tiny_bird": "작은 새", + "entity.twilightforest.tome_bolt": "죽음의 서 볼트", + "entity.twilightforest.towerwood_borer": "탑나무 좀벌레", + "entity.twilightforest.unstable_ice_core": "불안정한 얼음 코어", + "entity.twilightforest.upper_goblin_knight": "상부 고블린 기사", + "entity.twilightforest.ur_ghast": "유어 가스트", + "entity.twilightforest.wand_bolt": "황혼 셉터 볼트", + "entity.twilightforest.winter_wolf": "겨울 늑대", + "entity.twilightforest.yeti": "예티", + "item.twilightforest.alpha_yeti_fur": "우두머리 예티 모피", + "item.twilightforest.alpha_yeti_spawn_egg": "우두머리 예티 생성 알", + "item.twilightforest.arctic_boots": "극지 부츠", + "item.twilightforest.arctic_chestplate": "극지 흉갑", + "item.twilightforest.arctic_fur": "극지동물의 털", + "item.twilightforest.arctic_helmet": "극지 투구", + "item.twilightforest.arctic_leggings": "극지 레깅스", + "item.twilightforest.armor_shard": "갑옷 조각", + "item.twilightforest.armor_shard_cluster": "갑옷 조각 더미", + "item.twilightforest.armored_giant_spawn_egg": "장갑한 거인 생성 알", + "item.twilightforest.bighorn_sheep_spawn_egg": "큰뿔양 생성 알", + "item.twilightforest.block_and_chain": "블록과 사슬", + "item.twilightforest.blockchain_goblin_spawn_egg": "블록과 사슬 고블린 생성 알", + "item.twilightforest.borer_essence": "좀벌레 진액", + "item.twilightforest.carminite": "카미나이트", + "item.twilightforest.carminite_broodling_spawn_egg": "카미나이트 새끼 거미 생성 알", + "item.twilightforest.carminite_ghastguard_spawn_egg": "카미나이트 가스트경비병 생성 알", + "item.twilightforest.carminite_ghastling_spawn_egg": "카미나이트 가스트유체 생성 알", + "item.twilightforest.carminite_golem_spawn_egg": "카미나이트 골렘 생성 알", + "item.twilightforest.charm_of_keeping_1": "보존의 부적 I", + "item.twilightforest.charm_of_keeping_2": "보존의 부적 II", + "item.twilightforest.charm_of_keeping_3": "보존의 부적 III", + "item.twilightforest.charm_of_life_1": "생명의 부적 I", + "item.twilightforest.charm_of_life_2": "생명의 부적 II", + "item.twilightforest.cooked_meef": "미노타우르스고기 스테이크", + "item.twilightforest.cooked_venison": "사슴고기 스테이크", + "item.twilightforest.crumble_horn": "무너뜨리는 뿔", + "item.twilightforest.cube_of_annihilation": "소멸의 정육면체", + "item.twilightforest.cube_talisman": "정육면체의 부적", + "item.twilightforest.death_tome_spawn_egg": "죽음의 서 생성 알", + "item.twilightforest.diamond_minotaur_axe": "다이아몬드 미노타우르스의 도끼", + "item.twilightforest.dwarf_rabbit_spawn_egg": "숲 토끼 생성 알", + "item.twilightforest.ender_bow": "엔더 활", + "item.twilightforest.fiery_blood": "파이어리 피", + "item.twilightforest.fiery_boots": "파이어리 부츠", + "item.twilightforest.fiery_chestplate": "파이어리 흉갑", + "item.twilightforest.fiery_helmet": "파이어리 투구", + "item.twilightforest.fiery_ingot": "파이어리괴", + "item.twilightforest.fiery_leggings": "파이어리 각반", + "item.twilightforest.fiery_pickaxe": "파이어리 곡괭이", + "item.twilightforest.fiery_sword": "파이어리 검", + "item.twilightforest.fiery_tears": "화염석의 눈물", + "item.twilightforest.filled_magic_map": "마법의 지도", + "item.twilightforest.filled_maze_map": "미로 지도", + "item.twilightforest.filled_ore_map": "미로/광물 지도", + "item.twilightforest.fire_beetle_spawn_egg": "화염벌레 생성 알", + "item.twilightforest.fortification_scepter": "무장의 지배", + "item.twilightforest.giant_miner_spawn_egg": "거인 광부 생성 알", + "item.twilightforest.giant_pickaxe": "거인의 곡괭이", + "item.twilightforest.giant_sword": "거인의 검", + "item.twilightforest.glass_sword": "유리 검", + "item.twilightforest.gold_minotaur_axe": "금 미노타우르스의 도끼", + "item.twilightforest.hedge_spider_spawn_egg": "울타리 거미 생성 알", + "item.twilightforest.helmet_crab_spawn_egg": "투구게 생성 알", + "item.twilightforest.hostile_wolf_spawn_egg": "사나운 늑대 생성 알", + "item.twilightforest.hydra_chop": "히드라 고깃덩이", + "item.twilightforest.hydra_spawn_egg": "히드라 생성 알", + "item.twilightforest.ice_bomb": "얼음 폭탄", + "item.twilightforest.ice_bow": "얼음 활", + "item.twilightforest.ice_crystal_spawn_egg": "얼음 수정 생성 알", + "item.twilightforest.ice_sword": "얼음 검", + "item.twilightforest.ironwood_axe": "아이언우드 도끼", + "item.twilightforest.ironwood_boots": "아이언우드 부츠", + "item.twilightforest.ironwood_chestplate": "아이언우드 흉갑", + "item.twilightforest.ironwood_helmet": "아이언우드 투구", + "item.twilightforest.ironwood_hoe": "아이언우드 괭이", + "item.twilightforest.ironwood_ingot": "아이언우드괴", + "item.twilightforest.ironwood_leggings": "아이언우드 레깅스", + "item.twilightforest.ironwood_pickaxe": "아이언우드 곡괭이", + "item.twilightforest.ironwood_shovel": "아이언우드 삽", + "item.twilightforest.ironwood_sword": "아이언우드 검", + "item.twilightforest.king_spider_spawn_egg": "왕거미 생성 알", + "item.twilightforest.knight_phantom_spawn_egg": "유령 기사 생성 알", + "item.twilightforest.knightmetal_axe": "기사석 도끼", + "item.twilightforest.knightmetal_boots": "기사석 부츠", + "item.twilightforest.knightmetal_chestplate": "기사석 흉갑", + "item.twilightforest.knightmetal_helmet": "기사석 투구", + "item.twilightforest.knightmetal_ingot": "기사석 주괴", + "item.twilightforest.knightmetal_leggings": "기사석 레깅스", + "item.twilightforest.knightmetal_pickaxe": "기사석 곡괭이", + "item.twilightforest.knightmetal_ring": "기사석 고리", + "item.twilightforest.knightmetal_shield": "기사석 방패", + "item.twilightforest.knightmetal_sword": "기사석 검", + "item.twilightforest.kobold_spawn_egg": "코볼트 생성 알", + "item.twilightforest.lamp_of_cinders": "재의 램프", + "item.twilightforest.lifedrain_scepter": "생명의 지배", + "item.twilightforest.liveroot": "생뿌리", + "item.twilightforest.lower_goblin_knight_spawn_egg": "고블린 기사 생성 알", + "item.twilightforest.magic_beans": "마법의 콩", + "item.twilightforest.magic_map": "빈 마법의 지도", + "item.twilightforest.magic_map_focus": "마법의 지도 깃털", + "item.twilightforest.maze_map": "빈 미로 지도", + "item.twilightforest.maze_map_focus": "미로 지도 깃털", + "item.twilightforest.maze_slime_spawn_egg": "미로 슬라임 생성 알", + "item.twilightforest.maze_wafer": "미로 와퍼", + "item.twilightforest.mazebreaker_pickaxe": "미로 파괴자", + "item.twilightforest.meef_stroganoff": "미노타우르스 스트로가노프", + "item.twilightforest.minoshroom_spawn_egg": "미노쉬룸 생성 알", + "item.twilightforest.minotaur_spawn_egg": "미노타우르스 생성 알", + "item.twilightforest.mist_wolf_spawn_egg": "안개 늑대 생성 알", + "item.twilightforest.moon_dial": "달 문자반", + "item.twilightforest.moonworm_queen": "월충 여왕", + "item.twilightforest.mosquito_swarm_spawn_egg": "모기 무리 생성 알", + "item.twilightforest.naga_chestplate": "나가 비늘 흉갑", + "item.twilightforest.naga_leggings": "나가 비늘 레깅스", + "item.twilightforest.naga_scale": "나가 비늘", + "item.twilightforest.naga_spawn_egg": "나가 생성 알", + "item.twilightforest.ore_magnet": "광물 자석", + "item.twilightforest.ore_map": "빈 미로/광물 지도", + "item.twilightforest.ore_meter": "광물 계량기", + "item.twilightforest.peacock_feather_fan": "공작 깃털 부채", + "item.twilightforest.penguin_spawn_egg": "펭귄 생성 알", + "item.twilightforest.phantom_chestplate": "팬텀 흉갑", + "item.twilightforest.phantom_helmet": "팬텀 투구", + "item.twilightforest.pinch_beetle_spawn_egg": "집게벌레 생성 알", + "item.twilightforest.quest_ram_spawn_egg": "퀘스트 양 생성 알", + "item.twilightforest.raven_feather": "까마귀 깃털", + "item.twilightforest.raw_ironwood": "아이언우드 뭉치", + "item.twilightforest.raw_meef": "익히지 않은 미노타우르스고기", + "item.twilightforest.raw_venison": "익히지 않은 사슴고기", + "item.twilightforest.redcap_sapper_spawn_egg": "붉은모자 공병 생성 알", + "item.twilightforest.seeker_bow": "유도 활", + "item.twilightforest.skeleton_druid_spawn_egg": "스켈레톤 드루이드 생성 알", + "item.twilightforest.slime_beetle_spawn_egg": "슬라임벌레 생성 알", + "item.twilightforest.snow_guardian_spawn_egg": "눈의 수호자 생성 알", + "item.twilightforest.snow_queen_spawn_egg": "눈의 여왕 생성 알", + "item.twilightforest.stable_ice_core_spawn_egg": "안정한 얼음 코어 생성 알", + "item.twilightforest.steeleaf_axe": "강철잎 도끼", + "item.twilightforest.steeleaf_boots": "강철잎 부츠", + "item.twilightforest.steeleaf_chestplate": "강철잎 흉갑", + "item.twilightforest.steeleaf_helmet": "강철잎 투구", + "item.twilightforest.steeleaf_hoe": "강철잎 괭이", + "item.twilightforest.steeleaf_ingot": "강철잎", + "item.twilightforest.steeleaf_leggings": "강철잎 각반", + "item.twilightforest.steeleaf_pickaxe": "강철잎 곡괭이", + "item.twilightforest.steeleaf_shovel": "강철잎 삽", + "item.twilightforest.steeleaf_sword": "강철잎 검", + "item.twilightforest.swarm_spider_spawn_egg": "무리 거미 생성 알", + "item.twilightforest.tiny_bird_spawn_egg": "작은 새 생성 알", + "item.twilightforest.torchberries": "토치베리", + "item.twilightforest.tower_key": "탑의 열쇠", + "item.twilightforest.towerwood_borer_spawn_egg": "탑나무 좀벌레 생성 알", + "item.twilightforest.transformation_powder": "변신 가루", + "item.twilightforest.twilight_scepter": "황혼의 지배", + "item.twilightforest.unstable_ice_core_spawn_egg": "불안정한 얼음 코어 생성 알", + "item.twilightforest.ur_ghast_spawn_egg": "유어 가스트 생성 알", + "item.twilightforest.winter_wolf_spawn_egg": "겨울 늑대 생성 알", + "item.twilightforest.yeti_boots": "예티 부츠", + "item.twilightforest.yeti_chestplate": "예티 흉갑", + "item.twilightforest.yeti_helmet": "예티 뿔 투구", + "item.twilightforest.yeti_leggings": "예티 레깅스", + "item.twilightforest.yeti_spawn_egg": "예티 생성 알", + "item.twilightforest.zombie_scepter": "불사의 지배", + "itemGroup.twilightforest.blocks": "황혼의 숲: 블록", + "itemGroup.twilightforest.equipment": "황혼의 숲: 장비", + "itemGroup.twilightforest.items": "황혼의 숲: 아이템", + "subtitles.twilightforest.block.bug.squish": "벌레가 으깨집니다.", + "subtitles.twilightforest.block.casket.close": "기념품 상자가 닫힙니다.", + "subtitles.twilightforest.block.casket.locked": "기념품 상자가 잠겼습니다.", + "subtitles.twilightforest.block.casket.open": "기념품 상자가 열립니다.", + "subtitles.twilightforest.block.core.time": "시간나무가 째깍거립니다.", + "subtitles.twilightforest.block.core.transformation": "변화나무가 웅웅거립니다.", + "subtitles.twilightforest.block.door.reappear": "성문이 다시 등장했습니다.", + "subtitles.twilightforest.block.door.vanish": "성문이 사라집니다.", + "subtitles.twilightforest.block.jet.active": "화염 분출기가 확 타오릅니다.", + "subtitles.twilightforest.block.jet.pop": "화염 분출기가 펑 하는 소리를 냅니다.", + "subtitles.twilightforest.block.vanish.unlock": "탑나무 문이 잠금을 해제합니다.", + "subtitles.twilightforest.entity.boar.ambient": "멧돼지가 울음소리를 냅니다.", + "subtitles.twilightforest.entity.boar.death": "멧돼지가 죽습니다.", + "subtitles.twilightforest.entity.boar.hurt": "멧돼지가 다칩니다.", + "subtitles.twilightforest.entity.deer.death": "사슴이 죽습니다.", + "subtitles.twilightforest.entity.deer.hurt": "사슴이 다칩니다.", + "subtitles.twilightforest.entity.hydra.growl": "히드라가 으르렁거립니다.", + "subtitles.twilightforest.entity.hydra.hurt": "히드라가 다칩니다.", + "subtitles.twilightforest.entity.hydra.roar": "히드라가 고함을 지릅니다.", + "subtitles.twilightforest.entity.hydra.warn": "히드라가 물 준비를 합니다.", + "subtitles.twilightforest.entity.ice.death": "얼음 코어가 죽습니다.", + "subtitles.twilightforest.entity.ice.hurt": "얼음 코어가 다칩니다.", + "subtitles.twilightforest.entity.kobold.ambient": "코볼트가 울음소리를 냅니다.", + "subtitles.twilightforest.entity.kobold.death": "코볼트가 죽습니다.", + "subtitles.twilightforest.entity.kobold.hurt": "코볼트가 다칩니다.", + "subtitles.twilightforest.entity.lich.ambient": "리치가 울음소리를 냅니다.", + "subtitles.twilightforest.entity.lich.death": "리치가 죽습니다.", + "subtitles.twilightforest.entity.lich.hurt": "리치가 다칩니다.", + "subtitles.twilightforest.entity.lich.shoot": "리치가 쏩니다.", + "subtitles.twilightforest.entity.lich.teleport": "리치가 순간이동을 합니다.", + "subtitles.twilightforest.entity.minion.ambient": "리치 미니언이 울음소리를 냅니다.", + "subtitles.twilightforest.entity.minion.death": "리치 미니언이 죽습니다.", + "subtitles.twilightforest.entity.minion.hurt": "리치 미니언이 다칩니다.", + "subtitles.twilightforest.entity.minion.summon": "리치는 새로운 미니언을 소환합니다.", + "subtitles.twilightforest.entity.minoshroom.ambient": "미노쉬룸이 울음소리를 냅니다.", + "subtitles.twilightforest.entity.minoshroom.death": "미노쉬룸이 죽습니다.", + "subtitles.twilightforest.entity.minoshroom.hurt": "미노쉬룸이 다칩니다.", + "subtitles.twilightforest.entity.minotaur.ambient": "미노타우르스가 울음소리를 냅니다.", + "subtitles.twilightforest.entity.minotaur.death": "미노타우르스가 죽습니다.", + "subtitles.twilightforest.entity.minotaur.hurt": "미노타우르스가 다칩니다.", + "subtitles.twilightforest.entity.mosquito.ambient": "모기가 울음소리를 냅니다.", + "subtitles.twilightforest.entity.naga.hiss": "나가가 울음소리를 냅니다.", + "subtitles.twilightforest.entity.naga.hurt": "나가가 다칩니다.", + "subtitles.twilightforest.entity.naga.rattle": "나가가 울음소리를 냅니다.", + "subtitles.twilightforest.entity.raven.caw": "까마귀가 울음소리를 냅니다.", + "subtitles.twilightforest.entity.redcap.ambient": "붉은모자가 울음소리를 냅니다.", + "subtitles.twilightforest.entity.redcap.death": "붉은모자가 죽습니다.", + "subtitles.twilightforest.entity.redcap.hurt": "붉은모자가 다칩니다.", + "subtitles.twilightforest.entity.tear.break": "유어 가스트의 눈물이 산산조각납니다.", + "subtitles.twilightforest.entity.wraith.ambient": "망령이 울음소리를 냅니다.", + "subtitles.twilightforest.entity.wraith.death": "망령이 죽습니다.", + "subtitles.twilightforest.entity.wraith.hurt": "망령이 다칩니다.", + "subtitles.twilightforest.entity.yeti.death": "예티가 죽습니다.", + "subtitles.twilightforest.entity.yeti.growl": "예티가 으르렁거립니다.", + "subtitles.twilightforest.entity.yeti.hurt": "예티가 다칩니다.", + "subtitles.twilightforest.item.charm.keep": "보존의 부적이 아이템을 되돌립니다.", + "subtitles.twilightforest.item.moonworm.squish": "월충이 발사합니다.", + "subtitles.twilightforest.item.scepter.drain": "생명의 지배를 빼냅니다.", + "subtitles.twilightforest.item.scepter.pearl": "황혼의 지배가 진주를 던집니다.", + "twilightforest.book.darktower.1": "§8[[폭발에서 살아남은 것으로 보이는 탐험가의 수첩]]§0\n\n_이 탑은 내게 반응하지 않는 메커니즘이 있는 게 분명해요. 그들의 마법은 거의 제 손길을 인정하기를 갈망하지만, 인정해줄 수 없어요.", + "twilightforest.book.darktower.2": "그것은 탑의 장치들이 주변의 강력한 무리들에 의해 억압되고 있는 경우입니다.\n\n§8[[다음 장]]§0\n\n_마법은 근처 요새 깊은 곳에서 나오는 것 같아요. 그것은 고블린에게서 나올 수 없어요, 그들의 마법은 매력적이지만 집중이 안 되기 때문이죠.", + "twilightforest.book.darktower.3": "아직 거점에는 어떤 병력이 남아 있을 겁니다\n\n§8[[다음 장]]§0\n\n_분석 결과, 여러 가지 원천에서 발생했으며 그룹으로 운영되고 있습니다. 다시 보급한 후에 본거지로 돌아가겠습니다...." +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/kw_gb.json b/src/main/resources/assets/twilightforest/lang/kw_gb.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/kw_gb.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/la_va.json b/src/main/resources/assets/twilightforest/lang/la_va.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/la_va.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/lb_lu.json b/src/main/resources/assets/twilightforest/lang/lb_lu.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/lb_lu.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/li_li.json b/src/main/resources/assets/twilightforest/lang/li_li.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/li_li.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/lol_us.json b/src/main/resources/assets/twilightforest/lang/lol_us.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/lol_us.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/lt_lt.json b/src/main/resources/assets/twilightforest/lang/lt_lt.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/lt_lt.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/lv_lv.json b/src/main/resources/assets/twilightforest/lang/lv_lv.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/lv_lv.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/mk_mk.json b/src/main/resources/assets/twilightforest/lang/mk_mk.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/mk_mk.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/mn_mn.json b/src/main/resources/assets/twilightforest/lang/mn_mn.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/mn_mn.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/ms_my.json b/src/main/resources/assets/twilightforest/lang/ms_my.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/ms_my.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/mt_mt.json b/src/main/resources/assets/twilightforest/lang/mt_mt.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/mt_mt.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/nb_no.json b/src/main/resources/assets/twilightforest/lang/nb_no.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/nb_no.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/nds_de.json b/src/main/resources/assets/twilightforest/lang/nds_de.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/nds_de.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/nl_nl.json b/src/main/resources/assets/twilightforest/lang/nl_nl.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/nl_nl.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/nn_no.json b/src/main/resources/assets/twilightforest/lang/nn_no.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/nn_no.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/oc_fr.json b/src/main/resources/assets/twilightforest/lang/oc_fr.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/oc_fr.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/pl_pl.json b/src/main/resources/assets/twilightforest/lang/pl_pl.json new file mode 100644 index 0000000000..583065b7b8 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/pl_pl.json @@ -0,0 +1,198 @@ +{ + "advancement.twilightforest.arborist": "Maniakalny Dendrolog", + "advancement.twilightforest.arborist.desc": "Przygotuj topory i nożyce. Przeszukaj wszystkie zakamarki i zbierz wszystko, co pochodzi z drzew. Stwórz, zbierz, pozyskaj każdy półblok... sadzonkę... liście... więcej... wszystkiego. WSZYSTKO!", + "advancement.twilightforest.arctic_dyed.desc": "Ubarw cztery unikalne części Arktycznego Pancerza", + "advancement.twilightforest.beanstalk": "Jaś i Magiczna Fasola", + "advancement.twilightforest.beanstalk.desc": "Zdobądź %s w jaskiniach trolli i użyj ich na świecącej glebie pod chmurami", + "advancement.twilightforest.experiment_115": "Tajemnicze mięso?", + "advancement.twilightforest.experiment_115.desc": "Wygląda jak ciasto, jednak...", + "advancement.twilightforest.experiment_115_2": "Notuję: Wielki Sukces!", + "advancement.twilightforest.fiery_set": "Litry krwi i łez", + "advancement.twilightforest.fiery_set.desc": "Trzymaj ogniste narzędzie lub broń, jednocześnie nosząc przynajmniej jedną część ognistej zbroi", + "advancement.twilightforest.ghast_trap": "Coś dziwnego w Drewnie Wieży", + "advancement.twilightforest.ghast_trap.desc": "Zabij %ss dookoła %s i aktywuj, aby ciągnąć %s z nieba!", + "advancement.twilightforest.giants.desc": "Zabij %s w chmurach, odzyskaj %s i wróć do jaskiń trolli", + "advancement.twilightforest.glass_sword.desc": "Miejmy nadzieję, że dobrze to wykorzystałeś.", + "advancement.twilightforest.hedge": "Rozgniatacz Robaków", + "advancement.twilightforest.hill1": "Buty są moje!", + "advancement.twilightforest.hill1.desc": "Pokonaj %s w Małym Wydrążonym Pagórku", + "advancement.twilightforest.hill2": "Co to był za dźwięk?", + "advancement.twilightforest.hill2.desc": "Pokonaj %s w Średnim Wydrążonym Pagórku", + "advancement.twilightforest.hill3": "Widzę Wprost Przez Ciebie", + "advancement.twilightforest.hill3.desc": "Pokonaj %s w Dużym Wydrążonym Pagórku", + "advancement.twilightforest.kill_cicada": "Cśśś", + "advancement.twilightforest.kill_cicada.desc": "Zabij cykadę", + "advancement.twilightforest.kill_hydra": "Poskramiacz Hydry", + "advancement.twilightforest.kill_hydra.desc": "Pokonaj potężną %s, aby się wzmocnić", + "advancement.twilightforest.kill_lich.desc": "Zabij %s na szczycie jego wieży i odbierz mu berło, aby pozbyć się trujących komarów z Bagna, widzieć przez oślepiające ciemności klątwy Mrocznego Lasu i oprzeć się mrozom Śnieżnego Lasu", + "advancement.twilightforest.kill_naga.desc": "Zabij %s w leśnym dziedzińcu i pozyskaj %s aby pokonać magiczną barierę otaczającą wieżę Lisza", + "advancement.twilightforest.lich_scepters": "Przez Połączenie Naszych Mocy!", + "advancement.twilightforest.lich_scepters.desc": "Zdobądź wszystkie cztery berła mocy", + "advancement.twilightforest.magic_map": "Wszystko Stąd Widać", + "advancement.twilightforest.magic_map.desc": "Stwórz %s", + "advancement.twilightforest.magic_map_focus": "Zapisane Ogniem", + "advancement.twilightforest.magic_map_focus.desc": "Stwórz %s przy użyciu %s, %s i %s", + "advancement.twilightforest.maze_map": "A Teraz Tylko Znaleźć Wyjście", + "advancement.twilightforest.mazebreaker": "Niszczenie Labiryntu", + "advancement.twilightforest.mazebreaker.desc": "Znajdź %s kilof w tajemnym skarbcu labiryntu", + "advancement.twilightforest.naga_armors": "Zbrojmistrz Nag", + "advancement.twilightforest.naga_armors.desc": "Stwórz i napierśnik i nogawice %s", + "advancement.twilightforest.ore_map": "Jak To Może Być Tego Warte?", + "advancement.twilightforest.ore_map.desc": "Stwórz %s", + "advancement.twilightforest.progress_glacier": "Bezchmurne niebo", + "advancement.twilightforest.progress_glacier.desc": "Pokonaj %s na szczycie Pałacu Zorzy", + "advancement.twilightforest.progress_knights": "Zbieranie Karminitu", + "advancement.twilightforest.progress_knights.desc": "Pokonaj niespokojne fantomy w Grobowcu Rycerza, a urządzenia karminitowej wieży będą Ci posłuszne", + "advancement.twilightforest.progress_labyrinth": "Potężny Stroganoff", + "advancement.twilightforest.progress_merge": "Ostateczna potyczka", + "advancement.twilightforest.progress_merge.desc": "Zabij %s, %s i %s, aby powstrzymać kwaśny deszcz i przysposobić się do wyprawy na Wyżyny", + "advancement.twilightforest.progress_troll.desc": "Znajdź %s w jaskiniach trolli, aby móc spalić cierniowe bariery", + "advancement.twilightforest.progress_trophy_pedestal": "Czempion Trofeów", + "advancement.twilightforest.progress_trophy_pedestal.desc": "Odbierz swój tytuł, umieszczając trofeum na piedestale w ruinach Mrocznego Lasu", + "advancement.twilightforest.progress_ur_ghast": "Ogniste Łzy", + "advancement.twilightforest.progress_ur_ghast.desc": "Dotknij czerwonych ognistych łez %s", + "advancement.twilightforest.progress_yeti": "Futro Alfa", + "advancement.twilightforest.progress_yeti.desc": "Wyściel swoją odzież miękkim futrem z %s, by ochronić się przed zimnem Lodowca", + "advancement.twilightforest.progression_end": "Koniec Postępu", + "advancement.twilightforest.quest_ram": "Beczenie", + "advancement.twilightforest.quest_ram.desc": "Daj %s to, czego mu brakuje", + "advancement.twilightforest.root": "Las Zmierzchu", + "advancement.twilightforest.root.desc": "Odwiedź tajemniczy i magiczny Mroczny Las", + "advancement.twilightforest.troll.desc": "Znajdź i zabij %s", + "advancement.twilightforest.twilight_dining": "Ucztujmy Przy Wiecznym Zachodzie", + "advancement.twilightforest.twilight_hunter": "Dziwna Cisza Zapadła W Kniei", + "advancement.twilightforest.twilight_hunter.desc": "Upoluj trochę lokalnej fauny", + "biome.twilightforest.clearing": "Polana Zmierzchu", + "biome.twilightforest.dark_forest": "Mroczny Las", + "biome.twilightforest.dark_forest_center": "Centrum Mrocznego Lasu", + "biome.twilightforest.dense_forest": "Gęsty Las", + "biome.twilightforest.dense_mushroom_forest": "Gęsty Grzybowy Las", + "biome.twilightforest.enchanted_forest": "Zaczarowany Las", + "biome.twilightforest.final_plateau": "Finalny Płaskowyż", + "biome.twilightforest.fire_swamp": "Ogniste Moczary", + "biome.twilightforest.firefly_forest": "Las Świetlików", + "biome.twilightforest.forest": "Las Zmierzchu", + "biome.twilightforest.glacier": "Lodowiec Zmierzchu", + "biome.twilightforest.highlands": "Wyżyny Zmierzchu", + "biome.twilightforest.lake": "Jezioro Zmierzchu", + "biome.twilightforest.mushroom_forest": "Grzybowy Las", + "biome.twilightforest.oak_savannah": "Dębowa Sawanna", + "biome.twilightforest.snowy_forest": "Śnieżny las", + "biome.twilightforest.spooky_forest": "Upiorny Las", + "biome.twilightforest.stream": "Potok Zmierzchu", + "biome.twilightforest.swamp": "Moczary Zmierzchu", + "biome.twilightforest.thornlands": "Ciernie", + "biome.twilightforest.underground": "Podziemia", + "block.minecraft.banner.twilightforest.alpha_yeti.black": "Czarna Twarz Alpha Yeti", + "block.minecraft.banner.twilightforest.alpha_yeti.blue": "Niebieska Twarz Alpha Yeti", + "block.minecraft.banner.twilightforest.alpha_yeti.brown": "Brązowa Twarz Alpha Yeti", + "block.minecraft.banner.twilightforest.alpha_yeti.cyan": "Błękitna Twarz Alpha Yeti", + "block.minecraft.banner.twilightforest.alpha_yeti.gray": "Szara Twarz Alpha Yeti", + "block.minecraft.banner.twilightforest.alpha_yeti.green": "Zielona Twarz Alpha Yeti", + "block.minecraft.banner.twilightforest.alpha_yeti.light_blue": "Jasnoniebieska Twarz Alpha Yeti", + "block.minecraft.banner.twilightforest.alpha_yeti.light_gray": "Jasnoszara Twarz Alpha Yeti", + "block.minecraft.banner.twilightforest.alpha_yeti.lime": "Jasnozielona Twarz Alpha Yeti", + "block.minecraft.banner.twilightforest.alpha_yeti.magenta": "Karmazynowa Twarz Alpha Yeti", + "block.minecraft.banner.twilightforest.alpha_yeti.orange": "Pomarańczowa Twarz Alpha Yeti", + "block.minecraft.banner.twilightforest.alpha_yeti.pink": "Różowa Twarz Alpha Yeti", + "block.minecraft.banner.twilightforest.alpha_yeti.purple": "Fioletowa Twarz Alpha Yeti", + "block.minecraft.banner.twilightforest.alpha_yeti.red": "Czerwona Twarz Alpha Yeti", + "block.minecraft.banner.twilightforest.alpha_yeti.white": "Biała Twarz Alpha Yeti", + "block.minecraft.banner.twilightforest.alpha_yeti.yellow": "Żółta Twarz Alpha Yeti", + "block.minecraft.banner.twilightforest.hydra.black": "Czarny Płomień Hydry", + "block.minecraft.banner.twilightforest.hydra.blue": "Niebieski Płomień Hydry", + "block.minecraft.banner.twilightforest.hydra.brown": "Brązowy Płomień Hydry", + "block.minecraft.banner.twilightforest.hydra.cyan": "Błękitny Płomień Hydry", + "block.minecraft.banner.twilightforest.hydra.gray": "Szary Płomień Hydry", + "block.minecraft.banner.twilightforest.hydra.green": "Zielony Płomień Hydry", + "block.minecraft.banner.twilightforest.hydra.light_blue": "Jasnoniebieski Płomień Hydry", + "block.minecraft.banner.twilightforest.hydra.light_gray": "Jasnoszary Płomień Hydry", + "block.minecraft.banner.twilightforest.hydra.lime": "Jasnozielony Płomień Hydry", + "block.minecraft.banner.twilightforest.hydra.magenta": "Karmazynowy Płomień Hydry", + "block.minecraft.banner.twilightforest.hydra.orange": "Pomarańczowy Płomień Hydry", + "block.minecraft.banner.twilightforest.hydra.pink": "Różowy Płomień Hydry", + "block.minecraft.banner.twilightforest.hydra.purple": "Fioletowy Płomień Hydry", + "block.minecraft.banner.twilightforest.hydra.red": "Czerwony Płomień Hydry", + "block.minecraft.banner.twilightforest.hydra.white": "Biały Płomień Hydry", + "block.minecraft.banner.twilightforest.hydra.yellow": "Żółty Płomień Hydry", + "block.minecraft.banner.twilightforest.knight_phantom.black": "Hełm Czarnego Rycerza", + "block.minecraft.banner.twilightforest.knight_phantom.blue": "Hełm Niebieskiego Rycerza", + "block.minecraft.banner.twilightforest.knight_phantom.brown": "Hełm Brązowego Rycerza", + "block.minecraft.banner.twilightforest.knight_phantom.cyan": "Błękitny Hełm Rycerza", + "block.minecraft.banner.twilightforest.knight_phantom.gray": "Hełm Szarego Rycerza", + "block.minecraft.banner.twilightforest.knight_phantom.green": "Hełm Zielonego Rycerza", + "block.minecraft.banner.twilightforest.knight_phantom.light_blue": "Jasnoniebieski Hełm Rycerza", + "block.minecraft.banner.twilightforest.knight_phantom.light_gray": "Jasnoszary Hełm Rycerza", + "block.minecraft.banner.twilightforest.knight_phantom.lime": "Jasnozielony Hełm Rycerza", + "block.minecraft.banner.twilightforest.knight_phantom.magenta": "Karmazynowy Hełm Rycerza", + "block.minecraft.banner.twilightforest.knight_phantom.orange": "Pomarańczowy Hełm Rycerza", + "block.minecraft.banner.twilightforest.knight_phantom.pink": "Różowy Hełm Rycerza", + "block.minecraft.banner.twilightforest.knight_phantom.purple": "Fioletowy Hełm Rycerza", + "block.minecraft.banner.twilightforest.knight_phantom.red": "Czerwony Hełm Rycerza", + "block.minecraft.banner.twilightforest.knight_phantom.white": "Biały Hełm Rycerza", + "block.minecraft.banner.twilightforest.knight_phantom.yellow": "Żółty Hełm Rycerza", + "block.minecraft.banner.twilightforest.lich.black": "Czarna Korona Lisza", + "block.minecraft.banner.twilightforest.lich.blue": "Niebieska Korona Lisza", + "block.minecraft.banner.twilightforest.lich.brown": "Brązowa Korona Lisza", + "block.minecraft.banner.twilightforest.lich.cyan": "Błękitna Korona Lisza", + "block.minecraft.banner.twilightforest.lich.gray": "Szara Korona Lisza", + "block.minecraft.banner.twilightforest.lich.green": "Zielona Korona Lisza", + "block.minecraft.banner.twilightforest.lich.light_blue": "Jasnoniebieska Korona Lisza", + "block.minecraft.banner.twilightforest.lich.light_gray": "Jasnoszara Korona Lisza", + "block.minecraft.banner.twilightforest.lich.lime": "Jasnozielona Korona Lisza", + "block.minecraft.banner.twilightforest.lich.magenta": "Karmazynowa Korona Lisza", + "block.minecraft.banner.twilightforest.lich.orange": "Pomarańczowa Korona Lisza", + "block.minecraft.banner.twilightforest.lich.pink": "Różowa Korona Lisza", + "block.minecraft.banner.twilightforest.naga.pink": "Różowe Łuski Nagi", + "block.twilightforest.canopy_log": "Pień Drzewa Okapowego", + "block.twilightforest.canopy_sapling": "Sadzonka Drzewa Okapowego", + "block.twilightforest.canopy_wood": "Drewno Drzewa Okapowego", + "block.twilightforest.castle_brick": "Cegła Zamkowa", + "block.twilightforest.castle_brick_stairs": "Schody z Cegły Zamkowej", + "block.twilightforest.cicada": "Cykada", + "block.twilightforest.dark_log": "Pień Mrocznego Drzewa", + "block.twilightforest.darkwood_sapling": "Sadzonka Mrocznego Drzewa", + "block.twilightforest.hollow_oak_sapling": "Rozrosła Sadzonka Drzewa Zmierzchu", + "block.twilightforest.mangrove_log": "Pień Namorzynu", + "block.twilightforest.mangrove_sapling": "Sadzonka Namorzynu", + "block.twilightforest.mangrove_wood": "Drewno Namorzynu", + "block.twilightforest.mining_log": "Pień Drzewa Górnika", + "block.twilightforest.mining_sapling": "Sadzonka Drzewa Górnika", + "block.twilightforest.moonworm": "Księżycowy robak", + "block.twilightforest.rainbow_oak_sapling": "Sadzonka Tęczowego Dębu", + "block.twilightforest.sorting_log": "Pień Drzewa Sortowania", + "block.twilightforest.sorting_sapling": "Sadzonka Drzewa Sortującego", + "block.twilightforest.stripped_canopy_log": "Okorowany Pień Drzewa Okapowego", + "block.twilightforest.stripped_canopy_wood": "Okorowany Pień Drzewa Okapowego", + "block.twilightforest.stripped_dark_log": "Okorowany Pień Mrocznego Drzewa", + "block.twilightforest.stripped_mangrove_log": "Okorowany Pień Namorzynu", + "block.twilightforest.stripped_mangrove_wood": "Okorowany Pień Namorzynu", + "block.twilightforest.stripped_mining_log": "Okorowany Pień Drzewa Górnkia", + "block.twilightforest.stripped_sorting_log": "Okorowany Pień Drzewa Sortowania", + "block.twilightforest.stripped_time_log": "Okorowany Pień Drzewa Czasu", + "block.twilightforest.stripped_transformation_log": "Okorowany Pień Drzewa Transformacji", + "block.twilightforest.stripped_twilight_oak_log": "Okorowany Pień Drzewa Zmierzchu", + "block.twilightforest.stripped_twilight_oak_wood": "Okorowany Pień Drzewa Zmierzchu", + "block.twilightforest.time_log": "Pień z Drzewa Czasu", + "block.twilightforest.time_sapling": "Sadzonka Drzewa Czasu", + "block.twilightforest.transformation_log": "Pień z Drzewa Transformacji", + "block.twilightforest.transformation_sapling": "Sadzonka Drzewa Transformacji", + "block.twilightforest.twilight_oak_leaves": "Liście Drzewa Zmierzchu", + "block.twilightforest.twilight_oak_log": "Pień Dębu Zmierzchu", + "block.twilightforest.twilight_oak_sapling": "Chorowita Sadzonka Drzewa Zmierzchu", + "block.twilightforest.twilight_oak_wood": "Drewno Drzewa Zmierzchu", + "commands.tffeature.structure.conquer.status": "Flaga podbicia struktur: %s", + "commands.tffeature.structure.conquer.update": "Flaga podbicia struktury była %s, zmieniono na %s", + "commands.tffeature.structure.spawn_info": "%s, Waży %s", + "commands.tffeature.structure.spawn_list": "Lista spawnów dla tego obszaru to:", + "effect.twilightforest.frosted": "Omrożony", + "enchantment.twilightforest.chill_aura": "Mroźna Aura", + "enchantment.twilightforest.chill_aura.desc": "Dodaje szansę na to, że agresor zostanie zamrożony po zaatakowaniu noszącego.", + "enchantment.twilightforest.destruction": "Zniszczenie", + "enchantment.twilightforest.destruction.desc": "Pozwala Blokowi z Łańcuchem na niszczenie bloków z wyższym poziomem wydobycia.", + "enchantment.twilightforest.fire_react": "Ognista Reakcja", + "enchantment.twilightforest.fire_react.desc": "Dodaje szansę na to, że agresor stanie w ogniu po zaatakowaniu noszącego.", + "itemGroup.twilightforest.blocks": "Mroczny Las: Bloki", + "itemGroup.twilightforest.equipment": "Mroczny Las: Wyposażenie", + "itemGroup.twilightforest.items": "Mroczny Las: Przedmioty" +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/pt_br.json b/src/main/resources/assets/twilightforest/lang/pt_br.json new file mode 100644 index 0000000000..8db65f644c --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/pt_br.json @@ -0,0 +1,1063 @@ +{ + "advancement.twilightforest.arborist": "Dendrologista Maniaco", + "advancement.twilightforest.arborist.desc": "Prepare os seus machados e tesouras. Procure por todo canto e consiga tudo que vem de árvores! Crie, saque, obtenha cada laje... muda... folhas... mais... tudo. TUDO!", + "advancement.twilightforest.arctic_dyed": "Ficando na Moda", + "advancement.twilightforest.arctic_dyed.desc": "Tinja todas as quatro peças de Armadura Ártica", + "advancement.twilightforest.beanstalk": "João e o Pé de Feijão", + "advancement.twilightforest.beanstalk.desc": "Obtenha alguns %s nas cavernas dos trolls e os use no solo luminoso abaixo das nuvens", + "advancement.twilightforest.experiment_115": "Carne Misteriosa?", + "advancement.twilightforest.experiment_115.desc": "Mas parece bolo...", + "advancement.twilightforest.experiment_115_2": "Fazendo uma nota: Grande Sucesso!", + "advancement.twilightforest.experiment_115_2.desc": "Está tão delicioso e molhado!", + "advancement.twilightforest.experiment_115_3": "Comendo 115 Todo Dia, 115 Anos, Para Sempre", + "advancement.twilightforest.experiment_115_3.desc": "comendo o experimento cento-e-quinze o dia todo, para sempre, cento-e-quinze vezes experimento cento-e-quinze, experimento cento-e-quinze ponto com, dáblio dáblio dáblio ponto experimento cento-e-quinze ponto com, cento-e-quinze anos, todo minuto experimento cento-e-quinze ponto com, dáblio dáblio dáblio ponto cento-e-quinze vezes experimento cento-e-quinze ponto com", + "advancement.twilightforest.fiery_set": "Galões de Sangue e Lágrimas", + "advancement.twilightforest.fiery_set.desc": "Empunhe uma ferramenta ou arma ardente enquanto tiver pelo menos uma peça de armadura ardente em seu inventário", + "advancement.twilightforest.full_mettle_alchemist": "Full Arrojo Alchemist", + "advancement.twilightforest.full_mettle_alchemist.desc": "Beba quatro doses de Dano II de um cantil de poções em menos de 8 segundos e sobreviva", + "advancement.twilightforest.ghast_trap": "Algo Estranho na Torre de Madeira", + "advancement.twilightforest.ghast_trap.desc": "Mate os %s em torno de uma %s e a ative para tirar a %s do céu!", + "advancement.twilightforest.giants": "Estou nas Nuvens", + "advancement.twilightforest.giants.desc": "Mate um %s nas nuvens, recupere um %s, e volte para as Cavernas de Troll", + "advancement.twilightforest.glass_sword": "O Golpe Maravilha", + "advancement.twilightforest.glass_sword.desc": "Espero que tenha feito bom uso disso.", + "advancement.twilightforest.hedge": "Esmagador de Insetos", + "advancement.twilightforest.hedge.desc": "Derrote uma aranha no Labirinto de Cobertura", + "advancement.twilightforest.hill1": "As Botas São Minhas!", + "advancement.twilightforest.hill1.desc": "Derrote um %s em uma Colina Oca Pequena", + "advancement.twilightforest.hill2": "O Que Foi Esse Barulho?", + "advancement.twilightforest.hill2.desc": "Derrote um %s em uma Colina Oca Média", + "advancement.twilightforest.hill3": "Eu Vejo Diretamente Através de Você", + "advancement.twilightforest.hill3.desc": "Derrote um %s em uma Colina Oca Grande", + "advancement.twilightforest.hydra_chop": "Costela de Hidra, Bebê!", + "advancement.twilightforest.hydra_chop.desc": "Coma um %s enquanto a barra de comida estiver vazia", + "advancement.twilightforest.kill_cicada": "Calada", + "advancement.twilightforest.kill_cicada.desc": "Mate uma cigarra", + "advancement.twilightforest.kill_hydra": "Destruidor da Hidra", + "advancement.twilightforest.kill_hydra.desc": "Derrote o poderoso %s e fortaleça-se", + "advancement.twilightforest.kill_lich": "Traga Para Fora os Mortos", + "advancement.twilightforest.kill_lich.desc": "Mate o %s no topo da sua torre e reivindique um cetro para afastar os mosquitos venenosos do Pântano, ver pela maldição da cegueira da Floresta Negra, e resistir o frio da Floresta de Neve", + "advancement.twilightforest.kill_naga": "Hora de Equilibrar As Escamas", + "advancement.twilightforest.kill_naga.desc": "Mate %s no seu pátio da floresta e obtenha %s para ultrapassar a barreira mágica em torno da torre do Lich", + "advancement.twilightforest.lich_scepters": "Pelos Nossos Poderes Combinados!", + "advancement.twilightforest.lich_scepters.desc": "Adquira os 4 cetros do poder", + "advancement.twilightforest.magic_map": "Eu Posso Ver Para Sempre", + "advancement.twilightforest.magic_map.desc": "Crie o %s", + "advancement.twilightforest.magic_map_focus": "Com Fogo se Escreve", + "advancement.twilightforest.magic_map_focus.desc": "Crie o %s com um %s, %s e %s", + "advancement.twilightforest.maze_map": "E Agora, Achar a Saída", + "advancement.twilightforest.maze_map.desc": "Crie o %s depois de obter o foco do labirinto", + "advancement.twilightforest.mazebreaker": "Quebrando o Labirinto", + "advancement.twilightforest.mazebreaker.desc": "Ache a picareta %s no cofre secreto do labirinto", + "advancement.twilightforest.naga_armors": "Armeiro da Naga", + "advancement.twilightforest.ore_map": "Como Isso Pode Valer a Pena?", + "advancement.twilightforest.progress_glacier": "Céu Limpo", + "advancement.twilightforest.progress_knights": "Aclimatação de Carminite", + "advancement.twilightforest.progress_labyrinth": "O Poderoso Estrogonofe", + "advancement.twilightforest.progress_merge": "O Confronto Final", + "advancement.twilightforest.progress_troll": "Eu Desejo Por Mais Queima", + "advancement.twilightforest.progress_trophy_pedestal": "Campeão Trofiado", + "advancement.twilightforest.progress_ur_ghast": "Lágrimas de Fogo", + "advancement.twilightforest.progress_yeti": "Pelo Alfa", + "advancement.twilightforest.quest_ram": "Baaahs Consumidos", + "advancement.twilightforest.root": "Floresta do Crepúsculo", + "advancement.twilightforest.troll": "Uma Pequena Zoeirinha", + "advancement.twilightforest.twilight_dining": "Jantamos ao Pôr do Sol Eterno", + "advancement.twilightforest.twilight_hunter": "O Silêncio da Floresta", + "biome.twilightforest.clearing": "Clareira do Crepúsculo", + "biome.twilightforest.dark_forest": "Floresta Sombria", + "biome.twilightforest.dark_forest_center": "Centro da Floresta Sombria", + "biome.twilightforest.dense_forest": "Floresta Densa", + "biome.twilightforest.dense_mushroom_forest": "Floresta de Cogumelo Densa", + "biome.twilightforest.enchanted_forest": "Floresta Encantada", + "biome.twilightforest.final_plateau": "Platô Final", + "biome.twilightforest.fire_swamp": "Pântano de Fogo", + "biome.twilightforest.firefly_forest": "Floresta Vaga-lume", + "biome.twilightforest.forest": "Floresta do Crepúsculo", + "biome.twilightforest.glacier": "Geleira do Crepúsculo", + "biome.twilightforest.highlands": "Planalto do Crepúsculo", + "biome.twilightforest.lake": "Lago do Crepúsculo", + "biome.twilightforest.mushroom_forest": "Floresta de Cogumelo", + "biome.twilightforest.oak_savannah": "Savana de Carvalho", + "biome.twilightforest.snowy_forest": "Floresta Nevada", + "biome.twilightforest.spooky_forest": "Floresta Assustadora", + "biome.twilightforest.stream": "Corrente do Crepúsculo", + "biome.twilightforest.swamp": "Pântano do Crepúsculo", + "biome.twilightforest.thornlands": "Terras de Espinhos", + "biome.twilightforest.underground": "Subterrâneo", + "block.minecraft.banner.twilightforest.alpha_yeti.black": "Cara do Iéti Alfa Preta", + "block.minecraft.banner.twilightforest.alpha_yeti.blue": "Cara do Iéti Alfa Azul", + "block.minecraft.banner.twilightforest.alpha_yeti.brown": "Cara do Iéti Alfa Marrom", + "block.minecraft.banner.twilightforest.alpha_yeti.cyan": "Cara do Iéti Alfa Ciano", + "block.minecraft.banner.twilightforest.alpha_yeti.gray": "Cara do Iéti Alfa Cinza", + "block.minecraft.banner.twilightforest.alpha_yeti.green": "Cara do Iéti Alfa Verde", + "block.minecraft.banner.twilightforest.alpha_yeti.light_blue": "Cara do Iéti Alfa Azul Claro", + "block.minecraft.banner.twilightforest.alpha_yeti.light_gray": "Cara do Iéti Alfa Cinza Claro", + "block.minecraft.banner.twilightforest.alpha_yeti.lime": "Cara do Iéti Alfa Lima", + "block.minecraft.banner.twilightforest.alpha_yeti.magenta": "Cara do Iéti Alfa Magenta", + "block.minecraft.banner.twilightforest.alpha_yeti.orange": "Cara do Iéti Alfa Laranja", + "block.minecraft.banner.twilightforest.alpha_yeti.pink": "Cara do Iéti Alfa Rosa", + "block.minecraft.banner.twilightforest.alpha_yeti.purple": "Cara do Iéti Alfa Roxa", + "block.minecraft.banner.twilightforest.alpha_yeti.red": "Cara do Iéti Alfa Vermelha", + "block.minecraft.banner.twilightforest.alpha_yeti.white": "Cara do Iéti Alfa Branca", + "block.minecraft.banner.twilightforest.alpha_yeti.yellow": "Cara do Iéti Alfa Amarela", + "block.minecraft.banner.twilightforest.hydra.black": "Chama de Hidra Preta", + "block.minecraft.banner.twilightforest.hydra.blue": "Chama de Hidra Azul", + "block.minecraft.banner.twilightforest.hydra.brown": "Chama de Hidra Marrom", + "block.minecraft.banner.twilightforest.hydra.cyan": "Chama de Hidra Ciana", + "block.minecraft.banner.twilightforest.hydra.gray": "Chama de Hidra Cinza", + "block.minecraft.banner.twilightforest.hydra.green": "Chama de Hidra Verde", + "block.minecraft.banner.twilightforest.hydra.light_blue": "Chama de Hidra Azul Clara", + "block.minecraft.banner.twilightforest.hydra.light_gray": "Chama de Hidra Cinza Clara", + "block.minecraft.banner.twilightforest.hydra.lime": "Chama de Hidra Lima", + "block.minecraft.banner.twilightforest.hydra.magenta": "Chama de Hidra Magenta", + "block.minecraft.banner.twilightforest.hydra.orange": "Chama de Hidra Laranja", + "block.minecraft.banner.twilightforest.hydra.pink": "Chama de Hidra Rosa", + "block.minecraft.banner.twilightforest.hydra.purple": "Chama de Hidra Roxa", + "block.minecraft.banner.twilightforest.hydra.red": "Chama de Hidra Vermelha", + "block.minecraft.banner.twilightforest.hydra.white": "Chama de Hidra Branca", + "block.minecraft.banner.twilightforest.hydra.yellow": "Chama de Hidra Amarela", + "block.minecraft.banner.twilightforest.knight_phantom.black": "Capacete do Cavaleiro Preto", + "block.minecraft.banner.twilightforest.knight_phantom.blue": "Capacete do Cavaleiro Azul", + "block.minecraft.banner.twilightforest.knight_phantom.brown": "Capacete do Cavaleiro Marrom", + "block.minecraft.banner.twilightforest.knight_phantom.cyan": "Capacete do Cavaleiro Ciano", + "block.minecraft.banner.twilightforest.knight_phantom.gray": "Capacete do Cavaleiro Cinza", + "block.minecraft.banner.twilightforest.knight_phantom.green": "Capacete do Cavaleiro Verde", + "block.minecraft.banner.twilightforest.knight_phantom.light_blue": "Capacete do Cavaleiro Azul Claro", + "block.minecraft.banner.twilightforest.knight_phantom.light_gray": "Capacete do Cavaleiro Cinza Claro", + "block.minecraft.banner.twilightforest.knight_phantom.lime": "Capacete do Cavaleiro Lima", + "block.minecraft.banner.twilightforest.knight_phantom.magenta": "Capacete do Cavaleiro Magenta", + "block.minecraft.banner.twilightforest.knight_phantom.orange": "Capacete do Cavaleiro Laranja", + "block.minecraft.banner.twilightforest.knight_phantom.pink": "Capacete do Cavaleiro Rosa", + "block.minecraft.banner.twilightforest.knight_phantom.purple": "Capacete do Cavaleiro Roxo", + "block.minecraft.banner.twilightforest.knight_phantom.red": "Capacete do Cavaleiro Vermelho", + "block.minecraft.banner.twilightforest.knight_phantom.white": "Capacete do Cavaleiro Branco", + "block.minecraft.banner.twilightforest.knight_phantom.yellow": "Capacete do Cavaleiro Amarelo", + "block.minecraft.banner.twilightforest.lich.black": "Coroa do Lich Preta", + "block.minecraft.banner.twilightforest.lich.blue": "Coroa do Lich Azul", + "block.minecraft.banner.twilightforest.lich.brown": "Coroa do Lich Marrom", + "block.minecraft.banner.twilightforest.lich.cyan": "Coroa do Lich Ciano", + "block.minecraft.banner.twilightforest.lich.gray": "Coroa do Lich Cinza", + "block.minecraft.banner.twilightforest.lich.green": "Coroa do Lich Verde", + "block.minecraft.banner.twilightforest.lich.light_blue": "Coroa do Lich Azul Claro", + "block.minecraft.banner.twilightforest.lich.light_gray": "Coroa do Lich Cinza Claro", + "block.minecraft.banner.twilightforest.lich.lime": "Coroa do Lich Lima", + "block.minecraft.banner.twilightforest.lich.magenta": "Coroa do Lich Magenta", + "block.minecraft.banner.twilightforest.lich.orange": "Coroa do Lich Laranja", + "block.minecraft.banner.twilightforest.lich.pink": "Coroa do Lich Rosa", + "block.minecraft.banner.twilightforest.lich.purple": "Coroa do Lich Roxa", + "block.minecraft.banner.twilightforest.lich.red": "Coroa do Lich Vermelha", + "block.minecraft.banner.twilightforest.lich.white": "Coroa do Lich Branca", + "block.minecraft.banner.twilightforest.lich.yellow": "Coroa do Lich Amarela", + "block.minecraft.banner.twilightforest.minoshroom.black": "Machados do Minogumelo Pretos", + "block.minecraft.banner.twilightforest.minoshroom.blue": "Machados de Minogumelo Azuis", + "block.minecraft.banner.twilightforest.minoshroom.brown": "Machados de Minogumelo Marrom", + "block.minecraft.banner.twilightforest.minoshroom.cyan": "Machados de Minogumelo Ciano", + "block.minecraft.banner.twilightforest.minoshroom.gray": "Machados do Minogumelo Cinzas", + "block.minecraft.banner.twilightforest.minoshroom.green": "Machados de Minogumelo Verdes", + "block.minecraft.banner.twilightforest.minoshroom.light_blue": "Machados de Minogumelo Azuis Claros", + "block.minecraft.banner.twilightforest.minoshroom.light_gray": "Machados de Minogumelo Cinza Claros", + "block.minecraft.banner.twilightforest.minoshroom.lime": "Machados de Minogumelo Lima", + "block.minecraft.banner.twilightforest.minoshroom.magenta": "Machados de Minogumelo Magenta", + "block.minecraft.banner.twilightforest.minoshroom.orange": "Machados de Minogumelo Laranjas", + "block.minecraft.banner.twilightforest.minoshroom.pink": "Machados de Minogumelo Rosa", + "block.minecraft.banner.twilightforest.minoshroom.purple": "Machados de Minogumelo Roxos", + "block.minecraft.banner.twilightforest.minoshroom.red": "Machados de Minogumelo Vermelhos", + "block.minecraft.banner.twilightforest.minoshroom.white": "Machados de Minogumelo Brancos", + "block.minecraft.banner.twilightforest.minoshroom.yellow": "Machados de Minogumelo Amarelos", + "block.minecraft.banner.twilightforest.naga.black": "Escamas da Naga Pretas", + "block.minecraft.banner.twilightforest.naga.blue": "Escamas da Naga Azuis", + "block.minecraft.banner.twilightforest.naga.brown": "Escamas da Naga Marrons", + "block.minecraft.banner.twilightforest.naga.cyan": "Escamas da Naga Ciano", + "block.minecraft.banner.twilightforest.naga.gray": "Escamas da Naga Cinzas", + "block.minecraft.banner.twilightforest.naga.green": "Escamas da Naga Verdes", + "block.minecraft.banner.twilightforest.naga.light_blue": "Escamas da Naga Azuis Claro", + "block.minecraft.banner.twilightforest.naga.light_gray": "Escamas da Naga Cinzas Claro", + "block.minecraft.banner.twilightforest.naga.lime": "Escamas da Naga Lima", + "block.minecraft.banner.twilightforest.naga.magenta": "Escamas da Naga Magentas", + "block.minecraft.banner.twilightforest.naga.orange": "Escamas da Naga Laranjas", + "block.minecraft.banner.twilightforest.naga.pink": "Escamas da Naga Rosas", + "block.minecraft.banner.twilightforest.naga.purple": "Escamas da Naga Roxas", + "block.minecraft.banner.twilightforest.naga.red": "Escamas da Naga Vermelhas", + "block.minecraft.banner.twilightforest.naga.white": "Escamas da Naga Brancas", + "block.minecraft.banner.twilightforest.naga.yellow": "Escamas da Naga Amarelas", + "block.minecraft.banner.twilightforest.quest_ram.black": "Redemoinhos de Carneiro de Missão Preto", + "block.minecraft.banner.twilightforest.quest_ram.blue": "Redemoinhos de Carneiro de Missão Azul", + "block.minecraft.banner.twilightforest.quest_ram.brown": "Redemoinhos de Carneiro de Missão Castanho", + "block.minecraft.banner.twilightforest.quest_ram.cyan": "Redemoinhos de Carneiro de Missão Ciano", + "block.minecraft.banner.twilightforest.quest_ram.gray": "Redemoinhos de Carneiro de Missão Cinza", + "block.minecraft.banner.twilightforest.quest_ram.green": "Redemoinhos de Carneiro de Missão Verde", + "block.minecraft.banner.twilightforest.quest_ram.light_blue": "Redemoinhos de Carneiro de Missão Azul Claro", + "block.minecraft.banner.twilightforest.quest_ram.light_gray": "Redemoinhos de Carneiro de Missão Cinza Claro", + "block.minecraft.banner.twilightforest.quest_ram.lime": "Redemoinhos de Carneiro de Missão Lima", + "block.minecraft.banner.twilightforest.quest_ram.magenta": "Redemoinhos de Carneiro de Missão Magenta", + "block.minecraft.banner.twilightforest.quest_ram.orange": "Redemoinhos de Carneiro de Missão Laranja", + "block.minecraft.banner.twilightforest.quest_ram.pink": "Redemoinhos de Carneiro de Missão Rosa", + "block.minecraft.banner.twilightforest.quest_ram.purple": "Redemoinhos de Carneiro de Missão Roxo", + "block.minecraft.banner.twilightforest.quest_ram.red": "Redemoinhos de Carneiro de Missão Vermelho", + "block.minecraft.banner.twilightforest.quest_ram.white": "Redemoinhos de Carneiro de Missão Branco", + "block.minecraft.banner.twilightforest.quest_ram.yellow": "Redemoinhos de Carneiro de Missão Amarelo", + "block.minecraft.banner.twilightforest.snow_queen.black": "Coroa da Rainha da Neve Preta", + "block.minecraft.banner.twilightforest.snow_queen.blue": "Coroa da Rainha do Gelo Azul", + "block.minecraft.banner.twilightforest.snow_queen.brown": "Coroa da Rainha do Gelo Marrom", + "block.minecraft.banner.twilightforest.snow_queen.cyan": "Coroa da Rainha do Gelo Ciana", + "block.minecraft.banner.twilightforest.snow_queen.gray": "Coroa da Rainha da Neve Cinza", + "block.minecraft.banner.twilightforest.snow_queen.green": "Coroa da Rainha do Gelo Verde", + "block.minecraft.banner.twilightforest.snow_queen.light_blue": "Coroa da Rainha do Gelo Azul Clara", + "block.minecraft.banner.twilightforest.snow_queen.light_gray": "Coroa da Rainha da Neve Cinza Claro", + "block.minecraft.banner.twilightforest.snow_queen.lime": "Coroa da Rainha do Gelo Lima", + "block.minecraft.banner.twilightforest.snow_queen.magenta": "Coroa da Rainha do Gelo Magenta", + "block.minecraft.banner.twilightforest.snow_queen.orange": "Coroa da Rainha da Neve Laranja", + "block.minecraft.banner.twilightforest.snow_queen.pink": "Coroa da Rainha do Gelo Rosa", + "block.minecraft.banner.twilightforest.snow_queen.purple": "Coroa da Rainha do Gelo Roxa", + "block.minecraft.banner.twilightforest.snow_queen.red": "Coroa da Rainha da Neve Vermelha", + "block.minecraft.banner.twilightforest.snow_queen.white": "Coroa da Rainha da Neve Branca", + "block.minecraft.banner.twilightforest.snow_queen.yellow": "Coroa da Rainha da Neve Amarela", + "block.minecraft.banner.twilightforest.ur_ghast.black": "Borda de Carminite Preta", + "block.minecraft.banner.twilightforest.ur_ghast.blue": "Borda de Carminite Azul", + "block.minecraft.banner.twilightforest.ur_ghast.brown": "Borda de Carminite Marrom", + "block.minecraft.banner.twilightforest.ur_ghast.cyan": "Borda de Carminite Ciana", + "block.minecraft.banner.twilightforest.ur_ghast.gray": "Borda de Carminite Cinza", + "block.minecraft.banner.twilightforest.ur_ghast.green": "Borda de Carminite Verde", + "block.minecraft.banner.twilightforest.ur_ghast.light_blue": "Borda de Carminite Azul Clara", + "block.minecraft.banner.twilightforest.ur_ghast.light_gray": "Borda de Carminite Cinza Clara", + "block.minecraft.banner.twilightforest.ur_ghast.lime": "Borda de Carminite Lima", + "block.minecraft.banner.twilightforest.ur_ghast.magenta": "Borda de Carminite Magenta", + "block.minecraft.banner.twilightforest.ur_ghast.orange": "Borda de Carminite Laranja", + "block.minecraft.banner.twilightforest.ur_ghast.pink": "Borda de Carminite Rosa", + "block.minecraft.banner.twilightforest.ur_ghast.purple": "Borda de Carminite Roxa", + "block.minecraft.banner.twilightforest.ur_ghast.red": "Borda de Carminite Vermelha", + "block.minecraft.banner.twilightforest.ur_ghast.white": "Borda de Carminite Branca", + "block.minecraft.banner.twilightforest.ur_ghast.yellow": "Borda de Carminite Amarela", + "block.twilightforest.acacia_banister": "Corrimão de Acácia", + "block.twilightforest.alpha_yeti_boss_spawner": "Gerador de Chefe Iéti Alfa", + "block.twilightforest.alpha_yeti_trophy": "Troféu de Iéti Alfa", + "block.twilightforest.arctic_fur_block": "Bloco de Pelo Ártico", + "block.twilightforest.aurora_block": "Bloco de Aurora", + "block.twilightforest.aurora_pillar": "Pilar de Aurora", + "block.twilightforest.aurora_slab": "Laje de Aurora", + "block.twilightforest.auroralized_glass": "Vidro Auroralizado", + "block.twilightforest.banister.cycle": "Clique com o botão direito com um machado para alternar", + "block.twilightforest.beanstalk_leaves": "Folhas de Pé de Feijão", + "block.twilightforest.birch_banister": "Corrimão de Bétula", + "block.twilightforest.blue_castle_door": "Porta do Castelo Azul", + "block.twilightforest.blue_castle_rune_brick": "Tijolo de Castelo Rúnico Azul", + "block.twilightforest.blue_force_field": "Campo de Força Azul", + "block.twilightforest.bold_castle_brick_pillar": "Pillar de Tijolos de Castelo Forte", + "block.twilightforest.bold_castle_brick_stairs": "Escadas de Tijolo do Castelo Fortes", + "block.twilightforest.bold_stone_pillar": "Pillar de Pedra Forte", + "block.twilightforest.brown_thorns": "Espinhos", + "block.twilightforest.built_block": "Bloco Construído", + "block.twilightforest.burnt_thorns": "Espinhos Queimados", + "block.twilightforest.candelabra": "Candelabro", + "block.twilightforest.canopy_banister": "Corrimão de Marquise", + "block.twilightforest.canopy_bookshelf": "Estante de Marquise", + "block.twilightforest.canopy_button": "Botão de Marquise", + "block.twilightforest.canopy_chest": "Baú de Marquise", + "block.twilightforest.canopy_door": "Porta de Marquise", + "block.twilightforest.canopy_fence": "Cerca de Marquise", + "block.twilightforest.canopy_fence_gate": "Portão de Cerca de Marquise", + "block.twilightforest.canopy_leaves": "Folhas de Árvore de Marquise", + "block.twilightforest.canopy_log": "Tronco de Árvore de Marquise", + "block.twilightforest.canopy_planks": "Tábuas de Marquise", + "block.twilightforest.canopy_pressure_plate": "Placa de Pressão de Marquise", + "block.twilightforest.canopy_sapling": "Muda de Árvore de Marquise", + "block.twilightforest.canopy_sign": "Placa de Marquise", + "block.twilightforest.canopy_slab": "Laje de Marquise", + "block.twilightforest.canopy_stairs": "Escadas de Marquise", + "block.twilightforest.canopy_trapdoor": "Alçapão de Marquise", + "block.twilightforest.canopy_wall_sign": "Placa de Parede de Marquise", + "block.twilightforest.canopy_wood": "Madeira de Árvore de Marquise", + "block.twilightforest.carminite_block": "Bloco de Carminite", + "block.twilightforest.carminite_builder": "Construtor de Carminite", + "block.twilightforest.carminite_reactor": "Reactor de Carminite", + "block.twilightforest.casket.broken": "Seu Caixão da Recordação estava muito danificado para carregar mais itens. Todos os itens que seriam guardados em seu caixão foram derrubados no chão.", + "block.twilightforest.casket.locked": "Este Caixão só pode ser aberto por %s!", + "block.twilightforest.castle_brick": "Tijolo do Castelo", + "block.twilightforest.castle_brick_stairs": "Escadas de Tijolo do Castelo", + "block.twilightforest.castle_roof_tile": "Telha do Telhado de Castelo", + "block.twilightforest.cicada": "Cigarra", + "block.twilightforest.cicada_jar": "Jarra de Cigarra", + "block.twilightforest.cinder_furnace": "Fornalha de Cinzas", + "block.twilightforest.cinder_log": "Tronco de Cinzas", + "block.twilightforest.cinder_wood": "Madeira de Cinzas", + "block.twilightforest.clover_patch": "Caminho de Trevos", + "block.twilightforest.cracked_castle_brick": "Tijolo do Castelo Rachado", + "block.twilightforest.cracked_castle_brick_stairs": "Escadas de Tijolo do Castelo Rachado", + "block.twilightforest.cracked_deadrock": "Pedra Morta Rachada", + "block.twilightforest.cracked_mazestone": "Tijolos do Labirinto Rachado", + "block.twilightforest.cracked_underbrick": "Subtijolo Rachado", + "block.twilightforest.creeper_skull_candle": "Vela de Crânio de Creeper", + "block.twilightforest.creeper_wall_skull_candle": "Vela de Crânio de Creeper de Parede", + "block.twilightforest.crimson_banister": "Corrimão de Carmesim", + "block.twilightforest.cut_mazestone": "Pedra do Labirinto Cortada", + "block.twilightforest.dark_button": "Botão de Madeira Negra", + "block.twilightforest.dark_door": "Porta de Madeira Negra", + "block.twilightforest.dark_fence": "Cerca de Madeira Negra", + "block.twilightforest.dark_fence_gate": "Portão de Cerca de Madeira Negra", + "block.twilightforest.dark_leaves": "Folhas de Madeira Negra", + "block.twilightforest.dark_log": "Tronco de Madeira Negra", + "block.twilightforest.dark_oak_banister": "Corrimão de Madeira de Carvalho Escuro", + "block.twilightforest.dark_planks": "Tábuas de Madeira Negra", + "block.twilightforest.dark_pressure_plate": "Placa de Pressão de Madeira Negra", + "block.twilightforest.dark_slab": "Laje de Madeira Negra", + "block.twilightforest.dark_stairs": "Escadas de Madeira Negra", + "block.twilightforest.dark_trapdoor": "Alçapão de Madeira Negra", + "block.twilightforest.darkwood_sapling": "Muda de Madeira Negra", + "block.twilightforest.deadrock": "Pedra Morta", + "block.twilightforest.death_tome_spawner": "Gerador de Tomo da Morte", + "block.twilightforest.decorative_mazestone": "Tijolos do Labirinto Decorativos", + "block.twilightforest.empty_canopy_bookshelf": "Estante de Marquise Vazia", + "block.twilightforest.encased_castle_brick_pillar": "Pilar de Tijolos de Castelo Encapsulado", + "block.twilightforest.encased_castle_brick_stairs": "Escadas de Tijolo do Castelo Encapsuladas", + "block.twilightforest.encased_castle_brick_tile": "Telha de Tijolos de Castelo Encapsulada", + "block.twilightforest.encased_fire_jet": "Jato de Fogo Encapsulado", + "block.twilightforest.encased_smoker": "Defumador Encapsulado", + "block.twilightforest.etched_nagastone": "Pedra de Naga Cravada", + "block.twilightforest.experiment_115": "Experimento 115", + "block.twilightforest.fiery_block": "Bloco de Metal Ardente", + "block.twilightforest.final_boss_boss_spawner": "Gerador de Chefe Chefe Final", + "block.twilightforest.fire_jet": "Jato de Fogo", + "block.twilightforest.firefly": "Vaga-lume", + "block.twilightforest.firefly_jar": "Jarra de Vaga-lume", + "block.twilightforest.firefly_particle_spawner": "Gerador de Partículas de Vaga-lume", + "block.twilightforest.fluffy_cloud": "Nuvem Fofinha", + "block.twilightforest.ghast_trap": "Armadilha de Ghast", + "block.twilightforest.giant_cobblestone": "Pedregulho Gigante", + "block.twilightforest.giant_leaves": "Folhas Gigantes", + "block.twilightforest.giant_log": "Tronco Gigante", + "block.twilightforest.giant_obsidian": "Obsidiana Gigante", + "block.twilightforest.green_force_field": "Campo de Força Verde", + "block.twilightforest.green_thorns": "Espinhos Verdes", + "block.twilightforest.hardened_dark_leaves": "Folhas Grossas de Madeira Negra", + "block.twilightforest.hedge": "Cobertura", + "block.twilightforest.hollow_acacia_log_climbable": "Tronco de Acácia Oca", + "block.twilightforest.hollow_acacia_log_horizontal": "Tronco de Acácia Oca", + "block.twilightforest.hollow_acacia_log_vertical": "Tronco de Acácia Oca", + "block.twilightforest.hollow_birch_log_climbable": "Tronco de Bétula Oca", + "block.twilightforest.hollow_birch_log_horizontal": "Tronco de Bétula Oca", + "block.twilightforest.hollow_birch_log_vertical": "Tronco de Bétula Oca", + "block.twilightforest.hollow_crimson_stem_climbable": "Caule de Carmesim Oco", + "block.twilightforest.hollow_crimson_stem_horizontal": "Caule Oco de Carmesim", + "block.twilightforest.hollow_crimson_stem_vertical": "Caule de Carmesim Oco", + "block.twilightforest.hollow_dark_log_climbable": "Tronco de Madeira Negra Oco", + "block.twilightforest.hollow_dark_log_horizontal": "Tronco de Madeira Negra Oco", + "block.twilightforest.hollow_dark_log_vertical": "Tronco de Madeira Negra Oco", + "block.twilightforest.hollow_dark_oak_log_climbable": "Tronco de Carvalho Escuro Oco", + "block.twilightforest.hollow_dark_oak_log_horizontal": "Tronco de Carvalho Escuro Oco", + "block.twilightforest.hollow_dark_oak_log_vertical": "Tronco de Carvalho Escuro Oco", + "block.twilightforest.hollow_jungle_log_climbable": "Tronco de Selva Oco", + "block.twilightforest.hollow_jungle_log_horizontal": "Tronco de Selva Oco", + "block.twilightforest.hollow_jungle_log_vertical": "Tronco de Selva Oco", + "block.twilightforest.hollow_mangrove_log_climbable": "Tronco de Mangue Oco", + "block.twilightforest.hollow_mangrove_log_horizontal": "Tronco de Mangue Oco", + "block.twilightforest.hollow_mangrove_log_vertical": "Tronco de Mangue Oco", + "block.twilightforest.hollow_mining_log_climbable": "Tronco de Madeira de Mineiro Oco", + "block.twilightforest.hollow_mining_log_horizontal": "Tronco de Madeira de Mineiro Oco", + "block.twilightforest.hollow_mining_log_vertical": "Tronco de Madeira de Mineiro Oco", + "block.twilightforest.hollow_oak_log_climbable": "Tronco de Carvalho Oco", + "block.twilightforest.hollow_oak_log_horizontal": "Tronco de Carvalho Oco", + "block.twilightforest.hollow_oak_log_vertical": "Tronco de Carvalho Oco", + "block.twilightforest.hollow_oak_sapling": "Muda de Carvalho do Crepúsculo Robusta", + "block.twilightforest.hollow_sorting_log_climbable": "Tronco de Madeira de Ordenação Oco", + "block.twilightforest.hollow_sorting_log_horizontal": "Tronco de Madeira de Ordenação Oco", + "block.twilightforest.hollow_sorting_log_vertical": "Tronco de Madeira de Ordenação Oco", + "block.twilightforest.hollow_spruce_log_climbable": "Tronco de Pinheiro Oco", + "block.twilightforest.hollow_spruce_log_horizontal": "Tronco de Pinheiro Oco", + "block.twilightforest.hollow_spruce_log_vertical": "Tronco de Pinheiro Oco", + "block.twilightforest.hollow_time_log_climbable": "Tronco de Madeira do Tempo Oco", + "block.twilightforest.hollow_time_log_horizontal": "Tronco de Madeira do Tempo Oco", + "block.twilightforest.hollow_time_log_vertical": "Tronco de Madeira do Tempo Oco", + "block.twilightforest.hollow_transformation_log_climbable": "Tronco de Madeira de Transformação Oco", + "block.twilightforest.hollow_transformation_log_horizontal": "Tronco de Madeira de Transformação Oco", + "block.twilightforest.hollow_transformation_log_vertical": "Tronco de Madeira de Transformação Oco", + "block.twilightforest.hollow_twilight_oak_log_climbable": "Tronco de Carvalho do Crepúsculo Oco", + "block.twilightforest.hollow_twilight_oak_log_horizontal": "Tronco de Carvalho do Crepúsculo Oco", + "block.twilightforest.hollow_twilight_oak_log_vertical": "Tronco de Carvalho do Crepúsculo Oco", + "block.twilightforest.hollow_vangrove_log_climbable": "Tronco de Mangue Oco", + "block.twilightforest.hollow_vangrove_log_horizontal": "Tronco de Mangue Oco", + "block.twilightforest.hollow_vangrove_log_vertical": "Tronco de Mangue Oco", + "block.twilightforest.hollow_warped_stem_climbable": "Caule Deformado Oco", + "block.twilightforest.hollow_warped_stem_horizontal": "Caule Deformado Oco", + "block.twilightforest.hollow_warped_stem_vertical": "Caule Deformado Oco", + "block.twilightforest.huge_lily_pad": "Vitória-régia Enorme", + "block.twilightforest.huge_mushgloom_stem": "Tronco de Coguminoso Enorme", + "block.twilightforest.huge_stalk": "Pé de Feijão Enorme", + "block.twilightforest.huge_water_lily": "Lírio de Água Gigante", + "block.twilightforest.hydra_boss_spawner": "Gerador de Chefe Hidra", + "block.twilightforest.hydra_trophy": "Troféu de Hidra", + "block.twilightforest.iron_ladder": "Escada de Ferro", + "block.twilightforest.ironwood_block": "Bloco de Madeira de Ferro", + "block.twilightforest.jungle_banister": "Corrimão da Selva", + "block.twilightforest.keepsake_casket": "Caixão da Recordação", + "block.twilightforest.knight_phantom_boss_spawner": "Gerador de Chefe Cavaleiro Espectral", + "block.twilightforest.knight_phantom_trophy": "Troféu de Cavaleiro Espectral", + "block.twilightforest.knightmetal_block": "Bloco de Metal de Cavaleiro", + "block.twilightforest.lich_boss_spawner": "Gerador de Chefe Lich", + "block.twilightforest.lich_tower_miniature_structure": "Torre do Lich em Miniatura", + "block.twilightforest.lich_trophy": "Troféu de Lich", + "block.twilightforest.liveroot_block": "Raiz Viva", + "block.twilightforest.locked_vanishing_block": "Bloco Desaparecedor Bloqueado", + "block.twilightforest.mangrove_banister": "Corrimão de Mangue", + "block.twilightforest.mangrove_button": "Botão de Mangue", + "block.twilightforest.mangrove_chest": "Baú de Mangue", + "block.twilightforest.mangrove_door": "Porta de Mangue", + "block.twilightforest.mangrove_fence": "Cerca de Mangue", + "block.twilightforest.mangrove_fence_gate": "Portão de Mangue", + "block.twilightforest.mangrove_leaves": "Folhas de Mangue", + "block.twilightforest.mangrove_log": "Tronco de Mangue", + "block.twilightforest.mangrove_planks": "Tábuas de Mangue", + "block.twilightforest.mangrove_pressure_plate": "Placa de Pressão de Mangue", + "block.twilightforest.mangrove_root": "Raízes de Mangue", + "block.twilightforest.mangrove_sapling": "Muda de Mangue", + "block.twilightforest.mangrove_sign": "Placa de Mangue", + "block.twilightforest.mangrove_slab": "Laje de Mangue", + "block.twilightforest.mangrove_stairs": "Escadas de Mangue", + "block.twilightforest.mangrove_trapdoor": "Alçapão de Mangue", + "block.twilightforest.mangrove_wall_sign": "Placa de Mangue de Parede", + "block.twilightforest.mangrove_wood": "Madeira de Mangue", + "block.twilightforest.mayapple": "Mandrágora", + "block.twilightforest.mazestone": "Pedra do Labirinto", + "block.twilightforest.mazestone_border": "Borda de Pedra do Labirinto", + "block.twilightforest.mazestone_brick": "Tijolos do Labirinto", + "block.twilightforest.mazestone_mosaic": "Mosaico de Pedra do Labirinto", + "block.twilightforest.mining_banister": "Corrimão de Madeira de Mineiro", + "block.twilightforest.mining_button": "Botão de Madeira de Mineiro", + "block.twilightforest.mining_chest": "Baú de Madeira de Mineiro", + "block.twilightforest.mining_door": "Porta de Madeira de Mineiro", + "block.twilightforest.mining_fence": "Cerca de Madeira de Mineiro", + "block.twilightforest.mining_fence_gate": "Portão de Cerca de Madeira de Mineiro", + "block.twilightforest.mining_leaves": "Folhas do Mineiro", + "block.twilightforest.mining_log": "Tronco de Madeira de Mina", + "block.twilightforest.mining_log_core": "Núcleo de Madeira de Mina", + "block.twilightforest.mining_planks": "Tábuas de Madeira de Mineiro", + "block.twilightforest.mining_pressure_plate": "Placa de Pressão de Madeira de Mineiro", + "block.twilightforest.mining_sapling": "Muda da Árvore do Mineiro", + "block.twilightforest.mining_sign": "Placa de Madeira de Mineiro", + "block.twilightforest.mining_slab": "Laje de Madeira de Mineiro", + "block.twilightforest.mining_stairs": "Escadas de Madeira de Mineiro", + "block.twilightforest.mining_trapdoor": "Alçapão de Madeira de Mineiro", + "block.twilightforest.mining_wall_sign": "Placa na Parede de Madeira de Mineiro", + "block.twilightforest.minoshroom_boss_spawner": "Gerador de Chefe Minogumelo", + "block.twilightforest.minoshroom_trophy": "Troféu de Minogumelo", + "block.twilightforest.moonworm": "Minhoca Lunar", + "block.twilightforest.moss_patch": "Caminho de Musgo", + "block.twilightforest.mossy_castle_brick": "Tijolo do Castelo Musgoso", + "block.twilightforest.mossy_castle_brick_stairs": "Escadas de Tijolo do Castelo Musgoso", + "block.twilightforest.mossy_etched_nagastone": "Pedra de Naga Cravada Musgoso", + "block.twilightforest.mossy_mazestone": "Tijolos do Labirinto Musgoso", + "block.twilightforest.mossy_nagastone_pillar": "Pillar de Pedra de Naga Musgoso", + "block.twilightforest.mossy_nagastone_stairs_left": "Escadas de Pedra de Naga Musgoso (Esquerda)", + "block.twilightforest.mossy_nagastone_stairs_right": "Escadas de Pedra de Naga Musgoso (Direita)", + "block.twilightforest.mossy_underbrick": "Subtijolo Musgoso", + "block.twilightforest.mushgloom": "Coguminoso", + "block.twilightforest.naga_boss_spawner": "Gerador de Chefe Naga", + "block.twilightforest.naga_courtyard_miniature_structure": "Pátio da Naga em Miniatura", + "block.twilightforest.naga_trophy": "Troféu de Naga", + "block.twilightforest.nagastone": "Pedra de Naga", + "block.twilightforest.nagastone_head": "Cabeça de Pedra de Naga", + "block.twilightforest.nagastone_pillar": "Pillar de Pedra de Naga", + "block.twilightforest.nagastone_stairs_left": "Escadas de Pedra de Naga (Esquerda)", + "block.twilightforest.nagastone_stairs_right": "Escadas de Pedra de Naga (Direita)", + "block.twilightforest.oak_banister": "Corrimão de Carvalho", + "block.twilightforest.orange_force_field": "Campo de Força Laranja", + "block.twilightforest.player_skull_candle": "Vela de Crânio do Jogador", + "block.twilightforest.player_skull_candle.named": "Cabeça de %s com velas", + "block.twilightforest.player_wall_skull_candle": "Vela de Crânio do Jogador de Parede", + "block.twilightforest.potted_canopy_sapling": "Muda de Árvore de Marquise em Vaso", + "block.twilightforest.potted_darkwood_sapling": "Muda de Árvore de Madeira Negra em Vaso", + "block.twilightforest.potted_dead_thorn": "Espinho Queimado em Vaso", + "block.twilightforest.potted_green_thorn": "Espinho Verde em Vaso", + "block.twilightforest.potted_hollow_oak_sapling": "Muda de Carvalho do Crepúsculo Robusta Envasada", + "block.twilightforest.potted_mayapple": "Mandrágora em Vaso", + "block.twilightforest.potted_mining_sapling": "Muda de Árvore do Mineiro em Vaso", + "block.twilightforest.potted_mushgloom": "Coguminoso em Vaso", + "block.twilightforest.potted_rainbow_oak_sapling": "Muda de Carvalho Arco-Íris em Vaso", + "block.twilightforest.potted_sorting_sapling": "Muda de Árvore de Ordenação em Vaso", + "block.twilightforest.potted_thorn": "Espinho em Vaso", + "block.twilightforest.potted_time_sapling": "Muda de Árvore do Tempo em Vaso", + "block.twilightforest.potted_transformation_sapling": "Muda de Árvore de Transformação em Vaso", + "block.twilightforest.potted_twilight_oak_sapling": "Muda de Carvalho do Crepúsculo Adoecido em Vaso", + "block.twilightforest.quest_ram_trophy": "Troféu de Carneiro de Missão", + "block.twilightforest.rainbow_oak_leaves": "Folhas do Carvalho Arco-Íris", + "block.twilightforest.rainbow_oak_sapling": "Muda do Carvalho Arco-Íris", + "block.twilightforest.reactor_debris": "Destroços de Reactor", + "block.twilightforest.reappearing_block": "Bloco de Reaparecimento", + "block.twilightforest.red_thread": "Fio Vermelho", + "block.twilightforest.root": "Raízes", + "block.twilightforest.root_strand": "Vertentes de Raiz", + "block.twilightforest.skeleton_skull_candle": "Vela de Crânio de Esqueleto", + "block.twilightforest.skeleton_wall_skull_candle": "Vela de Crânio de Esqueleto de Parede", + "block.twilightforest.slider": "Armadilha de Deslize", + "block.twilightforest.smoker": "Defumador", + "block.twilightforest.snow_queen_boss_spawner": "Gerador de Chefe Rainha da Neve", + "block.twilightforest.snow_queen_trophy": "Troféu de Rainha da Neve", + "block.twilightforest.sorting_banister": "Corrimão de Madeira de Ordenação", + "block.twilightforest.sorting_button": "Botão de Madeira de Ordenação", + "block.twilightforest.sorting_chest": "Baú de Madeira de Ordenação", + "block.twilightforest.sorting_door": "Porta de Madeira de Ordenação", + "block.twilightforest.sorting_fence": "Cerca de Madeira de Ordenação", + "block.twilightforest.sorting_fence_gate": "Portão de Cerca de Madeira de Ordenação", + "block.twilightforest.sorting_leaves": "Folhas de Ordenação", + "block.twilightforest.sorting_log": "Tronco de Madeira de Ordenação", + "block.twilightforest.sorting_log_core": "Motor de Madeira de Ordenação", + "block.twilightforest.sorting_planks": "Tábuas de Madeira de Ordenação", + "block.twilightforest.sorting_pressure_plate": "Placa de Pressão de Madeira de Ordenação", + "block.twilightforest.sorting_sapling": "Muda da Árvore de Ordenação", + "block.twilightforest.sorting_sign": "Placa de Madeira de Ordenação", + "block.twilightforest.sorting_slab": "Laje de Madeira de Ordenação", + "block.twilightforest.sorting_stairs": "Escadas de Madeira de Ordenação", + "block.twilightforest.sorting_trapdoor": "Alçapão de Madeira de Ordenação", + "block.twilightforest.sorting_wall_sign": "Placa na Parede de Madeira de Ordenação", + "block.twilightforest.spiral_bricks": "Tijolos Espirais", + "block.twilightforest.spruce_banister": "Corrimão de Abeto", + "block.twilightforest.steeleaf_block": "Bloco de Folha de Aço", + "block.twilightforest.stripped_canopy_log": "Tronco de Árvore de Marquise Descascado", + "block.twilightforest.stripped_canopy_wood": "Madeira de Árvore de Marquise Descascado", + "block.twilightforest.stripped_dark_log": "Tronco de Madeira Negra Descascado", + "block.twilightforest.stripped_mangrove_log": "Tronco de Mangue Descascado", + "block.twilightforest.stripped_mangrove_wood": "Madeira de Mangue Descascada", + "block.twilightforest.stripped_mining_log": "Tronco de Madeira de Mina Descascado", + "block.twilightforest.stripped_sorting_log": "Tronco de Madeira de Ordenação Descascado", + "block.twilightforest.stripped_time_log": "Tronco de Madeira do Tempo Descascada", + "block.twilightforest.stripped_transformation_log": "Tronco de Madeira de Transformação Descascado", + "block.twilightforest.stripped_twilight_oak_log": "Tronco de Carvalho do Crepúsculo Descascado", + "block.twilightforest.stripped_twilight_oak_wood": "Madeira do Crepúsculo Descascada", + "block.twilightforest.stronghold_shield": "Escudo da Fortaleza", + "block.twilightforest.thick_castle_brick": "Tijolo do Castelo Espesso", + "block.twilightforest.thorn_leaves": "Folhas de Espinho", + "block.twilightforest.thorn_rose": "Rosa de Espinho", + "block.twilightforest.time_banister": "Corrimão de Madeira do Tempo", + "block.twilightforest.time_button": "Botão de Madeira do Tempo", + "block.twilightforest.time_chest": "Baú de Madeira do Tempo", + "block.twilightforest.time_door": "Porta de Madeira do Tempo", + "block.twilightforest.time_fence": "Cerca de Madeira do Tempo", + "block.twilightforest.time_fence_gate": "Portão de Cerca de Madeira do Tempo", + "block.twilightforest.time_leaves": "Folhas de Madeira do Tempo", + "block.twilightforest.time_log": "Tronco de Madeira do Tempo", + "block.twilightforest.time_log_core": "Relógio da Madeira do Tempo", + "block.twilightforest.time_planks": "Tábuas de Madeira do Tempo", + "block.twilightforest.time_pressure_plate": "Placa de Pressão de Madeira do Tempo", + "block.twilightforest.time_sapling": "Muda da Árvore do Tempo", + "block.twilightforest.time_sign": "Placa de Madeira do Tempo", + "block.twilightforest.time_slab": "Lajes de Madeira do Tempo", + "block.twilightforest.time_stairs": "Escadas de Madeira do Tempo", + "block.twilightforest.time_trapdoor": "Alçapão de Madeira do Tempo", + "block.twilightforest.time_wall_sign": "Placa na Parede de Madeira do Tempo", + "block.twilightforest.torchberry_plant": "Planta de Baga de Tocha", + "block.twilightforest.towerwood": "Tábuas de Madeira de Torre", + "block.twilightforest.transformation_banister": "Corrimão de Madeira de Transformação", + "block.twilightforest.transformation_button": "Botão de Madeira de Transformação", + "block.twilightforest.transformation_chest": "Baú de Madeira de Transformação", + "block.twilightforest.transformation_door": "Porta de Madeira de Transformação", + "block.twilightforest.transformation_fence": "Cerca de Madeira de Transformação", + "block.twilightforest.transformation_fence_gate": "Portão de Cerca de Madeira de Transformação", + "block.twilightforest.transformation_leaves": "Folhas da Transformação", + "block.twilightforest.transformation_log": "Tronco de Madeira de Transformação", + "block.twilightforest.transformation_log_core": "Coração da Transformação", + "block.twilightforest.transformation_planks": "Tábuas de Madeira do Tempo", + "block.twilightforest.transformation_pressure_plate": "Placa de Pressão de Madeira de Transformação", + "block.twilightforest.transformation_sapling": "Muda da Árvore de Transformação", + "block.twilightforest.transformation_sign": "Placa de Madeira de Tranformação", + "block.twilightforest.transformation_slab": "Laje de Madeira de Transformação", + "block.twilightforest.transformation_stairs": "Escadas de Madeira de Transformação", + "block.twilightforest.transformation_trapdoor": "Alçapão de Madeira de Tranformação", + "block.twilightforest.transformation_wall_sign": "Placa na Parede de Madeira de Transformação", + "block.twilightforest.trollber": "Bagas de Troll", + "block.twilightforest.trollsteinn": "Pedra de Troll", + "block.twilightforest.trophy_pedestal": "Pedestal de Troféu", + "block.twilightforest.twilight_oak_banister": "Corrimão de Carvalho do Crepúsculo", + "block.twilightforest.twilight_oak_button": "Botão de Carvalho do Crepúsculo", + "block.twilightforest.twilight_oak_chest": "Baú de Carvalho do Crepúsculo", + "block.twilightforest.twilight_oak_door": "Porta de Carvalho do Crepúsculo", + "block.twilightforest.twilight_oak_fence": "Cerca de Carvalho do Crepúsculo", + "block.twilightforest.twilight_oak_fence_gate": "Portão de Carvalho do Crepúsculo", + "block.twilightforest.twilight_oak_leaves": "Folhas de Carvalho do Crepúsculo", + "block.twilightforest.twilight_oak_log": "Tronco de Carvalho do Crepúsculo", + "block.twilightforest.twilight_oak_planks": "Tábuas de Carvalho do Crepúsculo", + "block.twilightforest.twilight_oak_pressure_plate": "Placa de Pressão de Carvalho do Crepúsculo", + "block.twilightforest.twilight_oak_sapling": "Muda de Carvalho do Crepúsculo Adoecido", + "block.twilightforest.twilight_oak_sign": "Placa de Carvalho do Crepúsculo", + "block.twilightforest.twilight_oak_slab": "Laje de Carvalho do Crepúsculo", + "block.twilightforest.twilight_oak_stairs": "Escadas de Carvalho do Crepúsculo", + "block.twilightforest.twilight_oak_trapdoor": "Alçapão de Carvalho do Crepúsculo", + "block.twilightforest.twilight_oak_wood": "Madeira de Carvalho do Crepúsculo", + "block.twilightforest.twilight_portal": "Portal da Floresta do Crepúsculo", + "block.twilightforest.twisted_stone": "Pedra Retorcida", + "block.twilightforest.twisted_stone_pillar": "Pilar de Pedra Retorcida", + "block.twilightforest.uberous_soil": "Solo Fértil", + "block.twilightforest.uncrafting_table": "Bancada de Desfabricação", + "block.twilightforest.underbrick": "Subtijolo", + "block.twilightforest.underbrick_floor": "Chão de Subtijolo", + "block.twilightforest.unripe_trollber": "Bagas de Troll Imaturas", + "block.twilightforest.ur_ghast_boss_spawner": "Invocador de Chefe Ur-Ghast", + "block.twilightforest.ur_ghast_trophy": "Troféu da Ur-Ghast", + "block.twilightforest.vangrove_banister": "Corrimão de Mangue", + "block.twilightforest.vanishing_block": "Bloco Desvanecedor", + "block.twilightforest.violet_castle_door": "Porta do Castelo Violeta", + "block.twilightforest.violet_castle_rune_brick": "Tijolo de Castelo Rúnico Violeta", + "block.twilightforest.violet_force_field": "Campo de Força Violeta", + "block.twilightforest.warped_banister": "Corrimão Deformado", + "block.twilightforest.weathered_deadrock": "Pedra Morta Resistente", + "block.twilightforest.wispy_cloud": "Nuvem Fina", + "block.twilightforest.wither_skeleton_skull_candle": "Vela de Crânio de Esqueleto Wither", + "block.twilightforest.wither_skeleton_wall_skull_candle": "Vela de Crânio de Esqueleto Wither de Parede", + "block.twilightforest.worn_castle_brick": "Tijolo do Castelo Desgastado", + "block.twilightforest.worn_castle_brick_stairs": "Escadas de Tijolo do Castelo Desgastado", + "block.twilightforest.yellow_castle_door": "Porta do Castelo Amarela", + "block.twilightforest.yellow_castle_rune_brick": "Tijolo de Castelo Rúnico Amarelo", + "block.twilightforest.zombie_skull_candle": "Vela de Crânio de Zumbi", + "block.twilightforest.zombie_wall_skull_candle": "Vela de Crânio de Zumbi de Parede", + "commands.tffeature.center": "Centro do recurso: %s", + "commands.tffeature.chunk": "Localizado no chunk do recurso: %s", + "commands.tffeature.nearest": "O recurso mais perto é: %s", + "commands.tffeature.none_nearby": "Não foi possível encontrar recursos por perto!", + "commands.tffeature.not_in_twilight_forest": "Você não está na dimensão da Floresta do Crepúsculo", + "commands.tffeature.structure.conquer.status": "Bandeira de conquista de estrutura: %s", + "commands.tffeature.structure.conquer.update": "Bandeira de conquista de estrutura era %s, mudando para %s", + "commands.tffeature.structure.inside": "Você está em uma estrutura de Marco", + "commands.tffeature.structure.outside": "Você não está em uma estrutura de Marco", + "commands.tffeature.structure.required": "Você não está em uma estrutura", + "commands.tffeature.structure.spawn_info": "%s, Peso %s", + "commands.tffeature.structure.spawn_list": "Lista de geraçãopara esta área é:", + "config.jade.plugin_twilightforest.quest_ram_wool": "Lã de Carneiro de Missão", + "death.attack.twilightforest.axing": "%1$s foi cortado por %2$s", + "death.attack.twilightforest.axing.item": "%1$s foi cortado por %2$s usando %3$s", + "death.attack.twilightforest.chillingBreath": "%1$s foi congelado até a morte pela Rainha da Neve", + "death.attack.twilightforest.chillingBreath.player": "%1$s foi congelado até a morte pela Rainha de Neve enquanto estava escapando de %2$s", + "death.attack.twilightforest.expired": "A vida de %1$s expirou", + "death.attack.twilightforest.expired.player": "A vida de %1$s expirou", + "death.attack.twilightforest.frozen": "%1$s foi congelado por %2$s usando uma Bomba de Gelo", + "death.attack.twilightforest.frozen.item": "%1$s foi congelado por %2$s usando %3$s", + "death.attack.twilightforest.ghastTear": "%1$s foi queimado por lágrimas ardentes", + "death.attack.twilightforest.ghastTear.player": "%1$s foi queimado por lágrimas ardentes enquanto escapava %2$s", + "death.attack.twilightforest.haunt": "%1$s entrou na assombração de %2$s", + "death.attack.twilightforest.hydraBite": "A pele de %1$s foi rasgada pela Hidra", + "death.attack.twilightforest.hydraBite.player": "A pele de %1$s foi rasgada pela Hidra enquanto estava escapando de %2$s", + "death.attack.twilightforest.hydraFire": "%1$s foi assado vivo pela Hidra", + "death.attack.twilightforest.hydraFire.player": "%1$s foi assado vivo pela Hidra enquanto estava fugindo de %2$s", + "death.attack.twilightforest.leafBrain": "O cérebro de %1$s foi transformado em folhas por %2$s", + "death.attack.twilightforest.leafBrain.item": "O cérebro de %1$s foi transformado em folhas por %2$s usando %3$s", + "death.attack.twilightforest.lichBolt": "A mira do Lich foi melhor que a de %1$s", + "death.attack.twilightforest.lichBolt.player": "O Lich e %2$s tiveram uma mira melhor que %1$s", + "death.attack.twilightforest.lichBomb": "%1$s sucumbiu à magia explosiva do Lich", + "death.attack.twilightforest.lichBomb.player": "%1$s sucumbiu à magia explosiva do Lich enquanto escapava de %2$s", + "death.attack.twilightforest.lifedrain": "A vida de %1$s foi drenada por %2$s", + "death.attack.twilightforest.lifedrain.item": "A vida de %1$s foi drenada por %2$s usando %3$s", + "death.attack.twilightforest.lostWords": "%1$s ficou sem palavras após ser morto por %2$s", + "death.attack.twilightforest.lostWords.item": "%1$s ficou sem palavras após ser morto por %2$s usando %3$s", + "death.attack.twilightforest.moonworm": "%1$s foi atingido por Minhoca Lunar", + "death.attack.twilightforest.schooled": "%1$s foi educado por %2$s", + "death.attack.twilightforest.schooled.item": "%1$s foi educado por %2$s usando %3$s", + "death.attack.twilightforest.scorched": "%1$s foi queimado por %2$s", + "death.attack.twilightforest.scorched.item": "%1$s foi queimado por %2$s usando %3$s", + "death.attack.twilightforest.snowballFight": "%1$s perdeu uma luta de bola de neve para %2$s", + "death.attack.twilightforest.snowballFight.item": "%1$s perdeu uma luta de bola de neve para %2$s usando %3$s", + "death.attack.twilightforest.squish": "%1$s foi esmagado pela Rainha da Neve", + "death.attack.twilightforest.squish.player": "%1$s foi esmagado pela Rainha da Neve enquanto escapava de %2$s", + "death.attack.twilightforest.thorns": "%1$s esbarrou com alguns espinhos", + "death.attack.twilightforest.thorns.player": "%1$s esbarrou com alguns espinhos enquanto escapava de %2$s", + "death.attack.twilightforest.thrownAxe": "%1$s foi decapitado por um machado arremessado", + "death.attack.twilightforest.thrownAxe.player": "%1$s foi decapitado por um machado arremessado enquanto escapava de %2$s", + "death.attack.twilightforest.thrownBlock": "%1$s foi esmagado por um bloco lançado", + "death.attack.twilightforest.thrownBlock.player": "%1$s foi esmagado por um bloco lançado enquanto escapava de %2$s", + "death.attack.twilightforest.thrownPickaxe": "%1$s foi decapitado por uma picareta lançada", + "death.attack.twilightforest.thrownPickaxe.player": "%1$s foi decapitado por uma picareta lançada enquanto escapava de %2$s", + "death.attack.twilightforest.yeeted": "%1$s foi atirado pela última vez", + "death.attack.twilightforest.yeeted.entity": "%1$s foi atendido pela última vez por %2$s", + "death.attack.twilightforest.yeeted.item": "%1$s foi atirado pela última vez por %2$s enquanto de alguma forma segurava %3$s", + "dimension.twilightforest.twilightforest": "Floresta do Crepúsculo", + "effect.twilightforest.frosted": "Congelado", + "enchantment.twilightforest.chill_aura": "Aura de Frio", + "enchantment.twilightforest.chill_aura.desc": "Adiciona uma chance to atacante receber o efeito congelado depois de atacar o usuário.", + "enchantment.twilightforest.destruction": "Destruição", + "enchantment.twilightforest.destruction.desc": "Permite que o Bloco e Corrente quebrem blocos com um nível de mineração maior.", + "enchantment.twilightforest.fire_react": "Reação ao Fogo", + "enchantment.twilightforest.fire_react.desc": "Adiciona uma chance do atacante ser incendiado quando acertar o usuário.", + "entity.twilightforest.alpha_yeti": "Iéti Alfa", + "entity.twilightforest.armored_giant": "Gigante de Armadura", + "entity.twilightforest.bighorn_sheep": "Ovelha de Chifres Compridos", + "entity.twilightforest.blockchain_goblin": "Duende de Bloco e Corrente", + "entity.twilightforest.boat": "Bote", + "entity.twilightforest.carminite_broodling": "Parasitoide de Carminite", + "entity.twilightforest.carminite_ghastguard": "Ghast Guarda de Carminite", + "entity.twilightforest.carminite_ghastling": "Ghastling de Carminite", + "entity.twilightforest.carminite_golem": "Golem de Carminite", + "entity.twilightforest.chain_block": "Bloco e Corrente", + "entity.twilightforest.charm_effect": "Efeito de Amuleto", + "entity.twilightforest.chest_boat": "Bote com Baú", + "entity.twilightforest.cube_of_annihilation": "Cubo de Aniquilação", + "entity.twilightforest.death_tome": "Tomo da Morte", + "entity.twilightforest.dwarf_rabbit": "Coelho Anão", + "entity.twilightforest.falling_ice": "Gelo Caindo", + "entity.twilightforest.fire_beetle": "Besouro de Fogo", + "entity.twilightforest.giant_miner": "Mineiro Gigante", + "entity.twilightforest.hedge_spider": "Aranha de Cobertura", + "entity.twilightforest.helmet_crab": "Caranguejo de Capacete", + "entity.twilightforest.hostile_wolf": "Lobo Hostil", + "entity.twilightforest.hydra": "Hidra", + "entity.twilightforest.hydra_mortar": "Argamassa de Hidra", + "entity.twilightforest.ice_arrow": "Flecha de gelo", + "entity.twilightforest.ice_crystal": "Cristal de Gelo", + "entity.twilightforest.ice_snowball": "Bola de Gelo", + "entity.twilightforest.king_spider": "Rei Aranha", + "entity.twilightforest.knight_phantom": "Cavaleiro Spectral", + "entity.twilightforest.lich_bolt": "Raio do Lich", + "entity.twilightforest.lich_bomb": "Raio Explosivo do Lich", + "entity.twilightforest.lich_minion": "Lacaio do Lich", + "entity.twilightforest.lower_goblin_knight": "Duende Cavaleiro Inferior", + "entity.twilightforest.loyal_zombie": "Zumbi Leal", + "entity.twilightforest.maze_slime": "Slime do Labirinto", + "entity.twilightforest.minoshroom": "Minogumelo", + "entity.twilightforest.minotaur": "Minotauro", + "entity.twilightforest.mist_wolf": "Lobo da Névoa", + "entity.twilightforest.moonworm_shot": "Minhoca Lunar", + "entity.twilightforest.mosquito_swarm": "Enxame de Mosquitos", + "entity.twilightforest.nature_bolt": "Raio Natural", + "entity.twilightforest.penguin": "Pinguim", + "entity.twilightforest.pinch_beetle": "Besouro de Pinça", + "entity.twilightforest.protection_box": "Caixa de Proteção de Progressão", + "entity.twilightforest.quest_ram": "Carneiro de Missão", + "entity.twilightforest.redcap_sapper": "Sapador do Boné Vermelho", + "entity.twilightforest.rising_zombie": "Zumbi", + "entity.twilightforest.seeker_arrow": "Flecha Procuradora", + "entity.twilightforest.skeleton_druid": "Esqueleto Druida", + "entity.twilightforest.slider": "Armadilha de Deslize Movendo", + "entity.twilightforest.slime_beetle": "Besouro de Slime", + "entity.twilightforest.slime_blob": "Blob de Slime", + "entity.twilightforest.snow_guardian": "Guardião de Neve", + "entity.twilightforest.snow_queen": "Rainha da Neve", + "entity.twilightforest.stable_ice_core": "Núcleo de Gelo Estável", + "entity.twilightforest.swarm_spider": "Aranha de Enxame", + "entity.twilightforest.thrown_wep": "Arma de Arremesso", + "entity.twilightforest.tiny_bird": "Pássaro Pequeno", + "entity.twilightforest.tome_bolt": "Raio do Tomo da Morte", + "entity.twilightforest.towerwood_borer": "Caruncho de Madeira de Torre", + "entity.twilightforest.unstable_ice_core": "Núcleo de Gelo Instável", + "entity.twilightforest.upper_goblin_knight": "Duende Cavaleiro Superior", + "entity.twilightforest.wand_bolt": "Raio do Cetro do Crepúsculo", + "entity.twilightforest.winter_wolf": "Lobo do Inverno", + "entity.twilightforest.yeti": "Iéti", + "item.twilightforest.alpha_yeti_banner_pattern": "Desenho para Estandarte", + "item.twilightforest.alpha_yeti_banner_pattern.desc": "Cara do Iéti Alfa", + "item.twilightforest.alpha_yeti_fur": "Pelo de Iéti Alfa", + "item.twilightforest.alpha_yeti_spawn_egg": "Ovo gerador de Iéti Alfa", + "item.twilightforest.arctic_boots": "Botas Árticas", + "item.twilightforest.arctic_chestplate": "Jaqueta Ártica", + "item.twilightforest.arctic_fur": "Pelo Ártico", + "item.twilightforest.arctic_helmet": "Capuz Ártico", + "item.twilightforest.arctic_leggings": "Calças Árticas", + "item.twilightforest.armor_shard": "Fragmento de Armadura", + "item.twilightforest.armor_shard_cluster": "Conjunto de Fragmentos de Armadura", + "item.twilightforest.armored_giant_spawn_egg": "Ovo gerador de Gigante de Armadura", + "item.twilightforest.bighorn_sheep_spawn_egg": "Ovo gerador de Ovelha de Chifres Compridos", + "item.twilightforest.block_and_chain": "Bloco e Corrente", + "item.twilightforest.blockchain_goblin_spawn_egg": "Ovo gerador de Duende de Bloco e Corrente", + "item.twilightforest.borer_essence": "Essência de Broca", + "item.twilightforest.brittle_potion_flask": "Cantil de Poção Frágil", + "item.twilightforest.canopy_boat": "Barco de Marquise", + "item.twilightforest.canopy_chest_boat": "Barco com Baú de Marquise", + "item.twilightforest.carminite": "Carminita", + "item.twilightforest.carminite_broodling_spawn_egg": "Ovo gerador de Parasitoide de Carminite", + "item.twilightforest.carminite_ghastguard_spawn_egg": "Ovo gerador de Guarda Ghast de Carminite", + "item.twilightforest.carminite_ghastling_spawn_egg": "Ovo gerador de Ghastling de Carminite", + "item.twilightforest.carminite_golem_spawn_egg": "Ovo gerador de Golem de Carminite", + "item.twilightforest.charm_of_keeping_1": "Amuleto Mantenedor I", + "item.twilightforest.charm_of_keeping_2": "Amuleto Mantenedor II", + "item.twilightforest.charm_of_keeping_3": "Amuleto Mantenedor III", + "item.twilightforest.charm_of_life_1": "Amuleto de Vida I", + "item.twilightforest.charm_of_life_2": "Amuleto de Vida II", + "item.twilightforest.cooked_meef": "Bife", + "item.twilightforest.cooked_venison": "Bife de Veado", + "item.twilightforest.crumble_horn": "Chifre de Desmoronamento", + "item.twilightforest.cube_of_annihilation": "Cubo da Aniquilação", + "item.twilightforest.cube_talisman": "Talismã do Cubo", + "item.twilightforest.death_tome_spawn_egg": "Ovo gerador de Tomo da Morte", + "item.twilightforest.diamond_minotaur_axe": "Machado de Minotauro de Diamante", + "item.twilightforest.dwarf_rabbit_spawn_egg": "Ovo gerador de Coelho Anão", + "item.twilightforest.ender_bow": "Arco do Ender", + "item.twilightforest.fiery_blood": "Sangue Ardente", + "item.twilightforest.fiery_boots": "Botas Ardentes", + "item.twilightforest.fiery_chestplate": "Peitoral Ardente", + "item.twilightforest.fiery_helmet": "Capacete Ardente", + "item.twilightforest.fiery_ingot": "Barra Ardente", + "item.twilightforest.fiery_leggings": "Calças Ardentes", + "item.twilightforest.fiery_pickaxe": "Picareta Ardente", + "item.twilightforest.fiery_sword": "Espada Ardente", + "item.twilightforest.fiery_tears": "Lágrimas Ardentes", + "item.twilightforest.filled_magic_map": "Mapa Mágico", + "item.twilightforest.filled_maze_map": "Mapa do Labirinto", + "item.twilightforest.filled_ore_map": "Mapa do Labirinto/Minério", + "item.twilightforest.fire_beetle_spawn_egg": "Ovo gerador de Besouro de Fogo", + "item.twilightforest.fortification_scepter": "Cetro da Fortificação", + "item.twilightforest.giant_miner_spawn_egg": "Ovo gerador de Mineiro Gigante", + "item.twilightforest.giant_pickaxe": "Picareta do Gigante", + "item.twilightforest.giant_sword": "Espada do Gigante", + "item.twilightforest.glass_sword": "Espada de Vidro", + "item.twilightforest.gold_minotaur_axe": "Machado do Minotauro de Ouro", + "item.twilightforest.greater_potion_flask": "Cantil de Poção Superior", + "item.twilightforest.hedge_spider_spawn_egg": "Ovo gerador de Aranha de Cobertura", + "item.twilightforest.helmet_crab_spawn_egg": "Ovo gerador de Caranguejo de Capacete", + "item.twilightforest.hostile_wolf_spawn_egg": "Ovo gerador de Lobo Hostil", + "item.twilightforest.hydra_banner_pattern": "Padrão do Banner", + "item.twilightforest.hydra_banner_pattern.desc": "Chama de Hidra", + "item.twilightforest.hydra_chop": "Costela de Hidra", + "item.twilightforest.hydra_spawn_egg": "Ovo gerador de Hidra", + "item.twilightforest.ice_bomb": "Bomba de Gelo", + "item.twilightforest.ice_bow": "Arco de Gelo", + "item.twilightforest.ice_crystal_spawn_egg": "Ovo gerador de Cristal de Gelo", + "item.twilightforest.ice_sword": "Espada de Gelo", + "item.twilightforest.ironwood_axe": "Machado de Madeira de Ferro", + "item.twilightforest.ironwood_boots": "Botas de Madeira de Ferro", + "item.twilightforest.ironwood_chestplate": "Peitoral de Madeira de Ferro", + "item.twilightforest.ironwood_helmet": "Capacete de Madeira de Ferro", + "item.twilightforest.ironwood_hoe": "Enxada de Madeira de Ferro", + "item.twilightforest.ironwood_ingot": "Barra de Madeira de Ferro", + "item.twilightforest.ironwood_leggings": "Calças de Madeira de Ferro", + "item.twilightforest.ironwood_pickaxe": "Picareta de Madeira de Ferro", + "item.twilightforest.ironwood_shovel": "Pá de Madeira de Ferro", + "item.twilightforest.ironwood_sword": "Espada de Madeira de Ferro", + "item.twilightforest.king_spider_spawn_egg": "Ovo gerador de Aranha Rei", + "item.twilightforest.knight_phantom_banner_pattern": "Padrão do Banner", + "item.twilightforest.knight_phantom_banner_pattern.desc": "Capacete de Cavaleiro", + "item.twilightforest.knight_phantom_spawn_egg": "Ovo gerador de Cavaleiro Espectral", + "item.twilightforest.knightmetal_axe": "Machado de Metal de Cavaleiro", + "item.twilightforest.knightmetal_boots": "Botas de Metal de Cavaleiro", + "item.twilightforest.knightmetal_chestplate": "Peitoral de Metal de Cavaleiro", + "item.twilightforest.knightmetal_helmet": "Capacete de Metal de Cavaleiro", + "item.twilightforest.knightmetal_ingot": "Barra de Metal de Cavaleiro", + "item.twilightforest.knightmetal_leggings": "Greva de Metal de Cavaleiro", + "item.twilightforest.knightmetal_pickaxe": "Picareta de Metal de Cavaleiro", + "item.twilightforest.knightmetal_ring": "Laço de Metal de Cavaleiro", + "item.twilightforest.knightmetal_shield": "Escudo de Metal de Cavaleiro", + "item.twilightforest.knightmetal_sword": "Espada de Metal de Cavaleiro", + "item.twilightforest.kobold_spawn_egg": "Ovo gerador de Kobold", + "item.twilightforest.lamp_of_cinders": "Lâmpada de Cinzas", + "item.twilightforest.lich_banner_pattern": "Desenho para Estandarte", + "item.twilightforest.lich_banner_pattern.desc": "Coroa do Lich", + "item.twilightforest.lifedrain_scepter": "Cetro da Drenagem de Vida", + "item.twilightforest.liveroot": "Raiz Viva", + "item.twilightforest.lower_goblin_knight_spawn_egg": "Ovo gerador de Duende Cavaleiro", + "item.twilightforest.magic_beans": "Feijões Mágicos", + "item.twilightforest.magic_map": "Mapa Mágico em Branco", + "item.twilightforest.magic_map_focus": "Foco do Mapa Mágico", + "item.twilightforest.mangrove_boat": "Bote de Mangue", + "item.twilightforest.mangrove_chest_boat": "Bote com Baú de Mangue", + "item.twilightforest.maze_map": "Mapa Mágico em Branco", + "item.twilightforest.maze_map_focus": "Foco do Mapa de Labirinto", + "item.twilightforest.maze_slime_spawn_egg": "Ovo gerador de Slime do Labirinto", + "item.twilightforest.maze_wafer": "Bolacha do Labirinto", + "item.twilightforest.mazebreaker_pickaxe": "Quebra-Labirinto", + "item.twilightforest.meef_stroganoff": "Estrogonofe de Carne", + "item.twilightforest.minoshroom_banner_pattern": "Padrão do Banner", + "item.twilightforest.minoshroom_banner_pattern.desc": "Machados do Minogumelo", + "item.twilightforest.minoshroom_spawn_egg": "Ovo gerador de Minogumelo", + "item.twilightforest.minotaur_spawn_egg": "Ovo Gerador de Minotauro", + "item.twilightforest.mist_wolf_spawn_egg": "Ovo gerador de Lobo da Névoa", + "item.twilightforest.moon_dial": "Indicador Lunar", + "item.twilightforest.moon_dial.phase_0": "Lua Cheia", + "item.twilightforest.moon_dial.phase_1": "Minguante Gibbous", + "item.twilightforest.moon_dial.phase_2": "Lua Crescente", + "item.twilightforest.moon_dial.phase_3": "Minguante Crescente", + "item.twilightforest.moon_dial.phase_4": "Lua Nova", + "item.twilightforest.moon_dial.phase_5": "Quarto Crescente", + "item.twilightforest.moon_dial.phase_6": "Lua Minguante", + "item.twilightforest.moon_dial.phase_7": "Crescente Gibosa", + "item.twilightforest.moon_dial.phase_unknown": "Fase da lua indeterminada", + "item.twilightforest.moon_dial.phase_unknown_fools": "404 lua não encontrada", + "item.twilightforest.moonworm_queen": "Minhoca Lunar Rainha", + "item.twilightforest.mosquito_swarm_spawn_egg": "Ovo gerador de Enxame de Mosquitos", + "item.twilightforest.music_disc_findings": "Disco de Música", + "item.twilightforest.music_disc_findings.desc": "MrCompost - Achados", + "item.twilightforest.music_disc_home": "Disco de Música", + "item.twilightforest.music_disc_home.desc": "MrCompost - Casa", + "item.twilightforest.music_disc_maker": "Disco de Música", + "item.twilightforest.music_disc_maker.desc": "MrCompost - Criador", + "item.twilightforest.music_disc_motion": "Disco de Música", + "item.twilightforest.music_disc_motion.desc": "MrCompost - Movimento", + "item.twilightforest.music_disc_radiance": "Disco de Música", + "item.twilightforest.music_disc_radiance.desc": "Rptch Gwylt - Radiação", + "item.twilightforest.music_disc_steps": "Disco de Música", + "item.twilightforest.music_disc_steps.desc": "Rotch Gwylt - Passos", + "item.twilightforest.music_disc_superstitious": "Disco de Música", + "item.twilightforest.music_disc_superstitious.desc": "Rotch Gwylt - Supersticioso", + "item.twilightforest.music_disc_thread": "Disco de Música", + "item.twilightforest.music_disc_thread.desc": "MrCompost - Fio", + "item.twilightforest.music_disc_wayfarer": "Disco de Música", + "item.twilightforest.music_disc_wayfarer.desc": "MrCompost - Viajante", + "item.twilightforest.naga_banner_pattern": "Desenho para Estandarte", + "item.twilightforest.naga_banner_pattern.desc": "Escamas da Naga", + "item.twilightforest.naga_chestplate": "Túnica de Escama da Naga", + "item.twilightforest.naga_leggings": "Calças de Escama da Naga", + "item.twilightforest.naga_scale": "Escama da Naga", + "item.twilightforest.naga_spawn_egg": "Ovo gerador de Naga", + "item.twilightforest.ore_magnet": "Imã de Minério", + "item.twilightforest.ore_map": "Mapa Mágico/Minério em Branco", + "item.twilightforest.ore_meter": "Medidor de Minério", + "item.twilightforest.peacock_feather_fan": "Leque de Penas de Pavão", + "item.twilightforest.penguin_spawn_egg": "Ovo gerador de Pinguim", + "item.twilightforest.phantom_chestplate": "Peitoral de Espectro", + "item.twilightforest.phantom_helmet": "Capacete de Espectro", + "item.twilightforest.pinch_beetle_spawn_egg": "Ovo gerador de Besouro Pinça", + "item.twilightforest.quest_ram_banner_pattern": "Padrão do Banner", + "item.twilightforest.quest_ram_banner_pattern.desc": "Redemoinhos de Carneiro de Missão", + "item.twilightforest.quest_ram_spawn_egg": "Ovo gerador de Carneiro de Missão", + "item.twilightforest.raven_feather": "Pena de Corvo", + "item.twilightforest.raw_ironwood": "Madeira de Ferro Crua", + "item.twilightforest.raw_meef": "Carne Crua", + "item.twilightforest.raw_venison": "Carnde de Veado Crua", + "item.twilightforest.redcap_sapper_spawn_egg": "Ovo gerador de Sapeiro de Boné Vermelho", + "item.twilightforest.seeker_bow": "Arco Procurador", + "item.twilightforest.skeleton_druid_spawn_egg": "Ovo gerador de Esqueleto Druida", + "item.twilightforest.skull_candle.desc": "Tem: %s %s Vela", + "item.twilightforest.skull_candle.desc.multiple": "Tem %s %s Velas", + "item.twilightforest.slime_beetle_spawn_egg": "Ovo gerador de Besouro de Slime", + "item.twilightforest.snow_guardian_spawn_egg": "Ovo gerador de Guardião da Neve", + "item.twilightforest.snow_queen_banner_pattern": "Desenho para Estandarte", + "item.twilightforest.snow_queen_banner_pattern.desc": "Coroa da Rainha da Neve", + "item.twilightforest.snow_queen_spawn_egg": "Ovo gerador de Rainha da Neve", + "item.twilightforest.stable_ice_core_spawn_egg": "Ovo gerador de Núcleo de Gelo Estável", + "item.twilightforest.steeleaf_axe": "Machado de Folha de Aço", + "item.twilightforest.steeleaf_boots": "Botas de Folha de Aço", + "item.twilightforest.steeleaf_chestplate": "Peitoral de Folha de Aço", + "item.twilightforest.steeleaf_helmet": "Capacete de Folha de Aço", + "item.twilightforest.steeleaf_hoe": "Enxada de Folha de Aço", + "item.twilightforest.steeleaf_ingot": "Folha de Aço", + "item.twilightforest.steeleaf_leggings": "Calças de Folha de Aço", + "item.twilightforest.steeleaf_pickaxe": "Picareta de Folha de Aço", + "item.twilightforest.steeleaf_shovel": "Pá de Folha de Aço", + "item.twilightforest.steeleaf_sword": "Espada de Folha de Aço", + "item.twilightforest.swarm_spider_spawn_egg": "Ovo gerador de Aranha de Enxame", + "item.twilightforest.tiny_bird_spawn_egg": "Ovo gerador de Pássaro pequeno", + "item.twilightforest.torchberries": "Bagas de Tocha", + "item.twilightforest.tower_key": "Chave da Torre", + "item.twilightforest.towerwood_borer_spawn_egg": "Ovo gerador de Caruncho da Torre", + "item.twilightforest.transformation_powder": "Pó de Transformação", + "item.twilightforest.twilight_oak_boat": "Bote de Carvalho do Crepúsculo", + "item.twilightforest.twilight_oak_chest_boat": "Bote com Baú de Carvalho do Crepúsculo", + "item.twilightforest.twilight_scepter": "Cetro do Crepúsculo", + "item.twilightforest.unstable_ice_core_spawn_egg": "Ovo gerador de Núcleo de Gelo Instável", + "item.twilightforest.ur_ghast_banner_pattern": "Desenho para Estandarte", + "item.twilightforest.ur_ghast_banner_pattern.desc": "Borda de Carminite", + "item.twilightforest.ur_ghast_spawn_egg": "Ovo gerador de Ur-Ghast", + "item.twilightforest.winter_wolf_spawn_egg": "Ovo gerador de Lobo do Inverno", + "item.twilightforest.yeti_boots": "Botas de Iéti", + "item.twilightforest.yeti_chestplate": "Jaqueta de Iéti", + "item.twilightforest.yeti_helmet": "Elmo com Chifres de Iéti", + "item.twilightforest.yeti_leggings": "Calças de Iéti", + "item.twilightforest.yeti_spawn_egg": "Ovo gerador de Iéti", + "item.twilightforest.zombie_scepter": "Cetro Zumbi", + "itemGroup.twilightforest.blocks": "Twilight Forest: Blocos", + "itemGroup.twilightforest.equipment": "Twilight Forest: Equipamento", + "itemGroup.twilightforest.items": "Twilight Forest: Itens", + "stat.twilightforest.e115_slices_eaten": "Fatias de experimento 115 comidas", + "stat.twilightforest.tf_shields_broken": "Escudos de Fortificação Quebrados", + "stat.twilightforest.torchberries_harvested": "Bagas de Tocha Colhidas", + "stat.twilightforest.trophy_pedestals_activated": "Pedestal de Troféu ativado", + "stat.twilightforest.uncrafting_table_interactions": "Interações com Mesa de Desfabricação", + "structure.twilightforest.aurora_palace": "Palácio Aurora", + "structure.twilightforest.dark_tower": "Torre Negra", + "structure.twilightforest.hedge_maze": "Labirinto de Cobertura", + "structure.twilightforest.hydra_lair": "Covil da Hidra", + "structure.twilightforest.knight_stronghold": "Fortaleza do Cavaleiro", + "structure.twilightforest.labyrinth": "Labirinto do Minotauro", + "structure.twilightforest.large_hollow_hill": "Colina Oca Grande", + "structure.twilightforest.lich_tower": "Torre do Lich", + "structure.twilightforest.medium_hollow_hill": "Colina Oca Média", + "structure.twilightforest.mushroom_tower": "Castelo Cogumelo", + "structure.twilightforest.naga_courtyard": "Pátio da Naga", + "structure.twilightforest.quest_grove": "Arvoredo de Missão", + "structure.twilightforest.small_hollow_hill": "Colina Oca Pequena", + "structure.twilightforest.yeti_cave": "Caverna do Iéti", + "subtitles.twilightforest.block.beanstalk.grow": "Chão treme", + "subtitles.twilightforest.block.bug.squish": "Inseto é esmagado :(", + "subtitles.twilightforest.block.casket.close": "Caixão de Lembranças fecha", + "subtitles.twilightforest.block.casket.locked": "Caixão de Lembrança clica", + "subtitles.twilightforest.block.casket.open": "Caixão de Lembranças abre", + "subtitles.twilightforest.block.core.time": "Ticks da Árvore do Tempo", + "subtitles.twilightforest.block.core.transformation": "Árvore de Transformação sussurra", + "subtitles.twilightforest.block.door.reappear": "Porta do Castelo reaparece", + "subtitles.twilightforest.block.door.vanish": "Porta do Castelo desaparece", + "subtitles.twilightforest.block.ghast_trap.ambient": "Armadilha de Ghast faz ding", + "subtitles.twilightforest.block.ghast_trap.spindown": "Armadilha de Ghast desligada", + "subtitles.twilightforest.block.ghast_trap.warmup": "Armadilha Ghast aquecendo", + "subtitles.twilightforest.block.jet.active": "Jato de Fogo dispara", + "subtitles.twilightforest.block.jet.pop": "Jato de Fogo estoura", + "subtitles.twilightforest.block.reactor.ambient": "O reator de carminita faz barulho", + "subtitles.twilightforest.block.torchberry.harvest": "Bagas de Tocha estouram", + "subtitles.twilightforest.block.vanish.unlock": "Porta da Torre desbloqueia", + "subtitles.twilightforest.entity.boar.ambient": "Javali grunhe", + "subtitles.twilightforest.entity.boar.death": "Javali morre", + "subtitles.twilightforest.entity.boar.hurt": "Javali ferido", + "subtitles.twilightforest.entity.deer.ambient": "Veado muge", + "subtitles.twilightforest.entity.deer.death": "Cervo morre", + "subtitles.twilightforest.entity.deer.hurt": "Cervo ferido", + "subtitles.twilightforest.entity.dwarf_rabbit.ambient": "Coelho Anão guincha", + "subtitles.twilightforest.entity.dwarf_rabbit.death": "Coelho Anão morre", + "subtitles.twilightforest.entity.dwarf_rabbit.hurt": "Coelho Anão ferido", + "subtitles.twilightforest.entity.hydra.growl": "Hidra rosna", + "subtitles.twilightforest.entity.hydra.hurt": "Hidra ferida", + "subtitles.twilightforest.entity.hydra.roar": "Hidra ruge", + "subtitles.twilightforest.entity.hydra.shoot_fire": "Hidra atira fogo", + "subtitles.twilightforest.entity.hydra.warn": "Hidra se prepara para morder", + "subtitles.twilightforest.entity.ice.death": "Núcleo de Gelo Morre", + "subtitles.twilightforest.entity.ice.hurt": "Núcleo de Gelo é ferido", + "subtitles.twilightforest.entity.kobold.ambient": "Kobold resmunga", + "subtitles.twilightforest.entity.kobold.death": "Kobold morre", + "subtitles.twilightforest.entity.kobold.hurt": "Kobold ferido", + "subtitles.twilightforest.entity.kobold.munch": "Kobold mastiga comida", + "subtitles.twilightforest.entity.lich.ambient": "Lich respira", + "subtitles.twilightforest.entity.lich.death": "Lich morre", + "subtitles.twilightforest.entity.lich.hurt": "Lich ferido", + "subtitles.twilightforest.entity.lich.shoot": "Lich atira", + "subtitles.twilightforest.entity.lich.teleport": "Lich teleporta", + "subtitles.twilightforest.entity.minion.ambient": "Seguidor de Lich grunhe", + "subtitles.twilightforest.entity.minion.death": "Seguidor de Lich morre", + "subtitles.twilightforest.entity.minion.hurt": "Seguidor de Lich ferido", + "subtitles.twilightforest.entity.minion.summon": "Lich invoca novo Seguidor", + "subtitles.twilightforest.entity.minoshroom.ambient": "Minogumelo muje", + "subtitles.twilightforest.entity.minoshroom.death": "Minogumelo morre", + "subtitles.twilightforest.entity.minoshroom.hurt": "Minogumelo ferido", + "subtitles.twilightforest.entity.minoshroom.slam": "Minogumelo bate no chão", + "subtitles.twilightforest.entity.minotaur.ambient": "Minotauro muje", + "subtitles.twilightforest.entity.minotaur.death": "Minotauro morre", + "subtitles.twilightforest.entity.minotaur.hurt": "Minotauro é ferido", + "subtitles.twilightforest.entity.mosquito.ambient": "Mosquitos zumbem", + "subtitles.twilightforest.entity.naga.hiss": "Naga sibila", + "subtitles.twilightforest.entity.naga.hurt": "Naga ferida", + "subtitles.twilightforest.entity.naga.rattle": "Naga chocalha", + "subtitles.twilightforest.entity.raven.caw": "Corvo grasna", + "subtitles.twilightforest.entity.redcap.ambient": "Boné Vermelho se ri", + "subtitles.twilightforest.entity.redcap.death": "Boné Vermelho geme em agonia", + "subtitles.twilightforest.entity.redcap.hurt": "Boné Vermelho guinha em dor", + "subtitles.twilightforest.entity.tear.break": "A lágrima de Ur-Ghast se estilhaça", + "subtitles.twilightforest.entity.troll.throw_rock": "Troll arremessa bloco", + "subtitles.twilightforest.entity.wraith.ambient": "Espectro suspira", + "subtitles.twilightforest.entity.wraith.death": "Aparição morre", + "subtitles.twilightforest.entity.wraith.hurt": "Aparição ferida", + "subtitles.twilightforest.entity.yeti.death": "Iéti morre", + "subtitles.twilightforest.entity.yeti.growl": "Iéti rosna", + "subtitles.twilightforest.entity.yeti.hurt": "Iéti ferido", + "subtitles.twilightforest.item.charm.keep": "Amuleto de Manter retorna os itens", + "subtitles.twilightforest.item.flask.break": "Frasco frágil quebra", + "subtitles.twilightforest.item.flask.crack": "Frasco Frágil quebra", + "subtitles.twilightforest.item.flask.fill": "Frasco frágil se enche", + "subtitles.twilightforest.item.knightmetal_shield.shatter": "Escudo de Metal Quebra", + "subtitles.twilightforest.item.moonworm.squish": "Minhoca Lunar dispara", + "subtitles.twilightforest.item.scepter.drain": "Cetro da Vida drena", + "subtitles.twilightforest.item.scepter.pearl": "Cetro do Crepúsculo joga pérola", + "subtitles.twilightforest.item.shield.shatter": "Escudo de Madeira estilhaça", + "twilightforest.book.author": "um explorador esquecido", + "twilightforest.book.darktower": "Notas sobre uma Torre de Madeira", + "twilightforest.book.darktower.1": "§8[[Caderno de um explorador que parece ter sobrevivido a uma explosão]]§0\n\nEsta torre claramente tem mecanismos que não estão respondendo a mim. A magia deles quase anseia por reconhecer meu toque, mas não pode. É se os dispositivos da torre estão sendo", + "twilightforest.book.darktower.2": "suprimido por um poderoso grupo de seres próximos.\n\n§8[[Próxima entrada]]§0\n\nA magia parece emanar das profundezas das fortalezas próximas. Não pode vir dos duendes, pois sua magia é encantadora, mas sem foco. Lá", + "twilightforest.book.darktower.3": "ainda deve haver alguma força ainda ativa nas fortalezas.\n\n§8[[Próxima entrada]]§0\n\nMinha análise indica que vem de várias fontes, operando como um grupo. Voltarei para a fortaleza depois de reabastecer...", + "twilightforest.book.hydralair": "Notas sobre Pântano de Fogo", + "twilightforest.book.icetower": "Notas sobre Fortificação Auroral", + "twilightforest.book.labyrinth": "Notas sobre um Labirinto Pantanoso", + "twilightforest.book.lichtower": "Notas sobre uma Torre Pontuda", + "twilightforest.book.tfstronghold": "Notas sobre uma Fortaleza", + "twilightforest.book.trollcave": "Notas sobre Planaltos", + "twilightforest.book.unknown": "Notas sobre o Inexplicado", + "twilightforest.book.yeticave": "Notas sobre uma Caverna Gelada" +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/qya_aa.json b/src/main/resources/assets/twilightforest/lang/qya_aa.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/qya_aa.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/ro_ro.json b/src/main/resources/assets/twilightforest/lang/ro_ro.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/ro_ro.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/ru_RU.lang b/src/main/resources/assets/twilightforest/lang/ru_RU.lang deleted file mode 100644 index 6212f19b0e..0000000000 --- a/src/main/resources/assets/twilightforest/lang/ru_RU.lang +++ /dev/null @@ -1,413 +0,0 @@ -tile.TFLog.0.name=Сумеречный дуб -tile.TFLog.1.name=Сумеречная сосна -tile.TFLog.2.name=Сумеречная берёза -tile.TFLog.3.name=Тёмное дерево -tile.TFLeaves.0.name=Листва сумеречного дуба -tile.TFLeaves.1.name=Листва сумеречной сосны -tile.TFLeaves.2.name=Листва сумеречной берёзы -tile.TFLeaves.3.name=Разноцветная листва -tile.TFFirefly.name=Светлячок -tile.TFCicada.name=Цикада -tile.TFPortal.name=Блок портала в сумеречный лес -tile.TFMazestone.0.name=Камень лабиринта -tile.TFMazestone.1.name=Кладка из камня лабиринта -tile.TFMazestone.2.name=Гладкая лабиринтовая кладка -tile.TFMazestone.3.name=Декоративная лабиринтовая кладка -tile.TFMazestone.4.name=Потресканая лабиринтовая кладка -tile.TFMazestone.5.name=Замшелая лабиринтовая кладка -tile.TFMazestone.6.name=Узорчатая лабиринтовая кладка -tile.TFMazestone.7.name=Двойная узорчатая лабиринтовая кладка -tile.TFMazestone.8.name=Потолок из камня лабиринта -tile.TFHedge.0.name=Хеджа -tile.TFHedge.1.name=Листва тёмного дерева -tile.TFHedge.2.name=Хеджа -tile.TFBossSpawner.0.name=Спавнер Наги -tile.TFBossSpawner.1.name=Спавнер Лича -tile.TFBossSpawner.2.name=Спавнер Гидры -tile.TFFireflyJar.name=Баночка со светлячком -tile.TFPlant.8.name=Сверкающая трава -tile.TFPlant.9.name=Светогриб -tile.TFPlant.13.name=Факелонтовый росток -tile.TFPlant.14.name=Висячие корни -tile.TFRoots.0.name=Корни -tile.TFRoots.1.name=Замшелые корни -tile.TFUncraftingTable.name=Анти верстак -tile.TFFireJet.0.name=Дымовой блок -tile.TFFireJet.8.name=Огненный блок -tile.TFFireJet.9.name=Дымящиейся огненный блок -tile.TFFireJet.10.name=Горящий огненный блок -tile.TFNagastone.0.name=Нагакамень -tile.TFNagastone.1.name=Нагакамень -tile.TFNagastone.2.name=Нагакамень -tile.TFNagastone.3.name=Нагакамень -tile.TFNagastone.4.name=Нагакамень -tile.TFNagastone.5.name=Нагакамень -tile.TFNagastone.6.name=Нагакамень -tile.TFNagastone.7.name=Нагакамень -tile.TFNagastone.8.name=Нагакамень -tile.TFNagastone.9.name=Нагакамень -tile.TFNagastone.10.name=Нагакамень -tile.TFNagastone.11.name=Нагакамень -tile.TFNagastone.12.name=Нагакамень -tile.TFNagastone.13.name=Нагакамень -tile.TFNagastone.14.name=Нагакамень -tile.TFNagastone.15.name=Нагакамень -tile.TFAuroraBrick.0.name=Лёгкий блок -tile.TFUnderBrick.0.name=Подземные кирпичи -tile.TFUnderBrick.1.name=Потресканные поздемные кирпичи -tile.TFUnderBrick.2.name=Замшелые подземные кирпичи -tile.TFSapling.0.name=Саженец сумеречного дуба -tile.TFSapling.1.name=Саженец сумеречной сосны -tile.TFSapling.2.name=Саженец сумеречной берёзы -tile.TFSapling.3.name=Саженец тёмного дерева -tile.TFSapling.4.name=Саженец большого сумеречного дуба -tile.TFSapling.5.name=Саженец дерева времени -tile.TFSapling.6.name=Саженец мудрого дерева -tile.TFSapling.7.name=Саженец дерева шахтёра -tile.TFSapling.8.name=Саженец сортировочного дерева -tile.TFSapling.9.name=Саженец разноцветного дерева -tile.TFMoonworm.name=Гусеница -tile.TFMagicLog.0.name=Дерево времени -tile.TFMagicLog.1.name=Загадочное дерево -tile.TFMagicLog.2.name=Дерево шахтёра -tile.TFMagicLog.3.name=Правильное дерево -tile.TFMagicLogSpecial.0.name=Дерево времени -tile.TFMagicLogSpecial.1.name=Мудрое дерево -tile.TFMagicLogSpecial.2.name=Ядро дерева шахтёра -tile.TFMagicLogSpecial.3.name=Ядро дерева сортировки -tile.TFMagicLeaves.0.name=Листва дерева времени -tile.TFMagicLeaves.1.name=Листва мудрого дерева -tile.TFMagicLeaves.2.name=Листва шахтёра -tile.TFMagicLeaves.3.name=Листва сортировки -tile.TFTowerStone.0.name=Планки тёмной башни -tile.TFTowerStone.1.name=Боковые планки тёмной башни -tile.TFTowerStone.2.name=Трестнутые планки тёмной башни -tile.TFTowerStone.3.name=Замшелые планки тёмной башни -tile.TFTowerStone.4.name=Инфицированные планки тёмной башни -tile.TFTowerDevice.0.name=Восстанавливающийся блок -tile.TFTowerDevice.1.name=Активный восстанавливающийся блок -tile.TFTowerDevice.2.name=Исчезающий блок -tile.TFTowerDevice.3.name=Активный исчезающий блок -tile.TFTowerDevice.4.name=Заблокированный восстанавливающийся блок -tile.TFTowerDevice.5.name=Разблокированый восстанавливающийся блок -tile.TFTowerDevice.6.name=Строитель башни -tile.TFTowerDevice.7.name=Активный строитель башни -tile.TFTowerDevice.8.name=Неактивный строитель башни -tile.TFTowerDevice.9.name=Антистроитель -tile.TFTowerTranslucent.0.name=Восстанавливающийся блок -tile.TFTowerTranslucent.1.name=Активный восстанавливающийся блок -tile.TFTowerTranslucent.2.name=Блок строителя башни -tile.TFTowerTranslucent.3.name=Активный блок строители башни -tile.TFTowerTranslucent.4.name=Анти-строитель башни -tile.TFTrophy.0.name=Трофей сумеречного леса -item.experiment115.name=Образец 115 -item.nagaScale.name=Сердце Наги -tile.TFTowerTranslucent.6.name=Поддельное золото -tile.TFTowerTranslucent.7.name=Поддельный алмаз -item.plateNaga.name=Нагрудник из сердец Наги -item.legsNaga.name=Поножи из сердец Наги -item.scepterTwilight.name=Сумеречный посох -item.scepterLifeDrain.name=Посох смерти -entity.TwilightForest.Helmet Crab.name=Шлемовый краб -entity.TwilightForest.Upper Goblin Knight.name=Гоблин-рыцарь с копьём -entity.TwilightForest.Lower Goblin Knight.name=Гоблин-рыцарь -entity.TwilightForest.Block&Chain Goblin.name=Гоблин-рыцарь с булавой -entity.TwilightForest.Knight Phantom.name=Призрак рыцаря -item.scepterZombie.name=Посох мёртвых -item.oreMeter.name=Определитель руд -tile.TFTowerDevice.10.name=Ловушка для гаста -tile.TFTowerDevice.11.name=Активная ловушка для гаста -item.magicMap.name=Магическая карта -item.mazeMap.name=Карта лабиринта -item.oreMap.name=Шахтёрская карта -item.tfFeather.name=Воронье перо -item.phantomHelm.name=Шлем Фантома -item.phantomPlate.name=Нагрудник Фантома -item.magicMapFocus.name=Магическое перо -item.mazeMapFocus.name=Магическое ядро -item.liveRoot.name=Замшелый корень -item.ironwoodRaw.name=Магический материал -item.ironwoodIngot.name=Металл древних -item.ironwoodHelm.name=Шлем древних -item.ironwoodPlate.name=Нагрудник древних -item.ironwoodLegs.name=Поножи древних -item.ironwoodBoots.name=Ботинки древних -item.ironwoodSword.name=Меч древних -item.ironwoodShovel.name=Лопата древних -item.ironwoodPick.name=Кирка древних -item.ironwoodAxe.name=Топор древних -item.ironwoodHoe.name=Мотыга древних -item.torchberries.name=Факелонт -item.venisonRaw.name=Сырая оленятина -item.venisonCooked.name=Олений стейк -item.hydraChop.name=Мясо Гидры -item.fieryBlood.name=Огенная кровь -item.fieryIngot.name=Огненный слиток -item.fieryHelm.name=Огненный шлем -item.fieryPlate.name=Огненный нагрудник -item.fieryLegs.name=Огненные поножи -item.fieryBoots.name=Огненные ботинки -item.fierySword.name=Огненный меч -item.fieryPick.name=Огненная кирка -item.steeleafIngot.name=Магический лист -item.steeleafHelm.name=Шлем из магических листьев -item.steeleafPlate.name=Нагрудник из магических листьев -item.steeleafLegs.name=Поножи из магических листьев -item.steeleafBoots.name=Ботинки из магических листьев -item.steeleafSword.name=Меч из магических листьев -item.steeleafShovel.name=Лопата из магических листьев -item.steeleafPick.name=Кирка из магических листьев -item.steeleafAxe.name=Топор из магических листьев -item.steeleafHoe.name=Мотыга из магических листьев -item.minotaurAxe.name=Топор Минотавра -item.mazebreakerPick.name=Кирка лабиринта -item.transformPowder.name=Порошок трансформации -item.meefRaw.name=Мясо минотавра -item.meefSteak.name=Стейк из минотавра -item.meefStroganoff.name=Суп из минотавра -item.mazeWafer.name=Вафли -tile.TFPlant.3.name=Покров мха -tile.TFPlant.4.name=Четырёхлистный клевер -item.emptyMagicMap.name=Пустая Магическая карта -item.emptyMazeMap.name=Пустая карта лабиринта -item.emptyOreMap.name=Пустая шахтёрская карта -item.oreMagnet.name=Рудный магнит -item.crumbleHorn.name=Рог -item.peacockFan.name=Веер полёта -item.moonwormQueen.name=Королева гусениц -item.charmOfLife1.name=Чарм жизни I -item.charmOfLife2.name=Чарм жизни II -item.charmOfKeeping1.name=Чарм инвентаря I -item.charmOfKeeping2.name=Чарм инвентаря II -item.charmOfKeeping3.name=Чарм инвентаря III -item.towerKey.name=Ключ от башни -tile.TFTowerDevice.12.name=Карминитовый реактор -tile.TFTowerDevice.13.name=Активный карминитовый реактор -entity.TwilightForest.Redscale Broodling.name=Карминитовая скала -entity.TwilightForest.Tower Golem.name=Кариминитовый голем -entity.TwilightForest.Tower Ghast.name=Карминитовый охренник -entity.TwilightForest.Mini Ghast.name=Карминитовый гаст -item.carminite.name=Карминит -entity.TwilightForest.Tower Termite.name=Буровые планки тёмной башни -item.borerEssence.name=Буровая эссенция -entity.TwilightForest.Tower Boss.name=Тёмный гаст - -item.tfspawnegg.name=Призвать существо - - -enchantment.tfFireReact=Аура огня - -itemGroup.twilightForest=Twilight Forest - -entity.TwilightForest.Wild Boar.name=Кабан -entity.TwilightForest.Bighorn Sheep.name=Баран -entity.TwilightForest.Wild Deer.name=Олень -entity.TwilightForest.Redcap.name=Шахтёр -entity.TwilightForest.Swarm Spider.name=Маленький паук -entity.TwilightForest.Naga.name=Нага -entity.TwilightForest.Naga Segment.name=Часть Наги -entity.TwilightForest.Naga.name=Нага -entity.TwilightForest.Skeleton Druid.name=Друид -entity.TwilightForest.Hostile Wolf.name=Злой волк -entity.TwilightForest.Twilight Wraith.name=Призрак -entity.TwilightForest.Hedge Spider.name=Зелёный паук -entity.TwilightForest.Hydra.name=Гидра -entity.TwilightForest.HydraHead.name=Голова Гидры -entity.TwilightForest.Twilight Lich.name=Сумеречный Лич -entity.TwilightForest.Penguin.name=Пингвин -entity.TwilightForest.Tiny Bird.name=Лесная птица -entity.TwilightForest.Penguin.name=Пингвин -entity.TwilightForest.Forest Squirrel.name=Лесная белка -entity.TwilightForest.Forest Bunny.name=Лесной кролик -entity.TwilightForest.Forest Raven.name=Лесная ворона -entity.TwilightForest.Questing Ram.name=Квест Рам -entity.TwilightForest.Twilight Kobold.name=Кобольт -entity.TwilightForest.Boggard.name=Боггард -entity.TwilightForest.Penguin.name=Пингвин -entity.TwilightForest.Lich Minion.name=Слуга Лича -entity.TwilightForest.Loyal Zombie.name=Миньон зомби -entity.TwilightForest.Mosquito Swarm.name=Москиты -entity.TwilightForest.Death Tome.name=Чернокнижник -entity.TwilightForest.Minotaur.name=Минотавр -entity.TwilightForest.Minoshroom.name=Король минотавров -entity.TwilightForest.Fire Beetle.name=Огненный жук -entity.TwilightForest.Slime Beetle.name=Слизневый жук -entity.TwilightForest.Pinch Beetle.name=Жук с клешнями -entity.TwilightForest.Maze Slime.name=Лабиринтовый слизень -entity.TwilightForest.Redcap Sapper.name=Шахтёр-подрывник -entity.TwilightForest.Mist Wolf.name=Король волков -entity.TwilightForest.King Spider.name=Король пауков -entity.TwilightForest.Firefly.name=Светлячок -entity.TwilightForest.Mini Ghast.name=Мини гаст -entity.TwilightForest.Tower Ghast.name=Охранник тёмной башни -entity.TwilightForest.Tower Golem.name=Голем тёмной башни -entity.TwilightForest.Tower Snowman.name=Снеговик тёмной башни -entity.TwilightForest.Tower Termite.name=Чешуйница тёмной башни -entity.TwilightForest.Redscale Broodling.name=Паук тёмной башни -item.trophy.hydra.name=Трофей Гидры -item.trophy.naga.name=Трофей Наги -item.trophy.lich.name=Трофей Сумеречного Лича -item.trophy.ur-ghast.name=Трофей Тёмного Гаста -item.armorShards.name=Осколок королевского металла -item.knightMetal.name=Королевский металл -item.shardCluster.name=Осколки королевского металла -item.knightlyHelm.name=Королевский шлем -item.knightlyPlate.name=Королевский нагрудник -item.knightlyLegs.name=Королевские поножи -item.knightlyBoots.name=Королевские ботинки -item.knightlySword.name=Королевский меч -item.knightlyPick.name=Королевская кирка -item.knightlyAxe.name=Королевский топор -tile.TFShield.0.name=Крепкий щит -tile.TFShield.1.name=Крепкий щит -tile.TFShield.2.name=Крепкий щит -tile.TFShield.3.name=Крепкий щит -tile.TFShield.4.name=Крепкий щит -tile.TFShield.5.name=Крепкий щит -tile.TFShield.15.name=Крепкий щит -tile.TFTrophyPedestal.0.name=Трофейный пьедестал -tile.TFTrophyPedestal.15.name=Активированный трофейный пьедестал -item.lampOfCinders.name=Лампа огня -tile.TFThorns.brown.name=Шипы -tile.TFThorns.green.name=Зелёные шипы -tile.TFBurntThorns.name=Истлевшие шипы -tile.TFThornRose.name=Шипастая роза -tile.TFPlant.10.name=Лесная трава -tile.TFPlant.11.name=Мёртвый куст -item.fieryTears.name=Огненные слёзы -item.iceBomb.name=Снежная бомба -item.yetiHelm.name=Шапка Йети -item.yetiPlate.name=Куртка Йети -item.yetiLegs.name=Штаны Йети -item.yetiBoots.name=Ботинки Йети -item.alphaFur.name=Мех Альмо-йети -item.arcticFur.name=Артический мех -item.arcticHelm.name=Меховой капюшон -item.arcticPlate.name=Меховая куртка -entity.TwilightForest.Yeti.name=Йети -entity.TwilightForest.Yeti Boss.name=Альмо-йети -entity.TwilightForest.WinterWolf.name=Снежный волк -entity.TwilightForest.SnowGuardian.name=Снежный страж -item.arcticLegs.name=Меховые штаны -item.arcticBoots.name=Меховые ботинки -tile.TFAuroraBrick.name=Блок Авроры -tile.TFDeadrock.surface.name=Влажный камень смерти -tile.TFDeadrock.cracked.name=Потрескавшийся камень смерти -tile.TFDeadrock.solid.name=Камень смерти -tile.DarkLeaves.name=Листва тёмного дерева -tile.AuroraPillar.name=Колонна Авроры -tile.AuroraSlab.name=Плита Авроры -achievement.twilightPortal=Почему бы и нет? -achievement.twilightPortal.desc=Постройте портал в сумеречный лес. -achievement.twilightArrival=В сумеречный лес! -achievement.twilightArrival.desc=Прыгните в портал -achievement.twilightHunter=Лесной убийца -achievement.twilightHunter.desc=Убейте существо в сумеречном лесу. -achievement.twilightMagicMapFocus=Написанное огнём -achievement.twilightMagicMapFocus.desc=Сделайте магическое перо. -achievement.twilightKillNaga=Убийца Наги -achievement.twilightKillNaga.desc=Убейте Нагу впервые. -achievement.twilightNagaArmors=Выглядит прочно -achievement.twilightNagaArmors.desc=Сделайте броню из сердец Наги. -achievement.twilightKillLich=Убить мёртвого. -achievement.twilightKillLich.desc=Убейте Лича в его башне. -achievement.twilightLichScepters=Мастер по посохам -achievement.twilightLichScepters.desc=Соберите полную коллекцию посохов. -achievement.twilightHill1=ЭТИ БОТИНКИ МОИ!!! -achievement.twilightHill1.desc=Убейте шахтёра в маленьком холме. -achievement.twilightHill2=Повзрывай мне тут! -achievement.twilightHill2.desc=Убейте шахтёра-подрывника в среднем холме. -achievement.twilightHill3=Я вижу тебя насквозь -achievement.twilightHill3.desc=Встретьте и убейте призрака в большом холме. -achievement.twilightHedge="Любитель" насекомых -achievement.twilightHedge.desc=Убейте паука в хеджовом лабиринте. -achievement.twilightMagicMap=Далеко гляжу -achievement.twilightMagicMap.desc=Сделайте магическую карту. -achievement.twilightMazeMap=Теперь, я найду выход -achievement.twilightMazeMap.desc=Сделайте карту лабиринта. -achievement.twilightOreMap=Почему бы и нет? -achievement.twilightOreMap.desc=Сделайте шахтёрскую карту. -achievement.twilightKillHydra=Убийца Гидры -achievement.twilightKillHydra.desc=Убейте Гидру в её логове. -achievement.twilightHydraChop=Массивные отбивные -achievement.twilightHydraChop.desc=Попробуйте на вкус мясо Гидры. -achievement.twilightMazebreaker=Крушитель лабиринтов -achievement.twilightMazebreaker.desc=Найдите кирку лабиринта в секретном хранилище. -achievement.twilightFierySet=Кровь и слёзы -achievement.twilightFierySet.desc=Наденьте что-нибудь из огненной брони. -achievement.twilightQuestRam=Непревзойдённый -achievement.twilightQuestRam.desc=Завершите квест Рама. -achievement.twilightProgressNaga=Чешуйчатый герой -achievement.twilightProgressNaga.desc=Имея броню из сердец Наги, наведайте Лича. -achievement.twilightProgressLich=Прикосновение нежити -achievement.twilightProgressLich.desc=Это довольно трудно объяснить... -achievement.twilightProgressLabyrinth=Могучий Строганов -achievement.twilightProgressLabyrinth.desc=Суп из минотавра помогает мне пойти на огненное болото. -achievement.twilightProgressHydra=От одной крови -achievement.twilightProgressHydra.desc=Огненная кровь поможет мне пойти в тёмный лес. -achievement.twilightProgressTrophyPedestal=Чемпион с трофеями. -achievement.twilightProgressTrophyPedestal.desc=Заявите о своём титуле, поставив трофей на пьедестал в лесных руинах. -achievement.twilightProgressKnights=Карминитовая акклиматизация -achievement.twilightProgressKnights.desc=Призраки будут слушаться вас. -achievement.twilightProgressUrghast=Слёзы огня -achievement.twilightProgressUrghast.desc=Прикоснитесь к слёзам Тёмного Гаста, чтобы противостоять холоду снежного леса. -achievement.twilightProgressYeti=Тёплый мех -achievement.twilightProgressYeti.desc=Линия одежды с мехом Альмо-йети сохранит вас от мороза -achievement.twilightProgressGlacier=Убийца тролля -achievement.twilightProgressGlacier.desc=Убейте тролля в замке Авроры -achievement.twilightProgressTroll=Я желаю больше огня -achievement.twilightProgressTroll.desc=Найдите лампу огня в пещерах троллей и она поможет вам. -achievement.twilightProgressThorns=Мимо шипов -achievement.twilightProgressThorns.desc=Откройте дверь в замок. -achievement.twilightProgressCastle=Этот замок классный -achievement.twilightProgressCastle.desc=Что может быть ещё в этом замке? -enchantment.tfChillAura=Ледяная аура -item.minotaurAxe.tooltip=Дополнительный урон во время бега -item.knightlySword.tooltip=Дополнительный урон по бронированным целям -item.knightlyPick.tooltip=Дополнительный урон по бронированным целям -item.knightlyAxe.tooltip=Дополнительный урон по не бронированным целям -item.giantPick.name=Кирка гиганта -item.giantSword.name=Меч гиганта -item.tripleBow.name=Тройной лук -item.seekerBow.name=Лук искателя -item.iceBow.name=Ледяной лук -item.enderBow.name=Эндер лук -item.iceSword.name=Ледяной меч -item.glassSword.name=Стеклянный меч -tile.TrollSteinn.name=Тролльштеин -tile.WispyCloud.name=Прозрачное облако -tile.FluffyCloud.name=Взбытое облако -tile.GiantCobble.name=Гигантский булыжник -tile.GiantLog.name=Гигантское дерево -tile.GiantLeaves.name=Гигантские листья -tile.GiantObsidian.name=Гигантский обсидиан -tile.UberousSoil.name=Анбеоновая почва -tile.HugeStalk.name=Огромный стебель -tile.HugeGloomBlock.name=Огромный грибрил -tile.TrollVidr.name=Тролловидр -tile.UnripeTrollBer.name=Спелый тролльбер -tile.TrollBer.name=Тролльбер -tile.TFLeaves3.1.name=Бобовые листья -item.magicBeans.name=Волшебные семена -entity.TwilightForest.Stable Ice Core.name=Стабильное замёрзшее ядро -entity.TwilightForest.Unstable Ice Core.name=Нестабильное замёрзшее ядро -entity.TwilightForest.Snow Queen.name=Снежная королева -entity.TwilightForest.Troll.name=Пещерный тролль -entity.TwilightForest.Giant Miner.name=Гигант шахтёра -entity.TwilightForest.Armored Giant.name=Бронированный гигант -entity.TwilightForest.Ice Crystal.name=Ледяной кристалл -tile.TFFireJet.1.name=Приручённый дымок -tile.TFFireJet.2.name=Приручённый дымок -tile.TFFireJet.11.name=Заключённый огонёк -tile.TFFireJet.12.name=Заключённый шумящий огонёк -tile.TFFireJet.13.name=Заключённый пылающий огонёк -item.fieryPick.tooltip=Авто переплавка -tem.giantPick.tooltip=Ломает гигантские блоки -item.fierySword.tooltip=Поджигает цель -item.fieryHelm.tooltip=Поджигает атакующего -item.fieryPlate.tooltip=Поджигает атакующего -item.fieryLegs.tooltip=Поджигает атакующего -item.fieryBoots.tooltip=Поджигает атакующего -item.yetiHelm.tooltip=Охлаждает атакующего -item.yetiPlate.tooltip=Охлаждает атакующего -item.yetiLegs.tooltip=Охлаждает атакующего -item.yetiBoots.tooltip=Охлаждает атакующего \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/ru_ru.json b/src/main/resources/assets/twilightforest/lang/ru_ru.json new file mode 100644 index 0000000000..b46fff1a30 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/ru_ru.json @@ -0,0 +1,735 @@ +{ + "advancement.twilightforest.arborist": "Маникальный дендролог", + "advancement.twilightforest.arborist.desc": "Приготовьте топоры и ножницы. Исследуйте каждую щель и норку и получите всё, что связано с деревьями! Создавайте, добывайте, получайте каждую доску... саженец... лист... и многое другое... всё! ВСЁ!", + "advancement.twilightforest.arctic_dyed": "Местный стиляга", + "advancement.twilightforest.arctic_dyed.desc": "Окрасьте четыре уникальных части Арктической брони", + "advancement.twilightforest.beanstalk": "Джек и бобовый стебель", + "advancement.twilightforest.beanstalk.desc": "Получите некоторые %s в пещерах троллей и используйте их на светящейся почве под облаками", + "advancement.twilightforest.experiment_115": "Таинственный пирог?", + "advancement.twilightforest.experiment_115.desc": "Это похоже на торт, хотя ...", + "advancement.twilightforest.experiment_115_2": "Делаем заметку: огромный успех!", + "advancement.twilightforest.experiment_115_2.desc": "Это так вкусно и влажно! Пальчики оближешь!", + "advancement.twilightforest.experiment_115_3": "Питание 115 Ежедневно, 115 Лет, Навсегда", + "advancement.twilightforest.experiment_115_3.desc": "ест эксперимент сто пятнадцать весь день, навсегда, сто пятнадцать раз эксперимент сто пятнадцать, эксперимент сто пятнадцать точка ком, дабл-Ю дабл-Ю дабл-Ю точка эксперимента сто пятнадцать точка ком, сто пятнадцать лет, каждую минуту эксперимента сто пятнадцать точка ком, дабл-Ю дабл-Ю дабл-Ю точка сто-пятнадцать раз эксперимент сто пятнадцать точка ком", + "advancement.twilightforest.fiery_set": "Потом и кровью", + "advancement.twilightforest.fiery_set.desc": "Владейте огненным инструментом или оружием, имея хотя бы одну часть огненной брони в своем инвентаре", + "advancement.twilightforest.full_mettle_alchemist": "Легендарный алхимик^f", + "advancement.twilightforest.full_mettle_alchemist.desc": "Выпейте четыре раза Harming II из бутылки с зельем менее чем за 8 секунд и выживите", + "advancement.twilightforest.ghast_trap": "Что-то странное в деревянной башне", + "advancement.twilightforest.ghast_trap.desc": "Убейте мини гаста около ловушки и активируйте ключ темного гаста из неба!", + "advancement.twilightforest.giants": "На девятом облаке", + "advancement.twilightforest.giants.desc": "Убейте %s в облаках, заберите %s и вернитесь в пещеры троллей", + "advancement.twilightforest.glass_sword": "Одним ударом", + "advancement.twilightforest.glass_sword.desc": "Надеюсь, вы хорошо это использовали...", + "advancement.twilightforest.hedge": "Арахнофоб", + "advancement.twilightforest.hedge.desc": "Победить паука в лабиринте хеджа", + "advancement.twilightforest.hill1": "Сапоги мои!", + "advancement.twilightforest.hill1.desc": "Убейте %s в маленьком холме", + "advancement.twilightforest.hill2": "Что это за шум?", + "advancement.twilightforest.hill2.desc": "Убейте %s в среднем холме", + "advancement.twilightforest.hill3": "Я вижу тебя насквозь", + "advancement.twilightforest.hill3.desc": "Убейте %s в большом холме", + "advancement.twilightforest.hydra_chop": "Массивные отбивные", + "advancement.twilightforest.hydra_chop.desc": "Перекусите %s когда шкала голода опустеет", + "advancement.twilightforest.kill_cicada": "Закрыть", + "advancement.twilightforest.kill_cicada.desc": "Убить цикаду", + "advancement.twilightforest.kill_hydra": "Убийца Гидры", + "advancement.twilightforest.kill_hydra.desc": "Победите могучего %s и усильте себя", + "advancement.twilightforest.kill_lich": "Убить мёртвого", + "advancement.twilightforest.kill_lich.desc": "Убейте %s на вершине его башни и добудьте скипетр, чтобы очистить Болото от ядовитых комаров, увидеть сквозь слепящую тьму проклятия Сумрачного леса и противостоять холоду Снежного леса", + "advancement.twilightforest.kill_naga": "Убийца Наги", + "advancement.twilightforest.kill_naga.desc": "Убейте %s в его лесном дворе и получите %s, чтобы преодолеть магический барьер, окружающий башню Лича", + "advancement.twilightforest.lich_scepters": "Наши силы объединены!", + "advancement.twilightforest.lich_scepters.desc": "Получите все четыре скипетра власти", + "advancement.twilightforest.magic_map": "Далеко гляжу", + "advancement.twilightforest.magic_map.desc": "Создайте %s", + "advancement.twilightforest.magic_map_focus": "Написанное огнём", + "advancement.twilightforest.magic_map_focus.desc": "Создайте %s с помощью %s, %s и %s", + "advancement.twilightforest.maze_map": "Теперь я найду выход", + "advancement.twilightforest.maze_map.desc": "Создайте %s после получения фокуса из лабиринта", + "advancement.twilightforest.mazebreaker": "Крушитель лабиринтов", + "advancement.twilightforest.mazebreaker.desc": "Найдите кирку %s в секретном хранилище лабиринта", + "advancement.twilightforest.naga_armors": "Броня Наги", + "advancement.twilightforest.naga_armors.desc": "Изготовить нагрудник и поножи %s", + "advancement.twilightforest.ore_map": "Почему бы и нет?", + "advancement.twilightforest.ore_map.desc": "Создайте %s", + "advancement.twilightforest.progress_glacier": "Чистое небо", + "advancement.twilightforest.progress_glacier.desc": "Победите %s на вершине Дворца Авроры", + "advancement.twilightforest.progress_knights": "Карминитовые врата", + "advancement.twilightforest.progress_knights.desc": "Поселите беспокойных призраков в рыцарской гробнице и устройства карминовой башни будут вам подчиняться", + "advancement.twilightforest.progress_labyrinth": "Могучий строганов", + "advancement.twilightforest.progress_labyrinth.desc": "Съешьте бефстроганов, чтобы акклиматизироваться к опасной жаре Огненного болота", + "advancement.twilightforest.progress_merge": "Окончательное противостояние", + "advancement.twilightforest.progress_merge.desc": "Убейте %s %s и %s чтобы очистить кислотный дождь и набраться смелости для нагорья", + "advancement.twilightforest.progress_troll": "Я желаю больше огня", + "advancement.twilightforest.progress_troll.desc": "Найдите %s в пещерах троллей, и вы сможете сжечь тернистые барьеры", + "advancement.twilightforest.progress_trophy_pedestal": "Трофейный чемпион", + "advancement.twilightforest.progress_trophy_pedestal.desc": "Заявите о себе, поместив трофей на пьедестал в руинах Темного леса", + "advancement.twilightforest.progress_ur_ghast": "Слёзы огня", + "advancement.twilightforest.progress_ur_ghast.desc": "Коснитесь огненно-красных слез %s", + "advancement.twilightforest.progress_yeti": "Тёплый мех", + "advancement.twilightforest.progress_yeti.desc": "Покройте свою одежду мягким мехом из %s, защищая вас от холода ледника", + "advancement.twilightforest.progression_end": "Конец прогресса", + "advancement.twilightforest.progression_end.desc": "Все, что находится дальше этой точки в Высокогорье, является незавершенной работой. Она будет завершена в будущем", + "advancement.twilightforest.quest_ram": "Непревзойдённый", + "advancement.twilightforest.quest_ram.desc": "Дайте %s то, чего ему не хватает", + "advancement.twilightforest.root": "Сумеречный лес", + "advancement.twilightforest.root.desc": "Войдите в таинственный, волшебный лес: Сумеречный лес", + "advancement.twilightforest.troll": "Мы немного троллим", + "advancement.twilightforest.troll.desc": "Найти и убить %s", + "advancement.twilightforest.twilight_dining": "Ужин в вечном закате", + "advancement.twilightforest.twilight_dining.desc": "Съешьте все съедобные предметы, которые есть только в Сумеречном лесу", + "advancement.twilightforest.twilight_hunter": "Лесной убийца", + "advancement.twilightforest.twilight_hunter.desc": "Поохотиться на некоторых представителей местной фауны", + "biome.twilightforest.clearing": "Сумеречная расчистка", + "biome.twilightforest.dark_forest": "Темный лес", + "biome.twilightforest.dark_forest_center": "Центр \"Темный лес", + "biome.twilightforest.dense_forest": "Густой лес", + "biome.twilightforest.dense_mushroom_forest": "Густой грибной лес", + "biome.twilightforest.enchanted_forest": "Заколдованный лес", + "biome.twilightforest.final_plateau": "Финальное плато", + "biome.twilightforest.fire_swamp": "Fire Swamp", + "biome.twilightforest.firefly_forest": "Лес светлячков", + "biome.twilightforest.forest": "Сумеречный лес", + "biome.twilightforest.glacier": "Сумеречный ледник", + "biome.twilightforest.highlands": "Сумеречное нагорье", + "biome.twilightforest.lake": "Сумеречное озеро", + "biome.twilightforest.mushroom_forest": "Грибной лес", + "biome.twilightforest.oak_savannah": "Дубовая саванна", + "biome.twilightforest.snowy_forest": "Заснеженный лес", + "biome.twilightforest.spooky_forest": "Жуткий лес", + "biome.twilightforest.stream": "Сумеречный поток", + "biome.twilightforest.swamp": "Сумеречное болото", + "biome.twilightforest.thornlands": "Торнлендс", + "biome.twilightforest.underground": "Подземный", + "block.minecraft.banner.twilightforest.alpha_yeti.black": "Черное лицо Альфа Йети", + "block.minecraft.banner.twilightforest.alpha_yeti.blue": "Синие лицо Альфа Йети", + "block.minecraft.banner.twilightforest.alpha_yeti.brown": "Коричневое лицо Альфа Йети", + "block.minecraft.banner.twilightforest.alpha_yeti.cyan": "Голубое лицо Альфа Йети", + "block.minecraft.banner.twilightforest.alpha_yeti.gray": "Серое лицо Альфа Йети", + "block.minecraft.banner.twilightforest.alpha_yeti.green": "Зеленое лицо Альфа Йети", + "block.minecraft.banner.twilightforest.alpha_yeti.light_blue": "Светло-голубое лицо Альфа Йети", + "block.minecraft.banner.twilightforest.alpha_yeti.light_gray": "Светло-серое лицо Альфа Йети", + "block.minecraft.banner.twilightforest.alpha_yeti.lime": "Лаймовое лицо Альфа Йети", + "block.minecraft.banner.twilightforest.alpha_yeti.magenta": "Пурпурное лицо Альфа Йети", + "block.minecraft.banner.twilightforest.alpha_yeti.orange": "Оранжевое лицо Альфа Йети", + "block.minecraft.banner.twilightforest.alpha_yeti.pink": "Розовое лицо Альфа Йети", + "block.minecraft.banner.twilightforest.alpha_yeti.purple": "Фиолетовое лицо Альфа Йети", + "block.minecraft.banner.twilightforest.alpha_yeti.red": "Красное лицо Альфа Йети", + "block.minecraft.banner.twilightforest.alpha_yeti.white": "Белое лицо Альфа Йети", + "block.minecraft.banner.twilightforest.alpha_yeti.yellow": "Желтое лицо Альфа Йети", + "block.minecraft.banner.twilightforest.hydra.black": "Черное пламя гидры", + "block.minecraft.banner.twilightforest.hydra.blue": "Синие пламя гидры", + "block.minecraft.banner.twilightforest.hydra.brown": "Коричневое пламя гидры", + "block.minecraft.banner.twilightforest.hydra.cyan": "Голубое пламя гидры", + "block.minecraft.banner.twilightforest.hydra.gray": "Серое пламя гидры", + "block.minecraft.banner.twilightforest.hydra.green": "Зеленое пламя гидры", + "block.minecraft.banner.twilightforest.hydra.light_blue": "Светло-синие пламя гидры", + "block.minecraft.banner.twilightforest.hydra.light_gray": "Светло-серое пламя гидры", + "block.minecraft.banner.twilightforest.hydra.lime": "Лаймовое пламя гидры", + "block.minecraft.banner.twilightforest.hydra.magenta": "Пурпурное пламя гидры", + "block.minecraft.banner.twilightforest.hydra.orange": "Оранжевое пламя гидры", + "block.minecraft.banner.twilightforest.hydra.pink": "Розовое пламя гидры", + "block.minecraft.banner.twilightforest.hydra.purple": "Фиолетовое пламя гидры", + "block.minecraft.banner.twilightforest.hydra.red": "Красное пламя гидры", + "block.minecraft.banner.twilightforest.hydra.white": "Белое пламя гидры", + "block.minecraft.banner.twilightforest.hydra.yellow": "Желтое пламя гидры", + "block.minecraft.banner.twilightforest.knight_phantom.black": "Чёрный рыцарский шлем", + "block.minecraft.banner.twilightforest.knight_phantom.blue": "Синий рыцарский шлем", + "block.minecraft.banner.twilightforest.knight_phantom.brown": "Коричневый рыцарский шлем", + "block.minecraft.banner.twilightforest.knight_phantom.cyan": "Голубой рыцарский шлем", + "block.minecraft.banner.twilightforest.knight_phantom.gray": "Серый рыцарский шлем", + "block.minecraft.banner.twilightforest.knight_phantom.green": "Зеленый рыцарский шлем", + "block.minecraft.banner.twilightforest.knight_phantom.light_blue": "Светло-синий рыцарский шлем", + "block.minecraft.banner.twilightforest.knight_phantom.light_gray": "Светло-серый рыцарский шлем", + "block.minecraft.banner.twilightforest.knight_phantom.lime": "Лаймовый рыцарский шлем", + "block.minecraft.banner.twilightforest.knight_phantom.magenta": "Пурпурный рыцарский шлем", + "block.minecraft.banner.twilightforest.knight_phantom.orange": "Оранжевый рыцарский шлем", + "block.minecraft.banner.twilightforest.knight_phantom.pink": "Розовый рыцарский шлем", + "block.minecraft.banner.twilightforest.knight_phantom.purple": "Фиолетовый рыцарский шлем", + "block.minecraft.banner.twilightforest.knight_phantom.red": "Красный рыцарский шлем", + "block.minecraft.banner.twilightforest.knight_phantom.white": "Белый рыцарский шлем", + "block.minecraft.banner.twilightforest.knight_phantom.yellow": "Желтый рыцарский шлем", + "block.minecraft.banner.twilightforest.lich.black": "Черная корона лича", + "block.minecraft.banner.twilightforest.lich.blue": "Синяя корона лича", + "block.minecraft.banner.twilightforest.lich.brown": "Коричневая корона лича", + "block.minecraft.banner.twilightforest.lich.cyan": "Голубая корона лича", + "block.minecraft.banner.twilightforest.lich.gray": "Серая корона лича", + "block.minecraft.banner.twilightforest.lich.green": "Зеленая корона лича", + "block.minecraft.banner.twilightforest.lich.light_blue": "Светло-синяя корона лича", + "block.minecraft.banner.twilightforest.lich.light_gray": "Светло-серая корона лича", + "block.minecraft.banner.twilightforest.lich.lime": "Лаймовая корона лича", + "block.minecraft.banner.twilightforest.lich.magenta": "Пурпурная корона лича", + "block.minecraft.banner.twilightforest.lich.orange": "Оранжевая корона лича", + "block.minecraft.banner.twilightforest.lich.pink": "Розовая корона лича", + "block.minecraft.banner.twilightforest.lich.purple": "Фиолетовая корона лича", + "block.minecraft.banner.twilightforest.lich.red": "Красная корона лича", + "block.minecraft.banner.twilightforest.lich.white": "Белая корона лича", + "block.minecraft.banner.twilightforest.lich.yellow": "Желтая корона лича", + "block.minecraft.banner.twilightforest.minoshroom.black": "Черные миношрумовые топоры", + "block.minecraft.banner.twilightforest.minoshroom.blue": "Синие миношрумовые топоры", + "block.minecraft.banner.twilightforest.minoshroom.brown": "Коричневые миношрумовые топоры", + "block.minecraft.banner.twilightforest.minoshroom.cyan": "Голубые миношрумовые топоры", + "block.minecraft.banner.twilightforest.minoshroom.gray": "Серые миношрумовые топоры", + "block.minecraft.banner.twilightforest.minoshroom.green": "Зеленые миношрумовые топоры", + "block.minecraft.banner.twilightforest.minoshroom.light_blue": "Светло-синие миношрумовые топоры", + "block.minecraft.banner.twilightforest.minoshroom.light_gray": "Светло-серые миношрумовые топоры", + "block.minecraft.banner.twilightforest.minoshroom.lime": "Лаймовые миношрумовые топоры", + "block.minecraft.banner.twilightforest.minoshroom.magenta": "Пурпурные миношрумовые топоры", + "block.minecraft.banner.twilightforest.minoshroom.orange": "Оранжевые миношрумовые топоры", + "block.minecraft.banner.twilightforest.minoshroom.pink": "Розовые миношрумовые топоры", + "block.minecraft.banner.twilightforest.minoshroom.purple": "Фиолетовые миношрумовые топоры", + "block.minecraft.banner.twilightforest.minoshroom.red": "Красные миношрумовые топоры", + "block.minecraft.banner.twilightforest.minoshroom.white": "Белые миношрумовые топоры", + "block.minecraft.banner.twilightforest.minoshroom.yellow": "Желтые миношрумовые топоры", + "block.minecraft.banner.twilightforest.naga.black": "Черная чешуя наги", + "block.minecraft.banner.twilightforest.naga.blue": "Синяя чешуя наги", + "block.minecraft.banner.twilightforest.naga.brown": "Коричневая чешуя наги", + "block.minecraft.banner.twilightforest.naga.cyan": "Голубая чешуя наги", + "block.minecraft.banner.twilightforest.naga.gray": "Серая чешуя наги", + "block.minecraft.banner.twilightforest.naga.green": "Зеленая чешуя наги", + "block.minecraft.banner.twilightforest.naga.light_blue": "Светло-синяя чешуя наги", + "block.minecraft.banner.twilightforest.naga.light_gray": "Светло-серая чешуя наги", + "block.minecraft.banner.twilightforest.naga.lime": "Лаймовая чешуя наги", + "block.minecraft.banner.twilightforest.naga.red": "Красная чешуя наги", + "block.minecraft.banner.twilightforest.naga.white": "Белая чешуя наги", + "block.minecraft.banner.twilightforest.ur_ghast.pink": "Розовый карминный бордюр", + "block.minecraft.banner.twilightforest.ur_ghast.purple": "Фиолетовый карминный бордюр", + "block.minecraft.banner.twilightforest.ur_ghast.red": "Красный карминный бордюр", + "block.minecraft.banner.twilightforest.ur_ghast.white": "Белый карминный бордюр", + "block.minecraft.banner.twilightforest.ur_ghast.yellow": "Желтый карминный бордюр", + "block.twilightforest.acacia_banister": "Перила из акации", + "block.twilightforest.alpha_yeti_boss_spawner": "Спавнер босса Альфа Йети", + "block.twilightforest.alpha_yeti_trophy": "Трофей Альфа Йети", + "block.twilightforest.antibuilder": "Антистроитель", + "block.twilightforest.antibuilt_block": "Анти строительный блок", + "block.twilightforest.arctic_fur_block": "Блок арктического меха", + "block.twilightforest.arctic_fur_block.desc": "Снижает урон от падения на 90%", + "block.twilightforest.aurora_block": "Блок Авроры", + "block.twilightforest.aurora_pillar": "Колонна Авроры", + "block.twilightforest.aurora_slab": "Плита Авроры", + "block.twilightforest.auroralized_glass": "Авроризованное стекло", + "block.twilightforest.banister.cycle": "Щелкните правой кнопкой мыши с топором для цикла", + "block.twilightforest.beanstalk_leaves": "Бобовые листья", + "block.twilightforest.birch_banister": "Березовые перила", + "block.twilightforest.blue_castle_door": "Синяя дверь замка", + "block.twilightforest.blue_castle_rune_brick": "Синий кирпич замка", + "block.twilightforest.blue_force_field": "Синее силовое поле", + "block.twilightforest.bold_castle_brick_pillar": "Рельефная колонна кирпича замка", + "block.twilightforest.bold_castle_brick_stairs": "Рельефные ступеньки кирпича замка", + "block.twilightforest.bold_castle_brick_tile": "Полированная замковая кирпичная плитка", + "block.twilightforest.bold_stone_pillar": "Полированный каменный столб", + "block.twilightforest.brown_thorns": "Шипы", + "block.twilightforest.built_block": "Построенный блок", + "block.twilightforest.burnt_thorns": "Истлевшие шипы", + "block.twilightforest.candelabra": "Канделябр", + "block.twilightforest.canopy_banister": "Навесные перила", + "block.twilightforest.canopy_bookshelf": "Навесная книжная полка", + "block.twilightforest.canopy_button": "Сосновая кнопка", + "block.twilightforest.canopy_chest": "Навесной сундук", + "block.twilightforest.canopy_door": "Сосновая дверь", + "block.twilightforest.canopy_fence": "Сосновый забор", + "block.twilightforest.canopy_fence_gate": "Сосновая калитка", + "block.twilightforest.canopy_leaves": "Листва сумеречной сосны", + "block.twilightforest.canopy_log": "Бревно навесного дерева", + "block.twilightforest.canopy_planks": "Сосновые доски", + "block.twilightforest.canopy_pressure_plate": "Сосновая нажимная плита", + "block.twilightforest.canopy_sapling": "Саженец сумеречной сосны", + "block.twilightforest.canopy_sign": "Навесная табличка", + "block.twilightforest.canopy_slab": "Сосновая плитка", + "block.twilightforest.canopy_stairs": "Сосновые ступеньки", + "block.twilightforest.canopy_trapdoor": "Сосновый люк", + "block.twilightforest.canopy_wall_sign": "Навесная настенная табличка", + "block.twilightforest.canopy_wood": "Сумеречная сосна", + "block.twilightforest.carminite_block": "Блок карминита", + "block.twilightforest.carminite_builder": "Строитель башни", + "block.twilightforest.carminite_reactor": "Карминитовый реактор", + "block.twilightforest.casket.broken": "Ваш ларец для хранения был слишком поврежден, чтобы вместить еще какие-либо предметы. Все предметы, которые должны были храниться в вашем ларце были сброшены на землю.", + "block.twilightforest.casket.locked": "Этот ларец может открыть только %s!", + "block.twilightforest.castle_brick": "Кирпич замка", + "block.twilightforest.castle_brick_stairs": "Ступени из кирпича замка", + "block.twilightforest.castle_roof_tile": "Замковая крыша", + "block.twilightforest.cicada": "Цикада", + "block.twilightforest.cicada_jar": "Банка цикады", + "block.twilightforest.cinder_furnace": "Шлаковая печь", + "block.twilightforest.cinder_log": "Шлак древесины", + "block.twilightforest.cinder_wood": "Шлаковое дерево", + "block.twilightforest.clover_patch": "Лист клевера", + "block.twilightforest.cracked_castle_brick": "Повреждённый кирпич замка", + "block.twilightforest.cracked_castle_brick_stairs": "Ступени из потресканного кирпича замка", + "block.twilightforest.cracked_deadrock": "Повреждённый камень смерти", + "block.twilightforest.cracked_etched_nagastone": "Разрушенный гравированный нагакамень", + "block.twilightforest.cracked_mazestone": "Потресканая лабиринтовая кладка", + "block.twilightforest.cracked_nagastone_pillar": "Разрушенная колонна из нагакамня", + "block.twilightforest.cracked_nagastone_stairs_left": "Разрушенные ступеньки из нагакамня (левые)", + "block.twilightforest.cracked_nagastone_stairs_right": "Разрушенные ступеньки из нагакамня (правые)", + "block.twilightforest.cracked_towerwood": "Повреждённые доски тёмной башни", + "block.twilightforest.cracked_underbrick": "Повреждённые подземные кирпичи", + "block.twilightforest.creeper_skull_candle": "Свеча из \"Головы крипера\"", + "block.twilightforest.creeper_wall_skull_candle": "Настенная свеча из \"Головы крипера\"", + "block.twilightforest.crimson_banister": "Малиновые перила", + "block.twilightforest.cut_mazestone": "Гладкая лабиринтовая кладка", + "block.twilightforest.dark_banister": "Перила из темного дерева", + "block.twilightforest.dark_button": "Тёмная кнопка", + "block.twilightforest.dark_chest": "Сундук из темного дерева", + "block.twilightforest.dark_door": "Дверь из темного дерева", + "block.twilightforest.dark_fence": "Тёмный забор", + "block.twilightforest.dark_fence_gate": "Тёмная калитка", + "block.twilightforest.dark_leaves": "Листва тёмного дерева", + "block.twilightforest.dark_log": "Бревно тёмного дерева", + "block.twilightforest.dark_oak_banister": "Перила из темного дуба", + "block.twilightforest.dark_planks": "Тёмные доски", + "block.twilightforest.dark_pressure_plate": "Тёмная нажимная плита", + "block.twilightforest.dark_sign": "Табличка из темного дерева", + "block.twilightforest.dark_slab": "Тёмная плита", + "block.twilightforest.dark_stairs": "Тёмные ступеньки", + "block.twilightforest.dark_trapdoor": "Тёмный люк", + "block.twilightforest.dark_wall_sign": "Настенная таблика из темного дерева", + "block.twilightforest.dark_wood": "Древесина темного дуба", + "block.twilightforest.darkwood_sapling": "Саженец тёмного дерева", + "block.twilightforest.deadrock": "Камень смерти", + "block.twilightforest.death_tome_spawner": "Спавнер Тома смерти", + "block.twilightforest.decorative_mazestone": "Декоративная лабиринтовая кладка", + "block.twilightforest.empty_canopy_bookshelf": "Пустая навесная книжная полка", + "block.twilightforest.encased_castle_brick_pillar": "Облицованная колонна кирпича замка", + "block.twilightforest.encased_castle_brick_stairs": "Облицованные ступеньки кирпича замка", + "block.twilightforest.encased_castle_brick_tile": "Облицованная плитка кирпича замка", + "block.twilightforest.encased_fire_jet": "Заключённый огонёк", + "block.twilightforest.encased_smoker": "Прирученный дымок", + "block.twilightforest.encased_towerwood": "Обшитые доски из древесины тёмной башни", + "block.twilightforest.etched_nagastone": "Гравированный нагакамень", + "block.twilightforest.experiment_115": "Эксперимент 115", + "block.twilightforest.fake_diamond": "Алмазный блок", + "block.twilightforest.fake_gold": "Золотой блок", + "block.twilightforest.fallen_leaves": "Падшие листья", + "block.twilightforest.fiddlehead": "Майское яблоко", + "block.twilightforest.fiery_block": "Блок огненного металла", + "block.twilightforest.final_boss_boss_spawner": "Спавнер Финального босса", + "block.twilightforest.fire_jet": "Огненный блок", + "block.twilightforest.firefly": "Светлячок", + "block.twilightforest.firefly_jar": "Банка со светлячком", + "block.twilightforest.firefly_particle_spawner": "Спавнер частиц светлячка", + "block.twilightforest.fluffy_cloud": "Взбитое облако", + "block.twilightforest.ghast_trap": "Ловушка для гаста", + "block.twilightforest.giant_cobblestone": "Гигантский булыжник", + "block.twilightforest.giant_leaves": "Гигантские листья", + "block.twilightforest.giant_log": "Гигантское дерево", + "block.twilightforest.giant_obsidian": "Гигантский обсидиан", + "block.twilightforest.green_force_field": "Зеленое силовое поле", + "block.twilightforest.green_thorns": "Зеленые шипы", + "block.twilightforest.hardened_dark_leaves": "Густые листья темного дерева", + "block.twilightforest.hedge": "Живая изгородь", + "block.twilightforest.hollow_oak_sapling": "Саженец большого сумеречного дуба", + "block.twilightforest.hollow_warped_stem_vertical": "Полый деформированный стебель", + "block.twilightforest.huge_lily_pad": "Огромные лилии", + "block.twilightforest.huge_mushgloom": "Огромный грибной блок", + "block.twilightforest.huge_mushgloom_stem": "Ножка огромного гриба", + "block.twilightforest.huge_stalk": "Огромный стебель", + "block.twilightforest.huge_water_lily": "Огромная кувшинка", + "block.twilightforest.hydra_boss_spawner": "Спавнер Босса Гидры", + "block.twilightforest.hydra_trophy": "Трофей Гидры", + "block.twilightforest.infested_towerwood": "Зараженные доски тёмной башни", + "block.twilightforest.iron_ladder": "Железная лестница", + "block.twilightforest.ironwood_block": "Блок железной древесины", + "block.twilightforest.jungle_banister": "Перила джунглей", + "block.twilightforest.keepsake_casket": "Шкатулка на память", + "block.twilightforest.knight_phantom_trophy": "Трофей Фантомного рыцаря", + "block.twilightforest.knightmetal_block": "Блок королевского металла", + "block.twilightforest.lich_tower_miniature_structure": "Миниатюра: Башня Лича", + "block.twilightforest.lich_trophy": "Трофей Лича", + "block.twilightforest.liveroot_block": "Замшелые корни", + "block.twilightforest.locked_vanishing_block": "Заблокированный восстанавливающийся блок", + "block.twilightforest.mangrove_button": "Кнопка из сумеречной берёзы", + "block.twilightforest.mangrove_fence": "Забор из сумеречной берёзы", + "block.twilightforest.mangrove_fence_gate": "Калитка из сумеречной берёзы", + "block.twilightforest.mangrove_leaves": "Листва сумеречной берёзы", + "block.twilightforest.mangrove_log": "Мангровое дерево", + "block.twilightforest.mangrove_planks": "Доски из сумеречной берёзы", + "block.twilightforest.mangrove_pressure_plate": "Нажимная плита из сумеречной берёзы", + "block.twilightforest.mangrove_sapling": "Саженец сумеречной берёзы", + "block.twilightforest.mangrove_slab": "Плита из сумеречной берёзы", + "block.twilightforest.mangrove_stairs": "Ступеньки из сумеречной берёзы", + "block.twilightforest.mangrove_trapdoor": "Люк из сумеречной берёзы", + "block.twilightforest.mangrove_wood": "Сумеречная берёза", + "block.twilightforest.mayapple": "Майское яблоко", + "block.twilightforest.mazestone": "Камень лабиринта", + "block.twilightforest.mazestone_border": "Двойная узорчатая лабиринтовая кладка", + "block.twilightforest.mazestone_brick": "Кладка из камня лабиринта", + "block.twilightforest.mazestone_mosaic": "Узорчатая лабиринтовая кладка", + "block.twilightforest.mining_button": "Кнопка из дерева шахтёра", + "block.twilightforest.mining_door": "Дверь из дерева шахтёра", + "block.twilightforest.mining_fence": "Забор из дерева шахтёра", + "block.twilightforest.mining_fence_gate": "Калитка из дерева шахтёра", + "block.twilightforest.mining_leaves": "Листва шахтёра", + "block.twilightforest.mining_log": "Бревно дерева шахтёра", + "block.twilightforest.mining_log_core": "Ядро дерева шахтёра", + "block.twilightforest.mining_planks": "Доски из дерева шахтёра", + "block.twilightforest.mining_pressure_plate": "Нажимная плита из дерева шахтёра", + "block.twilightforest.mining_sapling": "Саженец дерева шахтёра", + "block.twilightforest.mining_slab": "Плита из дерева шахтёра", + "block.twilightforest.mining_stairs": "Ступеньки из дерева шахтёра", + "block.twilightforest.mining_trapdoor": "Люк из дерева шахтёра", + "block.twilightforest.minoshroom_trophy": "Трофей гриботавра", + "block.twilightforest.moonworm": "Гусеница", + "block.twilightforest.moss_patch": "Клочок мха", + "block.twilightforest.mossy_castle_brick": "Замшелый кирпич замка", + "block.twilightforest.mossy_castle_brick_stairs": "Ступени из замшелого кирпича замка", + "block.twilightforest.mossy_etched_nagastone": "Замшелый гравированный нагакамень", + "block.twilightforest.mossy_mazestone": "Замшелая лабиринтовая кладка", + "block.twilightforest.mossy_nagastone_pillar": "Замшелая колонна из нагакамня", + "block.twilightforest.mossy_nagastone_stairs_left": "Замшелые ступеньки из нагакамня (левая)", + "block.twilightforest.mossy_nagastone_stairs_right": "Замшелые ступеньки из нагакамня (правая)", + "block.twilightforest.mossy_underbrick": "Замшелые подземные кирпичи", + "block.twilightforest.mushgloom": "Светогриб", + "block.twilightforest.naga_courtyard_miniature_structure": "Миниатюра: Двор Наги", + "block.twilightforest.naga_trophy": "Трофей Наги", + "block.twilightforest.nagastone": "Нагакамень", + "block.twilightforest.nagastone_head": "Голова нагакамня", + "block.twilightforest.nagastone_pillar": "Колонна из нагакамня", + "block.twilightforest.nagastone_stairs_left": "Ступеньки из нагакамня (левая)", + "block.twilightforest.nagastone_stairs_right": "Ступеньки из нагакамня (правая)", + "block.twilightforest.orange_force_field": "Оранжевое силовое поле", + "block.twilightforest.quest_ram_trophy": "Трофей квестового Рама", + "block.twilightforest.rainbow_oak_leaves": "Разноцветная листва", + "block.twilightforest.rainbow_oak_sapling": "Саженец разноцветного дерева", + "block.twilightforest.reappearing_block": "Восстанавливающийся блок", + "block.twilightforest.root": "Корни", + "block.twilightforest.root_strand": "Висячие корни", + "block.twilightforest.slider": "Скользящая ловушка", + "block.twilightforest.smoker": "Дымовой блок", + "block.twilightforest.snow_queen_trophy": "Трофей Снежной королевы", + "block.twilightforest.sorting_button": "Кнопка из правильного дерева", + "block.twilightforest.sorting_door": "Дверь из правильного дерева", + "block.twilightforest.sorting_fence": "Забор из правильного дерева", + "block.twilightforest.sorting_fence_gate": "Калитка из правильного дерева", + "block.twilightforest.sorting_leaves": "Листва сортировки", + "block.twilightforest.sorting_log": "Бревно правильного дерева", + "block.twilightforest.sorting_log_core": "Ядро дерева сортировки", + "block.twilightforest.sorting_planks": "Доски из правильного дерева", + "block.twilightforest.sorting_pressure_plate": "Нажимная плита из правильного дерева", + "block.twilightforest.sorting_sapling": "Саженец сортировочного дерева", + "block.twilightforest.sorting_slab": "Плита из правильного дерева", + "block.twilightforest.sorting_stairs": "Ступеньки из правильного дерева", + "block.twilightforest.sorting_trapdoor": "Люк из правильного дерева", + "block.twilightforest.spiral_bricks": "Спиральные каменные кирпичи", + "block.twilightforest.steeleaf_block": "Блок стального листа", + "block.twilightforest.stronghold_shield": "Крепкий щит", + "block.twilightforest.thick_castle_brick": "Толстый кирпич замка", + "block.twilightforest.thorn_leaves": "Шиповые листья", + "block.twilightforest.thorn_rose": "Шипастая роза", + "block.twilightforest.time_button": "Кнопка из дерева времени", + "block.twilightforest.time_door": "Дверь из дерева времени", + "block.twilightforest.time_fence": "Забор из дерева времени", + "block.twilightforest.time_fence_gate": "Калитка из дерева времени", + "block.twilightforest.time_leaves": "Листва дерева времени", + "block.twilightforest.time_log": "Бревно дерева времени", + "block.twilightforest.time_log_core": "Дерево времени", + "block.twilightforest.time_planks": "Доски из дерева времени", + "block.twilightforest.time_pressure_plate": "Нажимная плита из дерева времени", + "block.twilightforest.time_sapling": "Саженец дерева времени", + "block.twilightforest.time_slab": "Плита из дерева времени", + "block.twilightforest.time_stairs": "Ступеньки из дерева времени", + "block.twilightforest.time_trapdoor": "Люк из дерева времени", + "block.twilightforest.torchberry_plant": "Факелонтовый росток", + "block.twilightforest.towerwood": "Доски тёмной башни", + "block.twilightforest.transformation_button": "Кнопка из загадочного дерева", + "block.twilightforest.transformation_door": "Дверь из загадочного дерева", + "block.twilightforest.transformation_fence": "Забор из загадочного дерева", + "block.twilightforest.transformation_fence_gate": "Калитка из загадочного дерева", + "block.twilightforest.transformation_leaves": "Листва дерева мудрости", + "block.twilightforest.transformation_log": "Бревно загадочного дерева", + "block.twilightforest.transformation_log_core": "Дерево мудрости", + "block.twilightforest.transformation_planks": "Доски из загадочного дерева", + "block.twilightforest.transformation_pressure_plate": "Нажимная плита из загадочного дерева", + "block.twilightforest.transformation_sapling": "Саженец дерева преобразования", + "block.twilightforest.transformation_slab": "Плита из загадочного дерева", + "block.twilightforest.transformation_stairs": "Ступеньки из загадочного дерева", + "block.twilightforest.transformation_trapdoor": "Люк из загадочного дерева", + "block.twilightforest.trollber": "Тролльбер", + "block.twilightforest.trollsteinn": "Тролльштейн", + "block.twilightforest.trollvidr": "Тролловидр", + "block.twilightforest.trophy_pedestal": "Трофейный пьедестал", + "block.twilightforest.twilight_oak_button": "Кнопка из сумеречного дуба", + "block.twilightforest.twilight_oak_door": "Дверь из сумеречного дуба", + "block.twilightforest.twilight_oak_fence": "Забор из сумеречного дуба", + "block.twilightforest.twilight_oak_fence_gate": "Калитка из сумеречного дуба", + "block.twilightforest.twilight_oak_leaves": "Листва сумеречного дуба", + "block.twilightforest.twilight_oak_log": "Бревно сумеречного дуба", + "block.twilightforest.twilight_oak_planks": "Доски из сумеречного дуба", + "block.twilightforest.twilight_oak_pressure_plate": "Нажимная плита из сумеречного дуба", + "block.twilightforest.twilight_oak_sapling": "Саженец сумеречного дуба", + "block.twilightforest.twilight_oak_slab": "Плита из сумеречного дуба", + "block.twilightforest.twilight_oak_stairs": "Ступеньки из сумеречного дуба", + "block.twilightforest.twilight_oak_trapdoor": "Люк из сумеречного дуба", + "block.twilightforest.twilight_oak_wood": "Сумеречный дуб", + "block.twilightforest.twilight_portal": "Портал в сумеречный лес", + "block.twilightforest.twisted_stone": "Каменная спираль", + "block.twilightforest.uberous_soil": "Анбеоновая почва", + "block.twilightforest.uncrafting_table": "Разборочный верстак", + "block.twilightforest.underbrick": "Подземные кирпичи", + "block.twilightforest.underbrick_floor": "Подземный пол", + "block.twilightforest.unripe_trollber": "Спелый тролльбер", + "block.twilightforest.ur_ghast_trophy": "Трофей Ур-Гаста", + "block.twilightforest.vanishing_block": "Исчезающий блок", + "block.twilightforest.violet_castle_door": "Фиолетовая дверь замка", + "block.twilightforest.violet_castle_rune_brick": "Фиолетовый кирпич замка", + "block.twilightforest.violet_force_field": "Фиолетовое силовое поле", + "block.twilightforest.weathered_deadrock": "Влажный камень смерти", + "block.twilightforest.wispy_cloud": "Прозрачное облако", + "block.twilightforest.worn_castle_brick": "Изношенный кирпич замка", + "block.twilightforest.worn_castle_brick_stairs": "Ступени из изношенного кирпича замка", + "block.twilightforest.yellow_castle_door": "Жёлтая дверь замка", + "block.twilightforest.yellow_castle_rune_brick": "Жёлтый кирпич замка", + "commands.tffeature.center": "Цетр объекта: %s", + "commands.tffeature.chunk": "Объект в чанке: %s", + "commands.tffeature.nearest": "Ближайшии объект это %s", + "commands.tffeature.not_in_twilight_forest": "Вы находитесь вне Сумеречного Леса", + "commands.tffeature.structure.conquer.update": "Structure conquer flag was %s, меняется на %s", + "commands.tffeature.structure.required": "Вы не в строении.", + "effect.twilightforest.frosted": "Обморожение", + "enchantment.twilightforest.chill_aura": "Морозная аура", + "enchantment.twilightforest.fire_react": "Аура огня", + "entity.twilightforest.alpha_yeti": "Альфа-йети", + "entity.twilightforest.armored_giant": "Бронированный гигант", + "entity.twilightforest.bighorn_sheep": "Снежный баран", + "entity.twilightforest.blockchain_goblin": "Гоблин-рыцарь с булавой", + "entity.twilightforest.carminite_broodling": "Карминитовый паук", + "entity.twilightforest.carminite_ghastguard": "Карминитовый гаст-охранник", + "entity.twilightforest.carminite_ghastling": "Детёныш карминитового гаста", + "entity.twilightforest.carminite_golem": "Карминитовый голем", + "entity.twilightforest.death_tome": "Том смерти", + "entity.twilightforest.dwarf_rabbit": "Заяц", + "entity.twilightforest.fire_beetle": "Огненный жук", + "entity.twilightforest.giant_miner": "Гигант-шахтёр", + "entity.twilightforest.hedge_spider": "Зелёный паук", + "entity.twilightforest.helmet_crab": "Шлемовый краб", + "entity.twilightforest.hostile_wolf": "Злой волк", + "entity.twilightforest.hydra": "Гидра", + "entity.twilightforest.ice_crystal": "Ледяной кристалл", + "entity.twilightforest.king_spider": "Королевский паук", + "entity.twilightforest.knight_phantom": "Призрак рыцаря", + "entity.twilightforest.kobold": "Кобольд", + "entity.twilightforest.lich_minion": "Приспешник лича", + "entity.twilightforest.lower_goblin_knight": "Гоблин-мечник", + "entity.twilightforest.loyal_zombie": "Верный зомби", + "entity.twilightforest.maze_slime": "Слизень лабиринта", + "entity.twilightforest.minoshroom": "Гриботавр", + "entity.twilightforest.minotaur": "Минотавр", + "entity.twilightforest.mist_wolf": "Туманный волк", + "entity.twilightforest.mosquito_swarm": "Москитный рой", + "entity.twilightforest.naga": "Нага", + "entity.twilightforest.penguin": "Пингвин", + "entity.twilightforest.pinch_beetle": "Жук-рогач", + "entity.twilightforest.quest_ram": "Баран Рам", + "entity.twilightforest.redcap_sapper": "Красный колпак-подрывник", + "entity.twilightforest.skeleton_druid": "Скелет-друид", + "entity.twilightforest.slime_beetle": "Слизневый жук", + "entity.twilightforest.snow_guardian": "Снежный страж", + "entity.twilightforest.snow_queen": "Снежная королева", + "entity.twilightforest.stable_ice_core": "Стабильное ледяное ядро", + "entity.twilightforest.swarm_spider": "Маленький паук", + "entity.twilightforest.tiny_bird": "Маленькая птица", + "entity.twilightforest.towerwood_borer": "Термит", + "entity.twilightforest.unstable_ice_core": "Нестабильное ледяное ядро", + "entity.twilightforest.upper_goblin_knight": "Гоблин-копейщик", + "entity.twilightforest.ur_ghast": "Ур-гаст", + "entity.twilightforest.winter_wolf": "Зимний волк", + "entity.twilightforest.yeti": "Йети", + "item.twilightforest.alpha_yeti_fur": "Мех Альфа-йети", + "item.twilightforest.alpha_yeti_spawn_egg": "Яйцо призыва Альфа-Йети", + "item.twilightforest.arctic_boots": "Меховые ботинки", + "item.twilightforest.arctic_chestplate": "Меховая куртка", + "item.twilightforest.arctic_fur": "Арктический мех", + "item.twilightforest.arctic_helmet": "Меховой капюшон", + "item.twilightforest.arctic_leggings": "Меховые штаны", + "item.twilightforest.armor_shard": "Осколок рыцарского металла", + "item.twilightforest.armor_shard_cluster": "Осколки рыцарского металла", + "item.twilightforest.armored_giant_spawn_egg": "Яйцо призыва бронированного гиганта", + "item.twilightforest.bighorn_sheep_spawn_egg": "Яйцо призыва барана", + "item.twilightforest.block_and_chain": "Блок цепей", + "item.twilightforest.blockchain_goblin_spawn_egg": "Яйцо призыва гоблина с моргенштерном", + "item.twilightforest.borer_essence": "Буровая эссенция", + "item.twilightforest.carminite": "Карминит", + "item.twilightforest.carminite_broodling_spawn_egg": "Яйцо призыва карминитового выводка", + "item.twilightforest.carminite_ghastguard_spawn_egg": "Яйцо призыва карминитового гаста", + "item.twilightforest.carminite_ghastling_spawn_egg": "Яйцо призыва карминитового мини-гаста", + "item.twilightforest.carminite_golem_spawn_egg": "Яйцо призыва карминитового голема", + "item.twilightforest.charm_of_keeping_1": "Амулет инвентаря I", + "item.twilightforest.charm_of_keeping_2": "Амулет инвентаря II", + "item.twilightforest.charm_of_keeping_3": "Амулет инвентаря III", + "item.twilightforest.charm_of_life_1": "Амулет жизни I", + "item.twilightforest.charm_of_life_2": "Амулет жизни II", + "item.twilightforest.cooked_meef": "Стейк из минотавра", + "item.twilightforest.cooked_venison": "Олений стейк", + "item.twilightforest.crumble_horn": "Рог", + "item.twilightforest.cube_of_annihilation": "Куб аннигиляции", + "item.twilightforest.cube_talisman": "Талисман куба", + "item.twilightforest.death_tome_spawn_egg": "Яйцо призыва книги смерти", + "item.twilightforest.diamond_minotaur_axe": "Алмазный топор минотавра", + "item.twilightforest.dwarf_rabbit_spawn_egg": "Яйцо призыва лесного кролика", + "item.twilightforest.ender_bow": "Эндер-лук", + "item.twilightforest.fiery_blood": "Огненная кровь", + "item.twilightforest.fiery_boots": "Огненные ботинки", + "item.twilightforest.fiery_chestplate": "Огненный нагрудник", + "item.twilightforest.fiery_helmet": "Огненный шлем", + "item.twilightforest.fiery_ingot": "Огненный слиток", + "item.twilightforest.fiery_leggings": "Огненные поножи", + "item.twilightforest.fiery_pickaxe": "Огненная кирка", + "item.twilightforest.fiery_sword": "Огненный меч", + "item.twilightforest.fiery_tears": "Огненные слёзы", + "item.twilightforest.filled_magic_map": "Магическая карта", + "item.twilightforest.filled_maze_map": "Карта лабиринта", + "item.twilightforest.filled_ore_map": "Карта шахты", + "item.twilightforest.fire_beetle_spawn_egg": "Яйцо призыва огненного жука", + "item.twilightforest.fortification_scepter": "Посох отражения", + "item.twilightforest.giant_miner_spawn_egg": "Яйцо призыва гигантского шахтёра", + "item.twilightforest.giant_pickaxe": "Гигантская кирка", + "item.twilightforest.giant_sword": "Гигантский меч", + "item.twilightforest.glass_sword": "Стеклянный меч", + "item.twilightforest.gold_minotaur_axe": "Золотой топор минотавра", + "item.twilightforest.hedge_spider_spawn_egg": "Яйцо призыва паука Хеджа", + "item.twilightforest.helmet_crab_spawn_egg": "Яйцо призыва бронированного краба", + "item.twilightforest.hostile_wolf_spawn_egg": "Яйцо призыва голодного волка", + "item.twilightforest.hydra_chop": "Мясо гидры", + "item.twilightforest.hydra_spawn_egg": "Яйцо призыва Гидры", + "item.twilightforest.ice_bomb": "Ледяная бомба", + "item.twilightforest.ice_bow": "Ледяной лук", + "item.twilightforest.ice_crystal_spawn_egg": "Яйцо призыва ледяного кристалла", + "item.twilightforest.ice_sword": "Ледяной меч", + "item.twilightforest.ironwood_axe": "Топор из железного дерева", + "item.twilightforest.ironwood_boots": "Ботинки из железного дерева", + "item.twilightforest.ironwood_chestplate": "Нагрудник из железного дерева", + "item.twilightforest.ironwood_helmet": "Шлем из железного дерева", + "item.twilightforest.ironwood_hoe": "Мотыга из железного дерева", + "item.twilightforest.ironwood_ingot": "Слиток железного дерева", + "item.twilightforest.ironwood_leggings": "Поножи из железного дерева", + "item.twilightforest.ironwood_pickaxe": "Кирка из железного дерева", + "item.twilightforest.ironwood_shovel": "Лопата из железного дерева", + "item.twilightforest.ironwood_sword": "Меч из железного дерева", + "item.twilightforest.king_spider_spawn_egg": "Яйцо призыва королевского паука", + "item.twilightforest.knight_phantom_spawn_egg": "Яйцо призыва рыцаря-фантома", + "item.twilightforest.knightmetal_axe": "Рыцарский топор", + "item.twilightforest.knightmetal_boots": "Рыцарские ботинки", + "item.twilightforest.knightmetal_chestplate": "Рыцарский нагрудник", + "item.twilightforest.knightmetal_helmet": "Рыцарский шлем", + "item.twilightforest.knightmetal_ingot": "Слиток рыцарского металла", + "item.twilightforest.knightmetal_leggings": "Рыцарские поножи", + "item.twilightforest.knightmetal_pickaxe": "Рыцарская кирка", + "item.twilightforest.knightmetal_ring": "Петля королевского металла", + "item.twilightforest.knightmetal_shield": "Рыцарский щит", + "item.twilightforest.knightmetal_sword": "Рыцарский меч", + "item.twilightforest.kobold_spawn_egg": "Яйцо призыва кобольда", + "item.twilightforest.lamp_of_cinders": "Лампа огня", + "item.twilightforest.lifedrain_scepter": "Посох поглощения жизни", + "item.twilightforest.liveroot": "Замшелый корень", + "item.twilightforest.lower_goblin_knight_spawn_egg": "Яйцо призыва гоблина-рыцаря", + "item.twilightforest.magic_beans": "Волшебные бобы", + "item.twilightforest.magic_map": "Пустая магическая карта", + "item.twilightforest.magic_map_focus": "Фокус магической карты", + "item.twilightforest.maze_map": "Пустая карта лабиринта", + "item.twilightforest.maze_map_focus": "Фокус карты лабиринта", + "item.twilightforest.maze_slime_spawn_egg": "Яйцо призыва слизня лабиринта", + "item.twilightforest.maze_wafer": "Вафли", + "item.twilightforest.mazebreaker_pickaxe": "Разрушитель лабиринтов", + "item.twilightforest.meef_stroganoff": "Суп из минотавра", + "item.twilightforest.minoshroom_spawn_egg": "Яйцо призыва гриботавра", + "item.twilightforest.minotaur_spawn_egg": "Яйцо призыва минотавра", + "item.twilightforest.mist_wolf_spawn_egg": "Яйцо призыва загадочного волка", + "item.twilightforest.moon_dial": "Лунный циферблат", + "item.twilightforest.moonworm_queen": "Королева гусениц", + "item.twilightforest.mosquito_swarm_spawn_egg": "Яйцо призыва роя москитов", + "item.twilightforest.naga_banner_pattern.desc": "Чешуя наги", + "item.twilightforest.naga_chestplate": "Нагрудник из чешуи наги", + "item.twilightforest.naga_leggings": "Поножи из чешуи наги", + "item.twilightforest.naga_scale": "Чешуя наги", + "item.twilightforest.naga_spawn_egg": "Яйцо призыва Наги", + "item.twilightforest.ore_magnet": "Рудный магнит", + "item.twilightforest.ore_map": "Пустая карта шахты", + "item.twilightforest.ore_meter": "Определитель руд [WIP]", + "item.twilightforest.peacock_feather_fan": "Веер полёта", + "item.twilightforest.penguin_spawn_egg": "Яйцо призыва пингвина", + "item.twilightforest.phantom_chestplate": "Нагрудник Фантома", + "item.twilightforest.phantom_helmet": "Шлем Фантома", + "item.twilightforest.pinch_beetle_spawn_egg": "Яйцо призыва жука-рогача", + "item.twilightforest.quest_ram_spawn_egg": "Яйцо призыва Рама", + "item.twilightforest.raven_feather": "Воронье перо", + "item.twilightforest.raw_ironwood": "Железное дерево", + "item.twilightforest.raw_meef": "Мясо минотавра", + "item.twilightforest.raw_venison": "Сырая оленина", + "item.twilightforest.redcap_sapper_spawn_egg": "Яйцо призыва красной шапки-подрывника", + "item.twilightforest.seeker_bow": "Лук искателя", + "item.twilightforest.skeleton_druid_spawn_egg": "Яйцо призыва скелета-друида", + "item.twilightforest.slime_beetle_spawn_egg": "Яйцо призыва слизневого жука", + "item.twilightforest.snow_guardian_spawn_egg": "Яйцо призыва снежного стража", + "item.twilightforest.snow_queen_spawn_egg": "Яйцо призыва снежной королевы", + "item.twilightforest.stable_ice_core_spawn_egg": "Яйцо призыва стабильного ледяного ядра", + "item.twilightforest.steeleaf_axe": "Топор из стальных листьев", + "item.twilightforest.steeleaf_boots": "Ботинки из стальных листьев", + "item.twilightforest.steeleaf_chestplate": "Нагрудник из стальных листьев", + "item.twilightforest.steeleaf_helmet": "Шлем из стальных листьев", + "item.twilightforest.steeleaf_hoe": "Мотыга из стальных листьев", + "item.twilightforest.steeleaf_ingot": "Стальной лист", + "item.twilightforest.steeleaf_leggings": "Поножи из стальных листьев", + "item.twilightforest.steeleaf_pickaxe": "Кирка из стальных листьев", + "item.twilightforest.steeleaf_shovel": "Лопата из стальных листьев", + "item.twilightforest.steeleaf_sword": "Меч из стальных листьев", + "item.twilightforest.swarm_spider_spawn_egg": "Яйцо призыва паука роя", + "item.twilightforest.tiny_bird_spawn_egg": "Яйцо призыва маленькой птички", + "item.twilightforest.torchberries": "Факелонт", + "item.twilightforest.tower_key": "Ключ от башни", + "item.twilightforest.towerwood_borer_spawn_egg": "Яйцо призыва термитов", + "item.twilightforest.transformation_powder": "Мутагенный порошок", + "item.twilightforest.twilight_scepter": "Сумеречный посох", + "item.twilightforest.unstable_ice_core_spawn_egg": "Яйцо призыва неставильного ледяного ядра", + "item.twilightforest.ur_ghast_spawn_egg": "Яйцо призыва Ур-Гаста", + "item.twilightforest.winter_wolf_spawn_egg": "Яйцо призыва полярного волка", + "item.twilightforest.yeti_boots": "Ботинки йети", + "item.twilightforest.yeti_chestplate": "Куртка йети", + "item.twilightforest.yeti_helmet": "Шапка йети", + "item.twilightforest.yeti_leggings": "Штаны йети", + "item.twilightforest.yeti_spawn_egg": "Яйцо призыва йети", + "item.twilightforest.zombie_scepter": "Посох нежити", + "subtitles.twilightforest.entity.boar.ambient": "Кабан хрюкает", + "subtitles.twilightforest.entity.boar.death": "Кабан погибает", + "subtitles.twilightforest.entity.boar.hurt": "Кабан ранен", + "subtitles.twilightforest.entity.deer.death": "Олень погибает", + "subtitles.twilightforest.entity.deer.hurt": "Олень ранен", + "subtitles.twilightforest.entity.hydra.growl": "Гидра рычит", + "subtitles.twilightforest.entity.hydra.hurt": "Гидра повреждена", + "subtitles.twilightforest.entity.hydra.roar": "Гидра ревёт", + "subtitles.twilightforest.entity.hydra.warn": "Гидра приготовилась кусать", + "subtitles.twilightforest.entity.ice.death": "Ледяное ядро погибает", + "subtitles.twilightforest.entity.ice.hurt": "Ледяное ядро повреждено", + "subtitles.twilightforest.entity.kobold.ambient": "Кобольд ворчит", + "subtitles.twilightforest.entity.kobold.death": "Кобольд погибат", + "subtitles.twilightforest.entity.kobold.hurt": "Кобольд травмирован", + "subtitles.twilightforest.entity.lich.ambient": "Лич хрипит", + "subtitles.twilightforest.entity.lich.death": "Лич погибает", + "subtitles.twilightforest.entity.lich.hurt": "Лич ранен", + "subtitles.twilightforest.entity.lich.shoot": "Лич стреляет", + "subtitles.twilightforest.entity.lich.teleport": "Лич телепортируется", + "subtitles.twilightforest.entity.minion.ambient": "Миньон лича рычит", + "subtitles.twilightforest.entity.minion.death": "Миньон лича погибает", + "subtitles.twilightforest.entity.minion.hurt": "Миньон лича ранен", + "subtitles.twilightforest.entity.minoshroom.ambient": "Гриботавр мычит", + "subtitles.twilightforest.entity.minoshroom.death": "Гриботавр погибает", + "subtitles.twilightforest.entity.minoshroom.hurt": "Гриботавр ранен", + "subtitles.twilightforest.entity.minotaur.ambient": "Минотовр мычит", + "subtitles.twilightforest.entity.minotaur.death": "Минотавр погибает", + "subtitles.twilightforest.entity.minotaur.hurt": "Минотавр ранен", + "subtitles.twilightforest.entity.mosquito.ambient": "Жужжание москитов", + "subtitles.twilightforest.entity.naga.hiss": "Нага шипит", + "subtitles.twilightforest.entity.naga.hurt": "Нага повреждена", + "subtitles.twilightforest.entity.naga.rattle": "Нага трещит", + "subtitles.twilightforest.entity.raven.caw": "Ворона каркает", + "subtitles.twilightforest.entity.redcap.ambient": "Красная шапка хихикает", + "subtitles.twilightforest.entity.redcap.death": "Красная шапка стонет в агонии", + "subtitles.twilightforest.entity.redcap.hurt": "Красная шапка визжит от боли", + "subtitles.twilightforest.entity.wraith.ambient": "Призрак хрипит", + "subtitles.twilightforest.entity.yeti.death": "Йети погибает", + "subtitles.twilightforest.entity.yeti.growl": "Йети рычит", + "subtitles.twilightforest.entity.yeti.hurt": "Йети ранен", + "twilightforest.book.darktower.1": "§8[[Блокнот исследователя, который, похоже, пережил взрыв]]§0\n\nУ этой башни явно есть механизмы, которые не отвечают мне. Их магия почти жаждет признать мое прикосновение, но это невозможно. Это если устройства башни", + "twilightforest.book.darktower.2": "подавляются мощной группой существ поблизости.\n\n§8[[Следующая запись]]§0\n\nКажется, что магия исходит из глубины близлежащих крепостей. Он не может исходить от гоблинов, так как их магия очаровательна, но не сфокусирована. Там", + "twilightforest.book.darktower.3": "в крепостях еще должна быть какая-то сила.\n\n§8[[Следующая запись]]§0\n\nМой анализ показывает, что он исходит из нескольких источников, действующих как группа. Я вернусь в крепость после пополнения запасов..." +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/ry_ua.json b/src/main/resources/assets/twilightforest/lang/ry_ua.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/ry_ua.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/se_no.json b/src/main/resources/assets/twilightforest/lang/se_no.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/se_no.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/sk_sk.json b/src/main/resources/assets/twilightforest/lang/sk_sk.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/sk_sk.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/sl_si.json b/src/main/resources/assets/twilightforest/lang/sl_si.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/sl_si.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/so_so.json b/src/main/resources/assets/twilightforest/lang/so_so.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/so_so.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/sq_al.json b/src/main/resources/assets/twilightforest/lang/sq_al.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/sq_al.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/sr_sp.json b/src/main/resources/assets/twilightforest/lang/sr_sp.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/sr_sp.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/sv_se.json b/src/main/resources/assets/twilightforest/lang/sv_se.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/sv_se.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/ta_in.json b/src/main/resources/assets/twilightforest/lang/ta_in.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/ta_in.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/th_th.json b/src/main/resources/assets/twilightforest/lang/th_th.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/th_th.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/tl_ph.json b/src/main/resources/assets/twilightforest/lang/tl_ph.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/tl_ph.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/tlh_aa.json b/src/main/resources/assets/twilightforest/lang/tlh_aa.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/tlh_aa.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/tr_tr.json b/src/main/resources/assets/twilightforest/lang/tr_tr.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/tr_tr.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/tt_ru.json b/src/main/resources/assets/twilightforest/lang/tt_ru.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/tt_ru.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/uk_ua.json b/src/main/resources/assets/twilightforest/lang/uk_ua.json new file mode 100644 index 0000000000..9b1bd22650 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/uk_ua.json @@ -0,0 +1,1413 @@ +{ + "advancement.twilightforest.arborist": "Маніакальний дендролог", + "advancement.twilightforest.arborist.desc": "Приготуйте свої сокири та ножиці. Обшукайте кожен закуток і щілину, заберіть все, що росте на деревах! Створюйте, збирайте, дістаньте кожну плиту... саджанець... листя... ще більше... все. ВСЕ ЩО Є!", + "advancement.twilightforest.arctic_dyed": "Останній писк моди", + "advancement.twilightforest.arctic_dyed.desc": "Пофарбуйте чотири унікальні частини арктичної броні", + "advancement.twilightforest.beanstalk": "Джек і бобове зерно", + "advancement.twilightforest.beanstalk.desc": "Отримайте кілька чарівних бобів у печерах тролів і використайте їх на ґрунті, що сяю, під хмарами", + "advancement.twilightforest.experiment_115": "Таємниче м'ясо?", + "advancement.twilightforest.experiment_115.desc": "Це схоже на торт, хоча...", + "advancement.twilightforest.experiment_115_2": "Величезний успіх!", + "advancement.twilightforest.experiment_115_2.desc": "Він такий смачний і вологий!", + "advancement.twilightforest.experiment_115_3": "Їсти 115 щодня, 115 років, назавжди", + "advancement.twilightforest.experiment_115_3.desc": "Експеримент з їжею сто п'ятнадцять увесь день, назавжди, сто п'ятнадцять разів експеримент сто п'ятнадцять, експеримент сто п'ятнадцять крапка ком, дабл'ю дабл'ю дабл'ю крапка експеримент сто п'ятнадцять крапка ком, сто п'ятнадцять років, кожна хвилина експерименту сто п'ятнадцять крапка ком, дабл'ю дабл'ю дабл'ю крапка сто п'ятнадцять разів експеримент сто п'ятнадцять крапка ком", + "advancement.twilightforest.fiery_set": "Потом і кров'ю", + "advancement.twilightforest.fiery_set.desc": "Володійте вогненним знаряддям або зброєю, маючи принаймні одну частину вогняної броні у своєму інвентарі", + "advancement.twilightforest.full_mettle_alchemist": "Сталевий алхімік", + "advancement.twilightforest.full_mettle_alchemist.desc": "Випийте чотири дози зілля шкоди II менш ніж за 8 секунд і виживіть", + "advancement.twilightforest.ghast_trap": "Щось дивне в Тауервуді", + "advancement.twilightforest.ghast_trap.desc": "Вбийте Кармінитового міні-ґаста біля пасики та активуйте ключ Ур-Ґаста прямо з неба!", + "advancement.twilightforest.giants": "Я на сьомому небі", + "advancement.twilightforest.giants.desc": "Вбийте Шахтаря гіганта у хмарах, візьміть кайло велетня та поверніться до печер тролів", + "advancement.twilightforest.glass_sword": "Однією лівою", + "advancement.twilightforest.glass_sword.desc": "Сподіваюсь, ти розумієш як цим користуватись.", + "advancement.twilightforest.hedge": "Жукодавило", + "advancement.twilightforest.hedge.desc": "Перемогти павука в лабіринті живоплоту", + "advancement.twilightforest.hill1": "Галоші мої!", + "advancement.twilightforest.hill1.desc": "Вбийте гобліна в Маленькому порожнистому пагорбі", + "advancement.twilightforest.hill2": "Що це був за шум?", + "advancement.twilightforest.hill2.desc": "Вбийте гобліна в середньому порожнистому пагорбі", + "advancement.twilightforest.hill3": "Я бачу тебе наскрізь", + "advancement.twilightforest.hill3.desc": "Вбийте гобліна у Великому порожнистому пагорбі", + "advancement.twilightforest.hydra_chop": "Котлета по-київськи?", + "advancement.twilightforest.hydra_chop.desc": "З’їжте м'ясо Гідри, коли ви будете досить голодними", + "advancement.twilightforest.kill_cicada": "Цить!", + "advancement.twilightforest.kill_cicada.desc": "Убити Цикаду", + "advancement.twilightforest.kill_hydra": "Вбивця Гідри", + "advancement.twilightforest.kill_hydra.desc": "Убийте могутню Гідру і надайте собі сили", + "advancement.twilightforest.kill_lich": "Вбийте мерця", + "advancement.twilightforest.kill_lich.desc": "Убийте Сутінкового Ліча на вершині його вежі та візьміть скіпетр, щоб очистити Болото від отруйних комарів, побачити крізь сліпучу темряву прокляття Темного лісу та протистояти холоду Сніжного лісу", + "advancement.twilightforest.kill_naga": "Час зрівняти терези", + "advancement.twilightforest.kill_naga.desc": "Убийте Нагу на його лісовому подвір’ї та отримайте луску Наги, щоб подолати магічний бар’єр навколо вежі Ліча", + "advancement.twilightforest.lich_scepters": "Наші сили об'єднані!", + "advancement.twilightforest.lich_scepters.desc": "Отримайте всі чотири скіпетри влади", + "advancement.twilightforest.magic_map": "Далеко бачу", + "advancement.twilightforest.magic_map.desc": "Створіть мапу лабіринту/руди", + "advancement.twilightforest.magic_map_focus": "Написане вогнем", + "advancement.twilightforest.maze_map": "Тепер, я знайду вихід", + "advancement.twilightforest.maze_map.desc": "Виготовте мапу лабіринту після отримання фокусу лабіринту", + "advancement.twilightforest.mazebreaker": "Руйнівник лабіринту", + "advancement.twilightforest.mazebreaker.desc": "Знайдіть кайло «Руйнівник лабіринту», у таємному сховищі лабіринту", + "advancement.twilightforest.naga_armors": "Броня Наги", + "advancement.twilightforest.naga_armors.desc": "Створіть нагрудник та наголінники з луски Наги", + "advancement.twilightforest.ore_map": "Воно того варте?", + "advancement.twilightforest.progress_glacier": "Чисте небо", + "advancement.twilightforest.progress_glacier.desc": "Вбийте Сніжну королеву на вершині палацу Аврори", + "advancement.twilightforest.progress_knights": "Кармінова акліматизація", + "advancement.twilightforest.progress_knights.desc": "Поселіть неспокійних фантомів у могилі лицаря, і прилади кармінітової вежі підкоряться вам", + "advancement.twilightforest.progress_labyrinth": "Могутній Строганов", + "advancement.twilightforest.progress_labyrinth.desc": "З’їжте м’ясо Строганова, щоб акліматизувати своє тіло до небезпечної спеки Вогняного болота", + "advancement.twilightforest.progress_merge": "Остаточне розкриття", + "advancement.twilightforest.progress_merge.desc": "Вбийте Гідру, Ур-Ґаста та Сніжну королеву, щоб позбутися кислотних дощів і набратися сміливості для Високогір'я", + "advancement.twilightforest.progress_troll": "Я хочу все спалити", + "advancement.twilightforest.progress_troll.desc": "Знайдіть лампу попелу у печерах тролів, і ви зможете спалити шипові бар’єри", + "advancement.twilightforest.progress_trophy_pedestal": "Титулований чемпіон", + "advancement.twilightforest.progress_trophy_pedestal.desc": "Заявіть про свій титул, поставивши трофей на п'єдестал у лісових руїнах", + "advancement.twilightforest.progress_ur_ghast": "Вогняні сльози", + "advancement.twilightforest.progress_ur_ghast.desc": "Торкніться вогненно-червоних сліз Ур-Ґаста", + "advancement.twilightforest.progress_yeti": "Альфа Хутро", + "advancement.twilightforest.progress_yeti.desc": "Підкладіть свій одяг м’яким хутром з Альфа Єті, щоб захистити себе від холоду Льодовика", + "advancement.twilightforest.progression_end": "Кінець прогресу", + "advancement.twilightforest.progression_end.desc": "Усе, що виходить за цю точку у Високогір'ї, є незавершеним. У майбутньому він буде завершений", + "advancement.twilightforest.quest_ram": "Неперевершений", + "advancement.twilightforest.quest_ram.desc": "Дайте барану те, що йому не вистачає", + "advancement.twilightforest.root": "Сутінковий ліс", + "advancement.twilightforest.root.desc": "Увійдіть до загадкових магічних земель: Сутінкового лісу", + "advancement.twilightforest.troll": "Вас затролено", + "advancement.twilightforest.troll.desc": "Знайдіть та вбийте %s", + "advancement.twilightforest.twilight_dining": "Обід на вічному заході сонця", + "advancement.twilightforest.twilight_dining.desc": "Їжте всі їстівні предмети, ексклюзивні для Сутінкового лісу", + "advancement.twilightforest.twilight_hunter": "Тиша лісу", + "advancement.twilightforest.twilight_hunter.desc": "Полюйте на місцеву дику природу", + "biome.twilightforest.clearing": "Сутінкова галявина", + "biome.twilightforest.dark_forest": "Темний ліс", + "biome.twilightforest.dark_forest_center": "Центр Темного лісу", + "biome.twilightforest.dense_forest": "Густий ліс", + "biome.twilightforest.dense_mushroom_forest": "Густий грибний ліс", + "biome.twilightforest.enchanted_forest": "Зачарований ліс", + "biome.twilightforest.final_plateau": "Фінальне плато", + "biome.twilightforest.fire_swamp": "Вогняне болото", + "biome.twilightforest.firefly_forest": "Ліс світлячків", + "biome.twilightforest.forest": "Сутінковий ліс", + "biome.twilightforest.glacier": "Сутінковий льодовик", + "biome.twilightforest.highlands": "Сутінкове високогір'я", + "biome.twilightforest.lake": "Сутінкове озеро", + "biome.twilightforest.mushroom_forest": "Грибний ліс", + "biome.twilightforest.oak_savannah": "Дубова саванна", + "biome.twilightforest.snowy_forest": "Засніжений ліс", + "biome.twilightforest.spooky_forest": "Моторошний ліс", + "biome.twilightforest.stream": "Сутінковий струмок", + "biome.twilightforest.swamp": "Сутінкове болото", + "biome.twilightforest.thornlands": "Тернові землі", + "biome.twilightforest.underground": "Підземний рівень", + "block.minecraft.banner.twilightforest.alpha_yeti.black": "Чорне обличчя Альфа Єті", + "block.minecraft.banner.twilightforest.alpha_yeti.blue": "Синє обличчя Альфа Єті", + "block.minecraft.banner.twilightforest.alpha_yeti.brown": "Коричневе обличчя Альфа Єті", + "block.minecraft.banner.twilightforest.alpha_yeti.cyan": "Бірюзове обличчя Альфа Єті", + "block.minecraft.banner.twilightforest.alpha_yeti.gray": "Сіре обличчя Альфа Єті", + "block.minecraft.banner.twilightforest.alpha_yeti.green": "Зелене обличчя Альфа Єті", + "block.minecraft.banner.twilightforest.alpha_yeti.light_blue": "Блакитне обличчя Альфа Єті", + "block.minecraft.banner.twilightforest.alpha_yeti.light_gray": "Світло-сіре обличчя Альфа Єті", + "block.minecraft.banner.twilightforest.alpha_yeti.lime": "Лаймове обличчя Альфа Єті", + "block.minecraft.banner.twilightforest.alpha_yeti.magenta": "Пурпурове обличчя Альфа Єті", + "block.minecraft.banner.twilightforest.alpha_yeti.orange": "Помаранчеве обличчя Альфа Єті", + "block.minecraft.banner.twilightforest.alpha_yeti.pink": "Рожеве обличчя Альфа Єті", + "block.minecraft.banner.twilightforest.alpha_yeti.purple": "Фіолетове обличчя Альфа Єті", + "block.minecraft.banner.twilightforest.alpha_yeti.red": "Червоне обличчя Альфа Єті", + "block.minecraft.banner.twilightforest.alpha_yeti.white": "Біле обличчя Альфа Єті", + "block.minecraft.banner.twilightforest.alpha_yeti.yellow": "Жовте обличчя Альфа Єті", + "block.minecraft.banner.twilightforest.hydra.black": "Чорне полум'я Гідри", + "block.minecraft.banner.twilightforest.hydra.blue": "Синє полум'я Гідри", + "block.minecraft.banner.twilightforest.hydra.brown": "Коричневе полум'я Гідри", + "block.minecraft.banner.twilightforest.hydra.cyan": "Бірюзове полум'я Гідри", + "block.minecraft.banner.twilightforest.hydra.gray": "Сіре полум'я Гідри", + "block.minecraft.banner.twilightforest.hydra.green": "Зелене полум'я Гідри", + "block.minecraft.banner.twilightforest.hydra.light_blue": "Блакитне полум'я Гідри", + "block.minecraft.banner.twilightforest.hydra.light_gray": "Світло-сіре полум'я Гідри", + "block.minecraft.banner.twilightforest.hydra.lime": "Лаймове полум'я Гідри", + "block.minecraft.banner.twilightforest.hydra.magenta": "Пурпурове полум'я Гідри", + "block.minecraft.banner.twilightforest.hydra.orange": "Помаранчеве полум'я Гідри", + "block.minecraft.banner.twilightforest.hydra.pink": "Рожеве полум'я Гідри", + "block.minecraft.banner.twilightforest.hydra.purple": "Фіолетове полум'я Гідри", + "block.minecraft.banner.twilightforest.hydra.red": "Червоне полум'я Гідри", + "block.minecraft.banner.twilightforest.hydra.white": "Біле полум'я Гідри", + "block.minecraft.banner.twilightforest.hydra.yellow": "Жовте полум'я Гідри", + "block.minecraft.banner.twilightforest.knight_phantom.black": "Чорний лицарський шолом", + "block.minecraft.banner.twilightforest.knight_phantom.blue": "Синій лицарський шолом", + "block.minecraft.banner.twilightforest.knight_phantom.brown": "Коричневий лицарський шолом", + "block.minecraft.banner.twilightforest.knight_phantom.cyan": "Бірюзовий лицарський шолом", + "block.minecraft.banner.twilightforest.knight_phantom.gray": "Сірий лицарський шолом", + "block.minecraft.banner.twilightforest.knight_phantom.green": "Зелений лицарський шолом", + "block.minecraft.banner.twilightforest.knight_phantom.light_blue": "Блакитний лицарський шолом", + "block.minecraft.banner.twilightforest.knight_phantom.light_gray": "Світло-сірий лицарський шолом", + "block.minecraft.banner.twilightforest.knight_phantom.lime": "Лаймовий лицарський шолом", + "block.minecraft.banner.twilightforest.knight_phantom.magenta": "Пурпуровий лицарський шолом", + "block.minecraft.banner.twilightforest.knight_phantom.orange": "Помаранчевий лицарський шолом", + "block.minecraft.banner.twilightforest.knight_phantom.pink": "Рожевий лицарський шолом", + "block.minecraft.banner.twilightforest.knight_phantom.purple": "Фіолетовий лицарський шолом", + "block.minecraft.banner.twilightforest.knight_phantom.red": "Червоний лицарський шолом", + "block.minecraft.banner.twilightforest.knight_phantom.white": "Білий лицарський шолом", + "block.minecraft.banner.twilightforest.knight_phantom.yellow": "Жовтий лицарський шолом", + "block.minecraft.banner.twilightforest.lich.black": "Чорна корона Ліча", + "block.minecraft.banner.twilightforest.lich.blue": "Синя корона Ліча", + "block.minecraft.banner.twilightforest.lich.brown": "Коричнева корона Ліча", + "block.minecraft.banner.twilightforest.lich.cyan": "Бірюзова корона Ліча", + "block.minecraft.banner.twilightforest.lich.gray": "Сіра корона Ліча", + "block.minecraft.banner.twilightforest.lich.green": "Зелена корона Ліча", + "block.minecraft.banner.twilightforest.lich.light_blue": "Блакитна корона Ліча", + "block.minecraft.banner.twilightforest.lich.light_gray": "Світло-сіра корона Ліча", + "block.minecraft.banner.twilightforest.lich.lime": "Лаймова корона Ліча", + "block.minecraft.banner.twilightforest.lich.magenta": "Пурпурова корона Ліча", + "block.minecraft.banner.twilightforest.lich.orange": "Помаранчева корона Ліча", + "block.minecraft.banner.twilightforest.lich.pink": "Рожева корона Ліча", + "block.minecraft.banner.twilightforest.lich.purple": "Фіолетова корона Ліча", + "block.minecraft.banner.twilightforest.lich.red": "Червона корона Ліча", + "block.minecraft.banner.twilightforest.lich.white": "Біла корона Ліча", + "block.minecraft.banner.twilightforest.lich.yellow": "Жовта корона Ліча", + "block.minecraft.banner.twilightforest.minoshroom.black": "Чорна сокира Гриботавра", + "block.minecraft.banner.twilightforest.minoshroom.blue": "Синя сокира Гриботавра", + "block.minecraft.banner.twilightforest.minoshroom.brown": "Коричнева сокира Гриботавра", + "block.minecraft.banner.twilightforest.minoshroom.cyan": "Бірюзова сокира Гриботавра", + "block.minecraft.banner.twilightforest.minoshroom.gray": "Сіра сокира Гриботавра", + "block.minecraft.banner.twilightforest.minoshroom.green": "Зелена сокира Гриботавра", + "block.minecraft.banner.twilightforest.minoshroom.light_blue": "Блакитна сокира Гриботавра", + "block.minecraft.banner.twilightforest.minoshroom.light_gray": "Світло-сіра сокира Гриботавра", + "block.minecraft.banner.twilightforest.minoshroom.lime": "Лаймова сокира Гриботавра", + "block.minecraft.banner.twilightforest.minoshroom.magenta": "Пурпурова сокира Гриботавра", + "block.minecraft.banner.twilightforest.minoshroom.orange": "Помаранчева сокира Гриботавра", + "block.minecraft.banner.twilightforest.minoshroom.pink": "Рожева сокира Гриботавра", + "block.minecraft.banner.twilightforest.minoshroom.purple": "Фіолетова сокира Гриботавра", + "block.minecraft.banner.twilightforest.minoshroom.red": "Червона сокира Гриботавра", + "block.minecraft.banner.twilightforest.minoshroom.white": "Біла сокира Гриботавра", + "block.minecraft.banner.twilightforest.minoshroom.yellow": "Жовта сокира Гриботавра", + "block.minecraft.banner.twilightforest.naga.black": "Чорна луска Наги", + "block.minecraft.banner.twilightforest.naga.blue": "Синя луска Наги", + "block.minecraft.banner.twilightforest.naga.brown": "Коричнева луска Наги", + "block.minecraft.banner.twilightforest.naga.cyan": "Бірюзова луска Наги", + "block.minecraft.banner.twilightforest.naga.gray": "Сіра луска Наги", + "block.minecraft.banner.twilightforest.naga.green": "Зелена луска Наги", + "block.minecraft.banner.twilightforest.naga.light_blue": "Блакитна луска Наги", + "block.minecraft.banner.twilightforest.naga.light_gray": "Світло-сіра луска Наги", + "block.minecraft.banner.twilightforest.naga.lime": "Лаймова луска Наги", + "block.minecraft.banner.twilightforest.naga.magenta": "Пурпурова луска Наги", + "block.minecraft.banner.twilightforest.naga.orange": "Помаранчева луска Наги", + "block.minecraft.banner.twilightforest.naga.pink": "Рожева луска Наги", + "block.minecraft.banner.twilightforest.naga.purple": "Фіолетова луска Наги", + "block.minecraft.banner.twilightforest.naga.red": "Червона луска Наги", + "block.minecraft.banner.twilightforest.naga.white": "Біла луска Наги", + "block.minecraft.banner.twilightforest.naga.yellow": "Жовта луска Наги", + "block.minecraft.banner.twilightforest.quest_ram.black": "Чорні вихори квестового барану", + "block.minecraft.banner.twilightforest.quest_ram.blue": "Сині вихори квестового барану", + "block.minecraft.banner.twilightforest.quest_ram.brown": "Коричневі вихори квестового барану", + "block.minecraft.banner.twilightforest.quest_ram.cyan": "Бірюзові вихори квестового барану", + "block.minecraft.banner.twilightforest.quest_ram.gray": "Сірі вихори квестового барану", + "block.minecraft.banner.twilightforest.quest_ram.green": "Зелені вихори квестового барану", + "block.minecraft.banner.twilightforest.quest_ram.light_blue": "Блакитні вихори квестового барану", + "block.minecraft.banner.twilightforest.quest_ram.light_gray": "Світло-сірі вихори квестового барану", + "block.minecraft.banner.twilightforest.quest_ram.lime": "Лаймові вихори квестового барану", + "block.minecraft.banner.twilightforest.quest_ram.magenta": "Пурпурові вихори квестового барану", + "block.minecraft.banner.twilightforest.quest_ram.orange": "Помаранчеві вихори квестового барану", + "block.minecraft.banner.twilightforest.quest_ram.pink": "Рожеві вихори квестового барану", + "block.minecraft.banner.twilightforest.quest_ram.purple": "Фіолетові вихори квестового барану", + "block.minecraft.banner.twilightforest.quest_ram.red": "Червоні вихори квестового барану", + "block.minecraft.banner.twilightforest.quest_ram.white": "Білі вихори квестового барану", + "block.minecraft.banner.twilightforest.quest_ram.yellow": "Жовті вихори квестового барану", + "block.minecraft.banner.twilightforest.snow_queen.black": "Чорна корона снігової королеви", + "block.minecraft.banner.twilightforest.snow_queen.blue": "Синя корона снігової королеви", + "block.minecraft.banner.twilightforest.snow_queen.brown": "Коричнева корона снігової королеви", + "block.minecraft.banner.twilightforest.snow_queen.cyan": "Бірюзова корона снігової королеви", + "block.minecraft.banner.twilightforest.snow_queen.gray": "Сіра корона снігової королеви", + "block.minecraft.banner.twilightforest.snow_queen.green": "Зелена корона снігової королеви", + "block.minecraft.banner.twilightforest.snow_queen.light_blue": "Блакитна корона снігової королеви", + "block.minecraft.banner.twilightforest.snow_queen.light_gray": "Світло-сіра корона снігової королеви", + "block.minecraft.banner.twilightforest.snow_queen.lime": "Лаймова корона снігової королеви", + "block.minecraft.banner.twilightforest.snow_queen.magenta": "Пурпурова корона снігової королеви", + "block.minecraft.banner.twilightforest.snow_queen.orange": "Помаранчева корона снігової королеви", + "block.minecraft.banner.twilightforest.snow_queen.pink": "Рожева корона снігової королеви", + "block.minecraft.banner.twilightforest.snow_queen.purple": "Фіолетова корона снігової королеви", + "block.minecraft.banner.twilightforest.snow_queen.red": "Червона корона снігової королеви", + "block.minecraft.banner.twilightforest.snow_queen.white": "Біла корона снігової королеви", + "block.minecraft.banner.twilightforest.snow_queen.yellow": "Жовта корона снігової королеви", + "block.minecraft.banner.twilightforest.ur_ghast.black": "Чорна кармінова грань", + "block.minecraft.banner.twilightforest.ur_ghast.blue": "Синя кармінова грань", + "block.minecraft.banner.twilightforest.ur_ghast.brown": "Коричнева кармінова грань", + "block.minecraft.banner.twilightforest.ur_ghast.cyan": "Бірюзова кармінова грань", + "block.minecraft.banner.twilightforest.ur_ghast.gray": "Сіра кармінова грань", + "block.minecraft.banner.twilightforest.ur_ghast.green": "Зелена кармінова грань", + "block.minecraft.banner.twilightforest.ur_ghast.light_blue": "Блакитна кармінова грань", + "block.minecraft.banner.twilightforest.ur_ghast.light_gray": "Світло-сіра кармінова грань", + "block.minecraft.banner.twilightforest.ur_ghast.lime": "Лаймова кармінова грань", + "block.minecraft.banner.twilightforest.ur_ghast.magenta": "Пурпурова кармінова грань", + "block.minecraft.banner.twilightforest.ur_ghast.orange": "Помаранчева кармінова грань", + "block.minecraft.banner.twilightforest.ur_ghast.pink": "Рожева кармінова грань", + "block.minecraft.banner.twilightforest.ur_ghast.purple": "Фіолетова кармінова грань", + "block.minecraft.banner.twilightforest.ur_ghast.red": "Червона кармінова грань", + "block.minecraft.banner.twilightforest.ur_ghast.white": "Біла кармінова грань", + "block.minecraft.banner.twilightforest.ur_ghast.yellow": "Жовта кармінова грань", + "block.twilightforest.acacia_banister": "Акацієві бильця", + "block.twilightforest.alpha_yeti_boss_spawner": "Спавнер Альфа Єті", + "block.twilightforest.alpha_yeti_trophy": "Трофей Альфа Єті", + "block.twilightforest.antibuilder": "Антибудівельник", + "block.twilightforest.antibuilt_block": "Антибудівельний блок", + "block.twilightforest.arctic_fur_block": "Блок арктичного хутра", + "block.twilightforest.arctic_fur_block.desc": "Зменшує шкоду від падіння на 90%", + "block.twilightforest.aurora_block": "Блок Аврори", + "block.twilightforest.aurora_pillar": "Колона Аврори", + "block.twilightforest.aurora_slab": "Плита Аврори", + "block.twilightforest.auroralized_glass": "Авроралізоване скло", + "block.twilightforest.banister.cycle": "Тримаючи сокиру — клацніть ПКМ, щоб змінити положення", + "block.twilightforest.beanstalk_leaves": "Листя бобового стебла", + "block.twilightforest.birch_banister": "Березові бильця", + "block.twilightforest.blue_castle_door": "Сині двері замку", + "block.twilightforest.blue_castle_rune_brick": "Рунічна синя цегла замку", + "block.twilightforest.blue_force_field": "Синє силове поле", + "block.twilightforest.bold_castle_brick_pillar": "Рельєфна колона цегли замку", + "block.twilightforest.bold_castle_brick_stairs": "Рельєфні сходи з цегли замку", + "block.twilightforest.bold_castle_brick_tile": "Рельєфний кахель цегляного замку", + "block.twilightforest.bold_stone_pillar": "Рельєфна кам'яна колона", + "block.twilightforest.brown_thorns": "Терен", + "block.twilightforest.built_block": "Вбудований блок", + "block.twilightforest.burnt_thorns": "Обпалений терен", + "block.twilightforest.candelabra": "Канделябр", + "block.twilightforest.canopy_banister": "Бильця з сутінкової сосни", + "block.twilightforest.canopy_bookshelf": "Книжкова полиця з сутінкової сосни", + "block.twilightforest.canopy_button": "Кнопка з сутінкової сосни", + "block.twilightforest.canopy_chest": "Скриня з сутінкового соснового дерева", + "block.twilightforest.canopy_door": "Двері з сутінкової сосни", + "block.twilightforest.canopy_fence": "Паркан з сутінкової сосни", + "block.twilightforest.canopy_fence_gate": "Хвіртка з сутінкової сосни", + "block.twilightforest.canopy_leaves": "Сутінкова соснова листва", + "block.twilightforest.canopy_log": "Сутінкова соснова колода", + "block.twilightforest.canopy_planks": "Дошки з сутінкової сосни", + "block.twilightforest.canopy_pressure_plate": "Натискна плита з сутінкової сосни", + "block.twilightforest.canopy_sapling": "Саджанець сутінкової сосни", + "block.twilightforest.canopy_sign": "Табличка з сутінкової сосни", + "block.twilightforest.canopy_slab": "Плита з сутінкової сосни", + "block.twilightforest.canopy_stairs": "Сходи з сутінкової сосни", + "block.twilightforest.canopy_trapdoor": "Люк з сутінкової сосни", + "block.twilightforest.canopy_wall_sign": "Табличка з сутінкової сосни на стіні", + "block.twilightforest.canopy_wood": "Сутінкова соснова деревина", + "block.twilightforest.carminite_block": "Блок карміну", + "block.twilightforest.carminite_builder": "Карміновий будівельник", + "block.twilightforest.carminite_reactor": "Карміновий реактор", + "block.twilightforest.casket.broken": "Ваша скринька пам'яті була занадто пошкоджена, щоб вмістити ще які-небудь предмети. Всі предмети, які повинні були зберігатися у вашій скринці, були скинуті на землю.", + "block.twilightforest.casket.locked": "Цю Скриньку може відкрити лише %s!", + "block.twilightforest.castle_brick": "Цегла замку", + "block.twilightforest.castle_brick_stairs": "Сходи з цегли замку", + "block.twilightforest.castle_roof_tile": "Черепиця замку", + "block.twilightforest.cicada": "Цикада", + "block.twilightforest.cicada_jar": "Банка з цикадою", + "block.twilightforest.cinder_furnace": "Шлакова піч", + "block.twilightforest.cinder_log": "Шлакова колода", + "block.twilightforest.cinder_wood": "Шлакова деревина", + "block.twilightforest.clover_patch": "Листок конюшини", + "block.twilightforest.cracked_castle_brick": "Тріснута цегла замку", + "block.twilightforest.cracked_castle_brick_stairs": "Сходи з тріснутої цегли замку", + "block.twilightforest.cracked_deadrock": "Тріснутий мертвокамінь", + "block.twilightforest.cracked_etched_nagastone": "Тріснутий гравірований нагакамінь", + "block.twilightforest.cracked_mazestone": "Тріснута цегла з каменя лабіринту", + "block.twilightforest.cracked_nagastone_pillar": "Тріснута колона з нагакамню", + "block.twilightforest.cracked_nagastone_stairs_left": "Тріснуті сходи з нагакамню (ліва)", + "block.twilightforest.cracked_nagastone_stairs_right": "Тріснуті сходи з нагакамню (права)", + "block.twilightforest.cracked_towerwood": "Тріснуті дошки з темної вежі", + "block.twilightforest.cracked_underbrick": "Тріснутий підцеглянник", + "block.twilightforest.creeper_skull_candle": "Свічка з голови кріпера", + "block.twilightforest.creeper_wall_skull_candle": "Свічка з голови кріпера на стіні", + "block.twilightforest.crimson_banister": "Багряні бильця", + "block.twilightforest.cut_mazestone": "Тесаний камінь лабіринту", + "block.twilightforest.dark_banister": "Бильця з темного дерева", + "block.twilightforest.dark_button": "Кнопка з темного дерева", + "block.twilightforest.dark_chest": "Скриня з темного дерева", + "block.twilightforest.dark_door": "Двері з темного дерева", + "block.twilightforest.dark_fence": "Паркан з темного дерева", + "block.twilightforest.dark_fence_gate": "Хвіртка з темного дерева", + "block.twilightforest.dark_leaves": "Листя темного дерева", + "block.twilightforest.dark_log": "Сутінкова темна колода", + "block.twilightforest.dark_oak_banister": "Бильця з темного дуба", + "block.twilightforest.dark_planks": "Дошки з темного дерева", + "block.twilightforest.dark_pressure_plate": "Натискна плита з темного дерева", + "block.twilightforest.dark_sign": "Табличка з темного дерева", + "block.twilightforest.dark_slab": "Плита з темного дерева", + "block.twilightforest.dark_stairs": "Сходи з темного дерева", + "block.twilightforest.dark_trapdoor": "Люк з темного дерева", + "block.twilightforest.dark_wall_sign": "Настінна табличка з темного дерева", + "block.twilightforest.dark_wood": "Колода з темного дерева", + "block.twilightforest.darkwood_sapling": "Саджанець темного дерева", + "block.twilightforest.deadrock": "Мертвокамінь", + "block.twilightforest.death_tome_spawner": "Спавнер книги смерті", + "block.twilightforest.decorative_mazestone": "Декоративна цегла з каменя лабіринту", + "block.twilightforest.empty_canopy_bookshelf": "Порожня книжкова полиця з сутінкової сосни", + "block.twilightforest.encased_castle_brick_pillar": "Облицьована колона цегли замку", + "block.twilightforest.encased_castle_brick_stairs": "Облицьовані сходи з цегли замку", + "block.twilightforest.encased_castle_brick_tile": "Облицьовані кахлі цегли замку", + "block.twilightforest.encased_fire_jet": "Закритий вогнеструйний струмінь", + "block.twilightforest.encased_smoker": "Закритий блок диму", + "block.twilightforest.encased_towerwood": "Посиленні дошки з темної вежі", + "block.twilightforest.etched_nagastone": "Гравірований нагакамінь", + "block.twilightforest.experiment_115": "Експеримент 115", + "block.twilightforest.fake_diamond": "Діамантовий блок", + "block.twilightforest.fake_gold": "Золотий блок", + "block.twilightforest.fallen_leaves": "Опале листя", + "block.twilightforest.fiddlehead": "Травневе яблуко", + "block.twilightforest.fiery_block": "Блок вогняного металу", + "block.twilightforest.final_boss_boss_spawner": "Спавнер фінального босу", + "block.twilightforest.fire_jet": "Блок вогню", + "block.twilightforest.firefly": "Світлячок", + "block.twilightforest.firefly_jar": "Банка зі світлячком", + "block.twilightforest.firefly_particle_spawner": "Спавнер частинок світлячка в банці", + "block.twilightforest.fluffy_cloud": "Пухнаста хмаринка", + "block.twilightforest.ghast_trap": "Пастка для ґаста", + "block.twilightforest.giant_cobblestone": "Гігантський кругляк", + "block.twilightforest.giant_leaves": "Гігантське дубове листя", + "block.twilightforest.giant_log": "Гігантська дубова колода", + "block.twilightforest.giant_obsidian": "Гігантський обсидіан", + "block.twilightforest.green_force_field": "Зелене силове поле", + "block.twilightforest.green_thorns": "Зелений терен", + "block.twilightforest.hardened_dark_leaves": "Густе листя темного дерева", + "block.twilightforest.hedge": "Живопліт", + "block.twilightforest.hollow_acacia_log_climbable": "Акацієва порожниста колода", + "block.twilightforest.hollow_acacia_log_horizontal": "Акацієва порожниста колода", + "block.twilightforest.hollow_acacia_log_vertical": "Акацієва порожниста колода", + "block.twilightforest.hollow_birch_log_climbable": "Березова порожниста колода", + "block.twilightforest.hollow_birch_log_horizontal": "Березова порожниста колода", + "block.twilightforest.hollow_birch_log_vertical": "Березова порожниста колода", + "block.twilightforest.hollow_canopy_log_climbable": "Порожниста колода з сутінкової сосни", + "block.twilightforest.hollow_canopy_log_horizontal": "Порожниста колода з сутінкової сосни", + "block.twilightforest.hollow_canopy_log_vertical": "Порожниста колода з сутінкової сосни", + "block.twilightforest.hollow_crimson_stem_climbable": "Порожнисте багряне стебло", + "block.twilightforest.hollow_crimson_stem_horizontal": "Порожнисте багряне стебло", + "block.twilightforest.hollow_crimson_stem_vertical": "Порожнисте багряне стебло", + "block.twilightforest.hollow_dark_log_climbable": "Порожниста колода з темного дерева", + "block.twilightforest.hollow_dark_log_horizontal": "Порожниста колода з темного дерева", + "block.twilightforest.hollow_dark_log_vertical": "Порожниста колода з темного дерева", + "block.twilightforest.hollow_dark_oak_log_climbable": "Пронжниста колода з темного дуба", + "block.twilightforest.hollow_dark_oak_log_horizontal": "Порожниста колода з темного дуба", + "block.twilightforest.hollow_dark_oak_log_vertical": "Порожниста колода з темного дуба", + "block.twilightforest.hollow_jungle_log_climbable": "Порожниста колода тропічного дерева", + "block.twilightforest.hollow_jungle_log_horizontal": "Порожниста колода тропічного дерева", + "block.twilightforest.hollow_jungle_log_vertical": "Порожниста колода тропічного дерева", + "block.twilightforest.hollow_mangrove_log_climbable": "Порожниста колода з сутінкового мангрового дерева", + "block.twilightforest.hollow_mangrove_log_horizontal": "Порожниста колода з сутінкового мангрового дерева", + "block.twilightforest.hollow_mangrove_log_vertical": "Порожниста колода з сутінкового мангрового дерева", + "block.twilightforest.hollow_mining_log_climbable": "Порожниста колода з шахтарського дерева", + "block.twilightforest.hollow_mining_log_horizontal": "Порожниста колода з шахтарського дерева", + "block.twilightforest.hollow_mining_log_vertical": "Порожниста колода з шахтарського дерева", + "block.twilightforest.hollow_oak_log_climbable": "Дубова порожниста колода", + "block.twilightforest.hollow_oak_log_horizontal": "Дубова порожниста колода", + "block.twilightforest.hollow_oak_log_vertical": "Дубова порожниста колода", + "block.twilightforest.hollow_oak_sapling": "Міцний саджанець Сутінкового дуба", + "block.twilightforest.hollow_sorting_log_climbable": "Порожниста колода з сортувального дерева", + "block.twilightforest.hollow_sorting_log_horizontal": "Порожниста колода з сортувального дерева", + "block.twilightforest.hollow_sorting_log_vertical": "Порожниста колода з сортувального дерева", + "block.twilightforest.hollow_spruce_log_climbable": "Смерекова порожниста колода", + "block.twilightforest.hollow_spruce_log_horizontal": "Смерекова порожниста колода", + "block.twilightforest.hollow_spruce_log_vertical": "Смерекова порожниста колода", + "block.twilightforest.hollow_time_log_climbable": "Порожниста колода з дерева часу", + "block.twilightforest.hollow_time_log_horizontal": "Порожниста колода з дерева часу", + "block.twilightforest.hollow_time_log_vertical": "Порожниста колода з дерева часу", + "block.twilightforest.hollow_transformation_log_climbable": "Порожниста колода з дерева перетворення", + "block.twilightforest.hollow_transformation_log_horizontal": "Порожниста колода з дерева перетворення", + "block.twilightforest.hollow_transformation_log_vertical": "Порожниста колода з дерева перетворення", + "block.twilightforest.hollow_twilight_oak_log_climbable": "Порожниста колода з сутінкового дуба", + "block.twilightforest.hollow_twilight_oak_log_horizontal": "Порожниста колода з сутінкового дуба", + "block.twilightforest.hollow_twilight_oak_log_vertical": "Порожниста колода з сутінкового дуба", + "block.twilightforest.hollow_vangrove_log_climbable": "Порожниста колода з сутінкового мангрового дерева", + "block.twilightforest.hollow_vangrove_log_horizontal": "Порожниста колода з сутінкового мангрового дерева", + "block.twilightforest.hollow_vangrove_log_vertical": "Порожниста колода з сутінкового мангрового дерева", + "block.twilightforest.hollow_warped_stem_climbable": "Порожнисте химерне стебло", + "block.twilightforest.hollow_warped_stem_horizontal": "Порожнисте химерне стебло", + "block.twilightforest.hollow_warped_stem_vertical": "Порожнисте химерне стебло", + "block.twilightforest.huge_lily_pad": "Величезне латаття", + "block.twilightforest.huge_mushgloom": "Величезне стебло сутінкового світлогриба", + "block.twilightforest.huge_mushgloom_stem": "Величезне стебло сутінкового світлогриба", + "block.twilightforest.huge_stalk": "Величезне стебло", + "block.twilightforest.huge_water_lily": "Величезна водяна лілія", + "block.twilightforest.hydra_boss_spawner": "Спавнер Гідри", + "block.twilightforest.hydra_trophy": "Трофей Гідри", + "block.twilightforest.infested_towerwood": "Заражені дошки з темної вежі", + "block.twilightforest.iron_ladder": "Залізна драбина", + "block.twilightforest.ironwood_block": "Блок залізного дерева", + "block.twilightforest.jungle_banister": "Бильця з тропічного дерева", + "block.twilightforest.keepsake_casket": "Скринька пам'яті", + "block.twilightforest.knight_phantom_boss_spawner": "Спавнер Лицаря Фантома", + "block.twilightforest.knight_phantom_trophy": "Трофей Лицаря Фантома", + "block.twilightforest.knightmetal_block": "Блок з лицарського металу", + "block.twilightforest.knightmetal_block.desc": "Працює як посилений кактус", + "block.twilightforest.lich_boss_spawner": "Спавнер Ліча", + "block.twilightforest.lich_tower_miniature_structure": "Мініатюрна вежа Ліча", + "block.twilightforest.lich_trophy": "Трофей Ліча", + "block.twilightforest.liveroot_block": "Блок живокоріня", + "block.twilightforest.locked_vanishing_block": "Заблокований блок, що зникає", + "block.twilightforest.mangrove_banister": "Бильця з сутінкового мангрового дерева", + "block.twilightforest.mangrove_button": "Кнопка з сутінкового мангрового дерева", + "block.twilightforest.mangrove_chest": "Скриня з сутінкового мангрового дерева", + "block.twilightforest.mangrove_door": "Двері з сутінкового мангрового дерева", + "block.twilightforest.mangrove_fence": "Паркан з сутінкового мангрового дерева", + "block.twilightforest.mangrove_fence_gate": "Хвіртка з сутінкового мангрового дерева", + "block.twilightforest.mangrove_leaves": "Сутінкова мангрова листва", + "block.twilightforest.mangrove_log": "Сутінкова мангрова колода", + "block.twilightforest.mangrove_planks": "Дошки з сутінкового мангрового дерева", + "block.twilightforest.mangrove_pressure_plate": "Натискна плита з сутінкового мангрового дерева", + "block.twilightforest.mangrove_root": "Сутінкове мангрове коріння", + "block.twilightforest.mangrove_sapling": "Саджанець сутінкового мангрового дерева", + "block.twilightforest.mangrove_sign": "Табличка з сутінкового мангрового дерева", + "block.twilightforest.mangrove_slab": "Плита з сутінкового мангрового дерева", + "block.twilightforest.mangrove_stairs": "Сходи з сутінкового мангрового дерева", + "block.twilightforest.mangrove_trapdoor": "Люк з сутінкового мангрового дерева", + "block.twilightforest.mangrove_wall_sign": "Табличка на стіні з сутінкового мангрового дерева", + "block.twilightforest.mangrove_wood": "Сутінкова мангрова деревина", + "block.twilightforest.mayapple": "Травневе яблуко", + "block.twilightforest.mazestone": "Камінь лабіринту", + "block.twilightforest.mazestone_border": "Візерункова гранична цегла з каменя лабіринту", + "block.twilightforest.mazestone_brick": "Цегла з каменя лабіринту", + "block.twilightforest.mazestone_mosaic": "Візерункова цегла з каменя лабіринту", + "block.twilightforest.mining_banister": "Бильця з шахтарського дерева", + "block.twilightforest.mining_button": "Кнопка з шахтарського дерева", + "block.twilightforest.mining_chest": "Скриня з шахтарського дерева", + "block.twilightforest.mining_door": "Двері з шахтарського дерева", + "block.twilightforest.mining_fence": "Паркан з шахтарського дерева", + "block.twilightforest.mining_fence_gate": "Хвіртка з шахтарського дерева", + "block.twilightforest.mining_leaves": "Листя шахтарського дерева", + "block.twilightforest.mining_log": "Колода шахтарського дерева", + "block.twilightforest.mining_log_core": "Серцевина шахтарського дерева", + "block.twilightforest.mining_planks": "Дошки з шахтарського дерева", + "block.twilightforest.mining_pressure_plate": "Натискна плита з шахтарського дерева", + "block.twilightforest.mining_sapling": "Саджанець шахтарського дерева", + "block.twilightforest.mining_sign": "Табличка з шахтарського дерева", + "block.twilightforest.mining_slab": "Плита з шахтарського дерева", + "block.twilightforest.mining_stairs": "Сходи з шахтарського дерева", + "block.twilightforest.mining_trapdoor": "Люк з шахтарського дерева", + "block.twilightforest.mining_wall_sign": "Табличка на стіні з шахтарського дерева", + "block.twilightforest.mining_wood": "Колода з шахтарського дерева", + "block.twilightforest.minoshroom_boss_spawner": "Спавнер Гриботавра", + "block.twilightforest.minoshroom_trophy": "Трофей Гриботавра", + "block.twilightforest.moonworm": "Місячний черв'як", + "block.twilightforest.moss_patch": "Клаптик моху", + "block.twilightforest.mossy_castle_brick": "Мохова цегла замку", + "block.twilightforest.mossy_castle_brick_stairs": "Сходи з моховитої цегли замку", + "block.twilightforest.mossy_etched_nagastone": "Моховий гравірований нагакамінь", + "block.twilightforest.mossy_mazestone": "Мохова цегла з каменя лабіринту", + "block.twilightforest.mossy_nagastone_pillar": "Мохова колона з нагакамню", + "block.twilightforest.mossy_nagastone_stairs_left": "Мохові сходи з нагакамню (ліва)", + "block.twilightforest.mossy_nagastone_stairs_right": "Мохові сходи з нагакамню (права)", + "block.twilightforest.mossy_towerwood": "Моховиті дошки з темної вежі", + "block.twilightforest.mossy_underbrick": "Моховитий підцеглянник", + "block.twilightforest.mushgloom": "Сутінковий світлогриб", + "block.twilightforest.naga_boss_spawner": "Спавнер Наги", + "block.twilightforest.naga_courtyard_miniature_structure": "Мініатюрний двір Наги", + "block.twilightforest.naga_trophy": "Трофей Наги", + "block.twilightforest.nagastone": "Нагакамінь", + "block.twilightforest.nagastone_head": "Блок голови з нагакаміння", + "block.twilightforest.nagastone_pillar": "Колона з нагакамню", + "block.twilightforest.nagastone_stairs_left": "Сходи з нагакамню (ліва)", + "block.twilightforest.nagastone_stairs_right": "Сходи з нагакамню (права)", + "block.twilightforest.oak_banister": "Дубові бильця", + "block.twilightforest.orange_force_field": "Помаранчеве силове поле", + "block.twilightforest.pink_castle_door": "Пурпурові замкові двері", + "block.twilightforest.pink_castle_rune_brick": "Рунічна рожева цегла замку", + "block.twilightforest.pink_force_field": "Пурпурове силове поле", + "block.twilightforest.player_skull_candle": "Свічка з голови гравця", + "block.twilightforest.player_skull_candle.named": "Свічка з голови %s", + "block.twilightforest.player_wall_skull_candle": "Свічка з голови гравця на стіні", + "block.twilightforest.potted_canopy_sapling": "Саджанець сутінкової сосни в горщику", + "block.twilightforest.potted_darkwood_sapling": "Саджанець темного дерева в горщику", + "block.twilightforest.potted_dead_thorn": "Обпалений терен в горщику", + "block.twilightforest.potted_fiddlehead": "Травневе яблуко в горщику", + "block.twilightforest.potted_green_thorn": "Зелений терен в горщику", + "block.twilightforest.potted_hollow_oak_sapling": "Саджанець дебелого сутінокового дубу в горщику", + "block.twilightforest.potted_mangrove_sapling": "Саджанець мангрового дерева в горщику", + "block.twilightforest.potted_mayapple": "Травневе яблуко в горщику", + "block.twilightforest.potted_mining_sapling": "Саджанець шахтарського дерева в горщику", + "block.twilightforest.potted_mushgloom": "Сутінковий світлогриб в горщику", + "block.twilightforest.potted_rainbow_oak_sapling": "Саджанець райдужного дуба в горщику", + "block.twilightforest.potted_sorting_sapling": "Саджанець сортувального дерева в горщику", + "block.twilightforest.potted_thorn": "Терен в горщику", + "block.twilightforest.potted_time_sapling": "Саджанець дерева часу в горщику", + "block.twilightforest.potted_transformation_sapling": "Саджанець дерева перетворення в горщику", + "block.twilightforest.potted_twilight_oak_sapling": "Саджанець куцого сутінокового дубу в горщику", + "block.twilightforest.quest_ram_trophy": "Трофей квестового барана", + "block.twilightforest.rainbow_oak_leaves": "Сутінкове райдужне дубове листя", + "block.twilightforest.rainbow_oak_sapling": "Саджанець райдужного дуба", + "block.twilightforest.reactor_debris": "Уламки реактора", + "block.twilightforest.reappearing_block": "Відновлювальний блок", + "block.twilightforest.red_thread": "Червона нитка", + "block.twilightforest.root": "Коріння", + "block.twilightforest.root_strand": "Кореневі пасма", + "block.twilightforest.skeleton_skull_candle": "Свічка на черепі скелета", + "block.twilightforest.skeleton_wall_skull_candle": "Свічка на черепі скелета на стіні", + "block.twilightforest.slider": "Слайд-пастка", + "block.twilightforest.smoker": "Блок диму", + "block.twilightforest.snow_queen_boss_spawner": "Спавнер Сніжної королеви", + "block.twilightforest.snow_queen_trophy": "Трофей Сніжної королеви", + "block.twilightforest.sorting_banister": "Бильця з сортувального дерева", + "block.twilightforest.sorting_button": "Кнопка з сортувального дерева", + "block.twilightforest.sorting_chest": "Скриня з сортувального дерева", + "block.twilightforest.sorting_door": "Двері з сортувального дерева", + "block.twilightforest.sorting_fence": "Паркан з сортувального дерева", + "block.twilightforest.sorting_fence_gate": "Хвіртка з сортувального дерева", + "block.twilightforest.sorting_leaves": "Листя сортувального дерева", + "block.twilightforest.sorting_log": "Колода сортувального дерева", + "block.twilightforest.sorting_log_core": "Двигун сортувального дерева", + "block.twilightforest.sorting_planks": "Дошки з сортувального дерева", + "block.twilightforest.sorting_pressure_plate": "Натискна плита з сортувального дерева", + "block.twilightforest.sorting_sapling": "Саджанець сортувального дерева", + "block.twilightforest.sorting_sign": "Табличка з сортувального дерева", + "block.twilightforest.sorting_slab": "Плита з сортувального дерева", + "block.twilightforest.sorting_stairs": "Сходи з сортувального дерева", + "block.twilightforest.sorting_trapdoor": "Люк з сортувального дерева", + "block.twilightforest.sorting_wall_sign": "Табличка на стіні з сортувального дерева", + "block.twilightforest.sorting_wood": "Колода з сортувального дерева", + "block.twilightforest.spiral_bricks": "Спіральні кам'яні цеглини", + "block.twilightforest.spruce_banister": "Смерекові бильця", + "block.twilightforest.steeleaf_block": "Блок сталевого листа", + "block.twilightforest.stripped_canopy_log": "Обтесана сутінкова соснова колода", + "block.twilightforest.stripped_canopy_wood": "Обтесана сутінкова соснова деревина", + "block.twilightforest.stripped_dark_log": "Обтесана сутінкова темна колода", + "block.twilightforest.stripped_dark_wood": "Обтесана сутінкова темна колода", + "block.twilightforest.stripped_mangrove_log": "Обтесана сутінкова мангрова колода", + "block.twilightforest.stripped_mangrove_wood": "Обтесана сутінкова мангрова деревина", + "block.twilightforest.stripped_mining_log": "Обтесана колода шахтарського дерева", + "block.twilightforest.stripped_mining_wood": "Обтесана колода шахтарського дерева", + "block.twilightforest.stripped_sorting_log": "Обтесана колода сортувального дерева", + "block.twilightforest.stripped_sorting_wood": "Обтесана колода сортувального дерева", + "block.twilightforest.stripped_time_log": "Обтесана колода дерева часу", + "block.twilightforest.stripped_time_wood": "Обтесана колода дерева часу", + "block.twilightforest.stripped_transformation_log": "Обтесана колода дерева перетворення", + "block.twilightforest.stripped_transformation_wood": "Обтесана колода дерева перетворення", + "block.twilightforest.stripped_twilight_oak_log": "Обтесана сутінкова дубова колода", + "block.twilightforest.stripped_twilight_oak_wood": "Обтесана сутінкова дубова деревина", + "block.twilightforest.stronghold_shield": "Щит фортеці", + "block.twilightforest.thick_castle_brick": "Щільна цегла замку", + "block.twilightforest.thorn_leaves": "Листя терну", + "block.twilightforest.thorn_rose": "Тернова троянда", + "block.twilightforest.time_banister": "Бильця з дерева часу", + "block.twilightforest.time_button": "Кнопка з дерева часу", + "block.twilightforest.time_chest": "Скриня з дерева часу", + "block.twilightforest.time_door": "Двері з дерева часу", + "block.twilightforest.time_fence": "Паркан з дерева часу", + "block.twilightforest.time_fence_gate": "Хвіртка з дерева часу", + "block.twilightforest.time_leaves": "Листя дерева часу", + "block.twilightforest.time_log": "Колода дерева часу", + "block.twilightforest.time_log_core": "Годинник дерева часу", + "block.twilightforest.time_planks": "Дошки з дерева часу", + "block.twilightforest.time_pressure_plate": "Натискна плита з дерева часу", + "block.twilightforest.time_sapling": "Саджанець дерева часу", + "block.twilightforest.time_sign": "Табличка з дерева часу", + "block.twilightforest.time_slab": "Плита з дерева часу", + "block.twilightforest.time_stairs": "Сходи з дерева часу", + "block.twilightforest.time_trapdoor": "Люк з дерева часу", + "block.twilightforest.time_wall_sign": "Табличка на стіні з дерева часу", + "block.twilightforest.time_wood": "Колода з дерева часу", + "block.twilightforest.torchberry_plant": "Рослина Торчберрі", + "block.twilightforest.towerwood": "Дошки з темної вежі", + "block.twilightforest.transformation_banister": "Бильця з дерева перетворення", + "block.twilightforest.transformation_button": "Кнопка з дерева перетворення", + "block.twilightforest.transformation_chest": "Скриня з дерева перетворення", + "block.twilightforest.transformation_door": "Двері з дерева перетворення", + "block.twilightforest.transformation_fence": "Паркан з дерева перетворення", + "block.twilightforest.transformation_fence_gate": "Хвіртка з дерева перетворення", + "block.twilightforest.transformation_leaves": "Листя дерева перетворення", + "block.twilightforest.transformation_log": "Колода дерева перетворення", + "block.twilightforest.transformation_log_core": "Серце дерева перетворення", + "block.twilightforest.transformation_planks": "Дошки з дерева перетворення", + "block.twilightforest.transformation_pressure_plate": "Натискна плита з дерева перетворення", + "block.twilightforest.transformation_sapling": "Саджанець дерева перетворення", + "block.twilightforest.transformation_sign": "Табличка з дерева перетворення", + "block.twilightforest.transformation_slab": "Плита з дерева перетворення", + "block.twilightforest.transformation_stairs": "Сходи з дерева перетворення", + "block.twilightforest.transformation_trapdoor": "Люк з дерева перетворення", + "block.twilightforest.transformation_wall_sign": "Табличка на стіні з дерева перетворення", + "block.twilightforest.transformation_wood": "Колода з дерева перетворення", + "block.twilightforest.trollber": "Трольбер", + "block.twilightforest.trollsteinn": "Трольштейн", + "block.twilightforest.trollvidr": "Трольвідр", + "block.twilightforest.trophy_pedestal": "П'єдестал для трофеїв", + "block.twilightforest.twilight_oak_banister": "Бильця з сутінкового дуба", + "block.twilightforest.twilight_oak_button": "Кнопка з сутінкового дуба", + "block.twilightforest.twilight_oak_chest": "Скриня з сутінкового дуба", + "block.twilightforest.twilight_oak_door": "Двері з сутінкового дуба", + "block.twilightforest.twilight_oak_fence": "Паркан з сутінкового дуба", + "block.twilightforest.twilight_oak_fence_gate": "Хвіртка з сутінкового дуба", + "block.twilightforest.twilight_oak_leaves": "Сутінкова дубова листва", + "block.twilightforest.twilight_oak_log": "Сутінкова дубова колода", + "block.twilightforest.twilight_oak_planks": "Дошки з сутінкового дуба", + "block.twilightforest.twilight_oak_pressure_plate": "Натискна плита з сутінкового дуба", + "block.twilightforest.twilight_oak_sapling": "Хворобливий сутінковий саджанець дуба", + "block.twilightforest.twilight_oak_sign": "Табличка з сутінкового дуба", + "block.twilightforest.twilight_oak_slab": "Плита з сутінкового дуба", + "block.twilightforest.twilight_oak_stairs": "Сходи з сутінкового дуба", + "block.twilightforest.twilight_oak_trapdoor": "Люк з сутінкового дуба", + "block.twilightforest.twilight_oak_wall_sign": "Настінна табличка з сутінкового дуба", + "block.twilightforest.twilight_oak_wood": "Сутінкова дубова деревина", + "block.twilightforest.twilight_portal": "Портал сутінкового лісу", + "block.twilightforest.twilight_portal_miniature_structure": "Мініатюрний портал сутінкового лісу", + "block.twilightforest.twisted_stone": "Кручений камінь", + "block.twilightforest.twisted_stone_pillar": "Кручена кам'яна колона", + "block.twilightforest.uberous_soil": "Родючий ґрунт", + "block.twilightforest.uncrafting_table": "Стіл розкрафчування", + "block.twilightforest.underbrick": "Підцеглянник", + "block.twilightforest.underbrick_floor": "Підцеглянна підлога", + "block.twilightforest.unripe_trollber": "Неспілий трольбер", + "block.twilightforest.ur_ghast_boss_spawner": "Спавнер Ур-Ґаста", + "block.twilightforest.ur_ghast_trophy": "Трофей Ур-Ґаста", + "block.twilightforest.vangrove_banister": "Бильця з сутінкового мангрового дерева", + "block.twilightforest.vanishing_block": "Блок, що зникає", + "block.twilightforest.violet_castle_door": "Фіолетові двері замку", + "block.twilightforest.violet_castle_rune_brick": "Рунічна фіолетова цегла замку", + "block.twilightforest.violet_force_field": "Фіолетове силове поле", + "block.twilightforest.warped_banister": "Химерні бильця", + "block.twilightforest.weathered_deadrock": "Вивітрений мертвокамінь", + "block.twilightforest.wispy_cloud": "Пір'яста хмаринка", + "block.twilightforest.wither_skeleton_skull_candle": "Свічка на черепі візер-скелета", + "block.twilightforest.wither_skeleton_wall_skull_candle": "Свічка на черепі візер-скелета на стіні", + "block.twilightforest.worn_castle_brick": "Потерта цегла замку", + "block.twilightforest.worn_castle_brick_stairs": "Сходи з потертої цегли замку", + "block.twilightforest.yellow_castle_door": "Жовті двері замку", + "block.twilightforest.yellow_castle_rune_brick": "Рунічна жовта цегла замку", + "block.twilightforest.zombie_skull_candle": "Свічка з голови зомбі", + "block.twilightforest.zombie_wall_skull_candle": "Свічка з голови зомбі на стіні", + "commands.tffeature.center": "Центр об'єкта: %s", + "commands.tffeature.chunk": "Об'єкт у чанку: %s", + "commands.tffeature.nearest": "Найближчий об'єкт: %s", + "commands.tffeature.none_nearby": "Не вдалося знайти об’єкт поблизу!", + "commands.tffeature.not_in_twilight_forest": "Ви знаходитесь поза Сутінковим Лісом", + "commands.tffeature.not_player": "Цю команду має виконувати дійсний гравець!", + "commands.tffeature.structure.conquer.status": "Структура відмічена: %s", + "commands.tffeature.structure.conquer.update": "Відмітка структури %s, змінена на %s", + "commands.tffeature.structure.inside": "Ви перебуваєте в структурі орієнтира", + "commands.tffeature.structure.outside": "Ви не перебуваєте в структурі орієнтира", + "commands.tffeature.structure.required": "Ви не знаходитесь в структурі", + "commands.tffeature.structure.spawn_info": "%s, вага %s", + "commands.tffeature.structure.spawn_list": "Список спавну для цієї області це:", + "config.jade.plugin_twilightforest.quest_ram_wool": "Шерсть квестового барана", + "container.twilightforest.uncrafting_table": "Стіл розкрафтування", + "container.twilightforest.uncrafting_table.disabled": "Розкрафтування вимкнено через конфігурацію", + "container.twilightforest.uncrafting_table.disabled_item": "Розкрафтування цього предмета вимкнено.", + "death.attack.twilightforest.ant": "%1$s був роздавлений, як мураха, %2$s", + "death.attack.twilightforest.ant.item": "%1$s був розчавлений, як мураха, %2$s, який тримав %3$s", + "death.attack.twilightforest.axing": "%1$s був порубаний на шматки %2$s", + "death.attack.twilightforest.axing.item": "%1$s був порубаний на шматки %2$s використовуючи %3$s", + "death.attack.twilightforest.chillingBreath": "%1$s був заморожений до смерті Сніговою королевою", + "death.attack.twilightforest.chillingBreath.player": "%1$s був заморожений до смерті Сніговою королевою під час втечі від %2$s", + "death.attack.twilightforest.clamped": "%1$s був затоптаний до смерті %2$s", + "death.attack.twilightforest.clamped.item": "%1$s був затоптаний до смерті %2$s за допомогою %3$s", + "death.attack.twilightforest.expired": "Життя %1$s закінчилося", + "death.attack.twilightforest.expired.player": "Життя %1$s закінчилося", + "death.attack.twilightforest.fiery": "%1$s натрапив на вогняний блок", + "death.attack.twilightforest.fiery.player": "%1$s натрапив на вогняний блок під час втечі від %2$s", + "death.attack.twilightforest.fireJet": "%1$s випадково потрапив у вогняний струмінь", + "death.attack.twilightforest.fireJet.player": "%1$s випадково потрапив у вогняний струмінь під час втечі від %2$s", + "death.attack.twilightforest.frozen": "%1$s був заморожений до смерті %2$s використовуючи крижану бомбу", + "death.attack.twilightforest.frozen.item": "%1$s був заморожений до смерті %2$s використовуючи %3$s", + "death.attack.twilightforest.ghastTear": "%1$ був ошпарений вогняними сльозами", + "death.attack.twilightforest.ghastTear.player": "%1$s був ошпарений вогняними сльозами під час втечі від %2$s", + "death.attack.twilightforest.haunt": "%1$s приєднався до притулку %2$s", + "death.attack.twilightforest.haunt.item": "%1$s приєднався до притулку %2$s після того, як його вбив %3$s", + "death.attack.twilightforest.hydraBite": "Шкіра %1$s була здерта заживо Гідрою", + "death.attack.twilightforest.hydraBite.player": "Шкіра %1$s була здерта заживо Гідрою під час втечі від %2$s", + "death.attack.twilightforest.hydraFire": "%1$s був заживо спалений Гідрою", + "death.attack.twilightforest.hydraFire.player": "%1$s був заживо спалений Гідрою під час втечі від %2$s", + "death.attack.twilightforest.knightmetal": "%1$s був заколотий до смерті лицарським металевим блоком", + "death.attack.twilightforest.knightmetal.player": "%1$s був заколотий до смерті лицарським металевим блоком під час втечі від %2$s", + "death.attack.twilightforest.leafBrain": "Мозок %1$s було перетворено на листя %2$s", + "death.attack.twilightforest.leafBrain.item": "Мозок %1$s був перетворений на листя %2$s використовуючи %3$s", + "death.attack.twilightforest.lichBolt": "Точність Ліча була кращою ніж у %1$s", + "death.attack.twilightforest.lichBolt.player": "Точність Ліча і %2$s була кращою ніж у %1$s", + "death.attack.twilightforest.lichBomb": "%1$s піддався вибуховій магії Ліча", + "death.attack.twilightforest.lichBomb.player": "%1$s піддався вибуховій магії Ліча під час втечі від %2$s", + "death.attack.twilightforest.lifedrain": "Життя %1$s було висмоктане %2$s", + "death.attack.twilightforest.lifedrain.item": "Життя %1$s було висмоктане %2$s використовуючи %3$s", + "death.attack.twilightforest.lostWords": "%1$s заціпило після того, як був убитий %2$s", + "death.attack.twilightforest.lostWords.item": "%1$s заціпило після того, як був убитий %2$s використовуючи %3$s", + "death.attack.twilightforest.moonworm": "%1$s був застрелений місячним черв'яком", + "death.attack.twilightforest.reactor": "%1$s підійшов надто близько до кармінового реактора", + "death.attack.twilightforest.reactor.player": "%1$s підійшов надто близько до кармінового реактора під час втечі від %2$s", + "death.attack.twilightforest.schooled": "%1$s був вишколений %2$s", + "death.attack.twilightforest.schooled.item": "%1$s був вишколений %2$s використовуючи %3$s", + "death.attack.twilightforest.scorched": "%1$s був випалений до тла %2$s", + "death.attack.twilightforest.scorched.item": "%1$s був випалений до тла %2$s використовуючи %3$s", + "death.attack.twilightforest.slider": "%1$s був розрізаний ковзною пасткою", + "death.attack.twilightforest.slider.player": "%1$s був розрізаний ковзною пасткою під час втечі від %2$s", + "death.attack.twilightforest.snowballFight": "%1$s програв битву в сніжки %2$s", + "death.attack.twilightforest.snowballFight.item": "%1$s програв битву в сніжки %2$s використовуючи %3$s", + "death.attack.twilightforest.spiked": "%1$s був наколотий %2$s", + "death.attack.twilightforest.spiked.item": "%1$s був наколотий %2$s за допомогою %3$s", + "death.attack.twilightforest.squish": "%1$s був розчавлений Сніговою королевою", + "death.attack.twilightforest.squish.player": "%1$s був розчавлений Сніговою королевою під час втечі від %2$s", + "death.attack.twilightforest.thorns": "%1$s натрапив на терен", + "death.attack.twilightforest.thorns.player": "%1$s натрапив на терен під час втечі від %2$s", + "death.attack.twilightforest.thrownAxe": "%1$s був обезголовлений кинутою сокирою", + "death.attack.twilightforest.thrownAxe.player": "%1$s був обезголовлений кинутою сокирою під час втечі від %2$s", + "death.attack.twilightforest.thrownBlock": "%1$s був розчавлений запущеним блоком", + "death.attack.twilightforest.thrownBlock.player": "%1$s був розчавлений запущеним блоком під час втечі від %2$s", + "death.attack.twilightforest.thrownPickaxe": "%1$s був обезголовлений кинутим кайлом", + "death.attack.twilightforest.thrownPickaxe.player": "%1$s був обезголовлений кинутим кайлом під час втечі від %2$s", + "death.attack.twilightforest.yeeted": "%1$s востаннє був підкинутий", + "death.attack.twilightforest.yeeted.entity": "%1$s востаннє був підкинутий %2$s", + "death.attack.twilightforest.yeeted.item": "%1$s востаннє побачив %2$s тримаючи %3$s", + "dimension.twilightforest.twilightforest": "Сутінковий ліс", + "effect.twilightforest.frosted": "Обмороження", + "enchantment.twilightforest.chill_aura": "Аура холоду", + "enchantment.twilightforest.chill_aura.desc": "Додає шанс для зловмисника отримати заморожувальний ефект після удару по власнику.", + "enchantment.twilightforest.destruction": "Руйнування", + "enchantment.twilightforest.destruction.desc": "Дозволяє бойовій гирі розбивати блоки з вищим рівнем міцності.", + "enchantment.twilightforest.fire_react": "Вплив вогню", + "enchantment.twilightforest.fire_react.desc": "Додає шанс для зловмисника бути підпаленим після удару по власнику.", + "entity.twilightforest.adherent": "Адепт", + "entity.twilightforest.alpha_yeti": "Альфа Єті", + "entity.twilightforest.armored_giant": "Гігант в броні", + "entity.twilightforest.bighorn_sheep": "Баран-товсторіг", + "entity.twilightforest.blockchain_goblin": "Гоблін із бойовою гирею", + "entity.twilightforest.boar": "Кабан", + "entity.twilightforest.boat": "Човен", + "entity.twilightforest.carminite_broodling": "Карміновий виводок павуків", + "entity.twilightforest.carminite_ghastguard": "Карміновий вартовий ґаст", + "entity.twilightforest.carminite_ghastling": "Карміновий міні-ґаст", + "entity.twilightforest.carminite_golem": "Карміновий ґолем", + "entity.twilightforest.chain_block": "Бойова гиря", + "entity.twilightforest.charm_effect": "Ефект чарівності", + "entity.twilightforest.chest_boat": "Човен зі скринею", + "entity.twilightforest.cube_of_annihilation": "Куб знищення", + "entity.twilightforest.death_tome": "Книга смерті", + "entity.twilightforest.deer": "Олень", + "entity.twilightforest.dwarf_rabbit": "Карликовий кролик", + "entity.twilightforest.falling_ice": "Лід, що падає", + "entity.twilightforest.fire_beetle": "Вогняний жук", + "entity.twilightforest.giant_miner": "Шахтар гігант", + "entity.twilightforest.harbinger_cube": "Куб-передвісник", + "entity.twilightforest.hedge_spider": "Павук-живопліт", + "entity.twilightforest.helmet_crab": "Краб в шоломі", + "entity.twilightforest.hostile_wolf": "Ворожий вовк", + "entity.twilightforest.hydra": "Гідра", + "entity.twilightforest.hydra_mortar": "Ступка Гідри", + "entity.twilightforest.ice_arrow": "Крижана стріла", + "entity.twilightforest.ice_crystal": "Крижаний кристал", + "entity.twilightforest.ice_snowball": "Крижаний сніжок", + "entity.twilightforest.king_spider": "Королівський павук", + "entity.twilightforest.knight_phantom": "Лицар-фантом", + "entity.twilightforest.kobold": "Кобольд", + "entity.twilightforest.lich": "Ліч", + "entity.twilightforest.lich_bolt": "Болт Ліча", + "entity.twilightforest.lich_bomb": "Вибухові болти Ліча", + "entity.twilightforest.lich_minion": "Посіпака ліча", + "entity.twilightforest.lower_goblin_knight": "Лицарський гоблін-копійщик", + "entity.twilightforest.loyal_zombie": "Зомбі прислужник", + "entity.twilightforest.maze_slime": "Жук-слизовик лабіринту", + "entity.twilightforest.minoshroom": "Гриботавр", + "entity.twilightforest.minotaur": "Мінотавр", + "entity.twilightforest.mist_wolf": "Туманний вовк", + "entity.twilightforest.moonworm_shot": "Місячний черв'як", + "entity.twilightforest.mosquito_swarm": "Рій комарів", + "entity.twilightforest.naga": "Нага", + "entity.twilightforest.nature_bolt": "Болт природи", + "entity.twilightforest.penguin": "Пінгвін", + "entity.twilightforest.pinch_beetle": "Жук-щипач", + "entity.twilightforest.protection_box": "Коробка захисту прогресу", + "entity.twilightforest.quest_ram": "Квестовий баран", + "entity.twilightforest.raven": "Ворона", + "entity.twilightforest.redcap": "Гоблін з червоною шапкою", + "entity.twilightforest.redcap_sapper": "Гоблін-підривник", + "entity.twilightforest.rising_zombie": "Зомбі", + "entity.twilightforest.roving_cube": "Бродячий куб", + "entity.twilightforest.seeker_arrow": "Стріла шукача", + "entity.twilightforest.skeleton_druid": "Скелет-друїд", + "entity.twilightforest.slider": "Пересувна ковзна пастка", + "entity.twilightforest.slime_beetle": "Жук-слизовик", + "entity.twilightforest.slime_blob": "Капля слизу", + "entity.twilightforest.snow_guardian": "Сніжний вартовий", + "entity.twilightforest.snow_queen": "Сніжна королева", + "entity.twilightforest.squirrel": "Білка", + "entity.twilightforest.stable_ice_core": "Стабільне крижане ядро", + "entity.twilightforest.swarm_spider": "Ройовий павук", + "entity.twilightforest.thrown_block": "Кинутий блок", + "entity.twilightforest.thrown_wep": "Викинута зброя", + "entity.twilightforest.tiny_bird": "Крихітна пташка", + "entity.twilightforest.tome_bolt": "Болт книги смерті", + "entity.twilightforest.towerwood_borer": "Термітна лусківниця", + "entity.twilightforest.troll": "Троль", + "entity.twilightforest.unstable_ice_core": "Нестабільне крижане ядро", + "entity.twilightforest.upper_goblin_knight": "Гоблін-копійщик", + "entity.twilightforest.ur_ghast": "Ур-Ґаст", + "entity.twilightforest.wand_bolt": "Болт сутінкового скіпетра", + "entity.twilightforest.winter_wolf": "Зимовий вовк", + "entity.twilightforest.wraith": "Привид", + "entity.twilightforest.yeti": "Єті", + "gamerule.tfEnforcedProgression": "Сутінковий ліс: Примусовий прогрес", + "gamerule.tfEnforcedProgression.description": "Деякі біоми Сутінкового лісу будуть заблоковані, доки ви не переможете певних босів у вимірі. (Ви можете перевірити порядок прогресу у своїх досягненнях)", + "gui.twilightforest.crumble_horn_jei": "Ріг руйнування", + "gui.twilightforest.optifine.message": "Перш ніж продовжити, зауважте, що Optifine, як відомо, спричиняє збої, візуальні помилки багатокомпонентних об’єктів і багато інших проблем.\n\nПерш ніж поскаржитися про помилку, спершу видаліть Optifine та перевірте ще раз, щоб перевірити, чи проблема все ще є.\n\nПроблеми, пов’язані з Optifine, неможливо вирішити з боку Сутінкового лісу!\n\nЦей екран може бути вимкнено в конфігурації клієнта.", + "gui.twilightforest.optifine.suggestions": "Ось вибір модів, які ми рекомендуємо використовувати натомість.", + "gui.twilightforest.optifine.title": "ПОПЕРЕДЖЕННЯ: ВИЯВЛЕНО OPTIFINE", + "gui.twilightforest.transformation_jei": "Порошок перетворення", + "gui.twilightforest.uncrafting_jei": "Розкрафтити", + "item.twilightforest.adherent_spawn_egg": "Яйце виклику Адепта", + "item.twilightforest.alpha_yeti_banner_pattern": "Візерунок стяга", + "item.twilightforest.alpha_yeti_banner_pattern.desc": "Обличчя Альфа Єті", + "item.twilightforest.alpha_yeti_fur": "Хутро Альфа Єті", + "item.twilightforest.alpha_yeti_spawn_egg": "Яйце виклику Альфа Єті", + "item.twilightforest.arctic_armor.desc": "Фарбується", + "item.twilightforest.arctic_boots": "Арктичні чоботи", + "item.twilightforest.arctic_chestplate": "Арктична куртка", + "item.twilightforest.arctic_fur": "Арктичне хутро", + "item.twilightforest.arctic_helmet": "Арктична шапка", + "item.twilightforest.arctic_leggings": "Арктичні наголінники", + "item.twilightforest.armor_shard": "Уламок броні", + "item.twilightforest.armor_shard_cluster": "Купа уламків броні", + "item.twilightforest.armored_giant_spawn_egg": "Яйце виклику гіганта в броні", + "item.twilightforest.bighorn_sheep_spawn_egg": "Яйце виклику барана-товсторога", + "item.twilightforest.block_and_chain": "Бойова гиря", + "item.twilightforest.blockchain_goblin_spawn_egg": "Яйце виклику гобліна із бойовою гирею", + "item.twilightforest.boar_spawn_egg": "Яйце виклику кабана", + "item.twilightforest.borer_essence": "Есенція термітів-лусківниць", + "item.twilightforest.brittle_potion_flask": "Крихка колба для зілля", + "item.twilightforest.canopy_boat": "Човен з сутінкової сосни", + "item.twilightforest.canopy_chest_boat": "Човен зі скринею з сутінкової сосни", + "item.twilightforest.carminite": "Кармін", + "item.twilightforest.carminite_broodling_spawn_egg": "Яйце виклику карміновому виводку павуків", + "item.twilightforest.carminite_ghastguard_spawn_egg": "Яйце виклику кармінового вартового ґаста", + "item.twilightforest.carminite_ghastling_spawn_egg": "Яйце виклику кармінового міні-ґаста", + "item.twilightforest.carminite_golem_spawn_egg": "Яйце виклику кармінового ґолема", + "item.twilightforest.charm_of_keeping_1": "Амулет інвентаря І", + "item.twilightforest.charm_of_keeping_2": "Амулет інвентаря ІI", + "item.twilightforest.charm_of_keeping_3": "Амулет інвентаря ІII", + "item.twilightforest.charm_of_life_1": "Амулет життя I", + "item.twilightforest.charm_of_life_2": "Амулет життя II", + "item.twilightforest.cooked_meef": "Смажене м'ясо мінотавра", + "item.twilightforest.cooked_venison": "Стейк з оленини", + "item.twilightforest.crumble_horn": "Ріг руйнування", + "item.twilightforest.cube_of_annihilation": "Куб знищення", + "item.twilightforest.cube_talisman": "Талісман куба", + "item.twilightforest.dark_boat": "Човен з темного дерева", + "item.twilightforest.dark_chest_boat": "Човен зі скринею з темного дерева", + "item.twilightforest.death_tome_spawn_egg": "Яйце виклику книги смерті", + "item.twilightforest.deer_spawn_egg": "Яйце виклику оленя", + "item.twilightforest.diamond_minotaur_axe": "Діамантова сокира мінотавра", + "item.twilightforest.dwarf_rabbit_spawn_egg": "Яйце виклику карликового кролика", + "item.twilightforest.ender_bow": "Ендер-лук", + "item.twilightforest.fiery_armor.desc": "Підпалює нападника", + "item.twilightforest.fiery_blood": "Вогняна кров", + "item.twilightforest.fiery_boots": "Вогняні чоботи", + "item.twilightforest.fiery_chestplate": "Вогняний нагрудник", + "item.twilightforest.fiery_helmet": "Вогняний шолом", + "item.twilightforest.fiery_ingot": "Вогняний злиток", + "item.twilightforest.fiery_leggings": "Вогняні наголінники", + "item.twilightforest.fiery_pickaxe": "Вогняне кайло", + "item.twilightforest.fiery_pickaxe.desc": "Автоплавка", + "item.twilightforest.fiery_sword": "Вогняний меч", + "item.twilightforest.fiery_sword.desc": "Підпалює ціль", + "item.twilightforest.fiery_tears": "Вогняні сльози", + "item.twilightforest.filled_magic_map": "Чарівна мапа", + "item.twilightforest.filled_maze_map": "Мапа лабіринту", + "item.twilightforest.filled_ore_map": "Мапа лібиринту/руди", + "item.twilightforest.fire_beetle_spawn_egg": "Яйце виклику вогняного жука", + "item.twilightforest.flask.doses": "Дози: %s/%s", + "item.twilightforest.flask.no_refill": "Не може бути повторно заповнене", + "item.twilightforest.fortification_scepter": "Скіпетр укріплення", + "item.twilightforest.giant_miner_spawn_egg": "Яйце виклику шахтаря гіганта", + "item.twilightforest.giant_pickaxe": "Кайло велетня", + "item.twilightforest.giant_pickaxe.desc": "Розбиває гігантські блоки", + "item.twilightforest.giant_sword": "Меч велетня", + "item.twilightforest.glass_sword": "Скляний меч", + "item.twilightforest.glass_sword.desc": "Доступно лише у творчому режимі", + "item.twilightforest.gold_minotaur_axe": "Золота сокира мінотавра", + "item.twilightforest.greater_potion_flask": "Надійна колба для зілля", + "item.twilightforest.harbinger_cube_spawn_egg": "Яйце виклику куба-передвісника", + "item.twilightforest.hedge_spider_spawn_egg": "Яйце виклику павука живоплота", + "item.twilightforest.helmet_crab_spawn_egg": "Яйце виклику караба в шоломі", + "item.twilightforest.hostile_wolf_spawn_egg": "Яйце виклику ворожого вовка", + "item.twilightforest.hydra_banner_pattern": "Візерунок стяга", + "item.twilightforest.hydra_banner_pattern.desc": "Полум'я Гідри", + "item.twilightforest.hydra_chop": "М'ясо гідри", + "item.twilightforest.hydra_spawn_egg": "Яйце виклику Гідри", + "item.twilightforest.ice_bomb": "Крижана бомба", + "item.twilightforest.ice_bow": "Крижаний лук", + "item.twilightforest.ice_crystal_spawn_egg": "Яйце виклику крижаного кристала", + "item.twilightforest.ice_sword": "Крижаний меч", + "item.twilightforest.ironwood_axe": "Сокира із залізного дерева", + "item.twilightforest.ironwood_boots": "Чоботи із залізного дерева", + "item.twilightforest.ironwood_chestplate": "Нагрудник із залізного дерева", + "item.twilightforest.ironwood_helmet": "Шолом із залізного дерева", + "item.twilightforest.ironwood_hoe": "Мотика із залізного дерева", + "item.twilightforest.ironwood_ingot": "Злиток залізного дерева", + "item.twilightforest.ironwood_leggings": "Наголінники із залізного дерева", + "item.twilightforest.ironwood_pickaxe": "Кайло із залізного дерева", + "item.twilightforest.ironwood_shovel": "Лопата із залізного дерева", + "item.twilightforest.ironwood_sword": "Меч із залізного дерева", + "item.twilightforest.king_spider_spawn_egg": "Яйце виклику королівського павука", + "item.twilightforest.knight_phantom_banner_pattern": "Візерунок стяга", + "item.twilightforest.knight_phantom_banner_pattern.desc": "Лицарський шолом", + "item.twilightforest.knight_phantom_spawn_egg": "Яйце виклику лицаря-фантома", + "item.twilightforest.knightmetal_axe": "Лицарська сокира", + "item.twilightforest.knightmetal_axe.desc": "Додаткова шкода по цілям не в обладунках", + "item.twilightforest.knightmetal_boots": "Лицарські чоботи", + "item.twilightforest.knightmetal_chestplate": "Лицарський нагрудник", + "item.twilightforest.knightmetal_helmet": "Лицарський шолом", + "item.twilightforest.knightmetal_ingot": "Злиток лицарського металу", + "item.twilightforest.knightmetal_leggings": "Лицарські наголінники", + "item.twilightforest.knightmetal_pickaxe": "Лицарське кайло", + "item.twilightforest.knightmetal_pickaxe.desc": "Додаткова шкода по цілям в обладунках", + "item.twilightforest.knightmetal_ring": "Ланка з лицарського металу", + "item.twilightforest.knightmetal_shield": "Лицарський щит", + "item.twilightforest.knightmetal_sword": "Лицарський меч", + "item.twilightforest.knightmetal_sword.desc": "Додаткова шкода по цілям в обладунках", + "item.twilightforest.kobold_spawn_egg": "Яйце виклику кобольда", + "item.twilightforest.lamp_of_cinders": "Лампа з недогарки", + "item.twilightforest.lich_banner_pattern": "Візерунок стяга", + "item.twilightforest.lich_banner_pattern.desc": "Корона Ліча", + "item.twilightforest.lich_spawn_egg": "Яйце виклику Ліча", + "item.twilightforest.lifedrain_scepter": "Скіпетр вичерпання життя", + "item.twilightforest.liveroot": "Живокорінь", + "item.twilightforest.lower_goblin_knight_spawn_egg": "Яйце виклику гобліна-лицаря", + "item.twilightforest.magic_beans": "Чарівні боби", + "item.twilightforest.magic_map": "Порожня чарівна мапа", + "item.twilightforest.magic_map_focus": "Фокус чарівної мапи", + "item.twilightforest.mangrove_boat": "Мангровий човен", + "item.twilightforest.mangrove_chest_boat": "Мангровий човен зі скринею", + "item.twilightforest.maze_map": "Порожня мапа лабіринту", + "item.twilightforest.maze_map_focus": "Фокус мапи лабіринту", + "item.twilightforest.maze_slime_spawn_egg": "Яйце виклику жука-слизовика лабіринту", + "item.twilightforest.maze_wafer": "Вафлі", + "item.twilightforest.mazebreaker_pickaxe": "Руйнівник лабіринту", + "item.twilightforest.meef_stroganoff": "Бефстроганов", + "item.twilightforest.mining_boat": "Човен з шахтарського дерева", + "item.twilightforest.mining_chest_boat": "Човен зі скринею з темного дерева", + "item.twilightforest.minoshroom_banner_pattern": "Візерунок стяга", + "item.twilightforest.minoshroom_banner_pattern.desc": "Сокира Гриботавра", + "item.twilightforest.minoshroom_spawn_egg": "Яйце виклику Гриботавра", + "item.twilightforest.minotaur_axe.desc": "Додаткова шкода під час бігу", + "item.twilightforest.minotaur_spawn_egg": "Яйце виклику мінотавра", + "item.twilightforest.mist_wolf_spawn_egg": "Яйце виклику туманного вовка", + "item.twilightforest.moon_dial": "Годинник місячних фаз", + "item.twilightforest.moon_dial.phase_0": "Повний Місяць", + "item.twilightforest.moon_dial.phase_1": "Місяць, що згасає", + "item.twilightforest.moon_dial.phase_2": "Остання чверть", + "item.twilightforest.moon_dial.phase_3": "Старий Місяць", + "item.twilightforest.moon_dial.phase_4": "Новий Місяць", + "item.twilightforest.moon_dial.phase_5": "Молодий Місяць", + "item.twilightforest.moon_dial.phase_6": "Перша чверть", + "item.twilightforest.moon_dial.phase_7": "Місяць, що прибуває", + "item.twilightforest.moon_dial.phase_unknown": "Фаза місяця невизначена", + "item.twilightforest.moon_dial.phase_unknown_fools": "404 місяць не знайдено", + "item.twilightforest.moonworm_queen": "Королева місячних черв'яків", + "item.twilightforest.mosquito_swarm_spawn_egg": "Яйце виклику рою комарів", + "item.twilightforest.music_disc_findings": "Сутінкова платівка", + "item.twilightforest.music_disc_findings.desc": "MrCompost — Знахідки", + "item.twilightforest.music_disc_home": "Сутінкова платівка", + "item.twilightforest.music_disc_home.desc": "MrCompost — Головна", + "item.twilightforest.music_disc_maker": "Сутінкова платівка", + "item.twilightforest.music_disc_maker.desc": "MrCompost — Творець", + "item.twilightforest.music_disc_motion": "Сутінкова платівка", + "item.twilightforest.music_disc_motion.desc": "MrCompost — Рух", + "item.twilightforest.music_disc_radiance": "Сутінкова платівка", + "item.twilightforest.music_disc_radiance.desc": "Rotch Gwylt — Сяйво", + "item.twilightforest.music_disc_steps": "Сутінкова платівка", + "item.twilightforest.music_disc_steps.desc": "Rotch Gwylt — Кроки", + "item.twilightforest.music_disc_superstitious": "Сутінкова платівка", + "item.twilightforest.music_disc_superstitious.desc": "Rotch Gwylt — Забобонний", + "item.twilightforest.music_disc_thread": "Сутінкова платівка", + "item.twilightforest.music_disc_thread.desc": "MrCompost — Тема", + "item.twilightforest.music_disc_wayfarer": "Сутінкова платівка", + "item.twilightforest.music_disc_wayfarer.desc": "MrCompost — Мандрівник", + "item.twilightforest.naga_banner_pattern": "Візерунок стяга", + "item.twilightforest.naga_banner_pattern.desc": "Луска Наги", + "item.twilightforest.naga_chestplate": "Нагрудник з луски Наги", + "item.twilightforest.naga_leggings": "Наголінники з луски Наги", + "item.twilightforest.naga_scale": "Луска Наги", + "item.twilightforest.naga_spawn_egg": "Яйце виклику Наги", + "item.twilightforest.ore_magnet": "Рудний магніт", + "item.twilightforest.ore_map": "Порожня мапа лабіринту/руди", + "item.twilightforest.ore_meter": "Локатор руд", + "item.twilightforest.peacock_feather_fan": "Віяло з павиного пір'я", + "item.twilightforest.penguin_spawn_egg": "Яйце виклику пінгвіна", + "item.twilightforest.phantom_armor.desc": "Не можна втратити після смерті", + "item.twilightforest.phantom_chestplate": "Нагрудник фантома", + "item.twilightforest.phantom_helmet": "Шолом фантома", + "item.twilightforest.pinch_beetle_spawn_egg": "Яйце виклику жука-щипача", + "item.twilightforest.quest_ram_banner_pattern": "Візерунок стяга", + "item.twilightforest.quest_ram_banner_pattern.desc": "Вихори квестового барану", + "item.twilightforest.quest_ram_spawn_egg": "Яйце виклику квестового барана", + "item.twilightforest.raven_feather": "Перо ворона", + "item.twilightforest.raven_spawn_egg": "Яйце виклику ворони", + "item.twilightforest.raw_ironwood": "Необроблене залізне дерево", + "item.twilightforest.raw_meef": "Сире м'ясо мінотавра", + "item.twilightforest.raw_venison": "Сира оленина", + "item.twilightforest.redcap_sapper_spawn_egg": "Яйце виклику гобліна-підривника у червоній шапці", + "item.twilightforest.redcap_spawn_egg": "Яйце виклику гобліна з червоною шапочкою", + "item.twilightforest.scepter.desc": "%s зарядів залишилося", + "item.twilightforest.seeker_bow": "Лук шукача", + "item.twilightforest.skeleton_druid_spawn_egg": "Яйце виклику скелета-друїда", + "item.twilightforest.skull_candle.desc": "Має: %s %s свічок", + "item.twilightforest.skull_candle.desc.multiple": "Має: %s %s свічок", + "item.twilightforest.slime_beetle_spawn_egg": "Яйце виклику жука-слизовика", + "item.twilightforest.snow_guardian_spawn_egg": "Яйце виклику сніжного вартового", + "item.twilightforest.snow_queen_banner_pattern": "Візерунок стяга", + "item.twilightforest.snow_queen_banner_pattern.desc": "Корона Снігової королеви", + "item.twilightforest.snow_queen_spawn_egg": "Яйце виклику сніжної королеви", + "item.twilightforest.sorting_boat": "Човен з сортувального дерева", + "item.twilightforest.sorting_chest_boat": "Човен зі скринею з сортувального дерева", + "item.twilightforest.squirrel_spawn_egg": "Яйце виклику білки", + "item.twilightforest.stable_ice_core_spawn_egg": "Яйце виклику стабільного крижаного ядра", + "item.twilightforest.steeleaf_axe": "Сокира із сталевих листків", + "item.twilightforest.steeleaf_boots": "Чоботи із сталевих листків", + "item.twilightforest.steeleaf_chestplate": "Нагрудник із сталевих листків", + "item.twilightforest.steeleaf_helmet": "Шолом із сталевих листків", + "item.twilightforest.steeleaf_hoe": "Мотика із сталевих листків", + "item.twilightforest.steeleaf_ingot": "Сталевий лист", + "item.twilightforest.steeleaf_leggings": "Наголінники із сталевих листків", + "item.twilightforest.steeleaf_pickaxe": "Кайло із сталевих листків", + "item.twilightforest.steeleaf_shovel": "Лопата із сталевих листків", + "item.twilightforest.steeleaf_sword": "Меч із сталевих листків", + "item.twilightforest.swarm_spider_spawn_egg": "Яйце виклику ройовго павука", + "item.twilightforest.time_boat": "Човен з дерева часу", + "item.twilightforest.time_chest_boat": "Човен зі скринею з темного дерева", + "item.twilightforest.tiny_bird_spawn_egg": "Яйце виклику крихітної пташки", + "item.twilightforest.torchberries": "Смолоскипні ягоди", + "item.twilightforest.tower_key": "Ключ від вежі", + "item.twilightforest.towerwood_borer_spawn_egg": "Яйце виклику термітної лусківниці", + "item.twilightforest.transformation_boat": "Човен з дерева перетворення", + "item.twilightforest.transformation_chest_boat": "Човен зі скринею з дерева перетворення", + "item.twilightforest.transformation_powder": "Порошок перетворення", + "item.twilightforest.triple_bow": "Трилук", + "item.twilightforest.troll_spawn_egg": "Яйце виклику троля", + "item.twilightforest.twilight_oak_boat": "Човен з сутінкового дуба", + "item.twilightforest.twilight_oak_chest_boat": "Човен зі скринею з сутінкового дуба", + "item.twilightforest.twilight_scepter": "Скіпетр сутінків", + "item.twilightforest.unstable_ice_core_spawn_egg": "Яйце виклику нестабільного крижаного ядра", + "item.twilightforest.ur_ghast_banner_pattern": "Візерунок стяга", + "item.twilightforest.ur_ghast_banner_pattern.desc": "Кармінова грань", + "item.twilightforest.ur_ghast_spawn_egg": "Яйце виклику ур-Ґаста", + "item.twilightforest.winter_wolf_spawn_egg": "Яйце виклику зимного вовка", + "item.twilightforest.wraith_spawn_egg": "Яйце виклику привида", + "item.twilightforest.yeti_armor.desc": "Обморожує нападника", + "item.twilightforest.yeti_boots": "Чоботи Єті", + "item.twilightforest.yeti_chestplate": "Куртка Єті", + "item.twilightforest.yeti_helmet": "Рогатий шолом Єті", + "item.twilightforest.yeti_leggings": "Наголінники Єті", + "item.twilightforest.yeti_spawn_egg": "Яйце виклику єті", + "item.twilightforest.zombie_scepter": "Скіпетр зомбі", + "itemGroup.twilightforest.blocks": "Сутінковий ліс: Блоки", + "itemGroup.twilightforest.equipment": "Сутінковий ліс: Спорядження", + "itemGroup.twilightforest.items": "Сутінковий ліс: Предмети", + "misc.twilightforest.advancement_hidden": "<Приховані досягнення>", + "misc.twilightforest.advancement_required": "Потрібне досягнення:", + "misc.twilightforest.biome_locked": "Біом закрито!", + "misc.twilightforest.biome_locked_2": "Перевірте свої досягнення", + "misc.twilightforest.core_disabled": "%s вимкнено у конфігурації", + "misc.twilightforest.firefly_spawner_radius": "Радіус частинок світлячка: %s блоків", + "misc.twilightforest.magic_map_fail": "Магія похитнулася. Можливо тут це не працює?", + "misc.twilightforest.nyi": "Цей блок має ефекти, які ще не реалізовані.", + "misc.twilightforest.ore_meter_exposed": "Виявлено: %s", + "misc.twilightforest.ore_meter_range": "Радіус: %s, Походження: [%s, %s]", + "misc.twilightforest.pedestal_ineligible": "Ви негідні.", + "misc.twilightforest.portal_unsafe": "Здається, тут небезпечно...", + "misc.twilightforest.portal_unworthy": "Портальний басейн не відповідає. Може, ти щось проґавив?", + "misc.twilightforest.wip0": "Над цією функцією працюють і можуть бути помилки або небажані ефекти, які можуть пошкодити ваш світ.", + "misc.twilightforest.wip1": "Використовуйте з обережністю.", + "stat.twilightforest.blocks_crumbled": "Розсипані блоки", + "stat.twilightforest.bugs_squished": "Жуки були розчавлені", + "stat.twilightforest.e115_slices_eaten": "Експеримент 115 був з’їдений", + "stat.twilightforest.keeping_charms_activated": "Амулет інвентарю використано", + "stat.twilightforest.life_charms_activated": "Амулет життя використано", + "stat.twilightforest.skull_candles_made": "Створені свічки з черепами", + "stat.twilightforest.tf_shields_broken": "Розбиті оборонні щити", + "stat.twilightforest.torchberries_harvested": "Смолоскипні ягоди зібрані", + "stat.twilightforest.trophy_pedestals_activated": "П'єдестал для трофеїв активовано", + "stat.twilightforest.uncrafting_table_interactions": "Взаємодія зі столом розкрафчування", + "structure.twilightforest.aurora_palace": "Палац Аврори", + "structure.twilightforest.dark_tower": "Темна вежа", + "structure.twilightforest.final_castle": "Замок Фінальне Плато", + "structure.twilightforest.hedge_maze": "Лабіринт з живоплоту", + "structure.twilightforest.hydra_lair": "Лігво Гідри", + "structure.twilightforest.knight_stronghold": "Фортеця Лицаря", + "structure.twilightforest.labyrinth": "Лабіринт Мінотавра", + "structure.twilightforest.large_hollow_hill": "Великий порожнистий пагорб", + "structure.twilightforest.lich_tower": "Вежа Ліча", + "structure.twilightforest.medium_hollow_hill": "Середній порожнистий пагорб", + "structure.twilightforest.mushroom_tower": "Грибний замок", + "structure.twilightforest.naga_courtyard": "Подвір'я Наги", + "structure.twilightforest.quest_grove": "Гай квестів", + "structure.twilightforest.small_hollow_hill": "Маленький порожнистий пагорб", + "structure.twilightforest.troll_cave": "Печера тролів", + "structure.twilightforest.yeti_cave": "Печера Єті", + "subtitles.twilightforest.block.beanstalk.grow": "Земля гуркоче", + "subtitles.twilightforest.block.boss_chest.appear": "З'являється скриня боса", + "subtitles.twilightforest.block.bug.squish": "Жука розчавлено :(", + "subtitles.twilightforest.block.builder.create": "Карміновий будівельник створює блок", + "subtitles.twilightforest.block.builder.off": "Карміновий будівельник дезактивується", + "subtitles.twilightforest.block.builder.on": "Карміновий будівельник активується", + "subtitles.twilightforest.block.builder.replace": "Термін дії вбудованого блоку закінчується", + "subtitles.twilightforest.block.casket.close": "Скринька пам'яті зачиняється", + "subtitles.twilightforest.block.casket.locked": "Скринька пам'яті клацає", + "subtitles.twilightforest.block.casket.open": "Скриньку пам'яті відкрито", + "subtitles.twilightforest.block.casket.repair": "Скринька пам'яті відремонтована", + "subtitles.twilightforest.block.cicada": "Цикада цвіркоче", + "subtitles.twilightforest.block.core.time": "Дерево часу тікає", + "subtitles.twilightforest.block.core.transformation": "Дерево перетворення гуде", + "subtitles.twilightforest.block.door.activate": "Двері замку клацають", + "subtitles.twilightforest.block.door.reappear": "Двері замку з'являються знову", + "subtitles.twilightforest.block.door.vanish": "Двері замку зникають", + "subtitles.twilightforest.block.generic.annihilation": "Блок розчиняється", + "subtitles.twilightforest.block.ghast_trap.ambient": "Пастка для ґаста дзвенить", + "subtitles.twilightforest.block.ghast_trap.on": "Пастка для ґаста гуде", + "subtitles.twilightforest.block.ghast_trap.spindown": "Пастка для ґаста вимикається", + "subtitles.twilightforest.block.ghast_trap.warmup": "Пастка для ґаста розігрівається", + "subtitles.twilightforest.block.jet.active": "Блок вогню спалахує", + "subtitles.twilightforest.block.jet.pop": "Блок вогню струменить", + "subtitles.twilightforest.block.jet.start": "Активується вогняний струмінь", + "subtitles.twilightforest.block.portal.whoosh": "Портал Сутінкового лісу манить", + "subtitles.twilightforest.block.reactor.ambient": "Карміновий реактор завиває", + "subtitles.twilightforest.block.reappearing_block.reappear": "Знову з’являється блок, що відновлюється", + "subtitles.twilightforest.block.reappearing_block.vanish": "Знову зникає блок, що відновлюється", + "subtitles.twilightforest.block.slider.move": "Розсувна пастка скрипить", + "subtitles.twilightforest.block.smoker.start": "Курець активується", + "subtitles.twilightforest.block.torchberry.harvest": "Смолоскипні ягоди зібрано", + "subtitles.twilightforest.block.trophy_pedestal.activate": "П'єдестал для трофеїв приймає трофей", + "subtitles.twilightforest.block.vanish.locked": "Двері з темної вежі клацають", + "subtitles.twilightforest.block.vanish.unlock": "Блок, що зникає, розблоковано", + "subtitles.twilightforest.block.vanish.vanish": "Зникає блок, що зникає", + "subtitles.twilightforest.entity.alpha_yeti.alert": "Альфа Єті помічає", + "subtitles.twilightforest.entity.alpha_yeti.death": "Альфа Єті гине", + "subtitles.twilightforest.entity.alpha_yeti.grab": "Альфа Єті хапає", + "subtitles.twilightforest.entity.alpha_yeti.growl": "Альфа Єті гарчить", + "subtitles.twilightforest.entity.alpha_yeti.hurt": "Альфа Єті поранено", + "subtitles.twilightforest.entity.alpha_yeti.ice": "Альфа Єті кидає лід", + "subtitles.twilightforest.entity.alpha_yeti.pant": "Альфа Єті задихається", + "subtitles.twilightforest.entity.alpha_yeti.roar": "Альфа Єті реве", + "subtitles.twilightforest.entity.alpha_yeti.throw": "Альфа Єті кидає", + "subtitles.twilightforest.entity.bighorn_sheep.ambient": "Баран-товсторіг мекає", + "subtitles.twilightforest.entity.bighorn_sheep.death": "Баран-товсторіг гине", + "subtitles.twilightforest.entity.bighorn_sheep.hurt": "Барана-товсторіга поранено", + "subtitles.twilightforest.entity.blockchain_goblin.ambient": "Гоблін із бойовою гирею хіхікає", + "subtitles.twilightforest.entity.blockchain_goblin.death": "Гоблін із бойовою гирею гине", + "subtitles.twilightforest.entity.blockchain_goblin.hurt": "Гоблін із бойовою гирею верещить", + "subtitles.twilightforest.entity.boar.ambient": "Дикий кабан хрюкає", + "subtitles.twilightforest.entity.boar.death": "Дикий кабан помирає", + "subtitles.twilightforest.entity.boar.hurt": "Дикого кабана поранено", + "subtitles.twilightforest.entity.carminite_broodling.ambient": "Карміновий виводок павуків шипить", + "subtitles.twilightforest.entity.carminite_broodling.death": "Карміновий виводок павуків гине", + "subtitles.twilightforest.entity.carminite_broodling.hurt": "Карміновий виводок павуків поранено", + "subtitles.twilightforest.entity.carminite_ghastguard.ambient": "Карміновий вартовий ґаст плаче", + "subtitles.twilightforest.entity.carminite_ghastguard.death": "Карміновий вартовий ґаст гине", + "subtitles.twilightforest.entity.carminite_ghastguard.hurt": "Карміновий вартовий ґаст верещить", + "subtitles.twilightforest.entity.carminite_ghastguard.shoot": "Карміновий вартовий ґаст стріляє", + "subtitles.twilightforest.entity.carminite_ghastling.ambient": "Карміновий міні-ґаст плаче", + "subtitles.twilightforest.entity.carminite_ghastling.death": "Карміновий міні-ґаст гине", + "subtitles.twilightforest.entity.carminite_ghastling.hurt": "Карміновий міні-ґаст верещить", + "subtitles.twilightforest.entity.carminite_ghastling.shoot": "Карміновий міні-ґаст стріляє", + "subtitles.twilightforest.entity.carminite_golem.attack": "Карміновий ґолем гойдається", + "subtitles.twilightforest.entity.carminite_golem.death": "Карміновий ґолем гине", + "subtitles.twilightforest.entity.carminite_golem.hurt": "Кармінового ґолема поранено", + "subtitles.twilightforest.entity.death_tome.ambient": "Книга смерті перегортає сторінки", + "subtitles.twilightforest.entity.death_tome.death": "Книга смерті розірвалась на частини", + "subtitles.twilightforest.entity.death_tome.hurt": "Книга смерті розкривається", + "subtitles.twilightforest.entity.deer.ambient": "Дикий олень мичить", + "subtitles.twilightforest.entity.deer.death": "Дикий олень помирає", + "subtitles.twilightforest.entity.deer.hurt": "Дикого оленя поранено", + "subtitles.twilightforest.entity.dwarf_rabbit.ambient": "Карликовий кролик пищить", + "subtitles.twilightforest.entity.dwarf_rabbit.death": "Карликовий кролик помирає", + "subtitles.twilightforest.entity.dwarf_rabbit.hurt": "Карликового кролика поранено", + "subtitles.twilightforest.entity.fire_beetle.death": "Вогняний жук гине", + "subtitles.twilightforest.entity.fire_beetle.hurt": "Вогняного жука поранено", + "subtitles.twilightforest.entity.fire_beetle.shoot": "Вогняний жук вивергає полум'я", + "subtitles.twilightforest.entity.goblin_knight.ambient": "Гоблін-копійщик хіхікає", + "subtitles.twilightforest.entity.goblin_knight.death": "Гоблін-копійщик стогне в агонії", + "subtitles.twilightforest.entity.goblin_knight.hurt": "Гоблін-копійщик верещить від болю", + "subtitles.twilightforest.entity.goblin_knight.muffled.ambient": "Лицарський гоблін-копійщик хіхікає", + "subtitles.twilightforest.entity.goblin_knight.muffled.death": "Лицарський гоблін-копійщик стогне в агонії", + "subtitles.twilightforest.entity.goblin_knight.muffled.hurt": "Лицарський гоблін-копійщик верещить від болю", + "subtitles.twilightforest.entity.hedge_spider.ambient": "Павук-живопліт шипить", + "subtitles.twilightforest.entity.hedge_spider.death": "Павук-живопліт гине", + "subtitles.twilightforest.entity.hedge_spider.hurt": "Павука-живопліта поранено", + "subtitles.twilightforest.entity.helmet_crab.death": "Краб в шоломі гине", + "subtitles.twilightforest.entity.helmet_crab.hurt": "Краба в шоломі поранено", + "subtitles.twilightforest.entity.hostile_wolf.ambient": "Ворожий вовк гарчить", + "subtitles.twilightforest.entity.hostile_wolf.death": "Ворожий вовк гине", + "subtitles.twilightforest.entity.hostile_wolf.hurt": "Ворожого вовка поранено", + "subtitles.twilightforest.entity.hostile_wolf.target": "Ворожий вовк помічає", + "subtitles.twilightforest.entity.hydra.death": "Гідра реве від поразки", + "subtitles.twilightforest.entity.hydra.growl": "Гідра ричить", + "subtitles.twilightforest.entity.hydra.hurt": "Гідру поранено", + "subtitles.twilightforest.entity.hydra.roar": "Гідра реве", + "subtitles.twilightforest.entity.hydra.shoot": "Гідра стріляє знаряддям", + "subtitles.twilightforest.entity.hydra.shoot_fire": "Гідра стріляє вогнем", + "subtitles.twilightforest.entity.hydra.warn": "Гідра готується до укусу", + "subtitles.twilightforest.entity.ice.ambient": "Крижане ядро потріскує", + "subtitles.twilightforest.entity.ice.death": "Крижане ядро помирає", + "subtitles.twilightforest.entity.ice.hurt": "Крижане ядро поранено", + "subtitles.twilightforest.entity.ice.shoot": "Крижане ядро кидає сніжку", + "subtitles.twilightforest.entity.king_spider.ambient": "Королівський павук шипить", + "subtitles.twilightforest.entity.king_spider.death": "Королівський павук гине", + "subtitles.twilightforest.entity.king_spider.hurt": "Королівського павука поранено", + "subtitles.twilightforest.entity.knight_phantom.ambient": "Лицар-фантом зітхає", + "subtitles.twilightforest.entity.knight_phantom.axe": "Лицар-фантом кидає кайло", + "subtitles.twilightforest.entity.knight_phantom.death": "Лицар-фантом гине", + "subtitles.twilightforest.entity.knight_phantom.hurt": "Лицаря-фантома поранено", + "subtitles.twilightforest.entity.knight_phantom.pickaxe": "Лицар-фантом кидає сокиру", + "subtitles.twilightforest.entity.kobold.ambient": "Кобольд бурчить", + "subtitles.twilightforest.entity.kobold.death": "Кобольд помирає", + "subtitles.twilightforest.entity.kobold.hurt": "Кобольда поранено", + "subtitles.twilightforest.entity.kobold.munch": "Кобольд пережовує їжу", + "subtitles.twilightforest.entity.lich.ambient": "Ліч дихає", + "subtitles.twilightforest.entity.lich.death": "Ліч помирає", + "subtitles.twilightforest.entity.lich.hurt": "Ліча поранено", + "subtitles.twilightforest.entity.lich.pop_mob": "Ліч поглинає моба", + "subtitles.twilightforest.entity.lich.shoot": "Ліч стріляє", + "subtitles.twilightforest.entity.lich.teleport": "Ліч телепортується", + "subtitles.twilightforest.entity.lich_clone.hurt": "Тіньовий клон Ліча обходить атаку", + "subtitles.twilightforest.entity.loyal_zombie.ambient": "Зомбі прислужник стогне", + "subtitles.twilightforest.entity.loyal_zombie.death": "Зомбі прислужник гине", + "subtitles.twilightforest.entity.loyal_zombie.hurt": "Зомбі прислужника поранено", + "subtitles.twilightforest.entity.loyal_zombie.summon": "Викликано зомбі прислужника", + "subtitles.twilightforest.entity.maze_slime.death": "Жук-слизовик гине", + "subtitles.twilightforest.entity.maze_slime.hurt": "Жука-слизовика поранено", + "subtitles.twilightforest.entity.maze_slime.squish": "Жук-слизовик хлюпає", + "subtitles.twilightforest.entity.minion.ambient": "Посіпака ліча стогне", + "subtitles.twilightforest.entity.minion.death": "Посіпака ліча помирає", + "subtitles.twilightforest.entity.minion.hurt": "Посіпаку ліча поранено", + "subtitles.twilightforest.entity.minion.summon": "Ліч викликав нового посіпаку", + "subtitles.twilightforest.entity.minoshroom.ambient": "Гриботавр мичить", + "subtitles.twilightforest.entity.minoshroom.attack": "Гриботавр атакує", + "subtitles.twilightforest.entity.minoshroom.death": "Гриботавр помирає", + "subtitles.twilightforest.entity.minoshroom.hurt": "Гриботавра поранено", + "subtitles.twilightforest.entity.minoshroom.slam": "Гриботавр плескає по землі", + "subtitles.twilightforest.entity.minotaur.ambient": "Мінотавр мичить", + "subtitles.twilightforest.entity.minotaur.attack": "Мінотавр атакує", + "subtitles.twilightforest.entity.minotaur.death": "Мінотавр помирає", + "subtitles.twilightforest.entity.minotaur.hurt": "Мінотавра поранено", + "subtitles.twilightforest.entity.mist_wolf.ambient": "Туманний вовк гарчить", + "subtitles.twilightforest.entity.mist_wolf.death": "Туманний вовк гине", + "subtitles.twilightforest.entity.mist_wolf.hurt": "Туманного вовка поранено", + "subtitles.twilightforest.entity.mist_wolf.target": "Туманний вовк помічає", + "subtitles.twilightforest.entity.mosquito.ambient": "Комарі дзижчать", + "subtitles.twilightforest.entity.naga.hiss": "Нага шипить", + "subtitles.twilightforest.entity.naga.hurt": "Нагу поранено", + "subtitles.twilightforest.entity.naga.rattle": "Нага брязкає", + "subtitles.twilightforest.entity.parrot.imitate.alpha_yeti": "Папуга холодно гарчить", + "subtitles.twilightforest.entity.parrot.imitate.carminite_golem": "Папуга дякує", + "subtitles.twilightforest.entity.parrot.imitate.death_tome": "Папуга видає книжкові звуки", + "subtitles.twilightforest.entity.parrot.imitate.hostile_wolf": "Папуга гарчить", + "subtitles.twilightforest.entity.parrot.imitate.hydra": "Папуга реве", + "subtitles.twilightforest.entity.parrot.imitate.ice_core": "Папуга потріскує", + "subtitles.twilightforest.entity.parrot.imitate.kobold": "Папуга бурчить", + "subtitles.twilightforest.entity.parrot.imitate.minotaur": "Папуга сердито мукає", + "subtitles.twilightforest.entity.parrot.imitate.mosquito": "Папуга дзижчить", + "subtitles.twilightforest.entity.parrot.imitate.naga": "Папуга брязкає", + "subtitles.twilightforest.entity.parrot.imitate.redcap": "Папуга хіхікає", + "subtitles.twilightforest.entity.parrot.imitate.wraith": "Папуга зітхає", + "subtitles.twilightforest.entity.pinch_beetle.death": "Жук-щипач гине", + "subtitles.twilightforest.entity.pinch_beetle.hurt": "Жука-щипача поранено", + "subtitles.twilightforest.entity.quest_ram.ambient": "Квестовий баран мекає", + "subtitles.twilightforest.entity.quest_ram.death": "Квестовий баран гине", + "subtitles.twilightforest.entity.quest_ram.hurt": "Квестового барана поранено", + "subtitles.twilightforest.entity.raven.caw": "Лісовий ворон каркає", + "subtitles.twilightforest.entity.raven.squawk": "Ворон каркає від болю", + "subtitles.twilightforest.entity.redcap.ambient": "Гоблін у червоній шапці хіхікає", + "subtitles.twilightforest.entity.redcap.death": "Гоблін у червоній шапці стогне в агонії", + "subtitles.twilightforest.entity.redcap.hurt": "Гоблін у червоній шапці верещить від болю", + "subtitles.twilightforest.entity.shield.add": "З'являється щит укріплення", + "subtitles.twilightforest.entity.shield.break": "Розбивається щит укріплення", + "subtitles.twilightforest.entity.skeleton_druid.ambient": "Скелет-друїд брязкає кістками", + "subtitles.twilightforest.entity.skeleton_druid.death": "Скелет-друїд гине", + "subtitles.twilightforest.entity.skeleton_druid.hurt": "Скелета-друїда поранено", + "subtitles.twilightforest.entity.skeleton_druid.shoot": "Скелет-друїд вистрілює", + "subtitles.twilightforest.entity.slime_beetle.death": "Жук-слизовик гине", + "subtitles.twilightforest.entity.slime_beetle.hurt": "Жука-слизовика поранено", + "subtitles.twilightforest.entity.slime_beetle.squish": "Жук-слизовик стріляє", + "subtitles.twilightforest.entity.snow_guardian.ambient": "Сніжний вартовий потріскує", + "subtitles.twilightforest.entity.snow_guardian.death": "Сніжний вартовий гине", + "subtitles.twilightforest.entity.snow_guardian.hurt": "Сніжного вартового поранено", + "subtitles.twilightforest.entity.snow_queen.ambient": "Сніжна Королева потріскує", + "subtitles.twilightforest.entity.snow_queen.attack": "Сніжна Королева атакує", + "subtitles.twilightforest.entity.snow_queen.break": "Сніжна Королева відбиває атаку", + "subtitles.twilightforest.entity.snow_queen.death": "Сніжна королева гине", + "subtitles.twilightforest.entity.snow_queen.hurt": "Сніжну королеву поранено", + "subtitles.twilightforest.entity.swarm_spider.ambient": "Ройовий павук шипить", + "subtitles.twilightforest.entity.swarm_spider.death": "Ройовий павук гине", + "subtitles.twilightforest.entity.swarm_spider.hurt": "Ройового павука поранено", + "subtitles.twilightforest.entity.tear.break": "Сльоза Ур-Ґаста розбивається", + "subtitles.twilightforest.entity.tiny_bird.chirp": "Пташка щебече", + "subtitles.twilightforest.entity.tiny_bird.hurt": "Пташка пищить від болю", + "subtitles.twilightforest.entity.tiny_bird.song": "Пташка співає", + "subtitles.twilightforest.entity.tiny_bird.takeoff": "Пташка злітає", + "subtitles.twilightforest.entity.troll.throw_rock": "Печерний троль кидає блок", + "subtitles.twilightforest.entity.ur_ghast.ambient": "Ур-Ґаст плаче", + "subtitles.twilightforest.entity.ur_ghast.death": "Ур-Ґаст гине", + "subtitles.twilightforest.entity.ur_ghast.hurt": "Ур-Ґаст кричить", + "subtitles.twilightforest.entity.ur_ghast.shoot": "Ур-Ґаст стріляє", + "subtitles.twilightforest.entity.ur_ghast.tantrum": "Ур-Ґаст голосить", + "subtitles.twilightforest.entity.winter_wolf.ambient": "Зимний вовк гарчить", + "subtitles.twilightforest.entity.winter_wolf.death": "Зимний вовк гине", + "subtitles.twilightforest.entity.winter_wolf.hurt": "Зимного вовка поранено", + "subtitles.twilightforest.entity.winter_wolf.shoot": "Зимний вовк стріляє", + "subtitles.twilightforest.entity.winter_wolf.target": "Зимний вовк помічає", + "subtitles.twilightforest.entity.wraith.ambient": "Сутінкова примара зітхає", + "subtitles.twilightforest.entity.wraith.death": "Сутінкова примара помирає", + "subtitles.twilightforest.entity.wraith.hurt": "Сутінкову примару поранено", + "subtitles.twilightforest.entity.yeti.death": "Єті помирає", + "subtitles.twilightforest.entity.yeti.grab": "Єті гарчить", + "subtitles.twilightforest.entity.yeti.growl": "Єті гарчить", + "subtitles.twilightforest.entity.yeti.hurt": "Єті поранено", + "subtitles.twilightforest.entity.yeti.throw": "Єті кидає", + "subtitles.twilightforest.environment.acid_rain": "Кислотний дощ обпікає", + "subtitles.twilightforest.item.block_and_chain.collide": "Бойова гиря б'є по блоку", + "subtitles.twilightforest.item.block_and_chain.fire": "Бойова гиря спалахує", + "subtitles.twilightforest.item.block_and_chain.hit": "Бойова гиря б'є по сутності", + "subtitles.twilightforest.item.charm.keep": "Амулет інвентаря повертає предмет", + "subtitles.twilightforest.item.charm.life": "Амулет інвентаря регенерує", + "subtitles.twilightforest.item.fan.whoosh": "Дме віяло з пір'я павича", + "subtitles.twilightforest.item.flask.break": "Крихка колба розбивається", + "subtitles.twilightforest.item.flask.crack": "Крихка колба тріснула", + "subtitles.twilightforest.item.flask.fill": "Колба наповнюється зіллям", + "subtitles.twilightforest.item.glass_sword.break": "Скляний меч розбивається", + "subtitles.twilightforest.item.ice_bomb.fired": "Крижану бомбу кинуто", + "subtitles.twilightforest.item.knightmetal_armor.equip": "Лицарська металева броня брязкає", + "subtitles.twilightforest.item.knightmetal_shield.shatter": "Металевий щит розбивається", + "subtitles.twilightforest.item.lamp.burn": "Лампа попелу підпалює місцевість", + "subtitles.twilightforest.item.magnet.grab": "Рудний магніт тягне руду", + "subtitles.twilightforest.item.moonworm.squish": "Місячний черв'як світиться", + "subtitles.twilightforest.item.scepter.drain": "Скіпетр життя виснажує життя", + "subtitles.twilightforest.item.scepter.pearl": "Скіпетр сутінків кидає перлину", + "subtitles.twilightforest.item.shield.shatter": "Дерев'яний щит розбивається", + "subtitles.twilightforest.item.transformation_powder.use": "Моб перетворюється", + "twilightforest.book.author": "забутий мандрівник", + "twilightforest.book.darktower": "Нотатки про дерев'яну вежу", + "twilightforest.book.darktower.1": "§8[[Блокнот дослідника, який, здається, пережив вибух]]§0\n\nУ цій вежі явно є механізми, які не реагують на мене. Їхня магія мало не жадає признати мій дотик, але не може. Це відбувається в тому випадку, якщо пристрої", + "twilightforest.book.darktower.2": "вежі приглушуються могутньою групою істот поблизу.\n\n§8[[Наступний запис]]§0\n\nМагія, здається, випромінюється з глибини довколишніх фортець. Вона не може походити від гоблінів, оскільки їхня магія чарівна, але не сфокусована. Мабуть,", + "twilightforest.book.darktower.3": "в фортецях все ще діють якісь сили.\n\n§8[[Наступний запис]]§0\n\nМій аналіз показує, що він походить з декількох джерел, що діють як група. Я повернуся до фортеці після того, як поповню запаси...", + "twilightforest.book.hydralair": "Нотатки про вогняне болото", + "twilightforest.book.hydralair.1": "§8[[Блокнот дослідника, написаний на вогнетривкому папері]]§0\n\nВогонь — це тривіальна перешкода для такого майстерного дослідника, як я. Я перетнув моря вогню і проплив через океани лави. Палаюче повітря тут є цікавою варіацією, але", + "twilightforest.book.hydralair.2": "зрештою не перешкодою.\n\nМене зупиняє те, що я зустрів ще одне захисне заклинання, цього разу оточувало могутню істоту, яка, мабуть, є королем цього вогняного болота. Це не перше захисне заклинання, з яким я стикаюся, і я", + "twilightforest.book.hydralair.3": "починаю розгадувати таємниці їх дії.\n\nЯкщо це заклинання схоже на інші, воно підтримуватиметься потужною істотою поблизу. Навколо вогняного болота є кілька вологих боліт, а під цими болотами — лабіринти, повні мінотаврів.", + "twilightforest.book.hydralair.4": "Логічним вибором для прив’язки такого закляття був би якийсь могутній мінотавр, який би чимось відрізнявся від інших, що його оточують...", + "twilightforest.book.icetower": "Нотатки про палац Аврори", + "twilightforest.book.icetower.1": "§8[[Блокнот дослідника, облитий льодом]]§0\n\nЯ подолав одну заметіль, щоб натрапити на цю жахливу крижану бурю на вершині льодовика. Мої дослідження показали мені пишність льодового палацу, що сяє кольорами", + "twilightforest.book.icetower.2": "полярного сяйва. Здається, все це захищено якимось прокляттям.\n\n§8[[Наступний запис]]§0\n\nЯ не новачок. Це прокляття живиться силою істоти поблизу. Причина прокляття навколо вогняного болота була побудована на силі", + "twilightforest.book.icetower.3": "ватажка мінотаврів поблизу.\n\nНавколо цього льодовика є маси Єті. Можливо, у єті є якийсь лідер...", + "twilightforest.book.labyrinth": "Нотатки про болотистий лабіринт", + "twilightforest.book.labyrinth.1": "§8[[Блокнот дослідника, написаний на водонепроникному папері]]§0\n\nКомарі в цьому болоті неприємні, але дивні. Переважна більшість з них, здається, не мають природного джерела, а також не відіграють ролі в місцевій екології. Я почав підозрювати, що це", + "twilightforest.book.labyrinth.2": "якесь магічне прокляття.\n\n§8[[Наступний запис]]§0\n\nТепер, коли я натрапив на захисне заклинання в зруйнованому лабіринті, я вважаю, що мої підозри підтвердилися. І заклинання, і комарі є", + "twilightforest.book.labyrinth.3": "прокляттям. Здається, джерело цього прокляття відрізняється від інших, з якими я стикався. Мені доведеться досліджувати далі...\n\n§8[[Наступний запис]]§0\n\nЗдається, це прокляття надто потужне, щоб його створила", + "twilightforest.book.labyrinth.4": "одна істота. Буде потрібно кілька майстрів, які працюють разом.\n\nЯкщо один із чарівників перестане робити свій внесок, усе прокляття впаде на все болото. Дивно, але мої ворожіння не показують жодних ознак живих чарівників поблизу.", + "twilightforest.book.labyrinth.5": "Я все-таки побачив щось цікаве в одній із сусідніх веж із гострими дахами...", + "twilightforest.book.lichtower": "Нотатки про загострену вежу", + "twilightforest.book.lichtower.1": "§8[Блокнот дослідника, погризений монстрами]§0\n\nЯ почав досліджувати дивну ауру навколо цієї вежі. Цеглини вежі захищені прокляттям, сильнішим за будь-яке, яке я бачив раніше. Магія прокляття википає в", + "twilightforest.book.lichtower.2": "навколишнє середовище.\n\nНа моїй батьківщині я мав би багато варіантів боротьби з цією магією, але тут мої запаси обмежені. Мені доведеться дослідити...", + "twilightforest.book.lichtower.3": "§8[[Багато записів пізніше]]§0\n\nПрорив! У моїх подорожах я бачив величезне змієподібне чудовисько у прикрашеному дворі. Поруч я взяв зношену, викинуту зелену вагу.\n\nЗдається, що магія в вазі має потрібні властивості", + "twilightforest.book.lichtower.4": "руйнування прокляття, але магія надто слабка. Можливо, мені знадобиться придбати свіжіший зразок безпосередньо від істоти.", + "twilightforest.book.tfstronghold": "Нотатки про фортецю", + "twilightforest.book.tfstronghold.1": "§8[[Блокнот дослідника, написаний на папері, що тьмяно світиться]]§0\n\nВусики темряви, що оточують цю територію, є лише проявом захисного заклинання над усім темним лісом. Закляття викликає сліпоту, що дуже неприємно. Я бачив кілька", + "twilightforest.book.tfstronghold.2": "цікавих речей у цьому районі і хотів би продовжувати досліджувати.\n\n§8[[Наступний запис]]§0\n\nЯ знайшов руїни в темному лісі. Вони належать до фортеці типу, де зазвичай живуть лицарі. Однак ця фортеця повна гоблінів, а не", + "twilightforest.book.tfstronghold.3": "лицарів. Вони носять лицарські обладунки, але поведінка їх дуже нелицарська.\n\n§8[[Наступний запис]]§0\n\nГлибоко в руїнах я знайшов постамент. П’єдестал, здається, такий, що лицарі ставлять трофеї на доказ своєї сили.", + "twilightforest.book.tfstronghold.4": "Здавалося б, отримання потужного скіпетра послабить прокляття темного лісу, а розміщення трофею, пов’язаного з могутньою істотою, на п’єдесталі, ймовірно, надасть доступ до основної частини твердині.", + "twilightforest.book.trollcave": "Примітки про високогір'я", + "twilightforest.book.trollcave.1": "§8[[Блокнот дослідника, пошкоджений кислотою]]§0\n\nЗдається, немає способу захиститися від токсичної зливи навколо цієї місцевості. Під час своїх коротких екскурсій я також зустрів ще одне захисне заклинання, подібне до інших,", + "twilightforest.book.trollcave.2": "свідком яких я був. Заклинання має бути якимось чином пов’язане з токсичною бурею. Подальші дослідження слідують...\n\n§8[[Наступний запис]]§0\n\nТака найвища магія погоди має бути результатом багатьох непереможених великих зол у цьому світі. Мої дослідження містять", + "twilightforest.book.trollcave.3": "кілька підказок, які вказують на пекуче болото, ліс, вкритий глибокою темрявою, і царство, вкрите снігом.", + "twilightforest.book.unknown": "Нотатки про незрозуміле", + "twilightforest.book.unknown.1": "§8[[Ця книга має ознаки того, що її багато разів копіювали]]§0\n\nЯ не можу пояснити поле, що оточує цю структуру, але магія є могутньою. Якщо це прокляття схоже на інші, то відповідь для його відкриття криється в іншому місці. Можливо, є щось, що я залишив", + "twilightforest.book.unknown.2": "невиконаним, або якийсь монстр, якого мені ще належить перемогти. Мені доведеться повернути назад. Я повернуся до цього місця пізніше, щоб побачити, чи щось змінилося.", + "twilightforest.book.yeticave": "Нотатки про крижану печеру", + "twilightforest.book.yeticave.1": "§8[[Блокнот дослідника, вкритий інеєм]]§0\n\nЗавірюха навколо цих снігових країв не вщухає. Це не звичайний снігопад — це чарівне явище. Мені доведеться провести експерименти, щоб знайти, що здатне", + "twilightforest.book.yeticave.2": "викликати такий ефект.\n\n§8[[Наступний запис]]§0\n\nЗдається, це прокляття надто потужне, щоб його створити одна істота. Буде потрібно кілька майстрів, які працюють разом. Якби один із чарівників припинив свій", + "twilightforest.book.yeticave.3": "внесок, хуртовина заспокоїлася. Дивно, але мої ворожіння не показують жодних ознак живих чарівників поблизу. Я все-таки побачив щось цікаве в одній із сусідніх веж із гострими дахами..." +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/val_es.json b/src/main/resources/assets/twilightforest/lang/val_es.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/val_es.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/vec_it.json b/src/main/resources/assets/twilightforest/lang/vec_it.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/vec_it.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/vi_vn.json b/src/main/resources/assets/twilightforest/lang/vi_vn.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/vi_vn.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/vls_be.json b/src/main/resources/assets/twilightforest/lang/vls_be.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/vls_be.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/yi_de.json b/src/main/resources/assets/twilightforest/lang/yi_de.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/yi_de.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/yo_ng.json b/src/main/resources/assets/twilightforest/lang/yo_ng.json new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/yo_ng.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/zh_CN.lang b/src/main/resources/assets/twilightforest/lang/zh_CN.lang deleted file mode 100644 index b1444a312c..0000000000 --- a/src/main/resources/assets/twilightforest/lang/zh_CN.lang +++ /dev/null @@ -1,309 +0,0 @@ -#translated by MCwolski - -tile.TFLog.0.name=暮色橡树木 -tile.TFLog.1.name=苍穹树木 -tile.TFLog.2.name=红树木 -tile.TFLog.3.name=黑树木 -tile.TFLeaves.0.name=暮色橡木树叶 -tile.TFLeaves.1.name=苍穹树叶 -tile.TFLeaves.2.name=红树树叶 -tile.TFLeaves.3.name=彩虹橡树叶 -tile.TFFirefly.name=萤火虫 -tile.TFCicada.name=蝉 -tile.TFPortal.name=暮色森林入口 -tile.TFMazestone.0.name=遗迹石头 -tile.TFMazestone.1.name=遗迹石砖 -tile.TFMazestone.2.name=雕刻的遗迹石头 -tile.TFMazestone.3.name=装饰的遗迹石砖 -tile.TFMazestone.4.name=破碎的遗迹石砖 -tile.TFMazestone.5.name=遗迹苔石砖 -tile.TFMazestone.6.name=遗迹石方块 -tile.TFMazestone.7.name=遗迹石沿 -tile.TFMazestone.8.name=遗迹天花板 -tile.TFHedge.0.name=树篱 -tile.TFHedge.1.name=黑树树叶 -tile.TFHedge.2.name=树篱 -tile.TFBossSpawner.0.name=生成 娜迦 -tile.TFBossSpawner.1.name=生成 巫妖 -tile.TFBossSpawner.2.name=生成 九头蛇 -tile.TFBossSpawner.3.name=生成 暮色恶魂 -tile.TFBossSpawner.4.name=生成 幻影骑士 -tile.TFFireflyJar.name=萤火虫罐子 -tile.TFPlant.3.name=暮色森林苔藓 -tile.TFPlant.4.name=鬼臼果 -tile.TFPlant.5.name=三叶草 [WIP] -tile.TFPlant.8.name=暮色森林蕨类 -tile.TFPlant.9.name=暮色森林蘑菇 -tile.TFPlant.10.name=林地草 -tile.TFPlant.11.name=枯死的灌木 -tile.TFPlant.13.name=火炬浆果植物 -tile.TFPlant.14.name=根须 -tile.TFRoots.0.name=根茎 -tile.TFRoots.1.name=新鲜根茎 -tile.TFUncraftingTable.name=多功能工作台 -tile.TFFireJet.0.name=烟雾方块 -tile.TFFireJet.1.name=被包裹的烟雾 -tile.TFFireJet.2.name=被包裹的烟雾 -tile.TFFireJet.8.name=火焰喷射 -tile.TFFireJet.9.name=火焰喷射-弹射 -tile.TFFireJet.10.name=火焰喷射-激活 -tile.TFFireJet.11.name=火焰喷射方块 -tile.TFFireJet.12.name=被包裹的凸出火焰喷射 -tile.TFFireJet.13.name=被包裹的炽红火焰喷射 -tile.TFNagastone.0.name=娜迦石方块 头部 -tile.TFNagastone.1.name=娜迦石方块 头部 -tile.TFNagastone.2.name=娜迦石方块 头部 -tile.TFNagastone.3.name=娜迦石方块 头部 -tile.TFNagastone.4.name=娜迦石方块 -tile.TFNagastone.5.name=娜迦石方块 -tile.TFNagastone.6.name=娜迦石方块 -tile.TFNagastone.7.name=娜迦石方块 -tile.TFNagastone.8.name=娜迦石方块 -tile.TFNagastone.9.name=娜迦石方块 -tile.TFNagastone.10.name=娜迦石方块 -tile.TFNagastone.11.name=娜迦石方块 -tile.TFNagastone.12.name=娜迦石方块 -tile.TFNagastone.13.name=娜迦石方块 -tile.TFNagastone.14.name=娜迦石方块 -tile.TFNagastone.15.name=娜迦石方块 -tile.TFSapling.0.name=暮色橡树树苗 -tile.TFSapling.1.name=苍穹树苗 -tile.TFSapling.2.name=红树树苗 -tile.TFSapling.3.name=黑树树苗 -tile.TFSapling.4.name=高大暮色橡树树苗 -tile.TFSapling.5.name=时光树苗 -tile.TFSapling.6.name=变化树苗 -tile.TFSapling.7.name=矿石树苗 -tile.TFSapling.8.name=分类树苗 -tile.TFSapling.9.name=彩虹树苗 -tile.TFMoonworm.name=月光蠕虫 -tile.TFMagicLog.0.name=时光树木 -tile.TFMagicLog.1.name=变化树木 -tile.TFMagicLog.2.name=矿石树木 -tile.TFMagicLog.3.name=分类树木 -tile.TFMagicLogSpecial.0.name=时光树的时钟 -tile.TFMagicLogSpecial.1.name=变化树的心脏 -tile.TFMagicLogSpecial.2.name=矿石树核心 -tile.TFMagicLogSpecial.3.name=分类树的引擎 -tile.TFMagicLeaves.0.name=时光树树叶 -tile.TFMagicLeaves.1.name=变化树树叶 -tile.TFMagicLeaves.2.name=矿石树树叶 -tile.TFMagicLeaves.3.name=分类树树叶 -tile.TFTowerStone.0.name=塔树木板 -tile.TFTowerStone.1.name=塔树板箱 -tile.TFTowerStone.2.name=破裂的塔木 -tile.TFTowerStone.3.name=青苔的塔木 -tile.TFTowerStone.4.name=虫蛀的塔木 -tile.TFTowerDevice.0.name=重现的方块 -tile.TFTowerDevice.1.name=激活的重现方块 -tile.TFTowerDevice.2.name=消失的方块 -tile.TFTowerDevice.3.name=激活消失的方块 -tile.TFTowerDevice.4.name=锁定的消失的方块 -tile.TFTowerDevice.5.name=解锁的消失的方块 -tile.TFTowerDevice.6.name=高塔建設者 -tile.TFTowerDevice.7.name=激活的高塔建設者 -tile.TFTowerDevice.8.name=关闭的高塔建設者 -tile.TFTowerDevice.9.name=反建器 -tile.TFTowerDevice.10.name=可怕的陷阱 -tile.TFTowerDevice.11.name=激活的可怕的陷阱 -tile.TFTowerDevice.12;.name=砷铅铁反应堆 -tile.TFTowerDevice.13.name=激活的砷铅铁反应堆 -tile.TFTowerTranslucent.0.name=再现方块 -tile.TFTowerTranslucent.1.name=激活的再现方块 -tile.TFTowerTranslucent.2.name=建造的砷铅铁方块 -tile.TFTowerTranslucent.3.name=激活的建造的砷铅铁方块 -tile.TFTowerTranslucent.4.name=反建方块 -tile.TFTowerTranslucent.5.name=砷铅铁反应堆碎片 -tile.TFTowerTranslucent.6.name=伪黄金方块 -tile.TFTowerTranslucent.7.name=伪钻石方块 -tile.TFTrophy.name=暮色森林战利品 -tile.TFShield.0.name=堡垒防护屏障 -tile.TFShield.1.name=堡垒防护屏障 -tile.TFShield.2.name=堡垒防护屏障 -tile.TFShield.3.name=堡垒防护屏障 -tile.TFShield.4.name=堡垒防护屏障 -tile.TFShield.5.name=堡垒防护屏障 -tile.TFShield.15.name=堡垒防护屏障 -tile.TFTrophyPedestal.0.name=战利品宝座 -tile.TFTrophyPedestal.15.name=隐藏的战利品宝座 -tile.TFAuroraBrick.0.name=奥罗拉方块 -tile.TFUnderBrick.0.name=地下砖 -tile.TFUnderBrick.1.name=碎裂的地下砖 -tile.TFUnderBrick.2.name=青苔地下砖 - -item.nagaScale.name=娜迦鳞片 -item.plateNaga.name=娜迦胸甲 -item.legsNaga.name=娜迦护腿 -item.scepterTwilight.name=黄昏权杖 -item.scepterLifeDrain.name=吸血权杖 -item.scepterZombie.name=僵尸权杖 -item.oreMeter.name=矿石感应仪 [WIP] -item.magicMap.name=魔法地图 -item.mazeMap.name=迷宮地图 -item.oreMap.name=迷宮/矿石地图 -item.tfFeather.name=乌鸦羽毛 -item.magicMapFocus.name=魔法地图核心 -item.mazeMapFocus.name=迷宮地图核心 -item.liveRoot.name=活根 -item.ironwoodRaw.name=未加工的铁树原料 -item.ironwoodIngot.name=铁树锭 -item.ironwoodHelm.name=铁树头盔 -item.ironwoodPlate.name=铁树铠甲 -item.ironwoodLegs.name=铁树护腿 -item.ironwoodBoots.name=铁树靴 -item.ironwoodSword.name=铁树剑 -item.ironwoodShovel.name=铁树铲 -item.ironwoodPick.name=铁树镐 -item.ironwoodAxe.name=铁树斧 -item.ironwoodHoe.name=铁树锄 -item.torchberries.name=火炬浆果 -item.venisonRaw.name=生鹿肉 -item.venisonCooked.name=鹿肉排 -item.hydraChop.name=九头蛇肉排 -item.fieryBlood.name=炽热的血液 -item.fieryIngot.name=炽热的铁锭 -item.fieryHelm.name=炽热的铁头盔 -item.fieryPlate.name=炽热的铁胸甲 -item.fieryLegs.name=炽热的铁护腿 -item.fieryBoots.name=炽热的铁靴子 -item.fierySword.name=炽热的铁劍 -item.fieryPick.name=炽热的铁镐 -item.steeleafIngot.name=钢叶 -item.steeleafHelm.name=钢叶头盔 -item.steeleafPlate.name=钢叶胸甲 -item.steeleafLegs.name=钢叶护腿 -item.steeleafBoots.name=钢叶靴 -item.steeleafSword.name=钢叶劍 -item.steeleafShovel.name=钢叶铲 -item.steeleafPick.name=钢叶镐 -item.steeleafAxe.name=钢叶斧 -item.steeleafHoe.name=钢叶锄 -item.minotaurAxe.name=米诺陶诺斯战斧 -item.mazebreakerPick.name=迷宮破坏者 -item.transformPowder.name=转换粉 -item.meefRaw.name=生牛头人肉 -item.meefSteak.name=牛头人肉排 -item.meefStroganoff.name=牛头人沙拉酱肉 -item.mazeWafer.name=迷宮薄饼 -item.emptyMagicMap.name=空白魔法地图 -item.emptyMazeMap.name=空白迷宮地图 -item.emptyOreMap.name=空白迷宮/矿石地图 -item.oreMagnet.name=矿石磁铁 -item.crumbleHorn.name=瓦解之号角 -item.peacockFan.name=孔雀羽毛扇 -item.moonwormQueen.name=月光蠕虫女王 -item.charmOfLife1.name=魔力生命 I -item.charmOfLife2.name=魔力生命 II -item.charmOfKeeping1.name=保管符咒 I -item.charmOfKeeping2.name=保管符咒 II -item.charmOfKeeping3.name=保管符咒 III -item.towerKey.name=塔钥匙 -item.borerEssence.name=三化螟精华 -item.carminite.name=砷铅铁矿石 -item.trophy.hydra.name=九头蛇战利品 -item.trophy.naga.name=娜迦战利品 -item.trophy.lich.name=巫妖战利品 -item.trophy.ur-ghast.name=暮色恶魂战利品 -item.experiment115.name=试验物品 115 -item.armorShards.name=装甲碎片 -item.knightMetal.name=骑士金属锭 -item.shardCluster.name=大块装甲碎片 -item.knightlyHelm.name=骑士头盔 -item.knightlyPlate.name=骑士胸甲 -item.knightlyLegs.name=骑士护腿 -item.knightlyBoots.name=骑士靴 -item.knightlySword.name=骑士剑 -item.knightlyPick.name=骑士镐 -item.knightlyAxe.name=骑士斧 -item.phantomHelm.name=幻影头盔 -item.phantomPlate.name=幻影胸甲 - -item.minotaurAxe.tooltip=蓄力时造成额外伤害 -item.knightlySword.tooltip=对有护甲的目标造成额外伤害 -item.knightlyPick.tooltip=对有护甲的目标造成额外伤害 -item.knightlyAxe.tooltip=对无护甲的目标造成额外伤害 - -item.tfspawnegg.name=生成 - -enchantment.tfFireReact=炽热光环 - -itemGroup.twilightForest=暮色森林 - -entity.TwilightForest.Wild Boar.name=野猪 -entity.TwilightForest.Bighorn Sheep.name=大角山羊 -entity.TwilightForest.Wild Deer.name=野鹿 -entity.TwilightForest.Redcap.name=红帽 -entity.TwilightForest.Swarm Spider.name=集群蜘蛛 -entity.TwilightForest.Naga.name=娜迦 -entity.TwilightForest.Naga Segment.name=娜迦身体 -entity.TwilightForest.Skeleton Druid.name=骷髅德鲁伊 -entity.TwilightForest.Hostile Wolf.name=愤怒的狼 -entity.TwilightForest.Twilight Wraith.name=幽灵 -entity.TwilightForest.Hedge Spider.name=树篱蜘蛛 -entity.TwilightForest.Hydra.name=九头蛇 -entity.TwilightForest.HydraHead.name=九头蛇头 -entity.TwilightForest.Twilight Lich.name=巫妖 -entity.TwilightForest.Penguin.name=企鹅 -entity.TwilightForest.Tiny Bird.name=小鸟 -entity.TwilightForest.Forest Squirrel.name=松鼠 -entity.TwilightForest.Forest Bunny.name=兔子 -entity.TwilightForest.Forest Raven.name=乌鸦 -entity.TwilightForest.Questing Ram.name=谜题羊 -entity.TwilightForest.Twilight Kobold.name=哥布林 -entity.TwilightForest.Boggard.name=博加德 [NYI] -entity.TwilightForest.Lich Minion.name=巫妖的仆从 -entity.TwilightForest.Loyal Zombie.name=忠诚的僵尸 -entity.TwilightForest.Mosquito Swarm.name=成群的蚊子 -entity.TwilightForest.Death Tome.name=死神之书 -entity.TwilightForest.Minotaur.name=牛头怪 -entity.TwilightForest.Minoshroom.name=米陶诺 -entity.TwilightForest.Fire Beetle.name=喷火甲虫 -entity.TwilightForest.Slime Beetle.name=粘液甲虫 -entity.TwilightForest.Pinch Beetle.name=枯萎甲虫 -entity.TwilightForest.Maze Slime.name=迷宮史莱姆 -entity.TwilightForest.Redcap Sapper.name=红帽地精 -entity.TwilightForest.Mist Wolf.name=迷雾狼 -entity.TwilightForest.King Spider.name=国王蜘蛛 -entity.TwilightForest.Firefly.name=萤火虫 -entity.TwilightForest.Mini Ghast.name=迷你幽灵 -entity.TwilightForest.Tower Ghast.name=高塔幽灵 -entity.TwilightForest.Tower Golem.name=高塔铁傀儡 -entity.TwilightForest.Tower Termite.name=高塔蠹虫 -entity.TwilightForest.Redscale Broodling.name=寄生虫 -entity.TwilightForest.Tower Boss.name=暮色恶魂 -entity.TwilightForest.Block&Chain Goblin.name=重装哥布林 -entity.TwilightForest.Upper Goblin Knight.name=高阶哥布林骑士 -entity.TwilightForest.Lower Goblin Knight.name=低阶哥布林骑士 -entity.TwilightForest.Helmet Crab.name=寄居蟹 -entity.TwilightForest.Knight Phantom.name=幻影骑士 [WIP] - -achievement.twilightPortal=建造暮色口 -achievement.twilightPortal.desc=建立一个通往暮色森林的传送口 -achievement.twilightArrival=初入暮色 -achievement.twilightArrival.desc=进入暮色森林 -achievement.twilightHunter=暮色猎人 -achievement.twilightHunter.desc=猎杀一些暮色的野生动物 -achievement.twilightMagicMapFocus=用火书写 -achievement.twilightMagicMapFocus.desc=用乌鸦毛, 萤石粉, 火炬浆果合成魔法地图核心 -achievement.twilightNaga=娜迦猎人 -achievement.twilightNaga.desc=干掉娜迦 -achievement.twilightNagaArmors=娜迦装备 -achievement.twilightNagaArmors.desc=合成娜迦鳞胸甲和护腿 -achievement.twilightLich=巫妖猎人 -achievement.twilightLich.desc=干掉巫妖 -achievement.twilightLichScepters=权杖专精 -achievement.twilightLichScepters.desc=学会使用三种权杖 -achievement.twilightHill1=靴子都是我的! -achievement.twilightHill1.desc=在小矿山里击败红帽哥布林 -achievement.twilightHill2=中型矿山 [NYI] -achievement.twilightHill2.desc=在中型矿山内击败任意怪物 -achievement.twilightHill3=我看到你了 -achievement.twilightHill3.desc=在大矿山里杀死一只暮色幽魂 -achievement.twilightHedge=碾碎爬虫 -achievement.twilightHedge.desc=在树篱迷宫杀死一只蜘蛛 -achievement.twilightMagicMap=我有千里眼 -achievement.twilightMagicMap.desc=合成魔法地图 -achievement.twilightMazeMap=现在, 寻找出口 -achievement.twilightMazeMap.desc=从哥布林身上获取用来合成迷宫地图的核心 -achievement.twilightOreMap=怎样才算值得? -achievement.twilightOreMap.desc=合成迷宫/矿石地图 \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/zh_TW.lang b/src/main/resources/assets/twilightforest/lang/zh_TW.lang deleted file mode 100644 index 0380c58b0f..0000000000 --- a/src/main/resources/assets/twilightforest/lang/zh_TW.lang +++ /dev/null @@ -1,314 +0,0 @@ -# Translate by Likol - -itemGroup.twilightForest=暮光森林模組 -item.tfspawnegg.name=生成 -enchantment.tfFireReact=抵抗火焰 -tile.TFLog.0.name=暮光橡樹原木 -tile.TFLog.1.name=垂暮樹原木 -tile.TFLog.2.name=白皮紅樹原木 -tile.TFLog.3.name=漆黑樹原木 -tile.TFLeaves.0.name=暮光橡樹葉子 -tile.TFLeaves.1.name=垂暮樹葉子 -tile.TFLeaves.2.name=白皮紅樹葉子 -tile.TFHedge.1.name=漆黑樹葉子 -tile.TFLeaves.3.name=彩虹橡樹葉子 -tile.TFLeaves.9.name=彩虹橡樹葉子 -tile.TFFirefly.name=螢火蟲 -tile.TFCicada.name=蟬 -tile.TFPortal.name=暮光森林傳送門 -tile.TFMazestone.0.name=遺跡石 -tile.TFMazestone.1.name=遺跡石磚 -tile.TFMazestone.2.name=雕刻過的遺跡石磚 -tile.TFMazestone.3.name=裝飾用的遺跡石磚 -tile.TFMazestone.4.name=破碎的遺跡石磚 -tile.TFMazestone.5.name=長苔的遺跡石磚 -tile.TFMazestone.6.name=裝飾用馬賽克遺跡石 -tile.TFMazestone.7.name=裝飾用邊線遺跡石 -tile.TFMazestone.8.name=裝飾用天花板遺跡石 -tile.TFHedge.0.name=樹籬 -tile.TFHedge.2.name=樹籬 -tile.TFBossSpawner.0.name=[BOSS]納迦生怪磚 -tile.TFBossSpawner.1.name=[BOSS]巫妖王生怪磚 -tile.TFBossSpawner.2.name=[BOSS]九頭蛇生怪磚 -tile.TFBossSpawner.3.name=[BOSS]惡靈烏爾生怪磚 -tile.TFBossSpawner.4.name=[BOSS]幻影騎士生怪磚 -tile.TFBossSpawner.5.name=生怪磚 -tile.TFBossSpawner.6.name=生怪磚 -tile.TFBossSpawner.7.name=生怪磚 -tile.TFBossSpawner.8.name=生怪磚 -tile.TFBossSpawner.9.name=生怪磚 -tile.TFBossSpawner.10.name=生怪磚 -tile.TFBossSpawner.11.name=生怪磚 -tile.TFBossSpawner.12.name=生怪磚 -tile.TFBossSpawner.13.name=生怪磚 -tile.TFBossSpawner.14.name=生怪磚 -tile.TFBossSpawner.15.name=生怪磚 -tile.TFFireflyJar.name=裝著螢火蟲的瓶子 -tile.TFPlant.3.name=暮色苔蘚 -tile.TFPlant.4.name=鬼臼果實 -tile.TFPlant.5.name=幸運草毯 -tile.TFPlant.8.name=捲曲嫩葉 -tile.TFPlant.9.name=暮光菇 -tile.TFPlant.10.name=暮光草 -tile.TFPlant.11.name=乾燥灌木 -tile.TFPlant.13.name=火炬莓 -tile.TFPlant.14.name=根鬚 -tile.TFRoots.0.name=根莖 -tile.TFRoots.1.name=活根莖 -tile.TFUncraftingTable.name=暮光工作台 -tile.TFFireJet.0.name=煙囪方塊 -tile.TFFireJet.1.name=冒煙機關 -tile.TFFireJet.2.name=冒煙機關 -tile.TFFireJet.8.name=火焰噴射方塊 -tile.TFFireJet.9.name=Popping Fire Jet -tile.TFFireJet.10.name=Flaming Fire Jet -tile.TFFireJet.11.name=火焰噴射機關 -tile.TFFireJet.12.name=Encased Popping Fire Jet -tile.TFFireJet.13.name=Encased Flaming Fire Jet -tile.TFNagastone.0.name=納迦石頭部 -tile.TFNagastone.1.name=納迦石頭部 -tile.TFNagastone.2.name=納迦石頭部 -tile.TFNagastone.3.name=納迦石頭部 -tile.TFNagastone.4.name=納迦石方塊 -tile.TFNagastone.5.name=納迦石方塊 -tile.TFNagastone.6.name=納迦石方塊 -tile.TFNagastone.7.name=納迦石方塊 -tile.TFNagastone.8.name=納迦石方塊 -tile.TFNagastone.9.name=納迦石方塊 -tile.TFNagastone.10.name=納迦石方塊 -tile.TFNagastone.11.name=納迦石方塊 -tile.TFNagastone.12.name=納迦石方塊 -tile.TFNagastone.13.name=納迦石方塊 -tile.TFNagastone.14.name=納迦石方塊 -tile.TFNagastone.15.name=納迦石方塊 -tile.TFSapling.0.name=虛弱的暮光橡樹樹苗 -tile.TFSapling.1.name=垂暮樹樹苗 -tile.TFSapling.2.name=白皮紅樹樹苗 -tile.TFSapling.3.name=漆黑樹樹苗 -tile.TFSapling.4.name=健康的暮光橡樹樹苗 -tile.TFSapling.5.name=時間樹樹苗 -tile.TFSapling.6.name=變換樹樹苗 -tile.TFSapling.7.name=礦物樹樹苗 -tile.TFSapling.8.name=分類樹樹苗 -tile.TFSapling.9.name=彩虹橡樹樹苗 -tile.TFMoonworm.name=月光蟲 -tile.TFMagicLog.0.name=時間樹原木 -tile.TFMagicLog.1.name=變換樹原木 -tile.TFMagicLog.2.name=礦物樹原木 -tile.TFMagicLog.3.name=分類樹原木 -tile.TFMagicLogSpecial.0.name=時間樹核心 -tile.TFMagicLogSpecial.1.name=變換樹核心 -tile.TFMagicLogSpecial.2.name=礦物樹核心 -tile.TFMagicLogSpecial.3.name=分類樹核心 -tile.TFMagicLeaves.0.name=時間樹葉子 -tile.TFMagicLeaves.1.name=變換樹葉子 -tile.TFMagicLeaves.2.name=礦物樹葉子 -tile.TFMagicLeaves.3.name=分類樹葉子 -tile.TFTowerStone.0.name=漆黑樹木材 -tile.TFTowerStone.1.name=漆黑樹磚 -tile.TFTowerStone.2.name=破碎的漆黑樹木材 -tile.TFTowerStone.3.name=長苔的漆黑樹木材 -tile.TFTowerStone.4.name=長蟲的漆黑樹木材 -tile.TFTowerDevice.0.name=重現磚 -tile.TFTowerDevice.1.name=啟動的重現磚 -tile.TFTowerDevice.2.name=消失磚 -tile.TFTowerDevice.3.name=啟動的消失磚 -tile.TFTowerDevice.4.name=上鎖的消失磚 -tile.TFTowerDevice.5.name=解鎖的消失磚 -tile.TFTowerDevice.6.name=造橋核心 -tile.TFTowerDevice.7.name=啟動的造橋核心 -tile.TFTowerDevice.8.name=已啟動的造橋核心 -tile.TFTowerDevice.9.name=反建造核心 -tile.TFTowerDevice.10.name=惡靈陷阱 -tile.TFTowerDevice.11.name=啟動的惡靈陷阱 -tile.TFTowerDevice.12.name=虛空反應核心 -tile.TFTowerDevice.13.name=啟動的虛空反應核心 -tile.TFTowerTranslucent.0.name=重現方塊 -tile.TFTowerTranslucent.1.name=啟動重現方塊 -tile.TFTowerTranslucent.2.name=建造的砷鉛鐵礦方塊 -tile.TFTowerTranslucent.3.name=啟動建造的砷鉛鐵礦方塊 -tile.TFTowerTranslucent.4.name=反建造方塊 -tile.TFTowerTranslucent.5.name=破壞反應堆 -tile.TFTowerTranslucent.6.name=擬真金磚 -tile.TFTowerTranslucent.7.name=擬真鑽石磚 -tile.TFTrophy.name=暮色森林獎盃 -tile.TFShield.0.name=迷宮護盾方塊 -tile.TFShield.1.name=迷宮護盾方塊 -tile.TFShield.2.name=迷宮護盾方塊 -tile.TFShield.3.name=迷宮護盾方塊 -tile.TFShield.4.name=迷宮護盾方塊 -tile.TFShield.5.name=迷宮護盾方塊 -tile.TFShield.15.name=迷宮護盾方塊 -tile.TFTrophyPedestal.0.name=失效的獎盃台 -tile.TFTrophyPedestal.15.name=獎盃台 -tile.TFAuroraBrick.0.name=極光方塊 -tile.TFUnderBrick.0.name=底磚 -tile.TFUnderBrick.1.name=破碎的底磚 -tile.TFUnderBrick.2.name=長苔的底磚 -item.nagaScale.name=納迦的鱗片 -item.plateNaga.name=鱗片外衣 -item.legsNaga.name=鱗片護腿 -item.scepterTwilight.name=暮光權杖 -item.scepterLifeDrain.name=生命汲取寶杖 -item.scepterZombie.name=召喚殭屍權杖 -item.oreMeter.name=礦物偵測儀 -item.magicMap.name=魔法地圖 -item.mazeMap.name=迷宮地圖 -item.oreMap.name=昂貴地圖 -item.tfFeather.name=烏鴉羽毛 -item.magicMapFocus.name=魔法地圖指針 -item.mazeMapFocus.name=迷宮地圖指針 -item.liveRoot.name=活根莖 -item.ironwoodRaw.name=混合的鐵木礦 -item.ironwoodIngot.name=鐵木錠 -item.ironwoodHelm.name=鐵木頭盔 -item.ironwoodPlate.name=鐵木盔甲 -item.ironwoodLegs.name=鐵木護腿 -item.ironwoodBoots.name=鐵木鞋子 -item.ironwoodSword.name=鐵木長劍 -item.ironwoodShovel.name=鐵木鏟 -item.ironwoodPick.name=鐵木鎬 -item.ironwoodAxe.name=鐵木斧 -item.ironwoodHoe.name=鐵木鋤 -item.torchberries.name=火炬果實 -item.venisonRaw.name=生鹿肉 -item.venisonCooked.name=烤鹿排 -item.hydraChop.name=營養肉塊 -item.fieryBlood.name=燃燒的血液 -item.fieryIngot.name=燃燒金屬錠 -item.fieryHelm.name=燃燒頭盔 -item.fieryPlate.name=燃燒盔甲 -item.fieryLegs.name=燃燒護腿 -item.fieryBoots.name=燃燒靴子 -item.fierySword.name=燃燒之劍 -item.fieryPick.name=燃燒之鎬 -item.steeleafIngot.name=鋼之葉 -item.steeleafHelm.name=鋼葉頭盔 -item.steeleafPlate.name=鋼葉盔甲 -item.steeleafLegs.name=鋼葉護腿 -item.steeleafBoots.name=鋼葉靴子 -item.steeleafSword.name=鋼葉之劍 -item.steeleafShovel.name=鋼葉鏟 -item.steeleafPick.name=鋼葉鎬 -item.steeleafAxe.name=鋼葉斧 -item.steeleafHoe.name=鋼葉鋤 -item.minotaurAxe.name=彌諾陶洛斯戰斧 -item.mazebreakerPick.name=迷宮破壞者 -item.transformPowder.name=變換粉末 -item.meefRaw.name=生牛頭人肉 -item.meefSteak.name=牛頭人肉排 -item.meefStroganoff.name=酸奶牛頭人肉排 -item.mazeWafer.name=迷宮脆餅 -item.emptyMagicMap.name=空白的魔法地圖 -item.emptyMazeMap.name=空白的迷宮地圖 -item.emptyOreMap.name=空白的昂貴地圖 -item.oreMagnet.name=礦物磁鐵 -item.crumbleHorn.name=破碎號角 -item.peacockFan.name=孔雀羽扇 -item.moonwormQueen.name=月光蟲女王 -item.charmOfLife1.name=生命護石 I -item.charmOfLife2.name=生命護石 II -item.charmOfKeeping1.name=道具護石 I -item.charmOfKeeping2.name=道具護石 II -item.charmOfKeeping3.name=道具護石 III -item.towerKey.name=迷宮鑰匙 -item.borerEssence.name=蠹蟲精華 -item.carminite.name=砷鉛結晶 -item.trophy.hydra.name=[BOSS]九頭蛇獎盃 -item.trophy.naga.name=[BOSS]納迦王獎盃 -item.trophy.lich.name=[BOSS]巫妖王獎盃 -item.trophy.ur-ghast.name=[BOSS]惡靈烏爾獎盃 -item.experiment115.name=實驗品 115 -item.armorShards.name=護甲碎片 -item.knightMetal.name=騎士金屬錠 -item.shardCluster.name=一疊盔甲碎片 -item.knightlyHelm.name=騎士頭盔 -item.knightlyPlate.name=騎士胸甲 -item.knightlyLegs.name=騎士護腿 -item.knightlyBoots.name=騎士長靴 -item.knightlySword.name=騎士之劍 -item.knightlyPick.name=騎士之鎬 -item.knightlyAxe.name=騎士之斧 -item.phantomHelm.name=幻影頭盔 -item.phantomPlate.name=幻影盔甲 -item.minotaurAxe.tooltip=衝鋒時造成額外傷害 -item.knightlySword.tooltip=對裝甲目標造成額外傷害 -item.knightlyPick.tooltip=對裝甲目標造成額外傷害 -item.knightlyAxe.tooltip=對無防禦值目標造成額外傷害 -entity.TwilightForest.Wild Boar.name=野豬 -entity.TwilightForest.Bighorn Sheep.name=大角羊 -entity.TwilightForest.Wild Deer.name=野鹿 -entity.TwilightForest.Redcap.name=礦坑地精 -entity.TwilightForest.Swarm Spider.name=群居蜘蛛 -entity.TwilightForest.Naga.name=[BOSS]納迦 -entity.TwilightForest.Naga Segment.name=[BOSS]納迦的軀幹 -entity.TwilightForest.Skeleton Druid.name=亡靈德魯伊 -entity.TwilightForest.Hostile Wolf.name=憤怒的狼 -entity.TwilightForest.Twilight Wraith.name=暮光幽靈 -entity.TwilightForest.Hedge Spider.name=樹蛛 -entity.TwilightForest.Hydra.name=[BOSS]九頭蛇 -entity.TwilightForest.HydraHead.name=[BOSS]九頭蛇頭部 -entity.TwilightForest.Twilight Lich.name=[BOSS]巫妖王 -entity.TwilightForest.Penguin.name=企鵝 -entity.TwilightForest.Tiny Bird.name=小鳥 -entity.TwilightForest.Forest Squirrel.name=松鼠 -entity.TwilightForest.Forest Bunny.name=森林兔 -entity.TwilightForest.Forest Raven.name=烏鴉 -entity.TwilightForest.Questing Ram.name=暮色公羊 -entity.TwilightForest.Twilight Kobold.name=暮色哥布林 -entity.TwilightForest.Boggard.name=Boggard [未實裝] -entity.TwilightForest.Lich Minion.name=巫妖王隨從 -entity.TwilightForest.Loyal Zombie.name=殭屍僕從 -entity.TwilightForest.Mosquito Swarm.name=成群的蚊子 -entity.TwilightForest.Death Tome.name=死亡之書 -entity.TwilightForest.Minotaur.name=牛頭人戰士 -entity.TwilightForest.Minoshroom.name=彌諾陶洛斯 -entity.TwilightForest.Fire Beetle.name=噴火甲蟲 -entity.TwilightForest.Slime Beetle.name=黏液甲蟲 -entity.TwilightForest.Pinch Beetle.name=長角鍬形蟲 -entity.TwilightForest.Maze Slime.name=迷宮史萊姆 -entity.TwilightForest.Redcap Sapper.name=礦坑工兵 -entity.TwilightForest.Mist Wolf.name=薄霧巨狼 -entity.TwilightForest.King Spider.name=巨大狼蛛 -entity.TwilightForest.Firefly.name=螢火蟲 -entity.TwilightForest.Mini Ghast.name=暮色迷你惡靈 -entity.TwilightForest.Tower Ghast.name=巨大暮色惡靈 -entity.TwilightForest.Tower Golem.name=暮色高崙守衛 -entity.TwilightForest.Tower Termite.name=漆黑木蠹蟲 -entity.TwilightForest.Redscale Broodling.name=暮色孵化者 -entity.TwilightForest.Tower Boss.name=[BOSS]惡靈烏爾 -entity.TwilightForest.Block&Chain Goblin.name=鐵球哥布林戰士 -entity.TwilightForest.Upper Goblin Knight.name=哥布林騎士[上身] -entity.TwilightForest.Lower Goblin Knight.name=哥布林騎士[下身] -entity.TwilightForest.Helmet Crab.name=裝甲寄居蟹 -entity.TwilightForest.Knight Phantom.name=幻影騎士 -achievement.twilightArrival=暮光森林冒險者! -achievement.twilightArrival.desc=進入暮光森林 -achievement.twilightHedge=壞蟲踐踏者! -achievement.twilightHedge.desc=殺死樹籬迷宮內的蜘蛛 -achievement.twilightHill1=這裡的礦產都是我的! -achievement.twilightHill1.desc=在小型礦坑中殺死了一隻礦坑地精 -achievement.twilightHill2=中型礦坑[未實裝] -achievement.twilightHill2.desc=在中型礦坑中殺死了一隻怪物 -achievement.twilightHill3=早就看穿你了 -achievement.twilightHill3.desc=在大型礦坑中殺死了一隻暮光幽靈 -achievement.twilightHunter=暮光森林獵人 -achievement.twilightHunter.desc=在森林中殺死了野生動物 -achievement.twilightLich=巫妖王獵手 -achievement.twilightLich.desc=擊敗了巫妖王 -achievement.twilightLichScepters=魔法大師 -achievement.twilightLichScepters.desc=獲得暮光森林中所有的魔杖 -achievement.twilightMagicMap=萬里眼 -achievement.twilightMagicMap.desc=製作一張魔法地圖 -achievement.twilightMagicMapFocus=魔法文字 -achievement.twilightMagicMapFocus.desc=用烏鴉羽毛, 螢石粉, 火炬果實做出一個魔法地圖指針 -achievement.twilightMazeMap=隨時隨地都找的到出口 -achievement.twilightMazeMap.desc=獲得迷宮指針後製作一張迷宮地圖 -achievement.twilightNaga=納迦獵手 -achievement.twilightNaga.desc=擊敗了納迦 -achievement.twilightNagaArmors=納迦護甲 -achievement.twilightNagaArmors.desc=製作鱗片外衣和鱗片護腿 -achievement.twilightOreMap=這樣應該值得吧? -achievement.twilightOreMap.desc=製作一張昂貴地圖 -achievement.twilightPortal=暮光森林傳送門 -achievement.twilightPortal.desc=建造到暮光森林的傳送門 \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/zh_cn.json b/src/main/resources/assets/twilightforest/lang/zh_cn.json new file mode 100644 index 0000000000..aa8322f556 --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/zh_cn.json @@ -0,0 +1,1029 @@ +{ + "advancement.twilightforest.arborist": "疯狂树木学家", + "advancement.twilightforest.arborist.desc": "准备好斧子和剪刀。把所有的犄角旮旯全部搜索一遍。然后收集齐所有从树上出来的东西!不论是合成出来还是战利品箱子里搜,不论是台阶还是树苗还是树叶,只要是从树上的哪个部分做出来的都算!", + "advancement.twilightforest.arctic_dyed": "追赶潮流", + "advancement.twilightforest.beanstalk": "杰克与豆茎", + "advancement.twilightforest.experiment_115": "神秘的肉?", + "advancement.twilightforest.experiment_115.desc": "确实长得很像蛋糕......", + "advancement.twilightforest.experiment_115_2": "做个记录:大胜利!", + "advancement.twilightforest.experiment_115_2.desc": "它是如此的松软美味!", + "advancement.twilightforest.experiment_115_3": "每天都吃115,坚持115年,直到永远", + "advancement.twilightforest.experiment_115_3.desc": "每天都吃实验物品1-1-5,不要停,115次实验物品1-1-5,experiment115点com,三w点experiment115点com,115年,每时每刻都来experiment115点com,三w点115×experiment115点com", + "advancement.twilightforest.fiery_set": "血泪成河", + "advancement.twilightforest.fiery_set.desc": "手持炽铁工具或武器,并在物品栏中有至少一件炽铁护甲", + "advancement.twilightforest.full_mettle_alchemist": "钢之炼金术士!?", + "advancement.twilightforest.ghast_trap": "高塔里的奇怪装置", + "advancement.twilightforest.ghast_trap.desc": "以%s为祭品,激活%s,让%s陷入他自己建造的机关!", + "advancement.twilightforest.giants": "飘然云上", + "advancement.twilightforest.glass_sword": "会心一击", + "advancement.twilightforest.glass_sword.desc": "愿善加利用", + "advancement.twilightforest.hedge": "碾碎爬虫", + "advancement.twilightforest.hill1": "靴子是我的!", + "advancement.twilightforest.hill2": "什么动静?", + "advancement.twilightforest.hill3": "我看见你了!", + "advancement.twilightforest.hydra_chop": "快看!九头蛇的肉!", + "advancement.twilightforest.kill_cicada": "给我安静!", + "advancement.twilightforest.kill_hydra": "铲除祸害", + "advancement.twilightforest.kill_lich": "亡者之遗", + "advancement.twilightforest.kill_naga": "剥鳞之时", + "advancement.twilightforest.lich_scepters": "众杖合力!", + "advancement.twilightforest.magic_map": "我有千里眼", + "advancement.twilightforest.magic_map_focus": "用火书写", + "advancement.twilightforest.maze_map": "现在,寻找出口", + "advancement.twilightforest.mazebreaker": "毁坏迷宫", + "advancement.twilightforest.naga_armors": "娜迦装备锻造师", + "advancement.twilightforest.ore_map": "这玩意值这么多?", + "advancement.twilightforest.progress_glacier": "澄澈之空", + "advancement.twilightforest.progress_knights": "机关号令", + "advancement.twilightforest.progress_labyrinth": "强力的牛头人沙拉酱肉", + "advancement.twilightforest.progress_merge": "最终进军!", + "advancement.twilightforest.progress_troll": "让烈焰燃烧得更猛烈些吧!", + "advancement.twilightforest.progress_trophy_pedestal": "蒙尘的荣耀", + "advancement.twilightforest.progress_ur_ghast": "炽厄之泪", + "advancement.twilightforest.progress_yeti": "首领的毛皮", + "advancement.twilightforest.quest_ram": "完美的羊", + "advancement.twilightforest.root": "暮色森林", + "advancement.twilightforest.troll": "恶作剧", + "advancement.twilightforest.twilight_dining": "永恒黄昏之宴", + "advancement.twilightforest.twilight_hunter": "森林之静", + "biome.twilightforest.clearing": "暮光平原", + "biome.twilightforest.dark_forest": "黑暗森林", + "biome.twilightforest.dark_forest_center": "黑暗森林腹地", + "biome.twilightforest.dense_forest": "繁密森林", + "biome.twilightforest.dense_mushroom_forest": "繁密蘑菇森林", + "biome.twilightforest.enchanted_forest": "魔法森林", + "biome.twilightforest.final_plateau": "终焉高原", + "biome.twilightforest.fire_swamp": "火焰沼泽", + "biome.twilightforest.firefly_forest": "萤火虫森林", + "biome.twilightforest.forest": "暮色森林", + "biome.twilightforest.glacier": "极光冰川", + "biome.twilightforest.highlands": "荆棘高地", + "biome.twilightforest.lake": "暮光深湖", + "biome.twilightforest.mushroom_forest": "蘑菇森林", + "biome.twilightforest.oak_savannah": "橡木热带草原", + "biome.twilightforest.snowy_forest": "积雪森林", + "biome.twilightforest.spooky_forest": "幽魂森林", + "biome.twilightforest.stream": "黄昏溪流", + "biome.twilightforest.swamp": "暮光沼泽", + "biome.twilightforest.thornlands": "荆棘之地", + "biome.twilightforest.underground": "地下", + "block.minecraft.banner.twilightforest.alpha_yeti.black": "黑色雪怪首领", + "block.minecraft.banner.twilightforest.alpha_yeti.blue": "蓝色雪怪首领", + "block.minecraft.banner.twilightforest.alpha_yeti.brown": "棕色雪怪首领", + "block.minecraft.banner.twilightforest.alpha_yeti.cyan": "青色雪怪首领", + "block.minecraft.banner.twilightforest.alpha_yeti.gray": "灰色雪怪首领", + "block.minecraft.banner.twilightforest.alpha_yeti.green": "绿色雪怪首领", + "block.minecraft.banner.twilightforest.alpha_yeti.light_blue": "淡蓝色雪怪首领", + "block.minecraft.banner.twilightforest.alpha_yeti.light_gray": "淡灰色雪怪首领", + "block.minecraft.banner.twilightforest.alpha_yeti.lime": "黄绿色雪怪首领", + "block.minecraft.banner.twilightforest.alpha_yeti.magenta": "品红色雪怪首领", + "block.minecraft.banner.twilightforest.alpha_yeti.orange": "橙色雪怪首领", + "block.minecraft.banner.twilightforest.alpha_yeti.pink": "粉红色雪怪首领", + "block.minecraft.banner.twilightforest.alpha_yeti.purple": "紫色雪怪首领", + "block.minecraft.banner.twilightforest.alpha_yeti.red": "红色雪怪首领", + "block.minecraft.banner.twilightforest.alpha_yeti.white": "白色雪怪首领", + "block.minecraft.banner.twilightforest.alpha_yeti.yellow": "黄色雪怪首领", + "block.minecraft.banner.twilightforest.hydra.black": "黑色九头蛇烈焰", + "block.minecraft.banner.twilightforest.hydra.blue": "蓝色九头蛇烈焰", + "block.minecraft.banner.twilightforest.hydra.brown": "棕色九头蛇烈焰", + "block.minecraft.banner.twilightforest.hydra.cyan": "青色九头蛇烈焰", + "block.minecraft.banner.twilightforest.hydra.gray": "灰色九头蛇烈焰", + "block.minecraft.banner.twilightforest.hydra.green": "绿色九头蛇烈焰", + "block.minecraft.banner.twilightforest.hydra.light_blue": "淡蓝色九头蛇烈焰", + "block.minecraft.banner.twilightforest.hydra.light_gray": "淡灰色九头蛇烈焰", + "block.minecraft.banner.twilightforest.hydra.lime": "黄绿色九头蛇烈焰", + "block.minecraft.banner.twilightforest.hydra.magenta": "品红色九头蛇烈焰", + "block.minecraft.banner.twilightforest.hydra.orange": "橙色九头蛇烈焰", + "block.minecraft.banner.twilightforest.hydra.pink": "粉红色九头蛇烈焰", + "block.minecraft.banner.twilightforest.hydra.purple": "紫色九头蛇烈焰", + "block.minecraft.banner.twilightforest.hydra.red": "红色九头蛇烈焰", + "block.minecraft.banner.twilightforest.hydra.white": "白色九头蛇烈焰", + "block.minecraft.banner.twilightforest.hydra.yellow": "黄色九头蛇烈焰", + "block.minecraft.banner.twilightforest.knight_phantom.black": "黑色骑士头盔", + "block.minecraft.banner.twilightforest.knight_phantom.blue": "蓝色骑士头盔", + "block.minecraft.banner.twilightforest.knight_phantom.brown": "棕色骑士头盔", + "block.minecraft.banner.twilightforest.knight_phantom.cyan": "青色骑士头盔", + "block.minecraft.banner.twilightforest.knight_phantom.gray": "灰色骑士头盔", + "block.minecraft.banner.twilightforest.knight_phantom.green": "绿色骑士头盔", + "block.minecraft.banner.twilightforest.knight_phantom.light_blue": "淡蓝色骑士头盔", + "block.minecraft.banner.twilightforest.knight_phantom.light_gray": "淡灰色骑士头盔", + "block.minecraft.banner.twilightforest.knight_phantom.lime": "黄绿色骑士头盔", + "block.minecraft.banner.twilightforest.knight_phantom.magenta": "品红色骑士头盔", + "block.minecraft.banner.twilightforest.knight_phantom.orange": "橙色骑士头盔", + "block.minecraft.banner.twilightforest.knight_phantom.pink": "粉红色骑士头盔", + "block.minecraft.banner.twilightforest.knight_phantom.purple": "紫色骑士头盔", + "block.minecraft.banner.twilightforest.knight_phantom.red": "红色骑士头盔", + "block.minecraft.banner.twilightforest.knight_phantom.white": "白色骑士头盔", + "block.minecraft.banner.twilightforest.knight_phantom.yellow": "黄色骑士头盔", + "block.minecraft.banner.twilightforest.lich.black": "黑色巫妖王冠", + "block.minecraft.banner.twilightforest.lich.blue": "蓝色巫妖王冠", + "block.minecraft.banner.twilightforest.lich.brown": "棕色巫妖王冠", + "block.minecraft.banner.twilightforest.lich.cyan": "青色巫妖王冠", + "block.minecraft.banner.twilightforest.lich.gray": "灰色巫妖王冠", + "block.minecraft.banner.twilightforest.lich.green": "绿色巫妖王冠", + "block.minecraft.banner.twilightforest.lich.light_blue": "淡蓝色巫妖王冠", + "block.minecraft.banner.twilightforest.lich.light_gray": "淡灰色巫妖王冠", + "block.minecraft.banner.twilightforest.lich.lime": "黄绿色巫妖王冠", + "block.minecraft.banner.twilightforest.lich.magenta": "品红色巫妖王冠", + "block.minecraft.banner.twilightforest.lich.orange": "橙色巫妖王冠", + "block.minecraft.banner.twilightforest.lich.pink": "粉红色巫妖王冠", + "block.minecraft.banner.twilightforest.lich.purple": "紫色巫妖王冠", + "block.minecraft.banner.twilightforest.lich.red": "红色巫妖王冠", + "block.minecraft.banner.twilightforest.lich.white": "白色巫妖王冠", + "block.minecraft.banner.twilightforest.lich.yellow": "黄色巫妖王冠", + "block.minecraft.banner.twilightforest.minoshroom.black": "黑色米诺菇战斧", + "block.minecraft.banner.twilightforest.minoshroom.blue": "蓝色米诺菇战斧", + "block.minecraft.banner.twilightforest.minoshroom.brown": "棕色米诺菇战斧", + "block.minecraft.banner.twilightforest.minoshroom.cyan": "青色米诺菇战斧", + "block.minecraft.banner.twilightforest.minoshroom.gray": "灰色米诺菇战斧", + "block.minecraft.banner.twilightforest.minoshroom.green": "绿色米诺菇战斧", + "block.minecraft.banner.twilightforest.minoshroom.light_blue": "淡蓝色米诺菇战斧", + "block.minecraft.banner.twilightforest.minoshroom.light_gray": "淡灰色米诺菇战斧", + "block.minecraft.banner.twilightforest.minoshroom.lime": "黄绿色米诺菇战斧", + "block.minecraft.banner.twilightforest.minoshroom.magenta": "品红色米诺菇战斧", + "block.minecraft.banner.twilightforest.minoshroom.orange": "橙色米诺菇战斧", + "block.minecraft.banner.twilightforest.minoshroom.pink": "粉红色米诺菇战斧", + "block.minecraft.banner.twilightforest.minoshroom.purple": "紫色米诺菇战斧", + "block.minecraft.banner.twilightforest.minoshroom.red": "红色米诺菇战斧", + "block.minecraft.banner.twilightforest.minoshroom.white": "白色米诺菇战斧", + "block.minecraft.banner.twilightforest.minoshroom.yellow": "黄色米诺菇战斧", + "block.minecraft.banner.twilightforest.naga.black": "黑色娜迦鳞片", + "block.minecraft.banner.twilightforest.naga.blue": "蓝色娜迦鳞片", + "block.minecraft.banner.twilightforest.naga.brown": "棕色娜迦鳞片", + "block.minecraft.banner.twilightforest.naga.cyan": "青色娜迦鳞片", + "block.minecraft.banner.twilightforest.naga.gray": "灰色娜迦鳞片", + "block.minecraft.banner.twilightforest.naga.green": "绿色娜迦鳞片", + "block.minecraft.banner.twilightforest.naga.light_blue": "淡蓝色娜迦鳞片", + "block.minecraft.banner.twilightforest.naga.light_gray": "淡灰色娜迦鳞片", + "block.minecraft.banner.twilightforest.naga.lime": "黄绿色娜迦鳞片", + "block.minecraft.banner.twilightforest.naga.magenta": "品红色娜迦鳞片", + "block.minecraft.banner.twilightforest.naga.orange": "橙色娜迦鳞片", + "block.minecraft.banner.twilightforest.naga.pink": "粉红色娜迦鳞片", + "block.minecraft.banner.twilightforest.naga.purple": "紫色娜迦鳞片", + "block.minecraft.banner.twilightforest.naga.red": "红色娜迦鳞片", + "block.minecraft.banner.twilightforest.naga.white": "白色娜迦鳞片", + "block.minecraft.banner.twilightforest.naga.yellow": "黄色娜迦鳞片", + "block.minecraft.banner.twilightforest.quest_ram.black": "黑色谜题羊旋角", + "block.minecraft.banner.twilightforest.quest_ram.blue": "蓝色谜题羊旋角", + "block.minecraft.banner.twilightforest.quest_ram.brown": "棕色谜题羊旋角", + "block.minecraft.banner.twilightforest.quest_ram.cyan": "青色谜题羊旋角", + "block.minecraft.banner.twilightforest.quest_ram.gray": "灰色谜题羊旋角", + "block.minecraft.banner.twilightforest.quest_ram.green": "绿色谜题羊旋角", + "block.minecraft.banner.twilightforest.quest_ram.light_blue": "淡蓝色谜题羊旋角", + "block.minecraft.banner.twilightforest.quest_ram.light_gray": "淡灰色谜题羊旋角", + "block.minecraft.banner.twilightforest.quest_ram.lime": "黄绿色谜题羊旋角", + "block.minecraft.banner.twilightforest.quest_ram.magenta": "品红色谜题羊旋角", + "block.minecraft.banner.twilightforest.quest_ram.orange": "橙色谜题羊旋角", + "block.minecraft.banner.twilightforest.quest_ram.pink": "粉红色谜题羊旋角", + "block.minecraft.banner.twilightforest.quest_ram.purple": "紫色谜题羊旋角", + "block.minecraft.banner.twilightforest.quest_ram.red": "红色谜题羊旋角", + "block.minecraft.banner.twilightforest.quest_ram.white": "白色谜题羊旋角", + "block.minecraft.banner.twilightforest.quest_ram.yellow": "黄色谜题羊旋角", + "block.minecraft.banner.twilightforest.snow_queen.black": "黑色冰雪女王王冠", + "block.minecraft.banner.twilightforest.snow_queen.blue": "蓝色冰雪女王王冠", + "block.minecraft.banner.twilightforest.snow_queen.brown": "棕色冰雪女王王冠", + "block.minecraft.banner.twilightforest.snow_queen.cyan": "青色冰雪女王王冠", + "block.minecraft.banner.twilightforest.snow_queen.gray": "灰色冰雪女王王冠", + "block.minecraft.banner.twilightforest.snow_queen.green": "绿色冰雪女王王冠", + "block.minecraft.banner.twilightforest.snow_queen.light_blue": "淡蓝色冰雪女王王冠", + "block.minecraft.banner.twilightforest.snow_queen.light_gray": "淡灰色冰雪女王王冠", + "block.minecraft.banner.twilightforest.snow_queen.lime": "黄绿色冰雪女王王冠", + "block.minecraft.banner.twilightforest.snow_queen.magenta": "品红色冰雪女王王冠", + "block.minecraft.banner.twilightforest.snow_queen.orange": "橙色冰雪女王王冠", + "block.minecraft.banner.twilightforest.snow_queen.pink": "粉红色冰雪女王王冠", + "block.minecraft.banner.twilightforest.snow_queen.purple": "紫色冰雪女王王冠", + "block.minecraft.banner.twilightforest.snow_queen.red": "红色冰雪女王王冠", + "block.minecraft.banner.twilightforest.snow_queen.white": "白色冰雪女王王冠", + "block.minecraft.banner.twilightforest.snow_queen.yellow": "黄色冰雪女王王冠", + "block.minecraft.banner.twilightforest.ur_ghast.black": "黑色砷铅铁裂纹边", + "block.minecraft.banner.twilightforest.ur_ghast.blue": "蓝色砷铅铁裂纹边", + "block.minecraft.banner.twilightforest.ur_ghast.brown": "棕色砷铅铁裂纹边", + "block.minecraft.banner.twilightforest.ur_ghast.cyan": "青色砷铅铁裂纹边", + "block.minecraft.banner.twilightforest.ur_ghast.gray": "灰色砷铅铁裂纹边", + "block.minecraft.banner.twilightforest.ur_ghast.green": "绿色砷铅铁裂纹边", + "block.minecraft.banner.twilightforest.ur_ghast.light_blue": "淡蓝色砷铅铁裂纹边", + "block.minecraft.banner.twilightforest.ur_ghast.light_gray": "淡灰色砷铅铁裂纹边", + "block.minecraft.banner.twilightforest.ur_ghast.lime": "黄绿色砷铅铁裂纹边", + "block.minecraft.banner.twilightforest.ur_ghast.magenta": "品红色砷铅铁裂纹边", + "block.minecraft.banner.twilightforest.ur_ghast.orange": "橙色砷铅铁裂纹边", + "block.minecraft.banner.twilightforest.ur_ghast.pink": "粉红色砷铅铁裂纹边", + "block.minecraft.banner.twilightforest.ur_ghast.purple": "紫色砷铅铁裂纹边", + "block.minecraft.banner.twilightforest.ur_ghast.red": "红色砷铅铁裂纹边", + "block.minecraft.banner.twilightforest.ur_ghast.white": "白色砷铅铁裂纹边", + "block.minecraft.banner.twilightforest.ur_ghast.yellow": "黄色砷铅铁裂纹边", + "block.twilightforest.acacia_banister": "金合欢木栏杆", + "block.twilightforest.alpha_yeti_boss_spawner": "雪怪首领Boss刷怪笼", + "block.twilightforest.alpha_yeti_trophy": "雪怪首领奖杯", + "block.twilightforest.arctic_fur_block": "极地毛皮块", + "block.twilightforest.aurora_block": "极光方块", + "block.twilightforest.aurora_pillar": "极光柱", + "block.twilightforest.aurora_slab": "极光台阶", + "block.twilightforest.auroralized_glass": "极光玻璃", + "block.twilightforest.banister.cycle": "使用斧头右击来改变样式", + "block.twilightforest.beanstalk_leaves": "豆茎叶", + "block.twilightforest.birch_banister": "白桦木栏杆", + "block.twilightforest.blue_castle_door": "蓝色城堡门", + "block.twilightforest.blue_castle_rune_brick": "蓝色城堡符文砖", + "block.twilightforest.blue_force_field": "蓝色力场", + "block.twilightforest.bold_castle_brick_pillar": "粗纹城堡砖柱", + "block.twilightforest.bold_castle_brick_stairs": "粗纹城堡砖楼梯", + "block.twilightforest.bold_stone_pillar": "石巨柱", + "block.twilightforest.brown_thorns": "荆棘", + "block.twilightforest.built_block": "构建方块", + "block.twilightforest.burnt_thorns": "烧焦荆棘", + "block.twilightforest.candelabra": "烛台", + "block.twilightforest.canopy_banister": "苍穹木栏杆", + "block.twilightforest.canopy_bookshelf": "苍穹木书架", + "block.twilightforest.canopy_button": "苍穹木按钮", + "block.twilightforest.canopy_chest": "苍穹木箱子", + "block.twilightforest.canopy_door": "苍穹木门", + "block.twilightforest.canopy_fence": "苍穹木栅栏", + "block.twilightforest.canopy_fence_gate": "苍穹木栅栏门", + "block.twilightforest.canopy_leaves": "苍穹树叶", + "block.twilightforest.canopy_log": "苍穹原木", + "block.twilightforest.canopy_planks": "苍穹木板", + "block.twilightforest.canopy_pressure_plate": "苍穹木压力板", + "block.twilightforest.canopy_sapling": "苍穹树苗", + "block.twilightforest.canopy_sign": "苍穹木告示牌", + "block.twilightforest.canopy_slab": "苍穹木台阶", + "block.twilightforest.canopy_stairs": "苍穹木楼梯", + "block.twilightforest.canopy_trapdoor": "苍穹木活板门", + "block.twilightforest.canopy_wall_sign": "苍穹木告示牌", + "block.twilightforest.canopy_wood": "苍穹木", + "block.twilightforest.carminite_block": "砷铅铁块", + "block.twilightforest.carminite_builder": "砷铅铁建造器", + "block.twilightforest.carminite_reactor": "砷铅铁反应堆", + "block.twilightforest.casket.broken": "你的遗物匣破损不堪,无法存放更多物品。所有本应存入匣中的物品全部掉落在地。", + "block.twilightforest.casket.locked": "这个匣子只能由%s打开!", + "block.twilightforest.castle_brick": "城堡砖", + "block.twilightforest.castle_brick_stairs": "城堡砖楼梯", + "block.twilightforest.castle_roof_tile": "城堡顶瓦", + "block.twilightforest.cicada": "蝉", + "block.twilightforest.cicada_jar": "蝉罐子", + "block.twilightforest.cinder_furnace": "余烬熔炉", + "block.twilightforest.cinder_log": "余烬原木", + "block.twilightforest.cinder_wood": "余烬木", + "block.twilightforest.clover_patch": "三叶草", + "block.twilightforest.cracked_castle_brick": "裂纹城堡砖", + "block.twilightforest.cracked_castle_brick_stairs": "裂纹城堡砖楼梯", + "block.twilightforest.cracked_deadrock": "裂纹死岩", + "block.twilightforest.cracked_mazestone": "裂纹迷宫石砖", + "block.twilightforest.cracked_underbrick": "裂纹地下砖", + "block.twilightforest.creeper_skull_candle": "苦力怕头颅烛台", + "block.twilightforest.creeper_wall_skull_candle": "悬吊式苦力怕头颅烛台", + "block.twilightforest.crimson_banister": "绯红木栏杆", + "block.twilightforest.cut_mazestone": "錾制迷宫石", + "block.twilightforest.dark_button": "黑木按钮", + "block.twilightforest.dark_door": "黑木门", + "block.twilightforest.dark_fence": "黑木栅栏", + "block.twilightforest.dark_fence_gate": "黑木栅栏门", + "block.twilightforest.dark_leaves": "黑树树叶", + "block.twilightforest.dark_log": "黑木原木", + "block.twilightforest.dark_oak_banister": "深色橡木栏杆", + "block.twilightforest.dark_planks": "黑木木板", + "block.twilightforest.dark_pressure_plate": "黑木压力板", + "block.twilightforest.dark_slab": "黑木台阶", + "block.twilightforest.dark_stairs": "黑木楼梯", + "block.twilightforest.dark_trapdoor": "黑木活板门", + "block.twilightforest.darkwood_sapling": "黑树树苗", + "block.twilightforest.deadrock": "死岩", + "block.twilightforest.death_tome_spawner": "死灵书柜", + "block.twilightforest.decorative_mazestone": "装饰迷宫石砖", + "block.twilightforest.empty_canopy_bookshelf": "空苍穹书架", + "block.twilightforest.encased_castle_brick_pillar": "黑纹城堡砖柱", + "block.twilightforest.encased_castle_brick_stairs": "黑纹城堡砖楼梯", + "block.twilightforest.encased_castle_brick_tile": "黑纹城堡砖瓦", + "block.twilightforest.encased_fire_jet": "封装射焰方块", + "block.twilightforest.encased_smoker": "封装烟雾方块", + "block.twilightforest.etched_nagastone": "蚀刻娜迦石", + "block.twilightforest.experiment_115": "试验物品115", + "block.twilightforest.fiery_block": "炽铁块", + "block.twilightforest.final_boss_boss_spawner": "高原首领【暂定】Boss刷怪笼", + "block.twilightforest.fire_jet": "射焰方块", + "block.twilightforest.firefly": "萤火虫", + "block.twilightforest.firefly_jar": "萤火虫罐子", + "block.twilightforest.firefly_particle_spawner": "萤火粒子罐", + "block.twilightforest.fluffy_cloud": "浮云", + "block.twilightforest.ghast_trap": "恶魂陷阱", + "block.twilightforest.giant_cobblestone": "巨型圆石", + "block.twilightforest.giant_leaves": "巨型树叶", + "block.twilightforest.giant_log": "巨型原木", + "block.twilightforest.giant_obsidian": "巨型黑曜石", + "block.twilightforest.green_force_field": "绿色力场", + "block.twilightforest.green_thorns": "翠绿荆棘", + "block.twilightforest.hardened_dark_leaves": "茂密黑树树叶", + "block.twilightforest.hedge": "树篱", + "block.twilightforest.hollow_acacia_log_climbable": "空心金合欢原木", + "block.twilightforest.hollow_acacia_log_horizontal": "空心金合欢原木", + "block.twilightforest.hollow_acacia_log_vertical": "空心金合欢原木", + "block.twilightforest.hollow_birch_log_climbable": "空心白桦原木", + "block.twilightforest.hollow_birch_log_horizontal": "空心白桦原木", + "block.twilightforest.hollow_birch_log_vertical": "空心白桦原木", + "block.twilightforest.hollow_crimson_stem_climbable": "空心绯红菌柄", + "block.twilightforest.hollow_crimson_stem_horizontal": "空心绯红菌柄", + "block.twilightforest.hollow_crimson_stem_vertical": "空心绯红菌柄", + "block.twilightforest.hollow_dark_log_climbable": "空心黑木原木", + "block.twilightforest.hollow_dark_log_horizontal": "空心黑木原木", + "block.twilightforest.hollow_dark_log_vertical": "空心黑木原木", + "block.twilightforest.hollow_dark_oak_log_climbable": "空心深色橡木原木", + "block.twilightforest.hollow_dark_oak_log_horizontal": "空心深色橡木原木", + "block.twilightforest.hollow_dark_oak_log_vertical": "空心深色橡木原木", + "block.twilightforest.hollow_jungle_log_climbable": "空心丛林原木", + "block.twilightforest.hollow_jungle_log_horizontal": "空心丛林原木", + "block.twilightforest.hollow_jungle_log_vertical": "空心丛林原木", + "block.twilightforest.hollow_mangrove_log_climbable": "空心红树原木", + "block.twilightforest.hollow_mangrove_log_horizontal": "空心红树原木", + "block.twilightforest.hollow_mangrove_log_vertical": "空心红树原木", + "block.twilightforest.hollow_mining_log_climbable": "空心矿石原木", + "block.twilightforest.hollow_mining_log_horizontal": "空心矿石原木", + "block.twilightforest.hollow_mining_log_vertical": "空心矿石原木", + "block.twilightforest.hollow_oak_log_climbable": "空心橡木原木", + "block.twilightforest.hollow_oak_log_horizontal": "空心橡木原木", + "block.twilightforest.hollow_oak_log_vertical": "空心橡木原木", + "block.twilightforest.hollow_oak_sapling": "高大暮色橡树树苗", + "block.twilightforest.hollow_sorting_log_climbable": "空心分类原木", + "block.twilightforest.hollow_sorting_log_horizontal": "空心分类原木", + "block.twilightforest.hollow_sorting_log_vertical": "空心分类原木", + "block.twilightforest.hollow_spruce_log_climbable": "空心云杉原木", + "block.twilightforest.hollow_spruce_log_horizontal": "空心云杉原木", + "block.twilightforest.hollow_spruce_log_vertical": "空心云杉原木", + "block.twilightforest.hollow_time_log_climbable": "空心时光原木", + "block.twilightforest.hollow_time_log_horizontal": "空心时光原木", + "block.twilightforest.hollow_time_log_vertical": "空心时光原木", + "block.twilightforest.hollow_transformation_log_climbable": "空心变化原木", + "block.twilightforest.hollow_transformation_log_horizontal": "空心变化原木", + "block.twilightforest.hollow_transformation_log_vertical": "空心变化原木", + "block.twilightforest.hollow_twilight_oak_log_climbable": "空心暮色橡木原木", + "block.twilightforest.hollow_twilight_oak_log_horizontal": "空心暮色橡木原木", + "block.twilightforest.hollow_twilight_oak_log_vertical": "空心暮色橡木原木", + "block.twilightforest.hollow_vangrove_log_climbable": "空心红树原木", + "block.twilightforest.hollow_vangrove_log_horizontal": "空心红树原木", + "block.twilightforest.hollow_vangrove_log_vertical": "空心红树原木", + "block.twilightforest.hollow_warped_stem_climbable": "空心诡异菌柄", + "block.twilightforest.hollow_warped_stem_horizontal": "空心诡异菌柄", + "block.twilightforest.hollow_warped_stem_vertical": "空心诡异菌柄", + "block.twilightforest.huge_lily_pad": "巨型睡莲", + "block.twilightforest.huge_mushgloom_stem": "巨型荧光蘑菇柄", + "block.twilightforest.huge_stalk": "巨茎", + "block.twilightforest.huge_water_lily": "巨型荷花", + "block.twilightforest.hydra_boss_spawner": "九头蛇Boss刷怪笼", + "block.twilightforest.hydra_trophy": "九头蛇奖杯", + "block.twilightforest.iron_ladder": "铁梯子", + "block.twilightforest.ironwood_block": "铁木块", + "block.twilightforest.jungle_banister": "丛林木栏杆", + "block.twilightforest.keepsake_casket": "遗物匣", + "block.twilightforest.knight_phantom_boss_spawner": "幻影骑士Boss刷怪笼", + "block.twilightforest.knight_phantom_trophy": "幻影骑士奖杯", + "block.twilightforest.knightmetal_block": "骑士金属块", + "block.twilightforest.lich_boss_spawner": "巫妖Boss刷怪笼", + "block.twilightforest.lich_tower_miniature_structure": "巫妖怪塔微缩雕塑", + "block.twilightforest.lich_trophy": "巫妖奖杯", + "block.twilightforest.liveroot_block": "活根", + "block.twilightforest.locked_vanishing_block": "锁定的消失方块", + "block.twilightforest.mangrove_banister": "红树木栏杆", + "block.twilightforest.mangrove_button": "红树木按钮", + "block.twilightforest.mangrove_chest": "红树木箱子", + "block.twilightforest.mangrove_door": "红树木门", + "block.twilightforest.mangrove_fence": "红树木栅栏", + "block.twilightforest.mangrove_fence_gate": "红树木栅栏门", + "block.twilightforest.mangrove_leaves": "红树树叶", + "block.twilightforest.mangrove_log": "红树原木", + "block.twilightforest.mangrove_planks": "红树木板", + "block.twilightforest.mangrove_pressure_plate": "红树木压力板", + "block.twilightforest.mangrove_root": "红树根", + "block.twilightforest.mangrove_sapling": "红树树苗", + "block.twilightforest.mangrove_sign": "红树木告示牌", + "block.twilightforest.mangrove_slab": "红树木台阶", + "block.twilightforest.mangrove_stairs": "红树木楼梯", + "block.twilightforest.mangrove_trapdoor": "红树木活板门", + "block.twilightforest.mangrove_wall_sign": "红树木告示牌", + "block.twilightforest.mangrove_wood": "红树木", + "block.twilightforest.mayapple": "鬼臼果", + "block.twilightforest.mazestone": "迷宫石", + "block.twilightforest.mazestone_border": "迷宫石沿", + "block.twilightforest.mazestone_brick": "迷宫石砖", + "block.twilightforest.mazestone_mosaic": "迷宫镶石", + "block.twilightforest.mining_banister": "矿石木栏杆", + "block.twilightforest.mining_button": "矿石木按钮", + "block.twilightforest.mining_chest": "矿石木箱子", + "block.twilightforest.mining_door": "矿石木门", + "block.twilightforest.mining_fence": "矿石木栅栏", + "block.twilightforest.mining_fence_gate": "矿石木栅栏门", + "block.twilightforest.mining_leaves": "矿石树叶", + "block.twilightforest.mining_log": "矿石原木", + "block.twilightforest.mining_log_core": "矿石树核心", + "block.twilightforest.mining_planks": "矿石木板", + "block.twilightforest.mining_pressure_plate": "矿石木压力板", + "block.twilightforest.mining_sapling": "矿石树苗", + "block.twilightforest.mining_sign": "矿石木告示牌", + "block.twilightforest.mining_slab": "矿石木台阶", + "block.twilightforest.mining_stairs": "矿石木楼梯", + "block.twilightforest.mining_trapdoor": "矿石木活板门", + "block.twilightforest.mining_wall_sign": "矿石木告示牌", + "block.twilightforest.minoshroom_boss_spawner": "米诺菇Boss刷怪笼", + "block.twilightforest.minoshroom_trophy": "米诺菇奖杯", + "block.twilightforest.moonworm": "月光蠕虫", + "block.twilightforest.moss_patch": "苔藓块", + "block.twilightforest.mossy_castle_brick": "生苔城堡砖", + "block.twilightforest.mossy_castle_brick_stairs": "生苔城堡砖楼梯", + "block.twilightforest.mossy_etched_nagastone": "蚀刻娜迦苔石", + "block.twilightforest.mossy_mazestone": "生苔迷宫石砖", + "block.twilightforest.mossy_nagastone_pillar": "娜迦苔石柱", + "block.twilightforest.mossy_nagastone_stairs_left": "娜迦苔石楼梯(左)", + "block.twilightforest.mossy_nagastone_stairs_right": "娜迦苔石楼梯(右)", + "block.twilightforest.mossy_underbrick": "生苔地下砖", + "block.twilightforest.mushgloom": "荧光蘑菇", + "block.twilightforest.naga_boss_spawner": "娜迦Boss刷怪笼", + "block.twilightforest.naga_courtyard_miniature_structure": "娜迦庭院微缩雕塑", + "block.twilightforest.naga_trophy": "娜迦奖杯", + "block.twilightforest.nagastone": "娜迦石", + "block.twilightforest.nagastone_head": "娜迦石首", + "block.twilightforest.nagastone_pillar": "娜迦石柱", + "block.twilightforest.nagastone_stairs_left": "娜迦石楼梯(左)", + "block.twilightforest.nagastone_stairs_right": "娜迦石楼梯(右)", + "block.twilightforest.oak_banister": "橡木栏杆", + "block.twilightforest.orange_force_field": "橙色力场", + "block.twilightforest.player_skull_candle": "头颅烛台", + "block.twilightforest.player_skull_candle.named": "%s的头颅烛台", + "block.twilightforest.player_wall_skull_candle": "悬吊式头颅烛台", + "block.twilightforest.potted_canopy_sapling": "苍穹树苗盆栽", + "block.twilightforest.potted_darkwood_sapling": "黑树树苗盆栽", + "block.twilightforest.potted_dead_thorn": "烧焦荆棘盆栽", + "block.twilightforest.potted_green_thorn": "翠绿荆棘盆栽", + "block.twilightforest.potted_hollow_oak_sapling": "高大暮色橡树树苗盆栽", + "block.twilightforest.potted_mayapple": "鬼臼果盆栽", + "block.twilightforest.potted_mining_sapling": "矿石树苗盆栽", + "block.twilightforest.potted_mushgloom": "荧光蘑菇盆栽", + "block.twilightforest.potted_rainbow_oak_sapling": "彩虹橡树树苗盆栽", + "block.twilightforest.potted_sorting_sapling": "分类树苗盆栽", + "block.twilightforest.potted_thorn": "荆棘盆栽", + "block.twilightforest.potted_time_sapling": "时光树苗盆栽", + "block.twilightforest.potted_transformation_sapling": "变化树苗盆栽", + "block.twilightforest.potted_twilight_oak_sapling": "暮色橡树树苗盆栽", + "block.twilightforest.quest_ram_trophy": "谜题羊奖杯", + "block.twilightforest.rainbow_oak_leaves": "彩虹橡树树叶", + "block.twilightforest.rainbow_oak_sapling": "彩虹橡树树苗", + "block.twilightforest.reactor_debris": "反应堆残遗", + "block.twilightforest.reappearing_block": "重现方块", + "block.twilightforest.red_thread": "红线", + "block.twilightforest.root": "根", + "block.twilightforest.root_strand": "根须", + "block.twilightforest.skeleton_skull_candle": "骷髅头烛台", + "block.twilightforest.skeleton_wall_skull_candle": "悬吊式骷髅头烛台", + "block.twilightforest.slider": "滑动陷阱", + "block.twilightforest.smoker": "烟雾方块", + "block.twilightforest.snow_queen_boss_spawner": "冰雪女王Boss刷怪笼", + "block.twilightforest.snow_queen_trophy": "冰雪女王奖杯", + "block.twilightforest.sorting_banister": "分类木栏杆", + "block.twilightforest.sorting_button": "分类木按钮", + "block.twilightforest.sorting_chest": "分类木箱子", + "block.twilightforest.sorting_door": "分类木门", + "block.twilightforest.sorting_fence": "分类木栅栏", + "block.twilightforest.sorting_fence_gate": "分类木栅栏门", + "block.twilightforest.sorting_leaves": "分类树叶", + "block.twilightforest.sorting_log": "分类原木", + "block.twilightforest.sorting_log_core": "分类树引擎", + "block.twilightforest.sorting_planks": "分类木板", + "block.twilightforest.sorting_pressure_plate": "分类木压力板", + "block.twilightforest.sorting_sapling": "分类树苗", + "block.twilightforest.sorting_sign": "分类木告示牌", + "block.twilightforest.sorting_slab": "分类木台阶", + "block.twilightforest.sorting_stairs": "分类木楼梯", + "block.twilightforest.sorting_trapdoor": "分类木活板门", + "block.twilightforest.sorting_wall_sign": "分类木告示牌", + "block.twilightforest.spiral_bricks": "螺旋石砖", + "block.twilightforest.spruce_banister": "云杉木栏杆", + "block.twilightforest.steeleaf_block": "钢叶块", + "block.twilightforest.stripped_canopy_log": "去皮苍穹原木", + "block.twilightforest.stripped_canopy_wood": "去皮苍穹木", + "block.twilightforest.stripped_dark_log": "去皮黑木原木", + "block.twilightforest.stripped_mangrove_log": "去皮红树原木", + "block.twilightforest.stripped_mangrove_wood": "去皮红树木", + "block.twilightforest.stripped_mining_log": "去皮矿石原木", + "block.twilightforest.stripped_sorting_log": "去皮分类原木", + "block.twilightforest.stripped_time_log": "去皮时光原木", + "block.twilightforest.stripped_transformation_log": "去皮变化原木", + "block.twilightforest.stripped_twilight_oak_log": "去皮暮色橡木原木", + "block.twilightforest.stripped_twilight_oak_wood": "去皮暮色橡木", + "block.twilightforest.stronghold_shield": "要塞护盾", + "block.twilightforest.thick_castle_brick": "厚重城堡砖", + "block.twilightforest.thorn_leaves": "荆棘叶", + "block.twilightforest.thorn_rose": "荆棘玫瑰", + "block.twilightforest.time_banister": "时光木栏杆", + "block.twilightforest.time_button": "时光木按钮", + "block.twilightforest.time_chest": "时光木箱子", + "block.twilightforest.time_door": "时光木门", + "block.twilightforest.time_fence": "时光木栅栏", + "block.twilightforest.time_fence_gate": "时光木栅栏门", + "block.twilightforest.time_leaves": "时光树叶", + "block.twilightforest.time_log": "时光原木", + "block.twilightforest.time_log_core": "时光树时钟", + "block.twilightforest.time_planks": "时光木板", + "block.twilightforest.time_pressure_plate": "时光木压力板", + "block.twilightforest.time_sapling": "时光树苗", + "block.twilightforest.time_sign": "时光木告示牌", + "block.twilightforest.time_slab": "时光木台阶", + "block.twilightforest.time_stairs": "时光木楼梯", + "block.twilightforest.time_trapdoor": "时光木活板门", + "block.twilightforest.time_wall_sign": "时光木告示牌", + "block.twilightforest.torchberry_plant": "火炬浆果植物", + "block.twilightforest.towerwood": "塔木木板", + "block.twilightforest.transformation_banister": "变化木栏杆", + "block.twilightforest.transformation_button": "变化木按钮", + "block.twilightforest.transformation_chest": "变化木箱子", + "block.twilightforest.transformation_door": "变化木门", + "block.twilightforest.transformation_fence": "变化木栅栏", + "block.twilightforest.transformation_fence_gate": "变化木栅栏门", + "block.twilightforest.transformation_leaves": "变化树叶", + "block.twilightforest.transformation_log": "变化原木", + "block.twilightforest.transformation_log_core": "变化树心脏", + "block.twilightforest.transformation_planks": "变化木板", + "block.twilightforest.transformation_pressure_plate": "变化木压力板", + "block.twilightforest.transformation_sapling": "变化树苗", + "block.twilightforest.transformation_sign": "变化木告示牌", + "block.twilightforest.transformation_slab": "变化木台阶", + "block.twilightforest.transformation_stairs": "变化木楼梯", + "block.twilightforest.transformation_trapdoor": "变化木活板门", + "block.twilightforest.transformation_wall_sign": "变化木告示牌", + "block.twilightforest.trollber": "巨魔莓", + "block.twilightforest.trollsteinn": "巨魔岩石", + "block.twilightforest.trollvidr": "巨魔藤蔓", + "block.twilightforest.trophy_pedestal": "奖杯基座", + "block.twilightforest.twilight_oak_banister": "暮色橡木栏杆", + "block.twilightforest.twilight_oak_button": "暮色橡木按钮", + "block.twilightforest.twilight_oak_chest": "暮色橡木箱子", + "block.twilightforest.twilight_oak_door": "暮色橡木门", + "block.twilightforest.twilight_oak_fence": "暮色橡木栅栏", + "block.twilightforest.twilight_oak_fence_gate": "暮色橡木栅栏门", + "block.twilightforest.twilight_oak_leaves": "暮色橡树树叶", + "block.twilightforest.twilight_oak_log": "暮色橡木原木", + "block.twilightforest.twilight_oak_planks": "暮色橡木木板", + "block.twilightforest.twilight_oak_pressure_plate": "暮色橡木压力板", + "block.twilightforest.twilight_oak_sapling": "暮色橡树树苗", + "block.twilightforest.twilight_oak_sign": "暮色橡木告示牌", + "block.twilightforest.twilight_oak_slab": "暮色橡木台阶", + "block.twilightforest.twilight_oak_stairs": "暮色橡木楼梯", + "block.twilightforest.twilight_oak_trapdoor": "暮色橡木活板门", + "block.twilightforest.twilight_oak_wood": "暮色橡木", + "block.twilightforest.twilight_portal": "暮色森林传送门", + "block.twilightforest.twisted_stone": "螺纹石", + "block.twilightforest.twisted_stone_pillar": "螺纹石柱", + "block.twilightforest.uberous_soil": "肥沃泥土", + "block.twilightforest.uncrafting_table": "拆解台", + "block.twilightforest.underbrick": "地下砖", + "block.twilightforest.underbrick_floor": "抛光地下砖", + "block.twilightforest.unripe_trollber": "未熟的巨魔莓", + "block.twilightforest.ur_ghast_boss_spawner": "暮初恶魂Boss刷怪笼", + "block.twilightforest.ur_ghast_trophy": "暮初恶魂奖杯", + "block.twilightforest.vangrove_banister": "红树木栏杆", + "block.twilightforest.vanishing_block": "消失方块", + "block.twilightforest.violet_castle_door": "紫色城堡门", + "block.twilightforest.violet_castle_rune_brick": "紫色城堡符文砖", + "block.twilightforest.violet_force_field": "紫色力场", + "block.twilightforest.warped_banister": "诡异木栏杆", + "block.twilightforest.weathered_deadrock": "风化死岩", + "block.twilightforest.wispy_cloud": "薄云", + "block.twilightforest.wither_skeleton_skull_candle": "凋灵骷髅头烛台", + "block.twilightforest.wither_skeleton_wall_skull_candle": "悬吊式凋灵骷髅头烛台", + "block.twilightforest.worn_castle_brick": "磨损城堡砖", + "block.twilightforest.worn_castle_brick_stairs": "磨损城堡砖楼梯", + "block.twilightforest.yellow_castle_door": "黄色城堡门", + "block.twilightforest.yellow_castle_rune_brick": "黄色城堡符文砖", + "block.twilightforest.zombie_skull_candle": "僵尸头颅烛台", + "block.twilightforest.zombie_wall_skull_candle": "悬吊式僵尸头颅烛台", + "commands.tffeature.center": "地标中心:%s", + "commands.tffeature.chunk": "是否在地标区块中:%s", + "commands.tffeature.nearest": "距离当前位置最近的地标:%s", + "commands.tffeature.none_nearby": "附近无法找到地标!", + "commands.tffeature.not_in_twilight_forest": "你现在不在暮色森林维度中", + "commands.tffeature.structure.conquer.status": "当前结构征服标记:%s", + "commands.tffeature.structure.conquer.update": "当前结构征服标记现已从%s更改为%s", + "commands.tffeature.structure.required": "你现在不在某个结构中", + "commands.tffeature.structure.spawn_info": "%s,权重%s", + "commands.tffeature.structure.spawn_list": "此区域的生成列表为:", + "config.jade.plugin_twilightforest.quest_ram_wool": "谜题羊羊毛", + "death.attack.twilightforest.axing": "%1$s被%2$s剁碎了", + "death.attack.twilightforest.axing.item": "%1$s被%2$s用%3$s剁碎了", + "death.attack.twilightforest.chillingBreath": "%1$s被冰雪女王冻死了", + "death.attack.twilightforest.chillingBreath.player": "%1$s在试图逃离%2$s时被冰雪女王冻死了", + "death.attack.twilightforest.expired": "%1$s的生命消逝了", + "death.attack.twilightforest.expired.player": "%1$s的生命消逝了", + "death.attack.twilightforest.frozen": "%1$s被%2$s用冰霜炸弹冻成了冰雕", + "death.attack.twilightforest.frozen.item": "%1$s被%2$s用%3$s冻成了冰雕", + "death.attack.twilightforest.ghastTear": "%1$s被炽厄泪浇淋致死", + "death.attack.twilightforest.ghastTear.player": "%1$s在试图逃离%2$s时被炽厄泪浇淋致死", + "death.attack.twilightforest.haunt": "%1$s加入了%2$s的游魂队伍", + "death.attack.twilightforest.hydraBite": "%1$s被九头蛇剥了皮", + "death.attack.twilightforest.hydraBite.player": "%1$s在试图逃离%2$s时被九头蛇剥了皮", + "death.attack.twilightforest.hydraFire": "%1$s被九头蛇活活烤熟了", + "death.attack.twilightforest.hydraFire.player": "%1$s在试图逃离%2$s时被九头蛇活活烤熟了", + "death.attack.twilightforest.leafBrain": "%1$s的脑子被%2$s变成了树叶", + "death.attack.twilightforest.leafBrain.item": "%1$s的脑子被%2$s用%3$s变成了树叶", + "death.attack.twilightforest.lichBolt": "巫妖的准头比%1$s更好", + "death.attack.twilightforest.lichBolt.player": "巫妖和%2$s的准头比%1$s更好", + "death.attack.twilightforest.lichBomb": "%1$s落败于巫妖的爆炸魔法之下", + "death.attack.twilightforest.lichBomb.player": "%1$s在试图逃离%2$s时落败于巫妖的爆炸魔法之下", + "death.attack.twilightforest.lifedrain": "%1$s被%2$s抽干了生命", + "death.attack.twilightforest.lifedrain.item": "%1$s被%2$s用%3$s抽干了生命", + "death.attack.twilightforest.lostWords": "%1$s被%2$s杀死后失语了", + "death.attack.twilightforest.lostWords.item": "%1$s被%2$s用%3$s杀死后失语了", + "death.attack.twilightforest.moonworm": "%1$s被月光蠕虫击中致死", + "death.attack.twilightforest.schooled": "%1$s被%2$s留堂了", + "death.attack.twilightforest.schooled.item": "%1$s被%2$s用%3$s留堂了", + "death.attack.twilightforest.scorched": "%1$s被%2$s烤焦了", + "death.attack.twilightforest.scorched.item": "%1$s被%2$s用%3$s烤焦了", + "death.attack.twilightforest.snowballFight": "%1$s在雪仗中被%2$s击败了", + "death.attack.twilightforest.snowballFight.item": "%1$s在雪仗中被%2$s用%3$s击败了", + "death.attack.twilightforest.squish": "%1$s被冰雪女王压扁了", + "death.attack.twilightforest.squish.player": "%1$s在试图逃离%2$s时被冰雪女王压扁了", + "death.attack.twilightforest.thorns": "%1$s走进了荆棘丛", + "death.attack.twilightforest.thorns.player": "%1$s在试图逃离%2$s时走进了荆棘丛", + "death.attack.twilightforest.thrownAxe": "%1$s被掷出的斧砍掉了脑袋", + "death.attack.twilightforest.thrownAxe.player": "%1$s在试图逃离%2$s时被掷出的斧砍掉了脑袋", + "death.attack.twilightforest.thrownPickaxe": "%1$s被掷出的镐砸碎了脑袋", + "death.attack.twilightforest.thrownPickaxe.player": "%1$s在试图逃离%2$s时被掷出的镐砸碎了脑袋", + "death.attack.twilightforest.yeeted": "%1$s人生中最后一次被%2$s抛起", + "death.attack.twilightforest.yeeted.entity": "%1$s人生中最后一次被%2$s抛起", + "death.attack.twilightforest.yeeted.item": "%1$s在手持%3$s时人生中最后一次被%2$s抛起", + "dimension.twilightforest.twilightforest": "暮色森林", + "effect.twilightforest.frosted": "霜冻", + "enchantment.twilightforest.chill_aura": "凛寒气场", + "enchantment.twilightforest.chill_aura.desc": "增加攻击者在击中佩戴者后被霜冻的概率。", + "enchantment.twilightforest.destruction": "肆意毁坏", + "enchantment.twilightforest.destruction.desc": "让链锤的破坏区域变得更大。", + "enchantment.twilightforest.fire_react": "炽焰反制", + "enchantment.twilightforest.fire_react.desc": "增加攻击者在击中佩戴者后被点燃的概率。", + "entity.twilightforest.alpha_yeti": "雪怪首领", + "entity.twilightforest.armored_giant": "武装巨人", + "entity.twilightforest.bighorn_sheep": "大角羊", + "entity.twilightforest.blockchain_goblin": "链锤哥布林", + "entity.twilightforest.carminite_broodling": "砷铅铁寄生虫", + "entity.twilightforest.carminite_ghastguard": "高塔守卫", + "entity.twilightforest.carminite_ghastling": "砷铅铁恶灵", + "entity.twilightforest.carminite_golem": "砷铅铁傀儡", + "entity.twilightforest.chain_block": "链锤", + "entity.twilightforest.charm_effect": "符咒视效", + "entity.twilightforest.cube_of_annihilation": "湮灭立方", + "entity.twilightforest.death_tome": "死灵书", + "entity.twilightforest.dwarf_rabbit": "侏儒兔", + "entity.twilightforest.falling_ice": "陨冰", + "entity.twilightforest.fire_beetle": "喷火甲虫", + "entity.twilightforest.giant_miner": "巨人矿工", + "entity.twilightforest.hedge_spider": "树篱蜘蛛", + "entity.twilightforest.helmet_crab": "寄居蟹", + "entity.twilightforest.hostile_wolf": "恶狼", + "entity.twilightforest.hydra": "九头蛇", + "entity.twilightforest.hydra_mortar": "九头蛇爆弹", + "entity.twilightforest.ice_arrow": "寒冰箭", + "entity.twilightforest.ice_crystal": "冰晶", + "entity.twilightforest.ice_snowball": "冰霜雪球", + "entity.twilightforest.king_spider": "国王蜘蛛", + "entity.twilightforest.knight_phantom": "幻影骑士", + "entity.twilightforest.kobold": "狗头人", + "entity.twilightforest.lich_bolt": "巫妖法束", + "entity.twilightforest.lich_bomb": "爆炸巫妖法束", + "entity.twilightforest.lich_minion": "巫妖仆从", + "entity.twilightforest.lower_goblin_knight": "哥布林骑士(下身)", + "entity.twilightforest.loyal_zombie": "忠诚的僵尸", + "entity.twilightforest.maze_slime": "迷宫史莱姆", + "entity.twilightforest.minoshroom": "米诺菇", + "entity.twilightforest.minotaur": "牛头人", + "entity.twilightforest.mist_wolf": "迷雾狼", + "entity.twilightforest.moonworm_shot": "月光蠕虫", + "entity.twilightforest.mosquito_swarm": "蚊群", + "entity.twilightforest.naga": "娜迦", + "entity.twilightforest.nature_bolt": "自然法束", + "entity.twilightforest.penguin": "企鹅", + "entity.twilightforest.pinch_beetle": "巨钳甲虫", + "entity.twilightforest.protection_box": "进度保护箱", + "entity.twilightforest.quest_ram": "谜题羊", + "entity.twilightforest.redcap_sapper": "红帽工兵", + "entity.twilightforest.rising_zombie": "僵尸", + "entity.twilightforest.seeker_arrow": "追踪箭", + "entity.twilightforest.skeleton_druid": "骷髅德鲁伊", + "entity.twilightforest.slider": "滑动陷阱", + "entity.twilightforest.slime_beetle": "黏液甲虫", + "entity.twilightforest.slime_blob": "黏液滴", + "entity.twilightforest.snow_guardian": "冰雪守卫", + "entity.twilightforest.snow_queen": "冰雪女王", + "entity.twilightforest.stable_ice_core": "冰精灵", + "entity.twilightforest.swarm_spider": "集群蜘蛛", + "entity.twilightforest.thrown_wep": "投掷武器", + "entity.twilightforest.tiny_bird": "小鸟", + "entity.twilightforest.tome_bolt": "死灵书法束", + "entity.twilightforest.towerwood_borer": "塔木蛀虫", + "entity.twilightforest.unstable_ice_core": "破碎冰精灵", + "entity.twilightforest.upper_goblin_knight": "哥布林骑士(上身)", + "entity.twilightforest.ur_ghast": "暮初恶魂", + "entity.twilightforest.wand_bolt": "黄昏权杖法束", + "entity.twilightforest.winter_wolf": "寒冬狼", + "entity.twilightforest.yeti": "雪怪", + "item.twilightforest.alpha_yeti_banner_pattern": "旗帜图案", + "item.twilightforest.alpha_yeti_banner_pattern.desc": "雪怪首领", + "item.twilightforest.alpha_yeti_fur": "雪怪首领毛皮", + "item.twilightforest.alpha_yeti_spawn_egg": "雪怪首领刷怪蛋", + "item.twilightforest.arctic_boots": "极地靴子", + "item.twilightforest.arctic_chestplate": "极地皮衣", + "item.twilightforest.arctic_fur": "极地毛皮", + "item.twilightforest.arctic_helmet": "极地风帽", + "item.twilightforest.arctic_leggings": "极地护腿", + "item.twilightforest.armor_shard": "装甲碎片", + "item.twilightforest.armor_shard_cluster": "装甲碎片堆", + "item.twilightforest.armored_giant_spawn_egg": "武装巨人刷怪蛋", + "item.twilightforest.bighorn_sheep_spawn_egg": "大角羊刷怪蛋", + "item.twilightforest.block_and_chain": "链锤", + "item.twilightforest.blockchain_goblin_spawn_egg": "链锤哥布林刷怪蛋", + "item.twilightforest.borer_essence": "蛀虫精华", + "item.twilightforest.brittle_potion_flask": "易碎药水瓶", + "item.twilightforest.carminite": "砷铅铁矿石", + "item.twilightforest.carminite_broodling_spawn_egg": "砷铅铁寄生虫刷怪蛋", + "item.twilightforest.carminite_ghastguard_spawn_egg": "砷铅铁守卫刷怪蛋", + "item.twilightforest.carminite_ghastling_spawn_egg": "砷铅铁恶灵刷怪蛋", + "item.twilightforest.carminite_golem_spawn_egg": "砷铅铁傀儡刷怪蛋", + "item.twilightforest.charm_of_keeping_1": "保管符咒 I", + "item.twilightforest.charm_of_keeping_2": "保管符咒 II", + "item.twilightforest.charm_of_keeping_3": "保管符咒 III", + "item.twilightforest.charm_of_life_1": "生命符咒 I", + "item.twilightforest.charm_of_life_2": "生命符咒 II", + "item.twilightforest.cooked_meef": "牛头人肉排", + "item.twilightforest.cooked_venison": "鹿肉排", + "item.twilightforest.crumble_horn": "瓦解之号角", + "item.twilightforest.cube_of_annihilation": "湮灭立方", + "item.twilightforest.cube_talisman": "立方护符", + "item.twilightforest.death_tome_spawn_egg": "死灵书刷怪蛋", + "item.twilightforest.diamond_minotaur_axe": "钻石米诺陶战斧", + "item.twilightforest.dwarf_rabbit_spawn_egg": "侏儒兔刷怪蛋", + "item.twilightforest.ender_bow": "末影弓", + "item.twilightforest.fiery_blood": "炽热的血液", + "item.twilightforest.fiery_boots": "炽铁靴子", + "item.twilightforest.fiery_chestplate": "炽铁胸甲", + "item.twilightforest.fiery_helmet": "炽铁头盔", + "item.twilightforest.fiery_ingot": "炽铁锭", + "item.twilightforest.fiery_leggings": "炽铁护腿", + "item.twilightforest.fiery_pickaxe": "炽铁镐", + "item.twilightforest.fiery_sword": "炽铁剑", + "item.twilightforest.fiery_tears": "炽热之泪", + "item.twilightforest.filled_magic_map": "魔法地图", + "item.twilightforest.filled_maze_map": "迷宫地图", + "item.twilightforest.filled_ore_map": "迷宫/矿石地图", + "item.twilightforest.fire_beetle_spawn_egg": "喷火甲虫刷怪蛋", + "item.twilightforest.fortification_scepter": "护盾权杖", + "item.twilightforest.giant_miner_spawn_egg": "巨人矿工刷怪蛋", + "item.twilightforest.giant_pickaxe": "巨人镐", + "item.twilightforest.giant_sword": "巨人剑", + "item.twilightforest.glass_sword": "玻璃剑", + "item.twilightforest.gold_minotaur_axe": "金米诺陶战斧", + "item.twilightforest.greater_potion_flask": "大型药水瓶", + "item.twilightforest.hedge_spider_spawn_egg": "树篱蜘蛛刷怪蛋", + "item.twilightforest.helmet_crab_spawn_egg": "寄居蟹刷怪蛋", + "item.twilightforest.hostile_wolf_spawn_egg": "恶狼刷怪蛋", + "item.twilightforest.hydra_banner_pattern": "旗帜图案", + "item.twilightforest.hydra_banner_pattern.desc": "九头蛇烈焰", + "item.twilightforest.hydra_chop": "九头蛇肉排", + "item.twilightforest.hydra_spawn_egg": "九头蛇刷怪蛋", + "item.twilightforest.ice_bomb": "冰霜炸弹", + "item.twilightforest.ice_bow": "寒冰弓", + "item.twilightforest.ice_crystal_spawn_egg": "冰晶刷怪蛋", + "item.twilightforest.ice_sword": "寒冰剑", + "item.twilightforest.ironwood_axe": "铁木斧", + "item.twilightforest.ironwood_boots": "铁木靴子", + "item.twilightforest.ironwood_chestplate": "铁木胸甲", + "item.twilightforest.ironwood_helmet": "铁木头盔", + "item.twilightforest.ironwood_hoe": "铁木锄", + "item.twilightforest.ironwood_ingot": "铁木锭", + "item.twilightforest.ironwood_leggings": "铁木护腿", + "item.twilightforest.ironwood_pickaxe": "铁木镐", + "item.twilightforest.ironwood_shovel": "铁木锹", + "item.twilightforest.ironwood_sword": "铁木剑", + "item.twilightforest.king_spider_spawn_egg": "国王蜘蛛刷怪蛋", + "item.twilightforest.knight_phantom_banner_pattern": "旗帜图案", + "item.twilightforest.knight_phantom_banner_pattern.desc": "骑士头盔", + "item.twilightforest.knight_phantom_spawn_egg": "幻影骑士刷怪蛋", + "item.twilightforest.knightmetal_axe": "骑士斧", + "item.twilightforest.knightmetal_boots": "骑士靴子", + "item.twilightforest.knightmetal_chestplate": "骑士胸甲", + "item.twilightforest.knightmetal_helmet": "骑士头盔", + "item.twilightforest.knightmetal_ingot": "骑士金属锭", + "item.twilightforest.knightmetal_leggings": "骑士护腿", + "item.twilightforest.knightmetal_pickaxe": "骑士镐", + "item.twilightforest.knightmetal_ring": "骑士金属环", + "item.twilightforest.knightmetal_shield": "骑士盾牌", + "item.twilightforest.knightmetal_sword": "骑士剑", + "item.twilightforest.kobold_spawn_egg": "狗头人刷怪蛋", + "item.twilightforest.lamp_of_cinders": "余烬之灯", + "item.twilightforest.lich_banner_pattern": "旗帜图案", + "item.twilightforest.lich_banner_pattern.desc": "巫妖王冠", + "item.twilightforest.lifedrain_scepter": "吸血权杖", + "item.twilightforest.liveroot": "活根", + "item.twilightforest.lower_goblin_knight_spawn_egg": "哥布林骑士刷怪蛋", + "item.twilightforest.magic_beans": "魔豆", + "item.twilightforest.magic_map": "空白魔法地图", + "item.twilightforest.magic_map_focus": "魔法地图核心", + "item.twilightforest.maze_map": "空白迷宫地图", + "item.twilightforest.maze_map_focus": "迷宫地图核心", + "item.twilightforest.maze_slime_spawn_egg": "迷宫史莱姆刷怪蛋", + "item.twilightforest.maze_wafer": "迷宫薄饼", + "item.twilightforest.mazebreaker_pickaxe": "迷宫破坏者", + "item.twilightforest.meef_stroganoff": "牛头人沙拉酱肉", + "item.twilightforest.minoshroom_banner_pattern": "旗帜图案", + "item.twilightforest.minoshroom_banner_pattern.desc": "米诺菇战斧", + "item.twilightforest.minoshroom_spawn_egg": "米诺菇刷怪蛋", + "item.twilightforest.minotaur_spawn_egg": "牛头人刷怪蛋", + "item.twilightforest.mist_wolf_spawn_egg": "迷雾狼刷怪蛋", + "item.twilightforest.moon_dial": "月相罗盘", + "item.twilightforest.moon_dial.phase_0": "满月", + "item.twilightforest.moon_dial.phase_1": "亏凸月", + "item.twilightforest.moon_dial.phase_2": "下弦月", + "item.twilightforest.moon_dial.phase_3": "残月", + "item.twilightforest.moon_dial.phase_4": "新月", + "item.twilightforest.moon_dial.phase_5": "娥眉月", + "item.twilightforest.moon_dial.phase_6": "上弦月", + "item.twilightforest.moon_dial.phase_7": "盈凸月", + "item.twilightforest.moon_dial.phase_unknown": "月相不确定", + "item.twilightforest.moon_dial.phase_unknown_fools": "404错误,月亮未找到", + "item.twilightforest.moonworm_queen": "月光蠕虫女王", + "item.twilightforest.mosquito_swarm_spawn_egg": "蚊群刷怪蛋", + "item.twilightforest.music_disc_findings": "音乐唱片", + "item.twilightforest.music_disc_home": "音乐唱片", + "item.twilightforest.music_disc_maker": "音乐唱片", + "item.twilightforest.music_disc_motion": "音乐唱片", + "item.twilightforest.music_disc_radiance": "音乐唱片", + "item.twilightforest.music_disc_steps": "音乐唱片", + "item.twilightforest.music_disc_superstitious": "音乐唱片", + "item.twilightforest.music_disc_thread": "音乐唱片", + "item.twilightforest.music_disc_wayfarer": "音乐唱片", + "item.twilightforest.naga_banner_pattern": "旗帜图案", + "item.twilightforest.naga_banner_pattern.desc": "娜迦鳞片", + "item.twilightforest.naga_chestplate": "娜迦胸甲", + "item.twilightforest.naga_leggings": "娜迦护腿", + "item.twilightforest.naga_scale": "娜迦鳞片", + "item.twilightforest.naga_spawn_egg": "娜迦刷怪蛋", + "item.twilightforest.ore_magnet": "矿石磁铁", + "item.twilightforest.ore_map": "空白迷宫/矿石地图", + "item.twilightforest.ore_meter": "矿石感应仪", + "item.twilightforest.peacock_feather_fan": "孔雀羽扇", + "item.twilightforest.penguin_spawn_egg": "企鹅刷怪蛋", + "item.twilightforest.phantom_chestplate": "幻影胸甲", + "item.twilightforest.phantom_helmet": "幻影头盔", + "item.twilightforest.pinch_beetle_spawn_egg": "巨钳甲虫刷怪蛋", + "item.twilightforest.quest_ram_banner_pattern": "旗帜图案", + "item.twilightforest.quest_ram_banner_pattern.desc": "谜题羊旋角", + "item.twilightforest.quest_ram_spawn_egg": "谜题羊刷怪蛋", + "item.twilightforest.raven_feather": "渡鸦羽毛", + "item.twilightforest.raw_ironwood": "粗铁木", + "item.twilightforest.raw_meef": "生牛头人肉", + "item.twilightforest.raw_venison": "生鹿肉", + "item.twilightforest.redcap_sapper_spawn_egg": "红帽工兵刷怪蛋", + "item.twilightforest.seeker_bow": "追踪弓", + "item.twilightforest.skeleton_druid_spawn_egg": "骷髅德鲁伊刷怪蛋", + "item.twilightforest.skull_candle.desc": "摆有:%s %s蜡烛", + "item.twilightforest.skull_candle.desc.multiple": "摆有:%s %s蜡烛", + "item.twilightforest.slime_beetle_spawn_egg": "黏液甲虫刷怪蛋", + "item.twilightforest.snow_guardian_spawn_egg": "冰雪守卫刷怪蛋", + "item.twilightforest.snow_queen_banner_pattern": "旗帜图案", + "item.twilightforest.snow_queen_banner_pattern.desc": "冰雪女王王冠", + "item.twilightforest.snow_queen_spawn_egg": "冰雪女王刷怪蛋", + "item.twilightforest.stable_ice_core_spawn_egg": "冰精灵刷怪蛋", + "item.twilightforest.steeleaf_axe": "钢叶斧", + "item.twilightforest.steeleaf_boots": "钢叶靴子", + "item.twilightforest.steeleaf_chestplate": "钢叶胸甲", + "item.twilightforest.steeleaf_helmet": "钢叶头盔", + "item.twilightforest.steeleaf_hoe": "钢叶锄", + "item.twilightforest.steeleaf_ingot": "钢叶", + "item.twilightforest.steeleaf_leggings": "钢叶护腿", + "item.twilightforest.steeleaf_pickaxe": "钢叶镐", + "item.twilightforest.steeleaf_shovel": "钢叶锹", + "item.twilightforest.steeleaf_sword": "钢叶剑", + "item.twilightforest.swarm_spider_spawn_egg": "集群蜘蛛刷怪蛋", + "item.twilightforest.tiny_bird_spawn_egg": "小鸟刷怪蛋", + "item.twilightforest.torchberries": "火炬浆果", + "item.twilightforest.tower_key": "塔钥匙", + "item.twilightforest.towerwood_borer_spawn_egg": "塔木蛀虫刷怪蛋", + "item.twilightforest.transformation_powder": "转换粉", + "item.twilightforest.twilight_oak_boat": "暮色橡木船", + "item.twilightforest.twilight_scepter": "黄昏权杖", + "item.twilightforest.unstable_ice_core_spawn_egg": "破碎冰精灵刷怪蛋", + "item.twilightforest.ur_ghast_banner_pattern": "旗帜图案", + "item.twilightforest.ur_ghast_banner_pattern.desc": "砷铅铁裂纹边", + "item.twilightforest.ur_ghast_spawn_egg": "暮初恶魂刷怪蛋", + "item.twilightforest.winter_wolf_spawn_egg": "寒冬狼刷怪蛋", + "item.twilightforest.yeti_boots": "雪怪靴子", + "item.twilightforest.yeti_chestplate": "雪怪皮衣", + "item.twilightforest.yeti_helmet": "雪怪角盔", + "item.twilightforest.yeti_leggings": "雪怪护腿", + "item.twilightforest.yeti_spawn_egg": "雪怪刷怪蛋", + "item.twilightforest.zombie_scepter": "僵尸权杖", + "itemGroup.twilightforest.blocks": "暮色森林:方块", + "itemGroup.twilightforest.equipment": "暮色森林:装备", + "itemGroup.twilightforest.items": "暮色森林:物品", + "stat.twilightforest.e115_slices_eaten": "吃掉的试验物品115份数", + "stat.twilightforest.tf_shields_broken": "击破护盾数", + "stat.twilightforest.torchberries_harvested": "火炬浆果采集次数", + "stat.twilightforest.trophy_pedestals_activated": "奖杯基座激活次数", + "stat.twilightforest.uncrafting_table_interactions": "与拆解台互动次数", + "structure.twilightforest.aurora_palace": "极光宫殿", + "structure.twilightforest.dark_tower": "幽冥高塔", + "structure.twilightforest.hedge_maze": "树篱迷宫", + "structure.twilightforest.hydra_lair": "九头蛇巢穴", + "structure.twilightforest.knight_stronghold": "黑松骑士要塞", + "structure.twilightforest.labyrinth": "牛头人迷宫", + "structure.twilightforest.large_hollow_hill": "亡灵矿山", + "structure.twilightforest.lich_tower": "巫妖怪塔", + "structure.twilightforest.medium_hollow_hill": "工兵矿山", + "structure.twilightforest.mushroom_tower": "巨蕈堡垒", + "structure.twilightforest.naga_courtyard": "娜迦庭院", + "structure.twilightforest.quest_grove": "谜题羊树丛", + "structure.twilightforest.small_hollow_hill": "空心矿山", + "structure.twilightforest.yeti_cave": "雪怪洞窟", + "subtitles.twilightforest.block.beanstalk.grow": "豆茎:生长", + "subtitles.twilightforest.block.bug.squish": "虫子被压扁了 :(", + "subtitles.twilightforest.block.casket.close": "遗物匣:关闭", + "subtitles.twilightforest.block.casket.locked": "遗物匣:锁上", + "subtitles.twilightforest.block.casket.open": "遗物匣:开启", + "subtitles.twilightforest.block.core.time": "时光树:计时", + "subtitles.twilightforest.block.core.transformation": "变化树:嗡嗡作响", + "subtitles.twilightforest.block.door.reappear": "城堡门:重现", + "subtitles.twilightforest.block.door.vanish": "城堡门:消失", + "subtitles.twilightforest.block.ghast_trap.ambient": "恶魂陷阱:警报", + "subtitles.twilightforest.block.ghast_trap.spindown": "恶魂陷阱:熄灭", + "subtitles.twilightforest.block.ghast_trap.warmup": "恶魂陷阱:升温", + "subtitles.twilightforest.block.jet.active": "射焰方块:射焰", + "subtitles.twilightforest.block.jet.pop": "射焰方块:砰砰", + "subtitles.twilightforest.block.reactor.ambient": "砷铅铁反应堆:嗡鸣", + "subtitles.twilightforest.block.torchberry.harvest": "火炬浆果:嘣", + "subtitles.twilightforest.block.vanish.unlock": "塔木门:解锁", + "subtitles.twilightforest.entity.boar.ambient": "野猪:响鼻", + "subtitles.twilightforest.entity.boar.death": "野猪:死亡", + "subtitles.twilightforest.entity.boar.hurt": "野猪:受伤", + "subtitles.twilightforest.entity.deer.ambient": "野鹿:喘息", + "subtitles.twilightforest.entity.deer.death": "野鹿:死亡", + "subtitles.twilightforest.entity.deer.hurt": "野鹿:受伤", + "subtitles.twilightforest.entity.dwarf_rabbit.ambient": "侏儒兔:吱吱叫", + "subtitles.twilightforest.entity.dwarf_rabbit.death": "侏儒兔:死亡", + "subtitles.twilightforest.entity.dwarf_rabbit.hurt": "侏儒兔:受伤", + "subtitles.twilightforest.entity.hydra.growl": "九头蛇:低吼", + "subtitles.twilightforest.entity.hydra.hurt": "九头蛇:咆哮", + "subtitles.twilightforest.entity.hydra.roar": "九头蛇:怒吼", + "subtitles.twilightforest.entity.hydra.shoot_fire": "九头蛇:火焰喷射", + "subtitles.twilightforest.entity.hydra.warn": "九头蛇:愤怒", + "subtitles.twilightforest.entity.ice.death": "冰精灵:解体", + "subtitles.twilightforest.entity.ice.hurt": "冰精灵:破裂", + "subtitles.twilightforest.entity.kobold.ambient": "狗头人:咕哝", + "subtitles.twilightforest.entity.kobold.death": "狗头人:死亡", + "subtitles.twilightforest.entity.kobold.hurt": "狗头人:受伤", + "subtitles.twilightforest.entity.kobold.munch": "狗头人:咀嚼", + "subtitles.twilightforest.entity.lich.ambient": "巫妖:愤怒", + "subtitles.twilightforest.entity.lich.death": "巫妖:死亡", + "subtitles.twilightforest.entity.lich.hurt": "巫妖:受伤", + "subtitles.twilightforest.entity.lich.shoot": "巫妖:法术射击", + "subtitles.twilightforest.entity.lich.teleport": "巫妖:法术传送", + "subtitles.twilightforest.entity.minion.ambient": "巫妖仆从:呻吟", + "subtitles.twilightforest.entity.minion.death": "巫妖仆从:死亡", + "subtitles.twilightforest.entity.minion.hurt": "巫妖仆从:受伤", + "subtitles.twilightforest.entity.minion.summon": "巫妖:法术召唤", + "subtitles.twilightforest.entity.minoshroom.ambient": "米诺菇:哞……", + "subtitles.twilightforest.entity.minoshroom.death": "米诺菇:死亡", + "subtitles.twilightforest.entity.minoshroom.hurt": "米诺菇:受伤", + "subtitles.twilightforest.entity.minoshroom.slam": "米诺菇:震地", + "subtitles.twilightforest.entity.minotaur.ambient": "牛头人:哞~", + "subtitles.twilightforest.entity.minotaur.death": "牛头人:死亡", + "subtitles.twilightforest.entity.minotaur.hurt": "牛头人:受伤", + "subtitles.twilightforest.entity.mosquito.ambient": "蚊群:嗡鸣", + "subtitles.twilightforest.entity.naga.hiss": "娜迦:嘶嘶", + "subtitles.twilightforest.entity.naga.hurt": "娜迦:嘶叫", + "subtitles.twilightforest.entity.naga.rattle": "娜迦:响尾", + "subtitles.twilightforest.entity.raven.caw": "渡鸦:嘶鸣", + "subtitles.twilightforest.entity.redcap.ambient": "红帽:轻笑", + "subtitles.twilightforest.entity.redcap.death": "红帽:痛苦地呻吟", + "subtitles.twilightforest.entity.redcap.hurt": "红帽:痛苦地尖叫", + "subtitles.twilightforest.entity.tear.break": "暮初恶魂:粉碎", + "subtitles.twilightforest.entity.troll.throw_rock": "巨魔:抛扔", + "subtitles.twilightforest.entity.wraith.ambient": "幽灵:喘息", + "subtitles.twilightforest.entity.wraith.death": "幽灵:消逝", + "subtitles.twilightforest.entity.wraith.hurt": "幽灵:受伤", + "subtitles.twilightforest.entity.yeti.death": "雪怪:死亡", + "subtitles.twilightforest.entity.yeti.growl": "雪怪:咆哮", + "subtitles.twilightforest.entity.yeti.hurt": "雪怪:受伤", + "subtitles.twilightforest.item.charm.keep": "保管符咒:返还物品", + "subtitles.twilightforest.item.flask.break": "易碎瓶:破碎", + "subtitles.twilightforest.item.flask.crack": "易碎瓶:破裂", + "subtitles.twilightforest.item.flask.fill": "药水瓶:填充", + "subtitles.twilightforest.item.knightmetal_shield.shatter": "骑士盾牌:破碎", + "subtitles.twilightforest.item.moonworm.squish": "月光蠕虫:发射", + "subtitles.twilightforest.item.scepter.drain": "吸血权杖:施法", + "subtitles.twilightforest.item.scepter.pearl": "黄昏权杖:施法", + "subtitles.twilightforest.item.shield.shatter": "护盾:破碎", + "twilightforest.book.author": "一位被遗忘的探索者", + "twilightforest.book.darktower": "有关一座木塔的笔记", + "twilightforest.book.darktower.1": "§8[[疑似从爆炸中生还的探险家笔记]]§0\n\n这塔里的机关显然不受我控制。我几乎是要触碰到机关所蕴含的魔力了,但是就差那么一点。只有一种解释:这机关被附近什么东西的力量压制住了。", + "twilightforest.book.darktower.2": "§8[[下一篇]]§0\n\n这力量的来源似乎是附近要塞深处散发出的魔法能量。这魔力不可能是哥布林的,因为这魔力虽然吸引人,但并非集中在一起。", + "twilightforest.book.darktower.3": "要塞里肯定还有什么东西。\n\n§8[[下一篇]]§0\n\n根据我的分析,这股魔力有数股来源,这些来源一个整体的形式工作。让我先等补给过来再说……", + "twilightforest.book.hydralair": "有关火焰沼泽的笔记", + "twilightforest.book.icetower": "有关极光堡垒的笔记", + "twilightforest.book.labyrinth": "有关沼泽迷宫的笔记", + "twilightforest.book.lichtower": "有关一座尖塔的笔记", + "twilightforest.book.tfstronghold": "有关要塞的笔记", + "twilightforest.book.trollcave": "有关高原的笔记", + "twilightforest.book.unknown": "有关未解之谜的笔记", + "twilightforest.book.yeticave": "有关一座冰霜洞窟的笔记" +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/lang/zh_tw.json b/src/main/resources/assets/twilightforest/lang/zh_tw.json new file mode 100644 index 0000000000..e2a6081e7c --- /dev/null +++ b/src/main/resources/assets/twilightforest/lang/zh_tw.json @@ -0,0 +1,1609 @@ +{ + "itemGroup.twilightforest": "Twilight Forest", + + "advancement.twilightforest.root.desc": "Enter the mysterious magical woodlands: the Twilight Forest.", + "advancement.twilightforest.hedge": "Bug Stomper", + "advancement.twilightforest.hedge.desc": "Defeat a spider in a Hedge Maze.", + "advancement.twilightforest.kill_cicada": "Shut", + "advancement.twilightforest.kill_cicada.desc": "Kill a cicada", + "advancement.twilightforest.hill1": "The Boots Are Mine!", + "advancement.twilightforest.hill1.desc": "Defeat a %s in a Small Hollow Hill.", + "advancement.twilightforest.hill2": "What Was That Noise?", + "advancement.twilightforest.hill2.desc": "Defeat a %s in a Medium Hollow Hill.", + "advancement.twilightforest.hill3": "I See Right Through You", + "advancement.twilightforest.hill3.desc": "Defeat a %s in a Large Hollow Hill.", + "advancement.twilightforest.quest_ram": "Consummate Baaahs", + "advancement.twilightforest.quest_ram.desc": "Give the %s what it is missing.", + "advancement.twilightforest.magic_map_focus": "With Fire It Writes", + "advancement.twilightforest.magic_map_focus.desc": "Craft the %s with a %s, %s, and %s.", + "advancement.twilightforest.magic_map": "I Can See Forever", + "advancement.twilightforest.magic_map.desc": "Craft the %s.", + "advancement.twilightforest.maze_map": "And Now, to Find the Exit", + "advancement.twilightforest.maze_map.desc": "Craft the %s after obtaining the focus from the labyrinth.", + "advancement.twilightforest.ore_map": "How Can That Be Worth It?", + "advancement.twilightforest.ore_map.desc": "Craft the %s.", + "advancement.twilightforest.twilight_hunter": "The Silence of the Forest", + "advancement.twilightforest.twilight_hunter.desc": "Hunt some of the local wildlife.", + "advancement.twilightforest.kill_naga": "Time To Even The Scales", + "advancement.twilightforest.kill_naga.desc": "Slay the %s in its forest courtyard and obtain a %s to overcome the barrier magic surrounding the Lich's tower.", + "advancement.twilightforest.naga_armors": "Naga Armorer", + "advancement.twilightforest.naga_armors.desc": "Craft both %s chest and leg armor.", + "advancement.twilightforest.kill_lich": "Bring Out Your Dead", + "advancement.twilightforest.kill_lich.desc": "Slay the %s at top of his tower and retrieve a scepter to clear poisonous mosquitoes from the Swamp, see through blinding darkness of the Dark Forest's curse, and resist the Snowy Forest's chill.", + "advancement.twilightforest.lich_scepters": "By Our Powers Combined!", + "advancement.twilightforest.lich_scepters.desc": "Acquire all four scepters of power.", + "advancement.twilightforest.full_mettle_alchemist": "Full Mettle Alchemist", + "advancement.twilightforest.full_mettle_alchemist.desc": "Drink four doses of Harming II from a potion flask in under 8 seconds and survive.", + "advancement.twilightforest.progress_labyrinth": "Mighty Stroganoff", + "advancement.twilightforest.progress_labyrinth.desc": "The meat & mushroom stew pleasantly warms you, enough so that you feel you're acclimatised enough to venture into the Fire Swamp.", + "advancement.twilightforest.kill_hydra": "Hydra Slayer", + "advancement.twilightforest.kill_hydra.desc": "Defeat the mighty %s and empower yourself.", + "advancement.twilightforest.mazebreaker": "Breaking the Maze", + "advancement.twilightforest.mazebreaker.desc": "Find the %s pickaxe in the secret labyrinth vault.", + "advancement.twilightforest.hydra_chop": "Hydra Chop, Baby!", + "advancement.twilightforest.hydra_chop.desc": "Chow down on some overpowered %s meat when your food bar is empty.", + "advancement.twilightforest.progress_trophy_pedestal": "Trophied Champion", + "advancement.twilightforest.progress_trophy_pedestal.desc": "Claim your title by placing a trophy on the pedestal in the dark forest ruins.", + "advancement.twilightforest.progress_knights": "Carminite Acclimation", + "advancement.twilightforest.progress_knights.desc": "Settle the restless phantoms in the Knight's Tomb and the carminite tower's devices will obey you.", + "advancement.twilightforest.ghast_trap": "Something Strange in Towerwood", + "advancement.twilightforest.ghast_trap.desc": "Slay the %ss around a %s and activate to wrench the %s from the sky!", + "advancement.twilightforest.progress_ur_ghast": "Tears of Fire", + "advancement.twilightforest.progress_ur_ghast.desc": "Touch the fiery red tears of the %s.", + "advancement.twilightforest.experiment_115": "Mystery Meat?", + "advancement.twilightforest.experiment_115.desc": "It looks like cake, though...", + "advancement.twilightforest.experiment_115_2": "Making a note: Huge Success!", + "advancement.twilightforest.experiment_115_2.desc": "It's so delicious and moist!", + "advancement.twilightforest.progress_yeti": "Alpha Fur", + "advancement.twilightforest.progress_yeti.desc": "Line your garments with the soft fur from the %s, keeping you safe from the Glacier's cold.", + "advancement.twilightforest.progress_glacier": "Clear Skies", + "advancement.twilightforest.progress_glacier.desc": "Defeat the %s atop the Aurora Palace.", + "advancement.twilightforest.arctic_dyed": "Getting in Fashion", + "advancement.twilightforest.arctic_dyed.desc": "Dye all four pieces of Arctic Armor.", + "advancement.twilightforest.glass_sword": "One Hit Wonder", + "advancement.twilightforest.glass_sword.desc": "Hope you made good use of that.", + "advancement.twilightforest.fiery_set": "Gallons of Blood and Tears", + "advancement.twilightforest.fiery_set.desc": "Wield a fiery tool or weapon while having at least one piece of fiery armor in your inventory.", + "advancement.twilightforest.progress_merge": "Ultimate Showdown", + "advancement.twilightforest.progress_merge.desc": "Slay the %s, %s, and %s to clear the acid rain and embolden yourself for the Highlands.", + "advancement.twilightforest.troll": "We Do a Little Trolling", + "advancement.twilightforest.troll.desc": "Find and kill a %s.", + "advancement.twilightforest.beanstalk": "Jack and the Beanstalk", + "advancement.twilightforest.beanstalk.desc": "Obtain some %s in the troll caves and use them on the glowing soil beneath the clouds.", + "advancement.twilightforest.giants": "I'm on Cloud Nine", + "advancement.twilightforest.giants.desc": "Kill a %s in the clouds, retrieve a %s, and return back to the troll caves.", + "advancement.twilightforest.progress_troll": "I Wish For More Burning", + "advancement.twilightforest.progress_troll.desc": "Find the %s in the troll caves, and you can burn away the thorn barriers.", + "advancement.twilightforest.progress_thorns": "Past the Thorns [NYI]", + "advancement.twilightforest.progress_thorns.desc": "Make it past the Thornlands, and unlock the door of the castle.", + "advancement.twilightforest.progress_castle": "So Castle Very Wow [NYI]", + "advancement.twilightforest.progress_castle.desc": "What could even be in that castle?!?", + "advancement.twilightforest.twilight_dining": "We Dine At Eternal Sundown", + "advancement.twilightforest.twilight_dining.desc": "Eat ALL of the Food exclusive to the Twilight Forest.", + "advancement.twilightforest.experiment_115_3": "Eating 115 Everyday, 115 Years, Forever", + "advancement.twilightforest.experiment_115_3.desc": "eating experiment one-hundred-fifteen all day, forever, one-hundred-fifteen times experiment one-hundred-fifteen, experiment one-hundred-fifteen dot com, double-u double-u double-u dot experiment one-hundred-fifteen dot com, one-hundred-fifteen years, every minute experiment one-hundred-fifteen dot com, double-u double-u double-u dot one-hundred-fifteen times experiment one-hundred-fifteen dot com", + "advancement.twilightforest.arborist": "Maniacal Dendrologist", + "advancement.twilightforest.arborist.desc": "Get your axes and shears ready. Search every nook and cranny and get anything and everything that comes from trees! Craft, loot, obtain every slab... sapling... leaves... more... everything. ALL OF IT!", + + "twilightforest.twilight_portal.unsafe": "It doesn't seem safe here...", + "twilightforest.trophy_pedestal.ineligible": "You are unworthy.", + "twilightforest.ore_meter.range": "Radius: %s, Origin: [%s, %s]", + "twilightforest.ore_meter.exposed": "Exposed: %s", + "twilightforest.scepter_charges": "%d charges left", + + "commands.tffeature.usage": "/tffeature ", + "commands.tffeature.not_in_twilight_forest": "You are not in the Twilight Forest dimension", + "commands.tffeature.none_nearby": "Couldn't find a feature nearby!", + "commands.tffeature.nearest": "The nearest feature is: %s", + "commands.tffeature.center": "Center of feature: %s", + "commands.tffeature.chunk": "Located in feature chunk: %s", + "commands.tffeature.structure.inside": "You are in the structure for that feature", + "commands.tffeature.structure.outside": "You are not in the structure for that feature", + "commands.tffeature.structure.required": "You are not in a structure", + "commands.tffeature.structure.conquer.status": "Structure conquer flag: %s", + "commands.tffeature.structure.conquer.update": "Structure conquer flag was %s, changing to %s", + "commands.tffeature.structure.spawn_list": "Spawn list for this area is:", + "commands.tffeature.structure.spawn_info": "%s, Weight %s", + + "biome.twilightforest.forest": "Twilight Forest", + "biome.twilightforest.dense_forest": "Dense Forest", + "biome.twilightforest.firefly_forest": "Firefly Forest", + "biome.twilightforest.clearing": "Twilight Clearing", + "biome.twilightforest.oak_savannah": "Oak Savanna", + "biome.twilightforest.stream": "Twilight Stream", + "biome.twilightforest.lake": "Twilight Lake", + "biome.twilightforest.mushroom_forest": "Mushroom Forest", + "biome.twilightforest.dense_mushroom_forest": "Dense Mushroom Forest", + "biome.twilightforest.enchanted_forest": "Enchanted Forest", + "biome.twilightforest.spooky_forest": "Spooky Forest", + "biome.twilightforest.swamp": "Twilight Swamp", + "biome.twilightforest.fire_swamp": "Fire Swamp", + "biome.twilightforest.dark_forest": "Dark Forest", + "biome.twilightforest.dark_forest_center": "Dark Forest Center", + "biome.twilightforest.snowy_forest": "Snowy Forest", + "biome.twilightforest.glacier": "Twilight Glacier", + "biome.twilightforest.highlands": "Twilight Highlands", + "biome.twilightforest.thornlands": "Thornlands", + "biome.twilightforest.final_plateau": "Final Plateau", + + "gamerule.tfEnforcedProgression": "Twilight Forest Progression", + + "enchantment.twilightforest.fire_react": "Fire React", + "enchantment.twilightforest.fire_react.desc": "Adds a chance for the attacker to be set on fire after hitting the wearer.", + "enchantment.twilightforest.chill_aura": "Chill Aura", + "enchantment.twilightforest.chill_aura.desc": "Adds a chance for the attacker to gain the frosted effect after hitting the wearer.", + "enchantment.twilightforest.destruction": "Destruction", + "enchantment.twilightforest.destruction.desc": "Allows the Block and Chain to break blocks with a higher mining tier.", + + "effect.twilightforest.frosted": "Frosted", + + "block.twilightforest.twilight_oak_log": "Twilight Oak Log", + "block.twilightforest.canopy_log": "Canopy Tree Log", + "block.twilightforest.mangrove_log": "Mangrove Log", + "block.twilightforest.dark_log": "Darkwood Log", + "block.twilightforest.stripped_twilight_oak_log": "Stripped Twilight Oak Log", + "block.twilightforest.stripped_canopy_log": "Stripped Canopy Tree Log", + "block.twilightforest.stripped_mangrove_log": "Stripped Mangrove Log", + "block.twilightforest.stripped_dark_log": "Stripped Darkwood Log", + "block.twilightforest.twilight_oak_wood": "Twilight Oak Wood", + "block.twilightforest.canopy_wood": "Canopy Tree Wood", + "block.twilightforest.mangrove_wood": "Mangrove Wood", + "block.twilightforest.dark_wood": "Darkwood", + "block.twilightforest.stripped_twilight_oak_wood": "Stripped Twilight Oak Wood", + "block.twilightforest.stripped_canopy_wood": "Stripped Canopy Tree Wood", + "block.twilightforest.stripped_mangrove_wood": "Stripped Mangrove Wood", + "block.twilightforest.stripped_dark_wood": "Stripped Darkwood", + "block.twilightforest.twilight_oak_leaves": "Twilight Oak Leaves", + "block.twilightforest.canopy_leaves": "Canopy Tree Leaves", + "block.twilightforest.mangrove_leaves": "Mangrove Leaves", + "block.twilightforest.rainbow_oak_leaves": "Rainbow Oak Leaves", + "block.twilightforest.firefly": "Firefly", + "block.twilightforest.cicada": "Cicada", + "block.twilightforest.twilight_portal": "Twilight Forest Portal", + "block.twilightforest.mazestone": "Mazestone", + "block.twilightforest.mazestone_brick": "Mazestone Brick", + "block.twilightforest.cut_mazestone": "Cut Mazestone", + "block.twilightforest.decorative_mazestone": "Decorative Mazestone Brick", + "block.twilightforest.cracked_mazestone": "Cracked Mazestone Brick", + "block.twilightforest.mossy_mazestone": "Mossy Mazestone Brick", + "block.twilightforest.mazestone_mosaic": "Mazestone Mosaic", + "block.twilightforest.mazestone_border": "Mazestone Border", + "block.twilightforest.spiral_bricks": "Spiral Bricks", + "block.twilightforest.hedge": "Hedge", + "block.twilightforest.naga_boss_spawner": "Naga Boss Spawner", + "block.twilightforest.lich_boss_spawner": "Lich Boss Spawner", + "block.twilightforest.minoshroom_boss_spawner": "Minoshroom Boss Spawner", + "block.twilightforest.hydra_boss_spawner": "Hydra Boss Spawner", + "block.twilightforest.knight_phantom_boss_spawner": "Knight Phantom Boss Spawner", + "block.twilightforest.ur_ghast_boss_spawner": "Ur-Ghast Boss Spawner", + "block.twilightforest.alpha_yeti_boss_spawner": "Alpha Yeti Boss Spawner", + "block.twilightforest.snow_queen_boss_spawner": "Snow Queen Boss Spawner", + "block.twilightforest.final_boss_boss_spawner": "Final Boss Boss Spawner", + "block.twilightforest.firefly_jar": "Firefly Jar", + "block.twilightforest.firefly_particle_spawner": "Firefly Particle Spawner", + "block.twilightforest.firefly_spawner_radius": "Firefly Particle Radius: %s Blocks", + "block.twilightforest.cicada_jar": "Cicada Jar", + "block.twilightforest.moss_patch": "Moss Patch", + "block.twilightforest.mayapple": "Mayapple", + "block.twilightforest.clover_patch": "Clover Patch", + "block.twilightforest.fiddlehead": "Fiddlehead", + "block.twilightforest.mushgloom": "Mushgloom", + "block.twilightforest.torchberry_plant": "Torchberry Plant", + "block.twilightforest.root_strand": "Root Strands", + "block.twilightforest.fallen_leaves": "Leaf Pile", + "block.twilightforest.root": "Roots", + "block.twilightforest.liveroot_block": "Liveroots", + "block.twilightforest.mangrove_root": "Mangrove Roots", + "block.twilightforest.uncrafting_table": "Uncrafting Table", + "container.uncrafting_table.disabled": "Uncrafting is disabled via config", + "container.uncrafting_table.disabled_item": "Uncrafting this item is disabled.", + "block.twilightforest.smoker": "Smoker", + "block.twilightforest.encased_smoker": "Encased Smoker", + "block.twilightforest.fire_jet": "Fire Jet", + "block.twilightforest.encased_fire_jet": "Encased Fire Jet", + "block.twilightforest.nagastone_head": "Nagastone Head", + "block.twilightforest.nagastone": "Nagastone", + "block.twilightforest.twilight_oak_sapling": "Sickly Twilight Oak Sapling", + "block.twilightforest.canopy_sapling": "Canopy Tree Sapling", + "block.twilightforest.mangrove_sapling": "Mangrove Sapling", + "block.twilightforest.darkwood_sapling": "Darkwood Sapling", + "block.twilightforest.hollow_oak_sapling": "Robust Twilight Oak Sapling", + "block.twilightforest.time_sapling": "Tree of Time Sapling", + "block.twilightforest.transformation_sapling": "Tree of Transformation Sapling", + "block.twilightforest.mining_sapling": "Miner's Tree Sapling", + "block.twilightforest.sorting_sapling": "Sorting Tree Sapling", + "block.twilightforest.rainbow_oak_sapling": "Rainbow Oak Sapling", + "block.twilightforest.moonworm": "Moonworm", + "block.twilightforest.time_log": "Timewood Log", + "block.twilightforest.transformation_log": "Transwood Log", + "block.twilightforest.mining_log": "Minewood Log", + "block.twilightforest.sorting_log": "Sortingwood Log", + "block.twilightforest.stripped_time_log": "Stripped Timewood Log", + "block.twilightforest.stripped_transformation_log": "Stripped Transwood Log", + "block.twilightforest.stripped_mining_log": "Stripped Minewood Log", + "block.twilightforest.stripped_sorting_log": "Stripped Sortingwood Log", + "block.twilightforest.sorting_wood": "Sortingwood", + "block.twilightforest.mining_wood": "Minewood", + "block.twilightforest.transformation_wood": "Transwood", + "block.twilightforest.time_wood": "Timewood", + "block.twilightforest.stripped_sorting_wood": "Stripped Sortingwood", + "block.twilightforest.stripped_mining_wood": "Stripped Minewood", + "block.twilightforest.stripped_transformation_wood": "Stripped Transwood", + "block.twilightforest.stripped_time_wood": "Stripped Timewood", + "block.twilightforest.time_log_core": "Timewood Clock", + "block.twilightforest.transformation_log_core": "Heart of Transformation", + "block.twilightforest.mining_log_core": "Minewood Core", + "block.twilightforest.sorting_log_core": "Sortingwood Engine", + "block.twilightforest.time_leaves": "Timewood Leaves", + "block.twilightforest.transformation_leaves": "Leaves of Transformation", + "block.twilightforest.mining_leaves": "Miner's Leaves", + "block.twilightforest.sorting_leaves": "Sorting Leaves", + "block.twilightforest.towerwood": "Towerwood Planks", + "block.twilightforest.encased_towerwood": "Encased Towerwood", + "block.twilightforest.cracked_towerwood": "Cracked Towerwood", + "block.twilightforest.mossy_towerwood": "Mossy Towerwood", + "block.twilightforest.infested_towerwood": "Infested Towerwood", + "block.twilightforest.reappearing_block": "Reappearing Block", + "block.twilightforest.vanishing_block": "Vanishing Block", + "block.twilightforest.locked_vanishing_block": "Locked Vanishing Block", + "block.twilightforest.carminite_builder": "Carminite Builder", + "block.twilightforest.built_block": "Built Block", + "block.twilightforest.antibuilder": "Anti-builder", + "block.twilightforest.antibuilt_block": "Anti-built Block", + "block.twilightforest.ghast_trap": "Ghast Trap", + "block.twilightforest.carminite_reactor": "Carminite Reactor", + "block.twilightforest.reactor_debris": "Reactor Debris", + "block.twilightforest.fake_gold": "False Gold", + "block.twilightforest.fake_diamond": "False Diamond", + "block.twilightforest.trophy": "Twilight Forest Trophy", + "block.twilightforest.stronghold_shield": "Stronghold Shield", + "block.twilightforest.trophy_pedestal": "Trophy Pedestal", + "block.twilightforest.aurora_block": "Aurora Block", + "block.twilightforest.underbrick": "Underbrick", + "block.twilightforest.mossy_underbrick": "Mossy Underbrick", + "block.twilightforest.cracked_underbrick": "Cracked Underbrick", + "block.twilightforest.underbrick_floor": "Underbrick Floor", + "block.twilightforest.brown_thorns": "Thorns", + "block.twilightforest.green_thorns": "Green Thorns", + "block.twilightforest.burnt_thorns": "Burnt Thorns", + "block.twilightforest.thorn_rose": "Thorn Rose", + "block.twilightforest.thorn_leaves": "Thorn Leaves", + "block.twilightforest.beanstalk_leaves": "Beanstalk Leaves", + "block.twilightforest.weathered_deadrock": "Weathered Deadrock", + "block.twilightforest.cracked_deadrock": "Cracked Deadrock", + "block.twilightforest.deadrock": "Deadrock", + "block.twilightforest.dark_leaves": "Darkwood Leaves", + "block.twilightforest.hardened_dark_leaves": "Thick Darkwood Leaves", + "block.twilightforest.auroralized_glass": "Auroralized Glass", + "block.twilightforest.aurora_pillar": "Aurora Pillar", + "block.twilightforest.aurora_slab": "Aurora Slab", + "block.twilightforest.trollsteinn": "Trollsteinn", + "block.twilightforest.wispy_cloud": "Wispy Cloud", + "block.twilightforest.fluffy_cloud": "Fluffy Cloud", + "block.twilightforest.giant_cobblestone": "Giant Cobblestone", + "block.twilightforest.giant_log": "Giant Log", + "block.twilightforest.giant_leaves": "Giant Leaves", + "block.twilightforest.giant_obsidian": "Giant Obsidian", + "block.twilightforest.uberous_soil": "Uberous Soil", + "block.twilightforest.huge_stalk": "Huge Stalk", + "block.twilightforest.huge_mushgloom": "Huge Mushgloom", + "block.twilightforest.huge_mushgloom_stem": "Huge Mushgloom Stem", + "block.twilightforest.trollvidr": "Trollvidr", + "block.twilightforest.unripe_trollber": "Unripe Trollber", + "block.twilightforest.trollber": "Trollber", + "block.twilightforest.slider": "Slide Trap", + "block.twilightforest.knightmetal_block": "Block of Knightmetal", + "block.twilightforest.huge_lily_pad": "Huge Lily Pad", + "block.twilightforest.huge_water_lily": "Huge Water Lily", + "block.twilightforest.castle_brick": "Castle Brick", + "block.twilightforest.worn_castle_brick": "Worn Castle Brick", + "block.twilightforest.cracked_castle_brick": "Cracked Castle Brick", + "block.twilightforest.castle_roof_tile": "Castle Roof Tile", + "block.twilightforest.mossy_castle_brick": "Mossy Castle Brick", + "block.twilightforest.thick_castle_brick": "Thick Castle Brick", + "block.twilightforest.castle_brick_stairs": "Castle Brick Stairs", + "block.twilightforest.worn_castle_brick_stairs": "Worn Castle Brick Stairs", + "block.twilightforest.cracked_castle_brick_stairs": "Cracked Castle Brick Stairs", + "block.twilightforest.mossy_castle_brick_stairs": "Mossy Castle Brick Stairs", + "block.twilightforest.yellow_castle_door": "Yellow Castle Door", + "block.twilightforest.violet_castle_door": "Violet Castle Door", + "block.twilightforest.pink_castle_door": "Pink Castle Door", + "block.twilightforest.blue_castle_door": "Blue Castle Door", + "block.twilightforest.pink_castle_rune_brick": "Pink Castle Rune Brick", + "block.twilightforest.blue_castle_rune_brick": "Blue Castle Rune Brick", + "block.twilightforest.yellow_castle_rune_brick": "Yellow Castle Rune Brick", + "block.twilightforest.violet_castle_rune_brick": "Violet Castle Rune Brick", + "block.twilightforest.encased_castle_brick_pillar": "Encased Castle Brick Pillar", + "block.twilightforest.encased_castle_brick_tile": "Encased Castle Brick Tile", + "block.twilightforest.bold_castle_brick_pillar": "Bold Castle Brick Pillar", + "block.twilightforest.bold_castle_brick_tile": "Bold Castle Brick Tiles", + "block.twilightforest.encased_castle_brick_stairs": "Encased Castle Brick Stairs", + "block.twilightforest.bold_castle_brick_stairs": "Bold Castle Brick Stairs", + "block.twilightforest.violet_force_field": "Violet Force Field", + "block.twilightforest.pink_force_field": "Pink Force Field", + "block.twilightforest.orange_force_field": "Orange Force Field", + "block.twilightforest.green_force_field": "Green Force Field", + "block.twilightforest.blue_force_field": "Blue Force Field", + "block.twilightforest.ironwood_block": "Block of Ironwood", + "block.twilightforest.fiery_block": "Block of Fiery Metal", + "block.twilightforest.steeleaf_block": "Block of Steeleaf", + "block.twilightforest.arctic_fur_block": "Block of Arctic Fur", + "block.twilightforest.carminite_block": "Block of Carminite", + "block.twilightforest.cinder_furnace": "Cinder Furnace", + "block.twilightforest.cinder_log": "Cinder Log", + "block.twilightforest.cinder_wood": "Cinder Wood", + "block.twilightforest.twilight_portal_miniature_structure": "Miniature Twilight Portal", + "block.twilightforest.naga_courtyard_miniature_structure": "Miniature Naga Courtyard", + "block.twilightforest.lich_tower_miniature_structure": "Miniature Lich Tower", + "block.twilightforest.twisted_stone": "Twisted Stone", + "block.twilightforest.twisted_stone_pillar": "Twisted Stone Pillar", + "block.twilightforest.bold_stone_pillar": "Bold Stone Pillar", + "block.twilightforest.empty_canopy_bookshelf": "Empty Canopy Bookshelf", + "block.twilightforest.death_tome_spawner": "Death Tome Spawner", + "block.twilightforest.etched_nagastone": "Etched Nagastone", + "block.twilightforest.nagastone_pillar": "Nagastone Pillar", + "block.twilightforest.nagastone_stairs_left": "Nagastone Stairs (Left)", + "block.twilightforest.nagastone_stairs_right": "Nagastone Stairs (Right)", + "block.twilightforest.mossy_etched_nagastone": "Mossy Etched Nagastone", + "block.twilightforest.mossy_nagastone_pillar": "Mossy Nagastone Pillar", + "block.twilightforest.mossy_nagastone_stairs_left": "Mossy Nagastone Stairs (Left)", + "block.twilightforest.mossy_nagastone_stairs_right": "Mossy Nagastone Stairs (Right)", + "block.twilightforest.cracked_etched_nagastone": "Ruined Etched Nagastone", + "block.twilightforest.cracked_nagastone_pillar": "Ruined Nagastone Pillar", + "block.twilightforest.cracked_nagastone_stairs_left": "Weathered Nagastone Stairs (Left)", + "block.twilightforest.cracked_nagastone_stairs_right": "Weathered Nagastone Stairs (Right)", + "block.twilightforest.iron_ladder": "Iron Ladder", + "block.twilightforest.experiment_115": "Experiment 115", + "block.twilightforest.hydra_trophy": "Hydra Trophy", + "block.twilightforest.naga_trophy": "Naga Trophy", + "block.twilightforest.minoshroom_trophy": "Minoshroom Trophy", + "block.twilightforest.knight_phantom_trophy": "Knight Phantom Trophy", + "block.twilightforest.lich_trophy": "Lich Trophy", + "block.twilightforest.ur_ghast_trophy": "Ur-Ghast Trophy", + "block.twilightforest.alpha_yeti_trophy": "Alpha Yeti Trophy", + "block.twilightforest.snow_queen_trophy": "Snow Queen Trophy", + "block.twilightforest.quest_ram_trophy": "Quest Ram Trophy", + + "block.twilightforest.keepsake_casket": "Keepsake Casket", + "block.twilightforest.casket.broken": "Your Keepsake Casket was too damaged to hold any more items. All items that would be stored in your casket were dropped on the ground.", + "block.twilightforest.casket.locked": "This Casket can only be opened by %s!", + + "block.twilightforest.candelabra": "Candelabra", + "block.twilightforest.red_thread": "Red Thread", + + "block.twilightforest.zombie_skull_candle": "Zombie Skull Candle", + "block.twilightforest.zombie_wall_skull_candle": "Zombie Wall Skull Candle", + "block.twilightforest.skeleton_skull_candle": "Skeleton Skull Candle", + "block.twilightforest.skeleton_wall_skull_candle": "Skeleton Wall Skull Candle", + "block.twilightforest.wither_skeleton_skull_candle": "Wither Skeleton Skull Candle", + "block.twilightforest.wither_skeleton_wall_skull_candle": "Wither Skeleton Wall Skull Candle", + "block.twilightforest.creeper_skull_candle": "Creeper Skull Candle", + "block.twilightforest.creeper_wall_skull_candle": "Creeper Wall Skull Candle", + "block.twilightforest.player_skull_candle": "Player Skull Candle", + "block.twilightforest.player_skull_candle.named": "%s's Head with Candles", + "block.twilightforest.player_wall_skull_candle": "Player Wall Skull Candle", + + "block.twilightforest.potted_twilight_oak_sapling": "Potted Sickly Twilight Oak Sapling", + "block.twilightforest.potted_canopy_sapling": "Potted Canopy Tree Sapling", + "block.twilightforest.potted_mangrove_sapling": "Potted Twilight Mangrove Sapling", + "block.twilightforest.potted_darkwood_sapling": "Potted Darkwood Sapling", + "block.twilightforest.potted_hollow_oak_sapling": "Potted Robust Twilight Oak Sapling", + "block.twilightforest.potted_rainbow_oak_sapling": "Potted Rainbow Oak Sapling", + "block.twilightforest.potted_time_sapling": "Potted Tree of Time Sapling", + "block.twilightforest.potted_transformation_sapling": "Potted Tree of Transformation Sapling", + "block.twilightforest.potted_mining_sapling": "Potted Miner's Tree Sapling", + "block.twilightforest.potted_sorting_sapling": "Potted Sorting Tree Sapling", + "block.twilightforest.potted_mayapple": "Potted Mayapple", + "block.twilightforest.potted_fiddlehead": "Potted Fiddlehead", + "block.twilightforest.potted_mushgloom": "Potted Mushgloom", + "block.twilightforest.potted_thorn": "Potted Thorn", + "block.twilightforest.potted_green_thorn": "Potted Green Thorn", + "block.twilightforest.potted_dead_thorn": "Potted Burnt Thorn", + + "block.twilightforest.oak_banister": "Oak Banister", + "block.twilightforest.spruce_banister": "Spruce Banister", + "block.twilightforest.birch_banister": "Birch Banister", + "block.twilightforest.jungle_banister": "Jungle Banister", + "block.twilightforest.acacia_banister": "Acacia Banister", + "block.twilightforest.dark_oak_banister": "Dark Oak Banister", + "block.twilightforest.crimson_banister": "Crimson Banister", + "block.twilightforest.warped_banister": "Warped Banister", + "block.twilightforest.vangrove_banister": "Mangrove Banister", + "block.twilightforest.banister.cycle": "Right click with an axe to cycle", + + "block.twilightforest.canopy_planks": "Canopy Planks", + "block.twilightforest.canopy_stairs": "Canopy Stairs", + "block.twilightforest.canopy_slab": "Canopy Slab", + "block.twilightforest.canopy_button": "Canopy Button", + "block.twilightforest.canopy_fence": "Canopy Fence", + "block.twilightforest.canopy_fence_gate": "Canopy Fence Gate", + "block.twilightforest.canopy_pressure_plate": "Canopy Pressure Plate", + "block.twilightforest.canopy_trapdoor": "Canopy Trapdoor", + "block.twilightforest.canopy_door": "Canopy Door", + "block.twilightforest.canopy_sign": "Canopy Sign", + "block.twilightforest.canopy_wall_sign": "Canopy Wall Sign", + "block.twilightforest.canopy_banister": "Canopy Banister", + "block.twilightforest.canopy_bookshelf": "Canopy Bookshelf", + + "block.twilightforest.dark_planks": "Darkwood Planks", + "block.twilightforest.dark_stairs": "Darkwood Stairs", + "block.twilightforest.dark_slab": "Darkwood Slab", + "block.twilightforest.dark_button": "Darkwood Button", + "block.twilightforest.dark_fence": "Darkwood Fence", + "block.twilightforest.dark_fence_gate": "Darkwood Fence Gate", + "block.twilightforest.dark_pressure_plate": "Darkwood Pressure Plate", + "block.twilightforest.dark_trapdoor": "Darkwood Trapdoor", + "block.twilightforest.dark_door": "Darkwood Door", + "block.twilightforest.darkwood_sign": "Darkwood Sign", + "block.twilightforest.darkwood_wall_sign": "Darkwood Wall Sign", + "block.twilightforest.darkwood_banister": "Darkwood Banister", + + "block.twilightforest.mangrove_planks": "Mangrove Planks", + "block.twilightforest.mangrove_stairs": "Mangrove Stairs", + "block.twilightforest.mangrove_slab": "Mangrove Slab", + "block.twilightforest.mangrove_button": "Mangrove Button", + "block.twilightforest.mangrove_fence": "Mangrove Fence", + "block.twilightforest.mangrove_fence_gate": "Mangrove Fence Gate", + "block.twilightforest.mangrove_pressure_plate": "Mangrove Pressure Plate", + "block.twilightforest.mangrove_trapdoor": "Mangrove Trapdoor", + "block.twilightforest.mangrove_door": "Mangrove Door", + "block.twilightforest.mangrove_sign": "Mangrove Sign", + "block.twilightforest.mangrove_wall_sign": "Mangrove Wall Sign", + "block.twilightforest.mangrove_banister": "Mangrove Banister", + + "block.twilightforest.twilight_oak_planks": "Twilight Oak Planks", + "block.twilightforest.twilight_oak_stairs": "Twilight Oak Stairs", + "block.twilightforest.twilight_oak_slab": "Twilight Oak Slab", + "block.twilightforest.twilight_oak_button": "Twilight Oak Button", + "block.twilightforest.twilight_oak_fence": "Twilight Oak Fence", + "block.twilightforest.twilight_oak_fence_gate": "Twilight Oak Fence Gate", + "block.twilightforest.twilight_oak_pressure_plate": "Twilight Oak Pressure Plate", + "block.twilightforest.twilight_oak_trapdoor": "Twilight Oak Trapdoor", + "block.twilightforest.twilight_oak_door": "Twilight Oak Door", + "block.twilightforest.twilight_oak_sign": "Twilight Oak Sign", + "block.twilightforest.twilight_wall_sign": "Twilight Oak Wall Sign", + "block.twilightforest.twilight_oak_banister": "Twilight Oak Banister", + + "block.twilightforest.time_planks": "Timewood Planks", + "block.twilightforest.time_stairs": "Timewood Stairs", + "block.twilightforest.time_slab": "Timewood Slab", + "block.twilightforest.time_button": "Timewood Button", + "block.twilightforest.time_fence": "Timewood Fence", + "block.twilightforest.time_fence_gate": "Timewood Fence Gate", + "block.twilightforest.time_pressure_plate": "Timewood Pressure Plate", + "block.twilightforest.time_trapdoor": "Timewood Trapdoor", + "block.twilightforest.time_door": "Timewood Door", + "block.twilightforest.time_sign": "Timewood Sign", + "block.twilightforest.time_wall_sign": "Timewood Wall Sign", + "block.twilightforest.time_banister": "Timewood Banister", + "block.twilightforest.transformation_planks": "Transwood Planks", + "block.twilightforest.transformation_stairs": "Transwood Stairs", + "block.twilightforest.transformation_slab": "Transwood Slab", + "block.twilightforest.transformation_button": "Transwood Button", + "block.twilightforest.transformation_fence": "Transwood Fence", + "block.twilightforest.transformation_fence_gate": "Transwood Fence Gate", + "block.twilightforest.transformation_pressure_plate": "Transwood Pressure Plate", + "block.twilightforest.transformation_trapdoor": "Transwood Trapdoor", + "block.twilightforest.transformation_door": "Transwood Door", + "block.twilightforest.transformation_sign": "Transwood Sign", + "block.twilightforest.transformation_wall_sign": "Transwood Wall Sign", + "block.twilightforest.transformation_banister": "Transwood Banister", + "block.twilightforest.mining_planks": "Minewood Planks", + "block.twilightforest.mining_stairs": "Minewood Stairs", + "block.twilightforest.mining_slab": "Minewood Slab", + "block.twilightforest.mining_button": "Minewood Button", + "block.twilightforest.mining_fence": "Minewood Fence", + "block.twilightforest.mining_fence_gate": "Minewood Fence Gate", + "block.twilightforest.mining_pressure_plate": "Minewood Pressure Plate", + "block.twilightforest.mining_trapdoor": "Minewood Trapdoor", + "block.twilightforest.mining_door": "Minewood Door", + "block.twilightforest.mining_sign": "Minewood Sign", + "block.twilightforest.mining_wall_sign": "Minewood Wall Sign", + "block.twilightforest.mining_banister": "Minewood Banister", + "block.twilightforest.sorting_planks": "Sortingwood Planks", + "block.twilightforest.sorting_stairs": "Sortingwood Stairs", + "block.twilightforest.sorting_slab": "Sortingwood Slab", + "block.twilightforest.sorting_button": "Sortingwood Button", + "block.twilightforest.sorting_fence": "Sortingwood Fence", + "block.twilightforest.sorting_fence_gate": "Sortingwood Fence Gate", + "block.twilightforest.sorting_pressure_plate": "Sortingwood Pressure Plate", + "block.twilightforest.sorting_trapdoor": "Sortingwood Trapdoor", + "block.twilightforest.sorting_door": "Sortingwood Door", + "block.twilightforest.sorting_sign": "Sortingwood Sign", + "block.twilightforest.sorting_wall_sign": "Sortingwood Wall Sign", + "block.twilightforest.sorting_banister": "Sortingwood Banister", + + "block.twilightforest.twilight_oak_chest": "Twilight Oak Chest", + "block.twilightforest.canopy_chest": "Canopy Chest", + "block.twilightforest.mangrove_chest": "Mangrove Chest", + "block.twilightforest.darkwood_chest": "Darkwood Chest", + "block.twilightforest.time_chest": "Timewood Chest", + "block.twilightforest.transformation_chest": "Transwood Chest", + "block.twilightforest.mining_chest": "Minewood Chest", + "block.twilightforest.sorting_chest": "Sortingwood Chest", + + "block.twilightforest.hollow_oak_log_horizontal": "Hollow Oak Log", + "block.twilightforest.hollow_spruce_log_horizontal": "Hollow Spruce Log", + "block.twilightforest.hollow_birch_log_horizontal": "Hollow Birch Log", + "block.twilightforest.hollow_jungle_log_horizontal": "Hollow Jungle Log", + "block.twilightforest.hollow_acacia_log_horizontal": "Hollow Acacia Log", + "block.twilightforest.hollow_dark_oak_log_horizontal": "Hollow Dark Oak Log", + "block.twilightforest.hollow_crimson_stem_horizontal": "Hollow Crimson Stem", + "block.twilightforest.hollow_warped_stem_horizontal": "Hollow Warped Stem", + "block.twilightforest.hollow_vangrove_log_horizontal": "Hollow Mangrove Log", + "block.twilightforest.hollow_twilight_oak_log_horizontal": "Hollow Twilight Oak Log", + "block.twilightforest.hollow_canopy_log_horizontal": "Hollow Canopy Log", + "block.twilightforest.hollow_mangrove_log_horizontal": "Hollow Mangrove Log", + "block.twilightforest.hollow_dark_log_horizontal": "Hollow Darkwood Log", + "block.twilightforest.hollow_time_log_horizontal": "Hollow Timewood Log", + "block.twilightforest.hollow_transformation_log_horizontal": "Hollow Transwood Log", + "block.twilightforest.hollow_mining_log_horizontal": "Hollow Minewood Log", + "block.twilightforest.hollow_sorting_log_horizontal": "Hollow Sortingwood Log", + + "block.twilightforest.hollow_oak_log_vertical": "Hollow Oak Log", + "block.twilightforest.hollow_spruce_log_vertical": "Hollow Spruce Log", + "block.twilightforest.hollow_birch_log_vertical": "Hollow Birch Log", + "block.twilightforest.hollow_jungle_log_vertical": "Hollow Jungle Log", + "block.twilightforest.hollow_acacia_log_vertical": "Hollow Acacia Log", + "block.twilightforest.hollow_dark_oak_log_vertical": "Hollow Dark Oak Log", + "block.twilightforest.hollow_crimson_stem_vertical": "Hollow Crimson Stem", + "block.twilightforest.hollow_warped_stem_vertical": "Hollow Warped Stem", + "block.twilightforest.hollow_vangrove_log_vertical": "Hollow Mangrove Log", + "block.twilightforest.hollow_twilight_oak_log_vertical": "Hollow Twilight Oak Log", + "block.twilightforest.hollow_canopy_log_vertical": "Hollow Canopy Log", + "block.twilightforest.hollow_mangrove_log_vertical": "Hollow Mangrove Log", + "block.twilightforest.hollow_dark_log_vertical": "Hollow Darkwood Log", + "block.twilightforest.hollow_time_log_vertical": "Hollow Timewood Log", + "block.twilightforest.hollow_transformation_log_vertical": "Hollow Transwood Log", + "block.twilightforest.hollow_mining_log_vertical": "Hollow Minewood Log", + "block.twilightforest.hollow_sorting_log_vertical": "Hollow Sortingwood Log", + + "block.twilightforest.hollow_oak_log_climbable": "Hollow Oak Log", + "block.twilightforest.hollow_spruce_log_climbable": "Hollow Spruce Log", + "block.twilightforest.hollow_birch_log_climbable": "Hollow Birch Log", + "block.twilightforest.hollow_jungle_log_climbable": "Hollow Jungle Log", + "block.twilightforest.hollow_acacia_log_climbable": "Hollow Acacia Log", + "block.twilightforest.hollow_dark_oak_log_climbable": "Hollow Dark Oak Log", + "block.twilightforest.hollow_crimson_stem_climbable": "Hollow Crimson Stem", + "block.twilightforest.hollow_warped_stem_climbable": "Hollow Warped Stem", + "block.twilightforest.hollow_vangrove_log_climbable": "Hollow Mangrove Log", + "block.twilightforest.hollow_twilight_oak_log_climbable": "Hollow Twilight Oak Log", + "block.twilightforest.hollow_canopy_log_climbable": "Hollow Canopy Log", + "block.twilightforest.hollow_mangrove_log_climbable": "Hollow Mangrove Log", + "block.twilightforest.hollow_dark_log_climbable": "Hollow Darkwood Log", + "block.twilightforest.hollow_time_log_climbable": "Hollow Timewood Log", + "block.twilightforest.hollow_transformation_log_climbable": "Hollow Transwood Log", + "block.twilightforest.hollow_mining_log_climbable": "Hollow Minewood Log", + "block.twilightforest.hollow_sorting_log_climbable": "Hollow Sortingwood Log", + "block.arctic.tooltip": "Reduces fall damage by 90%", + "block.knightmetal.tooltip": "Works as a stronger cactus", + + "dimension.twilightforest.twilightforest": "Twilight Forest", + + "structure.twilightforest.hedge_maze": "Hedge Maze", + "structure.twilightforest.small_hollow_hill": "Small Hollow Hill", + "structure.twilightforest.medium_hollow_hill": "Medium Hollow Hill", + "structure.twilightforest.large_hollow_hill": "Large Hollow Hill", + "structure.twilightforest.quest_grove": "Quest Grove", + "structure.twilightforest.mushroom_tower": "Mushroom Castle", + "structure.twilightforest.naga_courtyard": "Naga Courtyard", + "structure.twilightforest.lich_tower": "Lich Tower", + "structure.twilightforest.labyrinth": "Minotaur Labyrinth", + "structure.twilightforest.hydra_lair": "Hydra's Lair", + "structure.twilightforest.knight_stronghold": "Knight Stronghold", + "structure.twilightforest.dark_tower": "Dark Tower", + "structure.twilightforest.yeti_cave": "Yeti Cave", + "structure.twilightforest.aurora_palace": "Aurora Palace", + "structure.twilightforest.troll_cave": "Troll Caves", + "structure.twilightforest.final_castle": "Final Castle", + + "item.twilightforest.boarkchop": "Boarkchop", + "item.twilightforest.naga_scale": "Naga Scale", + "item.twilightforest.naga_chestplate": "Naga Scale Tunic", + "item.twilightforest.naga_leggings": "Naga Scale Leggings", + "item.twilightforest.twilight_scepter": "Scepter of Twilight", + "item.twilightforest.lifedrain_scepter": "Scepter of Life Draining", + "item.twilightforest.zombie_scepter": "Zombie Scepter", + "item.twilightforest.fortification_scepter": "Scepter of Fortification", + "item.twilightforest.ore_meter": "Ore Meter", + "item.twilightforest.filled_magic_map": "Magic Map", + "item.twilightforest.filled_maze_map": "Maze Map", + "item.twilightforest.filled_ore_map": "Maze/Ore Map", + "item.twilightforest.raven_feather": "Raven Feather", + "item.twilightforest.magic_map_focus": "Magic Map Focus", + "item.twilightforest.maze_map_focus": "Maze Map Focus", + "item.twilightforest.liveroot": "Liveroot", + "item.twilightforest.raw_ironwood": "Raw Ironwood", + "item.twilightforest.ironwood_ingot": "Ironwood Ingot", + "item.twilightforest.ironwood_helmet": "Ironwood Helmet", + "item.twilightforest.ironwood_chestplate": "Ironwood Chestplate", + "item.twilightforest.ironwood_leggings": "Ironwood Leggings", + "item.twilightforest.ironwood_boots": "Ironwood Boots", + "item.twilightforest.ironwood_sword": "Ironwood Sword", + "item.twilightforest.ironwood_shovel": "Ironwood Shovel", + "item.twilightforest.ironwood_pickaxe": "Ironwood Pickaxe", + "item.twilightforest.ironwood_axe": "Ironwood Axe", + "item.twilightforest.ironwood_hoe": "Ironwood Hoe", + "item.twilightforest.torchberries": "Torchberries", + "item.twilightforest.raw_venison": "Raw Venison", + "item.twilightforest.cooked_venison": "Venison Steak", + "item.twilightforest.hydra_chop": "Hydra Chop", + "item.twilightforest.fiery_blood": "Fiery Blood", + "item.twilightforest.fiery_ingot": "Fiery Ingot", + "item.twilightforest.fiery_helmet": "Fiery Helmet", + "item.twilightforest.fiery_chestplate": "Fiery Chestplate", + "item.twilightforest.fiery_leggings": "Fiery Leggings", + "item.twilightforest.fiery_boots": "Fiery Boots", + "item.twilightforest.fiery_sword": "Fiery Sword", + "item.twilightforest.fiery_pickaxe": "Fiery Pickaxe", + "item.twilightforest.steeleaf_ingot": "Steeleaf", + "item.twilightforest.steeleaf_helmet": "Steeleaf Helmet", + "item.twilightforest.steeleaf_chestplate": "Steeleaf Chestplate", + "item.twilightforest.steeleaf_leggings": "Steeleaf Leggings", + "item.twilightforest.steeleaf_boots": "Steeleaf Boots", + "item.twilightforest.steeleaf_sword": "Steeleaf Sword", + "item.twilightforest.steeleaf_shovel": "Steeleaf Shovel", + "item.twilightforest.steeleaf_pickaxe": "Steeleaf Pickaxe", + "item.twilightforest.steeleaf_axe": "Steeleaf Axe", + "item.twilightforest.steeleaf_hoe": "Steeleaf Hoe", + "item.twilightforest.diamond_minotaur_axe": "Diamond Minotaur Axe", + "item.twilightforest.gold_minotaur_axe": "Golden Minotaur Axe", + "item.twilightforest.mazebreaker_pickaxe": "Mazebreaker", + "item.twilightforest.transformation_powder": "Transformation Powder", + "item.twilightforest.raw_meef": "Raw Meef", + "item.twilightforest.cooked_meef": "Meef Steak", + "item.twilightforest.meef_stroganoff": "Meef Stroganoff", + "item.twilightforest.maze_wafer": "Maze Wafer", + "item.twilightforest.magic_map": "Blank Magic Map", + "item.twilightforest.maze_map": "Blank Maze Map", + "item.twilightforest.ore_map": "Blank Maze/Ore Map", + "item.twilightforest.ore_magnet": "Ore Magnet", + "item.twilightforest.crumble_horn": "Crumble Horn", + "item.twilightforest.peacock_feather_fan": "Peacock Feather Fan", + "item.twilightforest.moonworm_queen": "Moonworm Queen", + "item.twilightforest.brittle_potion_flask": "Brittle Potion Flask", + "item.twilightforest.greater_potion_flask": "Greater Potion Flask", + "item.twilightforest.flask_doses": "Doses: %s/%s", + "item.twilightforest.flask_no_refill": "Cannot be refilled", + "item.twilightforest.charm_of_life_1": "Charm of Life I", + "item.twilightforest.charm_of_life_2": "Charm of Life II", + "item.twilightforest.charm_of_keeping_1": "Charm of Keeping I", + "item.twilightforest.charm_of_keeping_2": "Charm of Keeping II", + "item.twilightforest.charm_of_keeping_3": "Charm of Keeping III", + "item.twilightforest.tower_key": "Tower Key", + "item.twilightforest.borer_essence": "Borer Essence", + "item.twilightforest.carminite": "Carminite", + "item.twilightforest.armor_shard": "Armor Shard", + "item.twilightforest.knightmetal_ingot": "Knightmetal Ingot", + "item.twilightforest.armor_shard_cluster": "Armor Shard Cluster", + "item.twilightforest.knightmetal_helmet": "Knightmetal Helmet", + "item.twilightforest.knightmetal_chestplate": "Knightmetal Chestplate", + "item.twilightforest.knightmetal_leggings": "Knightmetal Greaves", + "item.twilightforest.knightmetal_boots": "Knightmetal Boots", + "item.twilightforest.knightmetal_sword": "Knightmetal Sword", + "item.twilightforest.knightmetal_pickaxe": "Knightmetal Pickaxe", + "item.twilightforest.knightmetal_axe": "Knightmetal Axe", + "item.twilightforest.knightmetal_shield": "Knightmetal Shield", + "item.twilightforest.phantom_helmet": "Phantom Helmet", + "item.twilightforest.phantom_chestplate": "Phantom Chestplate", + "item.twilightforest.lamp_of_cinders": "Lamp of Cinders", + "item.twilightforest.fiery_tears": "Fiery Tears", + "item.twilightforest.ice_bomb": "Ice Bomb", + "item.twilightforest.yeti_helmet": "Yeti Horned Helm", + "item.twilightforest.yeti_chestplate": "Yeti Jacket", + "item.twilightforest.yeti_leggings": "Yeti Leggings", + "item.twilightforest.yeti_boots": "Yeti Boots", + "item.twilightforest.alpha_yeti_fur": "Alpha Yeti Fur", + "item.twilightforest.arctic_fur": "Arctic Fur", + "item.twilightforest.arctic_helmet": "Arctic Hood", + "item.twilightforest.arctic_chestplate": "Arctic Jacket", + "item.twilightforest.arctic_leggings": "Arctic Leggings", + "item.twilightforest.arctic_boots": "Arctic Boots", + "item.twilightforest.magic_beans": "Magic Beans", + "item.twilightforest.giant_pickaxe": "Giant's Pickaxe", + "item.twilightforest.giant_sword": "Giant's Sword", + "item.twilightforest.triple_bow": "Tri-bow", + "item.twilightforest.seeker_bow": "Seeker Bow", + "item.twilightforest.ice_bow": "Ice Bow", + "item.twilightforest.ender_bow": "Ender Bow", + "item.twilightforest.ice_sword": "Ice Sword", + "item.twilightforest.glass_sword": "Glass Sword", + "item.twilightforest.knightmetal_ring": "Knightmetal Loop", + "item.twilightforest.block_and_chain": "Block and Chain", + "item.twilightforest.cube_talisman": "Talisman of the Cube", + "item.twilightforest.cube_of_annihilation": "Cube of Annihilation", + "item.twilightforest.moon_dial": "Moon Dial", + + "item.twilightforest.moon_dial.phase_0": "Full Moon", + "item.twilightforest.moon_dial.phase_1": "Waning Gibbous", + "item.twilightforest.moon_dial.phase_2": "Third Quarter", + "item.twilightforest.moon_dial.phase_3": "Waning Crescent", + "item.twilightforest.moon_dial.phase_4": "New Moon", + "item.twilightforest.moon_dial.phase_5": "Waxing Crescent", + "item.twilightforest.moon_dial.phase_6": "First Quarter", + "item.twilightforest.moon_dial.phase_7": "Waxing Gibbous", + "item.twilightforest.moon_dial.phase_unknown": "Moon phase indeterminate", + "item.twilightforest.moon_dial.phase_unknown_fools": "404 moon not found", + + "item.twilightforest.music_disc_radiance": "Music Disc", + "item.twilightforest.music_disc_radiance.desc": "Rotch Gwylt - Radiance", + "item.twilightforest.music_disc_steps": "Music Disc", + "item.twilightforest.music_disc_steps.desc": "Rotch Gwylt - Steps", + "item.twilightforest.music_disc_superstitious": "Music Disc", + "item.twilightforest.music_disc_superstitious.desc": "Rotch Gwylt - Superstitious", + "item.twilightforest.music_disc_home": "Music Disc", + "item.twilightforest.music_disc_home.desc": "MrCompost - Home", + "item.twilightforest.music_disc_wayfarer": "Music Disc", + "item.twilightforest.music_disc_wayfarer.desc": "MrCompost - Wayfarer", + "item.twilightforest.music_disc_findings": "Music Disc", + "item.twilightforest.music_disc_findings.desc": "MrCompost - Findings", + "item.twilightforest.music_disc_maker": "Music Disc", + "item.twilightforest.music_disc_maker.desc": "MrCompost - Maker", + "item.twilightforest.music_disc_thread": "Music Disc", + "item.twilightforest.music_disc_thread.desc": "MrCompost - Thread", + "item.twilightforest.music_disc_motion": "Music Disc", + "item.twilightforest.music_disc_motion.desc": "MrCompost - Motion", + + "item.twilightforest.naga_banner_pattern": "Banner Pattern", + "item.twilightforest.naga_banner_pattern.desc": "Naga Scales", + "block.minecraft.banner.twilightforest.naga.black": "Black Naga Scales", + "block.minecraft.banner.twilightforest.naga.gray": "Gray Naga Scales", + "block.minecraft.banner.twilightforest.naga.light_gray": "Light Gray Naga Scales", + "block.minecraft.banner.twilightforest.naga.white": "White Naga Scales", + "block.minecraft.banner.twilightforest.naga.red": "Red Naga Scales", + "block.minecraft.banner.twilightforest.naga.orange": "Orange Naga Scales", + "block.minecraft.banner.twilightforest.naga.yellow": "Yellow Naga Scales", + "block.minecraft.banner.twilightforest.naga.green": "Green Naga Scales", + "block.minecraft.banner.twilightforest.naga.lime": "Lime Naga Scales", + "block.minecraft.banner.twilightforest.naga.blue": "Blue Naga Scales", + "block.minecraft.banner.twilightforest.naga.cyan": "Cyan Naga Scales", + "block.minecraft.banner.twilightforest.naga.light_blue": "Light Blue Naga Scales", + "block.minecraft.banner.twilightforest.naga.purple": "Purple Naga Scales", + "block.minecraft.banner.twilightforest.naga.magenta": "Magenta Naga Scales", + "block.minecraft.banner.twilightforest.naga.pink": "Pink Naga Scales", + "block.minecraft.banner.twilightforest.naga.brown": "Brown Naga Scales", + + "item.twilightforest.lich_banner_pattern": "Banner Pattern", + "item.twilightforest.lich_banner_pattern.desc": "Lich Crown", + "block.minecraft.banner.twilightforest.lich.black": "Black Lich Crown", + "block.minecraft.banner.twilightforest.lich.gray": "Gray Lich Crown", + "block.minecraft.banner.twilightforest.lich.light_gray": "Light Gray Lich Crown", + "block.minecraft.banner.twilightforest.lich.white": "White Lich Crown", + "block.minecraft.banner.twilightforest.lich.red": "Red Lich Crown", + "block.minecraft.banner.twilightforest.lich.orange": "Orange Lich Crown", + "block.minecraft.banner.twilightforest.lich.yellow": "Yellow Lich Crown", + "block.minecraft.banner.twilightforest.lich.green": "Green Lich Crown", + "block.minecraft.banner.twilightforest.lich.lime": "Lime Lich Crown", + "block.minecraft.banner.twilightforest.lich.blue": "Blue Lich Crown", + "block.minecraft.banner.twilightforest.lich.cyan": "Cyan Lich Crown", + "block.minecraft.banner.twilightforest.lich.light_blue": "Light Blue Lich Crown", + "block.minecraft.banner.twilightforest.lich.purple": "Purple Lich Crown", + "block.minecraft.banner.twilightforest.lich.magenta": "Magenta Lich Crown", + "block.minecraft.banner.twilightforest.lich.pink": "Pink Lich Crown", + "block.minecraft.banner.twilightforest.lich.brown": "Brown Lich Crown", + + "item.twilightforest.minoshroom_banner_pattern": "Banner Pattern", + "item.twilightforest.minoshroom_banner_pattern.desc": "Minoshroom Axes", + "block.minecraft.banner.twilightforest.minoshroom.black": "Black Minoshroom Axes", + "block.minecraft.banner.twilightforest.minoshroom.gray": "Gray Minoshroom Axes", + "block.minecraft.banner.twilightforest.minoshroom.light_gray": "Light Gray Minoshroom Axes", + "block.minecraft.banner.twilightforest.minoshroom.white": "White Minoshroom Axes", + "block.minecraft.banner.twilightforest.minoshroom.red": "Red Minoshroom Axes", + "block.minecraft.banner.twilightforest.minoshroom.orange": "Orange Minoshroom Axes", + "block.minecraft.banner.twilightforest.minoshroom.yellow": "Yellow Minoshroom Axes", + "block.minecraft.banner.twilightforest.minoshroom.green": "Green Minoshroom Axes", + "block.minecraft.banner.twilightforest.minoshroom.lime": "Lime Minoshroom Axes", + "block.minecraft.banner.twilightforest.minoshroom.blue": "Blue Minoshroom Axes", + "block.minecraft.banner.twilightforest.minoshroom.cyan": "Cyan Minoshroom Axes", + "block.minecraft.banner.twilightforest.minoshroom.light_blue": "Light Blue Minoshroom Axes", + "block.minecraft.banner.twilightforest.minoshroom.purple": "Purple Minoshroom Axes", + "block.minecraft.banner.twilightforest.minoshroom.magenta": "Magenta Minoshroom Axes", + "block.minecraft.banner.twilightforest.minoshroom.pink": "Pink Minoshroom Axes", + "block.minecraft.banner.twilightforest.minoshroom.brown": "Brown Minoshroom Axes", + + "item.twilightforest.hydra_banner_pattern": "Banner Pattern", + "item.twilightforest.hydra_banner_pattern.desc": "Hydra Flame", + "block.minecraft.banner.twilightforest.hydra.black": "Black Hydra Flame", + "block.minecraft.banner.twilightforest.hydra.gray": "Gray Hydra Flame", + "block.minecraft.banner.twilightforest.hydra.light_gray": "Light Gray Hydra Flame", + "block.minecraft.banner.twilightforest.hydra.white": "White Hydra Flame", + "block.minecraft.banner.twilightforest.hydra.red": "Red Hydra Flame", + "block.minecraft.banner.twilightforest.hydra.orange": "Orange Hydra Flame", + "block.minecraft.banner.twilightforest.hydra.yellow": "Yellow Hydra Flame", + "block.minecraft.banner.twilightforest.hydra.green": "Green Hydra Flame", + "block.minecraft.banner.twilightforest.hydra.lime": "Lime Hydra Flame", + "block.minecraft.banner.twilightforest.hydra.blue": "Blue Hydra Flame", + "block.minecraft.banner.twilightforest.hydra.cyan": "Cyan Hydra Flame", + "block.minecraft.banner.twilightforest.hydra.light_blue": "Light Blue Hydra Flame", + "block.minecraft.banner.twilightforest.hydra.purple": "Purple Hydra Flame", + "block.minecraft.banner.twilightforest.hydra.magenta": "Magenta Hydra Flame", + "block.minecraft.banner.twilightforest.hydra.pink": "Pink Hydra Flame", + "block.minecraft.banner.twilightforest.hydra.brown": "Brown Hydra Flame", + + "item.twilightforest.knight_phantom_banner_pattern": "Banner Pattern", + "item.twilightforest.knight_phantom_banner_pattern.desc": "Knight Helmet", + "block.minecraft.banner.twilightforest.knight_phantom.black": "Black Knight Helmet", + "block.minecraft.banner.twilightforest.knight_phantom.gray": "Gray Knight Helmet", + "block.minecraft.banner.twilightforest.knight_phantom.light_gray": "Light Gray Knight Helmet", + "block.minecraft.banner.twilightforest.knight_phantom.white": "White Knight Helmet", + "block.minecraft.banner.twilightforest.knight_phantom.red": "Red Knight Helmet", + "block.minecraft.banner.twilightforest.knight_phantom.orange": "Orange Knight Helmet", + "block.minecraft.banner.twilightforest.knight_phantom.yellow": "Yellow Knight Helmet", + "block.minecraft.banner.twilightforest.knight_phantom.green": "Green Knight Helmet", + "block.minecraft.banner.twilightforest.knight_phantom.lime": "Lime Knight Helmet", + "block.minecraft.banner.twilightforest.knight_phantom.blue": "Blue Knight Helmet", + "block.minecraft.banner.twilightforest.knight_phantom.cyan": "Cyan Knight Helmet", + "block.minecraft.banner.twilightforest.knight_phantom.light_blue": "Light Blue Knight Helmet", + "block.minecraft.banner.twilightforest.knight_phantom.purple": "Purple Knight Helmet", + "block.minecraft.banner.twilightforest.knight_phantom.magenta": "Magenta Knight Helmet", + "block.minecraft.banner.twilightforest.knight_phantom.pink": "Pink Knight Helmet", + "block.minecraft.banner.twilightforest.knight_phantom.brown": "Brown Knight Helmet", + + "item.twilightforest.ur_ghast_banner_pattern": "Banner Pattern", + "item.twilightforest.ur_ghast_banner_pattern.desc": "Carminite Border", + "block.minecraft.banner.twilightforest.ur_ghast.black": "Black Carminite Border", + "block.minecraft.banner.twilightforest.ur_ghast.gray": "Gray Carminite Border", + "block.minecraft.banner.twilightforest.ur_ghast.light_gray": "Light Gray Carminite Border", + "block.minecraft.banner.twilightforest.ur_ghast.white": "White Carminite Border", + "block.minecraft.banner.twilightforest.ur_ghast.red": "Red Carminite Border", + "block.minecraft.banner.twilightforest.ur_ghast.orange": "Orange Carminite Border", + "block.minecraft.banner.twilightforest.ur_ghast.yellow": "Yellow Carminite Border", + "block.minecraft.banner.twilightforest.ur_ghast.green": "Green Carminite Border", + "block.minecraft.banner.twilightforest.ur_ghast.lime": "Lime Carminite Border", + "block.minecraft.banner.twilightforest.ur_ghast.blue": "Blue Carminite Border", + "block.minecraft.banner.twilightforest.ur_ghast.cyan": "Cyan Carminite Border", + "block.minecraft.banner.twilightforest.ur_ghast.light_blue": "Light Blue Carminite Border", + "block.minecraft.banner.twilightforest.ur_ghast.purple": "Purple Carminite Border", + "block.minecraft.banner.twilightforest.ur_ghast.magenta": "Magenta Carminite Border", + "block.minecraft.banner.twilightforest.ur_ghast.pink": "Pink Carminite Border", + "block.minecraft.banner.twilightforest.ur_ghast.brown": "Brown Carminite Border", + + "item.twilightforest.alpha_yeti_banner_pattern": "Banner Pattern", + "item.twilightforest.alpha_yeti_banner_pattern.desc": "Alpha Yeti Face", + "block.minecraft.banner.twilightforest.alpha_yeti.black": "Black Alpha Yeti Face", + "block.minecraft.banner.twilightforest.alpha_yeti.gray": "Gray Alpha Yeti Face", + "block.minecraft.banner.twilightforest.alpha_yeti.light_gray": "Light Gray Alpha Yeti Face", + "block.minecraft.banner.twilightforest.alpha_yeti.white": "White Alpha Yeti Face", + "block.minecraft.banner.twilightforest.alpha_yeti.red": "Red Alpha Yeti Face", + "block.minecraft.banner.twilightforest.alpha_yeti.orange": "Orange Alpha Yeti Face", + "block.minecraft.banner.twilightforest.alpha_yeti.yellow": "Yellow Alpha Yeti Face", + "block.minecraft.banner.twilightforest.alpha_yeti.green": "Green Alpha Yeti Face", + "block.minecraft.banner.twilightforest.alpha_yeti.lime": "Lime Alpha Yeti Face", + "block.minecraft.banner.twilightforest.alpha_yeti.blue": "Blue Alpha Yeti Face", + "block.minecraft.banner.twilightforest.alpha_yeti.cyan": "Cyan Alpha Yeti Face", + "block.minecraft.banner.twilightforest.alpha_yeti.light_blue": "Light Blue Alpha Yeti Face", + "block.minecraft.banner.twilightforest.alpha_yeti.purple": "Purple Alpha Yeti Face", + "block.minecraft.banner.twilightforest.alpha_yeti.magenta": "Magenta Alpha Yeti Face", + "block.minecraft.banner.twilightforest.alpha_yeti.pink": "Pink Alpha Yeti Face", + "block.minecraft.banner.twilightforest.alpha_yeti.brown": "Brown Alpha Yeti Face", + + "item.twilightforest.snow_queen_banner_pattern": "Banner Pattern", + "item.twilightforest.snow_queen_banner_pattern.desc": "Snow Queen Crown", + "block.minecraft.banner.twilightforest.snow_queen.black": "Black Snow Queen Crown", + "block.minecraft.banner.twilightforest.snow_queen.gray": "Gray Snow Queen Crown", + "block.minecraft.banner.twilightforest.snow_queen.light_gray": "Light Gray Snow Queen Crown", + "block.minecraft.banner.twilightforest.snow_queen.white": "White Snow Queen Crown", + "block.minecraft.banner.twilightforest.snow_queen.red": "Red Snow Queen Crown", + "block.minecraft.banner.twilightforest.snow_queen.orange": "Orange Snow Queen Crown", + "block.minecraft.banner.twilightforest.snow_queen.yellow": "Yellow Snow Queen Crown", + "block.minecraft.banner.twilightforest.snow_queen.green": "Green Snow Queen Crown", + "block.minecraft.banner.twilightforest.snow_queen.lime": "Lime Snow Queen Crown", + "block.minecraft.banner.twilightforest.snow_queen.blue": "Blue Snow Queen Crown", + "block.minecraft.banner.twilightforest.snow_queen.cyan": "Cyan Snow Queen Crown", + "block.minecraft.banner.twilightforest.snow_queen.light_blue": "Light Blue Snow Queen Crown", + "block.minecraft.banner.twilightforest.snow_queen.purple": "Purple Snow Queen Crown", + "block.minecraft.banner.twilightforest.snow_queen.magenta": "Magenta Snow Queen Crown", + "block.minecraft.banner.twilightforest.snow_queen.pink": "Pink Snow Queen Crown", + "block.minecraft.banner.twilightforest.snow_queen.brown": "Brown Snow Queen Crown", + + "item.twilightforest.quest_ram_banner_pattern": "Banner Pattern", + "item.twilightforest.quest_ram_banner_pattern.desc": "Quest Ram Swirls", + "block.minecraft.banner.twilightforest.quest_ram.black": "Black Quest Ram Swirls", + "block.minecraft.banner.twilightforest.quest_ram.gray": "Gray Quest Ram Swirls", + "block.minecraft.banner.twilightforest.quest_ram.light_gray": "Light Gray Quest Ram Swirls", + "block.minecraft.banner.twilightforest.quest_ram.white": "White Quest Ram Swirls", + "block.minecraft.banner.twilightforest.quest_ram.red": "Red Quest Ram Swirls", + "block.minecraft.banner.twilightforest.quest_ram.orange": "Orange Quest Ram Swirls", + "block.minecraft.banner.twilightforest.quest_ram.yellow": "Yellow Quest Ram Swirls", + "block.minecraft.banner.twilightforest.quest_ram.green": "Green Quest Ram Swirls", + "block.minecraft.banner.twilightforest.quest_ram.lime": "Lime Quest Ram Swirls", + "block.minecraft.banner.twilightforest.quest_ram.blue": "Blue Quest Ram Swirls", + "block.minecraft.banner.twilightforest.quest_ram.cyan": "Cyan Quest Ram Swirls", + "block.minecraft.banner.twilightforest.quest_ram.light_blue": "Light Blue Quest Ram Swirls", + "block.minecraft.banner.twilightforest.quest_ram.purple": "Purple Quest Ram Swirls", + "block.minecraft.banner.twilightforest.quest_ram.magenta": "Magenta Quest Ram Swirls", + "block.minecraft.banner.twilightforest.quest_ram.pink": "Pink Quest Ram Swirls", + "block.minecraft.banner.twilightforest.quest_ram.brown": "Brown Quest Ram Swirls", + + "item.twilightforest.boar_spawn_egg": "Wild Boar Spawn Egg", + "item.twilightforest.bighorn_sheep_spawn_egg": "Bighorn Sheep Spawn Egg", + "item.twilightforest.deer_spawn_egg": "Wild Deer Spawn Egg", + "item.twilightforest.redcap_spawn_egg": "Redcap Goblin Spawn Egg", + "item.twilightforest.swarm_spider_spawn_egg": "Swarm Spider Spawn Egg", + "item.twilightforest.naga_spawn_egg": "Naga Spawn Egg", + "item.twilightforest.skeleton_druid_spawn_egg": "Skeleton Druid Spawn Egg", + "item.twilightforest.hostile_wolf_spawn_egg": "Hostile Wolf Spawn Egg", + "item.twilightforest.wraith_spawn_egg": "Twilight Wraith Spawn Egg", + "item.twilightforest.hedge_spider_spawn_egg": "Hedge Spider Spawn Egg", + "item.twilightforest.hydra_spawn_egg": "Hydra Spawn Egg", + "item.twilightforest.lich_spawn_egg": "Twilight Lich Spawn Egg", + "item.twilightforest.penguin_spawn_egg": "Penguin Spawn Egg", + "item.twilightforest.tiny_bird_spawn_egg": "Tiny Bird Spawn Egg", + "item.twilightforest.squirrel_spawn_egg": "Forest Squirrel Spawn Egg", + "item.twilightforest.dwarf_rabbit_spawn_egg": "Dwarf Rabbit Spawn Egg", + "item.twilightforest.raven_spawn_egg": "Forest Raven Spawn Egg", + "item.twilightforest.quest_ram_spawn_egg": "Quest Ram Spawn Egg", + "item.twilightforest.kobold_spawn_egg": "Kobold Spawn Egg", + "item.twilightforest.mosquito_swarm_spawn_egg": "Mosquito Swarm Spawn Egg", + "item.twilightforest.death_tome_spawn_egg": "Death Tome Spawn Egg", + "item.twilightforest.minotaur_spawn_egg": "Minotaur Spawn Egg", + "item.twilightforest.minoshroom_spawn_egg": "Minoshroom Spawn Egg", + "item.twilightforest.fire_beetle_spawn_egg": "Fire Beetle Spawn Egg", + "item.twilightforest.slime_beetle_spawn_egg": "Slime Beetle Spawn Egg", + "item.twilightforest.pinch_beetle_spawn_egg": "Pinch Beetle Spawn Egg", + "item.twilightforest.maze_slime_spawn_egg": "Maze Slime Spawn Egg", + "item.twilightforest.redcap_sapper_spawn_egg": "Redcap Sapper Spawn Egg", + "item.twilightforest.mist_wolf_spawn_egg": "Mist Wolf Spawn Egg", + "item.twilightforest.king_spider_spawn_egg": "King Spider Spawn Egg", + "item.twilightforest.carminite_ghastling_spawn_egg": "Carminite Ghastling Spawn Egg", + "item.twilightforest.carminite_ghastguard_spawn_egg": "Carminite Ghastguard Spawn Egg", + "item.twilightforest.carminite_golem_spawn_egg": "Carminite Golem Spawn Egg", + "item.twilightforest.towerwood_borer_spawn_egg": "Towerwood Borer Spawn Egg", + "item.twilightforest.carminite_broodling_spawn_egg": "Carminite Broodling Spawn Egg", + "item.twilightforest.ur_ghast_spawn_egg": "Ur-Ghast Spawn Egg", + "item.twilightforest.blockchain_goblin_spawn_egg": "Block and Chain Goblin Spawn Egg", + "item.twilightforest.lower_goblin_knight_spawn_egg": "Goblin Knight Spawn Egg", + "item.twilightforest.helmet_crab_spawn_egg": "Helmet Crab Spawn Egg", + "item.twilightforest.knight_phantom_spawn_egg": "Knight Phantom Spawn Egg", + "item.twilightforest.yeti_spawn_egg": "Yeti Spawn Egg", + "item.twilightforest.alpha_yeti_spawn_egg": "Alpha Yeti Spawn Egg", + "item.twilightforest.winter_wolf_spawn_egg": "Winter Wolf Spawn Egg", + "item.twilightforest.snow_guardian_spawn_egg": "Snow Guardian Spawn Egg", + "item.twilightforest.stable_ice_core_spawn_egg": "Stable Ice Core Spawn Egg", + "item.twilightforest.unstable_ice_core_spawn_egg": "Unstable Ice Core Spawn Egg", + "item.twilightforest.snow_queen_spawn_egg": "Snow Queen Spawn Egg", + "item.twilightforest.troll_spawn_egg": "Cave Troll Spawn Egg", + "item.twilightforest.giant_miner_spawn_egg": "Giant Miner Spawn Egg", + "item.twilightforest.armored_giant_spawn_egg": "Armored Giant Spawn Egg", + "item.twilightforest.ice_crystal_spawn_egg": "Ice Crystal Spawn Egg", + "item.twilightforest.harbinger_cube_spawn_egg": "Harbinger Cube Spawn Egg [NYI]", + "item.twilightforest.adherent_spawn_egg": "Adherent Spawn Egg [NYI]", + "item.twilightforest.roving_cube_spawn_egg": "Roving Cube Spawn Egg [NYI]", + "item.twilightforest.guide": "Traveller's Logbook [WIP]", + + "item.twilightforest.minotaur_axe.tooltip": "Extra damage while charging", + "item.twilightforest.knightmetal_sword.tooltip": "Extra damage to armored targets", + "item.twilightforest.knightmetal_pickaxe.tooltip": "Extra damage to armored targets", + "item.twilightforest.knightmetal_axe.tooltip": "Extra damage to unarmored targets", + "item.twilightforest.giant_pickaxe.tooltip": "Breaks giant blocks", + "item.twilightforest.fiery_pickaxe.tooltip": "Auto-smelting", + "item.twilightforest.fiery_sword.tooltip": "Burns targets", + "item.twilightforest.fiery_armor.tooltip": "Burns attackers", + "item.twilightforest.phantom_armor.tooltip": "Is never lost on death", + "item.twilightforest.yeti_armor.tooltip": "Chills attackers", + "item.twilightforest.glass_sword.tooltip.1": "Creative Mode only", + "item.twilightforest.arctic_armor.tooltip": "Dyeable", + "item.twilightforest.skull_candle.desc": "Has: %s %s Candle", + "item.twilightforest.skull_candle.desc.multiple": "Has: %s %s Candles", + + "entity.twilightforest.boar": "Wild Boar", + "entity.twilightforest.bighorn_sheep": "Bighorn Sheep", + "entity.twilightforest.deer": "Wild Deer", + "entity.twilightforest.redcap": "Redcap Goblin", + "entity.twilightforest.swarm_spider": "Swarm Spider", + "entity.twilightforest.naga": "Naga", + "entity.twilightforest.naga_segment": "Naga Segment", + "entity.twilightforest.skeleton_druid": "Skeleton Druid", + "entity.twilightforest.hostile_wolf": "Hostile Wolf", + "entity.twilightforest.wraith": "Twilight Wraith", + "entity.twilightforest.hedge_spider": "Hedge Spider", + "entity.twilightforest.hydra": "Hydra", + "entity.twilightforest.hydra_head": "Hydra Head", + "entity.twilightforest.lich": "Twilight Lich", + "entity.twilightforest.penguin": "Penguin", + "entity.twilightforest.tiny_bird": "Tiny Bird", + "entity.twilightforest.squirrel": "Forest Squirrel", + "entity.twilightforest.dwarf_rabbit": "Dwarf Rabbit", + "entity.twilightforest.raven": "Forest Raven", + "entity.twilightforest.quest_ram": "Quest Ram", + "entity.twilightforest.kobold": "Kobold", + "entity.twilightforest.boggard": "Boggard [NYI]", + "entity.twilightforest.lich_minion": "Lich Minion", + "entity.twilightforest.loyal_zombie": "Loyal Zombie", + "entity.twilightforest.mosquito_swarm": "Mosquito Swarm", + "entity.twilightforest.death_tome": "Death Tome", + "entity.twilightforest.minotaur": "Minotaur", + "entity.twilightforest.minoshroom": "Minoshroom", + "entity.twilightforest.fire_beetle": "Fire Beetle", + "entity.twilightforest.slime_beetle": "Slime Beetle", + "entity.twilightforest.pinch_beetle": "Pinch Beetle", + "entity.twilightforest.maze_slime": "Maze Slime", + "entity.twilightforest.redcap_sapper": "Redcap Sapper", + "entity.twilightforest.mist_wolf": "Mist Wolf", + "entity.twilightforest.king_spider": "King Spider", + "entity.twilightforest.firefly": "Firefly", + "entity.twilightforest.carminite_ghastling": "Carminite Ghastling", + "entity.twilightforest.carminite_ghastguard": "Carminite Ghastguard", + "entity.twilightforest.carminite_golem": "Carminite Golem", + "entity.twilightforest.towerwood_borer": "Towerwood Borer", + "entity.twilightforest.carminite_broodling": "Carminite Broodling", + "entity.twilightforest.ur_ghast": "Ur-Ghast", + "entity.twilightforest.blockchain_goblin": "Block and Chain Goblin", + "entity.twilightforest.upper_goblin_knight": "Upper Goblin Knight", + "entity.twilightforest.lower_goblin_knight": "Lower Goblin Knight", + "entity.twilightforest.helmet_crab": "Helmet Crab", + "entity.twilightforest.knight_phantom": "Knight Phantom", + "entity.twilightforest.yeti": "Yeti", + "entity.twilightforest.alpha_yeti": "Alpha Yeti", + "entity.twilightforest.winter_wolf": "Winter Wolf", + "entity.twilightforest.snow_guardian": "Snow Guardian", + "entity.twilightforest.stable_ice_core": "Stable Ice Core", + "entity.twilightforest.unstable_ice_core": "Unstable Ice Core", + "entity.twilightforest.snow_queen": "Snow Queen", + "entity.twilightforest.troll": "Cave Troll", + "entity.twilightforest.giant_miner": "Giant Miner", + "entity.twilightforest.armored_giant": "Armored Giant", + "entity.twilightforest.ice_crystal": "Ice Crystal", + "entity.twilightforest.rising_zombie": "Zombie", + "entity.twilightforest.harbinger_cube": "Harbinger Cube [NYI]", + "entity.twilightforest.adherent": "Adherent [NYI]", + "entity.twilightforest.castle_guardian": "Castle Guardian [NYI]", + "entity.twilightforest.roving_cube": "Roving Cube [NYI]", + + "entity.twilightforest.ice_snowball": "Ice Snowball", + "entity.twilightforest.ice_arrow": "Ice Arrow", + "entity.twilightforest.seeker_arrow": "Seeker Arrow", + "entity.twilightforest.cicada_shot": "Cicada", + "entity.twilightforest.moonworm_shot": "Moonworm", + "entity.twilightforest.nature_bolt": "Nature Bolt", + "entity.twilightforest.slime_blob": "Slime Blob", + "entity.twilightforest.tome_bolt": "Death Tome Bolt", + "entity.twilightforest.wand_bolt": "Twilight Scepter Bolt", + "entity.twilightforest.lich_bolt": "Lich Bolt", + "entity.twilightforest.lich_bomb": "Explosive Lich Bolt", + "entity.twilightforest.hydra_mortar": "Hydra Mortar", + "entity.twilightforest.falling_ice": "Falling Ice", + "entity.twilightforest.chain_block": "Block and Chain", + "entity.twilightforest.thrown_wep": "Thrown Weapon", + "entity.twilightforest.charm_effect": "Charm Effect", + "entity.twilightforest.cube_of_annihilation": "Cube of Annihilation", + "entity.twilightforest.slider": "Moving Slide Trap", + "entity.twilightforest.protection_box": "Progression Protection Box", + "entity.twilightforest.cicada_slingshot": "Cicada", + "entity.twilightforest.firefly_slingshot": "Firefly", + "entity.twilightforest.moonworm_slingshot": "Moonworm", + + "subtitles.twilightforest.entity.acid_rain": "Acid Rain scalds player", + "subtitles.twilightforest.entity.alphayeti.alert": "Alpha Yeti targets player", + "subtitles.twilightforest.entity.alphayeti.death": "Alpha Yeti dies", + "subtitles.twilightforest.entity.alphayeti.grab": "Alpha Yeti grabs player", + "subtitles.twilightforest.entity.alphayeti.growl": "Alpha Yeti growls", + "subtitles.twilightforest.entity.alphayeti.hurt": "Alpha Yeti hurts", + "subtitles.twilightforest.entity.alphayeti.ice": "Alpha Yeti throws ice", + "subtitles.twilightforest.entity.alphayeti.pant": "Alpha Yeti pants", + "subtitles.twilightforest.entity.alphayeti.roar": "Alpha Yeti roars", + "subtitles.twilightforest.entity.alphayeti.throw": "Alpha Yeti yeets player", + "subtitles.twilightforest.entity.bighorn.ambient": "Bighorn Sheep bleats", + "subtitles.twilightforest.entity.bighorn.death": "Bighorn Sheep dies", + "subtitles.twilightforest.entity.bighorn.hurt": "Bighorn Sheep hurts", + "subtitles.twilightforest.entity.blockchain.ambient": "Block and Chain Goblin chuckles", + "subtitles.twilightforest.entity.blockchain.death": "Block and Chain Goblin dies", + "subtitles.twilightforest.entity.blockchain.hurt": "Block and Chain Goblin screams", + "subtitles.twilightforest.entity.boar.ambient": "Boar oinks", + "subtitles.twilightforest.entity.boar.death": "Boar dies", + "subtitles.twilightforest.entity.boar.hurt": "Boar hurts", + "subtitles.twilightforest.entity.broodling.ambient": "Carminite Broodling hisses", + "subtitles.twilightforest.entity.broodling.death": "Carminite Broodling dies", + "subtitles.twilightforest.entity.broodling.hurt": "Carminite Broodling hurts", + "subtitles.twilightforest.entity.carminitegolem.attack": "Carminite Golem attacks", + "subtitles.twilightforest.entity.carminitegolem.death": "Carminite Golem dies", + "subtitles.twilightforest.entity.carminitegolem.hurt": "Carminite Golem hurts", + "subtitles.twilightforest.entity.cicada": "Cicada screams", + "subtitles.twilightforest.entity.cicada_flying": "Cicada zooms away", + "subtitles.twilightforest.entity.deer.death": "Deer dies", + "subtitles.twilightforest.entity.deer.hurt": "Deer hurts", + "subtitles.twilightforest.entity.deer.ambient": "Deer moos", + "subtitles.twilightforest.entity.dwarf_rabbit.death": "Dwarf Rabbit dies", + "subtitles.twilightforest.entity.dwarf_rabbit.hurt": "Dwarf Rabbit hurts", + "subtitles.twilightforest.entity.dwarf_rabbit.ambient": "Dwarf Rabbit squeaks", + "subtitles.twilightforest.entity.druid.ambient": "Skeleton Druid rattles", + "subtitles.twilightforest.entity.druid.death": "Skeleton Druid dies", + "subtitles.twilightforest.entity.druid.hurt": "Skeleton Druid hurts", + "subtitles.twilightforest.entity.druid.shoot": "Skeleton Druid shoots", + "subtitles.twilightforest.entity.firebeetle.ambient": "Fire Beetle hisses", + "subtitles.twilightforest.entity.firebeetle.death": "Fire Beetle dies", + "subtitles.twilightforest.entity.firebeetle.hurt": "Fire Beetle hurts", + "subtitles.twilightforest.entity.firebeetle.shoot": "Fire Beetle shoots", + "subtitles.twilightforest.entity.ghastguard.ambient": "Ghastguard cries", + "subtitles.twilightforest.entity.ghastguard.death": "Ghastguard dies", + "subtitles.twilightforest.entity.ghastguard.hurt": "Ghastguard hurts", + "subtitles.twilightforest.entity.ghastguard.shoot": "Ghastguard shoots", + "subtitles.twilightforest.entity.ghastling.ambient": "Ghastling cries", + "subtitles.twilightforest.entity.ghastling.death": "Ghastling dies", + "subtitles.twilightforest.entity.ghastling.hurt": "Ghastling hurts", + "subtitles.twilightforest.entity.ghastling.shoot": "Ghastling shoots", + "subtitles.twilightforest.entity.goblinknight.ambient": "Goblin Knight chuckles", + "subtitles.twilightforest.entity.goblinknight.death": "Goblin Knight groans in agony", + "subtitles.twilightforest.entity.goblinknight.hurt": "Goblin Knight screeches in pain", + "subtitles.twilightforest.entity.goblinknight.muffled.ambient": "Muffled Goblin Knight chuckles", + "subtitles.twilightforest.entity.goblinknight.muffled.death": "Muffled Goblin Knight groans in agony", + "subtitles.twilightforest.entity.goblinknight.muffled.hurt": "Muffled Goblin Knight screeches in pain", + "subtitles.twilightforest.entity.hedgespider.ambient": "Hedge Spider hisses", + "subtitles.twilightforest.entity.hedgespider.death": "Hedge Spider dies", + "subtitles.twilightforest.entity.hedgespider.hurt": "Hedge Spider hurts", + "subtitles.twilightforest.entity.helmetcrab.death": "Helmet Crab dies", + "subtitles.twilightforest.entity.helmetcrab.hurt": "Helmet Crab hurts", + "subtitles.twilightforest.entity.hostilewolf.death": "Hostile Wolf dies", + "subtitles.twilightforest.entity.hostilewolf.hurt": "Hostile Wolf hurts", + "subtitles.twilightforest.entity.hostilewolf.ambient": "Hostile Wolf growls", + "subtitles.twilightforest.entity.hostilewolf.target": "Hostile Wolf targets victim", + "subtitles.twilightforest.entity.hydra.death": "Hydra dies", + "subtitles.twilightforest.entity.hydra.growl": "Hydra growls", + "subtitles.twilightforest.entity.hydra.hurt": "Hydra hurts", + "subtitles.twilightforest.entity.hydra.roar": "Hydra roars", + "subtitles.twilightforest.entity.hydra.shoot": "Hydra shoots", + "subtitles.twilightforest.entity.hydra.shoot_fire": "Hydra shoots fire", + "subtitles.twilightforest.entity.hydra.warn": "Hydra prepares to bite", + "subtitles.twilightforest.entity.ice.death": "Ice Core dies", + "subtitles.twilightforest.entity.ice.hurt": "Ice Core hurts", + "subtitles.twilightforest.entity.ice.noise": "Ice Core crackles", + "subtitles.twilightforest.entity.ice.shoot": "Ice Core fires snowball", + "subtitles.twilightforest.entity.iceguardian.ambient": "Snow Guardian crackles", + "subtitles.twilightforest.entity.iceguardian.death": "Snow Guardian dies", + "subtitles.twilightforest.entity.iceguardian.hurt": "Snow Guardian hurts", + "subtitles.twilightforest.entity.kingspider.ambient": "King Spider hisses", + "subtitles.twilightforest.entity.kingspider.death": "King Spider dies", + "subtitles.twilightforest.entity.kingspider.hurt": "King Spider hurts", + "subtitles.twilightforest.entity.kobold.ambient": "Kobold grumbles", + "subtitles.twilightforest.entity.kobold.death": "Kobold dies", + "subtitles.twilightforest.entity.kobold.hurt": "Kobold hurts", + "subtitles.twilightforest.entity.kobold.munch": "Kobold munches on food", + "subtitles.twilightforest.entity.lich.ambient": "Lich breathes", + "subtitles.twilightforest.entity.lich.death": "Lich dies", + "subtitles.twilightforest.entity.lich.hurt": "Lich hurts", + "subtitles.twilightforest.entity.lich.pop_mob": "Lich pops mob", + "subtitles.twilightforest.entity.lich.shoot": "Lich shoots", + "subtitles.twilightforest.entity.lich.teleport": "Lich teleports", + "subtitles.twilightforest.entity.lichclone.hurt": "Lich Clone evaporates", + "subtitles.twilightforest.entity.loyalzombie.ambient": "Loyal Zombie groans", + "subtitles.twilightforest.entity.loyalzombie.death": "Loyal Zombie dies", + "subtitles.twilightforest.entity.loyalzombie.hurt": "Loyal Zombie hurts", + "subtitles.twilightforest.entity.loyalzombie.summon": "Loyal Zombie summoned", + "subtitles.twilightforest.entity.mazeslime.death": "Maze Slime dies", + "subtitles.twilightforest.entity.mazeslime.hurt": "Maze Slime hurts", + "subtitles.twilightforest.entity.mazeslime.squish": "Maze Slime squishes", + "subtitles.twilightforest.entity.minion.ambient": "Lich Minion groans", + "subtitles.twilightforest.entity.minion.death": "Lich Minion dies", + "subtitles.twilightforest.entity.minion.hurt": "Lich Minion hurts", + "subtitles.twilightforest.entity.minion.summon": "Lich summons new Minion", + "subtitles.twilightforest.entity.minoshroom.ambient": "Minoshroom moos", + "subtitles.twilightforest.entity.minoshroom.attack": "Minoshroom charges", + "subtitles.twilightforest.entity.minoshroom.death": "Minoshroom dies", + "subtitles.twilightforest.entity.minoshroom.hurt": "Minoshroom hurts", + "subtitles.twilightforest.entity.minoshroom.slam": "Minoshroom slams ground", + "subtitles.twilightforest.entity.minotaur.ambient": "Minotaur moos", + "subtitles.twilightforest.entity.minotaur.attack": "Minotaur charges", + "subtitles.twilightforest.entity.minotaur.death": "Minotaur dies", + "subtitles.twilightforest.entity.minotaur.hurt": "Minotaur hurts", + "subtitles.twilightforest.entity.mistwolf.death": "Mist Wolf dies", + "subtitles.twilightforest.entity.mistwolf.hurt": "Mist Wolf hurts", + "subtitles.twilightforest.entity.mistwolf.ambient": "Mist Wolf growls", + "subtitles.twilightforest.entity.mistwolf.target": "Mist Wolf targets victim", + "subtitles.twilightforest.entity.mosquito.ambient": "Mosquitoes buzz", + "subtitles.twilightforest.entity.naga.hiss": "Naga hisses", + "subtitles.twilightforest.entity.naga.hurt": "Naga hurts", + "subtitles.twilightforest.entity.naga.rattle": "Naga rattles", + "subtitles.twilightforest.entity.phantom.axe": "Knight Phantom throws axe", + "subtitles.twilightforest.entity.phantom.ambient": "Knight Phantom gasps", + "subtitles.twilightforest.entity.phantom.death": "Knight Phantom dies", + "subtitles.twilightforest.entity.phantom.hurt": "Knight Phantom hurts", + "subtitles.twilightforest.entity.phantom.pick": "Knight Phantom throws pickaxe", + "subtitles.twilightforest.entity.pinchbeetle.death": "Pinch Beetle dies", + "subtitles.twilightforest.entity.pinchbeetle.hurt": "Pinch Beetle hurts", + "subtitles.twilightforest.entity.quest.ambient": "Questing Ram bleats", + "subtitles.twilightforest.entity.quest.death": "Questing Ram dies", + "subtitles.twilightforest.entity.quest.hurt": "Questing Ram hurts", + "subtitles.twilightforest.entity.raven.caw": "Raven caws", + "subtitles.twilightforest.entity.raven.squawk": "Raven squawks", + "subtitles.twilightforest.entity.redcap.ambient": "Redcap chuckles", + "subtitles.twilightforest.entity.redcap.death": "Redcap groans in agony", + "subtitles.twilightforest.entity.redcap.hurt": "Redcap screeches in pain", + "subtitles.twilightforest.entity.shield.add": "New Shield spawns", + "subtitles.twilightforest.entity.shield.block": "Shield blocks attack", + "subtitles.twilightforest.entity.shield.break": "Shield breaks", + "subtitles.twilightforest.entity.slimebeetle.death": "Slime Beetle dies", + "subtitles.twilightforest.entity.slimebeetle.hurt": "Slime Beetle hurts", + "subtitles.twilightforest.entity.slimebeetle.squish": "Slime Beetle squishes", + "subtitles.twilightforest.entity.snowqueen.ambient": "Snow Queen crackles", + "subtitles.twilightforest.entity.snowqueen.attack": "Snow Queen attacks", + "subtitles.twilightforest.entity.snowqueen.break": "Snow Queen's shield deflects", + "subtitles.twilightforest.entity.snowqueen.death": "Snow Queen dies", + "subtitles.twilightforest.entity.snowqueen.hurt": "Snow Queen hurts", + "subtitles.twilightforest.entity.swarmspider.ambient": "Swarm Spider hisses", + "subtitles.twilightforest.entity.swarmspider.death": "Swarm Spider dies", + "subtitles.twilightforest.entity.swarmspider.hurt": "Swarm Spider hurts", + "subtitles.twilightforest.entity.tear.break": "Ur-Ghast tear shatters", + "subtitles.twilightforest.entity.termite.ambient": "Towerwood Borer hisses", + "subtitles.twilightforest.entity.termite.death": "Towerwood Borer dies", + "subtitles.twilightforest.entity.termite.hurt": "Towerwood Borer hurts", + "subtitles.twilightforest.entity.tinybird.chirp": "Bird chirps", + "subtitles.twilightforest.entity.tinybird.hurt": "Bird hurts", + "subtitles.twilightforest.entity.tinybird.song": "Bird sings", + "subtitles.twilightforest.entity.tinybird.takeoff": "Bird takes off", + "subtitles.twilightforest.entity.tome.death": "Death Tome falls apart", + "subtitles.twilightforest.entity.tome.hurt": "Death Tome creases", + "subtitles.twilightforest.entity.tome.ambient": "Death Tome flips pages", + "subtitles.twilightforest.entity.troll.throw_rock": "Troll chucks block", + "subtitles.twilightforest.entity.urghast.ambient": "Ur-Ghast cries", + "subtitles.twilightforest.entity.urghast.death": "Ur-Ghast dies", + "subtitles.twilightforest.entity.urghast.hurt": "Ur-Ghast screams", + "subtitles.twilightforest.entity.urghast.shoot": "Ur-Ghast shoots", + "subtitles.twilightforest.entity.winterwolf.death": "Winter Wolf dies", + "subtitles.twilightforest.entity.winterwolf.hurt": "Winter Wolf hurts", + "subtitles.twilightforest.entity.winterwolf.ambient": "Winter Wolf growls", + "subtitles.twilightforest.entity.winterwolf.shoot": "Winter Wolf shoots", + "subtitles.twilightforest.entity.winterwolf.target": "Winter Wolf targets victim", + "subtitles.twilightforest.entity.wraith.ambient": "Wraith gasps", + "subtitles.twilightforest.entity.wraith.death": "Wraith dies", + "subtitles.twilightforest.entity.wraith.hurt": "Wraith hurts", + "subtitles.twilightforest.entity.yeti.death": "Yeti dies", + "subtitles.twilightforest.entity.yeti.grab": "Yeti grabs player", + "subtitles.twilightforest.entity.yeti.growl": "Yeti growls", + "subtitles.twilightforest.entity.yeti.hurt": "Yeti hurts", + "subtitles.twilightforest.entity.yeti.throw": "Yeti yeets player", + + "subtitles.twilightforest.entity.alphayeti.parrot": "Parrot coldly growls", + "subtitles.twilightforest.entity.carminitegolem.parrot": "Parrot thunks", + "subtitles.twilightforest.entity.hostilewolf.parrot": "Parrot growls", + "subtitles.twilightforest.entity.hydra.parrot": "Parrot roars", + "subtitles.twilightforest.entity.icecore.parrot": "Parrot crackles", + "subtitles.twilightforest.entity.kobold.parrot": "Parrot grumbles", + "subtitles.twilightforest.entity.minotaur.parrot": "Parrot moos angrily", + "subtitles.twilightforest.entity.mosquito.parrot": "Parrot buzzes", + "subtitles.twilightforest.entity.naga.parrot": "Parrot rattles", + "subtitles.twilightforest.entity.redcap.parrot": "Parrot chuckles", + "subtitles.twilightforest.entity.tome.parrot": "Parrot makes book noises", + "subtitles.twilightforest.entity.wraith.parrot": "Parrot gasps", + + "subtitles.twilightforest.block.beanstalk.grow": "Ground rumbles", + "subtitles.twilightforest.block.bug.squish": "Bug gets squished :(", + "subtitles.twilightforest.block.builder.create": "Builder creates block", + "subtitles.twilightforest.block.builder.off": "Builder deactivates", + "subtitles.twilightforest.block.builder.on": "Builder activates", + "subtitles.twilightforest.block.builder.replace": "Builder replaces block", + "subtitles.twilightforest.block.casket.close": "Keepsake Casket closes", + "subtitles.twilightforest.block.casket.locked": "Keepsake Casket clicks", + "subtitles.twilightforest.block.casket.open": "Keepsake Casket opens", + "subtitles.twilightforest.block.casket.repair": "Player repairs casket", + "subtitles.twilightforest.block.core.time": "Tree of Time ticks", + "subtitles.twilightforest.block.core.transformation": "Tree of Transformation hums", + "subtitles.twilightforest.block.door.activate": "Castle Door fails to vanish", + "subtitles.twilightforest.block.door.reappear": "Castle Door reappears", + "subtitles.twilightforest.block.door.vanish": "Castle Door vanishes", + "subtitles.twilightforest.block.generic.annihilation": "Block Dissolves", + "subtitles.twilightforest.block.ghast_trap.active": "Ghast Trap whirs", + "subtitles.twilightforest.block.ghast_trap.ambient": "Ghast Trap dings", + "subtitles.twilightforest.block.ghast_trap.on": "Ghast Trap activates", + "subtitles.twilightforest.block.ghast_trap.spindown": "Ghast Trap shuts off", + "subtitles.twilightforest.block.ghast_trap.warmup": "Ghast Trap warms up", + "subtitles.twilightforest.block.jet.active": "Fire Jet flares", + "subtitles.twilightforest.block.jet.pop": "Fire Jet pops", + "subtitles.twilightforest.block.jet.start": "Fire Jet starts", + "subtitles.twilightforest.block.pedestal.activate": "Trophy Pedestal accepts trophy", + "subtitles.twilightforest.block.portal.woosh": "Twilight Forest Portal beckons", + "subtitles.twilightforest.block.reactor.ambient": "Carminite Reactor whooshes", + "subtitles.twilightforest.block.reappear.reappear": "Reappearing block reappears", + "subtitles.twilightforest.block.reappear.vanish": "Reappearing block disappears", + "subtitles.twilightforest.block.slider": "Sliding Trap moves", + "subtitles.twilightforest.block.smoker.start": "Smoker starts", + "subtitles.twilightforest.block.torchberry.harvest": "Torchberries pop", + "subtitles.twilightforest.block.vanish.locked": "Towerwood door fails to vanish", + "subtitles.twilightforest.block.vanish.unlock": "Towerwood door unlocks", + "subtitles.twilightforest.block.vanish.vanish": "Vanishing block vanishes", + + "subtitles.twilightforest.item.blockchain.collide": "Block and Chain hits block", + "subtitles.twilightforest.item.blockchain.hit": "Block and Chain hits entity", + "subtitles.twilightforest.item.blockchain.fire": "Block and Chain fires", + "subtitles.twilightforest.item.charm.keep": "Charm of Keeping returns items", + "subtitles.twilightforest.item.charm.life": "Charm of Life regenerates player", + "subtitles.twilightforest.item.fan.woosh": "Peacock Fan used", + "subtitles.twilightforest.item.glasssword.break": "Glass Sword shatters", + "subtitles.twilightforest.item.flask.break": "Brittle Flask shatters", + "subtitles.twilightforest.item.flask.crack": "Brittle Flask cracks", + "subtitles.twilightforest.item.flask.fill": "Potion Flask fills", + "subtitles.twilightforest.item.icebomb.fired": "Ice Bomb thrown", + "subtitles.twilightforest.item.knightmetal_shield.shatter": "Metal Shield shatters", + "subtitles.twilightforest.item.lamp.burn": "Lamp of Cinders burns area", + "subtitles.twilightforest.item.magnet.grab": "Magnet pulls up ore", + "subtitles.twilightforest.item.moonworm.squish": "Moonworm fires", + "subtitles.twilightforest.item.powder.use": "Transformation Powder used", + "subtitles.twilightforest.item.scepter.drain": "Life Scepter drains", + "subtitles.twilightforest.item.scepter.use": "Scepter used", + "subtitles.twilightforest.item.scepter.pearl": "Twilight Scepter throws pearl", + "subtitles.twilightforest.item.shield.shatter": "Wooden Shield shatters", + + "death.attack.twilightforest.ghastTear": "%1$s was scalded by fiery tears", + "death.attack.twilightforest.ghastTear.player": "%1$s was scalded by fiery tears while escaping %2$s", + "death.attack.twilightforest.hydraFire": "%1$s was roasted alive by the Hydra", + "death.attack.twilightforest.hydraFire.player": "%1$s was roasted alive by the Hydra while escaping %2$s", + "death.attack.twilightforest.hydraBite": "%1$s's skin was ripped off by the Hydra", + "death.attack.twilightforest.hydraBite.player": "%1$s's skin was ripped off by the Hydra while escaping %2$s", + "death.attack.twilightforest.lichBolt": "The Lich's aim was better than %1$s", + "death.attack.twilightforest.lichBolt.player": "The Lich and %2$s had better aim than %1$s", + "death.attack.twilightforest.lichBomb": "%1$s succumbed to the Lich's explosive magic", + "death.attack.twilightforest.lichBomb.player": "%1$s succumbed to the Lich's explosive magic while escaping %2$s", + "death.attack.twilightforest.chillingBreath": "%1$s was frozen to death by the Snow Queen", + "death.attack.twilightforest.chillingBreath.player": "%1$s was frozen to death by the Snow Queen while escaping %2$s", + "death.attack.twilightforest.squish": "%1$s was squashed by the Snow Queen", + "death.attack.twilightforest.squish.player": "%1$s was squashed by the Snow Queen while escaping %2$s", + "death.attack.twilightforest.thrownAxe": "%1$s was decapitated by a thrown axe", + "death.attack.twilightforest.thrownAxe.player": "%1$s was decapitated by a thrown axe while escaping %2$s", + "death.attack.twilightforest.thrownPickaxe": "%1$s was decapitated by a thrown pickaxe", + "death.attack.twilightforest.thrownPickaxe.player": "%1$s was decapitated by a thrown pickaxe while escaping %2$s", + "death.attack.twilightforest.fireJet": "%1$s accidentally walked into a fire jet", + "death.attack.twilightforest.fireJet.player": "%1$s accidentally walked into a fire jet while escaping %2$s", + "death.attack.twilightforest.reactor": "%1$s stood too close to a carminite reactor", + "death.attack.twilightforest.reactor.player": "%1$s stood too close to a carminite reactor while escaping %2$s", + "death.attack.twilightforest.slider": "%1$s was sliced up by a sliding trap", + "death.attack.twilightforest.slider.player": "%1$s was sliced up by a sliding trap while escaping %2$s", + "death.attack.twilightforest.thorns": "%1$s walked into some thorns", + "death.attack.twilightforest.thorns.player": "%1$s walked into some thorns while escaping %2$s", + "death.attack.twilightforest.knightmetal": "%1$s was spiked by a knightmetal block", + "death.attack.twilightforest.knightmetal.player": "%1$s was spiked by a knightmetal block while escaping %2$s", + "death.attack.twilightforest.fiery": "%1$s walked onto a fiery block", + "death.attack.twilightforest.fiery.player": "%1$s walked onto a fiery block while escaping %2$s", + "death.attack.twilightforest.thrown_block": "%1$s was squashed by a thrown block", + "death.attack.twilightforest.thrown_block.player": "%1$s was squashed by a thrown block while escaping %2$s", + "death.attack.twilightforest.expired": "%1$s's life expired", + "death.attack.twilightforest.expired.player": "%1$s's life expired", + + "death.attack.twilightforest.axing": "%1$s was chopped up by %2$s", + "death.attack.twilightforest.axing.item": "%1$s was chopped up by %2$s using %3$s", + "death.attack.twilightforest.cicada": "%1$s was shot by Cicada", + "death.attack.twilightforest.moonworm": "%1$s was shot by Moonworm", + "death.attack.twilightforest.ant": "%1$s lived the life of an ant thanks to %2$s", + "death.attack.twilightforest.ant.item": "%1$s lived the life of an ant thanks to %2$s using %3$s", + "death.attack.twilightforest.haunt": "%1$s joined the %2$s's haunt", + "death.attack.twilightforest.haunt.item": "%1$s joined the %2$s's haunt after being killed with %3$s", + "death.attack.twilightforest.clamped": "%1$s was clamped to death by %2$s", + "death.attack.twilightforest.clamped.item": "%1$s was clamped to death by %2$s using %3$s", + "death.attack.twilightforest.scorched": "%1$s was scorched by %2$s", + "death.attack.twilightforest.scorched.item": "%1$s was scorched by %2$s using %3$s", + "death.attack.twilightforest.frozen": "%1$s was frozen by %2$s using an Ice Bomb", + "death.attack.twilightforest.frozen.item": "%1$s was frozen by %2$s using %3$s", + "death.attack.twilightforest.spiked": "%1$s was spiked by %2$s", + "death.attack.twilightforest.spiked.item": "%1$s was spiked by %2$s using %3$s", + "death.attack.twilightforest.leafBrain": "%1$s's brain was turned into leaves by %2$s", + "death.attack.twilightforest.leafBrain.item": "%1$s's brain was turned into leaves by %2$s using %3$s", + "death.attack.twilightforest.lostWords": "%1$s was at a loss for words after being killed by %2$s", + "death.attack.twilightforest.lostWords.item": "%1$s was at a loss for words after being killed by %2$s using %3$s", + "death.attack.twilightforest.schooled": "%1$s was schooled by %2$s", + "death.attack.twilightforest.schooled.item": "%1$s was schooled by %2$s using %3$s", + "death.attack.twilightforest.snowballFight": "%1$s lost a snowball fight to %2$s", + "death.attack.twilightforest.snowballFight.item": "%1$s lost a snowball fight to %2$s using %3$s", + "death.attack.twilightforest.lifedrain": "%1$s's life was drained by %2$s", + "death.attack.twilightforest.lifedrain.item": "%1$s's life was drained by %2$s using %3$s", + "death.attack.twilightforest.yeeted": "%1$s was yeeted for the last time", + "death.attack.twilightforest.yeeted.entity": "%1$s was yeeted for the last time by %2$s", + "death.attack.twilightforest.yeeted.item": "%1$s was yeeted for the last time by %2$s while somehow holding %3$s", + + "stat.twilightforest.blocks_crumbled": "Blocks Crumbled with Horn", + "stat.twilightforest.bugs_squished": "Bugs Squished", + "stat.twilightforest.e115_slices_eaten": "Experiment 115 Slices Eaten", + "stat.twilightforest.keeping_charms_activated": "Activated Charms of Keeping", + "stat.twilightforest.life_charms_activated": "Activated Charms of Life", + "stat.twilightforest.skull_candles_made": "Skull Candles Made", + "stat.twilightforest.tf_shields_broken": "Fortification Shields Broken", + "stat.twilightforest.torchberries_harvested": "Torchberries Harvested", + "stat.twilightforest.trophy_pedestals_activated": "Trophy Pedestals Activated", + "stat.twilightforest.uncrafting_table_interactions": "Interactions with Uncrafting Table", + + "twilightforest.misc.wip0": "This block is a work in progress and may have bugs or unintended effects that may damage your world.", + "twilightforest.misc.wip1": "Use with caution.", + "twilightforest.misc.nyi": "This block has effects that are not yet implemented.", + + "twilightforest.loading.title.enter": "Whisking you off to the Twilight Forest...", + "twilightforest.loading.title.leave": "Whisking you from the Twilight Forest...", + + "twilightforest.ui.magicmap.fail": "The Magic faltered. Perhaps it doesn't work here?", + "twilightforest.ui.biome_locked": "Biome Locked!", + "twilightforest.ui.biome_locked_2": "Check your advancements", + "twilightforest.ui.portal.unworthy": "The Portal pool is unresponsive. Perhaps something was neglected?", + "twilightforest.ui.advancement.required": "Advancement Required:", + "twilightforest.ui.advancement.no_title": "", + + "twilightforest.config.dimension": "Dimension Settings", + "twilightforest.config.dimension.tooltip": "You won't be able to change these settings without some kind of relaunch.", + "twilightforest.config.spawn_in_tf": "New Players Spawn in Twilight Forest", + "twilightforest.config.spawn_in_tf.tooltip": "If true, players spawning for the first time will spawn in the Twilight Forest.", + "twilightforest.config.portal_for_new_player": "Generate Portals for New Players", + "twilightforest.config.portal_for_new_player.tooltip": "If true, the return portal will spawn for new players that were sent to the TF if `spawn_in_tf` is true.", + + "twilightforest.config.hollow_hill_stalactites": "Custom Hollow Hill Stalactites", + "twilightforest.config.hollow_hill_stalactites.tooltip": "Defines custom stalactites generated in hollow hills.\nFormat is \\\"modid:block<:meta> size max_Length min_Height weight\\\", where the properties are:\nSize - the maximum length of the stalactite relative to the space between hill floor and ceiling,\nMax length - maximum length of a stalactite in blocks,\nMin height - minimum space between the hill floor and the stalactite to let it generate,\nWeight - how often it generates.\n\nFor example: \\\"minecraft:iron_ore 0.7 8 1 24\\\" would add a stalactite equal to the default iron ore stalactite.", + "twilightforest.config.large_hill": "Large Hills", + "twilightforest.config.large_hill.tooltip": "Blocks generating as stalactites in large hills only.", + "twilightforest.config.medium_hill": "Medium and Large Hills", + "twilightforest.config.medium_hill.tooltip": "Blocks generating as stalactites in medium and large hills.", + "twilightforest.config.small_hill": "All Hills", + "twilightforest.config.small_hill.tooltip": "Blocks generating as stalactites in all hills.", + "twilightforest.config.stalactite_config_only": "Only Use the Stalactite Config", + "twilightforest.config.stalactite_config_only.tooltip": "If true, default stalactites and stalactites defined by other mods will not be used.", + + "twilightforest.config.silent_cicadas": "Silent Cicadas", + "twilightforest.config.silent_cicadas.tooltip": "Make cicadas silent for those having sound library problems, or otherwise finding them annoying.", + + "twilightforest.config.first_person_effects": "Render 1st Person Effects", + "twilightforest.config.first_person_effects.tooltip": "Controls whether various effects from the mod are rendered while in first-person view. Turn this off if you find them distracting.", + + "twilightforest.config.origin_dimension": "Origin Dimension", + "twilightforest.config.origin_dimension.tooltip": "The dimension you can always travel to the Twilight Forest from, as well as the dimension you will return to. Defaults to the overworld.", + "twilightforest.config.portals_in_other_dimensions": "Portals in other dimensions", + "twilightforest.config.portals_in_other_dimensions.tooltip": "Allow portals to the Twilight Forest to be made outside of the 'origin' dimension. May be considered an exploit.", + "twilightforest.config.admin_portals": "Admin-Only Twilight Portals", + "twilightforest.config.admin_portals.tooltip": "Allow portals only for admins (Operators). This severely reduces the range in which the mod usually scans for valid portal conditions, and it scans near ops only.", + "twilightforest.config.portals": "Disable Twilight Portals", + "twilightforest.config.portals.tooltip": "Disable Twilight Forest portal creation entirely. Provided for server operators looking to restrict action to the dimension.", + "twilightforest.config.portal_lighting": "Portal Creation Lightning Fire", + "twilightforest.config.portal_lighting.tooltip": "Set this true if you want the lightning that zaps the portal to not set things on fire. For those who don't like fun.", + "twilightforest.config.portal_return": "Should Portals generate as a two-way portal", + "twilightforest.config.portal_return.tooltip": "If false, the return portal will require the activation item.", + "twilightforest.config.check_portal_destination": "Pre-Check Portal Destination", + "twilightforest.config.check_portal_destination.tooltip": "Determines if new portals should be pre-checked for safety. If enabled, portals will fail to form rather than redirect to a safe alternate destination.\n_Note that enabling this also reduces the rate at which portal formation checks are performed.", + + "twilightforest.config.uncrafting": "Disable Uncrafting in Uncrafting Table", + "twilightforest.config.uncrafting.tooltip": "Disable the uncrafting function of the uncrafting table. Provided as an option when interaction with other mods produces exploitable recipes.", + "twilightforest.config.uncrafting_recipes": "Disable Uncrafting Recipes in Uncrafting Table", + "twilightforest.config.uncrafting_recipes.tooltip": "If you don't want to disable uncrafting altogether, and would rather disable certain recipes, this is for you.\nTo add a recipe, add the mod id followed by the name of the recipe. You can check this in things like JEI.\nExample: \"twilightforest:moonworm_queen\" will disable uncrafting the moonworm queen into itself and 3 torchberries.\nIf an item has multiple crafting recipes and you wish to disable them all, add the item to the \"twilightforest:banned_uncraftables\" item tag.\nIf you have a problematic ingredient, like infested towerwood for example, add the item to the \"twilightforest:banned_uncrafting_ingredients\" item tag.", + + "twilightforest.config.optifine": "Disable the nag screen when Optifine is installed.", + "twilightforest.config.optifine.tooltip": "Disables the nag screen shown on launch when Optifine is installed.", + + "twilightforest.config.locked_toast": "Disable the Locked Biome Toasts.", + "twilightforest.config.locked_toast.tooltip": "Disables the toasts that appear when a biome is locked. Not recommended if you're not familiar with progression.", + + "twilightforest.config.animate_trophyitem": "Rotate Trophy Heads on Item model", + "twilightforest.config.animate_trophyitem.tooltip": "Rotate trophy heads on item model. Has no performance impact at all. For those who don't like fun.", + + "twilightforest.config.shield_parry": "Shield Parrying", + "twilightforest.config.shield_parry.tooltip": "We recommend downloading the Shield Parry mod for parrying, but these controls remain for without.", + "twilightforest.config.parry_non_twilight": "Parry non-Twilight projectiles", + "twilightforest.config.parry_non_twilight.tooltip": "Set to true to parry non-Twilight projectiles. We recommend downloading the Shield Parry mod instead.", + "twilightforest.config.parry_window": "Timing Windowspan for Projectiles", + "twilightforest.config.parry_window.tooltip": "The amount of ticks after raising a shield that makes it OK to parry a projectile. There are 20 ticks in 1 second.", + + "twilightforest.config.casket_uuid_locking": "Keepsake Casket UUID Locking", + "twilightforest.config.casket_uuid_locking.tooltip": "If true, Keepsake Caskets that are spawned when a player dies will not be accessible by other players. Use this if you dont want people taking from other people's death caskets. NOTE: server operators will still be able to open locked caskets.", + "twilightforest.config.disable_skull_candles": "Disable Skull Candle Creation", + "twilightforest.config.disable_skull_candles.tooltip": "If true, disables the ability to make Skull Candles by right clicking a vanilla skull with a candle. Turn this on if you're having mod conflict issues for some reason.", + + "twilightforest.book.author": "a forgotten explorer", + + "twilightforest.book.lichtower": "Notes on a Pointy Tower", + "twilightforest.book.lichtower.1": "§8[[An explorer's notebook, gnawed on by monsters]]§0\n\nI have begun examining the strange aura surrounding this tower. The bricks of the tower are protected by a curse, stronger than any I've seen before. The magic from the curse", + "twilightforest.book.lichtower.2": "is boiling off into the surrounding area.\n\nIn my homeland I would have many options for dealing with this magic, but here my supplies are limited. I shall have to research...", + "twilightforest.book.lichtower.3": "§8[[Many entries later]]§0\n\nA breakthrough! In my journeys I sighted a huge snake-like monster in a decorated courtyard. Nearby, I picked up a worn down, discarded green scale.\n\nThe magic in the scale seems to have the", + "twilightforest.book.lichtower.4": "curse-breaking properties I need, but the magic is too dim. I may need to acquire a fresher specimen, directly from the creature.", + + "twilightforest.book.labyrinth": "Notes on a Swampy Labyrinth", + "twilightforest.book.labyrinth.1": "§8[[An explorer's notebook, written on waterproof paper]]§0\n\nThe mosquitoes in this swamp are vexing, but strange. The vast majority of them seem to have no natural source, nor do they seem to have a role in the local ecology. I have begun to", + "twilightforest.book.labyrinth.2": "suspect that they are some kind of magical curse.\n\n§8[[Next entry]]§0\n\nNow that I have encountered a protection spell on the ruined labyrinth here, I consider my suspicions confirmed. Both the protection", + "twilightforest.book.labyrinth.3": "spell and the mosquitoes are a curse. This curse seems to have a different source from the others I have encountered. I will have to research further...\n\n§8[[Next entry]]§0\n\nThe curse seems to", + "twilightforest.book.labyrinth.4": "be of a type too powerful for one being alone to produce. Several wizards working in combination would be necessary.\n\nIf one of the wizards stopped contributing, the whole of the curse over the entire swamp would fall. Strangely,", + "twilightforest.book.labyrinth.5": "my divinations do not show signs of any nearby living wizards. I did see something interesting in one of the nearby pointy-roofed towers though...", + + "twilightforest.book.hydralair": "Notes on the Fire Swamp", + "twilightforest.book.hydralair.1": "§8[[An explorer's notebook, written on fireproof paper]]§0\n\nFire is a trivial obstacle for a master explorer such as myself. I have traversed seas of fire, and swam through oceans of lava. The burning air here is an interesting variation,", + "twilightforest.book.hydralair.2": "but ultimately no hindrance.\n\nWhat does stop me though is that I have encountered another protection spell, this time surrounding a mighty creature that must be king of this fire swamp. This is not the first protection spell I have", + "twilightforest.book.hydralair.3": "encountered, and I am beginning to unravel the mysteries of how they work.\n\nIf this spell is like the others, it will be sustained by a powerful creature nearby. Surrounding the fire swamp are several wet swamps, and under those", + "twilightforest.book.hydralair.4": "swamps are labyrinths full of minotaurs. The logical choice to bind such a spell to would be some sort of powerful minotaur, different in some way from the others that surround it...", + + "twilightforest.book.tfstronghold": "Notes on a Stronghold", + "twilightforest.book.tfstronghold.1": "§8[[An explorer's notebook, written on faintly glowing paper]]§0\n\nThe tendrils of darkness surrounding this area are just a manifestation of a protective spell over the entire dark forest. The spell causes blindness, which is quite vexing. I have", + "twilightforest.book.tfstronghold.2": "seen several interesting things in the area and would like to keep exploring.\n\n§8[[Next entry]]§0\n\nI have found ruins in the dark forest. They belong to a stronghold, of a type usually inhabited by knights. Rather than", + "twilightforest.book.tfstronghold.3": "knights though, this stronghold is full of goblins. They wear knightly armor, but their behavior is most un-knightly.\n\n§8[[Next entry]]§0\n\nDeep in the ruins, I have found a pedestal. The pedestal seems to be of a type that", + "twilightforest.book.tfstronghold.4": "knights would place trophies on to prove their strength.\n\\Obtaining a powerful scepter would seem to weaken the curse on the dark forest, and placing a trophy associated with a powerful creature on the pedestal would likely grant access into the", + "twilightforest.book.tfstronghold.5": "main part of the stronghold.", + + "twilightforest.book.darktower": "Notes on a Wooden Tower", + "twilightforest.book.darktower.1": "§8[[An explorer's notebook that seems to have survived an explosion]]§0\n\nThis tower clearly has mechanisms that are not responding to me. Their magic almost yearns to acknowledge my touch, but it cannot. It is if the devices of the tower are being", + "twilightforest.book.darktower.2": "suppressed by a powerful group of beings nearby.\n\n§8[[Next entry]]§0\n\nThe magic seems to emanate from deep within the strongholds nearby. It can't come from the goblins, as their magic is charming, but unfocused. There", + "twilightforest.book.darktower.3": "must still be some force still active in the strongholds.\n\n§8[[Next entry]]§0\n\nMy analysis indicates that it comes from several sources, operating as a group. I will head back to the stronghold after I resupply...", + + "twilightforest.book.yeticave": "Notes on an Icy Cave", + "twilightforest.book.yeticave.1": "§8[[An explorer's notebook, covered in frost]]§0\n\nThe blizzard surrounding these snowy lands is unceasing. This is no ordinary snowfall--this is a magical phenomenon. I will have to conduct experiments to find", + "twilightforest.book.yeticave.2": "what is capable of causing such an effect.\n\n§8[[Next entry]]§0\n\nThe curse seems to be of a type too powerful for one being alone to produce. Several wizards working in combination would be necessary.", + "twilightforest.book.yeticave.3": "If one of the wizards stopped contributing, the blizzard would calm. Strangely, my divinations do not show signs of any nearby living wizards. I did see something interesting in one of the nearby pointy-roofed towers though...", + + "twilightforest.book.icetower": "Notes on Auroral Fortification", + "twilightforest.book.icetower.1": "§8[[An explorer's notebook, caked in ice]]§0\n\nI overcame one blizzard, only to run into this terrible ice storm atop the glacier. My explorations have shown me the splendor of an ice palace, shining with the colors of the polar aurora. It", + "twilightforest.book.icetower.2": "all seems protected by some sort of curse.\n\n§8[[Next entry]]§0\n\nI am no novice. This curse is fed by the power of a creature nearby. The cause of the curse surrounding the fire swamp was built off the power of the leader of the", + "twilightforest.book.icetower.3": "minotaurs nearby.\n\nSurrounding this glacier, there are masses of yetis. Perhaps the yetis have some sort of leader...", + + "twilightforest.book.trollcave": "Notes on the Highlands", + "twilightforest.book.trollcave.1": "§8[[An explorer's notebook, damaged by acid]]§0\n\nThere seems to be no way to protect myself from the toxic rainstorm surrounding this area. In my brief excursions, I have also encountered another protection spell, similar to the", + "twilightforest.book.trollcave.2": "others I have witnessed. The spell must be connected to the toxic storm in some way. Further research to follow...\n\n§8[[Next entry]]§0\n\nSuch supreme weather magic must be the result of", + "twilightforest.book.trollcave.3": "multiple undefeated great evils in this world. My studies contain several clues pointing at a searing swamp, a forest coated in deep darkness, and a realm coated in snow.", + + "twilightforest.book.unknown": "Notes on the Unexplained", + "twilightforest.book.unknown.1": "§8[[This book shows signs of having been copied many times]]§0\n\nI cannot explain the field surrounding this structure, but the magic is powerful. If this curse is like the others, then the answer to unlocking it lies elsewhere. Perhaps there is", + "twilightforest.book.unknown.2": "something I have left undone, or some monster I have yet to defeat. I will have to turn back. I will return to this place later, to see if anything has changed.", + + + "block.twilightforest.molten_fiery_fluid": "Molten Fiery", + "block.twilightforest.molten_knightmetal_fluid": "Molten Knightmetal", + "block.twilightforest.fiery_essence_fluid": "Fiery Essence", + "fluid.twilightforest.molten_fiery": "Molten Fiery", + "fluid.twilightforest.molten_knightmetal": "Molten Knightmetal", + "fluid.twilightforest.fiery_essence": "Fiery Essence", + + "item.twilightforest.molten_fiery_bucket": "Molten Fiery Bucket", + "item.twilightforest.molten_knightmetal_bucket": "Molten Knightmetal Bucket", + "item.twilightforest.fiery_essence_bucket": "Fiery Essence Bucket", + + "material.twilightforest.nagascale": "Naga Scale", + "material.twilightforest.steeleaf": "Steeleaf", + "material.twilightforest.fiery": "Fiery", + "material.twilightforest.knightmetal": "Knightmetal", + "material.twilightforest.raven_feather": "Raven Feather", + + "modifier.twilightforest.precipitate": "Precipitate", + "modifier.twilightforest.precipitate.flavor": "The last standing escape plan.", + "modifier.twilightforest.precipitate.description": "The less health you have, the speedier it is!", + "modifier.twilightforest.stalwart": "Stalwart", + "modifier.twilightforest.stalwart.flavor": "The Brave and Bold.", + "modifier.twilightforest.stalwart.description": "Hitting an entity can make you feel emboldened.", + "modifier.twilightforest.superheat": "Superheat", + "modifier.twilightforest.superheat.flavor": "Turn up the heat!", + "modifier.twilightforest.superheat.description": "Deal bonus damage to enemies on fire.", + "modifier.twilightforest.synergy": "Synergy", + "modifier.twilightforest.synergy.flavor": "Look ma, no moss!", + "modifier.twilightforest.synergy.description": "Will repair itself if you have Steeleaves in your hotbar.", + "modifier.twilightforest.twilit": "Twilit", + "modifier.twilightforest.twilit.flavor": "The Twilight Forest's illuminating blessing.", + "modifier.twilightforest.twilit.description": "Speedier in the Twilight Forest, more damage outside the Twilight Forest.", + "modifier.twilightforest.twilit.extra.speed": "Mining Speed in Twilight Forest: +%s", + "modifier.twilightforest.twilit.extra.damage": "Damage outside the Twilight Forest: +%s", + "modifier.twilightforest.veiled": "Veiled", + "modifier.twilightforest.veiled.flavor": "Like a Specter!", + "modifier.twilightforest.veiled.description": "Projectile will be invisible.", + + + "desc.immersiveengineering.info.shader.rarity.twilight": "Twilight", + + "item.twilightforest.shader": "Twilit Shader: %s", + "item.twilightforest.shader_bag": "Twilit %s Shader Bag", + + "item.twilightforest.shader.name.twilight": "Twilight", + "item.twilightforest.shader.name.firefly": "Firefly", + "item.twilightforest.shader.name.questing_ram": "Questing Ram", + "item.twilightforest.shader.name.ironwood": "Ironwood", + "item.twilightforest.shader.name.steeleaf": "Steeleaf", + "item.twilightforest.shader.name.knightly": "Knightmetal", + "item.twilightforest.shader.name.fiery": "Fiery", + "item.twilightforest.shader.name.snakestone": "Snakestone", + "item.twilightforest.shader.name.naga": "Naga", + "item.twilightforest.shader.name.lich": "Lich", + "item.twilightforest.shader.name.mazestone": "Mazestone", + "item.twilightforest.shader.name.pinch_beetle": "Pinch Beetle", + "item.twilightforest.shader.name.minoshroom": "Minoshroom", + "item.twilightforest.shader.name.hydra": "Hydra", + "item.twilightforest.shader.name.underbrick": "Underbrick", + "item.twilightforest.shader.name.knight_phantom": "Knight Phantom", + "item.twilightforest.shader.name.towerwood": "Towerwood", + "item.twilightforest.shader.name.carminite": "Carminite", + "item.twilightforest.shader.name.ur-ghast": "Ur-Ghast", + "item.twilightforest.shader.name.alpha_yeti": "Alpha Yeti", + "item.twilightforest.shader.name.auroralized": "Auroralized", + "item.twilightforest.shader.name.snow_queen": "Snow Queen", + "item.twilightforest.shader.name.cube_of_annihilation": "Cube Of Annihilation", + "item.twilightforest.shader.name.final_castle": "Final Castle", + + "twilightforest.gui.optifine.title": "WARNING: OPTIFINE DETECTED", + "twilightforest.gui.optifine.message": "Before proceeding, please note that Optifine is known to cause crashes, multipart entity visual bugs and many other issues.\n\nBefore reporting a bug, please remove Optifine first and check again to see if the bug is still present.\n\nOptifine-related issues are not solvable on Twilight Forest's end!\n\nThis screen may be disabled in the Client Config.", + "twilightforest.gui.optifine.suggestions": "Here's a selection of mods that we recommend using instead.", + + "gui.crumble_horn_jei": "Crumble Horn", + "gui.transformation_jei": "Transformation Powder", + "gui.uncrafting_jei": "Uncrafting" +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/models/block/banister_connected.json b/src/main/resources/assets/twilightforest/models/block/banister_connected.json new file mode 100644 index 0000000000..85741ed1c3 --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/banister_connected.json @@ -0,0 +1,27 @@ +{ + "parent": "block/block", + "textures": { "particle": "#texture" }, + "elements": [{ + "from": [ 2.5, 0, 13 ], + "to": [ 5.5, 16, 16 ], + "faces": { + "down" : { "texture": "#texture", "cullface": "down" }, + "up" : { "texture": "#texture", "cullface": "up" }, + "north": { "texture": "#texture", "rotation": 270, "uv": [ 0, 4, 16, 7 ], "cullface": "north" }, + "south": { "texture": "#texture", "rotation": 270, "uv": [ 0, 4, 16, 7 ] }, + "west" : { "texture": "#texture", "rotation": 270, "uv": [ 0, 4, 16, 7 ] }, + "east" : { "texture": "#texture", "rotation": 270, "uv": [ 0, 4, 16, 7 ] } + } + }, { + "from": [ 10.5, 0, 13 ], + "to": [ 13.5, 16, 16 ], + "faces": { + "down" : { "texture": "#texture", "cullface": "down" }, + "up" : { "texture": "#texture", "cullface": "up" }, + "north": { "texture": "#texture", "rotation": 270, "uv": [ 0, 8, 16, 11 ], "cullface": "north" }, + "south": { "texture": "#texture", "rotation": 270, "uv": [ 0, 8, 16, 11 ] }, + "west" : { "texture": "#texture", "rotation": 270, "uv": [ 0, 8, 16, 11 ] }, + "east" : { "texture": "#texture", "rotation": 270, "uv": [ 0, 8, 16, 11 ] } + } + }] +} diff --git a/src/main/resources/assets/twilightforest/models/block/banister_connected_extended.json b/src/main/resources/assets/twilightforest/models/block/banister_connected_extended.json new file mode 100644 index 0000000000..dbe2ccb015 --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/banister_connected_extended.json @@ -0,0 +1,49 @@ +{ + "parent": "block/block", + "textures": { "particle": "#texture" }, + "elements": [{ + "from": [ 2.5, 0, 13 ], + "to": [ 5.5, 16, 16 ], + "faces": { + "down" : { "texture": "#texture", "cullface": "down" }, + "up" : { "texture": "#texture", "cullface": "up" }, + "north": { "texture": "#texture", "rotation": 270, "uv": [ 0, 4, 16, 7 ], "cullface": "north" }, + "south": { "texture": "#texture", "rotation": 270, "uv": [ 0, 4, 16, 7 ] }, + "west" : { "texture": "#texture", "rotation": 270, "uv": [ 0, 4, 16, 7 ] }, + "east" : { "texture": "#texture", "rotation": 270, "uv": [ 0, 4, 16, 7 ] } + } + }, { + "from": [ 10.5, 0, 13 ], + "to": [ 13.5, 16, 16 ], + "faces": { + "down" : { "texture": "#texture", "cullface": "down" }, + "up" : { "texture": "#texture", "cullface": "up" }, + "north": { "texture": "#texture", "rotation": 270, "uv": [ 0, 8, 16, 11 ], "cullface": "north" }, + "south": { "texture": "#texture", "rotation": 270, "uv": [ 0, 8, 16, 11 ] }, + "west" : { "texture": "#texture", "rotation": 270, "uv": [ 0, 8, 16, 11 ] }, + "east" : { "texture": "#texture", "rotation": 270, "uv": [ 0, 8, 16, 11 ] } + } + }, { + "from": [ 2.5, -8, 13 ], + "to": [ 5.5, 0, 16 ], + "faces": { + "down" : { "texture": "#texture", "cullface": "down" }, + "up" : { "texture": "#texture", "cullface": "up" }, + "north": { "texture": "#texture", "rotation": 270, "uv": [ 8, 4, 16, 7 ], "cullface": "north" }, + "south": { "texture": "#texture", "rotation": 270, "uv": [ 8, 4, 16, 7 ] }, + "west" : { "texture": "#texture", "rotation": 270, "uv": [ 8, 4, 16, 7 ] }, + "east" : { "texture": "#texture", "rotation": 270, "uv": [ 8, 4, 16, 7 ] } + } + }, { + "from": [ 10.5, -8, 13 ], + "to": [ 13.5, 0, 16 ], + "faces": { + "down" : { "texture": "#texture", "cullface": "down" }, + "up" : { "texture": "#texture", "cullface": "up" }, + "north": { "texture": "#texture", "rotation": 270, "uv": [ 8, 8, 16, 11 ], "cullface": "north" }, + "south": { "texture": "#texture", "rotation": 270, "uv": [ 8, 8, 16, 11 ] }, + "west" : { "texture": "#texture", "rotation": 270, "uv": [ 8, 8, 16, 11 ] }, + "east" : { "texture": "#texture", "rotation": 270, "uv": [ 8, 8, 16, 11 ] } + } + }] +} diff --git a/src/main/resources/assets/twilightforest/models/block/banister_short.json b/src/main/resources/assets/twilightforest/models/block/banister_short.json new file mode 100644 index 0000000000..477eed3efe --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/banister_short.json @@ -0,0 +1,36 @@ +{ + "parent": "block/block", + "textures": { "particle": "#texture" }, + "elements": [{ + "from": [ 0, 4, 12 ], + "to": [ 16, 8, 16 ], + "faces": { + "down": { "texture": "#texture" }, + "up": { "texture": "#texture", "cullface": "up" }, + "north": { "texture": "#texture", "cullface": "north" }, + "south": { "texture": "#texture" }, + "west": { "texture": "#texture", "cullface": "west" }, + "east": { "texture": "#texture", "cullface": "east" } + } + }, { + "from": [ 2.5, 0, 13 ], + "to": [ 5.5, 4, 16 ], + "faces": { + "down" : { "texture": "#texture" , "cullface": "down" }, + "north": { "texture": "#texture", "rotation": 270, "uv": [ 0, 4, 4, 7 ], "cullface": "north" }, + "south": { "texture": "#texture", "rotation": 270, "uv": [ 0, 4, 4, 7 ] }, + "west" : { "texture": "#texture", "rotation": 270, "uv": [ 0, 4, 4, 7 ] }, + "east" : { "texture": "#texture", "rotation": 270, "uv": [ 0, 4, 4, 7 ] } + } + }, { + "from": [ 10.5, 0, 13 ], + "to": [ 13.5, 4, 16 ], + "faces": { + "down": { "texture": "#texture" , "cullface": "down" }, + "north": { "texture": "#texture", "rotation": 270, "uv": [ 0, 8, 4, 11 ], "cullface": "north" }, + "south": { "texture": "#texture", "rotation": 270, "uv": [ 0, 8, 4, 11 ] }, + "west": { "texture": "#texture", "rotation": 270, "uv": [ 0, 8, 4, 11 ] }, + "east": { "texture": "#texture", "rotation": 270, "uv": [ 0, 8, 4, 11 ] } + } + }] +} diff --git a/src/main/resources/assets/twilightforest/models/block/banister_short_extended.json b/src/main/resources/assets/twilightforest/models/block/banister_short_extended.json new file mode 100644 index 0000000000..6698e0a55c --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/banister_short_extended.json @@ -0,0 +1,58 @@ +{ + "parent": "block/block", + "textures": { "particle": "#texture" }, + "elements": [{ + "from": [ 0, 4, 12 ], + "to": [ 16, 8, 16 ], + "faces": { + "down": { "texture": "#texture" }, + "up": { "texture": "#texture", "cullface": "up" }, + "north": { "texture": "#texture", "cullface": "north" }, + "south": { "texture": "#texture" }, + "west": { "texture": "#texture", "cullface": "west" }, + "east": { "texture": "#texture", "cullface": "east" } + } + }, { + "from": [ 2.5, 0, 13 ], + "to": [ 5.5, 4, 16 ], + "faces": { + "down" : { "texture": "#texture" , "cullface": "down" }, + "north": { "texture": "#texture", "rotation": 270, "uv": [ 0, 4, 4, 7 ], "cullface": "north" }, + "south": { "texture": "#texture", "rotation": 270, "uv": [ 0, 4, 4, 7 ] }, + "west" : { "texture": "#texture", "rotation": 270, "uv": [ 0, 4, 4, 7 ] }, + "east" : { "texture": "#texture", "rotation": 270, "uv": [ 0, 4, 4, 7 ] } + } + }, { + "from": [ 10.5, 0, 13 ], + "to": [ 13.5, 4, 16 ], + "faces": { + "down": { "texture": "#texture" , "cullface": "down" }, + "north": { "texture": "#texture", "rotation": 270, "uv": [ 0, 8, 4, 11 ], "cullface": "north" }, + "south": { "texture": "#texture", "rotation": 270, "uv": [ 0, 8, 4, 11 ] }, + "west": { "texture": "#texture", "rotation": 270, "uv": [ 0, 8, 4, 11 ] }, + "east": { "texture": "#texture", "rotation": 270, "uv": [ 0, 8, 4, 11 ] } + } + }, { + "from": [ 2.5, -8, 13 ], + "to": [ 5.5, 0, 16 ], + "faces": { + "down" : { "texture": "#texture", "cullface": "down" }, + "up" : { "texture": "#texture", "cullface": "up" }, + "north": { "texture": "#texture", "rotation": 270, "uv": [ 0, 4, 8, 7 ], "cullface": "north" }, + "south": { "texture": "#texture", "rotation": 270, "uv": [ 0, 4, 8, 7 ] }, + "west" : { "texture": "#texture", "rotation": 270, "uv": [ 0, 4, 8, 7 ] }, + "east" : { "texture": "#texture", "rotation": 270, "uv": [ 0, 4, 8, 7 ] } + } + }, { + "from": [ 10.5, -8, 13 ], + "to": [ 13.5, 0, 16 ], + "faces": { + "down" : { "texture": "#texture", "cullface": "down" }, + "up" : { "texture": "#texture", "cullface": "up" }, + "north": { "texture": "#texture", "rotation": 270, "uv": [ 0, 8, 8, 11 ], "cullface": "north" }, + "south": { "texture": "#texture", "rotation": 270, "uv": [ 0, 8, 8, 11 ] }, + "west" : { "texture": "#texture", "rotation": 270, "uv": [ 0, 8, 8, 11 ] }, + "east" : { "texture": "#texture", "rotation": 270, "uv": [ 0, 8, 8, 11 ] } + } + }] +} diff --git a/src/main/resources/assets/twilightforest/models/block/banister_tall.json b/src/main/resources/assets/twilightforest/models/block/banister_tall.json new file mode 100644 index 0000000000..f84af07e9d --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/banister_tall.json @@ -0,0 +1,36 @@ +{ + "parent": "block/block", + "textures": { "particle": "#texture" }, + "elements": [{ + "from": [ 0, 12, 12 ], + "to": [ 16, 16, 16 ], + "faces": { + "down": { "texture": "#texture" }, + "up": { "texture": "#texture", "cullface": "up" }, + "north": { "texture": "#texture", "cullface": "north" }, + "south": { "texture": "#texture" }, + "west": { "texture": "#texture", "cullface": "west" }, + "east": { "texture": "#texture", "cullface": "east" } + } + }, { + "from": [ 2.5, 0, 13 ], + "to": [ 5.5, 12, 16 ], + "faces": { + "down" : { "texture": "#texture" , "cullface": "down" }, + "north": { "texture": "#texture", "rotation": 270, "uv": [ 0, 4, 12, 7 ], "cullface": "north" }, + "south": { "texture": "#texture", "rotation": 270, "uv": [ 0, 4, 12, 7 ] }, + "west" : { "texture": "#texture", "rotation": 270, "uv": [ 0, 4, 12, 7 ] }, + "east" : { "texture": "#texture", "rotation": 270, "uv": [ 0, 4, 12, 7 ] } + } + }, { + "from": [ 10.5, 0, 13 ], + "to": [ 13.5, 12, 16 ], + "faces": { + "down": { "texture": "#texture" , "cullface": "down" }, + "north": { "texture": "#texture", "rotation": 270, "uv": [ 0, 8, 12, 11 ], "cullface": "north" }, + "south": { "texture": "#texture", "rotation": 270, "uv": [ 0, 8, 12, 11 ] }, + "west": { "texture": "#texture", "rotation": 270, "uv": [ 0, 8, 12, 11 ] }, + "east": { "texture": "#texture", "rotation": 270, "uv": [ 0, 8, 12, 11 ] } + } + }] +} diff --git a/src/main/resources/assets/twilightforest/models/block/banister_tall_extended.json b/src/main/resources/assets/twilightforest/models/block/banister_tall_extended.json new file mode 100644 index 0000000000..0a7e2584f8 --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/banister_tall_extended.json @@ -0,0 +1,58 @@ +{ + "parent": "block/block", + "textures": { "particle": "#texture" }, + "elements": [{ + "from": [ 0, 12, 12 ], + "to": [ 16, 16, 16 ], + "faces": { + "down": { "texture": "#texture" }, + "up": { "texture": "#texture", "cullface": "up" }, + "north": { "texture": "#texture", "cullface": "north" }, + "south": { "texture": "#texture" }, + "west": { "texture": "#texture", "cullface": "west" }, + "east": { "texture": "#texture", "cullface": "east" } + } + }, { + "from": [ 2.5, 0, 13 ], + "to": [ 5.5, 12, 16 ], + "faces": { + "down" : { "texture": "#texture" , "cullface": "down" }, + "north": { "texture": "#texture", "rotation": 270, "uv": [ 0, 4, 12, 7 ], "cullface": "north" }, + "south": { "texture": "#texture", "rotation": 270, "uv": [ 0, 4, 12, 7 ] }, + "west" : { "texture": "#texture", "rotation": 270, "uv": [ 0, 4, 12, 7 ] }, + "east" : { "texture": "#texture", "rotation": 270, "uv": [ 0, 4, 12, 7 ] } + } + }, { + "from": [ 10.5, 0, 13 ], + "to": [ 13.5, 12, 16 ], + "faces": { + "down": { "texture": "#texture" , "cullface": "down" }, + "north": { "texture": "#texture", "rotation": 270, "uv": [ 0, 8, 12, 11 ], "cullface": "north" }, + "south": { "texture": "#texture", "rotation": 270, "uv": [ 0, 8, 12, 11 ] }, + "west": { "texture": "#texture", "rotation": 270, "uv": [ 0, 8, 12, 11 ] }, + "east": { "texture": "#texture", "rotation": 270, "uv": [ 0, 8, 12, 11 ] } + } + }, { + "from": [ 2.5, -8, 13 ], + "to": [ 5.5, 0, 16 ], + "faces": { + "down" : { "texture": "#texture", "cullface": "down" }, + "up" : { "texture": "#texture", "cullface": "up" }, + "north": { "texture": "#texture", "rotation": 270, "uv": [ 0, 4, 8, 7 ], "cullface": "north" }, + "south": { "texture": "#texture", "rotation": 270, "uv": [ 0, 4, 8, 7 ] }, + "west" : { "texture": "#texture", "rotation": 270, "uv": [ 0, 4, 8, 7 ] }, + "east" : { "texture": "#texture", "rotation": 270, "uv": [ 0, 4, 8, 7 ] } + } + }, { + "from": [ 10.5, -8, 13 ], + "to": [ 13.5, 0, 16 ], + "faces": { + "down" : { "texture": "#texture", "cullface": "down" }, + "up" : { "texture": "#texture", "cullface": "up" }, + "north": { "texture": "#texture", "rotation": 270, "uv": [ 0, 8, 8, 11 ], "cullface": "north" }, + "south": { "texture": "#texture", "rotation": 270, "uv": [ 0, 8, 8, 11 ] }, + "west" : { "texture": "#texture", "rotation": 270, "uv": [ 0, 8, 8, 11 ] }, + "east" : { "texture": "#texture", "rotation": 270, "uv": [ 0, 8, 8, 11 ] } + } + }] +} diff --git a/src/main/resources/assets/twilightforest/models/block/banister_tilt_left.json b/src/main/resources/assets/twilightforest/models/block/banister_tilt_left.json new file mode 100644 index 0000000000..a784832d27 --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/banister_tilt_left.json @@ -0,0 +1,110 @@ +{ + "": "You won't be seeing this ingame until Mojang fixes their AO problem, plus some other issues associated with shading", + "This bug has existed for 6 freaking years": "https://bugs.mojang.com/browse/MC-84633", + "parent": "twilightforest:util/block_no_ao", + "textures": { "particle": "#texture" }, + "ambientocclusion": false, + "elements": [{ + "from": [ -3.31370849898, 4.01, 12.01 ], + "to": [ 8 , 7.99, 15.99 ], + "rotation": { + "origin": [ 8, 6, 14 ], + "axis": "z", + "angle": 45 + }, + "shade": false, + "faces": { + "up": { "texture": "#texture", "uv": [ 5, 0, 16, 4 ] }, + "down": { "texture": "#texture", "uv": [ 5, 0, 16, 4 ] }, + "north": { "texture": "#texture", "uv": [ 5, 0, 16, 4 ] }, + "south": { "texture": "#texture", "uv": [ 5, 0, 16, 4 ] } + } + }, { + "from": [ 8 , 4.01, 12.01 ], + "to": [ 19.313708499, 7.99, 15.99 ], + "rotation": { + "origin": [ 8, 6, 14 ], + "axis": "z", + "angle": 45 + }, + "shade": false, + "faces": { + "down": { "texture": "#texture", "uv": [ 0, 12, 11, 16 ] }, + "up": { "texture": "#texture", "uv": [ 0, 12, 11, 16 ] }, + "north": { "texture": "#texture", "uv": [ 0, 12, 11, 16 ] }, + "south": { "texture": "#texture", "uv": [ 0, 12, 11, 16 ] } + } + }, { + "from": [ -4.14213562373, 4.02, 12.02 ], + "to": [ 8 , 7.98, 15.98 ], + "rotation": { + "origin": [ 8, 6, 14 ], + "axis": "z", + "angle": 45 + }, + "shade": false, + "faces": { + "down": { "texture": "#texture", "uv": [ 4.14794699982, 0, 16, 4 ] }, + "up": { "texture": "#texture", "uv": [ 4.14794699982, 0, 16, 4 ] }, + "north": { "texture": "#texture", "uv": [ 4.14794699982, 0, 16, 4 ] }, + "south": { "texture": "#texture", "uv": [ 4.14794699982, 0, 16, 4 ] }, + "west": { "texture": "#texture", "cullface": "west" } + } + }, { + "from": [ 8 , 4.02, 12.02 ], + "to": [ 20.1421356237, 7.98, 15.98 ], + "rotation": { + "origin": [ 8, 6, 14 ], + "axis": "z", + "angle": 45 + }, + "shade": false, + "faces": { + "down": { "texture": "#texture", "uv": [ 0, 12, 11.8520530002, 16 ] }, + "up": { "texture": "#texture", "uv": [ 0, 12, 11.8520530002, 16 ] }, + "north": { "texture": "#texture", "uv": [ 0, 12, 11.8520530002, 16 ] }, + "south": { "texture": "#texture", "uv": [ 0, 12, 11.8520530002, 16 ] }, + "east": { "texture": "#texture", "cullface": "east" } + } + }, { + "from": [ 15.1715728753, 12, 12.03 ], + "to": [ 16 , 16, 15.97 ], + "shade": false, + "faces": { + "up": { "texture": "#texture", "cullface": "up" }, + "north": { "texture": "#texture", "cullface": "north" }, + "south": { "texture": "#texture" }, + "east": { "texture": "#texture", "cullface": "east" } + } + }, { + "from": [ 0 , -4, 12.03 ], + "to": [ 0.828427124746, 0, 15.97 ], + "shade": false, + "faces": { + "down" : { "texture": "#texture" }, + "north": { "texture": "#texture", "uv": [ 16, 12, 15.1715728753 , 16 ], "cullface": "north" }, + "south": { "texture": "#texture", "uv": [ 0, 12, 0.828427124746, 16 ] }, + "west" : { "texture": "#texture", "cullface": "west" } + } + }, { + "from": [ 2.5, 0, 13 ], + "to": [ 5.5, 1, 16 ], + "faces": { + "down" : { "texture": "#texture" }, + "north": { "texture": "#texture", "rotation": 270, "uv": [ 0, 4, 1, 7 ], "cullface": "north" }, + "south": { "texture": "#texture", "rotation": 270, "uv": [ 0, 4, 1, 7 ] }, + "west" : { "texture": "#texture", "rotation": 270, "uv": [ 0, 4, 1, 7 ] }, + "east" : { "texture": "#texture", "rotation": 270, "uv": [ 0, 4, 1, 7 ] } + } + }, { + "from": [ 10.5, 0, 13 ], + "to": [ 13.5, 9, 16 ], + "faces": { + "down": { "texture": "#texture" }, + "north": { "texture": "#texture", "rotation": 270, "uv": [ 0, 8, 9, 11 ], "cullface": "north" }, + "south": { "texture": "#texture", "rotation": 270, "uv": [ 0, 8, 9, 11 ] }, + "west": { "texture": "#texture", "rotation": 270, "uv": [ 0, 8, 9, 11 ] }, + "east": { "texture": "#texture", "rotation": 270, "uv": [ 0, 8, 9, 11 ] } + } + }] +} diff --git a/src/main/resources/assets/twilightforest/models/block/banister_tilt_right.json b/src/main/resources/assets/twilightforest/models/block/banister_tilt_right.json new file mode 100644 index 0000000000..213a72432d --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/banister_tilt_right.json @@ -0,0 +1,110 @@ +{ + "": "You won't be seeing this ingame until Mojang fixes their AO problem, plus some other issues associated with shading", + "This bug has existed for 6 freaking years": "https://bugs.mojang.com/browse/MC-84633", + "parent": "twilightforest:util/block_no_ao", + "textures": { "particle": "#texture" }, + "ambientocclusion": false, + "elements": [{ + "from": [ -3.31370849898, 4.01, 12.01 ], + "to": [ 8 , 7.99, 15.99 ], + "rotation": { + "origin": [ 8, 6, 14 ], + "axis": "z", + "angle": -45 + }, + "shade": false, + "faces": { + "up": { "texture": "#texture", "uv": [ 5, 0, 16, 4 ] }, + "down": { "texture": "#texture", "uv": [ 5, 0, 16, 4 ] }, + "north": { "texture": "#texture", "uv": [ 5, 0, 16, 4 ] }, + "south": { "texture": "#texture", "uv": [ 5, 0, 16, 4 ] } + } + }, { + "from": [ 8 , 4.01, 12.01 ], + "to": [ 19.313708499, 7.99, 15.99 ], + "rotation": { + "origin": [ 8, 6, 14 ], + "axis": "z", + "angle": -45 + }, + "shade": false, + "faces": { + "down": { "texture": "#texture", "uv": [ 0, 12, 11, 16 ] }, + "up": { "texture": "#texture", "uv": [ 0, 12, 11, 16 ] }, + "north": { "texture": "#texture", "uv": [ 0, 12, 11, 16 ] }, + "south": { "texture": "#texture", "uv": [ 0, 12, 11, 16 ] } + } + }, { + "from": [ -4.14213562373, 4.02, 12.02 ], + "to": [ 8 , 7.98, 15.98 ], + "rotation": { + "origin": [ 8, 6, 14 ], + "axis": "z", + "angle": -45 + }, + "shade": false, + "faces": { + "down": { "texture": "#texture", "uv": [ 4.14794699982, 0, 16, 4 ] }, + "up": { "texture": "#texture", "uv": [ 4.14794699982, 0, 16, 4 ] }, + "north": { "texture": "#texture", "uv": [ 4.14794699982, 0, 16, 4 ] }, + "south": { "texture": "#texture", "uv": [ 4.14794699982, 0, 16, 4 ] }, + "west": { "texture": "#texture", "cullface": "west" } + } + }, { + "from": [ 8 , 4.02, 12.02 ], + "to": [ 20.1421356237, 7.98, 15.98 ], + "rotation": { + "origin": [ 8, 6, 14 ], + "axis": "z", + "angle": -45 + }, + "shade": false, + "faces": { + "down": { "texture": "#texture", "uv": [ 0, 12, 11.8520530002, 16 ] }, + "up": { "texture": "#texture", "uv": [ 0, 12, 11.8520530002, 16 ] }, + "north": { "texture": "#texture", "uv": [ 0, 12, 11.8520530002, 16 ] }, + "south": { "texture": "#texture", "uv": [ 0, 12, 11.8520530002, 16 ] }, + "east": { "texture": "#texture", "cullface": "east" } + } + }, { + "from": [ 15.1715728753, -4, 12.03 ], + "to": [ 16 , 0, 15.97 ], + "shade": false, + "faces": { + "down" : { "texture": "#texture" }, + "north": { "texture": "#texture", "uv": [ 16, 12, 15.1715728753 , 16 ], "cullface": "north" }, + "south": { "texture": "#texture", "uv": [ 0, 12, 0.828427124746, 16 ] }, + "east" : { "texture": "#texture", "cullface": "east" } + } + }, { + "from": [ 0 , 12, 12.03 ], + "to": [ 0.828427124746, 16, 15.97 ], + "shade": false, + "faces": { + "up": { "texture": "#texture", "cullface": "up" }, + "north": { "texture": "#texture", "cullface": "north" }, + "south": { "texture": "#texture" }, + "west": { "texture": "#texture", "cullface": "west" } + } + }, { + "from": [ 2.5, 0, 13 ], + "to": [ 5.5, 9, 16 ], + "faces": { + "down" : { "texture": "#texture" , "cullface": "down" }, + "north": { "texture": "#texture", "rotation": 270, "uv": [ 0, 4, 1, 7 ], "cullface": "north" }, + "south": { "texture": "#texture", "rotation": 270, "uv": [ 0, 4, 1, 7 ] }, + "west" : { "texture": "#texture", "rotation": 270, "uv": [ 0, 4, 1, 7 ] }, + "east" : { "texture": "#texture", "rotation": 270, "uv": [ 0, 4, 1, 7 ] } + } + }, { + "from": [ 10.5, 0, 13 ], + "to": [ 13.5, 1, 16 ], + "faces": { + "down": { "texture": "#texture" , "cullface": "down" }, + "north": { "texture": "#texture", "rotation": 270, "uv": [ 0, 8, 9, 11 ], "cullface": "north" }, + "south": { "texture": "#texture", "rotation": 270, "uv": [ 0, 8, 9, 11 ] }, + "west": { "texture": "#texture", "rotation": 270, "uv": [ 0, 8, 9, 11 ] }, + "east": { "texture": "#texture", "rotation": 270, "uv": [ 0, 8, 9, 11 ] } + } + }] +} diff --git a/src/main/resources/assets/twilightforest/models/block/casket_solid_template.json b/src/main/resources/assets/twilightforest/models/block/casket_solid_template.json new file mode 100644 index 0000000000..3ad9c9a672 --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/casket_solid_template.json @@ -0,0 +1,19 @@ +{ + "parent": "block/block", + "textures": { + "particle": "#side" + }, + "elements": [ + { "from": [ -0.01, 0, -0.01 ], + "to": [ 16.01, 12, 16.01 ], + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#top" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#top" }, + "north": { "uv": [ 0, 4, 16, 16 ], "texture": "#side" }, + "south": { "uv": [ 0, 4, 16, 16 ], "texture": "#side" }, + "west": { "uv": [ 0, 4, 16, 16 ], "texture": "#side" }, + "east": { "uv": [ 0, 4, 16, 16 ], "texture": "#side" } + } + } + ] +} diff --git a/src/main/resources/assets/twilightforest/models/block/castle_door.json b/src/main/resources/assets/twilightforest/models/block/castle_door.json new file mode 100644 index 0000000000..ebd6dcfba7 --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/castle_door.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "twilightforest:block/castle_door" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/models/block/castle_door_overlay.json b/src/main/resources/assets/twilightforest/models/block/castle_door_overlay.json new file mode 100644 index 0000000000..8b2b8ceca4 --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/castle_door_overlay.json @@ -0,0 +1,23 @@ +{ + "parent": "block/block", + "render_type": "minecraft:cutout", + "textures": { + "particle": "twilightforest:block/forcefield_white", + "overlay": "twilightforest:block/castle_door_rune_corners" + }, + "elements": [ + { + "from": [ 0, 0, 0 ], + "to": [ 16, 16, 16 ], + "shade": false, + "faces": { + "down": { "forge_data": { "color": "FFFFFFFF", "block_light": 15, "sky_light": 15 }, "texture": "#overlay", "cullface": "down" , "tintindex": 0 }, + "up": { "forge_data": { "color": "FFFFFFFF", "block_light": 15, "sky_light": 15 }, "texture": "#overlay", "cullface": "up" , "tintindex": 0 }, + "north": { "forge_data": { "color": "FFFFFFFF", "block_light": 15, "sky_light": 15 }, "texture": "#overlay", "cullface": "north", "tintindex": 0 }, + "south": { "forge_data": { "color": "FFFFFFFF", "block_light": 15, "sky_light": 15 }, "texture": "#overlay", "cullface": "south", "tintindex": 0 }, + "west": { "forge_data": { "color": "FFFFFFFF", "block_light": 15, "sky_light": 15 }, "texture": "#overlay", "cullface": "west" , "tintindex": 0 }, + "east": { "forge_data": { "color": "FFFFFFFF", "block_light": 15, "sky_light": 15 }, "texture": "#overlay", "cullface": "east" , "tintindex": 0 } + } + } + ] +} diff --git a/src/main/resources/assets/twilightforest/models/block/castle_door_template.json b/src/main/resources/assets/twilightforest/models/block/castle_door_template.json new file mode 100644 index 0000000000..b50b9e2959 --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/castle_door_template.json @@ -0,0 +1,12 @@ +{ + "loader": "forge:composite", + "parent": "block/block", + "children": { + "main": { + "parent": "twilightforest:block/castle_door" + }, + "overlay": { + "parent": "twilightforest:block/castle_door_overlay" + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/models/block/clover_patch.json b/src/main/resources/assets/twilightforest/models/block/clover_patch.json new file mode 100644 index 0000000000..8d5670ee67 --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/clover_patch.json @@ -0,0 +1,4 @@ +{ + "loader": "twilightforest:patch", + "texture": "twilightforest:block/cloverpatch" +} diff --git a/src/main/resources/assets/twilightforest/models/block/experiment115_1_8.json b/src/main/resources/assets/twilightforest/models/block/experiment115_1_8.json new file mode 100755 index 0000000000..90edb669be --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/experiment115_1_8.json @@ -0,0 +1,125 @@ +{ + "parent": "block/block", + "render_type": "minecraft:cutout", + "textures": { + "particle": "#bottom", + "bottom": "twilightforest:block/experiment115/experiment115_bottom", + "inside": "twilightforest:block/experiment115/experiment115_inner", + "top": "twilightforest:block/experiment115/experiment115_top", + "top_2": "twilightforest:block/stone_twist/twist_blank", + "side": "twilightforest:block/experiment115/experiment115_side" + }, + "elements": [ + { "from": [ 4, 0, 1 ], + "to": [ 8, 8, 5 ], + "faces": { + "down": { "texture": "#bottom", "cullface": "down" }, + "up": { "texture": "#top" }, + "north": { "texture": "#side" }, + "south": { "texture": "#inside" }, + "west": { "texture": "#inside" }, + "east": { "texture": "#inside" } + } + }, + { "from": [ 2, 0, 1 ], + "to": [ 4, 8, 3 ], + "faces": { + "down": { "texture": "#bottom", "cullface": "down" }, + "up": { "texture": "#top" }, + "north": { "texture": "#side" }, + "south": { "texture": "#inside" }, + "west": { "texture": "#inside" } + } + }, + { "from": [ 6, 0, 5 ], + "to": [ 8, 8, 7 ], + "faces": { + "down": { "texture": "#bottom", "cullface": "down" }, + "up": { "texture": "#top" }, + "south": { "texture": "#inside" }, + "west": { "texture": "#inside" }, + "east": { "texture": "#inside" } + } + }, + { "from": [ 1, 0, 1 ], + "to": [ 2, 8, 2 ], + "faces": { + "down": { "texture": "#bottom", "cullface": "down" }, + "up": { "texture": "#top" }, + "north": { "texture": "#side" }, + "south": { "texture": "#inside" }, + "west": { "texture": "#side" } + } + }, + { "from": [ 3, 0, 3 ], + "to": [ 4, 8, 4 ], + "faces": { + "down": { "texture": "#bottom", "cullface": "down" }, + "up": { "texture": "#top" }, + "south": { "texture": "#inside" }, + "west": { "texture": "#inside" } + } + }, + { "from": [ 5, 0, 5 ], + "to": [ 6, 8, 6 ], + "faces": { + "down": { "texture": "#bottom", "cullface": "down" }, + "up": { "texture": "#top" }, + "south": { "texture": "#inside" }, + "west": { "texture": "#inside" } + } + }, { + "from": [ 7, 0, 7 ], + "to": [ 8, 8, 8 ], + "faces": { + "down": { "texture": "#bottom", "cullface": "down" }, + "up": { "texture": "#top" }, + "south": { "texture": "#inside" }, + "west": { "texture": "#inside" }, + "east": { "texture": "#inside" } + } + }, { + "from": [ 4, 8, 1 ], + "to": [ 8, 8, 5 ], + "faces": { + "up": { "texture": "#top_2", "forge_data": { "color": "FFFFFFFF", "block_light": 15, "sky_light": 15 } } + } + }, { + "from": [ 2, 8, 1 ], + "to": [ 4, 8, 3 ], + "faces": { + "up": { "texture": "#top_2", "forge_data": { "color": "FFFFFFFF", "block_light": 15, "sky_light": 15 } } + } + }, + { "from": [ 6, 8, 5 ], + "to": [ 8, 8, 7 ], + "faces": { + "up": { "texture": "#top_2", "forge_data": { "color": "FFFFFFFF", "block_light": 15, "sky_light": 15 } } + } + }, + { "from": [ 1, 8, 1 ], + "to": [ 2, 8, 2 ], + "faces": { + "up": { "texture": "#top_2", "forge_data": { "color": "FFFFFFFF", "block_light": 15, "sky_light": 15 } } + } + }, + { "from": [ 3, 8, 3 ], + "to": [ 4, 8, 4 ], + "faces": { + "up": { "texture": "#top_2", "forge_data": { "color": "FFFFFFFF", "block_light": 15, "sky_light": 15 } } + } + }, + { "from": [ 5, 8, 5 ], + "to": [ 6, 8, 6 ], + "faces": { + "up": { "texture": "#top_2", "forge_data": { "color": "FFFFFFFF", "block_light": 15, "sky_light": 15 } } + } + }, + { "from": [ 7, 8, 7 ], + "to": [ 8, 8, 8 ], + "faces": { + "up": { "texture": "#top_2", "forge_data": { "color": "FFFFFFFF", "block_light": 15, "sky_light": 15 } } + } + } + ] +} diff --git a/src/main/resources/assets/twilightforest/models/block/experiment115_2_8.json b/src/main/resources/assets/twilightforest/models/block/experiment115_2_8.json new file mode 100755 index 0000000000..b934a8f774 --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/experiment115_2_8.json @@ -0,0 +1,32 @@ +{ + "parent": "block/block", + "render_type": "minecraft:cutout", + "textures": { + "particle": "#bottom", + "bottom": "twilightforest:block/experiment115/experiment115_bottom", + "inside": "twilightforest:block/experiment115/experiment115_inner", + "top": "twilightforest:block/experiment115/experiment115_top", + "top_2": "twilightforest:block/stone_twist/twist_blank", + "side": "twilightforest:block/experiment115/experiment115_side" + }, + "elements": [ + { + "from": [ 1, 0, 1 ], + "to": [ 8, 8, 8 ], + "faces": { + "down": { "texture": "#bottom", "cullface": "down" }, + "up": { "texture": "#top" }, + "north": { "texture": "#side" }, + "south": { "texture": "#inside" }, + "west": { "texture": "#side" }, + "east": { "texture": "#inside" } + } + }, { + "from": [ 1, 8, 1 ], + "to": [ 8, 8, 8 ], + "faces": { + "up": { "texture": "#top_2", "forge_data": { "color": "FFFFFFFF", "block_light": 15, "sky_light": 15 } } + } + } + ] +} diff --git a/src/main/resources/assets/twilightforest/models/block/experiment115_3_8.json b/src/main/resources/assets/twilightforest/models/block/experiment115_3_8.json new file mode 100755 index 0000000000..2940e0e775 --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/experiment115_3_8.json @@ -0,0 +1,124 @@ +{ + "parent": "block/block", + "render_type": "minecraft:cutout", + "textures": { + "particle": "#bottom", + "bottom": "twilightforest:block/experiment115/experiment115_bottom", + "inside": "twilightforest:block/experiment115/experiment115_inner", + "top": "twilightforest:block/experiment115/experiment115_top", + "top_2": "twilightforest:block/stone_twist/twist_blank", + "side": "twilightforest:block/experiment115/experiment115_side" + }, + "elements": [ + { "from": [ 1, 0, 1 ], + "to": [ 8, 8, 9 ], + "faces": { + "down": { "texture": "#bottom", "cullface": "down" }, + "up": { "texture": "#top" }, + "north": { "texture": "#side" }, + "south": { "texture": "#inside" }, + "west": { "texture": "#side" }, + "east": { "texture": "#inside" } + } + }, + { "from": [ 1, 0, 9 ], + "to": [ 5, 8, 12 ], + "faces": { + "down": { "texture": "#bottom", "cullface": "down" }, + "up": { "texture": "#top" }, + "south": { "texture": "#inside" }, + "west": { "texture": "#side" }, + "east": { "texture": "#inside" } + } + }, + { "from": [ 1, 0, 12 ], + "to": [ 3, 8, 14 ], + "faces": { + "down": { "texture": "#bottom", "cullface": "down" }, + "up": { "texture": "#top" }, + "south": { "texture": "#inside" }, + "west": { "texture": "#side" }, + "east": { "texture": "#inside" } + } + }, + { "from": [ 5, 0, 9 ], + "to": [ 7, 8, 10 ], + "faces": { + "down": { "texture": "#bottom", "cullface": "down" }, + "up": { "texture": "#top" }, + "south": { "texture": "#inside" }, + "east": { "texture": "#inside" } + } + }, + { "from": [ 1, 0, 14 ], + "to": [ 2, 8, 15 ], + "faces": { + "down": { "texture": "#bottom", "cullface": "down" }, + "up": { "texture": "#top" }, + "south": { "texture": "#inside" }, + "west": { "texture": "#side" }, + "east": { "texture": "#inside" } + } + }, + { "from": [ 3, 0, 12 ], + "to": [ 4, 8, 13 ], + "faces": { + "down": { "texture": "#bottom", "cullface": "down" }, + "up": { "texture": "#top" }, + "south": { "texture": "#inside" }, + "east": { "texture": "#inside" } + } + }, + { "from": [ 5, 0, 10 ], + "to": [ 6, 8, 11 ], + "faces": { + "down": { "texture": "#bottom", "cullface": "down" }, + "up": { "texture": "#top" }, + "south": { "texture": "#inside" }, + "east": { "texture": "#inside" } + } + }, + { "from": [ 1, 8, 1 ], + "to": [ 8, 8, 9 ], + "faces": { + "up": { "texture": "#top_2", "forge_data": { "color": "FFFFFFFF", "block_light": 15, "sky_light": 15 } } + } + }, + { "from": [ 1, 8, 9 ], + "to": [ 5, 8, 12 ], + "faces": { + "up": { "texture": "#top_2", "forge_data": { "color": "FFFFFFFF", "block_light": 15, "sky_light": 15 } } + } + }, + { "from": [ 1, 0, 12 ], + "to": [ 3, 8, 14 ], + "faces": { + "up": { "texture": "#top_2", "forge_data": { "color": "FFFFFFFF", "block_light": 15, "sky_light": 15 } } + } + }, + { "from": [ 5, 8, 9 ], + "to": [ 7, 8, 10 ], + "faces": { + "up": { "texture": "#top_2", "forge_data": { "color": "FFFFFFFF", "block_light": 15, "sky_light": 15 } } + } + }, + { "from": [ 1, 8, 14 ], + "to": [ 2, 8, 15 ], + "faces": { + "up": { "texture": "#top_2", "forge_data": { "color": "FFFFFFFF", "block_light": 15, "sky_light": 15 } } + } + }, + { "from": [ 3, 8, 12 ], + "to": [ 4, 8, 13 ], + "faces": { + "up": { "texture": "#top_2", "forge_data": { "color": "FFFFFFFF", "block_light": 15, "sky_light": 15 } } + } + }, + { "from": [ 5, 8, 10 ], + "to": [ 6, 8, 11 ], + "faces": { + "up": { "texture": "#top_2", "forge_data": { "color": "FFFFFFFF", "block_light": 15, "sky_light": 15 } } + } + } + ] +} diff --git a/src/main/resources/assets/twilightforest/models/block/experiment115_4_8.json b/src/main/resources/assets/twilightforest/models/block/experiment115_4_8.json new file mode 100755 index 0000000000..5e447fa4bb --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/experiment115_4_8.json @@ -0,0 +1,33 @@ +{ + "parent": "block/block", + "render_type": "minecraft:cutout", + "textures": { + "particle": "#bottom", + "bottom": "twilightforest:block/experiment115/experiment115_bottom", + "inside": "twilightforest:block/experiment115/experiment115_inner", + "top": "twilightforest:block/experiment115/experiment115_top", + "top_2": "twilightforest:block/stone_twist/twist_blank", + "side": "twilightforest:block/experiment115/experiment115_side" + }, + "elements": [ + { + "from": [ 1, 0, 1 ], + "to": [ 8, 8, 15 ], + "faces": { + "down": { "texture": "#bottom", "cullface": "down" }, + "up": { "texture": "#top" }, + "north": { "texture": "#side" }, + "south": { "texture": "#side" }, + "west": { "texture": "#side" }, + "east": { "texture": "#inside" } + } + }, + { + "from": [ 1, 8, 1 ], + "to": [ 8, 8, 15 ], + "faces": { + "up": { "texture": "#top_2", "forge_data": { "color": "FFFFFFFF", "block_light": 15, "sky_light": 15 } } + } + } + ] +} diff --git a/src/main/resources/assets/twilightforest/models/block/experiment115_5_8.json b/src/main/resources/assets/twilightforest/models/block/experiment115_5_8.json new file mode 100755 index 0000000000..dbfb8a5490 --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/experiment115_5_8.json @@ -0,0 +1,141 @@ +{ + "parent": "block/block", + "render_type": "minecraft:cutout", + "textures": { + "particle": "#bottom", + "bottom": "twilightforest:block/experiment115/experiment115_bottom", + "inside": "twilightforest:block/experiment115/experiment115_inner", + "top": "twilightforest:block/experiment115/experiment115_top", + "top_2": "twilightforest:block/stone_twist/twist_blank", + "side": "twilightforest:block/experiment115/experiment115_side" + }, + "elements": [ + { + "from": [ 1, 0, 1 ], + "to": [ 8, 8, 15 ], + "faces": { + "down": { "texture": "#bottom", "cullface": "down" }, + "up": { "texture": "#top" }, + "north": { "texture": "#side" }, + "south": { "texture": "#side" }, + "west": { "texture": "#side" }, + "east": { "texture": "#inside" } + } + }, { + "from": [ 8, 0, 11 ], + "to": [ 12, 8, 15 ], + "faces": { + "down": { "texture": "#bottom", "cullface": "down" }, + "up": { "texture": "#top" }, + "north": { "texture": "#inside" }, + "south": { "texture": "#side" }, + "east": { "texture": "#inside" } + } + }, { + "from": [ 12, 0, 13 ], + "to": [ 14, 8, 15 ], + "faces": { + "down": { "texture": "#bottom", "cullface": "down" }, + "up": { "texture": "#top" }, + "north": { "texture": "#inside" }, + "south": { "texture": "#side" }, + "east": { "texture": "#inside" } + } + }, { + "from": [ 8, 0, 9 ], + "to": [ 10, 8, 11 ], + "faces": { + "down": { "texture": "#bottom", "cullface": "down" }, + "up": { "texture": "#top" }, + "north": { "texture": "#inside" }, + "east": { "texture": "#inside" } + } + }, { + "from": [ 8, 0, 8 ], + "to": [ 9, 8, 9 ], + "faces": { + "down": { "texture": "#bottom", "cullface": "down" }, + "up": { "texture": "#top" }, + "north": { "texture": "#inside" }, + "east": { "texture": "#inside" } + } + }, { + "from": [ 10, 0, 10 ], + "to": [ 11, 8, 11 ], + "faces": { + "down": { "texture": "#bottom", "cullface": "down" }, + "up": { "texture": "#top" }, + "north": { "texture": "#inside" }, + "east": { "texture": "#inside" } + } + }, { + "from": [ 12, 0, 12 ], + "to": [ 13, 8, 13 ], + "faces": { + "down": { "texture": "#bottom", "cullface": "down" }, + "up": { "texture": "#top" }, + "north": { "texture": "#inside" }, + "east": { "texture": "#inside" } + } + }, { + "from": [ 14, 0, 14 ], + "to": [ 15, 8, 15 ], + "faces": { + "down": { "texture": "#bottom", "cullface": "down" }, + "up": { "texture": "#top" }, + "north": { "texture": "#inside" }, + "south": { "texture": "#side" }, + "east": { "texture": "#side" } + } + }, + { + "from": [ 1, 8, 1 ], + "to": [ 8, 8, 15 ], + "faces": { + "up": { "texture": "#top_2", "forge_data": { "color": "FFFFFFFF", "block_light": 15, "sky_light": 15 } } + } + }, { + "from": [ 8, 8, 11 ], + "to": [ 12, 8, 15 ], + "faces": { + "up": { "texture": "#top_2", "forge_data": { "color": "FFFFFFFF", "block_light": 15, "sky_light": 15 } } + } + }, { + "from": [ 12, 8, 13 ], + "to": [ 14, 8, 15 ], + "faces": { + "up": { "texture": "#top_2", "forge_data": { "color": "FFFFFFFF", "block_light": 15, "sky_light": 15 } } + } + }, { + "from": [ 8, 8, 9 ], + "to": [ 10, 8, 11 ], + "faces": { + "up": { "texture": "#top_2", "forge_data": { "color": "FFFFFFFF", "block_light": 15, "sky_light": 15 } } + } + }, { + "from": [ 8, 8, 8 ], + "to": [ 9, 8, 9 ], + "faces": { + "up": { "texture": "#top_2", "forge_data": { "color": "FFFFFFFF", "block_light": 15, "sky_light": 15 } } + } + }, { + "from": [ 10, 8, 10 ], + "to": [ 11, 8, 11 ], + "faces": { + "up": { "texture": "#top_2", "forge_data": { "color": "FFFFFFFF", "block_light": 15, "sky_light": 15 } } + } + }, { + "from": [ 12, 8, 12 ], + "to": [ 13, 8, 13 ], + "faces": { + "up": { "texture": "#top_2", "forge_data": { "color": "FFFFFFFF", "block_light": 15, "sky_light": 15 } } + } + }, { + "from": [ 14, 8, 14 ], + "to": [ 15, 8, 15 ], + "faces": { + "up": { "texture": "#top_2", "forge_data": { "color": "FFFFFFFF", "block_light": 15, "sky_light": 15 } } + } + } + ] +} diff --git a/src/main/resources/assets/twilightforest/models/block/experiment115_6_8.json b/src/main/resources/assets/twilightforest/models/block/experiment115_6_8.json new file mode 100755 index 0000000000..1817e29030 --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/experiment115_6_8.json @@ -0,0 +1,47 @@ +{ + "parent": "block/block", + "render_type": "minecraft:cutout", + "textures": { + "particle": "#bottom", + "bottom": "twilightforest:block/experiment115/experiment115_bottom", + "inside": "twilightforest:block/experiment115/experiment115_inner", + "top": "twilightforest:block/experiment115/experiment115_top", + "top_2": "twilightforest:block/stone_twist/twist_blank", + "side": "twilightforest:block/experiment115/experiment115_side" + }, + "elements": [ + { "from": [ 1, 0, 1 ], + "to": [ 8, 8, 15 ], + "faces": { + "down": { "texture": "#bottom", "cullface": "down" }, + "up": { "texture": "#top" }, + "north": { "texture": "#side" }, + "south": { "texture": "#side" }, + "west": { "texture": "#side" }, + "east": { "texture": "#inside" } + } + }, { + "from": [ 8, 0, 8 ], + "to": [ 15, 8, 15 ], + "faces": { + "down": { "texture": "#bottom", "cullface": "down" }, + "up": { "texture": "#top" }, + "north": { "texture": "#inside" }, + "south": { "texture": "#side" }, + "east": { "texture": "#side" } + } + }, { + "from": [ 1, 8, 1 ], + "to": [ 8, 8, 15 ], + "faces": { + "up": { "texture": "#top_2", "forge_data": { "color": "FFFFFFFF", "block_light": 15, "sky_light": 15 } } + } + }, { + "from": [ 8, 8, 8 ], + "to": [ 15, 8, 15 ], + "faces": { + "up": { "texture": "#top_2", "forge_data": { "color": "FFFFFFFF", "block_light": 15, "sky_light": 15 } } + } + } + ] +} diff --git a/src/main/resources/assets/twilightforest/models/block/experiment115_7_8.json b/src/main/resources/assets/twilightforest/models/block/experiment115_7_8.json new file mode 100755 index 0000000000..e7e532ce03 --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/experiment115_7_8.json @@ -0,0 +1,140 @@ +{ + "parent": "block/block", + "render_type": "minecraft:cutout", + "textures": { + "particle": "#bottom", + "bottom": "twilightforest:block/experiment115/experiment115_bottom", + "inside": "twilightforest:block/experiment115/experiment115_inner", + "top": "twilightforest:block/experiment115/experiment115_top", + "top_2": "twilightforest:block/stone_twist/twist_blank", + "side": "twilightforest:block/experiment115/experiment115_side" + }, + "elements": [ + { "from": [ 1, 0, 1 ], + "to": [ 8, 8, 15 ], + "faces": { + "down": { "texture": "#bottom", "cullface": "down" }, + "up": { "texture": "#top" }, + "north": { "texture": "#side" }, + "south": { "texture": "#side" }, + "west": { "texture": "#side" }, + "east": { "texture": "#inside" } + } + }, + { "from": [ 8, 0, 7 ], + "to": [ 15, 8, 15 ], + "faces": { + "down": { "texture": "#bottom", "cullface": "down" }, + "up": { "texture": "#top" }, + "north": { "texture": "#inside" }, + "south": { "texture": "#side" }, + "east": { "texture": "#side" } + } + }, + { "from": [ 11, 0, 4 ], + "to": [ 15, 8, 7 ], + "faces": { + "down": { "texture": "#bottom", "cullface": "down" }, + "up": { "texture": "#top" }, + "north": { "texture": "#inside" }, + "west": { "texture": "#inside" }, + "east": { "texture": "#side" } + } + }, + { "from": [ 9, 0, 6 ], + "to": [ 11, 8, 7 ], + "faces": { + "down": { "texture": "#bottom", "cullface": "down" }, + "up": { "texture": "#top" }, + "north": { "texture": "#inside" }, + "west": { "texture": "#inside" } + } + }, + { "from": [ 13, 0, 2 ], + "to": [ 15, 8, 4 ], + "faces": { + "down": { "texture": "#bottom", "cullface": "down" }, + "up": { "texture": "#top" }, + "north": { "texture": "#inside" }, + "west": { "texture": "#inside" }, + "east": { "texture": "#side" } + } + }, + { "from": [ 10, 0, 5 ], + "to": [ 11, 8, 6 ], + "faces": { + "down": { "texture": "#bottom", "cullface": "down" }, + "up": { "texture": "#top" }, + "north": { "texture": "#inside" }, + "west": { "texture": "#inside" } + } + }, + { "from": [ 12, 0, 3 ], + "to": [ 13, 8, 4 ], + "faces": { + "down": { "texture": "#bottom", "cullface": "down" }, + "up": { "texture": "#top" }, + "north": { "texture": "#inside" }, + "west": { "texture": "#inside" } + } + }, { + "from": [ 14, 0, 1 ], + "to": [ 15, 8, 2 ], + "faces": { + "down": { "texture": "#bottom", "cullface": "down" }, + "up": { "texture": "#top" }, + "north": { "texture": "#side" }, + "west": { "texture": "#inside" }, + "east": { "texture": "#side" } + } + }, + { "from": [ 1, 8, 1 ], + "to": [ 8, 8, 15 ], + "faces": { + "up": { "texture": "#top_2", "forge_data": { "color": "FFFFFFFF", "block_light": 15, "sky_light": 15 } } + } + }, + { "from": [ 8, 8, 7 ], + "to": [ 15, 8, 15 ], + "faces": { + "up": { "texture": "#top_2", "forge_data": { "color": "FFFFFFFF", "block_light": 15, "sky_light": 15 } } + } + }, + { "from": [ 11, 8, 4 ], + "to": [ 15, 8, 7 ], + "faces": { + "up": { "texture": "#top_2", "forge_data": { "color": "FFFFFFFF", "block_light": 15, "sky_light": 15 } } + } + }, + { "from": [ 9, 8, 6 ], + "to": [ 11, 8, 7 ], + "faces": { + "up": { "texture": "#top_2", "forge_data": { "color": "FFFFFFFF", "block_light": 15, "sky_light": 15 } } + } + }, + { "from": [ 13, 8, 2 ], + "to": [ 15, 8, 4 ], + "faces": { + "up": { "texture": "#top_2", "forge_data": { "color": "FFFFFFFF", "block_light": 15, "sky_light": 15 } } + } + }, + { "from": [ 10, 8, 5 ], + "to": [ 11, 8, 6 ], + "faces": { + "up": { "texture": "#top_2", "forge_data": { "color": "FFFFFFFF", "block_light": 15, "sky_light": 15 } } + } + }, + { "from": [ 12, 8, 3 ], + "to": [ 13, 8, 4 ], + "faces": { + "up": { "texture": "#top_2", "forge_data": { "color": "FFFFFFFF", "block_light": 15, "sky_light": 15 } } + } + }, { + "from": [ 14, 8, 1 ], + "to": [ 15, 8, 2 ], + "faces": { + "up": { "texture": "#top_2", "forge_data": { "color": "FFFFFFFF", "block_light": 15, "sky_light": 15 } } + } + } + ] +} diff --git a/src/main/resources/assets/twilightforest/models/block/experiment115_8_8.json b/src/main/resources/assets/twilightforest/models/block/experiment115_8_8.json new file mode 100755 index 0000000000..8856d21e75 --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/experiment115_8_8.json @@ -0,0 +1,37 @@ +{ + "parent": "block/block", + "render_type": "minecraft:cutout", + "textures": { + "particle": "#bottom", + "bottom": "twilightforest:block/experiment115/experiment115_bottom", + "top": "twilightforest:block/experiment115/experiment115_top", + "top_2": "twilightforest:block/stone_twist/twist_blank", + "side": "twilightforest:block/experiment115/experiment115_side" + }, + "elements": [ + { + "from": [ 1, 0, 1 ], + "to": [ 15, 8, 15 ], + "faces": { + "down": { "texture": "#bottom", "cullface": "down" }, + "up": { "texture": "#top" }, + "north": { "texture": "#side" }, + "south": { "texture": "#side" }, + "west": { "texture": "#side" }, + "east": { "texture": "#side" } + } + }, { + "from": [ 1, 8, 1 ], + "to": [ 15, 8, 15 ], + "faces": { + "up": { "texture": "#top_2", "forge_data": { "color": "FFFFFFFF", "block_light": 15, "sky_light": 15 } } + } + }, { + "from": [ 1, 8, 1 ], + "to": [ 15, 8.02, 15 ], + "faces": { + "up": { "texture": "#top_2", "forge_data": { "color": "FFFFFFFF", "block_light": 15, "sky_light": 15 } } + } + } + ] +} diff --git a/src/main/resources/assets/twilightforest/models/block/fallen_leaves.json b/src/main/resources/assets/twilightforest/models/block/fallen_leaves.json new file mode 100644 index 0000000000..a501481113 --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/fallen_leaves.json @@ -0,0 +1,18 @@ +{ + "parent": "block/thin_block", + "render_type": "minecraft:cutout", + "textures": { + "particle": "#texture", + "texture": "block/oak_leaves" + }, + "elements": [ + { + "from": [ 0, 0, 0 ], + "to": [ 16, 0.2, 16 ], + "faces": { + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "tintindex": 0 }, + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#texture", "tintindex": 0 } + } + } + ] +} diff --git a/src/main/resources/assets/twilightforest/models/block/fiery_block.json b/src/main/resources/assets/twilightforest/models/block/fiery_block.json new file mode 100644 index 0000000000..b6d20a3ef4 --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/fiery_block.json @@ -0,0 +1,62 @@ +{ + "ambientocclusion": false, + "textures": { + "all": "twilightforest:block/fiery_block_inner", + "over": "twilightforest:block/fiery_pattern", + "particle": "twilightforest:block/fiery_block" + }, + "elements": [ + { + "from": [1, 1, 1], + "to": [15, 15, 15], + "shade": false, + "faces": { + "north": {"uv": [1, 1, 15, 15], "forge_data": { "color": "FFFFFFFF", "block_light": 15, "sky_light": 15 }, "texture": "#all", "tintindex": 0}, + "east": {"uv": [1, 1, 15, 15], "forge_data": { "color": "FFFFFFFF", "block_light": 15, "sky_light": 15 }, "texture": "#all", "tintindex": 0}, + "south": {"uv": [1, 1, 15, 15], "forge_data": { "color": "FFFFFFFF", "block_light": 15, "sky_light": 15 }, "texture": "#all", "tintindex": 0}, + "west": {"uv": [1, 1, 15, 15], "forge_data": { "color": "FFFFFFFF", "block_light": 15, "sky_light": 15 }, "texture": "#all", "tintindex": 0}, + "up": {"uv": [1, 1, 15, 15], "forge_data": { "color": "FFFFFFFF", "block_light": 15, "sky_light": 15 }, "texture": "#all", "tintindex": 0}, + "down": {"uv": [1, 1, 15, 15], "forge_data": { "color": "FFFFFFFF", "block_light": 15, "sky_light": 15 }, "texture": "#all", "tintindex": 0} + } + }, + { + "from": [15.99, 15.99, 15.99], + "to": [0.01, 0.01, 0.01], + "shade": false, + "faces": { + "north": {"uv": [15.99, 15.99, 0.01, 0.01], "forge_data": { "color": "FFFFFFFF", "block_light": 15, "sky_light": 15 }, "texture": "#over", "cullface": "south", "tintindex": 1}, + "east": {"uv": [15.99, 15.99, 0.01, 0.01], "forge_data": { "color": "FFFFFFFF", "block_light": 15, "sky_light": 15 }, "texture": "#over", "cullface": "west", "tintindex": 1}, + "south": {"uv": [15.99, 15.99, 0.01, 0.01], "forge_data": { "color": "FFFFFFFF", "block_light": 15, "sky_light": 15 }, "texture": "#over", "cullface": "north", "tintindex": 1}, + "west": {"uv": [15.99, 15.99, 0.01, 0.01], "forge_data": { "color": "FFFFFFFF", "block_light": 15, "sky_light": 15 }, "texture": "#over", "cullface": "east", "tintindex": 1}, + "up": {"uv": [15.99, 15.99, 0.01, 0.01], "forge_data": { "color": "FFFFFFFF", "block_light": 15, "sky_light": 15 }, "texture": "#over", "cullface": "down", "tintindex": 1}, + "down": {"uv": [15.99, 15.99, 0.01, 0.01], "forge_data": { "color": "FFFFFFFF", "block_light": 15, "sky_light": 15 }, "texture": "#over", "cullface": "up", "tintindex": 1} + } + } + ], + "display": { + "thirdperson_righthand": { + "rotation": [75, 45, 0], + "translation": [0, 2.5, 0], + "scale": [0.375, 0.375, 0.375] + }, + "firstperson_righthand": { + "rotation": [0, 45, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "scale": [0.4, 0.4, 0.4] + }, + "ground": { + "translation": [0, 3, 0], + "scale": [0.25, 0.25, 0.25] + }, + "gui": { + "rotation": [30, 225, 0], + "scale": [0.625, 0.625, 0.625] + }, + "fixed": { + "scale": [0.5, 0.5, 0.5] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/models/block/firefly_particle_spawner.json b/src/main/resources/assets/twilightforest/models/block/firefly_particle_spawner.json new file mode 100644 index 0000000000..ee1c71ef2c --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/firefly_particle_spawner.json @@ -0,0 +1,112 @@ +{ + "parent": "block/block", + "render_type": "minecraft:cutout", + "textures": { + "side": "twilightforest:block/jar_side", + "top": "twilightforest:block/jar_top", + "bottom": "twilightforest:block/jar_bottom", + "dirt": "block/composter_compost", + "poppy": "block/poppy", + "particle": "#side" + }, + "elements": [ + { + "from": [3, 0, 3], + "to": [13, 14, 13], + "faces": { + "north": {"uv": [3, 2, 13, 16], "texture": "#side"}, + "east": {"uv": [3, 2, 13, 16], "texture": "#side"}, + "south": {"uv": [3, 2, 13, 16], "texture": "#side"}, + "west": {"uv": [3, 2, 13, 16], "texture": "#side"}, + "up": {"uv": [3, 3, 13, 13], "texture": "#top"}, + "down": {"uv": [3, 3, 13, 13], "texture": "#bottom"} + } + }, + { + "from": [4, 0.01, 4], + "to": [12, 2, 12], + "faces": { + "north": {"uv": [4, 12, 12, 14], "texture": "#dirt"}, + "east": {"uv": [11, 5, 13, 13], "rotation": 90, "texture": "#dirt"}, + "south": {"uv": [4, 3, 12, 5], "rotation": 180, "texture": "#dirt"}, + "west": {"uv": [3, 5, 5, 13], "rotation": 270, "texture": "#dirt"}, + "up": {"uv": [4, 5, 12, 13], "texture": "#dirt"}, + "down": {"uv": [4, 5, 12, 13], "texture": "#dirt"} + } + }, + { + "from": [1, 2, 6], + "to": [17, 18, 6], + "rotation": {"angle": 45, "axis": "y", "origin": [8, 1, 8]}, + "faces": { + "north": {"uv": [0, 0, 16, 16], "texture": "#poppy"}, + "east": {"uv": [0, 0, 1, 1], "texture": "#poppy"}, + "south": {"uv": [0, 0, 16, 16], "texture": "#poppy"}, + "west": {"uv": [0, 0, 1, 1], "texture": "#poppy"}, + "up": {"uv": [0, 0, 1, 1], "texture": "#poppy"}, + "down": {"uv": [0, 0, 1, 1], "texture": "#poppy"} + } + }, + { + "from": [9, 2, -2], + "to": [9, 18, 14], + "rotation": {"angle": 45, "axis": "y", "origin": [8, 1, 8]}, + "faces": { + "north": {"uv": [0, 0, 1, 1], "texture": "#poppy"}, + "east": {"uv": [0, 0, 16, 16], "texture": "#poppy"}, + "south": {"uv": [0, 0, 1, 1], "texture": "#poppy"}, + "west": {"uv": [0, 0, 16, 16], "texture": "#poppy"}, + "up": {"uv": [0, 0, 1, 1], "rotation": 90, "texture": "#poppy"}, + "down": {"uv": [0, 0, 1, 1], "texture": "#poppy"} + } + }, + { + "from": [4, 13, 3], + "to": [12, 14, 4], + "faces": { + "north": {"uv": [0, 0, 1, 1], "texture": "#top"}, + "east": {"uv": [0, 0, 1, 1], "texture": "#top"}, + "south": {"uv": [4, 3, 12, 4], "texture": "#top"}, + "west": {"uv": [0, 0, 1, 1], "texture": "#top"}, + "up": {"uv": [0, 0, 1, 1], "texture": "#top"}, + "down": {"uv": [0, 0, 1, 1], "texture": "#top"} + } + }, + { + "from": [4, 13, 12], + "to": [12, 14, 13], + "faces": { + "north": {"uv": [4, 12, 12, 13], "rotation": 180, "texture": "#top"}, + "east": {"uv": [0, 0, 1, 1], "texture": "#top"}, + "south": {"uv": [0, 0, 1, 1], "texture": "#top"}, + "west": {"uv": [0, 0, 1, 1], "texture": "#top"}, + "up": {"uv": [0, 0, 1, 1], "texture": "#top"}, + "down": {"uv": [0, 0, 1, 1], "texture": "#top"} + } + }, + { + "from": [12, 13, 4], + "to": [13, 14, 12], + "faces": { + "north": {"uv": [0, 0, 1, 1], "texture": "#top"}, + "east": {"uv": [0, 0, 1, 1], "texture": "#top"}, + "south": {"uv": [0, 0, 1, 1], "texture": "#top"}, + "west": {"uv": [12, 4, 13, 12], "rotation": 270, "texture": "#top"}, + "up": {"uv": [0, 0, 1, 1], "texture": "#top"}, + "down": {"uv": [0, 0, 1, 1], "texture": "#top"} + } + }, + { + "from": [3, 13, 4], + "to": [4, 14, 12], + "faces": { + "north": {"uv": [0, 0, 1, 1], "texture": "#top"}, + "east": {"uv": [3, 4, 4, 12], "rotation": 90, "texture": "#top"}, + "south": {"uv": [0, 0, 1, 1], "texture": "#top"}, + "west": {"uv": [0, 0, 1, 1], "texture": "#top"}, + "up": {"uv": [0, 0, 1, 1], "texture": "#top"}, + "down": {"uv": [0, 0, 1, 1], "texture": "#top"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/models/block/huge_lily_pad.json b/src/main/resources/assets/twilightforest/models/block/huge_lily_pad.json new file mode 100644 index 0000000000..af80f1da53 --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/huge_lily_pad.json @@ -0,0 +1,17 @@ +{ + "ambientocclusion": false, + "render_type": "minecraft:cutout", + "textures": { + "particle": "twilightforest:block/huge_lily_pad", + "texture": "twilightforest:block/huge_lily_pad" + }, + "elements": [ + { "from": [ 0, 0.25, 0 ], + "to": [ 16, 0.25, 16 ], + "faces": { + "down": { "uv": [ 16, 16, 0, 0 ], "texture": "#texture", "tintindex": 0 }, + "up": { "uv": [ 16, 0, 0, 16 ], "texture": "#texture", "tintindex": 0 } + } + } + ] +} diff --git a/src/main/resources/assets/twilightforest/models/block/iron_ladder_left.json b/src/main/resources/assets/twilightforest/models/block/iron_ladder_left.json new file mode 100644 index 0000000000..60597d472e --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/iron_ladder_left.json @@ -0,0 +1,97 @@ +{ + "ambientocclusion": false, + "textures": { + "particle": "twilightforest:block/ladder_iron" + }, + "elements": [ + { + "from": [ 1, 13, 15.2 ], + "to" : [ 8, 15, 16 ], + "faces": { + "up" : { "uv": [ 8 , 0 , 1 , 0.8 ], "texture": "#particle" }, + "down" : { "uv": [ 8 , 1.2, 1 , 2 ], "texture": "#particle" }, + "north": { "uv": [ 1 , 0 , 8 , 2 ], "texture": "#particle" }, + "south": { "uv": [ 8 , 0 , 1 , 2 ], "texture": "#particle", "cullface": "south" }, + "west" : { "uv": [ 14.2, 0 , 15 , 2 ], "texture": "#particle" } + } + }, { + "from": [ 1, 9, 15.2 ], + "to" : [ 8, 11, 16 ], + "faces": { + "up" : { "uv": [ 8 , 4 , 1 , 4.8 ], "texture": "#particle" }, + "down" : { "uv": [ 8 , 5.2, 1 , 6 ], "texture": "#particle" }, + "north": { "uv": [ 1 , 4 , 8 , 6 ], "texture": "#particle" }, + "south": { "uv": [ 8 , 4 , 1 , 6 ], "texture": "#particle", "cullface": "south" }, + "west" : { "uv": [ 14.2, 4 , 15 , 6 ], "texture": "#particle" } + } + }, { + "from": [ 1, 5, 15.2 ], + "to" : [ 8, 7, 16 ], + "faces": { + "up" : { "uv": [ 8 , 8 , 1 , 8.8 ], "texture": "#particle" }, + "down" : { "uv": [ 8 , 9.2, 1 , 10 ], "texture": "#particle" }, + "north": { "uv": [ 1 , 8 , 8 , 10 ], "texture": "#particle" }, + "south": { "uv": [ 8 , 8 , 1 , 10 ], "texture": "#particle", "cullface": "south" }, + "west" : { "uv": [ 14.2, 8 , 15 , 10 ], "texture": "#particle" } + } + }, { + "from": [ 1, 1, 15.2 ], + "to" : [ 8, 3, 16 ], + "faces": { + "up" : { "uv": [ 8 , 12 , 1 , 12.8 ], "texture": "#particle" }, + "down" : { "uv": [ 8 , 13.2, 1 , 14 ], "texture": "#particle" }, + "north": { "uv": [ 1 , 12 , 8 , 14 ], "texture": "#particle" }, + "south": { "uv": [ 8 , 12 , 1 , 14 ], "texture": "#particle", "cullface": "south" }, + "west" : { "uv": [ 14.2, 12 , 15 , 14 ], "texture": "#particle" } + } + }, { + "from": [ 2, 0.5, 14 ], + "to" : [ 4, 2.5, 16 ], + "faces": { + "up" : { "uv": [ 4, 14, 2, 16 ], "texture": "#particle" }, + "down" : { "uv": [ 2, 14, 4, 16 ], "texture": "#particle" }, + "north": { "uv": [ 2, 14, 4, 16 ], "texture": "#particle" }, + "south": { "uv": [ 2, 16, 4, 14 ], "texture": "#particle", "cullface": "south" }, + "east" : { "uv": [ 4, 14, 2, 16 ], "texture": "#particle" }, + "west" : { "uv": [ 4, 16, 2, 14 ], "texture": "#particle" } + }, + "rotation": { "origin": [ 8, 2.5, 16 ], "axis": "x", "angle": -22.5 } + }, { + "from": [ 2, 4.5, 14 ], + "to" : [ 4, 6.5, 16 ], + "faces": { + "up" : { "uv": [ 4, 10, 2, 12 ], "texture": "#particle" }, + "down" : { "uv": [ 2, 10, 4, 12 ], "texture": "#particle" }, + "north": { "uv": [ 2, 10, 4, 12 ], "texture": "#particle" }, + "south": { "uv": [ 2, 12, 4, 10 ], "texture": "#particle", "cullface": "south" }, + "east" : { "uv": [ 4, 10, 2, 12 ], "texture": "#particle" }, + "west" : { "uv": [ 4, 12, 2, 10 ], "texture": "#particle" } + }, + "rotation": { "origin": [ 8, 6.5, 16 ], "axis": "x", "angle": -22.5 } + }, { + "from": [ 2, 8.5, 14 ], + "to" : [ 4, 10.5, 16 ], + "faces": { + "up" : { "uv": [ 4, 6, 2, 8 ], "texture": "#particle" }, + "down" : { "uv": [ 2, 6, 4, 8 ], "texture": "#particle" }, + "north": { "uv": [ 2, 6, 4, 8 ], "texture": "#particle" }, + "south": { "uv": [ 2, 8, 4, 6 ], "texture": "#particle", "cullface": "south" }, + "east" : { "uv": [ 4, 6, 2, 8 ], "texture": "#particle" }, + "west" : { "uv": [ 4, 8, 2, 6 ], "texture": "#particle" } + }, + "rotation": { "origin": [ 8, 10.5, 16 ], "axis": "x", "angle": -22.5 } + }, { + "from": [ 2, 12.5, 14 ], + "to" : [ 4, 14.5, 16 ], + "faces": { + "up" : { "uv": [ 4, 2, 2, 4 ], "texture": "#particle" }, + "down" : { "uv": [ 2, 2, 4, 4 ], "texture": "#particle" }, + "north": { "uv": [ 2, 2, 4, 4 ], "texture": "#particle" }, + "south": { "uv": [ 2, 4, 4, 2 ], "texture": "#particle", "cullface": "south" }, + "east" : { "uv": [ 4, 2, 2, 4 ], "texture": "#particle" }, + "west" : { "uv": [ 4, 4, 2, 2 ], "texture": "#particle" } + }, + "rotation": { "origin": [ 8, 14.5, 16 ], "axis": "x", "angle": -22.5 } + } + ] +} diff --git a/src/main/resources/assets/twilightforest/models/block/iron_ladder_left_connection.json b/src/main/resources/assets/twilightforest/models/block/iron_ladder_left_connection.json new file mode 100644 index 0000000000..37ea83f196 --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/iron_ladder_left_connection.json @@ -0,0 +1,45 @@ +{ + "ambientocclusion": false, + "textures": { + "particle": "twilightforest:block/ladder_iron" + }, + "elements": [ + { + "from": [ 0, 13, 15.2 ], + "to" : [ 8, 15, 16 ], + "faces": { + "up" : { "uv": [ 8, 0 , 0, 0.8 ], "texture": "#particle" }, + "down" : { "uv": [ 8, 1.2, 0, 2 ], "texture": "#particle" }, + "north": { "uv": [ 0, 0 , 8, 2 ], "texture": "#particle" }, + "south": { "uv": [ 8, 0 , 0, 2 ], "texture": "#particle", "cullface": "south" } + } + }, { + "from": [ 0, 9, 15.2 ], + "to" : [ 8, 11, 16 ], + "faces": { + "up" : { "uv": [ 8, 4 , 0, 4.8 ], "texture": "#particle" }, + "down" : { "uv": [ 8, 5.2, 0, 6 ], "texture": "#particle" }, + "north": { "uv": [ 0, 4 , 8, 6 ], "texture": "#particle" }, + "south": { "uv": [ 8, 4 , 0, 6 ], "texture": "#particle", "cullface": "south" } + } + }, { + "from": [ 0, 5, 15.2 ], + "to" : [ 8, 7, 16 ], + "faces": { + "up" : { "uv": [ 8, 8 , 0, 8.8 ], "texture": "#particle" }, + "down" : { "uv": [ 8, 9.2, 0, 10 ], "texture": "#particle" }, + "north": { "uv": [ 0, 8 , 8, 10 ], "texture": "#particle" }, + "south": { "uv": [ 8, 8 , 0, 10 ], "texture": "#particle", "cullface": "south" } + } + }, { + "from": [ 0, 1, 15.2 ], + "to" : [ 8, 3, 16 ], + "faces": { + "up" : { "uv": [ 8, 12 , 0, 12.8 ], "texture": "#particle" }, + "down" : { "uv": [ 8, 13.2, 0, 14 ], "texture": "#particle" }, + "north": { "uv": [ 0, 12 , 8, 14 ], "texture": "#particle" }, + "south": { "uv": [ 8, 12 , 0, 14 ], "texture": "#particle", "cullface": "south" } + } + } + ] +} diff --git a/src/main/resources/assets/twilightforest/models/block/iron_ladder_right.json b/src/main/resources/assets/twilightforest/models/block/iron_ladder_right.json new file mode 100644 index 0000000000..dcbbb0d6dc --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/iron_ladder_right.json @@ -0,0 +1,97 @@ +{ + "ambientocclusion": false, + "textures": { + "particle": "twilightforest:block/ladder_iron" + }, + "elements": [ + { + "from": [ 8, 13, 15.2 ], + "to" : [ 15, 15, 16 ], + "faces": { + "up" : { "uv": [ 15 , 0 , 8 , 0.8 ], "texture": "#particle" }, + "down" : { "uv": [ 15 , 1.2, 8 , 2 ], "texture": "#particle" }, + "north": { "uv": [ 8 , 0 , 15 , 2 ], "texture": "#particle" }, + "south": { "uv": [ 15 , 0 , 8 , 2 ], "texture": "#particle", "cullface": "south" }, + "east" : { "uv": [ 1 , 0 , 1.8, 2 ], "texture": "#particle" } + } + }, { + "from": [ 8, 9, 15.2 ], + "to" : [ 15, 11, 16 ], + "faces": { + "up" : { "uv": [ 15 , 4 , 8 , 4.8 ], "texture": "#particle" }, + "down" : { "uv": [ 15 , 5.2, 8 , 6 ], "texture": "#particle" }, + "north": { "uv": [ 8 , 4 , 15 , 6 ], "texture": "#particle" }, + "south": { "uv": [ 15 , 4 , 8 , 6 ], "texture": "#particle", "cullface": "south" }, + "east" : { "uv": [ 0 , 4 , 0.8, 6 ], "texture": "#particle" } + } + }, { + "from": [ 8, 5, 15.2 ], + "to" : [ 15, 7, 16 ], + "faces": { + "up" : { "uv": [ 15 , 8 , 8 , 8.8 ], "texture": "#particle" }, + "down" : { "uv": [ 15 , 9.2, 8 , 10 ], "texture": "#particle" }, + "north": { "uv": [ 8 , 8 , 15 , 10 ], "texture": "#particle" }, + "south": { "uv": [ 15 , 8 , 8 , 10 ], "texture": "#particle", "cullface": "south" }, + "east" : { "uv": [ 0 , 8 , 0.8, 10 ], "texture": "#particle" } + } + }, { + "from": [ 8, 1, 15.2 ], + "to" : [ 15, 3, 16 ], + "faces": { + "up" : { "uv": [ 15 , 12 , 8 , 12.8 ], "texture": "#particle" }, + "down" : { "uv": [ 15 , 13.2, 8 , 14 ], "texture": "#particle" }, + "north": { "uv": [ 8 , 12 , 15 , 14 ], "texture": "#particle" }, + "south": { "uv": [ 15 , 12 , 8 , 14 ], "texture": "#particle", "cullface": "south" }, + "east" : { "uv": [ 0 , 12 , 0.8, 14 ], "texture": "#particle" } + } + }, { + "from": [ 12, 0.5, 14 ], + "to" : [ 14, 2.5, 16 ], + "faces": { + "up" : { "uv": [ 14, 14, 12, 16 ], "texture": "#particle" }, + "down" : { "uv": [ 12, 14, 14, 16 ], "texture": "#particle" }, + "north": { "uv": [ 12, 14, 14, 16 ], "texture": "#particle" }, + "south": { "uv": [ 12, 16, 14, 14 ], "texture": "#particle", "cullface": "south" }, + "east" : { "uv": [ 14, 14, 12, 16 ], "texture": "#particle" }, + "west" : { "uv": [ 14, 16, 12, 14 ], "texture": "#particle" } + }, + "rotation": { "origin": [ 8, 2.5, 16 ], "axis": "x", "angle": -22.5 } + }, { + "from": [ 12, 4.5, 14 ], + "to" : [ 14, 6.5, 16 ], + "faces": { + "up" : { "uv": [ 14, 10, 12, 12 ], "texture": "#particle" }, + "down" : { "uv": [ 12, 10, 14, 12 ], "texture": "#particle" }, + "north": { "uv": [ 12, 10, 14, 12 ], "texture": "#particle" }, + "south": { "uv": [ 12, 12, 14, 10 ], "texture": "#particle", "cullface": "south" }, + "east" : { "uv": [ 14, 10, 12, 12 ], "texture": "#particle" }, + "west" : { "uv": [ 14, 12, 12, 10 ], "texture": "#particle" } + }, + "rotation": { "origin": [ 8, 6.5, 16 ], "axis": "x", "angle": -22.5 } + }, { + "from": [ 12, 8.5, 14 ], + "to" : [ 14, 10.5, 16 ], + "faces": { + "up" : { "uv": [ 14, 6, 12, 8 ], "texture": "#particle" }, + "down" : { "uv": [ 12, 6, 14, 8 ], "texture": "#particle" }, + "north": { "uv": [ 12, 6, 14, 8 ], "texture": "#particle" }, + "south": { "uv": [ 12, 8, 14, 6 ], "texture": "#particle", "cullface": "south" }, + "east" : { "uv": [ 14, 6, 12, 8 ], "texture": "#particle" }, + "west" : { "uv": [ 14, 8, 12, 6 ], "texture": "#particle" } + }, + "rotation": { "origin": [ 8, 10.5, 16 ], "axis": "x", "angle": -22.5 } + }, { + "from": [ 12, 12.5, 14 ], + "to" : [ 14, 14.5, 16 ], + "faces": { + "up" : { "uv": [ 14, 2, 12, 4 ], "texture": "#particle" }, + "down" : { "uv": [ 12, 2, 14, 4 ], "texture": "#particle" }, + "north": { "uv": [ 12, 2, 14, 4 ], "texture": "#particle" }, + "south": { "uv": [ 12, 4, 14, 2 ], "texture": "#particle", "cullface": "south" }, + "east" : { "uv": [ 14, 2, 12, 4 ], "texture": "#particle" }, + "west" : { "uv": [ 14, 4, 12, 2 ], "texture": "#particle" } + }, + "rotation": { "origin": [ 8, 14.5, 16 ], "axis": "x", "angle": -22.5 } + } + ] +} diff --git a/src/main/resources/assets/twilightforest/models/block/iron_ladder_right_connection.json b/src/main/resources/assets/twilightforest/models/block/iron_ladder_right_connection.json new file mode 100644 index 0000000000..f6fdab4429 --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/iron_ladder_right_connection.json @@ -0,0 +1,45 @@ +{ + "ambientocclusion": false, + "textures": { + "particle": "twilightforest:block/ladder_iron" + }, + "elements": [ + { + "from": [ 8, 13, 15.2 ], + "to" : [ 16, 15, 16 ], + "faces": { + "up" : { "uv": [ 16 , 0 , 8 , 0.8 ], "texture": "#particle" }, + "down" : { "uv": [ 16 , 1.2, 8 , 2 ], "texture": "#particle" }, + "north": { "uv": [ 8 , 0 , 16 , 2 ], "texture": "#particle" }, + "south": { "uv": [ 16 , 0 , 8 , 2 ], "texture": "#particle", "cullface": "south" } + } + }, { + "from": [ 8, 9, 15.2 ], + "to" : [ 16, 11, 16 ], + "faces": { + "up" : { "uv": [ 16 , 4 , 8 , 4.8 ], "texture": "#particle" }, + "down" : { "uv": [ 16 , 5.2, 8 , 6 ], "texture": "#particle" }, + "north": { "uv": [ 8 , 4 , 16 , 6 ], "texture": "#particle" }, + "south": { "uv": [ 16 , 4 , 8 , 6 ], "texture": "#particle", "cullface": "south" } + } + }, { + "from": [ 8, 5, 15.2 ], + "to" : [ 16, 7, 16 ], + "faces": { + "up" : { "uv": [ 16 , 8 , 8 , 8.8 ], "texture": "#particle" }, + "down" : { "uv": [ 16 , 9.2, 8 , 10 ], "texture": "#particle" }, + "north": { "uv": [ 8 , 8 , 16 , 10 ], "texture": "#particle" }, + "south": { "uv": [ 16 , 8 , 8 , 10 ], "texture": "#particle", "cullface": "south" } + } + }, { + "from": [ 8, 1, 15.2 ], + "to" : [ 16, 3, 16 ], + "faces": { + "up" : { "uv": [ 16 , 12 , 8 , 12.8 ], "texture": "#particle" }, + "down" : { "uv": [ 16 , 13.2, 8 , 14 ], "texture": "#particle" }, + "north": { "uv": [ 8 , 12 , 16 , 14 ], "texture": "#particle" }, + "south": { "uv": [ 16 , 12 , 8 , 14 ], "texture": "#particle", "cullface": "south" } + } + } + ] +} diff --git a/src/main/resources/assets/twilightforest/models/block/knightmetal_block.json b/src/main/resources/assets/twilightforest/models/block/knightmetal_block.json new file mode 100755 index 0000000000..531b9ca95c --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/knightmetal_block.json @@ -0,0 +1,301 @@ +{ + "parent": "block/block", + "textures": { + "particle": "twilightforest:block/knightmetal_block", + "all": "twilightforest:block/knightmetal_block" + }, + "elements": [ + { + "from": [ 0, 0, 0 ], + "to": [ 4, 4, 4 ], + "faces": { + "down": { "uv": [ 0, 12, 4, 16 ], "texture": "#all", "cullface": "down" }, + "up": { "uv": [ 0, 0, 4, 4 ], "texture": "#all" }, + "north": { "uv": [ 12, 12, 16, 16 ], "texture": "#all", "cullface": "north" }, + "south": { "uv": [ 0, 12, 4, 16 ], "texture": "#all" }, + "west": { "uv": [ 0, 12, 4, 16 ], "texture": "#all", "cullface": "west" }, + "east": { "uv": [ 12, 12, 16, 16 ], "texture": "#all" } + } + }, { + "from": [ 6, 0, 0 ], + "to": [ 10, 4, 4 ], + "faces": { + "down": { "uv": [ 6, 12, 10, 16 ], "texture": "#all", "cullface": "down" }, + "up": { "uv": [ 6, 0, 10, 4 ], "texture": "#all" }, + "north": { "uv": [ 6, 12, 10, 16 ], "texture": "#all", "cullface": "north" }, + "south": { "uv": [ 6, 12, 10, 16 ], "texture": "#all" }, + "west": { "uv": [ 0, 12, 4, 16 ], "texture": "#all" }, + "east": { "uv": [ 12, 12, 16, 16 ], "texture": "#all" } + } + }, { + "from": [ 12, 0, 0 ], + "to": [ 16, 4, 4 ], + "faces": { + "down": { "uv": [ 12, 12, 16, 16 ], "texture": "#all", "cullface": "down" }, + "up": { "uv": [ 12, 0, 16, 4 ], "texture": "#all" }, + "north": { "uv": [ 0, 12, 4, 16 ], "texture": "#all", "cullface": "north" }, + "south": { "uv": [ 12, 12, 16, 16 ], "texture": "#all" }, + "west": { "uv": [ 0, 12, 4, 16 ], "texture": "#all" }, + "east": { "uv": [ 12, 12, 16, 16 ], "texture": "#all", "cullface": "east" } + } + }, { + "from": [ 0, 0, 6 ], + "to": [ 4, 4, 10 ], + "faces": { + "down": { "uv": [ 0, 6, 4, 10 ], "texture": "#all", "cullface": "down" }, + "up": { "uv": [ 0, 6, 4, 10 ], "texture": "#all" }, + "north": { "uv": [ 12, 12, 16, 16 ], "texture": "#all" }, + "south": { "uv": [ 0, 12, 4, 16 ], "texture": "#all" }, + "west": { "uv": [ 6, 12, 10, 16 ], "texture": "#all", "cullface": "west" }, + "east": { "uv": [ 6, 12, 10, 16 ], "texture": "#all" } + } + }, { + "from": [ 6, 0, 6 ], + "to": [ 10, 4, 10 ], + "faces": { + "down": { "uv": [ 6, 6, 10, 10 ], "texture": "#all", "cullface": "down" }, + "north": { "uv": [ 6, 12, 10, 16 ], "texture": "#all" }, + "south": { "uv": [ 6, 12, 10, 16 ], "texture": "#all" }, + "west": { "uv": [ 6, 12, 10, 16 ], "texture": "#all" }, + "east": { "uv": [ 6, 12, 10, 16 ], "texture": "#all" } + } + }, { + "from": [ 12, 0, 6 ], + "to": [ 16, 4, 10 ], + "faces": { + "down": { "uv": [ 12, 6, 16, 10 ], "texture": "#all", "cullface": "down" }, + "up": { "uv": [ 12, 6, 16, 10 ], "texture": "#all" }, + "north": { "uv": [ 0, 12, 4, 16 ], "texture": "#all" }, + "south": { "uv": [ 12, 12, 16, 16 ], "texture": "#all" }, + "west": { "uv": [ 6, 12, 10, 16 ], "texture": "#all" }, + "east": { "uv": [ 6, 12, 10, 16 ], "texture": "#all", "cullface": "east" } + } + }, { + "from": [ 0, 0, 12 ], + "to": [ 4, 4, 16 ], + "faces": { + "down": { "uv": [ 0, 0, 4, 4 ], "texture": "#all", "cullface": "down" }, + "up": { "uv": [ 0, 12, 4, 16 ], "texture": "#all" }, + "north": { "uv": [ 12, 12, 16, 16 ], "texture": "#all" }, + "south": { "uv": [ 0, 12, 4, 16 ], "texture": "#all", "cullface": "south" }, + "west": { "uv": [ 12, 12, 16, 16 ], "texture": "#all", "cullface": "west" }, + "east": { "uv": [ 0, 12, 4, 16 ], "texture": "#all" } + } + }, { + "from": [ 6, 0, 12 ], + "to": [ 10, 4, 16 ], + "faces": { + "down": { "uv": [ 6, 0, 10, 4 ], "texture": "#all", "cullface": "down" }, + "up": { "uv": [ 6, 12, 10, 16 ], "texture": "#all" }, + "north": { "uv": [ 6, 12, 10, 16 ], "texture": "#all" }, + "south": { "uv": [ 6, 12, 10, 16 ], "texture": "#all", "cullface": "south" }, + "west": { "uv": [ 12, 12, 16, 16 ], "texture": "#all" }, + "east": { "uv": [ 0, 12, 4, 16 ], "texture": "#all" } + } + }, { + "from": [ 12, 0, 12 ], + "to": [ 16, 4, 16 ], + "faces": { + "down": { "uv": [ 12, 0, 16, 4 ], "texture": "#all", "cullface": "down" }, + "up": { "uv": [ 12, 12, 16, 16 ], "texture": "#all" }, + "north": { "uv": [ 0, 12, 4, 16 ], "texture": "#all" }, + "south": { "uv": [ 12, 12, 16, 16 ], "texture": "#all", "cullface": "south" }, + "west": { "uv": [ 12, 12, 16, 16 ], "texture": "#all" }, + "east": { "uv": [ 0, 12, 4, 16 ], "texture": "#all", "cullface": "east" } + } + }, { + "from": [ 0, 6, 0 ], + "to": [ 4, 10, 4 ], + "faces": { + "down": { "uv": [ 0, 12, 4, 16 ], "texture": "#all" }, + "up": { "uv": [ 0, 0, 4, 4 ], "texture": "#all" }, + "north": { "uv": [ 12, 6, 16, 10 ], "texture": "#all", "cullface": "north" }, + "south": { "uv": [ 0, 6, 4, 10 ], "texture": "#all" }, + "west": { "uv": [ 0, 6, 4, 10 ], "texture": "#all", "cullface": "west" }, + "east": { "uv": [ 12, 6, 16, 10 ], "texture": "#all" } + } + }, { + "from": [ 6, 6, 0 ], + "to": [ 10, 10, 4 ], + "faces": { + "down": { "uv": [ 6, 12, 10, 16 ], "texture": "#all" }, + "up": { "uv": [ 6, 0, 10, 4 ], "texture": "#all" }, + "north": { "uv": [ 6, 6, 10, 10 ], "texture": "#all", "cullface": "north" }, + "west": { "uv": [ 0, 6, 4, 10 ], "texture": "#all" }, + "east": { "uv": [ 12, 6, 16, 10 ], "texture": "#all" } + } + }, { + "from": [ 12, 6, 0 ], + "to": [ 16, 10, 4 ], + "faces": { + "down": { "uv": [ 12, 12, 16, 16 ], "texture": "#all" }, + "up": { "uv": [ 12, 0, 16, 4 ], "texture": "#all" }, + "north": { "uv": [ 0, 6, 4, 10 ], "texture": "#all", "cullface": "north" }, + "south": { "uv": [ 12, 6, 16, 10 ], "texture": "#all" }, + "west": { "uv": [ 0, 6, 4, 10 ], "texture": "#all" }, + "east": { "uv": [ 12, 6, 16, 10 ], "texture": "#all", "cullface": "east" } + } + }, { + "from": [ 0, 6, 6 ], + "to": [ 4, 10, 10 ], + "faces": { + "down": { "uv": [ 0, 6, 4, 10 ], "texture": "#all" }, + "up": { "uv": [ 0, 6, 4, 10 ], "texture": "#all" }, + "north": { "uv": [ 12, 6, 16, 10 ], "texture": "#all" }, + "south": { "uv": [ 0, 6, 4, 10 ], "texture": "#all" }, + "west": { "uv": [ 6, 6, 10, 10 ], "texture": "#all", "cullface": "west" } + } + }, { + "from": [ 1, 1, 1 ], + "to": [ 15, 15, 15 ], + "faces": { + "down": { "uv": [ 1, 1, 15, 15 ], "texture": "#all" }, + "up": { "uv": [ 1, 1, 15, 15 ], "texture": "#all" }, + "north": { "uv": [ 1, 1, 15, 15 ], "texture": "#all" }, + "south": { "uv": [ 1, 1, 15, 15 ], "texture": "#all" }, + "west": { "uv": [ 1, 1, 15, 15 ], "texture": "#all" }, + "east": { "uv": [ 1, 1, 15, 15 ], "texture": "#all" } + } + }, { + "from": [ 12, 6, 6 ], + "to": [ 16, 10, 10 ], + "faces": { + "down": { "uv": [ 12, 6, 16, 10 ], "texture": "#all" }, + "up": { "uv": [ 12, 6, 16, 10 ], "texture": "#all" }, + "north": { "uv": [ 0, 6, 4, 10 ], "texture": "#all" }, + "south": { "uv": [ 12, 6, 16, 10 ], "texture": "#all" }, + "east": { "uv": [ 6, 6, 10, 10 ], "texture": "#all", "cullface": "east" } + } + }, { + "from": [ 0, 6, 12 ], + "to": [ 4, 10, 16 ], + "faces": { + "down": { "uv": [ 0, 0, 4, 4 ], "texture": "#all" }, + "up": { "uv": [ 0, 12, 4, 16 ], "texture": "#all" }, + "north": { "uv": [ 12, 6, 16, 10 ], "texture": "#all" }, + "south": { "uv": [ 0, 6, 4, 10 ], "texture": "#all", "cullface": "south" }, + "west": { "uv": [ 12, 6, 16, 10 ], "texture": "#all", "cullface": "west" }, + "east": { "uv": [ 0, 6, 4, 10 ], "texture": "#all" } + } + }, { + "from": [ 6, 6, 12 ], + "to": [ 10, 10, 16 ], + "faces": { + "down": { "uv": [ 6, 0, 10, 4 ], "texture": "#all" }, + "up": { "uv": [ 6, 12, 10, 16 ], "texture": "#all" }, + "south": { "uv": [ 6, 6, 10, 10 ], "texture": "#all", "cullface": "south" }, + "west": { "uv": [ 12, 6, 16, 10 ], "texture": "#all" }, + "east": { "uv": [ 0, 6, 4, 10 ], "texture": "#all" } + } + }, { + "from": [ 12, 6, 12 ], + "to": [ 16, 10, 16 ], + "faces": { + "down": { "uv": [ 12, 0, 16, 4 ], "texture": "#all" }, + "up": { "uv": [ 12, 12, 16, 16 ], "texture": "#all" }, + "north": { "uv": [ 0, 6, 4, 10 ], "texture": "#all" }, + "south": { "uv": [ 12, 6, 16, 10 ], "texture": "#all", "cullface": "south" }, + "west": { "uv": [ 12, 6, 16, 10 ], "texture": "#all" }, + "east": { "uv": [ 0, 6, 4, 10 ], "texture": "#all", "cullface": "east" } + } + }, { + "from": [ 0, 12, 0 ], + "to": [ 4, 16, 4 ], + "faces": { + "down": { "uv": [ 0, 12, 4, 16 ], "texture": "#all" }, + "up": { "uv": [ 0, 0, 4, 4 ], "texture": "#all", "cullface": "up" }, + "north": { "uv": [ 12, 0, 16, 4 ], "texture": "#all", "cullface": "north" }, + "south": { "uv": [ 0, 0, 4, 4 ], "texture": "#all" }, + "west": { "uv": [ 0, 0, 4, 4 ], "texture": "#all", "cullface": "west" }, + "east": { "uv": [ 12, 0, 16, 4 ], "texture": "#all" } + } + }, { + "from": [ 6, 12, 0 ], + "to": [ 10, 16, 4 ], + "faces": { + "down": { "uv": [ 6, 12, 10, 16 ], "texture": "#all" }, + "up": { "uv": [ 6, 0, 10, 4 ], "texture": "#all", "cullface": "up" }, + "north": { "uv": [ 6, 0, 10, 4 ], "texture": "#all", "cullface": "north" }, + "south": { "uv": [ 6, 0, 10, 4 ], "texture": "#all" }, + "west": { "uv": [ 0, 0, 4, 4 ], "texture": "#all" }, + "east": { "uv": [ 12, 0, 16, 4 ], "texture": "#all" } + } + }, { + "from": [ 12, 12, 0 ], + "to": [ 16, 16, 4 ], + "faces": { + "down": { "uv": [ 12, 12, 16, 16 ], "texture": "#all" }, + "up": { "uv": [ 12, 0, 16, 4 ], "texture": "#all", "cullface": "up" }, + "north": { "uv": [ 0, 0, 4, 4 ], "texture": "#all", "cullface": "north" }, + "south": { "uv": [ 12, 0, 16, 4 ], "texture": "#all" }, + "west": { "uv": [ 0, 0, 4, 4 ], "texture": "#all" }, + "east": { "uv": [ 12, 0, 16, 4 ], "texture": "#all", "cullface": "east" } + } + }, { + "from": [ 0, 12, 6 ], + "to": [ 4, 16, 10 ], + "faces": { + "down": { "uv": [ 0, 6, 4, 10 ], "texture": "#all" }, + "up": { "uv": [ 0, 6, 4, 10 ], "texture": "#all", "cullface": "up" }, + "north": { "uv": [ 12, 0, 16, 4 ], "texture": "#all" }, + "south": { "uv": [ 0, 0, 4, 4 ], "texture": "#all" }, + "west": { "uv": [ 6, 0, 10, 4 ], "texture": "#all", "cullface": "west" }, + "east": { "uv": [ 6, 0, 10, 4 ], "texture": "#all" } + } + }, { + "from": [ 6, 12, 6 ], + "to": [ 10, 16, 10 ], + "faces": { + "up": { "uv": [ 6, 6, 10, 10 ], "texture": "#all", "cullface": "up" }, + "north": { "uv": [ 6, 0, 10, 4 ], "texture": "#all" }, + "south": { "uv": [ 6, 0, 10, 4 ], "texture": "#all" }, + "west": { "uv": [ 6, 0, 10, 4 ], "texture": "#all" }, + "east": { "uv": [ 6, 0, 10, 4 ], "texture": "#all" } + } + }, { + "from": [ 12, 12, 6 ], + "to": [ 16, 16, 10 ], + "faces": { + "down": { "uv": [ 12, 6, 16, 10 ], "texture": "#all" }, + "up": { "uv": [ 12, 6, 16, 10 ], "texture": "#all", "cullface": "up" }, + "north": { "uv": [ 0, 0, 4, 4 ], "texture": "#all" }, + "south": { "uv": [ 12, 0, 16, 4 ], "texture": "#all" }, + "west": { "uv": [ 6, 0, 10, 4 ], "texture": "#all" }, + "east": { "uv": [ 6, 0, 10, 4 ], "texture": "#all", "cullface": "east" } + } + }, { + "from": [ 0, 12, 12 ], + "to": [ 4, 16, 16 ], + "faces": { + "down": { "uv": [ 0, 0, 4, 4 ], "texture": "#all" }, + "up": { "uv": [ 0, 12, 4, 16 ], "texture": "#all", "cullface": "up" }, + "north": { "uv": [ 12, 0, 16, 4 ], "texture": "#all" }, + "south": { "uv": [ 0, 0, 4, 4 ], "texture": "#all", "cullface": "south" }, + "west": { "uv": [ 12, 0, 16, 4 ], "texture": "#all", "cullface": "west" }, + "east": { "uv": [ 0, 0, 4, 4 ], "texture": "#all" } + } + }, { + "from": [ 6, 12, 12 ], + "to": [ 10, 16, 16 ], + "faces": { + "down": { "uv": [ 6, 0, 10, 4 ], "texture": "#all" }, + "up": { "uv": [ 6, 12, 10, 16 ], "texture": "#all", "cullface": "up" }, + "north": { "uv": [ 6, 0, 10, 4 ], "texture": "#all" }, + "south": { "uv": [ 6, 0, 10, 4 ], "texture": "#all", "cullface": "south" }, + "west": { "uv": [ 12, 0, 16, 4 ], "texture": "#all" }, + "east": { "uv": [ 0, 0, 4, 4 ], "texture": "#all" } + } + }, { + "from": [ 12, 12, 12 ], + "to": [ 16, 16, 16 ], + "faces": { + "down": { "uv": [ 12, 0, 16, 4 ], "texture": "#all" }, + "up": { "uv": [ 12, 12, 16, 16 ], "texture": "#all", "cullface": "up" }, + "north": { "uv": [ 0, 0, 4, 4 ], "texture": "#all" }, + "south": { "uv": [ 12, 0, 16, 4 ], "texture": "#all", "cullface": "south" }, + "west": { "uv": [ 12, 0, 16, 4 ], "texture": "#all" }, + "east": { "uv": [ 0, 0, 4, 4 ], "texture": "#all", "cullface": "east" } + } + } + ] +} diff --git a/src/main/resources/assets/twilightforest/models/block/mayapple.json b/src/main/resources/assets/twilightforest/models/block/mayapple.json new file mode 100644 index 0000000000..3f6f80d8e7 --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/mayapple.json @@ -0,0 +1,27 @@ +{ + "render_type": "minecraft:cutout", + "textures": { + "particle": "twilightforest:block/cloverpatch", + "stem": "twilightforest:block/mayapple_side", + "leaf": "twilightforest:block/mayapple" + }, + "elements": [ + { + "from": [ 8, 0, 8 ], + "to": [ 9, 6, 9 ], + "faces": { + "north": { "uv": [ 8, 10, 9, 16 ], "texture": "#stem" }, + "south": { "uv": [ 8, 10, 9, 16 ], "texture": "#stem" }, + "west": { "uv": [ 8, 10, 9, 16 ], "texture": "#stem" }, + "east": { "uv": [ 8, 10, 9, 16 ], "texture": "#stem" } + } + }, { + "from": [ 0, 6, 0 ], + "to": [ 16, 6, 16 ], + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#leaf" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#leaf" } + } + } + ] +} diff --git a/src/main/resources/assets/twilightforest/models/block/miniature/lich_tower.json b/src/main/resources/assets/twilightforest/models/block/miniature/lich_tower.json new file mode 100644 index 0000000000..efc1ed3a70 --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/miniature/lich_tower.json @@ -0,0 +1,272 @@ +{ + "__comment": "Made by Chaonic for the Twilight Forest <3", + "display": { + "thirdperson_righthand": { + "rotation": [ 75, 45, 0 ], + "translation": [ 0, 2.5, 0 ], + "scale": [ 0.375, 0.375, 0.375 ] + }, + "thirdperson_lefthand": { + "rotation": [ 75, 45, 0 ], + "translation": [ 0, 2.5, 0 ], + "scale": [ 0.375, 0.375, 0.375 ] + }, + "firstperson_righthand": { + "rotation": [ 0, 45, 0 ], + "scale": [ 0.4, 0.4, 0.4 ] + }, + "firstperson_lefthand": { + "rotation": [ 0, 45, 0 ], + "scale": [ 0.4, 0.4, 0.4 ] + }, + "gui": { + "rotation": [ 30, 45, 0 ], + "translation": [ 0.75, -0.25, 0 ] + }, + "head": { + "rotation": [ 0, 180, 0 ], + "translation": [ 0, 14.75, 0 ] + }, + "ground": { + "translation": [ 0, 2, 0 ], + "scale": [ 0.5, 0.5, 0.5 ] + }, + "fixed": { + "rotation": [ 0, -90, 0 ], + "translation": [ 0, 0, -2.086 ] + } + }, + "render_type": "minecraft:cutout", + "textures": { + "particle": "block/stone_bricks", + "birchwood": "block/birch_planks", + "oakwood": "block/oak_planks", + "stonebricks": "block/stone_bricks" + }, + "elements": [ + { + "from": [ 8, 0, 3 ], + "to": [ 13, 8, 8 ], + "faces": { + "down": { "uv": [ 8, 8, 13, 13 ], "texture": "#stonebricks" }, + "north": { "uv": [ 3, 8, 8, 16 ], "texture": "#stonebricks" }, + "south": { "uv": [ 8, 8, 13, 16 ], "texture": "#stonebricks" }, + "west": { "uv": [ 3, 8, 8, 16 ], "texture": "#stonebricks" }, + "east": { "uv": [ 8, 8, 13, 16 ], "texture": "#stonebricks" } + } + }, + { + "from": [ 7.5, 8, 2.5 ], + "to": [ 13.5, 9, 8.5 ], + "faces": { + "down": { "uv": [ 7.5, 7.5, 13.5, 13.5 ], "texture": "#birchwood" }, + "up": { "uv": [ 7.5, 2.5, 13.5, 8.5 ], "texture": "#birchwood" }, + "north": { "uv": [ 2.5, 7, 8.5, 8 ], "texture": "#birchwood" }, + "south": { "uv": [ 7.5, 7, 13.5, 8 ], "texture": "#birchwood" }, + "west": { "uv": [ 2.5, 7, 8.5, 8 ], "texture": "#birchwood" }, + "east": { "uv": [ 7.5, 7, 13.5, 8 ], "texture": "#birchwood" } + } + }, + { + "from": [ 10.5, 3.5, 8 ], + "to": [ 12.5, 6, 10 ], + "faces": { + "down": { "uv": [ 10.5, 6, 12.5, 8 ], "texture": "#stonebricks" }, + "up": { "uv": [ 10.5, 8, 12.5, 10 ], "texture": "#stonebricks" }, + "south": { "uv": [ 10.5, 10, 12.5, 12.5 ], "texture": "#stonebricks" }, + "west": { "uv": [ 8, 10, 10, 12.5 ], "texture": "#stonebricks" }, + "east": { "uv": [ 6, 10, 8, 12.5 ], "texture": "#stonebricks" } + } + }, + { + "from": [ 8.5, 5.5, 8 ], + "to": [ 10, 7, 10.5 ], + "faces": { + "down": { "uv": [ 8.5, 5.5, 10, 8 ], "texture": "#stonebricks" }, + "up": { "uv": [ 8.5, 8, 10, 10.5 ], "texture": "#stonebricks" }, + "west": { "uv": [ 8, 9, 10.5, 10.5 ], "texture": "#stonebricks" }, + "east": { "uv": [ 5.5, 9, 8, 10.5 ], "texture": "#stonebricks" } + } + }, + { + "from": [ 3.5, 4.5, 2.5 ], + "to": [ 6, 8, 5 ], + "faces": { + "down": { "uv": [ 3.5, 11, 6, 13.5 ], "texture": "#stonebricks" }, + "north": { "uv": [ 10, 8, 12.5, 11.5 ], "texture": "#stonebricks" }, + "south": { "uv": [ 3.5, 8, 6, 11.5 ], "texture": "#stonebricks" }, + "west": { "uv": [ 2.5, 8, 5, 11.5 ], "texture": "#stonebricks" }, + "east": { "uv": [ 11, 8, 13.5, 11.5 ], "texture": "#stonebricks" } + } + }, + { + "from": [ 5.5, 0, 4.5 ], + "to": [ 8, 3.5, 7.5 ], + "faces": { + "down": { "uv": [ 5.5, 8.5, 8, 11.5 ], "texture": "#stonebricks" }, + "up": { "uv": [ 5.5, 4.5, 8, 7.5 ], "texture": "#stonebricks" }, + "north": { "uv": [ 8, 12.5, 10.5, 16 ], "texture": "#stonebricks" }, + "south": { "uv": [ 5.5, 12.5, 8, 16 ], "texture": "#stonebricks" }, + "west": { "uv": [ 4.5, 12.5, 7.5, 16 ], "texture": "#stonebricks" } + } + }, + { + "from": [ 6, 5, 3.5 ], + "to": [ 8, 6.5, 4.5 ], + "faces": { + "down": { "uv": [ 6, 11.5, 8, 12.5 ], "texture": "#stonebricks" }, + "up": { "uv": [ 6, 3.5, 8, 4.5 ], "texture": "#stonebricks" }, + "north": { "uv": [ 8, 9.5, 10, 11 ], "texture": "#stonebricks" }, + "south": { "uv": [ 6, 9.5, 8, 11 ], "texture": "#stonebricks" } + } + }, + { + "from": [ 5.5, 3.5, 7 ], + "to": [ 8, 4, 7.5 ], + "faces": { + "up": { "uv": [ 5.5, 7, 8, 7.5 ], "texture": "#oakwood" }, + "north": { "uv": [ 8, 12, 10.5, 12.5 ], "texture": "#oakwood" }, + "south": { "uv": [ 5.5, 12, 8, 12.5 ], "texture": "#oakwood" }, + "west": { "uv": [ 7, 12, 7.5, 12.5 ], "texture": "#oakwood" } + } + }, + { + "from": [ 5.5, 3.5, 4.5 ], + "to": [ 8, 4, 5 ], + "faces": { + "up": { "uv": [ 5.5, 4.5, 8, 5 ], "texture": "#oakwood" }, + "north": { "uv": [ 8, 12, 10.5, 12.5 ], "texture": "#oakwood" }, + "south": { "uv": [ 5.5, 12, 8, 12.5 ], "texture": "#oakwood" }, + "west": { "uv": [ 4.5, 12, 5, 12.5 ], "texture": "#oakwood" } + } + }, + { + "from": [ 5.5, 3.5, 5 ], + "to": [ 6, 4, 7 ], + "faces": { + "up": { "uv": [ 5.5, 5, 6, 7 ], "texture": "#oakwood" }, + "west": { "uv": [ 5, 12, 7, 12.5 ], "texture": "#oakwood" }, + "east": { "uv": [ 9, 12, 11, 12.5 ], "texture": "#oakwood" } + } + }, + { + "from": [ 10.5, 6, 8 ], + "to": [ 11, 6.5, 10 ], + "faces": { + "up": { "uv": [ 10.5, 8, 11, 10 ], "texture": "#oakwood" }, + "south": { "uv": [ 10.5, 9.5, 11, 10 ], "texture": "#oakwood" }, + "west": { "uv": [ 8, 9.5, 10, 10 ], "texture": "#oakwood" }, + "east": { "uv": [ 6, 9.5, 8, 10 ], "texture": "#oakwood" } + } + }, + { + "from": [ 12, 6, 8 ], + "to": [ 12.5, 6.5, 10 ], + "faces": { + "up": { "uv": [ 12, 8, 12.5, 10 ], "texture": "#oakwood" }, + "south": { "uv": [ 12, 9.5, 12.5, 10 ], "texture": "#oakwood" }, + "west": { "uv": [ 8, 9.5, 10, 10 ], "texture": "#oakwood" }, + "east": { "uv": [ 6, 9.5, 8, 10 ], "texture": "#oakwood" } + } + }, + { + "from": [ 11, 6, 9.5 ], + "to": [ 12, 6.5, 10 ], + "faces": { + "up": { "uv": [ 11, 9.5, 12, 10 ], "texture": "#oakwood" }, + "north": { "uv": [ 4, 9.5, 5, 10 ], "texture": "#oakwood" }, + "south": { "uv": [ 11, 9.5, 12, 10 ], "texture": "#oakwood" } + } + }, + { + "from": [ 3, 8, 2 ], + "to": [ 6.5, 9.5, 5.5 ], + "faces": { + "down": { "uv": [ 3, 10.5, 6.5, 14 ], "texture": "#birchwood" }, + "up": { "uv": [ 3, 2, 6.5, 5.5 ], "texture": "#birchwood" }, + "north": { "uv": [ 9.5, 6.5, 13, 8 ], "texture": "#birchwood" }, + "south": { "uv": [ 3, 6.5, 6.5, 8 ], "texture": "#birchwood" }, + "west": { "uv": [ 2, 6.5, 5.5, 8 ], "texture": "#birchwood" }, + "east": { "uv": [ 10.5, 6.5, 14, 8 ], "texture": "#birchwood" } + } + }, + { + "from": [ 4, 9.5, 3 ], + "to": [ 5.5, 12, 4.5 ], + "faces": { + "up": { "uv": [ 4, 3, 5.5, 4.5 ], "texture": "#birchwood" }, + "north": { "uv": [ 10.5, 4, 12, 6.5 ], "texture": "#birchwood" }, + "south": { "uv": [ 4, 4, 5.5, 6.5 ], "texture": "#birchwood" }, + "west": { "uv": [ 3, 4, 4.5, 6.5 ], "texture": "#birchwood" }, + "east": { "uv": [ 11.5, 4, 13, 6.5 ], "texture": "#birchwood" } + } + }, + { + "from": [ 8.5, 9, 3.5 ], + "to": [ 12.5, 11, 7.5 ], + "faces": { + "up": { "uv": [ 8.5, 3.5, 12.5, 7.5 ], "texture": "#birchwood" }, + "north": { "uv": [ 3.5, 5, 7.5, 7 ], "texture": "#birchwood" }, + "south": { "uv": [ 8.5, 5, 12.5, 7 ], "texture": "#birchwood" }, + "west": { "uv": [ 3.5, 5, 7.5, 7 ], "texture": "#birchwood" }, + "east": { "uv": [ 8.5, 5, 12.5, 7 ], "texture": "#birchwood" } + } + }, + { + "from": [ 9.5, 11, 4.5 ], + "to": [ 11.5, 13, 6.5 ], + "faces": { + "up": { "uv": [ 9.5, 4.5, 11.5, 6.5 ], "texture": "#birchwood" }, + "north": { "uv": [ 4.5, 3, 6.5, 5 ], "texture": "#birchwood" }, + "south": { "uv": [ 9.5, 3, 11.5, 5 ], "texture": "#birchwood" }, + "west": { "uv": [ 4.5, 3, 6.5, 5 ], "texture": "#birchwood" }, + "east": { "uv": [ 9.5, 3, 11.5, 5 ], "texture": "#birchwood" } + } + }, + { + "from": [ 10, 13, 5 ], + "to": [ 11, 15, 6 ], + "faces": { + "up": { "uv": [ 10, 5, 11, 6 ], "texture": "#birchwood" }, + "north": { "uv": [ 5, 1, 6, 3 ], "texture": "#birchwood" }, + "south": { "uv": [ 10, 1, 11, 3 ], "texture": "#birchwood" }, + "west": { "uv": [ 5, 1, 6, 3 ], "texture": "#birchwood" }, + "east": { "uv": [ 10, 1, 11, 3 ], "texture": "#birchwood" } + } + }, + { + "from": [ 8, 4.5, 10.5 ], + "to": [ 10.5, 8, 13 ], + "faces": { + "down": { "uv": [ 8, 3, 10.5, 5.5 ], "texture": "#stonebricks" }, + "north": { "uv": [ 5.5, 8, 8, 11.5 ], "texture": "#stonebricks" }, + "south": { "uv": [ 8, 8, 10.5, 11.5 ], "texture": "#stonebricks" }, + "west": { "uv": [ 10.5, 8, 13, 11.5 ], "texture": "#stonebricks" }, + "east": { "uv": [ 3, 8, 5.5, 11.5 ], "texture": "#stonebricks" } + } + }, + { + "from": [ 7.5, 8, 10 ], + "to": [ 11, 9.5, 13.5 ], + "faces": { + "down": { "uv": [ 7.5, 2.5, 11, 6 ], "texture": "#birchwood" }, + "up": { "uv": [ 7.5, 10, 11, 13.5 ], "texture": "#birchwood" }, + "north": { "uv": [ 5, 6.5, 8.5, 8 ], "texture": "#birchwood" }, + "south": { "uv": [ 7.5, 6.5, 11, 8 ], "texture": "#birchwood" }, + "west": { "uv": [ 10, 6.5, 13.5, 8 ], "texture": "#birchwood" }, + "east": { "uv": [ 2.5, 6.5, 6, 8 ], "texture": "#birchwood" } + } + }, + { + "from": [ 8.5, 9.5, 11 ], + "to": [ 10, 12, 12.5 ], + "faces": { + "up": { "uv": [ 8.5, 11, 10, 12.5 ], "texture": "#birchwood" }, + "north": { "uv": [ 6, 4, 7.5, 6.5 ], "texture": "#birchwood" }, + "south": { "uv": [ 8.5, 4, 10, 6.5 ], "texture": "#birchwood" }, + "west": { "uv": [ 11, 4, 12.5, 6.5 ], "texture": "#birchwood" }, + "east": { "uv": [ 3.5, 4, 5, 6.5 ], "texture": "#birchwood" } + } + } + ] +} diff --git a/src/main/resources/assets/twilightforest/models/block/miniature/naga_courtyard.json b/src/main/resources/assets/twilightforest/models/block/miniature/naga_courtyard.json new file mode 100644 index 0000000000..727a0e9daa --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/miniature/naga_courtyard.json @@ -0,0 +1,331 @@ +{ + "display": { + "gui": { + "rotation": [ 30, 235, 0 ], + "translation": [ 0, 1.5, 0 ], + "scale":[ 1, 1, 1 ] + }, + "ground": { + "rotation": [ 0, 0, 0 ], + "translation": [ 0, 3, 0 ], + "scale":[ 0.25, 0.25, 0.25 ] + }, + "fixed": { + "rotation": [ 0, 0, 0 ], + "translation": [ 0, 0, 0], + "scale":[ 0.5, 0.5, 0.5 ] + }, + "thirdperson_righthand": { + "rotation": [ 75, 45, 0 ], + "translation": [ 0, 4, 1.5], + "scale": [ 0.75, 0.75, 0.75 ] + }, + "firstperson_righthand": { + "rotation": [ 0, 45, 0 ], + "translation": [ 0, 2, 0 ], + "scale": [ 0.75, 0.75, 0.75 ] + }, + "firstperson_lefthand": { + "rotation": [ 0, 135, 0 ], + "translation": [ 0, 2, 0 ], + "scale": [ 0.75, 0.75, 0.75 ] + } + }, + "render_type": "minecraft:cutout", + "textures": { + "particle": "block/dirt", + "dirt": "block/dirt", + "grass": "block/grass_block_top", + "grass_side": "block/grass_block_side_overlay", + "stone": "block/stone", + "brick": "block/stone_bricks", + "moss_brick": "block/mossy_stone_bricks", + "slab_side": "block/smooth_stone_slab_side", + "slab_top": "block/smooth_stone" + }, + "elements": [ { + "from": [ 1, 2, 1 ], + "to": [ 15, 4, 15 ], + "faces": { + "up": { "texture": "#grass", "tintindex": 0 }, + "down": { "texture": "#dirt" }, + "north": { "texture": "#dirt" }, + "south": { "texture": "#dirt" }, + "west": { "texture": "#dirt" }, + "east": { "texture": "#dirt" } + } + }, { + "from": [ 2, 1, 2 ], + "to": [ 14, 2, 14 ], + "faces": { + "down": { "texture": "#dirt" }, + "north": { "texture": "#dirt" }, + "south": { "texture": "#dirt" }, + "west": { "texture": "#dirt" }, + "east": { "texture": "#dirt" } + } + }, { + "from": [ 2.5, 0, 2.5 ], + "to": [ 13.5, 1, 13.5 ], + "faces": { + "down": { "texture": "#stone" }, + "north": { "texture": "#stone" }, + "south": { "texture": "#stone" }, + "west": { "texture": "#stone" }, + "east": { "texture": "#stone" } + } + }, { + "from": [ 0, 2, 4 ], + "to": [ 1, 4, 12 ], + "faces": { + "up": { "texture": "#grass", "tintindex": 0 }, + "down": { "texture": "#dirt" }, + "north": { "texture": "#dirt" }, + "south": { "texture": "#dirt" }, + "west": { "texture": "#dirt" }, + "east": { "texture": "#dirt" } + } + }, { + "from": [ 15, 2, 4 ], + "to": [ 16, 4, 12 ], + "faces": { + "up": { "texture": "#grass", "tintindex": 0 }, + "down": { "texture": "#dirt" }, + "north": { "texture": "#dirt" }, + "south": { "texture": "#dirt" }, + "west": { "texture": "#dirt" }, + "east": { "texture": "#dirt" } + } + }, { + "from": [ 4, 2, 0 ], + "to": [ 12, 4, 1 ], + "faces": { + "up": { "texture": "#grass", "tintindex": 0 }, + "down": { "texture": "#dirt" }, + "north": { "texture": "#dirt" }, + "south": { "texture": "#dirt" }, + "west": { "texture": "#dirt" }, + "east": { "texture": "#dirt" } + } + }, { + "from": [ 4, 2, 15 ], + "to": [ 12, 4, 16 ], + "faces": { + "up": { "texture": "#grass", "tintindex": 0 }, + "down": { "texture": "#dirt" }, + "north": { "texture": "#dirt" }, + "south": { "texture": "#dirt" }, + "west": { "texture": "#dirt" }, + "east": { "texture": "#dirt" } + } + }, { + "from": [ 1, 2, 1 ], + "to": [ 15, 4, 15 ], + "faces": { + "north": { "uv": [ 1, 1, 15, 3 ], "texture": "#grass_side", "tintindex": 0 }, + "south": { "uv": [ 1, 1, 15, 3 ], "texture": "#grass_side", "tintindex": 0 }, + "west": { "uv": [ 1, 1, 15, 3 ], "texture": "#grass_side", "tintindex": 0 }, + "east": { "uv": [ 1, 1, 15, 3 ], "texture": "#grass_side", "tintindex": 0 } + } + }, { + "from": [ 4, 2, 0 ], + "to": [ 12, 4, 1 ], + "faces": { + "north": { "uv": [ 4, 1, 12, 3 ], "texture": "#grass_side", "tintindex": 0 }, + "south": { "uv": [ 4, 1, 12, 3 ], "texture": "#grass_side", "tintindex": 0 }, + "west": { "uv": [ 0, 1, 1, 3 ], "texture": "#grass_side", "tintindex": 0 }, + "east": { "uv": [ 15, 1, 16, 3 ], "texture": "#grass_side", "tintindex": 0 } + } + }, { + "from": [ 0, 2, 4 ], + "to": [ 1, 4, 12 ], + "faces": { + "north": { "uv": [ 0, 1, 1, 3 ], "texture": "#grass_side", "tintindex": 0 }, + "south": { "uv": [ 15, 1, 16, 3 ], "texture": "#grass_side", "tintindex": 0 }, + "west": { "uv": [ 4, 1, 12, 3 ], "texture": "#grass_side", "tintindex": 0 }, + "east": { "uv": [ 4, 1, 12, 3 ], "texture": "#grass_side", "tintindex": 0 } + } + }, { + "from": [ 4, 2, 15 ], + "to": [ 12, 4, 16 ], + "faces": { + "north": { "uv": [ 4, 1, 12, 3 ], "texture": "#grass_side", "tintindex": 0 }, + "south": { "uv": [ 4, 1, 12, 3 ], "texture": "#grass_side", "tintindex": 0 }, + "west": { "uv": [ 15, 1, 16, 3 ], "texture": "#grass_side", "tintindex": 0 }, + "east": { "uv": [ 0, 1, 1, 3 ], "texture": "#grass_side", "tintindex": 0 } + } + }, { + "from": [ 15, 2, 4 ], + "to": [ 16, 4, 12 ], + "faces": { + "north": { "uv": [ 0, 1, 1, 3 ], "texture": "#grass_side", "tintindex": 0 }, + "south": { "uv": [ 15, 1, 16, 3 ], "texture": "#grass_side", "tintindex": 0 }, + "west": { "uv": [ 4, 1, 12, 3 ], "texture": "#grass_side", "tintindex": 0 }, + "east": { "uv": [ 4, 1, 12, 3 ], "texture": "#grass_side", "tintindex": 0 } + } + }, { + "from": [ 2, 4, 13 ], + "to": [ 14, 7, 14 ], + "faces": { + "north": { "texture": "#brick" }, + "south": { "texture": "#brick" } + } + }, { + "from": [ 13, 4, 2 ], + "to": [ 14, 7, 14 ], + "faces": { + "west": { "texture": "#brick" }, + "east": { "texture": "#brick" } + } + }, { + "from": [ 2, 4, 2 ], + "to": [ 14, 7, 3 ], + "faces": { + "north": { "texture": "#brick" }, + "south": { "texture": "#brick" } + } + }, { + "from": [ 2, 4, 2 ], + "to": [ 3, 7, 14 ], + "faces": { + "west": { "texture": "#brick" }, + "east": { "texture": "#brick" } + } + }, { + "from": [ 2, 7, 13 ], + "to": [ 14, 8, 14 ], + "faces": { + "up": { "texture": "#slab_top" }, + "north": { "texture": "#slab_side" }, + "south": { "texture": "#slab_side" }, + "west": { "texture": "#slab_side" }, + "east": { "texture": "#slab_side" } + } + }, { + "from": [ 13, 7, 3 ], + "to": [ 14, 8, 13 ], + "faces": { + "up": { "texture": "#slab_top" }, + "west": { "texture": "#slab_side" }, + "east": { "texture": "#slab_side" } + } + }, { + "from": [ 2, 7, 2 ], + "to": [ 14, 8, 3 ], + "faces": { + "up": { "texture": "#slab_top" }, + "north": { "texture": "#slab_side" }, + "south": { "texture": "#slab_side" }, + "west": { "texture": "#slab_side" }, + "east": { "texture": "#slab_side" } + } + }, { + "from": [ 2, 7, 3 ], + "to": [ 3, 8, 13 ], + "faces": { + "up": { "texture": "#slab_top" }, + "west": { "texture": "#slab_side" }, + "east": { "texture": "#slab_side" } + } + }, { + "__COMMENT": "START PILLAR 1", + "from": [ 5.5, 4, 5.5 ], + "to": [ 6.5, 10, 6.5 ], + "faces": { + "up": { "texture": "#slab_top" }, + "north": { "texture": "#moss_brick" }, + "south": { "texture": "#moss_brick" }, + "west": { "texture": "#moss_brick" }, + "east": { "texture": "#moss_brick" } + } + }, { + "from": [ 4.5, 10 , 4.5 ], + "to": [ 7.5, 10.5, 7.5 ], + "faces": { + "up": { "texture": "#slab_top" }, + "down": { "texture": "#slab_top" }, + "north": { "texture": "#slab_top" }, + "south": { "texture": "#slab_top" }, + "west": { "texture": "#slab_top" }, + "east": { "texture": "#slab_top" } + } + }, { + "from": [ 4.5, 4 , 4.5 ], + "to": [ 7.5, 4.5, 7.5 ], + "faces": { + "up": { "texture": "#slab_top" }, + "down": { "texture": "#slab_top" }, + "north": { "texture": "#slab_top" }, + "south": { "texture": "#slab_top" }, + "west": { "texture": "#slab_top" }, + "east": { "texture": "#slab_top" } + } + }, { + "__COMMENT": "START PILLAR 2", + "from": [ 10.5, 4, 6.5 ], + "to": [ 11.5, 10, 7.5 ], + "faces": { + "up": { "texture": "#slab_top" }, + "north": { "texture": "#moss_brick" }, + "south": { "texture": "#moss_brick" }, + "west": { "texture": "#moss_brick" }, + "east": { "texture": "#moss_brick" } + } + }, { + "from": [ 9.5, 10 , 5.5 ], + "to": [ 12.5, 10.5, 8.5 ], + "faces": { + "up": { "texture": "#slab_top" }, + "down": { "texture": "#slab_top" }, + "north": { "texture": "#slab_top" }, + "south": { "texture": "#slab_top" }, + "west": { "texture": "#slab_top" }, + "east": { "texture": "#slab_top" } + } + }, { + "from": [ 9.5, 4 , 5.5 ], + "to": [ 12.5, 4.5, 8.5 ], + "faces": { + "up": { "texture": "#slab_top" }, + "down": { "texture": "#slab_top" }, + "north": { "texture": "#slab_top" }, + "south": { "texture": "#slab_top" }, + "west": { "texture": "#slab_top" }, + "east": { "texture": "#slab_top" } + } + }, { + "__COMMENT": "START PILLAR 3", + "from": [ 6.5, 4, 10.5 ], + "to": [ 7.5, 10, 11.5 ], + "faces": { + "up": { "texture": "#slab_top" }, + "north": { "texture": "#moss_brick" }, + "south": { "texture": "#moss_brick" }, + "west": { "texture": "#moss_brick" }, + "east": { "texture": "#moss_brick" } + } + }, { + "from": [ 5.5, 10 , 9.5 ], + "to": [ 8.5, 10.5, 12.5 ], + "faces": { + "up": { "texture": "#slab_top" }, + "down": { "texture": "#slab_top" }, + "north": { "texture": "#slab_top" }, + "south": { "texture": "#slab_top" }, + "west": { "texture": "#slab_top" }, + "east": { "texture": "#slab_top" } + } + }, { + "from": [ 5.5, 4 , 9.5 ], + "to": [ 8.5, 4.5, 12.5 ], + "faces": { + "up": { "texture": "#slab_top" }, + "down": { "texture": "#slab_top" }, + "north": { "texture": "#slab_top" }, + "south": { "texture": "#slab_top" }, + "west": { "texture": "#slab_top" }, + "east": { "texture": "#slab_top" } + } + } + ] +} diff --git a/src/main/resources/assets/twilightforest/models/block/miniature/portal.json b/src/main/resources/assets/twilightforest/models/block/miniature/portal.json new file mode 100644 index 0000000000..cb125d3848 --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/miniature/portal.json @@ -0,0 +1,255 @@ +{ + "display": { + "gui": { + "rotation": [ 30, 235, 0 ], + "translation": [ 0, 1.5, 0], + "scale":[ 1.1, 1.1, 1.1 ] + }, + "ground": { + "rotation": [ 0, 0, 0 ], + "translation": [ 0, 3, 0], + "scale":[ 0.25, 0.25, 0.25 ] + }, + "fixed": { + "rotation": [ 0, 0, 0 ], + "translation": [ 0, 0, 0], + "scale":[ 0.5, 0.5, 0.5 ] + }, + "thirdperson_righthand": { + "rotation": [ 75, 45, 0 ], + "translation": [ 0, 4, 1.5], + "scale": [ 0.75, 0.75, 0.75 ] + }, + "firstperson_righthand": { + "rotation": [ 0, 45, 0 ], + "translation": [ 0, 2, 0 ], + "scale": [ 0.75, 0.75, 0.75 ] + }, + "firstperson_lefthand": { + "rotation": [ 0, 135, 0 ], + "translation": [ 0, 2, 0 ], + "scale": [ 0.75, 0.75, 0.75 ] + } + }, + "render_type": "minecraft:cutout", + "textures": { + "particle": "block/dirt", + "portal": "block/nether_portal", + "dirt": "block/dirt", + "grass": "block/grass_block_top", + "grass_side": "block/grass_block_side_overlay", + "stone": "block/stone", + "plant": "block/poppy" + }, + "elements": [ { + "from": [ 4, 0, 4 ], + "to": [ 12, 3, 12 ], + "faces": { + "up": { "texture": "#dirt" }, + "down": { "texture": "#stone" }, + "north": { "texture": "#stone" }, + "south": { "texture": "#stone" }, + "west": { "texture": "#stone" }, + "east": { "texture": "#stone" } + } + }, { + "__comment": "TOP CORNER", + "from": [ 2, 2, 11 ], + "to": [ 5, 7, 14 ], + "faces": { + "up": { "texture": "#grass", "tintindex": 0 }, + "down": { "texture": "#dirt" }, + "north": { "texture": "#dirt" }, + "south": { "texture": "#dirt" }, + "west": { "texture": "#dirt" }, + "east": { "texture": "#dirt" } + } + }, { + "__comment": "TOP CORNER GRASS", + "from": [ 2, 2, 11 ], + "to": [ 5, 7, 14 ], + "faces": { + "north": { "uv": [ 0, 1, 3, 6 ], "texture": "#grass_side", "tintindex": 0 }, + "south": { "uv": [ 0, 1, 3, 6 ], "texture": "#grass_side", "tintindex": 0 }, + "west": { "uv": [ 0, 1, 3, 6 ], "texture": "#grass_side", "tintindex": 0 }, + "east": { "uv": [ 0, 1, 3, 6 ], "texture": "#grass_side", "tintindex": 0 } + } + }, { + "__comment": "TOP LEFT EDGE", + "from": [ 5, 1, 12 ], + "to": [ 11, 7, 15 ], + "faces": { + "up": { "texture": "#grass", "tintindex": 0 }, + "down": { "texture": "#dirt" }, + "north": { "texture": "#dirt" }, + "south": { "texture": "#dirt" }, + "west": { "texture": "#dirt" }, + "east": { "texture": "#dirt" } + } + }, { + "__comment": "TOP RIGHT EDGE", + "from": [ 1, 1, 5 ], + "to": [ 4, 7, 11 ], + "faces": { + "up": { "texture": "#grass", "tintindex": 0 }, + "down": { "texture": "#dirt" }, + "north": { "texture": "#dirt" }, + "south": { "texture": "#dirt" }, + "west": { "texture": "#dirt" }, + "east": { "texture": "#dirt" } + } + }, { + "__comment": "TOP LEFT EDGE GRASS", + "from": [ 5, 1, 12 ], + "to": [ 11, 7, 15 ], + "faces": { + "north": { "uv": [ 0, 1, 3, 7 ], "texture": "#grass_side", "tintindex": 0 }, + "south": { "uv": [ 0, 1, 3, 7 ], "texture": "#grass_side", "tintindex": 0 }, + "west": { "uv": [ 6, 1, 12, 7 ], "texture": "#grass_side", "tintindex": 0 }, + "east": { "uv": [ 6, 1, 12, 7 ], "texture": "#grass_side", "tintindex": 0 } + } + }, { + "__comment": "TOP RIGHT EDGE GRASS", + "from": [ 1, 1, 5 ], + "to": [ 4, 7, 11 ], + "faces": { + "north": { "uv": [ 10, 1, 16, 7 ], "texture": "#grass_side", "tintindex": 0 }, + "south": { "uv": [ 10, 1, 16, 7 ], "texture": "#grass_side", "tintindex": 0 }, + "west": { "uv": [ 0, 1, 3, 7 ], "texture": "#grass_side", "tintindex": 0 }, + "east": { "uv": [ 0, 1, 3, 7 ], "texture": "#grass_side", "tintindex": 0 } + } + }, { + "from": [ 4, 6, 4 ], + "to": [ 12, 6, 12 ], + "faces": { "up": { "texture": "#portal" } } + }, { + "__comment": "RIGHT CORNER", + "from": [ 2, 2, 2 ], + "to": [ 5, 7, 5 ], + "faces": { + "up": { "texture": "#grass", "tintindex": 0 }, + "down": { "texture": "#dirt" }, + "north": { "texture": "#dirt" }, + "south": { "texture": "#dirt" }, + "west": { "texture": "#dirt" }, + "east": { "texture": "#dirt" } + } + }, { + "__comment": "LEFT CORNER", + "from": [ 11, 2, 11 ], + "to": [ 14, 7, 14 ], + "faces": { + "up": { "texture": "#grass", "tintindex": 0 }, + "down": { "texture": "#dirt" }, + "north": { "texture": "#dirt" }, + "south": { "texture": "#dirt" }, + "west": { "texture": "#dirt" }, + "east": { "texture": "#dirt" } + } + }, { + "__comment": "RIGHT CORNER GRASS", + "from": [ 2, 2, 2 ], + "to": [ 5, 7, 5 ], + "faces": { + "north": { "uv": [ 12, 1, 15, 6 ], "texture": "#grass_side", "tintindex": 0 }, + "south": { "uv": [ 12, 1, 15, 6 ], "texture": "#grass_side", "tintindex": 0 }, + "west": { "uv": [ 12, 1, 15, 6 ], "texture": "#grass_side", "tintindex": 0 }, + "east": { "uv": [ 12, 1, 15, 6 ], "texture": "#grass_side", "tintindex": 0 } + } + }, { + "__comment": "LEFT CORNER GRASS", + "from": [ 11, 2, 11 ], + "to": [ 14, 7, 14 ], + "faces": { + "north": { "uv": [ 6, 1, 9, 6 ], "texture": "#grass_side", "tintindex": 0 }, + "south": { "uv": [ 6, 1, 9, 6 ], "texture": "#grass_side", "tintindex": 0 }, + "west": { "uv": [ 6, 1, 9, 6 ], "texture": "#grass_side", "tintindex": 0 }, + "east": { "uv": [ 6, 1, 9, 6 ], "texture": "#grass_side", "tintindex": 0 } + } + }, { + "__comment": "BOTTOM RIGHT EDGE", + "from": [ 5, 1, 1 ], + "to": [ 11, 7, 4 ], + "faces": { + "up": { "texture": "#grass", "tintindex": 0 }, + "down": { "texture": "#dirt" }, + "north": { "texture": "#dirt" }, + "south": { "texture": "#dirt" }, + "west": { "texture": "#dirt" }, + "east": { "texture": "#dirt" } + } + }, { + "__comment": "BOTTOM LEFT EDGE", + "from": [ 12, 1, 5 ], + "to": [ 15, 7, 11 ], + "faces": { + "up": { "texture": "#grass", "tintindex": 0 }, + "down": { "texture": "#dirt" }, + "north": { "texture": "#dirt" }, + "south": { "texture": "#dirt" }, + "west": { "texture": "#dirt" }, + "east": { "texture": "#dirt" } + } + }, { + "__comment": "BOTTOM RIGHT EDGE GRASS", + "from": [ 5, 1, 1 ], + "to": [ 11, 7, 4 ], + "faces": { + "north": { "uv": [ 10, 1, 16, 7 ], "texture": "#grass_side", "tintindex": 0 }, + "south": { "uv": [ 10, 1, 16, 7 ], "texture": "#grass_side", "tintindex": 0 }, + "west": { "uv": [ 0, 1, 3, 7 ], "texture": "#grass_side", "tintindex": 0 }, + "east": { "uv": [ 0, 1, 3, 7 ], "texture": "#grass_side", "tintindex": 0 } + } + }, { + "__comment": "BOTTOM LEFT EDGE GRASS", + "from": [ 12, 1, 5 ], + "to": [ 15, 7, 11 ], + "faces": { + "north": { "uv": [ 0, 1, 3, 7 ], "texture": "#grass_side", "tintindex": 0 }, + "south": { "uv": [ 0, 1, 3, 7 ], "texture": "#grass_side", "tintindex": 0 }, + "west": { "uv": [ 6, 1, 12, 7 ], "texture": "#grass_side", "tintindex": 0 }, + "east": { "uv": [ 6, 1, 12, 7 ], "texture": "#grass_side", "tintindex": 0 } + } + }, { + "__comment": "BOTTOM CORNER", + "from": [ 11, 2, 2 ], + "to": [ 14, 7, 5 ], + "faces": { + "up": { "texture": "#grass", "tintindex": 0 }, + "down": { "texture": "#dirt" }, + "north": { "texture": "#dirt" }, + "south": { "texture": "#dirt" }, + "west": { "texture": "#dirt" }, + "east": { "texture": "#dirt" } + } + }, { + "__comment": "BOTTOM CORNER GRASS", + "from": [ 10.98, 2, 1.98 ], + "to": [ 14.02, 7, 5.02 ], + "faces": { + "north": { "uv": [ 2, 1, 5, 6 ], "texture": "#grass_side", "tintindex": 0 }, + "south": { "uv": [ 2, 1, 5, 6 ], "texture": "#grass_side", "tintindex": 0 }, + "west": { "uv": [ 9, 1, 12, 6 ], "texture": "#grass_side", "tintindex": 0 }, + "east": { "uv": [ 9, 1, 12, 6 ], "texture": "#grass_side", "tintindex": 0 } + } + }, { + "from": [ -2, 7, 4 ], + "to": [ 10, 19, 4 ], + "shade": false, + "rotation": { "origin": [ 4, 0, 4 ], "axis": "y", "angle": 45 }, + "faces": { + "north": { "uv": [ 0, 0, 16, 16 ], "texture": "#plant" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#plant" } + } + }, { + "from": [ 4, 7, -2 ], + "to": [ 4, 19, 10 ], + "shade": false, + "rotation": { "origin": [ 4, 0, 4 ], "axis": "y", "angle": 45 }, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#plant" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#plant" } + } + } + ] +} diff --git a/src/main/resources/assets/twilightforest/models/block/moss_patch.json b/src/main/resources/assets/twilightforest/models/block/moss_patch.json new file mode 100644 index 0000000000..34766e0394 --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/moss_patch.json @@ -0,0 +1,5 @@ +{ + "loader": "twilightforest:patch", + "texture": "twilightforest:block/mosspatch", + "shaggify": true +} diff --git a/src/main/resources/assets/twilightforest/models/block/naga_segment/down.json b/src/main/resources/assets/twilightforest/models/block/naga_segment/down.json new file mode 100644 index 0000000000..4dc1beef68 --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/naga_segment/down.json @@ -0,0 +1,12 @@ +{ + "parent": "block/cube", + "textures": { + "particle": "twilightforest:block/nagastone_cross_section", + "up": "twilightforest:block/nagastone_top_tip", + "down": "twilightforest:block/nagastone_cross_section", + "west": "twilightforest:block/nagastone_tip_up", + "north": "twilightforest:block/nagastone_left_down", + "east": "twilightforest:block/nagastone_cross_section", + "south": "twilightforest:block/nagastone_right_down" + } +} diff --git a/src/main/resources/assets/twilightforest/models/block/naga_segment/horizontal.json b/src/main/resources/assets/twilightforest/models/block/naga_segment/horizontal.json new file mode 100644 index 0000000000..c23770c313 --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/naga_segment/horizontal.json @@ -0,0 +1,12 @@ +{ + "parent": "block/cube", + "textures": { + "particle": "twilightforest:block/nagastone_cross_section", + "up": "twilightforest:block/nagastone_tip_long", + "down": "twilightforest:block/nagastone_bottom_long", + "west": "twilightforest:block/nagastone_cross_section", + "north": "twilightforest:block/nagastone_long_side", + "east": "twilightforest:block/nagastone_cross_section", + "south": "twilightforest:block/nagastone_long_side" + } +} diff --git a/src/main/resources/assets/twilightforest/models/block/naga_segment/up.json b/src/main/resources/assets/twilightforest/models/block/naga_segment/up.json new file mode 100644 index 0000000000..a6be28b8ca --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/naga_segment/up.json @@ -0,0 +1,12 @@ +{ + "parent": "block/cube", + "textures": { + "particle": "twilightforest:block/nagastone_cross_section", + "up": "twilightforest:block/nagastone_cross_section", + "down": "twilightforest:block/nagastone_bottom_tip", + "west": "twilightforest:block/nagastone_tip_down", + "north": "twilightforest:block/nagastone_left_up", + "east": "twilightforest:block/nagastone_cross_section", + "south": "twilightforest:block/nagastone_right_up" + } +} diff --git a/src/main/resources/assets/twilightforest/models/block/naga_segment/vertical.json b/src/main/resources/assets/twilightforest/models/block/naga_segment/vertical.json new file mode 100644 index 0000000000..eceb9776e4 --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/naga_segment/vertical.json @@ -0,0 +1,8 @@ +{ + "parent": "block/cube_column", + "textures": { + "particle": "twilightforest:block/nagastone_cross_section", + "end": "twilightforest:block/nagastone_cross_section", + "side": "twilightforest:block/nagastone_long_vertical" + } +} diff --git a/src/main/resources/assets/twilightforest/models/block/nagastone_head.json b/src/main/resources/assets/twilightforest/models/block/nagastone_head.json new file mode 100644 index 0000000000..c948f6316b --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/nagastone_head.json @@ -0,0 +1,26 @@ +{ + "parent": "block/block", + "textures": { + "down": "twilightforest:block/nagastone_bottom_tip", + "south": "twilightforest:block/nagastone_cross_section", + "north": "twilightforest:block/nagastone_face_front", + "west": "twilightforest:block/nagastone_face_left", + "east": "twilightforest:block/nagastone_face_right", + "up": "twilightforest:block/nagastone_top_tip", + "particle": "twilightforest:block/nagastone_bottom_tip" + }, + "elements": [ + { + "from": [0, 0, 0], + "to": [16, 16, 16], + "faces": { + "north": {"uv": [0, 0, 16, 16], "texture": "#north", "cullface": "north"}, + "east": {"uv": [0, 0, 16, 16], "texture": "#east", "cullface": "east"}, + "south": {"uv": [0, 0, 16, 16], "texture": "#south", "cullface": "south"}, + "west": {"uv": [0, 0, 16, 16], "texture": "#west", "cullface": "west"}, + "up": {"uv": [0, 0, 16, 16], "rotation": 90, "texture": "#up", "cullface": "up"}, + "down": {"uv": [0, 0, 16, 16], "rotation": 270, "texture": "#down", "cullface": "down"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/models/block/pillar/pillar_12_ctm.json b/src/main/resources/assets/twilightforest/models/block/pillar/pillar_12_ctm.json new file mode 100644 index 0000000000..5595011b0a --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/pillar/pillar_12_ctm.json @@ -0,0 +1,31 @@ +{ + "parent": "block/block", + "textures": { + "blank": "twilightforest:block/stone_twist/twist_blank", + "crown": "twilightforest:block/stone_twist/twist_crown", + "particle": "#side_x" + }, + "elements": [{ + "from": [ 2, 0, 0 ], + "to" : [ 14, 16, 16 ], + "faces": { + "west" : { "texture": "#side_x" }, + "east" : { "texture": "#side_x" } + } + }, { + "from": [ 0, 0, 2 ], + "to" : [ 16, 16, 14 ], + "faces": { + "north": { "texture": "#side_z" }, + "south": { "texture": "#side_z" } + } + }, { + "from": [ 0, 3, 0 ], + "to" : [ 16, 13, 16 ], + "faces": { + "up" : { "texture": "#blank", "tintindex": 0 }, + "down": { "texture": "#blank", "tintindex": 0 } + } + }] +} + diff --git a/src/main/resources/assets/twilightforest/models/block/pillar/pillar_bottom.json b/src/main/resources/assets/twilightforest/models/block/pillar/pillar_bottom.json new file mode 100644 index 0000000000..6129b493bc --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/pillar/pillar_bottom.json @@ -0,0 +1,16 @@ +{ + "parent": "block/block", + "elements": [{ + "from": [ 0, 0, 0 ], + "to" : [ 16, 3, 16 ], + "faces": { + "down" : { "texture": "#bottom_cap", "cullface": "down" }, + "up" : { "texture": "#bottom_cap" }, + "north": { "texture": "#bottom_z" , "cullface": "north" }, + "south": { "texture": "#bottom_z" , "cullface": "south" }, + "west" : { "texture": "#bottom_x" , "cullface": "west" }, + "east" : { "texture": "#bottom_x" , "cullface": "east" } + } + }] +} + diff --git a/src/main/resources/assets/twilightforest/models/block/pillar/pillar_inventory.json b/src/main/resources/assets/twilightforest/models/block/pillar/pillar_inventory.json new file mode 100644 index 0000000000..d93ffe3bfa --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/pillar/pillar_inventory.json @@ -0,0 +1,75 @@ +{ + "parent": "block/block", + "textures": { + "blank": "twilightforest:block/stone_twist/twist_blank", + "crown": "twilightforest:block/stone_twist/twist_crown", + "side_x": "twilightforest:block/stone_twist/twist_y", + "side_z": "twilightforest:block/stone_twist/twist_y", + "bottom_cap": "twilightforest:block/stone_twist/cap/end", + "bottom_x": "twilightforest:block/stone_twist/cap/y", + "bottom_z": "twilightforest:block/stone_twist/cap/y", + "top_cap": "twilightforest:block/stone_twist/cap/end", + "top_x": "twilightforest:block/stone_twist/cap/y", + "top_z": "twilightforest:block/stone_twist/cap/y", + "particle": "#side_x" + }, + "elements": [{ + "from": [ 2, 0, 0 ], + "to": [ 14, 16, 16 ], + "faces": { + "west": { + "texture": "#side_x" + }, + "east": { + "texture": "#side_x" + } + } + }, { + "from": [ 0, 0, 2 ], + "to": [ 16, 16, 14 ], + "faces": { + "north": { + "texture": "#side_z" + }, + "south": { + "texture": "#side_z" + } + } + }, { + "from": [ 0, 3, 0 ], + "to": [ 16, 13, 16 ], + "faces": { + "up": { + "texture": "#blank", + "tintindex": 0 + }, + "down": { + "texture": "#blank", + "tintindex": 0 + } + } + }, { + "from": [ 0, 13, 0 ], + "to" : [ 16, 16, 16 ], + "faces": { + "down" : { "texture": "#top_cap" , "tintindex": 0 }, + "up" : { "texture": "#top_cap", "cullface": "up" , "tintindex": 0 }, + "north": { "texture": "#top_z" , "cullface": "north", "tintindex": 1 }, + "south": { "texture": "#top_z" , "cullface": "south", "tintindex": 1 }, + "west" : { "texture": "#top_x" , "cullface": "west" , "tintindex": 2 }, + "east" : { "texture": "#top_x" , "cullface": "east" , "tintindex": 2 } + } + }, { + "from": [ 0, 0, 0 ], + "to" : [ 16, 3, 16 ], + "faces": { + "down" : { "texture": "#bottom_cap", "cullface": "down" , "tintindex": 0 }, + "up" : { "texture": "#bottom_cap" , "tintindex": 0 }, + "north": { "texture": "#bottom_z" , "cullface": "north", "tintindex": 1 }, + "south": { "texture": "#bottom_z" , "cullface": "south", "tintindex": 1 }, + "west" : { "texture": "#bottom_x" , "cullface": "west" , "tintindex": 2 }, + "east" : { "texture": "#bottom_x" , "cullface": "east" , "tintindex": 2 } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/models/block/pillar/pillar_top.json b/src/main/resources/assets/twilightforest/models/block/pillar/pillar_top.json new file mode 100644 index 0000000000..8339826780 --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/pillar/pillar_top.json @@ -0,0 +1,16 @@ +{ + "parent": "block/block", + "elements": [{ + "from": [ 0, 13, 0 ], + "to" : [ 16, 16, 16 ], + "faces": { + "down" : { "texture": "#top_cap" }, + "up" : { "texture": "#top_cap", "cullface": "up" }, + "north": { "texture": "#top_z" , "cullface": "north" }, + "south": { "texture": "#top_z" , "cullface": "south" }, + "west" : { "texture": "#top_x" , "cullface": "west" }, + "east" : { "texture": "#top_x" , "cullface": "east" } + } + }] +} + diff --git a/src/main/resources/assets/twilightforest/models/block/pillar/pillar_x_bottom.json b/src/main/resources/assets/twilightforest/models/block/pillar/pillar_x_bottom.json new file mode 100644 index 0000000000..3667cd1a5e --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/pillar/pillar_x_bottom.json @@ -0,0 +1,19 @@ +{ + "parent": "block/block", + "textures": { + "particle": "#side" + }, + "elements": [{ + "from": [ 0, 0, 0 ], + "to" : [ 16, 3, 16 ], + "faces": { + "down" : { "texture": "#bottom_cap", "cullface": "down" , "tintindex": 0 }, + "up" : { "texture": "#bottom_cap" , "tintindex": 0 }, + "north": { "texture": "#bottom_z" , "cullface": "north", "tintindex": 1 }, + "south": { "texture": "#bottom_z" , "cullface": "south", "tintindex": 1 }, + "west" : { "texture": "#bottom_x" , "cullface": "west" , "tintindex": 2 }, + "east" : { "texture": "#bottom_x" , "cullface": "east" , "tintindex": 2 } + } + }] +} + diff --git a/src/main/resources/assets/twilightforest/models/block/pillar/pillar_x_top.json b/src/main/resources/assets/twilightforest/models/block/pillar/pillar_x_top.json new file mode 100644 index 0000000000..82c2df0331 --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/pillar/pillar_x_top.json @@ -0,0 +1,19 @@ +{ + "parent": "block/block", + "textures": { + "particle": "#side" + }, + "elements": [{ + "from": [ 0, 13, 0 ], + "to" : [ 16, 16, 16 ], + "faces": { + "down" : { "texture": "#top_cap" , "tintindex": 0 }, + "up" : { "texture": "#top_cap", "cullface": "up" , "tintindex": 0 }, + "north": { "texture": "#top_z" , "cullface": "north", "tintindex": 1 }, + "south": { "texture": "#top_z" , "cullface": "south", "tintindex": 1 }, + "west" : { "texture": "#top_x" , "cullface": "west" , "tintindex": 2 }, + "east" : { "texture": "#top_x" , "cullface": "east" , "tintindex": 2 } + } + }] +} + diff --git a/src/main/resources/assets/twilightforest/models/block/pillar/pillar_y_bottom.json b/src/main/resources/assets/twilightforest/models/block/pillar/pillar_y_bottom.json new file mode 100644 index 0000000000..3667cd1a5e --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/pillar/pillar_y_bottom.json @@ -0,0 +1,19 @@ +{ + "parent": "block/block", + "textures": { + "particle": "#side" + }, + "elements": [{ + "from": [ 0, 0, 0 ], + "to" : [ 16, 3, 16 ], + "faces": { + "down" : { "texture": "#bottom_cap", "cullface": "down" , "tintindex": 0 }, + "up" : { "texture": "#bottom_cap" , "tintindex": 0 }, + "north": { "texture": "#bottom_z" , "cullface": "north", "tintindex": 1 }, + "south": { "texture": "#bottom_z" , "cullface": "south", "tintindex": 1 }, + "west" : { "texture": "#bottom_x" , "cullface": "west" , "tintindex": 2 }, + "east" : { "texture": "#bottom_x" , "cullface": "east" , "tintindex": 2 } + } + }] +} + diff --git a/src/main/resources/assets/twilightforest/models/block/pillar/pillar_y_top.json b/src/main/resources/assets/twilightforest/models/block/pillar/pillar_y_top.json new file mode 100644 index 0000000000..82c2df0331 --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/pillar/pillar_y_top.json @@ -0,0 +1,19 @@ +{ + "parent": "block/block", + "textures": { + "particle": "#side" + }, + "elements": [{ + "from": [ 0, 13, 0 ], + "to" : [ 16, 16, 16 ], + "faces": { + "down" : { "texture": "#top_cap" , "tintindex": 0 }, + "up" : { "texture": "#top_cap", "cullface": "up" , "tintindex": 0 }, + "north": { "texture": "#top_z" , "cullface": "north", "tintindex": 1 }, + "south": { "texture": "#top_z" , "cullface": "south", "tintindex": 1 }, + "west" : { "texture": "#top_x" , "cullface": "west" , "tintindex": 2 }, + "east" : { "texture": "#top_x" , "cullface": "east" , "tintindex": 2 } + } + }] +} + diff --git a/src/main/resources/assets/twilightforest/models/block/pillar/pillar_z_bottom.json b/src/main/resources/assets/twilightforest/models/block/pillar/pillar_z_bottom.json new file mode 100644 index 0000000000..3667cd1a5e --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/pillar/pillar_z_bottom.json @@ -0,0 +1,19 @@ +{ + "parent": "block/block", + "textures": { + "particle": "#side" + }, + "elements": [{ + "from": [ 0, 0, 0 ], + "to" : [ 16, 3, 16 ], + "faces": { + "down" : { "texture": "#bottom_cap", "cullface": "down" , "tintindex": 0 }, + "up" : { "texture": "#bottom_cap" , "tintindex": 0 }, + "north": { "texture": "#bottom_z" , "cullface": "north", "tintindex": 1 }, + "south": { "texture": "#bottom_z" , "cullface": "south", "tintindex": 1 }, + "west" : { "texture": "#bottom_x" , "cullface": "west" , "tintindex": 2 }, + "east" : { "texture": "#bottom_x" , "cullface": "east" , "tintindex": 2 } + } + }] +} + diff --git a/src/main/resources/assets/twilightforest/models/block/pillar/pillar_z_top.json b/src/main/resources/assets/twilightforest/models/block/pillar/pillar_z_top.json new file mode 100644 index 0000000000..82c2df0331 --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/pillar/pillar_z_top.json @@ -0,0 +1,19 @@ +{ + "parent": "block/block", + "textures": { + "particle": "#side" + }, + "elements": [{ + "from": [ 0, 13, 0 ], + "to" : [ 16, 16, 16 ], + "faces": { + "down" : { "texture": "#top_cap" , "tintindex": 0 }, + "up" : { "texture": "#top_cap", "cullface": "up" , "tintindex": 0 }, + "north": { "texture": "#top_z" , "cullface": "north", "tintindex": 1 }, + "south": { "texture": "#top_z" , "cullface": "south", "tintindex": 1 }, + "west" : { "texture": "#top_x" , "cullface": "west" , "tintindex": 2 }, + "east" : { "texture": "#top_x" , "cullface": "east" , "tintindex": 2 } + } + }] +} + diff --git a/src/main/resources/assets/twilightforest/models/block/potted_larger_sapling.json b/src/main/resources/assets/twilightforest/models/block/potted_larger_sapling.json new file mode 100644 index 0000000000..b3b58cffae --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/potted_larger_sapling.json @@ -0,0 +1,80 @@ +{ + "ambientocclusion": false, + "textures": { + "particle": "block/flower_pot", + "flowerpot": "block/flower_pot", + "dirt": "block/dirt" + }, + "elements": [ + { + "from": [5, 0, 5], + "to": [6, 6, 11], + "faces": { + "north": {"uv": [10, 10, 11, 16], "texture": "#flowerpot"}, + "east": {"uv": [5, 10, 11, 16], "texture": "#flowerpot"}, + "south": {"uv": [5, 10, 6, 16], "texture": "#flowerpot"}, + "west": {"uv": [5, 10, 11, 16], "texture": "#flowerpot"}, + "up": {"uv": [5, 5, 6, 11], "texture": "#flowerpot"}, + "down": {"uv": [5, 5, 6, 11], "texture": "#flowerpot", "cullface": "down"} + } + }, + { + "from": [10, 0, 5], + "to": [11, 6, 11], + "faces": { + "north": {"uv": [5, 10, 6, 16], "texture": "#flowerpot"}, + "east": {"uv": [5, 10, 11, 16], "texture": "#flowerpot"}, + "south": {"uv": [10, 10, 11, 16], "texture": "#flowerpot"}, + "west": {"uv": [5, 10, 11, 16], "texture": "#flowerpot"}, + "up": {"uv": [10, 5, 11, 11], "texture": "#flowerpot"}, + "down": {"uv": [10, 5, 11, 11], "texture": "#flowerpot", "cullface": "down"} + } + }, + { + "from": [6, 0, 5], + "to": [10, 6, 6], + "faces": { + "north": {"uv": [6, 10, 10, 16], "texture": "#flowerpot"}, + "south": {"uv": [6, 10, 10, 16], "texture": "#flowerpot"}, + "up": {"uv": [6, 5, 10, 6], "texture": "#flowerpot"}, + "down": {"uv": [6, 10, 10, 11], "texture": "#flowerpot", "cullface": "down"} + } + }, + { + "from": [6, 0, 10], + "to": [10, 6, 11], + "faces": { + "north": {"uv": [6, 10, 10, 16], "texture": "#flowerpot"}, + "south": {"uv": [6, 10, 10, 16], "texture": "#flowerpot"}, + "up": {"uv": [6, 10, 10, 11], "texture": "#flowerpot"}, + "down": {"uv": [6, 5, 10, 6], "texture": "#flowerpot", "cullface": "down"} + } + }, + { + "from": [6, 0, 6], + "to": [10, 4, 10], + "faces": { + "up": {"uv": [6, 6, 10, 10], "texture": "#dirt"}, + "down": {"uv": [6, 12, 10, 16], "texture": "#flowerpot", "cullface": "down"} + } + }, + { + "from": [4, 4, 8], + "to": [11.8, 14, 8], + "rotation": {"angle": 45, "axis": "y", "origin": [8, 8, 8], "rescale": true}, + "faces": { + "north": {"uv": [0, 0, 16, 16], "texture": "#plant"}, + "south": {"uv": [0, 0, 16, 16], "texture": "#plant"} + } + }, + { + "from": [8, 4, 4], + "to": [8, 14, 11.8], + "rotation": {"angle": 45, "axis": "y", "origin": [8, 8, 8], "rescale": true}, + "faces": { + "east": {"uv": [0, 0, 16, 16], "texture": "#plant"}, + "west": {"uv": [0, 0, 16, 16], "texture": "#plant"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/models/block/potted_mayapple.json b/src/main/resources/assets/twilightforest/models/block/potted_mayapple.json new file mode 100644 index 0000000000..bb4ee4cb6f --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/potted_mayapple.json @@ -0,0 +1,87 @@ +{ + "ambientocclusion": false, + "render_type": "minecraft:cutout", + "textures": { + "top": "twilightforest:block/mayapple", + "stem": "twilightforest:block/mayapple_side", + "dirt": "block/dirt", + "particle": "block/flower_pot", + "flowerpot": "block/flower_pot" + }, + "elements": [ + { + "from": [5, 0, 5], + "to": [11, 6, 11], + "faces": { + "north": {"uv": [5, 10, 11, 16], "texture": "#flowerpot"}, + "east": {"uv": [5, 10, 11, 16], "texture": "#flowerpot"}, + "south": {"uv": [5, 10, 11, 16], "texture": "#flowerpot"}, + "west": {"uv": [5, 10, 11, 16], "texture": "#flowerpot"}, + "up": {"uv": [5, 5, 11, 11], "texture": "#flowerpot"}, + "down": {"uv": [5, 5, 6, 11], "texture": "#flowerpot", "cullface": "down"} + } + }, + { + "from": [6, 5, 6], + "to": [10, 5, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [14, 13, 14]}, + "faces": { + "up": {"uv": [4, 4, 9, 9], "texture": "#dirt"} + } + }, + { + "from": [7.5, 2, 7.5], + "to": [8.5, 8, 8.5], + "rotation": {"angle": 0, "axis": "y", "origin": [23, 10, 15]}, + "faces": { + "north": {"uv": [8, 10, 9, 16], "texture": "#stem"}, + "east": {"uv": [8, 10, 9, 16], "texture": "#stem"}, + "south": {"uv": [8, 10, 9, 16], "texture": "#stem"}, + "west": {"uv": [8, 10, 9, 16], "texture": "#stem"}, + "up": {"uv": [8, 15, 9, 16], "texture": "#stem"}, + "down": {"uv": [8, 15, 9, 16], "texture": "#stem"} + } + }, + { + "from": [4, 8, 4], + "to": [12, 8, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [12, 16, 12]}, + "faces": { + "up": {"uv": [4, 4, 13, 13], "texture": "#top"}, + "down": {"uv": [4, 4, 13, 13], "texture": "#top"} + } + }, + { + "from": [6, 5, 6], + "to": [10, 6, 6], + "rotation": {"angle": 0, "axis": "y", "origin": [14, 13, 14]}, + "faces": { + "south": {"uv": [6, 10, 10, 11], "texture": "#flowerpot"} + } + }, + { + "from": [6, 5, 10], + "to": [10, 6, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [14, 13, 18]}, + "faces": { + "north": {"uv": [6, 10, 10, 11], "texture": "#flowerpot"} + } + }, + { + "from": [6, 5, 6], + "to": [6, 6, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [14, 13, 14]}, + "faces": { + "east": {"uv": [6, 10, 10, 11], "texture": "#flowerpot"} + } + }, + { + "from": [10, 5, 6], + "to": [10, 6, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [18, 13, 14]}, + "faces": { + "west": {"uv": [6, 10, 10, 11], "texture": "#flowerpot"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/models/block/potted_thorn_template.json b/src/main/resources/assets/twilightforest/models/block/potted_thorn_template.json new file mode 100644 index 0000000000..08d0f9317c --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/potted_thorn_template.json @@ -0,0 +1,51 @@ +{ + "ambientocclusion": false, + "render_type": "minecraft:cutout", + "textures": { + "particle": "block/flower_pot", + "flowerpot": "block/flower_pot" + }, + "elements": [ + { + "from": [5, 0, 5], + "to": [11, 6, 11], + "faces": { + "north": {"uv": [5, 10, 11, 16], "texture": "#flowerpot"}, + "east": {"uv": [5, 10, 11, 16], "texture": "#flowerpot"}, + "south": {"uv": [5, 10, 11, 16], "texture": "#flowerpot"}, + "west": {"uv": [5, 10, 11, 16], "texture": "#flowerpot"}, + "up": {"uv": [5, 5, 11, 11], "texture": "#flowerpot"}, + "down": {"uv": [5, 5, 6, 11], "texture": "#flowerpot", "cullface": "down"} + } + }, + { + "from": [6, 5, 6], + "to": [10, 16, 10], + "faces": { + "north": {"uv": [6, 0, 10, 12], "texture": "#thorn_side"}, + "east": {"uv": [6, 0, 10, 12], "texture": "#thorn_side"}, + "south": {"uv": [6, 0, 10, 12], "texture": "#thorn_side"}, + "west": {"uv": [6, 0, 10, 12], "texture": "#thorn_side"}, + "up": {"uv": [6, 6, 10, 10], "texture": "#thorn_top", "cullface": "up"} + } + }, + { + "from": [8.25, 5, 2.5], + "to": [17.25, 16, 2.5], + "rotation": {"angle": 45, "axis": "y", "origin": [17, 13, 11]}, + "faces": { + "north": {"uv": [0, 0, 16, 16], "texture": "#thorn_side"}, + "south": {"uv": [0, 0, 16, 16], "texture": "#thorn_side"} + } + }, + { + "from": [8.5, 5, -3.75], + "to": [8.5, 16, 5.25], + "rotation": {"angle": 45, "axis": "y", "origin": [17, 13, 5]}, + "faces": { + "east": {"uv": [0, 0, 16, 16], "texture": "#thorn_side"}, + "west": {"uv": [0, 0, 16, 16], "texture": "#thorn_side"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/models/block/root_strand.json b/src/main/resources/assets/twilightforest/models/block/root_strand.json new file mode 100644 index 0000000000..5df558e5ee --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/root_strand.json @@ -0,0 +1,43 @@ +{ + "__comment": "[VanillaCopy] crop.json, raised by 1 in the Y coordinate", + "ambientocclusion": false, + "render_type": "minecraft:cutout", + "textures": { + "particle": "#crop", + "crop": "twilightforest:block/root_strand" + }, + "elements": [ + { "from": [ 4, 0, 0 ], + "to": [ 4, 16, 16 ], + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#crop" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#crop" } + } + }, + { "from": [ 12, 0, 0 ], + "to": [ 12, 16, 16 ], + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#crop" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#crop" } + } + }, + { "from": [ 0, 0, 4 ], + "to": [ 16, 16, 4 ], + "shade": false, + "faces": { + "north": { "uv": [ 0, 0, 16, 16 ], "texture": "#crop" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#crop" } + } + }, + { "from": [ 0, 0, 12 ], + "to": [ 16, 16, 12 ], + "shade": false, + "faces": { + "north": { "uv": [ 0, 0, 16, 16 ], "texture": "#crop" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#crop" } + } + } + ] +} diff --git a/src/main/resources/assets/twilightforest/models/block/slider.json b/src/main/resources/assets/twilightforest/models/block/slider.json new file mode 100755 index 0000000000..7ff1ded57d --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/slider.json @@ -0,0 +1,22 @@ +{ + "parent": "block/block", + "textures": { + "side": "twilightforest:block/slider_v", + "end": "twilightforest:block/slider_top", + "particle": "twilightforest:block/slider_v" + }, + "elements": [ + { + "from": [ 5, 0, 5 ], + "to": [ 11, 16, 11 ], + "faces": { + "down": { "uv": [ 5, 5, 11, 11 ], "texture": "#end", "cullface": "down" }, + "up": { "uv": [ 5, 5, 11, 11 ], "texture": "#end", "cullface": "up"}, + "north": { "uv": [ 5, 0, 11, 16 ], "texture": "#side"}, + "south": { "uv": [ 5, 0, 11, 16 ], "texture": "#side"}, + "west": { "uv": [ 5, 0, 11, 16 ], "texture": "#side"}, + "east": { "uv": [ 5, 0, 11, 16 ], "texture": "#side"} + } + } + ] +} diff --git a/src/main/resources/assets/twilightforest/models/block/slider_horiz.json b/src/main/resources/assets/twilightforest/models/block/slider_horiz.json new file mode 100644 index 0000000000..4d365b9177 --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/slider_horiz.json @@ -0,0 +1,22 @@ +{ + "parent": "block/block", + "textures": { + "side": "twilightforest:block/slider_h_90", + "end": "twilightforest:block/slider_top", + "particle": "twilightforest:block/slider_h_90" + }, + "elements": [ + { + "from": [ 5, 0, 5 ], + "to": [ 11, 16, 11 ], + "faces": { + "down": { "uv": [ 5, 5, 11, 11 ], "texture": "#end", "cullface": "down" }, + "up": { "uv": [ 5, 5, 11, 11 ], "texture": "#end", "cullface": "up"}, + "north": { "uv": [ 5, 0, 11, 16 ], "texture": "#side"}, + "south": { "uv": [ 5, 0, 11, 16 ], "texture": "#side"}, + "west": { "uv": [ 5, 0, 11, 16 ], "texture": "#side"}, + "east": { "uv": [ 5, 0, 11, 16 ], "texture": "#side"} + } + } + ] +} diff --git a/src/main/resources/assets/twilightforest/models/block/spiral_bricks/spiral_quarter.json b/src/main/resources/assets/twilightforest/models/block/spiral_bricks/spiral_quarter.json new file mode 100644 index 0000000000..672e6a38fc --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/spiral_bricks/spiral_quarter.json @@ -0,0 +1,112 @@ +{ + "parent": "block/block", + "textures": { + "all": "twilightforest:block/stone_spiral_large", + "border": "block/stonebrick_carved", + "particle": "block/stonebrick_carved" + }, + "elements": [ + { + "from": [ 0, 13, 0 ], + "to": [ 8, 16, 16 ], + "faces": { + "up": { "texture": "#border", "cullface": "up" }, + "down": { "texture": "#border" }, + "north": { "texture": "#border", "cullface": "north" }, + "south": { "texture": "#border", "cullface": "south" }, + "west": { "uv": [ 8, 0, 16, 1.5 ], "texture": "#all", "cullface": "west" } + } + }, + { + "from": [ 0, 0, 13 ], + "to": [ 8, 13, 16 ], + "faces": { + "down": { "texture": "#border", "cullface": "down" }, + "north": { "texture": "#border" }, + "south": { "texture": "#border", "cullface": "south" }, + "west": { "uv": [ 14.5, 1.5, 16, 8 ], "texture": "#all", "cullface": "west" } + } + }, + { + "from": [ 0.5, 10, 0 ], + "to": [ 8 , 13, 13 ], + "faces": { + "down": { "texture": "#border" }, + "north": { "texture": "#border", "cullface": "north" }, + "west": { "uv": [ 8, 1.5, 14.5, 3 ], "texture": "#all" } + } + }, + { + "from": [ 1, 7, 0 ], + "to": [ 8, 10, 10 ], + "faces": { + "down": { "texture": "#border" }, + "north": { "texture": "#border", "cullface": "north" }, + "west": { "uv": [ 8, 3, 13, 4.5 ], "texture": "#all" } + } + }, + { + "from": [ 1.5, 4, 0 ], + "to": [ 8 , 7, 7 ], + "faces": { + "down": { "texture": "#border" }, + "north": { "texture": "#border", "cullface": "north" }, + "west": { "uv": [ 8, 4.5, 11.5, 6 ], "texture": "#all" } + } + }, + { + "from": [ 2, 1, 0 ], + "to": [ 8, 4, 4 ], + "faces": { + "down": { "texture": "#border" }, + "north": { "texture": "#border", "cullface": "north" }, + "west": { "uv": [ 8, 6, 10, 7.5 ], "texture": "#all" } + } + }, + { + "from": [ 0.5, 0, 10 ], + "to": [ 8 , 10, 13 ], + "faces": { + "down": { "texture": "#border", "cullface": "down" }, + "north": { "texture": "#border" }, + "west": { "uv": [ 13, 3, 14.5, 8 ], "texture": "#all" } + } + }, + { + "from": [ 1, 0, 7 ], + "to": [ 8, 7, 10 ], + "faces": { + "down": { "texture": "#border", "cullface": "down" }, + "north": { "texture": "#border" }, + "west": { "uv": [ 11.5, 4.5, 13, 8 ], "texture": "#all" } + } + }, + { + "from": [ 1.5, 0, 4 ], + "to": [ 8 , 4, 7 ], + "faces": { + "down": { "texture": "#border", "cullface": "down" }, + "north": { "texture": "#border" }, + "west": { "uv": [ 10, 6, 11.5, 8 ], "texture": "#all" } + } + }, + { + "from": [ 2, 0, 1 ], + "to": [ 8, 1, 4 ], + "faces": { + "down": { "texture": "#border", "cullface": "down" }, + "north": { "texture": "#border" }, + "west": { "uv": [ 8.5, 7.5, 10, 8 ], "texture": "#all" } + } + }, + { + "from": [ 2.5, 0, 0 ], + "to": [ 8 , 1, 1 ], + "faces": { + "down": { "texture": "#border", "cullface": "down" }, + "north": { "texture": "#border", "cullface": "north" }, + "west": { "uv": [ 8, 7.5, 8.5, 8 ], "texture": "#all" } + } + } + ] +} diff --git a/src/main/resources/assets/twilightforest/models/block/spiral_bricks/x_spiral_bottom_left.json b/src/main/resources/assets/twilightforest/models/block/spiral_bricks/x_spiral_bottom_left.json new file mode 100644 index 0000000000..5e8d21fdcd --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/spiral_bricks/x_spiral_bottom_left.json @@ -0,0 +1,371 @@ +{ + "parent": "block/block", + "textures": { + "inner_a": "twilightforest:block/spiral_inner_down", + "pattern": "twilightforest:block/stone_spiral_large", + "particle": "block/chiseled_stone_bricks", + "border": "block/chiseled_stone_bricks", + "shadow_y": "twilightforest:block/spiral_shadow_x" + }, + "elements": [ + { + "from": [3.25, 15, 12], + "to": [8, 16, 15], + "shade": false, + "faces": { + "south": {"uv": [1.5, 15, 6.25, 16], "rotation": 180, "texture": "#inner_a"}, + "down": {"uv": [3.25, 1, 8, 4], "texture": "#shadow_y"} + } + }, + { + "from": [2.25, 12, 9], + "to": [8, 16, 12], + "shade": false, + "faces": { + "south": {"uv": [8, 12, 13.75, 16], "rotation": 180, "texture": "#shadow_y"}, + "down": {"uv": [2.25, 4, 8, 7], "texture": "#shadow_y"} + } + }, + { + "from": [1.25, 9, 6], + "to": [8, 16, 9], + "shade": false, + "faces": { + "south": {"uv": [6, 9, 13, 16], "rotation": 180, "texture": "#shadow_y"}, + "down": {"uv": [1.25, 7, 8, 10], "texture": "#shadow_y"} + } + }, + { + "from": [0.25, 6, 3], + "to": [8, 16, 6], + "shade": false, + "faces": { + "south": {"uv": [6, 6, 14, 16], "rotation": 180, "texture": "#shadow_y"}, + "down": {"uv": [0.25, 10, 8, 13], "texture": "#shadow_y"} + } + }, + { + "from": [3.5, 12, 12], + "to": [8, 15, 16], + "shade": false, + "faces": { + "up": {"uv": [4, 12, 9, 16], "texture": "#shadow_y"} + } + }, + { + "from": [2.5, 9, 9], + "to": [8, 12, 16], + "shade": false, + "faces": { + "up": {"uv": [3, 9, 9, 16], "texture": "#shadow_y"} + } + }, + { + "from": [1.5, 6, 6], + "to": [8, 9, 16], + "shade": false, + "faces": { + "up": {"uv": [2, 6, 9, 16], "texture": "#shadow_y"} + } + }, + { + "from": [0.5, 3, 3], + "to": [8, 6, 16], + "shade": false, + "faces": { + "up": {"uv": [2, 3, 10, 16], "texture": "#shadow_y"} + } + }, + { + "from": [0, 3, 0], + "to": [8, 16, 3], + "shade": false, + "faces": { + "south": {"uv": [6, 3, 14, 16], "rotation": 180, "texture": "#shadow_y"} + } + }, + { + "from": [0, 0, 0], + "to": [8, 3, 16], + "shade": false, + "faces": { + "up": {"uv": [1, 0, 9, 16], "texture": "#shadow_y"} + } + }, + { + "from": [4.25, 15, 15], + "to": [8, 16, 16], + "faces": { + "south": {"uv": [3, 15, 6.75, 16], "rotation": 180, "texture": "#inner_a", "cullface": "south"}, + "west": {"uv": [7.5, 8, 8, 8.5], "texture": "#pattern"}, + "up": {"uv": [4.25, 15, 8, 16], "texture": "#inner_a", "cullface": "up"} + } + }, + { + "from": [3.25, 15, 12], + "to": [8, 16, 15], + "faces": { + "west": {"uv": [6, 8, 7.5, 8.5], "texture": "#pattern"}, + "up": {"uv": [3.25, 12, 8, 15], "texture": "#inner_a", "cullface": "up"} + } + }, + { + "from": [2.25, 12, 9], + "to": [8, 16, 12], + "faces": { + "west": {"uv": [4.5, 8, 6, 10], "texture": "#pattern"}, + "up": {"uv": [2.25, 9, 8, 12], "texture": "#inner_a", "cullface": "up"} + } + }, + { + "from": [1.25, 9, 6], + "to": [8, 16, 9], + "faces": { + "west": {"uv": [3, 8, 4.5, 11.5], "texture": "#pattern"}, + "up": {"uv": [1.25, 6, 8, 9], "texture": "#inner_a", "cullface": "up"} + } + }, + { + "from": [0.25, 6, 3], + "to": [8, 16, 6], + "faces": { + "west": {"uv": [1.5, 8, 3, 13], "texture": "#pattern"}, + "up": {"uv": [0.25, 3, 8, 6], "texture": "#inner_a", "cullface": "up"} + } + }, + { + "from": [3.5, 12, 12], + "to": [8, 15, 16], + "faces": { + "south": {"uv": [2, 12, 6.5, 15], "texture": "#inner_a", "cullface": "south"}, + "west": {"uv": [6, 8.5, 8, 10], "texture": "#pattern"} + } + }, + { + "from": [2.5, 9, 9], + "to": [8, 12, 16], + "faces": { + "south": {"uv": [2, 9, 7.5, 12], "texture": "#inner_a", "cullface": "south"}, + "west": {"uv": [4.5, 10, 8, 11.5], "texture": "#pattern"} + } + }, + { + "from": [1.5, 6, 6], + "to": [8, 9, 16], + "faces": { + "south": {"uv": [2, 6, 8.5, 9], "texture": "#inner_a", "cullface": "south"}, + "west": {"uv": [3, 11.5, 8, 13], "texture": "#pattern"} + } + }, + { + "from": [0.5, 3, 3], + "to": [8, 6, 16], + "faces": { + "south": {"uv": [1, 3, 8.5, 6], "texture": "#inner_a", "cullface": "south"}, + "west": {"uv": [1.5, 13, 8, 14.5], "texture": "#pattern"} + } + }, + { + "from": [0, 3, 0], + "to": [8, 16, 3], + "faces": { + "north": {"uv": [0, 3, 8, 16], "rotation": 180, "texture": "#border", "cullface": "north"}, + "west": {"uv": [0, 8, 1.5, 14.5], "texture": "#pattern", "cullface": "west"}, + "up": {"uv": [0, 0, 8, 3], "texture": "#inner_a", "cullface": "up"} + } + }, + { + "from": [0, 0, 0], + "to": [8, 3, 16], + "faces": { + "north": {"uv": [0, 0, 8, 3], "rotation": 180, "texture": "#border", "cullface": "north"}, + "south": {"uv": [0, 0, 8, 3], "texture": "#inner_a", "cullface": "south"}, + "west": {"uv": [0, 14.5, 8, 16], "texture": "#pattern", "cullface": "west"}, + "down": {"uv": [0, 0, 8, 16], "texture": "#border", "cullface": "down"} + } + }, + { + "from": [8, 12, 15], + "to": [12.5, 15, 16], + "shade": false, + "faces": { + "north": {"uv": [3.5, 1, 8, 4], "texture": "#shadow_y"}, + "up": {"uv": [12.5, 16, 8, 15], "rotation": 180, "texture": "#shadow_y"} + } + }, + { + "from": [8, 9, 12], + "to": [13.5, 12, 16], + "shade": false, + "faces": { + "north": {"uv": [2.5, 4, 8, 7], "texture": "#shadow_y"}, + "up": {"uv": [13, 16, 7, 12], "rotation": 180, "texture": "#shadow_y"} + } + }, + { + "from": [8, 6, 9], + "to": [14.5, 9, 16], + "shade": false, + "faces": { + "north": {"uv": [1.5, 7, 8, 10], "texture": "#shadow_y"}, + "up": {"uv": [13, 16, 6, 9], "rotation": 180, "texture": "#shadow_y"} + } + }, + { + "from": [8, 3, 6], + "to": [15.5, 6, 16], + "shade": false, + "faces": { + "north": {"uv": [0.5, 10, 8, 13], "texture": "#shadow_y"}, + "up": {"uv": [14, 16, 6, 6], "rotation": 180, "texture": "#shadow_y"} + } + }, + { + "from": [8, 12, 12], + "to": [12.25, 16, 15], + "shade": false, + "faces": { + "south": {"uv": [3.75, 12, 8, 16], "rotation": 180, "texture": "#shadow_y"} + } + }, + { + "from": [8, 9, 9], + "to": [13.25, 16, 12], + "shade": false, + "faces": { + "south": {"uv": [4, 9, 9, 16], "rotation": 180, "texture": "#shadow_y"} + } + }, + { + "from": [8, 6, 6], + "to": [14.25, 16, 9], + "shade": false, + "faces": { + "south": {"uv": [2, 6, 8, 16], "rotation": 180, "texture": "#shadow_y"} + } + }, + { + "from": [8, 3, 3], + "to": [15.25, 16, 6], + "shade": false, + "faces": { + "south": {"uv": [2, 3, 9, 16], "rotation": 180, "texture": "#shadow_y"} + } + }, + { + "from": [8, 0, 3], + "to": [16, 3, 16], + "shade": false, + "faces": { + "up": {"uv": [15, 16, 7, 3], "rotation": 180, "texture": "#shadow_y"} + } + }, + { + "from": [8, 0, 0], + "to": [16, 16, 3], + "shade": false, + "faces": { + "south": {"uv": [1, 0, 9, 16], "rotation": 180, "texture": "#shadow_y"} + } + }, + { + "from": [8, 15, 15], + "to": [11.75, 16, 16], + "faces": { + "east": {"uv": [8, 8, 8.5, 8.5], "rotation": 90, "texture": "#pattern"}, + "south": {"uv": [8, 15, 11.75, 16], "rotation": 180, "texture": "#inner_a", "cullface": "south"}, + "up": {"uv": [11.75, 16, 8, 15], "rotation": 180, "texture": "#inner_a", "cullface": "up"} + } + }, + { + "from": [8, 12, 15], + "to": [12.5, 15, 16], + "faces": { + "east": {"uv": [8, 8.5, 8.5, 10], "texture": "#pattern"}, + "south": {"uv": [8, 12, 12.5, 15], "texture": "#inner_a", "cullface": "south"} + } + }, + { + "from": [8, 9, 12], + "to": [13.5, 12, 16], + "faces": { + "east": {"uv": [8, 10, 10, 11.5], "texture": "#pattern"}, + "south": {"uv": [9, 9, 14.5, 12], "texture": "#inner_a", "cullface": "south"} + } + }, + { + "from": [8, 6, 9], + "to": [14.5, 9, 16], + "faces": { + "east": {"uv": [8, 11.5, 11.5, 13], "texture": "#pattern"}, + "south": {"uv": [8, 6, 14.5, 9], "texture": "#inner_a", "cullface": "south"} + } + }, + { + "from": [8, 3, 6], + "to": [15.5, 6, 16], + "faces": { + "east": {"uv": [7.5, 13, 13, 14.5], "texture": "#pattern"}, + "south": {"uv": [8, 3, 15.5, 6], "texture": "#inner_a", "cullface": "south"} + } + }, + { + "from": [8, 12, 12], + "to": [12.25, 16, 15], + "faces": { + "east": {"uv": [8.5, 8, 10, 10], "texture": "#pattern"}, + "up": {"uv": [12, 15, 7.75, 12], "rotation": 180, "texture": "#inner_a", "cullface": "up"} + } + }, + { + "from": [8, 9, 9], + "to": [13.25, 16, 12], + "faces": { + "east": {"uv": [10, 8, 11.5, 11.5], "texture": "#pattern"}, + "up": {"uv": [13, 12, 7.75, 9], "rotation": 180, "texture": "#inner_a", "cullface": "up"} + } + }, + { + "from": [8, 6, 6], + "to": [14.25, 16, 9], + "faces": { + "east": {"uv": [11.5, 8, 13, 13], "texture": "#pattern"}, + "up": {"uv": [14, 9, 7.75, 6], "rotation": 180, "texture": "#inner_a", "cullface": "up"} + } + }, + { + "from": [8, 3, 3], + "to": [15.25, 16, 6], + "faces": { + "east": {"uv": [13, 8, 14.5, 14.5], "texture": "#pattern"}, + "up": {"uv": [16, 6, 8.75, 3], "rotation": 180, "texture": "#inner_a", "cullface": "up"} + } + }, + { + "from": [8, 0, 3], + "to": [16, 3, 16], + "faces": { + "east": {"uv": [7.5, 14.5, 14, 16], "texture": "#pattern", "cullface": "east"}, + "south": {"uv": [8, 0, 16, 3], "texture": "#inner_a", "cullface": "south"}, + "down": {"uv": [16, 13, 8, 0], "rotation": 180, "texture": "#border", "cullface": "down"} + } + }, + { + "from": [8, 0, 0], + "to": [16, 16, 3], + "faces": { + "north": {"uv": [8, 0, 16, 16], "rotation": 180, "texture": "#border", "cullface": "north"}, + "east": {"uv": [14.5, 8, 16, 16], "texture": "#pattern", "cullface": "east"}, + "up": {"uv": [16, 3, 8, 0], "rotation": 180, "texture": "#inner_a", "cullface": "up"}, + "down": {"uv": [16, 16, 8, 13], "rotation": 180, "texture": "#border", "cullface": "down"} + } + } + ], + "groups": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, + { + "name": "group", + "origin": [8, 8, 8], + "children": [21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/models/block/spiral_bricks/x_spiral_bottom_right.json b/src/main/resources/assets/twilightforest/models/block/spiral_bricks/x_spiral_bottom_right.json new file mode 100644 index 0000000000..5f97a39ce1 --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/spiral_bricks/x_spiral_bottom_right.json @@ -0,0 +1,371 @@ +{ + "parent": "block/block", + "textures": { + "pattern": "twilightforest:block/stone_spiral_large", + "particle": "block/chiseled_stone_bricks", + "border": "block/chiseled_stone_bricks", + "shadow_y": "twilightforest:block/spiral_shadow_x", + "inner_a": "twilightforest:block/spiral_inner_down" + }, + "elements": [ + { + "from": [3.5, 12, 0], + "to": [8, 15, 1], + "shade": false, + "faces": { + "south": {"uv": [3.5, 1, 8, 4], "texture": "#shadow_y"}, + "up": {"uv": [8, 15, 12.5, 16], "rotation": 180, "texture": "#shadow_y"} + } + }, + { + "from": [2.5, 9, 0], + "to": [8, 12, 4], + "shade": false, + "faces": { + "south": {"uv": [2.5, 4, 8, 7], "texture": "#shadow_y"}, + "up": {"uv": [6, 12, 12, 16], "rotation": 180, "texture": "#shadow_y"} + } + }, + { + "from": [1.5, 6, 0], + "to": [8, 9, 7], + "shade": false, + "faces": { + "south": {"uv": [1.5, 7, 8, 10], "texture": "#shadow_y"}, + "up": {"uv": [6, 9, 13, 16], "rotation": 180, "texture": "#shadow_y"} + } + }, + { + "from": [0.5, 3, 0], + "to": [8, 6, 10], + "shade": false, + "faces": { + "south": {"uv": [0.5, 10, 8, 13], "texture": "#shadow_y"}, + "up": {"uv": [6, 6, 14, 16], "rotation": 180, "texture": "#shadow_y"} + } + }, + { + "from": [3.75, 12, 1], + "to": [8, 16, 4], + "shade": false, + "faces": { + "north": {"uv": [3.75, 12, 8, 16], "rotation": 180, "texture": "#shadow_y"} + } + }, + { + "from": [2.75, 9, 4], + "to": [8, 16, 7], + "shade": false, + "faces": { + "north": {"uv": [3, 9, 8, 16], "rotation": 180, "texture": "#shadow_y"} + } + }, + { + "from": [1.75, 6, 7], + "to": [8, 16, 10], + "shade": false, + "faces": { + "north": {"uv": [2, 6, 8, 16], "rotation": 180, "texture": "#shadow_y"} + } + }, + { + "from": [0.75, 3, 10], + "to": [8, 16, 13], + "shade": false, + "faces": { + "north": {"uv": [2, 3, 9, 16], "rotation": 180, "texture": "#shadow_y"} + } + }, + { + "from": [0, 0, 0], + "to": [8, 3, 13], + "shade": false, + "faces": { + "up": {"uv": [7, 3, 15, 16], "rotation": 180, "texture": "#shadow_y"} + } + }, + { + "from": [0, 0, 13], + "to": [8, 16, 16], + "shade": false, + "faces": { + "north": {"uv": [1, 0, 9, 16], "rotation": 180, "texture": "#shadow_y"} + } + }, + { + "from": [4.25, 15, 0], + "to": [8, 16, 1], + "faces": { + "north": {"uv": [8, 15, 11.75, 16], "rotation": 180, "texture": "#inner_a", "cullface": "north"}, + "west": {"uv": [8, 8, 8.5, 8.5], "rotation": 90, "texture": "#pattern"}, + "up": {"uv": [8, 15, 11.75, 16], "rotation": 180, "texture": "#inner_a", "cullface": "up"} + } + }, + { + "from": [3.5, 12, 0], + "to": [8, 15, 1], + "faces": { + "north": {"uv": [8, 12, 12.5, 15], "texture": "#inner_a", "cullface": "north"}, + "west": {"uv": [8, 8.5, 8.5, 10], "texture": "#pattern"} + } + }, + { + "from": [2.5, 9, 0], + "to": [8, 12, 4], + "faces": { + "north": {"uv": [9, 9, 14.5, 12], "texture": "#inner_a", "cullface": "north"}, + "west": {"uv": [8, 10, 10, 11.5], "texture": "#pattern"} + } + }, + { + "from": [1.5, 6, 0], + "to": [8, 9, 7], + "faces": { + "north": {"uv": [8, 6, 14.5, 9], "texture": "#inner_a", "cullface": "north"}, + "west": {"uv": [8, 11.5, 11.5, 13], "texture": "#pattern"} + } + }, + { + "from": [0.5, 3, 0], + "to": [8, 6, 10], + "faces": { + "north": {"uv": [8, 3, 15.5, 6], "texture": "#inner_a", "cullface": "north"}, + "west": {"uv": [7.5, 13, 13, 14.5], "texture": "#pattern"} + } + }, + { + "from": [3.75, 12, 1], + "to": [8, 16, 4], + "faces": { + "west": {"uv": [8.5, 8, 10, 10], "texture": "#pattern"}, + "up": {"uv": [7.75, 12, 12, 15], "texture": "#inner_a", "cullface": "up"} + } + }, + { + "from": [2.75, 9, 4], + "to": [8, 16, 7], + "faces": { + "west": {"uv": [10, 8, 11.5, 11.5], "texture": "#pattern"}, + "up": {"uv": [7.75, 9, 13, 12], "texture": "#inner_a", "cullface": "up"} + } + }, + { + "from": [1.75, 6, 7], + "to": [8, 16, 10], + "faces": { + "west": {"uv": [11.5, 8, 13, 13], "texture": "#pattern"}, + "up": {"uv": [7.75, 6, 14, 9], "texture": "#inner_a", "cullface": "up"} + } + }, + { + "from": [0.75, 3, 10], + "to": [8, 16, 13], + "faces": { + "west": {"uv": [13, 8, 14.5, 14.5], "texture": "#pattern"}, + "up": {"uv": [8.75, 3, 16, 6], "texture": "#inner_a", "cullface": "up"} + } + }, + { + "from": [0, 0, 0], + "to": [8, 3, 13], + "faces": { + "north": {"uv": [8, 0, 16, 3], "texture": "#inner_a", "cullface": "north"}, + "west": {"uv": [7.5, 14.5, 14, 16], "texture": "#pattern", "cullface": "west"}, + "down": {"uv": [0, 3, 8, 16], "texture": "#border", "cullface": "down"} + } + }, + { + "from": [0, 0, 13], + "to": [8, 16, 16], + "faces": { + "south": {"uv": [0, 0, 8, 16], "texture": "#border", "cullface": "south"}, + "west": {"uv": [14.5, 8, 16, 16], "texture": "#pattern", "cullface": "west"}, + "up": {"uv": [8, 0, 16, 3], "texture": "#inner_a", "cullface": "up"}, + "down": {"uv": [0, 0, 8, 3], "texture": "#border", "cullface": "down"} + } + }, + { + "from": [8, 15, 1], + "to": [12.75, 16, 4], + "shade": false, + "faces": { + "north": {"uv": [2, 15, 7, 16], "rotation": 180, "texture": "#shadow_y"}, + "down": {"uv": [8, 4, 3.25, 1], "texture": "#shadow_y"} + } + }, + { + "from": [8, 12, 4], + "to": [13.75, 16, 7], + "shade": false, + "faces": { + "north": {"uv": [6, 12, 12, 16], "rotation": 180, "texture": "#shadow_y"}, + "down": {"uv": [8, 7, 2.25, 4], "texture": "#shadow_y"} + } + }, + { + "from": [8, 9, 7], + "to": [14.75, 16, 10], + "shade": false, + "faces": { + "north": {"uv": [6, 9, 13, 16], "rotation": 180, "texture": "#shadow_y"}, + "down": {"uv": [8, 10, 1.25, 7], "texture": "#shadow_y"} + } + }, + { + "from": [8, 6, 10], + "to": [15.75, 16, 13], + "shade": false, + "faces": { + "north": {"uv": [6, 6, 14, 16], "rotation": 180, "texture": "#shadow_y"}, + "down": {"uv": [8, 13, 0.25, 10], "texture": "#shadow_y"} + } + }, + { + "from": [8, 12, 0], + "to": [12.5, 15, 4], + "shade": false, + "faces": { + "up": {"uv": [9, 16, 4, 12], "texture": "#shadow_y"} + } + }, + { + "from": [8, 9, 0], + "to": [13.5, 12, 7], + "shade": false, + "faces": { + "up": {"uv": [10, 16, 4, 9], "texture": "#shadow_y"} + } + }, + { + "from": [8, 6, 0], + "to": [14.5, 9, 10], + "shade": false, + "faces": { + "up": {"uv": [10, 16, 3, 6], "texture": "#shadow_y"} + } + }, + { + "from": [8, 3, 0], + "to": [15.5, 6, 13], + "shade": false, + "faces": { + "up": {"uv": [10, 16, 2, 3], "texture": "#shadow_y"} + } + }, + { + "from": [8, 3, 13], + "to": [16, 16, 16], + "shade": false, + "faces": { + "north": {"uv": [7, 3, 15, 16], "rotation": 180, "texture": "#shadow_y"} + } + }, + { + "from": [8, 0, 0], + "to": [16, 3, 16], + "shade": false, + "faces": { + "up": {"uv": [9, 16, 1, 0], "texture": "#shadow_y"} + } + }, + { + "from": [8, 15, 0], + "to": [11.75, 16, 1], + "faces": { + "north": {"uv": [3, 15, 6.75, 16], "rotation": 180, "texture": "#inner_a", "cullface": "north"}, + "east": {"uv": [7.5, 8, 8, 8.5], "texture": "#pattern"}, + "up": {"uv": [8, 16, 4.25, 15], "texture": "#inner_a", "cullface": "up"} + } + }, + { + "from": [8, 15, 1], + "to": [12.75, 16, 4], + "faces": { + "east": {"uv": [6, 8, 7.5, 8.5], "texture": "#pattern"}, + "up": {"uv": [8, 12, 3.25, 15], "texture": "#inner_a", "cullface": "up"} + } + }, + { + "from": [8, 12, 4], + "to": [13.75, 16, 7], + "faces": { + "east": {"uv": [4.5, 8, 6, 10], "texture": "#pattern"}, + "up": {"uv": [8, 9, 2.25, 12], "texture": "#inner_a", "cullface": "up"} + } + }, + { + "from": [8, 9, 7], + "to": [14.75, 16, 10], + "faces": { + "east": {"uv": [3, 8, 4.5, 11.5], "texture": "#pattern"}, + "up": {"uv": [8, 6, 1.25, 9], "texture": "#inner_a", "cullface": "up"} + } + }, + { + "from": [8, 6, 10], + "to": [15.75, 16, 13], + "faces": { + "east": {"uv": [1.5, 8, 3, 13], "texture": "#pattern"}, + "up": {"uv": [8, 6, 0.25, 3], "rotation": 180, "texture": "#inner_a", "cullface": "up"} + } + }, + { + "from": [8, 12, 0], + "to": [12.5, 15, 4], + "faces": { + "north": {"uv": [2.5, 12, 7, 15], "texture": "#inner_a", "cullface": "north"}, + "east": {"uv": [6, 8.5, 8, 10], "texture": "#pattern"} + } + }, + { + "from": [8, 9, 0], + "to": [13.5, 12, 7], + "faces": { + "north": {"uv": [2.5, 9, 8, 12], "texture": "#inner_a", "cullface": "north"}, + "east": {"uv": [4.5, 10, 8, 11.5], "texture": "#pattern"} + } + }, + { + "from": [8, 6, 0], + "to": [14.5, 9, 10], + "faces": { + "north": {"uv": [1.5, 6, 8, 9], "texture": "#inner_a", "cullface": "north"}, + "east": {"uv": [3, 11.5, 8, 13], "texture": "#pattern"} + } + }, + { + "from": [8, 3, 0], + "to": [15.5, 6, 13], + "faces": { + "north": {"uv": [0.5, 3, 8, 6], "texture": "#inner_a", "cullface": "north"}, + "east": {"uv": [1.5, 13, 8, 14.5], "texture": "#pattern"} + } + }, + { + "from": [8, 3, 13], + "to": [16, 16, 16], + "faces": { + "east": {"uv": [0, 8, 1.5, 14.5], "texture": "#pattern", "cullface": "east"}, + "south": {"uv": [8, 0, 16, 13], "texture": "#border", "cullface": "south"}, + "up": {"uv": [8, 3, 0, 0], "rotation": 180, "texture": "#inner_a", "cullface": "up"} + } + }, + { + "from": [8, 0, 0], + "to": [16, 3, 16], + "faces": { + "north": {"uv": [0, 0, 8, 3], "texture": "#inner_a", "cullface": "north"}, + "east": {"uv": [0, 14.5, 8, 16], "texture": "#pattern", "cullface": "east"}, + "south": {"uv": [8, 13, 16, 16], "texture": "#border", "cullface": "south"}, + "down": {"uv": [16, 16, 8, 0], "rotation": 180, "texture": "#border", "cullface": "down"} + } + } + ], + "groups": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, + { + "name": "group", + "origin": [8, 8, 8], + "children": [21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/models/block/spiral_bricks/x_spiral_top_left.json b/src/main/resources/assets/twilightforest/models/block/spiral_bricks/x_spiral_top_left.json new file mode 100644 index 0000000000..be51bd4446 --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/spiral_bricks/x_spiral_top_left.json @@ -0,0 +1,367 @@ +{ + "parent": "block/block", + "textures": { + "pattern": "twilightforest:block/stone_spiral_large", + "particle": "block/chiseled_stone_bricks", + "border": "block/chiseled_stone_bricks", + "shadow_y": "twilightforest:block/spiral_shadow_x", + "inner_a": "twilightforest:block/spiral_inner_down" + }, + "elements": [ + { + "from": [0, 0, 0], + "to": [8, 16, 3], + "faces": { + "north": {"uv": [0, 0, 8, 16], "rotation": 180, "texture": "#border", "cullface": "north"}, + "west": {"uv": [0, 0, 1.5, 8], "texture": "#pattern", "cullface": "west"}, + "up": {"uv": [0, 0, 8, 3], "texture": "#border", "cullface": "up"}, + "down": {"uv": [8, 0, 16, 3], "rotation": 180, "texture": "#inner_a", "cullface": "down"} + } + }, + { + "from": [4, 1, 15], + "to": [8, 4, 16], + "shade": false, + "faces": { + "north": {"uv": [4, 1, 8, 4], "rotation": 180, "texture": "#shadow_y"}, + "down": {"uv": [8, 15, 12, 16], "rotation": 180, "texture": "#shadow_y"} + } + }, + { + "from": [3, 4, 15], + "to": [8, 7, 16], + "shade": false, + "faces": { + "north": {"uv": [3, 4, 8, 7], "rotation": 180, "texture": "#shadow_y"}, + "down": {"uv": [7, 15, 12, 16], "rotation": 180, "texture": "#shadow_y"} + } + }, + { + "from": [2, 7, 12], + "to": [8, 10, 16], + "shade": false, + "faces": { + "north": {"uv": [2, 7, 8, 10], "rotation": 180, "texture": "#shadow_y"}, + "down": {"uv": [6, 12, 12, 16], "rotation": 180, "texture": "#shadow_y"} + } + }, + { + "from": [1, 10, 9], + "to": [8, 13, 16], + "shade": false, + "faces": { + "north": {"uv": [1, 10, 8, 13], "rotation": 180, "texture": "#shadow_y"}, + "down": {"uv": [5, 9, 12, 16], "rotation": 180, "texture": "#shadow_y"} + } + }, + { + "from": [3.25, 0, 12], + "to": [8, 7, 15], + "shade": false, + "faces": { + "south": {"uv": [4, 8, 9, 15], "texture": "#shadow_y"} + } + }, + { + "from": [2.25, 0, 9], + "to": [8, 10, 12], + "shade": false, + "faces": { + "south": {"uv": [3, 6, 9, 16], "texture": "#shadow_y"} + } + }, + { + "from": [1.25, 0, 6], + "to": [8, 13, 9], + "shade": false, + "faces": { + "south": {"uv": [2, 3, 9, 16], "texture": "#shadow_y"} + } + }, + { + "from": [0.25, 0, 3], + "to": [8, 13, 6], + "shade": false, + "faces": { + "south": {"uv": [2, 3, 10, 16], "texture": "#shadow_y"} + } + }, + { + "from": [0, 13, 3], + "to": [8, 16, 16], + "shade": false, + "faces": { + "down": {"uv": [4, 3, 12, 16], "rotation": 180, "texture": "#shadow_y"} + } + }, + { + "from": [0, 0, 0], + "to": [8, 16, 3], + "shade": false, + "faces": { + "south": {"uv": [2, 0, 10, 16], "texture": "#shadow_y"} + } + }, + { + "from": [4.25, 0, 15], + "to": [8, 1, 16], + "faces": { + "south": {"uv": [4.25, 15, 8, 16], "texture": "#inner_a", "cullface": "south"}, + "west": {"uv": [8.5, 8, 8, 7.5], "rotation": 90, "texture": "#pattern"}, + "down": {"uv": [8, 15, 11.75, 16], "rotation": 180, "texture": "#inner_a", "cullface": "down"} + } + }, + { + "from": [4, 1, 15], + "to": [8, 4, 16], + "faces": { + "south": {"uv": [4, 12, 8, 15], "texture": "#inner_a", "cullface": "south"}, + "west": {"uv": [7.5, 6, 8, 7.5], "texture": "#pattern"} + } + }, + { + "from": [3, 4, 15], + "to": [8, 7, 16], + "faces": { + "south": {"uv": [3, 9, 8, 12], "texture": "#inner_a", "cullface": "south"}, + "west": {"uv": [7.5, 4.5, 8, 6], "texture": "#pattern"} + } + }, + { + "from": [2, 7, 12], + "to": [8, 10, 16], + "faces": { + "south": {"uv": [2, 6, 8, 9], "texture": "#inner_a", "cullface": "south"}, + "west": {"uv": [6, 3, 8, 4.5], "texture": "#pattern"} + } + }, + { + "from": [1, 10, 9], + "to": [8, 13, 16], + "faces": { + "south": {"uv": [1, 3, 8, 6], "texture": "#inner_a", "cullface": "south"}, + "west": {"uv": [4.5, 1.5, 8, 3], "texture": "#pattern"} + } + }, + { + "from": [3.25, 0, 12], + "to": [8, 7, 15], + "faces": { + "west": {"uv": [6, 4.5, 7.5, 8], "texture": "#pattern"}, + "down": {"uv": [8, 12, 12.75, 15], "rotation": 180, "texture": "#inner_a", "cullface": "down"} + } + }, + { + "from": [2.25, 0, 9], + "to": [8, 10, 12], + "faces": { + "west": {"uv": [4.5, 3, 6, 8], "texture": "#pattern"}, + "down": {"uv": [8, 9, 13.75, 12], "rotation": 180, "texture": "#inner_a", "cullface": "down"} + } + }, + { + "from": [1.25, 0, 6], + "to": [8, 13, 9], + "faces": { + "west": {"uv": [3, 1.5, 4.5, 8], "texture": "#pattern"}, + "down": {"uv": [8, 6, 14.75, 9], "rotation": 180, "texture": "#inner_a", "cullface": "down"} + } + }, + { + "from": [0.25, 0, 3], + "to": [8, 13, 6], + "faces": { + "west": {"uv": [1.5, 1.5, 3, 8], "texture": "#pattern"}, + "down": {"uv": [8, 3, 15.75, 6], "rotation": 180, "texture": "#inner_a", "cullface": "down"} + } + }, + { + "from": [0, 13, 3], + "to": [8, 16, 16], + "faces": { + "south": {"uv": [0, 0, 8, 3], "texture": "#inner_a", "cullface": "south"}, + "west": {"uv": [1.5, 0, 8, 1.5], "texture": "#pattern", "cullface": "west"}, + "up": {"uv": [0, 3, 8, 16], "texture": "#border", "cullface": "up"} + } + }, + { + "from": [8, 13, 0], + "to": [16, 16, 16], + "faces": { + "north": {"uv": [8, 13, 16, 16], "rotation": 180, "texture": "#border", "cullface": "north"}, + "east": {"uv": [8, 0, 16, 1.5], "texture": "#pattern", "cullface": "east"}, + "south": {"uv": [8, 0, 16, 3], "texture": "#inner_a", "cullface": "south"}, + "up": {"uv": [16, 16, 8, 0], "rotation": 180, "texture": "#border", "cullface": "up"} + } + }, + { + "from": [8, 4, 9], + "to": [13, 7, 16], + "faces": { + "down": {"uv": [9, 16, 4, 9], "texture": "#shadow_y"} + } + }, + { + "from": [8, 7, 6], + "to": [14, 10, 16], + "faces": { + "down": {"uv": [9, 16, 3, 6], "texture": "#shadow_y"} + } + }, + { + "from": [8, 10, 3], + "to": [15, 13, 16], + "faces": { + "down": {"uv": [9, 16, 2, 3], "texture": "#shadow_y"} + } + }, + { + "from": [8, 0, 0], + "to": [16, 13, 3], + "faces": { + "south": {"uv": [8, 3, 16, 16], "texture": "#shadow_y"} + } + }, + { + "from": [8, 13, 0], + "to": [16, 16, 16], + "faces": { + "down": {"uv": [9, 16, 1, 0], "texture": "#shadow_y"} + } + }, + { + "from": [8, 0, 15], + "to": [11.75, 1, 16], + "faces": { + "east": {"uv": [8, 7.5, 8.5, 8], "texture": "#pattern"}, + "south": {"uv": [8, 15, 11.75, 16], "texture": "#inner_a", "cullface": "south"}, + "down": {"uv": [8, 16, 4.25, 15], "texture": "#inner_a", "cullface": "down"} + } + }, + { + "from": [8, 0, 12], + "to": [12.25, 1, 15], + "faces": { + "east": {"uv": [8.5, 7.5, 10, 8], "texture": "#pattern"}, + "down": {"uv": [8, 15, 3.75, 12], "texture": "#inner_a", "cullface": "down"} + } + }, + { + "from": [8, 0, 9], + "to": [13.25, 4, 12], + "faces": { + "east": {"uv": [10, 6, 11.5, 8], "texture": "#pattern"}, + "down": {"uv": [8, 12, 2.75, 9], "texture": "#inner_a", "cullface": "down"} + } + }, + { + "from": [8, 0, 6], + "to": [14.25, 7, 9], + "faces": { + "east": {"uv": [11.5, 4.5, 13, 8], "texture": "#pattern"}, + "down": {"uv": [8, 9, 1.75, 6], "texture": "#inner_a", "cullface": "down"} + } + }, + { + "from": [8, 0, 3], + "to": [15.25, 10, 6], + "faces": { + "east": {"uv": [13, 3, 14.5, 8], "texture": "#pattern"}, + "down": {"uv": [8, 6, 0.75, 3], "texture": "#inner_a", "cullface": "down"} + } + }, + { + "from": [8, 1, 12], + "to": [12, 4, 16], + "faces": { + "east": {"uv": [8, 6, 10, 7.5], "texture": "#pattern"}, + "south": {"uv": [8, 12, 12, 15], "texture": "#inner_a", "cullface": "south"} + } + }, + { + "from": [8, 4, 9], + "to": [13, 7, 16], + "faces": { + "east": {"uv": [8, 4.5, 11.5, 6], "texture": "#pattern"}, + "south": {"uv": [8, 9, 13, 12], "texture": "#inner_a", "cullface": "south"}, + "down": {"uv": [0, 0, 0, 0], "texture": "#shadow_y"} + } + }, + { + "from": [8, 7, 6], + "to": [14, 10, 16], + "faces": { + "east": {"uv": [8, 3, 13, 4.5], "texture": "#pattern"}, + "south": {"uv": [8, 6, 14, 9], "texture": "#inner_a", "cullface": "south"} + } + }, + { + "from": [8, 10, 3], + "to": [15, 13, 16], + "faces": { + "east": {"uv": [8, 1.5, 14.5, 3], "texture": "#pattern"}, + "south": {"uv": [8, 3, 15, 6], "texture": "#inner_a", "cullface": "south"} + } + }, + { + "from": [8, 0, 0], + "to": [16, 13, 3], + "faces": { + "north": {"uv": [8, 0, 16, 13], "rotation": 180, "texture": "#border", "cullface": "north"}, + "east": {"uv": [14.5, 1.5, 16, 8], "texture": "#pattern", "cullface": "east"}, + "down": {"uv": [8, 3, 0, 0], "texture": "#inner_a", "cullface": "down"} + } + }, + { + "from": [8, 0, 12], + "to": [12.25, 1, 15], + "faces": { + "south": {"uv": [8, 15, 12.25, 16], "texture": "#shadow_y"}, + "up": {"uv": [8, 4, 3.75, 1], "texture": "#shadow_y"} + } + }, + { + "from": [8, 0, 9], + "to": [13.25, 4, 12], + "faces": { + "south": {"uv": [8, 12, 13.25, 16], "texture": "#shadow_y"}, + "up": {"uv": [8, 7, 2.75, 4], "texture": "#shadow_y"} + } + }, + { + "from": [8, 0, 6], + "to": [14.25, 7, 9], + "faces": { + "south": {"uv": [8, 9, 14.25, 16], "texture": "#shadow_y"}, + "up": {"uv": [8, 10, 1.75, 7], "texture": "#shadow_y"} + } + }, + { + "from": [8, 0, 3], + "to": [15.25, 10, 6], + "faces": { + "south": {"uv": [8, 6, 15.25, 16], "texture": "#shadow_y"}, + "up": {"uv": [8, 13, 0.75, 10], "texture": "#shadow_y"} + } + }, + { + "from": [8, 1, 12], + "to": [12, 4, 16], + "faces": { + "down": {"uv": [8, 16, 4, 12], "texture": "#shadow_y"} + } + } + ], + "groups": [ + { + "name": "group", + "origin": [8, 8, 8], + "children": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20] + }, + { + "name": "group", + "origin": [8, 8, 8], + "children": [21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/models/block/spiral_bricks/x_spiral_top_right.json b/src/main/resources/assets/twilightforest/models/block/spiral_bricks/x_spiral_top_right.json new file mode 100644 index 0000000000..c9cbde50a4 --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/spiral_bricks/x_spiral_top_right.json @@ -0,0 +1,368 @@ +{ + "parent": "block/block", + "textures": { + "pattern": "twilightforest:block/stone_spiral_large", + "particle": "block/chiseled_stone_bricks", + "border": "block/chiseled_stone_bricks", + "shadow_y": "twilightforest:block/spiral_shadow_x", + "inner_a": "twilightforest:block/spiral_inner_down" + }, + "elements": [ + { + "from": [0, 13, 0], + "to": [8, 16, 16], + "faces": { + "north": {"uv": [8, 0, 16, 3], "texture": "#inner_a", "cullface": "north"}, + "south": {"uv": [0, 0, 8, 3], "texture": "#border", "cullface": "south"}, + "west": {"uv": [8, 0, 16, 1.5], "texture": "#pattern", "cullface": "west"}, + "up": {"uv": [0, 0, 8, 16], "texture": "#border", "cullface": "up"} + } + }, + { + "from": [3, 4, 0], + "to": [8, 7, 7], + "faces": { + "down": {"uv": [3, 9, 8, 16], "texture": "#shadow_y"} + } + }, + { + "from": [2, 7, 0], + "to": [8, 10, 10], + "faces": { + "down": {"uv": [2, 6, 8, 16], "texture": "#shadow_y"} + } + }, + { + "from": [1, 10, 0], + "to": [8, 13, 13], + "faces": { + "down": {"uv": [1, 3, 8, 16], "texture": "#shadow_y"} + } + }, + { + "from": [0, 0, 13], + "to": [8, 13, 16], + "faces": { + "north": {"uv": [8, 3, 16, 16], "texture": "#shadow_y"} + } + }, + { + "from": [0, 13, 0], + "to": [8, 16, 16], + "faces": { + "down": {"uv": [1, 0, 9, 16], "texture": "#shadow_y"} + } + }, + { + "from": [4.25, 0, 0], + "to": [8, 1, 1], + "faces": { + "north": {"uv": [8, 15, 11.75, 16], "texture": "#inner_a", "cullface": "north"}, + "west": {"uv": [8, 7.5, 8.5, 8], "texture": "#pattern"}, + "down": {"uv": [4.25, 15, 8, 16], "texture": "#inner_a", "cullface": "down"} + } + }, + { + "from": [3.75, 0, 1], + "to": [8, 1, 4], + "faces": { + "west": {"uv": [8.5, 7.5, 10, 8], "texture": "#pattern"}, + "down": {"uv": [3.75, 12, 8, 15], "texture": "#inner_a", "cullface": "down"} + } + }, + { + "from": [2.75, 0, 4], + "to": [8, 4, 7], + "faces": { + "west": {"uv": [10, 6, 11.5, 8], "texture": "#pattern"}, + "down": {"uv": [2.75, 9, 8, 12], "texture": "#inner_a", "cullface": "down"} + } + }, + { + "from": [1.75, 0, 7], + "to": [8, 7, 10], + "faces": { + "west": {"uv": [11.5, 4.5, 13, 8], "texture": "#pattern"}, + "down": {"uv": [1.75, 6, 8, 9], "texture": "#inner_a", "cullface": "down"} + } + }, + { + "from": [0.75, 0, 10], + "to": [8, 10, 13], + "faces": { + "west": {"uv": [13, 3, 14.5, 8], "texture": "#pattern"}, + "down": {"uv": [0.75, 3, 8, 6], "texture": "#inner_a", "cullface": "down"} + } + }, + { + "from": [4, 1, 0], + "to": [8, 4, 4], + "faces": { + "north": {"uv": [8, 12, 12, 15], "texture": "#inner_a", "cullface": "north"}, + "west": {"uv": [8, 6, 10, 7.5], "texture": "#pattern"} + } + }, + { + "from": [3, 4, 0], + "to": [8, 7, 7], + "faces": { + "north": {"uv": [8, 9, 13, 12], "texture": "#inner_a", "cullface": "north"}, + "west": {"uv": [8, 4.5, 11.5, 6], "texture": "#pattern"} + } + }, + { + "from": [2, 7, 0], + "to": [8, 10, 10], + "faces": { + "north": {"uv": [8, 6, 14, 9], "texture": "#inner_a", "cullface": "north"}, + "west": {"uv": [8, 3, 13, 4.5], "texture": "#pattern"} + } + }, + { + "from": [1, 10, 0], + "to": [8, 13, 13], + "faces": { + "north": {"uv": [8, 3, 15, 6], "texture": "#inner_a", "cullface": "north"}, + "west": {"uv": [8, 1.5, 14.5, 3], "texture": "#pattern"} + } + }, + { + "from": [0, 0, 13], + "to": [8, 13, 16], + "faces": { + "south": {"uv": [0, 3, 8, 16], "texture": "#border", "cullface": "south"}, + "west": {"uv": [14.5, 1.5, 16, 8], "texture": "#pattern", "cullface": "west"}, + "down": {"uv": [0, 0, 8, 3], "texture": "#inner_a", "cullface": "down"} + } + }, + { + "from": [3.75, 0, 1], + "to": [8, 1, 4], + "faces": { + "north": {"uv": [7, 15, 11, 16], "texture": "#shadow_y"}, + "up": {"uv": [3.75, 1, 8, 4], "texture": "#shadow_y"} + } + }, + { + "from": [2.75, 0, 4], + "to": [8, 4, 7], + "faces": { + "north": {"uv": [9, 12, 14, 16], "texture": "#shadow_y"}, + "up": {"uv": [2.75, 4, 8, 7], "texture": "#shadow_y"} + } + }, + { + "from": [1.75, 0, 7], + "to": [8, 7, 10], + "faces": { + "north": {"uv": [9, 9, 15, 16], "texture": "#shadow_y"}, + "up": {"uv": [1.75, 7, 8, 10], "texture": "#shadow_y"} + } + }, + { + "from": [0.75, 0, 10], + "to": [8, 10, 13], + "faces": { + "north": {"uv": [8, 6, 15, 16], "texture": "#shadow_y"}, + "up": {"uv": [0.75, 10, 8, 13], "texture": "#shadow_y"} + } + }, + { + "from": [4, 1, 0], + "to": [8, 4, 4], + "faces": { + "down": {"uv": [4, 12, 8, 16], "texture": "#shadow_y"} + } + }, + { + "from": [8, 0, 13], + "to": [16, 16, 16], + "faces": { + "east": {"uv": [0, 0, 1.5, 8], "texture": "#pattern", "cullface": "east"}, + "south": {"uv": [8, 0, 16, 16], "texture": "#border", "cullface": "south"}, + "up": {"uv": [16, 16, 8, 13], "rotation": 180, "texture": "#border", "cullface": "up"}, + "down": {"uv": [16, 3, 8, 0], "rotation": 180, "texture": "#inner_a", "cullface": "down"} + } + }, + { + "from": [8, 1, 0], + "to": [12, 4, 1], + "shade": false, + "faces": { + "south": {"uv": [4, 1, 8, 4], "rotation": 180, "texture": "#shadow_y"}, + "down": {"uv": [12, 16, 8, 15], "rotation": 180, "texture": "#shadow_y"} + } + }, + { + "from": [8, 4, 0], + "to": [13, 7, 1], + "shade": false, + "faces": { + "south": {"uv": [3, 4, 8, 7], "rotation": 180, "texture": "#shadow_y"}, + "down": {"uv": [12, 16, 7, 15], "rotation": 180, "texture": "#shadow_y"} + } + }, + { + "from": [8, 7, 0], + "to": [14, 10, 4], + "shade": false, + "faces": { + "south": {"uv": [2, 7, 8, 10], "rotation": 180, "texture": "#shadow_y"}, + "down": {"uv": [12, 16, 6, 12], "rotation": 180, "texture": "#shadow_y"} + } + }, + { + "from": [8, 10, 0], + "to": [15, 13, 7], + "shade": false, + "faces": { + "south": {"uv": [1, 10, 8, 13], "rotation": 180, "texture": "#shadow_y"}, + "down": {"uv": [12, 16, 5, 9], "rotation": 180, "texture": "#shadow_y"} + } + }, + { + "from": [8, 0, 1], + "to": [12.75, 7, 4], + "shade": false, + "faces": { + "north": {"uv": [4, 9, 9, 16], "texture": "#shadow_y"} + } + }, + { + "from": [8, 0, 4], + "to": [13.75, 10, 7], + "shade": false, + "faces": { + "north": {"uv": [4, 6, 10, 16], "texture": "#shadow_y"} + } + }, + { + "from": [8, 0, 7], + "to": [14.75, 13, 10], + "shade": false, + "faces": { + "north": {"uv": [3, 3, 10, 16], "texture": "#shadow_y"} + } + }, + { + "from": [8, 0, 10], + "to": [15.75, 13, 13], + "shade": false, + "faces": { + "north": {"uv": [2, 3, 10, 16], "texture": "#shadow_y"} + } + }, + { + "from": [8, 13, 0], + "to": [16, 16, 13], + "shade": false, + "faces": { + "down": {"uv": [12, 16, 4, 3], "rotation": 180, "texture": "#shadow_y"} + } + }, + { + "from": [8, 0, 13], + "to": [16, 16, 16], + "shade": false, + "faces": { + "north": {"uv": [1, 0, 9, 16], "texture": "#shadow_y"} + } + }, + { + "from": [8, 0, 0], + "to": [11.75, 1, 1], + "faces": { + "north": {"uv": [4.25, 15, 8, 16], "texture": "#inner_a", "cullface": "north"}, + "east": {"uv": [8.5, 8, 8, 7.5], "rotation": 90, "texture": "#pattern"}, + "down": {"uv": [11.75, 16, 8, 15], "rotation": 180, "texture": "#inner_a", "cullface": "down"} + } + }, + { + "from": [8, 1, 0], + "to": [12, 4, 1], + "faces": { + "north": {"uv": [4, 12, 8, 15], "texture": "#inner_a", "cullface": "north"}, + "east": {"uv": [7.5, 6, 8, 7.5], "texture": "#pattern"} + } + }, + { + "from": [8, 4, 0], + "to": [13, 7, 1], + "faces": { + "north": {"uv": [3, 9, 8, 12], "texture": "#inner_a", "cullface": "north"}, + "east": {"uv": [7.5, 4.5, 8, 6], "texture": "#pattern"} + } + }, + { + "from": [8, 7, 0], + "to": [14, 10, 4], + "faces": { + "north": {"uv": [2, 6, 8, 9], "texture": "#inner_a", "cullface": "north"}, + "east": {"uv": [6, 3, 8, 4.5], "texture": "#pattern"} + } + }, + { + "from": [8, 10, 0], + "to": [15, 13, 7], + "faces": { + "north": {"uv": [1, 3, 8, 6], "texture": "#inner_a", "cullface": "north"}, + "east": {"uv": [4.5, 1.5, 8, 3], "texture": "#pattern"} + } + }, + { + "from": [8, 0, 1], + "to": [12.75, 7, 4], + "faces": { + "east": {"uv": [6, 4.5, 7.5, 8], "texture": "#pattern"}, + "down": {"uv": [12.75, 15, 8, 12], "rotation": 180, "texture": "#inner_a", "cullface": "down"} + } + }, + { + "from": [8, 0, 4], + "to": [13.75, 10, 7], + "faces": { + "east": {"uv": [4.5, 3, 6, 8], "texture": "#pattern"}, + "down": {"uv": [13.75, 12, 8, 9], "rotation": 180, "texture": "#inner_a", "cullface": "down"} + } + }, + { + "from": [8, 0, 7], + "to": [14.75, 13, 10], + "faces": { + "east": {"uv": [3, 1.5, 4.5, 8], "texture": "#pattern"}, + "down": {"uv": [14.75, 9, 8, 6], "rotation": 180, "texture": "#inner_a", "cullface": "down"} + } + }, + { + "from": [8, 0, 10], + "to": [15.75, 13, 13], + "faces": { + "east": {"uv": [1.5, 1.5, 3, 8], "texture": "#pattern"}, + "down": {"uv": [15.75, 6, 8, 3], "rotation": 180, "texture": "#inner_a", "cullface": "down"} + } + }, + { + "from": [8, 13, 0], + "to": [16, 16, 13], + "faces": { + "north": {"uv": [0, 0, 8, 3], "texture": "#inner_a", "cullface": "north"}, + "east": {"uv": [1.5, 0, 8, 1.5], "texture": "#pattern", "cullface": "east"}, + "up": {"uv": [16, 13, 8, 0], "rotation": 180, "texture": "#border", "cullface": "up"} + } + } + ], + "groups": [ + { + "name": "group", + "origin": [8, 8, 8], + "color": 0, + "children": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20] + }, + { + "name": "group", + "origin": [8, 8, 8], + "color": 0, + "children": [21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/models/block/spiral_bricks/y_spiral_bottom_left.json b/src/main/resources/assets/twilightforest/models/block/spiral_bricks/y_spiral_bottom_left.json new file mode 100644 index 0000000000..6db151271d --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/spiral_bricks/y_spiral_bottom_left.json @@ -0,0 +1,371 @@ +{ + "parent": "block/block", + "textures": { + "inner_a": "twilightforest:block/spiral_inner_down", + "pattern": "twilightforest:block/stone_spiral_large", + "particle": "block/chiseled_stone_bricks", + "border": "block/chiseled_stone_bricks", + "shadow_y": "twilightforest:block/spiral_shadow_x" + }, + "elements": [ + { + "from": [15, 8, 12], + "to": [16, 12.75, 15], + "shade": false, + "faces": { + "south": {"uv": [1.5, 15, 6.25, 16], "rotation": 270, "texture": "#inner_a"}, + "west": {"uv": [3.25, 1, 8, 4], "rotation": 90, "texture": "#shadow_y"} + } + }, + { + "from": [12, 8, 9], + "to": [16, 13.75, 12], + "shade": false, + "faces": { + "south": {"uv": [8, 12, 13.75, 16], "rotation": 270, "texture": "#shadow_y"}, + "west": {"uv": [2.25, 4, 8, 7], "rotation": 90, "texture": "#shadow_y"} + } + }, + { + "from": [9, 8, 6], + "to": [16, 14.75, 9], + "shade": false, + "faces": { + "south": {"uv": [6, 9, 13, 16], "rotation": 270, "texture": "#shadow_y"}, + "west": {"uv": [1.25, 7, 8, 10], "rotation": 90, "texture": "#shadow_y"} + } + }, + { + "from": [6, 8, 3], + "to": [16, 15.75, 6], + "shade": false, + "faces": { + "south": {"uv": [6, 6, 14, 16], "rotation": 270, "texture": "#shadow_y"}, + "west": {"uv": [0.25, 10, 8, 13], "rotation": 90, "texture": "#shadow_y"} + } + }, + { + "from": [12, 8, 12], + "to": [15, 12.5, 16], + "shade": false, + "faces": { + "east": {"uv": [4, 12, 9, 16], "rotation": 90, "texture": "#shadow_y"} + } + }, + { + "from": [9, 8, 9], + "to": [12, 13.5, 16], + "shade": false, + "faces": { + "east": {"uv": [3, 9, 9, 16], "rotation": 90, "texture": "#shadow_y"} + } + }, + { + "from": [6, 8, 6], + "to": [9, 14.5, 16], + "shade": false, + "faces": { + "east": {"uv": [2, 6, 9, 16], "rotation": 90, "texture": "#shadow_y"} + } + }, + { + "from": [3, 8, 3], + "to": [6, 15.5, 16], + "shade": false, + "faces": { + "east": {"uv": [2, 3, 10, 16], "rotation": 90, "texture": "#shadow_y"} + } + }, + { + "from": [3, 8, 0], + "to": [16, 16, 3], + "shade": false, + "faces": { + "south": {"uv": [6, 3, 14, 16], "rotation": 270, "texture": "#shadow_y"} + } + }, + { + "from": [0, 8, 0], + "to": [3, 16, 16], + "shade": false, + "faces": { + "east": {"uv": [1, 0, 9, 16], "rotation": 90, "texture": "#shadow_y"} + } + }, + { + "from": [15, 8, 15], + "to": [16, 11.75, 16], + "faces": { + "east": {"uv": [4.25, 15, 8, 16], "rotation": 90, "texture": "#inner_a", "cullface": "east"}, + "south": {"uv": [3, 15, 6.75, 16], "rotation": 270, "texture": "#inner_a", "cullface": "south"}, + "up": {"uv": [7.5, 8, 8, 8.5], "rotation": 90, "texture": "#pattern"} + } + }, + { + "from": [15, 8, 12], + "to": [16, 12.75, 15], + "faces": { + "east": {"uv": [3.25, 12, 8, 15], "rotation": 90, "texture": "#inner_a", "cullface": "east"}, + "up": {"uv": [6, 8, 7.5, 8.5], "rotation": 90, "texture": "#pattern"} + } + }, + { + "from": [12, 8, 9], + "to": [16, 13.75, 12], + "faces": { + "east": {"uv": [2.25, 9, 8, 12], "rotation": 90, "texture": "#inner_a", "cullface": "east"}, + "up": {"uv": [4.5, 8, 6, 10], "rotation": 90, "texture": "#pattern"} + } + }, + { + "from": [9, 8, 6], + "to": [16, 14.75, 9], + "faces": { + "east": {"uv": [1.25, 6, 8, 9], "rotation": 90, "texture": "#inner_a", "cullface": "east"}, + "up": {"uv": [3, 8, 4.5, 11.5], "rotation": 90, "texture": "#pattern"} + } + }, + { + "from": [6, 8, 3], + "to": [16, 15.75, 6], + "faces": { + "east": {"uv": [0.25, 3, 8, 6], "rotation": 90, "texture": "#inner_a", "cullface": "east"}, + "up": {"uv": [1.5, 8, 3, 13], "rotation": 90, "texture": "#pattern"} + } + }, + { + "from": [12, 8, 12], + "to": [15, 12.5, 16], + "faces": { + "south": {"uv": [2, 12, 6.5, 15], "rotation": 90, "texture": "#inner_a", "cullface": "south"}, + "up": {"uv": [6, 8.5, 8, 10], "rotation": 90, "texture": "#pattern"} + } + }, + { + "from": [9, 8, 9], + "to": [12, 13.5, 16], + "faces": { + "south": {"uv": [2, 9, 7.5, 12], "rotation": 90, "texture": "#inner_a", "cullface": "south"}, + "up": {"uv": [4.5, 10, 8, 11.5], "rotation": 90, "texture": "#pattern"} + } + }, + { + "from": [6, 8, 6], + "to": [9, 14.5, 16], + "faces": { + "south": {"uv": [2, 6, 8.5, 9], "rotation": 90, "texture": "#inner_a", "cullface": "south"}, + "up": {"uv": [3, 11.5, 8, 13], "rotation": 90, "texture": "#pattern"} + } + }, + { + "from": [3, 8, 3], + "to": [6, 15.5, 16], + "faces": { + "south": {"uv": [1, 3, 8.5, 6], "rotation": 90, "texture": "#inner_a", "cullface": "south"}, + "up": {"uv": [1.5, 13, 8, 14.5], "rotation": 90, "texture": "#pattern"} + } + }, + { + "from": [3, 8, 0], + "to": [16, 16, 3], + "faces": { + "north": {"uv": [0, 3, 8, 16], "rotation": 90, "texture": "#border", "cullface": "north"}, + "east": {"uv": [0, 0, 8, 3], "rotation": 90, "texture": "#inner_a", "cullface": "east"}, + "up": {"uv": [0, 8, 1.5, 14.5], "rotation": 90, "texture": "#pattern", "cullface": "up"} + } + }, + { + "from": [0, 8, 0], + "to": [3, 16, 16], + "faces": { + "north": {"uv": [0, 0, 8, 3], "rotation": 90, "texture": "#border", "cullface": "north"}, + "south": {"uv": [0, 0, 8, 3], "rotation": 90, "texture": "#inner_a", "cullface": "south"}, + "west": {"uv": [0, 0, 8, 16], "rotation": 90, "texture": "#border", "cullface": "west"}, + "up": {"uv": [0, 14.5, 8, 16], "rotation": 90, "texture": "#pattern", "cullface": "up"} + } + }, + { + "from": [12, 3.5, 15], + "to": [15, 8, 16], + "shade": false, + "faces": { + "north": {"uv": [3.5, 1, 8, 4], "rotation": 270, "texture": "#shadow_y"}, + "east": {"uv": [12.5, 16, 8, 15], "rotation": 270, "texture": "#shadow_y"} + } + }, + { + "from": [9, 2.5, 12], + "to": [12, 8, 16], + "shade": false, + "faces": { + "north": {"uv": [2.5, 4, 8, 7], "rotation": 270, "texture": "#shadow_y"}, + "east": {"uv": [13, 16, 7, 12], "rotation": 270, "texture": "#shadow_y"} + } + }, + { + "from": [6, 1.5, 9], + "to": [9, 8, 16], + "shade": false, + "faces": { + "north": {"uv": [1.5, 7, 8, 10], "rotation": 270, "texture": "#shadow_y"}, + "east": {"uv": [13, 16, 6, 9], "rotation": 270, "texture": "#shadow_y"} + } + }, + { + "from": [3, 0.5, 6], + "to": [6, 8, 16], + "shade": false, + "faces": { + "north": {"uv": [0.5, 10, 8, 13], "rotation": 270, "texture": "#shadow_y"}, + "east": {"uv": [14, 16, 6, 6], "rotation": 270, "texture": "#shadow_y"} + } + }, + { + "from": [12, 3.75, 12], + "to": [16, 8, 15], + "shade": false, + "faces": { + "south": {"uv": [3.75, 12, 8, 16], "rotation": 270, "texture": "#shadow_y"} + } + }, + { + "from": [9, 2.75, 9], + "to": [16, 8, 12], + "shade": false, + "faces": { + "south": {"uv": [4, 9, 9, 16], "rotation": 270, "texture": "#shadow_y"} + } + }, + { + "from": [6, 1.75, 6], + "to": [16, 8, 9], + "shade": false, + "faces": { + "south": {"uv": [2, 6, 8, 16], "rotation": 270, "texture": "#shadow_y"} + } + }, + { + "from": [3, 0.75, 3], + "to": [16, 8, 6], + "shade": false, + "faces": { + "south": {"uv": [2, 3, 9, 16], "rotation": 270, "texture": "#shadow_y"} + } + }, + { + "from": [0, 0, 3], + "to": [3, 8, 16], + "shade": false, + "faces": { + "east": {"uv": [15, 16, 7, 3], "rotation": 270, "texture": "#shadow_y"} + } + }, + { + "from": [0, 0, 0], + "to": [16, 8, 3], + "shade": false, + "faces": { + "south": {"uv": [1, 0, 9, 16], "rotation": 270, "texture": "#shadow_y"} + } + }, + { + "from": [15, 4.25, 15], + "to": [16, 8, 16], + "faces": { + "east": {"uv": [11.75, 16, 8, 15], "rotation": 270, "texture": "#inner_a", "cullface": "east"}, + "south": {"uv": [8, 15, 11.75, 16], "rotation": 270, "texture": "#inner_a", "cullface": "south"}, + "down": {"uv": [8, 8, 8.5, 8.5], "rotation": 180, "texture": "#pattern"} + } + }, + { + "from": [12, 3.5, 15], + "to": [15, 8, 16], + "faces": { + "south": {"uv": [8, 12, 12.5, 15], "rotation": 90, "texture": "#inner_a", "cullface": "south"}, + "down": {"uv": [8, 8.5, 8.5, 10], "rotation": 90, "texture": "#pattern"} + } + }, + { + "from": [9, 2.5, 12], + "to": [12, 8, 16], + "faces": { + "south": {"uv": [9, 9, 14.5, 12], "rotation": 90, "texture": "#inner_a", "cullface": "south"}, + "down": {"uv": [8, 10, 10, 11.5], "rotation": 90, "texture": "#pattern"} + } + }, + { + "from": [6, 1.5, 9], + "to": [9, 8, 16], + "faces": { + "south": {"uv": [8, 6, 14.5, 9], "rotation": 90, "texture": "#inner_a", "cullface": "south"}, + "down": {"uv": [8, 11.5, 11.5, 13], "rotation": 90, "texture": "#pattern"} + } + }, + { + "from": [3, 0.5, 6], + "to": [6, 8, 16], + "faces": { + "south": {"uv": [8, 3, 15.5, 6], "rotation": 90, "texture": "#inner_a", "cullface": "south"}, + "down": {"uv": [7.5, 13, 13, 14.5], "rotation": 90, "texture": "#pattern"} + } + }, + { + "from": [12, 3.75, 12], + "to": [16, 8, 15], + "faces": { + "east": {"uv": [12, 15, 7.75, 12], "rotation": 270, "texture": "#inner_a", "cullface": "east"}, + "down": {"uv": [8.5, 8, 10, 10], "rotation": 90, "texture": "#pattern"} + } + }, + { + "from": [9, 2.75, 9], + "to": [16, 8, 12], + "faces": { + "east": {"uv": [13, 12, 7.75, 9], "rotation": 270, "texture": "#inner_a", "cullface": "east"}, + "down": {"uv": [10, 8, 11.5, 11.5], "rotation": 90, "texture": "#pattern"} + } + }, + { + "from": [6, 1.75, 6], + "to": [16, 8, 9], + "faces": { + "east": {"uv": [14, 9, 7.75, 6], "rotation": 270, "texture": "#inner_a", "cullface": "east"}, + "down": {"uv": [11.5, 8, 13, 13], "rotation": 90, "texture": "#pattern"} + } + }, + { + "from": [3, 0.75, 3], + "to": [16, 8, 6], + "faces": { + "east": {"uv": [16, 6, 8.75, 3], "rotation": 270, "texture": "#inner_a", "cullface": "east"}, + "down": {"uv": [13, 8, 14.5, 14.5], "rotation": 90, "texture": "#pattern"} + } + }, + { + "from": [0, 0, 3], + "to": [3, 8, 16], + "faces": { + "south": {"uv": [8, 0, 16, 3], "rotation": 90, "texture": "#inner_a", "cullface": "south"}, + "west": {"uv": [16, 13, 8, 0], "rotation": 270, "texture": "#border", "cullface": "west"}, + "down": {"uv": [7.5, 14.5, 14, 16], "rotation": 90, "texture": "#pattern", "cullface": "down"} + } + }, + { + "from": [0, 0, 0], + "to": [16, 8, 3], + "faces": { + "north": {"uv": [8, 0, 16, 16], "rotation": 90, "texture": "#border", "cullface": "north"}, + "east": {"uv": [16, 3, 8, 0], "rotation": 270, "texture": "#inner_a", "cullface": "east"}, + "west": {"uv": [16, 16, 8, 13], "rotation": 270, "texture": "#border", "cullface": "west"}, + "down": {"uv": [14.5, 8, 16, 16], "rotation": 90, "texture": "#pattern", "cullface": "down"} + } + } + ], + "groups": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, + { + "name": "group", + "origin": [8, 8, 8], + "children": [21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/models/block/spiral_bricks/y_spiral_bottom_right.json b/src/main/resources/assets/twilightforest/models/block/spiral_bricks/y_spiral_bottom_right.json new file mode 100644 index 0000000000..16a1a2ed8e --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/spiral_bricks/y_spiral_bottom_right.json @@ -0,0 +1,371 @@ +{ + "parent": "block/block", + "textures": { + "pattern": "twilightforest:block/stone_spiral_large", + "particle": "block/chiseled_stone_bricks", + "border": "block/chiseled_stone_bricks", + "shadow_y": "twilightforest:block/spiral_shadow_x", + "inner_a": "twilightforest:block/spiral_inner_down" + }, + "elements": [ + { + "from": [12, 8, 0], + "to": [15, 12.5, 1], + "shade": false, + "faces": { + "east": {"uv": [8, 15, 12.5, 16], "rotation": 270, "texture": "#shadow_y"}, + "south": {"uv": [3.5, 1, 8, 4], "rotation": 90, "texture": "#shadow_y"} + } + }, + { + "from": [9, 8, 0], + "to": [12, 13.5, 4], + "shade": false, + "faces": { + "east": {"uv": [6, 12, 12, 16], "rotation": 270, "texture": "#shadow_y"}, + "south": {"uv": [2.5, 4, 8, 7], "rotation": 90, "texture": "#shadow_y"} + } + }, + { + "from": [6, 8, 0], + "to": [9, 14.5, 7], + "shade": false, + "faces": { + "east": {"uv": [6, 9, 13, 16], "rotation": 270, "texture": "#shadow_y"}, + "south": {"uv": [1.5, 7, 8, 10], "rotation": 90, "texture": "#shadow_y"} + } + }, + { + "from": [3, 8, 0], + "to": [6, 15.5, 10], + "shade": false, + "faces": { + "east": {"uv": [6, 6, 14, 16], "rotation": 270, "texture": "#shadow_y"}, + "south": {"uv": [0.5, 10, 8, 13], "rotation": 90, "texture": "#shadow_y"} + } + }, + { + "from": [12, 8, 1], + "to": [16, 12.25, 4], + "shade": false, + "faces": { + "north": {"uv": [3.75, 12, 8, 16], "rotation": 90, "texture": "#shadow_y"} + } + }, + { + "from": [9, 8, 4], + "to": [16, 13.25, 7], + "shade": false, + "faces": { + "north": {"uv": [3, 9, 8, 16], "rotation": 90, "texture": "#shadow_y"} + } + }, + { + "from": [6, 8, 7], + "to": [16, 14.25, 10], + "shade": false, + "faces": { + "north": {"uv": [2, 6, 8, 16], "rotation": 90, "texture": "#shadow_y"} + } + }, + { + "from": [3, 8, 10], + "to": [16, 15.25, 13], + "shade": false, + "faces": { + "north": {"uv": [2, 3, 9, 16], "rotation": 90, "texture": "#shadow_y"} + } + }, + { + "from": [0, 8, 0], + "to": [3, 16, 13], + "shade": false, + "faces": { + "east": {"uv": [7, 3, 15, 16], "rotation": 270, "texture": "#shadow_y"} + } + }, + { + "from": [0, 8, 13], + "to": [16, 16, 16], + "shade": false, + "faces": { + "north": {"uv": [1, 0, 9, 16], "rotation": 90, "texture": "#shadow_y"} + } + }, + { + "from": [15, 8, 0], + "to": [16, 11.75, 1], + "faces": { + "north": {"uv": [8, 15, 11.75, 16], "rotation": 90, "texture": "#inner_a", "cullface": "north"}, + "east": {"uv": [8, 15, 11.75, 16], "rotation": 270, "texture": "#inner_a", "cullface": "east"}, + "up": {"uv": [8, 8, 8.5, 8.5], "rotation": 180, "texture": "#pattern"} + } + }, + { + "from": [12, 8, 0], + "to": [15, 12.5, 1], + "faces": { + "north": {"uv": [8, 12, 12.5, 15], "rotation": 270, "texture": "#inner_a", "cullface": "north"}, + "up": {"uv": [8, 8.5, 8.5, 10], "rotation": 90, "texture": "#pattern"} + } + }, + { + "from": [9, 8, 0], + "to": [12, 13.5, 4], + "faces": { + "north": {"uv": [9, 9, 14.5, 12], "rotation": 270, "texture": "#inner_a", "cullface": "north"}, + "up": {"uv": [8, 10, 10, 11.5], "rotation": 90, "texture": "#pattern"} + } + }, + { + "from": [6, 8, 0], + "to": [9, 14.5, 7], + "faces": { + "north": {"uv": [8, 6, 14.5, 9], "rotation": 270, "texture": "#inner_a", "cullface": "north"}, + "up": {"uv": [8, 11.5, 11.5, 13], "rotation": 90, "texture": "#pattern"} + } + }, + { + "from": [3, 8, 0], + "to": [6, 15.5, 10], + "faces": { + "north": {"uv": [8, 3, 15.5, 6], "rotation": 270, "texture": "#inner_a", "cullface": "north"}, + "up": {"uv": [7.5, 13, 13, 14.5], "rotation": 90, "texture": "#pattern"} + } + }, + { + "from": [12, 8, 1], + "to": [16, 12.25, 4], + "faces": { + "east": {"uv": [7.75, 12, 12, 15], "rotation": 90, "texture": "#inner_a", "cullface": "east"}, + "up": {"uv": [8.5, 8, 10, 10], "rotation": 90, "texture": "#pattern"} + } + }, + { + "from": [9, 8, 4], + "to": [16, 13.25, 7], + "faces": { + "east": {"uv": [7.75, 9, 13, 12], "rotation": 90, "texture": "#inner_a", "cullface": "east"}, + "up": {"uv": [10, 8, 11.5, 11.5], "rotation": 90, "texture": "#pattern"} + } + }, + { + "from": [6, 8, 7], + "to": [16, 14.25, 10], + "faces": { + "east": {"uv": [7.75, 6, 14, 9], "rotation": 90, "texture": "#inner_a", "cullface": "east"}, + "up": {"uv": [11.5, 8, 13, 13], "rotation": 90, "texture": "#pattern"} + } + }, + { + "from": [3, 8, 10], + "to": [16, 15.25, 13], + "faces": { + "east": {"uv": [8.75, 3, 16, 6], "rotation": 90, "texture": "#inner_a", "cullface": "east"}, + "up": {"uv": [13, 8, 14.5, 14.5], "rotation": 90, "texture": "#pattern"} + } + }, + { + "from": [0, 8, 0], + "to": [3, 16, 13], + "faces": { + "north": {"uv": [8, 0, 16, 3], "rotation": 270, "texture": "#inner_a", "cullface": "north"}, + "west": {"uv": [0, 3, 8, 16], "rotation": 90, "texture": "#border", "cullface": "west"}, + "up": {"uv": [7.5, 14.5, 14, 16], "rotation": 90, "texture": "#pattern", "cullface": "up"} + } + }, + { + "from": [0, 8, 13], + "to": [16, 16, 16], + "faces": { + "east": {"uv": [8, 0, 16, 3], "rotation": 90, "texture": "#inner_a", "cullface": "east"}, + "south": {"uv": [0, 0, 8, 16], "rotation": 90, "texture": "#border", "cullface": "south"}, + "west": {"uv": [0, 0, 8, 3], "rotation": 90, "texture": "#border", "cullface": "west"}, + "up": {"uv": [14.5, 8, 16, 16], "rotation": 90, "texture": "#pattern", "cullface": "up"} + } + }, + { + "from": [15, 3.25, 1], + "to": [16, 8, 4], + "shade": false, + "faces": { + "north": {"uv": [2, 15, 7, 16], "rotation": 90, "texture": "#shadow_y"}, + "west": {"uv": [8, 4, 3.25, 1], "rotation": 90, "texture": "#shadow_y"} + } + }, + { + "from": [12, 2.25, 4], + "to": [16, 8, 7], + "shade": false, + "faces": { + "north": {"uv": [6, 12, 12, 16], "rotation": 90, "texture": "#shadow_y"}, + "west": {"uv": [8, 7, 2.25, 4], "rotation": 90, "texture": "#shadow_y"} + } + }, + { + "from": [9, 1.25, 7], + "to": [16, 8, 10], + "shade": false, + "faces": { + "north": {"uv": [6, 9, 13, 16], "rotation": 90, "texture": "#shadow_y"}, + "west": {"uv": [8, 10, 1.25, 7], "rotation": 90, "texture": "#shadow_y"} + } + }, + { + "from": [6, 0.25, 10], + "to": [16, 8, 13], + "shade": false, + "faces": { + "north": {"uv": [6, 6, 14, 16], "rotation": 90, "texture": "#shadow_y"}, + "west": {"uv": [8, 13, 0.25, 10], "rotation": 90, "texture": "#shadow_y"} + } + }, + { + "from": [12, 3.5, 0], + "to": [15, 8, 4], + "shade": false, + "faces": { + "east": {"uv": [9, 16, 4, 12], "rotation": 90, "texture": "#shadow_y"} + } + }, + { + "from": [9, 2.5, 0], + "to": [12, 8, 7], + "shade": false, + "faces": { + "east": {"uv": [10, 16, 4, 9], "rotation": 90, "texture": "#shadow_y"} + } + }, + { + "from": [6, 1.5, 0], + "to": [9, 8, 10], + "shade": false, + "faces": { + "east": {"uv": [10, 16, 3, 6], "rotation": 90, "texture": "#shadow_y"} + } + }, + { + "from": [3, 0.5, 0], + "to": [6, 8, 13], + "shade": false, + "faces": { + "east": {"uv": [10, 16, 2, 3], "rotation": 90, "texture": "#shadow_y"} + } + }, + { + "from": [3, 0, 13], + "to": [16, 8, 16], + "shade": false, + "faces": { + "north": {"uv": [7, 3, 15, 16], "rotation": 90, "texture": "#shadow_y"} + } + }, + { + "from": [0, 0, 0], + "to": [3, 8, 16], + "shade": false, + "faces": { + "east": {"uv": [9, 16, 1, 0], "rotation": 90, "texture": "#shadow_y"} + } + }, + { + "from": [15, 4.25, 0], + "to": [16, 8, 1], + "faces": { + "north": {"uv": [3, 15, 6.75, 16], "rotation": 90, "texture": "#inner_a", "cullface": "north"}, + "east": {"uv": [8, 16, 4.25, 15], "rotation": 90, "texture": "#inner_a", "cullface": "east"}, + "down": {"uv": [7.5, 8, 8, 8.5], "rotation": 90, "texture": "#pattern"} + } + }, + { + "from": [15, 3.25, 1], + "to": [16, 8, 4], + "faces": { + "east": {"uv": [8, 12, 3.25, 15], "rotation": 90, "texture": "#inner_a", "cullface": "east"}, + "down": {"uv": [6, 8, 7.5, 8.5], "rotation": 90, "texture": "#pattern"} + } + }, + { + "from": [12, 2.25, 4], + "to": [16, 8, 7], + "faces": { + "east": {"uv": [8, 9, 2.25, 12], "rotation": 90, "texture": "#inner_a", "cullface": "east"}, + "down": {"uv": [4.5, 8, 6, 10], "rotation": 90, "texture": "#pattern"} + } + }, + { + "from": [9, 1.25, 7], + "to": [16, 8, 10], + "faces": { + "east": {"uv": [8, 6, 1.25, 9], "rotation": 90, "texture": "#inner_a", "cullface": "east"}, + "down": {"uv": [3, 8, 4.5, 11.5], "rotation": 90, "texture": "#pattern"} + } + }, + { + "from": [6, 0.25, 10], + "to": [16, 8, 13], + "faces": { + "east": {"uv": [8, 6, 0.25, 3], "rotation": 270, "texture": "#inner_a", "cullface": "east"}, + "down": {"uv": [1.5, 8, 3, 13], "rotation": 90, "texture": "#pattern"} + } + }, + { + "from": [12, 3.5, 0], + "to": [15, 8, 4], + "faces": { + "north": {"uv": [2.5, 12, 7, 15], "rotation": 270, "texture": "#inner_a", "cullface": "north"}, + "down": {"uv": [6, 8.5, 8, 10], "rotation": 90, "texture": "#pattern"} + } + }, + { + "from": [9, 2.5, 0], + "to": [12, 8, 7], + "faces": { + "north": {"uv": [2.5, 9, 8, 12], "rotation": 270, "texture": "#inner_a", "cullface": "north"}, + "down": {"uv": [4.5, 10, 8, 11.5], "rotation": 90, "texture": "#pattern"} + } + }, + { + "from": [6, 1.5, 0], + "to": [9, 8, 10], + "faces": { + "north": {"uv": [1.5, 6, 8, 9], "rotation": 270, "texture": "#inner_a", "cullface": "north"}, + "down": {"uv": [3, 11.5, 8, 13], "rotation": 90, "texture": "#pattern"} + } + }, + { + "from": [3, 0.5, 0], + "to": [6, 8, 13], + "faces": { + "north": {"uv": [0.5, 3, 8, 6], "rotation": 270, "texture": "#inner_a", "cullface": "north"}, + "down": {"uv": [1.5, 13, 8, 14.5], "rotation": 90, "texture": "#pattern"} + } + }, + { + "from": [3, 0, 13], + "to": [16, 8, 16], + "faces": { + "east": {"uv": [8, 3, 0, 0], "rotation": 270, "texture": "#inner_a", "cullface": "east"}, + "south": {"uv": [8, 0, 16, 13], "rotation": 90, "texture": "#border", "cullface": "south"}, + "down": {"uv": [0, 8, 1.5, 14.5], "rotation": 90, "texture": "#pattern", "cullface": "down"} + } + }, + { + "from": [0, 0, 0], + "to": [3, 8, 16], + "faces": { + "north": {"uv": [0, 0, 8, 3], "rotation": 270, "texture": "#inner_a", "cullface": "north"}, + "south": {"uv": [8, 13, 16, 16], "rotation": 90, "texture": "#border", "cullface": "south"}, + "west": {"uv": [16, 16, 8, 0], "rotation": 270, "texture": "#border", "cullface": "west"}, + "down": {"uv": [0, 14.5, 8, 16], "rotation": 90, "texture": "#pattern", "cullface": "down"} + } + } + ], + "groups": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, + { + "name": "group", + "origin": [8, 8, 8], + "children": [21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/models/block/spiral_bricks/y_spiral_top_left.json b/src/main/resources/assets/twilightforest/models/block/spiral_bricks/y_spiral_top_left.json new file mode 100644 index 0000000000..e0ee1056b8 --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/spiral_bricks/y_spiral_top_left.json @@ -0,0 +1,367 @@ +{ + "parent": "block/block", + "textures": { + "pattern": "twilightforest:block/stone_spiral_large", + "particle": "block/chiseled_stone_bricks", + "border": "block/chiseled_stone_bricks", + "shadow_y": "twilightforest:block/spiral_shadow_x", + "inner_a": "twilightforest:block/spiral_inner_down" + }, + "elements": [ + { + "from": [0, 8, 0], + "to": [16, 16, 3], + "faces": { + "north": {"uv": [0, 0, 8, 16], "rotation": 90, "texture": "#border", "cullface": "north"}, + "east": {"uv": [0, 0, 8, 3], "rotation": 90, "texture": "#border", "cullface": "east"}, + "west": {"uv": [8, 0, 16, 3], "rotation": 270, "texture": "#inner_a", "cullface": "west"}, + "up": {"uv": [0, 0, 1.5, 8], "rotation": 90, "texture": "#pattern", "cullface": "up"} + } + }, + { + "from": [1, 8, 15], + "to": [4, 12, 16], + "shade": false, + "faces": { + "north": {"uv": [4, 1, 8, 4], "rotation": 90, "texture": "#shadow_y"}, + "west": {"uv": [8, 15, 12, 16], "rotation": 270, "texture": "#shadow_y"} + } + }, + { + "from": [4, 8, 15], + "to": [7, 13, 16], + "shade": false, + "faces": { + "north": {"uv": [3, 4, 8, 7], "rotation": 90, "texture": "#shadow_y"}, + "west": {"uv": [7, 15, 12, 16], "rotation": 270, "texture": "#shadow_y"} + } + }, + { + "from": [7, 8, 12], + "to": [10, 14, 16], + "shade": false, + "faces": { + "north": {"uv": [2, 7, 8, 10], "rotation": 90, "texture": "#shadow_y"}, + "west": {"uv": [6, 12, 12, 16], "rotation": 270, "texture": "#shadow_y"} + } + }, + { + "from": [10, 8, 9], + "to": [13, 15, 16], + "shade": false, + "faces": { + "north": {"uv": [1, 10, 8, 13], "rotation": 90, "texture": "#shadow_y"}, + "west": {"uv": [5, 9, 12, 16], "rotation": 270, "texture": "#shadow_y"} + } + }, + { + "from": [0, 8, 12], + "to": [7, 12.75, 15], + "shade": false, + "faces": { + "south": {"uv": [4, 8, 9, 15], "rotation": 90, "texture": "#shadow_y"} + } + }, + { + "from": [0, 8, 9], + "to": [10, 13.75, 12], + "shade": false, + "faces": { + "south": {"uv": [3, 6, 9, 16], "rotation": 90, "texture": "#shadow_y"} + } + }, + { + "from": [0, 8, 6], + "to": [13, 14.75, 9], + "shade": false, + "faces": { + "south": {"uv": [2, 3, 9, 16], "rotation": 90, "texture": "#shadow_y"} + } + }, + { + "from": [0, 8, 3], + "to": [13, 15.75, 6], + "shade": false, + "faces": { + "south": {"uv": [2, 3, 10, 16], "rotation": 90, "texture": "#shadow_y"} + } + }, + { + "from": [13, 8, 3], + "to": [16, 16, 16], + "shade": false, + "faces": { + "west": {"uv": [4, 3, 12, 16], "rotation": 270, "texture": "#shadow_y"} + } + }, + { + "from": [0, 8, 0], + "to": [16, 16, 3], + "shade": false, + "faces": { + "south": {"uv": [2, 0, 10, 16], "rotation": 90, "texture": "#shadow_y"} + } + }, + { + "from": [0, 8, 15], + "to": [1, 11.75, 16], + "faces": { + "south": {"uv": [4.25, 15, 8, 16], "rotation": 90, "texture": "#inner_a", "cullface": "south"}, + "west": {"uv": [8, 15, 11.75, 16], "rotation": 270, "texture": "#inner_a", "cullface": "west"}, + "up": {"uv": [8.5, 8, 8, 7.5], "rotation": 180, "texture": "#pattern"} + } + }, + { + "from": [1, 8, 15], + "to": [4, 12, 16], + "faces": { + "south": {"uv": [4, 12, 8, 15], "rotation": 90, "texture": "#inner_a", "cullface": "south"}, + "up": {"uv": [7.5, 6, 8, 7.5], "rotation": 90, "texture": "#pattern"} + } + }, + { + "from": [4, 8, 15], + "to": [7, 13, 16], + "faces": { + "south": {"uv": [3, 9, 8, 12], "rotation": 90, "texture": "#inner_a", "cullface": "south"}, + "up": {"uv": [7.5, 4.5, 8, 6], "rotation": 90, "texture": "#pattern"} + } + }, + { + "from": [7, 8, 12], + "to": [10, 14, 16], + "faces": { + "south": {"uv": [2, 6, 8, 9], "rotation": 90, "texture": "#inner_a", "cullface": "south"}, + "up": {"uv": [6, 3, 8, 4.5], "rotation": 90, "texture": "#pattern"} + } + }, + { + "from": [10, 8, 9], + "to": [13, 15, 16], + "faces": { + "south": {"uv": [1, 3, 8, 6], "rotation": 90, "texture": "#inner_a", "cullface": "south"}, + "up": {"uv": [4.5, 1.5, 8, 3], "rotation": 90, "texture": "#pattern"} + } + }, + { + "from": [0, 8, 12], + "to": [7, 12.75, 15], + "faces": { + "west": {"uv": [8, 12, 12.75, 15], "rotation": 270, "texture": "#inner_a", "cullface": "west"}, + "up": {"uv": [6, 4.5, 7.5, 8], "rotation": 90, "texture": "#pattern"} + } + }, + { + "from": [0, 8, 9], + "to": [10, 13.75, 12], + "faces": { + "west": {"uv": [8, 9, 13.75, 12], "rotation": 270, "texture": "#inner_a", "cullface": "west"}, + "up": {"uv": [4.5, 3, 6, 8], "rotation": 90, "texture": "#pattern"} + } + }, + { + "from": [0, 8, 6], + "to": [13, 14.75, 9], + "faces": { + "west": {"uv": [8, 6, 14.75, 9], "rotation": 270, "texture": "#inner_a", "cullface": "west"}, + "up": {"uv": [3, 1.5, 4.5, 8], "rotation": 90, "texture": "#pattern"} + } + }, + { + "from": [0, 8, 3], + "to": [13, 15.75, 6], + "faces": { + "west": {"uv": [8, 3, 15.75, 6], "rotation": 270, "texture": "#inner_a", "cullface": "west"}, + "up": {"uv": [1.5, 1.5, 3, 8], "rotation": 90, "texture": "#pattern"} + } + }, + { + "from": [13, 8, 3], + "to": [16, 16, 16], + "faces": { + "east": {"uv": [0, 3, 8, 16], "rotation": 90, "texture": "#border", "cullface": "east"}, + "south": {"uv": [0, 0, 8, 3], "rotation": 90, "texture": "#inner_a", "cullface": "south"}, + "up": {"uv": [1.5, 0, 8, 1.5], "rotation": 90, "texture": "#pattern", "cullface": "up"} + } + }, + { + "from": [13, 0, 0], + "to": [16, 8, 16], + "faces": { + "north": {"uv": [8, 13, 16, 16], "rotation": 90, "texture": "#border", "cullface": "north"}, + "east": {"uv": [16, 16, 8, 0], "rotation": 270, "texture": "#border", "cullface": "east"}, + "south": {"uv": [8, 0, 16, 3], "rotation": 90, "texture": "#inner_a", "cullface": "south"}, + "down": {"uv": [8, 0, 16, 1.5], "rotation": 90, "texture": "#pattern", "cullface": "down"} + } + }, + { + "from": [4, 3, 9], + "to": [7, 8, 16], + "faces": { + "west": {"uv": [9, 16, 4, 9], "rotation": 90, "texture": "#shadow_y"} + } + }, + { + "from": [7, 2, 6], + "to": [10, 8, 16], + "faces": { + "west": {"uv": [9, 16, 3, 6], "rotation": 90, "texture": "#shadow_y"} + } + }, + { + "from": [10, 1, 3], + "to": [13, 8, 16], + "faces": { + "west": {"uv": [9, 16, 2, 3], "rotation": 90, "texture": "#shadow_y"} + } + }, + { + "from": [0, 0, 0], + "to": [13, 8, 3], + "faces": { + "south": {"uv": [8, 3, 16, 16], "rotation": 90, "texture": "#shadow_y"} + } + }, + { + "from": [13, 0, 0], + "to": [16, 8, 16], + "faces": { + "west": {"uv": [9, 16, 1, 0], "rotation": 90, "texture": "#shadow_y"} + } + }, + { + "from": [0, 4.25, 15], + "to": [1, 8, 16], + "faces": { + "south": {"uv": [8, 15, 11.75, 16], "rotation": 90, "texture": "#inner_a", "cullface": "south"}, + "west": {"uv": [8, 16, 4.25, 15], "rotation": 90, "texture": "#inner_a", "cullface": "west"}, + "down": {"uv": [8, 7.5, 8.5, 8], "rotation": 90, "texture": "#pattern"} + } + }, + { + "from": [0, 3.75, 12], + "to": [1, 8, 15], + "faces": { + "west": {"uv": [8, 15, 3.75, 12], "rotation": 90, "texture": "#inner_a", "cullface": "west"}, + "down": {"uv": [8.5, 7.5, 10, 8], "rotation": 90, "texture": "#pattern"} + } + }, + { + "from": [0, 2.75, 9], + "to": [4, 8, 12], + "faces": { + "west": {"uv": [8, 12, 2.75, 9], "rotation": 90, "texture": "#inner_a", "cullface": "west"}, + "down": {"uv": [10, 6, 11.5, 8], "rotation": 90, "texture": "#pattern"} + } + }, + { + "from": [0, 1.75, 6], + "to": [7, 8, 9], + "faces": { + "west": {"uv": [8, 9, 1.75, 6], "rotation": 90, "texture": "#inner_a", "cullface": "west"}, + "down": {"uv": [11.5, 4.5, 13, 8], "rotation": 90, "texture": "#pattern"} + } + }, + { + "from": [0, 0.75, 3], + "to": [10, 8, 6], + "faces": { + "west": {"uv": [8, 6, 0.75, 3], "rotation": 90, "texture": "#inner_a", "cullface": "west"}, + "down": {"uv": [13, 3, 14.5, 8], "rotation": 90, "texture": "#pattern"} + } + }, + { + "from": [1, 4, 12], + "to": [4, 8, 16], + "faces": { + "south": {"uv": [8, 12, 12, 15], "rotation": 90, "texture": "#inner_a", "cullface": "south"}, + "down": {"uv": [8, 6, 10, 7.5], "rotation": 90, "texture": "#pattern"} + } + }, + { + "from": [4, 3, 9], + "to": [7, 8, 16], + "faces": { + "south": {"uv": [8, 9, 13, 12], "rotation": 90, "texture": "#inner_a", "cullface": "south"}, + "west": {"uv": [0, 0, 0, 0], "rotation": 90, "texture": "#shadow_y"}, + "down": {"uv": [8, 4.5, 11.5, 6], "rotation": 90, "texture": "#pattern"} + } + }, + { + "from": [7, 2, 6], + "to": [10, 8, 16], + "faces": { + "south": {"uv": [8, 6, 14, 9], "rotation": 90, "texture": "#inner_a", "cullface": "south"}, + "down": {"uv": [8, 3, 13, 4.5], "rotation": 90, "texture": "#pattern"} + } + }, + { + "from": [10, 1, 3], + "to": [13, 8, 16], + "faces": { + "south": {"uv": [8, 3, 15, 6], "rotation": 90, "texture": "#inner_a", "cullface": "south"}, + "down": {"uv": [8, 1.5, 14.5, 3], "rotation": 90, "texture": "#pattern"} + } + }, + { + "from": [0, 0, 0], + "to": [13, 8, 3], + "faces": { + "north": {"uv": [8, 0, 16, 13], "rotation": 90, "texture": "#border", "cullface": "north"}, + "west": {"uv": [8, 3, 0, 0], "rotation": 90, "texture": "#inner_a", "cullface": "west"}, + "down": {"uv": [14.5, 1.5, 16, 8], "rotation": 90, "texture": "#pattern", "cullface": "down"} + } + }, + { + "from": [0, 3.75, 12], + "to": [1, 8, 15], + "faces": { + "east": {"uv": [8, 4, 3.75, 1], "rotation": 90, "texture": "#shadow_y"}, + "south": {"uv": [8, 15, 12.25, 16], "rotation": 90, "texture": "#shadow_y"} + } + }, + { + "from": [0, 2.75, 9], + "to": [4, 8, 12], + "faces": { + "east": {"uv": [8, 7, 2.75, 4], "rotation": 90, "texture": "#shadow_y"}, + "south": {"uv": [8, 12, 13.25, 16], "rotation": 90, "texture": "#shadow_y"} + } + }, + { + "from": [0, 1.75, 6], + "to": [7, 8, 9], + "faces": { + "east": {"uv": [8, 10, 1.75, 7], "rotation": 90, "texture": "#shadow_y"}, + "south": {"uv": [8, 9, 14.25, 16], "rotation": 90, "texture": "#shadow_y"} + } + }, + { + "from": [0, 0.75, 3], + "to": [10, 8, 6], + "faces": { + "east": {"uv": [8, 13, 0.75, 10], "rotation": 90, "texture": "#shadow_y"}, + "south": {"uv": [8, 6, 15.25, 16], "rotation": 90, "texture": "#shadow_y"} + } + }, + { + "from": [1, 4, 12], + "to": [4, 8, 16], + "faces": { + "west": {"uv": [8, 16, 4, 12], "rotation": 90, "texture": "#shadow_y"} + } + } + ], + "groups": [ + { + "name": "group", + "origin": [8, 8, 8], + "children": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20] + }, + { + "name": "group", + "origin": [8, 8, 8], + "children": [21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/models/block/spiral_bricks/y_spiral_top_right.json b/src/main/resources/assets/twilightforest/models/block/spiral_bricks/y_spiral_top_right.json new file mode 100644 index 0000000000..f02fa671f4 --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/spiral_bricks/y_spiral_top_right.json @@ -0,0 +1,368 @@ +{ + "parent": "block/block", + "textures": { + "pattern": "twilightforest:block/stone_spiral_large", + "particle": "block/chiseled_stone_bricks", + "border": "block/chiseled_stone_bricks", + "shadow_y": "twilightforest:block/spiral_shadow_x", + "inner_a": "twilightforest:block/spiral_inner_down" + }, + "elements": [ + { + "from": [13, 8, 0], + "to": [16, 16, 16], + "faces": { + "north": {"uv": [8, 0, 16, 3], "rotation": 270, "texture": "#inner_a", "cullface": "north"}, + "east": {"uv": [0, 0, 8, 16], "rotation": 90, "texture": "#border", "cullface": "east"}, + "south": {"uv": [0, 0, 8, 3], "rotation": 90, "texture": "#border", "cullface": "south"}, + "up": {"uv": [8, 0, 16, 1.5], "rotation": 90, "texture": "#pattern", "cullface": "up"} + } + }, + { + "from": [4, 8, 0], + "to": [7, 13, 7], + "faces": { + "west": {"uv": [3, 9, 8, 16], "rotation": 90, "texture": "#shadow_y"} + } + }, + { + "from": [7, 8, 0], + "to": [10, 14, 10], + "faces": { + "west": {"uv": [2, 6, 8, 16], "rotation": 90, "texture": "#shadow_y"} + } + }, + { + "from": [10, 8, 0], + "to": [13, 15, 13], + "faces": { + "west": {"uv": [1, 3, 8, 16], "rotation": 90, "texture": "#shadow_y"} + } + }, + { + "from": [0, 8, 13], + "to": [13, 16, 16], + "faces": { + "north": {"uv": [8, 3, 16, 16], "rotation": 270, "texture": "#shadow_y"} + } + }, + { + "from": [13, 8, 0], + "to": [16, 16, 16], + "faces": { + "west": {"uv": [1, 0, 9, 16], "rotation": 90, "texture": "#shadow_y"} + } + }, + { + "from": [0, 8, 0], + "to": [1, 11.75, 1], + "faces": { + "north": {"uv": [8, 15, 11.75, 16], "rotation": 270, "texture": "#inner_a", "cullface": "north"}, + "west": {"uv": [4.25, 15, 8, 16], "rotation": 90, "texture": "#inner_a", "cullface": "west"}, + "up": {"uv": [8, 7.5, 8.5, 8], "rotation": 90, "texture": "#pattern"} + } + }, + { + "from": [0, 8, 1], + "to": [1, 12.25, 4], + "faces": { + "west": {"uv": [3.75, 12, 8, 15], "rotation": 90, "texture": "#inner_a", "cullface": "west"}, + "up": {"uv": [8.5, 7.5, 10, 8], "rotation": 90, "texture": "#pattern"} + } + }, + { + "from": [0, 8, 4], + "to": [4, 13.25, 7], + "faces": { + "west": {"uv": [2.75, 9, 8, 12], "rotation": 90, "texture": "#inner_a", "cullface": "west"}, + "up": {"uv": [10, 6, 11.5, 8], "rotation": 90, "texture": "#pattern"} + } + }, + { + "from": [0, 8, 7], + "to": [7, 14.25, 10], + "faces": { + "west": {"uv": [1.75, 6, 8, 9], "rotation": 90, "texture": "#inner_a", "cullface": "west"}, + "up": {"uv": [11.5, 4.5, 13, 8], "rotation": 90, "texture": "#pattern"} + } + }, + { + "from": [0, 8, 10], + "to": [10, 15.25, 13], + "faces": { + "west": {"uv": [0.75, 3, 8, 6], "rotation": 90, "texture": "#inner_a", "cullface": "west"}, + "up": {"uv": [13, 3, 14.5, 8], "rotation": 90, "texture": "#pattern"} + } + }, + { + "from": [1, 8, 0], + "to": [4, 12, 4], + "faces": { + "north": {"uv": [8, 12, 12, 15], "rotation": 270, "texture": "#inner_a", "cullface": "north"}, + "up": {"uv": [8, 6, 10, 7.5], "rotation": 90, "texture": "#pattern"} + } + }, + { + "from": [4, 8, 0], + "to": [7, 13, 7], + "faces": { + "north": {"uv": [8, 9, 13, 12], "rotation": 270, "texture": "#inner_a", "cullface": "north"}, + "up": {"uv": [8, 4.5, 11.5, 6], "rotation": 90, "texture": "#pattern"} + } + }, + { + "from": [7, 8, 0], + "to": [10, 14, 10], + "faces": { + "north": {"uv": [8, 6, 14, 9], "rotation": 270, "texture": "#inner_a", "cullface": "north"}, + "up": {"uv": [8, 3, 13, 4.5], "rotation": 90, "texture": "#pattern"} + } + }, + { + "from": [10, 8, 0], + "to": [13, 15, 13], + "faces": { + "north": {"uv": [8, 3, 15, 6], "rotation": 270, "texture": "#inner_a", "cullface": "north"}, + "up": {"uv": [8, 1.5, 14.5, 3], "rotation": 90, "texture": "#pattern"} + } + }, + { + "from": [0, 8, 13], + "to": [13, 16, 16], + "faces": { + "south": {"uv": [0, 3, 8, 16], "rotation": 90, "texture": "#border", "cullface": "south"}, + "west": {"uv": [0, 0, 8, 3], "rotation": 90, "texture": "#inner_a", "cullface": "west"}, + "up": {"uv": [14.5, 1.5, 16, 8], "rotation": 90, "texture": "#pattern", "cullface": "up"} + } + }, + { + "from": [0, 8, 1], + "to": [1, 12.25, 4], + "faces": { + "north": {"uv": [7, 15, 11, 16], "rotation": 270, "texture": "#shadow_y"}, + "east": {"uv": [3.75, 1, 8, 4], "rotation": 90, "texture": "#shadow_y"} + } + }, + { + "from": [0, 8, 4], + "to": [4, 13.25, 7], + "faces": { + "north": {"uv": [9, 12, 14, 16], "rotation": 270, "texture": "#shadow_y"}, + "east": {"uv": [2.75, 4, 8, 7], "rotation": 90, "texture": "#shadow_y"} + } + }, + { + "from": [0, 8, 7], + "to": [7, 14.25, 10], + "faces": { + "north": {"uv": [9, 9, 15, 16], "rotation": 270, "texture": "#shadow_y"}, + "east": {"uv": [1.75, 7, 8, 10], "rotation": 90, "texture": "#shadow_y"} + } + }, + { + "from": [0, 8, 10], + "to": [10, 15.25, 13], + "faces": { + "north": {"uv": [8, 6, 15, 16], "rotation": 270, "texture": "#shadow_y"}, + "east": {"uv": [0.75, 10, 8, 13], "rotation": 90, "texture": "#shadow_y"} + } + }, + { + "from": [1, 8, 0], + "to": [4, 12, 4], + "faces": { + "west": {"uv": [4, 12, 8, 16], "rotation": 90, "texture": "#shadow_y"} + } + }, + { + "from": [0, 0, 13], + "to": [16, 8, 16], + "faces": { + "east": {"uv": [16, 16, 8, 13], "rotation": 270, "texture": "#border", "cullface": "east"}, + "south": {"uv": [8, 0, 16, 16], "rotation": 90, "texture": "#border", "cullface": "south"}, + "west": {"uv": [16, 3, 8, 0], "rotation": 270, "texture": "#inner_a", "cullface": "west"}, + "down": {"uv": [0, 0, 1.5, 8], "rotation": 90, "texture": "#pattern", "cullface": "down"} + } + }, + { + "from": [1, 4, 0], + "to": [4, 8, 1], + "shade": false, + "faces": { + "south": {"uv": [4, 1, 8, 4], "rotation": 270, "texture": "#shadow_y"}, + "west": {"uv": [12, 16, 8, 15], "rotation": 270, "texture": "#shadow_y"} + } + }, + { + "from": [4, 3, 0], + "to": [7, 8, 1], + "shade": false, + "faces": { + "south": {"uv": [3, 4, 8, 7], "rotation": 270, "texture": "#shadow_y"}, + "west": {"uv": [12, 16, 7, 15], "rotation": 270, "texture": "#shadow_y"} + } + }, + { + "from": [7, 2, 0], + "to": [10, 8, 4], + "shade": false, + "faces": { + "south": {"uv": [2, 7, 8, 10], "rotation": 270, "texture": "#shadow_y"}, + "west": {"uv": [12, 16, 6, 12], "rotation": 270, "texture": "#shadow_y"} + } + }, + { + "from": [10, 1, 0], + "to": [13, 8, 7], + "shade": false, + "faces": { + "south": {"uv": [1, 10, 8, 13], "rotation": 270, "texture": "#shadow_y"}, + "west": {"uv": [12, 16, 5, 9], "rotation": 270, "texture": "#shadow_y"} + } + }, + { + "from": [0, 3.25, 1], + "to": [7, 8, 4], + "shade": false, + "faces": { + "north": {"uv": [4, 9, 9, 16], "rotation": 270, "texture": "#shadow_y"} + } + }, + { + "from": [0, 2.25, 4], + "to": [10, 8, 7], + "shade": false, + "faces": { + "north": {"uv": [4, 6, 10, 16], "rotation": 270, "texture": "#shadow_y"} + } + }, + { + "from": [0, 1.25, 7], + "to": [13, 8, 10], + "shade": false, + "faces": { + "north": {"uv": [3, 3, 10, 16], "rotation": 270, "texture": "#shadow_y"} + } + }, + { + "from": [0, 0.25, 10], + "to": [13, 8, 13], + "shade": false, + "faces": { + "north": {"uv": [2, 3, 10, 16], "rotation": 270, "texture": "#shadow_y"} + } + }, + { + "from": [13, 0, 0], + "to": [16, 8, 13], + "shade": false, + "faces": { + "west": {"uv": [12, 16, 4, 3], "rotation": 270, "texture": "#shadow_y"} + } + }, + { + "from": [0, 0, 13], + "to": [16, 8, 16], + "shade": false, + "faces": { + "north": {"uv": [1, 0, 9, 16], "rotation": 270, "texture": "#shadow_y"} + } + }, + { + "from": [0, 4.25, 0], + "to": [1, 8, 1], + "faces": { + "north": {"uv": [4.25, 15, 8, 16], "rotation": 270, "texture": "#inner_a", "cullface": "north"}, + "west": {"uv": [11.75, 16, 8, 15], "rotation": 270, "texture": "#inner_a", "cullface": "west"}, + "down": {"uv": [8.5, 8, 8, 7.5], "rotation": 180, "texture": "#pattern"} + } + }, + { + "from": [1, 4, 0], + "to": [4, 8, 1], + "faces": { + "north": {"uv": [4, 12, 8, 15], "rotation": 270, "texture": "#inner_a", "cullface": "north"}, + "down": {"uv": [7.5, 6, 8, 7.5], "rotation": 90, "texture": "#pattern"} + } + }, + { + "from": [4, 3, 0], + "to": [7, 8, 1], + "faces": { + "north": {"uv": [3, 9, 8, 12], "rotation": 270, "texture": "#inner_a", "cullface": "north"}, + "down": {"uv": [7.5, 4.5, 8, 6], "rotation": 90, "texture": "#pattern"} + } + }, + { + "from": [7, 2, 0], + "to": [10, 8, 4], + "faces": { + "north": {"uv": [2, 6, 8, 9], "rotation": 270, "texture": "#inner_a", "cullface": "north"}, + "down": {"uv": [6, 3, 8, 4.5], "rotation": 90, "texture": "#pattern"} + } + }, + { + "from": [10, 1, 0], + "to": [13, 8, 7], + "faces": { + "north": {"uv": [1, 3, 8, 6], "rotation": 270, "texture": "#inner_a", "cullface": "north"}, + "down": {"uv": [4.5, 1.5, 8, 3], "rotation": 90, "texture": "#pattern"} + } + }, + { + "from": [0, 3.25, 1], + "to": [7, 8, 4], + "faces": { + "west": {"uv": [12.75, 15, 8, 12], "rotation": 270, "texture": "#inner_a", "cullface": "west"}, + "down": {"uv": [6, 4.5, 7.5, 8], "rotation": 90, "texture": "#pattern"} + } + }, + { + "from": [0, 2.25, 4], + "to": [10, 8, 7], + "faces": { + "west": {"uv": [13.75, 12, 8, 9], "rotation": 270, "texture": "#inner_a", "cullface": "west"}, + "down": {"uv": [4.5, 3, 6, 8], "rotation": 90, "texture": "#pattern"} + } + }, + { + "from": [0, 1.25, 7], + "to": [13, 8, 10], + "faces": { + "west": {"uv": [14.75, 9, 8, 6], "rotation": 270, "texture": "#inner_a", "cullface": "west"}, + "down": {"uv": [3, 1.5, 4.5, 8], "rotation": 90, "texture": "#pattern"} + } + }, + { + "from": [0, 0.25, 10], + "to": [13, 8, 13], + "faces": { + "west": {"uv": [15.75, 6, 8, 3], "rotation": 270, "texture": "#inner_a", "cullface": "west"}, + "down": {"uv": [1.5, 1.5, 3, 8], "rotation": 90, "texture": "#pattern"} + } + }, + { + "from": [13, 0, 0], + "to": [16, 8, 13], + "faces": { + "north": {"uv": [0, 0, 8, 3], "rotation": 270, "texture": "#inner_a", "cullface": "north"}, + "east": {"uv": [16, 13, 8, 0], "rotation": 270, "texture": "#border", "cullface": "east"}, + "down": {"uv": [1.5, 0, 8, 1.5], "rotation": 90, "texture": "#pattern", "cullface": "down"} + } + } + ], + "groups": [ + { + "name": "group", + "origin": [8, 8, 8], + "color": 0, + "children": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20] + }, + { + "name": "group", + "origin": [8, 8, 8], + "color": 0, + "children": [21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/models/block/spiral_bricks/z_spiral_bottom_left.json b/src/main/resources/assets/twilightforest/models/block/spiral_bricks/z_spiral_bottom_left.json new file mode 100644 index 0000000000..b3202cfa21 --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/spiral_bricks/z_spiral_bottom_left.json @@ -0,0 +1,372 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "inner_a": "twilightforest:block/spiral_inner_down", + "pattern": "twilightforest:block/stone_spiral_large", + "particle": "block/chiseled_stone_bricks", + "border": "block/chiseled_stone_bricks", + "shadow_y": "twilightforest:block/spiral_shadow_x" + }, + "elements": [ + { + "from": [1, 15, 3.25], + "to": [4, 16, 8], + "shade": false, + "faces": { + "west": {"uv": [1.5, 15, 6.25, 16], "rotation": 180, "texture": "#inner_a"}, + "down": {"uv": [3.25, 1, 8, 4], "rotation": 270, "texture": "#shadow_y"} + } + }, + { + "from": [4, 12, 2.25], + "to": [7, 16, 8], + "shade": false, + "faces": { + "west": {"uv": [8, 12, 13.75, 16], "rotation": 180, "texture": "#shadow_y"}, + "down": {"uv": [2.25, 4, 8, 7], "rotation": 270, "texture": "#shadow_y"} + } + }, + { + "from": [7, 9, 1.25], + "to": [10, 16, 8], + "shade": false, + "faces": { + "west": {"uv": [6, 9, 13, 16], "rotation": 180, "texture": "#shadow_y"}, + "down": {"uv": [1.25, 7, 8, 10], "rotation": 270, "texture": "#shadow_y"} + } + }, + { + "from": [10, 6, 0.25], + "to": [13, 16, 8], + "shade": false, + "faces": { + "west": {"uv": [6, 6, 14, 16], "rotation": 180, "texture": "#shadow_y"}, + "down": {"uv": [0.25, 10, 8, 13], "rotation": 270, "texture": "#shadow_y"} + } + }, + { + "from": [0, 12, 3.5], + "to": [4, 15, 8], + "shade": false, + "faces": { + "up": {"uv": [4, 12, 9, 16], "rotation": 90, "texture": "#shadow_y"} + } + }, + { + "from": [0, 9, 2.5], + "to": [7, 12, 8], + "shade": false, + "faces": { + "up": {"uv": [3, 9, 9, 16], "rotation": 90, "texture": "#shadow_y"} + } + }, + { + "from": [0, 6, 1.5], + "to": [10, 9, 8], + "shade": false, + "faces": { + "up": {"uv": [2, 6, 9, 16], "rotation": 90, "texture": "#shadow_y"} + } + }, + { + "from": [0, 3, 0.5], + "to": [13, 6, 8], + "shade": false, + "faces": { + "up": {"uv": [2, 3, 10, 16], "rotation": 90, "texture": "#shadow_y"} + } + }, + { + "from": [13, 3, 0], + "to": [16, 16, 8], + "shade": false, + "faces": { + "west": {"uv": [6, 3, 14, 16], "rotation": 180, "texture": "#shadow_y"} + } + }, + { + "from": [0, 0, 0], + "to": [16, 3, 8], + "shade": false, + "faces": { + "up": {"uv": [1, 0, 9, 16], "rotation": 90, "texture": "#shadow_y"} + } + }, + { + "from": [0, 15, 4.25], + "to": [1, 16, 8], + "faces": { + "north": {"uv": [7.5, 8, 8, 8.5], "texture": "#pattern"}, + "west": {"uv": [3, 15, 6.75, 16], "rotation": 180, "texture": "#inner_a", "cullface": "west"}, + "up": {"uv": [4.25, 15, 8, 16], "rotation": 90, "texture": "#inner_a", "cullface": "up"} + } + }, + { + "from": [1, 15, 3.25], + "to": [4, 16, 8], + "faces": { + "north": {"uv": [6, 8, 7.5, 8.5], "texture": "#pattern"}, + "up": {"uv": [3.25, 12, 8, 15], "rotation": 90, "texture": "#inner_a", "cullface": "up"} + } + }, + { + "from": [4, 12, 2.25], + "to": [7, 16, 8], + "faces": { + "north": {"uv": [4.5, 8, 6, 10], "texture": "#pattern"}, + "up": {"uv": [2.25, 9, 8, 12], "rotation": 90, "texture": "#inner_a", "cullface": "up"} + } + }, + { + "from": [7, 9, 1.25], + "to": [10, 16, 8], + "faces": { + "north": {"uv": [3, 8, 4.5, 11.5], "texture": "#pattern"}, + "up": {"uv": [1.25, 6, 8, 9], "rotation": 90, "texture": "#inner_a", "cullface": "up"} + } + }, + { + "from": [10, 6, 0.25], + "to": [13, 16, 8], + "faces": { + "north": {"uv": [1.5, 8, 3, 13], "texture": "#pattern"}, + "up": {"uv": [0.25, 3, 8, 6], "rotation": 90, "texture": "#inner_a", "cullface": "up"} + } + }, + { + "from": [0, 12, 3.5], + "to": [4, 15, 8], + "faces": { + "north": {"uv": [6, 8.5, 8, 10], "texture": "#pattern"}, + "west": {"uv": [2, 12, 6.5, 15], "texture": "#inner_a", "cullface": "west"} + } + }, + { + "from": [0, 9, 2.5], + "to": [7, 12, 8], + "faces": { + "north": {"uv": [4.5, 10, 8, 11.5], "texture": "#pattern"}, + "west": {"uv": [2, 9, 7.5, 12], "texture": "#inner_a", "cullface": "west"} + } + }, + { + "from": [0, 6, 1.5], + "to": [10, 9, 8], + "faces": { + "north": {"uv": [3, 11.5, 8, 13], "texture": "#pattern"}, + "west": {"uv": [2, 6, 8.5, 9], "texture": "#inner_a", "cullface": "west"} + } + }, + { + "from": [0, 3, 0.5], + "to": [13, 6, 8], + "faces": { + "north": {"uv": [1.5, 13, 8, 14.5], "texture": "#pattern"}, + "west": {"uv": [1, 3, 8.5, 6], "texture": "#inner_a", "cullface": "west"} + } + }, + { + "from": [13, 3, 0], + "to": [16, 16, 8], + "faces": { + "north": {"uv": [0, 8, 1.5, 14.5], "texture": "#pattern", "cullface": "north"}, + "east": {"uv": [0, 3, 8, 16], "rotation": 180, "texture": "#border", "cullface": "east"}, + "up": {"uv": [0, 0, 8, 3], "rotation": 90, "texture": "#inner_a", "cullface": "up"} + } + }, + { + "from": [0, 0, 0], + "to": [16, 3, 8], + "faces": { + "north": {"uv": [0, 14.5, 8, 16], "texture": "#pattern", "cullface": "north"}, + "east": {"uv": [0, 0, 8, 3], "rotation": 180, "texture": "#border", "cullface": "east"}, + "west": {"uv": [0, 0, 8, 3], "texture": "#inner_a", "cullface": "west"}, + "down": {"uv": [0, 0, 8, 16], "rotation": 270, "texture": "#border", "cullface": "down"} + } + }, + { + "from": [0, 12, 8], + "to": [1, 15, 12.5], + "shade": false, + "faces": { + "east": {"uv": [3.5, 1, 8, 4], "texture": "#shadow_y"}, + "up": {"uv": [12.5, 16, 8, 15], "rotation": 270, "texture": "#shadow_y"} + } + }, + { + "from": [0, 9, 8], + "to": [4, 12, 13.5], + "shade": false, + "faces": { + "east": {"uv": [2.5, 4, 8, 7], "texture": "#shadow_y"}, + "up": {"uv": [13, 16, 7, 12], "rotation": 270, "texture": "#shadow_y"} + } + }, + { + "from": [0, 6, 8], + "to": [7, 9, 14.5], + "shade": false, + "faces": { + "east": {"uv": [1.5, 7, 8, 10], "texture": "#shadow_y"}, + "up": {"uv": [13, 16, 6, 9], "rotation": 270, "texture": "#shadow_y"} + } + }, + { + "from": [0, 3, 8], + "to": [10, 6, 15.5], + "shade": false, + "faces": { + "east": {"uv": [0.5, 10, 8, 13], "texture": "#shadow_y"}, + "up": {"uv": [14, 16, 6, 6], "rotation": 270, "texture": "#shadow_y"} + } + }, + { + "from": [1, 12, 8], + "to": [4, 16, 12.25], + "shade": false, + "faces": { + "west": {"uv": [3.75, 12, 8, 16], "rotation": 180, "texture": "#shadow_y"} + } + }, + { + "from": [4, 9, 8], + "to": [7, 16, 13.25], + "shade": false, + "faces": { + "west": {"uv": [4, 9, 9, 16], "rotation": 180, "texture": "#shadow_y"} + } + }, + { + "from": [7, 6, 8], + "to": [10, 16, 14.25], + "shade": false, + "faces": { + "west": {"uv": [2, 6, 8, 16], "rotation": 180, "texture": "#shadow_y"} + } + }, + { + "from": [10, 3, 8], + "to": [13, 16, 15.25], + "shade": false, + "faces": { + "west": {"uv": [2, 3, 9, 16], "rotation": 180, "texture": "#shadow_y"} + } + }, + { + "from": [0, 0, 8], + "to": [13, 3, 16], + "shade": false, + "faces": { + "up": {"uv": [15, 16, 7, 3], "rotation": 270, "texture": "#shadow_y"} + } + }, + { + "from": [13, 0, 8], + "to": [16, 16, 16], + "shade": false, + "faces": { + "west": {"uv": [1, 0, 9, 16], "rotation": 180, "texture": "#shadow_y"} + } + }, + { + "from": [0, 15, 8], + "to": [1, 16, 11.75], + "faces": { + "south": {"uv": [8, 8, 8.5, 8.5], "rotation": 90, "texture": "#pattern"}, + "west": {"uv": [8, 15, 11.75, 16], "rotation": 180, "texture": "#inner_a", "cullface": "west"}, + "up": {"uv": [11.75, 16, 8, 15], "rotation": 270, "texture": "#inner_a", "cullface": "up"} + } + }, + { + "from": [0, 12, 8], + "to": [1, 15, 12.5], + "faces": { + "south": {"uv": [8, 8.5, 8.5, 10], "texture": "#pattern"}, + "west": {"uv": [8, 12, 12.5, 15], "texture": "#inner_a", "cullface": "west"} + } + }, + { + "from": [0, 9, 8], + "to": [4, 12, 13.5], + "faces": { + "south": {"uv": [8, 10, 10, 11.5], "texture": "#pattern"}, + "west": {"uv": [9, 9, 14.5, 12], "texture": "#inner_a", "cullface": "west"} + } + }, + { + "from": [0, 6, 8], + "to": [7, 9, 14.5], + "faces": { + "south": {"uv": [8, 11.5, 11.5, 13], "texture": "#pattern"}, + "west": {"uv": [8, 6, 14.5, 9], "texture": "#inner_a", "cullface": "west"} + } + }, + { + "from": [0, 3, 8], + "to": [10, 6, 15.5], + "faces": { + "south": {"uv": [7.5, 13, 13, 14.5], "texture": "#pattern"}, + "west": {"uv": [8, 3, 15.5, 6], "texture": "#inner_a", "cullface": "west"} + } + }, + { + "from": [1, 12, 8], + "to": [4, 16, 12.25], + "faces": { + "south": {"uv": [8.5, 8, 10, 10], "texture": "#pattern"}, + "up": {"uv": [12, 15, 7.75, 12], "rotation": 270, "texture": "#inner_a", "cullface": "up"} + } + }, + { + "from": [4, 9, 8], + "to": [7, 16, 13.25], + "faces": { + "south": {"uv": [10, 8, 11.5, 11.5], "texture": "#pattern"}, + "up": {"uv": [13, 12, 7.75, 9], "rotation": 270, "texture": "#inner_a", "cullface": "up"} + } + }, + { + "from": [7, 6, 8], + "to": [10, 16, 14.25], + "faces": { + "south": {"uv": [11.5, 8, 13, 13], "texture": "#pattern"}, + "up": {"uv": [14, 9, 7.75, 6], "rotation": 270, "texture": "#inner_a", "cullface": "up"} + } + }, + { + "from": [10, 3, 8], + "to": [13, 16, 15.25], + "faces": { + "south": {"uv": [13, 8, 14.5, 14.5], "texture": "#pattern"}, + "up": {"uv": [16, 6, 8.75, 3], "rotation": 270, "texture": "#inner_a", "cullface": "up"} + } + }, + { + "from": [0, 0, 8], + "to": [13, 3, 16], + "faces": { + "south": {"uv": [7.5, 14.5, 14, 16], "texture": "#pattern", "cullface": "south"}, + "west": {"uv": [8, 0, 16, 3], "texture": "#inner_a", "cullface": "west"}, + "down": {"uv": [16, 13, 8, 0], "rotation": 90, "texture": "#border", "cullface": "down"} + } + }, + { + "from": [13, 0, 8], + "to": [16, 16, 16], + "faces": { + "east": {"uv": [8, 0, 16, 16], "rotation": 180, "texture": "#border", "cullface": "east"}, + "south": {"uv": [14.5, 8, 16, 16], "texture": "#pattern", "cullface": "south"}, + "up": {"uv": [16, 3, 8, 0], "rotation": 270, "texture": "#inner_a", "cullface": "up"}, + "down": {"uv": [16, 16, 8, 13], "rotation": 90, "texture": "#border", "cullface": "down"} + } + } + ], + "groups": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, + { + "name": "group", + "origin": [8, 8, 8], + "children": [21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/models/block/spiral_bricks/z_spiral_bottom_right.json b/src/main/resources/assets/twilightforest/models/block/spiral_bricks/z_spiral_bottom_right.json new file mode 100644 index 0000000000..672dedf246 --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/spiral_bricks/z_spiral_bottom_right.json @@ -0,0 +1,371 @@ +{ + "parent": "block/block", + "textures": { + "pattern": "twilightforest:block/stone_spiral_large", + "particle": "block/chiseled_stone_bricks", + "border": "block/chiseled_stone_bricks", + "shadow_y": "twilightforest:block/spiral_shadow_x", + "inner_a": "twilightforest:block/spiral_inner_down" + }, + "elements": [ + { + "from": [15, 12, 3.5], + "to": [16, 15, 8], + "shade": false, + "faces": { + "west": {"uv": [3.5, 1, 8, 4], "texture": "#shadow_y"}, + "up": {"uv": [8, 15, 12.5, 16], "rotation": 270, "texture": "#shadow_y"} + } + }, + { + "from": [12, 9, 2.5], + "to": [16, 12, 8], + "shade": false, + "faces": { + "west": {"uv": [2.5, 4, 8, 7], "texture": "#shadow_y"}, + "up": {"uv": [6, 12, 12, 16], "rotation": 270, "texture": "#shadow_y"} + } + }, + { + "from": [9, 6, 1.5], + "to": [16, 9, 8], + "shade": false, + "faces": { + "west": {"uv": [1.5, 7, 8, 10], "texture": "#shadow_y"}, + "up": {"uv": [6, 9, 13, 16], "rotation": 270, "texture": "#shadow_y"} + } + }, + { + "from": [6, 3, 0.5], + "to": [16, 6, 8], + "shade": false, + "faces": { + "west": {"uv": [0.5, 10, 8, 13], "texture": "#shadow_y"}, + "up": {"uv": [6, 6, 14, 16], "rotation": 270, "texture": "#shadow_y"} + } + }, + { + "from": [12, 12, 3.75], + "to": [15, 16, 8], + "shade": false, + "faces": { + "east": {"uv": [3.75, 12, 8, 16], "rotation": 180, "texture": "#shadow_y"} + } + }, + { + "from": [9, 9, 2.75], + "to": [12, 16, 8], + "shade": false, + "faces": { + "east": {"uv": [3, 9, 8, 16], "rotation": 180, "texture": "#shadow_y"} + } + }, + { + "from": [6, 6, 1.75], + "to": [9, 16, 8], + "shade": false, + "faces": { + "east": {"uv": [2, 6, 8, 16], "rotation": 180, "texture": "#shadow_y"} + } + }, + { + "from": [3, 3, 0.75], + "to": [6, 16, 8], + "shade": false, + "faces": { + "east": {"uv": [2, 3, 9, 16], "rotation": 180, "texture": "#shadow_y"} + } + }, + { + "from": [3, 0, 0], + "to": [16, 3, 8], + "shade": false, + "faces": { + "up": {"uv": [7, 3, 15, 16], "rotation": 270, "texture": "#shadow_y"} + } + }, + { + "from": [0, 0, 0], + "to": [3, 16, 8], + "shade": false, + "faces": { + "east": {"uv": [1, 0, 9, 16], "rotation": 180, "texture": "#shadow_y"} + } + }, + { + "from": [15, 15, 4.25], + "to": [16, 16, 8], + "faces": { + "north": {"uv": [8, 8, 8.5, 8.5], "rotation": 90, "texture": "#pattern"}, + "east": {"uv": [8, 15, 11.75, 16], "rotation": 180, "texture": "#inner_a", "cullface": "east"}, + "up": {"uv": [8, 15, 11.75, 16], "rotation": 270, "texture": "#inner_a", "cullface": "up"} + } + }, + { + "from": [15, 12, 3.5], + "to": [16, 15, 8], + "faces": { + "north": {"uv": [8, 8.5, 8.5, 10], "texture": "#pattern"}, + "east": {"uv": [8, 12, 12.5, 15], "texture": "#inner_a", "cullface": "east"} + } + }, + { + "from": [12, 9, 2.5], + "to": [16, 12, 8], + "faces": { + "north": {"uv": [8, 10, 10, 11.5], "texture": "#pattern"}, + "east": {"uv": [9, 9, 14.5, 12], "texture": "#inner_a", "cullface": "east"} + } + }, + { + "from": [9, 6, 1.5], + "to": [16, 9, 8], + "faces": { + "north": {"uv": [8, 11.5, 11.5, 13], "texture": "#pattern"}, + "east": {"uv": [8, 6, 14.5, 9], "texture": "#inner_a", "cullface": "east"} + } + }, + { + "from": [6, 3, 0.5], + "to": [16, 6, 8], + "faces": { + "north": {"uv": [7.5, 13, 13, 14.5], "texture": "#pattern"}, + "east": {"uv": [8, 3, 15.5, 6], "texture": "#inner_a", "cullface": "east"} + } + }, + { + "from": [12, 12, 3.75], + "to": [15, 16, 8], + "faces": { + "north": {"uv": [8.5, 8, 10, 10], "texture": "#pattern"}, + "up": {"uv": [7.75, 12, 12, 15], "rotation": 90, "texture": "#inner_a", "cullface": "up"} + } + }, + { + "from": [9, 9, 2.75], + "to": [12, 16, 8], + "faces": { + "north": {"uv": [10, 8, 11.5, 11.5], "texture": "#pattern"}, + "up": {"uv": [7.75, 9, 13, 12], "rotation": 90, "texture": "#inner_a", "cullface": "up"} + } + }, + { + "from": [6, 6, 1.75], + "to": [9, 16, 8], + "faces": { + "north": {"uv": [11.5, 8, 13, 13], "texture": "#pattern"}, + "up": {"uv": [7.75, 6, 14, 9], "rotation": 90, "texture": "#inner_a", "cullface": "up"} + } + }, + { + "from": [3, 3, 0.75], + "to": [6, 16, 8], + "faces": { + "north": {"uv": [13, 8, 14.5, 14.5], "texture": "#pattern"}, + "up": {"uv": [8.75, 3, 16, 6], "rotation": 90, "texture": "#inner_a", "cullface": "up"} + } + }, + { + "from": [3, 0, 0], + "to": [16, 3, 8], + "faces": { + "north": {"uv": [7.5, 14.5, 14, 16], "texture": "#pattern", "cullface": "north"}, + "east": {"uv": [8, 0, 16, 3], "texture": "#inner_a", "cullface": "east"}, + "down": {"uv": [0, 3, 8, 16], "rotation": 270, "texture": "#border", "cullface": "down"} + } + }, + { + "from": [0, 0, 0], + "to": [3, 16, 8], + "faces": { + "north": {"uv": [14.5, 8, 16, 16], "texture": "#pattern", "cullface": "north"}, + "west": {"uv": [0, 0, 8, 16], "texture": "#border", "cullface": "west"}, + "up": {"uv": [8, 0, 16, 3], "rotation": 90, "texture": "#inner_a", "cullface": "up"}, + "down": {"uv": [0, 0, 8, 3], "rotation": 270, "texture": "#border", "cullface": "down"} + } + }, + { + "from": [12, 15, 8], + "to": [15, 16, 12.75], + "shade": false, + "faces": { + "east": {"uv": [2, 15, 7, 16], "rotation": 180, "texture": "#shadow_y"}, + "down": {"uv": [8, 4, 3.25, 1], "rotation": 270, "texture": "#shadow_y"} + } + }, + { + "from": [9, 12, 8], + "to": [12, 16, 13.75], + "shade": false, + "faces": { + "east": {"uv": [6, 12, 12, 16], "rotation": 180, "texture": "#shadow_y"}, + "down": {"uv": [8, 7, 2.25, 4], "rotation": 270, "texture": "#shadow_y"} + } + }, + { + "from": [6, 9, 8], + "to": [9, 16, 14.75], + "shade": false, + "faces": { + "east": {"uv": [6, 9, 13, 16], "rotation": 180, "texture": "#shadow_y"}, + "down": {"uv": [8, 10, 1.25, 7], "rotation": 270, "texture": "#shadow_y"} + } + }, + { + "from": [3, 6, 8], + "to": [6, 16, 15.75], + "shade": false, + "faces": { + "east": {"uv": [6, 6, 14, 16], "rotation": 180, "texture": "#shadow_y"}, + "down": {"uv": [8, 13, 0.25, 10], "rotation": 270, "texture": "#shadow_y"} + } + }, + { + "from": [12, 12, 8], + "to": [16, 15, 12.5], + "shade": false, + "faces": { + "up": {"uv": [9, 16, 4, 12], "rotation": 90, "texture": "#shadow_y"} + } + }, + { + "from": [9, 9, 8], + "to": [16, 12, 13.5], + "shade": false, + "faces": { + "up": {"uv": [10, 16, 4, 9], "rotation": 90, "texture": "#shadow_y"} + } + }, + { + "from": [6, 6, 8], + "to": [16, 9, 14.5], + "shade": false, + "faces": { + "up": {"uv": [10, 16, 3, 6], "rotation": 90, "texture": "#shadow_y"} + } + }, + { + "from": [3, 3, 8], + "to": [16, 6, 15.5], + "shade": false, + "faces": { + "up": {"uv": [10, 16, 2, 3], "rotation": 90, "texture": "#shadow_y"} + } + }, + { + "from": [0, 3, 8], + "to": [3, 16, 16], + "shade": false, + "faces": { + "east": {"uv": [7, 3, 15, 16], "rotation": 180, "texture": "#shadow_y"} + } + }, + { + "from": [0, 0, 8], + "to": [16, 3, 16], + "shade": false, + "faces": { + "up": {"uv": [9, 16, 1, 0], "rotation": 90, "texture": "#shadow_y"} + } + }, + { + "from": [15, 15, 8], + "to": [16, 16, 11.75], + "faces": { + "east": {"uv": [3, 15, 6.75, 16], "rotation": 180, "texture": "#inner_a", "cullface": "east"}, + "south": {"uv": [7.5, 8, 8, 8.5], "texture": "#pattern"}, + "up": {"uv": [8, 16, 4.25, 15], "rotation": 90, "texture": "#inner_a", "cullface": "up"} + } + }, + { + "from": [12, 15, 8], + "to": [15, 16, 12.75], + "faces": { + "south": {"uv": [6, 8, 7.5, 8.5], "texture": "#pattern"}, + "up": {"uv": [8, 12, 3.25, 15], "rotation": 90, "texture": "#inner_a", "cullface": "up"} + } + }, + { + "from": [9, 12, 8], + "to": [12, 16, 13.75], + "faces": { + "south": {"uv": [4.5, 8, 6, 10], "texture": "#pattern"}, + "up": {"uv": [8, 9, 2.25, 12], "rotation": 90, "texture": "#inner_a", "cullface": "up"} + } + }, + { + "from": [6, 9, 8], + "to": [9, 16, 14.75], + "faces": { + "south": {"uv": [3, 8, 4.5, 11.5], "texture": "#pattern"}, + "up": {"uv": [8, 6, 1.25, 9], "rotation": 90, "texture": "#inner_a", "cullface": "up"} + } + }, + { + "from": [3, 6, 8], + "to": [6, 16, 15.75], + "faces": { + "south": {"uv": [1.5, 8, 3, 13], "texture": "#pattern"}, + "up": {"uv": [8, 6, 0.25, 3], "rotation": 270, "texture": "#inner_a", "cullface": "up"} + } + }, + { + "from": [12, 12, 8], + "to": [16, 15, 12.5], + "faces": { + "east": {"uv": [2.5, 12, 7, 15], "texture": "#inner_a", "cullface": "east"}, + "south": {"uv": [6, 8.5, 8, 10], "texture": "#pattern"} + } + }, + { + "from": [9, 9, 8], + "to": [16, 12, 13.5], + "faces": { + "east": {"uv": [2.5, 9, 8, 12], "texture": "#inner_a", "cullface": "east"}, + "south": {"uv": [4.5, 10, 8, 11.5], "texture": "#pattern"} + } + }, + { + "from": [6, 6, 8], + "to": [16, 9, 14.5], + "faces": { + "east": {"uv": [1.5, 6, 8, 9], "texture": "#inner_a", "cullface": "east"}, + "south": {"uv": [3, 11.5, 8, 13], "texture": "#pattern"} + } + }, + { + "from": [3, 3, 8], + "to": [16, 6, 15.5], + "faces": { + "east": {"uv": [0.5, 3, 8, 6], "texture": "#inner_a", "cullface": "east"}, + "south": {"uv": [1.5, 13, 8, 14.5], "texture": "#pattern"} + } + }, + { + "from": [0, 3, 8], + "to": [3, 16, 16], + "faces": { + "south": {"uv": [0, 8, 1.5, 14.5], "texture": "#pattern", "cullface": "south"}, + "west": {"uv": [8, 0, 16, 13], "texture": "#border", "cullface": "west"}, + "up": {"uv": [8, 3, 0, 0], "rotation": 270, "texture": "#inner_a", "cullface": "up"} + } + }, + { + "from": [0, 0, 8], + "to": [16, 3, 16], + "faces": { + "east": {"uv": [0, 0, 8, 3], "texture": "#inner_a", "cullface": "east"}, + "south": {"uv": [0, 14.5, 8, 16], "texture": "#pattern", "cullface": "south"}, + "west": {"uv": [8, 13, 16, 16], "texture": "#border", "cullface": "west"}, + "down": {"uv": [16, 16, 8, 0], "rotation": 90, "texture": "#border", "cullface": "down"} + } + } + ], + "groups": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, + { + "name": "group", + "origin": [8, 8, 8], + "children": [21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/models/block/spiral_bricks/z_spiral_top_left.json b/src/main/resources/assets/twilightforest/models/block/spiral_bricks/z_spiral_top_left.json new file mode 100644 index 0000000000..59f0b2e24a --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/spiral_bricks/z_spiral_top_left.json @@ -0,0 +1,367 @@ +{ + "parent": "block/block", + "textures": { + "pattern": "twilightforest:block/stone_spiral_large", + "particle": "block/chiseled_stone_bricks", + "border": "block/chiseled_stone_bricks", + "shadow_y": "twilightforest:block/spiral_shadow_x", + "inner_a": "twilightforest:block/spiral_inner_down" + }, + "elements": [ + { + "from": [13, 0, 0], + "to": [16, 16, 8], + "faces": { + "north": {"uv": [0, 0, 1.5, 8], "texture": "#pattern", "cullface": "north"}, + "east": {"uv": [0, 0, 8, 16], "rotation": 180, "texture": "#border", "cullface": "east"}, + "up": {"uv": [0, 0, 8, 3], "rotation": 90, "texture": "#border", "cullface": "up"}, + "down": {"uv": [8, 0, 16, 3], "rotation": 90, "texture": "#inner_a", "cullface": "down"} + } + }, + { + "from": [0, 1, 4], + "to": [1, 4, 8], + "shade": false, + "faces": { + "east": {"uv": [4, 1, 8, 4], "rotation": 180, "texture": "#shadow_y"}, + "down": {"uv": [8, 15, 12, 16], "rotation": 90, "texture": "#shadow_y"} + } + }, + { + "from": [0, 4, 3], + "to": [1, 7, 8], + "shade": false, + "faces": { + "east": {"uv": [3, 4, 8, 7], "rotation": 180, "texture": "#shadow_y"}, + "down": {"uv": [7, 15, 12, 16], "rotation": 90, "texture": "#shadow_y"} + } + }, + { + "from": [0, 7, 2], + "to": [4, 10, 8], + "shade": false, + "faces": { + "east": {"uv": [2, 7, 8, 10], "rotation": 180, "texture": "#shadow_y"}, + "down": {"uv": [6, 12, 12, 16], "rotation": 90, "texture": "#shadow_y"} + } + }, + { + "from": [0, 10, 1], + "to": [7, 13, 8], + "shade": false, + "faces": { + "east": {"uv": [1, 10, 8, 13], "rotation": 180, "texture": "#shadow_y"}, + "down": {"uv": [5, 9, 12, 16], "rotation": 90, "texture": "#shadow_y"} + } + }, + { + "from": [1, 0, 3.25], + "to": [4, 7, 8], + "shade": false, + "faces": { + "west": {"uv": [4, 8, 9, 15], "texture": "#shadow_y"} + } + }, + { + "from": [4, 0, 2.25], + "to": [7, 10, 8], + "shade": false, + "faces": { + "west": {"uv": [3, 6, 9, 16], "texture": "#shadow_y"} + } + }, + { + "from": [7, 0, 1.25], + "to": [10, 13, 8], + "shade": false, + "faces": { + "west": {"uv": [2, 3, 9, 16], "texture": "#shadow_y"} + } + }, + { + "from": [10, 0, 0.25], + "to": [13, 13, 8], + "shade": false, + "faces": { + "west": {"uv": [2, 3, 10, 16], "texture": "#shadow_y"} + } + }, + { + "from": [0, 13, 0], + "to": [13, 16, 8], + "shade": false, + "faces": { + "down": {"uv": [4, 3, 12, 16], "rotation": 90, "texture": "#shadow_y"} + } + }, + { + "from": [13, 0, 0], + "to": [16, 16, 8], + "shade": false, + "faces": { + "west": {"uv": [2, 0, 10, 16], "texture": "#shadow_y"} + } + }, + { + "from": [0, 0, 4.25], + "to": [1, 1, 8], + "faces": { + "north": {"uv": [8.5, 8, 8, 7.5], "rotation": 90, "texture": "#pattern"}, + "west": {"uv": [4.25, 15, 8, 16], "texture": "#inner_a", "cullface": "west"}, + "down": {"uv": [8, 15, 11.75, 16], "rotation": 90, "texture": "#inner_a", "cullface": "down"} + } + }, + { + "from": [0, 1, 4], + "to": [1, 4, 8], + "faces": { + "north": {"uv": [7.5, 6, 8, 7.5], "texture": "#pattern"}, + "west": {"uv": [4, 12, 8, 15], "texture": "#inner_a", "cullface": "west"} + } + }, + { + "from": [0, 4, 3], + "to": [1, 7, 8], + "faces": { + "north": {"uv": [7.5, 4.5, 8, 6], "texture": "#pattern"}, + "west": {"uv": [3, 9, 8, 12], "texture": "#inner_a", "cullface": "west"} + } + }, + { + "from": [0, 7, 2], + "to": [4, 10, 8], + "faces": { + "north": {"uv": [6, 3, 8, 4.5], "texture": "#pattern"}, + "west": {"uv": [2, 6, 8, 9], "texture": "#inner_a", "cullface": "west"} + } + }, + { + "from": [0, 10, 1], + "to": [7, 13, 8], + "faces": { + "north": {"uv": [4.5, 1.5, 8, 3], "texture": "#pattern"}, + "west": {"uv": [1, 3, 8, 6], "texture": "#inner_a", "cullface": "west"} + } + }, + { + "from": [1, 0, 3.25], + "to": [4, 7, 8], + "faces": { + "north": {"uv": [6, 4.5, 7.5, 8], "texture": "#pattern"}, + "down": {"uv": [8, 12, 12.75, 15], "rotation": 90, "texture": "#inner_a", "cullface": "down"} + } + }, + { + "from": [4, 0, 2.25], + "to": [7, 10, 8], + "faces": { + "north": {"uv": [4.5, 3, 6, 8], "texture": "#pattern"}, + "down": {"uv": [8, 9, 13.75, 12], "rotation": 90, "texture": "#inner_a", "cullface": "down"} + } + }, + { + "from": [7, 0, 1.25], + "to": [10, 13, 8], + "faces": { + "north": {"uv": [3, 1.5, 4.5, 8], "texture": "#pattern"}, + "down": {"uv": [8, 6, 14.75, 9], "rotation": 90, "texture": "#inner_a", "cullface": "down"} + } + }, + { + "from": [10, 0, 0.25], + "to": [13, 13, 8], + "faces": { + "north": {"uv": [1.5, 1.5, 3, 8], "texture": "#pattern"}, + "down": {"uv": [8, 3, 15.75, 6], "rotation": 90, "texture": "#inner_a", "cullface": "down"} + } + }, + { + "from": [0, 13, 0], + "to": [13, 16, 8], + "faces": { + "north": {"uv": [1.5, 0, 8, 1.5], "texture": "#pattern", "cullface": "north"}, + "west": {"uv": [0, 0, 8, 3], "texture": "#inner_a", "cullface": "west"}, + "up": {"uv": [0, 3, 8, 16], "rotation": 90, "texture": "#border", "cullface": "up"} + } + }, + { + "from": [0, 13, 8], + "to": [16, 16, 16], + "faces": { + "east": {"uv": [8, 13, 16, 16], "rotation": 180, "texture": "#border", "cullface": "east"}, + "south": {"uv": [8, 0, 16, 1.5], "texture": "#pattern", "cullface": "south"}, + "west": {"uv": [8, 0, 16, 3], "texture": "#inner_a", "cullface": "west"}, + "up": {"uv": [16, 16, 8, 0], "rotation": 270, "texture": "#border", "cullface": "up"} + } + }, + { + "from": [-0.1, 3.9, 7.9], + "to": [7.1, 7.1, 13.1], + "faces": { + "down": {"uv": [8, 16, 3, 9], "rotation": 270, "texture": "#shadow_y"} + } + }, + { + "from": [0, 7, 8], + "to": [10, 10, 14], + "faces": { + "down": {"uv": [9, 16, 3, 6], "rotation": 270, "texture": "#shadow_y"} + } + }, + { + "from": [0, 10, 8], + "to": [13, 13, 15], + "faces": { + "down": {"uv": [9, 16, 2, 3], "rotation": 270, "texture": "#shadow_y"} + } + }, + { + "from": [13, 0, 8], + "to": [16, 13, 16], + "faces": { + "west": {"uv": [8, 3, 16, 16], "texture": "#shadow_y"} + } + }, + { + "from": [0, 13, 8], + "to": [16, 16, 16], + "faces": { + "down": {"uv": [9, 16, 1, 0], "rotation": 270, "texture": "#shadow_y"} + } + }, + { + "from": [0, 0, 8], + "to": [1, 1, 11.75], + "faces": { + "south": {"uv": [8, 7.5, 8.5, 8], "texture": "#pattern"}, + "west": {"uv": [8, 15, 11.75, 16], "texture": "#inner_a", "cullface": "west"}, + "down": {"uv": [8, 16, 4.25, 15], "rotation": 270, "texture": "#inner_a", "cullface": "down"} + } + }, + { + "from": [1, 0, 8], + "to": [4, 1, 12.25], + "faces": { + "south": {"uv": [8.5, 7.5, 10, 8], "texture": "#pattern"}, + "down": {"uv": [8, 15, 3.75, 12], "rotation": 270, "texture": "#inner_a", "cullface": "down"} + } + }, + { + "from": [4, 0, 8], + "to": [7, 4, 13.25], + "faces": { + "south": {"uv": [10, 6, 11.5, 8], "texture": "#pattern"}, + "down": {"uv": [8, 12, 2.75, 9], "rotation": 270, "texture": "#inner_a", "cullface": "down"} + } + }, + { + "from": [7, 0, 8], + "to": [10, 7, 14.25], + "faces": { + "south": {"uv": [11.5, 4.5, 13, 8], "texture": "#pattern"}, + "down": {"uv": [8, 9, 1.75, 6], "rotation": 270, "texture": "#inner_a", "cullface": "down"} + } + }, + { + "from": [10, 0, 8], + "to": [13, 10, 15.25], + "faces": { + "south": {"uv": [13, 3, 14.5, 8], "texture": "#pattern"}, + "down": {"uv": [8, 6, 0.75, 3], "rotation": 270, "texture": "#inner_a", "cullface": "down"} + } + }, + { + "from": [0, 1, 8], + "to": [4, 4, 12], + "faces": { + "south": {"uv": [8, 6, 10, 7.5], "texture": "#pattern"}, + "west": {"uv": [8, 12, 12, 15], "texture": "#inner_a", "cullface": "west"} + } + }, + { + "from": [0, 4, 8], + "to": [7, 7, 13], + "faces": { + "south": {"uv": [8, 4.5, 11.5, 6], "texture": "#pattern"}, + "west": {"uv": [8, 9, 13, 12], "texture": "#inner_a", "cullface": "west"}, + "down": {"uv": [0, 0, 0, 0], "rotation": 270, "texture": "#shadow_y"} + } + }, + { + "from": [0, 7, 8], + "to": [10, 10, 14], + "faces": { + "south": {"uv": [8, 3, 13, 4.5], "texture": "#pattern"}, + "west": {"uv": [8, 6, 14, 9], "texture": "#inner_a", "cullface": "west"} + } + }, + { + "from": [0, 10, 8], + "to": [13, 13, 15], + "faces": { + "south": {"uv": [8, 1.5, 14.5, 3], "texture": "#pattern"}, + "west": {"uv": [8, 3, 15, 6], "texture": "#inner_a", "cullface": "west"} + } + }, + { + "from": [13, 0, 8], + "to": [16, 13, 16], + "faces": { + "east": {"uv": [8, 0, 16, 13], "rotation": 180, "texture": "#border", "cullface": "east"}, + "south": {"uv": [14.5, 1.5, 16, 8], "texture": "#pattern", "cullface": "south"}, + "down": {"uv": [8, 3, 0, 0], "rotation": 270, "texture": "#inner_a", "cullface": "down"} + } + }, + { + "from": [1, 0, 8], + "to": [4, 1, 12.25], + "faces": { + "west": {"uv": [8, 15, 12.25, 16], "texture": "#shadow_y"}, + "up": {"uv": [8, 4, 3.75, 1], "rotation": 90, "texture": "#shadow_y"} + } + }, + { + "from": [4, 0, 8], + "to": [7, 4, 13.25], + "faces": { + "west": {"uv": [8, 12, 13.25, 16], "texture": "#shadow_y"}, + "up": {"uv": [8, 7, 2.75, 4], "rotation": 90, "texture": "#shadow_y"} + } + }, + { + "from": [7, 0, 8], + "to": [10, 7, 14.25], + "faces": { + "west": {"uv": [8, 9, 14.25, 16], "texture": "#shadow_y"}, + "up": {"uv": [8, 10, 1.75, 7], "rotation": 90, "texture": "#shadow_y"} + } + }, + { + "from": [10, 0, 8], + "to": [13, 10, 15.25], + "faces": { + "west": {"uv": [8, 6, 15.25, 16], "texture": "#shadow_y"}, + "up": {"uv": [8, 13, 0.75, 10], "rotation": 90, "texture": "#shadow_y"} + } + }, + { + "from": [0, 1, 8], + "to": [4, 4, 12], + "faces": { + "down": {"uv": [8, 16, 4, 12], "rotation": 270, "texture": "#shadow_y"} + } + } + ], + "groups": [ + { + "name": "group", + "origin": [8, 8, 8], + "children": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20] + }, + { + "name": "group", + "origin": [8, 8, 8], + "children": [21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/models/block/spiral_bricks/z_spiral_top_right.json b/src/main/resources/assets/twilightforest/models/block/spiral_bricks/z_spiral_top_right.json new file mode 100644 index 0000000000..e735060b2d --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/spiral_bricks/z_spiral_top_right.json @@ -0,0 +1,368 @@ +{ + "parent": "block/block", + "textures": { + "pattern": "twilightforest:block/stone_spiral_large", + "particle": "block/chiseled_stone_bricks", + "border": "block/chiseled_stone_bricks", + "shadow_y": "twilightforest:block/spiral_shadow_x", + "inner_a": "twilightforest:block/spiral_inner_down" + }, + "elements": [ + { + "from": [0, 13, 0], + "to": [16, 16, 8], + "faces": { + "north": {"uv": [8, 0, 16, 1.5], "texture": "#pattern", "cullface": "north"}, + "east": {"uv": [8, 0, 16, 3], "texture": "#inner_a", "cullface": "east"}, + "west": {"uv": [0, 0, 8, 3], "texture": "#border", "cullface": "west"}, + "up": {"uv": [0, 0, 8, 16], "rotation": 90, "texture": "#border", "cullface": "up"} + } + }, + { + "from": [9, 4, 3], + "to": [16, 7, 8], + "faces": { + "down": {"uv": [3, 9, 8, 16], "rotation": 270, "texture": "#shadow_y"} + } + }, + { + "from": [6, 7, 2], + "to": [16, 10, 8], + "faces": { + "down": {"uv": [2, 6, 8, 16], "rotation": 270, "texture": "#shadow_y"} + } + }, + { + "from": [3, 10, 1], + "to": [16, 13, 8], + "faces": { + "down": {"uv": [1, 3, 8, 16], "rotation": 270, "texture": "#shadow_y"} + } + }, + { + "from": [0, 0, 0], + "to": [3, 13, 8], + "faces": { + "east": {"uv": [8, 3, 16, 16], "texture": "#shadow_y"} + } + }, + { + "from": [0, 13, 0], + "to": [16, 16, 8], + "faces": { + "down": {"uv": [1, 0, 9, 16], "rotation": 270, "texture": "#shadow_y"} + } + }, + { + "from": [15, 0, 4.25], + "to": [16, 1, 8], + "faces": { + "north": {"uv": [8, 7.5, 8.5, 8], "texture": "#pattern"}, + "east": {"uv": [8, 15, 11.75, 16], "texture": "#inner_a", "cullface": "east"}, + "down": {"uv": [4.25, 15, 8, 16], "rotation": 270, "texture": "#inner_a", "cullface": "down"} + } + }, + { + "from": [12, 0, 3.75], + "to": [15, 1, 8], + "faces": { + "north": {"uv": [8.5, 7.5, 10, 8], "texture": "#pattern"}, + "down": {"uv": [3.75, 12, 8, 15], "rotation": 270, "texture": "#inner_a", "cullface": "down"} + } + }, + { + "from": [9, 0, 2.75], + "to": [12, 4, 8], + "faces": { + "north": {"uv": [10, 6, 11.5, 8], "texture": "#pattern"}, + "down": {"uv": [2.75, 9, 8, 12], "rotation": 270, "texture": "#inner_a", "cullface": "down"} + } + }, + { + "from": [6, 0, 1.75], + "to": [9, 7, 8], + "faces": { + "north": {"uv": [11.5, 4.5, 13, 8], "texture": "#pattern"}, + "down": {"uv": [1.75, 6, 8, 9], "rotation": 270, "texture": "#inner_a", "cullface": "down"} + } + }, + { + "from": [3, 0, 0.75], + "to": [6, 10, 8], + "faces": { + "north": {"uv": [13, 3, 14.5, 8], "texture": "#pattern"}, + "down": {"uv": [0.75, 3, 8, 6], "rotation": 270, "texture": "#inner_a", "cullface": "down"} + } + }, + { + "from": [12, 1, 4], + "to": [16, 4, 8], + "faces": { + "north": {"uv": [8, 6, 10, 7.5], "texture": "#pattern"}, + "east": {"uv": [8, 12, 12, 15], "texture": "#inner_a", "cullface": "east"} + } + }, + { + "from": [9, 4, 3], + "to": [16, 7, 8], + "faces": { + "north": {"uv": [8, 4.5, 11.5, 6], "texture": "#pattern"}, + "east": {"uv": [8, 9, 13, 12], "texture": "#inner_a", "cullface": "east"} + } + }, + { + "from": [6, 7, 2], + "to": [16, 10, 8], + "faces": { + "north": {"uv": [8, 3, 13, 4.5], "texture": "#pattern"}, + "east": {"uv": [8, 6, 14, 9], "texture": "#inner_a", "cullface": "east"} + } + }, + { + "from": [3, 10, 1], + "to": [16, 13, 8], + "faces": { + "north": {"uv": [8, 1.5, 14.5, 3], "texture": "#pattern"}, + "east": {"uv": [8, 3, 15, 6], "texture": "#inner_a", "cullface": "east"} + } + }, + { + "from": [0, 0, 0], + "to": [3, 13, 8], + "faces": { + "north": {"uv": [14.5, 1.5, 16, 8], "texture": "#pattern", "cullface": "north"}, + "west": {"uv": [0, 3, 8, 16], "texture": "#border", "cullface": "west"}, + "down": {"uv": [0, 0, 8, 3], "rotation": 270, "texture": "#inner_a", "cullface": "down"} + } + }, + { + "from": [12, 0, 3.75], + "to": [15, 1, 8], + "faces": { + "east": {"uv": [7, 15, 11, 16], "texture": "#shadow_y"}, + "up": {"uv": [3.75, 1, 8, 4], "rotation": 90, "texture": "#shadow_y"} + } + }, + { + "from": [9, 0, 2.75], + "to": [12, 4, 8], + "faces": { + "east": {"uv": [9, 12, 14, 16], "texture": "#shadow_y"}, + "up": {"uv": [2.75, 4, 8, 7], "rotation": 90, "texture": "#shadow_y"} + } + }, + { + "from": [6, 0, 1.75], + "to": [9, 7, 8], + "faces": { + "east": {"uv": [9, 9, 15, 16], "texture": "#shadow_y"}, + "up": {"uv": [1.75, 7, 8, 10], "rotation": 90, "texture": "#shadow_y"} + } + }, + { + "from": [3, 0, 0.75], + "to": [6, 10, 8], + "faces": { + "east": {"uv": [8, 6, 15, 16], "texture": "#shadow_y"}, + "up": {"uv": [0.75, 10, 8, 13], "rotation": 90, "texture": "#shadow_y"} + } + }, + { + "from": [12, 1, 4], + "to": [16, 4, 8], + "faces": { + "down": {"uv": [4, 12, 8, 16], "rotation": 270, "texture": "#shadow_y"} + } + }, + { + "from": [0, 0, 8], + "to": [3, 16, 16], + "faces": { + "south": {"uv": [0, 0, 1.5, 8], "texture": "#pattern", "cullface": "south"}, + "west": {"uv": [8, 0, 16, 16], "texture": "#border", "cullface": "west"}, + "up": {"uv": [16, 16, 8, 13], "rotation": 270, "texture": "#border", "cullface": "up"}, + "down": {"uv": [16, 3, 8, 0], "rotation": 90, "texture": "#inner_a", "cullface": "down"} + } + }, + { + "from": [15, 1, 8], + "to": [16, 4, 12], + "shade": false, + "faces": { + "west": {"uv": [4, 1, 8, 4], "rotation": 180, "texture": "#shadow_y"}, + "down": {"uv": [12, 16, 8, 15], "rotation": 90, "texture": "#shadow_y"} + } + }, + { + "from": [15, 4, 8], + "to": [16, 7, 13], + "shade": false, + "faces": { + "west": {"uv": [3, 4, 8, 7], "rotation": 180, "texture": "#shadow_y"}, + "down": {"uv": [12, 16, 7, 15], "rotation": 90, "texture": "#shadow_y"} + } + }, + { + "from": [12, 7, 8], + "to": [16, 10, 14], + "shade": false, + "faces": { + "west": {"uv": [2, 7, 8, 10], "rotation": 180, "texture": "#shadow_y"}, + "down": {"uv": [12, 16, 6, 12], "rotation": 90, "texture": "#shadow_y"} + } + }, + { + "from": [9, 10, 8], + "to": [16, 13, 15], + "shade": false, + "faces": { + "west": {"uv": [1, 10, 8, 13], "rotation": 180, "texture": "#shadow_y"}, + "down": {"uv": [12, 16, 5, 9], "rotation": 90, "texture": "#shadow_y"} + } + }, + { + "from": [12, 0, 8], + "to": [15, 7, 12.75], + "shade": false, + "faces": { + "east": {"uv": [4, 9, 9, 16], "texture": "#shadow_y"} + } + }, + { + "from": [9, 0, 8], + "to": [12, 10, 13.75], + "shade": false, + "faces": { + "east": {"uv": [4, 6, 10, 16], "texture": "#shadow_y"} + } + }, + { + "from": [6, 0, 8], + "to": [9, 13, 14.75], + "shade": false, + "faces": { + "east": {"uv": [3, 3, 10, 16], "texture": "#shadow_y"} + } + }, + { + "from": [3, 0, 8], + "to": [6, 13, 15.75], + "shade": false, + "faces": { + "east": {"uv": [2, 3, 10, 16], "texture": "#shadow_y"} + } + }, + { + "from": [3, 13, 8], + "to": [16, 16, 16], + "shade": false, + "faces": { + "down": {"uv": [12, 16, 4, 3], "rotation": 90, "texture": "#shadow_y"} + } + }, + { + "from": [0, 0, 8], + "to": [3, 16, 16], + "shade": false, + "faces": { + "east": {"uv": [1, 0, 9, 16], "texture": "#shadow_y"} + } + }, + { + "from": [15, 0, 8], + "to": [16, 1, 11.75], + "faces": { + "east": {"uv": [4.25, 15, 8, 16], "texture": "#inner_a", "cullface": "east"}, + "south": {"uv": [8.5, 8, 8, 7.5], "rotation": 90, "texture": "#pattern"}, + "down": {"uv": [11.75, 16, 8, 15], "rotation": 90, "texture": "#inner_a", "cullface": "down"} + } + }, + { + "from": [15, 1, 8], + "to": [16, 4, 12], + "faces": { + "east": {"uv": [4, 12, 8, 15], "texture": "#inner_a", "cullface": "east"}, + "south": {"uv": [7.5, 6, 8, 7.5], "texture": "#pattern"} + } + }, + { + "from": [15, 4, 8], + "to": [16, 7, 13], + "faces": { + "east": {"uv": [3, 9, 8, 12], "texture": "#inner_a", "cullface": "east"}, + "south": {"uv": [7.5, 4.5, 8, 6], "texture": "#pattern"} + } + }, + { + "from": [12, 7, 8], + "to": [16, 10, 14], + "faces": { + "east": {"uv": [2, 6, 8, 9], "texture": "#inner_a", "cullface": "east"}, + "south": {"uv": [6, 3, 8, 4.5], "texture": "#pattern"} + } + }, + { + "from": [9, 10, 8], + "to": [16, 13, 15], + "faces": { + "east": {"uv": [1, 3, 8, 6], "texture": "#inner_a", "cullface": "east"}, + "south": {"uv": [4.5, 1.5, 8, 3], "texture": "#pattern"} + } + }, + { + "from": [12, 0, 8], + "to": [15, 7, 12.75], + "faces": { + "south": {"uv": [6, 4.5, 7.5, 8], "texture": "#pattern"}, + "down": {"uv": [12.75, 15, 8, 12], "rotation": 90, "texture": "#inner_a", "cullface": "down"} + } + }, + { + "from": [9, 0, 8], + "to": [12, 10, 13.75], + "faces": { + "south": {"uv": [4.5, 3, 6, 8], "texture": "#pattern"}, + "down": {"uv": [13.75, 12, 8, 9], "rotation": 90, "texture": "#inner_a", "cullface": "down"} + } + }, + { + "from": [6, 0, 8], + "to": [9, 13, 14.75], + "faces": { + "south": {"uv": [3, 1.5, 4.5, 8], "texture": "#pattern"}, + "down": {"uv": [14.75, 9, 8, 6], "rotation": 90, "texture": "#inner_a", "cullface": "down"} + } + }, + { + "from": [3, 0, 8], + "to": [6, 13, 15.75], + "faces": { + "south": {"uv": [1.5, 1.5, 3, 8], "texture": "#pattern"}, + "down": {"uv": [15.75, 6, 8, 3], "rotation": 90, "texture": "#inner_a", "cullface": "down"} + } + }, + { + "from": [3, 13, 8], + "to": [16, 16, 16], + "faces": { + "east": {"uv": [0, 0, 8, 3], "texture": "#inner_a", "cullface": "east"}, + "south": {"uv": [1.5, 0, 8, 1.5], "texture": "#pattern", "cullface": "south"}, + "up": {"uv": [16, 13, 8, 0], "rotation": 270, "texture": "#border", "cullface": "up"} + } + } + ], + "groups": [ + { + "name": "group", + "origin": [8, 8, 8], + "color": 0, + "children": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20] + }, + { + "name": "group", + "origin": [8, 8, 8], + "color": 0, + "children": [21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/models/block/thorns.json b/src/main/resources/assets/twilightforest/models/block/thorns.json new file mode 100644 index 0000000000..655eced7ff --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/thorns.json @@ -0,0 +1,29 @@ +{ + "parent": "block/block", + "render_type": "minecraft:cutout", + "textures": { + "particle": "#side" + }, + "elements": [ + { + "from": [ 0, 3, 8 ], + "to": [ 16, 13, 8 ], + "rotation": { "origin": [ 8, 8, 8 ], "axis": "y", "angle": 45, "rescale": true }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 3, 16, 13 ], "texture": "#side" }, + "south": { "uv": [ 0, 3, 16, 13 ], "texture": "#side" } + } + }, + { + "from": [ 8, 3, 0 ], + "to": [ 8, 13, 16 ], + "rotation": { "origin": [ 8, 8, 8 ], "axis": "y", "angle": 45, "rescale": true }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 3, 16, 13 ], "texture": "#side" }, + "east": { "uv": [ 0, 3, 16, 13 ], "texture": "#side" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/models/block/thorns_main.json b/src/main/resources/assets/twilightforest/models/block/thorns_main.json new file mode 100755 index 0000000000..ee83412905 --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/thorns_main.json @@ -0,0 +1,41 @@ +{ + "parent": "block/block", + "render_type": "minecraft:cutout", + "textures": { + "particle": "#side" + }, + "elements": [ + { + "from": [ 0, 0, 8 ], + "to": [ 16, 16, 8 ], + "rotation": { "origin": [ 8, 8, 8 ], "axis": "y", "angle": 45, "rescale": true }, + "shade": false, + "faces": { + "north": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" } + } + }, + { + "from": [ 8, 0, 0 ], + "to": [ 8, 16, 16 ], + "rotation": { "origin": [ 8, 8, 8 ], "axis": "y", "angle": 45, "rescale": true }, + "shade": false, + "faces": { + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#side" } + } + }, + { + "from": [ 3, 0, 3 ], + "to": [ 13, 16, 13 ], + "faces": { + "down": { "texture": "#end", "tintindex": 0, "cullface": "down" }, + "up": { "texture": "#end", "tintindex": 0, "cullface": "up" }, + "north": { "texture": "#side", "tintindex": 0, "uv": [3, 0, 13, 16] }, + "south": { "texture": "#side", "tintindex": 0, "uv": [3, 0, 13, 16] }, + "west": { "texture": "#side", "tintindex": 0, "uv": [13, 0, 3, 16] }, + "east": { "texture": "#side", "tintindex": 0, "uv": [13, 0, 3, 16] } + } + } + ] +} diff --git a/src/main/resources/assets/twilightforest/models/block/thorns_no_section.json b/src/main/resources/assets/twilightforest/models/block/thorns_no_section.json new file mode 100644 index 0000000000..5b70cf7d99 --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/thorns_no_section.json @@ -0,0 +1,16 @@ +{ + "parent": "block/block", + "render_type": "minecraft:cutout", + "textures": { + "particle": "#side" + }, + "elements": [ + { + "from": [3, 3, 3], + "to": [13, 13, 3], + "faces": { + "north": {"uv": [3, 3, 13, 13], "texture": "#side"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/models/block/thorns_no_section_alt.json b/src/main/resources/assets/twilightforest/models/block/thorns_no_section_alt.json new file mode 100644 index 0000000000..46569799fe --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/thorns_no_section_alt.json @@ -0,0 +1,17 @@ +{ + "parent": "block/block", + "render_type": "minecraft:cutout", + "textures": { + "particle": "#side" + }, + "elements": [ + { + "from": [3, 3, 3], + "to": [13, 13, 3], + "rotation": {"angle": 0, "axis": "z", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [3, 3, 13, 13], "rotation": 90, "texture": "#side"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/models/block/thorns_section_bottom.json b/src/main/resources/assets/twilightforest/models/block/thorns_section_bottom.json new file mode 100755 index 0000000000..3758f5cc6b --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/thorns_section_bottom.json @@ -0,0 +1,32 @@ +{ + "parent": "block/block", + "render_type": "minecraft:cutout", + "textures": { + "particle": "#side" + }, + "elements": [ + { + "from": [0, 0, 0], + "to": [16, 16, 0], + "faces": { + "north": {"uv": [0, 0, 16, 16], "texture": "#end", "cullface": "north"} + } + }, + { + "from": [3, 0, 0], + "to": [13, 16, 3], + "faces": { + "east": {"uv": [0, 16, 16, 13], "rotation": 90, "texture": "#side"}, + "west": {"uv": [16, 13, 0, 16], "rotation": 90, "texture": "#side"} + } + }, + { + "from": [0, 3, 0], + "to": [16, 13, 3], + "faces": { + "up": {"uv": [0, 13, 16, 16], "rotation": 180, "texture": "#side"}, + "down": {"uv": [0, 13, 16, 16], "texture": "#side"} + } + } + ] +} diff --git a/src/main/resources/assets/twilightforest/models/block/thorns_section_top.json b/src/main/resources/assets/twilightforest/models/block/thorns_section_top.json new file mode 100755 index 0000000000..43af9d9404 --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/thorns_section_top.json @@ -0,0 +1,32 @@ +{ + "parent": "block/block", + "render_type": "minecraft:cutout", + "textures": { + "particle": "#side" + }, + "elements": [ + { + "from": [0, 0, 16], + "to": [16, 16, 16], + "faces": { + "south": {"uv": [0, 0, 16, 16], "texture": "#end", "cullface": "south"} + } + }, + { + "from": [3, 0, 13], + "to": [13, 16, 16], + "faces": { + "east": {"uv": [0, 3, 16, 0], "rotation": 90, "texture": "#side"}, + "west": {"uv": [16, 0, 0, 3], "rotation": 90, "texture": "#side"} + } + }, + { + "from": [0, 3, 13], + "to": [16, 13, 16], + "faces": { + "up": {"uv": [0, 0, 16, 3], "rotation": 180, "texture": "#side"}, + "down": {"uv": [0, 0, 16, 3], "texture": "#side"} + } + } + ] +} diff --git a/src/main/resources/assets/twilightforest/models/block/twilight_portal.json b/src/main/resources/assets/twilightforest/models/block/twilight_portal.json new file mode 100755 index 0000000000..80dddb2b48 --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/twilight_portal.json @@ -0,0 +1,6 @@ +{ + "parent": "block/block", + "render_type": "minecraft:translucent", + "textures": { "all": "block/nether_portal", "particle": "block/nether_portal" }, + "elements": [{ "from": [ 0, 13, 0 ], "to": [ 16, 13, 16 ], "faces": {"up": {"texture": "#all" }}}] +} diff --git a/src/main/resources/assets/twilightforest/models/block/twilight_portal_barrier.json b/src/main/resources/assets/twilightforest/models/block/twilight_portal_barrier.json new file mode 100755 index 0000000000..153d09862f --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/twilight_portal_barrier.json @@ -0,0 +1,26 @@ +{ + "ambientocclusion": false, + "parent": "block/block", + "render_type": "minecraft:cutout", + "textures": { + "all": "twilightforest:block/portal_barrier" + }, + "elements": [ + { + "from": [ 0, 11.5, 0 ], + "to": [ 16, 11.5, 16 ], + "faces": { + "down": { "uv": [ 16, 16, 0, 0 ], "texture": "#all" }, + "up": { "uv": [ 16, 0, 0, 16 ], "texture": "#all" } + } + }, + { + "from": [ 0, 13.5, 0 ], + "to": [ 16, 13.5, 16 ], + "faces": { + "down": { "uv": [ 16, 16, 0, 0 ], "texture": "#all" }, + "up": { "uv": [ 16, 0, 0, 16 ], "texture": "#all" } + } + } + ] +} diff --git a/src/main/resources/assets/twilightforest/models/block/util/bisected_inner_stairs.json b/src/main/resources/assets/twilightforest/models/block/util/bisected_inner_stairs.json new file mode 100644 index 0000000000..18abf42b88 --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/util/bisected_inner_stairs.json @@ -0,0 +1,38 @@ +{ + "textures": { + "particle": "#side" + }, + "elements": [ + { + "from": [ 0, 0, 0 ], + "to": [ 16, 8, 16 ], + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#end", "cullface": "down" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#middle" }, + "north": { "uv": [ 0, 8, 16, 16 ], "texture": "#side", "cullface": "north" }, + "south": { "uv": [ 0, 8, 16, 16 ], "texture": "#side", "cullface": "south" }, + "west": { "uv": [ 0, 8, 16, 16 ], "texture": "#side", "cullface": "west" }, + "east": { "uv": [ 0, 8, 16, 16 ], "texture": "#side", "cullface": "east" } + } + }, { + "from": [ 8, 8, 0 ], + "to": [ 16, 16, 16 ], + "faces": { + "up": { "uv": [ 8, 0, 16, 16 ], "texture": "#end", "cullface": "up" }, + "north": { "uv": [ 0, 0, 8, 8 ], "texture": "#side", "cullface": "north" }, + "south": { "uv": [ 8, 0, 16, 8 ], "texture": "#side", "cullface": "south" }, + "west": { "uv": [ 0, 0, 16, 8 ], "texture": "#side" }, + "east": { "uv": [ 0, 0, 16, 8 ], "texture": "#side", "cullface": "east" } + } + }, { + "from": [ 0, 8, 8 ], + "to": [ 8, 16, 16 ], + "faces": { + "up": { "uv": [ 0, 8, 8, 16 ], "texture": "#end", "cullface": "up" }, + "north": { "uv": [ 8, 0, 16, 8 ], "texture": "#side" }, + "south": { "uv": [ 0, 0, 8, 8 ], "texture": "#side", "cullface": "south" }, + "west": { "uv": [ 8, 0, 16, 8 ], "texture": "#side", "cullface": "west" } + } + } + ] +} diff --git a/src/main/resources/assets/twilightforest/models/block/util/bisected_outer_stairs.json b/src/main/resources/assets/twilightforest/models/block/util/bisected_outer_stairs.json new file mode 100644 index 0000000000..4fd8093761 --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/util/bisected_outer_stairs.json @@ -0,0 +1,29 @@ +{ + "textures": { + "particle": "#side" + }, + "elements": [ + { + "from": [ 0, 0, 0 ], + "to": [ 16, 8, 16 ], + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#end", "cullface": "down" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#middle" }, + "north": { "uv": [ 0, 8, 16, 16 ], "texture": "#side", "cullface": "north" }, + "south": { "uv": [ 0, 8, 16, 16 ], "texture": "#side", "cullface": "south" }, + "west": { "uv": [ 0, 8, 16, 16 ], "texture": "#side", "cullface": "west" }, + "east": { "uv": [ 0, 8, 16, 16 ], "texture": "#side", "cullface": "east" } + } + }, { + "from": [ 8, 8, 8 ], + "to": [ 16, 16, 16 ], + "faces": { + "up": { "uv": [ 8, 8, 16, 16 ], "texture": "#end", "cullface": "up" }, + "north": { "uv": [ 0, 0, 8, 8 ], "texture": "#side" }, + "south": { "uv": [ 8, 0, 16, 8 ], "texture": "#side", "cullface": "south" }, + "west": { "uv": [ 8, 0, 16, 8 ], "texture": "#side" }, + "east": { "uv": [ 0, 0, 8, 8 ], "texture": "#side", "cullface": "east" } + } + } + ] +} diff --git a/src/main/resources/assets/twilightforest/models/block/util/bisected_stairs.json b/src/main/resources/assets/twilightforest/models/block/util/bisected_stairs.json new file mode 100644 index 0000000000..36d6082a1b --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/util/bisected_stairs.json @@ -0,0 +1,47 @@ +{ + "parent": "block/block", + "display": { + "gui": { + "rotation": [ 30, 135, 0 ], + "translation": [ 0, 0, 0 ], + "scale":[ 0.625, 0.625, 0.625 ] + }, + "head": { + "rotation": [ 0, -90, 0 ], + "translation": [ 0, 0, 0 ], + "scale": [ 1, 1, 1 ] + }, + "thirdperson_lefthand": { + "rotation": [ 75, -135, 0 ], + "translation": [ 0, 2.5, 0 ], + "scale": [ 0.375, 0.375, 0.375 ] + } + }, + "textures": { + "particle": "#side" + }, + "elements": [ + { + "from": [ 0, 0, 0 ], + "to": [ 16, 8, 16 ], + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#end", "cullface": "down" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#middle" }, + "north": { "uv": [ 0, 8, 16, 16 ], "texture": "#side", "cullface": "north" }, + "south": { "uv": [ 0, 8, 16, 16 ], "texture": "#side", "cullface": "south" }, + "west": { "uv": [ 0, 8, 16, 16 ], "texture": "#side", "cullface": "west" }, + "east": { "uv": [ 0, 8, 16, 16 ], "texture": "#side", "cullface": "east" } + } + }, { + "from": [ 8, 8, 0 ], + "to": [ 16, 16, 16 ], + "faces": { + "up": { "uv": [ 8, 0, 16, 16 ], "texture": "#end", "cullface": "up" }, + "north": { "uv": [ 0, 0, 8, 8 ], "texture": "#side", "cullface": "north" }, + "south": { "uv": [ 8, 0, 16, 8 ], "texture": "#side", "cullface": "south" }, + "west": { "uv": [ 0, 0, 16, 8 ], "texture": "#side" }, + "east": { "uv": [ 0, 0, 16, 8 ], "texture": "#side", "cullface": "east" } + } + } + ] +} diff --git a/src/main/resources/assets/twilightforest/models/block/util/block_no_ao.json b/src/main/resources/assets/twilightforest/models/block/util/block_no_ao.json new file mode 100644 index 0000000000..dcfb58ecdf --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/util/block_no_ao.json @@ -0,0 +1,37 @@ +{ + "This bug has existed for 6 freaking years": "https://bugs.mojang.com/browse/MC-84633", + "ambientocclusion": false, + "gui_light": "side", + "display": { + "gui": { + "rotation": [ 30, 225, 0 ], + "translation": [ 0, 0, 0], + "scale":[ 0.625, 0.625, 0.625 ] + }, + "ground": { + "rotation": [ 0, 0, 0 ], + "translation": [ 0, 3, 0], + "scale":[ 0.25, 0.25, 0.25 ] + }, + "fixed": { + "rotation": [ 0, 0, 0 ], + "translation": [ 0, 0, 0], + "scale":[ 0.5, 0.5, 0.5 ] + }, + "thirdperson_righthand": { + "rotation": [ 75, 45, 0 ], + "translation": [ 0, 2.5, 0], + "scale": [ 0.375, 0.375, 0.375 ] + }, + "firstperson_righthand": { + "rotation": [ 0, 45, 0 ], + "translation": [ 0, 0, 0 ], + "scale": [ 0.40, 0.40, 0.40 ] + }, + "firstperson_lefthand": { + "rotation": [ 0, 225, 0 ], + "translation": [ 0, 0, 0 ], + "scale": [ 0.40, 0.40, 0.40 ] + } + } +} diff --git a/src/main/resources/assets/twilightforest/models/block/util/cube_column_rotationally_correct_x.json b/src/main/resources/assets/twilightforest/models/block/util/cube_column_rotationally_correct_x.json new file mode 100755 index 0000000000..b7f2e88da9 --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/util/cube_column_rotationally_correct_x.json @@ -0,0 +1,20 @@ +{ + "parent": "block/block", + "textures": { + "particle": "#side" + }, + "elements": [ + { + "from": [ 0, 0, 0 ], + "to": [ 16, 16, 16 ], + "faces": { + "down": { "uv": [0, 0, 16, 16], "texture": "#end" , "cullface": "down" }, + "up": { "uv": [16, 16, 0, 0], "texture": "#end" , "cullface": "up" }, + "north": { "uv": [0, 16, 16, 0], "texture": "#side", "cullface": "north" }, + "south": { "uv": [0, 16, 16, 0], "texture": "#side", "cullface": "south" }, + "west": { "uv": [16, 0, 0, 16], "texture": "#side", "cullface": "west" }, + "east": { "uv": [0, 16, 16, 0], "texture": "#side", "cullface": "east" } + } + } + ] +} diff --git a/src/main/resources/assets/twilightforest/models/block/util/cube_column_rotationally_correct_z.json b/src/main/resources/assets/twilightforest/models/block/util/cube_column_rotationally_correct_z.json new file mode 100755 index 0000000000..d6d5a7916c --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/block/util/cube_column_rotationally_correct_z.json @@ -0,0 +1,20 @@ +{ + "parent": "block/block", + "textures": { + "particle": "#side" + }, + "elements": [ + { + "from": [ 0, 0, 0 ], + "to": [ 16, 16, 16 ], + "faces": { + "down": { "uv": [0, 0, 16, 16], "texture": "#end" , "cullface": "down" }, + "up": { "uv": [16, 16, 0, 0], "texture": "#end" , "cullface": "up" }, + "north": { "uv": [16, 16, 0, 0], "texture": "#side", "cullface": "north" }, + "south": { "uv": [0, 0, 16, 16], "texture": "#side", "cullface": "south" }, + "west": { "uv": [16, 0, 0, 16], "texture": "#side", "cullface": "west" }, + "east": { "uv": [0, 16, 16, 0], "texture": "#side", "cullface": "east" } + } + } + ] +} diff --git a/src/main/resources/assets/twilightforest/models/item/alpha_yeti_trophy.json b/src/main/resources/assets/twilightforest/models/item/alpha_yeti_trophy.json new file mode 100644 index 0000000000..801620575d --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/item/alpha_yeti_trophy.json @@ -0,0 +1,13 @@ +{ + "parent": "twilightforest:item/template_trophy", + "textures": { + "particle": "block/soul_sand" + }, + "display": { + "head": { + "rotation": [ 180, 0, 180 ], + "translation": [ 0, 2, 0 ], + "scale":[ 1.5, 1.5, 1.5 ] + } + } +} diff --git a/src/main/resources/assets/twilightforest/models/item/banister_item.json b/src/main/resources/assets/twilightforest/models/item/banister_item.json new file mode 100644 index 0000000000..d477dc505c --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/item/banister_item.json @@ -0,0 +1,42 @@ +{ + "parent": "block/block", + "textures": { + "particle": "#texture" + }, + "elements": [ + { + "from": [0, 12, 6], + "to": [16, 16, 10], + "faces": { + "north": {"uv": [0, 0, 16, 4], "texture": "#texture"}, + "east": {"uv": [6, 0, 10, 4], "texture": "#texture"}, + "south": {"uv": [0, 0, 16, 4], "texture": "#texture"}, + "west": {"uv": [6, 0, 10, 4], "texture": "#texture"}, + "up": {"uv": [0, 12, 16, 16], "texture": "#texture"}, + "down": {"uv": [0, 0, 16, 4], "texture": "#texture"} + } + }, + { + "from": [2.5, 0, 6.5], + "to": [5.5, 12, 9.5], + "faces": { + "north": {"uv": [0, 4, 12, 7], "rotation": 270, "texture": "#texture"}, + "east": {"uv": [0, 4, 12, 7], "rotation": 270, "texture": "#texture"}, + "south": {"uv": [0, 4, 12, 7], "rotation": 270, "texture": "#texture"}, + "west": {"uv": [0, 4, 12, 7], "rotation": 270, "texture": "#texture"}, + "down": {"uv": [2.5, 0, 5.5, 3], "texture": "#texture"} + } + }, + { + "from": [10.5, 0, 6.5], + "to": [13.5, 12, 9.5], + "faces": { + "north": {"uv": [0, 8, 12, 11], "rotation": 270, "texture": "#texture"}, + "east": {"uv": [0, 8, 12, 11], "rotation": 270, "texture": "#texture"}, + "south": {"uv": [0, 8, 12, 11], "rotation": 270, "texture": "#texture"}, + "west": {"uv": [0, 8, 12, 11], "rotation": 270, "texture": "#texture"}, + "down": {"uv": [10.5, 0, 13.5, 3], "texture": "#texture"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/models/item/cicada.json b/src/main/resources/assets/twilightforest/models/item/cicada.json new file mode 100644 index 0000000000..470fbc149c --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/item/cicada.json @@ -0,0 +1,45 @@ +{ + "parent": "builtin/entity", + "display": { + "gui": { + "rotation": [ -55, 180, 135 ], + "translation": [ 1.5, 5, 0 ], + "scale":[ 1.1, 1.1, 1.1 ] + }, + "ground": { + "rotation": [ 270, 180, 0 ], + "translation": [ 0, 3, 0 ], + "scale":[ 0.5, 0.5, 0.5 ] + }, + "head": { + "rotation": [ 90, 0, 180 ], + "translation": [ 0, 14.5, 0], + "scale":[ 1, 1, 1] + }, + "fixed": { + "rotation": [ 180, 180, 180 ], + "translation": [ 0, 2, -7.5 ], + "scale":[ 1, 1, 1 ] + }, + "thirdperson_righthand": { + "rotation": [ 90, 0, 180 ], + "translation": [ 0, 3.3, 2], + "scale": [ 0.375, 0.375, 0.375 ] + }, + "thirdperson_lefthand": { + "rotation": [ 90, 0, 180 ], + "translation": [ 0, 3.3, 2], + "scale": [ 0.375, 0.375, 0.375 ] + }, + "firstperson_righthand": { + "rotation": [ 295, 180, -15 ], + "translation": [ 2, 5, 0 ], + "scale": [ 0.6, 0.6, 0.6 ] + }, + "firstperson_lefthand": { + "rotation": [ 295, 180, -10 ], + "translation": [ 3, 5, 0 ], + "scale": [ 0.6, 0.6, 0.6 ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/models/item/firefly.json b/src/main/resources/assets/twilightforest/models/item/firefly.json new file mode 100644 index 0000000000..6715de69df --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/item/firefly.json @@ -0,0 +1,45 @@ +{ + "parent": "builtin/entity", + "display": { + "gui": { + "rotation": [ -55, 180, 135 ], + "translation": [ 1, 5, 0 ], + "scale":[ 1.1, 1.1, 1.1 ] + }, + "ground": { + "rotation": [ 270, 180, 0 ], + "translation": [ 0, 3, 0 ], + "scale":[ 0.5, 0.5, 0.5 ] + }, + "head": { + "rotation": [ 90, 0, 180 ], + "translation": [ 0, 14.5, 0], + "scale":[ 1, 1, 1] + }, + "fixed": { + "rotation": [ 180, 180, 180 ], + "translation": [ 0, 0, -7.5 ], + "scale":[ 1, 1, 1 ] + }, + "thirdperson_righthand": { + "rotation": [ 90, 0, 180 ], + "translation": [ 0, 3.3, 2], + "scale": [ 0.375, 0.375, 0.375 ] + }, + "thirdperson_lefthand": { + "rotation": [ 90, 0, 180 ], + "translation": [ 0, 3.3, 2], + "scale": [ 0.375, 0.375, 0.375 ] + }, + "firstperson_righthand": { + "rotation": [ 295, 180, -15 ], + "translation": [ 2, 5, 0 ], + "scale": [ 0.6, 0.6, 0.6 ] + }, + "firstperson_lefthand": { + "rotation": [ 295, 180, -10 ], + "translation": [ 3, 5, 0 ], + "scale": [ 0.6, 0.6, 0.6 ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/models/item/giant_pickaxe.json b/src/main/resources/assets/twilightforest/models/item/giant_pickaxe.json new file mode 100644 index 0000000000..89635cfc58 --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/item/giant_pickaxe.json @@ -0,0 +1,43 @@ +{ + "parent": "item/generated", + "__comment": "Transforms are [VanillaCopy] item/generated and item/handheld. Firstperson scales are multiplied by 2.5, all others by 5", + "textures": { + "layer0": "item/stone_pickaxe" + }, + "display": { + "ground": { + "rotation": [ 0, 0, 0 ], + "translation": [ 0, 2, 0], + "scale":[ 2.5, 2.5, 2.5 ] + }, + "head": { + "rotation": [ 0, 180, 0 ], + "translation": [ 0, 13, 7], + "scale":[ 5, 5, 5] + }, + "fixed": { + "rotation": [ 0, 180, 0 ], + "scale": [ 5, 5, 5 ] + }, + "thirdperson_righthand": { + "rotation": [ 0, -90, 55 ], + "translation": [ -0.1, 32.0, -5.5 ], + "scale": [ 4.25, 4.25, 4.25 ] + }, + "thirdperson_lefthand": { + "rotation": [ 0, 90, -55 ], + "translation": [ -0.1, 32.0, -5.5 ], + "scale": [ 4.25, 4.25, 4.25 ] + }, + "firstperson_righthand": { + "rotation": [ 0, -90, 25 ], + "translation": [ 1.13, 3.2, 1.13 ], + "scale": [ 1.7, 1.7, 1.7 ] + }, + "firstperson_lefthand": { + "rotation": [ 0, 90, -25 ], + "translation": [ 1.13, 3.2, 1.13 ], + "scale": [ 1.7, 1.7, 1.7 ] + } + } +} diff --git a/src/main/resources/assets/twilightforest/models/item/giant_sword.json b/src/main/resources/assets/twilightforest/models/item/giant_sword.json new file mode 100644 index 0000000000..807a4bcc88 --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/item/giant_sword.json @@ -0,0 +1,44 @@ +{ + "parent": "builtin/generated", + "gui_light": "front", + "__comment": "Transforms are [VanillaCopy] item/generated and item/handheld. Firstperson scales are multiplied by 2.5, all others by 5", + "textures": { + "layer0": "item/stone_sword" + }, + "display": { + "ground": { + "rotation": [ 0, 0, 0 ], + "translation": [ 0, 2, 0], + "scale":[ 2.5, 2.5, 2.5 ] + }, + "head": { + "rotation": [ 0, 180, 0 ], + "translation": [ 0, 13, 7], + "scale":[ 5, 5, 5] + }, + "fixed": { + "rotation": [ 0, 180, 0 ], + "scale": [ 5, 5, 5 ] + }, + "thirdperson_righthand": { + "rotation": [ 0, -90, 55 ], + "translation": [ -0.1, 25.0, -5.5 ], + "scale": [ 4.25, 4.25, 4.25 ] + }, + "thirdperson_lefthand": { + "rotation": [ 0, 90, -55 ], + "translation": [ -0.1, 25.0, -5.5 ], + "scale": [ 4.25, 4.25, 4.25 ] + }, + "firstperson_righthand": { + "rotation": [ 0, -90, 25 ], + "translation": [ 1.13, 3.2, 1.13 ], + "scale": [ 1.7, 1.7, 1.7 ] + }, + "firstperson_lefthand": { + "rotation": [ 0, 90, -25 ], + "translation": [ 1.13, 3.2, 1.13 ], + "scale": [ 1.7, 1.7, 1.7 ] + } + } +} diff --git a/src/main/resources/assets/twilightforest/models/item/iron_ladder.json b/src/main/resources/assets/twilightforest/models/item/iron_ladder.json new file mode 100644 index 0000000000..75972e668a --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/item/iron_ladder.json @@ -0,0 +1,179 @@ +{ + "ambientocclusion": false, + "display": { + "gui": { + "rotation" : [ 0, 180, 0 ] + }, + "ground": { + "rotation" : [ 0 , 0 , 0 ], + "translation": [ 0 , 4 , -3.5 ], + "scale" : [ 0.5, 0.5, 0.5 ] + }, + "head": { + "rotation" : [ 0, 0, 0 ], + "translation": [ 0, 13, 7 ], + "scale" : [ 1, 1, 1 ] + }, + "thirdperson_righthand": { + "rotation" : [ 0 , 180 , 0 ], + "translation": [ 0 , 3 , 5.4 ], + "scale" : [ 0.55, 0.55, 0.55 ] + }, + "firstperson_righthand": { + "rotation" : [ 0, -90, 25 ], + "translation": [ 6.57, 3.2, 1.13 ], + "scale" : [ 0.68, 0.68, 0.68 ] + }, + "fixed": { + "rotation" : [ 0, 0, 0 ], + "translation": [ 0, 0, -7 ], + "scale" : [ 1, 1, 1 ] + } + }, + "textures": { + "particle": "twilightforest:block/ladder_iron" + }, + "elements": [ + { + "from": [ 1, 13, 15.2 ], + "to" : [ 15, 15, 16 ], + "faces": { + "up" : { "uv": [ 15 , 0 , 1 , 0.8 ], "texture": "#particle" }, + "down" : { "uv": [ 15 , 1.2, 1 , 2 ], "texture": "#particle" }, + "north": { "uv": [ 1 , 0 , 15 , 2 ], "texture": "#particle" }, + "south": { "uv": [ 15 , 0 , 1 , 2 ], "texture": "#particle", "cullface": "south" }, + "east" : { "uv": [ 1 , 0 , 1.8, 2 ], "texture": "#particle" }, + "west" : { "uv": [ 14.2, 0 , 15 , 2 ], "texture": "#particle" } + } + }, { + "from": [ 1, 9, 15.2 ], + "to" : [ 15, 11, 16 ], + "faces": { + "up" : { "uv": [ 15 , 4 , 1 , 4.8 ], "texture": "#particle" }, + "down" : { "uv": [ 15 , 5.2, 1 , 6 ], "texture": "#particle" }, + "north": { "uv": [ 1 , 4 , 15 , 6 ], "texture": "#particle" }, + "south": { "uv": [ 15 , 4 , 1 , 6 ], "texture": "#particle", "cullface": "south" }, + "east" : { "uv": [ 0 , 4 , 0.8, 6 ], "texture": "#particle" }, + "west" : { "uv": [ 14.2, 4 , 15 , 6 ], "texture": "#particle" } + } + }, { + "from": [ 1, 5, 15.2 ], + "to" : [ 15, 7, 16 ], + "faces": { + "up" : { "uv": [ 15 , 8 , 1 , 8.8 ], "texture": "#particle" }, + "down" : { "uv": [ 15 , 9.2, 1 , 10 ], "texture": "#particle" }, + "north": { "uv": [ 1 , 8 , 15 , 10 ], "texture": "#particle" }, + "south": { "uv": [ 15 , 8 , 1 , 10 ], "texture": "#particle", "cullface": "south" }, + "east" : { "uv": [ 0 , 8 , 0.8, 10 ], "texture": "#particle" }, + "west" : { "uv": [ 14.2, 8 , 15 , 10 ], "texture": "#particle" } + } + }, { + "from": [ 1, 1, 15.2 ], + "to" : [ 15, 3, 16 ], + "faces": { + "up" : { "uv": [ 15 , 12 , 1 , 12.8 ], "texture": "#particle" }, + "down" : { "uv": [ 15 , 13.2, 1 , 14 ], "texture": "#particle" }, + "north": { "uv": [ 1 , 12 , 15 , 14 ], "texture": "#particle" }, + "south": { "uv": [ 15 , 12 , 1 , 14 ], "texture": "#particle", "cullface": "south" }, + "east" : { "uv": [ 0 , 12 , 0.8, 14 ], "texture": "#particle" }, + "west" : { "uv": [ 14.2, 12 , 15 , 14 ], "texture": "#particle" } + } + }, { + "from": [ 2, 0.5, 14 ], + "to" : [ 4, 2.5, 16 ], + "faces": { + "up" : { "uv": [ 4, 14, 2, 16 ], "texture": "#particle" }, + "down" : { "uv": [ 2, 14, 4, 16 ], "texture": "#particle" }, + "north": { "uv": [ 2, 14, 4, 16 ], "texture": "#particle" }, + "south": { "uv": [ 2, 16, 4, 14 ], "texture": "#particle", "cullface": "south" }, + "east" : { "uv": [ 4, 14, 2, 16 ], "texture": "#particle" }, + "west" : { "uv": [ 4, 16, 2, 14 ], "texture": "#particle" } + }, + "rotation": { "origin": [ 8, 2.5, 16 ], "axis": "x", "angle": -22.5 } + }, { + "from": [ 12, 0.5, 14 ], + "to" : [ 14, 2.5, 16 ], + "faces": { + "up" : { "uv": [ 14, 14, 12, 16 ], "texture": "#particle" }, + "down" : { "uv": [ 12, 14, 14, 16 ], "texture": "#particle" }, + "north": { "uv": [ 12, 14, 14, 16 ], "texture": "#particle" }, + "south": { "uv": [ 12, 16, 14, 14 ], "texture": "#particle", "cullface": "south" }, + "east" : { "uv": [ 14, 14, 12, 16 ], "texture": "#particle" }, + "west" : { "uv": [ 14, 16, 12, 14 ], "texture": "#particle" } + }, + "rotation": { "origin": [ 8, 2.5, 16 ], "axis": "x", "angle": -22.5 } + }, { + "from": [ 2, 4.5, 14 ], + "to" : [ 4, 6.5, 16 ], + "faces": { + "up" : { "uv": [ 4, 10, 2, 12 ], "texture": "#particle" }, + "down" : { "uv": [ 2, 10, 4, 12 ], "texture": "#particle" }, + "north": { "uv": [ 2, 10, 4, 12 ], "texture": "#particle" }, + "south": { "uv": [ 2, 12, 4, 10 ], "texture": "#particle", "cullface": "south" }, + "east" : { "uv": [ 4, 10, 2, 12 ], "texture": "#particle" }, + "west" : { "uv": [ 4, 12, 2, 10 ], "texture": "#particle" } + }, + "rotation": { "origin": [ 8, 6.5, 16 ], "axis": "x", "angle": -22.5 } + }, { + "from": [ 12, 4.5, 14 ], + "to" : [ 14, 6.5, 16 ], + "faces": { + "up" : { "uv": [ 14, 10, 12, 12 ], "texture": "#particle" }, + "down" : { "uv": [ 12, 10, 14, 12 ], "texture": "#particle" }, + "north": { "uv": [ 12, 10, 14, 12 ], "texture": "#particle" }, + "south": { "uv": [ 12, 12, 14, 10 ], "texture": "#particle", "cullface": "south" }, + "east" : { "uv": [ 14, 10, 12, 12 ], "texture": "#particle" }, + "west" : { "uv": [ 14, 12, 12, 10 ], "texture": "#particle" } + }, + "rotation": { "origin": [ 8, 6.5, 16 ], "axis": "x", "angle": -22.5 } + }, { + "from": [ 2, 8.5, 14 ], + "to" : [ 4, 10.5, 16 ], + "faces": { + "up" : { "uv": [ 4, 6, 2, 8 ], "texture": "#particle" }, + "down" : { "uv": [ 2, 6, 4, 8 ], "texture": "#particle" }, + "north": { "uv": [ 2, 6, 4, 8 ], "texture": "#particle" }, + "south": { "uv": [ 2, 8, 4, 6 ], "texture": "#particle", "cullface": "south" }, + "east" : { "uv": [ 4, 6, 2, 8 ], "texture": "#particle" }, + "west" : { "uv": [ 4, 8, 2, 6 ], "texture": "#particle" } + }, + "rotation": { "origin": [ 8, 10.5, 16 ], "axis": "x", "angle": -22.5 } + }, { + "from": [ 12, 8.5, 14 ], + "to" : [ 14, 10.5, 16 ], + "faces": { + "up" : { "uv": [ 14, 6, 12, 8 ], "texture": "#particle" }, + "down" : { "uv": [ 12, 6, 14, 8 ], "texture": "#particle" }, + "north": { "uv": [ 12, 6, 14, 8 ], "texture": "#particle" }, + "south": { "uv": [ 12, 8, 14, 6 ], "texture": "#particle", "cullface": "south" }, + "east" : { "uv": [ 14, 6, 12, 8 ], "texture": "#particle" }, + "west" : { "uv": [ 14, 8, 12, 6 ], "texture": "#particle" } + }, + "rotation": { "origin": [ 8, 10.5, 16 ], "axis": "x", "angle": -22.5 } + }, { + "from": [ 2, 12.5, 14 ], + "to" : [ 4, 14.5, 16 ], + "faces": { + "up" : { "uv": [ 4, 2, 2, 4 ], "texture": "#particle" }, + "down" : { "uv": [ 2, 2, 4, 4 ], "texture": "#particle" }, + "north": { "uv": [ 2, 2, 4, 4 ], "texture": "#particle" }, + "south": { "uv": [ 2, 4, 4, 2 ], "texture": "#particle", "cullface": "south" }, + "east" : { "uv": [ 4, 2, 2, 4 ], "texture": "#particle" }, + "west" : { "uv": [ 4, 4, 2, 2 ], "texture": "#particle" } + }, + "rotation": { "origin": [ 8, 14.5, 16 ], "axis": "x", "angle": -22.5 } + }, { + "from": [ 12, 12.5, 14 ], + "to" : [ 14, 14.5, 16 ], + "faces": { + "up" : { "uv": [ 14, 2, 12, 4 ], "texture": "#particle" }, + "down" : { "uv": [ 12, 2, 14, 4 ], "texture": "#particle" }, + "north": { "uv": [ 12, 2, 14, 4 ], "texture": "#particle" }, + "south": { "uv": [ 12, 4, 14, 2 ], "texture": "#particle", "cullface": "south" }, + "east" : { "uv": [ 14, 2, 12, 4 ], "texture": "#particle" }, + "west" : { "uv": [ 14, 4, 12, 2 ], "texture": "#particle" } + }, + "rotation": { "origin": [ 8, 14.5, 16 ], "axis": "x", "angle": -22.5 } + } + ] +} diff --git a/src/main/resources/assets/twilightforest/models/item/keepsake_casket.json b/src/main/resources/assets/twilightforest/models/item/keepsake_casket.json new file mode 100644 index 0000000000..02e0261046 --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/item/keepsake_casket.json @@ -0,0 +1,33 @@ +{ + "parent": "builtin/entity", + "textures": { + "particle": "block/netherite_block" + }, + "display": { + "gui": { + "rotation": [ 30, 225, 0 ], + "translation": [ 0, 0, 0], + "scale":[ 0.625, 0.625, 0.625 ] + }, + "ground": { + "rotation": [ 0, 0, 0 ], + "translation": [ 0, 3, 0], + "scale":[ 0.3, 0.3, 0.3 ] + }, + "fixed": { + "rotation": [ 0, 0, 0 ], + "translation": [ 0, 0, 0], + "scale":[ 0.625, 0.625, 0.625 ] + }, + "thirdperson_righthand": { + "rotation": [ 75, 315, 0 ], + "translation": [ 0, 2.5, 0], + "scale": [ 0.375, 0.375, 0.375 ] + }, + "firstperson_righthand": { + "rotation": [ 0, 315, 0 ], + "translation": [ 0, 0, 0], + "scale": [ 0.4, 0.4, 0.4 ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/models/item/knightmetal_shield.json b/src/main/resources/assets/twilightforest/models/item/knightmetal_shield.json new file mode 100644 index 0000000000..f63431c83b --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/item/knightmetal_shield.json @@ -0,0 +1,48 @@ +{ + "parent": "builtin/entity", + "gui_light": "front", + "textures": { + "particle": "twilightforest:block/towerwood" + }, + "display": { + "thirdperson_righthand": { + "rotation": [ 0, 90, 0 ], + "translation": [ 10.51, 6, -4 ], + "scale": [ 1, 1, 1 ] + }, + "thirdperson_lefthand": { + "rotation": [ 0, 90, 0 ], + "translation": [ 10.51, 6, 12 ], + "scale": [ 1, 1, 1 ] + }, + "firstperson_righthand": { + "rotation": [ 0, 180, 5 ], + "translation": [ -10, 2, -10 ], + "scale": [ 1.25, 1.25, 1.25 ] + }, + "firstperson_lefthand": { + "rotation": [ 0, 180, 5 ], + "translation": [ 10, 0, -10 ], + "scale": [ 1.25, 1.25, 1.25 ] + }, + "gui": { + "rotation": [ 15, -25, -5 ], + "translation": [ 3, 2, 0 ], + "scale": [ 0.65, 0.65, 0.65 ] + }, + "fixed": { + "rotation": [ 0, 180, 0 ], + "translation": [ -2, 4, -5], + "scale":[ 0.5, 0.5, 0.5] + }, + "ground": { + "rotation": [ 0, 0, 0 ], + "translation": [ 4, 4, 2], + "scale":[ 0.25, 0.25, 0.25] + } + }, + "overrides": [{ + "predicate": { "blocking": 1 }, + "model": "twilightforest:item/knightmetal_shield_blocking" + }] +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/models/item/knightmetal_shield_blocking.json b/src/main/resources/assets/twilightforest/models/item/knightmetal_shield_blocking.json new file mode 100644 index 0000000000..b8e5e8f1b0 --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/item/knightmetal_shield_blocking.json @@ -0,0 +1,34 @@ +{ + "parent": "builtin/entity", + "gui_light": "front", + "textures": { + "particle": "twilightforest:block/towerwood" + }, + "display": { + "thirdperson_righthand": { + "rotation": [ 45, 135, 0 ], + "translation": [ 3.51, 11, -2 ], + "scale": [ 1, 1, 1 ] + }, + "thirdperson_lefthand": { + "rotation": [ 45, 135, 0 ], + "translation": [ 13.51, 3, 5 ], + "scale": [ 1, 1, 1 ] + }, + "firstperson_righthand": { + "rotation": [ 0, 180, -5 ], + "translation": [ -15, 5, -11 ], + "scale": [ 1.25, 1.25, 1.25 ] + }, + "firstperson_lefthand": { + "rotation": [ 0, 180, -5 ], + "translation": [ 5, 5, -11 ], + "scale": [ 1.25, 1.25, 1.25 ] + }, + "gui": { + "rotation": [ 15, -25, -5 ], + "translation": [ 3, 2, 0 ], + "scale": [ 0.65, 0.65, 0.65 ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/models/item/moon_dial_template.json b/src/main/resources/assets/twilightforest/models/item/moon_dial_template.json new file mode 100644 index 0000000000..34abbfe8cc --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/item/moon_dial_template.json @@ -0,0 +1,15 @@ +{ + "parent" : "item/generated", + "display": { + "firstperson_righthand": { + "rotation" : [ 0 , -45 , -5 ], + "translation": [ 0 , 5.3 , 1.13 ], + "scale" : [ 0.68, 0.68, 0.68 ] + }, + "firstperson_lefthand": { + "rotation" : [ 0 , -45 , -5 ], + "translation": [ 0 , 5.3 , 1.13 ], + "scale" : [ 0.68, 0.68, 0.68 ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/models/item/moonworm.json b/src/main/resources/assets/twilightforest/models/item/moonworm.json new file mode 100644 index 0000000000..7c0e02bf77 --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/item/moonworm.json @@ -0,0 +1,45 @@ +{ + "parent": "builtin/entity", + "display": { + "gui": { + "rotation": [ -55, 180, 135 ], + "translation": [ 1, 5, 0 ], + "scale":[ 1.1, 1.1, 1.1 ] + }, + "ground": { + "rotation": [ 270, 180, 0 ], + "translation": [ 0, 3, 0 ], + "scale":[ 0.5, 0.5, 0.5 ] + }, + "head": { + "rotation": [ 0, 180, 0 ], + "translation": [ 0, 0, 0], + "scale":[ 1, 1, 1] + }, + "fixed": { + "rotation": [ 180, 180, 180 ], + "translation": [ 0, 0, -7.5 ], + "scale":[ 1, 1, 1 ] + }, + "thirdperson_righthand": { + "rotation": [ 90, 0, 180 ], + "translation": [ 0, 3.3, 2], + "scale": [ 0.375, 0.375, 0.375 ] + }, + "thirdperson_lefthand": { + "rotation": [ 90, 0, 180 ], + "translation": [ 0, 3.3, 2], + "scale": [ 0.375, 0.375, 0.375 ] + }, + "firstperson_righthand": { + "rotation": [ 295, 180, -15 ], + "translation": [ 2, 5, 0 ], + "scale": [ 0.6, 0.6, 0.6 ] + }, + "firstperson_lefthand": { + "rotation": [ 295, 180, -10 ], + "translation": [ 3, 5, 0 ], + "scale": [ 0.6, 0.6, 0.6 ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/models/item/template_skull_candle.json b/src/main/resources/assets/twilightforest/models/item/template_skull_candle.json new file mode 100644 index 0000000000..75b9e2897e --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/item/template_skull_candle.json @@ -0,0 +1,38 @@ +{ + "parent": "builtin/entity", + "textures": { + "particle": "block/soul_sand" + }, + "display": { + "gui": { + "rotation": [ 30, 45, 0 ], + "translation": [ 0, 1.5, 0 ], + "scale": [ 0.9, 0.9, 0.9 ] + }, + "head": { + "rotation": [ 180, 0, 180 ], + "translation": [ 0, 6, 0 ], + "scale":[ 1.6, 1.6, 1.6 ] + }, + "fixed": { + "rotation": [ 0, 180, 0 ], + "translation": [ 0, 2, 0], + "scale":[ 1, 1, 1 ] + }, + "ground": { + "rotation": [ 0, 0, 0 ], + "translation": [ 0, 3, 0 ], + "scale": [ 0.5, 0.5, 0.5 ] + }, + "thirdperson_righthand": { + "rotation": [ 45, 135, 0 ], + "translation": [ 0, 3, 0 ], + "scale": [ 0.5, 0.5, 0.5 ] + }, + "firstperson_righthand": { + "rotation": [ 0, 180, 0 ], + "translation": [ 0, 0, 0 ], + "scale": [ 1, 1, 1 ] + } + } +} diff --git a/src/main/resources/assets/twilightforest/models/item/template_trophy.json b/src/main/resources/assets/twilightforest/models/item/template_trophy.json new file mode 100644 index 0000000000..a40a77689c --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/item/template_trophy.json @@ -0,0 +1,33 @@ +{ + "parent": "builtin/entity", + "textures": { + "particle": "block/soul_sand" + }, + "display": { + "head": { + "rotation": [ 180, 0, 180 ], + "translation": [ 0, 6, 0 ], + "scale":[ 1.6, 1.6, 1.6 ] + }, + "fixed": { + "rotation": [ 0, 180, 0 ], + "translation": [ 0, 2, 0], + "scale":[ 1, 1, 1 ] + }, + "ground": { + "rotation": [ 0, 0, 0 ], + "translation": [ 0, 3, 0 ], + "scale": [ 0.5, 0.5, 0.5 ] + }, + "thirdperson_righthand": { + "rotation": [ 45, 135, 0 ], + "translation": [ 0, 3, 0 ], + "scale": [ 0.5, 0.5, 0.5 ] + }, + "firstperson_righthand": { + "rotation": [ 0, 180, 0 ], + "translation": [ 0, 2, 0 ], + "scale": [ 1, 1, 1 ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/models/item/ur_ghast_trophy.json b/src/main/resources/assets/twilightforest/models/item/ur_ghast_trophy.json new file mode 100644 index 0000000000..e5234dbbd7 --- /dev/null +++ b/src/main/resources/assets/twilightforest/models/item/ur_ghast_trophy.json @@ -0,0 +1,23 @@ +{ + "parent": "twilightforest:item/template_trophy", + "textures": { + "particle": "block/soul_sand" + }, + "display": { + "head": { + "rotation": [ 180, 0, 180 ], + "translation": [ 0, 18, 0 ], + "scale":[ 1.6, 1.6, 1.6 ] + }, + "thirdperson_righthand": { + "rotation": [ 45, 135, 0 ], + "translation": [ 0, 4, 3.6 ], + "scale": [ 0.5, 0.5, 0.5 ] + }, + "firstperson_righthand": { + "rotation": [ 0, 180, 0 ], + "translation": [ 0, 11, 0 ], + "scale": [ 1, 1, 1 ] + } + } +} diff --git a/src/main/resources/assets/twilightforest/particles/annihilate.json b/src/main/resources/assets/twilightforest/particles/annihilate.json new file mode 100644 index 0000000000..6683b92775 --- /dev/null +++ b/src/main/resources/assets/twilightforest/particles/annihilate.json @@ -0,0 +1,5 @@ +{ + "textures": [ + "twilightforest:annihilate_particle" + ] +} diff --git a/src/main/resources/assets/twilightforest/particles/boss_tear.json b/src/main/resources/assets/twilightforest/particles/boss_tear.json new file mode 100644 index 0000000000..0967ef424b --- /dev/null +++ b/src/main/resources/assets/twilightforest/particles/boss_tear.json @@ -0,0 +1 @@ +{} diff --git a/src/main/resources/assets/twilightforest/particles/extended_snow_warning.json b/src/main/resources/assets/twilightforest/particles/extended_snow_warning.json new file mode 100644 index 0000000000..824bec1225 --- /dev/null +++ b/src/main/resources/assets/twilightforest/particles/extended_snow_warning.json @@ -0,0 +1,8 @@ +{ + "textures": [ + "twilightforest:snow_0", + "twilightforest:snow_1", + "twilightforest:snow_2", + "twilightforest:snow_3" + ] +} diff --git a/src/main/resources/assets/twilightforest/particles/fallen_leaf.json b/src/main/resources/assets/twilightforest/particles/fallen_leaf.json new file mode 100644 index 0000000000..5b4947acb8 --- /dev/null +++ b/src/main/resources/assets/twilightforest/particles/fallen_leaf.json @@ -0,0 +1,5 @@ +{ + "textures": [ + "twilightforest:fallen_leaf" + ] +} diff --git a/src/main/resources/assets/twilightforest/particles/firefly.json b/src/main/resources/assets/twilightforest/particles/firefly.json new file mode 100644 index 0000000000..0a5d05c936 --- /dev/null +++ b/src/main/resources/assets/twilightforest/particles/firefly.json @@ -0,0 +1,5 @@ +{ + "textures": [ + "twilightforest:firefly" + ] +} diff --git a/src/main/resources/assets/twilightforest/particles/firefly_pinned.json b/src/main/resources/assets/twilightforest/particles/firefly_pinned.json new file mode 100644 index 0000000000..0a5d05c936 --- /dev/null +++ b/src/main/resources/assets/twilightforest/particles/firefly_pinned.json @@ -0,0 +1,5 @@ +{ + "textures": [ + "twilightforest:firefly" + ] +} diff --git a/src/main/resources/assets/twilightforest/particles/ghast_trap.json b/src/main/resources/assets/twilightforest/particles/ghast_trap.json new file mode 100644 index 0000000000..e0996e04fa --- /dev/null +++ b/src/main/resources/assets/twilightforest/particles/ghast_trap.json @@ -0,0 +1,12 @@ +{ + "textures": [ + "minecraft:generic_7", + "minecraft:generic_6", + "minecraft:generic_5", + "minecraft:generic_4", + "minecraft:generic_3", + "minecraft:generic_2", + "minecraft:generic_1", + "minecraft:generic_0" + ] +} diff --git a/src/main/resources/assets/twilightforest/particles/huge_smoke.json b/src/main/resources/assets/twilightforest/particles/huge_smoke.json new file mode 100644 index 0000000000..271261099b --- /dev/null +++ b/src/main/resources/assets/twilightforest/particles/huge_smoke.json @@ -0,0 +1,12 @@ +{ + "textures": [ + "minecraft:generic_7", + "minecraft:generic_6", + "minecraft:generic_5", + "minecraft:generic_4", + "minecraft:generic_3", + "minecraft:generic_2", + "minecraft:generic_1", + "minecraft:generic_0" + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/particles/ice_beam.json b/src/main/resources/assets/twilightforest/particles/ice_beam.json new file mode 100644 index 0000000000..824bec1225 --- /dev/null +++ b/src/main/resources/assets/twilightforest/particles/ice_beam.json @@ -0,0 +1,8 @@ +{ + "textures": [ + "twilightforest:snow_0", + "twilightforest:snow_1", + "twilightforest:snow_2", + "twilightforest:snow_3" + ] +} diff --git a/src/main/resources/assets/twilightforest/particles/jar_wandering_firefly.json b/src/main/resources/assets/twilightforest/particles/jar_wandering_firefly.json new file mode 100644 index 0000000000..0a5d05c936 --- /dev/null +++ b/src/main/resources/assets/twilightforest/particles/jar_wandering_firefly.json @@ -0,0 +1,5 @@ +{ + "textures": [ + "twilightforest:firefly" + ] +} diff --git a/src/main/resources/assets/twilightforest/particles/large_flame.json b/src/main/resources/assets/twilightforest/particles/large_flame.json new file mode 100644 index 0000000000..ef790a1f7f --- /dev/null +++ b/src/main/resources/assets/twilightforest/particles/large_flame.json @@ -0,0 +1,5 @@ +{ + "textures": [ + "minecraft:flame" + ] +} diff --git a/src/main/resources/assets/twilightforest/particles/leaf_rune.json b/src/main/resources/assets/twilightforest/particles/leaf_rune.json new file mode 100644 index 0000000000..566b704507 --- /dev/null +++ b/src/main/resources/assets/twilightforest/particles/leaf_rune.json @@ -0,0 +1,30 @@ +{ + "textures": [ + "minecraft:sga_a", + "minecraft:sga_b", + "minecraft:sga_c", + "minecraft:sga_d", + "minecraft:sga_e", + "minecraft:sga_f", + "minecraft:sga_g", + "minecraft:sga_h", + "minecraft:sga_i", + "minecraft:sga_j", + "minecraft:sga_k", + "minecraft:sga_l", + "minecraft:sga_m", + "minecraft:sga_n", + "minecraft:sga_o", + "minecraft:sga_p", + "minecraft:sga_q", + "minecraft:sga_r", + "minecraft:sga_s", + "minecraft:sga_t", + "minecraft:sga_u", + "minecraft:sga_v", + "minecraft:sga_w", + "minecraft:sga_x", + "minecraft:sga_y", + "minecraft:sga_z" + ] +} diff --git a/src/main/resources/assets/twilightforest/particles/ominous_flame.json b/src/main/resources/assets/twilightforest/particles/ominous_flame.json new file mode 100644 index 0000000000..0882954336 --- /dev/null +++ b/src/main/resources/assets/twilightforest/particles/ominous_flame.json @@ -0,0 +1,5 @@ +{ + "textures": [ + "twilightforest:ominous_flame" + ] +} diff --git a/src/main/resources/assets/twilightforest/particles/protection.json b/src/main/resources/assets/twilightforest/particles/protection.json new file mode 100644 index 0000000000..bab4ed6557 --- /dev/null +++ b/src/main/resources/assets/twilightforest/particles/protection.json @@ -0,0 +1,5 @@ +{ + "textures": [ + "minecraft:glint" + ] +} diff --git a/src/main/resources/assets/twilightforest/particles/snow.json b/src/main/resources/assets/twilightforest/particles/snow.json new file mode 100644 index 0000000000..824bec1225 --- /dev/null +++ b/src/main/resources/assets/twilightforest/particles/snow.json @@ -0,0 +1,8 @@ +{ + "textures": [ + "twilightforest:snow_0", + "twilightforest:snow_1", + "twilightforest:snow_2", + "twilightforest:snow_3" + ] +} diff --git a/src/main/resources/assets/twilightforest/particles/snow_guardian.json b/src/main/resources/assets/twilightforest/particles/snow_guardian.json new file mode 100644 index 0000000000..824bec1225 --- /dev/null +++ b/src/main/resources/assets/twilightforest/particles/snow_guardian.json @@ -0,0 +1,8 @@ +{ + "textures": [ + "twilightforest:snow_0", + "twilightforest:snow_1", + "twilightforest:snow_2", + "twilightforest:snow_3" + ] +} diff --git a/src/main/resources/assets/twilightforest/particles/snow_warning.json b/src/main/resources/assets/twilightforest/particles/snow_warning.json new file mode 100644 index 0000000000..824bec1225 --- /dev/null +++ b/src/main/resources/assets/twilightforest/particles/snow_warning.json @@ -0,0 +1,8 @@ +{ + "textures": [ + "twilightforest:snow_0", + "twilightforest:snow_1", + "twilightforest:snow_2", + "twilightforest:snow_3" + ] +} diff --git a/src/main/resources/assets/twilightforest/particles/sorting_particle.json b/src/main/resources/assets/twilightforest/particles/sorting_particle.json new file mode 100644 index 0000000000..bab4ed6557 --- /dev/null +++ b/src/main/resources/assets/twilightforest/particles/sorting_particle.json @@ -0,0 +1,5 @@ +{ + "textures": [ + "minecraft:glint" + ] +} diff --git a/src/main/resources/assets/twilightforest/particles/wandering_firefly.json b/src/main/resources/assets/twilightforest/particles/wandering_firefly.json new file mode 100644 index 0000000000..0a5d05c936 --- /dev/null +++ b/src/main/resources/assets/twilightforest/particles/wandering_firefly.json @@ -0,0 +1,5 @@ +{ + "textures": [ + "twilightforest:firefly" + ] +} diff --git a/src/main/resources/assets/twilightforest/shaders/core/red_thread/red_thread.fsh b/src/main/resources/assets/twilightforest/shaders/core/red_thread/red_thread.fsh new file mode 100644 index 0000000000..0155fe518a --- /dev/null +++ b/src/main/resources/assets/twilightforest/shaders/core/red_thread/red_thread.fsh @@ -0,0 +1,18 @@ +#version 150 + +uniform sampler2D Sampler0; + +uniform vec4 ColorModulator; + +in vec4 vertexColor; +in vec2 texCoord0; + +out vec4 fragColor; + +void main() { + vec4 color = texture(Sampler0, texCoord0); + if (color.a == 0.0) { + discard; + } + fragColor = vec4(ColorModulator.rgb * vertexColor.rgb, ColorModulator.a); +} diff --git a/src/main/resources/assets/twilightforest/shaders/core/red_thread/red_thread.json b/src/main/resources/assets/twilightforest/shaders/core/red_thread/red_thread.json new file mode 100644 index 0000000000..5bbb5edab1 --- /dev/null +++ b/src/main/resources/assets/twilightforest/shaders/core/red_thread/red_thread.json @@ -0,0 +1,30 @@ +{ + "blend": { + "func": "add", + "srcrgb": "srcalpha", + "dstrgb": "1-srcalpha" + }, + "vertex": "rendertype_cutout", + "fragment": "rendertype_cutout", + "attributes": [ + "Position", + "Color", + "UV0", + "UV2", + "Normal" + ], + "samplers": [ + { "name": "Sampler0" }, + { "name": "Sampler2" } + ], + "uniforms": [ + { "name": "ModelViewMat", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] }, + { "name": "ProjMat", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] }, + { "name": "ChunkOffset", "type": "float", "count": 3, "values": [ 0.0, 0.0, 0.0 ] }, + { "name": "ColorModulator", "type": "float", "count": 4, "values": [ 1.0, 1.0, 1.0, 1.0 ] }, + { "name": "FogStart", "type": "float", "count": 1, "values": [ 0.0 ] }, + { "name": "FogEnd", "type": "float", "count": 1, "values": [ 1.0 ] }, + { "name": "FogColor", "type": "float", "count": 4, "values": [ 0.0, 0.0, 0.0, 0.0 ] }, + { "name": "FogShape", "type": "int", "count": 1, "values": [ 0 ] } + ] +} diff --git a/src/main/resources/assets/twilightforest/shaders/core/red_thread/red_thread.vsh b/src/main/resources/assets/twilightforest/shaders/core/red_thread/red_thread.vsh new file mode 100644 index 0000000000..44e105d4c2 --- /dev/null +++ b/src/main/resources/assets/twilightforest/shaders/core/red_thread/red_thread.vsh @@ -0,0 +1,18 @@ +#version 150 + +in vec3 Position; +in vec4 Color; +in vec2 UV0; + +uniform mat4 ModelViewMat; +uniform mat4 ProjMat; + +out vec4 vertexColor; +out vec2 texCoord0; + +void main() { + gl_Position = ProjMat * ModelViewMat * vec4(Position, 1.0); + + vertexColor = Color; + texCoord0 = UV0; +} diff --git a/src/main/resources/assets/twilightforest/sounds.json b/src/main/resources/assets/twilightforest/sounds.json deleted file mode 100644 index 99e3187038..0000000000 --- a/src/main/resources/assets/twilightforest/sounds.json +++ /dev/null @@ -1,229 +0,0 @@ -{ - "mob.kobold.die": { - "category": "hostile", - "sounds": [ - "mob/kobold/die0", - "mob/kobold/die1", - "mob/kobold/die2" - ] - }, - "mob.kobold.kobold": { - "category": "hostile", - "sounds": [ - "mob/kobold/kobold0", - "mob/kobold/kobold1", - "mob/kobold/kobold2", - "mob/kobold/kobold3", - "mob/kobold/kobold4", - "mob/kobold/kobold5" - ] - }, - "mob.kobold.hurt": { - "category": "hostile", - "sounds": [ - "mob/kobold/hurt0", - "mob/kobold/hurt1", - "mob/kobold/hurt2" - ] - }, - "mob.cicada": { - "category": "ambient", - "sounds": [ - "mob/cicada0", - "mob/cicada1" - ] - }, - "mob.naga.hiss": { - "category": "hostile", - "sounds": [ - "mob/naga/hiss0", - "mob/naga/hiss1", - "mob/naga/hiss2" - ] - }, - "mob.naga.hurt": { - "category": "hostile", - "sounds": [ - "mob/naga/hurt0", - "mob/naga/hurt1", - "mob/naga/hurt2" - ] - }, - "mob.naga.rattle": { - "category": "hostile", - "sounds": [ - "mob/naga/rattle0", - "mob/naga/rattle1" - ] - }, - "mob.raven.caw": { - "category": "neutral", - "sounds": [ - "mob/raven/caw0", - "mob/raven/caw1" - ] - }, - "mob.raven.squawk": { - "category": "neutral", - "sounds": [ - "mob/raven/squawk0", - "mob/raven/squawk1" - ] - }, - "mob.redcap.die": { - "category": "hostile", - "sounds": [ - "mob/redcap/die0", - "mob/redcap/die1", - "mob/redcap/die2" - ] - }, - "mob.redcap.redcap": { - "category": "hostile", - "sounds": [ - "mob/redcap/redcap0", - "mob/redcap/redcap1", - "mob/redcap/redcap2", - "mob/redcap/redcap3", - "mob/redcap/redcap4", - "mob/redcap/redcap5" - ] - }, - "mob.redcap.hurt": { - "category": "hostile", - "sounds": [ - "mob/redcap/hurt0", - "mob/redcap/hurt1", - "mob/redcap/hurt2", - "mob/redcap/hurt3" - ] - }, - "mob.tinybird.chirp": { - "category": "neutral", - "sounds": [ - "mob/tinybird/chirp0", - "mob/tinybird/chirp1", - "mob/tinybird/chirp2" - ] - }, - "mob.tinybird.hurt": { - "category": "neutral", - "sounds": [ - "mob/tinybird/hurt0", - "mob/tinybird/hurt1" - ] - }, - "mob.tinybird.song": { - "category": "neutral", - "sounds": [ - "mob/tinybird/song0", - "mob/tinybird/song1" - ] - }, - "mob.urghast.trapactive": { - "category": "block", - "sounds": [ - "mob/urghast/trapactive" - ] - }, - "mob.urghast.trapon": { - "category": "block", - "sounds": [ - "mob/urghast/trapon0", - "mob/urghast/trapon1", - "mob/urghast/trapon2", - "mob/urghast/trapon3", - "mob/urghast/trapon4" - ] - }, - "mob.urghast.trapspindown": { - "category": "block", - "sounds": [ - "mob/urghast/trapspindown" - ] - }, - "mob.urghast.trapwarmup": { - "category": "block", - "sounds": [ - "mob/urghast/trapwarmup" - ] - }, - "mob.wraith.wraith": { - "category": "block", - "sounds": [ - "mob/wraith/wraith0", - "mob/wraith/wraith1", - "mob/wraith/wraith2", - "mob/wraith/wraith3" - ] - }, - "mob.hydra.hurt": { - "category": "hostile", - "sounds": [ - "mob/hydra/hurt0", - "mob/hydra/hurt1", - "mob/hydra/hurt2", - "mob/hydra/hurt3" - ] - }, - "mob.hydra.death": { - "category": "hostile", - "sounds": [ - "mob/hydra/death0" - ] - }, - "mob.hydra.growl": { - "category": "hostile", - "sounds": [ - "mob/hydra/growl0", - "mob/hydra/growl1", - "mob/hydra/growl2" - ] - }, - "mob.hydra.roar": { - "category": "hostile", - "sounds": [ - "mob/hydra/roar0", - "mob/hydra/roar1" - ] - }, - "mob.hydra.warn": { - "category": "hostile", - "sounds": [ - "mob/hydra/warn0" - ] - }, - "mob.mosquito.mosquito": { - "category": "hostile", - "sounds": [ - "mob/mosquito/animals132" - ] - }, - "mob.ice.noise": { - "category": "hostile", - "sounds": [ - "mob/ice/noise0", - "mob/ice/noise1" - ] - }, - "mob.ice.hurt": { - "category": "hostile", - "sounds": [ - "mob/ice/hurt0", - "mob/ice/hurt1" - ] - }, - "mob.ice.death": { - "category": "hostile", - "sounds": [ - "mob/ice/death0", - "mob/ice/death1" - ] - }, - "random.slider": { - "category": "block", - "sounds": [ - "random/creakgo2" - ] - } -} diff --git a/src/main/resources/assets/twilightforest/sounds/mob/alpha_yeti/alert.ogg b/src/main/resources/assets/twilightforest/sounds/mob/alpha_yeti/alert.ogg new file mode 100644 index 0000000000..73b0410cf2 Binary files /dev/null and b/src/main/resources/assets/twilightforest/sounds/mob/alpha_yeti/alert.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/alpha_yeti/death.ogg b/src/main/resources/assets/twilightforest/sounds/mob/alpha_yeti/death.ogg new file mode 100644 index 0000000000..31909af08c Binary files /dev/null and b/src/main/resources/assets/twilightforest/sounds/mob/alpha_yeti/death.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/alpha_yeti/grab.ogg b/src/main/resources/assets/twilightforest/sounds/mob/alpha_yeti/grab.ogg new file mode 100644 index 0000000000..9985479e40 Binary files /dev/null and b/src/main/resources/assets/twilightforest/sounds/mob/alpha_yeti/grab.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/alpha_yeti/growl1.ogg b/src/main/resources/assets/twilightforest/sounds/mob/alpha_yeti/growl1.ogg new file mode 100644 index 0000000000..20c5d4e6d8 Binary files /dev/null and b/src/main/resources/assets/twilightforest/sounds/mob/alpha_yeti/growl1.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/alpha_yeti/growl2.ogg b/src/main/resources/assets/twilightforest/sounds/mob/alpha_yeti/growl2.ogg new file mode 100644 index 0000000000..c1520c1aa9 Binary files /dev/null and b/src/main/resources/assets/twilightforest/sounds/mob/alpha_yeti/growl2.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/alpha_yeti/growl3.ogg b/src/main/resources/assets/twilightforest/sounds/mob/alpha_yeti/growl3.ogg new file mode 100644 index 0000000000..d8e7c2a8c0 Binary files /dev/null and b/src/main/resources/assets/twilightforest/sounds/mob/alpha_yeti/growl3.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/alpha_yeti/hurt1.ogg b/src/main/resources/assets/twilightforest/sounds/mob/alpha_yeti/hurt1.ogg new file mode 100644 index 0000000000..4e80d4d7ff Binary files /dev/null and b/src/main/resources/assets/twilightforest/sounds/mob/alpha_yeti/hurt1.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/alpha_yeti/hurt2.ogg b/src/main/resources/assets/twilightforest/sounds/mob/alpha_yeti/hurt2.ogg new file mode 100644 index 0000000000..98722421aa Binary files /dev/null and b/src/main/resources/assets/twilightforest/sounds/mob/alpha_yeti/hurt2.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/alpha_yeti/hurt3.ogg b/src/main/resources/assets/twilightforest/sounds/mob/alpha_yeti/hurt3.ogg new file mode 100644 index 0000000000..172daaa76e Binary files /dev/null and b/src/main/resources/assets/twilightforest/sounds/mob/alpha_yeti/hurt3.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/alpha_yeti/pant1.ogg b/src/main/resources/assets/twilightforest/sounds/mob/alpha_yeti/pant1.ogg new file mode 100644 index 0000000000..b237634c52 Binary files /dev/null and b/src/main/resources/assets/twilightforest/sounds/mob/alpha_yeti/pant1.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/alpha_yeti/pant2.ogg b/src/main/resources/assets/twilightforest/sounds/mob/alpha_yeti/pant2.ogg new file mode 100644 index 0000000000..35a33ef314 Binary files /dev/null and b/src/main/resources/assets/twilightforest/sounds/mob/alpha_yeti/pant2.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/alpha_yeti/pant3.ogg b/src/main/resources/assets/twilightforest/sounds/mob/alpha_yeti/pant3.ogg new file mode 100644 index 0000000000..a3724a0a4f Binary files /dev/null and b/src/main/resources/assets/twilightforest/sounds/mob/alpha_yeti/pant3.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/alpha_yeti/roar.ogg b/src/main/resources/assets/twilightforest/sounds/mob/alpha_yeti/roar.ogg new file mode 100644 index 0000000000..8dc94ffeaf Binary files /dev/null and b/src/main/resources/assets/twilightforest/sounds/mob/alpha_yeti/roar.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/alpha_yeti/throw.ogg b/src/main/resources/assets/twilightforest/sounds/mob/alpha_yeti/throw.ogg new file mode 100644 index 0000000000..50f6e96409 Binary files /dev/null and b/src/main/resources/assets/twilightforest/sounds/mob/alpha_yeti/throw.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/cicada0.ogg b/src/main/resources/assets/twilightforest/sounds/mob/cicada0.ogg deleted file mode 100644 index 21f64bf9e1..0000000000 Binary files a/src/main/resources/assets/twilightforest/sounds/mob/cicada0.ogg and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/cicada1.ogg b/src/main/resources/assets/twilightforest/sounds/mob/cicada1.ogg index fc61added7..e12af89e39 100644 Binary files a/src/main/resources/assets/twilightforest/sounds/mob/cicada1.ogg and b/src/main/resources/assets/twilightforest/sounds/mob/cicada1.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/cicada2.ogg b/src/main/resources/assets/twilightforest/sounds/mob/cicada2.ogg new file mode 100644 index 0000000000..c9ba594160 Binary files /dev/null and b/src/main/resources/assets/twilightforest/sounds/mob/cicada2.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/deer/death.ogg b/src/main/resources/assets/twilightforest/sounds/mob/deer/death.ogg new file mode 100644 index 0000000000..764145a09e Binary files /dev/null and b/src/main/resources/assets/twilightforest/sounds/mob/deer/death.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/deer/hurt1.ogg b/src/main/resources/assets/twilightforest/sounds/mob/deer/hurt1.ogg new file mode 100644 index 0000000000..b55730b40a Binary files /dev/null and b/src/main/resources/assets/twilightforest/sounds/mob/deer/hurt1.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/deer/hurt2.ogg b/src/main/resources/assets/twilightforest/sounds/mob/deer/hurt2.ogg new file mode 100644 index 0000000000..b9c2f2f0ff Binary files /dev/null and b/src/main/resources/assets/twilightforest/sounds/mob/deer/hurt2.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/deer/idle1.ogg b/src/main/resources/assets/twilightforest/sounds/mob/deer/idle1.ogg new file mode 100644 index 0000000000..b9d7a2eaac Binary files /dev/null and b/src/main/resources/assets/twilightforest/sounds/mob/deer/idle1.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/deer/idle2.ogg b/src/main/resources/assets/twilightforest/sounds/mob/deer/idle2.ogg new file mode 100644 index 0000000000..a0dc4fde97 Binary files /dev/null and b/src/main/resources/assets/twilightforest/sounds/mob/deer/idle2.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/deer/idle3.ogg b/src/main/resources/assets/twilightforest/sounds/mob/deer/idle3.ogg new file mode 100644 index 0000000000..63a74316d1 Binary files /dev/null and b/src/main/resources/assets/twilightforest/sounds/mob/deer/idle3.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/hydra/death0.ogg b/src/main/resources/assets/twilightforest/sounds/mob/hydra/death.ogg similarity index 100% rename from src/main/resources/assets/twilightforest/sounds/mob/hydra/death0.ogg rename to src/main/resources/assets/twilightforest/sounds/mob/hydra/death.ogg diff --git a/src/main/resources/assets/twilightforest/sounds/mob/hydra/growl0.ogg b/src/main/resources/assets/twilightforest/sounds/mob/hydra/growl0.ogg deleted file mode 100644 index 254cf69f98..0000000000 Binary files a/src/main/resources/assets/twilightforest/sounds/mob/hydra/growl0.ogg and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/hydra/growl1.ogg b/src/main/resources/assets/twilightforest/sounds/mob/hydra/growl1.ogg index 9d51732a4c..254cf69f98 100644 Binary files a/src/main/resources/assets/twilightforest/sounds/mob/hydra/growl1.ogg and b/src/main/resources/assets/twilightforest/sounds/mob/hydra/growl1.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/hydra/growl2.ogg b/src/main/resources/assets/twilightforest/sounds/mob/hydra/growl2.ogg index efec043e7c..9d51732a4c 100644 Binary files a/src/main/resources/assets/twilightforest/sounds/mob/hydra/growl2.ogg and b/src/main/resources/assets/twilightforest/sounds/mob/hydra/growl2.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/hydra/growl3.ogg b/src/main/resources/assets/twilightforest/sounds/mob/hydra/growl3.ogg new file mode 100644 index 0000000000..efec043e7c Binary files /dev/null and b/src/main/resources/assets/twilightforest/sounds/mob/hydra/growl3.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/hydra/hurt0.ogg b/src/main/resources/assets/twilightforest/sounds/mob/hydra/hurt0.ogg deleted file mode 100644 index baa598b1c6..0000000000 Binary files a/src/main/resources/assets/twilightforest/sounds/mob/hydra/hurt0.ogg and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/hydra/hurt1.ogg b/src/main/resources/assets/twilightforest/sounds/mob/hydra/hurt1.ogg index b535e0489e..baa598b1c6 100644 Binary files a/src/main/resources/assets/twilightforest/sounds/mob/hydra/hurt1.ogg and b/src/main/resources/assets/twilightforest/sounds/mob/hydra/hurt1.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/hydra/hurt2.ogg b/src/main/resources/assets/twilightforest/sounds/mob/hydra/hurt2.ogg index 0efa967676..b535e0489e 100644 Binary files a/src/main/resources/assets/twilightforest/sounds/mob/hydra/hurt2.ogg and b/src/main/resources/assets/twilightforest/sounds/mob/hydra/hurt2.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/hydra/hurt3.ogg b/src/main/resources/assets/twilightforest/sounds/mob/hydra/hurt3.ogg index 63750f3354..0efa967676 100644 Binary files a/src/main/resources/assets/twilightforest/sounds/mob/hydra/hurt3.ogg and b/src/main/resources/assets/twilightforest/sounds/mob/hydra/hurt3.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/hydra/hurt4.ogg b/src/main/resources/assets/twilightforest/sounds/mob/hydra/hurt4.ogg new file mode 100644 index 0000000000..63750f3354 Binary files /dev/null and b/src/main/resources/assets/twilightforest/sounds/mob/hydra/hurt4.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/hydra/roar0.ogg b/src/main/resources/assets/twilightforest/sounds/mob/hydra/roar0.ogg deleted file mode 100644 index a436eb9de2..0000000000 Binary files a/src/main/resources/assets/twilightforest/sounds/mob/hydra/roar0.ogg and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/hydra/roar1.ogg b/src/main/resources/assets/twilightforest/sounds/mob/hydra/roar1.ogg index 99f10c431b..a436eb9de2 100644 Binary files a/src/main/resources/assets/twilightforest/sounds/mob/hydra/roar1.ogg and b/src/main/resources/assets/twilightforest/sounds/mob/hydra/roar1.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/hydra/roar2.ogg b/src/main/resources/assets/twilightforest/sounds/mob/hydra/roar2.ogg new file mode 100644 index 0000000000..99f10c431b Binary files /dev/null and b/src/main/resources/assets/twilightforest/sounds/mob/hydra/roar2.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/hydra/warn0.ogg b/src/main/resources/assets/twilightforest/sounds/mob/hydra/warn.ogg similarity index 100% rename from src/main/resources/assets/twilightforest/sounds/mob/hydra/warn0.ogg rename to src/main/resources/assets/twilightforest/sounds/mob/hydra/warn.ogg diff --git a/src/main/resources/assets/twilightforest/sounds/mob/ice/noise0.ogg b/src/main/resources/assets/twilightforest/sounds/mob/ice/crackle1.ogg similarity index 100% rename from src/main/resources/assets/twilightforest/sounds/mob/ice/noise0.ogg rename to src/main/resources/assets/twilightforest/sounds/mob/ice/crackle1.ogg diff --git a/src/main/resources/assets/twilightforest/sounds/mob/ice/noise1.ogg b/src/main/resources/assets/twilightforest/sounds/mob/ice/crackle2.ogg similarity index 100% rename from src/main/resources/assets/twilightforest/sounds/mob/ice/noise1.ogg rename to src/main/resources/assets/twilightforest/sounds/mob/ice/crackle2.ogg diff --git a/src/main/resources/assets/twilightforest/sounds/mob/ice/death0.ogg b/src/main/resources/assets/twilightforest/sounds/mob/ice/death0.ogg deleted file mode 100644 index 6c0bd14dc8..0000000000 Binary files a/src/main/resources/assets/twilightforest/sounds/mob/ice/death0.ogg and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/ice/death1.ogg b/src/main/resources/assets/twilightforest/sounds/mob/ice/death1.ogg index a23c77f5d4..6c0bd14dc8 100644 Binary files a/src/main/resources/assets/twilightforest/sounds/mob/ice/death1.ogg and b/src/main/resources/assets/twilightforest/sounds/mob/ice/death1.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/ice/death2.ogg b/src/main/resources/assets/twilightforest/sounds/mob/ice/death2.ogg new file mode 100644 index 0000000000..a23c77f5d4 Binary files /dev/null and b/src/main/resources/assets/twilightforest/sounds/mob/ice/death2.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/ice/hurt0.ogg b/src/main/resources/assets/twilightforest/sounds/mob/ice/hurt0.ogg deleted file mode 100644 index 97ca9394fe..0000000000 Binary files a/src/main/resources/assets/twilightforest/sounds/mob/ice/hurt0.ogg and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/ice/hurt1.ogg b/src/main/resources/assets/twilightforest/sounds/mob/ice/hurt1.ogg index c59ca2b156..97ca9394fe 100644 Binary files a/src/main/resources/assets/twilightforest/sounds/mob/ice/hurt1.ogg and b/src/main/resources/assets/twilightforest/sounds/mob/ice/hurt1.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/ice/hurt2.ogg b/src/main/resources/assets/twilightforest/sounds/mob/ice/hurt2.ogg new file mode 100644 index 0000000000..c59ca2b156 Binary files /dev/null and b/src/main/resources/assets/twilightforest/sounds/mob/ice/hurt2.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/kobold/kobold0.ogg b/src/main/resources/assets/twilightforest/sounds/mob/kobold/ambient1.ogg similarity index 100% rename from src/main/resources/assets/twilightforest/sounds/mob/kobold/kobold0.ogg rename to src/main/resources/assets/twilightforest/sounds/mob/kobold/ambient1.ogg diff --git a/src/main/resources/assets/twilightforest/sounds/mob/kobold/kobold1.ogg b/src/main/resources/assets/twilightforest/sounds/mob/kobold/ambient2.ogg similarity index 100% rename from src/main/resources/assets/twilightforest/sounds/mob/kobold/kobold1.ogg rename to src/main/resources/assets/twilightforest/sounds/mob/kobold/ambient2.ogg diff --git a/src/main/resources/assets/twilightforest/sounds/mob/kobold/kobold2.ogg b/src/main/resources/assets/twilightforest/sounds/mob/kobold/ambient3.ogg similarity index 100% rename from src/main/resources/assets/twilightforest/sounds/mob/kobold/kobold2.ogg rename to src/main/resources/assets/twilightforest/sounds/mob/kobold/ambient3.ogg diff --git a/src/main/resources/assets/twilightforest/sounds/mob/kobold/kobold3.ogg b/src/main/resources/assets/twilightforest/sounds/mob/kobold/ambient4.ogg similarity index 100% rename from src/main/resources/assets/twilightforest/sounds/mob/kobold/kobold3.ogg rename to src/main/resources/assets/twilightforest/sounds/mob/kobold/ambient4.ogg diff --git a/src/main/resources/assets/twilightforest/sounds/mob/kobold/kobold4.ogg b/src/main/resources/assets/twilightforest/sounds/mob/kobold/ambient5.ogg similarity index 100% rename from src/main/resources/assets/twilightforest/sounds/mob/kobold/kobold4.ogg rename to src/main/resources/assets/twilightforest/sounds/mob/kobold/ambient5.ogg diff --git a/src/main/resources/assets/twilightforest/sounds/mob/kobold/kobold5.ogg b/src/main/resources/assets/twilightforest/sounds/mob/kobold/ambient6.ogg similarity index 100% rename from src/main/resources/assets/twilightforest/sounds/mob/kobold/kobold5.ogg rename to src/main/resources/assets/twilightforest/sounds/mob/kobold/ambient6.ogg diff --git a/src/main/resources/assets/twilightforest/sounds/mob/kobold/die0.ogg b/src/main/resources/assets/twilightforest/sounds/mob/kobold/death1.ogg similarity index 100% rename from src/main/resources/assets/twilightforest/sounds/mob/kobold/die0.ogg rename to src/main/resources/assets/twilightforest/sounds/mob/kobold/death1.ogg diff --git a/src/main/resources/assets/twilightforest/sounds/mob/kobold/die1.ogg b/src/main/resources/assets/twilightforest/sounds/mob/kobold/death2.ogg similarity index 100% rename from src/main/resources/assets/twilightforest/sounds/mob/kobold/die1.ogg rename to src/main/resources/assets/twilightforest/sounds/mob/kobold/death2.ogg diff --git a/src/main/resources/assets/twilightforest/sounds/mob/kobold/die2.ogg b/src/main/resources/assets/twilightforest/sounds/mob/kobold/death3.ogg similarity index 100% rename from src/main/resources/assets/twilightforest/sounds/mob/kobold/die2.ogg rename to src/main/resources/assets/twilightforest/sounds/mob/kobold/death3.ogg diff --git a/src/main/resources/assets/twilightforest/sounds/mob/kobold/hurt0.ogg b/src/main/resources/assets/twilightforest/sounds/mob/kobold/hurt0.ogg deleted file mode 100644 index 7270cd49e6..0000000000 Binary files a/src/main/resources/assets/twilightforest/sounds/mob/kobold/hurt0.ogg and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/kobold/hurt1.ogg b/src/main/resources/assets/twilightforest/sounds/mob/kobold/hurt1.ogg index f102586989..7270cd49e6 100644 Binary files a/src/main/resources/assets/twilightforest/sounds/mob/kobold/hurt1.ogg and b/src/main/resources/assets/twilightforest/sounds/mob/kobold/hurt1.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/kobold/hurt2.ogg b/src/main/resources/assets/twilightforest/sounds/mob/kobold/hurt2.ogg index c67b69f7df..f102586989 100644 Binary files a/src/main/resources/assets/twilightforest/sounds/mob/kobold/hurt2.ogg and b/src/main/resources/assets/twilightforest/sounds/mob/kobold/hurt2.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/kobold/hurt3.ogg b/src/main/resources/assets/twilightforest/sounds/mob/kobold/hurt3.ogg new file mode 100644 index 0000000000..c67b69f7df Binary files /dev/null and b/src/main/resources/assets/twilightforest/sounds/mob/kobold/hurt3.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/kobold/shorfle0.ogg b/src/main/resources/assets/twilightforest/sounds/mob/kobold/shorfle.ogg similarity index 100% rename from src/main/resources/assets/twilightforest/sounds/mob/kobold/shorfle0.ogg rename to src/main/resources/assets/twilightforest/sounds/mob/kobold/shorfle.ogg diff --git a/src/main/resources/assets/twilightforest/sounds/mob/mist_wolf/hurt1.ogg b/src/main/resources/assets/twilightforest/sounds/mob/mist_wolf/hurt1.ogg new file mode 100644 index 0000000000..8757667678 Binary files /dev/null and b/src/main/resources/assets/twilightforest/sounds/mob/mist_wolf/hurt1.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/mist_wolf/hurt2.ogg b/src/main/resources/assets/twilightforest/sounds/mob/mist_wolf/hurt2.ogg new file mode 100644 index 0000000000..c2e83add5e Binary files /dev/null and b/src/main/resources/assets/twilightforest/sounds/mob/mist_wolf/hurt2.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/mist_wolf/idle1.ogg b/src/main/resources/assets/twilightforest/sounds/mob/mist_wolf/idle1.ogg new file mode 100644 index 0000000000..28fbf72571 Binary files /dev/null and b/src/main/resources/assets/twilightforest/sounds/mob/mist_wolf/idle1.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/mist_wolf/idle2.ogg b/src/main/resources/assets/twilightforest/sounds/mob/mist_wolf/idle2.ogg new file mode 100644 index 0000000000..ea0c4af4a4 Binary files /dev/null and b/src/main/resources/assets/twilightforest/sounds/mob/mist_wolf/idle2.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/mist_wolf/idle3.ogg b/src/main/resources/assets/twilightforest/sounds/mob/mist_wolf/idle3.ogg new file mode 100644 index 0000000000..24880681d2 Binary files /dev/null and b/src/main/resources/assets/twilightforest/sounds/mob/mist_wolf/idle3.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/mist_wolf/target.ogg b/src/main/resources/assets/twilightforest/sounds/mob/mist_wolf/target.ogg new file mode 100644 index 0000000000..55bf377214 Binary files /dev/null and b/src/main/resources/assets/twilightforest/sounds/mob/mist_wolf/target.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/naga/hiss0.ogg b/src/main/resources/assets/twilightforest/sounds/mob/naga/hiss0.ogg deleted file mode 100644 index 05a465a5e1..0000000000 Binary files a/src/main/resources/assets/twilightforest/sounds/mob/naga/hiss0.ogg and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/naga/hiss1.ogg b/src/main/resources/assets/twilightforest/sounds/mob/naga/hiss1.ogg index 24a51d2bc9..05a465a5e1 100644 Binary files a/src/main/resources/assets/twilightforest/sounds/mob/naga/hiss1.ogg and b/src/main/resources/assets/twilightforest/sounds/mob/naga/hiss1.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/naga/hiss2.ogg b/src/main/resources/assets/twilightforest/sounds/mob/naga/hiss2.ogg index 85f734cc35..24a51d2bc9 100644 Binary files a/src/main/resources/assets/twilightforest/sounds/mob/naga/hiss2.ogg and b/src/main/resources/assets/twilightforest/sounds/mob/naga/hiss2.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/naga/hiss3.ogg b/src/main/resources/assets/twilightforest/sounds/mob/naga/hiss3.ogg new file mode 100644 index 0000000000..85f734cc35 Binary files /dev/null and b/src/main/resources/assets/twilightforest/sounds/mob/naga/hiss3.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/naga/hurt0.ogg b/src/main/resources/assets/twilightforest/sounds/mob/naga/hurt0.ogg deleted file mode 100644 index faded09bef..0000000000 Binary files a/src/main/resources/assets/twilightforest/sounds/mob/naga/hurt0.ogg and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/naga/hurt1.ogg b/src/main/resources/assets/twilightforest/sounds/mob/naga/hurt1.ogg index afd0951b59..faded09bef 100644 Binary files a/src/main/resources/assets/twilightforest/sounds/mob/naga/hurt1.ogg and b/src/main/resources/assets/twilightforest/sounds/mob/naga/hurt1.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/naga/hurt2.ogg b/src/main/resources/assets/twilightforest/sounds/mob/naga/hurt2.ogg index b6880a6af6..afd0951b59 100644 Binary files a/src/main/resources/assets/twilightforest/sounds/mob/naga/hurt2.ogg and b/src/main/resources/assets/twilightforest/sounds/mob/naga/hurt2.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/naga/hurt3.ogg b/src/main/resources/assets/twilightforest/sounds/mob/naga/hurt3.ogg new file mode 100644 index 0000000000..b6880a6af6 Binary files /dev/null and b/src/main/resources/assets/twilightforest/sounds/mob/naga/hurt3.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/naga/rattle0.ogg b/src/main/resources/assets/twilightforest/sounds/mob/naga/rattle0.ogg deleted file mode 100644 index cffb2906b8..0000000000 Binary files a/src/main/resources/assets/twilightforest/sounds/mob/naga/rattle0.ogg and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/naga/rattle1.ogg b/src/main/resources/assets/twilightforest/sounds/mob/naga/rattle1.ogg index c54f4796e1..cffb2906b8 100644 Binary files a/src/main/resources/assets/twilightforest/sounds/mob/naga/rattle1.ogg and b/src/main/resources/assets/twilightforest/sounds/mob/naga/rattle1.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/naga/rattle2.ogg b/src/main/resources/assets/twilightforest/sounds/mob/naga/rattle2.ogg new file mode 100644 index 0000000000..c54f4796e1 Binary files /dev/null and b/src/main/resources/assets/twilightforest/sounds/mob/naga/rattle2.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/raven/caw0.ogg b/src/main/resources/assets/twilightforest/sounds/mob/raven/caw0.ogg deleted file mode 100644 index 9b0c957c82..0000000000 Binary files a/src/main/resources/assets/twilightforest/sounds/mob/raven/caw0.ogg and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/raven/caw1.ogg b/src/main/resources/assets/twilightforest/sounds/mob/raven/caw1.ogg index df845272a9..9b0c957c82 100644 Binary files a/src/main/resources/assets/twilightforest/sounds/mob/raven/caw1.ogg and b/src/main/resources/assets/twilightforest/sounds/mob/raven/caw1.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/raven/caw2.ogg b/src/main/resources/assets/twilightforest/sounds/mob/raven/caw2.ogg new file mode 100644 index 0000000000..df845272a9 Binary files /dev/null and b/src/main/resources/assets/twilightforest/sounds/mob/raven/caw2.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/raven/squawk0.ogg b/src/main/resources/assets/twilightforest/sounds/mob/raven/squawk0.ogg deleted file mode 100644 index 185a3889f3..0000000000 Binary files a/src/main/resources/assets/twilightforest/sounds/mob/raven/squawk0.ogg and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/raven/squawk1.ogg b/src/main/resources/assets/twilightforest/sounds/mob/raven/squawk1.ogg index f193b7048b..185a3889f3 100644 Binary files a/src/main/resources/assets/twilightforest/sounds/mob/raven/squawk1.ogg and b/src/main/resources/assets/twilightforest/sounds/mob/raven/squawk1.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/raven/squawk2.ogg b/src/main/resources/assets/twilightforest/sounds/mob/raven/squawk2.ogg new file mode 100644 index 0000000000..f193b7048b Binary files /dev/null and b/src/main/resources/assets/twilightforest/sounds/mob/raven/squawk2.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/redcap/die0.ogg b/src/main/resources/assets/twilightforest/sounds/mob/redcap/die0.ogg deleted file mode 100644 index 2fbf40da46..0000000000 Binary files a/src/main/resources/assets/twilightforest/sounds/mob/redcap/die0.ogg and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/redcap/die1.ogg b/src/main/resources/assets/twilightforest/sounds/mob/redcap/die1.ogg index e52a7df0b6..2fbf40da46 100644 Binary files a/src/main/resources/assets/twilightforest/sounds/mob/redcap/die1.ogg and b/src/main/resources/assets/twilightforest/sounds/mob/redcap/die1.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/redcap/die2.ogg b/src/main/resources/assets/twilightforest/sounds/mob/redcap/die2.ogg index dfe55c17a4..e52a7df0b6 100644 Binary files a/src/main/resources/assets/twilightforest/sounds/mob/redcap/die2.ogg and b/src/main/resources/assets/twilightforest/sounds/mob/redcap/die2.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/redcap/die3.ogg b/src/main/resources/assets/twilightforest/sounds/mob/redcap/die3.ogg new file mode 100644 index 0000000000..dfe55c17a4 Binary files /dev/null and b/src/main/resources/assets/twilightforest/sounds/mob/redcap/die3.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/redcap/hurt0.ogg b/src/main/resources/assets/twilightforest/sounds/mob/redcap/hurt0.ogg deleted file mode 100644 index 84a5cc6e89..0000000000 Binary files a/src/main/resources/assets/twilightforest/sounds/mob/redcap/hurt0.ogg and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/redcap/hurt1.ogg b/src/main/resources/assets/twilightforest/sounds/mob/redcap/hurt1.ogg index ce515645ab..84a5cc6e89 100644 Binary files a/src/main/resources/assets/twilightforest/sounds/mob/redcap/hurt1.ogg and b/src/main/resources/assets/twilightforest/sounds/mob/redcap/hurt1.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/redcap/hurt2.ogg b/src/main/resources/assets/twilightforest/sounds/mob/redcap/hurt2.ogg index b5ebb49234..ce515645ab 100644 Binary files a/src/main/resources/assets/twilightforest/sounds/mob/redcap/hurt2.ogg and b/src/main/resources/assets/twilightforest/sounds/mob/redcap/hurt2.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/redcap/hurt3.ogg b/src/main/resources/assets/twilightforest/sounds/mob/redcap/hurt3.ogg index 2443b721ef..b5ebb49234 100644 Binary files a/src/main/resources/assets/twilightforest/sounds/mob/redcap/hurt3.ogg and b/src/main/resources/assets/twilightforest/sounds/mob/redcap/hurt3.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/redcap/hurt4.ogg b/src/main/resources/assets/twilightforest/sounds/mob/redcap/hurt4.ogg new file mode 100644 index 0000000000..2443b721ef Binary files /dev/null and b/src/main/resources/assets/twilightforest/sounds/mob/redcap/hurt4.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/redcap/muffled/die1.ogg b/src/main/resources/assets/twilightforest/sounds/mob/redcap/muffled/die1.ogg new file mode 100644 index 0000000000..78efdfec89 Binary files /dev/null and b/src/main/resources/assets/twilightforest/sounds/mob/redcap/muffled/die1.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/redcap/muffled/die2.ogg b/src/main/resources/assets/twilightforest/sounds/mob/redcap/muffled/die2.ogg new file mode 100644 index 0000000000..41c5b1d8da Binary files /dev/null and b/src/main/resources/assets/twilightforest/sounds/mob/redcap/muffled/die2.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/redcap/muffled/die3.ogg b/src/main/resources/assets/twilightforest/sounds/mob/redcap/muffled/die3.ogg new file mode 100644 index 0000000000..b72325ff9a Binary files /dev/null and b/src/main/resources/assets/twilightforest/sounds/mob/redcap/muffled/die3.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/redcap/muffled/hurt1.ogg b/src/main/resources/assets/twilightforest/sounds/mob/redcap/muffled/hurt1.ogg new file mode 100644 index 0000000000..619d294ca9 Binary files /dev/null and b/src/main/resources/assets/twilightforest/sounds/mob/redcap/muffled/hurt1.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/redcap/muffled/hurt2.ogg b/src/main/resources/assets/twilightforest/sounds/mob/redcap/muffled/hurt2.ogg new file mode 100644 index 0000000000..7125efc677 Binary files /dev/null and b/src/main/resources/assets/twilightforest/sounds/mob/redcap/muffled/hurt2.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/redcap/muffled/hurt3.ogg b/src/main/resources/assets/twilightforest/sounds/mob/redcap/muffled/hurt3.ogg new file mode 100644 index 0000000000..8d600448a2 Binary files /dev/null and b/src/main/resources/assets/twilightforest/sounds/mob/redcap/muffled/hurt3.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/redcap/muffled/hurt4.ogg b/src/main/resources/assets/twilightforest/sounds/mob/redcap/muffled/hurt4.ogg new file mode 100644 index 0000000000..effb9bc65e Binary files /dev/null and b/src/main/resources/assets/twilightforest/sounds/mob/redcap/muffled/hurt4.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/redcap/muffled/redcap1.ogg b/src/main/resources/assets/twilightforest/sounds/mob/redcap/muffled/redcap1.ogg new file mode 100644 index 0000000000..3112a74770 Binary files /dev/null and b/src/main/resources/assets/twilightforest/sounds/mob/redcap/muffled/redcap1.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/redcap/muffled/redcap2.ogg b/src/main/resources/assets/twilightforest/sounds/mob/redcap/muffled/redcap2.ogg new file mode 100644 index 0000000000..cd6b7948d3 Binary files /dev/null and b/src/main/resources/assets/twilightforest/sounds/mob/redcap/muffled/redcap2.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/redcap/muffled/redcap3.ogg b/src/main/resources/assets/twilightforest/sounds/mob/redcap/muffled/redcap3.ogg new file mode 100644 index 0000000000..f0a78b343c Binary files /dev/null and b/src/main/resources/assets/twilightforest/sounds/mob/redcap/muffled/redcap3.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/redcap/muffled/redcap4.ogg b/src/main/resources/assets/twilightforest/sounds/mob/redcap/muffled/redcap4.ogg new file mode 100644 index 0000000000..fbf4eb7a5f Binary files /dev/null and b/src/main/resources/assets/twilightforest/sounds/mob/redcap/muffled/redcap4.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/redcap/muffled/redcap5.ogg b/src/main/resources/assets/twilightforest/sounds/mob/redcap/muffled/redcap5.ogg new file mode 100644 index 0000000000..6217d44c4e Binary files /dev/null and b/src/main/resources/assets/twilightforest/sounds/mob/redcap/muffled/redcap5.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/redcap/muffled/redcap6.ogg b/src/main/resources/assets/twilightforest/sounds/mob/redcap/muffled/redcap6.ogg new file mode 100644 index 0000000000..08308dc353 Binary files /dev/null and b/src/main/resources/assets/twilightforest/sounds/mob/redcap/muffled/redcap6.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/redcap/redcap0.ogg b/src/main/resources/assets/twilightforest/sounds/mob/redcap/redcap0.ogg deleted file mode 100644 index 844a5d8ac1..0000000000 Binary files a/src/main/resources/assets/twilightforest/sounds/mob/redcap/redcap0.ogg and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/redcap/redcap1.ogg b/src/main/resources/assets/twilightforest/sounds/mob/redcap/redcap1.ogg index 3798050b71..844a5d8ac1 100644 Binary files a/src/main/resources/assets/twilightforest/sounds/mob/redcap/redcap1.ogg and b/src/main/resources/assets/twilightforest/sounds/mob/redcap/redcap1.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/redcap/redcap2.ogg b/src/main/resources/assets/twilightforest/sounds/mob/redcap/redcap2.ogg index 3e7e810424..3798050b71 100644 Binary files a/src/main/resources/assets/twilightforest/sounds/mob/redcap/redcap2.ogg and b/src/main/resources/assets/twilightforest/sounds/mob/redcap/redcap2.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/redcap/redcap3.ogg b/src/main/resources/assets/twilightforest/sounds/mob/redcap/redcap3.ogg index a1f4b677c2..3e7e810424 100644 Binary files a/src/main/resources/assets/twilightforest/sounds/mob/redcap/redcap3.ogg and b/src/main/resources/assets/twilightforest/sounds/mob/redcap/redcap3.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/redcap/redcap4.ogg b/src/main/resources/assets/twilightforest/sounds/mob/redcap/redcap4.ogg index 5b3b9d9a15..a1f4b677c2 100644 Binary files a/src/main/resources/assets/twilightforest/sounds/mob/redcap/redcap4.ogg and b/src/main/resources/assets/twilightforest/sounds/mob/redcap/redcap4.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/redcap/redcap5.ogg b/src/main/resources/assets/twilightforest/sounds/mob/redcap/redcap5.ogg index 22bb1f4336..5b3b9d9a15 100644 Binary files a/src/main/resources/assets/twilightforest/sounds/mob/redcap/redcap5.ogg and b/src/main/resources/assets/twilightforest/sounds/mob/redcap/redcap5.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/redcap/redcap6.ogg b/src/main/resources/assets/twilightforest/sounds/mob/redcap/redcap6.ogg new file mode 100644 index 0000000000..22bb1f4336 Binary files /dev/null and b/src/main/resources/assets/twilightforest/sounds/mob/redcap/redcap6.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/tinybird/chirp0.ogg b/src/main/resources/assets/twilightforest/sounds/mob/tiny_bird/chirp1.ogg similarity index 100% rename from src/main/resources/assets/twilightforest/sounds/mob/tinybird/chirp0.ogg rename to src/main/resources/assets/twilightforest/sounds/mob/tiny_bird/chirp1.ogg diff --git a/src/main/resources/assets/twilightforest/sounds/mob/tinybird/chirp1.ogg b/src/main/resources/assets/twilightforest/sounds/mob/tiny_bird/chirp2.ogg similarity index 100% rename from src/main/resources/assets/twilightforest/sounds/mob/tinybird/chirp1.ogg rename to src/main/resources/assets/twilightforest/sounds/mob/tiny_bird/chirp2.ogg diff --git a/src/main/resources/assets/twilightforest/sounds/mob/tinybird/chirp2.ogg b/src/main/resources/assets/twilightforest/sounds/mob/tiny_bird/chirp3.ogg similarity index 100% rename from src/main/resources/assets/twilightforest/sounds/mob/tinybird/chirp2.ogg rename to src/main/resources/assets/twilightforest/sounds/mob/tiny_bird/chirp3.ogg diff --git a/src/main/resources/assets/twilightforest/sounds/mob/tinybird/hurt0.ogg b/src/main/resources/assets/twilightforest/sounds/mob/tiny_bird/hurt1.ogg similarity index 100% rename from src/main/resources/assets/twilightforest/sounds/mob/tinybird/hurt0.ogg rename to src/main/resources/assets/twilightforest/sounds/mob/tiny_bird/hurt1.ogg diff --git a/src/main/resources/assets/twilightforest/sounds/mob/tinybird/hurt1.ogg b/src/main/resources/assets/twilightforest/sounds/mob/tiny_bird/hurt2.ogg similarity index 100% rename from src/main/resources/assets/twilightforest/sounds/mob/tinybird/hurt1.ogg rename to src/main/resources/assets/twilightforest/sounds/mob/tiny_bird/hurt2.ogg diff --git a/src/main/resources/assets/twilightforest/sounds/mob/tinybird/song0.ogg b/src/main/resources/assets/twilightforest/sounds/mob/tiny_bird/song1.ogg similarity index 100% rename from src/main/resources/assets/twilightforest/sounds/mob/tinybird/song0.ogg rename to src/main/resources/assets/twilightforest/sounds/mob/tiny_bird/song1.ogg diff --git a/src/main/resources/assets/twilightforest/sounds/mob/tinybird/song1.ogg b/src/main/resources/assets/twilightforest/sounds/mob/tiny_bird/song2.ogg similarity index 100% rename from src/main/resources/assets/twilightforest/sounds/mob/tinybird/song1.ogg rename to src/main/resources/assets/twilightforest/sounds/mob/tiny_bird/song2.ogg diff --git a/src/main/resources/assets/twilightforest/sounds/mob/tome/death.ogg b/src/main/resources/assets/twilightforest/sounds/mob/tome/death.ogg new file mode 100644 index 0000000000..e0c53533fe Binary files /dev/null and b/src/main/resources/assets/twilightforest/sounds/mob/tome/death.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/tome/hurt1.ogg b/src/main/resources/assets/twilightforest/sounds/mob/tome/hurt1.ogg new file mode 100644 index 0000000000..8745e50763 Binary files /dev/null and b/src/main/resources/assets/twilightforest/sounds/mob/tome/hurt1.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/tome/hurt2.ogg b/src/main/resources/assets/twilightforest/sounds/mob/tome/hurt2.ogg new file mode 100644 index 0000000000..109993935d Binary files /dev/null and b/src/main/resources/assets/twilightforest/sounds/mob/tome/hurt2.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/tome/hurt3.ogg b/src/main/resources/assets/twilightforest/sounds/mob/tome/hurt3.ogg new file mode 100644 index 0000000000..cb0d46fd9b Binary files /dev/null and b/src/main/resources/assets/twilightforest/sounds/mob/tome/hurt3.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/tome/idle1.ogg b/src/main/resources/assets/twilightforest/sounds/mob/tome/idle1.ogg new file mode 100644 index 0000000000..c040bc79f9 Binary files /dev/null and b/src/main/resources/assets/twilightforest/sounds/mob/tome/idle1.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/tome/idle2.ogg b/src/main/resources/assets/twilightforest/sounds/mob/tome/idle2.ogg new file mode 100644 index 0000000000..511da15239 Binary files /dev/null and b/src/main/resources/assets/twilightforest/sounds/mob/tome/idle2.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/urghast/trapactive.ogg b/src/main/resources/assets/twilightforest/sounds/mob/ur_ghast/trap_active.ogg similarity index 100% rename from src/main/resources/assets/twilightforest/sounds/mob/urghast/trapactive.ogg rename to src/main/resources/assets/twilightforest/sounds/mob/ur_ghast/trap_active.ogg diff --git a/src/main/resources/assets/twilightforest/sounds/mob/urghast/trapon0.ogg b/src/main/resources/assets/twilightforest/sounds/mob/ur_ghast/trap_on1.ogg similarity index 100% rename from src/main/resources/assets/twilightforest/sounds/mob/urghast/trapon0.ogg rename to src/main/resources/assets/twilightforest/sounds/mob/ur_ghast/trap_on1.ogg diff --git a/src/main/resources/assets/twilightforest/sounds/mob/urghast/trapon1.ogg b/src/main/resources/assets/twilightforest/sounds/mob/ur_ghast/trap_on2.ogg similarity index 100% rename from src/main/resources/assets/twilightforest/sounds/mob/urghast/trapon1.ogg rename to src/main/resources/assets/twilightforest/sounds/mob/ur_ghast/trap_on2.ogg diff --git a/src/main/resources/assets/twilightforest/sounds/mob/urghast/trapon2.ogg b/src/main/resources/assets/twilightforest/sounds/mob/ur_ghast/trap_on3.ogg similarity index 100% rename from src/main/resources/assets/twilightforest/sounds/mob/urghast/trapon2.ogg rename to src/main/resources/assets/twilightforest/sounds/mob/ur_ghast/trap_on3.ogg diff --git a/src/main/resources/assets/twilightforest/sounds/mob/urghast/trapon3.ogg b/src/main/resources/assets/twilightforest/sounds/mob/ur_ghast/trap_on4.ogg similarity index 100% rename from src/main/resources/assets/twilightforest/sounds/mob/urghast/trapon3.ogg rename to src/main/resources/assets/twilightforest/sounds/mob/ur_ghast/trap_on4.ogg diff --git a/src/main/resources/assets/twilightforest/sounds/mob/urghast/trapon4.ogg b/src/main/resources/assets/twilightforest/sounds/mob/ur_ghast/trap_on5.ogg similarity index 100% rename from src/main/resources/assets/twilightforest/sounds/mob/urghast/trapon4.ogg rename to src/main/resources/assets/twilightforest/sounds/mob/ur_ghast/trap_on5.ogg diff --git a/src/main/resources/assets/twilightforest/sounds/mob/urghast/trapspindown.ogg b/src/main/resources/assets/twilightforest/sounds/mob/ur_ghast/trap_spin_down.ogg similarity index 100% rename from src/main/resources/assets/twilightforest/sounds/mob/urghast/trapspindown.ogg rename to src/main/resources/assets/twilightforest/sounds/mob/ur_ghast/trap_spin_down.ogg diff --git a/src/main/resources/assets/twilightforest/sounds/mob/urghast/trapwarmup.ogg b/src/main/resources/assets/twilightforest/sounds/mob/ur_ghast/trap_warmup.ogg similarity index 100% rename from src/main/resources/assets/twilightforest/sounds/mob/urghast/trapwarmup.ogg rename to src/main/resources/assets/twilightforest/sounds/mob/ur_ghast/trap_warmup.ogg diff --git a/src/main/resources/assets/twilightforest/sounds/mob/wraith/wraith0.ogg b/src/main/resources/assets/twilightforest/sounds/mob/wraith/wraith0.ogg deleted file mode 100644 index d62dfd8b8c..0000000000 Binary files a/src/main/resources/assets/twilightforest/sounds/mob/wraith/wraith0.ogg and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/wraith/wraith1.ogg b/src/main/resources/assets/twilightforest/sounds/mob/wraith/wraith1.ogg index 046f7eb199..d62dfd8b8c 100644 Binary files a/src/main/resources/assets/twilightforest/sounds/mob/wraith/wraith1.ogg and b/src/main/resources/assets/twilightforest/sounds/mob/wraith/wraith1.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/wraith/wraith2.ogg b/src/main/resources/assets/twilightforest/sounds/mob/wraith/wraith2.ogg index e20c341f70..046f7eb199 100644 Binary files a/src/main/resources/assets/twilightforest/sounds/mob/wraith/wraith2.ogg and b/src/main/resources/assets/twilightforest/sounds/mob/wraith/wraith2.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/wraith/wraith3.ogg b/src/main/resources/assets/twilightforest/sounds/mob/wraith/wraith3.ogg index 17a046149e..e20c341f70 100644 Binary files a/src/main/resources/assets/twilightforest/sounds/mob/wraith/wraith3.ogg and b/src/main/resources/assets/twilightforest/sounds/mob/wraith/wraith3.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/mob/wraith/wraith4.ogg b/src/main/resources/assets/twilightforest/sounds/mob/wraith/wraith4.ogg new file mode 100644 index 0000000000..17a046149e Binary files /dev/null and b/src/main/resources/assets/twilightforest/sounds/mob/wraith/wraith4.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/music/findings.ogg b/src/main/resources/assets/twilightforest/sounds/music/findings.ogg new file mode 100644 index 0000000000..6077a6bc10 Binary files /dev/null and b/src/main/resources/assets/twilightforest/sounds/music/findings.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/music/home.ogg b/src/main/resources/assets/twilightforest/sounds/music/home.ogg new file mode 100644 index 0000000000..96d9d98c0d Binary files /dev/null and b/src/main/resources/assets/twilightforest/sounds/music/home.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/music/maker.ogg b/src/main/resources/assets/twilightforest/sounds/music/maker.ogg new file mode 100644 index 0000000000..574b379b51 Binary files /dev/null and b/src/main/resources/assets/twilightforest/sounds/music/maker.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/music/motion.ogg b/src/main/resources/assets/twilightforest/sounds/music/motion.ogg new file mode 100644 index 0000000000..bad357a09e Binary files /dev/null and b/src/main/resources/assets/twilightforest/sounds/music/motion.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/music/radiance.ogg b/src/main/resources/assets/twilightforest/sounds/music/radiance.ogg new file mode 100644 index 0000000000..ff150d75cb Binary files /dev/null and b/src/main/resources/assets/twilightforest/sounds/music/radiance.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/music/steps.ogg b/src/main/resources/assets/twilightforest/sounds/music/steps.ogg new file mode 100644 index 0000000000..59ff375c94 Binary files /dev/null and b/src/main/resources/assets/twilightforest/sounds/music/steps.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/music/superstitious.ogg b/src/main/resources/assets/twilightforest/sounds/music/superstitious.ogg new file mode 100644 index 0000000000..863d16e161 Binary files /dev/null and b/src/main/resources/assets/twilightforest/sounds/music/superstitious.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/music/thread.ogg b/src/main/resources/assets/twilightforest/sounds/music/thread.ogg new file mode 100644 index 0000000000..ad70cf1f5f Binary files /dev/null and b/src/main/resources/assets/twilightforest/sounds/music/thread.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/music/wayfarer.ogg b/src/main/resources/assets/twilightforest/sounds/music/wayfarer.ogg new file mode 100644 index 0000000000..ed5174ddfc Binary files /dev/null and b/src/main/resources/assets/twilightforest/sounds/music/wayfarer.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/random/beanstalk_grow.ogg b/src/main/resources/assets/twilightforest/sounds/random/beanstalk_grow.ogg new file mode 100644 index 0000000000..1341576a81 Binary files /dev/null and b/src/main/resources/assets/twilightforest/sounds/random/beanstalk_grow.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/random/casket/close.ogg b/src/main/resources/assets/twilightforest/sounds/random/casket/close.ogg new file mode 100644 index 0000000000..c7888d3aac Binary files /dev/null and b/src/main/resources/assets/twilightforest/sounds/random/casket/close.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/random/casket/open.ogg b/src/main/resources/assets/twilightforest/sounds/random/casket/open.ogg new file mode 100644 index 0000000000..c25f1ebb5b Binary files /dev/null and b/src/main/resources/assets/twilightforest/sounds/random/casket/open.ogg differ diff --git a/src/main/resources/assets/twilightforest/sounds/random/casket/repair.ogg b/src/main/resources/assets/twilightforest/sounds/random/casket/repair.ogg new file mode 100644 index 0000000000..472d13532f Binary files /dev/null and b/src/main/resources/assets/twilightforest/sounds/random/casket/repair.ogg differ diff --git a/src/main/resources/assets/twilightforest/textures/armor/arcticarmor_1.png b/src/main/resources/assets/twilightforest/textures/armor/arcticarmor_1.png index 434c58e6d0..cd3d189a2e 100644 Binary files a/src/main/resources/assets/twilightforest/textures/armor/arcticarmor_1.png and b/src/main/resources/assets/twilightforest/textures/armor/arcticarmor_1.png differ diff --git a/src/main/resources/assets/twilightforest/textures/armor/arcticarmor_1_dyed.png b/src/main/resources/assets/twilightforest/textures/armor/arcticarmor_1_dyed.png new file mode 100644 index 0000000000..cdf857b490 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/armor/arcticarmor_1_dyed.png differ diff --git a/src/main/resources/assets/twilightforest/textures/armor/arcticarmor_1_overlay.png b/src/main/resources/assets/twilightforest/textures/armor/arcticarmor_1_overlay.png new file mode 100644 index 0000000000..aa8c123adc Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/armor/arcticarmor_1_overlay.png differ diff --git a/src/main/resources/assets/twilightforest/textures/armor/arcticarmor_2.png b/src/main/resources/assets/twilightforest/textures/armor/arcticarmor_2.png index 99f8898e74..131566c1cd 100644 Binary files a/src/main/resources/assets/twilightforest/textures/armor/arcticarmor_2.png and b/src/main/resources/assets/twilightforest/textures/armor/arcticarmor_2.png differ diff --git a/src/main/resources/assets/twilightforest/textures/armor/arcticarmor_2_dyed.png b/src/main/resources/assets/twilightforest/textures/armor/arcticarmor_2_dyed.png new file mode 100644 index 0000000000..754901651c Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/armor/arcticarmor_2_dyed.png differ diff --git a/src/main/resources/assets/twilightforest/textures/armor/arcticarmor_2_overlay.png b/src/main/resources/assets/twilightforest/textures/armor/arcticarmor_2_overlay.png new file mode 100644 index 0000000000..83f29cd24e Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/armor/arcticarmor_2_overlay.png differ diff --git a/src/main/resources/assets/twilightforest/textures/armor/fiery_1.png b/src/main/resources/assets/twilightforest/textures/armor/fiery_1.png index 8ea1b0a511..bb78776106 100644 Binary files a/src/main/resources/assets/twilightforest/textures/armor/fiery_1.png and b/src/main/resources/assets/twilightforest/textures/armor/fiery_1.png differ diff --git a/src/main/resources/assets/twilightforest/textures/armor/fiery_2.png b/src/main/resources/assets/twilightforest/textures/armor/fiery_2.png index a467ab8ac2..c15a749564 100644 Binary files a/src/main/resources/assets/twilightforest/textures/armor/fiery_2.png and b/src/main/resources/assets/twilightforest/textures/armor/fiery_2.png differ diff --git a/src/main/resources/assets/twilightforest/textures/armor/ironwood_1.png b/src/main/resources/assets/twilightforest/textures/armor/ironwood_1.png index 5957cb7d79..6e665c4a29 100644 Binary files a/src/main/resources/assets/twilightforest/textures/armor/ironwood_1.png and b/src/main/resources/assets/twilightforest/textures/armor/ironwood_1.png differ diff --git a/src/main/resources/assets/twilightforest/textures/armor/ironwood_2.png b/src/main/resources/assets/twilightforest/textures/armor/ironwood_2.png index 70a6d98271..51637a9d11 100644 Binary files a/src/main/resources/assets/twilightforest/textures/armor/ironwood_2.png and b/src/main/resources/assets/twilightforest/textures/armor/ironwood_2.png differ diff --git a/src/main/resources/assets/twilightforest/textures/armor/knightly_1.png b/src/main/resources/assets/twilightforest/textures/armor/knightly_1.png index 87436509a4..d797fb1c54 100644 Binary files a/src/main/resources/assets/twilightforest/textures/armor/knightly_1.png and b/src/main/resources/assets/twilightforest/textures/armor/knightly_1.png differ diff --git a/src/main/resources/assets/twilightforest/textures/armor/knightly_2.png b/src/main/resources/assets/twilightforest/textures/armor/knightly_2.png index 10c37d4800..64b86fb2b5 100644 Binary files a/src/main/resources/assets/twilightforest/textures/armor/knightly_2.png and b/src/main/resources/assets/twilightforest/textures/armor/knightly_2.png differ diff --git a/src/main/resources/assets/twilightforest/textures/armor/naga_scale_1.png b/src/main/resources/assets/twilightforest/textures/armor/naga_scale_1.png index 7a13f2503a..fcc668fe58 100644 Binary files a/src/main/resources/assets/twilightforest/textures/armor/naga_scale_1.png and b/src/main/resources/assets/twilightforest/textures/armor/naga_scale_1.png differ diff --git a/src/main/resources/assets/twilightforest/textures/armor/naga_scale_2.png b/src/main/resources/assets/twilightforest/textures/armor/naga_scale_2.png index be315c0ebf..3e27ffca26 100644 Binary files a/src/main/resources/assets/twilightforest/textures/armor/naga_scale_2.png and b/src/main/resources/assets/twilightforest/textures/armor/naga_scale_2.png differ diff --git a/src/main/resources/assets/twilightforest/textures/armor/phantom_1.png b/src/main/resources/assets/twilightforest/textures/armor/phantom_1.png index 7edbe0b249..3058458901 100644 Binary files a/src/main/resources/assets/twilightforest/textures/armor/phantom_1.png and b/src/main/resources/assets/twilightforest/textures/armor/phantom_1.png differ diff --git a/src/main/resources/assets/twilightforest/textures/armor/steeleaf_1.png b/src/main/resources/assets/twilightforest/textures/armor/steeleaf_1.png index 760d82a70a..5e43f6f870 100644 Binary files a/src/main/resources/assets/twilightforest/textures/armor/steeleaf_1.png and b/src/main/resources/assets/twilightforest/textures/armor/steeleaf_1.png differ diff --git a/src/main/resources/assets/twilightforest/textures/armor/steeleaf_2.png b/src/main/resources/assets/twilightforest/textures/armor/steeleaf_2.png index 84112c290c..9a795241c5 100644 Binary files a/src/main/resources/assets/twilightforest/textures/armor/steeleaf_2.png and b/src/main/resources/assets/twilightforest/textures/armor/steeleaf_2.png differ diff --git a/src/main/resources/assets/twilightforest/textures/armor/yetiarmor_1.png b/src/main/resources/assets/twilightforest/textures/armor/yetiarmor_1.png index a302f9d5ce..5ff8e3e034 100644 Binary files a/src/main/resources/assets/twilightforest/textures/armor/yetiarmor_1.png and b/src/main/resources/assets/twilightforest/textures/armor/yetiarmor_1.png differ diff --git a/src/main/resources/assets/twilightforest/textures/armor/yetiarmor_2.png b/src/main/resources/assets/twilightforest/textures/armor/yetiarmor_2.png index ad6dfd5d44..bea4f7d1fa 100644 Binary files a/src/main/resources/assets/twilightforest/textures/armor/yetiarmor_2.png and b/src/main/resources/assets/twilightforest/textures/armor/yetiarmor_2.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/arctic_fur_block.png b/src/main/resources/assets/twilightforest/textures/block/arctic_fur_block.png new file mode 100644 index 0000000000..7aa2ab11f9 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/arctic_fur_block.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/arctic_fur_block.png.mcmeta b/src/main/resources/assets/twilightforest/textures/block/arctic_fur_block.png.mcmeta new file mode 100644 index 0000000000..9ba7af1ed8 --- /dev/null +++ b/src/main/resources/assets/twilightforest/textures/block/arctic_fur_block.png.mcmeta @@ -0,0 +1,7 @@ +{ + "ctm": { + "ctm_version": 1, + "type": "ctm", + "textures": [ "twilightforest:block/arctic_fur_block_ctm" ] + } +} diff --git a/src/main/resources/assets/twilightforest/textures/block/arctic_fur_block_ctm.png b/src/main/resources/assets/twilightforest/textures/block/arctic_fur_block_ctm.png new file mode 100644 index 0000000000..9fb3bd37fa Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/arctic_fur_block_ctm.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/aurora_block_0.png b/src/main/resources/assets/twilightforest/textures/block/aurora_block_0.png new file mode 100644 index 0000000000..bc93edfd27 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/aurora_block_0.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/aurora_block_0.png.mcmeta b/src/main/resources/assets/twilightforest/textures/block/aurora_block_0.png.mcmeta new file mode 100644 index 0000000000..62c3ce53c5 --- /dev/null +++ b/src/main/resources/assets/twilightforest/textures/block/aurora_block_0.png.mcmeta @@ -0,0 +1,38 @@ +{ + "animation": { + "frametime": 4, + "interpolate": true, + "frames": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 14, + 13, + 12, + 11, + 10, + 9, + 8, + 7, + 6, + 5, + 4, + 3, + 2, + 1 + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/textures/block/aurora_block_1.png b/src/main/resources/assets/twilightforest/textures/block/aurora_block_1.png new file mode 100644 index 0000000000..bc93edfd27 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/aurora_block_1.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/aurora_block_1.png.mcmeta b/src/main/resources/assets/twilightforest/textures/block/aurora_block_1.png.mcmeta new file mode 100644 index 0000000000..6698db17a2 --- /dev/null +++ b/src/main/resources/assets/twilightforest/textures/block/aurora_block_1.png.mcmeta @@ -0,0 +1,38 @@ +{ + "animation": { + "frametime": 4, + "interpolate": true, + "frames": [ + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 14, + 13, + 12, + 11, + 10, + 9, + 8, + 7, + 6, + 5, + 4, + 3, + 2, + 1, + 0, + 1 + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/textures/block/aurora_block_10.png b/src/main/resources/assets/twilightforest/textures/block/aurora_block_10.png new file mode 100644 index 0000000000..bc93edfd27 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/aurora_block_10.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/aurora_block_10.png.mcmeta b/src/main/resources/assets/twilightforest/textures/block/aurora_block_10.png.mcmeta new file mode 100644 index 0000000000..89a7b346ed --- /dev/null +++ b/src/main/resources/assets/twilightforest/textures/block/aurora_block_10.png.mcmeta @@ -0,0 +1,38 @@ +{ + "animation": { + "frametime": 4, + "interpolate": true, + "frames": [ + 10, + 9, + 8, + 7, + 6, + 5, + 4, + 3, + 2, + 1, + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 14, + 13, + 12, + 11 + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/textures/block/aurora_block_11.png b/src/main/resources/assets/twilightforest/textures/block/aurora_block_11.png new file mode 100644 index 0000000000..bc93edfd27 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/aurora_block_11.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/aurora_block_11.png.mcmeta b/src/main/resources/assets/twilightforest/textures/block/aurora_block_11.png.mcmeta new file mode 100644 index 0000000000..f049f9a635 --- /dev/null +++ b/src/main/resources/assets/twilightforest/textures/block/aurora_block_11.png.mcmeta @@ -0,0 +1,38 @@ +{ + "animation": { + "frametime": 4, + "interpolate": true, + "frames": [ + 8, + 7, + 6, + 5, + 4, + 3, + 2, + 1, + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 14, + 13, + 12, + 11, + 10, + 9 + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/textures/block/aurora_block_12.png b/src/main/resources/assets/twilightforest/textures/block/aurora_block_12.png new file mode 100644 index 0000000000..bc93edfd27 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/aurora_block_12.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/aurora_block_12.png.mcmeta b/src/main/resources/assets/twilightforest/textures/block/aurora_block_12.png.mcmeta new file mode 100644 index 0000000000..b11e22cfa2 --- /dev/null +++ b/src/main/resources/assets/twilightforest/textures/block/aurora_block_12.png.mcmeta @@ -0,0 +1,38 @@ +{ + "animation": { + "frametime": 4, + "interpolate": true, + "frames": [ + 6, + 5, + 4, + 3, + 2, + 1, + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 14, + 13, + 12, + 11, + 10, + 9, + 8, + 7 + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/textures/block/aurora_block_13.png b/src/main/resources/assets/twilightforest/textures/block/aurora_block_13.png new file mode 100644 index 0000000000..bc93edfd27 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/aurora_block_13.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/aurora_block_13.png.mcmeta b/src/main/resources/assets/twilightforest/textures/block/aurora_block_13.png.mcmeta new file mode 100644 index 0000000000..655f3eda86 --- /dev/null +++ b/src/main/resources/assets/twilightforest/textures/block/aurora_block_13.png.mcmeta @@ -0,0 +1,38 @@ +{ + "animation": { + "frametime": 4, + "interpolate": true, + "frames": [ + 4, + 3, + 2, + 1, + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 14, + 13, + 12, + 11, + 10, + 9, + 8, + 7, + 6, + 5 + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/textures/block/aurora_block_14.png b/src/main/resources/assets/twilightforest/textures/block/aurora_block_14.png new file mode 100644 index 0000000000..bc93edfd27 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/aurora_block_14.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/aurora_block_14.png.mcmeta b/src/main/resources/assets/twilightforest/textures/block/aurora_block_14.png.mcmeta new file mode 100644 index 0000000000..99f9e7ee23 --- /dev/null +++ b/src/main/resources/assets/twilightforest/textures/block/aurora_block_14.png.mcmeta @@ -0,0 +1,38 @@ +{ + "animation": { + "frametime": 4, + "interpolate": true, + "frames": [ + 2, + 1, + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 14, + 13, + 12, + 11, + 10, + 9, + 8, + 7, + 6, + 5, + 4, + 3 + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/textures/block/aurora_block_15.png b/src/main/resources/assets/twilightforest/textures/block/aurora_block_15.png new file mode 100644 index 0000000000..bc93edfd27 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/aurora_block_15.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/aurora_block_15.png.mcmeta b/src/main/resources/assets/twilightforest/textures/block/aurora_block_15.png.mcmeta new file mode 100644 index 0000000000..62c3ce53c5 --- /dev/null +++ b/src/main/resources/assets/twilightforest/textures/block/aurora_block_15.png.mcmeta @@ -0,0 +1,38 @@ +{ + "animation": { + "frametime": 4, + "interpolate": true, + "frames": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 14, + 13, + 12, + 11, + 10, + 9, + 8, + 7, + 6, + 5, + 4, + 3, + 2, + 1 + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/textures/block/aurora_block_2.png b/src/main/resources/assets/twilightforest/textures/block/aurora_block_2.png new file mode 100644 index 0000000000..bc93edfd27 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/aurora_block_2.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/aurora_block_2.png.mcmeta b/src/main/resources/assets/twilightforest/textures/block/aurora_block_2.png.mcmeta new file mode 100644 index 0000000000..d779139fcb --- /dev/null +++ b/src/main/resources/assets/twilightforest/textures/block/aurora_block_2.png.mcmeta @@ -0,0 +1,38 @@ +{ + "animation": { + "frametime": 4, + "interpolate": true, + "frames": [ + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 14, + 13, + 12, + 11, + 10, + 9, + 8, + 7, + 6, + 5, + 4, + 3, + 2, + 1, + 0, + 1, + 2, + 3 + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/textures/block/aurora_block_3.png b/src/main/resources/assets/twilightforest/textures/block/aurora_block_3.png new file mode 100644 index 0000000000..bc93edfd27 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/aurora_block_3.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/aurora_block_3.png.mcmeta b/src/main/resources/assets/twilightforest/textures/block/aurora_block_3.png.mcmeta new file mode 100644 index 0000000000..05c40d3d4a --- /dev/null +++ b/src/main/resources/assets/twilightforest/textures/block/aurora_block_3.png.mcmeta @@ -0,0 +1,38 @@ +{ + "animation": { + "frametime": 4, + "interpolate": true, + "frames": [ + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 14, + 13, + 12, + 11, + 10, + 9, + 8, + 7, + 6, + 5, + 4, + 3, + 2, + 1, + 0, + 1, + 2, + 3, + 4, + 5 + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/textures/block/aurora_block_4.png b/src/main/resources/assets/twilightforest/textures/block/aurora_block_4.png new file mode 100644 index 0000000000..bc93edfd27 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/aurora_block_4.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/aurora_block_4.png.mcmeta b/src/main/resources/assets/twilightforest/textures/block/aurora_block_4.png.mcmeta new file mode 100644 index 0000000000..922d27547b --- /dev/null +++ b/src/main/resources/assets/twilightforest/textures/block/aurora_block_4.png.mcmeta @@ -0,0 +1,38 @@ +{ + "animation": { + "frametime": 4, + "interpolate": true, + "frames": [ + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 14, + 13, + 12, + 11, + 10, + 9, + 8, + 7, + 6, + 5, + 4, + 3, + 2, + 1, + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7 + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/textures/block/aurora_block_5.png b/src/main/resources/assets/twilightforest/textures/block/aurora_block_5.png new file mode 100644 index 0000000000..bc93edfd27 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/aurora_block_5.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/aurora_block_5.png.mcmeta b/src/main/resources/assets/twilightforest/textures/block/aurora_block_5.png.mcmeta new file mode 100644 index 0000000000..5738e9ae0b --- /dev/null +++ b/src/main/resources/assets/twilightforest/textures/block/aurora_block_5.png.mcmeta @@ -0,0 +1,38 @@ +{ + "animation": { + "frametime": 4, + "interpolate": true, + "frames": [ + 10, + 11, + 12, + 13, + 14, + 15, + 14, + 13, + 12, + 11, + 10, + 9, + 8, + 7, + 6, + 5, + 4, + 3, + 2, + 1, + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9 + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/textures/block/aurora_block_6.png b/src/main/resources/assets/twilightforest/textures/block/aurora_block_6.png new file mode 100644 index 0000000000..bc93edfd27 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/aurora_block_6.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/aurora_block_6.png.mcmeta b/src/main/resources/assets/twilightforest/textures/block/aurora_block_6.png.mcmeta new file mode 100644 index 0000000000..b5c395d4b2 --- /dev/null +++ b/src/main/resources/assets/twilightforest/textures/block/aurora_block_6.png.mcmeta @@ -0,0 +1,38 @@ +{ + "animation": { + "frametime": 4, + "interpolate": true, + "frames": [ + 12, + 13, + 14, + 15, + 14, + 13, + 12, + 11, + 10, + 9, + 8, + 7, + 6, + 5, + 4, + 3, + 2, + 1, + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11 + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/textures/block/aurora_block_7.png b/src/main/resources/assets/twilightforest/textures/block/aurora_block_7.png new file mode 100644 index 0000000000..bc93edfd27 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/aurora_block_7.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/aurora_block_7.png.mcmeta b/src/main/resources/assets/twilightforest/textures/block/aurora_block_7.png.mcmeta new file mode 100644 index 0000000000..a7072035a4 --- /dev/null +++ b/src/main/resources/assets/twilightforest/textures/block/aurora_block_7.png.mcmeta @@ -0,0 +1,38 @@ +{ + "animation": { + "frametime": 4, + "interpolate": true, + "frames": [ + 14, + 15, + 14, + 13, + 12, + 11, + 10, + 9, + 8, + 7, + 6, + 5, + 4, + 3, + 2, + 1, + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13 + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/textures/block/aurora_block_8.png b/src/main/resources/assets/twilightforest/textures/block/aurora_block_8.png new file mode 100644 index 0000000000..bc93edfd27 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/aurora_block_8.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/aurora_block_8.png.mcmeta b/src/main/resources/assets/twilightforest/textures/block/aurora_block_8.png.mcmeta new file mode 100644 index 0000000000..6e31ab8e5b --- /dev/null +++ b/src/main/resources/assets/twilightforest/textures/block/aurora_block_8.png.mcmeta @@ -0,0 +1,38 @@ +{ + "animation": { + "frametime": 4, + "interpolate": true, + "frames": [ + 14, + 13, + 12, + 11, + 10, + 9, + 8, + 7, + 6, + 5, + 4, + 3, + 2, + 1, + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15 + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/textures/block/aurora_block_9.png b/src/main/resources/assets/twilightforest/textures/block/aurora_block_9.png new file mode 100644 index 0000000000..bc93edfd27 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/aurora_block_9.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/aurora_block_9.png.mcmeta b/src/main/resources/assets/twilightforest/textures/block/aurora_block_9.png.mcmeta new file mode 100644 index 0000000000..42d4716cad --- /dev/null +++ b/src/main/resources/assets/twilightforest/textures/block/aurora_block_9.png.mcmeta @@ -0,0 +1,38 @@ +{ + "animation": { + "frametime": 4, + "interpolate": true, + "frames": [ + 12, + 11, + 10, + 9, + 8, + 7, + 6, + 5, + 4, + 3, + 2, + 1, + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 14, + 13 + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/textures/block/aurora_pillar.png b/src/main/resources/assets/twilightforest/textures/block/aurora_pillar.png new file mode 100644 index 0000000000..f76615b0f8 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/aurora_pillar.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/aurora_pillar_top.png b/src/main/resources/assets/twilightforest/textures/block/aurora_pillar_top.png new file mode 100644 index 0000000000..2bb7368543 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/aurora_pillar_top.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/aurora_slab_side.png b/src/main/resources/assets/twilightforest/textures/block/aurora_slab_side.png new file mode 100644 index 0000000000..7fca163040 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/aurora_slab_side.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/auroralized_glass.png b/src/main/resources/assets/twilightforest/textures/block/auroralized_glass.png new file mode 100644 index 0000000000..fbc11a19c3 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/auroralized_glass.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/auroralized_glass.png.mcmeta b/src/main/resources/assets/twilightforest/textures/block/auroralized_glass.png.mcmeta new file mode 100644 index 0000000000..5dbfe04233 --- /dev/null +++ b/src/main/resources/assets/twilightforest/textures/block/auroralized_glass.png.mcmeta @@ -0,0 +1,8 @@ +{ + "ctm": { + "ctm_version": 1, + "type": "ctm", + "layer": "TRANSLUCENT", + "textures": [ "twilightforest:block/auroralized_glass_ct" ] + } +} diff --git a/src/main/resources/assets/twilightforest/textures/block/auroralized_glass_ct.png b/src/main/resources/assets/twilightforest/textures/block/auroralized_glass_ct.png new file mode 100644 index 0000000000..4c3004df0e Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/auroralized_glass_ct.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/blank.png b/src/main/resources/assets/twilightforest/textures/block/blank.png new file mode 100644 index 0000000000..aeaf6d4b67 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/blank.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/blank.png.mcmeta b/src/main/resources/assets/twilightforest/textures/block/blank.png.mcmeta new file mode 100644 index 0000000000..f2f6a49153 --- /dev/null +++ b/src/main/resources/assets/twilightforest/textures/block/blank.png.mcmeta @@ -0,0 +1,6 @@ +{ + "ctm": { + "ctm_version": 1, + "layer": "CUTOUT" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/textures/block/blue_force_field.png b/src/main/resources/assets/twilightforest/textures/block/blue_force_field.png new file mode 100644 index 0000000000..6eb4fbafa8 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/blue_force_field.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/bold_castle_brick_pillar_end.png b/src/main/resources/assets/twilightforest/textures/block/bold_castle_brick_pillar_end.png new file mode 100644 index 0000000000..fa90a64927 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/bold_castle_brick_pillar_end.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/bold_castle_brick_pillar_side.png b/src/main/resources/assets/twilightforest/textures/block/bold_castle_brick_pillar_side.png new file mode 100644 index 0000000000..3e2f7d1036 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/bold_castle_brick_pillar_side.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/bold_castle_brick_tile.png b/src/main/resources/assets/twilightforest/textures/block/bold_castle_brick_tile.png new file mode 100644 index 0000000000..73149209df Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/bold_castle_brick_tile.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/boss_spawner.png b/src/main/resources/assets/twilightforest/textures/block/boss_spawner.png new file mode 100644 index 0000000000..63d4a3b57b Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/boss_spawner.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/brown_thorns_side.png b/src/main/resources/assets/twilightforest/textures/block/brown_thorns_side.png new file mode 100644 index 0000000000..549701622d Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/brown_thorns_side.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/brown_thorns_top.png b/src/main/resources/assets/twilightforest/textures/block/brown_thorns_top.png new file mode 100644 index 0000000000..8e6b362c74 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/brown_thorns_top.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/burnt_thorns_side.png b/src/main/resources/assets/twilightforest/textures/block/burnt_thorns_side.png new file mode 100644 index 0000000000..527ce0e105 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/burnt_thorns_side.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/burnt_thorns_top.png b/src/main/resources/assets/twilightforest/textures/block/burnt_thorns_top.png new file mode 100644 index 0000000000..ed1c8a3fed Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/burnt_thorns_top.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/candelabra.png b/src/main/resources/assets/twilightforest/textures/block/candelabra.png new file mode 100644 index 0000000000..183f5329dd Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/candelabra.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/canopy_log.png b/src/main/resources/assets/twilightforest/textures/block/canopy_log.png new file mode 100644 index 0000000000..f2a8de04d2 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/canopy_log.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/canopy_log_top.png b/src/main/resources/assets/twilightforest/textures/block/canopy_log_top.png new file mode 100644 index 0000000000..559a01dc76 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/canopy_log_top.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/canopy_sapling.png b/src/main/resources/assets/twilightforest/textures/block/canopy_sapling.png new file mode 100644 index 0000000000..f3191d0785 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/canopy_sapling.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/carminite_block.png b/src/main/resources/assets/twilightforest/textures/block/carminite_block.png new file mode 100644 index 0000000000..a588507690 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/carminite_block.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/carminite_block_overlay.png b/src/main/resources/assets/twilightforest/textures/block/carminite_block_overlay.png new file mode 100644 index 0000000000..391b227d00 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/carminite_block_overlay.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/castle_brick.png b/src/main/resources/assets/twilightforest/textures/block/castle_brick.png new file mode 100644 index 0000000000..d13083496e Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/castle_brick.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/castle_brick_frame_edge2.png b/src/main/resources/assets/twilightforest/textures/block/castle_brick_frame_edge2.png new file mode 100644 index 0000000000..99d1c70353 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/castle_brick_frame_edge2.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/castle_brick_frame_edge_v2.png b/src/main/resources/assets/twilightforest/textures/block/castle_brick_frame_edge_v2.png new file mode 100644 index 0000000000..065d07be0f Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/castle_brick_frame_edge_v2.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/castle_brick_stairs.png b/src/main/resources/assets/twilightforest/textures/block/castle_brick_stairs.png new file mode 100644 index 0000000000..9881444a7f Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/castle_brick_stairs.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/castle_door.png b/src/main/resources/assets/twilightforest/textures/block/castle_door.png new file mode 100644 index 0000000000..90157a91a3 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/castle_door.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/castle_door_active.png b/src/main/resources/assets/twilightforest/textures/block/castle_door_active.png new file mode 100644 index 0000000000..90157a91a3 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/castle_door_active.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/castle_door_rune_corners.png b/src/main/resources/assets/twilightforest/textures/block/castle_door_rune_corners.png new file mode 100644 index 0000000000..125241085e Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/castle_door_rune_corners.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/castle_door_rune_ctm.png b/src/main/resources/assets/twilightforest/textures/block/castle_door_rune_ctm.png new file mode 100644 index 0000000000..f494bda90d Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/castle_door_rune_ctm.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/castle_door_vanished.png b/src/main/resources/assets/twilightforest/textures/block/castle_door_vanished.png new file mode 100644 index 0000000000..5098bcf7a2 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/castle_door_vanished.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/castle_door_vanished_active.png b/src/main/resources/assets/twilightforest/textures/block/castle_door_vanished_active.png new file mode 100644 index 0000000000..ec28f5ee58 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/castle_door_vanished_active.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/castle_roof_tile.png b/src/main/resources/assets/twilightforest/textures/block/castle_roof_tile.png new file mode 100644 index 0000000000..a3140bf07c Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/castle_roof_tile.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/castleblock_magic_0.png b/src/main/resources/assets/twilightforest/textures/block/castleblock_magic_0.png new file mode 100644 index 0000000000..c29128824d Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/castleblock_magic_0.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/castleblock_magic_1.png b/src/main/resources/assets/twilightforest/textures/block/castleblock_magic_1.png new file mode 100644 index 0000000000..2a4af05bce Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/castleblock_magic_1.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/castleblock_magic_2.png b/src/main/resources/assets/twilightforest/textures/block/castleblock_magic_2.png new file mode 100644 index 0000000000..f68e42e5c9 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/castleblock_magic_2.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/castleblock_magic_3.png b/src/main/resources/assets/twilightforest/textures/block/castleblock_magic_3.png new file mode 100644 index 0000000000..e4121a603c Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/castleblock_magic_3.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/castleblock_magic_4.png b/src/main/resources/assets/twilightforest/textures/block/castleblock_magic_4.png new file mode 100644 index 0000000000..a2a9d46018 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/castleblock_magic_4.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/castleblock_magic_5.png b/src/main/resources/assets/twilightforest/textures/block/castleblock_magic_5.png new file mode 100644 index 0000000000..13aa051d11 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/castleblock_magic_5.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/castleblock_magic_6.png b/src/main/resources/assets/twilightforest/textures/block/castleblock_magic_6.png new file mode 100644 index 0000000000..a6db780d74 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/castleblock_magic_6.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/castleblock_magic_7.png b/src/main/resources/assets/twilightforest/textures/block/castleblock_magic_7.png new file mode 100644 index 0000000000..9f7b0c6644 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/castleblock_magic_7.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/castleblock_tile.png b/src/main/resources/assets/twilightforest/textures/block/castleblock_tile.png new file mode 100644 index 0000000000..25bb48c72b Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/castleblock_tile.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/chiseled_mazestone.png b/src/main/resources/assets/twilightforest/textures/block/chiseled_mazestone.png new file mode 100644 index 0000000000..d27366cfa6 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/chiseled_mazestone.png differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/TFCicada.png b/src/main/resources/assets/twilightforest/textures/block/cicada.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/blocks/TFCicada.png rename to src/main/resources/assets/twilightforest/textures/block/cicada.png diff --git a/src/main/resources/assets/twilightforest/textures/block/cicada_jar_cork.png b/src/main/resources/assets/twilightforest/textures/block/cicada_jar_cork.png new file mode 100644 index 0000000000..db305053d6 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/cicada_jar_cork.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/cinder_corner.png b/src/main/resources/assets/twilightforest/textures/block/cinder_corner.png new file mode 100644 index 0000000000..6fd8546c91 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/cinder_corner.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/cinder_log.png b/src/main/resources/assets/twilightforest/textures/block/cinder_log.png new file mode 100644 index 0000000000..2131806b85 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/cinder_log.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/cinder_log_top.png b/src/main/resources/assets/twilightforest/textures/block/cinder_log_top.png new file mode 100644 index 0000000000..14b9c8f8c0 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/cinder_log_top.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/cinder_side.png b/src/main/resources/assets/twilightforest/textures/block/cinder_side.png new file mode 100644 index 0000000000..058f15ca65 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/cinder_side.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/cinder_top.png b/src/main/resources/assets/twilightforest/textures/block/cinder_top.png new file mode 100644 index 0000000000..afb5abdd05 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/cinder_top.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/cloverpatch.png b/src/main/resources/assets/twilightforest/textures/block/cloverpatch.png new file mode 100644 index 0000000000..6d0f947748 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/cloverpatch.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/cracked_castle_brick.png b/src/main/resources/assets/twilightforest/textures/block/cracked_castle_brick.png new file mode 100644 index 0000000000..4946b38b7a Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/cracked_castle_brick.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/cracked_castle_brick_stairs.png b/src/main/resources/assets/twilightforest/textures/block/cracked_castle_brick_stairs.png new file mode 100644 index 0000000000..b997929908 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/cracked_castle_brick_stairs.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/cracked_deadrock.png b/src/main/resources/assets/twilightforest/textures/block/cracked_deadrock.png new file mode 100644 index 0000000000..0a433cbffd Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/cracked_deadrock.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/cracked_mazestone.png b/src/main/resources/assets/twilightforest/textures/block/cracked_mazestone.png new file mode 100644 index 0000000000..95934ccbef Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/cracked_mazestone.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/cracked_towerwood.png b/src/main/resources/assets/twilightforest/textures/block/cracked_towerwood.png new file mode 100644 index 0000000000..6b70ab81ad Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/cracked_towerwood.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/cracked_towerwood_alt.png b/src/main/resources/assets/twilightforest/textures/block/cracked_towerwood_alt.png new file mode 100644 index 0000000000..ef462e7998 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/cracked_towerwood_alt.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/cracked_underbrick.png b/src/main/resources/assets/twilightforest/textures/block/cracked_underbrick.png new file mode 100644 index 0000000000..f0328e09ac Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/cracked_underbrick.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/cut_mazestone.png b/src/main/resources/assets/twilightforest/textures/block/cut_mazestone.png new file mode 100644 index 0000000000..48177adde1 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/cut_mazestone.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/dark_log.png b/src/main/resources/assets/twilightforest/textures/block/dark_log.png new file mode 100644 index 0000000000..2a8eb56ef6 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/dark_log.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/dark_log_top.png b/src/main/resources/assets/twilightforest/textures/block/dark_log_top.png new file mode 100644 index 0000000000..5592626426 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/dark_log_top.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/darkwood_leaves.png b/src/main/resources/assets/twilightforest/textures/block/darkwood_leaves.png new file mode 100644 index 0000000000..55b00a2430 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/darkwood_leaves.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/darkwood_sapling.png b/src/main/resources/assets/twilightforest/textures/block/darkwood_sapling.png new file mode 100644 index 0000000000..f2ab898ccf Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/darkwood_sapling.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/deadrock.png b/src/main/resources/assets/twilightforest/textures/block/deadrock.png new file mode 100644 index 0000000000..b5e888f427 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/deadrock.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/decorative_mazestone.png b/src/main/resources/assets/twilightforest/textures/block/decorative_mazestone.png new file mode 100644 index 0000000000..f46fb783db Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/decorative_mazestone.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/encased_castle_brick_pillar_end.png b/src/main/resources/assets/twilightforest/textures/block/encased_castle_brick_pillar_end.png new file mode 100644 index 0000000000..094af27c8a Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/encased_castle_brick_pillar_end.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/encased_castle_brick_pillar_h.png b/src/main/resources/assets/twilightforest/textures/block/encased_castle_brick_pillar_h.png new file mode 100644 index 0000000000..371d62b20b Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/encased_castle_brick_pillar_h.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/encased_castle_brick_pillar_side.png b/src/main/resources/assets/twilightforest/textures/block/encased_castle_brick_pillar_side.png new file mode 100644 index 0000000000..1a930f9d44 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/encased_castle_brick_pillar_side.png differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/towerwood_encased.png b/src/main/resources/assets/twilightforest/textures/block/encased_towerwood.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/blocks/towerwood_encased.png rename to src/main/resources/assets/twilightforest/textures/block/encased_towerwood.png diff --git a/src/main/resources/assets/twilightforest/textures/block/etched_nagastone_down.png b/src/main/resources/assets/twilightforest/textures/block/etched_nagastone_down.png new file mode 100644 index 0000000000..238654ae51 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/etched_nagastone_down.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/etched_nagastone_down_mossy.png b/src/main/resources/assets/twilightforest/textures/block/etched_nagastone_down_mossy.png new file mode 100644 index 0000000000..5900c4e696 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/etched_nagastone_down_mossy.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/etched_nagastone_down_weathered.png b/src/main/resources/assets/twilightforest/textures/block/etched_nagastone_down_weathered.png new file mode 100644 index 0000000000..b17bc72991 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/etched_nagastone_down_weathered.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/etched_nagastone_left.png b/src/main/resources/assets/twilightforest/textures/block/etched_nagastone_left.png new file mode 100644 index 0000000000..9693d4694d Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/etched_nagastone_left.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/etched_nagastone_left_mossy.png b/src/main/resources/assets/twilightforest/textures/block/etched_nagastone_left_mossy.png new file mode 100644 index 0000000000..28e468d4b9 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/etched_nagastone_left_mossy.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/etched_nagastone_left_weathered.png b/src/main/resources/assets/twilightforest/textures/block/etched_nagastone_left_weathered.png new file mode 100644 index 0000000000..6f45214e14 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/etched_nagastone_left_weathered.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/etched_nagastone_right.png b/src/main/resources/assets/twilightforest/textures/block/etched_nagastone_right.png new file mode 100644 index 0000000000..9e05169261 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/etched_nagastone_right.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/etched_nagastone_right_mossy.png b/src/main/resources/assets/twilightforest/textures/block/etched_nagastone_right_mossy.png new file mode 100644 index 0000000000..f636beb28b Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/etched_nagastone_right_mossy.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/etched_nagastone_right_weathered.png b/src/main/resources/assets/twilightforest/textures/block/etched_nagastone_right_weathered.png new file mode 100644 index 0000000000..17ee38b048 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/etched_nagastone_right_weathered.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/etched_nagastone_up.png b/src/main/resources/assets/twilightforest/textures/block/etched_nagastone_up.png new file mode 100644 index 0000000000..d1a131df47 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/etched_nagastone_up.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/etched_nagastone_up_mossy.png b/src/main/resources/assets/twilightforest/textures/block/etched_nagastone_up_mossy.png new file mode 100644 index 0000000000..780f36bc6c Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/etched_nagastone_up_mossy.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/etched_nagastone_up_weathered.png b/src/main/resources/assets/twilightforest/textures/block/etched_nagastone_up_weathered.png new file mode 100644 index 0000000000..b782a0611f Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/etched_nagastone_up_weathered.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/experiment115/experiment115_bottom.png b/src/main/resources/assets/twilightforest/textures/block/experiment115/experiment115_bottom.png new file mode 100644 index 0000000000..4fc0e24262 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/experiment115/experiment115_bottom.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/experiment115/experiment115_inner.png b/src/main/resources/assets/twilightforest/textures/block/experiment115/experiment115_inner.png new file mode 100644 index 0000000000..f06afcc6d2 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/experiment115/experiment115_inner.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/experiment115/experiment115_side.png b/src/main/resources/assets/twilightforest/textures/block/experiment115/experiment115_side.png new file mode 100644 index 0000000000..827279fbfa Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/experiment115/experiment115_side.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/experiment115/experiment115_sprinkle.png b/src/main/resources/assets/twilightforest/textures/block/experiment115/experiment115_sprinkle.png new file mode 100644 index 0000000000..452be061c2 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/experiment115/experiment115_sprinkle.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/experiment115/experiment115_top.png b/src/main/resources/assets/twilightforest/textures/block/experiment115/experiment115_top.png new file mode 100644 index 0000000000..bddfff6110 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/experiment115/experiment115_top.png differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/fiddlehead.png b/src/main/resources/assets/twilightforest/textures/block/fiddlehead.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/blocks/fiddlehead.png rename to src/main/resources/assets/twilightforest/textures/block/fiddlehead.png diff --git a/src/main/resources/assets/twilightforest/textures/block/fiery_block.png b/src/main/resources/assets/twilightforest/textures/block/fiery_block.png new file mode 100644 index 0000000000..96a656a95e Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/fiery_block.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/fiery_block_inner.png b/src/main/resources/assets/twilightforest/textures/block/fiery_block_inner.png new file mode 100644 index 0000000000..fd22143c27 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/fiery_block_inner.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/fiery_block_inner.png.mcmeta b/src/main/resources/assets/twilightforest/textures/block/fiery_block_inner.png.mcmeta new file mode 100644 index 0000000000..2384db8758 --- /dev/null +++ b/src/main/resources/assets/twilightforest/textures/block/fiery_block_inner.png.mcmeta @@ -0,0 +1,12 @@ +{ + "ctm": { + "ctm_version": 1, + "type": "ctm", + "layer": "CUTOUT", + "textures": [ "twilightforest:block/fiery_block_inner_ctm" ], + "extra": { + "light": 15, + "connect_inside": true + } + } +} diff --git a/src/main/resources/assets/twilightforest/textures/block/fiery_block_inner_ctm.png b/src/main/resources/assets/twilightforest/textures/block/fiery_block_inner_ctm.png new file mode 100644 index 0000000000..ec403d9cc5 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/fiery_block_inner_ctm.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/fiery_pattern.png b/src/main/resources/assets/twilightforest/textures/block/fiery_pattern.png new file mode 100644 index 0000000000..dedc0257a3 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/fiery_pattern.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/fiery_pattern.png.mcmeta b/src/main/resources/assets/twilightforest/textures/block/fiery_pattern.png.mcmeta new file mode 100755 index 0000000000..d28868e498 --- /dev/null +++ b/src/main/resources/assets/twilightforest/textures/block/fiery_pattern.png.mcmeta @@ -0,0 +1,11 @@ +{ + "ctm": { + "ctm_version": 1, + "type": "pattern", + "extra": { + "connect_inside": true, + "light": 15, + "size": 2 + } + } +} diff --git a/src/main/resources/assets/twilightforest/textures/blocks/TFFirefly.png b/src/main/resources/assets/twilightforest/textures/block/firefly.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/blocks/TFFirefly.png rename to src/main/resources/assets/twilightforest/textures/block/firefly.png diff --git a/src/main/resources/assets/twilightforest/textures/block/firefly_jar_cork.png b/src/main/resources/assets/twilightforest/textures/block/firefly_jar_cork.png new file mode 100644 index 0000000000..3923098508 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/firefly_jar_cork.png differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/firejet_side.png b/src/main/resources/assets/twilightforest/textures/block/firejet_side.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/blocks/firejet_side.png rename to src/main/resources/assets/twilightforest/textures/block/firejet_side.png diff --git a/src/main/resources/assets/twilightforest/textures/blocks/firejet_top.png b/src/main/resources/assets/twilightforest/textures/block/firejet_top.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/blocks/firejet_top.png rename to src/main/resources/assets/twilightforest/textures/block/firejet_top.png diff --git a/src/main/resources/assets/twilightforest/textures/block/fluffy_cloud.png b/src/main/resources/assets/twilightforest/textures/block/fluffy_cloud.png new file mode 100644 index 0000000000..528e6cb359 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/fluffy_cloud.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/forcefield_tint.png b/src/main/resources/assets/twilightforest/textures/block/forcefield_tint.png new file mode 100644 index 0000000000..c4fcd76151 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/forcefield_tint.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/forcefield_tint.png.mcmeta b/src/main/resources/assets/twilightforest/textures/block/forcefield_tint.png.mcmeta new file mode 100644 index 0000000000..37db033060 --- /dev/null +++ b/src/main/resources/assets/twilightforest/textures/block/forcefield_tint.png.mcmeta @@ -0,0 +1,15 @@ +{ + "ctm": { + "ctm_version": 1, + "type":"ctm", + "layer":"TRANSLUCENT", + "textures":[ + "twilightforest:block/forcefield_tint_ct" + ], + "extra": { + "light": 15, + "connect_inside": true, + "ignore_states": true + } + } +} diff --git a/src/main/resources/assets/twilightforest/textures/block/forcefield_tint_ct.png b/src/main/resources/assets/twilightforest/textures/block/forcefield_tint_ct.png new file mode 100644 index 0000000000..83d3280a57 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/forcefield_tint_ct.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/forcefield_top.png b/src/main/resources/assets/twilightforest/textures/block/forcefield_top.png new file mode 100644 index 0000000000..dc3559c918 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/forcefield_top.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/forcefield_white.png b/src/main/resources/assets/twilightforest/textures/block/forcefield_white.png new file mode 100644 index 0000000000..42b7311113 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/forcefield_white.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/green_force_field.png b/src/main/resources/assets/twilightforest/textures/block/green_force_field.png new file mode 100644 index 0000000000..f6cade8f71 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/green_force_field.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/green_thorns_side.png b/src/main/resources/assets/twilightforest/textures/block/green_thorns_side.png new file mode 100644 index 0000000000..ca612486af Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/green_thorns_side.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/green_thorns_side_alt.png b/src/main/resources/assets/twilightforest/textures/block/green_thorns_side_alt.png new file mode 100644 index 0000000000..f366d0c8a1 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/green_thorns_side_alt.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/green_thorns_top.png b/src/main/resources/assets/twilightforest/textures/block/green_thorns_top.png new file mode 100644 index 0000000000..9545bc9ef1 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/green_thorns_top.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/hedge.png b/src/main/resources/assets/twilightforest/textures/block/hedge.png new file mode 100644 index 0000000000..ee6263edf5 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/hedge.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/hedge_rose.png b/src/main/resources/assets/twilightforest/textures/block/hedge_rose.png new file mode 100644 index 0000000000..b7c3700d22 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/hedge_rose.png differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/sapling_hollow_oak.png b/src/main/resources/assets/twilightforest/textures/block/hollow_oak_sapling.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/blocks/sapling_hollow_oak.png rename to src/main/resources/assets/twilightforest/textures/block/hollow_oak_sapling.png diff --git a/src/main/resources/assets/twilightforest/textures/block/huge_gloom_cap.png b/src/main/resources/assets/twilightforest/textures/block/huge_gloom_cap.png new file mode 100644 index 0000000000..d012e6cc32 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/huge_gloom_cap.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/huge_gloom_cap.png.mcmeta b/src/main/resources/assets/twilightforest/textures/block/huge_gloom_cap.png.mcmeta new file mode 100644 index 0000000000..36845e4915 --- /dev/null +++ b/src/main/resources/assets/twilightforest/textures/block/huge_gloom_cap.png.mcmeta @@ -0,0 +1,8 @@ +{ + "ctm": { + "ctm_version": 1, + "extra": { + "light": 7 + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/textures/block/huge_gloom_inside.png b/src/main/resources/assets/twilightforest/textures/block/huge_gloom_inside.png new file mode 100644 index 0000000000..5b59ebef27 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/huge_gloom_inside.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/huge_gloom_inside.png.mcmeta b/src/main/resources/assets/twilightforest/textures/block/huge_gloom_inside.png.mcmeta new file mode 100644 index 0000000000..36845e4915 --- /dev/null +++ b/src/main/resources/assets/twilightforest/textures/block/huge_gloom_inside.png.mcmeta @@ -0,0 +1,8 @@ +{ + "ctm": { + "ctm_version": 1, + "extra": { + "light": 7 + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/textures/block/huge_lily_pad.png b/src/main/resources/assets/twilightforest/textures/block/huge_lily_pad.png new file mode 100644 index 0000000000..5bb645c9b2 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/huge_lily_pad.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/huge_lily_pad_0.png b/src/main/resources/assets/twilightforest/textures/block/huge_lily_pad_0.png new file mode 100644 index 0000000000..267bd9c1f9 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/huge_lily_pad_0.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/huge_lily_pad_1.png b/src/main/resources/assets/twilightforest/textures/block/huge_lily_pad_1.png new file mode 100644 index 0000000000..baa9c0e460 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/huge_lily_pad_1.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/huge_lily_pad_2.png b/src/main/resources/assets/twilightforest/textures/block/huge_lily_pad_2.png new file mode 100644 index 0000000000..66ebfac94b Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/huge_lily_pad_2.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/huge_lily_pad_3.png b/src/main/resources/assets/twilightforest/textures/block/huge_lily_pad_3.png new file mode 100644 index 0000000000..51b9d8a8d4 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/huge_lily_pad_3.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/huge_mushgloom_stem.png b/src/main/resources/assets/twilightforest/textures/block/huge_mushgloom_stem.png new file mode 100644 index 0000000000..cff262f4a7 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/huge_mushgloom_stem.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/huge_mushgloom_stem.png.mcmeta b/src/main/resources/assets/twilightforest/textures/block/huge_mushgloom_stem.png.mcmeta new file mode 100644 index 0000000000..36845e4915 --- /dev/null +++ b/src/main/resources/assets/twilightforest/textures/block/huge_mushgloom_stem.png.mcmeta @@ -0,0 +1,8 @@ +{ + "ctm": { + "ctm_version": 1, + "extra": { + "light": 7 + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/textures/block/huge_stalk.png b/src/main/resources/assets/twilightforest/textures/block/huge_stalk.png new file mode 100644 index 0000000000..ea997212f9 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/huge_stalk.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/huge_stalk_top.png b/src/main/resources/assets/twilightforest/textures/block/huge_stalk_top.png new file mode 100644 index 0000000000..ea997212f9 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/huge_stalk_top.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/huge_water_lily.png b/src/main/resources/assets/twilightforest/textures/block/huge_water_lily.png new file mode 100644 index 0000000000..1980afbba3 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/huge_water_lily.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/infested_towerwood.png b/src/main/resources/assets/twilightforest/textures/block/infested_towerwood.png new file mode 100644 index 0000000000..b5aa3b0981 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/infested_towerwood.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/ironwood_block.png b/src/main/resources/assets/twilightforest/textures/block/ironwood_block.png new file mode 100644 index 0000000000..dc1f587a43 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/ironwood_block.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/ironwood_block.png.mcmeta b/src/main/resources/assets/twilightforest/textures/block/ironwood_block.png.mcmeta new file mode 100644 index 0000000000..917f1a6662 --- /dev/null +++ b/src/main/resources/assets/twilightforest/textures/block/ironwood_block.png.mcmeta @@ -0,0 +1,6 @@ +{ + "ctm": { + "ctm_version": 1, + "proxy": "twilightforest:block/ironwood_frame" + } +} diff --git a/src/main/resources/assets/twilightforest/textures/block/ironwood_frame.png b/src/main/resources/assets/twilightforest/textures/block/ironwood_frame.png new file mode 100644 index 0000000000..4ca84ea329 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/ironwood_frame.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/ironwood_frame.png.mcmeta b/src/main/resources/assets/twilightforest/textures/block/ironwood_frame.png.mcmeta new file mode 100644 index 0000000000..f3adafafcf --- /dev/null +++ b/src/main/resources/assets/twilightforest/textures/block/ironwood_frame.png.mcmeta @@ -0,0 +1,8 @@ +{ + "ctm": { + "ctm_version": 1, + "type": "ctm", + "layer": "CUTOUT", + "textures": [ "twilightforest:block/ironwood_frame_ctm" ] + } +} diff --git a/src/main/resources/assets/twilightforest/textures/block/ironwood_frame_ctm.png b/src/main/resources/assets/twilightforest/textures/block/ironwood_frame_ctm.png new file mode 100644 index 0000000000..302ac93aff Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/ironwood_frame_ctm.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/ironwood_pattern.png b/src/main/resources/assets/twilightforest/textures/block/ironwood_pattern.png new file mode 100644 index 0000000000..11106c0361 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/ironwood_pattern.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/ironwood_pattern.png.mcmeta b/src/main/resources/assets/twilightforest/textures/block/ironwood_pattern.png.mcmeta new file mode 100755 index 0000000000..87f230c7e2 --- /dev/null +++ b/src/main/resources/assets/twilightforest/textures/block/ironwood_pattern.png.mcmeta @@ -0,0 +1,9 @@ +{ + "ctm":{ + "ctm_version": 1, + "type":"pattern", + "extra":{ + "size":3 + } + } +} diff --git a/src/main/resources/assets/twilightforest/textures/block/jar_bottom.png b/src/main/resources/assets/twilightforest/textures/block/jar_bottom.png new file mode 100644 index 0000000000..9431715533 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/jar_bottom.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/jar_side.png b/src/main/resources/assets/twilightforest/textures/block/jar_side.png new file mode 100644 index 0000000000..888f65b358 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/jar_side.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/jar_top.png b/src/main/resources/assets/twilightforest/textures/block/jar_top.png new file mode 100644 index 0000000000..75abad0af8 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/jar_top.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/knightmetal_block.png b/src/main/resources/assets/twilightforest/textures/block/knightmetal_block.png new file mode 100644 index 0000000000..2bc3ebf480 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/knightmetal_block.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/ladder_iron.png b/src/main/resources/assets/twilightforest/textures/block/ladder_iron.png new file mode 100644 index 0000000000..8a24130d07 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/ladder_iron.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/liveroot_block.png b/src/main/resources/assets/twilightforest/textures/block/liveroot_block.png new file mode 100644 index 0000000000..d076083380 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/liveroot_block.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/mangrove_log.png b/src/main/resources/assets/twilightforest/textures/block/mangrove_log.png new file mode 100644 index 0000000000..c23f964e50 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/mangrove_log.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/mangrove_log_top.png b/src/main/resources/assets/twilightforest/textures/block/mangrove_log_top.png new file mode 100644 index 0000000000..0703e6e837 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/mangrove_log_top.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/mangrove_root.png b/src/main/resources/assets/twilightforest/textures/block/mangrove_root.png new file mode 100644 index 0000000000..a4a8154d6f Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/mangrove_root.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/mangrove_sapling.png b/src/main/resources/assets/twilightforest/textures/block/mangrove_sapling.png new file mode 100644 index 0000000000..dc567b6b1b Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/mangrove_sapling.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/mayapple.png b/src/main/resources/assets/twilightforest/textures/block/mayapple.png new file mode 100644 index 0000000000..e3e8384f30 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/mayapple.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/mayapple_side.png b/src/main/resources/assets/twilightforest/textures/block/mayapple_side.png new file mode 100644 index 0000000000..8750f040cc Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/mayapple_side.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/mazestone.png b/src/main/resources/assets/twilightforest/textures/block/mazestone.png new file mode 100644 index 0000000000..a0130f190f Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/mazestone.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/mazestone_border.png b/src/main/resources/assets/twilightforest/textures/block/mazestone_border.png new file mode 100644 index 0000000000..f3f251c973 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/mazestone_border.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/mazestone_brick.png b/src/main/resources/assets/twilightforest/textures/block/mazestone_brick.png new file mode 100644 index 0000000000..5b11d565fa Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/mazestone_brick.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/mazestone_large_brick.png b/src/main/resources/assets/twilightforest/textures/block/mazestone_large_brick.png new file mode 100644 index 0000000000..e8c86717bc Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/mazestone_large_brick.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/mazestone_mosaic.png b/src/main/resources/assets/twilightforest/textures/block/mazestone_mosaic.png new file mode 100644 index 0000000000..8ba9620a9f Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/mazestone_mosaic.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/mining_leaves.png b/src/main/resources/assets/twilightforest/textures/block/mining_leaves.png new file mode 100644 index 0000000000..08a3749256 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/mining_leaves.png differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/sort_leaves.png.mcmeta b/src/main/resources/assets/twilightforest/textures/block/mining_leaves.png.mcmeta similarity index 100% rename from src/main/resources/assets/twilightforest/textures/blocks/sort_leaves.png.mcmeta rename to src/main/resources/assets/twilightforest/textures/block/mining_leaves.png.mcmeta diff --git a/src/main/resources/assets/twilightforest/textures/block/mining_log.png b/src/main/resources/assets/twilightforest/textures/block/mining_log.png new file mode 100644 index 0000000000..2a706535fe Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/mining_log.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/mining_log_core.png b/src/main/resources/assets/twilightforest/textures/block/mining_log_core.png new file mode 100644 index 0000000000..85fd4897af Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/mining_log_core.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/mining_log_core_on.png b/src/main/resources/assets/twilightforest/textures/block/mining_log_core_on.png new file mode 100644 index 0000000000..0d8be95411 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/mining_log_core_on.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/mining_log_top.png b/src/main/resources/assets/twilightforest/textures/block/mining_log_top.png new file mode 100644 index 0000000000..e3f207a5b7 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/mining_log_top.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/mining_sapling.png b/src/main/resources/assets/twilightforest/textures/block/mining_sapling.png new file mode 100644 index 0000000000..44ea6e696e Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/mining_sapling.png differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/TFMoonworm.png b/src/main/resources/assets/twilightforest/textures/block/moonworm.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/blocks/TFMoonworm.png rename to src/main/resources/assets/twilightforest/textures/block/moonworm.png diff --git a/src/main/resources/assets/twilightforest/textures/block/moss_overhang.png b/src/main/resources/assets/twilightforest/textures/block/moss_overhang.png new file mode 100644 index 0000000000..aa4d243f96 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/moss_overhang.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/mosspatch.png b/src/main/resources/assets/twilightforest/textures/block/mosspatch.png new file mode 100644 index 0000000000..d08c144821 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/mosspatch.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/mossy_castle_brick.png b/src/main/resources/assets/twilightforest/textures/block/mossy_castle_brick.png new file mode 100644 index 0000000000..bf1b218b63 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/mossy_castle_brick.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/mossy_castle_brick_stairs.png b/src/main/resources/assets/twilightforest/textures/block/mossy_castle_brick_stairs.png new file mode 100644 index 0000000000..cfea1dbd3a Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/mossy_castle_brick_stairs.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/mossy_mazestone.png b/src/main/resources/assets/twilightforest/textures/block/mossy_mazestone.png new file mode 100644 index 0000000000..05e8292f8f Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/mossy_mazestone.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/mossy_towerwood.png b/src/main/resources/assets/twilightforest/textures/block/mossy_towerwood.png new file mode 100644 index 0000000000..d49304176e Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/mossy_towerwood.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/mossy_underbrick.png b/src/main/resources/assets/twilightforest/textures/block/mossy_underbrick.png new file mode 100644 index 0000000000..b3a4fcbc33 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/mossy_underbrick.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/mushgloom.png b/src/main/resources/assets/twilightforest/textures/block/mushgloom.png new file mode 100644 index 0000000000..d4d1b180ea Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/mushgloom.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/mushgloom_head.png b/src/main/resources/assets/twilightforest/textures/block/mushgloom_head.png new file mode 100644 index 0000000000..9ab8807f26 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/mushgloom_head.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/nagastone_bare.png b/src/main/resources/assets/twilightforest/textures/block/nagastone_bare.png new file mode 100644 index 0000000000..2daa630a3c Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/nagastone_bare.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/nagastone_bare_mossy.png b/src/main/resources/assets/twilightforest/textures/block/nagastone_bare_mossy.png new file mode 100644 index 0000000000..82620527a6 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/nagastone_bare_mossy.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/nagastone_bare_weathered.png b/src/main/resources/assets/twilightforest/textures/block/nagastone_bare_weathered.png new file mode 100644 index 0000000000..b15d657495 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/nagastone_bare_weathered.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/nagastone_bottom_long.png b/src/main/resources/assets/twilightforest/textures/block/nagastone_bottom_long.png new file mode 100644 index 0000000000..227cbb3d69 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/nagastone_bottom_long.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/nagastone_bottom_tip.png b/src/main/resources/assets/twilightforest/textures/block/nagastone_bottom_tip.png new file mode 100644 index 0000000000..ff37ba2a9b Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/nagastone_bottom_tip.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/nagastone_cross_section.png b/src/main/resources/assets/twilightforest/textures/block/nagastone_cross_section.png new file mode 100644 index 0000000000..5e342a542f Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/nagastone_cross_section.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/nagastone_face_front.png b/src/main/resources/assets/twilightforest/textures/block/nagastone_face_front.png new file mode 100644 index 0000000000..861850ef8b Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/nagastone_face_front.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/nagastone_face_left.png b/src/main/resources/assets/twilightforest/textures/block/nagastone_face_left.png new file mode 100644 index 0000000000..dbaef4e806 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/nagastone_face_left.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/nagastone_face_right.png b/src/main/resources/assets/twilightforest/textures/block/nagastone_face_right.png new file mode 100644 index 0000000000..dcdb8c05ca Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/nagastone_face_right.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/nagastone_left_down.png b/src/main/resources/assets/twilightforest/textures/block/nagastone_left_down.png new file mode 100644 index 0000000000..4605bead8d Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/nagastone_left_down.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/nagastone_left_up.png b/src/main/resources/assets/twilightforest/textures/block/nagastone_left_up.png new file mode 100644 index 0000000000..4a1e514d62 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/nagastone_left_up.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/nagastone_long_side.png b/src/main/resources/assets/twilightforest/textures/block/nagastone_long_side.png new file mode 100644 index 0000000000..d204abeaa8 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/nagastone_long_side.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/nagastone_long_vertical.png b/src/main/resources/assets/twilightforest/textures/block/nagastone_long_vertical.png new file mode 100644 index 0000000000..4eef58df32 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/nagastone_long_vertical.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/nagastone_pillar_end.png b/src/main/resources/assets/twilightforest/textures/block/nagastone_pillar_end.png new file mode 100644 index 0000000000..14ca7e7a00 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/nagastone_pillar_end.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/nagastone_pillar_end_mossy.png b/src/main/resources/assets/twilightforest/textures/block/nagastone_pillar_end_mossy.png new file mode 100644 index 0000000000..16290aa1b9 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/nagastone_pillar_end_mossy.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/nagastone_pillar_end_weathered.png b/src/main/resources/assets/twilightforest/textures/block/nagastone_pillar_end_weathered.png new file mode 100644 index 0000000000..d09e04717d Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/nagastone_pillar_end_weathered.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/nagastone_pillar_side.png b/src/main/resources/assets/twilightforest/textures/block/nagastone_pillar_side.png new file mode 100644 index 0000000000..1d1e39897a Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/nagastone_pillar_side.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/nagastone_pillar_side_alt.png b/src/main/resources/assets/twilightforest/textures/block/nagastone_pillar_side_alt.png new file mode 100644 index 0000000000..08d7121086 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/nagastone_pillar_side_alt.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/nagastone_pillar_side_mossy.png b/src/main/resources/assets/twilightforest/textures/block/nagastone_pillar_side_mossy.png new file mode 100644 index 0000000000..47f78b2acc Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/nagastone_pillar_side_mossy.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/nagastone_pillar_side_mossy_alt.png b/src/main/resources/assets/twilightforest/textures/block/nagastone_pillar_side_mossy_alt.png new file mode 100644 index 0000000000..9e1f0c0641 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/nagastone_pillar_side_mossy_alt.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/nagastone_pillar_side_weathered.png b/src/main/resources/assets/twilightforest/textures/block/nagastone_pillar_side_weathered.png new file mode 100644 index 0000000000..b7169e977c Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/nagastone_pillar_side_weathered.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/nagastone_pillar_side_weathered_alt.png b/src/main/resources/assets/twilightforest/textures/block/nagastone_pillar_side_weathered_alt.png new file mode 100644 index 0000000000..58d48ab001 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/nagastone_pillar_side_weathered_alt.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/nagastone_right_down.png b/src/main/resources/assets/twilightforest/textures/block/nagastone_right_down.png new file mode 100644 index 0000000000..9aef8bd247 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/nagastone_right_down.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/nagastone_right_up.png b/src/main/resources/assets/twilightforest/textures/block/nagastone_right_up.png new file mode 100644 index 0000000000..43a5733afe Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/nagastone_right_up.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/nagastone_tip_down.png b/src/main/resources/assets/twilightforest/textures/block/nagastone_tip_down.png new file mode 100644 index 0000000000..a1f6717a86 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/nagastone_tip_down.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/nagastone_tip_left.png b/src/main/resources/assets/twilightforest/textures/block/nagastone_tip_left.png new file mode 100644 index 0000000000..f439bc38ca Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/nagastone_tip_left.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/nagastone_tip_long.png b/src/main/resources/assets/twilightforest/textures/block/nagastone_tip_long.png new file mode 100644 index 0000000000..76e8c8c68a Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/nagastone_tip_long.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/nagastone_tip_right.png b/src/main/resources/assets/twilightforest/textures/block/nagastone_tip_right.png new file mode 100644 index 0000000000..012e779dc5 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/nagastone_tip_right.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/nagastone_tip_up.png b/src/main/resources/assets/twilightforest/textures/block/nagastone_tip_up.png new file mode 100644 index 0000000000..cfbe2f5ce4 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/nagastone_tip_up.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/nagastone_top_tip.png b/src/main/resources/assets/twilightforest/textures/block/nagastone_top_tip.png new file mode 100644 index 0000000000..f2ebe837a5 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/nagastone_top_tip.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/nagastone_turn_top.png b/src/main/resources/assets/twilightforest/textures/block/nagastone_turn_top.png new file mode 100644 index 0000000000..c8c60ea83d Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/nagastone_turn_top.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/orange_force_field.png b/src/main/resources/assets/twilightforest/textures/block/orange_force_field.png new file mode 100644 index 0000000000..1e2605a915 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/orange_force_field.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/patch/clover.png b/src/main/resources/assets/twilightforest/textures/block/patch/clover.png new file mode 100644 index 0000000000..006149e645 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/patch/clover.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/patch/moss.png b/src/main/resources/assets/twilightforest/textures/block/patch/moss.png new file mode 100644 index 0000000000..86b75d70a2 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/patch/moss.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/pedestal/hydra.png b/src/main/resources/assets/twilightforest/textures/block/pedestal/hydra.png new file mode 100644 index 0000000000..15b071dbc7 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/pedestal/hydra.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/pedestal/hydra_glow.png b/src/main/resources/assets/twilightforest/textures/block/pedestal/hydra_glow.png new file mode 100644 index 0000000000..b517e2a5c3 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/pedestal/hydra_glow.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/pedestal/hydra_glow.png.mcmeta b/src/main/resources/assets/twilightforest/textures/block/pedestal/hydra_glow.png.mcmeta new file mode 100644 index 0000000000..432a384535 --- /dev/null +++ b/src/main/resources/assets/twilightforest/textures/block/pedestal/hydra_glow.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "frametime": 4, + "interpolate": true + } +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/textures/block/pedestal/hydra_latent.png b/src/main/resources/assets/twilightforest/textures/block/pedestal/hydra_latent.png new file mode 100644 index 0000000000..e70ba823c9 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/pedestal/hydra_latent.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/pedestal/lich.png b/src/main/resources/assets/twilightforest/textures/block/pedestal/lich.png new file mode 100644 index 0000000000..f6a8dd3ef7 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/pedestal/lich.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/pedestal/lich_glow.png b/src/main/resources/assets/twilightforest/textures/block/pedestal/lich_glow.png new file mode 100644 index 0000000000..a43e1fb0f7 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/pedestal/lich_glow.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/pedestal/lich_glow.png.mcmeta b/src/main/resources/assets/twilightforest/textures/block/pedestal/lich_glow.png.mcmeta new file mode 100644 index 0000000000..432a384535 --- /dev/null +++ b/src/main/resources/assets/twilightforest/textures/block/pedestal/lich_glow.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "frametime": 4, + "interpolate": true + } +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/textures/block/pedestal/lich_latent.png b/src/main/resources/assets/twilightforest/textures/block/pedestal/lich_latent.png new file mode 100644 index 0000000000..7ba03ae713 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/pedestal/lich_latent.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/pedestal/naga.png b/src/main/resources/assets/twilightforest/textures/block/pedestal/naga.png new file mode 100644 index 0000000000..4af7431673 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/pedestal/naga.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/pedestal/naga_glow.png b/src/main/resources/assets/twilightforest/textures/block/pedestal/naga_glow.png new file mode 100644 index 0000000000..840fd93764 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/pedestal/naga_glow.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/pedestal/naga_glow.png.mcmeta b/src/main/resources/assets/twilightforest/textures/block/pedestal/naga_glow.png.mcmeta new file mode 100644 index 0000000000..432a384535 --- /dev/null +++ b/src/main/resources/assets/twilightforest/textures/block/pedestal/naga_glow.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "frametime": 4, + "interpolate": true + } +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/textures/block/pedestal/naga_latent.png b/src/main/resources/assets/twilightforest/textures/block/pedestal/naga_latent.png new file mode 100644 index 0000000000..77f5445b6d Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/pedestal/naga_latent.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/pedestal/snow_queen.png b/src/main/resources/assets/twilightforest/textures/block/pedestal/snow_queen.png new file mode 100644 index 0000000000..40f75b7726 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/pedestal/snow_queen.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/pedestal/snow_queen_glow.png b/src/main/resources/assets/twilightforest/textures/block/pedestal/snow_queen_glow.png new file mode 100644 index 0000000000..7ae2a03d03 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/pedestal/snow_queen_glow.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/pedestal/snow_queen_glow.png.mcmeta b/src/main/resources/assets/twilightforest/textures/block/pedestal/snow_queen_glow.png.mcmeta new file mode 100644 index 0000000000..432a384535 --- /dev/null +++ b/src/main/resources/assets/twilightforest/textures/block/pedestal/snow_queen_glow.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "frametime": 4, + "interpolate": true + } +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/textures/block/pedestal/snow_queen_latent.png b/src/main/resources/assets/twilightforest/textures/block/pedestal/snow_queen_latent.png new file mode 100644 index 0000000000..6eeb678e7c Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/pedestal/snow_queen_latent.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/pedestal/top.png b/src/main/resources/assets/twilightforest/textures/block/pedestal/top.png new file mode 100644 index 0000000000..7b2c947fbc Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/pedestal/top.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/pedestal/top_glow.png b/src/main/resources/assets/twilightforest/textures/block/pedestal/top_glow.png new file mode 100644 index 0000000000..d4ec61d0be Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/pedestal/top_glow.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/pedestal/ur-ghast.png b/src/main/resources/assets/twilightforest/textures/block/pedestal/ur-ghast.png new file mode 100644 index 0000000000..7614e62ad6 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/pedestal/ur-ghast.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/pedestal/ur-ghast_glow.png b/src/main/resources/assets/twilightforest/textures/block/pedestal/ur-ghast_glow.png new file mode 100644 index 0000000000..3edc331d08 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/pedestal/ur-ghast_glow.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/pedestal/ur-ghast_glow.png.mcmeta b/src/main/resources/assets/twilightforest/textures/block/pedestal/ur-ghast_glow.png.mcmeta new file mode 100644 index 0000000000..432a384535 --- /dev/null +++ b/src/main/resources/assets/twilightforest/textures/block/pedestal/ur-ghast_glow.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "frametime": 4, + "interpolate": true + } +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/textures/block/pedestal/ur-ghast_latent.png b/src/main/resources/assets/twilightforest/textures/block/pedestal/ur-ghast_latent.png new file mode 100644 index 0000000000..fd8164d6f6 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/pedestal/ur-ghast_latent.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/pink_force_field.png b/src/main/resources/assets/twilightforest/textures/block/pink_force_field.png new file mode 100644 index 0000000000..6c00e0dbc7 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/pink_force_field.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/portal_barrier.png b/src/main/resources/assets/twilightforest/textures/block/portal_barrier.png new file mode 100644 index 0000000000..eecbb53686 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/portal_barrier.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/portal_barrier.png.mcmeta b/src/main/resources/assets/twilightforest/textures/block/portal_barrier.png.mcmeta new file mode 100644 index 0000000000..5cc283ac57 --- /dev/null +++ b/src/main/resources/assets/twilightforest/textures/block/portal_barrier.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "frametime": 2, + "interpolate": true + } +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/textures/block/portal_gradient.png b/src/main/resources/assets/twilightforest/textures/block/portal_gradient.png new file mode 100644 index 0000000000..5465c114dc Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/portal_gradient.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/potted_fiddlehead.png b/src/main/resources/assets/twilightforest/textures/block/potted_fiddlehead.png new file mode 100644 index 0000000000..5d640d8f5e Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/potted_fiddlehead.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/potted_mushgloom.png b/src/main/resources/assets/twilightforest/textures/block/potted_mushgloom.png new file mode 100644 index 0000000000..41f0aac5ce Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/potted_mushgloom.png differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/sapling_rainboak.png b/src/main/resources/assets/twilightforest/textures/block/rainbow_oak_sapling.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/blocks/sapling_rainboak.png rename to src/main/resources/assets/twilightforest/textures/block/rainbow_oak_sapling.png diff --git a/src/main/resources/assets/twilightforest/textures/block/root.png b/src/main/resources/assets/twilightforest/textures/block/root.png new file mode 100644 index 0000000000..f9403a448f Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/root.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/root_strand.png b/src/main/resources/assets/twilightforest/textures/block/root_strand.png new file mode 100644 index 0000000000..2da8dbe5c8 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/root_strand.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/shield_inside.png b/src/main/resources/assets/twilightforest/textures/block/shield_inside.png new file mode 100644 index 0000000000..6e094773b8 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/shield_inside.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/shield_outside.png b/src/main/resources/assets/twilightforest/textures/block/shield_outside.png new file mode 100644 index 0000000000..0df790bd3e Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/shield_outside.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/slider_h.png b/src/main/resources/assets/twilightforest/textures/block/slider_h.png new file mode 100644 index 0000000000..3720be8de2 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/slider_h.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/slider_h_90.png b/src/main/resources/assets/twilightforest/textures/block/slider_h_90.png new file mode 100644 index 0000000000..0e2ea5a075 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/slider_h_90.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/slider_top.png b/src/main/resources/assets/twilightforest/textures/block/slider_top.png new file mode 100644 index 0000000000..feee157204 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/slider_top.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/slider_v.png b/src/main/resources/assets/twilightforest/textures/block/slider_v.png new file mode 100644 index 0000000000..9b9ef8d808 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/slider_v.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/snow_overhang.png b/src/main/resources/assets/twilightforest/textures/block/snow_overhang.png new file mode 100644 index 0000000000..108e8443b4 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/snow_overhang.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/sorting_leaves.png b/src/main/resources/assets/twilightforest/textures/block/sorting_leaves.png new file mode 100644 index 0000000000..17a4a9770c Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/sorting_leaves.png differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/time_leaves.png.mcmeta b/src/main/resources/assets/twilightforest/textures/block/sorting_leaves.png.mcmeta similarity index 100% rename from src/main/resources/assets/twilightforest/textures/blocks/time_leaves.png.mcmeta rename to src/main/resources/assets/twilightforest/textures/block/sorting_leaves.png.mcmeta diff --git a/src/main/resources/assets/twilightforest/textures/block/sorting_log.png b/src/main/resources/assets/twilightforest/textures/block/sorting_log.png new file mode 100644 index 0000000000..c2c1a75609 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/sorting_log.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/sorting_log_core.png b/src/main/resources/assets/twilightforest/textures/block/sorting_log_core.png new file mode 100644 index 0000000000..7d982f0115 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/sorting_log_core.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/sorting_log_core_on.png b/src/main/resources/assets/twilightforest/textures/block/sorting_log_core_on.png new file mode 100644 index 0000000000..b557bb40d7 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/sorting_log_core_on.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/sorting_log_top.png b/src/main/resources/assets/twilightforest/textures/block/sorting_log_top.png new file mode 100644 index 0000000000..4dda93a116 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/sorting_log_top.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/sorting_sapling.png b/src/main/resources/assets/twilightforest/textures/block/sorting_sapling.png new file mode 100644 index 0000000000..704465086d Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/sorting_sapling.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/spiral_inner_down.png b/src/main/resources/assets/twilightforest/textures/block/spiral_inner_down.png new file mode 100644 index 0000000000..7e896feb3b Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/spiral_inner_down.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/spiral_inner_left.png b/src/main/resources/assets/twilightforest/textures/block/spiral_inner_left.png new file mode 100644 index 0000000000..4c73697358 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/spiral_inner_left.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/spiral_inner_right.png b/src/main/resources/assets/twilightforest/textures/block/spiral_inner_right.png new file mode 100644 index 0000000000..dcf62c5a85 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/spiral_inner_right.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/spiral_inner_up.png b/src/main/resources/assets/twilightforest/textures/block/spiral_inner_up.png new file mode 100644 index 0000000000..7b77ed528d Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/spiral_inner_up.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/spiral_shadow_x.png b/src/main/resources/assets/twilightforest/textures/block/spiral_shadow_x.png new file mode 100644 index 0000000000..a4197dc7c4 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/spiral_shadow_x.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/spiral_shadow_z.png b/src/main/resources/assets/twilightforest/textures/block/spiral_shadow_z.png new file mode 100644 index 0000000000..23ea4cd5e7 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/spiral_shadow_z.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/steeleaf_block.png b/src/main/resources/assets/twilightforest/textures/block/steeleaf_block.png new file mode 100644 index 0000000000..84cd151143 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/steeleaf_block.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/stone_pillar_end.png b/src/main/resources/assets/twilightforest/textures/block/stone_pillar_end.png new file mode 100644 index 0000000000..aad4c372fe Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/stone_pillar_end.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/stone_pillar_side.png b/src/main/resources/assets/twilightforest/textures/block/stone_pillar_side.png new file mode 100644 index 0000000000..acbc738fc6 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/stone_pillar_side.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/stone_spiral_large.png b/src/main/resources/assets/twilightforest/textures/block/stone_spiral_large.png new file mode 100644 index 0000000000..5a5bad4d19 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/stone_spiral_large.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/stone_tiles.png b/src/main/resources/assets/twilightforest/textures/block/stone_tiles.png new file mode 100644 index 0000000000..8b3d8c92c1 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/stone_tiles.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/stone_tiles_mossy.png b/src/main/resources/assets/twilightforest/textures/block/stone_tiles_mossy.png new file mode 100644 index 0000000000..de483a18bc Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/stone_tiles_mossy.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/stone_tiles_weathered.png b/src/main/resources/assets/twilightforest/textures/block/stone_tiles_weathered.png new file mode 100644 index 0000000000..00d8ff94e0 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/stone_tiles_weathered.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/end.png b/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/end.png new file mode 100644 index 0000000000..006ea45d81 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/end.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/end.png.mcmeta b/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/end.png.mcmeta new file mode 100644 index 0000000000..391d8e6e97 --- /dev/null +++ b/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/end.png.mcmeta @@ -0,0 +1,10 @@ +{ + "ctm": { + "ctm_version": 1, + "type": "ctm", + "textures": [ "twilightforest:block/stone_twist/cap/end_ctm" ], + "extra": { + "connect_inside": true + } + } +} diff --git a/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/end_bottom_x.png b/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/end_bottom_x.png new file mode 100644 index 0000000000..006ea45d81 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/end_bottom_x.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/end_bottom_x.png.mcmeta b/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/end_bottom_x.png.mcmeta new file mode 100644 index 0000000000..b2fcae82f5 --- /dev/null +++ b/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/end_bottom_x.png.mcmeta @@ -0,0 +1,17 @@ +{ + "ctm": { + "ctm_version": 1, + "type": "ctm", + "textures": [ "twilightforest:block/stone_twist/cap/end_ctm" ], + "extra": { + "connect_inside": true, + "connect_to": [{ + "block": "twilightforest:twisted_stone_pillar", + "predicate": [ + { "axis": "x" }, + { "down": false } + ] + }] + } + } +} diff --git a/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/end_bottom_y.png b/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/end_bottom_y.png new file mode 100644 index 0000000000..006ea45d81 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/end_bottom_y.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/end_bottom_y.png.mcmeta b/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/end_bottom_y.png.mcmeta new file mode 100644 index 0000000000..f83c79e542 --- /dev/null +++ b/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/end_bottom_y.png.mcmeta @@ -0,0 +1,17 @@ +{ + "ctm": { + "ctm_version": 1, + "type": "ctm", + "textures": [ "twilightforest:block/stone_twist/cap/end_ctm" ], + "extra": { + "connect_inside": true, + "connect_to": [{ + "block": "twilightforest:twisted_stone_pillar", + "predicate": [ + { "axis": "y" }, + { "down": false } + ] + }] + } + } +} diff --git a/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/end_bottom_z.png b/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/end_bottom_z.png new file mode 100644 index 0000000000..006ea45d81 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/end_bottom_z.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/end_bottom_z.png.mcmeta b/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/end_bottom_z.png.mcmeta new file mode 100644 index 0000000000..d1db210aba --- /dev/null +++ b/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/end_bottom_z.png.mcmeta @@ -0,0 +1,17 @@ +{ + "ctm": { + "ctm_version": 1, + "type": "ctm", + "textures": [ "twilightforest:block/stone_twist/cap/end_ctm" ], + "extra": { + "connect_inside": true, + "connect_to": [{ + "block": "twilightforest:twisted_stone_pillar", + "predicate": [ + { "axis": "z" }, + { "down": false } + ] + }] + } + } +} diff --git a/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/end_ctm.png b/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/end_ctm.png new file mode 100644 index 0000000000..385a52ab37 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/end_ctm.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/end_top_x.png b/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/end_top_x.png new file mode 100644 index 0000000000..006ea45d81 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/end_top_x.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/end_top_x.png.mcmeta b/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/end_top_x.png.mcmeta new file mode 100644 index 0000000000..f78f099c73 --- /dev/null +++ b/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/end_top_x.png.mcmeta @@ -0,0 +1,17 @@ +{ + "ctm": { + "ctm_version": 1, + "type": "ctm", + "textures": [ "twilightforest:block/stone_twist/cap/end_ctm" ], + "extra": { + "connect_inside": true, + "connect_to": [{ + "block": "twilightforest:twisted_stone_pillar", + "predicate": [ + { "axis": "x" }, + { "up": false } + ] + }] + } + } +} diff --git a/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/end_top_y.png b/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/end_top_y.png new file mode 100644 index 0000000000..006ea45d81 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/end_top_y.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/end_top_y.png.mcmeta b/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/end_top_y.png.mcmeta new file mode 100644 index 0000000000..4f80e439c2 --- /dev/null +++ b/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/end_top_y.png.mcmeta @@ -0,0 +1,17 @@ +{ + "ctm": { + "ctm_version": 1, + "type": "ctm", + "textures": [ "twilightforest:block/stone_twist/cap/end_ctm" ], + "extra": { + "connect_inside": true, + "connect_to": [{ + "block": "twilightforest:twisted_stone_pillar", + "predicate": [ + { "axis": "y" }, + { "up": false } + ] + }] + } + } +} diff --git a/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/end_top_z.png b/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/end_top_z.png new file mode 100644 index 0000000000..006ea45d81 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/end_top_z.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/end_top_z.png.mcmeta b/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/end_top_z.png.mcmeta new file mode 100644 index 0000000000..94af1a9816 --- /dev/null +++ b/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/end_top_z.png.mcmeta @@ -0,0 +1,17 @@ +{ + "ctm": { + "ctm_version": 1, + "type": "ctm", + "textures": [ "twilightforest:block/stone_twist/cap/end_ctm" ], + "extra": { + "connect_inside": true, + "connect_to": [{ + "block": "twilightforest:twisted_stone_pillar", + "predicate": [ + { "axis": "z" }, + { "up": false } + ] + }] + } + } +} diff --git a/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/x.png b/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/x.png new file mode 100644 index 0000000000..346a374559 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/x.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/x.png.mcmeta b/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/x.png.mcmeta new file mode 100644 index 0000000000..a405777030 --- /dev/null +++ b/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/x.png.mcmeta @@ -0,0 +1,10 @@ +{ + "ctm": { + "ctm_version": 1, + "type": "ctm", + "textures": [ "twilightforest:block/stone_twist/cap/x_ctm" ], + "extra": { + "connect_inside": true + } + } +} diff --git a/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/x_ctm.png b/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/x_ctm.png new file mode 100644 index 0000000000..e66203035c Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/x_ctm.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/x_x_bottom.png b/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/x_x_bottom.png new file mode 100644 index 0000000000..346a374559 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/x_x_bottom.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/x_x_bottom.png.mcmeta b/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/x_x_bottom.png.mcmeta new file mode 100644 index 0000000000..6044cf1674 --- /dev/null +++ b/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/x_x_bottom.png.mcmeta @@ -0,0 +1,17 @@ +{ + "ctm": { + "ctm_version": 1, + "type": "ctm", + "textures": [ "twilightforest:block/stone_twist/cap/x_ctm" ], + "extra": { + "connect_inside": true, + "connect_to": [{ + "block": "twilightforest:twisted_stone_pillar", + "predicate": [ + { "axis": "x" }, + { "up": false } + ] + }] + } + } +} diff --git a/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/x_x_top.png b/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/x_x_top.png new file mode 100644 index 0000000000..346a374559 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/x_x_top.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/x_x_top.png.mcmeta b/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/x_x_top.png.mcmeta new file mode 100644 index 0000000000..6044cf1674 --- /dev/null +++ b/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/x_x_top.png.mcmeta @@ -0,0 +1,17 @@ +{ + "ctm": { + "ctm_version": 1, + "type": "ctm", + "textures": [ "twilightforest:block/stone_twist/cap/x_ctm" ], + "extra": { + "connect_inside": true, + "connect_to": [{ + "block": "twilightforest:twisted_stone_pillar", + "predicate": [ + { "axis": "x" }, + { "up": false } + ] + }] + } + } +} diff --git a/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/x_z_bottom.png b/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/x_z_bottom.png new file mode 100644 index 0000000000..346a374559 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/x_z_bottom.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/x_z_bottom.png.mcmeta b/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/x_z_bottom.png.mcmeta new file mode 100644 index 0000000000..f134cb5809 --- /dev/null +++ b/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/x_z_bottom.png.mcmeta @@ -0,0 +1,17 @@ +{ + "ctm": { + "ctm_version": 1, + "type": "ctm", + "textures": [ "twilightforest:block/stone_twist/cap/x_ctm" ], + "extra": { + "connect_inside": true, + "connect_to": [{ + "block": "twilightforest:twisted_stone_pillar", + "predicate": [ + { "axis": "z" }, + { "down": false } + ] + }] + } + } +} diff --git a/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/x_z_top.png b/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/x_z_top.png new file mode 100644 index 0000000000..346a374559 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/x_z_top.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/x_z_top.png.mcmeta b/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/x_z_top.png.mcmeta new file mode 100644 index 0000000000..a809ed3289 --- /dev/null +++ b/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/x_z_top.png.mcmeta @@ -0,0 +1,17 @@ +{ + "ctm": { + "ctm_version": 1, + "type": "ctm", + "textures": [ "twilightforest:block/stone_twist/cap/x_ctm" ], + "extra": { + "connect_inside": true, + "connect_to": [{ + "block": "twilightforest:twisted_stone_pillar", + "predicate": [ + { "axis": "z" }, + { "up": false } + ] + }] + } + } +} diff --git a/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/y.png b/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/y.png new file mode 100644 index 0000000000..e5a10fda49 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/y.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/y.png.mcmeta b/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/y.png.mcmeta new file mode 100644 index 0000000000..3a59a721b0 --- /dev/null +++ b/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/y.png.mcmeta @@ -0,0 +1,10 @@ +{ + "ctm": { + "ctm_version": 1, + "type": "ctm", + "textures": [ "twilightforest:block/stone_twist/cap/y_ctm" ], + "extra": { + "connect_inside": true + } + } +} diff --git a/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/y_ctm.png b/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/y_ctm.png new file mode 100644 index 0000000000..4258fdb0a3 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/y_ctm.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/y_y_bottom.png b/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/y_y_bottom.png new file mode 100644 index 0000000000..e5a10fda49 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/y_y_bottom.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/y_y_bottom.png.mcmeta b/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/y_y_bottom.png.mcmeta new file mode 100644 index 0000000000..5b45d45914 --- /dev/null +++ b/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/y_y_bottom.png.mcmeta @@ -0,0 +1,17 @@ +{ + "ctm": { + "ctm_version": 1, + "type": "ctm", + "textures": [ "twilightforest:block/stone_twist/cap/y_ctm" ], + "extra": { + "connect_inside": true, + "connect_to": [{ + "block": "twilightforest:twisted_stone_pillar", + "predicate": [ + { "axis": "y" }, + { "down": false } + ] + }] + } + } +} diff --git a/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/y_y_top.png b/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/y_y_top.png new file mode 100644 index 0000000000..e5a10fda49 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/y_y_top.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/y_y_top.png.mcmeta b/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/y_y_top.png.mcmeta new file mode 100644 index 0000000000..43916bdb40 --- /dev/null +++ b/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/y_y_top.png.mcmeta @@ -0,0 +1,17 @@ +{ + "ctm": { + "ctm_version": 1, + "type": "ctm", + "textures": [ "twilightforest:block/stone_twist/cap/y_ctm" ], + "extra": { + "connect_inside": true, + "connect_to": [{ + "block": "twilightforest:twisted_stone_pillar", + "predicate": [ + { "axis": "y" }, + { "up": false } + ] + }] + } + } +} diff --git a/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/y_z_bottom.png b/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/y_z_bottom.png new file mode 100644 index 0000000000..e5a10fda49 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/y_z_bottom.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/y_z_bottom.png.mcmeta b/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/y_z_bottom.png.mcmeta new file mode 100644 index 0000000000..c72524c3f7 --- /dev/null +++ b/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/y_z_bottom.png.mcmeta @@ -0,0 +1,17 @@ +{ + "ctm": { + "ctm_version": 1, + "type": "ctm", + "textures": [ "twilightforest:block/stone_twist/cap/y_ctm" ], + "extra": { + "connect_inside": true, + "connect_to": [{ + "block": "twilightforest:twisted_stone_pillar", + "predicate": [ + { "axis": "z" }, + { "down": false } + ] + }] + } + } +} diff --git a/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/y_z_top.png b/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/y_z_top.png new file mode 100644 index 0000000000..e5a10fda49 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/y_z_top.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/y_z_top.png.mcmeta b/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/y_z_top.png.mcmeta new file mode 100644 index 0000000000..e6bee35315 --- /dev/null +++ b/src/main/resources/assets/twilightforest/textures/block/stone_twist/cap/y_z_top.png.mcmeta @@ -0,0 +1,17 @@ +{ + "ctm": { + "ctm_version": 1, + "type": "ctm", + "textures": [ "twilightforest:block/stone_twist/cap/y_ctm" ], + "extra": { + "connect_inside": true, + "connect_to": [{ + "block": "twilightforest:twisted_stone_pillar", + "predicate": [ + { "axis": "z" }, + { "up": false } + ] + }] + } + } +} diff --git a/src/main/resources/assets/twilightforest/textures/block/stone_twist/pillar_side.png b/src/main/resources/assets/twilightforest/textures/block/stone_twist/pillar_side.png new file mode 100644 index 0000000000..6263484600 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/stone_twist/pillar_side.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/stone_twist/twist_blank.png b/src/main/resources/assets/twilightforest/textures/block/stone_twist/twist_blank.png new file mode 100644 index 0000000000..aeaf6d4b67 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/stone_twist/twist_blank.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/stone_twist/twist_blank.png.mcmeta b/src/main/resources/assets/twilightforest/textures/block/stone_twist/twist_blank.png.mcmeta new file mode 100644 index 0000000000..d6300d5368 --- /dev/null +++ b/src/main/resources/assets/twilightforest/textures/block/stone_twist/twist_blank.png.mcmeta @@ -0,0 +1,12 @@ +{ + "ctm": { + "ctm_version": 1, + "type": "ctm", + "layer": "CUTOUT", + "textures": [ "twilightforest:block/stone_twist/twist_crown" ], + "extra": { + "connect_inside": true, + "ignore_states": true + } + } +} diff --git a/src/main/resources/assets/twilightforest/textures/block/stone_twist/twist_crown.png b/src/main/resources/assets/twilightforest/textures/block/stone_twist/twist_crown.png new file mode 100644 index 0000000000..bcd64b49c0 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/stone_twist/twist_crown.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/stone_twist/twist_end.png b/src/main/resources/assets/twilightforest/textures/block/stone_twist/twist_end.png new file mode 100644 index 0000000000..9ac46abb19 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/stone_twist/twist_end.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/stone_twist/twist_side.png b/src/main/resources/assets/twilightforest/textures/block/stone_twist/twist_side.png new file mode 100644 index 0000000000..29d50c185f Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/stone_twist/twist_side.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/stone_twist/twist_small.png b/src/main/resources/assets/twilightforest/textures/block/stone_twist/twist_small.png new file mode 100644 index 0000000000..c201c1e5d8 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/stone_twist/twist_small.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/stone_twist/twist_x.png b/src/main/resources/assets/twilightforest/textures/block/stone_twist/twist_x.png new file mode 100644 index 0000000000..a460ae80d4 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/stone_twist/twist_x.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/stone_twist/twist_x.png.mcmeta b/src/main/resources/assets/twilightforest/textures/block/stone_twist/twist_x.png.mcmeta new file mode 100644 index 0000000000..1a0cba2a92 --- /dev/null +++ b/src/main/resources/assets/twilightforest/textures/block/stone_twist/twist_x.png.mcmeta @@ -0,0 +1,12 @@ +{ + "ctm": { + "ctm_version": 1, + "type": "ctm", + "layer": "CUTOUT", + "textures": [ "twilightforest:block/stone_twist/twist_x_ctm" ], + "extra": { + "connect_inside": true, + "ignore_states": true + } + } +} diff --git a/src/main/resources/assets/twilightforest/textures/block/stone_twist/twist_x_ctm.png b/src/main/resources/assets/twilightforest/textures/block/stone_twist/twist_x_ctm.png new file mode 100644 index 0000000000..be45cbe475 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/stone_twist/twist_x_ctm.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/stone_twist/twist_y.png b/src/main/resources/assets/twilightforest/textures/block/stone_twist/twist_y.png new file mode 100644 index 0000000000..3dcbe806e8 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/stone_twist/twist_y.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/stone_twist/twist_y.png.mcmeta b/src/main/resources/assets/twilightforest/textures/block/stone_twist/twist_y.png.mcmeta new file mode 100644 index 0000000000..856f5d6db3 --- /dev/null +++ b/src/main/resources/assets/twilightforest/textures/block/stone_twist/twist_y.png.mcmeta @@ -0,0 +1,12 @@ +{ + "ctm": { + "ctm_version": 1, + "type": "ctm", + "layer": "CUTOUT", + "textures": [ "twilightforest:block/stone_twist/twist_y_ctm" ], + "extra": { + "connect_inside": true, + "ignore_states": true + } + } +} diff --git a/src/main/resources/assets/twilightforest/textures/block/stone_twist/twist_y_ctm.png b/src/main/resources/assets/twilightforest/textures/block/stone_twist/twist_y_ctm.png new file mode 100644 index 0000000000..7d25e1fea0 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/stone_twist/twist_y_ctm.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/stripped_canopy_log.png b/src/main/resources/assets/twilightforest/textures/block/stripped_canopy_log.png new file mode 100644 index 0000000000..b9c21e3a0a Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/stripped_canopy_log.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/stripped_canopy_log_top.png b/src/main/resources/assets/twilightforest/textures/block/stripped_canopy_log_top.png new file mode 100644 index 0000000000..f262a31707 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/stripped_canopy_log_top.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/stripped_dark_log.png b/src/main/resources/assets/twilightforest/textures/block/stripped_dark_log.png new file mode 100644 index 0000000000..10670be2c1 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/stripped_dark_log.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/stripped_dark_log_top.png b/src/main/resources/assets/twilightforest/textures/block/stripped_dark_log_top.png new file mode 100644 index 0000000000..503e9f593a Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/stripped_dark_log_top.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/stripped_mangrove_log.png b/src/main/resources/assets/twilightforest/textures/block/stripped_mangrove_log.png new file mode 100644 index 0000000000..11d88047c5 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/stripped_mangrove_log.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/stripped_mangrove_log_top.png b/src/main/resources/assets/twilightforest/textures/block/stripped_mangrove_log_top.png new file mode 100644 index 0000000000..18ccd3c459 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/stripped_mangrove_log_top.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/stripped_mining_log.png b/src/main/resources/assets/twilightforest/textures/block/stripped_mining_log.png new file mode 100644 index 0000000000..bcbd3cf59b Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/stripped_mining_log.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/stripped_mining_log_top.png b/src/main/resources/assets/twilightforest/textures/block/stripped_mining_log_top.png new file mode 100644 index 0000000000..0108252265 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/stripped_mining_log_top.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/stripped_sorting_log.png b/src/main/resources/assets/twilightforest/textures/block/stripped_sorting_log.png new file mode 100644 index 0000000000..1c2202bdbb Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/stripped_sorting_log.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/stripped_sorting_log_top.png b/src/main/resources/assets/twilightforest/textures/block/stripped_sorting_log_top.png new file mode 100644 index 0000000000..0a37b2db9c Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/stripped_sorting_log_top.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/stripped_time_log.png b/src/main/resources/assets/twilightforest/textures/block/stripped_time_log.png new file mode 100644 index 0000000000..7180597e99 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/stripped_time_log.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/stripped_time_log_top.png b/src/main/resources/assets/twilightforest/textures/block/stripped_time_log_top.png new file mode 100644 index 0000000000..bc3e75fdf0 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/stripped_time_log_top.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/stripped_transformation_log.png b/src/main/resources/assets/twilightforest/textures/block/stripped_transformation_log.png new file mode 100644 index 0000000000..1ccf0236e1 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/stripped_transformation_log.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/stripped_transformation_log_top.png b/src/main/resources/assets/twilightforest/textures/block/stripped_transformation_log_top.png new file mode 100644 index 0000000000..ee0dccad26 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/stripped_transformation_log_top.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/stripped_twilight_oak_log.png b/src/main/resources/assets/twilightforest/textures/block/stripped_twilight_oak_log.png new file mode 100644 index 0000000000..194d124a09 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/stripped_twilight_oak_log.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/stripped_twilight_oak_log_top.png b/src/main/resources/assets/twilightforest/textures/block/stripped_twilight_oak_log_top.png new file mode 100644 index 0000000000..6821ebada6 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/stripped_twilight_oak_log_top.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/thick_castle_brick.png b/src/main/resources/assets/twilightforest/textures/block/thick_castle_brick.png new file mode 100644 index 0000000000..25533e4f31 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/thick_castle_brick.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/thick_castle_brick_ct.png b/src/main/resources/assets/twilightforest/textures/block/thick_castle_brick_ct.png new file mode 100644 index 0000000000..56003632c1 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/thick_castle_brick_ct.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/thorn_rose.png b/src/main/resources/assets/twilightforest/textures/block/thorn_rose.png new file mode 100644 index 0000000000..458c90c5a0 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/thorn_rose.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/thornless_hedge.png b/src/main/resources/assets/twilightforest/textures/block/thornless_hedge.png new file mode 100644 index 0000000000..27f7b3fbe8 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/thornless_hedge.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/time_leaves.png b/src/main/resources/assets/twilightforest/textures/block/time_leaves.png new file mode 100644 index 0000000000..08a3749256 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/time_leaves.png differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/trans_leaves.png.mcmeta b/src/main/resources/assets/twilightforest/textures/block/time_leaves.png.mcmeta similarity index 100% rename from src/main/resources/assets/twilightforest/textures/blocks/trans_leaves.png.mcmeta rename to src/main/resources/assets/twilightforest/textures/block/time_leaves.png.mcmeta diff --git a/src/main/resources/assets/twilightforest/textures/block/time_log.png b/src/main/resources/assets/twilightforest/textures/block/time_log.png new file mode 100644 index 0000000000..2b9425d660 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/time_log.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/time_log_core.png b/src/main/resources/assets/twilightforest/textures/block/time_log_core.png new file mode 100644 index 0000000000..e973f37aa9 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/time_log_core.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/time_log_core_on.png b/src/main/resources/assets/twilightforest/textures/block/time_log_core_on.png new file mode 100644 index 0000000000..70f2737f63 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/time_log_core_on.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/time_log_top.png b/src/main/resources/assets/twilightforest/textures/block/time_log_top.png new file mode 100644 index 0000000000..e2016b2929 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/time_log_top.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/time_sapling.png b/src/main/resources/assets/twilightforest/textures/block/time_sapling.png new file mode 100644 index 0000000000..0736e0c2be Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/time_sapling.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/torchberry_plant.png b/src/main/resources/assets/twilightforest/textures/block/torchberry_plant.png new file mode 100644 index 0000000000..85bc775b3f Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/torchberry_plant.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/torchberry_plant_glow.png b/src/main/resources/assets/twilightforest/textures/block/torchberry_plant_glow.png new file mode 100644 index 0000000000..cef2feaa7e Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/torchberry_plant_glow.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/tower_device_level_1/towerdev_antibuilder_1.png b/src/main/resources/assets/twilightforest/textures/block/tower_device_level_1/towerdev_antibuilder_1.png new file mode 100644 index 0000000000..3788d10782 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/tower_device_level_1/towerdev_antibuilder_1.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/tower_device_level_1/towerdev_builder_off_1.png b/src/main/resources/assets/twilightforest/textures/block/tower_device_level_1/towerdev_builder_off_1.png new file mode 100644 index 0000000000..1b282b6c1d Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/tower_device_level_1/towerdev_builder_off_1.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/tower_device_level_1/towerdev_builder_on_1.png b/src/main/resources/assets/twilightforest/textures/block/tower_device_level_1/towerdev_builder_on_1.png new file mode 100644 index 0000000000..0df54daccc Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/tower_device_level_1/towerdev_builder_on_1.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/tower_device_level_1/towerdev_firejet_1.png b/src/main/resources/assets/twilightforest/textures/block/tower_device_level_1/towerdev_firejet_1.png new file mode 100644 index 0000000000..302b44b0a8 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/tower_device_level_1/towerdev_firejet_1.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/tower_device_level_1/towerdev_ghasttrap_off_1.png b/src/main/resources/assets/twilightforest/textures/block/tower_device_level_1/towerdev_ghasttrap_off_1.png new file mode 100644 index 0000000000..1310e1731b Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/tower_device_level_1/towerdev_ghasttrap_off_1.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/tower_device_level_1/towerdev_ghasttrap_on_1.png b/src/main/resources/assets/twilightforest/textures/block/tower_device_level_1/towerdev_ghasttrap_on_1.png new file mode 100644 index 0000000000..0b9962cfb5 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/tower_device_level_1/towerdev_ghasttrap_on_1.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/tower_device_level_1/towerdev_lock_off_1.png b/src/main/resources/assets/twilightforest/textures/block/tower_device_level_1/towerdev_lock_off_1.png new file mode 100644 index 0000000000..831b7de5fb Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/tower_device_level_1/towerdev_lock_off_1.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/tower_device_level_1/towerdev_lock_on_1.png b/src/main/resources/assets/twilightforest/textures/block/tower_device_level_1/towerdev_lock_on_1.png new file mode 100644 index 0000000000..726130e1d3 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/tower_device_level_1/towerdev_lock_on_1.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/tower_device_level_1/towerdev_reactor_off_1.png b/src/main/resources/assets/twilightforest/textures/block/tower_device_level_1/towerdev_reactor_off_1.png new file mode 100644 index 0000000000..c4ab4227f3 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/tower_device_level_1/towerdev_reactor_off_1.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/tower_device_level_1/towerdev_reactor_on_1.png b/src/main/resources/assets/twilightforest/textures/block/tower_device_level_1/towerdev_reactor_on_1.png new file mode 100644 index 0000000000..1c26a1179f Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/tower_device_level_1/towerdev_reactor_on_1.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/tower_device_level_1/towerdev_reappearing_off_1.png b/src/main/resources/assets/twilightforest/textures/block/tower_device_level_1/towerdev_reappearing_off_1.png new file mode 100644 index 0000000000..3c95f7fa4a Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/tower_device_level_1/towerdev_reappearing_off_1.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/tower_device_level_1/towerdev_reappearing_on_1.png b/src/main/resources/assets/twilightforest/textures/block/tower_device_level_1/towerdev_reappearing_on_1.png new file mode 100644 index 0000000000..d8bcea1cd6 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/tower_device_level_1/towerdev_reappearing_on_1.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/tower_device_level_1/towerdev_smoker_1.png b/src/main/resources/assets/twilightforest/textures/block/tower_device_level_1/towerdev_smoker_1.png new file mode 100644 index 0000000000..6f67731d04 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/tower_device_level_1/towerdev_smoker_1.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/tower_device_level_1/towerdev_vanish_off_1.png b/src/main/resources/assets/twilightforest/textures/block/tower_device_level_1/towerdev_vanish_off_1.png new file mode 100644 index 0000000000..b088077055 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/tower_device_level_1/towerdev_vanish_off_1.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/tower_device_level_1/towerdev_vanish_on_1.png b/src/main/resources/assets/twilightforest/textures/block/tower_device_level_1/towerdev_vanish_on_1.png new file mode 100644 index 0000000000..57edfa7721 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/tower_device_level_1/towerdev_vanish_on_1.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/tower_device_level_2/towerdev_antibuilder_2.png b/src/main/resources/assets/twilightforest/textures/block/tower_device_level_2/towerdev_antibuilder_2.png new file mode 100644 index 0000000000..6014814d62 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/tower_device_level_2/towerdev_antibuilder_2.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/tower_device_level_2/towerdev_antibuilt_1.png b/src/main/resources/assets/twilightforest/textures/block/tower_device_level_2/towerdev_antibuilt_1.png new file mode 100644 index 0000000000..15bff36954 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/tower_device_level_2/towerdev_antibuilt_1.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/tower_device_level_2/towerdev_builder_off_2.png b/src/main/resources/assets/twilightforest/textures/block/tower_device_level_2/towerdev_builder_off_2.png new file mode 100644 index 0000000000..ba0fa2bc03 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/tower_device_level_2/towerdev_builder_off_2.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/tower_device_level_2/towerdev_builder_on_2.png b/src/main/resources/assets/twilightforest/textures/block/tower_device_level_2/towerdev_builder_on_2.png new file mode 100644 index 0000000000..b46b135212 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/tower_device_level_2/towerdev_builder_on_2.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/tower_device_level_2/towerdev_builder_timeout_1.png b/src/main/resources/assets/twilightforest/textures/block/tower_device_level_2/towerdev_builder_timeout_1.png new file mode 100644 index 0000000000..68719bad77 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/tower_device_level_2/towerdev_builder_timeout_1.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/tower_device_level_2/towerdev_firejet_off_1.png b/src/main/resources/assets/twilightforest/textures/block/tower_device_level_2/towerdev_firejet_off_1.png new file mode 100644 index 0000000000..1fa6b49f08 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/tower_device_level_2/towerdev_firejet_off_1.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/tower_device_level_2/towerdev_firejet_on_1.png b/src/main/resources/assets/twilightforest/textures/block/tower_device_level_2/towerdev_firejet_on_1.png new file mode 100644 index 0000000000..e1e527016a Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/tower_device_level_2/towerdev_firejet_on_1.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/tower_device_level_2/towerdev_ghasttrap_off_2.png b/src/main/resources/assets/twilightforest/textures/block/tower_device_level_2/towerdev_ghasttrap_off_2.png new file mode 100644 index 0000000000..70c4661acb Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/tower_device_level_2/towerdev_ghasttrap_off_2.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/tower_device_level_2/towerdev_ghasttrap_on_2.png b/src/main/resources/assets/twilightforest/textures/block/tower_device_level_2/towerdev_ghasttrap_on_2.png new file mode 100644 index 0000000000..8f4b3da611 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/tower_device_level_2/towerdev_ghasttrap_on_2.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/tower_device_level_2/towerdev_ghasttraplid_off_1.png b/src/main/resources/assets/twilightforest/textures/block/tower_device_level_2/towerdev_ghasttraplid_off_1.png new file mode 100644 index 0000000000..cf84d76d73 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/tower_device_level_2/towerdev_ghasttraplid_off_1.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/tower_device_level_2/towerdev_ghasttraplid_on_1.png b/src/main/resources/assets/twilightforest/textures/block/tower_device_level_2/towerdev_ghasttraplid_on_1.png new file mode 100644 index 0000000000..57593e04d8 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/tower_device_level_2/towerdev_ghasttraplid_on_1.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/tower_device_level_2/towerdev_lock_off_2.png b/src/main/resources/assets/twilightforest/textures/block/tower_device_level_2/towerdev_lock_off_2.png new file mode 100644 index 0000000000..8fd54c1bf9 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/tower_device_level_2/towerdev_lock_off_2.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/tower_device_level_2/towerdev_lock_on_2.png b/src/main/resources/assets/twilightforest/textures/block/tower_device_level_2/towerdev_lock_on_2.png new file mode 100644 index 0000000000..b08660df48 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/tower_device_level_2/towerdev_lock_on_2.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/tower_device_level_2/towerdev_reactor_off_2.png b/src/main/resources/assets/twilightforest/textures/block/tower_device_level_2/towerdev_reactor_off_2.png new file mode 100644 index 0000000000..aefbd5b34a Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/tower_device_level_2/towerdev_reactor_off_2.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/tower_device_level_2/towerdev_reactor_on_2.png b/src/main/resources/assets/twilightforest/textures/block/tower_device_level_2/towerdev_reactor_on_2.png new file mode 100644 index 0000000000..646d36a635 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/tower_device_level_2/towerdev_reactor_on_2.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/tower_device_level_2/towerdev_reappearing_off_2.png b/src/main/resources/assets/twilightforest/textures/block/tower_device_level_2/towerdev_reappearing_off_2.png new file mode 100644 index 0000000000..f56aa6cb55 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/tower_device_level_2/towerdev_reappearing_off_2.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/tower_device_level_2/towerdev_reappearing_on_2.png b/src/main/resources/assets/twilightforest/textures/block/tower_device_level_2/towerdev_reappearing_on_2.png new file mode 100644 index 0000000000..7082c97968 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/tower_device_level_2/towerdev_reappearing_on_2.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/tower_device_level_2/towerdev_smoker_off_1.png b/src/main/resources/assets/twilightforest/textures/block/tower_device_level_2/towerdev_smoker_off_1.png new file mode 100644 index 0000000000..8b6a053077 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/tower_device_level_2/towerdev_smoker_off_1.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/tower_device_level_2/towerdev_smoker_on_1.png b/src/main/resources/assets/twilightforest/textures/block/tower_device_level_2/towerdev_smoker_on_1.png new file mode 100644 index 0000000000..89a3095e3d Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/tower_device_level_2/towerdev_smoker_on_1.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/tower_device_level_2/towerdev_vanish_off_2.png b/src/main/resources/assets/twilightforest/textures/block/tower_device_level_2/towerdev_vanish_off_2.png new file mode 100644 index 0000000000..b6e6f021ac Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/tower_device_level_2/towerdev_vanish_off_2.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/tower_device_level_2/towerdev_vanish_on_2.png b/src/main/resources/assets/twilightforest/textures/block/tower_device_level_2/towerdev_vanish_on_2.png new file mode 100644 index 0000000000..30b7d28cab Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/tower_device_level_2/towerdev_vanish_on_2.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/tower_device_level_3/towerdev_builder_timeout_2.png b/src/main/resources/assets/twilightforest/textures/block/tower_device_level_3/towerdev_builder_timeout_2.png new file mode 100644 index 0000000000..ec19476160 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/tower_device_level_3/towerdev_builder_timeout_2.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/tower_device_level_3/towerdev_ghasttraplid_on_2.png b/src/main/resources/assets/twilightforest/textures/block/tower_device_level_3/towerdev_ghasttraplid_on_2.png new file mode 100644 index 0000000000..a2e59e959e Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/tower_device_level_3/towerdev_ghasttraplid_on_2.png differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/towerdev_antibuilder.png b/src/main/resources/assets/twilightforest/textures/block/towerdev_antibuilder.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/blocks/towerdev_antibuilder.png rename to src/main/resources/assets/twilightforest/textures/block/towerdev_antibuilder.png diff --git a/src/main/resources/assets/twilightforest/textures/blocks/towerdev_antibuilt.png b/src/main/resources/assets/twilightforest/textures/block/towerdev_antibuilt.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/blocks/towerdev_antibuilt.png rename to src/main/resources/assets/twilightforest/textures/block/towerdev_antibuilt.png diff --git a/src/main/resources/assets/twilightforest/textures/blocks/towerdev_builder_off.png b/src/main/resources/assets/twilightforest/textures/block/towerdev_builder_off.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/blocks/towerdev_builder_off.png rename to src/main/resources/assets/twilightforest/textures/block/towerdev_builder_off.png diff --git a/src/main/resources/assets/twilightforest/textures/blocks/towerdev_builder_on.png b/src/main/resources/assets/twilightforest/textures/block/towerdev_builder_on.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/blocks/towerdev_builder_on.png rename to src/main/resources/assets/twilightforest/textures/block/towerdev_builder_on.png diff --git a/src/main/resources/assets/twilightforest/textures/blocks/towerdev_builder_timeout.png b/src/main/resources/assets/twilightforest/textures/block/towerdev_builder_timeout.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/blocks/towerdev_builder_timeout.png rename to src/main/resources/assets/twilightforest/textures/block/towerdev_builder_timeout.png diff --git a/src/main/resources/assets/twilightforest/textures/blocks/towerdev_built_off.png b/src/main/resources/assets/twilightforest/textures/block/towerdev_built_off.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/blocks/towerdev_built_off.png rename to src/main/resources/assets/twilightforest/textures/block/towerdev_built_off.png diff --git a/src/main/resources/assets/twilightforest/textures/blocks/towerdev_built_on.png b/src/main/resources/assets/twilightforest/textures/block/towerdev_built_on.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/blocks/towerdev_built_on.png rename to src/main/resources/assets/twilightforest/textures/block/towerdev_built_on.png diff --git a/src/main/resources/assets/twilightforest/textures/block/towerdev_firejet_off.png b/src/main/resources/assets/twilightforest/textures/block/towerdev_firejet_off.png new file mode 100644 index 0000000000..0b406a323e Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/towerdev_firejet_off.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/towerdev_firejet_on.png b/src/main/resources/assets/twilightforest/textures/block/towerdev_firejet_on.png new file mode 100644 index 0000000000..99c0ff4c8c Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/towerdev_firejet_on.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/towerdev_ghasttrap_off.png b/src/main/resources/assets/twilightforest/textures/block/towerdev_ghasttrap_off.png new file mode 100644 index 0000000000..d5da86f0fa Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/towerdev_ghasttrap_off.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/towerdev_ghasttrap_on.png b/src/main/resources/assets/twilightforest/textures/block/towerdev_ghasttrap_on.png new file mode 100644 index 0000000000..0e336075c1 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/towerdev_ghasttrap_on.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/towerdev_ghasttraplid_off.png b/src/main/resources/assets/twilightforest/textures/block/towerdev_ghasttraplid_off.png new file mode 100644 index 0000000000..e25e846231 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/towerdev_ghasttraplid_off.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/towerdev_ghasttraplid_on.png b/src/main/resources/assets/twilightforest/textures/block/towerdev_ghasttraplid_on.png new file mode 100644 index 0000000000..2546697740 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/towerdev_ghasttraplid_on.png differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/towerdev_lock_off.png b/src/main/resources/assets/twilightforest/textures/block/towerdev_lock_off.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/blocks/towerdev_lock_off.png rename to src/main/resources/assets/twilightforest/textures/block/towerdev_lock_off.png diff --git a/src/main/resources/assets/twilightforest/textures/blocks/towerdev_lock_on.png b/src/main/resources/assets/twilightforest/textures/block/towerdev_lock_on.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/blocks/towerdev_lock_on.png rename to src/main/resources/assets/twilightforest/textures/block/towerdev_lock_on.png diff --git a/src/main/resources/assets/twilightforest/textures/block/towerdev_reactor_off.png b/src/main/resources/assets/twilightforest/textures/block/towerdev_reactor_off.png new file mode 100644 index 0000000000..36241ea305 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/towerdev_reactor_off.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/towerdev_reactor_on.png b/src/main/resources/assets/twilightforest/textures/block/towerdev_reactor_on.png new file mode 100644 index 0000000000..4fc49d4849 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/towerdev_reactor_on.png differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/towerdev_reappearing_off.png b/src/main/resources/assets/twilightforest/textures/block/towerdev_reappearing_off.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/blocks/towerdev_reappearing_off.png rename to src/main/resources/assets/twilightforest/textures/block/towerdev_reappearing_off.png diff --git a/src/main/resources/assets/twilightforest/textures/blocks/towerdev_reappearing_on.png b/src/main/resources/assets/twilightforest/textures/block/towerdev_reappearing_on.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/blocks/towerdev_reappearing_on.png rename to src/main/resources/assets/twilightforest/textures/block/towerdev_reappearing_on.png diff --git a/src/main/resources/assets/twilightforest/textures/blocks/towerdev_reappearing_trace_off.png b/src/main/resources/assets/twilightforest/textures/block/towerdev_reappearing_trace_off.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/blocks/towerdev_reappearing_trace_off.png rename to src/main/resources/assets/twilightforest/textures/block/towerdev_reappearing_trace_off.png diff --git a/src/main/resources/assets/twilightforest/textures/blocks/towerdev_reappearing_trace_on.png b/src/main/resources/assets/twilightforest/textures/block/towerdev_reappearing_trace_on.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/blocks/towerdev_reappearing_trace_on.png rename to src/main/resources/assets/twilightforest/textures/block/towerdev_reappearing_trace_on.png diff --git a/src/main/resources/assets/twilightforest/textures/block/towerdev_smoker_off.png b/src/main/resources/assets/twilightforest/textures/block/towerdev_smoker_off.png new file mode 100644 index 0000000000..a3014c1321 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/towerdev_smoker_off.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/towerdev_smoker_on.png b/src/main/resources/assets/twilightforest/textures/block/towerdev_smoker_on.png new file mode 100644 index 0000000000..4b22cd2c2d Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/towerdev_smoker_on.png differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/towerdev_vanish_off.png b/src/main/resources/assets/twilightforest/textures/block/towerdev_vanish_off.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/blocks/towerdev_vanish_off.png rename to src/main/resources/assets/twilightforest/textures/block/towerdev_vanish_off.png diff --git a/src/main/resources/assets/twilightforest/textures/blocks/towerdev_vanish_on.png b/src/main/resources/assets/twilightforest/textures/block/towerdev_vanish_on.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/blocks/towerdev_vanish_on.png rename to src/main/resources/assets/twilightforest/textures/block/towerdev_vanish_on.png diff --git a/src/main/resources/assets/twilightforest/textures/block/towerwood.png b/src/main/resources/assets/twilightforest/textures/block/towerwood.png new file mode 100644 index 0000000000..548523af2a Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/towerwood.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/transformation_leaves.png b/src/main/resources/assets/twilightforest/textures/block/transformation_leaves.png new file mode 100644 index 0000000000..b23d3ade4f Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/transformation_leaves.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/transformation_leaves.png.mcmeta b/src/main/resources/assets/twilightforest/textures/block/transformation_leaves.png.mcmeta new file mode 100644 index 0000000000..53479c883d --- /dev/null +++ b/src/main/resources/assets/twilightforest/textures/block/transformation_leaves.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation": { + "frametime":2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/textures/block/transformation_log.png b/src/main/resources/assets/twilightforest/textures/block/transformation_log.png new file mode 100644 index 0000000000..273914128b Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/transformation_log.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/transformation_log_core.png b/src/main/resources/assets/twilightforest/textures/block/transformation_log_core.png new file mode 100644 index 0000000000..fc6520eef9 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/transformation_log_core.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/transformation_log_core_on.png b/src/main/resources/assets/twilightforest/textures/block/transformation_log_core_on.png new file mode 100644 index 0000000000..754a70aa1f Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/transformation_log_core_on.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/transformation_log_top.png b/src/main/resources/assets/twilightforest/textures/block/transformation_log_top.png new file mode 100644 index 0000000000..4c885022bc Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/transformation_log_top.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/transformation_sapling.png b/src/main/resources/assets/twilightforest/textures/block/transformation_sapling.png new file mode 100644 index 0000000000..b6ab430b37 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/transformation_sapling.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/trollber.png b/src/main/resources/assets/twilightforest/textures/block/trollber.png new file mode 100644 index 0000000000..92311aea9d Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/trollber.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/trollber_glow.png b/src/main/resources/assets/twilightforest/textures/block/trollber_glow.png new file mode 100644 index 0000000000..7fba8a0611 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/trollber_glow.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/trollsteinn.png b/src/main/resources/assets/twilightforest/textures/block/trollsteinn.png new file mode 100644 index 0000000000..793e6b9b74 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/trollsteinn.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/trollsteinn_light.png b/src/main/resources/assets/twilightforest/textures/block/trollsteinn_light.png new file mode 100644 index 0000000000..45157fea9c Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/trollsteinn_light.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/trollvidr.png b/src/main/resources/assets/twilightforest/textures/block/trollvidr.png new file mode 100644 index 0000000000..8c5ae8a301 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/trollvidr.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/twilight_oak_log.png b/src/main/resources/assets/twilightforest/textures/block/twilight_oak_log.png new file mode 100644 index 0000000000..166e5956f1 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/twilight_oak_log.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/twilight_oak_log_top.png b/src/main/resources/assets/twilightforest/textures/block/twilight_oak_log_top.png new file mode 100644 index 0000000000..d222caed7d Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/twilight_oak_log_top.png differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/sapling_oak.png b/src/main/resources/assets/twilightforest/textures/block/twilight_oak_sapling.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/blocks/sapling_oak.png rename to src/main/resources/assets/twilightforest/textures/block/twilight_oak_sapling.png diff --git a/src/main/resources/assets/twilightforest/textures/blocks/uberous_soil.png b/src/main/resources/assets/twilightforest/textures/block/uberous_soil.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/blocks/uberous_soil.png rename to src/main/resources/assets/twilightforest/textures/block/uberous_soil.png diff --git a/src/main/resources/assets/twilightforest/textures/block/uberous_soil_glow.png b/src/main/resources/assets/twilightforest/textures/block/uberous_soil_glow.png new file mode 100644 index 0000000000..26b7b0d4b5 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/uberous_soil_glow.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/uberous_soil_glow.png.mcmeta b/src/main/resources/assets/twilightforest/textures/block/uberous_soil_glow.png.mcmeta new file mode 100644 index 0000000000..95fc346a21 --- /dev/null +++ b/src/main/resources/assets/twilightforest/textures/block/uberous_soil_glow.png.mcmeta @@ -0,0 +1,9 @@ +{ + "ctm": { + "ctm_version": 1, + "layer": "TRANSLUCENT", + "extra": { + "light": 15 + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/textures/block/uncrafting_glow.png b/src/main/resources/assets/twilightforest/textures/block/uncrafting_glow.png new file mode 100644 index 0000000000..567e1319c9 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/uncrafting_glow.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/uncrafting_glow_side.png b/src/main/resources/assets/twilightforest/textures/block/uncrafting_glow_side.png new file mode 100644 index 0000000000..f13e46f1c4 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/uncrafting_glow_side.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/uncrafting_particle.png b/src/main/resources/assets/twilightforest/textures/block/uncrafting_particle.png new file mode 100644 index 0000000000..2a048101aa Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/uncrafting_particle.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/uncrafting_particle_side.png b/src/main/resources/assets/twilightforest/textures/block/uncrafting_particle_side.png new file mode 100644 index 0000000000..54b55616fa Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/uncrafting_particle_side.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/uncrafting_side.png b/src/main/resources/assets/twilightforest/textures/block/uncrafting_side.png new file mode 100644 index 0000000000..cd4d10fb6e Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/uncrafting_side.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/uncrafting_top.png b/src/main/resources/assets/twilightforest/textures/block/uncrafting_top.png new file mode 100644 index 0000000000..b4a227123c Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/uncrafting_top.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/underbrick.png b/src/main/resources/assets/twilightforest/textures/block/underbrick.png new file mode 100644 index 0000000000..9ef07bad60 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/underbrick.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/underbrick_floor.png b/src/main/resources/assets/twilightforest/textures/block/underbrick_floor.png new file mode 100644 index 0000000000..490265b025 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/underbrick_floor.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/unripe_trollber.png b/src/main/resources/assets/twilightforest/textures/block/unripe_trollber.png new file mode 100644 index 0000000000..878d661e51 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/unripe_trollber.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/untitled.png b/src/main/resources/assets/twilightforest/textures/block/untitled.png new file mode 100644 index 0000000000..19c557585f Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/untitled.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/violet_force_field.png b/src/main/resources/assets/twilightforest/textures/block/violet_force_field.png new file mode 100644 index 0000000000..4224459e6c Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/violet_force_field.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/weathered_deadrock.png b/src/main/resources/assets/twilightforest/textures/block/weathered_deadrock.png new file mode 100644 index 0000000000..cadd9f39a1 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/weathered_deadrock.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/wispy_cloud.png b/src/main/resources/assets/twilightforest/textures/block/wispy_cloud.png new file mode 100644 index 0000000000..dd9802920e Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/wispy_cloud.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/wood/bookshelf_canopy.png b/src/main/resources/assets/twilightforest/textures/block/wood/bookshelf_canopy.png new file mode 100644 index 0000000000..a2daf63fbd Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/wood/bookshelf_canopy.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/wood/bookshelf_canopy_1.png b/src/main/resources/assets/twilightforest/textures/block/wood/bookshelf_canopy_1.png new file mode 100644 index 0000000000..20bbd932e8 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/wood/bookshelf_canopy_1.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/wood/bookshelf_canopy_2.png b/src/main/resources/assets/twilightforest/textures/block/wood/bookshelf_canopy_2.png new file mode 100644 index 0000000000..fd929ce62f Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/wood/bookshelf_canopy_2.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/wood/bookshelf_canopy_3.png b/src/main/resources/assets/twilightforest/textures/block/wood/bookshelf_canopy_3.png new file mode 100644 index 0000000000..f827ccecee Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/wood/bookshelf_canopy_3.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/wood/bookshelf_spawner/bookshelf_1.png b/src/main/resources/assets/twilightforest/textures/block/wood/bookshelf_spawner/bookshelf_1.png new file mode 100644 index 0000000000..9389d0795c Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/wood/bookshelf_spawner/bookshelf_1.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/wood/bookshelf_spawner/bookshelf_2.png b/src/main/resources/assets/twilightforest/textures/block/wood/bookshelf_spawner/bookshelf_2.png new file mode 100644 index 0000000000..fc8e071070 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/wood/bookshelf_spawner/bookshelf_2.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/wood/bookshelf_spawner/bookshelf_3.png b/src/main/resources/assets/twilightforest/textures/block/wood/bookshelf_spawner/bookshelf_3.png new file mode 100644 index 0000000000..2634e4f1cf Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/wood/bookshelf_spawner/bookshelf_3.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/wood/bookshelf_spawner/bookshelf_4.png b/src/main/resources/assets/twilightforest/textures/block/wood/bookshelf_spawner/bookshelf_4.png new file mode 100644 index 0000000000..5dbe229188 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/wood/bookshelf_spawner/bookshelf_4.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/wood/bookshelf_spawner/bookshelf_5.png b/src/main/resources/assets/twilightforest/textures/block/wood/bookshelf_spawner/bookshelf_5.png new file mode 100644 index 0000000000..5d6f5d74e0 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/wood/bookshelf_spawner/bookshelf_5.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/wood/bookshelf_spawner/bookshelf_6.png b/src/main/resources/assets/twilightforest/textures/block/wood/bookshelf_spawner/bookshelf_6.png new file mode 100644 index 0000000000..fb76d35303 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/wood/bookshelf_spawner/bookshelf_6.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/wood/bookshelf_spawner/bookshelf_7.png b/src/main/resources/assets/twilightforest/textures/block/wood/bookshelf_spawner/bookshelf_7.png new file mode 100644 index 0000000000..a2f6cc9aff Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/wood/bookshelf_spawner/bookshelf_7.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/wood/bookshelf_spawner/bookshelf_8.png b/src/main/resources/assets/twilightforest/textures/block/wood/bookshelf_spawner/bookshelf_8.png new file mode 100644 index 0000000000..2d737a3b87 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/wood/bookshelf_spawner/bookshelf_8.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/wood/bookshelf_spawner/bookshelf_9.png b/src/main/resources/assets/twilightforest/textures/block/wood/bookshelf_spawner/bookshelf_9.png new file mode 100644 index 0000000000..d46d5cd1ad Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/wood/bookshelf_spawner/bookshelf_9.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/wood/bookshelf_spawner/bookshelf_empty.png b/src/main/resources/assets/twilightforest/textures/block/wood/bookshelf_spawner/bookshelf_empty.png new file mode 100644 index 0000000000..c4f84e816a Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/wood/bookshelf_spawner/bookshelf_empty.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/wood/door/canopy_lower.png b/src/main/resources/assets/twilightforest/textures/block/wood/door/canopy_lower.png new file mode 100644 index 0000000000..6552c91496 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/wood/door/canopy_lower.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/wood/door/canopy_upper.png b/src/main/resources/assets/twilightforest/textures/block/wood/door/canopy_upper.png new file mode 100644 index 0000000000..213192484c Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/wood/door/canopy_upper.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/wood/door/darkwood_lower.png b/src/main/resources/assets/twilightforest/textures/block/wood/door/darkwood_lower.png new file mode 100644 index 0000000000..5d2fe286e7 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/wood/door/darkwood_lower.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/wood/door/darkwood_upper.png b/src/main/resources/assets/twilightforest/textures/block/wood/door/darkwood_upper.png new file mode 100644 index 0000000000..60ee63ad09 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/wood/door/darkwood_upper.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/wood/door/mangrove_lower.png b/src/main/resources/assets/twilightforest/textures/block/wood/door/mangrove_lower.png new file mode 100644 index 0000000000..6063c67e68 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/wood/door/mangrove_lower.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/wood/door/mangrove_upper.png b/src/main/resources/assets/twilightforest/textures/block/wood/door/mangrove_upper.png new file mode 100644 index 0000000000..28a48b9216 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/wood/door/mangrove_upper.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/wood/door/mine_lower.png b/src/main/resources/assets/twilightforest/textures/block/wood/door/mine_lower.png new file mode 100644 index 0000000000..01cdcf88cc Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/wood/door/mine_lower.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/wood/door/mine_upper.png b/src/main/resources/assets/twilightforest/textures/block/wood/door/mine_upper.png new file mode 100644 index 0000000000..e9f43e406e Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/wood/door/mine_upper.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/wood/door/sort_lower.png b/src/main/resources/assets/twilightforest/textures/block/wood/door/sort_lower.png new file mode 100644 index 0000000000..11aa124b56 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/wood/door/sort_lower.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/wood/door/sort_upper.png b/src/main/resources/assets/twilightforest/textures/block/wood/door/sort_upper.png new file mode 100644 index 0000000000..2950d57cdc Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/wood/door/sort_upper.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/wood/door/time_lower.png b/src/main/resources/assets/twilightforest/textures/block/wood/door/time_lower.png new file mode 100644 index 0000000000..7f5dfa333f Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/wood/door/time_lower.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/wood/door/time_upper.png b/src/main/resources/assets/twilightforest/textures/block/wood/door/time_upper.png new file mode 100644 index 0000000000..d33258a99d Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/wood/door/time_upper.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/wood/door/trans_lower.png b/src/main/resources/assets/twilightforest/textures/block/wood/door/trans_lower.png new file mode 100644 index 0000000000..0d51cf2d7b Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/wood/door/trans_lower.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/wood/door/trans_upper.png b/src/main/resources/assets/twilightforest/textures/block/wood/door/trans_upper.png new file mode 100644 index 0000000000..bac717f554 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/wood/door/trans_upper.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/wood/door/twilight_oak_lower.png b/src/main/resources/assets/twilightforest/textures/block/wood/door/twilight_oak_lower.png new file mode 100644 index 0000000000..25812c82f0 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/wood/door/twilight_oak_lower.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/wood/door/twilight_oak_upper.png b/src/main/resources/assets/twilightforest/textures/block/wood/door/twilight_oak_upper.png new file mode 100644 index 0000000000..2d298010e3 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/wood/door/twilight_oak_upper.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/wood/planks_canopy_0.png b/src/main/resources/assets/twilightforest/textures/block/wood/planks_canopy_0.png new file mode 100644 index 0000000000..8979ee6ee0 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/wood/planks_canopy_0.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/wood/planks_canopy_1.png b/src/main/resources/assets/twilightforest/textures/block/wood/planks_canopy_1.png new file mode 100644 index 0000000000..695a753f6c Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/wood/planks_canopy_1.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/wood/planks_canopy_2.png b/src/main/resources/assets/twilightforest/textures/block/wood/planks_canopy_2.png new file mode 100644 index 0000000000..4c7676cf4d Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/wood/planks_canopy_2.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/wood/planks_canopy_3.png b/src/main/resources/assets/twilightforest/textures/block/wood/planks_canopy_3.png new file mode 100644 index 0000000000..270775129c Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/wood/planks_canopy_3.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/wood/planks_darkwood_0.png b/src/main/resources/assets/twilightforest/textures/block/wood/planks_darkwood_0.png new file mode 100644 index 0000000000..21a9f5a9c9 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/wood/planks_darkwood_0.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/wood/planks_darkwood_1.png b/src/main/resources/assets/twilightforest/textures/block/wood/planks_darkwood_1.png new file mode 100644 index 0000000000..1280338b24 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/wood/planks_darkwood_1.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/wood/planks_darkwood_2.png b/src/main/resources/assets/twilightforest/textures/block/wood/planks_darkwood_2.png new file mode 100644 index 0000000000..45c7f964eb Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/wood/planks_darkwood_2.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/wood/planks_darkwood_3.png b/src/main/resources/assets/twilightforest/textures/block/wood/planks_darkwood_3.png new file mode 100644 index 0000000000..ee920464b2 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/wood/planks_darkwood_3.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/wood/planks_mangrove_0.png b/src/main/resources/assets/twilightforest/textures/block/wood/planks_mangrove_0.png new file mode 100644 index 0000000000..a6a87fbbd7 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/wood/planks_mangrove_0.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/wood/planks_mangrove_1.png b/src/main/resources/assets/twilightforest/textures/block/wood/planks_mangrove_1.png new file mode 100644 index 0000000000..0c7d04602d Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/wood/planks_mangrove_1.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/wood/planks_mangrove_2.png b/src/main/resources/assets/twilightforest/textures/block/wood/planks_mangrove_2.png new file mode 100644 index 0000000000..5ddb293e19 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/wood/planks_mangrove_2.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/wood/planks_mangrove_3.png b/src/main/resources/assets/twilightforest/textures/block/wood/planks_mangrove_3.png new file mode 100644 index 0000000000..eff2c5758d Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/wood/planks_mangrove_3.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/wood/planks_mine_0.png b/src/main/resources/assets/twilightforest/textures/block/wood/planks_mine_0.png new file mode 100644 index 0000000000..61a112bc1e Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/wood/planks_mine_0.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/wood/planks_mine_1.png b/src/main/resources/assets/twilightforest/textures/block/wood/planks_mine_1.png new file mode 100644 index 0000000000..4966d73617 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/wood/planks_mine_1.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/wood/planks_mine_2.png b/src/main/resources/assets/twilightforest/textures/block/wood/planks_mine_2.png new file mode 100644 index 0000000000..4a70778413 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/wood/planks_mine_2.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/wood/planks_mine_3.png b/src/main/resources/assets/twilightforest/textures/block/wood/planks_mine_3.png new file mode 100644 index 0000000000..a0a9082e97 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/wood/planks_mine_3.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/wood/planks_sort_0.png b/src/main/resources/assets/twilightforest/textures/block/wood/planks_sort_0.png new file mode 100644 index 0000000000..32939f6383 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/wood/planks_sort_0.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/wood/planks_sort_1.png b/src/main/resources/assets/twilightforest/textures/block/wood/planks_sort_1.png new file mode 100644 index 0000000000..bf10153985 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/wood/planks_sort_1.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/wood/planks_sort_2.png b/src/main/resources/assets/twilightforest/textures/block/wood/planks_sort_2.png new file mode 100644 index 0000000000..c58e553bac Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/wood/planks_sort_2.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/wood/planks_sort_3.png b/src/main/resources/assets/twilightforest/textures/block/wood/planks_sort_3.png new file mode 100644 index 0000000000..67f5edb2cb Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/wood/planks_sort_3.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/wood/planks_time_0.png b/src/main/resources/assets/twilightforest/textures/block/wood/planks_time_0.png new file mode 100644 index 0000000000..efec463ac7 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/wood/planks_time_0.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/wood/planks_time_1.png b/src/main/resources/assets/twilightforest/textures/block/wood/planks_time_1.png new file mode 100644 index 0000000000..51f4ee38b1 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/wood/planks_time_1.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/wood/planks_time_2.png b/src/main/resources/assets/twilightforest/textures/block/wood/planks_time_2.png new file mode 100644 index 0000000000..a02036611d Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/wood/planks_time_2.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/wood/planks_time_3.png b/src/main/resources/assets/twilightforest/textures/block/wood/planks_time_3.png new file mode 100644 index 0000000000..084e283699 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/wood/planks_time_3.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/wood/planks_trans_0.png b/src/main/resources/assets/twilightforest/textures/block/wood/planks_trans_0.png new file mode 100644 index 0000000000..037d5dbe6c Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/wood/planks_trans_0.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/wood/planks_trans_1.png b/src/main/resources/assets/twilightforest/textures/block/wood/planks_trans_1.png new file mode 100644 index 0000000000..7542055185 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/wood/planks_trans_1.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/wood/planks_trans_2.png b/src/main/resources/assets/twilightforest/textures/block/wood/planks_trans_2.png new file mode 100644 index 0000000000..5e3adaaf54 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/wood/planks_trans_2.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/wood/planks_trans_3.png b/src/main/resources/assets/twilightforest/textures/block/wood/planks_trans_3.png new file mode 100644 index 0000000000..cfba3b99bd Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/wood/planks_trans_3.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/wood/planks_twilight_oak_0.png b/src/main/resources/assets/twilightforest/textures/block/wood/planks_twilight_oak_0.png new file mode 100644 index 0000000000..9594ed82d1 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/wood/planks_twilight_oak_0.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/wood/planks_twilight_oak_1.png b/src/main/resources/assets/twilightforest/textures/block/wood/planks_twilight_oak_1.png new file mode 100644 index 0000000000..a33b4aceda Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/wood/planks_twilight_oak_1.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/wood/planks_twilight_oak_2.png b/src/main/resources/assets/twilightforest/textures/block/wood/planks_twilight_oak_2.png new file mode 100644 index 0000000000..5f25be972d Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/wood/planks_twilight_oak_2.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/wood/planks_twilight_oak_3.png b/src/main/resources/assets/twilightforest/textures/block/wood/planks_twilight_oak_3.png new file mode 100644 index 0000000000..6a1450079a Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/wood/planks_twilight_oak_3.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/wood/trapdoor/canopy_trapdoor.png b/src/main/resources/assets/twilightforest/textures/block/wood/trapdoor/canopy_trapdoor.png new file mode 100644 index 0000000000..4b8855da52 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/wood/trapdoor/canopy_trapdoor.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/wood/trapdoor/darkwood_trapdoor.png b/src/main/resources/assets/twilightforest/textures/block/wood/trapdoor/darkwood_trapdoor.png new file mode 100644 index 0000000000..fe169acbfd Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/wood/trapdoor/darkwood_trapdoor.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/wood/trapdoor/mangrove_trapdoor.png b/src/main/resources/assets/twilightforest/textures/block/wood/trapdoor/mangrove_trapdoor.png new file mode 100644 index 0000000000..26344ca8af Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/wood/trapdoor/mangrove_trapdoor.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/wood/trapdoor/mine_trapdoor.png b/src/main/resources/assets/twilightforest/textures/block/wood/trapdoor/mine_trapdoor.png new file mode 100644 index 0000000000..f3a2866e18 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/wood/trapdoor/mine_trapdoor.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/wood/trapdoor/sort_trapdoor.png b/src/main/resources/assets/twilightforest/textures/block/wood/trapdoor/sort_trapdoor.png new file mode 100644 index 0000000000..959aca2185 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/wood/trapdoor/sort_trapdoor.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/wood/trapdoor/time_trapdoor.png b/src/main/resources/assets/twilightforest/textures/block/wood/trapdoor/time_trapdoor.png new file mode 100644 index 0000000000..ce051ccf76 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/wood/trapdoor/time_trapdoor.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/wood/trapdoor/trans_trapdoor.png b/src/main/resources/assets/twilightforest/textures/block/wood/trapdoor/trans_trapdoor.png new file mode 100644 index 0000000000..15ce30b82e Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/wood/trapdoor/trans_trapdoor.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/wood/trapdoor/twilight_oak_trapdoor.png b/src/main/resources/assets/twilightforest/textures/block/wood/trapdoor/twilight_oak_trapdoor.png new file mode 100644 index 0000000000..c47cf21fcf Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/wood/trapdoor/twilight_oak_trapdoor.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/worn_castle_brick.png b/src/main/resources/assets/twilightforest/textures/block/worn_castle_brick.png new file mode 100644 index 0000000000..d89ad8c65d Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/worn_castle_brick.png differ diff --git a/src/main/resources/assets/twilightforest/textures/block/worn_castle_brick_stairs.png b/src/main/resources/assets/twilightforest/textures/block/worn_castle_brick_stairs.png new file mode 100644 index 0000000000..708514f340 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/block/worn_castle_brick_stairs.png differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/Untitled.png b/src/main/resources/assets/twilightforest/textures/blocks/Untitled.png deleted file mode 100644 index 5c86499404..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/Untitled.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/aurora_pillar_side.png b/src/main/resources/assets/twilightforest/textures/blocks/aurora_pillar_side.png deleted file mode 100644 index 108aaadaf8..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/aurora_pillar_side.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/aurora_pillar_top.png b/src/main/resources/assets/twilightforest/textures/blocks/aurora_pillar_top.png deleted file mode 100644 index 96c8d7b65e..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/aurora_pillar_top.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/aurora_slab_side.png b/src/main/resources/assets/twilightforest/textures/blocks/aurora_slab_side.png deleted file mode 100644 index c535914493..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/aurora_slab_side.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/aurorabrick0.png b/src/main/resources/assets/twilightforest/textures/blocks/aurorabrick0.png deleted file mode 100644 index eb3c164645..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/aurorabrick0.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/aurorabrick0.png.mcmeta b/src/main/resources/assets/twilightforest/textures/blocks/aurorabrick0.png.mcmeta deleted file mode 100644 index ebc2202835..0000000000 --- a/src/main/resources/assets/twilightforest/textures/blocks/aurorabrick0.png.mcmeta +++ /dev/null @@ -1,37 +0,0 @@ -{ - "animation": { - "frametime": 4, - "frames": [ - 0, - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10, - 11, - 12, - 13, - 14, - 15, - 14, - 13, - 12, - 11, - 10, - 9, - 8, - 7, - 6, - 5, - 4, - 3, - 2, - 1 - ] - } -} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/textures/blocks/aurorabrick1.png b/src/main/resources/assets/twilightforest/textures/blocks/aurorabrick1.png deleted file mode 100644 index eb3c164645..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/aurorabrick1.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/aurorabrick1.png.mcmeta b/src/main/resources/assets/twilightforest/textures/blocks/aurorabrick1.png.mcmeta deleted file mode 100644 index 045eda5939..0000000000 --- a/src/main/resources/assets/twilightforest/textures/blocks/aurorabrick1.png.mcmeta +++ /dev/null @@ -1,37 +0,0 @@ -{ - "animation": { - "frametime": 4, - "frames": [ - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10, - 11, - 12, - 13, - 14, - 15, - 14, - 13, - 12, - 11, - 10, - 9, - 8, - 7, - 6, - 5, - 4, - 3, - 2, - 1, - 0, - 1 - ] - } -} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/textures/blocks/aurorabrick2.png b/src/main/resources/assets/twilightforest/textures/blocks/aurorabrick2.png deleted file mode 100644 index eb3c164645..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/aurorabrick2.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/aurorabrick2.png.mcmeta b/src/main/resources/assets/twilightforest/textures/blocks/aurorabrick2.png.mcmeta deleted file mode 100644 index db1c7873f4..0000000000 --- a/src/main/resources/assets/twilightforest/textures/blocks/aurorabrick2.png.mcmeta +++ /dev/null @@ -1,37 +0,0 @@ -{ - "animation": { - "frametime": 4, - "frames": [ - 4, - 5, - 6, - 7, - 8, - 9, - 10, - 11, - 12, - 13, - 14, - 15, - 14, - 13, - 12, - 11, - 10, - 9, - 8, - 7, - 6, - 5, - 4, - 3, - 2, - 1, - 0, - 1, - 2, - 3 - ] - } -} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/textures/blocks/aurorabrick3.png b/src/main/resources/assets/twilightforest/textures/blocks/aurorabrick3.png deleted file mode 100644 index eb3c164645..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/aurorabrick3.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/aurorabrick3.png.mcmeta b/src/main/resources/assets/twilightforest/textures/blocks/aurorabrick3.png.mcmeta deleted file mode 100644 index 8c73439e64..0000000000 --- a/src/main/resources/assets/twilightforest/textures/blocks/aurorabrick3.png.mcmeta +++ /dev/null @@ -1,37 +0,0 @@ -{ - "animation": { - "frametime": 4, - "frames": [ - 6, - 7, - 8, - 9, - 10, - 11, - 12, - 13, - 14, - 15, - 14, - 13, - 12, - 11, - 10, - 9, - 8, - 7, - 6, - 5, - 4, - 3, - 2, - 1, - 0, - 1, - 2, - 3, - 4, - 5 - ] - } -} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/textures/blocks/aurorabrick4.png b/src/main/resources/assets/twilightforest/textures/blocks/aurorabrick4.png deleted file mode 100644 index eb3c164645..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/aurorabrick4.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/aurorabrick4.png.mcmeta b/src/main/resources/assets/twilightforest/textures/blocks/aurorabrick4.png.mcmeta deleted file mode 100644 index e566da5c76..0000000000 --- a/src/main/resources/assets/twilightforest/textures/blocks/aurorabrick4.png.mcmeta +++ /dev/null @@ -1,37 +0,0 @@ -{ - "animation": { - "frametime": 4, - "frames": [ - 8, - 9, - 10, - 11, - 12, - 13, - 14, - 15, - 14, - 13, - 12, - 11, - 10, - 9, - 8, - 7, - 6, - 5, - 4, - 3, - 2, - 1, - 0, - 1, - 2, - 3, - 4, - 5, - 6, - 7 - ] - } -} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/textures/blocks/aurorabrick5.png b/src/main/resources/assets/twilightforest/textures/blocks/aurorabrick5.png deleted file mode 100644 index eb3c164645..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/aurorabrick5.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/aurorabrick5.png.mcmeta b/src/main/resources/assets/twilightforest/textures/blocks/aurorabrick5.png.mcmeta deleted file mode 100644 index 8f82a5a9c4..0000000000 --- a/src/main/resources/assets/twilightforest/textures/blocks/aurorabrick5.png.mcmeta +++ /dev/null @@ -1,37 +0,0 @@ -{ - "animation": { - "frametime": 4, - "frames": [ - 10, - 11, - 12, - 13, - 14, - 15, - 14, - 13, - 12, - 11, - 10, - 9, - 8, - 7, - 6, - 5, - 4, - 3, - 2, - 1, - 0, - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9 - ] - } -} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/textures/blocks/aurorabrick6.png b/src/main/resources/assets/twilightforest/textures/blocks/aurorabrick6.png deleted file mode 100644 index eb3c164645..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/aurorabrick6.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/aurorabrick6.png.mcmeta b/src/main/resources/assets/twilightforest/textures/blocks/aurorabrick6.png.mcmeta deleted file mode 100644 index 0351a00084..0000000000 --- a/src/main/resources/assets/twilightforest/textures/blocks/aurorabrick6.png.mcmeta +++ /dev/null @@ -1,37 +0,0 @@ -{ - "animation": { - "frametime": 4, - "frames": [ - 12, - 13, - 14, - 15, - 14, - 13, - 12, - 11, - 10, - 9, - 8, - 7, - 6, - 5, - 4, - 3, - 2, - 1, - 0, - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10, - 11 - ] - } -} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/textures/blocks/aurorabrick7.png b/src/main/resources/assets/twilightforest/textures/blocks/aurorabrick7.png deleted file mode 100644 index eb3c164645..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/aurorabrick7.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/aurorabrick7.png.mcmeta b/src/main/resources/assets/twilightforest/textures/blocks/aurorabrick7.png.mcmeta deleted file mode 100644 index f2725da423..0000000000 --- a/src/main/resources/assets/twilightforest/textures/blocks/aurorabrick7.png.mcmeta +++ /dev/null @@ -1,37 +0,0 @@ -{ - "animation": { - "frametime": 4, - "frames": [ - 14, - 15, - 14, - 13, - 12, - 11, - 10, - 9, - 8, - 7, - 6, - 5, - 4, - 3, - 2, - 1, - 0, - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10, - 11, - 12, - 13 - ] - } -} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/textures/blocks/blank.png b/src/main/resources/assets/twilightforest/textures/blocks/blank.png deleted file mode 100644 index a8ffaba12d..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/blank.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/brown_thorns_side.png b/src/main/resources/assets/twilightforest/textures/blocks/brown_thorns_side.png deleted file mode 100644 index 785c5292e8..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/brown_thorns_side.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/brown_thorns_top.png b/src/main/resources/assets/twilightforest/textures/blocks/brown_thorns_top.png deleted file mode 100644 index 14d816d75d..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/brown_thorns_top.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/burnt_thorns_side.png b/src/main/resources/assets/twilightforest/textures/blocks/burnt_thorns_side.png deleted file mode 100644 index 13c89f0b68..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/burnt_thorns_side.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/burnt_thorns_top.png b/src/main/resources/assets/twilightforest/textures/blocks/burnt_thorns_top.png deleted file mode 100644 index 9f6198d2ae..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/burnt_thorns_top.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/canopy_top.png b/src/main/resources/assets/twilightforest/textures/blocks/canopy_top.png deleted file mode 100644 index 66526061a5..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/canopy_top.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/castle_door.png b/src/main/resources/assets/twilightforest/textures/blocks/castle_door.png deleted file mode 100644 index 7a39209662..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/castle_door.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/castle_door_active.png b/src/main/resources/assets/twilightforest/textures/blocks/castle_door_active.png deleted file mode 100644 index 9cee3adebb..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/castle_door_active.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/castle_door_vanished.png b/src/main/resources/assets/twilightforest/textures/blocks/castle_door_vanished.png deleted file mode 100644 index ee9a9bb3c1..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/castle_door_vanished.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/castle_door_vanished_active.png b/src/main/resources/assets/twilightforest/textures/blocks/castle_door_vanished_active.png deleted file mode 100644 index c69f0d05e4..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/castle_door_vanished_active.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/castleblock_brick.png b/src/main/resources/assets/twilightforest/textures/blocks/castleblock_brick.png deleted file mode 100644 index 91f70f8cfb..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/castleblock_brick.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/castleblock_cracked.png b/src/main/resources/assets/twilightforest/textures/blocks/castleblock_cracked.png deleted file mode 100644 index 77d6eb9abf..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/castleblock_cracked.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/castleblock_faded.png b/src/main/resources/assets/twilightforest/textures/blocks/castleblock_faded.png deleted file mode 100644 index dfddc80c1f..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/castleblock_faded.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/castleblock_magic_0.png b/src/main/resources/assets/twilightforest/textures/blocks/castleblock_magic_0.png deleted file mode 100644 index c01c96db82..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/castleblock_magic_0.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/castleblock_magic_1.png b/src/main/resources/assets/twilightforest/textures/blocks/castleblock_magic_1.png deleted file mode 100644 index 757ca5c6ca..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/castleblock_magic_1.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/castleblock_magic_2.png b/src/main/resources/assets/twilightforest/textures/blocks/castleblock_magic_2.png deleted file mode 100644 index 23d7fe0d04..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/castleblock_magic_2.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/castleblock_magic_3.png b/src/main/resources/assets/twilightforest/textures/blocks/castleblock_magic_3.png deleted file mode 100644 index 49596dbb1e..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/castleblock_magic_3.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/castleblock_magic_4.png b/src/main/resources/assets/twilightforest/textures/blocks/castleblock_magic_4.png deleted file mode 100644 index 1750b3b0a5..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/castleblock_magic_4.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/castleblock_magic_5.png b/src/main/resources/assets/twilightforest/textures/blocks/castleblock_magic_5.png deleted file mode 100644 index c561c7d0f2..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/castleblock_magic_5.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/castleblock_magic_6.png b/src/main/resources/assets/twilightforest/textures/blocks/castleblock_magic_6.png deleted file mode 100644 index d6ff0a11a8..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/castleblock_magic_6.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/castleblock_magic_7.png b/src/main/resources/assets/twilightforest/textures/blocks/castleblock_magic_7.png deleted file mode 100644 index b229b12e5b..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/castleblock_magic_7.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/castleblock_mossy.png b/src/main/resources/assets/twilightforest/textures/blocks/castleblock_mossy.png deleted file mode 100644 index c193e33509..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/castleblock_mossy.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/castleblock_roof.png b/src/main/resources/assets/twilightforest/textures/blocks/castleblock_roof.png deleted file mode 100644 index 6ffbfd3cc9..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/castleblock_roof.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/cinder_corner.png b/src/main/resources/assets/twilightforest/textures/blocks/cinder_corner.png deleted file mode 100644 index 3baf5f3773..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/cinder_corner.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/cinder_side.png b/src/main/resources/assets/twilightforest/textures/blocks/cinder_side.png deleted file mode 100644 index b1cab2f3c4..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/cinder_side.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/cinder_top.png b/src/main/resources/assets/twilightforest/textures/blocks/cinder_top.png deleted file mode 100644 index 7e634b5a3a..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/cinder_top.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/cloverpatch.png b/src/main/resources/assets/twilightforest/textures/blocks/cloverpatch.png deleted file mode 100644 index 5a1beb813f..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/cloverpatch.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/darkwood_leaves.png b/src/main/resources/assets/twilightforest/textures/blocks/darkwood_leaves.png deleted file mode 100644 index 3863010d78..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/darkwood_leaves.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/darkwood_leaves2 - Copy.png b/src/main/resources/assets/twilightforest/textures/blocks/darkwood_leaves2 - Copy.png deleted file mode 100644 index 3edc5980fc..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/darkwood_leaves2 - Copy.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/darkwood_leaves2.png b/src/main/resources/assets/twilightforest/textures/blocks/darkwood_leaves2.png deleted file mode 100644 index 8fa0f9be7b..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/darkwood_leaves2.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/darkwood_side - Copy.png b/src/main/resources/assets/twilightforest/textures/blocks/darkwood_side - Copy.png deleted file mode 100644 index 16a77633e5..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/darkwood_side - Copy.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/darkwood_side.png b/src/main/resources/assets/twilightforest/textures/blocks/darkwood_side.png deleted file mode 100644 index 95fa3c31a3..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/darkwood_side.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/darkwood_top.png b/src/main/resources/assets/twilightforest/textures/blocks/darkwood_top.png deleted file mode 100644 index e84ca989ed..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/darkwood_top.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/deadrock_cracked.png b/src/main/resources/assets/twilightforest/textures/blocks/deadrock_cracked.png deleted file mode 100644 index 6c5fbe8c9c..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/deadrock_cracked.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/deadrock_solid.png b/src/main/resources/assets/twilightforest/textures/blocks/deadrock_solid.png deleted file mode 100644 index a43d06a723..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/deadrock_solid.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/deadrock_surface.png b/src/main/resources/assets/twilightforest/textures/blocks/deadrock_surface.png deleted file mode 100644 index 3801c72cf7..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/deadrock_surface.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/fluffy_cloud.png b/src/main/resources/assets/twilightforest/textures/blocks/fluffy_cloud.png deleted file mode 100644 index adbff52698..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/fluffy_cloud.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/forcefield_blue.png b/src/main/resources/assets/twilightforest/textures/blocks/forcefield_blue.png deleted file mode 100644 index c07d8540f7..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/forcefield_blue.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/forcefield_green.png b/src/main/resources/assets/twilightforest/textures/blocks/forcefield_green.png deleted file mode 100644 index fad44727f4..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/forcefield_green.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/forcefield_orange.png b/src/main/resources/assets/twilightforest/textures/blocks/forcefield_orange.png deleted file mode 100644 index 656f1c253c..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/forcefield_orange.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/forcefield_pink.png b/src/main/resources/assets/twilightforest/textures/blocks/forcefield_pink.png deleted file mode 100644 index fd91fe1649..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/forcefield_pink.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/forcefield_purple.png b/src/main/resources/assets/twilightforest/textures/blocks/forcefield_purple.png deleted file mode 100644 index 7396bc9ca2..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/forcefield_purple.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/forcefield_top.png b/src/main/resources/assets/twilightforest/textures/blocks/forcefield_top.png deleted file mode 100644 index e73662b789..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/forcefield_top.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/green_thorns_side.png b/src/main/resources/assets/twilightforest/textures/blocks/green_thorns_side.png deleted file mode 100644 index 5fd63bb68f..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/green_thorns_side.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/green_thorns_top.png b/src/main/resources/assets/twilightforest/textures/blocks/green_thorns_top.png deleted file mode 100644 index 583db57532..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/green_thorns_top.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/huge_gloom_cap.png b/src/main/resources/assets/twilightforest/textures/blocks/huge_gloom_cap.png deleted file mode 100644 index f9d7fabce5..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/huge_gloom_cap.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/huge_gloom_inside.png b/src/main/resources/assets/twilightforest/textures/blocks/huge_gloom_inside.png deleted file mode 100644 index 32ed881a9c..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/huge_gloom_inside.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/huge_gloom_stem.png b/src/main/resources/assets/twilightforest/textures/blocks/huge_gloom_stem.png deleted file mode 100644 index 04a3a7f5fb..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/huge_gloom_stem.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/huge_lilypad_0.png b/src/main/resources/assets/twilightforest/textures/blocks/huge_lilypad_0.png deleted file mode 100644 index 47f9fde13e..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/huge_lilypad_0.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/huge_lilypad_1.png b/src/main/resources/assets/twilightforest/textures/blocks/huge_lilypad_1.png deleted file mode 100644 index c77d0df305..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/huge_lilypad_1.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/huge_lilypad_2.png b/src/main/resources/assets/twilightforest/textures/blocks/huge_lilypad_2.png deleted file mode 100644 index b8329c91f0..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/huge_lilypad_2.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/huge_lilypad_3.png b/src/main/resources/assets/twilightforest/textures/blocks/huge_lilypad_3.png deleted file mode 100644 index 81da5bb818..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/huge_lilypad_3.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/huge_stalk.png b/src/main/resources/assets/twilightforest/textures/blocks/huge_stalk.png deleted file mode 100644 index 013f2ea83a..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/huge_stalk.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/huge_stalk_top.png b/src/main/resources/assets/twilightforest/textures/blocks/huge_stalk_top.png deleted file mode 100644 index 0b7803bab7..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/huge_stalk_top.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/huge_waterlily.png b/src/main/resources/assets/twilightforest/textures/blocks/huge_waterlily.png deleted file mode 100644 index 1e27f368ce..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/huge_waterlily.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/knightbrick.png b/src/main/resources/assets/twilightforest/textures/blocks/knightbrick.png deleted file mode 100644 index a29d95076a..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/knightbrick.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/knightbrick_cracked.png b/src/main/resources/assets/twilightforest/textures/blocks/knightbrick_cracked.png deleted file mode 100644 index ffd07db4ac..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/knightbrick_cracked.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/knightbrick_floor.png b/src/main/resources/assets/twilightforest/textures/blocks/knightbrick_floor.png deleted file mode 100644 index 5316014ddf..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/knightbrick_floor.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/knightbrick_mossy.png b/src/main/resources/assets/twilightforest/textures/blocks/knightbrick_mossy.png deleted file mode 100644 index a31bfb6979..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/knightbrick_mossy.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/knightmetal_block.png b/src/main/resources/assets/twilightforest/textures/blocks/knightmetal_block.png deleted file mode 100644 index fe23eb3227..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/knightmetal_block.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/mangrove_side.png b/src/main/resources/assets/twilightforest/textures/blocks/mangrove_side.png deleted file mode 100644 index a2888742ee..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/mangrove_side.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/mangrove_top.png b/src/main/resources/assets/twilightforest/textures/blocks/mangrove_top.png deleted file mode 100644 index feb1470751..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/mangrove_top.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/mayapple.png b/src/main/resources/assets/twilightforest/textures/blocks/mayapple.png deleted file mode 100644 index 7753dc0ce4..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/mayapple.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/mayapple_side.png b/src/main/resources/assets/twilightforest/textures/blocks/mayapple_side.png deleted file mode 100644 index 60ba6300a2..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/mayapple_side.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/mazestone_decorative.png b/src/main/resources/assets/twilightforest/textures/blocks/mazestone_decorative.png deleted file mode 100644 index 56336e210d..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/mazestone_decorative.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/mazestone_mossy.png b/src/main/resources/assets/twilightforest/textures/blocks/mazestone_mossy.png deleted file mode 100644 index 6e3b132cc6..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/mazestone_mossy.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/mazestone_pillar.png b/src/main/resources/assets/twilightforest/textures/blocks/mazestone_pillar.png deleted file mode 100644 index 5af7ab9159..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/mazestone_pillar.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/mazestone_plain.png b/src/main/resources/assets/twilightforest/textures/blocks/mazestone_plain.png deleted file mode 100644 index 9db291ece0..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/mazestone_plain.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/mine_gem.png b/src/main/resources/assets/twilightforest/textures/blocks/mine_gem.png deleted file mode 100644 index 085dfef53e..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/mine_gem.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/mine_gem_off.png b/src/main/resources/assets/twilightforest/textures/blocks/mine_gem_off.png deleted file mode 100644 index 540ca2985c..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/mine_gem_off.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/mine_side.png b/src/main/resources/assets/twilightforest/textures/blocks/mine_side.png deleted file mode 100644 index 479057a7a8..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/mine_side.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/mosspatch.png b/src/main/resources/assets/twilightforest/textures/blocks/mosspatch.png deleted file mode 100644 index f0dce5f978..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/mosspatch.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/mushgloom.png b/src/main/resources/assets/twilightforest/textures/blocks/mushgloom.png deleted file mode 100644 index bb33efc697..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/mushgloom.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/oak_side.png b/src/main/resources/assets/twilightforest/textures/blocks/oak_side.png deleted file mode 100644 index 3687cda429..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/oak_side.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/oak_top.png b/src/main/resources/assets/twilightforest/textures/blocks/oak_top.png deleted file mode 100644 index 33d3e46055..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/oak_top.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/oreroots.png b/src/main/resources/assets/twilightforest/textures/blocks/oreroots.png deleted file mode 100644 index 1858fd558d..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/oreroots.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/pedestal_hydra.png b/src/main/resources/assets/twilightforest/textures/blocks/pedestal_hydra.png deleted file mode 100644 index f2ac3aa213..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/pedestal_hydra.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/pedestal_hydra_active.png b/src/main/resources/assets/twilightforest/textures/blocks/pedestal_hydra_active.png deleted file mode 100644 index c1c5d1a8a7..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/pedestal_hydra_active.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/pedestal_lich.png b/src/main/resources/assets/twilightforest/textures/blocks/pedestal_lich.png deleted file mode 100644 index 15da25ffa5..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/pedestal_lich.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/pedestal_lich_active.png b/src/main/resources/assets/twilightforest/textures/blocks/pedestal_lich_active.png deleted file mode 100644 index 3c7be2b445..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/pedestal_lich_active.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/pedestal_naga.png b/src/main/resources/assets/twilightforest/textures/blocks/pedestal_naga.png deleted file mode 100644 index 717654d309..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/pedestal_naga.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/pedestal_naga_active.png b/src/main/resources/assets/twilightforest/textures/blocks/pedestal_naga_active.png deleted file mode 100644 index 45ed3ab989..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/pedestal_naga_active.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/pedestal_top.png b/src/main/resources/assets/twilightforest/textures/blocks/pedestal_top.png deleted file mode 100644 index a9f556ca7d..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/pedestal_top.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/pedestal_top_active.png b/src/main/resources/assets/twilightforest/textures/blocks/pedestal_top_active.png deleted file mode 100644 index 8be0730175..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/pedestal_top_active.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/pedestal_urghast.png b/src/main/resources/assets/twilightforest/textures/blocks/pedestal_urghast.png deleted file mode 100644 index c4ebf486fe..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/pedestal_urghast.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/pedestal_urghast_active.png b/src/main/resources/assets/twilightforest/textures/blocks/pedestal_urghast_active.png deleted file mode 100644 index 6611271139..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/pedestal_urghast_active.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/ripe_torch_cluster.png b/src/main/resources/assets/twilightforest/textures/blocks/ripe_torch_cluster.png deleted file mode 100644 index b6e16023e8..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/ripe_torch_cluster.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/rootblock.png b/src/main/resources/assets/twilightforest/textures/blocks/rootblock.png deleted file mode 100644 index bfed4d7163..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/rootblock.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/sapling_canopy.png b/src/main/resources/assets/twilightforest/textures/blocks/sapling_canopy.png deleted file mode 100644 index 3789390406..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/sapling_canopy.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/sapling_darkwood.png b/src/main/resources/assets/twilightforest/textures/blocks/sapling_darkwood.png deleted file mode 100644 index dc84363c9c..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/sapling_darkwood.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/sapling_mangrove.png b/src/main/resources/assets/twilightforest/textures/blocks/sapling_mangrove.png deleted file mode 100644 index a569d30e15..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/sapling_mangrove.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/sapling_mining.png b/src/main/resources/assets/twilightforest/textures/blocks/sapling_mining.png deleted file mode 100644 index ab4198d10b..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/sapling_mining.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/sapling_sorting.png b/src/main/resources/assets/twilightforest/textures/blocks/sapling_sorting.png deleted file mode 100644 index 1d5550fde1..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/sapling_sorting.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/sapling_time.png b/src/main/resources/assets/twilightforest/textures/blocks/sapling_time.png deleted file mode 100644 index a42b887006..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/sapling_time.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/sapling_transformation.png b/src/main/resources/assets/twilightforest/textures/blocks/sapling_transformation.png deleted file mode 100644 index 1d448f0625..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/sapling_transformation.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/shield_inside.png b/src/main/resources/assets/twilightforest/textures/blocks/shield_inside.png deleted file mode 100644 index 96e88acc25..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/shield_inside.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/shield_outside.png b/src/main/resources/assets/twilightforest/textures/blocks/shield_outside.png deleted file mode 100644 index 2c2df0ca77..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/shield_outside.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/slider_h.png b/src/main/resources/assets/twilightforest/textures/blocks/slider_h.png deleted file mode 100644 index acd583c63e..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/slider_h.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/slider_top.png b/src/main/resources/assets/twilightforest/textures/blocks/slider_top.png deleted file mode 100644 index b82db561a5..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/slider_top.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/slider_v.png b/src/main/resources/assets/twilightforest/textures/blocks/slider_v.png deleted file mode 100644 index 1a0f3c17df..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/slider_v.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/sort_eye.png b/src/main/resources/assets/twilightforest/textures/blocks/sort_eye.png deleted file mode 100644 index 89ee11e5c1..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/sort_eye.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/sort_eye_off.png b/src/main/resources/assets/twilightforest/textures/blocks/sort_eye_off.png deleted file mode 100644 index 2613198e08..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/sort_eye_off.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/sort_leaves.png b/src/main/resources/assets/twilightforest/textures/blocks/sort_leaves.png deleted file mode 100644 index 6acebd5be6..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/sort_leaves.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/sort_section.png b/src/main/resources/assets/twilightforest/textures/blocks/sort_section.png deleted file mode 100644 index abca9140a5..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/sort_section.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/thornRose.png b/src/main/resources/assets/twilightforest/textures/blocks/thornRose.png deleted file mode 100644 index 7db390eeee..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/thornRose.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/time_clock.png b/src/main/resources/assets/twilightforest/textures/blocks/time_clock.png deleted file mode 100644 index 610840fd5e..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/time_clock.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/time_clock_off.png b/src/main/resources/assets/twilightforest/textures/blocks/time_clock_off.png deleted file mode 100644 index 0559c97441..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/time_clock_off.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/time_leaves.png b/src/main/resources/assets/twilightforest/textures/blocks/time_leaves.png deleted file mode 100644 index cc92011a85..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/time_leaves.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/time_section.png b/src/main/resources/assets/twilightforest/textures/blocks/time_section.png deleted file mode 100644 index d15e09d5a6..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/time_section.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/time_side.png b/src/main/resources/assets/twilightforest/textures/blocks/time_side.png deleted file mode 100644 index 161b9c9fcc..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/time_side.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/torchberry.png b/src/main/resources/assets/twilightforest/textures/blocks/torchberry.png deleted file mode 100644 index 4f1937482d..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/torchberry.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/towerdev_firejet_off.png b/src/main/resources/assets/twilightforest/textures/blocks/towerdev_firejet_off.png deleted file mode 100644 index ea7760fe45..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/towerdev_firejet_off.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/towerdev_firejet_on.png b/src/main/resources/assets/twilightforest/textures/blocks/towerdev_firejet_on.png deleted file mode 100644 index 86801c95f8..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/towerdev_firejet_on.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/towerdev_ghasttrap_off.png b/src/main/resources/assets/twilightforest/textures/blocks/towerdev_ghasttrap_off.png deleted file mode 100644 index 0bb27a3446..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/towerdev_ghasttrap_off.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/towerdev_ghasttrap_on.png b/src/main/resources/assets/twilightforest/textures/blocks/towerdev_ghasttrap_on.png deleted file mode 100644 index d8a4665c7a..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/towerdev_ghasttrap_on.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/towerdev_ghasttraplid_off.png b/src/main/resources/assets/twilightforest/textures/blocks/towerdev_ghasttraplid_off.png deleted file mode 100644 index 3c29f581eb..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/towerdev_ghasttraplid_off.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/towerdev_ghasttraplid_on.png b/src/main/resources/assets/twilightforest/textures/blocks/towerdev_ghasttraplid_on.png deleted file mode 100644 index caad218629..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/towerdev_ghasttraplid_on.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/towerdev_reactor_off.png b/src/main/resources/assets/twilightforest/textures/blocks/towerdev_reactor_off.png deleted file mode 100644 index 1b1e9a7101..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/towerdev_reactor_off.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/towerdev_reactor_on.png b/src/main/resources/assets/twilightforest/textures/blocks/towerdev_reactor_on.png deleted file mode 100644 index 8a796620a5..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/towerdev_reactor_on.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/towerdev_smoker_off.png b/src/main/resources/assets/twilightforest/textures/blocks/towerdev_smoker_off.png deleted file mode 100644 index 60deb8941e..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/towerdev_smoker_off.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/towerdev_smoker_on.png b/src/main/resources/assets/twilightforest/textures/blocks/towerdev_smoker_on.png deleted file mode 100644 index 5907ec47d3..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/towerdev_smoker_on.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/trans_heart.png b/src/main/resources/assets/twilightforest/textures/blocks/trans_heart.png deleted file mode 100644 index 2ef5663315..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/trans_heart.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/trans_heart_off.png b/src/main/resources/assets/twilightforest/textures/blocks/trans_heart_off.png deleted file mode 100644 index 927442d60d..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/trans_heart_off.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/trans_leaves.png b/src/main/resources/assets/twilightforest/textures/blocks/trans_leaves.png deleted file mode 100644 index 5dd044e1c0..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/trans_leaves.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/trans_side.png b/src/main/resources/assets/twilightforest/textures/blocks/trans_side.png deleted file mode 100644 index bc2ca895a5..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/trans_side.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/troll_root.png b/src/main/resources/assets/twilightforest/textures/blocks/troll_root.png deleted file mode 100644 index 37e7925b55..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/troll_root.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/trollsteinn.png b/src/main/resources/assets/twilightforest/textures/blocks/trollsteinn.png deleted file mode 100644 index 6d0321ea29..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/trollsteinn.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/trollsteinn_light.png b/src/main/resources/assets/twilightforest/textures/blocks/trollsteinn_light.png deleted file mode 100644 index 0154d6bda5..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/trollsteinn_light.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/uncrafting_top.png b/src/main/resources/assets/twilightforest/textures/blocks/uncrafting_top.png deleted file mode 100644 index ba686bf9c8..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/uncrafting_top.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/unripe_torch_cluster.png b/src/main/resources/assets/twilightforest/textures/blocks/unripe_torch_cluster.png deleted file mode 100644 index 863696d638..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/unripe_torch_cluster.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/wispy_cloud.png b/src/main/resources/assets/twilightforest/textures/blocks/wispy_cloud.png deleted file mode 100644 index bf761e6479..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/blocks/wispy_cloud.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/entity/banner/alpha_yeti.png b/src/main/resources/assets/twilightforest/textures/entity/banner/alpha_yeti.png new file mode 100644 index 0000000000..db2bd6f0dc Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/entity/banner/alpha_yeti.png differ diff --git a/src/main/resources/assets/twilightforest/textures/entity/banner/hydra.png b/src/main/resources/assets/twilightforest/textures/entity/banner/hydra.png new file mode 100644 index 0000000000..1a113b67f5 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/entity/banner/hydra.png differ diff --git a/src/main/resources/assets/twilightforest/textures/entity/banner/knight_phantom.png b/src/main/resources/assets/twilightforest/textures/entity/banner/knight_phantom.png new file mode 100644 index 0000000000..25955447b2 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/entity/banner/knight_phantom.png differ diff --git a/src/main/resources/assets/twilightforest/textures/entity/banner/lich.png b/src/main/resources/assets/twilightforest/textures/entity/banner/lich.png new file mode 100644 index 0000000000..92ec24e3cc Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/entity/banner/lich.png differ diff --git a/src/main/resources/assets/twilightforest/textures/entity/banner/minoshroom.png b/src/main/resources/assets/twilightforest/textures/entity/banner/minoshroom.png new file mode 100644 index 0000000000..9ba80f307d Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/entity/banner/minoshroom.png differ diff --git a/src/main/resources/assets/twilightforest/textures/entity/banner/naga.png b/src/main/resources/assets/twilightforest/textures/entity/banner/naga.png new file mode 100644 index 0000000000..2509a013df Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/entity/banner/naga.png differ diff --git a/src/main/resources/assets/twilightforest/textures/entity/banner/quest_ram.png b/src/main/resources/assets/twilightforest/textures/entity/banner/quest_ram.png new file mode 100644 index 0000000000..3319134b58 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/entity/banner/quest_ram.png differ diff --git a/src/main/resources/assets/twilightforest/textures/entity/banner/snow_queen.png b/src/main/resources/assets/twilightforest/textures/entity/banner/snow_queen.png new file mode 100644 index 0000000000..b92fd3dfde Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/entity/banner/snow_queen.png differ diff --git a/src/main/resources/assets/twilightforest/textures/entity/banner/ur_ghast.png b/src/main/resources/assets/twilightforest/textures/entity/banner/ur_ghast.png new file mode 100644 index 0000000000..0b685a2ce3 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/entity/banner/ur_ghast.png differ diff --git a/src/main/resources/assets/twilightforest/textures/entity/boat/canopy.png b/src/main/resources/assets/twilightforest/textures/entity/boat/canopy.png new file mode 100644 index 0000000000..e301f278b6 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/entity/boat/canopy.png differ diff --git a/src/main/resources/assets/twilightforest/textures/entity/boat/dark.png b/src/main/resources/assets/twilightforest/textures/entity/boat/dark.png new file mode 100644 index 0000000000..1b2bfe7652 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/entity/boat/dark.png differ diff --git a/src/main/resources/assets/twilightforest/textures/entity/boat/mangrove.png b/src/main/resources/assets/twilightforest/textures/entity/boat/mangrove.png new file mode 100644 index 0000000000..8ab1bfa4ed Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/entity/boat/mangrove.png differ diff --git a/src/main/resources/assets/twilightforest/textures/entity/boat/mining.png b/src/main/resources/assets/twilightforest/textures/entity/boat/mining.png new file mode 100644 index 0000000000..c2359982da Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/entity/boat/mining.png differ diff --git a/src/main/resources/assets/twilightforest/textures/entity/boat/sorting.png b/src/main/resources/assets/twilightforest/textures/entity/boat/sorting.png new file mode 100644 index 0000000000..a38bc08cc3 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/entity/boat/sorting.png differ diff --git a/src/main/resources/assets/twilightforest/textures/entity/boat/time.png b/src/main/resources/assets/twilightforest/textures/entity/boat/time.png new file mode 100644 index 0000000000..26ac2af622 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/entity/boat/time.png differ diff --git a/src/main/resources/assets/twilightforest/textures/entity/boat/transformation.png b/src/main/resources/assets/twilightforest/textures/entity/boat/transformation.png new file mode 100644 index 0000000000..56fbffedf6 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/entity/boat/transformation.png differ diff --git a/src/main/resources/assets/twilightforest/textures/entity/boat/twilight_oak.png b/src/main/resources/assets/twilightforest/textures/entity/boat/twilight_oak.png new file mode 100644 index 0000000000..b5c45925ca Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/entity/boat/twilight_oak.png differ diff --git a/src/main/resources/assets/twilightforest/textures/entity/chest_boat/canopy.png b/src/main/resources/assets/twilightforest/textures/entity/chest_boat/canopy.png new file mode 100644 index 0000000000..4a6aef45d9 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/entity/chest_boat/canopy.png differ diff --git a/src/main/resources/assets/twilightforest/textures/entity/chest_boat/dark.png b/src/main/resources/assets/twilightforest/textures/entity/chest_boat/dark.png new file mode 100644 index 0000000000..799c9d0994 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/entity/chest_boat/dark.png differ diff --git a/src/main/resources/assets/twilightforest/textures/entity/chest_boat/mangrove.png b/src/main/resources/assets/twilightforest/textures/entity/chest_boat/mangrove.png new file mode 100644 index 0000000000..913b0a2d25 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/entity/chest_boat/mangrove.png differ diff --git a/src/main/resources/assets/twilightforest/textures/entity/chest_boat/mining.png b/src/main/resources/assets/twilightforest/textures/entity/chest_boat/mining.png new file mode 100644 index 0000000000..e32ef17a0e Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/entity/chest_boat/mining.png differ diff --git a/src/main/resources/assets/twilightforest/textures/entity/chest_boat/sorting.png b/src/main/resources/assets/twilightforest/textures/entity/chest_boat/sorting.png new file mode 100644 index 0000000000..dd68f2060f Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/entity/chest_boat/sorting.png differ diff --git a/src/main/resources/assets/twilightforest/textures/entity/chest_boat/time.png b/src/main/resources/assets/twilightforest/textures/entity/chest_boat/time.png new file mode 100644 index 0000000000..9d929157a4 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/entity/chest_boat/time.png differ diff --git a/src/main/resources/assets/twilightforest/textures/entity/chest_boat/transformation.png b/src/main/resources/assets/twilightforest/textures/entity/chest_boat/transformation.png new file mode 100644 index 0000000000..d942d82fb6 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/entity/chest_boat/transformation.png differ diff --git a/src/main/resources/assets/twilightforest/textures/entity/chest_boat/twilight_oak.png b/src/main/resources/assets/twilightforest/textures/entity/chest_boat/twilight_oak.png new file mode 100644 index 0000000000..b09e06a44f Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/entity/chest_boat/twilight_oak.png differ diff --git a/src/main/resources/assets/twilightforest/textures/entity/shield/alpha_yeti.png b/src/main/resources/assets/twilightforest/textures/entity/shield/alpha_yeti.png new file mode 100644 index 0000000000..52d512e801 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/entity/shield/alpha_yeti.png differ diff --git a/src/main/resources/assets/twilightforest/textures/entity/shield/hydra.png b/src/main/resources/assets/twilightforest/textures/entity/shield/hydra.png new file mode 100644 index 0000000000..8b5f72a869 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/entity/shield/hydra.png differ diff --git a/src/main/resources/assets/twilightforest/textures/entity/shield/knight_phantom.png b/src/main/resources/assets/twilightforest/textures/entity/shield/knight_phantom.png new file mode 100644 index 0000000000..29139bccdd Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/entity/shield/knight_phantom.png differ diff --git a/src/main/resources/assets/twilightforest/textures/entity/shield/lich.png b/src/main/resources/assets/twilightforest/textures/entity/shield/lich.png new file mode 100644 index 0000000000..4589f33737 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/entity/shield/lich.png differ diff --git a/src/main/resources/assets/twilightforest/textures/entity/shield/minoshroom.png b/src/main/resources/assets/twilightforest/textures/entity/shield/minoshroom.png new file mode 100644 index 0000000000..be6bd7855c Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/entity/shield/minoshroom.png differ diff --git a/src/main/resources/assets/twilightforest/textures/entity/shield/naga.png b/src/main/resources/assets/twilightforest/textures/entity/shield/naga.png new file mode 100644 index 0000000000..e2bff19328 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/entity/shield/naga.png differ diff --git a/src/main/resources/assets/twilightforest/textures/entity/shield/quest_ram.png b/src/main/resources/assets/twilightforest/textures/entity/shield/quest_ram.png new file mode 100644 index 0000000000..be6bd7855c Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/entity/shield/quest_ram.png differ diff --git a/src/main/resources/assets/twilightforest/textures/entity/shield/snow_queen.png b/src/main/resources/assets/twilightforest/textures/entity/shield/snow_queen.png new file mode 100644 index 0000000000..212f2b5f23 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/entity/shield/snow_queen.png differ diff --git a/src/main/resources/assets/twilightforest/textures/entity/shield/ur_ghast.png b/src/main/resources/assets/twilightforest/textures/entity/shield/ur_ghast.png new file mode 100644 index 0000000000..54f06f7ffd Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/entity/shield/ur_ghast.png differ diff --git a/src/main/resources/assets/twilightforest/textures/entity/signs/canopy.png b/src/main/resources/assets/twilightforest/textures/entity/signs/canopy.png new file mode 100644 index 0000000000..9026b59a1f Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/entity/signs/canopy.png differ diff --git a/src/main/resources/assets/twilightforest/textures/entity/signs/dark.png b/src/main/resources/assets/twilightforest/textures/entity/signs/dark.png new file mode 100644 index 0000000000..d35723bbaf Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/entity/signs/dark.png differ diff --git a/src/main/resources/assets/twilightforest/textures/entity/signs/mangrove.png b/src/main/resources/assets/twilightforest/textures/entity/signs/mangrove.png new file mode 100644 index 0000000000..9ca43d2eb1 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/entity/signs/mangrove.png differ diff --git a/src/main/resources/assets/twilightforest/textures/entity/signs/mining.png b/src/main/resources/assets/twilightforest/textures/entity/signs/mining.png new file mode 100644 index 0000000000..a90cf6776a Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/entity/signs/mining.png differ diff --git a/src/main/resources/assets/twilightforest/textures/entity/signs/sorting.png b/src/main/resources/assets/twilightforest/textures/entity/signs/sorting.png new file mode 100644 index 0000000000..f04c989961 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/entity/signs/sorting.png differ diff --git a/src/main/resources/assets/twilightforest/textures/entity/signs/timewood.png b/src/main/resources/assets/twilightforest/textures/entity/signs/timewood.png new file mode 100644 index 0000000000..8a37b5e30b Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/entity/signs/timewood.png differ diff --git a/src/main/resources/assets/twilightforest/textures/entity/signs/transformation.png b/src/main/resources/assets/twilightforest/textures/entity/signs/transformation.png new file mode 100644 index 0000000000..a13aff9fde Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/entity/signs/transformation.png differ diff --git a/src/main/resources/assets/twilightforest/textures/entity/signs/twilight_oak.png b/src/main/resources/assets/twilightforest/textures/entity/signs/twilight_oak.png new file mode 100644 index 0000000000..d00918dd9d Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/entity/signs/twilight_oak.png differ diff --git a/src/main/resources/assets/twilightforest/textures/environment/ashes.png b/src/main/resources/assets/twilightforest/textures/environment/ashes.png index fd67142119..c566a3baad 100644 Binary files a/src/main/resources/assets/twilightforest/textures/environment/ashes.png and b/src/main/resources/assets/twilightforest/textures/environment/ashes.png differ diff --git a/src/main/resources/assets/twilightforest/textures/environment/bigrain.png b/src/main/resources/assets/twilightforest/textures/environment/bigrain.png index ba0c9e2884..b5833168d9 100644 Binary files a/src/main/resources/assets/twilightforest/textures/environment/bigrain.png and b/src/main/resources/assets/twilightforest/textures/environment/bigrain.png differ diff --git a/src/main/resources/assets/twilightforest/textures/environment/blizzard.png b/src/main/resources/assets/twilightforest/textures/environment/blizzard.png index 7de8417be6..8003f3c212 100644 Binary files a/src/main/resources/assets/twilightforest/textures/environment/blizzard.png and b/src/main/resources/assets/twilightforest/textures/environment/blizzard.png differ diff --git a/src/main/resources/assets/twilightforest/textures/environment/darkstream.png b/src/main/resources/assets/twilightforest/textures/environment/darkstream.png index eee7fa8b9c..7bea79266b 100644 Binary files a/src/main/resources/assets/twilightforest/textures/environment/darkstream.png and b/src/main/resources/assets/twilightforest/textures/environment/darkstream.png differ diff --git a/src/main/resources/assets/twilightforest/textures/environment/mosquitoes.png b/src/main/resources/assets/twilightforest/textures/environment/mosquitoes.png index c7a5756029..8abe175c97 100644 Binary files a/src/main/resources/assets/twilightforest/textures/environment/mosquitoes.png and b/src/main/resources/assets/twilightforest/textures/environment/mosquitoes.png differ diff --git a/src/main/resources/assets/twilightforest/textures/environment/sparkles.png b/src/main/resources/assets/twilightforest/textures/environment/sparkles.png index a658a3c28e..418112c7f2 100644 Binary files a/src/main/resources/assets/twilightforest/textures/environment/sparkles.png and b/src/main/resources/assets/twilightforest/textures/environment/sparkles.png differ diff --git a/src/main/resources/assets/twilightforest/textures/gui/crumble_horn_jei.png b/src/main/resources/assets/twilightforest/textures/gui/crumble_horn_jei.png new file mode 100644 index 0000000000..456fc07301 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/gui/crumble_horn_jei.png differ diff --git a/src/main/resources/assets/twilightforest/textures/gui/glow_overlay.png b/src/main/resources/assets/twilightforest/textures/gui/glow_overlay.png index eff05777d9..50644d7156 100644 Binary files a/src/main/resources/assets/twilightforest/textures/gui/glow_overlay.png and b/src/main/resources/assets/twilightforest/textures/gui/glow_overlay.png differ diff --git a/src/main/resources/assets/twilightforest/textures/gui/guigoblintinkering.png b/src/main/resources/assets/twilightforest/textures/gui/guigoblintinkering.png index 2407651757..25da384be9 100644 Binary files a/src/main/resources/assets/twilightforest/textures/gui/guigoblintinkering.png and b/src/main/resources/assets/twilightforest/textures/gui/guigoblintinkering.png differ diff --git a/src/main/resources/assets/twilightforest/textures/gui/mapicons.png b/src/main/resources/assets/twilightforest/textures/gui/mapicons.png index 8cffc74e7f..d6c818c2cd 100644 Binary files a/src/main/resources/assets/twilightforest/textures/gui/mapicons.png and b/src/main/resources/assets/twilightforest/textures/gui/mapicons.png differ diff --git a/src/main/resources/assets/twilightforest/textures/gui/tf_icons.png b/src/main/resources/assets/twilightforest/textures/gui/tf_icons.png new file mode 100644 index 0000000000..0c3560874d Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/gui/tf_icons.png differ diff --git a/src/main/resources/assets/twilightforest/textures/gui/transformation_jei.png b/src/main/resources/assets/twilightforest/textures/gui/transformation_jei.png new file mode 100644 index 0000000000..7725f3d10b Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/gui/transformation_jei.png differ diff --git a/src/main/resources/assets/twilightforest/textures/gui/uncrafting_jei.png b/src/main/resources/assets/twilightforest/textures/gui/uncrafting_jei.png new file mode 100644 index 0000000000..15a3784bba Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/gui/uncrafting_jei.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/alpha_yeti_fur.png b/src/main/resources/assets/twilightforest/textures/item/alpha_yeti_fur.png new file mode 100644 index 0000000000..c73b4b3eff Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/alpha_yeti_fur.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/arctic_boots.png b/src/main/resources/assets/twilightforest/textures/item/arctic_boots.png new file mode 100644 index 0000000000..c4a08711bd Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/arctic_boots.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/arctic_boots_0.png b/src/main/resources/assets/twilightforest/textures/item/arctic_boots_0.png new file mode 100644 index 0000000000..ff29b659dd Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/arctic_boots_0.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/arctic_chestplate.png b/src/main/resources/assets/twilightforest/textures/item/arctic_chestplate.png new file mode 100644 index 0000000000..be3e6aa21a Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/arctic_chestplate.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/arctic_chestplate_0.png b/src/main/resources/assets/twilightforest/textures/item/arctic_chestplate_0.png new file mode 100644 index 0000000000..ddfd63fc2a Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/arctic_chestplate_0.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/arctic_fur.png b/src/main/resources/assets/twilightforest/textures/item/arctic_fur.png new file mode 100644 index 0000000000..1923d551bf Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/arctic_fur.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/arctic_helmet.png b/src/main/resources/assets/twilightforest/textures/item/arctic_helmet.png new file mode 100644 index 0000000000..bc3952f8de Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/arctic_helmet.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/arctic_helmet_0.png b/src/main/resources/assets/twilightforest/textures/item/arctic_helmet_0.png new file mode 100644 index 0000000000..b846307bdd Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/arctic_helmet_0.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/arctic_leggings.png b/src/main/resources/assets/twilightforest/textures/item/arctic_leggings.png new file mode 100644 index 0000000000..9c021b93bb Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/arctic_leggings.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/arctic_leggings_0.png b/src/main/resources/assets/twilightforest/textures/item/arctic_leggings_0.png new file mode 100644 index 0000000000..4486c168db Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/arctic_leggings_0.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/armor_shard.png b/src/main/resources/assets/twilightforest/textures/item/armor_shard.png new file mode 100644 index 0000000000..ee1ee8cb2c Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/armor_shard.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/armor_shard_cluster.png b/src/main/resources/assets/twilightforest/textures/item/armor_shard_cluster.png new file mode 100644 index 0000000000..418dbeec9d Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/armor_shard_cluster.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/block_and_chain.png b/src/main/resources/assets/twilightforest/textures/item/block_and_chain.png new file mode 100644 index 0000000000..542c5992c5 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/block_and_chain.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/block_and_chain_thrown.png b/src/main/resources/assets/twilightforest/textures/item/block_and_chain_thrown.png new file mode 100644 index 0000000000..481bd526f3 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/block_and_chain_thrown.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/borer_essence.png b/src/main/resources/assets/twilightforest/textures/item/borer_essence.png new file mode 100644 index 0000000000..dd3fc21cf8 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/borer_essence.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/borer_essence_particles.png b/src/main/resources/assets/twilightforest/textures/item/borer_essence_particles.png new file mode 100644 index 0000000000..6a87db2c68 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/borer_essence_particles.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/brittle_potion_flask.png b/src/main/resources/assets/twilightforest/textures/item/brittle_potion_flask.png new file mode 100644 index 0000000000..4d58e5f2d8 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/brittle_potion_flask.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/brittle_potion_flask_1.png b/src/main/resources/assets/twilightforest/textures/item/brittle_potion_flask_1.png new file mode 100644 index 0000000000..67185d1f55 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/brittle_potion_flask_1.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/brittle_potion_flask_2.png b/src/main/resources/assets/twilightforest/textures/item/brittle_potion_flask_2.png new file mode 100644 index 0000000000..f888832e55 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/brittle_potion_flask_2.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/brittle_potion_flask_3.png b/src/main/resources/assets/twilightforest/textures/item/brittle_potion_flask_3.png new file mode 100644 index 0000000000..71bfa1856c Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/brittle_potion_flask_3.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/brittle_potion_flask_4.png b/src/main/resources/assets/twilightforest/textures/item/brittle_potion_flask_4.png new file mode 100644 index 0000000000..cd57362444 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/brittle_potion_flask_4.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/brittle_potion_flask_chipped.png b/src/main/resources/assets/twilightforest/textures/item/brittle_potion_flask_chipped.png new file mode 100644 index 0000000000..46862d2675 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/brittle_potion_flask_chipped.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/brittle_potion_flask_cracked.png b/src/main/resources/assets/twilightforest/textures/item/brittle_potion_flask_cracked.png new file mode 100644 index 0000000000..2c10aaf8a7 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/brittle_potion_flask_cracked.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/brittle_potion_flask_damaged.png b/src/main/resources/assets/twilightforest/textures/item/brittle_potion_flask_damaged.png new file mode 100644 index 0000000000..4ce3d9ec15 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/brittle_potion_flask_damaged.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/brittle_potion_flask_labelled.png b/src/main/resources/assets/twilightforest/textures/item/brittle_potion_flask_labelled.png new file mode 100644 index 0000000000..587e236846 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/brittle_potion_flask_labelled.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/brittle_potion_flask_splintered.png b/src/main/resources/assets/twilightforest/textures/item/brittle_potion_flask_splintered.png new file mode 100644 index 0000000000..ab4b90e3ca Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/brittle_potion_flask_splintered.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/canopy_boat.png b/src/main/resources/assets/twilightforest/textures/item/canopy_boat.png new file mode 100644 index 0000000000..ffc74f0668 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/canopy_boat.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/canopy_chest_boat.png b/src/main/resources/assets/twilightforest/textures/item/canopy_chest_boat.png new file mode 100644 index 0000000000..096d5b4423 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/canopy_chest_boat.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/canopy_door.png b/src/main/resources/assets/twilightforest/textures/item/canopy_door.png new file mode 100644 index 0000000000..9f79d6e762 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/canopy_door.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/canopy_sign.png b/src/main/resources/assets/twilightforest/textures/item/canopy_sign.png new file mode 100644 index 0000000000..33873eb728 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/canopy_sign.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/carminite.png b/src/main/resources/assets/twilightforest/textures/item/carminite.png new file mode 100644 index 0000000000..1f4c87171d Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/carminite.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/charm_of_keeping_1.png b/src/main/resources/assets/twilightforest/textures/item/charm_of_keeping_1.png new file mode 100644 index 0000000000..caa6b08b2e Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/charm_of_keeping_1.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/charm_of_keeping_2.png b/src/main/resources/assets/twilightforest/textures/item/charm_of_keeping_2.png new file mode 100644 index 0000000000..3cf02c14fd Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/charm_of_keeping_2.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/charm_of_keeping_3.png b/src/main/resources/assets/twilightforest/textures/item/charm_of_keeping_3.png new file mode 100644 index 0000000000..8fd3d8190b Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/charm_of_keeping_3.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/charm_of_life_1.png b/src/main/resources/assets/twilightforest/textures/item/charm_of_life_1.png new file mode 100644 index 0000000000..c9abd90c96 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/charm_of_life_1.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/charm_of_life_2.png b/src/main/resources/assets/twilightforest/textures/item/charm_of_life_2.png new file mode 100644 index 0000000000..35495db220 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/charm_of_life_2.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/cooked_meef.png b/src/main/resources/assets/twilightforest/textures/item/cooked_meef.png new file mode 100644 index 0000000000..2bd91a8b0a Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/cooked_meef.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/cooked_venison.png b/src/main/resources/assets/twilightforest/textures/item/cooked_venison.png new file mode 100644 index 0000000000..7057845a6e Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/cooked_venison.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/copper_coin.png b/src/main/resources/assets/twilightforest/textures/item/copper_coin.png new file mode 100644 index 0000000000..b7348e0fec Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/copper_coin.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/crumble_horn.png b/src/main/resources/assets/twilightforest/textures/item/crumble_horn.png new file mode 100644 index 0000000000..bed47dbd2f Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/crumble_horn.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/cube_of_annihilation.png b/src/main/resources/assets/twilightforest/textures/item/cube_of_annihilation.png new file mode 100644 index 0000000000..c1d5877a8e Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/cube_of_annihilation.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/cube_of_annihilation_thrown.png b/src/main/resources/assets/twilightforest/textures/item/cube_of_annihilation_thrown.png new file mode 100644 index 0000000000..eefede70a4 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/cube_of_annihilation_thrown.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/cube_talisman.png b/src/main/resources/assets/twilightforest/textures/item/cube_talisman.png new file mode 100644 index 0000000000..229508412e Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/cube_talisman.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/dark_boat.png b/src/main/resources/assets/twilightforest/textures/item/dark_boat.png new file mode 100644 index 0000000000..685228e8e1 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/dark_boat.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/dark_chest_boat.png b/src/main/resources/assets/twilightforest/textures/item/dark_chest_boat.png new file mode 100644 index 0000000000..6e35ef0a89 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/dark_chest_boat.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/dark_door.png b/src/main/resources/assets/twilightforest/textures/item/dark_door.png new file mode 100644 index 0000000000..b30e3e9146 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/dark_door.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/dark_sign.png b/src/main/resources/assets/twilightforest/textures/item/dark_sign.png new file mode 100644 index 0000000000..5dbb2a098f Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/dark_sign.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/diamond_minotaur_axe.png b/src/main/resources/assets/twilightforest/textures/item/diamond_minotaur_axe.png new file mode 100644 index 0000000000..5417fbf2eb Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/diamond_minotaur_axe.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/ender_bow.png b/src/main/resources/assets/twilightforest/textures/item/ender_bow.png new file mode 100644 index 0000000000..44c3245677 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/ender_bow.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/ender_bow_pulling_0.png b/src/main/resources/assets/twilightforest/textures/item/ender_bow_pulling_0.png new file mode 100644 index 0000000000..9c8fd78094 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/ender_bow_pulling_0.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/ender_bow_pulling_1.png b/src/main/resources/assets/twilightforest/textures/item/ender_bow_pulling_1.png new file mode 100644 index 0000000000..996c02818c Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/ender_bow_pulling_1.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/ender_bow_pulling_2.png b/src/main/resources/assets/twilightforest/textures/item/ender_bow_pulling_2.png new file mode 100644 index 0000000000..f6b79166dd Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/ender_bow_pulling_2.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/experiment_115.png b/src/main/resources/assets/twilightforest/textures/item/experiment_115.png new file mode 100644 index 0000000000..2a13fdda9b Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/experiment_115.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/fiery_blood.png b/src/main/resources/assets/twilightforest/textures/item/fiery_blood.png new file mode 100644 index 0000000000..b36117bab2 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/fiery_blood.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/fiery_boots.png b/src/main/resources/assets/twilightforest/textures/item/fiery_boots.png new file mode 100644 index 0000000000..e0c63c17f3 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/fiery_boots.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/fiery_boots.png.mcmeta b/src/main/resources/assets/twilightforest/textures/item/fiery_boots.png.mcmeta new file mode 100644 index 0000000000..9278e23cb5 --- /dev/null +++ b/src/main/resources/assets/twilightforest/textures/item/fiery_boots.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 18 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/textures/item/fiery_chestplate.png b/src/main/resources/assets/twilightforest/textures/item/fiery_chestplate.png new file mode 100644 index 0000000000..90fbaba527 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/fiery_chestplate.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/fiery_chestplate.png.mcmeta b/src/main/resources/assets/twilightforest/textures/item/fiery_chestplate.png.mcmeta new file mode 100644 index 0000000000..9278e23cb5 --- /dev/null +++ b/src/main/resources/assets/twilightforest/textures/item/fiery_chestplate.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 18 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/textures/item/fiery_helmet.png b/src/main/resources/assets/twilightforest/textures/item/fiery_helmet.png new file mode 100644 index 0000000000..4a7a204a35 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/fiery_helmet.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/fiery_helmet.png.mcmeta b/src/main/resources/assets/twilightforest/textures/item/fiery_helmet.png.mcmeta new file mode 100644 index 0000000000..9278e23cb5 --- /dev/null +++ b/src/main/resources/assets/twilightforest/textures/item/fiery_helmet.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 18 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/textures/item/fiery_ingot.png b/src/main/resources/assets/twilightforest/textures/item/fiery_ingot.png new file mode 100644 index 0000000000..614ea6cf1f Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/fiery_ingot.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/fiery_ingot.png.mcmeta b/src/main/resources/assets/twilightforest/textures/item/fiery_ingot.png.mcmeta new file mode 100644 index 0000000000..9278e23cb5 --- /dev/null +++ b/src/main/resources/assets/twilightforest/textures/item/fiery_ingot.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 18 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/textures/item/fiery_leggings.png b/src/main/resources/assets/twilightforest/textures/item/fiery_leggings.png new file mode 100644 index 0000000000..705004b60d Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/fiery_leggings.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/fiery_leggings.png.mcmeta b/src/main/resources/assets/twilightforest/textures/item/fiery_leggings.png.mcmeta new file mode 100644 index 0000000000..9278e23cb5 --- /dev/null +++ b/src/main/resources/assets/twilightforest/textures/item/fiery_leggings.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 18 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/textures/item/fiery_pickaxe.png b/src/main/resources/assets/twilightforest/textures/item/fiery_pickaxe.png new file mode 100644 index 0000000000..f2b397ccfa Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/fiery_pickaxe.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/fiery_pickaxe.png.mcmeta b/src/main/resources/assets/twilightforest/textures/item/fiery_pickaxe.png.mcmeta new file mode 100644 index 0000000000..9278e23cb5 --- /dev/null +++ b/src/main/resources/assets/twilightforest/textures/item/fiery_pickaxe.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 18 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/textures/item/fiery_sword.png b/src/main/resources/assets/twilightforest/textures/item/fiery_sword.png new file mode 100644 index 0000000000..aa6c0f56e0 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/fiery_sword.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/fiery_sword.png.mcmeta b/src/main/resources/assets/twilightforest/textures/item/fiery_sword.png.mcmeta new file mode 100644 index 0000000000..9278e23cb5 --- /dev/null +++ b/src/main/resources/assets/twilightforest/textures/item/fiery_sword.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 18 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/textures/item/fiery_tears.png b/src/main/resources/assets/twilightforest/textures/item/fiery_tears.png new file mode 100644 index 0000000000..df81c322f3 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/fiery_tears.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/filled_magic_map.png b/src/main/resources/assets/twilightforest/textures/item/filled_magic_map.png new file mode 100644 index 0000000000..7003686bab Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/filled_magic_map.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/filled_maze_map.png b/src/main/resources/assets/twilightforest/textures/item/filled_maze_map.png new file mode 100644 index 0000000000..81e9d8bf96 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/filled_maze_map.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/filled_ore_map.png b/src/main/resources/assets/twilightforest/textures/item/filled_ore_map.png new file mode 100644 index 0000000000..d6ccaa9f40 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/filled_ore_map.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/fortification_scepter.png b/src/main/resources/assets/twilightforest/textures/item/fortification_scepter.png new file mode 100644 index 0000000000..2e8a40edcb Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/fortification_scepter.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/glass_sword_clear.png b/src/main/resources/assets/twilightforest/textures/item/glass_sword_clear.png new file mode 100644 index 0000000000..23812dbae3 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/glass_sword_clear.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/glass_sword_solid.png b/src/main/resources/assets/twilightforest/textures/item/glass_sword_solid.png new file mode 100644 index 0000000000..7f5304aa17 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/glass_sword_solid.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/gold_minotaur_axe.png b/src/main/resources/assets/twilightforest/textures/item/gold_minotaur_axe.png new file mode 100644 index 0000000000..5ff375d804 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/gold_minotaur_axe.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/greater_potion_flask.png b/src/main/resources/assets/twilightforest/textures/item/greater_potion_flask.png new file mode 100644 index 0000000000..fd98051702 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/greater_potion_flask.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/greater_potion_flask_1.png b/src/main/resources/assets/twilightforest/textures/item/greater_potion_flask_1.png new file mode 100644 index 0000000000..4de7a062ee Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/greater_potion_flask_1.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/greater_potion_flask_2.png b/src/main/resources/assets/twilightforest/textures/item/greater_potion_flask_2.png new file mode 100644 index 0000000000..8c11df9a33 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/greater_potion_flask_2.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/greater_potion_flask_3.png b/src/main/resources/assets/twilightforest/textures/item/greater_potion_flask_3.png new file mode 100644 index 0000000000..5ec505a323 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/greater_potion_flask_3.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/greater_potion_flask_4.png b/src/main/resources/assets/twilightforest/textures/item/greater_potion_flask_4.png new file mode 100644 index 0000000000..4d63737831 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/greater_potion_flask_4.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/hydra_chop.png b/src/main/resources/assets/twilightforest/textures/item/hydra_chop.png new file mode 100644 index 0000000000..d9d68af95d Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/hydra_chop.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/ice_bomb.png b/src/main/resources/assets/twilightforest/textures/item/ice_bomb.png new file mode 100644 index 0000000000..095b2d6fb2 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/ice_bomb.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/ice_bow_clear.png b/src/main/resources/assets/twilightforest/textures/item/ice_bow_clear.png new file mode 100644 index 0000000000..f0deb6eca3 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/ice_bow_clear.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/ice_bow_clear_pulling_0.png b/src/main/resources/assets/twilightforest/textures/item/ice_bow_clear_pulling_0.png new file mode 100644 index 0000000000..359bd4eba8 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/ice_bow_clear_pulling_0.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/ice_bow_clear_pulling_1.png b/src/main/resources/assets/twilightforest/textures/item/ice_bow_clear_pulling_1.png new file mode 100644 index 0000000000..43881c335f Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/ice_bow_clear_pulling_1.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/ice_bow_clear_pulling_2.png b/src/main/resources/assets/twilightforest/textures/item/ice_bow_clear_pulling_2.png new file mode 100644 index 0000000000..943d8e6c24 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/ice_bow_clear_pulling_2.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/ice_bow_solid.png b/src/main/resources/assets/twilightforest/textures/item/ice_bow_solid.png new file mode 100644 index 0000000000..9f5bdcacfe Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/ice_bow_solid.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/ice_bow_solid_pulling_0.png b/src/main/resources/assets/twilightforest/textures/item/ice_bow_solid_pulling_0.png new file mode 100644 index 0000000000..d974a82021 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/ice_bow_solid_pulling_0.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/ice_bow_solid_pulling_1.png b/src/main/resources/assets/twilightforest/textures/item/ice_bow_solid_pulling_1.png new file mode 100644 index 0000000000..778d08b446 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/ice_bow_solid_pulling_1.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/ice_bow_solid_pulling_2.png b/src/main/resources/assets/twilightforest/textures/item/ice_bow_solid_pulling_2.png new file mode 100644 index 0000000000..3ea561ed59 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/ice_bow_solid_pulling_2.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/ice_sword_clear.png b/src/main/resources/assets/twilightforest/textures/item/ice_sword_clear.png new file mode 100644 index 0000000000..3e6698280b Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/ice_sword_clear.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/ice_sword_solid.png b/src/main/resources/assets/twilightforest/textures/item/ice_sword_solid.png new file mode 100644 index 0000000000..80bcfd70f9 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/ice_sword_solid.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/ironwood_axe.png b/src/main/resources/assets/twilightforest/textures/item/ironwood_axe.png new file mode 100644 index 0000000000..c56cf95f1e Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/ironwood_axe.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/ironwood_boots.png b/src/main/resources/assets/twilightforest/textures/item/ironwood_boots.png new file mode 100644 index 0000000000..edc63a20c5 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/ironwood_boots.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/ironwood_chestplate.png b/src/main/resources/assets/twilightforest/textures/item/ironwood_chestplate.png new file mode 100644 index 0000000000..326687fb87 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/ironwood_chestplate.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/ironwood_helmet.png b/src/main/resources/assets/twilightforest/textures/item/ironwood_helmet.png new file mode 100644 index 0000000000..2de3eee926 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/ironwood_helmet.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/ironwood_hoe.png b/src/main/resources/assets/twilightforest/textures/item/ironwood_hoe.png new file mode 100644 index 0000000000..3ecad39a34 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/ironwood_hoe.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/ironwood_ingot.png b/src/main/resources/assets/twilightforest/textures/item/ironwood_ingot.png new file mode 100644 index 0000000000..0c9a557e66 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/ironwood_ingot.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/ironwood_leggings.png b/src/main/resources/assets/twilightforest/textures/item/ironwood_leggings.png new file mode 100644 index 0000000000..92785dd72c Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/ironwood_leggings.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/ironwood_pickaxe.png b/src/main/resources/assets/twilightforest/textures/item/ironwood_pickaxe.png new file mode 100644 index 0000000000..593c117bf1 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/ironwood_pickaxe.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/ironwood_shovel.png b/src/main/resources/assets/twilightforest/textures/item/ironwood_shovel.png new file mode 100644 index 0000000000..5b72d2a221 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/ironwood_shovel.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/ironwood_sword.png b/src/main/resources/assets/twilightforest/textures/item/ironwood_sword.png new file mode 100644 index 0000000000..bab2cc36fa Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/ironwood_sword.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/knightmetal_axe.png b/src/main/resources/assets/twilightforest/textures/item/knightmetal_axe.png new file mode 100644 index 0000000000..16f253ef75 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/knightmetal_axe.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/knightmetal_boots.png b/src/main/resources/assets/twilightforest/textures/item/knightmetal_boots.png new file mode 100644 index 0000000000..3d995bf79a Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/knightmetal_boots.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/knightmetal_chestplate.png b/src/main/resources/assets/twilightforest/textures/item/knightmetal_chestplate.png new file mode 100644 index 0000000000..1303a05d49 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/knightmetal_chestplate.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/knightmetal_helmet.png b/src/main/resources/assets/twilightforest/textures/item/knightmetal_helmet.png new file mode 100644 index 0000000000..16c912c498 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/knightmetal_helmet.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/knightmetal_ingot.png b/src/main/resources/assets/twilightforest/textures/item/knightmetal_ingot.png new file mode 100644 index 0000000000..eb350d6b54 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/knightmetal_ingot.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/knightmetal_leggings.png b/src/main/resources/assets/twilightforest/textures/item/knightmetal_leggings.png new file mode 100644 index 0000000000..4003d15092 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/knightmetal_leggings.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/knightmetal_pickaxe.png b/src/main/resources/assets/twilightforest/textures/item/knightmetal_pickaxe.png new file mode 100644 index 0000000000..6f8e8ebdf9 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/knightmetal_pickaxe.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/knightmetal_ring.png b/src/main/resources/assets/twilightforest/textures/item/knightmetal_ring.png new file mode 100644 index 0000000000..df8dd09740 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/knightmetal_ring.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/knightmetal_sword.png b/src/main/resources/assets/twilightforest/textures/item/knightmetal_sword.png new file mode 100644 index 0000000000..9578c508c9 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/knightmetal_sword.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/lamp_of_cinders.png b/src/main/resources/assets/twilightforest/textures/item/lamp_of_cinders.png new file mode 100644 index 0000000000..362697a0b5 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/lamp_of_cinders.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/lich_shield_fill.png b/src/main/resources/assets/twilightforest/textures/item/lich_shield_fill.png new file mode 100644 index 0000000000..217ac92771 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/lich_shield_fill.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/lich_shield_frame.png b/src/main/resources/assets/twilightforest/textures/item/lich_shield_frame.png new file mode 100644 index 0000000000..c4b769245b Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/lich_shield_frame.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/lifedrain_scepter.png b/src/main/resources/assets/twilightforest/textures/item/lifedrain_scepter.png new file mode 100644 index 0000000000..abe0e9d153 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/lifedrain_scepter.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/liveroot.png b/src/main/resources/assets/twilightforest/textures/item/liveroot.png new file mode 100644 index 0000000000..410da7a506 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/liveroot.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/magic_beans.png b/src/main/resources/assets/twilightforest/textures/item/magic_beans.png new file mode 100644 index 0000000000..f53475e524 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/magic_beans.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/magic_map.png b/src/main/resources/assets/twilightforest/textures/item/magic_map.png new file mode 100644 index 0000000000..70c26dc36a Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/magic_map.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/magic_map_focus.png b/src/main/resources/assets/twilightforest/textures/item/magic_map_focus.png new file mode 100644 index 0000000000..22b7f03024 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/magic_map_focus.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/mangrove_boat.png b/src/main/resources/assets/twilightforest/textures/item/mangrove_boat.png new file mode 100644 index 0000000000..7c37444337 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/mangrove_boat.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/mangrove_chest_boat.png b/src/main/resources/assets/twilightforest/textures/item/mangrove_chest_boat.png new file mode 100644 index 0000000000..5a06ffe4eb Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/mangrove_chest_boat.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/mangrove_door.png b/src/main/resources/assets/twilightforest/textures/item/mangrove_door.png new file mode 100644 index 0000000000..93ae6355f8 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/mangrove_door.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/mangrove_sign.png b/src/main/resources/assets/twilightforest/textures/item/mangrove_sign.png new file mode 100644 index 0000000000..daf99e7031 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/mangrove_sign.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/maze_map.png b/src/main/resources/assets/twilightforest/textures/item/maze_map.png new file mode 100644 index 0000000000..b6df69ae71 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/maze_map.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/maze_map_focus.png b/src/main/resources/assets/twilightforest/textures/item/maze_map_focus.png new file mode 100644 index 0000000000..6f793e394e Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/maze_map_focus.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/maze_wafer.png b/src/main/resources/assets/twilightforest/textures/item/maze_wafer.png new file mode 100644 index 0000000000..6cf09b01e1 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/maze_wafer.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/mazebreaker_pickaxe.png b/src/main/resources/assets/twilightforest/textures/item/mazebreaker_pickaxe.png new file mode 100644 index 0000000000..9de2072a52 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/mazebreaker_pickaxe.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/meef_stroganoff.png b/src/main/resources/assets/twilightforest/textures/item/meef_stroganoff.png new file mode 100644 index 0000000000..c16c0db705 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/meef_stroganoff.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/mining_boat.png b/src/main/resources/assets/twilightforest/textures/item/mining_boat.png new file mode 100644 index 0000000000..eb28792061 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/mining_boat.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/mining_chest_boat.png b/src/main/resources/assets/twilightforest/textures/item/mining_chest_boat.png new file mode 100644 index 0000000000..ba1ab74bb8 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/mining_chest_boat.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/mining_door.png b/src/main/resources/assets/twilightforest/textures/item/mining_door.png new file mode 100644 index 0000000000..14e91e5a50 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/mining_door.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/mining_sign.png b/src/main/resources/assets/twilightforest/textures/item/mining_sign.png new file mode 100644 index 0000000000..252d302b84 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/mining_sign.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/moon_dial/first_quarter.png b/src/main/resources/assets/twilightforest/textures/item/moon_dial/first_quarter.png new file mode 100644 index 0000000000..3424f76db7 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/moon_dial/first_quarter.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/moon_dial/full.png b/src/main/resources/assets/twilightforest/textures/item/moon_dial/full.png new file mode 100644 index 0000000000..722cc9bd2a Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/moon_dial/full.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/moon_dial/new.png b/src/main/resources/assets/twilightforest/textures/item/moon_dial/new.png new file mode 100644 index 0000000000..2417524d86 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/moon_dial/new.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/moon_dial/third_quarter.png b/src/main/resources/assets/twilightforest/textures/item/moon_dial/third_quarter.png new file mode 100644 index 0000000000..1f9156d7be Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/moon_dial/third_quarter.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/moon_dial/waning_cresent.png b/src/main/resources/assets/twilightforest/textures/item/moon_dial/waning_cresent.png new file mode 100644 index 0000000000..01a6612fea Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/moon_dial/waning_cresent.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/moon_dial/waning_gibbous.png b/src/main/resources/assets/twilightforest/textures/item/moon_dial/waning_gibbous.png new file mode 100644 index 0000000000..7d2b671951 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/moon_dial/waning_gibbous.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/moon_dial/waxing_cresent.png b/src/main/resources/assets/twilightforest/textures/item/moon_dial/waxing_cresent.png new file mode 100644 index 0000000000..eb2a37bcc9 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/moon_dial/waxing_cresent.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/moon_dial/waxing_gibbous.png b/src/main/resources/assets/twilightforest/textures/item/moon_dial/waxing_gibbous.png new file mode 100644 index 0000000000..596688f6b0 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/moon_dial/waxing_gibbous.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/moonworm_queen.png b/src/main/resources/assets/twilightforest/textures/item/moonworm_queen.png new file mode 100644 index 0000000000..e9cdaa79ae Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/moonworm_queen.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/moonworm_queen_alt.png b/src/main/resources/assets/twilightforest/textures/item/moonworm_queen_alt.png new file mode 100644 index 0000000000..d26735e06f Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/moonworm_queen_alt.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/music_disc_findings.png b/src/main/resources/assets/twilightforest/textures/item/music_disc_findings.png new file mode 100644 index 0000000000..1343ab826f Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/music_disc_findings.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/music_disc_home.png b/src/main/resources/assets/twilightforest/textures/item/music_disc_home.png new file mode 100644 index 0000000000..27a08cffdc Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/music_disc_home.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/music_disc_maker.png b/src/main/resources/assets/twilightforest/textures/item/music_disc_maker.png new file mode 100644 index 0000000000..b4051409ab Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/music_disc_maker.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/music_disc_motion.png b/src/main/resources/assets/twilightforest/textures/item/music_disc_motion.png new file mode 100644 index 0000000000..ab9f32b8f3 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/music_disc_motion.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/music_disc_radiance.png b/src/main/resources/assets/twilightforest/textures/item/music_disc_radiance.png new file mode 100644 index 0000000000..097ad580ee Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/music_disc_radiance.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/music_disc_steps.png b/src/main/resources/assets/twilightforest/textures/item/music_disc_steps.png new file mode 100644 index 0000000000..62d30bce7c Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/music_disc_steps.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/music_disc_superstitious.png b/src/main/resources/assets/twilightforest/textures/item/music_disc_superstitious.png new file mode 100644 index 0000000000..32a9be13a5 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/music_disc_superstitious.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/music_disc_thread.png b/src/main/resources/assets/twilightforest/textures/item/music_disc_thread.png new file mode 100644 index 0000000000..ab3c62bf6f Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/music_disc_thread.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/music_disc_wayfarer.png b/src/main/resources/assets/twilightforest/textures/item/music_disc_wayfarer.png new file mode 100644 index 0000000000..7ca936f805 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/music_disc_wayfarer.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/naga_chestplate.png b/src/main/resources/assets/twilightforest/textures/item/naga_chestplate.png new file mode 100644 index 0000000000..eb143f9301 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/naga_chestplate.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/naga_leggings.png b/src/main/resources/assets/twilightforest/textures/item/naga_leggings.png new file mode 100644 index 0000000000..72e70ebc2a Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/naga_leggings.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/naga_scale.png b/src/main/resources/assets/twilightforest/textures/item/naga_scale.png new file mode 100644 index 0000000000..ea4a4399fd Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/naga_scale.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/ore_magnet.png b/src/main/resources/assets/twilightforest/textures/item/ore_magnet.png new file mode 100644 index 0000000000..8a3318982e Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/ore_magnet.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/ore_magnet_pulling_1.png b/src/main/resources/assets/twilightforest/textures/item/ore_magnet_pulling_1.png new file mode 100644 index 0000000000..e6cb674c07 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/ore_magnet_pulling_1.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/ore_magnet_pulling_2.png b/src/main/resources/assets/twilightforest/textures/item/ore_magnet_pulling_2.png new file mode 100644 index 0000000000..99586bf740 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/ore_magnet_pulling_2.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/ore_map.png b/src/main/resources/assets/twilightforest/textures/item/ore_map.png new file mode 100644 index 0000000000..10cbad8b3a Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/ore_map.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/ore_meter.png b/src/main/resources/assets/twilightforest/textures/item/ore_meter.png new file mode 100644 index 0000000000..2cfc837cdf Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/ore_meter.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/peacock_feather_fan.png b/src/main/resources/assets/twilightforest/textures/item/peacock_feather_fan.png new file mode 100644 index 0000000000..afdc5f80f1 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/peacock_feather_fan.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/phantom_chestplate.png b/src/main/resources/assets/twilightforest/textures/item/phantom_chestplate.png new file mode 100644 index 0000000000..f9cd0cb834 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/phantom_chestplate.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/phantom_helmet.png b/src/main/resources/assets/twilightforest/textures/item/phantom_helmet.png new file mode 100644 index 0000000000..352312e03c Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/phantom_helmet.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/raven_feather.png b/src/main/resources/assets/twilightforest/textures/item/raven_feather.png new file mode 100644 index 0000000000..6e31e3c2e1 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/raven_feather.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/raw_ironwood.png b/src/main/resources/assets/twilightforest/textures/item/raw_ironwood.png new file mode 100644 index 0000000000..b45ab3575e Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/raw_ironwood.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/raw_meef.png b/src/main/resources/assets/twilightforest/textures/item/raw_meef.png new file mode 100644 index 0000000000..845e086eaa Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/raw_meef.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/raw_venison.png b/src/main/resources/assets/twilightforest/textures/item/raw_venison.png new file mode 100644 index 0000000000..c8346f5083 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/raw_venison.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/red_thread.png b/src/main/resources/assets/twilightforest/textures/item/red_thread.png new file mode 100644 index 0000000000..9b23786259 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/red_thread.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/seeker_bow.png b/src/main/resources/assets/twilightforest/textures/item/seeker_bow.png new file mode 100644 index 0000000000..5bba59d50b Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/seeker_bow.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/seeker_bow_pulling_0.png b/src/main/resources/assets/twilightforest/textures/item/seeker_bow_pulling_0.png new file mode 100644 index 0000000000..11cf4dde8e Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/seeker_bow_pulling_0.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/seeker_bow_pulling_1.png b/src/main/resources/assets/twilightforest/textures/item/seeker_bow_pulling_1.png new file mode 100644 index 0000000000..abffe58f00 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/seeker_bow_pulling_1.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/seeker_bow_pulling_2.png b/src/main/resources/assets/twilightforest/textures/item/seeker_bow_pulling_2.png new file mode 100644 index 0000000000..29a2de0be2 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/seeker_bow_pulling_2.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/sorting_boat.png b/src/main/resources/assets/twilightforest/textures/item/sorting_boat.png new file mode 100644 index 0000000000..1a1f54df35 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/sorting_boat.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/sorting_chest_boat.png b/src/main/resources/assets/twilightforest/textures/item/sorting_chest_boat.png new file mode 100644 index 0000000000..5f761c0060 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/sorting_chest_boat.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/sorting_door.png b/src/main/resources/assets/twilightforest/textures/item/sorting_door.png new file mode 100644 index 0000000000..ed0f9e5781 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/sorting_door.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/sorting_sign.png b/src/main/resources/assets/twilightforest/textures/item/sorting_sign.png new file mode 100644 index 0000000000..3b91b9f474 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/sorting_sign.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/steeleaf_axe.png b/src/main/resources/assets/twilightforest/textures/item/steeleaf_axe.png new file mode 100644 index 0000000000..172d2daed8 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/steeleaf_axe.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/steeleaf_boots.png b/src/main/resources/assets/twilightforest/textures/item/steeleaf_boots.png new file mode 100644 index 0000000000..aa660dbe44 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/steeleaf_boots.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/steeleaf_chestplate.png b/src/main/resources/assets/twilightforest/textures/item/steeleaf_chestplate.png new file mode 100644 index 0000000000..c167c790dd Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/steeleaf_chestplate.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/steeleaf_helmet.png b/src/main/resources/assets/twilightforest/textures/item/steeleaf_helmet.png new file mode 100644 index 0000000000..4b10d7b3a0 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/steeleaf_helmet.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/steeleaf_hoe.png b/src/main/resources/assets/twilightforest/textures/item/steeleaf_hoe.png new file mode 100644 index 0000000000..72c56b8c12 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/steeleaf_hoe.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/steeleaf_ingot.png b/src/main/resources/assets/twilightforest/textures/item/steeleaf_ingot.png new file mode 100644 index 0000000000..78d6edbdcf Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/steeleaf_ingot.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/steeleaf_leggings.png b/src/main/resources/assets/twilightforest/textures/item/steeleaf_leggings.png new file mode 100644 index 0000000000..fb6c40a836 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/steeleaf_leggings.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/steeleaf_pickaxe.png b/src/main/resources/assets/twilightforest/textures/item/steeleaf_pickaxe.png new file mode 100644 index 0000000000..b99149a98a Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/steeleaf_pickaxe.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/steeleaf_shovel.png b/src/main/resources/assets/twilightforest/textures/item/steeleaf_shovel.png new file mode 100644 index 0000000000..17e9700c65 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/steeleaf_shovel.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/steeleaf_sword.png b/src/main/resources/assets/twilightforest/textures/item/steeleaf_sword.png new file mode 100644 index 0000000000..42ccac22b4 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/steeleaf_sword.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/tf_banner_pattern.png b/src/main/resources/assets/twilightforest/textures/item/tf_banner_pattern.png new file mode 100644 index 0000000000..b0ce27dd24 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/tf_banner_pattern.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/think115.png b/src/main/resources/assets/twilightforest/textures/item/think115.png new file mode 100644 index 0000000000..f48f8a7732 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/think115.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/time_boat.png b/src/main/resources/assets/twilightforest/textures/item/time_boat.png new file mode 100644 index 0000000000..298c496ab8 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/time_boat.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/time_chest_boat.png b/src/main/resources/assets/twilightforest/textures/item/time_chest_boat.png new file mode 100644 index 0000000000..66b0b871d2 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/time_chest_boat.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/time_door.png b/src/main/resources/assets/twilightforest/textures/item/time_door.png new file mode 100644 index 0000000000..3650736e0b Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/time_door.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/time_sign.png b/src/main/resources/assets/twilightforest/textures/item/time_sign.png new file mode 100644 index 0000000000..bd79664555 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/time_sign.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/torchberries.png b/src/main/resources/assets/twilightforest/textures/item/torchberries.png new file mode 100644 index 0000000000..9a837e01a9 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/torchberries.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/tower_key.png b/src/main/resources/assets/twilightforest/textures/item/tower_key.png new file mode 100644 index 0000000000..f48fc08010 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/tower_key.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/transformation_boat.png b/src/main/resources/assets/twilightforest/textures/item/transformation_boat.png new file mode 100644 index 0000000000..9305b763e2 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/transformation_boat.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/transformation_chest_boat.png b/src/main/resources/assets/twilightforest/textures/item/transformation_chest_boat.png new file mode 100644 index 0000000000..630c2d8d27 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/transformation_chest_boat.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/transformation_door.png b/src/main/resources/assets/twilightforest/textures/item/transformation_door.png new file mode 100644 index 0000000000..4501a64c27 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/transformation_door.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/transformation_powder.png b/src/main/resources/assets/twilightforest/textures/item/transformation_powder.png new file mode 100644 index 0000000000..721281f341 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/transformation_powder.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/transformation_sign.png b/src/main/resources/assets/twilightforest/textures/item/transformation_sign.png new file mode 100644 index 0000000000..a00101c8b9 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/transformation_sign.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/triple_bow.png b/src/main/resources/assets/twilightforest/textures/item/triple_bow.png new file mode 100644 index 0000000000..aa50bcedbc Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/triple_bow.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/triple_bow_pulling_0.png b/src/main/resources/assets/twilightforest/textures/item/triple_bow_pulling_0.png new file mode 100644 index 0000000000..fa280e3964 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/triple_bow_pulling_0.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/triple_bow_pulling_1.png b/src/main/resources/assets/twilightforest/textures/item/triple_bow_pulling_1.png new file mode 100644 index 0000000000..7a8679c170 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/triple_bow_pulling_1.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/triple_bow_pulling_2.png b/src/main/resources/assets/twilightforest/textures/item/triple_bow_pulling_2.png new file mode 100644 index 0000000000..6a13a3f333 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/triple_bow_pulling_2.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/trophy.png b/src/main/resources/assets/twilightforest/textures/item/trophy.png new file mode 100644 index 0000000000..1d4b7a66be Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/trophy.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/trophy_minor.png b/src/main/resources/assets/twilightforest/textures/item/trophy_minor.png new file mode 100644 index 0000000000..3416b2066f Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/trophy_minor.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/trophy_quest.png b/src/main/resources/assets/twilightforest/textures/item/trophy_quest.png new file mode 100644 index 0000000000..04d3858768 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/trophy_quest.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/twilight_oak_boat.png b/src/main/resources/assets/twilightforest/textures/item/twilight_oak_boat.png new file mode 100644 index 0000000000..05a7d1a9b5 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/twilight_oak_boat.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/twilight_oak_chest_boat.png b/src/main/resources/assets/twilightforest/textures/item/twilight_oak_chest_boat.png new file mode 100644 index 0000000000..0bdb17f66c Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/twilight_oak_chest_boat.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/twilight_oak_door.png b/src/main/resources/assets/twilightforest/textures/item/twilight_oak_door.png new file mode 100644 index 0000000000..29282288f9 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/twilight_oak_door.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/twilight_oak_sign.png b/src/main/resources/assets/twilightforest/textures/item/twilight_oak_sign.png new file mode 100644 index 0000000000..4f079406aa Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/twilight_oak_sign.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/twilight_orb.png b/src/main/resources/assets/twilightforest/textures/item/twilight_orb.png new file mode 100644 index 0000000000..65ee2856b2 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/twilight_orb.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/twilight_scepter.png b/src/main/resources/assets/twilightforest/textures/item/twilight_scepter.png new file mode 100644 index 0000000000..b657b101e1 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/twilight_scepter.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/yeti_boots.png b/src/main/resources/assets/twilightforest/textures/item/yeti_boots.png new file mode 100644 index 0000000000..d74360efda Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/yeti_boots.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/yeti_chestplate.png b/src/main/resources/assets/twilightforest/textures/item/yeti_chestplate.png new file mode 100644 index 0000000000..05f525611e Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/yeti_chestplate.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/yeti_helmet.png b/src/main/resources/assets/twilightforest/textures/item/yeti_helmet.png new file mode 100644 index 0000000000..6410a525fa Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/yeti_helmet.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/yeti_leggings.png b/src/main/resources/assets/twilightforest/textures/item/yeti_leggings.png new file mode 100644 index 0000000000..a9d22fad0f Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/yeti_leggings.png differ diff --git a/src/main/resources/assets/twilightforest/textures/item/zombie_scepter.png b/src/main/resources/assets/twilightforest/textures/item/zombie_scepter.png new file mode 100644 index 0000000000..d1022f5ae3 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/item/zombie_scepter.png differ diff --git a/src/main/resources/assets/twilightforest/textures/items/alphaFur.png b/src/main/resources/assets/twilightforest/textures/items/alphaFur.png deleted file mode 100644 index 5911c57e90..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/alphaFur.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/annihilate_particle.png b/src/main/resources/assets/twilightforest/textures/items/annihilate_particle.png deleted file mode 100644 index cd279b8c8e..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/annihilate_particle.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/arcticBoots.png b/src/main/resources/assets/twilightforest/textures/items/arcticBoots.png deleted file mode 100644 index ff59bbfcad..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/arcticBoots.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/arcticFur.png b/src/main/resources/assets/twilightforest/textures/items/arcticFur.png deleted file mode 100644 index a250a88e11..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/arcticFur.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/arcticHelm.png b/src/main/resources/assets/twilightforest/textures/items/arcticHelm.png deleted file mode 100644 index b9a3921f9c..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/arcticHelm.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/arcticLegs.png b/src/main/resources/assets/twilightforest/textures/items/arcticLegs.png deleted file mode 100644 index 793870dd25..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/arcticLegs.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/arcticPlate.png b/src/main/resources/assets/twilightforest/textures/items/arcticPlate.png deleted file mode 100644 index 8c848e1595..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/arcticPlate.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/armorShards.png b/src/main/resources/assets/twilightforest/textures/items/armorShards.png deleted file mode 100644 index eaa37fe3a7..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/armorShards.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/borerEssence.png b/src/main/resources/assets/twilightforest/textures/items/borerEssence.png deleted file mode 100644 index c863190efc..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/borerEssence.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/carminite.png b/src/main/resources/assets/twilightforest/textures/items/carminite.png deleted file mode 100644 index aae1ad894d..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/carminite.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/chainBlock.png b/src/main/resources/assets/twilightforest/textures/items/chainBlock.png deleted file mode 100644 index bfbc0bba7a..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/chainBlock.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/crumbleHorn.png b/src/main/resources/assets/twilightforest/textures/items/crumbleHorn.png deleted file mode 100644 index 2e2a03871d..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/crumbleHorn.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/cubeOfAnnihilation.png b/src/main/resources/assets/twilightforest/textures/items/cubeOfAnnihilation.png deleted file mode 100644 index f2333fc9a9..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/cubeOfAnnihilation.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/cubeTalisman.png b/src/main/resources/assets/twilightforest/textures/items/cubeTalisman.png deleted file mode 100644 index 38fb142f44..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/cubeTalisman.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/emptyEnchantedMap.png b/src/main/resources/assets/twilightforest/textures/items/emptyEnchantedMap.png deleted file mode 100644 index f25daab65d..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/emptyEnchantedMap.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/emptyOreMap.png b/src/main/resources/assets/twilightforest/textures/items/emptyOreMap.png deleted file mode 100644 index 8a0f03de49..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/emptyOreMap.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/enchantedMap.png b/src/main/resources/assets/twilightforest/textures/items/enchantedMap.png deleted file mode 100644 index ada7785093..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/enchantedMap.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/enderbow_pulling_0.png b/src/main/resources/assets/twilightforest/textures/items/enderbow_pulling_0.png deleted file mode 100644 index 5f22e64bcd..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/enderbow_pulling_0.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/enderbow_pulling_1.png b/src/main/resources/assets/twilightforest/textures/items/enderbow_pulling_1.png deleted file mode 100644 index c57079fe65..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/enderbow_pulling_1.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/enderbow_pulling_2.png b/src/main/resources/assets/twilightforest/textures/items/enderbow_pulling_2.png deleted file mode 100644 index be73af4bdd..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/enderbow_pulling_2.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/enderbow_standby.png b/src/main/resources/assets/twilightforest/textures/items/enderbow_standby.png deleted file mode 100644 index e1a2f0a22e..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/enderbow_standby.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/experiment115.png b/src/main/resources/assets/twilightforest/textures/items/experiment115.png deleted file mode 100644 index 177a557ee7..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/experiment115.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/fieryAxe.png b/src/main/resources/assets/twilightforest/textures/items/fieryAxe.png deleted file mode 100644 index 96729e159b..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/fieryAxe.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/fieryBlood.png b/src/main/resources/assets/twilightforest/textures/items/fieryBlood.png deleted file mode 100644 index f6f0344668..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/fieryBlood.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/fieryBoots.png b/src/main/resources/assets/twilightforest/textures/items/fieryBoots.png deleted file mode 100644 index 3e1d779d49..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/fieryBoots.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/fieryHelm.png b/src/main/resources/assets/twilightforest/textures/items/fieryHelm.png deleted file mode 100644 index 80f1d9478e..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/fieryHelm.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/fieryIngot.png b/src/main/resources/assets/twilightforest/textures/items/fieryIngot.png deleted file mode 100644 index 985ae3b991..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/fieryIngot.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/fieryLegs.png b/src/main/resources/assets/twilightforest/textures/items/fieryLegs.png deleted file mode 100644 index 50a125439b..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/fieryLegs.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/fieryPick.png b/src/main/resources/assets/twilightforest/textures/items/fieryPick.png deleted file mode 100644 index 2f10445263..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/fieryPick.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/fieryPlate.png b/src/main/resources/assets/twilightforest/textures/items/fieryPlate.png deleted file mode 100644 index 7b75a1b6b5..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/fieryPlate.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/fierySword.png b/src/main/resources/assets/twilightforest/textures/items/fierySword.png deleted file mode 100644 index 8e89af376e..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/fierySword.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/fieryTears.png b/src/main/resources/assets/twilightforest/textures/items/fieryTears.png deleted file mode 100644 index 6d1deeef5e..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/fieryTears.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/glassSword.png b/src/main/resources/assets/twilightforest/textures/items/glassSword.png deleted file mode 100644 index 4d856ed01a..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/glassSword.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/hydraChop.png b/src/main/resources/assets/twilightforest/textures/items/hydraChop.png deleted file mode 100644 index 44abe2a57b..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/hydraChop.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/hydraTrophy.png b/src/main/resources/assets/twilightforest/textures/items/hydraTrophy.png deleted file mode 100644 index 32bc0232ca..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/hydraTrophy.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/iceBomb.png b/src/main/resources/assets/twilightforest/textures/items/iceBomb.png deleted file mode 100644 index d5156277d3..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/iceBomb.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/iceSword.png b/src/main/resources/assets/twilightforest/textures/items/iceSword.png deleted file mode 100644 index 296f966062..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/iceSword.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/icebow_pulling_0.png b/src/main/resources/assets/twilightforest/textures/items/icebow_pulling_0.png deleted file mode 100644 index 54c27c7982..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/icebow_pulling_0.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/icebow_pulling_1.png b/src/main/resources/assets/twilightforest/textures/items/icebow_pulling_1.png deleted file mode 100644 index ce0b0ce142..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/icebow_pulling_1.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/icebow_pulling_2.png b/src/main/resources/assets/twilightforest/textures/items/icebow_pulling_2.png deleted file mode 100644 index 29d601d70c..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/icebow_pulling_2.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/icebow_standby.png b/src/main/resources/assets/twilightforest/textures/items/icebow_standby.png deleted file mode 100644 index c14a4d4e6b..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/icebow_standby.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/ironwoodLegs.png b/src/main/resources/assets/twilightforest/textures/items/ironwoodLegs.png deleted file mode 100644 index 97bc1e844d..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/ironwoodLegs.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/ironwoodPlate.png b/src/main/resources/assets/twilightforest/textures/items/ironwoodPlate.png deleted file mode 100644 index 864a68f3bd..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/ironwoodPlate.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/knightMetal.png b/src/main/resources/assets/twilightforest/textures/items/knightMetal.png deleted file mode 100644 index c4c4ba75d4..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/knightMetal.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/knightlyAxe.png b/src/main/resources/assets/twilightforest/textures/items/knightlyAxe.png deleted file mode 100644 index f417f817c8..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/knightlyAxe.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/knightlyBoots.png b/src/main/resources/assets/twilightforest/textures/items/knightlyBoots.png deleted file mode 100644 index ed0dcda5d2..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/knightlyBoots.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/knightlyHelm.png b/src/main/resources/assets/twilightforest/textures/items/knightlyHelm.png deleted file mode 100644 index 183058a9b6..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/knightlyHelm.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/knightlyLegs.png b/src/main/resources/assets/twilightforest/textures/items/knightlyLegs.png deleted file mode 100644 index 1cb996a296..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/knightlyLegs.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/knightlyPick.png b/src/main/resources/assets/twilightforest/textures/items/knightlyPick.png deleted file mode 100644 index f98ee60ae6..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/knightlyPick.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/knightlyPlate.png b/src/main/resources/assets/twilightforest/textures/items/knightlyPlate.png deleted file mode 100644 index 6b94224cb2..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/knightlyPlate.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/knightlySword.png b/src/main/resources/assets/twilightforest/textures/items/knightlySword.png deleted file mode 100644 index f11c8a2848..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/knightlySword.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/knightmetalRing.png b/src/main/resources/assets/twilightforest/textures/items/knightmetalRing.png deleted file mode 100644 index 24f4c64ed1..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/knightmetalRing.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/lampOfCinders.png b/src/main/resources/assets/twilightforest/textures/items/lampOfCinders.png deleted file mode 100644 index a57242584f..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/lampOfCinders.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/legsNaga.png b/src/main/resources/assets/twilightforest/textures/items/legsNaga.png deleted file mode 100644 index 361c9a1a84..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/legsNaga.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/lichTrophy.png b/src/main/resources/assets/twilightforest/textures/items/lichTrophy.png deleted file mode 100644 index afc831e9e6..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/lichTrophy.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/liveRoot.png b/src/main/resources/assets/twilightforest/textures/items/liveRoot.png deleted file mode 100644 index 745eaefb55..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/liveRoot.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/magicBeans.png b/src/main/resources/assets/twilightforest/textures/items/magicBeans.png deleted file mode 100644 index 7fc9c64f1b..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/magicBeans.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/magicMap.png b/src/main/resources/assets/twilightforest/textures/items/magicMap.png deleted file mode 100644 index 05630b1fab..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/magicMap.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/mazeWafer.png b/src/main/resources/assets/twilightforest/textures/items/mazeWafer.png deleted file mode 100644 index ed8cad8ca6..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/mazeWafer.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/meefRaw.png b/src/main/resources/assets/twilightforest/textures/items/meefRaw.png deleted file mode 100644 index 14db993e0b..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/meefRaw.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/meefSteak.png b/src/main/resources/assets/twilightforest/textures/items/meefSteak.png deleted file mode 100644 index 5253c791fa..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/meefSteak.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/meefStroganoff.png b/src/main/resources/assets/twilightforest/textures/items/meefStroganoff.png deleted file mode 100644 index 893aec2498..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/meefStroganoff.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/nagaTrophy.png b/src/main/resources/assets/twilightforest/textures/items/nagaTrophy.png deleted file mode 100644 index 61aaa7bed4..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/nagaTrophy.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/oreMap.png b/src/main/resources/assets/twilightforest/textures/items/oreMap.png deleted file mode 100644 index 24a4e57cff..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/oreMap.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/phantomHelm.png b/src/main/resources/assets/twilightforest/textures/items/phantomHelm.png deleted file mode 100644 index 9047c4a041..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/phantomHelm.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/phantomPlate.png b/src/main/resources/assets/twilightforest/textures/items/phantomPlate.png deleted file mode 100644 index 9826784324..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/phantomPlate.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/plateNaga.png b/src/main/resources/assets/twilightforest/textures/items/plateNaga.png deleted file mode 100644 index d5c4c6efed..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/plateNaga.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/scepterLifeDrain.png b/src/main/resources/assets/twilightforest/textures/items/scepterLifeDrain.png deleted file mode 100644 index 1ef2ec3b3b..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/scepterLifeDrain.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/scepterTwilight.png b/src/main/resources/assets/twilightforest/textures/items/scepterTwilight.png deleted file mode 100644 index 83c009b6ce..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/scepterTwilight.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/seekerbow_pulling_0.png b/src/main/resources/assets/twilightforest/textures/items/seekerbow_pulling_0.png deleted file mode 100644 index fff2b5617b..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/seekerbow_pulling_0.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/seekerbow_pulling_1.png b/src/main/resources/assets/twilightforest/textures/items/seekerbow_pulling_1.png deleted file mode 100644 index 0bed2ab95e..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/seekerbow_pulling_1.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/seekerbow_pulling_2.png b/src/main/resources/assets/twilightforest/textures/items/seekerbow_pulling_2.png deleted file mode 100644 index aa172a68d8..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/seekerbow_pulling_2.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/seekerbow_standby.png b/src/main/resources/assets/twilightforest/textures/items/seekerbow_standby.png deleted file mode 100644 index ad3596f4a8..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/seekerbow_standby.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/shardCluster.png b/src/main/resources/assets/twilightforest/textures/items/shardCluster.png deleted file mode 100644 index 18a2d4efe2..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/shardCluster.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/snowQueenTrophy.png b/src/main/resources/assets/twilightforest/textures/items/snowQueenTrophy.png deleted file mode 100644 index 7e41a1cfa3..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/snowQueenTrophy.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/snow_0.png b/src/main/resources/assets/twilightforest/textures/items/snow_0.png deleted file mode 100644 index 8fb5c49c45..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/snow_0.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/snow_1.png b/src/main/resources/assets/twilightforest/textures/items/snow_1.png deleted file mode 100644 index 6031db794f..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/snow_1.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/snow_2.png b/src/main/resources/assets/twilightforest/textures/items/snow_2.png deleted file mode 100644 index 0e354f7686..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/snow_2.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/snow_3.png b/src/main/resources/assets/twilightforest/textures/items/snow_3.png deleted file mode 100644 index d5e6875bd2..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/snow_3.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/steeleafPlate.png b/src/main/resources/assets/twilightforest/textures/items/steeleafPlate.png deleted file mode 100644 index fbc7d4d9c2..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/steeleafPlate.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/torchberries.png b/src/main/resources/assets/twilightforest/textures/items/torchberries.png deleted file mode 100644 index a049e23fbe..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/torchberries.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/triplebow_pulling_0.png b/src/main/resources/assets/twilightforest/textures/items/triplebow_pulling_0.png deleted file mode 100644 index 1d4a0d3a03..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/triplebow_pulling_0.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/triplebow_pulling_1.png b/src/main/resources/assets/twilightforest/textures/items/triplebow_pulling_1.png deleted file mode 100644 index c4777227a5..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/triplebow_pulling_1.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/triplebow_pulling_2.png b/src/main/resources/assets/twilightforest/textures/items/triplebow_pulling_2.png deleted file mode 100644 index 018d642898..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/triplebow_pulling_2.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/triplebow_standby.png b/src/main/resources/assets/twilightforest/textures/items/triplebow_standby.png deleted file mode 100644 index 2da99894e9..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/triplebow_standby.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/urGhastTrophy.png b/src/main/resources/assets/twilightforest/textures/items/urGhastTrophy.png deleted file mode 100644 index 3aceda9812..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/urGhastTrophy.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/venisonCooked.png b/src/main/resources/assets/twilightforest/textures/items/venisonCooked.png deleted file mode 100644 index dc6fd55ce3..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/venisonCooked.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/venisonRaw.png b/src/main/resources/assets/twilightforest/textures/items/venisonRaw.png deleted file mode 100644 index c83be0a434..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/venisonRaw.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/yetiBoots.png b/src/main/resources/assets/twilightforest/textures/items/yetiBoots.png deleted file mode 100644 index 5cf685d3cb..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/yetiBoots.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/yetiHelm.png b/src/main/resources/assets/twilightforest/textures/items/yetiHelm.png deleted file mode 100644 index fae59490dd..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/yetiHelm.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/yetiLegs.png b/src/main/resources/assets/twilightforest/textures/items/yetiLegs.png deleted file mode 100644 index 286d7684d9..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/yetiLegs.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/items/yetiPlate.png b/src/main/resources/assets/twilightforest/textures/items/yetiPlate.png deleted file mode 100644 index cc54a07ffd..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/items/yetiPlate.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/mob_effect/frosted.png b/src/main/resources/assets/twilightforest/textures/mob_effect/frosted.png new file mode 100644 index 0000000000..9e44880f6f Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/mob_effect/frosted.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/adherent.png b/src/main/resources/assets/twilightforest/textures/model/adherent.png index e65facb98e..925368e3bc 100644 Binary files a/src/main/resources/assets/twilightforest/textures/model/adherent.png and b/src/main/resources/assets/twilightforest/textures/model/adherent.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/apocalypse2.png b/src/main/resources/assets/twilightforest/textures/model/apocalypse2.png index 0c4640ab3d..924b52e143 100644 Binary files a/src/main/resources/assets/twilightforest/textures/model/apocalypse2.png and b/src/main/resources/assets/twilightforest/textures/model/apocalypse2.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/bighorn.png b/src/main/resources/assets/twilightforest/textures/model/bighorn.png index 7d4b4ac59b..1d83b0aec0 100644 Binary files a/src/main/resources/assets/twilightforest/textures/model/bighorn.png and b/src/main/resources/assets/twilightforest/textures/model/bighorn.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/blockgoblin.png b/src/main/resources/assets/twilightforest/textures/model/blockgoblin.png index 5ccd1bc34b..3bd4bf5a8a 100644 Binary files a/src/main/resources/assets/twilightforest/textures/model/blockgoblin.png and b/src/main/resources/assets/twilightforest/textures/model/blockgoblin.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/bunnybrown.png b/src/main/resources/assets/twilightforest/textures/model/bunnybrown.png index 5ee02968b0..683d1e8eee 100644 Binary files a/src/main/resources/assets/twilightforest/textures/model/bunnybrown.png and b/src/main/resources/assets/twilightforest/textures/model/bunnybrown.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/bunnydutch.png b/src/main/resources/assets/twilightforest/textures/model/bunnydutch.png index 8e0d2cadd1..16a906b3f6 100644 Binary files a/src/main/resources/assets/twilightforest/textures/model/bunnydutch.png and b/src/main/resources/assets/twilightforest/textures/model/bunnydutch.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/bunnywhite.png b/src/main/resources/assets/twilightforest/textures/model/bunnywhite.png index 0af800f02a..38b8aca8ad 100644 Binary files a/src/main/resources/assets/twilightforest/textures/model/bunnywhite.png and b/src/main/resources/assets/twilightforest/textures/model/bunnywhite.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/carminitegolem.png b/src/main/resources/assets/twilightforest/textures/model/carminitegolem.png index a5e7fdcc25..9adad943be 100644 Binary files a/src/main/resources/assets/twilightforest/textures/model/carminitegolem.png and b/src/main/resources/assets/twilightforest/textures/model/carminitegolem.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/casket/keepsake_casket_0.png b/src/main/resources/assets/twilightforest/textures/model/casket/keepsake_casket_0.png new file mode 100644 index 0000000000..e1057c6e10 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/model/casket/keepsake_casket_0.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/casket/keepsake_casket_1.png b/src/main/resources/assets/twilightforest/textures/model/casket/keepsake_casket_1.png new file mode 100644 index 0000000000..e7d3adfc84 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/model/casket/keepsake_casket_1.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/casket/keepsake_casket_2.png b/src/main/resources/assets/twilightforest/textures/model/casket/keepsake_casket_2.png new file mode 100644 index 0000000000..554daef34f Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/model/casket/keepsake_casket_2.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/chest/canopy/canopy.png b/src/main/resources/assets/twilightforest/textures/model/chest/canopy/canopy.png new file mode 100644 index 0000000000..009b0d18b0 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/model/chest/canopy/canopy.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/chest/canopy/left.png b/src/main/resources/assets/twilightforest/textures/model/chest/canopy/left.png new file mode 100644 index 0000000000..af589ef2e6 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/model/chest/canopy/left.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/chest/canopy/right.png b/src/main/resources/assets/twilightforest/textures/model/chest/canopy/right.png new file mode 100644 index 0000000000..6ce33d07e6 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/model/chest/canopy/right.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/chest/darkwood/darkwood.png b/src/main/resources/assets/twilightforest/textures/model/chest/darkwood/darkwood.png new file mode 100644 index 0000000000..b243d0cfad Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/model/chest/darkwood/darkwood.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/chest/darkwood/left.png b/src/main/resources/assets/twilightforest/textures/model/chest/darkwood/left.png new file mode 100644 index 0000000000..baad01258e Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/model/chest/darkwood/left.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/chest/darkwood/right.png b/src/main/resources/assets/twilightforest/textures/model/chest/darkwood/right.png new file mode 100644 index 0000000000..b5cab1aa80 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/model/chest/darkwood/right.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/chest/mangrove/left.png b/src/main/resources/assets/twilightforest/textures/model/chest/mangrove/left.png new file mode 100644 index 0000000000..94a5a26669 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/model/chest/mangrove/left.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/chest/mangrove/mangrove.png b/src/main/resources/assets/twilightforest/textures/model/chest/mangrove/mangrove.png new file mode 100644 index 0000000000..f13219f63f Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/model/chest/mangrove/mangrove.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/chest/mangrove/right.png b/src/main/resources/assets/twilightforest/textures/model/chest/mangrove/right.png new file mode 100644 index 0000000000..88f37e8b3a Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/model/chest/mangrove/right.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/chest/mining/left.png b/src/main/resources/assets/twilightforest/textures/model/chest/mining/left.png new file mode 100644 index 0000000000..adfc471069 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/model/chest/mining/left.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/chest/mining/mining.png b/src/main/resources/assets/twilightforest/textures/model/chest/mining/mining.png new file mode 100644 index 0000000000..22fc9837da Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/model/chest/mining/mining.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/chest/mining/right.png b/src/main/resources/assets/twilightforest/textures/model/chest/mining/right.png new file mode 100644 index 0000000000..e1754b0971 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/model/chest/mining/right.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/chest/sort/left.png b/src/main/resources/assets/twilightforest/textures/model/chest/sort/left.png new file mode 100644 index 0000000000..2bbf5222a7 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/model/chest/sort/left.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/chest/sort/right.png b/src/main/resources/assets/twilightforest/textures/model/chest/sort/right.png new file mode 100644 index 0000000000..b9fc83d507 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/model/chest/sort/right.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/chest/sort/sort.png b/src/main/resources/assets/twilightforest/textures/model/chest/sort/sort.png new file mode 100644 index 0000000000..2d8eaf98dc Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/model/chest/sort/sort.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/chest/time/left.png b/src/main/resources/assets/twilightforest/textures/model/chest/time/left.png new file mode 100644 index 0000000000..5e30ae5aac Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/model/chest/time/left.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/chest/time/right.png b/src/main/resources/assets/twilightforest/textures/model/chest/time/right.png new file mode 100644 index 0000000000..bf54f3edec Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/model/chest/time/right.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/chest/time/time.png b/src/main/resources/assets/twilightforest/textures/model/chest/time/time.png new file mode 100644 index 0000000000..be1726bda0 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/model/chest/time/time.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/chest/trans/left.png b/src/main/resources/assets/twilightforest/textures/model/chest/trans/left.png new file mode 100644 index 0000000000..8b61ee974e Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/model/chest/trans/left.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/chest/trans/right.png b/src/main/resources/assets/twilightforest/textures/model/chest/trans/right.png new file mode 100644 index 0000000000..ef315d120a Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/model/chest/trans/right.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/chest/trans/trans.png b/src/main/resources/assets/twilightforest/textures/model/chest/trans/trans.png new file mode 100644 index 0000000000..d98941bfc9 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/model/chest/trans/trans.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/chest/twilight/left.png b/src/main/resources/assets/twilightforest/textures/model/chest/twilight/left.png new file mode 100644 index 0000000000..a68afba6d6 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/model/chest/twilight/left.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/chest/twilight/right.png b/src/main/resources/assets/twilightforest/textures/model/chest/twilight/right.png new file mode 100644 index 0000000000..0789d647ec Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/model/chest/twilight/right.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/chest/twilight/twilight.png b/src/main/resources/assets/twilightforest/textures/model/chest/twilight/twilight.png new file mode 100644 index 0000000000..d1c89986b5 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/model/chest/twilight/twilight.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/cicada-model.png b/src/main/resources/assets/twilightforest/textures/model/cicada-model.png index e8583026f2..c0c7fa00ae 100644 Binary files a/src/main/resources/assets/twilightforest/textures/model/cicada-model.png and b/src/main/resources/assets/twilightforest/textures/model/cicada-model.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/cubeofannihilation.png b/src/main/resources/assets/twilightforest/textures/model/cubeofannihilation.png index 579486ae5c..eb2030609b 100644 Binary files a/src/main/resources/assets/twilightforest/textures/model/cubeofannihilation.png and b/src/main/resources/assets/twilightforest/textures/model/cubeofannihilation.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/curios/charm_of_life_1.png b/src/main/resources/assets/twilightforest/textures/model/curios/charm_of_life_1.png new file mode 100644 index 0000000000..53f062c2cd Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/model/curios/charm_of_life_1.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/curios/charm_of_life_2.png b/src/main/resources/assets/twilightforest/textures/model/curios/charm_of_life_2.png new file mode 100644 index 0000000000..522503cdaa Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/model/curios/charm_of_life_2.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/doublegoblin.png b/src/main/resources/assets/twilightforest/textures/model/doublegoblin.png index ff6da80c14..068be83e54 100644 Binary files a/src/main/resources/assets/twilightforest/textures/model/doublegoblin.png and b/src/main/resources/assets/twilightforest/textures/model/doublegoblin.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/finalcastle/castle_guardian.png b/src/main/resources/assets/twilightforest/textures/model/finalcastle/castle_guardian.png new file mode 100644 index 0000000000..d5ddb43788 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/model/finalcastle/castle_guardian.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/firebeetle.png b/src/main/resources/assets/twilightforest/textures/model/firebeetle.png index 30a24470c1..5fcf97127e 100644 Binary files a/src/main/resources/assets/twilightforest/textures/model/firebeetle.png and b/src/main/resources/assets/twilightforest/textures/model/firebeetle.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/firefly-tiny.png b/src/main/resources/assets/twilightforest/textures/model/firefly-tiny.png index 2a19b5ab8d..337dec7eb8 100644 Binary files a/src/main/resources/assets/twilightforest/textures/model/firefly-tiny.png and b/src/main/resources/assets/twilightforest/textures/model/firefly-tiny.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/ghost-crown.png b/src/main/resources/assets/twilightforest/textures/model/ghost-crown.png deleted file mode 100644 index 9ec82cbf4e..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/model/ghost-crown.png and /dev/null differ diff --git a/src/main/resources/assets/twilightforest/textures/model/ghost.png b/src/main/resources/assets/twilightforest/textures/model/ghost.png index d3c124cef7..ca7fc293d6 100644 Binary files a/src/main/resources/assets/twilightforest/textures/model/ghost.png and b/src/main/resources/assets/twilightforest/textures/model/ghost.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/hedgespider.png b/src/main/resources/assets/twilightforest/textures/model/hedgespider.png index 6fb6003dcb..f2a3bf4cd9 100644 Binary files a/src/main/resources/assets/twilightforest/textures/model/hedgespider.png and b/src/main/resources/assets/twilightforest/textures/model/hedgespider.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/helmetcrab.png b/src/main/resources/assets/twilightforest/textures/model/helmetcrab.png index c26c12abc5..2c4df39134 100644 Binary files a/src/main/resources/assets/twilightforest/textures/model/helmetcrab.png and b/src/main/resources/assets/twilightforest/textures/model/helmetcrab.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/hydra4.png b/src/main/resources/assets/twilightforest/textures/model/hydra4.png index fd38ef0777..761443c8d7 100644 Binary files a/src/main/resources/assets/twilightforest/textures/model/hydra4.png and b/src/main/resources/assets/twilightforest/textures/model/hydra4.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/hydramortar.png b/src/main/resources/assets/twilightforest/textures/model/hydramortar.png index 8e977cfa5d..5af47c6db7 100644 Binary files a/src/main/resources/assets/twilightforest/textures/model/hydramortar.png and b/src/main/resources/assets/twilightforest/textures/model/hydramortar.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/icecrystal.png b/src/main/resources/assets/twilightforest/textures/model/icecrystal.png index aff597604a..b6c4b856dc 100644 Binary files a/src/main/resources/assets/twilightforest/textures/model/icecrystal.png and b/src/main/resources/assets/twilightforest/textures/model/icecrystal.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/iceexploder.png b/src/main/resources/assets/twilightforest/textures/model/iceexploder.png index 26d24f9688..3ab8175b47 100644 Binary files a/src/main/resources/assets/twilightforest/textures/model/iceexploder.png and b/src/main/resources/assets/twilightforest/textures/model/iceexploder.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/iceshooter.png b/src/main/resources/assets/twilightforest/textures/model/iceshooter.png index 70fa2b4a93..3f0c72365a 100644 Binary files a/src/main/resources/assets/twilightforest/textures/model/iceshooter.png and b/src/main/resources/assets/twilightforest/textures/model/iceshooter.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/kingspider.png b/src/main/resources/assets/twilightforest/textures/model/kingspider.png index e31f1fafe3..43101e76c1 100644 Binary files a/src/main/resources/assets/twilightforest/textures/model/kingspider.png and b/src/main/resources/assets/twilightforest/textures/model/kingspider.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/knightmetal_shield.png b/src/main/resources/assets/twilightforest/textures/model/knightmetal_shield.png new file mode 100644 index 0000000000..9056cd7606 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/model/knightmetal_shield.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/knightphantom.png b/src/main/resources/assets/twilightforest/textures/model/knightphantom.png index d416ee2d6d..fe347f87d6 100644 Binary files a/src/main/resources/assets/twilightforest/textures/model/knightphantom.png and b/src/main/resources/assets/twilightforest/textures/model/knightphantom.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/kobold.png b/src/main/resources/assets/twilightforest/textures/model/kobold.png index 5fdfbc810e..fed423d621 100644 Binary files a/src/main/resources/assets/twilightforest/textures/model/kobold.png and b/src/main/resources/assets/twilightforest/textures/model/kobold.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/mazeslime.png b/src/main/resources/assets/twilightforest/textures/model/mazeslime.png index df185b3d6a..57409bfda6 100644 Binary files a/src/main/resources/assets/twilightforest/textures/model/mazeslime.png and b/src/main/resources/assets/twilightforest/textures/model/mazeslime.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/minoshroomtaur.png b/src/main/resources/assets/twilightforest/textures/model/minoshroomtaur.png index cc2bc60f60..feae54e963 100644 Binary files a/src/main/resources/assets/twilightforest/textures/model/minoshroomtaur.png and b/src/main/resources/assets/twilightforest/textures/model/minoshroomtaur.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/minotaur.png b/src/main/resources/assets/twilightforest/textures/model/minotaur.png index f11d5db96c..4d2aefc528 100644 Binary files a/src/main/resources/assets/twilightforest/textures/model/minotaur.png and b/src/main/resources/assets/twilightforest/textures/model/minotaur.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/mistwolf.png b/src/main/resources/assets/twilightforest/textures/model/mistwolf.png index a2eb850004..d70b95ff79 100644 Binary files a/src/main/resources/assets/twilightforest/textures/model/mistwolf.png and b/src/main/resources/assets/twilightforest/textures/model/mistwolf.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/moonworm.png b/src/main/resources/assets/twilightforest/textures/model/moonworm.png index 5814ba9b2d..4b421ab73b 100644 Binary files a/src/main/resources/assets/twilightforest/textures/model/moonworm.png and b/src/main/resources/assets/twilightforest/textures/model/moonworm.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/mosquitoswarm.png b/src/main/resources/assets/twilightforest/textures/model/mosquitoswarm.png index 95780e7143..c5d1a21ac9 100644 Binary files a/src/main/resources/assets/twilightforest/textures/model/mosquitoswarm.png and b/src/main/resources/assets/twilightforest/textures/model/mosquitoswarm.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/nagahead.png b/src/main/resources/assets/twilightforest/textures/model/nagahead.png index 06ccd3badc..61ee68f429 100644 Binary files a/src/main/resources/assets/twilightforest/textures/model/nagahead.png and b/src/main/resources/assets/twilightforest/textures/model/nagahead.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/nagahead_charge.png b/src/main/resources/assets/twilightforest/textures/model/nagahead_charge.png new file mode 100644 index 0000000000..11c25ab0a1 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/model/nagahead_charge.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/nagahead_dazed.png b/src/main/resources/assets/twilightforest/textures/model/nagahead_dazed.png new file mode 100644 index 0000000000..478fbae115 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/model/nagahead_dazed.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/nagasegment.png b/src/main/resources/assets/twilightforest/textures/model/nagasegment.png index cad221f013..9f5d47c475 100644 Binary files a/src/main/resources/assets/twilightforest/textures/model/nagasegment.png and b/src/main/resources/assets/twilightforest/textures/model/nagasegment.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/penguin.png b/src/main/resources/assets/twilightforest/textures/model/penguin.png index 428600fadc..7263f0dc69 100644 Binary files a/src/main/resources/assets/twilightforest/textures/model/penguin.png and b/src/main/resources/assets/twilightforest/textures/model/penguin.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/phantomskeleton.png b/src/main/resources/assets/twilightforest/textures/model/phantomskeleton.png index bb452a9a55..6f622b0618 100644 Binary files a/src/main/resources/assets/twilightforest/textures/model/phantomskeleton.png and b/src/main/resources/assets/twilightforest/textures/model/phantomskeleton.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/pinchbeetle.png b/src/main/resources/assets/twilightforest/textures/model/pinchbeetle.png index f496d6eb16..f8fb574b90 100644 Binary files a/src/main/resources/assets/twilightforest/textures/model/pinchbeetle.png and b/src/main/resources/assets/twilightforest/textures/model/pinchbeetle.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/protectionbox.png b/src/main/resources/assets/twilightforest/textures/model/protectionbox.png index cbf447ace2..38f876c1dd 100644 Binary files a/src/main/resources/assets/twilightforest/textures/model/protectionbox.png and b/src/main/resources/assets/twilightforest/textures/model/protectionbox.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/questram.png b/src/main/resources/assets/twilightforest/textures/model/questram.png index a1e2cf7c5f..3e359d3d04 100644 Binary files a/src/main/resources/assets/twilightforest/textures/model/questram.png and b/src/main/resources/assets/twilightforest/textures/model/questram.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/questram_lines.png b/src/main/resources/assets/twilightforest/textures/model/questram_lines.png index e5ba354c07..1634c5fcfd 100644 Binary files a/src/main/resources/assets/twilightforest/textures/model/questram_lines.png and b/src/main/resources/assets/twilightforest/textures/model/questram_lines.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/raven.png b/src/main/resources/assets/twilightforest/textures/model/raven.png index edacaa3af0..aec4307d4a 100644 Binary files a/src/main/resources/assets/twilightforest/textures/model/raven.png and b/src/main/resources/assets/twilightforest/textures/model/raven.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/red_thread.png b/src/main/resources/assets/twilightforest/textures/model/red_thread.png new file mode 100644 index 0000000000..4b95358ae4 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/model/red_thread.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/redcap.png b/src/main/resources/assets/twilightforest/textures/model/redcap.png index 5d03507ce8..bb21ecb6a0 100644 Binary files a/src/main/resources/assets/twilightforest/textures/model/redcap.png and b/src/main/resources/assets/twilightforest/textures/model/redcap.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/redcapsapper.png b/src/main/resources/assets/twilightforest/textures/model/redcapsapper.png index 48356d47be..9d61dbda76 100644 Binary files a/src/main/resources/assets/twilightforest/textures/model/redcapsapper.png and b/src/main/resources/assets/twilightforest/textures/model/redcapsapper.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/skeletondruid.png b/src/main/resources/assets/twilightforest/textures/model/skeletondruid.png index 7d34f9a5e5..ff22410047 100644 Binary files a/src/main/resources/assets/twilightforest/textures/model/skeletondruid.png and b/src/main/resources/assets/twilightforest/textures/model/skeletondruid.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/slimebeetle.png b/src/main/resources/assets/twilightforest/textures/model/slimebeetle.png index 3a40fbebd0..f3c6532b6c 100644 Binary files a/src/main/resources/assets/twilightforest/textures/model/slimebeetle.png and b/src/main/resources/assets/twilightforest/textures/model/slimebeetle.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/snowqueen.png b/src/main/resources/assets/twilightforest/textures/model/snowqueen.png index 8b2b119df3..49d40e52ac 100644 Binary files a/src/main/resources/assets/twilightforest/textures/model/snowqueen.png and b/src/main/resources/assets/twilightforest/textures/model/snowqueen.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/squirrel2.png b/src/main/resources/assets/twilightforest/textures/model/squirrel2.png index 3e0acc20b1..0ad369b514 100644 Binary files a/src/main/resources/assets/twilightforest/textures/model/squirrel2.png and b/src/main/resources/assets/twilightforest/textures/model/squirrel2.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/swarmspider.png b/src/main/resources/assets/twilightforest/textures/model/swarmspider.png index 09006f924e..c19ea8f545 100644 Binary files a/src/main/resources/assets/twilightforest/textures/model/swarmspider.png and b/src/main/resources/assets/twilightforest/textures/model/swarmspider.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/tinybirdblue.png b/src/main/resources/assets/twilightforest/textures/model/tinybirdblue.png index 41836188fb..45d9cb91af 100644 Binary files a/src/main/resources/assets/twilightforest/textures/model/tinybirdblue.png and b/src/main/resources/assets/twilightforest/textures/model/tinybirdblue.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/tinybirdbrown.png b/src/main/resources/assets/twilightforest/textures/model/tinybirdbrown.png index 8f6c54d092..0b02efb332 100644 Binary files a/src/main/resources/assets/twilightforest/textures/model/tinybirdbrown.png and b/src/main/resources/assets/twilightforest/textures/model/tinybirdbrown.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/tinybirdgold.png b/src/main/resources/assets/twilightforest/textures/model/tinybirdgold.png index f5830ceabf..ba0105eb1c 100644 Binary files a/src/main/resources/assets/twilightforest/textures/model/tinybirdgold.png and b/src/main/resources/assets/twilightforest/textures/model/tinybirdgold.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/tinybirdred.png b/src/main/resources/assets/twilightforest/textures/model/tinybirdred.png index 3ffb97b919..e83dcef2c6 100644 Binary files a/src/main/resources/assets/twilightforest/textures/model/tinybirdred.png and b/src/main/resources/assets/twilightforest/textures/model/tinybirdred.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/towerboss.png b/src/main/resources/assets/twilightforest/textures/model/towerboss.png index 8aa7731316..bd23e09f0a 100644 Binary files a/src/main/resources/assets/twilightforest/textures/model/towerboss.png and b/src/main/resources/assets/twilightforest/textures/model/towerboss.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/towerboss_fire.png b/src/main/resources/assets/twilightforest/textures/model/towerboss_fire.png index d413aa4f19..b4ec165f44 100644 Binary files a/src/main/resources/assets/twilightforest/textures/model/towerboss_fire.png and b/src/main/resources/assets/twilightforest/textures/model/towerboss_fire.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/towerboss_openeyes.png b/src/main/resources/assets/twilightforest/textures/model/towerboss_openeyes.png index 2315333070..81f32f843c 100644 Binary files a/src/main/resources/assets/twilightforest/textures/model/towerboss_openeyes.png and b/src/main/resources/assets/twilightforest/textures/model/towerboss_openeyes.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/towerbroodling.png b/src/main/resources/assets/twilightforest/textures/model/towerbroodling.png index 877296c4d1..69f48cdd17 100644 Binary files a/src/main/resources/assets/twilightforest/textures/model/towerbroodling.png and b/src/main/resources/assets/twilightforest/textures/model/towerbroodling.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/towerghast.png b/src/main/resources/assets/twilightforest/textures/model/towerghast.png index e6a1c0ea38..d8069b4ec1 100644 Binary files a/src/main/resources/assets/twilightforest/textures/model/towerghast.png and b/src/main/resources/assets/twilightforest/textures/model/towerghast.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/towerghast_fire.png b/src/main/resources/assets/twilightforest/textures/model/towerghast_fire.png index d34be9c67d..8f8916a6aa 100644 Binary files a/src/main/resources/assets/twilightforest/textures/model/towerghast_fire.png and b/src/main/resources/assets/twilightforest/textures/model/towerghast_fire.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/towerghast_openeyes.png b/src/main/resources/assets/twilightforest/textures/model/towerghast_openeyes.png index 71cabed17e..f9ed4be272 100644 Binary files a/src/main/resources/assets/twilightforest/textures/model/towerghast_openeyes.png and b/src/main/resources/assets/twilightforest/textures/model/towerghast_openeyes.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/towertermite.png b/src/main/resources/assets/twilightforest/textures/model/towertermite.png index 2528eec7db..170aa1af65 100644 Binary files a/src/main/resources/assets/twilightforest/textures/model/towertermite.png and b/src/main/resources/assets/twilightforest/textures/model/towertermite.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/troll.png b/src/main/resources/assets/twilightforest/textures/model/troll.png index 75057ba4e5..ce9222f6d8 100644 Binary files a/src/main/resources/assets/twilightforest/textures/model/troll.png and b/src/main/resources/assets/twilightforest/textures/model/troll.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/twilightlich64.png b/src/main/resources/assets/twilightforest/textures/model/twilightlich64.png index efd91056ca..3f1d94a499 100644 Binary files a/src/main/resources/assets/twilightforest/textures/model/twilightlich64.png and b/src/main/resources/assets/twilightforest/textures/model/twilightlich64.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/wildboar.png b/src/main/resources/assets/twilightforest/textures/model/wildboar.png index dfff96dafc..010dc4debf 100644 Binary files a/src/main/resources/assets/twilightforest/textures/model/wildboar.png and b/src/main/resources/assets/twilightforest/textures/model/wildboar.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/wilddeer.png b/src/main/resources/assets/twilightforest/textures/model/wilddeer.png index 7d5c28959e..029973a7f3 100644 Binary files a/src/main/resources/assets/twilightforest/textures/model/wilddeer.png and b/src/main/resources/assets/twilightforest/textures/model/wilddeer.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/winterwolf.png b/src/main/resources/assets/twilightforest/textures/model/winterwolf.png index b917b3c17d..94b30c7e8c 100644 Binary files a/src/main/resources/assets/twilightforest/textures/model/winterwolf.png and b/src/main/resources/assets/twilightforest/textures/model/winterwolf.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/wraith.png b/src/main/resources/assets/twilightforest/textures/model/wraith.png index 21eb57e0af..ca7fc293d6 100644 Binary files a/src/main/resources/assets/twilightforest/textures/model/wraith.png and b/src/main/resources/assets/twilightforest/textures/model/wraith.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/yeti2.png b/src/main/resources/assets/twilightforest/textures/model/yeti2.png index 0147111eb1..7e696ecd30 100644 Binary files a/src/main/resources/assets/twilightforest/textures/model/yeti2.png and b/src/main/resources/assets/twilightforest/textures/model/yeti2.png differ diff --git a/src/main/resources/assets/twilightforest/textures/model/yetialpha.png b/src/main/resources/assets/twilightforest/textures/model/yetialpha.png index 84b533c924..5b4b0baf74 100644 Binary files a/src/main/resources/assets/twilightforest/textures/model/yetialpha.png and b/src/main/resources/assets/twilightforest/textures/model/yetialpha.png differ diff --git a/src/main/resources/assets/twilightforest/textures/particle/annihilate_particle.png b/src/main/resources/assets/twilightforest/textures/particle/annihilate_particle.png new file mode 100644 index 0000000000..74af70b295 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/particle/annihilate_particle.png differ diff --git a/src/main/resources/assets/twilightforest/textures/particle/fallen_leaf.png b/src/main/resources/assets/twilightforest/textures/particle/fallen_leaf.png new file mode 100644 index 0000000000..662e742f8a Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/particle/fallen_leaf.png differ diff --git a/src/main/resources/assets/twilightforest/textures/particle/firefly.png b/src/main/resources/assets/twilightforest/textures/particle/firefly.png new file mode 100644 index 0000000000..8aed9c3c2f Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/particle/firefly.png differ diff --git a/src/main/resources/assets/twilightforest/textures/particle/ominous_flame.png b/src/main/resources/assets/twilightforest/textures/particle/ominous_flame.png new file mode 100644 index 0000000000..8ce613a520 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/particle/ominous_flame.png differ diff --git a/src/main/resources/assets/twilightforest/textures/particle/snow_0.png b/src/main/resources/assets/twilightforest/textures/particle/snow_0.png new file mode 100644 index 0000000000..6cce89143c Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/particle/snow_0.png differ diff --git a/src/main/resources/assets/twilightforest/textures/particle/snow_1.png b/src/main/resources/assets/twilightforest/textures/particle/snow_1.png new file mode 100644 index 0000000000..d9669dc3e9 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/particle/snow_1.png differ diff --git a/src/main/resources/assets/twilightforest/textures/particle/snow_2.png b/src/main/resources/assets/twilightforest/textures/particle/snow_2.png new file mode 100644 index 0000000000..da5888478d Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/particle/snow_2.png differ diff --git a/src/main/resources/assets/twilightforest/textures/particle/snow_3.png b/src/main/resources/assets/twilightforest/textures/particle/snow_3.png new file mode 100644 index 0000000000..0a9aff3460 Binary files /dev/null and b/src/main/resources/assets/twilightforest/textures/particle/snow_3.png differ diff --git a/src/main/resources/assets/twilightforest/textures/twilightforest_logo.png b/src/main/resources/assets/twilightforest/textures/twilightforest_logo.png deleted file mode 100644 index 51722b3535..0000000000 Binary files a/src/main/resources/assets/twilightforest/textures/twilightforest_logo.png and /dev/null differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/armor/arcticarmor_1.png b/src/main/resources/classic/assets/twilightforest/textures/armor/arcticarmor_1.png new file mode 100644 index 0000000000..cd3d189a2e Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/armor/arcticarmor_1.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/armor/arcticarmor_1_dyed.png b/src/main/resources/classic/assets/twilightforest/textures/armor/arcticarmor_1_dyed.png new file mode 100644 index 0000000000..cdf857b490 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/armor/arcticarmor_1_dyed.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/armor/arcticarmor_1_overlay.png b/src/main/resources/classic/assets/twilightforest/textures/armor/arcticarmor_1_overlay.png new file mode 100644 index 0000000000..aa8c123adc Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/armor/arcticarmor_1_overlay.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/armor/arcticarmor_2.png b/src/main/resources/classic/assets/twilightforest/textures/armor/arcticarmor_2.png new file mode 100644 index 0000000000..131566c1cd Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/armor/arcticarmor_2.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/armor/arcticarmor_2_dyed.png b/src/main/resources/classic/assets/twilightforest/textures/armor/arcticarmor_2_dyed.png new file mode 100644 index 0000000000..754901651c Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/armor/arcticarmor_2_dyed.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/armor/arcticarmor_2_overlay.png b/src/main/resources/classic/assets/twilightforest/textures/armor/arcticarmor_2_overlay.png new file mode 100644 index 0000000000..83f29cd24e Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/armor/arcticarmor_2_overlay.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/armor/fiery_1.png b/src/main/resources/classic/assets/twilightforest/textures/armor/fiery_1.png new file mode 100644 index 0000000000..bb78776106 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/armor/fiery_1.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/armor/fiery_2.png b/src/main/resources/classic/assets/twilightforest/textures/armor/fiery_2.png new file mode 100644 index 0000000000..c15a749564 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/armor/fiery_2.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/armor/ironwood_1.png b/src/main/resources/classic/assets/twilightforest/textures/armor/ironwood_1.png new file mode 100644 index 0000000000..6e665c4a29 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/armor/ironwood_1.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/armor/ironwood_2.png b/src/main/resources/classic/assets/twilightforest/textures/armor/ironwood_2.png new file mode 100644 index 0000000000..51637a9d11 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/armor/ironwood_2.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/armor/knightly_1.png b/src/main/resources/classic/assets/twilightforest/textures/armor/knightly_1.png new file mode 100644 index 0000000000..d797fb1c54 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/armor/knightly_1.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/armor/knightly_2.png b/src/main/resources/classic/assets/twilightforest/textures/armor/knightly_2.png new file mode 100644 index 0000000000..64b86fb2b5 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/armor/knightly_2.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/armor/naga_scale_1.png b/src/main/resources/classic/assets/twilightforest/textures/armor/naga_scale_1.png new file mode 100644 index 0000000000..fcc668fe58 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/armor/naga_scale_1.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/armor/naga_scale_2.png b/src/main/resources/classic/assets/twilightforest/textures/armor/naga_scale_2.png new file mode 100644 index 0000000000..3e27ffca26 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/armor/naga_scale_2.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/armor/phantom_1.png b/src/main/resources/classic/assets/twilightforest/textures/armor/phantom_1.png new file mode 100644 index 0000000000..3058458901 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/armor/phantom_1.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/armor/steeleaf_1.png b/src/main/resources/classic/assets/twilightforest/textures/armor/steeleaf_1.png new file mode 100644 index 0000000000..5e43f6f870 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/armor/steeleaf_1.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/armor/steeleaf_2.png b/src/main/resources/classic/assets/twilightforest/textures/armor/steeleaf_2.png new file mode 100644 index 0000000000..9a795241c5 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/armor/steeleaf_2.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/armor/yetiarmor_1.png b/src/main/resources/classic/assets/twilightforest/textures/armor/yetiarmor_1.png new file mode 100644 index 0000000000..5ff8e3e034 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/armor/yetiarmor_1.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/armor/yetiarmor_2.png b/src/main/resources/classic/assets/twilightforest/textures/armor/yetiarmor_2.png new file mode 100644 index 0000000000..bea4f7d1fa Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/armor/yetiarmor_2.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/arctic_fur_block.png b/src/main/resources/classic/assets/twilightforest/textures/block/arctic_fur_block.png new file mode 100644 index 0000000000..7aa2ab11f9 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/arctic_fur_block.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/arctic_fur_block.png.mcmeta b/src/main/resources/classic/assets/twilightforest/textures/block/arctic_fur_block.png.mcmeta new file mode 100644 index 0000000000..9ba7af1ed8 --- /dev/null +++ b/src/main/resources/classic/assets/twilightforest/textures/block/arctic_fur_block.png.mcmeta @@ -0,0 +1,7 @@ +{ + "ctm": { + "ctm_version": 1, + "type": "ctm", + "textures": [ "twilightforest:block/arctic_fur_block_ctm" ] + } +} diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/arctic_fur_block_ctm.png b/src/main/resources/classic/assets/twilightforest/textures/block/arctic_fur_block_ctm.png new file mode 100644 index 0000000000..9fb3bd37fa Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/arctic_fur_block_ctm.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_0.png b/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_0.png new file mode 100644 index 0000000000..bc93edfd27 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_0.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_0.png.mcmeta b/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_0.png.mcmeta new file mode 100644 index 0000000000..62c3ce53c5 --- /dev/null +++ b/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_0.png.mcmeta @@ -0,0 +1,38 @@ +{ + "animation": { + "frametime": 4, + "interpolate": true, + "frames": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 14, + 13, + 12, + 11, + 10, + 9, + 8, + 7, + 6, + 5, + 4, + 3, + 2, + 1 + ] + } +} \ No newline at end of file diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_1.png b/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_1.png new file mode 100644 index 0000000000..bc93edfd27 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_1.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_1.png.mcmeta b/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_1.png.mcmeta new file mode 100644 index 0000000000..6698db17a2 --- /dev/null +++ b/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_1.png.mcmeta @@ -0,0 +1,38 @@ +{ + "animation": { + "frametime": 4, + "interpolate": true, + "frames": [ + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 14, + 13, + 12, + 11, + 10, + 9, + 8, + 7, + 6, + 5, + 4, + 3, + 2, + 1, + 0, + 1 + ] + } +} \ No newline at end of file diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_10.png b/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_10.png new file mode 100644 index 0000000000..bc93edfd27 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_10.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_10.png.mcmeta b/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_10.png.mcmeta new file mode 100644 index 0000000000..89a7b346ed --- /dev/null +++ b/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_10.png.mcmeta @@ -0,0 +1,38 @@ +{ + "animation": { + "frametime": 4, + "interpolate": true, + "frames": [ + 10, + 9, + 8, + 7, + 6, + 5, + 4, + 3, + 2, + 1, + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 14, + 13, + 12, + 11 + ] + } +} \ No newline at end of file diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_11.png b/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_11.png new file mode 100644 index 0000000000..bc93edfd27 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_11.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_11.png.mcmeta b/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_11.png.mcmeta new file mode 100644 index 0000000000..f049f9a635 --- /dev/null +++ b/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_11.png.mcmeta @@ -0,0 +1,38 @@ +{ + "animation": { + "frametime": 4, + "interpolate": true, + "frames": [ + 8, + 7, + 6, + 5, + 4, + 3, + 2, + 1, + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 14, + 13, + 12, + 11, + 10, + 9 + ] + } +} \ No newline at end of file diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_12.png b/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_12.png new file mode 100644 index 0000000000..bc93edfd27 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_12.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_12.png.mcmeta b/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_12.png.mcmeta new file mode 100644 index 0000000000..b11e22cfa2 --- /dev/null +++ b/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_12.png.mcmeta @@ -0,0 +1,38 @@ +{ + "animation": { + "frametime": 4, + "interpolate": true, + "frames": [ + 6, + 5, + 4, + 3, + 2, + 1, + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 14, + 13, + 12, + 11, + 10, + 9, + 8, + 7 + ] + } +} \ No newline at end of file diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_13.png b/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_13.png new file mode 100644 index 0000000000..bc93edfd27 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_13.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_13.png.mcmeta b/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_13.png.mcmeta new file mode 100644 index 0000000000..655f3eda86 --- /dev/null +++ b/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_13.png.mcmeta @@ -0,0 +1,38 @@ +{ + "animation": { + "frametime": 4, + "interpolate": true, + "frames": [ + 4, + 3, + 2, + 1, + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 14, + 13, + 12, + 11, + 10, + 9, + 8, + 7, + 6, + 5 + ] + } +} \ No newline at end of file diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_14.png b/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_14.png new file mode 100644 index 0000000000..bc93edfd27 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_14.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_14.png.mcmeta b/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_14.png.mcmeta new file mode 100644 index 0000000000..99f9e7ee23 --- /dev/null +++ b/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_14.png.mcmeta @@ -0,0 +1,38 @@ +{ + "animation": { + "frametime": 4, + "interpolate": true, + "frames": [ + 2, + 1, + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 14, + 13, + 12, + 11, + 10, + 9, + 8, + 7, + 6, + 5, + 4, + 3 + ] + } +} \ No newline at end of file diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_15.png b/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_15.png new file mode 100644 index 0000000000..bc93edfd27 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_15.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_15.png.mcmeta b/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_15.png.mcmeta new file mode 100644 index 0000000000..62c3ce53c5 --- /dev/null +++ b/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_15.png.mcmeta @@ -0,0 +1,38 @@ +{ + "animation": { + "frametime": 4, + "interpolate": true, + "frames": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 14, + 13, + 12, + 11, + 10, + 9, + 8, + 7, + 6, + 5, + 4, + 3, + 2, + 1 + ] + } +} \ No newline at end of file diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_2.png b/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_2.png new file mode 100644 index 0000000000..bc93edfd27 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_2.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_2.png.mcmeta b/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_2.png.mcmeta new file mode 100644 index 0000000000..d779139fcb --- /dev/null +++ b/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_2.png.mcmeta @@ -0,0 +1,38 @@ +{ + "animation": { + "frametime": 4, + "interpolate": true, + "frames": [ + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 14, + 13, + 12, + 11, + 10, + 9, + 8, + 7, + 6, + 5, + 4, + 3, + 2, + 1, + 0, + 1, + 2, + 3 + ] + } +} \ No newline at end of file diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_3.png b/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_3.png new file mode 100644 index 0000000000..bc93edfd27 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_3.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_3.png.mcmeta b/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_3.png.mcmeta new file mode 100644 index 0000000000..05c40d3d4a --- /dev/null +++ b/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_3.png.mcmeta @@ -0,0 +1,38 @@ +{ + "animation": { + "frametime": 4, + "interpolate": true, + "frames": [ + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 14, + 13, + 12, + 11, + 10, + 9, + 8, + 7, + 6, + 5, + 4, + 3, + 2, + 1, + 0, + 1, + 2, + 3, + 4, + 5 + ] + } +} \ No newline at end of file diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_4.png b/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_4.png new file mode 100644 index 0000000000..bc93edfd27 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_4.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_4.png.mcmeta b/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_4.png.mcmeta new file mode 100644 index 0000000000..922d27547b --- /dev/null +++ b/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_4.png.mcmeta @@ -0,0 +1,38 @@ +{ + "animation": { + "frametime": 4, + "interpolate": true, + "frames": [ + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 14, + 13, + 12, + 11, + 10, + 9, + 8, + 7, + 6, + 5, + 4, + 3, + 2, + 1, + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7 + ] + } +} \ No newline at end of file diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_5.png b/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_5.png new file mode 100644 index 0000000000..bc93edfd27 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_5.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_5.png.mcmeta b/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_5.png.mcmeta new file mode 100644 index 0000000000..5738e9ae0b --- /dev/null +++ b/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_5.png.mcmeta @@ -0,0 +1,38 @@ +{ + "animation": { + "frametime": 4, + "interpolate": true, + "frames": [ + 10, + 11, + 12, + 13, + 14, + 15, + 14, + 13, + 12, + 11, + 10, + 9, + 8, + 7, + 6, + 5, + 4, + 3, + 2, + 1, + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9 + ] + } +} \ No newline at end of file diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_6.png b/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_6.png new file mode 100644 index 0000000000..bc93edfd27 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_6.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_6.png.mcmeta b/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_6.png.mcmeta new file mode 100644 index 0000000000..b5c395d4b2 --- /dev/null +++ b/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_6.png.mcmeta @@ -0,0 +1,38 @@ +{ + "animation": { + "frametime": 4, + "interpolate": true, + "frames": [ + 12, + 13, + 14, + 15, + 14, + 13, + 12, + 11, + 10, + 9, + 8, + 7, + 6, + 5, + 4, + 3, + 2, + 1, + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11 + ] + } +} \ No newline at end of file diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_7.png b/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_7.png new file mode 100644 index 0000000000..bc93edfd27 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_7.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_7.png.mcmeta b/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_7.png.mcmeta new file mode 100644 index 0000000000..a7072035a4 --- /dev/null +++ b/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_7.png.mcmeta @@ -0,0 +1,38 @@ +{ + "animation": { + "frametime": 4, + "interpolate": true, + "frames": [ + 14, + 15, + 14, + 13, + 12, + 11, + 10, + 9, + 8, + 7, + 6, + 5, + 4, + 3, + 2, + 1, + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13 + ] + } +} \ No newline at end of file diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_8.png b/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_8.png new file mode 100644 index 0000000000..bc93edfd27 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_8.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_8.png.mcmeta b/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_8.png.mcmeta new file mode 100644 index 0000000000..6e31ab8e5b --- /dev/null +++ b/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_8.png.mcmeta @@ -0,0 +1,38 @@ +{ + "animation": { + "frametime": 4, + "interpolate": true, + "frames": [ + 14, + 13, + 12, + 11, + 10, + 9, + 8, + 7, + 6, + 5, + 4, + 3, + 2, + 1, + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15 + ] + } +} \ No newline at end of file diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_9.png b/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_9.png new file mode 100644 index 0000000000..bc93edfd27 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_9.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_9.png.mcmeta b/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_9.png.mcmeta new file mode 100644 index 0000000000..42d4716cad --- /dev/null +++ b/src/main/resources/classic/assets/twilightforest/textures/block/aurora_block_9.png.mcmeta @@ -0,0 +1,38 @@ +{ + "animation": { + "frametime": 4, + "interpolate": true, + "frames": [ + 12, + 11, + 10, + 9, + 8, + 7, + 6, + 5, + 4, + 3, + 2, + 1, + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 14, + 13 + ] + } +} \ No newline at end of file diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/aurora_pillar.png b/src/main/resources/classic/assets/twilightforest/textures/block/aurora_pillar.png new file mode 100644 index 0000000000..f76615b0f8 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/aurora_pillar.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/aurora_pillar_top.png b/src/main/resources/classic/assets/twilightforest/textures/block/aurora_pillar_top.png new file mode 100644 index 0000000000..2bb7368543 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/aurora_pillar_top.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/aurora_slab_side.png b/src/main/resources/classic/assets/twilightforest/textures/block/aurora_slab_side.png new file mode 100644 index 0000000000..7fca163040 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/aurora_slab_side.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/auroralized_glass.png b/src/main/resources/classic/assets/twilightforest/textures/block/auroralized_glass.png new file mode 100644 index 0000000000..fbc11a19c3 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/auroralized_glass.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/auroralized_glass.png.mcmeta b/src/main/resources/classic/assets/twilightforest/textures/block/auroralized_glass.png.mcmeta new file mode 100644 index 0000000000..5dbfe04233 --- /dev/null +++ b/src/main/resources/classic/assets/twilightforest/textures/block/auroralized_glass.png.mcmeta @@ -0,0 +1,8 @@ +{ + "ctm": { + "ctm_version": 1, + "type": "ctm", + "layer": "TRANSLUCENT", + "textures": [ "twilightforest:block/auroralized_glass_ct" ] + } +} diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/auroralized_glass_ct.png b/src/main/resources/classic/assets/twilightforest/textures/block/auroralized_glass_ct.png new file mode 100644 index 0000000000..4c3004df0e Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/auroralized_glass_ct.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/blank.png b/src/main/resources/classic/assets/twilightforest/textures/block/blank.png new file mode 100644 index 0000000000..aeaf6d4b67 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/blank.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/blank.png.mcmeta b/src/main/resources/classic/assets/twilightforest/textures/block/blank.png.mcmeta new file mode 100644 index 0000000000..f2f6a49153 --- /dev/null +++ b/src/main/resources/classic/assets/twilightforest/textures/block/blank.png.mcmeta @@ -0,0 +1,6 @@ +{ + "ctm": { + "ctm_version": 1, + "layer": "CUTOUT" + } +} \ No newline at end of file diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/bold_castle_brick_pillar_end.png b/src/main/resources/classic/assets/twilightforest/textures/block/bold_castle_brick_pillar_end.png new file mode 100644 index 0000000000..fa90a64927 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/bold_castle_brick_pillar_end.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/bold_castle_brick_pillar_side.png b/src/main/resources/classic/assets/twilightforest/textures/block/bold_castle_brick_pillar_side.png new file mode 100644 index 0000000000..3e2f7d1036 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/bold_castle_brick_pillar_side.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/bold_castle_brick_tile.png b/src/main/resources/classic/assets/twilightforest/textures/block/bold_castle_brick_tile.png new file mode 100644 index 0000000000..73149209df Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/bold_castle_brick_tile.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/boss_spawner.png b/src/main/resources/classic/assets/twilightforest/textures/block/boss_spawner.png new file mode 100644 index 0000000000..00f30f864d Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/boss_spawner.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/brown_thorns_side.png b/src/main/resources/classic/assets/twilightforest/textures/block/brown_thorns_side.png new file mode 100644 index 0000000000..1e1393ea55 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/brown_thorns_side.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/brown_thorns_top.png b/src/main/resources/classic/assets/twilightforest/textures/block/brown_thorns_top.png new file mode 100644 index 0000000000..586b3c5bc7 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/brown_thorns_top.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/burnt_thorns_side.png b/src/main/resources/classic/assets/twilightforest/textures/block/burnt_thorns_side.png new file mode 100644 index 0000000000..e602642d90 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/burnt_thorns_side.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/burnt_thorns_top.png b/src/main/resources/classic/assets/twilightforest/textures/block/burnt_thorns_top.png new file mode 100644 index 0000000000..f92be88d2c Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/burnt_thorns_top.png differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/canopy_side.png b/src/main/resources/classic/assets/twilightforest/textures/block/canopy_log.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/blocks/canopy_side.png rename to src/main/resources/classic/assets/twilightforest/textures/block/canopy_log.png diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/canopy_log_top.png b/src/main/resources/classic/assets/twilightforest/textures/block/canopy_log_top.png new file mode 100644 index 0000000000..8b5aec047f Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/canopy_log_top.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/canopy_sapling.png b/src/main/resources/classic/assets/twilightforest/textures/block/canopy_sapling.png new file mode 100644 index 0000000000..f3191d0785 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/canopy_sapling.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/carminite_block.png b/src/main/resources/classic/assets/twilightforest/textures/block/carminite_block.png new file mode 100644 index 0000000000..a588507690 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/carminite_block.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/carminite_block_overlay.png b/src/main/resources/classic/assets/twilightforest/textures/block/carminite_block_overlay.png new file mode 100644 index 0000000000..391b227d00 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/carminite_block_overlay.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/castle_brick.png b/src/main/resources/classic/assets/twilightforest/textures/block/castle_brick.png new file mode 100644 index 0000000000..ae420b234c Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/castle_brick.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/castle_brick_frame_edge2.png b/src/main/resources/classic/assets/twilightforest/textures/block/castle_brick_frame_edge2.png new file mode 100644 index 0000000000..99d1c70353 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/castle_brick_frame_edge2.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/castle_brick_frame_edge_v2.png b/src/main/resources/classic/assets/twilightforest/textures/block/castle_brick_frame_edge_v2.png new file mode 100644 index 0000000000..065d07be0f Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/castle_brick_frame_edge_v2.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/castle_brick_stairs.png b/src/main/resources/classic/assets/twilightforest/textures/block/castle_brick_stairs.png new file mode 100644 index 0000000000..c1ae7177a1 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/castle_brick_stairs.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/castle_door.png b/src/main/resources/classic/assets/twilightforest/textures/block/castle_door.png new file mode 100644 index 0000000000..90157a91a3 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/castle_door.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/castle_door_active.png b/src/main/resources/classic/assets/twilightforest/textures/block/castle_door_active.png new file mode 100644 index 0000000000..90157a91a3 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/castle_door_active.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/castle_door_rune_corners.png b/src/main/resources/classic/assets/twilightforest/textures/block/castle_door_rune_corners.png new file mode 100644 index 0000000000..125241085e Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/castle_door_rune_corners.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/castle_door_rune_ctm.png b/src/main/resources/classic/assets/twilightforest/textures/block/castle_door_rune_ctm.png new file mode 100644 index 0000000000..f494bda90d Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/castle_door_rune_ctm.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/castle_door_vanished.png b/src/main/resources/classic/assets/twilightforest/textures/block/castle_door_vanished.png new file mode 100644 index 0000000000..5098bcf7a2 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/castle_door_vanished.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/castle_door_vanished_active.png b/src/main/resources/classic/assets/twilightforest/textures/block/castle_door_vanished_active.png new file mode 100644 index 0000000000..ec28f5ee58 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/castle_door_vanished_active.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/castle_roof_tile.png b/src/main/resources/classic/assets/twilightforest/textures/block/castle_roof_tile.png new file mode 100644 index 0000000000..a3140bf07c Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/castle_roof_tile.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/castleblock_magic_0.png b/src/main/resources/classic/assets/twilightforest/textures/block/castleblock_magic_0.png new file mode 100644 index 0000000000..c29128824d Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/castleblock_magic_0.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/castleblock_magic_1.png b/src/main/resources/classic/assets/twilightforest/textures/block/castleblock_magic_1.png new file mode 100644 index 0000000000..2a4af05bce Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/castleblock_magic_1.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/castleblock_magic_2.png b/src/main/resources/classic/assets/twilightforest/textures/block/castleblock_magic_2.png new file mode 100644 index 0000000000..f68e42e5c9 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/castleblock_magic_2.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/castleblock_magic_3.png b/src/main/resources/classic/assets/twilightforest/textures/block/castleblock_magic_3.png new file mode 100644 index 0000000000..e4121a603c Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/castleblock_magic_3.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/castleblock_magic_4.png b/src/main/resources/classic/assets/twilightforest/textures/block/castleblock_magic_4.png new file mode 100644 index 0000000000..a2a9d46018 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/castleblock_magic_4.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/castleblock_magic_5.png b/src/main/resources/classic/assets/twilightforest/textures/block/castleblock_magic_5.png new file mode 100644 index 0000000000..13aa051d11 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/castleblock_magic_5.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/castleblock_magic_6.png b/src/main/resources/classic/assets/twilightforest/textures/block/castleblock_magic_6.png new file mode 100644 index 0000000000..a6db780d74 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/castleblock_magic_6.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/castleblock_magic_7.png b/src/main/resources/classic/assets/twilightforest/textures/block/castleblock_magic_7.png new file mode 100644 index 0000000000..9f7b0c6644 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/castleblock_magic_7.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/castleblock_tile.png b/src/main/resources/classic/assets/twilightforest/textures/block/castleblock_tile.png new file mode 100644 index 0000000000..ad44ecb539 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/castleblock_tile.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/cicada.png b/src/main/resources/classic/assets/twilightforest/textures/block/cicada.png new file mode 100644 index 0000000000..24c6f2b7cc Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/cicada.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/cinder_corner.png b/src/main/resources/classic/assets/twilightforest/textures/block/cinder_corner.png new file mode 100644 index 0000000000..6fd8546c91 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/cinder_corner.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/cinder_log.png b/src/main/resources/classic/assets/twilightforest/textures/block/cinder_log.png new file mode 100644 index 0000000000..2131806b85 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/cinder_log.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/cinder_log_top.png b/src/main/resources/classic/assets/twilightforest/textures/block/cinder_log_top.png new file mode 100644 index 0000000000..14b9c8f8c0 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/cinder_log_top.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/cinder_side.png b/src/main/resources/classic/assets/twilightforest/textures/block/cinder_side.png new file mode 100644 index 0000000000..058f15ca65 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/cinder_side.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/cinder_top.png b/src/main/resources/classic/assets/twilightforest/textures/block/cinder_top.png new file mode 100644 index 0000000000..afb5abdd05 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/cinder_top.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/cloverpatch.png b/src/main/resources/classic/assets/twilightforest/textures/block/cloverpatch.png new file mode 100644 index 0000000000..6d0f947748 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/cloverpatch.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/cracked_castle_brick.png b/src/main/resources/classic/assets/twilightforest/textures/block/cracked_castle_brick.png new file mode 100644 index 0000000000..b1278f9596 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/cracked_castle_brick.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/cracked_castle_brick_stairs.png b/src/main/resources/classic/assets/twilightforest/textures/block/cracked_castle_brick_stairs.png new file mode 100644 index 0000000000..d3f9a1b525 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/cracked_castle_brick_stairs.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/cracked_deadrock.png b/src/main/resources/classic/assets/twilightforest/textures/block/cracked_deadrock.png new file mode 100644 index 0000000000..0a433cbffd Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/cracked_deadrock.png differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/mazestone_cracked.png b/src/main/resources/classic/assets/twilightforest/textures/block/cracked_mazestone.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/blocks/mazestone_cracked.png rename to src/main/resources/classic/assets/twilightforest/textures/block/cracked_mazestone.png diff --git a/src/main/resources/assets/twilightforest/textures/blocks/towerwood_cracked.png b/src/main/resources/classic/assets/twilightforest/textures/block/cracked_towerwood.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/blocks/towerwood_cracked.png rename to src/main/resources/classic/assets/twilightforest/textures/block/cracked_towerwood.png diff --git a/src/main/resources/assets/twilightforest/textures/blocks/towerwood_alt.png b/src/main/resources/classic/assets/twilightforest/textures/block/cracked_towerwood_alt.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/blocks/towerwood_alt.png rename to src/main/resources/classic/assets/twilightforest/textures/block/cracked_towerwood_alt.png diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/cracked_underbrick.png b/src/main/resources/classic/assets/twilightforest/textures/block/cracked_underbrick.png new file mode 100644 index 0000000000..117d884923 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/cracked_underbrick.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/cut_mazestone.png b/src/main/resources/classic/assets/twilightforest/textures/block/cut_mazestone.png new file mode 100644 index 0000000000..3eec5e5c8a Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/cut_mazestone.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/dark_log.png b/src/main/resources/classic/assets/twilightforest/textures/block/dark_log.png new file mode 100644 index 0000000000..174c42f0c2 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/dark_log.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/dark_log_top.png b/src/main/resources/classic/assets/twilightforest/textures/block/dark_log_top.png new file mode 100644 index 0000000000..e620acf7a0 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/dark_log_top.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/darkwood_leaves.png b/src/main/resources/classic/assets/twilightforest/textures/block/darkwood_leaves.png new file mode 100644 index 0000000000..5b41d4a786 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/darkwood_leaves.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/darkwood_sapling.png b/src/main/resources/classic/assets/twilightforest/textures/block/darkwood_sapling.png new file mode 100644 index 0000000000..f2ab898ccf Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/darkwood_sapling.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/deadrock.png b/src/main/resources/classic/assets/twilightforest/textures/block/deadrock.png new file mode 100644 index 0000000000..b5e888f427 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/deadrock.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/decorative_mazestone.png b/src/main/resources/classic/assets/twilightforest/textures/block/decorative_mazestone.png new file mode 100644 index 0000000000..18ae966306 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/decorative_mazestone.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/encased_castle_brick_pillar_end.png b/src/main/resources/classic/assets/twilightforest/textures/block/encased_castle_brick_pillar_end.png new file mode 100644 index 0000000000..094af27c8a Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/encased_castle_brick_pillar_end.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/encased_castle_brick_pillar_h.png b/src/main/resources/classic/assets/twilightforest/textures/block/encased_castle_brick_pillar_h.png new file mode 100644 index 0000000000..371d62b20b Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/encased_castle_brick_pillar_h.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/encased_castle_brick_pillar_side.png b/src/main/resources/classic/assets/twilightforest/textures/block/encased_castle_brick_pillar_side.png new file mode 100644 index 0000000000..1a930f9d44 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/encased_castle_brick_pillar_side.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/encased_towerwood.png b/src/main/resources/classic/assets/twilightforest/textures/block/encased_towerwood.png new file mode 100644 index 0000000000..a866c2d8d4 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/encased_towerwood.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/etched_nagastone_down.png b/src/main/resources/classic/assets/twilightforest/textures/block/etched_nagastone_down.png new file mode 100644 index 0000000000..30629d30f2 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/etched_nagastone_down.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/etched_nagastone_down_mossy.png b/src/main/resources/classic/assets/twilightforest/textures/block/etched_nagastone_down_mossy.png new file mode 100644 index 0000000000..26f2d7f6e4 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/etched_nagastone_down_mossy.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/etched_nagastone_down_weathered.png b/src/main/resources/classic/assets/twilightforest/textures/block/etched_nagastone_down_weathered.png new file mode 100644 index 0000000000..e2ecd68ad2 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/etched_nagastone_down_weathered.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/etched_nagastone_left.png b/src/main/resources/classic/assets/twilightforest/textures/block/etched_nagastone_left.png new file mode 100644 index 0000000000..3b5db54568 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/etched_nagastone_left.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/etched_nagastone_left_mossy.png b/src/main/resources/classic/assets/twilightforest/textures/block/etched_nagastone_left_mossy.png new file mode 100644 index 0000000000..d1ea49739d Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/etched_nagastone_left_mossy.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/etched_nagastone_left_weathered.png b/src/main/resources/classic/assets/twilightforest/textures/block/etched_nagastone_left_weathered.png new file mode 100644 index 0000000000..1bab0a5646 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/etched_nagastone_left_weathered.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/etched_nagastone_right.png b/src/main/resources/classic/assets/twilightforest/textures/block/etched_nagastone_right.png new file mode 100644 index 0000000000..04004b0944 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/etched_nagastone_right.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/etched_nagastone_right_mossy.png b/src/main/resources/classic/assets/twilightforest/textures/block/etched_nagastone_right_mossy.png new file mode 100644 index 0000000000..bf6645fda4 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/etched_nagastone_right_mossy.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/etched_nagastone_right_weathered.png b/src/main/resources/classic/assets/twilightforest/textures/block/etched_nagastone_right_weathered.png new file mode 100644 index 0000000000..cf38f1d3ee Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/etched_nagastone_right_weathered.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/etched_nagastone_up.png b/src/main/resources/classic/assets/twilightforest/textures/block/etched_nagastone_up.png new file mode 100644 index 0000000000..4b2c9bd052 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/etched_nagastone_up.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/etched_nagastone_up_mossy.png b/src/main/resources/classic/assets/twilightforest/textures/block/etched_nagastone_up_mossy.png new file mode 100644 index 0000000000..e42e27fb5c Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/etched_nagastone_up_mossy.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/etched_nagastone_up_weathered.png b/src/main/resources/classic/assets/twilightforest/textures/block/etched_nagastone_up_weathered.png new file mode 100644 index 0000000000..2b48bd5d07 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/etched_nagastone_up_weathered.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/experiment115/experiment115_bottom.png b/src/main/resources/classic/assets/twilightforest/textures/block/experiment115/experiment115_bottom.png new file mode 100644 index 0000000000..428f0b7644 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/experiment115/experiment115_bottom.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/experiment115/experiment115_inner.png b/src/main/resources/classic/assets/twilightforest/textures/block/experiment115/experiment115_inner.png new file mode 100644 index 0000000000..2ad77b6fdb Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/experiment115/experiment115_inner.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/experiment115/experiment115_side.png b/src/main/resources/classic/assets/twilightforest/textures/block/experiment115/experiment115_side.png new file mode 100644 index 0000000000..99fb947693 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/experiment115/experiment115_side.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/experiment115/experiment115_sprinkle.png b/src/main/resources/classic/assets/twilightforest/textures/block/experiment115/experiment115_sprinkle.png new file mode 100644 index 0000000000..b5720abeb4 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/experiment115/experiment115_sprinkle.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/experiment115/experiment115_top.png b/src/main/resources/classic/assets/twilightforest/textures/block/experiment115/experiment115_top.png new file mode 100644 index 0000000000..a6fc968aeb Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/experiment115/experiment115_top.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/fiddlehead.png b/src/main/resources/classic/assets/twilightforest/textures/block/fiddlehead.png new file mode 100644 index 0000000000..955434256f Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/fiddlehead.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/fiery_block.png b/src/main/resources/classic/assets/twilightforest/textures/block/fiery_block.png new file mode 100644 index 0000000000..96a656a95e Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/fiery_block.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/fiery_block_inner.png b/src/main/resources/classic/assets/twilightforest/textures/block/fiery_block_inner.png new file mode 100644 index 0000000000..fd22143c27 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/fiery_block_inner.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/fiery_block_inner.png.mcmeta b/src/main/resources/classic/assets/twilightforest/textures/block/fiery_block_inner.png.mcmeta new file mode 100644 index 0000000000..2384db8758 --- /dev/null +++ b/src/main/resources/classic/assets/twilightforest/textures/block/fiery_block_inner.png.mcmeta @@ -0,0 +1,12 @@ +{ + "ctm": { + "ctm_version": 1, + "type": "ctm", + "layer": "CUTOUT", + "textures": [ "twilightforest:block/fiery_block_inner_ctm" ], + "extra": { + "light": 15, + "connect_inside": true + } + } +} diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/fiery_block_inner_ctm.png b/src/main/resources/classic/assets/twilightforest/textures/block/fiery_block_inner_ctm.png new file mode 100644 index 0000000000..ec403d9cc5 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/fiery_block_inner_ctm.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/fiery_pattern.png b/src/main/resources/classic/assets/twilightforest/textures/block/fiery_pattern.png new file mode 100644 index 0000000000..dedc0257a3 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/fiery_pattern.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/fiery_pattern.png.mcmeta b/src/main/resources/classic/assets/twilightforest/textures/block/fiery_pattern.png.mcmeta new file mode 100644 index 0000000000..aaf1204dba --- /dev/null +++ b/src/main/resources/classic/assets/twilightforest/textures/block/fiery_pattern.png.mcmeta @@ -0,0 +1,10 @@ +{ + "ctm": { + "ctm_version": 1, + "type": "pattern", + "extra": { + "light": 15, + "size": 2 + } + } +} diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/firefly.png b/src/main/resources/classic/assets/twilightforest/textures/block/firefly.png new file mode 100644 index 0000000000..1e2d50c890 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/firefly.png differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/fireflyjar_top.png b/src/main/resources/classic/assets/twilightforest/textures/block/fireflyjar_bottom.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/blocks/fireflyjar_top.png rename to src/main/resources/classic/assets/twilightforest/textures/block/fireflyjar_bottom.png diff --git a/src/main/resources/assets/twilightforest/textures/blocks/fireflyjar_cork.png b/src/main/resources/classic/assets/twilightforest/textures/block/fireflyjar_cork.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/blocks/fireflyjar_cork.png rename to src/main/resources/classic/assets/twilightforest/textures/block/fireflyjar_cork.png diff --git a/src/main/resources/assets/twilightforest/textures/blocks/fireflyjar_side.png b/src/main/resources/classic/assets/twilightforest/textures/block/fireflyjar_side.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/blocks/fireflyjar_side.png rename to src/main/resources/classic/assets/twilightforest/textures/block/fireflyjar_side.png diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/fireflyjar_top.png b/src/main/resources/classic/assets/twilightforest/textures/block/fireflyjar_top.png new file mode 100644 index 0000000000..6cd77e5d90 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/fireflyjar_top.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/firejet_side.png b/src/main/resources/classic/assets/twilightforest/textures/block/firejet_side.png new file mode 100644 index 0000000000..1f63e48769 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/firejet_side.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/firejet_top.png b/src/main/resources/classic/assets/twilightforest/textures/block/firejet_top.png new file mode 100644 index 0000000000..f38733e164 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/firejet_top.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/fluffy_cloud.png b/src/main/resources/classic/assets/twilightforest/textures/block/fluffy_cloud.png new file mode 100644 index 0000000000..528e6cb359 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/fluffy_cloud.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/forcefield_blue.png b/src/main/resources/classic/assets/twilightforest/textures/block/forcefield_blue.png new file mode 100644 index 0000000000..6eb4fbafa8 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/forcefield_blue.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/forcefield_green.png b/src/main/resources/classic/assets/twilightforest/textures/block/forcefield_green.png new file mode 100644 index 0000000000..f6cade8f71 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/forcefield_green.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/forcefield_orange.png b/src/main/resources/classic/assets/twilightforest/textures/block/forcefield_orange.png new file mode 100644 index 0000000000..1e2605a915 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/forcefield_orange.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/forcefield_pink.png b/src/main/resources/classic/assets/twilightforest/textures/block/forcefield_pink.png new file mode 100644 index 0000000000..6c00e0dbc7 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/forcefield_pink.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/forcefield_purple.png b/src/main/resources/classic/assets/twilightforest/textures/block/forcefield_purple.png new file mode 100644 index 0000000000..4224459e6c Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/forcefield_purple.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/forcefield_tint.png b/src/main/resources/classic/assets/twilightforest/textures/block/forcefield_tint.png new file mode 100644 index 0000000000..c4fcd76151 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/forcefield_tint.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/forcefield_tint.png.mcmeta b/src/main/resources/classic/assets/twilightforest/textures/block/forcefield_tint.png.mcmeta new file mode 100644 index 0000000000..37db033060 --- /dev/null +++ b/src/main/resources/classic/assets/twilightforest/textures/block/forcefield_tint.png.mcmeta @@ -0,0 +1,15 @@ +{ + "ctm": { + "ctm_version": 1, + "type":"ctm", + "layer":"TRANSLUCENT", + "textures":[ + "twilightforest:block/forcefield_tint_ct" + ], + "extra": { + "light": 15, + "connect_inside": true, + "ignore_states": true + } + } +} diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/forcefield_tint_ct.png b/src/main/resources/classic/assets/twilightforest/textures/block/forcefield_tint_ct.png new file mode 100644 index 0000000000..83d3280a57 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/forcefield_tint_ct.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/forcefield_top.png b/src/main/resources/classic/assets/twilightforest/textures/block/forcefield_top.png new file mode 100644 index 0000000000..dc3559c918 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/forcefield_top.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/forcefield_white.png b/src/main/resources/classic/assets/twilightforest/textures/block/forcefield_white.png new file mode 100644 index 0000000000..42b7311113 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/forcefield_white.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/green_thorns_side.png b/src/main/resources/classic/assets/twilightforest/textures/block/green_thorns_side.png new file mode 100644 index 0000000000..ae9b3a8e8f Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/green_thorns_side.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/green_thorns_top.png b/src/main/resources/classic/assets/twilightforest/textures/block/green_thorns_top.png new file mode 100644 index 0000000000..26ce9c391e Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/green_thorns_top.png differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/hedge.png b/src/main/resources/classic/assets/twilightforest/textures/block/hedge.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/blocks/hedge.png rename to src/main/resources/classic/assets/twilightforest/textures/block/hedge.png diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/hedge_rose.png b/src/main/resources/classic/assets/twilightforest/textures/block/hedge_rose.png new file mode 100644 index 0000000000..cf42edd7f8 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/hedge_rose.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/hollow_oak_sapling.png b/src/main/resources/classic/assets/twilightforest/textures/block/hollow_oak_sapling.png new file mode 100644 index 0000000000..7b87755bab Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/hollow_oak_sapling.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/huge_gloom_cap.png b/src/main/resources/classic/assets/twilightforest/textures/block/huge_gloom_cap.png new file mode 100644 index 0000000000..d012e6cc32 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/huge_gloom_cap.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/huge_gloom_cap.png.mcmeta b/src/main/resources/classic/assets/twilightforest/textures/block/huge_gloom_cap.png.mcmeta new file mode 100644 index 0000000000..36845e4915 --- /dev/null +++ b/src/main/resources/classic/assets/twilightforest/textures/block/huge_gloom_cap.png.mcmeta @@ -0,0 +1,8 @@ +{ + "ctm": { + "ctm_version": 1, + "extra": { + "light": 7 + } + } +} \ No newline at end of file diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/huge_gloom_inside.png b/src/main/resources/classic/assets/twilightforest/textures/block/huge_gloom_inside.png new file mode 100644 index 0000000000..bcc12ee370 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/huge_gloom_inside.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/huge_gloom_inside.png.mcmeta b/src/main/resources/classic/assets/twilightforest/textures/block/huge_gloom_inside.png.mcmeta new file mode 100644 index 0000000000..36845e4915 --- /dev/null +++ b/src/main/resources/classic/assets/twilightforest/textures/block/huge_gloom_inside.png.mcmeta @@ -0,0 +1,8 @@ +{ + "ctm": { + "ctm_version": 1, + "extra": { + "light": 7 + } + } +} \ No newline at end of file diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/huge_lily_pad.png b/src/main/resources/classic/assets/twilightforest/textures/block/huge_lily_pad.png new file mode 100644 index 0000000000..5bb645c9b2 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/huge_lily_pad.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/huge_lily_pad_0.png b/src/main/resources/classic/assets/twilightforest/textures/block/huge_lily_pad_0.png new file mode 100644 index 0000000000..267bd9c1f9 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/huge_lily_pad_0.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/huge_lily_pad_1.png b/src/main/resources/classic/assets/twilightforest/textures/block/huge_lily_pad_1.png new file mode 100644 index 0000000000..baa9c0e460 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/huge_lily_pad_1.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/huge_lily_pad_2.png b/src/main/resources/classic/assets/twilightforest/textures/block/huge_lily_pad_2.png new file mode 100644 index 0000000000..66ebfac94b Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/huge_lily_pad_2.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/huge_lily_pad_3.png b/src/main/resources/classic/assets/twilightforest/textures/block/huge_lily_pad_3.png new file mode 100644 index 0000000000..51b9d8a8d4 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/huge_lily_pad_3.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/huge_mushgloom_stem.png b/src/main/resources/classic/assets/twilightforest/textures/block/huge_mushgloom_stem.png new file mode 100644 index 0000000000..59c118009e Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/huge_mushgloom_stem.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/huge_mushgloom_stem.png.mcmeta b/src/main/resources/classic/assets/twilightforest/textures/block/huge_mushgloom_stem.png.mcmeta new file mode 100644 index 0000000000..36845e4915 --- /dev/null +++ b/src/main/resources/classic/assets/twilightforest/textures/block/huge_mushgloom_stem.png.mcmeta @@ -0,0 +1,8 @@ +{ + "ctm": { + "ctm_version": 1, + "extra": { + "light": 7 + } + } +} \ No newline at end of file diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/huge_stalk.png b/src/main/resources/classic/assets/twilightforest/textures/block/huge_stalk.png new file mode 100644 index 0000000000..321412c500 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/huge_stalk.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/huge_stalk_top.png b/src/main/resources/classic/assets/twilightforest/textures/block/huge_stalk_top.png new file mode 100644 index 0000000000..d4c7351acb Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/huge_stalk_top.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/huge_water_lily.png b/src/main/resources/classic/assets/twilightforest/textures/block/huge_water_lily.png new file mode 100644 index 0000000000..3e51c8ce59 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/huge_water_lily.png differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/towerwood_infested.png b/src/main/resources/classic/assets/twilightforest/textures/block/infested_towerwood.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/blocks/towerwood_infested.png rename to src/main/resources/classic/assets/twilightforest/textures/block/infested_towerwood.png diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/ironwood_block.png b/src/main/resources/classic/assets/twilightforest/textures/block/ironwood_block.png new file mode 100644 index 0000000000..dc1f587a43 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/ironwood_block.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/ironwood_block.png.mcmeta b/src/main/resources/classic/assets/twilightforest/textures/block/ironwood_block.png.mcmeta new file mode 100644 index 0000000000..917f1a6662 --- /dev/null +++ b/src/main/resources/classic/assets/twilightforest/textures/block/ironwood_block.png.mcmeta @@ -0,0 +1,6 @@ +{ + "ctm": { + "ctm_version": 1, + "proxy": "twilightforest:block/ironwood_frame" + } +} diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/ironwood_frame.png b/src/main/resources/classic/assets/twilightforest/textures/block/ironwood_frame.png new file mode 100644 index 0000000000..4ca84ea329 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/ironwood_frame.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/ironwood_frame.png.mcmeta b/src/main/resources/classic/assets/twilightforest/textures/block/ironwood_frame.png.mcmeta new file mode 100644 index 0000000000..f3adafafcf --- /dev/null +++ b/src/main/resources/classic/assets/twilightforest/textures/block/ironwood_frame.png.mcmeta @@ -0,0 +1,8 @@ +{ + "ctm": { + "ctm_version": 1, + "type": "ctm", + "layer": "CUTOUT", + "textures": [ "twilightforest:block/ironwood_frame_ctm" ] + } +} diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/ironwood_frame_ctm.png b/src/main/resources/classic/assets/twilightforest/textures/block/ironwood_frame_ctm.png new file mode 100644 index 0000000000..302ac93aff Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/ironwood_frame_ctm.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/ironwood_pattern.png b/src/main/resources/classic/assets/twilightforest/textures/block/ironwood_pattern.png new file mode 100644 index 0000000000..11106c0361 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/ironwood_pattern.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/ironwood_pattern.png.mcmeta b/src/main/resources/classic/assets/twilightforest/textures/block/ironwood_pattern.png.mcmeta new file mode 100644 index 0000000000..87f230c7e2 --- /dev/null +++ b/src/main/resources/classic/assets/twilightforest/textures/block/ironwood_pattern.png.mcmeta @@ -0,0 +1,9 @@ +{ + "ctm":{ + "ctm_version": 1, + "type":"pattern", + "extra":{ + "size":3 + } + } +} diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/knightmetal_block.png b/src/main/resources/classic/assets/twilightforest/textures/block/knightmetal_block.png new file mode 100644 index 0000000000..2bc3ebf480 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/knightmetal_block.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/ladder_iron.png b/src/main/resources/classic/assets/twilightforest/textures/block/ladder_iron.png new file mode 100644 index 0000000000..8a24130d07 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/ladder_iron.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/liveroot_block.png b/src/main/resources/classic/assets/twilightforest/textures/block/liveroot_block.png new file mode 100644 index 0000000000..b7b309265c Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/liveroot_block.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/mangrove_log.png b/src/main/resources/classic/assets/twilightforest/textures/block/mangrove_log.png new file mode 100644 index 0000000000..75912ed4f0 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/mangrove_log.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/mangrove_log_top.png b/src/main/resources/classic/assets/twilightforest/textures/block/mangrove_log_top.png new file mode 100644 index 0000000000..abb59082f0 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/mangrove_log_top.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/mangrove_sapling.png b/src/main/resources/classic/assets/twilightforest/textures/block/mangrove_sapling.png new file mode 100644 index 0000000000..dc567b6b1b Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/mangrove_sapling.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/mayapple.png b/src/main/resources/classic/assets/twilightforest/textures/block/mayapple.png new file mode 100644 index 0000000000..405cb71184 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/mayapple.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/mayapple_side.png b/src/main/resources/classic/assets/twilightforest/textures/block/mayapple_side.png new file mode 100644 index 0000000000..f421b5bf0b Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/mayapple_side.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/mazestone.png b/src/main/resources/classic/assets/twilightforest/textures/block/mazestone.png new file mode 100644 index 0000000000..32834f0fa6 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/mazestone.png differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/mazestone_border.png b/src/main/resources/classic/assets/twilightforest/textures/block/mazestone_border.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/blocks/mazestone_border.png rename to src/main/resources/classic/assets/twilightforest/textures/block/mazestone_border.png diff --git a/src/main/resources/assets/twilightforest/textures/blocks/mazestone_brick.png b/src/main/resources/classic/assets/twilightforest/textures/block/mazestone_brick.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/blocks/mazestone_brick.png rename to src/main/resources/classic/assets/twilightforest/textures/block/mazestone_brick.png diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/mazestone_large_brick.png b/src/main/resources/classic/assets/twilightforest/textures/block/mazestone_large_brick.png new file mode 100644 index 0000000000..d378ecf601 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/mazestone_large_brick.png differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/mazestone_mosaic.png b/src/main/resources/classic/assets/twilightforest/textures/block/mazestone_mosaic.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/blocks/mazestone_mosaic.png rename to src/main/resources/classic/assets/twilightforest/textures/block/mazestone_mosaic.png diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/mining_leaves.png b/src/main/resources/classic/assets/twilightforest/textures/block/mining_leaves.png new file mode 100644 index 0000000000..08a3749256 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/mining_leaves.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/mining_leaves.png.mcmeta b/src/main/resources/classic/assets/twilightforest/textures/block/mining_leaves.png.mcmeta new file mode 100644 index 0000000000..53479c883d --- /dev/null +++ b/src/main/resources/classic/assets/twilightforest/textures/block/mining_leaves.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation": { + "frametime":2 + } +} \ No newline at end of file diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/mining_log.png b/src/main/resources/classic/assets/twilightforest/textures/block/mining_log.png new file mode 100644 index 0000000000..38170fb056 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/mining_log.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/mining_log_core.png b/src/main/resources/classic/assets/twilightforest/textures/block/mining_log_core.png new file mode 100644 index 0000000000..ddb547214d Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/mining_log_core.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/mining_log_core_on.png b/src/main/resources/classic/assets/twilightforest/textures/block/mining_log_core_on.png new file mode 100644 index 0000000000..1d68c51284 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/mining_log_core_on.png differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/mine_section.png b/src/main/resources/classic/assets/twilightforest/textures/block/mining_log_top.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/blocks/mine_section.png rename to src/main/resources/classic/assets/twilightforest/textures/block/mining_log_top.png diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/mining_sapling.png b/src/main/resources/classic/assets/twilightforest/textures/block/mining_sapling.png new file mode 100644 index 0000000000..44ea6e696e Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/mining_sapling.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/moonworm.png b/src/main/resources/classic/assets/twilightforest/textures/block/moonworm.png new file mode 100644 index 0000000000..2ff4f60a73 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/moonworm.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/moss_overhang.png b/src/main/resources/classic/assets/twilightforest/textures/block/moss_overhang.png new file mode 100644 index 0000000000..f8ec5f2f7f Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/moss_overhang.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/mosspatch.png b/src/main/resources/classic/assets/twilightforest/textures/block/mosspatch.png new file mode 100644 index 0000000000..1bef844b66 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/mosspatch.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/mossy_castle_brick.png b/src/main/resources/classic/assets/twilightforest/textures/block/mossy_castle_brick.png new file mode 100644 index 0000000000..4efb21eaa2 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/mossy_castle_brick.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/mossy_castle_brick_stairs.png b/src/main/resources/classic/assets/twilightforest/textures/block/mossy_castle_brick_stairs.png new file mode 100644 index 0000000000..b5c08d6a94 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/mossy_castle_brick_stairs.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/mossy_mazestone.png b/src/main/resources/classic/assets/twilightforest/textures/block/mossy_mazestone.png new file mode 100644 index 0000000000..6d8400635c Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/mossy_mazestone.png differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/towerwood_mossy.png b/src/main/resources/classic/assets/twilightforest/textures/block/mossy_towerwood.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/blocks/towerwood_mossy.png rename to src/main/resources/classic/assets/twilightforest/textures/block/mossy_towerwood.png diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/mossy_underbrick.png b/src/main/resources/classic/assets/twilightforest/textures/block/mossy_underbrick.png new file mode 100644 index 0000000000..6a135f915c Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/mossy_underbrick.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/mushgloom.png b/src/main/resources/classic/assets/twilightforest/textures/block/mushgloom.png new file mode 100644 index 0000000000..140cf14514 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/mushgloom.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/mushgloom_head.png b/src/main/resources/classic/assets/twilightforest/textures/block/mushgloom_head.png new file mode 100644 index 0000000000..10d9ce21bd Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/mushgloom_head.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/nagastone_bare.png b/src/main/resources/classic/assets/twilightforest/textures/block/nagastone_bare.png new file mode 100644 index 0000000000..c6eb261293 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/nagastone_bare.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/nagastone_bare_mossy.png b/src/main/resources/classic/assets/twilightforest/textures/block/nagastone_bare_mossy.png new file mode 100644 index 0000000000..41a74db6f0 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/nagastone_bare_mossy.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/nagastone_bare_weathered.png b/src/main/resources/classic/assets/twilightforest/textures/block/nagastone_bare_weathered.png new file mode 100644 index 0000000000..cad6e37bf3 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/nagastone_bare_weathered.png differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/nagastone_bottom_long.png b/src/main/resources/classic/assets/twilightforest/textures/block/nagastone_bottom_long.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/blocks/nagastone_bottom_long.png rename to src/main/resources/classic/assets/twilightforest/textures/block/nagastone_bottom_long.png diff --git a/src/main/resources/assets/twilightforest/textures/blocks/nagastone_bottom_tip.png b/src/main/resources/classic/assets/twilightforest/textures/block/nagastone_bottom_tip.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/blocks/nagastone_bottom_tip.png rename to src/main/resources/classic/assets/twilightforest/textures/block/nagastone_bottom_tip.png diff --git a/src/main/resources/assets/twilightforest/textures/blocks/nagastone_cross_section.png b/src/main/resources/classic/assets/twilightforest/textures/block/nagastone_cross_section.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/blocks/nagastone_cross_section.png rename to src/main/resources/classic/assets/twilightforest/textures/block/nagastone_cross_section.png diff --git a/src/main/resources/assets/twilightforest/textures/blocks/nagastone_face_front.png b/src/main/resources/classic/assets/twilightforest/textures/block/nagastone_face_front.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/blocks/nagastone_face_front.png rename to src/main/resources/classic/assets/twilightforest/textures/block/nagastone_face_front.png diff --git a/src/main/resources/assets/twilightforest/textures/blocks/nagastone_face_left.png b/src/main/resources/classic/assets/twilightforest/textures/block/nagastone_face_left.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/blocks/nagastone_face_left.png rename to src/main/resources/classic/assets/twilightforest/textures/block/nagastone_face_left.png diff --git a/src/main/resources/assets/twilightforest/textures/blocks/nagastone_face_right.png b/src/main/resources/classic/assets/twilightforest/textures/block/nagastone_face_right.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/blocks/nagastone_face_right.png rename to src/main/resources/classic/assets/twilightforest/textures/block/nagastone_face_right.png diff --git a/src/main/resources/assets/twilightforest/textures/blocks/nagastone_left_down.png b/src/main/resources/classic/assets/twilightforest/textures/block/nagastone_left_down.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/blocks/nagastone_left_down.png rename to src/main/resources/classic/assets/twilightforest/textures/block/nagastone_left_down.png diff --git a/src/main/resources/assets/twilightforest/textures/blocks/nagastone_left_up.png b/src/main/resources/classic/assets/twilightforest/textures/block/nagastone_left_up.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/blocks/nagastone_left_up.png rename to src/main/resources/classic/assets/twilightforest/textures/block/nagastone_left_up.png diff --git a/src/main/resources/assets/twilightforest/textures/blocks/nagastone_long_side.png b/src/main/resources/classic/assets/twilightforest/textures/block/nagastone_long_side.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/blocks/nagastone_long_side.png rename to src/main/resources/classic/assets/twilightforest/textures/block/nagastone_long_side.png diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/nagastone_long_vertical.png b/src/main/resources/classic/assets/twilightforest/textures/block/nagastone_long_vertical.png new file mode 100644 index 0000000000..5869970b4e Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/nagastone_long_vertical.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/nagastone_pillar_end.png b/src/main/resources/classic/assets/twilightforest/textures/block/nagastone_pillar_end.png new file mode 100644 index 0000000000..764af39030 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/nagastone_pillar_end.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/nagastone_pillar_end_mossy.png b/src/main/resources/classic/assets/twilightforest/textures/block/nagastone_pillar_end_mossy.png new file mode 100644 index 0000000000..0d4c735068 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/nagastone_pillar_end_mossy.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/nagastone_pillar_end_weathered.png b/src/main/resources/classic/assets/twilightforest/textures/block/nagastone_pillar_end_weathered.png new file mode 100644 index 0000000000..9e6c5d020f Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/nagastone_pillar_end_weathered.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/nagastone_pillar_side.png b/src/main/resources/classic/assets/twilightforest/textures/block/nagastone_pillar_side.png new file mode 100644 index 0000000000..05fb13eb24 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/nagastone_pillar_side.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/nagastone_pillar_side_alt.png b/src/main/resources/classic/assets/twilightforest/textures/block/nagastone_pillar_side_alt.png new file mode 100644 index 0000000000..5d33b156e6 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/nagastone_pillar_side_alt.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/nagastone_pillar_side_mossy.png b/src/main/resources/classic/assets/twilightforest/textures/block/nagastone_pillar_side_mossy.png new file mode 100644 index 0000000000..15928e1807 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/nagastone_pillar_side_mossy.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/nagastone_pillar_side_mossy_alt.png b/src/main/resources/classic/assets/twilightforest/textures/block/nagastone_pillar_side_mossy_alt.png new file mode 100644 index 0000000000..7550dd6091 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/nagastone_pillar_side_mossy_alt.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/nagastone_pillar_side_weathered.png b/src/main/resources/classic/assets/twilightforest/textures/block/nagastone_pillar_side_weathered.png new file mode 100644 index 0000000000..d7a6a47d0f Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/nagastone_pillar_side_weathered.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/nagastone_pillar_side_weathered_alt.png b/src/main/resources/classic/assets/twilightforest/textures/block/nagastone_pillar_side_weathered_alt.png new file mode 100644 index 0000000000..b47013dad1 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/nagastone_pillar_side_weathered_alt.png differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/nagastone_right_down.png b/src/main/resources/classic/assets/twilightforest/textures/block/nagastone_right_down.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/blocks/nagastone_right_down.png rename to src/main/resources/classic/assets/twilightforest/textures/block/nagastone_right_down.png diff --git a/src/main/resources/assets/twilightforest/textures/blocks/nagastone_right_up.png b/src/main/resources/classic/assets/twilightforest/textures/block/nagastone_right_up.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/blocks/nagastone_right_up.png rename to src/main/resources/classic/assets/twilightforest/textures/block/nagastone_right_up.png diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/nagastone_tip_down.png b/src/main/resources/classic/assets/twilightforest/textures/block/nagastone_tip_down.png new file mode 100644 index 0000000000..e2e37cd963 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/nagastone_tip_down.png differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/nagastone_tip_left.png b/src/main/resources/classic/assets/twilightforest/textures/block/nagastone_tip_left.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/blocks/nagastone_tip_left.png rename to src/main/resources/classic/assets/twilightforest/textures/block/nagastone_tip_left.png diff --git a/src/main/resources/assets/twilightforest/textures/blocks/nagastone_tip_long.png b/src/main/resources/classic/assets/twilightforest/textures/block/nagastone_tip_long.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/blocks/nagastone_tip_long.png rename to src/main/resources/classic/assets/twilightforest/textures/block/nagastone_tip_long.png diff --git a/src/main/resources/assets/twilightforest/textures/blocks/nagastone_tip_right.png b/src/main/resources/classic/assets/twilightforest/textures/block/nagastone_tip_right.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/blocks/nagastone_tip_right.png rename to src/main/resources/classic/assets/twilightforest/textures/block/nagastone_tip_right.png diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/nagastone_tip_up.png b/src/main/resources/classic/assets/twilightforest/textures/block/nagastone_tip_up.png new file mode 100644 index 0000000000..6b610cff1b Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/nagastone_tip_up.png differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/nagastone_top_tip.png b/src/main/resources/classic/assets/twilightforest/textures/block/nagastone_top_tip.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/blocks/nagastone_top_tip.png rename to src/main/resources/classic/assets/twilightforest/textures/block/nagastone_top_tip.png diff --git a/src/main/resources/assets/twilightforest/textures/blocks/nagastone_turn_top.png b/src/main/resources/classic/assets/twilightforest/textures/block/nagastone_turn_top.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/blocks/nagastone_turn_top.png rename to src/main/resources/classic/assets/twilightforest/textures/block/nagastone_turn_top.png diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/patch/clover.png b/src/main/resources/classic/assets/twilightforest/textures/block/patch/clover.png new file mode 100644 index 0000000000..006149e645 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/patch/clover.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/patch/moss.png b/src/main/resources/classic/assets/twilightforest/textures/block/patch/moss.png new file mode 100644 index 0000000000..86b75d70a2 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/patch/moss.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/hydra.png b/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/hydra.png new file mode 100644 index 0000000000..5f966400fa Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/hydra.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/hydra_flat.png b/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/hydra_flat.png new file mode 100644 index 0000000000..6e1370929b Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/hydra_flat.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/hydra_flat.png.mcmeta b/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/hydra_flat.png.mcmeta new file mode 100644 index 0000000000..432a384535 --- /dev/null +++ b/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/hydra_flat.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "frametime": 4, + "interpolate": true + } +} \ No newline at end of file diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/hydra_glow.png b/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/hydra_glow.png new file mode 100644 index 0000000000..b517e2a5c3 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/hydra_glow.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/hydra_glow.png.mcmeta b/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/hydra_glow.png.mcmeta new file mode 100644 index 0000000000..432a384535 --- /dev/null +++ b/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/hydra_glow.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "frametime": 4, + "interpolate": true + } +} \ No newline at end of file diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/hydra_latent.png b/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/hydra_latent.png new file mode 100644 index 0000000000..e70ba823c9 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/hydra_latent.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/lich.png b/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/lich.png new file mode 100644 index 0000000000..211995e851 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/lich.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/lich_flat.png b/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/lich_flat.png new file mode 100644 index 0000000000..726b9aab6c Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/lich_flat.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/lich_flat.png.mcmeta b/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/lich_flat.png.mcmeta new file mode 100644 index 0000000000..432a384535 --- /dev/null +++ b/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/lich_flat.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "frametime": 4, + "interpolate": true + } +} \ No newline at end of file diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/lich_glow.png b/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/lich_glow.png new file mode 100644 index 0000000000..a43e1fb0f7 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/lich_glow.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/lich_glow.png.mcmeta b/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/lich_glow.png.mcmeta new file mode 100644 index 0000000000..432a384535 --- /dev/null +++ b/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/lich_glow.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "frametime": 4, + "interpolate": true + } +} \ No newline at end of file diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/lich_latent.png b/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/lich_latent.png new file mode 100644 index 0000000000..7ba03ae713 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/lich_latent.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/naga.png b/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/naga.png new file mode 100644 index 0000000000..db9cf511da Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/naga.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/naga_flat.png b/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/naga_flat.png new file mode 100644 index 0000000000..d3dbce9543 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/naga_flat.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/naga_flat.png.mcmeta b/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/naga_flat.png.mcmeta new file mode 100644 index 0000000000..432a384535 --- /dev/null +++ b/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/naga_flat.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "frametime": 4, + "interpolate": true + } +} \ No newline at end of file diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/naga_glow.png b/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/naga_glow.png new file mode 100644 index 0000000000..840fd93764 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/naga_glow.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/naga_glow.png.mcmeta b/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/naga_glow.png.mcmeta new file mode 100644 index 0000000000..432a384535 --- /dev/null +++ b/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/naga_glow.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "frametime": 4, + "interpolate": true + } +} \ No newline at end of file diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/naga_latent.png b/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/naga_latent.png new file mode 100644 index 0000000000..77f5445b6d Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/naga_latent.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/snow_queen.png b/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/snow_queen.png new file mode 100644 index 0000000000..199909192e Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/snow_queen.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/snow_queen_flat.png b/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/snow_queen_flat.png new file mode 100644 index 0000000000..0968c1bc15 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/snow_queen_flat.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/snow_queen_flat.png.mcmeta b/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/snow_queen_flat.png.mcmeta new file mode 100644 index 0000000000..432a384535 --- /dev/null +++ b/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/snow_queen_flat.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "frametime": 4, + "interpolate": true + } +} \ No newline at end of file diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/snow_queen_glow.png b/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/snow_queen_glow.png new file mode 100644 index 0000000000..7ae2a03d03 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/snow_queen_glow.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/snow_queen_glow.png.mcmeta b/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/snow_queen_glow.png.mcmeta new file mode 100644 index 0000000000..432a384535 --- /dev/null +++ b/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/snow_queen_glow.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "frametime": 4, + "interpolate": true + } +} \ No newline at end of file diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/snow_queen_latent.png b/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/snow_queen_latent.png new file mode 100644 index 0000000000..6eeb678e7c Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/snow_queen_latent.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/top.png b/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/top.png new file mode 100644 index 0000000000..7b2c947fbc Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/top.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/top_flat.png b/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/top_flat.png new file mode 100644 index 0000000000..970d796662 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/top_flat.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/top_flat.png.mcmeta b/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/top_flat.png.mcmeta new file mode 100644 index 0000000000..432a384535 --- /dev/null +++ b/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/top_flat.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "frametime": 4, + "interpolate": true + } +} \ No newline at end of file diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/top_glow.png b/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/top_glow.png new file mode 100644 index 0000000000..d6107fcfdc Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/top_glow.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/top_glow.png.mcmeta b/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/top_glow.png.mcmeta new file mode 100644 index 0000000000..432a384535 --- /dev/null +++ b/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/top_glow.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "frametime": 4, + "interpolate": true + } +} \ No newline at end of file diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/ur-ghast.png b/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/ur-ghast.png new file mode 100644 index 0000000000..335e1dc6ca Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/ur-ghast.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/ur-ghast_flat.png b/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/ur-ghast_flat.png new file mode 100644 index 0000000000..281b023a24 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/ur-ghast_flat.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/ur-ghast_flat.png.mcmeta b/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/ur-ghast_flat.png.mcmeta new file mode 100644 index 0000000000..432a384535 --- /dev/null +++ b/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/ur-ghast_flat.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "frametime": 4, + "interpolate": true + } +} \ No newline at end of file diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/ur-ghast_glow.png b/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/ur-ghast_glow.png new file mode 100644 index 0000000000..3edc331d08 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/ur-ghast_glow.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/ur-ghast_glow.png.mcmeta b/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/ur-ghast_glow.png.mcmeta new file mode 100644 index 0000000000..432a384535 --- /dev/null +++ b/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/ur-ghast_glow.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "frametime": 4, + "interpolate": true + } +} \ No newline at end of file diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/ur-ghast_latent.png b/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/ur-ghast_latent.png new file mode 100644 index 0000000000..fd8164d6f6 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/pedestal/ur-ghast_latent.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/portal_barrier.png b/src/main/resources/classic/assets/twilightforest/textures/block/portal_barrier.png new file mode 100644 index 0000000000..eecbb53686 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/portal_barrier.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/portal_barrier.png.mcmeta b/src/main/resources/classic/assets/twilightforest/textures/block/portal_barrier.png.mcmeta new file mode 100644 index 0000000000..5cc283ac57 --- /dev/null +++ b/src/main/resources/classic/assets/twilightforest/textures/block/portal_barrier.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "frametime": 2, + "interpolate": true + } +} \ No newline at end of file diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/portal_gradient.png b/src/main/resources/classic/assets/twilightforest/textures/block/portal_gradient.png new file mode 100644 index 0000000000..5465c114dc Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/portal_gradient.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/rainbow_oak_sapling.png b/src/main/resources/classic/assets/twilightforest/textures/block/rainbow_oak_sapling.png new file mode 100644 index 0000000000..18d8b5a4a0 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/rainbow_oak_sapling.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/root.png b/src/main/resources/classic/assets/twilightforest/textures/block/root.png new file mode 100644 index 0000000000..9b312d2e8b Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/root.png differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/rootstrand.png b/src/main/resources/classic/assets/twilightforest/textures/block/root_strand.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/blocks/rootstrand.png rename to src/main/resources/classic/assets/twilightforest/textures/block/root_strand.png diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/shield_inside.png b/src/main/resources/classic/assets/twilightforest/textures/block/shield_inside.png new file mode 100644 index 0000000000..6e094773b8 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/shield_inside.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/shield_outside.png b/src/main/resources/classic/assets/twilightforest/textures/block/shield_outside.png new file mode 100644 index 0000000000..0df790bd3e Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/shield_outside.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/slider_h.png b/src/main/resources/classic/assets/twilightforest/textures/block/slider_h.png new file mode 100644 index 0000000000..3720be8de2 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/slider_h.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/slider_h_90.png b/src/main/resources/classic/assets/twilightforest/textures/block/slider_h_90.png new file mode 100644 index 0000000000..0e2ea5a075 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/slider_h_90.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/slider_top.png b/src/main/resources/classic/assets/twilightforest/textures/block/slider_top.png new file mode 100644 index 0000000000..feee157204 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/slider_top.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/slider_v.png b/src/main/resources/classic/assets/twilightforest/textures/block/slider_v.png new file mode 100644 index 0000000000..9b9ef8d808 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/slider_v.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/sorting_leaves.png b/src/main/resources/classic/assets/twilightforest/textures/block/sorting_leaves.png new file mode 100644 index 0000000000..17a4a9770c Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/sorting_leaves.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/sorting_leaves.png.mcmeta b/src/main/resources/classic/assets/twilightforest/textures/block/sorting_leaves.png.mcmeta new file mode 100644 index 0000000000..53479c883d --- /dev/null +++ b/src/main/resources/classic/assets/twilightforest/textures/block/sorting_leaves.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation": { + "frametime":2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/twilightforest/textures/blocks/sort_side.png b/src/main/resources/classic/assets/twilightforest/textures/block/sorting_log.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/blocks/sort_side.png rename to src/main/resources/classic/assets/twilightforest/textures/block/sorting_log.png diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/sorting_log_core.png b/src/main/resources/classic/assets/twilightforest/textures/block/sorting_log_core.png new file mode 100644 index 0000000000..f67f0cec99 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/sorting_log_core.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/sorting_log_core_on.png b/src/main/resources/classic/assets/twilightforest/textures/block/sorting_log_core_on.png new file mode 100644 index 0000000000..1f97ae8078 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/sorting_log_core_on.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/sorting_log_top.png b/src/main/resources/classic/assets/twilightforest/textures/block/sorting_log_top.png new file mode 100644 index 0000000000..fa1562f875 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/sorting_log_top.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/sorting_sapling.png b/src/main/resources/classic/assets/twilightforest/textures/block/sorting_sapling.png new file mode 100644 index 0000000000..704465086d Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/sorting_sapling.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/spiral_inner_down.png b/src/main/resources/classic/assets/twilightforest/textures/block/spiral_inner_down.png new file mode 100644 index 0000000000..7e896feb3b Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/spiral_inner_down.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/spiral_inner_left.png b/src/main/resources/classic/assets/twilightforest/textures/block/spiral_inner_left.png new file mode 100644 index 0000000000..4c73697358 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/spiral_inner_left.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/spiral_inner_right.png b/src/main/resources/classic/assets/twilightforest/textures/block/spiral_inner_right.png new file mode 100644 index 0000000000..dcf62c5a85 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/spiral_inner_right.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/spiral_inner_up.png b/src/main/resources/classic/assets/twilightforest/textures/block/spiral_inner_up.png new file mode 100644 index 0000000000..7b77ed528d Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/spiral_inner_up.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/spiral_shadow_x.png b/src/main/resources/classic/assets/twilightforest/textures/block/spiral_shadow_x.png new file mode 100644 index 0000000000..a4197dc7c4 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/spiral_shadow_x.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/spiral_shadow_z.png b/src/main/resources/classic/assets/twilightforest/textures/block/spiral_shadow_z.png new file mode 100644 index 0000000000..23ea4cd5e7 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/spiral_shadow_z.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/steeleaf_block.png b/src/main/resources/classic/assets/twilightforest/textures/block/steeleaf_block.png new file mode 100644 index 0000000000..84cd151143 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/steeleaf_block.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/stone_spiral_large.png b/src/main/resources/classic/assets/twilightforest/textures/block/stone_spiral_large.png new file mode 100644 index 0000000000..5a5bad4d19 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/stone_spiral_large.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/stone_tiles.png b/src/main/resources/classic/assets/twilightforest/textures/block/stone_tiles.png new file mode 100644 index 0000000000..66aeb54dae Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/stone_tiles.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/stone_tiles_mossy.png b/src/main/resources/classic/assets/twilightforest/textures/block/stone_tiles_mossy.png new file mode 100644 index 0000000000..20ae2a1bd3 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/stone_tiles_mossy.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/stone_tiles_weathered.png b/src/main/resources/classic/assets/twilightforest/textures/block/stone_tiles_weathered.png new file mode 100644 index 0000000000..8aed310340 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/stone_tiles_weathered.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/end.png b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/end.png new file mode 100644 index 0000000000..006ea45d81 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/end.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/end.png.mcmeta b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/end.png.mcmeta new file mode 100644 index 0000000000..391d8e6e97 --- /dev/null +++ b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/end.png.mcmeta @@ -0,0 +1,10 @@ +{ + "ctm": { + "ctm_version": 1, + "type": "ctm", + "textures": [ "twilightforest:block/stone_twist/cap/end_ctm" ], + "extra": { + "connect_inside": true + } + } +} diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/end_bottom_x.png b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/end_bottom_x.png new file mode 100644 index 0000000000..006ea45d81 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/end_bottom_x.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/end_bottom_x.png.mcmeta b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/end_bottom_x.png.mcmeta new file mode 100644 index 0000000000..397ebb42b0 --- /dev/null +++ b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/end_bottom_x.png.mcmeta @@ -0,0 +1,17 @@ +{ + "ctm": { + "ctm_version": 1, + "type": "ctm", + "textures": [ "twilightforest:block/stone_twist/cap/end_ctm" ], + "extra": { + "connect_inside": true, + "connect_to": [{ + "block": "twilightforest:stone_twist_thin", + "predicate": [ + { "axis": "x" }, + { "down": false } + ] + }] + } + } +} diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/end_bottom_y.png b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/end_bottom_y.png new file mode 100644 index 0000000000..006ea45d81 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/end_bottom_y.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/end_bottom_y.png.mcmeta b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/end_bottom_y.png.mcmeta new file mode 100644 index 0000000000..27e7dcc469 --- /dev/null +++ b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/end_bottom_y.png.mcmeta @@ -0,0 +1,17 @@ +{ + "ctm": { + "ctm_version": 1, + "type": "ctm", + "textures": [ "twilightforest:block/stone_twist/cap/end_ctm" ], + "extra": { + "connect_inside": true, + "connect_to": [{ + "block": "twilightforest:stone_twist_thin", + "predicate": [ + { "axis": "y" }, + { "down": false } + ] + }] + } + } +} diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/end_bottom_z.png b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/end_bottom_z.png new file mode 100644 index 0000000000..006ea45d81 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/end_bottom_z.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/end_bottom_z.png.mcmeta b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/end_bottom_z.png.mcmeta new file mode 100644 index 0000000000..1a742fbfc9 --- /dev/null +++ b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/end_bottom_z.png.mcmeta @@ -0,0 +1,17 @@ +{ + "ctm": { + "ctm_version": 1, + "type": "ctm", + "textures": [ "twilightforest:block/stone_twist/cap/end_ctm" ], + "extra": { + "connect_inside": true, + "connect_to": [{ + "block": "twilightforest:stone_twist_thin", + "predicate": [ + { "axis": "z" }, + { "down": false } + ] + }] + } + } +} diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/end_ctm.png b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/end_ctm.png new file mode 100644 index 0000000000..385a52ab37 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/end_ctm.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/end_top_x.png b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/end_top_x.png new file mode 100644 index 0000000000..006ea45d81 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/end_top_x.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/end_top_x.png.mcmeta b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/end_top_x.png.mcmeta new file mode 100644 index 0000000000..18ddd78eb1 --- /dev/null +++ b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/end_top_x.png.mcmeta @@ -0,0 +1,17 @@ +{ + "ctm": { + "ctm_version": 1, + "type": "ctm", + "textures": [ "twilightforest:block/stone_twist/cap/end_ctm" ], + "extra": { + "connect_inside": true, + "connect_to": [{ + "block": "twilightforest:stone_twist_thin", + "predicate": [ + { "axis": "x" }, + { "up": false } + ] + }] + } + } +} diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/end_top_y.png b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/end_top_y.png new file mode 100644 index 0000000000..006ea45d81 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/end_top_y.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/end_top_y.png.mcmeta b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/end_top_y.png.mcmeta new file mode 100644 index 0000000000..92763a3340 --- /dev/null +++ b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/end_top_y.png.mcmeta @@ -0,0 +1,17 @@ +{ + "ctm": { + "ctm_version": 1, + "type": "ctm", + "textures": [ "twilightforest:block/stone_twist/cap/end_ctm" ], + "extra": { + "connect_inside": true, + "connect_to": [{ + "block": "twilightforest:stone_twist_thin", + "predicate": [ + { "axis": "y" }, + { "up": false } + ] + }] + } + } +} diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/end_top_z.png b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/end_top_z.png new file mode 100644 index 0000000000..006ea45d81 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/end_top_z.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/end_top_z.png.mcmeta b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/end_top_z.png.mcmeta new file mode 100644 index 0000000000..06e962ee02 --- /dev/null +++ b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/end_top_z.png.mcmeta @@ -0,0 +1,17 @@ +{ + "ctm": { + "ctm_version": 1, + "type": "ctm", + "textures": [ "twilightforest:block/stone_twist/cap/end_ctm" ], + "extra": { + "connect_inside": true, + "connect_to": [{ + "block": "twilightforest:stone_twist_thin", + "predicate": [ + { "axis": "z" }, + { "up": false } + ] + }] + } + } +} diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/x.png b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/x.png new file mode 100644 index 0000000000..346a374559 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/x.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/x.png.mcmeta b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/x.png.mcmeta new file mode 100644 index 0000000000..a405777030 --- /dev/null +++ b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/x.png.mcmeta @@ -0,0 +1,10 @@ +{ + "ctm": { + "ctm_version": 1, + "type": "ctm", + "textures": [ "twilightforest:block/stone_twist/cap/x_ctm" ], + "extra": { + "connect_inside": true + } + } +} diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/x_ctm.png b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/x_ctm.png new file mode 100644 index 0000000000..e66203035c Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/x_ctm.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/x_x_bottom.png b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/x_x_bottom.png new file mode 100644 index 0000000000..346a374559 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/x_x_bottom.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/x_x_bottom.png.mcmeta b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/x_x_bottom.png.mcmeta new file mode 100644 index 0000000000..594fdfdf43 --- /dev/null +++ b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/x_x_bottom.png.mcmeta @@ -0,0 +1,17 @@ +{ + "ctm": { + "ctm_version": 1, + "type": "ctm", + "textures": [ "twilightforest:block/stone_twist/cap/x_ctm" ], + "extra": { + "connect_inside": true, + "connect_to": [{ + "block": "twilightforest:stone_twist_thin", + "predicate": [ + { "axis": "x" }, + { "up": false } + ] + }] + } + } +} diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/x_x_top.png b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/x_x_top.png new file mode 100644 index 0000000000..346a374559 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/x_x_top.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/x_x_top.png.mcmeta b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/x_x_top.png.mcmeta new file mode 100644 index 0000000000..594fdfdf43 --- /dev/null +++ b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/x_x_top.png.mcmeta @@ -0,0 +1,17 @@ +{ + "ctm": { + "ctm_version": 1, + "type": "ctm", + "textures": [ "twilightforest:block/stone_twist/cap/x_ctm" ], + "extra": { + "connect_inside": true, + "connect_to": [{ + "block": "twilightforest:stone_twist_thin", + "predicate": [ + { "axis": "x" }, + { "up": false } + ] + }] + } + } +} diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/x_z_bottom.png b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/x_z_bottom.png new file mode 100644 index 0000000000..346a374559 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/x_z_bottom.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/x_z_bottom.png.mcmeta b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/x_z_bottom.png.mcmeta new file mode 100644 index 0000000000..8347128039 --- /dev/null +++ b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/x_z_bottom.png.mcmeta @@ -0,0 +1,17 @@ +{ + "ctm": { + "ctm_version": 1, + "type": "ctm", + "textures": [ "twilightforest:block/stone_twist/cap/x_ctm" ], + "extra": { + "connect_inside": true, + "connect_to": [{ + "block": "twilightforest:stone_twist_thin", + "predicate": [ + { "axis": "z" }, + { "down": false } + ] + }] + } + } +} diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/x_z_top.png b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/x_z_top.png new file mode 100644 index 0000000000..346a374559 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/x_z_top.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/x_z_top.png.mcmeta b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/x_z_top.png.mcmeta new file mode 100644 index 0000000000..5b7b06138d --- /dev/null +++ b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/x_z_top.png.mcmeta @@ -0,0 +1,17 @@ +{ + "ctm": { + "ctm_version": 1, + "type": "ctm", + "textures": [ "twilightforest:block/stone_twist/cap/x_ctm" ], + "extra": { + "connect_inside": true, + "connect_to": [{ + "block": "twilightforest:stone_twist_thin", + "predicate": [ + { "axis": "z" }, + { "up": false } + ] + }] + } + } +} diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/y.png b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/y.png new file mode 100644 index 0000000000..e5a10fda49 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/y.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/y.png.mcmeta b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/y.png.mcmeta new file mode 100644 index 0000000000..3a59a721b0 --- /dev/null +++ b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/y.png.mcmeta @@ -0,0 +1,10 @@ +{ + "ctm": { + "ctm_version": 1, + "type": "ctm", + "textures": [ "twilightforest:block/stone_twist/cap/y_ctm" ], + "extra": { + "connect_inside": true + } + } +} diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/y_ctm.png b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/y_ctm.png new file mode 100644 index 0000000000..4258fdb0a3 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/y_ctm.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/y_y_bottom.png b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/y_y_bottom.png new file mode 100644 index 0000000000..e5a10fda49 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/y_y_bottom.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/y_y_bottom.png.mcmeta b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/y_y_bottom.png.mcmeta new file mode 100644 index 0000000000..14e63da152 --- /dev/null +++ b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/y_y_bottom.png.mcmeta @@ -0,0 +1,17 @@ +{ + "ctm": { + "ctm_version": 1, + "type": "ctm", + "textures": [ "twilightforest:block/stone_twist/cap/y_ctm" ], + "extra": { + "connect_inside": true, + "connect_to": [{ + "block": "twilightforest:stone_twist_thin", + "predicate": [ + { "axis": "y" }, + { "down": false } + ] + }] + } + } +} diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/y_y_top.png b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/y_y_top.png new file mode 100644 index 0000000000..e5a10fda49 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/y_y_top.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/y_y_top.png.mcmeta b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/y_y_top.png.mcmeta new file mode 100644 index 0000000000..b5302dd240 --- /dev/null +++ b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/y_y_top.png.mcmeta @@ -0,0 +1,17 @@ +{ + "ctm": { + "ctm_version": 1, + "type": "ctm", + "textures": [ "twilightforest:block/stone_twist/cap/y_ctm" ], + "extra": { + "connect_inside": true, + "connect_to": [{ + "block": "twilightforest:stone_twist_thin", + "predicate": [ + { "axis": "y" }, + { "up": false } + ] + }] + } + } +} diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/y_z_bottom.png b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/y_z_bottom.png new file mode 100644 index 0000000000..e5a10fda49 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/y_z_bottom.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/y_z_bottom.png.mcmeta b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/y_z_bottom.png.mcmeta new file mode 100644 index 0000000000..cbcfe1c74f --- /dev/null +++ b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/y_z_bottom.png.mcmeta @@ -0,0 +1,17 @@ +{ + "ctm": { + "ctm_version": 1, + "type": "ctm", + "textures": [ "twilightforest:block/stone_twist/cap/y_ctm" ], + "extra": { + "connect_inside": true, + "connect_to": [{ + "block": "twilightforest:stone_twist_thin", + "predicate": [ + { "axis": "z" }, + { "down": false } + ] + }] + } + } +} diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/y_z_top.png b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/y_z_top.png new file mode 100644 index 0000000000..e5a10fda49 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/y_z_top.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/y_z_top.png.mcmeta b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/y_z_top.png.mcmeta new file mode 100644 index 0000000000..8e5ea9ec1f --- /dev/null +++ b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/cap/y_z_top.png.mcmeta @@ -0,0 +1,17 @@ +{ + "ctm": { + "ctm_version": 1, + "type": "ctm", + "textures": [ "twilightforest:block/stone_twist/cap/y_ctm" ], + "extra": { + "connect_inside": true, + "connect_to": [{ + "block": "twilightforest:stone_twist_thin", + "predicate": [ + { "axis": "z" }, + { "up": false } + ] + }] + } + } +} diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/pillar_side.png b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/pillar_side.png new file mode 100644 index 0000000000..6263484600 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/pillar_side.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/twist_blank.png b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/twist_blank.png new file mode 100644 index 0000000000..aeaf6d4b67 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/twist_blank.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/twist_blank.png.mcmeta b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/twist_blank.png.mcmeta new file mode 100644 index 0000000000..402ba7a688 --- /dev/null +++ b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/twist_blank.png.mcmeta @@ -0,0 +1,11 @@ +{ + "ctm": { + "ctm_version": 1, + "type": "ctm", + "layer": "CUTOUT", + "textures": [ "twilightforest:block/stone_twist/twist_crown" ], + "extra": { + "connect_inside": true + } + } +} diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/twist_crown.png b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/twist_crown.png new file mode 100644 index 0000000000..bcd64b49c0 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/twist_crown.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/twist_end.png b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/twist_end.png new file mode 100644 index 0000000000..9ac46abb19 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/twist_end.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/twist_side.png b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/twist_side.png new file mode 100644 index 0000000000..29d50c185f Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/twist_side.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/twist_small.png b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/twist_small.png new file mode 100644 index 0000000000..c201c1e5d8 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/twist_small.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/twist_x.png b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/twist_x.png new file mode 100644 index 0000000000..a460ae80d4 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/twist_x.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/twist_x.png.mcmeta b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/twist_x.png.mcmeta new file mode 100644 index 0000000000..85ff0281dc --- /dev/null +++ b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/twist_x.png.mcmeta @@ -0,0 +1,11 @@ +{ + "ctm": { + "ctm_version": 1, + "type": "ctm", + "layer": "CUTOUT", + "textures": [ "twilightforest:block/stone_twist/twist_x_ctm" ], + "extra": { + "connect_inside": true + } + } +} diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/twist_x_ctm.png b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/twist_x_ctm.png new file mode 100644 index 0000000000..be45cbe475 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/twist_x_ctm.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/twist_y.png b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/twist_y.png new file mode 100644 index 0000000000..3dcbe806e8 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/twist_y.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/twist_y.png.mcmeta b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/twist_y.png.mcmeta new file mode 100644 index 0000000000..981f0444f4 --- /dev/null +++ b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/twist_y.png.mcmeta @@ -0,0 +1,11 @@ +{ + "ctm": { + "ctm_version": 1, + "type": "ctm", + "layer": "CUTOUT", + "textures": [ "twilightforest:block/stone_twist/twist_y_ctm" ], + "extra": { + "connect_inside": true + } + } +} diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/twist_y_ctm.png b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/twist_y_ctm.png new file mode 100644 index 0000000000..7d25e1fea0 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/stone_twist/twist_y_ctm.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/stripped_canopy_log.png b/src/main/resources/classic/assets/twilightforest/textures/block/stripped_canopy_log.png new file mode 100644 index 0000000000..a287ede3ff Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/stripped_canopy_log.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/stripped_canopy_log_top.png b/src/main/resources/classic/assets/twilightforest/textures/block/stripped_canopy_log_top.png new file mode 100644 index 0000000000..18f175ddc3 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/stripped_canopy_log_top.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/stripped_dark_log.png b/src/main/resources/classic/assets/twilightforest/textures/block/stripped_dark_log.png new file mode 100644 index 0000000000..0a224bf0ad Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/stripped_dark_log.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/stripped_dark_log_top.png b/src/main/resources/classic/assets/twilightforest/textures/block/stripped_dark_log_top.png new file mode 100644 index 0000000000..da1048cda2 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/stripped_dark_log_top.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/stripped_mangrove_log.png b/src/main/resources/classic/assets/twilightforest/textures/block/stripped_mangrove_log.png new file mode 100644 index 0000000000..8269a9e02e Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/stripped_mangrove_log.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/stripped_mangrove_log_top.png b/src/main/resources/classic/assets/twilightforest/textures/block/stripped_mangrove_log_top.png new file mode 100644 index 0000000000..0ee0cef595 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/stripped_mangrove_log_top.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/stripped_mining_log.png b/src/main/resources/classic/assets/twilightforest/textures/block/stripped_mining_log.png new file mode 100644 index 0000000000..d43ff777aa Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/stripped_mining_log.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/stripped_mining_log_top.png b/src/main/resources/classic/assets/twilightforest/textures/block/stripped_mining_log_top.png new file mode 100644 index 0000000000..903c8371cf Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/stripped_mining_log_top.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/stripped_sorting_log.png b/src/main/resources/classic/assets/twilightforest/textures/block/stripped_sorting_log.png new file mode 100644 index 0000000000..4e60958889 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/stripped_sorting_log.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/stripped_sorting_log_top.png b/src/main/resources/classic/assets/twilightforest/textures/block/stripped_sorting_log_top.png new file mode 100644 index 0000000000..1dfc5daa7c Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/stripped_sorting_log_top.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/stripped_time_log.png b/src/main/resources/classic/assets/twilightforest/textures/block/stripped_time_log.png new file mode 100644 index 0000000000..57469b3540 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/stripped_time_log.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/stripped_time_log_top.png b/src/main/resources/classic/assets/twilightforest/textures/block/stripped_time_log_top.png new file mode 100644 index 0000000000..5cfe0364e8 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/stripped_time_log_top.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/stripped_transformation_log.png b/src/main/resources/classic/assets/twilightforest/textures/block/stripped_transformation_log.png new file mode 100644 index 0000000000..a3becd975e Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/stripped_transformation_log.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/stripped_transformation_log_top.png b/src/main/resources/classic/assets/twilightforest/textures/block/stripped_transformation_log_top.png new file mode 100644 index 0000000000..2ae1b2221d Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/stripped_transformation_log_top.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/stripped_twilight_oak_log.png b/src/main/resources/classic/assets/twilightforest/textures/block/stripped_twilight_oak_log.png new file mode 100644 index 0000000000..2b88f16a5d Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/stripped_twilight_oak_log.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/stripped_twilight_oak_log_top.png b/src/main/resources/classic/assets/twilightforest/textures/block/stripped_twilight_oak_log_top.png new file mode 100644 index 0000000000..fbee03efec Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/stripped_twilight_oak_log_top.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/thick_castle_brick.png b/src/main/resources/classic/assets/twilightforest/textures/block/thick_castle_brick.png new file mode 100644 index 0000000000..036ce15c8c Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/thick_castle_brick.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/thick_castle_brick_ct.png b/src/main/resources/classic/assets/twilightforest/textures/block/thick_castle_brick_ct.png new file mode 100644 index 0000000000..56003632c1 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/thick_castle_brick_ct.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/thorn_rose.png b/src/main/resources/classic/assets/twilightforest/textures/block/thorn_rose.png new file mode 100644 index 0000000000..86142bd3ca Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/thorn_rose.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/time_leaves.png b/src/main/resources/classic/assets/twilightforest/textures/block/time_leaves.png new file mode 100644 index 0000000000..08a3749256 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/time_leaves.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/time_leaves.png.mcmeta b/src/main/resources/classic/assets/twilightforest/textures/block/time_leaves.png.mcmeta new file mode 100644 index 0000000000..53479c883d --- /dev/null +++ b/src/main/resources/classic/assets/twilightforest/textures/block/time_leaves.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation": { + "frametime":2 + } +} \ No newline at end of file diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/time_log.png b/src/main/resources/classic/assets/twilightforest/textures/block/time_log.png new file mode 100644 index 0000000000..2a3aea9450 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/time_log.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/time_log_core.png b/src/main/resources/classic/assets/twilightforest/textures/block/time_log_core.png new file mode 100644 index 0000000000..23a0bfa10e Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/time_log_core.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/time_log_core_on.png b/src/main/resources/classic/assets/twilightforest/textures/block/time_log_core_on.png new file mode 100644 index 0000000000..160fe4827b Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/time_log_core_on.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/time_log_top.png b/src/main/resources/classic/assets/twilightforest/textures/block/time_log_top.png new file mode 100644 index 0000000000..17d20227de Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/time_log_top.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/time_sapling.png b/src/main/resources/classic/assets/twilightforest/textures/block/time_sapling.png new file mode 100644 index 0000000000..0736e0c2be Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/time_sapling.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/torchberry_plant.png b/src/main/resources/classic/assets/twilightforest/textures/block/torchberry_plant.png new file mode 100644 index 0000000000..25c525d79c Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/torchberry_plant.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/torchberry_plant_glow.png b/src/main/resources/classic/assets/twilightforest/textures/block/torchberry_plant_glow.png new file mode 100644 index 0000000000..b14a89f571 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/torchberry_plant_glow.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_1/towerdev_antibuilder_1.png b/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_1/towerdev_antibuilder_1.png new file mode 100644 index 0000000000..3788d10782 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_1/towerdev_antibuilder_1.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_1/towerdev_builder_off_1.png b/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_1/towerdev_builder_off_1.png new file mode 100644 index 0000000000..1b282b6c1d Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_1/towerdev_builder_off_1.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_1/towerdev_builder_on_1.png b/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_1/towerdev_builder_on_1.png new file mode 100644 index 0000000000..0df54daccc Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_1/towerdev_builder_on_1.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_1/towerdev_firejet_1.png b/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_1/towerdev_firejet_1.png new file mode 100644 index 0000000000..302b44b0a8 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_1/towerdev_firejet_1.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_1/towerdev_ghasttrap_off_1.png b/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_1/towerdev_ghasttrap_off_1.png new file mode 100644 index 0000000000..1310e1731b Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_1/towerdev_ghasttrap_off_1.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_1/towerdev_ghasttrap_on_1.png b/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_1/towerdev_ghasttrap_on_1.png new file mode 100644 index 0000000000..0b9962cfb5 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_1/towerdev_ghasttrap_on_1.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_1/towerdev_lock_off_1.png b/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_1/towerdev_lock_off_1.png new file mode 100644 index 0000000000..831b7de5fb Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_1/towerdev_lock_off_1.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_1/towerdev_lock_on_1.png b/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_1/towerdev_lock_on_1.png new file mode 100644 index 0000000000..726130e1d3 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_1/towerdev_lock_on_1.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_1/towerdev_reactor_off_1.png b/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_1/towerdev_reactor_off_1.png new file mode 100644 index 0000000000..c4ab4227f3 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_1/towerdev_reactor_off_1.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_1/towerdev_reactor_on_1.png b/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_1/towerdev_reactor_on_1.png new file mode 100644 index 0000000000..1c26a1179f Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_1/towerdev_reactor_on_1.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_1/towerdev_reappearing_off_1.png b/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_1/towerdev_reappearing_off_1.png new file mode 100644 index 0000000000..3c95f7fa4a Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_1/towerdev_reappearing_off_1.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_1/towerdev_reappearing_on_1.png b/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_1/towerdev_reappearing_on_1.png new file mode 100644 index 0000000000..d8bcea1cd6 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_1/towerdev_reappearing_on_1.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_1/towerdev_smoker_1.png b/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_1/towerdev_smoker_1.png new file mode 100644 index 0000000000..6f67731d04 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_1/towerdev_smoker_1.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_1/towerdev_vanish_off_1.png b/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_1/towerdev_vanish_off_1.png new file mode 100644 index 0000000000..b088077055 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_1/towerdev_vanish_off_1.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_1/towerdev_vanish_on_1.png b/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_1/towerdev_vanish_on_1.png new file mode 100644 index 0000000000..57edfa7721 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_1/towerdev_vanish_on_1.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_2/towerdev_antibuilder_2.png b/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_2/towerdev_antibuilder_2.png new file mode 100644 index 0000000000..6014814d62 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_2/towerdev_antibuilder_2.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_2/towerdev_antibuilt_1.png b/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_2/towerdev_antibuilt_1.png new file mode 100644 index 0000000000..15bff36954 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_2/towerdev_antibuilt_1.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_2/towerdev_builder_off_2.png b/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_2/towerdev_builder_off_2.png new file mode 100644 index 0000000000..ba0fa2bc03 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_2/towerdev_builder_off_2.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_2/towerdev_builder_on_2.png b/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_2/towerdev_builder_on_2.png new file mode 100644 index 0000000000..b46b135212 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_2/towerdev_builder_on_2.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_2/towerdev_builder_timeout_1.png b/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_2/towerdev_builder_timeout_1.png new file mode 100644 index 0000000000..68719bad77 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_2/towerdev_builder_timeout_1.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_2/towerdev_firejet_off_1.png b/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_2/towerdev_firejet_off_1.png new file mode 100644 index 0000000000..1fa6b49f08 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_2/towerdev_firejet_off_1.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_2/towerdev_firejet_on_1.png b/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_2/towerdev_firejet_on_1.png new file mode 100644 index 0000000000..e1e527016a Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_2/towerdev_firejet_on_1.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_2/towerdev_ghasttrap_off_2.png b/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_2/towerdev_ghasttrap_off_2.png new file mode 100644 index 0000000000..70c4661acb Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_2/towerdev_ghasttrap_off_2.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_2/towerdev_ghasttrap_on_2.png b/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_2/towerdev_ghasttrap_on_2.png new file mode 100644 index 0000000000..8f4b3da611 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_2/towerdev_ghasttrap_on_2.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_2/towerdev_ghasttraplid_off_1.png b/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_2/towerdev_ghasttraplid_off_1.png new file mode 100644 index 0000000000..cf84d76d73 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_2/towerdev_ghasttraplid_off_1.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_2/towerdev_ghasttraplid_on_1.png b/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_2/towerdev_ghasttraplid_on_1.png new file mode 100644 index 0000000000..57593e04d8 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_2/towerdev_ghasttraplid_on_1.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_2/towerdev_lock_off_2.png b/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_2/towerdev_lock_off_2.png new file mode 100644 index 0000000000..8fd54c1bf9 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_2/towerdev_lock_off_2.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_2/towerdev_lock_on_2.png b/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_2/towerdev_lock_on_2.png new file mode 100644 index 0000000000..b08660df48 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_2/towerdev_lock_on_2.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_2/towerdev_reactor_off_2.png b/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_2/towerdev_reactor_off_2.png new file mode 100644 index 0000000000..aefbd5b34a Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_2/towerdev_reactor_off_2.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_2/towerdev_reactor_on_2.png b/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_2/towerdev_reactor_on_2.png new file mode 100644 index 0000000000..646d36a635 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_2/towerdev_reactor_on_2.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_2/towerdev_reappearing_off_2.png b/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_2/towerdev_reappearing_off_2.png new file mode 100644 index 0000000000..f56aa6cb55 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_2/towerdev_reappearing_off_2.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_2/towerdev_reappearing_on_2.png b/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_2/towerdev_reappearing_on_2.png new file mode 100644 index 0000000000..7082c97968 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_2/towerdev_reappearing_on_2.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_2/towerdev_smoker_off_1.png b/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_2/towerdev_smoker_off_1.png new file mode 100644 index 0000000000..8b6a053077 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_2/towerdev_smoker_off_1.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_2/towerdev_smoker_on_1.png b/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_2/towerdev_smoker_on_1.png new file mode 100644 index 0000000000..89a3095e3d Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_2/towerdev_smoker_on_1.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_2/towerdev_vanish_off_2.png b/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_2/towerdev_vanish_off_2.png new file mode 100644 index 0000000000..b6e6f021ac Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_2/towerdev_vanish_off_2.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_2/towerdev_vanish_on_2.png b/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_2/towerdev_vanish_on_2.png new file mode 100644 index 0000000000..30b7d28cab Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_2/towerdev_vanish_on_2.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_3/towerdev_builder_timeout_2.png b/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_3/towerdev_builder_timeout_2.png new file mode 100644 index 0000000000..ec19476160 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_3/towerdev_builder_timeout_2.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_3/towerdev_ghasttraplid_on_2.png b/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_3/towerdev_ghasttraplid_on_2.png new file mode 100644 index 0000000000..a2e59e959e Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/tower_device_level_3/towerdev_ghasttraplid_on_2.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/towerdev_antibuilder.png b/src/main/resources/classic/assets/twilightforest/textures/block/towerdev_antibuilder.png new file mode 100644 index 0000000000..5f3720ab87 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/towerdev_antibuilder.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/towerdev_antibuilt.png b/src/main/resources/classic/assets/twilightforest/textures/block/towerdev_antibuilt.png new file mode 100644 index 0000000000..b39603871a Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/towerdev_antibuilt.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/towerdev_builder_off.png b/src/main/resources/classic/assets/twilightforest/textures/block/towerdev_builder_off.png new file mode 100644 index 0000000000..6f7d0e74bc Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/towerdev_builder_off.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/towerdev_builder_on.png b/src/main/resources/classic/assets/twilightforest/textures/block/towerdev_builder_on.png new file mode 100644 index 0000000000..bfbfbc1188 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/towerdev_builder_on.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/towerdev_builder_timeout.png b/src/main/resources/classic/assets/twilightforest/textures/block/towerdev_builder_timeout.png new file mode 100644 index 0000000000..49f77fe56b Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/towerdev_builder_timeout.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/towerdev_built_off.png b/src/main/resources/classic/assets/twilightforest/textures/block/towerdev_built_off.png new file mode 100644 index 0000000000..9ab4f9c39c Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/towerdev_built_off.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/towerdev_built_on.png b/src/main/resources/classic/assets/twilightforest/textures/block/towerdev_built_on.png new file mode 100644 index 0000000000..e44b83fd64 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/towerdev_built_on.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/towerdev_firejet_off.png b/src/main/resources/classic/assets/twilightforest/textures/block/towerdev_firejet_off.png new file mode 100644 index 0000000000..0b406a323e Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/towerdev_firejet_off.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/towerdev_firejet_on.png b/src/main/resources/classic/assets/twilightforest/textures/block/towerdev_firejet_on.png new file mode 100644 index 0000000000..99c0ff4c8c Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/towerdev_firejet_on.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/towerdev_ghasttrap_off.png b/src/main/resources/classic/assets/twilightforest/textures/block/towerdev_ghasttrap_off.png new file mode 100644 index 0000000000..d5da86f0fa Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/towerdev_ghasttrap_off.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/towerdev_ghasttrap_on.png b/src/main/resources/classic/assets/twilightforest/textures/block/towerdev_ghasttrap_on.png new file mode 100644 index 0000000000..0e336075c1 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/towerdev_ghasttrap_on.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/towerdev_ghasttraplid_off.png b/src/main/resources/classic/assets/twilightforest/textures/block/towerdev_ghasttraplid_off.png new file mode 100644 index 0000000000..e25e846231 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/towerdev_ghasttraplid_off.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/towerdev_ghasttraplid_on.png b/src/main/resources/classic/assets/twilightforest/textures/block/towerdev_ghasttraplid_on.png new file mode 100644 index 0000000000..2546697740 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/towerdev_ghasttraplid_on.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/towerdev_lock_off.png b/src/main/resources/classic/assets/twilightforest/textures/block/towerdev_lock_off.png new file mode 100644 index 0000000000..57f1250920 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/towerdev_lock_off.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/towerdev_lock_on.png b/src/main/resources/classic/assets/twilightforest/textures/block/towerdev_lock_on.png new file mode 100644 index 0000000000..960af703af Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/towerdev_lock_on.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/towerdev_reactor_off.png b/src/main/resources/classic/assets/twilightforest/textures/block/towerdev_reactor_off.png new file mode 100644 index 0000000000..36241ea305 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/towerdev_reactor_off.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/towerdev_reactor_on.png b/src/main/resources/classic/assets/twilightforest/textures/block/towerdev_reactor_on.png new file mode 100644 index 0000000000..4fc49d4849 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/towerdev_reactor_on.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/towerdev_reappearing_off.png b/src/main/resources/classic/assets/twilightforest/textures/block/towerdev_reappearing_off.png new file mode 100644 index 0000000000..1d71bc2751 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/towerdev_reappearing_off.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/towerdev_reappearing_on.png b/src/main/resources/classic/assets/twilightforest/textures/block/towerdev_reappearing_on.png new file mode 100644 index 0000000000..57d680701b Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/towerdev_reappearing_on.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/towerdev_reappearing_trace_off.png b/src/main/resources/classic/assets/twilightforest/textures/block/towerdev_reappearing_trace_off.png new file mode 100644 index 0000000000..ce863a1018 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/towerdev_reappearing_trace_off.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/towerdev_reappearing_trace_on.png b/src/main/resources/classic/assets/twilightforest/textures/block/towerdev_reappearing_trace_on.png new file mode 100644 index 0000000000..cc09944e62 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/towerdev_reappearing_trace_on.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/towerdev_smoker_off.png b/src/main/resources/classic/assets/twilightforest/textures/block/towerdev_smoker_off.png new file mode 100644 index 0000000000..a3014c1321 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/towerdev_smoker_off.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/towerdev_smoker_on.png b/src/main/resources/classic/assets/twilightforest/textures/block/towerdev_smoker_on.png new file mode 100644 index 0000000000..4b22cd2c2d Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/towerdev_smoker_on.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/towerdev_vanish_off.png b/src/main/resources/classic/assets/twilightforest/textures/block/towerdev_vanish_off.png new file mode 100644 index 0000000000..7128f1d9da Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/towerdev_vanish_off.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/towerdev_vanish_on.png b/src/main/resources/classic/assets/twilightforest/textures/block/towerdev_vanish_on.png new file mode 100644 index 0000000000..5c818648e9 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/towerdev_vanish_on.png differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/towerwood_planks.png b/src/main/resources/classic/assets/twilightforest/textures/block/towerwood.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/blocks/towerwood_planks.png rename to src/main/resources/classic/assets/twilightforest/textures/block/towerwood.png diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/transformation_leaves.png b/src/main/resources/classic/assets/twilightforest/textures/block/transformation_leaves.png new file mode 100644 index 0000000000..b23d3ade4f Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/transformation_leaves.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/transformation_leaves.png.mcmeta b/src/main/resources/classic/assets/twilightforest/textures/block/transformation_leaves.png.mcmeta new file mode 100644 index 0000000000..53479c883d --- /dev/null +++ b/src/main/resources/classic/assets/twilightforest/textures/block/transformation_leaves.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation": { + "frametime":2 + } +} \ No newline at end of file diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/transformation_log.png b/src/main/resources/classic/assets/twilightforest/textures/block/transformation_log.png new file mode 100644 index 0000000000..eb621118c1 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/transformation_log.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/transformation_log_core.png b/src/main/resources/classic/assets/twilightforest/textures/block/transformation_log_core.png new file mode 100644 index 0000000000..d58673574b Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/transformation_log_core.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/transformation_log_core_on.png b/src/main/resources/classic/assets/twilightforest/textures/block/transformation_log_core_on.png new file mode 100644 index 0000000000..50d9059205 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/transformation_log_core_on.png differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/trans_section.png b/src/main/resources/classic/assets/twilightforest/textures/block/transformation_log_top.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/blocks/trans_section.png rename to src/main/resources/classic/assets/twilightforest/textures/block/transformation_log_top.png diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/transformation_sapling.png b/src/main/resources/classic/assets/twilightforest/textures/block/transformation_sapling.png new file mode 100644 index 0000000000..b6ab430b37 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/transformation_sapling.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/trollber.png b/src/main/resources/classic/assets/twilightforest/textures/block/trollber.png new file mode 100644 index 0000000000..715e62a3de Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/trollber.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/trollber_glow.png b/src/main/resources/classic/assets/twilightforest/textures/block/trollber_glow.png new file mode 100644 index 0000000000..122d970284 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/trollber_glow.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/trollsteinn.png b/src/main/resources/classic/assets/twilightforest/textures/block/trollsteinn.png new file mode 100644 index 0000000000..50cc7bc4f4 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/trollsteinn.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/trollsteinn_light.png b/src/main/resources/classic/assets/twilightforest/textures/block/trollsteinn_light.png new file mode 100644 index 0000000000..dc83fb0c15 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/trollsteinn_light.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/trollvidr.png b/src/main/resources/classic/assets/twilightforest/textures/block/trollvidr.png new file mode 100644 index 0000000000..15f56e4ea9 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/trollvidr.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/twilight_oak_log.png b/src/main/resources/classic/assets/twilightforest/textures/block/twilight_oak_log.png new file mode 100644 index 0000000000..1ab5557368 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/twilight_oak_log.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/twilight_oak_log_top.png b/src/main/resources/classic/assets/twilightforest/textures/block/twilight_oak_log_top.png new file mode 100644 index 0000000000..76502c9604 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/twilight_oak_log_top.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/twilight_oak_sapling.png b/src/main/resources/classic/assets/twilightforest/textures/block/twilight_oak_sapling.png new file mode 100644 index 0000000000..cea0a958bf Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/twilight_oak_sapling.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/uberous_soil.png b/src/main/resources/classic/assets/twilightforest/textures/block/uberous_soil.png new file mode 100644 index 0000000000..ebd2d6d5f6 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/uberous_soil.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/uberous_soil_glow.png b/src/main/resources/classic/assets/twilightforest/textures/block/uberous_soil_glow.png new file mode 100644 index 0000000000..26b7b0d4b5 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/uberous_soil_glow.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/uberous_soil_glow.png.mcmeta b/src/main/resources/classic/assets/twilightforest/textures/block/uberous_soil_glow.png.mcmeta new file mode 100644 index 0000000000..95fc346a21 --- /dev/null +++ b/src/main/resources/classic/assets/twilightforest/textures/block/uberous_soil_glow.png.mcmeta @@ -0,0 +1,9 @@ +{ + "ctm": { + "ctm_version": 1, + "layer": "TRANSLUCENT", + "extra": { + "light": 15 + } + } +} \ No newline at end of file diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/uncrafting_glow.png b/src/main/resources/classic/assets/twilightforest/textures/block/uncrafting_glow.png new file mode 100644 index 0000000000..a6756ae057 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/uncrafting_glow.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/uncrafting_glow_side.png b/src/main/resources/classic/assets/twilightforest/textures/block/uncrafting_glow_side.png new file mode 100644 index 0000000000..af6611ee7f Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/uncrafting_glow_side.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/uncrafting_particle.png b/src/main/resources/classic/assets/twilightforest/textures/block/uncrafting_particle.png new file mode 100644 index 0000000000..724f54d4f6 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/uncrafting_particle.png differ diff --git a/src/main/resources/assets/twilightforest/textures/blocks/uncrafting_side.png b/src/main/resources/classic/assets/twilightforest/textures/block/uncrafting_side.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/blocks/uncrafting_side.png rename to src/main/resources/classic/assets/twilightforest/textures/block/uncrafting_side.png diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/uncrafting_top.png b/src/main/resources/classic/assets/twilightforest/textures/block/uncrafting_top.png new file mode 100644 index 0000000000..8e5c2b7d4e Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/uncrafting_top.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/underbrick.png b/src/main/resources/classic/assets/twilightforest/textures/block/underbrick.png new file mode 100644 index 0000000000..7b1420ef03 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/underbrick.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/underbrick_floor.png b/src/main/resources/classic/assets/twilightforest/textures/block/underbrick_floor.png new file mode 100644 index 0000000000..256bb3eea4 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/underbrick_floor.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/unripe_trollber.png b/src/main/resources/classic/assets/twilightforest/textures/block/unripe_trollber.png new file mode 100644 index 0000000000..b6d7f4d317 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/unripe_trollber.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/untitled.png b/src/main/resources/classic/assets/twilightforest/textures/block/untitled.png new file mode 100644 index 0000000000..19c557585f Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/untitled.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/weathered_deadrock.png b/src/main/resources/classic/assets/twilightforest/textures/block/weathered_deadrock.png new file mode 100644 index 0000000000..cadd9f39a1 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/weathered_deadrock.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/wispy_cloud.png b/src/main/resources/classic/assets/twilightforest/textures/block/wispy_cloud.png new file mode 100644 index 0000000000..dd9802920e Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/wispy_cloud.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/wood/door/canopy_lower.png b/src/main/resources/classic/assets/twilightforest/textures/block/wood/door/canopy_lower.png new file mode 100644 index 0000000000..904fc97215 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/wood/door/canopy_lower.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/wood/door/canopy_upper.png b/src/main/resources/classic/assets/twilightforest/textures/block/wood/door/canopy_upper.png new file mode 100644 index 0000000000..0f0c3ee8c1 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/wood/door/canopy_upper.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/wood/door/darkwood_lower.png b/src/main/resources/classic/assets/twilightforest/textures/block/wood/door/darkwood_lower.png new file mode 100644 index 0000000000..944d10b929 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/wood/door/darkwood_lower.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/wood/door/darkwood_upper.png b/src/main/resources/classic/assets/twilightforest/textures/block/wood/door/darkwood_upper.png new file mode 100644 index 0000000000..8b23abcfc1 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/wood/door/darkwood_upper.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/wood/door/mangrove_lower.png b/src/main/resources/classic/assets/twilightforest/textures/block/wood/door/mangrove_lower.png new file mode 100644 index 0000000000..9ee7f479b2 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/wood/door/mangrove_lower.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/wood/door/mangrove_upper.png b/src/main/resources/classic/assets/twilightforest/textures/block/wood/door/mangrove_upper.png new file mode 100644 index 0000000000..1bfb244a4b Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/wood/door/mangrove_upper.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/wood/door/mine_lower.png b/src/main/resources/classic/assets/twilightforest/textures/block/wood/door/mine_lower.png new file mode 100644 index 0000000000..5ab82508c7 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/wood/door/mine_lower.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/wood/door/mine_upper.png b/src/main/resources/classic/assets/twilightforest/textures/block/wood/door/mine_upper.png new file mode 100644 index 0000000000..0496c92f25 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/wood/door/mine_upper.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/wood/door/sort_lower.png b/src/main/resources/classic/assets/twilightforest/textures/block/wood/door/sort_lower.png new file mode 100644 index 0000000000..7d19f41b7d Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/wood/door/sort_lower.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/wood/door/sort_upper.png b/src/main/resources/classic/assets/twilightforest/textures/block/wood/door/sort_upper.png new file mode 100644 index 0000000000..8a005acba0 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/wood/door/sort_upper.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/wood/door/time_lower.png b/src/main/resources/classic/assets/twilightforest/textures/block/wood/door/time_lower.png new file mode 100644 index 0000000000..f30f2b29fb Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/wood/door/time_lower.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/wood/door/time_upper.png b/src/main/resources/classic/assets/twilightforest/textures/block/wood/door/time_upper.png new file mode 100644 index 0000000000..7f103d6e51 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/wood/door/time_upper.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/wood/door/twilight_oak_lower.png b/src/main/resources/classic/assets/twilightforest/textures/block/wood/door/twilight_oak_lower.png new file mode 100644 index 0000000000..91a4442f72 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/wood/door/twilight_oak_lower.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/wood/door/twilight_oak_upper.png b/src/main/resources/classic/assets/twilightforest/textures/block/wood/door/twilight_oak_upper.png new file mode 100644 index 0000000000..4e30ba5d8e Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/wood/door/twilight_oak_upper.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_canopy_0.png b/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_canopy_0.png new file mode 100644 index 0000000000..5f7b35054c Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_canopy_0.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_canopy_1.png b/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_canopy_1.png new file mode 100644 index 0000000000..da576e3bfe Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_canopy_1.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_canopy_2.png b/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_canopy_2.png new file mode 100644 index 0000000000..5597f5e10f Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_canopy_2.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_canopy_3.png b/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_canopy_3.png new file mode 100644 index 0000000000..60bfea14eb Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_canopy_3.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_darkwood_0.png b/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_darkwood_0.png new file mode 100644 index 0000000000..0de685a06b Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_darkwood_0.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_darkwood_1.png b/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_darkwood_1.png new file mode 100644 index 0000000000..868aa5f699 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_darkwood_1.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_darkwood_2.png b/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_darkwood_2.png new file mode 100644 index 0000000000..2a33c64a8d Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_darkwood_2.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_darkwood_3.png b/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_darkwood_3.png new file mode 100644 index 0000000000..77dcfc67c4 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_darkwood_3.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_mangrove_0.png b/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_mangrove_0.png new file mode 100644 index 0000000000..8bd5b7551c Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_mangrove_0.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_mangrove_1.png b/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_mangrove_1.png new file mode 100644 index 0000000000..005c518cee Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_mangrove_1.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_mangrove_2.png b/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_mangrove_2.png new file mode 100644 index 0000000000..34ec05b2cd Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_mangrove_2.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_mangrove_3.png b/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_mangrove_3.png new file mode 100644 index 0000000000..6af9ed63b7 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_mangrove_3.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_mine_0.png b/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_mine_0.png new file mode 100644 index 0000000000..079ee0416c Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_mine_0.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_mine_1.png b/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_mine_1.png new file mode 100644 index 0000000000..468743ee40 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_mine_1.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_mine_2.png b/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_mine_2.png new file mode 100644 index 0000000000..a64031582c Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_mine_2.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_mine_3.png b/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_mine_3.png new file mode 100644 index 0000000000..276d24a2cf Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_mine_3.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_sort_0.png b/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_sort_0.png new file mode 100644 index 0000000000..8c9d02c9ba Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_sort_0.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_sort_1.png b/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_sort_1.png new file mode 100644 index 0000000000..7ca2ecdf5b Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_sort_1.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_sort_2.png b/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_sort_2.png new file mode 100644 index 0000000000..03a4298d97 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_sort_2.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_sort_3.png b/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_sort_3.png new file mode 100644 index 0000000000..560c5a9652 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_sort_3.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_time_0.png b/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_time_0.png new file mode 100644 index 0000000000..b59f81fe3f Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_time_0.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_time_1.png b/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_time_1.png new file mode 100644 index 0000000000..8d3c0b99cd Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_time_1.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_time_2.png b/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_time_2.png new file mode 100644 index 0000000000..70282d8c7d Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_time_2.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_time_3.png b/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_time_3.png new file mode 100644 index 0000000000..4d58103ed4 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_time_3.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_trans_0.png b/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_trans_0.png new file mode 100644 index 0000000000..d5da8c8e23 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_trans_0.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_trans_1.png b/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_trans_1.png new file mode 100644 index 0000000000..02a898140a Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_trans_1.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_trans_2.png b/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_trans_2.png new file mode 100644 index 0000000000..cf5fa94baa Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_trans_2.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_trans_3.png b/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_trans_3.png new file mode 100644 index 0000000000..e31b1747e0 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_trans_3.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_twilight_oak_0.png b/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_twilight_oak_0.png new file mode 100644 index 0000000000..ce12a110c8 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_twilight_oak_0.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_twilight_oak_1.png b/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_twilight_oak_1.png new file mode 100644 index 0000000000..12d8a91ae0 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_twilight_oak_1.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_twilight_oak_2.png b/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_twilight_oak_2.png new file mode 100644 index 0000000000..f44d6f3dc3 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_twilight_oak_2.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_twilight_oak_3.png b/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_twilight_oak_3.png new file mode 100644 index 0000000000..358766a5b1 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/wood/planks_twilight_oak_3.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/wood/trapdoor/canopy_trapdoor.png b/src/main/resources/classic/assets/twilightforest/textures/block/wood/trapdoor/canopy_trapdoor.png new file mode 100644 index 0000000000..ec9c4e9ffd Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/wood/trapdoor/canopy_trapdoor.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/wood/trapdoor/darkwood_trapdoor.png b/src/main/resources/classic/assets/twilightforest/textures/block/wood/trapdoor/darkwood_trapdoor.png new file mode 100644 index 0000000000..254967f9c7 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/wood/trapdoor/darkwood_trapdoor.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/wood/trapdoor/mangrove_trapdoor.png b/src/main/resources/classic/assets/twilightforest/textures/block/wood/trapdoor/mangrove_trapdoor.png new file mode 100644 index 0000000000..5ca11115e5 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/wood/trapdoor/mangrove_trapdoor.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/wood/trapdoor/mine_trapdoor.png b/src/main/resources/classic/assets/twilightforest/textures/block/wood/trapdoor/mine_trapdoor.png new file mode 100644 index 0000000000..de43d778cb Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/wood/trapdoor/mine_trapdoor.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/wood/trapdoor/sort_trapdoor.png b/src/main/resources/classic/assets/twilightforest/textures/block/wood/trapdoor/sort_trapdoor.png new file mode 100644 index 0000000000..78a05da39c Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/wood/trapdoor/sort_trapdoor.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/wood/trapdoor/time_trapdoor.png b/src/main/resources/classic/assets/twilightforest/textures/block/wood/trapdoor/time_trapdoor.png new file mode 100644 index 0000000000..4e64becb25 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/wood/trapdoor/time_trapdoor.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/wood/trapdoor/twilight_oak_trapdoor.png b/src/main/resources/classic/assets/twilightforest/textures/block/wood/trapdoor/twilight_oak_trapdoor.png new file mode 100644 index 0000000000..45eb334dc8 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/wood/trapdoor/twilight_oak_trapdoor.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/worn_castle_brick.png b/src/main/resources/classic/assets/twilightforest/textures/block/worn_castle_brick.png new file mode 100644 index 0000000000..0d69fd5731 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/worn_castle_brick.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/block/worn_castle_brick_stairs.png b/src/main/resources/classic/assets/twilightforest/textures/block/worn_castle_brick_stairs.png new file mode 100644 index 0000000000..0d591c6109 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/block/worn_castle_brick_stairs.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/environment/ashes.png b/src/main/resources/classic/assets/twilightforest/textures/environment/ashes.png new file mode 100644 index 0000000000..c566a3baad Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/environment/ashes.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/environment/bigrain.png b/src/main/resources/classic/assets/twilightforest/textures/environment/bigrain.png new file mode 100644 index 0000000000..b5833168d9 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/environment/bigrain.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/environment/blizzard.png b/src/main/resources/classic/assets/twilightforest/textures/environment/blizzard.png new file mode 100644 index 0000000000..8003f3c212 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/environment/blizzard.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/environment/darkstream.png b/src/main/resources/classic/assets/twilightforest/textures/environment/darkstream.png new file mode 100644 index 0000000000..7bea79266b Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/environment/darkstream.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/environment/mosquitoes.png b/src/main/resources/classic/assets/twilightforest/textures/environment/mosquitoes.png new file mode 100644 index 0000000000..8abe175c97 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/environment/mosquitoes.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/environment/sparkles.png b/src/main/resources/classic/assets/twilightforest/textures/environment/sparkles.png new file mode 100644 index 0000000000..418112c7f2 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/environment/sparkles.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/gui/glow_overlay.png b/src/main/resources/classic/assets/twilightforest/textures/gui/glow_overlay.png new file mode 100644 index 0000000000..50644d7156 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/gui/glow_overlay.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/gui/guigoblintinkering.png b/src/main/resources/classic/assets/twilightforest/textures/gui/guigoblintinkering.png new file mode 100644 index 0000000000..25da384be9 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/gui/guigoblintinkering.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/gui/mapicons.png b/src/main/resources/classic/assets/twilightforest/textures/gui/mapicons.png new file mode 100644 index 0000000000..9e003cd552 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/gui/mapicons.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/alpha_yeti_fur.png b/src/main/resources/classic/assets/twilightforest/textures/item/alpha_yeti_fur.png new file mode 100644 index 0000000000..f5a1e6e13d Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/alpha_yeti_fur.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/arctic_boots.png b/src/main/resources/classic/assets/twilightforest/textures/item/arctic_boots.png new file mode 100644 index 0000000000..1bbb55bb54 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/arctic_boots.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/arctic_boots_0.png b/src/main/resources/classic/assets/twilightforest/textures/item/arctic_boots_0.png new file mode 100644 index 0000000000..08ea0cba40 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/arctic_boots_0.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/arctic_chestplate.png b/src/main/resources/classic/assets/twilightforest/textures/item/arctic_chestplate.png new file mode 100644 index 0000000000..8f21d04ca8 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/arctic_chestplate.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/arctic_chestplate_0.png b/src/main/resources/classic/assets/twilightforest/textures/item/arctic_chestplate_0.png new file mode 100644 index 0000000000..f2ed29073e Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/arctic_chestplate_0.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/arctic_fur.png b/src/main/resources/classic/assets/twilightforest/textures/item/arctic_fur.png new file mode 100644 index 0000000000..9d8a75a75b Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/arctic_fur.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/arctic_helmet.png b/src/main/resources/classic/assets/twilightforest/textures/item/arctic_helmet.png new file mode 100644 index 0000000000..79ecd36231 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/arctic_helmet.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/arctic_helmet_0.png b/src/main/resources/classic/assets/twilightforest/textures/item/arctic_helmet_0.png new file mode 100644 index 0000000000..f3894df227 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/arctic_helmet_0.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/arctic_leggings.png b/src/main/resources/classic/assets/twilightforest/textures/item/arctic_leggings.png new file mode 100644 index 0000000000..169bbc6121 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/arctic_leggings.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/arctic_leggings_0.png b/src/main/resources/classic/assets/twilightforest/textures/item/arctic_leggings_0.png new file mode 100644 index 0000000000..8ad1b6bd37 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/arctic_leggings_0.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/armor_shard.png b/src/main/resources/classic/assets/twilightforest/textures/item/armor_shard.png new file mode 100644 index 0000000000..aacac1b294 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/armor_shard.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/armor_shard_cluster.png b/src/main/resources/classic/assets/twilightforest/textures/item/armor_shard_cluster.png new file mode 100644 index 0000000000..e5f093f11f Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/armor_shard_cluster.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/block_and_chain.png b/src/main/resources/classic/assets/twilightforest/textures/item/block_and_chain.png new file mode 100644 index 0000000000..4fc18357f3 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/block_and_chain.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/block_and_chain_thrown.png b/src/main/resources/classic/assets/twilightforest/textures/item/block_and_chain_thrown.png new file mode 100644 index 0000000000..cb68e178b7 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/block_and_chain_thrown.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/borer_essence.png b/src/main/resources/classic/assets/twilightforest/textures/item/borer_essence.png new file mode 100644 index 0000000000..88d61612d1 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/borer_essence.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/borer_essence_particles.png b/src/main/resources/classic/assets/twilightforest/textures/item/borer_essence_particles.png new file mode 100644 index 0000000000..6a87db2c68 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/borer_essence_particles.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/carminite.png b/src/main/resources/classic/assets/twilightforest/textures/item/carminite.png new file mode 100644 index 0000000000..534d18bdef Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/carminite.png differ diff --git a/src/main/resources/assets/twilightforest/textures/items/charmOfKeeping1.png b/src/main/resources/classic/assets/twilightforest/textures/item/charm_of_keeping_1.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/items/charmOfKeeping1.png rename to src/main/resources/classic/assets/twilightforest/textures/item/charm_of_keeping_1.png diff --git a/src/main/resources/assets/twilightforest/textures/items/charmOfKeeping2.png b/src/main/resources/classic/assets/twilightforest/textures/item/charm_of_keeping_2.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/items/charmOfKeeping2.png rename to src/main/resources/classic/assets/twilightforest/textures/item/charm_of_keeping_2.png diff --git a/src/main/resources/assets/twilightforest/textures/items/charmOfKeeping3.png b/src/main/resources/classic/assets/twilightforest/textures/item/charm_of_keeping_3.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/items/charmOfKeeping3.png rename to src/main/resources/classic/assets/twilightforest/textures/item/charm_of_keeping_3.png diff --git a/src/main/resources/assets/twilightforest/textures/items/charmOfLife1.png b/src/main/resources/classic/assets/twilightforest/textures/item/charm_of_life_1.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/items/charmOfLife1.png rename to src/main/resources/classic/assets/twilightforest/textures/item/charm_of_life_1.png diff --git a/src/main/resources/assets/twilightforest/textures/items/charmOfLife2.png b/src/main/resources/classic/assets/twilightforest/textures/item/charm_of_life_2.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/items/charmOfLife2.png rename to src/main/resources/classic/assets/twilightforest/textures/item/charm_of_life_2.png diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/cooked_meef.png b/src/main/resources/classic/assets/twilightforest/textures/item/cooked_meef.png new file mode 100644 index 0000000000..3c881df3c5 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/cooked_meef.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/cooked_venison.png b/src/main/resources/classic/assets/twilightforest/textures/item/cooked_venison.png new file mode 100644 index 0000000000..d53131fe1d Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/cooked_venison.png differ diff --git a/src/main/resources/assets/twilightforest/textures/items/copperBlank.png b/src/main/resources/classic/assets/twilightforest/textures/item/copper_blank.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/items/copperBlank.png rename to src/main/resources/classic/assets/twilightforest/textures/item/copper_blank.png diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/crumble_horn.png b/src/main/resources/classic/assets/twilightforest/textures/item/crumble_horn.png new file mode 100644 index 0000000000..274381a1bc Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/crumble_horn.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/cube_of_annihilation.png b/src/main/resources/classic/assets/twilightforest/textures/item/cube_of_annihilation.png new file mode 100644 index 0000000000..aeaf12ad43 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/cube_of_annihilation.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/cube_of_annihilation_thrown.png b/src/main/resources/classic/assets/twilightforest/textures/item/cube_of_annihilation_thrown.png new file mode 100644 index 0000000000..11e7359df3 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/cube_of_annihilation_thrown.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/cube_talisman.png b/src/main/resources/classic/assets/twilightforest/textures/item/cube_talisman.png new file mode 100644 index 0000000000..8310cba210 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/cube_talisman.png differ diff --git a/src/main/resources/assets/twilightforest/textures/items/minotaurAxe.png b/src/main/resources/classic/assets/twilightforest/textures/item/diamond_minotaur_axe.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/items/minotaurAxe.png rename to src/main/resources/classic/assets/twilightforest/textures/item/diamond_minotaur_axe.png diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/ender_bow.png b/src/main/resources/classic/assets/twilightforest/textures/item/ender_bow.png new file mode 100644 index 0000000000..809726cc28 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/ender_bow.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/ender_bow_pulling_0.png b/src/main/resources/classic/assets/twilightforest/textures/item/ender_bow_pulling_0.png new file mode 100644 index 0000000000..09823a3193 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/ender_bow_pulling_0.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/ender_bow_pulling_1.png b/src/main/resources/classic/assets/twilightforest/textures/item/ender_bow_pulling_1.png new file mode 100644 index 0000000000..066194f996 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/ender_bow_pulling_1.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/ender_bow_pulling_2.png b/src/main/resources/classic/assets/twilightforest/textures/item/ender_bow_pulling_2.png new file mode 100644 index 0000000000..67ce09b405 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/ender_bow_pulling_2.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/experiment_115.png b/src/main/resources/classic/assets/twilightforest/textures/item/experiment_115.png new file mode 100644 index 0000000000..b3433be93c Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/experiment_115.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/fiery_blood.png b/src/main/resources/classic/assets/twilightforest/textures/item/fiery_blood.png new file mode 100644 index 0000000000..f80ac67e48 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/fiery_blood.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/fiery_boots.png b/src/main/resources/classic/assets/twilightforest/textures/item/fiery_boots.png new file mode 100644 index 0000000000..7e3afbb318 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/fiery_boots.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/fiery_boots.png.mcmeta b/src/main/resources/classic/assets/twilightforest/textures/item/fiery_boots.png.mcmeta new file mode 100644 index 0000000000..9278e23cb5 --- /dev/null +++ b/src/main/resources/classic/assets/twilightforest/textures/item/fiery_boots.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 18 + } +} \ No newline at end of file diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/fiery_chestplate.png b/src/main/resources/classic/assets/twilightforest/textures/item/fiery_chestplate.png new file mode 100644 index 0000000000..9cbc77fa90 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/fiery_chestplate.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/fiery_chestplate.png.mcmeta b/src/main/resources/classic/assets/twilightforest/textures/item/fiery_chestplate.png.mcmeta new file mode 100644 index 0000000000..9278e23cb5 --- /dev/null +++ b/src/main/resources/classic/assets/twilightforest/textures/item/fiery_chestplate.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 18 + } +} \ No newline at end of file diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/fiery_helmet.png b/src/main/resources/classic/assets/twilightforest/textures/item/fiery_helmet.png new file mode 100644 index 0000000000..57ecdf8647 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/fiery_helmet.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/fiery_helmet.png.mcmeta b/src/main/resources/classic/assets/twilightforest/textures/item/fiery_helmet.png.mcmeta new file mode 100644 index 0000000000..9278e23cb5 --- /dev/null +++ b/src/main/resources/classic/assets/twilightforest/textures/item/fiery_helmet.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 18 + } +} \ No newline at end of file diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/fiery_ingot.png b/src/main/resources/classic/assets/twilightforest/textures/item/fiery_ingot.png new file mode 100644 index 0000000000..2f50f4a6c6 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/fiery_ingot.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/fiery_ingot.png.mcmeta b/src/main/resources/classic/assets/twilightforest/textures/item/fiery_ingot.png.mcmeta new file mode 100644 index 0000000000..9278e23cb5 --- /dev/null +++ b/src/main/resources/classic/assets/twilightforest/textures/item/fiery_ingot.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 18 + } +} \ No newline at end of file diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/fiery_leggings.png b/src/main/resources/classic/assets/twilightforest/textures/item/fiery_leggings.png new file mode 100644 index 0000000000..450ef9eed6 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/fiery_leggings.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/fiery_leggings.png.mcmeta b/src/main/resources/classic/assets/twilightforest/textures/item/fiery_leggings.png.mcmeta new file mode 100644 index 0000000000..9278e23cb5 --- /dev/null +++ b/src/main/resources/classic/assets/twilightforest/textures/item/fiery_leggings.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 18 + } +} \ No newline at end of file diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/fiery_pickaxe.png b/src/main/resources/classic/assets/twilightforest/textures/item/fiery_pickaxe.png new file mode 100644 index 0000000000..fd0f8fadba Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/fiery_pickaxe.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/fiery_pickaxe.png.mcmeta b/src/main/resources/classic/assets/twilightforest/textures/item/fiery_pickaxe.png.mcmeta new file mode 100644 index 0000000000..9278e23cb5 --- /dev/null +++ b/src/main/resources/classic/assets/twilightforest/textures/item/fiery_pickaxe.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 18 + } +} \ No newline at end of file diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/fiery_sword.png b/src/main/resources/classic/assets/twilightforest/textures/item/fiery_sword.png new file mode 100644 index 0000000000..b987a035fe Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/fiery_sword.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/fiery_sword.png.mcmeta b/src/main/resources/classic/assets/twilightforest/textures/item/fiery_sword.png.mcmeta new file mode 100644 index 0000000000..9278e23cb5 --- /dev/null +++ b/src/main/resources/classic/assets/twilightforest/textures/item/fiery_sword.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 18 + } +} \ No newline at end of file diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/fiery_tears.png b/src/main/resources/classic/assets/twilightforest/textures/item/fiery_tears.png new file mode 100644 index 0000000000..f5dc8b4689 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/fiery_tears.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/filled_magic_map.png b/src/main/resources/classic/assets/twilightforest/textures/item/filled_magic_map.png new file mode 100644 index 0000000000..ba9dcdf8e3 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/filled_magic_map.png differ diff --git a/src/main/resources/assets/twilightforest/textures/items/mazeMap.png b/src/main/resources/classic/assets/twilightforest/textures/item/filled_maze_map.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/items/mazeMap.png rename to src/main/resources/classic/assets/twilightforest/textures/item/filled_maze_map.png diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/filled_ore_map.png b/src/main/resources/classic/assets/twilightforest/textures/item/filled_ore_map.png new file mode 100644 index 0000000000..a7102a8d8e Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/filled_ore_map.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/fortification_scepter.png b/src/main/resources/classic/assets/twilightforest/textures/item/fortification_scepter.png new file mode 100644 index 0000000000..7d7561e578 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/fortification_scepter.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/glass_sword_clear.png b/src/main/resources/classic/assets/twilightforest/textures/item/glass_sword_clear.png new file mode 100644 index 0000000000..23812dbae3 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/glass_sword_clear.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/glass_sword_solid.png b/src/main/resources/classic/assets/twilightforest/textures/item/glass_sword_solid.png new file mode 100644 index 0000000000..745dbfb203 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/glass_sword_solid.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/gold_minotaur_axe.png b/src/main/resources/classic/assets/twilightforest/textures/item/gold_minotaur_axe.png new file mode 100644 index 0000000000..84eb54cc96 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/gold_minotaur_axe.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/hydra_chop.png b/src/main/resources/classic/assets/twilightforest/textures/item/hydra_chop.png new file mode 100644 index 0000000000..af59370dce Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/hydra_chop.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/hydra_trophy.png b/src/main/resources/classic/assets/twilightforest/textures/item/hydra_trophy.png new file mode 100644 index 0000000000..984a46dc09 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/hydra_trophy.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/ice_bomb.png b/src/main/resources/classic/assets/twilightforest/textures/item/ice_bomb.png new file mode 100644 index 0000000000..6a43971878 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/ice_bomb.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/ice_bow_clear.png b/src/main/resources/classic/assets/twilightforest/textures/item/ice_bow_clear.png new file mode 100644 index 0000000000..f0deb6eca3 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/ice_bow_clear.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/ice_bow_clear_pulling_0.png b/src/main/resources/classic/assets/twilightforest/textures/item/ice_bow_clear_pulling_0.png new file mode 100644 index 0000000000..359bd4eba8 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/ice_bow_clear_pulling_0.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/ice_bow_clear_pulling_1.png b/src/main/resources/classic/assets/twilightforest/textures/item/ice_bow_clear_pulling_1.png new file mode 100644 index 0000000000..43881c335f Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/ice_bow_clear_pulling_1.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/ice_bow_clear_pulling_2.png b/src/main/resources/classic/assets/twilightforest/textures/item/ice_bow_clear_pulling_2.png new file mode 100644 index 0000000000..943d8e6c24 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/ice_bow_clear_pulling_2.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/ice_bow_solid.png b/src/main/resources/classic/assets/twilightforest/textures/item/ice_bow_solid.png new file mode 100644 index 0000000000..83085f10b2 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/ice_bow_solid.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/ice_bow_solid_pulling_0.png b/src/main/resources/classic/assets/twilightforest/textures/item/ice_bow_solid_pulling_0.png new file mode 100644 index 0000000000..4aa42ec058 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/ice_bow_solid_pulling_0.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/ice_bow_solid_pulling_1.png b/src/main/resources/classic/assets/twilightforest/textures/item/ice_bow_solid_pulling_1.png new file mode 100644 index 0000000000..1cc0518348 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/ice_bow_solid_pulling_1.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/ice_bow_solid_pulling_2.png b/src/main/resources/classic/assets/twilightforest/textures/item/ice_bow_solid_pulling_2.png new file mode 100644 index 0000000000..cb78aa0ece Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/ice_bow_solid_pulling_2.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/ice_sword_clear.png b/src/main/resources/classic/assets/twilightforest/textures/item/ice_sword_clear.png new file mode 100644 index 0000000000..df12c113e3 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/ice_sword_clear.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/ice_sword_solid.png b/src/main/resources/classic/assets/twilightforest/textures/item/ice_sword_solid.png new file mode 100644 index 0000000000..19a791dea6 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/ice_sword_solid.png differ diff --git a/src/main/resources/assets/twilightforest/textures/items/ironwoodAxe.png b/src/main/resources/classic/assets/twilightforest/textures/item/ironwood_axe.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/items/ironwoodAxe.png rename to src/main/resources/classic/assets/twilightforest/textures/item/ironwood_axe.png diff --git a/src/main/resources/assets/twilightforest/textures/items/ironwoodBoots.png b/src/main/resources/classic/assets/twilightforest/textures/item/ironwood_boots.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/items/ironwoodBoots.png rename to src/main/resources/classic/assets/twilightforest/textures/item/ironwood_boots.png diff --git a/src/main/resources/assets/twilightforest/textures/items/ironwoodHelm.png b/src/main/resources/classic/assets/twilightforest/textures/item/ironwood_helm.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/items/ironwoodHelm.png rename to src/main/resources/classic/assets/twilightforest/textures/item/ironwood_helm.png diff --git a/src/main/resources/assets/twilightforest/textures/items/ironwoodHoe.png b/src/main/resources/classic/assets/twilightforest/textures/item/ironwood_hoe.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/items/ironwoodHoe.png rename to src/main/resources/classic/assets/twilightforest/textures/item/ironwood_hoe.png diff --git a/src/main/resources/assets/twilightforest/textures/items/ironwoodIngot.png b/src/main/resources/classic/assets/twilightforest/textures/item/ironwood_ingot.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/items/ironwoodIngot.png rename to src/main/resources/classic/assets/twilightforest/textures/item/ironwood_ingot.png diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/ironwood_legs.png b/src/main/resources/classic/assets/twilightforest/textures/item/ironwood_legs.png new file mode 100644 index 0000000000..af20d98bd0 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/ironwood_legs.png differ diff --git a/src/main/resources/assets/twilightforest/textures/items/ironwoodPick.png b/src/main/resources/classic/assets/twilightforest/textures/item/ironwood_pick.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/items/ironwoodPick.png rename to src/main/resources/classic/assets/twilightforest/textures/item/ironwood_pick.png diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/ironwood_plate.png b/src/main/resources/classic/assets/twilightforest/textures/item/ironwood_plate.png new file mode 100644 index 0000000000..472717392f Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/ironwood_plate.png differ diff --git a/src/main/resources/assets/twilightforest/textures/items/ironwoodShovel.png b/src/main/resources/classic/assets/twilightforest/textures/item/ironwood_shovel.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/items/ironwoodShovel.png rename to src/main/resources/classic/assets/twilightforest/textures/item/ironwood_shovel.png diff --git a/src/main/resources/assets/twilightforest/textures/items/ironwoodSword.png b/src/main/resources/classic/assets/twilightforest/textures/item/ironwood_sword.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/items/ironwoodSword.png rename to src/main/resources/classic/assets/twilightforest/textures/item/ironwood_sword.png diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/knightmetal_axe.png b/src/main/resources/classic/assets/twilightforest/textures/item/knightmetal_axe.png new file mode 100644 index 0000000000..0b3ed96976 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/knightmetal_axe.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/knightmetal_boots.png b/src/main/resources/classic/assets/twilightforest/textures/item/knightmetal_boots.png new file mode 100644 index 0000000000..2c423a13e2 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/knightmetal_boots.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/knightmetal_chestplate.png b/src/main/resources/classic/assets/twilightforest/textures/item/knightmetal_chestplate.png new file mode 100644 index 0000000000..3490263c32 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/knightmetal_chestplate.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/knightmetal_helmet.png b/src/main/resources/classic/assets/twilightforest/textures/item/knightmetal_helmet.png new file mode 100644 index 0000000000..859af97717 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/knightmetal_helmet.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/knightmetal_ingot.png b/src/main/resources/classic/assets/twilightforest/textures/item/knightmetal_ingot.png new file mode 100644 index 0000000000..3c4daba00d Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/knightmetal_ingot.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/knightmetal_leggings.png b/src/main/resources/classic/assets/twilightforest/textures/item/knightmetal_leggings.png new file mode 100644 index 0000000000..62a5dd308f Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/knightmetal_leggings.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/knightmetal_pickaxe.png b/src/main/resources/classic/assets/twilightforest/textures/item/knightmetal_pickaxe.png new file mode 100644 index 0000000000..0e5a43fd30 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/knightmetal_pickaxe.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/knightmetal_ring.png b/src/main/resources/classic/assets/twilightforest/textures/item/knightmetal_ring.png new file mode 100644 index 0000000000..a564a8ffae Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/knightmetal_ring.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/knightmetal_sword.png b/src/main/resources/classic/assets/twilightforest/textures/item/knightmetal_sword.png new file mode 100644 index 0000000000..8e72bf6b3a Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/knightmetal_sword.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/lamp_of_cinders.png b/src/main/resources/classic/assets/twilightforest/textures/item/lamp_of_cinders.png new file mode 100644 index 0000000000..d50a92dd54 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/lamp_of_cinders.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/lich_shield_fill.png b/src/main/resources/classic/assets/twilightforest/textures/item/lich_shield_fill.png new file mode 100644 index 0000000000..9a54dfd870 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/lich_shield_fill.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/lich_shield_frame.png b/src/main/resources/classic/assets/twilightforest/textures/item/lich_shield_frame.png new file mode 100644 index 0000000000..ccd61f3fcf Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/lich_shield_frame.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/lich_trophy.png b/src/main/resources/classic/assets/twilightforest/textures/item/lich_trophy.png new file mode 100644 index 0000000000..e71ba119f9 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/lich_trophy.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/lifedrain_scepter.png b/src/main/resources/classic/assets/twilightforest/textures/item/lifedrain_scepter.png new file mode 100644 index 0000000000..ab0692d097 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/lifedrain_scepter.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/liveroot.png b/src/main/resources/classic/assets/twilightforest/textures/item/liveroot.png new file mode 100644 index 0000000000..5c4ea60cb9 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/liveroot.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/magic_beans.png b/src/main/resources/classic/assets/twilightforest/textures/item/magic_beans.png new file mode 100644 index 0000000000..62602fb7f5 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/magic_beans.png differ diff --git a/src/main/resources/assets/twilightforest/textures/items/emptyMagicMap.png b/src/main/resources/classic/assets/twilightforest/textures/item/magic_map.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/items/emptyMagicMap.png rename to src/main/resources/classic/assets/twilightforest/textures/item/magic_map.png diff --git a/src/main/resources/assets/twilightforest/textures/items/magicMapFocus.png b/src/main/resources/classic/assets/twilightforest/textures/item/magic_map_focus.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/items/magicMapFocus.png rename to src/main/resources/classic/assets/twilightforest/textures/item/magic_map_focus.png diff --git a/src/main/resources/assets/twilightforest/textures/items/emptyMazeMap.png b/src/main/resources/classic/assets/twilightforest/textures/item/maze_map.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/items/emptyMazeMap.png rename to src/main/resources/classic/assets/twilightforest/textures/item/maze_map.png diff --git a/src/main/resources/assets/twilightforest/textures/items/mazeMapFocus.png b/src/main/resources/classic/assets/twilightforest/textures/item/maze_map_focus.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/items/mazeMapFocus.png rename to src/main/resources/classic/assets/twilightforest/textures/item/maze_map_focus.png diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/maze_wafer.png b/src/main/resources/classic/assets/twilightforest/textures/item/maze_wafer.png new file mode 100644 index 0000000000..3b6990e732 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/maze_wafer.png differ diff --git a/src/main/resources/assets/twilightforest/textures/items/mazebreakerPick.png b/src/main/resources/classic/assets/twilightforest/textures/item/mazebreaker_pickaxe.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/items/mazebreakerPick.png rename to src/main/resources/classic/assets/twilightforest/textures/item/mazebreaker_pickaxe.png diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/meef_stroganoff.png b/src/main/resources/classic/assets/twilightforest/textures/item/meef_stroganoff.png new file mode 100644 index 0000000000..971845f634 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/meef_stroganoff.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/moon_dial/first_quarter.png b/src/main/resources/classic/assets/twilightforest/textures/item/moon_dial/first_quarter.png new file mode 100644 index 0000000000..d6755ce5f1 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/moon_dial/first_quarter.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/moon_dial/full.png b/src/main/resources/classic/assets/twilightforest/textures/item/moon_dial/full.png new file mode 100644 index 0000000000..2431d35e53 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/moon_dial/full.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/moon_dial/new.png b/src/main/resources/classic/assets/twilightforest/textures/item/moon_dial/new.png new file mode 100644 index 0000000000..cf163e8b73 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/moon_dial/new.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/moon_dial/third_quarter.png b/src/main/resources/classic/assets/twilightforest/textures/item/moon_dial/third_quarter.png new file mode 100644 index 0000000000..35a2cf9f7e Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/moon_dial/third_quarter.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/moon_dial/waning_cresent.png b/src/main/resources/classic/assets/twilightforest/textures/item/moon_dial/waning_cresent.png new file mode 100644 index 0000000000..93f6b8cb44 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/moon_dial/waning_cresent.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/moon_dial/waning_gibbous.png b/src/main/resources/classic/assets/twilightforest/textures/item/moon_dial/waning_gibbous.png new file mode 100644 index 0000000000..f8d1537106 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/moon_dial/waning_gibbous.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/moon_dial/waxing_cresent.png b/src/main/resources/classic/assets/twilightforest/textures/item/moon_dial/waxing_cresent.png new file mode 100644 index 0000000000..b32146f611 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/moon_dial/waxing_cresent.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/moon_dial/waxing_gibbous.png b/src/main/resources/classic/assets/twilightforest/textures/item/moon_dial/waxing_gibbous.png new file mode 100644 index 0000000000..17dac567ca Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/moon_dial/waxing_gibbous.png differ diff --git a/src/main/resources/assets/twilightforest/textures/items/moonwormQueen.png b/src/main/resources/classic/assets/twilightforest/textures/item/moonworm_queen.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/items/moonwormQueen.png rename to src/main/resources/classic/assets/twilightforest/textures/item/moonworm_queen.png diff --git a/src/main/resources/assets/twilightforest/textures/items/moonwormQueenAlt.png b/src/main/resources/classic/assets/twilightforest/textures/item/moonworm_queen_alt.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/items/moonwormQueenAlt.png rename to src/main/resources/classic/assets/twilightforest/textures/item/moonworm_queen_alt.png diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/naga_chestplate.png b/src/main/resources/classic/assets/twilightforest/textures/item/naga_chestplate.png new file mode 100644 index 0000000000..ed16c81782 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/naga_chestplate.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/naga_leggings.png b/src/main/resources/classic/assets/twilightforest/textures/item/naga_leggings.png new file mode 100644 index 0000000000..6172287d49 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/naga_leggings.png differ diff --git a/src/main/resources/assets/twilightforest/textures/items/nagaScale.png b/src/main/resources/classic/assets/twilightforest/textures/item/naga_scale.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/items/nagaScale.png rename to src/main/resources/classic/assets/twilightforest/textures/item/naga_scale.png diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/naga_trophy.png b/src/main/resources/classic/assets/twilightforest/textures/item/naga_trophy.png new file mode 100644 index 0000000000..4e37d8065f Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/naga_trophy.png differ diff --git a/src/main/resources/assets/twilightforest/textures/items/oreMagnet.png b/src/main/resources/classic/assets/twilightforest/textures/item/ore_magnet.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/items/oreMagnet.png rename to src/main/resources/classic/assets/twilightforest/textures/item/ore_magnet.png diff --git a/src/main/resources/assets/twilightforest/textures/items/oreMagnet1.png b/src/main/resources/classic/assets/twilightforest/textures/item/ore_magnet_pulling_1.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/items/oreMagnet1.png rename to src/main/resources/classic/assets/twilightforest/textures/item/ore_magnet_pulling_1.png diff --git a/src/main/resources/assets/twilightforest/textures/items/oreMagnet2.png b/src/main/resources/classic/assets/twilightforest/textures/item/ore_magnet_pulling_2.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/items/oreMagnet2.png rename to src/main/resources/classic/assets/twilightforest/textures/item/ore_magnet_pulling_2.png diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/ore_map.png b/src/main/resources/classic/assets/twilightforest/textures/item/ore_map.png new file mode 100644 index 0000000000..bd79e19a7f Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/ore_map.png differ diff --git a/src/main/resources/assets/twilightforest/textures/items/oreMeter.png b/src/main/resources/classic/assets/twilightforest/textures/item/ore_meter.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/items/oreMeter.png rename to src/main/resources/classic/assets/twilightforest/textures/item/ore_meter.png diff --git a/src/main/resources/assets/twilightforest/textures/items/peacockFan.png b/src/main/resources/classic/assets/twilightforest/textures/item/peacock_feather_fan.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/items/peacockFan.png rename to src/main/resources/classic/assets/twilightforest/textures/item/peacock_feather_fan.png diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/phantom_chestplate.png b/src/main/resources/classic/assets/twilightforest/textures/item/phantom_chestplate.png new file mode 100644 index 0000000000..5b98979855 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/phantom_chestplate.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/phantom_helmet.png b/src/main/resources/classic/assets/twilightforest/textures/item/phantom_helmet.png new file mode 100644 index 0000000000..2ebb9f8e35 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/phantom_helmet.png differ diff --git a/src/main/resources/assets/twilightforest/textures/items/tfFeather.png b/src/main/resources/classic/assets/twilightforest/textures/item/raven_feather.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/items/tfFeather.png rename to src/main/resources/classic/assets/twilightforest/textures/item/raven_feather.png diff --git a/src/main/resources/assets/twilightforest/textures/items/ironwoodRaw.png b/src/main/resources/classic/assets/twilightforest/textures/item/raw_ironwood.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/items/ironwoodRaw.png rename to src/main/resources/classic/assets/twilightforest/textures/item/raw_ironwood.png diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/raw_meef.png b/src/main/resources/classic/assets/twilightforest/textures/item/raw_meef.png new file mode 100644 index 0000000000..6de00b6d60 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/raw_meef.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/raw_venison.png b/src/main/resources/classic/assets/twilightforest/textures/item/raw_venison.png new file mode 100644 index 0000000000..1d6a96d4ae Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/raw_venison.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/seeker_bow.png b/src/main/resources/classic/assets/twilightforest/textures/item/seeker_bow.png new file mode 100644 index 0000000000..4848746400 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/seeker_bow.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/seeker_bow_pulling_0.png b/src/main/resources/classic/assets/twilightforest/textures/item/seeker_bow_pulling_0.png new file mode 100644 index 0000000000..66df5cf992 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/seeker_bow_pulling_0.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/seeker_bow_pulling_1.png b/src/main/resources/classic/assets/twilightforest/textures/item/seeker_bow_pulling_1.png new file mode 100644 index 0000000000..258b362699 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/seeker_bow_pulling_1.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/seeker_bow_pulling_2.png b/src/main/resources/classic/assets/twilightforest/textures/item/seeker_bow_pulling_2.png new file mode 100644 index 0000000000..39db349b47 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/seeker_bow_pulling_2.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/snow_queen_trophy.png b/src/main/resources/classic/assets/twilightforest/textures/item/snow_queen_trophy.png new file mode 100644 index 0000000000..eb6f8423e4 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/snow_queen_trophy.png differ diff --git a/src/main/resources/assets/twilightforest/textures/items/steeleafAxe.png b/src/main/resources/classic/assets/twilightforest/textures/item/steeleaf_axe.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/items/steeleafAxe.png rename to src/main/resources/classic/assets/twilightforest/textures/item/steeleaf_axe.png diff --git a/src/main/resources/assets/twilightforest/textures/items/steeleafBoots.png b/src/main/resources/classic/assets/twilightforest/textures/item/steeleaf_boots.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/items/steeleafBoots.png rename to src/main/resources/classic/assets/twilightforest/textures/item/steeleaf_boots.png diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/steeleaf_chestplate.png b/src/main/resources/classic/assets/twilightforest/textures/item/steeleaf_chestplate.png new file mode 100644 index 0000000000..b9764a9159 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/steeleaf_chestplate.png differ diff --git a/src/main/resources/assets/twilightforest/textures/items/steeleafHelm.png b/src/main/resources/classic/assets/twilightforest/textures/item/steeleaf_helmet.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/items/steeleafHelm.png rename to src/main/resources/classic/assets/twilightforest/textures/item/steeleaf_helmet.png diff --git a/src/main/resources/assets/twilightforest/textures/items/steeleafHoe.png b/src/main/resources/classic/assets/twilightforest/textures/item/steeleaf_hoe.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/items/steeleafHoe.png rename to src/main/resources/classic/assets/twilightforest/textures/item/steeleaf_hoe.png diff --git a/src/main/resources/assets/twilightforest/textures/items/steeleafIngot.png b/src/main/resources/classic/assets/twilightforest/textures/item/steeleaf_ingot.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/items/steeleafIngot.png rename to src/main/resources/classic/assets/twilightforest/textures/item/steeleaf_ingot.png diff --git a/src/main/resources/assets/twilightforest/textures/items/steeleafLegs.png b/src/main/resources/classic/assets/twilightforest/textures/item/steeleaf_leggings.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/items/steeleafLegs.png rename to src/main/resources/classic/assets/twilightforest/textures/item/steeleaf_leggings.png diff --git a/src/main/resources/assets/twilightforest/textures/items/steeleafPick.png b/src/main/resources/classic/assets/twilightforest/textures/item/steeleaf_pickaxe.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/items/steeleafPick.png rename to src/main/resources/classic/assets/twilightforest/textures/item/steeleaf_pickaxe.png diff --git a/src/main/resources/assets/twilightforest/textures/items/steeleafShovel.png b/src/main/resources/classic/assets/twilightforest/textures/item/steeleaf_shovel.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/items/steeleafShovel.png rename to src/main/resources/classic/assets/twilightforest/textures/item/steeleaf_shovel.png diff --git a/src/main/resources/assets/twilightforest/textures/items/steeleafSword.png b/src/main/resources/classic/assets/twilightforest/textures/item/steeleaf_sword.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/items/steeleafSword.png rename to src/main/resources/classic/assets/twilightforest/textures/item/steeleaf_sword.png diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/tf_banner_pattern.png b/src/main/resources/classic/assets/twilightforest/textures/item/tf_banner_pattern.png new file mode 100644 index 0000000000..b0ce27dd24 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/tf_banner_pattern.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/think115.png b/src/main/resources/classic/assets/twilightforest/textures/item/think115.png new file mode 100644 index 0000000000..46fd273ebd Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/think115.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/torchberries.png b/src/main/resources/classic/assets/twilightforest/textures/item/torchberries.png new file mode 100644 index 0000000000..6eed87cafb Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/torchberries.png differ diff --git a/src/main/resources/assets/twilightforest/textures/items/towerKey.png b/src/main/resources/classic/assets/twilightforest/textures/item/tower_key.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/items/towerKey.png rename to src/main/resources/classic/assets/twilightforest/textures/item/tower_key.png diff --git a/src/main/resources/assets/twilightforest/textures/items/transformPowder.png b/src/main/resources/classic/assets/twilightforest/textures/item/transformation_powder.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/items/transformPowder.png rename to src/main/resources/classic/assets/twilightforest/textures/item/transformation_powder.png diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/triple_bow.png b/src/main/resources/classic/assets/twilightforest/textures/item/triple_bow.png new file mode 100644 index 0000000000..9b59c3cf5f Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/triple_bow.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/triple_bow_pulling_0.png b/src/main/resources/classic/assets/twilightforest/textures/item/triple_bow_pulling_0.png new file mode 100644 index 0000000000..09e83ab8d3 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/triple_bow_pulling_0.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/triple_bow_pulling_1.png b/src/main/resources/classic/assets/twilightforest/textures/item/triple_bow_pulling_1.png new file mode 100644 index 0000000000..7cae314c5d Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/triple_bow_pulling_1.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/triple_bow_pulling_2.png b/src/main/resources/classic/assets/twilightforest/textures/item/triple_bow_pulling_2.png new file mode 100644 index 0000000000..0cace13de4 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/triple_bow_pulling_2.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/trophy.png b/src/main/resources/classic/assets/twilightforest/textures/item/trophy.png new file mode 100644 index 0000000000..f108786e43 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/trophy.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/trophy_minor.png b/src/main/resources/classic/assets/twilightforest/textures/item/trophy_minor.png new file mode 100644 index 0000000000..4d8197d5c6 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/trophy_minor.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/trophy_quest.png b/src/main/resources/classic/assets/twilightforest/textures/item/trophy_quest.png new file mode 100644 index 0000000000..b737be64f4 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/trophy_quest.png differ diff --git a/src/main/resources/assets/twilightforest/textures/items/twilightOrb.png b/src/main/resources/classic/assets/twilightforest/textures/item/twilight_orb.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/items/twilightOrb.png rename to src/main/resources/classic/assets/twilightforest/textures/item/twilight_orb.png diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/twilight_scepter.png b/src/main/resources/classic/assets/twilightforest/textures/item/twilight_scepter.png new file mode 100644 index 0000000000..85529970f8 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/twilight_scepter.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/ur_ghast_trophy.png b/src/main/resources/classic/assets/twilightforest/textures/item/ur_ghast_trophy.png new file mode 100644 index 0000000000..cde00590ac Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/ur_ghast_trophy.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/yeti_boots.png b/src/main/resources/classic/assets/twilightforest/textures/item/yeti_boots.png new file mode 100644 index 0000000000..a5bad23cb9 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/yeti_boots.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/yeti_chestplate.png b/src/main/resources/classic/assets/twilightforest/textures/item/yeti_chestplate.png new file mode 100644 index 0000000000..62d094e453 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/yeti_chestplate.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/yeti_helmet.png b/src/main/resources/classic/assets/twilightforest/textures/item/yeti_helmet.png new file mode 100644 index 0000000000..172d766e1d Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/yeti_helmet.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/item/yeti_leggings.png b/src/main/resources/classic/assets/twilightforest/textures/item/yeti_leggings.png new file mode 100644 index 0000000000..d9efb43714 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/item/yeti_leggings.png differ diff --git a/src/main/resources/assets/twilightforest/textures/items/scepterZombie.png b/src/main/resources/classic/assets/twilightforest/textures/item/zombie_scepter.png similarity index 100% rename from src/main/resources/assets/twilightforest/textures/items/scepterZombie.png rename to src/main/resources/classic/assets/twilightforest/textures/item/zombie_scepter.png diff --git a/src/main/resources/classic/assets/twilightforest/textures/mob_effect/frosted.png b/src/main/resources/classic/assets/twilightforest/textures/mob_effect/frosted.png new file mode 100644 index 0000000000..bc7bfc2f10 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/mob_effect/frosted.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/model/adherent.png b/src/main/resources/classic/assets/twilightforest/textures/model/adherent.png new file mode 100644 index 0000000000..925368e3bc Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/model/adherent.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/model/apocalypse2.png b/src/main/resources/classic/assets/twilightforest/textures/model/apocalypse2.png new file mode 100644 index 0000000000..924b52e143 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/model/apocalypse2.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/model/bighorn.png b/src/main/resources/classic/assets/twilightforest/textures/model/bighorn.png new file mode 100644 index 0000000000..592cab7f37 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/model/bighorn.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/model/blockgoblin.png b/src/main/resources/classic/assets/twilightforest/textures/model/blockgoblin.png new file mode 100644 index 0000000000..590c0a2778 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/model/blockgoblin.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/model/bunnybrown.png b/src/main/resources/classic/assets/twilightforest/textures/model/bunnybrown.png new file mode 100644 index 0000000000..5ae288446e Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/model/bunnybrown.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/model/bunnydutch.png b/src/main/resources/classic/assets/twilightforest/textures/model/bunnydutch.png new file mode 100644 index 0000000000..ca73a7c724 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/model/bunnydutch.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/model/bunnywhite.png b/src/main/resources/classic/assets/twilightforest/textures/model/bunnywhite.png new file mode 100644 index 0000000000..1c1aed00e0 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/model/bunnywhite.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/model/carminitegolem.png b/src/main/resources/classic/assets/twilightforest/textures/model/carminitegolem.png new file mode 100644 index 0000000000..9adad943be Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/model/carminitegolem.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/model/cicada-model.png b/src/main/resources/classic/assets/twilightforest/textures/model/cicada-model.png new file mode 100644 index 0000000000..d57aff4e5e Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/model/cicada-model.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/model/cubeofannihilation.png b/src/main/resources/classic/assets/twilightforest/textures/model/cubeofannihilation.png new file mode 100644 index 0000000000..eb2030609b Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/model/cubeofannihilation.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/model/doublegoblin.png b/src/main/resources/classic/assets/twilightforest/textures/model/doublegoblin.png new file mode 100644 index 0000000000..b690ccd91d Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/model/doublegoblin.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/model/finalcastle/castle_guardian.png b/src/main/resources/classic/assets/twilightforest/textures/model/finalcastle/castle_guardian.png new file mode 100644 index 0000000000..d5ddb43788 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/model/finalcastle/castle_guardian.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/model/firebeetle.png b/src/main/resources/classic/assets/twilightforest/textures/model/firebeetle.png new file mode 100644 index 0000000000..a66c300875 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/model/firebeetle.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/model/firefly-tiny.png b/src/main/resources/classic/assets/twilightforest/textures/model/firefly-tiny.png new file mode 100644 index 0000000000..ac4be69fcd Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/model/firefly-tiny.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/model/ghost.png b/src/main/resources/classic/assets/twilightforest/textures/model/ghost.png new file mode 100644 index 0000000000..d2bc2d1a2e Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/model/ghost.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/model/hedgespider.png b/src/main/resources/classic/assets/twilightforest/textures/model/hedgespider.png new file mode 100644 index 0000000000..f2a3bf4cd9 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/model/hedgespider.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/model/helmetcrab.png b/src/main/resources/classic/assets/twilightforest/textures/model/helmetcrab.png new file mode 100644 index 0000000000..8f298df1f8 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/model/helmetcrab.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/model/hydra4.png b/src/main/resources/classic/assets/twilightforest/textures/model/hydra4.png new file mode 100644 index 0000000000..45d8ab83dd Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/model/hydra4.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/model/hydramortar.png b/src/main/resources/classic/assets/twilightforest/textures/model/hydramortar.png new file mode 100644 index 0000000000..64aa44b23b Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/model/hydramortar.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/model/icecrystal.png b/src/main/resources/classic/assets/twilightforest/textures/model/icecrystal.png new file mode 100644 index 0000000000..b6c4b856dc Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/model/icecrystal.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/model/iceexploder.png b/src/main/resources/classic/assets/twilightforest/textures/model/iceexploder.png new file mode 100644 index 0000000000..0600d4bef2 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/model/iceexploder.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/model/iceshooter.png b/src/main/resources/classic/assets/twilightforest/textures/model/iceshooter.png new file mode 100644 index 0000000000..b089a69a7a Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/model/iceshooter.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/model/kingspider.png b/src/main/resources/classic/assets/twilightforest/textures/model/kingspider.png new file mode 100644 index 0000000000..43101e76c1 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/model/kingspider.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/model/knightmetal_shield.png b/src/main/resources/classic/assets/twilightforest/textures/model/knightmetal_shield.png new file mode 100644 index 0000000000..52d165d579 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/model/knightmetal_shield.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/model/knightphantom.png b/src/main/resources/classic/assets/twilightforest/textures/model/knightphantom.png new file mode 100644 index 0000000000..fe347f87d6 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/model/knightphantom.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/model/kobold.png b/src/main/resources/classic/assets/twilightforest/textures/model/kobold.png new file mode 100644 index 0000000000..d2f9ff95fd Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/model/kobold.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/model/mazeslime.png b/src/main/resources/classic/assets/twilightforest/textures/model/mazeslime.png new file mode 100644 index 0000000000..3a60fe8d88 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/model/mazeslime.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/model/minoshroomtaur.png b/src/main/resources/classic/assets/twilightforest/textures/model/minoshroomtaur.png new file mode 100644 index 0000000000..733890d057 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/model/minoshroomtaur.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/model/minotaur.png b/src/main/resources/classic/assets/twilightforest/textures/model/minotaur.png new file mode 100644 index 0000000000..20a719e1df Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/model/minotaur.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/model/mistwolf.png b/src/main/resources/classic/assets/twilightforest/textures/model/mistwolf.png new file mode 100644 index 0000000000..d70b95ff79 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/model/mistwolf.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/model/moonworm.png b/src/main/resources/classic/assets/twilightforest/textures/model/moonworm.png new file mode 100644 index 0000000000..4b421ab73b Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/model/moonworm.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/model/mosquitoswarm.png b/src/main/resources/classic/assets/twilightforest/textures/model/mosquitoswarm.png new file mode 100644 index 0000000000..c5d1a21ac9 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/model/mosquitoswarm.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/model/nagahead.png b/src/main/resources/classic/assets/twilightforest/textures/model/nagahead.png new file mode 100644 index 0000000000..727426fb81 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/model/nagahead.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/model/nagahead_dazed.png b/src/main/resources/classic/assets/twilightforest/textures/model/nagahead_dazed.png new file mode 100644 index 0000000000..b1c00de3ce Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/model/nagahead_dazed.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/model/nagasegment.png b/src/main/resources/classic/assets/twilightforest/textures/model/nagasegment.png new file mode 100644 index 0000000000..523c0f891f Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/model/nagasegment.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/model/penguin.png b/src/main/resources/classic/assets/twilightforest/textures/model/penguin.png new file mode 100644 index 0000000000..8a2d900fc9 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/model/penguin.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/model/phantomskeleton.png b/src/main/resources/classic/assets/twilightforest/textures/model/phantomskeleton.png new file mode 100644 index 0000000000..57bb7cdade Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/model/phantomskeleton.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/model/pinchbeetle.png b/src/main/resources/classic/assets/twilightforest/textures/model/pinchbeetle.png new file mode 100644 index 0000000000..0a41b20a40 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/model/pinchbeetle.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/model/protectionbox.png b/src/main/resources/classic/assets/twilightforest/textures/model/protectionbox.png new file mode 100644 index 0000000000..38f876c1dd Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/model/protectionbox.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/model/questram.png b/src/main/resources/classic/assets/twilightforest/textures/model/questram.png new file mode 100644 index 0000000000..15fb3e1703 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/model/questram.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/model/questram_lines.png b/src/main/resources/classic/assets/twilightforest/textures/model/questram_lines.png new file mode 100644 index 0000000000..3165248401 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/model/questram_lines.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/model/raven.png b/src/main/resources/classic/assets/twilightforest/textures/model/raven.png new file mode 100644 index 0000000000..a5f2bcb120 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/model/raven.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/model/redcap.png b/src/main/resources/classic/assets/twilightforest/textures/model/redcap.png new file mode 100644 index 0000000000..9d89c4f42f Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/model/redcap.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/model/redcapsapper.png b/src/main/resources/classic/assets/twilightforest/textures/model/redcapsapper.png new file mode 100644 index 0000000000..1a83e3fc73 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/model/redcapsapper.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/model/skeletondruid.png b/src/main/resources/classic/assets/twilightforest/textures/model/skeletondruid.png new file mode 100644 index 0000000000..1d74471ff0 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/model/skeletondruid.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/model/slimebeetle.png b/src/main/resources/classic/assets/twilightforest/textures/model/slimebeetle.png new file mode 100644 index 0000000000..c3c8cc526f Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/model/slimebeetle.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/model/snowqueen.png b/src/main/resources/classic/assets/twilightforest/textures/model/snowqueen.png new file mode 100644 index 0000000000..8e904b4bee Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/model/snowqueen.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/model/squirrel2.png b/src/main/resources/classic/assets/twilightforest/textures/model/squirrel2.png new file mode 100644 index 0000000000..586db50222 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/model/squirrel2.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/model/swarmspider.png b/src/main/resources/classic/assets/twilightforest/textures/model/swarmspider.png new file mode 100644 index 0000000000..c19ea8f545 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/model/swarmspider.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/model/tinybirdblue.png b/src/main/resources/classic/assets/twilightforest/textures/model/tinybirdblue.png new file mode 100644 index 0000000000..d129e9a7c4 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/model/tinybirdblue.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/model/tinybirdbrown.png b/src/main/resources/classic/assets/twilightforest/textures/model/tinybirdbrown.png new file mode 100644 index 0000000000..6167060903 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/model/tinybirdbrown.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/model/tinybirdgold.png b/src/main/resources/classic/assets/twilightforest/textures/model/tinybirdgold.png new file mode 100644 index 0000000000..98c6205e7a Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/model/tinybirdgold.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/model/tinybirdred.png b/src/main/resources/classic/assets/twilightforest/textures/model/tinybirdred.png new file mode 100644 index 0000000000..b68f90e733 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/model/tinybirdred.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/model/towerboss.png b/src/main/resources/classic/assets/twilightforest/textures/model/towerboss.png new file mode 100644 index 0000000000..77b1733557 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/model/towerboss.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/model/towerboss_fire.png b/src/main/resources/classic/assets/twilightforest/textures/model/towerboss_fire.png new file mode 100644 index 0000000000..f255230446 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/model/towerboss_fire.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/model/towerboss_openeyes.png b/src/main/resources/classic/assets/twilightforest/textures/model/towerboss_openeyes.png new file mode 100644 index 0000000000..20490e617f Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/model/towerboss_openeyes.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/model/towerbroodling.png b/src/main/resources/classic/assets/twilightforest/textures/model/towerbroodling.png new file mode 100644 index 0000000000..69f48cdd17 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/model/towerbroodling.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/model/towerghast.png b/src/main/resources/classic/assets/twilightforest/textures/model/towerghast.png new file mode 100644 index 0000000000..d8069b4ec1 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/model/towerghast.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/model/towerghast_fire.png b/src/main/resources/classic/assets/twilightforest/textures/model/towerghast_fire.png new file mode 100644 index 0000000000..8f8916a6aa Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/model/towerghast_fire.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/model/towerghast_openeyes.png b/src/main/resources/classic/assets/twilightforest/textures/model/towerghast_openeyes.png new file mode 100644 index 0000000000..f9ed4be272 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/model/towerghast_openeyes.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/model/towertermite.png b/src/main/resources/classic/assets/twilightforest/textures/model/towertermite.png new file mode 100644 index 0000000000..170aa1af65 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/model/towertermite.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/model/troll.png b/src/main/resources/classic/assets/twilightforest/textures/model/troll.png new file mode 100644 index 0000000000..808dc0cd6a Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/model/troll.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/model/twilightlich64.png b/src/main/resources/classic/assets/twilightforest/textures/model/twilightlich64.png new file mode 100644 index 0000000000..b86ddf884a Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/model/twilightlich64.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/model/wildboar.png b/src/main/resources/classic/assets/twilightforest/textures/model/wildboar.png new file mode 100644 index 0000000000..8c89b34e31 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/model/wildboar.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/model/wilddeer.png b/src/main/resources/classic/assets/twilightforest/textures/model/wilddeer.png new file mode 100644 index 0000000000..1c18fd2b69 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/model/wilddeer.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/model/winterwolf.png b/src/main/resources/classic/assets/twilightforest/textures/model/winterwolf.png new file mode 100644 index 0000000000..94b30c7e8c Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/model/winterwolf.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/model/wraith.png b/src/main/resources/classic/assets/twilightforest/textures/model/wraith.png new file mode 100644 index 0000000000..0f876c7072 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/model/wraith.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/model/yeti2.png b/src/main/resources/classic/assets/twilightforest/textures/model/yeti2.png new file mode 100644 index 0000000000..7e696ecd30 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/model/yeti2.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/model/yetialpha.png b/src/main/resources/classic/assets/twilightforest/textures/model/yetialpha.png new file mode 100644 index 0000000000..5b4b0baf74 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/model/yetialpha.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/particle/annihilate_particle.png b/src/main/resources/classic/assets/twilightforest/textures/particle/annihilate_particle.png new file mode 100644 index 0000000000..b079f80557 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/particle/annihilate_particle.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/particle/firefly.png b/src/main/resources/classic/assets/twilightforest/textures/particle/firefly.png new file mode 100644 index 0000000000..f531a133f4 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/particle/firefly.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/particle/snow_0.png b/src/main/resources/classic/assets/twilightforest/textures/particle/snow_0.png new file mode 100644 index 0000000000..6cce89143c Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/particle/snow_0.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/particle/snow_1.png b/src/main/resources/classic/assets/twilightforest/textures/particle/snow_1.png new file mode 100644 index 0000000000..d9669dc3e9 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/particle/snow_1.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/particle/snow_2.png b/src/main/resources/classic/assets/twilightforest/textures/particle/snow_2.png new file mode 100644 index 0000000000..da5888478d Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/particle/snow_2.png differ diff --git a/src/main/resources/classic/assets/twilightforest/textures/particle/snow_3.png b/src/main/resources/classic/assets/twilightforest/textures/particle/snow_3.png new file mode 100644 index 0000000000..0a9aff3460 Binary files /dev/null and b/src/main/resources/classic/assets/twilightforest/textures/particle/snow_3.png differ diff --git a/src/main/resources/classic/pack.mcmeta b/src/main/resources/classic/pack.mcmeta new file mode 100644 index 0000000000..c07179f3d5 --- /dev/null +++ b/src/main/resources/classic/pack.mcmeta @@ -0,0 +1,7 @@ +{ + "pack": { + "description": "Twilight Forest classic art!", + "forge:server_data_pack_format": 12, + "pack_format": 13 + } +} \ No newline at end of file diff --git a/src/main/resources/classic/pack.png b/src/main/resources/classic/pack.png new file mode 100644 index 0000000000..0ffc2d9b03 Binary files /dev/null and b/src/main/resources/classic/pack.png differ diff --git a/src/main/resources/data/twilightforest/functions/dev_new_world.mcfunction b/src/main/resources/data/twilightforest/functions/dev_new_world.mcfunction new file mode 100644 index 0000000000..2c6ed7098d --- /dev/null +++ b/src/main/resources/data/twilightforest/functions/dev_new_world.mcfunction @@ -0,0 +1,13 @@ +gamerule announceAdvancements false +gamerule doDaylightCycle false +gamerule doEntityDrops false +gamerule doMobLoot false +gamerule doMobSpawning false +gamerule doPatrolSpawning false +gamerule doTileDrops false +gamerule doTraderSpawning false +gamerule doWeatherCycle false +gamerule keepInventory true +gamerule randomTickSpeed -1 +gamerule tfEnforcedProgression false +execute in twilightforest:twilight_forest run teleport ~ 128 ~ \ No newline at end of file diff --git a/src/main/resources/data/twilightforest/functions/dev_powerwash_chunk.mcfunction b/src/main/resources/data/twilightforest/functions/dev_powerwash_chunk.mcfunction new file mode 100644 index 0000000000..81c61b0a42 --- /dev/null +++ b/src/main/resources/data/twilightforest/functions/dev_powerwash_chunk.mcfunction @@ -0,0 +1,8 @@ +fill ~-10 -32 ~-10 ~10 15 ~10 minecraft:air replace minecraft:grass_block +fill ~-10 -32 ~-10 ~10 15 ~10 minecraft:air replace minecraft:dirt +fill ~-10 -32 ~-10 ~10 15 ~10 minecraft:air replace minecraft:stone +fill ~-10 -32 ~-10 ~10 15 ~10 minecraft:air replace minecraft:bedrock +fill ~-10 -32 ~-10 ~10 15 ~10 minecraft:air replace minecraft:gravel +fill ~-10 -32 ~-10 ~10 15 ~10 minecraft:air replace minecraft:andesite +fill ~-10 -32 ~-10 ~10 15 ~10 minecraft:air replace minecraft:diorite +fill ~-10 -32 ~-10 ~10 15 ~10 minecraft:air replace minecraft:granite \ No newline at end of file diff --git a/src/main/resources/data/twilightforest/functions/give_3_shields.mcfunction b/src/main/resources/data/twilightforest/functions/give_3_shields.mcfunction new file mode 100644 index 0000000000..572ab565a0 --- /dev/null +++ b/src/main/resources/data/twilightforest/functions/give_3_shields.mcfunction @@ -0,0 +1 @@ +twilightforest shield @p add 3 false \ No newline at end of file diff --git a/src/main/resources/data/twilightforest/functions/setup_structure_hunt.mcfunction b/src/main/resources/data/twilightforest/functions/setup_structure_hunt.mcfunction new file mode 100644 index 0000000000..a5837be431 --- /dev/null +++ b/src/main/resources/data/twilightforest/functions/setup_structure_hunt.mcfunction @@ -0,0 +1,3 @@ +execute in twilightforest:twilight_forest run tp @p ~ ~ ~ +gamemode spectator @p +effect give @p minecraft:night_vision 9999 \ No newline at end of file diff --git a/src/main/resources/data/twilightforest/functions/tp_overworld.mcfunction b/src/main/resources/data/twilightforest/functions/tp_overworld.mcfunction new file mode 100644 index 0000000000..01790c1bdf --- /dev/null +++ b/src/main/resources/data/twilightforest/functions/tp_overworld.mcfunction @@ -0,0 +1 @@ +execute in minecraft:overworld run tp @p ~ ~ ~ \ No newline at end of file diff --git a/src/main/resources/data/twilightforest/functions/tp_twilight.mcfunction b/src/main/resources/data/twilightforest/functions/tp_twilight.mcfunction new file mode 100644 index 0000000000..1816407331 --- /dev/null +++ b/src/main/resources/data/twilightforest/functions/tp_twilight.mcfunction @@ -0,0 +1 @@ +execute in twilightforest:twilight_forest run tp @p ~ ~ ~ \ No newline at end of file diff --git a/src/main/resources/data/twilightforest/loot_tables/all_bosses.json b/src/main/resources/data/twilightforest/loot_tables/all_bosses.json new file mode 100644 index 0000000000..b9daaac38a --- /dev/null +++ b/src/main/resources/data/twilightforest/loot_tables/all_bosses.json @@ -0,0 +1,175 @@ +{ + "type": "chest", + "pools": [{ + "name": "questing_ram", + "rolls": 1, + "entries": [{ + "type": "item", + "name": "minecraft:gray_shulker_box", + "functions": [ + { + "function": "set_nbt", + "tag": "{\"BlockEntityTag\":{\"LootTable\":\"twilightforest:entities/questing_ram_rewards\"}}" + }, + { + "function": "set_name", + "name": { + "text": "Questing Ram's Loot Crate" + } + } + ] + }] + }, { + "name": "naga", + "rolls": 1, + "entries": [{ + "type": "item", + "name": "minecraft:lime_shulker_box", + "functions": [ + { + "function": "set_nbt", + "tag": "{\"BlockEntityTag\":{\"LootTable\":\"twilightforest:entities/naga\"}}" + }, + { + "function": "set_name", + "name": { + "text": "Naga's Loot Crate" + } + } + ] + }] + }, { + "name": "lich", + "rolls": 1, + "entries": [{ + "type": "item", + "name": "minecraft:light_gray_shulker_box", + "functions": [ + { + "function": "set_nbt", + "tag": "{\"BlockEntityTag\":{\"LootTable\":\"twilightforest:entities/lich\"}}" + }, + { + "function": "set_name", + "name": { + "text": "Lich's Loot Crate" + } + } + ] + }] + }, { + "name": "minoshroom", + "rolls": 1, + "entries": [{ + "type": "item", + "name": "minecraft:red_shulker_box", + "functions": [ + { + "function": "set_nbt", + "tag": "{\"BlockEntityTag\":{\"LootTable\":\"twilightforest:entities/minoshroom\"}}" + }, + { + "function": "set_name", + "name": { + "text": "Minoshroom's Loot Crate" + } + } + ] + }] + }, { + "name": "hydra", + "rolls": 1, + "entries": [{ + "type": "item", + "name": "minecraft:cyan_shulker_box", + "functions": [ + { + "function": "set_nbt", + "tag": "{\"BlockEntityTag\":{\"LootTable\":\"twilightforest:entities/hydra\"}}" + }, + { + "function": "set_name", + "name": { + "text": "Hydra's Loot Crate" + } + } + ] + }] + }, { + "name": "knight_phantom", + "rolls": 1, + "entries": [{ + "type": "item", + "name": "minecraft:green_shulker_box", + "functions": [ + { + "function": "set_nbt", + "tag": "{\"BlockEntityTag\":{\"LootTable\":\"twilightforest:structures/stronghold_boss\"}}" + }, + { + "function": "set_name", + "name": { + "text": "Knight Phantoms' Loot Crate" + } + } + ] + }] + }, { + "name": "ur-ghast", + "rolls": 1, + "entries": [{ + "type": "item", + "name": "minecraft:white_shulker_box", + "functions": [ + { + "function": "set_nbt", + "tag": "{\"BlockEntityTag\":{\"LootTable\":\"twilightforest:structures/darktower_boss\"}}" + }, + { + "function": "set_name", + "name": { + "text": "Ur-Ghast's Loot Crate" + } + } + ] + }] + }, { + "name": "alpha_yeti", + "rolls": 1, + "entries": [{ + "type": "item", + "name": "minecraft:light_blue_shulker_box", + "functions": [ + { + "function": "set_nbt", + "tag": "{\"BlockEntityTag\":{\"LootTable\":\"twilightforest:entities/yeti_alpha\"}}" + }, + { + "function": "set_name", + "name": { + "text": "Alpha Yeti's Loot Crate" + } + } + ] + }] + }, { + "name": "snow_queen", + "rolls": 1, + "entries": [{ + "type": "item", + "name": "minecraft:blue_shulker_box", + "functions": [ + { + "function": "set_nbt", + "tag": "{\"BlockEntityTag\":{\"LootTable\":\"twilightforest:entities/snow_queen\"}}" + }, + { + "function": "set_name", + "name": { + "text": "Snow Queen's Loot Crate" + } + } + ] + }] + }] +} diff --git a/src/main/resources/data/twilightforest/loot_tables/glass_sword.json b/src/main/resources/data/twilightforest/loot_tables/glass_sword.json new file mode 100644 index 0000000000..acd9ec1032 --- /dev/null +++ b/src/main/resources/data/twilightforest/loot_tables/glass_sword.json @@ -0,0 +1,12 @@ +{ + "pools": [ + { + "name": "sword", + "rolls": 1, + "entries": [{ + "type": "item", + "name": "twilightforest:glass_sword" + }] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/data/twilightforest/recipes/equipment/ironwood_axe.json b/src/main/resources/data/twilightforest/recipes/equipment/ironwood_axe.json new file mode 100644 index 0000000000..99278145ff --- /dev/null +++ b/src/main/resources/data/twilightforest/recipes/equipment/ironwood_axe.json @@ -0,0 +1,21 @@ +{ + "result": { + "nbt": "{Enchantments:[{lvl:1s,id:\"minecraft:fortune\"}]}", + "item": "twilightforest:ironwood_axe", + "type": "minecraft:item_nbt" + }, + "pattern": [ + "##", + "#X", + " X" + ], + "type": "minecraft:crafting_shaped", + "key": { + "#": { + "tag": "forge:ingots/ironwood" + }, + "X": { + "tag": "forge:rods/wooden" + } + } +} \ No newline at end of file diff --git a/src/main/resources/data/twilightforest/recipes/equipment/ironwood_boots.json b/src/main/resources/data/twilightforest/recipes/equipment/ironwood_boots.json new file mode 100644 index 0000000000..78c9024f97 --- /dev/null +++ b/src/main/resources/data/twilightforest/recipes/equipment/ironwood_boots.json @@ -0,0 +1,18 @@ +{ + "result": { + "nbt": "{Enchantments:[{lvl:1s,id:\"minecraft:feather_falling\"}]}", + "item": "twilightforest:ironwood_boots", + "type": "minecraft:item_nbt" + }, + "group": "ironwood_armor", + "pattern": [ + "# #", + "# #" + ], + "type": "minecraft:crafting_shaped", + "key": { + "#": { + "tag": "forge:ingots/ironwood" + } + } +} \ No newline at end of file diff --git a/src/main/resources/data/twilightforest/recipes/equipment/ironwood_chestplate.json b/src/main/resources/data/twilightforest/recipes/equipment/ironwood_chestplate.json new file mode 100644 index 0000000000..d29d722ff5 --- /dev/null +++ b/src/main/resources/data/twilightforest/recipes/equipment/ironwood_chestplate.json @@ -0,0 +1,19 @@ +{ + "result": { + "nbt": "{Enchantments:[{lvl:1s,id:\"minecraft:protection\"}]}", + "item": "twilightforest:ironwood_chestplate", + "type": "minecraft:item_nbt" + }, + "group": "ironwood_armor", + "pattern": [ + "# #", + "###", + "###" + ], + "type": "minecraft:crafting_shaped", + "key": { + "#": { + "tag": "forge:ingots/ironwood" + } + } +} \ No newline at end of file diff --git a/src/main/resources/data/twilightforest/recipes/equipment/ironwood_helmet.json b/src/main/resources/data/twilightforest/recipes/equipment/ironwood_helmet.json new file mode 100644 index 0000000000..d8b46cc060 --- /dev/null +++ b/src/main/resources/data/twilightforest/recipes/equipment/ironwood_helmet.json @@ -0,0 +1,18 @@ +{ + "result": { + "nbt": "{Enchantments:[{lvl:1s,id:\"minecraft:aqua_affinity\"}]}", + "item": "twilightforest:ironwood_helmet", + "type": "minecraft:item_nbt" + }, + "group": "ironwood_armor", + "pattern": [ + "###", + "# #" + ], + "type": "minecraft:crafting_shaped", + "key": { + "#": { + "tag": "forge:ingots/ironwood" + } + } +} \ No newline at end of file diff --git a/src/main/resources/data/twilightforest/recipes/equipment/ironwood_hoe.json b/src/main/resources/data/twilightforest/recipes/equipment/ironwood_hoe.json new file mode 100644 index 0000000000..af1ed61738 --- /dev/null +++ b/src/main/resources/data/twilightforest/recipes/equipment/ironwood_hoe.json @@ -0,0 +1,22 @@ +{ + "result": { + "nbt": "{Enchantments:[{lvl:1s,id:\"minecraft:efficiency\"}]}", + "item": "twilightforest:ironwood_hoe", + "type": "minecraft:item_nbt" + }, + "group": "ironwood_tool", + "pattern": [ + "##", + " X", + " X" + ], + "type": "minecraft:crafting_shaped", + "key": { + "#": { + "tag": "forge:ingots/ironwood" + }, + "X": { + "tag": "forge:rods/wooden" + } + } +} \ No newline at end of file diff --git a/src/main/resources/data/twilightforest/recipes/equipment/ironwood_leggings.json b/src/main/resources/data/twilightforest/recipes/equipment/ironwood_leggings.json new file mode 100644 index 0000000000..a2a7ac20d0 --- /dev/null +++ b/src/main/resources/data/twilightforest/recipes/equipment/ironwood_leggings.json @@ -0,0 +1,19 @@ +{ + "result": { + "nbt": "{Enchantments:[{lvl:1s,id:\"minecraft:protection\"}]}", + "item": "twilightforest:ironwood_leggings", + "type": "minecraft:item_nbt" + }, + "group": "ironwood_armor", + "pattern": [ + "###", + "# #", + "# #" + ], + "type": "minecraft:crafting_shaped", + "key": { + "#": { + "tag": "forge:ingots/ironwood" + } + } +} \ No newline at end of file diff --git a/src/main/resources/data/twilightforest/recipes/equipment/ironwood_pickaxe.json b/src/main/resources/data/twilightforest/recipes/equipment/ironwood_pickaxe.json new file mode 100644 index 0000000000..0436652e40 --- /dev/null +++ b/src/main/resources/data/twilightforest/recipes/equipment/ironwood_pickaxe.json @@ -0,0 +1,22 @@ +{ + "result": { + "nbt": "{Enchantments:[{lvl:1s,id:\"minecraft:efficiency\"}]}", + "item": "twilightforest:ironwood_pickaxe", + "type": "minecraft:item_nbt" + }, + "group": "ironwood_tool", + "pattern": [ + "###", + " X ", + " X " + ], + "type": "minecraft:crafting_shaped", + "key": { + "#": { + "tag": "forge:ingots/ironwood" + }, + "X": { + "tag": "forge:rods/wooden" + } + } +} \ No newline at end of file diff --git a/src/main/resources/data/twilightforest/recipes/equipment/ironwood_shovel.json b/src/main/resources/data/twilightforest/recipes/equipment/ironwood_shovel.json new file mode 100644 index 0000000000..fa711a802e --- /dev/null +++ b/src/main/resources/data/twilightforest/recipes/equipment/ironwood_shovel.json @@ -0,0 +1,22 @@ +{ + "result": { + "nbt": "{Enchantments:[{lvl:1s,id:\"minecraft:unbreaking\"}]}", + "item": "twilightforest:ironwood_shovel", + "type": "minecraft:item_nbt" + }, + "group": "ironwood_tool", + "pattern": [ + "#", + "X", + "X" + ], + "type": "minecraft:crafting_shaped", + "key": { + "#": { + "tag": "forge:ingots/ironwood" + }, + "X": { + "tag": "forge:rods/wooden" + } + } +} \ No newline at end of file diff --git a/src/main/resources/data/twilightforest/recipes/equipment/ironwood_sword.json b/src/main/resources/data/twilightforest/recipes/equipment/ironwood_sword.json new file mode 100644 index 0000000000..2eece1a7e4 --- /dev/null +++ b/src/main/resources/data/twilightforest/recipes/equipment/ironwood_sword.json @@ -0,0 +1,22 @@ +{ + "result": { + "nbt": "{Enchantments:[{lvl:1s,id:\"minecraft:knockback\"}]}", + "item": "twilightforest:ironwood_sword", + "type": "minecraft:item_nbt" + }, + "group": "ironwood_tool", + "pattern": [ + "#", + "#", + "X" + ], + "type": "minecraft:crafting_shaped", + "key": { + "#": { + "tag": "forge:ingots/ironwood" + }, + "X": { + "tag": "forge:rods/wooden" + } + } +} \ No newline at end of file diff --git a/src/main/resources/data/twilightforest/recipes/equipment/naga_chestplate.json b/src/main/resources/data/twilightforest/recipes/equipment/naga_chestplate.json new file mode 100644 index 0000000000..8740ac692d --- /dev/null +++ b/src/main/resources/data/twilightforest/recipes/equipment/naga_chestplate.json @@ -0,0 +1,19 @@ +{ + "result": { + "nbt": "{Enchantments:[{lvl:3s,id:\"minecraft:fire_protection\"}]}", + "item": "twilightforest:naga_chestplate", + "type": "minecraft:item_nbt" + }, + "group": "naga_armor", + "pattern": [ + "# #", + "###", + "###" + ], + "type": "minecraft:crafting_shaped", + "key": { + "#": { + "item": "twilightforest:naga_scale" + } + } +} \ No newline at end of file diff --git a/src/main/resources/data/twilightforest/recipes/equipment/naga_leggings.json b/src/main/resources/data/twilightforest/recipes/equipment/naga_leggings.json new file mode 100644 index 0000000000..eb4b70eafa --- /dev/null +++ b/src/main/resources/data/twilightforest/recipes/equipment/naga_leggings.json @@ -0,0 +1,19 @@ +{ + "result": { + "nbt": "{Enchantments:[{lvl:3s,id:\"minecraft:protection\"}]}", + "item": "twilightforest:naga_leggings", + "type": "minecraft:item_nbt" + }, + "group": "naga_armor", + "pattern": [ + "###", + "# #", + "# #" + ], + "type": "minecraft:crafting_shaped", + "key": { + "#": { + "item": "twilightforest:naga_scale" + } + } +} \ No newline at end of file diff --git a/src/main/resources/data/twilightforest/recipes/equipment/steeleaf_axe.json b/src/main/resources/data/twilightforest/recipes/equipment/steeleaf_axe.json new file mode 100644 index 0000000000..54b7150291 --- /dev/null +++ b/src/main/resources/data/twilightforest/recipes/equipment/steeleaf_axe.json @@ -0,0 +1,22 @@ +{ + "result": { + "nbt": "{Enchantments:[{lvl:2s,id:\"minecraft:efficiency\"}]}", + "item": "twilightforest:steeleaf_axe", + "type": "minecraft:item_nbt" + }, + "group": "steeleaf_tool", + "pattern": [ + "##", + "#X", + " X" + ], + "type": "minecraft:crafting_shaped", + "key": { + "#": { + "tag": "forge:ingots/steeleaf" + }, + "X": { + "tag": "forge:rods/wooden" + } + } +} \ No newline at end of file diff --git a/src/main/resources/data/twilightforest/recipes/equipment/steeleaf_boots.json b/src/main/resources/data/twilightforest/recipes/equipment/steeleaf_boots.json new file mode 100644 index 0000000000..85b36555f2 --- /dev/null +++ b/src/main/resources/data/twilightforest/recipes/equipment/steeleaf_boots.json @@ -0,0 +1,18 @@ +{ + "result": { + "nbt": "{Enchantments:[{lvl:2s,id:\"minecraft:feather_falling\"}]}", + "item": "twilightforest:steeleaf_boots", + "type": "minecraft:item_nbt" + }, + "group": "steeleaf_armor", + "pattern": [ + "# #", + "# #" + ], + "type": "minecraft:crafting_shaped", + "key": { + "#": { + "tag": "forge:ingots/steeleaf" + } + } +} \ No newline at end of file diff --git a/src/main/resources/data/twilightforest/recipes/equipment/steeleaf_chestplate.json b/src/main/resources/data/twilightforest/recipes/equipment/steeleaf_chestplate.json new file mode 100644 index 0000000000..c318969214 --- /dev/null +++ b/src/main/resources/data/twilightforest/recipes/equipment/steeleaf_chestplate.json @@ -0,0 +1,19 @@ +{ + "result": { + "nbt": "{Enchantments:[{lvl:2s,id:\"minecraft:blast_protection\"}]}", + "item": "twilightforest:steeleaf_chestplate", + "type": "minecraft:item_nbt" + }, + "group": "steeleaf_armor", + "pattern": [ + "# #", + "###", + "###" + ], + "type": "minecraft:crafting_shaped", + "key": { + "#": { + "tag": "forge:ingots/steeleaf" + } + } +} \ No newline at end of file diff --git a/src/main/resources/data/twilightforest/recipes/equipment/steeleaf_helmet.json b/src/main/resources/data/twilightforest/recipes/equipment/steeleaf_helmet.json new file mode 100644 index 0000000000..481e3676f9 --- /dev/null +++ b/src/main/resources/data/twilightforest/recipes/equipment/steeleaf_helmet.json @@ -0,0 +1,18 @@ +{ + "result": { + "nbt": "{Enchantments:[{lvl:2s,id:\"minecraft:protection\"}]}", + "item": "twilightforest:steeleaf_helmet", + "type": "minecraft:item_nbt" + }, + "group": "steeleaf_armor", + "pattern": [ + "###", + "# #" + ], + "type": "minecraft:crafting_shaped", + "key": { + "#": { + "tag": "forge:ingots/steeleaf" + } + } +} \ No newline at end of file diff --git a/src/main/resources/data/twilightforest/recipes/equipment/steeleaf_hoe.json b/src/main/resources/data/twilightforest/recipes/equipment/steeleaf_hoe.json new file mode 100644 index 0000000000..5e1efe0f6c --- /dev/null +++ b/src/main/resources/data/twilightforest/recipes/equipment/steeleaf_hoe.json @@ -0,0 +1,22 @@ +{ + "result": { + "nbt": "{Enchantments:[{lvl:1s,id:\"minecraft:efficiency\"}]}", + "item": "twilightforest:steeleaf_hoe", + "type": "minecraft:item_nbt" + }, + "group": "steeleaf_tool", + "pattern": [ + "##", + " X", + " X" + ], + "type": "minecraft:crafting_shaped", + "key": { + "#": { + "tag": "forge:ingots/steeleaf" + }, + "X": { + "tag": "forge:rods/wooden" + } + } +} \ No newline at end of file diff --git a/src/main/resources/data/twilightforest/recipes/equipment/steeleaf_leggings.json b/src/main/resources/data/twilightforest/recipes/equipment/steeleaf_leggings.json new file mode 100644 index 0000000000..eacb154e48 --- /dev/null +++ b/src/main/resources/data/twilightforest/recipes/equipment/steeleaf_leggings.json @@ -0,0 +1,19 @@ +{ + "result": { + "nbt": "{Enchantments:[{lvl:2s,id:\"minecraft:fire_protection\"}]}", + "item": "twilightforest:steeleaf_leggings", + "type": "minecraft:item_nbt" + }, + "group": "steeleaf_armor", + "pattern": [ + "###", + "# #", + "# #" + ], + "type": "minecraft:crafting_shaped", + "key": { + "#": { + "tag": "forge:ingots/steeleaf" + } + } +} \ No newline at end of file diff --git a/src/main/resources/data/twilightforest/recipes/equipment/steeleaf_pickaxe.json b/src/main/resources/data/twilightforest/recipes/equipment/steeleaf_pickaxe.json new file mode 100644 index 0000000000..3fe710769f --- /dev/null +++ b/src/main/resources/data/twilightforest/recipes/equipment/steeleaf_pickaxe.json @@ -0,0 +1,22 @@ +{ + "result": { + "nbt": "{Enchantments:[{lvl:2s,id:\"minecraft:fortune\"}]}", + "item": "twilightforest:steeleaf_pickaxe", + "type": "minecraft:item_nbt" + }, + "group": "steeleaf_tool", + "pattern": [ + "###", + " X ", + " X " + ], + "type": "minecraft:crafting_shaped", + "key": { + "#": { + "tag": "forge:ingots/steeleaf" + }, + "X": { + "tag": "forge:rods/wooden" + } + } +} \ No newline at end of file diff --git a/src/main/resources/data/twilightforest/recipes/equipment/steeleaf_shovel.json b/src/main/resources/data/twilightforest/recipes/equipment/steeleaf_shovel.json new file mode 100644 index 0000000000..5f5903ce9e --- /dev/null +++ b/src/main/resources/data/twilightforest/recipes/equipment/steeleaf_shovel.json @@ -0,0 +1,22 @@ +{ + "result": { + "nbt": "{Enchantments:[{lvl:2s,id:\"minecraft:efficiency\"}]}", + "item": "twilightforest:steeleaf_shovel", + "type": "minecraft:item_nbt" + }, + "group": "steeleaf_tool", + "pattern": [ + "#", + "X", + "X" + ], + "type": "minecraft:crafting_shaped", + "key": { + "#": { + "tag": "forge:ingots/steeleaf" + }, + "X": { + "tag": "forge:rods/wooden" + } + } +} \ No newline at end of file diff --git a/src/main/resources/data/twilightforest/recipes/equipment/steeleaf_sword.json b/src/main/resources/data/twilightforest/recipes/equipment/steeleaf_sword.json new file mode 100644 index 0000000000..297d5abf4b --- /dev/null +++ b/src/main/resources/data/twilightforest/recipes/equipment/steeleaf_sword.json @@ -0,0 +1,22 @@ +{ + "result": { + "nbt": "{Enchantments:[{lvl:2s,id:\"minecraft:looting\"}]}", + "item": "twilightforest:steeleaf_sword", + "type": "minecraft:item_nbt" + }, + "group": "steeleaf_tool", + "pattern": [ + "#", + "#", + "X" + ], + "type": "minecraft:crafting_shaped", + "key": { + "#": { + "tag": "forge:ingots/steeleaf" + }, + "X": { + "tag": "forge:rods/wooden" + } + } +} \ No newline at end of file diff --git a/src/main/resources/data/twilightforest/recipes/equipment/yeti_boots.json b/src/main/resources/data/twilightforest/recipes/equipment/yeti_boots.json new file mode 100644 index 0000000000..c2c1211248 --- /dev/null +++ b/src/main/resources/data/twilightforest/recipes/equipment/yeti_boots.json @@ -0,0 +1,18 @@ +{ + "result": { + "nbt": "{Enchantments:[{lvl:2s,id:\"minecraft:protection\"},{lvl:4s,id:\"minecraft:feather_falling\"}]}", + "item": "twilightforest:yeti_boots", + "type": "minecraft:item_nbt" + }, + "group": "yeti_armor", + "pattern": [ + "# #", + "# #" + ], + "type": "minecraft:crafting_shaped", + "key": { + "#": { + "item": "twilightforest:alpha_yeti_fur" + } + } +} \ No newline at end of file diff --git a/src/main/resources/data/twilightforest/recipes/equipment/yeti_chestplate.json b/src/main/resources/data/twilightforest/recipes/equipment/yeti_chestplate.json new file mode 100644 index 0000000000..055e3ae98b --- /dev/null +++ b/src/main/resources/data/twilightforest/recipes/equipment/yeti_chestplate.json @@ -0,0 +1,19 @@ +{ + "result": { + "nbt": "{Enchantments:[{lvl:2s,id:\"minecraft:protection\"}]}", + "item": "twilightforest:yeti_chestplate", + "type": "minecraft:item_nbt" + }, + "group": "yeti_armor", + "pattern": [ + "# #", + "###", + "###" + ], + "type": "minecraft:crafting_shaped", + "key": { + "#": { + "item": "twilightforest:alpha_yeti_fur" + } + } +} \ No newline at end of file diff --git a/src/main/resources/data/twilightforest/recipes/equipment/yeti_helmet.json b/src/main/resources/data/twilightforest/recipes/equipment/yeti_helmet.json new file mode 100644 index 0000000000..aff8e9adfb --- /dev/null +++ b/src/main/resources/data/twilightforest/recipes/equipment/yeti_helmet.json @@ -0,0 +1,18 @@ +{ + "result": { + "nbt": "{Enchantments:[{lvl:2s,id:\"minecraft:protection\"}]}", + "item": "twilightforest:yeti_helmet", + "type": "minecraft:item_nbt" + }, + "group": "yeti_armor", + "pattern": [ + "###", + "# #" + ], + "type": "minecraft:crafting_shaped", + "key": { + "#": { + "item": "twilightforest:alpha_yeti_fur" + } + } +} \ No newline at end of file diff --git a/src/main/resources/data/twilightforest/recipes/equipment/yeti_leggings.json b/src/main/resources/data/twilightforest/recipes/equipment/yeti_leggings.json new file mode 100644 index 0000000000..78b407eb2c --- /dev/null +++ b/src/main/resources/data/twilightforest/recipes/equipment/yeti_leggings.json @@ -0,0 +1,19 @@ +{ + "result": { + "nbt": "{Enchantments:[{lvl:2s,id:\"minecraft:protection\"}]}", + "item": "twilightforest:yeti_leggings", + "type": "minecraft:item_nbt" + }, + "group": "yeti_armor", + "pattern": [ + "###", + "# #", + "# #" + ], + "type": "minecraft:crafting_shaped", + "key": { + "#": { + "item": "twilightforest:alpha_yeti_fur" + } + } +} \ No newline at end of file diff --git a/src/main/resources/data/twilightforest/recipes/jeed/blindness.json b/src/main/resources/data/twilightforest/recipes/jeed/blindness.json new file mode 100644 index 0000000000..83d6d32643 --- /dev/null +++ b/src/main/resources/data/twilightforest/recipes/jeed/blindness.json @@ -0,0 +1,22 @@ +{ + "type": "forge:conditional", + "recipes": [ + { + "conditions": [ + { + "modid": "jeed", + "type": "forge:mod_loaded" + } + ], + "recipe": { + "type": "jeed:effect_provider", + "effect": "minecraft:blindness", + "providers": [ + { + "item": "twilightforest:mist_wolf_spawn_egg" + } + ] + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/data/twilightforest/recipes/jeed/fire_resistance.json b/src/main/resources/data/twilightforest/recipes/jeed/fire_resistance.json new file mode 100644 index 0000000000..e4796b12c7 --- /dev/null +++ b/src/main/resources/data/twilightforest/recipes/jeed/fire_resistance.json @@ -0,0 +1,22 @@ +{ + "type": "forge:conditional", + "recipes": [ + { + "conditions": [ + { + "modid": "jeed", + "type": "forge:mod_loaded" + } + ], + "recipe": { + "type": "jeed:effect_provider", + "effect": "minecraft:fire_resistance", + "providers": [ + { + "item": "twilightforest:charm_of_life_2" + } + ] + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/data/twilightforest/recipes/jeed/frosted.json b/src/main/resources/data/twilightforest/recipes/jeed/frosted.json new file mode 100644 index 0000000000..d6be151c0a --- /dev/null +++ b/src/main/resources/data/twilightforest/recipes/jeed/frosted.json @@ -0,0 +1,31 @@ +{ + "type": "forge:conditional", + "recipes": [ + { + "conditions": [ + { + "modid": "jeed", + "type": "forge:mod_loaded" + } + ], + "recipe": { + "type": "jeed:effect_provider", + "effect": "twilightforest:frosted", + "providers": [ + { + "item": "twilightforest:alpha_yeti_spawn_egg" + }, + { + "item": "twilightforest:ice_bomb" + }, + { + "item": "twilightforest:ice_bow" + }, + { + "item": "twilightforest:ice_sword" + } + ] + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/data/twilightforest/recipes/jeed/hunger.json b/src/main/resources/data/twilightforest/recipes/jeed/hunger.json new file mode 100644 index 0000000000..426e1b92aa --- /dev/null +++ b/src/main/resources/data/twilightforest/recipes/jeed/hunger.json @@ -0,0 +1,22 @@ +{ + "type": "forge:conditional", + "recipes": [ + { + "conditions": [ + { + "modid": "jeed", + "type": "forge:mod_loaded" + } + ], + "recipe": { + "type": "jeed:effect_provider", + "effect": "minecraft:hunger", + "providers": [ + { + "item": "twilightforest:mosquito_swarm_spawn_egg" + } + ] + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/data/twilightforest/recipes/jeed/poison.json b/src/main/resources/data/twilightforest/recipes/jeed/poison.json new file mode 100644 index 0000000000..4325070503 --- /dev/null +++ b/src/main/resources/data/twilightforest/recipes/jeed/poison.json @@ -0,0 +1,25 @@ +{ + "type": "forge:conditional", + "recipes": [ + { + "conditions": [ + { + "modid": "jeed", + "type": "forge:mod_loaded" + } + ], + "recipe": { + "type": "jeed:effect_provider", + "effect": "minecraft:poison", + "providers": [ + { + "item": "twilightforest:adherent_spawn_egg" + }, + { + "item": "twilightforest:skeleton_druid_spawn_egg" + } + ] + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/data/twilightforest/recipes/jeed/regeneration.json b/src/main/resources/data/twilightforest/recipes/jeed/regeneration.json new file mode 100644 index 0000000000..7176aaea0d --- /dev/null +++ b/src/main/resources/data/twilightforest/recipes/jeed/regeneration.json @@ -0,0 +1,25 @@ +{ + "type": "forge:conditional", + "recipes": [ + { + "conditions": [ + { + "modid": "jeed", + "type": "forge:mod_loaded" + } + ], + "recipe": { + "type": "jeed:effect_provider", + "effect": "minecraft:regeneration", + "providers": [ + { + "item": "twilightforest:charm_of_life_1" + }, + { + "item": "twilightforest:charm_of_life_2" + } + ] + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/data/twilightforest/recipes/jeed/resistance.json b/src/main/resources/data/twilightforest/recipes/jeed/resistance.json new file mode 100644 index 0000000000..e5456b7f12 --- /dev/null +++ b/src/main/resources/data/twilightforest/recipes/jeed/resistance.json @@ -0,0 +1,22 @@ +{ + "type": "forge:conditional", + "recipes": [ + { + "conditions": [ + { + "modid": "jeed", + "type": "forge:mod_loaded" + } + ], + "recipe": { + "type": "jeed:effect_provider", + "effect": "minecraft:resistance", + "providers": [ + { + "item": "twilightforest:charm_of_life_2" + } + ] + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/data/twilightforest/recipes/jeed/slowness.json b/src/main/resources/data/twilightforest/recipes/jeed/slowness.json new file mode 100644 index 0000000000..426e6bd7c6 --- /dev/null +++ b/src/main/resources/data/twilightforest/recipes/jeed/slowness.json @@ -0,0 +1,25 @@ +{ + "type": "forge:conditional", + "recipes": [ + { + "conditions": [ + { + "modid": "jeed", + "type": "forge:mod_loaded" + } + ], + "recipe": { + "type": "jeed:effect_provider", + "effect": "minecraft:slowness", + "providers": [ + { + "item": "twilightforest:lifedrain_scepter" + }, + { + "item": "twilightforest:death_tome_spawn_egg" + } + ] + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/data/twilightforest/structures/courtyard/courtyard_wall.nbt b/src/main/resources/data/twilightforest/structures/courtyard/courtyard_wall.nbt new file mode 100644 index 0000000000..1868edcf1a Binary files /dev/null and b/src/main/resources/data/twilightforest/structures/courtyard/courtyard_wall.nbt differ diff --git a/src/main/resources/data/twilightforest/structures/courtyard/courtyard_wall_corner.nbt b/src/main/resources/data/twilightforest/structures/courtyard/courtyard_wall_corner.nbt new file mode 100644 index 0000000000..3e57a9ceea Binary files /dev/null and b/src/main/resources/data/twilightforest/structures/courtyard/courtyard_wall_corner.nbt differ diff --git a/src/main/resources/data/twilightforest/structures/courtyard/courtyard_wall_corner_decayed.nbt b/src/main/resources/data/twilightforest/structures/courtyard/courtyard_wall_corner_decayed.nbt new file mode 100644 index 0000000000..91f1a9d02e Binary files /dev/null and b/src/main/resources/data/twilightforest/structures/courtyard/courtyard_wall_corner_decayed.nbt differ diff --git a/src/main/resources/data/twilightforest/structures/courtyard/courtyard_wall_corner_inner.nbt b/src/main/resources/data/twilightforest/structures/courtyard/courtyard_wall_corner_inner.nbt new file mode 100644 index 0000000000..1077595f34 Binary files /dev/null and b/src/main/resources/data/twilightforest/structures/courtyard/courtyard_wall_corner_inner.nbt differ diff --git a/src/main/resources/data/twilightforest/structures/courtyard/courtyard_wall_corner_inner_decayed.nbt b/src/main/resources/data/twilightforest/structures/courtyard/courtyard_wall_corner_inner_decayed.nbt new file mode 100644 index 0000000000..825506ae94 Binary files /dev/null and b/src/main/resources/data/twilightforest/structures/courtyard/courtyard_wall_corner_inner_decayed.nbt differ diff --git a/src/main/resources/data/twilightforest/structures/courtyard/courtyard_wall_decayed.nbt b/src/main/resources/data/twilightforest/structures/courtyard/courtyard_wall_decayed.nbt new file mode 100644 index 0000000000..21c21e2cba Binary files /dev/null and b/src/main/resources/data/twilightforest/structures/courtyard/courtyard_wall_decayed.nbt differ diff --git a/src/main/resources/data/twilightforest/structures/courtyard/courtyard_wall_padding.nbt b/src/main/resources/data/twilightforest/structures/courtyard/courtyard_wall_padding.nbt new file mode 100644 index 0000000000..4fa239b402 Binary files /dev/null and b/src/main/resources/data/twilightforest/structures/courtyard/courtyard_wall_padding.nbt differ diff --git a/src/main/resources/data/twilightforest/structures/courtyard/courtyard_wall_padding_decayed.nbt b/src/main/resources/data/twilightforest/structures/courtyard/courtyard_wall_padding_decayed.nbt new file mode 100644 index 0000000000..f666e6ef92 Binary files /dev/null and b/src/main/resources/data/twilightforest/structures/courtyard/courtyard_wall_padding_decayed.nbt differ diff --git a/src/main/resources/data/twilightforest/structures/courtyard/hedge_between.nbt b/src/main/resources/data/twilightforest/structures/courtyard/hedge_between.nbt new file mode 100644 index 0000000000..da53ef96e0 Binary files /dev/null and b/src/main/resources/data/twilightforest/structures/courtyard/hedge_between.nbt differ diff --git a/src/main/resources/data/twilightforest/structures/courtyard/hedge_between_big.nbt b/src/main/resources/data/twilightforest/structures/courtyard/hedge_between_big.nbt new file mode 100644 index 0000000000..c9d34f9274 Binary files /dev/null and b/src/main/resources/data/twilightforest/structures/courtyard/hedge_between_big.nbt differ diff --git a/src/main/resources/data/twilightforest/structures/courtyard/hedge_corner.nbt b/src/main/resources/data/twilightforest/structures/courtyard/hedge_corner.nbt new file mode 100644 index 0000000000..f5d137f5f4 Binary files /dev/null and b/src/main/resources/data/twilightforest/structures/courtyard/hedge_corner.nbt differ diff --git a/src/main/resources/data/twilightforest/structures/courtyard/hedge_corner_big.nbt b/src/main/resources/data/twilightforest/structures/courtyard/hedge_corner_big.nbt new file mode 100644 index 0000000000..5d65c54a50 Binary files /dev/null and b/src/main/resources/data/twilightforest/structures/courtyard/hedge_corner_big.nbt differ diff --git a/src/main/resources/data/twilightforest/structures/courtyard/hedge_end.nbt b/src/main/resources/data/twilightforest/structures/courtyard/hedge_end.nbt new file mode 100644 index 0000000000..9d1a5594c3 Binary files /dev/null and b/src/main/resources/data/twilightforest/structures/courtyard/hedge_end.nbt differ diff --git a/src/main/resources/data/twilightforest/structures/courtyard/hedge_end_big.nbt b/src/main/resources/data/twilightforest/structures/courtyard/hedge_end_big.nbt new file mode 100644 index 0000000000..4b34345b3f Binary files /dev/null and b/src/main/resources/data/twilightforest/structures/courtyard/hedge_end_big.nbt differ diff --git a/src/main/resources/data/twilightforest/structures/courtyard/hedge_end_pillar.nbt b/src/main/resources/data/twilightforest/structures/courtyard/hedge_end_pillar.nbt new file mode 100644 index 0000000000..1268d9ef72 Binary files /dev/null and b/src/main/resources/data/twilightforest/structures/courtyard/hedge_end_pillar.nbt differ diff --git a/src/main/resources/data/twilightforest/structures/courtyard/hedge_end_pillar_big.nbt b/src/main/resources/data/twilightforest/structures/courtyard/hedge_end_pillar_big.nbt new file mode 100644 index 0000000000..dc1ef6a9bc Binary files /dev/null and b/src/main/resources/data/twilightforest/structures/courtyard/hedge_end_pillar_big.nbt differ diff --git a/src/main/resources/data/twilightforest/structures/courtyard/hedge_intersection.nbt b/src/main/resources/data/twilightforest/structures/courtyard/hedge_intersection.nbt new file mode 100644 index 0000000000..0019c479a8 Binary files /dev/null and b/src/main/resources/data/twilightforest/structures/courtyard/hedge_intersection.nbt differ diff --git a/src/main/resources/data/twilightforest/structures/courtyard/hedge_intersection_big.nbt b/src/main/resources/data/twilightforest/structures/courtyard/hedge_intersection_big.nbt new file mode 100644 index 0000000000..bb14c89355 Binary files /dev/null and b/src/main/resources/data/twilightforest/structures/courtyard/hedge_intersection_big.nbt differ diff --git a/src/main/resources/data/twilightforest/structures/courtyard/hedge_line.nbt b/src/main/resources/data/twilightforest/structures/courtyard/hedge_line.nbt new file mode 100644 index 0000000000..ee55738597 Binary files /dev/null and b/src/main/resources/data/twilightforest/structures/courtyard/hedge_line.nbt differ diff --git a/src/main/resources/data/twilightforest/structures/courtyard/hedge_line_big.nbt b/src/main/resources/data/twilightforest/structures/courtyard/hedge_line_big.nbt new file mode 100644 index 0000000000..98c88f6824 Binary files /dev/null and b/src/main/resources/data/twilightforest/structures/courtyard/hedge_line_big.nbt differ diff --git a/src/main/resources/data/twilightforest/structures/courtyard/hedge_t.nbt b/src/main/resources/data/twilightforest/structures/courtyard/hedge_t.nbt new file mode 100644 index 0000000000..377908a0b5 Binary files /dev/null and b/src/main/resources/data/twilightforest/structures/courtyard/hedge_t.nbt differ diff --git a/src/main/resources/data/twilightforest/structures/courtyard/hedge_t_big.nbt b/src/main/resources/data/twilightforest/structures/courtyard/hedge_t_big.nbt new file mode 100644 index 0000000000..b753efd732 Binary files /dev/null and b/src/main/resources/data/twilightforest/structures/courtyard/hedge_t_big.nbt differ diff --git a/src/main/resources/data/twilightforest/structures/courtyard/hydra_statue.nbt b/src/main/resources/data/twilightforest/structures/courtyard/hydra_statue.nbt new file mode 100644 index 0000000000..00de590ec8 Binary files /dev/null and b/src/main/resources/data/twilightforest/structures/courtyard/hydra_statue.nbt differ diff --git a/src/main/resources/data/twilightforest/structures/courtyard/pathway.nbt b/src/main/resources/data/twilightforest/structures/courtyard/pathway.nbt new file mode 100644 index 0000000000..d3070f6d25 Binary files /dev/null and b/src/main/resources/data/twilightforest/structures/courtyard/pathway.nbt differ diff --git a/src/main/resources/data/twilightforest/structures/courtyard/terrace_duct.nbt b/src/main/resources/data/twilightforest/structures/courtyard/terrace_duct.nbt new file mode 100644 index 0000000000..44bab8e345 Binary files /dev/null and b/src/main/resources/data/twilightforest/structures/courtyard/terrace_duct.nbt differ diff --git a/src/main/resources/data/twilightforest/structures/courtyard/terrace_fire.nbt b/src/main/resources/data/twilightforest/structures/courtyard/terrace_fire.nbt new file mode 100644 index 0000000000..edaa0bbed6 Binary files /dev/null and b/src/main/resources/data/twilightforest/structures/courtyard/terrace_fire.nbt differ diff --git a/src/main/resources/data/twilightforest/structures/courtyard/terrace_statue.nbt b/src/main/resources/data/twilightforest/structures/courtyard/terrace_statue.nbt new file mode 100644 index 0000000000..172c9e413c Binary files /dev/null and b/src/main/resources/data/twilightforest/structures/courtyard/terrace_statue.nbt differ diff --git a/src/main/resources/data/twilightforest/structures/feature/druid_hut/basement_gallery.nbt b/src/main/resources/data/twilightforest/structures/feature/druid_hut/basement_gallery.nbt new file mode 100644 index 0000000000..709ad39c76 Binary files /dev/null and b/src/main/resources/data/twilightforest/structures/feature/druid_hut/basement_gallery.nbt differ diff --git a/src/main/resources/data/twilightforest/structures/feature/druid_hut/basement_gallery_trap.nbt b/src/main/resources/data/twilightforest/structures/feature/druid_hut/basement_gallery_trap.nbt new file mode 100644 index 0000000000..5c2e8ac577 Binary files /dev/null and b/src/main/resources/data/twilightforest/structures/feature/druid_hut/basement_gallery_trap.nbt differ diff --git a/src/main/resources/data/twilightforest/structures/feature/druid_hut/basement_shelves.nbt b/src/main/resources/data/twilightforest/structures/feature/druid_hut/basement_shelves.nbt new file mode 100644 index 0000000000..585898c03e Binary files /dev/null and b/src/main/resources/data/twilightforest/structures/feature/druid_hut/basement_shelves.nbt differ diff --git a/src/main/resources/data/twilightforest/structures/feature/druid_hut/basement_shelves_trap.nbt b/src/main/resources/data/twilightforest/structures/feature/druid_hut/basement_shelves_trap.nbt new file mode 100644 index 0000000000..5a06622a62 Binary files /dev/null and b/src/main/resources/data/twilightforest/structures/feature/druid_hut/basement_shelves_trap.nbt differ diff --git a/src/main/resources/data/twilightforest/structures/feature/druid_hut/basement_study.nbt b/src/main/resources/data/twilightforest/structures/feature/druid_hut/basement_study.nbt new file mode 100644 index 0000000000..a0a8fe0f9d Binary files /dev/null and b/src/main/resources/data/twilightforest/structures/feature/druid_hut/basement_study.nbt differ diff --git a/src/main/resources/data/twilightforest/structures/feature/druid_hut/basement_study_trap.nbt b/src/main/resources/data/twilightforest/structures/feature/druid_hut/basement_study_trap.nbt new file mode 100644 index 0000000000..e7aa7c7365 Binary files /dev/null and b/src/main/resources/data/twilightforest/structures/feature/druid_hut/basement_study_trap.nbt differ diff --git a/src/main/resources/data/twilightforest/structures/feature/druid_hut/druid_doubledeck.nbt b/src/main/resources/data/twilightforest/structures/feature/druid_hut/druid_doubledeck.nbt new file mode 100644 index 0000000000..6659a9982b Binary files /dev/null and b/src/main/resources/data/twilightforest/structures/feature/druid_hut/druid_doubledeck.nbt differ diff --git a/src/main/resources/data/twilightforest/structures/feature/druid_hut/druid_hut.nbt b/src/main/resources/data/twilightforest/structures/feature/druid_hut/druid_hut.nbt new file mode 100644 index 0000000000..31da580498 Binary files /dev/null and b/src/main/resources/data/twilightforest/structures/feature/druid_hut/druid_hut.nbt differ diff --git a/src/main/resources/data/twilightforest/structures/feature/druid_hut/druid_sideways.nbt b/src/main/resources/data/twilightforest/structures/feature/druid_hut/druid_sideways.nbt new file mode 100644 index 0000000000..92cb0922e3 Binary files /dev/null and b/src/main/resources/data/twilightforest/structures/feature/druid_hut/druid_sideways.nbt differ diff --git a/src/main/resources/data/twilightforest/structures/feature/graveyard/grave_full.nbt b/src/main/resources/data/twilightforest/structures/feature/graveyard/grave_full.nbt new file mode 100644 index 0000000000..955dc0a90a Binary files /dev/null and b/src/main/resources/data/twilightforest/structures/feature/graveyard/grave_full.nbt differ diff --git a/src/main/resources/data/twilightforest/structures/feature/graveyard/grave_lower.nbt b/src/main/resources/data/twilightforest/structures/feature/graveyard/grave_lower.nbt new file mode 100644 index 0000000000..aaccdb881e Binary files /dev/null and b/src/main/resources/data/twilightforest/structures/feature/graveyard/grave_lower.nbt differ diff --git a/src/main/resources/data/twilightforest/structures/feature/graveyard/grave_trap.nbt b/src/main/resources/data/twilightforest/structures/feature/graveyard/grave_trap.nbt new file mode 100644 index 0000000000..93a6f414ce Binary files /dev/null and b/src/main/resources/data/twilightforest/structures/feature/graveyard/grave_trap.nbt differ diff --git a/src/main/resources/data/twilightforest/structures/feature/graveyard/grave_upper.nbt b/src/main/resources/data/twilightforest/structures/feature/graveyard/grave_upper.nbt new file mode 100644 index 0000000000..52657a7ad9 Binary files /dev/null and b/src/main/resources/data/twilightforest/structures/feature/graveyard/grave_upper.nbt differ diff --git a/src/main/resources/data/twilightforest/structures/feature/graveyard/graveyard.nbt b/src/main/resources/data/twilightforest/structures/feature/graveyard/graveyard.nbt new file mode 100644 index 0000000000..7d029fd6d1 Binary files /dev/null and b/src/main/resources/data/twilightforest/structures/feature/graveyard/graveyard.nbt differ diff --git a/src/main/resources/data/twilightforest/structures/feature/ruins/grove_arch.nbt b/src/main/resources/data/twilightforest/structures/feature/ruins/grove_arch.nbt new file mode 100644 index 0000000000..fe26ba89b0 Binary files /dev/null and b/src/main/resources/data/twilightforest/structures/feature/ruins/grove_arch.nbt differ diff --git a/src/main/resources/data/twilightforest/structures/feature/ruins/grove_pillar.nbt b/src/main/resources/data/twilightforest/structures/feature/ruins/grove_pillar.nbt new file mode 100644 index 0000000000..a4595f3ea5 Binary files /dev/null and b/src/main/resources/data/twilightforest/structures/feature/ruins/grove_pillar.nbt differ diff --git a/src/main/resources/data/twilightforest/structures/feature/ruins/stone_circle.nbt b/src/main/resources/data/twilightforest/structures/feature/ruins/stone_circle.nbt new file mode 100644 index 0000000000..58b4a66549 Binary files /dev/null and b/src/main/resources/data/twilightforest/structures/feature/ruins/stone_circle.nbt differ diff --git a/src/main/resources/data/twilightforest/structures/feature/well/fancy_well_bottom.nbt b/src/main/resources/data/twilightforest/structures/feature/well/fancy_well_bottom.nbt new file mode 100644 index 0000000000..14bd388cbd Binary files /dev/null and b/src/main/resources/data/twilightforest/structures/feature/well/fancy_well_bottom.nbt differ diff --git a/src/main/resources/data/twilightforest/structures/feature/well/fancy_well_top.nbt b/src/main/resources/data/twilightforest/structures/feature/well/fancy_well_top.nbt new file mode 100644 index 0000000000..651ffcca26 Binary files /dev/null and b/src/main/resources/data/twilightforest/structures/feature/well/fancy_well_top.nbt differ diff --git a/src/main/resources/data/twilightforest/structures/feature/well/simple_well_bottom.nbt b/src/main/resources/data/twilightforest/structures/feature/well/simple_well_bottom.nbt new file mode 100644 index 0000000000..7738004380 Binary files /dev/null and b/src/main/resources/data/twilightforest/structures/feature/well/simple_well_bottom.nbt differ diff --git a/src/main/resources/data/twilightforest/structures/feature/well/simple_well_top.nbt b/src/main/resources/data/twilightforest/structures/feature/well/simple_well_top.nbt new file mode 100644 index 0000000000..ac08f9b427 Binary files /dev/null and b/src/main/resources/data/twilightforest/structures/feature/well/simple_well_top.nbt differ diff --git a/src/main/resources/data/twilightforest/structures/lich_tower/attachments/central/central_to_large.nbt b/src/main/resources/data/twilightforest/structures/lich_tower/attachments/central/central_to_large.nbt new file mode 100644 index 0000000000..db3b87f1c0 Binary files /dev/null and b/src/main/resources/data/twilightforest/structures/lich_tower/attachments/central/central_to_large.nbt differ diff --git a/src/main/resources/data/twilightforest/structures/lich_tower/attachments/central/central_to_medium.nbt b/src/main/resources/data/twilightforest/structures/lich_tower/attachments/central/central_to_medium.nbt new file mode 100644 index 0000000000..063a5a5641 Binary files /dev/null and b/src/main/resources/data/twilightforest/structures/lich_tower/attachments/central/central_to_medium.nbt differ diff --git a/src/main/resources/data/twilightforest/structures/lich_tower/attachments/central/central_to_small.nbt b/src/main/resources/data/twilightforest/structures/lich_tower/attachments/central/central_to_small.nbt new file mode 100644 index 0000000000..02ef374dff Binary files /dev/null and b/src/main/resources/data/twilightforest/structures/lich_tower/attachments/central/central_to_small.nbt differ diff --git a/src/main/resources/data/twilightforest/structures/lich_tower/central_tower.nbt b/src/main/resources/data/twilightforest/structures/lich_tower/central_tower.nbt new file mode 100644 index 0000000000..bfb62142c0 Binary files /dev/null and b/src/main/resources/data/twilightforest/structures/lich_tower/central_tower.nbt differ diff --git a/src/main/resources/data/twilightforest/structures/lich_tower/foyer.nbt b/src/main/resources/data/twilightforest/structures/lich_tower/foyer.nbt new file mode 100644 index 0000000000..2d6e8d741c Binary files /dev/null and b/src/main/resources/data/twilightforest/structures/lich_tower/foyer.nbt differ diff --git a/src/main/resources/data/twilightforest/structures/lich_tower/side_tower_covers/large/cobbled_large.nbt b/src/main/resources/data/twilightforest/structures/lich_tower/side_tower_covers/large/cobbled_large.nbt new file mode 100644 index 0000000000..68e2420376 Binary files /dev/null and b/src/main/resources/data/twilightforest/structures/lich_tower/side_tower_covers/large/cobbled_large.nbt differ diff --git a/src/main/resources/data/twilightforest/structures/lich_tower/side_tower_covers/medium/cobbled_medium.nbt b/src/main/resources/data/twilightforest/structures/lich_tower/side_tower_covers/medium/cobbled_medium.nbt new file mode 100644 index 0000000000..715af41c9e Binary files /dev/null and b/src/main/resources/data/twilightforest/structures/lich_tower/side_tower_covers/medium/cobbled_medium.nbt differ diff --git a/src/main/resources/data/twilightforest/structures/lich_tower/side_tower_covers/small/cobbled_small.nbt b/src/main/resources/data/twilightforest/structures/lich_tower/side_tower_covers/small/cobbled_small.nbt new file mode 100644 index 0000000000..c1d41a71a9 Binary files /dev/null and b/src/main/resources/data/twilightforest/structures/lich_tower/side_tower_covers/small/cobbled_small.nbt differ diff --git a/src/main/resources/data/twilightforest/structures/lich_tower/side_tower_rooms/large/empty_large.nbt b/src/main/resources/data/twilightforest/structures/lich_tower/side_tower_rooms/large/empty_large.nbt new file mode 100644 index 0000000000..d7ccecd533 Binary files /dev/null and b/src/main/resources/data/twilightforest/structures/lich_tower/side_tower_rooms/large/empty_large.nbt differ diff --git a/src/main/resources/data/twilightforest/structures/lich_tower/side_tower_rooms/large/illegal_blockstate_kitchen.nbt b/src/main/resources/data/twilightforest/structures/lich_tower/side_tower_rooms/large/illegal_blockstate_kitchen.nbt new file mode 100644 index 0000000000..8cf1e9328f Binary files /dev/null and b/src/main/resources/data/twilightforest/structures/lich_tower/side_tower_rooms/large/illegal_blockstate_kitchen.nbt differ diff --git a/src/main/resources/data/twilightforest/structures/lich_tower/side_tower_rooms/large/library_plus_large.nbt b/src/main/resources/data/twilightforest/structures/lich_tower/side_tower_rooms/large/library_plus_large.nbt new file mode 100644 index 0000000000..188d606ac0 Binary files /dev/null and b/src/main/resources/data/twilightforest/structures/lich_tower/side_tower_rooms/large/library_plus_large.nbt differ diff --git a/src/main/resources/data/twilightforest/structures/lich_tower/side_tower_rooms/medium/empty_medium.nbt b/src/main/resources/data/twilightforest/structures/lich_tower/side_tower_rooms/medium/empty_medium.nbt new file mode 100644 index 0000000000..6f0cde04cc Binary files /dev/null and b/src/main/resources/data/twilightforest/structures/lich_tower/side_tower_rooms/medium/empty_medium.nbt differ diff --git a/src/main/resources/data/twilightforest/structures/lich_tower/side_tower_rooms/medium/stacked_library_elbow_medium.nbt b/src/main/resources/data/twilightforest/structures/lich_tower/side_tower_rooms/medium/stacked_library_elbow_medium.nbt new file mode 100644 index 0000000000..7a51d7cb61 Binary files /dev/null and b/src/main/resources/data/twilightforest/structures/lich_tower/side_tower_rooms/medium/stacked_library_elbow_medium.nbt differ diff --git a/src/main/resources/data/twilightforest/structures/lich_tower/side_tower_rooms/small/empty_small.nbt b/src/main/resources/data/twilightforest/structures/lich_tower/side_tower_rooms/small/empty_small.nbt new file mode 100644 index 0000000000..ae3a373f34 Binary files /dev/null and b/src/main/resources/data/twilightforest/structures/lich_tower/side_tower_rooms/small/empty_small.nbt differ diff --git a/src/main/resources/data/twilightforest/structures/lich_tower/side_tower_rooms/small/library_steps_small.nbt b/src/main/resources/data/twilightforest/structures/lich_tower/side_tower_rooms/small/library_steps_small.nbt new file mode 100644 index 0000000000..db54e4b45b Binary files /dev/null and b/src/main/resources/data/twilightforest/structures/lich_tower/side_tower_rooms/small/library_steps_small.nbt differ diff --git a/src/main/resources/data/twilightforest/structures/quest_grove.nbt b/src/main/resources/data/twilightforest/structures/quest_grove.nbt new file mode 100644 index 0000000000..8f5bcdb971 Binary files /dev/null and b/src/main/resources/data/twilightforest/structures/quest_grove.nbt differ diff --git a/src/main/resources/data/twilightforest/structures/testing/spiral_rotations.nbt b/src/main/resources/data/twilightforest/structures/testing/spiral_rotations.nbt new file mode 100644 index 0000000000..539fe46341 Binary files /dev/null and b/src/main/resources/data/twilightforest/structures/testing/spiral_rotations.nbt differ diff --git a/src/main/resources/mcmod.info b/src/main/resources/mcmod.info deleted file mode 100644 index 3e181edb09..0000000000 --- a/src/main/resources/mcmod.info +++ /dev/null @@ -1,18 +0,0 @@ -[ -{ - "modid": "TwilightForest", - "name": "The Twilight Forest", - "description": "An enchanted forest dimension.", - "version": "${version}", - "mcversion": "${mcversion}", - "url": "http://www.minecraftforum.net/topic/561673-", - "updateUrl": "", - "authors": [ - "Benimatic (Ben Mazur)" - ], - "credits": "By Benimatic", - "logoFile": "assets/twilightforest/textures/twilightforest_logo.png", - "screenshots": [], - "dependencies": [] -} -] diff --git a/src/main/resources/twilightforest_logo.png b/src/main/resources/twilightforest_logo.png new file mode 100644 index 0000000000..2391761fb9 Binary files /dev/null and b/src/main/resources/twilightforest_logo.png differ diff --git a/update.json b/update.json new file mode 100644 index 0000000000..c4eadc7fe3 --- /dev/null +++ b/update.json @@ -0,0 +1,17 @@ +{ + "homepage": "https://minecraft.curseforge.com/projects/the-twilight-forest", + "promos": { + "1.19.4-latest": "4.2.1696", + "1.19.4-recommended": "4.2.1696", + "1.18.2-latest": "4.1.1494", + "1.18.2-recommended": "4.1.1494", + "1.17.1-latest": "4.0.943", + "1.17.1-recommended": "4.0.943", + "1.16.5-latest": "4.0.870", + "1.16.5-recommended": "4.0.870", + "1.12.2-latest": "3.11.1021", + "1.12.2-recommended": "3.11.1021", + "1.7.10-latest": "2.3.8", + "1.7.10-recommended": "2.3.8" + } +}